From 66fc19f003c12feb297d1d5e76ce645478993c5c Mon Sep 17 00:00:00 2001 From: cusma Date: Tue, 10 Mar 2026 13:19:11 +0100 Subject: [PATCH 001/244] chore: actus enums --- smart_contracts/constants.py | 88 ++++++---------------------- smart_contracts/enums.py | 108 +++++++++++++++++++++++++++++++++-- 2 files changed, 122 insertions(+), 74 deletions(-) diff --git a/smart_contracts/constants.py b/smart_contracts/constants.py index 4e9b7c10..71f14c5d 100644 --- a/smart_contracts/constants.py +++ b/smart_contracts/constants.py @@ -1,76 +1,24 @@ from typing import Final +# AVM +MAX_ARGS_SIZE: Final[int] = 2048 +OP_UP_CONTRACT_CONFIG_BASE_BUDGET: Final[int] = 1_500 +OP_UP_CONTRACT_CONFIG_PER_ENTRY_BUDGET: Final[int] = 100 +SCHEDULE_PAGE_SIZE: Final[int] = 16 + # Conversions BPS: Final[int] = 10_000 - -# Contract Types -CT_PAM: Final[int] = 0 -CT_PBN: Final[int] = 255 # FIXME: Once ACTUS defines it - -# Day-count Conventions -DAY_2_SEC: Final[int] = 24 * 3_600 -DCC_A_A: Final[int] = 0 -DCC_A_360: Final[int] = 1 -DCC_A_365: Final[int] = 2 -DCC_30_360_ISDA: Final[int] = 3 -DCC_30_360: Final[int] = 4 -DCC_28_336: Final[int] = 5 -DCC_30_365: Final[int] = 6 -DCC_CONT: Final[int] = 255 - -# Calendar -CLDR_NC: Final[int] = 0 -CLDR_MF: Final[int] = 1 -CLDR_CUST: Final[int] = 255 - -# Business Day Convention -BDC_NOS: Final[int] = 0 - -# End of Month Convention -EOMC_SD: Final[int] = 0 - -# Prepayment Effect -PPEF_N: Final[int] = 0 -PPEF_A: Final[int] = 1 -PPEF_M: Final[int] = 2 -PPEF_CUS: Final[int] = 255 - -# Penalty Type -PYTP_N: Final[int] = 0 -PYTP_A: Final[int] = 1 -PYTP_R: Final[int] = 2 -PYTP_I: Final[int] = 3 -PYTP_CUS: Final[int] = 255 - -# Contract Performance -PRF_PERFORMANT: Final[int] = 0 -PRF_DELAYED: Final[int] = 1 -PRF_DELINQUENT: Final[int] = 2 -PRF_DEFAULTED: Final[int] = 3 -PRF_MATURED: Final[int] = 4 -PRF_TERMINATED: Final[int] = 5 - -# Role IDs -ROLE_BORROWER: Final[int] = 1 -ROLE_ARRANGER: Final[int] = 20 -ROLE_LENDER: Final[int] = 30 -ROLE_ACCOUNT_MANAGER: Final[int] = 40 -ROLE_PRIMARY_DEALER: Final[int] = 50 -ROLE_TRUSTEE: Final[int] = 60 -ROLE_AUTHORITY: Final[int] = 70 -ROLE_INTEREST_ORACLE: Final[int] = 80 +FIXED_POINT_SCALE: Final[int] = 1_000_000_000 +DAY_2_SEC: Final[int] = 24 * 60 * 60 # Role Keys Prefix -PREFIX_ID_ARRANGER: Final[bytes] = b"R20#" -PREFIX_ID_OP_DAEMON: Final[bytes] = b"R25#" -PREFIX_ID_ACCOUNT: Final[bytes] = b"R30#" -PREFIX_ID_ACCOUNT_MANAGER: Final[bytes] = b"R40#" -PREFIX_ID_PRIMARY_DEALER: Final[bytes] = b"R50#" -PREFIX_ID_TRUSTEE: Final[bytes] = b"R60#" -PREFIX_ID_AUTHORITY: Final[bytes] = b"R70#" -PREFIX_ID_INTEREST_ORACLE: Final[bytes] = b"R80#" - -# Box IDs -BOX_ID_COUPON_RATES: Final[bytes] = b"couponRates" -BOX_ID_TIME_EVENTS: Final[bytes] = b"timeEvents" -BOX_ID_TIME_PERIODS: Final[bytes] = b"timePeriods" +PREFIX_ID_ARRANGER: Final[bytes] = b"R#Arranger#" +PREFIX_ID_OP_DAEMON: Final[bytes] = b"R#OpDaemon#" +PREFIX_ID_ACCOUNT_MANAGER: Final[bytes] = b"R#AccountManager#" +PREFIX_ID_PRIMARY_DEALER: Final[bytes] = b"R#PrimaryDealer#" +PREFIX_ID_TRUSTEE: Final[bytes] = b"R#Trustee#" +PREFIX_ID_AUTHORITY: Final[bytes] = b"R#Authority#" +PREFIX_ID_INTEREST_ORACLE: Final[bytes] = b"R#InterestOracle#" + +# ACTUS Schedule Prefix +PREFIX_ID_SCHEDULE_PAGE: Final[bytes] = b"ActusSchedule#" diff --git a/smart_contracts/enums.py b/smart_contracts/enums.py index 8ab77b57..6fc40633 100644 --- a/smart_contracts/enums.py +++ b/smart_contracts/enums.py @@ -1,10 +1,110 @@ from typing import Final -# Status # TODO: Use Contract Performance instead +################################################################################ +# AVM Contract Status # TODO: Use Contract Performance instead +################################################################################ STATUS_INACTIVE: Final[int] = 0 +STATUS_PENDING_IED: Final[int] = 50 STATUS_ACTIVE: Final[int] = 100 STATUS_ENDED: Final[int] = 200 -# ACTUS Events -EVT_TYPE_PR: Final[int] = 3 -EVT_TYPE_IP: Final[int] = 8 +################################################################################ +# ACTUS Contract Types +################################################################################ +CT_PAM: Final[int] = 0 +CT_ANN: Final[int] = 1 +CT_NAM: Final[int] = 2 +CT_LAM: Final[int] = 3 +CT_LAX: Final[int] = 4 +CT_CLM: Final[int] = 5 + +################################################################################ +# ACTUS Event types +################################################################################ +EVT_AD: Final[int] = 0 +EVT_IED: Final[int] = 1 +EVT_PR: Final[int] = 3 +EVT_PRF: Final[int] = 5 +EVT_PY: Final[int] = 6 +EVT_PP: Final[int] = 7 +EVT_IP: Final[int] = 8 +EVT_RRF: Final[int] = 11 +EVT_RR: Final[int] = 12 +EVT_IPCB: Final[int] = 18 +EVT_MD: Final[int] = 19 + +################################################################################ +# Event flags +################################################################################ +FLAG_CASH_EVENT: Final[int] = 1 << 0 +FLAG_NON_CASH_EVENT: Final[int] = 1 << 1 +FLAG_OBSERVED_EVENT: Final[int] = 1 << 2 +FLAG_INITIAL_PRF: Final[int] = 1 << 3 + +################################################################################ +# Day-count Conventions +################################################################################ +DCC_AA: Final[int] = 0 +DCC_A360: Final[int] = 1 +DCC_A365: Final[int] = 2 +DCC_30E360ISDA: Final[int] = 3 +DCC_30E360: Final[int] = 4 + +################################################################################ +# Calendar +################################################################################ +CLDR_NC: Final[int] = 0 +CLDR_MF: Final[int] = 1 +CLDR_CUST: Final[int] = 255 + +################################################################################ +# Business Day Convention +################################################################################ +BDC_NOS: Final[int] = 0 + +################################################################################ +# End of Month Convention +################################################################################ +EOMC_SD: Final[int] = 0 + +################################################################################ +# Prepayment Effect +################################################################################ +PPEF_N: Final[int] = 0 +PPEF_A: Final[int] = 1 +PPEF_M: Final[int] = 2 + +################################################################################ +# Penalty Type +################################################################################ +PYTP_N: Final[int] = 0 +PYTP_A: Final[int] = 1 +PYTP_R: Final[int] = 2 +PYTP_I: Final[int] = 3 + +################################################################################ +# Contract Performance +################################################################################ +PRF_PERFORMANT: Final[int] = 0 +PRF_DELAYED: Final[int] = 1 +PRF_DELINQUENT: Final[int] = 2 +PRF_DEFAULTED: Final[int] = 3 +PRF_MATURED: Final[int] = 4 +PRF_TERMINATED: Final[int] = 5 + +################################################################################ +# Role IDs +################################################################################ +ROLE_ARRANGER: Final[int] = 20 +ROLE_OP_DAEMON: Final[int] = 25 +ROLE_ACCOUNT_MANAGER: Final[int] = 40 +ROLE_PRIMARY_DEALER: Final[int] = 50 +ROLE_TRUSTEE: Final[int] = 60 +ROLE_AUTHORITY: Final[int] = 70 +ROLE_INTEREST_ORACLE: Final[int] = 80 + +################################################################################ +# Payoff Sign +################################################################################ +PAYOFF_SIGN_POSITIVE: Final[int] = 1 +PAYOFF_SIGN_NEGATIVE: Final[int] = 255 From 442b92376d9873aefab0232ff4395beef2f9f948 Mon Sep 17 00:00:00 2001 From: cusma Date: Tue, 10 Mar 2026 13:19:19 +0100 Subject: [PATCH 002/244] feat: sdk errors --- src/errors.py | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 src/errors.py diff --git a/src/errors.py b/src/errors.py new file mode 100644 index 00000000..ca931c17 --- /dev/null +++ b/src/errors.py @@ -0,0 +1,10 @@ +class ActusNormalizationError(ValueError): + """Raised when raw ACTUS attributes cannot be normalized for AVM use.""" + + pass + + +class UnsupportedActusFeatureError(ActusNormalizationError): + """Raised when normalization encounters an out-of-scope ACTUS feature.""" + + pass From 1829619c61d0b60e63dea1aa3a41b8af2a1416cc Mon Sep 17 00:00:00 2001 From: cusma Date: Tue, 10 Mar 2026 13:19:29 +0100 Subject: [PATCH 003/244] feat: actus contract registry --- src/registry.py | 74 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 src/registry.py diff --git a/src/registry.py b/src/registry.py new file mode 100644 index 00000000..0ba08afb --- /dev/null +++ b/src/registry.py @@ -0,0 +1,74 @@ +"""ACTUS Contract Registry, defines the valid contract types, event types, and composition.""" + +from __future__ import annotations + +from smart_contracts import enums + +SUPPORTED_CONTRACT_TYPES: frozenset[str] = frozenset( + {"PAM", "LAM", "NAM", "ANN", "LAX", "CLM"} +) + +REJECTED_EVENT_TYPES: frozenset[str] = frozenset( + {"PP", "PY", "SC", "CE", "PRD", "TD", "FP"} +) + +ALLOWED_EVENT_TYPES: dict[str, frozenset[str]] = { + "PAM": frozenset({"IED", "IP", "MD", "RR", "RRF"}), + "ANN": frozenset({"IED", "IP", "PR", "MD", "RR", "RRF", "IPCB", "PRF"}), + "NAM": frozenset({"IED", "IP", "PR", "MD", "RR", "RRF", "IPCB"}), + "LAM": frozenset({"IED", "IP", "PR", "MD", "RR", "RRF", "IPCB"}), + "LAX": frozenset({"IED", "IP", "PR", "PI", "MD", "RR", "RRF", "IPCB", "PRF"}), + "CLM": frozenset({"IED", "IP", "PR", "MD", "RR", "RRF"}), +} + +CASH_EVENT_TYPES: frozenset[str] = frozenset({"IP", "PR", "MD"}) +NON_CASH_EVENT_TYPES: frozenset[str] = frozenset( + {"IED", "PI", "RR", "RRF", "IPCB", "PRF"} +) + +CONTRACT_TYPE_IDS: dict[str, int] = { + "PAM": enums.CT_PAM, + "ANN": enums.CT_ANN, + "NAM": enums.CT_NAM, + "LAM": enums.CT_LAM, + "LAX": enums.CT_LAX, + "CLM": enums.CT_CLM, +} + +EVENT_TYPE_IDS: dict[str, int] = { + "IED": enums.EVT_IED, + "PR": enums.EVT_PR, + "PRF": enums.EVT_PRF, + "IP": enums.EVT_IP, + "RRF": enums.EVT_RRF, + "RR": enums.EVT_RR, + "IPCB": enums.EVT_IPCB, + "MD": enums.EVT_MD, +} + +DAY_COUNT_CONVENTION_IDS: dict[str, int] = { + "AA": enums.DCC_AA, + "A360": enums.DCC_A360, + "A365": enums.DCC_A365, + "30E360ISDA": enums.DCC_30E360ISDA, + "30E360": enums.DCC_30E360, +} + +EVENT_SCHEDULE_PRIORITY: dict[str, int] = { + "AD": 0, + "IED": 1, + "PR": 4, + "PI": 5, + "PP": 6, + "PY": 7, + "IP": 8, + "RR": 10, + "RRF": 11, + "IPCB": 12, + "PRF": 14, + "FP": 15, + "PRD": 16, + "TD": 17, + "MD": 18, + "CE": 23, +} From 475f8ff61f267cbd606967e9fafbaab8f1c58c5f Mon Sep 17 00:00:00 2001 From: cusma Date: Tue, 10 Mar 2026 13:19:34 +0100 Subject: [PATCH 004/244] test: actus contract registry --- tests/sdk/test_registry.py | 55 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 tests/sdk/test_registry.py diff --git a/tests/sdk/test_registry.py b/tests/sdk/test_registry.py new file mode 100644 index 00000000..cbe18fd0 --- /dev/null +++ b/tests/sdk/test_registry.py @@ -0,0 +1,55 @@ +"""Pin the ACTUS registry constants used by the SDK and AVM.""" + +from __future__ import annotations + +from smart_contracts import enums +from src.registry import ( + ALLOWED_EVENT_TYPES, + CASH_EVENT_TYPES, + CONTRACT_TYPE_IDS, + EVENT_SCHEDULE_PRIORITY, + EVENT_TYPE_IDS, + NON_CASH_EVENT_TYPES, + REJECTED_EVENT_TYPES, + SUPPORTED_CONTRACT_TYPES, +) + + +def test_supported_contract_types_match_v1_scope() -> None: + """Supported types should match the intended fixed-income v1 scope.""" + assert SUPPORTED_CONTRACT_TYPES == frozenset( + {"PAM", "LAM", "NAM", "ANN", "LAX", "CLM"} + ) + + +def test_rejected_event_types_exclude_v1_out_of_scope_flows() -> None: + """Rejected types should cover the event families excluded from v1.""" + assert REJECTED_EVENT_TYPES == frozenset( + {"PP", "PY", "SC", "CE", "PRD", "TD", "FP"} + ) + + +def test_contract_type_ids_are_stable() -> None: + """Contract type ids should remain stable across SDK and AVM layers.""" + assert CONTRACT_TYPE_IDS["PAM"] == enums.CT_PAM + assert CONTRACT_TYPE_IDS["CLM"] == enums.CT_CLM + + +def test_event_type_ids_are_stable() -> None: + """Event ids should remain stable across normalization and execution.""" + assert EVENT_TYPE_IDS["PR"] == enums.EVT_PR + assert EVENT_TYPE_IDS["PRF"] == enums.EVT_PRF + + +def test_cash_and_non_cash_sets_cover_allowed_events() -> None: + """Allowed events should include the shared cash and non-cash subsets.""" + allowed_events = set().union(*ALLOWED_EVENT_TYPES.values()) + assert CASH_EVENT_TYPES.issubset(allowed_events) + assert NON_CASH_EVENT_TYPES.issubset(allowed_events) + + +def test_event_priority_matches_actus_sequence() -> None: + """Event priority should preserve the intended ACTUS ordering.""" + assert EVENT_SCHEDULE_PRIORITY["PR"] < EVENT_SCHEDULE_PRIORITY["IP"] + assert EVENT_SCHEDULE_PRIORITY["IP"] < EVENT_SCHEDULE_PRIORITY["RR"] + assert EVENT_SCHEDULE_PRIORITY["RR"] < EVENT_SCHEDULE_PRIORITY["MD"] From 51de2800e215cf4919261344fe2cbbb28966ef2f Mon Sep 17 00:00:00 2001 From: cusma Date: Tue, 10 Mar 2026 13:19:42 +0100 Subject: [PATCH 005/244] chore: nit --- tests/conftest.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/conftest.py b/tests/conftest.py index 8dbec768..564e8a3e 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -9,6 +9,7 @@ ) from algokit_utils.config import config +from smart_contracts import enums from smart_contracts import constants as sc_cst from tests import utils @@ -22,7 +23,7 @@ PRINCIPAL: Final[int] = 1_000_000 * DENOMINATION_ASA_SCALE # 1M Euro MINIMUM_DENOMINATION: Final[int] = 1_000 * DENOMINATION_ASA_SCALE # 1k Euro -DAY_COUNT_CONVENTION: Final[list[int]] = [sc_cst.DCC_CONT, sc_cst.DCC_A_A] +DAY_COUNT_CONVENTION: Final[list[int]] = [255, enums.DCC_AA] PRIMARY_DISTRIBUTION_DELAY: Final[int] = 1 * sc_cst.DAY_2_SEC PRIMARY_DISTRIBUTION_DURATION: Final[int] = 15 * sc_cst.DAY_2_SEC From efe326bcc6c246c1372da4ada5e05dc58676e39d Mon Sep 17 00:00:00 2001 From: cusma Date: Tue, 10 Mar 2026 13:41:29 +0100 Subject: [PATCH 006/244] feat: actus models --- src/models.py | 172 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 172 insertions(+) create mode 100644 src/models.py diff --git a/src/models.py b/src/models.py new file mode 100644 index 00000000..957fd6d7 --- /dev/null +++ b/src/models.py @@ -0,0 +1,172 @@ +from __future__ import annotations + +import json +from dataclasses import asdict, dataclass +from hashlib import sha256 +from typing import Any + + +def _hash_payload(payload: dict[str, Any]) -> bytes: + """Hash a canonical JSON payload for deterministic terms and schedule digests.""" + return sha256( + json.dumps(payload, sort_keys=True, separators=(",", ":"), default=str).encode( + "utf-8" + ) + ).digest() + + +@dataclass(frozen=True, slots=True) +class ExecutionTerms: + """Non-ACTUS contract execution terms.""" + + unit_value: int + total_units: int + secondary_market_opening_date: int | None + secondary_market_closure_date: int | None + + +@dataclass(frozen=True, slots=True) +class NormalizedActusTerms(ExecutionTerms): + """ + ACTUS normalized contract terms for AVM deployment. + + NOTE: `unit_value` is an SDK-only metadata. It is used to derive an exact + `total_units` count before AVM deployment, but it is not persisted on-chain. + """ + + contract_id: str + denomination_asset_id: int + settlement_asset_id: int + notional_principal: int + initial_exchange_amount: int + initial_exchange_date: int + maturity_date: int | None + day_count_convention: int + rate_reset_spread: int + rate_reset_multiplier: int + rate_reset_floor: int + rate_reset_cap: int + rate_reset_next: int + has_rate_reset_floor: bool + has_rate_reset_cap: bool + dynamic_principal_redemption: bool + fixed_point_scale: int + + def canonical_payload(self) -> dict[str, Any]: + """Return the canonical on-chain terms payload used for deployment hashing.""" + payload = asdict(self) + return payload + + def digest(self) -> bytes: + """Return the SHA-256 digest of the canonical terms payload.""" + return _hash_payload(self.canonical_payload()) + + +@dataclass(frozen=True, slots=True) +class ExecutionScheduleEntry: + """Representation of one normalized ACTUS schedule event.""" + + event_id: int + event_type: str + scheduled_time: int + accrual_factor: int + redemption_accrual_factor: int + next_nominal_interest_rate: int + next_principal_redemption: int + next_outstanding_principal: int + flags: int = 0 + + def canonical_payload(self) -> dict[str, Any]: + """Return the canonical serializable payload for schedule hashing.""" + return asdict(self) + + +@dataclass(frozen=True, slots=True) +class InitialKernelState: + """Contract initial kernel snapshot used for contract configuration.""" + + status_date: int + event_cursor: int + outstanding_principal: int + interest_calculation_base: int + nominal_interest_rate: int + accrued_interest: int + next_principal_redemption: int + cumulative_interest_index: int + cumulative_principal_index: int + terms_hash: bytes + schedule_hash: bytes + + +@dataclass(frozen=True, slots=True) +class ObservedEventRequest: + """SDK-side representation of an observed ACTUS event payload.""" + + event_type: str + scheduled_time: int + accrual_factor: int + redemption_accrual_factor: int + observed_rate: int + next_nominal_interest_rate: int + next_principal_redemption: int + next_outstanding_principal: int + flags: int = 0 + + def to_schedule_entry(self, event_id: int) -> ExecutionScheduleEntry: + """Convert an observed payload into the Execution Schedule Entry shape.""" + return ExecutionScheduleEntry( + event_id=event_id, + event_type=self.event_type, + scheduled_time=self.scheduled_time, + accrual_factor=self.accrual_factor, + redemption_accrual_factor=self.redemption_accrual_factor, + next_nominal_interest_rate=self.next_nominal_interest_rate, + next_principal_redemption=self.next_principal_redemption, + next_outstanding_principal=self.next_outstanding_principal, + flags=self.flags, + ) + + +@dataclass(frozen=True, slots=True) +class AccountPosition: + """SDK-side D-ASA Contract holder position.""" + + units: int + reserved_units: int + payment_address: str + suspended: bool + settled_cursor: int + interest_checkpoint: int + principal_checkpoint: int + claimable_interest: int + claimable_principal: int + + +@dataclass(frozen=True, slots=True) +class NormalizationResult: + """Bundle returned by normalization for AVM deployment and verification.""" + + terms: NormalizedActusTerms + schedule: tuple[ExecutionScheduleEntry, ...] + initial_state: InitialKernelState + + @property + def terms_hash(self) -> bytes: + """Expose the canonical terms hash carried by the initial kernel state.""" + return self.initial_state.terms_hash + + @property + def schedule_hash(self) -> bytes: + """Expose the canonical schedule hash carried by the initial kernel state.""" + return self.initial_state.schedule_hash + + def schedule_pages( + self, page_size: int + ) -> tuple[tuple[ExecutionScheduleEntry, ...], ...]: + """Chunk the normalized schedule into fixed-size upload pages.""" + if page_size <= 0: + raise ValueError("page_size must be positive") + pages: list[tuple[ExecutionScheduleEntry, ...]] = [] + for start in range(0, len(self.schedule), page_size): + pages.append(self.schedule[start : start + page_size]) + return tuple(pages) From 33bdd80ae75f1e350ce53515fbcb9bda77b14c7f Mon Sep 17 00:00:00 2001 From: cusma Date: Tue, 10 Mar 2026 13:41:56 +0100 Subject: [PATCH 007/244] chore: sdk exports --- src/__init__.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 src/__init__.py diff --git a/src/__init__.py b/src/__init__.py new file mode 100644 index 00000000..d15b9cbe --- /dev/null +++ b/src/__init__.py @@ -0,0 +1,20 @@ +from .errors import ActusNormalizationError, UnsupportedActusFeatureError +from .models import ( + AccountPosition, + ExecutionScheduleEntry, + InitialKernelState, + NormalizationResult, + NormalizedActusTerms, + ObservedEventRequest, +) + +__all__ = [ + "AccountPosition", + "ActusNormalizationError", + "ExecutionScheduleEntry", + "InitialKernelState", + "NormalizationResult", + "NormalizedActusTerms", + "ObservedEventRequest", + "UnsupportedActusFeatureError", +] From 4f6c059d69190c06e39ab7b2de35392aacdedc41 Mon Sep 17 00:00:00 2001 From: cusma Date: Tue, 10 Mar 2026 13:42:05 +0100 Subject: [PATCH 008/244] test: sdk models --- tests/sdk/test_models.py | 67 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 tests/sdk/test_models.py diff --git a/tests/sdk/test_models.py b/tests/sdk/test_models.py new file mode 100644 index 00000000..fbcb4aa1 --- /dev/null +++ b/tests/sdk/test_models.py @@ -0,0 +1,67 @@ +from __future__ import annotations + +from src.models import ( + ExecutionScheduleEntry, + InitialKernelState, + NormalizationResult, + NormalizedActusTerms, +) + + +def test_schedule_pages_chunk_entries() -> None: + terms = NormalizedActusTerms( + contract_id="PAM-001", + denomination_asset_id=1, + settlement_asset_id=1, + unit_value=1_000, + total_units=100, + notional_principal=100_000, + initial_exchange_amount=100_000, + initial_exchange_date=1, + maturity_date=2, + secondary_market_opening_date=None, + secondary_market_closure_date=None, + day_count_convention=2, + rate_reset_spread=0, + rate_reset_multiplier=1_000_000_000, + rate_reset_floor=0, + rate_reset_cap=0, + rate_reset_next=0, + has_rate_reset_floor=False, + has_rate_reset_cap=False, + dynamic_principal_redemption=False, + fixed_point_scale=1_000_000_000, + ) + schedule = tuple( + ExecutionScheduleEntry( + event_id=index, + event_type="IP", + scheduled_time=index + 1, + accrual_factor=1, + redemption_accrual_factor=0, + next_nominal_interest_rate=0, + next_principal_redemption=0, + next_outstanding_principal=100_000, + flags=0, + ) + for index in range(5) + ) + state = InitialKernelState( + status_date=0, + event_cursor=0, + outstanding_principal=0, + interest_calculation_base=0, + nominal_interest_rate=0, + accrued_interest=0, + next_principal_redemption=0, + cumulative_interest_index=0, + cumulative_principal_index=0, + terms_hash=terms.digest(), + schedule_hash=b"\0" * 32, + ) + result = NormalizationResult(terms=terms, schedule=schedule, initial_state=state) + + pages = result.schedule_pages(2) + assert len(pages) == 3 + assert pages[0][0].event_id == 0 + assert pages[-1][-1].event_id == 4 From bf9419e2e679310c857ca214c8614140db0ed6d8 Mon Sep 17 00:00:00 2001 From: cusma Date: Tue, 10 Mar 2026 13:42:12 +0100 Subject: [PATCH 009/244] chore: nit --- tests/conftest.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/conftest.py b/tests/conftest.py index 564e8a3e..843930db 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -9,8 +9,8 @@ ) from algokit_utils.config import config -from smart_contracts import enums from smart_contracts import constants as sc_cst +from smart_contracts import enums from tests import utils INITIAL_ALGO_FUNDS: Final[AlgoAmount] = AlgoAmount.from_algo(10_000) From 3a8cfe215dfd0859896e8392f353f81b91f228f2 Mon Sep 17 00:00:00 2001 From: cusma Date: Tue, 10 Mar 2026 14:00:27 +0100 Subject: [PATCH 010/244] chore: remove hash --- src/models.py | 41 ++-------------------------------------- tests/sdk/test_models.py | 2 -- 2 files changed, 2 insertions(+), 41 deletions(-) diff --git a/src/models.py b/src/models.py index 957fd6d7..f07ef40c 100644 --- a/src/models.py +++ b/src/models.py @@ -1,18 +1,6 @@ from __future__ import annotations -import json -from dataclasses import asdict, dataclass -from hashlib import sha256 -from typing import Any - - -def _hash_payload(payload: dict[str, Any]) -> bytes: - """Hash a canonical JSON payload for deterministic terms and schedule digests.""" - return sha256( - json.dumps(payload, sort_keys=True, separators=(",", ":"), default=str).encode( - "utf-8" - ) - ).digest() +from dataclasses import dataclass @dataclass(frozen=True, slots=True) @@ -21,6 +9,7 @@ class ExecutionTerms: unit_value: int total_units: int + fixed_point_scale: int secondary_market_opening_date: int | None secondary_market_closure_date: int | None @@ -50,16 +39,6 @@ class NormalizedActusTerms(ExecutionTerms): has_rate_reset_floor: bool has_rate_reset_cap: bool dynamic_principal_redemption: bool - fixed_point_scale: int - - def canonical_payload(self) -> dict[str, Any]: - """Return the canonical on-chain terms payload used for deployment hashing.""" - payload = asdict(self) - return payload - - def digest(self) -> bytes: - """Return the SHA-256 digest of the canonical terms payload.""" - return _hash_payload(self.canonical_payload()) @dataclass(frozen=True, slots=True) @@ -76,10 +55,6 @@ class ExecutionScheduleEntry: next_outstanding_principal: int flags: int = 0 - def canonical_payload(self) -> dict[str, Any]: - """Return the canonical serializable payload for schedule hashing.""" - return asdict(self) - @dataclass(frozen=True, slots=True) class InitialKernelState: @@ -94,8 +69,6 @@ class InitialKernelState: next_principal_redemption: int cumulative_interest_index: int cumulative_principal_index: int - terms_hash: bytes - schedule_hash: bytes @dataclass(frozen=True, slots=True) @@ -150,16 +123,6 @@ class NormalizationResult: schedule: tuple[ExecutionScheduleEntry, ...] initial_state: InitialKernelState - @property - def terms_hash(self) -> bytes: - """Expose the canonical terms hash carried by the initial kernel state.""" - return self.initial_state.terms_hash - - @property - def schedule_hash(self) -> bytes: - """Expose the canonical schedule hash carried by the initial kernel state.""" - return self.initial_state.schedule_hash - def schedule_pages( self, page_size: int ) -> tuple[tuple[ExecutionScheduleEntry, ...], ...]: diff --git a/tests/sdk/test_models.py b/tests/sdk/test_models.py index fbcb4aa1..a0e2954d 100644 --- a/tests/sdk/test_models.py +++ b/tests/sdk/test_models.py @@ -56,8 +56,6 @@ def test_schedule_pages_chunk_entries() -> None: next_principal_redemption=0, cumulative_interest_index=0, cumulative_principal_index=0, - terms_hash=terms.digest(), - schedule_hash=b"\0" * 32, ) result = NormalizationResult(terms=terms, schedule=schedule, initial_state=state) From 7f6eaa02a1bb15bf32acb37e64130f0eb845027f Mon Sep 17 00:00:00 2001 From: cusma Date: Tue, 10 Mar 2026 16:50:03 +0100 Subject: [PATCH 011/244] chore: add business day and end of month conventions --- smart_contracts/enums.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/smart_contracts/enums.py b/smart_contracts/enums.py index 6fc40633..9d91d781 100644 --- a/smart_contracts/enums.py +++ b/smart_contracts/enums.py @@ -61,11 +61,20 @@ # Business Day Convention ################################################################################ BDC_NOS: Final[int] = 0 +BDC_SCF: Final[int] = 1 +BDC_SCMF: Final[int] = 2 +BDC_CSF: Final[int] = 3 +BDC_CSMF: Final[int] = 4 +BDC_SCP: Final[int] = 5 +BDC_SCMP: Final[int] = 6 +BDC_CSP: Final[int] = 7 +BDC_CSMP: Final[int] = 8 ################################################################################ # End of Month Convention ################################################################################ EOMC_SD: Final[int] = 0 +EOMC_EOM: Final[int] = 1 ################################################################################ # Prepayment Effect From a548fcdb13b7a1c213a8c4e6a06555b88d23d47d Mon Sep 17 00:00:00 2001 From: cusma Date: Tue, 10 Mar 2026 16:50:24 +0100 Subject: [PATCH 012/244] feat: unix time helpers --- src/unix_time.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 src/unix_time.py diff --git a/src/unix_time.py b/src/unix_time.py new file mode 100644 index 00000000..1501cfff --- /dev/null +++ b/src/unix_time.py @@ -0,0 +1,18 @@ +from datetime import datetime, timezone +from typing import TypeAlias + +UTCTimeStamp: TypeAlias = int + + +def timestamp_to_datetime(timestamp: UTCTimeStamp) -> datetime: + """Convert a UTC UNIX timestamp into a timezone-aware datetime.""" + + return datetime.fromtimestamp(timestamp, tz=timezone.utc) + + +def datetime_to_timestamp(value: datetime) -> UTCTimeStamp: + """Convert a datetime into a UTC UNIX timestamp.""" + + if value.tzinfo is None: + value = value.replace(tzinfo=timezone.utc) + return UTCTimeStamp(value.timestamp()) From 1595fdb780ef4e444e460f37feb408de2ce70b46 Mon Sep 17 00:00:00 2001 From: cusma Date: Tue, 10 Mar 2026 16:50:33 +0100 Subject: [PATCH 013/244] feat: day count convetions --- src/day_count.py | 234 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 234 insertions(+) create mode 100644 src/day_count.py diff --git a/src/day_count.py b/src/day_count.py new file mode 100644 index 00000000..5ecb7072 --- /dev/null +++ b/src/day_count.py @@ -0,0 +1,234 @@ +from calendar import monthrange +from datetime import datetime +from enum import IntEnum + +from smart_contracts import enums +from smart_contracts.constants import DAY_2_SEC + +from .unix_time import UTCTimeStamp, timestamp_to_datetime + + +class Calendar(IntEnum): + """ + Calendar (CLDR). + + Calendar defines the non-working days which affect the dates of contract + events (CDE's) in combination with EOMC and BDC. Custom calendars can be + added as additional enum options. + """ + + NO_CALENDAR = enums.CLDR_NC + """No holidays defined.""" + + MONDAY_TO_FRIDAY = enums.CLDR_MF + """Saturdays and Sundays are holidays.""" + + # Aliases for convenience + NC = NO_CALENDAR + MF = MONDAY_TO_FRIDAY + + +class EndOfMonthConvention(IntEnum): + """ + End of Month Convention (EOMC). + + When computing schedules a special problem arises if an anchor date is at + the end of a month and a cycle of monthly or quarterly is applied (yearly + in the case of leap years only). How do we have to interpret an anchor date + April 30 plus 1M cycles? + + - EOM: Will jump to the 31st of May, then June 30, July 31 and so on. + - SD: Will jump to the 30th always with an exception in February. + + This logic applies for all months having 30 or less days and an anchor date + at the last day. Months with 31 days will at any rate jump to the last of + the month if anchor date is on the last day. + """ + + SAME_DAY = enums.EOMC_SD + """Schedule times always fall on the schedule anchor date day of the month.""" + + END_OF_MONTH = enums.EOMC_EOM + """Schedule times fall on the end of every month if the anchor date represents + the last day of the respective month.""" + + # Aliases for convenience + SD = SAME_DAY + EOM = END_OF_MONTH + + +def is_end_of_month(value: datetime) -> bool: + """Return whether the datetime falls on its month's final day.""" + + return value.day == monthrange(value.year, value.month)[1] + + +def is_business_day(timestamp: UTCTimeStamp, calendar: Calendar = Calendar.NC) -> bool: + """Return whether a UTC UNIX timestamp falls on a business day for a named calendar.""" + + if calendar == Calendar.NO_CALENDAR: + return True + + return timestamp_to_datetime(timestamp).weekday() < 5 + + +class BusinessDayConvention(IntEnum): + """ + Business Day Convention (BDC). + + BDC's are linked to a calendar. Calendars have working and non-working days. + A BDC value other than N means that cash flows cannot fall on non-working + days, they must be shifted to the next business day (following) or the + previous one (preceding). + + These two simple rules get refined twofold: + - Following modified (preceding modified): Same like following (preceding), + however if a cash flow gets shifted into a new month, then it is shifted + to preceding (following) business day. + - Shift/calculate (SC) and calculate/shift (CS). Accrual, principal, and + possibly other calculations are affected by this choice. In the case of + SC first the dates are shifted and after the shift cash flows are + calculated. In the case of CS it is the other way round. + + Note: Does not affect non-cyclical dates such as PRD, MD, TD, IPCED since + they can be set to the correct date directly. + """ + + NO_SHIFT = enums.BDC_NOS + """No shift applied to non-business days.""" + + SHIFT_CALCULATE_FOLLOWING = enums.BDC_SCF + """Shift event dates first then calculate accruals etc. Strictly shift to + the next following business day.""" + + SHIFT_CALCULATE_MODIFIED_FOLLOWING = enums.BDC_SCMF + """Shift event dates first then calculate accruals etc. Shift to the next + following business day if this falls in the same month. Shift to the most + recent preceding business day otherwise.""" + + CALCULATE_SHIFT_FOLLOWING = enums.BDC_CSF + """Calculate accruals etc. first then shift event dates. Strictly shift to + the next following business day.""" + + CALCULATE_SHIFT_MODIFIED_FOLLOWING = enums.BDC_CSMF + """Calculate accruals etc. first then shift event dates. Shift to the next + following business day if this falls in the same month. Shift to the most + recent preceding business day otherwise.""" + + SHIFT_CALCULATE_PRECEDING = enums.BDC_SCP + """Shift event dates first then calculate accruals etc. Strictly shift to + the most recent preceding business day.""" + + SHIFT_CALCULATE_MODIFIED_PRECEDING = enums.BDC_SCMP + """Shift event dates first then calculate accruals etc. Shift to the most + recent preceding business day if this falls in the same month. Shift to the + next following business day otherwise.""" + + CALCULATE_SHIFT_PRECEDING = enums.BDC_CSP + """Calculate accruals etc. first then shift event dates. Strictly shift to + the most recent preceding business day.""" + + CALCULATE_SHIFT_MODIFIED_PRECEDING = enums.BDC_CSMP + """Calculate accruals etc. first then shift event dates. Shift to the most + recent preceding business day if this falls in the same month. Shift to the + next following business day otherwise.""" + + # Aliases for convenience + NOS = NO_SHIFT + SCF = SHIFT_CALCULATE_FOLLOWING + SCMF = SHIFT_CALCULATE_MODIFIED_FOLLOWING + CSF = CALCULATE_SHIFT_FOLLOWING + CSMF = CALCULATE_SHIFT_MODIFIED_FOLLOWING + SCP = SHIFT_CALCULATE_PRECEDING + SCMP = SHIFT_CALCULATE_MODIFIED_PRECEDING + CSP = CALCULATE_SHIFT_PRECEDING + CSMP = CALCULATE_SHIFT_MODIFIED_PRECEDING + + +def adjust_to_business_day( + timestamp: UTCTimeStamp, + *, + business_day_convention: BusinessDayConvention, + calendar: Calendar = Calendar.NC, +) -> UTCTimeStamp: + """Adjust a UTC UNIX timestamp according to an ACTUS business-day convention.""" + + # No shift convention - return timestamp as-is + if business_day_convention == BusinessDayConvention.NO_SHIFT: + return timestamp + + # If already a business day, no adjustment needed + if is_business_day(timestamp, calendar): + return timestamp + + current = timestamp + original = timestamp + original_month = timestamp_to_datetime(timestamp).month + + # Following conventions (shift forward) + if business_day_convention in ( + BusinessDayConvention.SHIFT_CALCULATE_FOLLOWING, + BusinessDayConvention.SHIFT_CALCULATE_MODIFIED_FOLLOWING, + BusinessDayConvention.CALCULATE_SHIFT_FOLLOWING, + BusinessDayConvention.CALCULATE_SHIFT_MODIFIED_FOLLOWING, + ): + while not is_business_day(current, calendar): + current += DAY_2_SEC + # Modified following: if shifted to next month, shift back to preceding + if ( + business_day_convention + in ( + BusinessDayConvention.SHIFT_CALCULATE_MODIFIED_FOLLOWING, + BusinessDayConvention.CALCULATE_SHIFT_MODIFIED_FOLLOWING, + ) + and timestamp_to_datetime(current).month != original_month + ): + current = original + while not is_business_day(current, calendar): + current -= DAY_2_SEC + + # Preceding conventions (shift backward) + elif business_day_convention in ( + BusinessDayConvention.SHIFT_CALCULATE_PRECEDING, + BusinessDayConvention.SHIFT_CALCULATE_MODIFIED_PRECEDING, + BusinessDayConvention.CALCULATE_SHIFT_PRECEDING, + BusinessDayConvention.CALCULATE_SHIFT_MODIFIED_PRECEDING, + ): + while not is_business_day(current, calendar): + current -= DAY_2_SEC + # Modified preceding: if shifted to previous month, shift forward to following + if ( + business_day_convention + in ( + BusinessDayConvention.SHIFT_CALCULATE_MODIFIED_PRECEDING, + BusinessDayConvention.CALCULATE_SHIFT_MODIFIED_PRECEDING, + ) + and timestamp_to_datetime(current).month != original_month + ): + current = original + while not is_business_day(current, calendar): + current += DAY_2_SEC + + return current + + +def is_calculate_shift(business_day_convention: BusinessDayConvention) -> bool: + """Return whether the BDC is calculate-then-shift.""" + + return business_day_convention in ( + BusinessDayConvention.CALCULATE_SHIFT_FOLLOWING, + BusinessDayConvention.CALCULATE_SHIFT_MODIFIED_FOLLOWING, + BusinessDayConvention.CALCULATE_SHIFT_PRECEDING, + BusinessDayConvention.CALCULATE_SHIFT_MODIFIED_PRECEDING, + ) + + +def is_shift_calculate(business_day_convention: BusinessDayConvention) -> bool: + """Return whether the BDC is shift-then-calculate.""" + + return business_day_convention in ( + BusinessDayConvention.SHIFT_CALCULATE_FOLLOWING, + BusinessDayConvention.SHIFT_CALCULATE_MODIFIED_FOLLOWING, + BusinessDayConvention.SHIFT_CALCULATE_PRECEDING, + BusinessDayConvention.SHIFT_CALCULATE_MODIFIED_PRECEDING, + ) From 530bab2d0742ede6b4d34205b103798c819fd02f Mon Sep 17 00:00:00 2001 From: cusma Date: Tue, 10 Mar 2026 16:50:47 +0100 Subject: [PATCH 014/244] feat: actus schedule --- src/schedule.py | 512 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 512 insertions(+) create mode 100644 src/schedule.py diff --git a/src/schedule.py b/src/schedule.py new file mode 100644 index 00000000..55f464ff --- /dev/null +++ b/src/schedule.py @@ -0,0 +1,512 @@ +from __future__ import annotations + +from calendar import monthrange +from collections.abc import Sequence +from dataclasses import dataclass +from typing import Literal + +from smart_contracts.constants import DAY_2_SEC + +from .day_count import ( + BusinessDayConvention, + Calendar, + EndOfMonthConvention, + is_end_of_month, +) +from .errors import UnsupportedActusFeatureError +from .unix_time import UTCTimeStamp, datetime_to_timestamp, timestamp_to_datetime + + +@dataclass(frozen=True, slots=True) +class Cycle: + """ + ACTUS cycle object representing a time period for schedule generation. + + Attributes: + count: The number of units in the cycle (e.g., 3 for "3M") + unit: The time unit - D (days), W (weeks), M (months), Q (quarters), + H (half-years), Y (years) + stub: Optional stub period marker ("+" or "-") for short/long stubs + + ACTUS string notation examples: + - "90D" = 90 days + - "12W" = 12 weeks + - "3M" = 3 months + - "1Q" = 1 quarter (3 months) + - "1H" = 1 half-year (6 months) + - "2Y" = 2 years + - "3M+" = 3 months with long stub marker + - "1Q-" = 1 quarter with short stub marker + """ + + count: int + unit: Literal["D", "W", "M", "Q", "H", "Y"] + stub: str = "" + + @classmethod + def parse_cycle(cls, raw_cycle: object) -> Cycle: + """ + Parse an ACTUS cycle string into a Cycle object. + + Args: + raw_cycle: String representation of the cycle (e.g., "3M", "1Q+") + + Returns: + Cycle object with parsed count, unit, and optional stub marker + + Raises: + TypeError: If raw_cycle is not convertible to string + ValueError: If cycle format is invalid or unit is not recognized + + Examples: + >>> Cycle.parse_cycle("3M") + Cycle(count=3, unit='M', stub='') + >>> Cycle.parse_cycle("1Q+") + Cycle(count=1, unit='Q', stub='+') + """ + + # If already a Cycle object, return it as-is + if isinstance(raw_cycle, Cycle): + return raw_cycle + + try: + cycle_str = str(raw_cycle).strip().upper() + except Exception as exc: + raise TypeError( + f"Cannot convert cycle to string: {type(raw_cycle).__name__}" + ) from exc + + if not cycle_str: + raise ValueError("Cycle string cannot be empty") + + stub = "" + if cycle_str.endswith(("+", "-")): + # Sanitize cycle removing markers. Example: "3M+" -> cycle="3M", stub="+" + stub = cycle_str[-1] + cycle_str = cycle_str[:-1] + + if len(cycle_str) < 2 or not cycle_str[:-1].isdigit(): + raise ValueError( + f"Unsupported ACTUS cycle: {raw_cycle!r} (expected format: [+|-])" + ) + + count_str = cycle_str[:-1] + unit = cycle_str[-1] + + if unit not in ("D", "W", "M", "Q", "H", "Y"): + raise ValueError( + f"Invalid cycle unit '{unit}'. Must be one of: D, W, M, Q, H, Y" + ) + + count = int(count_str) + if count <= 0: + raise ValueError(f"Cycle count must be positive, got: {count}") + + return Cycle(count=count, unit=unit, stub=stub) + + +def _add_month_cycle_from_anchor( + anchor_timestamp: UTCTimeStamp, + *, + cycle: Cycle, + occurrence_index: int, + end_of_month_convention: EndOfMonthConvention = EndOfMonthConvention.SD, +) -> UTCTimeStamp: + """ + Advance a month-based cycle from a fixed anchor UTC UNIX timestamp. + + This function calculates the timestamp for a specific occurrence of a + month-based cycle (M, Q, H, Y) by adding the appropriate number of months + to the anchor date. It handles month-end dates according to the specified + end-of-month convention. + + Args: + anchor_timestamp: The starting point (UTC UNIX timestamp) from which to calculate + cycle: Cycle object with unit in {"M", "Q", "H", "Y"} + occurrence_index: Which occurrence to calculate (0 = anchor, 1 = first, etc.) + end_of_month_convention: How to handle month-end dates: + - SD (Same Day): Always use the same day of month (capped to valid days) + - EOM (End of Month): If anchor is month-end, result is also month-end + + Returns: + UTC UNIX timestamp for the specified occurrence + + Raises: + ValueError: If cycle.unit is not a month-based unit (M, Q, H, Y) + ValueError: If occurrence_index is negative + + Examples: + For anchor = Jan 31 2024 (month-end), cycle = "1M": + - With SD: Feb 29, Mar 31, Apr 30, May 31, ... + - With EOM: Feb 29, Mar 31, Apr 30, May 31, ... + (Both produce month-ends since Jan 31 is a month-end) + + For anchor = Feb 29 2024 (month-end in leap year), cycle = "1M": + - With SD: Mar 29, Apr 29, May 29, Jun 29, ... + - With EOM: Mar 31, Apr 30, May 31, Jun 30, ... + (EOM sticks to month-ends; SD uses day 29) + """ + + if occurrence_index < 0: + raise ValueError( + f"occurrence_index must be non-negative, got: {occurrence_index}" + ) + + month_delta_map = {"M": 1, "Q": 3, "H": 6, "Y": 12} + if cycle.unit not in month_delta_map: + raise ValueError( + f"Unsupported cycle unit for month-based calculation: {cycle.unit}" + ) + + current = timestamp_to_datetime(anchor_timestamp) + total_months = occurrence_index * cycle.count * month_delta_map[cycle.unit] + month_index = (current.month - 1) + total_months + year = current.year + month_index // 12 + month = (month_index % 12) + 1 + day = min(current.day, monthrange(year, month)[1]) + + if end_of_month_convention == EndOfMonthConvention.EOM and is_end_of_month(current): + day = monthrange(year, month)[1] + + return datetime_to_timestamp(current.replace(year=year, month=month, day=day)) + + +def _add_cycle_chained( + timestamp: UTCTimeStamp, + cycle: Cycle, + *, + end_of_month_convention: EndOfMonthConvention = EndOfMonthConvention.SD, +) -> UTCTimeStamp: + """ + Advance one chained cycle from the current UTC UNIX timestamp. + + This function adds exactly one cycle period to the given timestamp. + For day and week cycles, it performs simple arithmetic addition. + For month-based cycles, it delegates to _add_month_cycle_from_anchor + with occurrence_index=1. + + Args: + timestamp: Current UTC UNIX timestamp to advance from + cycle: Cycle object defining the period to add + end_of_month_convention: How to handle month-end dates (used for month-based cycles) + + Returns: + UTC UNIX timestamp advanced by one cycle period + + Raises: + ValueError: If cycle.unit is not a recognized unit + + Note: + This is used for iterative schedule generation where each date is + calculated from the previous one, rather than from a fixed anchor. + """ + + if cycle.unit == "D": + return timestamp + cycle.count * DAY_2_SEC + if cycle.unit == "W": + return timestamp + cycle.count * 7 * DAY_2_SEC + if cycle.unit in {"M", "Q", "H", "Y"}: + return _add_month_cycle_from_anchor( + timestamp, + cycle=cycle, + occurrence_index=1, + end_of_month_convention=end_of_month_convention, + ) + + raise ValueError(f"Unsupported cycle unit: {cycle.unit}") + + +def add_cycle( + timestamp: UTCTimeStamp, + raw_cycle: object, + *, + end_of_month_convention: EndOfMonthConvention = EndOfMonthConvention.SD, + anchor_timestamp: UTCTimeStamp | None = None, + occurrence_index: int | None = None, +) -> UTCTimeStamp: + """ + Advance a UTC UNIX timestamp by one ACTUS cycle occurrence. + + This function supports two calculation modes: + 1. Anchor-based: When both anchor_timestamp and occurrence_index are provided, + calculates the Nth occurrence from the anchor (more accurate for long schedules) + 2. Chained: When anchor parameters are None, adds one cycle to timestamp + (simple iteration from previous date) + + Args: + timestamp: UTC UNIX timestamp to advance (used in chained mode) + raw_cycle: ACTUS cycle string (e.g., "3M", "1Q", "90D") or Cycle object + end_of_month_convention: How to handle month-end dates for month-based cycles + anchor_timestamp: Optional fixed starting point for anchor-based calculation + occurrence_index: Optional occurrence number (0 = anchor, 1 = first, etc.) + + Returns: + UTC UNIX timestamp advanced by the cycle + + Note: + Anchor-based mode is preferred for generating full schedules as it prevents + error accumulation. Chained mode is simpler but can accumulate rounding errors + over many iterations. + """ + + cycle = Cycle.parse_cycle(raw_cycle) + + # Anchor-based mode: calculate from fixed anchor + if anchor_timestamp is not None and occurrence_index is not None: + if cycle.unit in {"M", "Q", "H", "Y"}: + return _add_month_cycle_from_anchor( + anchor_timestamp, + cycle=cycle, + occurrence_index=occurrence_index, + end_of_month_convention=end_of_month_convention, + ) + if cycle.unit == "D": + return anchor_timestamp + occurrence_index * cycle.count * DAY_2_SEC + if cycle.unit == "W": + return anchor_timestamp + occurrence_index * cycle.count * 7 * DAY_2_SEC + + # Chained mode: calculate from previous timestamp + return _add_cycle_chained( + timestamp, cycle, end_of_month_convention=end_of_month_convention + ) + + +def generate_schedule( + start: UTCTimeStamp, + raw_cycle: object, + end: UTCTimeStamp, + *, + end_of_month_convention: EndOfMonthConvention = EndOfMonthConvention.SD, +) -> tuple[UTCTimeStamp, ...]: + """ + Generate raw cycle dates from a start anchor up to an inclusive end date. + + This function creates a sequence of timestamps by repeatedly applying + the cycle from the start anchor. The start date is always included as + the first element. All dates are calculated from the anchor to prevent + error accumulation. + + Args: + start: UTC UNIX timestamp anchor (first date in schedule) + raw_cycle: ACTUS cycle string (e.g., "3M", "1Q", "90D") + end: UTC UNIX timestamp upper bound (inclusive) + end_of_month_convention: How to handle month-end dates for month-based cycles + + Returns: + Tuple of UTC UNIX timestamps from start up to (but not exceeding) end. + Returns empty tuple if start <= 0, end <= 0, or start > end. + + Examples: + >>> # For timestamps representing 2024-01-15, 2024-04-15 + >>> generate_schedule( + ... start=1705276800, # 2024-01-15 00:00:00 UTC + ... raw_cycle="1M", + ... end=1713139200 # 2024-04-15 00:00:00 UTC + ... ) + (1705276800, 1707955200, 1710547200, 1713139200) + """ + + if start <= 0 or end <= 0 or start > end: + return () + + cycle = Cycle.parse_cycle(raw_cycle) + schedule: list[int] = [] + occurrence_index = 0 + + # Safety check: prevent infinite loops (max 100 years worth of daily cycles) + max_iterations = 100 * 365 + 25 # ~36,525 iterations + + while occurrence_index < max_iterations: + current = add_cycle( + start, + cycle, + end_of_month_convention=end_of_month_convention, + anchor_timestamp=start, + occurrence_index=occurrence_index, + ) + if current > end: + break + schedule.append(current) + occurrence_index += 1 + + return tuple(schedule) + + +def generate_array_schedule( + anchors: Sequence[UTCTimeStamp], + cycles: Sequence[object], + end: UTCTimeStamp, + *, + end_of_month_convention: EndOfMonthConvention = EndOfMonthConvention.SD, +) -> tuple[UTCTimeStamp, ...]: + """ + Generate a flattened schedule from parallel anchor and cycle arrays. + + This function supports piecewise schedule generation where different + cycles apply to different time periods. Each anchor/cycle pair defines + a sub-schedule, and all sub-schedules are merged, sorted, and deduplicated. + + The algorithm: + 1. For each (anchor, cycle) pair, generate dates up to the next anchor + (or the final end date for the last pair) + 2. Exclude dates that equal or exceed the next anchor (except for last segment) + 3. Merge all dates, add the final end date, sort, and remove duplicates + + Args: + anchors: Sequence of UTC UNIX timestamps marking schedule segment starts + cycles: Sequence of ACTUS cycle strings, parallel to anchors + end: UTC UNIX timestamp upper bound (inclusive, always included in result) + end_of_month_convention: How to handle month-end dates for month-based cycles + + Returns: + Tuple of sorted, unique UTC UNIX timestamps covering all segments. + Returns empty tuple if anchors is empty. + + Raises: + ValueError: If anchors and cycles have different lengths + + Examples: + >>> # Generate piecewise schedule with different cycles per segment + >>> generate_array_schedule( + ... anchors=[1704067200, 1711929600], # 2024-01-01, 2024-04-01 UTC + ... cycles=["1M", "3M"], + ... end=1735603200 # 2024-12-31 UTC + ... ) + # Returns monthly timestamps for Jan-Mar, quarterly for Apr-Dec, plus Dec 31 + """ + + if len(anchors) != len(cycles): + raise ValueError("anchors and cycles must have same length") + if not anchors: + return () + + # Use a set for efficient deduplication + all_dates_set: set[int] = set() + + for index, (anchor, cycle) in enumerate(zip(anchors, cycles, strict=True)): + sub_end = end if index + 1 == len(anchors) else anchors[index + 1] + sub_schedule = generate_schedule( + anchor, + cycle, + sub_end, + end_of_month_convention=end_of_month_convention, + ) + + if index + 1 < len(anchors): + # Exclude dates that equal or exceed the next anchor + all_dates_set.update(date for date in sub_schedule if date < sub_end) + else: + all_dates_set.update(sub_schedule) + + # Always include the end date + all_dates_set.add(end) + + return tuple(sorted(all_dates_set)) + + +def resolve_cycle_schedule( + start: UTCTimeStamp, + raw_cycle: object, + end: UTCTimeStamp, + *, + end_of_month_convention: EndOfMonthConvention = EndOfMonthConvention.SD, + business_day_convention: BusinessDayConvention = BusinessDayConvention.NOS, + calendar_name: Calendar = Calendar.NC, +) -> tuple[UTCTimeStamp, ...]: + """ + Generate and business-day-adjust a cycle-based ACTUS schedule. + + This is the high-level function for creating a complete schedule from + a single anchor and cycle. It generates the base schedule and applies + business day adjustments according to the specified convention and calendar. + + Args: + start: UTC UNIX timestamp anchor (first date in schedule) + raw_cycle: ACTUS cycle string (e.g., "3M", "1Q", "90D") + end: UTC UNIX timestamp upper bound (inclusive) + end_of_month_convention: How to handle month-end dates for month-based cycles + business_day_convention: How to adjust dates that fall on non-business days + calendar_name: Which calendar defines business days vs. holidays + + Returns: + Tuple of UTC UNIX timestamps with business day adjustments applied + + Raises: + UnsupportedActusFeatureError: If business_day_convention is not NO_SHIFT + UnsupportedActusFeatureError: If calendar_name is not NO_CALENDAR + + Note: + V1 implementation only supports: + - BusinessDayConvention: NO_SHIFT (no adjustments) + - Calendar: NO_CALENDAR (all days are business days) + """ + + if business_day_convention != BusinessDayConvention.NOS: + raise UnsupportedActusFeatureError( + "Supported Business Day Convention: NO_SHIFT" + ) + if calendar_name != Calendar.NC: + raise UnsupportedActusFeatureError("Supported Calendar: NO_CALENDAR") + + base_dates = generate_schedule( + start, + raw_cycle, + end, + end_of_month_convention=end_of_month_convention, + ) + return tuple(base_date for base_date in base_dates) + + +def resolve_array_schedule( + anchors: Sequence[UTCTimeStamp], + cycles: Sequence[object], + end: int, + *, + end_of_month_convention: EndOfMonthConvention = EndOfMonthConvention.SD, + business_day_convention: BusinessDayConvention = BusinessDayConvention.NOS, + calendar_name: Calendar = Calendar.NC, +) -> tuple[UTCTimeStamp, ...]: + """ + Generate and business-day-adjust an array-based ACTUS schedule. + + This is the high-level function for creating a piecewise schedule from + multiple anchors and cycles. It generates the base schedule using array + logic and applies business day adjustments according to the specified + convention and calendar. + + Args: + anchors: Sequence of UTC UNIX timestamps marking schedule segment starts + cycles: Sequence of ACTUS cycle strings, parallel to anchors + end: UTC UNIX timestamp upper bound (inclusive) + end_of_month_convention: How to handle month-end dates for month-based cycles + business_day_convention: How to adjust dates that fall on non-business days + calendar_name: Which calendar defines business days vs. holidays + + Returns: + Tuple of UTC UNIX timestamps with business day adjustments applied + + Raises: + UnsupportedActusFeatureError: If business_day_convention is not NO_SHIFT + UnsupportedActusFeatureError: If calendar_name is not NO_CALENDAR + ValueError: If anchors and cycles have different lengths + + Note: + V1 implementation only supports: + - BusinessDayConvention: NO_SHIFT (no adjustments) + - Calendar: NO_CALENDAR (all days are business days) + """ + + if business_day_convention != BusinessDayConvention.NOS: + raise UnsupportedActusFeatureError( + "Supported Business Day Convention: NO_SHIFT" + ) + if calendar_name != Calendar.NC: + raise UnsupportedActusFeatureError("Supported Calendar: NO_CALENDAR") + + base_dates = generate_array_schedule( + anchors, + cycles, + end, + end_of_month_convention=end_of_month_convention, + ) + return tuple(base_date for base_date in base_dates) From d64615c58a35f1ddc5d9c27d4887b3317d885fd9 Mon Sep 17 00:00:00 2001 From: cusma Date: Tue, 10 Mar 2026 16:52:15 +0100 Subject: [PATCH 015/244] test: unix time --- tests/sdk/test_unix_time.py | 132 ++++++++++++++++++++++++++++++++++++ 1 file changed, 132 insertions(+) create mode 100644 tests/sdk/test_unix_time.py diff --git a/tests/sdk/test_unix_time.py b/tests/sdk/test_unix_time.py new file mode 100644 index 00000000..24ee7b50 --- /dev/null +++ b/tests/sdk/test_unix_time.py @@ -0,0 +1,132 @@ +"""Tests for src.unix_time module.""" + +from __future__ import annotations + +from datetime import datetime, timezone + +from src.unix_time import datetime_to_timestamp, timestamp_to_datetime + + +class TestTimestampToDatetime: + """Test timestamp_to_datetime function.""" + + def test_converts_epoch_zero(self) -> None: + """Test conversion of epoch 0 (1970-01-01 00:00:00 UTC).""" + result = timestamp_to_datetime(0) + expected = datetime(1970, 1, 1, 0, 0, 0, tzinfo=timezone.utc) + assert result == expected + + def test_converts_positive_timestamp(self) -> None: + """Test conversion of a positive timestamp.""" + # 2024-01-15 12:30:45 UTC + timestamp = 1705321845 + result = timestamp_to_datetime(timestamp) + expected = datetime(2024, 1, 15, 12, 30, 45, tzinfo=timezone.utc) + assert result == expected + + def test_converts_negative_timestamp(self) -> None: + """Test conversion of a negative timestamp (before epoch).""" + # 1969-12-31 23:59:59 UTC + timestamp = -1 + result = timestamp_to_datetime(timestamp) + expected = datetime(1969, 12, 31, 23, 59, 59, tzinfo=timezone.utc) + assert result == expected + + def test_result_is_utc_aware(self) -> None: + """Test that result has UTC timezone info.""" + result = timestamp_to_datetime(1705321845) + assert result.tzinfo is timezone.utc + assert result.utcoffset() == timezone.utc.utcoffset(None) + + def test_converts_leap_year_date(self) -> None: + """Test conversion on leap year Feb 29.""" + # 2024-02-29 00:00:00 UTC (leap year) + timestamp = 1709164800 + result = timestamp_to_datetime(timestamp) + expected = datetime(2024, 2, 29, 0, 0, 0, tzinfo=timezone.utc) + assert result == expected + + def test_converts_various_dates(self) -> None: + """Test conversion of various important dates.""" + test_cases = [ + (1672531200, datetime(2023, 1, 1, 0, 0, 0, tzinfo=timezone.utc)), + (1704067200, datetime(2024, 1, 1, 0, 0, 0, tzinfo=timezone.utc)), + (1735689600, datetime(2025, 1, 1, 0, 0, 0, tzinfo=timezone.utc)), + ] + for timestamp, expected in test_cases: + result = timestamp_to_datetime(timestamp) + assert result == expected + + +class TestDatetimeToTimestamp: + """Test datetime_to_timestamp function.""" + + def test_converts_epoch_zero(self) -> None: + """Test conversion of epoch datetime.""" + dt = datetime(1970, 1, 1, 0, 0, 0, tzinfo=timezone.utc) + result = datetime_to_timestamp(dt) + assert result == 0 + + def test_converts_aware_datetime(self) -> None: + """Test conversion of timezone-aware datetime.""" + dt = datetime(2024, 1, 15, 12, 30, 45, tzinfo=timezone.utc) + result = datetime_to_timestamp(dt) + assert result == 1705321845 + + def test_converts_naive_datetime_as_utc(self) -> None: + """Test conversion of naive datetime (treated as UTC).""" + dt = datetime(2024, 1, 15, 12, 30, 45) + result = datetime_to_timestamp(dt) + assert result == 1705321845 + + def test_converts_leap_year_date(self) -> None: + """Test conversion on leap year Feb 29.""" + dt = datetime(2024, 2, 29, 0, 0, 0, tzinfo=timezone.utc) + result = datetime_to_timestamp(dt) + assert result == 1709164800 + + def test_converts_various_dates(self) -> None: + """Test conversion of various important dates.""" + test_cases = [ + (datetime(2023, 1, 1, 0, 0, 0, tzinfo=timezone.utc), 1672531200), + (datetime(2024, 1, 1, 0, 0, 0, tzinfo=timezone.utc), 1704067200), + (datetime(2025, 1, 1, 0, 0, 0, tzinfo=timezone.utc), 1735689600), + ] + for dt, expected in test_cases: + result = datetime_to_timestamp(dt) + assert result == expected + + +class TestRoundTrip: + """Test round-trip conversions between timestamp and datetime.""" + + def test_timestamp_to_datetime_to_timestamp(self) -> None: + """Test converting timestamp -> datetime -> timestamp preserves value.""" + original = 1705324245 + dt = timestamp_to_datetime(original) + result = datetime_to_timestamp(dt) + assert result == original + + def test_datetime_to_timestamp_to_datetime(self) -> None: + """Test converting datetime -> timestamp -> datetime preserves value.""" + original = datetime(2024, 1, 15, 12, 30, 45, tzinfo=timezone.utc) + timestamp = datetime_to_timestamp(original) + result = timestamp_to_datetime(timestamp) + assert result == original + + def test_roundtrip_multiple_values(self) -> None: + """Test round-trip conversion for multiple timestamps.""" + timestamps = [0, 1, 1000000, 1705321845, 1735689600, -1] + for original in timestamps: + dt = timestamp_to_datetime(original) + result = datetime_to_timestamp(dt) + assert result == original + + def test_roundtrip_naive_datetime_becomes_aware(self) -> None: + """Test naive datetime becomes aware after round-trip.""" + naive_dt = datetime(2024, 1, 15, 12, 30, 45) + timestamp = datetime_to_timestamp(naive_dt) + result_dt = timestamp_to_datetime(timestamp) + assert result_dt.tzinfo is timezone.utc + # Values should be equal ignoring timezone + assert result_dt.replace(tzinfo=None) == naive_dt From c5adf2051786800934ef9b0df8eb969bfbb5bd34 Mon Sep 17 00:00:00 2001 From: cusma Date: Tue, 10 Mar 2026 16:52:20 +0100 Subject: [PATCH 016/244] test: day count --- tests/sdk/test_day_count.py | 426 ++++++++++++++++++++++++++++++++++++ 1 file changed, 426 insertions(+) create mode 100644 tests/sdk/test_day_count.py diff --git a/tests/sdk/test_day_count.py b/tests/sdk/test_day_count.py new file mode 100644 index 00000000..18a5c824 --- /dev/null +++ b/tests/sdk/test_day_count.py @@ -0,0 +1,426 @@ +"""Tests for src.calendar module.""" + +from __future__ import annotations + +from datetime import datetime, timezone + +from src.day_count import ( + BusinessDayConvention, + Calendar, + EndOfMonthConvention, + adjust_to_business_day, + is_business_day, + is_calculate_shift, + is_end_of_month, + is_shift_calculate, +) +from src.unix_time import datetime_to_timestamp + + +class TestCalendarEnum: + """Test Calendar enum.""" + + def test_has_no_calendar_value(self) -> None: + """Test NO_CALENDAR constant exists.""" + assert Calendar.NO_CALENDAR is not None + assert Calendar.NC == Calendar.NO_CALENDAR + + def test_has_monday_to_friday_value(self) -> None: + """Test MONDAY_TO_FRIDAY constant exists.""" + assert Calendar.MONDAY_TO_FRIDAY is not None + assert Calendar.MF == Calendar.MONDAY_TO_FRIDAY + + def test_enum_values_are_integers(self) -> None: + """Test Calendar enum values are integers.""" + assert isinstance(Calendar.NO_CALENDAR, int) + assert isinstance(Calendar.MONDAY_TO_FRIDAY, int) + + +class TestEndOfMonthConventionEnum: + """Test EndOfMonthConvention enum.""" + + def test_has_same_day_value(self) -> None: + """Test SAME_DAY constant exists.""" + assert EndOfMonthConvention.SAME_DAY is not None + assert EndOfMonthConvention.SD == EndOfMonthConvention.SAME_DAY + + def test_has_end_of_month_value(self) -> None: + """Test END_OF_MONTH constant exists.""" + assert EndOfMonthConvention.END_OF_MONTH is not None + assert EndOfMonthConvention.EOM == EndOfMonthConvention.END_OF_MONTH + + def test_enum_values_are_integers(self) -> None: + """Test EndOfMonthConvention enum values are integers.""" + assert isinstance(EndOfMonthConvention.SAME_DAY, int) + assert isinstance(EndOfMonthConvention.END_OF_MONTH, int) + + +class TestBusinessDayConventionEnum: + """Test BusinessDayConvention enum.""" + + def test_has_no_shift_value(self) -> None: + """Test NO_SHIFT constant exists.""" + assert BusinessDayConvention.NO_SHIFT is not None + assert BusinessDayConvention.NOS == BusinessDayConvention.NO_SHIFT + + def test_has_all_conventions(self) -> None: + """Test all business day conventions exist.""" + expected = [ + "NO_SHIFT", + "SHIFT_CALCULATE_FOLLOWING", + "SHIFT_CALCULATE_MODIFIED_FOLLOWING", + "CALCULATE_SHIFT_FOLLOWING", + "CALCULATE_SHIFT_MODIFIED_FOLLOWING", + "SHIFT_CALCULATE_PRECEDING", + "SHIFT_CALCULATE_MODIFIED_PRECEDING", + "CALCULATE_SHIFT_PRECEDING", + "CALCULATE_SHIFT_MODIFIED_PRECEDING", + ] + for name in expected: + assert hasattr(BusinessDayConvention, name) + + def test_aliases_match_full_names(self) -> None: + """Test that aliases match full names.""" + aliases = { + "NOS": "NO_SHIFT", + "SCF": "SHIFT_CALCULATE_FOLLOWING", + "SCMF": "SHIFT_CALCULATE_MODIFIED_FOLLOWING", + "CSF": "CALCULATE_SHIFT_FOLLOWING", + "CSMF": "CALCULATE_SHIFT_MODIFIED_FOLLOWING", + "SCP": "SHIFT_CALCULATE_PRECEDING", + "SCMP": "SHIFT_CALCULATE_MODIFIED_PRECEDING", + "CSP": "CALCULATE_SHIFT_PRECEDING", + "CSMP": "CALCULATE_SHIFT_MODIFIED_PRECEDING", + } + for alias, full_name in aliases.items(): + assert getattr(BusinessDayConvention, alias) == getattr( + BusinessDayConvention, full_name + ) + + +class TestIsEndOfMonth: + """Test is_end_of_month function.""" + + def test_recognizes_january_31(self) -> None: + """Test January 31 is end of month.""" + dt = datetime(2024, 1, 31, 12, 0, 0) + assert is_end_of_month(dt) is True + + def test_recognizes_february_29_leap_year(self) -> None: + """Test Feb 29 is end of month in leap year.""" + dt = datetime(2024, 2, 29, 12, 0, 0) + assert is_end_of_month(dt) is True + + def test_recognizes_february_28_non_leap_year(self) -> None: + """Test Feb 28 is end of month in non-leap year.""" + dt = datetime(2023, 2, 28, 12, 0, 0) + assert is_end_of_month(dt) is True + + def test_february_28_not_end_in_leap_year(self) -> None: + """Test Feb 28 is NOT end of month in leap year.""" + dt = datetime(2024, 2, 28, 12, 0, 0) + assert is_end_of_month(dt) is False + + def test_recognizes_april_30(self) -> None: + """Test April 30 is end of month (30-day month).""" + dt = datetime(2024, 4, 30, 12, 0, 0) + assert is_end_of_month(dt) is True + + def test_april_29_not_end_of_month(self) -> None: + """Test April 29 is not end of month.""" + dt = datetime(2024, 4, 29, 12, 0, 0) + assert is_end_of_month(dt) is False + + def test_recognizes_december_31(self) -> None: + """Test December 31 is end of month.""" + dt = datetime(2024, 12, 31, 12, 0, 0) + assert is_end_of_month(dt) is True + + def test_january_15_not_end_of_month(self) -> None: + """Test mid-month date is not end of month.""" + dt = datetime(2024, 1, 15, 12, 0, 0) + assert is_end_of_month(dt) is False + + def test_all_months_last_days(self) -> None: + """Test last day detection for all months.""" + # 2024 is a leap year + month_last_days = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] + for month, last_day in enumerate(month_last_days, start=1): + dt = datetime(2024, month, last_day, 12, 0, 0) + assert is_end_of_month(dt) is True, f"Failed for month {month}" + + +class TestIsBusinessDay: + """Test is_business_day function.""" + + def test_no_calendar_all_days_are_business_days(self) -> None: + """Test with NO_CALENDAR, all days are business days.""" + # Monday 2024-01-15 + monday = datetime_to_timestamp( + datetime(2024, 1, 15, 12, 0, 0, tzinfo=timezone.utc) + ) + # Saturday 2024-01-20 + saturday = datetime_to_timestamp( + datetime(2024, 1, 20, 12, 0, 0, tzinfo=timezone.utc) + ) + # Sunday 2024-01-21 + sunday = datetime_to_timestamp( + datetime(2024, 1, 21, 12, 0, 0, tzinfo=timezone.utc) + ) + + assert is_business_day(monday, Calendar.NO_CALENDAR) is True + assert is_business_day(saturday, Calendar.NO_CALENDAR) is True + assert is_business_day(sunday, Calendar.NO_CALENDAR) is True + + def test_monday_to_friday_weekdays_are_business_days(self) -> None: + """Test with MONDAY_TO_FRIDAY, weekdays are business days.""" + # Week of 2024-01-15 (Monday) to 2024-01-19 (Friday) + for day in range(15, 20): + timestamp = datetime_to_timestamp( + datetime(2024, 1, day, 12, 0, 0, tzinfo=timezone.utc) + ) + assert is_business_day(timestamp, Calendar.MONDAY_TO_FRIDAY) is True + + def test_monday_to_friday_weekends_are_not_business_days(self) -> None: + """Test with MONDAY_TO_FRIDAY, weekends are not business days.""" + # Saturday 2024-01-20 + saturday = datetime_to_timestamp( + datetime(2024, 1, 20, 12, 0, 0, tzinfo=timezone.utc) + ) + # Sunday 2024-01-21 + sunday = datetime_to_timestamp( + datetime(2024, 1, 21, 12, 0, 0, tzinfo=timezone.utc) + ) + + assert is_business_day(saturday, Calendar.MONDAY_TO_FRIDAY) is False + assert is_business_day(sunday, Calendar.MONDAY_TO_FRIDAY) is False + + def test_default_calendar_is_no_calendar(self) -> None: + """Test default calendar parameter is NO_CALENDAR.""" + saturday = datetime_to_timestamp( + datetime(2024, 1, 20, 12, 0, 0, tzinfo=timezone.utc) + ) + assert is_business_day(saturday) is True + + +class TestAdjustToBusinessDay: + """Test adjust_to_business_day function.""" + + def test_no_shift_returns_original(self) -> None: + """Test NO_SHIFT returns timestamp unchanged.""" + # Saturday 2024-01-20 + saturday = datetime_to_timestamp( + datetime(2024, 1, 20, 12, 0, 0, tzinfo=timezone.utc) + ) + result = adjust_to_business_day( + saturday, + business_day_convention=BusinessDayConvention.NO_SHIFT, + calendar=Calendar.MONDAY_TO_FRIDAY, + ) + assert result == saturday + + def test_business_day_unchanged(self) -> None: + """Test business day returns unchanged for any convention.""" + # Monday 2024-01-15 + monday = datetime_to_timestamp( + datetime(2024, 1, 15, 12, 0, 0, tzinfo=timezone.utc) + ) + conventions = [ + BusinessDayConvention.SHIFT_CALCULATE_FOLLOWING, + BusinessDayConvention.SHIFT_CALCULATE_PRECEDING, + BusinessDayConvention.CALCULATE_SHIFT_FOLLOWING, + BusinessDayConvention.CALCULATE_SHIFT_PRECEDING, + ] + for convention in conventions: + result = adjust_to_business_day( + monday, + business_day_convention=convention, + calendar=Calendar.MONDAY_TO_FRIDAY, + ) + assert result == monday + + def test_shift_calculate_following_shifts_forward(self) -> None: + """Test SCF shifts Saturday to next Monday.""" + # Saturday 2024-01-20 + saturday = datetime_to_timestamp( + datetime(2024, 1, 20, 12, 0, 0, tzinfo=timezone.utc) + ) + # Expected: Monday 2024-01-22 + expected_monday = datetime_to_timestamp( + datetime(2024, 1, 22, 12, 0, 0, tzinfo=timezone.utc) + ) + + result = adjust_to_business_day( + saturday, + business_day_convention=BusinessDayConvention.SHIFT_CALCULATE_FOLLOWING, + calendar=Calendar.MONDAY_TO_FRIDAY, + ) + assert result == expected_monday + + def test_calculate_shift_following_shifts_forward(self) -> None: + """Test CSF shifts Saturday to next Monday.""" + # Saturday 2024-01-20 + saturday = datetime_to_timestamp( + datetime(2024, 1, 20, 12, 0, 0, tzinfo=timezone.utc) + ) + # Expected: Monday 2024-01-22 + expected_monday = datetime_to_timestamp( + datetime(2024, 1, 22, 12, 0, 0, tzinfo=timezone.utc) + ) + + result = adjust_to_business_day( + saturday, + business_day_convention=BusinessDayConvention.CALCULATE_SHIFT_FOLLOWING, + calendar=Calendar.MONDAY_TO_FRIDAY, + ) + assert result == expected_monday + + def test_shift_calculate_preceding_shifts_backward(self) -> None: + """Test SCP shifts Saturday to previous Friday.""" + # Saturday 2024-01-20 + saturday = datetime_to_timestamp( + datetime(2024, 1, 20, 12, 0, 0, tzinfo=timezone.utc) + ) + # Expected: Friday 2024-01-19 + expected_friday = datetime_to_timestamp( + datetime(2024, 1, 19, 12, 0, 0, tzinfo=timezone.utc) + ) + + result = adjust_to_business_day( + saturday, + business_day_convention=BusinessDayConvention.SHIFT_CALCULATE_PRECEDING, + calendar=Calendar.MONDAY_TO_FRIDAY, + ) + assert result == expected_friday + + def test_calculate_shift_preceding_shifts_backward(self) -> None: + """Test CSP shifts Saturday to previous Friday.""" + # Saturday 2024-01-20 + saturday = datetime_to_timestamp( + datetime(2024, 1, 20, 12, 0, 0, tzinfo=timezone.utc) + ) + # Expected: Friday 2024-01-19 + expected_friday = datetime_to_timestamp( + datetime(2024, 1, 19, 12, 0, 0, tzinfo=timezone.utc) + ) + + result = adjust_to_business_day( + saturday, + business_day_convention=BusinessDayConvention.CALCULATE_SHIFT_PRECEDING, + calendar=Calendar.MONDAY_TO_FRIDAY, + ) + assert result == expected_friday + + def test_modified_following_shifts_back_if_next_month(self) -> None: + """Test SCMF shifts back to preceding if following goes to next month.""" + # Saturday 2024-01-27 (last Saturday of January) + saturday = datetime_to_timestamp( + datetime(2024, 1, 27, 12, 0, 0, tzinfo=timezone.utc) + ) + # Following would be Monday 2024-01-29 (same month, so should follow) + expected = datetime_to_timestamp( + datetime(2024, 1, 29, 12, 0, 0, tzinfo=timezone.utc) + ) + + result = adjust_to_business_day( + saturday, + business_day_convention=BusinessDayConvention.SHIFT_CALCULATE_MODIFIED_FOLLOWING, + calendar=Calendar.MONDAY_TO_FRIDAY, + ) + assert result == expected + + # Sunday 2024-03-31 (last day of March) + # Following would be Monday 2024-04-01 (next month) + # Should shift back to Friday 2024-03-29 + sunday = datetime_to_timestamp( + datetime(2024, 3, 31, 12, 0, 0, tzinfo=timezone.utc) + ) + expected_friday = datetime_to_timestamp( + datetime(2024, 3, 29, 12, 0, 0, tzinfo=timezone.utc) + ) + + result = adjust_to_business_day( + sunday, + business_day_convention=BusinessDayConvention.SHIFT_CALCULATE_MODIFIED_FOLLOWING, + calendar=Calendar.MONDAY_TO_FRIDAY, + ) + assert result == expected_friday + + def test_modified_preceding_shifts_forward_if_previous_month(self) -> None: + """Test SCMP shifts forward to following if preceding goes to previous month.""" + # Sunday 2024-09-01 (first day of September) + # Preceding would be Friday 2024-08-30 (previous month) + # Should shift forward to Monday 2024-09-02 + sunday = datetime_to_timestamp( + datetime(2024, 9, 1, 12, 0, 0, tzinfo=timezone.utc) + ) + expected_monday = datetime_to_timestamp( + datetime(2024, 9, 2, 12, 0, 0, tzinfo=timezone.utc) + ) + + result = adjust_to_business_day( + sunday, + business_day_convention=BusinessDayConvention.SHIFT_CALCULATE_MODIFIED_PRECEDING, + calendar=Calendar.MONDAY_TO_FRIDAY, + ) + assert result == expected_monday + + +class TestIsCalculateShift: + """Test is_calculate_shift function.""" + + def test_returns_true_for_calculate_shift_conventions(self) -> None: + """Test returns True for all CS* conventions.""" + cs_conventions = [ + BusinessDayConvention.CALCULATE_SHIFT_FOLLOWING, + BusinessDayConvention.CALCULATE_SHIFT_MODIFIED_FOLLOWING, + BusinessDayConvention.CALCULATE_SHIFT_PRECEDING, + BusinessDayConvention.CALCULATE_SHIFT_MODIFIED_PRECEDING, + ] + for convention in cs_conventions: + assert is_calculate_shift(convention) is True + + def test_returns_false_for_shift_calculate_conventions(self) -> None: + """Test returns False for all SC* conventions.""" + sc_conventions = [ + BusinessDayConvention.SHIFT_CALCULATE_FOLLOWING, + BusinessDayConvention.SHIFT_CALCULATE_MODIFIED_FOLLOWING, + BusinessDayConvention.SHIFT_CALCULATE_PRECEDING, + BusinessDayConvention.SHIFT_CALCULATE_MODIFIED_PRECEDING, + ] + for convention in sc_conventions: + assert is_calculate_shift(convention) is False + + def test_returns_false_for_no_shift(self) -> None: + """Test returns False for NO_SHIFT.""" + assert is_calculate_shift(BusinessDayConvention.NO_SHIFT) is False + + +class TestIsShiftCalculate: + """Test is_shift_calculate function.""" + + def test_returns_true_for_shift_calculate_conventions(self) -> None: + """Test returns True for all SC* conventions.""" + sc_conventions = [ + BusinessDayConvention.SHIFT_CALCULATE_FOLLOWING, + BusinessDayConvention.SHIFT_CALCULATE_MODIFIED_FOLLOWING, + BusinessDayConvention.SHIFT_CALCULATE_PRECEDING, + BusinessDayConvention.SHIFT_CALCULATE_MODIFIED_PRECEDING, + ] + for convention in sc_conventions: + assert is_shift_calculate(convention) is True + + def test_returns_false_for_calculate_shift_conventions(self) -> None: + """Test returns False for all CS* conventions.""" + cs_conventions = [ + BusinessDayConvention.CALCULATE_SHIFT_FOLLOWING, + BusinessDayConvention.CALCULATE_SHIFT_MODIFIED_FOLLOWING, + BusinessDayConvention.CALCULATE_SHIFT_PRECEDING, + BusinessDayConvention.CALCULATE_SHIFT_MODIFIED_PRECEDING, + ] + for convention in cs_conventions: + assert is_shift_calculate(convention) is False + + def test_returns_false_for_no_shift(self) -> None: + """Test returns False for NO_SHIFT.""" + assert is_shift_calculate(BusinessDayConvention.NO_SHIFT) is False From 991126edb59a0608a17ffbe3b5c9e34542dbaf7d Mon Sep 17 00:00:00 2001 From: cusma Date: Tue, 10 Mar 2026 16:52:29 +0100 Subject: [PATCH 017/244] test: actus schedule --- tests/sdk/test_schedule.py | 656 +++++++++++++++++++++++++++++++++++++ 1 file changed, 656 insertions(+) create mode 100644 tests/sdk/test_schedule.py diff --git a/tests/sdk/test_schedule.py b/tests/sdk/test_schedule.py new file mode 100644 index 00000000..41f86c74 --- /dev/null +++ b/tests/sdk/test_schedule.py @@ -0,0 +1,656 @@ +"""Tests for src.schedule module.""" + +from __future__ import annotations + +from datetime import datetime, timezone + +import pytest + +from src.day_count import ( + BusinessDayConvention, + Calendar, + EndOfMonthConvention, +) +from src.errors import UnsupportedActusFeatureError +from src.schedule import ( + Cycle, + add_cycle, + generate_array_schedule, + generate_schedule, + resolve_array_schedule, + resolve_cycle_schedule, +) +from src.unix_time import datetime_to_timestamp + + +class TestCycle: + """Test Cycle dataclass.""" + + def test_create_cycle_with_defaults(self) -> None: + """Test creating Cycle with default stub.""" + cycle = Cycle(count=3, unit="M") + assert cycle.count == 3 + assert cycle.unit == "M" + assert cycle.stub == "" + + def test_create_cycle_with_stub(self) -> None: + """Test creating Cycle with stub marker.""" + cycle = Cycle(count=1, unit="Q", stub="+") + assert cycle.count == 1 + assert cycle.unit == "Q" + assert cycle.stub == "+" + + +class TestCycleParseCycle: + """Test Cycle.parse_cycle class method.""" + + def test_parse_simple_day_cycle(self) -> None: + """Test parsing day cycle.""" + cycle = Cycle.parse_cycle("90D") + assert cycle.count == 90 + assert cycle.unit == "D" + assert cycle.stub == "" + + def test_parse_simple_week_cycle(self) -> None: + """Test parsing week cycle.""" + cycle = Cycle.parse_cycle("12W") + assert cycle.count == 12 + assert cycle.unit == "W" + assert cycle.stub == "" + + def test_parse_simple_month_cycle(self) -> None: + """Test parsing month cycle.""" + cycle = Cycle.parse_cycle("3M") + assert cycle.count == 3 + assert cycle.unit == "M" + assert cycle.stub == "" + + def test_parse_simple_quarter_cycle(self) -> None: + """Test parsing quarter cycle.""" + cycle = Cycle.parse_cycle("1Q") + assert cycle.count == 1 + assert cycle.unit == "Q" + assert cycle.stub == "" + + def test_parse_simple_half_year_cycle(self) -> None: + """Test parsing half-year cycle.""" + cycle = Cycle.parse_cycle("1H") + assert cycle.count == 1 + assert cycle.unit == "H" + assert cycle.stub == "" + + def test_parse_simple_year_cycle(self) -> None: + """Test parsing year cycle.""" + cycle = Cycle.parse_cycle("2Y") + assert cycle.count == 2 + assert cycle.unit == "Y" + assert cycle.stub == "" + + def test_parse_cycle_with_long_stub(self) -> None: + """Test parsing cycle with long stub marker.""" + cycle = Cycle.parse_cycle("3M+") + assert cycle.count == 3 + assert cycle.unit == "M" + assert cycle.stub == "+" + + def test_parse_cycle_with_short_stub(self) -> None: + """Test parsing cycle with short stub marker.""" + cycle = Cycle.parse_cycle("1Q-") + assert cycle.count == 1 + assert cycle.unit == "Q" + assert cycle.stub == "-" + + def test_parse_cycle_case_insensitive(self) -> None: + """Test parsing is case-insensitive.""" + cycle = Cycle.parse_cycle("3m") + assert cycle.count == 3 + assert cycle.unit == "M" + + def test_parse_cycle_strips_whitespace(self) -> None: + """Test parsing strips whitespace.""" + cycle = Cycle.parse_cycle(" 3M ") + assert cycle.count == 3 + assert cycle.unit == "M" + + def test_parse_multi_digit_count(self) -> None: + """Test parsing cycles with multi-digit counts.""" + cycle = Cycle.parse_cycle("365D") + assert cycle.count == 365 + assert cycle.unit == "D" + + def test_parse_invalid_format_raises_error(self) -> None: + """Test parsing invalid format raises ValueError.""" + with pytest.raises(ValueError, match="Unsupported ACTUS cycle"): + Cycle.parse_cycle("M") # Missing count + + with pytest.raises(ValueError, match="Unsupported ACTUS cycle"): + Cycle.parse_cycle("XYZ") + + def test_parse_invalid_unit_raises_error(self) -> None: + """Test parsing invalid unit raises ValueError.""" + with pytest.raises(ValueError, match="Invalid cycle unit"): + Cycle.parse_cycle("3X") + + +class TestAddCycle: + """Test add_cycle function.""" + + def test_add_day_cycle(self) -> None: + """Test adding day cycles.""" + start = datetime_to_timestamp( + datetime(2024, 1, 15, 0, 0, 0, tzinfo=timezone.utc) + ) + result = add_cycle(start, "30D") + expected = datetime_to_timestamp( + datetime(2024, 2, 14, 0, 0, 0, tzinfo=timezone.utc) + ) + assert result == expected + + def test_add_week_cycle(self) -> None: + """Test adding week cycles.""" + start = datetime_to_timestamp( + datetime(2024, 1, 15, 0, 0, 0, tzinfo=timezone.utc) + ) + result = add_cycle(start, "2W") + expected = datetime_to_timestamp( + datetime(2024, 1, 29, 0, 0, 0, tzinfo=timezone.utc) + ) + assert result == expected + + def test_add_month_cycle(self) -> None: + """Test adding month cycles.""" + start = datetime_to_timestamp( + datetime(2024, 1, 15, 0, 0, 0, tzinfo=timezone.utc) + ) + result = add_cycle(start, "1M") + expected = datetime_to_timestamp( + datetime(2024, 2, 15, 0, 0, 0, tzinfo=timezone.utc) + ) + assert result == expected + + def test_add_quarter_cycle(self) -> None: + """Test adding quarter cycles.""" + start = datetime_to_timestamp( + datetime(2024, 1, 15, 0, 0, 0, tzinfo=timezone.utc) + ) + result = add_cycle(start, "1Q") + expected = datetime_to_timestamp( + datetime(2024, 4, 15, 0, 0, 0, tzinfo=timezone.utc) + ) + assert result == expected + + def test_add_half_year_cycle(self) -> None: + """Test adding half-year cycles.""" + start = datetime_to_timestamp( + datetime(2024, 1, 15, 0, 0, 0, tzinfo=timezone.utc) + ) + result = add_cycle(start, "1H") + expected = datetime_to_timestamp( + datetime(2024, 7, 15, 0, 0, 0, tzinfo=timezone.utc) + ) + assert result == expected + + def test_add_year_cycle(self) -> None: + """Test adding year cycles.""" + start = datetime_to_timestamp( + datetime(2024, 1, 15, 0, 0, 0, tzinfo=timezone.utc) + ) + result = add_cycle(start, "1Y") + expected = datetime_to_timestamp( + datetime(2025, 1, 15, 0, 0, 0, tzinfo=timezone.utc) + ) + assert result == expected + + def test_add_month_cycle_with_same_day_convention(self) -> None: + """Test adding month cycle with SAME_DAY convention.""" + # Jan 31 + 1M = Feb 29 (capped to last day of Feb in leap year) + start = datetime_to_timestamp( + datetime(2024, 1, 31, 0, 0, 0, tzinfo=timezone.utc) + ) + result = add_cycle( + start, "1M", end_of_month_convention=EndOfMonthConvention.SAME_DAY + ) + expected = datetime_to_timestamp( + datetime(2024, 2, 29, 0, 0, 0, tzinfo=timezone.utc) + ) + assert result == expected + + def test_add_month_cycle_with_eom_convention(self) -> None: + """Test adding month cycle with END_OF_MONTH convention.""" + # Jan 31 (end of month) + 1M = Feb 29 (end of month in leap year) + start = datetime_to_timestamp( + datetime(2024, 1, 31, 0, 0, 0, tzinfo=timezone.utc) + ) + result = add_cycle( + start, "1M", end_of_month_convention=EndOfMonthConvention.END_OF_MONTH + ) + expected = datetime_to_timestamp( + datetime(2024, 2, 29, 0, 0, 0, tzinfo=timezone.utc) + ) + assert result == expected + + def test_add_cycle_with_anchor_and_occurrence(self) -> None: + """Test adding cycle with anchor and occurrence index.""" + anchor = datetime_to_timestamp( + datetime(2024, 1, 15, 0, 0, 0, tzinfo=timezone.utc) + ) + result = add_cycle( + anchor, + "1M", + anchor_timestamp=anchor, + occurrence_index=3, + ) + expected = datetime_to_timestamp( + datetime(2024, 4, 15, 0, 0, 0, tzinfo=timezone.utc) + ) + assert result == expected + + def test_add_month_cycle_handles_short_months(self) -> None: + """Test month cycle handles months with different days.""" + # Jan 31 + 3M = Apr 30 (April has only 30 days) + start = datetime_to_timestamp( + datetime(2024, 1, 31, 0, 0, 0, tzinfo=timezone.utc) + ) + result = add_cycle( + start, "3M", end_of_month_convention=EndOfMonthConvention.SAME_DAY + ) + expected = datetime_to_timestamp( + datetime(2024, 4, 30, 0, 0, 0, tzinfo=timezone.utc) + ) + assert result == expected + + def test_add_cycle_leap_year_february(self) -> None: + """Test adding cycles around leap year February.""" + # Feb 29 2024 (leap year) + 1Y = Feb 28 2025 (non-leap year) + start = datetime_to_timestamp( + datetime(2024, 2, 29, 0, 0, 0, tzinfo=timezone.utc) + ) + result = add_cycle( + start, "1Y", end_of_month_convention=EndOfMonthConvention.SAME_DAY + ) + expected = datetime_to_timestamp( + datetime(2025, 2, 28, 0, 0, 0, tzinfo=timezone.utc) + ) + assert result == expected + + +class TestGenerateSchedule: + """Test generate_schedule function.""" + + def test_generate_monthly_schedule(self) -> None: + """Test generating monthly schedule.""" + start = datetime_to_timestamp( + datetime(2024, 1, 15, 0, 0, 0, tzinfo=timezone.utc) + ) + end = datetime_to_timestamp(datetime(2024, 4, 15, 0, 0, 0, tzinfo=timezone.utc)) + + schedule = generate_schedule(start, "1M", end) + + expected = ( + datetime_to_timestamp(datetime(2024, 1, 15, 0, 0, 0, tzinfo=timezone.utc)), + datetime_to_timestamp(datetime(2024, 2, 15, 0, 0, 0, tzinfo=timezone.utc)), + datetime_to_timestamp(datetime(2024, 3, 15, 0, 0, 0, tzinfo=timezone.utc)), + datetime_to_timestamp(datetime(2024, 4, 15, 0, 0, 0, tzinfo=timezone.utc)), + ) + assert schedule == expected + + def test_generate_quarterly_schedule(self) -> None: + """Test generating quarterly schedule.""" + start = datetime_to_timestamp( + datetime(2024, 1, 1, 0, 0, 0, tzinfo=timezone.utc) + ) + end = datetime_to_timestamp( + datetime(2024, 12, 31, 0, 0, 0, tzinfo=timezone.utc) + ) + + schedule = generate_schedule(start, "1Q", end) + + expected = ( + datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=timezone.utc)), + datetime_to_timestamp(datetime(2024, 4, 1, 0, 0, 0, tzinfo=timezone.utc)), + datetime_to_timestamp(datetime(2024, 7, 1, 0, 0, 0, tzinfo=timezone.utc)), + datetime_to_timestamp(datetime(2024, 10, 1, 0, 0, 0, tzinfo=timezone.utc)), + ) + assert schedule == expected + + def test_generate_daily_schedule(self) -> None: + """Test generating daily schedule.""" + start = datetime_to_timestamp( + datetime(2024, 1, 1, 0, 0, 0, tzinfo=timezone.utc) + ) + end = datetime_to_timestamp(datetime(2024, 1, 5, 0, 0, 0, tzinfo=timezone.utc)) + + schedule = generate_schedule(start, "1D", end) + + assert len(schedule) == 5 + assert schedule[0] == start + assert schedule[-1] == end + + def test_generate_yearly_schedule(self) -> None: + """Test generating yearly schedule.""" + start = datetime_to_timestamp( + datetime(2024, 1, 1, 0, 0, 0, tzinfo=timezone.utc) + ) + end = datetime_to_timestamp(datetime(2027, 1, 1, 0, 0, 0, tzinfo=timezone.utc)) + + schedule = generate_schedule(start, "1Y", end) + + expected = ( + datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=timezone.utc)), + datetime_to_timestamp(datetime(2025, 1, 1, 0, 0, 0, tzinfo=timezone.utc)), + datetime_to_timestamp(datetime(2026, 1, 1, 0, 0, 0, tzinfo=timezone.utc)), + datetime_to_timestamp(datetime(2027, 1, 1, 0, 0, 0, tzinfo=timezone.utc)), + ) + assert schedule == expected + + def test_generate_schedule_stops_at_end(self) -> None: + """Test schedule generation stops at end date.""" + start = datetime_to_timestamp( + datetime(2024, 1, 1, 0, 0, 0, tzinfo=timezone.utc) + ) + end = datetime_to_timestamp(datetime(2024, 3, 15, 0, 0, 0, tzinfo=timezone.utc)) + + schedule = generate_schedule(start, "1M", end) + + # Should have Jan 1, Feb 1, Mar 1 but not Apr 1 + assert len(schedule) == 3 + assert schedule[-1] < end + + def test_generate_schedule_includes_end_if_exact_match(self) -> None: + """Test schedule includes end if it matches exactly.""" + start = datetime_to_timestamp( + datetime(2024, 1, 1, 0, 0, 0, tzinfo=timezone.utc) + ) + end = datetime_to_timestamp(datetime(2024, 4, 1, 0, 0, 0, tzinfo=timezone.utc)) + + schedule = generate_schedule(start, "1M", end) + + assert schedule[-1] == end + + def test_generate_schedule_with_eom_convention(self) -> None: + """Test schedule generation with END_OF_MONTH convention.""" + # Jan 31 (end of month) + start = datetime_to_timestamp( + datetime(2024, 1, 31, 0, 0, 0, tzinfo=timezone.utc) + ) + end = datetime_to_timestamp(datetime(2024, 5, 1, 0, 0, 0, tzinfo=timezone.utc)) + + schedule = generate_schedule( + start, + "1M", + end, + end_of_month_convention=EndOfMonthConvention.END_OF_MONTH, + ) + + # Should generate: Jan 31, Feb 29, Mar 31, Apr 30 + expected = ( + datetime_to_timestamp(datetime(2024, 1, 31, 0, 0, 0, tzinfo=timezone.utc)), + datetime_to_timestamp(datetime(2024, 2, 29, 0, 0, 0, tzinfo=timezone.utc)), + datetime_to_timestamp(datetime(2024, 3, 31, 0, 0, 0, tzinfo=timezone.utc)), + datetime_to_timestamp(datetime(2024, 4, 30, 0, 0, 0, tzinfo=timezone.utc)), + ) + assert schedule == expected + + def test_generate_schedule_empty_if_start_after_end(self) -> None: + """Test empty schedule if start > end.""" + start = datetime_to_timestamp( + datetime(2024, 12, 31, 0, 0, 0, tzinfo=timezone.utc) + ) + end = datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=timezone.utc)) + + schedule = generate_schedule(start, "1M", end) + + assert schedule == () + + def test_generate_schedule_empty_if_start_zero_or_negative(self) -> None: + """Test empty schedule if start <= 0.""" + end = datetime_to_timestamp( + datetime(2024, 12, 31, 0, 0, 0, tzinfo=timezone.utc) + ) + + assert generate_schedule(0, "1M", end) == () + assert generate_schedule(-1, "1M", end) == () + + def test_generate_schedule_empty_if_end_zero_or_negative(self) -> None: + """Test empty schedule if end <= 0.""" + start = datetime_to_timestamp( + datetime(2024, 1, 1, 0, 0, 0, tzinfo=timezone.utc) + ) + + assert generate_schedule(start, "1M", 0) == () + assert generate_schedule(start, "1M", -1) == () + + +class TestGenerateArraySchedule: + """Test generate_array_schedule function.""" + + def test_generate_single_segment_schedule(self) -> None: + """Test array schedule with single anchor/cycle.""" + anchors = [ + datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=timezone.utc)) + ] + cycles = ["1M"] + end = datetime_to_timestamp(datetime(2024, 4, 1, 0, 0, 0, tzinfo=timezone.utc)) + + schedule = generate_array_schedule(anchors, cycles, end) + + expected = ( + datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=timezone.utc)), + datetime_to_timestamp(datetime(2024, 2, 1, 0, 0, 0, tzinfo=timezone.utc)), + datetime_to_timestamp(datetime(2024, 3, 1, 0, 0, 0, tzinfo=timezone.utc)), + datetime_to_timestamp(datetime(2024, 4, 1, 0, 0, 0, tzinfo=timezone.utc)), + ) + assert schedule == expected + + def test_generate_multi_segment_schedule(self) -> None: + """Test array schedule with multiple anchor/cycle pairs.""" + anchors = [ + datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=timezone.utc)), + datetime_to_timestamp(datetime(2024, 4, 1, 0, 0, 0, tzinfo=timezone.utc)), + ] + cycles = ["1M", "3M"] + end = datetime_to_timestamp( + datetime(2024, 12, 31, 0, 0, 0, tzinfo=timezone.utc) + ) + + schedule = generate_array_schedule(anchors, cycles, end) + + # First segment: monthly Jan 1, Feb 1, Mar 1 (stops before Apr 1) + # Second segment: quarterly Apr 1, Jul 1, Oct 1 + # Plus end date Dec 31 + expected_dates = [ + datetime(2024, 1, 1, 0, 0, 0, tzinfo=timezone.utc), + datetime(2024, 2, 1, 0, 0, 0, tzinfo=timezone.utc), + datetime(2024, 3, 1, 0, 0, 0, tzinfo=timezone.utc), + datetime(2024, 4, 1, 0, 0, 0, tzinfo=timezone.utc), + datetime(2024, 7, 1, 0, 0, 0, tzinfo=timezone.utc), + datetime(2024, 10, 1, 0, 0, 0, tzinfo=timezone.utc), + datetime(2024, 12, 31, 0, 0, 0, tzinfo=timezone.utc), + ] + expected = tuple(datetime_to_timestamp(dt) for dt in expected_dates) + assert schedule == expected + + def test_generate_array_schedule_deduplicates(self) -> None: + """Test array schedule removes duplicates.""" + anchors = [ + datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=timezone.utc)), + datetime_to_timestamp(datetime(2024, 3, 1, 0, 0, 0, tzinfo=timezone.utc)), + ] + cycles = ["1M", "1M"] + end = datetime_to_timestamp(datetime(2024, 5, 1, 0, 0, 0, tzinfo=timezone.utc)) + + schedule = generate_array_schedule(anchors, cycles, end) + + # Should have unique dates: Jan 1, Feb 1, Mar 1, Apr 1, May 1 + assert len(schedule) == len(set(schedule)) + + def test_generate_array_schedule_sorts_dates(self) -> None: + """Test array schedule returns sorted dates.""" + anchors = [ + datetime_to_timestamp(datetime(2024, 3, 1, 0, 0, 0, tzinfo=timezone.utc)), + datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=timezone.utc)), + ] + cycles = ["1M", "1M"] + end = datetime_to_timestamp(datetime(2024, 5, 1, 0, 0, 0, tzinfo=timezone.utc)) + + schedule = generate_array_schedule(anchors, cycles, end) + + # Should be sorted + assert schedule == tuple(sorted(schedule)) + + def test_generate_array_schedule_includes_end(self) -> None: + """Test array schedule always includes end date.""" + anchors = [ + datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=timezone.utc)) + ] + cycles = ["1M"] + end = datetime_to_timestamp(datetime(2024, 3, 15, 0, 0, 0, tzinfo=timezone.utc)) + + schedule = generate_array_schedule(anchors, cycles, end) + + assert schedule[-1] == end + + def test_generate_array_schedule_empty_anchors(self) -> None: + """Test array schedule with empty anchors returns empty.""" + schedule = generate_array_schedule([], [], 1000000) + assert schedule == () + + def test_generate_array_schedule_raises_if_length_mismatch(self) -> None: + """Test array schedule raises if anchors and cycles have different lengths.""" + anchors = [ + datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=timezone.utc)), + datetime_to_timestamp(datetime(2024, 4, 1, 0, 0, 0, tzinfo=timezone.utc)), + ] + cycles = ["1M"] # Only one cycle for two anchors + end = datetime_to_timestamp( + datetime(2024, 12, 31, 0, 0, 0, tzinfo=timezone.utc) + ) + + with pytest.raises( + ValueError, match="anchors and cycles must have same length" + ): + generate_array_schedule(anchors, cycles, end) + + +class TestResolveCycleSchedule: + """Test resolve_cycle_schedule function.""" + + def test_resolve_cycle_schedule_no_adjustment(self) -> None: + """Test resolve_cycle_schedule with NO_SHIFT convention.""" + start = datetime_to_timestamp( + datetime(2024, 1, 1, 0, 0, 0, tzinfo=timezone.utc) + ) + end = datetime_to_timestamp(datetime(2024, 4, 1, 0, 0, 0, tzinfo=timezone.utc)) + + schedule = resolve_cycle_schedule( + start, + "1M", + end, + business_day_convention=BusinessDayConvention.NO_SHIFT, + calendar_name=Calendar.NO_CALENDAR, + ) + + expected = ( + datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=timezone.utc)), + datetime_to_timestamp(datetime(2024, 2, 1, 0, 0, 0, tzinfo=timezone.utc)), + datetime_to_timestamp(datetime(2024, 3, 1, 0, 0, 0, tzinfo=timezone.utc)), + datetime_to_timestamp(datetime(2024, 4, 1, 0, 0, 0, tzinfo=timezone.utc)), + ) + assert schedule == expected + + def test_resolve_cycle_schedule_raises_for_unsupported_bdc(self) -> None: + """Test raises error for unsupported business day convention.""" + start = datetime_to_timestamp( + datetime(2024, 1, 1, 0, 0, 0, tzinfo=timezone.utc) + ) + end = datetime_to_timestamp(datetime(2024, 4, 1, 0, 0, 0, tzinfo=timezone.utc)) + + with pytest.raises( + UnsupportedActusFeatureError, match="Business Day Convention" + ): + resolve_cycle_schedule( + start, + "1M", + end, + business_day_convention=BusinessDayConvention.SHIFT_CALCULATE_FOLLOWING, + calendar_name=Calendar.NO_CALENDAR, + ) + + def test_resolve_cycle_schedule_raises_for_unsupported_calendar(self) -> None: + """Test raises error for unsupported calendar.""" + start = datetime_to_timestamp( + datetime(2024, 1, 1, 0, 0, 0, tzinfo=timezone.utc) + ) + end = datetime_to_timestamp(datetime(2024, 4, 1, 0, 0, 0, tzinfo=timezone.utc)) + + with pytest.raises(UnsupportedActusFeatureError, match="Calendar"): + resolve_cycle_schedule( + start, + "1M", + end, + business_day_convention=BusinessDayConvention.NO_SHIFT, + calendar_name=Calendar.MONDAY_TO_FRIDAY, + ) + + +class TestResolveArraySchedule: + """Test resolve_array_schedule function.""" + + def test_resolve_array_schedule_no_adjustment(self) -> None: + """Test resolve_array_schedule with NO_SHIFT convention.""" + anchors = [ + datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=timezone.utc)), + datetime_to_timestamp(datetime(2024, 4, 1, 0, 0, 0, tzinfo=timezone.utc)), + ] + cycles = ["1M", "3M"] + end = datetime_to_timestamp( + datetime(2024, 12, 31, 0, 0, 0, tzinfo=timezone.utc) + ) + + schedule = resolve_array_schedule( + anchors, + cycles, + end, + business_day_convention=BusinessDayConvention.NO_SHIFT, + calendar_name=Calendar.NO_CALENDAR, + ) + + # Should have dates from both segments plus end + assert len(schedule) > 0 + assert schedule[-1] == end + + def test_resolve_array_schedule_raises_for_unsupported_bdc(self) -> None: + """Test raises error for unsupported business day convention.""" + anchors = [ + datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=timezone.utc)) + ] + cycles = ["1M"] + end = datetime_to_timestamp(datetime(2024, 4, 1, 0, 0, 0, tzinfo=timezone.utc)) + + with pytest.raises( + UnsupportedActusFeatureError, match="Business Day Convention" + ): + resolve_array_schedule( + anchors, + cycles, + end, + business_day_convention=BusinessDayConvention.SHIFT_CALCULATE_FOLLOWING, + calendar_name=Calendar.NO_CALENDAR, + ) + + def test_resolve_array_schedule_raises_for_unsupported_calendar(self) -> None: + """Test raises error for unsupported calendar.""" + anchors = [ + datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=timezone.utc)) + ] + cycles = ["1M"] + end = datetime_to_timestamp(datetime(2024, 4, 1, 0, 0, 0, tzinfo=timezone.utc)) + + with pytest.raises(UnsupportedActusFeatureError, match="Calendar"): + resolve_array_schedule( + anchors, + cycles, + end, + business_day_convention=BusinessDayConvention.NO_SHIFT, + calendar_name=Calendar.MONDAY_TO_FRIDAY, + ) From 2420479895175ec424ceac8ee53971fb03042fcb Mon Sep 17 00:00:00 2001 From: cusma Date: Tue, 10 Mar 2026 17:15:56 +0100 Subject: [PATCH 018/244] feat: add dey count convention enum --- src/day_count.py | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/src/day_count.py b/src/day_count.py index 5ecb7072..4e6a8625 100644 --- a/src/day_count.py +++ b/src/day_count.py @@ -8,6 +8,47 @@ from .unix_time import UTCTimeStamp, timestamp_to_datetime +class DayCountConvention(IntEnum): + """ + Day Count Convention (DCC). + + Method defining how days are counted between two dates. This defines the + year fraction in accrual calculations for interest and other computations. + + The day count convention affects how interest accrues over time by defining: + - How many days are in a month + - How many days are in a year + - Special rules for month-end dates + """ + + ACTUAL_ACTUAL = enums.DCC_AA + """Actual/Actual (AA): Year fractions accrue on the basis of the actual + number of days per month and per year in the respective period.""" + + ACTUAL_360 = enums.DCC_A360 + """Actual/360 (A360): Year fractions accrue on the basis of the actual + number of days per month and 360 days per year in the respective period.""" + + ACTUAL_365 = enums.DCC_A365 + """Actual/365 (A365): Year fractions accrue on the basis of the actual + number of days per month and 365 days per year in the respective period.""" + + THIRTY_E_360_ISDA = enums.DCC_30E360ISDA + """30E/360 ISDA (30E360ISDA): Year fractions accrue on the basis of 30 days + per month and 360 days per year in the respective period (ISDA method).""" + + THIRTY_E_360 = enums.DCC_30E360 + """30E/360 (30E360): Year fractions accrue on the basis of 30 days per month + and 360 days per year in the respective period.""" + + # Aliases for convenience + AA = ACTUAL_ACTUAL + A360 = ACTUAL_360 + A365 = ACTUAL_365 + E30_360_ISDA = THIRTY_E_360_ISDA + E30_360 = THIRTY_E_360 + + class Calendar(IntEnum): """ Calendar (CLDR). From 08ac8d4b1502f65ad0b2d2e7fcae85f8b4d2cbec Mon Sep 17 00:00:00 2001 From: cusma Date: Tue, 10 Mar 2026 17:16:25 +0100 Subject: [PATCH 019/244] chore: apply code review suggestions --- src/schedule.py | 30 +++++++++++++- tests/sdk/test_day_count.py | 2 +- tests/sdk/test_schedule.py | 81 ++++++++++++++++++++++++++++++++++++- 3 files changed, 109 insertions(+), 4 deletions(-) diff --git a/src/schedule.py b/src/schedule.py index 55f464ff..b396a78b 100644 --- a/src/schedule.py +++ b/src/schedule.py @@ -329,6 +329,17 @@ def generate_schedule( schedule.append(current) occurrence_index += 1 + # Check if we hit max_iterations without completing the schedule + if occurrence_index >= max_iterations: + # Verify if we actually reached the end + last_date = schedule[-1] if schedule else start + if last_date <= end: + raise ValueError( + f"Schedule generation exceeded maximum iterations ({max_iterations}). " + f"Last generated date: {last_date}, target end: {end}. " + "This may indicate an invalid cycle or an extremely long schedule." + ) + return tuple(schedule) @@ -360,10 +371,11 @@ def generate_array_schedule( Returns: Tuple of sorted, unique UTC UNIX timestamps covering all segments. - Returns empty tuple if anchors is empty. + Returns empty tuple if anchors is empty, end <= 0, or any anchor <= 0 or > end. Raises: ValueError: If anchors and cycles have different lengths + ValueError: If anchors are not in strictly ascending order Examples: >>> # Generate piecewise schedule with different cycles per segment @@ -380,6 +392,20 @@ def generate_array_schedule( if not anchors: return () + # Validate end and anchors to align with generate_schedule behavior + if end <= 0: + return () + if any(anchor <= 0 or anchor > end for anchor in anchors): + return () + + # Validate that anchors are in strictly ascending order + for i in range(len(anchors) - 1): + if anchors[i] >= anchors[i + 1]: + raise ValueError( + f"anchors must be in strictly ascending order: " + f"anchors[{i}]={anchors[i]} >= anchors[{i + 1}]={anchors[i + 1]}" + ) + # Use a set for efficient deduplication all_dates_set: set[int] = set() @@ -460,7 +486,7 @@ def resolve_cycle_schedule( def resolve_array_schedule( anchors: Sequence[UTCTimeStamp], cycles: Sequence[object], - end: int, + end: UTCTimeStamp, *, end_of_month_convention: EndOfMonthConvention = EndOfMonthConvention.SD, business_day_convention: BusinessDayConvention = BusinessDayConvention.NOS, diff --git a/tests/sdk/test_day_count.py b/tests/sdk/test_day_count.py index 18a5c824..d34f20bb 100644 --- a/tests/sdk/test_day_count.py +++ b/tests/sdk/test_day_count.py @@ -1,4 +1,4 @@ -"""Tests for src.calendar module.""" +"""Tests for src.day_count module.""" from __future__ import annotations diff --git a/tests/sdk/test_schedule.py b/tests/sdk/test_schedule.py index 41f86c74..e995d010 100644 --- a/tests/sdk/test_schedule.py +++ b/tests/sdk/test_schedule.py @@ -487,8 +487,8 @@ def test_generate_array_schedule_deduplicates(self) -> None: def test_generate_array_schedule_sorts_dates(self) -> None: """Test array schedule returns sorted dates.""" anchors = [ - datetime_to_timestamp(datetime(2024, 3, 1, 0, 0, 0, tzinfo=timezone.utc)), datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=timezone.utc)), + datetime_to_timestamp(datetime(2024, 3, 1, 0, 0, 0, tzinfo=timezone.utc)), ] cycles = ["1M", "1M"] end = datetime_to_timestamp(datetime(2024, 5, 1, 0, 0, 0, tzinfo=timezone.utc)) @@ -531,6 +531,85 @@ def test_generate_array_schedule_raises_if_length_mismatch(self) -> None: ): generate_array_schedule(anchors, cycles, end) + def test_generate_array_schedule_empty_if_end_zero_or_negative(self) -> None: + """Test array schedule returns empty tuple if end <= 0.""" + anchors = [ + datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=timezone.utc)), + ] + cycles = ["1M"] + + assert generate_array_schedule(anchors, cycles, 0) == () + assert generate_array_schedule(anchors, cycles, -1) == () + + def test_generate_array_schedule_empty_if_anchor_invalid(self) -> None: + """Test array schedule returns empty tuple if any anchor is invalid.""" + end = datetime_to_timestamp( + datetime(2024, 12, 31, 0, 0, 0, tzinfo=timezone.utc) + ) + cycles = ["1M"] + + # Test anchor <= 0 + assert generate_array_schedule([0], cycles, end) == () + assert generate_array_schedule([-1], cycles, end) == () + + # Test anchor > end + anchors = [end + 1000] + assert generate_array_schedule(anchors, cycles, end) == () + + def test_generate_array_schedule_raises_if_anchors_descending(self) -> None: + """Test array schedule raises if anchors are in descending order.""" + end = datetime_to_timestamp( + datetime(2024, 12, 31, 0, 0, 0, tzinfo=timezone.utc) + ) + cycles = ["1M", "1M"] + + # Test descending order + anchors = [ + datetime_to_timestamp(datetime(2024, 4, 1, 0, 0, 0, tzinfo=timezone.utc)), + datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=timezone.utc)), + ] + with pytest.raises( + ValueError, match="anchors must be in strictly ascending order" + ): + generate_array_schedule(anchors, cycles, end) + + def test_generate_array_schedule_raises_if_anchors_equal(self) -> None: + """Test array schedule raises if anchors are equal (not strictly ascending).""" + end = datetime_to_timestamp( + datetime(2024, 12, 31, 0, 0, 0, tzinfo=timezone.utc) + ) + cycles = ["1M", "1M"] + + # Test equal anchors (not strictly ascending) + anchors = [ + datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=timezone.utc)), + datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=timezone.utc)), + ] + with pytest.raises( + ValueError, match="anchors must be in strictly ascending order" + ): + generate_array_schedule(anchors, cycles, end) + + def test_generate_array_schedule_raises_if_anchors_partially_unsorted( + self, + ) -> None: + """Test array schedule raises if anchors are partially unsorted.""" + end = datetime_to_timestamp( + datetime(2024, 12, 31, 0, 0, 0, tzinfo=timezone.utc) + ) + cycles = ["1M", "1M", "1M"] + + # First two in order, but third is out of order + anchors = [ + datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=timezone.utc)), + datetime_to_timestamp(datetime(2024, 4, 1, 0, 0, 0, tzinfo=timezone.utc)), + datetime_to_timestamp(datetime(2024, 2, 1, 0, 0, 0, tzinfo=timezone.utc)), + ] + with pytest.raises( + ValueError, match="anchors must be in strictly ascending order" + ): + generate_array_schedule(anchors, cycles, end) + class TestResolveCycleSchedule: """Test resolve_cycle_schedule function.""" From 9a770dbe1b92463a5662067458d344463f2afefe Mon Sep 17 00:00:00 2001 From: cusma Date: Wed, 11 Mar 2026 11:56:53 +0100 Subject: [PATCH 020/244] chore: nit --- smart_contracts/constants.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/smart_contracts/constants.py b/smart_contracts/constants.py index 71f14c5d..899adad2 100644 --- a/smart_contracts/constants.py +++ b/smart_contracts/constants.py @@ -1,17 +1,24 @@ from typing import Final +################################################################################ # AVM +################################################################################ +MAX_UINT64: Final[int] = 2**64 - 1 MAX_ARGS_SIZE: Final[int] = 2048 OP_UP_CONTRACT_CONFIG_BASE_BUDGET: Final[int] = 1_500 OP_UP_CONTRACT_CONFIG_PER_ENTRY_BUDGET: Final[int] = 100 SCHEDULE_PAGE_SIZE: Final[int] = 16 +################################################################################ # Conversions +################################################################################ BPS: Final[int] = 10_000 FIXED_POINT_SCALE: Final[int] = 1_000_000_000 DAY_2_SEC: Final[int] = 24 * 60 * 60 +################################################################################ # Role Keys Prefix +################################################################################ PREFIX_ID_ARRANGER: Final[bytes] = b"R#Arranger#" PREFIX_ID_OP_DAEMON: Final[bytes] = b"R#OpDaemon#" PREFIX_ID_ACCOUNT_MANAGER: Final[bytes] = b"R#AccountManager#" @@ -20,5 +27,7 @@ PREFIX_ID_AUTHORITY: Final[bytes] = b"R#Authority#" PREFIX_ID_INTEREST_ORACLE: Final[bytes] = b"R#InterestOracle#" +################################################################################ # ACTUS Schedule Prefix +################################################################################ PREFIX_ID_SCHEDULE_PAGE: Final[bytes] = b"ActusSchedule#" From a1171909408c18a6cddb75dfea41c3c16f432a96 Mon Sep 17 00:00:00 2001 From: cusma Date: Wed, 11 Mar 2026 11:57:25 +0100 Subject: [PATCH 021/244] feat: datetime helpers --- src/day_count.py | 146 +++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 141 insertions(+), 5 deletions(-) diff --git a/src/day_count.py b/src/day_count.py index 4e6a8625..6a171a3b 100644 --- a/src/day_count.py +++ b/src/day_count.py @@ -2,9 +2,10 @@ from datetime import datetime from enum import IntEnum +from smart_contracts import constants as cst from smart_contracts import enums -from smart_contracts.constants import DAY_2_SEC +from .errors import ActusNormalizationError from .unix_time import UTCTimeStamp, timestamp_to_datetime @@ -214,7 +215,7 @@ def adjust_to_business_day( BusinessDayConvention.CALCULATE_SHIFT_MODIFIED_FOLLOWING, ): while not is_business_day(current, calendar): - current += DAY_2_SEC + current += cst.DAY_2_SEC # Modified following: if shifted to next month, shift back to preceding if ( business_day_convention @@ -226,7 +227,7 @@ def adjust_to_business_day( ): current = original while not is_business_day(current, calendar): - current -= DAY_2_SEC + current -= cst.DAY_2_SEC # Preceding conventions (shift backward) elif business_day_convention in ( @@ -236,7 +237,7 @@ def adjust_to_business_day( BusinessDayConvention.CALCULATE_SHIFT_MODIFIED_PRECEDING, ): while not is_business_day(current, calendar): - current -= DAY_2_SEC + current -= cst.DAY_2_SEC # Modified preceding: if shifted to previous month, shift forward to following if ( business_day_convention @@ -248,7 +249,7 @@ def adjust_to_business_day( ): current = original while not is_business_day(current, calendar): - current += DAY_2_SEC + current += cst.DAY_2_SEC return current @@ -273,3 +274,138 @@ def is_shift_calculate(business_day_convention: BusinessDayConvention) -> bool: BusinessDayConvention.SHIFT_CALCULATE_PRECEDING, BusinessDayConvention.SHIFT_CALCULATE_MODIFIED_PRECEDING, ) + + +def year_fraction_fixed( + start_ts: UTCTimeStamp, + end_ts: UTCTimeStamp, + *, + day_count_convention: int, + maturity_date: UTCTimeStamp | None, +) -> int: + """Return a fixed-point year fraction for a supported day-count convention.""" + if end_ts <= start_ts: + return 0 + + if day_count_convention == DayCountConvention.A360: + return _days_between(start_ts, end_ts) * cst.FIXED_POINT_SCALE // 360 + if day_count_convention == DayCountConvention.A365: + return _days_between(start_ts, end_ts) * cst.FIXED_POINT_SCALE // 365 + if day_count_convention == DayCountConvention.AA: + return _year_fraction_actual_actual(start_ts, end_ts) + if day_count_convention == DayCountConvention.E30_360: + return _days_30e_360(start_ts, end_ts) * cst.FIXED_POINT_SCALE // 360 + if day_count_convention == DayCountConvention.E30_360_ISDA: + if maturity_date is None: + raise ActusNormalizationError("30E/360 ISDA requires maturity_date") + return ( + _days_30e_360_isda(start_ts, end_ts, maturity_date) + * cst.FIXED_POINT_SCALE + // 360 + ) + raise ActusNormalizationError("Unsupported day-count convention") + + +def days_in_month(year: int, month: int) -> int: + """Return the number of days in a Gregorian month.""" + return monthrange(year, month)[1] + + +def _year_fraction_actual_actual(start_ts: UTCTimeStamp, end_ts: UTCTimeStamp) -> int: + """Return the Actual/Actual year fraction in fixed-point form.""" + start_year, start_month, start_day = _date_parts(start_ts) + end_year, end_month, end_day = _date_parts(end_ts) + if start_year == end_year: + return ( + _days_between(start_ts, end_ts) + * cst.FIXED_POINT_SCALE + // _days_in_year(start_year) + ) + + start_day_of_year = _day_of_year(start_year, start_month, start_day) + end_day_of_year = _day_of_year(end_year, end_month, end_day) + start_fraction = ( + (_days_in_year(start_year) - (start_day_of_year - 1)) + * cst.FIXED_POINT_SCALE + // _days_in_year(start_year) + ) + full_years = max(end_year - start_year - 1, 0) * cst.FIXED_POINT_SCALE + end_fraction = ( + (end_day_of_year - 1) * cst.FIXED_POINT_SCALE // _days_in_year(end_year) + ) + return start_fraction + full_years + end_fraction + + +def _days_between(start_ts: UTCTimeStamp, end_ts: UTCTimeStamp) -> int: + """Return whole UTC days between two timestamps.""" + if end_ts <= start_ts: + return 0 + return (end_ts - start_ts) // cst.DAY_2_SEC + + +def _days_30e_360(start_ts: UTCTimeStamp, end_ts: UTCTimeStamp) -> int: + """Return the 30E/360 day-count numerator between two timestamps.""" + y1, m1, d1 = _date_parts(start_ts) + y2, m2, d2 = _date_parts(end_ts) + if d1 == 31: + d1 = 30 + if d2 == 31: + d2 = 30 + return (y2 - y1) * 360 + (m2 - m1) * 30 + (d2 - d1) + + +def _days_30e_360_isda( + start_ts: UTCTimeStamp, end_ts: UTCTimeStamp, maturity_ts: UTCTimeStamp +) -> int: + """Return the 30E/360 ISDA day-count numerator between two timestamps.""" + y1, m1, d1 = _date_parts(start_ts) + y2, m2, d2 = _date_parts(end_ts) + maturity_parts = _date_parts(maturity_ts) + if _is_last_day_of_feb(y1, m1, d1) or d1 == 31: + d1 = 30 + if (_is_last_day_of_feb(y2, m2, d2) and (y2, m2, d2) != maturity_parts) or d2 == 31: + d2 = 30 + return (y2 - y1) * 360 + (m2 - m1) * 30 + (d2 - d1) + + +def _days_30_360(start_ts: UTCTimeStamp, end_ts: UTCTimeStamp) -> int: + """Return the 30/360 bond-basis day-count numerator between two timestamps.""" + y1, m1, d1 = _date_parts(start_ts) + y2, m2, d2 = _date_parts(end_ts) + if d1 == 31: + d1 = 30 + if d1 >= 30 and d2 == 31: + d2 = 30 + return (y2 - y1) * 360 + (m2 - m1) * 30 + (d2 - d1) + + +def _date_parts(timestamp: UTCTimeStamp) -> tuple[int, int, int]: + """Return the UTC year, month, and day for a timestamp.""" + current = timestamp_to_datetime(timestamp) + return current.year, current.month, current.day + + +def _day_of_year(year: int, month: int, day: int) -> int: + """Return the ordinal day number within a year.""" + month_offsets = (0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334) + value = month_offsets[month - 1] + day + if month > 2 and _is_leap_year(year): + value += 1 + return value + + +def _days_in_year(year: int) -> int: + """Return the number of days in a Gregorian year.""" + return 366 if _is_leap_year(year) else 365 + + +def _is_leap_year(year: int) -> bool: + """Return whether a Gregorian year is a leap year.""" + return year % 4 == 0 and (year % 100 != 0 or year % 400 == 0) + + +def _is_last_day_of_feb(year: int, month: int, day: int) -> bool: + """Return whether a date is the last day of February.""" + if month != 2: + return False + return day == (29 if _is_leap_year(year) else 28) From c413f4fc858775b9626ef139137260862de7408a Mon Sep 17 00:00:00 2001 From: cusma Date: Wed, 11 Mar 2026 11:57:42 +0100 Subject: [PATCH 022/244] chore: rejected bdc --- src/registry.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/registry.py b/src/registry.py index 0ba08afb..e3bb14b8 100644 --- a/src/registry.py +++ b/src/registry.py @@ -12,6 +12,16 @@ {"PP", "PY", "SC", "CE", "PRD", "TD", "FP"} ) +# Business Day Conventions that are not supported +REJECTED_BDC = frozenset( + { + enums.BDC_CSF, + enums.BDC_CSMF, + enums.BDC_CSP, + enums.BDC_CSMP, + } +) + ALLOWED_EVENT_TYPES: dict[str, frozenset[str]] = { "PAM": frozenset({"IED", "IP", "MD", "RR", "RRF"}), "ANN": frozenset({"IED", "IP", "PR", "MD", "RR", "RRF", "IPCB", "PRF"}), From 3819476255de09f9162dd84c14ca7e07591c5df5 Mon Sep 17 00:00:00 2001 From: cusma Date: Wed, 11 Mar 2026 11:58:13 +0100 Subject: [PATCH 023/244] chore: no default; types --- src/schedule.py | 57 +++++++++++++++++++++++-------------------------- 1 file changed, 27 insertions(+), 30 deletions(-) diff --git a/src/schedule.py b/src/schedule.py index b396a78b..81008ec0 100644 --- a/src/schedule.py +++ b/src/schedule.py @@ -44,7 +44,7 @@ class Cycle: stub: str = "" @classmethod - def parse_cycle(cls, raw_cycle: object) -> Cycle: + def parse_cycle(cls, raw_cycle: str | Cycle) -> Cycle: """ Parse an ACTUS cycle string into a Cycle object. @@ -110,7 +110,7 @@ def _add_month_cycle_from_anchor( *, cycle: Cycle, occurrence_index: int, - end_of_month_convention: EndOfMonthConvention = EndOfMonthConvention.SD, + end_of_month_convention: EndOfMonthConvention, ) -> UTCTimeStamp: """ Advance a month-based cycle from a fixed anchor UTC UNIX timestamp. @@ -175,7 +175,7 @@ def _add_cycle_chained( timestamp: UTCTimeStamp, cycle: Cycle, *, - end_of_month_convention: EndOfMonthConvention = EndOfMonthConvention.SD, + end_of_month_convention: EndOfMonthConvention, ) -> UTCTimeStamp: """ Advance one chained cycle from the current UTC UNIX timestamp. @@ -218,9 +218,9 @@ def _add_cycle_chained( def add_cycle( timestamp: UTCTimeStamp, - raw_cycle: object, + cycle: Cycle, *, - end_of_month_convention: EndOfMonthConvention = EndOfMonthConvention.SD, + end_of_month_convention: EndOfMonthConvention, anchor_timestamp: UTCTimeStamp | None = None, occurrence_index: int | None = None, ) -> UTCTimeStamp: @@ -235,7 +235,7 @@ def add_cycle( Args: timestamp: UTC UNIX timestamp to advance (used in chained mode) - raw_cycle: ACTUS cycle string (e.g., "3M", "1Q", "90D") or Cycle object + cycle: ACTUS cycle (e.g., "3M", "1Q", "90D") end_of_month_convention: How to handle month-end dates for month-based cycles anchor_timestamp: Optional fixed starting point for anchor-based calculation occurrence_index: Optional occurrence number (0 = anchor, 1 = first, etc.) @@ -249,8 +249,6 @@ def add_cycle( over many iterations. """ - cycle = Cycle.parse_cycle(raw_cycle) - # Anchor-based mode: calculate from fixed anchor if anchor_timestamp is not None and occurrence_index is not None: if cycle.unit in {"M", "Q", "H", "Y"}: @@ -273,10 +271,10 @@ def add_cycle( def generate_schedule( start: UTCTimeStamp, - raw_cycle: object, + cycle: Cycle, end: UTCTimeStamp, *, - end_of_month_convention: EndOfMonthConvention = EndOfMonthConvention.SD, + end_of_month_convention: EndOfMonthConvention, ) -> tuple[UTCTimeStamp, ...]: """ Generate raw cycle dates from a start anchor up to an inclusive end date. @@ -288,7 +286,7 @@ def generate_schedule( Args: start: UTC UNIX timestamp anchor (first date in schedule) - raw_cycle: ACTUS cycle string (e.g., "3M", "1Q", "90D") + cycle: ACTUS cycle (e.g., "3M", "1Q", "90D") end: UTC UNIX timestamp upper bound (inclusive) end_of_month_convention: How to handle month-end dates for month-based cycles @@ -309,7 +307,6 @@ def generate_schedule( if start <= 0 or end <= 0 or start > end: return () - cycle = Cycle.parse_cycle(raw_cycle) schedule: list[int] = [] occurrence_index = 0 @@ -345,10 +342,10 @@ def generate_schedule( def generate_array_schedule( anchors: Sequence[UTCTimeStamp], - cycles: Sequence[object], + cycles: Sequence[Cycle], end: UTCTimeStamp, *, - end_of_month_convention: EndOfMonthConvention = EndOfMonthConvention.SD, + end_of_month_convention: EndOfMonthConvention, ) -> tuple[UTCTimeStamp, ...]: """ Generate a flattened schedule from parallel anchor and cycle arrays. @@ -365,7 +362,7 @@ def generate_array_schedule( Args: anchors: Sequence of UTC UNIX timestamps marking schedule segment starts - cycles: Sequence of ACTUS cycle strings, parallel to anchors + cycles: Sequence of ACTUS cycle, parallel to anchors end: UTC UNIX timestamp upper bound (inclusive, always included in result) end_of_month_convention: How to handle month-end dates for month-based cycles @@ -432,12 +429,12 @@ def generate_array_schedule( def resolve_cycle_schedule( start: UTCTimeStamp, - raw_cycle: object, + cycle: Cycle, end: UTCTimeStamp, *, - end_of_month_convention: EndOfMonthConvention = EndOfMonthConvention.SD, - business_day_convention: BusinessDayConvention = BusinessDayConvention.NOS, - calendar_name: Calendar = Calendar.NC, + end_of_month_convention: EndOfMonthConvention, + business_day_convention: BusinessDayConvention, + calendar: Calendar, ) -> tuple[UTCTimeStamp, ...]: """ Generate and business-day-adjust a cycle-based ACTUS schedule. @@ -448,11 +445,11 @@ def resolve_cycle_schedule( Args: start: UTC UNIX timestamp anchor (first date in schedule) - raw_cycle: ACTUS cycle string (e.g., "3M", "1Q", "90D") + cycle: ACTUS cycle end: UTC UNIX timestamp upper bound (inclusive) end_of_month_convention: How to handle month-end dates for month-based cycles business_day_convention: How to adjust dates that fall on non-business days - calendar_name: Which calendar defines business days vs. holidays + calendar: Which calendar defines business days vs. holidays Returns: Tuple of UTC UNIX timestamps with business day adjustments applied @@ -471,12 +468,12 @@ def resolve_cycle_schedule( raise UnsupportedActusFeatureError( "Supported Business Day Convention: NO_SHIFT" ) - if calendar_name != Calendar.NC: + if calendar != Calendar.NC: raise UnsupportedActusFeatureError("Supported Calendar: NO_CALENDAR") base_dates = generate_schedule( start, - raw_cycle, + cycle, end, end_of_month_convention=end_of_month_convention, ) @@ -485,12 +482,12 @@ def resolve_cycle_schedule( def resolve_array_schedule( anchors: Sequence[UTCTimeStamp], - cycles: Sequence[object], + cycles: Sequence[Cycle], end: UTCTimeStamp, *, - end_of_month_convention: EndOfMonthConvention = EndOfMonthConvention.SD, - business_day_convention: BusinessDayConvention = BusinessDayConvention.NOS, - calendar_name: Calendar = Calendar.NC, + end_of_month_convention: EndOfMonthConvention, + business_day_convention: BusinessDayConvention, + calendar: Calendar, ) -> tuple[UTCTimeStamp, ...]: """ Generate and business-day-adjust an array-based ACTUS schedule. @@ -502,11 +499,11 @@ def resolve_array_schedule( Args: anchors: Sequence of UTC UNIX timestamps marking schedule segment starts - cycles: Sequence of ACTUS cycle strings, parallel to anchors + cycles: Sequence of ACTUS cycle, parallel to anchors end: UTC UNIX timestamp upper bound (inclusive) end_of_month_convention: How to handle month-end dates for month-based cycles business_day_convention: How to adjust dates that fall on non-business days - calendar_name: Which calendar defines business days vs. holidays + calendar: Which calendar defines business days vs. holidays Returns: Tuple of UTC UNIX timestamps with business day adjustments applied @@ -526,7 +523,7 @@ def resolve_array_schedule( raise UnsupportedActusFeatureError( "Supported Business Day Convention: NO_SHIFT" ) - if calendar_name != Calendar.NC: + if calendar != Calendar.NC: raise UnsupportedActusFeatureError("Supported Calendar: NO_CALENDAR") base_dates = generate_array_schedule( From cc0c615d49a5b057a66bd9cb5231cf0628da8c8b Mon Sep 17 00:00:00 2001 From: cusma Date: Wed, 11 Mar 2026 11:59:50 +0100 Subject: [PATCH 024/244] chore: include execution terms in normalized actus; timestamp types --- src/models.py | 94 +++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 72 insertions(+), 22 deletions(-) diff --git a/src/models.py b/src/models.py index f07ef40c..83c00ee4 100644 --- a/src/models.py +++ b/src/models.py @@ -2,43 +2,93 @@ from dataclasses import dataclass +from smart_contracts import enums -@dataclass(frozen=True, slots=True) -class ExecutionTerms: - """Non-ACTUS contract execution terms.""" - - unit_value: int - total_units: int - fixed_point_scale: int - secondary_market_opening_date: int | None - secondary_market_closure_date: int | None +from .errors import ActusNormalizationError +from .unix_time import UTCTimeStamp @dataclass(frozen=True, slots=True) -class NormalizedActusTerms(ExecutionTerms): +class NormalizedActusTerms: """ ACTUS normalized contract terms for AVM deployment. - NOTE: `unit_value` is an SDK-only metadata. It is used to derive an exact + AVM IDs + - Contract ID: D-ASA Application ID + - Contract Type: Contract Type enumerative ID + - Denomination Asset ID: ASA ID + + AVM Time + - UTC UNIX timestamp + + AVM Numeric values (UInt64): + - Rates: in BPS (base-points), 1 BPS = 0.01% + - Amounts: in ASA minimal units + - Fixed Point are scaled + + NOTE: `notional_unit_value` is an SDK-only metadata. It is used to derive an exact `total_units` count before AVM deployment, but it is not persisted on-chain. """ - contract_id: str + # Contract + contract_id: int + contract_type: int + + # Denomination denomination_asset_id: int - settlement_asset_id: int + + # Time + initial_exchange_date: UTCTimeStamp + maturity_date: UTCTimeStamp + secondary_market_opening_date: UTCTimeStamp + secondary_market_closure_date: UTCTimeStamp + + # Principal notional_principal: int + notional_unit_value: int initial_exchange_amount: int - initial_exchange_date: int - maturity_date: int | None - day_count_convention: int + next_principal_redemption_amount: int + + # Interest rate_reset_spread: int rate_reset_multiplier: int rate_reset_floor: int rate_reset_cap: int rate_reset_next: int - has_rate_reset_floor: bool - has_rate_reset_cap: bool - dynamic_principal_redemption: bool + + # Day Count Convention + day_count_convention: int + + # Scaling + fixed_point_scale: int + + def __post_init__(self) -> None: + if self.notional_unit_value <= 0: + raise ActusNormalizationError("notional_unit_value must be positive") + + if self.notional_principal % self.notional_unit_value != 0: + raise ActusNormalizationError( + "D-ASA requires notional_principal be divisible by notional_unit_value" + ) + + @property + def total_units(self) -> int: + return self.notional_principal // self.notional_unit_value + + @property + def dynamic_principal_redemption(self) -> bool: + return ( + self.contract_type == enums.CT_ANN + and not self.next_principal_redemption_amount + ) + + @property + def has_rate_reset_floor(self) -> bool: + return self.rate_reset_floor != 0 + + @property + def has_rate_reset_cap(self) -> bool: + return self.rate_reset_cap != 0 @dataclass(frozen=True, slots=True) @@ -47,7 +97,7 @@ class ExecutionScheduleEntry: event_id: int event_type: str - scheduled_time: int + scheduled_time: UTCTimeStamp accrual_factor: int redemption_accrual_factor: int next_nominal_interest_rate: int @@ -60,7 +110,7 @@ class ExecutionScheduleEntry: class InitialKernelState: """Contract initial kernel snapshot used for contract configuration.""" - status_date: int + status_date: UTCTimeStamp event_cursor: int outstanding_principal: int interest_calculation_base: int @@ -76,7 +126,7 @@ class ObservedEventRequest: """SDK-side representation of an observed ACTUS event payload.""" event_type: str - scheduled_time: int + scheduled_time: UTCTimeStamp accrual_factor: int redemption_accrual_factor: int observed_rate: int From bc09fa15df20df49f746c07ed208b71681987fe9 Mon Sep 17 00:00:00 2001 From: cusma Date: Wed, 11 Mar 2026 12:06:25 +0100 Subject: [PATCH 025/244] chore: update fields --- tests/sdk/test_models.py | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/tests/sdk/test_models.py b/tests/sdk/test_models.py index a0e2954d..b9ab1c8c 100644 --- a/tests/sdk/test_models.py +++ b/tests/sdk/test_models.py @@ -10,26 +10,23 @@ def test_schedule_pages_chunk_entries() -> None: terms = NormalizedActusTerms( - contract_id="PAM-001", + contract_id=42, + contract_type=0, denomination_asset_id=1, - settlement_asset_id=1, - unit_value=1_000, - total_units=100, - notional_principal=100_000, - initial_exchange_amount=100_000, initial_exchange_date=1, maturity_date=2, - secondary_market_opening_date=None, - secondary_market_closure_date=None, - day_count_convention=2, + secondary_market_opening_date=0, + secondary_market_closure_date=0, + notional_principal=100_000, + notional_unit_value=1_000, + initial_exchange_amount=100_000, + next_principal_redemption_amount=0, rate_reset_spread=0, rate_reset_multiplier=1_000_000_000, rate_reset_floor=0, rate_reset_cap=0, rate_reset_next=0, - has_rate_reset_floor=False, - has_rate_reset_cap=False, - dynamic_principal_redemption=False, + day_count_convention=2, fixed_point_scale=1_000_000_000, ) schedule = tuple( From 6259f1ca7f80ab5e1d325cecc8d7a8e24443e439 Mon Sep 17 00:00:00 2001 From: cusma Date: Wed, 11 Mar 2026 12:06:42 +0100 Subject: [PATCH 026/244] feat: contract attributes --- src/contracts.py | 160 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 160 insertions(+) create mode 100644 src/contracts.py diff --git a/src/contracts.py b/src/contracts.py new file mode 100644 index 00000000..334de287 --- /dev/null +++ b/src/contracts.py @@ -0,0 +1,160 @@ +"""ACTUS Contract Attributes: Basic Fixed-Income Maturities""" + +from __future__ import annotations + +from dataclasses import dataclass +from decimal import Decimal +from typing import Literal + +from .day_count import ( + BusinessDayConvention, + Calendar, + DayCountConvention, + EndOfMonthConvention, +) +from .errors import UnsupportedActusFeatureError +from .registry import DAY_COUNT_CONVENTION_IDS, REJECTED_BDC, SUPPORTED_CONTRACT_TYPES +from .schedule import Cycle +from .unix_time import UTCTimeStamp + + +@dataclass(frozen=True, slots=True) +class ContractAttributes: + """ + D-ASA Contract attributes. + + Note: D-ASA supports a subset of ACTUS contract attributes. + """ + + # Contract + contract_id: int + contract_type: str + + # Time + status_date: UTCTimeStamp + initial_exchange_date: UTCTimeStamp + maturity_date: UTCTimeStamp | None + + # Principal + notional_principal: int | float | Decimal + premium_discount_at_ied: int | float | Decimal + next_principal_redemption_amount: int | float | Decimal | None = None + principal_redemption_cycle: Cycle | None = None + principal_redemption_anchor: UTCTimeStamp | None = None + amortization_date: UTCTimeStamp | None = None + + # Interest + nominal_interest_rate: int | float | Decimal = 0 + interest_payment_anchor: UTCTimeStamp | None = None + interest_payment_cycle: Cycle | None = None + interest_calculation_base_anchor: UTCTimeStamp | None = None + interest_calculation_base_cycle: Cycle | None = None + rate_reset_anchor: UTCTimeStamp | None = None + rate_reset_cycle: Cycle | None = None + rate_reset_spread: int | float | Decimal = 0 + rate_reset_multiplier: int | float | Decimal = 1 + rate_reset_floor: int | float | Decimal = 0 + rate_reset_cap: int | float | Decimal = 0 + rate_reset_next: int | float | Decimal | None = None + + # Day Count Convention + day_count_convention: DayCountConvention = DayCountConvention.A360 + business_day_convention: BusinessDayConvention = BusinessDayConvention.NOS + end_of_month_convention: EndOfMonthConvention = EndOfMonthConvention.SD + calendar: Calendar = Calendar.NC + + # Arrays + array_pr_anchor: list[UTCTimeStamp] | None = None + array_pr_cycle: list[Cycle] | None = None + array_pr_next: list[int | float | Decimal] | None = None + array_increase_decrease: list[Literal["INC", "DEC"]] | None = None + + def __post_init__(self) -> None: + """Validate contract attributes.""" + # Extract base contract type (e.g., "PAM" from "PAM:ZCB") + base_contract_type = ( + self.contract_type.split(":")[0] + if ":" in self.contract_type + else self.contract_type + ) + + if base_contract_type not in SUPPORTED_CONTRACT_TYPES: + raise UnsupportedActusFeatureError( + f"Unsupported ACTUS contract type: {self.contract_type}" + ) + + if ( + self.day_count_convention is not None + and self.day_count_convention not in DAY_COUNT_CONVENTION_IDS.values() + ): + raise UnsupportedActusFeatureError( + f"Unsupported day count convention: {self.day_count_convention}" + ) + + if self.business_day_convention in REJECTED_BDC: + raise UnsupportedActusFeatureError( + f"Unsupported business day convention {self.business_day_convention.name}. " + ) + + +def make_pam_zero_coupon_bond( + *, + contract_id: int, + status_date: UTCTimeStamp, + initial_exchange_date: UTCTimeStamp, + maturity_date: UTCTimeStamp, + notional_principal: int | float | Decimal, + premium_discount_at_ied: int | float | Decimal, + day_count_convention: DayCountConvention | None = DayCountConvention.A360, + business_day_convention: BusinessDayConvention | None = BusinessDayConvention.NOS, + end_of_month_convention: EndOfMonthConvention | None = EndOfMonthConvention.SD, + calendar: Calendar | None = Calendar.NC, +) -> ContractAttributes: + """Build a PAM Zero Coupon Bond (ZCB) profile.""" + return ContractAttributes( + contract_id=contract_id, + contract_type="PAM:ZCB", + status_date=status_date, + initial_exchange_date=initial_exchange_date, + maturity_date=maturity_date, + notional_principal=notional_principal, + premium_discount_at_ied=premium_discount_at_ied, + nominal_interest_rate=0.0, + day_count_convention=day_count_convention, + business_day_convention=business_day_convention, + end_of_month_convention=end_of_month_convention, + calendar=calendar, + ) + + +def make_pam_fixed_coupon_bond_profile( + *, + contract_id: int, + status_date: UTCTimeStamp, + initial_exchange_date: UTCTimeStamp, + maturity_date: UTCTimeStamp, + notional_principal: int | float | Decimal, + nominal_interest_rate: int | float | Decimal, + day_count_convention: DayCountConvention | None = DayCountConvention.A360, + business_day_convention: BusinessDayConvention | None = BusinessDayConvention.NOS, + end_of_month_convention: EndOfMonthConvention | None = EndOfMonthConvention.SD, + calendar: Calendar | None = Calendar.NC, + interest_payment_cycle: Cycle, + interest_payment_anchor: UTCTimeStamp, +) -> ContractAttributes: + """Build a PAM Fixed Coupon Bond (FCB) with a fixed interest rate profile.""" + return ContractAttributes( + contract_id=contract_id, + contract_type="PAM:FCB", + status_date=status_date, + initial_exchange_date=initial_exchange_date, + maturity_date=maturity_date, + notional_principal=notional_principal, + nominal_interest_rate=nominal_interest_rate, + day_count_convention=day_count_convention, + business_day_convention=business_day_convention, + end_of_month_convention=end_of_month_convention, + calendar=calendar, + interest_payment_cycle=interest_payment_cycle, + interest_payment_anchor=interest_payment_anchor, + ) From 3110ceadbc09e0706a763708a7655efd071780ec Mon Sep 17 00:00:00 2001 From: cusma Date: Wed, 11 Mar 2026 12:06:48 +0100 Subject: [PATCH 027/244] feat: normalization --- src/normalization.py | 1148 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1148 insertions(+) create mode 100644 src/normalization.py diff --git a/src/normalization.py b/src/normalization.py new file mode 100644 index 00000000..a87fbab6 --- /dev/null +++ b/src/normalization.py @@ -0,0 +1,1148 @@ +"""ACTUS Contract normalization to AVM""" + +from __future__ import annotations + +from collections.abc import Sequence +from dataclasses import dataclass +from decimal import Decimal + +from smart_contracts import constants as cst +from smart_contracts import enums + +from .contracts import ContractAttributes +from .day_count import days_in_month, year_fraction_fixed +from .errors import ActusNormalizationError, UnsupportedActusFeatureError +from .models import ( + ExecutionScheduleEntry, + InitialKernelState, + NormalizationResult, + NormalizedActusTerms, + ObservedEventRequest, +) +from .registry import ( + ALLOWED_EVENT_TYPES, + CONTRACT_TYPE_IDS, + EVENT_SCHEDULE_PRIORITY, +) +from .schedule import ( + Cycle, + datetime_to_timestamp, + resolve_array_schedule, + resolve_cycle_schedule, + timestamp_to_datetime, +) +from .unix_time import UTCTimeStamp + + +def _to_asa_units(amount: int | float | Decimal, asa_decimals: int) -> int: + """ + Normalize an amount into ASA's units (uint64). + + Example: + 1) amount=100.42, asa_decimals=3, the result in ASA's units is 100420 + 2) amount=100, asa_decimals=2, the result in ASA's units is 10000 + + Args: + amount: The numeric value to normalize. + asa_decimals: The number of decimal places for the ASA. + + Raises: + TypeError: if the value is not an int, float, or Decimal. + ActusNormalizationError: if the result exceeds uint64 max. + """ + + if isinstance(amount, (int, float, Decimal)): + scale = 10**asa_decimals + result = int(Decimal(str(asa_decimals)) * scale) + else: + raise TypeError(f"Unsupported value type: {type(amount)}") + + if result < 0 or result > cst.MAX_UINT64: + raise ActusNormalizationError( + f"Value {amount} results in {result} which exceeds uint64 bounds" + ) + + return result + + +def _rate_to_fp(value: int | float | Decimal) -> int: + """ + Normalize numeric decimal rates into AVM-compatible uint64 integer fixed-point + scaled units. + + Always scales by FIXED_POINT_SCALE to convert decimal-like values to fixed point + precision integers. + + Example: + A rate of 0.05 (5%) with FIXED_POINT_SCALE of 1_000_000_000 becomes 50_000_000. + + Args: + value: The rate value to normalize. + + Raises: + TypeError: if the value is not an int, float, or Decimal. + ActusNormalizationError: if the result exceeds uint64 max. + """ + + if isinstance(value, (int, float, Decimal)): + result = int(Decimal(str(value)) * cst.FIXED_POINT_SCALE) + else: + raise TypeError(f"Unsupported value type: {type(value)}") + + if result < 0 or result > cst.MAX_UINT64: + raise ActusNormalizationError( + f"Value {value} results in {result} which exceeds uint64 bounds" + ) + + return result + + +def _compute_initial_exchange_amount( + notional: int | float | Decimal, + premium_discount_at_ied: int | float | Decimal, + asa_decimals: int, +) -> int: + notional = _to_asa_units(notional, asa_decimals) + pdied = _to_asa_units(premium_discount_at_ied, asa_decimals) + return notional - pdied + + +def _deduplicate_timestamps(ts: Sequence[UTCTimeStamp]) -> tuple[UTCTimeStamp, ...]: + """Remove duplicate timestamps while preserving sorted schedule order.""" + return tuple(dict.fromkeys(sorted(ts))) + + +@dataclass(frozen=True, slots=True) +class _EventSeed: + """Intermediate normalized event before final schedule encoding.""" + + event_type: str + scheduled_time: UTCTimeStamp + accrual_factor: int | float | Decimal | None = None + redemption_accrual_factor: int | float | Decimal | None = None + redemption_accrual_start: int = 0 + redemption_accrual_end: int = 0 + next_nominal_interest_rate: int | float | Decimal = 0 + next_principal_redemption: int = 0 + next_outstanding_principal: int = 0 + flags: int = 0 + + +def normalize_contract_attributes( + contract: ContractAttributes, + *, + denomination_asset_id: int, + denomination_asset_decimals: int, + notional_unit_value: int | float | Decimal, + secondary_market_opening_date: UTCTimeStamp, + secondary_market_closure_date: UTCTimeStamp, + fixed_point_scale: int = cst.FIXED_POINT_SCALE, + preprocessed_events: ( + Sequence[ObservedEventRequest | ExecutionScheduleEntry] | None + ) = None, +) -> NormalizationResult: + """Normalize raw ACTUS attributes into terms, schedule, and initial state. + + Args: + contract: ACTUS contract attributes. + denomination_asset_id: The denomination ASA ID. + denomination_asset_decimals: The decimal places od the denomination ASA. + notional_unit_value: The notional unit value to be converted in denomination ASA. + secondary_market_opening_date: Optional secondary market opening date. + secondary_market_closure_date: Optional secondary market closure date. + fixed_point_scale: The fixed point scaling. + preprocessed_events: Optional preprocessed events. + """ + + if contract.status_date >= contract.initial_exchange_date: + raise ActusNormalizationError( + "D-ASA requires status_date to be strictly before initial_exchange_date" + ) + + pdied_asa = _compute_initial_exchange_amount( + contract.notional_principal, + contract.premium_discount_at_ied, + denomination_asset_decimals, + ) + + # Normalize ACTUS contract terms to AVM + terms = NormalizedActusTerms( + # Contract + contract_id=contract.contract_id, + contract_type=CONTRACT_TYPE_IDS[contract.contract_type], + # Denomination + denomination_asset_id=denomination_asset_id, + # Time + initial_exchange_date=contract.initial_exchange_date, + maturity_date=contract.maturity_date, + secondary_market_opening_date=secondary_market_opening_date, + secondary_market_closure_date=secondary_market_closure_date, + # Principal + notional_principal=_to_asa_units( + contract.notional_principal, denomination_asset_decimals + ), + notional_unit_value=_to_asa_units( + notional_unit_value, denomination_asset_decimals + ), + initial_exchange_amount=pdied_asa, + next_principal_redemption_amount=contract.next_principal_redemption_amount, + # Interest + rate_reset_spread=_rate_to_fp(contract.rate_reset_spread), + rate_reset_multiplier=_rate_to_fp(contract.rate_reset_multiplier), + rate_reset_floor=_rate_to_fp(contract.rate_reset_floor), + rate_reset_cap=_rate_to_fp(contract.rate_reset_cap), + rate_reset_next=_rate_to_fp( + contract.rate_reset_next + if contract.rate_reset_next is not None + else contract.nominal_interest_rate + ), + # Day Count Convention + day_count_convention=contract.day_count_convention, + # Scaling + fixed_point_scale=fixed_point_scale, + ) + + # Normalize ACTUS contract schedule to AVM + schedule = _normalize_schedule( + contract, + terms=terms, + preprocessed_events=preprocessed_events, + contract_type=contract.contract_type, + status_date=contract.status_date, + asa_decimals=denomination_asset_decimals, + ) + + # Normalize ACTUS contract initial state to AVM + initial_state = InitialKernelState( + status_date=contract.status_date, + event_cursor=0, + outstanding_principal=0, + interest_calculation_base=0, + nominal_interest_rate=0, + accrued_interest=0, + next_principal_redemption=0, + cumulative_interest_index=0, + cumulative_principal_index=0, + ) + return NormalizationResult( + terms=terms, + schedule=schedule, + initial_state=initial_state, + ) + + +def _normalize_schedule( + contract: ContractAttributes, + *, + terms: NormalizedActusTerms, + preprocessed_events: Sequence[ObservedEventRequest | ExecutionScheduleEntry] | None, + contract_type: str, + status_date: int, + asa_decimals: int, +) -> tuple[ExecutionScheduleEntry, ...]: + """Turn intermediate event seeds into AVM schedule entries.""" + if preprocessed_events is not None: + seeds = [ + _seed_from_preprocessed(index, item) + for index, item in enumerate(preprocessed_events) + ] + else: + seeds = list( + _build_schedule_seeds( + contract, terms, contract_type=contract_type, asa_decimals=asa_decimals + ) + ) + + if not any(seed.event_type == "IED" for seed in seeds): + seeds.append(_initial_exchange_seed(contract, terms, asa_decimals=asa_decimals)) + + ordered = sorted(seeds, key=_seed_sort_key) + allowed = ALLOWED_EVENT_TYPES[contract_type] + entries: list[ExecutionScheduleEntry] = [] + previous_ts = status_date + for event_id, seed in enumerate(ordered): + if seed.event_type not in allowed: + raise UnsupportedActusFeatureError( + f"Unsupported event {seed.event_type} for {contract_type}" + ) + if seed.event_type != "IED" and seed.scheduled_time < previous_ts: + raise ActusNormalizationError( + "ACTUS scheduled_time must be non-decreasing in event execution order" + ) + accrual_factor = seed.accrual_factor + if accrual_factor is None: + if seed.event_type == "IED": + accrual_factor = 0 + else: + accrual_factor = year_fraction_fixed( + previous_ts, + seed.scheduled_time, + day_count_convention=terms.day_count_convention, + maturity_date=terms.maturity_date, + ) + redemption_accrual_factor = seed.redemption_accrual_factor + if redemption_accrual_factor is None: + if seed.redemption_accrual_end > seed.redemption_accrual_start: + redemption_accrual_factor = year_fraction_fixed( + seed.redemption_accrual_start, + seed.redemption_accrual_end, + day_count_convention=terms.day_count_convention, + maturity_date=terms.maturity_date, + ) + else: + redemption_accrual_factor = 0 + entries.append( + ExecutionScheduleEntry( + event_id=event_id, + event_type=seed.event_type, + scheduled_time=seed.scheduled_time, + accrual_factor=accrual_factor, + redemption_accrual_factor=redemption_accrual_factor, + next_nominal_interest_rate=seed.next_nominal_interest_rate, + next_principal_redemption=seed.next_principal_redemption, + next_outstanding_principal=seed.next_outstanding_principal, + flags=seed.flags, + ) + ) + previous_ts = seed.scheduled_time + return tuple(entries) + + +def _build_schedule_seeds( + contract: ContractAttributes, + terms: NormalizedActusTerms, + *, + contract_type: str, + asa_decimals: int, +) -> tuple[_EventSeed, ...]: + """Dispatch contract-type-specific schedule construction.""" + dispatch = { + "PAM": _build_pam_schedule, + "LAM": _build_lam_schedule, + "NAM": _build_nam_schedule, + "ANN": _build_ann_schedule, + "LAX": _build_lax_schedule, + "CLM": _build_clm_schedule, + } + return dispatch[contract_type](contract, terms, asa_decimals=asa_decimals) + + +def _initial_exchange_seed( + contract: ContractAttributes, + terms: NormalizedActusTerms, + asa_decimals: int, +) -> _EventSeed: + """Build the mandatory initial exchange event seed.""" + + return _EventSeed( + event_type="IED", + scheduled_time=terms.initial_exchange_date, + next_nominal_interest_rate=_rate_to_fp(contract.nominal_interest_rate), + next_principal_redemption=_initial_next_principal_redemption( + contract, terms, asa_decimals + ), + next_outstanding_principal=terms.notional_principal, + flags=enums.FLAG_NON_CASH_EVENT, + ) + + +def _build_pam_schedule( + contract: ContractAttributes, terms: NormalizedActusTerms +) -> tuple[_EventSeed, ...]: + """Build the normalized PAM event seed schedule.""" + + if terms.maturity_date is None: + raise ActusNormalizationError("PAM normalization requires maturity_date") + + seeds: list[_EventSeed] = [] + outstanding = terms.notional_principal + for ts in _interest_schedule(contract, terms): + seeds.append( + _seed_from_timestamp( + ts, + event_type="IP", + next_outstanding_principal=outstanding, + flags=enums.FLAG_CASH_EVENT, + ) + ) + seeds.extend(_rate_reset_schedule(contract, outstanding, terms.maturity_date)) + seeds.append( + _seed_from_timestamp( + terms.maturity_date, + event_type="MD", + next_outstanding_principal=0, + flags=enums.FLAG_CASH_EVENT, + ) + ) + return tuple(seeds) + + +def _build_lam_schedule( + contract: ContractAttributes, terms: NormalizedActusTerms, asa_decimals: int +) -> tuple[_EventSeed, ...]: + """Build the normalized LAM event seed schedule.""" + return _build_amortizing_schedule( + contract, terms, asa_decimals, allow_negative=False, lax=False + ) + + +def _build_nam_schedule( + contract: ContractAttributes, terms: NormalizedActusTerms, asa_decimals: int +) -> tuple[_EventSeed, ...]: + """Build the normalized NAM event seed schedule.""" + return _build_amortizing_schedule( + contract, terms, asa_decimals, allow_negative=True, lax=False + ) + + +def _build_ann_schedule( + contract: ContractAttributes, terms: NormalizedActusTerms, asa_decimals: int +) -> tuple[_EventSeed, ...]: + """Build the normalized ANN event seed schedule.""" + return _build_annuity_schedule(contract, terms, asa_decimals) + + +def _build_lax_schedule( + contract: ContractAttributes, terms: NormalizedActusTerms, asa_decimals: int +) -> tuple[_EventSeed, ...]: + """Build the normalized LAX event seed schedule.""" + return _build_amortizing_schedule( + contract, terms, asa_decimals, allow_negative=True, lax=True + ) + + +def _build_clm_schedule( + contract: ContractAttributes, terms: NormalizedActusTerms +) -> tuple[_EventSeed, ...]: + """Build the normalized CLM event seed schedule.""" + seeds: list[_EventSeed] = [] + outstanding = terms.notional_principal + if terms.maturity_date is not None: + for ts in _interest_schedule(contract, terms): + seeds.append( + _seed_from_timestamp( + ts, + event_type="IP", + next_outstanding_principal=outstanding, + flags=enums.FLAG_CASH_EVENT, + ) + ) + seeds.append( + _seed_from_timestamp( + terms.maturity_date, + event_type="MD", + next_outstanding_principal=0, + flags=enums.FLAG_CASH_EVENT, + ) + ) + seeds.extend(_rate_reset_schedule(contract, outstanding, terms.maturity_date)) + return tuple(seeds) + + +def _build_annuity_schedule( + contract: ContractAttributes, + terms: NormalizedActusTerms, + asa_decimals: int, +) -> tuple[_EventSeed, ...]: + """Build the ANN schedule including PRF recalculation events when needed.""" + if terms.maturity_date is None: + raise ActusNormalizationError( + "ANN normalization requires maturity_date or amortization_date" + ) + + pr_schedule = _principal_schedule(contract, terms, lax=False) + if not pr_schedule: + raise ActusNormalizationError( + "ANN normalization requires a principal redemption schedule" + ) + + formula_redemption_times = sorted(set(pr_schedule)) + if terms.maturity_date not in formula_redemption_times: + formula_redemption_times.append(terms.maturity_date) + + pr_anchor = contract.principal_redemption_anchor + if pr_anchor is None: + pr_anchor = terms.initial_exchange_date + + pr_cycle = contract.principal_redemption_cycle + if pr_cycle is None: + raise ActusNormalizationError( + "ANN normalization requires principal_redemption_cycle" + ) + + annuity_start = _annuity_start_timestamp( + initial_exchange_date=terms.initial_exchange_date, + principal_redemption_anchor=pr_anchor, + principal_redemption_cycle=pr_cycle, + ) + rate_fp = _rate_to_fp(contract.nominal_interest_rate) + dynamic_redemption = terms.dynamic_principal_redemption + payment_total = _resolve_annuity_payment(contract, terms, asa_decimals) + + seeds: list[_EventSeed] = [] + rr_schedule = _rate_reset_occurrences(contract, terms.maturity_date) + if dynamic_redemption: + if pr_anchor > terms.initial_exchange_date and formula_redemption_times: + prf_time = pr_anchor - cst.DAY_2_SEC + seeds.append( + _EventSeed( + event_type="PRF", + scheduled_time=prf_time, + redemption_accrual_start=annuity_start, + redemption_accrual_end=formula_redemption_times[0], + flags=enums.FLAG_NON_CASH_EVENT | enums.FLAG_INITIAL_PRF, + ) + ) + for ts, _event_type in rr_schedule: + next_redemption = next( + (value for value in formula_redemption_times if value > ts), + None, + ) + if next_redemption is None: + continue + seeds.append( + _EventSeed( + event_type="PRF", + scheduled_time=ts, + redemption_accrual_start=ts, + redemption_accrual_end=next_redemption, + flags=enums.FLAG_NON_CASH_EVENT, + ) + ) + + rr_events = dict(rr_schedule) + + outstanding = terms.notional_principal + previous_due = terms.initial_exchange_date + previous_redemption = annuity_start + for ts in pr_schedule: + due_time = ts + interest_due = _interest_minor_units( + principal=outstanding, + rate_fp=rate_fp, + start_ts=previous_due, + end_ts=due_time, + day_count_convention=terms.day_count_convention, + maturity_date=terms.maturity_date, + ) + principal_payment = min(max(payment_total - interest_due, 0), outstanding) + next_outstanding = max(outstanding - principal_payment, 0) + + seeds.append( + _seed_from_timestamp( + ts, + event_type="PR", + redemption_accrual_start=previous_redemption, + redemption_accrual_end=due_time, + next_principal_redemption=0 if dynamic_redemption else payment_total, + next_outstanding_principal=next_outstanding, + flags=enums.FLAG_CASH_EVENT, + ) + ) + seeds.append( + _seed_from_timestamp( + ts, + event_type="IP", + next_principal_redemption=0 if dynamic_redemption else payment_total, + next_outstanding_principal=next_outstanding, + flags=enums.FLAG_CASH_EVENT, + ) + ) + event_key = ts + if event_key in rr_events: + event_type = rr_events[event_key] + seeds.append( + _seed_from_timestamp( + ts, + event_type=event_type, + next_nominal_interest_rate=( + terms.rate_reset_next if event_type == "RRF" else 0 + ), + next_outstanding_principal=outstanding, + flags=enums.FLAG_NON_CASH_EVENT, + ) + ) + + outstanding = next_outstanding + previous_due = due_time + previous_redemption = due_time + + for ts, event_type in rr_schedule: + if any(ts == pr_ts for pr_ts in pr_schedule): + continue + if ts >= terms.maturity_date: + continue + seeds.append( + _seed_from_timestamp( + ts, + event_type=event_type, + next_nominal_interest_rate=( + terms.rate_reset_next if event_type == "RRF" else 0 + ), + next_outstanding_principal=outstanding, + flags=enums.FLAG_NON_CASH_EVENT, + ) + ) + + seeds.extend(_ipcb_schedule(contract, outstanding, terms.maturity_date)) + md_redemption_start = 0 + md_redemption_end = 0 + if not any(ts == terms.maturity_date for ts in pr_schedule): + md_redemption_start = previous_redemption + md_redemption_end = terms.maturity_date + seeds.append( + _seed_from_timestamp( + terms.maturity_date, + event_type="MD", + redemption_accrual_start=md_redemption_start, + redemption_accrual_end=md_redemption_end, + next_principal_redemption=0 if dynamic_redemption else payment_total, + next_outstanding_principal=0, + flags=enums.FLAG_CASH_EVENT, + ) + ) + return tuple(seeds) + + +def _build_amortizing_schedule( + contract: ContractAttributes, + terms: NormalizedActusTerms, + asa_decimals: int, + *, + allow_negative: bool, + lax: bool, +) -> tuple[_EventSeed, ...]: + """Build a generic amortizing schedule for LAM, NAM, and LAX.""" + contract_type = contract.contract_type + if terms.maturity_date is None: + raise ActusNormalizationError( + f"{contract_type} normalization requires maturity_date or amortization_date" + ) + + seeds: list[_EventSeed] = [] + outstanding = terms.notional_principal + rate_fp = _rate_to_fp(contract.nominal_interest_rate) + pr_schedule = _principal_schedule(contract, terms, lax=lax) + if not pr_schedule: + raise ActusNormalizationError( + f"{contract_type} normalization requires a principal redemption schedule" + ) + + payment_total = _to_asa_units( + contract.next_principal_redemption_amount or 0, + asa_decimals, + ) + previous_due = terms.initial_exchange_date + for index, ts in enumerate(pr_schedule): + due_time = ts + interest_due = _interest_minor_units( + principal=outstanding, + rate_fp=rate_fp, + start_ts=previous_due, + end_ts=due_time, + day_count_convention=terms.day_count_convention, + maturity_date=terms.maturity_date, + ) + principal_payment = _principal_payment_for_period( + contract, + outstanding=outstanding, + payment_total=payment_total, + interest_due=interest_due, + allow_negative=allow_negative, + annuity=False, + lax=lax, + period_index=index, + asa_decimals=asa_decimals, + ) + lax_direction = _lax_direction(contract, index) if lax else "DEC" + next_outstanding = max(outstanding - principal_payment, 0) + if lax_direction == "INC": + next_outstanding = outstanding + payment_total + + if principal_payment > 0: + seeds.append( + _seed_from_timestamp( + ts, + event_type="PR", + next_principal_redemption=payment_total, + next_outstanding_principal=next_outstanding, + flags=enums.FLAG_CASH_EVENT, + ) + ) + elif lax: + seeds.append( + _seed_from_timestamp( + ts, + event_type="PI", + next_principal_redemption=payment_total, + next_outstanding_principal=next_outstanding, + flags=enums.FLAG_NON_CASH_EVENT, + ) + ) + + if interest_due > 0 or due_time == terms.maturity_date: + seeds.append( + _seed_from_timestamp( + ts, + event_type="IP", + next_principal_redemption=payment_total, + next_outstanding_principal=next_outstanding, + flags=enums.FLAG_CASH_EVENT, + ) + ) + + outstanding = next_outstanding + previous_due = due_time + + seeds.extend(_rate_reset_schedule(contract, outstanding, terms.maturity_date)) + seeds.extend(_ipcb_schedule(contract, outstanding, terms.maturity_date)) + if outstanding: + seeds.append( + _seed_from_timestamp( + terms.maturity_date, + event_type="MD", + next_principal_redemption=payment_total, + next_outstanding_principal=0, + flags=enums.FLAG_CASH_EVENT, + ) + ) + return tuple(seeds) + + +def _principal_payment_for_period( + contract: ContractAttributes, + *, + outstanding: int, + payment_total: int, + interest_due: int, + allow_negative: bool, + annuity: bool, + lax: bool, + period_index: int, + asa_decimals: int, +) -> int: + """Resolve the principal cashflow for one amortizing period.""" + if lax and contract.array_pr_next is not None: + pr_values = tuple( + _to_asa_units(value, asa_decimals) for value in contract.array_pr_next + ) + if period_index < len(pr_values): + payment_total = pr_values[period_index] + + if annuity: + return min(max(payment_total - interest_due, 0), outstanding) + + if allow_negative: + candidate = payment_total - interest_due + return min(max(candidate, 0), outstanding) + + return min(max(payment_total, 0), outstanding) + + +def _principal_schedule( + contract: ContractAttributes, + terms: NormalizedActusTerms, + *, + lax: bool, +) -> tuple[int, ...]: + """Resolve the principal redemption occurrence schedule.""" + + if lax and contract.array_pr_anchor is not None: + anchors = tuple(ts for ts in contract.array_pr_anchor) + cycles = tuple(contract.array_pr_cycle or ()) + increases = tuple(value for value in contract.array_increase_decrease or ()) + if increases and len(increases) != len(contract.array_pr_anchor): + raise ActusNormalizationError( + "LAX array_pr_* schedules must have aligned lengths" + ) + if cycles: + timestamps = resolve_array_schedule( + anchors, + cycles, + terms.maturity_date, + end_of_month_convention=contract.end_of_month_convention, + business_day_convention=contract.business_day_convention, + calendar=contract.calendar, + ) + else: + timestamps = tuple(anchor for anchor in anchors) + return tuple( + ts + for ts in _deduplicate_timestamps(timestamps) + if terms.initial_exchange_date < ts <= terms.maturity_date + ) + + anchor = contract.principal_redemption_anchor + cycle = contract.principal_redemption_cycle + if anchor is None or cycle is None or terms.maturity_date is None: + return () + timestamps = resolve_cycle_schedule( + anchor, + cycle, + terms.maturity_date, + end_of_month_convention=contract.end_of_month_convention, + business_day_convention=contract.business_day_convention, + calendar=contract.calendar, + ) + if cycle.stub == "+" and timestamps: + if timestamps[-1] != terms.maturity_date: + timestamps = timestamps[:-1] + return tuple( + ts + for ts in timestamps + if terms.initial_exchange_date <= ts < terms.maturity_date + ) + + +def _interest_schedule( + contract: ContractAttributes, + terms: NormalizedActusTerms, +) -> tuple[UTCTimeStamp, ...]: + """Resolve the interest payment occurrence schedule.""" + + anchor = contract.interest_payment_anchor + cycle = contract.interest_payment_cycle + if anchor is None or cycle is None or terms.maturity_date is None: + return () + + timestamps = list( + resolve_cycle_schedule( + anchor, + cycle, + terms.maturity_date, + end_of_month_convention=contract.end_of_month_convention, + business_day_convention=contract.business_day_convention, + calendar=contract.calendar, + ) + ) + timestamps = [ + ts + for ts in timestamps + if terms.initial_exchange_date < ts <= terms.maturity_date + ] + if timestamps: + md_present = terms.maturity_date in timestamps + if not md_present: + maturity_date = terms.maturity_date + if str(cycle).upper().endswith("+"): + timestamps[-1] = maturity_date + else: + timestamps.append(maturity_date) + return tuple(_deduplicate_timestamps(timestamps)) + + +def _rate_reset_schedule( + contract: ContractAttributes, + outstanding: int, + maturity_date: int | None, +) -> tuple[_EventSeed, ...]: + """Build non-cash RR/RRF seeds from the normalized reset schedule.""" + if maturity_date is None: + return () + next_rate = ( + _rate_to_fp( + contract.rate_reset_next + if contract.rate_reset_next is not None + else contract.nominal_interest_rate + ), + ) + return tuple( + _seed_from_timestamp( + ts, + event_type=event_type, + next_nominal_interest_rate=next_rate if event_type == "RRF" else 0, + next_outstanding_principal=outstanding, + flags=enums.FLAG_NON_CASH_EVENT, + ) + for ts, event_type in _rate_reset_occurrences(contract, maturity_date) + ) + + +def _rate_reset_occurrences( + contract: ContractAttributes, + maturity_date: int | None, +) -> tuple[tuple[int, str], ...]: + """Resolve rate reset occurrences and label them as RR or RRF.""" + anchor = contract.rate_reset_anchor + cycle = contract.rate_reset_cycle + if anchor is None or cycle is None or maturity_date is None: + return () + + timestamps = tuple( + ts + for ts in resolve_cycle_schedule( + anchor, + cycle, + maturity_date, + end_of_month_convention=contract.end_of_month_convention, + business_day_convention=contract.business_day_convention, + calendar=contract.calendar, + ) + if ts < maturity_date + ) + if not timestamps: + return () + + first_is_rrf = contract.rate_reset_next is not None + return tuple( + (ts, "RRF" if first_is_rrf and index == 0 else "RR") + for index, ts in enumerate(timestamps) + ) + + +def _ipcb_schedule( + contract: ContractAttributes, + outstanding: int, + maturity_date: int | None, +) -> tuple[_EventSeed, ...]: + """Build IPCB seeds for interest calculation base adjustments.""" + anchor = contract.interest_calculation_base_anchor + cycle = contract.interest_calculation_base_cycle + if anchor is None or cycle is None or maturity_date is None: + return () + return tuple( + _seed_from_timestamp( + ts, + event_type="IPCB", + next_outstanding_principal=outstanding, + flags=enums.FLAG_NON_CASH_EVENT, + ) + for ts in resolve_cycle_schedule( + anchor, + cycle, + maturity_date, + end_of_month_convention=contract.end_of_month_convention, + business_day_convention=contract.business_day_convention, + calendar=contract.calendar, + ) + if ts <= maturity_date + ) + + +def _seed_from_preprocessed( + event_id: int, item: ObservedEventRequest | ExecutionScheduleEntry +) -> _EventSeed: + """Convert a preprocessed event payload into an intermediate event seed.""" + if isinstance(item, ExecutionScheduleEntry): + return _EventSeed( + event_type=item.event_type, + scheduled_time=item.scheduled_time, + accrual_factor=item.accrual_factor, + redemption_accrual_factor=item.redemption_accrual_factor, + next_nominal_interest_rate=item.next_nominal_interest_rate, + next_principal_redemption=item.next_principal_redemption, + next_outstanding_principal=item.next_outstanding_principal, + flags=item.flags, + ) + entry = item.to_schedule_entry(event_id) + return _seed_from_preprocessed(event_id, entry) + + +def _seed_sort_key(seed: _EventSeed) -> tuple[int, int, str]: + """Return the deterministic ACTUS event ordering key for a seed.""" + priority = EVENT_SCHEDULE_PRIORITY.get(seed.event_type, 99) + return seed.scheduled_time, priority, seed.event_type + + +def _initial_next_principal_redemption( + contract: ContractAttributes, + terms: NormalizedActusTerms, + asa_decimals: int, +) -> int: + """Resolve the initial next principal redemption term for the first IED state.""" + if contract.contract_type != "ANN": + return _to_asa_units(contract.next_principal_redemption_amount, asa_decimals) + return _resolve_annuity_payment(contract, terms, asa_decimals) + + +def _resolve_annuity_payment( + contract: ContractAttributes, + terms: NormalizedActusTerms, + asa_decimals: int, +) -> int: + """Resolve the initial annuity payment amount from terms or formula.""" + + payment_total = _to_asa_units( + contract.next_principal_redemption_amount, asa_decimals + ) + if not terms.dynamic_principal_redemption and payment_total > 0: + return payment_total + + if contract.maturity_date is None or contract.amortization_date is None: + raise ActusNormalizationError( + "ANN normalization requires maturity_date or amortization_date" + ) + + pr_schedule = _principal_schedule(contract, terms, lax=False) + if not pr_schedule: + raise ActusNormalizationError( + "ANN normalization requires a principal redemption schedule" + ) + + formula_redemption_dates = sorted(set(pr_schedule)) + if terms.maturity_date not in formula_redemption_dates: + formula_redemption_dates.append(terms.maturity_date) + + pr_anchor = contract.principal_redemption_anchor + if pr_anchor is None: + pr_anchor = terms.initial_exchange_date + pr_cycle = contract.principal_redemption_cycle + if pr_cycle is None: + raise ActusNormalizationError( + "ANN normalization requires principal_redemption_cycle" + ) + + annuity_start = _annuity_start_timestamp( + initial_exchange_date=terms.initial_exchange_date, + principal_redemption_anchor=pr_anchor, + principal_redemption_cycle=pr_cycle, + ) + return _calculate_annuity_payment( + start_ts=annuity_start, + redemption_schedule=formula_redemption_dates, + notional=terms.notional_principal, + accrued_interest=0, + rate_fp=_rate_to_fp(contract.nominal_interest_rate), + day_count_convention=terms.day_count_convention, + maturity_date=terms.maturity_date, + ) + + +def _lax_direction(contract: ContractAttributes, period_index: int) -> str: + """Return whether a LAX period decreases or increases principal.""" + directions = tuple( + str(value).upper() for value in contract.array_increase_decrease or () + ) + if period_index < len(directions): + return directions[period_index] + return "DEC" + + +def _interest_minor_units( + *, + principal: int, + rate_fp: int, + start_ts: int, + end_ts: int, + day_count_convention: int, + maturity_date: int | None, +) -> int: + """Compute interest in minor units for a principal and accrual interval.""" + if rate_fp <= 0 or end_ts <= start_ts: + return 0 + year_fraction = year_fraction_fixed( + start_ts, + end_ts, + day_count_convention=day_count_convention, + maturity_date=maturity_date, + ) + return ( + principal + * rate_fp + * year_fraction + // cst.FIXED_POINT_SCALE + // cst.FIXED_POINT_SCALE + ) + + +def _subtract_one_cycle(timestamp: UTCTimeStamp, cycle: Cycle) -> int: + """Move one ACTUS cycle backward from a timestamp.""" + + if cycle.unit == "D": + return timestamp - cycle.count * cst.DAY_2_SEC + + if cycle.unit == "W": + return timestamp - cycle.count * 7 * cst.DAY_2_SEC + + month_delta_map = {"M": 1, "Q": 3, "H": 6, "Y": 12} + if cycle.unit not in month_delta_map: + raise ActusNormalizationError(f"Unsupported ACTUS cycle unit: {cycle.unit}") + + current = timestamp_to_datetime(timestamp) + months = cycle.count * month_delta_map[cycle.unit] + month_index = (current.month - 1) - months + year = current.year + month_index // 12 + month = (month_index % 12) + 1 + day = min(current.day, days_in_month(year, month)) + return datetime_to_timestamp(current.replace(year=year, month=month, day=day)) + + +def _annuity_start_timestamp( + *, + initial_exchange_date: UTCTimeStamp, + principal_redemption_anchor: UTCTimeStamp, + principal_redemption_cycle: Cycle, +) -> int: + """Return the start timestamp used by the ANN payment formula.""" + return max( + initial_exchange_date, + _subtract_one_cycle(principal_redemption_anchor, principal_redemption_cycle), + ) + + +def _calculate_annuity_payment( + *, + start_ts: int, + redemption_schedule: Sequence[int], + notional: int, + accrued_interest: int, + rate_fp: int, + day_count_convention: int, + maturity_date: int | None, +) -> int: + """Calculate an annuity payment from a redemption schedule and rate path.""" + remaining = tuple(due_ts for due_ts in redemption_schedule if due_ts > start_ts) + if not remaining: + return 0 + + discount_fp = cst.FIXED_POINT_SCALE + denominator_fp = 0 + previous_ts = start_ts + for due_ts in remaining: + period_factor = year_fraction_fixed( + previous_ts, + due_ts, + day_count_convention=day_count_convention, + maturity_date=maturity_date, + ) + period_rate = cst.FIXED_POINT_SCALE + ( + rate_fp * period_factor // cst.FIXED_POINT_SCALE + ) + if period_rate <= 0: + raise ActusNormalizationError( + "Invalid ANN redemption schedule discount factor" + ) + discount_fp = discount_fp * cst.FIXED_POINT_SCALE // period_rate + denominator_fp += discount_fp + previous_ts = due_ts + + if denominator_fp <= 0: + raise ActusNormalizationError( + "ANN normalization requires a positive annuity denominator" + ) + numerator = max(notional, 0) + max(accrued_interest, 0) + return numerator * cst.FIXED_POINT_SCALE // denominator_fp + + +def _seed_from_timestamp( + timestamp: UTCTimeStamp, + *, + event_type: str, + redemption_accrual_start: UTCTimeStamp = 0, + redemption_accrual_end: UTCTimeStamp = 0, + next_nominal_interest_rate: int = 0, + next_principal_redemption: int = 0, + next_outstanding_principal: int = 0, + flags: int = 0, +) -> _EventSeed: + """Create an intermediate event seed from a resolved schedule timestamp.""" + return _EventSeed( + event_type=event_type, + scheduled_time=timestamp, + redemption_accrual_start=redemption_accrual_start, + redemption_accrual_end=redemption_accrual_end, + next_nominal_interest_rate=next_nominal_interest_rate, + next_principal_redemption=next_principal_redemption, + next_outstanding_principal=next_outstanding_principal, + flags=flags, + ) From 6768cf599548a9a9a767daad173d547e5f7b759a Mon Sep 17 00:00:00 2001 From: cusma Date: Wed, 11 Mar 2026 12:24:29 +0100 Subject: [PATCH 028/244] chore: fix --- src/contracts.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/contracts.py b/src/contracts.py index 334de287..58de795c 100644 --- a/src/contracts.py +++ b/src/contracts.py @@ -119,7 +119,7 @@ def make_pam_zero_coupon_bond( maturity_date=maturity_date, notional_principal=notional_principal, premium_discount_at_ied=premium_discount_at_ied, - nominal_interest_rate=0.0, + nominal_interest_rate=0, day_count_convention=day_count_convention, business_day_convention=business_day_convention, end_of_month_convention=end_of_month_convention, @@ -150,6 +150,7 @@ def make_pam_fixed_coupon_bond_profile( initial_exchange_date=initial_exchange_date, maturity_date=maturity_date, notional_principal=notional_principal, + premium_discount_at_ied=0, nominal_interest_rate=nominal_interest_rate, day_count_convention=day_count_convention, business_day_convention=business_day_convention, From 333b128a00091b72965b930bd643d857d5967064 Mon Sep 17 00:00:00 2001 From: cusma Date: Wed, 11 Mar 2026 12:28:01 +0100 Subject: [PATCH 029/244] chore: fix --- src/normalization.py | 35 ++++++++++++++++++++++++++++------- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/src/normalization.py b/src/normalization.py index a87fbab6..55792be4 100644 --- a/src/normalization.py +++ b/src/normalization.py @@ -159,6 +159,13 @@ def normalize_contract_attributes( "D-ASA requires status_date to be strictly before initial_exchange_date" ) + # Extract base contract type (e.g., "PAM" from "PAM:ZCB") + base_contract_type = ( + contract.contract_type.split(":")[0] + if ":" in contract.contract_type + else contract.contract_type + ) + pdied_asa = _compute_initial_exchange_amount( contract.notional_principal, contract.premium_discount_at_ied, @@ -169,7 +176,7 @@ def normalize_contract_attributes( terms = NormalizedActusTerms( # Contract contract_id=contract.contract_id, - contract_type=CONTRACT_TYPE_IDS[contract.contract_type], + contract_type=CONTRACT_TYPE_IDS[base_contract_type], # Denomination denomination_asset_id=denomination_asset_id, # Time @@ -241,6 +248,11 @@ def _normalize_schedule( asa_decimals: int, ) -> tuple[ExecutionScheduleEntry, ...]: """Turn intermediate event seeds into AVM schedule entries.""" + # Extract base contract type + base_contract_type = ( + contract_type.split(":")[0] if ":" in contract_type else contract_type + ) + if preprocessed_events is not None: seeds = [ _seed_from_preprocessed(index, item) @@ -249,7 +261,7 @@ def _normalize_schedule( else: seeds = list( _build_schedule_seeds( - contract, terms, contract_type=contract_type, asa_decimals=asa_decimals + contract, terms, contract_type=base_contract_type, asa_decimals=asa_decimals ) ) @@ -257,13 +269,13 @@ def _normalize_schedule( seeds.append(_initial_exchange_seed(contract, terms, asa_decimals=asa_decimals)) ordered = sorted(seeds, key=_seed_sort_key) - allowed = ALLOWED_EVENT_TYPES[contract_type] + allowed = ALLOWED_EVENT_TYPES[base_contract_type] entries: list[ExecutionScheduleEntry] = [] previous_ts = status_date for event_id, seed in enumerate(ordered): if seed.event_type not in allowed: raise UnsupportedActusFeatureError( - f"Unsupported event {seed.event_type} for {contract_type}" + f"Unsupported event {seed.event_type} for {base_contract_type}" ) if seed.event_type != "IED" and seed.scheduled_time < previous_ts: raise ActusNormalizationError( @@ -316,15 +328,22 @@ def _build_schedule_seeds( asa_decimals: int, ) -> tuple[_EventSeed, ...]: """Dispatch contract-type-specific schedule construction.""" + # PAM and CLM don't require asa_decimals + if contract_type in ("PAM", "CLM"): + dispatch = { + "PAM": _build_pam_schedule, + "CLM": _build_clm_schedule, + } + return dispatch[contract_type](contract, terms) + + # Other contract types require asa_decimals dispatch = { - "PAM": _build_pam_schedule, "LAM": _build_lam_schedule, "NAM": _build_nam_schedule, "ANN": _build_ann_schedule, "LAX": _build_lax_schedule, - "CLM": _build_clm_schedule, } - return dispatch[contract_type](contract, terms, asa_decimals=asa_decimals) + return dispatch[contract_type](contract, terms, asa_decimals) def _initial_exchange_seed( @@ -951,6 +970,8 @@ def _initial_next_principal_redemption( ) -> int: """Resolve the initial next principal redemption term for the first IED state.""" if contract.contract_type != "ANN": + if contract.next_principal_redemption_amount is None: + return 0 return _to_asa_units(contract.next_principal_redemption_amount, asa_decimals) return _resolve_annuity_payment(contract, terms, asa_decimals) From f865d67a7ab4f2e32fa5262b57d294b789b3f380 Mon Sep 17 00:00:00 2001 From: cusma Date: Wed, 11 Mar 2026 12:28:14 +0100 Subject: [PATCH 030/244] test: contract attributes --- tests/sdk/test_contracts.py | 462 ++++++++++++++++++++++++++++++++++++ 1 file changed, 462 insertions(+) create mode 100644 tests/sdk/test_contracts.py diff --git a/tests/sdk/test_contracts.py b/tests/sdk/test_contracts.py new file mode 100644 index 00000000..5cc9c883 --- /dev/null +++ b/tests/sdk/test_contracts.py @@ -0,0 +1,462 @@ +"""Tests for the contracts module.""" + +import pytest +from decimal import Decimal + +from src.contracts import ( + ContractAttributes, + make_pam_zero_coupon_bond, + make_pam_fixed_coupon_bond_profile, +) +from src.day_count import ( + BusinessDayConvention, + Calendar, + DayCountConvention, + EndOfMonthConvention, +) +from src.errors import UnsupportedActusFeatureError +from src.schedule import Cycle + + +class TestContractAttributes: + """Test ContractAttributes dataclass validation and creation.""" + + def test_basic_contract_creation(self): + """Test creating a basic valid contract.""" + contract = ContractAttributes( + contract_id=1, + contract_type="PAM", + status_date=1000000, + initial_exchange_date=1100000, + maturity_date=2000000, + notional_principal=1000000, + premium_discount_at_ied=0, + ) + assert contract.contract_id == 1 + assert contract.contract_type == "PAM" + assert contract.notional_principal == 1000000 + assert contract.nominal_interest_rate == 0 + + def test_contract_with_interest(self): + """Test creating a contract with interest attributes.""" + contract = ContractAttributes( + contract_id=2, + contract_type="PAM", + status_date=1000000, + initial_exchange_date=1100000, + maturity_date=2000000, + notional_principal=1000000, + premium_discount_at_ied=10000, + nominal_interest_rate=0.05, + interest_payment_cycle=Cycle(count=3, unit="M"), + interest_payment_anchor=1100000, + ) + assert contract.nominal_interest_rate == 0.05 + assert contract.premium_discount_at_ied == 10000 + assert contract.interest_payment_cycle.count == 3 + assert contract.interest_payment_cycle.unit == "M" + + def test_contract_with_day_count_conventions(self): + """Test contract with various day count conventions.""" + for dcc in [ + DayCountConvention.A360, + DayCountConvention.A365, + DayCountConvention.AA, + DayCountConvention.THIRTY_E_360, + DayCountConvention.THIRTY_E_360_ISDA, + ]: + contract = ContractAttributes( + contract_id=1, + contract_type="PAM", + status_date=1000000, + initial_exchange_date=1100000, + maturity_date=2000000, + notional_principal=1000000, + premium_discount_at_ied=0, + day_count_convention=dcc, + ) + assert contract.day_count_convention == dcc + + def test_contract_with_business_day_conventions(self): + """Test contract with supported business day conventions.""" + # Test supported BDC + contract = ContractAttributes( + contract_id=1, + contract_type="PAM", + status_date=1000000, + initial_exchange_date=1100000, + maturity_date=2000000, + notional_principal=1000000, + premium_discount_at_ied=0, + business_day_convention=BusinessDayConvention.NOS, + ) + assert contract.business_day_convention == BusinessDayConvention.NOS + + def test_unsupported_contract_type_raises_error(self): + """Test that unsupported contract types raise an error.""" + with pytest.raises(UnsupportedActusFeatureError, match="Unsupported ACTUS contract type"): + ContractAttributes( + contract_id=1, + contract_type="INVALID", + status_date=1000000, + initial_exchange_date=1100000, + maturity_date=2000000, + notional_principal=1000000, + premium_discount_at_ied=0, + ) + + def test_unsupported_business_day_convention_raises_error(self): + """Test that unsupported business day conventions raise an error.""" + with pytest.raises(UnsupportedActusFeatureError, match="Unsupported business day convention"): + ContractAttributes( + contract_id=1, + contract_type="PAM", + status_date=1000000, + initial_exchange_date=1100000, + maturity_date=2000000, + notional_principal=1000000, + premium_discount_at_ied=0, + business_day_convention=BusinessDayConvention.CSF, # Rejected BDC + ) + + def test_supported_contract_types(self): + """Test all supported contract types.""" + for contract_type in ["PAM", "LAM", "NAM", "ANN", "LAX", "CLM"]: + contract = ContractAttributes( + contract_id=1, + contract_type=contract_type, + status_date=1000000, + initial_exchange_date=1100000, + maturity_date=2000000, + notional_principal=1000000, + premium_discount_at_ied=0, + ) + assert contract.contract_type == contract_type + + def test_contract_with_subtype_notation(self): + """Test contract with subtype notation like PAM:ZCB.""" + contract = ContractAttributes( + contract_id=1, + contract_type="PAM:ZCB", + status_date=1000000, + initial_exchange_date=1100000, + maturity_date=2000000, + notional_principal=1000000, + premium_discount_at_ied=50000, + ) + assert contract.contract_type == "PAM:ZCB" + + def test_contract_with_rate_reset_parameters(self): + """Test contract with rate reset parameters.""" + contract = ContractAttributes( + contract_id=1, + contract_type="PAM", + status_date=1000000, + initial_exchange_date=1100000, + maturity_date=2000000, + notional_principal=1000000, + premium_discount_at_ied=0, + rate_reset_spread=0.02, + rate_reset_multiplier=1.5, + rate_reset_floor=0.01, + rate_reset_cap=0.10, + rate_reset_next=0.05, + rate_reset_cycle=Cycle(count=6, unit="M"), + rate_reset_anchor=1200000, + ) + assert contract.rate_reset_spread == 0.02 + assert contract.rate_reset_multiplier == 1.5 + assert contract.rate_reset_floor == 0.01 + assert contract.rate_reset_cap == 0.10 + assert contract.rate_reset_next == 0.05 + + def test_contract_with_principal_redemption(self): + """Test contract with principal redemption parameters.""" + contract = ContractAttributes( + contract_id=1, + contract_type="LAM", + status_date=1000000, + initial_exchange_date=1100000, + maturity_date=2000000, + notional_principal=1000000, + premium_discount_at_ied=0, + next_principal_redemption_amount=100000, + principal_redemption_cycle=Cycle(count=1, unit="Q"), + principal_redemption_anchor=1200000, + ) + assert contract.next_principal_redemption_amount == 100000 + assert contract.principal_redemption_cycle.count == 1 + assert contract.principal_redemption_cycle.unit == "Q" + + def test_contract_with_decimal_values(self): + """Test contract with Decimal values for high precision.""" + contract = ContractAttributes( + contract_id=1, + contract_type="PAM", + status_date=1000000, + initial_exchange_date=1100000, + maturity_date=2000000, + notional_principal=Decimal("1000000.00"), + premium_discount_at_ied=Decimal("5000.50"), + nominal_interest_rate=Decimal("0.0375"), + ) + assert contract.notional_principal == Decimal("1000000.00") + assert contract.premium_discount_at_ied == Decimal("5000.50") + assert contract.nominal_interest_rate == Decimal("0.0375") + + def test_contract_with_lax_arrays(self): + """Test LAX contract with array schedules.""" + contract = ContractAttributes( + contract_id=1, + contract_type="LAX", + status_date=1000000, + initial_exchange_date=1100000, + maturity_date=2000000, + notional_principal=1000000, + premium_discount_at_ied=0, + array_pr_anchor=[1200000, 1300000, 1400000], + array_pr_cycle=[Cycle(1, "M"), Cycle(1, "M"), Cycle(1, "M")], + array_pr_next=[10000, 20000, 30000], + array_increase_decrease=["DEC", "DEC", "DEC"], + ) + assert len(contract.array_pr_anchor) == 3 + assert len(contract.array_pr_cycle) == 3 + assert len(contract.array_pr_next) == 3 + assert len(contract.array_increase_decrease) == 3 + + +class TestMakePamZeroCouponBond: + """Test the make_pam_zero_coupon_bond helper function.""" + + def test_basic_zero_coupon_bond(self): + """Test creating a basic zero coupon bond.""" + contract = make_pam_zero_coupon_bond( + contract_id=100, + status_date=1000000, + initial_exchange_date=1100000, + maturity_date=2000000, + notional_principal=1000000, + premium_discount_at_ied=50000, + ) + assert contract.contract_id == 100 + assert contract.contract_type == "PAM:ZCB" + assert contract.notional_principal == 1000000 + assert contract.premium_discount_at_ied == 50000 + assert contract.nominal_interest_rate == 0 + assert contract.maturity_date == 2000000 + + def test_zero_coupon_bond_with_custom_conventions(self): + """Test ZCB with custom day count and business day conventions.""" + contract = make_pam_zero_coupon_bond( + contract_id=101, + status_date=1000000, + initial_exchange_date=1100000, + maturity_date=2000000, + notional_principal=500000, + premium_discount_at_ied=25000, + day_count_convention=DayCountConvention.AA, + business_day_convention=BusinessDayConvention.SCF, + end_of_month_convention=EndOfMonthConvention.EOM, + calendar=Calendar.MF, + ) + assert contract.day_count_convention == DayCountConvention.AA + assert contract.business_day_convention == BusinessDayConvention.SCF + assert contract.end_of_month_convention == EndOfMonthConvention.EOM + assert contract.calendar == Calendar.MF + + def test_zero_coupon_bond_with_no_discount(self): + """Test ZCB with no premium/discount (at par).""" + contract = make_pam_zero_coupon_bond( + contract_id=102, + status_date=1000000, + initial_exchange_date=1100000, + maturity_date=2000000, + notional_principal=1000000, + premium_discount_at_ied=0, + ) + assert contract.premium_discount_at_ied == 0 + + def test_zero_coupon_bond_with_float_values(self): + """Test ZCB with float values.""" + contract = make_pam_zero_coupon_bond( + contract_id=103, + status_date=1000000, + initial_exchange_date=1100000, + maturity_date=2000000, + notional_principal=1000000.0, + premium_discount_at_ied=75000.5, + ) + assert contract.notional_principal == 1000000.0 + assert contract.premium_discount_at_ied == 75000.5 + + +class TestMakePamFixedCouponBondProfile: + """Test the make_pam_fixed_coupon_bond_profile helper function.""" + + def test_basic_fixed_coupon_bond(self): + """Test creating a basic fixed coupon bond.""" + contract = make_pam_fixed_coupon_bond_profile( + contract_id=200, + status_date=1000000, + initial_exchange_date=1100000, + maturity_date=2000000, + notional_principal=1000000, + nominal_interest_rate=0.05, + interest_payment_cycle=Cycle(count=6, unit="M"), + interest_payment_anchor=1100000, + ) + assert contract.contract_id == 200 + assert contract.contract_type == "PAM:FCB" + assert contract.notional_principal == 1000000 + assert contract.nominal_interest_rate == 0.05 + assert contract.interest_payment_cycle.count == 6 + assert contract.interest_payment_cycle.unit == "M" + assert contract.interest_payment_anchor == 1100000 + + def test_fixed_coupon_bond_quarterly_payments(self): + """Test FCB with quarterly interest payments.""" + contract = make_pam_fixed_coupon_bond_profile( + contract_id=201, + status_date=1000000, + initial_exchange_date=1100000, + maturity_date=2000000, + notional_principal=2000000, + nominal_interest_rate=0.04, + interest_payment_cycle=Cycle(count=1, unit="Q"), + interest_payment_anchor=1100000, + ) + assert contract.interest_payment_cycle.count == 1 + assert contract.interest_payment_cycle.unit == "Q" + assert contract.nominal_interest_rate == 0.04 + + def test_fixed_coupon_bond_with_custom_conventions(self): + """Test FCB with custom conventions.""" + contract = make_pam_fixed_coupon_bond_profile( + contract_id=202, + status_date=1000000, + initial_exchange_date=1100000, + maturity_date=2000000, + notional_principal=1500000, + nominal_interest_rate=0.035, + interest_payment_cycle=Cycle(count=1, unit="Y"), + interest_payment_anchor=1100000, + day_count_convention=DayCountConvention.THIRTY_E_360, + business_day_convention=BusinessDayConvention.SCMF, + end_of_month_convention=EndOfMonthConvention.EOM, + calendar=Calendar.MF, + ) + assert contract.day_count_convention == DayCountConvention.THIRTY_E_360 + assert contract.business_day_convention == BusinessDayConvention.SCMF + assert contract.end_of_month_convention == EndOfMonthConvention.EOM + assert contract.calendar == Calendar.MF + + def test_fixed_coupon_bond_with_decimal_rate(self): + """Test FCB with Decimal interest rate.""" + contract = make_pam_fixed_coupon_bond_profile( + contract_id=203, + status_date=1000000, + initial_exchange_date=1100000, + maturity_date=2000000, + notional_principal=Decimal("1000000"), + nominal_interest_rate=Decimal("0.0425"), + interest_payment_cycle=Cycle(count=3, unit="M"), + interest_payment_anchor=1100000, + ) + assert contract.nominal_interest_rate == Decimal("0.0425") + + def test_fixed_coupon_bond_monthly_payments(self): + """Test FCB with monthly interest payments.""" + contract = make_pam_fixed_coupon_bond_profile( + contract_id=204, + status_date=1000000, + initial_exchange_date=1100000, + maturity_date=2000000, + notional_principal=750000, + nominal_interest_rate=0.06, + interest_payment_cycle=Cycle(count=1, unit="M"), + interest_payment_anchor=1100000, + ) + assert contract.interest_payment_cycle.count == 1 + assert contract.interest_payment_cycle.unit == "M" + assert contract.nominal_interest_rate == 0.06 + + +class TestContractAttributesDefaults: + """Test default values for ContractAttributes.""" + + def test_default_interest_values(self): + """Test that interest-related defaults are correct.""" + contract = ContractAttributes( + contract_id=1, + contract_type="PAM", + status_date=1000000, + initial_exchange_date=1100000, + maturity_date=2000000, + notional_principal=1000000, + premium_discount_at_ied=0, + ) + assert contract.nominal_interest_rate == 0 + assert contract.rate_reset_spread == 0 + assert contract.rate_reset_multiplier == 1 + assert contract.rate_reset_floor == 0 + assert contract.rate_reset_cap == 0 + + def test_default_conventions(self): + """Test that convention defaults are correct.""" + contract = ContractAttributes( + contract_id=1, + contract_type="PAM", + status_date=1000000, + initial_exchange_date=1100000, + maturity_date=2000000, + notional_principal=1000000, + premium_discount_at_ied=0, + ) + assert contract.day_count_convention == DayCountConvention.A360 + assert contract.business_day_convention == BusinessDayConvention.NOS + assert contract.end_of_month_convention == EndOfMonthConvention.SD + assert contract.calendar == Calendar.NC + + def test_default_optional_fields(self): + """Test that optional fields default to None.""" + contract = ContractAttributes( + contract_id=1, + contract_type="PAM", + status_date=1000000, + initial_exchange_date=1100000, + maturity_date=2000000, + notional_principal=1000000, + premium_discount_at_ied=0, + ) + assert contract.next_principal_redemption_amount is None + assert contract.principal_redemption_cycle is None + assert contract.principal_redemption_anchor is None + assert contract.interest_payment_anchor is None + assert contract.interest_payment_cycle is None + assert contract.rate_reset_next is None + assert contract.array_pr_anchor is None + assert contract.array_pr_cycle is None + assert contract.array_pr_next is None + assert contract.array_increase_decrease is None + + +class TestContractImmutability: + """Test that ContractAttributes is immutable (frozen=True).""" + + def test_contract_is_frozen(self): + """Test that contract attributes cannot be modified after creation.""" + contract = ContractAttributes( + contract_id=1, + contract_type="PAM", + status_date=1000000, + initial_exchange_date=1100000, + maturity_date=2000000, + notional_principal=1000000, + premium_discount_at_ied=0, + ) + with pytest.raises(AttributeError): + contract.contract_id = 2 + with pytest.raises(AttributeError): + contract.notional_principal = 2000000 + + From 76d40e6ca51316afc26359499af2540b458d2d5d Mon Sep 17 00:00:00 2001 From: cusma Date: Wed, 11 Mar 2026 12:28:21 +0100 Subject: [PATCH 031/244] test: normalization --- tests/sdk/test_normalization.py | 783 ++++++++++++++++++++++++++++++++ 1 file changed, 783 insertions(+) create mode 100644 tests/sdk/test_normalization.py diff --git a/tests/sdk/test_normalization.py b/tests/sdk/test_normalization.py new file mode 100644 index 00000000..0a19f72f --- /dev/null +++ b/tests/sdk/test_normalization.py @@ -0,0 +1,783 @@ +"""Tests for the normalization module.""" + +import pytest +from decimal import Decimal + +from smart_contracts import constants as cst +from smart_contracts import enums + +from src.normalization import ( + normalize_contract_attributes, + _to_asa_units, + _rate_to_fp, + _compute_initial_exchange_amount, + _deduplicate_timestamps, +) +from src.contracts import ( + ContractAttributes, + make_pam_zero_coupon_bond, + make_pam_fixed_coupon_bond_profile, +) +from src.errors import ActusNormalizationError +from src.schedule import Cycle +from src.models import NormalizedActusTerms, ExecutionScheduleEntry + + +class TestToAsaUnits: + """Test the _to_asa_units helper function.""" + + def test_integer_conversion(self): + """Test converting integer amounts to ASA units.""" + assert _to_asa_units(100, 2) == 10000 + assert _to_asa_units(1000, 0) == 1000 + assert _to_asa_units(50, 3) == 50000 + + def test_float_conversion(self): + """Test converting float amounts to ASA units.""" + result = _to_asa_units(100.5, 2) + assert result == 10050 + assert isinstance(result, int) + + def test_decimal_conversion(self): + """Test converting Decimal amounts to ASA units.""" + result = _to_asa_units(Decimal("100.42"), 3) + assert result == 100420 + assert isinstance(result, int) + + def test_zero_decimals(self): + """Test conversion with zero decimal places.""" + assert _to_asa_units(100, 0) == 100 + + def test_high_decimal_places(self): + """Test conversion with high decimal places.""" + result = _to_asa_units(1, 10) + assert result == 10_000_000_000 + assert isinstance(result, int) + + def test_unsupported_type_raises_error(self): + """Test that unsupported types raise TypeError.""" + with pytest.raises(TypeError, match="Unsupported value type"): + _to_asa_units("100", 2) + with pytest.raises(TypeError, match="Unsupported value type"): + _to_asa_units(None, 2) + + def test_exceeds_uint64_raises_error(self): + """Test that values exceeding uint64 max raise error.""" + # A large amount that when multiplied by scale exceeds uint64 max + with pytest.raises(ActusNormalizationError, match="exceeds uint64 bounds"): + _to_asa_units(cst.MAX_UINT64 * 2, 2) + + +class TestRateToFp: + """Test the _rate_to_fp helper function.""" + + def test_integer_rate_conversion(self): + """Test converting integer rates to fixed point.""" + result = _rate_to_fp(1) + assert result == cst.FIXED_POINT_SCALE + assert isinstance(result, int) + + def test_float_rate_conversion(self): + """Test converting float rates to fixed point.""" + result = _rate_to_fp(0.05) + expected = int(Decimal("0.05") * cst.FIXED_POINT_SCALE) + assert result == expected + + def test_decimal_rate_conversion(self): + """Test converting Decimal rates to fixed point.""" + result = _rate_to_fp(Decimal("0.0375")) + expected = int(Decimal("0.0375") * cst.FIXED_POINT_SCALE) + assert result == expected + + def test_zero_rate(self): + """Test converting zero rate.""" + assert _rate_to_fp(0) == 0 + + def test_high_precision_rate(self): + """Test converting high precision rate.""" + rate = Decimal("0.123456789") + result = _rate_to_fp(rate) + assert isinstance(result, int) + assert result > 0 + + def test_negative_rate_raises_error(self): + """Test that negative rates raise error.""" + with pytest.raises(ActusNormalizationError, match="exceeds uint64 bounds"): + _rate_to_fp(-0.01) + + def test_exceeds_uint64_raises_error(self): + """Test that very large rates raise error.""" + with pytest.raises(ActusNormalizationError, match="exceeds uint64 bounds"): + _rate_to_fp(cst.MAX_UINT64) + + def test_unsupported_type_raises_error(self): + """Test that unsupported types raise TypeError.""" + with pytest.raises(TypeError, match="Unsupported value type"): + _rate_to_fp("0.05") + + +class TestComputeInitialExchangeAmount: + """Test the _compute_initial_exchange_amount helper function.""" + + def test_at_par_issuance(self): + """Test initial exchange with no premium/discount.""" + result = _compute_initial_exchange_amount( + notional=1000000, + premium_discount_at_ied=0, + asa_decimals=2, + ) + # notional=1000000 with 2 decimals = 100000000, premium=0 + # result = 100000000 - 0 = 100000000 + assert result == 100000000 + + def test_with_discount(self): + """Test initial exchange with discount.""" + result = _compute_initial_exchange_amount( + notional=1000000, + premium_discount_at_ied=50000, + asa_decimals=2, + ) + # notional=1000000 with 2 decimals = 100000000 + # premium_discount=50000 with 2 decimals = 5000000 + # result = 100000000 - 5000000 = 95000000 + assert result == 95000000 + + def test_with_premium(self): + """Test initial exchange with premium (negative discount).""" + result = _compute_initial_exchange_amount( + notional=1000000, + premium_discount_at_ied=-50000, + asa_decimals=2, + ) + # notional=1000000 with 2 decimals = 100000000 + # premium_discount=-50000 with 2 decimals = -5000000 + # result = 100000000 - (-5000000) = 105000000 + assert result == 105000000 + + +class TestDeduplicateTimestamps: + """Test the _deduplicate_timestamps helper function.""" + + def test_empty_sequence(self): + """Test deduplication of empty sequence.""" + result = _deduplicate_timestamps([]) + assert result == () + + def test_no_duplicates(self): + """Test sequence with no duplicates.""" + timestamps = [1000000, 1100000, 1200000] + result = _deduplicate_timestamps(timestamps) + assert result == (1000000, 1100000, 1200000) + + def test_with_duplicates(self): + """Test deduplication removes duplicates.""" + timestamps = [1000000, 1100000, 1100000, 1200000, 1000000] + result = _deduplicate_timestamps(timestamps) + assert result == (1000000, 1100000, 1200000) + + def test_preserves_sorted_order(self): + """Test that result is sorted.""" + timestamps = [1200000, 1000000, 1100000] + result = _deduplicate_timestamps(timestamps) + assert result == (1000000, 1100000, 1200000) + + def test_all_same_timestamps(self): + """Test with all identical timestamps.""" + timestamps = [1000000, 1000000, 1000000] + result = _deduplicate_timestamps(timestamps) + assert result == (1000000,) + + +class TestNormalizeContractAttributes: + """Test the main normalize_contract_attributes function.""" + + def test_normalize_pam_zero_coupon_bond(self): + """Test normalizing a PAM zero coupon bond.""" + contract = make_pam_zero_coupon_bond( + contract_id=1, + status_date=1000000, + initial_exchange_date=1100000, + maturity_date=2000000, + notional_principal=1000000, + premium_discount_at_ied=50000, + ) + + result = normalize_contract_attributes( + contract, + denomination_asset_id=100, + denomination_asset_decimals=2, + notional_unit_value=1000, + secondary_market_opening_date=1150000, + secondary_market_closure_date=1950000, + ) + + assert result.terms is not None + assert result.schedule is not None + assert result.initial_state is not None + + # Check that notional principal is correctly normalized + # 1000000 with 2 decimals = 100000000 + assert result.terms.notional_principal == 100000000 + + # Check that initial exchange amount is correctly calculated + # notional (100000000) - premium_discount (5000000) = 95000000 + assert result.terms.initial_exchange_amount == 95000000 + + # Check that maturity date event exists in schedule + md_events = [e for e in result.schedule if e.event_type == "MD"] + assert len(md_events) == 1 + assert md_events[0].scheduled_time == 2000000 + + def test_status_date_after_ied_raises_error(self): + """Test that status_date >= initial_exchange_date raises error.""" + contract = ContractAttributes( + contract_id=1, + contract_type="PAM", + status_date=1100000, # Same as IED + initial_exchange_date=1100000, + maturity_date=2000000, + notional_principal=1000000, + premium_discount_at_ied=0, + ) + + with pytest.raises(ActusNormalizationError, match="status_date to be strictly before"): + normalize_contract_attributes( + contract, + denomination_asset_id=100, + denomination_asset_decimals=2, + notional_unit_value=1000, + secondary_market_opening_date=1150000, + secondary_market_closure_date=1950000, + ) + + def test_normalize_with_custom_fixed_point_scale(self): + """Test normalization with custom fixed point scale.""" + contract = make_pam_zero_coupon_bond( + contract_id=1, + status_date=1000000, + initial_exchange_date=1100000, + maturity_date=2000000, + notional_principal=1000000, + premium_discount_at_ied=0, + ) + + custom_scale = 1_000_000 + result = normalize_contract_attributes( + contract, + denomination_asset_id=100, + denomination_asset_decimals=2, + notional_unit_value=1000, + secondary_market_opening_date=1150000, + secondary_market_closure_date=1950000, + fixed_point_scale=custom_scale, + ) + assert result.terms.fixed_point_scale == custom_scale + + def test_normalize_pam_fixed_coupon_bond(self): + """Test normalizing a PAM fixed coupon bond.""" + contract = make_pam_fixed_coupon_bond_profile( + contract_id=2, + status_date=1000000, + initial_exchange_date=1100000, + maturity_date=2000000, + notional_principal=1000000, + nominal_interest_rate=0.05, + interest_payment_cycle=Cycle(count=6, unit="M"), + interest_payment_anchor=1100000, + ) + + result = normalize_contract_attributes( + contract, + denomination_asset_id=100, + denomination_asset_decimals=2, + notional_unit_value=1000, + secondary_market_opening_date=1150000, + secondary_market_closure_date=1950000, + ) + + # Should have a schedule with events + assert result.schedule is not None + assert len(result.schedule) > 0 + + # Check that rate is normalized to fixed point + assert result.terms.rate_reset_next == int(Decimal("0.05") * cst.FIXED_POINT_SCALE) + + # Should have IED and MD events at minimum + event_types = {e.event_type for e in result.schedule} + assert "IED" in event_types + assert "MD" in event_types + + def test_normalize_lam_contract(self): + """Test normalizing a LAM (Linear Amortizing) contract.""" + contract = ContractAttributes( + contract_id=3, + contract_type="LAM", + status_date=1000000, + initial_exchange_date=1100000, + maturity_date=2000000, + notional_principal=1200000, + premium_discount_at_ied=0, + nominal_interest_rate=0.04, + next_principal_redemption_amount=100000, + principal_redemption_cycle=Cycle(count=3, unit="M"), + principal_redemption_anchor=1200000, + interest_payment_cycle=Cycle(count=3, unit="M"), + interest_payment_anchor=1200000, + ) + + result = normalize_contract_attributes( + contract, + denomination_asset_id=100, + denomination_asset_decimals=2, + notional_unit_value=1000, + secondary_market_opening_date=1150000, + secondary_market_closure_date=1950000, + ) + + # Should have PR events + pr_events = [e for e in result.schedule if e.event_type == "PR"] + assert len(pr_events) > 0 + + def test_normalize_with_rate_reset(self): + """Test normalizing contract with rate reset.""" + contract = ContractAttributes( + contract_id=4, + contract_type="PAM", + status_date=1000000, + initial_exchange_date=1100000, + maturity_date=2000000, + notional_principal=1000000, + premium_discount_at_ied=0, + nominal_interest_rate=0.03, + rate_reset_spread=0.01, + rate_reset_multiplier=1.0, + rate_reset_floor=0.02, + rate_reset_cap=0.10, + rate_reset_next=0.04, + rate_reset_cycle=Cycle(count=1, unit="Y"), + rate_reset_anchor=1200000, + ) + + result = normalize_contract_attributes( + contract, + denomination_asset_id=100, + denomination_asset_decimals=2, + notional_unit_value=1000, + secondary_market_opening_date=1150000, + secondary_market_closure_date=1950000, + ) + + # Check rate reset parameters are normalized + assert result.terms.rate_reset_spread > 0 + assert result.terms.rate_reset_floor > 0 + assert result.terms.rate_reset_cap > 0 + + +class TestNormalizedActusTerms: + """Test the NormalizedActusTerms model.""" + + def test_terms_creation(self): + """Test creating normalized terms with valid values.""" + terms = NormalizedActusTerms( + contract_id=1, + contract_type=enums.CT_PAM, + denomination_asset_id=100, + initial_exchange_date=1100000, + maturity_date=2000000, + secondary_market_opening_date=1150000, + secondary_market_closure_date=1950000, + notional_principal=100000000, + notional_unit_value=100000, + initial_exchange_amount=95000000, + next_principal_redemption_amount=0, + rate_reset_spread=0, + rate_reset_multiplier=cst.FIXED_POINT_SCALE, + rate_reset_floor=0, + rate_reset_cap=0, + rate_reset_next=0, + day_count_convention=enums.DCC_A360, + fixed_point_scale=cst.FIXED_POINT_SCALE, + ) + assert terms.contract_id == 1 + assert terms.total_units == 1000 + + def test_terms_total_units_calculation(self): + """Test that total_units is correctly calculated.""" + terms = NormalizedActusTerms( + contract_id=1, + contract_type=enums.CT_PAM, + denomination_asset_id=100, + initial_exchange_date=1100000, + maturity_date=2000000, + secondary_market_opening_date=1150000, + secondary_market_closure_date=1950000, + notional_principal=1000000, + notional_unit_value=1000, + initial_exchange_amount=950000, + next_principal_redemption_amount=0, + rate_reset_spread=0, + rate_reset_multiplier=cst.FIXED_POINT_SCALE, + rate_reset_floor=0, + rate_reset_cap=0, + rate_reset_next=0, + day_count_convention=enums.DCC_A360, + fixed_point_scale=cst.FIXED_POINT_SCALE, + ) + assert terms.total_units == 1000 + + def test_terms_with_zero_notional_unit_value_raises_error(self): + """Test that zero notional_unit_value raises error.""" + with pytest.raises(ActusNormalizationError, match="notional_unit_value must be positive"): + NormalizedActusTerms( + contract_id=1, + contract_type=enums.CT_PAM, + denomination_asset_id=100, + initial_exchange_date=1100000, + maturity_date=2000000, + secondary_market_opening_date=1150000, + secondary_market_closure_date=1950000, + notional_principal=1000000, + notional_unit_value=0, + initial_exchange_amount=950000, + next_principal_redemption_amount=0, + rate_reset_spread=0, + rate_reset_multiplier=cst.FIXED_POINT_SCALE, + rate_reset_floor=0, + rate_reset_cap=0, + rate_reset_next=0, + day_count_convention=enums.DCC_A360, + fixed_point_scale=cst.FIXED_POINT_SCALE, + ) + + def test_terms_indivisible_notional_raises_error(self): + """Test that notional not divisible by unit value raises error.""" + with pytest.raises(ActusNormalizationError, match="divisible by notional_unit_value"): + NormalizedActusTerms( + contract_id=1, + contract_type=enums.CT_PAM, + denomination_asset_id=100, + initial_exchange_date=1100000, + maturity_date=2000000, + secondary_market_opening_date=1150000, + secondary_market_closure_date=1950000, + notional_principal=1000001, # Not divisible by 1000 + notional_unit_value=1000, + initial_exchange_amount=950000, + next_principal_redemption_amount=0, + rate_reset_spread=0, + rate_reset_multiplier=cst.FIXED_POINT_SCALE, + rate_reset_floor=0, + rate_reset_cap=0, + rate_reset_next=0, + day_count_convention=enums.DCC_A360, + fixed_point_scale=cst.FIXED_POINT_SCALE, + ) + + def test_dynamic_principal_redemption_for_ann(self): + """Test dynamic_principal_redemption property for ANN contracts.""" + terms = NormalizedActusTerms( + contract_id=1, + contract_type=enums.CT_ANN, + denomination_asset_id=100, + initial_exchange_date=1100000, + maturity_date=2000000, + secondary_market_opening_date=1150000, + secondary_market_closure_date=1950000, + notional_principal=1000000, + notional_unit_value=1000, + initial_exchange_amount=950000, + next_principal_redemption_amount=0, # Zero indicates dynamic + rate_reset_spread=0, + rate_reset_multiplier=cst.FIXED_POINT_SCALE, + rate_reset_floor=0, + rate_reset_cap=0, + rate_reset_next=0, + day_count_convention=enums.DCC_A360, + fixed_point_scale=cst.FIXED_POINT_SCALE, + ) + assert terms.dynamic_principal_redemption is True + + def test_has_rate_reset_floor(self): + """Test has_rate_reset_floor property.""" + terms = NormalizedActusTerms( + contract_id=1, + contract_type=enums.CT_PAM, + denomination_asset_id=100, + initial_exchange_date=1100000, + maturity_date=2000000, + secondary_market_opening_date=1150000, + secondary_market_closure_date=1950000, + notional_principal=1000000, + notional_unit_value=1000, + initial_exchange_amount=950000, + next_principal_redemption_amount=0, + rate_reset_spread=0, + rate_reset_multiplier=cst.FIXED_POINT_SCALE, + rate_reset_floor=1000000, # Non-zero + rate_reset_cap=0, + rate_reset_next=0, + day_count_convention=enums.DCC_A360, + fixed_point_scale=cst.FIXED_POINT_SCALE, + ) + assert terms.has_rate_reset_floor is True + + def test_has_rate_reset_cap(self): + """Test has_rate_reset_cap property.""" + terms = NormalizedActusTerms( + contract_id=1, + contract_type=enums.CT_PAM, + denomination_asset_id=100, + initial_exchange_date=1100000, + maturity_date=2000000, + secondary_market_opening_date=1150000, + secondary_market_closure_date=1950000, + notional_principal=1000000, + notional_unit_value=1000, + initial_exchange_amount=950000, + next_principal_redemption_amount=0, + rate_reset_spread=0, + rate_reset_multiplier=cst.FIXED_POINT_SCALE, + rate_reset_floor=0, + rate_reset_cap=10000000, # Non-zero + rate_reset_next=0, + day_count_convention=enums.DCC_A360, + fixed_point_scale=cst.FIXED_POINT_SCALE, + ) + assert terms.has_rate_reset_cap is True + + +class TestExecutionScheduleEntry: + """Test the ExecutionScheduleEntry model.""" + + def test_schedule_entry_creation(self): + """Test creating a schedule entry.""" + entry = ExecutionScheduleEntry( + event_id=0, + event_type="IED", + scheduled_time=1100000, + accrual_factor=0, + redemption_accrual_factor=0, + next_nominal_interest_rate=50000000, + next_principal_redemption=0, + next_outstanding_principal=1000000, + flags=enums.FLAG_NON_CASH_EVENT, + ) + assert entry.event_id == 0 + assert entry.event_type == "IED" + assert entry.scheduled_time == 1100000 + assert entry.flags == enums.FLAG_NON_CASH_EVENT + + def test_schedule_entry_cash_event(self): + """Test creating a cash event schedule entry.""" + entry = ExecutionScheduleEntry( + event_id=1, + event_type="IP", + scheduled_time=1200000, + accrual_factor=500000, + redemption_accrual_factor=0, + next_nominal_interest_rate=50000000, + next_principal_redemption=0, + next_outstanding_principal=1000000, + flags=enums.FLAG_CASH_EVENT, + ) + assert entry.event_type == "IP" + assert entry.flags == enums.FLAG_CASH_EVENT + + def test_schedule_entry_default_flags(self): + """Test that flags default to 0.""" + entry = ExecutionScheduleEntry( + event_id=2, + event_type="MD", + scheduled_time=2000000, + accrual_factor=100000, + redemption_accrual_factor=0, + next_nominal_interest_rate=0, + next_principal_redemption=0, + next_outstanding_principal=0, + ) + assert entry.flags == 0 + + +class TestNormalizationResult: + """Test the NormalizationResult model.""" + + def test_schedule_pages_basic(self): + """Test splitting schedule into pages.""" + terms = NormalizedActusTerms( + contract_id=1, + contract_type=enums.CT_PAM, + denomination_asset_id=100, + initial_exchange_date=1100000, + maturity_date=2000000, + secondary_market_opening_date=1150000, + secondary_market_closure_date=1950000, + notional_principal=1000000, + notional_unit_value=1000, + initial_exchange_amount=950000, + next_principal_redemption_amount=0, + rate_reset_spread=0, + rate_reset_multiplier=cst.FIXED_POINT_SCALE, + rate_reset_floor=0, + rate_reset_cap=0, + rate_reset_next=0, + day_count_convention=enums.DCC_A360, + fixed_point_scale=cst.FIXED_POINT_SCALE, + ) + + schedule = tuple( + ExecutionScheduleEntry( + event_id=i, + event_type="IP", + scheduled_time=1100000 + i * 100000, + accrual_factor=0, + redemption_accrual_factor=0, + next_nominal_interest_rate=0, + next_principal_redemption=0, + next_outstanding_principal=0, + ) + for i in range(10) + ) + + from src.models import InitialKernelState, NormalizationResult + + initial_state = InitialKernelState( + status_date=1000000, + event_cursor=0, + outstanding_principal=0, + interest_calculation_base=0, + nominal_interest_rate=0, + accrued_interest=0, + next_principal_redemption=0, + cumulative_interest_index=0, + cumulative_principal_index=0, + ) + + result = NormalizationResult( + terms=terms, + schedule=schedule, + initial_state=initial_state, + ) + + pages = result.schedule_pages(page_size=3) + assert len(pages) == 4 # 10 entries / 3 per page = 4 pages + assert len(pages[0]) == 3 + assert len(pages[1]) == 3 + assert len(pages[2]) == 3 + assert len(pages[3]) == 1 + + def test_schedule_pages_exact_division(self): + """Test paging when schedule size divides evenly.""" + terms = NormalizedActusTerms( + contract_id=1, + contract_type=enums.CT_PAM, + denomination_asset_id=100, + initial_exchange_date=1100000, + maturity_date=2000000, + secondary_market_opening_date=1150000, + secondary_market_closure_date=1950000, + notional_principal=1000000, + notional_unit_value=1000, + initial_exchange_amount=950000, + next_principal_redemption_amount=0, + rate_reset_spread=0, + rate_reset_multiplier=cst.FIXED_POINT_SCALE, + rate_reset_floor=0, + rate_reset_cap=0, + rate_reset_next=0, + day_count_convention=enums.DCC_A360, + fixed_point_scale=cst.FIXED_POINT_SCALE, + ) + + schedule = tuple( + ExecutionScheduleEntry( + event_id=i, + event_type="IP", + scheduled_time=1100000 + i * 100000, + accrual_factor=0, + redemption_accrual_factor=0, + next_nominal_interest_rate=0, + next_principal_redemption=0, + next_outstanding_principal=0, + ) + for i in range(6) + ) + + from src.models import InitialKernelState, NormalizationResult + + initial_state = InitialKernelState( + status_date=1000000, + event_cursor=0, + outstanding_principal=0, + interest_calculation_base=0, + nominal_interest_rate=0, + accrued_interest=0, + next_principal_redemption=0, + cumulative_interest_index=0, + cumulative_principal_index=0, + ) + + result = NormalizationResult( + terms=terms, + schedule=schedule, + initial_state=initial_state, + ) + + pages = result.schedule_pages(page_size=2) + assert len(pages) == 3 + assert all(len(page) == 2 for page in pages) + + def test_schedule_pages_invalid_page_size(self): + """Test that invalid page size raises error.""" + terms = NormalizedActusTerms( + contract_id=1, + contract_type=enums.CT_PAM, + denomination_asset_id=100, + initial_exchange_date=1100000, + maturity_date=2000000, + secondary_market_opening_date=1150000, + secondary_market_closure_date=1950000, + notional_principal=1000000, + notional_unit_value=1000, + initial_exchange_amount=950000, + next_principal_redemption_amount=0, + rate_reset_spread=0, + rate_reset_multiplier=cst.FIXED_POINT_SCALE, + rate_reset_floor=0, + rate_reset_cap=0, + rate_reset_next=0, + day_count_convention=enums.DCC_A360, + fixed_point_scale=cst.FIXED_POINT_SCALE, + ) + + from src.models import InitialKernelState, NormalizationResult + + initial_state = InitialKernelState( + status_date=1000000, + event_cursor=0, + outstanding_principal=0, + interest_calculation_base=0, + nominal_interest_rate=0, + accrued_interest=0, + next_principal_redemption=0, + cumulative_interest_index=0, + cumulative_principal_index=0, + ) + + result = NormalizationResult( + terms=terms, + schedule=(), + initial_state=initial_state, + ) + + with pytest.raises(ValueError, match="page_size must be positive"): + result.schedule_pages(page_size=0) + + with pytest.raises(ValueError, match="page_size must be positive"): + result.schedule_pages(page_size=-1) + + + + + + + From 09acb80205e07640340407c5b980480a8ba95959 Mon Sep 17 00:00:00 2001 From: cusma Date: Wed, 11 Mar 2026 12:57:59 +0100 Subject: [PATCH 032/244] chore: add docstrings --- src/contracts.py | 151 +++++++++++- src/normalization.py | 575 +++++++++++++++++++++++++++++++++++++++---- 2 files changed, 667 insertions(+), 59 deletions(-) diff --git a/src/contracts.py b/src/contracts.py index 58de795c..5b0d0834 100644 --- a/src/contracts.py +++ b/src/contracts.py @@ -21,9 +21,65 @@ @dataclass(frozen=True, slots=True) class ContractAttributes: """ - D-ASA Contract attributes. + ACTUS contract attributes for fixed-income instruments. - Note: D-ASA supports a subset of ACTUS contract attributes. + Represents the complete specification of a financial contract following + ACTUS standards. D-ASA supports a subset of ACTUS contract types including + PAM, LAM, NAM, ANN, LAX, and CLM. + + Attributes: + contract_id: Unique identifier for the contract. + contract_type: ACTUS contract type (e.g., "PAM", "PAM:ZCB", "LAM"). + + status_date: Reference date for contract state (must precede IED). + initial_exchange_date: Date when principal is initially exchanged. + maturity_date: Final maturity date when contract terminates. + + notional_principal: Principal amount of the contract. + premium_discount_at_ied: Premium/discount adjustment at IED. + next_principal_redemption_amount: Fixed payment amount per period. + principal_redemption_cycle: Frequency of principal payments. + principal_redemption_anchor: Anchor date for principal schedule. + amortization_date: Start date for amortization (ANN contracts). + + nominal_interest_rate: Annual interest rate (e.g., 0.05 for 5%). + interest_payment_anchor: Anchor date for interest payment schedule. + interest_payment_cycle: Frequency of interest payments. + interest_calculation_base_anchor: Anchor for interest calculation base. + interest_calculation_base_cycle: Cycle for calculation base adjustments. + rate_reset_anchor: Anchor date for rate reset schedule. + rate_reset_cycle: Frequency of interest rate resets. + rate_reset_spread: Spread added to reset rate. + rate_reset_multiplier: Multiplier applied to reset rate. + rate_reset_floor: Minimum rate after reset. + rate_reset_cap: Maximum rate after reset. + rate_reset_next: Next known reset rate value. + + day_count_convention: Method for calculating year fractions (default: A360). + business_day_convention: How to handle non-business days (default: NOS). + end_of_month_convention: End-of-month adjustment rules (default: SD). + calendar: Calendar for business day calculations (default: NC). + + array_pr_anchor: Array of principal redemption anchor dates (LAX). + array_pr_cycle: Array of principal redemption cycles (LAX). + array_pr_next: Array of principal redemption amounts (LAX). + array_increase_decrease: Array indicating principal direction (LAX). + + Example: + >>> from decimal import Decimal + >>> contract = ContractAttributes( + ... contract_id=1, + ... contract_type="PAM:ZCB", + ... status_date=1609459200, # 2021-01-01 + ... initial_exchange_date=1612137600, # 2021-02-01 + ... maturity_date=1643673600, # 2022-02-01 + ... notional_principal=Decimal("100000"), + ... premium_discount_at_ied=Decimal("0"), + ... ) + + Note: + D-ASA supports a subset of ACTUS contract attributes. + Contract subtypes use colon notation (e.g., "PAM:ZCB" for zero coupon bond). """ # Contract @@ -70,7 +126,16 @@ class ContractAttributes: array_increase_decrease: list[Literal["INC", "DEC"]] | None = None def __post_init__(self) -> None: - """Validate contract attributes.""" + """ + Validate contract attributes after initialization. + + Ensures contract type is supported, day count convention is valid, + and business day convention is compatible with D-ASA. + + Raises: + UnsupportedActusFeatureError: If contract_type, day_count_convention, + or business_day_convention are not supported by D-ASA. + """ # Extract base contract type (e.g., "PAM" from "PAM:ZCB") base_contract_type = ( self.contract_type.split(":")[0] @@ -110,7 +175,43 @@ def make_pam_zero_coupon_bond( end_of_month_convention: EndOfMonthConvention | None = EndOfMonthConvention.SD, calendar: Calendar | None = Calendar.NC, ) -> ContractAttributes: - """Build a PAM Zero Coupon Bond (ZCB) profile.""" + """ + Build a PAM Zero Coupon Bond (ZCB) contract. + + Zero coupon bonds pay no periodic interest and return the full principal + at maturity. The contract_type is set to "PAM:ZCB" with zero interest rate. + + Args: + contract_id: Unique identifier for the contract. + status_date: Contract status reference date (must precede IED). + initial_exchange_date: Date when bond is issued and principal exchanged. + maturity_date: Date when principal is repaid. + notional_principal: Face value of the bond. + premium_discount_at_ied: Premium or discount adjustment at issuance + (positive for premium, negative for discount). + day_count_convention: Year fraction calculation method (default: A360). + business_day_convention: Non-business day handling (default: NOS). + end_of_month_convention: End-of-month adjustment rules (default: SD). + calendar: Business calendar for date calculations (default: NC). + + Returns: + ContractAttributes configured as a zero coupon bond. + + Example: + >>> from decimal import Decimal + >>> zcb = make_pam_zero_coupon_bond( + ... contract_id=1, + ... status_date=1609459200, # 2021-01-01 + ... initial_exchange_date=1612137600, # 2021-02-01 + ... maturity_date=1643673600, # 2022-02-01 + ... notional_principal=Decimal("100000"), + ... premium_discount_at_ied=Decimal("0"), + ... ) + >>> zcb.contract_type + 'PAM:ZCB' + >>> zcb.nominal_interest_rate + 0 + """ return ContractAttributes( contract_id=contract_id, contract_type="PAM:ZCB", @@ -142,7 +243,47 @@ def make_pam_fixed_coupon_bond_profile( interest_payment_cycle: Cycle, interest_payment_anchor: UTCTimeStamp, ) -> ContractAttributes: - """Build a PAM Fixed Coupon Bond (FCB) with a fixed interest rate profile.""" + """ + Build a PAM Fixed Coupon Bond (FCB) contract. + + Fixed coupon bonds pay periodic interest at a fixed rate and return the + principal at maturity. The contract_type is set to "PAM:FCB". + + Args: + contract_id: Unique identifier for the contract. + status_date: Contract status reference date (must precede IED). + initial_exchange_date: Date when bond is issued and principal exchanged. + maturity_date: Date when principal is repaid. + notional_principal: Face value of the bond. + nominal_interest_rate: Annual interest rate (e.g., 0.05 for 5%). + day_count_convention: Year fraction calculation method (default: A360). + business_day_convention: Non-business day handling (default: NOS). + end_of_month_convention: End-of-month adjustment rules (default: SD). + calendar: Business calendar for date calculations (default: NC). + interest_payment_cycle: Frequency of interest payments (e.g., 6M for semi-annual). + interest_payment_anchor: Starting date for interest payment schedule. + + Returns: + ContractAttributes configured as a fixed coupon bond. + + Example: + >>> from decimal import Decimal + >>> from src.schedule import Cycle + >>> fcb = make_pam_fixed_coupon_bond_profile( + ... contract_id=2, + ... status_date=1609459200, # 2021-01-01 + ... initial_exchange_date=1612137600, # 2021-02-01 + ... maturity_date=1675209600, # 2023-02-01 + ... notional_principal=Decimal("100000"), + ... nominal_interest_rate=Decimal("0.05"), # 5% annual + ... interest_payment_cycle=Cycle(count=6, unit="M"), # Semi-annual + ... interest_payment_anchor=1620009600, # First payment date + ... ) + >>> fcb.contract_type + 'PAM:FCB' + >>> fcb.nominal_interest_rate + Decimal('0.05') + """ return ContractAttributes( contract_id=contract_id, contract_type="PAM:FCB", diff --git a/src/normalization.py b/src/normalization.py index 55792be4..3c030c19 100644 --- a/src/normalization.py +++ b/src/normalization.py @@ -36,24 +36,31 @@ def _to_asa_units(amount: int | float | Decimal, asa_decimals: int) -> int: """ - Normalize an amount into ASA's units (uint64). + Convert a decimal amount to ASA base units (uint64). + + Scales the amount by 10^asa_decimals to represent fractional values as integers. Example: - 1) amount=100.42, asa_decimals=3, the result in ASA's units is 100420 - 2) amount=100, asa_decimals=2, the result in ASA's units is 10000 + >>> _to_asa_units(100.42, 3) # 100.42 with 3 decimals + 100420 + >>> _to_asa_units(100, 2) # 100 with 2 decimals + 10000 Args: - amount: The numeric value to normalize. - asa_decimals: The number of decimal places for the ASA. + amount: The numeric value to convert. + asa_decimals: Number of decimal places for the ASA. + + Returns: + The amount in ASA base units as an integer. Raises: - TypeError: if the value is not an int, float, or Decimal. - ActusNormalizationError: if the result exceeds uint64 max. + TypeError: If value is not int, float, or Decimal. + ActusNormalizationError: If result exceeds uint64 bounds. """ if isinstance(amount, (int, float, Decimal)): scale = 10**asa_decimals - result = int(Decimal(str(asa_decimals)) * scale) + result = int(Decimal(str(amount)) * scale) else: raise TypeError(f"Unsupported value type: {type(amount)}") @@ -67,21 +74,23 @@ def _to_asa_units(amount: int | float | Decimal, asa_decimals: int) -> int: def _rate_to_fp(value: int | float | Decimal) -> int: """ - Normalize numeric decimal rates into AVM-compatible uint64 integer fixed-point - scaled units. + Convert decimal rates to fixed-point integer representation. - Always scales by FIXED_POINT_SCALE to convert decimal-like values to fixed point - precision integers. + Scales decimal rates by FIXED_POINT_SCALE for AVM-compatible uint64 storage. Example: - A rate of 0.05 (5%) with FIXED_POINT_SCALE of 1_000_000_000 becomes 50_000_000. + >>> _rate_to_fp(0.05) # 5% rate with FIXED_POINT_SCALE=1_000_000_000 + 50000000 Args: - value: The rate value to normalize. + value: The rate value (e.g., 0.05 for 5%). + + Returns: + Fixed-point scaled rate as uint64 integer. Raises: - TypeError: if the value is not an int, float, or Decimal. - ActusNormalizationError: if the result exceeds uint64 max. + TypeError: If value is not int, float, or Decimal. + ActusNormalizationError: If result exceeds uint64 bounds. """ if isinstance(value, (int, float, Decimal)): @@ -102,6 +111,20 @@ def _compute_initial_exchange_amount( premium_discount_at_ied: int | float | Decimal, asa_decimals: int, ) -> int: + """ + Calculate the initial exchange amount adjusted for premium/discount. + + Returns the net notional after subtracting any premium/discount at IED + (Initial Exchange Date). + + Args: + notional: The notional principal amount. + premium_discount_at_ied: Premium/discount adjustment at IED. + asa_decimals: Number of decimal places for the ASA. + + Returns: + Net initial exchange amount in ASA base units. + """ notional = _to_asa_units(notional, asa_decimals) pdied = _to_asa_units(premium_discount_at_ied, asa_decimals) return notional - pdied @@ -114,7 +137,24 @@ def _deduplicate_timestamps(ts: Sequence[UTCTimeStamp]) -> tuple[UTCTimeStamp, . @dataclass(frozen=True, slots=True) class _EventSeed: - """Intermediate normalized event before final schedule encoding.""" + """ + Intermediate normalized event before final schedule encoding. + + Represents a scheduled event during the normalization process, containing + all necessary information to generate the final ExecutionScheduleEntry. + + Attributes: + event_type: ACTUS event type (e.g., "IED", "IP", "PR", "MD"). + scheduled_time: Unix timestamp when event occurs. + accrual_factor: Optional year fraction for interest accrual. + redemption_accrual_factor: Optional year fraction for redemption accrual. + redemption_accrual_start: Start timestamp for redemption accrual period. + redemption_accrual_end: End timestamp for redemption accrual period. + next_nominal_interest_rate: Interest rate after this event. + next_principal_redemption: Principal redemption amount. + next_outstanding_principal: Outstanding principal after this event. + flags: Event flags (cash/non-cash, etc.). + """ event_type: str scheduled_time: UTCTimeStamp @@ -141,17 +181,43 @@ def normalize_contract_attributes( Sequence[ObservedEventRequest | ExecutionScheduleEntry] | None ) = None, ) -> NormalizationResult: - """Normalize raw ACTUS attributes into terms, schedule, and initial state. + """ + Normalize ACTUS contract attributes into AVM-compatible terms, schedule, and state. + + Transforms human-readable ACTUS contract parameters into fixed-point integers, + generates the execution schedule, and initializes the contract kernel state. Args: - contract: ACTUS contract attributes. - denomination_asset_id: The denomination ASA ID. - denomination_asset_decimals: The decimal places od the denomination ASA. - notional_unit_value: The notional unit value to be converted in denomination ASA. - secondary_market_opening_date: Optional secondary market opening date. - secondary_market_closure_date: Optional secondary market closure date. - fixed_point_scale: The fixed point scaling. - preprocessed_events: Optional preprocessed events. + contract: ACTUS contract attributes with dates, amounts, and cycles. + denomination_asset_id: ASA ID for the denomination asset. + denomination_asset_decimals: Decimal places for the denomination ASA. + notional_unit_value: Notional value per unit in denomination ASA. + secondary_market_opening_date: Unix timestamp for secondary market opening. + secondary_market_closure_date: Unix timestamp for secondary market closure. + fixed_point_scale: Scaling factor for fixed-point arithmetic (default: 1e9). + preprocessed_events: Optional pre-generated event schedule. + + Returns: + NormalizationResult containing normalized terms, execution schedule, and initial state. + + Raises: + ActusNormalizationError: If status_date >= initial_exchange_date or invalid config. + + Example: + >>> contract = ContractAttributes( + ... contract_type="PAM", + ... status_date=1609459200, # 2021-01-01 + ... initial_exchange_date=1612137600, # 2021-02-01 + ... maturity_date=1643673600, # 2022-02-01 + ... notional_principal=100000, + ... nominal_interest_rate=0.05, + ... ) + >>> result = normalize_contract_attributes( + ... contract, + ... denomination_asset_id=1, + ... denomination_asset_decimals=6, + ... notional_unit_value=100, + ... ) """ if contract.status_date >= contract.initial_exchange_date: @@ -247,7 +313,27 @@ def _normalize_schedule( status_date: int, asa_decimals: int, ) -> tuple[ExecutionScheduleEntry, ...]: - """Turn intermediate event seeds into AVM schedule entries.""" + """ + Build the final execution schedule from event seeds or preprocessed events. + + Converts intermediate event seeds into fully populated ExecutionScheduleEntry + objects with computed accrual factors and proper event ordering. + + Args: + contract: Original ACTUS contract attributes. + terms: Normalized contract terms. + preprocessed_events: Optional pre-generated event schedule. + contract_type: Base contract type (e.g., "PAM", "LAM"). + status_date: Contract status date (must precede all events). + asa_decimals: Decimal places for the denomination ASA. + + Returns: + Sorted tuple of ExecutionScheduleEntry objects. + + Raises: + UnsupportedActusFeatureError: If event type not allowed for contract type. + ActusNormalizationError: If events not in chronological order. + """ # Extract base contract type base_contract_type = ( contract_type.split(":")[0] if ":" in contract_type else contract_type @@ -327,7 +413,21 @@ def _build_schedule_seeds( contract_type: str, asa_decimals: int, ) -> tuple[_EventSeed, ...]: - """Dispatch contract-type-specific schedule construction.""" + """ + Dispatch contract-type-specific schedule construction. + + Routes to the appropriate schedule builder based on contract type + (PAM, LAM, NAM, ANN, LAX, or CLM). + + Args: + contract: ACTUS contract attributes. + terms: Normalized contract terms. + contract_type: Base contract type (without subtype). + asa_decimals: Decimal places for the denomination ASA. + + Returns: + Tuple of event seeds for the contract's execution schedule. + """ # PAM and CLM don't require asa_decimals if contract_type in ("PAM", "CLM"): dispatch = { @@ -351,7 +451,20 @@ def _initial_exchange_seed( terms: NormalizedActusTerms, asa_decimals: int, ) -> _EventSeed: - """Build the mandatory initial exchange event seed.""" + """ + Build the mandatory initial exchange event seed. + + Creates the IED (Initial Exchange Date) event that establishes the initial + contract state including principal and interest rate. + + Args: + contract: ACTUS contract attributes. + terms: Normalized contract terms. + asa_decimals: Decimal places for the denomination ASA. + + Returns: + Event seed for the IED event. + """ return _EventSeed( event_type="IED", @@ -368,7 +481,19 @@ def _initial_exchange_seed( def _build_pam_schedule( contract: ContractAttributes, terms: NormalizedActusTerms ) -> tuple[_EventSeed, ...]: - """Build the normalized PAM event seed schedule.""" + """ + Build the normalized PAM (Principal at Maturity) event seed schedule. + + Args: + contract: ACTUS contract attributes. + terms: Normalized contract terms. + + Returns: + Tuple of event seeds for the PAM schedule. + + Raises: + ActusNormalizationError: If maturity_date is not specified. + """ if terms.maturity_date is None: raise ActusNormalizationError("PAM normalization requires maturity_date") @@ -399,7 +524,17 @@ def _build_pam_schedule( def _build_lam_schedule( contract: ContractAttributes, terms: NormalizedActusTerms, asa_decimals: int ) -> tuple[_EventSeed, ...]: - """Build the normalized LAM event seed schedule.""" + """ + Build the normalized LAM (Linear Amortizer) event seed schedule. + + Args: + contract: ACTUS contract attributes. + terms: Normalized contract terms. + asa_decimals: Decimal places for the denomination ASA. + + Returns: + Tuple of event seeds for the LAM schedule. + """ return _build_amortizing_schedule( contract, terms, asa_decimals, allow_negative=False, lax=False ) @@ -408,7 +543,17 @@ def _build_lam_schedule( def _build_nam_schedule( contract: ContractAttributes, terms: NormalizedActusTerms, asa_decimals: int ) -> tuple[_EventSeed, ...]: - """Build the normalized NAM event seed schedule.""" + """ + Build the normalized NAM (Negative Amortizer) event seed schedule. + + Args: + contract: ACTUS contract attributes. + terms: Normalized contract terms. + asa_decimals: Decimal places for the denomination ASA. + + Returns: + Tuple of event seeds for the NAM schedule. + """ return _build_amortizing_schedule( contract, terms, asa_decimals, allow_negative=True, lax=False ) @@ -417,14 +562,34 @@ def _build_nam_schedule( def _build_ann_schedule( contract: ContractAttributes, terms: NormalizedActusTerms, asa_decimals: int ) -> tuple[_EventSeed, ...]: - """Build the normalized ANN event seed schedule.""" + """ + Build the normalized ANN (Annuity) event seed schedule. + + Args: + contract: ACTUS contract attributes. + terms: Normalized contract terms. + asa_decimals: Decimal places for the denomination ASA. + + Returns: + Tuple of event seeds for the ANN schedule. + """ return _build_annuity_schedule(contract, terms, asa_decimals) def _build_lax_schedule( contract: ContractAttributes, terms: NormalizedActusTerms, asa_decimals: int ) -> tuple[_EventSeed, ...]: - """Build the normalized LAX event seed schedule.""" + """ + Build the normalized LAX (Linear Amortizer with eXtensions) event seed schedule. + + Args: + contract: ACTUS contract attributes. + terms: Normalized contract terms. + asa_decimals: Decimal places for the denomination ASA. + + Returns: + Tuple of event seeds for the LAX schedule. + """ return _build_amortizing_schedule( contract, terms, asa_decimals, allow_negative=True, lax=True ) @@ -433,7 +598,16 @@ def _build_lax_schedule( def _build_clm_schedule( contract: ContractAttributes, terms: NormalizedActusTerms ) -> tuple[_EventSeed, ...]: - """Build the normalized CLM event seed schedule.""" + """ + Build the normalized CLM (Call Money) event seed schedule. + + Args: + contract: ACTUS contract attributes. + terms: Normalized contract terms. + + Returns: + Tuple of event seeds for the CLM schedule. + """ seeds: list[_EventSeed] = [] outstanding = terms.notional_principal if terms.maturity_date is not None: @@ -463,7 +637,20 @@ def _build_annuity_schedule( terms: NormalizedActusTerms, asa_decimals: int, ) -> tuple[_EventSeed, ...]: - """Build the ANN schedule including PRF recalculation events when needed.""" + """ + Build the ANN schedule including PRF recalculation events when needed. + + Args: + contract: ACTUS contract attributes. + terms: Normalized contract terms. + asa_decimals: Decimal places for the denomination ASA. + + Returns: + Tuple of event seeds for the annuity schedule. + + Raises: + ActusNormalizationError: If required fields are missing. + """ if terms.maturity_date is None: raise ActusNormalizationError( "ANN normalization requires maturity_date or amortization_date" @@ -631,7 +818,22 @@ def _build_amortizing_schedule( allow_negative: bool, lax: bool, ) -> tuple[_EventSeed, ...]: - """Build a generic amortizing schedule for LAM, NAM, and LAX.""" + """ + Build a generic amortizing schedule for LAM, NAM, and LAX. + + Args: + contract: ACTUS contract attributes. + terms: Normalized contract terms. + asa_decimals: Decimal places for the denomination ASA. + allow_negative: Whether negative amortization is allowed (NAM). + lax: Whether this is a LAX contract with array-based schedules. + + Returns: + Tuple of event seeds for the amortizing schedule. + + Raises: + ActusNormalizationError: If required fields are missing. + """ contract_type = contract.contract_type if terms.maturity_date is None: raise ActusNormalizationError( @@ -740,7 +942,26 @@ def _principal_payment_for_period( period_index: int, asa_decimals: int, ) -> int: - """Resolve the principal cashflow for one amortizing period.""" + """ + Resolve the principal cashflow for one amortizing period. + + Calculates the principal payment amount based on contract type, + payment structure, and period-specific parameters. + + Args: + contract: ACTUS contract attributes. + outstanding: Current outstanding principal. + payment_total: Total payment amount for the period. + interest_due: Interest amount due for the period. + allow_negative: Whether negative amortization is allowed. + annuity: Whether this is an annuity contract. + lax: Whether this is a LAX contract with array-based amounts. + period_index: Index of the current period. + asa_decimals: Decimal places for the denomination ASA. + + Returns: + Principal payment amount in ASA base units. + """ if lax and contract.array_pr_next is not None: pr_values = tuple( _to_asa_units(value, asa_decimals) for value in contract.array_pr_next @@ -764,7 +985,23 @@ def _principal_schedule( *, lax: bool, ) -> tuple[int, ...]: - """Resolve the principal redemption occurrence schedule.""" + """ + Resolve the principal redemption occurrence schedule. + + Generates timestamps for principal redemption events based on either + array-based schedules (LAX) or cycle-based schedules (standard contracts). + + Args: + contract: ACTUS contract attributes. + terms: Normalized contract terms. + lax: Whether to use LAX array-based schedule logic. + + Returns: + Tuple of Unix timestamps for principal redemption events. + + Raises: + ActusNormalizationError: If LAX arrays have misaligned lengths. + """ if lax and contract.array_pr_anchor is not None: anchors = tuple(ts for ts in contract.array_pr_anchor) @@ -817,7 +1054,42 @@ def _interest_schedule( contract: ContractAttributes, terms: NormalizedActusTerms, ) -> tuple[UTCTimeStamp, ...]: - """Resolve the interest payment occurrence schedule.""" + """ + Resolve the interest payment occurrence schedule. + + Generates timestamps for interest payment (IP) events based on the + interest payment cycle. Ensures maturity date is included and all + events fall within the contract's active period (after IED, up to MD). + + The function handles cycle suffixes: + - If cycle ends with "+", the last event is adjusted to maturity_date + - Otherwise, maturity_date is appended to the schedule + + Args: + contract: ACTUS contract attributes with interest payment parameters. + terms: Normalized contract terms with IED and maturity date. + + Returns: + Tuple of Unix timestamps for interest payment events, deduplicated + and filtered to (IED, maturity_date]. Returns empty tuple if + interest_payment_anchor, interest_payment_cycle, or maturity_date + are not specified. + + Example: + >>> # Monthly interest payments from Feb to Dec 2021 + >>> contract = ContractAttributes( + ... interest_payment_anchor=1612137600, # 2021-02-01 + ... interest_payment_cycle=Cycle(count=1, unit="M"), + ... ... + ... ) + >>> terms = NormalizedActusTerms( + ... initial_exchange_date=1609459200, # 2021-01-01 + ... maturity_date=1640995200, # 2022-01-01 + ... ... + ... ) + >>> schedule = _interest_schedule(contract, terms) + # Returns timestamps: [Feb 1, Mar 1, ..., Dec 1, Jan 1 2022] + """ anchor = contract.interest_payment_anchor cycle = contract.interest_payment_cycle @@ -843,7 +1115,7 @@ def _interest_schedule( md_present = terms.maturity_date in timestamps if not md_present: maturity_date = terms.maturity_date - if str(cycle).upper().endswith("+"): + if cycle.stub == "+": timestamps[-1] = maturity_date else: timestamps.append(maturity_date) @@ -855,7 +1127,20 @@ def _rate_reset_schedule( outstanding: int, maturity_date: int | None, ) -> tuple[_EventSeed, ...]: - """Build non-cash RR/RRF seeds from the normalized reset schedule.""" + """ + Build non-cash RR/RRF event seeds from the rate reset schedule. + + Creates RR (Rate Reset) and RRF (Rate Reset with Fixed spread) event seeds + that update the interest rate without cash flows. + + Args: + contract: ACTUS contract attributes. + outstanding: Current outstanding principal. + maturity_date: Contract maturity date. + + Returns: + Tuple of rate reset event seeds. + """ if maturity_date is None: return () next_rate = ( @@ -881,7 +1166,19 @@ def _rate_reset_occurrences( contract: ContractAttributes, maturity_date: int | None, ) -> tuple[tuple[int, str], ...]: - """Resolve rate reset occurrences and label them as RR or RRF.""" + """ + Resolve rate reset occurrences and label them as RR or RRF. + + Generates tuples of (timestamp, event_type) for rate reset events, + distinguishing between simple resets (RR) and fixed resets (RRF). + + Args: + contract: ACTUS contract attributes. + maturity_date: Contract maturity date. + + Returns: + Tuple of (timestamp, event_type) pairs for rate reset events. + """ anchor = contract.rate_reset_anchor cycle = contract.rate_reset_cycle if anchor is None or cycle is None or maturity_date is None: @@ -914,7 +1211,20 @@ def _ipcb_schedule( outstanding: int, maturity_date: int | None, ) -> tuple[_EventSeed, ...]: - """Build IPCB seeds for interest calculation base adjustments.""" + """ + Build IPCB event seeds for interest calculation base adjustments. + + IPCB (Interest Payment Calculation Base) events adjust the base amount + used for interest calculations without generating cash flows. + + Args: + contract: ACTUS contract attributes. + outstanding: Current outstanding principal. + maturity_date: Contract maturity date. + + Returns: + Tuple of IPCB event seeds. + """ anchor = contract.interest_calculation_base_anchor cycle = contract.interest_calculation_base_cycle if anchor is None or cycle is None or maturity_date is None: @@ -941,7 +1251,19 @@ def _ipcb_schedule( def _seed_from_preprocessed( event_id: int, item: ObservedEventRequest | ExecutionScheduleEntry ) -> _EventSeed: - """Convert a preprocessed event payload into an intermediate event seed.""" + """ + Convert a preprocessed event payload into an intermediate event seed. + + Handles both ObservedEventRequest and ExecutionScheduleEntry types, + converting them to the internal _EventSeed representation. + + Args: + event_id: Unique identifier for the event. + item: Preprocessed event or schedule entry. + + Returns: + Event seed representation of the preprocessed event. + """ if isinstance(item, ExecutionScheduleEntry): return _EventSeed( event_type=item.event_type, @@ -958,7 +1280,18 @@ def _seed_from_preprocessed( def _seed_sort_key(seed: _EventSeed) -> tuple[int, int, str]: - """Return the deterministic ACTUS event ordering key for a seed.""" + """ + Return the deterministic ACTUS event ordering key for a seed. + + Events are ordered by: (1) scheduled time, (2) priority, (3) event type. + Ensures deterministic ordering when multiple events occur at the same time. + + Args: + seed: Event seed to generate sort key for. + + Returns: + Tuple of (scheduled_time, priority, event_type) for sorting. + """ priority = EVENT_SCHEDULE_PRIORITY.get(seed.event_type, 99) return seed.scheduled_time, priority, seed.event_type @@ -968,7 +1301,20 @@ def _initial_next_principal_redemption( terms: NormalizedActusTerms, asa_decimals: int, ) -> int: - """Resolve the initial next principal redemption term for the first IED state.""" + """ + Resolve the initial next principal redemption for the first IED state. + + For ANN contracts, calculates the annuity payment amount. + For other contracts, uses the configured next_principal_redemption_amount. + + Args: + contract: ACTUS contract attributes. + terms: Normalized contract terms. + asa_decimals: Decimal places for the denomination ASA. + + Returns: + Initial principal redemption amount in ASA base units. + """ if contract.contract_type != "ANN": if contract.next_principal_redemption_amount is None: return 0 @@ -981,7 +1327,23 @@ def _resolve_annuity_payment( terms: NormalizedActusTerms, asa_decimals: int, ) -> int: - """Resolve the initial annuity payment amount from terms or formula.""" + """ + Resolve the initial annuity payment amount from terms or formula. + + For ANN contracts, either uses the configured payment amount or calculates + it using the annuity formula based on present value of cash flows. + + Args: + contract: ACTUS contract attributes. + terms: Normalized contract terms. + asa_decimals: Decimal places for the denomination ASA. + + Returns: + Annuity payment amount in ASA base units. + + Raises: + ActusNormalizationError: If required fields are missing. + """ payment_total = _to_asa_units( contract.next_principal_redemption_amount, asa_decimals @@ -1030,7 +1392,19 @@ def _resolve_annuity_payment( def _lax_direction(contract: ContractAttributes, period_index: int) -> str: - """Return whether a LAX period decreases or increases principal.""" + """ + Return whether a LAX period decreases or increases principal. + + Uses array_increase_decrease to determine if a period generates + a principal increase (INC) or decrease (DEC) event. + + Args: + contract: ACTUS contract attributes. + period_index: Zero-based index of the period. + + Returns: + "INC" for increase or "DEC" for decrease (default). + """ directions = tuple( str(value).upper() for value in contract.array_increase_decrease or () ) @@ -1048,7 +1422,33 @@ def _interest_minor_units( day_count_convention: int, maturity_date: int | None, ) -> int: - """Compute interest in minor units for a principal and accrual interval.""" + """ + Compute interest in minor units for a principal and accrual interval. + + Calculates interest as: principal * rate * year_fraction, where rate + and year_fraction are in fixed-point representation. + + Example: + >>> _interest_minor_units( + ... principal=100000, + ... rate_fp=50000000, # 5% in fixed-point + ... start_ts=1609459200, + ... end_ts=1612137600, + ... day_count_convention=2, # 30/360 + ... maturity_date=None + ... ) + + Args: + principal: Principal amount in ASA base units. + rate_fp: Interest rate in fixed-point representation. + start_ts: Accrual start timestamp. + end_ts: Accrual end timestamp. + day_count_convention: Day count convention code. + maturity_date: Optional maturity date for year fraction calculation. + + Returns: + Interest amount in ASA base units. + """ if rate_fp <= 0 or end_ts <= start_ts: return 0 year_fraction = year_fraction_fixed( @@ -1067,7 +1467,26 @@ def _interest_minor_units( def _subtract_one_cycle(timestamp: UTCTimeStamp, cycle: Cycle) -> int: - """Move one ACTUS cycle backward from a timestamp.""" + """ + Move one ACTUS cycle backward from a timestamp. + + Supports daily (D), weekly (W), monthly (M), quarterly (Q), + semi-annual (H), and yearly (Y) cycles. + + Example: + >>> cycle = Cycle(count=1, unit="M") + >>> _subtract_one_cycle(1612137600, cycle) # 2021-02-01 -> 2021-01-01 + + Args: + timestamp: Starting Unix timestamp. + cycle: ACTUS cycle specification. + + Returns: + Unix timestamp one cycle earlier. + + Raises: + ActusNormalizationError: If cycle unit is unsupported. + """ if cycle.unit == "D": return timestamp - cycle.count * cst.DAY_2_SEC @@ -1094,7 +1513,20 @@ def _annuity_start_timestamp( principal_redemption_anchor: UTCTimeStamp, principal_redemption_cycle: Cycle, ) -> int: - """Return the start timestamp used by the ANN payment formula.""" + """ + Return the start timestamp used by the ANN payment formula. + + The annuity calculation starts from the later of: IED or one cycle + before the first principal redemption. + + Args: + initial_exchange_date: Contract IED timestamp. + principal_redemption_anchor: Anchor date for principal redemptions. + principal_redemption_cycle: Principal redemption cycle. + + Returns: + Start timestamp for annuity calculation. + """ return max( initial_exchange_date, _subtract_one_cycle(principal_redemption_anchor, principal_redemption_cycle), @@ -1111,7 +1543,24 @@ def _calculate_annuity_payment( day_count_convention: int, maturity_date: int | None, ) -> int: - """Calculate an annuity payment from a redemption schedule and rate path.""" + """ + Calculate an annuity payment from a redemption schedule and rate path. + + Uses the present value formula to compute the constant payment amount + that amortizes the principal plus accrued interest over the schedule. + + Args: + start_ts: Calculation start timestamp. + redemption_schedule: Sequence of payment timestamps. + notional: Principal amount in ASA base units. + accrued_interest: Accrued interest at start. + rate_fp: Interest rate in fixed-point representation. + day_count_convention: Day count convention code. + maturity_date: Optional maturity date for calculations. + + Returns: + Annuity payment amount in ASA base units. + """ remaining = tuple(due_ts for due_ts in redemption_schedule if due_ts > start_ts) if not remaining: return 0 @@ -1156,7 +1605,25 @@ def _seed_from_timestamp( next_outstanding_principal: int = 0, flags: int = 0, ) -> _EventSeed: - """Create an intermediate event seed from a resolved schedule timestamp.""" + """ + Create an intermediate event seed from a resolved schedule timestamp. + + Factory function for creating _EventSeed instances with default values + for optional fields. + + Args: + timestamp: Unix timestamp when event occurs. + event_type: ACTUS event type (e.g., "IED", "IP", "PR"). + redemption_accrual_start: Start of redemption accrual period. + redemption_accrual_end: End of redemption accrual period. + next_nominal_interest_rate: Interest rate after this event. + next_principal_redemption: Principal redemption amount. + next_outstanding_principal: Outstanding principal after event. + flags: Event flags (cash/non-cash, etc.). + + Returns: + Event seed with specified parameters. + """ return _EventSeed( event_type=event_type, scheduled_time=timestamp, From bd0cf7b0533f75eba304c52924372f3da3fc695c Mon Sep 17 00:00:00 2001 From: cusma Date: Wed, 11 Mar 2026 13:08:01 +0100 Subject: [PATCH 033/244] chore: handle premium and discount at ied --- src/normalization.py | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/normalization.py b/src/normalization.py index 3c030c19..7582904e 100644 --- a/src/normalization.py +++ b/src/normalization.py @@ -120,14 +120,24 @@ def _compute_initial_exchange_amount( Args: notional: The notional principal amount. premium_discount_at_ied: Premium/discount adjustment at IED. + Positive value = discount (reduces notional) + Negative value = premium (increases notional) asa_decimals: Number of decimal places for the ASA. Returns: Net initial exchange amount in ASA base units. """ notional = _to_asa_units(notional, asa_decimals) - pdied = _to_asa_units(premium_discount_at_ied, asa_decimals) - return notional - pdied + + # Handle premium (negative) and discount (positive) separately + # to avoid _to_asa_units rejecting negative values + if premium_discount_at_ied >= 0: + pdied = _to_asa_units(premium_discount_at_ied, asa_decimals) + return notional - pdied + else: + # For negative premium_discount (premium), convert absolute value and add + pdied = _to_asa_units(-premium_discount_at_ied, asa_decimals) + return notional + pdied def _deduplicate_timestamps(ts: Sequence[UTCTimeStamp]) -> tuple[UTCTimeStamp, ...]: @@ -347,7 +357,10 @@ def _normalize_schedule( else: seeds = list( _build_schedule_seeds( - contract, terms, contract_type=base_contract_type, asa_decimals=asa_decimals + contract, + terms, + contract_type=base_contract_type, + asa_decimals=asa_decimals, ) ) From 4af98cf217d402ef0359a9944ee1197c677c52fc Mon Sep 17 00:00:00 2001 From: cusma Date: Wed, 11 Mar 2026 13:08:24 +0100 Subject: [PATCH 034/244] chore: support str cycles --- src/schedule.py | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/src/schedule.py b/src/schedule.py index 81008ec0..9ad3b352 100644 --- a/src/schedule.py +++ b/src/schedule.py @@ -218,7 +218,7 @@ def _add_cycle_chained( def add_cycle( timestamp: UTCTimeStamp, - cycle: Cycle, + cycle: str | Cycle, *, end_of_month_convention: EndOfMonthConvention, anchor_timestamp: UTCTimeStamp | None = None, @@ -235,7 +235,7 @@ def add_cycle( Args: timestamp: UTC UNIX timestamp to advance (used in chained mode) - cycle: ACTUS cycle (e.g., "3M", "1Q", "90D") + cycle: ACTUS cycle (e.g., "3M", "1Q", "90D") or Cycle object end_of_month_convention: How to handle month-end dates for month-based cycles anchor_timestamp: Optional fixed starting point for anchor-based calculation occurrence_index: Optional occurrence number (0 = anchor, 1 = first, etc.) @@ -249,6 +249,9 @@ def add_cycle( over many iterations. """ + # Parse cycle if string + cycle = Cycle.parse_cycle(cycle) + # Anchor-based mode: calculate from fixed anchor if anchor_timestamp is not None and occurrence_index is not None: if cycle.unit in {"M", "Q", "H", "Y"}: @@ -271,7 +274,7 @@ def add_cycle( def generate_schedule( start: UTCTimeStamp, - cycle: Cycle, + cycle: str | Cycle, end: UTCTimeStamp, *, end_of_month_convention: EndOfMonthConvention, @@ -286,7 +289,7 @@ def generate_schedule( Args: start: UTC UNIX timestamp anchor (first date in schedule) - cycle: ACTUS cycle (e.g., "3M", "1Q", "90D") + cycle: ACTUS cycle (e.g., "3M", "1Q", "90D") or Cycle object end: UTC UNIX timestamp upper bound (inclusive) end_of_month_convention: How to handle month-end dates for month-based cycles @@ -307,6 +310,9 @@ def generate_schedule( if start <= 0 or end <= 0 or start > end: return () + # Parse cycle if string + cycle = Cycle.parse_cycle(cycle) + schedule: list[int] = [] occurrence_index = 0 @@ -342,7 +348,7 @@ def generate_schedule( def generate_array_schedule( anchors: Sequence[UTCTimeStamp], - cycles: Sequence[Cycle], + cycles: Sequence[str | Cycle], end: UTCTimeStamp, *, end_of_month_convention: EndOfMonthConvention, @@ -362,7 +368,7 @@ def generate_array_schedule( Args: anchors: Sequence of UTC UNIX timestamps marking schedule segment starts - cycles: Sequence of ACTUS cycle, parallel to anchors + cycles: Sequence of ACTUS cycle strings or Cycle objects, parallel to anchors end: UTC UNIX timestamp upper bound (inclusive, always included in result) end_of_month_convention: How to handle month-end dates for month-based cycles @@ -429,7 +435,7 @@ def generate_array_schedule( def resolve_cycle_schedule( start: UTCTimeStamp, - cycle: Cycle, + cycle: str | Cycle, end: UTCTimeStamp, *, end_of_month_convention: EndOfMonthConvention, @@ -445,7 +451,7 @@ def resolve_cycle_schedule( Args: start: UTC UNIX timestamp anchor (first date in schedule) - cycle: ACTUS cycle + cycle: ACTUS cycle string or Cycle object end: UTC UNIX timestamp upper bound (inclusive) end_of_month_convention: How to handle month-end dates for month-based cycles business_day_convention: How to adjust dates that fall on non-business days @@ -482,7 +488,7 @@ def resolve_cycle_schedule( def resolve_array_schedule( anchors: Sequence[UTCTimeStamp], - cycles: Sequence[Cycle], + cycles: Sequence[str | Cycle], end: UTCTimeStamp, *, end_of_month_convention: EndOfMonthConvention, @@ -499,7 +505,7 @@ def resolve_array_schedule( Args: anchors: Sequence of UTC UNIX timestamps marking schedule segment starts - cycles: Sequence of ACTUS cycle, parallel to anchors + cycles: Sequence of ACTUS cycle strings or Cycle objects, parallel to anchors end: UTC UNIX timestamp upper bound (inclusive) end_of_month_convention: How to handle month-end dates for month-based cycles business_day_convention: How to adjust dates that fall on non-business days From 41aeef2026ee67f58b42916b4e741bc0557e1683 Mon Sep 17 00:00:00 2001 From: cusma Date: Wed, 11 Mar 2026 13:08:39 +0100 Subject: [PATCH 035/244] chore: lint --- tests/sdk/test_contracts.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/tests/sdk/test_contracts.py b/tests/sdk/test_contracts.py index 5cc9c883..a9abc5f1 100644 --- a/tests/sdk/test_contracts.py +++ b/tests/sdk/test_contracts.py @@ -1,12 +1,13 @@ """Tests for the contracts module.""" -import pytest from decimal import Decimal +import pytest + from src.contracts import ( ContractAttributes, - make_pam_zero_coupon_bond, make_pam_fixed_coupon_bond_profile, + make_pam_zero_coupon_bond, ) from src.day_count import ( BusinessDayConvention, @@ -94,7 +95,9 @@ def test_contract_with_business_day_conventions(self): def test_unsupported_contract_type_raises_error(self): """Test that unsupported contract types raise an error.""" - with pytest.raises(UnsupportedActusFeatureError, match="Unsupported ACTUS contract type"): + with pytest.raises( + UnsupportedActusFeatureError, match="Unsupported ACTUS contract type" + ): ContractAttributes( contract_id=1, contract_type="INVALID", @@ -107,7 +110,9 @@ def test_unsupported_contract_type_raises_error(self): def test_unsupported_business_day_convention_raises_error(self): """Test that unsupported business day conventions raise an error.""" - with pytest.raises(UnsupportedActusFeatureError, match="Unsupported business day convention"): + with pytest.raises( + UnsupportedActusFeatureError, match="Unsupported business day convention" + ): ContractAttributes( contract_id=1, contract_type="PAM", @@ -458,5 +463,3 @@ def test_contract_is_frozen(self): contract.contract_id = 2 with pytest.raises(AttributeError): contract.notional_principal = 2000000 - - From e31baac8f62994e4c01a4712e2e4dd2cc776b42d Mon Sep 17 00:00:00 2001 From: cusma Date: Wed, 11 Mar 2026 13:08:46 +0100 Subject: [PATCH 036/244] chore: lint --- tests/sdk/test_normalization.py | 45 +++++++++++++++++---------------- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/tests/sdk/test_normalization.py b/tests/sdk/test_normalization.py index 0a19f72f..953869e1 100644 --- a/tests/sdk/test_normalization.py +++ b/tests/sdk/test_normalization.py @@ -1,26 +1,26 @@ """Tests for the normalization module.""" -import pytest from decimal import Decimal +import pytest + from smart_contracts import constants as cst from smart_contracts import enums - -from src.normalization import ( - normalize_contract_attributes, - _to_asa_units, - _rate_to_fp, - _compute_initial_exchange_amount, - _deduplicate_timestamps, -) from src.contracts import ( ContractAttributes, - make_pam_zero_coupon_bond, make_pam_fixed_coupon_bond_profile, + make_pam_zero_coupon_bond, ) from src.errors import ActusNormalizationError +from src.models import ExecutionScheduleEntry, NormalizedActusTerms +from src.normalization import ( + _compute_initial_exchange_amount, + _deduplicate_timestamps, + _rate_to_fp, + _to_asa_units, + normalize_contract_attributes, +) from src.schedule import Cycle -from src.models import NormalizedActusTerms, ExecutionScheduleEntry class TestToAsaUnits: @@ -240,7 +240,9 @@ def test_status_date_after_ied_raises_error(self): premium_discount_at_ied=0, ) - with pytest.raises(ActusNormalizationError, match="status_date to be strictly before"): + with pytest.raises( + ActusNormalizationError, match="status_date to be strictly before" + ): normalize_contract_attributes( contract, denomination_asset_id=100, @@ -300,7 +302,9 @@ def test_normalize_pam_fixed_coupon_bond(self): assert len(result.schedule) > 0 # Check that rate is normalized to fixed point - assert result.terms.rate_reset_next == int(Decimal("0.05") * cst.FIXED_POINT_SCALE) + assert result.terms.rate_reset_next == int( + Decimal("0.05") * cst.FIXED_POINT_SCALE + ) # Should have IED and MD events at minimum event_types = {e.event_type for e in result.schedule} @@ -427,7 +431,9 @@ def test_terms_total_units_calculation(self): def test_terms_with_zero_notional_unit_value_raises_error(self): """Test that zero notional_unit_value raises error.""" - with pytest.raises(ActusNormalizationError, match="notional_unit_value must be positive"): + with pytest.raises( + ActusNormalizationError, match="notional_unit_value must be positive" + ): NormalizedActusTerms( contract_id=1, contract_type=enums.CT_PAM, @@ -451,7 +457,9 @@ def test_terms_with_zero_notional_unit_value_raises_error(self): def test_terms_indivisible_notional_raises_error(self): """Test that notional not divisible by unit value raises error.""" - with pytest.raises(ActusNormalizationError, match="divisible by notional_unit_value"): + with pytest.raises( + ActusNormalizationError, match="divisible by notional_unit_value" + ): NormalizedActusTerms( contract_id=1, contract_type=enums.CT_PAM, @@ -774,10 +782,3 @@ def test_schedule_pages_invalid_page_size(self): with pytest.raises(ValueError, match="page_size must be positive"): result.schedule_pages(page_size=-1) - - - - - - - From b7daef7d840940e8783231c405ecfd967e092ad4 Mon Sep 17 00:00:00 2001 From: cusma Date: Wed, 11 Mar 2026 13:09:24 +0100 Subject: [PATCH 037/244] chore: update cycles and eom conventions --- tests/sdk/test_schedule.py | 207 ++++++++++++++++++++++++++++++------- 1 file changed, 169 insertions(+), 38 deletions(-) diff --git a/tests/sdk/test_schedule.py b/tests/sdk/test_schedule.py index e995d010..b974fdb4 100644 --- a/tests/sdk/test_schedule.py +++ b/tests/sdk/test_schedule.py @@ -140,7 +140,11 @@ def test_add_day_cycle(self) -> None: start = datetime_to_timestamp( datetime(2024, 1, 15, 0, 0, 0, tzinfo=timezone.utc) ) - result = add_cycle(start, "30D") + result = add_cycle( + start, + "30D", + end_of_month_convention=EndOfMonthConvention.SAME_DAY, + ) expected = datetime_to_timestamp( datetime(2024, 2, 14, 0, 0, 0, tzinfo=timezone.utc) ) @@ -151,7 +155,11 @@ def test_add_week_cycle(self) -> None: start = datetime_to_timestamp( datetime(2024, 1, 15, 0, 0, 0, tzinfo=timezone.utc) ) - result = add_cycle(start, "2W") + result = add_cycle( + start, + "2W", + end_of_month_convention=EndOfMonthConvention.SAME_DAY, + ) expected = datetime_to_timestamp( datetime(2024, 1, 29, 0, 0, 0, tzinfo=timezone.utc) ) @@ -162,7 +170,11 @@ def test_add_month_cycle(self) -> None: start = datetime_to_timestamp( datetime(2024, 1, 15, 0, 0, 0, tzinfo=timezone.utc) ) - result = add_cycle(start, "1M") + result = add_cycle( + start, + "1M", + end_of_month_convention=EndOfMonthConvention.SAME_DAY, + ) expected = datetime_to_timestamp( datetime(2024, 2, 15, 0, 0, 0, tzinfo=timezone.utc) ) @@ -173,7 +185,11 @@ def test_add_quarter_cycle(self) -> None: start = datetime_to_timestamp( datetime(2024, 1, 15, 0, 0, 0, tzinfo=timezone.utc) ) - result = add_cycle(start, "1Q") + result = add_cycle( + start, + "1Q", + end_of_month_convention=EndOfMonthConvention.SAME_DAY, + ) expected = datetime_to_timestamp( datetime(2024, 4, 15, 0, 0, 0, tzinfo=timezone.utc) ) @@ -184,7 +200,11 @@ def test_add_half_year_cycle(self) -> None: start = datetime_to_timestamp( datetime(2024, 1, 15, 0, 0, 0, tzinfo=timezone.utc) ) - result = add_cycle(start, "1H") + result = add_cycle( + start, + "1H", + end_of_month_convention=EndOfMonthConvention.SAME_DAY, + ) expected = datetime_to_timestamp( datetime(2024, 7, 15, 0, 0, 0, tzinfo=timezone.utc) ) @@ -195,7 +215,11 @@ def test_add_year_cycle(self) -> None: start = datetime_to_timestamp( datetime(2024, 1, 15, 0, 0, 0, tzinfo=timezone.utc) ) - result = add_cycle(start, "1Y") + result = add_cycle( + start, + "1Y", + end_of_month_convention=EndOfMonthConvention.SAME_DAY, + ) expected = datetime_to_timestamp( datetime(2025, 1, 15, 0, 0, 0, tzinfo=timezone.utc) ) @@ -237,6 +261,7 @@ def test_add_cycle_with_anchor_and_occurrence(self) -> None: result = add_cycle( anchor, "1M", + end_of_month_convention=EndOfMonthConvention.SAME_DAY, anchor_timestamp=anchor, occurrence_index=3, ) @@ -284,7 +309,9 @@ def test_generate_monthly_schedule(self) -> None: ) end = datetime_to_timestamp(datetime(2024, 4, 15, 0, 0, 0, tzinfo=timezone.utc)) - schedule = generate_schedule(start, "1M", end) + schedule = generate_schedule( + start, "1M", end, end_of_month_convention=EndOfMonthConvention.SAME_DAY + ) expected = ( datetime_to_timestamp(datetime(2024, 1, 15, 0, 0, 0, tzinfo=timezone.utc)), @@ -303,7 +330,9 @@ def test_generate_quarterly_schedule(self) -> None: datetime(2024, 12, 31, 0, 0, 0, tzinfo=timezone.utc) ) - schedule = generate_schedule(start, "1Q", end) + schedule = generate_schedule( + start, "1Q", end, end_of_month_convention=EndOfMonthConvention.SAME_DAY + ) expected = ( datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=timezone.utc)), @@ -320,7 +349,9 @@ def test_generate_daily_schedule(self) -> None: ) end = datetime_to_timestamp(datetime(2024, 1, 5, 0, 0, 0, tzinfo=timezone.utc)) - schedule = generate_schedule(start, "1D", end) + schedule = generate_schedule( + start, "1D", end, end_of_month_convention=EndOfMonthConvention.SAME_DAY + ) assert len(schedule) == 5 assert schedule[0] == start @@ -333,7 +364,9 @@ def test_generate_yearly_schedule(self) -> None: ) end = datetime_to_timestamp(datetime(2027, 1, 1, 0, 0, 0, tzinfo=timezone.utc)) - schedule = generate_schedule(start, "1Y", end) + schedule = generate_schedule( + start, "1Y", end, end_of_month_convention=EndOfMonthConvention.SAME_DAY + ) expected = ( datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=timezone.utc)), @@ -350,7 +383,9 @@ def test_generate_schedule_stops_at_end(self) -> None: ) end = datetime_to_timestamp(datetime(2024, 3, 15, 0, 0, 0, tzinfo=timezone.utc)) - schedule = generate_schedule(start, "1M", end) + schedule = generate_schedule( + start, "1M", end, end_of_month_convention=EndOfMonthConvention.SAME_DAY + ) # Should have Jan 1, Feb 1, Mar 1 but not Apr 1 assert len(schedule) == 3 @@ -363,7 +398,9 @@ def test_generate_schedule_includes_end_if_exact_match(self) -> None: ) end = datetime_to_timestamp(datetime(2024, 4, 1, 0, 0, 0, tzinfo=timezone.utc)) - schedule = generate_schedule(start, "1M", end) + schedule = generate_schedule( + start, "1M", end, end_of_month_convention=EndOfMonthConvention.SAME_DAY + ) assert schedule[-1] == end @@ -398,7 +435,9 @@ def test_generate_schedule_empty_if_start_after_end(self) -> None: ) end = datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=timezone.utc)) - schedule = generate_schedule(start, "1M", end) + schedule = generate_schedule( + start, "1M", end, end_of_month_convention=EndOfMonthConvention.SAME_DAY + ) assert schedule == () @@ -408,8 +447,18 @@ def test_generate_schedule_empty_if_start_zero_or_negative(self) -> None: datetime(2024, 12, 31, 0, 0, 0, tzinfo=timezone.utc) ) - assert generate_schedule(0, "1M", end) == () - assert generate_schedule(-1, "1M", end) == () + assert ( + generate_schedule( + 0, "1M", end, end_of_month_convention=EndOfMonthConvention.SAME_DAY + ) + == () + ) + assert ( + generate_schedule( + -1, "1M", end, end_of_month_convention=EndOfMonthConvention.SAME_DAY + ) + == () + ) def test_generate_schedule_empty_if_end_zero_or_negative(self) -> None: """Test empty schedule if end <= 0.""" @@ -417,8 +466,18 @@ def test_generate_schedule_empty_if_end_zero_or_negative(self) -> None: datetime(2024, 1, 1, 0, 0, 0, tzinfo=timezone.utc) ) - assert generate_schedule(start, "1M", 0) == () - assert generate_schedule(start, "1M", -1) == () + assert ( + generate_schedule( + start, "1M", 0, end_of_month_convention=EndOfMonthConvention.SAME_DAY + ) + == () + ) + assert ( + generate_schedule( + start, "1M", -1, end_of_month_convention=EndOfMonthConvention.SAME_DAY + ) + == () + ) class TestGenerateArraySchedule: @@ -432,7 +491,9 @@ def test_generate_single_segment_schedule(self) -> None: cycles = ["1M"] end = datetime_to_timestamp(datetime(2024, 4, 1, 0, 0, 0, tzinfo=timezone.utc)) - schedule = generate_array_schedule(anchors, cycles, end) + schedule = generate_array_schedule( + anchors, cycles, end, end_of_month_convention=EndOfMonthConvention.SAME_DAY + ) expected = ( datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=timezone.utc)), @@ -453,7 +514,9 @@ def test_generate_multi_segment_schedule(self) -> None: datetime(2024, 12, 31, 0, 0, 0, tzinfo=timezone.utc) ) - schedule = generate_array_schedule(anchors, cycles, end) + schedule = generate_array_schedule( + anchors, cycles, end, end_of_month_convention=EndOfMonthConvention.SAME_DAY + ) # First segment: monthly Jan 1, Feb 1, Mar 1 (stops before Apr 1) # Second segment: quarterly Apr 1, Jul 1, Oct 1 @@ -479,7 +542,9 @@ def test_generate_array_schedule_deduplicates(self) -> None: cycles = ["1M", "1M"] end = datetime_to_timestamp(datetime(2024, 5, 1, 0, 0, 0, tzinfo=timezone.utc)) - schedule = generate_array_schedule(anchors, cycles, end) + schedule = generate_array_schedule( + anchors, cycles, end, end_of_month_convention=EndOfMonthConvention.SAME_DAY + ) # Should have unique dates: Jan 1, Feb 1, Mar 1, Apr 1, May 1 assert len(schedule) == len(set(schedule)) @@ -493,7 +558,9 @@ def test_generate_array_schedule_sorts_dates(self) -> None: cycles = ["1M", "1M"] end = datetime_to_timestamp(datetime(2024, 5, 1, 0, 0, 0, tzinfo=timezone.utc)) - schedule = generate_array_schedule(anchors, cycles, end) + schedule = generate_array_schedule( + anchors, cycles, end, end_of_month_convention=EndOfMonthConvention.SAME_DAY + ) # Should be sorted assert schedule == tuple(sorted(schedule)) @@ -506,13 +573,17 @@ def test_generate_array_schedule_includes_end(self) -> None: cycles = ["1M"] end = datetime_to_timestamp(datetime(2024, 3, 15, 0, 0, 0, tzinfo=timezone.utc)) - schedule = generate_array_schedule(anchors, cycles, end) + schedule = generate_array_schedule( + anchors, cycles, end, end_of_month_convention=EndOfMonthConvention.SAME_DAY + ) assert schedule[-1] == end def test_generate_array_schedule_empty_anchors(self) -> None: """Test array schedule with empty anchors returns empty.""" - schedule = generate_array_schedule([], [], 1000000) + schedule = generate_array_schedule( + [], [], 1000000, end_of_month_convention=EndOfMonthConvention.SAME_DAY + ) assert schedule == () def test_generate_array_schedule_raises_if_length_mismatch(self) -> None: @@ -529,7 +600,12 @@ def test_generate_array_schedule_raises_if_length_mismatch(self) -> None: with pytest.raises( ValueError, match="anchors and cycles must have same length" ): - generate_array_schedule(anchors, cycles, end) + generate_array_schedule( + anchors, + cycles, + end, + end_of_month_convention=EndOfMonthConvention.SAME_DAY, + ) def test_generate_array_schedule_empty_if_end_zero_or_negative(self) -> None: """Test array schedule returns empty tuple if end <= 0.""" @@ -538,8 +614,24 @@ def test_generate_array_schedule_empty_if_end_zero_or_negative(self) -> None: ] cycles = ["1M"] - assert generate_array_schedule(anchors, cycles, 0) == () - assert generate_array_schedule(anchors, cycles, -1) == () + assert ( + generate_array_schedule( + anchors, + cycles, + 0, + end_of_month_convention=EndOfMonthConvention.SAME_DAY, + ) + == () + ) + assert ( + generate_array_schedule( + anchors, + cycles, + -1, + end_of_month_convention=EndOfMonthConvention.SAME_DAY, + ) + == () + ) def test_generate_array_schedule_empty_if_anchor_invalid(self) -> None: """Test array schedule returns empty tuple if any anchor is invalid.""" @@ -549,12 +641,30 @@ def test_generate_array_schedule_empty_if_anchor_invalid(self) -> None: cycles = ["1M"] # Test anchor <= 0 - assert generate_array_schedule([0], cycles, end) == () - assert generate_array_schedule([-1], cycles, end) == () + assert ( + generate_array_schedule( + [0], cycles, end, end_of_month_convention=EndOfMonthConvention.SAME_DAY + ) + == () + ) + assert ( + generate_array_schedule( + [-1], cycles, end, end_of_month_convention=EndOfMonthConvention.SAME_DAY + ) + == () + ) # Test anchor > end anchors = [end + 1000] - assert generate_array_schedule(anchors, cycles, end) == () + assert ( + generate_array_schedule( + anchors, + cycles, + end, + end_of_month_convention=EndOfMonthConvention.SAME_DAY, + ) + == () + ) def test_generate_array_schedule_raises_if_anchors_descending(self) -> None: """Test array schedule raises if anchors are in descending order.""" @@ -571,7 +681,12 @@ def test_generate_array_schedule_raises_if_anchors_descending(self) -> None: with pytest.raises( ValueError, match="anchors must be in strictly ascending order" ): - generate_array_schedule(anchors, cycles, end) + generate_array_schedule( + anchors, + cycles, + end, + end_of_month_convention=EndOfMonthConvention.SAME_DAY, + ) def test_generate_array_schedule_raises_if_anchors_equal(self) -> None: """Test array schedule raises if anchors are equal (not strictly ascending).""" @@ -588,7 +703,12 @@ def test_generate_array_schedule_raises_if_anchors_equal(self) -> None: with pytest.raises( ValueError, match="anchors must be in strictly ascending order" ): - generate_array_schedule(anchors, cycles, end) + generate_array_schedule( + anchors, + cycles, + end, + end_of_month_convention=EndOfMonthConvention.SAME_DAY, + ) def test_generate_array_schedule_raises_if_anchors_partially_unsorted( self, @@ -608,7 +728,12 @@ def test_generate_array_schedule_raises_if_anchors_partially_unsorted( with pytest.raises( ValueError, match="anchors must be in strictly ascending order" ): - generate_array_schedule(anchors, cycles, end) + generate_array_schedule( + anchors, + cycles, + end, + end_of_month_convention=EndOfMonthConvention.SAME_DAY, + ) class TestResolveCycleSchedule: @@ -625,8 +750,9 @@ def test_resolve_cycle_schedule_no_adjustment(self) -> None: start, "1M", end, + end_of_month_convention=EndOfMonthConvention.SAME_DAY, business_day_convention=BusinessDayConvention.NO_SHIFT, - calendar_name=Calendar.NO_CALENDAR, + calendar=Calendar.NO_CALENDAR, ) expected = ( @@ -651,8 +777,9 @@ def test_resolve_cycle_schedule_raises_for_unsupported_bdc(self) -> None: start, "1M", end, + end_of_month_convention=EndOfMonthConvention.SAME_DAY, business_day_convention=BusinessDayConvention.SHIFT_CALCULATE_FOLLOWING, - calendar_name=Calendar.NO_CALENDAR, + calendar=Calendar.NO_CALENDAR, ) def test_resolve_cycle_schedule_raises_for_unsupported_calendar(self) -> None: @@ -667,8 +794,9 @@ def test_resolve_cycle_schedule_raises_for_unsupported_calendar(self) -> None: start, "1M", end, + end_of_month_convention=EndOfMonthConvention.SAME_DAY, business_day_convention=BusinessDayConvention.NO_SHIFT, - calendar_name=Calendar.MONDAY_TO_FRIDAY, + calendar=Calendar.MONDAY_TO_FRIDAY, ) @@ -690,8 +818,9 @@ def test_resolve_array_schedule_no_adjustment(self) -> None: anchors, cycles, end, + end_of_month_convention=EndOfMonthConvention.SAME_DAY, business_day_convention=BusinessDayConvention.NO_SHIFT, - calendar_name=Calendar.NO_CALENDAR, + calendar=Calendar.NO_CALENDAR, ) # Should have dates from both segments plus end @@ -713,8 +842,9 @@ def test_resolve_array_schedule_raises_for_unsupported_bdc(self) -> None: anchors, cycles, end, + end_of_month_convention=EndOfMonthConvention.SAME_DAY, business_day_convention=BusinessDayConvention.SHIFT_CALCULATE_FOLLOWING, - calendar_name=Calendar.NO_CALENDAR, + calendar=Calendar.NO_CALENDAR, ) def test_resolve_array_schedule_raises_for_unsupported_calendar(self) -> None: @@ -730,6 +860,7 @@ def test_resolve_array_schedule_raises_for_unsupported_calendar(self) -> None: anchors, cycles, end, + end_of_month_convention=EndOfMonthConvention.SAME_DAY, business_day_convention=BusinessDayConvention.NO_SHIFT, - calendar_name=Calendar.MONDAY_TO_FRIDAY, + calendar=Calendar.MONDAY_TO_FRIDAY, ) From 0cce6d6d2d95ca1259e9cb8fd33c21ad021a20b3 Mon Sep 17 00:00:00 2001 From: cusma Date: Wed, 11 Mar 2026 13:31:28 +0100 Subject: [PATCH 038/244] chore: default next_principal_redemption_amount to 0 --- src/contracts.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/contracts.py b/src/contracts.py index 5b0d0834..be4e0e45 100644 --- a/src/contracts.py +++ b/src/contracts.py @@ -94,7 +94,7 @@ class ContractAttributes: # Principal notional_principal: int | float | Decimal premium_discount_at_ied: int | float | Decimal - next_principal_redemption_amount: int | float | Decimal | None = None + next_principal_redemption_amount: int | float | Decimal = 0 principal_redemption_cycle: Cycle | None = None principal_redemption_anchor: UTCTimeStamp | None = None amortization_date: UTCTimeStamp | None = None @@ -158,7 +158,7 @@ def __post_init__(self) -> None: if self.business_day_convention in REJECTED_BDC: raise UnsupportedActusFeatureError( - f"Unsupported business day convention {self.business_day_convention.name}. " + f"Unsupported business day convention {self.business_day_convention.name}" ) From 7f131e22e5851b78da084400a84f67637cddc42b Mon Sep 17 00:00:00 2001 From: cusma Date: Wed, 11 Mar 2026 13:31:36 +0100 Subject: [PATCH 039/244] chore: default next_principal_redemption_amount to 0 --- tests/sdk/test_contracts.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/sdk/test_contracts.py b/tests/sdk/test_contracts.py index a9abc5f1..cba38fe9 100644 --- a/tests/sdk/test_contracts.py +++ b/tests/sdk/test_contracts.py @@ -433,7 +433,6 @@ def test_default_optional_fields(self): notional_principal=1000000, premium_discount_at_ied=0, ) - assert contract.next_principal_redemption_amount is None assert contract.principal_redemption_cycle is None assert contract.principal_redemption_anchor is None assert contract.interest_payment_anchor is None From 68549948efcc4939c70b0164e094e9389cc2ac2f Mon Sep 17 00:00:00 2001 From: cusma Date: Wed, 11 Mar 2026 13:31:47 +0100 Subject: [PATCH 040/244] chore: nit --- src/models.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/models.py b/src/models.py index 83c00ee4..ea892daf 100644 --- a/src/models.py +++ b/src/models.py @@ -22,7 +22,6 @@ class NormalizedActusTerms: - UTC UNIX timestamp AVM Numeric values (UInt64): - - Rates: in BPS (base-points), 1 BPS = 0.01% - Amounts: in ASA minimal units - Fixed Point are scaled From ecc205bc506f2428f2bedaa1eddb93526f11262c Mon Sep 17 00:00:00 2001 From: cusma Date: Wed, 11 Mar 2026 13:32:16 +0100 Subject: [PATCH 041/244] chore: apply code review fixes and update --- src/normalization.py | 22 +++++++++++----------- tests/sdk/test_normalization.py | 23 ----------------------- 2 files changed, 11 insertions(+), 34 deletions(-) diff --git a/src/normalization.py b/src/normalization.py index 7582904e..14de9e7f 100644 --- a/src/normalization.py +++ b/src/normalization.py @@ -186,7 +186,6 @@ def normalize_contract_attributes( notional_unit_value: int | float | Decimal, secondary_market_opening_date: UTCTimeStamp, secondary_market_closure_date: UTCTimeStamp, - fixed_point_scale: int = cst.FIXED_POINT_SCALE, preprocessed_events: ( Sequence[ObservedEventRequest | ExecutionScheduleEntry] | None ) = None, @@ -204,7 +203,6 @@ def normalize_contract_attributes( notional_unit_value: Notional value per unit in denomination ASA. secondary_market_opening_date: Unix timestamp for secondary market opening. secondary_market_closure_date: Unix timestamp for secondary market closure. - fixed_point_scale: Scaling factor for fixed-point arithmetic (default: 1e9). preprocessed_events: Optional pre-generated event schedule. Returns: @@ -268,7 +266,9 @@ def normalize_contract_attributes( notional_unit_value, denomination_asset_decimals ), initial_exchange_amount=pdied_asa, - next_principal_redemption_amount=contract.next_principal_redemption_amount, + next_principal_redemption_amount=_to_asa_units( + contract.next_principal_redemption_amount, denomination_asset_decimals + ), # Interest rate_reset_spread=_rate_to_fp(contract.rate_reset_spread), rate_reset_multiplier=_rate_to_fp(contract.rate_reset_multiplier), @@ -282,7 +282,7 @@ def normalize_contract_attributes( # Day Count Convention day_count_convention=contract.day_count_convention, # Scaling - fixed_point_scale=fixed_point_scale, + fixed_point_scale=cst.FIXED_POINT_SCALE, ) # Normalize ACTUS contract schedule to AVM @@ -1156,12 +1156,10 @@ def _rate_reset_schedule( """ if maturity_date is None: return () - next_rate = ( - _rate_to_fp( - contract.rate_reset_next - if contract.rate_reset_next is not None - else contract.nominal_interest_rate - ), + next_rate = _rate_to_fp( + contract.rate_reset_next + if contract.rate_reset_next is not None + else contract.nominal_interest_rate ) return tuple( _seed_from_timestamp( @@ -1364,7 +1362,9 @@ def _resolve_annuity_payment( if not terms.dynamic_principal_redemption and payment_total > 0: return payment_total - if contract.maturity_date is None or contract.amortization_date is None: + # Use maturity_date or amortization_date (whichever is set) + end_date = contract.maturity_date or contract.amortization_date + if end_date is None: raise ActusNormalizationError( "ANN normalization requires maturity_date or amortization_date" ) diff --git a/tests/sdk/test_normalization.py b/tests/sdk/test_normalization.py index 953869e1..070d16ea 100644 --- a/tests/sdk/test_normalization.py +++ b/tests/sdk/test_normalization.py @@ -252,29 +252,6 @@ def test_status_date_after_ied_raises_error(self): secondary_market_closure_date=1950000, ) - def test_normalize_with_custom_fixed_point_scale(self): - """Test normalization with custom fixed point scale.""" - contract = make_pam_zero_coupon_bond( - contract_id=1, - status_date=1000000, - initial_exchange_date=1100000, - maturity_date=2000000, - notional_principal=1000000, - premium_discount_at_ied=0, - ) - - custom_scale = 1_000_000 - result = normalize_contract_attributes( - contract, - denomination_asset_id=100, - denomination_asset_decimals=2, - notional_unit_value=1000, - secondary_market_opening_date=1150000, - secondary_market_closure_date=1950000, - fixed_point_scale=custom_scale, - ) - assert result.terms.fixed_point_scale == custom_scale - def test_normalize_pam_fixed_coupon_bond(self): """Test normalizing a PAM fixed coupon bond.""" contract = make_pam_fixed_coupon_bond_profile( From 0b2f1736aa02d1c3579e6c99f39cee5db04d9773 Mon Sep 17 00:00:00 2001 From: cusma Date: Wed, 11 Mar 2026 16:44:42 +0100 Subject: [PATCH 042/244] chore: optional maturity date --- src/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/models.py b/src/models.py index ea892daf..6578ef45 100644 --- a/src/models.py +++ b/src/models.py @@ -38,7 +38,7 @@ class NormalizedActusTerms: # Time initial_exchange_date: UTCTimeStamp - maturity_date: UTCTimeStamp + maturity_date: UTCTimeStamp | None secondary_market_opening_date: UTCTimeStamp secondary_market_closure_date: UTCTimeStamp From f46182cc0222dfa1111f1dc0b77161423a3e0f55 Mon Sep 17 00:00:00 2001 From: cusma Date: Wed, 11 Mar 2026 16:45:10 +0100 Subject: [PATCH 043/244] chore: no default dey count convention --- src/contracts.py | 33 +++++++------- tests/sdk/test_contracts.py | 89 +++++++++++++++++++++++++++++++++++++ 2 files changed, 106 insertions(+), 16 deletions(-) diff --git a/src/contracts.py b/src/contracts.py index be4e0e45..94a363f9 100644 --- a/src/contracts.py +++ b/src/contracts.py @@ -36,7 +36,8 @@ class ContractAttributes: maturity_date: Final maturity date when contract terminates. notional_principal: Principal amount of the contract. - premium_discount_at_ied: Premium/discount adjustment at IED. + premium_discount_at_ied: Premium/discount adjustment at IED + (positive for discount, negative for premium). next_principal_redemption_amount: Fixed payment amount per period. principal_redemption_cycle: Frequency of principal payments. principal_redemption_anchor: Anchor date for principal schedule. @@ -91,6 +92,12 @@ class ContractAttributes: initial_exchange_date: UTCTimeStamp maturity_date: UTCTimeStamp | None + # Day Count Convention + day_count_convention: DayCountConvention + business_day_convention: BusinessDayConvention + end_of_month_convention: EndOfMonthConvention + calendar: Calendar + # Principal notional_principal: int | float | Decimal premium_discount_at_ied: int | float | Decimal @@ -113,12 +120,6 @@ class ContractAttributes: rate_reset_cap: int | float | Decimal = 0 rate_reset_next: int | float | Decimal | None = None - # Day Count Convention - day_count_convention: DayCountConvention = DayCountConvention.A360 - business_day_convention: BusinessDayConvention = BusinessDayConvention.NOS - end_of_month_convention: EndOfMonthConvention = EndOfMonthConvention.SD - calendar: Calendar = Calendar.NC - # Arrays array_pr_anchor: list[UTCTimeStamp] | None = None array_pr_cycle: list[Cycle] | None = None @@ -170,10 +171,10 @@ def make_pam_zero_coupon_bond( maturity_date: UTCTimeStamp, notional_principal: int | float | Decimal, premium_discount_at_ied: int | float | Decimal, - day_count_convention: DayCountConvention | None = DayCountConvention.A360, - business_day_convention: BusinessDayConvention | None = BusinessDayConvention.NOS, - end_of_month_convention: EndOfMonthConvention | None = EndOfMonthConvention.SD, - calendar: Calendar | None = Calendar.NC, + day_count_convention: DayCountConvention = DayCountConvention.A360, + business_day_convention: BusinessDayConvention = BusinessDayConvention.NOS, + end_of_month_convention: EndOfMonthConvention = EndOfMonthConvention.SD, + calendar: Calendar = Calendar.NC, ) -> ContractAttributes: """ Build a PAM Zero Coupon Bond (ZCB) contract. @@ -188,7 +189,7 @@ def make_pam_zero_coupon_bond( maturity_date: Date when principal is repaid. notional_principal: Face value of the bond. premium_discount_at_ied: Premium or discount adjustment at issuance - (positive for premium, negative for discount). + (positive for discount, negative for premium). day_count_convention: Year fraction calculation method (default: A360). business_day_convention: Non-business day handling (default: NOS). end_of_month_convention: End-of-month adjustment rules (default: SD). @@ -236,10 +237,10 @@ def make_pam_fixed_coupon_bond_profile( maturity_date: UTCTimeStamp, notional_principal: int | float | Decimal, nominal_interest_rate: int | float | Decimal, - day_count_convention: DayCountConvention | None = DayCountConvention.A360, - business_day_convention: BusinessDayConvention | None = BusinessDayConvention.NOS, - end_of_month_convention: EndOfMonthConvention | None = EndOfMonthConvention.SD, - calendar: Calendar | None = Calendar.NC, + day_count_convention: DayCountConvention = DayCountConvention.A360, + business_day_convention: BusinessDayConvention = BusinessDayConvention.NOS, + end_of_month_convention: EndOfMonthConvention = EndOfMonthConvention.SD, + calendar: Calendar = Calendar.NC, interest_payment_cycle: Cycle, interest_payment_anchor: UTCTimeStamp, ) -> ContractAttributes: diff --git a/tests/sdk/test_contracts.py b/tests/sdk/test_contracts.py index cba38fe9..84288b18 100644 --- a/tests/sdk/test_contracts.py +++ b/tests/sdk/test_contracts.py @@ -32,6 +32,10 @@ def test_basic_contract_creation(self): maturity_date=2000000, notional_principal=1000000, premium_discount_at_ied=0, + day_count_convention=DayCountConvention.A360, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, ) assert contract.contract_id == 1 assert contract.contract_type == "PAM" @@ -51,6 +55,10 @@ def test_contract_with_interest(self): nominal_interest_rate=0.05, interest_payment_cycle=Cycle(count=3, unit="M"), interest_payment_anchor=1100000, + day_count_convention=DayCountConvention.A360, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, ) assert contract.nominal_interest_rate == 0.05 assert contract.premium_discount_at_ied == 10000 @@ -75,6 +83,9 @@ def test_contract_with_day_count_conventions(self): notional_principal=1000000, premium_discount_at_ied=0, day_count_convention=dcc, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, ) assert contract.day_count_convention == dcc @@ -89,7 +100,10 @@ def test_contract_with_business_day_conventions(self): maturity_date=2000000, notional_principal=1000000, premium_discount_at_ied=0, + day_count_convention=DayCountConvention.A360, business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, ) assert contract.business_day_convention == BusinessDayConvention.NOS @@ -106,6 +120,10 @@ def test_unsupported_contract_type_raises_error(self): maturity_date=2000000, notional_principal=1000000, premium_discount_at_ied=0, + day_count_convention=DayCountConvention.A360, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, ) def test_unsupported_business_day_convention_raises_error(self): @@ -121,7 +139,10 @@ def test_unsupported_business_day_convention_raises_error(self): maturity_date=2000000, notional_principal=1000000, premium_discount_at_ied=0, + day_count_convention=DayCountConvention.A360, business_day_convention=BusinessDayConvention.CSF, # Rejected BDC + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, ) def test_supported_contract_types(self): @@ -135,6 +156,10 @@ def test_supported_contract_types(self): maturity_date=2000000, notional_principal=1000000, premium_discount_at_ied=0, + day_count_convention=DayCountConvention.A360, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, ) assert contract.contract_type == contract_type @@ -148,6 +173,10 @@ def test_contract_with_subtype_notation(self): maturity_date=2000000, notional_principal=1000000, premium_discount_at_ied=50000, + day_count_convention=DayCountConvention.A360, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, ) assert contract.contract_type == "PAM:ZCB" @@ -168,6 +197,10 @@ def test_contract_with_rate_reset_parameters(self): rate_reset_next=0.05, rate_reset_cycle=Cycle(count=6, unit="M"), rate_reset_anchor=1200000, + day_count_convention=DayCountConvention.A360, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, ) assert contract.rate_reset_spread == 0.02 assert contract.rate_reset_multiplier == 1.5 @@ -188,6 +221,10 @@ def test_contract_with_principal_redemption(self): next_principal_redemption_amount=100000, principal_redemption_cycle=Cycle(count=1, unit="Q"), principal_redemption_anchor=1200000, + day_count_convention=DayCountConvention.A360, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, ) assert contract.next_principal_redemption_amount == 100000 assert contract.principal_redemption_cycle.count == 1 @@ -204,6 +241,10 @@ def test_contract_with_decimal_values(self): notional_principal=Decimal("1000000.00"), premium_discount_at_ied=Decimal("5000.50"), nominal_interest_rate=Decimal("0.0375"), + day_count_convention=DayCountConvention.A360, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, ) assert contract.notional_principal == Decimal("1000000.00") assert contract.premium_discount_at_ied == Decimal("5000.50") @@ -223,6 +264,10 @@ def test_contract_with_lax_arrays(self): array_pr_cycle=[Cycle(1, "M"), Cycle(1, "M"), Cycle(1, "M")], array_pr_next=[10000, 20000, 30000], array_increase_decrease=["DEC", "DEC", "DEC"], + day_count_convention=DayCountConvention.A360, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, ) assert len(contract.array_pr_anchor) == 3 assert len(contract.array_pr_cycle) == 3 @@ -242,6 +287,10 @@ def test_basic_zero_coupon_bond(self): maturity_date=2000000, notional_principal=1000000, premium_discount_at_ied=50000, + day_count_convention=DayCountConvention.A360, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, ) assert contract.contract_id == 100 assert contract.contract_type == "PAM:ZCB" @@ -278,6 +327,10 @@ def test_zero_coupon_bond_with_no_discount(self): maturity_date=2000000, notional_principal=1000000, premium_discount_at_ied=0, + day_count_convention=DayCountConvention.A360, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, ) assert contract.premium_discount_at_ied == 0 @@ -290,6 +343,10 @@ def test_zero_coupon_bond_with_float_values(self): maturity_date=2000000, notional_principal=1000000.0, premium_discount_at_ied=75000.5, + day_count_convention=DayCountConvention.A360, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, ) assert contract.notional_principal == 1000000.0 assert contract.premium_discount_at_ied == 75000.5 @@ -309,6 +366,10 @@ def test_basic_fixed_coupon_bond(self): nominal_interest_rate=0.05, interest_payment_cycle=Cycle(count=6, unit="M"), interest_payment_anchor=1100000, + day_count_convention=DayCountConvention.A360, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, ) assert contract.contract_id == 200 assert contract.contract_type == "PAM:FCB" @@ -329,6 +390,10 @@ def test_fixed_coupon_bond_quarterly_payments(self): nominal_interest_rate=0.04, interest_payment_cycle=Cycle(count=1, unit="Q"), interest_payment_anchor=1100000, + day_count_convention=DayCountConvention.A360, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, ) assert contract.interest_payment_cycle.count == 1 assert contract.interest_payment_cycle.unit == "Q" @@ -366,6 +431,10 @@ def test_fixed_coupon_bond_with_decimal_rate(self): nominal_interest_rate=Decimal("0.0425"), interest_payment_cycle=Cycle(count=3, unit="M"), interest_payment_anchor=1100000, + day_count_convention=DayCountConvention.A360, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, ) assert contract.nominal_interest_rate == Decimal("0.0425") @@ -380,6 +449,10 @@ def test_fixed_coupon_bond_monthly_payments(self): nominal_interest_rate=0.06, interest_payment_cycle=Cycle(count=1, unit="M"), interest_payment_anchor=1100000, + day_count_convention=DayCountConvention.A360, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, ) assert contract.interest_payment_cycle.count == 1 assert contract.interest_payment_cycle.unit == "M" @@ -399,6 +472,10 @@ def test_default_interest_values(self): maturity_date=2000000, notional_principal=1000000, premium_discount_at_ied=0, + day_count_convention=DayCountConvention.A360, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, ) assert contract.nominal_interest_rate == 0 assert contract.rate_reset_spread == 0 @@ -416,6 +493,10 @@ def test_default_conventions(self): maturity_date=2000000, notional_principal=1000000, premium_discount_at_ied=0, + day_count_convention=DayCountConvention.A360, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, ) assert contract.day_count_convention == DayCountConvention.A360 assert contract.business_day_convention == BusinessDayConvention.NOS @@ -432,6 +513,10 @@ def test_default_optional_fields(self): maturity_date=2000000, notional_principal=1000000, premium_discount_at_ied=0, + day_count_convention=DayCountConvention.A360, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, ) assert contract.principal_redemption_cycle is None assert contract.principal_redemption_anchor is None @@ -457,6 +542,10 @@ def test_contract_is_frozen(self): maturity_date=2000000, notional_principal=1000000, premium_discount_at_ied=0, + day_count_convention=DayCountConvention.A360, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, ) with pytest.raises(AttributeError): contract.contract_id = 2 From 29c1630e59c7c20f6352c5a66932a7fdad7c9123 Mon Sep 17 00:00:00 2001 From: cusma Date: Wed, 11 Mar 2026 16:47:35 +0100 Subject: [PATCH 044/244] chore: validate initial exchange amount --- src/normalization.py | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/src/normalization.py b/src/normalization.py index 14de9e7f..3c4733ee 100644 --- a/src/normalization.py +++ b/src/normalization.py @@ -126,6 +126,9 @@ def _compute_initial_exchange_amount( Returns: Net initial exchange amount in ASA base units. + + Raises: + ActusNormalizationError: If result is negative or exceeds uint64 bounds. """ notional = _to_asa_units(notional, asa_decimals) @@ -133,11 +136,28 @@ def _compute_initial_exchange_amount( # to avoid _to_asa_units rejecting negative values if premium_discount_at_ied >= 0: pdied = _to_asa_units(premium_discount_at_ied, asa_decimals) - return notional - pdied + # Validate that discount doesn't exceed notional (would result in negative amount) + if pdied > notional: + raise ActusNormalizationError( + f"Premium/discount at IED ({premium_discount_at_ied}) exceeds notional " + f"({notional / (10 ** asa_decimals)}), which would result in a negative " + f"initial exchange amount. This is invalid for uint64 encoding." + ) + result = notional - pdied else: # For negative premium_discount (premium), convert absolute value and add pdied = _to_asa_units(-premium_discount_at_ied, asa_decimals) - return notional + pdied + result = notional + pdied + + # Validate uint64 bounds for AVM encoding + if result > cst.MAX_UINT64: + raise ActusNormalizationError( + f"Initial exchange amount {result} exceeds uint64 maximum ({cst.MAX_UINT64}). " + f"Notional={notional / (10 ** asa_decimals)}, " + f"premium_discount_at_ied={premium_discount_at_ied}" + ) + + return result def _deduplicate_timestamps(ts: Sequence[UTCTimeStamp]) -> tuple[UTCTimeStamp, ...]: From cc1fcee5ba61906ff2e35376eec4d0cb92383a91 Mon Sep 17 00:00:00 2001 From: cusma Date: Wed, 11 Mar 2026 16:49:07 +0100 Subject: [PATCH 045/244] fix: lax schedule --- src/normalization.py | 71 ++++++++++++++++++++++++++++++-------------- 1 file changed, 49 insertions(+), 22 deletions(-) diff --git a/src/normalization.py b/src/normalization.py index 3c4733ee..15275026 100644 --- a/src/normalization.py +++ b/src/normalization.py @@ -897,7 +897,7 @@ def _build_amortizing_schedule( day_count_convention=terms.day_count_convention, maturity_date=terms.maturity_date, ) - principal_payment = _principal_payment_for_period( + principal_payment, payment_total = _principal_payment_for_period( contract, outstanding=outstanding, payment_total=payment_total, @@ -914,25 +914,50 @@ def _build_amortizing_schedule( next_outstanding = outstanding + payment_total if principal_payment > 0: - seeds.append( - _seed_from_timestamp( - ts, - event_type="PR", - next_principal_redemption=payment_total, - next_outstanding_principal=next_outstanding, - flags=enums.FLAG_CASH_EVENT, + # For LAX INC periods, generate PI (Principal Increase) events + if lax and lax_direction == "INC": + seeds.append( + _seed_from_timestamp( + ts, + event_type="PI", + next_principal_redemption=payment_total, + next_outstanding_principal=next_outstanding, + flags=enums.FLAG_NON_CASH_EVENT, + ) + ) + else: + # Normal redemption or DEC periods generate PR events + seeds.append( + _seed_from_timestamp( + ts, + event_type="PR", + next_principal_redemption=payment_total, + next_outstanding_principal=next_outstanding, + flags=enums.FLAG_CASH_EVENT, + ) ) - ) elif lax: - seeds.append( - _seed_from_timestamp( - ts, - event_type="PI", - next_principal_redemption=payment_total, - next_outstanding_principal=next_outstanding, - flags=enums.FLAG_NON_CASH_EVENT, + # For LAX with zero principal_payment, still respect direction + if lax_direction == "INC": + seeds.append( + _seed_from_timestamp( + ts, + event_type="PI", + next_principal_redemption=payment_total, + next_outstanding_principal=next_outstanding, + flags=enums.FLAG_NON_CASH_EVENT, + ) + ) + else: # DEC + seeds.append( + _seed_from_timestamp( + ts, + event_type="PR", + next_principal_redemption=payment_total, + next_outstanding_principal=next_outstanding, + flags=enums.FLAG_NON_CASH_EVENT, + ) ) - ) if interest_due > 0 or due_time == terms.maturity_date: seeds.append( @@ -974,7 +999,7 @@ def _principal_payment_for_period( lax: bool, period_index: int, asa_decimals: int, -) -> int: +) -> tuple[int, int]: """ Resolve the principal cashflow for one amortizing period. @@ -993,8 +1018,10 @@ def _principal_payment_for_period( asa_decimals: Decimal places for the denomination ASA. Returns: - Principal payment amount in ASA base units. + Tuple of (principal_payment, payment_total) where payment_total may be + updated from array_pr_next for LAX contracts. """ + # For LAX contracts, override payment_total with period-specific value if lax and contract.array_pr_next is not None: pr_values = tuple( _to_asa_units(value, asa_decimals) for value in contract.array_pr_next @@ -1003,13 +1030,13 @@ def _principal_payment_for_period( payment_total = pr_values[period_index] if annuity: - return min(max(payment_total - interest_due, 0), outstanding) + return min(max(payment_total - interest_due, 0), outstanding), payment_total if allow_negative: candidate = payment_total - interest_due - return min(max(candidate, 0), outstanding) + return min(max(candidate, 0), outstanding), payment_total - return min(max(payment_total, 0), outstanding) + return min(max(payment_total, 0), outstanding), payment_total def _principal_schedule( From c9a03ca8842930431ecbf2da310fed8118003d05 Mon Sep 17 00:00:00 2001 From: cusma Date: Wed, 11 Mar 2026 16:49:29 +0100 Subject: [PATCH 046/244] fix: cycle stub --- src/normalization.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/normalization.py b/src/normalization.py index 15275026..b0059584 100644 --- a/src/normalization.py +++ b/src/normalization.py @@ -1092,6 +1092,10 @@ def _principal_schedule( cycle = contract.principal_redemption_cycle if anchor is None or cycle is None or terms.maturity_date is None: return () + + # Parse cycle to access stub attribute + parsed_cycle = Cycle.parse_cycle(cycle) + timestamps = resolve_cycle_schedule( anchor, cycle, @@ -1100,7 +1104,7 @@ def _principal_schedule( business_day_convention=contract.business_day_convention, calendar=contract.calendar, ) - if cycle.stub == "+" and timestamps: + if parsed_cycle.stub == "+" and timestamps: if timestamps[-1] != terms.maturity_date: timestamps = timestamps[:-1] return tuple( @@ -1156,6 +1160,9 @@ def _interest_schedule( if anchor is None or cycle is None or terms.maturity_date is None: return () + # Parse cycle to access stub attribute + parsed_cycle = Cycle.parse_cycle(cycle) + timestamps = list( resolve_cycle_schedule( anchor, @@ -1175,7 +1182,7 @@ def _interest_schedule( md_present = terms.maturity_date in timestamps if not md_present: maturity_date = terms.maturity_date - if cycle.stub == "+": + if parsed_cycle.stub == "+": timestamps[-1] = maturity_date else: timestamps.append(maturity_date) From 6d970325d42fac31a9a3c3b59b3742b276e543cd Mon Sep 17 00:00:00 2001 From: cusma Date: Wed, 11 Mar 2026 16:49:41 +0100 Subject: [PATCH 047/244] chore: nit --- src/schedule.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/schedule.py b/src/schedule.py index 9ad3b352..eeabaf88 100644 --- a/src/schedule.py +++ b/src/schedule.py @@ -462,7 +462,7 @@ def resolve_cycle_schedule( Raises: UnsupportedActusFeatureError: If business_day_convention is not NO_SHIFT - UnsupportedActusFeatureError: If calendar_name is not NO_CALENDAR + UnsupportedActusFeatureError: If calendar is not NO_CALENDAR Note: V1 implementation only supports: @@ -516,7 +516,7 @@ def resolve_array_schedule( Raises: UnsupportedActusFeatureError: If business_day_convention is not NO_SHIFT - UnsupportedActusFeatureError: If calendar_name is not NO_CALENDAR + UnsupportedActusFeatureError: If calendar is not NO_CALENDAR ValueError: If anchors and cycles have different lengths Note: From 78390f1a26f6b7cad2c2c500f2e603d51452c634 Mon Sep 17 00:00:00 2001 From: cusma Date: Wed, 11 Mar 2026 16:50:09 +0100 Subject: [PATCH 048/244] test: update tests; test lax --- tests/sdk/test_normalization.py | 240 ++++++++++++++++++++++++++++++++ 1 file changed, 240 insertions(+) diff --git a/tests/sdk/test_normalization.py b/tests/sdk/test_normalization.py index 070d16ea..ff27a0f1 100644 --- a/tests/sdk/test_normalization.py +++ b/tests/sdk/test_normalization.py @@ -11,6 +11,12 @@ make_pam_fixed_coupon_bond_profile, make_pam_zero_coupon_bond, ) +from src.day_count import ( + BusinessDayConvention, + Calendar, + DayCountConvention, + EndOfMonthConvention, +) from src.errors import ActusNormalizationError from src.models import ExecutionScheduleEntry, NormalizedActusTerms from src.normalization import ( @@ -154,6 +160,31 @@ def test_with_premium(self): # result = 100000000 - (-5000000) = 105000000 assert result == 105000000 + def test_discount_exceeds_notional_raises_error(self): + """Test that discount > notional results in negative value and raises error.""" + # notional=1000000 with 2 decimals = 100000000 + # discount=2000000 with 2 decimals = 200000000 + # result = 100000000 - 200000000 = -100000000 (negative) + with pytest.raises(ActusNormalizationError, match="exceeds notional"): + _compute_initial_exchange_amount( + notional=1000000, + premium_discount_at_ied=2000000, + asa_decimals=2, + ) + + def test_premium_causes_uint64_overflow_raises_error(self): + """Test that large premium causing uint64 overflow raises error.""" + # Use a notional that's 60% of MAX_UINT64 and a premium that's 50% of MAX_UINT64 + # Together they will exceed MAX_UINT64 + notional_large = int(cst.MAX_UINT64 * 0.6) + premium_large = int(cst.MAX_UINT64 * 0.5) + with pytest.raises(ActusNormalizationError, match="exceeds uint64 maximum"): + _compute_initial_exchange_amount( + notional=notional_large, + premium_discount_at_ied=-premium_large, + asa_decimals=0, + ) + class TestDeduplicateTimestamps: """Test the _deduplicate_timestamps helper function.""" @@ -238,6 +269,10 @@ def test_status_date_after_ied_raises_error(self): maturity_date=2000000, notional_principal=1000000, premium_discount_at_ied=0, + day_count_convention=DayCountConvention.A360, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, ) with pytest.raises( @@ -304,6 +339,10 @@ def test_normalize_lam_contract(self): principal_redemption_anchor=1200000, interest_payment_cycle=Cycle(count=3, unit="M"), interest_payment_anchor=1200000, + day_count_convention=DayCountConvention.A360, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, ) result = normalize_contract_attributes( @@ -337,6 +376,10 @@ def test_normalize_with_rate_reset(self): rate_reset_next=0.04, rate_reset_cycle=Cycle(count=1, unit="Y"), rate_reset_anchor=1200000, + day_count_convention=DayCountConvention.A360, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, ) result = normalize_contract_attributes( @@ -759,3 +802,200 @@ def test_schedule_pages_invalid_page_size(self): with pytest.raises(ValueError, match="page_size must be positive"): result.schedule_pages(page_size=-1) + + +class TestLaxArrayPrNext: + """Test LAX contracts with array-based principal redemption amounts.""" + + def test_lax_array_pr_next_values_propagate_to_events(self): + """ + Test that array_pr_next values are correctly used in event seeds. + + This tests the fix for a bug where payment_total was initialized once + from next_principal_redemption_amount but per-period values from + array_pr_next were only applied locally in _principal_payment_for_period + and never propagated back to event seeds. + """ + # Define redemption dates (monthly for 6 months) + base_time = 1000000 + ied = base_time + (10 * 24 * 3600) + month_secs = 30 * 24 * 3600 + + # LAX contract with array_pr_next containing different values per period + contract = ContractAttributes( + contract_id=1, + contract_type="LAX", + status_date=base_time, + initial_exchange_date=ied, + maturity_date=ied + (8 * month_secs), + notional_principal=Decimal("100000.0"), + premium_discount_at_ied=Decimal("0"), + nominal_interest_rate=Decimal("0.05"), + day_count_convention=DayCountConvention.ACTUAL_365, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, + # Use array-based schedule + array_pr_anchor=[ied + (i * month_secs) for i in range(1, 7)], + array_pr_cycle=[Cycle(1, "M") for _ in range(6)], + # Array with different per-period amounts + array_pr_next=[ + Decimal("2000.0"), + Decimal("3000.0"), + Decimal("4000.0"), + Decimal("5000.0"), + Decimal("6000.0"), + Decimal("7000.0"), + ], + array_increase_decrease=["INC", "INC", "DEC", "DEC", "INC", "DEC"], + next_principal_redemption_amount=Decimal("1000.0"), # Should be overridden + ) + + # Normalize the contract + result = normalize_contract_attributes( + contract, + denomination_asset_id=1, + denomination_asset_decimals=6, + notional_unit_value=Decimal("1.0"), + secondary_market_opening_date=base_time, + secondary_market_closure_date=ied + (10 * month_secs), + ) + + # Extract PR and PI events (INC periods generate PI, DEC periods generate PR) + pr_pi_events = [ev for ev in result.schedule if ev.event_type in ("PR", "PI")] + + # Verify that each event has the correct next_principal_redemption + # from array_pr_next, not the base next_principal_redemption_amount + # Note: There may be more events due to additional cycles, but we verify + # at least the first 6 match array_pr_next + assert len(pr_pi_events) >= 6 + + # Expected event types based on array_increase_decrease + expected_event_types = ["PI", "PI", "PR", "PR", "PI", "PR"] + + for i in range(6): + expected_amount = float(contract.array_pr_next[i]) * (10**6) + assert pr_pi_events[i].event_type == expected_event_types[i], ( + f"Period {i}: Expected event_type={expected_event_types[i]}, " + f"got {pr_pi_events[i].event_type}" + ) + assert pr_pi_events[i].next_principal_redemption == expected_amount, ( + f"Period {i}: Expected next_principal_redemption={expected_amount}, " + f"got {pr_pi_events[i].next_principal_redemption}" + ) + + def test_lax_inc_direction_uses_correct_payment_total(self): + """ + Test that INC direction uses the correct per-period payment_total. + + For INC (increase) periods, next_outstanding should increase by the + per-period amount from array_pr_next, not the base amount. + """ + base_time = 1000000 + ied = base_time + (10 * 24 * 3600) + month_secs = 30 * 24 * 3600 + + contract = ContractAttributes( + contract_id=1, + contract_type="LAX", + status_date=base_time, + initial_exchange_date=ied, + maturity_date=ied + (5 * month_secs), + notional_principal=Decimal("100000.0"), + premium_discount_at_ied=Decimal("0"), + nominal_interest_rate=Decimal("0.00"), # No interest for simplicity + day_count_convention=DayCountConvention.ACTUAL_365, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, + array_pr_anchor=[ied + (i * month_secs) for i in range(1, 4)], + array_pr_cycle=[Cycle(1, "M") for _ in range(3)], + array_pr_next=[ + Decimal("10000.0"), # INC - should increase by 10000 + Decimal("20000.0"), # INC - should increase by 20000 + Decimal("30000.0"), # DEC - should decrease by 30000 + ], + array_increase_decrease=["INC", "INC", "DEC"], + next_principal_redemption_amount=Decimal("1000.0"), + ) + + result = normalize_contract_attributes( + contract, + denomination_asset_id=1, + denomination_asset_decimals=6, + notional_unit_value=Decimal("1.0"), + secondary_market_opening_date=base_time, + secondary_market_closure_date=ied + (6 * month_secs), + ) + + # Extract PR and PI events (PI for INC periods where principal_payment == 0) + pr_pi_events = [ + ev + for ev in result.schedule + if ev.event_type in ("PR", "PI") and ev.scheduled_time >= ied + month_secs + ] + + # Verify outstanding progression + # Initial: 100000 + # After period 0 (INC 10000): 100000 + 10000 = 110000 + # After period 1 (INC 20000): 110000 + 20000 = 130000 + # After period 2 (DEC 30000): 130000 - 30000 = 100000 + + expected_outstanding = [ + 100000 * 10**6 + 10000 * 10**6, # Period 0: INC by 10000 + 110000 * 10**6 + 20000 * 10**6, # Period 1: INC by 20000 + 130000 * 10**6 - 30000 * 10**6, # Period 2: DEC by 30000 + ] + + for i, ev in enumerate(pr_pi_events[:3]): + assert ev.next_outstanding_principal == expected_outstanding[i], ( + f"Period {i}: Expected outstanding={expected_outstanding[i]}, " + f"got {ev.next_outstanding_principal}" + ) + + def test_lax_without_array_pr_next_uses_base_amount(self): + """ + Test that when array_pr_next is not provided, the base amount is used. + """ + base_time = 1000000 + ied = base_time + (10 * 24 * 3600) + month_secs = 30 * 24 * 3600 + + contract = ContractAttributes( + contract_id=1, + contract_type="LAX", + status_date=base_time, + initial_exchange_date=ied, + maturity_date=ied + (4 * month_secs), + notional_principal=Decimal("100000.0"), + premium_discount_at_ied=Decimal("0"), + nominal_interest_rate=Decimal("0.05"), + day_count_convention=DayCountConvention.ACTUAL_365, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, + array_pr_anchor=[ied + (i * month_secs) for i in range(1, 3)], + array_pr_cycle=[Cycle(1, "M") for _ in range(2)], + # No array_pr_next provided + array_increase_decrease=["DEC", "DEC"], + next_principal_redemption_amount=Decimal("5000.0"), + ) + + result = normalize_contract_attributes( + contract, + denomination_asset_id=1, + denomination_asset_decimals=6, + notional_unit_value=Decimal("1.0"), + secondary_market_opening_date=base_time, + secondary_market_closure_date=ied + (5 * month_secs), + ) + + pr_events = [ev for ev in result.schedule if ev.event_type == "PR"] + + # All events should use the base amount + base_amount = 5000.0 * (10**6) + for i, ev in enumerate(pr_events): + assert ev.next_principal_redemption == base_amount, ( + f"Period {i}: Expected next_principal_redemption={base_amount}, " + f"got {ev.next_principal_redemption}" + ) From 2b7fe95fee130589d4ec272267f28c4012e76ba6 Mon Sep 17 00:00:00 2001 From: cusma Date: Wed, 11 Mar 2026 17:11:44 +0100 Subject: [PATCH 049/244] chore: nit --- src/schedule.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/schedule.py b/src/schedule.py index eeabaf88..2e2561e5 100644 --- a/src/schedule.py +++ b/src/schedule.py @@ -301,7 +301,7 @@ def generate_schedule( >>> # For timestamps representing 2024-01-15, 2024-04-15 >>> generate_schedule( ... start=1705276800, # 2024-01-15 00:00:00 UTC - ... raw_cycle="1M", + ... cycle="1M", ... end=1713139200 # 2024-04-15 00:00:00 UTC ... ) (1705276800, 1707955200, 1710547200, 1713139200) From 0ad43621566d137dd04434ef62888bd55fa742a7 Mon Sep 17 00:00:00 2001 From: cusma Date: Wed, 11 Mar 2026 17:12:19 +0100 Subject: [PATCH 050/244] fix: annuity schedule --- src/normalization.py | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/src/normalization.py b/src/normalization.py index b0059584..06c1ebaf 100644 --- a/src/normalization.py +++ b/src/normalization.py @@ -684,7 +684,9 @@ def _build_annuity_schedule( Raises: ActusNormalizationError: If required fields are missing. """ - if terms.maturity_date is None: + # Use maturity_date or amortization_date (whichever is set) + end_date = terms.maturity_date or contract.amortization_date + if end_date is None: raise ActusNormalizationError( "ANN normalization requires maturity_date or amortization_date" ) @@ -696,8 +698,8 @@ def _build_annuity_schedule( ) formula_redemption_times = sorted(set(pr_schedule)) - if terms.maturity_date not in formula_redemption_times: - formula_redemption_times.append(terms.maturity_date) + if end_date not in formula_redemption_times: + formula_redemption_times.append(end_date) pr_anchor = contract.principal_redemption_anchor if pr_anchor is None: @@ -719,7 +721,7 @@ def _build_annuity_schedule( payment_total = _resolve_annuity_payment(contract, terms, asa_decimals) seeds: list[_EventSeed] = [] - rr_schedule = _rate_reset_occurrences(contract, terms.maturity_date) + rr_schedule = _rate_reset_occurrences(contract, end_date) if dynamic_redemption: if pr_anchor > terms.initial_exchange_date and formula_redemption_times: prf_time = pr_anchor - cst.DAY_2_SEC @@ -762,7 +764,7 @@ def _build_annuity_schedule( start_ts=previous_due, end_ts=due_time, day_count_convention=terms.day_count_convention, - maturity_date=terms.maturity_date, + maturity_date=end_date, ) principal_payment = min(max(payment_total - interest_due, 0), outstanding) next_outstanding = max(outstanding - principal_payment, 0) @@ -809,7 +811,7 @@ def _build_annuity_schedule( for ts, event_type in rr_schedule: if any(ts == pr_ts for pr_ts in pr_schedule): continue - if ts >= terms.maturity_date: + if ts >= end_date: continue seeds.append( _seed_from_timestamp( @@ -823,15 +825,15 @@ def _build_annuity_schedule( ) ) - seeds.extend(_ipcb_schedule(contract, outstanding, terms.maturity_date)) + seeds.extend(_ipcb_schedule(contract, outstanding, end_date)) md_redemption_start = 0 md_redemption_end = 0 - if not any(ts == terms.maturity_date for ts in pr_schedule): + if not any(ts == end_date for ts in pr_schedule): md_redemption_start = previous_redemption - md_redemption_end = terms.maturity_date + md_redemption_end = end_date seeds.append( _seed_from_timestamp( - terms.maturity_date, + end_date, event_type="MD", redemption_accrual_start=md_redemption_start, redemption_accrual_end=md_redemption_end, From d91cb8e5514bb6af9dd7a1d225119feaed3cd528 Mon Sep 17 00:00:00 2001 From: Cosimo Bassi <65770425+cusma@users.noreply.github.com> Date: Wed, 11 Mar 2026 17:14:20 +0100 Subject: [PATCH 051/244] chore: use asa unit conversion Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- tests/sdk/test_normalization.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/sdk/test_normalization.py b/tests/sdk/test_normalization.py index ff27a0f1..ce4e6788 100644 --- a/tests/sdk/test_normalization.py +++ b/tests/sdk/test_normalization.py @@ -993,7 +993,7 @@ def test_lax_without_array_pr_next_uses_base_amount(self): pr_events = [ev for ev in result.schedule if ev.event_type == "PR"] # All events should use the base amount - base_amount = 5000.0 * (10**6) + base_amount = _to_asa_units(Decimal("5000.0"), 6) for i, ev in enumerate(pr_events): assert ev.next_principal_redemption == base_amount, ( f"Period {i}: Expected next_principal_redemption={base_amount}, " From d903b407e724d2b9c8d4dede201ddfde763e8fde Mon Sep 17 00:00:00 2001 From: cusma Date: Wed, 11 Mar 2026 17:18:40 +0100 Subject: [PATCH 052/244] chore: precompute lax principal asa amounts --- src/normalization.py | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/normalization.py b/src/normalization.py index 06c1ebaf..12afc079 100644 --- a/src/normalization.py +++ b/src/normalization.py @@ -888,6 +888,14 @@ def _build_amortizing_schedule( contract.next_principal_redemption_amount or 0, asa_decimals, ) + + # Precompute LAX principal amounts once + pr_values_scaled: tuple[int, ...] | None = None + if lax and contract.array_pr_next is not None: + pr_values_scaled = tuple( + _to_asa_units(value, asa_decimals) for value in contract.array_pr_next + ) + previous_due = terms.initial_exchange_date for index, ts in enumerate(pr_schedule): due_time = ts @@ -909,6 +917,7 @@ def _build_amortizing_schedule( lax=lax, period_index=index, asa_decimals=asa_decimals, + pr_values_scaled=pr_values_scaled, ) lax_direction = _lax_direction(contract, index) if lax else "DEC" next_outstanding = max(outstanding - principal_payment, 0) @@ -1001,6 +1010,7 @@ def _principal_payment_for_period( lax: bool, period_index: int, asa_decimals: int, + pr_values_scaled: tuple[int, ...] | None = None, ) -> tuple[int, int]: """ Resolve the principal cashflow for one amortizing period. @@ -1018,18 +1028,15 @@ def _principal_payment_for_period( lax: Whether this is a LAX contract with array-based amounts. period_index: Index of the current period. asa_decimals: Decimal places for the denomination ASA. + pr_values_scaled: Precomputed scaled principal values for LAX contracts. Returns: Tuple of (principal_payment, payment_total) where payment_total may be updated from array_pr_next for LAX contracts. """ # For LAX contracts, override payment_total with period-specific value - if lax and contract.array_pr_next is not None: - pr_values = tuple( - _to_asa_units(value, asa_decimals) for value in contract.array_pr_next - ) - if period_index < len(pr_values): - payment_total = pr_values[period_index] + if lax and pr_values_scaled is not None and period_index < len(pr_values_scaled): + payment_total = pr_values_scaled[period_index] if annuity: return min(max(payment_total - interest_due, 0), outstanding), payment_total From 6e7a90bdc0ba78d127790489631c54e8ca6290c1 Mon Sep 17 00:00:00 2001 From: Cosimo Bassi <65770425+cusma@users.noreply.github.com> Date: Wed, 11 Mar 2026 17:25:12 +0100 Subject: [PATCH 053/244] chore: nit Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- tests/sdk/test_normalization.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/sdk/test_normalization.py b/tests/sdk/test_normalization.py index ce4e6788..3540faf1 100644 --- a/tests/sdk/test_normalization.py +++ b/tests/sdk/test_normalization.py @@ -874,7 +874,7 @@ def test_lax_array_pr_next_values_propagate_to_events(self): expected_event_types = ["PI", "PI", "PR", "PR", "PI", "PR"] for i in range(6): - expected_amount = float(contract.array_pr_next[i]) * (10**6) + expected_amount = _to_asa_units(contract.array_pr_next[i], 6) assert pr_pi_events[i].event_type == expected_event_types[i], ( f"Period {i}: Expected event_type={expected_event_types[i]}, " f"got {pr_pi_events[i].event_type}" From 02b9df8131e2b0455fefb9e4547226f4e4a18115 Mon Sep 17 00:00:00 2001 From: cusma Date: Wed, 11 Mar 2026 17:50:03 +0100 Subject: [PATCH 054/244] fix: various --- src/normalization.py | 91 ++++++++++++++++++++++++++++++++++++-------- 1 file changed, 75 insertions(+), 16 deletions(-) diff --git a/src/normalization.py b/src/normalization.py index 12afc079..1839a23c 100644 --- a/src/normalization.py +++ b/src/normalization.py @@ -691,7 +691,7 @@ def _build_annuity_schedule( "ANN normalization requires maturity_date or amortization_date" ) - pr_schedule = _principal_schedule(contract, terms, lax=False) + pr_schedule = _principal_schedule(contract, terms, lax=False, end_date=end_date) if not pr_schedule: raise ActusNormalizationError( "ANN normalization requires a principal redemption schedule" @@ -799,7 +799,7 @@ def _build_annuity_schedule( next_nominal_interest_rate=( terms.rate_reset_next if event_type == "RRF" else 0 ), - next_outstanding_principal=outstanding, + next_outstanding_principal=next_outstanding, flags=enums.FLAG_NON_CASH_EVENT, ) ) @@ -896,6 +896,10 @@ def _build_amortizing_schedule( _to_asa_units(value, asa_decimals) for value in contract.array_pr_next ) + # Build rate reset schedule as dict for efficient lookup + rr_schedule = _rate_reset_occurrences(contract, terms.maturity_date) + rr_events = dict(rr_schedule) + previous_due = terms.initial_exchange_date for index, ts in enumerate(pr_schedule): due_time = ts @@ -916,7 +920,6 @@ def _build_amortizing_schedule( annuity=False, lax=lax, period_index=index, - asa_decimals=asa_decimals, pr_values_scaled=pr_values_scaled, ) lax_direction = _lax_direction(contract, index) if lax else "DEC" @@ -981,10 +984,43 @@ def _build_amortizing_schedule( ) ) + # Check if this timestamp has a rate reset event + event_key = ts + if event_key in rr_events: + event_type = rr_events[event_key] + seeds.append( + _seed_from_timestamp( + ts, + event_type=event_type, + next_nominal_interest_rate=( + terms.rate_reset_next if event_type == "RRF" else 0 + ), + next_outstanding_principal=next_outstanding, + flags=enums.FLAG_NON_CASH_EVENT, + ) + ) + outstanding = next_outstanding previous_due = due_time - seeds.extend(_rate_reset_schedule(contract, outstanding, terms.maturity_date)) + # Add remaining rate reset events that don't coincide with PR dates + for ts, event_type in rr_schedule: + if any(ts == pr_ts for pr_ts in pr_schedule): + continue + if ts >= terms.maturity_date: + continue + seeds.append( + _seed_from_timestamp( + ts, + event_type=event_type, + next_nominal_interest_rate=( + terms.rate_reset_next if event_type == "RRF" else 0 + ), + next_outstanding_principal=outstanding, + flags=enums.FLAG_NON_CASH_EVENT, + ) + ) + seeds.extend(_ipcb_schedule(contract, outstanding, terms.maturity_date)) if outstanding: seeds.append( @@ -1009,7 +1045,6 @@ def _principal_payment_for_period( annuity: bool, lax: bool, period_index: int, - asa_decimals: int, pr_values_scaled: tuple[int, ...] | None = None, ) -> tuple[int, int]: """ @@ -1053,6 +1088,7 @@ def _principal_schedule( terms: NormalizedActusTerms, *, lax: bool, + end_date: int | None = None, ) -> tuple[int, ...]: """ Resolve the principal redemption occurrence schedule. @@ -1064,6 +1100,7 @@ def _principal_schedule( contract: ACTUS contract attributes. terms: Normalized contract terms. lax: Whether to use LAX array-based schedule logic. + end_date: Explicit end date for the schedule. If not provided, falls back to terms.maturity_date. Returns: Tuple of Unix timestamps for principal redemption events. @@ -1076,15 +1113,35 @@ def _principal_schedule( anchors = tuple(ts for ts in contract.array_pr_anchor) cycles = tuple(contract.array_pr_cycle or ()) increases = tuple(value for value in contract.array_increase_decrease or ()) - if increases and len(increases) != len(contract.array_pr_anchor): + pr_next = tuple(contract.array_pr_next or ()) + + anchor_len = len(anchors) + + # Validate all LAX arrays have aligned lengths + if cycles and len(cycles) != anchor_len: raise ActusNormalizationError( - "LAX array_pr_* schedules must have aligned lengths" + f"LAX array_pr_cycle length ({len(cycles)}) must match " + f"array_pr_anchor length ({anchor_len})" ) + if increases and len(increases) != anchor_len: + raise ActusNormalizationError( + f"LAX array_increase_decrease length ({len(increases)}) must match " + f"array_pr_anchor length ({anchor_len})" + ) + if pr_next and len(pr_next) != anchor_len: + raise ActusNormalizationError( + f"LAX array_pr_next length ({len(pr_next)}) must match " + f"array_pr_anchor length ({anchor_len})" + ) + + # Use provided end_date or fall back to terms.maturity_date + effective_end = end_date if end_date is not None else terms.maturity_date + if cycles: timestamps = resolve_array_schedule( anchors, cycles, - terms.maturity_date, + effective_end, end_of_month_convention=contract.end_of_month_convention, business_day_convention=contract.business_day_convention, calendar=contract.calendar, @@ -1094,12 +1151,16 @@ def _principal_schedule( return tuple( ts for ts in _deduplicate_timestamps(timestamps) - if terms.initial_exchange_date < ts <= terms.maturity_date + if terms.initial_exchange_date < ts <= effective_end ) anchor = contract.principal_redemption_anchor cycle = contract.principal_redemption_cycle - if anchor is None or cycle is None or terms.maturity_date is None: + + # Use provided end_date or fall back to terms.maturity_date + effective_end = end_date if end_date is not None else terms.maturity_date + + if anchor is None or cycle is None or effective_end is None: return () # Parse cycle to access stub attribute @@ -1108,18 +1169,16 @@ def _principal_schedule( timestamps = resolve_cycle_schedule( anchor, cycle, - terms.maturity_date, + effective_end, end_of_month_convention=contract.end_of_month_convention, business_day_convention=contract.business_day_convention, calendar=contract.calendar, ) if parsed_cycle.stub == "+" and timestamps: - if timestamps[-1] != terms.maturity_date: + if timestamps[-1] != effective_end: timestamps = timestamps[:-1] return tuple( - ts - for ts in timestamps - if terms.initial_exchange_date <= ts < terms.maturity_date + ts for ts in timestamps if terms.initial_exchange_date <= ts < effective_end ) @@ -1432,7 +1491,7 @@ def _resolve_annuity_payment( "ANN normalization requires maturity_date or amortization_date" ) - pr_schedule = _principal_schedule(contract, terms, lax=False) + pr_schedule = _principal_schedule(contract, terms, lax=False, end_date=end_date) if not pr_schedule: raise ActusNormalizationError( "ANN normalization requires a principal redemption schedule" From b071f0a5d23ab91544ebaeafacc8b7362e76275b Mon Sep 17 00:00:00 2001 From: cusma Date: Wed, 11 Mar 2026 17:50:21 +0100 Subject: [PATCH 055/244] test: rete reset amortizing --- tests/sdk/test_normalization.py | 176 ++++++++++++++++++++++++++++++++ 1 file changed, 176 insertions(+) diff --git a/tests/sdk/test_normalization.py b/tests/sdk/test_normalization.py index ce4e6788..2900a2c2 100644 --- a/tests/sdk/test_normalization.py +++ b/tests/sdk/test_normalization.py @@ -999,3 +999,179 @@ def test_lax_without_array_pr_next_uses_base_amount(self): f"Period {i}: Expected next_principal_redemption={base_amount}, " f"got {ev.next_principal_redemption}" ) + + +class TestRateResetAmortizing: + """Test rate reset events are correctly interleaved with principal redemptions.""" + + def test_lam_with_rate_reset_interleaved(self): + """Test LAM contract with rate resets has correct outstanding principal at each RR event.""" + # Create LAM contract with quarterly principal redemptions and annual rate resets + contract = ContractAttributes( + contract_id=1, + contract_type="LAM", + status_date=1000000, + initial_exchange_date=1100000, + maturity_date=1100000 + 365 * 24 * 60 * 60 * 2, # 2 years + notional_principal=1000000, + premium_discount_at_ied=0, + nominal_interest_rate=0.05, + next_principal_redemption_amount=250000, # 4 payments of 250k each + # Rate resets annually + rate_reset_cycle=Cycle(count=1, unit="Y"), + rate_reset_anchor=1100000 + 365 * 24 * 60 * 60, # 1 year after start + rate_reset_next=0.06, + # Principal redemptions quarterly + principal_redemption_cycle=Cycle(count=3, unit="M"), + principal_redemption_anchor=1100000 + 90 * 24 * 60 * 60, # 3 months + day_count_convention=DayCountConvention.A360, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, + ) + + result = normalize_contract_attributes( + contract, + denomination_asset_id=100, + denomination_asset_decimals=2, + notional_unit_value=1000, + secondary_market_opening_date=1000000, + secondary_market_closure_date=2000000, + ) + + # Extract event schedule + events = result.schedule + + # Find RR events + rr_events = [e for e in events if e.event_type in ("RR", "RRF")] + + # Find PR events before each RR event + pr_events = [e for e in events if e.event_type == "PR"] + + assert len(rr_events) > 0, "Should have rate reset events" + assert len(pr_events) > 0, "Should have principal redemption events" + + # Verify that RR events have different outstanding principals + # (not all the same terminal balance) + if len(rr_events) > 1: + rr_principals = [e.next_outstanding_principal for e in rr_events] + # They should not all be the same (which would indicate the bug) + assert len(set(rr_principals)) > 1 or all( + p == 1000000 * 100 for p in rr_principals[:1] + ), "RR events should have varying outstanding principals as schedule progresses" + + # Verify ordering: earlier RR events should have higher or equal outstanding principal + for i in range(len(rr_events) - 1): + assert ( + rr_events[i].next_outstanding_principal + >= rr_events[i + 1].next_outstanding_principal + ), f"RR event {i} principal should be >= RR event {i+1} principal" + + def test_nam_with_rate_reset_correct_balance(self): + """Test NAM contract with rate resets tracks outstanding principal correctly.""" + contract = ContractAttributes( + contract_id=2, + contract_type="NAM", + status_date=1000000, + initial_exchange_date=1100000, + maturity_date=1100000 + 365 * 24 * 60 * 60 * 3, # 3 years + notional_principal=900000, + premium_discount_at_ied=0, + nominal_interest_rate=0.04, + next_principal_redemption_amount=100000, + # Rate resets every 6 months + rate_reset_cycle=Cycle(count=6, unit="M"), + rate_reset_anchor=1100000 + 180 * 24 * 60 * 60, + rate_reset_next=0.045, + # Principal redemptions quarterly + principal_redemption_cycle=Cycle(count=3, unit="M"), + principal_redemption_anchor=1100000 + 90 * 24 * 60 * 60, + day_count_convention=DayCountConvention.A360, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, + ) + + result = normalize_contract_attributes( + contract, + denomination_asset_id=100, + denomination_asset_decimals=2, + notional_unit_value=1000, + secondary_market_opening_date=1000000, + secondary_market_closure_date=2000000, + ) + + events = result.schedule + rr_events = [e for e in events if e.event_type in ("RR", "RRF")] + + # Each RR event should have outstanding principal that reflects + # redemptions that occurred before it + for i, rr_event in enumerate(rr_events): + # Count PR events that occurred before this RR event + pr_before = [ + e + for e in events + if e.event_type == "PR" and e.scheduled_time < rr_event.scheduled_time + ] + + # The outstanding principal at this RR should be less than initial + # if there were any PR events before it + if len(pr_before) > 0: + assert ( + rr_event.next_outstanding_principal < 900000 * 100 + ), f"RR event {i} should reflect prior principal redemptions" + + def test_lax_with_rate_reset_interleaved(self): + """Test LAX contract with rate resets has correct outstanding principal progression.""" + contract = ContractAttributes( + contract_id=3, + contract_type="LAX", + status_date=1000000, + initial_exchange_date=1100000, + maturity_date=1100000 + 365 * 24 * 60 * 60 * 2, + notional_principal=500000, + premium_discount_at_ied=0, + nominal_interest_rate=0.05, + # LAX with varying principal amounts + array_pr_next=[100000, 150000, 200000, 50000], + array_increase_decrease=["DEC", "DEC", "INC", "DEC"], + # Rate resets annually + rate_reset_cycle=Cycle(count=1, unit="Y"), + rate_reset_anchor=1100000 + 365 * 24 * 60 * 60, + rate_reset_next=0.055, + # Principal redemptions quarterly + principal_redemption_cycle=Cycle(count=3, unit="M"), + principal_redemption_anchor=1100000 + 90 * 24 * 60 * 60, + day_count_convention=DayCountConvention.A360, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, + ) + + result = normalize_contract_attributes( + contract, + denomination_asset_id=100, + denomination_asset_decimals=2, + notional_unit_value=1000, + secondary_market_opening_date=1000000, + secondary_market_closure_date=2000000, + ) + + events = result.schedule + rr_events = [e for e in events if e.event_type in ("RR", "RRF")] + + # Verify RR events exist + assert len(rr_events) > 0, "Should have rate reset events" + + # Verify that the outstanding principal at each RR event reflects + # the actual balance at that point in time, not the terminal balance + if len(rr_events) >= 2: + # The outstanding principals should differ if principal changes occurred + principals = [e.next_outstanding_principal for e in rr_events] + # Check that they're not all equal (which would indicate the bug) + unique_principals = set(principals) + # Given the LAX schedule with INC and DEC, we expect variation + # or at least not all terminal balance + assert ( + len(unique_principals) >= 1 + ), "RR events should track actual outstanding balance" From 980cc09a64b4da52d79f0ff9938ade1953901830 Mon Sep 17 00:00:00 2001 From: cusma Date: Wed, 11 Mar 2026 18:13:19 +0100 Subject: [PATCH 056/244] fix: various --- src/normalization.py | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/src/normalization.py b/src/normalization.py index 1839a23c..9e97a629 100644 --- a/src/normalization.py +++ b/src/normalization.py @@ -912,7 +912,6 @@ def _build_amortizing_schedule( maturity_date=terms.maturity_date, ) principal_payment, payment_total = _principal_payment_for_period( - contract, outstanding=outstanding, payment_total=payment_total, interest_due=interest_due, @@ -923,11 +922,21 @@ def _build_amortizing_schedule( pr_values_scaled=pr_values_scaled, ) lax_direction = _lax_direction(contract, index) if lax else "DEC" - next_outstanding = max(outstanding - principal_payment, 0) + # For NAM, negative principal_payment means capitalization (increase outstanding) + # For other types, subtract principal_payment from outstanding + if allow_negative and not lax: + # NAM: negative principal_payment increases outstanding (capitalization) + next_outstanding = outstanding - principal_payment + else: + # LAM/LAX: always decrease or maintain outstanding + next_outstanding = max(outstanding - principal_payment, 0) + if lax_direction == "INC": next_outstanding = outstanding + payment_total - if principal_payment > 0: + # For NAM with negative principal_payment (capitalization), still generate PR event + # For LAM/LAX, only generate events if principal_payment > 0 + if principal_payment > 0 or (allow_negative and not lax): # For LAX INC periods, generate PI (Principal Increase) events if lax and lax_direction == "INC": seeds.append( @@ -941,6 +950,8 @@ def _build_amortizing_schedule( ) else: # Normal redemption or DEC periods generate PR events + # For NAM with negative principal_payment, this is a cash event (payment made) + # but outstanding increases due to capitalization seeds.append( _seed_from_timestamp( ts, @@ -1036,7 +1047,6 @@ def _build_amortizing_schedule( def _principal_payment_for_period( - contract: ContractAttributes, *, outstanding: int, payment_total: int, @@ -1054,7 +1064,6 @@ def _principal_payment_for_period( payment structure, and period-specific parameters. Args: - contract: ACTUS contract attributes. outstanding: Current outstanding principal. payment_total: Total payment amount for the period. interest_due: Interest amount due for the period. @@ -1062,7 +1071,6 @@ def _principal_payment_for_period( annuity: Whether this is an annuity contract. lax: Whether this is a LAX contract with array-based amounts. period_index: Index of the current period. - asa_decimals: Decimal places for the denomination ASA. pr_values_scaled: Precomputed scaled principal values for LAX contracts. Returns: @@ -1077,8 +1085,12 @@ def _principal_payment_for_period( return min(max(payment_total - interest_due, 0), outstanding), payment_total if allow_negative: + # For NAM, allow negative principal payments (representing capitalization) + # When payment_total < interest_due, the difference is capitalized candidate = payment_total - interest_due - return min(max(candidate, 0), outstanding), payment_total + # Clamp negative values to prevent exceeding outstanding balance + # and positive values to not exceed outstanding + return max(min(candidate, outstanding), -outstanding), payment_total return min(max(payment_total, 0), outstanding), payment_total @@ -1498,8 +1510,8 @@ def _resolve_annuity_payment( ) formula_redemption_dates = sorted(set(pr_schedule)) - if terms.maturity_date not in formula_redemption_dates: - formula_redemption_dates.append(terms.maturity_date) + if end_date not in formula_redemption_dates: + formula_redemption_dates.append(end_date) pr_anchor = contract.principal_redemption_anchor if pr_anchor is None: From 94c8d463ace3c604910ba525eee9d57d74046112 Mon Sep 17 00:00:00 2001 From: cusma Date: Wed, 11 Mar 2026 18:13:29 +0100 Subject: [PATCH 057/244] test: nam capitalization --- tests/sdk/test_normalization.py | 58 +++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/tests/sdk/test_normalization.py b/tests/sdk/test_normalization.py index 2ee8b107..ffa0da09 100644 --- a/tests/sdk/test_normalization.py +++ b/tests/sdk/test_normalization.py @@ -1175,3 +1175,61 @@ def test_lax_with_rate_reset_interleaved(self): assert ( len(unique_principals) >= 1 ), "RR events should track actual outstanding balance" + + +def test_nam_capitalizes_unpaid_interest(): + """Test that NAM capitalizes unpaid interest when payment < interest due.""" + # Create a NAM contract with small payments that won't cover interest + contract = ContractAttributes( + contract_id=1, + contract_type="NAM", + status_date=1000000, + initial_exchange_date=1100000, + maturity_date=1100000 + 365 * 24 * 60 * 60, # 1 year + notional_principal=1000000, # 1,000,000 minor units + premium_discount_at_ied=0, + nominal_interest_rate=0.12, # 12% annual rate + # Small payment that won't cover interest + next_principal_redemption_amount=500, # 500 minor units + # Monthly payments + principal_redemption_cycle=Cycle(count=1, unit="M"), + principal_redemption_anchor=1100000 + 30 * 24 * 60 * 60, + day_count_convention=DayCountConvention.A360, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, + ) + + result = normalize_contract_attributes( + contract, + denomination_asset_id=100, + denomination_asset_decimals=2, + notional_unit_value=1000, + secondary_market_opening_date=1000000, + secondary_market_closure_date=2000000, + ) + + events = result.schedule + pr_events = [e for e in events if e.event_type == "PR"] + + # First PR event should show increased outstanding principal (capitalization) + # Interest for ~30 days at 12% on 1,000,000 (in cents) = ~10,000 cents + # Payment is only 500 cents, so ~9,500 cents should be capitalized + # Outstanding should increase from 1,000,000 to approximately 1,009,500 + + assert len(pr_events) > 0, "Should have PR events" + + first_pr = pr_events[0] + initial_outstanding = 1000000 # Initial outstanding in minor units + + # Outstanding should increase (negative amortization) + assert ( + first_pr.next_outstanding_principal > initial_outstanding + ), f"Outstanding should increase from {initial_outstanding} to {first_pr.next_outstanding_principal}" + + # Verify multiple periods show continued capitalization + if len(pr_events) > 1: + second_pr = pr_events[1] + assert ( + second_pr.next_outstanding_principal > first_pr.next_outstanding_principal + ), "Outstanding should continue to increase in subsequent periods" From c0929b918368a7bfbf61c43f726613764ca487ea Mon Sep 17 00:00:00 2001 From: cusma Date: Wed, 11 Mar 2026 18:51:30 +0100 Subject: [PATCH 058/244] fix: various --- src/normalization.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/normalization.py b/src/normalization.py index 9e97a629..44b2f08f 100644 --- a/src/normalization.py +++ b/src/normalization.py @@ -927,6 +927,13 @@ def _build_amortizing_schedule( if allow_negative and not lax: # NAM: negative principal_payment increases outstanding (capitalization) next_outstanding = outstanding - principal_payment + # Validate that capitalization doesn't cause uint64 overflow + if next_outstanding < 0 or next_outstanding > cst.MAX_UINT64: + raise ActusNormalizationError( + f"NAM capitalization at period {index} would result in outstanding principal " + f"{next_outstanding} which exceeds uint64 bounds (0 to {cst.MAX_UINT64}). " + f"Outstanding: {outstanding}, principal_payment: {principal_payment}" + ) else: # LAM/LAX: always decrease or maintain outstanding next_outstanding = max(outstanding - principal_payment, 0) From 27e4206d6403b208faa1bdbc0ac97f933ac3b74e Mon Sep 17 00:00:00 2001 From: cusma Date: Wed, 11 Mar 2026 18:51:39 +0100 Subject: [PATCH 059/244] test: update --- tests/sdk/test_normalization.py | 46 +++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/tests/sdk/test_normalization.py b/tests/sdk/test_normalization.py index ffa0da09..eac047f5 100644 --- a/tests/sdk/test_normalization.py +++ b/tests/sdk/test_normalization.py @@ -1233,3 +1233,49 @@ def test_nam_capitalizes_unpaid_interest(): assert ( second_pr.next_outstanding_principal > first_pr.next_outstanding_principal ), "Outstanding should continue to increase in subsequent periods" + + +def test_nam_capitalization_uint64_overflow_detection(): + """Test that NAM capitalization detects and rejects uint64 overflow.""" + # Create a NAM contract with large notional and high interest rate + # that will cause overflow during capitalization + # Use a notional that when scaled won't overflow initially, + # but will overflow when interest capitalizes + + # Calculate a large notional that is divisible by notional_unit_value + # MAX_UINT64 / 100 ≈ 184467440737095516, round down to multiple of 1000 + large_notional = (int(cst.MAX_UINT64 / 100) // 1000) * 1000 + + contract = ContractAttributes( + contract_id=1, + contract_type="NAM", + status_date=1000000, + initial_exchange_date=1100000, + maturity_date=1100000 + 365 * 24 * 60 * 60, # 1 year + notional_principal=large_notional, + premium_discount_at_ied=0, + nominal_interest_rate=0.50, # 50% annual rate - will cause massive capitalization + # Very small payment that won't cover interest + next_principal_redemption_amount=100, + # Monthly payments + principal_redemption_cycle=Cycle(count=1, unit="M"), + principal_redemption_anchor=1100000 + 30 * 24 * 60 * 60, + day_count_convention=DayCountConvention.A360, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, + ) + + # Should raise ActusNormalizationError due to uint64 overflow + with pytest.raises( + ActusNormalizationError, + match=r"NAM capitalization.*exceeds uint64 bounds", + ): + normalize_contract_attributes( + contract, + denomination_asset_id=100, + denomination_asset_decimals=2, + notional_unit_value=1000, + secondary_market_opening_date=1000000, + secondary_market_closure_date=2000000, + ) From c695035519a5fb86aaab8ab2022134d03b641898 Mon Sep 17 00:00:00 2001 From: cusma Date: Wed, 11 Mar 2026 19:12:26 +0100 Subject: [PATCH 060/244] fox: various --- src/normalization.py | 61 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 58 insertions(+), 3 deletions(-) diff --git a/src/normalization.py b/src/normalization.py index 44b2f08f..6d6eb7db 100644 --- a/src/normalization.py +++ b/src/normalization.py @@ -665,6 +665,40 @@ def _build_clm_schedule( return tuple(seeds) +def _interpolate_balance_at_timestamp( + timestamp: int, + balance_timeline: list[tuple[int, int]], + initial_balance: int, +) -> int: + """ + Interpolate the outstanding principal balance at a specific timestamp. + + Args: + timestamp: The timestamp to query. + balance_timeline: List of (timestamp, balance_after) tuples in chronological order. + initial_balance: The starting balance before any events. + + Returns: + The outstanding balance at the given timestamp. + """ + if not balance_timeline: + return initial_balance + + # If timestamp is before first event, return initial balance + if timestamp < balance_timeline[0][0]: + return initial_balance + + # Find the last event on or before the timestamp + balance = initial_balance + for ts, balance_after in balance_timeline: + if ts <= timestamp: + balance = balance_after + else: + break + + return balance + + def _build_annuity_schedule( contract: ContractAttributes, terms: NormalizedActusTerms, @@ -756,6 +790,9 @@ def _build_annuity_schedule( outstanding = terms.notional_principal previous_due = terms.initial_exchange_date previous_redemption = annuity_start + # Track balance timeline for interpolation + balance_timeline: list[tuple[int, int]] = [] + for ts in pr_schedule: due_time = ts interest_due = _interest_minor_units( @@ -769,6 +806,9 @@ def _build_annuity_schedule( principal_payment = min(max(payment_total - interest_due, 0), outstanding) next_outstanding = max(outstanding - principal_payment, 0) + # Record balance change + balance_timeline.append((ts, next_outstanding)) + seeds.append( _seed_from_timestamp( ts, @@ -808,11 +848,16 @@ def _build_annuity_schedule( previous_due = due_time previous_redemption = due_time + # Add non-coincident reset events with interpolated balance for ts, event_type in rr_schedule: if any(ts == pr_ts for pr_ts in pr_schedule): continue if ts >= end_date: continue + # Interpolate balance at this timestamp + balance_at_reset = _interpolate_balance_at_timestamp( + ts, balance_timeline, terms.notional_principal + ) seeds.append( _seed_from_timestamp( ts, @@ -820,7 +865,7 @@ def _build_annuity_schedule( next_nominal_interest_rate=( terms.rate_reset_next if event_type == "RRF" else 0 ), - next_outstanding_principal=outstanding, + next_outstanding_principal=balance_at_reset, flags=enums.FLAG_NON_CASH_EVENT, ) ) @@ -901,6 +946,9 @@ def _build_amortizing_schedule( rr_events = dict(rr_schedule) previous_due = terms.initial_exchange_date + # Track balance timeline for interpolation + balance_timeline: list[tuple[int, int]] = [] + for index, ts in enumerate(pr_schedule): due_time = ts interest_due = _interest_minor_units( @@ -941,6 +989,9 @@ def _build_amortizing_schedule( if lax_direction == "INC": next_outstanding = outstanding + payment_total + # Record balance change + balance_timeline.append((ts, next_outstanding)) + # For NAM with negative principal_payment (capitalization), still generate PR event # For LAM/LAX, only generate events if principal_payment > 0 if principal_payment > 0 or (allow_negative and not lax): @@ -1027,6 +1078,10 @@ def _build_amortizing_schedule( continue if ts >= terms.maturity_date: continue + # Interpolate balance at this timestamp + balance_at_reset = _interpolate_balance_at_timestamp( + ts, balance_timeline, terms.notional_principal + ) seeds.append( _seed_from_timestamp( ts, @@ -1034,7 +1089,7 @@ def _build_amortizing_schedule( next_nominal_interest_rate=( terms.rate_reset_next if event_type == "RRF" else 0 ), - next_outstanding_principal=outstanding, + next_outstanding_principal=balance_at_reset, flags=enums.FLAG_NON_CASH_EVENT, ) ) @@ -1541,7 +1596,7 @@ def _resolve_annuity_payment( accrued_interest=0, rate_fp=_rate_to_fp(contract.nominal_interest_rate), day_count_convention=terms.day_count_convention, - maturity_date=terms.maturity_date, + maturity_date=end_date, ) From 6f51fde66c0dd909e22dad6de3b695e91686d698 Mon Sep 17 00:00:00 2001 From: cusma Date: Wed, 11 Mar 2026 19:12:32 +0100 Subject: [PATCH 061/244] test: update --- tests/sdk/test_normalization.py | 298 ++++++++++++++++++++++++++++++++ 1 file changed, 298 insertions(+) diff --git a/tests/sdk/test_normalization.py b/tests/sdk/test_normalization.py index eac047f5..1258ba7c 100644 --- a/tests/sdk/test_normalization.py +++ b/tests/sdk/test_normalization.py @@ -1235,6 +1235,304 @@ def test_nam_capitalizes_unpaid_interest(): ), "Outstanding should continue to increase in subsequent periods" +class TestRateResetInterpolation: + """Test that rate reset events have correct balance interpolation.""" + + def test_lam_with_interleaved_rate_resets_has_correct_balance(self): + """ + Test LAM with monthly principal redemptions and semiannual rate resets. + + The rate reset events that fall between principal redemption dates should + have the interpolated balance at that timestamp, not the final balance. + """ + # Setup: 120k initial, 10k monthly redemptions, 6-month rate resets + # At month 6 (reset), balance should be 70k (120k - 5*10k from months 1-5) + status_ts = 1704067200 # 2024-01-01 00:00:00 UTC + start_ts = status_ts + 24 * 60 * 60 # 2024-01-02 (IED must be after status) + month_1 = start_ts + 31 * 24 * 60 * 60 # Feb 1 + month_6 = start_ts + 181 * 24 * 60 * 60 # Jul 1 (approx) + + contract = ContractAttributes( + contract_id=1, + contract_type="LAM", + status_date=status_ts, + initial_exchange_date=start_ts, + maturity_date=start_ts + 365 * 24 * 60 * 60, # 1 year + notional_principal=120_000, + premium_discount_at_ied=0, + nominal_interest_rate=0.05, + next_principal_redemption_amount=10_000, + principal_redemption_anchor=month_1, + principal_redemption_cycle=Cycle(count=1, unit="M"), # Monthly + rate_reset_anchor=month_6, + rate_reset_cycle=Cycle(count=6, unit="M"), # Semiannual + rate_reset_next=0.06, + day_count_convention=DayCountConvention.A360, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, + ) + + result = normalize_contract_attributes( + contract, + denomination_asset_id=100, + denomination_asset_decimals=6, + notional_unit_value=1, + secondary_market_opening_date=start_ts, + secondary_market_closure_date=start_ts + 400 * 24 * 60 * 60, + ) + schedule = result.schedule + + # Find RR events + rr_events = [e for e in schedule if e.event_type in ("RR", "RRF")] + assert len(rr_events) > 0, "Should have rate reset events" + + # Find the first RR event (should be around month 6) + first_rr = rr_events[0] + + # Count PR events before first reset + pr_before_reset = [ + e + for e in schedule + if e.event_type == "PR" and e.scheduled_time < first_rr.scheduled_time + ] + + # With monthly redemptions and 6-month reset, should have ~5 PRs before reset + assert ( + len(pr_before_reset) >= 5 + ), f"Expected at least 5 PR events before first reset, got {len(pr_before_reset)}" + + # The balance at the reset should reflect those redemptions + # Not the terminal balance (which would be 0 or close to 0) + initial_balance = 120_000_000_000 # 120k in micro-units + + # First RR should NOT have terminal balance of 0 + assert ( + first_rr.next_outstanding_principal > 0 + ), "First RR event should not have terminal balance" + + # First RR should have less than initial (some payments made) + assert ( + first_rr.next_outstanding_principal < initial_balance + ), f"First RR event should have reduced balance after {len(pr_before_reset)} PR events" + + def test_ann_with_interleaved_rate_resets_has_correct_balance(self): + """ + Test ANN with quarterly principal redemptions and semiannual rate resets. + + Rate reset events between redemption dates should capture the correct + interpolated balance, not the terminal balance. + """ + status_ts = 1704067200 # 2024-01-01 00:00:00 UTC + start_ts = status_ts + 24 * 60 * 60 # 2024-01-02 + quarter_1 = start_ts + 90 * 24 * 60 * 60 # Apr 1 (approx) + month_6 = start_ts + 181 * 24 * 60 * 60 # Jul 1 (approx) + + contract = ContractAttributes( + contract_id=2, + contract_type="ANN", + status_date=status_ts, + initial_exchange_date=start_ts, + maturity_date=start_ts + 365 * 24 * 60 * 60, + notional_principal=100_000, + premium_discount_at_ied=0, + nominal_interest_rate=0.06, + next_principal_redemption_amount=7_000, + principal_redemption_anchor=quarter_1, + principal_redemption_cycle=Cycle(count=3, unit="M"), # Quarterly + rate_reset_anchor=month_6, + rate_reset_cycle=Cycle(count=6, unit="M"), # Semiannual + rate_reset_next=0.065, + day_count_convention=DayCountConvention.A360, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, + ) + + result = normalize_contract_attributes( + contract, + denomination_asset_id=100, + denomination_asset_decimals=6, + notional_unit_value=1, + secondary_market_opening_date=status_ts, + secondary_market_closure_date=start_ts + 400 * 24 * 60 * 60, + ) + schedule = result.schedule + + # Find RR events + rr_events = [e for e in schedule if e.event_type in ("RR", "RRF")] + + if len(rr_events) > 0: + first_rr = rr_events[0] + + # Find the most recent PR event before or at the reset to determine expected balance + pr_events_before_reset = [ + e + for e in schedule + if e.event_type == "PR" and e.scheduled_time <= first_rr.scheduled_time + ] + + if pr_events_before_reset: + # Sort by time and get the last one + pr_events_before_reset.sort(key=lambda e: e.scheduled_time) + expected_balance = pr_events_before_reset[-1].next_outstanding_principal + + actual_balance = first_rr.next_outstanding_principal + + # For events at the same timestamp, balance should match + # For events between PR dates, balance should match last PR + assert actual_balance == expected_balance, ( + f"RR event should have balance matching last PR event at or before it: " + f"expected {expected_balance}, got {actual_balance}" + ) + + def test_nam_with_rate_reset_preserves_capitalized_balance(self): + """ + Test NAM (negative amortization) with rate resets. + + When principal can increase due to capitalization, rate reset events + should reflect the actual balance at that point in time. + """ + status_ts = 1704067200 # 2024-01-01 00:00:00 UTC + start_ts = status_ts + 24 * 60 * 60 # 2024-01-02 + month_1 = start_ts + 31 * 24 * 60 * 60 + month_6 = start_ts + 181 * 24 * 60 * 60 + + contract = ContractAttributes( + contract_id=3, + contract_type="NAM", + status_date=status_ts, + initial_exchange_date=start_ts, + maturity_date=start_ts + 365 * 24 * 60 * 60, + notional_principal=100_000, + premium_discount_at_ied=0, + nominal_interest_rate=0.12, # High rate to trigger capitalization + next_principal_redemption_amount=500, + # Low payment -> capitalization + principal_redemption_anchor=month_1, + principal_redemption_cycle=Cycle(count=1, unit="M"), # Monthly + rate_reset_anchor=month_6, + rate_reset_cycle=Cycle(count=6, unit="M"), # Semiannual + rate_reset_next=0.13, + day_count_convention=DayCountConvention.A360, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, + ) + + result = normalize_contract_attributes( + contract, + denomination_asset_id=100, + denomination_asset_decimals=6, + notional_unit_value=1, + secondary_market_opening_date=status_ts, + secondary_market_closure_date=start_ts + 400 * 24 * 60 * 60, + ) + schedule = result.schedule + + # Find RR events + rr_events = [e for e in schedule if e.event_type in ("RR", "RRF")] + + if len(rr_events) > 0: + first_rr = rr_events[0] + + # Find the most recent PR event to compare + pr_events_before_reset = [ + e + for e in schedule + if e.event_type == "PR" and e.scheduled_time < first_rr.scheduled_time + ] + + if pr_events_before_reset: + pr_events_before_reset.sort(key=lambda e: e.scheduled_time) + expected_balance = pr_events_before_reset[-1].next_outstanding_principal + actual_balance = first_rr.next_outstanding_principal + + # Balance should have increased due to capitalization + assert ( + actual_balance >= 100_000_000_000 + ), "NAM balance should have grown due to capitalization" + + assert actual_balance == expected_balance, ( + f"RR event should capture the capitalized balance: " + f"expected {expected_balance}, got {actual_balance}" + ) + + def test_lax_with_rate_reset_tracks_balance_through_inc_and_dec(self): + """ + Test LAX with mixed INC/DEC directions and rate resets. + + Rate resets should track balance through both increases and decreases. + """ + status_ts = 1704067200 # 2024-01-01 00:00:00 UTC + start_ts = status_ts + 24 * 60 * 60 # 2024-01-02 + month_2 = start_ts + 31 * 24 * 60 * 60 + month_4 = start_ts + 90 * 24 * 60 * 60 + + contract = ContractAttributes( + contract_id=4, + contract_type="LAX", + status_date=status_ts, + initial_exchange_date=start_ts, + maturity_date=start_ts + 180 * 24 * 60 * 60, # 6 months + notional_principal=100_000, + premium_discount_at_ied=0, + nominal_interest_rate=0.05, + # LAX uses arrays + array_pr_anchor=[month_2, month_4], + array_pr_cycle=[Cycle(count=1, unit="M"), Cycle(count=1, unit="M")], + array_pr_next=[5_000, 3_000], # Different amounts per segment + array_increase_decrease=["DEC", "INC"], + # First segment decreases, second increases + rate_reset_anchor=start_ts + 75 * 24 * 60 * 60, # Month 2.5 + rate_reset_cycle=Cycle(count=1, unit="M"), + rate_reset_next=0.055, + day_count_convention=DayCountConvention.A360, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, + ) + + result = normalize_contract_attributes( + contract, + denomination_asset_id=100, + denomination_asset_decimals=6, + notional_unit_value=1, + secondary_market_opening_date=status_ts, + secondary_market_closure_date=start_ts + 200 * 24 * 60 * 60, + ) + schedule = result.schedule + + # Find rate reset events + reset_events = [e for e in schedule if e.event_type in ("RR", "RRF")] + + # Each reset should have a balance matching the timeline + for reset_event in reset_events: + reset_ts = reset_event.scheduled_time + + # Find all PR/PI events before this reset + principal_events = [ + e + for e in schedule + if e.event_type in ("PR", "PI") and e.scheduled_time < reset_ts + ] + + if principal_events: + # Sort and get the last one + principal_events.sort(key=lambda e: e.scheduled_time) + expected_balance = principal_events[-1].next_outstanding_principal + else: + # No principal events yet, should be initial balance + expected_balance = 100_000_000_000 + + actual_balance = reset_event.next_outstanding_principal + + assert actual_balance == expected_balance, ( + f"RR event at {reset_ts} should have balance {expected_balance}, " + f"but got {actual_balance}" + ) + + def test_nam_capitalization_uint64_overflow_detection(): """Test that NAM capitalization detects and rejects uint64 overflow.""" # Create a NAM contract with large notional and high interest rate From eea9eb982577c972a3853091799933e0f78ecffb Mon Sep 17 00:00:00 2001 From: cusma Date: Wed, 11 Mar 2026 19:29:51 +0100 Subject: [PATCH 062/244] chore: handle subtyped contract --- src/normalization.py | 38 +++++++++---- tests/sdk/test_normalization.py | 94 +++++++++++++++++++++++++++++++++ 2 files changed, 122 insertions(+), 10 deletions(-) diff --git a/src/normalization.py b/src/normalization.py index 6d6eb7db..308d59eb 100644 --- a/src/normalization.py +++ b/src/normalization.py @@ -34,6 +34,29 @@ from .unix_time import UTCTimeStamp +def _extract_base_contract_type(contract_type: str) -> str: + """ + Extract the base contract type from a potentially subtyped contract type string. + + The type:subtype notation allows contracts to specify variants (e.g., "ANN:ZCB"). + This function extracts the base type for validation and logic that should apply + to all subtypes of a given base type. + + Args: + contract_type: Contract type string, possibly with subtype (e.g., "ANN:ZCB") + + Returns: + Base contract type without subtype (e.g., "ANN" from "ANN:ZCB") + + Example: + >>> _extract_base_contract_type("ANN:ZCB") + 'ANN' + >>> _extract_base_contract_type("PAM") + 'PAM' + """ + return contract_type.split(":")[0] if ":" in contract_type else contract_type + + def _to_asa_units(amount: int | float | Decimal, asa_decimals: int) -> int: """ Convert a decimal amount to ASA base units (uint64). @@ -254,11 +277,7 @@ def normalize_contract_attributes( ) # Extract base contract type (e.g., "PAM" from "PAM:ZCB") - base_contract_type = ( - contract.contract_type.split(":")[0] - if ":" in contract.contract_type - else contract.contract_type - ) + base_contract_type = _extract_base_contract_type(contract.contract_type) pdied_asa = _compute_initial_exchange_amount( contract.notional_principal, @@ -365,9 +384,7 @@ def _normalize_schedule( ActusNormalizationError: If events not in chronological order. """ # Extract base contract type - base_contract_type = ( - contract_type.split(":")[0] if ":" in contract_type else contract_type - ) + base_contract_type = _extract_base_contract_type(contract_type) if preprocessed_events is not None: seeds = [ @@ -1511,7 +1528,7 @@ def _initial_next_principal_redemption( """ Resolve the initial next principal redemption for the first IED state. - For ANN contracts, calculates the annuity payment amount. + For ANN contracts (including subtypes like "ANN:ZCB"), calculates the annuity payment amount. For other contracts, uses the configured next_principal_redemption_amount. Args: @@ -1522,7 +1539,8 @@ def _initial_next_principal_redemption( Returns: Initial principal redemption amount in ASA base units. """ - if contract.contract_type != "ANN": + base_type = _extract_base_contract_type(contract.contract_type) + if base_type != "ANN": if contract.next_principal_redemption_amount is None: return 0 return _to_asa_units(contract.next_principal_redemption_amount, asa_decimals) diff --git a/tests/sdk/test_normalization.py b/tests/sdk/test_normalization.py index 1258ba7c..e041cad5 100644 --- a/tests/sdk/test_normalization.py +++ b/tests/sdk/test_normalization.py @@ -1577,3 +1577,97 @@ def test_nam_capitalization_uint64_overflow_detection(): secondary_market_opening_date=1000000, secondary_market_closure_date=2000000, ) + + +def test_ann_subtype_calculates_annuity_payment(): + """ + Test that ANN subtypes (e.g., "ANN:ZCB") correctly calculate annuity payments. + + Regression test for issue where "ANN:ZCB" was not recognized as an ANN contract + and would skip _resolve_annuity_payment, resulting in next_principal_redemption=0. + """ + status_ts = 1704067200 # 2024-01-01 00:00:00 UTC + start_ts = status_ts + 24 * 60 * 60 # 2024-01-02 + quarter_1 = start_ts + 90 * 24 * 60 * 60 + + # Test with subtype notation "ANN:ZCB" + contract_subtype = ContractAttributes( + contract_id=1, + contract_type="ANN:ZCB", + status_date=status_ts, + initial_exchange_date=start_ts, + maturity_date=start_ts + 365 * 24 * 60 * 60, + notional_principal=100_000, + premium_discount_at_ied=0, + nominal_interest_rate=0.06, + next_principal_redemption_amount=7_000, + principal_redemption_anchor=quarter_1, + principal_redemption_cycle=Cycle(count=3, unit="M"), + day_count_convention=DayCountConvention.A360, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, + ) + + # Test with base type "ANN" + contract_base = ContractAttributes( + contract_id=2, + contract_type="ANN", + status_date=status_ts, + initial_exchange_date=start_ts, + maturity_date=start_ts + 365 * 24 * 60 * 60, + notional_principal=100_000, + premium_discount_at_ied=0, + nominal_interest_rate=0.06, + next_principal_redemption_amount=7_000, + principal_redemption_anchor=quarter_1, + principal_redemption_cycle=Cycle(count=3, unit="M"), + day_count_convention=DayCountConvention.A360, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, + ) + + result_subtype = normalize_contract_attributes( + contract_subtype, + denomination_asset_id=100, + denomination_asset_decimals=6, + notional_unit_value=1, + secondary_market_opening_date=status_ts, + secondary_market_closure_date=start_ts + 400 * 24 * 60 * 60, + ) + + result_base = normalize_contract_attributes( + contract_base, + denomination_asset_id=100, + denomination_asset_decimals=6, + notional_unit_value=1, + secondary_market_opening_date=status_ts, + secondary_market_closure_date=start_ts + 400 * 24 * 60 * 60, + ) + + # Both should have the same IED event with correct annuity payment + # The IED (Initial Exchange Date) event contains the calculated annuity payment + ied_subtype = next(e for e in result_subtype.schedule if e.event_type == "IED") + ied_base = next(e for e in result_base.schedule if e.event_type == "IED") + + # Specifically, next_principal_redemption should be non-zero for both + assert ( + ied_subtype.next_principal_redemption > 0 + ), "ANN:ZCB subtype should calculate annuity payment in IED event" + assert ( + ied_base.next_principal_redemption > 0 + ), "ANN base type should calculate annuity payment in IED event" + + # The calculated annuity payment should be identical for both + assert ( + ied_subtype.next_principal_redemption == ied_base.next_principal_redemption + ), f"ANN:ZCB and ANN should produce identical annuity payments: subtype={ied_subtype.next_principal_redemption}, base={ied_base.next_principal_redemption}" + + # Verify other IED properties match too + assert ( + ied_subtype.next_outstanding_principal == ied_base.next_outstanding_principal + ), "Outstanding principal should match" + assert ( + ied_subtype.next_nominal_interest_rate == ied_base.next_nominal_interest_rate + ), "Nominal interest rate should match" From 1008d99a49167dac01abb3beb2a1d5b54fd3ef82 Mon Sep 17 00:00:00 2001 From: cusma Date: Wed, 11 Mar 2026 19:43:41 +0100 Subject: [PATCH 063/244] chore: normalization package --- src/normalization.py | 1863 ----------------------------- src/normalization/__init__.py | 45 + src/normalization/ann_builder.py | 220 ++++ src/normalization/annuity.py | 215 ++++ src/normalization/builders.py | 520 ++++++++ src/normalization/calculations.py | 143 +++ src/normalization/conversions.py | 133 ++ src/normalization/core.py | 358 ++++++ src/normalization/event_seeds.py | 139 +++ src/normalization/schedules.py | 258 ++++ 10 files changed, 2031 insertions(+), 1863 deletions(-) delete mode 100644 src/normalization.py create mode 100644 src/normalization/__init__.py create mode 100644 src/normalization/ann_builder.py create mode 100644 src/normalization/annuity.py create mode 100644 src/normalization/builders.py create mode 100644 src/normalization/calculations.py create mode 100644 src/normalization/conversions.py create mode 100644 src/normalization/core.py create mode 100644 src/normalization/event_seeds.py create mode 100644 src/normalization/schedules.py diff --git a/src/normalization.py b/src/normalization.py deleted file mode 100644 index 308d59eb..00000000 --- a/src/normalization.py +++ /dev/null @@ -1,1863 +0,0 @@ -"""ACTUS Contract normalization to AVM""" - -from __future__ import annotations - -from collections.abc import Sequence -from dataclasses import dataclass -from decimal import Decimal - -from smart_contracts import constants as cst -from smart_contracts import enums - -from .contracts import ContractAttributes -from .day_count import days_in_month, year_fraction_fixed -from .errors import ActusNormalizationError, UnsupportedActusFeatureError -from .models import ( - ExecutionScheduleEntry, - InitialKernelState, - NormalizationResult, - NormalizedActusTerms, - ObservedEventRequest, -) -from .registry import ( - ALLOWED_EVENT_TYPES, - CONTRACT_TYPE_IDS, - EVENT_SCHEDULE_PRIORITY, -) -from .schedule import ( - Cycle, - datetime_to_timestamp, - resolve_array_schedule, - resolve_cycle_schedule, - timestamp_to_datetime, -) -from .unix_time import UTCTimeStamp - - -def _extract_base_contract_type(contract_type: str) -> str: - """ - Extract the base contract type from a potentially subtyped contract type string. - - The type:subtype notation allows contracts to specify variants (e.g., "ANN:ZCB"). - This function extracts the base type for validation and logic that should apply - to all subtypes of a given base type. - - Args: - contract_type: Contract type string, possibly with subtype (e.g., "ANN:ZCB") - - Returns: - Base contract type without subtype (e.g., "ANN" from "ANN:ZCB") - - Example: - >>> _extract_base_contract_type("ANN:ZCB") - 'ANN' - >>> _extract_base_contract_type("PAM") - 'PAM' - """ - return contract_type.split(":")[0] if ":" in contract_type else contract_type - - -def _to_asa_units(amount: int | float | Decimal, asa_decimals: int) -> int: - """ - Convert a decimal amount to ASA base units (uint64). - - Scales the amount by 10^asa_decimals to represent fractional values as integers. - - Example: - >>> _to_asa_units(100.42, 3) # 100.42 with 3 decimals - 100420 - >>> _to_asa_units(100, 2) # 100 with 2 decimals - 10000 - - Args: - amount: The numeric value to convert. - asa_decimals: Number of decimal places for the ASA. - - Returns: - The amount in ASA base units as an integer. - - Raises: - TypeError: If value is not int, float, or Decimal. - ActusNormalizationError: If result exceeds uint64 bounds. - """ - - if isinstance(amount, (int, float, Decimal)): - scale = 10**asa_decimals - result = int(Decimal(str(amount)) * scale) - else: - raise TypeError(f"Unsupported value type: {type(amount)}") - - if result < 0 or result > cst.MAX_UINT64: - raise ActusNormalizationError( - f"Value {amount} results in {result} which exceeds uint64 bounds" - ) - - return result - - -def _rate_to_fp(value: int | float | Decimal) -> int: - """ - Convert decimal rates to fixed-point integer representation. - - Scales decimal rates by FIXED_POINT_SCALE for AVM-compatible uint64 storage. - - Example: - >>> _rate_to_fp(0.05) # 5% rate with FIXED_POINT_SCALE=1_000_000_000 - 50000000 - - Args: - value: The rate value (e.g., 0.05 for 5%). - - Returns: - Fixed-point scaled rate as uint64 integer. - - Raises: - TypeError: If value is not int, float, or Decimal. - ActusNormalizationError: If result exceeds uint64 bounds. - """ - - if isinstance(value, (int, float, Decimal)): - result = int(Decimal(str(value)) * cst.FIXED_POINT_SCALE) - else: - raise TypeError(f"Unsupported value type: {type(value)}") - - if result < 0 or result > cst.MAX_UINT64: - raise ActusNormalizationError( - f"Value {value} results in {result} which exceeds uint64 bounds" - ) - - return result - - -def _compute_initial_exchange_amount( - notional: int | float | Decimal, - premium_discount_at_ied: int | float | Decimal, - asa_decimals: int, -) -> int: - """ - Calculate the initial exchange amount adjusted for premium/discount. - - Returns the net notional after subtracting any premium/discount at IED - (Initial Exchange Date). - - Args: - notional: The notional principal amount. - premium_discount_at_ied: Premium/discount adjustment at IED. - Positive value = discount (reduces notional) - Negative value = premium (increases notional) - asa_decimals: Number of decimal places for the ASA. - - Returns: - Net initial exchange amount in ASA base units. - - Raises: - ActusNormalizationError: If result is negative or exceeds uint64 bounds. - """ - notional = _to_asa_units(notional, asa_decimals) - - # Handle premium (negative) and discount (positive) separately - # to avoid _to_asa_units rejecting negative values - if premium_discount_at_ied >= 0: - pdied = _to_asa_units(premium_discount_at_ied, asa_decimals) - # Validate that discount doesn't exceed notional (would result in negative amount) - if pdied > notional: - raise ActusNormalizationError( - f"Premium/discount at IED ({premium_discount_at_ied}) exceeds notional " - f"({notional / (10 ** asa_decimals)}), which would result in a negative " - f"initial exchange amount. This is invalid for uint64 encoding." - ) - result = notional - pdied - else: - # For negative premium_discount (premium), convert absolute value and add - pdied = _to_asa_units(-premium_discount_at_ied, asa_decimals) - result = notional + pdied - - # Validate uint64 bounds for AVM encoding - if result > cst.MAX_UINT64: - raise ActusNormalizationError( - f"Initial exchange amount {result} exceeds uint64 maximum ({cst.MAX_UINT64}). " - f"Notional={notional / (10 ** asa_decimals)}, " - f"premium_discount_at_ied={premium_discount_at_ied}" - ) - - return result - - -def _deduplicate_timestamps(ts: Sequence[UTCTimeStamp]) -> tuple[UTCTimeStamp, ...]: - """Remove duplicate timestamps while preserving sorted schedule order.""" - return tuple(dict.fromkeys(sorted(ts))) - - -@dataclass(frozen=True, slots=True) -class _EventSeed: - """ - Intermediate normalized event before final schedule encoding. - - Represents a scheduled event during the normalization process, containing - all necessary information to generate the final ExecutionScheduleEntry. - - Attributes: - event_type: ACTUS event type (e.g., "IED", "IP", "PR", "MD"). - scheduled_time: Unix timestamp when event occurs. - accrual_factor: Optional year fraction for interest accrual. - redemption_accrual_factor: Optional year fraction for redemption accrual. - redemption_accrual_start: Start timestamp for redemption accrual period. - redemption_accrual_end: End timestamp for redemption accrual period. - next_nominal_interest_rate: Interest rate after this event. - next_principal_redemption: Principal redemption amount. - next_outstanding_principal: Outstanding principal after this event. - flags: Event flags (cash/non-cash, etc.). - """ - - event_type: str - scheduled_time: UTCTimeStamp - accrual_factor: int | float | Decimal | None = None - redemption_accrual_factor: int | float | Decimal | None = None - redemption_accrual_start: int = 0 - redemption_accrual_end: int = 0 - next_nominal_interest_rate: int | float | Decimal = 0 - next_principal_redemption: int = 0 - next_outstanding_principal: int = 0 - flags: int = 0 - - -def normalize_contract_attributes( - contract: ContractAttributes, - *, - denomination_asset_id: int, - denomination_asset_decimals: int, - notional_unit_value: int | float | Decimal, - secondary_market_opening_date: UTCTimeStamp, - secondary_market_closure_date: UTCTimeStamp, - preprocessed_events: ( - Sequence[ObservedEventRequest | ExecutionScheduleEntry] | None - ) = None, -) -> NormalizationResult: - """ - Normalize ACTUS contract attributes into AVM-compatible terms, schedule, and state. - - Transforms human-readable ACTUS contract parameters into fixed-point integers, - generates the execution schedule, and initializes the contract kernel state. - - Args: - contract: ACTUS contract attributes with dates, amounts, and cycles. - denomination_asset_id: ASA ID for the denomination asset. - denomination_asset_decimals: Decimal places for the denomination ASA. - notional_unit_value: Notional value per unit in denomination ASA. - secondary_market_opening_date: Unix timestamp for secondary market opening. - secondary_market_closure_date: Unix timestamp for secondary market closure. - preprocessed_events: Optional pre-generated event schedule. - - Returns: - NormalizationResult containing normalized terms, execution schedule, and initial state. - - Raises: - ActusNormalizationError: If status_date >= initial_exchange_date or invalid config. - - Example: - >>> contract = ContractAttributes( - ... contract_type="PAM", - ... status_date=1609459200, # 2021-01-01 - ... initial_exchange_date=1612137600, # 2021-02-01 - ... maturity_date=1643673600, # 2022-02-01 - ... notional_principal=100000, - ... nominal_interest_rate=0.05, - ... ) - >>> result = normalize_contract_attributes( - ... contract, - ... denomination_asset_id=1, - ... denomination_asset_decimals=6, - ... notional_unit_value=100, - ... ) - """ - - if contract.status_date >= contract.initial_exchange_date: - raise ActusNormalizationError( - "D-ASA requires status_date to be strictly before initial_exchange_date" - ) - - # Extract base contract type (e.g., "PAM" from "PAM:ZCB") - base_contract_type = _extract_base_contract_type(contract.contract_type) - - pdied_asa = _compute_initial_exchange_amount( - contract.notional_principal, - contract.premium_discount_at_ied, - denomination_asset_decimals, - ) - - # Normalize ACTUS contract terms to AVM - terms = NormalizedActusTerms( - # Contract - contract_id=contract.contract_id, - contract_type=CONTRACT_TYPE_IDS[base_contract_type], - # Denomination - denomination_asset_id=denomination_asset_id, - # Time - initial_exchange_date=contract.initial_exchange_date, - maturity_date=contract.maturity_date, - secondary_market_opening_date=secondary_market_opening_date, - secondary_market_closure_date=secondary_market_closure_date, - # Principal - notional_principal=_to_asa_units( - contract.notional_principal, denomination_asset_decimals - ), - notional_unit_value=_to_asa_units( - notional_unit_value, denomination_asset_decimals - ), - initial_exchange_amount=pdied_asa, - next_principal_redemption_amount=_to_asa_units( - contract.next_principal_redemption_amount, denomination_asset_decimals - ), - # Interest - rate_reset_spread=_rate_to_fp(contract.rate_reset_spread), - rate_reset_multiplier=_rate_to_fp(contract.rate_reset_multiplier), - rate_reset_floor=_rate_to_fp(contract.rate_reset_floor), - rate_reset_cap=_rate_to_fp(contract.rate_reset_cap), - rate_reset_next=_rate_to_fp( - contract.rate_reset_next - if contract.rate_reset_next is not None - else contract.nominal_interest_rate - ), - # Day Count Convention - day_count_convention=contract.day_count_convention, - # Scaling - fixed_point_scale=cst.FIXED_POINT_SCALE, - ) - - # Normalize ACTUS contract schedule to AVM - schedule = _normalize_schedule( - contract, - terms=terms, - preprocessed_events=preprocessed_events, - contract_type=contract.contract_type, - status_date=contract.status_date, - asa_decimals=denomination_asset_decimals, - ) - - # Normalize ACTUS contract initial state to AVM - initial_state = InitialKernelState( - status_date=contract.status_date, - event_cursor=0, - outstanding_principal=0, - interest_calculation_base=0, - nominal_interest_rate=0, - accrued_interest=0, - next_principal_redemption=0, - cumulative_interest_index=0, - cumulative_principal_index=0, - ) - return NormalizationResult( - terms=terms, - schedule=schedule, - initial_state=initial_state, - ) - - -def _normalize_schedule( - contract: ContractAttributes, - *, - terms: NormalizedActusTerms, - preprocessed_events: Sequence[ObservedEventRequest | ExecutionScheduleEntry] | None, - contract_type: str, - status_date: int, - asa_decimals: int, -) -> tuple[ExecutionScheduleEntry, ...]: - """ - Build the final execution schedule from event seeds or preprocessed events. - - Converts intermediate event seeds into fully populated ExecutionScheduleEntry - objects with computed accrual factors and proper event ordering. - - Args: - contract: Original ACTUS contract attributes. - terms: Normalized contract terms. - preprocessed_events: Optional pre-generated event schedule. - contract_type: Base contract type (e.g., "PAM", "LAM"). - status_date: Contract status date (must precede all events). - asa_decimals: Decimal places for the denomination ASA. - - Returns: - Sorted tuple of ExecutionScheduleEntry objects. - - Raises: - UnsupportedActusFeatureError: If event type not allowed for contract type. - ActusNormalizationError: If events not in chronological order. - """ - # Extract base contract type - base_contract_type = _extract_base_contract_type(contract_type) - - if preprocessed_events is not None: - seeds = [ - _seed_from_preprocessed(index, item) - for index, item in enumerate(preprocessed_events) - ] - else: - seeds = list( - _build_schedule_seeds( - contract, - terms, - contract_type=base_contract_type, - asa_decimals=asa_decimals, - ) - ) - - if not any(seed.event_type == "IED" for seed in seeds): - seeds.append(_initial_exchange_seed(contract, terms, asa_decimals=asa_decimals)) - - ordered = sorted(seeds, key=_seed_sort_key) - allowed = ALLOWED_EVENT_TYPES[base_contract_type] - entries: list[ExecutionScheduleEntry] = [] - previous_ts = status_date - for event_id, seed in enumerate(ordered): - if seed.event_type not in allowed: - raise UnsupportedActusFeatureError( - f"Unsupported event {seed.event_type} for {base_contract_type}" - ) - if seed.event_type != "IED" and seed.scheduled_time < previous_ts: - raise ActusNormalizationError( - "ACTUS scheduled_time must be non-decreasing in event execution order" - ) - accrual_factor = seed.accrual_factor - if accrual_factor is None: - if seed.event_type == "IED": - accrual_factor = 0 - else: - accrual_factor = year_fraction_fixed( - previous_ts, - seed.scheduled_time, - day_count_convention=terms.day_count_convention, - maturity_date=terms.maturity_date, - ) - redemption_accrual_factor = seed.redemption_accrual_factor - if redemption_accrual_factor is None: - if seed.redemption_accrual_end > seed.redemption_accrual_start: - redemption_accrual_factor = year_fraction_fixed( - seed.redemption_accrual_start, - seed.redemption_accrual_end, - day_count_convention=terms.day_count_convention, - maturity_date=terms.maturity_date, - ) - else: - redemption_accrual_factor = 0 - entries.append( - ExecutionScheduleEntry( - event_id=event_id, - event_type=seed.event_type, - scheduled_time=seed.scheduled_time, - accrual_factor=accrual_factor, - redemption_accrual_factor=redemption_accrual_factor, - next_nominal_interest_rate=seed.next_nominal_interest_rate, - next_principal_redemption=seed.next_principal_redemption, - next_outstanding_principal=seed.next_outstanding_principal, - flags=seed.flags, - ) - ) - previous_ts = seed.scheduled_time - return tuple(entries) - - -def _build_schedule_seeds( - contract: ContractAttributes, - terms: NormalizedActusTerms, - *, - contract_type: str, - asa_decimals: int, -) -> tuple[_EventSeed, ...]: - """ - Dispatch contract-type-specific schedule construction. - - Routes to the appropriate schedule builder based on contract type - (PAM, LAM, NAM, ANN, LAX, or CLM). - - Args: - contract: ACTUS contract attributes. - terms: Normalized contract terms. - contract_type: Base contract type (without subtype). - asa_decimals: Decimal places for the denomination ASA. - - Returns: - Tuple of event seeds for the contract's execution schedule. - """ - # PAM and CLM don't require asa_decimals - if contract_type in ("PAM", "CLM"): - dispatch = { - "PAM": _build_pam_schedule, - "CLM": _build_clm_schedule, - } - return dispatch[contract_type](contract, terms) - - # Other contract types require asa_decimals - dispatch = { - "LAM": _build_lam_schedule, - "NAM": _build_nam_schedule, - "ANN": _build_ann_schedule, - "LAX": _build_lax_schedule, - } - return dispatch[contract_type](contract, terms, asa_decimals) - - -def _initial_exchange_seed( - contract: ContractAttributes, - terms: NormalizedActusTerms, - asa_decimals: int, -) -> _EventSeed: - """ - Build the mandatory initial exchange event seed. - - Creates the IED (Initial Exchange Date) event that establishes the initial - contract state including principal and interest rate. - - Args: - contract: ACTUS contract attributes. - terms: Normalized contract terms. - asa_decimals: Decimal places for the denomination ASA. - - Returns: - Event seed for the IED event. - """ - - return _EventSeed( - event_type="IED", - scheduled_time=terms.initial_exchange_date, - next_nominal_interest_rate=_rate_to_fp(contract.nominal_interest_rate), - next_principal_redemption=_initial_next_principal_redemption( - contract, terms, asa_decimals - ), - next_outstanding_principal=terms.notional_principal, - flags=enums.FLAG_NON_CASH_EVENT, - ) - - -def _build_pam_schedule( - contract: ContractAttributes, terms: NormalizedActusTerms -) -> tuple[_EventSeed, ...]: - """ - Build the normalized PAM (Principal at Maturity) event seed schedule. - - Args: - contract: ACTUS contract attributes. - terms: Normalized contract terms. - - Returns: - Tuple of event seeds for the PAM schedule. - - Raises: - ActusNormalizationError: If maturity_date is not specified. - """ - - if terms.maturity_date is None: - raise ActusNormalizationError("PAM normalization requires maturity_date") - - seeds: list[_EventSeed] = [] - outstanding = terms.notional_principal - for ts in _interest_schedule(contract, terms): - seeds.append( - _seed_from_timestamp( - ts, - event_type="IP", - next_outstanding_principal=outstanding, - flags=enums.FLAG_CASH_EVENT, - ) - ) - seeds.extend(_rate_reset_schedule(contract, outstanding, terms.maturity_date)) - seeds.append( - _seed_from_timestamp( - terms.maturity_date, - event_type="MD", - next_outstanding_principal=0, - flags=enums.FLAG_CASH_EVENT, - ) - ) - return tuple(seeds) - - -def _build_lam_schedule( - contract: ContractAttributes, terms: NormalizedActusTerms, asa_decimals: int -) -> tuple[_EventSeed, ...]: - """ - Build the normalized LAM (Linear Amortizer) event seed schedule. - - Args: - contract: ACTUS contract attributes. - terms: Normalized contract terms. - asa_decimals: Decimal places for the denomination ASA. - - Returns: - Tuple of event seeds for the LAM schedule. - """ - return _build_amortizing_schedule( - contract, terms, asa_decimals, allow_negative=False, lax=False - ) - - -def _build_nam_schedule( - contract: ContractAttributes, terms: NormalizedActusTerms, asa_decimals: int -) -> tuple[_EventSeed, ...]: - """ - Build the normalized NAM (Negative Amortizer) event seed schedule. - - Args: - contract: ACTUS contract attributes. - terms: Normalized contract terms. - asa_decimals: Decimal places for the denomination ASA. - - Returns: - Tuple of event seeds for the NAM schedule. - """ - return _build_amortizing_schedule( - contract, terms, asa_decimals, allow_negative=True, lax=False - ) - - -def _build_ann_schedule( - contract: ContractAttributes, terms: NormalizedActusTerms, asa_decimals: int -) -> tuple[_EventSeed, ...]: - """ - Build the normalized ANN (Annuity) event seed schedule. - - Args: - contract: ACTUS contract attributes. - terms: Normalized contract terms. - asa_decimals: Decimal places for the denomination ASA. - - Returns: - Tuple of event seeds for the ANN schedule. - """ - return _build_annuity_schedule(contract, terms, asa_decimals) - - -def _build_lax_schedule( - contract: ContractAttributes, terms: NormalizedActusTerms, asa_decimals: int -) -> tuple[_EventSeed, ...]: - """ - Build the normalized LAX (Linear Amortizer with eXtensions) event seed schedule. - - Args: - contract: ACTUS contract attributes. - terms: Normalized contract terms. - asa_decimals: Decimal places for the denomination ASA. - - Returns: - Tuple of event seeds for the LAX schedule. - """ - return _build_amortizing_schedule( - contract, terms, asa_decimals, allow_negative=True, lax=True - ) - - -def _build_clm_schedule( - contract: ContractAttributes, terms: NormalizedActusTerms -) -> tuple[_EventSeed, ...]: - """ - Build the normalized CLM (Call Money) event seed schedule. - - Args: - contract: ACTUS contract attributes. - terms: Normalized contract terms. - - Returns: - Tuple of event seeds for the CLM schedule. - """ - seeds: list[_EventSeed] = [] - outstanding = terms.notional_principal - if terms.maturity_date is not None: - for ts in _interest_schedule(contract, terms): - seeds.append( - _seed_from_timestamp( - ts, - event_type="IP", - next_outstanding_principal=outstanding, - flags=enums.FLAG_CASH_EVENT, - ) - ) - seeds.append( - _seed_from_timestamp( - terms.maturity_date, - event_type="MD", - next_outstanding_principal=0, - flags=enums.FLAG_CASH_EVENT, - ) - ) - seeds.extend(_rate_reset_schedule(contract, outstanding, terms.maturity_date)) - return tuple(seeds) - - -def _interpolate_balance_at_timestamp( - timestamp: int, - balance_timeline: list[tuple[int, int]], - initial_balance: int, -) -> int: - """ - Interpolate the outstanding principal balance at a specific timestamp. - - Args: - timestamp: The timestamp to query. - balance_timeline: List of (timestamp, balance_after) tuples in chronological order. - initial_balance: The starting balance before any events. - - Returns: - The outstanding balance at the given timestamp. - """ - if not balance_timeline: - return initial_balance - - # If timestamp is before first event, return initial balance - if timestamp < balance_timeline[0][0]: - return initial_balance - - # Find the last event on or before the timestamp - balance = initial_balance - for ts, balance_after in balance_timeline: - if ts <= timestamp: - balance = balance_after - else: - break - - return balance - - -def _build_annuity_schedule( - contract: ContractAttributes, - terms: NormalizedActusTerms, - asa_decimals: int, -) -> tuple[_EventSeed, ...]: - """ - Build the ANN schedule including PRF recalculation events when needed. - - Args: - contract: ACTUS contract attributes. - terms: Normalized contract terms. - asa_decimals: Decimal places for the denomination ASA. - - Returns: - Tuple of event seeds for the annuity schedule. - - Raises: - ActusNormalizationError: If required fields are missing. - """ - # Use maturity_date or amortization_date (whichever is set) - end_date = terms.maturity_date or contract.amortization_date - if end_date is None: - raise ActusNormalizationError( - "ANN normalization requires maturity_date or amortization_date" - ) - - pr_schedule = _principal_schedule(contract, terms, lax=False, end_date=end_date) - if not pr_schedule: - raise ActusNormalizationError( - "ANN normalization requires a principal redemption schedule" - ) - - formula_redemption_times = sorted(set(pr_schedule)) - if end_date not in formula_redemption_times: - formula_redemption_times.append(end_date) - - pr_anchor = contract.principal_redemption_anchor - if pr_anchor is None: - pr_anchor = terms.initial_exchange_date - - pr_cycle = contract.principal_redemption_cycle - if pr_cycle is None: - raise ActusNormalizationError( - "ANN normalization requires principal_redemption_cycle" - ) - - annuity_start = _annuity_start_timestamp( - initial_exchange_date=terms.initial_exchange_date, - principal_redemption_anchor=pr_anchor, - principal_redemption_cycle=pr_cycle, - ) - rate_fp = _rate_to_fp(contract.nominal_interest_rate) - dynamic_redemption = terms.dynamic_principal_redemption - payment_total = _resolve_annuity_payment(contract, terms, asa_decimals) - - seeds: list[_EventSeed] = [] - rr_schedule = _rate_reset_occurrences(contract, end_date) - if dynamic_redemption: - if pr_anchor > terms.initial_exchange_date and formula_redemption_times: - prf_time = pr_anchor - cst.DAY_2_SEC - seeds.append( - _EventSeed( - event_type="PRF", - scheduled_time=prf_time, - redemption_accrual_start=annuity_start, - redemption_accrual_end=formula_redemption_times[0], - flags=enums.FLAG_NON_CASH_EVENT | enums.FLAG_INITIAL_PRF, - ) - ) - for ts, _event_type in rr_schedule: - next_redemption = next( - (value for value in formula_redemption_times if value > ts), - None, - ) - if next_redemption is None: - continue - seeds.append( - _EventSeed( - event_type="PRF", - scheduled_time=ts, - redemption_accrual_start=ts, - redemption_accrual_end=next_redemption, - flags=enums.FLAG_NON_CASH_EVENT, - ) - ) - - rr_events = dict(rr_schedule) - - outstanding = terms.notional_principal - previous_due = terms.initial_exchange_date - previous_redemption = annuity_start - # Track balance timeline for interpolation - balance_timeline: list[tuple[int, int]] = [] - - for ts in pr_schedule: - due_time = ts - interest_due = _interest_minor_units( - principal=outstanding, - rate_fp=rate_fp, - start_ts=previous_due, - end_ts=due_time, - day_count_convention=terms.day_count_convention, - maturity_date=end_date, - ) - principal_payment = min(max(payment_total - interest_due, 0), outstanding) - next_outstanding = max(outstanding - principal_payment, 0) - - # Record balance change - balance_timeline.append((ts, next_outstanding)) - - seeds.append( - _seed_from_timestamp( - ts, - event_type="PR", - redemption_accrual_start=previous_redemption, - redemption_accrual_end=due_time, - next_principal_redemption=0 if dynamic_redemption else payment_total, - next_outstanding_principal=next_outstanding, - flags=enums.FLAG_CASH_EVENT, - ) - ) - seeds.append( - _seed_from_timestamp( - ts, - event_type="IP", - next_principal_redemption=0 if dynamic_redemption else payment_total, - next_outstanding_principal=next_outstanding, - flags=enums.FLAG_CASH_EVENT, - ) - ) - event_key = ts - if event_key in rr_events: - event_type = rr_events[event_key] - seeds.append( - _seed_from_timestamp( - ts, - event_type=event_type, - next_nominal_interest_rate=( - terms.rate_reset_next if event_type == "RRF" else 0 - ), - next_outstanding_principal=next_outstanding, - flags=enums.FLAG_NON_CASH_EVENT, - ) - ) - - outstanding = next_outstanding - previous_due = due_time - previous_redemption = due_time - - # Add non-coincident reset events with interpolated balance - for ts, event_type in rr_schedule: - if any(ts == pr_ts for pr_ts in pr_schedule): - continue - if ts >= end_date: - continue - # Interpolate balance at this timestamp - balance_at_reset = _interpolate_balance_at_timestamp( - ts, balance_timeline, terms.notional_principal - ) - seeds.append( - _seed_from_timestamp( - ts, - event_type=event_type, - next_nominal_interest_rate=( - terms.rate_reset_next if event_type == "RRF" else 0 - ), - next_outstanding_principal=balance_at_reset, - flags=enums.FLAG_NON_CASH_EVENT, - ) - ) - - seeds.extend(_ipcb_schedule(contract, outstanding, end_date)) - md_redemption_start = 0 - md_redemption_end = 0 - if not any(ts == end_date for ts in pr_schedule): - md_redemption_start = previous_redemption - md_redemption_end = end_date - seeds.append( - _seed_from_timestamp( - end_date, - event_type="MD", - redemption_accrual_start=md_redemption_start, - redemption_accrual_end=md_redemption_end, - next_principal_redemption=0 if dynamic_redemption else payment_total, - next_outstanding_principal=0, - flags=enums.FLAG_CASH_EVENT, - ) - ) - return tuple(seeds) - - -def _build_amortizing_schedule( - contract: ContractAttributes, - terms: NormalizedActusTerms, - asa_decimals: int, - *, - allow_negative: bool, - lax: bool, -) -> tuple[_EventSeed, ...]: - """ - Build a generic amortizing schedule for LAM, NAM, and LAX. - - Args: - contract: ACTUS contract attributes. - terms: Normalized contract terms. - asa_decimals: Decimal places for the denomination ASA. - allow_negative: Whether negative amortization is allowed (NAM). - lax: Whether this is a LAX contract with array-based schedules. - - Returns: - Tuple of event seeds for the amortizing schedule. - - Raises: - ActusNormalizationError: If required fields are missing. - """ - contract_type = contract.contract_type - if terms.maturity_date is None: - raise ActusNormalizationError( - f"{contract_type} normalization requires maturity_date or amortization_date" - ) - - seeds: list[_EventSeed] = [] - outstanding = terms.notional_principal - rate_fp = _rate_to_fp(contract.nominal_interest_rate) - pr_schedule = _principal_schedule(contract, terms, lax=lax) - if not pr_schedule: - raise ActusNormalizationError( - f"{contract_type} normalization requires a principal redemption schedule" - ) - - payment_total = _to_asa_units( - contract.next_principal_redemption_amount or 0, - asa_decimals, - ) - - # Precompute LAX principal amounts once - pr_values_scaled: tuple[int, ...] | None = None - if lax and contract.array_pr_next is not None: - pr_values_scaled = tuple( - _to_asa_units(value, asa_decimals) for value in contract.array_pr_next - ) - - # Build rate reset schedule as dict for efficient lookup - rr_schedule = _rate_reset_occurrences(contract, terms.maturity_date) - rr_events = dict(rr_schedule) - - previous_due = terms.initial_exchange_date - # Track balance timeline for interpolation - balance_timeline: list[tuple[int, int]] = [] - - for index, ts in enumerate(pr_schedule): - due_time = ts - interest_due = _interest_minor_units( - principal=outstanding, - rate_fp=rate_fp, - start_ts=previous_due, - end_ts=due_time, - day_count_convention=terms.day_count_convention, - maturity_date=terms.maturity_date, - ) - principal_payment, payment_total = _principal_payment_for_period( - outstanding=outstanding, - payment_total=payment_total, - interest_due=interest_due, - allow_negative=allow_negative, - annuity=False, - lax=lax, - period_index=index, - pr_values_scaled=pr_values_scaled, - ) - lax_direction = _lax_direction(contract, index) if lax else "DEC" - # For NAM, negative principal_payment means capitalization (increase outstanding) - # For other types, subtract principal_payment from outstanding - if allow_negative and not lax: - # NAM: negative principal_payment increases outstanding (capitalization) - next_outstanding = outstanding - principal_payment - # Validate that capitalization doesn't cause uint64 overflow - if next_outstanding < 0 or next_outstanding > cst.MAX_UINT64: - raise ActusNormalizationError( - f"NAM capitalization at period {index} would result in outstanding principal " - f"{next_outstanding} which exceeds uint64 bounds (0 to {cst.MAX_UINT64}). " - f"Outstanding: {outstanding}, principal_payment: {principal_payment}" - ) - else: - # LAM/LAX: always decrease or maintain outstanding - next_outstanding = max(outstanding - principal_payment, 0) - - if lax_direction == "INC": - next_outstanding = outstanding + payment_total - - # Record balance change - balance_timeline.append((ts, next_outstanding)) - - # For NAM with negative principal_payment (capitalization), still generate PR event - # For LAM/LAX, only generate events if principal_payment > 0 - if principal_payment > 0 or (allow_negative and not lax): - # For LAX INC periods, generate PI (Principal Increase) events - if lax and lax_direction == "INC": - seeds.append( - _seed_from_timestamp( - ts, - event_type="PI", - next_principal_redemption=payment_total, - next_outstanding_principal=next_outstanding, - flags=enums.FLAG_NON_CASH_EVENT, - ) - ) - else: - # Normal redemption or DEC periods generate PR events - # For NAM with negative principal_payment, this is a cash event (payment made) - # but outstanding increases due to capitalization - seeds.append( - _seed_from_timestamp( - ts, - event_type="PR", - next_principal_redemption=payment_total, - next_outstanding_principal=next_outstanding, - flags=enums.FLAG_CASH_EVENT, - ) - ) - elif lax: - # For LAX with zero principal_payment, still respect direction - if lax_direction == "INC": - seeds.append( - _seed_from_timestamp( - ts, - event_type="PI", - next_principal_redemption=payment_total, - next_outstanding_principal=next_outstanding, - flags=enums.FLAG_NON_CASH_EVENT, - ) - ) - else: # DEC - seeds.append( - _seed_from_timestamp( - ts, - event_type="PR", - next_principal_redemption=payment_total, - next_outstanding_principal=next_outstanding, - flags=enums.FLAG_NON_CASH_EVENT, - ) - ) - - if interest_due > 0 or due_time == terms.maturity_date: - seeds.append( - _seed_from_timestamp( - ts, - event_type="IP", - next_principal_redemption=payment_total, - next_outstanding_principal=next_outstanding, - flags=enums.FLAG_CASH_EVENT, - ) - ) - - # Check if this timestamp has a rate reset event - event_key = ts - if event_key in rr_events: - event_type = rr_events[event_key] - seeds.append( - _seed_from_timestamp( - ts, - event_type=event_type, - next_nominal_interest_rate=( - terms.rate_reset_next if event_type == "RRF" else 0 - ), - next_outstanding_principal=next_outstanding, - flags=enums.FLAG_NON_CASH_EVENT, - ) - ) - - outstanding = next_outstanding - previous_due = due_time - - # Add remaining rate reset events that don't coincide with PR dates - for ts, event_type in rr_schedule: - if any(ts == pr_ts for pr_ts in pr_schedule): - continue - if ts >= terms.maturity_date: - continue - # Interpolate balance at this timestamp - balance_at_reset = _interpolate_balance_at_timestamp( - ts, balance_timeline, terms.notional_principal - ) - seeds.append( - _seed_from_timestamp( - ts, - event_type=event_type, - next_nominal_interest_rate=( - terms.rate_reset_next if event_type == "RRF" else 0 - ), - next_outstanding_principal=balance_at_reset, - flags=enums.FLAG_NON_CASH_EVENT, - ) - ) - - seeds.extend(_ipcb_schedule(contract, outstanding, terms.maturity_date)) - if outstanding: - seeds.append( - _seed_from_timestamp( - terms.maturity_date, - event_type="MD", - next_principal_redemption=payment_total, - next_outstanding_principal=0, - flags=enums.FLAG_CASH_EVENT, - ) - ) - return tuple(seeds) - - -def _principal_payment_for_period( - *, - outstanding: int, - payment_total: int, - interest_due: int, - allow_negative: bool, - annuity: bool, - lax: bool, - period_index: int, - pr_values_scaled: tuple[int, ...] | None = None, -) -> tuple[int, int]: - """ - Resolve the principal cashflow for one amortizing period. - - Calculates the principal payment amount based on contract type, - payment structure, and period-specific parameters. - - Args: - outstanding: Current outstanding principal. - payment_total: Total payment amount for the period. - interest_due: Interest amount due for the period. - allow_negative: Whether negative amortization is allowed. - annuity: Whether this is an annuity contract. - lax: Whether this is a LAX contract with array-based amounts. - period_index: Index of the current period. - pr_values_scaled: Precomputed scaled principal values for LAX contracts. - - Returns: - Tuple of (principal_payment, payment_total) where payment_total may be - updated from array_pr_next for LAX contracts. - """ - # For LAX contracts, override payment_total with period-specific value - if lax and pr_values_scaled is not None and period_index < len(pr_values_scaled): - payment_total = pr_values_scaled[period_index] - - if annuity: - return min(max(payment_total - interest_due, 0), outstanding), payment_total - - if allow_negative: - # For NAM, allow negative principal payments (representing capitalization) - # When payment_total < interest_due, the difference is capitalized - candidate = payment_total - interest_due - # Clamp negative values to prevent exceeding outstanding balance - # and positive values to not exceed outstanding - return max(min(candidate, outstanding), -outstanding), payment_total - - return min(max(payment_total, 0), outstanding), payment_total - - -def _principal_schedule( - contract: ContractAttributes, - terms: NormalizedActusTerms, - *, - lax: bool, - end_date: int | None = None, -) -> tuple[int, ...]: - """ - Resolve the principal redemption occurrence schedule. - - Generates timestamps for principal redemption events based on either - array-based schedules (LAX) or cycle-based schedules (standard contracts). - - Args: - contract: ACTUS contract attributes. - terms: Normalized contract terms. - lax: Whether to use LAX array-based schedule logic. - end_date: Explicit end date for the schedule. If not provided, falls back to terms.maturity_date. - - Returns: - Tuple of Unix timestamps for principal redemption events. - - Raises: - ActusNormalizationError: If LAX arrays have misaligned lengths. - """ - - if lax and contract.array_pr_anchor is not None: - anchors = tuple(ts for ts in contract.array_pr_anchor) - cycles = tuple(contract.array_pr_cycle or ()) - increases = tuple(value for value in contract.array_increase_decrease or ()) - pr_next = tuple(contract.array_pr_next or ()) - - anchor_len = len(anchors) - - # Validate all LAX arrays have aligned lengths - if cycles and len(cycles) != anchor_len: - raise ActusNormalizationError( - f"LAX array_pr_cycle length ({len(cycles)}) must match " - f"array_pr_anchor length ({anchor_len})" - ) - if increases and len(increases) != anchor_len: - raise ActusNormalizationError( - f"LAX array_increase_decrease length ({len(increases)}) must match " - f"array_pr_anchor length ({anchor_len})" - ) - if pr_next and len(pr_next) != anchor_len: - raise ActusNormalizationError( - f"LAX array_pr_next length ({len(pr_next)}) must match " - f"array_pr_anchor length ({anchor_len})" - ) - - # Use provided end_date or fall back to terms.maturity_date - effective_end = end_date if end_date is not None else terms.maturity_date - - if cycles: - timestamps = resolve_array_schedule( - anchors, - cycles, - effective_end, - end_of_month_convention=contract.end_of_month_convention, - business_day_convention=contract.business_day_convention, - calendar=contract.calendar, - ) - else: - timestamps = tuple(anchor for anchor in anchors) - return tuple( - ts - for ts in _deduplicate_timestamps(timestamps) - if terms.initial_exchange_date < ts <= effective_end - ) - - anchor = contract.principal_redemption_anchor - cycle = contract.principal_redemption_cycle - - # Use provided end_date or fall back to terms.maturity_date - effective_end = end_date if end_date is not None else terms.maturity_date - - if anchor is None or cycle is None or effective_end is None: - return () - - # Parse cycle to access stub attribute - parsed_cycle = Cycle.parse_cycle(cycle) - - timestamps = resolve_cycle_schedule( - anchor, - cycle, - effective_end, - end_of_month_convention=contract.end_of_month_convention, - business_day_convention=contract.business_day_convention, - calendar=contract.calendar, - ) - if parsed_cycle.stub == "+" and timestamps: - if timestamps[-1] != effective_end: - timestamps = timestamps[:-1] - return tuple( - ts for ts in timestamps if terms.initial_exchange_date <= ts < effective_end - ) - - -def _interest_schedule( - contract: ContractAttributes, - terms: NormalizedActusTerms, -) -> tuple[UTCTimeStamp, ...]: - """ - Resolve the interest payment occurrence schedule. - - Generates timestamps for interest payment (IP) events based on the - interest payment cycle. Ensures maturity date is included and all - events fall within the contract's active period (after IED, up to MD). - - The function handles cycle suffixes: - - If cycle ends with "+", the last event is adjusted to maturity_date - - Otherwise, maturity_date is appended to the schedule - - Args: - contract: ACTUS contract attributes with interest payment parameters. - terms: Normalized contract terms with IED and maturity date. - - Returns: - Tuple of Unix timestamps for interest payment events, deduplicated - and filtered to (IED, maturity_date]. Returns empty tuple if - interest_payment_anchor, interest_payment_cycle, or maturity_date - are not specified. - - Example: - >>> # Monthly interest payments from Feb to Dec 2021 - >>> contract = ContractAttributes( - ... interest_payment_anchor=1612137600, # 2021-02-01 - ... interest_payment_cycle=Cycle(count=1, unit="M"), - ... ... - ... ) - >>> terms = NormalizedActusTerms( - ... initial_exchange_date=1609459200, # 2021-01-01 - ... maturity_date=1640995200, # 2022-01-01 - ... ... - ... ) - >>> schedule = _interest_schedule(contract, terms) - # Returns timestamps: [Feb 1, Mar 1, ..., Dec 1, Jan 1 2022] - """ - - anchor = contract.interest_payment_anchor - cycle = contract.interest_payment_cycle - if anchor is None or cycle is None or terms.maturity_date is None: - return () - - # Parse cycle to access stub attribute - parsed_cycle = Cycle.parse_cycle(cycle) - - timestamps = list( - resolve_cycle_schedule( - anchor, - cycle, - terms.maturity_date, - end_of_month_convention=contract.end_of_month_convention, - business_day_convention=contract.business_day_convention, - calendar=contract.calendar, - ) - ) - timestamps = [ - ts - for ts in timestamps - if terms.initial_exchange_date < ts <= terms.maturity_date - ] - if timestamps: - md_present = terms.maturity_date in timestamps - if not md_present: - maturity_date = terms.maturity_date - if parsed_cycle.stub == "+": - timestamps[-1] = maturity_date - else: - timestamps.append(maturity_date) - return tuple(_deduplicate_timestamps(timestamps)) - - -def _rate_reset_schedule( - contract: ContractAttributes, - outstanding: int, - maturity_date: int | None, -) -> tuple[_EventSeed, ...]: - """ - Build non-cash RR/RRF event seeds from the rate reset schedule. - - Creates RR (Rate Reset) and RRF (Rate Reset with Fixed spread) event seeds - that update the interest rate without cash flows. - - Args: - contract: ACTUS contract attributes. - outstanding: Current outstanding principal. - maturity_date: Contract maturity date. - - Returns: - Tuple of rate reset event seeds. - """ - if maturity_date is None: - return () - next_rate = _rate_to_fp( - contract.rate_reset_next - if contract.rate_reset_next is not None - else contract.nominal_interest_rate - ) - return tuple( - _seed_from_timestamp( - ts, - event_type=event_type, - next_nominal_interest_rate=next_rate if event_type == "RRF" else 0, - next_outstanding_principal=outstanding, - flags=enums.FLAG_NON_CASH_EVENT, - ) - for ts, event_type in _rate_reset_occurrences(contract, maturity_date) - ) - - -def _rate_reset_occurrences( - contract: ContractAttributes, - maturity_date: int | None, -) -> tuple[tuple[int, str], ...]: - """ - Resolve rate reset occurrences and label them as RR or RRF. - - Generates tuples of (timestamp, event_type) for rate reset events, - distinguishing between simple resets (RR) and fixed resets (RRF). - - Args: - contract: ACTUS contract attributes. - maturity_date: Contract maturity date. - - Returns: - Tuple of (timestamp, event_type) pairs for rate reset events. - """ - anchor = contract.rate_reset_anchor - cycle = contract.rate_reset_cycle - if anchor is None or cycle is None or maturity_date is None: - return () - - timestamps = tuple( - ts - for ts in resolve_cycle_schedule( - anchor, - cycle, - maturity_date, - end_of_month_convention=contract.end_of_month_convention, - business_day_convention=contract.business_day_convention, - calendar=contract.calendar, - ) - if ts < maturity_date - ) - if not timestamps: - return () - - first_is_rrf = contract.rate_reset_next is not None - return tuple( - (ts, "RRF" if first_is_rrf and index == 0 else "RR") - for index, ts in enumerate(timestamps) - ) - - -def _ipcb_schedule( - contract: ContractAttributes, - outstanding: int, - maturity_date: int | None, -) -> tuple[_EventSeed, ...]: - """ - Build IPCB event seeds for interest calculation base adjustments. - - IPCB (Interest Payment Calculation Base) events adjust the base amount - used for interest calculations without generating cash flows. - - Args: - contract: ACTUS contract attributes. - outstanding: Current outstanding principal. - maturity_date: Contract maturity date. - - Returns: - Tuple of IPCB event seeds. - """ - anchor = contract.interest_calculation_base_anchor - cycle = contract.interest_calculation_base_cycle - if anchor is None or cycle is None or maturity_date is None: - return () - return tuple( - _seed_from_timestamp( - ts, - event_type="IPCB", - next_outstanding_principal=outstanding, - flags=enums.FLAG_NON_CASH_EVENT, - ) - for ts in resolve_cycle_schedule( - anchor, - cycle, - maturity_date, - end_of_month_convention=contract.end_of_month_convention, - business_day_convention=contract.business_day_convention, - calendar=contract.calendar, - ) - if ts <= maturity_date - ) - - -def _seed_from_preprocessed( - event_id: int, item: ObservedEventRequest | ExecutionScheduleEntry -) -> _EventSeed: - """ - Convert a preprocessed event payload into an intermediate event seed. - - Handles both ObservedEventRequest and ExecutionScheduleEntry types, - converting them to the internal _EventSeed representation. - - Args: - event_id: Unique identifier for the event. - item: Preprocessed event or schedule entry. - - Returns: - Event seed representation of the preprocessed event. - """ - if isinstance(item, ExecutionScheduleEntry): - return _EventSeed( - event_type=item.event_type, - scheduled_time=item.scheduled_time, - accrual_factor=item.accrual_factor, - redemption_accrual_factor=item.redemption_accrual_factor, - next_nominal_interest_rate=item.next_nominal_interest_rate, - next_principal_redemption=item.next_principal_redemption, - next_outstanding_principal=item.next_outstanding_principal, - flags=item.flags, - ) - entry = item.to_schedule_entry(event_id) - return _seed_from_preprocessed(event_id, entry) - - -def _seed_sort_key(seed: _EventSeed) -> tuple[int, int, str]: - """ - Return the deterministic ACTUS event ordering key for a seed. - - Events are ordered by: (1) scheduled time, (2) priority, (3) event type. - Ensures deterministic ordering when multiple events occur at the same time. - - Args: - seed: Event seed to generate sort key for. - - Returns: - Tuple of (scheduled_time, priority, event_type) for sorting. - """ - priority = EVENT_SCHEDULE_PRIORITY.get(seed.event_type, 99) - return seed.scheduled_time, priority, seed.event_type - - -def _initial_next_principal_redemption( - contract: ContractAttributes, - terms: NormalizedActusTerms, - asa_decimals: int, -) -> int: - """ - Resolve the initial next principal redemption for the first IED state. - - For ANN contracts (including subtypes like "ANN:ZCB"), calculates the annuity payment amount. - For other contracts, uses the configured next_principal_redemption_amount. - - Args: - contract: ACTUS contract attributes. - terms: Normalized contract terms. - asa_decimals: Decimal places for the denomination ASA. - - Returns: - Initial principal redemption amount in ASA base units. - """ - base_type = _extract_base_contract_type(contract.contract_type) - if base_type != "ANN": - if contract.next_principal_redemption_amount is None: - return 0 - return _to_asa_units(contract.next_principal_redemption_amount, asa_decimals) - return _resolve_annuity_payment(contract, terms, asa_decimals) - - -def _resolve_annuity_payment( - contract: ContractAttributes, - terms: NormalizedActusTerms, - asa_decimals: int, -) -> int: - """ - Resolve the initial annuity payment amount from terms or formula. - - For ANN contracts, either uses the configured payment amount or calculates - it using the annuity formula based on present value of cash flows. - - Args: - contract: ACTUS contract attributes. - terms: Normalized contract terms. - asa_decimals: Decimal places for the denomination ASA. - - Returns: - Annuity payment amount in ASA base units. - - Raises: - ActusNormalizationError: If required fields are missing. - """ - - payment_total = _to_asa_units( - contract.next_principal_redemption_amount, asa_decimals - ) - if not terms.dynamic_principal_redemption and payment_total > 0: - return payment_total - - # Use maturity_date or amortization_date (whichever is set) - end_date = contract.maturity_date or contract.amortization_date - if end_date is None: - raise ActusNormalizationError( - "ANN normalization requires maturity_date or amortization_date" - ) - - pr_schedule = _principal_schedule(contract, terms, lax=False, end_date=end_date) - if not pr_schedule: - raise ActusNormalizationError( - "ANN normalization requires a principal redemption schedule" - ) - - formula_redemption_dates = sorted(set(pr_schedule)) - if end_date not in formula_redemption_dates: - formula_redemption_dates.append(end_date) - - pr_anchor = contract.principal_redemption_anchor - if pr_anchor is None: - pr_anchor = terms.initial_exchange_date - pr_cycle = contract.principal_redemption_cycle - if pr_cycle is None: - raise ActusNormalizationError( - "ANN normalization requires principal_redemption_cycle" - ) - - annuity_start = _annuity_start_timestamp( - initial_exchange_date=terms.initial_exchange_date, - principal_redemption_anchor=pr_anchor, - principal_redemption_cycle=pr_cycle, - ) - return _calculate_annuity_payment( - start_ts=annuity_start, - redemption_schedule=formula_redemption_dates, - notional=terms.notional_principal, - accrued_interest=0, - rate_fp=_rate_to_fp(contract.nominal_interest_rate), - day_count_convention=terms.day_count_convention, - maturity_date=end_date, - ) - - -def _lax_direction(contract: ContractAttributes, period_index: int) -> str: - """ - Return whether a LAX period decreases or increases principal. - - Uses array_increase_decrease to determine if a period generates - a principal increase (INC) or decrease (DEC) event. - - Args: - contract: ACTUS contract attributes. - period_index: Zero-based index of the period. - - Returns: - "INC" for increase or "DEC" for decrease (default). - """ - directions = tuple( - str(value).upper() for value in contract.array_increase_decrease or () - ) - if period_index < len(directions): - return directions[period_index] - return "DEC" - - -def _interest_minor_units( - *, - principal: int, - rate_fp: int, - start_ts: int, - end_ts: int, - day_count_convention: int, - maturity_date: int | None, -) -> int: - """ - Compute interest in minor units for a principal and accrual interval. - - Calculates interest as: principal * rate * year_fraction, where rate - and year_fraction are in fixed-point representation. - - Example: - >>> _interest_minor_units( - ... principal=100000, - ... rate_fp=50000000, # 5% in fixed-point - ... start_ts=1609459200, - ... end_ts=1612137600, - ... day_count_convention=2, # 30/360 - ... maturity_date=None - ... ) - - Args: - principal: Principal amount in ASA base units. - rate_fp: Interest rate in fixed-point representation. - start_ts: Accrual start timestamp. - end_ts: Accrual end timestamp. - day_count_convention: Day count convention code. - maturity_date: Optional maturity date for year fraction calculation. - - Returns: - Interest amount in ASA base units. - """ - if rate_fp <= 0 or end_ts <= start_ts: - return 0 - year_fraction = year_fraction_fixed( - start_ts, - end_ts, - day_count_convention=day_count_convention, - maturity_date=maturity_date, - ) - return ( - principal - * rate_fp - * year_fraction - // cst.FIXED_POINT_SCALE - // cst.FIXED_POINT_SCALE - ) - - -def _subtract_one_cycle(timestamp: UTCTimeStamp, cycle: Cycle) -> int: - """ - Move one ACTUS cycle backward from a timestamp. - - Supports daily (D), weekly (W), monthly (M), quarterly (Q), - semi-annual (H), and yearly (Y) cycles. - - Example: - >>> cycle = Cycle(count=1, unit="M") - >>> _subtract_one_cycle(1612137600, cycle) # 2021-02-01 -> 2021-01-01 - - Args: - timestamp: Starting Unix timestamp. - cycle: ACTUS cycle specification. - - Returns: - Unix timestamp one cycle earlier. - - Raises: - ActusNormalizationError: If cycle unit is unsupported. - """ - - if cycle.unit == "D": - return timestamp - cycle.count * cst.DAY_2_SEC - - if cycle.unit == "W": - return timestamp - cycle.count * 7 * cst.DAY_2_SEC - - month_delta_map = {"M": 1, "Q": 3, "H": 6, "Y": 12} - if cycle.unit not in month_delta_map: - raise ActusNormalizationError(f"Unsupported ACTUS cycle unit: {cycle.unit}") - - current = timestamp_to_datetime(timestamp) - months = cycle.count * month_delta_map[cycle.unit] - month_index = (current.month - 1) - months - year = current.year + month_index // 12 - month = (month_index % 12) + 1 - day = min(current.day, days_in_month(year, month)) - return datetime_to_timestamp(current.replace(year=year, month=month, day=day)) - - -def _annuity_start_timestamp( - *, - initial_exchange_date: UTCTimeStamp, - principal_redemption_anchor: UTCTimeStamp, - principal_redemption_cycle: Cycle, -) -> int: - """ - Return the start timestamp used by the ANN payment formula. - - The annuity calculation starts from the later of: IED or one cycle - before the first principal redemption. - - Args: - initial_exchange_date: Contract IED timestamp. - principal_redemption_anchor: Anchor date for principal redemptions. - principal_redemption_cycle: Principal redemption cycle. - - Returns: - Start timestamp for annuity calculation. - """ - return max( - initial_exchange_date, - _subtract_one_cycle(principal_redemption_anchor, principal_redemption_cycle), - ) - - -def _calculate_annuity_payment( - *, - start_ts: int, - redemption_schedule: Sequence[int], - notional: int, - accrued_interest: int, - rate_fp: int, - day_count_convention: int, - maturity_date: int | None, -) -> int: - """ - Calculate an annuity payment from a redemption schedule and rate path. - - Uses the present value formula to compute the constant payment amount - that amortizes the principal plus accrued interest over the schedule. - - Args: - start_ts: Calculation start timestamp. - redemption_schedule: Sequence of payment timestamps. - notional: Principal amount in ASA base units. - accrued_interest: Accrued interest at start. - rate_fp: Interest rate in fixed-point representation. - day_count_convention: Day count convention code. - maturity_date: Optional maturity date for calculations. - - Returns: - Annuity payment amount in ASA base units. - """ - remaining = tuple(due_ts for due_ts in redemption_schedule if due_ts > start_ts) - if not remaining: - return 0 - - discount_fp = cst.FIXED_POINT_SCALE - denominator_fp = 0 - previous_ts = start_ts - for due_ts in remaining: - period_factor = year_fraction_fixed( - previous_ts, - due_ts, - day_count_convention=day_count_convention, - maturity_date=maturity_date, - ) - period_rate = cst.FIXED_POINT_SCALE + ( - rate_fp * period_factor // cst.FIXED_POINT_SCALE - ) - if period_rate <= 0: - raise ActusNormalizationError( - "Invalid ANN redemption schedule discount factor" - ) - discount_fp = discount_fp * cst.FIXED_POINT_SCALE // period_rate - denominator_fp += discount_fp - previous_ts = due_ts - - if denominator_fp <= 0: - raise ActusNormalizationError( - "ANN normalization requires a positive annuity denominator" - ) - numerator = max(notional, 0) + max(accrued_interest, 0) - return numerator * cst.FIXED_POINT_SCALE // denominator_fp - - -def _seed_from_timestamp( - timestamp: UTCTimeStamp, - *, - event_type: str, - redemption_accrual_start: UTCTimeStamp = 0, - redemption_accrual_end: UTCTimeStamp = 0, - next_nominal_interest_rate: int = 0, - next_principal_redemption: int = 0, - next_outstanding_principal: int = 0, - flags: int = 0, -) -> _EventSeed: - """ - Create an intermediate event seed from a resolved schedule timestamp. - - Factory function for creating _EventSeed instances with default values - for optional fields. - - Args: - timestamp: Unix timestamp when event occurs. - event_type: ACTUS event type (e.g., "IED", "IP", "PR"). - redemption_accrual_start: Start of redemption accrual period. - redemption_accrual_end: End of redemption accrual period. - next_nominal_interest_rate: Interest rate after this event. - next_principal_redemption: Principal redemption amount. - next_outstanding_principal: Outstanding principal after event. - flags: Event flags (cash/non-cash, etc.). - - Returns: - Event seed with specified parameters. - """ - return _EventSeed( - event_type=event_type, - scheduled_time=timestamp, - redemption_accrual_start=redemption_accrual_start, - redemption_accrual_end=redemption_accrual_end, - next_nominal_interest_rate=next_nominal_interest_rate, - next_principal_redemption=next_principal_redemption, - next_outstanding_principal=next_outstanding_principal, - flags=flags, - ) diff --git a/src/normalization/__init__.py b/src/normalization/__init__.py new file mode 100644 index 00000000..590ecf5c --- /dev/null +++ b/src/normalization/__init__.py @@ -0,0 +1,45 @@ +"""ACTUS Contract normalization to AVM. + +This package provides functionality to normalize ACTUS contract attributes +into AVM-compatible representations with proper separation of concerns: + +- conversions: Unit and rate conversion utilities +- calculations: Financial calculations (interest, principal payments) +- event_seeds: Event seed management and utilities +- schedules: Schedule resolution for various event types +- annuity: Annuity-specific calculations +- builders: Contract-type specific schedule builders +- ann_builder: ANN contract schedule builder +- core: Main normalization logic + +Public API: +- normalize_contract_attributes: Main normalization function +- Helper utilities for testing and advanced use cases +""" + +from .conversions import ( + compute_initial_exchange_amount as _compute_initial_exchange_amount, +) +from .conversions import ( + rate_to_fp as _rate_to_fp, +) +from .conversions import ( + to_asa_units as _to_asa_units, +) +from .core import normalize_contract_attributes +from .event_seeds import ( + EventSeed as _EventSeed, +) +from .event_seeds import ( + deduplicate_timestamps as _deduplicate_timestamps, +) + +__all__ = [ + # Expose private utilities for backward compatibility with tests + "_EventSeed", + "_compute_initial_exchange_amount", + "_deduplicate_timestamps", + "_rate_to_fp", + "_to_asa_units", + "normalize_contract_attributes", +] diff --git a/src/normalization/ann_builder.py b/src/normalization/ann_builder.py new file mode 100644 index 00000000..e8c8a943 --- /dev/null +++ b/src/normalization/ann_builder.py @@ -0,0 +1,220 @@ +"""ANN (Annuity) schedule builder for ACTUS normalization.""" + +from __future__ import annotations + +from smart_contracts import constants as cst +from smart_contracts import enums + +from ..contracts import ContractAttributes +from ..errors import ActusNormalizationError +from ..models import NormalizedActusTerms +from .annuity import get_annuity_start_timestamp, resolve_annuity_payment +from .calculations import calculate_interest, interpolate_balance_at_timestamp +from .conversions import rate_to_fp +from .event_seeds import EventSeed, create_seed +from .schedules import resolve_principal_schedule, resolve_rate_reset_occurrences + + +def build_ipcb_seeds( + contract: ContractAttributes, + outstanding: int, + maturity_date: int | None, +) -> tuple[EventSeed, ...]: + """Helper to import from builders to avoid circular dependency.""" + from .builders import build_ipcb_seeds as _build_ipcb_seeds + + return _build_ipcb_seeds(contract, outstanding, maturity_date) + + +def build_ann_schedule( + contract: ContractAttributes, + terms: NormalizedActusTerms, + asa_decimals: int, +) -> tuple[EventSeed, ...]: + """ + Build the normalized ANN (Annuity) event seed schedule. + + Args: + contract: ACTUS contract attributes. + terms: Normalized contract terms. + asa_decimals: Decimal places for the denomination ASA. + + Returns: + Tuple of event seeds for the ANN schedule. + """ + # Use maturity_date or amortization_date (whichever is set) + end_date = terms.maturity_date or contract.amortization_date + if end_date is None: + raise ActusNormalizationError( + "ANN normalization requires maturity_date or amortization_date" + ) + + pr_schedule = resolve_principal_schedule( + contract, terms, lax=False, end_date=end_date + ) + if not pr_schedule: + raise ActusNormalizationError( + "ANN normalization requires a principal redemption schedule" + ) + + formula_redemption_times = sorted(set(pr_schedule)) + if end_date not in formula_redemption_times: + formula_redemption_times.append(end_date) + + pr_anchor = contract.principal_redemption_anchor + if pr_anchor is None: + pr_anchor = terms.initial_exchange_date + + pr_cycle = contract.principal_redemption_cycle + if pr_cycle is None: + raise ActusNormalizationError( + "ANN normalization requires principal_redemption_cycle" + ) + + annuity_start = get_annuity_start_timestamp( + initial_exchange_date=terms.initial_exchange_date, + principal_redemption_anchor=pr_anchor, + principal_redemption_cycle=pr_cycle, + ) + rate_fp = rate_to_fp(contract.nominal_interest_rate) + dynamic_redemption = terms.dynamic_principal_redemption + payment_total = resolve_annuity_payment(contract, terms, asa_decimals) + + seeds: list[EventSeed] = [] + rr_schedule = resolve_rate_reset_occurrences(contract, end_date) + next_rate = rate_to_fp( + contract.rate_reset_next + if contract.rate_reset_next is not None + else contract.nominal_interest_rate + ) + + if dynamic_redemption: + if pr_anchor > terms.initial_exchange_date and formula_redemption_times: + prf_time = pr_anchor - cst.DAY_2_SEC + seeds.append( + EventSeed( + event_type="PRF", + scheduled_time=prf_time, + redemption_accrual_start=annuity_start, + redemption_accrual_end=formula_redemption_times[0], + flags=enums.FLAG_NON_CASH_EVENT | enums.FLAG_INITIAL_PRF, + ) + ) + for ts, _event_type in rr_schedule: + next_redemption = next( + (value for value in formula_redemption_times if value > ts), + None, + ) + if next_redemption is None: + continue + seeds.append( + EventSeed( + event_type="PRF", + scheduled_time=ts, + redemption_accrual_start=ts, + redemption_accrual_end=next_redemption, + flags=enums.FLAG_NON_CASH_EVENT, + ) + ) + + rr_events = dict(rr_schedule) + + outstanding = terms.notional_principal + previous_due = terms.initial_exchange_date + previous_redemption = annuity_start + # Track balance timeline for interpolation + balance_timeline: list[tuple[int, int]] = [] + + for ts in pr_schedule: + due_time = ts + interest_due = calculate_interest( + principal=outstanding, + rate_fp=rate_fp, + start_ts=previous_due, + end_ts=due_time, + day_count_convention=terms.day_count_convention, + maturity_date=end_date, + ) + principal_payment = min(max(payment_total - interest_due, 0), outstanding) + next_outstanding = max(outstanding - principal_payment, 0) + + # Record balance change + balance_timeline.append((ts, next_outstanding)) + + seeds.append( + create_seed( + ts, + event_type="PR", + redemption_accrual_start=previous_redemption, + redemption_accrual_end=due_time, + next_principal_redemption=0 if dynamic_redemption else payment_total, + next_outstanding_principal=next_outstanding, + flags=enums.FLAG_CASH_EVENT, + ) + ) + seeds.append( + create_seed( + ts, + event_type="IP", + next_principal_redemption=0 if dynamic_redemption else payment_total, + next_outstanding_principal=next_outstanding, + flags=enums.FLAG_CASH_EVENT, + ) + ) + event_key = ts + if event_key in rr_events: + event_type = rr_events[event_key] + seeds.append( + create_seed( + ts, + event_type=event_type, + next_nominal_interest_rate=( + next_rate if event_type == "RRF" else 0 + ), + next_outstanding_principal=next_outstanding, + flags=enums.FLAG_NON_CASH_EVENT, + ) + ) + + outstanding = next_outstanding + previous_due = due_time + previous_redemption = due_time + + # Add non-coincident reset events with interpolated balance + for ts, event_type in rr_schedule: + if any(ts == pr_ts for pr_ts in pr_schedule): + continue + if ts >= end_date: + continue + # Interpolate balance at this timestamp + balance_at_reset = interpolate_balance_at_timestamp( + ts, balance_timeline, terms.notional_principal + ) + seeds.append( + create_seed( + ts, + event_type=event_type, + next_nominal_interest_rate=(next_rate if event_type == "RRF" else 0), + next_outstanding_principal=balance_at_reset, + flags=enums.FLAG_NON_CASH_EVENT, + ) + ) + + seeds.extend(build_ipcb_seeds(contract, outstanding, end_date)) + md_redemption_start = 0 + md_redemption_end = 0 + if not any(ts == end_date for ts in pr_schedule): + md_redemption_start = previous_redemption + md_redemption_end = end_date + seeds.append( + create_seed( + end_date, + event_type="MD", + redemption_accrual_start=md_redemption_start, + redemption_accrual_end=md_redemption_end, + next_principal_redemption=0 if dynamic_redemption else payment_total, + next_outstanding_principal=0, + flags=enums.FLAG_CASH_EVENT, + ) + ) + return tuple(seeds) diff --git a/src/normalization/annuity.py b/src/normalization/annuity.py new file mode 100644 index 00000000..4a5d053f --- /dev/null +++ b/src/normalization/annuity.py @@ -0,0 +1,215 @@ +"""Annuity payment calculation for ANN contracts.""" + +from __future__ import annotations + +from collections.abc import Sequence + +from smart_contracts import constants as cst + +from ..contracts import ContractAttributes +from ..day_count import days_in_month, year_fraction_fixed +from ..errors import ActusNormalizationError +from ..models import NormalizedActusTerms +from ..schedule import Cycle, datetime_to_timestamp, timestamp_to_datetime +from ..unix_time import UTCTimeStamp +from .conversions import rate_to_fp, to_asa_units +from .schedules import resolve_principal_schedule + + +def subtract_one_cycle(timestamp: UTCTimeStamp, cycle: Cycle) -> int: + """ + Move one ACTUS cycle backward from a timestamp. + + Supports daily (D), weekly (W), monthly (M), quarterly (Q), + semi-annual (H), and yearly (Y) cycles. + + Example: + >>> cycle = Cycle(count=1, unit="M") + >>> subtract_one_cycle(1612137600, cycle) # 2021-02-01 -> 2021-01-01 + + Args: + timestamp: Starting Unix timestamp. + cycle: ACTUS cycle specification. + + Returns: + Unix timestamp one cycle earlier. + + Raises: + ActusNormalizationError: If cycle unit is unsupported. + """ + if cycle.unit == "D": + return timestamp - cycle.count * cst.DAY_2_SEC + + if cycle.unit == "W": + return timestamp - cycle.count * 7 * cst.DAY_2_SEC + + month_delta_map = {"M": 1, "Q": 3, "H": 6, "Y": 12} + if cycle.unit not in month_delta_map: + raise ActusNormalizationError(f"Unsupported ACTUS cycle unit: {cycle.unit}") + + current = timestamp_to_datetime(timestamp) + months = cycle.count * month_delta_map[cycle.unit] + month_index = (current.month - 1) - months + year = current.year + month_index // 12 + month = (month_index % 12) + 1 + day = min(current.day, days_in_month(year, month)) + return datetime_to_timestamp(current.replace(year=year, month=month, day=day)) + + +def get_annuity_start_timestamp( + *, + initial_exchange_date: UTCTimeStamp, + principal_redemption_anchor: UTCTimeStamp, + principal_redemption_cycle: Cycle, +) -> int: + """ + Return the start timestamp used by the ANN payment formula. + + The annuity calculation starts from the later of: IED or one cycle + before the first principal redemption. + + Args: + initial_exchange_date: Contract IED timestamp. + principal_redemption_anchor: Anchor date for principal redemptions. + principal_redemption_cycle: Principal redemption cycle. + + Returns: + Start timestamp for annuity calculation. + """ + return max( + initial_exchange_date, + subtract_one_cycle(principal_redemption_anchor, principal_redemption_cycle), + ) + + +def calculate_annuity_payment( + *, + start_ts: int, + redemption_schedule: Sequence[int], + notional: int, + accrued_interest: int, + rate_fp: int, + day_count_convention: int, + maturity_date: int | None, +) -> int: + """ + Calculate an annuity payment from a redemption schedule and rate path. + + Uses the present value formula to compute the constant payment amount + that amortizes the principal plus accrued interest over the schedule. + + Args: + start_ts: Calculation start timestamp. + redemption_schedule: Sequence of payment timestamps. + notional: Principal amount in ASA base units. + accrued_interest: Accrued interest at start. + rate_fp: Interest rate in fixed-point representation. + day_count_convention: Day count convention code. + maturity_date: Optional maturity date for calculations. + + Returns: + Annuity payment amount in ASA base units. + """ + remaining = tuple(due_ts for due_ts in redemption_schedule if due_ts > start_ts) + if not remaining: + return 0 + + discount_fp = cst.FIXED_POINT_SCALE + denominator_fp = 0 + previous_ts = start_ts + for due_ts in remaining: + period_factor = year_fraction_fixed( + previous_ts, + due_ts, + day_count_convention=day_count_convention, + maturity_date=maturity_date, + ) + period_rate = cst.FIXED_POINT_SCALE + ( + rate_fp * period_factor // cst.FIXED_POINT_SCALE + ) + if period_rate <= 0: + raise ActusNormalizationError( + "Invalid ANN redemption schedule discount factor" + ) + discount_fp = discount_fp * cst.FIXED_POINT_SCALE // period_rate + denominator_fp += discount_fp + previous_ts = due_ts + + if denominator_fp <= 0: + raise ActusNormalizationError( + "ANN normalization requires a positive annuity denominator" + ) + numerator = max(notional, 0) + max(accrued_interest, 0) + return numerator * cst.FIXED_POINT_SCALE // denominator_fp + + +def resolve_annuity_payment( + contract: ContractAttributes, + terms: NormalizedActusTerms, + asa_decimals: int, +) -> int: + """ + Resolve the initial annuity payment amount from terms or formula. + + For ANN contracts, either uses the configured payment amount or calculates + it using the annuity formula based on present value of cash flows. + + Args: + contract: ACTUS contract attributes. + terms: Normalized contract terms. + asa_decimals: Decimal places for the denomination ASA. + + Returns: + Annuity payment amount in ASA base units. + + Raises: + ActusNormalizationError: If required fields are missing. + """ + payment_total = to_asa_units( + contract.next_principal_redemption_amount, asa_decimals + ) + if not terms.dynamic_principal_redemption and payment_total > 0: + return payment_total + + # Use maturity_date or amortization_date (whichever is set) + end_date = contract.maturity_date or contract.amortization_date + if end_date is None: + raise ActusNormalizationError( + "ANN normalization requires maturity_date or amortization_date" + ) + + pr_schedule = resolve_principal_schedule( + contract, terms, lax=False, end_date=end_date + ) + if not pr_schedule: + raise ActusNormalizationError( + "ANN normalization requires a principal redemption schedule" + ) + + formula_redemption_dates = sorted(set(pr_schedule)) + if end_date not in formula_redemption_dates: + formula_redemption_dates.append(end_date) + + pr_anchor = contract.principal_redemption_anchor + if pr_anchor is None: + pr_anchor = terms.initial_exchange_date + pr_cycle = contract.principal_redemption_cycle + if pr_cycle is None: + raise ActusNormalizationError( + "ANN normalization requires principal_redemption_cycle" + ) + + annuity_start = get_annuity_start_timestamp( + initial_exchange_date=terms.initial_exchange_date, + principal_redemption_anchor=pr_anchor, + principal_redemption_cycle=pr_cycle, + ) + return calculate_annuity_payment( + start_ts=annuity_start, + redemption_schedule=formula_redemption_dates, + notional=terms.notional_principal, + accrued_interest=0, + rate_fp=rate_to_fp(contract.nominal_interest_rate), + day_count_convention=terms.day_count_convention, + maturity_date=end_date, + ) diff --git a/src/normalization/builders.py b/src/normalization/builders.py new file mode 100644 index 00000000..b12e139d --- /dev/null +++ b/src/normalization/builders.py @@ -0,0 +1,520 @@ +"""Contract-type specific schedule builders for ACTUS normalization.""" + +from __future__ import annotations + +from smart_contracts import constants as cst +from smart_contracts import enums + +from ..contracts import ContractAttributes +from ..errors import ActusNormalizationError +from ..models import NormalizedActusTerms +from .calculations import ( + calculate_interest, + calculate_principal_payment, + interpolate_balance_at_timestamp, +) +from .conversions import rate_to_fp, to_asa_units +from .event_seeds import EventSeed, create_seed +from .schedules import ( + resolve_interest_schedule, + resolve_ipcb_schedule, + resolve_principal_schedule, + resolve_rate_reset_occurrences, +) + + +def build_ied_seed( + contract: ContractAttributes, + terms: NormalizedActusTerms, + asa_decimals: int, +) -> EventSeed: + """ + Build the mandatory initial exchange event seed. + + Creates the IED (Initial Exchange Date) event that establishes the initial + contract state including principal and interest rate. + + Args: + contract: ACTUS contract attributes. + terms: Normalized contract terms. + asa_decimals: Decimal places for the denomination ASA. + + Returns: + Event seed for the IED event. + """ + from .core import get_initial_next_principal_redemption + + return EventSeed( + event_type="IED", + scheduled_time=terms.initial_exchange_date, + next_nominal_interest_rate=rate_to_fp(contract.nominal_interest_rate), + next_principal_redemption=get_initial_next_principal_redemption( + contract, terms, asa_decimals + ), + next_outstanding_principal=terms.notional_principal, + flags=enums.FLAG_NON_CASH_EVENT, + ) + + +def build_rate_reset_seeds( + contract: ContractAttributes, + outstanding: int, + maturity_date: int | None, + next_rate_fp: int, +) -> tuple[EventSeed, ...]: + """ + Build non-cash RR/RRF event seeds from the rate reset schedule. + + Creates RR (Rate Reset) and RRF (Rate Reset with Fixed spread) event seeds + that update the interest rate without cash flows. + + Args: + contract: ACTUS contract attributes. + outstanding: Current outstanding principal. + maturity_date: Contract maturity date. + next_rate_fp: Next rate in fixed-point representation. + + Returns: + Tuple of rate reset event seeds. + """ + if maturity_date is None: + return () + return tuple( + create_seed( + ts, + event_type=event_type, + next_nominal_interest_rate=next_rate_fp if event_type == "RRF" else 0, + next_outstanding_principal=outstanding, + flags=enums.FLAG_NON_CASH_EVENT, + ) + for ts, event_type in resolve_rate_reset_occurrences(contract, maturity_date) + ) + + +def build_ipcb_seeds( + contract: ContractAttributes, + outstanding: int, + maturity_date: int | None, +) -> tuple[EventSeed, ...]: + """ + Build IPCB event seeds for interest calculation base adjustments. + + IPCB (Interest Payment Calculation Base) events adjust the base amount + used for interest calculations without generating cash flows. + + Args: + contract: ACTUS contract attributes. + outstanding: Current outstanding principal. + maturity_date: Contract maturity date. + + Returns: + Tuple of IPCB event seeds. + """ + return tuple( + create_seed( + ts, + event_type="IPCB", + next_outstanding_principal=outstanding, + flags=enums.FLAG_NON_CASH_EVENT, + ) + for ts in resolve_ipcb_schedule(contract, maturity_date) + ) + + +def build_pam_schedule( + contract: ContractAttributes, terms: NormalizedActusTerms +) -> tuple[EventSeed, ...]: + """ + Build the normalized PAM (Principal at Maturity) event seed schedule. + + Args: + contract: ACTUS contract attributes. + terms: Normalized contract terms. + + Returns: + Tuple of event seeds for the PAM schedule. + + Raises: + ActusNormalizationError: If maturity_date is not specified. + """ + if terms.maturity_date is None: + raise ActusNormalizationError("PAM normalization requires maturity_date") + + seeds: list[EventSeed] = [] + outstanding = terms.notional_principal + + for ts in resolve_interest_schedule(contract, terms): + seeds.append( + create_seed( + ts, + event_type="IP", + next_outstanding_principal=outstanding, + flags=enums.FLAG_CASH_EVENT, + ) + ) + + next_rate = rate_to_fp( + contract.rate_reset_next + if contract.rate_reset_next is not None + else contract.nominal_interest_rate + ) + seeds.extend( + build_rate_reset_seeds(contract, outstanding, terms.maturity_date, next_rate) + ) + + seeds.append( + create_seed( + terms.maturity_date, + event_type="MD", + next_outstanding_principal=0, + flags=enums.FLAG_CASH_EVENT, + ) + ) + return tuple(seeds) + + +def build_clm_schedule( + contract: ContractAttributes, terms: NormalizedActusTerms +) -> tuple[EventSeed, ...]: + """ + Build the normalized CLM (Call Money) event seed schedule. + + Args: + contract: ACTUS contract attributes. + terms: Normalized contract terms. + + Returns: + Tuple of event seeds for the CLM schedule. + """ + seeds: list[EventSeed] = [] + outstanding = terms.notional_principal + + if terms.maturity_date is not None: + for ts in resolve_interest_schedule(contract, terms): + seeds.append( + create_seed( + ts, + event_type="IP", + next_outstanding_principal=outstanding, + flags=enums.FLAG_CASH_EVENT, + ) + ) + seeds.append( + create_seed( + terms.maturity_date, + event_type="MD", + next_outstanding_principal=0, + flags=enums.FLAG_CASH_EVENT, + ) + ) + + next_rate = rate_to_fp( + contract.rate_reset_next + if contract.rate_reset_next is not None + else contract.nominal_interest_rate + ) + seeds.extend( + build_rate_reset_seeds(contract, outstanding, terms.maturity_date, next_rate) + ) + return tuple(seeds) + + +def build_lam_schedule( + contract: ContractAttributes, terms: NormalizedActusTerms, asa_decimals: int +) -> tuple[EventSeed, ...]: + """ + Build the normalized LAM (Linear Amortizer) event seed schedule. + + Args: + contract: ACTUS contract attributes. + terms: Normalized contract terms. + asa_decimals: Decimal places for the denomination ASA. + + Returns: + Tuple of event seeds for the LAM schedule. + """ + return build_amortizing_schedule( + contract, terms, asa_decimals, allow_negative=False, lax=False + ) + + +def build_nam_schedule( + contract: ContractAttributes, terms: NormalizedActusTerms, asa_decimals: int +) -> tuple[EventSeed, ...]: + """ + Build the normalized NAM (Negative Amortizer) event seed schedule. + + Args: + contract: ACTUS contract attributes. + terms: Normalized contract terms. + asa_decimals: Decimal places for the denomination ASA. + + Returns: + Tuple of event seeds for the NAM schedule. + """ + return build_amortizing_schedule( + contract, terms, asa_decimals, allow_negative=True, lax=False + ) + + +def build_lax_schedule( + contract: ContractAttributes, terms: NormalizedActusTerms, asa_decimals: int +) -> tuple[EventSeed, ...]: + """ + Build the normalized LAX (Linear Amortizer with eXtensions) event seed schedule. + + Args: + contract: ACTUS contract attributes. + terms: Normalized contract terms. + asa_decimals: Decimal places for the denomination ASA. + + Returns: + Tuple of event seeds for the LAX schedule. + """ + return build_amortizing_schedule( + contract, terms, asa_decimals, allow_negative=True, lax=True + ) + + +def get_lax_direction(contract: ContractAttributes, period_index: int) -> str: + """ + Return whether a LAX period decreases or increases principal. + + Uses array_increase_decrease to determine if a period generates + a principal increase (INC) or decrease (DEC) event. + + Args: + contract: ACTUS contract attributes. + period_index: Zero-based index of the period. + + Returns: + "INC" for increase or "DEC" for decrease (default). + """ + directions = tuple( + str(value).upper() for value in contract.array_increase_decrease or () + ) + if period_index < len(directions): + return directions[period_index] + return "DEC" + + +def build_amortizing_schedule( + contract: ContractAttributes, + terms: NormalizedActusTerms, + asa_decimals: int, + *, + allow_negative: bool, + lax: bool, +) -> tuple[EventSeed, ...]: + """ + Build a generic amortizing schedule for LAM, NAM, and LAX. + + Args: + contract: ACTUS contract attributes. + terms: Normalized contract terms. + asa_decimals: Decimal places for the denomination ASA. + allow_negative: Whether negative amortization is allowed (NAM). + lax: Whether this is a LAX contract with array-based schedules. + + Returns: + Tuple of event seeds for the amortizing schedule. + + Raises: + ActusNormalizationError: If required fields are missing. + """ + contract_type = contract.contract_type + if terms.maturity_date is None: + raise ActusNormalizationError( + f"{contract_type} normalization requires maturity_date or amortization_date" + ) + + seeds: list[EventSeed] = [] + outstanding = terms.notional_principal + rate_fp = rate_to_fp(contract.nominal_interest_rate) + pr_schedule = resolve_principal_schedule(contract, terms, lax=lax) + if not pr_schedule: + raise ActusNormalizationError( + f"{contract_type} normalization requires a principal redemption schedule" + ) + + payment_total = to_asa_units( + contract.next_principal_redemption_amount or 0, + asa_decimals, + ) + + # Precompute LAX principal amounts once + pr_values_scaled: tuple[int, ...] | None = None + if lax and contract.array_pr_next is not None: + pr_values_scaled = tuple( + to_asa_units(value, asa_decimals) for value in contract.array_pr_next + ) + + # Build rate reset schedule as dict for efficient lookup + rr_schedule = resolve_rate_reset_occurrences(contract, terms.maturity_date) + rr_events = dict(rr_schedule) + next_rate = rate_to_fp( + contract.rate_reset_next + if contract.rate_reset_next is not None + else contract.nominal_interest_rate + ) + + previous_due = terms.initial_exchange_date + # Track balance timeline for interpolation + balance_timeline: list[tuple[int, int]] = [] + + for index, ts in enumerate(pr_schedule): + due_time = ts + interest_due = calculate_interest( + principal=outstanding, + rate_fp=rate_fp, + start_ts=previous_due, + end_ts=due_time, + day_count_convention=terms.day_count_convention, + maturity_date=terms.maturity_date, + ) + principal_payment, payment_total = calculate_principal_payment( + outstanding=outstanding, + payment_total=payment_total, + interest_due=interest_due, + allow_negative=allow_negative, + annuity=False, + lax=lax, + period_index=index, + pr_values_scaled=pr_values_scaled, + ) + lax_direction = get_lax_direction(contract, index) if lax else "DEC" + + # For NAM, negative principal_payment means capitalization (increase outstanding) + # For other types, subtract principal_payment from outstanding + if allow_negative and not lax: + # NAM: negative principal_payment increases outstanding (capitalization) + next_outstanding = outstanding - principal_payment + # Validate that capitalization doesn't cause uint64 overflow + if next_outstanding < 0 or next_outstanding > cst.MAX_UINT64: + raise ActusNormalizationError( + f"NAM capitalization at period {index} would result in outstanding principal " + f"{next_outstanding} which exceeds uint64 bounds (0 to {cst.MAX_UINT64}). " + f"Outstanding: {outstanding}, principal_payment: {principal_payment}" + ) + else: + # LAM/LAX: always decrease or maintain outstanding + next_outstanding = max(outstanding - principal_payment, 0) + + if lax_direction == "INC": + next_outstanding = outstanding + payment_total + + # Record balance change + balance_timeline.append((ts, next_outstanding)) + + # For NAM with negative principal_payment (capitalization), still generate PR event + # For LAM/LAX, only generate events if principal_payment > 0 + if principal_payment > 0 or (allow_negative and not lax): + # For LAX INC periods, generate PI (Principal Increase) events + if lax and lax_direction == "INC": + seeds.append( + create_seed( + ts, + event_type="PI", + next_principal_redemption=payment_total, + next_outstanding_principal=next_outstanding, + flags=enums.FLAG_NON_CASH_EVENT, + ) + ) + else: + # Normal redemption or DEC periods generate PR events + # For NAM with negative principal_payment, this is a cash event (payment made) + # but outstanding increases due to capitalization + seeds.append( + create_seed( + ts, + event_type="PR", + next_principal_redemption=payment_total, + next_outstanding_principal=next_outstanding, + flags=enums.FLAG_CASH_EVENT, + ) + ) + elif lax: + # For LAX with zero principal_payment, still respect direction + if lax_direction == "INC": + seeds.append( + create_seed( + ts, + event_type="PI", + next_principal_redemption=payment_total, + next_outstanding_principal=next_outstanding, + flags=enums.FLAG_NON_CASH_EVENT, + ) + ) + else: # DEC + seeds.append( + create_seed( + ts, + event_type="PR", + next_principal_redemption=payment_total, + next_outstanding_principal=next_outstanding, + flags=enums.FLAG_NON_CASH_EVENT, + ) + ) + + if interest_due > 0 or due_time == terms.maturity_date: + seeds.append( + create_seed( + ts, + event_type="IP", + next_principal_redemption=payment_total, + next_outstanding_principal=next_outstanding, + flags=enums.FLAG_CASH_EVENT, + ) + ) + + # Check if this timestamp has a rate reset event + event_key = ts + if event_key in rr_events: + event_type = rr_events[event_key] + seeds.append( + create_seed( + ts, + event_type=event_type, + next_nominal_interest_rate=( + next_rate if event_type == "RRF" else 0 + ), + next_outstanding_principal=next_outstanding, + flags=enums.FLAG_NON_CASH_EVENT, + ) + ) + + outstanding = next_outstanding + previous_due = due_time + + # Add remaining rate reset events that don't coincide with PR dates + for ts, event_type in rr_schedule: + if any(ts == pr_ts for pr_ts in pr_schedule): + continue + if ts >= terms.maturity_date: + continue + # Interpolate balance at this timestamp + balance_at_reset = interpolate_balance_at_timestamp( + ts, balance_timeline, terms.notional_principal + ) + seeds.append( + create_seed( + ts, + event_type=event_type, + next_nominal_interest_rate=(next_rate if event_type == "RRF" else 0), + next_outstanding_principal=balance_at_reset, + flags=enums.FLAG_NON_CASH_EVENT, + ) + ) + + seeds.extend(build_ipcb_seeds(contract, outstanding, terms.maturity_date)) + if outstanding: + seeds.append( + create_seed( + terms.maturity_date, + event_type="MD", + next_principal_redemption=payment_total, + next_outstanding_principal=0, + flags=enums.FLAG_CASH_EVENT, + ) + ) + return tuple(seeds) diff --git a/src/normalization/calculations.py b/src/normalization/calculations.py new file mode 100644 index 00000000..d31f724d --- /dev/null +++ b/src/normalization/calculations.py @@ -0,0 +1,143 @@ +"""Financial calculation utilities for ACTUS normalization.""" + +from __future__ import annotations + +from smart_contracts import constants as cst + +from ..day_count import year_fraction_fixed + + +def calculate_interest( + *, + principal: int, + rate_fp: int, + start_ts: int, + end_ts: int, + day_count_convention: int, + maturity_date: int | None, +) -> int: + """ + Compute interest in minor units for a principal and accrual interval. + + Calculates interest as: principal * rate * year_fraction, where rate + and year_fraction are in fixed-point representation. + + Example: + >>> calculate_interest( + ... principal=100000, + ... rate_fp=50000000, # 5% in fixed-point + ... start_ts=1609459200, + ... end_ts=1612137600, + ... day_count_convention=2, # 30/360 + ... maturity_date=None + ... ) + + Args: + principal: Principal amount in ASA base units. + rate_fp: Interest rate in fixed-point representation. + start_ts: Accrual start timestamp. + end_ts: Accrual end timestamp. + day_count_convention: Day count convention code. + maturity_date: Optional maturity date for year fraction calculation. + + Returns: + Interest amount in ASA base units. + """ + if rate_fp <= 0 or end_ts <= start_ts: + return 0 + year_fraction = year_fraction_fixed( + start_ts, + end_ts, + day_count_convention=day_count_convention, + maturity_date=maturity_date, + ) + return ( + principal + * rate_fp + * year_fraction + // cst.FIXED_POINT_SCALE + // cst.FIXED_POINT_SCALE + ) + + +def interpolate_balance_at_timestamp( + timestamp: int, + balance_timeline: list[tuple[int, int]], + initial_balance: int, +) -> int: + """ + Interpolate the outstanding principal balance at a specific timestamp. + + Args: + timestamp: The timestamp to query. + balance_timeline: List of (timestamp, balance_after) tuples in chronological order. + initial_balance: The starting balance before any events. + + Returns: + The outstanding balance at the given timestamp. + """ + if not balance_timeline: + return initial_balance + + # If timestamp is before first event, return initial balance + if timestamp < balance_timeline[0][0]: + return initial_balance + + # Find the last event on or before the timestamp + balance = initial_balance + for ts, balance_after in balance_timeline: + if ts <= timestamp: + balance = balance_after + else: + break + + return balance + + +def calculate_principal_payment( + *, + outstanding: int, + payment_total: int, + interest_due: int, + allow_negative: bool, + annuity: bool, + lax: bool, + period_index: int, + pr_values_scaled: tuple[int, ...] | None = None, +) -> tuple[int, int]: + """ + Resolve the principal cashflow for one amortizing period. + + Calculates the principal payment amount based on contract type, + payment structure, and period-specific parameters. + + Args: + outstanding: Current outstanding principal. + payment_total: Total payment amount for the period. + interest_due: Interest amount due for the period. + allow_negative: Whether negative amortization is allowed. + annuity: Whether this is an annuity contract. + lax: Whether this is a LAX contract with array-based amounts. + period_index: Index of the current period. + pr_values_scaled: Precomputed scaled principal values for LAX contracts. + + Returns: + Tuple of (principal_payment, payment_total) where payment_total may be + updated from array_pr_next for LAX contracts. + """ + # For LAX contracts, override payment_total with period-specific value + if lax and pr_values_scaled is not None and period_index < len(pr_values_scaled): + payment_total = pr_values_scaled[period_index] + + if annuity: + return min(max(payment_total - interest_due, 0), outstanding), payment_total + + if allow_negative: + # For NAM, allow negative principal payments (representing capitalization) + # When payment_total < interest_due, the difference is capitalized + candidate = payment_total - interest_due + # Clamp negative values to prevent exceeding outstanding balance + # and positive values to not exceed outstanding + return max(min(candidate, outstanding), -outstanding), payment_total + + return min(max(payment_total, 0), outstanding), payment_total diff --git a/src/normalization/conversions.py b/src/normalization/conversions.py new file mode 100644 index 00000000..7e8ac4a4 --- /dev/null +++ b/src/normalization/conversions.py @@ -0,0 +1,133 @@ +"""Unit conversion utilities for ACTUS to AVM normalization.""" + +from __future__ import annotations + +from decimal import Decimal + +from smart_contracts import constants as cst + +from ..errors import ActusNormalizationError + + +def to_asa_units(amount: int | float | Decimal, asa_decimals: int) -> int: + """ + Convert a decimal amount to ASA base units (uint64). + + Scales the amount by 10^asa_decimals to represent fractional values as integers. + + Example: + >>> to_asa_units(100.42, 3) # 100.42 with 3 decimals + 100420 + >>> to_asa_units(100, 2) # 100 with 2 decimals + 10000 + + Args: + amount: The numeric value to convert. + asa_decimals: Number of decimal places for the ASA. + + Returns: + The amount in ASA base units as an integer. + + Raises: + TypeError: If value is not int, float, or Decimal. + ActusNormalizationError: If result exceeds uint64 bounds. + """ + if isinstance(amount, (int, float, Decimal)): + scale = 10**asa_decimals + result = int(Decimal(str(amount)) * scale) + else: + raise TypeError(f"Unsupported value type: {type(amount)}") + + if result < 0 or result > cst.MAX_UINT64: + raise ActusNormalizationError( + f"Value {amount} results in {result} which exceeds uint64 bounds" + ) + + return result + + +def rate_to_fp(value: int | float | Decimal) -> int: + """ + Convert decimal rates to fixed-point integer representation. + + Scales decimal rates by FIXED_POINT_SCALE for AVM-compatible uint64 storage. + + Example: + >>> rate_to_fp(0.05) # 5% rate with FIXED_POINT_SCALE=1_000_000_000 + 50000000 + + Args: + value: The rate value (e.g., 0.05 for 5%). + + Returns: + Fixed-point scaled rate as uint64 integer. + + Raises: + TypeError: If value is not int, float, or Decimal. + ActusNormalizationError: If result exceeds uint64 bounds. + """ + if isinstance(value, (int, float, Decimal)): + result = int(Decimal(str(value)) * cst.FIXED_POINT_SCALE) + else: + raise TypeError(f"Unsupported value type: {type(value)}") + + if result < 0 or result > cst.MAX_UINT64: + raise ActusNormalizationError( + f"Value {value} results in {result} which exceeds uint64 bounds" + ) + + return result + + +def compute_initial_exchange_amount( + notional: int | float | Decimal, + premium_discount_at_ied: int | float | Decimal, + asa_decimals: int, +) -> int: + """ + Calculate the initial exchange amount adjusted for premium/discount. + + Returns the net notional after subtracting any premium/discount at IED + (Initial Exchange Date). + + Args: + notional: The notional principal amount. + premium_discount_at_ied: Premium/discount adjustment at IED. + Positive value = discount (reduces notional) + Negative value = premium (increases notional) + asa_decimals: Number of decimal places for the ASA. + + Returns: + Net initial exchange amount in ASA base units. + + Raises: + ActusNormalizationError: If result is negative or exceeds uint64 bounds. + """ + notional = to_asa_units(notional, asa_decimals) + + # Handle premium (negative) and discount (positive) separately + # to avoid to_asa_units rejecting negative values + if premium_discount_at_ied >= 0: + pdied = to_asa_units(premium_discount_at_ied, asa_decimals) + # Validate that discount doesn't exceed notional (would result in negative amount) + if pdied > notional: + raise ActusNormalizationError( + f"Premium/discount at IED ({premium_discount_at_ied}) exceeds notional " + f"({notional / (10 ** asa_decimals)}), which would result in a negative " + f"initial exchange amount. This is invalid for uint64 encoding." + ) + result = notional - pdied + else: + # For negative premium_discount (premium), convert absolute value and add + pdied = to_asa_units(-premium_discount_at_ied, asa_decimals) + result = notional + pdied + + # Validate uint64 bounds for AVM encoding + if result > cst.MAX_UINT64: + raise ActusNormalizationError( + f"Initial exchange amount {result} exceeds uint64 maximum ({cst.MAX_UINT64}). " + f"Notional={notional / (10 ** asa_decimals)}, " + f"premium_discount_at_ied={premium_discount_at_ied}" + ) + + return result diff --git a/src/normalization/core.py b/src/normalization/core.py new file mode 100644 index 00000000..dd6ee62f --- /dev/null +++ b/src/normalization/core.py @@ -0,0 +1,358 @@ +"""Core normalization logic for ACTUS contracts.""" + +from __future__ import annotations + +from collections.abc import Sequence +from decimal import Decimal + +from smart_contracts import constants as cst + +from ..contracts import ContractAttributes +from ..day_count import year_fraction_fixed +from ..errors import ActusNormalizationError, UnsupportedActusFeatureError +from ..models import ( + ExecutionScheduleEntry, + InitialKernelState, + NormalizationResult, + NormalizedActusTerms, + ObservedEventRequest, +) +from ..registry import ALLOWED_EVENT_TYPES, CONTRACT_TYPE_IDS +from ..unix_time import UTCTimeStamp +from .ann_builder import build_ann_schedule +from .builders import ( + build_clm_schedule, + build_ied_seed, + build_lam_schedule, + build_lax_schedule, + build_nam_schedule, + build_pam_schedule, +) +from .conversions import compute_initial_exchange_amount, rate_to_fp, to_asa_units +from .event_seeds import EventSeed, get_seed_sort_key, seed_from_preprocessed + + +def extract_base_contract_type(contract_type: str) -> str: + """ + Extract the base contract type from a potentially subtyped contract type string. + + The type:subtype notation allows contracts to specify variants (e.g., "ANN:ZCB"). + This function extracts the base type for validation and logic that should apply + to all subtypes of a given base type. + + Args: + contract_type: Contract type string, possibly with subtype (e.g., "ANN:ZCB") + + Returns: + Base contract type without subtype (e.g., "ANN" from "ANN:ZCB") + + Example: + >>> extract_base_contract_type("ANN:ZCB") + 'ANN' + >>> extract_base_contract_type("PAM") + 'PAM' + """ + return contract_type.split(":")[0] if ":" in contract_type else contract_type + + +def get_initial_next_principal_redemption( + contract: ContractAttributes, + terms: NormalizedActusTerms, + asa_decimals: int, +) -> int: + """ + Resolve the initial next principal redemption for the first IED state. + + For ANN contracts (including subtypes like "ANN:ZCB"), calculates the annuity payment amount. + For other contracts, uses the configured next_principal_redemption_amount. + + Args: + contract: ACTUS contract attributes. + terms: Normalized contract terms. + asa_decimals: Decimal places for the denomination ASA. + + Returns: + Initial principal redemption amount in ASA base units. + """ + from .annuity import resolve_annuity_payment + + base_type = extract_base_contract_type(contract.contract_type) + if base_type != "ANN": + if contract.next_principal_redemption_amount is None: + return 0 + return to_asa_units(contract.next_principal_redemption_amount, asa_decimals) + return resolve_annuity_payment(contract, terms, asa_decimals) + + +def normalize_contract_attributes( + contract: ContractAttributes, + *, + denomination_asset_id: int, + denomination_asset_decimals: int, + notional_unit_value: int | float | Decimal, + secondary_market_opening_date: UTCTimeStamp, + secondary_market_closure_date: UTCTimeStamp, + preprocessed_events: ( + Sequence[ObservedEventRequest | ExecutionScheduleEntry] | None + ) = None, +) -> NormalizationResult: + """ + Normalize ACTUS contract attributes into AVM-compatible terms, schedule, and state. + + Transforms human-readable ACTUS contract parameters into fixed-point integers, + generates the execution schedule, and initializes the contract kernel state. + + Args: + contract: ACTUS contract attributes with dates, amounts, and cycles. + denomination_asset_id: ASA ID for the denomination asset. + denomination_asset_decimals: Decimal places for the denomination ASA. + notional_unit_value: Notional value per unit in denomination ASA. + secondary_market_opening_date: Unix timestamp for secondary market opening. + secondary_market_closure_date: Unix timestamp for secondary market closure. + preprocessed_events: Optional pre-generated event schedule. + + Returns: + NormalizationResult containing normalized terms, execution schedule, and initial state. + + Raises: + ActusNormalizationError: If status_date >= initial_exchange_date or invalid config. + + Example: + >>> contract = ContractAttributes( + ... contract_type="PAM", + ... status_date=1609459200, # 2021-01-01 + ... initial_exchange_date=1612137600, # 2021-02-01 + ... maturity_date=1643673600, # 2022-02-01 + ... notional_principal=100000, + ... nominal_interest_rate=0.05, + ... ) + >>> result = normalize_contract_attributes( + ... contract, + ... denomination_asset_id=1, + ... denomination_asset_decimals=6, + ... notional_unit_value=100, + ... ) + """ + if contract.status_date >= contract.initial_exchange_date: + raise ActusNormalizationError( + "D-ASA requires status_date to be strictly before initial_exchange_date" + ) + + # Extract base contract type (e.g., "PAM" from "PAM:ZCB") + base_contract_type = extract_base_contract_type(contract.contract_type) + + pdied_asa = compute_initial_exchange_amount( + contract.notional_principal, + contract.premium_discount_at_ied, + denomination_asset_decimals, + ) + + # Normalize ACTUS contract terms to AVM + terms = NormalizedActusTerms( + # Contract + contract_id=contract.contract_id, + contract_type=CONTRACT_TYPE_IDS[base_contract_type], + # Denomination + denomination_asset_id=denomination_asset_id, + # Time + initial_exchange_date=contract.initial_exchange_date, + maturity_date=contract.maturity_date, + secondary_market_opening_date=secondary_market_opening_date, + secondary_market_closure_date=secondary_market_closure_date, + # Principal + notional_principal=to_asa_units( + contract.notional_principal, denomination_asset_decimals + ), + notional_unit_value=to_asa_units( + notional_unit_value, denomination_asset_decimals + ), + initial_exchange_amount=pdied_asa, + next_principal_redemption_amount=to_asa_units( + contract.next_principal_redemption_amount, denomination_asset_decimals + ), + # Interest + rate_reset_spread=rate_to_fp(contract.rate_reset_spread), + rate_reset_multiplier=rate_to_fp(contract.rate_reset_multiplier), + rate_reset_floor=rate_to_fp(contract.rate_reset_floor), + rate_reset_cap=rate_to_fp(contract.rate_reset_cap), + rate_reset_next=rate_to_fp( + contract.rate_reset_next + if contract.rate_reset_next is not None + else contract.nominal_interest_rate + ), + # Day Count Convention + day_count_convention=contract.day_count_convention, + # Scaling + fixed_point_scale=cst.FIXED_POINT_SCALE, + ) + + # Normalize ACTUS contract schedule to AVM + schedule = build_schedule( + contract, + terms=terms, + preprocessed_events=preprocessed_events, + contract_type=contract.contract_type, + status_date=contract.status_date, + asa_decimals=denomination_asset_decimals, + ) + + # Normalize ACTUS contract initial state to AVM + initial_state = InitialKernelState( + status_date=contract.status_date, + event_cursor=0, + outstanding_principal=0, + interest_calculation_base=0, + nominal_interest_rate=0, + accrued_interest=0, + next_principal_redemption=0, + cumulative_interest_index=0, + cumulative_principal_index=0, + ) + return NormalizationResult( + terms=terms, + schedule=schedule, + initial_state=initial_state, + ) + + +def build_schedule( + contract: ContractAttributes, + *, + terms: NormalizedActusTerms, + preprocessed_events: Sequence[ObservedEventRequest | ExecutionScheduleEntry] | None, + contract_type: str, + status_date: int, + asa_decimals: int, +) -> tuple[ExecutionScheduleEntry, ...]: + """ + Build the final execution schedule from event seeds or preprocessed events. + + Converts intermediate event seeds into fully populated ExecutionScheduleEntry + objects with computed accrual factors and proper event ordering. + + Args: + contract: Original ACTUS contract attributes. + terms: Normalized contract terms. + preprocessed_events: Optional pre-generated event schedule. + contract_type: Base contract type (e.g., "PAM", "LAM"). + status_date: Contract status date (must precede all events). + asa_decimals: Decimal places for the denomination ASA. + + Returns: + Sorted tuple of ExecutionScheduleEntry objects. + + Raises: + UnsupportedActusFeatureError: If event type not allowed for contract type. + ActusNormalizationError: If events not in chronological order. + """ + # Extract base contract type + base_contract_type = extract_base_contract_type(contract_type) + + if preprocessed_events is not None: + seeds = [ + seed_from_preprocessed(index, item) + for index, item in enumerate(preprocessed_events) + ] + else: + seeds = list( + build_schedule_seeds( + contract, + terms, + contract_type=base_contract_type, + asa_decimals=asa_decimals, + ) + ) + + if not any(seed.event_type == "IED" for seed in seeds): + seeds.append(build_ied_seed(contract, terms, asa_decimals=asa_decimals)) + + ordered = sorted(seeds, key=get_seed_sort_key) + allowed = ALLOWED_EVENT_TYPES[base_contract_type] + entries: list[ExecutionScheduleEntry] = [] + previous_ts = status_date + for event_id, seed in enumerate(ordered): + if seed.event_type not in allowed: + raise UnsupportedActusFeatureError( + f"Unsupported event {seed.event_type} for {base_contract_type}" + ) + if seed.event_type != "IED" and seed.scheduled_time < previous_ts: + raise ActusNormalizationError( + "ACTUS scheduled_time must be non-decreasing in event execution order" + ) + accrual_factor = seed.accrual_factor + if accrual_factor is None: + if seed.event_type == "IED": + accrual_factor = 0 + else: + accrual_factor = year_fraction_fixed( + previous_ts, + seed.scheduled_time, + day_count_convention=terms.day_count_convention, + maturity_date=terms.maturity_date, + ) + redemption_accrual_factor = seed.redemption_accrual_factor + if redemption_accrual_factor is None: + if seed.redemption_accrual_end > seed.redemption_accrual_start: + redemption_accrual_factor = year_fraction_fixed( + seed.redemption_accrual_start, + seed.redemption_accrual_end, + day_count_convention=terms.day_count_convention, + maturity_date=terms.maturity_date, + ) + else: + redemption_accrual_factor = 0 + entries.append( + ExecutionScheduleEntry( + event_id=event_id, + event_type=seed.event_type, + scheduled_time=seed.scheduled_time, + accrual_factor=accrual_factor, + redemption_accrual_factor=redemption_accrual_factor, + next_nominal_interest_rate=seed.next_nominal_interest_rate, + next_principal_redemption=seed.next_principal_redemption, + next_outstanding_principal=seed.next_outstanding_principal, + flags=seed.flags, + ) + ) + previous_ts = seed.scheduled_time + return tuple(entries) + + +def build_schedule_seeds( + contract: ContractAttributes, + terms: NormalizedActusTerms, + *, + contract_type: str, + asa_decimals: int, +) -> tuple[EventSeed, ...]: + """ + Dispatch contract-type-specific schedule construction. + + Routes to the appropriate schedule builder based on contract type + (PAM, LAM, NAM, ANN, LAX, or CLM). + + Args: + contract: ACTUS contract attributes. + terms: Normalized contract terms. + contract_type: Base contract type (without subtype). + asa_decimals: Decimal places for the denomination ASA. + + Returns: + Tuple of event seeds for the contract's execution schedule. + """ + # PAM and CLM don't require asa_decimals + if contract_type in ("PAM", "CLM"): + dispatch = { + "PAM": build_pam_schedule, + "CLM": build_clm_schedule, + } + return dispatch[contract_type](contract, terms) + + # Other contract types require asa_decimals + dispatch = { + "LAM": build_lam_schedule, + "NAM": build_nam_schedule, + "ANN": build_ann_schedule, + "LAX": build_lax_schedule, + } + return dispatch[contract_type](contract, terms, asa_decimals) diff --git a/src/normalization/event_seeds.py b/src/normalization/event_seeds.py new file mode 100644 index 00000000..6725f855 --- /dev/null +++ b/src/normalization/event_seeds.py @@ -0,0 +1,139 @@ +"""Event seed management for ACTUS contract normalization.""" + +from __future__ import annotations + +from collections.abc import Sequence +from dataclasses import dataclass +from decimal import Decimal + +from ..models import ExecutionScheduleEntry, ObservedEventRequest +from ..registry import EVENT_SCHEDULE_PRIORITY +from ..unix_time import UTCTimeStamp + + +@dataclass(frozen=True, slots=True) +class EventSeed: + """ + Intermediate normalized event before final schedule encoding. + + Represents a scheduled event during the normalization process, containing + all necessary information to generate the final ExecutionScheduleEntry. + + Attributes: + event_type: ACTUS event type (e.g., "IED", "IP", "PR", "MD"). + scheduled_time: Unix timestamp when event occurs. + accrual_factor: Optional year fraction for interest accrual. + redemption_accrual_factor: Optional year fraction for redemption accrual. + redemption_accrual_start: Start timestamp for redemption accrual period. + redemption_accrual_end: End timestamp for redemption accrual period. + next_nominal_interest_rate: Interest rate after this event. + next_principal_redemption: Principal redemption amount. + next_outstanding_principal: Outstanding principal after this event. + flags: Event flags (cash/non-cash, etc.). + """ + + event_type: str + scheduled_time: UTCTimeStamp + accrual_factor: int | float | Decimal | None = None + redemption_accrual_factor: int | float | Decimal | None = None + redemption_accrual_start: int = 0 + redemption_accrual_end: int = 0 + next_nominal_interest_rate: int | float | Decimal = 0 + next_principal_redemption: int = 0 + next_outstanding_principal: int = 0 + flags: int = 0 + + +def create_seed( + timestamp: UTCTimeStamp, + *, + event_type: str, + redemption_accrual_start: UTCTimeStamp = 0, + redemption_accrual_end: UTCTimeStamp = 0, + next_nominal_interest_rate: int = 0, + next_principal_redemption: int = 0, + next_outstanding_principal: int = 0, + flags: int = 0, +) -> EventSeed: + """ + Create an intermediate event seed from a resolved schedule timestamp. + + Factory function for creating EventSeed instances with default values + for optional fields. + + Args: + timestamp: Unix timestamp when event occurs. + event_type: ACTUS event type (e.g., "IED", "IP", "PR"). + redemption_accrual_start: Start of redemption accrual period. + redemption_accrual_end: End of redemption accrual period. + next_nominal_interest_rate: Interest rate after this event. + next_principal_redemption: Principal redemption amount. + next_outstanding_principal: Outstanding principal after event. + flags: Event flags (cash/non-cash, etc.). + + Returns: + Event seed with specified parameters. + """ + return EventSeed( + event_type=event_type, + scheduled_time=timestamp, + redemption_accrual_start=redemption_accrual_start, + redemption_accrual_end=redemption_accrual_end, + next_nominal_interest_rate=next_nominal_interest_rate, + next_principal_redemption=next_principal_redemption, + next_outstanding_principal=next_outstanding_principal, + flags=flags, + ) + + +def seed_from_preprocessed( + event_id: int, item: ObservedEventRequest | ExecutionScheduleEntry +) -> EventSeed: + """ + Convert a preprocessed event payload into an intermediate event seed. + + Handles both ObservedEventRequest and ExecutionScheduleEntry types, + converting them to the internal EventSeed representation. + + Args: + event_id: Unique identifier for the event. + item: Preprocessed event or schedule entry. + + Returns: + Event seed representation of the preprocessed event. + """ + if isinstance(item, ExecutionScheduleEntry): + return EventSeed( + event_type=item.event_type, + scheduled_time=item.scheduled_time, + accrual_factor=item.accrual_factor, + redemption_accrual_factor=item.redemption_accrual_factor, + next_nominal_interest_rate=item.next_nominal_interest_rate, + next_principal_redemption=item.next_principal_redemption, + next_outstanding_principal=item.next_outstanding_principal, + flags=item.flags, + ) + entry = item.to_schedule_entry(event_id) + return seed_from_preprocessed(event_id, entry) + + +def get_seed_sort_key(seed: EventSeed) -> tuple[int, int, str]: + """ + Return the deterministic ACTUS event ordering key for a seed. + + Events are ordered by: (1) scheduled time, (2) priority, (3) event type. + Ensures deterministic ordering when multiple events occur at the same time. + + Args: + seed: Event seed to generate sort key for. + + Returns: + Tuple of (scheduled_time, priority, event_type) for sorting. + """ + priority = EVENT_SCHEDULE_PRIORITY.get(seed.event_type, 99) + return seed.scheduled_time, priority, seed.event_type + + +def deduplicate_timestamps(ts: Sequence[UTCTimeStamp]) -> tuple[UTCTimeStamp, ...]: + """Remove duplicate timestamps while preserving sorted schedule order.""" + return tuple(dict.fromkeys(sorted(ts))) diff --git a/src/normalization/schedules.py b/src/normalization/schedules.py new file mode 100644 index 00000000..e76fd717 --- /dev/null +++ b/src/normalization/schedules.py @@ -0,0 +1,258 @@ +"""Schedule resolution utilities for ACTUS contracts.""" + +from __future__ import annotations + +from ..contracts import ContractAttributes +from ..errors import ActusNormalizationError +from ..models import NormalizedActusTerms +from ..schedule import Cycle, resolve_array_schedule, resolve_cycle_schedule +from ..unix_time import UTCTimeStamp +from .event_seeds import deduplicate_timestamps + + +def resolve_principal_schedule( + contract: ContractAttributes, + terms: NormalizedActusTerms, + *, + lax: bool, + end_date: int | None = None, +) -> tuple[int, ...]: + """ + Resolve the principal redemption occurrence schedule. + + Generates timestamps for principal redemption events based on either + array-based schedules (LAX) or cycle-based schedules (standard contracts). + + Args: + contract: ACTUS contract attributes. + terms: Normalized contract terms. + lax: Whether to use LAX array-based schedule logic. + end_date: Explicit end date for the schedule. If not provided, falls back to terms.maturity_date. + + Returns: + Tuple of Unix timestamps for principal redemption events. + + Raises: + ActusNormalizationError: If LAX arrays have misaligned lengths. + """ + if lax and contract.array_pr_anchor is not None: + anchors = tuple(ts for ts in contract.array_pr_anchor) + cycles = tuple(contract.array_pr_cycle or ()) + increases = tuple(value for value in contract.array_increase_decrease or ()) + pr_next = tuple(contract.array_pr_next or ()) + + anchor_len = len(anchors) + + # Validate all LAX arrays have aligned lengths + if cycles and len(cycles) != anchor_len: + raise ActusNormalizationError( + f"LAX array_pr_cycle length ({len(cycles)}) must match " + f"array_pr_anchor length ({anchor_len})" + ) + if increases and len(increases) != anchor_len: + raise ActusNormalizationError( + f"LAX array_increase_decrease length ({len(increases)}) must match " + f"array_pr_anchor length ({anchor_len})" + ) + if pr_next and len(pr_next) != anchor_len: + raise ActusNormalizationError( + f"LAX array_pr_next length ({len(pr_next)}) must match " + f"array_pr_anchor length ({anchor_len})" + ) + + # Use provided end_date or fall back to terms.maturity_date + effective_end = end_date if end_date is not None else terms.maturity_date + + if cycles: + timestamps = resolve_array_schedule( + anchors, + cycles, + effective_end, + end_of_month_convention=contract.end_of_month_convention, + business_day_convention=contract.business_day_convention, + calendar=contract.calendar, + ) + else: + timestamps = tuple(anchor for anchor in anchors) + return tuple( + ts + for ts in deduplicate_timestamps(timestamps) + if terms.initial_exchange_date < ts <= effective_end + ) + + anchor = contract.principal_redemption_anchor + cycle = contract.principal_redemption_cycle + + # Use provided end_date or fall back to terms.maturity_date + effective_end = end_date if end_date is not None else terms.maturity_date + + if anchor is None or cycle is None or effective_end is None: + return () + + # Parse cycle to access stub attribute + parsed_cycle = Cycle.parse_cycle(cycle) + + timestamps = resolve_cycle_schedule( + anchor, + cycle, + effective_end, + end_of_month_convention=contract.end_of_month_convention, + business_day_convention=contract.business_day_convention, + calendar=contract.calendar, + ) + if parsed_cycle.stub == "+" and timestamps: + if timestamps[-1] != effective_end: + timestamps = timestamps[:-1] + return tuple( + ts for ts in timestamps if terms.initial_exchange_date <= ts < effective_end + ) + + +def resolve_interest_schedule( + contract: ContractAttributes, + terms: NormalizedActusTerms, +) -> tuple[UTCTimeStamp, ...]: + """ + Resolve the interest payment occurrence schedule. + + Generates timestamps for interest payment (IP) events based on the + interest payment cycle. Ensures maturity date is included and all + events fall within the contract's active period (after IED, up to MD). + + The function handles cycle suffixes: + - If cycle ends with "+", the last event is adjusted to maturity_date + - Otherwise, maturity_date is appended to the schedule + + Args: + contract: ACTUS contract attributes with interest payment parameters. + terms: Normalized contract terms with IED and maturity date. + + Returns: + Tuple of Unix timestamps for interest payment events, deduplicated + and filtered to (IED, maturity_date]. Returns empty tuple if + interest_payment_anchor, interest_payment_cycle, or maturity_date + are not specified. + + Example: + >>> # Monthly interest payments from Feb to Dec 2021 + >>> contract = ContractAttributes( + ... interest_payment_anchor=1612137600, # 2021-02-01 + ... interest_payment_cycle=Cycle(count=1, unit="M"), + ... ... + ... ) + >>> terms = NormalizedActusTerms( + ... initial_exchange_date=1609459200, # 2021-01-01 + ... maturity_date=1640995200, # 2022-01-01 + ... ... + ... ) + >>> schedule = resolve_interest_schedule(contract, terms) + # Returns timestamps: [Feb 1, Mar 1, ..., Dec 1, Jan 1 2022] + """ + anchor = contract.interest_payment_anchor + cycle = contract.interest_payment_cycle + if anchor is None or cycle is None or terms.maturity_date is None: + return () + + # Parse cycle to access stub attribute + parsed_cycle = Cycle.parse_cycle(cycle) + + timestamps = list( + resolve_cycle_schedule( + anchor, + cycle, + terms.maturity_date, + end_of_month_convention=contract.end_of_month_convention, + business_day_convention=contract.business_day_convention, + calendar=contract.calendar, + ) + ) + timestamps = [ + ts + for ts in timestamps + if terms.initial_exchange_date < ts <= terms.maturity_date + ] + if timestamps: + md_present = terms.maturity_date in timestamps + if not md_present: + maturity_date = terms.maturity_date + if parsed_cycle.stub == "+": + timestamps[-1] = maturity_date + else: + timestamps.append(maturity_date) + return tuple(deduplicate_timestamps(timestamps)) + + +def resolve_rate_reset_occurrences( + contract: ContractAttributes, + maturity_date: int | None, +) -> tuple[tuple[int, str], ...]: + """ + Resolve rate reset occurrences and label them as RR or RRF. + + Generates tuples of (timestamp, event_type) for rate reset events, + distinguishing between simple resets (RR) and fixed resets (RRF). + + Args: + contract: ACTUS contract attributes. + maturity_date: Contract maturity date. + + Returns: + Tuple of (timestamp, event_type) pairs for rate reset events. + """ + anchor = contract.rate_reset_anchor + cycle = contract.rate_reset_cycle + if anchor is None or cycle is None or maturity_date is None: + return () + + timestamps = tuple( + ts + for ts in resolve_cycle_schedule( + anchor, + cycle, + maturity_date, + end_of_month_convention=contract.end_of_month_convention, + business_day_convention=contract.business_day_convention, + calendar=contract.calendar, + ) + if ts < maturity_date + ) + if not timestamps: + return () + + first_is_rrf = contract.rate_reset_next is not None + return tuple( + (ts, "RRF" if first_is_rrf and index == 0 else "RR") + for index, ts in enumerate(timestamps) + ) + + +def resolve_ipcb_schedule( + contract: ContractAttributes, + maturity_date: int | None, +) -> tuple[int, ...]: + """ + Resolve IPCB (Interest Payment Calculation Base) occurrence schedule. + + Args: + contract: ACTUS contract attributes. + maturity_date: Contract maturity date. + + Returns: + Tuple of timestamps for IPCB events. + """ + anchor = contract.interest_calculation_base_anchor + cycle = contract.interest_calculation_base_cycle + if anchor is None or cycle is None or maturity_date is None: + return () + return tuple( + ts + for ts in resolve_cycle_schedule( + anchor, + cycle, + maturity_date, + end_of_month_convention=contract.end_of_month_convention, + business_day_convention=contract.business_day_convention, + calendar=contract.calendar, + ) + if ts <= maturity_date + ) From dbd769d97ef6f01800197ec9a98698f2b43a1986 Mon Sep 17 00:00:00 2001 From: cusma Date: Wed, 11 Mar 2026 19:52:48 +0100 Subject: [PATCH 064/244] chore: package exports --- src/normalization/__init__.py | 21 --------- tests/sdk/test_normalization.py | 80 ++++++++++++++++----------------- 2 files changed, 40 insertions(+), 61 deletions(-) diff --git a/src/normalization/__init__.py b/src/normalization/__init__.py index 590ecf5c..76668580 100644 --- a/src/normalization/__init__.py +++ b/src/normalization/__init__.py @@ -17,29 +17,8 @@ - Helper utilities for testing and advanced use cases """ -from .conversions import ( - compute_initial_exchange_amount as _compute_initial_exchange_amount, -) -from .conversions import ( - rate_to_fp as _rate_to_fp, -) -from .conversions import ( - to_asa_units as _to_asa_units, -) from .core import normalize_contract_attributes -from .event_seeds import ( - EventSeed as _EventSeed, -) -from .event_seeds import ( - deduplicate_timestamps as _deduplicate_timestamps, -) __all__ = [ - # Expose private utilities for backward compatibility with tests - "_EventSeed", - "_compute_initial_exchange_amount", - "_deduplicate_timestamps", - "_rate_to_fp", - "_to_asa_units", "normalize_contract_attributes", ] diff --git a/tests/sdk/test_normalization.py b/tests/sdk/test_normalization.py index e041cad5..8f48eeb0 100644 --- a/tests/sdk/test_normalization.py +++ b/tests/sdk/test_normalization.py @@ -19,115 +19,115 @@ ) from src.errors import ActusNormalizationError from src.models import ExecutionScheduleEntry, NormalizedActusTerms -from src.normalization import ( - _compute_initial_exchange_amount, - _deduplicate_timestamps, - _rate_to_fp, - _to_asa_units, - normalize_contract_attributes, +from src.normalization import normalize_contract_attributes +from src.normalization.conversions import ( + compute_initial_exchange_amount, + rate_to_fp, + to_asa_units, ) +from src.normalization.event_seeds import deduplicate_timestamps from src.schedule import Cycle class TestToAsaUnits: - """Test the _to_asa_units helper function.""" + """Test the to_asa_units helper function.""" def test_integer_conversion(self): """Test converting integer amounts to ASA units.""" - assert _to_asa_units(100, 2) == 10000 - assert _to_asa_units(1000, 0) == 1000 - assert _to_asa_units(50, 3) == 50000 + assert to_asa_units(100, 2) == 10000 + assert to_asa_units(1000, 0) == 1000 + assert to_asa_units(50, 3) == 50000 def test_float_conversion(self): """Test converting float amounts to ASA units.""" - result = _to_asa_units(100.5, 2) + result = to_asa_units(100.5, 2) assert result == 10050 assert isinstance(result, int) def test_decimal_conversion(self): """Test converting Decimal amounts to ASA units.""" - result = _to_asa_units(Decimal("100.42"), 3) + result = to_asa_units(Decimal("100.42"), 3) assert result == 100420 assert isinstance(result, int) def test_zero_decimals(self): """Test conversion with zero decimal places.""" - assert _to_asa_units(100, 0) == 100 + assert to_asa_units(100, 0) == 100 def test_high_decimal_places(self): """Test conversion with high decimal places.""" - result = _to_asa_units(1, 10) + result = to_asa_units(1, 10) assert result == 10_000_000_000 assert isinstance(result, int) def test_unsupported_type_raises_error(self): """Test that unsupported types raise TypeError.""" with pytest.raises(TypeError, match="Unsupported value type"): - _to_asa_units("100", 2) + to_asa_units("100", 2) with pytest.raises(TypeError, match="Unsupported value type"): - _to_asa_units(None, 2) + to_asa_units(None, 2) def test_exceeds_uint64_raises_error(self): """Test that values exceeding uint64 max raise error.""" # A large amount that when multiplied by scale exceeds uint64 max with pytest.raises(ActusNormalizationError, match="exceeds uint64 bounds"): - _to_asa_units(cst.MAX_UINT64 * 2, 2) + to_asa_units(cst.MAX_UINT64 * 2, 2) class TestRateToFp: - """Test the _rate_to_fp helper function.""" + """Test the rate_to_fp helper function.""" def test_integer_rate_conversion(self): """Test converting integer rates to fixed point.""" - result = _rate_to_fp(1) + result = rate_to_fp(1) assert result == cst.FIXED_POINT_SCALE assert isinstance(result, int) def test_float_rate_conversion(self): """Test converting float rates to fixed point.""" - result = _rate_to_fp(0.05) + result = rate_to_fp(0.05) expected = int(Decimal("0.05") * cst.FIXED_POINT_SCALE) assert result == expected def test_decimal_rate_conversion(self): """Test converting Decimal rates to fixed point.""" - result = _rate_to_fp(Decimal("0.0375")) + result = rate_to_fp(Decimal("0.0375")) expected = int(Decimal("0.0375") * cst.FIXED_POINT_SCALE) assert result == expected def test_zero_rate(self): """Test converting zero rate.""" - assert _rate_to_fp(0) == 0 + assert rate_to_fp(0) == 0 def test_high_precision_rate(self): """Test converting high precision rate.""" rate = Decimal("0.123456789") - result = _rate_to_fp(rate) + result = rate_to_fp(rate) assert isinstance(result, int) assert result > 0 def test_negative_rate_raises_error(self): """Test that negative rates raise error.""" with pytest.raises(ActusNormalizationError, match="exceeds uint64 bounds"): - _rate_to_fp(-0.01) + rate_to_fp(-0.01) def test_exceeds_uint64_raises_error(self): """Test that very large rates raise error.""" with pytest.raises(ActusNormalizationError, match="exceeds uint64 bounds"): - _rate_to_fp(cst.MAX_UINT64) + rate_to_fp(cst.MAX_UINT64) def test_unsupported_type_raises_error(self): """Test that unsupported types raise TypeError.""" with pytest.raises(TypeError, match="Unsupported value type"): - _rate_to_fp("0.05") + rate_to_fp("0.05") class TestComputeInitialExchangeAmount: - """Test the _compute_initial_exchange_amount helper function.""" + """Test the compute_initial_exchange_amount helper function.""" def test_at_par_issuance(self): """Test initial exchange with no premium/discount.""" - result = _compute_initial_exchange_amount( + result = compute_initial_exchange_amount( notional=1000000, premium_discount_at_ied=0, asa_decimals=2, @@ -138,7 +138,7 @@ def test_at_par_issuance(self): def test_with_discount(self): """Test initial exchange with discount.""" - result = _compute_initial_exchange_amount( + result = compute_initial_exchange_amount( notional=1000000, premium_discount_at_ied=50000, asa_decimals=2, @@ -150,7 +150,7 @@ def test_with_discount(self): def test_with_premium(self): """Test initial exchange with premium (negative discount).""" - result = _compute_initial_exchange_amount( + result = compute_initial_exchange_amount( notional=1000000, premium_discount_at_ied=-50000, asa_decimals=2, @@ -166,7 +166,7 @@ def test_discount_exceeds_notional_raises_error(self): # discount=2000000 with 2 decimals = 200000000 # result = 100000000 - 200000000 = -100000000 (negative) with pytest.raises(ActusNormalizationError, match="exceeds notional"): - _compute_initial_exchange_amount( + compute_initial_exchange_amount( notional=1000000, premium_discount_at_ied=2000000, asa_decimals=2, @@ -179,7 +179,7 @@ def test_premium_causes_uint64_overflow_raises_error(self): notional_large = int(cst.MAX_UINT64 * 0.6) premium_large = int(cst.MAX_UINT64 * 0.5) with pytest.raises(ActusNormalizationError, match="exceeds uint64 maximum"): - _compute_initial_exchange_amount( + compute_initial_exchange_amount( notional=notional_large, premium_discount_at_ied=-premium_large, asa_decimals=0, @@ -187,35 +187,35 @@ def test_premium_causes_uint64_overflow_raises_error(self): class TestDeduplicateTimestamps: - """Test the _deduplicate_timestamps helper function.""" + """Test the deduplicate_timestamps helper function.""" def test_empty_sequence(self): """Test deduplication of empty sequence.""" - result = _deduplicate_timestamps([]) + result = deduplicate_timestamps([]) assert result == () def test_no_duplicates(self): """Test sequence with no duplicates.""" timestamps = [1000000, 1100000, 1200000] - result = _deduplicate_timestamps(timestamps) + result = deduplicate_timestamps(timestamps) assert result == (1000000, 1100000, 1200000) def test_with_duplicates(self): """Test deduplication removes duplicates.""" timestamps = [1000000, 1100000, 1100000, 1200000, 1000000] - result = _deduplicate_timestamps(timestamps) + result = deduplicate_timestamps(timestamps) assert result == (1000000, 1100000, 1200000) def test_preserves_sorted_order(self): """Test that result is sorted.""" timestamps = [1200000, 1000000, 1100000] - result = _deduplicate_timestamps(timestamps) + result = deduplicate_timestamps(timestamps) assert result == (1000000, 1100000, 1200000) def test_all_same_timestamps(self): """Test with all identical timestamps.""" timestamps = [1000000, 1000000, 1000000] - result = _deduplicate_timestamps(timestamps) + result = deduplicate_timestamps(timestamps) assert result == (1000000,) @@ -874,7 +874,7 @@ def test_lax_array_pr_next_values_propagate_to_events(self): expected_event_types = ["PI", "PI", "PR", "PR", "PI", "PR"] for i in range(6): - expected_amount = _to_asa_units(contract.array_pr_next[i], 6) + expected_amount = to_asa_units(contract.array_pr_next[i], 6) assert pr_pi_events[i].event_type == expected_event_types[i], ( f"Period {i}: Expected event_type={expected_event_types[i]}, " f"got {pr_pi_events[i].event_type}" @@ -993,7 +993,7 @@ def test_lax_without_array_pr_next_uses_base_amount(self): pr_events = [ev for ev in result.schedule if ev.event_type == "PR"] # All events should use the base amount - base_amount = _to_asa_units(Decimal("5000.0"), 6) + base_amount = to_asa_units(Decimal("5000.0"), 6) for i, ev in enumerate(pr_events): assert ev.next_principal_redemption == base_amount, ( f"Period {i}: Expected next_principal_redemption={base_amount}, " From 483f6730e3b3aa436b68d8faba463415da1ce994 Mon Sep 17 00:00:00 2001 From: Cosimo Bassi <65770425+cusma@users.noreply.github.com> Date: Wed, 11 Mar 2026 19:57:39 +0100 Subject: [PATCH 065/244] chore: validation Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/normalization/builders.py | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/src/normalization/builders.py b/src/normalization/builders.py index b12e139d..ec1f9ddd 100644 --- a/src/normalization/builders.py +++ b/src/normalization/builders.py @@ -397,11 +397,31 @@ def build_amortizing_schedule( f"Outstanding: {outstanding}, principal_payment: {principal_payment}" ) else: - # LAM/LAX: always decrease or maintain outstanding - next_outstanding = max(outstanding - principal_payment, 0) + # LAM/LAX: normally decrease or maintain outstanding. However, for LAX with + # allow_negative=True, a negative principal_payment implies capitalization + # (outstanding - principal_payment becomes an addition), which may overflow. + if lax and allow_negative and principal_payment < 0: + candidate_outstanding = outstanding - principal_payment + if candidate_outstanding > cst.MAX_UINT64: + raise ActusNormalizationError( + f"LAX capitalization at period {index} would result in outstanding principal " + f"{candidate_outstanding} which exceeds uint64 bounds (0 to {cst.MAX_UINT64}). " + f"Outstanding: {outstanding}, principal_payment: {principal_payment}" + ) + next_outstanding = max(candidate_outstanding, 0) + else: + next_outstanding = max(outstanding - principal_payment, 0) if lax_direction == "INC": - next_outstanding = outstanding + payment_total + # LAX INC periods: explicitly increase outstanding by payment_total. + candidate_outstanding = outstanding + payment_total + if candidate_outstanding > cst.MAX_UINT64: + raise ActusNormalizationError( + f"LAX INC at period {index} would result in outstanding principal " + f"{candidate_outstanding} which exceeds uint64 bounds (0 to {cst.MAX_UINT64}). " + f"Outstanding: {outstanding}, payment_total: {payment_total}" + ) + next_outstanding = candidate_outstanding # Record balance change balance_timeline.append((ts, next_outstanding)) From 1ea1573473e466fd65a55d9d9fef264982cffa34 Mon Sep 17 00:00:00 2001 From: cusma Date: Wed, 11 Mar 2026 19:59:35 +0100 Subject: [PATCH 066/244] chore: optimization --- src/normalization/builders.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/normalization/builders.py b/src/normalization/builders.py index ec1f9ddd..5a64a3ef 100644 --- a/src/normalization/builders.py +++ b/src/normalization/builders.py @@ -507,8 +507,9 @@ def build_amortizing_schedule( previous_due = due_time # Add remaining rate reset events that don't coincide with PR dates + pr_timestamps = set(pr_schedule) for ts, event_type in rr_schedule: - if any(ts == pr_ts for pr_ts in pr_schedule): + if ts in pr_timestamps: continue if ts >= terms.maturity_date: continue From 43288549659dc2cf5412fe9615b82060d47ec46c Mon Sep 17 00:00:00 2001 From: cusma Date: Wed, 11 Mar 2026 20:59:23 +0100 Subject: [PATCH 067/244] fix: various --- src/normalization/ann_builder.py | 13 +++++--- src/normalization/builders.py | 54 ++++++++++++++++++++------------ src/normalization/schedules.py | 26 +++++++++------ 3 files changed, 58 insertions(+), 35 deletions(-) diff --git a/src/normalization/ann_builder.py b/src/normalization/ann_builder.py index e8c8a943..fee176ed 100644 --- a/src/normalization/ann_builder.py +++ b/src/normalization/ann_builder.py @@ -17,13 +17,14 @@ def build_ipcb_seeds( contract: ContractAttributes, - outstanding: int, - maturity_date: int | None, + terms: NormalizedActusTerms, + balance_timeline: list[tuple[int, int]], + initial_principal: int, ) -> tuple[EventSeed, ...]: """Helper to import from builders to avoid circular dependency.""" from .builders import build_ipcb_seeds as _build_ipcb_seeds - return _build_ipcb_seeds(contract, outstanding, maturity_date) + return _build_ipcb_seeds(contract, terms, balance_timeline, initial_principal) def build_ann_schedule( @@ -81,7 +82,7 @@ def build_ann_schedule( payment_total = resolve_annuity_payment(contract, terms, asa_decimals) seeds: list[EventSeed] = [] - rr_schedule = resolve_rate_reset_occurrences(contract, end_date) + rr_schedule = resolve_rate_reset_occurrences(contract, terms) next_rate = rate_to_fp( contract.rate_reset_next if contract.rate_reset_next is not None @@ -200,7 +201,9 @@ def build_ann_schedule( ) ) - seeds.extend(build_ipcb_seeds(contract, outstanding, end_date)) + seeds.extend( + build_ipcb_seeds(contract, terms, balance_timeline, terms.notional_principal) + ) md_redemption_start = 0 md_redemption_end = 0 if not any(ts == end_date for ts in pr_schedule): diff --git a/src/normalization/builders.py b/src/normalization/builders.py index 5a64a3ef..e738fadb 100644 --- a/src/normalization/builders.py +++ b/src/normalization/builders.py @@ -59,7 +59,7 @@ def build_ied_seed( def build_rate_reset_seeds( contract: ContractAttributes, outstanding: int, - maturity_date: int | None, + terms: NormalizedActusTerms, next_rate_fp: int, ) -> tuple[EventSeed, ...]: """ @@ -71,14 +71,12 @@ def build_rate_reset_seeds( Args: contract: ACTUS contract attributes. outstanding: Current outstanding principal. - maturity_date: Contract maturity date. + terms: Normalized contract terms. next_rate_fp: Next rate in fixed-point representation. Returns: Tuple of rate reset event seeds. """ - if maturity_date is None: - return () return tuple( create_seed( ts, @@ -87,25 +85,28 @@ def build_rate_reset_seeds( next_outstanding_principal=outstanding, flags=enums.FLAG_NON_CASH_EVENT, ) - for ts, event_type in resolve_rate_reset_occurrences(contract, maturity_date) + for ts, event_type in resolve_rate_reset_occurrences(contract, terms) ) def build_ipcb_seeds( contract: ContractAttributes, - outstanding: int, - maturity_date: int | None, + terms: NormalizedActusTerms, + balance_timeline: list[tuple[int, int]], + initial_principal: int, ) -> tuple[EventSeed, ...]: """ Build IPCB event seeds for interest calculation base adjustments. IPCB (Interest Payment Calculation Base) events adjust the base amount - used for interest calculations without generating cash flows. + used for interest calculations without generating cash flows. Each IPCB + event uses the interpolated balance at its scheduled timestamp. Args: contract: ACTUS contract attributes. - outstanding: Current outstanding principal. - maturity_date: Contract maturity date. + terms: Normalized contract terms. + balance_timeline: List of (timestamp, balance) tuples tracking principal changes. + initial_principal: Initial principal amount before any events. Returns: Tuple of IPCB event seeds. @@ -114,10 +115,12 @@ def build_ipcb_seeds( create_seed( ts, event_type="IPCB", - next_outstanding_principal=outstanding, + next_outstanding_principal=interpolate_balance_at_timestamp( + ts, balance_timeline, initial_principal + ), flags=enums.FLAG_NON_CASH_EVENT, ) - for ts in resolve_ipcb_schedule(contract, maturity_date) + for ts in resolve_ipcb_schedule(contract, terms) ) @@ -158,9 +161,7 @@ def build_pam_schedule( if contract.rate_reset_next is not None else contract.nominal_interest_rate ) - seeds.extend( - build_rate_reset_seeds(contract, outstanding, terms.maturity_date, next_rate) - ) + seeds.extend(build_rate_reset_seeds(contract, outstanding, terms, next_rate)) seeds.append( create_seed( @@ -213,9 +214,7 @@ def build_clm_schedule( if contract.rate_reset_next is not None else contract.nominal_interest_rate ) - seeds.extend( - build_rate_reset_seeds(contract, outstanding, terms.maturity_date, next_rate) - ) + seeds.extend(build_rate_reset_seeds(contract, outstanding, terms, next_rate)) return tuple(seeds) @@ -348,9 +347,16 @@ def build_amortizing_schedule( pr_values_scaled = tuple( to_asa_units(value, asa_decimals) for value in contract.array_pr_next ) + # Validate that all scaled values are within uint64 bounds + for idx, scaled_value in enumerate(pr_values_scaled): + if scaled_value < 0 or scaled_value > cst.MAX_UINT64: + raise ActusNormalizationError( + f"LAX array_pr_next[{idx}] scaled value {scaled_value} exceeds uint64 bounds " + f"(0 to {cst.MAX_UINT64})" + ) # Build rate reset schedule as dict for efficient lookup - rr_schedule = resolve_rate_reset_occurrences(contract, terms.maturity_date) + rr_schedule = resolve_rate_reset_occurrences(contract, terms) rr_events = dict(rr_schedule) next_rate = rate_to_fp( contract.rate_reset_next @@ -414,6 +420,12 @@ def build_amortizing_schedule( if lax_direction == "INC": # LAX INC periods: explicitly increase outstanding by payment_total. + # Validate payment_total is within bounds before addition + if payment_total < 0 or payment_total > cst.MAX_UINT64: + raise ActusNormalizationError( + f"LAX INC at period {index} has invalid payment_total {payment_total} " + f"which exceeds uint64 bounds (0 to {cst.MAX_UINT64})" + ) candidate_outstanding = outstanding + payment_total if candidate_outstanding > cst.MAX_UINT64: raise ActusNormalizationError( @@ -527,7 +539,9 @@ def build_amortizing_schedule( ) ) - seeds.extend(build_ipcb_seeds(contract, outstanding, terms.maturity_date)) + seeds.extend( + build_ipcb_seeds(contract, terms, balance_timeline, terms.notional_principal) + ) if outstanding: seeds.append( create_seed( diff --git a/src/normalization/schedules.py b/src/normalization/schedules.py index e76fd717..05620f51 100644 --- a/src/normalization/schedules.py +++ b/src/normalization/schedules.py @@ -184,7 +184,7 @@ def resolve_interest_schedule( def resolve_rate_reset_occurrences( contract: ContractAttributes, - maturity_date: int | None, + terms: NormalizedActusTerms, ) -> tuple[tuple[int, str], ...]: """ Resolve rate reset occurrences and label them as RR or RRF. @@ -192,16 +192,19 @@ def resolve_rate_reset_occurrences( Generates tuples of (timestamp, event_type) for rate reset events, distinguishing between simple resets (RR) and fixed resets (RRF). + Events are filtered to occur after initial_exchange_date and before + maturity_date to ensure proper lifecycle ordering. + Args: contract: ACTUS contract attributes. - maturity_date: Contract maturity date. + terms: Normalized contract terms with IED and maturity date. Returns: Tuple of (timestamp, event_type) pairs for rate reset events. """ anchor = contract.rate_reset_anchor cycle = contract.rate_reset_cycle - if anchor is None or cycle is None or maturity_date is None: + if anchor is None or cycle is None or terms.maturity_date is None: return () timestamps = tuple( @@ -209,12 +212,12 @@ def resolve_rate_reset_occurrences( for ts in resolve_cycle_schedule( anchor, cycle, - maturity_date, + terms.maturity_date, end_of_month_convention=contract.end_of_month_convention, business_day_convention=contract.business_day_convention, calendar=contract.calendar, ) - if ts < maturity_date + if terms.initial_exchange_date < ts < terms.maturity_date ) if not timestamps: return () @@ -228,31 +231,34 @@ def resolve_rate_reset_occurrences( def resolve_ipcb_schedule( contract: ContractAttributes, - maturity_date: int | None, + terms: NormalizedActusTerms, ) -> tuple[int, ...]: """ Resolve IPCB (Interest Payment Calculation Base) occurrence schedule. + Events are filtered to occur after initial_exchange_date and up to + maturity_date to ensure proper lifecycle ordering. + Args: contract: ACTUS contract attributes. - maturity_date: Contract maturity date. + terms: Normalized contract terms with IED and maturity date. Returns: Tuple of timestamps for IPCB events. """ anchor = contract.interest_calculation_base_anchor cycle = contract.interest_calculation_base_cycle - if anchor is None or cycle is None or maturity_date is None: + if anchor is None or cycle is None or terms.maturity_date is None: return () return tuple( ts for ts in resolve_cycle_schedule( anchor, cycle, - maturity_date, + terms.maturity_date, end_of_month_convention=contract.end_of_month_convention, business_day_convention=contract.business_day_convention, calendar=contract.calendar, ) - if ts <= maturity_date + if terms.initial_exchange_date < ts <= terms.maturity_date ) From 3f461083066413e90370adce83c1de6000b49ade Mon Sep 17 00:00:00 2001 From: cusma Date: Wed, 11 Mar 2026 20:59:30 +0100 Subject: [PATCH 068/244] test: update --- tests/sdk/test_normalization.py | 91 +++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) diff --git a/tests/sdk/test_normalization.py b/tests/sdk/test_normalization.py index 8f48eeb0..57c90454 100644 --- a/tests/sdk/test_normalization.py +++ b/tests/sdk/test_normalization.py @@ -1579,6 +1579,97 @@ def test_nam_capitalization_uint64_overflow_detection(): ) +def test_lax_inc_uint64_overflow_detection(): + """Test that LAX INC detects and rejects uint64 overflow when array_pr_next values are too large.""" + # Create a LAX contract with a large notional and an even larger array_pr_next value + # that would cause overflow when added to outstanding principal + + # Start with a large but valid notional + large_notional = int(cst.MAX_UINT64 * 0.6) # 60% of MAX_UINT64 + + # Create an array_pr_next value that when added to large_notional will exceed MAX_UINT64 + overflow_payment = int(cst.MAX_UINT64 * 0.5) # This + large_notional > MAX_UINT64 + + contract = ContractAttributes( + contract_id=1, + contract_type="LAX", + status_date=1000000, + initial_exchange_date=1100000, + maturity_date=1100000 + 365 * 24 * 60 * 60, # 1 year + notional_principal=large_notional, + premium_discount_at_ied=0, + nominal_interest_rate=0.05, # 5% annual rate + # Array-based schedule + array_pr_next=[overflow_payment], # This will cause overflow in INC + array_increase_decrease=["INC"], # Principal increase + array_pr_anchor=[1100000 + 30 * 24 * 60 * 60], + array_pr_cycle=[Cycle(count=1, unit="M")], + day_count_convention=DayCountConvention.A360, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, + ) + + # Should raise ActusNormalizationError due to uint64 overflow + with pytest.raises( + ActusNormalizationError, + match=r"LAX INC.*exceeds uint64 bounds", + ): + normalize_contract_attributes( + contract, + denomination_asset_id=100, + denomination_asset_decimals=0, # No scaling to simplify + notional_unit_value=1, + secondary_market_opening_date=1000000, + secondary_market_closure_date=2000000, + ) + + +def test_lax_array_pr_next_scaled_value_overflow_detection(): + """Test that LAX detects overflow when array_pr_next scaled values exceed uint64 bounds.""" + # Create a LAX contract where the scaled array_pr_next value itself exceeds MAX_UINT64 + # This tests the validation that happens before any addition + + # Use a value that when scaled with decimals will exceed MAX_UINT64 + # MAX_UINT64 = 18446744073709551615 + # With 6 decimals, any value > 18446744073709.551615 will overflow + excessive_value = int(cst.MAX_UINT64 / 1e6) + 1000000 # This * 10^6 > MAX_UINT64 + + contract = ContractAttributes( + contract_id=1, + contract_type="LAX", + status_date=1000000, + initial_exchange_date=1100000, + maturity_date=1100000 + 365 * 24 * 60 * 60, + notional_principal=1000000, # Small notional + premium_discount_at_ied=0, + nominal_interest_rate=0.05, + array_pr_next=[excessive_value], # Scaled value will overflow + array_increase_decrease=["INC"], + array_pr_anchor=[1100000 + 30 * 24 * 60 * 60], + array_pr_cycle=[Cycle(count=1, unit="M")], + day_count_convention=DayCountConvention.A360, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, + ) + + # Should raise ActusNormalizationError due to scaled value overflow + # The error can come from either to_asa_units or from our LAX-specific validation + with pytest.raises( + ActusNormalizationError, + match=r"(Value.*exceeds uint64 bounds|LAX array_pr_next\[\d+\] scaled value.*exceeds uint64 bounds)", + ): + normalize_contract_attributes( + contract, + denomination_asset_id=100, + denomination_asset_decimals=6, # 6 decimals will cause overflow + notional_unit_value=1, + secondary_market_opening_date=1000000, + secondary_market_closure_date=2000000, + ) + + def test_ann_subtype_calculates_annuity_payment(): """ Test that ANN subtypes (e.g., "ANN:ZCB") correctly calculate annuity payments. From a29d2d78a62b71bf021e8e0b1bed31ef90597dbf Mon Sep 17 00:00:00 2001 From: Cosimo Bassi <65770425+cusma@users.noreply.github.com> Date: Wed, 11 Mar 2026 21:07:48 +0100 Subject: [PATCH 069/244] chore: meaningful test Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- tests/sdk/test_normalization.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/sdk/test_normalization.py b/tests/sdk/test_normalization.py index 57c90454..d9da038a 100644 --- a/tests/sdk/test_normalization.py +++ b/tests/sdk/test_normalization.py @@ -1173,8 +1173,8 @@ def test_lax_with_rate_reset_interleaved(self): # Given the LAX schedule with INC and DEC, we expect variation # or at least not all terminal balance assert ( - len(unique_principals) >= 1 - ), "RR events should track actual outstanding balance" + len(unique_principals) >= 2 + ), "RR events should reflect changing outstanding balances across RR events" def test_nam_capitalizes_unpaid_interest(): From 73134ee5d3d0e1fd5d8e3c887770b0eedffe19f5 Mon Sep 17 00:00:00 2001 From: cusma Date: Wed, 11 Mar 2026 21:38:32 +0100 Subject: [PATCH 070/244] chore: actus types --- smart_contracts/abi_types.py | 217 ++++++++++++++++++++++------------- 1 file changed, 138 insertions(+), 79 deletions(-) diff --git a/smart_contracts/abi_types.py b/smart_contracts/abi_types.py index 3d86ce1d..a91afb1d 100644 --- a/smart_contracts/abi_types.py +++ b/smart_contracts/abi_types.py @@ -5,117 +5,176 @@ Array, BoxMap, Bytes, - FixedBytes, String, Struct, UInt64, arc4, ) -CouponRates: TypeAlias = Array[arc4.UInt16] -TimeEvents: TypeAlias = Array[UInt64] -TimePeriod: TypeAlias = tuple[UInt64, UInt64] -TimePeriods: TypeAlias = Array[TimePeriod] -ProspectusHash: TypeAlias = FixedBytes[Literal[32]] +class PaymentAmounts(Struct, kw_only=True): + """D-ASA Payment Amounts""" -class AssetInfo(Struct, kw_only=True): - """D-ASA Info""" - - denomination_asset_id: UInt64 - settlement_asset_id: UInt64 - outstanding_principal: UInt64 - unit_value: UInt64 - day_count_convention: arc4.UInt8 - principal_discount: arc4.UInt16 - interest_rate: arc4.UInt16 - total_supply: UInt64 - circulating_supply: UInt64 - primary_distribution_opening_date: UInt64 - primary_distribution_closure_date: UInt64 - issuance_date: UInt64 - maturity_date: UInt64 - suspended: bool - performance: arc4.UInt8 - + interest: UInt64 + principal: UInt64 -# FIXME: Switch to Struct when bytes operations are supported -class AssetMetadata(arc4.Struct, kw_only=True): - """D-ASA Metadata""" - contract_type: arc4.UInt8 - calendar: arc4.UInt8 - business_day_convention: arc4.UInt8 - end_of_month_convention: arc4.UInt8 - prepayment_effect: arc4.UInt8 - penalty_type: arc4.UInt8 - prospectus_hash: ProspectusHash - prospectus_url: String +class PaymentResult(Struct, kw_only=True): + """D-ASA Payment Result""" + amount: UInt64 + timestamp: UInt64 + context: Bytes -class AccountInfo(Struct, kw_only=True): - """D-ASA Account Info""" - payment_address: Account - units: UInt64 - unit_value: UInt64 - paid_coupons: UInt64 - suspended: bool +class RoleValidity(arc4.Struct, kw_only=True): + """D-ASA Role Configuration""" + role_validity_start: UInt64 + role_validity_end: UInt64 -class DayCountFactor(Struct, kw_only=True): - """D-ASA Day Count Factor""" - numerator: UInt64 - denominator: UInt64 +RbacRole: TypeAlias = BoxMap[Account, RoleValidity] +ContractTypeId: TypeAlias = arc4.UInt8 +EventTypeId: TypeAlias = arc4.UInt8 +DayCountConvention: TypeAlias = arc4.UInt8 +TimeStamp: TypeAlias = UInt64 -class CouponsInfo(Struct, kw_only=True): - """D-ASA Coupons Info""" +class NormalizedActusTerms(Struct, kw_only=True): + """Normalized ACTUS terms required by the AVM kernel.""" - total_coupons: UInt64 - due_coupons: UInt64 - next_coupon_due_date: UInt64 - day_count_factor: DayCountFactor - all_due_coupons_paid: bool + contract_role: ContractTypeId + denomination_asset_id: UInt64 + settlement_asset_id: UInt64 + total_units: UInt64 + notional_principal: UInt64 + initial_exchange_amount: UInt64 + initial_exchange_date: TimeStamp + maturity_date: TimeStamp + secondary_market_opening_date: TimeStamp + secondary_market_closure_date: TimeStamp + day_count_convention: DayCountConvention + rate_reset_spread: UInt64 + rate_reset_multiplier: UInt64 + rate_reset_floor: UInt64 + rate_reset_cap: UInt64 + rate_reset_next: UInt64 + has_rate_reset_floor: bool + has_rate_reset_cap: bool + dynamic_principal_redemption: bool + fixed_point_scale: UInt64 + + +class ExecutionScheduleEntry(Struct, kw_only=True): + """A single normalized ACTUS event.""" + + event_id: UInt64 + event_type: EventTypeId + scheduled_time: TimeStamp + accrual_factor: UInt64 + redemption_accrual_factor: UInt64 + next_nominal_interest_rate: UInt64 + next_principal_redemption: UInt64 + next_outstanding_principal: UInt64 + flags: UInt64 + + +ExecutionSchedulePage: TypeAlias = Array[ExecutionScheduleEntry] + + +class InitialKernelState(Struct, kw_only=True): + """Initial kernel state at deployment status date.""" + + status_date: TimeStamp + event_cursor: UInt64 + outstanding_principal: UInt64 + interest_calculation_base: UInt64 + nominal_interest_rate: UInt64 + accrued_interest: UInt64 + next_principal_redemption: UInt64 + cumulative_interest_index: UInt64 + cumulative_principal_index: UInt64 + + +class ObservedEventRequest(Struct, kw_only=True): + """Authorized payload for appending or applying observed ACTUS events.""" + + event_id: UInt64 + event_type: EventTypeId + scheduled_time: TimeStamp + accrual_factor: UInt64 + redemption_accrual_factor: UInt64 + observed_rate: UInt64 + next_nominal_interest_rate: UInt64 + next_principal_redemption: UInt64 + next_outstanding_principal: UInt64 + flags: UInt64 + + +class KernelState(Struct, kw_only=True): + """Typed Global State.""" + + contract_type: ContractTypeId + status: UInt64 + total_units: UInt64 + circulating_units: UInt64 + reserved_units_total: UInt64 + initial_exchange_amount: UInt64 + event_cursor: UInt64 + schedule_entry_count: UInt64 + outstanding_principal: UInt64 + interest_calculation_base: UInt64 + nominal_interest_rate: UInt64 + accrued_interest: UInt64 + cumulative_interest_index: UInt64 + cumulative_principal_index: UInt64 + reserved_interest: UInt64 + reserved_principal: UInt64 -class PaymentAmounts(Struct, kw_only=True): - """D-ASA Payment Amounts""" +class AccountPosition(Struct, kw_only=True): + """Per-holder ledger position tracked by the ACTUS accounting module.""" - interest: UInt64 - principal: UInt64 + payment_address: Account + units: UInt64 + reserved_units: UInt64 + suspended: bool + settled_cursor: UInt64 + interest_checkpoint: UInt64 + principal_checkpoint: UInt64 + claimable_interest: UInt64 + claimable_principal: UInt64 -class PaymentResult(Struct, kw_only=True): - """D-ASA Payment Result""" +class CashClaimResult(Struct, kw_only=True): + """Result returned after a holder cashflow claim attempt.""" - amount: UInt64 + interest_amount: UInt64 + principal_amount: UInt64 + total_amount: UInt64 timestamp: UInt64 context: Bytes -class SecondaryMarketSchedule(Struct, kw_only=True): - """D-ASA Secondary Market Schedule""" - - secondary_market_opening_date: UInt64 - secondary_market_closure_date: UInt64 +class CashFundingResult(Struct, kw_only=True): + """Result returned after funding one or more due ACTUS cash events.""" - -class CurrentUnitsValue(Struct, kw_only=True): - """D-ASA Account's Current Units Value""" - - units_value: UInt64 - accrued_interest: UInt64 - day_count_factor: DayCountFactor + funded_interest: UInt64 + funded_principal: UInt64 + total_funded: UInt64 + processed_events: UInt64 + timestamp: UInt64 -# FIXME: Switch to Struct when bytes operations are supported -class RoleConfig(arc4.Struct, kw_only=True): - """D-ASA Role Configuration""" +class ContractCreateMetadata(Struct, kw_only=True): + """Metadata supplied when instantiating the generic ACTUS contract.""" - role_validity_start: UInt64 - role_validity_end: UInt64 + contract_type: ContractTypeId + prospectus_hash: Bytes + prospectus_url: String -RbacRole: TypeAlias = BoxMap[Account, RoleConfig] +SchedulePageArrayLength: TypeAlias = arc4.StaticArray[ + ExecutionScheduleEntry, Literal[16] +] From 3bf29a5be56e643545deb245327ec2c78d75e119 Mon Sep 17 00:00:00 2001 From: cusma Date: Wed, 11 Mar 2026 21:38:39 +0100 Subject: [PATCH 071/244] chore: update config --- smart_contracts/config.py | 28 ++-------------------------- 1 file changed, 2 insertions(+), 26 deletions(-) diff --git a/smart_contracts/config.py b/smart_contracts/config.py index 0e6214cb..5a0369b6 100644 --- a/smart_contracts/config.py +++ b/smart_contracts/config.py @@ -1,31 +1,7 @@ from typing import Final # State Schema -GLOBAL_BYTES: Final[int] = 3 -GLOBAL_UINTS: Final[int] = 18 +GLOBAL_BYTES: Final[int] = 4 +GLOBAL_UINTS: Final[int] = 37 LOCAL_BYTES: Final[int] = 0 LOCAL_UINTS: Final[int] = 0 - -# Time Schedule Limits -TIME_SCHEDULE_LIMITS: Final[int] = 4 -PRIMARY_DISTRIBUTION_OPENING_DATE_IDX: Final[int] = 0 -PRIMARY_DISTRIBUTION_CLOSURE_DATE_IDX: Final[int] = 1 -ISSUANCE_DATE_IDX: Final[int] = 2 -MATURITY_DATE_IDX: Final[int] = -1 - -# Secondary Market Schedule Limits -SECONDARY_MARKET_OPENING_DATE_IDX: Final[int] = 0 -SECONDARY_MARKET_CLOSURE_DATE_IDX: Final[int] = -1 - -# Coupon Due Dates -FIRST_COUPON_DATE_IDX: Final[int] = ISSUANCE_DATE_IDX + 1 - -# Ensure OpCode Budgets, estimated empirically -OP_UP_TIME_EVENT_SORTING: Final[int] = ( - 65 # Depends on the complexity of `assert_time_events_sorted` subroutine -) - -# Ensure OpCode Budgets, estimated empirically -OP_UP_COUPON_DUE_COUNTING: Final[int] = ( - 255 # Depends on the complexity of `count_due_coupons` subroutine -) From c11e6da5c31ec93c337168bd62620a1f7fcaf653 Mon Sep 17 00:00:00 2001 From: cusma Date: Wed, 11 Mar 2026 21:38:50 +0100 Subject: [PATCH 072/244] feat: kernel --- modules/actus/__init__.py | 6 +- modules/actus/kernel.py | 128 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 130 insertions(+), 4 deletions(-) create mode 100644 modules/actus/kernel.py diff --git a/modules/actus/__init__.py b/modules/actus/__init__.py index 62cec6df..993063f4 100644 --- a/modules/actus/__init__.py +++ b/modules/actus/__init__.py @@ -1,7 +1,5 @@ -from .pam import PAMCoreMixin -from .pbn import PBNCoreMixin +from .kernel import KernelStateModule __all__ = [ - "PAMCoreMixin", - "PBNCoreMixin", + "KernelStateModule", ] diff --git a/modules/actus/kernel.py b/modules/actus/kernel.py new file mode 100644 index 00000000..69ecc5e7 --- /dev/null +++ b/modules/actus/kernel.py @@ -0,0 +1,128 @@ +from algopy import Asset, Global, UInt64, op + +from modules.rbac import RbacModule +from smart_contracts import constants as cst +from smart_contracts import enums +from smart_contracts import errors as err +from smart_contracts.abi_types import TimeStamp + + +class KernelStateModule(RbacModule): + """Global State and shared kernel math helpers.""" + + def __init__(self) -> None: + """Initialize the global state variables used by the ACTUS kernel.""" + super().__init__() + + # Contract + self.status = UInt64(enums.STATUS_INACTIVE) + self.contract_type = UInt64() + + # Denomination + self.denomination_asset_id = Asset() + self.settlement_asset_id = Asset() + + # Time + self.initial_exchange_date = TimeStamp() + self.maturity_date = TimeStamp() + self.secondary_market_opening_date = TimeStamp() + self.secondary_market_closure_date = TimeStamp() + + # Day Count Convention + self.day_count_convention = UInt64() + + # Principal + self.outstanding_principal = UInt64() + + self.total_units = UInt64() + self.circulating_units = UInt64() + self.reserved_units_total = UInt64() + + # Interest + self.nominal_interest_rate = UInt64() + self.accrued_interest = UInt64() + self.rate_reset_spread = UInt64() + self.rate_reset_multiplier = UInt64(cst.FIXED_POINT_SCALE) + self.rate_reset_floor = UInt64() + self.rate_reset_cap = UInt64() + self.rate_reset_next = UInt64() + + self.initial_exchange_amount = UInt64() + self.interest_calculation_base = UInt64() + self.next_principal_redemption = UInt64() + + # Primary Distribution + self.reserved_principal = UInt64() + self.reserved_interest = UInt64() + + # Cumulative Index + self.cumulative_interest_index = UInt64() + self.cumulative_principal_index = UInt64() + + # Flags + self.has_rate_reset_floor = False + self.has_rate_reset_cap = False + self.dynamic_principal_redemption = False + + # Scaling + self.fixed_point_scale = UInt64(cst.FIXED_POINT_SCALE) + + def status_is_active(self) -> bool: + """Return whether the contract is active after IED.""" + return self.status == UInt64(enums.STATUS_ACTIVE) + + def status_is_pending_ied(self) -> bool: + """Return whether the contract is configured but still awaiting IED.""" + return self.status == UInt64(enums.STATUS_PENDING_IED) + + def status_is_ended(self) -> bool: + """Return whether the contract has reached its terminal state.""" + return self.status == UInt64(enums.STATUS_ENDED) + + def assert_configured(self) -> None: + """Require the contract to have completed configuration.""" + assert self.status != UInt64(enums.STATUS_INACTIVE), err.CONTRACT_NOT_CONFIGURED + + def assert_initial_exchange_executed(self) -> None: + """Require the initial exchange event to have been executed.""" + assert not self.status_is_pending_ied(), err.INITIAL_EXCHANGE_PENDING + + def _reserved_total(self) -> UInt64: + """Return the settlement funds already ring-fenced for holders.""" + return self.reserved_interest + self.reserved_principal + + def _available_settlement_funds(self) -> UInt64: + """Return the app's free settlement balance after reserved cashflows.""" + balance = self.settlement_asset_id.balance(Global.current_application_address) + reserved_total = self._reserved_total() + assert balance >= reserved_total, err.NOT_ENOUGH_FUNDS + return balance - reserved_total + + def _scaled_mul_div( + self, multiplicand: UInt64, multiplier: UInt64, divisor: UInt64 + ) -> UInt64: + """Multiply and divide in fixed-point space using wide AVM math.""" + if multiplicand == UInt64(0) or multiplier == UInt64(0): + return UInt64(0) + high, low = op.mulw(multiplicand, multiplier) + return op.divw(high, low, divisor) + + def _amount_to_index_delta(self, amount: UInt64) -> UInt64: + """Convert a contract-wide amount into a per-unit cumulative index delta.""" + if amount == UInt64(0): + return UInt64(0) + assert self.circulating_units > UInt64(0), err.NO_UNITS + return self._scaled_mul_div( + amount, self.fixed_point_scale, self.circulating_units + ) + + def _assert_transfer_window(self) -> None: + """Require transfers to happen within the configured secondary market window.""" + if self.secondary_market_opening_date: + assert ( + self.secondary_market_opening_date <= Global.latest_timestamp + ), err.SECONDARY_MARKET_CLOSED + if self.secondary_market_closure_date: + assert ( + Global.latest_timestamp < self.secondary_market_closure_date + ), err.SECONDARY_MARKET_CLOSED From ef435733e9cbe8bbf472e29984c3aef89794edde Mon Sep 17 00:00:00 2001 From: cusma Date: Thu, 12 Mar 2026 10:40:13 +0100 Subject: [PATCH 073/244] chore: account position docstring --- smart_contracts/abi_types.py | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/smart_contracts/abi_types.py b/smart_contracts/abi_types.py index a91afb1d..91f2343d 100644 --- a/smart_contracts/abi_types.py +++ b/smart_contracts/abi_types.py @@ -134,7 +134,25 @@ class KernelState(Struct, kw_only=True): class AccountPosition(Struct, kw_only=True): - """Per-holder ledger position tracked by the ACTUS accounting module.""" + """ + Tracks the account's units and lazy-settlement state. `interest_checkpoint` + and `principal_checkpoint` are cumulative per-unit fixed-point indices already + applied to this account. Any later index growth is converted into absolute + amounts in `claimable_interest` and `claimable_principal` when the position is + settled. `settled_cursor` records the global event cursor seen at the last + settlement. + + Attributes: + payment_address: Destination for cashflow withdrawals. + units: Active units that accrue funded cashflows. + reserved_units: Pre-IED units not yet active. + suspended: Whether the account is suspended. + settled_cursor: Global event cursor at the last account settlement. + interest_checkpoint: Applied cumulative per-unit interest index. + principal_checkpoint: Applied cumulative per-unit principal index. + claimable_interest: Absolute interest amount currently claimable. + claimable_principal: Absolute principal amount currently claimable. + """ payment_address: Account units: UInt64 From 9a22184dffeeea864ea5ee2977f882ecff1931b2 Mon Sep 17 00:00:00 2001 From: cusma Date: Thu, 12 Mar 2026 10:40:26 +0100 Subject: [PATCH 074/244] chore: role prefixes --- smart_contracts/constants.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/smart_contracts/constants.py b/smart_contracts/constants.py index 899adad2..1259f684 100644 --- a/smart_contracts/constants.py +++ b/smart_contracts/constants.py @@ -22,12 +22,13 @@ PREFIX_ID_ARRANGER: Final[bytes] = b"R#Arranger#" PREFIX_ID_OP_DAEMON: Final[bytes] = b"R#OpDaemon#" PREFIX_ID_ACCOUNT_MANAGER: Final[bytes] = b"R#AccountManager#" +PREFIX_ID_ACCOUNT: Final[bytes] = b"R#Account#" PREFIX_ID_PRIMARY_DEALER: Final[bytes] = b"R#PrimaryDealer#" PREFIX_ID_TRUSTEE: Final[bytes] = b"R#Trustee#" PREFIX_ID_AUTHORITY: Final[bytes] = b"R#Authority#" -PREFIX_ID_INTEREST_ORACLE: Final[bytes] = b"R#InterestOracle#" +PREFIX_ID_OBSERVER: Final[bytes] = b"R#Observer#" ################################################################################ # ACTUS Schedule Prefix ################################################################################ -PREFIX_ID_SCHEDULE_PAGE: Final[bytes] = b"ActusSchedule#" +PREFIX_ID_SCHEDULE_PAGE: Final[bytes] = b"S#" From a54aa03e57c6d77e49e95237724e9ec1f19ffc46 Mon Sep 17 00:00:00 2001 From: cusma Date: Thu, 12 Mar 2026 10:40:44 +0100 Subject: [PATCH 075/244] chore: remove unused errors --- smart_contracts/errors.py | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/smart_contracts/errors.py b/smart_contracts/errors.py index b0a8a53c..c841ec05 100644 --- a/smart_contracts/errors.py +++ b/smart_contracts/errors.py @@ -12,9 +12,7 @@ DEFAULTED = "Defaulted" SUSPENDED = "Suspended operations" INVALID_HOLDING_ADDRESS = "Invalid account holding address" -INVALID_TIME_EVENTS_LENGTH = "Time events length is invalid" INVALID_SORTING = "Time events must be sorted in strictly ascending order" -PENDING_COUPON_PAYMENT = "Pending due coupon payment" NOT_ENOUGH_FUNDS = "Not enough funds for the payment" NO_UNITS = "No D-ASA units" @@ -25,16 +23,9 @@ INVALID_DAY_COUNT_CONVENTION = "Invalid day-count convention ID" INVALID_INTEREST_RATE = "Interest rate is not properly defined" INVALID_TIME = "Time events must be set in the future" -INVALID_TIME_PERIOD = "Time periods in Actual/Actual day count convention must be multiples of a day (in seconds)" INVALID_SETTLEMENT_ASSET = ( "Different settlement asset not supported, must be equal to denomination asset" ) -INVALID_TIME_PERIODS = "Time periods are not properly defined" -INVALID_TIME_PERIOD_DURATION = ( - "Time period durations must be strictly greater than zero" -) -INVALID_TIME_PERIOD_REPETITIONS = "Time period repetitions are not properly defined" -INVALID_COUPON_RATES = "Coupon rates are not properly defined" # Set Secondary Time Events INVALID_SECONDARY_OPENING_DATE = "Invalid secondary market opening date" @@ -54,7 +45,6 @@ SELF_TRANSFER = "Sender and receiver must be different" NULL_TRANSFER = "Transfer units must be greater than zero" OVER_TRANSFER = "Insufficient sender units to transfer" -NON_FUNGIBLE_UNITS = "Sender and receiver units are not fungible" # Pay Coupon NO_DUE_COUPON = "No due coupon to pay" From ac2f28f16976c4ee10b4ee59710811eb5ad74fcb Mon Sep 17 00:00:00 2001 From: cusma Date: Thu, 12 Mar 2026 10:41:09 +0100 Subject: [PATCH 076/244] feat: update accounting module --- modules/accounting.py | 235 ++++++++++++++++++++++++------------------ 1 file changed, 137 insertions(+), 98 deletions(-) diff --git a/modules/accounting.py b/modules/accounting.py index 60cde60e..309c6ebe 100644 --- a/modules/accounting.py +++ b/modules/accounting.py @@ -2,94 +2,164 @@ from algopy import Account, BoxMap, Global, Txn, UInt64, arc4 -from modules.rbac import RbacModule +from modules.actus.kernel import KernelStateModule from smart_contracts import abi_types as typ from smart_contracts import constants as cst -from smart_contracts import enums as enm from smart_contracts import errors as err -class AccountingModule(RbacModule): +class AccountingModule(KernelStateModule): + """Contract Account ledger state and per-account settlement helpers.""" + + event_cursor: UInt64 + def __init__(self) -> None: super().__init__() self.account = BoxMap( - Account, typ.AccountInfo, key_prefix=cst.PREFIX_ID_ACCOUNT + Account, + typ.AccountPosition, + key_prefix=cst.PREFIX_ID_ACCOUNT, ) - self.total_units = UInt64() - self.circulating_units = UInt64() - self.unit_value = UInt64() - self.status = UInt64(enm.STATUS_INACTIVE) - - def status_is_active(self) -> bool: - return self.status == enm.STATUS_ACTIVE - - def status_is_ended(self) -> bool: - return self.status == enm.STATUS_ENDED def assert_valid_holding_address(self, holding_address: Account) -> None: + """Require the holding address to have an opened a contract account.""" assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS def assert_is_not_account_suspended(self, holding_address: Account) -> None: + """Require the account not to be suspended.""" assert not self.account[holding_address].suspended, err.SUSPENDED - def account_units_value(self, holding_address: Account, units: UInt64) -> UInt64: - return units * self.account[holding_address].unit_value + def _new_account_position(self, payment_address: Account) -> typ.AccountPosition: + """Create an empty contract account position.""" + return typ.AccountPosition( + payment_address=payment_address, + units=UInt64(0), + reserved_units=UInt64(0), + suspended=False, + settled_cursor=UInt64(0), + interest_checkpoint=UInt64(0), + principal_checkpoint=UInt64(0), + claimable_interest=UInt64(0), + claimable_principal=UInt64(0), + ) + + def _settle_position(self, holding_address: Account) -> tuple[UInt64, UInt64]: + """ + Settle an account to the latest funded global cashflow indices. + + Computes the per-unit fixed-point interest and principal index growth since the + account's last checkpoints, converts those deltas into absolute claimable + amounts using the account's active units, accrues them to the position, and + advances the account checkpoints to the current global indices and event cursor. + + Args: + holding_address: Account to settle. + + Returns: + Tuple of newly accrued `(claimable_interest, claimable_principal)` amounts. + """ - def account_total_units_value(self, holding_address: Account) -> UInt64: - return self.account_units_value( - holding_address, self.account[holding_address].units + self.assert_valid_holding_address(holding_address) + position = self.account[holding_address].copy() + + # Compute the incremental per-unit fixed-point interest and principal accrued + # since this account's last checkpoint. + interest_delta = self.cumulative_interest_index - position.interest_checkpoint + principal_delta = ( + self.cumulative_principal_index - position.principal_checkpoint ) - def outstanding_principal(self) -> UInt64: - return self.circulating_units * self.unit_value + # Convert the per-unit fixed-point deltas into absolute claimable amounts + # using the account's active units. + claimable_interest = position.units * interest_delta // self.fixed_point_scale + claimable_principal = position.units * principal_delta // self.fixed_point_scale - def end_if_no_circulating_units(self) -> None: - if self.circulating_units == UInt64(0): - self.status = UInt64(enm.STATUS_ENDED) + # Accrue the claimable amounts to the account position and make them available + # for withdrawal. + position.claimable_interest += claimable_interest + position.claimable_principal += claimable_principal - def reset_position_if_empty(self, holding_address: Account) -> None: - if self.account[holding_address].units == UInt64(0): - self.account[holding_address].unit_value = UInt64(0) - self.account[holding_address].paid_coupons = UInt64(0) + # Advance the account's per-unit fixed-point checkpoints to the current global + # per-unit fixed-point global indices. + position.interest_checkpoint = self.cumulative_interest_index + position.principal_checkpoint = self.cumulative_principal_index - def assert_are_units_fungible(self, sender: Account, receiver: Account) -> None: - assert ( - self.account[sender].unit_value == self.account[receiver].unit_value - and self.account[sender].paid_coupons == self.account[receiver].paid_coupons - ), err.NON_FUNGIBLE_UNITS - - def assert_fungible_transfer(self, sender: Account, receiver: Account) -> None: - sender_unit_value = self.account[sender].unit_value - if self.account[receiver].units > UInt64(0): - self.assert_are_units_fungible(sender, receiver) - else: - self.account[receiver].unit_value = sender_unit_value - self.account[receiver].paid_coupons = self.account[sender].paid_coupons - - def debit_units(self, holding_address: Account, units: UInt64) -> None: - assert units <= self.account[holding_address].units, err.OVER_TRANSFER - self.account[holding_address].units -= units - self.reset_position_if_empty(holding_address) + # Advance the account's event cursor to the current global event cursor. + position.settled_cursor = self.event_cursor + + # Update the account position and return the newly accrued claimable amounts + # added to the total position's claimable amounts. + self.account[holding_address] = position.copy() + return claimable_interest, claimable_principal - def credit_units(self, holding_address: Account, units: UInt64) -> None: + def _ensure_units_activated(self, holding_address: Account) -> None: + """Move reserved pre-IED units into active units once IED has executed.""" + self.assert_valid_holding_address(holding_address) + if self.status_is_pending_ied(): + return + + position = self.account[holding_address].copy() + if position.reserved_units == UInt64(0): + return + + activated_units = position.reserved_units + position.units += activated_units + position.reserved_units = UInt64(0) + self.account[holding_address] = position.copy() + assert self.reserved_units_total >= activated_units, err.OVER_DISTRIBUTION + self.reserved_units_total -= activated_units + + def _claimable_total(self, holding_address: Account) -> UInt64: + """Return the total currently claimable amount for an account.""" + return ( + self.account[holding_address].claimable_interest + + self.account[holding_address].claimable_principal + ) + + def _reset_claimable(self, holding_address: Account) -> tuple[UInt64, UInt64]: + """Clear claimable balances after a successful withdrawal.""" + position = self.account[holding_address].copy() + + # Get the claimable amounts before reset + interest_amount = position.claimable_interest + principal_amount = position.claimable_principal + + # Reset the position's claimable amounts + position.claimable_interest = UInt64(0) + position.claimable_principal = UInt64(0) + self.account[holding_address] = position.copy() + + assert self.reserved_interest >= interest_amount, err.NOT_ENOUGH_FUNDS + assert self.reserved_principal >= principal_amount, err.NOT_ENOUGH_FUNDS + + # Update the global reserved interest and principal amounts + self.reserved_interest -= interest_amount + self.reserved_principal -= principal_amount + return interest_amount, principal_amount + + def _credit_units(self, holding_address: Account, units: UInt64) -> None: + """Increase an account's active unit balance.""" self.account[holding_address].units += units - def transfer_units( + def _credit_reserved_units(self, holding_address: Account, units: UInt64) -> None: + """Increase an account's reserved pre-IED unit balance.""" + self.account[holding_address].reserved_units += units + + def _debit_units(self, holding_address: Account, units: UInt64) -> None: + """Decrease an account's active unit balance.""" + assert units <= self.account[holding_address].units, err.OVER_TRANSFER + self.account[holding_address].units -= units + + def _apply_transfer( self, sender_holding_address: Account, receiver_holding_address: Account, units: UInt64, ) -> None: - self.debit_units(sender_holding_address, units) - self.credit_units(receiver_holding_address, units) - - def apply_principal_redemption(self, holding_address: Account) -> None: - redeemed_units = self.account[holding_address].units - self.circulating_units -= redeemed_units - self.account[holding_address].units = UInt64(0) - self.reset_position_if_empty(holding_address) - self.end_if_no_circulating_units() + """Move active units between two settled account positions.""" + self._debit_units(sender_holding_address, units) + self._credit_units(receiver_holding_address, units) @arc4.abimethod def account_gov_suspension( @@ -119,7 +189,7 @@ def account_open( self, *, holding_address: Account, payment_address: Account ) -> UInt64: """ - Open D-ASA account + Open a contract account with a new position and register its payment address. Args: holding_address: Account Holding Address @@ -140,43 +210,9 @@ def account_open( self.assert_is_not_asset_defaulted() self.assert_is_not_asset_suspended() assert holding_address not in self.account, err.INVALID_HOLDING_ADDRESS - - self.account[holding_address] = typ.AccountInfo( - payment_address=payment_address, - units=UInt64(0), - unit_value=UInt64(0), - paid_coupons=UInt64(0), - suspended=False, - ) + self.account[holding_address] = self._new_account_position(payment_address) return Global.latest_timestamp - @arc4.abimethod - def account_close(self, *, holding_address: Account) -> tuple[UInt64, UInt64]: - """ - Close D-ASA account - - Args: - holding_address: Account Holding Address - - Returns: - Closed units, Timestamp of the account closing - - Raises: - UNAUTHORIZED: Not authorized - DEFAULTED: Defaulted - INVALID_HOLDING_ADDRESS: Invalid account holding address - """ - - self.assert_caller_is_account_manager() - self.assert_is_not_asset_defaulted() - self.assert_valid_holding_address(holding_address) - - closed_units = self.account[holding_address].units - del self.account[holding_address] - self.circulating_units -= closed_units - self.end_if_no_circulating_units() - return closed_units, Global.latest_timestamp - @arc4.abimethod def account_update_payment_address( self, *, holding_address: Account, payment_address: Account @@ -197,23 +233,26 @@ def account_update_payment_address( SUSPENDED: Suspended operations INVALID_HOLDING_ADDRESS: Invalid account holding address """ - assert Txn.sender == holding_address, err.UNAUTHORIZED + self.assert_valid_holding_address(holding_address) + assert ( + Txn.sender == holding_address + or Txn.sender == self.account[holding_address].payment_address + ), err.UNAUTHORIZED self.assert_is_not_asset_defaulted() self.assert_is_not_asset_suspended() - self.assert_valid_holding_address(holding_address) self.account[holding_address].payment_address = payment_address return Global.latest_timestamp @arc4.abimethod(readonly=True) - def account_get_info(self, *, holding_address: Account) -> typ.AccountInfo: + def account_get_position(self, *, holding_address: Account) -> typ.AccountPosition: """ - Get account info + Get account position Args: holding_address: Account Holding Address Returns: - Payment Address, D-ASA units, Unit nominal value in denomination asset, Paid coupons, Suspended + Account position Raises: INVALID_HOLDING_ADDRESS: Invalid account holding address From 335fa1406bfcb847cf3b9cb16ace22b5b6b3763e Mon Sep 17 00:00:00 2001 From: cusma Date: Thu, 12 Mar 2026 11:04:42 +0100 Subject: [PATCH 077/244] chore: use _scaled_mul_div; restore payment address rotation authorization --- modules/accounting.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/modules/accounting.py b/modules/accounting.py index 309c6ebe..f7f1b48c 100644 --- a/modules/accounting.py +++ b/modules/accounting.py @@ -72,8 +72,12 @@ def _settle_position(self, holding_address: Account) -> tuple[UInt64, UInt64]: # Convert the per-unit fixed-point deltas into absolute claimable amounts # using the account's active units. - claimable_interest = position.units * interest_delta // self.fixed_point_scale - claimable_principal = position.units * principal_delta // self.fixed_point_scale + claimable_interest = self._scaled_mul_div( + interest_delta, position.units, self.fixed_point_scale + ) + claimable_principal = self._scaled_mul_div( + principal_delta, position.units, self.fixed_point_scale + ) # Accrue the claimable amounts to the account position and make them available # for withdrawal. @@ -234,10 +238,7 @@ def account_update_payment_address( INVALID_HOLDING_ADDRESS: Invalid account holding address """ self.assert_valid_holding_address(holding_address) - assert ( - Txn.sender == holding_address - or Txn.sender == self.account[holding_address].payment_address - ), err.UNAUTHORIZED + assert Txn.sender == holding_address, err.UNAUTHORIZED self.assert_is_not_asset_defaulted() self.assert_is_not_asset_suspended() self.account[holding_address].payment_address = payment_address From 5bc6e76836915b38eec34d82af2d5aa74c4a616e Mon Sep 17 00:00:00 2001 From: cusma Date: Thu, 12 Mar 2026 11:26:47 +0100 Subject: [PATCH 078/244] chore: module init --- modules/__init__.py | 11 +++++++++++ modules/actus/__init__.py | 5 ----- 2 files changed, 11 insertions(+), 5 deletions(-) delete mode 100644 modules/actus/__init__.py diff --git a/modules/__init__.py b/modules/__init__.py index e69de29b..17b6ede2 100644 --- a/modules/__init__.py +++ b/modules/__init__.py @@ -0,0 +1,11 @@ +from .accounting import AccountingModule +from .actus.kernel import ActusKernelStateModule +from .actus.schedule import ActusScheduleModule +from .rbac import RbacModule + +__all__ = [ + "AccountingModule", + "ActusKernelStateModule", + "ActusScheduleModule", + "RbacModule", +] diff --git a/modules/actus/__init__.py b/modules/actus/__init__.py deleted file mode 100644 index 993063f4..00000000 --- a/modules/actus/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -from .kernel import KernelStateModule - -__all__ = [ - "KernelStateModule", -] From 8c44ca861c852602aecc58320b043b9fe161e3cc Mon Sep 17 00:00:00 2001 From: cusma Date: Thu, 12 Mar 2026 11:27:03 +0100 Subject: [PATCH 079/244] chore: use native fixed array --- smart_contracts/abi_types.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/smart_contracts/abi_types.py b/smart_contracts/abi_types.py index 91f2343d..452d0c1c 100644 --- a/smart_contracts/abi_types.py +++ b/smart_contracts/abi_types.py @@ -5,6 +5,7 @@ Array, BoxMap, Bytes, + FixedArray, String, Struct, UInt64, @@ -27,7 +28,7 @@ class PaymentResult(Struct, kw_only=True): context: Bytes -class RoleValidity(arc4.Struct, kw_only=True): +class RoleValidity(Struct, kw_only=True): """D-ASA Role Configuration""" role_validity_start: UInt64 @@ -193,6 +194,4 @@ class ContractCreateMetadata(Struct, kw_only=True): prospectus_url: String -SchedulePageArrayLength: TypeAlias = arc4.StaticArray[ - ExecutionScheduleEntry, Literal[16] -] +SchedulePage: TypeAlias = FixedArray[ExecutionScheduleEntry, Literal[16]] From e25b19a75b7f81f8550f7f55d025dc6fcf007484 Mon Sep 17 00:00:00 2001 From: cusma Date: Thu, 12 Mar 2026 11:27:49 +0100 Subject: [PATCH 080/244] chore: rename kernel --- modules/accounting.py | 7 +++---- modules/actus/kernel.py | 4 ++-- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/modules/accounting.py b/modules/accounting.py index f7f1b48c..f201fe33 100644 --- a/modules/accounting.py +++ b/modules/accounting.py @@ -1,14 +1,13 @@ -# pyright: reportMissingModuleSource=false - from algopy import Account, BoxMap, Global, Txn, UInt64, arc4 -from modules.actus.kernel import KernelStateModule from smart_contracts import abi_types as typ from smart_contracts import constants as cst from smart_contracts import errors as err +from . import ActusKernelStateModule + -class AccountingModule(KernelStateModule): +class AccountingModule(ActusKernelStateModule): """Contract Account ledger state and per-account settlement helpers.""" event_cursor: UInt64 diff --git a/modules/actus/kernel.py b/modules/actus/kernel.py index 69ecc5e7..1a5b4b7d 100644 --- a/modules/actus/kernel.py +++ b/modules/actus/kernel.py @@ -1,13 +1,13 @@ from algopy import Asset, Global, UInt64, op -from modules.rbac import RbacModule +from modules import RbacModule from smart_contracts import constants as cst from smart_contracts import enums from smart_contracts import errors as err from smart_contracts.abi_types import TimeStamp -class KernelStateModule(RbacModule): +class ActusKernelStateModule(RbacModule): """Global State and shared kernel math helpers.""" def __init__(self) -> None: From 8d69ba78f09d2dc8985cf0897f6bff166a120eab Mon Sep 17 00:00:00 2001 From: cusma Date: Thu, 12 Mar 2026 11:28:13 +0100 Subject: [PATCH 081/244] chore: invalid event id; invalid schedule page --- smart_contracts/errors.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/smart_contracts/errors.py b/smart_contracts/errors.py index c841ec05..bbbee477 100644 --- a/smart_contracts/errors.py +++ b/smart_contracts/errors.py @@ -27,6 +27,10 @@ "Different settlement asset not supported, must be equal to denomination asset" ) +# Schedule +INVALID_EVENT_ID = "Invalid event id" +INVALID_SCHEDULE_PAGE = "Invalid schedule page" + # Set Secondary Time Events INVALID_SECONDARY_OPENING_DATE = "Invalid secondary market opening date" INVALID_SECONDARY_CLOSURE_DATE = "Invalid secondary market closure date" From eb6acd7446f6581189c0dd6b5dec3a72e66eadd7 Mon Sep 17 00:00:00 2001 From: cusma Date: Thu, 12 Mar 2026 11:28:27 +0100 Subject: [PATCH 082/244] chore: use role validity struct --- modules/rbac.py | 51 ++++++++++++++++++++++++------------------------- 1 file changed, 25 insertions(+), 26 deletions(-) diff --git a/modules/rbac.py b/modules/rbac.py index 300c23be..c3c973b6 100644 --- a/modules/rbac.py +++ b/modules/rbac.py @@ -1,10 +1,7 @@ -# pyright: reportMissingModuleSource=false - from algopy import ( Account, ARC4Contract, BoxMap, - Bytes, Global, GlobalState, Txn, @@ -31,17 +28,19 @@ def __init__(self) -> None: self.arranger = GlobalState(Account(), key=cst.PREFIX_ID_ARRANGER) self.op_daemon = GlobalState(Account(), key=cst.PREFIX_ID_OP_DAEMON) self.account_manager = BoxMap( - Account, typ.RoleConfig, key_prefix=cst.PREFIX_ID_ACCOUNT_MANAGER + Account, typ.RoleValidity, key_prefix=cst.PREFIX_ID_ACCOUNT_MANAGER ) self.primary_dealer = BoxMap( - Account, typ.RoleConfig, key_prefix=cst.PREFIX_ID_PRIMARY_DEALER + Account, typ.RoleValidity, key_prefix=cst.PREFIX_ID_PRIMARY_DEALER + ) + self.trustee = BoxMap( + Account, typ.RoleValidity, key_prefix=cst.PREFIX_ID_TRUSTEE ) - self.trustee = BoxMap(Account, typ.RoleConfig, key_prefix=cst.PREFIX_ID_TRUSTEE) self.authority = BoxMap( - Account, typ.RoleConfig, key_prefix=cst.PREFIX_ID_AUTHORITY + Account, typ.RoleValidity, key_prefix=cst.PREFIX_ID_AUTHORITY ) - self.interest_oracle = BoxMap( - Account, typ.RoleConfig, key_prefix=cst.PREFIX_ID_INTEREST_ORACLE + self.observer = BoxMap( + Account, typ.RoleValidity, key_prefix=cst.PREFIX_ID_OBSERVER ) # D-ASA Governance @@ -76,8 +75,8 @@ def assert_caller_is_trustee(self) -> None: def assert_caller_is_authority(self) -> None: assert self._role_is_active(self.authority, Txn.sender), err.UNAUTHORIZED - def assert_caller_is_interest_oracle(self) -> None: - assert self._role_is_active(self.interest_oracle, Txn.sender), err.UNAUTHORIZED + def assert_caller_is_observer(self) -> None: + assert self._role_is_active(self.observer, Txn.sender), err.UNAUTHORIZED def assert_is_not_asset_defaulted(self) -> None: assert not self.asset_defaulted, err.DEFAULTED @@ -92,11 +91,11 @@ def _assert_valid_role(self, role_id: UInt64) -> None: UInt64(cst.ROLE_PRIMARY_DEALER), UInt64(cst.ROLE_TRUSTEE), UInt64(cst.ROLE_AUTHORITY), - UInt64(cst.ROLE_INTEREST_ORACLE), + UInt64(cst.ROLE_OBSERVER), ), err.INVALID_ROLE - def _upsert_role( - self, role_id: UInt64, role_address: Account, config: Bytes + def _set_role( + self, role_id: UInt64, role_address: Account, validity: typ.RoleValidity ) -> None: if role_id == UInt64(cst.ROLE_ARRANGER): self.arranger.value = role_address @@ -104,23 +103,23 @@ def _upsert_role( if role_id == UInt64(cst.ROLE_ACCOUNT_MANAGER): assert role_address not in self.account_manager, err.INVALID_ROLE_ADDRESS - self.account_manager[role_address] = typ.RoleConfig.from_bytes(config) + self.account_manager[role_address] = validity return if role_id == UInt64(cst.ROLE_PRIMARY_DEALER): assert role_address not in self.primary_dealer, err.INVALID_ROLE_ADDRESS - self.primary_dealer[role_address] = typ.RoleConfig.from_bytes(config) + self.primary_dealer[role_address] = validity return if role_id == UInt64(cst.ROLE_TRUSTEE): assert role_address not in self.trustee, err.INVALID_ROLE_ADDRESS - self.trustee[role_address] = typ.RoleConfig.from_bytes(config) + self.trustee[role_address] = validity return if role_id == UInt64(cst.ROLE_AUTHORITY): assert role_address not in self.authority, err.INVALID_ROLE_ADDRESS - self.authority[role_address] = typ.RoleConfig.from_bytes(config) + self.authority[role_address] = validity return - if role_id == UInt64(cst.ROLE_INTEREST_ORACLE): - assert role_address not in self.interest_oracle, err.INVALID_ROLE_ADDRESS - self.interest_oracle[role_address] = typ.RoleConfig.from_bytes(config) + if role_id == UInt64(cst.ROLE_OBSERVER): + assert role_address not in self.observer, err.INVALID_ROLE_ADDRESS + self.observer[role_address] = validity def _delete_role(self, role_id: UInt64, role_address: Account) -> None: assert role_id != UInt64(cst.ROLE_ARRANGER), err.INVALID_ROLE @@ -140,9 +139,9 @@ def _delete_role(self, role_id: UInt64, role_address: Account) -> None: assert role_address in self.authority, err.INVALID_ROLE_ADDRESS del self.authority[role_address] return - if role_id == UInt64(cst.ROLE_INTEREST_ORACLE): - assert role_address in self.interest_oracle, err.INVALID_ROLE_ADDRESS - del self.interest_oracle[role_address] + if role_id == UInt64(cst.ROLE_OBSERVER): + assert role_address in self.observer, err.INVALID_ROLE_ADDRESS + del self.observer[role_address] @arc4.abimethod def rbac_rotate_arranger(self, *, new_arranger: Account) -> UInt64: @@ -176,7 +175,7 @@ def rbac_set_op_daemon(self, *, address: Account) -> UInt64: @arc4.abimethod def rbac_assign_role( - self, *, role_id: arc4.UInt8, role_address: Account, config: Bytes + self, *, role_id: arc4.UInt8, role_address: Account, config: typ.RoleValidity ) -> UInt64: """ Assign a role to an address @@ -184,7 +183,7 @@ def rbac_assign_role( Args: role_id: Role Identifier role_address: Account Role Address - config: Role configuration (Optional) + validity: Role time validity Returns: Timestamp of the role assignment From ae132b1d9b04956a4ad23025127a2f011b5ed275 Mon Sep 17 00:00:00 2001 From: cusma Date: Thu, 12 Mar 2026 11:28:35 +0100 Subject: [PATCH 083/244] feat: actus schedule --- modules/actus/schedule.py | 46 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 modules/actus/schedule.py diff --git a/modules/actus/schedule.py b/modules/actus/schedule.py new file mode 100644 index 00000000..4a95a2f4 --- /dev/null +++ b/modules/actus/schedule.py @@ -0,0 +1,46 @@ +from algopy import BoxMap, UInt64 + +from modules import AccountingModule +from smart_contracts import abi_types as typ +from smart_contracts import constants as cst +from smart_contracts import errors as err + + +class ActusScheduleModule(AccountingModule): + """ACTUS schedule storage and event lookup helpers.""" + + def __init__(self) -> None: + """Initialize schedule paging state and hashes.""" + super().__init__() + + self.schedule_page = BoxMap( + UInt64, + typ.ExecutionSchedulePage, + key_prefix=cst.PREFIX_ID_SCHEDULE_PAGE, + ) + self.event_cursor = UInt64() + self.schedule_entry_count = UInt64() + + def _schedule_page_index(self, event_id: UInt64) -> UInt64: + """Return the schedule page index containing the given event id.""" + return event_id // UInt64(cst.SCHEDULE_PAGE_SIZE) + + def _schedule_page_offset(self, event_id: UInt64) -> UInt64: + """Return the offset of an event within its schedule page.""" + return event_id % UInt64(cst.SCHEDULE_PAGE_SIZE) + + def _store_schedule_page( + self, page_index: UInt64, schedule_page: typ.ExecutionSchedulePage + ) -> None: + """Persist a normalized schedule page.""" + self.schedule_page[page_index] = schedule_page + + def _get_schedule_entry(self, event_id: UInt64) -> typ.ExecutionScheduleEntry: + """Load a normalized schedule entry by global event id.""" + assert event_id < self.schedule_entry_count, err.INVALID_EVENT_ID + page_index = self._schedule_page_index(event_id) + assert page_index in self.schedule_page, err.INVALID_SCHEDULE_PAGE + page = self.schedule_page[page_index].copy() + offset = self._schedule_page_offset(event_id) + assert offset < page.length, err.INVALID_SCHEDULE_PAGE + return page[offset].copy() From 17a91c5a9f2f3846474f6086e034e0300dcdcd29 Mon Sep 17 00:00:00 2001 From: cusma Date: Thu, 12 Mar 2026 11:47:21 +0100 Subject: [PATCH 084/244] chore: fix roles --- modules/rbac.py | 68 +++++++++++++++++++++------------------- smart_contracts/enums.py | 2 +- 2 files changed, 36 insertions(+), 34 deletions(-) diff --git a/modules/rbac.py b/modules/rbac.py index c3c973b6..26494fda 100644 --- a/modules/rbac.py +++ b/modules/rbac.py @@ -12,6 +12,7 @@ from smart_contracts import abi_types as typ from smart_contracts import constants as cst +from smart_contracts import enums from smart_contracts import errors as err @@ -86,60 +87,61 @@ def assert_is_not_asset_suspended(self) -> None: def _assert_valid_role(self, role_id: UInt64) -> None: assert role_id in ( - UInt64(cst.ROLE_ARRANGER), - UInt64(cst.ROLE_ACCOUNT_MANAGER), - UInt64(cst.ROLE_PRIMARY_DEALER), - UInt64(cst.ROLE_TRUSTEE), - UInt64(cst.ROLE_AUTHORITY), - UInt64(cst.ROLE_OBSERVER), + UInt64(enums.ROLE_ARRANGER), + UInt64(enums.ROLE_OP_DAEMON), + UInt64(enums.ROLE_ACCOUNT_MANAGER), + UInt64(enums.ROLE_PRIMARY_DEALER), + UInt64(enums.ROLE_TRUSTEE), + UInt64(enums.ROLE_AUTHORITY), + UInt64(enums.ROLE_OBSERVER), ), err.INVALID_ROLE def _set_role( self, role_id: UInt64, role_address: Account, validity: typ.RoleValidity ) -> None: - if role_id == UInt64(cst.ROLE_ARRANGER): + if role_id == UInt64(enums.ROLE_ARRANGER): self.arranger.value = role_address return - if role_id == UInt64(cst.ROLE_ACCOUNT_MANAGER): + if role_id == UInt64(enums.ROLE_ACCOUNT_MANAGER): assert role_address not in self.account_manager, err.INVALID_ROLE_ADDRESS self.account_manager[role_address] = validity return - if role_id == UInt64(cst.ROLE_PRIMARY_DEALER): + if role_id == UInt64(enums.ROLE_PRIMARY_DEALER): assert role_address not in self.primary_dealer, err.INVALID_ROLE_ADDRESS self.primary_dealer[role_address] = validity return - if role_id == UInt64(cst.ROLE_TRUSTEE): + if role_id == UInt64(enums.ROLE_TRUSTEE): assert role_address not in self.trustee, err.INVALID_ROLE_ADDRESS self.trustee[role_address] = validity return - if role_id == UInt64(cst.ROLE_AUTHORITY): + if role_id == UInt64(enums.ROLE_AUTHORITY): assert role_address not in self.authority, err.INVALID_ROLE_ADDRESS self.authority[role_address] = validity return - if role_id == UInt64(cst.ROLE_OBSERVER): + if role_id == UInt64(enums.ROLE_OBSERVER): assert role_address not in self.observer, err.INVALID_ROLE_ADDRESS self.observer[role_address] = validity def _delete_role(self, role_id: UInt64, role_address: Account) -> None: - assert role_id != UInt64(cst.ROLE_ARRANGER), err.INVALID_ROLE - if role_id == UInt64(cst.ROLE_ACCOUNT_MANAGER): + assert role_id != UInt64(enums.ROLE_ARRANGER), err.INVALID_ROLE + if role_id == UInt64(enums.ROLE_ACCOUNT_MANAGER): assert role_address in self.account_manager, err.INVALID_ROLE_ADDRESS del self.account_manager[role_address] return - if role_id == UInt64(cst.ROLE_PRIMARY_DEALER): + if role_id == UInt64(enums.ROLE_PRIMARY_DEALER): assert role_address in self.primary_dealer, err.INVALID_ROLE_ADDRESS del self.primary_dealer[role_address] return - if role_id == UInt64(cst.ROLE_TRUSTEE): + if role_id == UInt64(enums.ROLE_TRUSTEE): assert role_address in self.trustee, err.INVALID_ROLE_ADDRESS del self.trustee[role_address] return - if role_id == UInt64(cst.ROLE_AUTHORITY): + if role_id == UInt64(enums.ROLE_AUTHORITY): assert role_address in self.authority, err.INVALID_ROLE_ADDRESS del self.authority[role_address] return - if role_id == UInt64(cst.ROLE_OBSERVER): + if role_id == UInt64(enums.ROLE_OBSERVER): assert role_address in self.observer, err.INVALID_ROLE_ADDRESS del self.observer[role_address] @@ -175,7 +177,7 @@ def rbac_set_op_daemon(self, *, address: Account) -> UInt64: @arc4.abimethod def rbac_assign_role( - self, *, role_id: arc4.UInt8, role_address: Account, config: typ.RoleValidity + self, *, role_id: arc4.UInt8, role_address: Account, validity: typ.RoleValidity ) -> UInt64: """ Assign a role to an address @@ -198,7 +200,7 @@ def rbac_assign_role( self.assert_caller_is_arranger() self.assert_is_not_asset_defaulted() self._assert_valid_role(role_id.as_uint64()) - self._upsert_role(role_id.as_uint64(), role_address, config) + self._set_role(role_id.as_uint64(), role_address, validity) return Global.latest_timestamp @arc4.abimethod @@ -266,29 +268,29 @@ def rbac_get_address_roles( address: Address to get roles for Returns: - Roles mask: (Account Manager, Primary Dealer, Trustee, Authority, Interest Oracle) + Roles mask: (Account Manager, Primary Dealer, Trustee, Authority, Observer) """ return ( self._role_is_active(self.account_manager, address), self._role_is_active(self.primary_dealer, address), self._role_is_active(self.trustee, address), self._role_is_active(self.authority, address), - self._role_is_active(self.interest_oracle, address), + self._role_is_active(self.observer, address), ) @arc4.abimethod(readonly=True) - def rbac_get_role_config( + def rbac_get_role_validity( self, *, role_id: arc4.UInt8, role_address: Account - ) -> typ.RoleConfig: + ) -> typ.RoleValidity: """ - Get role configuration + Get role validity Args: role_id: Role Identifier role_address: Account Role Address Returns: - Role configuration + Role validity """ role = role_id.as_uint64() self._assert_valid_role(role) @@ -297,30 +299,30 @@ def rbac_get_role_config( return typ.RoleConfig( role_validity_start=UInt64(0), role_validity_end=UInt64(0) ) - case UInt64(cst.ROLE_ACCOUNT_MANAGER): + case UInt64(enums.ROLE_ACCOUNT_MANAGER): assert self._has_role( self.account_manager, role_address ), err.INVALID_ROLE_ADDRESS return self.account_manager[role_address] - case UInt64(cst.ROLE_PRIMARY_DEALER): + case UInt64(enums.ROLE_PRIMARY_DEALER): assert self._has_role( self.primary_dealer, role_address ), err.INVALID_ROLE_ADDRESS return self.primary_dealer[role_address] - case UInt64(cst.ROLE_TRUSTEE): + case UInt64(enums.ROLE_TRUSTEE): assert self._has_role( self.trustee, role_address ), err.INVALID_ROLE_ADDRESS return self.trustee[role_address] - case UInt64(cst.ROLE_AUTHORITY): + case UInt64(enums.ROLE_AUTHORITY): assert self._has_role( self.authority, role_address ), err.INVALID_ROLE_ADDRESS return self.authority[role_address] - case UInt64(cst.ROLE_INTEREST_ORACLE): + case UInt64(enums.ROLE_OBSERVER): assert self._has_role( - self.interest_oracle, role_address + self.observer, role_address ), err.INVALID_ROLE_ADDRESS - return self.interest_oracle[role_address] + return self.observer[role_address] case _: op.err(err.INVALID_ROLE) diff --git a/smart_contracts/enums.py b/smart_contracts/enums.py index 9d91d781..067dd511 100644 --- a/smart_contracts/enums.py +++ b/smart_contracts/enums.py @@ -110,7 +110,7 @@ ROLE_PRIMARY_DEALER: Final[int] = 50 ROLE_TRUSTEE: Final[int] = 60 ROLE_AUTHORITY: Final[int] = 70 -ROLE_INTEREST_ORACLE: Final[int] = 80 +ROLE_OBSERVER: Final[int] = 80 ################################################################################ # Payoff Sign From 0fd1c4502c7a24d7cbc29c5fb49d293a5262b46a Mon Sep 17 00:00:00 2001 From: cusma Date: Thu, 12 Mar 2026 15:54:57 +0100 Subject: [PATCH 085/244] chore: remove schedule --- modules/actus/schedule.py | 46 --------------------------------------- 1 file changed, 46 deletions(-) delete mode 100644 modules/actus/schedule.py diff --git a/modules/actus/schedule.py b/modules/actus/schedule.py deleted file mode 100644 index 4a95a2f4..00000000 --- a/modules/actus/schedule.py +++ /dev/null @@ -1,46 +0,0 @@ -from algopy import BoxMap, UInt64 - -from modules import AccountingModule -from smart_contracts import abi_types as typ -from smart_contracts import constants as cst -from smart_contracts import errors as err - - -class ActusScheduleModule(AccountingModule): - """ACTUS schedule storage and event lookup helpers.""" - - def __init__(self) -> None: - """Initialize schedule paging state and hashes.""" - super().__init__() - - self.schedule_page = BoxMap( - UInt64, - typ.ExecutionSchedulePage, - key_prefix=cst.PREFIX_ID_SCHEDULE_PAGE, - ) - self.event_cursor = UInt64() - self.schedule_entry_count = UInt64() - - def _schedule_page_index(self, event_id: UInt64) -> UInt64: - """Return the schedule page index containing the given event id.""" - return event_id // UInt64(cst.SCHEDULE_PAGE_SIZE) - - def _schedule_page_offset(self, event_id: UInt64) -> UInt64: - """Return the offset of an event within its schedule page.""" - return event_id % UInt64(cst.SCHEDULE_PAGE_SIZE) - - def _store_schedule_page( - self, page_index: UInt64, schedule_page: typ.ExecutionSchedulePage - ) -> None: - """Persist a normalized schedule page.""" - self.schedule_page[page_index] = schedule_page - - def _get_schedule_entry(self, event_id: UInt64) -> typ.ExecutionScheduleEntry: - """Load a normalized schedule entry by global event id.""" - assert event_id < self.schedule_entry_count, err.INVALID_EVENT_ID - page_index = self._schedule_page_index(event_id) - assert page_index in self.schedule_page, err.INVALID_SCHEDULE_PAGE - page = self.schedule_page[page_index].copy() - offset = self._schedule_page_offset(event_id) - assert offset < page.length, err.INVALID_SCHEDULE_PAGE - return page[offset].copy() From c517d6de1d771461fb63df3930b5d5cbf2076a73 Mon Sep 17 00:00:00 2001 From: cusma Date: Thu, 12 Mar 2026 15:55:07 +0100 Subject: [PATCH 086/244] chore: private subs --- modules/rbac.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/modules/rbac.py b/modules/rbac.py index 26494fda..97fb95df 100644 --- a/modules/rbac.py +++ b/modules/rbac.py @@ -64,16 +64,16 @@ def _role_is_active(self, role_map: typ.RbacRole, role_address: Account) -> bool def assert_caller_is_arranger(self) -> None: assert self._is_arranger(Txn.sender), err.UNAUTHORIZED - def assert_caller_is_account_manager(self) -> None: + def _assert_caller_is_account_manager(self) -> None: assert self._role_is_active(self.account_manager, Txn.sender), err.UNAUTHORIZED - def assert_caller_is_primary_dealer(self) -> None: + def _assert_caller_is_primary_dealer(self) -> None: assert self._role_is_active(self.primary_dealer, Txn.sender), err.UNAUTHORIZED - def assert_caller_is_trustee(self) -> None: + def _assert_caller_is_trustee(self) -> None: assert self._role_is_active(self.trustee, Txn.sender), err.UNAUTHORIZED - def assert_caller_is_authority(self) -> None: + def _assert_caller_is_authority(self) -> None: assert self._role_is_active(self.authority, Txn.sender), err.UNAUTHORIZED def assert_caller_is_observer(self) -> None: @@ -243,7 +243,7 @@ def rbac_gov_asset_suspension(self, *, suspended: bool) -> UInt64: UNAUTHORIZED: Not authorized """ - self.assert_caller_is_authority() + self._assert_caller_is_authority() self.asset_suspended = suspended return Global.latest_timestamp @@ -295,8 +295,8 @@ def rbac_get_role_validity( role = role_id.as_uint64() self._assert_valid_role(role) match role: - case UInt64(cst.ROLE_ARRANGER): - return typ.RoleConfig( + case UInt64(enums.ROLE_ARRANGER): + return typ.RoleValidity( role_validity_start=UInt64(0), role_validity_end=UInt64(0) ) case UInt64(enums.ROLE_ACCOUNT_MANAGER): From ccbd2712072d9ed0317eeb619771b7dd46325cba Mon Sep 17 00:00:00 2001 From: cusma Date: Thu, 12 Mar 2026 15:56:32 +0100 Subject: [PATCH 087/244] chore: execution event --- smart_contracts/events.py | 67 ++++++++++++++++++++++++++++++++------- 1 file changed, 56 insertions(+), 11 deletions(-) diff --git a/smart_contracts/events.py b/smart_contracts/events.py index b89d638f..19368786 100644 --- a/smart_contracts/events.py +++ b/smart_contracts/events.py @@ -1,20 +1,65 @@ from typing import TypeAlias -from algopy import Bytes, String, UInt64, arc4 +from algopy import Asset, UInt64, arc4 +from algosdk.abi import TupleType, UintType Timestamp: TypeAlias = UInt64 -class Event(arc4.Struct, kw_only=True): - """ACTUS Event.""" +class ExecutionEvent(arc4.Struct, kw_only=True): + """Non-normative receipt for on-chain execution of a scheduled ACTUS event.""" contract_id: UInt64 - type: arc4.UInt8 - type_name: String - time: Timestamp + event_id: UInt64 + event_type: arc4.UInt8 + scheduled_time: Timestamp + applied_at: Timestamp payoff: UInt64 - currency_id: UInt64 - currency_unit: Bytes - nominal_value: UInt64 - nominal_rate_bps: arc4.UInt16 - nominal_accrued: UInt64 + payoff_sign: arc4.UInt8 + settled_amount: UInt64 + currency_id: Asset + sequence: UInt64 + + +_ACTUS_EXECUTION_EVENT_TUPLE = TupleType( + [ + UintType(64), + UintType(64), + UintType(8), + UintType(64), + UintType(64), + UintType(64), + UintType(8), + UintType(64), + UintType(64), + UintType(64), + ] +) + + +def decode_actus_execution_event(event_bytes: bytes) -> dict[str, int]: + """Decode the ARC-28 payload emitted for an ACTUS schedule transition.""" + ( + contract_id, + event_id, + event_type, + scheduled_time, + applied_at, + payoff, + payoff_sign, + settled_amount, + currency_id, + sequence, + ) = _ACTUS_EXECUTION_EVENT_TUPLE.decode(event_bytes) + return { + "contract_id": contract_id, + "event_id": event_id, + "event_type": event_type, + "scheduled_time": scheduled_time, + "applied_at": applied_at, + "payoff": payoff, + "payoff_sign": payoff_sign, + "settled_amount": settled_amount, + "currency_id": currency_id, + "sequence": sequence, + } From 77f2af4213b1dea713e6ca44cb22461dc97a11d1 Mon Sep 17 00:00:00 2001 From: cusma Date: Thu, 12 Mar 2026 15:56:42 +0100 Subject: [PATCH 088/244] chore: add errors --- smart_contracts/errors.py | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/smart_contracts/errors.py b/smart_contracts/errors.py index bbbee477..58a87a35 100644 --- a/smart_contracts/errors.py +++ b/smart_contracts/errors.py @@ -17,19 +17,31 @@ NO_UNITS = "No D-ASA units" # Asset Config +NOT_CONFIGURED = "D-ASA not configured" +TERMS_NOT_CONFIGURED = "D-ASA terms not configured" ALREADY_CONFIGURED = "D-ASA already configured" +INVALID_ACTUS_CONFIG = "Invalid ACTUS configuration" INVALID_DENOMINATION = "Denomination asset is not properly set" -INVALID_MINIMUM_DENOMINATION = "Minimum denomination is not a divisor of principal" INVALID_DAY_COUNT_CONVENTION = "Invalid day-count convention ID" -INVALID_INTEREST_RATE = "Interest rate is not properly defined" -INVALID_TIME = "Time events must be set in the future" INVALID_SETTLEMENT_ASSET = ( "Different settlement asset not supported, must be equal to denomination asset" ) +# Initial Exchage Date +NOT_EVT_IED = "Not IED event" +PENDING_IED = "IED not yet executed" +INVALID_IED = "IED must be set in the future" + # Schedule INVALID_EVENT_ID = "Invalid event id" +INVALID_EVENT_TYPE = "Invalid event type" +INVALID_EVENT_CURSOR = "Invalid event cursor" INVALID_SCHEDULE_PAGE = "Invalid schedule page" +PENDING_ACTUS_EVENT = "ACTUS event not yet executed" +OBSERVED_EVENT_REQUIRED = "Observed event required to execute this action" + +# Cashflows +NO_DUE_CASHFLOW = "No due cashflow to pay" # Set Secondary Time Events INVALID_SECONDARY_OPENING_DATE = "Invalid secondary market opening date" @@ -42,6 +54,7 @@ # Primary Distribution ZERO_UNITS = "Can not distribute zero units" OVER_DISTRIBUTION = "Insufficient remaining D-ASA units" +PRIMARY_DISTRIBUTION_INCOMPLETE = "Primary distribution is not complete" PRIMARY_DISTRIBUTION_CLOSED = "Primary distribution is closed" # Asset Transfer From a830cc79bf668b849d28d46440121d680218325a Mon Sep 17 00:00:00 2001 From: cusma Date: Thu, 12 Mar 2026 15:56:59 +0100 Subject: [PATCH 089/244] chore: add missing pi event enum --- smart_contracts/enums.py | 1 + 1 file changed, 1 insertion(+) diff --git a/smart_contracts/enums.py b/smart_contracts/enums.py index 067dd511..3207f40d 100644 --- a/smart_contracts/enums.py +++ b/smart_contracts/enums.py @@ -24,6 +24,7 @@ EVT_AD: Final[int] = 0 EVT_IED: Final[int] = 1 EVT_PR: Final[int] = 3 +EVT_PI: Final[int] = 4 # FIXME: This is not defined in ACTUS EVT_PRF: Final[int] = 5 EVT_PY: Final[int] = 6 EVT_PP: Final[int] = 7 From 6d693bd261aac822fbef75271d72929abf67e10b Mon Sep 17 00:00:00 2001 From: cusma Date: Thu, 12 Mar 2026 15:57:35 +0100 Subject: [PATCH 090/244] chore: private subs --- modules/accounting.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/modules/accounting.py b/modules/accounting.py index f201fe33..58970532 100644 --- a/modules/accounting.py +++ b/modules/accounting.py @@ -4,14 +4,12 @@ from smart_contracts import constants as cst from smart_contracts import errors as err -from . import ActusKernelStateModule +from . import ActusKernelModule -class AccountingModule(ActusKernelStateModule): +class AccountingModule(ActusKernelModule): """Contract Account ledger state and per-account settlement helpers.""" - event_cursor: UInt64 - def __init__(self) -> None: super().__init__() @@ -21,11 +19,11 @@ def __init__(self) -> None: key_prefix=cst.PREFIX_ID_ACCOUNT, ) - def assert_valid_holding_address(self, holding_address: Account) -> None: + def _assert_valid_holding_address(self, holding_address: Account) -> None: """Require the holding address to have an opened a contract account.""" assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - def assert_is_not_account_suspended(self, holding_address: Account) -> None: + def _assert_is_not_account_suspended(self, holding_address: Account) -> None: """Require the account not to be suspended.""" assert not self.account[holding_address].suspended, err.SUSPENDED From 368e87c3f15c9122fe3d41b8a5596f64d19ea3d2 Mon Sep 17 00:00:00 2001 From: cusma Date: Thu, 12 Mar 2026 15:57:55 +0100 Subject: [PATCH 091/244] chore: update types --- smart_contracts/abi_types.py | 29 +++++++++++++---------------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/smart_contracts/abi_types.py b/smart_contracts/abi_types.py index 452d0c1c..feb3facf 100644 --- a/smart_contracts/abi_types.py +++ b/smart_contracts/abi_types.py @@ -3,9 +3,10 @@ from algopy import ( Account, Array, + Asset, BoxMap, Bytes, - FixedArray, + FixedBytes, String, Struct, UInt64, @@ -40,14 +41,22 @@ class RoleValidity(Struct, kw_only=True): EventTypeId: TypeAlias = arc4.UInt8 DayCountConvention: TypeAlias = arc4.UInt8 TimeStamp: TypeAlias = UInt64 +Hash: TypeAlias = FixedBytes[Literal[32]] + + +class Prospectus(Struct, kw_only=True): + """Contract Prospectus.""" + + hash: Hash + url: String class NormalizedActusTerms(Struct, kw_only=True): """Normalized ACTUS terms required by the AVM kernel.""" - contract_role: ContractTypeId - denomination_asset_id: UInt64 - settlement_asset_id: UInt64 + contract_type: ContractTypeId + denomination_asset_id: Asset + settlement_asset_id: Asset total_units: UInt64 notional_principal: UInt64 initial_exchange_amount: UInt64 @@ -119,7 +128,6 @@ class KernelState(Struct, kw_only=True): contract_type: ContractTypeId status: UInt64 total_units: UInt64 - circulating_units: UInt64 reserved_units_total: UInt64 initial_exchange_amount: UInt64 event_cursor: UInt64 @@ -184,14 +192,3 @@ class CashFundingResult(Struct, kw_only=True): total_funded: UInt64 processed_events: UInt64 timestamp: UInt64 - - -class ContractCreateMetadata(Struct, kw_only=True): - """Metadata supplied when instantiating the generic ACTUS contract.""" - - contract_type: ContractTypeId - prospectus_hash: Bytes - prospectus_url: String - - -SchedulePage: TypeAlias = FixedArray[ExecutionScheduleEntry, Literal[16]] From e9f11d10ebd12e45e8931b03ace1f78f9cf1c573 Mon Sep 17 00:00:00 2001 From: cusma Date: Thu, 12 Mar 2026 15:58:09 +0100 Subject: [PATCH 092/244] feat: complete kernel --- modules/__init__.py | 6 +- modules/actus/kernel.py | 1126 +++++++++++++++++++++++++++++++++++++-- 2 files changed, 1084 insertions(+), 48 deletions(-) diff --git a/modules/__init__.py b/modules/__init__.py index 17b6ede2..02a8de51 100644 --- a/modules/__init__.py +++ b/modules/__init__.py @@ -1,11 +1,9 @@ from .accounting import AccountingModule -from .actus.kernel import ActusKernelStateModule -from .actus.schedule import ActusScheduleModule +from .actus.kernel import ActusKernelModule from .rbac import RbacModule __all__ = [ "AccountingModule", - "ActusKernelStateModule", - "ActusScheduleModule", + "ActusKernelModule", "RbacModule", ] diff --git a/modules/actus/kernel.py b/modules/actus/kernel.py index 1a5b4b7d..d8c3f435 100644 --- a/modules/actus/kernel.py +++ b/modules/actus/kernel.py @@ -1,102 +1,153 @@ -from algopy import Asset, Global, UInt64, op +""" +ACTUS Kernel + +This module contains the contract-type-independent part of the execution engine. +It validates normalized terms, classifies schedule entries, computes cashflow +magnitudes, advances the contract state machine, and exposes the generic ABI methods +shared by the D-ASA variants. + +Glossary used in this file: +- `IED`: initial exchange date. The contract moves from configured to active. +- `IP`: interest payment. +- `PR`: principal redemption. +- `PI`: principal increase or capitalization. +- `MD`: maturity. +- `RR` / `RRF`: rate reset from an observed rate or a pre-fixed rate. +- `IPCB`: interest calculation base reset. +- `PRF`: principal redemption fixing for dynamic annuities. + +The schedule is normalized off chain before it reaches the AVM. Each entry +therefore already carries the next contractual state, and the kernel mostly +needs to verify that the next entry is due, derive any payable amount, then +move on-chain state to the entry's `next_*` values. +""" + +from algopy import ( + Account, + Asset, + BoxMap, + Bytes, + Global, + String, + UInt64, + arc4, + ensure_budget, + itxn, + op, +) from modules import RbacModule +from smart_contracts import abi_types as typ from smart_contracts import constants as cst from smart_contracts import enums from smart_contracts import errors as err -from smart_contracts.abi_types import TimeStamp +from smart_contracts.events import ExecutionEvent -class ActusKernelStateModule(RbacModule): - """Global State and shared kernel math helpers.""" +class ActusKernelModule(RbacModule): + """ + Implement the ACTUS schedule and state transitions. + """ def __init__(self) -> None: - """Initialize the global state variables used by the ACTUS kernel.""" super().__init__() # Contract self.status = UInt64(enums.STATUS_INACTIVE) self.contract_type = UInt64() + # Prospectus (Informational) + self.prospectus_hash = Bytes() + self.prospectus_url = String() + # Denomination self.denomination_asset_id = Asset() self.settlement_asset_id = Asset() # Time - self.initial_exchange_date = TimeStamp() - self.maturity_date = TimeStamp() - self.secondary_market_opening_date = TimeStamp() - self.secondary_market_closure_date = TimeStamp() + self.initial_exchange_date = typ.TimeStamp() + self.maturity_date = typ.TimeStamp() + self.secondary_market_opening_date = typ.TimeStamp() + self.secondary_market_closure_date = typ.TimeStamp() # Day Count Convention self.day_count_convention = UInt64() - # Principal - self.outstanding_principal = UInt64() - + # Units self.total_units = UInt64() - self.circulating_units = UInt64() self.reserved_units_total = UInt64() + # Principal + self.initial_exchange_amount = UInt64() + self.outstanding_principal = UInt64() + self.next_principal_redemption = UInt64() + self.dynamic_principal_redemption = False + # Interest - self.nominal_interest_rate = UInt64() + self.interest_calculation_base = UInt64() self.accrued_interest = UInt64() + + # Interest Rates + self.nominal_interest_rate = UInt64() self.rate_reset_spread = UInt64() - self.rate_reset_multiplier = UInt64(cst.FIXED_POINT_SCALE) + self.rate_reset_multiplier = UInt64() self.rate_reset_floor = UInt64() self.rate_reset_cap = UInt64() self.rate_reset_next = UInt64() - - self.initial_exchange_amount = UInt64() - self.interest_calculation_base = UInt64() - self.next_principal_redemption = UInt64() + self.has_rate_reset_floor = False + self.has_rate_reset_cap = False # Primary Distribution self.reserved_principal = UInt64() self.reserved_interest = UInt64() - # Cumulative Index + # Cumulative Per-Unit Fixed-Point Indexes self.cumulative_interest_index = UInt64() self.cumulative_principal_index = UInt64() - # Flags - self.has_rate_reset_floor = False - self.has_rate_reset_cap = False - self.dynamic_principal_redemption = False + # Schedule + self.schedule_page = BoxMap( + UInt64, + typ.ExecutionSchedulePage, + key_prefix=cst.PREFIX_ID_SCHEDULE_PAGE, + ) + self.event_cursor = UInt64() + self.schedule_entry_count = UInt64() # Scaling - self.fixed_point_scale = UInt64(cst.FIXED_POINT_SCALE) + self.fixed_point_scale = UInt64() + + ############################################################################ + # AVM-specific Contract State + ############################################################################ + + def _status_is_inactive(self) -> bool: + """Return whether the contract is inactive.""" + return self.status == UInt64(enums.STATUS_INACTIVE) - def status_is_active(self) -> bool: + def _status_is_active(self) -> bool: """Return whether the contract is active after IED.""" return self.status == UInt64(enums.STATUS_ACTIVE) - def status_is_pending_ied(self) -> bool: + def _status_is_pending_ied(self) -> bool: """Return whether the contract is configured but still awaiting IED.""" return self.status == UInt64(enums.STATUS_PENDING_IED) - def status_is_ended(self) -> bool: + def _status_is_ended(self) -> bool: """Return whether the contract has reached its terminal state.""" return self.status == UInt64(enums.STATUS_ENDED) - def assert_configured(self) -> None: + def _assert_configured(self) -> None: """Require the contract to have completed configuration.""" - assert self.status != UInt64(enums.STATUS_INACTIVE), err.CONTRACT_NOT_CONFIGURED + assert self.status != UInt64(enums.STATUS_INACTIVE), err.NOT_CONFIGURED - def assert_initial_exchange_executed(self) -> None: + def _assert_initial_exchange_executed(self) -> None: """Require the initial exchange event to have been executed.""" - assert not self.status_is_pending_ied(), err.INITIAL_EXCHANGE_PENDING + assert not self._status_is_pending_ied(), err.PENDING_IED - def _reserved_total(self) -> UInt64: - """Return the settlement funds already ring-fenced for holders.""" - return self.reserved_interest + self.reserved_principal - - def _available_settlement_funds(self) -> UInt64: - """Return the app's free settlement balance after reserved cashflows.""" - balance = self.settlement_asset_id.balance(Global.current_application_address) - reserved_total = self._reserved_total() - assert balance >= reserved_total, err.NOT_ENOUGH_FUNDS - return balance - reserved_total + ############################################################################ + # Math and Conversions + ############################################################################ def _scaled_mul_div( self, multiplicand: UInt64, multiplier: UInt64, divisor: UInt64 @@ -111,10 +162,560 @@ def _amount_to_index_delta(self, amount: UInt64) -> UInt64: """Convert a contract-wide amount into a per-unit cumulative index delta.""" if amount == UInt64(0): return UInt64(0) - assert self.circulating_units > UInt64(0), err.NO_UNITS + assert self.total_units > UInt64(0), err.NO_UNITS + return self._scaled_mul_div(amount, self.fixed_point_scale, self.total_units) + + def _index_delta_to_amount(self, index_delta: UInt64) -> UInt64: + """ + Convert a per-unit index delta back into a contract-wide amount. + + This mirrors `_amount_to_index_delta()` and keeps funding amounts aligned + with what holders can later realize from the cumulative indices. + """ + if index_delta == UInt64(0): + return UInt64(0) + return self._scaled_mul_div( + self.total_units, + index_delta, + self.fixed_point_scale, + ) + + ############################################################################ + # Schedule + ############################################################################ + + def _schedule_page_index(self, event_id: UInt64) -> UInt64: + """Return the schedule page index containing the given event id.""" + return event_id // UInt64(cst.SCHEDULE_PAGE_SIZE) + + def _schedule_page_offset(self, event_id: UInt64) -> UInt64: + """Return the offset of an event within its schedule page.""" + return event_id % UInt64(cst.SCHEDULE_PAGE_SIZE) + + def _store_schedule_page( + self, page_index: UInt64, schedule_page: typ.ExecutionSchedulePage + ) -> None: + """Persist a normalized schedule page.""" + self.schedule_page[page_index] = schedule_page + + def _get_schedule_entry(self, event_id: UInt64) -> typ.ExecutionScheduleEntry: + """Load a normalized schedule entry by global event id.""" + assert event_id < self.schedule_entry_count, err.INVALID_EVENT_ID + page_index = self._schedule_page_index(event_id) + assert page_index in self.schedule_page, err.INVALID_SCHEDULE_PAGE + page = self.schedule_page[page_index].copy() + offset = self._schedule_page_offset(event_id) + assert offset < page.length, err.INVALID_SCHEDULE_PAGE + return page[offset].copy() + + ############################################################################ + # ACTUS Composition Validation + ############################################################################ + + def _is_supported_contract_type(self, contract_type: UInt64) -> bool: + """Return whether the contract type belongs to the supported ACTUS types.""" + return contract_type in ( + UInt64(enums.CT_PAM), + UInt64(enums.CT_ANN), + UInt64(enums.CT_NAM), + UInt64(enums.CT_LAM), + UInt64(enums.CT_LAX), + UInt64(enums.CT_CLM), + ) + + def _assert_supported_contract_type(self, contract_type: UInt64) -> None: + """Require the configured contract type to be supported by the kernel.""" + assert self._is_supported_contract_type(contract_type), err.INVALID_ACTUS_CONFIG + + def _supports_observed_events(self) -> bool: + """Return whether the configured type may append observed events.""" + return self.contract_type == UInt64(enums.CT_CLM) + + def _event_allowed_for_contract_type( + self, contract_type: UInt64, event_type: UInt64 + ) -> bool: + """ + Return whether `event_type` may appear in the normalized schedule. + + This is the kernel's compatibility matrix between contract families and + schedule events. It does not say whether the event is due now, only + whether it is a valid event kind for the chosen ACTUS contract type. + """ + # Common events supported by all contract types + common_events = ( + UInt64(enums.EVT_IED), + UInt64(enums.EVT_IP), + UInt64(enums.EVT_MD), + UInt64(enums.EVT_RR), + UInt64(enums.EVT_RRF), + ) + + # Check common events first + if event_type in common_events: + return True + + # Contract-specific additional events + if contract_type == UInt64(enums.CT_PAM): + # PAM only supports common events + return False + + if contract_type == UInt64(enums.CT_LAM) or contract_type == UInt64( + enums.CT_NAM + ): + # LAM/NAM add: PR, IPCB + return event_type in ( + UInt64(enums.EVT_PR), + UInt64(enums.EVT_IPCB), + ) + + if contract_type == UInt64(enums.CT_ANN): + # ANN adds: PR, IPCB, PRF + return event_type in ( + UInt64(enums.EVT_PR), + UInt64(enums.EVT_IPCB), + UInt64(enums.EVT_PRF), + ) + + if contract_type == UInt64(enums.CT_LAX): + # LAX adds: PR, PI, IPCB, PRF + return event_type in ( + UInt64(enums.EVT_PR), + UInt64(enums.EVT_PI), + UInt64(enums.EVT_IPCB), + UInt64(enums.EVT_PRF), + ) + + if contract_type == UInt64(enums.CT_CLM): + # CLM adds: PR + return event_type == UInt64(enums.EVT_PR) + + return False + + def _is_supported_day_count_convention(self, day_count_convention: UInt64) -> bool: + """Return whether the normalized day-count identifier is accepted in v1.""" + return day_count_convention in ( + UInt64(enums.DCC_AA), + UInt64(enums.DCC_A360), + UInt64(enums.DCC_A365), + UInt64(enums.DCC_30E360ISDA), + UInt64(enums.DCC_30E360), + ) + + def _assert_supported_day_count_convention( + self, day_count_convention: UInt64 + ) -> None: + """Require the normalized day-count identifier to be one the AVM accepts.""" + assert self._is_supported_day_count_convention( + day_count_convention + ), err.INVALID_DAY_COUNT_CONVENTION + + def _assert_event_allowed_for_contract_type( + self, contract_type: UInt64, event_type: UInt64 + ) -> None: + """Require a schedule event to be compatible with the stored contract type.""" + assert self._event_allowed_for_contract_type( + contract_type, event_type + ), err.INVALID_ACTUS_CONFIG + + def _validate_terms_for_contract_type( + self, contract_type: UInt64, terms: typ.NormalizedActusTerms + ) -> None: + """Validate normalized terms that depend on the selected contract type.""" + assert terms.initial_exchange_amount > UInt64(0), err.INVALID_ACTUS_CONFIG + self._assert_supported_day_count_convention( + terms.day_count_convention.as_uint64() + ) + if contract_type != UInt64(enums.CT_ANN): + assert not terms.dynamic_principal_redemption, err.INVALID_ACTUS_CONFIG + + def _is_dynamic_annuity(self) -> bool: + """Return whether the current contract uses ANN dynamic redemption.""" + return ( + self.contract_type == UInt64(enums.CT_ANN) + and self.dynamic_principal_redemption + ) + + ############################################################################ + # Event Classifiers + ############################################################################ + + def _event_is_cash(self, event_type: UInt64) -> bool: + """ + Return whether the event reserves settlement funds for holders. + + Cash events increase the global per-unit indices and ring-fence funds in + `reserved_interest` / `reserved_principal` for later holder claims. + """ + return event_type in ( + UInt64(enums.EVT_IP), + UInt64(enums.EVT_PR), + UInt64(enums.EVT_MD), + ) + + def _event_is_non_cash(self, event_type: UInt64) -> bool: + """ + Return whether the event only mutates contract state. + + Non-cash events still advance the schedule cursor, but they do not + reserve settlement assets in the holder claim ledger. + """ + return event_type in ( + UInt64(enums.EVT_IED), + UInt64(enums.EVT_PI), + UInt64(enums.EVT_RR), + UInt64(enums.EVT_RRF), + UInt64(enums.EVT_IPCB), + UInt64(enums.EVT_PRF), + ) + + def _event_is_rate_reset(self, event_type: UInt64) -> bool: + """Return whether the event updates the current contractual interest rate.""" + return event_type in (UInt64(enums.EVT_RR), UInt64(enums.EVT_RRF)) + + ############################################################################ + # Amounts Computation + ############################################################################ + + def _entry_interest_segment(self, entry: typ.ExecutionScheduleEntry) -> UInt64: + """ + Compute the interest accrued since the previous status date. + + The schedule already provides the accrual factor for the period. The + kernel multiplies that factor by the current interest base and nominal + rate to get the incremental carry attributable to this entry. + """ + if ( + entry.accrual_factor == UInt64(0) + or self.nominal_interest_rate == UInt64(0) + or self.interest_calculation_base == UInt64(0) + ): + return UInt64(0) + accrued = self._scaled_mul_div( + self.interest_calculation_base, + self.nominal_interest_rate, + self.fixed_point_scale, + ) + return self._scaled_mul_div( + accrued, + entry.accrual_factor, + self.fixed_point_scale, + ) + + def _entry_interest_amount(self, entry: typ.ExecutionScheduleEntry) -> UInt64: + """ + Return the contractual interest due for a cash event. + + `IP` and `MD` settle all currently accrued carry plus the period segment + produced by this entry. `PR` does not settle interest separately here. + """ + event_type = entry.event_type.as_uint64() + if event_type not in (UInt64(enums.EVT_IP), UInt64(enums.EVT_MD)): + return UInt64(0) + return self.accrued_interest + self._entry_interest_segment(entry) + + def _entry_principal_amount(self, entry: typ.ExecutionScheduleEntry) -> UInt64: + """ + Return the contractual principal due for a cash event. + + For standard schedules the entry directly tells the kernel the next + outstanding principal. Dynamic annuities are different: the scheduled + redemption is treated as a total payment target, so principal is the + residual left after interest is covered. + """ + event_type = entry.event_type.as_uint64() + if event_type not in (UInt64(enums.EVT_PR), UInt64(enums.EVT_MD)): + return UInt64(0) + if self._is_dynamic_annuity(): + if event_type == UInt64(enums.EVT_MD): + return self.outstanding_principal + interest_due = self.accrued_interest + self._entry_interest_segment(entry) + if self.next_principal_redemption <= interest_due: + return UInt64(0) + principal_amount = self.next_principal_redemption - interest_due + if principal_amount > self.outstanding_principal: + return self.outstanding_principal + return principal_amount + assert ( + entry.next_outstanding_principal <= self.outstanding_principal + ), err.INVALID_ACTUS_CONFIG + return self.outstanding_principal - entry.next_outstanding_principal + + def _entry_ied_amount(self, entry: typ.ExecutionScheduleEntry) -> UInt64: + """ + Return the contractual IED amount stored in normalized terms. + + `IED` is a lifecycle transition on chain, not a funded holder cashflow, + so the amount is emitted for traceability but not settled from escrow. + """ + assert entry.event_type.as_uint64() == UInt64(enums.EVT_IED), err.NOT_EVT_IED + return self.initial_exchange_amount + + ############################################################################ + # Annuity (ANN) Specific Logic + ############################################################################ + + def _discount_annuity_factor( + self, + discount_factor: UInt64, + redemption_factor: UInt64, + ) -> UInt64: + """Advance an annuity discount factor by one redemption period.""" + if redemption_factor == UInt64(0): + return discount_factor + period_rate = self.fixed_point_scale + self._scaled_mul_div( + self.nominal_interest_rate, + redemption_factor, + self.fixed_point_scale, + ) + assert period_rate > UInt64(0), err.INVALID_ACTUS_CONFIG + return self._scaled_mul_div( + discount_factor, + self.fixed_point_scale, + period_rate, + ) + + def _recalculate_annuity_payment(self, entry: typ.ExecutionScheduleEntry) -> UInt64: + """ + Recompute the next annuity payment after a `PRF` event. + + The method walks the remaining redemption-bearing schedule entries, + discounts each future payment bucket, and solves for the flat payment + that amortizes the current outstanding state. + """ + discount_factor = self.fixed_point_scale + denominator = UInt64(0) + skip_first_redemption = False + + if entry.redemption_accrual_factor > UInt64(0): + # An initial PRF may describe the first redemption period directly. + discount_factor = self._discount_annuity_factor( + discount_factor, + entry.redemption_accrual_factor, + ) + denominator += discount_factor + skip_first_redemption = True + + future_event_id = self.event_cursor + UInt64(1) + while future_event_id < self.schedule_entry_count: + future_entry = self._get_schedule_entry(future_event_id) + future_event_type = future_entry.event_type.as_uint64() + # Only redemption-bearing events contribute to the annuity denominator. + is_redemption_event = future_event_type == UInt64(enums.EVT_PR) or ( + future_event_type == UInt64(enums.EVT_MD) + and future_entry.redemption_accrual_factor > UInt64(0) + ) + if is_redemption_event: + if skip_first_redemption: + skip_first_redemption = False + else: + discount_factor = self._discount_annuity_factor( + discount_factor, + future_entry.redemption_accrual_factor, + ) + denominator += discount_factor + future_event_id += UInt64(1) + + assert denominator > UInt64(0), err.INVALID_ACTUS_CONFIG + numerator = self.outstanding_principal + if entry.flags & UInt64(enums.FLAG_INITIAL_PRF) == UInt64(0): + # Subsequent PRF events amortize both principal and already accrued carry. + numerator += self.accrued_interest return self._scaled_mul_div( - amount, self.fixed_point_scale, self.circulating_units + numerator, + self.fixed_point_scale, + denominator, + ) + + ############################################################################ + # Apply Schedule Entries + ############################################################################ + + def _apply_cash_entry( + self, entry: typ.ExecutionScheduleEntry + ) -> tuple[UInt64, UInt64]: + """ + Apply one due cash event and reserve its amount for later claims. + + The kernel derives the contract-wide interest and principal due, turns + those amounts into per-unit index deltas, reserves settlement funds, and + advances the global cursor to the next schedule entry. + """ + assert entry.event_id == self.event_cursor, err.INVALID_EVENT_CURSOR + assert entry.scheduled_time <= Global.latest_timestamp, err.NO_DUE_CASHFLOW + + interest_amount_due = self._entry_interest_amount(entry) + principal_amount_due = self._entry_principal_amount(entry) + next_outstanding_principal = entry.next_outstanding_principal + next_interest_base = entry.next_outstanding_principal + + if self._is_dynamic_annuity(): + event_type = entry.event_type.as_uint64() + # Dynamic annuities derive next state from the payment decomposition, + # not only from the precomputed `next_*` fields. + if event_type == UInt64(enums.EVT_PR): + next_outstanding_principal = ( + self.outstanding_principal - principal_amount_due + ) + next_interest_base = next_outstanding_principal + elif event_type == UInt64(enums.EVT_IP): + next_outstanding_principal = self.outstanding_principal + next_interest_base = self.interest_calculation_base + elif event_type == UInt64(enums.EVT_MD): + next_outstanding_principal = UInt64(0) + next_interest_base = UInt64(0) + + # Funding uses per-unit cumulative indices so each holder can settle + # independently from its current unit balance. + interest_index_delta = self._amount_to_index_delta(interest_amount_due) + principal_index_delta = self._amount_to_index_delta(principal_amount_due) + interest_amount = self._index_delta_to_amount(interest_index_delta) + principal_amount = self._index_delta_to_amount(principal_index_delta) + required_amount = interest_amount + principal_amount + assert ( + self._available_settlement_funds() >= required_amount + ), err.NOT_ENOUGH_FUNDS + + self.reserved_interest += interest_amount + self.reserved_principal += principal_amount + self.cumulative_interest_index += interest_index_delta + self.cumulative_principal_index += principal_index_delta + if entry.event_type.as_uint64() == UInt64(enums.EVT_PR): + # For PR, the period interest stays accrued until a later IP or MD. + self.accrued_interest += self._entry_interest_segment(entry) + else: + self.accrued_interest = UInt64(0) + if not self._is_dynamic_annuity() or entry.event_type.as_uint64() == UInt64( + enums.EVT_MD + ): + self.next_principal_redemption = entry.next_principal_redemption + self.outstanding_principal = next_outstanding_principal + self.interest_calculation_base = next_interest_base + self.event_cursor += UInt64(1) + + if entry.event_type == arc4.UInt8( + enums.EVT_MD + ) and self.outstanding_principal == UInt64(0): + self.status = UInt64(enums.STATUS_ENDED) + self.interest_calculation_base = UInt64(0) + + self._emit_execution_event( + entry=entry, + payoff=interest_amount + principal_amount, + settled_amount=interest_amount + principal_amount, ) + return interest_amount, principal_amount + + def _apply_non_cash_schedule_entry( + self, entry: typ.ExecutionScheduleEntry, payload: typ.ObservedEventRequest + ) -> None: + """ + Apply one due non-cash event and advance the kernel state. + + Non-cash events do not reserve settlement assets, but they can activate + issuance, capitalize principal, change the running rate, or recalculate + future annuity payments. + """ + assert entry.event_id == self.event_cursor, err.INVALID_EVENT_CURSOR + assert entry.scheduled_time <= Global.latest_timestamp, err.NO_DUE_CASHFLOW + + event_type = entry.event_type.as_uint64() + if event_type == UInt64(enums.EVT_IED): + # IED finalizes issuance: reserved units become activatable and the + # schedule's initial contractual state becomes live. + assert self._status_is_pending_ied(), err.INVALID_ACTUS_CONFIG + assert ( + self.reserved_units_total == self.total_units + ), err.PRIMARY_DISTRIBUTION_INCOMPLETE + self.outstanding_principal = entry.next_outstanding_principal + self.interest_calculation_base = entry.next_outstanding_principal + self.nominal_interest_rate = entry.next_nominal_interest_rate + self.accrued_interest = UInt64(0) + self.next_principal_redemption = entry.next_principal_redemption + self.event_cursor += UInt64(1) + self.status = UInt64(enums.STATUS_ACTIVE) + self._emit_execution_event( + entry=entry, + payoff=self._entry_ied_amount(entry), + settled_amount=UInt64(0), + ) + return + + self._assert_initial_exchange_executed() + self.accrued_interest += self._entry_interest_segment(entry) + + if event_type == UInt64(enums.EVT_RR): + # RR derives the next rate from an observed oracle value plus the + # contract spread / multiplier terms, then enforces floor and cap. + observed_rate = self._scaled_mul_div( + payload.observed_rate, + self.rate_reset_multiplier, + self.fixed_point_scale, + ) + self.nominal_interest_rate = self._clamp_rate( + observed_rate + self.rate_reset_spread + ) + elif event_type == UInt64(enums.EVT_RRF): + next_rate = entry.next_nominal_interest_rate + if next_rate == UInt64(0): + next_rate = self.rate_reset_next + self.nominal_interest_rate = next_rate + else: + if entry.next_nominal_interest_rate != UInt64(0): + self.nominal_interest_rate = entry.next_nominal_interest_rate + + if event_type == UInt64(enums.EVT_PI): + self.outstanding_principal = entry.next_outstanding_principal + self.interest_calculation_base = entry.next_outstanding_principal + elif event_type == UInt64(enums.EVT_IPCB): + # IPCB keeps principal unchanged and only resets the interest base. + self.interest_calculation_base = self.outstanding_principal + + if self._is_dynamic_annuity(): + if event_type == UInt64(enums.EVT_PRF): + self.next_principal_redemption = self._recalculate_annuity_payment( + entry + ) + else: + self.next_principal_redemption = entry.next_principal_redemption + self.event_cursor += UInt64(1) + self._emit_execution_event( + entry=entry, + payoff=UInt64(0), + settled_amount=UInt64(0), + ) + + ############################################################################ + # Execution Events + ############################################################################ + + def _emit_execution_event( + self, + *, + entry: typ.ExecutionScheduleEntry, + payoff: UInt64, + settled_amount: UInt64, + ) -> None: + """Emit a non-normative ARC-28 receipt for one applied schedule entry.""" + arc4.emit( + ExecutionEvent( + contract_id=Global.current_application_id.id, + event_id=entry.event_id, + event_type=entry.event_type, + scheduled_time=entry.scheduled_time, + applied_at=Global.latest_timestamp, + payoff=payoff, + payoff_sign=arc4.UInt8( + self._payoff_sign(entry.event_type.as_uint64(), payoff) + ), + settled_amount=settled_amount, + currency_id=self.settlement_asset_id.id, + sequence=entry.event_id + UInt64(1), + ) + ) + + ############################################################################ + # Others + ############################################################################ def _assert_transfer_window(self) -> None: """Require transfers to happen within the configured secondary market window.""" @@ -126,3 +727,440 @@ def _assert_transfer_window(self) -> None: assert ( Global.latest_timestamp < self.secondary_market_closure_date ), err.SECONDARY_MARKET_CLOSED + + def _reserved_total(self) -> UInt64: + """Return the settlement funds already ring-fenced for holders.""" + return self.reserved_interest + self.reserved_principal + + def _available_settlement_funds(self) -> UInt64: + """Return the app's free settlement balance after reserved cashflows.""" + balance = self.settlement_asset_id.balance(Global.current_application_address) + reserved_total = self._reserved_total() + assert balance >= reserved_total, err.NOT_ENOUGH_FUNDS + return balance - reserved_total + + def _clamp_rate(self, rate: UInt64) -> UInt64: + """Apply optional floor and cap terms to a normalized rate.""" + if self.has_rate_reset_floor and rate < self.rate_reset_floor: + rate = self.rate_reset_floor + if self.has_rate_reset_cap and rate > self.rate_reset_cap: + rate = self.rate_reset_cap + return rate + + def _payoff_sign(self, event_type: UInt64, payoff: UInt64) -> UInt64: + """Resolve the contractual payoff sign from cashflow direction alone.""" + if payoff == UInt64(0): + return UInt64(enums.PAYOFF_SIGN_POSITIVE) + if event_type in (UInt64(enums.EVT_IED), UInt64(enums.EVT_PI)): + return UInt64(enums.PAYOFF_SIGN_POSITIVE) + return UInt64(enums.PAYOFF_SIGN_NEGATIVE) + + def _assert_no_due_event_pending(self) -> None: + """ + Require there to be no due schedule entry at the current cursor. + + Transfers settle holders against the current global indices. Allowing a + transfer while a due event is still unapplied would let positions move + before the shared contract state catches up. + """ + if self.event_cursor >= self.schedule_entry_count: + return + next_entry = self._get_schedule_entry(self.event_cursor) + assert ( + next_entry.scheduled_time > Global.latest_timestamp + ), err.PENDING_ACTUS_EVENT + + ############################################################################ + # Contract Configuration + ############################################################################ + + def _assert_denomination_asset(self, denomination_asset_id: Asset) -> None: + # The reference implementation has on-chain denomination with ASA + _creator, exists = op.AssetParamsGet.asset_creator(denomination_asset_id) + assert exists, err.INVALID_DENOMINATION + + def _set_denomination_asset(self, denomination_asset_id: Asset) -> None: + self.denomination_asset_id = denomination_asset_id + + def _assert_settlement_asset(self, settlement_asset_id: Asset) -> None: + # The reference implementation settlement asset is the denomination asset + assert ( + settlement_asset_id == self.denomination_asset_id + ), err.INVALID_SETTLEMENT_ASSET + + def _set_settlement_asset(self, settlement_asset_id: Asset) -> None: + self.settlement_asset_id = settlement_asset_id + # The reference implementation has on-chain settlement with ASA + itxn.AssetTransfer( + xfer_asset=self.settlement_asset_id, + asset_receiver=Global.current_application_address, + asset_amount=0, + fee=Global.min_txn_fee, + ).submit() + + def _store_contract_config( + self, + contract_type: UInt64, + terms: typ.NormalizedActusTerms, + initial_state: typ.InitialKernelState, + ) -> None: + """Persist normalized terms and initial kernel state once.""" + + self._validate_terms_for_contract_type(contract_type, terms) + assert self.status == UInt64(enums.STATUS_INACTIVE), err.ALREADY_CONFIGURED + assert self.initial_exchange_amount == UInt64(0), err.ALREADY_CONFIGURED + + # Set Denomination Asset + self._assert_denomination_asset(terms.denomination_asset_id) + self._set_denomination_asset(terms.denomination_asset_id) + + # Set Settlement Asset + self._assert_settlement_asset(terms.settlement_asset_id) + self._set_settlement_asset(terms.settlement_asset_id) + + # Units + self.total_units = terms.total_units + self.reserved_units_total = UInt64(0) + + # Day-Count Conventions + self.day_count_convention = terms.day_count_convention + + # Time + self.initial_exchange_date = terms.initial_exchange_date + self.maturity_date = terms.maturity_date + self.next_principal_redemption = initial_state.next_principal_redemption + self.secondary_market_opening_date = terms.secondary_market_opening_date + self.secondary_market_closure_date = terms.secondary_market_closure_date + + # Principal + self.initial_exchange_amount = terms.initial_exchange_amount + self.dynamic_principal_redemption = terms.dynamic_principal_redemption + self.outstanding_principal = initial_state.outstanding_principal + + # Interest + self.accrued_interest = initial_state.accrued_interest + + # Interest Rate + self.nominal_interest_rate = initial_state.nominal_interest_rate + self.interest_calculation_base = initial_state.interest_calculation_base + self.rate_reset_spread = terms.rate_reset_spread + self.rate_reset_multiplier = terms.rate_reset_multiplier + self.rate_reset_floor = terms.rate_reset_floor + self.rate_reset_cap = terms.rate_reset_cap + self.rate_reset_next = terms.rate_reset_next + self.has_rate_reset_floor = terms.has_rate_reset_floor + self.has_rate_reset_cap = terms.has_rate_reset_cap + + # Scaling + self.fixed_point_scale = terms.fixed_point_scale + + # Schedule Processing + self.event_cursor = initial_state.event_cursor + + # Per-Unit Fixed-Point Indexes + self.cumulative_interest_index = initial_state.cumulative_interest_index + self.cumulative_principal_index = initial_state.cumulative_principal_index + + # Reserved Amount (for executed cashflows) + self.reserved_interest = UInt64(0) + self.reserved_principal = UInt64(0) + + assert terms.initial_exchange_date > Global.latest_timestamp, err.INVALID_IED + assert terms.initial_exchange_date > initial_state.status_date, err.INVALID_IED + assert terms.initial_exchange_date < terms.maturity_date, err.INVALID_IED + + ############################################################################ + # Update Schedule + ############################################################################ + + def _store_contract_schedule_page( + self, + *, + contract_type: UInt64, + schedule_page_index: UInt64, + is_last_page: bool, + schedule_page: typ.ExecutionSchedulePage, + ) -> None: + """Validate and persist one normalized schedule page.""" + + assert self.status == UInt64(enums.STATUS_INACTIVE), err.ALREADY_CONFIGURED + assert schedule_page.length <= UInt64( + cst.SCHEDULE_PAGE_SIZE + ), err.INVALID_SCHEDULE_PAGE + assert self.initial_exchange_amount > UInt64(0), err.TERMS_NOT_CONFIGURED + + page_cursor = schedule_page_index * UInt64(cst.SCHEDULE_PAGE_SIZE) + page_length = schedule_page.length + # Validation cost grows with page length, so configuration explicitly + # buys extra opcode budget for larger uploads. + ensure_budget( + required_budget=( + UInt64(cst.OP_UP_CONTRACT_CONFIG_BASE_BUDGET) + + page_length * UInt64(cst.OP_UP_CONTRACT_CONFIG_PER_ENTRY_BUDGET) + ), + ) + index = UInt64(0) + while index < page_length: + entry = schedule_page[index].copy() + entry_event_type = entry.event_type.as_uint64() + assert entry.event_id == page_cursor + index, err.INVALID_EVENT_ID + self._assert_event_allowed_for_contract_type( + contract_type, entry_event_type + ) + assert entry.scheduled_time > UInt64(0), err.INVALID_ACTUS_CONFIG + if entry.event_id > UInt64(0): + if index > UInt64(0): + previous_entry = schedule_page[index - UInt64(1)].copy() + else: + # The first entry of a page must still be ordered after the + # last entry of the previous page. + assert schedule_page_index > UInt64(0), err.INVALID_EVENT_ID + previous_page_index = schedule_page_index - UInt64(1) + assert ( + previous_page_index in self.schedule_page + ), err.INVALID_SCHEDULE_PAGE + previous_page = self.schedule_page[previous_page_index].copy() + assert previous_page.length > UInt64(0), err.INVALID_SCHEDULE_PAGE + previous_entry = previous_page[ + previous_page.length - UInt64(1) + ].copy() + assert ( + previous_entry.scheduled_time <= entry.scheduled_time + ), err.INVALID_SORTING + if entry.event_id == UInt64(0): + assert entry_event_type == UInt64( + enums.EVT_IED + ), err.INVALID_ACTUS_CONFIG + index += UInt64(1) + + self._store_schedule_page(schedule_page_index, schedule_page) + if is_last_page: + self.schedule_entry_count = ( + schedule_page_index * UInt64(cst.SCHEDULE_PAGE_SIZE) + page_length + ) + self.status = UInt64(enums.STATUS_PENDING_IED) + + def _append_observed_event(self, payload: typ.ObservedEventRequest) -> None: + """ + Append an authorized observed event to the schedule tail. + + Observed events are runtime schedule entries supplied by an authorized + caller. Supported only for CLM contracts. + """ + assert self._supports_observed_events(), err.OBSERVED_EVENT_REQUIRED + assert payload.event_id == self.schedule_entry_count, err.INVALID_EVENT_ID + self._assert_event_allowed_for_contract_type( + self.contract_type, payload.event_type.as_uint64() + ) + + page_index = self._schedule_page_index(self.schedule_entry_count) + page = typ.ExecutionSchedulePage() + if page_index in self.schedule_page: + page = self.schedule_page[page_index].copy() + assert page.length < UInt64(cst.SCHEDULE_PAGE_SIZE), err.INVALID_SCHEDULE_PAGE + page.append( + typ.ExecutionScheduleEntry( + event_id=payload.event_id, + event_type=payload.event_type, + scheduled_time=payload.scheduled_time, + accrual_factor=payload.accrual_factor, + redemption_accrual_factor=payload.redemption_accrual_factor, + next_nominal_interest_rate=payload.next_nominal_interest_rate, + next_principal_redemption=payload.next_principal_redemption, + next_outstanding_principal=payload.next_outstanding_principal, + flags=payload.flags, + ) + ) + self.schedule_page[page_index] = page.copy() + self.schedule_entry_count += UInt64(1) + + ############################################################################ + # Public ABI + ############################################################################ + + @arc4.abimethod(create="require") + def contract_create(self, *, arranger: Account) -> typ.TimeStamp: + """ + Create a new D-ASA contract and set the Arranger role + + Args: + arranger: D-ASA Arranger Address + + Returns: + UNIX timestamp of contract creation + """ + self.arranger.value = arranger + return Global.latest_timestamp + + @arc4.abimethod + def contract_config( + self, + *, + terms: typ.NormalizedActusTerms, + initial_state: typ.InitialKernelState, + prospectus: typ.Prospectus, + ) -> UInt64: + """ + Partial contract configuration with: normalized ACTUS terms, initial kernel + state (pre-IED), prospectus (informational only). The contract stays inactive + until all schedule pages are configured next. + + Args: + terms: Normalized ACTUS terms + initial_state: Initial kernel state (pre-IED) + prospectus: Prospectus (informational only) + + Returns: + UNIX timestamp of contract configuration + + Raises: + UNAUTHORIZED: Not authorized + ALREADY_CONFIGURED: Contract already configured + INVALID_ACTUS_CONFIG: Invalid ACTUS configuration + INVALID_DAY_COUNT_CONVENTION: Invalid day-count convention ID + INVALID_IED: IED must be set in the future + INVALID_SORTING: Time events are not sorted correctly + """ + self.assert_caller_is_arranger() + + # Configure Contract + self.contract_type = terms.contract_type.as_uint64() + self._assert_supported_contract_type(self.contract_type) + self._store_contract_config(self.contract_type, terms, initial_state) + + # Notarize prospectus (optional) + self.prospectus_hash = prospectus.hash + self.prospectus_url = prospectus.url + return Global.latest_timestamp + + @arc4.abimethod + def contract_schedule( + self, + *, + schedule_page_index: UInt64, + is_last_page: bool, + schedule_page: typ.ExecutionSchedulePage, + ) -> UInt64: + """ + Upload one normalized schedule page. + + The configuration operation is considered complete only when the last + page is stored. At that point `schedule_entry_count` is finalized and + the contract moves to `STATUS_PENDING_IED`. + """ + self.assert_caller_is_arranger() + + self._store_contract_schedule_page( + contract_type=self.contract_type, + schedule_page_index=schedule_page_index, + is_last_page=is_last_page, + schedule_page=schedule_page, + ) + return Global.latest_timestamp + + @arc4.abimethod + def execute_ied(self) -> UInt64: + """Execute the first due `IED` entry and activate the contract. + + `IED` is the one non-cash event that moves the app from + `STATUS_PENDING_IED` to `STATUS_ACTIVE`. + """ + self._assert_configured() + self.assert_caller_is_arranger() + self.assert_is_not_asset_defaulted() + self.assert_is_not_asset_suspended() + + assert self.event_cursor < self.schedule_entry_count, err.INVALID_EVENT_CURSOR + entry = self._get_schedule_entry(self.event_cursor) + assert entry.event_type == arc4.UInt8(enums.EVT_IED), err.INVALID_EVENT_TYPE + self._apply_non_cash_schedule_entry( + entry, + typ.ObservedEventRequest( + event_id=entry.event_id, + event_type=entry.event_type, + scheduled_time=entry.scheduled_time, + accrual_factor=entry.accrual_factor, + redemption_accrual_factor=entry.redemption_accrual_factor, + observed_rate=UInt64(0), + next_nominal_interest_rate=entry.next_nominal_interest_rate, + next_principal_redemption=entry.next_principal_redemption, + next_outstanding_principal=entry.next_outstanding_principal, + flags=entry.flags, + ), + ) + return Global.latest_timestamp + + @arc4.abimethod + def apply_non_cash_event( + self, + *, + event_id: UInt64, + payload: typ.ObservedEventRequest, + ) -> UInt64: + """Apply the next due non-cash event, optionally appending one first. + + Observed payloads are appended before execution when flagged. Rate reset + events require the interest oracle because they can change the running + nominal rate; other non-cash events stay arranger-controlled. + """ + self._assert_configured() + self.assert_is_not_asset_defaulted() + self.assert_is_not_asset_suspended() + + if payload.flags & UInt64(enums.FLAG_OBSERVED_EVENT): + assert self._supports_observed_events(), err.OBSERVED_EVENT_REQUIRED + self.assert_caller_is_arranger() + self._append_observed_event(payload) + + assert event_id == self.event_cursor, err.INVALID_EVENT_CURSOR + entry = self._get_schedule_entry(event_id) + assert self._event_is_non_cash( + entry.event_type.as_uint64() + ), err.INVALID_EVENT_TYPE + assert entry.event_type != arc4.UInt8(enums.EVT_IED), err.INVALID_EVENT_TYPE + if self._event_is_rate_reset(entry.event_type.as_uint64()): + self.assert_caller_is_observer() + else: + self.assert_caller_is_arranger() + self._apply_non_cash_schedule_entry(entry, payload) + return Global.latest_timestamp + + @arc4.abimethod(readonly=True) + def get_contract_state(self) -> typ.KernelState: + """Return a readonly snapshot of the generic ACTUS kernel state.""" + self._assert_configured() + return typ.KernelState( + contract_type=arc4.UInt8(self.contract_type), + status=self.status, + total_units=self.total_units, + reserved_units_total=self.reserved_units_total, + initial_exchange_amount=self.initial_exchange_amount, + event_cursor=self.event_cursor, + schedule_entry_count=self.schedule_entry_count, + outstanding_principal=self.outstanding_principal, + interest_calculation_base=self.interest_calculation_base, + nominal_interest_rate=self.nominal_interest_rate, + accrued_interest=self.accrued_interest, + cumulative_interest_index=self.cumulative_interest_index, + cumulative_principal_index=self.cumulative_principal_index, + reserved_interest=self.reserved_interest, + reserved_principal=self.reserved_principal, + ) + + @arc4.abimethod(readonly=True) + def get_next_due_event(self) -> typ.ExecutionScheduleEntry: + """Return the next boxed schedule entry, or a zeroed sentinel if ended.""" + self._assert_configured() + if self.event_cursor >= self.schedule_entry_count: + return typ.ExecutionScheduleEntry( + event_id=self.event_cursor, + event_type=arc4.UInt8(0), + scheduled_time=UInt64(0), + accrual_factor=UInt64(0), + redemption_accrual_factor=UInt64(0), + next_nominal_interest_rate=UInt64(0), + next_principal_redemption=UInt64(0), + next_outstanding_principal=UInt64(0), + flags=UInt64(0), + ) + return self._get_schedule_entry(self.event_cursor) From b49795613d203aecb572a99cebd1c71003297141 Mon Sep 17 00:00:00 2001 From: Cosimo Bassi <65770425+cusma@users.noreply.github.com> Date: Thu, 12 Mar 2026 16:25:40 +0100 Subject: [PATCH 093/244] chore: nit Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- smart_contracts/errors.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/smart_contracts/errors.py b/smart_contracts/errors.py index 58a87a35..72a4d211 100644 --- a/smart_contracts/errors.py +++ b/smart_contracts/errors.py @@ -27,7 +27,7 @@ "Different settlement asset not supported, must be equal to denomination asset" ) -# Initial Exchage Date +# Initial Exchange Date NOT_EVT_IED = "Not IED event" PENDING_IED = "IED not yet executed" INVALID_IED = "IED must be set in the future" From e1d56cfdbe5cc910c58d682ff3e3c87fa591a560 Mon Sep 17 00:00:00 2001 From: cusma Date: Thu, 12 Mar 2026 16:42:11 +0100 Subject: [PATCH 094/244] chore: move deprecated --- modules/{actus => _actus}/pam.py | 2 +- modules/{actus => _actus}/pbn.py | 2 +- .../__init__.py | 0 .../common.py | 6 ++--- .../coupon.py | 0 .../no_coupon.py | 0 .../__init__.py | 0 .../common.py | 2 +- .../coupon.py | 0 .../no_principal.py | 2 +- .../principal.py | 0 .../__init__.py | 0 .../common.py | 2 +- .../coupon.py | 0 .../no_coupon.py | 0 modules/{actus => }/kernel.py | 22 +++++++++---------- smart_contracts/fixed_coupon_bond/contract.py | 8 +++---- smart_contracts/perpetual_bond/contract.py | 8 +++---- smart_contracts/zero_coupon_bond/contract.py | 8 +++---- 19 files changed, 31 insertions(+), 31 deletions(-) rename modules/{actus => _actus}/pam.py (98%) rename modules/{actus => _actus}/pbn.py (98%) rename modules/{core_financial => _core_financial}/__init__.py (100%) rename modules/{core_financial => _core_financial}/common.py (99%) rename modules/{core_financial => _core_financial}/coupon.py (100%) rename modules/{core_financial => _core_financial}/no_coupon.py (100%) rename modules/{payment_agent => _payment_agent}/__init__.py (100%) rename modules/{payment_agent => _payment_agent}/common.py (97%) rename modules/{payment_agent => _payment_agent}/coupon.py (100%) rename modules/{payment_agent => _payment_agent}/no_principal.py (79%) rename modules/{payment_agent => _payment_agent}/principal.py (100%) rename modules/{transfer_agent => _transfer_agent}/__init__.py (100%) rename modules/{transfer_agent => _transfer_agent}/common.py (93%) rename modules/{transfer_agent => _transfer_agent}/coupon.py (100%) rename modules/{transfer_agent => _transfer_agent}/no_coupon.py (100%) rename modules/{actus => }/kernel.py (98%) diff --git a/modules/actus/pam.py b/modules/_actus/pam.py similarity index 98% rename from modules/actus/pam.py rename to modules/_actus/pam.py index c4db4fac..9c41ae97 100644 --- a/modules/actus/pam.py +++ b/modules/_actus/pam.py @@ -1,7 +1,7 @@ # pyright: reportMissingModuleSource=false from algopy import Account, Asset, Global, UInt64, arc4 -from modules.core_financial.common import CoreFinancialCommonMixin +from modules._core_financial.common import CoreFinancialCommonMixin from smart_contracts import abi_types as typ from smart_contracts import errors as err diff --git a/modules/actus/pbn.py b/modules/_actus/pbn.py similarity index 98% rename from modules/actus/pbn.py rename to modules/_actus/pbn.py index d808e17f..47bc6818 100644 --- a/modules/actus/pbn.py +++ b/modules/_actus/pbn.py @@ -1,6 +1,6 @@ from algopy import Asset, Global, UInt64, arc4 -from modules.core_financial.common import CoreFinancialCommonMixin +from modules._core_financial.common import CoreFinancialCommonMixin from smart_contracts import abi_types as typ from smart_contracts import config as cfg from smart_contracts import errors as err diff --git a/modules/core_financial/__init__.py b/modules/_core_financial/__init__.py similarity index 100% rename from modules/core_financial/__init__.py rename to modules/_core_financial/__init__.py diff --git a/modules/core_financial/common.py b/modules/_core_financial/common.py similarity index 99% rename from modules/core_financial/common.py rename to modules/_core_financial/common.py index 230a7064..b0e7c476 100644 --- a/modules/core_financial/common.py +++ b/modules/_core_financial/common.py @@ -224,7 +224,7 @@ def _configure_asset_terms( time_events: typ.TimeEvents, time_periods: typ.TimePeriods, ) -> None: - self.assert_caller_is_arranger() + self._assert_caller_is_arranger() assert self.status == enums.STATUS_INACTIVE, err.ALREADY_CONFIGURED # Set Denomination Asset @@ -284,7 +284,7 @@ def asset_update(self, *, metadata: typ.AssetMetadata) -> None: # The reference implementation grants the update permissions to the Arranger. # Other implementations may disable D-ASA application updatability or change its authorizations. # ⚠️ WARNING: Application updates must be executed VERY carefully, as they might introduce breaking changes. - self.assert_caller_is_arranger() + self._assert_caller_is_arranger() self.metadata = metadata.bytes @arc4.abimethod @@ -308,7 +308,7 @@ def set_secondary_time_events( INVALID_SECONDARY_OPENING_DATE: Invalid secondary market opening date INVALID_SECONDARY_CLOSURE_DATE: Invalid secondary market closure date """ - self.assert_caller_is_arranger() + self._assert_caller_is_arranger() assert not self.status_is_ended(), err.UNAUTHORIZED self.assert_is_not_asset_defaulted() diff --git a/modules/core_financial/coupon.py b/modules/_core_financial/coupon.py similarity index 100% rename from modules/core_financial/coupon.py rename to modules/_core_financial/coupon.py diff --git a/modules/core_financial/no_coupon.py b/modules/_core_financial/no_coupon.py similarity index 100% rename from modules/core_financial/no_coupon.py rename to modules/_core_financial/no_coupon.py diff --git a/modules/payment_agent/__init__.py b/modules/_payment_agent/__init__.py similarity index 100% rename from modules/payment_agent/__init__.py rename to modules/_payment_agent/__init__.py diff --git a/modules/payment_agent/common.py b/modules/_payment_agent/common.py similarity index 97% rename from modules/payment_agent/common.py rename to modules/_payment_agent/common.py index cd47e1f4..08c3991b 100644 --- a/modules/payment_agent/common.py +++ b/modules/_payment_agent/common.py @@ -1,6 +1,6 @@ from algopy import Account, Global, Txn, UInt64, itxn, op -from modules.core_financial.common import ( +from modules._core_financial.common import ( CoreFinancialCommonMixin, ) from smart_contracts import errors as err diff --git a/modules/payment_agent/coupon.py b/modules/_payment_agent/coupon.py similarity index 100% rename from modules/payment_agent/coupon.py rename to modules/_payment_agent/coupon.py diff --git a/modules/payment_agent/no_principal.py b/modules/_payment_agent/no_principal.py similarity index 79% rename from modules/payment_agent/no_principal.py rename to modules/_payment_agent/no_principal.py index e2c0f4a3..b30b59d0 100644 --- a/modules/payment_agent/no_principal.py +++ b/modules/_payment_agent/no_principal.py @@ -1,4 +1,4 @@ -from modules.core_financial.common import ( +from modules._core_financial.common import ( CoreFinancialCommonMixin, ) diff --git a/modules/payment_agent/principal.py b/modules/_payment_agent/principal.py similarity index 100% rename from modules/payment_agent/principal.py rename to modules/_payment_agent/principal.py diff --git a/modules/transfer_agent/__init__.py b/modules/_transfer_agent/__init__.py similarity index 100% rename from modules/transfer_agent/__init__.py rename to modules/_transfer_agent/__init__.py diff --git a/modules/transfer_agent/common.py b/modules/_transfer_agent/common.py similarity index 93% rename from modules/transfer_agent/common.py rename to modules/_transfer_agent/common.py index 77988c53..03cbc13b 100644 --- a/modules/transfer_agent/common.py +++ b/modules/_transfer_agent/common.py @@ -1,6 +1,6 @@ from algopy import Account, UInt64, op -from modules.core_financial.common import ( +from modules._core_financial.common import ( CoreFinancialCommonMixin, ) from smart_contracts import errors as err diff --git a/modules/transfer_agent/coupon.py b/modules/_transfer_agent/coupon.py similarity index 100% rename from modules/transfer_agent/coupon.py rename to modules/_transfer_agent/coupon.py diff --git a/modules/transfer_agent/no_coupon.py b/modules/_transfer_agent/no_coupon.py similarity index 100% rename from modules/transfer_agent/no_coupon.py rename to modules/_transfer_agent/no_coupon.py diff --git a/modules/actus/kernel.py b/modules/kernel.py similarity index 98% rename from modules/actus/kernel.py rename to modules/kernel.py index d8c3f435..ae4c13db 100644 --- a/modules/actus/kernel.py +++ b/modules/kernel.py @@ -708,7 +708,7 @@ def _emit_execution_event( self._payoff_sign(entry.event_type.as_uint64(), payoff) ), settled_amount=settled_amount, - currency_id=self.settlement_asset_id.id, + currency_id=self.settlement_asset_id, sequence=entry.event_id + UInt64(1), ) ) @@ -1021,7 +1021,7 @@ def contract_config( INVALID_IED: IED must be set in the future INVALID_SORTING: Time events are not sorted correctly """ - self.assert_caller_is_arranger() + self._assert_caller_is_arranger() # Configure Contract self.contract_type = terms.contract_type.as_uint64() @@ -1048,7 +1048,7 @@ def contract_schedule( page is stored. At that point `schedule_entry_count` is finalized and the contract moves to `STATUS_PENDING_IED`. """ - self.assert_caller_is_arranger() + self._assert_caller_is_arranger() self._store_contract_schedule_page( contract_type=self.contract_type, @@ -1066,9 +1066,9 @@ def execute_ied(self) -> UInt64: `STATUS_PENDING_IED` to `STATUS_ACTIVE`. """ self._assert_configured() - self.assert_caller_is_arranger() - self.assert_is_not_asset_defaulted() - self.assert_is_not_asset_suspended() + self._assert_caller_is_arranger() + self._assert_is_not_asset_defaulted() + self._assert_is_not_asset_suspended() assert self.event_cursor < self.schedule_entry_count, err.INVALID_EVENT_CURSOR entry = self._get_schedule_entry(self.event_cursor) @@ -1104,12 +1104,12 @@ def apply_non_cash_event( nominal rate; other non-cash events stay arranger-controlled. """ self._assert_configured() - self.assert_is_not_asset_defaulted() - self.assert_is_not_asset_suspended() + self._assert_is_not_asset_defaulted() + self._assert_is_not_asset_suspended() if payload.flags & UInt64(enums.FLAG_OBSERVED_EVENT): assert self._supports_observed_events(), err.OBSERVED_EVENT_REQUIRED - self.assert_caller_is_arranger() + self._assert_caller_is_arranger() self._append_observed_event(payload) assert event_id == self.event_cursor, err.INVALID_EVENT_CURSOR @@ -1119,9 +1119,9 @@ def apply_non_cash_event( ), err.INVALID_EVENT_TYPE assert entry.event_type != arc4.UInt8(enums.EVT_IED), err.INVALID_EVENT_TYPE if self._event_is_rate_reset(entry.event_type.as_uint64()): - self.assert_caller_is_observer() + self._assert_caller_is_observer() else: - self.assert_caller_is_arranger() + self._assert_caller_is_arranger() self._apply_non_cash_schedule_entry(entry, payload) return Global.latest_timestamp diff --git a/smart_contracts/fixed_coupon_bond/contract.py b/smart_contracts/fixed_coupon_bond/contract.py index 1311cbcd..03b4d113 100644 --- a/smart_contracts/fixed_coupon_bond/contract.py +++ b/smart_contracts/fixed_coupon_bond/contract.py @@ -1,14 +1,14 @@ from algopy import StateTotals, Txn -from modules.actus import PAMCoreMixin -from modules.core_financial import ( +from modules._actus import PAMCoreMixin +from modules._core_financial import ( FixedCouponCashflowMixin, ) -from modules.payment_agent import ( +from modules._payment_agent import ( CouponPaymentAgentMixin, PrincipalPaymentAgentMixin, ) -from modules.transfer_agent import CouponTransferAgentMixin +from modules._transfer_agent import CouponTransferAgentMixin from smart_contracts import errors as err from . import config as cfg diff --git a/smart_contracts/perpetual_bond/contract.py b/smart_contracts/perpetual_bond/contract.py index c4d66499..c6c4da5f 100644 --- a/smart_contracts/perpetual_bond/contract.py +++ b/smart_contracts/perpetual_bond/contract.py @@ -1,12 +1,12 @@ from algopy import StateTotals, Txn -from modules.actus import PBNCoreMixin -from modules.core_financial import PerpetualCouponCashflowMixin -from modules.payment_agent import ( +from modules._actus import PBNCoreMixin +from modules._core_financial import PerpetualCouponCashflowMixin +from modules._payment_agent import ( CouponPaymentAgentMixin, NoPrincipalPaymentMixin, ) -from modules.transfer_agent import CouponTransferAgentMixin +from modules._transfer_agent import CouponTransferAgentMixin from smart_contracts import errors as err from . import config as cfg diff --git a/smart_contracts/zero_coupon_bond/contract.py b/smart_contracts/zero_coupon_bond/contract.py index ff4c8515..cc44832a 100644 --- a/smart_contracts/zero_coupon_bond/contract.py +++ b/smart_contracts/zero_coupon_bond/contract.py @@ -1,9 +1,9 @@ from algopy import StateTotals, Txn -from modules.actus import PAMCoreMixin -from modules.core_financial import NoCouponCashflowMixin -from modules.payment_agent import PrincipalPaymentAgentMixin -from modules.transfer_agent import NoCouponTransferAgentMixin +from modules._actus import PAMCoreMixin +from modules._core_financial import NoCouponCashflowMixin +from modules._payment_agent import PrincipalPaymentAgentMixin +from modules._transfer_agent import NoCouponTransferAgentMixin from smart_contracts import errors as err from . import config as cfg From 1867000070e9d2d64e314062cb1e9078b9608756 Mon Sep 17 00:00:00 2001 From: cusma Date: Thu, 12 Mar 2026 16:42:21 +0100 Subject: [PATCH 095/244] chore: private subs --- modules/rbac.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/modules/rbac.py b/modules/rbac.py index 97fb95df..226dc7a4 100644 --- a/modules/rbac.py +++ b/modules/rbac.py @@ -61,7 +61,7 @@ def _role_is_active(self, role_map: typ.RbacRole, role_address: Account) -> bool <= role_map[role_address].role_validity_end ) - def assert_caller_is_arranger(self) -> None: + def _assert_caller_is_arranger(self) -> None: assert self._is_arranger(Txn.sender), err.UNAUTHORIZED def _assert_caller_is_account_manager(self) -> None: @@ -76,13 +76,13 @@ def _assert_caller_is_trustee(self) -> None: def _assert_caller_is_authority(self) -> None: assert self._role_is_active(self.authority, Txn.sender), err.UNAUTHORIZED - def assert_caller_is_observer(self) -> None: + def _assert_caller_is_observer(self) -> None: assert self._role_is_active(self.observer, Txn.sender), err.UNAUTHORIZED - def assert_is_not_asset_defaulted(self) -> None: + def _assert_is_not_asset_defaulted(self) -> None: assert not self.asset_defaulted, err.DEFAULTED - def assert_is_not_asset_suspended(self) -> None: + def _assert_is_not_asset_suspended(self) -> None: assert not self.asset_suspended, err.SUSPENDED def _assert_valid_role(self, role_id: UInt64) -> None: @@ -156,7 +156,7 @@ def rbac_rotate_arranger(self, *, new_arranger: Account) -> UInt64: Returns: Timestamp of the role assignment """ - self.assert_caller_is_arranger() + self._assert_caller_is_arranger() self.arranger.value = new_arranger return Global.latest_timestamp @@ -171,7 +171,7 @@ def rbac_set_op_daemon(self, *, address: Account) -> UInt64: Returns: Timestamp of the role assignment """ - self.assert_caller_is_arranger() + self._assert_caller_is_arranger() self.op_daemon.value = address return Global.latest_timestamp @@ -197,8 +197,8 @@ def rbac_assign_role( INVALID_ROLE_ADDRESS: Invalid account role address """ - self.assert_caller_is_arranger() - self.assert_is_not_asset_defaulted() + self._assert_caller_is_arranger() + self._assert_is_not_asset_defaulted() self._assert_valid_role(role_id.as_uint64()) self._set_role(role_id.as_uint64(), role_address, validity) return Global.latest_timestamp @@ -222,8 +222,8 @@ def rbac_revoke_role(self, *, role_id: arc4.UInt8, role_address: Account) -> UIn INVALID_ROLE_ADDRESS: Invalid account role address """ - self.assert_caller_is_arranger() - self.assert_is_not_asset_defaulted() + self._assert_caller_is_arranger() + self._assert_is_not_asset_defaulted() self._assert_valid_role(role_id.as_uint64()) self._delete_role(role_id.as_uint64(), role_address) return Global.latest_timestamp From 8fc1cf4a6186fef0a5ab8bd335bf9fcd7e9978a7 Mon Sep 17 00:00:00 2001 From: cusma Date: Thu, 12 Mar 2026 16:42:46 +0100 Subject: [PATCH 096/244] feat: payment agent --- modules/__init__.py | 4 +- modules/payment_agent.py | 117 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 120 insertions(+), 1 deletion(-) create mode 100644 modules/payment_agent.py diff --git a/modules/__init__.py b/modules/__init__.py index 02a8de51..28085369 100644 --- a/modules/__init__.py +++ b/modules/__init__.py @@ -1,9 +1,11 @@ from .accounting import AccountingModule -from .actus.kernel import ActusKernelModule +from .kernel import ActusKernelModule +from .payment_agent import PaymentAgent from .rbac import RbacModule __all__ = [ "AccountingModule", "ActusKernelModule", + "PaymentAgent", "RbacModule", ] diff --git a/modules/payment_agent.py b/modules/payment_agent.py new file mode 100644 index 00000000..b1f51758 --- /dev/null +++ b/modules/payment_agent.py @@ -0,0 +1,117 @@ +from algopy import Account, Bytes, Global, Txn, UInt64, arc4, itxn + +from smart_contracts import abi_types as typ +from smart_contracts import errors as err + +from .accounting import AccountingModule + + +class PaymentAgent(AccountingModule): + """Provide ACTUS cashflow funding and holder withdrawal behavior.""" + + def _assert_payment_authorization(self, holding_address: Account) -> None: + """Require the caller to be allowed to trigger a holder payment.""" + if self.op_daemon.value != Global.zero_address: + assert ( + Txn.sender == self.op_daemon.value + or Txn.sender == holding_address + or Txn.sender == self.account[holding_address].payment_address + ), err.UNAUTHORIZED + + def _is_payment_executable(self, holding_address: Account) -> bool: + """Return whether a holder can currently receive an on-chain asset transfer.""" + return ( + self.account[holding_address].payment_address.is_opted_in( + self.settlement_asset_id + ) + and not self.account[holding_address].suspended + ) + + def _assert_enough_funds(self, payment_amount: UInt64) -> None: + """Require the contract to hold at least the requested settlement amount.""" + assert ( + self.settlement_asset_id.balance(Global.current_application_address) + >= payment_amount + ), err.NOT_ENOUGH_FUNDS + + def _pay(self, receiver: Account, amount: UInt64) -> None: + """Send settlement ASA from the app account to a receiver.""" + itxn.AssetTransfer( + xfer_asset=self.settlement_asset_id, + asset_receiver=receiver, + asset_amount=amount, + fee=Global.min_txn_fee, + ).submit() + + @arc4.abimethod + def fund_due_cashflows(self, *, max_event_count: UInt64) -> typ.CashFundingResult: + """Reserve due ACTUS cash events into the escrow-style claim ledger.""" + self._assert_configured() + self._assert_caller_is_arranger() + self._assert_is_not_asset_defaulted() + self._assert_is_not_asset_suspended() + self._assert_initial_exchange_executed() + + processed_events = UInt64(0) + funded_interest = UInt64(0) + funded_principal = UInt64(0) + + while ( + processed_events < max_event_count + and self.event_cursor < self.schedule_entry_count + ): + entry = self._get_schedule_entry(self.event_cursor) + if entry.scheduled_time > Global.latest_timestamp: + break + if not self._event_is_cash(entry.event_type.as_uint64()): + break + + interest_amount, principal_amount = self._apply_cash_entry(entry) + funded_interest += interest_amount + funded_principal += principal_amount + processed_events += UInt64(1) + + assert processed_events > UInt64(0), err.NO_DUE_CASHFLOW + return typ.CashFundingResult( + funded_interest=funded_interest, + funded_principal=funded_principal, + total_funded=funded_interest + funded_principal, + processed_events=processed_events, + timestamp=Global.latest_timestamp, + ) + + @arc4.abimethod + def claim_due_cashflows( + self, + *, + holding_address: Account, + payment_info: Bytes, + ) -> typ.CashClaimResult: + """Withdraw the holder's already funded ACTUS cash entitlements.""" + self._assert_configured() + self._assert_valid_holding_address(holding_address) + self._assert_payment_authorization(holding_address) + self._assert_is_not_asset_defaulted() + self._assert_is_not_asset_suspended() + self._assert_initial_exchange_executed() + + self._ensure_units_activated(holding_address) + self._settle_position(holding_address) + total_amount = self._claimable_total(holding_address) + assert total_amount > UInt64(0), err.NO_DUE_CASHFLOW + + interest_amount = self.account[holding_address].claimable_interest + principal_amount = self.account[holding_address].claimable_principal + + if self._is_payment_executable(holding_address): + self._assert_enough_funds(total_amount) + self._pay(self.account[holding_address].payment_address, total_amount) + interest_amount, principal_amount = self._reset_claimable(holding_address) + + return typ.CashClaimResult( + interest_amount=interest_amount, + principal_amount=principal_amount, + total_amount=interest_amount + principal_amount, + timestamp=Global.latest_timestamp, + context=payment_info, + ) From 443a06e01a6721daf4a7029cd5db46e4407a7eae Mon Sep 17 00:00:00 2001 From: cusma Date: Thu, 12 Mar 2026 16:42:52 +0100 Subject: [PATCH 097/244] feat: transfer agent --- modules/__init__.py | 2 + modules/transfer_agent.py | 77 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+) create mode 100644 modules/transfer_agent.py diff --git a/modules/__init__.py b/modules/__init__.py index 28085369..f33a794a 100644 --- a/modules/__init__.py +++ b/modules/__init__.py @@ -2,10 +2,12 @@ from .kernel import ActusKernelModule from .payment_agent import PaymentAgent from .rbac import RbacModule +from .transfer_agent import TransferAgent __all__ = [ "AccountingModule", "ActusKernelModule", "PaymentAgent", "RbacModule", + "TransferAgent", ] diff --git a/modules/transfer_agent.py b/modules/transfer_agent.py new file mode 100644 index 00000000..4982675a --- /dev/null +++ b/modules/transfer_agent.py @@ -0,0 +1,77 @@ +from algopy import Account, Global, Txn, UInt64, arc4 + +from smart_contracts import errors as err + +from .accounting import AccountingModule + + +class TransferAgent(AccountingModule): + """Provide primary distribution and secondary transfer mechanics.""" + + @arc4.abimethod + def primary_distribution( + self, + *, + holding_address: Account, + units: UInt64, + ) -> UInt64: + """Reserve units for a holder before IED finalizes issuance.""" + self._assert_configured() + self._assert_caller_is_primary_dealer() + self._assert_is_not_asset_defaulted() + self._assert_is_not_asset_suspended() + assert self._status_is_pending_ied(), err.PRIMARY_DISTRIBUTION_CLOSED + self._assert_valid_holding_address(holding_address) + self._assert_is_not_account_suspended(holding_address) + assert units > UInt64(0), err.ZERO_UNITS + assert ( + self.reserved_units_total + units <= self.total_units + ), err.OVER_DISTRIBUTION + if self.initial_exchange_date: + assert ( + Global.latest_timestamp <= self.initial_exchange_date + ), err.PRIMARY_DISTRIBUTION_CLOSED + + self._credit_reserved_units(holding_address, units) + self.reserved_units_total += units + return self.total_units - self.reserved_units_total + + @arc4.abimethod + def transfer( + self, + *, + sender_holding_address: Account, + receiver_holding_address: Account, + units: UInt64, + ) -> UInt64: + """Transfer active units after settling both counterparties to the current cursor. + + Returns the number of units moved. The ACTUS kernel no longer persists a + nominal per-unit value on-chain, so transfer results are unit-based. + """ + self._assert_configured() + self._assert_is_not_asset_defaulted() + self._assert_is_not_asset_suspended() + self._assert_initial_exchange_executed() + self._assert_transfer_window() + + assert Txn.sender == sender_holding_address, err.UNAUTHORIZED + self._assert_valid_holding_address(sender_holding_address) + self._assert_valid_holding_address(receiver_holding_address) + self._assert_is_not_account_suspended(sender_holding_address) + self._assert_is_not_account_suspended(receiver_holding_address) + assert sender_holding_address != receiver_holding_address, err.SELF_TRANSFER + assert units > UInt64(0), err.NULL_TRANSFER + assert units <= self.account[sender_holding_address].units, err.OVER_TRANSFER + + self._assert_no_due_event_pending() + self._ensure_units_activated(sender_holding_address) + self._ensure_units_activated(receiver_holding_address) + self._settle_position(sender_holding_address) + self._settle_position(receiver_holding_address) + self._apply_transfer( + sender_holding_address, + receiver_holding_address, + units, + ) + return units From aeb9a100fd0a84bf5f517f7f9defab69103116c6 Mon Sep 17 00:00:00 2001 From: cusma Date: Thu, 12 Mar 2026 16:47:21 +0100 Subject: [PATCH 098/244] chore: update import path --- modules/__init__.py | 4 ++++ modules/kernel.py | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/modules/__init__.py b/modules/__init__.py index f33a794a..a6468865 100644 --- a/modules/__init__.py +++ b/modules/__init__.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from .accounting import AccountingModule from .kernel import ActusKernelModule from .payment_agent import PaymentAgent @@ -11,3 +13,5 @@ "RbacModule", "TransferAgent", ] + +__version__ = "0.20.0" diff --git a/modules/kernel.py b/modules/kernel.py index ae4c13db..a119cad5 100644 --- a/modules/kernel.py +++ b/modules/kernel.py @@ -36,7 +36,7 @@ op, ) -from modules import RbacModule +from .rbac import RbacModule from smart_contracts import abi_types as typ from smart_contracts import constants as cst from smart_contracts import enums From 9c731fb64fdf3d4b1e6a8a819874b2fb3bcef48f Mon Sep 17 00:00:00 2001 From: cusma Date: Thu, 12 Mar 2026 16:55:49 +0100 Subject: [PATCH 099/244] chore: remove deprecated files --- modules/_actus/pam.py | 81 - modules/_actus/pbn.py | 114 - modules/_core_financial/__init__.py | 15 - modules/_core_financial/common.py | 462 - modules/_core_financial/coupon.py | 536 - modules/_core_financial/no_coupon.py | 137 - modules/_payment_agent/__init__.py | 11 - modules/_payment_agent/common.py | 57 - modules/_payment_agent/coupon.py | 72 - modules/_payment_agent/no_principal.py | 9 - modules/_payment_agent/principal.py | 71 - modules/_transfer_agent/__init__.py | 9 - modules/_transfer_agent/common.py | 21 - modules/_transfer_agent/coupon.py | 53 - modules/_transfer_agent/no_coupon.py | 52 - .../FixedCouponBond.approval.puya.map | 38192 ---------------- .../FixedCouponBond.approval.teal | 4980 -- .../FixedCouponBond.arc56.json | 2048 - .../FixedCouponBond.clear.puya.map | 25 - .../FixedCouponBond.clear.teal | 7 - .../fixed_coupon_bond_client.py | 3966 -- .../MockAccountingModule.approval.puya.map | 7793 ---- .../MockAccountingModule.approval.teal | 1383 - .../MockAccountingModule.arc56.json | 662 - .../MockAccountingModule.clear.puya.map | 25 - .../MockAccountingModule.clear.teal | 7 - .../mock_accounting_module_client.py | 2065 - .../MockRbacModule.approval.puya.map | 5572 --- .../MockRbacModule.approval.teal | 1036 - .../MockRbacModule.arc56.json | 432 - .../MockRbacModule.clear.puya.map | 25 - .../MockRbacModule.clear.teal | 7 - .../mock_rbac_module_client.py | 1532 - .../PerpetualBond.approval.puya.map | 35014 -------------- .../PerpetualBond.approval.teal | 4455 -- .../perpetual_bond/PerpetualBond.arc56.json | 1985 - .../PerpetualBond.clear.puya.map | 25 - .../perpetual_bond/PerpetualBond.clear.teal | 7 - .../perpetual_bond/perpetual_bond_client.py | 3965 -- .../ZeroCouponBond.approval.puya.map | 31961 ------------- .../ZeroCouponBond.approval.teal | 4011 -- .../ZeroCouponBond.arc56.json | 1835 - .../ZeroCouponBond.clear.puya.map | 25 - .../ZeroCouponBond.clear.teal | 7 - .../zero_coupon_bond_client.py | 3675 -- smart_contracts/fixed_coupon_bond/config.py | 9 - smart_contracts/fixed_coupon_bond/contract.py | 36 - .../fixed_coupon_bond/deploy_config.py | 61 - smart_contracts/mixin_composition.py | 353 - smart_contracts/perpetual_bond/config.py | 13 - smart_contracts/perpetual_bond/contract.py | 34 - .../perpetual_bond/deploy_config.py | 61 - smart_contracts/zero_coupon_bond/config.py | 9 - smart_contracts/zero_coupon_bond/contract.py | 30 - .../zero_coupon_bond/deploy_config.py | 61 - tests/test_mixin_composition_guards.py | 137 - 56 files changed, 159226 deletions(-) delete mode 100644 modules/_actus/pam.py delete mode 100644 modules/_actus/pbn.py delete mode 100644 modules/_core_financial/__init__.py delete mode 100644 modules/_core_financial/common.py delete mode 100644 modules/_core_financial/coupon.py delete mode 100644 modules/_core_financial/no_coupon.py delete mode 100644 modules/_payment_agent/__init__.py delete mode 100644 modules/_payment_agent/common.py delete mode 100644 modules/_payment_agent/coupon.py delete mode 100644 modules/_payment_agent/no_principal.py delete mode 100644 modules/_payment_agent/principal.py delete mode 100644 modules/_transfer_agent/__init__.py delete mode 100644 modules/_transfer_agent/common.py delete mode 100644 modules/_transfer_agent/coupon.py delete mode 100644 modules/_transfer_agent/no_coupon.py delete mode 100644 smart_contracts/artifacts/fixed_coupon_bond/FixedCouponBond.approval.puya.map delete mode 100644 smart_contracts/artifacts/fixed_coupon_bond/FixedCouponBond.approval.teal delete mode 100644 smart_contracts/artifacts/fixed_coupon_bond/FixedCouponBond.arc56.json delete mode 100644 smart_contracts/artifacts/fixed_coupon_bond/FixedCouponBond.clear.puya.map delete mode 100644 smart_contracts/artifacts/fixed_coupon_bond/FixedCouponBond.clear.teal delete mode 100644 smart_contracts/artifacts/fixed_coupon_bond/fixed_coupon_bond_client.py delete mode 100644 smart_contracts/artifacts/mock_module_accounting/MockAccountingModule.approval.puya.map delete mode 100644 smart_contracts/artifacts/mock_module_accounting/MockAccountingModule.approval.teal delete mode 100644 smart_contracts/artifacts/mock_module_accounting/MockAccountingModule.arc56.json delete mode 100644 smart_contracts/artifacts/mock_module_accounting/MockAccountingModule.clear.puya.map delete mode 100644 smart_contracts/artifacts/mock_module_accounting/MockAccountingModule.clear.teal delete mode 100644 smart_contracts/artifacts/mock_module_accounting/mock_accounting_module_client.py delete mode 100644 smart_contracts/artifacts/mock_module_rbac/MockRbacModule.approval.puya.map delete mode 100644 smart_contracts/artifacts/mock_module_rbac/MockRbacModule.approval.teal delete mode 100644 smart_contracts/artifacts/mock_module_rbac/MockRbacModule.arc56.json delete mode 100644 smart_contracts/artifacts/mock_module_rbac/MockRbacModule.clear.puya.map delete mode 100644 smart_contracts/artifacts/mock_module_rbac/MockRbacModule.clear.teal delete mode 100644 smart_contracts/artifacts/mock_module_rbac/mock_rbac_module_client.py delete mode 100644 smart_contracts/artifacts/perpetual_bond/PerpetualBond.approval.puya.map delete mode 100644 smart_contracts/artifacts/perpetual_bond/PerpetualBond.approval.teal delete mode 100644 smart_contracts/artifacts/perpetual_bond/PerpetualBond.arc56.json delete mode 100644 smart_contracts/artifacts/perpetual_bond/PerpetualBond.clear.puya.map delete mode 100644 smart_contracts/artifacts/perpetual_bond/PerpetualBond.clear.teal delete mode 100644 smart_contracts/artifacts/perpetual_bond/perpetual_bond_client.py delete mode 100644 smart_contracts/artifacts/zero_coupon_bond/ZeroCouponBond.approval.puya.map delete mode 100644 smart_contracts/artifacts/zero_coupon_bond/ZeroCouponBond.approval.teal delete mode 100644 smart_contracts/artifacts/zero_coupon_bond/ZeroCouponBond.arc56.json delete mode 100644 smart_contracts/artifacts/zero_coupon_bond/ZeroCouponBond.clear.puya.map delete mode 100644 smart_contracts/artifacts/zero_coupon_bond/ZeroCouponBond.clear.teal delete mode 100644 smart_contracts/artifacts/zero_coupon_bond/zero_coupon_bond_client.py delete mode 100644 smart_contracts/fixed_coupon_bond/config.py delete mode 100644 smart_contracts/fixed_coupon_bond/contract.py delete mode 100644 smart_contracts/fixed_coupon_bond/deploy_config.py delete mode 100644 smart_contracts/mixin_composition.py delete mode 100644 smart_contracts/perpetual_bond/config.py delete mode 100644 smart_contracts/perpetual_bond/contract.py delete mode 100644 smart_contracts/perpetual_bond/deploy_config.py delete mode 100644 smart_contracts/zero_coupon_bond/config.py delete mode 100644 smart_contracts/zero_coupon_bond/contract.py delete mode 100644 smart_contracts/zero_coupon_bond/deploy_config.py delete mode 100644 tests/test_mixin_composition_guards.py diff --git a/modules/_actus/pam.py b/modules/_actus/pam.py deleted file mode 100644 index 9c41ae97..00000000 --- a/modules/_actus/pam.py +++ /dev/null @@ -1,81 +0,0 @@ -# pyright: reportMissingModuleSource=false -from algopy import Account, Asset, Global, UInt64, arc4 - -from modules._core_financial.common import CoreFinancialCommonMixin -from smart_contracts import abi_types as typ -from smart_contracts import errors as err - - -class PAMCoreMixin(CoreFinancialCommonMixin): - """Principal at Maturity (PAM) core.""" - - def __init__(self) -> None: - super().__init__() - - def assert_pay_principal_authorization(self, holding_address: Account) -> None: - # The reference implementation does not restrict caller authorization - assert self.status_is_active(), err.UNAUTHORIZED - self.assert_is_not_asset_defaulted() - self.assert_is_not_asset_suspended() - self.assert_valid_holding_address(holding_address) - units = self.account[holding_address].units - assert units > 0, err.NO_UNITS - assert Global.latest_timestamp >= self.maturity_date, err.NOT_MATURE - # The reference implementation does not assert if there is enough liquidity to repay the principal to all - - @arc4.abimethod - def asset_config( - self, - *, - denomination_asset_id: Asset, - settlement_asset_id: Asset, - principal: UInt64, - principal_discount: UInt64, - minimum_denomination: UInt64, - day_count_convention: arc4.UInt8, - interest_rate: arc4.UInt16, - coupon_rates: typ.CouponRates, - time_events: typ.TimeEvents, - time_periods: typ.TimePeriods, - ) -> None: - """ - Configure the Debt Algorand Standard Application - - Args: - denomination_asset_id: Denomination asset identifier - settlement_asset_id: Settlement asset identifier - principal: Principal, expressed in denomination asset - principal_discount: Principal discount in bps - minimum_denomination: Minimum denomination, expressed in denomination asset - day_count_convention: Day-count convention for interests calculation - interest_rate: Interest rate in bps - coupon_rates: Coupon interest rates in bps - time_events: Time events (strictly ascending order) - time_periods: Time periods of recurring time events - - Raises: - UNAUTHORIZED: Not authorized - ALREADY_CONFIGURED: D-ASA already configured - INVALID_MINIMUM_DENOMINATION: Minimum denomination is not a divisor of principal - INVALID_DAY_COUNT_CONVENTION: Invalid day-count convention ID - INVALID_TIME_EVENTS_LENGTH: Time events length is invalid - INVALID_TIME: Time events must be set in the future - INVALID_SORTING: Time events are not sorted correctly - INVALID_TIME_PERIOD_DURATION: Time period durations must be greater than zero - INVALID_SETTLEMENT_ASSET: Different settlement asset not supported, must be equal to denomination asset - INVALID_TIME_PERIODS: Time periods not properly set - INVALID_TIME_PERIOD_REPETITIONS: Time period repetitions not properly set - INVALID_COUPON_RATES: Coupon rates not properly set - """ - self._configure_asset_terms( - denomination_asset_id=denomination_asset_id, - settlement_asset_id=settlement_asset_id, - principal=principal, - principal_discount=principal_discount, - minimum_denomination=minimum_denomination, - day_count_convention=day_count_convention, - interest_rate=interest_rate, - coupon_rates=coupon_rates, - time_events=time_events, - time_periods=time_periods, - ) diff --git a/modules/_actus/pbn.py b/modules/_actus/pbn.py deleted file mode 100644 index 47bc6818..00000000 --- a/modules/_actus/pbn.py +++ /dev/null @@ -1,114 +0,0 @@ -from algopy import Asset, Global, UInt64, arc4 - -from modules._core_financial.common import CoreFinancialCommonMixin -from smart_contracts import abi_types as typ -from smart_contracts import config as cfg -from smart_contracts import errors as err - - -class PBNCoreMixin(CoreFinancialCommonMixin): - """Perpetual Bond (PBN) core.""" - - def __init__(self) -> None: - super().__init__() - - def assert_time_schedule_limits(self, time_events: typ.TimeEvents) -> None: - # PBN has no maturity date in the static schedule - assert ( - time_events.length == self.total_coupons + 3 - ), err.INVALID_TIME_EVENTS_LENGTH - - def set_time_events(self, time_events: typ.TimeEvents) -> None: - self.time_events.value = time_events.copy() - self.primary_distribution_opening_date = time_events[ - cfg.PRIMARY_DISTRIBUTION_OPENING_DATE_IDX - ] - self.primary_distribution_closure_date = time_events[ - cfg.PRIMARY_DISTRIBUTION_CLOSURE_DATE_IDX - ] - self.issuance_date = time_events[cfg.ISSUANCE_DATE_IDX] - self.maturity_date = UInt64(0) - - @arc4.abimethod - def asset_config( - self, - *, - denomination_asset_id: Asset, - settlement_asset_id: Asset, - principal: UInt64, - principal_discount: UInt64, - minimum_denomination: UInt64, - day_count_convention: arc4.UInt8, - interest_rate: arc4.UInt16, - coupon_rates: typ.CouponRates, - time_events: typ.TimeEvents, - time_periods: typ.TimePeriods, - ) -> None: - """ - Configure the Debt Algorand Standard Application - - Args: - denomination_asset_id: Denomination asset identifier - settlement_asset_id: Settlement asset identifier - principal: Principal, expressed in denomination asset - principal_discount: Principal discount in bps - minimum_denomination: Minimum denomination, expressed in denomination asset - day_count_convention: Day-count convention for interests calculation - interest_rate: Interest rate in bps - coupon_rates: Coupon interest rates in bps - time_events: Time events (strictly ascending order) - time_periods: Time periods of recurring time events - - Raises: - UNAUTHORIZED: Not authorized - ALREADY_CONFIGURED: D-ASA already configured - INVALID_MINIMUM_DENOMINATION: Minimum denomination is not a divisor of principal - INVALID_DAY_COUNT_CONVENTION: Invalid day-count convention ID - INVALID_TIME_EVENTS_LENGTH: Time events length is invalid - INVALID_TIME: Time events must be set in the future - INVALID_SORTING: Time events are not sorted correctly - INVALID_TIME_PERIOD_DURATION: Time period durations must be greater than zero - INVALID_SETTLEMENT_ASSET: Different settlement asset not supported, must be equal to denomination asset - INVALID_TIME_PERIODS: Time periods not properly set - INVALID_TIME_PERIOD_REPETITIONS: Time period repetitions not properly set - INVALID_COUPON_RATES: Coupon rates not properly set - """ - self._configure_asset_terms( - denomination_asset_id=denomination_asset_id, - settlement_asset_id=settlement_asset_id, - principal=principal, - principal_discount=principal_discount, - minimum_denomination=minimum_denomination, - day_count_convention=day_count_convention, - interest_rate=interest_rate, - coupon_rates=coupon_rates, - time_events=time_events, - time_periods=time_periods, - ) - - @arc4.abimethod - def update_interest_rate(self, *, interest_rate: arc4.UInt16) -> UInt64: - """ - Update variable interest rates in bps - - Args: - interest_rate: Interest rate in bps - - Returns: - Timestamp of the update - - Raises: - UNAUTHORIZED: Not authorized - DEFAULTED: Defaulted - SUSPENDED: Suspended operations - PENDING_COUPON_PAYMENT: Pending due coupon payment - """ - self.assert_caller_is_interest_oracle() - self.assert_is_not_asset_defaulted() - self.assert_is_not_asset_suspended() - due_coupons = self.count_due_coupons() - assert self.all_due_coupons_paid(due_coupons), err.PENDING_COUPON_PAYMENT - - # Update interest rate - self.interest_rate = interest_rate.as_uint64() - return Global.latest_timestamp diff --git a/modules/_core_financial/__init__.py b/modules/_core_financial/__init__.py deleted file mode 100644 index 801fc5c3..00000000 --- a/modules/_core_financial/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -from .common import CoreFinancialCommonMixin -from .coupon import ( - CouponCashflowMixin, - FixedCouponCashflowMixin, - PerpetualCouponCashflowMixin, -) -from .no_coupon import NoCouponCashflowMixin - -__all__ = [ - "CoreFinancialCommonMixin", - "CouponCashflowMixin", - "FixedCouponCashflowMixin", - "NoCouponCashflowMixin", - "PerpetualCouponCashflowMixin", -] diff --git a/modules/_core_financial/common.py b/modules/_core_financial/common.py deleted file mode 100644 index b0e7c476..00000000 --- a/modules/_core_financial/common.py +++ /dev/null @@ -1,462 +0,0 @@ -from algopy import ( - Account, - Asset, - Box, - Bytes, - Global, - OpUpFeeSource, - Txn, - UInt64, - arc4, - ensure_budget, - itxn, - op, - urange, -) - -from modules.accounting import AccountingModule -from smart_contracts import abi_types as typ -from smart_contracts import config as cfg -from smart_contracts import constants as cst -from smart_contracts import enums -from smart_contracts import errors as err - - -class CoreFinancialCommonMixin(AccountingModule): - """Common financial core shared by Maturities and Non-Maturities variants.""" - - def __init__(self) -> None: - super().__init__() - - # Asset Configuration - self.denomination_asset_id = Asset() - self.settlement_asset_id = Asset() - self.unit_value = UInt64() - self.day_count_convention = UInt64() - - # Metadata - self.metadata = Bytes() - - # Principal / Rates - self.principal_discount = UInt64() - self.interest_rate = UInt64() - self.total_coupons = UInt64() - - # Time Schedule - self.time_events = Box(typ.TimeEvents, key=cst.BOX_ID_TIME_EVENTS) - self.primary_distribution_opening_date = UInt64() - self.primary_distribution_closure_date = UInt64() - self.issuance_date = UInt64() - self.secondary_market_opening_date = UInt64() - self.secondary_market_closure_date = UInt64() - self.maturity_date = UInt64() - - def assert_denomination_asset(self, denomination_asset_id: Asset) -> None: - # The reference implementation has on-chain denomination with ASA - _creator, exists = op.AssetParamsGet.asset_creator(denomination_asset_id) - assert exists, err.INVALID_DENOMINATION - - def set_denomination_asset(self, denomination_asset_id: Asset) -> None: - self.denomination_asset_id = denomination_asset_id - - def assert_settlement_asset(self, settlement_asset_id: Asset) -> None: - # The reference implementation settlement asset is the denomination asset - assert ( - settlement_asset_id == self.denomination_asset_id - ), err.INVALID_SETTLEMENT_ASSET - - def set_settlement_asset(self, settlement_asset_id: Asset) -> None: - self.settlement_asset_id = settlement_asset_id - # The reference implementation has on-chain settlement with ASA - itxn.AssetTransfer( - xfer_asset=self.settlement_asset_id, - asset_receiver=Global.current_application_address, - asset_amount=0, - fee=Global.min_txn_fee, - ).submit() - - def assert_day_count_convention(self, day_count_convention: UInt64) -> None: - # The reference implementation supports only the Actual/Actual and Continuous day-count conventions - assert day_count_convention in ( - UInt64(cst.DCC_A_A), - UInt64(cst.DCC_CONT), - ), err.INVALID_DAY_COUNT_CONVENTION - - def set_day_count_convention(self, day_count_convention: UInt64) -> None: - self.day_count_convention = day_count_convention - - def assert_interest_rate(self, interest_rate: UInt64) -> None: - # This subroutine must be used after the principal discount has been set - if not self.principal_discount: - assert interest_rate > UInt64(0), err.INVALID_INTEREST_RATE - - def set_interest_rate(self, interest_rate: UInt64) -> None: - self.interest_rate = interest_rate - - def assert_coupon_rates(self, coupon_rates: typ.CouponRates) -> None: - assert not coupon_rates.length, err.INVALID_COUPON_RATES - - def set_coupon_rates(self, coupon_rates: typ.CouponRates) -> None: - self.total_coupons = coupon_rates.length - - def assert_time_schedule_limits(self, time_events: typ.TimeEvents) -> None: - assert ( - time_events.length == self.total_coupons + cfg.TIME_SCHEDULE_LIMITS - ), err.INVALID_TIME_EVENTS_LENGTH - - def assert_time_events_sorted(self, time_events: typ.TimeEvents) -> None: - assert ( - time_events[cfg.PRIMARY_DISTRIBUTION_OPENING_DATE_IDX] - > Global.latest_timestamp - ), err.INVALID_TIME - for idx in urange(time_events.length - 1): - ensure_budget( - required_budget=UInt64(cfg.OP_UP_TIME_EVENT_SORTING), - fee_source=OpUpFeeSource.AppAccount, - ) - time_i = time_events[idx] - time_f = time_events[idx + 1] - assert time_f > time_i, err.INVALID_SORTING - if self.day_count_convention != UInt64(cst.DCC_CONT): - # The reference implementation requires time periods expressed in days for regular day-count conventions - assert (time_f - time_i) % UInt64( - cst.DAY_2_SEC - ) == 0, err.INVALID_TIME_PERIOD - - def set_time_events(self, time_events: typ.TimeEvents) -> None: - self.time_events.value = time_events.copy() - self.primary_distribution_opening_date = time_events[ - cfg.PRIMARY_DISTRIBUTION_OPENING_DATE_IDX - ] - self.primary_distribution_closure_date = time_events[ - cfg.PRIMARY_DISTRIBUTION_CLOSURE_DATE_IDX - ] - self.issuance_date = time_events[cfg.ISSUANCE_DATE_IDX] - self.maturity_date = time_events[cfg.MATURITY_DATE_IDX] - - def assert_time_periods(self, time_periods: typ.TimePeriods) -> None: - assert not time_periods.length, err.INVALID_TIME_PERIODS - - def set_time_periods(self, time_periods: typ.TimePeriods) -> None: - pass - - def assert_is_primary_distribution_open(self) -> None: - assert ( - self.status_is_active() - and self.primary_distribution_opening_date - <= Global.latest_timestamp - < self.primary_distribution_closure_date - ), err.PRIMARY_DISTRIBUTION_CLOSED - - def assert_is_secondary_market_open(self) -> None: - assert ( - self.status_is_active() - and self.secondary_market_opening_date <= Global.latest_timestamp - and ( - not self.secondary_market_closure_date - or Global.latest_timestamp < self.secondary_market_closure_date - ) - ), err.SECONDARY_MARKET_CLOSED - - def days_in(self, time_period: UInt64) -> UInt64: - return time_period // UInt64(cst.DAY_2_SEC) - - def assert_asset_transfer_authorization( - self, - sender_holding_address: Account, - receiver_holding_address: Account, - ) -> None: - # The reference implementation grants transfer right to D-ASA owners. Other implementations may relay on other - # roles, external Apps through C2C calls (e.g., an order book), or off-chain transfer agents. - assert Txn.sender == sender_holding_address, err.UNAUTHORIZED - self.assert_is_not_asset_defaulted() - self.assert_is_not_asset_suspended() - self.assert_valid_holding_address(sender_holding_address) - self.assert_valid_holding_address(receiver_holding_address) - self.assert_is_not_account_suspended(sender_holding_address) - self.assert_is_not_account_suspended(receiver_holding_address) - - def assert_asset_transfer_preconditions( - self, - sender_holding_address: Account, - receiver_holding_address: Account, - units: UInt64, - ) -> None: - self.assert_is_secondary_market_open() - self.assert_asset_transfer_authorization( - sender_holding_address, - receiver_holding_address, - ) - assert sender_holding_address != receiver_holding_address, err.SELF_TRANSFER - assert units > 0, err.NULL_TRANSFER - assert units <= self.account[sender_holding_address].units, err.OVER_TRANSFER - self.assert_fungible_transfer( - sender_holding_address, - receiver_holding_address, - ) - - def update_supply_after_principal_payment(self, holding_address: Account) -> None: - self.circulating_units -= self.account[holding_address].units - self.account[holding_address].units = UInt64() - self.end_if_no_circulating_units() - - # Hook defaults for feature-specialized mixins. - def count_due_coupons(self) -> UInt64: - op.err(err.INVALID_MIXIN_COMPOSITION) - - def all_due_coupons_paid(self, _due_coupons: UInt64) -> bool: - op.err(err.INVALID_MIXIN_COMPOSITION) - - def assert_pay_principal_authorization(self, _holding_address: Account) -> None: - op.err(err.INVALID_MIXIN_COMPOSITION) - - def _configure_asset_terms( - self, - *, - denomination_asset_id: Asset, - settlement_asset_id: Asset, - principal: UInt64, - principal_discount: UInt64, - minimum_denomination: UInt64, - day_count_convention: arc4.UInt8, - interest_rate: arc4.UInt16, - coupon_rates: typ.CouponRates, - time_events: typ.TimeEvents, - time_periods: typ.TimePeriods, - ) -> None: - self._assert_caller_is_arranger() - assert self.status == enums.STATUS_INACTIVE, err.ALREADY_CONFIGURED - - # Set Denomination Asset - self.assert_denomination_asset(denomination_asset_id) - self.set_denomination_asset(denomination_asset_id) - - # Set Settlement Asset - self.assert_settlement_asset(settlement_asset_id) - self.set_settlement_asset(settlement_asset_id) - - # Set Principal and Minimum Denomination - assert principal % minimum_denomination == 0, err.INVALID_MINIMUM_DENOMINATION - self.unit_value = minimum_denomination - self.total_units = principal // minimum_denomination - self.principal_discount = principal_discount - - # Set Day-Count Convention - self.assert_day_count_convention(day_count_convention.as_uint64()) - self.set_day_count_convention(day_count_convention.as_uint64()) - - # Set Interest Rate - self.assert_interest_rate(interest_rate.as_uint64()) - self.set_interest_rate(interest_rate.as_uint64()) - - # Set Coupons - self.assert_coupon_rates(coupon_rates) - self.set_coupon_rates(coupon_rates) - - # Set Time Events - self.assert_time_schedule_limits(time_events) - self.assert_time_events_sorted(time_events) - self.set_time_events(time_events) - - # Set Time Periods - self.assert_time_periods(time_periods) - self.set_time_periods(time_periods) - - self.status = UInt64(enums.STATUS_ACTIVE) - - @arc4.abimethod(create="require") - def asset_create(self, *, arranger: Account, metadata: typ.AssetMetadata) -> None: - """ - Create a new D-ASA - - Args: - arranger: D-ASA Arranger Address - metadata: D-ASA metadata - """ - self.arranger.value = arranger - self.metadata = metadata.bytes - - @arc4.abimethod(allow_actions=["UpdateApplication"]) - def asset_update(self, *, metadata: typ.AssetMetadata) -> None: - """ - Update D-ASA application. - """ - # The reference implementation grants the update permissions to the Arranger. - # Other implementations may disable D-ASA application updatability or change its authorizations. - # ⚠️ WARNING: Application updates must be executed VERY carefully, as they might introduce breaking changes. - self._assert_caller_is_arranger() - self.metadata = metadata.bytes - - @arc4.abimethod - def set_secondary_time_events( - self, *, secondary_market_time_events: typ.TimeEvents - ) -> typ.SecondaryMarketSchedule: - """ - Set secondary market time schedule - - Args: - secondary_market_time_events: Secondary market time events (strictly ascending order) - - Returns: - Secondary Market Opening Date, Secondary Market Closure Date - - Raises: - UNAUTHORIZED: Not authorized - DEFAULTED: Defaulted - INVALID_TIME_EVENTS_LENGTH: Time events length is invalid - INVALID_SORTING: Time events are not sorted correctly - INVALID_SECONDARY_OPENING_DATE: Invalid secondary market opening date - INVALID_SECONDARY_CLOSURE_DATE: Invalid secondary market closure date - """ - self._assert_caller_is_arranger() - assert not self.status_is_ended(), err.UNAUTHORIZED - self.assert_is_not_asset_defaulted() - - assert secondary_market_time_events.length >= 1, err.INVALID_TIME_EVENTS_LENGTH - if secondary_market_time_events.length > 1: - self.assert_time_events_sorted(secondary_market_time_events) - - assert ( - self.issuance_date - <= secondary_market_time_events[cfg.SECONDARY_MARKET_OPENING_DATE_IDX] - ), err.INVALID_SECONDARY_OPENING_DATE - self.secondary_market_opening_date = secondary_market_time_events[ - cfg.SECONDARY_MARKET_OPENING_DATE_IDX - ] - if self.maturity_date: - assert ( - self.maturity_date - >= secondary_market_time_events[cfg.SECONDARY_MARKET_CLOSURE_DATE_IDX] - ), err.INVALID_SECONDARY_CLOSURE_DATE - self.secondary_market_closure_date = secondary_market_time_events[ - cfg.SECONDARY_MARKET_CLOSURE_DATE_IDX - ] - return typ.SecondaryMarketSchedule( - secondary_market_opening_date=self.secondary_market_opening_date, - secondary_market_closure_date=self.secondary_market_closure_date, - ) - - @arc4.abimethod - def set_default_status(self, *, defaulted: bool) -> UInt64: - """ - Set D-ASA default status - - Args: - defaulted: Default status - - Raises: - UNAUTHORIZED: Not authorized - """ - - self.assert_caller_is_trustee() - self.asset_defaulted = defaulted - return Global.latest_timestamp - - @arc4.abimethod - def primary_distribution( - self, *, holding_address: Account, units: UInt64 - ) -> UInt64: - """ - Distribute D-ASA units to accounts according the primary market - - Args: - holding_address: Account Holding Address - units: Amount of D-ASA units to distribute - - Returns: - Remaining D-ASA units to be distributed - - Raises: - UNAUTHORIZED: Not authorized - DEFAULTED: Defaulted - SUSPENDED: Suspended operations - INVALID_HOLDING_ADDRESS: Invalid account holding address - ZERO_UNITS: Cannot distribute zero units - OVER_DISTRIBUTION: Insufficient remaining D-ASA units - PRIMARY_DISTRIBUTION_CLOSED: Primary distribution is closed - """ - self.assert_is_primary_distribution_open() - # The reference implementation grants primary distribution permissions to the Primary Dealer role. Other - # implementations may relay on other roles or external Apps through C2C calls (e.g., an auction). - self.assert_caller_is_primary_dealer() - self.assert_valid_holding_address(holding_address) - self.assert_is_not_asset_defaulted() - self.assert_is_not_asset_suspended() - assert units > 0, err.ZERO_UNITS - assert self.circulating_units + units <= self.total_units, err.OVER_DISTRIBUTION - - self.circulating_units += units - self.account[holding_address].units += units - self.account[holding_address].unit_value = self.unit_value - return self.total_units - self.circulating_units - - @arc4.abimethod(readonly=True) - def get_asset_info(self) -> typ.AssetInfo: - """ - Get D-ASA info - - Returns: - Denomination asset ID, Settlement asset ID, Outstanding principal, Unit nominal value, Day-count convention, - Interest rate, Total supply, Circulating supply, Primary distribution opening date, Primary distribution - closure date, Issuance date, Maturity date, Suspended, Performance - """ - performance = UInt64(cst.PRF_PERFORMANT) - if Global.latest_timestamp > self.maturity_date > 0: - performance = UInt64(cst.PRF_MATURED) - # The reference implementation has no grace or delinquency periods - if self.asset_defaulted: - performance = UInt64(cst.PRF_DEFAULTED) - - return typ.AssetInfo( - denomination_asset_id=self.denomination_asset_id.id, - settlement_asset_id=self.settlement_asset_id.id, - outstanding_principal=self.outstanding_principal(), - unit_value=self.unit_value, - day_count_convention=arc4.UInt8(self.day_count_convention), - principal_discount=arc4.UInt16(self.principal_discount), - interest_rate=arc4.UInt16(self.interest_rate), - total_supply=self.total_units, - circulating_supply=self.circulating_units, - primary_distribution_opening_date=self.primary_distribution_opening_date, - primary_distribution_closure_date=self.primary_distribution_closure_date, - issuance_date=self.issuance_date, - maturity_date=self.maturity_date, - suspended=self.asset_suspended, - performance=arc4.UInt8(performance), - ) - - @arc4.abimethod(readonly=True) - def get_time_events(self) -> typ.TimeEvents: - """ - Get D-ASA time events - - Returns: - Time events - """ - time_events = typ.TimeEvents() - if self.status_is_active(): - time_events = self.time_events.value.copy() - return time_events - - @arc4.abimethod(readonly=True) - def get_secondary_market_schedule(self) -> typ.TimeEvents: - """ - Get secondary market schedule - - Returns: - Secondary market schedule - """ - return typ.TimeEvents( - (self.secondary_market_opening_date, self.secondary_market_closure_date) - ) - - @arc4.abimethod(readonly=True) - def get_asset_metadata(self) -> typ.AssetMetadata: - """ - Get D-ASA metadata - - Returns: - Contract type, Calendar, Business day convention, End of month convention, Early repayment effect, Early - repayment penalty type, Prospectus hash, Prospectus URL - """ - return typ.AssetMetadata.from_bytes(self.metadata) diff --git a/modules/_core_financial/coupon.py b/modules/_core_financial/coupon.py deleted file mode 100644 index 281adca7..00000000 --- a/modules/_core_financial/coupon.py +++ /dev/null @@ -1,536 +0,0 @@ -from algopy import ( - Account, - Box, - Global, - OpUpFeeSource, - UInt64, - arc4, - ensure_budget, -) - -from smart_contracts import abi_types as typ -from smart_contracts import config as fixed_cfg -from smart_contracts import constants as cst -from smart_contracts import errors as err - -from .common import CoreFinancialCommonMixin - - -class CouponCashflowMixin(CoreFinancialCommonMixin): - """Coupon cashflow primitives shared by PAM+coupon and PBN+coupon products.""" - - def __init__(self) -> None: - super().__init__() - self.paid_coupon_units = UInt64() - - def all_due_coupons_paid(self, due_coupons: UInt64) -> bool: - return self.paid_coupon_units >= self.circulating_units * due_coupons - - def assert_no_pending_coupon_payment( - self, holding_address: Account, due_coupons: UInt64 - ) -> None: - assert ( - self.account[holding_address].paid_coupons == due_coupons - ), err.PENDING_COUPON_PAYMENT - - def core_prepare_coupon_payment( - self, holding_address: Account - ) -> tuple[UInt64, UInt64]: - assert self.status_is_active(), err.UNAUTHORIZED - self.assert_is_not_asset_defaulted() - self.assert_is_not_asset_suspended() - self.assert_valid_holding_address(holding_address) - - units = self.account[holding_address].units - assert units > 0, err.NO_UNITS - - due_coupons = self.count_due_coupons() - account_paid_coupons = self.account[holding_address].paid_coupons - assert due_coupons > account_paid_coupons, err.NO_DUE_COUPON - # The following conditions verify if other accounts are still waiting for the payment of previous coupons - assert self.all_due_coupons_paid( - account_paid_coupons - ), err.PENDING_COUPON_PAYMENT - - payment_amount = self._compute_coupon_payment_amount( - holding_address, account_paid_coupons - ) - return payment_amount, units - - def core_apply_coupon_payment( - self, holding_address: Account, units: UInt64 - ) -> None: - self.account[holding_address].paid_coupons += 1 - self.paid_coupon_units += units - - def core_prepare_transfer_with_coupon( - self, sender_holding_address: Account, units: UInt64 - ) -> UInt64: - # Transfer is forbidden in case of pending coupon payments - due_coupons = self.count_due_coupons() - self.assert_no_pending_coupon_payment(sender_holding_address, due_coupons) - return self.accrued_interest_amount(sender_holding_address, units, due_coupons) - - def core_prepare_principal_payment(self, holding_address: Account) -> UInt64: - self.assert_pay_principal_authorization(holding_address) - # Principal payment is forbidden in case of pending coupon payments - assert self.all_due_coupons_paid( - self.count_due_coupons() - ), err.PENDING_COUPON_PAYMENT - return self.account_total_units_value(holding_address) - - def core_apply_principal_payment(self, holding_address: Account) -> None: - self.update_supply_after_principal_payment(holding_address) - - def _compute_coupon_payment_amount( - self, _holding_address: Account, _account_paid_coupons: UInt64 - ) -> UInt64: - return UInt64() - - def accrued_interest_amount( - self, _holding_address: Account, _units: UInt64, _due_coupons: UInt64 - ) -> UInt64: - return UInt64() - - -class FixedCouponCashflowMixin(CouponCashflowMixin): - """Coupon cashflow formulas and getters for PAM+coupon (fixed coupon bond).""" - - def __init__(self) -> None: - super().__init__() - self.coupon_rates = Box(typ.CouponRates, key=cst.BOX_ID_COUPON_RATES) - self.due_coupons_watermark = UInt64() - - def assert_coupon_rates(self, coupon_rates: typ.CouponRates) -> None: - assert coupon_rates.length, err.INVALID_COUPON_RATES - - def set_coupon_rates(self, coupon_rates: typ.CouponRates) -> None: - self.total_coupons = coupon_rates.length - self.coupon_rates.value = coupon_rates.copy() - - def count_due_coupons(self) -> UInt64: - current_ts = Global.latest_timestamp - due_coupons = self.due_coupons_watermark - if current_ts >= self.maturity_date: - due_coupons = self.total_coupons - elif current_ts > self.issuance_date: - coupon_idx = ( - UInt64(fixed_cfg.FIRST_COUPON_DATE_IDX) + self.due_coupons_watermark - ) - coupon_due_date = self.time_events.value[coupon_idx] - while current_ts >= coupon_due_date: - ensure_budget( - required_budget=UInt64(fixed_cfg.OP_UP_COUPON_DUE_COUNTING), - fee_source=OpUpFeeSource.GroupCredit, - ) - coupon_idx += 1 - coupon_due_date = self.time_events.value[coupon_idx] - due_coupons = coupon_idx - fixed_cfg.FIRST_COUPON_DATE_IDX - self.due_coupons_watermark = due_coupons - return due_coupons - - def coupon_due_date(self, coupon: UInt64) -> UInt64: - return self.time_events.value[fixed_cfg.FIRST_COUPON_DATE_IDX + coupon - 1] - - def latest_coupon_due_date(self, due_coupons: UInt64) -> UInt64: - coupon_due_date = UInt64() - if due_coupons >= UInt64(1): - coupon_due_date = self.coupon_due_date(due_coupons) - return coupon_due_date - - def next_coupon_due_date(self, due_coupons: UInt64) -> UInt64: - coupon_due_date = UInt64() - if due_coupons < self.total_coupons: - coupon_due_date = self.coupon_due_date(due_coupons + 1) - return coupon_due_date - - def coupon_interest_amount( - self, principal_amount: UInt64, coupon: UInt64 - ) -> UInt64: - coupon_rate_bps = self.coupon_rates.value[coupon - 1].as_uint64() - return principal_amount * coupon_rate_bps // cst.BPS - - def day_count_factor(self, due_coupons: UInt64) -> typ.DayCountFactor: - # The reference implementation supports only the Actual/Actual and Continuous day-count conventions - if not due_coupons: - accruing_start_time = self.issuance_date - else: - accruing_start_time = self.latest_coupon_due_date(due_coupons) - coupon_accrued_period = Global.latest_timestamp - accruing_start_time - coupon_period = self.next_coupon_due_date(due_coupons) - accruing_start_time - if self.day_count_convention == UInt64(cst.DCC_A_A): - coupon_accrued_period = self.days_in(coupon_accrued_period) - coupon_period = self.days_in(coupon_period) - return typ.DayCountFactor( - numerator=coupon_accrued_period, - denominator=coupon_period, - ) - - def is_accruing_interest(self, due_coupons: UInt64) -> bool: - return ( - self.issuance_date != 0 - and Global.latest_timestamp >= self.issuance_date - and due_coupons < self.total_coupons - ) - - def accrued_interest_amount( - self, holding_address: Account, units: UInt64, due_coupons: UInt64 - ) -> UInt64: - # The following assert safeguards the subroutine from forbidden invocations - self.assert_no_pending_coupon_payment(holding_address, due_coupons) - day_count_factor = self.day_count_factor(due_coupons) - coupon_accrued_period = day_count_factor.numerator - coupon_period = day_count_factor.denominator - next_coupon_rate_bps = self.coupon_rates.value[due_coupons].as_uint64() - # due_coupons is equal to the 0-base idx of next coupon - return ( - self.account_units_value(holding_address, units) - * next_coupon_rate_bps - * coupon_accrued_period - // (cst.BPS * coupon_period) - ) # div-by-zero: coupon_period != 0 due to assert_time_events_sorted checks - - def _compute_coupon_payment_amount( - self, holding_address: Account, account_paid_coupons: UInt64 - ) -> UInt64: - return self.coupon_interest_amount( - self.account_total_units_value(holding_address), - account_paid_coupons + 1, - ) - - @arc4.abimethod(readonly=True) - def get_account_units_current_value( - self, *, holding_address: Account, units: UInt64 - ) -> typ.CurrentUnitsValue: - """ - Get account's units current value and accrued interest - - Args: - holding_address: Account Holding Address - units: Account's units for the current value calculation - - Returns: - Units current value in denomination asset, Accrued interest in denomination asset - - Raises: - NO_PRIMARY_DISTRIBUTION: Primary distribution not yet executed - INVALID_HOLDING_ADDRESS: Invalid account holding address - INVALID_UNITS: Invalid amount of units for the account - PENDING_COUPON_PAYMENT: Pending due coupon payment for the account - """ - assert ( - self.primary_distribution_opening_date - and Global.latest_timestamp >= self.primary_distribution_opening_date - ), err.NO_PRIMARY_DISTRIBUTION - self.assert_valid_holding_address(holding_address) - assert 0 < units <= self.account[holding_address].units, err.INVALID_UNITS - - # Value during primary distribution and at maturity - account_units_nominal_value = self.account_units_value(holding_address, units) - # Accruing interest during primary distribution and at maturity - accrued_interest = UInt64() - numerator = UInt64() - denominator = UInt64() - - # Accruing interest - due_coupons = self.count_due_coupons() - self.assert_no_pending_coupon_payment(holding_address, due_coupons) - if self.is_accruing_interest(due_coupons): - day_count_factor = self.day_count_factor(due_coupons) - accrued_interest = self.accrued_interest_amount( - holding_address, units, due_coupons - ) - numerator = day_count_factor.numerator - denominator = day_count_factor.denominator - - return typ.CurrentUnitsValue( - units_value=account_units_nominal_value, - accrued_interest=accrued_interest, - day_count_factor=typ.DayCountFactor( - numerator=numerator, - denominator=denominator, - ), - ) - - @arc4.abimethod(readonly=True) - def get_coupon_rates(self) -> typ.CouponRates: - """ - Get D-ASA coupon rates - - Returns: - Coupon rates - """ - coupon_rates = typ.CouponRates() - if self.status_is_active(): - coupon_rates = self.coupon_rates.value.copy() - return coupon_rates - - @arc4.abimethod(readonly=True) - def get_payment_amount(self, *, holding_address: Account) -> typ.PaymentAmounts: - """ - Get the next payment amount - - Args: - holding_address: Account Holding Address - - Returns: - Interest amount in denomination asset, Principal amount in denomination asset - - Raises: - INVALID_HOLDING_ADDRESS: Invalid account holding address - """ - self.assert_valid_holding_address(holding_address) - interest_amount = UInt64() - principal_amount = UInt64() - if self.status_is_active(): - paid_coupons = self.account[holding_address].paid_coupons - if paid_coupons < self.total_coupons: - # Coupon Payment - interest_amount = self.coupon_interest_amount( - self.account_total_units_value(holding_address), - paid_coupons + 1, - ) - else: - # Principal Payment - principal_amount = self.account_total_units_value(holding_address) - return typ.PaymentAmounts( - interest=interest_amount, - principal=principal_amount, - ) - - @arc4.abimethod(readonly=True) - def get_coupons_status(self) -> typ.CouponsInfo: - """ - Get D-ASA coupons status - - Returns: - Total coupons, Due coupons, Next coupon due date, (Day count factor numerator, - Day count factor denominator), All due coupons paid - """ - due_coupons = self.count_due_coupons() - next_coupon_due_date = self.next_coupon_due_date(due_coupons) - all_due_coupons_paid = self.all_due_coupons_paid(due_coupons) - numerator = UInt64() - denominator = UInt64() - if self.is_accruing_interest(due_coupons): - day_count_factor = self.day_count_factor(due_coupons) - numerator = day_count_factor.numerator - denominator = day_count_factor.denominator - return typ.CouponsInfo( - total_coupons=self.total_coupons, - due_coupons=due_coupons, - next_coupon_due_date=next_coupon_due_date, - day_count_factor=typ.DayCountFactor( - numerator=numerator, - denominator=denominator, - ), - all_due_coupons_paid=all_due_coupons_paid, - ) - - -class PerpetualCouponCashflowMixin(CouponCashflowMixin): - """Coupon cashflow formulas and getters for PBN+coupon (perpetual bond).""" - - def __init__(self) -> None: - super().__init__() - self.time_periods = Box(typ.TimePeriods, key=cst.BOX_ID_TIME_PERIODS) - self.coupon_period = UInt64() - - def assert_time_periods(self, time_periods: typ.TimePeriods) -> None: - # The perpetual bond defines a single time period for the coupon duration with unlimited repetitions - assert time_periods.length == UInt64(1), err.INVALID_TIME_PERIODS - coupon_period_duration = time_periods[0][0] - repetitions = time_periods[0][1] - assert coupon_period_duration > UInt64(0), err.INVALID_TIME_PERIOD_DURATION - assert repetitions == UInt64(0), err.INVALID_TIME_PERIOD_REPETITIONS - - def set_time_periods(self, time_periods: typ.TimePeriods) -> None: - self.time_periods.value = time_periods.copy() - self.coupon_period = self.time_periods.value[0][0] - - def count_due_coupons(self) -> UInt64: - due_coupons = UInt64(0) - current_ts = Global.latest_timestamp - if current_ts > self.issuance_date: - due_coupons = (current_ts - self.issuance_date) // self.coupon_period - # div-by-zero: coupon_period != 0 due to assert_time_periods checks - return due_coupons - - def coupon_due_date(self, coupon: UInt64) -> UInt64: - return self.issuance_date + coupon * self.coupon_period - - def latest_coupon_due_date(self, due_coupons: UInt64) -> UInt64: - coupon_due_date = UInt64() - if due_coupons >= UInt64(1): - coupon_due_date = self.coupon_due_date(due_coupons) - return coupon_due_date - - def next_coupon_due_date(self, due_coupons: UInt64) -> UInt64: - return self.coupon_due_date(due_coupons + 1) - - def coupon_interest_amount( - self, principal_amount: UInt64, _coupon: UInt64 - ) -> UInt64: - return principal_amount * self.interest_rate // cst.BPS - - def day_count_factor(self, due_coupons: UInt64) -> typ.DayCountFactor: - # The reference implementation supports only the Actual/Actual and Continuous day-count conventions - if not due_coupons: - accruing_start_time = self.issuance_date - else: - accruing_start_time = self.latest_coupon_due_date(due_coupons) - coupon_accrued_period = Global.latest_timestamp - accruing_start_time - coupon_period = self.coupon_period - if self.day_count_convention == UInt64(cst.DCC_A_A): - coupon_accrued_period = self.days_in(coupon_accrued_period) - coupon_period = self.days_in(coupon_period) - return typ.DayCountFactor( - numerator=coupon_accrued_period, - denominator=coupon_period, - ) - - def is_accruing_interest(self, _due_coupons: UInt64) -> bool: - return self.issuance_date != 0 and Global.latest_timestamp > self.issuance_date - - def accrued_interest_amount( - self, holding_address: Account, units: UInt64, due_coupons: UInt64 - ) -> UInt64: - # The following assert safeguards the subroutine from forbidden invocations - self.assert_no_pending_coupon_payment(holding_address, due_coupons) - day_count_factor = self.day_count_factor(due_coupons) - coupon_accrued_period = day_count_factor.numerator - coupon_period = day_count_factor.denominator - return ( - self.account_units_value(holding_address, units) - * self.interest_rate - * coupon_accrued_period - // (cst.BPS * coupon_period) - ) # div-by-zero: coupon_period != 0 due to assert_time_periods checks - - def _compute_coupon_payment_amount( - self, holding_address: Account, _account_paid_coupons: UInt64 - ) -> UInt64: - return self.coupon_interest_amount( - self.account_total_units_value(holding_address), UInt64(1) - ) - - @arc4.abimethod(readonly=True) - def get_account_units_current_value( - self, *, holding_address: Account, units: UInt64 - ) -> typ.CurrentUnitsValue: - """ - Get account's units current value and accrued interest - - Args: - holding_address: Account Holding Address - units: Account's units for the current value calculation - - Returns: - Units current value in denomination asset, Accrued interest in denomination asset - - Raises: - NO_PRIMARY_DISTRIBUTION: Primary distribution not yet executed - INVALID_HOLDING_ADDRESS: Invalid account holding address - INVALID_UNITS: Invalid amount of units for the account - PENDING_COUPON_PAYMENT: Pending due coupon payment for the account - """ - assert ( - self.primary_distribution_opening_date - and Global.latest_timestamp >= self.primary_distribution_opening_date - ), err.NO_PRIMARY_DISTRIBUTION - self.assert_valid_holding_address(holding_address) - assert 0 < units <= self.account[holding_address].units, err.INVALID_UNITS - - # Value during primary distribution - account_units_nominal_value = self.account_units_value(holding_address, units) - # Accruing interest during primary distribution - accrued_interest = UInt64() - numerator = UInt64() - denominator = UInt64() - - # Accruing interest - due_coupons = self.count_due_coupons() - self.assert_no_pending_coupon_payment(holding_address, due_coupons) - if self.is_accruing_interest(due_coupons): - day_count_factor = self.day_count_factor(due_coupons) - accrued_interest = self.accrued_interest_amount( - holding_address, units, due_coupons - ) - numerator = day_count_factor.numerator - denominator = day_count_factor.denominator - - return typ.CurrentUnitsValue( - units_value=account_units_nominal_value, - accrued_interest=accrued_interest, - day_count_factor=typ.DayCountFactor( - numerator=numerator, - denominator=denominator, - ), - ) - - @arc4.abimethod(readonly=True) - def get_payment_amount(self, *, holding_address: Account) -> typ.PaymentAmounts: - """ - Get the next payment amount - - Args: - holding_address: Account Holding Address - - Returns: - Interest amount in denomination asset, Principal amount in denomination asset - - Raises: - INVALID_HOLDING_ADDRESS: Invalid account holding address - """ - self.assert_valid_holding_address(holding_address) - interest_amount = ( - self.account_total_units_value(holding_address) - * self.interest_rate - // cst.BPS - ) - return typ.PaymentAmounts( - interest=interest_amount, - principal=UInt64(0), - ) - - @arc4.abimethod(readonly=True) - def get_coupons_status(self) -> typ.CouponsInfo: - """ - Get D-ASA coupons status - - Returns: - Total coupons, Due coupons, Next coupon due date, (Day count factor numerator, - Day count factor denominator), All due coupons paid - """ - due_coupons = self.count_due_coupons() if self.status_is_active() else UInt64() - next_coupon_due_date = self.next_coupon_due_date(due_coupons) - all_due_coupons_paid = self.all_due_coupons_paid(due_coupons) - numerator = UInt64() - denominator = UInt64() - if self.is_accruing_interest(due_coupons): - day_count_factor = self.day_count_factor(due_coupons) - numerator = day_count_factor.numerator - denominator = day_count_factor.denominator - return typ.CouponsInfo( - total_coupons=self.total_coupons, - due_coupons=due_coupons, - next_coupon_due_date=next_coupon_due_date, - day_count_factor=typ.DayCountFactor( - numerator=numerator, - denominator=denominator, - ), - all_due_coupons_paid=all_due_coupons_paid, - ) - - @arc4.abimethod(readonly=True) - def get_time_periods(self) -> typ.TimePeriods: - """ - Get D-ASA time periods - - Returns: - Time periods - """ - time_periods = typ.TimePeriods() - if self.status_is_active(): - time_periods = self.time_periods.value.copy() - return time_periods diff --git a/modules/_core_financial/no_coupon.py b/modules/_core_financial/no_coupon.py deleted file mode 100644 index 3453fb28..00000000 --- a/modules/_core_financial/no_coupon.py +++ /dev/null @@ -1,137 +0,0 @@ -from algopy import Account, Global, UInt64, arc4 - -from smart_contracts import abi_types as typ -from smart_contracts import constants as cst -from smart_contracts import errors as err - -from .common import CoreFinancialCommonMixin - - -class NoCouponCashflowMixin(CoreFinancialCommonMixin): - """Cashflow computation for products without coupons.""" - - def assert_interest_rate(self, interest_rate: UInt64) -> None: - # This subroutine must be used after the principal discount has been set - assert interest_rate == UInt64(0), err.INVALID_INTEREST_RATE - - def day_count_factor(self) -> typ.DayCountFactor: - # The reference implementation supports only the Actual/Actual and Continuous day-count conventions - accrued_period = Global.latest_timestamp - self.issuance_date - principal_period = self.maturity_date - self.issuance_date - if self.day_count_convention == UInt64(cst.DCC_A_A): - accrued_period = self.days_in(accrued_period) - principal_period = self.days_in(principal_period) - return typ.DayCountFactor( - numerator=accrued_period, - denominator=principal_period, - ) - - def is_accruing_interest(self) -> bool: - # The check on maturity date ensures D-ASA has been configured as block timestamp cannot be less than 0 (init). - return self.issuance_date <= Global.latest_timestamp < self.maturity_date - - def accrued_interest_amount( - self, holding_address: Account, units: UInt64 - ) -> UInt64: - day_count_factor = self.day_count_factor() - accrued_period = day_count_factor.numerator - principal_period = day_count_factor.denominator - return ( - self.account_units_value(holding_address, units) - * self.principal_discount - * accrued_period - // (cst.BPS * principal_period) - ) # div-by-zero: principal_period != 0 due to assert_time_events_sorted checks - - def core_prepare_transfer_no_coupon( - self, sender_holding_address: Account, units: UInt64 - ) -> UInt64: - return self.accrued_interest_amount(sender_holding_address, units) - - def core_prepare_principal_payment(self, holding_address: Account) -> UInt64: - self.assert_pay_principal_authorization(holding_address) - return self.account_total_units_value(holding_address) - - def core_apply_principal_payment(self, holding_address: Account) -> None: - self.update_supply_after_principal_payment(holding_address) - - @arc4.abimethod(readonly=True) - def get_account_units_current_value( - self, *, holding_address: Account, units: UInt64 - ) -> typ.CurrentUnitsValue: - """ - Get account's units current value and accrued interest - - Args: - holding_address: Account Holding Address - units: Account's units for the current value calculation - - Returns: - Units current value in denomination asset, Accrued interest in denomination asset - - Raises: - NO_PRIMARY_DISTRIBUTION: Primary distribution not yet executed - INVALID_HOLDING_ADDRESS: Invalid account holding address - INVALID_UNITS: Invalid amount of units for the account - """ - assert ( - self.primary_distribution_opening_date - and Global.latest_timestamp >= self.primary_distribution_opening_date - ), err.NO_PRIMARY_DISTRIBUTION - self.assert_valid_holding_address(holding_address) - assert 0 < units <= self.account[holding_address].units, err.INVALID_UNITS - - account_units_nominal_value = self.account_units_value(holding_address, units) - account_units_discount = ( - account_units_nominal_value * self.principal_discount // cst.BPS - ) - # Value during primary distribution - account_units_current_value = ( - account_units_nominal_value - account_units_discount - ) - - # Accruing interest during primary distribution and at maturity - accrued_interest = UInt64() - numerator = UInt64() - denominator = UInt64() - - # Accruing interest - if self.is_accruing_interest(): - day_count_factor = self.day_count_factor() - accrued_interest = self.accrued_interest_amount(holding_address, units) - numerator = day_count_factor.numerator - denominator = day_count_factor.denominator - - # Value at maturity - if Global.latest_timestamp >= self.maturity_date: - account_units_current_value = account_units_nominal_value - - return typ.CurrentUnitsValue( - units_value=account_units_current_value, - accrued_interest=accrued_interest, - day_count_factor=typ.DayCountFactor( - numerator=numerator, - denominator=denominator, - ), - ) - - @arc4.abimethod(readonly=True) - def get_payment_amount(self, *, holding_address: Account) -> typ.PaymentAmounts: - """ - Get the next payment amount - - Args: - holding_address: Account Holding Address - - Returns: - Interest amount in denomination asset, Principal amount in denomination asset - - Raises: - INVALID_HOLDING_ADDRESS: Invalid account holding address - INVALID_PAYMENT_INDEX: Invalid 1-based payment index - """ - self.assert_valid_holding_address(holding_address) - principal_amount = UInt64() - if self.status_is_active(): - principal_amount = self.account_total_units_value(holding_address) - return typ.PaymentAmounts(interest=UInt64(0), principal=principal_amount) diff --git a/modules/_payment_agent/__init__.py b/modules/_payment_agent/__init__.py deleted file mode 100644 index d620a1f6..00000000 --- a/modules/_payment_agent/__init__.py +++ /dev/null @@ -1,11 +0,0 @@ -from .common import PaymentAgentCommonMixin -from .coupon import CouponPaymentAgentMixin -from .no_principal import NoPrincipalPaymentMixin -from .principal import PrincipalPaymentAgentMixin - -__all__ = [ - "CouponPaymentAgentMixin", - "NoPrincipalPaymentMixin", - "PaymentAgentCommonMixin", - "PrincipalPaymentAgentMixin", -] diff --git a/modules/_payment_agent/common.py b/modules/_payment_agent/common.py deleted file mode 100644 index 08c3991b..00000000 --- a/modules/_payment_agent/common.py +++ /dev/null @@ -1,57 +0,0 @@ -from algopy import Account, Global, Txn, UInt64, itxn, op - -from modules._core_financial.common import ( - CoreFinancialCommonMixin, -) -from smart_contracts import errors as err - - -class PaymentAgentCommonMixin(CoreFinancialCommonMixin): - """Settlement execution helpers used by payment methods.""" - - def assert_payment_authorization(self, holding_address: Account) -> None: - if self.op_daemon.value != Global.zero_address: - assert ( - Txn.sender == self.op_daemon.value - or Txn.sender == holding_address - or Txn.sender == self.account[holding_address].payment_address - ), err.UNAUTHORIZED - - def is_payment_executable(self, holding_address: Account) -> bool: - return ( - self.account[holding_address].payment_address.is_opted_in( - self.settlement_asset_id - ) - and not self.account[holding_address].suspended - ) - - def assert_enough_funds(self, payment_amount: UInt64) -> None: - assert ( - self.settlement_asset_id.balance(Global.current_application_address) - >= payment_amount - ), err.NOT_ENOUGH_FUNDS - - def pay(self, receiver: Account, amount: UInt64) -> None: - itxn.AssetTransfer( - xfer_asset=self.settlement_asset_id, - asset_receiver=receiver, - asset_amount=amount, - fee=Global.min_txn_fee, - ).submit() - - # Hook defaults, implemented by core cashflow mixins. - def core_prepare_coupon_payment( - self, _holding_address: Account - ) -> tuple[UInt64, UInt64]: - op.err(err.INVALID_MIXIN_COMPOSITION) - - def core_apply_coupon_payment( - self, _holding_address: Account, _units: UInt64 - ) -> None: - op.err(err.INVALID_MIXIN_COMPOSITION) - - def core_prepare_principal_payment(self, _holding_address: Account) -> UInt64: - op.err(err.INVALID_MIXIN_COMPOSITION) - - def core_apply_principal_payment(self, _holding_address: Account) -> None: - op.err(err.INVALID_MIXIN_COMPOSITION) diff --git a/modules/_payment_agent/coupon.py b/modules/_payment_agent/coupon.py deleted file mode 100644 index 0304739f..00000000 --- a/modules/_payment_agent/coupon.py +++ /dev/null @@ -1,72 +0,0 @@ -from algopy import Account, Bytes, Global, String, UInt64, arc4 - -from smart_contracts import abi_types as typ -from smart_contracts import enums -from smart_contracts.events import Event - -from .common import PaymentAgentCommonMixin - - -class CouponPaymentAgentMixin(PaymentAgentCommonMixin): - """Executes coupon cashflows computed by the core financial module.""" - - def _emit_ip(self, *, payoff: UInt64) -> None: - """Emit Interest Payment (IP) event.""" - arc4.emit( - Event( - contract_id=Global.current_application_id.id, - type=arc4.UInt8(enums.EVT_TYPE_IP), - type_name=String("IP"), - time=Global.latest_timestamp, - payoff=payoff, - currency_id=self.denomination_asset_id.id, - currency_unit=self.denomination_asset_id.unit_name, - nominal_value=self.circulating_units * self.unit_value, - nominal_rate_bps=arc4.UInt16(0), # TODO: Add interest rate - nominal_accrued=UInt64(0), - ) - ) - - @arc4.abimethod - def pay_coupon( - self, *, holding_address: Account, payment_info: Bytes - ) -> typ.PaymentResult: - """ - Pay due coupon to an account - - Args: - holding_address: Account Holding Address - payment_info: Additional payment information (Optional) - - Returns: - Paid coupon amount in denomination asset, Payment timestamp, Payment context - - Raises: - UNAUTHORIZED: Not authorized - DEFAULTED: Defaulted - SUSPENDED: Suspended operations - INVALID_HOLDING_ADDRESS: Invalid account holding address - NO_UNITS: No D-ASA units - NO_DUE_COUPON: No due coupon to pay - PENDING_COUPON_PAYMENT: Pending due coupon payment - """ - payment_amount, units = self.core_prepare_coupon_payment(holding_address) - self.assert_payment_authorization(holding_address) - # The reference implementation does not assert if there is enough liquidity to pay current due coupon to all - - if self.is_payment_executable(holding_address): - # The reference implementation has on-chain payment agent - self.assert_enough_funds(payment_amount) - # The reference implementation has the same asset for denomination and settlement, no conversion needed - self.pay(self.account[holding_address].payment_address, payment_amount) - else: - # Accounts suspended or not opted in at the time of payments must not stall the D-ASA - payment_amount = UInt64() - - self.core_apply_coupon_payment(holding_address, units) - self._emit_ip(payoff=payment_amount) - return typ.PaymentResult( - amount=payment_amount, - timestamp=Global.latest_timestamp, - context=payment_info, # TODO: Add info on failed payment - ) diff --git a/modules/_payment_agent/no_principal.py b/modules/_payment_agent/no_principal.py deleted file mode 100644 index b30b59d0..00000000 --- a/modules/_payment_agent/no_principal.py +++ /dev/null @@ -1,9 +0,0 @@ -from modules._core_financial.common import ( - CoreFinancialCommonMixin, -) - - -class NoPrincipalPaymentMixin(CoreFinancialCommonMixin): - """Marker mixin for non-redeemable products (no pay_principal ABI).""" - - pass diff --git a/modules/_payment_agent/principal.py b/modules/_payment_agent/principal.py deleted file mode 100644 index d1430e8b..00000000 --- a/modules/_payment_agent/principal.py +++ /dev/null @@ -1,71 +0,0 @@ -from algopy import Account, Bytes, Global, String, UInt64, arc4 - -from smart_contracts import abi_types as typ -from smart_contracts import enums -from smart_contracts.events import Event - -from .common import PaymentAgentCommonMixin - - -class PrincipalPaymentAgentMixin(PaymentAgentCommonMixin): - """Executes principal cashflows computed by the core financial module.""" - - def _emit_pr(self, *, payoff: UInt64) -> None: - """Emit Principal Redemption (PR) event.""" - arc4.emit( - Event( - contract_id=Global.current_application_id.id, - type=arc4.UInt8(enums.EVT_TYPE_PR), - type_name=String("PR"), - time=Global.latest_timestamp, - payoff=payoff, - currency_id=self.denomination_asset_id.id, - currency_unit=self.denomination_asset_id.unit_name, - nominal_value=self.circulating_units * self.unit_value, - nominal_rate_bps=arc4.UInt16(0), - nominal_accrued=UInt64(0), - ) - ) - - @arc4.abimethod - def pay_principal( - self, *, holding_address: Account, payment_info: Bytes - ) -> typ.PaymentResult: - """ - Pay the outstanding principal to an account - - Args: - holding_address: Account Holding Address - payment_info: Additional payment information (Optional) - - Returns: - Paid principal amount in denomination asset, Payment timestamp, Payment context - - Raises: - UNAUTHORIZED: Not authorized - DEFAULTED: Defaulted - SUSPENDED: Suspended operations - INVALID_HOLDING_ADDRESS: Invalid account holding address - NO_UNITS: No D-ASA units - NOT_MATURE: Not mature - """ - payment_amount = self.core_prepare_principal_payment(holding_address) - self.assert_payment_authorization(holding_address) - # The reference implementation does not assert if there is enough liquidity to pay the principal to all - - if self.is_payment_executable(holding_address): - # The reference implementation has on-chain payment agent - self.assert_enough_funds(payment_amount) - # The reference implementation has the same asset for denomination and settlement, no conversion needed - self.pay(self.account[holding_address].payment_address, payment_amount) - else: - # Accounts suspended or not opted in at the time of payments must not stall the D-ASA - payment_amount = UInt64() - - self.core_apply_principal_payment(holding_address) - self._emit_pr(payoff=payment_amount) - return typ.PaymentResult( - amount=payment_amount, - timestamp=Global.latest_timestamp, - context=payment_info, # TODO: Add info on failed payment - ) diff --git a/modules/_transfer_agent/__init__.py b/modules/_transfer_agent/__init__.py deleted file mode 100644 index 7158d668..00000000 --- a/modules/_transfer_agent/__init__.py +++ /dev/null @@ -1,9 +0,0 @@ -from .common import TransferAgentCommonMixin -from .coupon import CouponTransferAgentMixin -from .no_coupon import NoCouponTransferAgentMixin - -__all__ = [ - "CouponTransferAgentMixin", - "NoCouponTransferAgentMixin", - "TransferAgentCommonMixin", -] diff --git a/modules/_transfer_agent/common.py b/modules/_transfer_agent/common.py deleted file mode 100644 index 03cbc13b..00000000 --- a/modules/_transfer_agent/common.py +++ /dev/null @@ -1,21 +0,0 @@ -from algopy import Account, UInt64, op - -from modules._core_financial.common import ( - CoreFinancialCommonMixin, -) -from smart_contracts import errors as err - - -class TransferAgentCommonMixin(CoreFinancialCommonMixin): - """Ownership transfer helpers shared across transfer-agent variants.""" - - # Hook defaults, implemented by core cashflow mixins. - def core_prepare_transfer_no_coupon( - self, _sender_holding_address: Account, _units: UInt64 - ) -> UInt64: - op.err(err.INVALID_MIXIN_COMPOSITION) - - def core_prepare_transfer_with_coupon( - self, _sender_holding_address: Account, _units: UInt64 - ) -> UInt64: - op.err(err.INVALID_MIXIN_COMPOSITION) diff --git a/modules/_transfer_agent/coupon.py b/modules/_transfer_agent/coupon.py deleted file mode 100644 index e0052faa..00000000 --- a/modules/_transfer_agent/coupon.py +++ /dev/null @@ -1,53 +0,0 @@ -from algopy import Account, UInt64, arc4 - -from .common import TransferAgentCommonMixin - - -class CouponTransferAgentMixin(TransferAgentCommonMixin): - """Transfers ownership for products with coupon payment ordering constraints.""" - - @arc4.abimethod - def asset_transfer( - self, - *, - sender_holding_address: Account, - receiver_holding_address: Account, - units: UInt64, - ) -> UInt64: - """ - Transfer D-ASA units between accounts - - Args: - sender_holding_address: Sender Account Holding Address - receiver_holding_address: Receiver Account Holding Address - units: Amount of D-ASA units to transfer - - Returns: - Transferred actualized value in denomination asset - - Raises: - UNAUTHORIZED: Not authorized - DEFAULTED: Defaulted - SUSPENDED: Suspended operations - INVALID_HOLDING_ADDRESS: Invalid account holding address - SECONDARY_MARKET_CLOSED: Secondary market is closed - SELF_TRANSFER: Sender and receiver must be different - NULL_TRANSFER: Transfer units must be greater than zero - OVER_TRANSFER: Insufficient sender units to transfer - NON_FUNGIBLE_UNITS: Sender and receiver units are not fungible - PENDING_COUPON_PAYMENT: Pending due coupon payment - """ - self.assert_asset_transfer_preconditions( - sender_holding_address, - receiver_holding_address, - units, - ) - - # Transferred units value (must be computed before the transfer) - sender_unit_value = self.account[sender_holding_address].unit_value - accrued_interest = self.core_prepare_transfer_with_coupon( - sender_holding_address, units - ) - - self.transfer_units(sender_holding_address, receiver_holding_address, units) - return units * sender_unit_value + accrued_interest diff --git a/modules/_transfer_agent/no_coupon.py b/modules/_transfer_agent/no_coupon.py deleted file mode 100644 index 8b7213c7..00000000 --- a/modules/_transfer_agent/no_coupon.py +++ /dev/null @@ -1,52 +0,0 @@ -from algopy import Account, UInt64, arc4 - -from .common import TransferAgentCommonMixin - - -class NoCouponTransferAgentMixin(TransferAgentCommonMixin): - """Transfers ownership for products without coupon gating.""" - - @arc4.abimethod - def asset_transfer( - self, - *, - sender_holding_address: Account, - receiver_holding_address: Account, - units: UInt64, - ) -> UInt64: - """ - Transfer D-ASA units between accounts - - Args: - sender_holding_address: Sender Account Holding Address - receiver_holding_address: Receiver Account Holding Address - units: Amount of D-ASA units to transfer - - Returns: - Transferred actualized value in denomination asset - - Raises: - UNAUTHORIZED: Not authorized - DEFAULTED: Defaulted - SUSPENDED: Suspended operations - INVALID_HOLDING_ADDRESS: Invalid account holding address - SECONDARY_MARKET_CLOSED: Secondary market is closed - SELF_TRANSFER: Sender and receiver must be different - NULL_TRANSFER: Transfer units must be greater than zero - OVER_TRANSFER: Insufficient sender units to transfer - NON_FUNGIBLE_UNITS: Sender and receiver units are not fungible - """ - self.assert_asset_transfer_preconditions( - sender_holding_address, - receiver_holding_address, - units, - ) - - # Transferred units value (must be computed before the transfer) - sender_unit_value = self.account[sender_holding_address].unit_value - accrued_interest = self.core_prepare_transfer_no_coupon( - sender_holding_address, units - ) - - self.transfer_units(sender_holding_address, receiver_holding_address, units) - return units * sender_unit_value + accrued_interest diff --git a/smart_contracts/artifacts/fixed_coupon_bond/FixedCouponBond.approval.puya.map b/smart_contracts/artifacts/fixed_coupon_bond/FixedCouponBond.approval.puya.map deleted file mode 100644 index b7c88c8d..00000000 --- a/smart_contracts/artifacts/fixed_coupon_bond/FixedCouponBond.approval.puya.map +++ /dev/null @@ -1,38192 +0,0 @@ -{ - "version": 3, - "sources": [ - "../../../modules/accounting.py", - "../../../modules/actus/pam.py", - "../../../modules/core_financial/common.py", - "../../../modules/core_financial/coupon.py", - "../../../modules/payment_agent/common.py", - "../../../modules/payment_agent/coupon.py", - "../../../modules/payment_agent/principal.py", - "../../../modules/rbac.py", - "../../../modules/transfer_agent/coupon.py", - "../../fixed_coupon_bond/contract.py" - ], - "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AO8BmD;;AAAf;;AAA5B;AAC4C;;AAAf;;AAA7B;AAgBA;;AAAuB;AAAvB;AACA;;AAAuB;AAAvB;AP9BA;;AAAmB;AAAnB;AACA;AAAyB;AAAzB;AACA;;AAAkB;AAAlB;AACA;AAAc;AAAd;AEUA;;AAA6B;AAA7B;AACA;;AAA2B;AAA3B;AACA;;AAAkB;AAAlB;AACA;;AAA4B;AAA5B;AAGA;;AAAgB;;AAAhB;AAGA;;AAA0B;AAA1B;AACA;;AAAqB;AAArB;AACA;;AAAqB;AAArB;AAIA;;AAAyC;AAAzC;AACA;;AAAyC;AAAzC;AACA;;AAAqB;AAArB;AACA;;AAAqC;AAArC;AACA;;AAAqC;AAArC;AACA;;AAAqB;AAArB;AC5BA;;AAAyB;AAAzB;AA8EA;;AAA6B;AAA7B;AMrEO;;AAA6B;;AAA7B;AAAP;AACO;;AAAuB;;AAAvB;AAAP;AACO;;AAAA;AAAP;AACO;;AAAA;AAAP;AAnBR;;;;;;AAAA;;;AAAA;;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;;;;;;AAAA;;;AAAA;;;;AAAA;APsQK;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AD7PA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;ACyMG;;;AACO;AAAA;AAAA;AAAA;AAAA;AAAP;AA5KmB;;AAAA;;AAAA;;AACnB;AAGA;;AAAA;;AAAA;AAKI;;AAAA;;AAAA;AADJ;AAKA;;AAAA;;AAAA;AAEA;AAIQ;;AAFW;;AACF;;;;;;;;;AAHjB;;;;;;AAAA;AAwKO;;AAAA;;AAAA;AAAA;AAAP;AACA;;AAAA;;AAAA;AACmB;;AAAA;;AAAA;AAAnB;;AAAA;AAAA;AACA;;AAAA;;AAAA;AAGiC;AAAA;AArK1B;;;AAAA;AAEH;;AAFG;AAAA;;;;AAAP;AAMA;;AAAA;;AAAA;AAmK0B;;AAAA;AAAA;;AA/JnB;AAAA;;AAAA;AAAA;AAAf;;;AACY;;AAAA;AAGJ;;AAAA;;AAAA;ACWA;;AAAA;AAAA;AAGA;;AAAA;;AAAA;AACA;;AAAA;;AAAA;;AAAA;;AAAA;ADL+C;;AAArB;AAAtB;;AAAA;AADJ;AA2JA;;AAAA;;;AAnIA;;AAAA;;AAAA;;AAAA;;AAAA;AACyC;AAAA;;;AAAA;;;;AAAA;AAAzC;;AAAA;AAAA;AAGyC;;;;AAAA;AAAzC;;AAAA;AAAA;AAGqB;;;;AAAA;AAArB;;AAAA;AAAA;AACiC;AAAA;AAAA;AAAZ;AAAA;AAAA;AAAA;AAAA;AAArB;;AAAA;AAAA;AAGO;;AAAA;AAAP;AA+HA;AAAc;;AAAd;AD/OH;AAAA;;;;;;;;;;AE+KA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBO;AAAA;;AAAA;AAAA;AAAA;;;AACI;;AAA2B;AAAA;;AAAA;AAAA;AAA3B;AADJ;;;;AADJ;AH9L0B;AAAnB;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAP;AGmMO;AAAA;;;AAAa;;AAAA;AAAA;AAAA;AAAA;AAAT;;AAAA;AAAJ;;;;AAAP;AAG8B;;AAAA;AAAA;;AAAA;;;AAAA;;AAEX;AAAnB;;AACY;AAAZ;;AACc;AAAd;;AAGc;;;AAAA;AAAA;;AACd;AAAA;;AAAA;;;AACG;;;AAAX;;;AAC+B;;AAAA;AAAA;;;AACA;;AAAA;;AAAA;;AAAA;;;AAAA;;AAGP;AAAA;AAAA;AAAA;;AACE;AAAA;AAAA;;AAKG;;AAAA;AAAA;;AAAA;AAAA;AAHd;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AA7CV;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;;;AA8DkB;;AH9OR;AAAA;AAAA;AAAA;AAAe;;AAAf;AG+Of;;;AAC2B;;AAAA;AAAA;AAAA;;AAAA;AAVtB;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAaA;;;AAAA;;AAAA;AAAA;AAAA;AAAA;AH7O6B;AAAnB;AAAA;AAAA;AAAA;AAAA;;AAAP;AG4PkB;AACC;;AHnQZ;AAAA;AAAA;AAAe;;AAAf;AGoQf;;;AAC2B;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AACG;AAAA;;AAAA;AAAA;AAAf;AAAf;;;AAGoB;;AAAA;;;AACA;;AAAe;AAAf;AAFc;;;AAAA;;AAOnB;;AAAA;AAAA;;AAAA;AAAA;AA5BV;AAAA;AAAA;AAAA;AAAA;AAAA;AA2B8B;;AAAA;;;AAAA;;;;;AAeb;;;AAAA;;AACS;;;AAAA;AACA;AAAA;;;AAAA;AACX;AAAZ;AACc;AAAd;AACG;;;AAAX;;;AAC+B;;AAAA;;;AACP;AAAA;AAAA;AAAA;;AACE;AAAA;AAAA;;AAEA;AAAA;;AAAA;AAAA;AAGG;;AAAA;AAAA;;AAAA;AAAA;AAJd;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAlBV;AAAA;AAAA;AAAA;AAAA;AAAA;AE/QA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;ALLU;AAAA;AAAA;AAAA;AAAe;;AAAf;AGcP;AACA;;;AACA;;;AHV0B;AAAnB;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAP;AGaQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AACR;AAEc;;;AACS;AAAA;AAAA;AAAA;;AAAA;AAChB;AAAA;;AAAA;AAAP;AAEO;AAAA;;;AAAP;AAkJI;;AAAA;;;AACA;AAAuB;AAAvB;AAFG;;;AAAA;AE9IP;AAAA;;;AAGG;;;AAAX;;;AAEY;;AAAA;;;AAES;;AAAA;AAAA;AAAA;;;AAAT;AAAA;;;AFEJ;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAA8C;AAA9C;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AE/CoB;;AAGP;;AAEO;AAAA;;AAAA;AAAA;AACE;AAAA;;AAAA;AACA;AAAA;AAAA;AAAA;AAAyB;AAAA;;AAAA;AAAA;AAAzB;AARlB;;AAAA;AAAA;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AASqB;;AATrB;AAUoB;AAVpB;AAAA;AAAA;;;;;;AAAA;AAAA;AAAA;AADJ;;AAAA;AAAA;AAAA;AAuDc;;AAFP;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAtCV;AAAA;AAAA;AAAA;AAAA;AAAA;AAkCwB;AAAjB;;;;;AClCP;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;ANLU;AAAA;AAAA;AAAA;AAAe;;AAAf;ACRP;AACA;;;AACA;;;ADY0B;AAAnB;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAP;ACVQ;AAAA;AAAA;AAAA;AACR;AACO;;AAA2B;AAAA;;AAAA;AAAA;AAA3B;AAAP;AEuDI;;;AADG;;;AAAP;AAGO;AAAA;;;AAAA;AG3BP;AAAA;;;AAGG;;;AAAX;;;AAEY;;AAAA;;;AAES;;AAAA;AAAA;AAAA;;;AAAT;AAAA;;;AJ2IJ;AAAA;AAAA;AAAA;AAA0B;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAA1B;AAAA;AAAA;AAAA;AACsC;AAAtC;AAAA;AAAA;AAAA;;AAAA;AACA;;;AIxLoB;;AAGP;;AAEO;AAAA;;AAAA;AAAA;AACE;AAAA;;AAAA;AACA;AAAA;AAAA;AAAA;AAAyB;AAAA;;AAAA;AAAA;AAAzB;AARlB;;AAAA;AAAA;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AASqB;;AATrB;AAAA;;AAAA;AAAA;;;;;;AAAA;AAAA;AAAA;AADJ;;AAAA;AAAA;AAAA;AAsDc;;AAFP;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AArCV;AAAA;AAAA;AAAA;AAAA;AAAA;AAiCwB;AAAjB;;;;;;;;;;;AEtDP;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ARgBU;AAAA;AAAA;AAAA;AAAe;;AAAf;AEgIH;;;AACI;AAAA;;AAAA;AAAA;AAAsC;;AAAtC;AADJ;;;AAGQ;AAAA;;AAAA;AAAA;AAAJ;;;AACG;;AAA0B;AAAA;;AAAA;AAAA;AAA1B;AADH;;;;AAJR;AAmBO;;AAAA;;AAAA;AAAA;;AAAA;AAAP;AACA;;;AACA;;;AF9I0B;AAAnB;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAP;AAA0B;AAAnB;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAP;AEiJA;;AAAA;;;AACA;;AAAA;;;AAaO;;AAAA;;AAAA;AAAP;AACA;;AAAA;AAAA;AACgB;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAT;;AAAA;AAAP;AFjIoB;;;AAAA;;AACjB;AAAA;AAAA;AAAA;AAAX;;;AANY;;AAAA;AAAA;AAAA;;AAAA;AAAmC;;AAAA;AAAA;AAAA;;AAAA;AAAnC;AAAA;;;AACI;;AAAA;AAAA;AAAA;;AAAA;AAAqC;;AAAA;AAAA;AAAA;;AAAA;AAArC;AADJ;;;;AADJ;AQVoB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;ALuBN;;;AACd;;AAAA;AAAA;;AAAA;;AAAA;;;AACO;AAAA;;AAAA;AAAA;;AAAA;;AAAA;;;AAAA;;AHDS;;AAAA;AAAA;AAAA;AAAA;AAAT;AAAA;AAAP;AACA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AApBG;AAAA;AAAA;AAAA;AAAX;;;AACuD;AAA3C;AAAA;;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AACA;;AAAA;AAAA;AAsBJ;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AQvBO;;AAAA;AAAA;;AAAA;AA5CV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;AR0DO;;AAAA;AAAA;;AAAA;;AAAA;AACsC;;AAAA;AAAA;AAAA;;;AAAtC;;AAAA;AAAA;;;;;;;;AEuMP;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AASG;;AAAA;;AAAA;AACA;;AAAA;AAAA;AAVH;AAAA;AAYA;;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAQG;;;AACA;;AAAA;AAAA;AATH;AAAA;;AAWA;;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAqBG;;;AF3RO;AAAA;AAAA;AAAA;AAAe;;AAAf;AE4RA;AAAP;AACA;;;AAEA;AAAA;AACyC;AAAtC;AAAX;;;AACY;AAAA;;;AAAA;;AAGA;AAAA;;AAAA;AAAA;AACG;;AAAA;AAAA;;;AAAA;;;;AAAA;AADH;AAAA;;AAAA;AADJ;AAIA;;AAAA;AAAA;AAGG;AAAA;;AAAA;AAAA;AAAX;;;AAEgB;AAAA;;AAAA;AAAA;AACgC;;AAAA;AAAA;AAA7B;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AADH;AAAA;;AAAA;AADJ;AAIA;;AAAA;AAAA;AAI8B;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAF3B;AAAA;AAAA;AAAA;AAAA;AA5CV;AAAA;AAAA;AAAA;AAAA;AAAA;AAiDA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AKzQ+B;;AAAc;;AAAnC;;;AAAP;ALsRA;;AAAA;AAAA;AACO;;AAdV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAgBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AF1UU;AAAA;AAAA;AAAA;AAAe;;AAAf;AEwHH;;;AACI;AAAA;;AAAA;AAAA;AACD;;AAAA;AAAA;;AADC;AAAA;;;AAEF;AAAA;;AAAA;AAAA;AADC;;AAAA;AADC;;;;AAFR;AKzE4B;;AAAqB;;AAA1C;;;AAAP;APxC0B;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AEgWA;;;AACA;;;AACA;;AAAA;AAAA;AACO;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAkC;AAAA;;AAAA;AAAA;AAAlC;;AAAA;AAAP;AAEA;AAAA;;AAAA;AACA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAC2C;AAAA;;AAAA;AAAA;AAA3C;AAAA;;AAAA;;AAAA;;AAAA;AACO;AAAA;;AAAA;AAAA;AAAA;AAAA;AApCV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;AAgDiB;AACX;;AAA0B;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAA1B;AAAA;;;AAAA;AAAA;;;AACe;;AAAd;;AAED;AAAA;;AAAA;AAAA;AAAX;;;AAC0B;;AAAd;;AAGsB;AAAA;;AAAA;AAAA;AACF;AAAA;;AAAA;AAAA;AF/WjB;AAAA;AAAA;AAAA;AAAyB;AAAA;;AAAA;AAAA;AAAzB;AAAA;AEkX6B;AAAA;;AAAA;AAAA;AAAX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AACU;AAAA;;AAAA;AAAA;AAAZ;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AACO;AAAA;;AAAA;AAAA;AAAZ;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AACD;AAAA;;AAAA;AAAA;AAEqB;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AACpB;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AACJ;AAAA;;AAAA;AAAA;AACE;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAfT;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAjBV;AAAA;AAAA;AAAA;AAAA;AAAA;AA2CiB;;AF3ZP;AAAA;AAAA;AAAA;AAAe;;AAAf;AE4Zf;;;AAC0B;;AAAA;AAAA;AAAA;;AAAA;AAVrB;AAAA;;AAAA;AAAA;AAAA;AAAA;AAsBQ;AAAA;;AAAA;AAAA;AAAoC;AAAA;;AAAA;AAAA;AADlC;AAAA;AAAA;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AARV;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBuC;AAAA;;AAAA;AAAA;AATvC;AAAA;AAAA;AAAA;AAAA;AAAA;AFvWA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AOjB+B;;AAAgB;;AAArC;;;AAAP;AP9C0B;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAmFA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AACO;;AArBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AOjD+B;;AAAsB;;AAA3C;;;AAAP;APxCO;AAAA;AAAA;AAAA;AAAe;;AAAf;AA+GA;AAAP;AACA;;;AACA;;;AAC8B;AAAvB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AAIU;AAFsB;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAhC;AAOO;;AAlCV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoCA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AOrF+B;;AAAsB;;AAA3C;;;AAAP;APuGA;;;AA5I0B;AAAnB;AAAA;AAAA;AAAA;AAAA;;AAAP;AA+Ie;AAAA;AAAA;AAAA;AAAA;AACf;AAAA;;AACA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AACA;;;AACqB;;AAzBxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAoBU;;AAAA;;AAAA;AAAP;AACA;;;AACA;;;AA3K0B;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AA6KA;AAAA;;AAAA;AACO;;AAzBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAhL6B;AAAnB;AAAA;AAAA;AAAA;AAAA;;AAAP;AA+LO;AAAA;AAfV;AAAA;AAAA;AAAA;AAAA;AAAA;AO5DA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAWG;;;AACA;;AAAA;AAAA;AACO;;AAbV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAeA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAWG;;;AACA;;AAAA;AAAA;AACO;;AAbV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAeA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAsBG;;;AACA;;;AACwB;AAAA;;AAAxB;;;AApGc;;AAAX;AAAX;;;AACY;;AAAA;;AAAA;AAqGG;;AA1BV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAxEM;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AA+FJ;;;AA7FG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AA2FJ;;;AAzFG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAuFJ;;;AArFG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAmFJ;;;AAjFG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;;;;AAkFP;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAmBG;;;AACA;;;AACwB;AAAA;;AAAxB;;;AApGO;AAAW;;AAAX;AAAP;AACc;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAmGG;;AAvBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA1EM;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AA8FJ;;;AA5FG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AA0FJ;;;AAxFG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAsFJ;;;AApFG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;;;;AAqFP;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAzJ+B;;AAAgB;;AAArC;;;AAAP;AAyKA;;AAAA;AAAA;AACO;;AAjBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BU;AAAA;;AAAA;AAAA;AARV;AAAA;AAAA;AAAA;AAAA;AAAA;AAUA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAc4B;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AAlBP;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAcU;AACP;AAAA;;;AAES;;;;;;;;AADT;;AAAA;;;;;;;;;;;;;;AA+BQ;AAJI;;AA5QL;;AAAA;AAAA;AAAA;AAAA;;AA2QC;AAGO;AAAA;AA7ClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAsCe;;AAvQL;;AAAA;AAAA;AAAA;AAAA;;AAsQC;AAGO;AAAA;AAxClB;;;AAiCe;;AAlQL;;AAAA;AAAA;AAAA;AAAA;;AAiQC;AAGO;AAAA;AAnClB;;;AA4Be;;AA7PL;;AAAA;AAAA;AAAA;AAAA;;AA4PC;AAGO;AAAA;AA9BlB;;;AAuBe;;AAxPL;;AAAA;AAAA;AAAA;AAAA;;AAuPC;AAGO;AAAA;AAzBlB;;;AAkBkB;;;;;;;;;;;;;;;;;;AAlBlB;;;AJzKD;;;;;AACiB;;AAAA;AACC;AAAA;;AAAA;AAAA;AAAA;;AAAA;AACG;AAAA;;AAAA;AAAA;AAAd;AAAX;;;AAC0B;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAclB;;AAAA;;AAAA;AAAA;;AAAA;AACA;;AAAA;AAdkB;AAAA;;AAAA;AAAA;AAAb;;AAAA;AAAb;;;AAE0D;AAAA;;AAAA;AAAA;AAA1C;;AAAA;AAAA;AAAA;;AAEc;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AACZ;;AAAA;AAAlB;;;AAEoC;;AACL;AAFf;;;AAIA;;AAAc;AAAd;AAAA;AAAA;;AACkB;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;;AACR;;AAAa;;AAAb;AAAA;;;;;AAItB;;;AACkC;;AAAA;;AAAA;AAA2C;AAA3C;AAAvB;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAP;AAQJ;;;AACsB;AACD;AAAA;;AAAA;AAAA;AAAd;;AAAA;AAAX;;;AACmD;;AAAc;AAAd;AAArB;;;AAAA;;AACtB;;AAAA;AAAA;AAEJ;;;AAG8C;;AAAS;AAAT;AAAxB;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AACX;;AAAA;AAAsC;;;AAAtC;AAAP;AAEJ;;;;;;AAEJ;;AAAA;;;AACkC;AAAA;;AAAA;AAAA;AAGF;;AAAA;;AAAA;AAAA;;AACR;;AAAA;;;AAAA;AAAA;AACb;AAAA;;AAAA;AAAA;AAAX;;;ADCe;;AAAe;;AAAf;AAAA;;AAAe;;AAAf;ACEA;;AAAA;AAAA;AAAA;AAAA;AAAP;;AAAA;AA5BkB;AAAlB;;AACR;;AAAA;;;AAC8B;;AAAA;;;AAAA;;;;;;;AA+B1B;;;AAEQ;AAAA;;AAAA;AAAA;AAAA;;;AACI;;AAA2B;AAAA;;AAAA;AAAA;AAA3B;AADJ;;;AAEkB;AAAA;;AAAA;AAAA;AAAd;;AAAA;AAFJ;;;;AADJ;;AAAA;AAMJ;;;AAII;;AAAA;;AAAA;;;AACmB;;AAAA;;;AACK;AAAA;AAAA;AACR;AAAA;AAAA;AACO;;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAGnB;;AAAA;;AAAA;;;AAAA;AAAA;;AAAA;AAGI;;;AAAA;;AAAA;AAHJ;AADJ;AAhKJ;;;AACW;AAAA;;AAAA;AAAA;AAA0B;AAAA;AAAA;AAAA;AAAA;;AAAA;AAA1B;AAAP;AAEJ;;;AAIQ;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AADJ;;ACpBJ;;;AACO;AAAA;;AAAA;AAAA;AAAwB;;AAAxB;AAAX;;;AAEgB;;AAAc;AAAA;;AAAA;AAAA;AAAd;AAAA;;;AACG;;AAAA;;AAAA;AADH;;;AAEG;;AAAc;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAd;AAFH;;;;AADJ;;;;;;AAMR;;;AAEQ;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AACI;AAAA;;AAAA;AAAA;AADJ;;AAAA;;AAAA;;;AAGQ;;AAAA;AAAA;AAAA;;;AAAA;AAAJ;;;;AAJR;AAAA;;;;;AAOJ;;;AAEyC;;AAAjC;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AADJ;;AAKJ;;;AACI;AAIQ;;AAHO;AAAA;;AAAA;AAAA;;;;;;;;;;;AADf;;;;;;AAAA;;AFwEJ;;;;;;;AAEQ;;AAAA;;;AAAA;;;;AAAA;AACE;;AADF;AADJ;AAIkB;;AAAA;AAAA;AAAqB;AAArB;AAAP;AAAnB;;AAAA;;AAAA;AAAA;;;AAEgC;;AACL;AAFf;;;AAIS;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AACkB;AAAN;AAAA;AAAA;;AAAZ;AAAA;AAAA;AAAA;AAAA;;AACF;AAAP;AACG;AAAA;;AAAA;AAAA;AAA6B;;AAA7B;AAAf;;;AAEwB;;AAAA;;AAAA;AAAmB;;AAApB;AAAA;AAAP;;;;;;;;;;;;;AFzFZ;;;AACe;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAJ;AAAP;;AAEJ;;;AACmB;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAR;;AAAA;AAAP;AAEJ;;;AAEyB;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AADd;;AAAA;AAAA;;;AAAP;AAQG;AAAA;AAAA;AAAA;AAAX;;;AACY;AAAc;;AAAd;;AOQR;;;;;AAFW;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAGA;;;AACH;;AAAA;AAAA;AAAA;AAAA;AACG;;AAAA;AAAA;;AADH;AAAA;;;AAEG;;AAAA;AAAA;AAAA;AAAA;AADA;;AAAA;AADH;;;;AADJ;;AAAA;;;;;AAOyB;;AAbF;AAAA;;AAAA;AAAA;AAAhB;AAaP;;AAkBW;AAAA;;AAAA;AAAA;AAAJ;AAAP;;AAGW;AAAA;;AAAA;AAAA;AAAJ;AAAP;;AAEJ;;;AACW;;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;AAAA;;AAMH;;AANG;AAAA;;;;AAAP;;;", - "op_pc_offset": 0, - "pc_events": { - "1": { - "subroutine": "algopy.arc4.ARC4Contract.approval_program", - "params": {}, - "block": "main", - "stack_in": [], - "op": "intcblock 0 1 32 8 255 200 86400" - }, - "14": { - "op": "bytecblock 0x151f7c75 0x52333023 \"status\" \"circulating_units\" \"issuance_date\" \"maturity_date\" \"unit_value\" \"total_coupons\" 0x52323023 \"settlement_asset_id\" \"primary_distribution_opening_date\" \"secondary_market_closure_date\" 0x74696d654576656e7473 0x52373023 0x52343023 \"total_units\" \"denomination_asset_id\" \"day_count_convention\" \"secondary_market_opening_date\" 0x636f75706f6e5261746573 0x52363023 0x52353023 0x52323523 \"asset_suspended\" \"asset_defaulted\" \"metadata\" \"principal_discount\" \"primary_distribution_closure_date\" \"paid_coupon_units\" \"due_coupons_watermark\" 0x0000 0x00 0x52383023 \"interest_rate\" 0x068101 0x003b 0x8c29904e 0x0012" - }, - "499": { - "op": "txn ApplicationID", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "501": { - "op": "bnz main_after_if_else@2", - "stack_out": [] - }, - "504": { - "op": "bytec 8 // 0x52323023", - "defined_out": [ - "0x52323023" - ], - "stack_out": [ - "0x52323023" - ] - }, - "506": { - "op": "global ZeroAddress", - "defined_out": [ - "0x52323023", - "tmp%0#3" - ], - "stack_out": [ - "0x52323023", - "tmp%0#3" - ] - }, - "508": { - "op": "app_global_put", - "stack_out": [] - }, - "509": { - "op": "bytec 22 // 0x52323523", - "defined_out": [ - "0x52323523" - ], - "stack_out": [ - "0x52323523" - ] - }, - "511": { - "op": "global ZeroAddress", - "defined_out": [ - "0x52323523", - "tmp%1#3" - ], - "stack_out": [ - "0x52323523", - "tmp%1#3" - ] - }, - "513": { - "op": "app_global_put", - "stack_out": [] - }, - "514": { - "op": "bytec 23 // \"asset_suspended\"", - "defined_out": [ - "\"asset_suspended\"" - ], - "stack_out": [ - "\"asset_suspended\"" - ] - }, - "516": { - "op": "intc_0 // 0", - "defined_out": [ - "\"asset_suspended\"", - "0" - ], - "stack_out": [ - "\"asset_suspended\"", - "0" - ] - }, - "517": { - "op": "app_global_put", - "stack_out": [] - }, - "518": { - "op": "bytec 24 // \"asset_defaulted\"", - "defined_out": [ - "\"asset_defaulted\"" - ], - "stack_out": [ - "\"asset_defaulted\"" - ] - }, - "520": { - "op": "intc_0 // 0", - "stack_out": [ - "\"asset_defaulted\"", - "0" - ] - }, - "521": { - "op": "app_global_put", - "stack_out": [] - }, - "522": { - "op": "bytec 15 // \"total_units\"", - "defined_out": [ - "\"total_units\"" - ], - "stack_out": [ - "\"total_units\"" - ] - }, - "524": { - "op": "intc_0 // 0", - "stack_out": [ - "\"total_units\"", - "0" - ] - }, - "525": { - "op": "app_global_put", - "stack_out": [] - }, - "526": { - "op": "bytec_3 // \"circulating_units\"", - "defined_out": [ - "\"circulating_units\"" - ], - "stack_out": [ - "\"circulating_units\"" - ] - }, - "527": { - "op": "intc_0 // 0", - "stack_out": [ - "\"circulating_units\"", - "0" - ] - }, - "528": { - "op": "app_global_put", - "stack_out": [] - }, - "529": { - "op": "bytec 6 // \"unit_value\"", - "defined_out": [ - "\"unit_value\"" - ], - "stack_out": [ - "\"unit_value\"" - ] - }, - "531": { - "op": "intc_0 // 0", - "stack_out": [ - "\"unit_value\"", - "0" - ] - }, - "532": { - "op": "app_global_put", - "stack_out": [] - }, - "533": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"" - ], - "stack_out": [ - "\"status\"" - ] - }, - "534": { - "op": "intc_0 // 0", - "stack_out": [ - "\"status\"", - "0" - ] - }, - "535": { - "op": "app_global_put", - "stack_out": [] - }, - "536": { - "op": "bytec 16 // \"denomination_asset_id\"", - "defined_out": [ - "\"denomination_asset_id\"" - ], - "stack_out": [ - "\"denomination_asset_id\"" - ] - }, - "538": { - "op": "intc_0 // 0", - "stack_out": [ - "\"denomination_asset_id\"", - "0" - ] - }, - "539": { - "op": "app_global_put", - "stack_out": [] - }, - "540": { - "op": "bytec 9 // \"settlement_asset_id\"", - "defined_out": [ - "\"settlement_asset_id\"" - ], - "stack_out": [ - "\"settlement_asset_id\"" - ] - }, - "542": { - "op": "intc_0 // 0", - "stack_out": [ - "\"settlement_asset_id\"", - "0" - ] - }, - "543": { - "op": "app_global_put", - "stack_out": [] - }, - "544": { - "op": "bytec 6 // \"unit_value\"", - "stack_out": [ - "\"unit_value\"" - ] - }, - "546": { - "op": "intc_0 // 0", - "stack_out": [ - "\"unit_value\"", - "0" - ] - }, - "547": { - "op": "app_global_put", - "stack_out": [] - }, - "548": { - "op": "bytec 17 // \"day_count_convention\"", - "defined_out": [ - "\"day_count_convention\"" - ], - "stack_out": [ - "\"day_count_convention\"" - ] - }, - "550": { - "op": "intc_0 // 0", - "stack_out": [ - "\"day_count_convention\"", - "0" - ] - }, - "551": { - "op": "app_global_put", - "stack_out": [] - }, - "552": { - "op": "bytec 25 // \"metadata\"", - "defined_out": [ - "\"metadata\"" - ], - "stack_out": [ - "\"metadata\"" - ] - }, - "554": { - "op": "pushbytes 0x", - "defined_out": [ - "\"metadata\"", - "0x" - ], - "stack_out": [ - "\"metadata\"", - "0x" - ] - }, - "556": { - "op": "app_global_put", - "stack_out": [] - }, - "557": { - "op": "bytec 26 // \"principal_discount\"", - "defined_out": [ - "\"principal_discount\"" - ], - "stack_out": [ - "\"principal_discount\"" - ] - }, - "559": { - "op": "intc_0 // 0", - "stack_out": [ - "\"principal_discount\"", - "0" - ] - }, - "560": { - "op": "app_global_put", - "stack_out": [] - }, - "561": { - "op": "bytec 33 // \"interest_rate\"", - "defined_out": [ - "\"interest_rate\"" - ], - "stack_out": [ - "\"interest_rate\"" - ] - }, - "563": { - "op": "intc_0 // 0", - "stack_out": [ - "\"interest_rate\"", - "0" - ] - }, - "564": { - "op": "app_global_put", - "stack_out": [] - }, - "565": { - "op": "bytec 7 // \"total_coupons\"", - "defined_out": [ - "\"total_coupons\"" - ], - "stack_out": [ - "\"total_coupons\"" - ] - }, - "567": { - "op": "intc_0 // 0", - "stack_out": [ - "\"total_coupons\"", - "0" - ] - }, - "568": { - "op": "app_global_put", - "stack_out": [] - }, - "569": { - "op": "bytec 10 // \"primary_distribution_opening_date\"", - "defined_out": [ - "\"primary_distribution_opening_date\"" - ], - "stack_out": [ - "\"primary_distribution_opening_date\"" - ] - }, - "571": { - "op": "intc_0 // 0", - "stack_out": [ - "\"primary_distribution_opening_date\"", - "0" - ] - }, - "572": { - "op": "app_global_put", - "stack_out": [] - }, - "573": { - "op": "bytec 27 // \"primary_distribution_closure_date\"", - "defined_out": [ - "\"primary_distribution_closure_date\"" - ], - "stack_out": [ - "\"primary_distribution_closure_date\"" - ] - }, - "575": { - "op": "intc_0 // 0", - "stack_out": [ - "\"primary_distribution_closure_date\"", - "0" - ] - }, - "576": { - "op": "app_global_put", - "stack_out": [] - }, - "577": { - "op": "bytec 4 // \"issuance_date\"", - "defined_out": [ - "\"issuance_date\"" - ], - "stack_out": [ - "\"issuance_date\"" - ] - }, - "579": { - "op": "intc_0 // 0", - "stack_out": [ - "\"issuance_date\"", - "0" - ] - }, - "580": { - "op": "app_global_put", - "stack_out": [] - }, - "581": { - "op": "bytec 18 // \"secondary_market_opening_date\"", - "defined_out": [ - "\"secondary_market_opening_date\"" - ], - "stack_out": [ - "\"secondary_market_opening_date\"" - ] - }, - "583": { - "op": "intc_0 // 0", - "stack_out": [ - "\"secondary_market_opening_date\"", - "0" - ] - }, - "584": { - "op": "app_global_put", - "stack_out": [] - }, - "585": { - "op": "bytec 11 // \"secondary_market_closure_date\"", - "defined_out": [ - "\"secondary_market_closure_date\"" - ], - "stack_out": [ - "\"secondary_market_closure_date\"" - ] - }, - "587": { - "op": "intc_0 // 0", - "stack_out": [ - "\"secondary_market_closure_date\"", - "0" - ] - }, - "588": { - "op": "app_global_put", - "stack_out": [] - }, - "589": { - "op": "bytec 5 // \"maturity_date\"", - "defined_out": [ - "\"maturity_date\"" - ], - "stack_out": [ - "\"maturity_date\"" - ] - }, - "591": { - "op": "intc_0 // 0", - "stack_out": [ - "\"maturity_date\"", - "0" - ] - }, - "592": { - "op": "app_global_put", - "stack_out": [] - }, - "593": { - "op": "bytec 28 // \"paid_coupon_units\"", - "defined_out": [ - "\"paid_coupon_units\"" - ], - "stack_out": [ - "\"paid_coupon_units\"" - ] - }, - "595": { - "op": "intc_0 // 0", - "stack_out": [ - "\"paid_coupon_units\"", - "0" - ] - }, - "596": { - "op": "app_global_put", - "stack_out": [] - }, - "597": { - "op": "bytec 29 // \"due_coupons_watermark\"", - "defined_out": [ - "\"due_coupons_watermark\"" - ], - "stack_out": [ - "\"due_coupons_watermark\"" - ] - }, - "599": { - "op": "intc_0 // 0", - "stack_out": [ - "\"due_coupons_watermark\"", - "0" - ] - }, - "600": { - "op": "app_global_put", - "stack_out": [] - }, - "601": { - "op": "txn GlobalNumByteSlice", - "defined_out": [ - "tmp%0#2" - ], - "stack_out": [ - "tmp%0#2" - ] - }, - "603": { - "op": "pushint 3", - "defined_out": [ - "3", - "tmp%0#2" - ], - "stack_out": [ - "tmp%0#2", - "3" - ] - }, - "605": { - "op": "==", - "defined_out": [ - "tmp%1#2" - ], - "stack_out": [ - "tmp%1#2" - ] - }, - "606": { - "error": "Wrong Global Bytes allocation", - "op": "assert // Wrong Global Bytes allocation", - "stack_out": [] - }, - "607": { - "op": "txn GlobalNumUint", - "defined_out": [ - "tmp%2#1" - ], - "stack_out": [ - "tmp%2#1" - ] - }, - "609": { - "op": "pushint 20", - "defined_out": [ - "20", - "tmp%2#1" - ], - "stack_out": [ - "tmp%2#1", - "20" - ] - }, - "611": { - "op": "==", - "defined_out": [ - "tmp%3#1" - ], - "stack_out": [ - "tmp%3#1" - ] - }, - "612": { - "error": "Wrong Global UInts allocation", - "op": "assert // Wrong Global UInts allocation", - "stack_out": [] - }, - "613": { - "op": "txn LocalNumByteSlice", - "defined_out": [ - "tmp%4#1" - ], - "stack_out": [ - "tmp%4#1" - ] - }, - "615": { - "op": "!", - "defined_out": [ - "tmp%5#0" - ], - "stack_out": [ - "tmp%5#0" - ] - }, - "616": { - "error": "Wrong Local Bytes allocation", - "op": "assert // Wrong Local Bytes allocation", - "stack_out": [] - }, - "617": { - "op": "txn LocalNumUint", - "defined_out": [ - "tmp%6#0" - ], - "stack_out": [ - "tmp%6#0" - ] - }, - "619": { - "op": "!", - "defined_out": [ - "tmp%7#0" - ], - "stack_out": [ - "tmp%7#0" - ] - }, - "620": { - "error": "Wrong Local UInts allocation", - "op": "assert // Wrong Local UInts allocation", - "stack_out": [] - }, - "621": { - "block": "main_after_if_else@2", - "stack_in": [], - "op": "pushbytes 0x25dba95b // method \"asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void\"", - "defined_out": [ - "Method(asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void)" - ], - "stack_out": [ - "Method(asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void)" - ] - }, - "627": { - "op": "txna ApplicationArgs 0", - "defined_out": [ - "Method(asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void)", - "tmp%0#1" - ], - "stack_out": [ - "Method(asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void)", - "tmp%0#1" - ] - }, - "630": { - "op": "match main_asset_update_route@4", - "stack_out": [] - }, - "634": { - "block": "main_switch_case_next@5", - "stack_in": [], - "op": "txn OnCompletion", - "defined_out": [ - "tmp%6#0" - ], - "stack_out": [ - "tmp%6#0" - ] - }, - "636": { - "op": "!", - "defined_out": [ - "tmp%7#0" - ], - "stack_out": [ - "tmp%7#0" - ] - }, - "637": { - "op": "assert", - "stack_out": [] - }, - "638": { - "op": "txn ApplicationID", - "defined_out": [ - "tmp%8#0" - ], - "stack_out": [ - "tmp%8#0" - ] - }, - "640": { - "op": "bz main_create_NoOp@36", - "stack_out": [] - }, - "643": { - "op": "pushbytess 0x89474134 0x44363d49 0x53bef045 0x67db4f20 0xf6a96c8d 0x8cf14b51 0x9c76b6a3 0x4fd6a3cc 0x1d6fc255 0x25e9997f 0x6c85e3ee 0x402dba47 0xfad2173e 0x08efea35 0xe4a5ab54 0xdc063b35 0x14fc10ef 0x4c113ed5 0x74a7297f 0x105c184e 0x82f71b2d 0xef04f5d3 0x03b83329 0x3dbe80bd 0xdf54e82c 0x010c8299 0x7406acd2 0xc3e4b297 // method \"asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void\", method \"get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64))\", method \"get_coupon_rates()uint16[]\", method \"get_payment_amount(address)(uint64,uint64)\", method \"get_coupons_status()(uint64,uint64,uint64,(uint64,uint64),bool)\", method \"pay_coupon(address,byte[])(uint64,uint64,byte[])\", method \"pay_principal(address,byte[])(uint64,uint64,byte[])\", method \"asset_transfer(address,address,uint64)uint64\", method \"set_secondary_time_events(uint64[])(uint64,uint64)\", method \"set_default_status(bool)uint64\", method \"primary_distribution(address,uint64)uint64\", method \"get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)\", method \"get_time_events()uint64[]\", method \"get_secondary_market_schedule()uint64[]\", method \"get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)\", method \"account_gov_suspension(address,bool)uint64\", method \"account_open(address,address)uint64\", method \"account_close(address)(uint64,uint64)\", method \"account_update_payment_address(address,address)uint64\", method \"account_get_info(address)(address,uint64,uint64,uint64,bool)\", method \"rbac_rotate_arranger(address)uint64\", method \"rbac_set_op_daemon(address)uint64\", method \"rbac_assign_role(uint8,address,byte[])uint64\", method \"rbac_revoke_role(uint8,address)uint64\", method \"rbac_gov_asset_suspension(bool)uint64\", method \"rbac_get_arranger()address\", method \"rbac_get_address_roles(address)(bool,bool,bool,bool,bool)\", method \"rbac_get_role_config(uint8,address)(uint64,uint64)\"", - "defined_out": [ - "Method(account_close(address)(uint64,uint64))", - "Method(account_get_info(address)(address,uint64,uint64,uint64,bool))", - "Method(account_gov_suspension(address,bool)uint64)", - "Method(account_open(address,address)uint64)", - "Method(account_update_payment_address(address,address)uint64)", - "Method(asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void)", - "Method(asset_transfer(address,address,uint64)uint64)", - "Method(get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64)))", - "Method(get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8))", - "Method(get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))", - "Method(get_coupon_rates()uint16[])", - "Method(get_coupons_status()(uint64,uint64,uint64,(uint64,uint64),bool))", - "Method(get_payment_amount(address)(uint64,uint64))", - "Method(get_secondary_market_schedule()uint64[])", - "Method(get_time_events()uint64[])", - "Method(pay_coupon(address,byte[])(uint64,uint64,byte[]))", - "Method(pay_principal(address,byte[])(uint64,uint64,byte[]))", - "Method(primary_distribution(address,uint64)uint64)", - "Method(rbac_assign_role(uint8,address,byte[])uint64)", - "Method(rbac_get_address_roles(address)(bool,bool,bool,bool,bool))", - "Method(rbac_get_arranger()address)", - "Method(rbac_get_role_config(uint8,address)(uint64,uint64))", - "Method(rbac_gov_asset_suspension(bool)uint64)", - "Method(rbac_revoke_role(uint8,address)uint64)", - "Method(rbac_rotate_arranger(address)uint64)", - "Method(rbac_set_op_daemon(address)uint64)", - "Method(set_default_status(bool)uint64)", - "Method(set_secondary_time_events(uint64[])(uint64,uint64))" - ], - "stack_out": [ - "Method(asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void)", - "Method(get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64)))", - "Method(get_coupon_rates()uint16[])", - "Method(get_payment_amount(address)(uint64,uint64))", - "Method(get_coupons_status()(uint64,uint64,uint64,(uint64,uint64),bool))", - "Method(pay_coupon(address,byte[])(uint64,uint64,byte[]))", - "Method(pay_principal(address,byte[])(uint64,uint64,byte[]))", - "Method(asset_transfer(address,address,uint64)uint64)", - "Method(set_secondary_time_events(uint64[])(uint64,uint64))", - "Method(set_default_status(bool)uint64)", - "Method(primary_distribution(address,uint64)uint64)", - "Method(get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8))", - "Method(get_time_events()uint64[])", - "Method(get_secondary_market_schedule()uint64[])", - "Method(get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))", - "Method(account_gov_suspension(address,bool)uint64)", - "Method(account_open(address,address)uint64)", - "Method(account_close(address)(uint64,uint64))", - "Method(account_update_payment_address(address,address)uint64)", - "Method(account_get_info(address)(address,uint64,uint64,uint64,bool))", - "Method(rbac_rotate_arranger(address)uint64)", - "Method(rbac_set_op_daemon(address)uint64)", - "Method(rbac_assign_role(uint8,address,byte[])uint64)", - "Method(rbac_revoke_role(uint8,address)uint64)", - "Method(rbac_gov_asset_suspension(bool)uint64)", - "Method(rbac_get_arranger()address)", - "Method(rbac_get_address_roles(address)(bool,bool,bool,bool,bool))", - "Method(rbac_get_role_config(uint8,address)(uint64,uint64))" - ] - }, - "785": { - "op": "txna ApplicationArgs 0", - "defined_out": [ - "Method(account_close(address)(uint64,uint64))", - "Method(account_get_info(address)(address,uint64,uint64,uint64,bool))", - "Method(account_gov_suspension(address,bool)uint64)", - "Method(account_open(address,address)uint64)", - "Method(account_update_payment_address(address,address)uint64)", - "Method(asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void)", - "Method(asset_transfer(address,address,uint64)uint64)", - "Method(get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64)))", - "Method(get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8))", - "Method(get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))", - "Method(get_coupon_rates()uint16[])", - "Method(get_coupons_status()(uint64,uint64,uint64,(uint64,uint64),bool))", - "Method(get_payment_amount(address)(uint64,uint64))", - "Method(get_secondary_market_schedule()uint64[])", - "Method(get_time_events()uint64[])", - "Method(pay_coupon(address,byte[])(uint64,uint64,byte[]))", - "Method(pay_principal(address,byte[])(uint64,uint64,byte[]))", - "Method(primary_distribution(address,uint64)uint64)", - "Method(rbac_assign_role(uint8,address,byte[])uint64)", - "Method(rbac_get_address_roles(address)(bool,bool,bool,bool,bool))", - "Method(rbac_get_arranger()address)", - "Method(rbac_get_role_config(uint8,address)(uint64,uint64))", - "Method(rbac_gov_asset_suspension(bool)uint64)", - "Method(rbac_revoke_role(uint8,address)uint64)", - "Method(rbac_rotate_arranger(address)uint64)", - "Method(rbac_set_op_daemon(address)uint64)", - "Method(set_default_status(bool)uint64)", - "Method(set_secondary_time_events(uint64[])(uint64,uint64))", - "tmp%10#0" - ], - "stack_out": [ - "Method(asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void)", - "Method(get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64)))", - "Method(get_coupon_rates()uint16[])", - "Method(get_payment_amount(address)(uint64,uint64))", - "Method(get_coupons_status()(uint64,uint64,uint64,(uint64,uint64),bool))", - "Method(pay_coupon(address,byte[])(uint64,uint64,byte[]))", - "Method(pay_principal(address,byte[])(uint64,uint64,byte[]))", - "Method(asset_transfer(address,address,uint64)uint64)", - "Method(set_secondary_time_events(uint64[])(uint64,uint64))", - "Method(set_default_status(bool)uint64)", - "Method(primary_distribution(address,uint64)uint64)", - "Method(get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8))", - "Method(get_time_events()uint64[])", - "Method(get_secondary_market_schedule()uint64[])", - "Method(get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))", - "Method(account_gov_suspension(address,bool)uint64)", - "Method(account_open(address,address)uint64)", - "Method(account_close(address)(uint64,uint64))", - "Method(account_update_payment_address(address,address)uint64)", - "Method(account_get_info(address)(address,uint64,uint64,uint64,bool))", - "Method(rbac_rotate_arranger(address)uint64)", - "Method(rbac_set_op_daemon(address)uint64)", - "Method(rbac_assign_role(uint8,address,byte[])uint64)", - "Method(rbac_revoke_role(uint8,address)uint64)", - "Method(rbac_gov_asset_suspension(bool)uint64)", - "Method(rbac_get_arranger()address)", - "Method(rbac_get_address_roles(address)(bool,bool,bool,bool,bool))", - "Method(rbac_get_role_config(uint8,address)(uint64,uint64))", - "tmp%10#0" - ] - }, - "788": { - "op": "match asset_config get_account_units_current_value get_coupon_rates get_payment_amount get_coupons_status pay_coupon pay_principal asset_transfer set_secondary_time_events set_default_status primary_distribution get_asset_info get_time_events get_secondary_market_schedule get_asset_metadata account_gov_suspension account_open account_close account_update_payment_address account_get_info rbac_rotate_arranger rbac_set_op_daemon rbac_assign_role rbac_revoke_role rbac_gov_asset_suspension rbac_get_arranger rbac_get_address_roles rbac_get_role_config", - "stack_out": [] - }, - "846": { - "op": "err" - }, - "847": { - "block": "main_create_NoOp@36", - "stack_in": [], - "op": "pushbytes 0x3f0efc6c // method \"asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void\"", - "defined_out": [ - "Method(asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void)" - ], - "stack_out": [ - "Method(asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void)" - ] - }, - "853": { - "op": "txna ApplicationArgs 0", - "defined_out": [ - "Method(asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void)", - "tmp%11#0" - ], - "stack_out": [ - "Method(asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void)", - "tmp%11#0" - ] - }, - "856": { - "op": "match asset_create", - "stack_out": [] - }, - "860": { - "op": "err" - }, - "861": { - "block": "main_asset_update_route@4", - "stack_in": [], - "op": "txn OnCompletion", - "defined_out": [ - "tmp%1#1" - ], - "stack_out": [ - "tmp%1#1" - ] - }, - "863": { - "op": "pushint 4 // UpdateApplication", - "defined_out": [ - "UpdateApplication", - "tmp%1#1" - ], - "stack_out": [ - "tmp%1#1", - "UpdateApplication" - ] - }, - "865": { - "op": "==", - "defined_out": [ - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0" - ] - }, - "866": { - "op": "txn ApplicationID", - "defined_out": [ - "tmp%2#0", - "tmp%3#0" - ], - "stack_out": [ - "tmp%2#0", - "tmp%3#0" - ] - }, - "868": { - "op": "&&", - "defined_out": [ - "tmp%5#0" - ], - "stack_out": [ - "tmp%5#0" - ] - }, - "869": { - "op": "assert", - "stack_out": [] - }, - "870": { - "op": "b asset_update" - }, - "873": { - "subroutine": "_puya_lib.util.ensure_budget", - "params": { - "required_budget#0": "uint64", - "fee_source#0": "uint64" - }, - "block": "ensure_budget", - "stack_in": [], - "op": "proto 2 0" - }, - "876": { - "op": "frame_dig -2", - "defined_out": [ - "required_budget#0 (copy)" - ], - "stack_out": [ - "required_budget#0 (copy)" - ] - }, - "878": { - "op": "pushint 10", - "defined_out": [ - "10", - "required_budget#0 (copy)" - ], - "stack_out": [ - "required_budget#0 (copy)", - "10" - ] - }, - "880": { - "op": "+", - "defined_out": [ - "required_budget_with_buffer#0" - ], - "stack_out": [ - "required_budget_with_buffer#0" - ] - }, - "881": { - "block": "ensure_budget_while_top@1", - "stack_in": [ - "required_budget_with_buffer#0" - ], - "op": "frame_dig 0", - "defined_out": [ - "required_budget_with_buffer#0" - ], - "stack_out": [ - "required_budget_with_buffer#0", - "required_budget_with_buffer#0" - ] - }, - "883": { - "op": "global OpcodeBudget", - "defined_out": [ - "required_budget_with_buffer#0", - "tmp%1#0" - ], - "stack_out": [ - "required_budget_with_buffer#0", - "required_budget_with_buffer#0", - "tmp%1#0" - ] - }, - "885": { - "op": ">", - "defined_out": [ - "required_budget_with_buffer#0", - "tmp%2#0" - ], - "stack_out": [ - "required_budget_with_buffer#0", - "tmp%2#0" - ] - }, - "886": { - "op": "bz ensure_budget_after_while@6", - "stack_out": [ - "required_budget_with_buffer#0" - ] - }, - "889": { - "op": "itxn_begin" - }, - "890": { - "op": "pushint 6 // appl", - "defined_out": [ - "appl", - "required_budget_with_buffer#0" - ], - "stack_out": [ - "required_budget_with_buffer#0", - "appl" - ] - }, - "892": { - "op": "itxn_field TypeEnum", - "stack_out": [ - "required_budget_with_buffer#0" - ] - }, - "894": { - "op": "pushint 5 // DeleteApplication", - "defined_out": [ - "DeleteApplication", - "required_budget_with_buffer#0" - ], - "stack_out": [ - "required_budget_with_buffer#0", - "DeleteApplication" - ] - }, - "896": { - "op": "itxn_field OnCompletion", - "stack_out": [ - "required_budget_with_buffer#0" - ] - }, - "898": { - "op": "bytec 34 // 0x068101", - "defined_out": [ - "0x068101", - "required_budget_with_buffer#0" - ], - "stack_out": [ - "required_budget_with_buffer#0", - "0x068101" - ] - }, - "900": { - "op": "itxn_field ApprovalProgram", - "stack_out": [ - "required_budget_with_buffer#0" - ] - }, - "902": { - "op": "bytec 34 // 0x068101", - "stack_out": [ - "required_budget_with_buffer#0", - "0x068101" - ] - }, - "904": { - "op": "itxn_field ClearStateProgram", - "stack_out": [ - "required_budget_with_buffer#0" - ] - }, - "906": { - "op": "frame_dig -1", - "defined_out": [ - "fee_source#0 (copy)", - "required_budget_with_buffer#0" - ], - "stack_out": [ - "required_budget_with_buffer#0", - "fee_source#0 (copy)" - ] - }, - "908": { - "op": "switch ensure_budget_switch_case_0@3 ensure_budget_switch_case_1@4", - "stack_out": [ - "required_budget_with_buffer#0" - ] - }, - "914": { - "block": "ensure_budget_switch_case_next@5", - "stack_in": [ - "required_budget_with_buffer#0" - ], - "op": "itxn_submit" - }, - "915": { - "op": "b ensure_budget_while_top@1" - }, - "918": { - "block": "ensure_budget_switch_case_1@4", - "stack_in": [ - "required_budget_with_buffer#0" - ], - "op": "global MinTxnFee", - "defined_out": [ - "tmp%3#0" - ], - "stack_out": [ - "required_budget_with_buffer#0", - "tmp%3#0" - ] - }, - "920": { - "op": "itxn_field Fee", - "stack_out": [ - "required_budget_with_buffer#0" - ] - }, - "922": { - "op": "b ensure_budget_switch_case_next@5" - }, - "925": { - "block": "ensure_budget_switch_case_0@3", - "stack_in": [ - "required_budget_with_buffer#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "required_budget_with_buffer#0", - "0" - ] - }, - "926": { - "op": "itxn_field Fee", - "stack_out": [ - "required_budget_with_buffer#0" - ] - }, - "928": { - "op": "b ensure_budget_switch_case_next@5" - }, - "931": { - "block": "ensure_budget_after_while@6", - "stack_in": [ - "required_budget_with_buffer#0" - ], - "retsub": true, - "op": "retsub" - }, - "932": { - "subroutine": "modules.actus.pam.PAMCoreMixin.asset_config[routing]", - "params": {}, - "block": "asset_config", - "stack_in": [], - "op": "pushbytes \"\"", - "stack_out": [ - "interest_rate#2" - ] - }, - "934": { - "op": "txna ApplicationArgs 1", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "interest_rate#2", - "tmp%0#0" - ] - }, - "937": { - "op": "dup", - "defined_out": [ - "tmp%0#0", - "tmp%0#0 (copy)" - ], - "stack_out": [ - "interest_rate#2", - "tmp%0#0", - "tmp%0#0 (copy)" - ] - }, - "938": { - "op": "len", - "defined_out": [ - "len%0#0", - "tmp%0#0" - ], - "stack_out": [ - "interest_rate#2", - "tmp%0#0", - "len%0#0" - ] - }, - "939": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "len%0#0", - "tmp%0#0" - ], - "stack_out": [ - "interest_rate#2", - "tmp%0#0", - "len%0#0", - "8" - ] - }, - "940": { - "op": "==", - "defined_out": [ - "eq%0#0", - "tmp%0#0" - ], - "stack_out": [ - "interest_rate#2", - "tmp%0#0", - "eq%0#0" - ] - }, - "941": { - "error": "invalid number of bytes for arc4.uint64", - "op": "assert // invalid number of bytes for arc4.uint64", - "stack_out": [ - "interest_rate#2", - "tmp%0#0" - ] - }, - "942": { - "op": "btoi", - "defined_out": [ - "denomination_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0" - ] - }, - "943": { - "op": "txna ApplicationArgs 2", - "defined_out": [ - "denomination_asset_id#0", - "tmp%2#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "tmp%2#0" - ] - }, - "946": { - "op": "dup", - "defined_out": [ - "denomination_asset_id#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ] - }, - "947": { - "op": "len", - "defined_out": [ - "denomination_asset_id#0", - "len%1#0", - "tmp%2#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "tmp%2#0", - "len%1#0" - ] - }, - "948": { - "op": "intc_3 // 8", - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "tmp%2#0", - "len%1#0", - "8" - ] - }, - "949": { - "op": "==", - "defined_out": [ - "denomination_asset_id#0", - "eq%1#0", - "tmp%2#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "tmp%2#0", - "eq%1#0" - ] - }, - "950": { - "error": "invalid number of bytes for arc4.uint64", - "op": "assert // invalid number of bytes for arc4.uint64", - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "tmp%2#0" - ] - }, - "951": { - "op": "btoi", - "defined_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0" - ] - }, - "952": { - "op": "txna ApplicationArgs 3", - "defined_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0", - "tmp%4#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "tmp%4#0" - ] - }, - "955": { - "op": "dup", - "defined_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0", - "tmp%4#0", - "tmp%4#0 (copy)" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "tmp%4#0", - "tmp%4#0 (copy)" - ] - }, - "956": { - "op": "len", - "defined_out": [ - "denomination_asset_id#0", - "len%2#0", - "settlement_asset_id#0", - "tmp%4#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "tmp%4#0", - "len%2#0" - ] - }, - "957": { - "op": "intc_3 // 8", - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "tmp%4#0", - "len%2#0", - "8" - ] - }, - "958": { - "op": "==", - "defined_out": [ - "denomination_asset_id#0", - "eq%2#0", - "settlement_asset_id#0", - "tmp%4#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "tmp%4#0", - "eq%2#0" - ] - }, - "959": { - "error": "invalid number of bytes for arc4.uint64", - "op": "assert // invalid number of bytes for arc4.uint64", - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "tmp%4#0" - ] - }, - "960": { - "op": "btoi", - "defined_out": [ - "denomination_asset_id#0", - "principal#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0" - ] - }, - "961": { - "op": "txna ApplicationArgs 4", - "defined_out": [ - "denomination_asset_id#0", - "principal#0", - "settlement_asset_id#0", - "tmp%6#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "tmp%6#0" - ] - }, - "964": { - "op": "dup", - "defined_out": [ - "denomination_asset_id#0", - "principal#0", - "settlement_asset_id#0", - "tmp%6#0", - "tmp%6#0 (copy)" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "tmp%6#0", - "tmp%6#0 (copy)" - ] - }, - "965": { - "op": "len", - "defined_out": [ - "denomination_asset_id#0", - "len%3#0", - "principal#0", - "settlement_asset_id#0", - "tmp%6#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "tmp%6#0", - "len%3#0" - ] - }, - "966": { - "op": "intc_3 // 8", - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "tmp%6#0", - "len%3#0", - "8" - ] - }, - "967": { - "op": "==", - "defined_out": [ - "denomination_asset_id#0", - "eq%3#0", - "principal#0", - "settlement_asset_id#0", - "tmp%6#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "tmp%6#0", - "eq%3#0" - ] - }, - "968": { - "error": "invalid number of bytes for arc4.uint64", - "op": "assert // invalid number of bytes for arc4.uint64", - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "tmp%6#0" - ] - }, - "969": { - "op": "btoi", - "defined_out": [ - "denomination_asset_id#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0" - ] - }, - "970": { - "op": "txna ApplicationArgs 5", - "defined_out": [ - "denomination_asset_id#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "tmp%8#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "tmp%8#0" - ] - }, - "973": { - "op": "dup", - "defined_out": [ - "denomination_asset_id#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "tmp%8#0", - "tmp%8#0 (copy)" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "tmp%8#0", - "tmp%8#0 (copy)" - ] - }, - "974": { - "op": "len", - "defined_out": [ - "denomination_asset_id#0", - "len%4#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "tmp%8#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "tmp%8#0", - "len%4#0" - ] - }, - "975": { - "op": "intc_3 // 8", - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "tmp%8#0", - "len%4#0", - "8" - ] - }, - "976": { - "op": "==", - "defined_out": [ - "denomination_asset_id#0", - "eq%4#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "tmp%8#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "tmp%8#0", - "eq%4#0" - ] - }, - "977": { - "error": "invalid number of bytes for arc4.uint64", - "op": "assert // invalid number of bytes for arc4.uint64", - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "tmp%8#0" - ] - }, - "978": { - "op": "btoi", - "defined_out": [ - "denomination_asset_id#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0" - ] - }, - "979": { - "op": "txna ApplicationArgs 6", - "defined_out": [ - "day_count_convention#0", - "denomination_asset_id#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "982": { - "op": "dup", - "defined_out": [ - "day_count_convention#0", - "day_count_convention#0 (copy)", - "denomination_asset_id#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "day_count_convention#0 (copy)" - ] - }, - "983": { - "op": "len", - "defined_out": [ - "day_count_convention#0", - "denomination_asset_id#0", - "len%5#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "len%5#0" - ] - }, - "984": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "day_count_convention#0", - "denomination_asset_id#0", - "len%5#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "len%5#0", - "1" - ] - }, - "985": { - "op": "==", - "defined_out": [ - "day_count_convention#0", - "denomination_asset_id#0", - "eq%5#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "eq%5#0" - ] - }, - "986": { - "error": "invalid number of bytes for arc4.uint8", - "op": "assert // invalid number of bytes for arc4.uint8", - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "987": { - "op": "txna ApplicationArgs 7" - }, - "990": { - "op": "dup", - "defined_out": [ - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "interest_rate#0", - "interest_rate#0" - ] - }, - "991": { - "op": "cover 7", - "defined_out": [ - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "interest_rate#0" - ] - }, - "993": { - "op": "len", - "defined_out": [ - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "len%6#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "len%6#0" - ] - }, - "994": { - "op": "pushint 2", - "defined_out": [ - "2", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "len%6#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "len%6#0", - "2" - ] - }, - "996": { - "op": "==", - "defined_out": [ - "day_count_convention#0", - "denomination_asset_id#0", - "eq%6#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "eq%6#0" - ] - }, - "997": { - "error": "invalid number of bytes for arc4.uint16", - "op": "assert // invalid number of bytes for arc4.uint16", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "998": { - "op": "txna ApplicationArgs 8" - }, - "1001": { - "op": "dup", - "defined_out": [ - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "coupon_rates#0", - "coupon_rates#0" - ] - }, - "1002": { - "op": "cover 7", - "defined_out": [ - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "coupon_rates#0" - ] - }, - "1004": { - "op": "dup", - "defined_out": [ - "coupon_rates#0", - "coupon_rates#0 (copy)", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "coupon_rates#0", - "coupon_rates#0 (copy)" - ] - }, - "1005": { - "op": "intc_0 // 0", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "coupon_rates#0", - "coupon_rates#0 (copy)", - "0" - ] - }, - "1006": { - "error": "invalid array length header", - "op": "extract_uint16 // on error: invalid array length header", - "defined_out": [ - "aggregate%array_length%0#0", - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "coupon_rates#0", - "aggregate%array_length%0#0" - ] - }, - "1007": { - "op": "dup", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "aggregate%array_length%0#0" - ] - }, - "1008": { - "op": "cover 8", - "defined_out": [ - "aggregate%array_length%0#0", - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "coupon_rates#0", - "aggregate%array_length%0#0" - ] - }, - "1010": { - "op": "pushint 2", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "2" - ] - }, - "1012": { - "op": "*", - "defined_out": [ - "aggregate%array_length%0#0", - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "mul%0#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "coupon_rates#0", - "mul%0#0" - ] - }, - "1013": { - "op": "pushint 2", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "coupon_rates#0", - "mul%0#0", - "2" - ] - }, - "1015": { - "op": "+", - "defined_out": [ - "add%0#0", - "aggregate%array_length%0#0", - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "coupon_rates#0", - "add%0#0" - ] - }, - "1016": { - "op": "swap", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "add%0#0", - "coupon_rates#0" - ] - }, - "1017": { - "op": "len", - "defined_out": [ - "add%0#0", - "aggregate%array_length%0#0", - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "len%7#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "add%0#0", - "len%7#0" - ] - }, - "1018": { - "op": "==", - "defined_out": [ - "aggregate%array_length%0#0", - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "eq%7#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "eq%7#0" - ] - }, - "1019": { - "error": "invalid number of bytes for arc4.dynamic_array", - "op": "assert // invalid number of bytes for arc4.dynamic_array", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "1020": { - "op": "txna ApplicationArgs 9" - }, - "1023": { - "op": "dup", - "defined_out": [ - "aggregate%array_length%0#0", - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_events#0", - "time_events#0" - ] - }, - "1024": { - "op": "cover 7", - "defined_out": [ - "aggregate%array_length%0#0", - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_events#0" - ] - }, - "1026": { - "op": "dup", - "defined_out": [ - "aggregate%array_length%0#0", - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0", - "time_events#0 (copy)" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_events#0", - "time_events#0 (copy)" - ] - }, - "1027": { - "op": "intc_0 // 0", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_events#0", - "time_events#0 (copy)", - "0" - ] - }, - "1028": { - "error": "invalid array length header", - "op": "extract_uint16 // on error: invalid array length header", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_events#0", - "aggregate%array_length%1#0" - ] - }, - "1029": { - "op": "dup", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%1#0" - ] - }, - "1030": { - "op": "cover 8", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_events#0", - "aggregate%array_length%1#0" - ] - }, - "1032": { - "op": "intc_3 // 8", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_events#0", - "aggregate%array_length%1#0", - "8" - ] - }, - "1033": { - "op": "*", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "mul%1#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_events#0", - "mul%1#0" - ] - }, - "1034": { - "op": "pushint 2", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_events#0", - "mul%1#0", - "2" - ] - }, - "1036": { - "op": "+", - "defined_out": [ - "add%1#0", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_events#0", - "add%1#0" - ] - }, - "1037": { - "op": "swap", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "add%1#0", - "time_events#0" - ] - }, - "1038": { - "op": "len", - "defined_out": [ - "add%1#0", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "len%8#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "add%1#0", - "len%8#0" - ] - }, - "1039": { - "op": "==", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "eq%8#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "eq%8#0" - ] - }, - "1040": { - "error": "invalid number of bytes for arc4.dynamic_array", - "op": "assert // invalid number of bytes for arc4.dynamic_array", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "1041": { - "op": "txna ApplicationArgs 10", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_periods#0" - ] - }, - "1044": { - "op": "dup", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0", - "time_periods#0", - "time_periods#0 (copy)" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_periods#0", - "time_periods#0 (copy)" - ] - }, - "1045": { - "op": "intc_0 // 0", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_periods#0", - "time_periods#0 (copy)", - "0" - ] - }, - "1046": { - "error": "invalid array length header", - "op": "extract_uint16 // on error: invalid array length header", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_periods#0", - "aggregate%array_length%2#0" - ] - }, - "1047": { - "op": "dup", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_periods#0", - "aggregate%array_length%2#0", - "aggregate%array_length%2#0" - ] - }, - "1048": { - "op": "cover 8", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_periods#0", - "aggregate%array_length%2#0" - ] - }, - "1050": { - "op": "pushint 16", - "defined_out": [ - "16", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_periods#0", - "aggregate%array_length%2#0", - "16" - ] - }, - "1052": { - "op": "*", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "mul%2#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_periods#0", - "mul%2#0" - ] - }, - "1053": { - "op": "pushint 2", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_periods#0", - "mul%2#0", - "2" - ] - }, - "1055": { - "op": "+", - "defined_out": [ - "add%2#0", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_periods#0", - "add%2#0" - ] - }, - "1056": { - "op": "swap", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "add%2#0", - "time_periods#0" - ] - }, - "1057": { - "op": "len", - "defined_out": [ - "add%2#0", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "len%9#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "add%2#0", - "len%9#0" - ] - }, - "1058": { - "op": "==", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "eq%9#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "eq%9#0" - ] - }, - "1059": { - "error": "invalid number of bytes for arc4.dynamic_array>", - "op": "assert // invalid number of bytes for arc4.dynamic_array>", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "1060": { - "callsub": "modules.rbac.RbacModule.assert_caller_is_arranger", - "op": "callsub assert_caller_is_arranger" - }, - "1063": { - "op": "intc_0 // 0", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "0" - ] - }, - "1064": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"", - "0", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "0", - "\"status\"" - ] - }, - "1065": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "maybe_exists%0#0", - "maybe_value%0#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1066": { - "error": "check self.status exists", - "op": "assert // check self.status exists", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "maybe_value%0#0" - ] - }, - "1067": { - "op": "!", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0", - "tmp%0#1" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "tmp%0#1" - ] - }, - "1068": { - "error": "D-ASA already configured", - "op": "assert // D-ASA already configured", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "1069": { - "op": "dig 5", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "denomination_asset_id#0 (copy)", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "denomination_asset_id#0 (copy)" - ] - }, - "1071": { - "op": "asset_params_get AssetCreator", - "defined_out": [ - "_creator#0", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "exists#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "_creator#0", - "exists#0" - ] - }, - "1073": { - "op": "bury 1", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "exists#0" - ] - }, - "1075": { - "error": "Denomination asset is not properly set", - "op": "assert // Denomination asset is not properly set", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "1076": { - "op": "bytec 16 // \"denomination_asset_id\"", - "defined_out": [ - "\"denomination_asset_id\"", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "\"denomination_asset_id\"" - ] - }, - "1078": { - "op": "dig 6", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "\"denomination_asset_id\"", - "denomination_asset_id#0 (copy)" - ] - }, - "1080": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "1081": { - "op": "dig 4", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "settlement_asset_id#0 (copy)", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "settlement_asset_id#0 (copy)" - ] - }, - "1083": { - "op": "uncover 6", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "settlement_asset_id#0 (copy)", - "denomination_asset_id#0" - ] - }, - "1085": { - "op": "==", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "tmp%0#1" - ] - }, - "1086": { - "error": "Different settlement asset not supported, must be equal to denomination asset", - "op": "assert // Different settlement asset not supported, must be equal to denomination asset", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "1087": { - "op": "bytec 9 // \"settlement_asset_id\"", - "defined_out": [ - "\"settlement_asset_id\"", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "coupon_rates#0", - "day_count_convention#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "\"settlement_asset_id\"" - ] - }, - "1089": { - "op": "dig 5", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "\"settlement_asset_id\"", - "settlement_asset_id#0 (copy)" - ] - }, - "1091": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "1092": { - "op": "itxn_begin" - }, - "1093": { - "op": "global MinTxnFee", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "coupon_rates#0", - "day_count_convention#0", - "inner_txn_params%0%%param_Fee_idx_0#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "inner_txn_params%0%%param_Fee_idx_0#0" - ] - }, - "1095": { - "op": "global CurrentApplicationAddress", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "coupon_rates#0", - "day_count_convention#0", - "inner_txn_params%0%%param_AssetReceiver_idx_0#0", - "inner_txn_params%0%%param_Fee_idx_0#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "inner_txn_params%0%%param_Fee_idx_0#0", - "inner_txn_params%0%%param_AssetReceiver_idx_0#0" - ] - }, - "1097": { - "op": "intc_0 // 0", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "inner_txn_params%0%%param_Fee_idx_0#0", - "inner_txn_params%0%%param_AssetReceiver_idx_0#0", - "0" - ] - }, - "1098": { - "op": "itxn_field AssetAmount", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "inner_txn_params%0%%param_Fee_idx_0#0", - "inner_txn_params%0%%param_AssetReceiver_idx_0#0" - ] - }, - "1100": { - "op": "itxn_field AssetReceiver", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "inner_txn_params%0%%param_Fee_idx_0#0" - ] - }, - "1102": { - "op": "uncover 5", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "inner_txn_params%0%%param_Fee_idx_0#0", - "settlement_asset_id#0" - ] - }, - "1104": { - "op": "itxn_field XferAsset", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "inner_txn_params%0%%param_Fee_idx_0#0" - ] - }, - "1106": { - "op": "pushint 4 // axfer", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "axfer", - "coupon_rates#0", - "day_count_convention#0", - "inner_txn_params%0%%param_Fee_idx_0#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "inner_txn_params%0%%param_Fee_idx_0#0", - "axfer" - ] - }, - "1108": { - "op": "itxn_field TypeEnum", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "inner_txn_params%0%%param_Fee_idx_0#0" - ] - }, - "1110": { - "op": "itxn_field Fee", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "1112": { - "op": "itxn_submit" - }, - "1113": { - "op": "dig 3", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "coupon_rates#0", - "day_count_convention#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal#0 (copy)", - "principal_discount#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "principal#0 (copy)" - ] - }, - "1115": { - "op": "dig 2", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "coupon_rates#0", - "day_count_convention#0", - "interest_rate#0", - "minimum_denomination#0", - "minimum_denomination#0 (copy)", - "principal#0", - "principal#0 (copy)", - "principal_discount#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "principal#0 (copy)", - "minimum_denomination#0 (copy)" - ] - }, - "1117": { - "op": "%", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "coupon_rates#0", - "day_count_convention#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "time_events#0", - "tmp%1#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "tmp%1#0" - ] - }, - "1118": { - "op": "!", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "coupon_rates#0", - "day_count_convention#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "time_events#0", - "tmp%2#1" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "tmp%2#1" - ] - }, - "1119": { - "error": "Minimum denomination is not a divisor of principal", - "op": "assert // Minimum denomination is not a divisor of principal", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "1120": { - "op": "bytec 6 // \"unit_value\"", - "defined_out": [ - "\"unit_value\"", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "coupon_rates#0", - "day_count_convention#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "\"unit_value\"" - ] - }, - "1122": { - "op": "dig 2", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "\"unit_value\"", - "minimum_denomination#0 (copy)" - ] - }, - "1124": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "1125": { - "op": "uncover 3", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "principal#0" - ] - }, - "1127": { - "op": "uncover 2", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal_discount#0", - "day_count_convention#0", - "principal#0", - "minimum_denomination#0" - ] - }, - "1129": { - "op": "/", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "coupon_rates#0", - "day_count_convention#0", - "interest_rate#0", - "principal_discount#0", - "time_events#0", - "tmp%3#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal_discount#0", - "day_count_convention#0", - "tmp%3#0" - ] - }, - "1130": { - "op": "bytec 15 // \"total_units\"", - "defined_out": [ - "\"total_units\"", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "coupon_rates#0", - "day_count_convention#0", - "interest_rate#0", - "principal_discount#0", - "time_events#0", - "tmp%3#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal_discount#0", - "day_count_convention#0", - "tmp%3#0", - "\"total_units\"" - ] - }, - "1132": { - "op": "swap", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal_discount#0", - "day_count_convention#0", - "\"total_units\"", - "tmp%3#0" - ] - }, - "1133": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal_discount#0", - "day_count_convention#0" - ] - }, - "1134": { - "op": "bytec 26 // \"principal_discount\"", - "defined_out": [ - "\"principal_discount\"", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "coupon_rates#0", - "day_count_convention#0", - "interest_rate#0", - "principal_discount#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal_discount#0", - "day_count_convention#0", - "\"principal_discount\"" - ] - }, - "1136": { - "op": "uncover 2", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "\"principal_discount\"", - "principal_discount#0" - ] - }, - "1138": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0" - ] - }, - "1139": { - "op": "btoi", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "coupon_rates#0", - "day_count_convention#2", - "interest_rate#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1140": { - "op": "dup", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "coupon_rates#0", - "day_count_convention#2", - "interest_rate#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "day_count_convention#2" - ] - }, - "1141": { - "op": "bz asset_config_bool_true@3", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1144": { - "op": "dup", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "day_count_convention#2" - ] - }, - "1145": { - "op": "intc 4 // 255", - "defined_out": [ - "255", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "coupon_rates#0", - "day_count_convention#2", - "interest_rate#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "day_count_convention#2", - "255" - ] - }, - "1147": { - "op": "==", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "coupon_rates#0", - "day_count_convention#2", - "interest_rate#0", - "time_events#0", - "tmp%1#1" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "tmp%1#1" - ] - }, - "1148": { - "op": "bz asset_config_bool_false@4", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1151": { - "block": "asset_config_bool_true@3", - "stack_in": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ], - "op": "intc_1 // 1", - "defined_out": [ - "or_result%0#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "or_result%0#0" - ] - }, - "1152": { - "error": "Invalid day-count convention ID", - "block": "asset_config_bool_merge@5", - "stack_in": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "or_result%0#0" - ], - "op": "assert // Invalid day-count convention ID", - "defined_out": [], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1153": { - "op": "bytec 17 // \"day_count_convention\"", - "defined_out": [ - "\"day_count_convention\"" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "\"day_count_convention\"" - ] - }, - "1155": { - "op": "dig 1", - "defined_out": [ - "\"day_count_convention\"", - "day_count_convention#2" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "\"day_count_convention\"", - "day_count_convention#2" - ] - }, - "1157": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1158": { - "op": "dig 6", - "defined_out": [ - "day_count_convention#2", - "interest_rate#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "interest_rate#0" - ] - }, - "1160": { - "op": "btoi", - "defined_out": [ - "day_count_convention#2", - "interest_rate#0", - "interest_rate#2" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "interest_rate#2" - ] - }, - "1161": { - "op": "bury 8", - "defined_out": [ - "day_count_convention#2", - "interest_rate#0", - "interest_rate#2" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1163": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "day_count_convention#2", - "interest_rate#0", - "interest_rate#2" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "0" - ] - }, - "1164": { - "op": "bytec 26 // \"principal_discount\"", - "defined_out": [ - "\"principal_discount\"", - "0", - "day_count_convention#2", - "interest_rate#0", - "interest_rate#2" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "0", - "\"principal_discount\"" - ] - }, - "1166": { - "op": "app_global_get_ex", - "defined_out": [ - "day_count_convention#2", - "interest_rate#0", - "interest_rate#2", - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1167": { - "error": "check self.principal_discount exists", - "op": "assert // check self.principal_discount exists", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "maybe_value%0#0" - ] - }, - "1168": { - "op": "bnz asset_config_after_if_else@7", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1171": { - "op": "dig 7", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "interest_rate#2" - ] - }, - "1173": { - "error": "Interest rate is not properly defined", - "op": "assert // Interest rate is not properly defined", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1174": { - "block": "asset_config_after_if_else@7", - "stack_in": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ], - "op": "bytec 33 // \"interest_rate\"", - "defined_out": [ - "\"interest_rate\"" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "\"interest_rate\"" - ] - }, - "1176": { - "op": "dig 8", - "defined_out": [ - "\"interest_rate\"", - "interest_rate#2" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "\"interest_rate\"", - "interest_rate#2" - ] - }, - "1178": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1179": { - "op": "dig 4", - "defined_out": [ - "aggregate%array_length%0#0", - "interest_rate#2" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_length%0#0" - ] - }, - "1181": { - "op": "dup", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%0#0 (copy)", - "interest_rate#2" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_length%0#0", - "aggregate%array_length%0#0 (copy)" - ] - }, - "1182": { - "error": "Coupon rates are not properly defined", - "op": "assert // Coupon rates are not properly defined", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_length%0#0" - ] - }, - "1183": { - "op": "bytec 7 // \"total_coupons\"", - "defined_out": [ - "\"total_coupons\"", - "aggregate%array_length%0#0", - "interest_rate#2" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_length%0#0", - "\"total_coupons\"" - ] - }, - "1185": { - "op": "dig 1", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_length%0#0", - "\"total_coupons\"", - "aggregate%array_length%0#0 (copy)" - ] - }, - "1187": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_length%0#0" - ] - }, - "1188": { - "op": "bytec 19 // 0x636f75706f6e5261746573", - "defined_out": [ - "0x636f75706f6e5261746573", - "aggregate%array_length%0#0", - "interest_rate#2" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_length%0#0", - "0x636f75706f6e5261746573" - ] - }, - "1190": { - "op": "box_del", - "defined_out": [ - "aggregate%array_length%0#0", - "interest_rate#2", - "{box_del}" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_length%0#0", - "{box_del}" - ] - }, - "1191": { - "op": "pop", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_length%0#0" - ] - }, - "1192": { - "op": "bytec 19 // 0x636f75706f6e5261746573", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_length%0#0", - "0x636f75706f6e5261746573" - ] - }, - "1194": { - "op": "dig 7", - "defined_out": [ - "0x636f75706f6e5261746573", - "aggregate%array_length%0#0", - "coupon_rates#0", - "interest_rate#2" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_length%0#0", - "0x636f75706f6e5261746573", - "coupon_rates#0" - ] - }, - "1196": { - "op": "box_put", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_length%0#0" - ] - }, - "1197": { - "op": "pushint 4", - "defined_out": [ - "4", - "aggregate%array_length%0#0", - "coupon_rates#0", - "interest_rate#2" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_length%0#0", - "4" - ] - }, - "1199": { - "op": "+", - "defined_out": [ - "aggregate%array_length%0#0", - "coupon_rates#0", - "interest_rate#2", - "tmp%1#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "tmp%1#0" - ] - }, - "1200": { - "op": "dig 3", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "coupon_rates#0", - "interest_rate#2", - "tmp%1#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "tmp%1#0", - "aggregate%array_length%1#0" - ] - }, - "1202": { - "op": "==", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "coupon_rates#0", - "interest_rate#2", - "tmp%2#1" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "tmp%2#1" - ] - }, - "1203": { - "error": "Time events length is invalid", - "op": "assert // Time events length is invalid", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1204": { - "op": "dig 3", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "coupon_rates#0", - "interest_rate#2", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0" - ] - }, - "1206": { - "callsub": "modules.core_financial.common.CoreFinancialCommonMixin.assert_time_events_sorted", - "op": "callsub assert_time_events_sorted" - }, - "1209": { - "op": "bytec 12 // 0x74696d654576656e7473", - "defined_out": [ - "0x74696d654576656e7473", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "coupon_rates#0", - "interest_rate#2", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "0x74696d654576656e7473" - ] - }, - "1211": { - "op": "box_del", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "{box_del}" - ] - }, - "1212": { - "op": "pop", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0" - ] - }, - "1213": { - "op": "bytec 12 // 0x74696d654576656e7473", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "0x74696d654576656e7473" - ] - }, - "1215": { - "op": "dig 1", - "defined_out": [ - "0x74696d654576656e7473", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "coupon_rates#0", - "interest_rate#2", - "time_events#0", - "time_events#0 (copy)" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "0x74696d654576656e7473", - "time_events#0 (copy)" - ] - }, - "1217": { - "op": "box_put", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0" - ] - }, - "1218": { - "op": "dup", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "time_events#0 (copy)" - ] - }, - "1219": { - "op": "extract 2 0", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_trimmed%0#0", - "coupon_rates#0", - "interest_rate#2", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0" - ] - }, - "1222": { - "op": "dig 1", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0", - "time_events#0 (copy)" - ] - }, - "1224": { - "op": "pushint 2", - "defined_out": [ - "2", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_trimmed%0#0", - "coupon_rates#0", - "interest_rate#2", - "time_events#0", - "time_events#0 (copy)" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0", - "time_events#0 (copy)", - "2" - ] - }, - "1226": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_trimmed%0#0", - "coupon_rates#0", - "interest_rate#2", - "time_events#0", - "values%0#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0", - "values%0#0" - ] - }, - "1227": { - "op": "bytec 10 // \"primary_distribution_opening_date\"", - "defined_out": [ - "\"primary_distribution_opening_date\"", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_trimmed%0#0", - "coupon_rates#0", - "interest_rate#2", - "time_events#0", - "values%0#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0", - "values%0#0", - "\"primary_distribution_opening_date\"" - ] - }, - "1229": { - "op": "swap", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0", - "\"primary_distribution_opening_date\"", - "values%0#0" - ] - }, - "1230": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0" - ] - }, - "1231": { - "op": "dig 1", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0", - "time_events#0 (copy)" - ] - }, - "1233": { - "op": "pushint 10", - "defined_out": [ - "10", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_trimmed%0#0", - "coupon_rates#0", - "interest_rate#2", - "time_events#0", - "time_events#0 (copy)" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0", - "time_events#0 (copy)", - "10" - ] - }, - "1235": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_trimmed%0#0", - "coupon_rates#0", - "interest_rate#2", - "time_events#0", - "values%1#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0", - "values%1#0" - ] - }, - "1236": { - "op": "bytec 27 // \"primary_distribution_closure_date\"", - "defined_out": [ - "\"primary_distribution_closure_date\"", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_trimmed%0#0", - "coupon_rates#0", - "interest_rate#2", - "time_events#0", - "values%1#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0", - "values%1#0", - "\"primary_distribution_closure_date\"" - ] - }, - "1238": { - "op": "swap", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0", - "\"primary_distribution_closure_date\"", - "values%1#0" - ] - }, - "1239": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0" - ] - }, - "1240": { - "op": "dig 1", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0", - "time_events#0 (copy)" - ] - }, - "1242": { - "op": "pushint 18", - "defined_out": [ - "18", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_trimmed%0#0", - "coupon_rates#0", - "interest_rate#2", - "time_events#0", - "time_events#0 (copy)" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0", - "time_events#0 (copy)", - "18" - ] - }, - "1244": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_trimmed%0#0", - "coupon_rates#0", - "interest_rate#2", - "time_events#0", - "values%2#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0", - "values%2#0" - ] - }, - "1245": { - "op": "bytec 4 // \"issuance_date\"", - "defined_out": [ - "\"issuance_date\"", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_trimmed%0#0", - "coupon_rates#0", - "interest_rate#2", - "time_events#0", - "values%2#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0", - "values%2#0", - "\"issuance_date\"" - ] - }, - "1247": { - "op": "swap", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0", - "\"issuance_date\"", - "values%2#0" - ] - }, - "1248": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0" - ] - }, - "1249": { - "op": "swap", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_trimmed%0#0", - "time_events#0" - ] - }, - "1250": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_trimmed%0#0", - "coupon_rates#0", - "interest_rate#2", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_trimmed%0#0", - "time_events#0", - "0" - ] - }, - "1251": { - "error": "invalid array length header", - "op": "extract_uint16 // on error: invalid array length header", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%6#0", - "aggregate%array_trimmed%0#0", - "coupon_rates#0", - "interest_rate#2", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_trimmed%0#0", - "aggregate%array_length%6#0" - ] - }, - "1252": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%6#0", - "aggregate%array_trimmed%0#0", - "coupon_rates#0", - "interest_rate#2", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_trimmed%0#0", - "aggregate%array_length%6#0", - "1" - ] - }, - "1253": { - "op": "-", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_trimmed%0#0", - "tmp%1#0" - ] - }, - "1254": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_trimmed%0#0", - "coupon_rates#0", - "interest_rate#2", - "time_events#0", - "tmp%1#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_trimmed%0#0", - "tmp%1#0", - "8" - ] - }, - "1255": { - "op": "*", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_trimmed%0#0", - "aggregate%bytes_offset%3#0", - "coupon_rates#0", - "interest_rate#2", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_trimmed%0#0", - "aggregate%bytes_offset%3#0" - ] - }, - "1256": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "coupon_rates#0", - "interest_rate#2", - "time_events#0", - "values%3#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "values%3#0" - ] - }, - "1257": { - "op": "bytec 5 // \"maturity_date\"", - "defined_out": [ - "\"maturity_date\"", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "coupon_rates#0", - "interest_rate#2", - "time_events#0", - "values%3#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "values%3#0", - "\"maturity_date\"" - ] - }, - "1259": { - "op": "swap", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "\"maturity_date\"", - "values%3#0" - ] - }, - "1260": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1261": { - "op": "dig 1", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "coupon_rates#0", - "interest_rate#2", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_length%2#0" - ] - }, - "1263": { - "op": "!", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "coupon_rates#0", - "interest_rate#2", - "time_events#0", - "tmp%1#1" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "tmp%1#1" - ] - }, - "1264": { - "error": "Time periods are not properly defined", - "op": "assert // Time periods are not properly defined", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1265": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "coupon_rates#0", - "interest_rate#2", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "\"status\"" - ] - }, - "1266": { - "op": "pushint 100", - "defined_out": [ - "\"status\"", - "100", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "coupon_rates#0", - "interest_rate#2", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "\"status\"", - "100" - ] - }, - "1268": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1269": { - "op": "intc_1 // 1", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "1" - ] - }, - "1270": { - "op": "return", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1271": { - "block": "asset_config_bool_false@4", - "stack_in": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ], - "op": "intc_0 // 0", - "defined_out": [ - "or_result%0#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "or_result%0#0" - ] - }, - "1272": { - "op": "b asset_config_bool_merge@5" - }, - "1275": { - "subroutine": "modules.core_financial.coupon.FixedCouponCashflowMixin.get_account_units_current_value[routing]", - "params": {}, - "block": "get_account_units_current_value", - "stack_in": [], - "op": "intc_0 // 0", - "stack_out": [ - "box_prefixed_key%0#1" - ] - }, - "1276": { - "op": "pushbytes \"\"", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0" - ] - }, - "1278": { - "op": "dupn 4", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0" - ] - }, - "1280": { - "op": "txna ApplicationArgs 1" - }, - "1283": { - "op": "dup", - "defined_out": [ - "holding_address#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "holding_address#0" - ] - }, - "1284": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "len%0#0" - ] - }, - "1285": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "len%0#0", - "32" - ] - }, - "1286": { - "op": "==", - "defined_out": [ - "eq%0#0", - "holding_address#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "eq%0#0" - ] - }, - "1287": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0" - ] - }, - "1288": { - "op": "txna ApplicationArgs 2", - "defined_out": [ - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "tmp%2#0" - ] - }, - "1291": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ] - }, - "1292": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%1#0", - "tmp%2#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "tmp%2#0", - "len%1#0" - ] - }, - "1293": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "holding_address#0", - "len%1#0", - "tmp%2#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "tmp%2#0", - "len%1#0", - "8" - ] - }, - "1294": { - "op": "==", - "defined_out": [ - "eq%1#0", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "tmp%2#0", - "eq%1#0" - ] - }, - "1295": { - "error": "invalid number of bytes for arc4.uint64", - "op": "assert // invalid number of bytes for arc4.uint64", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "tmp%2#0" - ] - }, - "1296": { - "op": "btoi", - "defined_out": [ - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1297": { - "op": "intc_0 // 0", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "0" - ] - }, - "1298": { - "op": "bytec 10 // \"primary_distribution_opening_date\"", - "defined_out": [ - "\"primary_distribution_opening_date\"", - "0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "0", - "\"primary_distribution_opening_date\"" - ] - }, - "1300": { - "op": "app_global_get_ex", - "defined_out": [ - "holding_address#0", - "maybe_exists%0#0", - "maybe_value%0#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1301": { - "error": "check self.primary_distribution_opening_date exists", - "op": "assert // check self.primary_distribution_opening_date exists", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "maybe_value%0#0" - ] - }, - "1302": { - "op": "bz get_account_units_current_value_bool_false@4", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1305": { - "op": "global LatestTimestamp", - "defined_out": [ - "holding_address#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "tmp%1#1" - ] - }, - "1307": { - "op": "intc_0 // 0", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "tmp%1#1", - "0" - ] - }, - "1308": { - "op": "bytec 10 // \"primary_distribution_opening_date\"", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "tmp%1#1", - "0", - "\"primary_distribution_opening_date\"" - ] - }, - "1310": { - "op": "app_global_get_ex", - "defined_out": [ - "holding_address#0", - "maybe_exists%1#0", - "maybe_value%1#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "tmp%1#1", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "1311": { - "error": "check self.primary_distribution_opening_date exists", - "op": "assert // check self.primary_distribution_opening_date exists", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "tmp%1#1", - "maybe_value%1#0" - ] - }, - "1312": { - "op": ">=", - "defined_out": [ - "holding_address#0", - "tmp%2#1", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "tmp%2#1" - ] - }, - "1313": { - "op": "bz get_account_units_current_value_bool_false@4", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1316": { - "op": "intc_1 // 1", - "defined_out": [ - "and_result%0#0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "and_result%0#0" - ] - }, - "1317": { - "error": "Primary distribution not yet executed", - "block": "get_account_units_current_value_bool_merge@5", - "stack_in": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "and_result%0#0" - ], - "op": "assert // Primary distribution not yet executed", - "defined_out": [], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1318": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "0x52333023" - ] - }, - "1319": { - "op": "dig 2", - "defined_out": [ - "0x52333023", - "holding_address#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "0x52333023", - "holding_address#0" - ] - }, - "1321": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1" - ] - }, - "1322": { - "op": "dup", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1" - ] - }, - "1323": { - "op": "bury 9", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1" - ] - }, - "1325": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "holding_address#0", - "maybe_exists%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "1326": { - "op": "bury 1", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "maybe_exists%0#0" - ] - }, - "1328": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1329": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "units#0" - ] - }, - "1330": { - "op": "bz get_account_units_current_value_bool_false@8", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1333": { - "op": "dig 7", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1" - ] - }, - "1335": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0", - "box_prefixed_key%0#1", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "1336": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%box_get%0#0" - ] - }, - "1337": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "aggregate%box_get%0#0", - "box_prefixed_key%0#1", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%box_get%0#0", - "32" - ] - }, - "1338": { - "op": "extract_uint64", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "units#0", - "values%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "values%0#0" - ] - }, - "1339": { - "op": "dig 1", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "values%0#0", - "units#0" - ] - }, - "1341": { - "op": ">=", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "tmp%4#1", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "tmp%4#1" - ] - }, - "1342": { - "op": "bz get_account_units_current_value_bool_false@8", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1345": { - "op": "intc_1 // 1", - "defined_out": [ - "and_result%1#0", - "box_prefixed_key%0#1", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "and_result%1#0" - ] - }, - "1346": { - "error": "Invalid amount of units for the account", - "block": "get_account_units_current_value_bool_merge@9", - "stack_in": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "and_result%1#0" - ], - "op": "assert // Invalid amount of units for the account", - "defined_out": [], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1347": { - "op": "dig 1", - "defined_out": [ - "holding_address#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "holding_address#0" - ] - }, - "1349": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "holding_address#0", - "holding_address#0 (copy)" - ] - }, - "1350": { - "op": "dig 2", - "defined_out": [ - "holding_address#0", - "holding_address#0 (copy)", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "holding_address#0", - "holding_address#0 (copy)", - "units#0" - ] - }, - "1352": { - "callsub": "modules.accounting.AccountingModule.account_units_value", - "op": "callsub account_units_value", - "defined_out": [ - "account_units_nominal_value#0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "holding_address#0", - "account_units_nominal_value#0" - ] - }, - "1355": { - "op": "bury 8", - "defined_out": [ - "account_units_nominal_value#0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "holding_address#0" - ] - }, - "1357": { - "op": "intc_0 // 0", - "defined_out": [ - "account_units_nominal_value#0", - "accrued_interest#0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "holding_address#0", - "accrued_interest#0" - ] - }, - "1358": { - "op": "bury 7", - "defined_out": [ - "account_units_nominal_value#0", - "accrued_interest#0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "holding_address#0" - ] - }, - "1360": { - "op": "intc_0 // 0", - "defined_out": [ - "account_units_nominal_value#0", - "accrued_interest#0", - "holding_address#0", - "numerator#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "holding_address#0", - "numerator#0" - ] - }, - "1361": { - "op": "bury 4", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "holding_address#0" - ] - }, - "1363": { - "op": "intc_0 // 0", - "defined_out": [ - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "holding_address#0", - "numerator#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "holding_address#0", - "denominator#0" - ] - }, - "1364": { - "op": "bury 6", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "holding_address#0" - ] - }, - "1366": { - "callsub": "modules.core_financial.coupon.FixedCouponCashflowMixin.count_due_coupons", - "op": "callsub count_due_coupons", - "defined_out": [ - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "holding_address#0", - "numerator#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "holding_address#0", - "due_coupons#0" - ] - }, - "1369": { - "op": "dup", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "holding_address#0", - "due_coupons#0", - "due_coupons#0" - ] - }, - "1370": { - "op": "bury 6", - "defined_out": [ - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "holding_address#0", - "numerator#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "holding_address#0", - "due_coupons#0" - ] - }, - "1372": { - "op": "swap", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "due_coupons#0", - "holding_address#0" - ] - }, - "1373": { - "op": "dig 1", - "defined_out": [ - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "due_coupons#0 (copy)", - "holding_address#0", - "numerator#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "due_coupons#0", - "holding_address#0", - "due_coupons#0 (copy)" - ] - }, - "1375": { - "callsub": "modules.core_financial.coupon.CouponCashflowMixin.assert_no_pending_coupon_payment", - "op": "callsub assert_no_pending_coupon_payment", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "due_coupons#0" - ] - }, - "1378": { - "callsub": "modules.core_financial.coupon.FixedCouponCashflowMixin.is_accruing_interest", - "op": "callsub is_accruing_interest", - "defined_out": [ - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "holding_address#0", - "numerator#0", - "tmp%7#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "tmp%7#0" - ] - }, - "1381": { - "op": "bz get_account_units_current_value_after_if_else@11", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1384": { - "op": "dig 3", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "due_coupons#0" - ] - }, - "1386": { - "op": "dup", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "due_coupons#0", - "due_coupons#0 (copy)" - ] - }, - "1387": { - "callsub": "modules.core_financial.coupon.FixedCouponCashflowMixin.day_count_factor", - "op": "callsub day_count_factor", - "defined_out": [ - "account_units_nominal_value#0", - "accrued_interest#0", - "day_count_factor#0", - "denominator#0", - "due_coupons#0", - "holding_address#0", - "numerator#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "due_coupons#0", - "day_count_factor#0" - ] - }, - "1390": { - "op": "dig 3", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "due_coupons#0", - "day_count_factor#0", - "holding_address#0" - ] - }, - "1392": { - "op": "dig 3", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "due_coupons#0", - "day_count_factor#0", - "holding_address#0", - "units#0" - ] - }, - "1394": { - "op": "uncover 3", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "day_count_factor#0", - "holding_address#0", - "units#0", - "due_coupons#0" - ] - }, - "1396": { - "callsub": "modules.core_financial.coupon.FixedCouponCashflowMixin.accrued_interest_amount", - "op": "callsub accrued_interest_amount", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "day_count_factor#0", - "accrued_interest#0" - ] - }, - "1399": { - "op": "bury 7", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "day_count_factor#0" - ] - }, - "1401": { - "op": "dup", - "defined_out": [ - "account_units_nominal_value#0", - "accrued_interest#0", - "day_count_factor#0", - "day_count_factor#0 (copy)", - "denominator#0", - "due_coupons#0", - "holding_address#0", - "numerator#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "day_count_factor#0", - "day_count_factor#0 (copy)" - ] - }, - "1402": { - "op": "intc_0 // 0", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "day_count_factor#0", - "day_count_factor#0 (copy)", - "0" - ] - }, - "1403": { - "op": "extract_uint64", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "day_count_factor#0", - "numerator#0" - ] - }, - "1404": { - "op": "bury 4", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "day_count_factor#0" - ] - }, - "1406": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "account_units_nominal_value#0", - "accrued_interest#0", - "day_count_factor#0", - "denominator#0", - "due_coupons#0", - "holding_address#0", - "numerator#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "day_count_factor#0", - "8" - ] - }, - "1407": { - "op": "extract_uint64", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "denominator#0" - ] - }, - "1408": { - "op": "bury 5", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1410": { - "block": "get_account_units_current_value_after_if_else@11", - "stack_in": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0" - ], - "op": "dig 2", - "defined_out": [ - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "numerator#0" - ] - }, - "1412": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%val_as_bytes%0#0" - ] - }, - "1413": { - "op": "dig 5", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "denominator#0", - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%val_as_bytes%0#0", - "denominator#0" - ] - }, - "1415": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0", - "denominator#0", - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0" - ] - }, - "1416": { - "op": "concat", - "defined_out": [ - "aggregate%head%1#0", - "denominator#0", - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%head%1#0" - ] - }, - "1417": { - "op": "dig 7", - "defined_out": [ - "account_units_nominal_value#0", - "aggregate%head%1#0", - "denominator#0", - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%head%1#0", - "account_units_nominal_value#0" - ] - }, - "1419": { - "op": "itob", - "defined_out": [ - "account_units_nominal_value#0", - "aggregate%head%1#0", - "aggregate%val_as_bytes%2#0", - "denominator#0", - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%head%1#0", - "aggregate%val_as_bytes%2#0" - ] - }, - "1420": { - "op": "dig 7", - "defined_out": [ - "account_units_nominal_value#0", - "accrued_interest#0", - "aggregate%head%1#0", - "aggregate%val_as_bytes%2#0", - "denominator#0", - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%head%1#0", - "aggregate%val_as_bytes%2#0", - "accrued_interest#0" - ] - }, - "1422": { - "op": "itob", - "defined_out": [ - "account_units_nominal_value#0", - "accrued_interest#0", - "aggregate%head%1#0", - "aggregate%val_as_bytes%2#0", - "aggregate%val_as_bytes%3#0", - "denominator#0", - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%head%1#0", - "aggregate%val_as_bytes%2#0", - "aggregate%val_as_bytes%3#0" - ] - }, - "1423": { - "op": "concat", - "defined_out": [ - "account_units_nominal_value#0", - "accrued_interest#0", - "aggregate%head%1#0", - "aggregate%head%3#0", - "denominator#0", - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%head%1#0", - "aggregate%head%3#0" - ] - }, - "1424": { - "op": "swap", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%head%3#0", - "aggregate%head%1#0" - ] - }, - "1425": { - "op": "concat", - "defined_out": [ - "account_units_nominal_value#0", - "accrued_interest#0", - "aggregate%head%4#0", - "denominator#0", - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%head%4#0" - ] - }, - "1426": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "account_units_nominal_value#0", - "accrued_interest#0", - "aggregate%head%4#0", - "denominator#0", - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%head%4#0", - "0x151f7c75" - ] - }, - "1427": { - "op": "swap", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "0x151f7c75", - "aggregate%head%4#0" - ] - }, - "1428": { - "op": "concat", - "defined_out": [ - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "numerator#0", - "tmp%5#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "tmp%5#0" - ] - }, - "1429": { - "op": "log", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1430": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "1" - ] - }, - "1431": { - "op": "return", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1432": { - "block": "get_account_units_current_value_bool_false@8", - "stack_in": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "and_result%1#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "and_result%1#0" - ] - }, - "1433": { - "op": "b get_account_units_current_value_bool_merge@9" - }, - "1436": { - "block": "get_account_units_current_value_bool_false@4", - "stack_in": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "and_result%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "and_result%0#0" - ] - }, - "1437": { - "op": "b get_account_units_current_value_bool_merge@5" - }, - "1440": { - "subroutine": "modules.core_financial.coupon.FixedCouponCashflowMixin.get_coupon_rates[routing]", - "params": {}, - "block": "get_coupon_rates", - "stack_in": [], - "op": "bytec 30 // 0x0000" - }, - "1442": { - "op": "intc_0 // 0" - }, - "1443": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"", - "0", - "coupon_rates#0" - ], - "stack_out": [ - "coupon_rates#0", - "0", - "\"status\"" - ] - }, - "1444": { - "op": "app_global_get_ex", - "defined_out": [ - "coupon_rates#0", - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "coupon_rates#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1445": { - "error": "check self.status exists", - "op": "assert // check self.status exists", - "stack_out": [ - "coupon_rates#0", - "maybe_value%0#0" - ] - }, - "1446": { - "op": "pushint 100", - "defined_out": [ - "100", - "coupon_rates#0", - "maybe_value%0#0" - ], - "stack_out": [ - "coupon_rates#0", - "maybe_value%0#0", - "100" - ] - }, - "1448": { - "op": "==", - "defined_out": [ - "coupon_rates#0", - "tmp%0#2" - ], - "stack_out": [ - "coupon_rates#0", - "tmp%0#2" - ] - }, - "1449": { - "op": "bz get_coupon_rates_after_if_else@3", - "stack_out": [ - "coupon_rates#0" - ] - }, - "1452": { - "op": "bytec 19 // 0x636f75706f6e5261746573", - "defined_out": [ - "0x636f75706f6e5261746573", - "coupon_rates#0" - ], - "stack_out": [ - "coupon_rates#0", - "0x636f75706f6e5261746573" - ] - }, - "1454": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%1#0", - "coupon_rates#0" - ], - "stack_out": [ - "coupon_rates#0", - "coupon_rates#0", - "aggregate%box_get%1#0" - ] - }, - "1455": { - "op": "swap", - "stack_out": [ - "coupon_rates#0", - "aggregate%box_get%1#0", - "coupon_rates#0" - ] - }, - "1456": { - "op": "bury 2", - "stack_out": [ - "coupon_rates#0", - "aggregate%box_get%1#0" - ] - }, - "1458": { - "error": "check self.coupon_rates exists", - "op": "assert // check self.coupon_rates exists", - "stack_out": [ - "coupon_rates#0" - ] - }, - "1459": { - "block": "get_coupon_rates_after_if_else@3", - "stack_in": [ - "coupon_rates#0" - ], - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75" - ], - "stack_out": [ - "coupon_rates#0", - "0x151f7c75" - ] - }, - "1460": { - "op": "dig 1", - "defined_out": [ - "0x151f7c75", - "coupon_rates#0" - ], - "stack_out": [ - "coupon_rates#0", - "0x151f7c75", - "coupon_rates#0" - ] - }, - "1462": { - "op": "concat", - "defined_out": [ - "coupon_rates#0", - "tmp%1#0" - ], - "stack_out": [ - "coupon_rates#0", - "tmp%1#0" - ] - }, - "1463": { - "op": "log", - "stack_out": [ - "coupon_rates#0" - ] - }, - "1464": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "coupon_rates#0" - ], - "stack_out": [ - "coupon_rates#0", - "1" - ] - }, - "1465": { - "op": "return", - "stack_out": [ - "coupon_rates#0" - ] - }, - "1466": { - "subroutine": "modules.core_financial.coupon.FixedCouponCashflowMixin.get_payment_amount[routing]", - "params": {}, - "block": "get_payment_amount", - "stack_in": [], - "op": "pushbytes \"\"", - "stack_out": [ - "paid_coupons#0" - ] - }, - "1468": { - "op": "txna ApplicationArgs 1" - }, - "1471": { - "op": "dupn 2", - "defined_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ], - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "holding_address#0", - "holding_address#0 (copy)" - ] - }, - "1473": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "holding_address#0", - "len%0#0" - ] - }, - "1474": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "holding_address#0", - "len%0#0", - "32" - ] - }, - "1475": { - "op": "==", - "defined_out": [ - "eq%0#0", - "holding_address#0" - ], - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "holding_address#0", - "eq%0#0" - ] - }, - "1476": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "holding_address#0" - ] - }, - "1477": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023", - "holding_address#0" - ], - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "holding_address#0", - "0x52333023" - ] - }, - "1478": { - "op": "swap", - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "0x52333023", - "holding_address#0" - ] - }, - "1479": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0" - ], - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1" - ] - }, - "1480": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0" - ], - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1" - ] - }, - "1481": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "holding_address#0", - "maybe_exists%0#0" - ], - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "1482": { - "op": "bury 1", - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "1484": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1" - ] - }, - "1485": { - "op": "intc_0 // 0" - }, - "1486": { - "op": "dupn 2" - }, - "1488": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"", - "0", - "box_prefixed_key%0#1", - "holding_address#0", - "interest_amount#0", - "principal_amount#0" - ], - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0", - "0", - "\"status\"" - ] - }, - "1489": { - "op": "app_global_get_ex", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "interest_amount#0", - "maybe_exists%0#0", - "maybe_value%0#0", - "principal_amount#0" - ], - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1490": { - "error": "check self.status exists", - "op": "assert // check self.status exists", - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0", - "maybe_value%0#0" - ] - }, - "1491": { - "op": "pushint 100", - "defined_out": [ - "100", - "box_prefixed_key%0#1", - "holding_address#0", - "interest_amount#0", - "maybe_value%0#0", - "principal_amount#0" - ], - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0", - "maybe_value%0#0", - "100" - ] - }, - "1493": { - "op": "==", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "interest_amount#0", - "principal_amount#0", - "tmp%0#2" - ], - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0", - "tmp%0#2" - ] - }, - "1494": { - "op": "bz get_payment_amount_after_if_else@6", - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0" - ] - }, - "1497": { - "op": "dig 2", - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0", - "box_prefixed_key%0#1" - ] - }, - "1499": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0", - "box_prefixed_key%0#1", - "holding_address#0", - "interest_amount#0", - "principal_amount#0" - ], - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0", - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "1500": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0", - "aggregate%box_get%0#0" - ] - }, - "1501": { - "op": "pushint 48", - "defined_out": [ - "48", - "aggregate%box_get%0#0", - "box_prefixed_key%0#1", - "holding_address#0", - "interest_amount#0", - "principal_amount#0" - ], - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0", - "aggregate%box_get%0#0", - "48" - ] - }, - "1503": { - "op": "extract_uint64", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "interest_amount#0", - "paid_coupons#0", - "principal_amount#0" - ], - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0", - "paid_coupons#0" - ] - }, - "1504": { - "op": "dup", - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0", - "paid_coupons#0", - "paid_coupons#0" - ] - }, - "1505": { - "op": "bury 6", - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0", - "paid_coupons#0" - ] - }, - "1507": { - "op": "intc_0 // 0", - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0", - "paid_coupons#0", - "0" - ] - }, - "1508": { - "op": "bytec 7 // \"total_coupons\"", - "defined_out": [ - "\"total_coupons\"", - "0", - "box_prefixed_key%0#1", - "holding_address#0", - "interest_amount#0", - "paid_coupons#0", - "principal_amount#0" - ], - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0", - "paid_coupons#0", - "0", - "\"total_coupons\"" - ] - }, - "1510": { - "op": "app_global_get_ex", - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0", - "paid_coupons#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1511": { - "error": "check self.total_coupons exists", - "op": "assert // check self.total_coupons exists", - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0", - "paid_coupons#0", - "maybe_value%0#0" - ] - }, - "1512": { - "op": "<", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "interest_amount#0", - "paid_coupons#0", - "principal_amount#0", - "tmp%1#1" - ], - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0", - "tmp%1#1" - ] - }, - "1513": { - "op": "bz get_payment_amount_else_body@4", - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0" - ] - }, - "1516": { - "op": "dig 3", - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0", - "holding_address#0" - ] - }, - "1518": { - "callsub": "modules.accounting.AccountingModule.account_total_units_value", - "op": "callsub account_total_units_value", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "interest_amount#0", - "paid_coupons#0", - "principal_amount#0", - "tmp%2#1" - ], - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0", - "tmp%2#1" - ] - }, - "1521": { - "op": "dig 5", - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0", - "tmp%2#1", - "paid_coupons#0" - ] - }, - "1523": { - "op": "intc_1 // 1", - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0", - "tmp%2#1", - "paid_coupons#0", - "1" - ] - }, - "1524": { - "op": "+", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "interest_amount#0", - "paid_coupons#0", - "principal_amount#0", - "tmp%2#1", - "tmp%3#1" - ], - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0", - "tmp%2#1", - "tmp%3#1" - ] - }, - "1525": { - "callsub": "modules.core_financial.coupon.FixedCouponCashflowMixin.coupon_interest_amount", - "op": "callsub coupon_interest_amount", - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0", - "interest_amount#0" - ] - }, - "1528": { - "op": "bury 2", - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0" - ] - }, - "1530": { - "block": "get_payment_amount_after_if_else@6", - "stack_in": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0" - ], - "op": "dig 1", - "defined_out": [ - "interest_amount#0" - ], - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0", - "interest_amount#0" - ] - }, - "1532": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "interest_amount#0" - ], - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0", - "aggregate%val_as_bytes%0#0" - ] - }, - "1533": { - "op": "dig 1", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "interest_amount#0", - "principal_amount#0" - ], - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0", - "aggregate%val_as_bytes%0#0", - "principal_amount#0" - ] - }, - "1535": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0", - "interest_amount#0", - "principal_amount#0" - ], - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0" - ] - }, - "1536": { - "op": "concat", - "defined_out": [ - "aggregate%head%1#0", - "interest_amount#0", - "principal_amount#0" - ], - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0", - "aggregate%head%1#0" - ] - }, - "1537": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%head%1#0", - "interest_amount#0", - "principal_amount#0" - ], - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0", - "aggregate%head%1#0", - "0x151f7c75" - ] - }, - "1538": { - "op": "swap", - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0", - "0x151f7c75", - "aggregate%head%1#0" - ] - }, - "1539": { - "op": "concat", - "defined_out": [ - "interest_amount#0", - "principal_amount#0", - "tmp%3#0" - ], - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0", - "tmp%3#0" - ] - }, - "1540": { - "op": "log", - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0" - ] - }, - "1541": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "interest_amount#0", - "principal_amount#0" - ], - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0", - "1" - ] - }, - "1542": { - "op": "return", - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0" - ] - }, - "1543": { - "block": "get_payment_amount_else_body@4", - "stack_in": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0" - ], - "op": "dig 3", - "defined_out": [ - "holding_address#0" - ], - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0", - "holding_address#0" - ] - }, - "1545": { - "callsub": "modules.accounting.AccountingModule.account_total_units_value", - "op": "callsub account_total_units_value", - "defined_out": [ - "holding_address#0", - "principal_amount#0" - ], - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0", - "principal_amount#0" - ] - }, - "1548": { - "op": "bury 1", - "defined_out": [ - "holding_address#0", - "principal_amount#0" - ], - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0" - ] - }, - "1550": { - "op": "b get_payment_amount_after_if_else@6" - }, - "1553": { - "subroutine": "modules.core_financial.coupon.FixedCouponCashflowMixin.get_coupons_status[routing]", - "params": {}, - "block": "get_coupons_status", - "stack_in": [], - "callsub": "modules.core_financial.coupon.FixedCouponCashflowMixin.count_due_coupons", - "op": "callsub count_due_coupons", - "defined_out": [ - "due_coupons#0" - ], - "stack_out": [ - "due_coupons#0" - ] - }, - "1556": { - "op": "dupn 2", - "defined_out": [ - "due_coupons#0", - "due_coupons#0 (copy)" - ], - "stack_out": [ - "due_coupons#0", - "due_coupons#0", - "due_coupons#0 (copy)" - ] - }, - "1558": { - "callsub": "modules.core_financial.coupon.FixedCouponCashflowMixin.next_coupon_due_date", - "op": "callsub next_coupon_due_date", - "defined_out": [ - "due_coupons#0", - "next_coupon_due_date#0" - ], - "stack_out": [ - "due_coupons#0", - "due_coupons#0", - "next_coupon_due_date#0" - ] - }, - "1561": { - "op": "swap", - "defined_out": [ - "due_coupons#0", - "next_coupon_due_date#0" - ], - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "due_coupons#0" - ] - }, - "1562": { - "op": "dup", - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "due_coupons#0", - "due_coupons#0 (copy)" - ] - }, - "1563": { - "callsub": "modules.core_financial.coupon.CouponCashflowMixin.all_due_coupons_paid", - "op": "callsub all_due_coupons_paid", - "defined_out": [ - "all_due_coupons_paid#0", - "due_coupons#0", - "next_coupon_due_date#0" - ], - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "due_coupons#0", - "all_due_coupons_paid#0" - ] - }, - "1566": { - "op": "swap", - "defined_out": [ - "all_due_coupons_paid#0", - "due_coupons#0", - "next_coupon_due_date#0" - ], - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "due_coupons#0" - ] - }, - "1567": { - "op": "intc_0 // 0", - "defined_out": [ - "all_due_coupons_paid#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ], - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "due_coupons#0", - "numerator#0" - ] - }, - "1568": { - "op": "swap", - "defined_out": [ - "all_due_coupons_paid#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ], - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "due_coupons#0" - ] - }, - "1569": { - "op": "intc_0 // 0", - "defined_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ], - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "due_coupons#0", - "denominator#0" - ] - }, - "1570": { - "op": "swap", - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "due_coupons#0" - ] - }, - "1571": { - "callsub": "modules.core_financial.coupon.FixedCouponCashflowMixin.is_accruing_interest", - "op": "callsub is_accruing_interest", - "defined_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "tmp%3#0" - ], - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "tmp%3#0" - ] - }, - "1574": { - "op": "bz get_coupons_status_after_if_else@3", - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0" - ] - }, - "1577": { - "op": "dig 4", - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "due_coupons#0" - ] - }, - "1579": { - "callsub": "modules.core_financial.coupon.FixedCouponCashflowMixin.day_count_factor", - "op": "callsub day_count_factor", - "defined_out": [ - "all_due_coupons_paid#0", - "day_count_factor#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ], - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "day_count_factor#0" - ] - }, - "1582": { - "op": "dup", - "defined_out": [ - "all_due_coupons_paid#0", - "day_count_factor#0", - "day_count_factor#0 (copy)", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ], - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "day_count_factor#0", - "day_count_factor#0 (copy)" - ] - }, - "1583": { - "op": "intc_0 // 0", - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "day_count_factor#0", - "day_count_factor#0 (copy)", - "0" - ] - }, - "1584": { - "op": "extract_uint64", - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "day_count_factor#0", - "numerator#0" - ] - }, - "1585": { - "op": "bury 3", - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "day_count_factor#0" - ] - }, - "1587": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "all_due_coupons_paid#0", - "day_count_factor#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ], - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "day_count_factor#0", - "8" - ] - }, - "1588": { - "op": "extract_uint64", - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "denominator#0" - ] - }, - "1589": { - "op": "bury 1", - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0" - ] - }, - "1591": { - "block": "get_coupons_status_after_if_else@3", - "stack_in": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "0" - ] - }, - "1592": { - "op": "bytec 7 // \"total_coupons\"", - "defined_out": [ - "\"total_coupons\"", - "0" - ], - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "0", - "\"total_coupons\"" - ] - }, - "1594": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1595": { - "error": "check self.total_coupons exists", - "op": "assert // check self.total_coupons exists", - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "maybe_value%0#0" - ] - }, - "1596": { - "op": "dig 2", - "defined_out": [ - "maybe_value%0#0", - "numerator#0" - ], - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "maybe_value%0#0", - "numerator#0" - ] - }, - "1598": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "maybe_value%0#0", - "numerator#0" - ], - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "maybe_value%0#0", - "aggregate%val_as_bytes%0#0" - ] - }, - "1599": { - "op": "dig 2", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "denominator#0", - "maybe_value%0#0", - "numerator#0" - ], - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "maybe_value%0#0", - "aggregate%val_as_bytes%0#0", - "denominator#0" - ] - }, - "1601": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0", - "denominator#0", - "maybe_value%0#0", - "numerator#0" - ], - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "maybe_value%0#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0" - ] - }, - "1602": { - "op": "concat", - "defined_out": [ - "aggregate%head%1#0", - "denominator#0", - "maybe_value%0#0", - "numerator#0" - ], - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "maybe_value%0#0", - "aggregate%head%1#0" - ] - }, - "1603": { - "op": "swap", - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "aggregate%head%1#0", - "maybe_value%0#0" - ] - }, - "1604": { - "op": "itob", - "defined_out": [ - "aggregate%head%1#0", - "aggregate%val_as_bytes%2#0", - "denominator#0", - "numerator#0" - ], - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "aggregate%head%1#0", - "aggregate%val_as_bytes%2#0" - ] - }, - "1605": { - "op": "dig 6", - "defined_out": [ - "aggregate%head%1#0", - "aggregate%val_as_bytes%2#0", - "denominator#0", - "due_coupons#0", - "numerator#0" - ], - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "aggregate%head%1#0", - "aggregate%val_as_bytes%2#0", - "due_coupons#0" - ] - }, - "1607": { - "op": "itob", - "defined_out": [ - "aggregate%head%1#0", - "aggregate%val_as_bytes%2#0", - "aggregate%val_as_bytes%3#0", - "denominator#0", - "due_coupons#0", - "numerator#0" - ], - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "aggregate%head%1#0", - "aggregate%val_as_bytes%2#0", - "aggregate%val_as_bytes%3#0" - ] - }, - "1608": { - "op": "concat", - "defined_out": [ - "aggregate%head%1#0", - "aggregate%head%3#0", - "denominator#0", - "due_coupons#0", - "numerator#0" - ], - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "aggregate%head%1#0", - "aggregate%head%3#0" - ] - }, - "1609": { - "op": "dig 5", - "defined_out": [ - "aggregate%head%1#0", - "aggregate%head%3#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ], - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "aggregate%head%1#0", - "aggregate%head%3#0", - "next_coupon_due_date#0" - ] - }, - "1611": { - "op": "itob", - "defined_out": [ - "aggregate%head%1#0", - "aggregate%head%3#0", - "aggregate%val_as_bytes%4#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ], - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "aggregate%head%1#0", - "aggregate%head%3#0", - "aggregate%val_as_bytes%4#0" - ] - }, - "1612": { - "op": "concat", - "defined_out": [ - "aggregate%head%1#0", - "aggregate%head%4#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ], - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "aggregate%head%1#0", - "aggregate%head%4#0" - ] - }, - "1613": { - "op": "swap", - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "aggregate%head%4#0", - "aggregate%head%1#0" - ] - }, - "1614": { - "op": "concat", - "defined_out": [ - "aggregate%head%5#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ], - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "aggregate%head%5#0" - ] - }, - "1615": { - "op": "bytec 31 // 0x00", - "defined_out": [ - "0x00", - "aggregate%head%5#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ], - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "aggregate%head%5#0", - "0x00" - ] - }, - "1617": { - "op": "intc_0 // 0", - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "aggregate%head%5#0", - "0x00", - "0" - ] - }, - "1618": { - "op": "dig 5", - "defined_out": [ - "0", - "0x00", - "aggregate%head%5#0", - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ], - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "aggregate%head%5#0", - "0x00", - "0", - "all_due_coupons_paid#0" - ] - }, - "1620": { - "op": "setbit", - "defined_out": [ - "aggregate%encoded_bool%0#0", - "aggregate%head%5#0", - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ], - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "aggregate%head%5#0", - "aggregate%encoded_bool%0#0" - ] - }, - "1621": { - "op": "concat", - "defined_out": [ - "aggregate%head%6#0", - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ], - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "aggregate%head%6#0" - ] - }, - "1622": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%head%6#0", - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ], - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "aggregate%head%6#0", - "0x151f7c75" - ] - }, - "1623": { - "op": "swap", - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "0x151f7c75", - "aggregate%head%6#0" - ] - }, - "1624": { - "op": "concat", - "defined_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "tmp%1#0" - ], - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "tmp%1#0" - ] - }, - "1625": { - "op": "log", - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0" - ] - }, - "1626": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ], - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "1" - ] - }, - "1627": { - "op": "return", - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0" - ] - }, - "1628": { - "subroutine": "modules.payment_agent.coupon.CouponPaymentAgentMixin.pay_coupon[routing]", - "params": {}, - "block": "pay_coupon", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "holding_address#0" - ], - "stack_out": [ - "holding_address#0" - ] - }, - "1631": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ] - }, - "1632": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0" - ] - }, - "1633": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0", - "32" - ] - }, - "1634": { - "op": "==", - "defined_out": [ - "eq%0#0", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "eq%0#0" - ] - }, - "1635": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "holding_address#0" - ] - }, - "1636": { - "op": "txna ApplicationArgs 2", - "defined_out": [ - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0" - ] - }, - "1639": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ] - }, - "1640": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)", - "0" - ] - }, - "1641": { - "error": "invalid array length header", - "op": "extract_uint16 // on error: invalid array length header", - "defined_out": [ - "aggregate%array_length%0#0", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "aggregate%array_length%0#0" - ] - }, - "1642": { - "op": "pushint 2", - "defined_out": [ - "2", - "aggregate%array_length%0#0", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "aggregate%array_length%0#0", - "2" - ] - }, - "1644": { - "op": "+", - "defined_out": [ - "add%0#0", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "add%0#0" - ] - }, - "1645": { - "op": "dig 1", - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "add%0#0", - "tmp%2#0 (copy)" - ] - }, - "1647": { - "op": "len", - "defined_out": [ - "add%0#0", - "holding_address#0", - "len%1#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "add%0#0", - "len%1#0" - ] - }, - "1648": { - "op": "==", - "defined_out": [ - "eq%1#0", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "eq%1#0" - ] - }, - "1649": { - "error": "invalid number of bytes for arc4.dynamic_array", - "op": "assert // invalid number of bytes for arc4.dynamic_array", - "stack_out": [ - "holding_address#0", - "tmp%2#0" - ] - }, - "1650": { - "op": "extract 2 0", - "defined_out": [ - "holding_address#0", - "payment_info#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0" - ] - }, - "1653": { - "op": "swap", - "defined_out": [ - "holding_address#0", - "payment_info#0" - ], - "stack_out": [ - "payment_info#0", - "holding_address#0" - ] - }, - "1654": { - "op": "intc_0 // 0", - "stack_out": [ - "payment_info#0", - "holding_address#0", - "0" - ] - }, - "1655": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"", - "0", - "holding_address#0", - "payment_info#0" - ], - "stack_out": [ - "payment_info#0", - "holding_address#0", - "0", - "\"status\"" - ] - }, - "1656": { - "op": "app_global_get_ex", - "defined_out": [ - "holding_address#0", - "maybe_exists%0#0", - "maybe_value%0#0", - "payment_info#0" - ], - "stack_out": [ - "payment_info#0", - "holding_address#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1657": { - "error": "check self.status exists", - "op": "assert // check self.status exists", - "stack_out": [ - "payment_info#0", - "holding_address#0", - "maybe_value%0#0" - ] - }, - "1658": { - "op": "pushint 100", - "defined_out": [ - "100", - "holding_address#0", - "maybe_value%0#0", - "payment_info#0" - ], - "stack_out": [ - "payment_info#0", - "holding_address#0", - "maybe_value%0#0", - "100" - ] - }, - "1660": { - "op": "==", - "defined_out": [ - "holding_address#0", - "payment_info#0", - "tmp%0#5" - ], - "stack_out": [ - "payment_info#0", - "holding_address#0", - "tmp%0#5" - ] - }, - "1661": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "payment_info#0", - "holding_address#0" - ] - }, - "1662": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "op": "callsub assert_is_not_asset_defaulted" - }, - "1665": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_suspended", - "op": "callsub assert_is_not_asset_suspended" - }, - "1668": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023", - "holding_address#0", - "payment_info#0" - ], - "stack_out": [ - "payment_info#0", - "holding_address#0", - "0x52333023" - ] - }, - "1669": { - "op": "dig 1", - "stack_out": [ - "payment_info#0", - "holding_address#0", - "0x52333023", - "holding_address#0 (copy)" - ] - }, - "1671": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_info#0" - ], - "stack_out": [ - "payment_info#0", - "holding_address#0", - "box_prefixed_key%0#3" - ] - }, - "1672": { - "op": "dup", - "stack_out": [ - "payment_info#0", - "holding_address#0", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3" - ] - }, - "1673": { - "op": "cover 2", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_info#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "box_prefixed_key%0#3" - ] - }, - "1675": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)", - "holding_address#0", - "payment_info#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)" - ] - }, - "1676": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#3", - "holding_address#0", - "maybe_exists%0#0", - "payment_info#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "box_prefixed_key%0#3", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "1677": { - "op": "bury 1", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "box_prefixed_key%0#3", - "maybe_exists%0#0" - ] - }, - "1679": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "box_prefixed_key%0#3" - ] - }, - "1680": { - "op": "dup", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)" - ] - }, - "1681": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0", - "box_prefixed_key%0#3", - "holding_address#0", - "payment_info#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "box_prefixed_key%0#3", - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "1682": { - "op": "pop", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "box_prefixed_key%0#3", - "aggregate%box_get%0#0" - ] - }, - "1683": { - "op": "intc_2 // 32", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "box_prefixed_key%0#3", - "aggregate%box_get%0#0", - "32" - ] - }, - "1684": { - "op": "extract_uint64", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "box_prefixed_key%0#3", - "units#2" - ] - }, - "1685": { - "op": "dup", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "box_prefixed_key%0#3", - "units#2", - "units#2" - ] - }, - "1686": { - "op": "cover 3", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "holding_address#0", - "box_prefixed_key%0#3", - "units#2" - ] - }, - "1688": { - "error": "No D-ASA units", - "op": "assert // No D-ASA units", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "holding_address#0", - "box_prefixed_key%0#3" - ] - }, - "1689": { - "callsub": "modules.core_financial.coupon.FixedCouponCashflowMixin.count_due_coupons", - "op": "callsub count_due_coupons", - "defined_out": [ - "box_prefixed_key%0#3", - "due_coupons#0", - "holding_address#0", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "holding_address#0", - "box_prefixed_key%0#3", - "due_coupons#0" - ] - }, - "1692": { - "op": "swap", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "holding_address#0", - "due_coupons#0", - "box_prefixed_key%0#3" - ] - }, - "1693": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%2#0", - "aggregate%box_get%3#0", - "box_prefixed_key%0#3", - "due_coupons#0", - "holding_address#0", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "holding_address#0", - "due_coupons#0", - "aggregate%box_get%2#0", - "aggregate%box_get%3#0" - ] - }, - "1694": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "holding_address#0", - "due_coupons#0", - "aggregate%box_get%2#0" - ] - }, - "1695": { - "op": "pushint 48", - "defined_out": [ - "48", - "aggregate%box_get%2#0", - "box_prefixed_key%0#3", - "due_coupons#0", - "holding_address#0", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "holding_address#0", - "due_coupons#0", - "aggregate%box_get%2#0", - "48" - ] - }, - "1697": { - "op": "extract_uint64", - "defined_out": [ - "account_paid_coupons#0", - "box_prefixed_key%0#3", - "due_coupons#0", - "holding_address#0", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "holding_address#0", - "due_coupons#0", - "account_paid_coupons#0" - ] - }, - "1698": { - "op": "swap", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "holding_address#0", - "account_paid_coupons#0", - "due_coupons#0" - ] - }, - "1699": { - "op": "dig 1", - "defined_out": [ - "account_paid_coupons#0", - "account_paid_coupons#0 (copy)", - "box_prefixed_key%0#3", - "due_coupons#0", - "holding_address#0", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "holding_address#0", - "account_paid_coupons#0", - "due_coupons#0", - "account_paid_coupons#0 (copy)" - ] - }, - "1701": { - "op": ">", - "defined_out": [ - "account_paid_coupons#0", - "box_prefixed_key%0#3", - "holding_address#0", - "payment_info#0", - "tmp%3#3", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "holding_address#0", - "account_paid_coupons#0", - "tmp%3#3" - ] - }, - "1702": { - "error": "No due coupon to pay", - "op": "assert // No due coupon to pay", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "holding_address#0", - "account_paid_coupons#0" - ] - }, - "1703": { - "op": "dup", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "holding_address#0", - "account_paid_coupons#0", - "account_paid_coupons#0 (copy)" - ] - }, - "1704": { - "callsub": "modules.core_financial.coupon.CouponCashflowMixin.all_due_coupons_paid", - "op": "callsub all_due_coupons_paid", - "defined_out": [ - "account_paid_coupons#0", - "box_prefixed_key%0#3", - "holding_address#0", - "payment_info#0", - "tmp%4#2", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "holding_address#0", - "account_paid_coupons#0", - "tmp%4#2" - ] - }, - "1707": { - "error": "Pending due coupon payment", - "op": "assert // Pending due coupon payment", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "holding_address#0", - "account_paid_coupons#0" - ] - }, - "1708": { - "op": "dig 1", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "holding_address#0", - "account_paid_coupons#0", - "holding_address#0 (copy)" - ] - }, - "1710": { - "callsub": "modules.accounting.AccountingModule.account_total_units_value", - "op": "callsub account_total_units_value", - "defined_out": [ - "account_paid_coupons#0", - "box_prefixed_key%0#3", - "holding_address#0", - "payment_info#0", - "tmp%0#1", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "holding_address#0", - "account_paid_coupons#0", - "tmp%0#1" - ] - }, - "1713": { - "op": "swap", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "holding_address#0", - "tmp%0#1", - "account_paid_coupons#0" - ] - }, - "1714": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "account_paid_coupons#0", - "box_prefixed_key%0#3", - "holding_address#0", - "payment_info#0", - "tmp%0#1", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "holding_address#0", - "tmp%0#1", - "account_paid_coupons#0", - "1" - ] - }, - "1715": { - "op": "+", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_info#0", - "tmp%0#1", - "tmp%1#0", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "holding_address#0", - "tmp%0#1", - "tmp%1#0" - ] - }, - "1716": { - "callsub": "modules.core_financial.coupon.FixedCouponCashflowMixin.coupon_interest_amount", - "op": "callsub coupon_interest_amount", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_amount#1", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "holding_address#0", - "payment_amount#1" - ] - }, - "1719": { - "op": "swap", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "holding_address#0" - ] - }, - "1720": { - "op": "dup", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "holding_address#0", - "holding_address#0 (copy)" - ] - }, - "1721": { - "callsub": "modules.payment_agent.common.PaymentAgentCommonMixin.assert_payment_authorization", - "op": "callsub assert_payment_authorization", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "holding_address#0" - ] - }, - "1724": { - "callsub": "modules.payment_agent.common.PaymentAgentCommonMixin.is_payment_executable", - "op": "callsub is_payment_executable", - "defined_out": [ - "box_prefixed_key%0#3", - "payment_amount#1", - "payment_info#0", - "tmp%2#1", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%2#1" - ] - }, - "1727": { - "op": "bz pay_coupon_else_body@3", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1" - ] - }, - "1730": { - "op": "dupn 2", - "defined_out": [ - "box_prefixed_key%0#3", - "payment_amount#1", - "payment_amount#1 (copy)", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "payment_amount#1", - "payment_amount#1 (copy)" - ] - }, - "1732": { - "callsub": "modules.payment_agent.common.PaymentAgentCommonMixin.assert_enough_funds", - "op": "callsub assert_enough_funds", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "payment_amount#1" - ] - }, - "1735": { - "op": "dig 3", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "payment_amount#1", - "box_prefixed_key%0#3" - ] - }, - "1737": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%4#0", - "aggregate%box_get%5#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "payment_amount#1", - "aggregate%box_get%4#0", - "aggregate%box_get%5#0" - ] - }, - "1738": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "payment_amount#1", - "aggregate%box_get%4#0" - ] - }, - "1739": { - "op": "extract 0 32", - "defined_out": [ - "aggregate%extract%2#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "payment_amount#1", - "aggregate%extract%2#0" - ] - }, - "1742": { - "op": "swap", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%extract%2#0", - "payment_amount#1" - ] - }, - "1743": { - "callsub": "modules.payment_agent.common.PaymentAgentCommonMixin.pay", - "op": "callsub pay", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1" - ] - }, - "1746": { - "block": "pay_coupon_after_if_else@4", - "stack_in": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1" - ], - "op": "dig 2", - "defined_out": [ - "box_prefixed_key%0#3" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "box_prefixed_key%0#3" - ] - }, - "1748": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)" - ] - }, - "1749": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%6#0", - "aggregate%box_get%7#0", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "box_prefixed_key%0#3", - "aggregate%box_get%6#0", - "aggregate%box_get%7#0" - ] - }, - "1750": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "box_prefixed_key%0#3", - "aggregate%box_get%6#0" - ] - }, - "1751": { - "op": "pushint 48", - "defined_out": [ - "48", - "aggregate%box_get%6#0", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "box_prefixed_key%0#3", - "aggregate%box_get%6#0", - "48" - ] - }, - "1753": { - "op": "extract_uint64", - "defined_out": [ - "box_prefixed_key%0#3", - "values%0#1" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "box_prefixed_key%0#3", - "values%0#1" - ] - }, - "1754": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "box_prefixed_key%0#3", - "values%0#1" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "box_prefixed_key%0#3", - "values%0#1", - "1" - ] - }, - "1755": { - "op": "+", - "defined_out": [ - "box_prefixed_key%0#3", - "tmp%0#1" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "box_prefixed_key%0#3", - "tmp%0#1" - ] - }, - "1756": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "box_prefixed_key%0#3", - "aggregate%val_as_bytes%0#0" - ] - }, - "1757": { - "op": "pushint 48" - }, - "1759": { - "op": "swap", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "box_prefixed_key%0#3", - "48", - "aggregate%val_as_bytes%0#0" - ] - }, - "1760": { - "op": "box_replace", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1" - ] - }, - "1761": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "0" - ] - }, - "1762": { - "op": "bytec 28 // \"paid_coupon_units\"", - "defined_out": [ - "\"paid_coupon_units\"", - "0", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "0", - "\"paid_coupon_units\"" - ] - }, - "1764": { - "op": "app_global_get_ex", - "defined_out": [ - "box_prefixed_key%0#3", - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1765": { - "error": "check self.paid_coupon_units exists", - "op": "assert // check self.paid_coupon_units exists", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0" - ] - }, - "1766": { - "op": "dig 2", - "defined_out": [ - "box_prefixed_key%0#3", - "maybe_value%0#0", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "units#2" - ] - }, - "1768": { - "op": "+", - "defined_out": [ - "box_prefixed_key%0#3", - "tmp%1#0", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%1#0" - ] - }, - "1769": { - "op": "bytec 28 // \"paid_coupon_units\"", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%1#0", - "\"paid_coupon_units\"" - ] - }, - "1771": { - "op": "swap", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "\"paid_coupon_units\"", - "tmp%1#0" - ] - }, - "1772": { - "op": "app_global_put", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1" - ] - }, - "1773": { - "op": "global CurrentApplicationID", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#1" - ] - }, - "1775": { - "op": "global LatestTimestamp", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#1", - "tmp%1#0" - ] - }, - "1777": { - "op": "intc_0 // 0", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#1", - "tmp%1#0", - "0" - ] - }, - "1778": { - "op": "bytec 16 // \"denomination_asset_id\"", - "defined_out": [ - "\"denomination_asset_id\"", - "0", - "box_prefixed_key%0#3", - "tmp%0#1", - "tmp%1#0", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#1", - "tmp%1#0", - "0", - "\"denomination_asset_id\"" - ] - }, - "1780": { - "op": "app_global_get_ex", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#1", - "tmp%1#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1781": { - "error": "check self.denomination_asset_id exists", - "op": "assert // check self.denomination_asset_id exists", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#1", - "tmp%1#0", - "maybe_value%0#0" - ] - }, - "1782": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#3", - "maybe_value%0#0", - "maybe_value%0#0 (copy)", - "tmp%0#1", - "tmp%1#0", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#1", - "tmp%1#0", - "maybe_value%0#0", - "maybe_value%0#0 (copy)" - ] - }, - "1783": { - "op": "asset_params_get AssetUnitName", - "defined_out": [ - "box_prefixed_key%0#3", - "check%0#0", - "maybe_value%0#0", - "tmp%0#1", - "tmp%1#0", - "units#2", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#1", - "tmp%1#0", - "maybe_value%0#0", - "value%0#0", - "check%0#0" - ] - }, - "1785": { - "error": "asset exists", - "op": "assert // asset exists", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#1", - "tmp%1#0", - "maybe_value%0#0", - "value%0#0" - ] - }, - "1786": { - "op": "intc_0 // 0", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#1", - "tmp%1#0", - "maybe_value%0#0", - "value%0#0", - "0" - ] - }, - "1787": { - "op": "bytec_3 // \"circulating_units\"", - "defined_out": [ - "\"circulating_units\"", - "0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "tmp%0#1", - "tmp%1#0", - "units#2", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#1", - "tmp%1#0", - "maybe_value%0#0", - "value%0#0", - "0", - "\"circulating_units\"" - ] - }, - "1788": { - "op": "app_global_get_ex", - "defined_out": [ - "box_prefixed_key%0#3", - "maybe_exists%2#0", - "maybe_value%0#0", - "maybe_value%2#0", - "tmp%0#1", - "tmp%1#0", - "units#2", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#1", - "tmp%1#0", - "maybe_value%0#0", - "value%0#0", - "maybe_value%2#0", - "maybe_exists%2#0" - ] - }, - "1789": { - "error": "check self.circulating_units exists", - "op": "assert // check self.circulating_units exists", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#1", - "tmp%1#0", - "maybe_value%0#0", - "value%0#0", - "maybe_value%2#0" - ] - }, - "1790": { - "op": "intc_0 // 0", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#1", - "tmp%1#0", - "maybe_value%0#0", - "value%0#0", - "maybe_value%2#0", - "0" - ] - }, - "1791": { - "op": "bytec 6 // \"unit_value\"", - "defined_out": [ - "\"unit_value\"", - "0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "maybe_value%2#0", - "tmp%0#1", - "tmp%1#0", - "units#2", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#1", - "tmp%1#0", - "maybe_value%0#0", - "value%0#0", - "maybe_value%2#0", - "0", - "\"unit_value\"" - ] - }, - "1793": { - "op": "app_global_get_ex", - "defined_out": [ - "box_prefixed_key%0#3", - "maybe_exists%3#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1", - "tmp%1#0", - "units#2", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#1", - "tmp%1#0", - "maybe_value%0#0", - "value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_exists%3#0" - ] - }, - "1794": { - "error": "check self.unit_value exists", - "op": "assert // check self.unit_value exists", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#1", - "tmp%1#0", - "maybe_value%0#0", - "value%0#0", - "maybe_value%2#0", - "maybe_value%3#0" - ] - }, - "1795": { - "op": "*", - "defined_out": [ - "box_prefixed_key%0#3", - "maybe_value%0#0", - "tmp%0#1", - "tmp%1#0", - "tmp%2#2", - "units#2", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#1", - "tmp%1#0", - "maybe_value%0#0", - "value%0#0", - "tmp%2#2" - ] - }, - "1796": { - "op": "uncover 4", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%1#0", - "maybe_value%0#0", - "value%0#0", - "tmp%2#2", - "tmp%0#1" - ] - }, - "1798": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "tmp%1#0", - "tmp%2#2", - "units#2", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%1#0", - "maybe_value%0#0", - "value%0#0", - "tmp%2#2", - "aggregate%val_as_bytes%1#0" - ] - }, - "1799": { - "op": "pushbytes 0x080037", - "defined_out": [ - "0x080037", - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "tmp%1#0", - "tmp%2#2", - "units#2", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%1#0", - "maybe_value%0#0", - "value%0#0", - "tmp%2#2", - "aggregate%val_as_bytes%1#0", - "0x080037" - ] - }, - "1804": { - "op": "concat", - "defined_out": [ - "aggregate%head%2#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "tmp%1#0", - "tmp%2#2", - "units#2", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%1#0", - "maybe_value%0#0", - "value%0#0", - "tmp%2#2", - "aggregate%head%2#0" - ] - }, - "1805": { - "op": "uncover 4", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "value%0#0", - "tmp%2#2", - "aggregate%head%2#0", - "tmp%1#0" - ] - }, - "1807": { - "op": "itob", - "defined_out": [ - "aggregate%head%2#0", - "aggregate%val_as_bytes%2#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "tmp%2#2", - "units#2", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "value%0#0", - "tmp%2#2", - "aggregate%head%2#0", - "aggregate%val_as_bytes%2#0" - ] - }, - "1808": { - "op": "concat", - "defined_out": [ - "aggregate%head%3#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "tmp%2#2", - "units#2", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "value%0#0", - "tmp%2#2", - "aggregate%head%3#0" - ] - }, - "1809": { - "op": "dig 4", - "defined_out": [ - "aggregate%head%3#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "payment_amount#1", - "tmp%2#2", - "units#2", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "value%0#0", - "tmp%2#2", - "aggregate%head%3#0", - "payment_amount#1" - ] - }, - "1811": { - "op": "itob", - "defined_out": [ - "aggregate%head%3#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "payment_amount#1", - "tmp%2#2", - "units#2", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "value%0#0", - "tmp%2#2", - "aggregate%head%3#0", - "aggregate%val_as_bytes%3#0" - ] - }, - "1812": { - "op": "swap", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "value%0#0", - "tmp%2#2", - "aggregate%val_as_bytes%3#0", - "aggregate%head%3#0" - ] - }, - "1813": { - "op": "dig 1", - "defined_out": [ - "aggregate%head%3#0", - "aggregate%val_as_bytes%3#0", - "aggregate%val_as_bytes%3#0 (copy)", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "payment_amount#1", - "tmp%2#2", - "units#2", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "value%0#0", - "tmp%2#2", - "aggregate%val_as_bytes%3#0", - "aggregate%head%3#0", - "aggregate%val_as_bytes%3#0 (copy)" - ] - }, - "1815": { - "op": "concat", - "defined_out": [ - "aggregate%head%4#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "payment_amount#1", - "tmp%2#2", - "units#2", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "value%0#0", - "tmp%2#2", - "aggregate%val_as_bytes%3#0", - "aggregate%head%4#0" - ] - }, - "1816": { - "op": "uncover 4", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "value%0#0", - "tmp%2#2", - "aggregate%val_as_bytes%3#0", - "aggregate%head%4#0", - "maybe_value%0#0" - ] - }, - "1818": { - "op": "itob", - "defined_out": [ - "aggregate%head%4#0", - "aggregate%val_as_bytes%3#0", - "aggregate%val_as_bytes%4#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "tmp%2#2", - "units#2", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "value%0#0", - "tmp%2#2", - "aggregate%val_as_bytes%3#0", - "aggregate%head%4#0", - "aggregate%val_as_bytes%4#0" - ] - }, - "1819": { - "op": "concat", - "defined_out": [ - "aggregate%head%5#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "tmp%2#2", - "units#2", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "value%0#0", - "tmp%2#2", - "aggregate%val_as_bytes%3#0", - "aggregate%head%5#0" - ] - }, - "1820": { - "op": "dig 3", - "defined_out": [ - "aggregate%head%5#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "tmp%2#2", - "units#2", - "value%0#0", - "value%0#0 (copy)" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "value%0#0", - "tmp%2#2", - "aggregate%val_as_bytes%3#0", - "aggregate%head%5#0", - "value%0#0 (copy)" - ] - }, - "1822": { - "op": "len", - "defined_out": [ - "aggregate%head%5#0", - "aggregate%length%1#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "tmp%2#2", - "units#2", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "value%0#0", - "tmp%2#2", - "aggregate%val_as_bytes%3#0", - "aggregate%head%5#0", - "aggregate%length%1#0" - ] - }, - "1823": { - "op": "itob", - "defined_out": [ - "aggregate%as_bytes%2#0", - "aggregate%head%5#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "tmp%2#2", - "units#2", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "value%0#0", - "tmp%2#2", - "aggregate%val_as_bytes%3#0", - "aggregate%head%5#0", - "aggregate%as_bytes%2#0" - ] - }, - "1824": { - "op": "extract 6 2", - "defined_out": [ - "aggregate%head%5#0", - "aggregate%length_uint16%1#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "tmp%2#2", - "units#2", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "value%0#0", - "tmp%2#2", - "aggregate%val_as_bytes%3#0", - "aggregate%head%5#0", - "aggregate%length_uint16%1#0" - ] - }, - "1827": { - "op": "uncover 4", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%2#2", - "aggregate%val_as_bytes%3#0", - "aggregate%head%5#0", - "aggregate%length_uint16%1#0", - "value%0#0" - ] - }, - "1829": { - "op": "concat", - "defined_out": [ - "aggregate%encoded_value%1#0", - "aggregate%head%5#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "tmp%2#2", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%2#2", - "aggregate%val_as_bytes%3#0", - "aggregate%head%5#0", - "aggregate%encoded_value%1#0" - ] - }, - "1830": { - "op": "swap", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%2#2", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%5#0" - ] - }, - "1831": { - "op": "bytec 35 // 0x003b", - "defined_out": [ - "0x003b", - "aggregate%encoded_value%1#0", - "aggregate%head%5#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "tmp%2#2", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%2#2", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%5#0", - "0x003b" - ] - }, - "1833": { - "op": "concat", - "defined_out": [ - "aggregate%encoded_value%1#0", - "aggregate%head%6#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "tmp%2#2", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%2#2", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%6#0" - ] - }, - "1834": { - "op": "uncover 3", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%6#0", - "tmp%2#2" - ] - }, - "1836": { - "op": "itob", - "defined_out": [ - "aggregate%encoded_value%1#0", - "aggregate%head%6#0", - "aggregate%val_as_bytes%3#0", - "aggregate%val_as_bytes%5#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%6#0", - "aggregate%val_as_bytes%5#0" - ] - }, - "1837": { - "op": "concat", - "defined_out": [ - "aggregate%encoded_value%1#0", - "aggregate%head%7#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%7#0" - ] - }, - "1838": { - "op": "bytec 30 // 0x0000", - "defined_out": [ - "0x0000", - "aggregate%encoded_value%1#0", - "aggregate%head%7#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%7#0", - "0x0000" - ] - }, - "1840": { - "op": "concat", - "defined_out": [ - "aggregate%encoded_value%1#0", - "aggregate%head%8#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%8#0" - ] - }, - "1841": { - "op": "intc_0 // 0", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%8#0", - "0" - ] - }, - "1842": { - "op": "itob", - "defined_out": [ - "aggregate%encoded_value%1#0", - "aggregate%head%8#0", - "aggregate%val_as_bytes%3#0", - "aggregate%val_as_bytes%6#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%8#0", - "aggregate%val_as_bytes%6#0" - ] - }, - "1843": { - "op": "concat", - "defined_out": [ - "aggregate%encoded_value%1#0", - "aggregate%head%9#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%9#0" - ] - }, - "1844": { - "op": "pushbytes 0x00024950", - "defined_out": [ - "0x00024950", - "aggregate%encoded_value%1#0", - "aggregate%head%9#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%9#0", - "0x00024950" - ] - }, - "1850": { - "op": "concat", - "defined_out": [ - "aggregate%concat%0#0", - "aggregate%encoded_value%1#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%concat%0#0" - ] - }, - "1851": { - "op": "swap", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%val_as_bytes%3#0", - "aggregate%concat%0#0", - "aggregate%encoded_value%1#0" - ] - }, - "1852": { - "op": "concat", - "defined_out": [ - "aggregate%concat%1#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%val_as_bytes%3#0", - "aggregate%concat%1#0" - ] - }, - "1853": { - "op": "bytec 36 // method \"Event(uint64,uint8,string,uint64,uint64,uint64,byte[],uint64,uint16,uint64)\"", - "defined_out": [ - "Method(Event(uint64,uint8,string,uint64,uint64,uint64,byte[],uint64,uint16,uint64))", - "aggregate%concat%1#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%val_as_bytes%3#0", - "aggregate%concat%1#0", - "Method(Event(uint64,uint8,string,uint64,uint64,uint64,byte[],uint64,uint16,uint64))" - ] - }, - "1855": { - "op": "swap", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%val_as_bytes%3#0", - "Method(Event(uint64,uint8,string,uint64,uint64,uint64,byte[],uint64,uint16,uint64))", - "aggregate%concat%1#0" - ] - }, - "1856": { - "op": "concat", - "defined_out": [ - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "event%0#0", - "payment_amount#1", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%val_as_bytes%3#0", - "event%0#0" - ] - }, - "1857": { - "op": "log", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%val_as_bytes%3#0" - ] - }, - "1858": { - "op": "global LatestTimestamp", - "defined_out": [ - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "tmp%3#1", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%val_as_bytes%3#0", - "tmp%3#1" - ] - }, - "1860": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%3#0", - "aggregate%val_as_bytes%8#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%val_as_bytes%3#0", - "aggregate%val_as_bytes%8#0" - ] - }, - "1861": { - "op": "concat", - "defined_out": [ - "aggregate%head%11#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%head%11#0" - ] - }, - "1862": { - "op": "dig 4", - "defined_out": [ - "aggregate%head%11#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%head%11#0", - "payment_info#0" - ] - }, - "1864": { - "op": "dup", - "defined_out": [ - "aggregate%head%11#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "payment_info#0", - "payment_info#0 (copy)", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%head%11#0", - "payment_info#0", - "payment_info#0 (copy)" - ] - }, - "1865": { - "op": "len", - "defined_out": [ - "aggregate%head%11#0", - "aggregate%length%2#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%head%11#0", - "payment_info#0", - "aggregate%length%2#0" - ] - }, - "1866": { - "op": "itob", - "defined_out": [ - "aggregate%as_bytes%4#0", - "aggregate%head%11#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%head%11#0", - "payment_info#0", - "aggregate%as_bytes%4#0" - ] - }, - "1867": { - "op": "extract 6 2", - "defined_out": [ - "aggregate%head%11#0", - "aggregate%length_uint16%2#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%head%11#0", - "payment_info#0", - "aggregate%length_uint16%2#0" - ] - }, - "1870": { - "op": "swap", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%head%11#0", - "aggregate%length_uint16%2#0", - "payment_info#0" - ] - }, - "1871": { - "op": "concat", - "defined_out": [ - "aggregate%encoded_value%2#0", - "aggregate%head%11#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%head%11#0", - "aggregate%encoded_value%2#0" - ] - }, - "1872": { - "op": "swap", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%encoded_value%2#0", - "aggregate%head%11#0" - ] - }, - "1873": { - "op": "bytec 37 // 0x0012", - "defined_out": [ - "0x0012", - "aggregate%encoded_value%2#0", - "aggregate%head%11#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%encoded_value%2#0", - "aggregate%head%11#0", - "0x0012" - ] - }, - "1875": { - "op": "concat", - "defined_out": [ - "aggregate%encoded_value%2#0", - "aggregate%head%12#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%encoded_value%2#0", - "aggregate%head%12#0" - ] - }, - "1876": { - "op": "swap", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%head%12#0", - "aggregate%encoded_value%2#0" - ] - }, - "1877": { - "op": "concat", - "defined_out": [ - "aggregate%concat%2#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%concat%2#0" - ] - }, - "1878": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%concat%2#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%concat%2#0", - "0x151f7c75" - ] - }, - "1879": { - "op": "swap", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "0x151f7c75", - "aggregate%concat%2#0" - ] - }, - "1880": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#3", - "payment_amount#1", - "payment_info#0", - "tmp%5#0", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%5#0" - ] - }, - "1881": { - "op": "log", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1" - ] - }, - "1882": { - "op": "intc_1 // 1", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "1" - ] - }, - "1883": { - "op": "return", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1" - ] - }, - "1884": { - "block": "pay_coupon_else_body@3", - "stack_in": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1" - ], - "op": "intc_0 // 0", - "defined_out": [ - "payment_amount#1" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "payment_amount#1" - ] - }, - "1885": { - "op": "bury 1", - "defined_out": [ - "payment_amount#1" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1" - ] - }, - "1887": { - "op": "b pay_coupon_after_if_else@4" - }, - "1890": { - "subroutine": "modules.payment_agent.principal.PrincipalPaymentAgentMixin.pay_principal[routing]", - "params": {}, - "block": "pay_principal", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "holding_address#0" - ], - "stack_out": [ - "holding_address#0" - ] - }, - "1893": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ] - }, - "1894": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0" - ] - }, - "1895": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0", - "32" - ] - }, - "1896": { - "op": "==", - "defined_out": [ - "eq%0#0", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "eq%0#0" - ] - }, - "1897": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "holding_address#0" - ] - }, - "1898": { - "op": "txna ApplicationArgs 2", - "defined_out": [ - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0" - ] - }, - "1901": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ] - }, - "1902": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)", - "0" - ] - }, - "1903": { - "error": "invalid array length header", - "op": "extract_uint16 // on error: invalid array length header", - "defined_out": [ - "aggregate%array_length%0#0", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "aggregate%array_length%0#0" - ] - }, - "1904": { - "op": "pushint 2", - "defined_out": [ - "2", - "aggregate%array_length%0#0", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "aggregate%array_length%0#0", - "2" - ] - }, - "1906": { - "op": "+", - "defined_out": [ - "add%0#0", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "add%0#0" - ] - }, - "1907": { - "op": "dig 1", - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "add%0#0", - "tmp%2#0 (copy)" - ] - }, - "1909": { - "op": "len", - "defined_out": [ - "add%0#0", - "holding_address#0", - "len%1#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "add%0#0", - "len%1#0" - ] - }, - "1910": { - "op": "==", - "defined_out": [ - "eq%1#0", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "eq%1#0" - ] - }, - "1911": { - "error": "invalid number of bytes for arc4.dynamic_array", - "op": "assert // invalid number of bytes for arc4.dynamic_array", - "stack_out": [ - "holding_address#0", - "tmp%2#0" - ] - }, - "1912": { - "op": "extract 2 0", - "defined_out": [ - "holding_address#0", - "payment_info#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0" - ] - }, - "1915": { - "op": "swap", - "defined_out": [ - "holding_address#0", - "payment_info#0" - ], - "stack_out": [ - "payment_info#0", - "holding_address#0" - ] - }, - "1916": { - "op": "intc_0 // 0", - "stack_out": [ - "payment_info#0", - "holding_address#0", - "0" - ] - }, - "1917": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"", - "0", - "holding_address#0", - "payment_info#0" - ], - "stack_out": [ - "payment_info#0", - "holding_address#0", - "0", - "\"status\"" - ] - }, - "1918": { - "op": "app_global_get_ex", - "defined_out": [ - "holding_address#0", - "maybe_exists%0#0", - "maybe_value%0#0", - "payment_info#0" - ], - "stack_out": [ - "payment_info#0", - "holding_address#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1919": { - "error": "check self.status exists", - "op": "assert // check self.status exists", - "stack_out": [ - "payment_info#0", - "holding_address#0", - "maybe_value%0#0" - ] - }, - "1920": { - "op": "pushint 100", - "defined_out": [ - "100", - "holding_address#0", - "maybe_value%0#0", - "payment_info#0" - ], - "stack_out": [ - "payment_info#0", - "holding_address#0", - "maybe_value%0#0", - "100" - ] - }, - "1922": { - "op": "==", - "defined_out": [ - "holding_address#0", - "payment_info#0", - "tmp%0#5" - ], - "stack_out": [ - "payment_info#0", - "holding_address#0", - "tmp%0#5" - ] - }, - "1923": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "payment_info#0", - "holding_address#0" - ] - }, - "1924": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "op": "callsub assert_is_not_asset_defaulted" - }, - "1927": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_suspended", - "op": "callsub assert_is_not_asset_suspended" - }, - "1930": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023", - "holding_address#0", - "payment_info#0" - ], - "stack_out": [ - "payment_info#0", - "holding_address#0", - "0x52333023" - ] - }, - "1931": { - "op": "dig 1", - "stack_out": [ - "payment_info#0", - "holding_address#0", - "0x52333023", - "holding_address#0 (copy)" - ] - }, - "1933": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_info#0" - ], - "stack_out": [ - "payment_info#0", - "holding_address#0", - "box_prefixed_key%0#3" - ] - }, - "1934": { - "op": "dup", - "stack_out": [ - "payment_info#0", - "holding_address#0", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3" - ] - }, - "1935": { - "op": "cover 2", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_info#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "box_prefixed_key%0#3" - ] - }, - "1937": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)", - "holding_address#0", - "payment_info#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)" - ] - }, - "1938": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#3", - "holding_address#0", - "maybe_exists%0#0", - "payment_info#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "box_prefixed_key%0#3", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "1939": { - "op": "bury 1", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "box_prefixed_key%0#3", - "maybe_exists%0#0" - ] - }, - "1941": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "box_prefixed_key%0#3" - ] - }, - "1942": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0", - "box_prefixed_key%0#3", - "holding_address#0", - "payment_info#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "1943": { - "op": "pop", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "aggregate%box_get%0#0" - ] - }, - "1944": { - "op": "intc_2 // 32", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "aggregate%box_get%0#0", - "32" - ] - }, - "1945": { - "op": "extract_uint64", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_info#0", - "units#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "units#0" - ] - }, - "1946": { - "error": "No D-ASA units", - "op": "assert // No D-ASA units", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0" - ] - }, - "1947": { - "op": "global LatestTimestamp", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_info#0", - "tmp%2#1" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "tmp%2#1" - ] - }, - "1949": { - "op": "intc_0 // 0", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "tmp%2#1", - "0" - ] - }, - "1950": { - "op": "bytec 5 // \"maturity_date\"", - "defined_out": [ - "\"maturity_date\"", - "0", - "box_prefixed_key%0#3", - "holding_address#0", - "payment_info#0", - "tmp%2#1" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "tmp%2#1", - "0", - "\"maturity_date\"" - ] - }, - "1952": { - "op": "app_global_get_ex", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "tmp%2#1", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1953": { - "error": "check self.maturity_date exists", - "op": "assert // check self.maturity_date exists", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "tmp%2#1", - "maybe_value%0#0" - ] - }, - "1954": { - "op": ">=", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_info#0", - "tmp%3#3" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "tmp%3#3" - ] - }, - "1955": { - "error": "Not mature", - "op": "assert // Not mature", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0" - ] - }, - "1956": { - "callsub": "modules.core_financial.coupon.FixedCouponCashflowMixin.count_due_coupons", - "op": "callsub count_due_coupons", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_info#0", - "tmp%0#1" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "tmp%0#1" - ] - }, - "1959": { - "callsub": "modules.core_financial.coupon.CouponCashflowMixin.all_due_coupons_paid", - "op": "callsub all_due_coupons_paid", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_info#0", - "tmp%1#1" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "tmp%1#1" - ] - }, - "1962": { - "error": "Pending due coupon payment", - "op": "assert // Pending due coupon payment", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0" - ] - }, - "1963": { - "op": "dup", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "holding_address#0 (copy)" - ] - }, - "1964": { - "callsub": "modules.accounting.AccountingModule.account_total_units_value", - "op": "callsub account_total_units_value", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_amount#0", - "payment_info#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "payment_amount#0" - ] - }, - "1967": { - "op": "swap", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_amount#0", - "payment_info#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "holding_address#0" - ] - }, - "1968": { - "op": "dup", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "holding_address#0", - "holding_address#0 (copy)" - ] - }, - "1969": { - "callsub": "modules.payment_agent.common.PaymentAgentCommonMixin.assert_payment_authorization", - "op": "callsub assert_payment_authorization", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "holding_address#0" - ] - }, - "1972": { - "callsub": "modules.payment_agent.common.PaymentAgentCommonMixin.is_payment_executable", - "op": "callsub is_payment_executable", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%1#1" - ] - }, - "1975": { - "op": "bz pay_principal_else_body@3", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ] - }, - "1978": { - "op": "dupn 2", - "defined_out": [ - "box_prefixed_key%0#3", - "payment_amount#0", - "payment_amount#0 (copy)", - "payment_info#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "payment_amount#0", - "payment_amount#0 (copy)" - ] - }, - "1980": { - "callsub": "modules.payment_agent.common.PaymentAgentCommonMixin.assert_enough_funds", - "op": "callsub assert_enough_funds", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "payment_amount#0" - ] - }, - "1983": { - "op": "dig 2", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "payment_amount#0", - "box_prefixed_key%0#3" - ] - }, - "1985": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%2#0", - "aggregate%box_get%3#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "payment_info#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "payment_amount#0", - "aggregate%box_get%2#0", - "aggregate%box_get%3#0" - ] - }, - "1986": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "payment_amount#0", - "aggregate%box_get%2#0" - ] - }, - "1987": { - "op": "extract 0 32", - "defined_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "payment_info#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "payment_amount#0", - "aggregate%extract%1#0" - ] - }, - "1990": { - "op": "swap", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%extract%1#0", - "payment_amount#0" - ] - }, - "1991": { - "callsub": "modules.payment_agent.common.PaymentAgentCommonMixin.pay", - "op": "callsub pay", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ] - }, - "1994": { - "block": "pay_principal_after_if_else@4", - "stack_in": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "0" - ] - }, - "1995": { - "op": "bytec_3 // \"circulating_units\"", - "defined_out": [ - "\"circulating_units\"", - "0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "0", - "\"circulating_units\"" - ] - }, - "1996": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1997": { - "error": "check self.circulating_units exists", - "op": "assert // check self.circulating_units exists", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "maybe_value%0#0" - ] - }, - "1998": { - "op": "dig 2", - "defined_out": [ - "box_prefixed_key%0#3", - "maybe_value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "maybe_value%0#0", - "box_prefixed_key%0#3" - ] - }, - "2000": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)", - "maybe_value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "maybe_value%0#0", - "box_prefixed_key%0#3 (copy)", - "box_prefixed_key%0#3 (copy)" - ] - }, - "2001": { - "op": "cover 2", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "box_prefixed_key%0#3 (copy)" - ] - }, - "2003": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%4#0", - "aggregate%box_get%5#0", - "box_prefixed_key%0#3", - "maybe_value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "aggregate%box_get%4#0", - "aggregate%box_get%5#0" - ] - }, - "2004": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "aggregate%box_get%4#0" - ] - }, - "2005": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "aggregate%box_get%4#0", - "box_prefixed_key%0#3", - "maybe_value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "aggregate%box_get%4#0", - "32" - ] - }, - "2006": { - "op": "extract_uint64", - "defined_out": [ - "box_prefixed_key%0#3", - "maybe_value%0#0", - "values%0#1" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "values%0#1" - ] - }, - "2007": { - "op": "-", - "defined_out": [ - "box_prefixed_key%0#3", - "tmp%0#1" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "box_prefixed_key%0#3", - "tmp%0#1" - ] - }, - "2008": { - "op": "bytec_3 // \"circulating_units\"", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "box_prefixed_key%0#3", - "tmp%0#1", - "\"circulating_units\"" - ] - }, - "2009": { - "op": "swap", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "box_prefixed_key%0#3", - "\"circulating_units\"", - "tmp%0#1" - ] - }, - "2010": { - "op": "app_global_put", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "box_prefixed_key%0#3" - ] - }, - "2011": { - "op": "intc_0 // 0", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "box_prefixed_key%0#3", - "0" - ] - }, - "2012": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "box_prefixed_key%0#3", - "aggregate%val_as_bytes%0#0" - ] - }, - "2013": { - "op": "swap", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#3" - ] - }, - "2014": { - "op": "intc_2 // 32", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#3", - "32" - ] - }, - "2015": { - "op": "dig 2", - "defined_out": [ - "32", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%0#0 (copy)", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#3", - "32", - "aggregate%val_as_bytes%0#0 (copy)" - ] - }, - "2017": { - "op": "box_replace", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0" - ] - }, - "2018": { - "callsub": "modules.accounting.AccountingModule.end_if_no_circulating_units", - "op": "callsub end_if_no_circulating_units" - }, - "2021": { - "op": "global CurrentApplicationID", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%0#1" - ] - }, - "2023": { - "op": "global LatestTimestamp", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#3", - "tmp%0#1", - "tmp%1#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%0#1", - "tmp%1#2" - ] - }, - "2025": { - "op": "intc_0 // 0", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%0#1", - "tmp%1#2", - "0" - ] - }, - "2026": { - "op": "bytec 16 // \"denomination_asset_id\"", - "defined_out": [ - "\"denomination_asset_id\"", - "0", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#3", - "tmp%0#1", - "tmp%1#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%0#1", - "tmp%1#2", - "0", - "\"denomination_asset_id\"" - ] - }, - "2028": { - "op": "app_global_get_ex", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%0#1", - "tmp%1#2", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2029": { - "error": "check self.denomination_asset_id exists", - "op": "assert // check self.denomination_asset_id exists", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%0#1", - "tmp%1#2", - "maybe_value%0#0" - ] - }, - "2030": { - "op": "dup", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "maybe_value%0#0 (copy)", - "tmp%0#1", - "tmp%1#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%0#1", - "tmp%1#2", - "maybe_value%0#0", - "maybe_value%0#0 (copy)" - ] - }, - "2031": { - "op": "asset_params_get AssetUnitName", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#3", - "check%0#0", - "maybe_value%0#0", - "tmp%0#1", - "tmp%1#2", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%0#1", - "tmp%1#2", - "maybe_value%0#0", - "value%0#0", - "check%0#0" - ] - }, - "2033": { - "error": "asset exists", - "op": "assert // asset exists", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%0#1", - "tmp%1#2", - "maybe_value%0#0", - "value%0#0" - ] - }, - "2034": { - "op": "intc_0 // 0", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%0#1", - "tmp%1#2", - "maybe_value%0#0", - "value%0#0", - "0" - ] - }, - "2035": { - "op": "bytec_3 // \"circulating_units\"", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%0#1", - "tmp%1#2", - "maybe_value%0#0", - "value%0#0", - "0", - "\"circulating_units\"" - ] - }, - "2036": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#3", - "maybe_exists%2#0", - "maybe_value%0#0", - "maybe_value%2#0", - "tmp%0#1", - "tmp%1#2", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%0#1", - "tmp%1#2", - "maybe_value%0#0", - "value%0#0", - "maybe_value%2#0", - "maybe_exists%2#0" - ] - }, - "2037": { - "error": "check self.circulating_units exists", - "op": "assert // check self.circulating_units exists", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%0#1", - "tmp%1#2", - "maybe_value%0#0", - "value%0#0", - "maybe_value%2#0" - ] - }, - "2038": { - "op": "intc_0 // 0", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%0#1", - "tmp%1#2", - "maybe_value%0#0", - "value%0#0", - "maybe_value%2#0", - "0" - ] - }, - "2039": { - "op": "bytec 6 // \"unit_value\"", - "defined_out": [ - "\"unit_value\"", - "0", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "maybe_value%2#0", - "tmp%0#1", - "tmp%1#2", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%0#1", - "tmp%1#2", - "maybe_value%0#0", - "value%0#0", - "maybe_value%2#0", - "0", - "\"unit_value\"" - ] - }, - "2041": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#3", - "maybe_exists%3#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1", - "tmp%1#2", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%0#1", - "tmp%1#2", - "maybe_value%0#0", - "value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_exists%3#0" - ] - }, - "2042": { - "error": "check self.unit_value exists", - "op": "assert // check self.unit_value exists", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%0#1", - "tmp%1#2", - "maybe_value%0#0", - "value%0#0", - "maybe_value%2#0", - "maybe_value%3#0" - ] - }, - "2043": { - "op": "*", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "tmp%0#1", - "tmp%1#2", - "tmp%2#1", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%0#1", - "tmp%1#2", - "maybe_value%0#0", - "value%0#0", - "tmp%2#1" - ] - }, - "2044": { - "op": "uncover 4", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%1#2", - "maybe_value%0#0", - "value%0#0", - "tmp%2#1", - "tmp%0#1" - ] - }, - "2046": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "tmp%1#2", - "tmp%2#1", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%1#2", - "maybe_value%0#0", - "value%0#0", - "tmp%2#1", - "aggregate%val_as_bytes%1#0" - ] - }, - "2047": { - "op": "pushbytes 0x030037", - "defined_out": [ - "0x030037", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "tmp%1#2", - "tmp%2#1", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%1#2", - "maybe_value%0#0", - "value%0#0", - "tmp%2#1", - "aggregate%val_as_bytes%1#0", - "0x030037" - ] - }, - "2052": { - "op": "concat", - "defined_out": [ - "aggregate%head%2#0", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "tmp%1#2", - "tmp%2#1", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%1#2", - "maybe_value%0#0", - "value%0#0", - "tmp%2#1", - "aggregate%head%2#0" - ] - }, - "2053": { - "op": "uncover 4", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "maybe_value%0#0", - "value%0#0", - "tmp%2#1", - "aggregate%head%2#0", - "tmp%1#2" - ] - }, - "2055": { - "op": "itob", - "defined_out": [ - "aggregate%head%2#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%2#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "tmp%2#1", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "maybe_value%0#0", - "value%0#0", - "tmp%2#1", - "aggregate%head%2#0", - "aggregate%val_as_bytes%2#0" - ] - }, - "2056": { - "op": "concat", - "defined_out": [ - "aggregate%head%3#0", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "tmp%2#1", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "maybe_value%0#0", - "value%0#0", - "tmp%2#1", - "aggregate%head%3#0" - ] - }, - "2057": { - "op": "dig 5", - "defined_out": [ - "aggregate%head%3#0", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "payment_amount#0", - "tmp%2#1", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "maybe_value%0#0", - "value%0#0", - "tmp%2#1", - "aggregate%head%3#0", - "payment_amount#0" - ] - }, - "2059": { - "op": "itob", - "defined_out": [ - "aggregate%head%3#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "payment_amount#0", - "tmp%2#1", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "maybe_value%0#0", - "value%0#0", - "tmp%2#1", - "aggregate%head%3#0", - "aggregate%val_as_bytes%3#0" - ] - }, - "2060": { - "op": "swap", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "maybe_value%0#0", - "value%0#0", - "tmp%2#1", - "aggregate%val_as_bytes%3#0", - "aggregate%head%3#0" - ] - }, - "2061": { - "op": "dig 1", - "defined_out": [ - "aggregate%head%3#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "aggregate%val_as_bytes%3#0 (copy)", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "payment_amount#0", - "tmp%2#1", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "maybe_value%0#0", - "value%0#0", - "tmp%2#1", - "aggregate%val_as_bytes%3#0", - "aggregate%head%3#0", - "aggregate%val_as_bytes%3#0 (copy)" - ] - }, - "2063": { - "op": "concat", - "defined_out": [ - "aggregate%head%4#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "payment_amount#0", - "tmp%2#1", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "maybe_value%0#0", - "value%0#0", - "tmp%2#1", - "aggregate%val_as_bytes%3#0", - "aggregate%head%4#0" - ] - }, - "2064": { - "op": "uncover 4", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "value%0#0", - "tmp%2#1", - "aggregate%val_as_bytes%3#0", - "aggregate%head%4#0", - "maybe_value%0#0" - ] - }, - "2066": { - "op": "itob", - "defined_out": [ - "aggregate%head%4#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "aggregate%val_as_bytes%4#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%2#1", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "value%0#0", - "tmp%2#1", - "aggregate%val_as_bytes%3#0", - "aggregate%head%4#0", - "aggregate%val_as_bytes%4#0" - ] - }, - "2067": { - "op": "concat", - "defined_out": [ - "aggregate%head%5#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%2#1", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "value%0#0", - "tmp%2#1", - "aggregate%val_as_bytes%3#0", - "aggregate%head%5#0" - ] - }, - "2068": { - "op": "dig 3", - "defined_out": [ - "aggregate%head%5#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%2#1", - "value%0#0", - "value%0#0 (copy)" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "value%0#0", - "tmp%2#1", - "aggregate%val_as_bytes%3#0", - "aggregate%head%5#0", - "value%0#0 (copy)" - ] - }, - "2070": { - "op": "len", - "defined_out": [ - "aggregate%head%5#0", - "aggregate%length%1#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%2#1", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "value%0#0", - "tmp%2#1", - "aggregate%val_as_bytes%3#0", - "aggregate%head%5#0", - "aggregate%length%1#0" - ] - }, - "2071": { - "op": "itob", - "defined_out": [ - "aggregate%as_bytes%2#0", - "aggregate%head%5#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%2#1", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "value%0#0", - "tmp%2#1", - "aggregate%val_as_bytes%3#0", - "aggregate%head%5#0", - "aggregate%as_bytes%2#0" - ] - }, - "2072": { - "op": "extract 6 2", - "defined_out": [ - "aggregate%head%5#0", - "aggregate%length_uint16%1#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%2#1", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "value%0#0", - "tmp%2#1", - "aggregate%val_as_bytes%3#0", - "aggregate%head%5#0", - "aggregate%length_uint16%1#0" - ] - }, - "2075": { - "op": "uncover 4", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%2#1", - "aggregate%val_as_bytes%3#0", - "aggregate%head%5#0", - "aggregate%length_uint16%1#0", - "value%0#0" - ] - }, - "2077": { - "op": "concat", - "defined_out": [ - "aggregate%encoded_value%1#0", - "aggregate%head%5#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%2#1" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%2#1", - "aggregate%val_as_bytes%3#0", - "aggregate%head%5#0", - "aggregate%encoded_value%1#0" - ] - }, - "2078": { - "op": "swap", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%2#1", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%5#0" - ] - }, - "2079": { - "op": "bytec 35 // 0x003b", - "defined_out": [ - "0x003b", - "aggregate%encoded_value%1#0", - "aggregate%head%5#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%2#1" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%2#1", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%5#0", - "0x003b" - ] - }, - "2081": { - "op": "concat", - "defined_out": [ - "aggregate%encoded_value%1#0", - "aggregate%head%6#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%2#1" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%2#1", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%6#0" - ] - }, - "2082": { - "op": "uncover 3", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%6#0", - "tmp%2#1" - ] - }, - "2084": { - "op": "itob", - "defined_out": [ - "aggregate%encoded_value%1#0", - "aggregate%head%6#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "aggregate%val_as_bytes%5#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%6#0", - "aggregate%val_as_bytes%5#0" - ] - }, - "2085": { - "op": "concat", - "defined_out": [ - "aggregate%encoded_value%1#0", - "aggregate%head%7#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%7#0" - ] - }, - "2086": { - "op": "bytec 30 // 0x0000", - "defined_out": [ - "0x0000", - "aggregate%encoded_value%1#0", - "aggregate%head%7#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%7#0", - "0x0000" - ] - }, - "2088": { - "op": "concat", - "defined_out": [ - "aggregate%encoded_value%1#0", - "aggregate%head%8#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%8#0" - ] - }, - "2089": { - "op": "uncover 3", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%8#0", - "aggregate%val_as_bytes%0#0" - ] - }, - "2091": { - "op": "concat", - "defined_out": [ - "aggregate%encoded_value%1#0", - "aggregate%head%9#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%9#0" - ] - }, - "2092": { - "op": "pushbytes 0x00025052", - "defined_out": [ - "0x00025052", - "aggregate%encoded_value%1#0", - "aggregate%head%9#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%9#0", - "0x00025052" - ] - }, - "2098": { - "op": "concat", - "defined_out": [ - "aggregate%concat%0#0", - "aggregate%encoded_value%1#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%concat%0#0" - ] - }, - "2099": { - "op": "swap", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%3#0", - "aggregate%concat%0#0", - "aggregate%encoded_value%1#0" - ] - }, - "2100": { - "op": "concat", - "defined_out": [ - "aggregate%concat%1#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%3#0", - "aggregate%concat%1#0" - ] - }, - "2101": { - "op": "bytec 36 // method \"Event(uint64,uint8,string,uint64,uint64,uint64,byte[],uint64,uint16,uint64)\"", - "defined_out": [ - "Method(Event(uint64,uint8,string,uint64,uint64,uint64,byte[],uint64,uint16,uint64))", - "aggregate%concat%1#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%3#0", - "aggregate%concat%1#0", - "Method(Event(uint64,uint8,string,uint64,uint64,uint64,byte[],uint64,uint16,uint64))" - ] - }, - "2103": { - "op": "swap", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%3#0", - "Method(Event(uint64,uint8,string,uint64,uint64,uint64,byte[],uint64,uint16,uint64))", - "aggregate%concat%1#0" - ] - }, - "2104": { - "op": "concat", - "defined_out": [ - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "event%0#0", - "payment_amount#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%3#0", - "event%0#0" - ] - }, - "2105": { - "op": "log", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%3#0" - ] - }, - "2106": { - "op": "global LatestTimestamp", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%3#0", - "tmp%2#1" - ] - }, - "2108": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%3#0", - "aggregate%val_as_bytes%8#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%3#0", - "aggregate%val_as_bytes%8#0" - ] - }, - "2109": { - "op": "concat", - "defined_out": [ - "aggregate%head%11#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%head%11#0" - ] - }, - "2110": { - "op": "dig 3", - "defined_out": [ - "aggregate%head%11#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "payment_info#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%head%11#0", - "payment_info#0" - ] - }, - "2112": { - "op": "dup", - "defined_out": [ - "aggregate%head%11#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "payment_info#0", - "payment_info#0 (copy)" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%head%11#0", - "payment_info#0", - "payment_info#0 (copy)" - ] - }, - "2113": { - "op": "len", - "defined_out": [ - "aggregate%head%11#0", - "aggregate%length%2#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "payment_info#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%head%11#0", - "payment_info#0", - "aggregate%length%2#0" - ] - }, - "2114": { - "op": "itob", - "defined_out": [ - "aggregate%as_bytes%4#0", - "aggregate%head%11#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "payment_info#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%head%11#0", - "payment_info#0", - "aggregate%as_bytes%4#0" - ] - }, - "2115": { - "op": "extract 6 2", - "defined_out": [ - "aggregate%head%11#0", - "aggregate%length_uint16%2#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "payment_info#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%head%11#0", - "payment_info#0", - "aggregate%length_uint16%2#0" - ] - }, - "2118": { - "op": "swap", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%head%11#0", - "aggregate%length_uint16%2#0", - "payment_info#0" - ] - }, - "2119": { - "op": "concat", - "defined_out": [ - "aggregate%encoded_value%2#0", - "aggregate%head%11#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "payment_info#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%head%11#0", - "aggregate%encoded_value%2#0" - ] - }, - "2120": { - "op": "swap", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%encoded_value%2#0", - "aggregate%head%11#0" - ] - }, - "2121": { - "op": "bytec 37 // 0x0012", - "defined_out": [ - "0x0012", - "aggregate%encoded_value%2#0", - "aggregate%head%11#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "payment_info#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%encoded_value%2#0", - "aggregate%head%11#0", - "0x0012" - ] - }, - "2123": { - "op": "concat", - "defined_out": [ - "aggregate%encoded_value%2#0", - "aggregate%head%12#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "payment_info#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%encoded_value%2#0", - "aggregate%head%12#0" - ] - }, - "2124": { - "op": "swap", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%head%12#0", - "aggregate%encoded_value%2#0" - ] - }, - "2125": { - "op": "concat", - "defined_out": [ - "aggregate%concat%2#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "payment_info#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%concat%2#0" - ] - }, - "2126": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%concat%2#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "payment_info#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%concat%2#0", - "0x151f7c75" - ] - }, - "2127": { - "op": "swap", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "0x151f7c75", - "aggregate%concat%2#0" - ] - }, - "2128": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#3", - "payment_amount#0", - "payment_info#0", - "tmp%5#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%5#0" - ] - }, - "2129": { - "op": "log", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ] - }, - "2130": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "box_prefixed_key%0#3", - "payment_amount#0", - "payment_info#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "1" - ] - }, - "2131": { - "op": "return", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ] - }, - "2132": { - "block": "pay_principal_else_body@3", - "stack_in": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "payment_amount#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "payment_amount#0" - ] - }, - "2133": { - "op": "bury 1", - "defined_out": [ - "payment_amount#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ] - }, - "2135": { - "op": "b pay_principal_after_if_else@4" - }, - "2138": { - "subroutine": "modules.transfer_agent.coupon.CouponTransferAgentMixin.asset_transfer[routing]", - "params": {}, - "block": "asset_transfer", - "stack_in": [], - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%extract%1#0" - ] - }, - "2139": { - "op": "dupn 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3" - ] - }, - "2141": { - "op": "pushbytes \"\"", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0" - ] - }, - "2143": { - "op": "dup", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0" - ] - }, - "2144": { - "op": "txna ApplicationArgs 1" - }, - "2147": { - "op": "dup", - "defined_out": [ - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "sender_holding_address#0" - ] - }, - "2148": { - "op": "len", - "defined_out": [ - "len%0#0", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "len%0#0" - ] - }, - "2149": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "len%0#0", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "len%0#0", - "32" - ] - }, - "2150": { - "op": "==", - "defined_out": [ - "eq%0#0", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "eq%0#0" - ] - }, - "2151": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0" - ] - }, - "2152": { - "op": "txna ApplicationArgs 2" - }, - "2155": { - "op": "dup", - "defined_out": [ - "receiver_holding_address#0", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "receiver_holding_address#0" - ] - }, - "2156": { - "op": "len", - "defined_out": [ - "len%1#0", - "receiver_holding_address#0", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "len%1#0" - ] - }, - "2157": { - "op": "intc_2 // 32", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "len%1#0", - "32" - ] - }, - "2158": { - "op": "==", - "defined_out": [ - "eq%1#0", - "receiver_holding_address#0", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "eq%1#0" - ] - }, - "2159": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0" - ] - }, - "2160": { - "op": "txna ApplicationArgs 3", - "defined_out": [ - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%4#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "tmp%4#0" - ] - }, - "2163": { - "op": "dup", - "defined_out": [ - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%4#0", - "tmp%4#0 (copy)" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "tmp%4#0", - "tmp%4#0 (copy)" - ] - }, - "2164": { - "op": "len", - "defined_out": [ - "len%2#0", - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%4#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "tmp%4#0", - "len%2#0" - ] - }, - "2165": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "len%2#0", - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%4#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "tmp%4#0", - "len%2#0", - "8" - ] - }, - "2166": { - "op": "==", - "defined_out": [ - "eq%2#0", - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%4#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "tmp%4#0", - "eq%2#0" - ] - }, - "2167": { - "error": "invalid number of bytes for arc4.uint64", - "op": "assert // invalid number of bytes for arc4.uint64", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "tmp%4#0" - ] - }, - "2168": { - "op": "btoi", - "defined_out": [ - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "2169": { - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "0" - ] - }, - "2170": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"", - "0", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "0", - "\"status\"" - ] - }, - "2171": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2172": { - "error": "check self.status exists", - "op": "assert // check self.status exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "maybe_value%0#0" - ] - }, - "2173": { - "op": "pushint 100", - "defined_out": [ - "100", - "maybe_value%0#0", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "maybe_value%0#0", - "100" - ] - }, - "2175": { - "op": "==", - "defined_out": [ - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%0#1", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%0#1" - ] - }, - "2176": { - "op": "bz asset_transfer_bool_false@6", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "2179": { - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "0" - ] - }, - "2180": { - "op": "bytec 18 // \"secondary_market_opening_date\"", - "defined_out": [ - "\"secondary_market_opening_date\"", - "0", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "0", - "\"secondary_market_opening_date\"" - ] - }, - "2182": { - "op": "app_global_get_ex", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2183": { - "error": "check self.secondary_market_opening_date exists", - "op": "assert // check self.secondary_market_opening_date exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "maybe_value%0#0" - ] - }, - "2184": { - "op": "global LatestTimestamp", - "defined_out": [ - "maybe_value%0#0", - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "maybe_value%0#0", - "tmp%1#1" - ] - }, - "2186": { - "op": "<=", - "defined_out": [ - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%2#2", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%2#2" - ] - }, - "2187": { - "op": "bz asset_transfer_bool_false@6", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "2190": { - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "0" - ] - }, - "2191": { - "op": "bytec 11 // \"secondary_market_closure_date\"", - "defined_out": [ - "\"secondary_market_closure_date\"", - "0", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "0", - "\"secondary_market_closure_date\"" - ] - }, - "2193": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%1#0", - "maybe_value%1#0", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "2194": { - "error": "check self.secondary_market_closure_date exists", - "op": "assert // check self.secondary_market_closure_date exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "maybe_value%1#0" - ] - }, - "2195": { - "op": "bz asset_transfer_bool_true@5", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "2198": { - "op": "global LatestTimestamp", - "defined_out": [ - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%4#1", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%4#1" - ] - }, - "2200": { - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%4#1", - "0" - ] - }, - "2201": { - "op": "bytec 11 // \"secondary_market_closure_date\"", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%4#1", - "0", - "\"secondary_market_closure_date\"" - ] - }, - "2203": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%2#0", - "maybe_value%2#0", - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%4#1", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%4#1", - "maybe_value%2#0", - "maybe_exists%2#0" - ] - }, - "2204": { - "error": "check self.secondary_market_closure_date exists", - "op": "assert // check self.secondary_market_closure_date exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%4#1", - "maybe_value%2#0" - ] - }, - "2205": { - "op": "<", - "defined_out": [ - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%5#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%5#0" - ] - }, - "2206": { - "op": "bz asset_transfer_bool_false@6", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "2209": { - "block": "asset_transfer_bool_true@5", - "stack_in": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ], - "op": "intc_1 // 1", - "defined_out": [ - "and_result%0#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "and_result%0#0" - ] - }, - "2210": { - "error": "Secondary market is closed", - "block": "asset_transfer_bool_merge@7", - "stack_in": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "and_result%0#0" - ], - "op": "assert // Secondary market is closed", - "defined_out": [], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "2211": { - "op": "txn Sender", - "defined_out": [ - "tmp%0#3" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%0#3" - ] - }, - "2213": { - "op": "dig 3", - "defined_out": [ - "sender_holding_address#0", - "tmp%0#3" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%0#3", - "sender_holding_address#0" - ] - }, - "2215": { - "op": "dup", - "defined_out": [ - "sender_holding_address#0", - "sender_holding_address#0 (copy)", - "tmp%0#3" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%0#3", - "sender_holding_address#0 (copy)", - "sender_holding_address#0 (copy)" - ] - }, - "2216": { - "op": "cover 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "tmp%0#3", - "sender_holding_address#0 (copy)" - ] - }, - "2218": { - "op": "==", - "defined_out": [ - "sender_holding_address#0", - "tmp%1#4" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "tmp%1#4" - ] - }, - "2219": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0" - ] - }, - "2220": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "op": "callsub assert_is_not_asset_defaulted" - }, - "2223": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_suspended", - "op": "callsub assert_is_not_asset_suspended" - }, - "2226": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "0x52333023" - ] - }, - "2227": { - "op": "dig 1", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "0x52333023", - "sender_holding_address#0 (copy)" - ] - }, - "2229": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#2", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2" - ] - }, - "2230": { - "op": "dup", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#2" - ] - }, - "2231": { - "op": "bury 9", - "defined_out": [ - "box_prefixed_key%0#2", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2" - ] - }, - "2233": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#2", - "box_prefixed_key%0#2 (copy)", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#2 (copy)" - ] - }, - "2234": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#2", - "maybe_exists%0#0", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "2235": { - "op": "bury 1", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "maybe_exists%0#0" - ] - }, - "2237": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2" - ] - }, - "2238": { - "op": "bytec_1 // 0x52333023", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "0x52333023" - ] - }, - "2239": { - "op": "dig 4", - "defined_out": [ - "0x52333023", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "0x52333023", - "receiver_holding_address#0" - ] - }, - "2241": { - "op": "dup", - "defined_out": [ - "0x52333023", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "receiver_holding_address#0 (copy)", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "0x52333023", - "receiver_holding_address#0 (copy)", - "receiver_holding_address#0 (copy)" - ] - }, - "2242": { - "op": "cover 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "0x52333023", - "receiver_holding_address#0 (copy)" - ] - }, - "2244": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "box_prefixed_key%0#3" - ] - }, - "2245": { - "op": "dup", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3" - ] - }, - "2246": { - "op": "bury 10", - "defined_out": [ - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "box_prefixed_key%0#3" - ] - }, - "2248": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)", - "receiver_holding_address#0", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)" - ] - }, - "2249": { - "op": "box_len", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "box_prefixed_key%0#3", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "2250": { - "op": "bury 1", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "box_prefixed_key%0#3", - "maybe_exists%0#0" - ] - }, - "2252": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "box_prefixed_key%0#3" - ] - }, - "2253": { - "op": "dig 3", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "box_prefixed_key%0#3", - "sender_holding_address#0 (copy)" - ] - }, - "2255": { - "callsub": "modules.accounting.AccountingModule.assert_is_not_account_suspended", - "op": "callsub assert_is_not_account_suspended", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "box_prefixed_key%0#3" - ] - }, - "2258": { - "op": "dig 1", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "box_prefixed_key%0#3", - "receiver_holding_address#0 (copy)" - ] - }, - "2260": { - "callsub": "modules.accounting.AccountingModule.assert_is_not_account_suspended", - "op": "callsub assert_is_not_account_suspended", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "box_prefixed_key%0#3" - ] - }, - "2263": { - "op": "uncover 3", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "box_prefixed_key%0#3", - "sender_holding_address#0" - ] - }, - "2265": { - "op": "uncover 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "sender_holding_address#0", - "receiver_holding_address#0" - ] - }, - "2267": { - "op": "!=", - "defined_out": [ - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%0#1" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "tmp%0#1" - ] - }, - "2268": { - "error": "Sender and receiver must be different", - "op": "assert // Sender and receiver must be different", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3" - ] - }, - "2269": { - "op": "dig 2", - "defined_out": [ - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "units#0" - ] - }, - "2271": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0", - "units#0 (copy)" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "units#0", - "units#0 (copy)" - ] - }, - "2272": { - "error": "Transfer units must be greater than zero", - "op": "assert // Transfer units must be greater than zero", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "units#0" - ] - }, - "2273": { - "op": "uncover 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "units#0", - "box_prefixed_key%0#2" - ] - }, - "2275": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "units#0", - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "2276": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "units#0", - "aggregate%box_get%0#0" - ] - }, - "2277": { - "op": "dup", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%0#0 (copy)", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "units#0", - "aggregate%box_get%0#0", - "aggregate%box_get%0#0 (copy)" - ] - }, - "2278": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "aggregate%box_get%0#0", - "aggregate%box_get%0#0 (copy)", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "units#0", - "aggregate%box_get%0#0", - "aggregate%box_get%0#0 (copy)", - "32" - ] - }, - "2279": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%box_get%0#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0", - "values%0#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "units#0", - "aggregate%box_get%0#0", - "values%0#0" - ] - }, - "2280": { - "op": "uncover 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "aggregate%box_get%0#0", - "values%0#0", - "units#0" - ] - }, - "2282": { - "op": ">=", - "defined_out": [ - "aggregate%box_get%0#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%2#2", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "aggregate%box_get%0#0", - "tmp%2#2" - ] - }, - "2283": { - "error": "Insufficient sender units to transfer", - "op": "assert // Insufficient sender units to transfer", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "aggregate%box_get%0#0" - ] - }, - "2284": { - "op": "extract 40 8", - "defined_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "aggregate%extract%1#0" - ] - }, - "2287": { - "op": "bury 9", - "defined_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3" - ] - }, - "2289": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%4#0", - "aggregate%box_get%5#0", - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%box_get%4#0", - "aggregate%box_get%5#0" - ] - }, - "2290": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%box_get%4#0" - ] - }, - "2291": { - "op": "intc_2 // 32", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%box_get%4#0", - "32" - ] - }, - "2292": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0", - "values%1#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%1#0" - ] - }, - "2293": { - "op": "bz asset_transfer_else_body@9", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "2296": { - "op": "dig 6", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2" - ] - }, - "2298": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%6#0", - "aggregate%box_get%7#0", - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%box_get%6#0", - "aggregate%box_get%7#0" - ] - }, - "2299": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%box_get%6#0" - ] - }, - "2300": { - "op": "pushint 40", - "defined_out": [ - "40", - "aggregate%box_get%6#0", - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%box_get%6#0", - "40" - ] - }, - "2302": { - "op": "extract_uint64", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%0#0" - ] - }, - "2303": { - "op": "dig 6", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%0#0", - "box_prefixed_key%0#3" - ] - }, - "2305": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%8#0", - "aggregate%box_get%9#0", - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0", - "values%0#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%0#0", - "aggregate%box_get%8#0", - "aggregate%box_get%9#0" - ] - }, - "2306": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%0#0", - "aggregate%box_get%8#0" - ] - }, - "2307": { - "op": "pushint 40", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%0#0", - "aggregate%box_get%8#0", - "40" - ] - }, - "2309": { - "op": "extract_uint64", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%0#0", - "values%1#0" - ] - }, - "2310": { - "op": "==", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%0#1" - ] - }, - "2311": { - "op": "bz asset_transfer_bool_false@20", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "2314": { - "op": "dig 6", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2" - ] - }, - "2316": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%10#0", - "aggregate%box_get%11#0", - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%box_get%10#0", - "aggregate%box_get%11#0" - ] - }, - "2317": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%box_get%10#0" - ] - }, - "2318": { - "op": "pushint 48", - "defined_out": [ - "48", - "aggregate%box_get%10#0", - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%box_get%10#0", - "48" - ] - }, - "2320": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0", - "values%2#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%2#0" - ] - }, - "2321": { - "op": "dig 6", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%2#0", - "box_prefixed_key%0#3" - ] - }, - "2323": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%12#0", - "aggregate%box_get%13#0", - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0", - "values%2#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%2#0", - "aggregate%box_get%12#0", - "aggregate%box_get%13#0" - ] - }, - "2324": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%2#0", - "aggregate%box_get%12#0" - ] - }, - "2325": { - "op": "pushint 48", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%2#0", - "aggregate%box_get%12#0", - "48" - ] - }, - "2327": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0", - "values%2#0", - "values%3#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%2#0", - "values%3#0" - ] - }, - "2328": { - "op": "==", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%1#4" - ] - }, - "2329": { - "op": "bz asset_transfer_bool_false@20", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "2332": { - "op": "intc_1 // 1", - "defined_out": [ - "aggregate%extract%1#0", - "and_result%0#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "and_result%0#0" - ] - }, - "2333": { - "error": "Sender and receiver units are not fungible", - "block": "asset_transfer_bool_merge@21", - "stack_in": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "and_result%0#0" - ], - "op": "assert // Sender and receiver units are not fungible", - "defined_out": [], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "2334": { - "block": "asset_transfer_after_if_else@10", - "stack_in": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ], - "op": "dig 6", - "defined_out": [ - "box_prefixed_key%0#2" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2" - ] - }, - "2336": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#2", - "box_prefixed_key%0#2 (copy)" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#2 (copy)" - ] - }, - "2337": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%16#0", - "aggregate%box_get%17#0", - "box_prefixed_key%0#2" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "aggregate%box_get%16#0", - "aggregate%box_get%17#0" - ] - }, - "2338": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "aggregate%box_get%16#0" - ] - }, - "2339": { - "op": "pushint 40", - "defined_out": [ - "40", - "aggregate%box_get%16#0", - "box_prefixed_key%0#2" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "aggregate%box_get%16#0", - "40" - ] - }, - "2341": { - "op": "extract_uint64", - "defined_out": [ - "box_prefixed_key%0#2", - "sender_unit_value#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "sender_unit_value#0" - ] - }, - "2342": { - "op": "bury 5", - "defined_out": [ - "box_prefixed_key%0#2", - "sender_unit_value#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2" - ] - }, - "2344": { - "callsub": "modules.core_financial.coupon.FixedCouponCashflowMixin.count_due_coupons", - "op": "callsub count_due_coupons", - "defined_out": [ - "box_prefixed_key%0#2", - "due_coupons#0", - "sender_unit_value#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "due_coupons#0" - ] - }, - "2347": { - "op": "dig 4", - "defined_out": [ - "box_prefixed_key%0#2", - "due_coupons#0", - "sender_holding_address#0", - "sender_unit_value#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "due_coupons#0", - "sender_holding_address#0" - ] - }, - "2349": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#2", - "due_coupons#0", - "sender_holding_address#0", - "sender_holding_address#0 (copy)", - "sender_unit_value#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "due_coupons#0", - "sender_holding_address#0 (copy)", - "sender_holding_address#0 (copy)" - ] - }, - "2350": { - "op": "cover 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "due_coupons#0", - "sender_holding_address#0 (copy)" - ] - }, - "2352": { - "op": "dig 1", - "defined_out": [ - "box_prefixed_key%0#2", - "due_coupons#0", - "due_coupons#0 (copy)", - "sender_holding_address#0", - "sender_holding_address#0 (copy)", - "sender_unit_value#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "due_coupons#0", - "sender_holding_address#0 (copy)", - "due_coupons#0 (copy)" - ] - }, - "2354": { - "callsub": "modules.core_financial.coupon.CouponCashflowMixin.assert_no_pending_coupon_payment", - "op": "callsub assert_no_pending_coupon_payment", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "due_coupons#0" - ] - }, - "2357": { - "op": "swap", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "due_coupons#0", - "sender_holding_address#0" - ] - }, - "2358": { - "op": "dig 3", - "defined_out": [ - "box_prefixed_key%0#2", - "due_coupons#0", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "due_coupons#0", - "sender_holding_address#0", - "units#0" - ] - }, - "2360": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#2", - "due_coupons#0", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0", - "units#0 (copy)" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "due_coupons#0", - "sender_holding_address#0", - "units#0 (copy)", - "units#0 (copy)" - ] - }, - "2361": { - "op": "cover 3", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "units#0", - "due_coupons#0", - "sender_holding_address#0", - "units#0 (copy)" - ] - }, - "2363": { - "op": "uncover 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "units#0", - "sender_holding_address#0", - "units#0 (copy)", - "due_coupons#0" - ] - }, - "2365": { - "callsub": "modules.core_financial.coupon.FixedCouponCashflowMixin.accrued_interest_amount", - "op": "callsub accrued_interest_amount", - "defined_out": [ - "accrued_interest#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "units#0", - "accrued_interest#0" - ] - }, - "2368": { - "op": "bury 7", - "defined_out": [ - "accrued_interest#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "units#0" - ] - }, - "2370": { - "op": "dig 1", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "units#0", - "box_prefixed_key%0#2 (copy)" - ] - }, - "2372": { - "op": "box_get", - "defined_out": [ - "accrued_interest#0", - "aggregate%box_get%18#0", - "aggregate%box_get%19#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "units#0", - "aggregate%box_get%18#0", - "aggregate%box_get%19#0" - ] - }, - "2373": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "units#0", - "aggregate%box_get%18#0" - ] - }, - "2374": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "accrued_interest#0", - "aggregate%box_get%18#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "units#0", - "aggregate%box_get%18#0", - "32" - ] - }, - "2375": { - "op": "extract_uint64", - "defined_out": [ - "accrued_interest#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0", - "values%0#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "units#0", - "values%0#0" - ] - }, - "2376": { - "op": "dup2", - "defined_out": [ - "accrued_interest#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0", - "units#0 (copy)", - "values%0#0", - "values%0#0 (copy)" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "units#0", - "values%0#0", - "units#0 (copy)", - "values%0#0 (copy)" - ] - }, - "2377": { - "op": "<=", - "defined_out": [ - "accrued_interest#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "tmp%0#1", - "units#0", - "values%0#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "units#0", - "values%0#0", - "tmp%0#1" - ] - }, - "2378": { - "error": "Insufficient sender units to transfer", - "op": "assert // Insufficient sender units to transfer", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "units#0", - "values%0#0" - ] - }, - "2379": { - "op": "swap", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "values%0#0", - "units#0" - ] - }, - "2380": { - "op": "-", - "defined_out": [ - "accrued_interest#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "tmp%1#1" - ] - }, - "2381": { - "op": "itob", - "defined_out": [ - "accrued_interest#0", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "aggregate%val_as_bytes%0#0" - ] - }, - "2382": { - "op": "dig 1", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#2 (copy)" - ] - }, - "2384": { - "op": "intc_2 // 32", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#2 (copy)", - "32" - ] - }, - "2385": { - "op": "uncover 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#2 (copy)", - "32", - "aggregate%val_as_bytes%0#0" - ] - }, - "2387": { - "op": "box_replace", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2" - ] - }, - "2388": { - "op": "box_get", - "defined_out": [ - "accrued_interest#0", - "aggregate%box_get%22#0", - "aggregate%box_get%23#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%box_get%22#0", - "aggregate%box_get%23#0" - ] - }, - "2389": { - "op": "pop", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%box_get%22#0" - ] - }, - "2390": { - "op": "intc_2 // 32", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%box_get%22#0", - "32" - ] - }, - "2391": { - "op": "extract_uint64", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%0#0" - ] - }, - "2392": { - "op": "bnz asset_transfer_after_if_else@16", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "2395": { - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "0" - ] - }, - "2396": { - "op": "itob", - "defined_out": [ - "accrued_interest#0", - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%val_as_bytes%1#0" - ] - }, - "2397": { - "op": "dig 7", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#2" - ] - }, - "2399": { - "op": "dup", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#2 (copy)", - "box_prefixed_key%0#2 (copy)" - ] - }, - "2400": { - "op": "cover 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#2 (copy)" - ] - }, - "2402": { - "op": "pushint 40", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#2 (copy)", - "40" - ] - }, - "2404": { - "op": "dig 2", - "defined_out": [ - "40", - "accrued_interest#0", - "aggregate%val_as_bytes%1#0", - "aggregate%val_as_bytes%1#0 (copy)", - "box_prefixed_key%0#2", - "box_prefixed_key%0#2 (copy)", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#2 (copy)", - "40", - "aggregate%val_as_bytes%1#0 (copy)" - ] - }, - "2406": { - "op": "box_replace", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "aggregate%val_as_bytes%1#0" - ] - }, - "2407": { - "op": "pushint 48" - }, - "2409": { - "op": "swap", - "defined_out": [ - "48", - "accrued_interest#0", - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "48", - "aggregate%val_as_bytes%1#0" - ] - }, - "2410": { - "op": "box_replace", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "2411": { - "block": "asset_transfer_after_if_else@16", - "stack_in": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ], - "op": "dig 5", - "defined_out": [ - "box_prefixed_key%0#3" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3" - ] - }, - "2413": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)" - ] - }, - "2414": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%24#0", - "aggregate%box_get%25#0", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "aggregate%box_get%24#0", - "aggregate%box_get%25#0" - ] - }, - "2415": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "aggregate%box_get%24#0" - ] - }, - "2416": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "aggregate%box_get%24#0", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "aggregate%box_get%24#0", - "32" - ] - }, - "2417": { - "op": "extract_uint64", - "defined_out": [ - "box_prefixed_key%0#3", - "values%0#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "values%0#0" - ] - }, - "2418": { - "op": "dig 2", - "defined_out": [ - "box_prefixed_key%0#3", - "units#0", - "values%0#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "values%0#0", - "units#0" - ] - }, - "2420": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#3", - "units#0", - "units#0 (copy)", - "values%0#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "values%0#0", - "units#0 (copy)", - "units#0 (copy)" - ] - }, - "2421": { - "op": "cover 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "units#0", - "values%0#0", - "units#0 (copy)" - ] - }, - "2423": { - "op": "+", - "defined_out": [ - "box_prefixed_key%0#3", - "tmp%0#6", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "units#0", - "tmp%0#6" - ] - }, - "2424": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%2#0", - "box_prefixed_key%0#3", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "units#0", - "aggregate%val_as_bytes%2#0" - ] - }, - "2425": { - "op": "uncover 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "units#0", - "aggregate%val_as_bytes%2#0", - "box_prefixed_key%0#3" - ] - }, - "2427": { - "op": "intc_2 // 32", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "units#0", - "aggregate%val_as_bytes%2#0", - "box_prefixed_key%0#3", - "32" - ] - }, - "2428": { - "op": "uncover 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "units#0", - "box_prefixed_key%0#3", - "32", - "aggregate%val_as_bytes%2#0" - ] - }, - "2430": { - "op": "box_replace", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "units#0" - ] - }, - "2431": { - "op": "dig 4", - "defined_out": [ - "box_prefixed_key%0#3", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "units#0", - "sender_unit_value#0" - ] - }, - "2433": { - "op": "*", - "defined_out": [ - "box_prefixed_key%0#3", - "sender_unit_value#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%1#1" - ] - }, - "2434": { - "op": "dig 5", - "defined_out": [ - "accrued_interest#0", - "box_prefixed_key%0#3", - "sender_unit_value#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%1#1", - "accrued_interest#0" - ] - }, - "2436": { - "op": "+", - "defined_out": [ - "accrued_interest#0", - "box_prefixed_key%0#3", - "sender_unit_value#0", - "tmp%2#1", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%2#1" - ] - }, - "2437": { - "op": "itob", - "defined_out": [ - "accrued_interest#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%val_as_bytes%3#0" - ] - }, - "2438": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "accrued_interest#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%val_as_bytes%3#0", - "0x151f7c75" - ] - }, - "2439": { - "op": "swap", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "0x151f7c75", - "aggregate%val_as_bytes%3#0" - ] - }, - "2440": { - "op": "concat", - "defined_out": [ - "accrued_interest#0", - "box_prefixed_key%0#3", - "sender_unit_value#0", - "tmp%8#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%8#0" - ] - }, - "2441": { - "op": "log", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "2442": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "accrued_interest#0", - "box_prefixed_key%0#3", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "1" - ] - }, - "2443": { - "op": "return", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "2444": { - "block": "asset_transfer_bool_false@20", - "stack_in": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "and_result%0#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "and_result%0#0" - ] - }, - "2445": { - "op": "b asset_transfer_bool_merge@21" - }, - "2448": { - "block": "asset_transfer_else_body@9", - "stack_in": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ], - "op": "dig 5", - "defined_out": [ - "box_prefixed_key%0#3" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3" - ] - }, - "2450": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)" - ] - }, - "2451": { - "op": "pushint 40", - "defined_out": [ - "40", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)", - "40" - ] - }, - "2453": { - "op": "dig 10", - "defined_out": [ - "40", - "aggregate%extract%1#0", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)", - "40", - "aggregate%extract%1#0" - ] - }, - "2455": { - "op": "box_replace", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3" - ] - }, - "2456": { - "op": "dig 7", - "defined_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "box_prefixed_key%0#2" - ] - }, - "2458": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%14#0", - "aggregate%box_get%15#0", - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "aggregate%box_get%14#0", - "aggregate%box_get%15#0" - ] - }, - "2459": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "aggregate%box_get%14#0" - ] - }, - "2460": { - "op": "extract 48 8", - "defined_out": [ - "aggregate%extract%1#0", - "aggregate%extract%7#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "aggregate%extract%7#0" - ] - }, - "2463": { - "op": "pushint 48" - }, - "2465": { - "op": "swap", - "defined_out": [ - "48", - "aggregate%extract%1#0", - "aggregate%extract%7#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "48", - "aggregate%extract%7#0" - ] - }, - "2466": { - "op": "box_replace", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "2467": { - "op": "b asset_transfer_after_if_else@10" - }, - "2470": { - "block": "asset_transfer_bool_false@6", - "stack_in": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "and_result%0#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "and_result%0#0" - ] - }, - "2471": { - "op": "b asset_transfer_bool_merge@7" - }, - "2474": { - "subroutine": "modules.core_financial.common.CoreFinancialCommonMixin.asset_create[routing]", - "params": {}, - "block": "asset_create", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "arranger#0" - ], - "stack_out": [ - "arranger#0" - ] - }, - "2477": { - "op": "dup", - "defined_out": [ - "arranger#0", - "arranger#0 (copy)" - ], - "stack_out": [ - "arranger#0", - "arranger#0 (copy)" - ] - }, - "2478": { - "op": "len", - "defined_out": [ - "arranger#0", - "len%0#0" - ], - "stack_out": [ - "arranger#0", - "len%0#0" - ] - }, - "2479": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "arranger#0", - "len%0#0" - ], - "stack_out": [ - "arranger#0", - "len%0#0", - "32" - ] - }, - "2480": { - "op": "==", - "defined_out": [ - "arranger#0", - "eq%0#0" - ], - "stack_out": [ - "arranger#0", - "eq%0#0" - ] - }, - "2481": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "arranger#0" - ] - }, - "2482": { - "op": "txna ApplicationArgs 2", - "defined_out": [ - "arranger#0", - "metadata#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0" - ] - }, - "2485": { - "op": "dup", - "defined_out": [ - "arranger#0", - "metadata#0", - "metadata#0 (copy)" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "metadata#0 (copy)" - ] - }, - "2486": { - "op": "len", - "defined_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0" - ] - }, - "2487": { - "op": "dig 1", - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "metadata#0 (copy)" - ] - }, - "2489": { - "op": "pushint 38", - "defined_out": [ - "38", - "arranger#0", - "metadata#0", - "metadata#0 (copy)", - "tuple_len%0#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "metadata#0 (copy)", - "38" - ] - }, - "2491": { - "error": "invalid tuple encoding", - "op": "extract_uint16 // on error: invalid tuple encoding", - "defined_out": [ - "arranger#0", - "extract_uint16%0#0", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "extract_uint16%0#0" - ] - }, - "2492": { - "op": "dup", - "defined_out": [ - "arranger#0", - "extract_uint16%0#0", - "extract_uint16%0#0 (copy)", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "extract_uint16%0#0", - "extract_uint16%0#0 (copy)" - ] - }, - "2493": { - "op": "pushint 40", - "defined_out": [ - "40", - "arranger#0", - "extract_uint16%0#0", - "extract_uint16%0#0 (copy)", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "extract_uint16%0#0", - "extract_uint16%0#0 (copy)", - "40" - ] - }, - "2495": { - "op": "==", - "defined_out": [ - "arranger#0", - "eq%1#0", - "extract_uint16%0#0", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "extract_uint16%0#0", - "eq%1#0" - ] - }, - "2496": { - "error": "invalid tail pointer at index 7 of (uint8,uint8,uint8,uint8,uint8,uint8,uint8[32],(len+utf8[]))", - "op": "assert // invalid tail pointer at index 7 of (uint8,uint8,uint8,uint8,uint8,uint8,uint8[32],(len+utf8[]))", - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "extract_uint16%0#0" - ] - }, - "2497": { - "op": "dig 2", - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "extract_uint16%0#0", - "metadata#0 (copy)" - ] - }, - "2499": { - "op": "swap", - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "metadata#0 (copy)", - "extract_uint16%0#0" - ] - }, - "2500": { - "op": "dig 2", - "defined_out": [ - "arranger#0", - "extract_uint16%0#0", - "metadata#0", - "metadata#0 (copy)", - "tuple_len%0#0", - "tuple_len%0#0 (copy)" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "metadata#0 (copy)", - "extract_uint16%0#0", - "tuple_len%0#0 (copy)" - ] - }, - "2502": { - "op": "substring3", - "defined_out": [ - "arranger#0", - "metadata#0", - "substring3%0#0", - "tuple_len%0#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "substring3%0#0" - ] - }, - "2503": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "arranger#0", - "metadata#0", - "substring3%0#0", - "tuple_len%0#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "substring3%0#0", - "0" - ] - }, - "2504": { - "error": "invalid array length header", - "op": "extract_uint16 // on error: invalid array length header", - "defined_out": [ - "aggregate%array_length%0#0", - "arranger#0", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "aggregate%array_length%0#0" - ] - }, - "2505": { - "op": "pushint 42", - "defined_out": [ - "42", - "aggregate%array_length%0#0", - "arranger#0", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "aggregate%array_length%0#0", - "42" - ] - }, - "2507": { - "op": "+", - "defined_out": [ - "add%1#0", - "arranger#0", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "add%1#0" - ] - }, - "2508": { - "op": "==", - "defined_out": [ - "arranger#0", - "eq%2#0", - "metadata#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "eq%2#0" - ] - }, - "2509": { - "error": "invalid number of bytes for smart_contracts.abi_types.AssetMetadata", - "op": "assert // invalid number of bytes for smart_contracts.abi_types.AssetMetadata", - "stack_out": [ - "arranger#0", - "metadata#0" - ] - }, - "2510": { - "op": "bytec 8 // 0x52323023", - "defined_out": [ - "0x52323023", - "arranger#0", - "metadata#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "0x52323023" - ] - }, - "2512": { - "op": "uncover 2", - "stack_out": [ - "metadata#0", - "0x52323023", - "arranger#0" - ] - }, - "2514": { - "op": "app_global_put", - "stack_out": [ - "metadata#0" - ] - }, - "2515": { - "op": "bytec 25 // \"metadata\"", - "defined_out": [ - "\"metadata\"", - "metadata#0" - ], - "stack_out": [ - "metadata#0", - "\"metadata\"" - ] - }, - "2517": { - "op": "swap", - "stack_out": [ - "\"metadata\"", - "metadata#0" - ] - }, - "2518": { - "op": "app_global_put", - "stack_out": [] - }, - "2519": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "2520": { - "op": "return", - "stack_out": [] - }, - "2521": { - "subroutine": "modules.core_financial.common.CoreFinancialCommonMixin.asset_update[routing]", - "params": {}, - "block": "asset_update", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "metadata#0" - ], - "stack_out": [ - "metadata#0" - ] - }, - "2524": { - "op": "dup", - "defined_out": [ - "metadata#0", - "metadata#0 (copy)" - ], - "stack_out": [ - "metadata#0", - "metadata#0 (copy)" - ] - }, - "2525": { - "op": "len", - "defined_out": [ - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "metadata#0", - "tuple_len%0#0" - ] - }, - "2526": { - "op": "dig 1", - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "metadata#0 (copy)" - ] - }, - "2528": { - "op": "pushint 38", - "defined_out": [ - "38", - "metadata#0", - "metadata#0 (copy)", - "tuple_len%0#0" - ], - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "metadata#0 (copy)", - "38" - ] - }, - "2530": { - "error": "invalid tuple encoding", - "op": "extract_uint16 // on error: invalid tuple encoding", - "defined_out": [ - "extract_uint16%0#0", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "extract_uint16%0#0" - ] - }, - "2531": { - "op": "dup", - "defined_out": [ - "extract_uint16%0#0", - "extract_uint16%0#0 (copy)", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "extract_uint16%0#0", - "extract_uint16%0#0 (copy)" - ] - }, - "2532": { - "op": "pushint 40", - "defined_out": [ - "40", - "extract_uint16%0#0", - "extract_uint16%0#0 (copy)", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "extract_uint16%0#0", - "extract_uint16%0#0 (copy)", - "40" - ] - }, - "2534": { - "op": "==", - "defined_out": [ - "eq%0#0", - "extract_uint16%0#0", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "extract_uint16%0#0", - "eq%0#0" - ] - }, - "2535": { - "error": "invalid tail pointer at index 7 of (uint8,uint8,uint8,uint8,uint8,uint8,uint8[32],(len+utf8[]))", - "op": "assert // invalid tail pointer at index 7 of (uint8,uint8,uint8,uint8,uint8,uint8,uint8[32],(len+utf8[]))", - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "extract_uint16%0#0" - ] - }, - "2536": { - "op": "dig 2", - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "extract_uint16%0#0", - "metadata#0 (copy)" - ] - }, - "2538": { - "op": "swap", - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "metadata#0 (copy)", - "extract_uint16%0#0" - ] - }, - "2539": { - "op": "dig 2", - "defined_out": [ - "extract_uint16%0#0", - "metadata#0", - "metadata#0 (copy)", - "tuple_len%0#0", - "tuple_len%0#0 (copy)" - ], - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "metadata#0 (copy)", - "extract_uint16%0#0", - "tuple_len%0#0 (copy)" - ] - }, - "2541": { - "op": "substring3", - "defined_out": [ - "metadata#0", - "substring3%0#0", - "tuple_len%0#0" - ], - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "substring3%0#0" - ] - }, - "2542": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "metadata#0", - "substring3%0#0", - "tuple_len%0#0" - ], - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "substring3%0#0", - "0" - ] - }, - "2543": { - "error": "invalid array length header", - "op": "extract_uint16 // on error: invalid array length header", - "defined_out": [ - "aggregate%array_length%0#0", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "aggregate%array_length%0#0" - ] - }, - "2544": { - "op": "pushint 42", - "defined_out": [ - "42", - "aggregate%array_length%0#0", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "aggregate%array_length%0#0", - "42" - ] - }, - "2546": { - "op": "+", - "defined_out": [ - "add%1#0", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "add%1#0" - ] - }, - "2547": { - "op": "==", - "defined_out": [ - "eq%1#0", - "metadata#0" - ], - "stack_out": [ - "metadata#0", - "eq%1#0" - ] - }, - "2548": { - "error": "invalid number of bytes for smart_contracts.abi_types.AssetMetadata", - "op": "assert // invalid number of bytes for smart_contracts.abi_types.AssetMetadata", - "stack_out": [ - "metadata#0" - ] - }, - "2549": { - "callsub": "modules.rbac.RbacModule.assert_caller_is_arranger", - "op": "callsub assert_caller_is_arranger" - }, - "2552": { - "op": "bytec 25 // \"metadata\"", - "defined_out": [ - "\"metadata\"", - "metadata#0" - ], - "stack_out": [ - "metadata#0", - "\"metadata\"" - ] - }, - "2554": { - "op": "swap", - "stack_out": [ - "\"metadata\"", - "metadata#0" - ] - }, - "2555": { - "op": "app_global_put", - "stack_out": [] - }, - "2556": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "2557": { - "op": "return", - "stack_out": [] - }, - "2558": { - "subroutine": "modules.core_financial.common.CoreFinancialCommonMixin.set_secondary_time_events[routing]", - "params": {}, - "block": "set_secondary_time_events", - "stack_in": [], - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%array_trimmed%0#0" - ] - }, - "2559": { - "op": "txna ApplicationArgs 1" - }, - "2562": { - "op": "dupn 2", - "defined_out": [ - "secondary_market_time_events#0", - "secondary_market_time_events#0 (copy)" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0 (copy)" - ] - }, - "2564": { - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0 (copy)", - "0" - ] - }, - "2565": { - "error": "invalid array length header", - "op": "extract_uint16 // on error: invalid array length header", - "defined_out": [ - "aggregate%array_length%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0" - ] - }, - "2566": { - "op": "dup", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%0#0 (copy)", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "aggregate%array_length%0#0 (copy)" - ] - }, - "2567": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "aggregate%array_length%0#0", - "aggregate%array_length%0#0 (copy)", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "aggregate%array_length%0#0 (copy)", - "8" - ] - }, - "2568": { - "op": "*", - "defined_out": [ - "aggregate%array_length%0#0", - "mul%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "mul%0#0" - ] - }, - "2569": { - "op": "pushint 2", - "defined_out": [ - "2", - "aggregate%array_length%0#0", - "mul%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "mul%0#0", - "2" - ] - }, - "2571": { - "op": "+", - "defined_out": [ - "add%0#0", - "aggregate%array_length%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "add%0#0" - ] - }, - "2572": { - "op": "uncover 2", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "add%0#0", - "secondary_market_time_events#0" - ] - }, - "2574": { - "op": "len", - "defined_out": [ - "add%0#0", - "aggregate%array_length%0#0", - "len%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "add%0#0", - "len%0#0" - ] - }, - "2575": { - "op": "==", - "defined_out": [ - "aggregate%array_length%0#0", - "eq%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "eq%0#0" - ] - }, - "2576": { - "error": "invalid number of bytes for arc4.dynamic_array", - "op": "assert // invalid number of bytes for arc4.dynamic_array", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0" - ] - }, - "2577": { - "callsub": "modules.rbac.RbacModule.assert_caller_is_arranger", - "op": "callsub assert_caller_is_arranger" - }, - "2580": { - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "0" - ] - }, - "2581": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"", - "0", - "aggregate%array_length%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "0", - "\"status\"" - ] - }, - "2582": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%array_length%0#0", - "maybe_exists%0#0", - "maybe_value%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2583": { - "error": "check self.status exists", - "op": "assert // check self.status exists", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "maybe_value%0#0" - ] - }, - "2584": { - "op": "intc 5 // 200", - "defined_out": [ - "200", - "aggregate%array_length%0#0", - "maybe_value%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "maybe_value%0#0", - "200" - ] - }, - "2586": { - "op": "==", - "defined_out": [ - "aggregate%array_length%0#0", - "secondary_market_time_events#0", - "tmp%0#2" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "tmp%0#2" - ] - }, - "2587": { - "op": "!", - "defined_out": [ - "aggregate%array_length%0#0", - "secondary_market_time_events#0", - "tmp%1#1" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "tmp%1#1" - ] - }, - "2588": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0" - ] - }, - "2589": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "op": "callsub assert_is_not_asset_defaulted" - }, - "2592": { - "op": "dup", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "aggregate%array_length%0#0 (copy)" - ] - }, - "2593": { - "error": "Time events length is invalid", - "op": "assert // Time events length is invalid", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0" - ] - }, - "2594": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "aggregate%array_length%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "1" - ] - }, - "2595": { - "op": ">", - "defined_out": [ - "secondary_market_time_events#0", - "tmp%5#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "tmp%5#0" - ] - }, - "2596": { - "op": "bz set_secondary_time_events_after_if_else@3", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0" - ] - }, - "2599": { - "op": "dup", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0" - ] - }, - "2600": { - "callsub": "modules.core_financial.common.CoreFinancialCommonMixin.assert_time_events_sorted", - "op": "callsub assert_time_events_sorted" - }, - "2603": { - "op": "bury 1", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0" - ] - }, - "2605": { - "block": "set_secondary_time_events_after_if_else@3", - "stack_in": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "0" - ] - }, - "2606": { - "op": "bytec 4 // \"issuance_date\"", - "defined_out": [ - "\"issuance_date\"", - "0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "0", - "\"issuance_date\"" - ] - }, - "2608": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2609": { - "error": "check self.issuance_date exists", - "op": "assert // check self.issuance_date exists", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%0#0" - ] - }, - "2610": { - "op": "dig 1", - "defined_out": [ - "maybe_value%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%0#0", - "secondary_market_time_events#0" - ] - }, - "2612": { - "op": "dup", - "defined_out": [ - "maybe_value%0#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0 (copy)" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%0#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0 (copy)" - ] - }, - "2613": { - "op": "extract 2 0", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "maybe_value%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%0#0", - "secondary_market_time_events#0", - "aggregate%array_trimmed%0#0" - ] - }, - "2616": { - "op": "bury 4", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "maybe_value%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%0#0", - "secondary_market_time_events#0" - ] - }, - "2618": { - "op": "pushint 2", - "defined_out": [ - "2", - "aggregate%array_trimmed%0#0", - "maybe_value%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%0#0", - "secondary_market_time_events#0", - "2" - ] - }, - "2620": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "maybe_value%0#0", - "secondary_market_time_events#0", - "values%0#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%0#0", - "values%0#0" - ] - }, - "2621": { - "op": "swap", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "values%0#0", - "maybe_value%0#0" - ] - }, - "2622": { - "op": "dig 1", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "maybe_value%0#0", - "secondary_market_time_events#0", - "values%0#0", - "values%0#0 (copy)" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "values%0#0", - "maybe_value%0#0", - "values%0#0 (copy)" - ] - }, - "2624": { - "op": "<=", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "tmp%6#0", - "values%0#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "values%0#0", - "tmp%6#0" - ] - }, - "2625": { - "error": "Invalid secondary market opening date", - "op": "assert // Invalid secondary market opening date", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "values%0#0" - ] - }, - "2626": { - "op": "bytec 18 // \"secondary_market_opening_date\"", - "defined_out": [ - "\"secondary_market_opening_date\"", - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "values%0#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "values%0#0", - "\"secondary_market_opening_date\"" - ] - }, - "2628": { - "op": "swap", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "\"secondary_market_opening_date\"", - "values%0#0" - ] - }, - "2629": { - "op": "app_global_put", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0" - ] - }, - "2630": { - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "0" - ] - }, - "2631": { - "op": "bytec 5 // \"maturity_date\"", - "defined_out": [ - "\"maturity_date\"", - "0", - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "0", - "\"maturity_date\"" - ] - }, - "2633": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "maybe_exists%1#0", - "maybe_value%1#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "2634": { - "error": "check self.maturity_date exists", - "op": "assert // check self.maturity_date exists", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%1#0" - ] - }, - "2635": { - "op": "bz set_secondary_time_events_after_if_else@5", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0" - ] - }, - "2638": { - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "0" - ] - }, - "2639": { - "op": "bytec 5 // \"maturity_date\"", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "0", - "\"maturity_date\"" - ] - }, - "2641": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "maybe_exists%2#0", - "maybe_value%2#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%2#0", - "maybe_exists%2#0" - ] - }, - "2642": { - "error": "check self.maturity_date exists", - "op": "assert // check self.maturity_date exists", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%2#0" - ] - }, - "2643": { - "op": "dig 1", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%2#0", - "secondary_market_time_events#0" - ] - }, - "2645": { - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%2#0", - "secondary_market_time_events#0", - "0" - ] - }, - "2646": { - "error": "invalid array length header", - "op": "extract_uint16 // on error: invalid array length header", - "defined_out": [ - "aggregate%array_length%3#0", - "aggregate%array_trimmed%0#0", - "maybe_value%2#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%2#0", - "aggregate%array_length%3#0" - ] - }, - "2647": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "aggregate%array_length%3#0", - "aggregate%array_trimmed%0#0", - "maybe_value%2#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%2#0", - "aggregate%array_length%3#0", - "1" - ] - }, - "2648": { - "op": "-", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "maybe_value%2#0", - "secondary_market_time_events#0", - "tmp%9#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%2#0", - "tmp%9#0" - ] - }, - "2649": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "aggregate%array_trimmed%0#0", - "maybe_value%2#0", - "secondary_market_time_events#0", - "tmp%9#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%2#0", - "tmp%9#0", - "8" - ] - }, - "2650": { - "op": "*", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "aggregate%bytes_offset%1#0", - "maybe_value%2#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%2#0", - "aggregate%bytes_offset%1#0" - ] - }, - "2651": { - "op": "dig 3", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%2#0", - "aggregate%bytes_offset%1#0", - "aggregate%array_trimmed%0#0" - ] - }, - "2653": { - "op": "swap", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%2#0", - "aggregate%array_trimmed%0#0", - "aggregate%bytes_offset%1#0" - ] - }, - "2654": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "maybe_value%2#0", - "secondary_market_time_events#0", - "values%2#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%2#0", - "values%2#0" - ] - }, - "2655": { - "op": "swap", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "values%2#0", - "maybe_value%2#0" - ] - }, - "2656": { - "op": "dig 1", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "maybe_value%2#0", - "secondary_market_time_events#0", - "values%2#0", - "values%2#0 (copy)" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "values%2#0", - "maybe_value%2#0", - "values%2#0 (copy)" - ] - }, - "2658": { - "op": ">=", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "tmp%10#0", - "values%2#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "values%2#0", - "tmp%10#0" - ] - }, - "2659": { - "error": "Invalid secondary market closure date", - "op": "assert // Invalid secondary market closure date", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "values%2#0" - ] - }, - "2660": { - "op": "bytec 11 // \"secondary_market_closure_date\"", - "defined_out": [ - "\"secondary_market_closure_date\"", - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "values%2#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "values%2#0", - "\"secondary_market_closure_date\"" - ] - }, - "2662": { - "op": "swap", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "\"secondary_market_closure_date\"", - "values%2#0" - ] - }, - "2663": { - "op": "app_global_put", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0" - ] - }, - "2664": { - "block": "set_secondary_time_events_after_if_else@5", - "stack_in": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "0" - ] - }, - "2665": { - "op": "bytec 18 // \"secondary_market_opening_date\"", - "defined_out": [ - "\"secondary_market_opening_date\"", - "0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "0", - "\"secondary_market_opening_date\"" - ] - }, - "2667": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%3#0", - "maybe_value%3#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%3#0", - "maybe_exists%3#0" - ] - }, - "2668": { - "error": "check self.secondary_market_opening_date exists", - "op": "assert // check self.secondary_market_opening_date exists", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%3#0" - ] - }, - "2669": { - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%3#0", - "0" - ] - }, - "2670": { - "op": "bytec 11 // \"secondary_market_closure_date\"", - "defined_out": [ - "\"secondary_market_closure_date\"", - "0", - "maybe_value%3#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%3#0", - "0", - "\"secondary_market_closure_date\"" - ] - }, - "2672": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%4#0", - "maybe_value%3#0", - "maybe_value%4#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%3#0", - "maybe_value%4#0", - "maybe_exists%4#0" - ] - }, - "2673": { - "error": "check self.secondary_market_closure_date exists", - "op": "assert // check self.secondary_market_closure_date exists", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%3#0", - "maybe_value%4#0" - ] - }, - "2674": { - "op": "swap", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%4#0", - "maybe_value%3#0" - ] - }, - "2675": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "maybe_value%4#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%4#0", - "aggregate%val_as_bytes%0#0" - ] - }, - "2676": { - "op": "swap", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%val_as_bytes%0#0", - "maybe_value%4#0" - ] - }, - "2677": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0" - ] - }, - "2678": { - "op": "concat", - "defined_out": [ - "aggregate%head%1#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%head%1#0" - ] - }, - "2679": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%head%1#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%head%1#0", - "0x151f7c75" - ] - }, - "2680": { - "op": "swap", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "0x151f7c75", - "aggregate%head%1#0" - ] - }, - "2681": { - "op": "concat", - "defined_out": [ - "tmp%2#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "tmp%2#0" - ] - }, - "2682": { - "op": "log", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0" - ] - }, - "2683": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "1" - ] - }, - "2684": { - "op": "return", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0" - ] - }, - "2685": { - "subroutine": "modules.core_financial.common.CoreFinancialCommonMixin.set_default_status[routing]", - "params": {}, - "block": "set_default_status", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "2688": { - "op": "dup", - "defined_out": [ - "tmp%0#0", - "tmp%0#0 (copy)" - ], - "stack_out": [ - "tmp%0#0", - "tmp%0#0 (copy)" - ] - }, - "2689": { - "op": "len", - "defined_out": [ - "len%0#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "len%0#0" - ] - }, - "2690": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "len%0#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "len%0#0", - "1" - ] - }, - "2691": { - "op": "==", - "defined_out": [ - "eq%0#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "eq%0#0" - ] - }, - "2692": { - "error": "invalid number of bytes for arc4.bool", - "op": "assert // invalid number of bytes for arc4.bool", - "stack_out": [ - "tmp%0#0" - ] - }, - "2693": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "0" - ] - }, - "2694": { - "op": "getbit", - "defined_out": [ - "defaulted#0" - ], - "stack_out": [ - "defaulted#0" - ] - }, - "2695": { - "op": "bytec 20 // 0x52363023", - "defined_out": [ - "0x52363023", - "defaulted#0" - ], - "stack_out": [ - "defaulted#0", - "0x52363023" - ] - }, - "2697": { - "op": "txn Sender", - "defined_out": [ - "0x52363023", - "defaulted#0", - "tmp%0#2" - ], - "stack_out": [ - "defaulted#0", - "0x52363023", - "tmp%0#2" - ] - }, - "2699": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "defaulted#0", - "tmp%1#0" - ], - "stack_out": [ - "defaulted#0", - "tmp%1#0" - ] - }, - "2702": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "defaulted#0" - ] - }, - "2703": { - "op": "bytec 24 // \"asset_defaulted\"", - "defined_out": [ - "\"asset_defaulted\"", - "defaulted#0" - ], - "stack_out": [ - "defaulted#0", - "\"asset_defaulted\"" - ] - }, - "2705": { - "op": "swap", - "stack_out": [ - "\"asset_defaulted\"", - "defaulted#0" - ] - }, - "2706": { - "op": "app_global_put", - "stack_out": [] - }, - "2707": { - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1" - ] - }, - "2709": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0" - ] - }, - "2710": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0", - "0x151f7c75" - ] - }, - "2711": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ] - }, - "2712": { - "op": "concat", - "defined_out": [ - "tmp%4#0" - ], - "stack_out": [ - "tmp%4#0" - ] - }, - "2713": { - "op": "log", - "stack_out": [] - }, - "2714": { - "op": "intc_1 // 1", - "stack_out": [ - "1" - ] - }, - "2715": { - "op": "return", - "stack_out": [] - }, - "2716": { - "subroutine": "modules.core_financial.common.CoreFinancialCommonMixin.primary_distribution[routing]", - "params": {}, - "block": "primary_distribution", - "stack_in": [], - "op": "pushbytes \"\"", - "stack_out": [ - "awst_tmp%0#0" - ] - }, - "2718": { - "op": "txna ApplicationArgs 1" - }, - "2721": { - "op": "dup", - "defined_out": [ - "holding_address#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "holding_address#0" - ] - }, - "2722": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "len%0#0" - ] - }, - "2723": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "len%0#0", - "32" - ] - }, - "2724": { - "op": "==", - "defined_out": [ - "eq%0#0", - "holding_address#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "eq%0#0" - ] - }, - "2725": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0" - ] - }, - "2726": { - "op": "txna ApplicationArgs 2", - "defined_out": [ - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "tmp%2#0" - ] - }, - "2729": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ] - }, - "2730": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%1#0", - "tmp%2#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "tmp%2#0", - "len%1#0" - ] - }, - "2731": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "holding_address#0", - "len%1#0", - "tmp%2#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "tmp%2#0", - "len%1#0", - "8" - ] - }, - "2732": { - "op": "==", - "defined_out": [ - "eq%1#0", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "tmp%2#0", - "eq%1#0" - ] - }, - "2733": { - "error": "invalid number of bytes for arc4.uint64", - "op": "assert // invalid number of bytes for arc4.uint64", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "tmp%2#0" - ] - }, - "2734": { - "op": "btoi", - "defined_out": [ - "holding_address#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0" - ] - }, - "2735": { - "op": "intc_0 // 0", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "0" - ] - }, - "2736": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"", - "0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "0", - "\"status\"" - ] - }, - "2737": { - "op": "app_global_get_ex", - "defined_out": [ - "holding_address#0", - "maybe_exists%0#0", - "maybe_value%0#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2738": { - "error": "check self.status exists", - "op": "assert // check self.status exists", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "maybe_value%0#0" - ] - }, - "2739": { - "op": "pushint 100", - "defined_out": [ - "100", - "holding_address#0", - "maybe_value%0#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "maybe_value%0#0", - "100" - ] - }, - "2741": { - "op": "==", - "defined_out": [ - "holding_address#0", - "tmp%0#4", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%0#4" - ] - }, - "2742": { - "op": "bz primary_distribution_bool_false@5", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0" - ] - }, - "2745": { - "op": "intc_0 // 0", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "0" - ] - }, - "2746": { - "op": "bytec 10 // \"primary_distribution_opening_date\"", - "defined_out": [ - "\"primary_distribution_opening_date\"", - "0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "0", - "\"primary_distribution_opening_date\"" - ] - }, - "2748": { - "op": "app_global_get_ex", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2749": { - "error": "check self.primary_distribution_opening_date exists", - "op": "assert // check self.primary_distribution_opening_date exists", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "maybe_value%0#0" - ] - }, - "2750": { - "op": "global LatestTimestamp" - }, - "2752": { - "op": "dup", - "defined_out": [ - "awst_tmp%0#0", - "holding_address#0", - "maybe_value%0#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "maybe_value%0#0", - "awst_tmp%0#0", - "awst_tmp%0#0" - ] - }, - "2753": { - "op": "bury 5", - "defined_out": [ - "awst_tmp%0#0", - "holding_address#0", - "maybe_value%0#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "maybe_value%0#0", - "awst_tmp%0#0" - ] - }, - "2755": { - "op": "<=", - "defined_out": [ - "awst_tmp%0#0", - "holding_address#0", - "tmp%1#2", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%1#2" - ] - }, - "2756": { - "op": "bz primary_distribution_bool_false@5", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0" - ] - }, - "2759": { - "op": "intc_0 // 0", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "0" - ] - }, - "2760": { - "op": "bytec 27 // \"primary_distribution_closure_date\"", - "defined_out": [ - "\"primary_distribution_closure_date\"", - "0", - "awst_tmp%0#0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "0", - "\"primary_distribution_closure_date\"" - ] - }, - "2762": { - "op": "app_global_get_ex", - "defined_out": [ - "awst_tmp%0#0", - "holding_address#0", - "maybe_exists%1#0", - "maybe_value%1#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "2763": { - "error": "check self.primary_distribution_closure_date exists", - "op": "assert // check self.primary_distribution_closure_date exists", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "maybe_value%1#0" - ] - }, - "2764": { - "op": "dig 3", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "maybe_value%1#0", - "awst_tmp%0#0" - ] - }, - "2766": { - "op": ">", - "defined_out": [ - "awst_tmp%0#0", - "holding_address#0", - "tmp%2#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%2#1" - ] - }, - "2767": { - "op": "bz primary_distribution_bool_false@5", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0" - ] - }, - "2770": { - "op": "intc_1 // 1", - "defined_out": [ - "and_result%0#0", - "awst_tmp%0#0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "and_result%0#0" - ] - }, - "2771": { - "error": "Primary distribution is closed", - "block": "primary_distribution_bool_merge@6", - "stack_in": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "and_result%0#0" - ], - "op": "assert // Primary distribution is closed", - "defined_out": [], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0" - ] - }, - "2772": { - "op": "bytec 21 // 0x52353023", - "defined_out": [ - "0x52353023" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "0x52353023" - ] - }, - "2774": { - "op": "txn Sender", - "defined_out": [ - "0x52353023", - "tmp%0#3" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "0x52353023", - "tmp%0#3" - ] - }, - "2776": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "tmp%1#2" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%1#2" - ] - }, - "2779": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0" - ] - }, - "2780": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "0x52333023" - ] - }, - "2781": { - "op": "dig 2", - "defined_out": [ - "0x52333023", - "holding_address#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "0x52333023", - "holding_address#0" - ] - }, - "2783": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1" - ] - }, - "2784": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "holding_address#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "2785": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "holding_address#0", - "maybe_exists%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "2786": { - "op": "bury 1", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "2788": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1" - ] - }, - "2789": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "op": "callsub assert_is_not_asset_defaulted" - }, - "2792": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_suspended", - "op": "callsub assert_is_not_asset_suspended" - }, - "2795": { - "op": "dig 1", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0" - ] - }, - "2797": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "units#0", - "units#0 (copy)" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "units#0 (copy)" - ] - }, - "2798": { - "error": "Can not distribute zero units", - "op": "assert // Can not distribute zero units", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0" - ] - }, - "2799": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "box_prefixed_key%0#1", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "0" - ] - }, - "2800": { - "op": "bytec_3 // \"circulating_units\"", - "defined_out": [ - "\"circulating_units\"", - "0", - "box_prefixed_key%0#1", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "0", - "\"circulating_units\"" - ] - }, - "2801": { - "op": "app_global_get_ex", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "maybe_exists%0#0", - "maybe_value%0#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2802": { - "error": "check self.circulating_units exists", - "op": "assert // check self.circulating_units exists", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "maybe_value%0#0" - ] - }, - "2803": { - "op": "dig 1", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "maybe_value%0#0", - "units#0 (copy)" - ] - }, - "2805": { - "op": "+", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1" - ] - }, - "2806": { - "op": "intc_0 // 0", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "0" - ] - }, - "2807": { - "op": "bytec 15 // \"total_units\"", - "defined_out": [ - "\"total_units\"", - "0", - "box_prefixed_key%0#1", - "holding_address#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "0", - "\"total_units\"" - ] - }, - "2809": { - "op": "app_global_get_ex", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "maybe_exists%1#0", - "maybe_value%1#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "2810": { - "error": "check self.total_units exists", - "op": "assert // check self.total_units exists", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "maybe_value%1#0" - ] - }, - "2811": { - "op": "dig 1", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "maybe_value%1#0", - "tmp%1#1", - "tmp%1#1 (copy)", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "maybe_value%1#0", - "tmp%1#1 (copy)" - ] - }, - "2813": { - "op": ">=", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "tmp%1#1", - "tmp%2#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "tmp%2#1" - ] - }, - "2814": { - "error": "Insufficient remaining D-ASA units", - "op": "assert // Insufficient remaining D-ASA units", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1" - ] - }, - "2815": { - "op": "bytec_3 // \"circulating_units\"", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "\"circulating_units\"" - ] - }, - "2816": { - "op": "dig 1", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "\"circulating_units\"", - "tmp%1#1 (copy)" - ] - }, - "2818": { - "op": "app_global_put", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1" - ] - }, - "2819": { - "op": "dig 2", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "2821": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0", - "box_prefixed_key%0#1", - "holding_address#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "2822": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "aggregate%box_get%0#0" - ] - }, - "2823": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "aggregate%box_get%0#0", - "box_prefixed_key%0#1", - "holding_address#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "aggregate%box_get%0#0", - "32" - ] - }, - "2824": { - "op": "extract_uint64", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "tmp%1#1", - "units#0", - "values%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "values%0#0" - ] - }, - "2825": { - "op": "uncover 2", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "tmp%1#1", - "values%0#0", - "units#0" - ] - }, - "2827": { - "op": "+", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "tmp%1#1", - "tmp%4#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "tmp%1#1", - "tmp%4#1" - ] - }, - "2828": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#1", - "holding_address#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "tmp%1#1", - "aggregate%val_as_bytes%0#0" - ] - }, - "2829": { - "op": "dig 2", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "tmp%1#1", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#1 (copy)" - ] - }, - "2831": { - "op": "intc_2 // 32", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "tmp%1#1", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#1 (copy)", - "32" - ] - }, - "2832": { - "op": "uncover 2", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "tmp%1#1", - "box_prefixed_key%0#1 (copy)", - "32", - "aggregate%val_as_bytes%0#0" - ] - }, - "2834": { - "op": "box_replace", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "tmp%1#1" - ] - }, - "2835": { - "op": "intc_0 // 0", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "tmp%1#1", - "0" - ] - }, - "2836": { - "op": "bytec 6 // \"unit_value\"", - "defined_out": [ - "\"unit_value\"", - "0", - "box_prefixed_key%0#1", - "holding_address#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "tmp%1#1", - "0", - "\"unit_value\"" - ] - }, - "2838": { - "op": "app_global_get_ex", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "maybe_exists%3#0", - "maybe_value%3#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "tmp%1#1", - "maybe_value%3#0", - "maybe_exists%3#0" - ] - }, - "2839": { - "error": "check self.unit_value exists", - "op": "assert // check self.unit_value exists", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "tmp%1#1", - "maybe_value%3#0" - ] - }, - "2840": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#1", - "holding_address#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "tmp%1#1", - "aggregate%val_as_bytes%1#0" - ] - }, - "2841": { - "op": "uncover 2", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%1#1", - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#1" - ] - }, - "2843": { - "op": "pushint 40", - "defined_out": [ - "40", - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#1", - "holding_address#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%1#1", - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#1", - "40" - ] - }, - "2845": { - "op": "uncover 2", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%1#1", - "box_prefixed_key%0#1", - "40", - "aggregate%val_as_bytes%1#0" - ] - }, - "2847": { - "op": "box_replace", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%1#1" - ] - }, - "2848": { - "op": "intc_0 // 0", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%1#1", - "0" - ] - }, - "2849": { - "op": "bytec 15 // \"total_units\"", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%1#1", - "0", - "\"total_units\"" - ] - }, - "2851": { - "op": "app_global_get_ex", - "defined_out": [ - "holding_address#0", - "maybe_exists%4#0", - "maybe_value%4#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%1#1", - "maybe_value%4#0", - "maybe_exists%4#0" - ] - }, - "2852": { - "error": "check self.total_units exists", - "op": "assert // check self.total_units exists", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%1#1", - "maybe_value%4#0" - ] - }, - "2853": { - "op": "swap", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "maybe_value%4#0", - "tmp%1#1" - ] - }, - "2854": { - "op": "-", - "defined_out": [ - "holding_address#0", - "tmp%5#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%5#1" - ] - }, - "2855": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%2#0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "aggregate%val_as_bytes%2#0" - ] - }, - "2856": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%2#0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "aggregate%val_as_bytes%2#0", - "0x151f7c75" - ] - }, - "2857": { - "op": "swap", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "0x151f7c75", - "aggregate%val_as_bytes%2#0" - ] - }, - "2858": { - "op": "concat", - "defined_out": [ - "holding_address#0", - "tmp%6#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%6#0" - ] - }, - "2859": { - "op": "log", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0" - ] - }, - "2860": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "1" - ] - }, - "2861": { - "op": "return", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0" - ] - }, - "2862": { - "block": "primary_distribution_bool_false@5", - "stack_in": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "and_result%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "and_result%0#0" - ] - }, - "2863": { - "op": "b primary_distribution_bool_merge@6" - }, - "2866": { - "subroutine": "modules.core_financial.common.CoreFinancialCommonMixin.get_asset_info[routing]", - "params": {}, - "block": "get_asset_info", - "stack_in": [], - "op": "intc_0 // 0" - }, - "2867": { - "op": "global LatestTimestamp" - }, - "2869": { - "op": "intc_0 // 0" - }, - "2870": { - "op": "bytec 5 // \"maturity_date\"", - "defined_out": [ - "\"maturity_date\"", - "0", - "performance#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "tmp%0#1", - "0", - "\"maturity_date\"" - ] - }, - "2872": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0", - "performance#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "tmp%0#1", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2873": { - "op": "swap", - "stack_out": [ - "performance#0", - "tmp%0#1", - "maybe_exists%0#0", - "maybe_value%0#0" - ] - }, - "2874": { - "op": "dup", - "stack_out": [ - "performance#0", - "tmp%0#1", - "maybe_exists%0#0", - "maybe_value%0#0", - "maybe_value%0#0 (copy)" - ] - }, - "2875": { - "op": "cover 2", - "stack_out": [ - "performance#0", - "tmp%0#1", - "maybe_value%0#0", - "maybe_exists%0#0", - "maybe_value%0#0" - ] - }, - "2877": { - "op": "cover 3", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0", - "performance#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "tmp%0#1", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2879": { - "error": "check self.maturity_date exists", - "op": "assert // check self.maturity_date exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "tmp%0#1", - "maybe_value%0#0" - ] - }, - "2880": { - "op": ">", - "defined_out": [ - "maybe_value%0#0", - "performance#0", - "tmp%1#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "tmp%1#1" - ] - }, - "2881": { - "op": "bz get_asset_info_after_if_else@4", - "stack_out": [ - "performance#0", - "maybe_value%0#0" - ] - }, - "2884": { - "op": "dup", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0" - ] - }, - "2885": { - "op": "bz get_asset_info_after_if_else@4", - "stack_out": [ - "performance#0", - "maybe_value%0#0" - ] - }, - "2888": { - "op": "pushint 4", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#0" - ] - }, - "2890": { - "op": "bury 2", - "stack_out": [ - "performance#0", - "maybe_value%0#0" - ] - }, - "2892": { - "block": "get_asset_info_after_if_else@4", - "stack_in": [ - "performance#0", - "maybe_value%0#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "0" - ] - }, - "2893": { - "op": "bytec 24 // \"asset_defaulted\"", - "defined_out": [ - "\"asset_defaulted\"", - "0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "0", - "\"asset_defaulted\"" - ] - }, - "2895": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%1#0", - "maybe_value%1#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "2896": { - "error": "check self.asset_defaulted exists", - "op": "assert // check self.asset_defaulted exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%1#0" - ] - }, - "2897": { - "op": "bz get_asset_info_after_if_else@6", - "stack_out": [ - "performance#0", - "maybe_value%0#0" - ] - }, - "2900": { - "op": "pushint 3", - "defined_out": [ - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#0" - ] - }, - "2902": { - "op": "bury 2", - "defined_out": [ - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0" - ] - }, - "2904": { - "block": "get_asset_info_after_if_else@6", - "stack_in": [ - "performance#0", - "maybe_value%0#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "0" - ] - }, - "2905": { - "op": "bytec 16 // \"denomination_asset_id\"", - "defined_out": [ - "\"denomination_asset_id\"", - "0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "0", - "\"denomination_asset_id\"" - ] - }, - "2907": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%2#0", - "maybe_value%2#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_exists%2#0" - ] - }, - "2908": { - "error": "check self.denomination_asset_id exists", - "op": "assert // check self.denomination_asset_id exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0" - ] - }, - "2909": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "0" - ] - }, - "2910": { - "op": "bytec 9 // \"settlement_asset_id\"", - "defined_out": [ - "\"settlement_asset_id\"", - "0", - "maybe_value%2#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "0", - "\"settlement_asset_id\"" - ] - }, - "2912": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%3#0", - "maybe_value%2#0", - "maybe_value%3#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_exists%3#0" - ] - }, - "2913": { - "error": "check self.settlement_asset_id exists", - "op": "assert // check self.settlement_asset_id exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0" - ] - }, - "2914": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "0" - ] - }, - "2915": { - "op": "bytec_3 // \"circulating_units\"", - "defined_out": [ - "\"circulating_units\"", - "0", - "maybe_value%2#0", - "maybe_value%3#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "0", - "\"circulating_units\"" - ] - }, - "2916": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2917": { - "error": "check self.circulating_units exists", - "op": "assert // check self.circulating_units exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0" - ] - }, - "2918": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "0" - ] - }, - "2919": { - "op": "bytec 6 // \"unit_value\"", - "defined_out": [ - "\"unit_value\"", - "0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "0", - "\"unit_value\"" - ] - }, - "2921": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%1#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "2922": { - "error": "check self.unit_value exists", - "op": "assert // check self.unit_value exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0" - ] - }, - "2923": { - "op": "dup2", - "defined_out": [ - "maybe_value%0#0", - "maybe_value%0#0 (copy)", - "maybe_value%1#0", - "maybe_value%1#0 (copy)", - "maybe_value%2#0", - "maybe_value%3#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%0#0 (copy)", - "maybe_value%1#0 (copy)" - ] - }, - "2924": { - "op": "*", - "defined_out": [ - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1" - ] - }, - "2925": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "0" - ] - }, - "2926": { - "op": "bytec 17 // \"day_count_convention\"", - "defined_out": [ - "\"day_count_convention\"", - "0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "0", - "\"day_count_convention\"" - ] - }, - "2928": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%5#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%5#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "maybe_value%5#0", - "maybe_exists%5#0" - ] - }, - "2929": { - "error": "check self.day_count_convention exists", - "op": "assert // check self.day_count_convention exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "maybe_value%5#0" - ] - }, - "2930": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%val_as_bytes%0#0" - ] - }, - "2931": { - "op": "dup", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%0#0 (copy)", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%0#0 (copy)" - ] - }, - "2932": { - "op": "bitlen", - "defined_out": [ - "aggregate%bitlen%0#0", - "aggregate%val_as_bytes%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%val_as_bytes%0#0", - "aggregate%bitlen%0#0" - ] - }, - "2933": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "aggregate%bitlen%0#0", - "aggregate%val_as_bytes%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%val_as_bytes%0#0", - "aggregate%bitlen%0#0", - "8" - ] - }, - "2934": { - "op": "<=", - "defined_out": [ - "aggregate%no_overflow%0#0", - "aggregate%val_as_bytes%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%val_as_bytes%0#0", - "aggregate%no_overflow%0#0" - ] - }, - "2935": { - "error": "overflow", - "op": "assert // overflow", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%val_as_bytes%0#0" - ] - }, - "2936": { - "op": "extract 7 1", - "defined_out": [ - "aggregate%uint8%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0" - ] - }, - "2939": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "0" - ] - }, - "2940": { - "op": "bytec 26 // \"principal_discount\"", - "defined_out": [ - "\"principal_discount\"", - "0", - "aggregate%uint8%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "0", - "\"principal_discount\"" - ] - }, - "2942": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%uint8%0#0", - "maybe_exists%6#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%6#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "maybe_value%6#0", - "maybe_exists%6#0" - ] - }, - "2943": { - "error": "check self.principal_discount exists", - "op": "assert // check self.principal_discount exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "maybe_value%6#0" - ] - }, - "2944": { - "op": "itob", - "defined_out": [ - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%1#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%1#0" - ] - }, - "2945": { - "op": "dup", - "defined_out": [ - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%1#0", - "aggregate%val_as_bytes%1#0 (copy)", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%1#0", - "aggregate%val_as_bytes%1#0 (copy)" - ] - }, - "2946": { - "op": "bitlen", - "defined_out": [ - "aggregate%bitlen%1#0", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%1#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%1#0", - "aggregate%bitlen%1#0" - ] - }, - "2947": { - "op": "pushint 16", - "defined_out": [ - "16", - "aggregate%bitlen%1#0", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%1#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%1#0", - "aggregate%bitlen%1#0", - "16" - ] - }, - "2949": { - "op": "<=", - "defined_out": [ - "aggregate%no_overflow%1#0", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%1#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%1#0", - "aggregate%no_overflow%1#0" - ] - }, - "2950": { - "error": "overflow", - "op": "assert // overflow", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%1#0" - ] - }, - "2951": { - "op": "extract 6 2", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint8%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0" - ] - }, - "2954": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "0" - ] - }, - "2955": { - "op": "bytec 33 // \"interest_rate\"", - "defined_out": [ - "\"interest_rate\"", - "0", - "aggregate%uint16%0#0", - "aggregate%uint8%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "0", - "\"interest_rate\"" - ] - }, - "2957": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint8%0#0", - "maybe_exists%7#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%7#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "maybe_value%7#0", - "maybe_exists%7#0" - ] - }, - "2958": { - "error": "check self.interest_rate exists", - "op": "assert // check self.interest_rate exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "maybe_value%7#0" - ] - }, - "2959": { - "op": "itob", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%2#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%val_as_bytes%2#0" - ] - }, - "2960": { - "op": "dup", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%2#0", - "aggregate%val_as_bytes%2#0 (copy)", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%val_as_bytes%2#0", - "aggregate%val_as_bytes%2#0 (copy)" - ] - }, - "2961": { - "op": "bitlen", - "defined_out": [ - "aggregate%bitlen%2#0", - "aggregate%uint16%0#0", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%2#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%val_as_bytes%2#0", - "aggregate%bitlen%2#0" - ] - }, - "2962": { - "op": "pushint 16", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%val_as_bytes%2#0", - "aggregate%bitlen%2#0", - "16" - ] - }, - "2964": { - "op": "<=", - "defined_out": [ - "aggregate%no_overflow%2#0", - "aggregate%uint16%0#0", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%2#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%val_as_bytes%2#0", - "aggregate%no_overflow%2#0" - ] - }, - "2965": { - "error": "overflow", - "op": "assert // overflow", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%val_as_bytes%2#0" - ] - }, - "2966": { - "op": "extract 6 2", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0" - ] - }, - "2969": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "0" - ] - }, - "2970": { - "op": "bytec 15 // \"total_units\"", - "defined_out": [ - "\"total_units\"", - "0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "0", - "\"total_units\"" - ] - }, - "2972": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_exists%8#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_exists%8#0" - ] - }, - "2973": { - "error": "check self.total_units exists", - "op": "assert // check self.total_units exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0" - ] - }, - "2974": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "0" - ] - }, - "2975": { - "op": "bytec 10 // \"primary_distribution_opening_date\"", - "defined_out": [ - "\"primary_distribution_opening_date\"", - "0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "0", - "\"primary_distribution_opening_date\"" - ] - }, - "2977": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_exists%10#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_exists%10#0" - ] - }, - "2978": { - "error": "check self.primary_distribution_opening_date exists", - "op": "assert // check self.primary_distribution_opening_date exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0" - ] - }, - "2979": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "0" - ] - }, - "2980": { - "op": "bytec 27 // \"primary_distribution_closure_date\"", - "defined_out": [ - "\"primary_distribution_closure_date\"", - "0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "0", - "\"primary_distribution_closure_date\"" - ] - }, - "2982": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_exists%11#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_exists%11#0" - ] - }, - "2983": { - "error": "check self.primary_distribution_closure_date exists", - "op": "assert // check self.primary_distribution_closure_date exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0" - ] - }, - "2984": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "0" - ] - }, - "2985": { - "op": "bytec 4 // \"issuance_date\"", - "defined_out": [ - "\"issuance_date\"", - "0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "0", - "\"issuance_date\"" - ] - }, - "2987": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_exists%12#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_exists%12#0" - ] - }, - "2988": { - "error": "check self.issuance_date exists", - "op": "assert // check self.issuance_date exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0" - ] - }, - "2989": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "0" - ] - }, - "2990": { - "op": "bytec 5 // \"maturity_date\"", - "defined_out": [ - "\"maturity_date\"", - "0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "0", - "\"maturity_date\"" - ] - }, - "2992": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_exists%13#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_exists%13#0" - ] - }, - "2993": { - "error": "check self.maturity_date exists", - "op": "assert // check self.maturity_date exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0" - ] - }, - "2994": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "0" - ] - }, - "2995": { - "op": "bytec 23 // \"asset_suspended\"", - "defined_out": [ - "\"asset_suspended\"", - "0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "0", - "\"asset_suspended\"" - ] - }, - "2997": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_exists%14#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_exists%14#0" - ] - }, - "2998": { - "error": "check self.asset_suspended exists", - "op": "assert // check self.asset_suspended exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0" - ] - }, - "2999": { - "op": "dig 15", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "performance#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "performance#0" - ] - }, - "3001": { - "op": "itob", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "performance#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%val_as_bytes%3#0" - ] - }, - "3002": { - "op": "dup", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%3#0", - "aggregate%val_as_bytes%3#0 (copy)", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "performance#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%val_as_bytes%3#0", - "aggregate%val_as_bytes%3#0 (copy)" - ] - }, - "3003": { - "op": "bitlen", - "defined_out": [ - "aggregate%bitlen%3#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "performance#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%val_as_bytes%3#0", - "aggregate%bitlen%3#0" - ] - }, - "3004": { - "op": "intc_3 // 8", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%val_as_bytes%3#0", - "aggregate%bitlen%3#0", - "8" - ] - }, - "3005": { - "op": "<=", - "defined_out": [ - "aggregate%no_overflow%3#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "performance#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%val_as_bytes%3#0", - "aggregate%no_overflow%3#0" - ] - }, - "3006": { - "error": "overflow", - "op": "assert // overflow", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%val_as_bytes%3#0" - ] - }, - "3007": { - "op": "extract 7 1", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "performance#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0" - ] - }, - "3010": { - "op": "uncover 14", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "maybe_value%2#0" - ] - }, - "3012": { - "op": "itob", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%4#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%3#0", - "maybe_value%8#0", - "performance#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%4#0" - ] - }, - "3013": { - "op": "uncover 14", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%4#0", - "maybe_value%3#0" - ] - }, - "3015": { - "op": "itob", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%4#0", - "aggregate%val_as_bytes%5#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%8#0", - "performance#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%4#0", - "aggregate%val_as_bytes%5#0" - ] - }, - "3016": { - "op": "concat", - "defined_out": [ - "aggregate%head%1#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%8#0", - "performance#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%1#0" - ] - }, - "3017": { - "op": "uncover 11", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%1#0", - "tmp%0#1" - ] - }, - "3019": { - "op": "itob", - "defined_out": [ - "aggregate%head%1#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%6#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%8#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%1#0", - "aggregate%val_as_bytes%6#0" - ] - }, - "3020": { - "op": "concat", - "defined_out": [ - "aggregate%head%2#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%8#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%2#0" - ] - }, - "3021": { - "op": "uncover 11", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%2#0", - "maybe_value%1#0" - ] - }, - "3023": { - "op": "itob", - "defined_out": [ - "aggregate%head%2#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%7#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%8#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%2#0", - "aggregate%val_as_bytes%7#0" - ] - }, - "3024": { - "op": "concat", - "defined_out": [ - "aggregate%head%3#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%8#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%3#0" - ] - }, - "3025": { - "op": "uncover 10", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%3#0", - "aggregate%uint8%0#0" - ] - }, - "3027": { - "op": "concat", - "defined_out": [ - "aggregate%head%4#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%8#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%4#0" - ] - }, - "3028": { - "op": "uncover 9", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%4#0", - "aggregate%uint16%0#0" - ] - }, - "3030": { - "op": "concat", - "defined_out": [ - "aggregate%head%5#0", - "aggregate%uint16%1#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%8#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%5#0" - ] - }, - "3031": { - "op": "uncover 8", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%5#0", - "aggregate%uint16%1#0" - ] - }, - "3033": { - "op": "concat", - "defined_out": [ - "aggregate%head%6#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%8#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%6#0" - ] - }, - "3034": { - "op": "uncover 7", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%6#0", - "maybe_value%8#0" - ] - }, - "3036": { - "op": "itob", - "defined_out": [ - "aggregate%head%6#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%8#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%6#0", - "aggregate%val_as_bytes%8#0" - ] - }, - "3037": { - "op": "concat", - "defined_out": [ - "aggregate%head%7#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%7#0" - ] - }, - "3038": { - "op": "uncover 7", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%7#0", - "maybe_value%0#0" - ] - }, - "3040": { - "op": "itob", - "defined_out": [ - "aggregate%head%7#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%9#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%7#0", - "aggregate%val_as_bytes%9#0" - ] - }, - "3041": { - "op": "concat", - "defined_out": [ - "aggregate%head%8#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%8#0" - ] - }, - "3042": { - "op": "uncover 6", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%8#0", - "maybe_value%10#0" - ] - }, - "3044": { - "op": "itob", - "defined_out": [ - "aggregate%head%8#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%10#0", - "maybe_value%0#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%8#0", - "aggregate%val_as_bytes%10#0" - ] - }, - "3045": { - "op": "concat", - "defined_out": [ - "aggregate%head%9#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%9#0" - ] - }, - "3046": { - "op": "uncover 5", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%9#0", - "maybe_value%11#0" - ] - }, - "3048": { - "op": "itob", - "defined_out": [ - "aggregate%head%9#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%11#0", - "maybe_value%0#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%9#0", - "aggregate%val_as_bytes%11#0" - ] - }, - "3049": { - "op": "concat", - "defined_out": [ - "aggregate%head%10#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%10#0" - ] - }, - "3050": { - "op": "uncover 4", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%10#0", - "maybe_value%12#0" - ] - }, - "3052": { - "op": "itob", - "defined_out": [ - "aggregate%head%10#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%12#0", - "maybe_value%0#0", - "maybe_value%13#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%10#0", - "aggregate%val_as_bytes%12#0" - ] - }, - "3053": { - "op": "concat", - "defined_out": [ - "aggregate%head%11#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%13#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%11#0" - ] - }, - "3054": { - "op": "uncover 3", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%11#0", - "maybe_value%13#0" - ] - }, - "3056": { - "op": "itob", - "defined_out": [ - "aggregate%head%11#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%13#0", - "maybe_value%0#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%11#0", - "aggregate%val_as_bytes%13#0" - ] - }, - "3057": { - "op": "concat", - "defined_out": [ - "aggregate%head%12#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%12#0" - ] - }, - "3058": { - "op": "bytec 31 // 0x00", - "defined_out": [ - "0x00", - "aggregate%head%12#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%12#0", - "0x00" - ] - }, - "3060": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%12#0", - "0x00", - "0" - ] - }, - "3061": { - "op": "uncover 4", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "aggregate%uint8%1#0", - "aggregate%head%12#0", - "0x00", - "0", - "maybe_value%14#0" - ] - }, - "3063": { - "op": "setbit", - "defined_out": [ - "aggregate%encoded_bool%0#0", - "aggregate%head%12#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "aggregate%uint8%1#0", - "aggregate%head%12#0", - "aggregate%encoded_bool%0#0" - ] - }, - "3064": { - "op": "concat", - "defined_out": [ - "aggregate%head%13#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "aggregate%uint8%1#0", - "aggregate%head%13#0" - ] - }, - "3065": { - "op": "swap", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "aggregate%head%13#0", - "aggregate%uint8%1#0" - ] - }, - "3066": { - "op": "concat", - "defined_out": [ - "aggregate%head%14#0", - "maybe_value%0#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "aggregate%head%14#0" - ] - }, - "3067": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%head%14#0", - "maybe_value%0#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "aggregate%head%14#0", - "0x151f7c75" - ] - }, - "3068": { - "op": "swap", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "0x151f7c75", - "aggregate%head%14#0" - ] - }, - "3069": { - "op": "concat", - "defined_out": [ - "maybe_value%0#0", - "performance#0", - "tmp%1#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "tmp%1#0" - ] - }, - "3070": { - "op": "log", - "stack_out": [ - "performance#0", - "maybe_value%0#0" - ] - }, - "3071": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "maybe_value%0#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "1" - ] - }, - "3072": { - "op": "return", - "stack_out": [ - "performance#0", - "maybe_value%0#0" - ] - }, - "3073": { - "subroutine": "modules.core_financial.common.CoreFinancialCommonMixin.get_time_events[routing]", - "params": {}, - "block": "get_time_events", - "stack_in": [], - "op": "bytec 30 // 0x0000" - }, - "3075": { - "op": "intc_0 // 0" - }, - "3076": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"", - "0", - "time_events#0" - ], - "stack_out": [ - "time_events#0", - "0", - "\"status\"" - ] - }, - "3077": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0", - "time_events#0" - ], - "stack_out": [ - "time_events#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "3078": { - "error": "check self.status exists", - "op": "assert // check self.status exists", - "stack_out": [ - "time_events#0", - "maybe_value%0#0" - ] - }, - "3079": { - "op": "pushint 100", - "defined_out": [ - "100", - "maybe_value%0#0", - "time_events#0" - ], - "stack_out": [ - "time_events#0", - "maybe_value%0#0", - "100" - ] - }, - "3081": { - "op": "==", - "defined_out": [ - "time_events#0", - "tmp%0#2" - ], - "stack_out": [ - "time_events#0", - "tmp%0#2" - ] - }, - "3082": { - "op": "bz get_time_events_after_if_else@3", - "stack_out": [ - "time_events#0" - ] - }, - "3085": { - "op": "bytec 12 // 0x74696d654576656e7473", - "defined_out": [ - "0x74696d654576656e7473", - "time_events#0" - ], - "stack_out": [ - "time_events#0", - "0x74696d654576656e7473" - ] - }, - "3087": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%1#0", - "time_events#0" - ], - "stack_out": [ - "time_events#0", - "time_events#0", - "aggregate%box_get%1#0" - ] - }, - "3088": { - "op": "swap", - "stack_out": [ - "time_events#0", - "aggregate%box_get%1#0", - "time_events#0" - ] - }, - "3089": { - "op": "bury 2", - "stack_out": [ - "time_events#0", - "aggregate%box_get%1#0" - ] - }, - "3091": { - "error": "check self.time_events exists", - "op": "assert // check self.time_events exists", - "stack_out": [ - "time_events#0" - ] - }, - "3092": { - "block": "get_time_events_after_if_else@3", - "stack_in": [ - "time_events#0" - ], - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75" - ], - "stack_out": [ - "time_events#0", - "0x151f7c75" - ] - }, - "3093": { - "op": "dig 1", - "defined_out": [ - "0x151f7c75", - "time_events#0" - ], - "stack_out": [ - "time_events#0", - "0x151f7c75", - "time_events#0" - ] - }, - "3095": { - "op": "concat", - "defined_out": [ - "time_events#0", - "tmp%1#0" - ], - "stack_out": [ - "time_events#0", - "tmp%1#0" - ] - }, - "3096": { - "op": "log", - "stack_out": [ - "time_events#0" - ] - }, - "3097": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "time_events#0" - ], - "stack_out": [ - "time_events#0", - "1" - ] - }, - "3098": { - "op": "return", - "stack_out": [ - "time_events#0" - ] - }, - "3099": { - "subroutine": "modules.core_financial.common.CoreFinancialCommonMixin.get_secondary_market_schedule[routing]", - "params": {}, - "block": "get_secondary_market_schedule", - "stack_in": [], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "0" - ] - }, - "3100": { - "op": "bytec 18 // \"secondary_market_opening_date\"", - "defined_out": [ - "\"secondary_market_opening_date\"", - "0" - ], - "stack_out": [ - "0", - "\"secondary_market_opening_date\"" - ] - }, - "3102": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "3103": { - "error": "check self.secondary_market_opening_date exists", - "op": "assert // check self.secondary_market_opening_date exists", - "stack_out": [ - "maybe_value%0#0" - ] - }, - "3104": { - "op": "intc_0 // 0", - "stack_out": [ - "maybe_value%0#0", - "0" - ] - }, - "3105": { - "op": "bytec 11 // \"secondary_market_closure_date\"", - "defined_out": [ - "\"secondary_market_closure_date\"", - "0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "0", - "\"secondary_market_closure_date\"" - ] - }, - "3107": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%1#0", - "maybe_value%0#0", - "maybe_value%1#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "3108": { - "error": "check self.secondary_market_closure_date exists", - "op": "assert // check self.secondary_market_closure_date exists", - "stack_out": [ - "maybe_value%0#0", - "maybe_value%1#0" - ] - }, - "3109": { - "op": "swap", - "stack_out": [ - "maybe_value%1#0", - "maybe_value%0#0" - ] - }, - "3110": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "maybe_value%1#0" - ], - "stack_out": [ - "maybe_value%1#0", - "aggregate%val_as_bytes%0#0" - ] - }, - "3111": { - "op": "pushbytes 0x0002", - "defined_out": [ - "0x0002", - "aggregate%val_as_bytes%0#0", - "maybe_value%1#0" - ], - "stack_out": [ - "maybe_value%1#0", - "aggregate%val_as_bytes%0#0", - "0x0002" - ] - }, - "3115": { - "op": "swap", - "stack_out": [ - "maybe_value%1#0", - "0x0002", - "aggregate%val_as_bytes%0#0" - ] - }, - "3116": { - "op": "concat", - "defined_out": [ - "aggregate%head%0#0", - "maybe_value%1#0" - ], - "stack_out": [ - "maybe_value%1#0", - "aggregate%head%0#0" - ] - }, - "3117": { - "op": "swap", - "stack_out": [ - "aggregate%head%0#0", - "maybe_value%1#0" - ] - }, - "3118": { - "op": "itob", - "defined_out": [ - "aggregate%head%0#0", - "aggregate%val_as_bytes%1#0" - ], - "stack_out": [ - "aggregate%head%0#0", - "aggregate%val_as_bytes%1#0" - ] - }, - "3119": { - "op": "concat", - "defined_out": [ - "aggregate%head%1#0" - ], - "stack_out": [ - "aggregate%head%1#0" - ] - }, - "3120": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%head%1#0" - ], - "stack_out": [ - "aggregate%head%1#0", - "0x151f7c75" - ] - }, - "3121": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%head%1#0" - ] - }, - "3122": { - "op": "concat", - "defined_out": [ - "tmp%1#0" - ], - "stack_out": [ - "tmp%1#0" - ] - }, - "3123": { - "op": "log", - "stack_out": [] - }, - "3124": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "3125": { - "op": "return", - "stack_out": [] - }, - "3126": { - "subroutine": "modules.core_financial.common.CoreFinancialCommonMixin.get_asset_metadata[routing]", - "params": {}, - "block": "get_asset_metadata", - "stack_in": [], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "0" - ] - }, - "3127": { - "op": "bytec 25 // \"metadata\"", - "defined_out": [ - "\"metadata\"", - "0" - ], - "stack_out": [ - "0", - "\"metadata\"" - ] - }, - "3129": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "3130": { - "error": "check self.metadata exists", - "op": "assert // check self.metadata exists", - "stack_out": [ - "maybe_value%0#0" - ] - }, - "3131": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "0x151f7c75" - ] - }, - "3132": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "maybe_value%0#0" - ] - }, - "3133": { - "op": "concat", - "defined_out": [ - "tmp%1#0" - ], - "stack_out": [ - "tmp%1#0" - ] - }, - "3134": { - "op": "log", - "stack_out": [] - }, - "3135": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "3136": { - "op": "return", - "stack_out": [] - }, - "3137": { - "subroutine": "modules.accounting.AccountingModule.account_gov_suspension[routing]", - "params": {}, - "block": "account_gov_suspension", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "holding_address#0" - ], - "stack_out": [ - "holding_address#0" - ] - }, - "3140": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ] - }, - "3141": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0" - ] - }, - "3142": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0", - "32" - ] - }, - "3143": { - "op": "==", - "defined_out": [ - "eq%0#0", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "eq%0#0" - ] - }, - "3144": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "holding_address#0" - ] - }, - "3145": { - "op": "txna ApplicationArgs 2", - "defined_out": [ - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0" - ] - }, - "3148": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ] - }, - "3149": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%1#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "len%1#0" - ] - }, - "3150": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "holding_address#0", - "len%1#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "len%1#0", - "1" - ] - }, - "3151": { - "op": "==", - "defined_out": [ - "eq%1#0", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "eq%1#0" - ] - }, - "3152": { - "error": "invalid number of bytes for arc4.bool", - "op": "assert // invalid number of bytes for arc4.bool", - "stack_out": [ - "holding_address#0", - "tmp%2#0" - ] - }, - "3153": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "0" - ] - }, - "3154": { - "op": "getbit", - "defined_out": [ - "holding_address#0", - "suspended#0" - ], - "stack_out": [ - "holding_address#0", - "suspended#0" - ] - }, - "3155": { - "op": "bytec 13 // 0x52373023", - "defined_out": [ - "0x52373023", - "holding_address#0", - "suspended#0" - ], - "stack_out": [ - "holding_address#0", - "suspended#0", - "0x52373023" - ] - }, - "3157": { - "op": "txn Sender", - "defined_out": [ - "0x52373023", - "holding_address#0", - "suspended#0", - "tmp%0#2" - ], - "stack_out": [ - "holding_address#0", - "suspended#0", - "0x52373023", - "tmp%0#2" - ] - }, - "3159": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "holding_address#0", - "suspended#0", - "tmp%1#0" - ], - "stack_out": [ - "holding_address#0", - "suspended#0", - "tmp%1#0" - ] - }, - "3162": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "holding_address#0", - "suspended#0" - ] - }, - "3163": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023", - "holding_address#0", - "suspended#0" - ], - "stack_out": [ - "holding_address#0", - "suspended#0", - "0x52333023" - ] - }, - "3164": { - "op": "uncover 2", - "stack_out": [ - "suspended#0", - "0x52333023", - "holding_address#0" - ] - }, - "3166": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "suspended#0" - ], - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1" - ] - }, - "3167": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "suspended#0" - ], - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "3168": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0", - "suspended#0" - ], - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "3169": { - "op": "bury 1", - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "3171": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1" - ] - }, - "3172": { - "op": "dup", - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "3173": { - "op": "pushint 56", - "defined_out": [ - "56", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "suspended#0" - ], - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "56" - ] - }, - "3175": { - "op": "intc_1 // 1", - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "56", - "1" - ] - }, - "3176": { - "op": "box_extract", - "defined_out": [ - "box%box_extract%0#0", - "box_prefixed_key%0#1", - "suspended#0" - ], - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1", - "box%box_extract%0#0" - ] - }, - "3177": { - "op": "intc_0 // 0", - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1", - "box%box_extract%0#0", - "0" - ] - }, - "3178": { - "op": "uncover 3", - "stack_out": [ - "box_prefixed_key%0#1", - "box%box_extract%0#0", - "0", - "suspended#0" - ] - }, - "3180": { - "op": "setbit", - "defined_out": [ - "aggregate%updated_target%0#0", - "box_prefixed_key%0#1" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "aggregate%updated_target%0#0" - ] - }, - "3181": { - "op": "pushint 56" - }, - "3183": { - "op": "swap", - "stack_out": [ - "box_prefixed_key%0#1", - "56", - "aggregate%updated_target%0#0" - ] - }, - "3184": { - "op": "box_replace", - "stack_out": [] - }, - "3185": { - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1" - ] - }, - "3187": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0" - ] - }, - "3188": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0", - "0x151f7c75" - ] - }, - "3189": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ] - }, - "3190": { - "op": "concat", - "defined_out": [ - "tmp%6#0" - ], - "stack_out": [ - "tmp%6#0" - ] - }, - "3191": { - "op": "log", - "stack_out": [] - }, - "3192": { - "op": "intc_1 // 1", - "stack_out": [ - "1" - ] - }, - "3193": { - "op": "return", - "stack_out": [] - }, - "3194": { - "subroutine": "modules.accounting.AccountingModule.account_open[routing]", - "params": {}, - "block": "account_open", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "holding_address#0" - ], - "stack_out": [ - "holding_address#0" - ] - }, - "3197": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ] - }, - "3198": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0" - ] - }, - "3199": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0", - "32" - ] - }, - "3200": { - "op": "==", - "defined_out": [ - "eq%0#0", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "eq%0#0" - ] - }, - "3201": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "holding_address#0" - ] - }, - "3202": { - "op": "txna ApplicationArgs 2", - "defined_out": [ - "holding_address#0", - "payment_address#0" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0" - ] - }, - "3205": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "payment_address#0", - "payment_address#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "payment_address#0 (copy)" - ] - }, - "3206": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%1#0", - "payment_address#0" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "len%1#0" - ] - }, - "3207": { - "op": "intc_2 // 32", - "stack_out": [ - "holding_address#0", - "payment_address#0", - "len%1#0", - "32" - ] - }, - "3208": { - "op": "==", - "defined_out": [ - "eq%1#0", - "holding_address#0", - "payment_address#0" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "eq%1#0" - ] - }, - "3209": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "holding_address#0", - "payment_address#0" - ] - }, - "3210": { - "op": "bytec 14 // 0x52343023", - "defined_out": [ - "0x52343023", - "holding_address#0", - "payment_address#0" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "0x52343023" - ] - }, - "3212": { - "op": "txn Sender", - "defined_out": [ - "0x52343023", - "holding_address#0", - "payment_address#0", - "tmp%0#2" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "0x52343023", - "tmp%0#2" - ] - }, - "3214": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "holding_address#0", - "payment_address#0", - "tmp%1#1" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "tmp%1#1" - ] - }, - "3217": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "holding_address#0", - "payment_address#0" - ] - }, - "3218": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "holding_address#0", - "payment_address#0" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "0" - ] - }, - "3219": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"", - "0", - "holding_address#0", - "payment_address#0" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "0", - "\"status\"" - ] - }, - "3220": { - "op": "app_global_get_ex", - "defined_out": [ - "holding_address#0", - "maybe_exists%0#0", - "maybe_value%0#0", - "payment_address#0" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "3221": { - "error": "check self.status exists", - "op": "assert // check self.status exists", - "stack_out": [ - "holding_address#0", - "payment_address#0", - "maybe_value%0#0" - ] - }, - "3222": { - "op": "intc 5 // 200", - "defined_out": [ - "200", - "holding_address#0", - "maybe_value%0#0", - "payment_address#0" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "maybe_value%0#0", - "200" - ] - }, - "3224": { - "op": "==", - "defined_out": [ - "holding_address#0", - "payment_address#0", - "tmp%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "tmp%0#3" - ] - }, - "3225": { - "op": "!", - "stack_out": [ - "holding_address#0", - "payment_address#0", - "tmp%1#1" - ] - }, - "3226": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "holding_address#0", - "payment_address#0" - ] - }, - "3227": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "op": "callsub assert_is_not_asset_defaulted" - }, - "3230": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_suspended", - "op": "callsub assert_is_not_asset_suspended" - }, - "3233": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023", - "holding_address#0", - "payment_address#0" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "0x52333023" - ] - }, - "3234": { - "op": "uncover 2", - "stack_out": [ - "payment_address#0", - "0x52333023", - "holding_address#0" - ] - }, - "3236": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#0", - "payment_address#0" - ], - "stack_out": [ - "payment_address#0", - "box_prefixed_key%0#0" - ] - }, - "3237": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#0", - "box_prefixed_key%0#0 (copy)", - "payment_address#0" - ], - "stack_out": [ - "payment_address#0", - "box_prefixed_key%0#0", - "box_prefixed_key%0#0 (copy)" - ] - }, - "3238": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#0", - "maybe_exists%0#0", - "payment_address#0" - ], - "stack_out": [ - "payment_address#0", - "box_prefixed_key%0#0", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "3239": { - "op": "bury 1", - "stack_out": [ - "payment_address#0", - "box_prefixed_key%0#0", - "maybe_exists%0#0" - ] - }, - "3241": { - "op": "!", - "defined_out": [ - "box_prefixed_key%0#0", - "payment_address#0", - "tmp%2#1" - ], - "stack_out": [ - "payment_address#0", - "box_prefixed_key%0#0", - "tmp%2#1" - ] - }, - "3242": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "payment_address#0", - "box_prefixed_key%0#0" - ] - }, - "3243": { - "op": "intc_0 // 0", - "stack_out": [ - "payment_address#0", - "box_prefixed_key%0#0", - "0" - ] - }, - "3244": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#0", - "payment_address#0" - ], - "stack_out": [ - "payment_address#0", - "box_prefixed_key%0#0", - "aggregate%val_as_bytes%0#0" - ] - }, - "3245": { - "op": "uncover 2", - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%val_as_bytes%0#0", - "payment_address#0" - ] - }, - "3247": { - "op": "dig 1", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%0#0 (copy)", - "box_prefixed_key%0#0", - "payment_address#0" - ], - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%val_as_bytes%0#0", - "payment_address#0", - "aggregate%val_as_bytes%0#0 (copy)" - ] - }, - "3249": { - "op": "concat", - "defined_out": [ - "aggregate%head%1#0", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%val_as_bytes%0#0", - "aggregate%head%1#0" - ] - }, - "3250": { - "op": "dig 1", - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%val_as_bytes%0#0", - "aggregate%head%1#0", - "aggregate%val_as_bytes%0#0 (copy)" - ] - }, - "3252": { - "op": "concat", - "defined_out": [ - "aggregate%head%2#0", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%val_as_bytes%0#0", - "aggregate%head%2#0" - ] - }, - "3253": { - "op": "swap", - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%head%2#0", - "aggregate%val_as_bytes%0#0" - ] - }, - "3254": { - "op": "concat", - "defined_out": [ - "aggregate%head%3#0", - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%head%3#0" - ] - }, - "3255": { - "op": "bytec 31 // 0x00", - "defined_out": [ - "0x00", - "aggregate%head%3#0", - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%head%3#0", - "0x00" - ] - }, - "3257": { - "op": "concat", - "defined_out": [ - "aggregate%head%4#0", - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%head%4#0" - ] - }, - "3258": { - "op": "box_put", - "stack_out": [] - }, - "3259": { - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%4#1" - ], - "stack_out": [ - "tmp%4#1" - ] - }, - "3261": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%3#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%3#0" - ] - }, - "3262": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%3#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%3#0", - "0x151f7c75" - ] - }, - "3263": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%3#0" - ] - }, - "3264": { - "op": "concat", - "defined_out": [ - "tmp%6#0" - ], - "stack_out": [ - "tmp%6#0" - ] - }, - "3265": { - "op": "log", - "stack_out": [] - }, - "3266": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "3267": { - "op": "return", - "stack_out": [] - }, - "3268": { - "subroutine": "modules.accounting.AccountingModule.account_close[routing]", - "params": {}, - "block": "account_close", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "holding_address#0" - ], - "stack_out": [ - "holding_address#0" - ] - }, - "3271": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ] - }, - "3272": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0" - ] - }, - "3273": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0", - "32" - ] - }, - "3274": { - "op": "==", - "defined_out": [ - "eq%0#0", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "eq%0#0" - ] - }, - "3275": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "holding_address#0" - ] - }, - "3276": { - "op": "bytec 14 // 0x52343023", - "defined_out": [ - "0x52343023", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "0x52343023" - ] - }, - "3278": { - "op": "txn Sender", - "defined_out": [ - "0x52343023", - "holding_address#0", - "tmp%0#2" - ], - "stack_out": [ - "holding_address#0", - "0x52343023", - "tmp%0#2" - ] - }, - "3280": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "holding_address#0", - "tmp%1#2" - ], - "stack_out": [ - "holding_address#0", - "tmp%1#2" - ] - }, - "3283": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "holding_address#0" - ] - }, - "3284": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "op": "callsub assert_is_not_asset_defaulted" - }, - "3287": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "0x52333023" - ] - }, - "3288": { - "op": "swap", - "stack_out": [ - "0x52333023", - "holding_address#0" - ] - }, - "3289": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1" - ], - "stack_out": [ - "box_prefixed_key%0#1" - ] - }, - "3290": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "3291": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "3292": { - "op": "bury 1", - "stack_out": [ - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "3294": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "box_prefixed_key%0#1" - ] - }, - "3295": { - "op": "dup", - "stack_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "3296": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0", - "box_prefixed_key%0#1" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "3297": { - "op": "pop", - "stack_out": [ - "box_prefixed_key%0#1", - "aggregate%box_get%0#0" - ] - }, - "3298": { - "op": "intc_2 // 32", - "stack_out": [ - "box_prefixed_key%0#1", - "aggregate%box_get%0#0", - "32" - ] - }, - "3299": { - "op": "extract_uint64", - "defined_out": [ - "box_prefixed_key%0#1", - "closed_units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "closed_units#0" - ] - }, - "3300": { - "op": "swap", - "stack_out": [ - "closed_units#0", - "box_prefixed_key%0#1" - ] - }, - "3301": { - "op": "box_del", - "defined_out": [ - "closed_units#0", - "{box_del}" - ], - "stack_out": [ - "closed_units#0", - "{box_del}" - ] - }, - "3302": { - "op": "pop", - "stack_out": [ - "closed_units#0" - ] - }, - "3303": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "closed_units#0" - ], - "stack_out": [ - "closed_units#0", - "0" - ] - }, - "3304": { - "op": "bytec_3 // \"circulating_units\"", - "defined_out": [ - "\"circulating_units\"", - "0", - "closed_units#0" - ], - "stack_out": [ - "closed_units#0", - "0", - "\"circulating_units\"" - ] - }, - "3305": { - "op": "app_global_get_ex", - "defined_out": [ - "closed_units#0", - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "closed_units#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "3306": { - "error": "check self.circulating_units exists", - "op": "assert // check self.circulating_units exists", - "stack_out": [ - "closed_units#0", - "maybe_value%0#0" - ] - }, - "3307": { - "op": "dig 1", - "defined_out": [ - "closed_units#0", - "closed_units#0 (copy)", - "maybe_value%0#0" - ], - "stack_out": [ - "closed_units#0", - "maybe_value%0#0", - "closed_units#0 (copy)" - ] - }, - "3309": { - "op": "-", - "defined_out": [ - "closed_units#0", - "tmp%0#1" - ], - "stack_out": [ - "closed_units#0", - "tmp%0#1" - ] - }, - "3310": { - "op": "bytec_3 // \"circulating_units\"", - "stack_out": [ - "closed_units#0", - "tmp%0#1", - "\"circulating_units\"" - ] - }, - "3311": { - "op": "swap", - "stack_out": [ - "closed_units#0", - "\"circulating_units\"", - "tmp%0#1" - ] - }, - "3312": { - "op": "app_global_put", - "stack_out": [ - "closed_units#0" - ] - }, - "3313": { - "callsub": "modules.accounting.AccountingModule.end_if_no_circulating_units", - "op": "callsub end_if_no_circulating_units" - }, - "3316": { - "op": "global LatestTimestamp", - "defined_out": [ - "closed_units#0", - "tmp%1#1" - ], - "stack_out": [ - "closed_units#0", - "tmp%1#1" - ] - }, - "3318": { - "op": "swap", - "stack_out": [ - "tmp%1#1", - "closed_units#0" - ] - }, - "3319": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "tmp%1#1" - ], - "stack_out": [ - "tmp%1#1", - "aggregate%val_as_bytes%0#0" - ] - }, - "3320": { - "op": "swap", - "stack_out": [ - "aggregate%val_as_bytes%0#0", - "tmp%1#1" - ] - }, - "3321": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0" - ] - }, - "3322": { - "op": "concat", - "defined_out": [ - "aggregate%head%1#0" - ], - "stack_out": [ - "aggregate%head%1#0" - ] - }, - "3323": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%head%1#0" - ], - "stack_out": [ - "aggregate%head%1#0", - "0x151f7c75" - ] - }, - "3324": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%head%1#0" - ] - }, - "3325": { - "op": "concat", - "defined_out": [ - "tmp%5#0" - ], - "stack_out": [ - "tmp%5#0" - ] - }, - "3326": { - "op": "log", - "stack_out": [] - }, - "3327": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "3328": { - "op": "return", - "stack_out": [] - }, - "3329": { - "subroutine": "modules.accounting.AccountingModule.account_update_payment_address[routing]", - "params": {}, - "block": "account_update_payment_address", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "holding_address#0" - ], - "stack_out": [ - "holding_address#0" - ] - }, - "3332": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ] - }, - "3333": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0" - ] - }, - "3334": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0", - "32" - ] - }, - "3335": { - "op": "==", - "defined_out": [ - "eq%0#0", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "eq%0#0" - ] - }, - "3336": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "holding_address#0" - ] - }, - "3337": { - "op": "txna ApplicationArgs 2", - "defined_out": [ - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0" - ] - }, - "3340": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ] - }, - "3341": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%1#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "len%1#0" - ] - }, - "3342": { - "op": "intc_2 // 32", - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "len%1#0", - "32" - ] - }, - "3343": { - "op": "==", - "defined_out": [ - "eq%1#0", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "eq%1#0" - ] - }, - "3344": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "holding_address#0", - "tmp%2#0" - ] - }, - "3345": { - "op": "txn Sender", - "defined_out": [ - "holding_address#0", - "tmp%0#1", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%0#1" - ] - }, - "3347": { - "op": "dig 2", - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%0#1", - "holding_address#0 (copy)" - ] - }, - "3349": { - "op": "==", - "defined_out": [ - "holding_address#0", - "tmp%1#1", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%1#1" - ] - }, - "3350": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "holding_address#0", - "tmp%2#0" - ] - }, - "3351": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "op": "callsub assert_is_not_asset_defaulted" - }, - "3354": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_suspended", - "op": "callsub assert_is_not_asset_suspended" - }, - "3357": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "0x52333023" - ] - }, - "3358": { - "op": "uncover 2", - "stack_out": [ - "tmp%2#0", - "0x52333023", - "holding_address#0" - ] - }, - "3360": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0", - "box_prefixed_key%0#1" - ] - }, - "3361": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "3362": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0", - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "3363": { - "op": "bury 1", - "stack_out": [ - "tmp%2#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "3365": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "tmp%2#0", - "box_prefixed_key%0#1" - ] - }, - "3366": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "box_prefixed_key%0#1", - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0", - "box_prefixed_key%0#1", - "0" - ] - }, - "3367": { - "op": "uncover 2", - "stack_out": [ - "box_prefixed_key%0#1", - "0", - "tmp%2#0" - ] - }, - "3369": { - "op": "box_replace", - "stack_out": [] - }, - "3370": { - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%2#1" - ], - "stack_out": [ - "tmp%2#1" - ] - }, - "3372": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0" - ] - }, - "3373": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0", - "0x151f7c75" - ] - }, - "3374": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ] - }, - "3375": { - "op": "concat", - "defined_out": [ - "tmp%6#0" - ], - "stack_out": [ - "tmp%6#0" - ] - }, - "3376": { - "op": "log", - "stack_out": [] - }, - "3377": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "3378": { - "op": "return", - "stack_out": [] - }, - "3379": { - "subroutine": "modules.accounting.AccountingModule.account_get_info[routing]", - "params": {}, - "block": "account_get_info", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "holding_address#0" - ], - "stack_out": [ - "holding_address#0" - ] - }, - "3382": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ] - }, - "3383": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0" - ] - }, - "3384": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0", - "32" - ] - }, - "3385": { - "op": "==", - "defined_out": [ - "eq%0#0", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "eq%0#0" - ] - }, - "3386": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "holding_address#0" - ] - }, - "3387": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "0x52333023" - ] - }, - "3388": { - "op": "swap", - "stack_out": [ - "0x52333023", - "holding_address#0" - ] - }, - "3389": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1" - ], - "stack_out": [ - "box_prefixed_key%0#1" - ] - }, - "3390": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "3391": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "3392": { - "op": "bury 1", - "stack_out": [ - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "3394": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "box_prefixed_key%0#1" - ] - }, - "3395": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ], - "stack_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "3396": { - "op": "pop", - "stack_out": [ - "aggregate%box_get%0#0" - ] - }, - "3397": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%box_get%0#0" - ], - "stack_out": [ - "aggregate%box_get%0#0", - "0x151f7c75" - ] - }, - "3398": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%box_get%0#0" - ] - }, - "3399": { - "op": "concat", - "defined_out": [ - "tmp%3#0" - ], - "stack_out": [ - "tmp%3#0" - ] - }, - "3400": { - "op": "log", - "stack_out": [] - }, - "3401": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "3402": { - "op": "return", - "stack_out": [] - }, - "3403": { - "subroutine": "modules.rbac.RbacModule.rbac_rotate_arranger[routing]", - "params": {}, - "block": "rbac_rotate_arranger", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "new_arranger#0" - ], - "stack_out": [ - "new_arranger#0" - ] - }, - "3406": { - "op": "dup", - "defined_out": [ - "new_arranger#0", - "new_arranger#0 (copy)" - ], - "stack_out": [ - "new_arranger#0", - "new_arranger#0 (copy)" - ] - }, - "3407": { - "op": "len", - "defined_out": [ - "len%0#0", - "new_arranger#0" - ], - "stack_out": [ - "new_arranger#0", - "len%0#0" - ] - }, - "3408": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "len%0#0", - "new_arranger#0" - ], - "stack_out": [ - "new_arranger#0", - "len%0#0", - "32" - ] - }, - "3409": { - "op": "==", - "defined_out": [ - "eq%0#0", - "new_arranger#0" - ], - "stack_out": [ - "new_arranger#0", - "eq%0#0" - ] - }, - "3410": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "new_arranger#0" - ] - }, - "3411": { - "callsub": "modules.rbac.RbacModule.assert_caller_is_arranger", - "op": "callsub assert_caller_is_arranger" - }, - "3414": { - "op": "bytec 8 // 0x52323023", - "defined_out": [ - "0x52323023", - "new_arranger#0" - ], - "stack_out": [ - "new_arranger#0", - "0x52323023" - ] - }, - "3416": { - "op": "swap", - "stack_out": [ - "0x52323023", - "new_arranger#0" - ] - }, - "3417": { - "op": "app_global_put", - "stack_out": [] - }, - "3418": { - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1" - ] - }, - "3420": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0" - ] - }, - "3421": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0", - "0x151f7c75" - ] - }, - "3422": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ] - }, - "3423": { - "op": "concat", - "defined_out": [ - "tmp%4#0" - ], - "stack_out": [ - "tmp%4#0" - ] - }, - "3424": { - "op": "log", - "stack_out": [] - }, - "3425": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "3426": { - "op": "return", - "stack_out": [] - }, - "3427": { - "subroutine": "modules.rbac.RbacModule.rbac_set_op_daemon[routing]", - "params": {}, - "block": "rbac_set_op_daemon", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "address#0" - ], - "stack_out": [ - "address#0" - ] - }, - "3430": { - "op": "dup", - "defined_out": [ - "address#0", - "address#0 (copy)" - ], - "stack_out": [ - "address#0", - "address#0 (copy)" - ] - }, - "3431": { - "op": "len", - "defined_out": [ - "address#0", - "len%0#0" - ], - "stack_out": [ - "address#0", - "len%0#0" - ] - }, - "3432": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "address#0", - "len%0#0" - ], - "stack_out": [ - "address#0", - "len%0#0", - "32" - ] - }, - "3433": { - "op": "==", - "defined_out": [ - "address#0", - "eq%0#0" - ], - "stack_out": [ - "address#0", - "eq%0#0" - ] - }, - "3434": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "address#0" - ] - }, - "3435": { - "callsub": "modules.rbac.RbacModule.assert_caller_is_arranger", - "op": "callsub assert_caller_is_arranger" - }, - "3438": { - "op": "bytec 22 // 0x52323523", - "defined_out": [ - "0x52323523", - "address#0" - ], - "stack_out": [ - "address#0", - "0x52323523" - ] - }, - "3440": { - "op": "swap", - "stack_out": [ - "0x52323523", - "address#0" - ] - }, - "3441": { - "op": "app_global_put", - "stack_out": [] - }, - "3442": { - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1" - ] - }, - "3444": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0" - ] - }, - "3445": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0", - "0x151f7c75" - ] - }, - "3446": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ] - }, - "3447": { - "op": "concat", - "defined_out": [ - "tmp%4#0" - ], - "stack_out": [ - "tmp%4#0" - ] - }, - "3448": { - "op": "log", - "stack_out": [] - }, - "3449": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "3450": { - "op": "return", - "stack_out": [] - }, - "3451": { - "subroutine": "modules.rbac.RbacModule.rbac_assign_role[routing]", - "params": {}, - "block": "rbac_assign_role", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "role_id#0" - ], - "stack_out": [ - "role_id#0" - ] - }, - "3454": { - "op": "dup", - "defined_out": [ - "role_id#0", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0", - "role_id#0 (copy)" - ] - }, - "3455": { - "op": "len", - "defined_out": [ - "len%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "len%0#0" - ] - }, - "3456": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "len%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "len%0#0", - "1" - ] - }, - "3457": { - "op": "==", - "defined_out": [ - "eq%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "eq%0#0" - ] - }, - "3458": { - "error": "invalid number of bytes for arc4.uint8", - "op": "assert // invalid number of bytes for arc4.uint8", - "stack_out": [ - "role_id#0" - ] - }, - "3459": { - "op": "txna ApplicationArgs 2" - }, - "3462": { - "op": "dup", - "defined_out": [ - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "role_address#0", - "role_address#0" - ] - }, - "3463": { - "op": "cover 2", - "defined_out": [ - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "role_address#0" - ] - }, - "3465": { - "op": "len", - "defined_out": [ - "len%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "len%1#0" - ] - }, - "3466": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "len%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "len%1#0", - "32" - ] - }, - "3467": { - "op": "==", - "defined_out": [ - "eq%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "eq%1#0" - ] - }, - "3468": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "role_address#0", - "role_id#0" - ] - }, - "3469": { - "op": "txna ApplicationArgs 3", - "defined_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0" - ] - }, - "3472": { - "op": "dup", - "defined_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "tmp%3#0 (copy)" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "tmp%3#0 (copy)" - ] - }, - "3473": { - "op": "intc_0 // 0", - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "tmp%3#0 (copy)", - "0" - ] - }, - "3474": { - "error": "invalid array length header", - "op": "extract_uint16 // on error: invalid array length header", - "defined_out": [ - "aggregate%array_length%0#0", - "role_address#0", - "role_id#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "aggregate%array_length%0#0" - ] - }, - "3475": { - "op": "pushint 2", - "defined_out": [ - "2", - "aggregate%array_length%0#0", - "role_address#0", - "role_id#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "aggregate%array_length%0#0", - "2" - ] - }, - "3477": { - "op": "+", - "defined_out": [ - "add%0#0", - "role_address#0", - "role_id#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "add%0#0" - ] - }, - "3478": { - "op": "dig 1", - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "add%0#0", - "tmp%3#0 (copy)" - ] - }, - "3480": { - "op": "len", - "defined_out": [ - "add%0#0", - "len%2#0", - "role_address#0", - "role_id#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "add%0#0", - "len%2#0" - ] - }, - "3481": { - "op": "==", - "defined_out": [ - "eq%2#0", - "role_address#0", - "role_id#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "eq%2#0" - ] - }, - "3482": { - "error": "invalid number of bytes for arc4.dynamic_array", - "op": "assert // invalid number of bytes for arc4.dynamic_array", - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0" - ] - }, - "3483": { - "op": "extract 2 0", - "defined_out": [ - "config#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "config#0" - ] - }, - "3486": { - "op": "swap", - "defined_out": [ - "config#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#0" - ] - }, - "3487": { - "callsub": "modules.rbac.RbacModule.assert_caller_is_arranger", - "op": "callsub assert_caller_is_arranger" - }, - "3490": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "op": "callsub assert_is_not_asset_defaulted" - }, - "3493": { - "op": "btoi", - "defined_out": [ - "config#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3494": { - "op": "dupn 2", - "defined_out": [ - "config#0", - "role_address#0", - "role_id#1", - "role_id#1 (copy)" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1", - "role_id#1 (copy)" - ] - }, - "3496": { - "callsub": "modules.rbac.RbacModule._assert_valid_role", - "op": "callsub _assert_valid_role", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1" - ] - }, - "3499": { - "op": "pushint 20", - "defined_out": [ - "20", - "config#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1", - "20" - ] - }, - "3501": { - "op": "==", - "defined_out": [ - "config#0", - "role_address#0", - "role_id#1", - "tmp%0#2" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "tmp%0#2" - ] - }, - "3502": { - "op": "bz rbac_assign_role_after_if_else@3", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3505": { - "op": "bytec 8 // 0x52323023", - "defined_out": [ - "0x52323023", - "config#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52323023" - ] - }, - "3507": { - "op": "dig 3", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52323023", - "role_address#0" - ] - }, - "3509": { - "op": "app_global_put", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3510": { - "block": "rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14", - "stack_in": [ - "role_address#0", - "config#0", - "role_id#1" - ], - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%2#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "tmp%2#1" - ] - }, - "3512": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "aggregate%val_as_bytes%0#0" - ] - }, - "3513": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "aggregate%val_as_bytes%0#0", - "0x151f7c75" - ] - }, - "3514": { - "op": "swap", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ] - }, - "3515": { - "op": "concat", - "defined_out": [ - "tmp%7#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "tmp%7#0" - ] - }, - "3516": { - "op": "log", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3517": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "1" - ] - }, - "3518": { - "op": "return", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3519": { - "block": "rbac_assign_role_after_if_else@3", - "stack_in": [ - "role_address#0", - "config#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1" - ] - }, - "3520": { - "op": "pushint 40", - "defined_out": [ - "40", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1", - "40" - ] - }, - "3522": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%1#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "tmp%1#1" - ] - }, - "3523": { - "op": "bz rbac_assign_role_after_if_else@5", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3526": { - "op": "bytec 14 // 0x52343023", - "defined_out": [ - "0x52343023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52343023" - ] - }, - "3528": { - "op": "dig 3", - "defined_out": [ - "0x52343023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52343023", - "role_address#0" - ] - }, - "3530": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%0#0" - ] - }, - "3531": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#0", - "box_prefixed_key%0#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%0#0", - "box_prefixed_key%0#0 (copy)" - ] - }, - "3532": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#0", - "maybe_exists%0#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%0#0", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "3533": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%0#0", - "maybe_exists%0#0" - ] - }, - "3535": { - "op": "!", - "defined_out": [ - "box_prefixed_key%0#0", - "role_address#0", - "role_id#1", - "tmp%2#2" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%0#0", - "tmp%2#2" - ] - }, - "3536": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%0#0" - ] - }, - "3537": { - "op": "dig 2", - "defined_out": [ - "box_prefixed_key%0#0", - "config#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%0#0", - "config#0" - ] - }, - "3539": { - "op": "box_put", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3540": { - "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14" - }, - "3543": { - "block": "rbac_assign_role_after_if_else@5", - "stack_in": [ - "role_address#0", - "config#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1" - ] - }, - "3544": { - "op": "pushint 50", - "defined_out": [ - "50", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1", - "50" - ] - }, - "3546": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%3#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "tmp%3#1" - ] - }, - "3547": { - "op": "bz rbac_assign_role_after_if_else@7", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3550": { - "op": "bytec 21 // 0x52353023", - "defined_out": [ - "0x52353023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52353023" - ] - }, - "3552": { - "op": "dig 3", - "defined_out": [ - "0x52353023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52353023", - "role_address#0" - ] - }, - "3554": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%2#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%2#0" - ] - }, - "3555": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%2#0", - "box_prefixed_key%2#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%2#0", - "box_prefixed_key%2#0 (copy)" - ] - }, - "3556": { - "op": "box_len", - "defined_out": [ - "_%1#0", - "box_prefixed_key%2#0", - "maybe_exists%1#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%2#0", - "_%1#0", - "maybe_exists%1#0" - ] - }, - "3557": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%2#0", - "maybe_exists%1#0" - ] - }, - "3559": { - "op": "!", - "defined_out": [ - "box_prefixed_key%2#0", - "role_address#0", - "role_id#1", - "tmp%4#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%2#0", - "tmp%4#0" - ] - }, - "3560": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%2#0" - ] - }, - "3561": { - "op": "dig 2", - "defined_out": [ - "box_prefixed_key%2#0", - "config#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%2#0", - "config#0" - ] - }, - "3563": { - "op": "box_put", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3564": { - "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14" - }, - "3567": { - "block": "rbac_assign_role_after_if_else@7", - "stack_in": [ - "role_address#0", - "config#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1" - ] - }, - "3568": { - "op": "pushint 60", - "defined_out": [ - "60", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1", - "60" - ] - }, - "3570": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%5#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "tmp%5#0" - ] - }, - "3571": { - "op": "bz rbac_assign_role_after_if_else@9", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3574": { - "op": "bytec 20 // 0x52363023", - "defined_out": [ - "0x52363023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52363023" - ] - }, - "3576": { - "op": "dig 3", - "defined_out": [ - "0x52363023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52363023", - "role_address#0" - ] - }, - "3578": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%4#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%4#0" - ] - }, - "3579": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%4#0", - "box_prefixed_key%4#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%4#0", - "box_prefixed_key%4#0 (copy)" - ] - }, - "3580": { - "op": "box_len", - "defined_out": [ - "_%2#0", - "box_prefixed_key%4#0", - "maybe_exists%2#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%4#0", - "_%2#0", - "maybe_exists%2#0" - ] - }, - "3581": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%4#0", - "maybe_exists%2#0" - ] - }, - "3583": { - "op": "!", - "defined_out": [ - "box_prefixed_key%4#0", - "role_address#0", - "role_id#1", - "tmp%6#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%4#0", - "tmp%6#1" - ] - }, - "3584": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%4#0" - ] - }, - "3585": { - "op": "dig 2", - "defined_out": [ - "box_prefixed_key%4#0", - "config#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%4#0", - "config#0" - ] - }, - "3587": { - "op": "box_put", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3588": { - "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14" - }, - "3591": { - "block": "rbac_assign_role_after_if_else@9", - "stack_in": [ - "role_address#0", - "config#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1" - ] - }, - "3592": { - "op": "pushint 70", - "defined_out": [ - "70", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1", - "70" - ] - }, - "3594": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%7#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "tmp%7#1" - ] - }, - "3595": { - "op": "bz rbac_assign_role_after_if_else@11", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3598": { - "op": "bytec 13 // 0x52373023", - "defined_out": [ - "0x52373023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52373023" - ] - }, - "3600": { - "op": "dig 3", - "defined_out": [ - "0x52373023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52373023", - "role_address#0" - ] - }, - "3602": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%6#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%6#0" - ] - }, - "3603": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%6#0", - "box_prefixed_key%6#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%6#0", - "box_prefixed_key%6#0 (copy)" - ] - }, - "3604": { - "op": "box_len", - "defined_out": [ - "_%3#0", - "box_prefixed_key%6#0", - "maybe_exists%3#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%6#0", - "_%3#0", - "maybe_exists%3#0" - ] - }, - "3605": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%6#0", - "maybe_exists%3#0" - ] - }, - "3607": { - "op": "!", - "defined_out": [ - "box_prefixed_key%6#0", - "role_address#0", - "role_id#1", - "tmp%8#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%6#0", - "tmp%8#0" - ] - }, - "3608": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%6#0" - ] - }, - "3609": { - "op": "dig 2", - "defined_out": [ - "box_prefixed_key%6#0", - "config#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%6#0", - "config#0" - ] - }, - "3611": { - "op": "box_put", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3612": { - "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14" - }, - "3615": { - "block": "rbac_assign_role_after_if_else@11", - "stack_in": [ - "role_address#0", - "config#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1" - ] - }, - "3616": { - "op": "pushint 80", - "defined_out": [ - "80", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1", - "80" - ] - }, - "3618": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%9#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "tmp%9#0" - ] - }, - "3619": { - "op": "bz rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3622": { - "op": "bytec 32 // 0x52383023", - "defined_out": [ - "0x52383023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52383023" - ] - }, - "3624": { - "op": "dig 3", - "defined_out": [ - "0x52383023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52383023", - "role_address#0" - ] - }, - "3626": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%8#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%8#0" - ] - }, - "3627": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%8#0", - "box_prefixed_key%8#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%8#0", - "box_prefixed_key%8#0 (copy)" - ] - }, - "3628": { - "op": "box_len", - "defined_out": [ - "_%4#0", - "box_prefixed_key%8#0", - "maybe_exists%4#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%8#0", - "_%4#0", - "maybe_exists%4#0" - ] - }, - "3629": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%8#0", - "maybe_exists%4#0" - ] - }, - "3631": { - "op": "!", - "defined_out": [ - "box_prefixed_key%8#0", - "role_address#0", - "role_id#1", - "tmp%10#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%8#0", - "tmp%10#0" - ] - }, - "3632": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%8#0" - ] - }, - "3633": { - "op": "dig 2", - "defined_out": [ - "box_prefixed_key%8#0", - "config#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%8#0", - "config#0" - ] - }, - "3635": { - "op": "box_put", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3636": { - "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14" - }, - "3639": { - "subroutine": "modules.rbac.RbacModule.rbac_revoke_role[routing]", - "params": {}, - "block": "rbac_revoke_role", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "role_id#0" - ], - "stack_out": [ - "role_id#0" - ] - }, - "3642": { - "op": "dup", - "defined_out": [ - "role_id#0", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0", - "role_id#0 (copy)" - ] - }, - "3643": { - "op": "len", - "defined_out": [ - "len%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "len%0#0" - ] - }, - "3644": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "len%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "len%0#0", - "1" - ] - }, - "3645": { - "op": "==", - "defined_out": [ - "eq%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "eq%0#0" - ] - }, - "3646": { - "error": "invalid number of bytes for arc4.uint8", - "op": "assert // invalid number of bytes for arc4.uint8", - "stack_out": [ - "role_id#0" - ] - }, - "3647": { - "op": "txna ApplicationArgs 2" - }, - "3650": { - "op": "dup", - "defined_out": [ - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "role_address#0", - "role_address#0" - ] - }, - "3651": { - "op": "cover 2", - "defined_out": [ - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "role_address#0" - ] - }, - "3653": { - "op": "len", - "defined_out": [ - "len%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "len%1#0" - ] - }, - "3654": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "len%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "len%1#0", - "32" - ] - }, - "3655": { - "op": "==", - "defined_out": [ - "eq%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "eq%1#0" - ] - }, - "3656": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "role_address#0", - "role_id#0" - ] - }, - "3657": { - "callsub": "modules.rbac.RbacModule.assert_caller_is_arranger", - "op": "callsub assert_caller_is_arranger" - }, - "3660": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "op": "callsub assert_is_not_asset_defaulted" - }, - "3663": { - "op": "btoi", - "defined_out": [ - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3664": { - "op": "dupn 2", - "defined_out": [ - "role_address#0", - "role_id#1", - "role_id#1 (copy)" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "role_id#1 (copy)" - ] - }, - "3666": { - "callsub": "modules.rbac.RbacModule._assert_valid_role", - "op": "callsub _assert_valid_role", - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1" - ] - }, - "3669": { - "op": "dup", - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "role_id#1 (copy)" - ] - }, - "3670": { - "op": "pushint 20", - "defined_out": [ - "20", - "role_address#0", - "role_id#1", - "role_id#1 (copy)" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "role_id#1 (copy)", - "20" - ] - }, - "3672": { - "op": "!=", - "defined_out": [ - "role_address#0", - "role_id#1", - "tmp%0#2" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "tmp%0#2" - ] - }, - "3673": { - "error": "Invalid role identifier", - "op": "assert // Invalid role identifier", - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1" - ] - }, - "3674": { - "op": "pushint 40", - "defined_out": [ - "40", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "40" - ] - }, - "3676": { - "op": "==", - "defined_out": [ - "role_address#0", - "role_id#1", - "tmp%1#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "tmp%1#1" - ] - }, - "3677": { - "op": "bz rbac_revoke_role_after_if_else@3", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3680": { - "op": "bytec 14 // 0x52343023", - "defined_out": [ - "0x52343023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52343023" - ] - }, - "3682": { - "op": "dig 2", - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52343023", - "role_address#0" - ] - }, - "3684": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%0#0" - ] - }, - "3685": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#0", - "box_prefixed_key%0#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%0#0", - "box_prefixed_key%0#0 (copy)" - ] - }, - "3686": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#0", - "maybe_exists%0#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%0#0", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "3687": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%0#0", - "maybe_exists%0#0" - ] - }, - "3689": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%0#0" - ] - }, - "3690": { - "op": "box_del", - "defined_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ] - }, - "3691": { - "op": "pop", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3692": { - "block": "rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12", - "stack_in": [ - "role_address#0", - "role_id#1" - ], - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%2#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "tmp%2#1" - ] - }, - "3694": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "aggregate%val_as_bytes%0#0" - ] - }, - "3695": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "aggregate%val_as_bytes%0#0", - "0x151f7c75" - ] - }, - "3696": { - "op": "swap", - "stack_out": [ - "role_address#0", - "role_id#1", - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ] - }, - "3697": { - "op": "concat", - "defined_out": [ - "tmp%5#0" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "tmp%5#0" - ] - }, - "3698": { - "op": "log", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3699": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "1" - ] - }, - "3700": { - "op": "return", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3701": { - "block": "rbac_revoke_role_after_if_else@3", - "stack_in": [ - "role_address#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1" - ] - }, - "3702": { - "op": "pushint 50", - "defined_out": [ - "50", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "50" - ] - }, - "3704": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%2#2" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "tmp%2#2" - ] - }, - "3705": { - "op": "bz rbac_revoke_role_after_if_else@5", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3708": { - "op": "bytec 21 // 0x52353023", - "defined_out": [ - "0x52353023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52353023" - ] - }, - "3710": { - "op": "dig 2", - "defined_out": [ - "0x52353023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52353023", - "role_address#0" - ] - }, - "3712": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%2#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%2#0" - ] - }, - "3713": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%2#0", - "box_prefixed_key%2#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%2#0", - "box_prefixed_key%2#0 (copy)" - ] - }, - "3714": { - "op": "box_len", - "defined_out": [ - "_%1#0", - "box_prefixed_key%2#0", - "maybe_exists%1#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%2#0", - "_%1#0", - "maybe_exists%1#0" - ] - }, - "3715": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%2#0", - "maybe_exists%1#0" - ] - }, - "3717": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%2#0" - ] - }, - "3718": { - "op": "box_del", - "defined_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ] - }, - "3719": { - "op": "pop", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3720": { - "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" - }, - "3723": { - "block": "rbac_revoke_role_after_if_else@5", - "stack_in": [ - "role_address#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1" - ] - }, - "3724": { - "op": "pushint 60", - "defined_out": [ - "60", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "60" - ] - }, - "3726": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "tmp%3#0" - ] - }, - "3727": { - "op": "bz rbac_revoke_role_after_if_else@7", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3730": { - "op": "bytec 20 // 0x52363023", - "defined_out": [ - "0x52363023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52363023" - ] - }, - "3732": { - "op": "dig 2", - "defined_out": [ - "0x52363023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52363023", - "role_address#0" - ] - }, - "3734": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%4#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%4#0" - ] - }, - "3735": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%4#0", - "box_prefixed_key%4#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%4#0", - "box_prefixed_key%4#0 (copy)" - ] - }, - "3736": { - "op": "box_len", - "defined_out": [ - "_%2#0", - "box_prefixed_key%4#0", - "maybe_exists%2#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%4#0", - "_%2#0", - "maybe_exists%2#0" - ] - }, - "3737": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%4#0", - "maybe_exists%2#0" - ] - }, - "3739": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%4#0" - ] - }, - "3740": { - "op": "box_del", - "defined_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ] - }, - "3741": { - "op": "pop", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3742": { - "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" - }, - "3745": { - "block": "rbac_revoke_role_after_if_else@7", - "stack_in": [ - "role_address#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1" - ] - }, - "3746": { - "op": "pushint 70", - "defined_out": [ - "70", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "70" - ] - }, - "3748": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%4#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "tmp%4#1" - ] - }, - "3749": { - "op": "bz rbac_revoke_role_after_if_else@9", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3752": { - "op": "bytec 13 // 0x52373023", - "defined_out": [ - "0x52373023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52373023" - ] - }, - "3754": { - "op": "dig 2", - "defined_out": [ - "0x52373023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52373023", - "role_address#0" - ] - }, - "3756": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%6#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%6#0" - ] - }, - "3757": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%6#0", - "box_prefixed_key%6#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%6#0", - "box_prefixed_key%6#0 (copy)" - ] - }, - "3758": { - "op": "box_len", - "defined_out": [ - "_%3#0", - "box_prefixed_key%6#0", - "maybe_exists%3#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%6#0", - "_%3#0", - "maybe_exists%3#0" - ] - }, - "3759": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%6#0", - "maybe_exists%3#0" - ] - }, - "3761": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%6#0" - ] - }, - "3762": { - "op": "box_del", - "defined_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ] - }, - "3763": { - "op": "pop", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3764": { - "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" - }, - "3767": { - "block": "rbac_revoke_role_after_if_else@9", - "stack_in": [ - "role_address#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1" - ] - }, - "3768": { - "op": "pushint 80", - "defined_out": [ - "80", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "80" - ] - }, - "3770": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%5#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "tmp%5#1" - ] - }, - "3771": { - "op": "bz rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3774": { - "op": "bytec 32 // 0x52383023", - "defined_out": [ - "0x52383023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52383023" - ] - }, - "3776": { - "op": "dig 2", - "defined_out": [ - "0x52383023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52383023", - "role_address#0" - ] - }, - "3778": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%8#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%8#0" - ] - }, - "3779": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%8#0", - "box_prefixed_key%8#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%8#0", - "box_prefixed_key%8#0 (copy)" - ] - }, - "3780": { - "op": "box_len", - "defined_out": [ - "_%4#0", - "box_prefixed_key%8#0", - "maybe_exists%4#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%8#0", - "_%4#0", - "maybe_exists%4#0" - ] - }, - "3781": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%8#0", - "maybe_exists%4#0" - ] - }, - "3783": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%8#0" - ] - }, - "3784": { - "op": "box_del", - "defined_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ] - }, - "3785": { - "op": "pop", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3786": { - "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" - }, - "3789": { - "subroutine": "modules.rbac.RbacModule.rbac_gov_asset_suspension[routing]", - "params": {}, - "block": "rbac_gov_asset_suspension", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "3792": { - "op": "dup", - "defined_out": [ - "tmp%0#0", - "tmp%0#0 (copy)" - ], - "stack_out": [ - "tmp%0#0", - "tmp%0#0 (copy)" - ] - }, - "3793": { - "op": "len", - "defined_out": [ - "len%0#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "len%0#0" - ] - }, - "3794": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "len%0#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "len%0#0", - "1" - ] - }, - "3795": { - "op": "==", - "defined_out": [ - "eq%0#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "eq%0#0" - ] - }, - "3796": { - "error": "invalid number of bytes for arc4.bool", - "op": "assert // invalid number of bytes for arc4.bool", - "stack_out": [ - "tmp%0#0" - ] - }, - "3797": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "0" - ] - }, - "3798": { - "op": "getbit", - "defined_out": [ - "suspended#0" - ], - "stack_out": [ - "suspended#0" - ] - }, - "3799": { - "op": "bytec 13 // 0x52373023", - "defined_out": [ - "0x52373023", - "suspended#0" - ], - "stack_out": [ - "suspended#0", - "0x52373023" - ] - }, - "3801": { - "op": "txn Sender", - "defined_out": [ - "0x52373023", - "suspended#0", - "tmp%0#2" - ], - "stack_out": [ - "suspended#0", - "0x52373023", - "tmp%0#2" - ] - }, - "3803": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "suspended#0", - "tmp%1#0" - ], - "stack_out": [ - "suspended#0", - "tmp%1#0" - ] - }, - "3806": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "suspended#0" - ] - }, - "3807": { - "op": "bytec 23 // \"asset_suspended\"", - "defined_out": [ - "\"asset_suspended\"", - "suspended#0" - ], - "stack_out": [ - "suspended#0", - "\"asset_suspended\"" - ] - }, - "3809": { - "op": "swap", - "stack_out": [ - "\"asset_suspended\"", - "suspended#0" - ] - }, - "3810": { - "op": "app_global_put", - "stack_out": [] - }, - "3811": { - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1" - ] - }, - "3813": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0" - ] - }, - "3814": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0", - "0x151f7c75" - ] - }, - "3815": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ] - }, - "3816": { - "op": "concat", - "defined_out": [ - "tmp%4#0" - ], - "stack_out": [ - "tmp%4#0" - ] - }, - "3817": { - "op": "log", - "stack_out": [] - }, - "3818": { - "op": "intc_1 // 1", - "stack_out": [ - "1" - ] - }, - "3819": { - "op": "return", - "stack_out": [] - }, - "3820": { - "subroutine": "modules.rbac.RbacModule.rbac_get_arranger[routing]", - "params": {}, - "block": "rbac_get_arranger", - "stack_in": [], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "0" - ] - }, - "3821": { - "op": "bytec 8 // 0x52323023", - "defined_out": [ - "0", - "0x52323023" - ], - "stack_out": [ - "0", - "0x52323023" - ] - }, - "3823": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "3824": { - "error": "check self.arranger exists", - "op": "assert // check self.arranger exists", - "stack_out": [ - "maybe_value%0#0" - ] - }, - "3825": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "0x151f7c75" - ] - }, - "3826": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "maybe_value%0#0" - ] - }, - "3827": { - "op": "concat", - "defined_out": [ - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0" - ] - }, - "3828": { - "op": "log", - "stack_out": [] - }, - "3829": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "3830": { - "op": "return", - "stack_out": [] - }, - "3831": { - "subroutine": "modules.rbac.RbacModule.rbac_get_address_roles[routing]", - "params": {}, - "block": "rbac_get_address_roles", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "address#0" - ], - "stack_out": [ - "address#0" - ] - }, - "3834": { - "op": "dup", - "defined_out": [ - "address#0", - "address#0 (copy)" - ], - "stack_out": [ - "address#0", - "address#0 (copy)" - ] - }, - "3835": { - "op": "len", - "defined_out": [ - "address#0", - "len%0#0" - ], - "stack_out": [ - "address#0", - "len%0#0" - ] - }, - "3836": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "address#0", - "len%0#0" - ], - "stack_out": [ - "address#0", - "len%0#0", - "32" - ] - }, - "3837": { - "op": "==", - "defined_out": [ - "address#0", - "eq%0#0" - ], - "stack_out": [ - "address#0", - "eq%0#0" - ] - }, - "3838": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "address#0" - ] - }, - "3839": { - "op": "bytec 14 // 0x52343023", - "defined_out": [ - "0x52343023", - "address#0" - ], - "stack_out": [ - "address#0", - "0x52343023" - ] - }, - "3841": { - "op": "dig 1", - "stack_out": [ - "address#0", - "0x52343023", - "address#0 (copy)" - ] - }, - "3843": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "address#0", - "tmp%0#1" - ], - "stack_out": [ - "address#0", - "tmp%0#1" - ] - }, - "3846": { - "op": "bytec 21 // 0x52353023", - "defined_out": [ - "0x52353023", - "address#0", - "tmp%0#1" - ], - "stack_out": [ - "address#0", - "tmp%0#1", - "0x52353023" - ] - }, - "3848": { - "op": "dig 2", - "stack_out": [ - "address#0", - "tmp%0#1", - "0x52353023", - "address#0 (copy)" - ] - }, - "3850": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1" - ], - "stack_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1" - ] - }, - "3853": { - "op": "bytec 20 // 0x52363023", - "defined_out": [ - "0x52363023", - "address#0", - "tmp%0#1", - "tmp%1#1" - ], - "stack_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "0x52363023" - ] - }, - "3855": { - "op": "dig 3", - "stack_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "0x52363023", - "address#0 (copy)" - ] - }, - "3857": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1" - ], - "stack_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1" - ] - }, - "3860": { - "op": "bytec 13 // 0x52373023", - "defined_out": [ - "0x52373023", - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1" - ], - "stack_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "0x52373023" - ] - }, - "3862": { - "op": "dig 4", - "stack_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "0x52373023", - "address#0 (copy)" - ] - }, - "3864": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1" - ], - "stack_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1" - ] - }, - "3867": { - "op": "bytec 32 // 0x52383023", - "defined_out": [ - "0x52383023", - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1" - ], - "stack_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "0x52383023" - ] - }, - "3869": { - "op": "uncover 5", - "stack_out": [ - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "0x52383023", - "address#0" - ] - }, - "3871": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1" - ] - }, - "3874": { - "op": "bytec 31 // 0x00", - "defined_out": [ - "0x00", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1", - "0x00" - ] - }, - "3876": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "0x00", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1", - "0x00", - "0" - ] - }, - "3877": { - "op": "uncover 6", - "stack_out": [ - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1", - "0x00", - "0", - "tmp%0#1" - ] - }, - "3879": { - "op": "setbit", - "defined_out": [ - "aggregate%encoded_bool%0#0", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1", - "aggregate%encoded_bool%0#0" - ] - }, - "3880": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "aggregate%encoded_bool%0#0", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1", - "aggregate%encoded_bool%0#0", - "1" - ] - }, - "3881": { - "op": "uncover 5", - "stack_out": [ - "tmp%2#1", - "tmp%3#1", - "tmp%4#1", - "aggregate%encoded_bool%0#0", - "1", - "tmp%1#1" - ] - }, - "3883": { - "op": "setbit", - "defined_out": [ - "aggregate%set_bit%0#0", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%2#1", - "tmp%3#1", - "tmp%4#1", - "aggregate%set_bit%0#0" - ] - }, - "3884": { - "op": "pushint 2", - "defined_out": [ - "2", - "aggregate%set_bit%0#0", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%2#1", - "tmp%3#1", - "tmp%4#1", - "aggregate%set_bit%0#0", - "2" - ] - }, - "3886": { - "op": "uncover 4", - "stack_out": [ - "tmp%3#1", - "tmp%4#1", - "aggregate%set_bit%0#0", - "2", - "tmp%2#1" - ] - }, - "3888": { - "op": "setbit", - "defined_out": [ - "aggregate%set_bit%1#0", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%3#1", - "tmp%4#1", - "aggregate%set_bit%1#0" - ] - }, - "3889": { - "op": "pushint 3", - "defined_out": [ - "3", - "aggregate%set_bit%1#0", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%3#1", - "tmp%4#1", - "aggregate%set_bit%1#0", - "3" - ] - }, - "3891": { - "op": "uncover 3", - "stack_out": [ - "tmp%4#1", - "aggregate%set_bit%1#0", - "3", - "tmp%3#1" - ] - }, - "3893": { - "op": "setbit", - "defined_out": [ - "aggregate%set_bit%2#0", - "tmp%4#1" - ], - "stack_out": [ - "tmp%4#1", - "aggregate%set_bit%2#0" - ] - }, - "3894": { - "op": "pushint 4", - "defined_out": [ - "4", - "aggregate%set_bit%2#0", - "tmp%4#1" - ], - "stack_out": [ - "tmp%4#1", - "aggregate%set_bit%2#0", - "4" - ] - }, - "3896": { - "op": "uncover 2", - "stack_out": [ - "aggregate%set_bit%2#0", - "4", - "tmp%4#1" - ] - }, - "3898": { - "op": "setbit", - "defined_out": [ - "aggregate%set_bit%3#0" - ], - "stack_out": [ - "aggregate%set_bit%3#0" - ] - }, - "3899": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%set_bit%3#0" - ], - "stack_out": [ - "aggregate%set_bit%3#0", - "0x151f7c75" - ] - }, - "3900": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%set_bit%3#0" - ] - }, - "3901": { - "op": "concat", - "defined_out": [ - "tmp%8#0" - ], - "stack_out": [ - "tmp%8#0" - ] - }, - "3902": { - "op": "log", - "stack_out": [] - }, - "3903": { - "op": "intc_1 // 1", - "stack_out": [ - "1" - ] - }, - "3904": { - "op": "return", - "stack_out": [] - }, - "3905": { - "subroutine": "modules.rbac.RbacModule.rbac_get_role_config[routing]", - "params": {}, - "block": "rbac_get_role_config", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "role_id#0" - ], - "stack_out": [ - "role_id#0" - ] - }, - "3908": { - "op": "dup", - "defined_out": [ - "role_id#0", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0", - "role_id#0 (copy)" - ] - }, - "3909": { - "op": "len", - "defined_out": [ - "len%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "len%0#0" - ] - }, - "3910": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "len%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "len%0#0", - "1" - ] - }, - "3911": { - "op": "==", - "defined_out": [ - "eq%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "eq%0#0" - ] - }, - "3912": { - "error": "invalid number of bytes for arc4.uint8", - "op": "assert // invalid number of bytes for arc4.uint8", - "stack_out": [ - "role_id#0" - ] - }, - "3913": { - "op": "txna ApplicationArgs 2" - }, - "3916": { - "op": "dup", - "defined_out": [ - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "role_address#0", - "role_address#0" - ] - }, - "3917": { - "op": "cover 2", - "defined_out": [ - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "role_address#0" - ] - }, - "3919": { - "op": "len", - "defined_out": [ - "len%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "len%1#0" - ] - }, - "3920": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "len%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "len%1#0", - "32" - ] - }, - "3921": { - "op": "==", - "defined_out": [ - "eq%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "eq%1#0" - ] - }, - "3922": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "role_address#0", - "role_id#0" - ] - }, - "3923": { - "op": "btoi", - "defined_out": [ - "role#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "role#0" - ] - }, - "3924": { - "op": "dup", - "defined_out": [ - "role#0", - "role#0 (copy)", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "role#0", - "role#0 (copy)" - ] - }, - "3925": { - "callsub": "modules.rbac.RbacModule._assert_valid_role", - "op": "callsub _assert_valid_role", - "stack_out": [ - "role_address#0", - "role#0" - ] - }, - "3928": { - "op": "pushints 20 40 50 60 70 80", - "defined_out": [ - "20", - "40", - "50", - "60", - "70", - "80", - "role#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "role#0", - "20", - "40", - "50", - "60", - "70", - "80" - ] - }, - "3936": { - "op": "uncover 6", - "stack_out": [ - "role_address#0", - "20", - "40", - "50", - "60", - "70", - "80", - "role#0" - ] - }, - "3938": { - "op": "match rbac_get_role_config_switch_case_0@2 rbac_get_role_config_switch_case_1@3 rbac_get_role_config_switch_case_2@4 rbac_get_role_config_switch_case_3@5 rbac_get_role_config_switch_case_4@6 rbac_get_role_config_switch_case_5@7", - "stack_out": [ - "role_address#0" - ] - }, - "3952": { - "error": "Invalid role identifier", - "op": "err // Invalid role identifier" - }, - "3953": { - "block": "rbac_get_role_config_switch_case_5@7", - "stack_in": [ - "role_address#0" - ], - "op": "bytec 32 // 0x52383023", - "defined_out": [ - "0x52383023" - ], - "stack_out": [ - "role_address#0", - "0x52383023" - ] - }, - "3955": { - "op": "dig 1", - "defined_out": [ - "0x52383023", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "0x52383023", - "role_address#0" - ] - }, - "3957": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "3958": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "3959": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "3960": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "3962": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "3963": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%8#0", - "aggregate%box_get%9#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "aggregate%box_get%8#0", - "aggregate%box_get%9#0" - ] - }, - "3964": { - "op": "pop", - "defined_out": [ - "role_address#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "tmp%3#0" - ] - }, - "3965": { - "block": "rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9", - "stack_in": [ - "role_address#0", - "tmp%3#0" - ], - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75" - ], - "stack_out": [ - "role_address#0", - "tmp%3#0", - "0x151f7c75" - ] - }, - "3966": { - "op": "swap", - "defined_out": [ - "0x151f7c75", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "0x151f7c75", - "tmp%3#0" - ] - }, - "3967": { - "op": "concat", - "defined_out": [ - "tmp%4#0" - ], - "stack_out": [ - "role_address#0", - "tmp%4#0" - ] - }, - "3968": { - "op": "log", - "stack_out": [ - "role_address#0" - ] - }, - "3969": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "role_address#0", - "1" - ] - }, - "3970": { - "op": "return", - "stack_out": [ - "role_address#0" - ] - }, - "3971": { - "block": "rbac_get_role_config_switch_case_4@6", - "stack_in": [ - "role_address#0" - ], - "op": "bytec 13 // 0x52373023", - "defined_out": [ - "0x52373023" - ], - "stack_out": [ - "role_address#0", - "0x52373023" - ] - }, - "3973": { - "op": "dig 1", - "defined_out": [ - "0x52373023", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "0x52373023", - "role_address#0" - ] - }, - "3975": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "3976": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "3977": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "3978": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "3980": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "3981": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%6#0", - "aggregate%box_get%7#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "aggregate%box_get%6#0", - "aggregate%box_get%7#0" - ] - }, - "3982": { - "op": "pop", - "defined_out": [ - "role_address#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "tmp%3#0" - ] - }, - "3983": { - "op": "b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9" - }, - "3986": { - "block": "rbac_get_role_config_switch_case_3@5", - "stack_in": [ - "role_address#0" - ], - "op": "bytec 20 // 0x52363023", - "defined_out": [ - "0x52363023" - ], - "stack_out": [ - "role_address#0", - "0x52363023" - ] - }, - "3988": { - "op": "dig 1", - "defined_out": [ - "0x52363023", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "0x52363023", - "role_address#0" - ] - }, - "3990": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "3991": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "3992": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "3993": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "3995": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "3996": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%4#0", - "aggregate%box_get%5#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "aggregate%box_get%4#0", - "aggregate%box_get%5#0" - ] - }, - "3997": { - "op": "pop", - "defined_out": [ - "role_address#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "tmp%3#0" - ] - }, - "3998": { - "op": "b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9" - }, - "4001": { - "block": "rbac_get_role_config_switch_case_2@4", - "stack_in": [ - "role_address#0" - ], - "op": "bytec 21 // 0x52353023", - "defined_out": [ - "0x52353023" - ], - "stack_out": [ - "role_address#0", - "0x52353023" - ] - }, - "4003": { - "op": "dig 1", - "defined_out": [ - "0x52353023", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "0x52353023", - "role_address#0" - ] - }, - "4005": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "4006": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "4007": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "4008": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "4010": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "4011": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%2#0", - "aggregate%box_get%3#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "aggregate%box_get%2#0", - "aggregate%box_get%3#0" - ] - }, - "4012": { - "op": "pop", - "defined_out": [ - "role_address#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "tmp%3#0" - ] - }, - "4013": { - "op": "b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9" - }, - "4016": { - "block": "rbac_get_role_config_switch_case_1@3", - "stack_in": [ - "role_address#0" - ], - "op": "bytec 14 // 0x52343023", - "defined_out": [ - "0x52343023" - ], - "stack_out": [ - "role_address#0", - "0x52343023" - ] - }, - "4018": { - "op": "dig 1", - "defined_out": [ - "0x52343023", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "0x52343023", - "role_address#0" - ] - }, - "4020": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "4021": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "4022": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "4023": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "4025": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "4026": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "4027": { - "op": "pop", - "defined_out": [ - "role_address#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "tmp%3#0" - ] - }, - "4028": { - "op": "b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9" - }, - "4031": { - "block": "rbac_get_role_config_switch_case_0@2", - "stack_in": [ - "role_address#0" - ], - "op": "pushbytes 0x00000000000000000000000000000000", - "defined_out": [ - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "tmp%3#0" - ] - }, - "4049": { - "op": "b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9" - }, - "4052": { - "subroutine": "modules.core_financial.coupon.FixedCouponCashflowMixin.count_due_coupons", - "params": {}, - "block": "count_due_coupons", - "stack_in": [], - "op": "proto 0 1" - }, - "4055": { - "op": "pushbytes \"\"", - "stack_out": [ - "coupon_idx#0" - ] - }, - "4057": { - "op": "global LatestTimestamp" - }, - "4059": { - "op": "dup" - }, - "4060": { - "op": "intc_0 // 0" - }, - "4061": { - "op": "bytec 29 // \"due_coupons_watermark\"", - "defined_out": [ - "\"due_coupons_watermark\"", - "0", - "current_ts#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "current_ts#0", - "0", - "\"due_coupons_watermark\"" - ] - }, - "4063": { - "op": "app_global_get_ex", - "defined_out": [ - "current_ts#0", - "due_coupons#0", - "maybe_exists%0#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "current_ts#0", - "due_coupons#0", - "maybe_exists%0#0" - ] - }, - "4064": { - "op": "swap", - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "current_ts#0", - "maybe_exists%0#0", - "due_coupons#0" - ] - }, - "4065": { - "op": "cover 2", - "defined_out": [ - "current_ts#0", - "due_coupons#0", - "maybe_exists%0#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "current_ts#0", - "maybe_exists%0#0" - ] - }, - "4067": { - "error": "check self.due_coupons_watermark exists", - "op": "assert // check self.due_coupons_watermark exists", - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "current_ts#0" - ] - }, - "4068": { - "op": "intc_0 // 0", - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "current_ts#0", - "0" - ] - }, - "4069": { - "op": "bytec 5 // \"maturity_date\"", - "defined_out": [ - "\"maturity_date\"", - "0", - "current_ts#0", - "due_coupons#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "current_ts#0", - "0", - "\"maturity_date\"" - ] - }, - "4071": { - "op": "app_global_get_ex", - "defined_out": [ - "current_ts#0", - "due_coupons#0", - "maybe_exists%1#0", - "maybe_value%1#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "current_ts#0", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "4072": { - "error": "check self.maturity_date exists", - "op": "assert // check self.maturity_date exists", - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "current_ts#0", - "maybe_value%1#0" - ] - }, - "4073": { - "op": ">=", - "defined_out": [ - "current_ts#0", - "due_coupons#0", - "tmp%1#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "tmp%1#0" - ] - }, - "4074": { - "op": "bz count_due_coupons_else_body@2", - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0" - ] - }, - "4077": { - "op": "intc_0 // 0", - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "0" - ] - }, - "4078": { - "op": "bytec 7 // \"total_coupons\"", - "defined_out": [ - "\"total_coupons\"", - "0", - "current_ts#0", - "due_coupons#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "0", - "\"total_coupons\"" - ] - }, - "4080": { - "op": "app_global_get_ex", - "defined_out": [ - "current_ts#0", - "due_coupons#0", - "maybe_exists%2#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "due_coupons#0", - "maybe_exists%2#0" - ] - }, - "4081": { - "op": "swap", - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "maybe_exists%2#0", - "due_coupons#0" - ] - }, - "4082": { - "op": "frame_bury 2", - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "maybe_exists%2#0" - ] - }, - "4084": { - "error": "check self.total_coupons exists", - "op": "assert // check self.total_coupons exists", - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0" - ] - }, - "4085": { - "block": "count_due_coupons_after_if_else@8", - "stack_in": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0" - ], - "op": "bytec 29 // \"due_coupons_watermark\"", - "defined_out": [ - "\"due_coupons_watermark\"" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "\"due_coupons_watermark\"" - ] - }, - "4087": { - "op": "frame_dig 2", - "defined_out": [ - "\"due_coupons_watermark\"", - "due_coupons#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "\"due_coupons_watermark\"", - "due_coupons#0" - ] - }, - "4089": { - "op": "dup", - "defined_out": [ - "\"due_coupons_watermark\"", - "due_coupons#0", - "due_coupons#0 (copy)" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "\"due_coupons_watermark\"", - "due_coupons#0 (copy)", - "due_coupons#0 (copy)" - ] - }, - "4090": { - "op": "cover 2", - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "due_coupons#0", - "\"due_coupons_watermark\"", - "due_coupons#0 (copy)" - ] - }, - "4092": { - "op": "app_global_put", - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "due_coupons#0" - ] - }, - "4093": { - "op": "frame_bury 0" - }, - "4095": { - "retsub": true, - "op": "retsub" - }, - "4096": { - "block": "count_due_coupons_else_body@2", - "stack_in": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "0" - ] - }, - "4097": { - "op": "bytec 4 // \"issuance_date\"", - "defined_out": [ - "\"issuance_date\"", - "0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "0", - "\"issuance_date\"" - ] - }, - "4099": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%3#0", - "maybe_value%3#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "maybe_value%3#0", - "maybe_exists%3#0" - ] - }, - "4100": { - "error": "check self.issuance_date exists", - "op": "assert // check self.issuance_date exists", - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "maybe_value%3#0" - ] - }, - "4101": { - "op": "frame_dig 1", - "defined_out": [ - "current_ts#0", - "maybe_value%3#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "maybe_value%3#0", - "current_ts#0" - ] - }, - "4103": { - "op": "<", - "defined_out": [ - "current_ts#0", - "tmp%2#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "tmp%2#0" - ] - }, - "4104": { - "op": "bz count_due_coupons_after_if_else@8", - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0" - ] - }, - "4107": { - "op": "intc_0 // 0", - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "0" - ] - }, - "4108": { - "op": "bytec 29 // \"due_coupons_watermark\"", - "defined_out": [ - "\"due_coupons_watermark\"", - "0", - "current_ts#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "0", - "\"due_coupons_watermark\"" - ] - }, - "4110": { - "op": "app_global_get_ex", - "defined_out": [ - "current_ts#0", - "maybe_exists%4#0", - "maybe_value%4#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "maybe_value%4#0", - "maybe_exists%4#0" - ] - }, - "4111": { - "error": "check self.due_coupons_watermark exists", - "op": "assert // check self.due_coupons_watermark exists", - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "maybe_value%4#0" - ] - }, - "4112": { - "op": "pushint 3", - "defined_out": [ - "3", - "current_ts#0", - "maybe_value%4#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "maybe_value%4#0", - "3" - ] - }, - "4114": { - "op": "+", - "defined_out": [ - "coupon_idx#0", - "current_ts#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "coupon_idx#0" - ] - }, - "4115": { - "op": "dup", - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "coupon_idx#0", - "coupon_idx#0" - ] - }, - "4116": { - "op": "frame_bury 0", - "defined_out": [ - "coupon_idx#0", - "current_ts#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "coupon_idx#0" - ] - }, - "4118": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "coupon_idx#0", - "current_ts#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "coupon_idx#0", - "8" - ] - }, - "4119": { - "op": "*", - "defined_out": [ - "box%element_offset%0#0", - "coupon_idx#0", - "current_ts#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "box%element_offset%0#0" - ] - }, - "4120": { - "op": "pushint 2", - "defined_out": [ - "2", - "box%element_offset%0#0", - "coupon_idx#0", - "current_ts#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "box%element_offset%0#0", - "2" - ] - }, - "4122": { - "op": "+", - "defined_out": [ - "box%offset%0#0", - "coupon_idx#0", - "current_ts#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "box%offset%0#0" - ] - }, - "4123": { - "op": "bytec 12 // 0x74696d654576656e7473", - "defined_out": [ - "0x74696d654576656e7473", - "box%offset%0#0", - "coupon_idx#0", - "current_ts#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "box%offset%0#0", - "0x74696d654576656e7473" - ] - }, - "4125": { - "op": "swap", - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "0x74696d654576656e7473", - "box%offset%0#0" - ] - }, - "4126": { - "op": "intc_3 // 8", - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "0x74696d654576656e7473", - "box%offset%0#0", - "8" - ] - }, - "4127": { - "op": "box_extract", - "defined_out": [ - "box%box_extract%0#0", - "coupon_idx#0", - "current_ts#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "box%box_extract%0#0" - ] - }, - "4128": { - "op": "btoi", - "defined_out": [ - "coupon_due_date#0", - "coupon_idx#0", - "current_ts#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "coupon_due_date#0" - ] - }, - "4129": { - "block": "count_due_coupons_while_top@4", - "stack_in": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "coupon_due_date#0" - ], - "op": "frame_dig 1", - "defined_out": [ - "current_ts#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "coupon_due_date#0", - "current_ts#0" - ] - }, - "4131": { - "op": "<=", - "defined_out": [ - "current_ts#0", - "tmp%4#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "tmp%4#0" - ] - }, - "4132": { - "op": "bz count_due_coupons_after_while@6", - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0" - ] - }, - "4135": { - "op": "intc 4 // 255", - "defined_out": [ - "255", - "current_ts#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "255" - ] - }, - "4137": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "255", - "current_ts#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "255", - "0" - ] - }, - "4138": { - "callsub": "_puya_lib.util.ensure_budget", - "op": "callsub ensure_budget", - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0" - ] - }, - "4141": { - "op": "frame_dig 0", - "defined_out": [ - "coupon_idx#0", - "current_ts#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "coupon_idx#0" - ] - }, - "4143": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "coupon_idx#0", - "current_ts#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "coupon_idx#0", - "1" - ] - }, - "4144": { - "op": "+", - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "coupon_idx#0" - ] - }, - "4145": { - "op": "dup", - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "coupon_idx#0", - "coupon_idx#0" - ] - }, - "4146": { - "op": "frame_bury 0", - "defined_out": [ - "coupon_idx#0", - "current_ts#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "coupon_idx#0" - ] - }, - "4148": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "coupon_idx#0", - "current_ts#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "coupon_idx#0", - "8" - ] - }, - "4149": { - "op": "*", - "defined_out": [ - "box%element_offset%1#0", - "coupon_idx#0", - "current_ts#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "box%element_offset%1#0" - ] - }, - "4150": { - "op": "pushint 2", - "defined_out": [ - "2", - "box%element_offset%1#0", - "coupon_idx#0", - "current_ts#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "box%element_offset%1#0", - "2" - ] - }, - "4152": { - "op": "+", - "defined_out": [ - "box%offset%1#0", - "coupon_idx#0", - "current_ts#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "box%offset%1#0" - ] - }, - "4153": { - "op": "bytec 12 // 0x74696d654576656e7473", - "defined_out": [ - "0x74696d654576656e7473", - "box%offset%1#0", - "coupon_idx#0", - "current_ts#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "box%offset%1#0", - "0x74696d654576656e7473" - ] - }, - "4155": { - "op": "swap", - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "0x74696d654576656e7473", - "box%offset%1#0" - ] - }, - "4156": { - "op": "intc_3 // 8", - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "0x74696d654576656e7473", - "box%offset%1#0", - "8" - ] - }, - "4157": { - "op": "box_extract", - "defined_out": [ - "box%box_extract%1#0", - "coupon_idx#0", - "current_ts#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "box%box_extract%1#0" - ] - }, - "4158": { - "op": "btoi", - "defined_out": [ - "coupon_due_date#0", - "coupon_idx#0", - "current_ts#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "coupon_due_date#0" - ] - }, - "4159": { - "op": "b count_due_coupons_while_top@4" - }, - "4162": { - "block": "count_due_coupons_after_while@6", - "stack_in": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0" - ], - "op": "frame_dig 0", - "defined_out": [ - "coupon_idx#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "coupon_idx#0" - ] - }, - "4164": { - "op": "pushint 3", - "defined_out": [ - "3", - "coupon_idx#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "coupon_idx#0", - "3" - ] - }, - "4166": { - "op": "-", - "defined_out": [ - "coupon_idx#0", - "due_coupons#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "due_coupons#0" - ] - }, - "4167": { - "op": "frame_bury 2", - "defined_out": [ - "coupon_idx#0", - "due_coupons#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0" - ] - }, - "4169": { - "op": "b count_due_coupons_after_if_else@8" - }, - "4172": { - "subroutine": "modules.core_financial.coupon.FixedCouponCashflowMixin.coupon_due_date", - "params": { - "coupon#0": "uint64" - }, - "block": "coupon_due_date", - "stack_in": [], - "op": "proto 1 1" - }, - "4175": { - "op": "pushint 3", - "defined_out": [ - "3" - ], - "stack_out": [ - "3" - ] - }, - "4177": { - "op": "frame_dig -1", - "defined_out": [ - "3", - "coupon#0 (copy)" - ], - "stack_out": [ - "3", - "coupon#0 (copy)" - ] - }, - "4179": { - "op": "+", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "4180": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "1" - ] - }, - "4181": { - "op": "-", - "defined_out": [ - "tmp%1#0" - ], - "stack_out": [ - "tmp%1#0" - ] - }, - "4182": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "tmp%1#0" - ], - "stack_out": [ - "tmp%1#0", - "8" - ] - }, - "4183": { - "op": "*", - "defined_out": [ - "box%element_offset%0#0" - ], - "stack_out": [ - "box%element_offset%0#0" - ] - }, - "4184": { - "op": "pushint 2", - "defined_out": [ - "2", - "box%element_offset%0#0" - ], - "stack_out": [ - "box%element_offset%0#0", - "2" - ] - }, - "4186": { - "op": "+", - "defined_out": [ - "box%offset%0#0" - ], - "stack_out": [ - "box%offset%0#0" - ] - }, - "4187": { - "op": "bytec 12 // 0x74696d654576656e7473", - "defined_out": [ - "0x74696d654576656e7473", - "box%offset%0#0" - ], - "stack_out": [ - "box%offset%0#0", - "0x74696d654576656e7473" - ] - }, - "4189": { - "op": "swap", - "stack_out": [ - "0x74696d654576656e7473", - "box%offset%0#0" - ] - }, - "4190": { - "op": "intc_3 // 8", - "stack_out": [ - "0x74696d654576656e7473", - "box%offset%0#0", - "8" - ] - }, - "4191": { - "op": "box_extract", - "defined_out": [ - "box%box_extract%0#0" - ], - "stack_out": [ - "box%box_extract%0#0" - ] - }, - "4192": { - "op": "btoi", - "defined_out": [ - "values%0#0" - ], - "stack_out": [ - "values%0#0" - ] - }, - "4193": { - "retsub": true, - "op": "retsub" - }, - "4194": { - "subroutine": "modules.core_financial.coupon.FixedCouponCashflowMixin.next_coupon_due_date", - "params": { - "due_coupons#0": "uint64" - }, - "block": "next_coupon_due_date", - "stack_in": [], - "op": "proto 1 1" - }, - "4197": { - "op": "intc_0 // 0" - }, - "4198": { - "op": "dup" - }, - "4199": { - "op": "bytec 7 // \"total_coupons\"", - "defined_out": [ - "\"total_coupons\"", - "0", - "coupon_due_date#0" - ], - "stack_out": [ - "coupon_due_date#0", - "0", - "\"total_coupons\"" - ] - }, - "4201": { - "op": "app_global_get_ex", - "defined_out": [ - "coupon_due_date#0", - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "coupon_due_date#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "4202": { - "error": "check self.total_coupons exists", - "op": "assert // check self.total_coupons exists", - "stack_out": [ - "coupon_due_date#0", - "maybe_value%0#0" - ] - }, - "4203": { - "op": "frame_dig -1", - "defined_out": [ - "coupon_due_date#0", - "due_coupons#0 (copy)", - "maybe_value%0#0" - ], - "stack_out": [ - "coupon_due_date#0", - "maybe_value%0#0", - "due_coupons#0 (copy)" - ] - }, - "4205": { - "op": ">", - "defined_out": [ - "coupon_due_date#0", - "tmp%0#0" - ], - "stack_out": [ - "coupon_due_date#0", - "tmp%0#0" - ] - }, - "4206": { - "op": "bz next_coupon_due_date_after_if_else@2", - "stack_out": [ - "coupon_due_date#0" - ] - }, - "4209": { - "op": "frame_dig -1", - "stack_out": [ - "coupon_due_date#0", - "due_coupons#0 (copy)" - ] - }, - "4211": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "coupon_due_date#0", - "due_coupons#0 (copy)" - ], - "stack_out": [ - "coupon_due_date#0", - "due_coupons#0 (copy)", - "1" - ] - }, - "4212": { - "op": "+", - "defined_out": [ - "coupon_due_date#0", - "tmp%1#0" - ], - "stack_out": [ - "coupon_due_date#0", - "tmp%1#0" - ] - }, - "4213": { - "callsub": "modules.core_financial.coupon.FixedCouponCashflowMixin.coupon_due_date", - "op": "callsub coupon_due_date", - "stack_out": [ - "coupon_due_date#0", - "coupon_due_date#0" - ] - }, - "4216": { - "op": "frame_bury 0", - "stack_out": [ - "coupon_due_date#0" - ] - }, - "4218": { - "block": "next_coupon_due_date_after_if_else@2", - "stack_in": [ - "coupon_due_date#0" - ], - "op": "frame_dig 0", - "defined_out": [ - "coupon_due_date#0" - ], - "stack_out": [ - "coupon_due_date#0", - "coupon_due_date#0" - ] - }, - "4220": { - "op": "swap" - }, - "4221": { - "retsub": true, - "op": "retsub" - }, - "4222": { - "subroutine": "modules.core_financial.coupon.FixedCouponCashflowMixin.coupon_interest_amount", - "params": { - "principal_amount#0": "uint64", - "coupon#0": "uint64" - }, - "block": "coupon_interest_amount", - "stack_in": [], - "op": "proto 2 1" - }, - "4225": { - "op": "frame_dig -1", - "defined_out": [ - "coupon#0 (copy)" - ], - "stack_out": [ - "coupon#0 (copy)" - ] - }, - "4227": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "coupon#0 (copy)" - ], - "stack_out": [ - "coupon#0 (copy)", - "1" - ] - }, - "4228": { - "op": "-", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "4229": { - "op": "pushint 2", - "defined_out": [ - "2", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "2" - ] - }, - "4231": { - "op": "*", - "defined_out": [ - "box%element_offset%0#0" - ], - "stack_out": [ - "box%element_offset%0#0" - ] - }, - "4232": { - "op": "pushint 2", - "stack_out": [ - "box%element_offset%0#0", - "2" - ] - }, - "4234": { - "op": "+", - "defined_out": [ - "box%offset%0#0" - ], - "stack_out": [ - "box%offset%0#0" - ] - }, - "4235": { - "op": "bytec 19 // 0x636f75706f6e5261746573", - "defined_out": [ - "0x636f75706f6e5261746573", - "box%offset%0#0" - ], - "stack_out": [ - "box%offset%0#0", - "0x636f75706f6e5261746573" - ] - }, - "4237": { - "op": "swap", - "stack_out": [ - "0x636f75706f6e5261746573", - "box%offset%0#0" - ] - }, - "4238": { - "op": "pushint 2", - "stack_out": [ - "0x636f75706f6e5261746573", - "box%offset%0#0", - "2" - ] - }, - "4240": { - "op": "box_extract", - "defined_out": [ - "box%box_extract%0#0" - ], - "stack_out": [ - "box%box_extract%0#0" - ] - }, - "4241": { - "op": "btoi", - "defined_out": [ - "coupon_rate_bps#0" - ], - "stack_out": [ - "coupon_rate_bps#0" - ] - }, - "4242": { - "op": "frame_dig -2", - "defined_out": [ - "coupon_rate_bps#0", - "principal_amount#0 (copy)" - ], - "stack_out": [ - "coupon_rate_bps#0", - "principal_amount#0 (copy)" - ] - }, - "4244": { - "op": "*", - "defined_out": [ - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0" - ] - }, - "4245": { - "op": "pushint 10000", - "defined_out": [ - "10000", - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0", - "10000" - ] - }, - "4248": { - "op": "/", - "defined_out": [ - "tmp%3#0" - ], - "stack_out": [ - "tmp%3#0" - ] - }, - "4249": { - "retsub": true, - "op": "retsub" - }, - "4250": { - "subroutine": "modules.core_financial.coupon.FixedCouponCashflowMixin.day_count_factor", - "params": { - "due_coupons#0": "uint64" - }, - "block": "day_count_factor", - "stack_in": [], - "op": "proto 1 1" - }, - "4253": { - "op": "pushbytes \"\"", - "stack_out": [ - "coupon_accrued_period#0" - ] - }, - "4255": { - "op": "dup", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0" - ] - }, - "4256": { - "op": "frame_dig -1", - "defined_out": [ - "due_coupons#0 (copy)" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "due_coupons#0 (copy)" - ] - }, - "4258": { - "op": "bnz day_count_factor_else_body@2", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0" - ] - }, - "4261": { - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "0" - ] - }, - "4262": { - "op": "bytec 4 // \"issuance_date\"", - "defined_out": [ - "\"issuance_date\"", - "0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "0", - "\"issuance_date\"" - ] - }, - "4264": { - "op": "app_global_get_ex", - "defined_out": [ - "accruing_start_time#0", - "maybe_exists%0#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "accruing_start_time#0", - "maybe_exists%0#0" - ] - }, - "4265": { - "error": "check self.issuance_date exists", - "op": "assert // check self.issuance_date exists", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "accruing_start_time#0" - ] - }, - "4266": { - "block": "day_count_factor_after_if_else@3", - "stack_in": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "accruing_start_time#0" - ], - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%2#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "accruing_start_time#0", - "tmp%2#0" - ] - }, - "4268": { - "op": "dig 1", - "defined_out": [ - "accruing_start_time#0", - "accruing_start_time#0 (copy)", - "tmp%2#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "accruing_start_time#0", - "tmp%2#0", - "accruing_start_time#0 (copy)" - ] - }, - "4270": { - "op": "-", - "defined_out": [ - "accruing_start_time#0", - "coupon_accrued_period#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "accruing_start_time#0", - "coupon_accrued_period#0" - ] - }, - "4271": { - "op": "frame_bury 0", - "defined_out": [ - "accruing_start_time#0", - "coupon_accrued_period#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "accruing_start_time#0" - ] - }, - "4273": { - "op": "frame_dig -1", - "defined_out": [ - "accruing_start_time#0", - "coupon_accrued_period#0", - "due_coupons#0 (copy)" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "accruing_start_time#0", - "due_coupons#0 (copy)" - ] - }, - "4275": { - "callsub": "modules.core_financial.coupon.FixedCouponCashflowMixin.next_coupon_due_date", - "op": "callsub next_coupon_due_date", - "defined_out": [ - "accruing_start_time#0", - "coupon_accrued_period#0", - "tmp%4#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "accruing_start_time#0", - "tmp%4#0" - ] - }, - "4278": { - "op": "swap", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "tmp%4#0", - "accruing_start_time#0" - ] - }, - "4279": { - "op": "-", - "defined_out": [ - "coupon_accrued_period#0", - "coupon_period#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "coupon_period#0" - ] - }, - "4280": { - "op": "intc_0 // 0", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "coupon_period#0", - "0" - ] - }, - "4281": { - "op": "bytec 17 // \"day_count_convention\"", - "defined_out": [ - "\"day_count_convention\"", - "0", - "coupon_accrued_period#0", - "coupon_period#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "coupon_period#0", - "0", - "\"day_count_convention\"" - ] - }, - "4283": { - "op": "app_global_get_ex", - "defined_out": [ - "coupon_accrued_period#0", - "coupon_period#0", - "maybe_exists%1#0", - "maybe_value%1#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "coupon_period#0", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "4284": { - "error": "check self.day_count_convention exists", - "op": "assert // check self.day_count_convention exists", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "coupon_period#0", - "maybe_value%1#0" - ] - }, - "4285": { - "op": "bnz day_count_factor_after_if_else@5", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "coupon_period#0" - ] - }, - "4288": { - "op": "frame_dig 0", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "coupon_period#0", - "coupon_accrued_period#0" - ] - }, - "4290": { - "op": "intc 6 // 86400", - "defined_out": [ - "86400", - "coupon_accrued_period#0", - "coupon_period#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "coupon_period#0", - "coupon_accrued_period#0", - "86400" - ] - }, - "4292": { - "op": "/", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "coupon_period#0", - "coupon_accrued_period#0" - ] - }, - "4293": { - "op": "frame_bury 0", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "coupon_period#0" - ] - }, - "4295": { - "op": "intc 6 // 86400", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "coupon_period#0", - "86400" - ] - }, - "4297": { - "op": "/", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "coupon_period#0" - ] - }, - "4298": { - "block": "day_count_factor_after_if_else@5", - "stack_in": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "coupon_period#0" - ], - "op": "frame_dig 0", - "defined_out": [ - "coupon_accrued_period#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "coupon_period#0", - "coupon_accrued_period#0" - ] - }, - "4300": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "coupon_accrued_period#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "coupon_period#0", - "aggregate%val_as_bytes%0#0" - ] - }, - "4301": { - "op": "swap", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "coupon_accrued_period#0", - "coupon_period#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "aggregate%val_as_bytes%0#0", - "coupon_period#0" - ] - }, - "4302": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0", - "coupon_accrued_period#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0" - ] - }, - "4303": { - "op": "concat", - "defined_out": [ - "aggregate%head%1#0", - "coupon_accrued_period#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "aggregate%head%1#0" - ] - }, - "4304": { - "op": "frame_bury 0" - }, - "4306": { - "retsub": true, - "op": "retsub" - }, - "4307": { - "block": "day_count_factor_else_body@2", - "stack_in": [ - "coupon_accrued_period#0", - "coupon_due_date#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "coupon_due_date#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "coupon_due_date#0" - ] - }, - "4308": { - "op": "frame_bury 1", - "defined_out": [ - "coupon_due_date#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0" - ] - }, - "4310": { - "op": "frame_dig -1", - "defined_out": [ - "coupon_due_date#0", - "due_coupons#0 (copy)" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "due_coupons#0 (copy)" - ] - }, - "4312": { - "op": "bz day_count_factor_after_if_else@8", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0" - ] - }, - "4315": { - "op": "frame_dig -1", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "due_coupons#0 (copy)" - ] - }, - "4317": { - "callsub": "modules.core_financial.coupon.FixedCouponCashflowMixin.coupon_due_date", - "op": "callsub coupon_due_date", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "coupon_due_date#0" - ] - }, - "4320": { - "op": "frame_bury 1", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0" - ] - }, - "4322": { - "block": "day_count_factor_after_if_else@8", - "stack_in": [ - "coupon_accrued_period#0", - "coupon_due_date#0" - ], - "op": "frame_dig 1", - "defined_out": [ - "accruing_start_time#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "accruing_start_time#0" - ] - }, - "4324": { - "op": "b day_count_factor_after_if_else@3" - }, - "4327": { - "subroutine": "modules.core_financial.coupon.FixedCouponCashflowMixin.is_accruing_interest", - "params": { - "due_coupons#0": "uint64" - }, - "block": "is_accruing_interest", - "stack_in": [], - "op": "proto 1 1" - }, - "4330": { - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "0" - ] - }, - "4331": { - "op": "bytec 4 // \"issuance_date\"", - "defined_out": [ - "\"issuance_date\"", - "0" - ], - "stack_out": [ - "0", - "\"issuance_date\"" - ] - }, - "4333": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "4334": { - "error": "check self.issuance_date exists", - "op": "assert // check self.issuance_date exists", - "stack_out": [ - "maybe_value%0#0" - ] - }, - "4335": { - "op": "bz is_accruing_interest_bool_false@4", - "stack_out": [] - }, - "4338": { - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%1#0" - ], - "stack_out": [ - "tmp%1#0" - ] - }, - "4340": { - "op": "intc_0 // 0", - "stack_out": [ - "tmp%1#0", - "0" - ] - }, - "4341": { - "op": "bytec 4 // \"issuance_date\"", - "stack_out": [ - "tmp%1#0", - "0", - "\"issuance_date\"" - ] - }, - "4343": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%1#0", - "maybe_value%1#0", - "tmp%1#0" - ], - "stack_out": [ - "tmp%1#0", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "4344": { - "error": "check self.issuance_date exists", - "op": "assert // check self.issuance_date exists", - "stack_out": [ - "tmp%1#0", - "maybe_value%1#0" - ] - }, - "4345": { - "op": ">=", - "defined_out": [ - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0" - ] - }, - "4346": { - "op": "bz is_accruing_interest_bool_false@4", - "stack_out": [] - }, - "4349": { - "op": "intc_0 // 0", - "stack_out": [ - "0" - ] - }, - "4350": { - "op": "bytec 7 // \"total_coupons\"", - "defined_out": [ - "\"total_coupons\"", - "0" - ], - "stack_out": [ - "0", - "\"total_coupons\"" - ] - }, - "4352": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%2#0", - "maybe_value%2#0" - ], - "stack_out": [ - "maybe_value%2#0", - "maybe_exists%2#0" - ] - }, - "4353": { - "error": "check self.total_coupons exists", - "op": "assert // check self.total_coupons exists", - "stack_out": [ - "maybe_value%2#0" - ] - }, - "4354": { - "op": "frame_dig -1", - "defined_out": [ - "due_coupons#0 (copy)", - "maybe_value%2#0" - ], - "stack_out": [ - "maybe_value%2#0", - "due_coupons#0 (copy)" - ] - }, - "4356": { - "op": ">", - "defined_out": [ - "tmp%3#0" - ], - "stack_out": [ - "tmp%3#0" - ] - }, - "4357": { - "op": "bz is_accruing_interest_bool_false@4", - "stack_out": [] - }, - "4360": { - "op": "intc_1 // 1", - "defined_out": [ - "and_result%0#0" - ], - "stack_out": [ - "and_result%0#0" - ] - }, - "4361": { - "retsub": true, - "op": "retsub" - }, - "4362": { - "block": "is_accruing_interest_bool_false@4", - "stack_in": [], - "op": "intc_0 // 0", - "defined_out": [ - "and_result%0#0" - ], - "stack_out": [ - "and_result%0#0" - ] - }, - "4363": { - "retsub": true, - "op": "retsub" - }, - "4364": { - "subroutine": "modules.core_financial.coupon.FixedCouponCashflowMixin.accrued_interest_amount", - "params": { - "holding_address#0": "bytes", - "units#0": "uint64", - "due_coupons#0": "uint64" - }, - "block": "accrued_interest_amount", - "stack_in": [], - "op": "proto 3 1" - }, - "4367": { - "op": "frame_dig -3", - "defined_out": [ - "holding_address#0 (copy)" - ], - "stack_out": [ - "holding_address#0 (copy)" - ] - }, - "4369": { - "op": "frame_dig -1", - "defined_out": [ - "due_coupons#0 (copy)", - "holding_address#0 (copy)" - ], - "stack_out": [ - "holding_address#0 (copy)", - "due_coupons#0 (copy)" - ] - }, - "4371": { - "callsub": "modules.core_financial.coupon.CouponCashflowMixin.assert_no_pending_coupon_payment", - "op": "callsub assert_no_pending_coupon_payment", - "stack_out": [] - }, - "4374": { - "op": "frame_dig -1", - "stack_out": [ - "due_coupons#0 (copy)" - ] - }, - "4376": { - "callsub": "modules.core_financial.coupon.FixedCouponCashflowMixin.day_count_factor", - "op": "callsub day_count_factor", - "defined_out": [ - "day_count_factor#0" - ], - "stack_out": [ - "day_count_factor#0" - ] - }, - "4379": { - "op": "dup", - "defined_out": [ - "day_count_factor#0", - "day_count_factor#0 (copy)" - ], - "stack_out": [ - "day_count_factor#0", - "day_count_factor#0 (copy)" - ] - }, - "4380": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "day_count_factor#0", - "day_count_factor#0 (copy)" - ], - "stack_out": [ - "day_count_factor#0", - "day_count_factor#0 (copy)", - "0" - ] - }, - "4381": { - "op": "extract_uint64", - "defined_out": [ - "coupon_accrued_period#0", - "day_count_factor#0" - ], - "stack_out": [ - "day_count_factor#0", - "coupon_accrued_period#0" - ] - }, - "4382": { - "op": "swap", - "stack_out": [ - "coupon_accrued_period#0", - "day_count_factor#0" - ] - }, - "4383": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "coupon_accrued_period#0", - "day_count_factor#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "day_count_factor#0", - "8" - ] - }, - "4384": { - "op": "extract_uint64", - "defined_out": [ - "coupon_accrued_period#0", - "coupon_period#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_period#0" - ] - }, - "4385": { - "op": "frame_dig -1", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_period#0", - "due_coupons#0 (copy)" - ] - }, - "4387": { - "op": "pushint 2", - "defined_out": [ - "2", - "coupon_accrued_period#0", - "coupon_period#0", - "due_coupons#0 (copy)" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_period#0", - "due_coupons#0 (copy)", - "2" - ] - }, - "4389": { - "op": "*", - "defined_out": [ - "box%element_offset%0#0", - "coupon_accrued_period#0", - "coupon_period#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_period#0", - "box%element_offset%0#0" - ] - }, - "4390": { - "op": "pushint 2", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_period#0", - "box%element_offset%0#0", - "2" - ] - }, - "4392": { - "op": "+", - "defined_out": [ - "box%offset%0#0", - "coupon_accrued_period#0", - "coupon_period#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_period#0", - "box%offset%0#0" - ] - }, - "4393": { - "op": "bytec 19 // 0x636f75706f6e5261746573", - "defined_out": [ - "0x636f75706f6e5261746573", - "box%offset%0#0", - "coupon_accrued_period#0", - "coupon_period#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_period#0", - "box%offset%0#0", - "0x636f75706f6e5261746573" - ] - }, - "4395": { - "op": "swap", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_period#0", - "0x636f75706f6e5261746573", - "box%offset%0#0" - ] - }, - "4396": { - "op": "pushint 2", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_period#0", - "0x636f75706f6e5261746573", - "box%offset%0#0", - "2" - ] - }, - "4398": { - "op": "box_extract", - "defined_out": [ - "box%box_extract%0#0", - "coupon_accrued_period#0", - "coupon_period#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_period#0", - "box%box_extract%0#0" - ] - }, - "4399": { - "op": "btoi", - "defined_out": [ - "coupon_accrued_period#0", - "coupon_period#0", - "next_coupon_rate_bps#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_period#0", - "next_coupon_rate_bps#0" - ] - }, - "4400": { - "op": "frame_dig -3", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_period#0", - "next_coupon_rate_bps#0", - "holding_address#0 (copy)" - ] - }, - "4402": { - "op": "frame_dig -2", - "defined_out": [ - "coupon_accrued_period#0", - "coupon_period#0", - "holding_address#0 (copy)", - "next_coupon_rate_bps#0", - "units#0 (copy)" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_period#0", - "next_coupon_rate_bps#0", - "holding_address#0 (copy)", - "units#0 (copy)" - ] - }, - "4404": { - "callsub": "modules.accounting.AccountingModule.account_units_value", - "op": "callsub account_units_value", - "defined_out": [ - "coupon_accrued_period#0", - "coupon_period#0", - "next_coupon_rate_bps#0", - "tmp%2#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_period#0", - "next_coupon_rate_bps#0", - "tmp%2#0" - ] - }, - "4407": { - "op": "*", - "defined_out": [ - "coupon_accrued_period#0", - "coupon_period#0", - "tmp%3#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_period#0", - "tmp%3#0" - ] - }, - "4408": { - "op": "uncover 2", - "stack_out": [ - "coupon_period#0", - "tmp%3#0", - "coupon_accrued_period#0" - ] - }, - "4410": { - "op": "*", - "defined_out": [ - "coupon_period#0", - "tmp%4#0" - ], - "stack_out": [ - "coupon_period#0", - "tmp%4#0" - ] - }, - "4411": { - "op": "pushint 10000", - "defined_out": [ - "10000", - "coupon_period#0", - "tmp%4#0" - ], - "stack_out": [ - "coupon_period#0", - "tmp%4#0", - "10000" - ] - }, - "4414": { - "op": "uncover 2", - "stack_out": [ - "tmp%4#0", - "10000", - "coupon_period#0" - ] - }, - "4416": { - "op": "*", - "defined_out": [ - "tmp%4#0", - "tmp%5#0" - ], - "stack_out": [ - "tmp%4#0", - "tmp%5#0" - ] - }, - "4417": { - "op": "/", - "defined_out": [ - "tmp%6#0" - ], - "stack_out": [ - "tmp%6#0" - ] - }, - "4418": { - "retsub": true, - "op": "retsub" - }, - "4419": { - "subroutine": "modules.core_financial.coupon.CouponCashflowMixin.all_due_coupons_paid", - "params": { - "due_coupons#0": "uint64" - }, - "block": "all_due_coupons_paid", - "stack_in": [], - "op": "proto 1 1" - }, - "4422": { - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "0" - ] - }, - "4423": { - "op": "bytec 28 // \"paid_coupon_units\"", - "defined_out": [ - "\"paid_coupon_units\"", - "0" - ], - "stack_out": [ - "0", - "\"paid_coupon_units\"" - ] - }, - "4425": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "4426": { - "error": "check self.paid_coupon_units exists", - "op": "assert // check self.paid_coupon_units exists", - "stack_out": [ - "maybe_value%0#0" - ] - }, - "4427": { - "op": "intc_0 // 0", - "stack_out": [ - "maybe_value%0#0", - "0" - ] - }, - "4428": { - "op": "bytec_3 // \"circulating_units\"", - "defined_out": [ - "\"circulating_units\"", - "0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "0", - "\"circulating_units\"" - ] - }, - "4429": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%1#0", - "maybe_value%0#0", - "maybe_value%1#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "4430": { - "error": "check self.circulating_units exists", - "op": "assert // check self.circulating_units exists", - "stack_out": [ - "maybe_value%0#0", - "maybe_value%1#0" - ] - }, - "4431": { - "op": "frame_dig -1", - "defined_out": [ - "due_coupons#0 (copy)", - "maybe_value%0#0", - "maybe_value%1#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_value%1#0", - "due_coupons#0 (copy)" - ] - }, - "4433": { - "op": "*", - "defined_out": [ - "maybe_value%0#0", - "tmp%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "tmp%0#0" - ] - }, - "4434": { - "op": ">=", - "defined_out": [ - "tmp%1#0" - ], - "stack_out": [ - "tmp%1#0" - ] - }, - "4435": { - "retsub": true, - "op": "retsub" - }, - "4436": { - "subroutine": "modules.core_financial.coupon.CouponCashflowMixin.assert_no_pending_coupon_payment", - "params": { - "holding_address#0": "bytes", - "due_coupons#0": "uint64" - }, - "block": "assert_no_pending_coupon_payment", - "stack_in": [], - "op": "proto 2 0" - }, - "4439": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023" - ], - "stack_out": [ - "0x52333023" - ] - }, - "4440": { - "op": "frame_dig -2", - "defined_out": [ - "0x52333023", - "holding_address#0 (copy)" - ], - "stack_out": [ - "0x52333023", - "holding_address#0 (copy)" - ] - }, - "4442": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0" - ] - }, - "4443": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ], - "stack_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "4444": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%box_get%0#0" - ] - }, - "4445": { - "op": "pushint 48", - "defined_out": [ - "48", - "aggregate%box_get%0#0" - ], - "stack_out": [ - "aggregate%box_get%0#0", - "48" - ] - }, - "4447": { - "op": "extract_uint64", - "defined_out": [ - "values%0#0" - ], - "stack_out": [ - "values%0#0" - ] - }, - "4448": { - "op": "frame_dig -1", - "defined_out": [ - "due_coupons#0 (copy)", - "values%0#0" - ], - "stack_out": [ - "values%0#0", - "due_coupons#0 (copy)" - ] - }, - "4450": { - "op": "==", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "4451": { - "error": "Pending due coupon payment", - "op": "assert // Pending due coupon payment", - "stack_out": [] - }, - "4452": { - "retsub": true, - "op": "retsub" - }, - "4453": { - "subroutine": "modules.payment_agent.common.PaymentAgentCommonMixin.assert_payment_authorization", - "params": { - "holding_address#0": "bytes" - }, - "block": "assert_payment_authorization", - "stack_in": [], - "op": "proto 1 0" - }, - "4456": { - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "0" - ] - }, - "4457": { - "op": "bytec 22 // 0x52323523", - "defined_out": [ - "0", - "0x52323523" - ], - "stack_out": [ - "0", - "0x52323523" - ] - }, - "4459": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "4460": { - "error": "check self.op_daemon exists", - "op": "assert // check self.op_daemon exists", - "stack_out": [ - "maybe_value%0#0" - ] - }, - "4461": { - "op": "global ZeroAddress", - "defined_out": [ - "maybe_value%0#0", - "tmp%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "tmp%0#0" - ] - }, - "4463": { - "op": "!=", - "defined_out": [ - "tmp%1#0" - ], - "stack_out": [ - "tmp%1#0" - ] - }, - "4464": { - "op": "bz assert_payment_authorization_after_if_else@7", - "stack_out": [] - }, - "4467": { - "op": "txn Sender", - "defined_out": [ - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0" - ] - }, - "4469": { - "op": "intc_0 // 0", - "stack_out": [ - "tmp%2#0", - "0" - ] - }, - "4470": { - "op": "bytec 22 // 0x52323523", - "stack_out": [ - "tmp%2#0", - "0", - "0x52323523" - ] - }, - "4472": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%1#0", - "maybe_value%1#0", - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "4473": { - "error": "check self.op_daemon exists", - "op": "assert // check self.op_daemon exists", - "stack_out": [ - "tmp%2#0", - "maybe_value%1#0" - ] - }, - "4474": { - "op": "==", - "defined_out": [ - "tmp%3#0" - ], - "stack_out": [ - "tmp%3#0" - ] - }, - "4475": { - "op": "bnz assert_payment_authorization_bool_true@4", - "stack_out": [] - }, - "4478": { - "op": "txn Sender", - "defined_out": [ - "tmp%4#0" - ], - "stack_out": [ - "tmp%4#0" - ] - }, - "4480": { - "op": "frame_dig -1", - "defined_out": [ - "holding_address#0 (copy)", - "tmp%4#0" - ], - "stack_out": [ - "tmp%4#0", - "holding_address#0 (copy)" - ] - }, - "4482": { - "op": "==", - "defined_out": [ - "tmp%5#0" - ], - "stack_out": [ - "tmp%5#0" - ] - }, - "4483": { - "op": "bnz assert_payment_authorization_bool_true@4", - "stack_out": [] - }, - "4486": { - "op": "txn Sender", - "defined_out": [ - "tmp%6#0" - ], - "stack_out": [ - "tmp%6#0" - ] - }, - "4488": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023", - "tmp%6#0" - ], - "stack_out": [ - "tmp%6#0", - "0x52333023" - ] - }, - "4489": { - "op": "frame_dig -1", - "stack_out": [ - "tmp%6#0", - "0x52333023", - "holding_address#0 (copy)" - ] - }, - "4491": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#0", - "tmp%6#0" - ], - "stack_out": [ - "tmp%6#0", - "box_prefixed_key%0#0" - ] - }, - "4492": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0", - "tmp%6#0" - ], - "stack_out": [ - "tmp%6#0", - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "4493": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "tmp%6#0", - "aggregate%box_get%0#0" - ] - }, - "4494": { - "op": "extract 0 32", - "defined_out": [ - "aggregate%extract%0#0", - "tmp%6#0" - ], - "stack_out": [ - "tmp%6#0", - "aggregate%extract%0#0" - ] - }, - "4497": { - "op": "==", - "defined_out": [ - "tmp%7#0" - ], - "stack_out": [ - "tmp%7#0" - ] - }, - "4498": { - "op": "bz assert_payment_authorization_bool_false@5", - "stack_out": [] - }, - "4501": { - "block": "assert_payment_authorization_bool_true@4", - "stack_in": [], - "op": "intc_1 // 1", - "defined_out": [ - "or_result%0#0" - ], - "stack_out": [ - "or_result%0#0" - ] - }, - "4502": { - "error": "Not authorized", - "block": "assert_payment_authorization_bool_merge@6", - "stack_in": [ - "or_result%0#0" - ], - "op": "assert // Not authorized", - "defined_out": [], - "stack_out": [] - }, - "4503": { - "block": "assert_payment_authorization_after_if_else@7", - "stack_in": [], - "retsub": true, - "op": "retsub" - }, - "4504": { - "block": "assert_payment_authorization_bool_false@5", - "stack_in": [], - "op": "intc_0 // 0", - "defined_out": [ - "or_result%0#0" - ], - "stack_out": [ - "or_result%0#0" - ] - }, - "4505": { - "op": "b assert_payment_authorization_bool_merge@6" - }, - "4508": { - "subroutine": "modules.payment_agent.common.PaymentAgentCommonMixin.is_payment_executable", - "params": { - "holding_address#0": "bytes" - }, - "block": "is_payment_executable", - "stack_in": [], - "op": "proto 1 1" - }, - "4511": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023" - ], - "stack_out": [ - "0x52333023" - ] - }, - "4512": { - "op": "frame_dig -1", - "defined_out": [ - "0x52333023", - "holding_address#0 (copy)" - ], - "stack_out": [ - "0x52333023", - "holding_address#0 (copy)" - ] - }, - "4514": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0" - ] - }, - "4515": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0", - "box_prefixed_key%0#0" - ] - }, - "4516": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0", - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "4517": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%box_get%0#0" - ] - }, - "4518": { - "op": "extract 0 32", - "defined_out": [ - "aggregate%extract%0#0", - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%extract%0#0" - ] - }, - "4521": { - "op": "intc_0 // 0", - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%extract%0#0", - "0" - ] - }, - "4522": { - "op": "bytec 9 // \"settlement_asset_id\"", - "defined_out": [ - "\"settlement_asset_id\"", - "0", - "aggregate%extract%0#0", - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%extract%0#0", - "0", - "\"settlement_asset_id\"" - ] - }, - "4524": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%extract%0#0", - "box_prefixed_key%0#0", - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%extract%0#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "4525": { - "error": "check self.settlement_asset_id exists", - "op": "assert // check self.settlement_asset_id exists", - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%extract%0#0", - "maybe_value%0#0" - ] - }, - "4526": { - "op": "asset_holding_get AssetBalance", - "defined_out": [ - "box_prefixed_key%0#0", - "tmp%0#0", - "tmp%1#0" - ], - "stack_out": [ - "box_prefixed_key%0#0", - "tmp%0#0", - "tmp%1#0" - ] - }, - "4528": { - "op": "bury 1", - "stack_out": [ - "box_prefixed_key%0#0", - "tmp%1#0" - ] - }, - "4530": { - "op": "bz is_payment_executable_bool_false@3", - "stack_out": [ - "box_prefixed_key%0#0" - ] - }, - "4533": { - "op": "frame_dig 0", - "stack_out": [ - "box_prefixed_key%0#0", - "box_prefixed_key%0#0" - ] - }, - "4535": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%2#0", - "aggregate%box_get%3#0", - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%box_get%2#0", - "aggregate%box_get%3#0" - ] - }, - "4536": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%box_get%2#0" - ] - }, - "4537": { - "op": "pushint 448", - "defined_out": [ - "448", - "aggregate%box_get%2#0", - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%box_get%2#0", - "448" - ] - }, - "4540": { - "op": "getbit", - "defined_out": [ - "aggregate%get_bit%0#0", - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%get_bit%0#0" - ] - }, - "4541": { - "op": "bnz is_payment_executable_bool_false@3", - "stack_out": [ - "box_prefixed_key%0#0" - ] - }, - "4544": { - "op": "intc_1 // 1", - "defined_out": [ - "and_result%0#0", - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0", - "and_result%0#0" - ] - }, - "4545": { - "block": "is_payment_executable_bool_merge@4", - "stack_in": [ - "box_prefixed_key%0#0", - "and_result%0#0" - ], - "op": "swap", - "defined_out": [ - "and_result%0#0" - ] - }, - "4546": { - "retsub": true, - "op": "retsub" - }, - "4547": { - "block": "is_payment_executable_bool_false@3", - "stack_in": [ - "box_prefixed_key%0#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "and_result%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0", - "and_result%0#0" - ] - }, - "4548": { - "op": "b is_payment_executable_bool_merge@4" - }, - "4551": { - "subroutine": "modules.payment_agent.common.PaymentAgentCommonMixin.assert_enough_funds", - "params": { - "payment_amount#0": "uint64" - }, - "block": "assert_enough_funds", - "stack_in": [], - "op": "proto 1 0" - }, - "4554": { - "op": "global CurrentApplicationAddress", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "4556": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "0" - ] - }, - "4557": { - "op": "bytec 9 // \"settlement_asset_id\"", - "defined_out": [ - "\"settlement_asset_id\"", - "0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "0", - "\"settlement_asset_id\"" - ] - }, - "4559": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "4560": { - "error": "check self.settlement_asset_id exists", - "op": "assert // check self.settlement_asset_id exists", - "stack_out": [ - "tmp%0#0", - "maybe_value%0#0" - ] - }, - "4561": { - "op": "asset_holding_get AssetBalance", - "defined_out": [ - "check%0#0", - "value%0#0" - ], - "stack_out": [ - "value%0#0", - "check%0#0" - ] - }, - "4563": { - "error": "account opted into asset", - "op": "assert // account opted into asset", - "stack_out": [ - "value%0#0" - ] - }, - "4564": { - "op": "frame_dig -1", - "defined_out": [ - "payment_amount#0 (copy)", - "value%0#0" - ], - "stack_out": [ - "value%0#0", - "payment_amount#0 (copy)" - ] - }, - "4566": { - "op": ">=", - "defined_out": [ - "tmp%1#0" - ], - "stack_out": [ - "tmp%1#0" - ] - }, - "4567": { - "error": "Not enough funds for the payment", - "op": "assert // Not enough funds for the payment", - "stack_out": [] - }, - "4568": { - "retsub": true, - "op": "retsub" - }, - "4569": { - "subroutine": "modules.payment_agent.common.PaymentAgentCommonMixin.pay", - "params": { - "receiver#0": "bytes", - "amount#0": "uint64" - }, - "block": "pay", - "stack_in": [], - "op": "proto 2 0" - }, - "4572": { - "op": "itxn_begin" - }, - "4573": { - "op": "global MinTxnFee", - "defined_out": [ - "inner_txn_params%0%%param_Fee_idx_0#0" - ], - "stack_out": [ - "inner_txn_params%0%%param_Fee_idx_0#0" - ] - }, - "4575": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "inner_txn_params%0%%param_Fee_idx_0#0" - ], - "stack_out": [ - "inner_txn_params%0%%param_Fee_idx_0#0", - "0" - ] - }, - "4576": { - "op": "bytec 9 // \"settlement_asset_id\"", - "defined_out": [ - "\"settlement_asset_id\"", - "0", - "inner_txn_params%0%%param_Fee_idx_0#0" - ], - "stack_out": [ - "inner_txn_params%0%%param_Fee_idx_0#0", - "0", - "\"settlement_asset_id\"" - ] - }, - "4578": { - "op": "app_global_get_ex", - "defined_out": [ - "inner_txn_params%0%%param_Fee_idx_0#0", - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "inner_txn_params%0%%param_Fee_idx_0#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "4579": { - "error": "check self.settlement_asset_id exists", - "op": "assert // check self.settlement_asset_id exists", - "stack_out": [ - "inner_txn_params%0%%param_Fee_idx_0#0", - "maybe_value%0#0" - ] - }, - "4580": { - "op": "frame_dig -1", - "defined_out": [ - "amount#0 (copy)", - "inner_txn_params%0%%param_Fee_idx_0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "inner_txn_params%0%%param_Fee_idx_0#0", - "maybe_value%0#0", - "amount#0 (copy)" - ] - }, - "4582": { - "op": "itxn_field AssetAmount", - "stack_out": [ - "inner_txn_params%0%%param_Fee_idx_0#0", - "maybe_value%0#0" - ] - }, - "4584": { - "op": "frame_dig -2", - "defined_out": [ - "inner_txn_params%0%%param_Fee_idx_0#0", - "maybe_value%0#0", - "receiver#0 (copy)" - ], - "stack_out": [ - "inner_txn_params%0%%param_Fee_idx_0#0", - "maybe_value%0#0", - "receiver#0 (copy)" - ] - }, - "4586": { - "op": "itxn_field AssetReceiver", - "stack_out": [ - "inner_txn_params%0%%param_Fee_idx_0#0", - "maybe_value%0#0" - ] - }, - "4588": { - "op": "itxn_field XferAsset", - "stack_out": [ - "inner_txn_params%0%%param_Fee_idx_0#0" - ] - }, - "4590": { - "op": "pushint 4 // axfer", - "defined_out": [ - "axfer", - "inner_txn_params%0%%param_Fee_idx_0#0" - ], - "stack_out": [ - "inner_txn_params%0%%param_Fee_idx_0#0", - "axfer" - ] - }, - "4592": { - "op": "itxn_field TypeEnum", - "stack_out": [ - "inner_txn_params%0%%param_Fee_idx_0#0" - ] - }, - "4594": { - "op": "itxn_field Fee", - "stack_out": [] - }, - "4596": { - "op": "itxn_submit" - }, - "4597": { - "retsub": true, - "op": "retsub" - }, - "4598": { - "subroutine": "modules.core_financial.common.CoreFinancialCommonMixin.assert_time_events_sorted", - "params": { - "time_events#0": "bytes" - }, - "block": "assert_time_events_sorted", - "stack_in": [], - "op": "proto 1 1" - }, - "4601": { - "op": "pushbytes \"\"", - "stack_out": [ - "time_f#0" - ] - }, - "4603": { - "op": "dupn 2", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0" - ] - }, - "4605": { - "op": "frame_dig -1", - "defined_out": [ - "time_events#0 (copy)" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "time_events#0 (copy)" - ] - }, - "4607": { - "op": "extract 2 0", - "defined_out": [ - "aggregate%array_trimmed%0#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0" - ] - }, - "4610": { - "op": "frame_dig -1", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "time_events#0 (copy)" - ] - }, - "4612": { - "op": "pushint 2", - "defined_out": [ - "2", - "aggregate%array_trimmed%0#0", - "time_events#0 (copy)" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "time_events#0 (copy)", - "2" - ] - }, - "4614": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "values%0#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "values%0#0" - ] - }, - "4615": { - "op": "global LatestTimestamp", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "tmp%0#0", - "values%0#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "values%0#0", - "tmp%0#0" - ] - }, - "4617": { - "op": ">", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "tmp%1#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%1#0" - ] - }, - "4618": { - "error": "Time events must be set in the future", - "op": "assert // Time events must be set in the future", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0" - ] - }, - "4619": { - "op": "frame_dig -1", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "time_events#0 (copy)" - ] - }, - "4621": { - "op": "intc_0 // 0", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "time_events#0 (copy)", - "0" - ] - }, - "4622": { - "error": "invalid array length header", - "op": "extract_uint16 // on error: invalid array length header", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_trimmed%0#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "aggregate%array_length%0#0" - ] - }, - "4623": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "aggregate%array_length%0#0", - "aggregate%array_trimmed%0#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "aggregate%array_length%0#0", - "1" - ] - }, - "4624": { - "op": "-", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "tmp%3#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0" - ] - }, - "4625": { - "op": "intc_0 // 0", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "tmp%3#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ] - }, - "4626": { - "block": "assert_time_events_sorted_for_header@1", - "stack_in": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ], - "op": "frame_dig 5", - "defined_out": [ - "idx#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "idx#0" - ] - }, - "4628": { - "op": "frame_dig 4", - "defined_out": [ - "idx#0", - "tmp%3#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "idx#0", - "tmp%3#0" - ] - }, - "4630": { - "op": "<", - "defined_out": [ - "continue_looping%0#0", - "idx#0", - "tmp%3#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "continue_looping%0#0" - ] - }, - "4631": { - "op": "bz assert_time_events_sorted_after_for@6", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ] - }, - "4634": { - "op": "pushint 65", - "defined_out": [ - "65", - "idx#0", - "tmp%3#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "65" - ] - }, - "4636": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "65", - "idx#0", - "tmp%3#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "65", - "1" - ] - }, - "4637": { - "callsub": "_puya_lib.util.ensure_budget", - "op": "callsub ensure_budget", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ] - }, - "4640": { - "op": "frame_dig 5", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "idx#0" - ] - }, - "4642": { - "op": "dup", - "defined_out": [ - "idx#0", - "idx#0 (copy)", - "tmp%3#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "idx#0", - "idx#0 (copy)" - ] - }, - "4643": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "idx#0", - "idx#0 (copy)", - "tmp%3#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "idx#0", - "idx#0 (copy)", - "8" - ] - }, - "4644": { - "op": "*", - "defined_out": [ - "aggregate%bytes_offset%1#0", - "idx#0", - "tmp%3#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "idx#0", - "aggregate%bytes_offset%1#0" - ] - }, - "4645": { - "op": "frame_dig 3", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "aggregate%bytes_offset%1#0", - "idx#0", - "tmp%3#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "idx#0", - "aggregate%bytes_offset%1#0", - "aggregate%array_trimmed%0#0" - ] - }, - "4647": { - "op": "dup", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "aggregate%array_trimmed%0#0 (copy)", - "aggregate%bytes_offset%1#0", - "idx#0", - "tmp%3#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "idx#0", - "aggregate%bytes_offset%1#0", - "aggregate%array_trimmed%0#0 (copy)", - "aggregate%array_trimmed%0#0 (copy)" - ] - }, - "4648": { - "op": "cover 3", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "aggregate%array_trimmed%0#0", - "idx#0", - "aggregate%bytes_offset%1#0", - "aggregate%array_trimmed%0#0 (copy)" - ] - }, - "4650": { - "op": "swap", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "aggregate%array_trimmed%0#0", - "idx#0", - "aggregate%array_trimmed%0#0 (copy)", - "aggregate%bytes_offset%1#0" - ] - }, - "4651": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "time_i#0", - "tmp%3#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "aggregate%array_trimmed%0#0", - "idx#0", - "time_i#0" - ] - }, - "4652": { - "op": "dup", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "aggregate%array_trimmed%0#0", - "idx#0", - "time_i#0", - "time_i#0 (copy)" - ] - }, - "4653": { - "op": "cover 3", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_i#0", - "aggregate%array_trimmed%0#0", - "idx#0", - "time_i#0" - ] - }, - "4655": { - "op": "frame_bury 1", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "time_i#0", - "tmp%3#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_i#0", - "aggregate%array_trimmed%0#0", - "idx#0" - ] - }, - "4657": { - "op": "intc_1 // 1", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_i#0", - "aggregate%array_trimmed%0#0", - "idx#0", - "1" - ] - }, - "4658": { - "op": "+", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "time_i#0", - "tmp%3#0", - "tmp%4#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_i#0", - "aggregate%array_trimmed%0#0", - "tmp%4#0" - ] - }, - "4659": { - "op": "dup", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_i#0", - "aggregate%array_trimmed%0#0", - "tmp%4#0", - "tmp%4#0" - ] - }, - "4660": { - "op": "frame_bury 2", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "time_i#0", - "tmp%3#0", - "tmp%4#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_i#0", - "aggregate%array_trimmed%0#0", - "tmp%4#0" - ] - }, - "4662": { - "op": "intc_3 // 8", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_i#0", - "aggregate%array_trimmed%0#0", - "tmp%4#0", - "8" - ] - }, - "4663": { - "op": "*", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "aggregate%bytes_offset%2#0", - "idx#0", - "time_i#0", - "tmp%3#0", - "tmp%4#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_i#0", - "aggregate%array_trimmed%0#0", - "aggregate%bytes_offset%2#0" - ] - }, - "4664": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "time_f#0", - "time_i#0", - "tmp%3#0", - "tmp%4#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_i#0", - "time_f#0" - ] - }, - "4665": { - "op": "dup", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_i#0", - "time_f#0", - "time_f#0" - ] - }, - "4666": { - "op": "frame_bury 0", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "time_f#0", - "time_i#0", - "tmp%3#0", - "tmp%4#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_i#0", - "time_f#0" - ] - }, - "4668": { - "op": "<", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "time_f#0", - "time_i#0", - "tmp%3#0", - "tmp%4#0", - "tmp%5#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "tmp%5#0" - ] - }, - "4669": { - "error": "Time events must be sorted in strictly ascending order", - "op": "assert // Time events must be sorted in strictly ascending order", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ] - }, - "4670": { - "op": "intc_0 // 0", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "0" - ] - }, - "4671": { - "op": "bytec 17 // \"day_count_convention\"", - "defined_out": [ - "\"day_count_convention\"", - "0", - "aggregate%array_trimmed%0#0", - "idx#0", - "time_f#0", - "time_i#0", - "tmp%3#0", - "tmp%4#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "0", - "\"day_count_convention\"" - ] - }, - "4673": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "maybe_exists%0#0", - "maybe_value%0#0", - "time_f#0", - "time_i#0", - "tmp%3#0", - "tmp%4#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "4674": { - "error": "check self.day_count_convention exists", - "op": "assert // check self.day_count_convention exists", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "maybe_value%0#0" - ] - }, - "4675": { - "op": "intc 4 // 255", - "defined_out": [ - "255", - "aggregate%array_trimmed%0#0", - "idx#0", - "maybe_value%0#0", - "time_f#0", - "time_i#0", - "tmp%3#0", - "tmp%4#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "maybe_value%0#0", - "255" - ] - }, - "4677": { - "op": "!=", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "time_f#0", - "time_i#0", - "tmp%3#0", - "tmp%4#0", - "tmp%6#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "tmp%6#0" - ] - }, - "4678": { - "op": "bz assert_time_events_sorted_after_if_else@4", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ] - }, - "4681": { - "op": "frame_dig 0", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_f#0" - ] - }, - "4683": { - "op": "frame_dig 1", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_f#0", - "time_i#0" - ] - }, - "4685": { - "op": "-", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "time_f#0", - "time_i#0", - "tmp%3#0", - "tmp%4#0", - "tmp%7#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "tmp%7#0" - ] - }, - "4686": { - "op": "intc 6 // 86400", - "defined_out": [ - "86400", - "aggregate%array_trimmed%0#0", - "idx#0", - "time_f#0", - "time_i#0", - "tmp%3#0", - "tmp%4#0", - "tmp%7#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "tmp%7#0", - "86400" - ] - }, - "4688": { - "op": "%", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "time_f#0", - "time_i#0", - "tmp%3#0", - "tmp%4#0", - "tmp%8#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "tmp%8#0" - ] - }, - "4689": { - "op": "!", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "time_f#0", - "time_i#0", - "tmp%3#0", - "tmp%4#0", - "tmp%9#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "tmp%9#0" - ] - }, - "4690": { - "error": "Time periods in Actual/Actual day count convention must be multiples of a day (in seconds)", - "op": "assert // Time periods in Actual/Actual day count convention must be multiples of a day (in seconds)", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ] - }, - "4691": { - "block": "assert_time_events_sorted_after_if_else@4", - "stack_in": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ], - "op": "frame_dig 2", - "defined_out": [ - "idx#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "idx#0" - ] - }, - "4693": { - "op": "frame_bury 5", - "defined_out": [ - "idx#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ] - }, - "4695": { - "op": "b assert_time_events_sorted_for_header@1" - }, - "4698": { - "block": "assert_time_events_sorted_after_for@6", - "stack_in": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ], - "op": "frame_dig -1", - "defined_out": [ - "time_events#0 (copy)" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_events#0 (copy)" - ] - }, - "4700": { - "op": "frame_bury 0" - }, - "4702": { - "retsub": true, - "op": "retsub" - }, - "4703": { - "subroutine": "modules.accounting.AccountingModule.assert_is_not_account_suspended", - "params": { - "holding_address#0": "bytes" - }, - "block": "assert_is_not_account_suspended", - "stack_in": [], - "op": "proto 1 0" - }, - "4706": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023" - ], - "stack_out": [ - "0x52333023" - ] - }, - "4707": { - "op": "frame_dig -1", - "defined_out": [ - "0x52333023", - "holding_address#0 (copy)" - ], - "stack_out": [ - "0x52333023", - "holding_address#0 (copy)" - ] - }, - "4709": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0" - ] - }, - "4710": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ], - "stack_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "4711": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%box_get%0#0" - ] - }, - "4712": { - "op": "pushint 448", - "defined_out": [ - "448", - "aggregate%box_get%0#0" - ], - "stack_out": [ - "aggregate%box_get%0#0", - "448" - ] - }, - "4715": { - "op": "getbit", - "defined_out": [ - "aggregate%get_bit%0#0" - ], - "stack_out": [ - "aggregate%get_bit%0#0" - ] - }, - "4716": { - "op": "!", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "4717": { - "error": "Suspended operations", - "op": "assert // Suspended operations", - "stack_out": [] - }, - "4718": { - "retsub": true, - "op": "retsub" - }, - "4719": { - "subroutine": "modules.accounting.AccountingModule.account_units_value", - "params": { - "holding_address#0": "bytes", - "units#0": "uint64" - }, - "block": "account_units_value", - "stack_in": [], - "op": "proto 2 1" - }, - "4722": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023" - ], - "stack_out": [ - "0x52333023" - ] - }, - "4723": { - "op": "frame_dig -2", - "defined_out": [ - "0x52333023", - "holding_address#0 (copy)" - ], - "stack_out": [ - "0x52333023", - "holding_address#0 (copy)" - ] - }, - "4725": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0" - ] - }, - "4726": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ], - "stack_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "4727": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%box_get%0#0" - ] - }, - "4728": { - "op": "pushint 40", - "defined_out": [ - "40", - "aggregate%box_get%0#0" - ], - "stack_out": [ - "aggregate%box_get%0#0", - "40" - ] - }, - "4730": { - "op": "extract_uint64", - "defined_out": [ - "values%0#0" - ], - "stack_out": [ - "values%0#0" - ] - }, - "4731": { - "op": "frame_dig -1", - "defined_out": [ - "units#0 (copy)", - "values%0#0" - ], - "stack_out": [ - "values%0#0", - "units#0 (copy)" - ] - }, - "4733": { - "op": "*", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "4734": { - "retsub": true, - "op": "retsub" - }, - "4735": { - "subroutine": "modules.accounting.AccountingModule.account_total_units_value", - "params": { - "holding_address#0": "bytes" - }, - "block": "account_total_units_value", - "stack_in": [], - "op": "proto 1 1" - }, - "4738": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023" - ], - "stack_out": [ - "0x52333023" - ] - }, - "4739": { - "op": "frame_dig -1", - "defined_out": [ - "0x52333023", - "holding_address#0 (copy)" - ], - "stack_out": [ - "0x52333023", - "holding_address#0 (copy)" - ] - }, - "4741": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0" - ] - }, - "4742": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ], - "stack_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "4743": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%box_get%0#0" - ] - }, - "4744": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "aggregate%box_get%0#0" - ], - "stack_out": [ - "aggregate%box_get%0#0", - "32" - ] - }, - "4745": { - "op": "extract_uint64", - "defined_out": [ - "values%0#0" - ], - "stack_out": [ - "values%0#0" - ] - }, - "4746": { - "op": "frame_dig -1", - "stack_out": [ - "values%0#0", - "holding_address#0 (copy)" - ] - }, - "4748": { - "op": "swap", - "stack_out": [ - "holding_address#0 (copy)", - "values%0#0" - ] - }, - "4749": { - "callsub": "modules.accounting.AccountingModule.account_units_value", - "op": "callsub account_units_value", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "4752": { - "retsub": true, - "op": "retsub" - }, - "4753": { - "subroutine": "modules.accounting.AccountingModule.end_if_no_circulating_units", - "params": {}, - "block": "end_if_no_circulating_units", - "stack_in": [], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "0" - ] - }, - "4754": { - "op": "bytec_3 // \"circulating_units\"", - "defined_out": [ - "\"circulating_units\"", - "0" - ], - "stack_out": [ - "0", - "\"circulating_units\"" - ] - }, - "4755": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "4756": { - "error": "check self.circulating_units exists", - "op": "assert // check self.circulating_units exists", - "stack_out": [ - "maybe_value%0#0" - ] - }, - "4757": { - "op": "bnz end_if_no_circulating_units_after_if_else@2", - "stack_out": [] - }, - "4760": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"" - ], - "stack_out": [ - "\"status\"" - ] - }, - "4761": { - "op": "intc 5 // 200", - "defined_out": [ - "\"status\"", - "200" - ], - "stack_out": [ - "\"status\"", - "200" - ] - }, - "4763": { - "op": "app_global_put", - "stack_out": [] - }, - "4764": { - "block": "end_if_no_circulating_units_after_if_else@2", - "stack_in": [], - "retsub": true, - "op": "retsub" - }, - "4765": { - "subroutine": "modules.rbac.RbacModule._role_is_active", - "params": { - "role_map#0": "bytes", - "role_address#0": "bytes" - }, - "block": "_role_is_active", - "stack_in": [], - "op": "proto 2 1" - }, - "4768": { - "op": "pushbytes \"\"", - "stack_out": [ - "awst_tmp%0#0" - ] - }, - "4770": { - "op": "frame_dig -2", - "defined_out": [ - "role_map#0 (copy)" - ], - "stack_out": [ - "awst_tmp%0#0", - "role_map#0 (copy)" - ] - }, - "4772": { - "op": "frame_dig -1", - "defined_out": [ - "role_address#0 (copy)", - "role_map#0 (copy)" - ], - "stack_out": [ - "awst_tmp%0#0", - "role_map#0 (copy)", - "role_address#0 (copy)" - ] - }, - "4774": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1" - ] - }, - "4775": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1" - ] - }, - "4776": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "4777": { - "op": "bury 1", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "4779": { - "op": "bz _role_is_active_bool_false@4", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1" - ] - }, - "4782": { - "op": "frame_dig 1", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1" - ] - }, - "4784": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0", - "box_prefixed_key%0#1" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "4785": { - "error": "check BoxMap entry exists", - "op": "assert // check BoxMap entry exists", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "aggregate%box_get%0#0" - ] - }, - "4786": { - "op": "intc_0 // 0", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "aggregate%box_get%0#0", - "0" - ] - }, - "4787": { - "op": "extract_uint64", - "defined_out": [ - "box_prefixed_key%0#1", - "values%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "values%0#0" - ] - }, - "4788": { - "op": "global LatestTimestamp" - }, - "4790": { - "op": "dup", - "defined_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "values%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "values%0#0", - "awst_tmp%0#0", - "awst_tmp%0#0" - ] - }, - "4791": { - "op": "frame_bury 0", - "defined_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "values%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "values%0#0", - "awst_tmp%0#0" - ] - }, - "4793": { - "op": "<=", - "defined_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "tmp%1#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "tmp%1#0" - ] - }, - "4794": { - "op": "bz _role_is_active_bool_false@4", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1" - ] - }, - "4797": { - "op": "frame_dig 1", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1" - ] - }, - "4799": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%2#0", - "aggregate%box_get%3#0", - "awst_tmp%0#0", - "box_prefixed_key%0#1" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "aggregate%box_get%2#0", - "aggregate%box_get%3#0" - ] - }, - "4800": { - "error": "check BoxMap entry exists", - "op": "assert // check BoxMap entry exists", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "aggregate%box_get%2#0" - ] - }, - "4801": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "aggregate%box_get%2#0", - "awst_tmp%0#0", - "box_prefixed_key%0#1" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "aggregate%box_get%2#0", - "8" - ] - }, - "4802": { - "op": "extract_uint64", - "defined_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "values%1#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "values%1#0" - ] - }, - "4803": { - "op": "frame_dig 0", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "values%1#0", - "awst_tmp%0#0" - ] - }, - "4805": { - "op": ">=", - "defined_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "tmp%2#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "tmp%2#0" - ] - }, - "4806": { - "op": "bz _role_is_active_bool_false@4", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1" - ] - }, - "4809": { - "op": "intc_1 // 1", - "defined_out": [ - "and_result%0#0", - "awst_tmp%0#0", - "box_prefixed_key%0#1" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "and_result%0#0" - ] - }, - "4810": { - "block": "_role_is_active_bool_merge@5", - "stack_in": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "and_result%0#0" - ], - "op": "frame_bury 0", - "defined_out": [ - "and_result%0#0" - ] - }, - "4812": { - "retsub": true, - "op": "retsub" - }, - "4813": { - "block": "_role_is_active_bool_false@4", - "stack_in": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1" - ], - "op": "intc_0 // 0", - "defined_out": [ - "and_result%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "and_result%0#0" - ] - }, - "4814": { - "op": "b _role_is_active_bool_merge@5" - }, - "4817": { - "subroutine": "modules.rbac.RbacModule.assert_caller_is_arranger", - "params": {}, - "block": "assert_caller_is_arranger", - "stack_in": [], - "op": "txn Sender", - "defined_out": [ - "role_address#0" - ], - "stack_out": [ - "role_address#0" - ] - }, - "4819": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "0" - ] - }, - "4820": { - "op": "bytec 8 // 0x52323023", - "defined_out": [ - "0", - "0x52323023", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "0", - "0x52323023" - ] - }, - "4822": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "4823": { - "error": "check self.arranger exists", - "op": "assert // check self.arranger exists", - "stack_out": [ - "role_address#0", - "maybe_value%0#0" - ] - }, - "4824": { - "op": "==", - "defined_out": [ - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1" - ] - }, - "4825": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [] - }, - "4826": { - "retsub": true, - "op": "retsub" - }, - "4827": { - "subroutine": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "params": {}, - "block": "assert_is_not_asset_defaulted", - "stack_in": [], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "0" - ] - }, - "4828": { - "op": "bytec 24 // \"asset_defaulted\"", - "defined_out": [ - "\"asset_defaulted\"", - "0" - ], - "stack_out": [ - "0", - "\"asset_defaulted\"" - ] - }, - "4830": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "4831": { - "error": "check self.asset_defaulted exists", - "op": "assert // check self.asset_defaulted exists", - "stack_out": [ - "maybe_value%0#0" - ] - }, - "4832": { - "op": "!", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "4833": { - "error": "Defaulted", - "op": "assert // Defaulted", - "stack_out": [] - }, - "4834": { - "retsub": true, - "op": "retsub" - }, - "4835": { - "subroutine": "modules.rbac.RbacModule.assert_is_not_asset_suspended", - "params": {}, - "block": "assert_is_not_asset_suspended", - "stack_in": [], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "0" - ] - }, - "4836": { - "op": "bytec 23 // \"asset_suspended\"", - "defined_out": [ - "\"asset_suspended\"", - "0" - ], - "stack_out": [ - "0", - "\"asset_suspended\"" - ] - }, - "4838": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "4839": { - "error": "check self.asset_suspended exists", - "op": "assert // check self.asset_suspended exists", - "stack_out": [ - "maybe_value%0#0" - ] - }, - "4840": { - "op": "!", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "4841": { - "error": "Suspended operations", - "op": "assert // Suspended operations", - "stack_out": [] - }, - "4842": { - "retsub": true, - "op": "retsub" - }, - "4843": { - "subroutine": "modules.rbac.RbacModule._assert_valid_role", - "params": { - "role_id#0": "uint64" - }, - "block": "_assert_valid_role", - "stack_in": [], - "op": "proto 1 0" - }, - "4846": { - "op": "frame_dig -1", - "defined_out": [ - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0 (copy)" - ] - }, - "4848": { - "op": "pushint 20", - "defined_out": [ - "20", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0 (copy)", - "20" - ] - }, - "4850": { - "op": "==", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "4851": { - "op": "bnz _assert_valid_role_bool_true@6", - "stack_out": [] - }, - "4854": { - "op": "frame_dig -1", - "stack_out": [ - "role_id#0 (copy)" - ] - }, - "4856": { - "op": "pushint 40", - "defined_out": [ - "40", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0 (copy)", - "40" - ] - }, - "4858": { - "op": "==", - "defined_out": [ - "tmp%1#0" - ], - "stack_out": [ - "tmp%1#0" - ] - }, - "4859": { - "op": "bnz _assert_valid_role_bool_true@6", - "stack_out": [] - }, - "4862": { - "op": "frame_dig -1", - "stack_out": [ - "role_id#0 (copy)" - ] - }, - "4864": { - "op": "pushint 50", - "defined_out": [ - "50", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0 (copy)", - "50" - ] - }, - "4866": { - "op": "==", - "defined_out": [ - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0" - ] - }, - "4867": { - "op": "bnz _assert_valid_role_bool_true@6", - "stack_out": [] - }, - "4870": { - "op": "frame_dig -1", - "stack_out": [ - "role_id#0 (copy)" - ] - }, - "4872": { - "op": "pushint 60", - "defined_out": [ - "60", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0 (copy)", - "60" - ] - }, - "4874": { - "op": "==", - "defined_out": [ - "tmp%3#0" - ], - "stack_out": [ - "tmp%3#0" - ] - }, - "4875": { - "op": "bnz _assert_valid_role_bool_true@6", - "stack_out": [] - }, - "4878": { - "op": "frame_dig -1", - "stack_out": [ - "role_id#0 (copy)" - ] - }, - "4880": { - "op": "pushint 70", - "defined_out": [ - "70", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0 (copy)", - "70" - ] - }, - "4882": { - "op": "==", - "defined_out": [ - "tmp%4#0" - ], - "stack_out": [ - "tmp%4#0" - ] - }, - "4883": { - "op": "bnz _assert_valid_role_bool_true@6", - "stack_out": [] - }, - "4886": { - "op": "frame_dig -1", - "stack_out": [ - "role_id#0 (copy)" - ] - }, - "4888": { - "op": "pushint 80", - "defined_out": [ - "80", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0 (copy)", - "80" - ] - }, - "4890": { - "op": "==", - "defined_out": [ - "tmp%5#0" - ], - "stack_out": [ - "tmp%5#0" - ] - }, - "4891": { - "op": "bz _assert_valid_role_bool_false@7", - "stack_out": [] - }, - "4894": { - "block": "_assert_valid_role_bool_true@6", - "stack_in": [], - "op": "intc_1 // 1", - "defined_out": [ - "or_result%0#0" - ], - "stack_out": [ - "or_result%0#0" - ] - }, - "4895": { - "error": "Invalid role identifier", - "block": "_assert_valid_role_bool_merge@8", - "stack_in": [ - "or_result%0#0" - ], - "op": "assert // Invalid role identifier", - "defined_out": [], - "stack_out": [] - }, - "4896": { - "retsub": true, - "op": "retsub" - }, - "4897": { - "block": "_assert_valid_role_bool_false@7", - "stack_in": [], - "op": "intc_0 // 0", - "defined_out": [ - "or_result%0#0" - ], - "stack_out": [ - "or_result%0#0" - ] - }, - "4898": { - "op": "b _assert_valid_role_bool_merge@8" - } - } -} \ No newline at end of file diff --git a/smart_contracts/artifacts/fixed_coupon_bond/FixedCouponBond.approval.teal b/smart_contracts/artifacts/fixed_coupon_bond/FixedCouponBond.approval.teal deleted file mode 100644 index b9ec56e3..00000000 --- a/smart_contracts/artifacts/fixed_coupon_bond/FixedCouponBond.approval.teal +++ /dev/null @@ -1,4980 +0,0 @@ -#pragma version 12 -#pragma typetrack false - -// algopy.arc4.ARC4Contract.approval_program() -> uint64: -main: - intcblock 0 1 32 8 255 200 86400 - bytecblock 0x151f7c75 0x52333023 "status" "circulating_units" "issuance_date" "maturity_date" "unit_value" "total_coupons" 0x52323023 "settlement_asset_id" "primary_distribution_opening_date" "secondary_market_closure_date" 0x74696d654576656e7473 0x52373023 0x52343023 "total_units" "denomination_asset_id" "day_count_convention" "secondary_market_opening_date" 0x636f75706f6e5261746573 0x52363023 0x52353023 0x52323523 "asset_suspended" "asset_defaulted" "metadata" "principal_discount" "primary_distribution_closure_date" "paid_coupon_units" "due_coupons_watermark" 0x0000 0x00 0x52383023 "interest_rate" 0x068101 0x003b 0x8c29904e 0x0012 - txn ApplicationID - bnz main_after_if_else@2 - // modules/rbac.py:30-31 - // # RBAC Roles - // self.arranger = GlobalState(Account(), key=cst.PREFIX_ID_ARRANGER) - bytec 8 // 0x52323023 - global ZeroAddress - app_global_put - // modules/rbac.py:32 - // self.op_daemon = GlobalState(Account(), key=cst.PREFIX_ID_OP_DAEMON) - bytec 22 // 0x52323523 - global ZeroAddress - app_global_put - // modules/rbac.py:47-48 - // # D-ASA Governance - // self.asset_suspended = False - bytec 23 // "asset_suspended" - intc_0 // 0 - app_global_put - // modules/rbac.py:49 - // self.asset_defaulted = False - bytec 24 // "asset_defaulted" - intc_0 // 0 - app_global_put - // modules/accounting.py:19 - // self.total_units = UInt64() - bytec 15 // "total_units" - intc_0 // 0 - app_global_put - // modules/accounting.py:20 - // self.circulating_units = UInt64() - bytec_3 // "circulating_units" - intc_0 // 0 - app_global_put - // modules/accounting.py:21 - // self.unit_value = UInt64() - bytec 6 // "unit_value" - intc_0 // 0 - app_global_put - // modules/accounting.py:22 - // self.status = UInt64(enm.STATUS_INACTIVE) - bytec_2 // "status" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:31-32 - // # Asset Configuration - // self.denomination_asset_id = Asset() - bytec 16 // "denomination_asset_id" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:33 - // self.settlement_asset_id = Asset() - bytec 9 // "settlement_asset_id" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:34 - // self.unit_value = UInt64() - bytec 6 // "unit_value" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:35 - // self.day_count_convention = UInt64() - bytec 17 // "day_count_convention" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:37-38 - // # Metadata - // self.metadata = Bytes() - bytec 25 // "metadata" - pushbytes 0x - app_global_put - // modules/core_financial/common.py:40-41 - // # Principal / Rates - // self.principal_discount = UInt64() - bytec 26 // "principal_discount" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:42 - // self.interest_rate = UInt64() - bytec 33 // "interest_rate" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:43 - // self.total_coupons = UInt64() - bytec 7 // "total_coupons" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:47 - // self.primary_distribution_opening_date = UInt64() - bytec 10 // "primary_distribution_opening_date" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:48 - // self.primary_distribution_closure_date = UInt64() - bytec 27 // "primary_distribution_closure_date" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:49 - // self.issuance_date = UInt64() - bytec 4 // "issuance_date" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:50 - // self.secondary_market_opening_date = UInt64() - bytec 18 // "secondary_market_opening_date" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:51 - // self.secondary_market_closure_date = UInt64() - bytec 11 // "secondary_market_closure_date" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:52 - // self.maturity_date = UInt64() - bytec 5 // "maturity_date" - intc_0 // 0 - app_global_put - // modules/core_financial/coupon.py:24 - // self.paid_coupon_units = UInt64() - bytec 28 // "paid_coupon_units" - intc_0 // 0 - app_global_put - // modules/core_financial/coupon.py:102 - // self.due_coupons_watermark = UInt64() - bytec 29 // "due_coupons_watermark" - intc_0 // 0 - app_global_put - // smart_contracts/fixed_coupon_bond/contract.py:33 - // assert Txn.global_num_byte_slice == cfg.GLOBAL_BYTES, err.WRONG_GLOBAL_BYTES - txn GlobalNumByteSlice - pushint 3 - == - assert // Wrong Global Bytes allocation - // smart_contracts/fixed_coupon_bond/contract.py:34 - // assert Txn.global_num_uint == cfg.GLOBAL_UINTS, err.WRONG_GLOBAL_UINTS - txn GlobalNumUint - pushint 20 - == - assert // Wrong Global UInts allocation - // smart_contracts/fixed_coupon_bond/contract.py:35 - // assert Txn.local_num_byte_slice == cfg.LOCAL_BYTES, err.WRONG_LOCAL_BYTES - txn LocalNumByteSlice - ! - assert // Wrong Local Bytes allocation - // smart_contracts/fixed_coupon_bond/contract.py:36 - // assert Txn.local_num_uint == cfg.LOCAL_UINTS, err.WRONG_LOCAL_UINTS - txn LocalNumUint - ! - assert // Wrong Local UInts allocation - -main_after_if_else@2: - // smart_contracts/fixed_coupon_bond/contract.py:17-30 - // class FixedCouponBond( - // PAMCoreMixin, - // FixedCouponCashflowMixin, - // CouponPaymentAgentMixin, - // PrincipalPaymentAgentMixin, - // CouponTransferAgentMixin, - // state_totals=StateTotals( - // global_bytes=cfg.GLOBAL_BYTES, - // global_uints=cfg.GLOBAL_UINTS, - // local_bytes=cfg.LOCAL_BYTES, - // local_uints=cfg.LOCAL_UINTS, - // ), - // avm_version=12, - // ): - pushbytes 0x25dba95b // method "asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void" - txna ApplicationArgs 0 - match main_asset_update_route@4 - -main_switch_case_next@5: - // smart_contracts/fixed_coupon_bond/contract.py:17-30 - // class FixedCouponBond( - // PAMCoreMixin, - // FixedCouponCashflowMixin, - // CouponPaymentAgentMixin, - // PrincipalPaymentAgentMixin, - // CouponTransferAgentMixin, - // state_totals=StateTotals( - // global_bytes=cfg.GLOBAL_BYTES, - // global_uints=cfg.GLOBAL_UINTS, - // local_bytes=cfg.LOCAL_BYTES, - // local_uints=cfg.LOCAL_UINTS, - // ), - // avm_version=12, - // ): - txn OnCompletion - ! - assert - txn ApplicationID - bz main_create_NoOp@36 - pushbytess 0x89474134 0x44363d49 0x53bef045 0x67db4f20 0xf6a96c8d 0x8cf14b51 0x9c76b6a3 0x4fd6a3cc 0x1d6fc255 0x25e9997f 0x6c85e3ee 0x402dba47 0xfad2173e 0x08efea35 0xe4a5ab54 0xdc063b35 0x14fc10ef 0x4c113ed5 0x74a7297f 0x105c184e 0x82f71b2d 0xef04f5d3 0x03b83329 0x3dbe80bd 0xdf54e82c 0x010c8299 0x7406acd2 0xc3e4b297 // method "asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void", method "get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64))", method "get_coupon_rates()uint16[]", method "get_payment_amount(address)(uint64,uint64)", method "get_coupons_status()(uint64,uint64,uint64,(uint64,uint64),bool)", method "pay_coupon(address,byte[])(uint64,uint64,byte[])", method "pay_principal(address,byte[])(uint64,uint64,byte[])", method "asset_transfer(address,address,uint64)uint64", method "set_secondary_time_events(uint64[])(uint64,uint64)", method "set_default_status(bool)uint64", method "primary_distribution(address,uint64)uint64", method "get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)", method "get_time_events()uint64[]", method "get_secondary_market_schedule()uint64[]", method "get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", method "account_gov_suspension(address,bool)uint64", method "account_open(address,address)uint64", method "account_close(address)(uint64,uint64)", method "account_update_payment_address(address,address)uint64", method "account_get_info(address)(address,uint64,uint64,uint64,bool)", method "rbac_rotate_arranger(address)uint64", method "rbac_set_op_daemon(address)uint64", method "rbac_assign_role(uint8,address,byte[])uint64", method "rbac_revoke_role(uint8,address)uint64", method "rbac_gov_asset_suspension(bool)uint64", method "rbac_get_arranger()address", method "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", method "rbac_get_role_config(uint8,address)(uint64,uint64)" - txna ApplicationArgs 0 - match asset_config get_account_units_current_value get_coupon_rates get_payment_amount get_coupons_status pay_coupon pay_principal asset_transfer set_secondary_time_events set_default_status primary_distribution get_asset_info get_time_events get_secondary_market_schedule get_asset_metadata account_gov_suspension account_open account_close account_update_payment_address account_get_info rbac_rotate_arranger rbac_set_op_daemon rbac_assign_role rbac_revoke_role rbac_gov_asset_suspension rbac_get_arranger rbac_get_address_roles rbac_get_role_config - err - -main_create_NoOp@36: - // smart_contracts/fixed_coupon_bond/contract.py:17-30 - // class FixedCouponBond( - // PAMCoreMixin, - // FixedCouponCashflowMixin, - // CouponPaymentAgentMixin, - // PrincipalPaymentAgentMixin, - // CouponTransferAgentMixin, - // state_totals=StateTotals( - // global_bytes=cfg.GLOBAL_BYTES, - // global_uints=cfg.GLOBAL_UINTS, - // local_bytes=cfg.LOCAL_BYTES, - // local_uints=cfg.LOCAL_UINTS, - // ), - // avm_version=12, - // ): - pushbytes 0x3f0efc6c // method "asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void" - txna ApplicationArgs 0 - match asset_create - err - -main_asset_update_route@4: - // modules/core_financial/common.py:279 - // @arc4.abimethod(allow_actions=["UpdateApplication"]) - txn OnCompletion - pushint 4 // UpdateApplication - == - txn ApplicationID - && - assert - b asset_update - - -// _puya_lib.util.ensure_budget(required_budget: uint64, fee_source: uint64) -> void: -ensure_budget: - proto 2 0 - frame_dig -2 - pushint 10 - + - -ensure_budget_while_top@1: - frame_dig 0 - global OpcodeBudget - > - bz ensure_budget_after_while@6 - itxn_begin - pushint 6 // appl - itxn_field TypeEnum - pushint 5 // DeleteApplication - itxn_field OnCompletion - bytec 34 // 0x068101 - itxn_field ApprovalProgram - bytec 34 // 0x068101 - itxn_field ClearStateProgram - frame_dig -1 - switch ensure_budget_switch_case_0@3 ensure_budget_switch_case_1@4 - -ensure_budget_switch_case_next@5: - itxn_submit - b ensure_budget_while_top@1 - -ensure_budget_switch_case_1@4: - global MinTxnFee - itxn_field Fee - b ensure_budget_switch_case_next@5 - -ensure_budget_switch_case_0@3: - intc_0 // 0 - itxn_field Fee - b ensure_budget_switch_case_next@5 - -ensure_budget_after_while@6: - retsub - - -// modules.actus.pam.PAMCoreMixin.asset_config[routing]() -> void: -asset_config: - pushbytes "" - // modules/actus/pam.py:26 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_3 // 8 - == - assert // invalid number of bytes for arc4.uint64 - btoi - txna ApplicationArgs 2 - dup - len - intc_3 // 8 - == - assert // invalid number of bytes for arc4.uint64 - btoi - txna ApplicationArgs 3 - dup - len - intc_3 // 8 - == - assert // invalid number of bytes for arc4.uint64 - btoi - txna ApplicationArgs 4 - dup - len - intc_3 // 8 - == - assert // invalid number of bytes for arc4.uint64 - btoi - txna ApplicationArgs 5 - dup - len - intc_3 // 8 - == - assert // invalid number of bytes for arc4.uint64 - btoi - txna ApplicationArgs 6 - dup - len - intc_1 // 1 - == - assert // invalid number of bytes for arc4.uint8 - txna ApplicationArgs 7 - dup - cover 7 - len - pushint 2 - == - assert // invalid number of bytes for arc4.uint16 - txna ApplicationArgs 8 - dup - cover 7 - dup - intc_0 // 0 - extract_uint16 // on error: invalid array length header - dup - cover 8 - pushint 2 - * - pushint 2 - + - swap - len - == - assert // invalid number of bytes for arc4.dynamic_array - txna ApplicationArgs 9 - dup - cover 7 - dup - intc_0 // 0 - extract_uint16 // on error: invalid array length header - dup - cover 8 - intc_3 // 8 - * - pushint 2 - + - swap - len - == - assert // invalid number of bytes for arc4.dynamic_array - txna ApplicationArgs 10 - dup - intc_0 // 0 - extract_uint16 // on error: invalid array length header - dup - cover 8 - pushint 16 - * - pushint 2 - + - swap - len - == - assert // invalid number of bytes for arc4.dynamic_array> - // modules/core_financial/common.py:227 - // self.assert_caller_is_arranger() - callsub assert_caller_is_arranger - // modules/core_financial/common.py:228 - // assert self.status == enums.STATUS_INACTIVE, err.ALREADY_CONFIGURED - intc_0 // 0 - bytec_2 // "status" - app_global_get_ex - assert // check self.status exists - ! - assert // D-ASA already configured - // modules/core_financial/common.py:55-56 - // # The reference implementation has on-chain denomination with ASA - // _creator, exists = op.AssetParamsGet.asset_creator(denomination_asset_id) - dig 5 - asset_params_get AssetCreator - bury 1 - // modules/core_financial/common.py:57 - // assert exists, err.INVALID_DENOMINATION - assert // Denomination asset is not properly set - // modules/core_financial/common.py:60 - // self.denomination_asset_id = denomination_asset_id - bytec 16 // "denomination_asset_id" - dig 6 - app_global_put - // modules/core_financial/common.py:65 - // settlement_asset_id == self.denomination_asset_id - dig 4 - uncover 6 - == - // modules/core_financial/common.py:63-66 - // # The reference implementation settlement asset is the denomination asset - // assert ( - // settlement_asset_id == self.denomination_asset_id - // ), err.INVALID_SETTLEMENT_ASSET - assert // Different settlement asset not supported, must be equal to denomination asset - // modules/core_financial/common.py:69 - // self.settlement_asset_id = settlement_asset_id - bytec 9 // "settlement_asset_id" - dig 5 - app_global_put - // modules/core_financial/common.py:70-76 - // # The reference implementation has on-chain settlement with ASA - // itxn.AssetTransfer( - // xfer_asset=self.settlement_asset_id, - // asset_receiver=Global.current_application_address, - // asset_amount=0, - // fee=Global.min_txn_fee, - // ).submit() - itxn_begin - // modules/core_financial/common.py:75 - // fee=Global.min_txn_fee, - global MinTxnFee - // modules/core_financial/common.py:73 - // asset_receiver=Global.current_application_address, - global CurrentApplicationAddress - // modules/core_financial/common.py:74 - // asset_amount=0, - intc_0 // 0 - itxn_field AssetAmount - itxn_field AssetReceiver - uncover 5 - itxn_field XferAsset - // modules/core_financial/common.py:70-71 - // # The reference implementation has on-chain settlement with ASA - // itxn.AssetTransfer( - pushint 4 // axfer - itxn_field TypeEnum - itxn_field Fee - // modules/core_financial/common.py:70-76 - // # The reference implementation has on-chain settlement with ASA - // itxn.AssetTransfer( - // xfer_asset=self.settlement_asset_id, - // asset_receiver=Global.current_application_address, - // asset_amount=0, - // fee=Global.min_txn_fee, - // ).submit() - itxn_submit - // modules/core_financial/common.py:238-239 - // # Set Principal and Minimum Denomination - // assert principal % minimum_denomination == 0, err.INVALID_MINIMUM_DENOMINATION - dig 3 - dig 2 - % - ! - assert // Minimum denomination is not a divisor of principal - // modules/core_financial/common.py:240 - // self.unit_value = minimum_denomination - bytec 6 // "unit_value" - dig 2 - app_global_put - // modules/core_financial/common.py:241 - // self.total_units = principal // minimum_denomination - uncover 3 - uncover 2 - / - bytec 15 // "total_units" - swap - app_global_put - // modules/core_financial/common.py:242 - // self.principal_discount = principal_discount - bytec 26 // "principal_discount" - uncover 2 - app_global_put - // modules/core_financial/common.py:244-245 - // # Set Day-Count Convention - // self.assert_day_count_convention(day_count_convention.as_uint64()) - btoi - dup - // modules/core_financial/common.py:79-83 - // # The reference implementation supports only the Actual/Actual and Continuous day-count conventions - // assert day_count_convention in ( - // UInt64(cst.DCC_A_A), - // UInt64(cst.DCC_CONT), - // ), err.INVALID_DAY_COUNT_CONVENTION - bz asset_config_bool_true@3 - dup - // modules/core_financial/common.py:82 - // UInt64(cst.DCC_CONT), - intc 4 // 255 - // modules/core_financial/common.py:79-83 - // # The reference implementation supports only the Actual/Actual and Continuous day-count conventions - // assert day_count_convention in ( - // UInt64(cst.DCC_A_A), - // UInt64(cst.DCC_CONT), - // ), err.INVALID_DAY_COUNT_CONVENTION - == - bz asset_config_bool_false@4 - -asset_config_bool_true@3: - intc_1 // 1 - -asset_config_bool_merge@5: - // modules/core_financial/common.py:79-83 - // # The reference implementation supports only the Actual/Actual and Continuous day-count conventions - // assert day_count_convention in ( - // UInt64(cst.DCC_A_A), - // UInt64(cst.DCC_CONT), - // ), err.INVALID_DAY_COUNT_CONVENTION - assert // Invalid day-count convention ID - // modules/core_financial/common.py:86 - // self.day_count_convention = day_count_convention - bytec 17 // "day_count_convention" - dig 1 - app_global_put - // modules/core_financial/common.py:248-249 - // # Set Interest Rate - // self.assert_interest_rate(interest_rate.as_uint64()) - dig 6 - btoi - bury 8 - // modules/core_financial/common.py:89-90 - // # This subroutine must be used after the principal discount has been set - // if not self.principal_discount: - intc_0 // 0 - bytec 26 // "principal_discount" - app_global_get_ex - assert // check self.principal_discount exists - bnz asset_config_after_if_else@7 - // modules/core_financial/common.py:91 - // assert interest_rate > UInt64(0), err.INVALID_INTEREST_RATE - dig 7 - assert // Interest rate is not properly defined - -asset_config_after_if_else@7: - // modules/core_financial/common.py:94 - // self.interest_rate = interest_rate - bytec 33 // "interest_rate" - dig 8 - app_global_put - // modules/core_financial/coupon.py:105 - // assert coupon_rates.length, err.INVALID_COUPON_RATES - dig 4 - dup - assert // Coupon rates are not properly defined - // modules/core_financial/coupon.py:108 - // self.total_coupons = coupon_rates.length - bytec 7 // "total_coupons" - dig 1 - app_global_put - // modules/core_financial/coupon.py:109 - // self.coupon_rates.value = coupon_rates.copy() - bytec 19 // 0x636f75706f6e5261746573 - box_del - pop - bytec 19 // 0x636f75706f6e5261746573 - dig 7 - box_put - // modules/core_financial/common.py:104 - // time_events.length == self.total_coupons + cfg.TIME_SCHEDULE_LIMITS - pushint 4 - + - dig 3 - == - // modules/core_financial/common.py:103-105 - // assert ( - // time_events.length == self.total_coupons + cfg.TIME_SCHEDULE_LIMITS - // ), err.INVALID_TIME_EVENTS_LENGTH - assert // Time events length is invalid - // modules/core_financial/common.py:258 - // self.assert_time_events_sorted(time_events) - dig 3 - callsub assert_time_events_sorted - // modules/core_financial/common.py:127 - // self.time_events.value = time_events.copy() - bytec 12 // 0x74696d654576656e7473 - box_del - pop - bytec 12 // 0x74696d654576656e7473 - dig 1 - box_put - // modules/core_financial/common.py:128-130 - // self.primary_distribution_opening_date = time_events[ - // cfg.PRIMARY_DISTRIBUTION_OPENING_DATE_IDX - // ] - dup - extract 2 0 - dig 1 - pushint 2 - extract_uint64 - // modules/core_financial/common.py:128 - // self.primary_distribution_opening_date = time_events[ - bytec 10 // "primary_distribution_opening_date" - // modules/core_financial/common.py:128-130 - // self.primary_distribution_opening_date = time_events[ - // cfg.PRIMARY_DISTRIBUTION_OPENING_DATE_IDX - // ] - swap - app_global_put - // modules/core_financial/common.py:131-133 - // self.primary_distribution_closure_date = time_events[ - // cfg.PRIMARY_DISTRIBUTION_CLOSURE_DATE_IDX - // ] - dig 1 - pushint 10 - extract_uint64 - // modules/core_financial/common.py:131 - // self.primary_distribution_closure_date = time_events[ - bytec 27 // "primary_distribution_closure_date" - // modules/core_financial/common.py:131-133 - // self.primary_distribution_closure_date = time_events[ - // cfg.PRIMARY_DISTRIBUTION_CLOSURE_DATE_IDX - // ] - swap - app_global_put - // modules/core_financial/common.py:134 - // self.issuance_date = time_events[cfg.ISSUANCE_DATE_IDX] - dig 1 - pushint 18 - extract_uint64 - bytec 4 // "issuance_date" - swap - app_global_put - // modules/core_financial/common.py:135 - // self.maturity_date = time_events[cfg.MATURITY_DATE_IDX] - swap - intc_0 // 0 - extract_uint16 // on error: invalid array length header - intc_1 // 1 - - - intc_3 // 8 - * - extract_uint64 - bytec 5 // "maturity_date" - swap - app_global_put - // modules/core_financial/common.py:138 - // assert not time_periods.length, err.INVALID_TIME_PERIODS - dig 1 - ! - assert // Time periods are not properly defined - // modules/core_financial/common.py:265 - // self.status = UInt64(enums.STATUS_ACTIVE) - bytec_2 // "status" - pushint 100 - app_global_put - // modules/actus/pam.py:26 - // @arc4.abimethod - intc_1 // 1 - return - -asset_config_bool_false@4: - intc_0 // 0 - b asset_config_bool_merge@5 - - -// modules.core_financial.coupon.FixedCouponCashflowMixin.get_account_units_current_value[routing]() -> void: -get_account_units_current_value: - intc_0 // 0 - pushbytes "" - dupn 4 - // modules/core_financial/coupon.py:201 - // @arc4.abimethod(readonly=True) - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - txna ApplicationArgs 2 - dup - len - intc_3 // 8 - == - assert // invalid number of bytes for arc4.uint64 - btoi - // modules/core_financial/coupon.py:222 - // self.primary_distribution_opening_date - intc_0 // 0 - bytec 10 // "primary_distribution_opening_date" - app_global_get_ex - assert // check self.primary_distribution_opening_date exists - // modules/core_financial/coupon.py:222-223 - // self.primary_distribution_opening_date - // and Global.latest_timestamp >= self.primary_distribution_opening_date - bz get_account_units_current_value_bool_false@4 - // modules/core_financial/coupon.py:223 - // and Global.latest_timestamp >= self.primary_distribution_opening_date - global LatestTimestamp - intc_0 // 0 - bytec 10 // "primary_distribution_opening_date" - app_global_get_ex - assert // check self.primary_distribution_opening_date exists - >= - // modules/core_financial/coupon.py:222-223 - // self.primary_distribution_opening_date - // and Global.latest_timestamp >= self.primary_distribution_opening_date - bz get_account_units_current_value_bool_false@4 - intc_1 // 1 - -get_account_units_current_value_bool_merge@5: - // modules/core_financial/coupon.py:221-224 - // assert ( - // self.primary_distribution_opening_date - // and Global.latest_timestamp >= self.primary_distribution_opening_date - // ), err.NO_PRIMARY_DISTRIBUTION - assert // Primary distribution not yet executed - // modules/accounting.py:31 - // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec_1 // 0x52333023 - dig 2 - concat - dup - bury 9 - box_len - bury 1 - assert // Invalid account holding address - // modules/core_financial/coupon.py:226 - // assert 0 < units <= self.account[holding_address].units, err.INVALID_UNITS - dup - bz get_account_units_current_value_bool_false@8 - dig 7 - box_get - assert // check self.account entry exists - intc_2 // 32 - extract_uint64 - dig 1 - >= - bz get_account_units_current_value_bool_false@8 - intc_1 // 1 - -get_account_units_current_value_bool_merge@9: - // modules/core_financial/coupon.py:226 - // assert 0 < units <= self.account[holding_address].units, err.INVALID_UNITS - assert // Invalid amount of units for the account - // modules/core_financial/coupon.py:228-229 - // # Value during primary distribution and at maturity - // account_units_nominal_value = self.account_units_value(holding_address, units) - dig 1 - dup - dig 2 - callsub account_units_value - bury 8 - // modules/core_financial/coupon.py:230-231 - // # Accruing interest during primary distribution and at maturity - // accrued_interest = UInt64() - intc_0 // 0 - bury 7 - // modules/core_financial/coupon.py:232 - // numerator = UInt64() - intc_0 // 0 - bury 4 - // modules/core_financial/coupon.py:233 - // denominator = UInt64() - intc_0 // 0 - bury 6 - // modules/core_financial/coupon.py:235-236 - // # Accruing interest - // due_coupons = self.count_due_coupons() - callsub count_due_coupons - dup - bury 6 - // modules/core_financial/coupon.py:237 - // self.assert_no_pending_coupon_payment(holding_address, due_coupons) - swap - dig 1 - callsub assert_no_pending_coupon_payment - // modules/core_financial/coupon.py:238 - // if self.is_accruing_interest(due_coupons): - callsub is_accruing_interest - bz get_account_units_current_value_after_if_else@11 - // modules/core_financial/coupon.py:239 - // day_count_factor = self.day_count_factor(due_coupons) - dig 3 - dup - callsub day_count_factor - // modules/core_financial/coupon.py:240-242 - // accrued_interest = self.accrued_interest_amount( - // holding_address, units, due_coupons - // ) - dig 3 - dig 3 - uncover 3 - callsub accrued_interest_amount - bury 7 - // modules/core_financial/coupon.py:243 - // numerator = day_count_factor.numerator - dup - intc_0 // 0 - extract_uint64 - bury 4 - // modules/core_financial/coupon.py:244 - // denominator = day_count_factor.denominator - intc_3 // 8 - extract_uint64 - bury 5 - -get_account_units_current_value_after_if_else@11: - // modules/core_financial/coupon.py:249-252 - // day_count_factor=typ.DayCountFactor( - // numerator=numerator, - // denominator=denominator, - // ), - dig 2 - itob - dig 5 - itob - concat - // modules/core_financial/coupon.py:246-253 - // return typ.CurrentUnitsValue( - // units_value=account_units_nominal_value, - // accrued_interest=accrued_interest, - // day_count_factor=typ.DayCountFactor( - // numerator=numerator, - // denominator=denominator, - // ), - // ) - dig 7 - itob - dig 7 - itob - concat - swap - concat - // modules/core_financial/coupon.py:201 - // @arc4.abimethod(readonly=True) - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - -get_account_units_current_value_bool_false@8: - intc_0 // 0 - b get_account_units_current_value_bool_merge@9 - -get_account_units_current_value_bool_false@4: - intc_0 // 0 - b get_account_units_current_value_bool_merge@5 - - -// modules.core_financial.coupon.FixedCouponCashflowMixin.get_coupon_rates[routing]() -> void: -get_coupon_rates: - // modules/core_financial/coupon.py:263 - // coupon_rates = typ.CouponRates() - bytec 30 // 0x0000 - // modules/accounting.py:25 - // return self.status == enm.STATUS_ACTIVE - intc_0 // 0 - bytec_2 // "status" - app_global_get_ex - assert // check self.status exists - pushint 100 - == - // modules/core_financial/coupon.py:264 - // if self.status_is_active(): - bz get_coupon_rates_after_if_else@3 - // modules/core_financial/coupon.py:265 - // coupon_rates = self.coupon_rates.value.copy() - bytec 19 // 0x636f75706f6e5261746573 - box_get - swap - bury 2 - assert // check self.coupon_rates exists - -get_coupon_rates_after_if_else@3: - // modules/core_financial/coupon.py:255 - // @arc4.abimethod(readonly=True) - bytec_0 // 0x151f7c75 - dig 1 - concat - log - intc_1 // 1 - return - - -// modules.core_financial.coupon.FixedCouponCashflowMixin.get_payment_amount[routing]() -> void: -get_payment_amount: - pushbytes "" - // modules/core_financial/coupon.py:268 - // @arc4.abimethod(readonly=True) - txna ApplicationArgs 1 - dupn 2 - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/accounting.py:31 - // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec_1 // 0x52333023 - swap - concat - dup - box_len - bury 1 - assert // Invalid account holding address - // modules/core_financial/coupon.py:283 - // interest_amount = UInt64() - intc_0 // 0 - // modules/core_financial/coupon.py:284 - // principal_amount = UInt64() - dupn 2 - // modules/accounting.py:25 - // return self.status == enm.STATUS_ACTIVE - bytec_2 // "status" - app_global_get_ex - assert // check self.status exists - pushint 100 - == - // modules/core_financial/coupon.py:285 - // if self.status_is_active(): - bz get_payment_amount_after_if_else@6 - // modules/core_financial/coupon.py:286 - // paid_coupons = self.account[holding_address].paid_coupons - dig 2 - box_get - assert // check self.account entry exists - pushint 48 - extract_uint64 - dup - bury 6 - // modules/core_financial/coupon.py:287 - // if paid_coupons < self.total_coupons: - intc_0 // 0 - bytec 7 // "total_coupons" - app_global_get_ex - assert // check self.total_coupons exists - < - bz get_payment_amount_else_body@4 - // modules/core_financial/coupon.py:290 - // self.account_total_units_value(holding_address), - dig 3 - callsub account_total_units_value - // modules/core_financial/coupon.py:291 - // paid_coupons + 1, - dig 5 - intc_1 // 1 - + - // modules/core_financial/coupon.py:288-292 - // # Coupon Payment - // interest_amount = self.coupon_interest_amount( - // self.account_total_units_value(holding_address), - // paid_coupons + 1, - // ) - callsub coupon_interest_amount - bury 2 - -get_payment_amount_after_if_else@6: - // modules/core_financial/coupon.py:296-299 - // return typ.PaymentAmounts( - // interest=interest_amount, - // principal=principal_amount, - // ) - dig 1 - itob - dig 1 - itob - concat - // modules/core_financial/coupon.py:268 - // @arc4.abimethod(readonly=True) - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - -get_payment_amount_else_body@4: - // modules/core_financial/coupon.py:294-295 - // # Principal Payment - // principal_amount = self.account_total_units_value(holding_address) - dig 3 - callsub account_total_units_value - bury 1 - b get_payment_amount_after_if_else@6 - - -// modules.core_financial.coupon.FixedCouponCashflowMixin.get_coupons_status[routing]() -> void: -get_coupons_status: - // modules/core_financial/coupon.py:310 - // due_coupons = self.count_due_coupons() - callsub count_due_coupons - dupn 2 - // modules/core_financial/coupon.py:311 - // next_coupon_due_date = self.next_coupon_due_date(due_coupons) - callsub next_coupon_due_date - swap - // modules/core_financial/coupon.py:312 - // all_due_coupons_paid = self.all_due_coupons_paid(due_coupons) - dup - callsub all_due_coupons_paid - swap - // modules/core_financial/coupon.py:313 - // numerator = UInt64() - intc_0 // 0 - swap - // modules/core_financial/coupon.py:314 - // denominator = UInt64() - intc_0 // 0 - swap - // modules/core_financial/coupon.py:315 - // if self.is_accruing_interest(due_coupons): - callsub is_accruing_interest - bz get_coupons_status_after_if_else@3 - // modules/core_financial/coupon.py:316 - // day_count_factor = self.day_count_factor(due_coupons) - dig 4 - callsub day_count_factor - // modules/core_financial/coupon.py:317 - // numerator = day_count_factor.numerator - dup - intc_0 // 0 - extract_uint64 - bury 3 - // modules/core_financial/coupon.py:318 - // denominator = day_count_factor.denominator - intc_3 // 8 - extract_uint64 - bury 1 - -get_coupons_status_after_if_else@3: - // modules/core_financial/coupon.py:320 - // total_coupons=self.total_coupons, - intc_0 // 0 - bytec 7 // "total_coupons" - app_global_get_ex - assert // check self.total_coupons exists - // modules/core_financial/coupon.py:323-326 - // day_count_factor=typ.DayCountFactor( - // numerator=numerator, - // denominator=denominator, - // ), - dig 2 - itob - dig 2 - itob - concat - // modules/core_financial/coupon.py:319-328 - // return typ.CouponsInfo( - // total_coupons=self.total_coupons, - // due_coupons=due_coupons, - // next_coupon_due_date=next_coupon_due_date, - // day_count_factor=typ.DayCountFactor( - // numerator=numerator, - // denominator=denominator, - // ), - // all_due_coupons_paid=all_due_coupons_paid, - // ) - swap - itob - dig 6 - itob - concat - dig 5 - itob - concat - swap - concat - bytec 31 // 0x00 - intc_0 // 0 - dig 5 - setbit - concat - // modules/core_financial/coupon.py:301 - // @arc4.abimethod(readonly=True) - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.payment_agent.coupon.CouponPaymentAgentMixin.pay_coupon[routing]() -> void: -pay_coupon: - // modules/payment_agent/coupon.py:30 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - txna ApplicationArgs 2 - dup - intc_0 // 0 - extract_uint16 // on error: invalid array length header - pushint 2 - + - dig 1 - len - == - assert // invalid number of bytes for arc4.dynamic_array - extract 2 0 - swap - // modules/accounting.py:25 - // return self.status == enm.STATUS_ACTIVE - intc_0 // 0 - bytec_2 // "status" - app_global_get_ex - assert // check self.status exists - pushint 100 - == - // modules/core_financial/coupon.py:39 - // assert self.status_is_active(), err.UNAUTHORIZED - assert // Not authorized - // modules/core_financial/coupon.py:40 - // self.assert_is_not_asset_defaulted() - callsub assert_is_not_asset_defaulted - // modules/core_financial/coupon.py:41 - // self.assert_is_not_asset_suspended() - callsub assert_is_not_asset_suspended - // modules/accounting.py:31 - // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec_1 // 0x52333023 - dig 1 - concat - dup - cover 2 - dup - box_len - bury 1 - assert // Invalid account holding address - // modules/core_financial/coupon.py:44 - // units = self.account[holding_address].units - dup - box_get - pop - intc_2 // 32 - extract_uint64 - dup - cover 3 - // modules/core_financial/coupon.py:45 - // assert units > 0, err.NO_UNITS - assert // No D-ASA units - // modules/core_financial/coupon.py:47 - // due_coupons = self.count_due_coupons() - callsub count_due_coupons - // modules/core_financial/coupon.py:48 - // account_paid_coupons = self.account[holding_address].paid_coupons - swap - box_get - assert // check self.account entry exists - pushint 48 - extract_uint64 - // modules/core_financial/coupon.py:49 - // assert due_coupons > account_paid_coupons, err.NO_DUE_COUPON - swap - dig 1 - > - assert // No due coupon to pay - // modules/core_financial/coupon.py:50-53 - // # The following conditions verify if other accounts are still waiting for the payment of previous coupons - // assert self.all_due_coupons_paid( - // account_paid_coupons - // ), err.PENDING_COUPON_PAYMENT - dup - callsub all_due_coupons_paid - assert // Pending due coupon payment - // modules/core_financial/coupon.py:197 - // self.account_total_units_value(holding_address), - dig 1 - callsub account_total_units_value - // modules/core_financial/coupon.py:198 - // account_paid_coupons + 1, - swap - intc_1 // 1 - + - // modules/core_financial/coupon.py:196-199 - // return self.coupon_interest_amount( - // self.account_total_units_value(holding_address), - // account_paid_coupons + 1, - // ) - callsub coupon_interest_amount - swap - // modules/payment_agent/coupon.py:54 - // self.assert_payment_authorization(holding_address) - dup - callsub assert_payment_authorization - // modules/payment_agent/coupon.py:57 - // if self.is_payment_executable(holding_address): - callsub is_payment_executable - bz pay_coupon_else_body@3 - // modules/payment_agent/coupon.py:58-59 - // # The reference implementation has on-chain payment agent - // self.assert_enough_funds(payment_amount) - dupn 2 - callsub assert_enough_funds - // modules/payment_agent/coupon.py:60-61 - // # The reference implementation has the same asset for denomination and settlement, no conversion needed - // self.pay(self.account[holding_address].payment_address, payment_amount) - dig 3 - box_get - assert // check self.account entry exists - extract 0 32 - swap - callsub pay - -pay_coupon_after_if_else@4: - // modules/core_financial/coupon.py:63 - // self.account[holding_address].paid_coupons += 1 - dig 2 - dup - box_get - assert // check self.account entry exists - pushint 48 - extract_uint64 - intc_1 // 1 - + - itob - pushint 48 - swap - box_replace - // modules/core_financial/coupon.py:64 - // self.paid_coupon_units += units - intc_0 // 0 - bytec 28 // "paid_coupon_units" - app_global_get_ex - assert // check self.paid_coupon_units exists - dig 2 - + - bytec 28 // "paid_coupon_units" - swap - app_global_put - // modules/payment_agent/coupon.py:17 - // contract_id=Global.current_application_id.id, - global CurrentApplicationID - // modules/payment_agent/coupon.py:20 - // time=Global.latest_timestamp, - global LatestTimestamp - // modules/payment_agent/coupon.py:22 - // currency_id=self.denomination_asset_id.id, - intc_0 // 0 - bytec 16 // "denomination_asset_id" - app_global_get_ex - assert // check self.denomination_asset_id exists - // modules/payment_agent/coupon.py:23 - // currency_unit=self.denomination_asset_id.unit_name, - dup - asset_params_get AssetUnitName - assert // asset exists - // modules/payment_agent/coupon.py:24 - // nominal_value=self.circulating_units * self.unit_value, - intc_0 // 0 - bytec_3 // "circulating_units" - app_global_get_ex - assert // check self.circulating_units exists - intc_0 // 0 - bytec 6 // "unit_value" - app_global_get_ex - assert // check self.unit_value exists - * - // modules/payment_agent/coupon.py:16-27 - // Event( - // contract_id=Global.current_application_id.id, - // type=arc4.UInt8(enums.EVT_TYPE_IP), - // type_name=String("IP"), - // time=Global.latest_timestamp, - // payoff=payoff, - // currency_id=self.denomination_asset_id.id, - // currency_unit=self.denomination_asset_id.unit_name, - // nominal_value=self.circulating_units * self.unit_value, - // nominal_rate_bps=arc4.UInt16(0), # TODO: Add interest rate - // nominal_accrued=UInt64(0), - // ) - uncover 4 - itob - pushbytes 0x080037 - concat - uncover 4 - itob - concat - dig 4 - itob - swap - dig 1 - concat - uncover 4 - itob - concat - dig 3 - len - itob - extract 6 2 - uncover 4 - concat - swap - bytec 35 // 0x003b - concat - uncover 3 - itob - concat - // modules/payment_agent/coupon.py:25 - // nominal_rate_bps=arc4.UInt16(0), # TODO: Add interest rate - bytec 30 // 0x0000 - // modules/payment_agent/coupon.py:16-27 - // Event( - // contract_id=Global.current_application_id.id, - // type=arc4.UInt8(enums.EVT_TYPE_IP), - // type_name=String("IP"), - // time=Global.latest_timestamp, - // payoff=payoff, - // currency_id=self.denomination_asset_id.id, - // currency_unit=self.denomination_asset_id.unit_name, - // nominal_value=self.circulating_units * self.unit_value, - // nominal_rate_bps=arc4.UInt16(0), # TODO: Add interest rate - // nominal_accrued=UInt64(0), - // ) - concat - // modules/payment_agent/coupon.py:26 - // nominal_accrued=UInt64(0), - intc_0 // 0 - // modules/payment_agent/coupon.py:16-27 - // Event( - // contract_id=Global.current_application_id.id, - // type=arc4.UInt8(enums.EVT_TYPE_IP), - // type_name=String("IP"), - // time=Global.latest_timestamp, - // payoff=payoff, - // currency_id=self.denomination_asset_id.id, - // currency_unit=self.denomination_asset_id.unit_name, - // nominal_value=self.circulating_units * self.unit_value, - // nominal_rate_bps=arc4.UInt16(0), # TODO: Add interest rate - // nominal_accrued=UInt64(0), - // ) - itob - concat - pushbytes 0x00024950 - concat - swap - concat - // modules/payment_agent/coupon.py:15-28 - // arc4.emit( - // Event( - // contract_id=Global.current_application_id.id, - // type=arc4.UInt8(enums.EVT_TYPE_IP), - // type_name=String("IP"), - // time=Global.latest_timestamp, - // payoff=payoff, - // currency_id=self.denomination_asset_id.id, - // currency_unit=self.denomination_asset_id.unit_name, - // nominal_value=self.circulating_units * self.unit_value, - // nominal_rate_bps=arc4.UInt16(0), # TODO: Add interest rate - // nominal_accrued=UInt64(0), - // ) - // ) - bytec 36 // method "Event(uint64,uint8,string,uint64,uint64,uint64,byte[],uint64,uint16,uint64)" - swap - concat - log - // modules/payment_agent/coupon.py:70 - // timestamp=Global.latest_timestamp, - global LatestTimestamp - // modules/payment_agent/coupon.py:68-72 - // return typ.PaymentResult( - // amount=payment_amount, - // timestamp=Global.latest_timestamp, - // context=payment_info, # TODO: Add info on failed payment - // ) - itob - concat - dig 4 - dup - len - itob - extract 6 2 - swap - concat - swap - bytec 37 // 0x0012 - concat - swap - concat - // modules/payment_agent/coupon.py:30 - // @arc4.abimethod - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - -pay_coupon_else_body@3: - // modules/payment_agent/coupon.py:63-64 - // # Accounts suspended or not opted in at the time of payments must not stall the D-ASA - // payment_amount = UInt64() - intc_0 // 0 - bury 1 - b pay_coupon_after_if_else@4 - - -// modules.payment_agent.principal.PrincipalPaymentAgentMixin.pay_principal[routing]() -> void: -pay_principal: - // modules/payment_agent/principal.py:30 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - txna ApplicationArgs 2 - dup - intc_0 // 0 - extract_uint16 // on error: invalid array length header - pushint 2 - + - dig 1 - len - == - assert // invalid number of bytes for arc4.dynamic_array - extract 2 0 - swap - // modules/accounting.py:25 - // return self.status == enm.STATUS_ACTIVE - intc_0 // 0 - bytec_2 // "status" - app_global_get_ex - assert // check self.status exists - pushint 100 - == - // modules/actus/pam.py:16-17 - // # The reference implementation does not restrict caller authorization - // assert self.status_is_active(), err.UNAUTHORIZED - assert // Not authorized - // modules/actus/pam.py:18 - // self.assert_is_not_asset_defaulted() - callsub assert_is_not_asset_defaulted - // modules/actus/pam.py:19 - // self.assert_is_not_asset_suspended() - callsub assert_is_not_asset_suspended - // modules/accounting.py:31 - // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec_1 // 0x52333023 - dig 1 - concat - dup - cover 2 - dup - box_len - bury 1 - assert // Invalid account holding address - // modules/actus/pam.py:21 - // units = self.account[holding_address].units - box_get - pop - intc_2 // 32 - extract_uint64 - // modules/actus/pam.py:22 - // assert units > 0, err.NO_UNITS - assert // No D-ASA units - // modules/actus/pam.py:23 - // assert Global.latest_timestamp >= self.maturity_date, err.NOT_MATURE - global LatestTimestamp - intc_0 // 0 - bytec 5 // "maturity_date" - app_global_get_ex - assert // check self.maturity_date exists - >= - assert // Not mature - // modules/core_financial/coupon.py:78 - // self.count_due_coupons() - callsub count_due_coupons - // modules/core_financial/coupon.py:76-79 - // # Principal payment is forbidden in case of pending coupon payments - // assert self.all_due_coupons_paid( - // self.count_due_coupons() - // ), err.PENDING_COUPON_PAYMENT - callsub all_due_coupons_paid - assert // Pending due coupon payment - // modules/core_financial/coupon.py:80 - // return self.account_total_units_value(holding_address) - dup - callsub account_total_units_value - swap - // modules/payment_agent/principal.py:53 - // self.assert_payment_authorization(holding_address) - dup - callsub assert_payment_authorization - // modules/payment_agent/principal.py:56 - // if self.is_payment_executable(holding_address): - callsub is_payment_executable - bz pay_principal_else_body@3 - // modules/payment_agent/principal.py:57-58 - // # The reference implementation has on-chain payment agent - // self.assert_enough_funds(payment_amount) - dupn 2 - callsub assert_enough_funds - // modules/payment_agent/principal.py:59-60 - // # The reference implementation has the same asset for denomination and settlement, no conversion needed - // self.pay(self.account[holding_address].payment_address, payment_amount) - dig 2 - box_get - assert // check self.account entry exists - extract 0 32 - swap - callsub pay - -pay_principal_after_if_else@4: - // modules/core_financial/common.py:199 - // self.circulating_units -= self.account[holding_address].units - intc_0 // 0 - bytec_3 // "circulating_units" - app_global_get_ex - assert // check self.circulating_units exists - dig 2 - dup - cover 2 - box_get - assert // check self.account entry exists - intc_2 // 32 - extract_uint64 - - - bytec_3 // "circulating_units" - swap - app_global_put - // modules/core_financial/common.py:200 - // self.account[holding_address].units = UInt64() - intc_0 // 0 - itob - swap - intc_2 // 32 - dig 2 - box_replace - // modules/core_financial/common.py:201 - // self.end_if_no_circulating_units() - callsub end_if_no_circulating_units - // modules/payment_agent/principal.py:17 - // contract_id=Global.current_application_id.id, - global CurrentApplicationID - // modules/payment_agent/principal.py:20 - // time=Global.latest_timestamp, - global LatestTimestamp - // modules/payment_agent/principal.py:22 - // currency_id=self.denomination_asset_id.id, - intc_0 // 0 - bytec 16 // "denomination_asset_id" - app_global_get_ex - assert // check self.denomination_asset_id exists - // modules/payment_agent/principal.py:23 - // currency_unit=self.denomination_asset_id.unit_name, - dup - asset_params_get AssetUnitName - assert // asset exists - // modules/payment_agent/principal.py:24 - // nominal_value=self.circulating_units * self.unit_value, - intc_0 // 0 - bytec_3 // "circulating_units" - app_global_get_ex - assert // check self.circulating_units exists - intc_0 // 0 - bytec 6 // "unit_value" - app_global_get_ex - assert // check self.unit_value exists - * - // modules/payment_agent/principal.py:16-27 - // Event( - // contract_id=Global.current_application_id.id, - // type=arc4.UInt8(enums.EVT_TYPE_PR), - // type_name=String("PR"), - // time=Global.latest_timestamp, - // payoff=payoff, - // currency_id=self.denomination_asset_id.id, - // currency_unit=self.denomination_asset_id.unit_name, - // nominal_value=self.circulating_units * self.unit_value, - // nominal_rate_bps=arc4.UInt16(0), - // nominal_accrued=UInt64(0), - // ) - uncover 4 - itob - pushbytes 0x030037 - concat - uncover 4 - itob - concat - dig 5 - itob - swap - dig 1 - concat - uncover 4 - itob - concat - dig 3 - len - itob - extract 6 2 - uncover 4 - concat - swap - bytec 35 // 0x003b - concat - uncover 3 - itob - concat - // modules/payment_agent/principal.py:25 - // nominal_rate_bps=arc4.UInt16(0), - bytec 30 // 0x0000 - // modules/payment_agent/principal.py:16-27 - // Event( - // contract_id=Global.current_application_id.id, - // type=arc4.UInt8(enums.EVT_TYPE_PR), - // type_name=String("PR"), - // time=Global.latest_timestamp, - // payoff=payoff, - // currency_id=self.denomination_asset_id.id, - // currency_unit=self.denomination_asset_id.unit_name, - // nominal_value=self.circulating_units * self.unit_value, - // nominal_rate_bps=arc4.UInt16(0), - // nominal_accrued=UInt64(0), - // ) - concat - uncover 3 - concat - pushbytes 0x00025052 - concat - swap - concat - // modules/payment_agent/principal.py:15-28 - // arc4.emit( - // Event( - // contract_id=Global.current_application_id.id, - // type=arc4.UInt8(enums.EVT_TYPE_PR), - // type_name=String("PR"), - // time=Global.latest_timestamp, - // payoff=payoff, - // currency_id=self.denomination_asset_id.id, - // currency_unit=self.denomination_asset_id.unit_name, - // nominal_value=self.circulating_units * self.unit_value, - // nominal_rate_bps=arc4.UInt16(0), - // nominal_accrued=UInt64(0), - // ) - // ) - bytec 36 // method "Event(uint64,uint8,string,uint64,uint64,uint64,byte[],uint64,uint16,uint64)" - swap - concat - log - // modules/payment_agent/principal.py:69 - // timestamp=Global.latest_timestamp, - global LatestTimestamp - // modules/payment_agent/principal.py:67-71 - // return typ.PaymentResult( - // amount=payment_amount, - // timestamp=Global.latest_timestamp, - // context=payment_info, # TODO: Add info on failed payment - // ) - itob - concat - dig 3 - dup - len - itob - extract 6 2 - swap - concat - swap - bytec 37 // 0x0012 - concat - swap - concat - // modules/payment_agent/principal.py:30 - // @arc4.abimethod - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - -pay_principal_else_body@3: - // modules/payment_agent/principal.py:62-63 - // # Accounts suspended or not opted in at the time of payments must not stall the D-ASA - // payment_amount = UInt64() - intc_0 // 0 - bury 1 - b pay_principal_after_if_else@4 - - -// modules.transfer_agent.coupon.CouponTransferAgentMixin.asset_transfer[routing]() -> void: -asset_transfer: - intc_0 // 0 - dupn 2 - pushbytes "" - dup - // modules/transfer_agent/coupon.py:9 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - txna ApplicationArgs 2 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - txna ApplicationArgs 3 - dup - len - intc_3 // 8 - == - assert // invalid number of bytes for arc4.uint64 - btoi - // modules/accounting.py:25 - // return self.status == enm.STATUS_ACTIVE - intc_0 // 0 - bytec_2 // "status" - app_global_get_ex - assert // check self.status exists - pushint 100 - == - // modules/core_financial/common.py:153-158 - // self.status_is_active() - // and self.secondary_market_opening_date <= Global.latest_timestamp - // and ( - // not self.secondary_market_closure_date - // or Global.latest_timestamp < self.secondary_market_closure_date - // ) - bz asset_transfer_bool_false@6 - // modules/core_financial/common.py:154 - // and self.secondary_market_opening_date <= Global.latest_timestamp - intc_0 // 0 - bytec 18 // "secondary_market_opening_date" - app_global_get_ex - assert // check self.secondary_market_opening_date exists - global LatestTimestamp - <= - // modules/core_financial/common.py:153-158 - // self.status_is_active() - // and self.secondary_market_opening_date <= Global.latest_timestamp - // and ( - // not self.secondary_market_closure_date - // or Global.latest_timestamp < self.secondary_market_closure_date - // ) - bz asset_transfer_bool_false@6 - // modules/core_financial/common.py:156 - // not self.secondary_market_closure_date - intc_0 // 0 - bytec 11 // "secondary_market_closure_date" - app_global_get_ex - assert // check self.secondary_market_closure_date exists - // modules/core_financial/common.py:156-157 - // not self.secondary_market_closure_date - // or Global.latest_timestamp < self.secondary_market_closure_date - bz asset_transfer_bool_true@5 - // modules/core_financial/common.py:157 - // or Global.latest_timestamp < self.secondary_market_closure_date - global LatestTimestamp - intc_0 // 0 - bytec 11 // "secondary_market_closure_date" - app_global_get_ex - assert // check self.secondary_market_closure_date exists - < - // modules/core_financial/common.py:156-157 - // not self.secondary_market_closure_date - // or Global.latest_timestamp < self.secondary_market_closure_date - bz asset_transfer_bool_false@6 - -asset_transfer_bool_true@5: - intc_1 // 1 - -asset_transfer_bool_merge@7: - // modules/core_financial/common.py:152-159 - // assert ( - // self.status_is_active() - // and self.secondary_market_opening_date <= Global.latest_timestamp - // and ( - // not self.secondary_market_closure_date - // or Global.latest_timestamp < self.secondary_market_closure_date - // ) - // ), err.SECONDARY_MARKET_CLOSED - assert // Secondary market is closed - // modules/core_financial/common.py:169-171 - // # The reference implementation grants transfer right to D-ASA owners. Other implementations may relay on other - // # roles, external Apps through C2C calls (e.g., an order book), or off-chain transfer agents. - // assert Txn.sender == sender_holding_address, err.UNAUTHORIZED - txn Sender - dig 3 - dup - cover 2 - == - assert // Not authorized - // modules/core_financial/common.py:172 - // self.assert_is_not_asset_defaulted() - callsub assert_is_not_asset_defaulted - // modules/core_financial/common.py:173 - // self.assert_is_not_asset_suspended() - callsub assert_is_not_asset_suspended - // modules/accounting.py:31 - // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec_1 // 0x52333023 - dig 1 - concat - dup - bury 9 - dup - box_len - bury 1 - assert // Invalid account holding address - bytec_1 // 0x52333023 - dig 4 - dup - cover 2 - concat - dup - bury 10 - dup - box_len - bury 1 - assert // Invalid account holding address - // modules/core_financial/common.py:176 - // self.assert_is_not_account_suspended(sender_holding_address) - dig 3 - callsub assert_is_not_account_suspended - // modules/core_financial/common.py:177 - // self.assert_is_not_account_suspended(receiver_holding_address) - dig 1 - callsub assert_is_not_account_suspended - // modules/core_financial/common.py:190 - // assert sender_holding_address != receiver_holding_address, err.SELF_TRANSFER - uncover 3 - uncover 2 - != - assert // Sender and receiver must be different - // modules/core_financial/common.py:191 - // assert units > 0, err.NULL_TRANSFER - dig 2 - dup - assert // Transfer units must be greater than zero - // modules/core_financial/common.py:192 - // assert units <= self.account[sender_holding_address].units, err.OVER_TRANSFER - uncover 2 - box_get - assert // check self.account entry exists - dup - intc_2 // 32 - extract_uint64 - uncover 2 - >= - assert // Insufficient sender units to transfer - // modules/accounting.py:63 - // sender_unit_value = self.account[sender].unit_value - extract 40 8 - bury 9 - // modules/accounting.py:64 - // if self.account[receiver].units > UInt64(0): - box_get - assert // check self.account entry exists - intc_2 // 32 - extract_uint64 - bz asset_transfer_else_body@9 - // modules/accounting.py:58 - // self.account[sender].unit_value == self.account[receiver].unit_value - dig 6 - box_get - assert // check self.account entry exists - pushint 40 - extract_uint64 - dig 6 - box_get - assert // check self.account entry exists - pushint 40 - extract_uint64 - == - // modules/accounting.py:58-59 - // self.account[sender].unit_value == self.account[receiver].unit_value - // and self.account[sender].paid_coupons == self.account[receiver].paid_coupons - bz asset_transfer_bool_false@20 - // modules/accounting.py:59 - // and self.account[sender].paid_coupons == self.account[receiver].paid_coupons - dig 6 - box_get - assert // check self.account entry exists - pushint 48 - extract_uint64 - dig 6 - box_get - assert // check self.account entry exists - pushint 48 - extract_uint64 - == - // modules/accounting.py:58-59 - // self.account[sender].unit_value == self.account[receiver].unit_value - // and self.account[sender].paid_coupons == self.account[receiver].paid_coupons - bz asset_transfer_bool_false@20 - intc_1 // 1 - -asset_transfer_bool_merge@21: - // modules/accounting.py:57-60 - // assert ( - // self.account[sender].unit_value == self.account[receiver].unit_value - // and self.account[sender].paid_coupons == self.account[receiver].paid_coupons - // ), err.NON_FUNGIBLE_UNITS - assert // Sender and receiver units are not fungible - -asset_transfer_after_if_else@10: - // modules/transfer_agent/coupon.py:46-47 - // # Transferred units value (must be computed before the transfer) - // sender_unit_value = self.account[sender_holding_address].unit_value - dig 6 - dup - box_get - assert // check self.account entry exists - pushint 40 - extract_uint64 - bury 5 - // modules/core_financial/coupon.py:69-70 - // # Transfer is forbidden in case of pending coupon payments - // due_coupons = self.count_due_coupons() - callsub count_due_coupons - // modules/core_financial/coupon.py:71 - // self.assert_no_pending_coupon_payment(sender_holding_address, due_coupons) - dig 4 - dup - cover 2 - dig 1 - callsub assert_no_pending_coupon_payment - // modules/core_financial/coupon.py:72 - // return self.accrued_interest_amount(sender_holding_address, units, due_coupons) - swap - dig 3 - dup - cover 3 - uncover 2 - callsub accrued_interest_amount - bury 7 - // modules/accounting.py:71 - // assert units <= self.account[holding_address].units, err.OVER_TRANSFER - dig 1 - box_get - assert // check self.account entry exists - intc_2 // 32 - extract_uint64 - dup2 - <= - assert // Insufficient sender units to transfer - // modules/accounting.py:72 - // self.account[holding_address].units -= units - swap - - - itob - dig 1 - intc_2 // 32 - uncover 2 - box_replace - // modules/accounting.py:52 - // if self.account[holding_address].units == UInt64(0): - box_get - pop - intc_2 // 32 - extract_uint64 - bnz asset_transfer_after_if_else@16 - // modules/accounting.py:53 - // self.account[holding_address].unit_value = UInt64(0) - intc_0 // 0 - itob - dig 7 - dup - cover 2 - pushint 40 - dig 2 - box_replace - // modules/accounting.py:54 - // self.account[holding_address].paid_coupons = UInt64(0) - pushint 48 - swap - box_replace - -asset_transfer_after_if_else@16: - // modules/accounting.py:76 - // self.account[holding_address].units += units - dig 5 - dup - box_get - assert // check self.account entry exists - intc_2 // 32 - extract_uint64 - dig 2 - dup - cover 2 - + - itob - uncover 2 - intc_2 // 32 - uncover 2 - box_replace - // modules/transfer_agent/coupon.py:53 - // return units * sender_unit_value + accrued_interest - dig 4 - * - dig 5 - + - // modules/transfer_agent/coupon.py:9 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - -asset_transfer_bool_false@20: - intc_0 // 0 - b asset_transfer_bool_merge@21 - -asset_transfer_else_body@9: - // modules/accounting.py:67 - // self.account[receiver].unit_value = sender_unit_value - dig 5 - dup - pushint 40 - dig 10 - box_replace - // modules/accounting.py:68 - // self.account[receiver].paid_coupons = self.account[sender].paid_coupons - dig 7 - box_get - assert // check self.account entry exists - extract 48 8 - pushint 48 - swap - box_replace - b asset_transfer_after_if_else@10 - -asset_transfer_bool_false@6: - intc_0 // 0 - b asset_transfer_bool_merge@7 - - -// modules.core_financial.common.CoreFinancialCommonMixin.asset_create[routing]() -> void: -asset_create: - // modules/core_financial/common.py:267 - // @arc4.abimethod(create="require") - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - txna ApplicationArgs 2 - dup - len - dig 1 - pushint 38 - extract_uint16 // on error: invalid tuple encoding - dup - pushint 40 - == - assert // invalid tail pointer at index 7 of (uint8,uint8,uint8,uint8,uint8,uint8,uint8[32],(len+utf8[])) - dig 2 - swap - dig 2 - substring3 - intc_0 // 0 - extract_uint16 // on error: invalid array length header - pushint 42 - + - == - assert // invalid number of bytes for smart_contracts.abi_types.AssetMetadata - // modules/core_financial/common.py:276 - // self.arranger.value = arranger - bytec 8 // 0x52323023 - uncover 2 - app_global_put - // modules/core_financial/common.py:277 - // self.metadata = metadata.bytes - bytec 25 // "metadata" - swap - app_global_put - // modules/core_financial/common.py:267 - // @arc4.abimethod(create="require") - intc_1 // 1 - return - - -// modules.core_financial.common.CoreFinancialCommonMixin.asset_update[routing]() -> void: -asset_update: - // modules/core_financial/common.py:279 - // @arc4.abimethod(allow_actions=["UpdateApplication"]) - txna ApplicationArgs 1 - dup - len - dig 1 - pushint 38 - extract_uint16 // on error: invalid tuple encoding - dup - pushint 40 - == - assert // invalid tail pointer at index 7 of (uint8,uint8,uint8,uint8,uint8,uint8,uint8[32],(len+utf8[])) - dig 2 - swap - dig 2 - substring3 - intc_0 // 0 - extract_uint16 // on error: invalid array length header - pushint 42 - + - == - assert // invalid number of bytes for smart_contracts.abi_types.AssetMetadata - // modules/core_financial/common.py:284-287 - // # The reference implementation grants the update permissions to the Arranger. - // # Other implementations may disable D-ASA application updatability or change its authorizations. - // # ⚠️ WARNING: Application updates must be executed VERY carefully, as they might introduce breaking changes. - // self.assert_caller_is_arranger() - callsub assert_caller_is_arranger - // modules/core_financial/common.py:288 - // self.metadata = metadata.bytes - bytec 25 // "metadata" - swap - app_global_put - // modules/core_financial/common.py:279 - // @arc4.abimethod(allow_actions=["UpdateApplication"]) - intc_1 // 1 - return - - -// modules.core_financial.common.CoreFinancialCommonMixin.set_secondary_time_events[routing]() -> void: -set_secondary_time_events: - intc_0 // 0 - // modules/core_financial/common.py:290 - // @arc4.abimethod - txna ApplicationArgs 1 - dupn 2 - intc_0 // 0 - extract_uint16 // on error: invalid array length header - dup - intc_3 // 8 - * - pushint 2 - + - uncover 2 - len - == - assert // invalid number of bytes for arc4.dynamic_array - // modules/core_financial/common.py:311 - // self.assert_caller_is_arranger() - callsub assert_caller_is_arranger - // modules/accounting.py:28 - // return self.status == enm.STATUS_ENDED - intc_0 // 0 - bytec_2 // "status" - app_global_get_ex - assert // check self.status exists - intc 5 // 200 - == - // modules/core_financial/common.py:312 - // assert not self.status_is_ended(), err.UNAUTHORIZED - ! - assert // Not authorized - // modules/core_financial/common.py:313 - // self.assert_is_not_asset_defaulted() - callsub assert_is_not_asset_defaulted - // modules/core_financial/common.py:315 - // assert secondary_market_time_events.length >= 1, err.INVALID_TIME_EVENTS_LENGTH - dup - assert // Time events length is invalid - // modules/core_financial/common.py:316 - // if secondary_market_time_events.length > 1: - intc_1 // 1 - > - bz set_secondary_time_events_after_if_else@3 - // modules/core_financial/common.py:317 - // self.assert_time_events_sorted(secondary_market_time_events) - dup - callsub assert_time_events_sorted - bury 1 - -set_secondary_time_events_after_if_else@3: - // modules/core_financial/common.py:320 - // self.issuance_date - intc_0 // 0 - bytec 4 // "issuance_date" - app_global_get_ex - assert // check self.issuance_date exists - // modules/core_financial/common.py:321 - // <= secondary_market_time_events[cfg.SECONDARY_MARKET_OPENING_DATE_IDX] - dig 1 - dup - extract 2 0 - bury 4 - pushint 2 - extract_uint64 - // modules/core_financial/common.py:320-321 - // self.issuance_date - // <= secondary_market_time_events[cfg.SECONDARY_MARKET_OPENING_DATE_IDX] - swap - dig 1 - <= - // modules/core_financial/common.py:319-322 - // assert ( - // self.issuance_date - // <= secondary_market_time_events[cfg.SECONDARY_MARKET_OPENING_DATE_IDX] - // ), err.INVALID_SECONDARY_OPENING_DATE - assert // Invalid secondary market opening date - // modules/core_financial/common.py:323 - // self.secondary_market_opening_date = secondary_market_time_events[ - bytec 18 // "secondary_market_opening_date" - // modules/core_financial/common.py:323-325 - // self.secondary_market_opening_date = secondary_market_time_events[ - // cfg.SECONDARY_MARKET_OPENING_DATE_IDX - // ] - swap - app_global_put - // modules/core_financial/common.py:326 - // if self.maturity_date: - intc_0 // 0 - bytec 5 // "maturity_date" - app_global_get_ex - assert // check self.maturity_date exists - bz set_secondary_time_events_after_if_else@5 - // modules/core_financial/common.py:328 - // self.maturity_date - intc_0 // 0 - bytec 5 // "maturity_date" - app_global_get_ex - assert // check self.maturity_date exists - // modules/core_financial/common.py:329 - // >= secondary_market_time_events[cfg.SECONDARY_MARKET_CLOSURE_DATE_IDX] - dig 1 - intc_0 // 0 - extract_uint16 // on error: invalid array length header - intc_1 // 1 - - - intc_3 // 8 - * - dig 3 - swap - extract_uint64 - // modules/core_financial/common.py:328-329 - // self.maturity_date - // >= secondary_market_time_events[cfg.SECONDARY_MARKET_CLOSURE_DATE_IDX] - swap - dig 1 - >= - // modules/core_financial/common.py:327-330 - // assert ( - // self.maturity_date - // >= secondary_market_time_events[cfg.SECONDARY_MARKET_CLOSURE_DATE_IDX] - // ), err.INVALID_SECONDARY_CLOSURE_DATE - assert // Invalid secondary market closure date - // modules/core_financial/common.py:331 - // self.secondary_market_closure_date = secondary_market_time_events[ - bytec 11 // "secondary_market_closure_date" - // modules/core_financial/common.py:331-333 - // self.secondary_market_closure_date = secondary_market_time_events[ - // cfg.SECONDARY_MARKET_CLOSURE_DATE_IDX - // ] - swap - app_global_put - -set_secondary_time_events_after_if_else@5: - // modules/core_financial/common.py:335 - // secondary_market_opening_date=self.secondary_market_opening_date, - intc_0 // 0 - bytec 18 // "secondary_market_opening_date" - app_global_get_ex - assert // check self.secondary_market_opening_date exists - // modules/core_financial/common.py:336 - // secondary_market_closure_date=self.secondary_market_closure_date, - intc_0 // 0 - bytec 11 // "secondary_market_closure_date" - app_global_get_ex - assert // check self.secondary_market_closure_date exists - // modules/core_financial/common.py:334-337 - // return typ.SecondaryMarketSchedule( - // secondary_market_opening_date=self.secondary_market_opening_date, - // secondary_market_closure_date=self.secondary_market_closure_date, - // ) - swap - itob - swap - itob - concat - // modules/core_financial/common.py:290 - // @arc4.abimethod - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.core_financial.common.CoreFinancialCommonMixin.set_default_status[routing]() -> void: -set_default_status: - // modules/core_financial/common.py:339 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_1 // 1 - == - assert // invalid number of bytes for arc4.bool - intc_0 // 0 - getbit - // modules/rbac.py:74 - // assert self._role_is_active(self.trustee, Txn.sender), err.UNAUTHORIZED - bytec 20 // 0x52363023 - txn Sender - callsub _role_is_active - assert // Not authorized - // modules/core_financial/common.py:352 - // self.asset_defaulted = defaulted - bytec 24 // "asset_defaulted" - swap - app_global_put - // modules/core_financial/common.py:353 - // return Global.latest_timestamp - global LatestTimestamp - // modules/core_financial/common.py:339 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.core_financial.common.CoreFinancialCommonMixin.primary_distribution[routing]() -> void: -primary_distribution: - pushbytes "" - // modules/core_financial/common.py:355 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - txna ApplicationArgs 2 - dup - len - intc_3 // 8 - == - assert // invalid number of bytes for arc4.uint64 - btoi - // modules/accounting.py:25 - // return self.status == enm.STATUS_ACTIVE - intc_0 // 0 - bytec_2 // "status" - app_global_get_ex - assert // check self.status exists - pushint 100 - == - // modules/core_financial/common.py:145-148 - // self.status_is_active() - // and self.primary_distribution_opening_date - // <= Global.latest_timestamp - // < self.primary_distribution_closure_date - bz primary_distribution_bool_false@5 - // modules/core_financial/common.py:146 - // and self.primary_distribution_opening_date - intc_0 // 0 - bytec 10 // "primary_distribution_opening_date" - app_global_get_ex - assert // check self.primary_distribution_opening_date exists - // modules/core_financial/common.py:147 - // <= Global.latest_timestamp - global LatestTimestamp - dup - bury 5 - // modules/core_financial/common.py:146-147 - // and self.primary_distribution_opening_date - // <= Global.latest_timestamp - <= - // modules/core_financial/common.py:146-148 - // and self.primary_distribution_opening_date - // <= Global.latest_timestamp - // < self.primary_distribution_closure_date - bz primary_distribution_bool_false@5 - // modules/core_financial/common.py:148 - // < self.primary_distribution_closure_date - intc_0 // 0 - bytec 27 // "primary_distribution_closure_date" - app_global_get_ex - assert // check self.primary_distribution_closure_date exists - // modules/core_financial/common.py:147-148 - // <= Global.latest_timestamp - // < self.primary_distribution_closure_date - dig 3 - > - // modules/core_financial/common.py:146-148 - // and self.primary_distribution_opening_date - // <= Global.latest_timestamp - // < self.primary_distribution_closure_date - bz primary_distribution_bool_false@5 - intc_1 // 1 - -primary_distribution_bool_merge@6: - // modules/core_financial/common.py:144-149 - // assert ( - // self.status_is_active() - // and self.primary_distribution_opening_date - // <= Global.latest_timestamp - // < self.primary_distribution_closure_date - // ), err.PRIMARY_DISTRIBUTION_CLOSED - assert // Primary distribution is closed - // modules/rbac.py:71 - // assert self._role_is_active(self.primary_dealer, Txn.sender), err.UNAUTHORIZED - bytec 21 // 0x52353023 - txn Sender - callsub _role_is_active - assert // Not authorized - // modules/accounting.py:31 - // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec_1 // 0x52333023 - dig 2 - concat - dup - box_len - bury 1 - assert // Invalid account holding address - // modules/core_financial/common.py:383 - // self.assert_is_not_asset_defaulted() - callsub assert_is_not_asset_defaulted - // modules/core_financial/common.py:384 - // self.assert_is_not_asset_suspended() - callsub assert_is_not_asset_suspended - // modules/core_financial/common.py:385 - // assert units > 0, err.ZERO_UNITS - dig 1 - dup - assert // Can not distribute zero units - // modules/core_financial/common.py:386 - // assert self.circulating_units + units <= self.total_units, err.OVER_DISTRIBUTION - intc_0 // 0 - bytec_3 // "circulating_units" - app_global_get_ex - assert // check self.circulating_units exists - dig 1 - + - intc_0 // 0 - bytec 15 // "total_units" - app_global_get_ex - assert // check self.total_units exists - dig 1 - >= - assert // Insufficient remaining D-ASA units - // modules/core_financial/common.py:388 - // self.circulating_units += units - bytec_3 // "circulating_units" - dig 1 - app_global_put - // modules/core_financial/common.py:389 - // self.account[holding_address].units += units - dig 2 - box_get - assert // check self.account entry exists - intc_2 // 32 - extract_uint64 - uncover 2 - + - itob - dig 2 - intc_2 // 32 - uncover 2 - box_replace - // modules/core_financial/common.py:390 - // self.account[holding_address].unit_value = self.unit_value - intc_0 // 0 - bytec 6 // "unit_value" - app_global_get_ex - assert // check self.unit_value exists - itob - uncover 2 - pushint 40 - uncover 2 - box_replace - // modules/core_financial/common.py:391 - // return self.total_units - self.circulating_units - intc_0 // 0 - bytec 15 // "total_units" - app_global_get_ex - assert // check self.total_units exists - swap - - - // modules/core_financial/common.py:355 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - -primary_distribution_bool_false@5: - intc_0 // 0 - b primary_distribution_bool_merge@6 - - -// modules.core_financial.common.CoreFinancialCommonMixin.get_asset_info[routing]() -> void: -get_asset_info: - // modules/core_financial/common.py:403 - // performance = UInt64(cst.PRF_PERFORMANT) - intc_0 // 0 - // modules/core_financial/common.py:404 - // if Global.latest_timestamp > self.maturity_date > 0: - global LatestTimestamp - intc_0 // 0 - bytec 5 // "maturity_date" - app_global_get_ex - swap - dup - cover 2 - cover 3 - assert // check self.maturity_date exists - > - bz get_asset_info_after_if_else@4 - dup - bz get_asset_info_after_if_else@4 - // modules/core_financial/common.py:405 - // performance = UInt64(cst.PRF_MATURED) - pushint 4 - bury 2 - -get_asset_info_after_if_else@4: - // modules/core_financial/common.py:406-407 - // # The reference implementation has no grace or delinquency periods - // if self.asset_defaulted: - intc_0 // 0 - bytec 24 // "asset_defaulted" - app_global_get_ex - assert // check self.asset_defaulted exists - bz get_asset_info_after_if_else@6 - // modules/core_financial/common.py:408 - // performance = UInt64(cst.PRF_DEFAULTED) - pushint 3 - bury 2 - -get_asset_info_after_if_else@6: - // modules/core_financial/common.py:411 - // denomination_asset_id=self.denomination_asset_id.id, - intc_0 // 0 - bytec 16 // "denomination_asset_id" - app_global_get_ex - assert // check self.denomination_asset_id exists - // modules/core_financial/common.py:412 - // settlement_asset_id=self.settlement_asset_id.id, - intc_0 // 0 - bytec 9 // "settlement_asset_id" - app_global_get_ex - assert // check self.settlement_asset_id exists - // modules/accounting.py:45 - // return self.circulating_units * self.unit_value - intc_0 // 0 - bytec_3 // "circulating_units" - app_global_get_ex - assert // check self.circulating_units exists - intc_0 // 0 - bytec 6 // "unit_value" - app_global_get_ex - assert // check self.unit_value exists - dup2 - * - // modules/core_financial/common.py:415 - // day_count_convention=arc4.UInt8(self.day_count_convention), - intc_0 // 0 - bytec 17 // "day_count_convention" - app_global_get_ex - assert // check self.day_count_convention exists - itob - dup - bitlen - intc_3 // 8 - <= - assert // overflow - extract 7 1 - // modules/core_financial/common.py:416 - // principal_discount=arc4.UInt16(self.principal_discount), - intc_0 // 0 - bytec 26 // "principal_discount" - app_global_get_ex - assert // check self.principal_discount exists - itob - dup - bitlen - pushint 16 - <= - assert // overflow - extract 6 2 - // modules/core_financial/common.py:417 - // interest_rate=arc4.UInt16(self.interest_rate), - intc_0 // 0 - bytec 33 // "interest_rate" - app_global_get_ex - assert // check self.interest_rate exists - itob - dup - bitlen - pushint 16 - <= - assert // overflow - extract 6 2 - // modules/core_financial/common.py:418 - // total_supply=self.total_units, - intc_0 // 0 - bytec 15 // "total_units" - app_global_get_ex - assert // check self.total_units exists - // modules/core_financial/common.py:420 - // primary_distribution_opening_date=self.primary_distribution_opening_date, - intc_0 // 0 - bytec 10 // "primary_distribution_opening_date" - app_global_get_ex - assert // check self.primary_distribution_opening_date exists - // modules/core_financial/common.py:421 - // primary_distribution_closure_date=self.primary_distribution_closure_date, - intc_0 // 0 - bytec 27 // "primary_distribution_closure_date" - app_global_get_ex - assert // check self.primary_distribution_closure_date exists - // modules/core_financial/common.py:422 - // issuance_date=self.issuance_date, - intc_0 // 0 - bytec 4 // "issuance_date" - app_global_get_ex - assert // check self.issuance_date exists - // modules/core_financial/common.py:423 - // maturity_date=self.maturity_date, - intc_0 // 0 - bytec 5 // "maturity_date" - app_global_get_ex - assert // check self.maturity_date exists - // modules/core_financial/common.py:424 - // suspended=self.asset_suspended, - intc_0 // 0 - bytec 23 // "asset_suspended" - app_global_get_ex - assert // check self.asset_suspended exists - // modules/core_financial/common.py:425 - // performance=arc4.UInt8(performance), - dig 15 - itob - dup - bitlen - intc_3 // 8 - <= - assert // overflow - extract 7 1 - // modules/core_financial/common.py:410-426 - // return typ.AssetInfo( - // denomination_asset_id=self.denomination_asset_id.id, - // settlement_asset_id=self.settlement_asset_id.id, - // outstanding_principal=self.outstanding_principal(), - // unit_value=self.unit_value, - // day_count_convention=arc4.UInt8(self.day_count_convention), - // principal_discount=arc4.UInt16(self.principal_discount), - // interest_rate=arc4.UInt16(self.interest_rate), - // total_supply=self.total_units, - // circulating_supply=self.circulating_units, - // primary_distribution_opening_date=self.primary_distribution_opening_date, - // primary_distribution_closure_date=self.primary_distribution_closure_date, - // issuance_date=self.issuance_date, - // maturity_date=self.maturity_date, - // suspended=self.asset_suspended, - // performance=arc4.UInt8(performance), - // ) - uncover 14 - itob - uncover 14 - itob - concat - uncover 11 - itob - concat - uncover 11 - itob - concat - uncover 10 - concat - uncover 9 - concat - uncover 8 - concat - uncover 7 - itob - concat - uncover 7 - itob - concat - uncover 6 - itob - concat - uncover 5 - itob - concat - uncover 4 - itob - concat - uncover 3 - itob - concat - bytec 31 // 0x00 - intc_0 // 0 - uncover 4 - setbit - concat - swap - concat - // modules/core_financial/common.py:393 - // @arc4.abimethod(readonly=True) - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.core_financial.common.CoreFinancialCommonMixin.get_time_events[routing]() -> void: -get_time_events: - // modules/core_financial/common.py:436 - // time_events = typ.TimeEvents() - bytec 30 // 0x0000 - // modules/accounting.py:25 - // return self.status == enm.STATUS_ACTIVE - intc_0 // 0 - bytec_2 // "status" - app_global_get_ex - assert // check self.status exists - pushint 100 - == - // modules/core_financial/common.py:437 - // if self.status_is_active(): - bz get_time_events_after_if_else@3 - // modules/core_financial/common.py:438 - // time_events = self.time_events.value.copy() - bytec 12 // 0x74696d654576656e7473 - box_get - swap - bury 2 - assert // check self.time_events exists - -get_time_events_after_if_else@3: - // modules/core_financial/common.py:428 - // @arc4.abimethod(readonly=True) - bytec_0 // 0x151f7c75 - dig 1 - concat - log - intc_1 // 1 - return - - -// modules.core_financial.common.CoreFinancialCommonMixin.get_secondary_market_schedule[routing]() -> void: -get_secondary_market_schedule: - // modules/core_financial/common.py:450 - // (self.secondary_market_opening_date, self.secondary_market_closure_date) - intc_0 // 0 - bytec 18 // "secondary_market_opening_date" - app_global_get_ex - assert // check self.secondary_market_opening_date exists - intc_0 // 0 - bytec 11 // "secondary_market_closure_date" - app_global_get_ex - assert // check self.secondary_market_closure_date exists - // modules/core_financial/common.py:449-451 - // return typ.TimeEvents( - // (self.secondary_market_opening_date, self.secondary_market_closure_date) - // ) - swap - itob - pushbytes 0x0002 - swap - concat - swap - itob - concat - // modules/core_financial/common.py:441 - // @arc4.abimethod(readonly=True) - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.core_financial.common.CoreFinancialCommonMixin.get_asset_metadata[routing]() -> void: -get_asset_metadata: - // modules/core_financial/common.py:462 - // return typ.AssetMetadata.from_bytes(self.metadata) - intc_0 // 0 - bytec 25 // "metadata" - app_global_get_ex - assert // check self.metadata exists - // modules/core_financial/common.py:453 - // @arc4.abimethod(readonly=True) - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.accounting.AccountingModule.account_gov_suspension[routing]() -> void: -account_gov_suspension: - // modules/accounting.py:94 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - txna ApplicationArgs 2 - dup - len - intc_1 // 1 - == - assert // invalid number of bytes for arc4.bool - intc_0 // 0 - getbit - // modules/rbac.py:77 - // assert self._role_is_active(self.authority, Txn.sender), err.UNAUTHORIZED - bytec 13 // 0x52373023 - txn Sender - callsub _role_is_active - assert // Not authorized - // modules/accounting.py:31 - // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec_1 // 0x52333023 - uncover 2 - concat - dup - box_len - bury 1 - assert // Invalid account holding address - // modules/accounting.py:114 - // self.account[holding_address].suspended = suspended - dup - pushint 56 - intc_1 // 1 - box_extract - intc_0 // 0 - uncover 3 - setbit - pushint 56 - swap - box_replace - // modules/accounting.py:115 - // return Global.latest_timestamp - global LatestTimestamp - // modules/accounting.py:94 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.accounting.AccountingModule.account_open[routing]() -> void: -account_open: - // modules/accounting.py:117 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - txna ApplicationArgs 2 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:68 - // assert self._role_is_active(self.account_manager, Txn.sender), err.UNAUTHORIZED - bytec 14 // 0x52343023 - txn Sender - callsub _role_is_active - assert // Not authorized - // modules/accounting.py:28 - // return self.status == enm.STATUS_ENDED - intc_0 // 0 - bytec_2 // "status" - app_global_get_ex - assert // check self.status exists - intc 5 // 200 - == - // modules/accounting.py:139 - // assert not self.status_is_ended(), err.UNAUTHORIZED - ! - assert // Not authorized - // modules/accounting.py:140 - // self.assert_is_not_asset_defaulted() - callsub assert_is_not_asset_defaulted - // modules/accounting.py:141 - // self.assert_is_not_asset_suspended() - callsub assert_is_not_asset_suspended - // modules/accounting.py:142 - // assert holding_address not in self.account, err.INVALID_HOLDING_ADDRESS - bytec_1 // 0x52333023 - uncover 2 - concat - dup - box_len - bury 1 - ! - assert // Invalid account holding address - // modules/accounting.py:146 - // units=UInt64(0), - intc_0 // 0 - // modules/accounting.py:144-150 - // self.account[holding_address] = typ.AccountInfo( - // payment_address=payment_address, - // units=UInt64(0), - // unit_value=UInt64(0), - // paid_coupons=UInt64(0), - // suspended=False, - // ) - itob - uncover 2 - dig 1 - concat - dig 1 - concat - swap - concat - bytec 31 // 0x00 - concat - box_put - // modules/accounting.py:151 - // return Global.latest_timestamp - global LatestTimestamp - // modules/accounting.py:117 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.accounting.AccountingModule.account_close[routing]() -> void: -account_close: - // modules/accounting.py:153 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:68 - // assert self._role_is_active(self.account_manager, Txn.sender), err.UNAUTHORIZED - bytec 14 // 0x52343023 - txn Sender - callsub _role_is_active - assert // Not authorized - // modules/accounting.py:171 - // self.assert_is_not_asset_defaulted() - callsub assert_is_not_asset_defaulted - // modules/accounting.py:31 - // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec_1 // 0x52333023 - swap - concat - dup - box_len - bury 1 - assert // Invalid account holding address - // modules/accounting.py:174 - // closed_units = self.account[holding_address].units - dup - box_get - pop - intc_2 // 32 - extract_uint64 - // modules/accounting.py:175 - // del self.account[holding_address] - swap - box_del - pop - // modules/accounting.py:176 - // self.circulating_units -= closed_units - intc_0 // 0 - bytec_3 // "circulating_units" - app_global_get_ex - assert // check self.circulating_units exists - dig 1 - - - bytec_3 // "circulating_units" - swap - app_global_put - // modules/accounting.py:177 - // self.end_if_no_circulating_units() - callsub end_if_no_circulating_units - // modules/accounting.py:178 - // return closed_units, Global.latest_timestamp - global LatestTimestamp - // modules/accounting.py:153 - // @arc4.abimethod - swap - itob - swap - itob - concat - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.accounting.AccountingModule.account_update_payment_address[routing]() -> void: -account_update_payment_address: - // modules/accounting.py:180 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - txna ApplicationArgs 2 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/accounting.py:200 - // assert Txn.sender == holding_address, err.UNAUTHORIZED - txn Sender - dig 2 - == - assert // Not authorized - // modules/accounting.py:201 - // self.assert_is_not_asset_defaulted() - callsub assert_is_not_asset_defaulted - // modules/accounting.py:202 - // self.assert_is_not_asset_suspended() - callsub assert_is_not_asset_suspended - // modules/accounting.py:31 - // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec_1 // 0x52333023 - uncover 2 - concat - dup - box_len - bury 1 - assert // Invalid account holding address - // modules/accounting.py:204 - // self.account[holding_address].payment_address = payment_address - intc_0 // 0 - uncover 2 - box_replace - // modules/accounting.py:205 - // return Global.latest_timestamp - global LatestTimestamp - // modules/accounting.py:180 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.accounting.AccountingModule.account_get_info[routing]() -> void: -account_get_info: - // modules/accounting.py:207 - // @arc4.abimethod(readonly=True) - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/accounting.py:31 - // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec_1 // 0x52333023 - swap - concat - dup - box_len - bury 1 - assert // Invalid account holding address - // modules/accounting.py:222 - // return self.account[holding_address] - box_get - pop - // modules/accounting.py:207 - // @arc4.abimethod(readonly=True) - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.rbac.RbacModule.rbac_rotate_arranger[routing]() -> void: -rbac_rotate_arranger: - // modules/rbac.py:147 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:158 - // self.assert_caller_is_arranger() - callsub assert_caller_is_arranger - // modules/rbac.py:159 - // self.arranger.value = new_arranger - bytec 8 // 0x52323023 - swap - app_global_put - // modules/rbac.py:160 - // return Global.latest_timestamp - global LatestTimestamp - // modules/rbac.py:147 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.rbac.RbacModule.rbac_set_op_daemon[routing]() -> void: -rbac_set_op_daemon: - // modules/rbac.py:162 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:173 - // self.assert_caller_is_arranger() - callsub assert_caller_is_arranger - // modules/rbac.py:174 - // self.op_daemon.value = address - bytec 22 // 0x52323523 - swap - app_global_put - // modules/rbac.py:175 - // return Global.latest_timestamp - global LatestTimestamp - // modules/rbac.py:162 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.rbac.RbacModule.rbac_assign_role[routing]() -> void: -rbac_assign_role: - // modules/rbac.py:177 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_1 // 1 - == - assert // invalid number of bytes for arc4.uint8 - txna ApplicationArgs 2 - dup - cover 2 - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - txna ApplicationArgs 3 - dup - intc_0 // 0 - extract_uint16 // on error: invalid array length header - pushint 2 - + - dig 1 - len - == - assert // invalid number of bytes for arc4.dynamic_array - extract 2 0 - swap - // modules/rbac.py:199 - // self.assert_caller_is_arranger() - callsub assert_caller_is_arranger - // modules/rbac.py:200 - // self.assert_is_not_asset_defaulted() - callsub assert_is_not_asset_defaulted - // modules/rbac.py:201 - // self._assert_valid_role(role_id.as_uint64()) - btoi - dupn 2 - callsub _assert_valid_role - // modules/rbac.py:101 - // if role_id == UInt64(cst.ROLE_ARRANGER): - pushint 20 - == - bz rbac_assign_role_after_if_else@3 - // modules/rbac.py:102 - // self.arranger.value = role_address - bytec 8 // 0x52323023 - dig 3 - app_global_put - -rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14: - // modules/rbac.py:203 - // return Global.latest_timestamp - global LatestTimestamp - // modules/rbac.py:177 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - -rbac_assign_role_after_if_else@3: - // modules/rbac.py:105 - // if role_id == UInt64(cst.ROLE_ACCOUNT_MANAGER): - dup - pushint 40 - == - bz rbac_assign_role_after_if_else@5 - // modules/rbac.py:106 - // assert role_address not in self.account_manager, err.INVALID_ROLE_ADDRESS - bytec 14 // 0x52343023 - dig 3 - concat - dup - box_len - bury 1 - ! - assert // Invalid account role address - // modules/rbac.py:107 - // self.account_manager[role_address] = typ.RoleConfig.from_bytes(config) - dig 2 - box_put - // modules/rbac.py:202 - // self._upsert_role(role_id.as_uint64(), role_address, config) - b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14 - -rbac_assign_role_after_if_else@5: - // modules/rbac.py:109 - // if role_id == UInt64(cst.ROLE_PRIMARY_DEALER): - dup - pushint 50 - == - bz rbac_assign_role_after_if_else@7 - // modules/rbac.py:110 - // assert role_address not in self.primary_dealer, err.INVALID_ROLE_ADDRESS - bytec 21 // 0x52353023 - dig 3 - concat - dup - box_len - bury 1 - ! - assert // Invalid account role address - // modules/rbac.py:111 - // self.primary_dealer[role_address] = typ.RoleConfig.from_bytes(config) - dig 2 - box_put - // modules/rbac.py:202 - // self._upsert_role(role_id.as_uint64(), role_address, config) - b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14 - -rbac_assign_role_after_if_else@7: - // modules/rbac.py:113 - // if role_id == UInt64(cst.ROLE_TRUSTEE): - dup - pushint 60 - == - bz rbac_assign_role_after_if_else@9 - // modules/rbac.py:114 - // assert role_address not in self.trustee, err.INVALID_ROLE_ADDRESS - bytec 20 // 0x52363023 - dig 3 - concat - dup - box_len - bury 1 - ! - assert // Invalid account role address - // modules/rbac.py:115 - // self.trustee[role_address] = typ.RoleConfig.from_bytes(config) - dig 2 - box_put - // modules/rbac.py:202 - // self._upsert_role(role_id.as_uint64(), role_address, config) - b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14 - -rbac_assign_role_after_if_else@9: - // modules/rbac.py:117 - // if role_id == UInt64(cst.ROLE_AUTHORITY): - dup - pushint 70 - == - bz rbac_assign_role_after_if_else@11 - // modules/rbac.py:118 - // assert role_address not in self.authority, err.INVALID_ROLE_ADDRESS - bytec 13 // 0x52373023 - dig 3 - concat - dup - box_len - bury 1 - ! - assert // Invalid account role address - // modules/rbac.py:119 - // self.authority[role_address] = typ.RoleConfig.from_bytes(config) - dig 2 - box_put - // modules/rbac.py:202 - // self._upsert_role(role_id.as_uint64(), role_address, config) - b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14 - -rbac_assign_role_after_if_else@11: - // modules/rbac.py:121 - // if role_id == UInt64(cst.ROLE_INTEREST_ORACLE): - dup - pushint 80 - == - bz rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14 - // modules/rbac.py:122 - // assert role_address not in self.interest_oracle, err.INVALID_ROLE_ADDRESS - bytec 32 // 0x52383023 - dig 3 - concat - dup - box_len - bury 1 - ! - assert // Invalid account role address - // modules/rbac.py:123 - // self.interest_oracle[role_address] = typ.RoleConfig.from_bytes(config) - dig 2 - box_put - b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14 - - -// modules.rbac.RbacModule.rbac_revoke_role[routing]() -> void: -rbac_revoke_role: - // modules/rbac.py:205 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_1 // 1 - == - assert // invalid number of bytes for arc4.uint8 - txna ApplicationArgs 2 - dup - cover 2 - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:224 - // self.assert_caller_is_arranger() - callsub assert_caller_is_arranger - // modules/rbac.py:225 - // self.assert_is_not_asset_defaulted() - callsub assert_is_not_asset_defaulted - // modules/rbac.py:226 - // self._assert_valid_role(role_id.as_uint64()) - btoi - dupn 2 - callsub _assert_valid_role - // modules/rbac.py:126 - // assert role_id != UInt64(cst.ROLE_ARRANGER), err.INVALID_ROLE - dup - pushint 20 - != - assert // Invalid role identifier - // modules/rbac.py:127 - // if role_id == UInt64(cst.ROLE_ACCOUNT_MANAGER): - pushint 40 - == - bz rbac_revoke_role_after_if_else@3 - // modules/rbac.py:128 - // assert role_address in self.account_manager, err.INVALID_ROLE_ADDRESS - bytec 14 // 0x52343023 - dig 2 - concat - dup - box_len - bury 1 - assert // Invalid account role address - // modules/rbac.py:129 - // del self.account_manager[role_address] - box_del - pop - -rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12: - // modules/rbac.py:228 - // return Global.latest_timestamp - global LatestTimestamp - // modules/rbac.py:205 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - -rbac_revoke_role_after_if_else@3: - // modules/rbac.py:131 - // if role_id == UInt64(cst.ROLE_PRIMARY_DEALER): - dup - pushint 50 - == - bz rbac_revoke_role_after_if_else@5 - // modules/rbac.py:132 - // assert role_address in self.primary_dealer, err.INVALID_ROLE_ADDRESS - bytec 21 // 0x52353023 - dig 2 - concat - dup - box_len - bury 1 - assert // Invalid account role address - // modules/rbac.py:133 - // del self.primary_dealer[role_address] - box_del - pop - // modules/rbac.py:227 - // self._delete_role(role_id.as_uint64(), role_address) - b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 - -rbac_revoke_role_after_if_else@5: - // modules/rbac.py:135 - // if role_id == UInt64(cst.ROLE_TRUSTEE): - dup - pushint 60 - == - bz rbac_revoke_role_after_if_else@7 - // modules/rbac.py:136 - // assert role_address in self.trustee, err.INVALID_ROLE_ADDRESS - bytec 20 // 0x52363023 - dig 2 - concat - dup - box_len - bury 1 - assert // Invalid account role address - // modules/rbac.py:137 - // del self.trustee[role_address] - box_del - pop - // modules/rbac.py:227 - // self._delete_role(role_id.as_uint64(), role_address) - b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 - -rbac_revoke_role_after_if_else@7: - // modules/rbac.py:139 - // if role_id == UInt64(cst.ROLE_AUTHORITY): - dup - pushint 70 - == - bz rbac_revoke_role_after_if_else@9 - // modules/rbac.py:140 - // assert role_address in self.authority, err.INVALID_ROLE_ADDRESS - bytec 13 // 0x52373023 - dig 2 - concat - dup - box_len - bury 1 - assert // Invalid account role address - // modules/rbac.py:141 - // del self.authority[role_address] - box_del - pop - // modules/rbac.py:227 - // self._delete_role(role_id.as_uint64(), role_address) - b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 - -rbac_revoke_role_after_if_else@9: - // modules/rbac.py:143 - // if role_id == UInt64(cst.ROLE_INTEREST_ORACLE): - dup - pushint 80 - == - bz rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 - // modules/rbac.py:144 - // assert role_address in self.interest_oracle, err.INVALID_ROLE_ADDRESS - bytec 32 // 0x52383023 - dig 2 - concat - dup - box_len - bury 1 - assert // Invalid account role address - // modules/rbac.py:145 - // del self.interest_oracle[role_address] - box_del - pop - b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 - - -// modules.rbac.RbacModule.rbac_gov_asset_suspension[routing]() -> void: -rbac_gov_asset_suspension: - // modules/rbac.py:230 - // @arc4.abimethod # TODO: Update specs and add test - txna ApplicationArgs 1 - dup - len - intc_1 // 1 - == - assert // invalid number of bytes for arc4.bool - intc_0 // 0 - getbit - // modules/rbac.py:77 - // assert self._role_is_active(self.authority, Txn.sender), err.UNAUTHORIZED - bytec 13 // 0x52373023 - txn Sender - callsub _role_is_active - assert // Not authorized - // modules/rbac.py:246 - // self.asset_suspended = suspended - bytec 23 // "asset_suspended" - swap - app_global_put - // modules/rbac.py:247 - // return Global.latest_timestamp - global LatestTimestamp - // modules/rbac.py:230 - // @arc4.abimethod # TODO: Update specs and add test - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.rbac.RbacModule.rbac_get_arranger[routing]() -> void: -rbac_get_arranger: - // modules/rbac.py:257 - // return self.arranger.value - intc_0 // 0 - bytec 8 // 0x52323023 - app_global_get_ex - assert // check self.arranger exists - // modules/rbac.py:249 - // @arc4.abimethod(readonly=True) - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.rbac.RbacModule.rbac_get_address_roles[routing]() -> void: -rbac_get_address_roles: - // modules/rbac.py:259 - // @arc4.abimethod(readonly=True) - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:273 - // self._role_is_active(self.account_manager, address), - bytec 14 // 0x52343023 - dig 1 - callsub _role_is_active - // modules/rbac.py:274 - // self._role_is_active(self.primary_dealer, address), - bytec 21 // 0x52353023 - dig 2 - callsub _role_is_active - // modules/rbac.py:275 - // self._role_is_active(self.trustee, address), - bytec 20 // 0x52363023 - dig 3 - callsub _role_is_active - // modules/rbac.py:276 - // self._role_is_active(self.authority, address), - bytec 13 // 0x52373023 - dig 4 - callsub _role_is_active - // modules/rbac.py:277 - // self._role_is_active(self.interest_oracle, address), - bytec 32 // 0x52383023 - uncover 5 - callsub _role_is_active - // modules/rbac.py:259 - // @arc4.abimethod(readonly=True) - bytec 31 // 0x00 - intc_0 // 0 - uncover 6 - setbit - intc_1 // 1 - uncover 5 - setbit - pushint 2 - uncover 4 - setbit - pushint 3 - uncover 3 - setbit - pushint 4 - uncover 2 - setbit - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.rbac.RbacModule.rbac_get_role_config[routing]() -> void: -rbac_get_role_config: - // modules/rbac.py:280 - // @arc4.abimethod(readonly=True) - txna ApplicationArgs 1 - dup - len - intc_1 // 1 - == - assert // invalid number of bytes for arc4.uint8 - txna ApplicationArgs 2 - dup - cover 2 - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:294 - // role = role_id.as_uint64() - btoi - // modules/rbac.py:295 - // self._assert_valid_role(role) - dup - callsub _assert_valid_role - // modules/rbac.py:297 - // case UInt64(cst.ROLE_ARRANGER): - pushints 20 40 50 60 70 80 - // modules/rbac.py:296-327 - // match role: - // case UInt64(cst.ROLE_ARRANGER): - // return typ.RoleConfig( - // role_validity_start=UInt64(0), role_validity_end=UInt64(0) - // ) - // case UInt64(cst.ROLE_ACCOUNT_MANAGER): - // assert self._has_role( - // self.account_manager, role_address - // ), err.INVALID_ROLE_ADDRESS - // return self.account_manager[role_address] - // case UInt64(cst.ROLE_PRIMARY_DEALER): - // assert self._has_role( - // self.primary_dealer, role_address - // ), err.INVALID_ROLE_ADDRESS - // return self.primary_dealer[role_address] - // case UInt64(cst.ROLE_TRUSTEE): - // assert self._has_role( - // self.trustee, role_address - // ), err.INVALID_ROLE_ADDRESS - // return self.trustee[role_address] - // case UInt64(cst.ROLE_AUTHORITY): - // assert self._has_role( - // self.authority, role_address - // ), err.INVALID_ROLE_ADDRESS - // return self.authority[role_address] - // case UInt64(cst.ROLE_INTEREST_ORACLE): - // assert self._has_role( - // self.interest_oracle, role_address - // ), err.INVALID_ROLE_ADDRESS - // return self.interest_oracle[role_address] - // case _: - // op.err(err.INVALID_ROLE) - uncover 6 - match rbac_get_role_config_switch_case_0@2 rbac_get_role_config_switch_case_1@3 rbac_get_role_config_switch_case_2@4 rbac_get_role_config_switch_case_3@5 rbac_get_role_config_switch_case_4@6 rbac_get_role_config_switch_case_5@7 - // modules/rbac.py:327 - // op.err(err.INVALID_ROLE) - err // Invalid role identifier - -rbac_get_role_config_switch_case_5@7: - // modules/rbac.py:323 - // self.interest_oracle, role_address - bytec 32 // 0x52383023 - // modules/rbac.py:55 - // return role_address in role_map - dig 1 - concat - dup - box_len - bury 1 - // modules/rbac.py:322-324 - // assert self._has_role( - // self.interest_oracle, role_address - // ), err.INVALID_ROLE_ADDRESS - assert // Invalid account role address - // modules/rbac.py:325 - // return self.interest_oracle[role_address] - box_get - pop - -rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9: - // modules/rbac.py:280 - // @arc4.abimethod(readonly=True) - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - -rbac_get_role_config_switch_case_4@6: - // modules/rbac.py:318 - // self.authority, role_address - bytec 13 // 0x52373023 - // modules/rbac.py:55 - // return role_address in role_map - dig 1 - concat - dup - box_len - bury 1 - // modules/rbac.py:317-319 - // assert self._has_role( - // self.authority, role_address - // ), err.INVALID_ROLE_ADDRESS - assert // Invalid account role address - // modules/rbac.py:320 - // return self.authority[role_address] - box_get - pop - // modules/rbac.py:280 - // @arc4.abimethod(readonly=True) - b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9 - -rbac_get_role_config_switch_case_3@5: - // modules/rbac.py:313 - // self.trustee, role_address - bytec 20 // 0x52363023 - // modules/rbac.py:55 - // return role_address in role_map - dig 1 - concat - dup - box_len - bury 1 - // modules/rbac.py:312-314 - // assert self._has_role( - // self.trustee, role_address - // ), err.INVALID_ROLE_ADDRESS - assert // Invalid account role address - // modules/rbac.py:315 - // return self.trustee[role_address] - box_get - pop - // modules/rbac.py:280 - // @arc4.abimethod(readonly=True) - b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9 - -rbac_get_role_config_switch_case_2@4: - // modules/rbac.py:308 - // self.primary_dealer, role_address - bytec 21 // 0x52353023 - // modules/rbac.py:55 - // return role_address in role_map - dig 1 - concat - dup - box_len - bury 1 - // modules/rbac.py:307-309 - // assert self._has_role( - // self.primary_dealer, role_address - // ), err.INVALID_ROLE_ADDRESS - assert // Invalid account role address - // modules/rbac.py:310 - // return self.primary_dealer[role_address] - box_get - pop - // modules/rbac.py:280 - // @arc4.abimethod(readonly=True) - b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9 - -rbac_get_role_config_switch_case_1@3: - // modules/rbac.py:303 - // self.account_manager, role_address - bytec 14 // 0x52343023 - // modules/rbac.py:55 - // return role_address in role_map - dig 1 - concat - dup - box_len - bury 1 - // modules/rbac.py:302-304 - // assert self._has_role( - // self.account_manager, role_address - // ), err.INVALID_ROLE_ADDRESS - assert // Invalid account role address - // modules/rbac.py:305 - // return self.account_manager[role_address] - box_get - pop - // modules/rbac.py:280 - // @arc4.abimethod(readonly=True) - b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9 - -rbac_get_role_config_switch_case_0@2: - // modules/rbac.py:298-300 - // return typ.RoleConfig( - // role_validity_start=UInt64(0), role_validity_end=UInt64(0) - // ) - pushbytes 0x00000000000000000000000000000000 - // modules/rbac.py:280 - // @arc4.abimethod(readonly=True) - b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9 - - -// modules.core_financial.coupon.FixedCouponCashflowMixin.count_due_coupons() -> uint64: -count_due_coupons: - // modules/core_financial/coupon.py:111 - // def count_due_coupons(self) -> UInt64: - proto 0 1 - pushbytes "" - // modules/core_financial/coupon.py:112 - // current_ts = Global.latest_timestamp - global LatestTimestamp - dup - // modules/core_financial/coupon.py:113 - // due_coupons = self.due_coupons_watermark - intc_0 // 0 - bytec 29 // "due_coupons_watermark" - app_global_get_ex - swap - cover 2 - assert // check self.due_coupons_watermark exists - // modules/core_financial/coupon.py:114 - // if current_ts >= self.maturity_date: - intc_0 // 0 - bytec 5 // "maturity_date" - app_global_get_ex - assert // check self.maturity_date exists - >= - bz count_due_coupons_else_body@2 - // modules/core_financial/coupon.py:115 - // due_coupons = self.total_coupons - intc_0 // 0 - bytec 7 // "total_coupons" - app_global_get_ex - swap - frame_bury 2 - assert // check self.total_coupons exists - -count_due_coupons_after_if_else@8: - // modules/core_financial/coupon.py:129 - // self.due_coupons_watermark = due_coupons - bytec 29 // "due_coupons_watermark" - frame_dig 2 - dup - cover 2 - app_global_put - // modules/core_financial/coupon.py:130 - // return due_coupons - frame_bury 0 - retsub - -count_due_coupons_else_body@2: - // modules/core_financial/coupon.py:116 - // elif current_ts > self.issuance_date: - intc_0 // 0 - bytec 4 // "issuance_date" - app_global_get_ex - assert // check self.issuance_date exists - frame_dig 1 - < - bz count_due_coupons_after_if_else@8 - // modules/core_financial/coupon.py:118 - // UInt64(fixed_cfg.FIRST_COUPON_DATE_IDX) + self.due_coupons_watermark - intc_0 // 0 - bytec 29 // "due_coupons_watermark" - app_global_get_ex - assert // check self.due_coupons_watermark exists - pushint 3 - + - dup - frame_bury 0 - // modules/core_financial/coupon.py:120 - // coupon_due_date = self.time_events.value[coupon_idx] - intc_3 // 8 - * - pushint 2 - + - bytec 12 // 0x74696d654576656e7473 - swap - intc_3 // 8 - box_extract - btoi - -count_due_coupons_while_top@4: - // modules/core_financial/coupon.py:121 - // while current_ts >= coupon_due_date: - frame_dig 1 - <= - bz count_due_coupons_after_while@6 - // modules/core_financial/coupon.py:123 - // required_budget=UInt64(fixed_cfg.OP_UP_COUPON_DUE_COUNTING), - intc 4 // 255 - // modules/core_financial/coupon.py:124 - // fee_source=OpUpFeeSource.GroupCredit, - intc_0 // 0 - // modules/core_financial/coupon.py:122-125 - // ensure_budget( - // required_budget=UInt64(fixed_cfg.OP_UP_COUPON_DUE_COUNTING), - // fee_source=OpUpFeeSource.GroupCredit, - // ) - callsub ensure_budget - // modules/core_financial/coupon.py:126 - // coupon_idx += 1 - frame_dig 0 - intc_1 // 1 - + - dup - frame_bury 0 - // modules/core_financial/coupon.py:127 - // coupon_due_date = self.time_events.value[coupon_idx] - intc_3 // 8 - * - pushint 2 - + - bytec 12 // 0x74696d654576656e7473 - swap - intc_3 // 8 - box_extract - btoi - b count_due_coupons_while_top@4 - -count_due_coupons_after_while@6: - // modules/core_financial/coupon.py:128 - // due_coupons = coupon_idx - fixed_cfg.FIRST_COUPON_DATE_IDX - frame_dig 0 - pushint 3 - - - frame_bury 2 - b count_due_coupons_after_if_else@8 - - -// modules.core_financial.coupon.FixedCouponCashflowMixin.coupon_due_date(coupon: uint64) -> uint64: -coupon_due_date: - // modules/core_financial/coupon.py:132 - // def coupon_due_date(self, coupon: UInt64) -> UInt64: - proto 1 1 - // modules/core_financial/coupon.py:133 - // return self.time_events.value[fixed_cfg.FIRST_COUPON_DATE_IDX + coupon - 1] - pushint 3 - frame_dig -1 - + - intc_1 // 1 - - - intc_3 // 8 - * - pushint 2 - + - bytec 12 // 0x74696d654576656e7473 - swap - intc_3 // 8 - box_extract - btoi - retsub - - -// modules.core_financial.coupon.FixedCouponCashflowMixin.next_coupon_due_date(due_coupons: uint64) -> uint64: -next_coupon_due_date: - // modules/core_financial/coupon.py:141 - // def next_coupon_due_date(self, due_coupons: UInt64) -> UInt64: - proto 1 1 - // modules/core_financial/coupon.py:142 - // coupon_due_date = UInt64() - intc_0 // 0 - // modules/core_financial/coupon.py:143 - // if due_coupons < self.total_coupons: - dup - bytec 7 // "total_coupons" - app_global_get_ex - assert // check self.total_coupons exists - frame_dig -1 - > - bz next_coupon_due_date_after_if_else@2 - // modules/core_financial/coupon.py:144 - // coupon_due_date = self.coupon_due_date(due_coupons + 1) - frame_dig -1 - intc_1 // 1 - + - callsub coupon_due_date - frame_bury 0 - -next_coupon_due_date_after_if_else@2: - // modules/core_financial/coupon.py:145 - // return coupon_due_date - frame_dig 0 - swap - retsub - - -// modules.core_financial.coupon.FixedCouponCashflowMixin.coupon_interest_amount(principal_amount: uint64, coupon: uint64) -> uint64: -coupon_interest_amount: - // modules/core_financial/coupon.py:147-149 - // def coupon_interest_amount( - // self, principal_amount: UInt64, coupon: UInt64 - // ) -> UInt64: - proto 2 1 - // modules/core_financial/coupon.py:150 - // coupon_rate_bps = self.coupon_rates.value[coupon - 1].as_uint64() - frame_dig -1 - intc_1 // 1 - - - pushint 2 - * - pushint 2 - + - bytec 19 // 0x636f75706f6e5261746573 - swap - pushint 2 - box_extract - btoi - // modules/core_financial/coupon.py:151 - // return principal_amount * coupon_rate_bps // cst.BPS - frame_dig -2 - * - pushint 10000 - / - retsub - - -// modules.core_financial.coupon.FixedCouponCashflowMixin.day_count_factor(due_coupons: uint64) -> bytes: -day_count_factor: - // modules/core_financial/coupon.py:153 - // def day_count_factor(self, due_coupons: UInt64) -> typ.DayCountFactor: - proto 1 1 - pushbytes "" - dup - // modules/core_financial/coupon.py:154-155 - // # The reference implementation supports only the Actual/Actual and Continuous day-count conventions - // if not due_coupons: - frame_dig -1 - bnz day_count_factor_else_body@2 - // modules/core_financial/coupon.py:156 - // accruing_start_time = self.issuance_date - intc_0 // 0 - bytec 4 // "issuance_date" - app_global_get_ex - assert // check self.issuance_date exists - -day_count_factor_after_if_else@3: - // modules/core_financial/coupon.py:159 - // coupon_accrued_period = Global.latest_timestamp - accruing_start_time - global LatestTimestamp - dig 1 - - - frame_bury 0 - // modules/core_financial/coupon.py:160 - // coupon_period = self.next_coupon_due_date(due_coupons) - accruing_start_time - frame_dig -1 - callsub next_coupon_due_date - swap - - - // modules/core_financial/coupon.py:161 - // if self.day_count_convention == UInt64(cst.DCC_A_A): - intc_0 // 0 - bytec 17 // "day_count_convention" - app_global_get_ex - assert // check self.day_count_convention exists - bnz day_count_factor_after_if_else@5 - // modules/core_financial/common.py:162 - // return time_period // UInt64(cst.DAY_2_SEC) - frame_dig 0 - intc 6 // 86400 - / - frame_bury 0 - intc 6 // 86400 - / - -day_count_factor_after_if_else@5: - // modules/core_financial/coupon.py:164-167 - // return typ.DayCountFactor( - // numerator=coupon_accrued_period, - // denominator=coupon_period, - // ) - frame_dig 0 - itob - swap - itob - concat - frame_bury 0 - retsub - -day_count_factor_else_body@2: - // modules/core_financial/coupon.py:136 - // coupon_due_date = UInt64() - intc_0 // 0 - frame_bury 1 - // modules/core_financial/coupon.py:137 - // if due_coupons >= UInt64(1): - frame_dig -1 - bz day_count_factor_after_if_else@8 - // modules/core_financial/coupon.py:138 - // coupon_due_date = self.coupon_due_date(due_coupons) - frame_dig -1 - callsub coupon_due_date - frame_bury 1 - -day_count_factor_after_if_else@8: - frame_dig 1 - b day_count_factor_after_if_else@3 - - -// modules.core_financial.coupon.FixedCouponCashflowMixin.is_accruing_interest(due_coupons: uint64) -> uint64: -is_accruing_interest: - // modules/core_financial/coupon.py:169 - // def is_accruing_interest(self, due_coupons: UInt64) -> bool: - proto 1 1 - // modules/core_financial/coupon.py:171 - // self.issuance_date != 0 - intc_0 // 0 - bytec 4 // "issuance_date" - app_global_get_ex - assert // check self.issuance_date exists - // modules/core_financial/coupon.py:171-173 - // self.issuance_date != 0 - // and Global.latest_timestamp >= self.issuance_date - // and due_coupons < self.total_coupons - bz is_accruing_interest_bool_false@4 - // modules/core_financial/coupon.py:172 - // and Global.latest_timestamp >= self.issuance_date - global LatestTimestamp - intc_0 // 0 - bytec 4 // "issuance_date" - app_global_get_ex - assert // check self.issuance_date exists - >= - // modules/core_financial/coupon.py:171-173 - // self.issuance_date != 0 - // and Global.latest_timestamp >= self.issuance_date - // and due_coupons < self.total_coupons - bz is_accruing_interest_bool_false@4 - // modules/core_financial/coupon.py:173 - // and due_coupons < self.total_coupons - intc_0 // 0 - bytec 7 // "total_coupons" - app_global_get_ex - assert // check self.total_coupons exists - frame_dig -1 - > - // modules/core_financial/coupon.py:171-173 - // self.issuance_date != 0 - // and Global.latest_timestamp >= self.issuance_date - // and due_coupons < self.total_coupons - bz is_accruing_interest_bool_false@4 - intc_1 // 1 - // modules/core_financial/coupon.py:170-174 - // return ( - // self.issuance_date != 0 - // and Global.latest_timestamp >= self.issuance_date - // and due_coupons < self.total_coupons - // ) - retsub - -is_accruing_interest_bool_false@4: - intc_0 // 0 - // modules/core_financial/coupon.py:170-174 - // return ( - // self.issuance_date != 0 - // and Global.latest_timestamp >= self.issuance_date - // and due_coupons < self.total_coupons - // ) - retsub - - -// modules.core_financial.coupon.FixedCouponCashflowMixin.accrued_interest_amount(holding_address: bytes, units: uint64, due_coupons: uint64) -> uint64: -accrued_interest_amount: - // modules/core_financial/coupon.py:176-178 - // def accrued_interest_amount( - // self, holding_address: Account, units: UInt64, due_coupons: UInt64 - // ) -> UInt64: - proto 3 1 - // modules/core_financial/coupon.py:179-180 - // # The following assert safeguards the subroutine from forbidden invocations - // self.assert_no_pending_coupon_payment(holding_address, due_coupons) - frame_dig -3 - frame_dig -1 - callsub assert_no_pending_coupon_payment - // modules/core_financial/coupon.py:181 - // day_count_factor = self.day_count_factor(due_coupons) - frame_dig -1 - callsub day_count_factor - // modules/core_financial/coupon.py:182 - // coupon_accrued_period = day_count_factor.numerator - dup - intc_0 // 0 - extract_uint64 - // modules/core_financial/coupon.py:183 - // coupon_period = day_count_factor.denominator - swap - intc_3 // 8 - extract_uint64 - // modules/core_financial/coupon.py:184 - // next_coupon_rate_bps = self.coupon_rates.value[due_coupons].as_uint64() - frame_dig -1 - pushint 2 - * - pushint 2 - + - bytec 19 // 0x636f75706f6e5261746573 - swap - pushint 2 - box_extract - btoi - // modules/core_financial/coupon.py:187 - // self.account_units_value(holding_address, units) - frame_dig -3 - frame_dig -2 - callsub account_units_value - // modules/core_financial/coupon.py:187-188 - // self.account_units_value(holding_address, units) - // * next_coupon_rate_bps - * - // modules/core_financial/coupon.py:187-189 - // self.account_units_value(holding_address, units) - // * next_coupon_rate_bps - // * coupon_accrued_period - uncover 2 - * - // modules/core_financial/coupon.py:190 - // // (cst.BPS * coupon_period) - pushint 10000 - uncover 2 - * - // modules/core_financial/coupon.py:187-190 - // self.account_units_value(holding_address, units) - // * next_coupon_rate_bps - // * coupon_accrued_period - // // (cst.BPS * coupon_period) - / - // modules/core_financial/coupon.py:185-191 - // # due_coupons is equal to the 0-base idx of next coupon - // return ( - // self.account_units_value(holding_address, units) - // * next_coupon_rate_bps - // * coupon_accrued_period - // // (cst.BPS * coupon_period) - // ) # div-by-zero: coupon_period != 0 due to assert_time_events_sorted checks - retsub - - -// modules.core_financial.coupon.CouponCashflowMixin.all_due_coupons_paid(due_coupons: uint64) -> uint64: -all_due_coupons_paid: - // modules/core_financial/coupon.py:26 - // def all_due_coupons_paid(self, due_coupons: UInt64) -> bool: - proto 1 1 - // modules/core_financial/coupon.py:27 - // return self.paid_coupon_units >= self.circulating_units * due_coupons - intc_0 // 0 - bytec 28 // "paid_coupon_units" - app_global_get_ex - assert // check self.paid_coupon_units exists - intc_0 // 0 - bytec_3 // "circulating_units" - app_global_get_ex - assert // check self.circulating_units exists - frame_dig -1 - * - >= - retsub - - -// modules.core_financial.coupon.CouponCashflowMixin.assert_no_pending_coupon_payment(holding_address: bytes, due_coupons: uint64) -> void: -assert_no_pending_coupon_payment: - // modules/core_financial/coupon.py:29-31 - // def assert_no_pending_coupon_payment( - // self, holding_address: Account, due_coupons: UInt64 - // ) -> None: - proto 2 0 - // modules/core_financial/coupon.py:33 - // self.account[holding_address].paid_coupons == due_coupons - bytec_1 // 0x52333023 - frame_dig -2 - concat - box_get - assert // check self.account entry exists - pushint 48 - extract_uint64 - frame_dig -1 - == - // modules/core_financial/coupon.py:32-34 - // assert ( - // self.account[holding_address].paid_coupons == due_coupons - // ), err.PENDING_COUPON_PAYMENT - assert // Pending due coupon payment - retsub - - -// modules.payment_agent.common.PaymentAgentCommonMixin.assert_payment_authorization(holding_address: bytes) -> void: -assert_payment_authorization: - // modules/payment_agent/common.py:12 - // def assert_payment_authorization(self, holding_address: Account) -> None: - proto 1 0 - // modules/payment_agent/common.py:13 - // if self.op_daemon.value != Global.zero_address: - intc_0 // 0 - bytec 22 // 0x52323523 - app_global_get_ex - assert // check self.op_daemon exists - global ZeroAddress - != - bz assert_payment_authorization_after_if_else@7 - // modules/payment_agent/common.py:15 - // Txn.sender == self.op_daemon.value - txn Sender - intc_0 // 0 - bytec 22 // 0x52323523 - app_global_get_ex - assert // check self.op_daemon exists - == - // modules/payment_agent/common.py:15-17 - // Txn.sender == self.op_daemon.value - // or Txn.sender == holding_address - // or Txn.sender == self.account[holding_address].payment_address - bnz assert_payment_authorization_bool_true@4 - // modules/payment_agent/common.py:16 - // or Txn.sender == holding_address - txn Sender - frame_dig -1 - == - // modules/payment_agent/common.py:15-17 - // Txn.sender == self.op_daemon.value - // or Txn.sender == holding_address - // or Txn.sender == self.account[holding_address].payment_address - bnz assert_payment_authorization_bool_true@4 - // modules/payment_agent/common.py:17 - // or Txn.sender == self.account[holding_address].payment_address - txn Sender - bytec_1 // 0x52333023 - frame_dig -1 - concat - box_get - assert // check self.account entry exists - extract 0 32 - == - // modules/payment_agent/common.py:15-17 - // Txn.sender == self.op_daemon.value - // or Txn.sender == holding_address - // or Txn.sender == self.account[holding_address].payment_address - bz assert_payment_authorization_bool_false@5 - -assert_payment_authorization_bool_true@4: - intc_1 // 1 - -assert_payment_authorization_bool_merge@6: - // modules/payment_agent/common.py:14-18 - // assert ( - // Txn.sender == self.op_daemon.value - // or Txn.sender == holding_address - // or Txn.sender == self.account[holding_address].payment_address - // ), err.UNAUTHORIZED - assert // Not authorized - -assert_payment_authorization_after_if_else@7: - retsub - -assert_payment_authorization_bool_false@5: - intc_0 // 0 - b assert_payment_authorization_bool_merge@6 - - -// modules.payment_agent.common.PaymentAgentCommonMixin.is_payment_executable(holding_address: bytes) -> uint64: -is_payment_executable: - // modules/payment_agent/common.py:20 - // def is_payment_executable(self, holding_address: Account) -> bool: - proto 1 1 - // modules/payment_agent/common.py:22 - // self.account[holding_address].payment_address.is_opted_in( - bytec_1 // 0x52333023 - frame_dig -1 - concat - dup - box_get - assert // check self.account entry exists - extract 0 32 - // modules/payment_agent/common.py:23 - // self.settlement_asset_id - intc_0 // 0 - bytec 9 // "settlement_asset_id" - app_global_get_ex - assert // check self.settlement_asset_id exists - // modules/payment_agent/common.py:22-24 - // self.account[holding_address].payment_address.is_opted_in( - // self.settlement_asset_id - // ) - asset_holding_get AssetBalance - bury 1 - // modules/payment_agent/common.py:22-25 - // self.account[holding_address].payment_address.is_opted_in( - // self.settlement_asset_id - // ) - // and not self.account[holding_address].suspended - bz is_payment_executable_bool_false@3 - // modules/payment_agent/common.py:25 - // and not self.account[holding_address].suspended - frame_dig 0 - box_get - assert // check self.account entry exists - pushint 448 - getbit - bnz is_payment_executable_bool_false@3 - intc_1 // 1 - -is_payment_executable_bool_merge@4: - // modules/payment_agent/common.py:21-26 - // return ( - // self.account[holding_address].payment_address.is_opted_in( - // self.settlement_asset_id - // ) - // and not self.account[holding_address].suspended - // ) - swap - retsub - -is_payment_executable_bool_false@3: - intc_0 // 0 - b is_payment_executable_bool_merge@4 - - -// modules.payment_agent.common.PaymentAgentCommonMixin.assert_enough_funds(payment_amount: uint64) -> void: -assert_enough_funds: - // modules/payment_agent/common.py:28 - // def assert_enough_funds(self, payment_amount: UInt64) -> None: - proto 1 0 - // modules/payment_agent/common.py:30 - // self.settlement_asset_id.balance(Global.current_application_address) - global CurrentApplicationAddress - intc_0 // 0 - bytec 9 // "settlement_asset_id" - app_global_get_ex - assert // check self.settlement_asset_id exists - asset_holding_get AssetBalance - assert // account opted into asset - // modules/payment_agent/common.py:30-31 - // self.settlement_asset_id.balance(Global.current_application_address) - // >= payment_amount - frame_dig -1 - >= - // modules/payment_agent/common.py:29-32 - // assert ( - // self.settlement_asset_id.balance(Global.current_application_address) - // >= payment_amount - // ), err.NOT_ENOUGH_FUNDS - assert // Not enough funds for the payment - retsub - - -// modules.payment_agent.common.PaymentAgentCommonMixin.pay(receiver: bytes, amount: uint64) -> void: -pay: - // modules/payment_agent/common.py:34 - // def pay(self, receiver: Account, amount: UInt64) -> None: - proto 2 0 - // modules/payment_agent/common.py:35-40 - // itxn.AssetTransfer( - // xfer_asset=self.settlement_asset_id, - // asset_receiver=receiver, - // asset_amount=amount, - // fee=Global.min_txn_fee, - // ).submit() - itxn_begin - // modules/payment_agent/common.py:39 - // fee=Global.min_txn_fee, - global MinTxnFee - // modules/payment_agent/common.py:36 - // xfer_asset=self.settlement_asset_id, - intc_0 // 0 - bytec 9 // "settlement_asset_id" - app_global_get_ex - assert // check self.settlement_asset_id exists - frame_dig -1 - itxn_field AssetAmount - frame_dig -2 - itxn_field AssetReceiver - itxn_field XferAsset - // modules/payment_agent/common.py:35 - // itxn.AssetTransfer( - pushint 4 // axfer - itxn_field TypeEnum - itxn_field Fee - // modules/payment_agent/common.py:35-40 - // itxn.AssetTransfer( - // xfer_asset=self.settlement_asset_id, - // asset_receiver=receiver, - // asset_amount=amount, - // fee=Global.min_txn_fee, - // ).submit() - itxn_submit - retsub - - -// modules.core_financial.common.CoreFinancialCommonMixin.assert_time_events_sorted(time_events: bytes) -> bytes: -assert_time_events_sorted: - // modules/core_financial/common.py:107 - // def assert_time_events_sorted(self, time_events: typ.TimeEvents) -> None: - proto 1 1 - pushbytes "" - dupn 2 - // modules/core_financial/common.py:109 - // time_events[cfg.PRIMARY_DISTRIBUTION_OPENING_DATE_IDX] - frame_dig -1 - extract 2 0 - frame_dig -1 - pushint 2 - extract_uint64 - // modules/core_financial/common.py:110 - // > Global.latest_timestamp - global LatestTimestamp - // modules/core_financial/common.py:109-110 - // time_events[cfg.PRIMARY_DISTRIBUTION_OPENING_DATE_IDX] - // > Global.latest_timestamp - > - // modules/core_financial/common.py:108-111 - // assert ( - // time_events[cfg.PRIMARY_DISTRIBUTION_OPENING_DATE_IDX] - // > Global.latest_timestamp - // ), err.INVALID_TIME - assert // Time events must be set in the future - // modules/core_financial/common.py:112 - // for idx in urange(time_events.length - 1): - frame_dig -1 - intc_0 // 0 - extract_uint16 // on error: invalid array length header - intc_1 // 1 - - - intc_0 // 0 - -assert_time_events_sorted_for_header@1: - // modules/core_financial/common.py:112 - // for idx in urange(time_events.length - 1): - frame_dig 5 - frame_dig 4 - < - bz assert_time_events_sorted_after_for@6 - // modules/core_financial/common.py:114 - // required_budget=UInt64(cfg.OP_UP_TIME_EVENT_SORTING), - pushint 65 - // modules/core_financial/common.py:115 - // fee_source=OpUpFeeSource.AppAccount, - intc_1 // 1 - // modules/core_financial/common.py:113-116 - // ensure_budget( - // required_budget=UInt64(cfg.OP_UP_TIME_EVENT_SORTING), - // fee_source=OpUpFeeSource.AppAccount, - // ) - callsub ensure_budget - // modules/core_financial/common.py:117 - // time_i = time_events[idx] - frame_dig 5 - dup - intc_3 // 8 - * - frame_dig 3 - dup - cover 3 - swap - extract_uint64 - dup - cover 3 - frame_bury 1 - // modules/core_financial/common.py:118 - // time_f = time_events[idx + 1] - intc_1 // 1 - + - dup - frame_bury 2 - intc_3 // 8 - * - extract_uint64 - dup - frame_bury 0 - // modules/core_financial/common.py:119 - // assert time_f > time_i, err.INVALID_SORTING - < - assert // Time events must be sorted in strictly ascending order - // modules/core_financial/common.py:120 - // if self.day_count_convention != UInt64(cst.DCC_CONT): - intc_0 // 0 - bytec 17 // "day_count_convention" - app_global_get_ex - assert // check self.day_count_convention exists - intc 4 // 255 - != - bz assert_time_events_sorted_after_if_else@4 - // modules/core_financial/common.py:121-122 - // # The reference implementation requires time periods expressed in days for regular day-count conventions - // assert (time_f - time_i) % UInt64( - frame_dig 0 - frame_dig 1 - - - // modules/core_financial/common.py:121-124 - // # The reference implementation requires time periods expressed in days for regular day-count conventions - // assert (time_f - time_i) % UInt64( - // cst.DAY_2_SEC - // ) == 0, err.INVALID_TIME_PERIOD - intc 6 // 86400 - % - ! - assert // Time periods in Actual/Actual day count convention must be multiples of a day (in seconds) - -assert_time_events_sorted_after_if_else@4: - frame_dig 2 - frame_bury 5 - b assert_time_events_sorted_for_header@1 - -assert_time_events_sorted_after_for@6: - frame_dig -1 - frame_bury 0 - retsub - - -// modules.accounting.AccountingModule.assert_is_not_account_suspended(holding_address: bytes) -> void: -assert_is_not_account_suspended: - // modules/accounting.py:33 - // def assert_is_not_account_suspended(self, holding_address: Account) -> None: - proto 1 0 - // modules/accounting.py:34 - // assert not self.account[holding_address].suspended, err.SUSPENDED - bytec_1 // 0x52333023 - frame_dig -1 - concat - box_get - assert // check self.account entry exists - pushint 448 - getbit - ! - assert // Suspended operations - retsub - - -// modules.accounting.AccountingModule.account_units_value(holding_address: bytes, units: uint64) -> uint64: -account_units_value: - // modules/accounting.py:36 - // def account_units_value(self, holding_address: Account, units: UInt64) -> UInt64: - proto 2 1 - // modules/accounting.py:37 - // return units * self.account[holding_address].unit_value - bytec_1 // 0x52333023 - frame_dig -2 - concat - box_get - assert // check self.account entry exists - pushint 40 - extract_uint64 - frame_dig -1 - * - retsub - - -// modules.accounting.AccountingModule.account_total_units_value(holding_address: bytes) -> uint64: -account_total_units_value: - // modules/accounting.py:39 - // def account_total_units_value(self, holding_address: Account) -> UInt64: - proto 1 1 - // modules/accounting.py:41 - // holding_address, self.account[holding_address].units - bytec_1 // 0x52333023 - frame_dig -1 - concat - box_get - assert // check self.account entry exists - intc_2 // 32 - extract_uint64 - // modules/accounting.py:40-42 - // return self.account_units_value( - // holding_address, self.account[holding_address].units - // ) - frame_dig -1 - swap - callsub account_units_value - retsub - - -// modules.accounting.AccountingModule.end_if_no_circulating_units() -> void: -end_if_no_circulating_units: - // modules/accounting.py:48 - // if self.circulating_units == UInt64(0): - intc_0 // 0 - bytec_3 // "circulating_units" - app_global_get_ex - assert // check self.circulating_units exists - bnz end_if_no_circulating_units_after_if_else@2 - // modules/accounting.py:49 - // self.status = UInt64(enm.STATUS_ENDED) - bytec_2 // "status" - intc 5 // 200 - app_global_put - -end_if_no_circulating_units_after_if_else@2: - retsub - - -// modules.rbac.RbacModule._role_is_active(role_map: bytes, role_address: bytes) -> uint64: -_role_is_active: - // modules/rbac.py:57 - // def _role_is_active(self, role_map: typ.RbacRole, role_address: Account) -> bool: - proto 2 1 - pushbytes "" - // modules/rbac.py:55 - // return role_address in role_map - frame_dig -2 - frame_dig -1 - concat - dup - box_len - bury 1 - // modules/rbac.py:58-62 - // return self._has_role(role_map, role_address) and ( - // role_map[role_address].role_validity_start - // <= Global.latest_timestamp - // <= role_map[role_address].role_validity_end - // ) - bz _role_is_active_bool_false@4 - // modules/rbac.py:59 - // role_map[role_address].role_validity_start - frame_dig 1 - box_get - assert // check BoxMap entry exists - intc_0 // 0 - extract_uint64 - // modules/rbac.py:60 - // <= Global.latest_timestamp - global LatestTimestamp - dup - frame_bury 0 - // modules/rbac.py:59-60 - // role_map[role_address].role_validity_start - // <= Global.latest_timestamp - <= - // modules/rbac.py:59-61 - // role_map[role_address].role_validity_start - // <= Global.latest_timestamp - // <= role_map[role_address].role_validity_end - bz _role_is_active_bool_false@4 - // modules/rbac.py:61 - // <= role_map[role_address].role_validity_end - frame_dig 1 - box_get - assert // check BoxMap entry exists - intc_3 // 8 - extract_uint64 - // modules/rbac.py:60-61 - // <= Global.latest_timestamp - // <= role_map[role_address].role_validity_end - frame_dig 0 - >= - // modules/rbac.py:59-61 - // role_map[role_address].role_validity_start - // <= Global.latest_timestamp - // <= role_map[role_address].role_validity_end - bz _role_is_active_bool_false@4 - intc_1 // 1 - -_role_is_active_bool_merge@5: - // modules/rbac.py:58-62 - // return self._has_role(role_map, role_address) and ( - // role_map[role_address].role_validity_start - // <= Global.latest_timestamp - // <= role_map[role_address].role_validity_end - // ) - frame_bury 0 - retsub - -_role_is_active_bool_false@4: - intc_0 // 0 - b _role_is_active_bool_merge@5 - - -// modules.rbac.RbacModule.assert_caller_is_arranger() -> void: -assert_caller_is_arranger: - // modules/rbac.py:65 - // assert self._is_arranger(Txn.sender), err.UNAUTHORIZED - txn Sender - // modules/rbac.py:52 - // return role_address == self.arranger.value - intc_0 // 0 - bytec 8 // 0x52323023 - app_global_get_ex - assert // check self.arranger exists - == - // modules/rbac.py:65 - // assert self._is_arranger(Txn.sender), err.UNAUTHORIZED - assert // Not authorized - retsub - - -// modules.rbac.RbacModule.assert_is_not_asset_defaulted() -> void: -assert_is_not_asset_defaulted: - // modules/rbac.py:83 - // assert not self.asset_defaulted, err.DEFAULTED - intc_0 // 0 - bytec 24 // "asset_defaulted" - app_global_get_ex - assert // check self.asset_defaulted exists - ! - assert // Defaulted - retsub - - -// modules.rbac.RbacModule.assert_is_not_asset_suspended() -> void: -assert_is_not_asset_suspended: - // modules/rbac.py:86 - // assert not self.asset_suspended, err.SUSPENDED - intc_0 // 0 - bytec 23 // "asset_suspended" - app_global_get_ex - assert // check self.asset_suspended exists - ! - assert // Suspended operations - retsub - - -// modules.rbac.RbacModule._assert_valid_role(role_id: uint64) -> void: -_assert_valid_role: - // modules/rbac.py:88 - // def _assert_valid_role(self, role_id: UInt64) -> None: - proto 1 0 - // modules/rbac.py:89-96 - // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - frame_dig -1 - // modules/rbac.py:90 - // UInt64(cst.ROLE_ARRANGER), - pushint 20 - // modules/rbac.py:89-96 - // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - == - bnz _assert_valid_role_bool_true@6 - frame_dig -1 - // modules/rbac.py:91 - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - pushint 40 - // modules/rbac.py:89-96 - // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - == - bnz _assert_valid_role_bool_true@6 - frame_dig -1 - // modules/rbac.py:92 - // UInt64(cst.ROLE_PRIMARY_DEALER), - pushint 50 - // modules/rbac.py:89-96 - // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - == - bnz _assert_valid_role_bool_true@6 - frame_dig -1 - // modules/rbac.py:93 - // UInt64(cst.ROLE_TRUSTEE), - pushint 60 - // modules/rbac.py:89-96 - // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - == - bnz _assert_valid_role_bool_true@6 - frame_dig -1 - // modules/rbac.py:94 - // UInt64(cst.ROLE_AUTHORITY), - pushint 70 - // modules/rbac.py:89-96 - // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - == - bnz _assert_valid_role_bool_true@6 - frame_dig -1 - // modules/rbac.py:95 - // UInt64(cst.ROLE_INTEREST_ORACLE), - pushint 80 - // modules/rbac.py:89-96 - // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - == - bz _assert_valid_role_bool_false@7 - -_assert_valid_role_bool_true@6: - intc_1 // 1 - -_assert_valid_role_bool_merge@8: - // modules/rbac.py:89-96 - // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - assert // Invalid role identifier - retsub - -_assert_valid_role_bool_false@7: - intc_0 // 0 - b _assert_valid_role_bool_merge@8 diff --git a/smart_contracts/artifacts/fixed_coupon_bond/FixedCouponBond.arc56.json b/smart_contracts/artifacts/fixed_coupon_bond/FixedCouponBond.arc56.json deleted file mode 100644 index 49e9338c..00000000 --- a/smart_contracts/artifacts/fixed_coupon_bond/FixedCouponBond.arc56.json +++ /dev/null @@ -1,2048 +0,0 @@ -{ - "name": "FixedCouponBond", - "structs": { - "AccountInfo": [ - { - "name": "payment_address", - "type": "address" - }, - { - "name": "units", - "type": "uint64" - }, - { - "name": "unit_value", - "type": "uint64" - }, - { - "name": "paid_coupons", - "type": "uint64" - }, - { - "name": "suspended", - "type": "bool" - } - ], - "AssetInfo": [ - { - "name": "denomination_asset_id", - "type": "uint64" - }, - { - "name": "settlement_asset_id", - "type": "uint64" - }, - { - "name": "outstanding_principal", - "type": "uint64" - }, - { - "name": "unit_value", - "type": "uint64" - }, - { - "name": "day_count_convention", - "type": "uint8" - }, - { - "name": "principal_discount", - "type": "uint16" - }, - { - "name": "interest_rate", - "type": "uint16" - }, - { - "name": "total_supply", - "type": "uint64" - }, - { - "name": "circulating_supply", - "type": "uint64" - }, - { - "name": "primary_distribution_opening_date", - "type": "uint64" - }, - { - "name": "primary_distribution_closure_date", - "type": "uint64" - }, - { - "name": "issuance_date", - "type": "uint64" - }, - { - "name": "maturity_date", - "type": "uint64" - }, - { - "name": "suspended", - "type": "bool" - }, - { - "name": "performance", - "type": "uint8" - } - ], - "AssetMetadata": [ - { - "name": "contract_type", - "type": "uint8" - }, - { - "name": "calendar", - "type": "uint8" - }, - { - "name": "business_day_convention", - "type": "uint8" - }, - { - "name": "end_of_month_convention", - "type": "uint8" - }, - { - "name": "prepayment_effect", - "type": "uint8" - }, - { - "name": "penalty_type", - "type": "uint8" - }, - { - "name": "prospectus_hash", - "type": "byte[32]" - }, - { - "name": "prospectus_url", - "type": "string" - } - ], - "CouponsInfo": [ - { - "name": "total_coupons", - "type": "uint64" - }, - { - "name": "due_coupons", - "type": "uint64" - }, - { - "name": "next_coupon_due_date", - "type": "uint64" - }, - { - "name": "day_count_factor", - "type": "DayCountFactor" - }, - { - "name": "all_due_coupons_paid", - "type": "bool" - } - ], - "CurrentUnitsValue": [ - { - "name": "units_value", - "type": "uint64" - }, - { - "name": "accrued_interest", - "type": "uint64" - }, - { - "name": "day_count_factor", - "type": "DayCountFactor" - } - ], - "DayCountFactor": [ - { - "name": "numerator", - "type": "uint64" - }, - { - "name": "denominator", - "type": "uint64" - } - ], - "PaymentAmounts": [ - { - "name": "interest", - "type": "uint64" - }, - { - "name": "principal", - "type": "uint64" - } - ], - "PaymentResult": [ - { - "name": "amount", - "type": "uint64" - }, - { - "name": "timestamp", - "type": "uint64" - }, - { - "name": "context", - "type": "byte[]" - } - ], - "RoleConfig": [ - { - "name": "role_validity_start", - "type": "uint64" - }, - { - "name": "role_validity_end", - "type": "uint64" - } - ], - "SecondaryMarketSchedule": [ - { - "name": "secondary_market_opening_date", - "type": "uint64" - }, - { - "name": "secondary_market_closure_date", - "type": "uint64" - } - ] - }, - "methods": [ - { - "name": "asset_config", - "args": [ - { - "type": "uint64", - "name": "denomination_asset_id", - "desc": "Denomination asset identifier" - }, - { - "type": "uint64", - "name": "settlement_asset_id", - "desc": "Settlement asset identifier" - }, - { - "type": "uint64", - "name": "principal", - "desc": "Principal, expressed in denomination asset" - }, - { - "type": "uint64", - "name": "principal_discount", - "desc": "Principal discount in bps" - }, - { - "type": "uint64", - "name": "minimum_denomination", - "desc": "Minimum denomination, expressed in denomination asset" - }, - { - "type": "uint8", - "name": "day_count_convention", - "desc": "Day-count convention for interests calculation" - }, - { - "type": "uint16", - "name": "interest_rate", - "desc": "Interest rate in bps" - }, - { - "type": "uint16[]", - "name": "coupon_rates", - "desc": "Coupon interest rates in bps" - }, - { - "type": "uint64[]", - "name": "time_events", - "desc": "Time events (strictly ascending order)" - }, - { - "type": "(uint64,uint64)[]", - "name": "time_periods", - "desc": "Time periods of recurring time events" - } - ], - "returns": { - "type": "void" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Configure the Debt Algorand Standard Application", - "events": [], - "recommendations": {} - }, - { - "name": "get_account_units_current_value", - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - }, - { - "type": "uint64", - "name": "units", - "desc": "Account's units for the current value calculation" - } - ], - "returns": { - "type": "(uint64,uint64,(uint64,uint64))", - "struct": "CurrentUnitsValue", - "desc": "Units current value in denomination asset, Accrued interest in denomination asset" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Get account's units current value and accrued interest", - "events": [], - "recommendations": {} - }, - { - "name": "get_coupon_rates", - "args": [], - "returns": { - "type": "uint16[]", - "desc": "Coupon rates" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Get D-ASA coupon rates", - "events": [], - "recommendations": {} - }, - { - "name": "get_payment_amount", - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - } - ], - "returns": { - "type": "(uint64,uint64)", - "struct": "PaymentAmounts", - "desc": "Interest amount in denomination asset, Principal amount in denomination asset" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Get the next payment amount", - "events": [], - "recommendations": {} - }, - { - "name": "get_coupons_status", - "args": [], - "returns": { - "type": "(uint64,uint64,uint64,(uint64,uint64),bool)", - "struct": "CouponsInfo", - "desc": "Total coupons, Due coupons, Next coupon due date, (Day count factor numerator, Day count factor denominator), All due coupons paid" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Get D-ASA coupons status", - "events": [], - "recommendations": {} - }, - { - "name": "pay_coupon", - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - }, - { - "type": "byte[]", - "name": "payment_info", - "desc": "Additional payment information (Optional)" - } - ], - "returns": { - "type": "(uint64,uint64,byte[])", - "struct": "PaymentResult", - "desc": "Paid coupon amount in denomination asset, Payment timestamp, Payment context" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Pay due coupon to an account", - "events": [ - { - "name": "Event", - "args": [ - { - "type": "uint64", - "name": "contract_id" - }, - { - "type": "uint8", - "name": "type" - }, - { - "type": "string", - "name": "type_name" - }, - { - "type": "uint64", - "name": "time" - }, - { - "type": "uint64", - "name": "payoff" - }, - { - "type": "uint64", - "name": "currency_id" - }, - { - "type": "byte[]", - "name": "currency_unit" - }, - { - "type": "uint64", - "name": "nominal_value" - }, - { - "type": "uint16", - "name": "nominal_rate_bps" - }, - { - "type": "uint64", - "name": "nominal_accrued" - } - ], - "desc": "ACTUS Event." - } - ], - "recommendations": {} - }, - { - "name": "pay_principal", - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - }, - { - "type": "byte[]", - "name": "payment_info", - "desc": "Additional payment information (Optional)" - } - ], - "returns": { - "type": "(uint64,uint64,byte[])", - "struct": "PaymentResult", - "desc": "Paid principal amount in denomination asset, Payment timestamp, Payment context" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Pay the outstanding principal to an account", - "events": [ - { - "name": "Event", - "args": [ - { - "type": "uint64", - "name": "contract_id" - }, - { - "type": "uint8", - "name": "type" - }, - { - "type": "string", - "name": "type_name" - }, - { - "type": "uint64", - "name": "time" - }, - { - "type": "uint64", - "name": "payoff" - }, - { - "type": "uint64", - "name": "currency_id" - }, - { - "type": "byte[]", - "name": "currency_unit" - }, - { - "type": "uint64", - "name": "nominal_value" - }, - { - "type": "uint16", - "name": "nominal_rate_bps" - }, - { - "type": "uint64", - "name": "nominal_accrued" - } - ], - "desc": "ACTUS Event." - } - ], - "recommendations": {} - }, - { - "name": "asset_transfer", - "args": [ - { - "type": "address", - "name": "sender_holding_address", - "desc": "Sender Account Holding Address" - }, - { - "type": "address", - "name": "receiver_holding_address", - "desc": "Receiver Account Holding Address" - }, - { - "type": "uint64", - "name": "units", - "desc": "Amount of D-ASA units to transfer" - } - ], - "returns": { - "type": "uint64", - "desc": "Transferred actualized value in denomination asset" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Transfer D-ASA units between accounts", - "events": [], - "recommendations": {} - }, - { - "name": "asset_create", - "args": [ - { - "type": "address", - "name": "arranger", - "desc": "D-ASA Arranger Address" - }, - { - "type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", - "struct": "AssetMetadata", - "name": "metadata", - "desc": "D-ASA metadata" - } - ], - "returns": { - "type": "void" - }, - "actions": { - "create": [ - "NoOp" - ], - "call": [] - }, - "readonly": false, - "desc": "Create a new D-ASA", - "events": [], - "recommendations": {} - }, - { - "name": "asset_update", - "args": [ - { - "type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", - "struct": "AssetMetadata", - "name": "metadata" - } - ], - "returns": { - "type": "void" - }, - "actions": { - "create": [], - "call": [ - "UpdateApplication" - ] - }, - "readonly": false, - "desc": "Update D-ASA application.", - "events": [], - "recommendations": {} - }, - { - "name": "set_secondary_time_events", - "args": [ - { - "type": "uint64[]", - "name": "secondary_market_time_events", - "desc": "Secondary market time events (strictly ascending order)" - } - ], - "returns": { - "type": "(uint64,uint64)", - "struct": "SecondaryMarketSchedule", - "desc": "Secondary Market Opening Date, Secondary Market Closure Date" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Set secondary market time schedule", - "events": [], - "recommendations": {} - }, - { - "name": "set_default_status", - "args": [ - { - "type": "bool", - "name": "defaulted", - "desc": "Default status" - } - ], - "returns": { - "type": "uint64" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Set D-ASA default status", - "events": [], - "recommendations": {} - }, - { - "name": "primary_distribution", - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - }, - { - "type": "uint64", - "name": "units", - "desc": "Amount of D-ASA units to distribute" - } - ], - "returns": { - "type": "uint64", - "desc": "Remaining D-ASA units to be distributed" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Distribute D-ASA units to accounts according the primary market", - "events": [], - "recommendations": {} - }, - { - "name": "get_asset_info", - "args": [], - "returns": { - "type": "(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)", - "struct": "AssetInfo", - "desc": "Denomination asset ID, Settlement asset ID, Outstanding principal, Unit nominal value, Day-count convention, Interest rate, Total supply, Circulating supply, Primary distribution opening date, Primary distribution closure date, Issuance date, Maturity date, Suspended, Performance" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Get D-ASA info", - "events": [], - "recommendations": {} - }, - { - "name": "get_time_events", - "args": [], - "returns": { - "type": "uint64[]", - "desc": "Time events" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Get D-ASA time events", - "events": [], - "recommendations": {} - }, - { - "name": "get_secondary_market_schedule", - "args": [], - "returns": { - "type": "uint64[]", - "desc": "Secondary market schedule" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Get secondary market schedule", - "events": [], - "recommendations": {} - }, - { - "name": "get_asset_metadata", - "args": [], - "returns": { - "type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", - "struct": "AssetMetadata", - "desc": "Contract type, Calendar, Business day convention, End of month convention, Early repayment effect, Early repayment penalty type, Prospectus hash, Prospectus URL" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Get D-ASA metadata", - "events": [], - "recommendations": {} - }, - { - "name": "account_gov_suspension", - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - }, - { - "type": "bool", - "name": "suspended", - "desc": "Suspension status" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the set account suspension status" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Set account suspension status", - "events": [], - "recommendations": {} - }, - { - "name": "account_open", - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - }, - { - "type": "address", - "name": "payment_address", - "desc": "Account Payment Address" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the account opening" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Open D-ASA account", - "events": [], - "recommendations": {} - }, - { - "name": "account_close", - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - } - ], - "returns": { - "type": "(uint64,uint64)", - "desc": "Closed units, Timestamp of the account closing" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Close D-ASA account", - "events": [], - "recommendations": {} - }, - { - "name": "account_update_payment_address", - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - }, - { - "type": "address", - "name": "payment_address", - "desc": "Account Payment Address" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the account update" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Update the Payment Address of an account", - "events": [], - "recommendations": {} - }, - { - "name": "account_get_info", - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - } - ], - "returns": { - "type": "(address,uint64,uint64,uint64,bool)", - "struct": "AccountInfo", - "desc": "Payment Address, D-ASA units, Unit nominal value in denomination asset, Paid coupons, Suspended" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Get account info", - "events": [], - "recommendations": {} - }, - { - "name": "rbac_rotate_arranger", - "args": [ - { - "type": "address", - "name": "new_arranger", - "desc": "New Arranger address" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the role assignment" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Rotate the Arranger address", - "events": [], - "recommendations": {} - }, - { - "name": "rbac_set_op_daemon", - "args": [ - { - "type": "address", - "name": "address", - "desc": "Operation Daemon address" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the role assignment" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Non-Normative: Set the Operation Daemon address", - "events": [], - "recommendations": {} - }, - { - "name": "rbac_assign_role", - "args": [ - { - "type": "uint8", - "name": "role_id", - "desc": "Role Identifier" - }, - { - "type": "address", - "name": "role_address", - "desc": "Account Role Address" - }, - { - "type": "byte[]", - "name": "config", - "desc": "Role configuration (Optional)" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the role assignment" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Assign a role to an address", - "events": [], - "recommendations": {} - }, - { - "name": "rbac_revoke_role", - "args": [ - { - "type": "uint8", - "name": "role_id", - "desc": "Role Identifier" - }, - { - "type": "address", - "name": "role_address", - "desc": "Account Role Address" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the role revocation" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Revoke a role from an address", - "events": [], - "recommendations": {} - }, - { - "name": "rbac_gov_asset_suspension", - "args": [ - { - "type": "bool", - "name": "suspended", - "desc": "Suspension status" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the set asset suspension status" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Set asset suspension status", - "events": [], - "recommendations": {} - }, - { - "name": "rbac_get_arranger", - "args": [], - "returns": { - "type": "address", - "desc": "Arranger address" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Get Arranger address", - "events": [], - "recommendations": {} - }, - { - "name": "rbac_get_address_roles", - "args": [ - { - "type": "address", - "name": "address", - "desc": "Address to get roles for" - } - ], - "returns": { - "type": "(bool,bool,bool,bool,bool)", - "desc": "Roles mask: (Account Manager, Primary Dealer, Trustee, Authority, Interest Oracle)" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Non-normative - Get roles assigned to an address", - "events": [], - "recommendations": {} - }, - { - "name": "rbac_get_role_config", - "args": [ - { - "type": "uint8", - "name": "role_id", - "desc": "Role Identifier" - }, - { - "type": "address", - "name": "role_address", - "desc": "Account Role Address" - } - ], - "returns": { - "type": "(uint64,uint64)", - "struct": "RoleConfig", - "desc": "Role configuration" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Get role configuration", - "events": [], - "recommendations": {} - } - ], - "arcs": [ - 22, - 28 - ], - "networks": {}, - "state": { - "schema": { - "global": { - "ints": 20, - "bytes": 3 - }, - "local": { - "ints": 0, - "bytes": 0 - } - }, - "keys": { - "global": { - "arranger": { - "keyType": "AVMBytes", - "valueType": "address", - "key": "UjIwIw==" - }, - "op_daemon": { - "keyType": "AVMBytes", - "valueType": "address", - "key": "UjI1Iw==" - }, - "asset_suspended": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "YXNzZXRfc3VzcGVuZGVk" - }, - "asset_defaulted": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "YXNzZXRfZGVmYXVsdGVk" - }, - "total_units": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "dG90YWxfdW5pdHM=" - }, - "circulating_units": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "Y2lyY3VsYXRpbmdfdW5pdHM=" - }, - "unit_value": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "dW5pdF92YWx1ZQ==" - }, - "status": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "c3RhdHVz" - }, - "denomination_asset_id": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "ZGVub21pbmF0aW9uX2Fzc2V0X2lk" - }, - "settlement_asset_id": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "c2V0dGxlbWVudF9hc3NldF9pZA==" - }, - "day_count_convention": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "ZGF5X2NvdW50X2NvbnZlbnRpb24=" - }, - "metadata": { - "keyType": "AVMString", - "valueType": "AVMBytes", - "key": "bWV0YWRhdGE=" - }, - "principal_discount": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "cHJpbmNpcGFsX2Rpc2NvdW50" - }, - "interest_rate": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "aW50ZXJlc3RfcmF0ZQ==" - }, - "total_coupons": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "dG90YWxfY291cG9ucw==" - }, - "primary_distribution_opening_date": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "cHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRl" - }, - "primary_distribution_closure_date": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "cHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRl" - }, - "issuance_date": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "aXNzdWFuY2VfZGF0ZQ==" - }, - "secondary_market_opening_date": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "c2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGU=" - }, - "secondary_market_closure_date": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "c2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGU=" - }, - "maturity_date": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "bWF0dXJpdHlfZGF0ZQ==" - }, - "paid_coupon_units": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "cGFpZF9jb3Vwb25fdW5pdHM=" - }, - "due_coupons_watermark": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "ZHVlX2NvdXBvbnNfd2F0ZXJtYXJr" - } - }, - "local": {}, - "box": { - "time_events": { - "keyType": "AVMBytes", - "valueType": "uint64[]", - "key": "dGltZUV2ZW50cw==" - }, - "coupon_rates": { - "keyType": "AVMBytes", - "valueType": "uint16[]", - "key": "Y291cG9uUmF0ZXM=" - } - } - }, - "maps": { - "global": {}, - "local": {}, - "box": { - "account_manager": { - "keyType": "address", - "valueType": "RoleConfig", - "prefix": "UjQwIw==" - }, - "primary_dealer": { - "keyType": "address", - "valueType": "RoleConfig", - "prefix": "UjUwIw==" - }, - "trustee": { - "keyType": "address", - "valueType": "RoleConfig", - "prefix": "UjYwIw==" - }, - "authority": { - "keyType": "address", - "valueType": "RoleConfig", - "prefix": "UjcwIw==" - }, - "interest_oracle": { - "keyType": "address", - "valueType": "RoleConfig", - "prefix": "UjgwIw==" - }, - "account": { - "keyType": "address", - "valueType": "AccountInfo", - "prefix": "UjMwIw==" - } - } - } - }, - "bareActions": { - "create": [], - "call": [] - }, - "sourceInfo": { - "approval": { - "sourceInfo": [ - { - "pc": [ - 2798 - ], - "errorMessage": "Can not distribute zero units" - }, - { - "pc": [ - 1182 - ], - "errorMessage": "Coupon rates are not properly defined" - }, - { - "pc": [ - 1068 - ], - "errorMessage": "D-ASA already configured" - }, - { - "pc": [ - 4833 - ], - "errorMessage": "Defaulted" - }, - { - "pc": [ - 1075 - ], - "errorMessage": "Denomination asset is not properly set" - }, - { - "pc": [ - 1086 - ], - "errorMessage": "Different settlement asset not supported, must be equal to denomination asset" - }, - { - "pc": [ - 2814 - ], - "errorMessage": "Insufficient remaining D-ASA units" - }, - { - "pc": [ - 2283, - 2378 - ], - "errorMessage": "Insufficient sender units to transfer" - }, - { - "pc": [ - 1173 - ], - "errorMessage": "Interest rate is not properly defined" - }, - { - "pc": [ - 1328, - 1484, - 1679, - 1941, - 2237, - 2252, - 2788, - 3171, - 3242, - 3294, - 3365, - 3394 - ], - "errorMessage": "Invalid account holding address" - }, - { - "pc": [ - 3536, - 3560, - 3584, - 3608, - 3632, - 3689, - 3717, - 3739, - 3761, - 3783, - 3962, - 3980, - 3995, - 4010, - 4025 - ], - "errorMessage": "Invalid account role address" - }, - { - "pc": [ - 1346 - ], - "errorMessage": "Invalid amount of units for the account" - }, - { - "pc": [ - 1152 - ], - "errorMessage": "Invalid day-count convention ID" - }, - { - "pc": [ - 3673, - 3952, - 4895 - ], - "errorMessage": "Invalid role identifier" - }, - { - "pc": [ - 2659 - ], - "errorMessage": "Invalid secondary market closure date" - }, - { - "pc": [ - 2625 - ], - "errorMessage": "Invalid secondary market opening date" - }, - { - "pc": [ - 1119 - ], - "errorMessage": "Minimum denomination is not a divisor of principal" - }, - { - "pc": [ - 1688, - 1946 - ], - "errorMessage": "No D-ASA units" - }, - { - "pc": [ - 1702 - ], - "errorMessage": "No due coupon to pay" - }, - { - "pc": [ - 1661, - 1923, - 2219, - 2588, - 2702, - 2779, - 3162, - 3217, - 3226, - 3283, - 3350, - 3806, - 4502, - 4825 - ], - "errorMessage": "Not authorized" - }, - { - "pc": [ - 4567 - ], - "errorMessage": "Not enough funds for the payment" - }, - { - "pc": [ - 1955 - ], - "errorMessage": "Not mature" - }, - { - "pc": [ - 1707, - 1962, - 4451 - ], - "errorMessage": "Pending due coupon payment" - }, - { - "pc": [ - 2771 - ], - "errorMessage": "Primary distribution is closed" - }, - { - "pc": [ - 1317 - ], - "errorMessage": "Primary distribution not yet executed" - }, - { - "pc": [ - 2210 - ], - "errorMessage": "Secondary market is closed" - }, - { - "pc": [ - 2268 - ], - "errorMessage": "Sender and receiver must be different" - }, - { - "pc": [ - 2333 - ], - "errorMessage": "Sender and receiver units are not fungible" - }, - { - "pc": [ - 4717, - 4841 - ], - "errorMessage": "Suspended operations" - }, - { - "pc": [ - 1203, - 2593 - ], - "errorMessage": "Time events length is invalid" - }, - { - "pc": [ - 4618 - ], - "errorMessage": "Time events must be set in the future" - }, - { - "pc": [ - 4669 - ], - "errorMessage": "Time events must be sorted in strictly ascending order" - }, - { - "pc": [ - 1264 - ], - "errorMessage": "Time periods are not properly defined" - }, - { - "pc": [ - 4690 - ], - "errorMessage": "Time periods in Actual/Actual day count convention must be multiples of a day (in seconds)" - }, - { - "pc": [ - 2272 - ], - "errorMessage": "Transfer units must be greater than zero" - }, - { - "pc": [ - 606 - ], - "errorMessage": "Wrong Global Bytes allocation" - }, - { - "pc": [ - 612 - ], - "errorMessage": "Wrong Global UInts allocation" - }, - { - "pc": [ - 616 - ], - "errorMessage": "Wrong Local Bytes allocation" - }, - { - "pc": [ - 620 - ], - "errorMessage": "Wrong Local UInts allocation" - }, - { - "pc": [ - 4563 - ], - "errorMessage": "account opted into asset" - }, - { - "pc": [ - 1785, - 2033 - ], - "errorMessage": "asset exists" - }, - { - "pc": [ - 4785, - 4800 - ], - "errorMessage": "check BoxMap entry exists" - }, - { - "pc": [ - 1336, - 1500, - 1694, - 1738, - 1750, - 1986, - 2004, - 2276, - 2290, - 2299, - 2306, - 2317, - 2324, - 2338, - 2373, - 2415, - 2459, - 2822, - 4444, - 4493, - 4517, - 4536, - 4711, - 4727, - 4743 - ], - "errorMessage": "check self.account entry exists" - }, - { - "pc": [ - 3824, - 4823 - ], - "errorMessage": "check self.arranger exists" - }, - { - "pc": [ - 2896, - 4831 - ], - "errorMessage": "check self.asset_defaulted exists" - }, - { - "pc": [ - 2998, - 4839 - ], - "errorMessage": "check self.asset_suspended exists" - }, - { - "pc": [ - 1789, - 1997, - 2037, - 2802, - 2917, - 3306, - 4430, - 4756 - ], - "errorMessage": "check self.circulating_units exists" - }, - { - "pc": [ - 1458 - ], - "errorMessage": "check self.coupon_rates exists" - }, - { - "pc": [ - 2929, - 4284, - 4674 - ], - "errorMessage": "check self.day_count_convention exists" - }, - { - "pc": [ - 1781, - 2029, - 2908 - ], - "errorMessage": "check self.denomination_asset_id exists" - }, - { - "pc": [ - 4067, - 4111 - ], - "errorMessage": "check self.due_coupons_watermark exists" - }, - { - "pc": [ - 2958 - ], - "errorMessage": "check self.interest_rate exists" - }, - { - "pc": [ - 2609, - 2988, - 4100, - 4265, - 4334, - 4344 - ], - "errorMessage": "check self.issuance_date exists" - }, - { - "pc": [ - 1953, - 2634, - 2642, - 2879, - 2993, - 4072 - ], - "errorMessage": "check self.maturity_date exists" - }, - { - "pc": [ - 3130 - ], - "errorMessage": "check self.metadata exists" - }, - { - "pc": [ - 4460, - 4473 - ], - "errorMessage": "check self.op_daemon exists" - }, - { - "pc": [ - 1765, - 4426 - ], - "errorMessage": "check self.paid_coupon_units exists" - }, - { - "pc": [ - 2763, - 2983 - ], - "errorMessage": "check self.primary_distribution_closure_date exists" - }, - { - "pc": [ - 1301, - 1311, - 2749, - 2978 - ], - "errorMessage": "check self.primary_distribution_opening_date exists" - }, - { - "pc": [ - 1167, - 2943 - ], - "errorMessage": "check self.principal_discount exists" - }, - { - "pc": [ - 2194, - 2204, - 2673, - 3108 - ], - "errorMessage": "check self.secondary_market_closure_date exists" - }, - { - "pc": [ - 2183, - 2668, - 3103 - ], - "errorMessage": "check self.secondary_market_opening_date exists" - }, - { - "pc": [ - 2913, - 4525, - 4560, - 4579 - ], - "errorMessage": "check self.settlement_asset_id exists" - }, - { - "pc": [ - 1066, - 1445, - 1490, - 1657, - 1919, - 2172, - 2583, - 2738, - 3078, - 3221 - ], - "errorMessage": "check self.status exists" - }, - { - "pc": [ - 3091 - ], - "errorMessage": "check self.time_events exists" - }, - { - "pc": [ - 1511, - 1595, - 4084, - 4202, - 4353 - ], - "errorMessage": "check self.total_coupons exists" - }, - { - "pc": [ - 2810, - 2852, - 2973 - ], - "errorMessage": "check self.total_units exists" - }, - { - "pc": [ - 1794, - 2042, - 2839, - 2922 - ], - "errorMessage": "check self.unit_value exists" - }, - { - "pc": [ - 1006, - 1028, - 1046, - 1251, - 1641, - 1903, - 2504, - 2543, - 2565, - 2646, - 3474, - 4622 - ], - "errorMessage": "invalid array length header" - }, - { - "pc": [ - 2692, - 3152, - 3796 - ], - "errorMessage": "invalid number of bytes for arc4.bool" - }, - { - "pc": [ - 1019 - ], - "errorMessage": "invalid number of bytes for arc4.dynamic_array" - }, - { - "pc": [ - 1649, - 1911, - 3482 - ], - "errorMessage": "invalid number of bytes for arc4.dynamic_array" - }, - { - "pc": [ - 1059 - ], - "errorMessage": "invalid number of bytes for arc4.dynamic_array>" - }, - { - "pc": [ - 1040, - 2576 - ], - "errorMessage": "invalid number of bytes for arc4.dynamic_array" - }, - { - "pc": [ - 1287, - 1476, - 1635, - 1897, - 2151, - 2159, - 2481, - 2725, - 3144, - 3201, - 3209, - 3275, - 3336, - 3344, - 3386, - 3410, - 3434, - 3468, - 3656, - 3838, - 3922 - ], - "errorMessage": "invalid number of bytes for arc4.static_array" - }, - { - "pc": [ - 997 - ], - "errorMessage": "invalid number of bytes for arc4.uint16" - }, - { - "pc": [ - 941, - 950, - 959, - 968, - 977, - 1295, - 2167, - 2733 - ], - "errorMessage": "invalid number of bytes for arc4.uint64" - }, - { - "pc": [ - 986, - 3458, - 3646, - 3912 - ], - "errorMessage": "invalid number of bytes for arc4.uint8" - }, - { - "pc": [ - 2509, - 2548 - ], - "errorMessage": "invalid number of bytes for smart_contracts.abi_types.AssetMetadata" - }, - { - "pc": [ - 2496, - 2535 - ], - "errorMessage": "invalid tail pointer at index 7 of (uint8,uint8,uint8,uint8,uint8,uint8,uint8[32],(len+utf8[]))" - }, - { - "pc": [ - 2491, - 2530 - ], - "errorMessage": "invalid tuple encoding" - }, - { - "pc": [ - 2935, - 2950, - 2965, - 3006 - ], - "errorMessage": "overflow" - } - ], - "pcOffsetMethod": "none" - }, - "clear": { - "sourceInfo": [], - "pcOffsetMethod": "none" - } - }, - "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgMzIgOCAyNTUgMjAwIDg2NDAwCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUgMHg1MjMzMzAyMyAic3RhdHVzIiAiY2lyY3VsYXRpbmdfdW5pdHMiICJpc3N1YW5jZV9kYXRlIiAibWF0dXJpdHlfZGF0ZSIgInVuaXRfdmFsdWUiICJ0b3RhbF9jb3Vwb25zIiAweDUyMzIzMDIzICJzZXR0bGVtZW50X2Fzc2V0X2lkIiAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIiAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMgMHg1MjM3MzAyMyAweDUyMzQzMDIzICJ0b3RhbF91bml0cyIgImRlbm9taW5hdGlvbl9hc3NldF9pZCIgImRheV9jb3VudF9jb252ZW50aW9uIiAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiIDB4NjM2Zjc1NzA2ZjZlNTI2MTc0NjU3MyAweDUyMzYzMDIzIDB4NTIzNTMwMjMgMHg1MjMyMzUyMyAiYXNzZXRfc3VzcGVuZGVkIiAiYXNzZXRfZGVmYXVsdGVkIiAibWV0YWRhdGEiICJwcmluY2lwYWxfZGlzY291bnQiICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUiICJwYWlkX2NvdXBvbl91bml0cyIgImR1ZV9jb3Vwb25zX3dhdGVybWFyayIgMHgwMDAwIDB4MDAgMHg1MjM4MzAyMyAiaW50ZXJlc3RfcmF0ZSIgMHgwNjgxMDEgMHgwMDNiIDB4OGMyOTkwNGUgMHgwMDEyCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzAtMzEKICAgIC8vICMgUkJBQyBSb2xlcwogICAgLy8gc2VsZi5hcnJhbmdlciA9IEdsb2JhbFN0YXRlKEFjY291bnQoKSwga2V5PWNzdC5QUkVGSVhfSURfQVJSQU5HRVIpCiAgICBieXRlYyA4IC8vIDB4NTIzMjMwMjMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMgogICAgLy8gc2VsZi5vcF9kYWVtb24gPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX09QX0RBRU1PTikKICAgIGJ5dGVjIDIyIC8vIDB4NTIzMjM1MjMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo0Ny00OAogICAgLy8gIyBELUFTQSBHb3Zlcm5hbmNlCiAgICAvLyBzZWxmLmFzc2V0X3N1c3BlbmRlZCA9IEZhbHNlCiAgICBieXRlYyAyMyAvLyAiYXNzZXRfc3VzcGVuZGVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NDkKICAgIC8vIHNlbGYuYXNzZXRfZGVmYXVsdGVkID0gRmFsc2UKICAgIGJ5dGVjIDI0IC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxOQogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNSAvLyAidG90YWxfdW5pdHMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMAogICAgLy8gc2VsZi5jaXJjdWxhdGluZ191bml0cyA9IFVJbnQ2NCgpCiAgICBieXRlY18zIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxCiAgICAvLyBzZWxmLnVuaXRfdmFsdWUgPSBVSW50NjQoKQogICAgYnl0ZWMgNiAvLyAidW5pdF92YWx1ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIyCiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbm0uU1RBVFVTX0lOQUNUSVZFKQogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMS0zMgogICAgLy8gIyBBc3NldCBDb25maWd1cmF0aW9uCiAgICAvLyBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCA9IEFzc2V0KCkKICAgIGJ5dGVjIDE2IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMzCiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBBc3NldCgpCiAgICBieXRlYyA5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozNAogICAgLy8gc2VsZi51bml0X3ZhbHVlID0gVUludDY0KCkKICAgIGJ5dGVjIDYgLy8gInVuaXRfdmFsdWUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjM1CiAgICAvLyBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uID0gVUludDY0KCkKICAgIGJ5dGVjIDE3IC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzctMzgKICAgIC8vICMgTWV0YWRhdGEKICAgIC8vIHNlbGYubWV0YWRhdGEgPSBCeXRlcygpCiAgICBieXRlYyAyNSAvLyAibWV0YWRhdGEiCiAgICBwdXNoYnl0ZXMgMHgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MC00MQogICAgLy8gIyBQcmluY2lwYWwgLyBSYXRlcwogICAgLy8gc2VsZi5wcmluY2lwYWxfZGlzY291bnQgPSBVSW50NjQoKQogICAgYnl0ZWMgMjYgLy8gInByaW5jaXBhbF9kaXNjb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDIKICAgIC8vIHNlbGYuaW50ZXJlc3RfcmF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAzMyAvLyAiaW50ZXJlc3RfcmF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDMKICAgIC8vIHNlbGYudG90YWxfY291cG9ucyA9IFVJbnQ2NCgpCiAgICBieXRlYyA3IC8vICJ0b3RhbF9jb3Vwb25zIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0NwogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMTAgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDgKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDI3IC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQ5CiAgICAvLyBzZWxmLmlzc3VhbmNlX2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgNCAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NTAKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMTggLy8gInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo1MQogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAxMSAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjUyCiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgNSAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MjQKICAgIC8vIHNlbGYucGFpZF9jb3Vwb25fdW5pdHMgPSBVSW50NjQoKQogICAgYnl0ZWMgMjggLy8gInBhaWRfY291cG9uX3VuaXRzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxMDIKICAgIC8vIHNlbGYuZHVlX2NvdXBvbnNfd2F0ZXJtYXJrID0gVUludDY0KCkKICAgIGJ5dGVjIDI5IC8vICJkdWVfY291cG9uc193YXRlcm1hcmsiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozMwogICAgLy8gYXNzZXJ0IFR4bi5nbG9iYWxfbnVtX2J5dGVfc2xpY2UgPT0gY2ZnLkdMT0JBTF9CWVRFUywgZXJyLldST05HX0dMT0JBTF9CWVRFUwogICAgdHhuIEdsb2JhbE51bUJ5dGVTbGljZQogICAgcHVzaGludCAzCiAgICA9PQogICAgYXNzZXJ0IC8vIFdyb25nIEdsb2JhbCBCeXRlcyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzQKICAgIC8vIGFzc2VydCBUeG4uZ2xvYmFsX251bV91aW50ID09IGNmZy5HTE9CQUxfVUlOVFMsIGVyci5XUk9OR19HTE9CQUxfVUlOVFMKICAgIHR4biBHbG9iYWxOdW1VaW50CiAgICBwdXNoaW50IDIwCiAgICA9PQogICAgYXNzZXJ0IC8vIFdyb25nIEdsb2JhbCBVSW50cyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzUKICAgIC8vIGFzc2VydCBUeG4ubG9jYWxfbnVtX2J5dGVfc2xpY2UgPT0gY2ZnLkxPQ0FMX0JZVEVTLCBlcnIuV1JPTkdfTE9DQUxfQllURVMKICAgIHR4biBMb2NhbE51bUJ5dGVTbGljZQogICAgIQogICAgYXNzZXJ0IC8vIFdyb25nIExvY2FsIEJ5dGVzIGFsbG9jYXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozNgogICAgLy8gYXNzZXJ0IFR4bi5sb2NhbF9udW1fdWludCA9PSBjZmcuTE9DQUxfVUlOVFMsIGVyci5XUk9OR19MT0NBTF9VSU5UUwogICAgdHhuIExvY2FsTnVtVWludAogICAgIQogICAgYXNzZXJ0IC8vIFdyb25nIExvY2FsIFVJbnRzIGFsbG9jYXRpb24KCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE3LTMwCiAgICAvLyBjbGFzcyBGaXhlZENvdXBvbkJvbmQoCiAgICAvLyAgICAgUEFNQ29yZU1peGluLAogICAgLy8gICAgIEZpeGVkQ291cG9uQ2FzaGZsb3dNaXhpbiwKICAgIC8vICAgICBDb3Vwb25QYXltZW50QWdlbnRNaXhpbiwKICAgIC8vICAgICBQcmluY2lwYWxQYXltZW50QWdlbnRNaXhpbiwKICAgIC8vICAgICBDb3Vwb25UcmFuc2ZlckFnZW50TWl4aW4sCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyAgICAgYXZtX3ZlcnNpb249MTIsCiAgICAvLyApOgogICAgcHVzaGJ5dGVzIDB4MjVkYmE5NWIgLy8gbWV0aG9kICJhc3NldF91cGRhdGUoKHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LGJ5dGVbMzJdLHN0cmluZykpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fYXNzZXRfdXBkYXRlX3JvdXRlQDQKCm1haW5fc3dpdGNoX2Nhc2VfbmV4dEA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE3LTMwCiAgICAvLyBjbGFzcyBGaXhlZENvdXBvbkJvbmQoCiAgICAvLyAgICAgUEFNQ29yZU1peGluLAogICAgLy8gICAgIEZpeGVkQ291cG9uQ2FzaGZsb3dNaXhpbiwKICAgIC8vICAgICBDb3Vwb25QYXltZW50QWdlbnRNaXhpbiwKICAgIC8vICAgICBQcmluY2lwYWxQYXltZW50QWdlbnRNaXhpbiwKICAgIC8vICAgICBDb3Vwb25UcmFuc2ZlckFnZW50TWl4aW4sCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyAgICAgYXZtX3ZlcnNpb249MTIsCiAgICAvLyApOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYnogbWFpbl9jcmVhdGVfTm9PcEAzNgogICAgcHVzaGJ5dGVzcyAweDg5NDc0MTM0IDB4NDQzNjNkNDkgMHg1M2JlZjA0NSAweDY3ZGI0ZjIwIDB4ZjZhOTZjOGQgMHg4Y2YxNGI1MSAweDljNzZiNmEzIDB4NGZkNmEzY2MgMHgxZDZmYzI1NSAweDI1ZTk5OTdmIDB4NmM4NWUzZWUgMHg0MDJkYmE0NyAweGZhZDIxNzNlIDB4MDhlZmVhMzUgMHhlNGE1YWI1NCAweGRjMDYzYjM1IDB4MTRmYzEwZWYgMHg0YzExM2VkNSAweDc0YTcyOTdmIDB4MTA1YzE4NGUgMHg4MmY3MWIyZCAweGVmMDRmNWQzIDB4MDNiODMzMjkgMHgzZGJlODBiZCAweGRmNTRlODJjIDB4MDEwYzgyOTkgMHg3NDA2YWNkMiAweGMzZTRiMjk3IC8vIG1ldGhvZCAiYXNzZXRfY29uZmlnKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDgsdWludDE2LHVpbnQxNltdLHVpbnQ2NFtdLCh1aW50NjQsdWludDY0KVtdKXZvaWQiLCBtZXRob2QgImdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWUoYWRkcmVzcyx1aW50NjQpKHVpbnQ2NCx1aW50NjQsKHVpbnQ2NCx1aW50NjQpKSIsIG1ldGhvZCAiZ2V0X2NvdXBvbl9yYXRlcygpdWludDE2W10iLCBtZXRob2QgImdldF9wYXltZW50X2Ftb3VudChhZGRyZXNzKSh1aW50NjQsdWludDY0KSIsIG1ldGhvZCAiZ2V0X2NvdXBvbnNfc3RhdHVzKCkodWludDY0LHVpbnQ2NCx1aW50NjQsKHVpbnQ2NCx1aW50NjQpLGJvb2wpIiwgbWV0aG9kICJwYXlfY291cG9uKGFkZHJlc3MsYnl0ZVtdKSh1aW50NjQsdWludDY0LGJ5dGVbXSkiLCBtZXRob2QgInBheV9wcmluY2lwYWwoYWRkcmVzcyxieXRlW10pKHVpbnQ2NCx1aW50NjQsYnl0ZVtdKSIsIG1ldGhvZCAiYXNzZXRfdHJhbnNmZXIoYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInNldF9zZWNvbmRhcnlfdGltZV9ldmVudHModWludDY0W10pKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJzZXRfZGVmYXVsdF9zdGF0dXMoYm9vbCl1aW50NjQiLCBtZXRob2QgInByaW1hcnlfZGlzdHJpYnV0aW9uKGFkZHJlc3MsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X2luZm8oKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDgsdWludDE2LHVpbnQxNix1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxib29sLHVpbnQ4KSIsIG1ldGhvZCAiZ2V0X3RpbWVfZXZlbnRzKCl1aW50NjRbXSIsIG1ldGhvZCAiZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGUoKXVpbnQ2NFtdIiwgbWV0aG9kICJnZXRfYXNzZXRfbWV0YWRhdGEoKSh1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCxieXRlWzMyXSxzdHJpbmcpIiwgbWV0aG9kICJhY2NvdW50X2dvdl9zdXNwZW5zaW9uKGFkZHJlc3MsYm9vbCl1aW50NjQiLCBtZXRob2QgImFjY291bnRfb3BlbihhZGRyZXNzLGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X2Nsb3NlKGFkZHJlc3MpKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJhY2NvdW50X3VwZGF0ZV9wYXltZW50X2FkZHJlc3MoYWRkcmVzcyxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAiYWNjb3VudF9nZXRfaW5mbyhhZGRyZXNzKShhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LGJvb2wpIiwgbWV0aG9kICJyYmFjX3JvdGF0ZV9hcnJhbmdlcihhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19zZXRfb3BfZGFlbW9uKGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX2Fzc2lnbl9yb2xlKHVpbnQ4LGFkZHJlc3MsYnl0ZVtdKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19yZXZva2Vfcm9sZSh1aW50OCxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19nb3ZfYXNzZXRfc3VzcGVuc2lvbihib29sKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19nZXRfYXJyYW5nZXIoKWFkZHJlc3MiLCBtZXRob2QgInJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXMoYWRkcmVzcykoYm9vbCxib29sLGJvb2wsYm9vbCxib29sKSIsIG1ldGhvZCAicmJhY19nZXRfcm9sZV9jb25maWcodWludDgsYWRkcmVzcykodWludDY0LHVpbnQ2NCkiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBhc3NldF9jb25maWcgZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZSBnZXRfY291cG9uX3JhdGVzIGdldF9wYXltZW50X2Ftb3VudCBnZXRfY291cG9uc19zdGF0dXMgcGF5X2NvdXBvbiBwYXlfcHJpbmNpcGFsIGFzc2V0X3RyYW5zZmVyIHNldF9zZWNvbmRhcnlfdGltZV9ldmVudHMgc2V0X2RlZmF1bHRfc3RhdHVzIHByaW1hcnlfZGlzdHJpYnV0aW9uIGdldF9hc3NldF9pbmZvIGdldF90aW1lX2V2ZW50cyBnZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZSBnZXRfYXNzZXRfbWV0YWRhdGEgYWNjb3VudF9nb3Zfc3VzcGVuc2lvbiBhY2NvdW50X29wZW4gYWNjb3VudF9jbG9zZSBhY2NvdW50X3VwZGF0ZV9wYXltZW50X2FkZHJlc3MgYWNjb3VudF9nZXRfaW5mbyByYmFjX3JvdGF0ZV9hcnJhbmdlciByYmFjX3NldF9vcF9kYWVtb24gcmJhY19hc3NpZ25fcm9sZSByYmFjX3Jldm9rZV9yb2xlIHJiYWNfZ292X2Fzc2V0X3N1c3BlbnNpb24gcmJhY19nZXRfYXJyYW5nZXIgcmJhY19nZXRfYWRkcmVzc19yb2xlcyByYmFjX2dldF9yb2xlX2NvbmZpZwogICAgZXJyCgptYWluX2NyZWF0ZV9Ob09wQDM2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE3LTMwCiAgICAvLyBjbGFzcyBGaXhlZENvdXBvbkJvbmQoCiAgICAvLyAgICAgUEFNQ29yZU1peGluLAogICAgLy8gICAgIEZpeGVkQ291cG9uQ2FzaGZsb3dNaXhpbiwKICAgIC8vICAgICBDb3Vwb25QYXltZW50QWdlbnRNaXhpbiwKICAgIC8vICAgICBQcmluY2lwYWxQYXltZW50QWdlbnRNaXhpbiwKICAgIC8vICAgICBDb3Vwb25UcmFuc2ZlckFnZW50TWl4aW4sCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyAgICAgYXZtX3ZlcnNpb249MTIsCiAgICAvLyApOgogICAgcHVzaGJ5dGVzIDB4M2YwZWZjNmMgLy8gbWV0aG9kICJhc3NldF9jcmVhdGUoYWRkcmVzcywodWludDgsdWludDgsdWludDgsdWludDgsdWludDgsdWludDgsYnl0ZVszMl0sc3RyaW5nKSl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggYXNzZXRfY3JlYXRlCiAgICBlcnIKCm1haW5fYXNzZXRfdXBkYXRlX3JvdXRlQDQ6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyNzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgNCAvLyBVcGRhdGVBcHBsaWNhdGlvbgogICAgPT0KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0CiAgICBiIGFzc2V0X3VwZGF0ZQoKCi8vIF9wdXlhX2xpYi51dGlsLmVuc3VyZV9idWRnZXQocmVxdWlyZWRfYnVkZ2V0OiB1aW50NjQsIGZlZV9zb3VyY2U6IHVpbnQ2NCkgLT4gdm9pZDoKZW5zdXJlX2J1ZGdldDoKICAgIHByb3RvIDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDEwCiAgICArCgplbnN1cmVfYnVkZ2V0X3doaWxlX3RvcEAxOgogICAgZnJhbWVfZGlnIDAKICAgIGdsb2JhbCBPcGNvZGVCdWRnZXQKICAgID4KICAgIGJ6IGVuc3VyZV9idWRnZXRfYWZ0ZXJfd2hpbGVANgogICAgaXR4bl9iZWdpbgogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGJ5dGVjIDM0IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbQogICAgYnl0ZWMgMzQgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KICAgIGZyYW1lX2RpZyAtMQogICAgc3dpdGNoIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMEAzIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMUA0CgplbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX25leHRANToKICAgIGl0eG5fc3VibWl0CiAgICBiIGVuc3VyZV9idWRnZXRfd2hpbGVfdG9wQDEKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMUA0OgogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgaXR4bl9maWVsZCBGZWUKICAgIGIgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV9uZXh0QDUKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMEAzOgogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBiIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfbmV4dEA1CgplbnN1cmVfYnVkZ2V0X2FmdGVyX3doaWxlQDY6CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzLnBhbS5QQU1Db3JlTWl4aW4uYXNzZXRfY29uZmlnW3JvdXRpbmddKCkgLT4gdm9pZDoKYXNzZXRfY29uZmlnOgogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL2FjdHVzL3BhbS5weToyNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA2CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDcKICAgIGR1cAogICAgY292ZXIgNwogICAgbGVuCiAgICBwdXNoaW50IDIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDE2CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA4CiAgICBkdXAKICAgIGNvdmVyIDcKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgOAogICAgcHVzaGludCAyCiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIHN3YXAKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDE2PgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOQogICAgZHVwCiAgICBjb3ZlciA3CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGNvdmVyIDgKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIHN3YXAKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PHVpbnQ2ND4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEwCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGNvdmVyIDgKICAgIHB1c2hpbnQgMTYKICAgICoKICAgIHB1c2hpbnQgMgogICAgKwogICAgc3dhcAogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8dHVwbGU8dWludDY0LHVpbnQ2ND4+CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyMjcKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjIyOAogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzID09IGVudW1zLlNUQVRVU19JTkFDVElWRSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo1NS01NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBkZW5vbWluYXRpb24gd2l0aCBBU0EKICAgIC8vIF9jcmVhdG9yLCBleGlzdHMgPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF9jcmVhdG9yKGRlbm9taW5hdGlvbl9hc3NldF9pZCkKICAgIGRpZyA1CiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q3JlYXRvcgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo1NwogICAgLy8gYXNzZXJ0IGV4aXN0cywgZXJyLklOVkFMSURfREVOT01JTkFUSU9OCiAgICBhc3NlcnQgLy8gRGVub21pbmF0aW9uIGFzc2V0IGlzIG5vdCBwcm9wZXJseSBzZXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjYwCiAgICAvLyBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCA9IGRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgYnl0ZWMgMTYgLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGRpZyA2CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NjUKICAgIC8vIHNldHRsZW1lbnRfYXNzZXRfaWQgPT0gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIGRpZyA0CiAgICB1bmNvdmVyIDYKICAgID09CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo2My02NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHNldHRsZW1lbnQgYXNzZXQgaXMgdGhlIGRlbm9taW5hdGlvbiBhc3NldAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZXR0bGVtZW50X2Fzc2V0X2lkID09IHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICAvLyApLCBlcnIuSU5WQUxJRF9TRVRUTEVNRU5UX0FTU0VUCiAgICBhc3NlcnQgLy8gRGlmZmVyZW50IHNldHRsZW1lbnQgYXNzZXQgbm90IHN1cHBvcnRlZCwgbXVzdCBiZSBlcXVhbCB0byBkZW5vbWluYXRpb24gYXNzZXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjY5CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBzZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBieXRlYyA5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgZGlnIDUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3MC03NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhc3NldF9hbW91bnQ9MCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NzUKICAgIC8vIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3MwogICAgLy8gYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3NAogICAgLy8gYXNzZXRfYW1vdW50PTAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICB1bmNvdmVyIDUKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3MC03MQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3MC03NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhc3NldF9hbW91bnQ9MCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjIzOC0yMzkKICAgIC8vICMgU2V0IFByaW5jaXBhbCBhbmQgTWluaW11bSBEZW5vbWluYXRpb24KICAgIC8vIGFzc2VydCBwcmluY2lwYWwgJSBtaW5pbXVtX2Rlbm9taW5hdGlvbiA9PSAwLCBlcnIuSU5WQUxJRF9NSU5JTVVNX0RFTk9NSU5BVElPTgogICAgZGlnIDMKICAgIGRpZyAyCiAgICAlCiAgICAhCiAgICBhc3NlcnQgLy8gTWluaW11bSBkZW5vbWluYXRpb24gaXMgbm90IGEgZGl2aXNvciBvZiBwcmluY2lwYWwKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI0MAogICAgLy8gc2VsZi51bml0X3ZhbHVlID0gbWluaW11bV9kZW5vbWluYXRpb24KICAgIGJ5dGVjIDYgLy8gInVuaXRfdmFsdWUiCiAgICBkaWcgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI0MQogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IHByaW5jaXBhbCAvLyBtaW5pbXVtX2Rlbm9taW5hdGlvbgogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIC8KICAgIGJ5dGVjIDE1IC8vICJ0b3RhbF91bml0cyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyNDIKICAgIC8vIHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50ID0gcHJpbmNpcGFsX2Rpc2NvdW50CiAgICBieXRlYyAyNiAvLyAicHJpbmNpcGFsX2Rpc2NvdW50IgogICAgdW5jb3ZlciAyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MjQ0LTI0NQogICAgLy8gIyBTZXQgRGF5LUNvdW50IENvbnZlbnRpb24KICAgIC8vIHNlbGYuYXNzZXJ0X2RheV9jb3VudF9jb252ZW50aW9uKGRheV9jb3VudF9jb252ZW50aW9uLmFzX3VpbnQ2NCgpKQogICAgYnRvaQogICAgZHVwCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3OS04MwogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIG9ubHkgdGhlIEFjdHVhbC9BY3R1YWwgYW5kIENvbnRpbnVvdXMgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0FfQSksCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQ09OVCksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9EQVlfQ09VTlRfQ09OVkVOVElPTgogICAgYnogYXNzZXRfY29uZmlnX2Jvb2xfdHJ1ZUAzCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjgyCiAgICAvLyBVSW50NjQoY3N0LkRDQ19DT05UKSwKICAgIGludGMgNCAvLyAyNTUKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5Ojc5LTgzCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgb25seSB0aGUgQWN0dWFsL0FjdHVhbCBhbmQgQ29udGludW91cyBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGFzc2VydCBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQV9BKSwKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19DT05UKSwKICAgIC8vICksIGVyci5JTlZBTElEX0RBWV9DT1VOVF9DT05WRU5USU9OCiAgICA9PQogICAgYnogYXNzZXRfY29uZmlnX2Jvb2xfZmFsc2VANAoKYXNzZXRfY29uZmlnX2Jvb2xfdHJ1ZUAzOgogICAgaW50Y18xIC8vIDEKCmFzc2V0X2NvbmZpZ19ib29sX21lcmdlQDU6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3OS04MwogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIG9ubHkgdGhlIEFjdHVhbC9BY3R1YWwgYW5kIENvbnRpbnVvdXMgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0FfQSksCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQ09OVCksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9EQVlfQ09VTlRfQ09OVkVOVElPTgogICAgYXNzZXJ0IC8vIEludmFsaWQgZGF5LWNvdW50IGNvbnZlbnRpb24gSUQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5Ojg2CiAgICAvLyBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uID0gZGF5X2NvdW50X2NvbnZlbnRpb24KICAgIGJ5dGVjIDE3IC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MjQ4LTI0OQogICAgLy8gIyBTZXQgSW50ZXJlc3QgUmF0ZQogICAgLy8gc2VsZi5hc3NlcnRfaW50ZXJlc3RfcmF0ZShpbnRlcmVzdF9yYXRlLmFzX3VpbnQ2NCgpKQogICAgZGlnIDYKICAgIGJ0b2kKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6ODktOTAKICAgIC8vICMgVGhpcyBzdWJyb3V0aW5lIG11c3QgYmUgdXNlZCBhZnRlciB0aGUgcHJpbmNpcGFsIGRpc2NvdW50IGhhcyBiZWVuIHNldAogICAgLy8gaWYgbm90IHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI2IC8vICJwcmluY2lwYWxfZGlzY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50IGV4aXN0cwogICAgYm56IGFzc2V0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDcKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjkxCiAgICAvLyBhc3NlcnQgaW50ZXJlc3RfcmF0ZSA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfSU5URVJFU1RfUkFURQogICAgZGlnIDcKICAgIGFzc2VydCAvLyBJbnRlcmVzdCByYXRlIGlzIG5vdCBwcm9wZXJseSBkZWZpbmVkCgphc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6OTQKICAgIC8vIHNlbGYuaW50ZXJlc3RfcmF0ZSA9IGludGVyZXN0X3JhdGUKICAgIGJ5dGVjIDMzIC8vICJpbnRlcmVzdF9yYXRlIgogICAgZGlnIDgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxMDUKICAgIC8vIGFzc2VydCBjb3Vwb25fcmF0ZXMubGVuZ3RoLCBlcnIuSU5WQUxJRF9DT1VQT05fUkFURVMKICAgIGRpZyA0CiAgICBkdXAKICAgIGFzc2VydCAvLyBDb3Vwb24gcmF0ZXMgYXJlIG5vdCBwcm9wZXJseSBkZWZpbmVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxMDgKICAgIC8vIHNlbGYudG90YWxfY291cG9ucyA9IGNvdXBvbl9yYXRlcy5sZW5ndGgKICAgIGJ5dGVjIDcgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjEwOQogICAgLy8gc2VsZi5jb3Vwb25fcmF0ZXMudmFsdWUgPSBjb3Vwb25fcmF0ZXMuY29weSgpCiAgICBieXRlYyAxOSAvLyAweDYzNmY3NTcwNmY2ZTUyNjE3NDY1NzMKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgMTkgLy8gMHg2MzZmNzU3MDZmNmU1MjYxNzQ2NTczCiAgICBkaWcgNwogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTA0CiAgICAvLyB0aW1lX2V2ZW50cy5sZW5ndGggPT0gc2VsZi50b3RhbF9jb3Vwb25zICsgY2ZnLlRJTUVfU0NIRURVTEVfTElNSVRTCiAgICBwdXNoaW50IDQKICAgICsKICAgIGRpZyAzCiAgICA9PQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTAzLTEwNQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICB0aW1lX2V2ZW50cy5sZW5ndGggPT0gc2VsZi50b3RhbF9jb3Vwb25zICsgY2ZnLlRJTUVfU0NIRURVTEVfTElNSVRTCiAgICAvLyApLCBlcnIuSU5WQUxJRF9USU1FX0VWRU5UU19MRU5HVEgKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBsZW5ndGggaXMgaW52YWxpZAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MjU4CiAgICAvLyBzZWxmLmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQodGltZV9ldmVudHMpCiAgICBkaWcgMwogICAgY2FsbHN1YiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMjcKICAgIC8vIHNlbGYudGltZV9ldmVudHMudmFsdWUgPSB0aW1lX2V2ZW50cy5jb3B5KCkKICAgIGJ5dGVjIDEyIC8vIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgMTIgLy8gMHg3NDY5NmQ2NTQ1NzY2NTZlNzQ3MwogICAgZGlnIDEKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjEyOC0xMzAKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlID0gdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX09QRU5JTkdfREFURV9JRFgKICAgIC8vIF0KICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxCiAgICBwdXNoaW50IDIKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMjgKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlID0gdGltZV9ldmVudHNbCiAgICBieXRlYyAxMCAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTI4LTEzMAogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgPSB0aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fT1BFTklOR19EQVRFX0lEWAogICAgLy8gXQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjEzMS0xMzMKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlID0gdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX0NMT1NVUkVfREFURV9JRFgKICAgIC8vIF0KICAgIGRpZyAxCiAgICBwdXNoaW50IDEwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTMxCiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgYnl0ZWMgMjcgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjEzMS0xMzMKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlID0gdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX0NMT1NVUkVfREFURV9JRFgKICAgIC8vIF0KICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMzQKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZSA9IHRpbWVfZXZlbnRzW2NmZy5JU1NVQU5DRV9EQVRFX0lEWF0KICAgIGRpZyAxCiAgICBwdXNoaW50IDE4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNCAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMzUKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IHRpbWVfZXZlbnRzW2NmZy5NQVRVUklUWV9EQVRFX0lEWF0KICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA1IC8vICJtYXR1cml0eV9kYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjEzOAogICAgLy8gYXNzZXJ0IG5vdCB0aW1lX3BlcmlvZHMubGVuZ3RoLCBlcnIuSU5WQUxJRF9USU1FX1BFUklPRFMKICAgIGRpZyAxCiAgICAhCiAgICBhc3NlcnQgLy8gVGltZSBwZXJpb2RzIGFyZSBub3QgcHJvcGVybHkgZGVmaW5lZAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MjY1CiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbnVtcy5TVEFUVVNfQUNUSVZFKQogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgcHVzaGludCAxMDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzL3BhbS5weToyNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgphc3NldF9jb25maWdfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXRfY29uZmlnX2Jvb2xfbWVyZ2VANQoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY291cG9uLkZpeGVkQ291cG9uQ2FzaGZsb3dNaXhpbi5nZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZToKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gNAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MjAxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MjIyCiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MjIyLTIyMwogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIGFuZCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgYnogZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjIyMwogICAgLy8gYW5kIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID49IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICA+PQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MjIyLTIyMwogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIGFuZCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgYnogZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDQKICAgIGludGNfMSAvLyAxCgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfbWVyZ2VANToKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjIyMS0yMjQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vICAgICBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vICksIGVyci5OT19QUklNQVJZX0RJU1RSSUJVVElPTgogICAgYXNzZXJ0IC8vIFByaW1hcnkgZGlzdHJpYnV0aW9uIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozMQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgOQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MjI2CiAgICAvLyBhc3NlcnQgMCA8IHVuaXRzIDw9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLCBlcnIuSU5WQUxJRF9VTklUUwogICAgZHVwCiAgICBieiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VAOAogICAgZGlnIDcKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzIgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMQogICAgPj0KICAgIGJ6IGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUA4CiAgICBpbnRjXzEgLy8gMQoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX21lcmdlQDk6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToyMjYKICAgIC8vIGFzc2VydCAwIDwgdW5pdHMgPD0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMsIGVyci5JTlZBTElEX1VOSVRTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhbW91bnQgb2YgdW5pdHMgZm9yIHRoZSBhY2NvdW50CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToyMjgtMjI5CiAgICAvLyAjIFZhbHVlIGR1cmluZyBwcmltYXJ5IGRpc3RyaWJ1dGlvbiBhbmQgYXQgbWF0dXJpdHkKICAgIC8vIGFjY291bnRfdW5pdHNfbm9taW5hbF92YWx1ZSA9IHNlbGYuYWNjb3VudF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MsIHVuaXRzKQogICAgZGlnIDEKICAgIGR1cAogICAgZGlnIDIKICAgIGNhbGxzdWIgYWNjb3VudF91bml0c192YWx1ZQogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToyMzAtMjMxCiAgICAvLyAjIEFjY3J1aW5nIGludGVyZXN0IGR1cmluZyBwcmltYXJ5IGRpc3RyaWJ1dGlvbiBhbmQgYXQgbWF0dXJpdHkKICAgIC8vIGFjY3J1ZWRfaW50ZXJlc3QgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MjMyCiAgICAvLyBudW1lcmF0b3IgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MjMzCiAgICAvLyBkZW5vbWluYXRvciA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToyMzUtMjM2CiAgICAvLyAjIEFjY3J1aW5nIGludGVyZXN0CiAgICAvLyBkdWVfY291cG9ucyA9IHNlbGYuY291bnRfZHVlX2NvdXBvbnMoKQogICAgY2FsbHN1YiBjb3VudF9kdWVfY291cG9ucwogICAgZHVwCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjIzNwogICAgLy8gc2VsZi5hc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudChob2xkaW5nX2FkZHJlc3MsIGR1ZV9jb3Vwb25zKQogICAgc3dhcAogICAgZGlnIDEKICAgIGNhbGxzdWIgYXNzZXJ0X25vX3BlbmRpbmdfY291cG9uX3BheW1lbnQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjIzOAogICAgLy8gaWYgc2VsZi5pc19hY2NydWluZ19pbnRlcmVzdChkdWVfY291cG9ucyk6CiAgICBjYWxsc3ViIGlzX2FjY3J1aW5nX2ludGVyZXN0CiAgICBieiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2FmdGVyX2lmX2Vsc2VAMTEKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjIzOQogICAgLy8gZGF5X2NvdW50X2ZhY3RvciA9IHNlbGYuZGF5X2NvdW50X2ZhY3RvcihkdWVfY291cG9ucykKICAgIGRpZyAzCiAgICBkdXAKICAgIGNhbGxzdWIgZGF5X2NvdW50X2ZhY3RvcgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MjQwLTI0MgogICAgLy8gYWNjcnVlZF9pbnRlcmVzdCA9IHNlbGYuYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQoCiAgICAvLyAgICAgaG9sZGluZ19hZGRyZXNzLCB1bml0cywgZHVlX2NvdXBvbnMKICAgIC8vICkKICAgIGRpZyAzCiAgICBkaWcgMwogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIGFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50CiAgICBidXJ5IDcKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjI0MwogICAgLy8gbnVtZXJhdG9yID0gZGF5X2NvdW50X2ZhY3Rvci5udW1lcmF0b3IKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBidXJ5IDQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjI0NAogICAgLy8gZGVub21pbmF0b3IgPSBkYXlfY291bnRfZmFjdG9yLmRlbm9taW5hdG9yCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgNQoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MjQ5LTI1MgogICAgLy8gZGF5X2NvdW50X2ZhY3Rvcj10eXAuRGF5Q291bnRGYWN0b3IoCiAgICAvLyAgICAgbnVtZXJhdG9yPW51bWVyYXRvciwKICAgIC8vICAgICBkZW5vbWluYXRvcj1kZW5vbWluYXRvciwKICAgIC8vICksCiAgICBkaWcgMgogICAgaXRvYgogICAgZGlnIDUKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MjQ2LTI1MwogICAgLy8gcmV0dXJuIHR5cC5DdXJyZW50VW5pdHNWYWx1ZSgKICAgIC8vICAgICB1bml0c192YWx1ZT1hY2NvdW50X3VuaXRzX25vbWluYWxfdmFsdWUsCiAgICAvLyAgICAgYWNjcnVlZF9pbnRlcmVzdD1hY2NydWVkX2ludGVyZXN0LAogICAgLy8gICAgIGRheV9jb3VudF9mYWN0b3I9dHlwLkRheUNvdW50RmFjdG9yKAogICAgLy8gICAgICAgICBudW1lcmF0b3I9bnVtZXJhdG9yLAogICAgLy8gICAgICAgICBkZW5vbWluYXRvcj1kZW5vbWluYXRvciwKICAgIC8vICAgICApLAogICAgLy8gKQogICAgZGlnIDcKICAgIGl0b2IKICAgIGRpZyA3CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MjAxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUA4OgogICAgaW50Y18wIC8vIDAKICAgIGIgZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX21lcmdlQDkKCmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX21lcmdlQDUKCgovLyBtb2R1bGVzLmNvcmVfZmluYW5jaWFsLmNvdXBvbi5GaXhlZENvdXBvbkNhc2hmbG93TWl4aW4uZ2V0X2NvdXBvbl9yYXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9jb3Vwb25fcmF0ZXM6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToyNjMKICAgIC8vIGNvdXBvbl9yYXRlcyA9IHR5cC5Db3Vwb25SYXRlcygpCiAgICBieXRlYyAzMCAvLyAweDAwMDAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGVubS5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgMTAwCiAgICA9PQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MjY0CiAgICAvLyBpZiBzZWxmLnN0YXR1c19pc19hY3RpdmUoKToKICAgIGJ6IGdldF9jb3Vwb25fcmF0ZXNfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToyNjUKICAgIC8vIGNvdXBvbl9yYXRlcyA9IHNlbGYuY291cG9uX3JhdGVzLnZhbHVlLmNvcHkoKQogICAgYnl0ZWMgMTkgLy8gMHg2MzZmNzU3MDZmNmU1MjYxNzQ2NTczCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidXJ5IDIKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvdXBvbl9yYXRlcyBleGlzdHMKCmdldF9jb3Vwb25fcmF0ZXNfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MjU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgZGlnIDEKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb3Vwb24uRml4ZWRDb3Vwb25DYXNoZmxvd01peGluLmdldF9wYXltZW50X2Ftb3VudFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9wYXltZW50X2Ftb3VudDoKICAgIHB1c2hieXRlcyAiIgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MjY4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cG4gMgogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjMxCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToyODMKICAgIC8vIGludGVyZXN0X2Ftb3VudCA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6Mjg0CiAgICAvLyBwcmluY2lwYWxfYW1vdW50ID0gVUludDY0KCkKICAgIGR1cG4gMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gZW5tLlNUQVRVU19BQ1RJVkUKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDEwMAogICAgPT0KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjI4NQogICAgLy8gaWYgc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCk6CiAgICBieiBnZXRfcGF5bWVudF9hbW91bnRfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToyODYKICAgIC8vIHBhaWRfY291cG9ucyA9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucwogICAgZGlnIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQ4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjI4NwogICAgLy8gaWYgcGFpZF9jb3Vwb25zIDwgc2VsZi50b3RhbF9jb3Vwb25zOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfY291cG9ucyBleGlzdHMKICAgIDwKICAgIGJ6IGdldF9wYXltZW50X2Ftb3VudF9lbHNlX2JvZHlANAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MjkwCiAgICAvLyBzZWxmLmFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzKSwKICAgIGRpZyAzCiAgICBjYWxsc3ViIGFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjI5MQogICAgLy8gcGFpZF9jb3Vwb25zICsgMSwKICAgIGRpZyA1CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6Mjg4LTI5MgogICAgLy8gIyBDb3Vwb24gUGF5bWVudAogICAgLy8gaW50ZXJlc3RfYW1vdW50ID0gc2VsZi5jb3Vwb25faW50ZXJlc3RfYW1vdW50KAogICAgLy8gICAgIHNlbGYuYWNjb3VudF90b3RhbF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MpLAogICAgLy8gICAgIHBhaWRfY291cG9ucyArIDEsCiAgICAvLyApCiAgICBjYWxsc3ViIGNvdXBvbl9pbnRlcmVzdF9hbW91bnQKICAgIGJ1cnkgMgoKZ2V0X3BheW1lbnRfYW1vdW50X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjI5Ni0yOTkKICAgIC8vIHJldHVybiB0eXAuUGF5bWVudEFtb3VudHMoCiAgICAvLyAgICAgaW50ZXJlc3Q9aW50ZXJlc3RfYW1vdW50LAogICAgLy8gICAgIHByaW5jaXBhbD1wcmluY2lwYWxfYW1vdW50LAogICAgLy8gKQogICAgZGlnIDEKICAgIGl0b2IKICAgIGRpZyAxCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjI2OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpnZXRfcGF5bWVudF9hbW91bnRfZWxzZV9ib2R5QDQ6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToyOTQtMjk1CiAgICAvLyAjIFByaW5jaXBhbCBQYXltZW50CiAgICAvLyBwcmluY2lwYWxfYW1vdW50ID0gc2VsZi5hY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcykKICAgIGRpZyAzCiAgICBjYWxsc3ViIGFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUKICAgIGJ1cnkgMQogICAgYiBnZXRfcGF5bWVudF9hbW91bnRfYWZ0ZXJfaWZfZWxzZUA2CgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb3Vwb24uRml4ZWRDb3Vwb25DYXNoZmxvd01peGluLmdldF9jb3Vwb25zX3N0YXR1c1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9jb3Vwb25zX3N0YXR1czoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjMxMAogICAgLy8gZHVlX2NvdXBvbnMgPSBzZWxmLmNvdW50X2R1ZV9jb3Vwb25zKCkKICAgIGNhbGxzdWIgY291bnRfZHVlX2NvdXBvbnMKICAgIGR1cG4gMgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MzExCiAgICAvLyBuZXh0X2NvdXBvbl9kdWVfZGF0ZSA9IHNlbGYubmV4dF9jb3Vwb25fZHVlX2RhdGUoZHVlX2NvdXBvbnMpCiAgICBjYWxsc3ViIG5leHRfY291cG9uX2R1ZV9kYXRlCiAgICBzd2FwCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTozMTIKICAgIC8vIGFsbF9kdWVfY291cG9uc19wYWlkID0gc2VsZi5hbGxfZHVlX2NvdXBvbnNfcGFpZChkdWVfY291cG9ucykKICAgIGR1cAogICAgY2FsbHN1YiBhbGxfZHVlX2NvdXBvbnNfcGFpZAogICAgc3dhcAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MzEzCiAgICAvLyBudW1lcmF0b3IgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjMxNAogICAgLy8gZGVub21pbmF0b3IgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjMxNQogICAgLy8gaWYgc2VsZi5pc19hY2NydWluZ19pbnRlcmVzdChkdWVfY291cG9ucyk6CiAgICBjYWxsc3ViIGlzX2FjY3J1aW5nX2ludGVyZXN0CiAgICBieiBnZXRfY291cG9uc19zdGF0dXNfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTozMTYKICAgIC8vIGRheV9jb3VudF9mYWN0b3IgPSBzZWxmLmRheV9jb3VudF9mYWN0b3IoZHVlX2NvdXBvbnMpCiAgICBkaWcgNAogICAgY2FsbHN1YiBkYXlfY291bnRfZmFjdG9yCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTozMTcKICAgIC8vIG51bWVyYXRvciA9IGRheV9jb3VudF9mYWN0b3IubnVtZXJhdG9yCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnVyeSAzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTozMTgKICAgIC8vIGRlbm9taW5hdG9yID0gZGF5X2NvdW50X2ZhY3Rvci5kZW5vbWluYXRvcgogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBidXJ5IDEKCmdldF9jb3Vwb25zX3N0YXR1c19hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTozMjAKICAgIC8vIHRvdGFsX2NvdXBvbnM9c2VsZi50b3RhbF9jb3Vwb25zLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfY291cG9ucyBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjMyMy0zMjYKICAgIC8vIGRheV9jb3VudF9mYWN0b3I9dHlwLkRheUNvdW50RmFjdG9yKAogICAgLy8gICAgIG51bWVyYXRvcj1udW1lcmF0b3IsCiAgICAvLyAgICAgZGVub21pbmF0b3I9ZGVub21pbmF0b3IsCiAgICAvLyApLAogICAgZGlnIDIKICAgIGl0b2IKICAgIGRpZyAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjMxOS0zMjgKICAgIC8vIHJldHVybiB0eXAuQ291cG9uc0luZm8oCiAgICAvLyAgICAgdG90YWxfY291cG9ucz1zZWxmLnRvdGFsX2NvdXBvbnMsCiAgICAvLyAgICAgZHVlX2NvdXBvbnM9ZHVlX2NvdXBvbnMsCiAgICAvLyAgICAgbmV4dF9jb3Vwb25fZHVlX2RhdGU9bmV4dF9jb3Vwb25fZHVlX2RhdGUsCiAgICAvLyAgICAgZGF5X2NvdW50X2ZhY3Rvcj10eXAuRGF5Q291bnRGYWN0b3IoCiAgICAvLyAgICAgICAgIG51bWVyYXRvcj1udW1lcmF0b3IsCiAgICAvLyAgICAgICAgIGRlbm9taW5hdG9yPWRlbm9taW5hdG9yLAogICAgLy8gICAgICksCiAgICAvLyAgICAgYWxsX2R1ZV9jb3Vwb25zX3BhaWQ9YWxsX2R1ZV9jb3Vwb25zX3BhaWQsCiAgICAvLyApCiAgICBzd2FwCiAgICBpdG9iCiAgICBkaWcgNgogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgNQogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDMxIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICBkaWcgNQogICAgc2V0Yml0CiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjMwMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5wYXltZW50X2FnZW50LmNvdXBvbi5Db3Vwb25QYXltZW50QWdlbnRNaXhpbi5wYXlfY291cG9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcGF5X2NvdXBvbjoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb3Vwb24ucHk6MzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGVubS5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgMTAwCiAgICA9PQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MzkKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1c19pc19hY3RpdmUoKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0MAogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0MQogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQ0CiAgICAvLyB1bml0cyA9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzCiAgICBkdXAKICAgIGJveF9nZXQKICAgIHBvcAogICAgaW50Y18yIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0NQogICAgLy8gYXNzZXJ0IHVuaXRzID4gMCwgZXJyLk5PX1VOSVRTCiAgICBhc3NlcnQgLy8gTm8gRC1BU0EgdW5pdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQ3CiAgICAvLyBkdWVfY291cG9ucyA9IHNlbGYuY291bnRfZHVlX2NvdXBvbnMoKQogICAgY2FsbHN1YiBjb3VudF9kdWVfY291cG9ucwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NDgKICAgIC8vIGFjY291bnRfcGFpZF9jb3Vwb25zID0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGFpZF9jb3Vwb25zCiAgICBzd2FwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCA0OAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQ5CiAgICAvLyBhc3NlcnQgZHVlX2NvdXBvbnMgPiBhY2NvdW50X3BhaWRfY291cG9ucywgZXJyLk5PX0RVRV9DT1VQT04KICAgIHN3YXAKICAgIGRpZyAxCiAgICA+CiAgICBhc3NlcnQgLy8gTm8gZHVlIGNvdXBvbiB0byBwYXkKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjUwLTUzCiAgICAvLyAjIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyB2ZXJpZnkgaWYgb3RoZXIgYWNjb3VudHMgYXJlIHN0aWxsIHdhaXRpbmcgZm9yIHRoZSBwYXltZW50IG9mIHByZXZpb3VzIGNvdXBvbnMKICAgIC8vIGFzc2VydCBzZWxmLmFsbF9kdWVfY291cG9uc19wYWlkKAogICAgLy8gICAgIGFjY291bnRfcGFpZF9jb3Vwb25zCiAgICAvLyApLCBlcnIuUEVORElOR19DT1VQT05fUEFZTUVOVAogICAgZHVwCiAgICBjYWxsc3ViIGFsbF9kdWVfY291cG9uc19wYWlkCiAgICBhc3NlcnQgLy8gUGVuZGluZyBkdWUgY291cG9uIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjE5NwogICAgLy8gc2VsZi5hY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcyksCiAgICBkaWcgMQogICAgY2FsbHN1YiBhY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxOTgKICAgIC8vIGFjY291bnRfcGFpZF9jb3Vwb25zICsgMSwKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxOTYtMTk5CiAgICAvLyByZXR1cm4gc2VsZi5jb3Vwb25faW50ZXJlc3RfYW1vdW50KAogICAgLy8gICAgIHNlbGYuYWNjb3VudF90b3RhbF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MpLAogICAgLy8gICAgIGFjY291bnRfcGFpZF9jb3Vwb25zICsgMSwKICAgIC8vICkKICAgIGNhbGxzdWIgY291cG9uX2ludGVyZXN0X2Ftb3VudAogICAgc3dhcAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvdXBvbi5weTo1NAogICAgLy8gc2VsZi5hc3NlcnRfcGF5bWVudF9hdXRob3JpemF0aW9uKGhvbGRpbmdfYWRkcmVzcykKICAgIGR1cAogICAgY2FsbHN1YiBhc3NlcnRfcGF5bWVudF9hdXRob3JpemF0aW9uCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY291cG9uLnB5OjU3CiAgICAvLyBpZiBzZWxmLmlzX3BheW1lbnRfZXhlY3V0YWJsZShob2xkaW5nX2FkZHJlc3MpOgogICAgY2FsbHN1YiBpc19wYXltZW50X2V4ZWN1dGFibGUKICAgIGJ6IHBheV9jb3Vwb25fZWxzZV9ib2R5QDMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb3Vwb24ucHk6NTgtNTkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gcGF5bWVudCBhZ2VudAogICAgLy8gc2VsZi5hc3NlcnRfZW5vdWdoX2Z1bmRzKHBheW1lbnRfYW1vdW50KQogICAgZHVwbiAyCiAgICBjYWxsc3ViIGFzc2VydF9lbm91Z2hfZnVuZHMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb3Vwb24ucHk6NjAtNjEKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgdGhlIHNhbWUgYXNzZXQgZm9yIGRlbm9taW5hdGlvbiBhbmQgc2V0dGxlbWVudCwgbm8gY29udmVyc2lvbiBuZWVkZWQKICAgIC8vIHNlbGYucGF5KHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcywgcGF5bWVudF9hbW91bnQpCiAgICBkaWcgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCAzMgogICAgc3dhcAogICAgY2FsbHN1YiBwYXkKCnBheV9jb3Vwb25fYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NjMKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucyArPSAxCiAgICBkaWcgMgogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCA0OAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBwdXNoaW50IDQ4CiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NjQKICAgIC8vIHNlbGYucGFpZF9jb3Vwb25fdW5pdHMgKz0gdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyOCAvLyAicGFpZF9jb3Vwb25fdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucGFpZF9jb3Vwb25fdW5pdHMgZXhpc3RzCiAgICBkaWcgMgogICAgKwogICAgYnl0ZWMgMjggLy8gInBhaWRfY291cG9uX3VuaXRzIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb3Vwb24ucHk6MTcKICAgIC8vIGNvbnRyYWN0X2lkPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2lkLmlkLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbklECiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY291cG9uLnB5OjIwCiAgICAvLyB0aW1lPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvdXBvbi5weToyMgogICAgLy8gY3VycmVuY3lfaWQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQuaWQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY291cG9uLnB5OjIzCiAgICAvLyBjdXJyZW5jeV91bml0PXNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkLnVuaXRfbmFtZSwKICAgIGR1cAogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVuaXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY291cG9uLnB5OjI0CiAgICAvLyBub21pbmFsX3ZhbHVlPXNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKiBzZWxmLnVuaXRfdmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAidW5pdF92YWx1ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi51bml0X3ZhbHVlIGV4aXN0cwogICAgKgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvdXBvbi5weToxNi0yNwogICAgLy8gRXZlbnQoCiAgICAvLyAgICAgY29udHJhY3RfaWQ9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25faWQuaWQsCiAgICAvLyAgICAgdHlwZT1hcmM0LlVJbnQ4KGVudW1zLkVWVF9UWVBFX0lQKSwKICAgIC8vICAgICB0eXBlX25hbWU9U3RyaW5nKCJJUCIpLAogICAgLy8gICAgIHRpbWU9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgcGF5b2ZmPXBheW9mZiwKICAgIC8vICAgICBjdXJyZW5jeV9pZD1zZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZC5pZCwKICAgIC8vICAgICBjdXJyZW5jeV91bml0PXNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkLnVuaXRfbmFtZSwKICAgIC8vICAgICBub21pbmFsX3ZhbHVlPXNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKiBzZWxmLnVuaXRfdmFsdWUsCiAgICAvLyAgICAgbm9taW5hbF9yYXRlX2Jwcz1hcmM0LlVJbnQxNigwKSwgICMgVE9ETzogQWRkIGludGVyZXN0IHJhdGUKICAgIC8vICAgICBub21pbmFsX2FjY3J1ZWQ9VUludDY0KDApLAogICAgLy8gKQogICAgdW5jb3ZlciA0CiAgICBpdG9iCiAgICBwdXNoYnl0ZXMgMHgwODAwMzcKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyA0CiAgICBpdG9iCiAgICBzd2FwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZGlnIDMKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICBzd2FwCiAgICBieXRlYyAzNSAvLyAweDAwM2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb3Vwb24ucHk6MjUKICAgIC8vIG5vbWluYWxfcmF0ZV9icHM9YXJjNC5VSW50MTYoMCksICAjIFRPRE86IEFkZCBpbnRlcmVzdCByYXRlCiAgICBieXRlYyAzMCAvLyAweDAwMDAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb3Vwb24ucHk6MTYtMjcKICAgIC8vIEV2ZW50KAogICAgLy8gICAgIGNvbnRyYWN0X2lkPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2lkLmlkLAogICAgLy8gICAgIHR5cGU9YXJjNC5VSW50OChlbnVtcy5FVlRfVFlQRV9JUCksCiAgICAvLyAgICAgdHlwZV9uYW1lPVN0cmluZygiSVAiKSwKICAgIC8vICAgICB0aW1lPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gICAgIHBheW9mZj1wYXlvZmYsCiAgICAvLyAgICAgY3VycmVuY3lfaWQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQuaWQsCiAgICAvLyAgICAgY3VycmVuY3lfdW5pdD1zZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZC51bml0X25hbWUsCiAgICAvLyAgICAgbm9taW5hbF92YWx1ZT1zZWxmLmNpcmN1bGF0aW5nX3VuaXRzICogc2VsZi51bml0X3ZhbHVlLAogICAgLy8gICAgIG5vbWluYWxfcmF0ZV9icHM9YXJjNC5VSW50MTYoMCksICAjIFRPRE86IEFkZCBpbnRlcmVzdCByYXRlCiAgICAvLyAgICAgbm9taW5hbF9hY2NydWVkPVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvdXBvbi5weToyNgogICAgLy8gbm9taW5hbF9hY2NydWVkPVVJbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY291cG9uLnB5OjE2LTI3CiAgICAvLyBFdmVudCgKICAgIC8vICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICB0eXBlPWFyYzQuVUludDgoZW51bXMuRVZUX1RZUEVfSVApLAogICAgLy8gICAgIHR5cGVfbmFtZT1TdHJpbmcoIklQIiksCiAgICAvLyAgICAgdGltZT1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICBwYXlvZmY9cGF5b2ZmLAogICAgLy8gICAgIGN1cnJlbmN5X2lkPXNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkLmlkLAogICAgLy8gICAgIGN1cnJlbmN5X3VuaXQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQudW5pdF9uYW1lLAogICAgLy8gICAgIG5vbWluYWxfdmFsdWU9c2VsZi5jaXJjdWxhdGluZ191bml0cyAqIHNlbGYudW5pdF92YWx1ZSwKICAgIC8vICAgICBub21pbmFsX3JhdGVfYnBzPWFyYzQuVUludDE2KDApLCAgIyBUT0RPOiBBZGQgaW50ZXJlc3QgcmF0ZQogICAgLy8gICAgIG5vbWluYWxfYWNjcnVlZD1VSW50NjQoMCksCiAgICAvLyApCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDAwMDI0OTUwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvdXBvbi5weToxNS0yOAogICAgLy8gYXJjNC5lbWl0KAogICAgLy8gICAgIEV2ZW50KAogICAgLy8gICAgICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICAgICAgdHlwZT1hcmM0LlVJbnQ4KGVudW1zLkVWVF9UWVBFX0lQKSwKICAgIC8vICAgICAgICAgdHlwZV9uYW1lPVN0cmluZygiSVAiKSwKICAgIC8vICAgICAgICAgdGltZT1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICAgICAgcGF5b2ZmPXBheW9mZiwKICAgIC8vICAgICAgICAgY3VycmVuY3lfaWQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQuaWQsCiAgICAvLyAgICAgICAgIGN1cnJlbmN5X3VuaXQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQudW5pdF9uYW1lLAogICAgLy8gICAgICAgICBub21pbmFsX3ZhbHVlPXNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKiBzZWxmLnVuaXRfdmFsdWUsCiAgICAvLyAgICAgICAgIG5vbWluYWxfcmF0ZV9icHM9YXJjNC5VSW50MTYoMCksICAjIFRPRE86IEFkZCBpbnRlcmVzdCByYXRlCiAgICAvLyAgICAgICAgIG5vbWluYWxfYWNjcnVlZD1VSW50NjQoMCksCiAgICAvLyAgICAgKQogICAgLy8gKQogICAgYnl0ZWMgMzYgLy8gbWV0aG9kICJFdmVudCh1aW50NjQsdWludDgsc3RyaW5nLHVpbnQ2NCx1aW50NjQsdWludDY0LGJ5dGVbXSx1aW50NjQsdWludDE2LHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvdXBvbi5weTo3MAogICAgLy8gdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvdXBvbi5weTo2OC03MgogICAgLy8gcmV0dXJuIHR5cC5QYXltZW50UmVzdWx0KAogICAgLy8gICAgIGFtb3VudD1wYXltZW50X2Ftb3VudCwKICAgIC8vICAgICB0aW1lc3RhbXA9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgY29udGV4dD1wYXltZW50X2luZm8sICAjIFRPRE86IEFkZCBpbmZvIG9uIGZhaWxlZCBwYXltZW50CiAgICAvLyApCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyA0CiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgYnl0ZWMgMzcgLy8gMHgwMDEyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvdXBvbi5weTozMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpwYXlfY291cG9uX2Vsc2VfYm9keUAzOgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvdXBvbi5weTo2My02NAogICAgLy8gIyBBY2NvdW50cyBzdXNwZW5kZWQgb3Igbm90IG9wdGVkIGluIGF0IHRoZSB0aW1lIG9mIHBheW1lbnRzIG11c3Qgbm90IHN0YWxsIHRoZSBELUFTQQogICAgLy8gcGF5bWVudF9hbW91bnQgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMQogICAgYiBwYXlfY291cG9uX2FmdGVyX2lmX2Vsc2VANAoKCi8vIG1vZHVsZXMucGF5bWVudF9hZ2VudC5wcmluY2lwYWwuUHJpbmNpcGFsUGF5bWVudEFnZW50TWl4aW4ucGF5X3ByaW5jaXBhbFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnBheV9wcmluY2lwYWw6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvcHJpbmNpcGFsLnB5OjMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBlbm0uU1RBVFVTX0FDVElWRQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDEwMAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXMvcGFtLnB5OjE2LTE3CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgcmVzdHJpY3QgY2FsbGVyIGF1dGhvcml6YXRpb24KICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1c19pc19hY3RpdmUoKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjdHVzL3BhbS5weToxOAogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzL3BhbS5weToxOQogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWN0dXMvcGFtLnB5OjIxCiAgICAvLyB1bml0cyA9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIGludGNfMiAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvYWN0dXMvcGFtLnB5OjIyCiAgICAvLyBhc3NlcnQgdW5pdHMgPiAwLCBlcnIuTk9fVU5JVFMKICAgIGFzc2VydCAvLyBObyBELUFTQSB1bml0cwogICAgLy8gbW9kdWxlcy9hY3R1cy9wYW0ucHk6MjMKICAgIC8vIGFzc2VydCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLm1hdHVyaXR5X2RhdGUsIGVyci5OT1RfTUFUVVJFCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgbWF0dXJlCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo3OAogICAgLy8gc2VsZi5jb3VudF9kdWVfY291cG9ucygpCiAgICBjYWxsc3ViIGNvdW50X2R1ZV9jb3Vwb25zCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo3Ni03OQogICAgLy8gIyBQcmluY2lwYWwgcGF5bWVudCBpcyBmb3JiaWRkZW4gaW4gY2FzZSBvZiBwZW5kaW5nIGNvdXBvbiBwYXltZW50cwogICAgLy8gYXNzZXJ0IHNlbGYuYWxsX2R1ZV9jb3Vwb25zX3BhaWQoCiAgICAvLyAgICAgc2VsZi5jb3VudF9kdWVfY291cG9ucygpCiAgICAvLyApLCBlcnIuUEVORElOR19DT1VQT05fUEFZTUVOVAogICAgY2FsbHN1YiBhbGxfZHVlX2NvdXBvbnNfcGFpZAogICAgYXNzZXJ0IC8vIFBlbmRpbmcgZHVlIGNvdXBvbiBwYXltZW50CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo4MAogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudF90b3RhbF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MpCiAgICBkdXAKICAgIGNhbGxzdWIgYWNjb3VudF90b3RhbF91bml0c192YWx1ZQogICAgc3dhcAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L3ByaW5jaXBhbC5weTo1MwogICAgLy8gc2VsZi5hc3NlcnRfcGF5bWVudF9hdXRob3JpemF0aW9uKGhvbGRpbmdfYWRkcmVzcykKICAgIGR1cAogICAgY2FsbHN1YiBhc3NlcnRfcGF5bWVudF9hdXRob3JpemF0aW9uCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvcHJpbmNpcGFsLnB5OjU2CiAgICAvLyBpZiBzZWxmLmlzX3BheW1lbnRfZXhlY3V0YWJsZShob2xkaW5nX2FkZHJlc3MpOgogICAgY2FsbHN1YiBpc19wYXltZW50X2V4ZWN1dGFibGUKICAgIGJ6IHBheV9wcmluY2lwYWxfZWxzZV9ib2R5QDMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9wcmluY2lwYWwucHk6NTctNTgKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gcGF5bWVudCBhZ2VudAogICAgLy8gc2VsZi5hc3NlcnRfZW5vdWdoX2Z1bmRzKHBheW1lbnRfYW1vdW50KQogICAgZHVwbiAyCiAgICBjYWxsc3ViIGFzc2VydF9lbm91Z2hfZnVuZHMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9wcmluY2lwYWwucHk6NTktNjAKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgdGhlIHNhbWUgYXNzZXQgZm9yIGRlbm9taW5hdGlvbiBhbmQgc2V0dGxlbWVudCwgbm8gY29udmVyc2lvbiBuZWVkZWQKICAgIC8vIHNlbGYucGF5KHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcywgcGF5bWVudF9hbW91bnQpCiAgICBkaWcgMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCAzMgogICAgc3dhcAogICAgY2FsbHN1YiBwYXkKCnBheV9wcmluY2lwYWxfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTk5CiAgICAvLyBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIC09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBkaWcgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgaW50Y18yIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLQogICAgYnl0ZWNfMyAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MjAwCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgaXRvYgogICAgc3dhcAogICAgaW50Y18yIC8vIDMyCiAgICBkaWcgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjIwMQogICAgLy8gc2VsZi5lbmRfaWZfbm9fY2lyY3VsYXRpbmdfdW5pdHMoKQogICAgY2FsbHN1YiBlbmRfaWZfbm9fY2lyY3VsYXRpbmdfdW5pdHMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9wcmluY2lwYWwucHk6MTcKICAgIC8vIGNvbnRyYWN0X2lkPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2lkLmlkLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbklECiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvcHJpbmNpcGFsLnB5OjIwCiAgICAvLyB0aW1lPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L3ByaW5jaXBhbC5weToyMgogICAgLy8gY3VycmVuY3lfaWQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQuaWQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvcHJpbmNpcGFsLnB5OjIzCiAgICAvLyBjdXJyZW5jeV91bml0PXNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkLnVuaXRfbmFtZSwKICAgIGR1cAogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVuaXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvcHJpbmNpcGFsLnB5OjI0CiAgICAvLyBub21pbmFsX3ZhbHVlPXNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKiBzZWxmLnVuaXRfdmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAidW5pdF92YWx1ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi51bml0X3ZhbHVlIGV4aXN0cwogICAgKgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L3ByaW5jaXBhbC5weToxNi0yNwogICAgLy8gRXZlbnQoCiAgICAvLyAgICAgY29udHJhY3RfaWQ9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25faWQuaWQsCiAgICAvLyAgICAgdHlwZT1hcmM0LlVJbnQ4KGVudW1zLkVWVF9UWVBFX1BSKSwKICAgIC8vICAgICB0eXBlX25hbWU9U3RyaW5nKCJQUiIpLAogICAgLy8gICAgIHRpbWU9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgcGF5b2ZmPXBheW9mZiwKICAgIC8vICAgICBjdXJyZW5jeV9pZD1zZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZC5pZCwKICAgIC8vICAgICBjdXJyZW5jeV91bml0PXNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkLnVuaXRfbmFtZSwKICAgIC8vICAgICBub21pbmFsX3ZhbHVlPXNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKiBzZWxmLnVuaXRfdmFsdWUsCiAgICAvLyAgICAgbm9taW5hbF9yYXRlX2Jwcz1hcmM0LlVJbnQxNigwKSwKICAgIC8vICAgICBub21pbmFsX2FjY3J1ZWQ9VUludDY0KDApLAogICAgLy8gKQogICAgdW5jb3ZlciA0CiAgICBpdG9iCiAgICBwdXNoYnl0ZXMgMHgwMzAwMzcKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyA1CiAgICBpdG9iCiAgICBzd2FwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZGlnIDMKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICBzd2FwCiAgICBieXRlYyAzNSAvLyAweDAwM2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9wcmluY2lwYWwucHk6MjUKICAgIC8vIG5vbWluYWxfcmF0ZV9icHM9YXJjNC5VSW50MTYoMCksCiAgICBieXRlYyAzMCAvLyAweDAwMDAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9wcmluY2lwYWwucHk6MTYtMjcKICAgIC8vIEV2ZW50KAogICAgLy8gICAgIGNvbnRyYWN0X2lkPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2lkLmlkLAogICAgLy8gICAgIHR5cGU9YXJjNC5VSW50OChlbnVtcy5FVlRfVFlQRV9QUiksCiAgICAvLyAgICAgdHlwZV9uYW1lPVN0cmluZygiUFIiKSwKICAgIC8vICAgICB0aW1lPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gICAgIHBheW9mZj1wYXlvZmYsCiAgICAvLyAgICAgY3VycmVuY3lfaWQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQuaWQsCiAgICAvLyAgICAgY3VycmVuY3lfdW5pdD1zZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZC51bml0X25hbWUsCiAgICAvLyAgICAgbm9taW5hbF92YWx1ZT1zZWxmLmNpcmN1bGF0aW5nX3VuaXRzICogc2VsZi51bml0X3ZhbHVlLAogICAgLy8gICAgIG5vbWluYWxfcmF0ZV9icHM9YXJjNC5VSW50MTYoMCksCiAgICAvLyAgICAgbm9taW5hbF9hY2NydWVkPVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDAwMDI1MDUyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L3ByaW5jaXBhbC5weToxNS0yOAogICAgLy8gYXJjNC5lbWl0KAogICAgLy8gICAgIEV2ZW50KAogICAgLy8gICAgICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICAgICAgdHlwZT1hcmM0LlVJbnQ4KGVudW1zLkVWVF9UWVBFX1BSKSwKICAgIC8vICAgICAgICAgdHlwZV9uYW1lPVN0cmluZygiUFIiKSwKICAgIC8vICAgICAgICAgdGltZT1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICAgICAgcGF5b2ZmPXBheW9mZiwKICAgIC8vICAgICAgICAgY3VycmVuY3lfaWQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQuaWQsCiAgICAvLyAgICAgICAgIGN1cnJlbmN5X3VuaXQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQudW5pdF9uYW1lLAogICAgLy8gICAgICAgICBub21pbmFsX3ZhbHVlPXNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKiBzZWxmLnVuaXRfdmFsdWUsCiAgICAvLyAgICAgICAgIG5vbWluYWxfcmF0ZV9icHM9YXJjNC5VSW50MTYoMCksCiAgICAvLyAgICAgICAgIG5vbWluYWxfYWNjcnVlZD1VSW50NjQoMCksCiAgICAvLyAgICAgKQogICAgLy8gKQogICAgYnl0ZWMgMzYgLy8gbWV0aG9kICJFdmVudCh1aW50NjQsdWludDgsc3RyaW5nLHVpbnQ2NCx1aW50NjQsdWludDY0LGJ5dGVbXSx1aW50NjQsdWludDE2LHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L3ByaW5jaXBhbC5weTo2OQogICAgLy8gdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L3ByaW5jaXBhbC5weTo2Ny03MQogICAgLy8gcmV0dXJuIHR5cC5QYXltZW50UmVzdWx0KAogICAgLy8gICAgIGFtb3VudD1wYXltZW50X2Ftb3VudCwKICAgIC8vICAgICB0aW1lc3RhbXA9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgY29udGV4dD1wYXltZW50X2luZm8sICAjIFRPRE86IEFkZCBpbmZvIG9uIGZhaWxlZCBwYXltZW50CiAgICAvLyApCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyAzCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgYnl0ZWMgMzcgLy8gMHgwMDEyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L3ByaW5jaXBhbC5weTozMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpwYXlfcHJpbmNpcGFsX2Vsc2VfYm9keUAzOgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L3ByaW5jaXBhbC5weTo2Mi02MwogICAgLy8gIyBBY2NvdW50cyBzdXNwZW5kZWQgb3Igbm90IG9wdGVkIGluIGF0IHRoZSB0aW1lIG9mIHBheW1lbnRzIG11c3Qgbm90IHN0YWxsIHRoZSBELUFTQQogICAgLy8gcGF5bWVudF9hbW91bnQgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMQogICAgYiBwYXlfcHJpbmNpcGFsX2FmdGVyX2lmX2Vsc2VANAoKCi8vIG1vZHVsZXMudHJhbnNmZXJfYWdlbnQuY291cG9uLkNvdXBvblRyYW5zZmVyQWdlbnRNaXhpbi5hc3NldF90cmFuc2Zlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFzc2V0X3RyYW5zZmVyOgogICAgaW50Y18wIC8vIDAKICAgIGR1cG4gMgogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQvY291cG9uLnB5OjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGVubS5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgMTAwCiAgICA9PQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTUzLTE1OAogICAgLy8gc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCkKICAgIC8vIGFuZCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyBhbmQgKAogICAgLy8gICAgIG5vdCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICAvLyAgICAgb3IgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICAvLyApCiAgICBieiBhc3NldF90cmFuc2Zlcl9ib29sX2ZhbHNlQDYKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE1NAogICAgLy8gYW5kIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOCAvLyAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTUzLTE1OAogICAgLy8gc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCkKICAgIC8vIGFuZCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyBhbmQgKAogICAgLy8gICAgIG5vdCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICAvLyAgICAgb3IgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICAvLyApCiAgICBieiBhc3NldF90cmFuc2Zlcl9ib29sX2ZhbHNlQDYKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE1NgogICAgLy8gbm90IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNTYtMTU3CiAgICAvLyBub3Qgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgLy8gb3IgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICBieiBhc3NldF90cmFuc2Zlcl9ib29sX3RydWVANQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTU3CiAgICAvLyBvciBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICA8CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNTYtMTU3CiAgICAvLyBub3Qgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgLy8gb3IgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICBieiBhc3NldF90cmFuc2Zlcl9ib29sX2ZhbHNlQDYKCmFzc2V0X3RyYW5zZmVyX2Jvb2xfdHJ1ZUA1OgogICAgaW50Y18xIC8vIDEKCmFzc2V0X3RyYW5zZmVyX2Jvb2xfbWVyZ2VANzoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE1Mi0xNTkKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCkKICAgIC8vICAgICBhbmQgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIGFuZCAoCiAgICAvLyAgICAgICAgIG5vdCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICAvLyAgICAgICAgIG9yIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDwgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgLy8gICAgICkKICAgIC8vICksIGVyci5TRUNPTkRBUllfTUFSS0VUX0NMT1NFRAogICAgYXNzZXJ0IC8vIFNlY29uZGFyeSBtYXJrZXQgaXMgY2xvc2VkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNjktMTcxCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gZ3JhbnRzIHRyYW5zZmVyIHJpZ2h0IHRvIEQtQVNBIG93bmVycy4gT3RoZXIgaW1wbGVtZW50YXRpb25zIG1heSByZWxheSBvbiBvdGhlcgogICAgLy8gIyByb2xlcywgZXh0ZXJuYWwgQXBwcyB0aHJvdWdoIEMyQyBjYWxscyAoZS5nLiwgYW4gb3JkZXIgYm9vayksIG9yIG9mZi1jaGFpbiB0cmFuc2ZlciBhZ2VudHMuCiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBzZW5kZXJfaG9sZGluZ19hZGRyZXNzLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNzIKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTczCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozMQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgOQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGRpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDEwCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE3NgogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBkaWcgMwogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNzcKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBkaWcgMQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxOTAKICAgIC8vIGFzc2VydCBzZW5kZXJfaG9sZGluZ19hZGRyZXNzICE9IHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcywgZXJyLlNFTEZfVFJBTlNGRVIKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICAhPQogICAgYXNzZXJ0IC8vIFNlbmRlciBhbmQgcmVjZWl2ZXIgbXVzdCBiZSBkaWZmZXJlbnQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE5MQogICAgLy8gYXNzZXJ0IHVuaXRzID4gMCwgZXJyLk5VTExfVFJBTlNGRVIKICAgIGRpZyAyCiAgICBkdXAKICAgIGFzc2VydCAvLyBUcmFuc2ZlciB1bml0cyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxOTIKICAgIC8vIGFzc2VydCB1bml0cyA8PSBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMsIGVyci5PVkVSX1RSQU5TRkVSCiAgICB1bmNvdmVyIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBkdXAKICAgIGludGNfMiAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIHVuY292ZXIgMgogICAgPj0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgc2VuZGVyIHVuaXRzIHRvIHRyYW5zZmVyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NjMKICAgIC8vIHNlbmRlcl91bml0X3ZhbHVlID0gc2VsZi5hY2NvdW50W3NlbmRlcl0udW5pdF92YWx1ZQogICAgZXh0cmFjdCA0MCA4CiAgICBidXJ5IDkKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo2NAogICAgLy8gaWYgc2VsZi5hY2NvdW50W3JlY2VpdmVyXS51bml0cyA+IFVJbnQ2NCgwKToKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzIgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBieiBhc3NldF90cmFuc2Zlcl9lbHNlX2JvZHlAOQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjU4CiAgICAvLyBzZWxmLmFjY291bnRbc2VuZGVyXS51bml0X3ZhbHVlID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0udW5pdF92YWx1ZQogICAgZGlnIDYKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDYKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo1OC01OQogICAgLy8gc2VsZi5hY2NvdW50W3NlbmRlcl0udW5pdF92YWx1ZSA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnVuaXRfdmFsdWUKICAgIC8vIGFuZCBzZWxmLmFjY291bnRbc2VuZGVyXS5wYWlkX2NvdXBvbnMgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS5wYWlkX2NvdXBvbnMKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VAMjAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo1OQogICAgLy8gYW5kIHNlbGYuYWNjb3VudFtzZW5kZXJdLnBhaWRfY291cG9ucyA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnBhaWRfY291cG9ucwogICAgZGlnIDYKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQ4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDYKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQ4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo1OC01OQogICAgLy8gc2VsZi5hY2NvdW50W3NlbmRlcl0udW5pdF92YWx1ZSA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnVuaXRfdmFsdWUKICAgIC8vIGFuZCBzZWxmLmFjY291bnRbc2VuZGVyXS5wYWlkX2NvdXBvbnMgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS5wYWlkX2NvdXBvbnMKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VAMjAKICAgIGludGNfMSAvLyAxCgphc3NldF90cmFuc2Zlcl9ib29sX21lcmdlQDIxOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjU3LTYwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtzZW5kZXJdLnVuaXRfdmFsdWUgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS51bml0X3ZhbHVlCiAgICAvLyAgICAgYW5kIHNlbGYuYWNjb3VudFtzZW5kZXJdLnBhaWRfY291cG9ucyA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnBhaWRfY291cG9ucwogICAgLy8gKSwgZXJyLk5PTl9GVU5HSUJMRV9VTklUUwogICAgYXNzZXJ0IC8vIFNlbmRlciBhbmQgcmVjZWl2ZXIgdW5pdHMgYXJlIG5vdCBmdW5naWJsZQoKYXNzZXRfdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQvY291cG9uLnB5OjQ2LTQ3CiAgICAvLyAjIFRyYW5zZmVycmVkIHVuaXRzIHZhbHVlIChtdXN0IGJlIGNvbXB1dGVkIGJlZm9yZSB0aGUgdHJhbnNmZXIpCiAgICAvLyBzZW5kZXJfdW5pdF92YWx1ZSA9IHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlCiAgICBkaWcgNgogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCA0MAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgNQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NjktNzAKICAgIC8vICMgVHJhbnNmZXIgaXMgZm9yYmlkZGVuIGluIGNhc2Ugb2YgcGVuZGluZyBjb3Vwb24gcGF5bWVudHMKICAgIC8vIGR1ZV9jb3Vwb25zID0gc2VsZi5jb3VudF9kdWVfY291cG9ucygpCiAgICBjYWxsc3ViIGNvdW50X2R1ZV9jb3Vwb25zCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo3MQogICAgLy8gc2VsZi5hc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudChzZW5kZXJfaG9sZGluZ19hZGRyZXNzLCBkdWVfY291cG9ucykKICAgIGRpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGRpZyAxCiAgICBjYWxsc3ViIGFzc2VydF9ub19wZW5kaW5nX2NvdXBvbl9wYXltZW50CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo3MgogICAgLy8gcmV0dXJuIHNlbGYuYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQoc2VuZGVyX2hvbGRpbmdfYWRkcmVzcywgdW5pdHMsIGR1ZV9jb3Vwb25zKQogICAgc3dhcAogICAgZGlnIDMKICAgIGR1cAogICAgY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIGFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50CiAgICBidXJ5IDcKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3MQogICAgLy8gYXNzZXJ0IHVuaXRzIDw9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLCBlcnIuT1ZFUl9UUkFOU0ZFUgogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzIgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAyCiAgICA8PQogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCBzZW5kZXIgdW5pdHMgdG8gdHJhbnNmZXIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3MgogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMgLT0gdW5pdHMKICAgIHN3YXAKICAgIC0KICAgIGl0b2IKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gMzIKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo1MgogICAgLy8gaWYgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPT0gVUludDY0KDApOgogICAgYm94X2dldAogICAgcG9wCiAgICBpbnRjXzIgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBibnogYXNzZXRfdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAxNgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjUzCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgaXRvYgogICAgZGlnIDcKICAgIGR1cAogICAgY292ZXIgMgogICAgcHVzaGludCA0MAogICAgZGlnIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NTQKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucyA9IFVJbnQ2NCgwKQogICAgcHVzaGludCA0OAogICAgc3dhcAogICAgYm94X3JlcGxhY2UKCmFzc2V0X3RyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMTY6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzYKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzICs9IHVuaXRzCiAgICBkaWcgNQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgaW50Y18yIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgKwogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBpbnRjXzIgLy8gMzIKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQvY291cG9uLnB5OjUzCiAgICAvLyByZXR1cm4gdW5pdHMgKiBzZW5kZXJfdW5pdF92YWx1ZSArIGFjY3J1ZWRfaW50ZXJlc3QKICAgIGRpZyA0CiAgICAqCiAgICBkaWcgNQogICAgKwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC9jb3Vwb24ucHk6OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgphc3NldF90cmFuc2Zlcl9ib29sX2ZhbHNlQDIwOgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXRfdHJhbnNmZXJfYm9vbF9tZXJnZUAyMQoKYXNzZXRfdHJhbnNmZXJfZWxzZV9ib2R5QDk6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NjcKICAgIC8vIHNlbGYuYWNjb3VudFtyZWNlaXZlcl0udW5pdF92YWx1ZSA9IHNlbmRlcl91bml0X3ZhbHVlCiAgICBkaWcgNQogICAgZHVwCiAgICBwdXNoaW50IDQwCiAgICBkaWcgMTAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NjgKICAgIC8vIHNlbGYuYWNjb3VudFtyZWNlaXZlcl0ucGFpZF9jb3Vwb25zID0gc2VsZi5hY2NvdW50W3NlbmRlcl0ucGFpZF9jb3Vwb25zCiAgICBkaWcgNwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDggOAogICAgcHVzaGludCA0OAogICAgc3dhcAogICAgYm94X3JlcGxhY2UKICAgIGIgYXNzZXRfdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAxMAoKYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUA2OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXRfdHJhbnNmZXJfYm9vbF9tZXJnZUA3CgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb21tb24uQ29yZUZpbmFuY2lhbENvbW1vbk1peGluLmFzc2V0X2NyZWF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFzc2V0X2NyZWF0ZToKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI2NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBkaWcgMQogICAgcHVzaGludCAzOAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgdHVwbGUgZW5jb2RpbmcKICAgIGR1cAogICAgcHVzaGludCA0MAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHRhaWwgcG9pbnRlciBhdCBpbmRleCA3IG9mICh1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OFszMl0sKGxlbit1dGY4W10pKQogICAgZGlnIDIKICAgIHN3YXAKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCA0MgogICAgKwogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5Bc3NldE1ldGFkYXRhCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyNzYKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSBhcnJhbmdlcgogICAgYnl0ZWMgOCAvLyAweDUyMzIzMDIzCiAgICB1bmNvdmVyIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyNzcKICAgIC8vIHNlbGYubWV0YWRhdGEgPSBtZXRhZGF0YS5ieXRlcwogICAgYnl0ZWMgMjUgLy8gIm1ldGFkYXRhIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI2NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb21tb24uQ29yZUZpbmFuY2lhbENvbW1vbk1peGluLmFzc2V0X3VwZGF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFzc2V0X3VwZGF0ZToKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI3OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGRpZyAxCiAgICBwdXNoaW50IDM4CiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCB0dXBsZSBlbmNvZGluZwogICAgZHVwCiAgICBwdXNoaW50IDQwCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgdGFpbCBwb2ludGVyIGF0IGluZGV4IDcgb2YgKHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4WzMyXSwobGVuK3V0ZjhbXSkpCiAgICBkaWcgMgogICAgc3dhcAogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDQyCiAgICArCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLkFzc2V0TWV0YWRhdGEKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI4NC0yODcKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBncmFudHMgdGhlIHVwZGF0ZSBwZXJtaXNzaW9ucyB0byB0aGUgQXJyYW5nZXIuCiAgICAvLyAjIE90aGVyIGltcGxlbWVudGF0aW9ucyBtYXkgZGlzYWJsZSBELUFTQSBhcHBsaWNhdGlvbiB1cGRhdGFiaWxpdHkgb3IgY2hhbmdlIGl0cyBhdXRob3JpemF0aW9ucy4KICAgIC8vICMg4pqg77iPIFdBUk5JTkc6IEFwcGxpY2F0aW9uIHVwZGF0ZXMgbXVzdCBiZSBleGVjdXRlZCBWRVJZIGNhcmVmdWxseSwgYXMgdGhleSBtaWdodCBpbnRyb2R1Y2UgYnJlYWtpbmcgY2hhbmdlcy4KICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI4OAogICAgLy8gc2VsZi5tZXRhZGF0YSA9IG1ldGFkYXRhLmJ5dGVzCiAgICBieXRlYyAyNSAvLyAibWV0YWRhdGEiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6Mjc5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb21tb24uQ29yZUZpbmFuY2lhbENvbW1vbk1peGluLnNldF9zZWNvbmRhcnlfdGltZV9ldmVudHNbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzOgogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI5MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIHVuY292ZXIgMgogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8dWludDY0PgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzExCiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjgKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBlbm0uU1RBVFVTX0VOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGludGMgNSAvLyAyMDAKICAgID09CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMTIKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5zdGF0dXNfaXNfZW5kZWQoKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgIQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMTMKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzE1CiAgICAvLyBhc3NlcnQgc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50cy5sZW5ndGggPj0gMSwgZXJyLklOVkFMSURfVElNRV9FVkVOVFNfTEVOR1RICiAgICBkdXAKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBsZW5ndGggaXMgaW52YWxpZAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzE2CiAgICAvLyBpZiBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzLmxlbmd0aCA+IDE6CiAgICBpbnRjXzEgLy8gMQogICAgPgogICAgYnogc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50c19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMxNwogICAgLy8gc2VsZi5hc3NlcnRfdGltZV9ldmVudHNfc29ydGVkKHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHMpCiAgICBkdXAKICAgIGNhbGxzdWIgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZAogICAgYnVyeSAxCgpzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMyMAogICAgLy8gc2VsZi5pc3N1YW5jZV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pc3N1YW5jZV9kYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzIxCiAgICAvLyA8PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzW2NmZy5TRUNPTkRBUllfTUFSS0VUX09QRU5JTkdfREFURV9JRFhdCiAgICBkaWcgMQogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgYnVyeSA0CiAgICBwdXNoaW50IDIKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMjAtMzIxCiAgICAvLyBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIC8vIDw9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbY2ZnLlNFQ09OREFSWV9NQVJLRVRfT1BFTklOR19EQVRFX0lEWF0KICAgIHN3YXAKICAgIGRpZyAxCiAgICA8PQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzE5LTMyMgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIC8vICAgICA8PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzW2NmZy5TRUNPTkRBUllfTUFSS0VUX09QRU5JTkdfREFURV9JRFhdCiAgICAvLyApLCBlcnIuSU5WQUxJRF9TRUNPTkRBUllfT1BFTklOR19EQVRFCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzZWNvbmRhcnkgbWFya2V0IG9wZW5pbmcgZGF0ZQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzIzCiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlID0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIGJ5dGVjIDE4IC8vICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMyMy0zMjUKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgPSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX09QRU5JTkdfREFURV9JRFgKICAgIC8vIF0KICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMjYKICAgIC8vIGlmIHNlbGYubWF0dXJpdHlfZGF0ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJtYXR1cml0eV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hdHVyaXR5X2RhdGUgZXhpc3RzCiAgICBieiBzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzI4CiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJtYXR1cml0eV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hdHVyaXR5X2RhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMjkKICAgIC8vID49IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWF0KICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBkaWcgMwogICAgc3dhcAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMyOC0zMjkKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZQogICAgLy8gPj0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1tjZmcuU0VDT05EQVJZX01BUktFVF9DTE9TVVJFX0RBVEVfSURYXQogICAgc3dhcAogICAgZGlnIDEKICAgID49CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMjctMzMwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYubWF0dXJpdHlfZGF0ZQogICAgLy8gICAgID49IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWF0KICAgIC8vICksIGVyci5JTlZBTElEX1NFQ09OREFSWV9DTE9TVVJFX0RBVEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNlY29uZGFyeSBtYXJrZXQgY2xvc3VyZSBkYXRlCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMzEKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUgPSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgYnl0ZWMgMTEgLy8gInNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzMxLTMzMwogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSA9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gXQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCnNldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzM1CiAgICAvLyBzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZT1zZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE4IC8vICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMzNgogICAgLy8gc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGU9c2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMzQtMzM3CiAgICAvLyByZXR1cm4gdHlwLlNlY29uZGFyeU1hcmtldFNjaGVkdWxlKAogICAgLy8gICAgIHNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlPXNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUsCiAgICAvLyAgICAgc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGU9c2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSwKICAgIC8vICkKICAgIHN3YXAKICAgIGl0b2IKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MjkwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmNvcmVfZmluYW5jaWFsLmNvbW1vbi5Db3JlRmluYW5jaWFsQ29tbW9uTWl4aW4uc2V0X2RlZmF1bHRfc3RhdHVzW3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X2RlZmF1bHRfc3RhdHVzOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzM5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzQKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnRydXN0ZWUsIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyMCAvLyAweDUyMzYzMDIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozNTIKICAgIC8vIHNlbGYuYXNzZXRfZGVmYXVsdGVkID0gZGVmYXVsdGVkCiAgICBieXRlYyAyNCAvLyAiYXNzZXRfZGVmYXVsdGVkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjM1MwogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY29tbW9uLkNvcmVGaW5hbmNpYWxDb21tb25NaXhpbi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnByaW1hcnlfZGlzdHJpYnV0aW9uOgogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozNTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBlbm0uU1RBVFVTX0FDVElWRQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDEwMAogICAgPT0KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE0NS0xNDgKICAgIC8vIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpCiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDUKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE0NgogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNDcKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGJ1cnkgNQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTQ2LTE0NwogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgPD0KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE0Ni0xNDgKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VANQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTQ4CiAgICAvLyA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjcgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNDctMTQ4CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgZGlnIDMKICAgID4KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE0Ni0xNDgKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VANQogICAgaW50Y18xIC8vIDEKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfbWVyZ2VANjoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE0NC0xNDkKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCkKICAgIC8vICAgICBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIC8vICksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TRUQKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBjbG9zZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo3MQogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYucHJpbWFyeV9kZWFsZXIsIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyMSAvLyAweDUyMzUzMDIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozODMKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6Mzg0CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjM4NQogICAgLy8gYXNzZXJ0IHVuaXRzID4gMCwgZXJyLlpFUk9fVU5JVFMKICAgIGRpZyAxCiAgICBkdXAKICAgIGFzc2VydCAvLyBDYW4gbm90IGRpc3RyaWJ1dGUgemVybyB1bml0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6Mzg2CiAgICAvLyBhc3NlcnQgc2VsZi5jaXJjdWxhdGluZ191bml0cyArIHVuaXRzIDw9IHNlbGYudG90YWxfdW5pdHMsIGVyci5PVkVSX0RJU1RSSUJVVElPTgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgZGlnIDEKICAgICsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNSAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICBkaWcgMQogICAgPj0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgcmVtYWluaW5nIEQtQVNBIHVuaXRzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozODgKICAgIC8vIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKz0gdW5pdHMKICAgIGJ5dGVjXzMgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozODkKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzICs9IHVuaXRzCiAgICBkaWcgMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMiAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIHVuY292ZXIgMgogICAgKwogICAgaXRvYgogICAgZGlnIDIKICAgIGludGNfMiAvLyAzMgogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzkwCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlID0gc2VsZi51bml0X3ZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAidW5pdF92YWx1ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi51bml0X3ZhbHVlIGV4aXN0cwogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBwdXNoaW50IDQwCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozOTEKICAgIC8vIHJldHVybiBzZWxmLnRvdGFsX3VuaXRzIC0gc2VsZi5jaXJjdWxhdGluZ191bml0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIHN3YXAKICAgIC0KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjM1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDU6CiAgICBpbnRjXzAgLy8gMAogICAgYiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX21lcmdlQDYKCgovLyBtb2R1bGVzLmNvcmVfZmluYW5jaWFsLmNvbW1vbi5Db3JlRmluYW5jaWFsQ29tbW9uTWl4aW4uZ2V0X2Fzc2V0X2luZm9bcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXNzZXRfaW5mbzoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQwMwogICAgLy8gcGVyZm9ybWFuY2UgPSBVSW50NjQoY3N0LlBSRl9QRVJGT1JNQU5UKQogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQwNAogICAgLy8gaWYgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPiBzZWxmLm1hdHVyaXR5X2RhdGUgPiAwOgogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjb3ZlciAzCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgPgogICAgYnogZ2V0X2Fzc2V0X2luZm9fYWZ0ZXJfaWZfZWxzZUA0CiAgICBkdXAKICAgIGJ6IGdldF9hc3NldF9pbmZvX2FmdGVyX2lmX2Vsc2VANAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDA1CiAgICAvLyBwZXJmb3JtYW5jZSA9IFVJbnQ2NChjc3QuUFJGX01BVFVSRUQpCiAgICBwdXNoaW50IDQKICAgIGJ1cnkgMgoKZ2V0X2Fzc2V0X2luZm9fYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDA2LTQwNwogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBubyBncmFjZSBvciBkZWxpbnF1ZW5jeSBwZXJpb2RzCiAgICAvLyBpZiBzZWxmLmFzc2V0X2RlZmF1bHRlZDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNCAvLyAiYXNzZXRfZGVmYXVsdGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2RlZmF1bHRlZCBleGlzdHMKICAgIGJ6IGdldF9hc3NldF9pbmZvX2FmdGVyX2lmX2Vsc2VANgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDA4CiAgICAvLyBwZXJmb3JtYW5jZSA9IFVJbnQ2NChjc3QuUFJGX0RFRkFVTFRFRCkKICAgIHB1c2hpbnQgMwogICAgYnVyeSAyCgpnZXRfYXNzZXRfaW5mb19hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MTEKICAgIC8vIGRlbm9taW5hdGlvbl9hc3NldF9pZD1zZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZC5pZCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQxMgogICAgLy8gc2V0dGxlbWVudF9hc3NldF9pZD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuaWQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjQ1CiAgICAvLyByZXR1cm4gc2VsZi5jaXJjdWxhdGluZ191bml0cyAqIHNlbGYudW5pdF92YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gInVuaXRfdmFsdWUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudW5pdF92YWx1ZSBleGlzdHMKICAgIGR1cDIKICAgICoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQxNQogICAgLy8gZGF5X2NvdW50X2NvbnZlbnRpb249YXJjNC5VSW50OChzZWxmLmRheV9jb3VudF9jb252ZW50aW9uKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gZXhpc3RzCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgaW50Y18zIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MTYKICAgIC8vIHByaW5jaXBhbF9kaXNjb3VudD1hcmM0LlVJbnQxNihzZWxmLnByaW5jaXBhbF9kaXNjb3VudCksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjYgLy8gInByaW5jaXBhbF9kaXNjb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmluY2lwYWxfZGlzY291bnQgZXhpc3RzCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgcHVzaGludCAxNgogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA2IDIKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQxNwogICAgLy8gaW50ZXJlc3RfcmF0ZT1hcmM0LlVJbnQxNihzZWxmLmludGVyZXN0X3JhdGUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDMzIC8vICJpbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X3JhdGUgZXhpc3RzCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgcHVzaGludCAxNgogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA2IDIKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQxOAogICAgLy8gdG90YWxfc3VwcGx5PXNlbGYudG90YWxfdW5pdHMsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDIwCiAgICAvLyBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGU9c2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MjEKICAgIC8vIHByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZT1zZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNyAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQyMgogICAgLy8gaXNzdWFuY2VfZGF0ZT1zZWxmLmlzc3VhbmNlX2RhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pc3N1YW5jZV9kYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDIzCiAgICAvLyBtYXR1cml0eV9kYXRlPXNlbGYubWF0dXJpdHlfZGF0ZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJtYXR1cml0eV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hdHVyaXR5X2RhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MjQKICAgIC8vIHN1c3BlbmRlZD1zZWxmLmFzc2V0X3N1c3BlbmRlZCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMyAvLyAiYXNzZXRfc3VzcGVuZGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X3N1c3BlbmRlZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQyNQogICAgLy8gcGVyZm9ybWFuY2U9YXJjNC5VSW50OChwZXJmb3JtYW5jZSksCiAgICBkaWcgMTUKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzMgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQxMC00MjYKICAgIC8vIHJldHVybiB0eXAuQXNzZXRJbmZvKAogICAgLy8gICAgIGRlbm9taW5hdGlvbl9hc3NldF9pZD1zZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZC5pZCwKICAgIC8vICAgICBzZXR0bGVtZW50X2Fzc2V0X2lkPXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5pZCwKICAgIC8vICAgICBvdXRzdGFuZGluZ19wcmluY2lwYWw9c2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwoKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPXNlbGYudW5pdF92YWx1ZSwKICAgIC8vICAgICBkYXlfY291bnRfY29udmVudGlvbj1hcmM0LlVJbnQ4KHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24pLAogICAgLy8gICAgIHByaW5jaXBhbF9kaXNjb3VudD1hcmM0LlVJbnQxNihzZWxmLnByaW5jaXBhbF9kaXNjb3VudCksCiAgICAvLyAgICAgaW50ZXJlc3RfcmF0ZT1hcmM0LlVJbnQxNihzZWxmLmludGVyZXN0X3JhdGUpLAogICAgLy8gICAgIHRvdGFsX3N1cHBseT1zZWxmLnRvdGFsX3VuaXRzLAogICAgLy8gICAgIGNpcmN1bGF0aW5nX3N1cHBseT1zZWxmLmNpcmN1bGF0aW5nX3VuaXRzLAogICAgLy8gICAgIHByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZT1zZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSwKICAgIC8vICAgICBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGU9c2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUsCiAgICAvLyAgICAgaXNzdWFuY2VfZGF0ZT1zZWxmLmlzc3VhbmNlX2RhdGUsCiAgICAvLyAgICAgbWF0dXJpdHlfZGF0ZT1zZWxmLm1hdHVyaXR5X2RhdGUsCiAgICAvLyAgICAgc3VzcGVuZGVkPXNlbGYuYXNzZXRfc3VzcGVuZGVkLAogICAgLy8gICAgIHBlcmZvcm1hbmNlPWFyYzQuVUludDgocGVyZm9ybWFuY2UpLAogICAgLy8gKQogICAgdW5jb3ZlciAxNAogICAgaXRvYgogICAgdW5jb3ZlciAxNAogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDExCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTEKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMAogICAgY29uY2F0CiAgICB1bmNvdmVyIDkKICAgIGNvbmNhdAogICAgdW5jb3ZlciA4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDcKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGJ5dGVjIDMxIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDQKICAgIHNldGJpdAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjM5MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb21tb24uQ29yZUZpbmFuY2lhbENvbW1vbk1peGluLmdldF90aW1lX2V2ZW50c1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF90aW1lX2V2ZW50czoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQzNgogICAgLy8gdGltZV9ldmVudHMgPSB0eXAuVGltZUV2ZW50cygpCiAgICBieXRlYyAzMCAvLyAweDAwMDAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGVubS5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgMTAwCiAgICA9PQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDM3CiAgICAvLyBpZiBzZWxmLnN0YXR1c19pc19hY3RpdmUoKToKICAgIGJ6IGdldF90aW1lX2V2ZW50c19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQzOAogICAgLy8gdGltZV9ldmVudHMgPSBzZWxmLnRpbWVfZXZlbnRzLnZhbHVlLmNvcHkoKQogICAgYnl0ZWMgMTIgLy8gMHg3NDY5NmQ2NTQ1NzY2NTZlNzQ3MwogICAgYm94X2dldAogICAgc3dhcAogICAgYnVyeSAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50aW1lX2V2ZW50cyBleGlzdHMKCmdldF90aW1lX2V2ZW50c19hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmNvcmVfZmluYW5jaWFsLmNvbW1vbi5Db3JlRmluYW5jaWFsQ29tbW9uTWl4aW4uZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGVbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZToKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQ1MAogICAgLy8gKHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUsIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTggLy8gInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQ0OS00NTEKICAgIC8vIHJldHVybiB0eXAuVGltZUV2ZW50cygKICAgIC8vICAgICAoc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSwgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSkKICAgIC8vICkKICAgIHN3YXAKICAgIGl0b2IKICAgIHB1c2hieXRlcyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0NDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY29tbW9uLkNvcmVGaW5hbmNpYWxDb21tb25NaXhpbi5nZXRfYXNzZXRfbWV0YWRhdGFbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXNzZXRfbWV0YWRhdGE6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0NjIKICAgIC8vIHJldHVybiB0eXAuQXNzZXRNZXRhZGF0YS5mcm9tX2J5dGVzKHNlbGYubWV0YWRhdGEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjUgLy8gIm1ldGFkYXRhIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1ldGFkYXRhIGV4aXN0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDUzCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5hY2NvdW50X2dvdl9zdXNwZW5zaW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF9nb3Zfc3VzcGVuc2lvbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzcKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDEzIC8vIDB4NTIzNzMwMjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozMQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTE0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGR1cAogICAgcHVzaGludCA1NgogICAgaW50Y18xIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIHB1c2hpbnQgNTYKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTE1CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF9vcGVuW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF9vcGVuOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjY4CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hY2NvdW50X21hbmFnZXIsIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAxNCAvLyAweDUyMzQzMDIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjgKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBlbm0uU1RBVFVTX0VOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGludGMgNSAvLyAyMDAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTM5CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuc3RhdHVzX2lzX2VuZGVkKCksIGVyci5VTkFVVEhPUklaRUQKICAgICEKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE0MAogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTQxCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNDIKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNDYKICAgIC8vIHVuaXRzPVVJbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTQ0LTE1MAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSB0eXAuQWNjb3VudEluZm8oCiAgICAvLyAgICAgcGF5bWVudF9hZGRyZXNzPXBheW1lbnRfYWRkcmVzcywKICAgIC8vICAgICB1bml0cz1VSW50NjQoMCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1VSW50NjQoMCksCiAgICAvLyAgICAgcGFpZF9jb3Vwb25zPVVJbnQ2NCgwKSwKICAgIC8vICAgICBzdXNwZW5kZWQ9RmFsc2UsCiAgICAvLyApCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgMzEgLy8gMHgwMAogICAgY29uY2F0CiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTUxCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfY2xvc2Vbcm91dGluZ10oKSAtPiB2b2lkOgphY2NvdW50X2Nsb3NlOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2OAogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMTQgLy8gMHg1MjM0MzAyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE3MQogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNzQKICAgIC8vIGNsb3NlZF91bml0cyA9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzCiAgICBkdXAKICAgIGJveF9nZXQKICAgIHBvcAogICAgaW50Y18yIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE3NQogICAgLy8gZGVsIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdCiAgICBzd2FwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNzYKICAgIC8vIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgLT0gY2xvc2VkX3VuaXRzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBkaWcgMQogICAgLQogICAgYnl0ZWNfMyAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE3NwogICAgLy8gc2VsZi5lbmRfaWZfbm9fY2lyY3VsYXRpbmdfdW5pdHMoKQogICAgY2FsbHN1YiBlbmRfaWZfbm9fY2lyY3VsYXRpbmdfdW5pdHMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNzgKICAgIC8vIHJldHVybiBjbG9zZWRfdW5pdHMsIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTUzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHN3YXAKICAgIGl0b2IKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzczoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMDAKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcywgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgZGlnIDIKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMDEKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIwMgogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIwNAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzID0gcGF5bWVudF9hZGRyZXNzCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIwNQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5hY2NvdW50X2dldF9pbmZvW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF9nZXRfaW5mbzoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMjIKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjA3CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3JvdGF0ZV9hcnJhbmdlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfcm90YXRlX2FycmFuZ2VyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTgKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTkKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSBuZXdfYXJyYW5nZXIKICAgIGJ5dGVjIDggLy8gMHg1MjMyMzAyMwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNjAKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19zZXRfb3BfZGFlbW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19zZXRfb3BfZGFlbW9uOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzMKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzQKICAgIC8vIHNlbGYub3BfZGFlbW9uLnZhbHVlID0gYWRkcmVzcwogICAgYnl0ZWMgMjIgLy8gMHg1MjMyMzUyMwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzUKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19hc3NpZ25fcm9sZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfYXNzaWduX3JvbGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTc3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxOTkKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDAKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwMQogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDEKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKToKICAgIHB1c2hpbnQgMjAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwMgogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgOCAvLyAweDUyMzIzMDIzCiAgICBkaWcgMwogICAgYXBwX2dsb2JhbF9wdXQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fdXBzZXJ0X3JvbGVAMTQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAzCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA1CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDQwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDYKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDE0IC8vIDB4NTIzNDMwMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwNwogICAgLy8gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDIKICAgIC8vIHNlbGYuX3Vwc2VydF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgY29uZmlnKQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3Vwc2VydF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDkKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKToKICAgIGR1cAogICAgcHVzaGludCA1MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTEwCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIxIC8vIDB4NTIzNTMwMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMQogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcyhjb25maWcpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwMgogICAgLy8gc2VsZi5fdXBzZXJ0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCBjb25maWcpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fdXBzZXJ0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMwogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNjAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNAogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIwIC8vIDB4NTIzNjMwMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNQogICAgLy8gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZykKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAyCiAgICAvLyBzZWxmLl91cHNlcnRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIGNvbmZpZykKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl91cHNlcnRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE3CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE4CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAxMyAvLyAweDUyMzczMDIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTkKICAgIC8vIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZykKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAyCiAgICAvLyBzZWxmLl91cHNlcnRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIGNvbmZpZykKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl91cHNlcnRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMQogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKToKICAgIGR1cAogICAgcHVzaGludCA4MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fdXBzZXJ0X3JvbGVAMTQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjIKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuaW50ZXJlc3Rfb3JhY2xlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDMyIC8vIDB4NTIzODMwMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMwogICAgLy8gc2VsZi5pbnRlcmVzdF9vcmFjbGVbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl91cHNlcnRfcm9sZUAxNAoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfcmV2b2tlX3JvbGVbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3Jldm9rZV9yb2xlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNAogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNQogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI2CiAgICAvLyBzZWxmLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpKQogICAgYnRvaQogICAgZHVwbiAyCiAgICBjYWxsc3ViIF9hc3NlcnRfdmFsaWRfcm9sZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyNgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgIT0gVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwgZXJyLklOVkFMSURfUk9MRQogICAgZHVwCiAgICBwdXNoaW50IDIwCiAgICAhPQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI3CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI4CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDE0IC8vIDB4NTIzNDMwMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyOQogICAgLy8gZGVsIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjgKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzEKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKToKICAgIGR1cAogICAgcHVzaGludCA1MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMyCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjEgLy8gMHg1MjM1MzAyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMzCiAgICAvLyBkZWwgc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjcKICAgIC8vIHNlbGYuX2RlbGV0ZV9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcykKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM1CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKToKICAgIGR1cAogICAgcHVzaGludCA2MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM2CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMCAvLyAweDUyMzYzMDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzcKICAgIC8vIGRlbCBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI3CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzOQogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKToKICAgIGR1cAogICAgcHVzaGludCA3MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQwCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDEzIC8vIDB4NTIzNzMwMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MQogICAgLy8gZGVsIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNwogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDMKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSk6CiAgICBkdXAKICAgIHB1c2hpbnQgODAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ0CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuaW50ZXJlc3Rfb3JhY2xlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDMyIC8vIDB4NTIzODMwMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NQogICAgLy8gZGVsIHNlbGYuaW50ZXJlc3Rfb3JhY2xlW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nb3ZfYXNzZXRfc3VzcGVuc2lvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ292X2Fzc2V0X3N1c3BlbnNpb246CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QgICMgVE9ETzogVXBkYXRlIHNwZWNzIGFuZCBhZGQgdGVzdAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo3NwogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYXV0aG9yaXR5LCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMTMgLy8gMHg1MjM3MzAyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0NgogICAgLy8gc2VsZi5hc3NldF9zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGJ5dGVjIDIzIC8vICJhc3NldF9zdXNwZW5kZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0NwogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QgICMgVE9ETzogVXBkYXRlIHNwZWNzIGFuZCBhZGQgdGVzdAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X2FycmFuZ2VyW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU3CiAgICAvLyByZXR1cm4gc2VsZi5hcnJhbmdlci52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDggLy8gMHg1MjMyMzAyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYWRkcmVzc19yb2xlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3MwogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hY2NvdW50X21hbmFnZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMTQgLy8gMHg1MjM0MzAyMwogICAgZGlnIDEKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjc0CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnByaW1hcnlfZGVhbGVyLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDIxIC8vIDB4NTIzNTMwMjMKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3NQogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi50cnVzdGVlLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDIwIC8vIDB4NTIzNjMwMjMKICAgIGRpZyAzCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3NgogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIGFkZHJlc3MpLAogICAgYnl0ZWMgMTMgLy8gMHg1MjM3MzAyMwogICAgZGlnIDQKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjc3CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmludGVyZXN0X29yYWNsZSwgYWRkcmVzcyksCiAgICBieXRlYyAzMiAvLyAweDUyMzgzMDIzCiAgICB1bmNvdmVyIDUKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjIDMxIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDYKICAgIHNldGJpdAogICAgaW50Y18xIC8vIDEKICAgIHVuY292ZXIgNQogICAgc2V0Yml0CiAgICBwdXNoaW50IDIKICAgIHVuY292ZXIgNAogICAgc2V0Yml0CiAgICBwdXNoaW50IDMKICAgIHVuY292ZXIgMwogICAgc2V0Yml0CiAgICBwdXNoaW50IDQKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV9jb25maWdbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9yb2xlX2NvbmZpZzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTQKICAgIC8vIHJvbGUgPSByb2xlX2lkLmFzX3VpbnQ2NCgpCiAgICBidG9pCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjk1CiAgICAvLyBzZWxmLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlKQogICAgZHVwCiAgICBjYWxsc3ViIF9hc3NlcnRfdmFsaWRfcm9sZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5NwogICAgLy8gY2FzZSBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpOgogICAgcHVzaGludHMgMjAgNDAgNTAgNjAgNzAgODAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTYtMzI3CiAgICAvLyBtYXRjaCByb2xlOgogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKToKICAgIC8vICAgICAgICAgcmV0dXJuIHR5cC5Sb2xlQ29uZmlnKAogICAgLy8gICAgICAgICAgICAgcm9sZV92YWxpZGl0eV9zdGFydD1VSW50NjQoMCksIHJvbGVfdmFsaWRpdHlfZW5kPVVJbnQ2NCgwKQogICAgLy8gICAgICAgICApCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5hdXRob3JpdHksIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLmludGVyZXN0X29yYWNsZSwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5pbnRlcmVzdF9vcmFjbGVbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgXzoKICAgIC8vICAgICAgICAgb3AuZXJyKGVyci5JTlZBTElEX1JPTEUpCiAgICB1bmNvdmVyIDYKICAgIG1hdGNoIHJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzBAMiByYmFjX2dldF9yb2xlX2NvbmZpZ19zd2l0Y2hfY2FzZV8xQDMgcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfMkA0IHJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzNANSByYmFjX2dldF9yb2xlX2NvbmZpZ19zd2l0Y2hfY2FzZV80QDYgcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfNUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI3CiAgICAvLyBvcC5lcnIoZXJyLklOVkFMSURfUk9MRSkKICAgIGVyciAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgoKcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfNUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMwogICAgLy8gc2VsZi5pbnRlcmVzdF9vcmFjbGUsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMzIgLy8gMHg1MjM4MzAyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMi0zMjQKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLmludGVyZXN0X29yYWNsZSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI1CiAgICAvLyByZXR1cm4gc2VsZi5pbnRlcmVzdF9vcmFjbGVbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCgpyYmFjX2dldF9yb2xlX2NvbmZpZ19hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfY29uZmlnQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzRANjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTgKICAgIC8vIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDEzIC8vIDB4NTIzNzMwMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5hdXRob3JpdHksIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMAogICAgLy8gcmV0dXJuIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfY29uZmlnX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV9jb25maWdAOQoKcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfM0A1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxMwogICAgLy8gc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDIwIC8vIDB4NTIzNjMwMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTItMzE0CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTUKICAgIC8vIHJldHVybiBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV9jb25maWdfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX2NvbmZpZ0A5CgpyYmFjX2dldF9yb2xlX2NvbmZpZ19zd2l0Y2hfY2FzZV8yQDQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA4CiAgICAvLyBzZWxmLnByaW1hcnlfZGVhbGVyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDIxIC8vIDB4NTIzNTMwMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDctMzA5CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEwCiAgICAvLyByZXR1cm4gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX2NvbmZpZ19hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfY29uZmlnQDkKCnJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzFAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDMKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDE0IC8vIDB4NTIzNDMwMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDItMzA0CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwNQogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfY29uZmlnX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV9jb25maWdAOQoKcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfMEAyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5OC0zMDAKICAgIC8vIHJldHVybiB0eXAuUm9sZUNvbmZpZygKICAgIC8vICAgICByb2xlX3ZhbGlkaXR5X3N0YXJ0PVVJbnQ2NCgwKSwgcm9sZV92YWxpZGl0eV9lbmQ9VUludDY0KDApCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfY29uZmlnX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV9jb25maWdAOQoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY291cG9uLkZpeGVkQ291cG9uQ2FzaGZsb3dNaXhpbi5jb3VudF9kdWVfY291cG9ucygpIC0+IHVpbnQ2NDoKY291bnRfZHVlX2NvdXBvbnM6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxMTEKICAgIC8vIGRlZiBjb3VudF9kdWVfY291cG9ucyhzZWxmKSAtPiBVSW50NjQ6CiAgICBwcm90byAwIDEKICAgIHB1c2hieXRlcyAiIgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTEyCiAgICAvLyBjdXJyZW50X3RzID0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGR1cAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTEzCiAgICAvLyBkdWVfY291cG9ucyA9IHNlbGYuZHVlX2NvdXBvbnNfd2F0ZXJtYXJrCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjkgLy8gImR1ZV9jb3Vwb25zX3dhdGVybWFyayIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBjb3ZlciAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kdWVfY291cG9uc193YXRlcm1hcmsgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxMTQKICAgIC8vIGlmIGN1cnJlbnRfdHMgPj0gc2VsZi5tYXR1cml0eV9kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgID49CiAgICBieiBjb3VudF9kdWVfY291cG9uc19lbHNlX2JvZHlAMgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTE1CiAgICAvLyBkdWVfY291cG9ucyA9IHNlbGYudG90YWxfY291cG9ucwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF9jb3Vwb25zIGV4aXN0cwoKY291bnRfZHVlX2NvdXBvbnNfYWZ0ZXJfaWZfZWxzZUA4OgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTI5CiAgICAvLyBzZWxmLmR1ZV9jb3Vwb25zX3dhdGVybWFyayA9IGR1ZV9jb3Vwb25zCiAgICBieXRlYyAyOSAvLyAiZHVlX2NvdXBvbnNfd2F0ZXJtYXJrIgogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjEzMAogICAgLy8gcmV0dXJuIGR1ZV9jb3Vwb25zCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKY291bnRfZHVlX2NvdXBvbnNfZWxzZV9ib2R5QDI6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxMTYKICAgIC8vIGVsaWYgY3VycmVudF90cyA+IHNlbGYuaXNzdWFuY2VfZGF0ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJpc3N1YW5jZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzc3VhbmNlX2RhdGUgZXhpc3RzCiAgICBmcmFtZV9kaWcgMQogICAgPAogICAgYnogY291bnRfZHVlX2NvdXBvbnNfYWZ0ZXJfaWZfZWxzZUA4CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxMTgKICAgIC8vIFVJbnQ2NChmaXhlZF9jZmcuRklSU1RfQ09VUE9OX0RBVEVfSURYKSArIHNlbGYuZHVlX2NvdXBvbnNfd2F0ZXJtYXJrCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjkgLy8gImR1ZV9jb3Vwb25zX3dhdGVybWFyayIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kdWVfY291cG9uc193YXRlcm1hcmsgZXhpc3RzCiAgICBwdXNoaW50IDMKICAgICsKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxMjAKICAgIC8vIGNvdXBvbl9kdWVfZGF0ZSA9IHNlbGYudGltZV9ldmVudHMudmFsdWVbY291cG9uX2lkeF0KICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIGJ5dGVjIDEyIC8vIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMKICAgIHN3YXAKICAgIGludGNfMyAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQoKY291bnRfZHVlX2NvdXBvbnNfd2hpbGVfdG9wQDQ6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxMjEKICAgIC8vIHdoaWxlIGN1cnJlbnRfdHMgPj0gY291cG9uX2R1ZV9kYXRlOgogICAgZnJhbWVfZGlnIDEKICAgIDw9CiAgICBieiBjb3VudF9kdWVfY291cG9uc19hZnRlcl93aGlsZUA2CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxMjMKICAgIC8vIHJlcXVpcmVkX2J1ZGdldD1VSW50NjQoZml4ZWRfY2ZnLk9QX1VQX0NPVVBPTl9EVUVfQ09VTlRJTkcpLAogICAgaW50YyA0IC8vIDI1NQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTI0CiAgICAvLyBmZWVfc291cmNlPU9wVXBGZWVTb3VyY2UuR3JvdXBDcmVkaXQsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTIyLTEyNQogICAgLy8gZW5zdXJlX2J1ZGdldCgKICAgIC8vICAgICByZXF1aXJlZF9idWRnZXQ9VUludDY0KGZpeGVkX2NmZy5PUF9VUF9DT1VQT05fRFVFX0NPVU5USU5HKSwKICAgIC8vICAgICBmZWVfc291cmNlPU9wVXBGZWVTb3VyY2UuR3JvdXBDcmVkaXQsCiAgICAvLyApCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjEyNgogICAgLy8gY291cG9uX2lkeCArPSAxCiAgICBmcmFtZV9kaWcgMAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxMjcKICAgIC8vIGNvdXBvbl9kdWVfZGF0ZSA9IHNlbGYudGltZV9ldmVudHMudmFsdWVbY291cG9uX2lkeF0KICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIGJ5dGVjIDEyIC8vIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMKICAgIHN3YXAKICAgIGludGNfMyAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgYiBjb3VudF9kdWVfY291cG9uc193aGlsZV90b3BANAoKY291bnRfZHVlX2NvdXBvbnNfYWZ0ZXJfd2hpbGVANjoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjEyOAogICAgLy8gZHVlX2NvdXBvbnMgPSBjb3Vwb25faWR4IC0gZml4ZWRfY2ZnLkZJUlNUX0NPVVBPTl9EQVRFX0lEWAogICAgZnJhbWVfZGlnIDAKICAgIHB1c2hpbnQgMwogICAgLQogICAgZnJhbWVfYnVyeSAyCiAgICBiIGNvdW50X2R1ZV9jb3Vwb25zX2FmdGVyX2lmX2Vsc2VAOAoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY291cG9uLkZpeGVkQ291cG9uQ2FzaGZsb3dNaXhpbi5jb3Vwb25fZHVlX2RhdGUoY291cG9uOiB1aW50NjQpIC0+IHVpbnQ2NDoKY291cG9uX2R1ZV9kYXRlOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTMyCiAgICAvLyBkZWYgY291cG9uX2R1ZV9kYXRlKHNlbGYsIGNvdXBvbjogVUludDY0KSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjEzMwogICAgLy8gcmV0dXJuIHNlbGYudGltZV9ldmVudHMudmFsdWVbZml4ZWRfY2ZnLkZJUlNUX0NPVVBPTl9EQVRFX0lEWCArIGNvdXBvbiAtIDFdCiAgICBwdXNoaW50IDMKICAgIGZyYW1lX2RpZyAtMQogICAgKwogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIGJ5dGVjIDEyIC8vIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMKICAgIHN3YXAKICAgIGludGNfMyAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb3Vwb24uRml4ZWRDb3Vwb25DYXNoZmxvd01peGluLm5leHRfY291cG9uX2R1ZV9kYXRlKGR1ZV9jb3Vwb25zOiB1aW50NjQpIC0+IHVpbnQ2NDoKbmV4dF9jb3Vwb25fZHVlX2RhdGU6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxNDEKICAgIC8vIGRlZiBuZXh0X2NvdXBvbl9kdWVfZGF0ZShzZWxmLCBkdWVfY291cG9uczogVUludDY0KSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjE0MgogICAgLy8gY291cG9uX2R1ZV9kYXRlID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxNDMKICAgIC8vIGlmIGR1ZV9jb3Vwb25zIDwgc2VsZi50b3RhbF9jb3Vwb25zOgogICAgZHVwCiAgICBieXRlYyA3IC8vICJ0b3RhbF9jb3Vwb25zIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX2NvdXBvbnMgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgID4KICAgIGJ6IG5leHRfY291cG9uX2R1ZV9kYXRlX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTQ0CiAgICAvLyBjb3Vwb25fZHVlX2RhdGUgPSBzZWxmLmNvdXBvbl9kdWVfZGF0ZShkdWVfY291cG9ucyArIDEpCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBjYWxsc3ViIGNvdXBvbl9kdWVfZGF0ZQogICAgZnJhbWVfYnVyeSAwCgpuZXh0X2NvdXBvbl9kdWVfZGF0ZV9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxNDUKICAgIC8vIHJldHVybiBjb3Vwb25fZHVlX2RhdGUKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmNvcmVfZmluYW5jaWFsLmNvdXBvbi5GaXhlZENvdXBvbkNhc2hmbG93TWl4aW4uY291cG9uX2ludGVyZXN0X2Ftb3VudChwcmluY2lwYWxfYW1vdW50OiB1aW50NjQsIGNvdXBvbjogdWludDY0KSAtPiB1aW50NjQ6CmNvdXBvbl9pbnRlcmVzdF9hbW91bnQ6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxNDctMTQ5CiAgICAvLyBkZWYgY291cG9uX2ludGVyZXN0X2Ftb3VudCgKICAgIC8vICAgICBzZWxmLCBwcmluY2lwYWxfYW1vdW50OiBVSW50NjQsIGNvdXBvbjogVUludDY0CiAgICAvLyApIC0+IFVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTUwCiAgICAvLyBjb3Vwb25fcmF0ZV9icHMgPSBzZWxmLmNvdXBvbl9yYXRlcy52YWx1ZVtjb3Vwb24gLSAxXS5hc191aW50NjQoKQogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgcHVzaGludCAyCiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIGJ5dGVjIDE5IC8vIDB4NjM2Zjc1NzA2ZjZlNTI2MTc0NjU3MwogICAgc3dhcAogICAgcHVzaGludCAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTUxCiAgICAvLyByZXR1cm4gcHJpbmNpcGFsX2Ftb3VudCAqIGNvdXBvbl9yYXRlX2JwcyAvLyBjc3QuQlBTCiAgICBmcmFtZV9kaWcgLTIKICAgICoKICAgIHB1c2hpbnQgMTAwMDAKICAgIC8KICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY291cG9uLkZpeGVkQ291cG9uQ2FzaGZsb3dNaXhpbi5kYXlfY291bnRfZmFjdG9yKGR1ZV9jb3Vwb25zOiB1aW50NjQpIC0+IGJ5dGVzOgpkYXlfY291bnRfZmFjdG9yOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTUzCiAgICAvLyBkZWYgZGF5X2NvdW50X2ZhY3RvcihzZWxmLCBkdWVfY291cG9uczogVUludDY0KSAtPiB0eXAuRGF5Q291bnRGYWN0b3I6CiAgICBwcm90byAxIDEKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxNTQtMTU1CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgb25seSB0aGUgQWN0dWFsL0FjdHVhbCBhbmQgQ29udGludW91cyBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGlmIG5vdCBkdWVfY291cG9uczoKICAgIGZyYW1lX2RpZyAtMQogICAgYm56IGRheV9jb3VudF9mYWN0b3JfZWxzZV9ib2R5QDIKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjE1NgogICAgLy8gYWNjcnVpbmdfc3RhcnRfdGltZSA9IHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKCmRheV9jb3VudF9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTU5CiAgICAvLyBjb3Vwb25fYWNjcnVlZF9wZXJpb2QgPSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCAtIGFjY3J1aW5nX3N0YXJ0X3RpbWUKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGRpZyAxCiAgICAtCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjE2MAogICAgLy8gY291cG9uX3BlcmlvZCA9IHNlbGYubmV4dF9jb3Vwb25fZHVlX2RhdGUoZHVlX2NvdXBvbnMpIC0gYWNjcnVpbmdfc3RhcnRfdGltZQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIG5leHRfY291cG9uX2R1ZV9kYXRlCiAgICBzd2FwCiAgICAtCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxNjEKICAgIC8vIGlmIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPT0gVUludDY0KGNzdC5EQ0NfQV9BKToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gZXhpc3RzCiAgICBibnogZGF5X2NvdW50X2ZhY3Rvcl9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE2MgogICAgLy8gcmV0dXJuIHRpbWVfcGVyaW9kIC8vIFVJbnQ2NChjc3QuREFZXzJfU0VDKQogICAgZnJhbWVfZGlnIDAKICAgIGludGMgNiAvLyA4NjQwMAogICAgLwogICAgZnJhbWVfYnVyeSAwCiAgICBpbnRjIDYgLy8gODY0MDAKICAgIC8KCmRheV9jb3VudF9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTY0LTE2NwogICAgLy8gcmV0dXJuIHR5cC5EYXlDb3VudEZhY3RvcigKICAgIC8vICAgICBudW1lcmF0b3I9Y291cG9uX2FjY3J1ZWRfcGVyaW9kLAogICAgLy8gICAgIGRlbm9taW5hdG9yPWNvdXBvbl9wZXJpb2QsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMAogICAgaXRvYgogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZGF5X2NvdW50X2ZhY3Rvcl9lbHNlX2JvZHlAMjoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjEzNgogICAgLy8gY291cG9uX2R1ZV9kYXRlID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjEzNwogICAgLy8gaWYgZHVlX2NvdXBvbnMgPj0gVUludDY0KDEpOgogICAgZnJhbWVfZGlnIC0xCiAgICBieiBkYXlfY291bnRfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAOAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTM4CiAgICAvLyBjb3Vwb25fZHVlX2RhdGUgPSBzZWxmLmNvdXBvbl9kdWVfZGF0ZShkdWVfY291cG9ucykKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBjb3Vwb25fZHVlX2RhdGUKICAgIGZyYW1lX2J1cnkgMQoKZGF5X2NvdW50X2ZhY3Rvcl9hZnRlcl9pZl9lbHNlQDg6CiAgICBmcmFtZV9kaWcgMQogICAgYiBkYXlfY291bnRfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAMwoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY291cG9uLkZpeGVkQ291cG9uQ2FzaGZsb3dNaXhpbi5pc19hY2NydWluZ19pbnRlcmVzdChkdWVfY291cG9uczogdWludDY0KSAtPiB1aW50NjQ6CmlzX2FjY3J1aW5nX2ludGVyZXN0OgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTY5CiAgICAvLyBkZWYgaXNfYWNjcnVpbmdfaW50ZXJlc3Qoc2VsZiwgZHVlX2NvdXBvbnM6IFVJbnQ2NCkgLT4gYm9vbDoKICAgIHByb3RvIDEgMQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTcxCiAgICAvLyBzZWxmLmlzc3VhbmNlX2RhdGUgIT0gMAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjE3MS0xNzMKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZSAhPSAwCiAgICAvLyBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5pc3N1YW5jZV9kYXRlCiAgICAvLyBhbmQgZHVlX2NvdXBvbnMgPCBzZWxmLnRvdGFsX2NvdXBvbnMKICAgIGJ6IGlzX2FjY3J1aW5nX2ludGVyZXN0X2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTcyCiAgICAvLyBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5pc3N1YW5jZV9kYXRlCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pc3N1YW5jZV9kYXRlIGV4aXN0cwogICAgPj0KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjE3MS0xNzMKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZSAhPSAwCiAgICAvLyBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5pc3N1YW5jZV9kYXRlCiAgICAvLyBhbmQgZHVlX2NvdXBvbnMgPCBzZWxmLnRvdGFsX2NvdXBvbnMKICAgIGJ6IGlzX2FjY3J1aW5nX2ludGVyZXN0X2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTczCiAgICAvLyBhbmQgZHVlX2NvdXBvbnMgPCBzZWxmLnRvdGFsX2NvdXBvbnMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJ0b3RhbF9jb3Vwb25zIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX2NvdXBvbnMgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgID4KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjE3MS0xNzMKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZSAhPSAwCiAgICAvLyBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5pc3N1YW5jZV9kYXRlCiAgICAvLyBhbmQgZHVlX2NvdXBvbnMgPCBzZWxmLnRvdGFsX2NvdXBvbnMKICAgIGJ6IGlzX2FjY3J1aW5nX2ludGVyZXN0X2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjE3MC0xNzQKICAgIC8vIHJldHVybiAoCiAgICAvLyAgICAgc2VsZi5pc3N1YW5jZV9kYXRlICE9IDAKICAgIC8vICAgICBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5pc3N1YW5jZV9kYXRlCiAgICAvLyAgICAgYW5kIGR1ZV9jb3Vwb25zIDwgc2VsZi50b3RhbF9jb3Vwb25zCiAgICAvLyApCiAgICByZXRzdWIKCmlzX2FjY3J1aW5nX2ludGVyZXN0X2Jvb2xfZmFsc2VANDoKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxNzAtMTc0CiAgICAvLyByZXR1cm4gKAogICAgLy8gICAgIHNlbGYuaXNzdWFuY2VfZGF0ZSAhPSAwCiAgICAvLyAgICAgYW5kIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID49IHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgLy8gICAgIGFuZCBkdWVfY291cG9ucyA8IHNlbGYudG90YWxfY291cG9ucwogICAgLy8gKQogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb3Vwb24uRml4ZWRDb3Vwb25DYXNoZmxvd01peGluLmFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50KGhvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHVuaXRzOiB1aW50NjQsIGR1ZV9jb3Vwb25zOiB1aW50NjQpIC0+IHVpbnQ2NDoKYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQ6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxNzYtMTc4CiAgICAvLyBkZWYgYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQoCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50LCB1bml0czogVUludDY0LCBkdWVfY291cG9uczogVUludDY0CiAgICAvLyApIC0+IFVJbnQ2NDoKICAgIHByb3RvIDMgMQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTc5LTE4MAogICAgLy8gIyBUaGUgZm9sbG93aW5nIGFzc2VydCBzYWZlZ3VhcmRzIHRoZSBzdWJyb3V0aW5lIGZyb20gZm9yYmlkZGVuIGludm9jYXRpb25zCiAgICAvLyBzZWxmLmFzc2VydF9ub19wZW5kaW5nX2NvdXBvbl9wYXltZW50KGhvbGRpbmdfYWRkcmVzcywgZHVlX2NvdXBvbnMpCiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBhc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTgxCiAgICAvLyBkYXlfY291bnRfZmFjdG9yID0gc2VsZi5kYXlfY291bnRfZmFjdG9yKGR1ZV9jb3Vwb25zKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGRheV9jb3VudF9mYWN0b3IKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjE4MgogICAgLy8gY291cG9uX2FjY3J1ZWRfcGVyaW9kID0gZGF5X2NvdW50X2ZhY3Rvci5udW1lcmF0b3IKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxODMKICAgIC8vIGNvdXBvbl9wZXJpb2QgPSBkYXlfY291bnRfZmFjdG9yLmRlbm9taW5hdG9yCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjE4NAogICAgLy8gbmV4dF9jb3Vwb25fcmF0ZV9icHMgPSBzZWxmLmNvdXBvbl9yYXRlcy52YWx1ZVtkdWVfY291cG9uc10uYXNfdWludDY0KCkKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAyCiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIGJ5dGVjIDE5IC8vIDB4NjM2Zjc1NzA2ZjZlNTI2MTc0NjU3MwogICAgc3dhcAogICAgcHVzaGludCAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTg3CiAgICAvLyBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIGFjY291bnRfdW5pdHNfdmFsdWUKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjE4Ny0xODgKICAgIC8vIHNlbGYuYWNjb3VudF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MsIHVuaXRzKQogICAgLy8gKiBuZXh0X2NvdXBvbl9yYXRlX2JwcwogICAgKgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTg3LTE4OQogICAgLy8gc2VsZi5hY2NvdW50X3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcywgdW5pdHMpCiAgICAvLyAqIG5leHRfY291cG9uX3JhdGVfYnBzCiAgICAvLyAqIGNvdXBvbl9hY2NydWVkX3BlcmlvZAogICAgdW5jb3ZlciAyCiAgICAqCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxOTAKICAgIC8vIC8vIChjc3QuQlBTICogY291cG9uX3BlcmlvZCkKICAgIHB1c2hpbnQgMTAwMDAKICAgIHVuY292ZXIgMgogICAgKgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTg3LTE5MAogICAgLy8gc2VsZi5hY2NvdW50X3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcywgdW5pdHMpCiAgICAvLyAqIG5leHRfY291cG9uX3JhdGVfYnBzCiAgICAvLyAqIGNvdXBvbl9hY2NydWVkX3BlcmlvZAogICAgLy8gLy8gKGNzdC5CUFMgKiBjb3Vwb25fcGVyaW9kKQogICAgLwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTg1LTE5MQogICAgLy8gIyBkdWVfY291cG9ucyBpcyBlcXVhbCB0byB0aGUgMC1iYXNlIGlkeCBvZiBuZXh0IGNvdXBvbgogICAgLy8gcmV0dXJuICgKICAgIC8vICAgICBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIC8vICAgICAqIG5leHRfY291cG9uX3JhdGVfYnBzCiAgICAvLyAgICAgKiBjb3Vwb25fYWNjcnVlZF9wZXJpb2QKICAgIC8vICAgICAvLyAoY3N0LkJQUyAqIGNvdXBvbl9wZXJpb2QpCiAgICAvLyApICAjIGRpdi1ieS16ZXJvOiBjb3Vwb25fcGVyaW9kICE9IDAgZHVlIHRvIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQgY2hlY2tzCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmNvcmVfZmluYW5jaWFsLmNvdXBvbi5Db3Vwb25DYXNoZmxvd01peGluLmFsbF9kdWVfY291cG9uc19wYWlkKGR1ZV9jb3Vwb25zOiB1aW50NjQpIC0+IHVpbnQ2NDoKYWxsX2R1ZV9jb3Vwb25zX3BhaWQ6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToyNgogICAgLy8gZGVmIGFsbF9kdWVfY291cG9uc19wYWlkKHNlbGYsIGR1ZV9jb3Vwb25zOiBVSW50NjQpIC0+IGJvb2w6CiAgICBwcm90byAxIDEKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjI3CiAgICAvLyByZXR1cm4gc2VsZi5wYWlkX2NvdXBvbl91bml0cyA+PSBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICogZHVlX2NvdXBvbnMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyOCAvLyAicGFpZF9jb3Vwb25fdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucGFpZF9jb3Vwb25fdW5pdHMgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgICoKICAgID49CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmNvcmVfZmluYW5jaWFsLmNvdXBvbi5Db3Vwb25DYXNoZmxvd01peGluLmFzc2VydF9ub19wZW5kaW5nX2NvdXBvbl9wYXltZW50KGhvbGRpbmdfYWRkcmVzczogYnl0ZXMsIGR1ZV9jb3Vwb25zOiB1aW50NjQpIC0+IHZvaWQ6CmFzc2VydF9ub19wZW5kaW5nX2NvdXBvbl9wYXltZW50OgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MjktMzEKICAgIC8vIGRlZiBhc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudCgKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IEFjY291bnQsIGR1ZV9jb3Vwb25zOiBVSW50NjQKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MzMKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucyA9PSBkdWVfY291cG9ucwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHB1c2hpbnQgNDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBmcmFtZV9kaWcgLTEKICAgID09CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTozMi0zNAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMgPT0gZHVlX2NvdXBvbnMKICAgIC8vICksIGVyci5QRU5ESU5HX0NPVVBPTl9QQVlNRU5UCiAgICBhc3NlcnQgLy8gUGVuZGluZyBkdWUgY291cG9uIHBheW1lbnQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucGF5bWVudF9hZ2VudC5jb21tb24uUGF5bWVudEFnZW50Q29tbW9uTWl4aW4uYXNzZXJ0X3BheW1lbnRfYXV0aG9yaXphdGlvbihob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB2b2lkOgphc3NlcnRfcGF5bWVudF9hdXRob3JpemF0aW9uOgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weToxMgogICAgLy8gZGVmIGFzc2VydF9wYXltZW50X2F1dGhvcml6YXRpb24oc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjEzCiAgICAvLyBpZiBzZWxmLm9wX2RhZW1vbi52YWx1ZSAhPSBHbG9iYWwuemVyb19hZGRyZXNzOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIyIC8vIDB4NTIzMjM1MjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcF9kYWVtb24gZXhpc3RzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBieiBhc3NlcnRfcGF5bWVudF9hdXRob3JpemF0aW9uX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weToxNQogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIyIC8vIDB4NTIzMjM1MjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcF9kYWVtb24gZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weToxNS0xNwogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICBibnogYXNzZXJ0X3BheW1lbnRfYXV0aG9yaXphdGlvbl9ib29sX3RydWVANAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weToxNgogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIHR4biBTZW5kZXIKICAgIGZyYW1lX2RpZyAtMQogICAgPT0KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MTUtMTcKICAgIC8vIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICAvLyBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgYm56IGFzc2VydF9wYXltZW50X2F1dGhvcml6YXRpb25fYm9vbF90cnVlQDQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MTcKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICB0eG4gU2VuZGVyCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDMyCiAgICA9PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weToxNS0xNwogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICBieiBhc3NlcnRfcGF5bWVudF9hdXRob3JpemF0aW9uX2Jvb2xfZmFsc2VANQoKYXNzZXJ0X3BheW1lbnRfYXV0aG9yaXphdGlvbl9ib29sX3RydWVANDoKICAgIGludGNfMSAvLyAxCgphc3NlcnRfcGF5bWVudF9hdXRob3JpemF0aW9uX2Jvb2xfbWVyZ2VANjoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MTQtMTgKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgLy8gICAgIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICAvLyAgICAgb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIC8vICksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAoKYXNzZXJ0X3BheW1lbnRfYXV0aG9yaXphdGlvbl9hZnRlcl9pZl9lbHNlQDc6CiAgICByZXRzdWIKCmFzc2VydF9wYXltZW50X2F1dGhvcml6YXRpb25fYm9vbF9mYWxzZUA1OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXJ0X3BheW1lbnRfYXV0aG9yaXphdGlvbl9ib29sX21lcmdlQDYKCgovLyBtb2R1bGVzLnBheW1lbnRfYWdlbnQuY29tbW9uLlBheW1lbnRBZ2VudENvbW1vbk1peGluLmlzX3BheW1lbnRfZXhlY3V0YWJsZShob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB1aW50NjQ6CmlzX3BheW1lbnRfZXhlY3V0YWJsZToKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MjAKICAgIC8vIGRlZiBpc19wYXltZW50X2V4ZWN1dGFibGUoc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50KSAtPiBib29sOgogICAgcHJvdG8gMSAxCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjIyCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MuaXNfb3B0ZWRfaW4oCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgMzIKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MjMKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MjItMjQKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5pc19vcHRlZF9pbigKICAgIC8vICAgICBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQKICAgIC8vICkKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjIyLTI1CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MuaXNfb3B0ZWRfaW4oCiAgICAvLyAgICAgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkCiAgICAvLyApCiAgICAvLyBhbmQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZAogICAgYnogaXNfcGF5bWVudF9leGVjdXRhYmxlX2Jvb2xfZmFsc2VAMwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weToyNQogICAgLy8gYW5kIG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQKICAgIGZyYW1lX2RpZyAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCA0NDgKICAgIGdldGJpdAogICAgYm56IGlzX3BheW1lbnRfZXhlY3V0YWJsZV9ib29sX2ZhbHNlQDMKICAgIGludGNfMSAvLyAxCgppc19wYXltZW50X2V4ZWN1dGFibGVfYm9vbF9tZXJnZUA0OgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weToyMS0yNgogICAgLy8gcmV0dXJuICgKICAgIC8vICAgICBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MuaXNfb3B0ZWRfaW4oCiAgICAvLyAgICAgICAgIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZAogICAgLy8gICAgICkKICAgIC8vICAgICBhbmQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZAogICAgLy8gKQogICAgc3dhcAogICAgcmV0c3ViCgppc19wYXltZW50X2V4ZWN1dGFibGVfYm9vbF9mYWxzZUAzOgogICAgaW50Y18wIC8vIDAKICAgIGIgaXNfcGF5bWVudF9leGVjdXRhYmxlX2Jvb2xfbWVyZ2VANAoKCi8vIG1vZHVsZXMucGF5bWVudF9hZ2VudC5jb21tb24uUGF5bWVudEFnZW50Q29tbW9uTWl4aW4uYXNzZXJ0X2Vub3VnaF9mdW5kcyhwYXltZW50X2Ftb3VudDogdWludDY0KSAtPiB2b2lkOgphc3NlcnRfZW5vdWdoX2Z1bmRzOgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weToyOAogICAgLy8gZGVmIGFzc2VydF9lbm91Z2hfZnVuZHMoc2VsZiwgcGF5bWVudF9hbW91bnQ6IFVJbnQ2NCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weTozMAogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBvcHRlZCBpbnRvIGFzc2V0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjMwLTMxCiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgLy8gPj0gcGF5bWVudF9hbW91bnQKICAgIGZyYW1lX2RpZyAtMQogICAgPj0KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MjktMzIKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIC8vICAgICA+PSBwYXltZW50X2Ftb3VudAogICAgLy8gKSwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5wYXltZW50X2FnZW50LmNvbW1vbi5QYXltZW50QWdlbnRDb21tb25NaXhpbi5wYXkocmVjZWl2ZXI6IGJ5dGVzLCBhbW91bnQ6IHVpbnQ2NCkgLT4gdm9pZDoKcGF5OgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weTozNAogICAgLy8gZGVmIHBheShzZWxmLCByZWNlaXZlcjogQWNjb3VudCwgYW1vdW50OiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MzUtNDAKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1yZWNlaXZlciwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9YW1vdW50LAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjM5CiAgICAvLyBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weTozNgogICAgLy8geGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBmcmFtZV9kaWcgLTIKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MzUKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MzUtNDAKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1yZWNlaXZlciwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9YW1vdW50LAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb21tb24uQ29yZUZpbmFuY2lhbENvbW1vbk1peGluLmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQodGltZV9ldmVudHM6IGJ5dGVzKSAtPiBieXRlczoKYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZDoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjEwNwogICAgLy8gZGVmIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQoc2VsZiwgdGltZV9ldmVudHM6IHR5cC5UaW1lRXZlbnRzKSAtPiBOb25lOgogICAgcHJvdG8gMSAxCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gMgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTA5CiAgICAvLyB0aW1lX2V2ZW50c1tjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fT1BFTklOR19EQVRFX0lEWF0KICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTEwCiAgICAvLyA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMDktMTEwCiAgICAvLyB0aW1lX2V2ZW50c1tjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fT1BFTklOR19EQVRFX0lEWF0KICAgIC8vID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgID4KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjEwOC0xMTEKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgdGltZV9ldmVudHNbY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX09QRU5JTkdfREFURV9JRFhdCiAgICAvLyAgICAgPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gKSwgZXJyLklOVkFMSURfVElNRQogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIG11c3QgYmUgc2V0IGluIHRoZSBmdXR1cmUKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjExMgogICAgLy8gZm9yIGlkeCBpbiB1cmFuZ2UodGltZV9ldmVudHMubGVuZ3RoIC0gMSk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgaW50Y18wIC8vIDAKCmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfZm9yX2hlYWRlckAxOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTEyCiAgICAvLyBmb3IgaWR4IGluIHVyYW5nZSh0aW1lX2V2ZW50cy5sZW5ndGggLSAxKToKICAgIGZyYW1lX2RpZyA1CiAgICBmcmFtZV9kaWcgNAogICAgPAogICAgYnogYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9hZnRlcl9mb3JANgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTE0CiAgICAvLyByZXF1aXJlZF9idWRnZXQ9VUludDY0KGNmZy5PUF9VUF9USU1FX0VWRU5UX1NPUlRJTkcpLAogICAgcHVzaGludCA2NQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTE1CiAgICAvLyBmZWVfc291cmNlPU9wVXBGZWVTb3VyY2UuQXBwQWNjb3VudCwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMTMtMTE2CiAgICAvLyBlbnN1cmVfYnVkZ2V0KAogICAgLy8gICAgIHJlcXVpcmVkX2J1ZGdldD1VSW50NjQoY2ZnLk9QX1VQX1RJTUVfRVZFTlRfU09SVElORyksCiAgICAvLyAgICAgZmVlX3NvdXJjZT1PcFVwRmVlU291cmNlLkFwcEFjY291bnQsCiAgICAvLyApCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjExNwogICAgLy8gdGltZV9pID0gdGltZV9ldmVudHNbaWR4XQogICAgZnJhbWVfZGlnIDUKICAgIGR1cAogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGZyYW1lX2RpZyAzCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTE4CiAgICAvLyB0aW1lX2YgPSB0aW1lX2V2ZW50c1tpZHggKyAxXQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMTkKICAgIC8vIGFzc2VydCB0aW1lX2YgPiB0aW1lX2ksIGVyci5JTlZBTElEX1NPUlRJTkcKICAgIDwKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBtdXN0IGJlIHNvcnRlZCBpbiBzdHJpY3RseSBhc2NlbmRpbmcgb3JkZXIKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjEyMAogICAgLy8gaWYgc2VsZi5kYXlfY291bnRfY29udmVudGlvbiAhPSBVSW50NjQoY3N0LkRDQ19DT05UKToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gZXhpc3RzCiAgICBpbnRjIDQgLy8gMjU1CiAgICAhPQogICAgYnogYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9hZnRlcl9pZl9lbHNlQDQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjEyMS0xMjIKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiByZXF1aXJlcyB0aW1lIHBlcmlvZHMgZXhwcmVzc2VkIGluIGRheXMgZm9yIHJlZ3VsYXIgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgKHRpbWVfZiAtIHRpbWVfaSkgJSBVSW50NjQoCiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIDEKICAgIC0KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjEyMS0xMjQKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiByZXF1aXJlcyB0aW1lIHBlcmlvZHMgZXhwcmVzc2VkIGluIGRheXMgZm9yIHJlZ3VsYXIgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgKHRpbWVfZiAtIHRpbWVfaSkgJSBVSW50NjQoCiAgICAvLyAgICAgY3N0LkRBWV8yX1NFQwogICAgLy8gKSA9PSAwLCBlcnIuSU5WQUxJRF9USU1FX1BFUklPRAogICAgaW50YyA2IC8vIDg2NDAwCiAgICAlCiAgICAhCiAgICBhc3NlcnQgLy8gVGltZSBwZXJpb2RzIGluIEFjdHVhbC9BY3R1YWwgZGF5IGNvdW50IGNvbnZlbnRpb24gbXVzdCBiZSBtdWx0aXBsZXMgb2YgYSBkYXkgKGluIHNlY29uZHMpCgphc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2FmdGVyX2lmX2Vsc2VANDoKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9idXJ5IDUKICAgIGIgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9mb3JfaGVhZGVyQDEKCmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfYWZ0ZXJfZm9yQDY6CiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB2b2lkOgphc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjMzCiAgICAvLyBkZWYgYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChzZWxmLCBob2xkaW5nX2FkZHJlc3M6IEFjY291bnQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozNAogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQsIGVyci5TVVNQRU5ERUQKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQ0OAogICAgZ2V0Yml0CiAgICAhCiAgICBhc3NlcnQgLy8gU3VzcGVuZGVkIG9wZXJhdGlvbnMKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzOiBieXRlcywgdW5pdHM6IHVpbnQ2NCkgLT4gdWludDY0OgphY2NvdW50X3VuaXRzX3ZhbHVlOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjM2CiAgICAvLyBkZWYgYWNjb3VudF91bml0c192YWx1ZShzZWxmLCBob2xkaW5nX2FkZHJlc3M6IEFjY291bnQsIHVuaXRzOiBVSW50NjQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjM3CiAgICAvLyByZXR1cm4gdW5pdHMgKiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCA0MAogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyAtMQogICAgKgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF90b3RhbF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB1aW50NjQ6CmFjY291bnRfdG90YWxfdW5pdHNfdmFsdWU6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzkKICAgIC8vIGRlZiBhY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlKHNlbGYsIGhvbGRpbmdfYWRkcmVzczogQWNjb3VudCkgLT4gVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NDEKICAgIC8vIGhvbGRpbmdfYWRkcmVzcywgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzIgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NDAtNDIKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoCiAgICAvLyAgICAgaG9sZGluZ19hZGRyZXNzLCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cwogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBjYWxsc3ViIGFjY291bnRfdW5pdHNfdmFsdWUKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmVuZF9pZl9ub19jaXJjdWxhdGluZ191bml0cygpIC0+IHZvaWQ6CmVuZF9pZl9ub19jaXJjdWxhdGluZ191bml0czoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo0OAogICAgLy8gaWYgc2VsZi5jaXJjdWxhdGluZ191bml0cyA9PSBVSW50NjQoMCk6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBibnogZW5kX2lmX25vX2NpcmN1bGF0aW5nX3VuaXRzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjQ5CiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbm0uU1RBVFVTX0VOREVEKQogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgaW50YyA1IC8vIDIwMAogICAgYXBwX2dsb2JhbF9wdXQKCmVuZF9pZl9ub19jaXJjdWxhdGluZ191bml0c19hZnRlcl9pZl9lbHNlQDI6CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fcm9sZV9pc19hY3RpdmUocm9sZV9tYXA6IGJ5dGVzLCByb2xlX2FkZHJlc3M6IGJ5dGVzKSAtPiB1aW50NjQ6Cl9yb2xlX2lzX2FjdGl2ZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NwogICAgLy8gZGVmIF9yb2xlX2lzX2FjdGl2ZShzZWxmLCByb2xlX21hcDogdHlwLlJiYWNSb2xlLCByb2xlX2FkZHJlc3M6IEFjY291bnQpIC0+IGJvb2w6CiAgICBwcm90byAyIDEKICAgIHB1c2hieXRlcyAiIgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU4LTYyCiAgICAvLyByZXR1cm4gc2VsZi5faGFzX3JvbGUocm9sZV9tYXAsIHJvbGVfYWRkcmVzcykgYW5kICgKICAgIC8vICAgICByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICkKICAgIGJ6IF9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIEJveE1hcCBlbnRyeSBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYwCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MAogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgPD0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYxCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIEJveE1hcCBlbnRyeSBleGlzdHMKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYwLTYxCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDAKICAgID49CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTktNjEKICAgIC8vIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IF9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQKICAgIGludGNfMSAvLyAxCgpfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU4LTYyCiAgICAvLyByZXR1cm4gc2VsZi5faGFzX3JvbGUocm9sZV9tYXAsIHJvbGVfYWRkcmVzcykgYW5kICgKICAgIC8vICAgICByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICkKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgX3JvbGVfaXNfYWN0aXZlX2Jvb2xfbWVyZ2VANQoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKSAtPiB2b2lkOgphc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjY1CiAgICAvLyBhc3NlcnQgc2VsZi5faXNfYXJyYW5nZXIoVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1MgogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyA9PSBzZWxmLmFycmFuZ2VyLnZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOCAvLyAweDUyMzIzMDIzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJyYW5nZXIgZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjY1CiAgICAvLyBhc3NlcnQgc2VsZi5faXNfYXJyYW5nZXIoVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKSAtPiB2b2lkOgphc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4MwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFzc2V0X2RlZmF1bHRlZCwgZXJyLkRFRkFVTFRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI0IC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfZGVmYXVsdGVkIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIERlZmF1bHRlZAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKSAtPiB2b2lkOgphc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4NgogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFzc2V0X3N1c3BlbmRlZCwgZXJyLlNVU1BFTkRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIzIC8vICJhc3NldF9zdXNwZW5kZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfc3VzcGVuZGVkIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIFN1c3BlbmRlZCBvcGVyYXRpb25zCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZDogdWludDY0KSAtPiB2b2lkOgpfYXNzZXJ0X3ZhbGlkX3JvbGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODgKICAgIC8vIGRlZiBfYXNzZXJ0X3ZhbGlkX3JvbGUoc2VsZiwgcm9sZV9pZDogVUludDY0KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTYKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTAKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICBwdXNoaW50IDIwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTYKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkxCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIHB1c2hpbnQgNDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTIKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICBwdXNoaW50IDUwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTYKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkzCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICBwdXNoaW50IDYwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTYKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojk0CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIHB1c2hpbnQgNzAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTUKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgcHVzaGludCA4MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk2CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBieiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9mYWxzZUA3CgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDY6CiAgICBpbnRjXzEgLy8gMQoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfbWVyZ2VAODoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBhc3NlcnQgLy8gSW52YWxpZCByb2xlIGlkZW50aWZpZXIKICAgIHJldHN1YgoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfZmFsc2VANzoKICAgIGludGNfMCAvLyAwCiAgICBiIF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX21lcmdlQDgK", - "clear": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" - }, - "byteCode": { - "approval": "DCAHAAEgCP8ByAGAowUmJgQVH3x1BFIzMCMGc3RhdHVzEWNpcmN1bGF0aW5nX3VuaXRzDWlzc3VhbmNlX2RhdGUNbWF0dXJpdHlfZGF0ZQp1bml0X3ZhbHVlDXRvdGFsX2NvdXBvbnMEUjIwIxNzZXR0bGVtZW50X2Fzc2V0X2lkIXByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZR1zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQp0aW1lRXZlbnRzBFI3MCMEUjQwIwt0b3RhbF91bml0cxVkZW5vbWluYXRpb25fYXNzZXRfaWQUZGF5X2NvdW50X2NvbnZlbnRpb24dc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGULY291cG9uUmF0ZXMEUjYwIwRSNTAjBFIyNSMPYXNzZXRfc3VzcGVuZGVkD2Fzc2V0X2RlZmF1bHRlZAhtZXRhZGF0YRJwcmluY2lwYWxfZGlzY291bnQhcHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlEXBhaWRfY291cG9uX3VuaXRzFWR1ZV9jb3Vwb25zX3dhdGVybWFyawIAAAEABFI4MCMNaW50ZXJlc3RfcmF0ZQMGgQECADsEjCmQTgIAEjEYQAB1JwgyA2cnFjIDZycXImcnGCJnJw8iZysiZycGImcqImcnECJnJwkiZycGImcnESJnJxmAAGcnGiJnJyEiZycHImcnCiJnJxsiZycEImcnEiJnJwsiZycFImcnHCJnJx0iZzE1gQMSRDE0gRQSRDE3FEQxNhREgAQl26lbNhoAjgEA4zEZFEQxGEEAzIIcBIlHQTQERDY9SQRTvvBFBGfbTyAE9qlsjQSM8UtRBJx2tqMET9ajzAQdb8JVBCXpmX8EbIXj7gRALbpHBPrSFz4ECO/qNQTkpatUBNwGOzUEFPwQ7wRMET7VBHSnKX8EEFwYTgSC9xstBO8E9dMEA7gzKQQ9voC9BN9U6CwEAQyCmQR0BqzSBMPkspc2GgCOHABWAa0CUgJsAsMDDgQUBQwGsAcvB04H5AizCM0I6AjzCSwJdgmzCeUJ/QoVCi0K6Qt/C54LqQvzAIAEPw78bDYaAI4BBk4AMRmBBBIxGBBEQgZwigIAi/6BCgiLADIMDUEAKrGBBrIQgQWyGScish4nIrIfi/+NAgALAASzQv/bMgCyAUL/9SKyAUL/74mAADYaAUkVJRJEFzYaAkkVJRJEFzYaA0kVJRJEFzYaBEkVJRJEFzYaBUkVJRJEFzYaBkkVIxJENhoHSU4HFYECEkQ2GghJTgdJIllJTgiBAguBAghMFRJENhoJSU4HSSJZSU4IJQuBAghMFRJENhoKSSJZSU4IgRALgQIITBUSRIgOqiIqZUQUREsFcQtFAUQnEEsGZ0sETwYSRCcJSwVnsTIAMgoishKyFE8FshGBBLIQsgGzSwNLAhgURCcGSwJnTwNPAgonD0xnJxpPAmcXSUEAB0khBBJBAHgjRCcRSwFnSwYXRQgiJxplREAAA0sHRCchSwhnSwRJRCcHSwFnJxO8SCcTSwe/gQQISwMSREsDiA09Jwy8SCcMSwG/SVcCAEsBgQJbJwpMZ0sBgQpbJxtMZ0sBgRJbJwRMZ0wiWSMJJQtbJwVMZ0sBFEQqgWRnI0MiQv+FIoAARwQ2GgFJFSQSRDYaAkkVJRJEFyInCmVEQQCDMgciJwplRA9BAHgjRClLAlBJRQm9RQFESUEAY0sHvkQkW0sBD0EAVyNESwFJSwKIDSRFCCJFByJFBCJFBogKe0lFBkxLAYgL8ogLgkEAGksDSYgLLEsDSwNPA4gLlUUHSSJbRQQlW0UFSwIWSwUWUEsHFksHFlBMUChMULAjQyJC/6YiQv+FJx4iKmVEgWQSQQAHJxO+TEUCRChLAVCwI0OAADYaAUcCFSQSRClMUEm9RQFEIkcCKmVEgWQSQQAhSwK+RIEwW0lFBiInB2VEDEEAG0sDiAyOSwUjCIgKhkUCSwEWSwEWUChMULAjQ0sDiAxzRQFC/+mICcBHAogKSUxJiAslTCJMIkyICsFBAA5LBIgKbEkiW0UDJVtFASInB2VESwIWSwIWUEwWSwYWUEsFFlBMUCcfIksFVFAoTFCwI0M2GgFJFSQSRDYaAkkiWYECCEsBFRJEVwIATCIqZUSBZBJEiAxaiAxfKUsBUElOAkm9RQFESb5IJFtJTgNEiAk4TL5EgTBbTEsBDURJiAqYREsBiAvOTCMIiAnHTEmICqmICt1BAJpHAogLAEsDvkRXACBMiAsHSwJJvkSBMFsjCBaBMEy7IiccZURLAggnHExnMggyByInEGVESXEDRCIrZUQiJwZlRAtPBBaAAwgAN1BPBBZQSwQWTEsBUE8EFlBLAxUWVwYCTwRQTCcjUE8DFlAnHlAiFlCABAACSVBQTFAnJExQsDIHFlBLBEkVFlcGAkxQTCclUExQKExQsCNDIkUBQv9wNhoBSRUkEkQ2GgJJIlmBAghLARUSRFcCAEwiKmVEgWQSRIgLVIgLWSlLAVBJTgJJvUUBRL5IJFtEMgciJwVlRA9EiAgtiAmZREmICtBMSYgJsYgJ5UEAmkcCiAoISwK+RFcAIEyICg8iK2VESwJJTgK+RCRbCStMZyIWTCRLAruICqwyCDIHIicQZURJcQNEIitlRCInBmVEC08EFoADAwA3UE8EFlBLBRZMSwFQTwQWUEsDFRZXBgJPBFBMJyNQTwMWUCceUE8DUIAEAAJQUlBMUCckTFCwMgcWUEsDSRUWVwYCTFBMJyVQTFAoTFCwI0MiRQFC/3AiRwKAAEk2GgFJFSQSRDYaAkkVJBJENhoDSRUlEkQXIiplRIFkEkEBIyInEmVEMgcOQQEYIicLZURBAAsyByInC2VEDEEBBSNEMQBLA0lOAhJEiAosiAoxKUsBUElFCUm9RQFEKUsESU4CUElFCkm9RQFESwOICY1LAYgJiE8DTwITREsCSURPAr5ESSRbTwIPRFcoCEUJvkQkW0EAmEsGvkSBKFtLBr5EgShbEkEAgksGvkSBMFtLBr5EgTBbEkEAcCNESwZJvkSBKFtFBYgGqUsESU4CSwGICB9MSwNJTgNPAogHzEUHSwG+RCRbSg5ETAkWSwEkTwK7vkgkW0AAECIWSwdJTgKBKEsCu4EwTLtLBUm+RCRbSwJJTgIIFk8CJE8Cu0sEC0sFCBYoTFCwI0MiQv+NSwVJgShLCrtLB75EVzAIgTBMu0L/eCJC/vg2GgFJFSQSRDYaAkkVSwGBJllJgSgSREsCTEsCUiJZgSoIEkQnCE8CZycZTGcjQzYaAUkVSwGBJllJgSgSREsCTEsCUiJZgSoIEkSICNknGUxnI0MiNhoBRwIiWUklC4ECCE8CFRJEiAi9IiplRCEFEhREiAi7SUQjDUEABkmIB8tFASInBGVESwFJVwIARQSBAltMSwEORCcSTGciJwVlREEAGiInBWVESwEiWSMJJQtLA0xbTEsBD0QnC0xnIicSZUQiJwtlREwWTBZQKExQsCNDNhoBSRUjEkQiUycUMQCICA9EJxhMZzIHFihMULAjQ4AANhoBSRUkEkQ2GgJJFSUSRBciKmVEgWQSQQB1IicKZUQyB0lFBQ5BAGciJxtlREsDDUEAXCNEJxUxAIgHwkQpSwJQSb1FAUSIB/OIB/hLAUlEIitlREsBCCInD2VESwEPRCtLAWdLAr5EJFtPAggWSwIkTwK7IicGZUQWTwKBKE8CuyInD2VETAkWKExQsCNDIkL/oSIyByInBWVMSU4CTgNEDUEACElBAASBBEUCIicYZURBAASBA0UCIicQZUQiJwllRCIrZUQiJwZlREoLIicRZUQWSZMlDkRXBwEiJxplRBZJk4EQDkRXBgIiJyFlRBZJk4EQDkRXBgIiJw9lRCInCmVEIicbZUQiJwRlRCInBWVEIicXZURLDxZJkyUORFcHAU8OFk8OFlBPCxZQTwsWUE8KUE8JUE8IUE8HFlBPBxZQTwYWUE8FFlBPBBZQTwMWUCcfIk8EVFBMUChMULAjQyceIiplRIFkEkEABycMvkxFAkQoSwFQsCNDIicSZUQiJwtlREwWgAIAAkxQTBZQKExQsCNDIicZZUQoTFCwI0M2GgFJFSQSRDYaAkkVIxJEIlMnDTEAiAZDRClPAlBJvUUBREmBOCO6Ik8DVIE4TLsyBxYoTFCwI0M2GgFJFSQSRDYaAkkVJBJEJw4xAIgGDEQiKmVEIQUSFESIBj2IBkIpTwJQSb1FARREIhZPAksBUEsBUExQJx9QvzIHFihMULAjQzYaAUkVJBJEJw4xAIgFykSIBgQpTFBJvUUBREm+SCRbTLxIIitlREsBCStMZ4gFnTIHTBZMFlAoTFCwI0M2GgFJFSQSRDYaAkkVJBJEMQBLAhJEiAXBiAXGKU8CUEm9RQFEIk8CuzIHFihMULAjQzYaAUkVJBJEKUxQSb1FAUS+SChMULAjQzYaAUkVJBJEiAV7JwhMZzIHFihMULAjQzYaAUkVJBJEiAVjJxZMZzIHFihMULAjQzYaAUkVIxJENhoCSU4CFSQSRDYaA0kiWYECCEsBFRJEVwIATIgFL4gFNhdHAogFQIEUEkEADicISwNnMgcWKExQsCNDSYEoEkEAEScOSwNQSb1FARRESwK/Qv/fSYEyEkEAEScVSwNQSb1FARRESwK/Qv/HSYE8EkEAEScUSwNQSb1FARRESwK/Qv+vSYFGEkEAEScNSwNQSb1FARRESwK/Qv+XSYFQEkH/kCcgSwNQSb1FARRESwK/Qv9/NhoBSRUjEkQ2GgJJTgIVJBJEiASFiASMF0cCiASWSYEUE0SBKBJBABUnDksCUEm9RQFEvEgyBxYoTFCwI0NJgTISQQAPJxVLAlBJvUUBRLxIQv/hSYE8EkEADycUSwJQSb1FAUS8SEL/y0mBRhJBAA8nDUsCUEm9RQFEvEhC/7VJgVASQf+uJyBLAlBJvUUBRLxIQv+fNhoBSRUjEkQiUycNMQCIA79EJxdMZzIHFihMULAjQyInCGVEKExQsCNDNhoBSRUkEkQnDksBiAOXJxVLAogDkCcUSwOIA4knDUsEiAOCJyBPBYgDeycfIk8GVCNPBVSBAk8EVIEDTwNUgQRPAlQoTFCwI0M2GgFJFSMSRDYaAklOAhUkEkQXSYgDk4MGFCgyPEZQTwaOBgBPAEAAMQAiABMAAQAnIEsBUEm9RQFEvkgoTFCwI0MnDUsBUEm9RQFEvkhC/+snFEsBUEm9RQFEvkhC/9wnFUsBUEm9RQFEvkhC/80nDksBUEm9RQFEvkhC/76AEAAAAAAAAAAAAAAAAAAAAABC/6mKAAGAADIHSSInHWVMTgJEIicFZUQPQQATIicHZUyMAkQnHYsCSU4CZ4wAiSInBGVEiwEMQf/qIicdZUSBAwhJjAAlC4ECCCcMTCW6F4sBDkEAGyEEIojzPIsAIwhJjAAlC4ECCCcMTCW6F0L/34sAgQMJjAJC/6mKAQGBA4v/CCMJJQuBAggnDEwluheJigEBIkknB2VEi/8NQQAJi/8jCIj/1IwAiwBMiYoCAYv/IwmBAguBAggnE0yBAroXi/4LgZBOComKAQGAAEmL/0AALiInBGVEMgdLAQmMAIv/iP+sTAkiJxFlREAACosAIQYKjAAhBgqLABZMFlCMAIkijAGL/0EAB4v/iP9sjAGLAUL/w4oBASInBGVEQQAYMgciJwRlRA9BAA0iJwdlRIv/DUEAAiOJIomKAwGL/Yv/iAA+i/+I/39JIltMJVuL/4ECC4ECCCcTTIECuheL/Yv+iAE4C08CC4GQTk8CCwqJigEBIiccZUQiK2VEi/8LD4mKAgApi/5QvkSBMFuL/xJEiYoBACInFmVEMgMTQQAkMQAiJxZlRBJAABcxAIv/EkAADzEAKYv/UL5EVwAgEkEAAyNEiSJC//qKAQEpi/9QSb5EVwAgIicJZURwAEUBQQAOiwC+RIHAA1NAAAMjTIkiQv/6igEAMgoiJwllRHAARIv/D0SJigIAsTIAIicJZUSL/7ISi/6yFLIRgQSyELIBs4mKAQGAAEcCi/9XAgCL/4ECWzIHDUSL/yJZIwkiiwWLBAxBAECBQSOI8UmLBUklC4sDSU4DTFtJTgOMASMISYwCJQtbSYwADEQiJxFlRCEEE0EACosAiwEJIQYYFESLAowFQv+4i/+MAImKAQApi/9QvkSBwANTFESJigIBKYv+UL5EgShbi/8LiYoBASmL/1C+RCRbi/9MiP/fiSIrZURAAAQqIQVniYoCAYAAi/6L/1BJvUUBQQAfiwG+RCJbMgdJjAAOQQAQiwG+RCVbiwAPQQAEI4wAiSJC//kxACInCGVEEkSJIicYZUQURIkiJxdlRBREiYoBAIv/gRQSQAAoi/+BKBJAACCL/4EyEkAAGIv/gTwSQAAQi/+BRhJAAAiL/4FQEkEAAyNEiSJC//o=", - "clear": "DIEBQw==" - }, - "compilerInfo": { - "compiler": "puya", - "compilerVersion": { - "major": 5, - "minor": 7, - "patch": 1 - } - }, - "events": [ - { - "name": "Event", - "args": [ - { - "type": "uint64", - "name": "contract_id" - }, - { - "type": "uint8", - "name": "type" - }, - { - "type": "string", - "name": "type_name" - }, - { - "type": "uint64", - "name": "time" - }, - { - "type": "uint64", - "name": "payoff" - }, - { - "type": "uint64", - "name": "currency_id" - }, - { - "type": "byte[]", - "name": "currency_unit" - }, - { - "type": "uint64", - "name": "nominal_value" - }, - { - "type": "uint16", - "name": "nominal_rate_bps" - }, - { - "type": "uint64", - "name": "nominal_accrued" - } - ], - "desc": "ACTUS Event." - } - ], - "templateVariables": {} -} \ No newline at end of file diff --git a/smart_contracts/artifacts/fixed_coupon_bond/FixedCouponBond.clear.puya.map b/smart_contracts/artifacts/fixed_coupon_bond/FixedCouponBond.clear.puya.map deleted file mode 100644 index d580b5c4..00000000 --- a/smart_contracts/artifacts/fixed_coupon_bond/FixedCouponBond.clear.puya.map +++ /dev/null @@ -1,25 +0,0 @@ -{ - "version": 3, - "sources": [], - "mappings": ";;;", - "op_pc_offset": 0, - "pc_events": { - "1": { - "subroutine": "algopy.arc4.ARC4Contract.clear_state_program", - "params": {}, - "block": "main", - "stack_in": [], - "op": "pushint 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "3": { - "op": "return", - "stack_out": [] - } - } -} \ No newline at end of file diff --git a/smart_contracts/artifacts/fixed_coupon_bond/FixedCouponBond.clear.teal b/smart_contracts/artifacts/fixed_coupon_bond/FixedCouponBond.clear.teal deleted file mode 100644 index a87aa802..00000000 --- a/smart_contracts/artifacts/fixed_coupon_bond/FixedCouponBond.clear.teal +++ /dev/null @@ -1,7 +0,0 @@ -#pragma version 12 -#pragma typetrack false - -// algopy.arc4.ARC4Contract.clear_state_program() -> uint64: -main: - pushint 1 - return diff --git a/smart_contracts/artifacts/fixed_coupon_bond/fixed_coupon_bond_client.py b/smart_contracts/artifacts/fixed_coupon_bond/fixed_coupon_bond_client.py deleted file mode 100644 index 2fe8cab0..00000000 --- a/smart_contracts/artifacts/fixed_coupon_bond/fixed_coupon_bond_client.py +++ /dev/null @@ -1,3966 +0,0 @@ -# flake8: noqa -# fmt: off -# mypy: ignore-errors -# This file was automatically generated by algokit-client-generator. -# DO NOT MODIFY IT BY HAND. -# requires: algokit-utils@^3.0.0 - -# common -import dataclasses -import typing -# core algosdk -import algosdk -from algosdk.transaction import OnComplete -from algosdk.atomic_transaction_composer import TransactionSigner -from algosdk.source_map import SourceMap -from algosdk.transaction import Transaction -from algosdk.v2client.models import SimulateTraceConfig -# utils -import algokit_utils -from algokit_utils import AlgorandClient as _AlgoKitAlgorandClient - -_APP_SPEC_JSON = r"""{"arcs": [22, 28], "bareActions": {"call": [], "create": []}, "methods": [{"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "desc": "Denomination asset identifier", "name": "denomination_asset_id"}, {"type": "uint64", "desc": "Settlement asset identifier", "name": "settlement_asset_id"}, {"type": "uint64", "desc": "Principal, expressed in denomination asset", "name": "principal"}, {"type": "uint64", "desc": "Principal discount in bps", "name": "principal_discount"}, {"type": "uint64", "desc": "Minimum denomination, expressed in denomination asset", "name": "minimum_denomination"}, {"type": "uint8", "desc": "Day-count convention for interests calculation", "name": "day_count_convention"}, {"type": "uint16", "desc": "Interest rate in bps", "name": "interest_rate"}, {"type": "uint16[]", "desc": "Coupon interest rates in bps", "name": "coupon_rates"}, {"type": "uint64[]", "desc": "Time events (strictly ascending order)", "name": "time_events"}, {"type": "(uint64,uint64)[]", "desc": "Time periods of recurring time events", "name": "time_periods"}], "name": "asset_config", "returns": {"type": "void"}, "desc": "Configure the Debt Algorand Standard Application", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "uint64", "desc": "Account's units for the current value calculation", "name": "units"}], "name": "get_account_units_current_value", "returns": {"type": "(uint64,uint64,(uint64,uint64))", "desc": "Units current value in denomination asset, Accrued interest in denomination asset", "struct": "CurrentUnitsValue"}, "desc": "Get account's units current value and accrued interest", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_coupon_rates", "returns": {"type": "uint16[]", "desc": "Coupon rates"}, "desc": "Get D-ASA coupon rates", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}], "name": "get_payment_amount", "returns": {"type": "(uint64,uint64)", "desc": "Interest amount in denomination asset, Principal amount in denomination asset", "struct": "PaymentAmounts"}, "desc": "Get the next payment amount", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_coupons_status", "returns": {"type": "(uint64,uint64,uint64,(uint64,uint64),bool)", "desc": "Total coupons, Due coupons, Next coupon due date, (Day count factor numerator, Day count factor denominator), All due coupons paid", "struct": "CouponsInfo"}, "desc": "Get D-ASA coupons status", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "byte[]", "desc": "Additional payment information (Optional)", "name": "payment_info"}], "name": "pay_coupon", "returns": {"type": "(uint64,uint64,byte[])", "desc": "Paid coupon amount in denomination asset, Payment timestamp, Payment context", "struct": "PaymentResult"}, "desc": "Pay due coupon to an account", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint8", "name": "type"}, {"type": "string", "name": "type_name"}, {"type": "uint64", "name": "time"}, {"type": "uint64", "name": "payoff"}, {"type": "uint64", "name": "currency_id"}, {"type": "byte[]", "name": "currency_unit"}, {"type": "uint64", "name": "nominal_value"}, {"type": "uint16", "name": "nominal_rate_bps"}, {"type": "uint64", "name": "nominal_accrued"}], "name": "Event", "desc": "ACTUS Event."}], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "byte[]", "desc": "Additional payment information (Optional)", "name": "payment_info"}], "name": "pay_principal", "returns": {"type": "(uint64,uint64,byte[])", "desc": "Paid principal amount in denomination asset, Payment timestamp, Payment context", "struct": "PaymentResult"}, "desc": "Pay the outstanding principal to an account", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint8", "name": "type"}, {"type": "string", "name": "type_name"}, {"type": "uint64", "name": "time"}, {"type": "uint64", "name": "payoff"}, {"type": "uint64", "name": "currency_id"}, {"type": "byte[]", "name": "currency_unit"}, {"type": "uint64", "name": "nominal_value"}, {"type": "uint16", "name": "nominal_rate_bps"}, {"type": "uint64", "name": "nominal_accrued"}], "name": "Event", "desc": "ACTUS Event."}], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Sender Account Holding Address", "name": "sender_holding_address"}, {"type": "address", "desc": "Receiver Account Holding Address", "name": "receiver_holding_address"}, {"type": "uint64", "desc": "Amount of D-ASA units to transfer", "name": "units"}], "name": "asset_transfer", "returns": {"type": "uint64", "desc": "Transferred actualized value in denomination asset"}, "desc": "Transfer D-ASA units between accounts", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": [], "create": ["NoOp"]}, "args": [{"type": "address", "desc": "D-ASA Arranger Address", "name": "arranger"}, {"type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", "desc": "D-ASA metadata", "name": "metadata", "struct": "AssetMetadata"}], "name": "asset_create", "returns": {"type": "void"}, "desc": "Create a new D-ASA", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["UpdateApplication"], "create": []}, "args": [{"type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", "name": "metadata", "struct": "AssetMetadata"}], "name": "asset_update", "returns": {"type": "void"}, "desc": "Update D-ASA application.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64[]", "desc": "Secondary market time events (strictly ascending order)", "name": "secondary_market_time_events"}], "name": "set_secondary_time_events", "returns": {"type": "(uint64,uint64)", "desc": "Secondary Market Opening Date, Secondary Market Closure Date", "struct": "SecondaryMarketSchedule"}, "desc": "Set secondary market time schedule", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Default status", "name": "defaulted"}], "name": "set_default_status", "returns": {"type": "uint64"}, "desc": "Set D-ASA default status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "uint64", "desc": "Amount of D-ASA units to distribute", "name": "units"}], "name": "primary_distribution", "returns": {"type": "uint64", "desc": "Remaining D-ASA units to be distributed"}, "desc": "Distribute D-ASA units to accounts according the primary market", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_asset_info", "returns": {"type": "(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)", "desc": "Denomination asset ID, Settlement asset ID, Outstanding principal, Unit nominal value, Day-count convention, Interest rate, Total supply, Circulating supply, Primary distribution opening date, Primary distribution closure date, Issuance date, Maturity date, Suspended, Performance", "struct": "AssetInfo"}, "desc": "Get D-ASA info", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_time_events", "returns": {"type": "uint64[]", "desc": "Time events"}, "desc": "Get D-ASA time events", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_secondary_market_schedule", "returns": {"type": "uint64[]", "desc": "Secondary market schedule"}, "desc": "Get secondary market schedule", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_asset_metadata", "returns": {"type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", "desc": "Contract type, Calendar, Business day convention, End of month convention, Early repayment effect, Early repayment penalty type, Prospectus hash, Prospectus URL", "struct": "AssetMetadata"}, "desc": "Get D-ASA metadata", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "bool", "desc": "Suspension status", "name": "suspended"}], "name": "account_gov_suspension", "returns": {"type": "uint64", "desc": "Timestamp of the set account suspension status"}, "desc": "Set account suspension status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "address", "desc": "Account Payment Address", "name": "payment_address"}], "name": "account_open", "returns": {"type": "uint64", "desc": "Timestamp of the account opening"}, "desc": "Open D-ASA account", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}], "name": "account_close", "returns": {"type": "(uint64,uint64)", "desc": "Closed units, Timestamp of the account closing"}, "desc": "Close D-ASA account", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "address", "desc": "Account Payment Address", "name": "payment_address"}], "name": "account_update_payment_address", "returns": {"type": "uint64", "desc": "Timestamp of the account update"}, "desc": "Update the Payment Address of an account", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}], "name": "account_get_info", "returns": {"type": "(address,uint64,uint64,uint64,bool)", "desc": "Payment Address, D-ASA units, Unit nominal value in denomination asset, Paid coupons, Suspended", "struct": "AccountInfo"}, "desc": "Get account info", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "New Arranger address", "name": "new_arranger"}], "name": "rbac_rotate_arranger", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Rotate the Arranger address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Operation Daemon address", "name": "address"}], "name": "rbac_set_op_daemon", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Non-Normative: Set the Operation Daemon address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}, {"type": "byte[]", "desc": "Role configuration (Optional)", "name": "config"}], "name": "rbac_assign_role", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Assign a role to an address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}], "name": "rbac_revoke_role", "returns": {"type": "uint64", "desc": "Timestamp of the role revocation"}, "desc": "Revoke a role from an address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Suspension status", "name": "suspended"}], "name": "rbac_gov_asset_suspension", "returns": {"type": "uint64", "desc": "Timestamp of the set asset suspension status"}, "desc": "Set asset suspension status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "rbac_get_arranger", "returns": {"type": "address", "desc": "Arranger address"}, "desc": "Get Arranger address", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Address to get roles for", "name": "address"}], "name": "rbac_get_address_roles", "returns": {"type": "(bool,bool,bool,bool,bool)", "desc": "Roles mask: (Account Manager, Primary Dealer, Trustee, Authority, Interest Oracle)"}, "desc": "Non-normative - Get roles assigned to an address", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}], "name": "rbac_get_role_config", "returns": {"type": "(uint64,uint64)", "desc": "Role configuration", "struct": "RoleConfig"}, "desc": "Get role configuration", "events": [], "readonly": true, "recommendations": {}}], "name": "FixedCouponBond", "state": {"keys": {"box": {"time_events": {"key": "dGltZUV2ZW50cw==", "keyType": "AVMBytes", "valueType": "uint64[]"}, "coupon_rates": {"key": "Y291cG9uUmF0ZXM=", "keyType": "AVMBytes", "valueType": "uint16[]"}}, "global": {"arranger": {"key": "UjIwIw==", "keyType": "AVMBytes", "valueType": "address"}, "op_daemon": {"key": "UjI1Iw==", "keyType": "AVMBytes", "valueType": "address"}, "asset_suspended": {"key": "YXNzZXRfc3VzcGVuZGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "asset_defaulted": {"key": "YXNzZXRfZGVmYXVsdGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "total_units": {"key": "dG90YWxfdW5pdHM=", "keyType": "AVMString", "valueType": "AVMUint64"}, "circulating_units": {"key": "Y2lyY3VsYXRpbmdfdW5pdHM=", "keyType": "AVMString", "valueType": "AVMUint64"}, "unit_value": {"key": "dW5pdF92YWx1ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "status": {"key": "c3RhdHVz", "keyType": "AVMString", "valueType": "AVMUint64"}, "denomination_asset_id": {"key": "ZGVub21pbmF0aW9uX2Fzc2V0X2lk", "keyType": "AVMString", "valueType": "AVMUint64"}, "settlement_asset_id": {"key": "c2V0dGxlbWVudF9hc3NldF9pZA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "day_count_convention": {"key": "ZGF5X2NvdW50X2NvbnZlbnRpb24=", "keyType": "AVMString", "valueType": "AVMUint64"}, "metadata": {"key": "bWV0YWRhdGE=", "keyType": "AVMString", "valueType": "AVMBytes"}, "principal_discount": {"key": "cHJpbmNpcGFsX2Rpc2NvdW50", "keyType": "AVMString", "valueType": "AVMUint64"}, "interest_rate": {"key": "aW50ZXJlc3RfcmF0ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "total_coupons": {"key": "dG90YWxfY291cG9ucw==", "keyType": "AVMString", "valueType": "AVMUint64"}, "primary_distribution_opening_date": {"key": "cHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "primary_distribution_closure_date": {"key": "cHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "issuance_date": {"key": "aXNzdWFuY2VfZGF0ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "secondary_market_opening_date": {"key": "c2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGU=", "keyType": "AVMString", "valueType": "AVMUint64"}, "secondary_market_closure_date": {"key": "c2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGU=", "keyType": "AVMString", "valueType": "AVMUint64"}, "maturity_date": {"key": "bWF0dXJpdHlfZGF0ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "paid_coupon_units": {"key": "cGFpZF9jb3Vwb25fdW5pdHM=", "keyType": "AVMString", "valueType": "AVMUint64"}, "due_coupons_watermark": {"key": "ZHVlX2NvdXBvbnNfd2F0ZXJtYXJr", "keyType": "AVMString", "valueType": "AVMUint64"}}, "local": {}}, "maps": {"box": {"account_manager": {"keyType": "address", "valueType": "RoleConfig", "prefix": "UjQwIw=="}, "primary_dealer": {"keyType": "address", "valueType": "RoleConfig", "prefix": "UjUwIw=="}, "trustee": {"keyType": "address", "valueType": "RoleConfig", "prefix": "UjYwIw=="}, "authority": {"keyType": "address", "valueType": "RoleConfig", "prefix": "UjcwIw=="}, "interest_oracle": {"keyType": "address", "valueType": "RoleConfig", "prefix": "UjgwIw=="}, "account": {"keyType": "address", "valueType": "AccountInfo", "prefix": "UjMwIw=="}}, "global": {}, "local": {}}, "schema": {"global": {"bytes": 3, "ints": 20}, "local": {"bytes": 0, "ints": 0}}}, "structs": {"AccountInfo": [{"name": "payment_address", "type": "address"}, {"name": "units", "type": "uint64"}, {"name": "unit_value", "type": "uint64"}, {"name": "paid_coupons", "type": "uint64"}, {"name": "suspended", "type": "bool"}], "AssetInfo": [{"name": "denomination_asset_id", "type": "uint64"}, {"name": "settlement_asset_id", "type": "uint64"}, {"name": "outstanding_principal", "type": "uint64"}, {"name": "unit_value", "type": "uint64"}, {"name": "day_count_convention", "type": "uint8"}, {"name": "principal_discount", "type": "uint16"}, {"name": "interest_rate", "type": "uint16"}, {"name": "total_supply", "type": "uint64"}, {"name": "circulating_supply", "type": "uint64"}, {"name": "primary_distribution_opening_date", "type": "uint64"}, {"name": "primary_distribution_closure_date", "type": "uint64"}, {"name": "issuance_date", "type": "uint64"}, {"name": "maturity_date", "type": "uint64"}, {"name": "suspended", "type": "bool"}, {"name": "performance", "type": "uint8"}], "AssetMetadata": [{"name": "contract_type", "type": "uint8"}, {"name": "calendar", "type": "uint8"}, {"name": "business_day_convention", "type": "uint8"}, {"name": "end_of_month_convention", "type": "uint8"}, {"name": "prepayment_effect", "type": "uint8"}, {"name": "penalty_type", "type": "uint8"}, {"name": "prospectus_hash", "type": "byte[32]"}, {"name": "prospectus_url", "type": "string"}], "CouponsInfo": [{"name": "total_coupons", "type": "uint64"}, {"name": "due_coupons", "type": "uint64"}, {"name": "next_coupon_due_date", "type": "uint64"}, {"name": "day_count_factor", "type": "DayCountFactor"}, {"name": "all_due_coupons_paid", "type": "bool"}], "CurrentUnitsValue": [{"name": "units_value", "type": "uint64"}, {"name": "accrued_interest", "type": "uint64"}, {"name": "day_count_factor", "type": "DayCountFactor"}], "DayCountFactor": [{"name": "numerator", "type": "uint64"}, {"name": "denominator", "type": "uint64"}], "PaymentAmounts": [{"name": "interest", "type": "uint64"}, {"name": "principal", "type": "uint64"}], "PaymentResult": [{"name": "amount", "type": "uint64"}, {"name": "timestamp", "type": "uint64"}, {"name": "context", "type": "byte[]"}], "RoleConfig": [{"name": "role_validity_start", "type": "uint64"}, {"name": "role_validity_end", "type": "uint64"}], "SecondaryMarketSchedule": [{"name": "secondary_market_opening_date", "type": "uint64"}, {"name": "secondary_market_closure_date", "type": "uint64"}]}, "byteCode": {"approval": "DCAHAAEgCP8ByAGAowUmJgQVH3x1BFIzMCMGc3RhdHVzEWNpcmN1bGF0aW5nX3VuaXRzDWlzc3VhbmNlX2RhdGUNbWF0dXJpdHlfZGF0ZQp1bml0X3ZhbHVlDXRvdGFsX2NvdXBvbnMEUjIwIxNzZXR0bGVtZW50X2Fzc2V0X2lkIXByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZR1zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQp0aW1lRXZlbnRzBFI3MCMEUjQwIwt0b3RhbF91bml0cxVkZW5vbWluYXRpb25fYXNzZXRfaWQUZGF5X2NvdW50X2NvbnZlbnRpb24dc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGULY291cG9uUmF0ZXMEUjYwIwRSNTAjBFIyNSMPYXNzZXRfc3VzcGVuZGVkD2Fzc2V0X2RlZmF1bHRlZAhtZXRhZGF0YRJwcmluY2lwYWxfZGlzY291bnQhcHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlEXBhaWRfY291cG9uX3VuaXRzFWR1ZV9jb3Vwb25zX3dhdGVybWFyawIAAAEABFI4MCMNaW50ZXJlc3RfcmF0ZQMGgQECADsEjCmQTgIAEjEYQAB1JwgyA2cnFjIDZycXImcnGCJnJw8iZysiZycGImcqImcnECJnJwkiZycGImcnESJnJxmAAGcnGiJnJyEiZycHImcnCiJnJxsiZycEImcnEiJnJwsiZycFImcnHCJnJx0iZzE1gQMSRDE0gRQSRDE3FEQxNhREgAQl26lbNhoAjgEA4zEZFEQxGEEAzIIcBIlHQTQERDY9SQRTvvBFBGfbTyAE9qlsjQSM8UtRBJx2tqMET9ajzAQdb8JVBCXpmX8EbIXj7gRALbpHBPrSFz4ECO/qNQTkpatUBNwGOzUEFPwQ7wRMET7VBHSnKX8EEFwYTgSC9xstBO8E9dMEA7gzKQQ9voC9BN9U6CwEAQyCmQR0BqzSBMPkspc2GgCOHABWAa0CUgJsAsMDDgQUBQwGsAcvB04H5AizCM0I6AjzCSwJdgmzCeUJ/QoVCi0K6Qt/C54LqQvzAIAEPw78bDYaAI4BBk4AMRmBBBIxGBBEQgZwigIAi/6BCgiLADIMDUEAKrGBBrIQgQWyGScish4nIrIfi/+NAgALAASzQv/bMgCyAUL/9SKyAUL/74mAADYaAUkVJRJEFzYaAkkVJRJEFzYaA0kVJRJEFzYaBEkVJRJEFzYaBUkVJRJEFzYaBkkVIxJENhoHSU4HFYECEkQ2GghJTgdJIllJTgiBAguBAghMFRJENhoJSU4HSSJZSU4IJQuBAghMFRJENhoKSSJZSU4IgRALgQIITBUSRIgOqiIqZUQUREsFcQtFAUQnEEsGZ0sETwYSRCcJSwVnsTIAMgoishKyFE8FshGBBLIQsgGzSwNLAhgURCcGSwJnTwNPAgonD0xnJxpPAmcXSUEAB0khBBJBAHgjRCcRSwFnSwYXRQgiJxplREAAA0sHRCchSwhnSwRJRCcHSwFnJxO8SCcTSwe/gQQISwMSREsDiA09Jwy8SCcMSwG/SVcCAEsBgQJbJwpMZ0sBgQpbJxtMZ0sBgRJbJwRMZ0wiWSMJJQtbJwVMZ0sBFEQqgWRnI0MiQv+FIoAARwQ2GgFJFSQSRDYaAkkVJRJEFyInCmVEQQCDMgciJwplRA9BAHgjRClLAlBJRQm9RQFESUEAY0sHvkQkW0sBD0EAVyNESwFJSwKIDSRFCCJFByJFBCJFBogKe0lFBkxLAYgL8ogLgkEAGksDSYgLLEsDSwNPA4gLlUUHSSJbRQQlW0UFSwIWSwUWUEsHFksHFlBMUChMULAjQyJC/6YiQv+FJx4iKmVEgWQSQQAHJxO+TEUCRChLAVCwI0OAADYaAUcCFSQSRClMUEm9RQFEIkcCKmVEgWQSQQAhSwK+RIEwW0lFBiInB2VEDEEAG0sDiAyOSwUjCIgKhkUCSwEWSwEWUChMULAjQ0sDiAxzRQFC/+mICcBHAogKSUxJiAslTCJMIkyICsFBAA5LBIgKbEkiW0UDJVtFASInB2VESwIWSwIWUEwWSwYWUEsFFlBMUCcfIksFVFAoTFCwI0M2GgFJFSQSRDYaAkkiWYECCEsBFRJEVwIATCIqZUSBZBJEiAxaiAxfKUsBUElOAkm9RQFESb5IJFtJTgNEiAk4TL5EgTBbTEsBDURJiAqYREsBiAvOTCMIiAnHTEmICqmICt1BAJpHAogLAEsDvkRXACBMiAsHSwJJvkSBMFsjCBaBMEy7IiccZURLAggnHExnMggyByInEGVESXEDRCIrZUQiJwZlRAtPBBaAAwgAN1BPBBZQSwQWTEsBUE8EFlBLAxUWVwYCTwRQTCcjUE8DFlAnHlAiFlCABAACSVBQTFAnJExQsDIHFlBLBEkVFlcGAkxQTCclUExQKExQsCNDIkUBQv9wNhoBSRUkEkQ2GgJJIlmBAghLARUSRFcCAEwiKmVEgWQSRIgLVIgLWSlLAVBJTgJJvUUBRL5IJFtEMgciJwVlRA9EiAgtiAmZREmICtBMSYgJsYgJ5UEAmkcCiAoISwK+RFcAIEyICg8iK2VESwJJTgK+RCRbCStMZyIWTCRLAruICqwyCDIHIicQZURJcQNEIitlRCInBmVEC08EFoADAwA3UE8EFlBLBRZMSwFQTwQWUEsDFRZXBgJPBFBMJyNQTwMWUCceUE8DUIAEAAJQUlBMUCckTFCwMgcWUEsDSRUWVwYCTFBMJyVQTFAoTFCwI0MiRQFC/3AiRwKAAEk2GgFJFSQSRDYaAkkVJBJENhoDSRUlEkQXIiplRIFkEkEBIyInEmVEMgcOQQEYIicLZURBAAsyByInC2VEDEEBBSNEMQBLA0lOAhJEiAosiAoxKUsBUElFCUm9RQFEKUsESU4CUElFCkm9RQFESwOICY1LAYgJiE8DTwITREsCSURPAr5ESSRbTwIPRFcoCEUJvkQkW0EAmEsGvkSBKFtLBr5EgShbEkEAgksGvkSBMFtLBr5EgTBbEkEAcCNESwZJvkSBKFtFBYgGqUsESU4CSwGICB9MSwNJTgNPAogHzEUHSwG+RCRbSg5ETAkWSwEkTwK7vkgkW0AAECIWSwdJTgKBKEsCu4EwTLtLBUm+RCRbSwJJTgIIFk8CJE8Cu0sEC0sFCBYoTFCwI0MiQv+NSwVJgShLCrtLB75EVzAIgTBMu0L/eCJC/vg2GgFJFSQSRDYaAkkVSwGBJllJgSgSREsCTEsCUiJZgSoIEkQnCE8CZycZTGcjQzYaAUkVSwGBJllJgSgSREsCTEsCUiJZgSoIEkSICNknGUxnI0MiNhoBRwIiWUklC4ECCE8CFRJEiAi9IiplRCEFEhREiAi7SUQjDUEABkmIB8tFASInBGVESwFJVwIARQSBAltMSwEORCcSTGciJwVlREEAGiInBWVESwEiWSMJJQtLA0xbTEsBD0QnC0xnIicSZUQiJwtlREwWTBZQKExQsCNDNhoBSRUjEkQiUycUMQCICA9EJxhMZzIHFihMULAjQ4AANhoBSRUkEkQ2GgJJFSUSRBciKmVEgWQSQQB1IicKZUQyB0lFBQ5BAGciJxtlREsDDUEAXCNEJxUxAIgHwkQpSwJQSb1FAUSIB/OIB/hLAUlEIitlREsBCCInD2VESwEPRCtLAWdLAr5EJFtPAggWSwIkTwK7IicGZUQWTwKBKE8CuyInD2VETAkWKExQsCNDIkL/oSIyByInBWVMSU4CTgNEDUEACElBAASBBEUCIicYZURBAASBA0UCIicQZUQiJwllRCIrZUQiJwZlREoLIicRZUQWSZMlDkRXBwEiJxplRBZJk4EQDkRXBgIiJyFlRBZJk4EQDkRXBgIiJw9lRCInCmVEIicbZUQiJwRlRCInBWVEIicXZURLDxZJkyUORFcHAU8OFk8OFlBPCxZQTwsWUE8KUE8JUE8IUE8HFlBPBxZQTwYWUE8FFlBPBBZQTwMWUCcfIk8EVFBMUChMULAjQyceIiplRIFkEkEABycMvkxFAkQoSwFQsCNDIicSZUQiJwtlREwWgAIAAkxQTBZQKExQsCNDIicZZUQoTFCwI0M2GgFJFSQSRDYaAkkVIxJEIlMnDTEAiAZDRClPAlBJvUUBREmBOCO6Ik8DVIE4TLsyBxYoTFCwI0M2GgFJFSQSRDYaAkkVJBJEJw4xAIgGDEQiKmVEIQUSFESIBj2IBkIpTwJQSb1FARREIhZPAksBUEsBUExQJx9QvzIHFihMULAjQzYaAUkVJBJEJw4xAIgFykSIBgQpTFBJvUUBREm+SCRbTLxIIitlREsBCStMZ4gFnTIHTBZMFlAoTFCwI0M2GgFJFSQSRDYaAkkVJBJEMQBLAhJEiAXBiAXGKU8CUEm9RQFEIk8CuzIHFihMULAjQzYaAUkVJBJEKUxQSb1FAUS+SChMULAjQzYaAUkVJBJEiAV7JwhMZzIHFihMULAjQzYaAUkVJBJEiAVjJxZMZzIHFihMULAjQzYaAUkVIxJENhoCSU4CFSQSRDYaA0kiWYECCEsBFRJEVwIATIgFL4gFNhdHAogFQIEUEkEADicISwNnMgcWKExQsCNDSYEoEkEAEScOSwNQSb1FARRESwK/Qv/fSYEyEkEAEScVSwNQSb1FARRESwK/Qv/HSYE8EkEAEScUSwNQSb1FARRESwK/Qv+vSYFGEkEAEScNSwNQSb1FARRESwK/Qv+XSYFQEkH/kCcgSwNQSb1FARRESwK/Qv9/NhoBSRUjEkQ2GgJJTgIVJBJEiASFiASMF0cCiASWSYEUE0SBKBJBABUnDksCUEm9RQFEvEgyBxYoTFCwI0NJgTISQQAPJxVLAlBJvUUBRLxIQv/hSYE8EkEADycUSwJQSb1FAUS8SEL/y0mBRhJBAA8nDUsCUEm9RQFEvEhC/7VJgVASQf+uJyBLAlBJvUUBRLxIQv+fNhoBSRUjEkQiUycNMQCIA79EJxdMZzIHFihMULAjQyInCGVEKExQsCNDNhoBSRUkEkQnDksBiAOXJxVLAogDkCcUSwOIA4knDUsEiAOCJyBPBYgDeycfIk8GVCNPBVSBAk8EVIEDTwNUgQRPAlQoTFCwI0M2GgFJFSMSRDYaAklOAhUkEkQXSYgDk4MGFCgyPEZQTwaOBgBPAEAAMQAiABMAAQAnIEsBUEm9RQFEvkgoTFCwI0MnDUsBUEm9RQFEvkhC/+snFEsBUEm9RQFEvkhC/9wnFUsBUEm9RQFEvkhC/80nDksBUEm9RQFEvkhC/76AEAAAAAAAAAAAAAAAAAAAAABC/6mKAAGAADIHSSInHWVMTgJEIicFZUQPQQATIicHZUyMAkQnHYsCSU4CZ4wAiSInBGVEiwEMQf/qIicdZUSBAwhJjAAlC4ECCCcMTCW6F4sBDkEAGyEEIojzPIsAIwhJjAAlC4ECCCcMTCW6F0L/34sAgQMJjAJC/6mKAQGBA4v/CCMJJQuBAggnDEwluheJigEBIkknB2VEi/8NQQAJi/8jCIj/1IwAiwBMiYoCAYv/IwmBAguBAggnE0yBAroXi/4LgZBOComKAQGAAEmL/0AALiInBGVEMgdLAQmMAIv/iP+sTAkiJxFlREAACosAIQYKjAAhBgqLABZMFlCMAIkijAGL/0EAB4v/iP9sjAGLAUL/w4oBASInBGVEQQAYMgciJwRlRA9BAA0iJwdlRIv/DUEAAiOJIomKAwGL/Yv/iAA+i/+I/39JIltMJVuL/4ECC4ECCCcTTIECuheL/Yv+iAE4C08CC4GQTk8CCwqJigEBIiccZUQiK2VEi/8LD4mKAgApi/5QvkSBMFuL/xJEiYoBACInFmVEMgMTQQAkMQAiJxZlRBJAABcxAIv/EkAADzEAKYv/UL5EVwAgEkEAAyNEiSJC//qKAQEpi/9QSb5EVwAgIicJZURwAEUBQQAOiwC+RIHAA1NAAAMjTIkiQv/6igEAMgoiJwllRHAARIv/D0SJigIAsTIAIicJZUSL/7ISi/6yFLIRgQSyELIBs4mKAQGAAEcCi/9XAgCL/4ECWzIHDUSL/yJZIwkiiwWLBAxBAECBQSOI8UmLBUklC4sDSU4DTFtJTgOMASMISYwCJQtbSYwADEQiJxFlRCEEE0EACosAiwEJIQYYFESLAowFQv+4i/+MAImKAQApi/9QvkSBwANTFESJigIBKYv+UL5EgShbi/8LiYoBASmL/1C+RCRbi/9MiP/fiSIrZURAAAQqIQVniYoCAYAAi/6L/1BJvUUBQQAfiwG+RCJbMgdJjAAOQQAQiwG+RCVbiwAPQQAEI4wAiSJC//kxACInCGVEEkSJIicYZUQURIkiJxdlRBREiYoBAIv/gRQSQAAoi/+BKBJAACCL/4EyEkAAGIv/gTwSQAAQi/+BRhJAAAiL/4FQEkEAAyNEiSJC//o=", "clear": "DIEBQw=="}, "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint8", "name": "type"}, {"type": "string", "name": "type_name"}, {"type": "uint64", "name": "time"}, {"type": "uint64", "name": "payoff"}, {"type": "uint64", "name": "currency_id"}, {"type": "byte[]", "name": "currency_unit"}, {"type": "uint64", "name": "nominal_value"}, {"type": "uint16", "name": "nominal_rate_bps"}, {"type": "uint64", "name": "nominal_accrued"}], "name": "Event", "desc": "ACTUS Event."}], "networks": {}, "source": {"approval": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgMzIgOCAyNTUgMjAwIDg2NDAwCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUgMHg1MjMzMzAyMyAic3RhdHVzIiAiY2lyY3VsYXRpbmdfdW5pdHMiICJpc3N1YW5jZV9kYXRlIiAibWF0dXJpdHlfZGF0ZSIgInVuaXRfdmFsdWUiICJ0b3RhbF9jb3Vwb25zIiAweDUyMzIzMDIzICJzZXR0bGVtZW50X2Fzc2V0X2lkIiAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIiAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMgMHg1MjM3MzAyMyAweDUyMzQzMDIzICJ0b3RhbF91bml0cyIgImRlbm9taW5hdGlvbl9hc3NldF9pZCIgImRheV9jb3VudF9jb252ZW50aW9uIiAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiIDB4NjM2Zjc1NzA2ZjZlNTI2MTc0NjU3MyAweDUyMzYzMDIzIDB4NTIzNTMwMjMgMHg1MjMyMzUyMyAiYXNzZXRfc3VzcGVuZGVkIiAiYXNzZXRfZGVmYXVsdGVkIiAibWV0YWRhdGEiICJwcmluY2lwYWxfZGlzY291bnQiICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUiICJwYWlkX2NvdXBvbl91bml0cyIgImR1ZV9jb3Vwb25zX3dhdGVybWFyayIgMHgwMDAwIDB4MDAgMHg1MjM4MzAyMyAiaW50ZXJlc3RfcmF0ZSIgMHgwNjgxMDEgMHgwMDNiIDB4OGMyOTkwNGUgMHgwMDEyCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzAtMzEKICAgIC8vICMgUkJBQyBSb2xlcwogICAgLy8gc2VsZi5hcnJhbmdlciA9IEdsb2JhbFN0YXRlKEFjY291bnQoKSwga2V5PWNzdC5QUkVGSVhfSURfQVJSQU5HRVIpCiAgICBieXRlYyA4IC8vIDB4NTIzMjMwMjMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMgogICAgLy8gc2VsZi5vcF9kYWVtb24gPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX09QX0RBRU1PTikKICAgIGJ5dGVjIDIyIC8vIDB4NTIzMjM1MjMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo0Ny00OAogICAgLy8gIyBELUFTQSBHb3Zlcm5hbmNlCiAgICAvLyBzZWxmLmFzc2V0X3N1c3BlbmRlZCA9IEZhbHNlCiAgICBieXRlYyAyMyAvLyAiYXNzZXRfc3VzcGVuZGVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NDkKICAgIC8vIHNlbGYuYXNzZXRfZGVmYXVsdGVkID0gRmFsc2UKICAgIGJ5dGVjIDI0IC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxOQogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNSAvLyAidG90YWxfdW5pdHMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMAogICAgLy8gc2VsZi5jaXJjdWxhdGluZ191bml0cyA9IFVJbnQ2NCgpCiAgICBieXRlY18zIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxCiAgICAvLyBzZWxmLnVuaXRfdmFsdWUgPSBVSW50NjQoKQogICAgYnl0ZWMgNiAvLyAidW5pdF92YWx1ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIyCiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbm0uU1RBVFVTX0lOQUNUSVZFKQogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMS0zMgogICAgLy8gIyBBc3NldCBDb25maWd1cmF0aW9uCiAgICAvLyBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCA9IEFzc2V0KCkKICAgIGJ5dGVjIDE2IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMzCiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBBc3NldCgpCiAgICBieXRlYyA5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozNAogICAgLy8gc2VsZi51bml0X3ZhbHVlID0gVUludDY0KCkKICAgIGJ5dGVjIDYgLy8gInVuaXRfdmFsdWUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjM1CiAgICAvLyBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uID0gVUludDY0KCkKICAgIGJ5dGVjIDE3IC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzctMzgKICAgIC8vICMgTWV0YWRhdGEKICAgIC8vIHNlbGYubWV0YWRhdGEgPSBCeXRlcygpCiAgICBieXRlYyAyNSAvLyAibWV0YWRhdGEiCiAgICBwdXNoYnl0ZXMgMHgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MC00MQogICAgLy8gIyBQcmluY2lwYWwgLyBSYXRlcwogICAgLy8gc2VsZi5wcmluY2lwYWxfZGlzY291bnQgPSBVSW50NjQoKQogICAgYnl0ZWMgMjYgLy8gInByaW5jaXBhbF9kaXNjb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDIKICAgIC8vIHNlbGYuaW50ZXJlc3RfcmF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAzMyAvLyAiaW50ZXJlc3RfcmF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDMKICAgIC8vIHNlbGYudG90YWxfY291cG9ucyA9IFVJbnQ2NCgpCiAgICBieXRlYyA3IC8vICJ0b3RhbF9jb3Vwb25zIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0NwogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMTAgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDgKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDI3IC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQ5CiAgICAvLyBzZWxmLmlzc3VhbmNlX2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgNCAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NTAKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMTggLy8gInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo1MQogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAxMSAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjUyCiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgNSAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MjQKICAgIC8vIHNlbGYucGFpZF9jb3Vwb25fdW5pdHMgPSBVSW50NjQoKQogICAgYnl0ZWMgMjggLy8gInBhaWRfY291cG9uX3VuaXRzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxMDIKICAgIC8vIHNlbGYuZHVlX2NvdXBvbnNfd2F0ZXJtYXJrID0gVUludDY0KCkKICAgIGJ5dGVjIDI5IC8vICJkdWVfY291cG9uc193YXRlcm1hcmsiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozMwogICAgLy8gYXNzZXJ0IFR4bi5nbG9iYWxfbnVtX2J5dGVfc2xpY2UgPT0gY2ZnLkdMT0JBTF9CWVRFUywgZXJyLldST05HX0dMT0JBTF9CWVRFUwogICAgdHhuIEdsb2JhbE51bUJ5dGVTbGljZQogICAgcHVzaGludCAzCiAgICA9PQogICAgYXNzZXJ0IC8vIFdyb25nIEdsb2JhbCBCeXRlcyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzQKICAgIC8vIGFzc2VydCBUeG4uZ2xvYmFsX251bV91aW50ID09IGNmZy5HTE9CQUxfVUlOVFMsIGVyci5XUk9OR19HTE9CQUxfVUlOVFMKICAgIHR4biBHbG9iYWxOdW1VaW50CiAgICBwdXNoaW50IDIwCiAgICA9PQogICAgYXNzZXJ0IC8vIFdyb25nIEdsb2JhbCBVSW50cyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzUKICAgIC8vIGFzc2VydCBUeG4ubG9jYWxfbnVtX2J5dGVfc2xpY2UgPT0gY2ZnLkxPQ0FMX0JZVEVTLCBlcnIuV1JPTkdfTE9DQUxfQllURVMKICAgIHR4biBMb2NhbE51bUJ5dGVTbGljZQogICAgIQogICAgYXNzZXJ0IC8vIFdyb25nIExvY2FsIEJ5dGVzIGFsbG9jYXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozNgogICAgLy8gYXNzZXJ0IFR4bi5sb2NhbF9udW1fdWludCA9PSBjZmcuTE9DQUxfVUlOVFMsIGVyci5XUk9OR19MT0NBTF9VSU5UUwogICAgdHhuIExvY2FsTnVtVWludAogICAgIQogICAgYXNzZXJ0IC8vIFdyb25nIExvY2FsIFVJbnRzIGFsbG9jYXRpb24KCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE3LTMwCiAgICAvLyBjbGFzcyBGaXhlZENvdXBvbkJvbmQoCiAgICAvLyAgICAgUEFNQ29yZU1peGluLAogICAgLy8gICAgIEZpeGVkQ291cG9uQ2FzaGZsb3dNaXhpbiwKICAgIC8vICAgICBDb3Vwb25QYXltZW50QWdlbnRNaXhpbiwKICAgIC8vICAgICBQcmluY2lwYWxQYXltZW50QWdlbnRNaXhpbiwKICAgIC8vICAgICBDb3Vwb25UcmFuc2ZlckFnZW50TWl4aW4sCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyAgICAgYXZtX3ZlcnNpb249MTIsCiAgICAvLyApOgogICAgcHVzaGJ5dGVzIDB4MjVkYmE5NWIgLy8gbWV0aG9kICJhc3NldF91cGRhdGUoKHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LGJ5dGVbMzJdLHN0cmluZykpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fYXNzZXRfdXBkYXRlX3JvdXRlQDQKCm1haW5fc3dpdGNoX2Nhc2VfbmV4dEA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE3LTMwCiAgICAvLyBjbGFzcyBGaXhlZENvdXBvbkJvbmQoCiAgICAvLyAgICAgUEFNQ29yZU1peGluLAogICAgLy8gICAgIEZpeGVkQ291cG9uQ2FzaGZsb3dNaXhpbiwKICAgIC8vICAgICBDb3Vwb25QYXltZW50QWdlbnRNaXhpbiwKICAgIC8vICAgICBQcmluY2lwYWxQYXltZW50QWdlbnRNaXhpbiwKICAgIC8vICAgICBDb3Vwb25UcmFuc2ZlckFnZW50TWl4aW4sCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyAgICAgYXZtX3ZlcnNpb249MTIsCiAgICAvLyApOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYnogbWFpbl9jcmVhdGVfTm9PcEAzNgogICAgcHVzaGJ5dGVzcyAweDg5NDc0MTM0IDB4NDQzNjNkNDkgMHg1M2JlZjA0NSAweDY3ZGI0ZjIwIDB4ZjZhOTZjOGQgMHg4Y2YxNGI1MSAweDljNzZiNmEzIDB4NGZkNmEzY2MgMHgxZDZmYzI1NSAweDI1ZTk5OTdmIDB4NmM4NWUzZWUgMHg0MDJkYmE0NyAweGZhZDIxNzNlIDB4MDhlZmVhMzUgMHhlNGE1YWI1NCAweGRjMDYzYjM1IDB4MTRmYzEwZWYgMHg0YzExM2VkNSAweDc0YTcyOTdmIDB4MTA1YzE4NGUgMHg4MmY3MWIyZCAweGVmMDRmNWQzIDB4MDNiODMzMjkgMHgzZGJlODBiZCAweGRmNTRlODJjIDB4MDEwYzgyOTkgMHg3NDA2YWNkMiAweGMzZTRiMjk3IC8vIG1ldGhvZCAiYXNzZXRfY29uZmlnKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDgsdWludDE2LHVpbnQxNltdLHVpbnQ2NFtdLCh1aW50NjQsdWludDY0KVtdKXZvaWQiLCBtZXRob2QgImdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWUoYWRkcmVzcyx1aW50NjQpKHVpbnQ2NCx1aW50NjQsKHVpbnQ2NCx1aW50NjQpKSIsIG1ldGhvZCAiZ2V0X2NvdXBvbl9yYXRlcygpdWludDE2W10iLCBtZXRob2QgImdldF9wYXltZW50X2Ftb3VudChhZGRyZXNzKSh1aW50NjQsdWludDY0KSIsIG1ldGhvZCAiZ2V0X2NvdXBvbnNfc3RhdHVzKCkodWludDY0LHVpbnQ2NCx1aW50NjQsKHVpbnQ2NCx1aW50NjQpLGJvb2wpIiwgbWV0aG9kICJwYXlfY291cG9uKGFkZHJlc3MsYnl0ZVtdKSh1aW50NjQsdWludDY0LGJ5dGVbXSkiLCBtZXRob2QgInBheV9wcmluY2lwYWwoYWRkcmVzcyxieXRlW10pKHVpbnQ2NCx1aW50NjQsYnl0ZVtdKSIsIG1ldGhvZCAiYXNzZXRfdHJhbnNmZXIoYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInNldF9zZWNvbmRhcnlfdGltZV9ldmVudHModWludDY0W10pKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJzZXRfZGVmYXVsdF9zdGF0dXMoYm9vbCl1aW50NjQiLCBtZXRob2QgInByaW1hcnlfZGlzdHJpYnV0aW9uKGFkZHJlc3MsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X2luZm8oKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDgsdWludDE2LHVpbnQxNix1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxib29sLHVpbnQ4KSIsIG1ldGhvZCAiZ2V0X3RpbWVfZXZlbnRzKCl1aW50NjRbXSIsIG1ldGhvZCAiZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGUoKXVpbnQ2NFtdIiwgbWV0aG9kICJnZXRfYXNzZXRfbWV0YWRhdGEoKSh1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCxieXRlWzMyXSxzdHJpbmcpIiwgbWV0aG9kICJhY2NvdW50X2dvdl9zdXNwZW5zaW9uKGFkZHJlc3MsYm9vbCl1aW50NjQiLCBtZXRob2QgImFjY291bnRfb3BlbihhZGRyZXNzLGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X2Nsb3NlKGFkZHJlc3MpKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJhY2NvdW50X3VwZGF0ZV9wYXltZW50X2FkZHJlc3MoYWRkcmVzcyxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAiYWNjb3VudF9nZXRfaW5mbyhhZGRyZXNzKShhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LGJvb2wpIiwgbWV0aG9kICJyYmFjX3JvdGF0ZV9hcnJhbmdlcihhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19zZXRfb3BfZGFlbW9uKGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX2Fzc2lnbl9yb2xlKHVpbnQ4LGFkZHJlc3MsYnl0ZVtdKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19yZXZva2Vfcm9sZSh1aW50OCxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19nb3ZfYXNzZXRfc3VzcGVuc2lvbihib29sKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19nZXRfYXJyYW5nZXIoKWFkZHJlc3MiLCBtZXRob2QgInJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXMoYWRkcmVzcykoYm9vbCxib29sLGJvb2wsYm9vbCxib29sKSIsIG1ldGhvZCAicmJhY19nZXRfcm9sZV9jb25maWcodWludDgsYWRkcmVzcykodWludDY0LHVpbnQ2NCkiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBhc3NldF9jb25maWcgZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZSBnZXRfY291cG9uX3JhdGVzIGdldF9wYXltZW50X2Ftb3VudCBnZXRfY291cG9uc19zdGF0dXMgcGF5X2NvdXBvbiBwYXlfcHJpbmNpcGFsIGFzc2V0X3RyYW5zZmVyIHNldF9zZWNvbmRhcnlfdGltZV9ldmVudHMgc2V0X2RlZmF1bHRfc3RhdHVzIHByaW1hcnlfZGlzdHJpYnV0aW9uIGdldF9hc3NldF9pbmZvIGdldF90aW1lX2V2ZW50cyBnZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZSBnZXRfYXNzZXRfbWV0YWRhdGEgYWNjb3VudF9nb3Zfc3VzcGVuc2lvbiBhY2NvdW50X29wZW4gYWNjb3VudF9jbG9zZSBhY2NvdW50X3VwZGF0ZV9wYXltZW50X2FkZHJlc3MgYWNjb3VudF9nZXRfaW5mbyByYmFjX3JvdGF0ZV9hcnJhbmdlciByYmFjX3NldF9vcF9kYWVtb24gcmJhY19hc3NpZ25fcm9sZSByYmFjX3Jldm9rZV9yb2xlIHJiYWNfZ292X2Fzc2V0X3N1c3BlbnNpb24gcmJhY19nZXRfYXJyYW5nZXIgcmJhY19nZXRfYWRkcmVzc19yb2xlcyByYmFjX2dldF9yb2xlX2NvbmZpZwogICAgZXJyCgptYWluX2NyZWF0ZV9Ob09wQDM2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE3LTMwCiAgICAvLyBjbGFzcyBGaXhlZENvdXBvbkJvbmQoCiAgICAvLyAgICAgUEFNQ29yZU1peGluLAogICAgLy8gICAgIEZpeGVkQ291cG9uQ2FzaGZsb3dNaXhpbiwKICAgIC8vICAgICBDb3Vwb25QYXltZW50QWdlbnRNaXhpbiwKICAgIC8vICAgICBQcmluY2lwYWxQYXltZW50QWdlbnRNaXhpbiwKICAgIC8vICAgICBDb3Vwb25UcmFuc2ZlckFnZW50TWl4aW4sCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyAgICAgYXZtX3ZlcnNpb249MTIsCiAgICAvLyApOgogICAgcHVzaGJ5dGVzIDB4M2YwZWZjNmMgLy8gbWV0aG9kICJhc3NldF9jcmVhdGUoYWRkcmVzcywodWludDgsdWludDgsdWludDgsdWludDgsdWludDgsdWludDgsYnl0ZVszMl0sc3RyaW5nKSl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggYXNzZXRfY3JlYXRlCiAgICBlcnIKCm1haW5fYXNzZXRfdXBkYXRlX3JvdXRlQDQ6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyNzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgNCAvLyBVcGRhdGVBcHBsaWNhdGlvbgogICAgPT0KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0CiAgICBiIGFzc2V0X3VwZGF0ZQoKCi8vIF9wdXlhX2xpYi51dGlsLmVuc3VyZV9idWRnZXQocmVxdWlyZWRfYnVkZ2V0OiB1aW50NjQsIGZlZV9zb3VyY2U6IHVpbnQ2NCkgLT4gdm9pZDoKZW5zdXJlX2J1ZGdldDoKICAgIHByb3RvIDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDEwCiAgICArCgplbnN1cmVfYnVkZ2V0X3doaWxlX3RvcEAxOgogICAgZnJhbWVfZGlnIDAKICAgIGdsb2JhbCBPcGNvZGVCdWRnZXQKICAgID4KICAgIGJ6IGVuc3VyZV9idWRnZXRfYWZ0ZXJfd2hpbGVANgogICAgaXR4bl9iZWdpbgogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGJ5dGVjIDM0IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbQogICAgYnl0ZWMgMzQgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KICAgIGZyYW1lX2RpZyAtMQogICAgc3dpdGNoIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMEAzIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMUA0CgplbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX25leHRANToKICAgIGl0eG5fc3VibWl0CiAgICBiIGVuc3VyZV9idWRnZXRfd2hpbGVfdG9wQDEKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMUA0OgogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgaXR4bl9maWVsZCBGZWUKICAgIGIgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV9uZXh0QDUKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMEAzOgogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBiIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfbmV4dEA1CgplbnN1cmVfYnVkZ2V0X2FmdGVyX3doaWxlQDY6CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzLnBhbS5QQU1Db3JlTWl4aW4uYXNzZXRfY29uZmlnW3JvdXRpbmddKCkgLT4gdm9pZDoKYXNzZXRfY29uZmlnOgogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL2FjdHVzL3BhbS5weToyNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA2CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDcKICAgIGR1cAogICAgY292ZXIgNwogICAgbGVuCiAgICBwdXNoaW50IDIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDE2CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA4CiAgICBkdXAKICAgIGNvdmVyIDcKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgOAogICAgcHVzaGludCAyCiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIHN3YXAKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDE2PgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOQogICAgZHVwCiAgICBjb3ZlciA3CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGNvdmVyIDgKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIHN3YXAKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PHVpbnQ2ND4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEwCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGNvdmVyIDgKICAgIHB1c2hpbnQgMTYKICAgICoKICAgIHB1c2hpbnQgMgogICAgKwogICAgc3dhcAogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8dHVwbGU8dWludDY0LHVpbnQ2ND4+CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyMjcKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjIyOAogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzID09IGVudW1zLlNUQVRVU19JTkFDVElWRSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo1NS01NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBkZW5vbWluYXRpb24gd2l0aCBBU0EKICAgIC8vIF9jcmVhdG9yLCBleGlzdHMgPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF9jcmVhdG9yKGRlbm9taW5hdGlvbl9hc3NldF9pZCkKICAgIGRpZyA1CiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q3JlYXRvcgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo1NwogICAgLy8gYXNzZXJ0IGV4aXN0cywgZXJyLklOVkFMSURfREVOT01JTkFUSU9OCiAgICBhc3NlcnQgLy8gRGVub21pbmF0aW9uIGFzc2V0IGlzIG5vdCBwcm9wZXJseSBzZXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjYwCiAgICAvLyBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCA9IGRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgYnl0ZWMgMTYgLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGRpZyA2CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NjUKICAgIC8vIHNldHRsZW1lbnRfYXNzZXRfaWQgPT0gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIGRpZyA0CiAgICB1bmNvdmVyIDYKICAgID09CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo2My02NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHNldHRsZW1lbnQgYXNzZXQgaXMgdGhlIGRlbm9taW5hdGlvbiBhc3NldAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZXR0bGVtZW50X2Fzc2V0X2lkID09IHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICAvLyApLCBlcnIuSU5WQUxJRF9TRVRUTEVNRU5UX0FTU0VUCiAgICBhc3NlcnQgLy8gRGlmZmVyZW50IHNldHRsZW1lbnQgYXNzZXQgbm90IHN1cHBvcnRlZCwgbXVzdCBiZSBlcXVhbCB0byBkZW5vbWluYXRpb24gYXNzZXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjY5CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBzZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBieXRlYyA5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgZGlnIDUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3MC03NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhc3NldF9hbW91bnQ9MCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NzUKICAgIC8vIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3MwogICAgLy8gYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3NAogICAgLy8gYXNzZXRfYW1vdW50PTAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICB1bmNvdmVyIDUKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3MC03MQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3MC03NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhc3NldF9hbW91bnQ9MCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjIzOC0yMzkKICAgIC8vICMgU2V0IFByaW5jaXBhbCBhbmQgTWluaW11bSBEZW5vbWluYXRpb24KICAgIC8vIGFzc2VydCBwcmluY2lwYWwgJSBtaW5pbXVtX2Rlbm9taW5hdGlvbiA9PSAwLCBlcnIuSU5WQUxJRF9NSU5JTVVNX0RFTk9NSU5BVElPTgogICAgZGlnIDMKICAgIGRpZyAyCiAgICAlCiAgICAhCiAgICBhc3NlcnQgLy8gTWluaW11bSBkZW5vbWluYXRpb24gaXMgbm90IGEgZGl2aXNvciBvZiBwcmluY2lwYWwKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI0MAogICAgLy8gc2VsZi51bml0X3ZhbHVlID0gbWluaW11bV9kZW5vbWluYXRpb24KICAgIGJ5dGVjIDYgLy8gInVuaXRfdmFsdWUiCiAgICBkaWcgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI0MQogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IHByaW5jaXBhbCAvLyBtaW5pbXVtX2Rlbm9taW5hdGlvbgogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIC8KICAgIGJ5dGVjIDE1IC8vICJ0b3RhbF91bml0cyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyNDIKICAgIC8vIHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50ID0gcHJpbmNpcGFsX2Rpc2NvdW50CiAgICBieXRlYyAyNiAvLyAicHJpbmNpcGFsX2Rpc2NvdW50IgogICAgdW5jb3ZlciAyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MjQ0LTI0NQogICAgLy8gIyBTZXQgRGF5LUNvdW50IENvbnZlbnRpb24KICAgIC8vIHNlbGYuYXNzZXJ0X2RheV9jb3VudF9jb252ZW50aW9uKGRheV9jb3VudF9jb252ZW50aW9uLmFzX3VpbnQ2NCgpKQogICAgYnRvaQogICAgZHVwCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3OS04MwogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIG9ubHkgdGhlIEFjdHVhbC9BY3R1YWwgYW5kIENvbnRpbnVvdXMgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0FfQSksCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQ09OVCksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9EQVlfQ09VTlRfQ09OVkVOVElPTgogICAgYnogYXNzZXRfY29uZmlnX2Jvb2xfdHJ1ZUAzCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjgyCiAgICAvLyBVSW50NjQoY3N0LkRDQ19DT05UKSwKICAgIGludGMgNCAvLyAyNTUKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5Ojc5LTgzCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgb25seSB0aGUgQWN0dWFsL0FjdHVhbCBhbmQgQ29udGludW91cyBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGFzc2VydCBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQV9BKSwKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19DT05UKSwKICAgIC8vICksIGVyci5JTlZBTElEX0RBWV9DT1VOVF9DT05WRU5USU9OCiAgICA9PQogICAgYnogYXNzZXRfY29uZmlnX2Jvb2xfZmFsc2VANAoKYXNzZXRfY29uZmlnX2Jvb2xfdHJ1ZUAzOgogICAgaW50Y18xIC8vIDEKCmFzc2V0X2NvbmZpZ19ib29sX21lcmdlQDU6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3OS04MwogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIG9ubHkgdGhlIEFjdHVhbC9BY3R1YWwgYW5kIENvbnRpbnVvdXMgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0FfQSksCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQ09OVCksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9EQVlfQ09VTlRfQ09OVkVOVElPTgogICAgYXNzZXJ0IC8vIEludmFsaWQgZGF5LWNvdW50IGNvbnZlbnRpb24gSUQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5Ojg2CiAgICAvLyBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uID0gZGF5X2NvdW50X2NvbnZlbnRpb24KICAgIGJ5dGVjIDE3IC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MjQ4LTI0OQogICAgLy8gIyBTZXQgSW50ZXJlc3QgUmF0ZQogICAgLy8gc2VsZi5hc3NlcnRfaW50ZXJlc3RfcmF0ZShpbnRlcmVzdF9yYXRlLmFzX3VpbnQ2NCgpKQogICAgZGlnIDYKICAgIGJ0b2kKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6ODktOTAKICAgIC8vICMgVGhpcyBzdWJyb3V0aW5lIG11c3QgYmUgdXNlZCBhZnRlciB0aGUgcHJpbmNpcGFsIGRpc2NvdW50IGhhcyBiZWVuIHNldAogICAgLy8gaWYgbm90IHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI2IC8vICJwcmluY2lwYWxfZGlzY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50IGV4aXN0cwogICAgYm56IGFzc2V0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDcKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjkxCiAgICAvLyBhc3NlcnQgaW50ZXJlc3RfcmF0ZSA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfSU5URVJFU1RfUkFURQogICAgZGlnIDcKICAgIGFzc2VydCAvLyBJbnRlcmVzdCByYXRlIGlzIG5vdCBwcm9wZXJseSBkZWZpbmVkCgphc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6OTQKICAgIC8vIHNlbGYuaW50ZXJlc3RfcmF0ZSA9IGludGVyZXN0X3JhdGUKICAgIGJ5dGVjIDMzIC8vICJpbnRlcmVzdF9yYXRlIgogICAgZGlnIDgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxMDUKICAgIC8vIGFzc2VydCBjb3Vwb25fcmF0ZXMubGVuZ3RoLCBlcnIuSU5WQUxJRF9DT1VQT05fUkFURVMKICAgIGRpZyA0CiAgICBkdXAKICAgIGFzc2VydCAvLyBDb3Vwb24gcmF0ZXMgYXJlIG5vdCBwcm9wZXJseSBkZWZpbmVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxMDgKICAgIC8vIHNlbGYudG90YWxfY291cG9ucyA9IGNvdXBvbl9yYXRlcy5sZW5ndGgKICAgIGJ5dGVjIDcgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjEwOQogICAgLy8gc2VsZi5jb3Vwb25fcmF0ZXMudmFsdWUgPSBjb3Vwb25fcmF0ZXMuY29weSgpCiAgICBieXRlYyAxOSAvLyAweDYzNmY3NTcwNmY2ZTUyNjE3NDY1NzMKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgMTkgLy8gMHg2MzZmNzU3MDZmNmU1MjYxNzQ2NTczCiAgICBkaWcgNwogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTA0CiAgICAvLyB0aW1lX2V2ZW50cy5sZW5ndGggPT0gc2VsZi50b3RhbF9jb3Vwb25zICsgY2ZnLlRJTUVfU0NIRURVTEVfTElNSVRTCiAgICBwdXNoaW50IDQKICAgICsKICAgIGRpZyAzCiAgICA9PQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTAzLTEwNQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICB0aW1lX2V2ZW50cy5sZW5ndGggPT0gc2VsZi50b3RhbF9jb3Vwb25zICsgY2ZnLlRJTUVfU0NIRURVTEVfTElNSVRTCiAgICAvLyApLCBlcnIuSU5WQUxJRF9USU1FX0VWRU5UU19MRU5HVEgKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBsZW5ndGggaXMgaW52YWxpZAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MjU4CiAgICAvLyBzZWxmLmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQodGltZV9ldmVudHMpCiAgICBkaWcgMwogICAgY2FsbHN1YiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMjcKICAgIC8vIHNlbGYudGltZV9ldmVudHMudmFsdWUgPSB0aW1lX2V2ZW50cy5jb3B5KCkKICAgIGJ5dGVjIDEyIC8vIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgMTIgLy8gMHg3NDY5NmQ2NTQ1NzY2NTZlNzQ3MwogICAgZGlnIDEKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjEyOC0xMzAKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlID0gdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX09QRU5JTkdfREFURV9JRFgKICAgIC8vIF0KICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxCiAgICBwdXNoaW50IDIKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMjgKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlID0gdGltZV9ldmVudHNbCiAgICBieXRlYyAxMCAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTI4LTEzMAogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgPSB0aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fT1BFTklOR19EQVRFX0lEWAogICAgLy8gXQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjEzMS0xMzMKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlID0gdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX0NMT1NVUkVfREFURV9JRFgKICAgIC8vIF0KICAgIGRpZyAxCiAgICBwdXNoaW50IDEwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTMxCiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgYnl0ZWMgMjcgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjEzMS0xMzMKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlID0gdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX0NMT1NVUkVfREFURV9JRFgKICAgIC8vIF0KICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMzQKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZSA9IHRpbWVfZXZlbnRzW2NmZy5JU1NVQU5DRV9EQVRFX0lEWF0KICAgIGRpZyAxCiAgICBwdXNoaW50IDE4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNCAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMzUKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IHRpbWVfZXZlbnRzW2NmZy5NQVRVUklUWV9EQVRFX0lEWF0KICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA1IC8vICJtYXR1cml0eV9kYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjEzOAogICAgLy8gYXNzZXJ0IG5vdCB0aW1lX3BlcmlvZHMubGVuZ3RoLCBlcnIuSU5WQUxJRF9USU1FX1BFUklPRFMKICAgIGRpZyAxCiAgICAhCiAgICBhc3NlcnQgLy8gVGltZSBwZXJpb2RzIGFyZSBub3QgcHJvcGVybHkgZGVmaW5lZAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MjY1CiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbnVtcy5TVEFUVVNfQUNUSVZFKQogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgcHVzaGludCAxMDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzL3BhbS5weToyNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgphc3NldF9jb25maWdfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXRfY29uZmlnX2Jvb2xfbWVyZ2VANQoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY291cG9uLkZpeGVkQ291cG9uQ2FzaGZsb3dNaXhpbi5nZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZToKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gNAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MjAxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MjIyCiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MjIyLTIyMwogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIGFuZCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgYnogZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjIyMwogICAgLy8gYW5kIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID49IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICA+PQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MjIyLTIyMwogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIGFuZCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgYnogZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDQKICAgIGludGNfMSAvLyAxCgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfbWVyZ2VANToKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjIyMS0yMjQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vICAgICBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vICksIGVyci5OT19QUklNQVJZX0RJU1RSSUJVVElPTgogICAgYXNzZXJ0IC8vIFByaW1hcnkgZGlzdHJpYnV0aW9uIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozMQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgOQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MjI2CiAgICAvLyBhc3NlcnQgMCA8IHVuaXRzIDw9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLCBlcnIuSU5WQUxJRF9VTklUUwogICAgZHVwCiAgICBieiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VAOAogICAgZGlnIDcKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzIgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMQogICAgPj0KICAgIGJ6IGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUA4CiAgICBpbnRjXzEgLy8gMQoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX21lcmdlQDk6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToyMjYKICAgIC8vIGFzc2VydCAwIDwgdW5pdHMgPD0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMsIGVyci5JTlZBTElEX1VOSVRTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhbW91bnQgb2YgdW5pdHMgZm9yIHRoZSBhY2NvdW50CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToyMjgtMjI5CiAgICAvLyAjIFZhbHVlIGR1cmluZyBwcmltYXJ5IGRpc3RyaWJ1dGlvbiBhbmQgYXQgbWF0dXJpdHkKICAgIC8vIGFjY291bnRfdW5pdHNfbm9taW5hbF92YWx1ZSA9IHNlbGYuYWNjb3VudF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MsIHVuaXRzKQogICAgZGlnIDEKICAgIGR1cAogICAgZGlnIDIKICAgIGNhbGxzdWIgYWNjb3VudF91bml0c192YWx1ZQogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToyMzAtMjMxCiAgICAvLyAjIEFjY3J1aW5nIGludGVyZXN0IGR1cmluZyBwcmltYXJ5IGRpc3RyaWJ1dGlvbiBhbmQgYXQgbWF0dXJpdHkKICAgIC8vIGFjY3J1ZWRfaW50ZXJlc3QgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MjMyCiAgICAvLyBudW1lcmF0b3IgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MjMzCiAgICAvLyBkZW5vbWluYXRvciA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToyMzUtMjM2CiAgICAvLyAjIEFjY3J1aW5nIGludGVyZXN0CiAgICAvLyBkdWVfY291cG9ucyA9IHNlbGYuY291bnRfZHVlX2NvdXBvbnMoKQogICAgY2FsbHN1YiBjb3VudF9kdWVfY291cG9ucwogICAgZHVwCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjIzNwogICAgLy8gc2VsZi5hc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudChob2xkaW5nX2FkZHJlc3MsIGR1ZV9jb3Vwb25zKQogICAgc3dhcAogICAgZGlnIDEKICAgIGNhbGxzdWIgYXNzZXJ0X25vX3BlbmRpbmdfY291cG9uX3BheW1lbnQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjIzOAogICAgLy8gaWYgc2VsZi5pc19hY2NydWluZ19pbnRlcmVzdChkdWVfY291cG9ucyk6CiAgICBjYWxsc3ViIGlzX2FjY3J1aW5nX2ludGVyZXN0CiAgICBieiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2FmdGVyX2lmX2Vsc2VAMTEKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjIzOQogICAgLy8gZGF5X2NvdW50X2ZhY3RvciA9IHNlbGYuZGF5X2NvdW50X2ZhY3RvcihkdWVfY291cG9ucykKICAgIGRpZyAzCiAgICBkdXAKICAgIGNhbGxzdWIgZGF5X2NvdW50X2ZhY3RvcgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MjQwLTI0MgogICAgLy8gYWNjcnVlZF9pbnRlcmVzdCA9IHNlbGYuYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQoCiAgICAvLyAgICAgaG9sZGluZ19hZGRyZXNzLCB1bml0cywgZHVlX2NvdXBvbnMKICAgIC8vICkKICAgIGRpZyAzCiAgICBkaWcgMwogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIGFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50CiAgICBidXJ5IDcKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjI0MwogICAgLy8gbnVtZXJhdG9yID0gZGF5X2NvdW50X2ZhY3Rvci5udW1lcmF0b3IKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBidXJ5IDQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjI0NAogICAgLy8gZGVub21pbmF0b3IgPSBkYXlfY291bnRfZmFjdG9yLmRlbm9taW5hdG9yCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgNQoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MjQ5LTI1MgogICAgLy8gZGF5X2NvdW50X2ZhY3Rvcj10eXAuRGF5Q291bnRGYWN0b3IoCiAgICAvLyAgICAgbnVtZXJhdG9yPW51bWVyYXRvciwKICAgIC8vICAgICBkZW5vbWluYXRvcj1kZW5vbWluYXRvciwKICAgIC8vICksCiAgICBkaWcgMgogICAgaXRvYgogICAgZGlnIDUKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MjQ2LTI1MwogICAgLy8gcmV0dXJuIHR5cC5DdXJyZW50VW5pdHNWYWx1ZSgKICAgIC8vICAgICB1bml0c192YWx1ZT1hY2NvdW50X3VuaXRzX25vbWluYWxfdmFsdWUsCiAgICAvLyAgICAgYWNjcnVlZF9pbnRlcmVzdD1hY2NydWVkX2ludGVyZXN0LAogICAgLy8gICAgIGRheV9jb3VudF9mYWN0b3I9dHlwLkRheUNvdW50RmFjdG9yKAogICAgLy8gICAgICAgICBudW1lcmF0b3I9bnVtZXJhdG9yLAogICAgLy8gICAgICAgICBkZW5vbWluYXRvcj1kZW5vbWluYXRvciwKICAgIC8vICAgICApLAogICAgLy8gKQogICAgZGlnIDcKICAgIGl0b2IKICAgIGRpZyA3CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MjAxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUA4OgogICAgaW50Y18wIC8vIDAKICAgIGIgZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX21lcmdlQDkKCmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX21lcmdlQDUKCgovLyBtb2R1bGVzLmNvcmVfZmluYW5jaWFsLmNvdXBvbi5GaXhlZENvdXBvbkNhc2hmbG93TWl4aW4uZ2V0X2NvdXBvbl9yYXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9jb3Vwb25fcmF0ZXM6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToyNjMKICAgIC8vIGNvdXBvbl9yYXRlcyA9IHR5cC5Db3Vwb25SYXRlcygpCiAgICBieXRlYyAzMCAvLyAweDAwMDAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGVubS5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgMTAwCiAgICA9PQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MjY0CiAgICAvLyBpZiBzZWxmLnN0YXR1c19pc19hY3RpdmUoKToKICAgIGJ6IGdldF9jb3Vwb25fcmF0ZXNfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToyNjUKICAgIC8vIGNvdXBvbl9yYXRlcyA9IHNlbGYuY291cG9uX3JhdGVzLnZhbHVlLmNvcHkoKQogICAgYnl0ZWMgMTkgLy8gMHg2MzZmNzU3MDZmNmU1MjYxNzQ2NTczCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidXJ5IDIKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvdXBvbl9yYXRlcyBleGlzdHMKCmdldF9jb3Vwb25fcmF0ZXNfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MjU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgZGlnIDEKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb3Vwb24uRml4ZWRDb3Vwb25DYXNoZmxvd01peGluLmdldF9wYXltZW50X2Ftb3VudFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9wYXltZW50X2Ftb3VudDoKICAgIHB1c2hieXRlcyAiIgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MjY4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cG4gMgogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjMxCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToyODMKICAgIC8vIGludGVyZXN0X2Ftb3VudCA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6Mjg0CiAgICAvLyBwcmluY2lwYWxfYW1vdW50ID0gVUludDY0KCkKICAgIGR1cG4gMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gZW5tLlNUQVRVU19BQ1RJVkUKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDEwMAogICAgPT0KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjI4NQogICAgLy8gaWYgc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCk6CiAgICBieiBnZXRfcGF5bWVudF9hbW91bnRfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToyODYKICAgIC8vIHBhaWRfY291cG9ucyA9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucwogICAgZGlnIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQ4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjI4NwogICAgLy8gaWYgcGFpZF9jb3Vwb25zIDwgc2VsZi50b3RhbF9jb3Vwb25zOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfY291cG9ucyBleGlzdHMKICAgIDwKICAgIGJ6IGdldF9wYXltZW50X2Ftb3VudF9lbHNlX2JvZHlANAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MjkwCiAgICAvLyBzZWxmLmFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzKSwKICAgIGRpZyAzCiAgICBjYWxsc3ViIGFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjI5MQogICAgLy8gcGFpZF9jb3Vwb25zICsgMSwKICAgIGRpZyA1CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6Mjg4LTI5MgogICAgLy8gIyBDb3Vwb24gUGF5bWVudAogICAgLy8gaW50ZXJlc3RfYW1vdW50ID0gc2VsZi5jb3Vwb25faW50ZXJlc3RfYW1vdW50KAogICAgLy8gICAgIHNlbGYuYWNjb3VudF90b3RhbF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MpLAogICAgLy8gICAgIHBhaWRfY291cG9ucyArIDEsCiAgICAvLyApCiAgICBjYWxsc3ViIGNvdXBvbl9pbnRlcmVzdF9hbW91bnQKICAgIGJ1cnkgMgoKZ2V0X3BheW1lbnRfYW1vdW50X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjI5Ni0yOTkKICAgIC8vIHJldHVybiB0eXAuUGF5bWVudEFtb3VudHMoCiAgICAvLyAgICAgaW50ZXJlc3Q9aW50ZXJlc3RfYW1vdW50LAogICAgLy8gICAgIHByaW5jaXBhbD1wcmluY2lwYWxfYW1vdW50LAogICAgLy8gKQogICAgZGlnIDEKICAgIGl0b2IKICAgIGRpZyAxCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjI2OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpnZXRfcGF5bWVudF9hbW91bnRfZWxzZV9ib2R5QDQ6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToyOTQtMjk1CiAgICAvLyAjIFByaW5jaXBhbCBQYXltZW50CiAgICAvLyBwcmluY2lwYWxfYW1vdW50ID0gc2VsZi5hY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcykKICAgIGRpZyAzCiAgICBjYWxsc3ViIGFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUKICAgIGJ1cnkgMQogICAgYiBnZXRfcGF5bWVudF9hbW91bnRfYWZ0ZXJfaWZfZWxzZUA2CgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb3Vwb24uRml4ZWRDb3Vwb25DYXNoZmxvd01peGluLmdldF9jb3Vwb25zX3N0YXR1c1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9jb3Vwb25zX3N0YXR1czoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjMxMAogICAgLy8gZHVlX2NvdXBvbnMgPSBzZWxmLmNvdW50X2R1ZV9jb3Vwb25zKCkKICAgIGNhbGxzdWIgY291bnRfZHVlX2NvdXBvbnMKICAgIGR1cG4gMgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MzExCiAgICAvLyBuZXh0X2NvdXBvbl9kdWVfZGF0ZSA9IHNlbGYubmV4dF9jb3Vwb25fZHVlX2RhdGUoZHVlX2NvdXBvbnMpCiAgICBjYWxsc3ViIG5leHRfY291cG9uX2R1ZV9kYXRlCiAgICBzd2FwCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTozMTIKICAgIC8vIGFsbF9kdWVfY291cG9uc19wYWlkID0gc2VsZi5hbGxfZHVlX2NvdXBvbnNfcGFpZChkdWVfY291cG9ucykKICAgIGR1cAogICAgY2FsbHN1YiBhbGxfZHVlX2NvdXBvbnNfcGFpZAogICAgc3dhcAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MzEzCiAgICAvLyBudW1lcmF0b3IgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjMxNAogICAgLy8gZGVub21pbmF0b3IgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjMxNQogICAgLy8gaWYgc2VsZi5pc19hY2NydWluZ19pbnRlcmVzdChkdWVfY291cG9ucyk6CiAgICBjYWxsc3ViIGlzX2FjY3J1aW5nX2ludGVyZXN0CiAgICBieiBnZXRfY291cG9uc19zdGF0dXNfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTozMTYKICAgIC8vIGRheV9jb3VudF9mYWN0b3IgPSBzZWxmLmRheV9jb3VudF9mYWN0b3IoZHVlX2NvdXBvbnMpCiAgICBkaWcgNAogICAgY2FsbHN1YiBkYXlfY291bnRfZmFjdG9yCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTozMTcKICAgIC8vIG51bWVyYXRvciA9IGRheV9jb3VudF9mYWN0b3IubnVtZXJhdG9yCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnVyeSAzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTozMTgKICAgIC8vIGRlbm9taW5hdG9yID0gZGF5X2NvdW50X2ZhY3Rvci5kZW5vbWluYXRvcgogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBidXJ5IDEKCmdldF9jb3Vwb25zX3N0YXR1c19hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTozMjAKICAgIC8vIHRvdGFsX2NvdXBvbnM9c2VsZi50b3RhbF9jb3Vwb25zLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfY291cG9ucyBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjMyMy0zMjYKICAgIC8vIGRheV9jb3VudF9mYWN0b3I9dHlwLkRheUNvdW50RmFjdG9yKAogICAgLy8gICAgIG51bWVyYXRvcj1udW1lcmF0b3IsCiAgICAvLyAgICAgZGVub21pbmF0b3I9ZGVub21pbmF0b3IsCiAgICAvLyApLAogICAgZGlnIDIKICAgIGl0b2IKICAgIGRpZyAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjMxOS0zMjgKICAgIC8vIHJldHVybiB0eXAuQ291cG9uc0luZm8oCiAgICAvLyAgICAgdG90YWxfY291cG9ucz1zZWxmLnRvdGFsX2NvdXBvbnMsCiAgICAvLyAgICAgZHVlX2NvdXBvbnM9ZHVlX2NvdXBvbnMsCiAgICAvLyAgICAgbmV4dF9jb3Vwb25fZHVlX2RhdGU9bmV4dF9jb3Vwb25fZHVlX2RhdGUsCiAgICAvLyAgICAgZGF5X2NvdW50X2ZhY3Rvcj10eXAuRGF5Q291bnRGYWN0b3IoCiAgICAvLyAgICAgICAgIG51bWVyYXRvcj1udW1lcmF0b3IsCiAgICAvLyAgICAgICAgIGRlbm9taW5hdG9yPWRlbm9taW5hdG9yLAogICAgLy8gICAgICksCiAgICAvLyAgICAgYWxsX2R1ZV9jb3Vwb25zX3BhaWQ9YWxsX2R1ZV9jb3Vwb25zX3BhaWQsCiAgICAvLyApCiAgICBzd2FwCiAgICBpdG9iCiAgICBkaWcgNgogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgNQogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDMxIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICBkaWcgNQogICAgc2V0Yml0CiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjMwMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5wYXltZW50X2FnZW50LmNvdXBvbi5Db3Vwb25QYXltZW50QWdlbnRNaXhpbi5wYXlfY291cG9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcGF5X2NvdXBvbjoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb3Vwb24ucHk6MzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGVubS5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgMTAwCiAgICA9PQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MzkKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1c19pc19hY3RpdmUoKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0MAogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0MQogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQ0CiAgICAvLyB1bml0cyA9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzCiAgICBkdXAKICAgIGJveF9nZXQKICAgIHBvcAogICAgaW50Y18yIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0NQogICAgLy8gYXNzZXJ0IHVuaXRzID4gMCwgZXJyLk5PX1VOSVRTCiAgICBhc3NlcnQgLy8gTm8gRC1BU0EgdW5pdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQ3CiAgICAvLyBkdWVfY291cG9ucyA9IHNlbGYuY291bnRfZHVlX2NvdXBvbnMoKQogICAgY2FsbHN1YiBjb3VudF9kdWVfY291cG9ucwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NDgKICAgIC8vIGFjY291bnRfcGFpZF9jb3Vwb25zID0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGFpZF9jb3Vwb25zCiAgICBzd2FwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCA0OAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQ5CiAgICAvLyBhc3NlcnQgZHVlX2NvdXBvbnMgPiBhY2NvdW50X3BhaWRfY291cG9ucywgZXJyLk5PX0RVRV9DT1VQT04KICAgIHN3YXAKICAgIGRpZyAxCiAgICA+CiAgICBhc3NlcnQgLy8gTm8gZHVlIGNvdXBvbiB0byBwYXkKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjUwLTUzCiAgICAvLyAjIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyB2ZXJpZnkgaWYgb3RoZXIgYWNjb3VudHMgYXJlIHN0aWxsIHdhaXRpbmcgZm9yIHRoZSBwYXltZW50IG9mIHByZXZpb3VzIGNvdXBvbnMKICAgIC8vIGFzc2VydCBzZWxmLmFsbF9kdWVfY291cG9uc19wYWlkKAogICAgLy8gICAgIGFjY291bnRfcGFpZF9jb3Vwb25zCiAgICAvLyApLCBlcnIuUEVORElOR19DT1VQT05fUEFZTUVOVAogICAgZHVwCiAgICBjYWxsc3ViIGFsbF9kdWVfY291cG9uc19wYWlkCiAgICBhc3NlcnQgLy8gUGVuZGluZyBkdWUgY291cG9uIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjE5NwogICAgLy8gc2VsZi5hY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcyksCiAgICBkaWcgMQogICAgY2FsbHN1YiBhY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxOTgKICAgIC8vIGFjY291bnRfcGFpZF9jb3Vwb25zICsgMSwKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxOTYtMTk5CiAgICAvLyByZXR1cm4gc2VsZi5jb3Vwb25faW50ZXJlc3RfYW1vdW50KAogICAgLy8gICAgIHNlbGYuYWNjb3VudF90b3RhbF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MpLAogICAgLy8gICAgIGFjY291bnRfcGFpZF9jb3Vwb25zICsgMSwKICAgIC8vICkKICAgIGNhbGxzdWIgY291cG9uX2ludGVyZXN0X2Ftb3VudAogICAgc3dhcAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvdXBvbi5weTo1NAogICAgLy8gc2VsZi5hc3NlcnRfcGF5bWVudF9hdXRob3JpemF0aW9uKGhvbGRpbmdfYWRkcmVzcykKICAgIGR1cAogICAgY2FsbHN1YiBhc3NlcnRfcGF5bWVudF9hdXRob3JpemF0aW9uCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY291cG9uLnB5OjU3CiAgICAvLyBpZiBzZWxmLmlzX3BheW1lbnRfZXhlY3V0YWJsZShob2xkaW5nX2FkZHJlc3MpOgogICAgY2FsbHN1YiBpc19wYXltZW50X2V4ZWN1dGFibGUKICAgIGJ6IHBheV9jb3Vwb25fZWxzZV9ib2R5QDMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb3Vwb24ucHk6NTgtNTkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gcGF5bWVudCBhZ2VudAogICAgLy8gc2VsZi5hc3NlcnRfZW5vdWdoX2Z1bmRzKHBheW1lbnRfYW1vdW50KQogICAgZHVwbiAyCiAgICBjYWxsc3ViIGFzc2VydF9lbm91Z2hfZnVuZHMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb3Vwb24ucHk6NjAtNjEKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgdGhlIHNhbWUgYXNzZXQgZm9yIGRlbm9taW5hdGlvbiBhbmQgc2V0dGxlbWVudCwgbm8gY29udmVyc2lvbiBuZWVkZWQKICAgIC8vIHNlbGYucGF5KHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcywgcGF5bWVudF9hbW91bnQpCiAgICBkaWcgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCAzMgogICAgc3dhcAogICAgY2FsbHN1YiBwYXkKCnBheV9jb3Vwb25fYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NjMKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucyArPSAxCiAgICBkaWcgMgogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCA0OAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBwdXNoaW50IDQ4CiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NjQKICAgIC8vIHNlbGYucGFpZF9jb3Vwb25fdW5pdHMgKz0gdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyOCAvLyAicGFpZF9jb3Vwb25fdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucGFpZF9jb3Vwb25fdW5pdHMgZXhpc3RzCiAgICBkaWcgMgogICAgKwogICAgYnl0ZWMgMjggLy8gInBhaWRfY291cG9uX3VuaXRzIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb3Vwb24ucHk6MTcKICAgIC8vIGNvbnRyYWN0X2lkPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2lkLmlkLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbklECiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY291cG9uLnB5OjIwCiAgICAvLyB0aW1lPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvdXBvbi5weToyMgogICAgLy8gY3VycmVuY3lfaWQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQuaWQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY291cG9uLnB5OjIzCiAgICAvLyBjdXJyZW5jeV91bml0PXNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkLnVuaXRfbmFtZSwKICAgIGR1cAogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVuaXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY291cG9uLnB5OjI0CiAgICAvLyBub21pbmFsX3ZhbHVlPXNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKiBzZWxmLnVuaXRfdmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAidW5pdF92YWx1ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi51bml0X3ZhbHVlIGV4aXN0cwogICAgKgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvdXBvbi5weToxNi0yNwogICAgLy8gRXZlbnQoCiAgICAvLyAgICAgY29udHJhY3RfaWQ9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25faWQuaWQsCiAgICAvLyAgICAgdHlwZT1hcmM0LlVJbnQ4KGVudW1zLkVWVF9UWVBFX0lQKSwKICAgIC8vICAgICB0eXBlX25hbWU9U3RyaW5nKCJJUCIpLAogICAgLy8gICAgIHRpbWU9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgcGF5b2ZmPXBheW9mZiwKICAgIC8vICAgICBjdXJyZW5jeV9pZD1zZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZC5pZCwKICAgIC8vICAgICBjdXJyZW5jeV91bml0PXNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkLnVuaXRfbmFtZSwKICAgIC8vICAgICBub21pbmFsX3ZhbHVlPXNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKiBzZWxmLnVuaXRfdmFsdWUsCiAgICAvLyAgICAgbm9taW5hbF9yYXRlX2Jwcz1hcmM0LlVJbnQxNigwKSwgICMgVE9ETzogQWRkIGludGVyZXN0IHJhdGUKICAgIC8vICAgICBub21pbmFsX2FjY3J1ZWQ9VUludDY0KDApLAogICAgLy8gKQogICAgdW5jb3ZlciA0CiAgICBpdG9iCiAgICBwdXNoYnl0ZXMgMHgwODAwMzcKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyA0CiAgICBpdG9iCiAgICBzd2FwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZGlnIDMKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICBzd2FwCiAgICBieXRlYyAzNSAvLyAweDAwM2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb3Vwb24ucHk6MjUKICAgIC8vIG5vbWluYWxfcmF0ZV9icHM9YXJjNC5VSW50MTYoMCksICAjIFRPRE86IEFkZCBpbnRlcmVzdCByYXRlCiAgICBieXRlYyAzMCAvLyAweDAwMDAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb3Vwb24ucHk6MTYtMjcKICAgIC8vIEV2ZW50KAogICAgLy8gICAgIGNvbnRyYWN0X2lkPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2lkLmlkLAogICAgLy8gICAgIHR5cGU9YXJjNC5VSW50OChlbnVtcy5FVlRfVFlQRV9JUCksCiAgICAvLyAgICAgdHlwZV9uYW1lPVN0cmluZygiSVAiKSwKICAgIC8vICAgICB0aW1lPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gICAgIHBheW9mZj1wYXlvZmYsCiAgICAvLyAgICAgY3VycmVuY3lfaWQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQuaWQsCiAgICAvLyAgICAgY3VycmVuY3lfdW5pdD1zZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZC51bml0X25hbWUsCiAgICAvLyAgICAgbm9taW5hbF92YWx1ZT1zZWxmLmNpcmN1bGF0aW5nX3VuaXRzICogc2VsZi51bml0X3ZhbHVlLAogICAgLy8gICAgIG5vbWluYWxfcmF0ZV9icHM9YXJjNC5VSW50MTYoMCksICAjIFRPRE86IEFkZCBpbnRlcmVzdCByYXRlCiAgICAvLyAgICAgbm9taW5hbF9hY2NydWVkPVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvdXBvbi5weToyNgogICAgLy8gbm9taW5hbF9hY2NydWVkPVVJbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY291cG9uLnB5OjE2LTI3CiAgICAvLyBFdmVudCgKICAgIC8vICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICB0eXBlPWFyYzQuVUludDgoZW51bXMuRVZUX1RZUEVfSVApLAogICAgLy8gICAgIHR5cGVfbmFtZT1TdHJpbmcoIklQIiksCiAgICAvLyAgICAgdGltZT1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICBwYXlvZmY9cGF5b2ZmLAogICAgLy8gICAgIGN1cnJlbmN5X2lkPXNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkLmlkLAogICAgLy8gICAgIGN1cnJlbmN5X3VuaXQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQudW5pdF9uYW1lLAogICAgLy8gICAgIG5vbWluYWxfdmFsdWU9c2VsZi5jaXJjdWxhdGluZ191bml0cyAqIHNlbGYudW5pdF92YWx1ZSwKICAgIC8vICAgICBub21pbmFsX3JhdGVfYnBzPWFyYzQuVUludDE2KDApLCAgIyBUT0RPOiBBZGQgaW50ZXJlc3QgcmF0ZQogICAgLy8gICAgIG5vbWluYWxfYWNjcnVlZD1VSW50NjQoMCksCiAgICAvLyApCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDAwMDI0OTUwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvdXBvbi5weToxNS0yOAogICAgLy8gYXJjNC5lbWl0KAogICAgLy8gICAgIEV2ZW50KAogICAgLy8gICAgICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICAgICAgdHlwZT1hcmM0LlVJbnQ4KGVudW1zLkVWVF9UWVBFX0lQKSwKICAgIC8vICAgICAgICAgdHlwZV9uYW1lPVN0cmluZygiSVAiKSwKICAgIC8vICAgICAgICAgdGltZT1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICAgICAgcGF5b2ZmPXBheW9mZiwKICAgIC8vICAgICAgICAgY3VycmVuY3lfaWQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQuaWQsCiAgICAvLyAgICAgICAgIGN1cnJlbmN5X3VuaXQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQudW5pdF9uYW1lLAogICAgLy8gICAgICAgICBub21pbmFsX3ZhbHVlPXNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKiBzZWxmLnVuaXRfdmFsdWUsCiAgICAvLyAgICAgICAgIG5vbWluYWxfcmF0ZV9icHM9YXJjNC5VSW50MTYoMCksICAjIFRPRE86IEFkZCBpbnRlcmVzdCByYXRlCiAgICAvLyAgICAgICAgIG5vbWluYWxfYWNjcnVlZD1VSW50NjQoMCksCiAgICAvLyAgICAgKQogICAgLy8gKQogICAgYnl0ZWMgMzYgLy8gbWV0aG9kICJFdmVudCh1aW50NjQsdWludDgsc3RyaW5nLHVpbnQ2NCx1aW50NjQsdWludDY0LGJ5dGVbXSx1aW50NjQsdWludDE2LHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvdXBvbi5weTo3MAogICAgLy8gdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvdXBvbi5weTo2OC03MgogICAgLy8gcmV0dXJuIHR5cC5QYXltZW50UmVzdWx0KAogICAgLy8gICAgIGFtb3VudD1wYXltZW50X2Ftb3VudCwKICAgIC8vICAgICB0aW1lc3RhbXA9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgY29udGV4dD1wYXltZW50X2luZm8sICAjIFRPRE86IEFkZCBpbmZvIG9uIGZhaWxlZCBwYXltZW50CiAgICAvLyApCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyA0CiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgYnl0ZWMgMzcgLy8gMHgwMDEyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvdXBvbi5weTozMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpwYXlfY291cG9uX2Vsc2VfYm9keUAzOgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvdXBvbi5weTo2My02NAogICAgLy8gIyBBY2NvdW50cyBzdXNwZW5kZWQgb3Igbm90IG9wdGVkIGluIGF0IHRoZSB0aW1lIG9mIHBheW1lbnRzIG11c3Qgbm90IHN0YWxsIHRoZSBELUFTQQogICAgLy8gcGF5bWVudF9hbW91bnQgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMQogICAgYiBwYXlfY291cG9uX2FmdGVyX2lmX2Vsc2VANAoKCi8vIG1vZHVsZXMucGF5bWVudF9hZ2VudC5wcmluY2lwYWwuUHJpbmNpcGFsUGF5bWVudEFnZW50TWl4aW4ucGF5X3ByaW5jaXBhbFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnBheV9wcmluY2lwYWw6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvcHJpbmNpcGFsLnB5OjMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBlbm0uU1RBVFVTX0FDVElWRQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDEwMAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXMvcGFtLnB5OjE2LTE3CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgcmVzdHJpY3QgY2FsbGVyIGF1dGhvcml6YXRpb24KICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1c19pc19hY3RpdmUoKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjdHVzL3BhbS5weToxOAogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzL3BhbS5weToxOQogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWN0dXMvcGFtLnB5OjIxCiAgICAvLyB1bml0cyA9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIGludGNfMiAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvYWN0dXMvcGFtLnB5OjIyCiAgICAvLyBhc3NlcnQgdW5pdHMgPiAwLCBlcnIuTk9fVU5JVFMKICAgIGFzc2VydCAvLyBObyBELUFTQSB1bml0cwogICAgLy8gbW9kdWxlcy9hY3R1cy9wYW0ucHk6MjMKICAgIC8vIGFzc2VydCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLm1hdHVyaXR5X2RhdGUsIGVyci5OT1RfTUFUVVJFCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgbWF0dXJlCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo3OAogICAgLy8gc2VsZi5jb3VudF9kdWVfY291cG9ucygpCiAgICBjYWxsc3ViIGNvdW50X2R1ZV9jb3Vwb25zCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo3Ni03OQogICAgLy8gIyBQcmluY2lwYWwgcGF5bWVudCBpcyBmb3JiaWRkZW4gaW4gY2FzZSBvZiBwZW5kaW5nIGNvdXBvbiBwYXltZW50cwogICAgLy8gYXNzZXJ0IHNlbGYuYWxsX2R1ZV9jb3Vwb25zX3BhaWQoCiAgICAvLyAgICAgc2VsZi5jb3VudF9kdWVfY291cG9ucygpCiAgICAvLyApLCBlcnIuUEVORElOR19DT1VQT05fUEFZTUVOVAogICAgY2FsbHN1YiBhbGxfZHVlX2NvdXBvbnNfcGFpZAogICAgYXNzZXJ0IC8vIFBlbmRpbmcgZHVlIGNvdXBvbiBwYXltZW50CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo4MAogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudF90b3RhbF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MpCiAgICBkdXAKICAgIGNhbGxzdWIgYWNjb3VudF90b3RhbF91bml0c192YWx1ZQogICAgc3dhcAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L3ByaW5jaXBhbC5weTo1MwogICAgLy8gc2VsZi5hc3NlcnRfcGF5bWVudF9hdXRob3JpemF0aW9uKGhvbGRpbmdfYWRkcmVzcykKICAgIGR1cAogICAgY2FsbHN1YiBhc3NlcnRfcGF5bWVudF9hdXRob3JpemF0aW9uCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvcHJpbmNpcGFsLnB5OjU2CiAgICAvLyBpZiBzZWxmLmlzX3BheW1lbnRfZXhlY3V0YWJsZShob2xkaW5nX2FkZHJlc3MpOgogICAgY2FsbHN1YiBpc19wYXltZW50X2V4ZWN1dGFibGUKICAgIGJ6IHBheV9wcmluY2lwYWxfZWxzZV9ib2R5QDMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9wcmluY2lwYWwucHk6NTctNTgKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gcGF5bWVudCBhZ2VudAogICAgLy8gc2VsZi5hc3NlcnRfZW5vdWdoX2Z1bmRzKHBheW1lbnRfYW1vdW50KQogICAgZHVwbiAyCiAgICBjYWxsc3ViIGFzc2VydF9lbm91Z2hfZnVuZHMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9wcmluY2lwYWwucHk6NTktNjAKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgdGhlIHNhbWUgYXNzZXQgZm9yIGRlbm9taW5hdGlvbiBhbmQgc2V0dGxlbWVudCwgbm8gY29udmVyc2lvbiBuZWVkZWQKICAgIC8vIHNlbGYucGF5KHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcywgcGF5bWVudF9hbW91bnQpCiAgICBkaWcgMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCAzMgogICAgc3dhcAogICAgY2FsbHN1YiBwYXkKCnBheV9wcmluY2lwYWxfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTk5CiAgICAvLyBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIC09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBkaWcgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgaW50Y18yIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLQogICAgYnl0ZWNfMyAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MjAwCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgaXRvYgogICAgc3dhcAogICAgaW50Y18yIC8vIDMyCiAgICBkaWcgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjIwMQogICAgLy8gc2VsZi5lbmRfaWZfbm9fY2lyY3VsYXRpbmdfdW5pdHMoKQogICAgY2FsbHN1YiBlbmRfaWZfbm9fY2lyY3VsYXRpbmdfdW5pdHMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9wcmluY2lwYWwucHk6MTcKICAgIC8vIGNvbnRyYWN0X2lkPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2lkLmlkLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbklECiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvcHJpbmNpcGFsLnB5OjIwCiAgICAvLyB0aW1lPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L3ByaW5jaXBhbC5weToyMgogICAgLy8gY3VycmVuY3lfaWQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQuaWQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvcHJpbmNpcGFsLnB5OjIzCiAgICAvLyBjdXJyZW5jeV91bml0PXNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkLnVuaXRfbmFtZSwKICAgIGR1cAogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVuaXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvcHJpbmNpcGFsLnB5OjI0CiAgICAvLyBub21pbmFsX3ZhbHVlPXNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKiBzZWxmLnVuaXRfdmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAidW5pdF92YWx1ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi51bml0X3ZhbHVlIGV4aXN0cwogICAgKgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L3ByaW5jaXBhbC5weToxNi0yNwogICAgLy8gRXZlbnQoCiAgICAvLyAgICAgY29udHJhY3RfaWQ9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25faWQuaWQsCiAgICAvLyAgICAgdHlwZT1hcmM0LlVJbnQ4KGVudW1zLkVWVF9UWVBFX1BSKSwKICAgIC8vICAgICB0eXBlX25hbWU9U3RyaW5nKCJQUiIpLAogICAgLy8gICAgIHRpbWU9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgcGF5b2ZmPXBheW9mZiwKICAgIC8vICAgICBjdXJyZW5jeV9pZD1zZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZC5pZCwKICAgIC8vICAgICBjdXJyZW5jeV91bml0PXNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkLnVuaXRfbmFtZSwKICAgIC8vICAgICBub21pbmFsX3ZhbHVlPXNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKiBzZWxmLnVuaXRfdmFsdWUsCiAgICAvLyAgICAgbm9taW5hbF9yYXRlX2Jwcz1hcmM0LlVJbnQxNigwKSwKICAgIC8vICAgICBub21pbmFsX2FjY3J1ZWQ9VUludDY0KDApLAogICAgLy8gKQogICAgdW5jb3ZlciA0CiAgICBpdG9iCiAgICBwdXNoYnl0ZXMgMHgwMzAwMzcKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyA1CiAgICBpdG9iCiAgICBzd2FwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZGlnIDMKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICBzd2FwCiAgICBieXRlYyAzNSAvLyAweDAwM2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9wcmluY2lwYWwucHk6MjUKICAgIC8vIG5vbWluYWxfcmF0ZV9icHM9YXJjNC5VSW50MTYoMCksCiAgICBieXRlYyAzMCAvLyAweDAwMDAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9wcmluY2lwYWwucHk6MTYtMjcKICAgIC8vIEV2ZW50KAogICAgLy8gICAgIGNvbnRyYWN0X2lkPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2lkLmlkLAogICAgLy8gICAgIHR5cGU9YXJjNC5VSW50OChlbnVtcy5FVlRfVFlQRV9QUiksCiAgICAvLyAgICAgdHlwZV9uYW1lPVN0cmluZygiUFIiKSwKICAgIC8vICAgICB0aW1lPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gICAgIHBheW9mZj1wYXlvZmYsCiAgICAvLyAgICAgY3VycmVuY3lfaWQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQuaWQsCiAgICAvLyAgICAgY3VycmVuY3lfdW5pdD1zZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZC51bml0X25hbWUsCiAgICAvLyAgICAgbm9taW5hbF92YWx1ZT1zZWxmLmNpcmN1bGF0aW5nX3VuaXRzICogc2VsZi51bml0X3ZhbHVlLAogICAgLy8gICAgIG5vbWluYWxfcmF0ZV9icHM9YXJjNC5VSW50MTYoMCksCiAgICAvLyAgICAgbm9taW5hbF9hY2NydWVkPVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDAwMDI1MDUyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L3ByaW5jaXBhbC5weToxNS0yOAogICAgLy8gYXJjNC5lbWl0KAogICAgLy8gICAgIEV2ZW50KAogICAgLy8gICAgICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICAgICAgdHlwZT1hcmM0LlVJbnQ4KGVudW1zLkVWVF9UWVBFX1BSKSwKICAgIC8vICAgICAgICAgdHlwZV9uYW1lPVN0cmluZygiUFIiKSwKICAgIC8vICAgICAgICAgdGltZT1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICAgICAgcGF5b2ZmPXBheW9mZiwKICAgIC8vICAgICAgICAgY3VycmVuY3lfaWQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQuaWQsCiAgICAvLyAgICAgICAgIGN1cnJlbmN5X3VuaXQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQudW5pdF9uYW1lLAogICAgLy8gICAgICAgICBub21pbmFsX3ZhbHVlPXNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKiBzZWxmLnVuaXRfdmFsdWUsCiAgICAvLyAgICAgICAgIG5vbWluYWxfcmF0ZV9icHM9YXJjNC5VSW50MTYoMCksCiAgICAvLyAgICAgICAgIG5vbWluYWxfYWNjcnVlZD1VSW50NjQoMCksCiAgICAvLyAgICAgKQogICAgLy8gKQogICAgYnl0ZWMgMzYgLy8gbWV0aG9kICJFdmVudCh1aW50NjQsdWludDgsc3RyaW5nLHVpbnQ2NCx1aW50NjQsdWludDY0LGJ5dGVbXSx1aW50NjQsdWludDE2LHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L3ByaW5jaXBhbC5weTo2OQogICAgLy8gdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L3ByaW5jaXBhbC5weTo2Ny03MQogICAgLy8gcmV0dXJuIHR5cC5QYXltZW50UmVzdWx0KAogICAgLy8gICAgIGFtb3VudD1wYXltZW50X2Ftb3VudCwKICAgIC8vICAgICB0aW1lc3RhbXA9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgY29udGV4dD1wYXltZW50X2luZm8sICAjIFRPRE86IEFkZCBpbmZvIG9uIGZhaWxlZCBwYXltZW50CiAgICAvLyApCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyAzCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgYnl0ZWMgMzcgLy8gMHgwMDEyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L3ByaW5jaXBhbC5weTozMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpwYXlfcHJpbmNpcGFsX2Vsc2VfYm9keUAzOgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L3ByaW5jaXBhbC5weTo2Mi02MwogICAgLy8gIyBBY2NvdW50cyBzdXNwZW5kZWQgb3Igbm90IG9wdGVkIGluIGF0IHRoZSB0aW1lIG9mIHBheW1lbnRzIG11c3Qgbm90IHN0YWxsIHRoZSBELUFTQQogICAgLy8gcGF5bWVudF9hbW91bnQgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMQogICAgYiBwYXlfcHJpbmNpcGFsX2FmdGVyX2lmX2Vsc2VANAoKCi8vIG1vZHVsZXMudHJhbnNmZXJfYWdlbnQuY291cG9uLkNvdXBvblRyYW5zZmVyQWdlbnRNaXhpbi5hc3NldF90cmFuc2Zlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFzc2V0X3RyYW5zZmVyOgogICAgaW50Y18wIC8vIDAKICAgIGR1cG4gMgogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQvY291cG9uLnB5OjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGVubS5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgMTAwCiAgICA9PQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTUzLTE1OAogICAgLy8gc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCkKICAgIC8vIGFuZCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyBhbmQgKAogICAgLy8gICAgIG5vdCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICAvLyAgICAgb3IgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICAvLyApCiAgICBieiBhc3NldF90cmFuc2Zlcl9ib29sX2ZhbHNlQDYKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE1NAogICAgLy8gYW5kIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOCAvLyAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTUzLTE1OAogICAgLy8gc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCkKICAgIC8vIGFuZCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyBhbmQgKAogICAgLy8gICAgIG5vdCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICAvLyAgICAgb3IgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICAvLyApCiAgICBieiBhc3NldF90cmFuc2Zlcl9ib29sX2ZhbHNlQDYKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE1NgogICAgLy8gbm90IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNTYtMTU3CiAgICAvLyBub3Qgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgLy8gb3IgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICBieiBhc3NldF90cmFuc2Zlcl9ib29sX3RydWVANQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTU3CiAgICAvLyBvciBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICA8CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNTYtMTU3CiAgICAvLyBub3Qgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgLy8gb3IgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICBieiBhc3NldF90cmFuc2Zlcl9ib29sX2ZhbHNlQDYKCmFzc2V0X3RyYW5zZmVyX2Jvb2xfdHJ1ZUA1OgogICAgaW50Y18xIC8vIDEKCmFzc2V0X3RyYW5zZmVyX2Jvb2xfbWVyZ2VANzoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE1Mi0xNTkKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCkKICAgIC8vICAgICBhbmQgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIGFuZCAoCiAgICAvLyAgICAgICAgIG5vdCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICAvLyAgICAgICAgIG9yIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDwgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgLy8gICAgICkKICAgIC8vICksIGVyci5TRUNPTkRBUllfTUFSS0VUX0NMT1NFRAogICAgYXNzZXJ0IC8vIFNlY29uZGFyeSBtYXJrZXQgaXMgY2xvc2VkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNjktMTcxCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gZ3JhbnRzIHRyYW5zZmVyIHJpZ2h0IHRvIEQtQVNBIG93bmVycy4gT3RoZXIgaW1wbGVtZW50YXRpb25zIG1heSByZWxheSBvbiBvdGhlcgogICAgLy8gIyByb2xlcywgZXh0ZXJuYWwgQXBwcyB0aHJvdWdoIEMyQyBjYWxscyAoZS5nLiwgYW4gb3JkZXIgYm9vayksIG9yIG9mZi1jaGFpbiB0cmFuc2ZlciBhZ2VudHMuCiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBzZW5kZXJfaG9sZGluZ19hZGRyZXNzLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNzIKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTczCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozMQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgOQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGRpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDEwCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE3NgogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBkaWcgMwogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNzcKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBkaWcgMQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxOTAKICAgIC8vIGFzc2VydCBzZW5kZXJfaG9sZGluZ19hZGRyZXNzICE9IHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcywgZXJyLlNFTEZfVFJBTlNGRVIKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICAhPQogICAgYXNzZXJ0IC8vIFNlbmRlciBhbmQgcmVjZWl2ZXIgbXVzdCBiZSBkaWZmZXJlbnQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE5MQogICAgLy8gYXNzZXJ0IHVuaXRzID4gMCwgZXJyLk5VTExfVFJBTlNGRVIKICAgIGRpZyAyCiAgICBkdXAKICAgIGFzc2VydCAvLyBUcmFuc2ZlciB1bml0cyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxOTIKICAgIC8vIGFzc2VydCB1bml0cyA8PSBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMsIGVyci5PVkVSX1RSQU5TRkVSCiAgICB1bmNvdmVyIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBkdXAKICAgIGludGNfMiAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIHVuY292ZXIgMgogICAgPj0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgc2VuZGVyIHVuaXRzIHRvIHRyYW5zZmVyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NjMKICAgIC8vIHNlbmRlcl91bml0X3ZhbHVlID0gc2VsZi5hY2NvdW50W3NlbmRlcl0udW5pdF92YWx1ZQogICAgZXh0cmFjdCA0MCA4CiAgICBidXJ5IDkKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo2NAogICAgLy8gaWYgc2VsZi5hY2NvdW50W3JlY2VpdmVyXS51bml0cyA+IFVJbnQ2NCgwKToKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzIgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBieiBhc3NldF90cmFuc2Zlcl9lbHNlX2JvZHlAOQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjU4CiAgICAvLyBzZWxmLmFjY291bnRbc2VuZGVyXS51bml0X3ZhbHVlID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0udW5pdF92YWx1ZQogICAgZGlnIDYKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDYKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo1OC01OQogICAgLy8gc2VsZi5hY2NvdW50W3NlbmRlcl0udW5pdF92YWx1ZSA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnVuaXRfdmFsdWUKICAgIC8vIGFuZCBzZWxmLmFjY291bnRbc2VuZGVyXS5wYWlkX2NvdXBvbnMgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS5wYWlkX2NvdXBvbnMKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VAMjAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo1OQogICAgLy8gYW5kIHNlbGYuYWNjb3VudFtzZW5kZXJdLnBhaWRfY291cG9ucyA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnBhaWRfY291cG9ucwogICAgZGlnIDYKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQ4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDYKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQ4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo1OC01OQogICAgLy8gc2VsZi5hY2NvdW50W3NlbmRlcl0udW5pdF92YWx1ZSA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnVuaXRfdmFsdWUKICAgIC8vIGFuZCBzZWxmLmFjY291bnRbc2VuZGVyXS5wYWlkX2NvdXBvbnMgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS5wYWlkX2NvdXBvbnMKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VAMjAKICAgIGludGNfMSAvLyAxCgphc3NldF90cmFuc2Zlcl9ib29sX21lcmdlQDIxOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjU3LTYwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtzZW5kZXJdLnVuaXRfdmFsdWUgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS51bml0X3ZhbHVlCiAgICAvLyAgICAgYW5kIHNlbGYuYWNjb3VudFtzZW5kZXJdLnBhaWRfY291cG9ucyA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnBhaWRfY291cG9ucwogICAgLy8gKSwgZXJyLk5PTl9GVU5HSUJMRV9VTklUUwogICAgYXNzZXJ0IC8vIFNlbmRlciBhbmQgcmVjZWl2ZXIgdW5pdHMgYXJlIG5vdCBmdW5naWJsZQoKYXNzZXRfdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQvY291cG9uLnB5OjQ2LTQ3CiAgICAvLyAjIFRyYW5zZmVycmVkIHVuaXRzIHZhbHVlIChtdXN0IGJlIGNvbXB1dGVkIGJlZm9yZSB0aGUgdHJhbnNmZXIpCiAgICAvLyBzZW5kZXJfdW5pdF92YWx1ZSA9IHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlCiAgICBkaWcgNgogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCA0MAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgNQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NjktNzAKICAgIC8vICMgVHJhbnNmZXIgaXMgZm9yYmlkZGVuIGluIGNhc2Ugb2YgcGVuZGluZyBjb3Vwb24gcGF5bWVudHMKICAgIC8vIGR1ZV9jb3Vwb25zID0gc2VsZi5jb3VudF9kdWVfY291cG9ucygpCiAgICBjYWxsc3ViIGNvdW50X2R1ZV9jb3Vwb25zCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo3MQogICAgLy8gc2VsZi5hc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudChzZW5kZXJfaG9sZGluZ19hZGRyZXNzLCBkdWVfY291cG9ucykKICAgIGRpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGRpZyAxCiAgICBjYWxsc3ViIGFzc2VydF9ub19wZW5kaW5nX2NvdXBvbl9wYXltZW50CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo3MgogICAgLy8gcmV0dXJuIHNlbGYuYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQoc2VuZGVyX2hvbGRpbmdfYWRkcmVzcywgdW5pdHMsIGR1ZV9jb3Vwb25zKQogICAgc3dhcAogICAgZGlnIDMKICAgIGR1cAogICAgY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIGFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50CiAgICBidXJ5IDcKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3MQogICAgLy8gYXNzZXJ0IHVuaXRzIDw9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLCBlcnIuT1ZFUl9UUkFOU0ZFUgogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzIgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAyCiAgICA8PQogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCBzZW5kZXIgdW5pdHMgdG8gdHJhbnNmZXIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3MgogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMgLT0gdW5pdHMKICAgIHN3YXAKICAgIC0KICAgIGl0b2IKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gMzIKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo1MgogICAgLy8gaWYgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPT0gVUludDY0KDApOgogICAgYm94X2dldAogICAgcG9wCiAgICBpbnRjXzIgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBibnogYXNzZXRfdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAxNgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjUzCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgaXRvYgogICAgZGlnIDcKICAgIGR1cAogICAgY292ZXIgMgogICAgcHVzaGludCA0MAogICAgZGlnIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NTQKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucyA9IFVJbnQ2NCgwKQogICAgcHVzaGludCA0OAogICAgc3dhcAogICAgYm94X3JlcGxhY2UKCmFzc2V0X3RyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMTY6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzYKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzICs9IHVuaXRzCiAgICBkaWcgNQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgaW50Y18yIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgKwogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBpbnRjXzIgLy8gMzIKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQvY291cG9uLnB5OjUzCiAgICAvLyByZXR1cm4gdW5pdHMgKiBzZW5kZXJfdW5pdF92YWx1ZSArIGFjY3J1ZWRfaW50ZXJlc3QKICAgIGRpZyA0CiAgICAqCiAgICBkaWcgNQogICAgKwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC9jb3Vwb24ucHk6OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgphc3NldF90cmFuc2Zlcl9ib29sX2ZhbHNlQDIwOgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXRfdHJhbnNmZXJfYm9vbF9tZXJnZUAyMQoKYXNzZXRfdHJhbnNmZXJfZWxzZV9ib2R5QDk6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NjcKICAgIC8vIHNlbGYuYWNjb3VudFtyZWNlaXZlcl0udW5pdF92YWx1ZSA9IHNlbmRlcl91bml0X3ZhbHVlCiAgICBkaWcgNQogICAgZHVwCiAgICBwdXNoaW50IDQwCiAgICBkaWcgMTAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NjgKICAgIC8vIHNlbGYuYWNjb3VudFtyZWNlaXZlcl0ucGFpZF9jb3Vwb25zID0gc2VsZi5hY2NvdW50W3NlbmRlcl0ucGFpZF9jb3Vwb25zCiAgICBkaWcgNwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDggOAogICAgcHVzaGludCA0OAogICAgc3dhcAogICAgYm94X3JlcGxhY2UKICAgIGIgYXNzZXRfdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAxMAoKYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUA2OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXRfdHJhbnNmZXJfYm9vbF9tZXJnZUA3CgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb21tb24uQ29yZUZpbmFuY2lhbENvbW1vbk1peGluLmFzc2V0X2NyZWF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFzc2V0X2NyZWF0ZToKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI2NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBkaWcgMQogICAgcHVzaGludCAzOAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgdHVwbGUgZW5jb2RpbmcKICAgIGR1cAogICAgcHVzaGludCA0MAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHRhaWwgcG9pbnRlciBhdCBpbmRleCA3IG9mICh1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OFszMl0sKGxlbit1dGY4W10pKQogICAgZGlnIDIKICAgIHN3YXAKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCA0MgogICAgKwogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5Bc3NldE1ldGFkYXRhCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyNzYKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSBhcnJhbmdlcgogICAgYnl0ZWMgOCAvLyAweDUyMzIzMDIzCiAgICB1bmNvdmVyIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyNzcKICAgIC8vIHNlbGYubWV0YWRhdGEgPSBtZXRhZGF0YS5ieXRlcwogICAgYnl0ZWMgMjUgLy8gIm1ldGFkYXRhIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI2NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb21tb24uQ29yZUZpbmFuY2lhbENvbW1vbk1peGluLmFzc2V0X3VwZGF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFzc2V0X3VwZGF0ZToKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI3OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGRpZyAxCiAgICBwdXNoaW50IDM4CiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCB0dXBsZSBlbmNvZGluZwogICAgZHVwCiAgICBwdXNoaW50IDQwCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgdGFpbCBwb2ludGVyIGF0IGluZGV4IDcgb2YgKHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4WzMyXSwobGVuK3V0ZjhbXSkpCiAgICBkaWcgMgogICAgc3dhcAogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDQyCiAgICArCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLkFzc2V0TWV0YWRhdGEKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI4NC0yODcKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBncmFudHMgdGhlIHVwZGF0ZSBwZXJtaXNzaW9ucyB0byB0aGUgQXJyYW5nZXIuCiAgICAvLyAjIE90aGVyIGltcGxlbWVudGF0aW9ucyBtYXkgZGlzYWJsZSBELUFTQSBhcHBsaWNhdGlvbiB1cGRhdGFiaWxpdHkgb3IgY2hhbmdlIGl0cyBhdXRob3JpemF0aW9ucy4KICAgIC8vICMg4pqg77iPIFdBUk5JTkc6IEFwcGxpY2F0aW9uIHVwZGF0ZXMgbXVzdCBiZSBleGVjdXRlZCBWRVJZIGNhcmVmdWxseSwgYXMgdGhleSBtaWdodCBpbnRyb2R1Y2UgYnJlYWtpbmcgY2hhbmdlcy4KICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI4OAogICAgLy8gc2VsZi5tZXRhZGF0YSA9IG1ldGFkYXRhLmJ5dGVzCiAgICBieXRlYyAyNSAvLyAibWV0YWRhdGEiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6Mjc5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb21tb24uQ29yZUZpbmFuY2lhbENvbW1vbk1peGluLnNldF9zZWNvbmRhcnlfdGltZV9ldmVudHNbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzOgogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI5MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIHVuY292ZXIgMgogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8dWludDY0PgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzExCiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjgKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBlbm0uU1RBVFVTX0VOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGludGMgNSAvLyAyMDAKICAgID09CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMTIKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5zdGF0dXNfaXNfZW5kZWQoKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgIQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMTMKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzE1CiAgICAvLyBhc3NlcnQgc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50cy5sZW5ndGggPj0gMSwgZXJyLklOVkFMSURfVElNRV9FVkVOVFNfTEVOR1RICiAgICBkdXAKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBsZW5ndGggaXMgaW52YWxpZAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzE2CiAgICAvLyBpZiBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzLmxlbmd0aCA+IDE6CiAgICBpbnRjXzEgLy8gMQogICAgPgogICAgYnogc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50c19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMxNwogICAgLy8gc2VsZi5hc3NlcnRfdGltZV9ldmVudHNfc29ydGVkKHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHMpCiAgICBkdXAKICAgIGNhbGxzdWIgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZAogICAgYnVyeSAxCgpzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMyMAogICAgLy8gc2VsZi5pc3N1YW5jZV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pc3N1YW5jZV9kYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzIxCiAgICAvLyA8PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzW2NmZy5TRUNPTkRBUllfTUFSS0VUX09QRU5JTkdfREFURV9JRFhdCiAgICBkaWcgMQogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgYnVyeSA0CiAgICBwdXNoaW50IDIKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMjAtMzIxCiAgICAvLyBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIC8vIDw9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbY2ZnLlNFQ09OREFSWV9NQVJLRVRfT1BFTklOR19EQVRFX0lEWF0KICAgIHN3YXAKICAgIGRpZyAxCiAgICA8PQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzE5LTMyMgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIC8vICAgICA8PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzW2NmZy5TRUNPTkRBUllfTUFSS0VUX09QRU5JTkdfREFURV9JRFhdCiAgICAvLyApLCBlcnIuSU5WQUxJRF9TRUNPTkRBUllfT1BFTklOR19EQVRFCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzZWNvbmRhcnkgbWFya2V0IG9wZW5pbmcgZGF0ZQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzIzCiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlID0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIGJ5dGVjIDE4IC8vICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMyMy0zMjUKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgPSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX09QRU5JTkdfREFURV9JRFgKICAgIC8vIF0KICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMjYKICAgIC8vIGlmIHNlbGYubWF0dXJpdHlfZGF0ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJtYXR1cml0eV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hdHVyaXR5X2RhdGUgZXhpc3RzCiAgICBieiBzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzI4CiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJtYXR1cml0eV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hdHVyaXR5X2RhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMjkKICAgIC8vID49IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWF0KICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBkaWcgMwogICAgc3dhcAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMyOC0zMjkKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZQogICAgLy8gPj0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1tjZmcuU0VDT05EQVJZX01BUktFVF9DTE9TVVJFX0RBVEVfSURYXQogICAgc3dhcAogICAgZGlnIDEKICAgID49CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMjctMzMwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYubWF0dXJpdHlfZGF0ZQogICAgLy8gICAgID49IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWF0KICAgIC8vICksIGVyci5JTlZBTElEX1NFQ09OREFSWV9DTE9TVVJFX0RBVEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNlY29uZGFyeSBtYXJrZXQgY2xvc3VyZSBkYXRlCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMzEKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUgPSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgYnl0ZWMgMTEgLy8gInNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzMxLTMzMwogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSA9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gXQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCnNldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzM1CiAgICAvLyBzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZT1zZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE4IC8vICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMzNgogICAgLy8gc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGU9c2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMzQtMzM3CiAgICAvLyByZXR1cm4gdHlwLlNlY29uZGFyeU1hcmtldFNjaGVkdWxlKAogICAgLy8gICAgIHNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlPXNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUsCiAgICAvLyAgICAgc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGU9c2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSwKICAgIC8vICkKICAgIHN3YXAKICAgIGl0b2IKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MjkwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmNvcmVfZmluYW5jaWFsLmNvbW1vbi5Db3JlRmluYW5jaWFsQ29tbW9uTWl4aW4uc2V0X2RlZmF1bHRfc3RhdHVzW3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X2RlZmF1bHRfc3RhdHVzOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzM5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzQKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnRydXN0ZWUsIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyMCAvLyAweDUyMzYzMDIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozNTIKICAgIC8vIHNlbGYuYXNzZXRfZGVmYXVsdGVkID0gZGVmYXVsdGVkCiAgICBieXRlYyAyNCAvLyAiYXNzZXRfZGVmYXVsdGVkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjM1MwogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY29tbW9uLkNvcmVGaW5hbmNpYWxDb21tb25NaXhpbi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnByaW1hcnlfZGlzdHJpYnV0aW9uOgogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozNTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBlbm0uU1RBVFVTX0FDVElWRQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDEwMAogICAgPT0KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE0NS0xNDgKICAgIC8vIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpCiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDUKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE0NgogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNDcKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGJ1cnkgNQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTQ2LTE0NwogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgPD0KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE0Ni0xNDgKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VANQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTQ4CiAgICAvLyA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjcgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNDctMTQ4CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgZGlnIDMKICAgID4KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE0Ni0xNDgKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VANQogICAgaW50Y18xIC8vIDEKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfbWVyZ2VANjoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE0NC0xNDkKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCkKICAgIC8vICAgICBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIC8vICksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TRUQKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBjbG9zZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo3MQogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYucHJpbWFyeV9kZWFsZXIsIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyMSAvLyAweDUyMzUzMDIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozODMKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6Mzg0CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjM4NQogICAgLy8gYXNzZXJ0IHVuaXRzID4gMCwgZXJyLlpFUk9fVU5JVFMKICAgIGRpZyAxCiAgICBkdXAKICAgIGFzc2VydCAvLyBDYW4gbm90IGRpc3RyaWJ1dGUgemVybyB1bml0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6Mzg2CiAgICAvLyBhc3NlcnQgc2VsZi5jaXJjdWxhdGluZ191bml0cyArIHVuaXRzIDw9IHNlbGYudG90YWxfdW5pdHMsIGVyci5PVkVSX0RJU1RSSUJVVElPTgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgZGlnIDEKICAgICsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNSAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICBkaWcgMQogICAgPj0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgcmVtYWluaW5nIEQtQVNBIHVuaXRzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozODgKICAgIC8vIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKz0gdW5pdHMKICAgIGJ5dGVjXzMgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozODkKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzICs9IHVuaXRzCiAgICBkaWcgMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMiAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIHVuY292ZXIgMgogICAgKwogICAgaXRvYgogICAgZGlnIDIKICAgIGludGNfMiAvLyAzMgogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzkwCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlID0gc2VsZi51bml0X3ZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAidW5pdF92YWx1ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi51bml0X3ZhbHVlIGV4aXN0cwogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBwdXNoaW50IDQwCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozOTEKICAgIC8vIHJldHVybiBzZWxmLnRvdGFsX3VuaXRzIC0gc2VsZi5jaXJjdWxhdGluZ191bml0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIHN3YXAKICAgIC0KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjM1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDU6CiAgICBpbnRjXzAgLy8gMAogICAgYiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX21lcmdlQDYKCgovLyBtb2R1bGVzLmNvcmVfZmluYW5jaWFsLmNvbW1vbi5Db3JlRmluYW5jaWFsQ29tbW9uTWl4aW4uZ2V0X2Fzc2V0X2luZm9bcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXNzZXRfaW5mbzoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQwMwogICAgLy8gcGVyZm9ybWFuY2UgPSBVSW50NjQoY3N0LlBSRl9QRVJGT1JNQU5UKQogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQwNAogICAgLy8gaWYgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPiBzZWxmLm1hdHVyaXR5X2RhdGUgPiAwOgogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjb3ZlciAzCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgPgogICAgYnogZ2V0X2Fzc2V0X2luZm9fYWZ0ZXJfaWZfZWxzZUA0CiAgICBkdXAKICAgIGJ6IGdldF9hc3NldF9pbmZvX2FmdGVyX2lmX2Vsc2VANAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDA1CiAgICAvLyBwZXJmb3JtYW5jZSA9IFVJbnQ2NChjc3QuUFJGX01BVFVSRUQpCiAgICBwdXNoaW50IDQKICAgIGJ1cnkgMgoKZ2V0X2Fzc2V0X2luZm9fYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDA2LTQwNwogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBubyBncmFjZSBvciBkZWxpbnF1ZW5jeSBwZXJpb2RzCiAgICAvLyBpZiBzZWxmLmFzc2V0X2RlZmF1bHRlZDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNCAvLyAiYXNzZXRfZGVmYXVsdGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2RlZmF1bHRlZCBleGlzdHMKICAgIGJ6IGdldF9hc3NldF9pbmZvX2FmdGVyX2lmX2Vsc2VANgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDA4CiAgICAvLyBwZXJmb3JtYW5jZSA9IFVJbnQ2NChjc3QuUFJGX0RFRkFVTFRFRCkKICAgIHB1c2hpbnQgMwogICAgYnVyeSAyCgpnZXRfYXNzZXRfaW5mb19hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MTEKICAgIC8vIGRlbm9taW5hdGlvbl9hc3NldF9pZD1zZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZC5pZCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQxMgogICAgLy8gc2V0dGxlbWVudF9hc3NldF9pZD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuaWQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjQ1CiAgICAvLyByZXR1cm4gc2VsZi5jaXJjdWxhdGluZ191bml0cyAqIHNlbGYudW5pdF92YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gInVuaXRfdmFsdWUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudW5pdF92YWx1ZSBleGlzdHMKICAgIGR1cDIKICAgICoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQxNQogICAgLy8gZGF5X2NvdW50X2NvbnZlbnRpb249YXJjNC5VSW50OChzZWxmLmRheV9jb3VudF9jb252ZW50aW9uKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gZXhpc3RzCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgaW50Y18zIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MTYKICAgIC8vIHByaW5jaXBhbF9kaXNjb3VudD1hcmM0LlVJbnQxNihzZWxmLnByaW5jaXBhbF9kaXNjb3VudCksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjYgLy8gInByaW5jaXBhbF9kaXNjb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmluY2lwYWxfZGlzY291bnQgZXhpc3RzCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgcHVzaGludCAxNgogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA2IDIKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQxNwogICAgLy8gaW50ZXJlc3RfcmF0ZT1hcmM0LlVJbnQxNihzZWxmLmludGVyZXN0X3JhdGUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDMzIC8vICJpbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X3JhdGUgZXhpc3RzCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgcHVzaGludCAxNgogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA2IDIKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQxOAogICAgLy8gdG90YWxfc3VwcGx5PXNlbGYudG90YWxfdW5pdHMsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDIwCiAgICAvLyBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGU9c2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MjEKICAgIC8vIHByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZT1zZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNyAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQyMgogICAgLy8gaXNzdWFuY2VfZGF0ZT1zZWxmLmlzc3VhbmNlX2RhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pc3N1YW5jZV9kYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDIzCiAgICAvLyBtYXR1cml0eV9kYXRlPXNlbGYubWF0dXJpdHlfZGF0ZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJtYXR1cml0eV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hdHVyaXR5X2RhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MjQKICAgIC8vIHN1c3BlbmRlZD1zZWxmLmFzc2V0X3N1c3BlbmRlZCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMyAvLyAiYXNzZXRfc3VzcGVuZGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X3N1c3BlbmRlZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQyNQogICAgLy8gcGVyZm9ybWFuY2U9YXJjNC5VSW50OChwZXJmb3JtYW5jZSksCiAgICBkaWcgMTUKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzMgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQxMC00MjYKICAgIC8vIHJldHVybiB0eXAuQXNzZXRJbmZvKAogICAgLy8gICAgIGRlbm9taW5hdGlvbl9hc3NldF9pZD1zZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZC5pZCwKICAgIC8vICAgICBzZXR0bGVtZW50X2Fzc2V0X2lkPXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5pZCwKICAgIC8vICAgICBvdXRzdGFuZGluZ19wcmluY2lwYWw9c2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwoKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPXNlbGYudW5pdF92YWx1ZSwKICAgIC8vICAgICBkYXlfY291bnRfY29udmVudGlvbj1hcmM0LlVJbnQ4KHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24pLAogICAgLy8gICAgIHByaW5jaXBhbF9kaXNjb3VudD1hcmM0LlVJbnQxNihzZWxmLnByaW5jaXBhbF9kaXNjb3VudCksCiAgICAvLyAgICAgaW50ZXJlc3RfcmF0ZT1hcmM0LlVJbnQxNihzZWxmLmludGVyZXN0X3JhdGUpLAogICAgLy8gICAgIHRvdGFsX3N1cHBseT1zZWxmLnRvdGFsX3VuaXRzLAogICAgLy8gICAgIGNpcmN1bGF0aW5nX3N1cHBseT1zZWxmLmNpcmN1bGF0aW5nX3VuaXRzLAogICAgLy8gICAgIHByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZT1zZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSwKICAgIC8vICAgICBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGU9c2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUsCiAgICAvLyAgICAgaXNzdWFuY2VfZGF0ZT1zZWxmLmlzc3VhbmNlX2RhdGUsCiAgICAvLyAgICAgbWF0dXJpdHlfZGF0ZT1zZWxmLm1hdHVyaXR5X2RhdGUsCiAgICAvLyAgICAgc3VzcGVuZGVkPXNlbGYuYXNzZXRfc3VzcGVuZGVkLAogICAgLy8gICAgIHBlcmZvcm1hbmNlPWFyYzQuVUludDgocGVyZm9ybWFuY2UpLAogICAgLy8gKQogICAgdW5jb3ZlciAxNAogICAgaXRvYgogICAgdW5jb3ZlciAxNAogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDExCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTEKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMAogICAgY29uY2F0CiAgICB1bmNvdmVyIDkKICAgIGNvbmNhdAogICAgdW5jb3ZlciA4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDcKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGJ5dGVjIDMxIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDQKICAgIHNldGJpdAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjM5MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb21tb24uQ29yZUZpbmFuY2lhbENvbW1vbk1peGluLmdldF90aW1lX2V2ZW50c1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF90aW1lX2V2ZW50czoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQzNgogICAgLy8gdGltZV9ldmVudHMgPSB0eXAuVGltZUV2ZW50cygpCiAgICBieXRlYyAzMCAvLyAweDAwMDAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGVubS5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgMTAwCiAgICA9PQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDM3CiAgICAvLyBpZiBzZWxmLnN0YXR1c19pc19hY3RpdmUoKToKICAgIGJ6IGdldF90aW1lX2V2ZW50c19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQzOAogICAgLy8gdGltZV9ldmVudHMgPSBzZWxmLnRpbWVfZXZlbnRzLnZhbHVlLmNvcHkoKQogICAgYnl0ZWMgMTIgLy8gMHg3NDY5NmQ2NTQ1NzY2NTZlNzQ3MwogICAgYm94X2dldAogICAgc3dhcAogICAgYnVyeSAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50aW1lX2V2ZW50cyBleGlzdHMKCmdldF90aW1lX2V2ZW50c19hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmNvcmVfZmluYW5jaWFsLmNvbW1vbi5Db3JlRmluYW5jaWFsQ29tbW9uTWl4aW4uZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGVbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZToKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQ1MAogICAgLy8gKHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUsIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTggLy8gInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQ0OS00NTEKICAgIC8vIHJldHVybiB0eXAuVGltZUV2ZW50cygKICAgIC8vICAgICAoc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSwgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSkKICAgIC8vICkKICAgIHN3YXAKICAgIGl0b2IKICAgIHB1c2hieXRlcyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0NDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY29tbW9uLkNvcmVGaW5hbmNpYWxDb21tb25NaXhpbi5nZXRfYXNzZXRfbWV0YWRhdGFbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXNzZXRfbWV0YWRhdGE6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0NjIKICAgIC8vIHJldHVybiB0eXAuQXNzZXRNZXRhZGF0YS5mcm9tX2J5dGVzKHNlbGYubWV0YWRhdGEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjUgLy8gIm1ldGFkYXRhIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1ldGFkYXRhIGV4aXN0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDUzCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5hY2NvdW50X2dvdl9zdXNwZW5zaW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF9nb3Zfc3VzcGVuc2lvbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzcKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDEzIC8vIDB4NTIzNzMwMjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozMQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTE0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGR1cAogICAgcHVzaGludCA1NgogICAgaW50Y18xIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIHB1c2hpbnQgNTYKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTE1CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF9vcGVuW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF9vcGVuOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjY4CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hY2NvdW50X21hbmFnZXIsIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAxNCAvLyAweDUyMzQzMDIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjgKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBlbm0uU1RBVFVTX0VOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGludGMgNSAvLyAyMDAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTM5CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuc3RhdHVzX2lzX2VuZGVkKCksIGVyci5VTkFVVEhPUklaRUQKICAgICEKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE0MAogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTQxCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNDIKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNDYKICAgIC8vIHVuaXRzPVVJbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTQ0LTE1MAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSB0eXAuQWNjb3VudEluZm8oCiAgICAvLyAgICAgcGF5bWVudF9hZGRyZXNzPXBheW1lbnRfYWRkcmVzcywKICAgIC8vICAgICB1bml0cz1VSW50NjQoMCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1VSW50NjQoMCksCiAgICAvLyAgICAgcGFpZF9jb3Vwb25zPVVJbnQ2NCgwKSwKICAgIC8vICAgICBzdXNwZW5kZWQ9RmFsc2UsCiAgICAvLyApCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgMzEgLy8gMHgwMAogICAgY29uY2F0CiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTUxCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfY2xvc2Vbcm91dGluZ10oKSAtPiB2b2lkOgphY2NvdW50X2Nsb3NlOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2OAogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMTQgLy8gMHg1MjM0MzAyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE3MQogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNzQKICAgIC8vIGNsb3NlZF91bml0cyA9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzCiAgICBkdXAKICAgIGJveF9nZXQKICAgIHBvcAogICAgaW50Y18yIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE3NQogICAgLy8gZGVsIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdCiAgICBzd2FwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNzYKICAgIC8vIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgLT0gY2xvc2VkX3VuaXRzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBkaWcgMQogICAgLQogICAgYnl0ZWNfMyAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE3NwogICAgLy8gc2VsZi5lbmRfaWZfbm9fY2lyY3VsYXRpbmdfdW5pdHMoKQogICAgY2FsbHN1YiBlbmRfaWZfbm9fY2lyY3VsYXRpbmdfdW5pdHMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNzgKICAgIC8vIHJldHVybiBjbG9zZWRfdW5pdHMsIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTUzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHN3YXAKICAgIGl0b2IKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzczoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMDAKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcywgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgZGlnIDIKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMDEKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIwMgogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIwNAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzID0gcGF5bWVudF9hZGRyZXNzCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIwNQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5hY2NvdW50X2dldF9pbmZvW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF9nZXRfaW5mbzoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMjIKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjA3CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3JvdGF0ZV9hcnJhbmdlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfcm90YXRlX2FycmFuZ2VyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTgKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTkKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSBuZXdfYXJyYW5nZXIKICAgIGJ5dGVjIDggLy8gMHg1MjMyMzAyMwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNjAKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19zZXRfb3BfZGFlbW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19zZXRfb3BfZGFlbW9uOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzMKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzQKICAgIC8vIHNlbGYub3BfZGFlbW9uLnZhbHVlID0gYWRkcmVzcwogICAgYnl0ZWMgMjIgLy8gMHg1MjMyMzUyMwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzUKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19hc3NpZ25fcm9sZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfYXNzaWduX3JvbGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTc3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxOTkKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDAKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwMQogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDEKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKToKICAgIHB1c2hpbnQgMjAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwMgogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgOCAvLyAweDUyMzIzMDIzCiAgICBkaWcgMwogICAgYXBwX2dsb2JhbF9wdXQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fdXBzZXJ0X3JvbGVAMTQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAzCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA1CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDQwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDYKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDE0IC8vIDB4NTIzNDMwMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwNwogICAgLy8gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDIKICAgIC8vIHNlbGYuX3Vwc2VydF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgY29uZmlnKQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3Vwc2VydF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDkKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKToKICAgIGR1cAogICAgcHVzaGludCA1MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTEwCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIxIC8vIDB4NTIzNTMwMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMQogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcyhjb25maWcpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwMgogICAgLy8gc2VsZi5fdXBzZXJ0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCBjb25maWcpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fdXBzZXJ0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMwogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNjAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNAogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIwIC8vIDB4NTIzNjMwMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNQogICAgLy8gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZykKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAyCiAgICAvLyBzZWxmLl91cHNlcnRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIGNvbmZpZykKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl91cHNlcnRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE3CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE4CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAxMyAvLyAweDUyMzczMDIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTkKICAgIC8vIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZykKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAyCiAgICAvLyBzZWxmLl91cHNlcnRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIGNvbmZpZykKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl91cHNlcnRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMQogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKToKICAgIGR1cAogICAgcHVzaGludCA4MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fdXBzZXJ0X3JvbGVAMTQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjIKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuaW50ZXJlc3Rfb3JhY2xlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDMyIC8vIDB4NTIzODMwMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMwogICAgLy8gc2VsZi5pbnRlcmVzdF9vcmFjbGVbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl91cHNlcnRfcm9sZUAxNAoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfcmV2b2tlX3JvbGVbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3Jldm9rZV9yb2xlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNAogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNQogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI2CiAgICAvLyBzZWxmLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpKQogICAgYnRvaQogICAgZHVwbiAyCiAgICBjYWxsc3ViIF9hc3NlcnRfdmFsaWRfcm9sZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyNgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgIT0gVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwgZXJyLklOVkFMSURfUk9MRQogICAgZHVwCiAgICBwdXNoaW50IDIwCiAgICAhPQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI3CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI4CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDE0IC8vIDB4NTIzNDMwMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyOQogICAgLy8gZGVsIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjgKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzEKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKToKICAgIGR1cAogICAgcHVzaGludCA1MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMyCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjEgLy8gMHg1MjM1MzAyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMzCiAgICAvLyBkZWwgc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjcKICAgIC8vIHNlbGYuX2RlbGV0ZV9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcykKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM1CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKToKICAgIGR1cAogICAgcHVzaGludCA2MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM2CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMCAvLyAweDUyMzYzMDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzcKICAgIC8vIGRlbCBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI3CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzOQogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKToKICAgIGR1cAogICAgcHVzaGludCA3MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQwCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDEzIC8vIDB4NTIzNzMwMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MQogICAgLy8gZGVsIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNwogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDMKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSk6CiAgICBkdXAKICAgIHB1c2hpbnQgODAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ0CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuaW50ZXJlc3Rfb3JhY2xlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDMyIC8vIDB4NTIzODMwMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NQogICAgLy8gZGVsIHNlbGYuaW50ZXJlc3Rfb3JhY2xlW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nb3ZfYXNzZXRfc3VzcGVuc2lvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ292X2Fzc2V0X3N1c3BlbnNpb246CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QgICMgVE9ETzogVXBkYXRlIHNwZWNzIGFuZCBhZGQgdGVzdAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo3NwogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYXV0aG9yaXR5LCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMTMgLy8gMHg1MjM3MzAyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0NgogICAgLy8gc2VsZi5hc3NldF9zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGJ5dGVjIDIzIC8vICJhc3NldF9zdXNwZW5kZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0NwogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QgICMgVE9ETzogVXBkYXRlIHNwZWNzIGFuZCBhZGQgdGVzdAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X2FycmFuZ2VyW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU3CiAgICAvLyByZXR1cm4gc2VsZi5hcnJhbmdlci52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDggLy8gMHg1MjMyMzAyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYWRkcmVzc19yb2xlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3MwogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hY2NvdW50X21hbmFnZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMTQgLy8gMHg1MjM0MzAyMwogICAgZGlnIDEKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjc0CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnByaW1hcnlfZGVhbGVyLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDIxIC8vIDB4NTIzNTMwMjMKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3NQogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi50cnVzdGVlLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDIwIC8vIDB4NTIzNjMwMjMKICAgIGRpZyAzCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3NgogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIGFkZHJlc3MpLAogICAgYnl0ZWMgMTMgLy8gMHg1MjM3MzAyMwogICAgZGlnIDQKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjc3CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmludGVyZXN0X29yYWNsZSwgYWRkcmVzcyksCiAgICBieXRlYyAzMiAvLyAweDUyMzgzMDIzCiAgICB1bmNvdmVyIDUKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjIDMxIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDYKICAgIHNldGJpdAogICAgaW50Y18xIC8vIDEKICAgIHVuY292ZXIgNQogICAgc2V0Yml0CiAgICBwdXNoaW50IDIKICAgIHVuY292ZXIgNAogICAgc2V0Yml0CiAgICBwdXNoaW50IDMKICAgIHVuY292ZXIgMwogICAgc2V0Yml0CiAgICBwdXNoaW50IDQKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV9jb25maWdbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9yb2xlX2NvbmZpZzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTQKICAgIC8vIHJvbGUgPSByb2xlX2lkLmFzX3VpbnQ2NCgpCiAgICBidG9pCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjk1CiAgICAvLyBzZWxmLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlKQogICAgZHVwCiAgICBjYWxsc3ViIF9hc3NlcnRfdmFsaWRfcm9sZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5NwogICAgLy8gY2FzZSBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpOgogICAgcHVzaGludHMgMjAgNDAgNTAgNjAgNzAgODAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTYtMzI3CiAgICAvLyBtYXRjaCByb2xlOgogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKToKICAgIC8vICAgICAgICAgcmV0dXJuIHR5cC5Sb2xlQ29uZmlnKAogICAgLy8gICAgICAgICAgICAgcm9sZV92YWxpZGl0eV9zdGFydD1VSW50NjQoMCksIHJvbGVfdmFsaWRpdHlfZW5kPVVJbnQ2NCgwKQogICAgLy8gICAgICAgICApCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5hdXRob3JpdHksIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLmludGVyZXN0X29yYWNsZSwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5pbnRlcmVzdF9vcmFjbGVbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgXzoKICAgIC8vICAgICAgICAgb3AuZXJyKGVyci5JTlZBTElEX1JPTEUpCiAgICB1bmNvdmVyIDYKICAgIG1hdGNoIHJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzBAMiByYmFjX2dldF9yb2xlX2NvbmZpZ19zd2l0Y2hfY2FzZV8xQDMgcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfMkA0IHJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzNANSByYmFjX2dldF9yb2xlX2NvbmZpZ19zd2l0Y2hfY2FzZV80QDYgcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfNUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI3CiAgICAvLyBvcC5lcnIoZXJyLklOVkFMSURfUk9MRSkKICAgIGVyciAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgoKcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfNUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMwogICAgLy8gc2VsZi5pbnRlcmVzdF9vcmFjbGUsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMzIgLy8gMHg1MjM4MzAyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMi0zMjQKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLmludGVyZXN0X29yYWNsZSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI1CiAgICAvLyByZXR1cm4gc2VsZi5pbnRlcmVzdF9vcmFjbGVbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCgpyYmFjX2dldF9yb2xlX2NvbmZpZ19hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfY29uZmlnQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzRANjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTgKICAgIC8vIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDEzIC8vIDB4NTIzNzMwMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5hdXRob3JpdHksIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMAogICAgLy8gcmV0dXJuIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfY29uZmlnX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV9jb25maWdAOQoKcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfM0A1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxMwogICAgLy8gc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDIwIC8vIDB4NTIzNjMwMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTItMzE0CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTUKICAgIC8vIHJldHVybiBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV9jb25maWdfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX2NvbmZpZ0A5CgpyYmFjX2dldF9yb2xlX2NvbmZpZ19zd2l0Y2hfY2FzZV8yQDQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA4CiAgICAvLyBzZWxmLnByaW1hcnlfZGVhbGVyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDIxIC8vIDB4NTIzNTMwMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDctMzA5CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEwCiAgICAvLyByZXR1cm4gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX2NvbmZpZ19hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfY29uZmlnQDkKCnJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzFAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDMKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDE0IC8vIDB4NTIzNDMwMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDItMzA0CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwNQogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfY29uZmlnX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV9jb25maWdAOQoKcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfMEAyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5OC0zMDAKICAgIC8vIHJldHVybiB0eXAuUm9sZUNvbmZpZygKICAgIC8vICAgICByb2xlX3ZhbGlkaXR5X3N0YXJ0PVVJbnQ2NCgwKSwgcm9sZV92YWxpZGl0eV9lbmQ9VUludDY0KDApCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfY29uZmlnX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV9jb25maWdAOQoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY291cG9uLkZpeGVkQ291cG9uQ2FzaGZsb3dNaXhpbi5jb3VudF9kdWVfY291cG9ucygpIC0+IHVpbnQ2NDoKY291bnRfZHVlX2NvdXBvbnM6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxMTEKICAgIC8vIGRlZiBjb3VudF9kdWVfY291cG9ucyhzZWxmKSAtPiBVSW50NjQ6CiAgICBwcm90byAwIDEKICAgIHB1c2hieXRlcyAiIgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTEyCiAgICAvLyBjdXJyZW50X3RzID0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGR1cAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTEzCiAgICAvLyBkdWVfY291cG9ucyA9IHNlbGYuZHVlX2NvdXBvbnNfd2F0ZXJtYXJrCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjkgLy8gImR1ZV9jb3Vwb25zX3dhdGVybWFyayIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBjb3ZlciAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kdWVfY291cG9uc193YXRlcm1hcmsgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxMTQKICAgIC8vIGlmIGN1cnJlbnRfdHMgPj0gc2VsZi5tYXR1cml0eV9kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgID49CiAgICBieiBjb3VudF9kdWVfY291cG9uc19lbHNlX2JvZHlAMgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTE1CiAgICAvLyBkdWVfY291cG9ucyA9IHNlbGYudG90YWxfY291cG9ucwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF9jb3Vwb25zIGV4aXN0cwoKY291bnRfZHVlX2NvdXBvbnNfYWZ0ZXJfaWZfZWxzZUA4OgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTI5CiAgICAvLyBzZWxmLmR1ZV9jb3Vwb25zX3dhdGVybWFyayA9IGR1ZV9jb3Vwb25zCiAgICBieXRlYyAyOSAvLyAiZHVlX2NvdXBvbnNfd2F0ZXJtYXJrIgogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjEzMAogICAgLy8gcmV0dXJuIGR1ZV9jb3Vwb25zCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKY291bnRfZHVlX2NvdXBvbnNfZWxzZV9ib2R5QDI6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxMTYKICAgIC8vIGVsaWYgY3VycmVudF90cyA+IHNlbGYuaXNzdWFuY2VfZGF0ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJpc3N1YW5jZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzc3VhbmNlX2RhdGUgZXhpc3RzCiAgICBmcmFtZV9kaWcgMQogICAgPAogICAgYnogY291bnRfZHVlX2NvdXBvbnNfYWZ0ZXJfaWZfZWxzZUA4CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxMTgKICAgIC8vIFVJbnQ2NChmaXhlZF9jZmcuRklSU1RfQ09VUE9OX0RBVEVfSURYKSArIHNlbGYuZHVlX2NvdXBvbnNfd2F0ZXJtYXJrCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjkgLy8gImR1ZV9jb3Vwb25zX3dhdGVybWFyayIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kdWVfY291cG9uc193YXRlcm1hcmsgZXhpc3RzCiAgICBwdXNoaW50IDMKICAgICsKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxMjAKICAgIC8vIGNvdXBvbl9kdWVfZGF0ZSA9IHNlbGYudGltZV9ldmVudHMudmFsdWVbY291cG9uX2lkeF0KICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIGJ5dGVjIDEyIC8vIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMKICAgIHN3YXAKICAgIGludGNfMyAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQoKY291bnRfZHVlX2NvdXBvbnNfd2hpbGVfdG9wQDQ6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxMjEKICAgIC8vIHdoaWxlIGN1cnJlbnRfdHMgPj0gY291cG9uX2R1ZV9kYXRlOgogICAgZnJhbWVfZGlnIDEKICAgIDw9CiAgICBieiBjb3VudF9kdWVfY291cG9uc19hZnRlcl93aGlsZUA2CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxMjMKICAgIC8vIHJlcXVpcmVkX2J1ZGdldD1VSW50NjQoZml4ZWRfY2ZnLk9QX1VQX0NPVVBPTl9EVUVfQ09VTlRJTkcpLAogICAgaW50YyA0IC8vIDI1NQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTI0CiAgICAvLyBmZWVfc291cmNlPU9wVXBGZWVTb3VyY2UuR3JvdXBDcmVkaXQsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTIyLTEyNQogICAgLy8gZW5zdXJlX2J1ZGdldCgKICAgIC8vICAgICByZXF1aXJlZF9idWRnZXQ9VUludDY0KGZpeGVkX2NmZy5PUF9VUF9DT1VQT05fRFVFX0NPVU5USU5HKSwKICAgIC8vICAgICBmZWVfc291cmNlPU9wVXBGZWVTb3VyY2UuR3JvdXBDcmVkaXQsCiAgICAvLyApCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjEyNgogICAgLy8gY291cG9uX2lkeCArPSAxCiAgICBmcmFtZV9kaWcgMAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxMjcKICAgIC8vIGNvdXBvbl9kdWVfZGF0ZSA9IHNlbGYudGltZV9ldmVudHMudmFsdWVbY291cG9uX2lkeF0KICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIGJ5dGVjIDEyIC8vIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMKICAgIHN3YXAKICAgIGludGNfMyAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgYiBjb3VudF9kdWVfY291cG9uc193aGlsZV90b3BANAoKY291bnRfZHVlX2NvdXBvbnNfYWZ0ZXJfd2hpbGVANjoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjEyOAogICAgLy8gZHVlX2NvdXBvbnMgPSBjb3Vwb25faWR4IC0gZml4ZWRfY2ZnLkZJUlNUX0NPVVBPTl9EQVRFX0lEWAogICAgZnJhbWVfZGlnIDAKICAgIHB1c2hpbnQgMwogICAgLQogICAgZnJhbWVfYnVyeSAyCiAgICBiIGNvdW50X2R1ZV9jb3Vwb25zX2FmdGVyX2lmX2Vsc2VAOAoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY291cG9uLkZpeGVkQ291cG9uQ2FzaGZsb3dNaXhpbi5jb3Vwb25fZHVlX2RhdGUoY291cG9uOiB1aW50NjQpIC0+IHVpbnQ2NDoKY291cG9uX2R1ZV9kYXRlOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTMyCiAgICAvLyBkZWYgY291cG9uX2R1ZV9kYXRlKHNlbGYsIGNvdXBvbjogVUludDY0KSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjEzMwogICAgLy8gcmV0dXJuIHNlbGYudGltZV9ldmVudHMudmFsdWVbZml4ZWRfY2ZnLkZJUlNUX0NPVVBPTl9EQVRFX0lEWCArIGNvdXBvbiAtIDFdCiAgICBwdXNoaW50IDMKICAgIGZyYW1lX2RpZyAtMQogICAgKwogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIGJ5dGVjIDEyIC8vIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMKICAgIHN3YXAKICAgIGludGNfMyAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb3Vwb24uRml4ZWRDb3Vwb25DYXNoZmxvd01peGluLm5leHRfY291cG9uX2R1ZV9kYXRlKGR1ZV9jb3Vwb25zOiB1aW50NjQpIC0+IHVpbnQ2NDoKbmV4dF9jb3Vwb25fZHVlX2RhdGU6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxNDEKICAgIC8vIGRlZiBuZXh0X2NvdXBvbl9kdWVfZGF0ZShzZWxmLCBkdWVfY291cG9uczogVUludDY0KSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjE0MgogICAgLy8gY291cG9uX2R1ZV9kYXRlID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxNDMKICAgIC8vIGlmIGR1ZV9jb3Vwb25zIDwgc2VsZi50b3RhbF9jb3Vwb25zOgogICAgZHVwCiAgICBieXRlYyA3IC8vICJ0b3RhbF9jb3Vwb25zIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX2NvdXBvbnMgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgID4KICAgIGJ6IG5leHRfY291cG9uX2R1ZV9kYXRlX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTQ0CiAgICAvLyBjb3Vwb25fZHVlX2RhdGUgPSBzZWxmLmNvdXBvbl9kdWVfZGF0ZShkdWVfY291cG9ucyArIDEpCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBjYWxsc3ViIGNvdXBvbl9kdWVfZGF0ZQogICAgZnJhbWVfYnVyeSAwCgpuZXh0X2NvdXBvbl9kdWVfZGF0ZV9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxNDUKICAgIC8vIHJldHVybiBjb3Vwb25fZHVlX2RhdGUKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmNvcmVfZmluYW5jaWFsLmNvdXBvbi5GaXhlZENvdXBvbkNhc2hmbG93TWl4aW4uY291cG9uX2ludGVyZXN0X2Ftb3VudChwcmluY2lwYWxfYW1vdW50OiB1aW50NjQsIGNvdXBvbjogdWludDY0KSAtPiB1aW50NjQ6CmNvdXBvbl9pbnRlcmVzdF9hbW91bnQ6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxNDctMTQ5CiAgICAvLyBkZWYgY291cG9uX2ludGVyZXN0X2Ftb3VudCgKICAgIC8vICAgICBzZWxmLCBwcmluY2lwYWxfYW1vdW50OiBVSW50NjQsIGNvdXBvbjogVUludDY0CiAgICAvLyApIC0+IFVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTUwCiAgICAvLyBjb3Vwb25fcmF0ZV9icHMgPSBzZWxmLmNvdXBvbl9yYXRlcy52YWx1ZVtjb3Vwb24gLSAxXS5hc191aW50NjQoKQogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgcHVzaGludCAyCiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIGJ5dGVjIDE5IC8vIDB4NjM2Zjc1NzA2ZjZlNTI2MTc0NjU3MwogICAgc3dhcAogICAgcHVzaGludCAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTUxCiAgICAvLyByZXR1cm4gcHJpbmNpcGFsX2Ftb3VudCAqIGNvdXBvbl9yYXRlX2JwcyAvLyBjc3QuQlBTCiAgICBmcmFtZV9kaWcgLTIKICAgICoKICAgIHB1c2hpbnQgMTAwMDAKICAgIC8KICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY291cG9uLkZpeGVkQ291cG9uQ2FzaGZsb3dNaXhpbi5kYXlfY291bnRfZmFjdG9yKGR1ZV9jb3Vwb25zOiB1aW50NjQpIC0+IGJ5dGVzOgpkYXlfY291bnRfZmFjdG9yOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTUzCiAgICAvLyBkZWYgZGF5X2NvdW50X2ZhY3RvcihzZWxmLCBkdWVfY291cG9uczogVUludDY0KSAtPiB0eXAuRGF5Q291bnRGYWN0b3I6CiAgICBwcm90byAxIDEKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxNTQtMTU1CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgb25seSB0aGUgQWN0dWFsL0FjdHVhbCBhbmQgQ29udGludW91cyBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGlmIG5vdCBkdWVfY291cG9uczoKICAgIGZyYW1lX2RpZyAtMQogICAgYm56IGRheV9jb3VudF9mYWN0b3JfZWxzZV9ib2R5QDIKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjE1NgogICAgLy8gYWNjcnVpbmdfc3RhcnRfdGltZSA9IHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKCmRheV9jb3VudF9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTU5CiAgICAvLyBjb3Vwb25fYWNjcnVlZF9wZXJpb2QgPSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCAtIGFjY3J1aW5nX3N0YXJ0X3RpbWUKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGRpZyAxCiAgICAtCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjE2MAogICAgLy8gY291cG9uX3BlcmlvZCA9IHNlbGYubmV4dF9jb3Vwb25fZHVlX2RhdGUoZHVlX2NvdXBvbnMpIC0gYWNjcnVpbmdfc3RhcnRfdGltZQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIG5leHRfY291cG9uX2R1ZV9kYXRlCiAgICBzd2FwCiAgICAtCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxNjEKICAgIC8vIGlmIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPT0gVUludDY0KGNzdC5EQ0NfQV9BKToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gZXhpc3RzCiAgICBibnogZGF5X2NvdW50X2ZhY3Rvcl9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE2MgogICAgLy8gcmV0dXJuIHRpbWVfcGVyaW9kIC8vIFVJbnQ2NChjc3QuREFZXzJfU0VDKQogICAgZnJhbWVfZGlnIDAKICAgIGludGMgNiAvLyA4NjQwMAogICAgLwogICAgZnJhbWVfYnVyeSAwCiAgICBpbnRjIDYgLy8gODY0MDAKICAgIC8KCmRheV9jb3VudF9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTY0LTE2NwogICAgLy8gcmV0dXJuIHR5cC5EYXlDb3VudEZhY3RvcigKICAgIC8vICAgICBudW1lcmF0b3I9Y291cG9uX2FjY3J1ZWRfcGVyaW9kLAogICAgLy8gICAgIGRlbm9taW5hdG9yPWNvdXBvbl9wZXJpb2QsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMAogICAgaXRvYgogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZGF5X2NvdW50X2ZhY3Rvcl9lbHNlX2JvZHlAMjoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjEzNgogICAgLy8gY291cG9uX2R1ZV9kYXRlID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjEzNwogICAgLy8gaWYgZHVlX2NvdXBvbnMgPj0gVUludDY0KDEpOgogICAgZnJhbWVfZGlnIC0xCiAgICBieiBkYXlfY291bnRfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAOAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTM4CiAgICAvLyBjb3Vwb25fZHVlX2RhdGUgPSBzZWxmLmNvdXBvbl9kdWVfZGF0ZShkdWVfY291cG9ucykKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBjb3Vwb25fZHVlX2RhdGUKICAgIGZyYW1lX2J1cnkgMQoKZGF5X2NvdW50X2ZhY3Rvcl9hZnRlcl9pZl9lbHNlQDg6CiAgICBmcmFtZV9kaWcgMQogICAgYiBkYXlfY291bnRfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAMwoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY291cG9uLkZpeGVkQ291cG9uQ2FzaGZsb3dNaXhpbi5pc19hY2NydWluZ19pbnRlcmVzdChkdWVfY291cG9uczogdWludDY0KSAtPiB1aW50NjQ6CmlzX2FjY3J1aW5nX2ludGVyZXN0OgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTY5CiAgICAvLyBkZWYgaXNfYWNjcnVpbmdfaW50ZXJlc3Qoc2VsZiwgZHVlX2NvdXBvbnM6IFVJbnQ2NCkgLT4gYm9vbDoKICAgIHByb3RvIDEgMQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTcxCiAgICAvLyBzZWxmLmlzc3VhbmNlX2RhdGUgIT0gMAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjE3MS0xNzMKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZSAhPSAwCiAgICAvLyBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5pc3N1YW5jZV9kYXRlCiAgICAvLyBhbmQgZHVlX2NvdXBvbnMgPCBzZWxmLnRvdGFsX2NvdXBvbnMKICAgIGJ6IGlzX2FjY3J1aW5nX2ludGVyZXN0X2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTcyCiAgICAvLyBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5pc3N1YW5jZV9kYXRlCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pc3N1YW5jZV9kYXRlIGV4aXN0cwogICAgPj0KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjE3MS0xNzMKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZSAhPSAwCiAgICAvLyBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5pc3N1YW5jZV9kYXRlCiAgICAvLyBhbmQgZHVlX2NvdXBvbnMgPCBzZWxmLnRvdGFsX2NvdXBvbnMKICAgIGJ6IGlzX2FjY3J1aW5nX2ludGVyZXN0X2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTczCiAgICAvLyBhbmQgZHVlX2NvdXBvbnMgPCBzZWxmLnRvdGFsX2NvdXBvbnMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJ0b3RhbF9jb3Vwb25zIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX2NvdXBvbnMgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgID4KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjE3MS0xNzMKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZSAhPSAwCiAgICAvLyBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5pc3N1YW5jZV9kYXRlCiAgICAvLyBhbmQgZHVlX2NvdXBvbnMgPCBzZWxmLnRvdGFsX2NvdXBvbnMKICAgIGJ6IGlzX2FjY3J1aW5nX2ludGVyZXN0X2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjE3MC0xNzQKICAgIC8vIHJldHVybiAoCiAgICAvLyAgICAgc2VsZi5pc3N1YW5jZV9kYXRlICE9IDAKICAgIC8vICAgICBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5pc3N1YW5jZV9kYXRlCiAgICAvLyAgICAgYW5kIGR1ZV9jb3Vwb25zIDwgc2VsZi50b3RhbF9jb3Vwb25zCiAgICAvLyApCiAgICByZXRzdWIKCmlzX2FjY3J1aW5nX2ludGVyZXN0X2Jvb2xfZmFsc2VANDoKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxNzAtMTc0CiAgICAvLyByZXR1cm4gKAogICAgLy8gICAgIHNlbGYuaXNzdWFuY2VfZGF0ZSAhPSAwCiAgICAvLyAgICAgYW5kIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID49IHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgLy8gICAgIGFuZCBkdWVfY291cG9ucyA8IHNlbGYudG90YWxfY291cG9ucwogICAgLy8gKQogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb3Vwb24uRml4ZWRDb3Vwb25DYXNoZmxvd01peGluLmFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50KGhvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHVuaXRzOiB1aW50NjQsIGR1ZV9jb3Vwb25zOiB1aW50NjQpIC0+IHVpbnQ2NDoKYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQ6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxNzYtMTc4CiAgICAvLyBkZWYgYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQoCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50LCB1bml0czogVUludDY0LCBkdWVfY291cG9uczogVUludDY0CiAgICAvLyApIC0+IFVJbnQ2NDoKICAgIHByb3RvIDMgMQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTc5LTE4MAogICAgLy8gIyBUaGUgZm9sbG93aW5nIGFzc2VydCBzYWZlZ3VhcmRzIHRoZSBzdWJyb3V0aW5lIGZyb20gZm9yYmlkZGVuIGludm9jYXRpb25zCiAgICAvLyBzZWxmLmFzc2VydF9ub19wZW5kaW5nX2NvdXBvbl9wYXltZW50KGhvbGRpbmdfYWRkcmVzcywgZHVlX2NvdXBvbnMpCiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBhc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTgxCiAgICAvLyBkYXlfY291bnRfZmFjdG9yID0gc2VsZi5kYXlfY291bnRfZmFjdG9yKGR1ZV9jb3Vwb25zKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGRheV9jb3VudF9mYWN0b3IKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjE4MgogICAgLy8gY291cG9uX2FjY3J1ZWRfcGVyaW9kID0gZGF5X2NvdW50X2ZhY3Rvci5udW1lcmF0b3IKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxODMKICAgIC8vIGNvdXBvbl9wZXJpb2QgPSBkYXlfY291bnRfZmFjdG9yLmRlbm9taW5hdG9yCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjE4NAogICAgLy8gbmV4dF9jb3Vwb25fcmF0ZV9icHMgPSBzZWxmLmNvdXBvbl9yYXRlcy52YWx1ZVtkdWVfY291cG9uc10uYXNfdWludDY0KCkKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAyCiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIGJ5dGVjIDE5IC8vIDB4NjM2Zjc1NzA2ZjZlNTI2MTc0NjU3MwogICAgc3dhcAogICAgcHVzaGludCAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTg3CiAgICAvLyBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIGFjY291bnRfdW5pdHNfdmFsdWUKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjE4Ny0xODgKICAgIC8vIHNlbGYuYWNjb3VudF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MsIHVuaXRzKQogICAgLy8gKiBuZXh0X2NvdXBvbl9yYXRlX2JwcwogICAgKgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTg3LTE4OQogICAgLy8gc2VsZi5hY2NvdW50X3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcywgdW5pdHMpCiAgICAvLyAqIG5leHRfY291cG9uX3JhdGVfYnBzCiAgICAvLyAqIGNvdXBvbl9hY2NydWVkX3BlcmlvZAogICAgdW5jb3ZlciAyCiAgICAqCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxOTAKICAgIC8vIC8vIChjc3QuQlBTICogY291cG9uX3BlcmlvZCkKICAgIHB1c2hpbnQgMTAwMDAKICAgIHVuY292ZXIgMgogICAgKgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTg3LTE5MAogICAgLy8gc2VsZi5hY2NvdW50X3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcywgdW5pdHMpCiAgICAvLyAqIG5leHRfY291cG9uX3JhdGVfYnBzCiAgICAvLyAqIGNvdXBvbl9hY2NydWVkX3BlcmlvZAogICAgLy8gLy8gKGNzdC5CUFMgKiBjb3Vwb25fcGVyaW9kKQogICAgLwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTg1LTE5MQogICAgLy8gIyBkdWVfY291cG9ucyBpcyBlcXVhbCB0byB0aGUgMC1iYXNlIGlkeCBvZiBuZXh0IGNvdXBvbgogICAgLy8gcmV0dXJuICgKICAgIC8vICAgICBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIC8vICAgICAqIG5leHRfY291cG9uX3JhdGVfYnBzCiAgICAvLyAgICAgKiBjb3Vwb25fYWNjcnVlZF9wZXJpb2QKICAgIC8vICAgICAvLyAoY3N0LkJQUyAqIGNvdXBvbl9wZXJpb2QpCiAgICAvLyApICAjIGRpdi1ieS16ZXJvOiBjb3Vwb25fcGVyaW9kICE9IDAgZHVlIHRvIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQgY2hlY2tzCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmNvcmVfZmluYW5jaWFsLmNvdXBvbi5Db3Vwb25DYXNoZmxvd01peGluLmFsbF9kdWVfY291cG9uc19wYWlkKGR1ZV9jb3Vwb25zOiB1aW50NjQpIC0+IHVpbnQ2NDoKYWxsX2R1ZV9jb3Vwb25zX3BhaWQ6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToyNgogICAgLy8gZGVmIGFsbF9kdWVfY291cG9uc19wYWlkKHNlbGYsIGR1ZV9jb3Vwb25zOiBVSW50NjQpIC0+IGJvb2w6CiAgICBwcm90byAxIDEKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjI3CiAgICAvLyByZXR1cm4gc2VsZi5wYWlkX2NvdXBvbl91bml0cyA+PSBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICogZHVlX2NvdXBvbnMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyOCAvLyAicGFpZF9jb3Vwb25fdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucGFpZF9jb3Vwb25fdW5pdHMgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgICoKICAgID49CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmNvcmVfZmluYW5jaWFsLmNvdXBvbi5Db3Vwb25DYXNoZmxvd01peGluLmFzc2VydF9ub19wZW5kaW5nX2NvdXBvbl9wYXltZW50KGhvbGRpbmdfYWRkcmVzczogYnl0ZXMsIGR1ZV9jb3Vwb25zOiB1aW50NjQpIC0+IHZvaWQ6CmFzc2VydF9ub19wZW5kaW5nX2NvdXBvbl9wYXltZW50OgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MjktMzEKICAgIC8vIGRlZiBhc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudCgKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IEFjY291bnQsIGR1ZV9jb3Vwb25zOiBVSW50NjQKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MzMKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucyA9PSBkdWVfY291cG9ucwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHB1c2hpbnQgNDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBmcmFtZV9kaWcgLTEKICAgID09CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTozMi0zNAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMgPT0gZHVlX2NvdXBvbnMKICAgIC8vICksIGVyci5QRU5ESU5HX0NPVVBPTl9QQVlNRU5UCiAgICBhc3NlcnQgLy8gUGVuZGluZyBkdWUgY291cG9uIHBheW1lbnQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucGF5bWVudF9hZ2VudC5jb21tb24uUGF5bWVudEFnZW50Q29tbW9uTWl4aW4uYXNzZXJ0X3BheW1lbnRfYXV0aG9yaXphdGlvbihob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB2b2lkOgphc3NlcnRfcGF5bWVudF9hdXRob3JpemF0aW9uOgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weToxMgogICAgLy8gZGVmIGFzc2VydF9wYXltZW50X2F1dGhvcml6YXRpb24oc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjEzCiAgICAvLyBpZiBzZWxmLm9wX2RhZW1vbi52YWx1ZSAhPSBHbG9iYWwuemVyb19hZGRyZXNzOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIyIC8vIDB4NTIzMjM1MjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcF9kYWVtb24gZXhpc3RzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBieiBhc3NlcnRfcGF5bWVudF9hdXRob3JpemF0aW9uX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weToxNQogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIyIC8vIDB4NTIzMjM1MjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcF9kYWVtb24gZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weToxNS0xNwogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICBibnogYXNzZXJ0X3BheW1lbnRfYXV0aG9yaXphdGlvbl9ib29sX3RydWVANAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weToxNgogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIHR4biBTZW5kZXIKICAgIGZyYW1lX2RpZyAtMQogICAgPT0KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MTUtMTcKICAgIC8vIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICAvLyBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgYm56IGFzc2VydF9wYXltZW50X2F1dGhvcml6YXRpb25fYm9vbF90cnVlQDQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MTcKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICB0eG4gU2VuZGVyCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDMyCiAgICA9PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weToxNS0xNwogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICBieiBhc3NlcnRfcGF5bWVudF9hdXRob3JpemF0aW9uX2Jvb2xfZmFsc2VANQoKYXNzZXJ0X3BheW1lbnRfYXV0aG9yaXphdGlvbl9ib29sX3RydWVANDoKICAgIGludGNfMSAvLyAxCgphc3NlcnRfcGF5bWVudF9hdXRob3JpemF0aW9uX2Jvb2xfbWVyZ2VANjoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MTQtMTgKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgLy8gICAgIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICAvLyAgICAgb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIC8vICksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAoKYXNzZXJ0X3BheW1lbnRfYXV0aG9yaXphdGlvbl9hZnRlcl9pZl9lbHNlQDc6CiAgICByZXRzdWIKCmFzc2VydF9wYXltZW50X2F1dGhvcml6YXRpb25fYm9vbF9mYWxzZUA1OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXJ0X3BheW1lbnRfYXV0aG9yaXphdGlvbl9ib29sX21lcmdlQDYKCgovLyBtb2R1bGVzLnBheW1lbnRfYWdlbnQuY29tbW9uLlBheW1lbnRBZ2VudENvbW1vbk1peGluLmlzX3BheW1lbnRfZXhlY3V0YWJsZShob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB1aW50NjQ6CmlzX3BheW1lbnRfZXhlY3V0YWJsZToKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MjAKICAgIC8vIGRlZiBpc19wYXltZW50X2V4ZWN1dGFibGUoc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50KSAtPiBib29sOgogICAgcHJvdG8gMSAxCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjIyCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MuaXNfb3B0ZWRfaW4oCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgMzIKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MjMKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MjItMjQKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5pc19vcHRlZF9pbigKICAgIC8vICAgICBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQKICAgIC8vICkKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjIyLTI1CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MuaXNfb3B0ZWRfaW4oCiAgICAvLyAgICAgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkCiAgICAvLyApCiAgICAvLyBhbmQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZAogICAgYnogaXNfcGF5bWVudF9leGVjdXRhYmxlX2Jvb2xfZmFsc2VAMwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weToyNQogICAgLy8gYW5kIG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQKICAgIGZyYW1lX2RpZyAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCA0NDgKICAgIGdldGJpdAogICAgYm56IGlzX3BheW1lbnRfZXhlY3V0YWJsZV9ib29sX2ZhbHNlQDMKICAgIGludGNfMSAvLyAxCgppc19wYXltZW50X2V4ZWN1dGFibGVfYm9vbF9tZXJnZUA0OgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weToyMS0yNgogICAgLy8gcmV0dXJuICgKICAgIC8vICAgICBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MuaXNfb3B0ZWRfaW4oCiAgICAvLyAgICAgICAgIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZAogICAgLy8gICAgICkKICAgIC8vICAgICBhbmQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZAogICAgLy8gKQogICAgc3dhcAogICAgcmV0c3ViCgppc19wYXltZW50X2V4ZWN1dGFibGVfYm9vbF9mYWxzZUAzOgogICAgaW50Y18wIC8vIDAKICAgIGIgaXNfcGF5bWVudF9leGVjdXRhYmxlX2Jvb2xfbWVyZ2VANAoKCi8vIG1vZHVsZXMucGF5bWVudF9hZ2VudC5jb21tb24uUGF5bWVudEFnZW50Q29tbW9uTWl4aW4uYXNzZXJ0X2Vub3VnaF9mdW5kcyhwYXltZW50X2Ftb3VudDogdWludDY0KSAtPiB2b2lkOgphc3NlcnRfZW5vdWdoX2Z1bmRzOgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weToyOAogICAgLy8gZGVmIGFzc2VydF9lbm91Z2hfZnVuZHMoc2VsZiwgcGF5bWVudF9hbW91bnQ6IFVJbnQ2NCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weTozMAogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBvcHRlZCBpbnRvIGFzc2V0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjMwLTMxCiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgLy8gPj0gcGF5bWVudF9hbW91bnQKICAgIGZyYW1lX2RpZyAtMQogICAgPj0KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MjktMzIKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIC8vICAgICA+PSBwYXltZW50X2Ftb3VudAogICAgLy8gKSwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5wYXltZW50X2FnZW50LmNvbW1vbi5QYXltZW50QWdlbnRDb21tb25NaXhpbi5wYXkocmVjZWl2ZXI6IGJ5dGVzLCBhbW91bnQ6IHVpbnQ2NCkgLT4gdm9pZDoKcGF5OgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weTozNAogICAgLy8gZGVmIHBheShzZWxmLCByZWNlaXZlcjogQWNjb3VudCwgYW1vdW50OiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MzUtNDAKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1yZWNlaXZlciwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9YW1vdW50LAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjM5CiAgICAvLyBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weTozNgogICAgLy8geGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBmcmFtZV9kaWcgLTIKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MzUKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MzUtNDAKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1yZWNlaXZlciwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9YW1vdW50LAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb21tb24uQ29yZUZpbmFuY2lhbENvbW1vbk1peGluLmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQodGltZV9ldmVudHM6IGJ5dGVzKSAtPiBieXRlczoKYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZDoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjEwNwogICAgLy8gZGVmIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQoc2VsZiwgdGltZV9ldmVudHM6IHR5cC5UaW1lRXZlbnRzKSAtPiBOb25lOgogICAgcHJvdG8gMSAxCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gMgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTA5CiAgICAvLyB0aW1lX2V2ZW50c1tjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fT1BFTklOR19EQVRFX0lEWF0KICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTEwCiAgICAvLyA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMDktMTEwCiAgICAvLyB0aW1lX2V2ZW50c1tjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fT1BFTklOR19EQVRFX0lEWF0KICAgIC8vID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgID4KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjEwOC0xMTEKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgdGltZV9ldmVudHNbY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX09QRU5JTkdfREFURV9JRFhdCiAgICAvLyAgICAgPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gKSwgZXJyLklOVkFMSURfVElNRQogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIG11c3QgYmUgc2V0IGluIHRoZSBmdXR1cmUKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjExMgogICAgLy8gZm9yIGlkeCBpbiB1cmFuZ2UodGltZV9ldmVudHMubGVuZ3RoIC0gMSk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgaW50Y18wIC8vIDAKCmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfZm9yX2hlYWRlckAxOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTEyCiAgICAvLyBmb3IgaWR4IGluIHVyYW5nZSh0aW1lX2V2ZW50cy5sZW5ndGggLSAxKToKICAgIGZyYW1lX2RpZyA1CiAgICBmcmFtZV9kaWcgNAogICAgPAogICAgYnogYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9hZnRlcl9mb3JANgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTE0CiAgICAvLyByZXF1aXJlZF9idWRnZXQ9VUludDY0KGNmZy5PUF9VUF9USU1FX0VWRU5UX1NPUlRJTkcpLAogICAgcHVzaGludCA2NQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTE1CiAgICAvLyBmZWVfc291cmNlPU9wVXBGZWVTb3VyY2UuQXBwQWNjb3VudCwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMTMtMTE2CiAgICAvLyBlbnN1cmVfYnVkZ2V0KAogICAgLy8gICAgIHJlcXVpcmVkX2J1ZGdldD1VSW50NjQoY2ZnLk9QX1VQX1RJTUVfRVZFTlRfU09SVElORyksCiAgICAvLyAgICAgZmVlX3NvdXJjZT1PcFVwRmVlU291cmNlLkFwcEFjY291bnQsCiAgICAvLyApCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjExNwogICAgLy8gdGltZV9pID0gdGltZV9ldmVudHNbaWR4XQogICAgZnJhbWVfZGlnIDUKICAgIGR1cAogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGZyYW1lX2RpZyAzCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTE4CiAgICAvLyB0aW1lX2YgPSB0aW1lX2V2ZW50c1tpZHggKyAxXQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMTkKICAgIC8vIGFzc2VydCB0aW1lX2YgPiB0aW1lX2ksIGVyci5JTlZBTElEX1NPUlRJTkcKICAgIDwKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBtdXN0IGJlIHNvcnRlZCBpbiBzdHJpY3RseSBhc2NlbmRpbmcgb3JkZXIKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjEyMAogICAgLy8gaWYgc2VsZi5kYXlfY291bnRfY29udmVudGlvbiAhPSBVSW50NjQoY3N0LkRDQ19DT05UKToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gZXhpc3RzCiAgICBpbnRjIDQgLy8gMjU1CiAgICAhPQogICAgYnogYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9hZnRlcl9pZl9lbHNlQDQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjEyMS0xMjIKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiByZXF1aXJlcyB0aW1lIHBlcmlvZHMgZXhwcmVzc2VkIGluIGRheXMgZm9yIHJlZ3VsYXIgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgKHRpbWVfZiAtIHRpbWVfaSkgJSBVSW50NjQoCiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIDEKICAgIC0KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjEyMS0xMjQKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiByZXF1aXJlcyB0aW1lIHBlcmlvZHMgZXhwcmVzc2VkIGluIGRheXMgZm9yIHJlZ3VsYXIgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgKHRpbWVfZiAtIHRpbWVfaSkgJSBVSW50NjQoCiAgICAvLyAgICAgY3N0LkRBWV8yX1NFQwogICAgLy8gKSA9PSAwLCBlcnIuSU5WQUxJRF9USU1FX1BFUklPRAogICAgaW50YyA2IC8vIDg2NDAwCiAgICAlCiAgICAhCiAgICBhc3NlcnQgLy8gVGltZSBwZXJpb2RzIGluIEFjdHVhbC9BY3R1YWwgZGF5IGNvdW50IGNvbnZlbnRpb24gbXVzdCBiZSBtdWx0aXBsZXMgb2YgYSBkYXkgKGluIHNlY29uZHMpCgphc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2FmdGVyX2lmX2Vsc2VANDoKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9idXJ5IDUKICAgIGIgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9mb3JfaGVhZGVyQDEKCmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfYWZ0ZXJfZm9yQDY6CiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB2b2lkOgphc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjMzCiAgICAvLyBkZWYgYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChzZWxmLCBob2xkaW5nX2FkZHJlc3M6IEFjY291bnQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozNAogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQsIGVyci5TVVNQRU5ERUQKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQ0OAogICAgZ2V0Yml0CiAgICAhCiAgICBhc3NlcnQgLy8gU3VzcGVuZGVkIG9wZXJhdGlvbnMKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzOiBieXRlcywgdW5pdHM6IHVpbnQ2NCkgLT4gdWludDY0OgphY2NvdW50X3VuaXRzX3ZhbHVlOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjM2CiAgICAvLyBkZWYgYWNjb3VudF91bml0c192YWx1ZShzZWxmLCBob2xkaW5nX2FkZHJlc3M6IEFjY291bnQsIHVuaXRzOiBVSW50NjQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjM3CiAgICAvLyByZXR1cm4gdW5pdHMgKiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCA0MAogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyAtMQogICAgKgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF90b3RhbF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB1aW50NjQ6CmFjY291bnRfdG90YWxfdW5pdHNfdmFsdWU6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzkKICAgIC8vIGRlZiBhY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlKHNlbGYsIGhvbGRpbmdfYWRkcmVzczogQWNjb3VudCkgLT4gVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NDEKICAgIC8vIGhvbGRpbmdfYWRkcmVzcywgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzIgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NDAtNDIKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoCiAgICAvLyAgICAgaG9sZGluZ19hZGRyZXNzLCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cwogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBjYWxsc3ViIGFjY291bnRfdW5pdHNfdmFsdWUKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmVuZF9pZl9ub19jaXJjdWxhdGluZ191bml0cygpIC0+IHZvaWQ6CmVuZF9pZl9ub19jaXJjdWxhdGluZ191bml0czoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo0OAogICAgLy8gaWYgc2VsZi5jaXJjdWxhdGluZ191bml0cyA9PSBVSW50NjQoMCk6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBibnogZW5kX2lmX25vX2NpcmN1bGF0aW5nX3VuaXRzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjQ5CiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbm0uU1RBVFVTX0VOREVEKQogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgaW50YyA1IC8vIDIwMAogICAgYXBwX2dsb2JhbF9wdXQKCmVuZF9pZl9ub19jaXJjdWxhdGluZ191bml0c19hZnRlcl9pZl9lbHNlQDI6CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fcm9sZV9pc19hY3RpdmUocm9sZV9tYXA6IGJ5dGVzLCByb2xlX2FkZHJlc3M6IGJ5dGVzKSAtPiB1aW50NjQ6Cl9yb2xlX2lzX2FjdGl2ZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NwogICAgLy8gZGVmIF9yb2xlX2lzX2FjdGl2ZShzZWxmLCByb2xlX21hcDogdHlwLlJiYWNSb2xlLCByb2xlX2FkZHJlc3M6IEFjY291bnQpIC0+IGJvb2w6CiAgICBwcm90byAyIDEKICAgIHB1c2hieXRlcyAiIgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU4LTYyCiAgICAvLyByZXR1cm4gc2VsZi5faGFzX3JvbGUocm9sZV9tYXAsIHJvbGVfYWRkcmVzcykgYW5kICgKICAgIC8vICAgICByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICkKICAgIGJ6IF9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIEJveE1hcCBlbnRyeSBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYwCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MAogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgPD0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYxCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIEJveE1hcCBlbnRyeSBleGlzdHMKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYwLTYxCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDAKICAgID49CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTktNjEKICAgIC8vIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IF9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQKICAgIGludGNfMSAvLyAxCgpfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU4LTYyCiAgICAvLyByZXR1cm4gc2VsZi5faGFzX3JvbGUocm9sZV9tYXAsIHJvbGVfYWRkcmVzcykgYW5kICgKICAgIC8vICAgICByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICkKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgX3JvbGVfaXNfYWN0aXZlX2Jvb2xfbWVyZ2VANQoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKSAtPiB2b2lkOgphc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjY1CiAgICAvLyBhc3NlcnQgc2VsZi5faXNfYXJyYW5nZXIoVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1MgogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyA9PSBzZWxmLmFycmFuZ2VyLnZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOCAvLyAweDUyMzIzMDIzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJyYW5nZXIgZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjY1CiAgICAvLyBhc3NlcnQgc2VsZi5faXNfYXJyYW5nZXIoVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKSAtPiB2b2lkOgphc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4MwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFzc2V0X2RlZmF1bHRlZCwgZXJyLkRFRkFVTFRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI0IC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfZGVmYXVsdGVkIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIERlZmF1bHRlZAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKSAtPiB2b2lkOgphc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4NgogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFzc2V0X3N1c3BlbmRlZCwgZXJyLlNVU1BFTkRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIzIC8vICJhc3NldF9zdXNwZW5kZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfc3VzcGVuZGVkIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIFN1c3BlbmRlZCBvcGVyYXRpb25zCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZDogdWludDY0KSAtPiB2b2lkOgpfYXNzZXJ0X3ZhbGlkX3JvbGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODgKICAgIC8vIGRlZiBfYXNzZXJ0X3ZhbGlkX3JvbGUoc2VsZiwgcm9sZV9pZDogVUludDY0KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTYKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTAKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICBwdXNoaW50IDIwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTYKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkxCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIHB1c2hpbnQgNDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTIKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICBwdXNoaW50IDUwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTYKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkzCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICBwdXNoaW50IDYwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTYKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojk0CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIHB1c2hpbnQgNzAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTUKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgcHVzaGludCA4MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk2CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBieiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9mYWxzZUA3CgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDY6CiAgICBpbnRjXzEgLy8gMQoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfbWVyZ2VAODoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBhc3NlcnQgLy8gSW52YWxpZCByb2xlIGlkZW50aWZpZXIKICAgIHJldHN1YgoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfZmFsc2VANzoKICAgIGludGNfMCAvLyAwCiAgICBiIF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX21lcmdlQDgK", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="}, "sourceInfo": {"approval": {"pcOffsetMethod": "none", "sourceInfo": [{"pc": [2798], "errorMessage": "Can not distribute zero units"}, {"pc": [1182], "errorMessage": "Coupon rates are not properly defined"}, {"pc": [1068], "errorMessage": "D-ASA already configured"}, {"pc": [4833], "errorMessage": "Defaulted"}, {"pc": [1075], "errorMessage": "Denomination asset is not properly set"}, {"pc": [1086], "errorMessage": "Different settlement asset not supported, must be equal to denomination asset"}, {"pc": [2814], "errorMessage": "Insufficient remaining D-ASA units"}, {"pc": [2283, 2378], "errorMessage": "Insufficient sender units to transfer"}, {"pc": [1173], "errorMessage": "Interest rate is not properly defined"}, {"pc": [1328, 1484, 1679, 1941, 2237, 2252, 2788, 3171, 3242, 3294, 3365, 3394], "errorMessage": "Invalid account holding address"}, {"pc": [3536, 3560, 3584, 3608, 3632, 3689, 3717, 3739, 3761, 3783, 3962, 3980, 3995, 4010, 4025], "errorMessage": "Invalid account role address"}, {"pc": [1346], "errorMessage": "Invalid amount of units for the account"}, {"pc": [1152], "errorMessage": "Invalid day-count convention ID"}, {"pc": [3673, 3952, 4895], "errorMessage": "Invalid role identifier"}, {"pc": [2659], "errorMessage": "Invalid secondary market closure date"}, {"pc": [2625], "errorMessage": "Invalid secondary market opening date"}, {"pc": [1119], "errorMessage": "Minimum denomination is not a divisor of principal"}, {"pc": [1688, 1946], "errorMessage": "No D-ASA units"}, {"pc": [1702], "errorMessage": "No due coupon to pay"}, {"pc": [1661, 1923, 2219, 2588, 2702, 2779, 3162, 3217, 3226, 3283, 3350, 3806, 4502, 4825], "errorMessage": "Not authorized"}, {"pc": [4567], "errorMessage": "Not enough funds for the payment"}, {"pc": [1955], "errorMessage": "Not mature"}, {"pc": [1707, 1962, 4451], "errorMessage": "Pending due coupon payment"}, {"pc": [2771], "errorMessage": "Primary distribution is closed"}, {"pc": [1317], "errorMessage": "Primary distribution not yet executed"}, {"pc": [2210], "errorMessage": "Secondary market is closed"}, {"pc": [2268], "errorMessage": "Sender and receiver must be different"}, {"pc": [2333], "errorMessage": "Sender and receiver units are not fungible"}, {"pc": [4717, 4841], "errorMessage": "Suspended operations"}, {"pc": [1203, 2593], "errorMessage": "Time events length is invalid"}, {"pc": [4618], "errorMessage": "Time events must be set in the future"}, {"pc": [4669], "errorMessage": "Time events must be sorted in strictly ascending order"}, {"pc": [1264], "errorMessage": "Time periods are not properly defined"}, {"pc": [4690], "errorMessage": "Time periods in Actual/Actual day count convention must be multiples of a day (in seconds)"}, {"pc": [2272], "errorMessage": "Transfer units must be greater than zero"}, {"pc": [606], "errorMessage": "Wrong Global Bytes allocation"}, {"pc": [612], "errorMessage": "Wrong Global UInts allocation"}, {"pc": [616], "errorMessage": "Wrong Local Bytes allocation"}, {"pc": [620], "errorMessage": "Wrong Local UInts allocation"}, {"pc": [4563], "errorMessage": "account opted into asset"}, {"pc": [1785, 2033], "errorMessage": "asset exists"}, {"pc": [4785, 4800], "errorMessage": "check BoxMap entry exists"}, {"pc": [1336, 1500, 1694, 1738, 1750, 1986, 2004, 2276, 2290, 2299, 2306, 2317, 2324, 2338, 2373, 2415, 2459, 2822, 4444, 4493, 4517, 4536, 4711, 4727, 4743], "errorMessage": "check self.account entry exists"}, {"pc": [3824, 4823], "errorMessage": "check self.arranger exists"}, {"pc": [2896, 4831], "errorMessage": "check self.asset_defaulted exists"}, {"pc": [2998, 4839], "errorMessage": "check self.asset_suspended exists"}, {"pc": [1789, 1997, 2037, 2802, 2917, 3306, 4430, 4756], "errorMessage": "check self.circulating_units exists"}, {"pc": [1458], "errorMessage": "check self.coupon_rates exists"}, {"pc": [2929, 4284, 4674], "errorMessage": "check self.day_count_convention exists"}, {"pc": [1781, 2029, 2908], "errorMessage": "check self.denomination_asset_id exists"}, {"pc": [4067, 4111], "errorMessage": "check self.due_coupons_watermark exists"}, {"pc": [2958], "errorMessage": "check self.interest_rate exists"}, {"pc": [2609, 2988, 4100, 4265, 4334, 4344], "errorMessage": "check self.issuance_date exists"}, {"pc": [1953, 2634, 2642, 2879, 2993, 4072], "errorMessage": "check self.maturity_date exists"}, {"pc": [3130], "errorMessage": "check self.metadata exists"}, {"pc": [4460, 4473], "errorMessage": "check self.op_daemon exists"}, {"pc": [1765, 4426], "errorMessage": "check self.paid_coupon_units exists"}, {"pc": [2763, 2983], "errorMessage": "check self.primary_distribution_closure_date exists"}, {"pc": [1301, 1311, 2749, 2978], "errorMessage": "check self.primary_distribution_opening_date exists"}, {"pc": [1167, 2943], "errorMessage": "check self.principal_discount exists"}, {"pc": [2194, 2204, 2673, 3108], "errorMessage": "check self.secondary_market_closure_date exists"}, {"pc": [2183, 2668, 3103], "errorMessage": "check self.secondary_market_opening_date exists"}, {"pc": [2913, 4525, 4560, 4579], "errorMessage": "check self.settlement_asset_id exists"}, {"pc": [1066, 1445, 1490, 1657, 1919, 2172, 2583, 2738, 3078, 3221], "errorMessage": "check self.status exists"}, {"pc": [3091], "errorMessage": "check self.time_events exists"}, {"pc": [1511, 1595, 4084, 4202, 4353], "errorMessage": "check self.total_coupons exists"}, {"pc": [2810, 2852, 2973], "errorMessage": "check self.total_units exists"}, {"pc": [1794, 2042, 2839, 2922], "errorMessage": "check self.unit_value exists"}, {"pc": [1006, 1028, 1046, 1251, 1641, 1903, 2504, 2543, 2565, 2646, 3474, 4622], "errorMessage": "invalid array length header"}, {"pc": [2692, 3152, 3796], "errorMessage": "invalid number of bytes for arc4.bool"}, {"pc": [1019], "errorMessage": "invalid number of bytes for arc4.dynamic_array"}, {"pc": [1649, 1911, 3482], "errorMessage": "invalid number of bytes for arc4.dynamic_array"}, {"pc": [1059], "errorMessage": "invalid number of bytes for arc4.dynamic_array>"}, {"pc": [1040, 2576], "errorMessage": "invalid number of bytes for arc4.dynamic_array"}, {"pc": [1287, 1476, 1635, 1897, 2151, 2159, 2481, 2725, 3144, 3201, 3209, 3275, 3336, 3344, 3386, 3410, 3434, 3468, 3656, 3838, 3922], "errorMessage": "invalid number of bytes for arc4.static_array"}, {"pc": [997], "errorMessage": "invalid number of bytes for arc4.uint16"}, {"pc": [941, 950, 959, 968, 977, 1295, 2167, 2733], "errorMessage": "invalid number of bytes for arc4.uint64"}, {"pc": [986, 3458, 3646, 3912], "errorMessage": "invalid number of bytes for arc4.uint8"}, {"pc": [2509, 2548], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.AssetMetadata"}, {"pc": [2496, 2535], "errorMessage": "invalid tail pointer at index 7 of (uint8,uint8,uint8,uint8,uint8,uint8,uint8[32],(len+utf8[]))"}, {"pc": [2491, 2530], "errorMessage": "invalid tuple encoding"}, {"pc": [2935, 2950, 2965, 3006], "errorMessage": "overflow"}]}, "clear": {"pcOffsetMethod": "none", "sourceInfo": []}}, "templateVariables": {}}""" -APP_SPEC = algokit_utils.Arc56Contract.from_json(_APP_SPEC_JSON) - -def _parse_abi_args(args: object | None = None) -> list[object] | None: - """Helper to parse ABI args into the format expected by underlying client""" - if args is None: - return None - - def convert_dataclass(value: object) -> object: - if dataclasses.is_dataclass(value): - return tuple(convert_dataclass(getattr(value, field.name)) for field in dataclasses.fields(value)) - elif isinstance(value, (list, tuple)): - return type(value)(convert_dataclass(item) for item in value) - return value - - match args: - case tuple(): - method_args = list(args) - case _ if dataclasses.is_dataclass(args): - method_args = [getattr(args, field.name) for field in dataclasses.fields(args)] - case _: - raise ValueError("Invalid 'args' type. Expected 'tuple' or 'TypedDict' for respective typed arguments.") - - return [ - convert_dataclass(arg) if not isinstance(arg, algokit_utils.AppMethodCallTransactionArgument) else arg - for arg in method_args - ] if method_args else None - -def _init_dataclass(cls: type, data: dict) -> object: - """ - Recursively instantiate a dataclass of type `cls` from `data`. - - For each field on the dataclass, if the field type is also a dataclass - and the corresponding data is a dict, instantiate that field recursively. - """ - field_values = {} - for field in dataclasses.fields(cls): - field_value = data.get(field.name) - # Check if the field expects another dataclass and the value is a dict. - if dataclasses.is_dataclass(field.type) and isinstance(field_value, dict): - field_values[field.name] = _init_dataclass(typing.cast(type, field.type), field_value) - else: - field_values[field.name] = field_value - return cls(**field_values) - -@dataclasses.dataclass(frozen=True) -class AccountInfo: - """Struct for AccountInfo""" - payment_address: str - units: int - unit_value: int - paid_coupons: int - suspended: bool - -@dataclasses.dataclass(frozen=True) -class AssetInfo: - """Struct for AssetInfo""" - denomination_asset_id: int - settlement_asset_id: int - outstanding_principal: int - unit_value: int - day_count_convention: int - principal_discount: int - interest_rate: int - total_supply: int - circulating_supply: int - primary_distribution_opening_date: int - primary_distribution_closure_date: int - issuance_date: int - maturity_date: int - suspended: bool - performance: int - -@dataclasses.dataclass(frozen=True) -class AssetMetadata: - """Struct for AssetMetadata""" - contract_type: int - calendar: int - business_day_convention: int - end_of_month_convention: int - prepayment_effect: int - penalty_type: int - prospectus_hash: bytes - prospectus_url: str - -@dataclasses.dataclass(frozen=True) -class DayCountFactor: - """Struct for DayCountFactor""" - numerator: int - denominator: int - -@dataclasses.dataclass(frozen=True) -class CouponsInfo: - """Struct for CouponsInfo""" - total_coupons: int - due_coupons: int - next_coupon_due_date: int - day_count_factor: DayCountFactor - all_due_coupons_paid: bool - -@dataclasses.dataclass(frozen=True) -class CurrentUnitsValue: - """Struct for CurrentUnitsValue""" - units_value: int - accrued_interest: int - day_count_factor: DayCountFactor - -@dataclasses.dataclass(frozen=True) -class PaymentAmounts: - """Struct for PaymentAmounts""" - interest: int - principal: int - -@dataclasses.dataclass(frozen=True) -class PaymentResult: - """Struct for PaymentResult""" - amount: int - timestamp: int - context: bytes - -@dataclasses.dataclass(frozen=True) -class RoleConfig: - """Struct for RoleConfig""" - role_validity_start: int - role_validity_end: int - -@dataclasses.dataclass(frozen=True) -class SecondaryMarketSchedule: - """Struct for SecondaryMarketSchedule""" - secondary_market_opening_date: int - secondary_market_closure_date: int - - -@dataclasses.dataclass(frozen=True, kw_only=True) -class AssetConfigArgs: - """Dataclass for asset_config arguments""" - denomination_asset_id: int - settlement_asset_id: int - principal: int - principal_discount: int - minimum_denomination: int - day_count_convention: int - interest_rate: int - coupon_rates: list[int] - time_events: list[int] - time_periods: list[tuple[int, int]] - - @property - def abi_method_signature(self) -> str: - return "asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class GetAccountUnitsCurrentValueArgs: - """Dataclass for get_account_units_current_value arguments""" - holding_address: str - units: int - - @property - def abi_method_signature(self) -> str: - return "get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64))" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class GetPaymentAmountArgs: - """Dataclass for get_payment_amount arguments""" - holding_address: str - - @property - def abi_method_signature(self) -> str: - return "get_payment_amount(address)(uint64,uint64)" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class PayCouponArgs: - """Dataclass for pay_coupon arguments""" - holding_address: str - payment_info: bytes | str - - @property - def abi_method_signature(self) -> str: - return "pay_coupon(address,byte[])(uint64,uint64,byte[])" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class PayPrincipalArgs: - """Dataclass for pay_principal arguments""" - holding_address: str - payment_info: bytes | str - - @property - def abi_method_signature(self) -> str: - return "pay_principal(address,byte[])(uint64,uint64,byte[])" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class AssetTransferArgs: - """Dataclass for asset_transfer arguments""" - sender_holding_address: str - receiver_holding_address: str - units: int - - @property - def abi_method_signature(self) -> str: - return "asset_transfer(address,address,uint64)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class SetSecondaryTimeEventsArgs: - """Dataclass for set_secondary_time_events arguments""" - secondary_market_time_events: list[int] - - @property - def abi_method_signature(self) -> str: - return "set_secondary_time_events(uint64[])(uint64,uint64)" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class SetDefaultStatusArgs: - """Dataclass for set_default_status arguments""" - defaulted: bool - - @property - def abi_method_signature(self) -> str: - return "set_default_status(bool)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class PrimaryDistributionArgs: - """Dataclass for primary_distribution arguments""" - holding_address: str - units: int - - @property - def abi_method_signature(self) -> str: - return "primary_distribution(address,uint64)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class AccountGovSuspensionArgs: - """Dataclass for account_gov_suspension arguments""" - holding_address: str - suspended: bool - - @property - def abi_method_signature(self) -> str: - return "account_gov_suspension(address,bool)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class AccountOpenArgs: - """Dataclass for account_open arguments""" - holding_address: str - payment_address: str - - @property - def abi_method_signature(self) -> str: - return "account_open(address,address)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class AccountCloseArgs: - """Dataclass for account_close arguments""" - holding_address: str - - @property - def abi_method_signature(self) -> str: - return "account_close(address)(uint64,uint64)" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class AccountUpdatePaymentAddressArgs: - """Dataclass for account_update_payment_address arguments""" - holding_address: str - payment_address: str - - @property - def abi_method_signature(self) -> str: - return "account_update_payment_address(address,address)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class AccountGetInfoArgs: - """Dataclass for account_get_info arguments""" - holding_address: str - - @property - def abi_method_signature(self) -> str: - return "account_get_info(address)(address,uint64,uint64,uint64,bool)" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class RbacRotateArrangerArgs: - """Dataclass for rbac_rotate_arranger arguments""" - new_arranger: str - - @property - def abi_method_signature(self) -> str: - return "rbac_rotate_arranger(address)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class RbacSetOpDaemonArgs: - """Dataclass for rbac_set_op_daemon arguments""" - address: str - - @property - def abi_method_signature(self) -> str: - return "rbac_set_op_daemon(address)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class RbacAssignRoleArgs: - """Dataclass for rbac_assign_role arguments""" - role_id: int - role_address: str - config: bytes | str - - @property - def abi_method_signature(self) -> str: - return "rbac_assign_role(uint8,address,byte[])uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class RbacRevokeRoleArgs: - """Dataclass for rbac_revoke_role arguments""" - role_id: int - role_address: str - - @property - def abi_method_signature(self) -> str: - return "rbac_revoke_role(uint8,address)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class RbacGovAssetSuspensionArgs: - """Dataclass for rbac_gov_asset_suspension arguments""" - suspended: bool - - @property - def abi_method_signature(self) -> str: - return "rbac_gov_asset_suspension(bool)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class RbacGetAddressRolesArgs: - """Dataclass for rbac_get_address_roles arguments""" - address: str - - @property - def abi_method_signature(self) -> str: - return "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class RbacGetRoleConfigArgs: - """Dataclass for rbac_get_role_config arguments""" - role_id: int - role_address: str - - @property - def abi_method_signature(self) -> str: - return "rbac_get_role_config(uint8,address)(uint64,uint64)" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class AssetCreateArgs: - """Dataclass for asset_create arguments""" - arranger: str - metadata: AssetMetadata - - @property - def abi_method_signature(self) -> str: - return "asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class AssetUpdateArgs: - """Dataclass for asset_update arguments""" - metadata: AssetMetadata - - @property - def abi_method_signature(self) -> str: - return "asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void" - - -class _FixedCouponBondUpdate: - def __init__(self, app_client: algokit_utils.AppClient): - self.app_client = app_client - - def asset_update( - self, - args: tuple[AssetMetadata] | AssetUpdateArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppUpdateMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - compilation_params = compilation_params or algokit_utils.AppClientCompilationParams() - return self.app_client.params.update(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void", - "args": method_args, - })) - - -class FixedCouponBondParams: - def __init__(self, app_client: algokit_utils.AppClient): - self.app_client = app_client - - @property - def update(self) -> "_FixedCouponBondUpdate": - return _FixedCouponBondUpdate(self.app_client) - - def asset_config( - self, - args: tuple[int, int, int, int, int, int, int, list[int], list[int], list[tuple[int, int]]] | AssetConfigArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void", - "args": method_args, - })) - - def get_account_units_current_value( - self, - args: tuple[str, int] | GetAccountUnitsCurrentValueArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64))", - "args": method_args, - })) - - def get_coupon_rates( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_coupon_rates()uint16[]", - })) - - def get_payment_amount( - self, - args: tuple[str] | GetPaymentAmountArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_payment_amount(address)(uint64,uint64)", - "args": method_args, - })) - - def get_coupons_status( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_coupons_status()(uint64,uint64,uint64,(uint64,uint64),bool)", - })) - - def pay_coupon( - self, - args: tuple[str, bytes | str] | PayCouponArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "pay_coupon(address,byte[])(uint64,uint64,byte[])", - "args": method_args, - })) - - def pay_principal( - self, - args: tuple[str, bytes | str] | PayPrincipalArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "pay_principal(address,byte[])(uint64,uint64,byte[])", - "args": method_args, - })) - - def asset_transfer( - self, - args: tuple[str, str, int] | AssetTransferArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "asset_transfer(address,address,uint64)uint64", - "args": method_args, - })) - - def set_secondary_time_events( - self, - args: tuple[list[int]] | SetSecondaryTimeEventsArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "set_secondary_time_events(uint64[])(uint64,uint64)", - "args": method_args, - })) - - def set_default_status( - self, - args: tuple[bool] | SetDefaultStatusArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "set_default_status(bool)uint64", - "args": method_args, - })) - - def primary_distribution( - self, - args: tuple[str, int] | PrimaryDistributionArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "primary_distribution(address,uint64)uint64", - "args": method_args, - })) - - def get_asset_info( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)", - })) - - def get_time_events( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_time_events()uint64[]", - })) - - def get_secondary_market_schedule( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_secondary_market_schedule()uint64[]", - })) - - def get_asset_metadata( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", - })) - - def account_gov_suspension( - self, - args: tuple[str, bool] | AccountGovSuspensionArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_gov_suspension(address,bool)uint64", - "args": method_args, - })) - - def account_open( - self, - args: tuple[str, str] | AccountOpenArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_open(address,address)uint64", - "args": method_args, - })) - - def account_close( - self, - args: tuple[str] | AccountCloseArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_close(address)(uint64,uint64)", - "args": method_args, - })) - - def account_update_payment_address( - self, - args: tuple[str, str] | AccountUpdatePaymentAddressArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_update_payment_address(address,address)uint64", - "args": method_args, - })) - - def account_get_info( - self, - args: tuple[str] | AccountGetInfoArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_get_info(address)(address,uint64,uint64,uint64,bool)", - "args": method_args, - })) - - def rbac_rotate_arranger( - self, - args: tuple[str] | RbacRotateArrangerArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_rotate_arranger(address)uint64", - "args": method_args, - })) - - def rbac_set_op_daemon( - self, - args: tuple[str] | RbacSetOpDaemonArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_set_op_daemon(address)uint64", - "args": method_args, - })) - - def rbac_assign_role( - self, - args: tuple[int, str, bytes | str] | RbacAssignRoleArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_assign_role(uint8,address,byte[])uint64", - "args": method_args, - })) - - def rbac_revoke_role( - self, - args: tuple[int, str] | RbacRevokeRoleArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_revoke_role(uint8,address)uint64", - "args": method_args, - })) - - def rbac_gov_asset_suspension( - self, - args: tuple[bool] | RbacGovAssetSuspensionArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_gov_asset_suspension(bool)uint64", - "args": method_args, - })) - - def rbac_get_arranger( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_arranger()address", - })) - - def rbac_get_address_roles( - self, - args: tuple[str] | RbacGetAddressRolesArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", - "args": method_args, - })) - - def rbac_get_role_config( - self, - args: tuple[int, str] | RbacGetRoleConfigArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_role_config(uint8,address)(uint64,uint64)", - "args": method_args, - })) - - def asset_create( - self, - args: tuple[str, AssetMetadata] | AssetCreateArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void", - "args": method_args, - })) - - def clear_state( - self, - params: algokit_utils.AppClientBareCallParams | None = None, - - ) -> algokit_utils.AppCallParams: - return self.app_client.params.bare.clear_state( - params, - - ) - - -class _FixedCouponBondUpdateTransaction: - def __init__(self, app_client: algokit_utils.AppClient): - self.app_client = app_client - - def asset_update( - self, - args: tuple[AssetMetadata] | AssetUpdateArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - compilation_params = compilation_params or algokit_utils.AppClientCompilationParams() - return self.app_client.create_transaction.update(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void", - "args": method_args, - })) - - -class FixedCouponBondCreateTransactionParams: - def __init__(self, app_client: algokit_utils.AppClient): - self.app_client = app_client - - @property - def update(self) -> "_FixedCouponBondUpdateTransaction": - return _FixedCouponBondUpdateTransaction(self.app_client) - - def asset_config( - self, - args: tuple[int, int, int, int, int, int, int, list[int], list[int], list[tuple[int, int]]] | AssetConfigArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void", - "args": method_args, - })) - - def get_account_units_current_value( - self, - args: tuple[str, int] | GetAccountUnitsCurrentValueArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64))", - "args": method_args, - })) - - def get_coupon_rates( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_coupon_rates()uint16[]", - })) - - def get_payment_amount( - self, - args: tuple[str] | GetPaymentAmountArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_payment_amount(address)(uint64,uint64)", - "args": method_args, - })) - - def get_coupons_status( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_coupons_status()(uint64,uint64,uint64,(uint64,uint64),bool)", - })) - - def pay_coupon( - self, - args: tuple[str, bytes | str] | PayCouponArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "pay_coupon(address,byte[])(uint64,uint64,byte[])", - "args": method_args, - })) - - def pay_principal( - self, - args: tuple[str, bytes | str] | PayPrincipalArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "pay_principal(address,byte[])(uint64,uint64,byte[])", - "args": method_args, - })) - - def asset_transfer( - self, - args: tuple[str, str, int] | AssetTransferArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "asset_transfer(address,address,uint64)uint64", - "args": method_args, - })) - - def set_secondary_time_events( - self, - args: tuple[list[int]] | SetSecondaryTimeEventsArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "set_secondary_time_events(uint64[])(uint64,uint64)", - "args": method_args, - })) - - def set_default_status( - self, - args: tuple[bool] | SetDefaultStatusArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "set_default_status(bool)uint64", - "args": method_args, - })) - - def primary_distribution( - self, - args: tuple[str, int] | PrimaryDistributionArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "primary_distribution(address,uint64)uint64", - "args": method_args, - })) - - def get_asset_info( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)", - })) - - def get_time_events( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_time_events()uint64[]", - })) - - def get_secondary_market_schedule( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_secondary_market_schedule()uint64[]", - })) - - def get_asset_metadata( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", - })) - - def account_gov_suspension( - self, - args: tuple[str, bool] | AccountGovSuspensionArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_gov_suspension(address,bool)uint64", - "args": method_args, - })) - - def account_open( - self, - args: tuple[str, str] | AccountOpenArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_open(address,address)uint64", - "args": method_args, - })) - - def account_close( - self, - args: tuple[str] | AccountCloseArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_close(address)(uint64,uint64)", - "args": method_args, - })) - - def account_update_payment_address( - self, - args: tuple[str, str] | AccountUpdatePaymentAddressArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_update_payment_address(address,address)uint64", - "args": method_args, - })) - - def account_get_info( - self, - args: tuple[str] | AccountGetInfoArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_get_info(address)(address,uint64,uint64,uint64,bool)", - "args": method_args, - })) - - def rbac_rotate_arranger( - self, - args: tuple[str] | RbacRotateArrangerArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_rotate_arranger(address)uint64", - "args": method_args, - })) - - def rbac_set_op_daemon( - self, - args: tuple[str] | RbacSetOpDaemonArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_set_op_daemon(address)uint64", - "args": method_args, - })) - - def rbac_assign_role( - self, - args: tuple[int, str, bytes | str] | RbacAssignRoleArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_assign_role(uint8,address,byte[])uint64", - "args": method_args, - })) - - def rbac_revoke_role( - self, - args: tuple[int, str] | RbacRevokeRoleArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_revoke_role(uint8,address)uint64", - "args": method_args, - })) - - def rbac_gov_asset_suspension( - self, - args: tuple[bool] | RbacGovAssetSuspensionArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_gov_asset_suspension(bool)uint64", - "args": method_args, - })) - - def rbac_get_arranger( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_arranger()address", - })) - - def rbac_get_address_roles( - self, - args: tuple[str] | RbacGetAddressRolesArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", - "args": method_args, - })) - - def rbac_get_role_config( - self, - args: tuple[int, str] | RbacGetRoleConfigArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_role_config(uint8,address)(uint64,uint64)", - "args": method_args, - })) - - def asset_create( - self, - args: tuple[str, AssetMetadata] | AssetCreateArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void", - "args": method_args, - })) - - def clear_state( - self, - params: algokit_utils.AppClientBareCallParams | None = None, - - ) -> Transaction: - return self.app_client.create_transaction.bare.clear_state( - params, - - ) - - -class _FixedCouponBondUpdateSend: - def __init__(self, app_client: algokit_utils.AppClient): - self.app_client = app_client - - def asset_update( - self, - args: tuple[AssetMetadata] | AssetUpdateArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.SendAppTransactionResult[None]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - compilation_params = compilation_params or algokit_utils.AppClientCompilationParams() - response = self.app_client.send.update(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void", - "args": method_args, - }), send_params=send_params, compilation_params=compilation_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppUpdateTransactionResult[None], parsed_response) - - -class FixedCouponBondSend: - def __init__(self, app_client: algokit_utils.AppClient): - self.app_client = app_client - - @property - def update(self) -> "_FixedCouponBondUpdateSend": - return _FixedCouponBondUpdateSend(self.app_client) - - def asset_config( - self, - args: tuple[int, int, int, int, int, int, int, list[int], list[int], list[tuple[int, int]]] | AssetConfigArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[None]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[None], parsed_response) - - def get_account_units_current_value( - self, - args: tuple[str, int] | GetAccountUnitsCurrentValueArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[CurrentUnitsValue]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64))", - "args": method_args, - }), send_params=send_params) - parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(CurrentUnitsValue, typing.cast(dict, response.abi_return))) # type: ignore - return typing.cast(algokit_utils.SendAppTransactionResult[CurrentUnitsValue], parsed_response) - - def get_coupon_rates( - self, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[list[int]]: - - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_coupon_rates()uint16[]", - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[list[int]], parsed_response) - - def get_payment_amount( - self, - args: tuple[str] | GetPaymentAmountArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[PaymentAmounts]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_payment_amount(address)(uint64,uint64)", - "args": method_args, - }), send_params=send_params) - parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(PaymentAmounts, typing.cast(dict, response.abi_return))) # type: ignore - return typing.cast(algokit_utils.SendAppTransactionResult[PaymentAmounts], parsed_response) - - def get_coupons_status( - self, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[CouponsInfo]: - - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_coupons_status()(uint64,uint64,uint64,(uint64,uint64),bool)", - }), send_params=send_params) - parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(CouponsInfo, typing.cast(dict, response.abi_return))) # type: ignore - return typing.cast(algokit_utils.SendAppTransactionResult[CouponsInfo], parsed_response) - - def pay_coupon( - self, - args: tuple[str, bytes | str] | PayCouponArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[PaymentResult]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "pay_coupon(address,byte[])(uint64,uint64,byte[])", - "args": method_args, - }), send_params=send_params) - parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(PaymentResult, typing.cast(dict, response.abi_return))) # type: ignore - return typing.cast(algokit_utils.SendAppTransactionResult[PaymentResult], parsed_response) - - def pay_principal( - self, - args: tuple[str, bytes | str] | PayPrincipalArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[PaymentResult]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "pay_principal(address,byte[])(uint64,uint64,byte[])", - "args": method_args, - }), send_params=send_params) - parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(PaymentResult, typing.cast(dict, response.abi_return))) # type: ignore - return typing.cast(algokit_utils.SendAppTransactionResult[PaymentResult], parsed_response) - - def asset_transfer( - self, - args: tuple[str, str, int] | AssetTransferArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "asset_transfer(address,address,uint64)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def set_secondary_time_events( - self, - args: tuple[list[int]] | SetSecondaryTimeEventsArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[SecondaryMarketSchedule]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "set_secondary_time_events(uint64[])(uint64,uint64)", - "args": method_args, - }), send_params=send_params) - parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(SecondaryMarketSchedule, typing.cast(dict, response.abi_return))) # type: ignore - return typing.cast(algokit_utils.SendAppTransactionResult[SecondaryMarketSchedule], parsed_response) - - def set_default_status( - self, - args: tuple[bool] | SetDefaultStatusArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "set_default_status(bool)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def primary_distribution( - self, - args: tuple[str, int] | PrimaryDistributionArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "primary_distribution(address,uint64)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def get_asset_info( - self, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[AssetInfo]: - - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)", - }), send_params=send_params) - parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(AssetInfo, typing.cast(dict, response.abi_return))) # type: ignore - return typing.cast(algokit_utils.SendAppTransactionResult[AssetInfo], parsed_response) - - def get_time_events( - self, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[list[int]]: - - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_time_events()uint64[]", - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[list[int]], parsed_response) - - def get_secondary_market_schedule( - self, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[list[int]]: - - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_secondary_market_schedule()uint64[]", - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[list[int]], parsed_response) - - def get_asset_metadata( - self, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[AssetMetadata]: - - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", - }), send_params=send_params) - parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(AssetMetadata, typing.cast(dict, response.abi_return))) # type: ignore - return typing.cast(algokit_utils.SendAppTransactionResult[AssetMetadata], parsed_response) - - def account_gov_suspension( - self, - args: tuple[str, bool] | AccountGovSuspensionArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_gov_suspension(address,bool)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def account_open( - self, - args: tuple[str, str] | AccountOpenArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_open(address,address)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def account_close( - self, - args: tuple[str] | AccountCloseArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[tuple[int, int]]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_close(address)(uint64,uint64)", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[tuple[int, int]], parsed_response) - - def account_update_payment_address( - self, - args: tuple[str, str] | AccountUpdatePaymentAddressArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_update_payment_address(address,address)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def account_get_info( - self, - args: tuple[str] | AccountGetInfoArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[AccountInfo]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_get_info(address)(address,uint64,uint64,uint64,bool)", - "args": method_args, - }), send_params=send_params) - parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(AccountInfo, typing.cast(dict, response.abi_return))) # type: ignore - return typing.cast(algokit_utils.SendAppTransactionResult[AccountInfo], parsed_response) - - def rbac_rotate_arranger( - self, - args: tuple[str] | RbacRotateArrangerArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_rotate_arranger(address)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def rbac_set_op_daemon( - self, - args: tuple[str] | RbacSetOpDaemonArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_set_op_daemon(address)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def rbac_assign_role( - self, - args: tuple[int, str, bytes | str] | RbacAssignRoleArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_assign_role(uint8,address,byte[])uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def rbac_revoke_role( - self, - args: tuple[int, str] | RbacRevokeRoleArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_revoke_role(uint8,address)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def rbac_gov_asset_suspension( - self, - args: tuple[bool] | RbacGovAssetSuspensionArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_gov_asset_suspension(bool)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def rbac_get_arranger( - self, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[str]: - - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_arranger()address", - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[str], parsed_response) - - def rbac_get_address_roles( - self, - args: tuple[str] | RbacGetAddressRolesArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[tuple[bool, bool, bool, bool, bool]]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[tuple[bool, bool, bool, bool, bool]], parsed_response) - - def rbac_get_role_config( - self, - args: tuple[int, str] | RbacGetRoleConfigArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[RoleConfig]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_role_config(uint8,address)(uint64,uint64)", - "args": method_args, - }), send_params=send_params) - parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(RoleConfig, typing.cast(dict, response.abi_return))) # type: ignore - return typing.cast(algokit_utils.SendAppTransactionResult[RoleConfig], parsed_response) - - def asset_create( - self, - args: tuple[str, AssetMetadata] | AssetCreateArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[None]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[None], parsed_response) - - def clear_state( - self, - params: algokit_utils.AppClientBareCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[algokit_utils.ABIReturn]: - return self.app_client.send.bare.clear_state( - params, - send_params=send_params, - ) - - -class GlobalStateValue(typing.TypedDict): - """Shape of global_state state key values""" - arranger: str - op_daemon: str - asset_suspended: int - asset_defaulted: int - total_units: int - circulating_units: int - unit_value: int - status: int - denomination_asset_id: int - settlement_asset_id: int - day_count_convention: int - metadata: bytes - principal_discount: int - interest_rate: int - total_coupons: int - primary_distribution_opening_date: int - primary_distribution_closure_date: int - issuance_date: int - secondary_market_opening_date: int - secondary_market_closure_date: int - maturity_date: int - paid_coupon_units: int - due_coupons_watermark: int - -class BoxStateValue(typing.TypedDict): - """Shape of box state key values""" - time_events: list[int] - coupon_rates: list[int] - -class FixedCouponBondState: - """Methods to access state for the current FixedCouponBond app""" - - def __init__(self, app_client: algokit_utils.AppClient): - self.app_client = app_client - - @property - def global_state( - self - ) -> "_GlobalState": - """Methods to access global_state for the current app""" - return _GlobalState(self.app_client) - - @property - def box( - self - ) -> "_BoxState": - """Methods to access box for the current app""" - return _BoxState(self.app_client) - -class _GlobalState: - def __init__(self, app_client: algokit_utils.AppClient): - self.app_client = app_client - - # Pre-generated mapping of value types to their struct classes - self._struct_classes: dict[str, typing.Type[typing.Any]] = {} - - def get_all(self) -> GlobalStateValue: - """Get all current keyed values from global_state state""" - result = self.app_client.state.global_state.get_all() - if not result: - return typing.cast(GlobalStateValue, {}) - - converted = {} - for key, value in result.items(): - key_info = self.app_client.app_spec.state.keys.global_state.get(key) - struct_class = self._struct_classes.get(key_info.value_type) if key_info else None - converted[key] = ( - _init_dataclass(struct_class, value) if struct_class and isinstance(value, dict) - else value - ) - return typing.cast(GlobalStateValue, converted) - - @property - def arranger(self) -> str: - """Get the current value of the arranger key in global_state state""" - value = self.app_client.state.global_state.get_value("arranger") - if isinstance(value, dict) and "address" in self._struct_classes: - return _init_dataclass(self._struct_classes["address"], value) # type: ignore - return typing.cast(str, value) - - @property - def op_daemon(self) -> str: - """Get the current value of the op_daemon key in global_state state""" - value = self.app_client.state.global_state.get_value("op_daemon") - if isinstance(value, dict) and "address" in self._struct_classes: - return _init_dataclass(self._struct_classes["address"], value) # type: ignore - return typing.cast(str, value) - - @property - def asset_suspended(self) -> int: - """Get the current value of the asset_suspended key in global_state state""" - value = self.app_client.state.global_state.get_value("asset_suspended") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def asset_defaulted(self) -> int: - """Get the current value of the asset_defaulted key in global_state state""" - value = self.app_client.state.global_state.get_value("asset_defaulted") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def total_units(self) -> int: - """Get the current value of the total_units key in global_state state""" - value = self.app_client.state.global_state.get_value("total_units") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def circulating_units(self) -> int: - """Get the current value of the circulating_units key in global_state state""" - value = self.app_client.state.global_state.get_value("circulating_units") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def unit_value(self) -> int: - """Get the current value of the unit_value key in global_state state""" - value = self.app_client.state.global_state.get_value("unit_value") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def status(self) -> int: - """Get the current value of the status key in global_state state""" - value = self.app_client.state.global_state.get_value("status") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def denomination_asset_id(self) -> int: - """Get the current value of the denomination_asset_id key in global_state state""" - value = self.app_client.state.global_state.get_value("denomination_asset_id") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def settlement_asset_id(self) -> int: - """Get the current value of the settlement_asset_id key in global_state state""" - value = self.app_client.state.global_state.get_value("settlement_asset_id") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def day_count_convention(self) -> int: - """Get the current value of the day_count_convention key in global_state state""" - value = self.app_client.state.global_state.get_value("day_count_convention") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def metadata(self) -> bytes: - """Get the current value of the metadata key in global_state state""" - value = self.app_client.state.global_state.get_value("metadata") - if isinstance(value, dict) and "AVMBytes" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMBytes"], value) # type: ignore - return typing.cast(bytes, value) - - @property - def principal_discount(self) -> int: - """Get the current value of the principal_discount key in global_state state""" - value = self.app_client.state.global_state.get_value("principal_discount") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def interest_rate(self) -> int: - """Get the current value of the interest_rate key in global_state state""" - value = self.app_client.state.global_state.get_value("interest_rate") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def total_coupons(self) -> int: - """Get the current value of the total_coupons key in global_state state""" - value = self.app_client.state.global_state.get_value("total_coupons") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def primary_distribution_opening_date(self) -> int: - """Get the current value of the primary_distribution_opening_date key in global_state state""" - value = self.app_client.state.global_state.get_value("primary_distribution_opening_date") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def primary_distribution_closure_date(self) -> int: - """Get the current value of the primary_distribution_closure_date key in global_state state""" - value = self.app_client.state.global_state.get_value("primary_distribution_closure_date") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def issuance_date(self) -> int: - """Get the current value of the issuance_date key in global_state state""" - value = self.app_client.state.global_state.get_value("issuance_date") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def secondary_market_opening_date(self) -> int: - """Get the current value of the secondary_market_opening_date key in global_state state""" - value = self.app_client.state.global_state.get_value("secondary_market_opening_date") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def secondary_market_closure_date(self) -> int: - """Get the current value of the secondary_market_closure_date key in global_state state""" - value = self.app_client.state.global_state.get_value("secondary_market_closure_date") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def maturity_date(self) -> int: - """Get the current value of the maturity_date key in global_state state""" - value = self.app_client.state.global_state.get_value("maturity_date") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def paid_coupon_units(self) -> int: - """Get the current value of the paid_coupon_units key in global_state state""" - value = self.app_client.state.global_state.get_value("paid_coupon_units") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def due_coupons_watermark(self) -> int: - """Get the current value of the due_coupons_watermark key in global_state state""" - value = self.app_client.state.global_state.get_value("due_coupons_watermark") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - -class _BoxState: - def __init__(self, app_client: algokit_utils.AppClient): - self.app_client = app_client - - # Pre-generated mapping of value types to their struct classes - self._struct_classes: dict[str, typing.Type[typing.Any]] = { - "RoleConfig": RoleConfig, - "AccountInfo": AccountInfo - } - - def get_all(self) -> BoxStateValue: - """Get all current keyed values from box state""" - result = self.app_client.state.box.get_all() - if not result: - return typing.cast(BoxStateValue, {}) - - converted = {} - for key, value in result.items(): - key_info = self.app_client.app_spec.state.keys.box.get(key) - struct_class = self._struct_classes.get(key_info.value_type) if key_info else None - converted[key] = ( - _init_dataclass(struct_class, value) if struct_class and isinstance(value, dict) - else value - ) - return typing.cast(BoxStateValue, converted) - - @property - def time_events(self) -> list[int]: - """Get the current value of the time_events key in box state""" - value = self.app_client.state.box.get_value("time_events") - if isinstance(value, dict) and "uint64[]" in self._struct_classes: - return _init_dataclass(self._struct_classes["uint64[]"], value) # type: ignore - return typing.cast(list[int], value) - - @property - def coupon_rates(self) -> list[int]: - """Get the current value of the coupon_rates key in box state""" - value = self.app_client.state.box.get_value("coupon_rates") - if isinstance(value, dict) and "uint16[]" in self._struct_classes: - return _init_dataclass(self._struct_classes["uint16[]"], value) # type: ignore - return typing.cast(list[int], value) - - @property - def account_manager(self) -> "_MapState[str, RoleConfig]": - """Get values from the account_manager map in box state""" - return _MapState( - self.app_client.state.box, - "account_manager", - self._struct_classes.get("RoleConfig") - ) - - @property - def primary_dealer(self) -> "_MapState[str, RoleConfig]": - """Get values from the primary_dealer map in box state""" - return _MapState( - self.app_client.state.box, - "primary_dealer", - self._struct_classes.get("RoleConfig") - ) - - @property - def trustee(self) -> "_MapState[str, RoleConfig]": - """Get values from the trustee map in box state""" - return _MapState( - self.app_client.state.box, - "trustee", - self._struct_classes.get("RoleConfig") - ) - - @property - def authority(self) -> "_MapState[str, RoleConfig]": - """Get values from the authority map in box state""" - return _MapState( - self.app_client.state.box, - "authority", - self._struct_classes.get("RoleConfig") - ) - - @property - def interest_oracle(self) -> "_MapState[str, RoleConfig]": - """Get values from the interest_oracle map in box state""" - return _MapState( - self.app_client.state.box, - "interest_oracle", - self._struct_classes.get("RoleConfig") - ) - - @property - def account(self) -> "_MapState[str, AccountInfo]": - """Get values from the account map in box state""" - return _MapState( - self.app_client.state.box, - "account", - self._struct_classes.get("AccountInfo") - ) - -_KeyType = typing.TypeVar("_KeyType") -_ValueType = typing.TypeVar("_ValueType") - -class _AppClientStateMethodsProtocol(typing.Protocol): - def get_map(self, map_name: str) -> dict[typing.Any, typing.Any]: - ... - def get_map_value(self, map_name: str, key: typing.Any) -> typing.Any | None: - ... - -class _MapState(typing.Generic[_KeyType, _ValueType]): - """Generic class for accessing state maps with strongly typed keys and values""" - - def __init__(self, state_accessor: _AppClientStateMethodsProtocol, map_name: str, - struct_class: typing.Type[_ValueType] | None = None): - self._state_accessor = state_accessor - self._map_name = map_name - self._struct_class = struct_class - - def get_map(self) -> dict[_KeyType, _ValueType]: - """Get all current values in the map""" - result = self._state_accessor.get_map(self._map_name) - if self._struct_class and result: - return {k: _init_dataclass(self._struct_class, v) if isinstance(v, dict) else v - for k, v in result.items()} # type: ignore - return typing.cast(dict[_KeyType, _ValueType], result or {}) - - def get_value(self, key: _KeyType) -> _ValueType | None: - """Get a value from the map by key""" - key_value = dataclasses.asdict(key) if dataclasses.is_dataclass(key) else key # type: ignore - value = self._state_accessor.get_map_value(self._map_name, key_value) - if value is not None and self._struct_class and isinstance(value, dict): - return _init_dataclass(self._struct_class, value) # type: ignore - return typing.cast(_ValueType | None, value) - - -class FixedCouponBondClient: - """Client for interacting with FixedCouponBond smart contract""" - - @typing.overload - def __init__(self, app_client: algokit_utils.AppClient) -> None: ... - - @typing.overload - def __init__( - self, - *, - algorand: _AlgoKitAlgorandClient, - app_id: int, - app_name: str | None = None, - default_sender: str | None = None, - default_signer: TransactionSigner | None = None, - approval_source_map: SourceMap | None = None, - clear_source_map: SourceMap | None = None, - ) -> None: ... - - def __init__( - self, - app_client: algokit_utils.AppClient | None = None, - *, - algorand: _AlgoKitAlgorandClient | None = None, - app_id: int | None = None, - app_name: str | None = None, - default_sender: str | None = None, - default_signer: TransactionSigner | None = None, - approval_source_map: SourceMap | None = None, - clear_source_map: SourceMap | None = None, - ) -> None: - if app_client: - self.app_client = app_client - elif algorand and app_id: - self.app_client = algokit_utils.AppClient( - algokit_utils.AppClientParams( - algorand=algorand, - app_spec=APP_SPEC, - app_id=app_id, - app_name=app_name, - default_sender=default_sender, - default_signer=default_signer, - approval_source_map=approval_source_map, - clear_source_map=clear_source_map, - ) - ) - else: - raise ValueError("Either app_client or algorand and app_id must be provided") - - self.params = FixedCouponBondParams(self.app_client) - self.create_transaction = FixedCouponBondCreateTransactionParams(self.app_client) - self.send = FixedCouponBondSend(self.app_client) - self.state = FixedCouponBondState(self.app_client) - - @staticmethod - def from_creator_and_name( - creator_address: str, - app_name: str, - algorand: _AlgoKitAlgorandClient, - default_sender: str | None = None, - default_signer: TransactionSigner | None = None, - approval_source_map: SourceMap | None = None, - clear_source_map: SourceMap | None = None, - ignore_cache: bool | None = None, - app_lookup_cache: algokit_utils.ApplicationLookup | None = None, - ) -> "FixedCouponBondClient": - return FixedCouponBondClient( - algokit_utils.AppClient.from_creator_and_name( - creator_address=creator_address, - app_name=app_name, - app_spec=APP_SPEC, - algorand=algorand, - default_sender=default_sender, - default_signer=default_signer, - approval_source_map=approval_source_map, - clear_source_map=clear_source_map, - ignore_cache=ignore_cache, - app_lookup_cache=app_lookup_cache, - ) - ) - - @staticmethod - def from_network( - algorand: _AlgoKitAlgorandClient, - app_name: str | None = None, - default_sender: str | None = None, - default_signer: TransactionSigner | None = None, - approval_source_map: SourceMap | None = None, - clear_source_map: SourceMap | None = None, - ) -> "FixedCouponBondClient": - return FixedCouponBondClient( - algokit_utils.AppClient.from_network( - app_spec=APP_SPEC, - algorand=algorand, - app_name=app_name, - default_sender=default_sender, - default_signer=default_signer, - approval_source_map=approval_source_map, - clear_source_map=clear_source_map, - ) - ) - - @property - def app_id(self) -> int: - return self.app_client.app_id - - @property - def app_address(self) -> str: - return self.app_client.app_address - - @property - def app_name(self) -> str: - return self.app_client.app_name - - @property - def app_spec(self) -> algokit_utils.Arc56Contract: - return self.app_client.app_spec - - @property - def algorand(self) -> _AlgoKitAlgorandClient: - return self.app_client.algorand - - def clone( - self, - app_name: str | None = None, - default_sender: str | None = None, - default_signer: TransactionSigner | None = None, - approval_source_map: SourceMap | None = None, - clear_source_map: SourceMap | None = None, - ) -> "FixedCouponBondClient": - return FixedCouponBondClient( - self.app_client.clone( - app_name=app_name, - default_sender=default_sender, - default_signer=default_signer, - approval_source_map=approval_source_map, - clear_source_map=clear_source_map, - ) - ) - - def new_group(self) -> "FixedCouponBondComposer": - return FixedCouponBondComposer(self) - - @typing.overload - def decode_return_value( - self, - method: typing.Literal["asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void"], - return_value: algokit_utils.ABIReturn | None - ) -> None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64))"], - return_value: algokit_utils.ABIReturn | None - ) -> CurrentUnitsValue | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["get_coupon_rates()uint16[]"], - return_value: algokit_utils.ABIReturn | None - ) -> list[int] | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["get_payment_amount(address)(uint64,uint64)"], - return_value: algokit_utils.ABIReturn | None - ) -> PaymentAmounts | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["get_coupons_status()(uint64,uint64,uint64,(uint64,uint64),bool)"], - return_value: algokit_utils.ABIReturn | None - ) -> CouponsInfo | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["pay_coupon(address,byte[])(uint64,uint64,byte[])"], - return_value: algokit_utils.ABIReturn | None - ) -> PaymentResult | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["pay_principal(address,byte[])(uint64,uint64,byte[])"], - return_value: algokit_utils.ABIReturn | None - ) -> PaymentResult | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["asset_transfer(address,address,uint64)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["set_secondary_time_events(uint64[])(uint64,uint64)"], - return_value: algokit_utils.ABIReturn | None - ) -> SecondaryMarketSchedule | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["set_default_status(bool)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["primary_distribution(address,uint64)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)"], - return_value: algokit_utils.ABIReturn | None - ) -> AssetInfo | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["get_time_events()uint64[]"], - return_value: algokit_utils.ABIReturn | None - ) -> list[int] | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["get_secondary_market_schedule()uint64[]"], - return_value: algokit_utils.ABIReturn | None - ) -> list[int] | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)"], - return_value: algokit_utils.ABIReturn | None - ) -> AssetMetadata | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["account_gov_suspension(address,bool)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["account_open(address,address)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["account_close(address)(uint64,uint64)"], - return_value: algokit_utils.ABIReturn | None - ) -> tuple[int, int] | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["account_update_payment_address(address,address)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["account_get_info(address)(address,uint64,uint64,uint64,bool)"], - return_value: algokit_utils.ABIReturn | None - ) -> AccountInfo | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["rbac_rotate_arranger(address)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["rbac_set_op_daemon(address)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["rbac_assign_role(uint8,address,byte[])uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["rbac_revoke_role(uint8,address)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["rbac_gov_asset_suspension(bool)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["rbac_get_arranger()address"], - return_value: algokit_utils.ABIReturn | None - ) -> str | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["rbac_get_address_roles(address)(bool,bool,bool,bool,bool)"], - return_value: algokit_utils.ABIReturn | None - ) -> tuple[bool, bool, bool, bool, bool] | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["rbac_get_role_config(uint8,address)(uint64,uint64)"], - return_value: algokit_utils.ABIReturn | None - ) -> RoleConfig | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void"], - return_value: algokit_utils.ABIReturn | None - ) -> None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void"], - return_value: algokit_utils.ABIReturn | None - ) -> None: ... - @typing.overload - def decode_return_value( - self, - method: str, - return_value: algokit_utils.ABIReturn | None - ) -> algokit_utils.ABIValue | algokit_utils.ABIStruct | None: ... - - def decode_return_value( - self, - method: str, - return_value: algokit_utils.ABIReturn | None - ) -> algokit_utils.ABIValue | algokit_utils.ABIStruct | AccountInfo | AssetInfo | AssetMetadata | CouponsInfo | CurrentUnitsValue | None | PaymentAmounts | PaymentResult | RoleConfig | SecondaryMarketSchedule | int | list[int] | str | tuple[bool, bool, bool, bool, bool] | tuple[int, int]: - """Decode ABI return value for the given method.""" - if return_value is None: - return None - - arc56_method = self.app_spec.get_arc56_method(method) - decoded = return_value.get_arc56_value(arc56_method, self.app_spec.structs) - - # If method returns a struct, convert the dict to appropriate dataclass - if (arc56_method and - arc56_method.returns and - arc56_method.returns.struct and - isinstance(decoded, dict)): - struct_class = globals().get(arc56_method.returns.struct) - if struct_class: - return struct_class(**typing.cast(dict, decoded)) - return decoded - - -@dataclasses.dataclass(frozen=True) -class FixedCouponBondMethodCallCreateParams( - algokit_utils.AppClientCreateSchema, algokit_utils.BaseAppClientMethodCallParams[ - AssetCreateArgs, - str | None, - ] -): - """Parameters for creating FixedCouponBond contract using ABI""" - on_complete: typing.Literal[OnComplete.NoOpOC] | None = None - method: str | None = None - - def to_algokit_utils_params(self) -> algokit_utils.AppClientMethodCallCreateParams: - method_args = _parse_abi_args(self.args) - return algokit_utils.AppClientMethodCallCreateParams( - **{ - **self.__dict__, - "method": self.method or getattr(self.args, "abi_method_signature", None), - "args": method_args, - } - ) - -@dataclasses.dataclass(frozen=True) -class FixedCouponBondMethodCallUpdateParams( - algokit_utils.BaseAppClientMethodCallParams[ - AssetUpdateArgs, - str | None, - ] -): - """Parameters for calling FixedCouponBond contract using ABI""" - on_complete: typing.Literal[OnComplete.UpdateApplicationOC] | None = None - method: str | None = None - - def to_algokit_utils_params(self) -> algokit_utils.AppClientMethodCallParams: - method_args = _parse_abi_args(self.args) - return algokit_utils.AppClientMethodCallParams( - **{ - **self.__dict__, - "method": self.method or getattr(self.args, "abi_method_signature", None), - "args": method_args, - } - ) - -class FixedCouponBondFactory(algokit_utils.TypedAppFactoryProtocol[FixedCouponBondMethodCallCreateParams, FixedCouponBondMethodCallUpdateParams, None]): - """Factory for deploying and managing FixedCouponBondClient smart contracts""" - - def __init__( - self, - algorand: _AlgoKitAlgorandClient, - *, - app_name: str | None = None, - default_sender: str | None = None, - default_signer: TransactionSigner | None = None, - version: str | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None, - ): - self.app_factory = algokit_utils.AppFactory( - params=algokit_utils.AppFactoryParams( - algorand=algorand, - app_spec=APP_SPEC, - app_name=app_name, - default_sender=default_sender, - default_signer=default_signer, - version=version, - compilation_params=compilation_params, - ) - ) - self.params = FixedCouponBondFactoryParams(self.app_factory) - self.create_transaction = FixedCouponBondFactoryCreateTransaction(self.app_factory) - self.send = FixedCouponBondFactorySend(self.app_factory) - - @property - def app_name(self) -> str: - return self.app_factory.app_name - - @property - def app_spec(self) -> algokit_utils.Arc56Contract: - return self.app_factory.app_spec - - @property - def algorand(self) -> _AlgoKitAlgorandClient: - return self.app_factory.algorand - - def deploy( - self, - *, - on_update: algokit_utils.OnUpdate | None = None, - on_schema_break: algokit_utils.OnSchemaBreak | None = None, - create_params: FixedCouponBondMethodCallCreateParams | None = None, - update_params: FixedCouponBondMethodCallUpdateParams | None = None, - delete_params: None = None, - existing_deployments: algokit_utils.ApplicationLookup | None = None, - ignore_cache: bool = False, - app_name: str | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None, - send_params: algokit_utils.SendParams | None = None, - ) -> tuple[FixedCouponBondClient, algokit_utils.AppFactoryDeployResult]: - """Deploy the application""" - deploy_response = self.app_factory.deploy( - on_update=on_update, - on_schema_break=on_schema_break, - create_params=create_params.to_algokit_utils_params() if create_params else None, - update_params=update_params.to_algokit_utils_params() if update_params else None, - delete_params=delete_params, - existing_deployments=existing_deployments, - ignore_cache=ignore_cache, - app_name=app_name, - compilation_params=compilation_params, - send_params=send_params, - ) - - return FixedCouponBondClient(deploy_response[0]), deploy_response[1] - - def get_app_client_by_creator_and_name( - self, - creator_address: str, - app_name: str, - default_sender: str | None = None, - default_signer: TransactionSigner | None = None, - ignore_cache: bool | None = None, - app_lookup_cache: algokit_utils.ApplicationLookup | None = None, - approval_source_map: SourceMap | None = None, - clear_source_map: SourceMap | None = None, - ) -> FixedCouponBondClient: - """Get an app client by creator address and name""" - return FixedCouponBondClient( - self.app_factory.get_app_client_by_creator_and_name( - creator_address, - app_name, - default_sender, - default_signer, - ignore_cache, - app_lookup_cache, - approval_source_map, - clear_source_map, - ) - ) - - def get_app_client_by_id( - self, - app_id: int, - app_name: str | None = None, - default_sender: str | None = None, - default_signer: TransactionSigner | None = None, - approval_source_map: SourceMap | None = None, - clear_source_map: SourceMap | None = None, - ) -> FixedCouponBondClient: - """Get an app client by app ID""" - return FixedCouponBondClient( - self.app_factory.get_app_client_by_id( - app_id, - app_name, - default_sender, - default_signer, - approval_source_map, - clear_source_map, - ) - ) - - -class FixedCouponBondFactoryParams: - """Parameters for creating transactions for FixedCouponBond contract""" - - def __init__(self, app_factory: algokit_utils.AppFactory): - self.app_factory = app_factory - self.create = FixedCouponBondFactoryCreateParams(app_factory) - self.update = FixedCouponBondFactoryUpdateParams(app_factory) - self.delete = FixedCouponBondFactoryDeleteParams(app_factory) - -class FixedCouponBondFactoryCreateParams: - """Parameters for 'create' operations of FixedCouponBond contract""" - - def __init__(self, app_factory: algokit_utils.AppFactory): - self.app_factory = app_factory - - def bare( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateParams: - """Creates an instance using a bare call""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.bare.create( - algokit_utils.AppFactoryCreateParams(**dataclasses.asdict(params)), - compilation_params=compilation_params) - - def asset_config( - self, - args: tuple[int, int, int, int, int, int, int, list[int], list[int], list[tuple[int, int]]] | AssetConfigArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def get_account_units_current_value( - self, - args: tuple[str, int] | GetAccountUnitsCurrentValueArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64)) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64))", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def get_coupon_rates( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the get_coupon_rates()uint16[] ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "get_coupon_rates()uint16[]", - "args": None, - } - ), - compilation_params=compilation_params - ) - - def get_payment_amount( - self, - args: tuple[str] | GetPaymentAmountArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the get_payment_amount(address)(uint64,uint64) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "get_payment_amount(address)(uint64,uint64)", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def get_coupons_status( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the get_coupons_status()(uint64,uint64,uint64,(uint64,uint64),bool) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "get_coupons_status()(uint64,uint64,uint64,(uint64,uint64),bool)", - "args": None, - } - ), - compilation_params=compilation_params - ) - - def pay_coupon( - self, - args: tuple[str, bytes | str] | PayCouponArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the pay_coupon(address,byte[])(uint64,uint64,byte[]) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "pay_coupon(address,byte[])(uint64,uint64,byte[])", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def pay_principal( - self, - args: tuple[str, bytes | str] | PayPrincipalArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the pay_principal(address,byte[])(uint64,uint64,byte[]) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "pay_principal(address,byte[])(uint64,uint64,byte[])", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def asset_transfer( - self, - args: tuple[str, str, int] | AssetTransferArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the asset_transfer(address,address,uint64)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "asset_transfer(address,address,uint64)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def set_secondary_time_events( - self, - args: tuple[list[int]] | SetSecondaryTimeEventsArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the set_secondary_time_events(uint64[])(uint64,uint64) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "set_secondary_time_events(uint64[])(uint64,uint64)", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def set_default_status( - self, - args: tuple[bool] | SetDefaultStatusArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the set_default_status(bool)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "set_default_status(bool)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def primary_distribution( - self, - args: tuple[str, int] | PrimaryDistributionArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the primary_distribution(address,uint64)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "primary_distribution(address,uint64)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def get_asset_info( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)", - "args": None, - } - ), - compilation_params=compilation_params - ) - - def get_time_events( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the get_time_events()uint64[] ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "get_time_events()uint64[]", - "args": None, - } - ), - compilation_params=compilation_params - ) - - def get_secondary_market_schedule( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the get_secondary_market_schedule()uint64[] ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "get_secondary_market_schedule()uint64[]", - "args": None, - } - ), - compilation_params=compilation_params - ) - - def get_asset_metadata( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", - "args": None, - } - ), - compilation_params=compilation_params - ) - - def account_gov_suspension( - self, - args: tuple[str, bool] | AccountGovSuspensionArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the account_gov_suspension(address,bool)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "account_gov_suspension(address,bool)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def account_open( - self, - args: tuple[str, str] | AccountOpenArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the account_open(address,address)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "account_open(address,address)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def account_close( - self, - args: tuple[str] | AccountCloseArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the account_close(address)(uint64,uint64) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "account_close(address)(uint64,uint64)", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def account_update_payment_address( - self, - args: tuple[str, str] | AccountUpdatePaymentAddressArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the account_update_payment_address(address,address)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "account_update_payment_address(address,address)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def account_get_info( - self, - args: tuple[str] | AccountGetInfoArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the account_get_info(address)(address,uint64,uint64,uint64,bool) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "account_get_info(address)(address,uint64,uint64,uint64,bool)", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def rbac_rotate_arranger( - self, - args: tuple[str] | RbacRotateArrangerArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_rotate_arranger(address)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "rbac_rotate_arranger(address)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def rbac_set_op_daemon( - self, - args: tuple[str] | RbacSetOpDaemonArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_set_op_daemon(address)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "rbac_set_op_daemon(address)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def rbac_assign_role( - self, - args: tuple[int, str, bytes | str] | RbacAssignRoleArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_assign_role(uint8,address,byte[])uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "rbac_assign_role(uint8,address,byte[])uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def rbac_revoke_role( - self, - args: tuple[int, str] | RbacRevokeRoleArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_revoke_role(uint8,address)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "rbac_revoke_role(uint8,address)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def rbac_gov_asset_suspension( - self, - args: tuple[bool] | RbacGovAssetSuspensionArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_gov_asset_suspension(bool)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "rbac_gov_asset_suspension(bool)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def rbac_get_arranger( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_get_arranger()address ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "rbac_get_arranger()address", - "args": None, - } - ), - compilation_params=compilation_params - ) - - def rbac_get_address_roles( - self, - args: tuple[str] | RbacGetAddressRolesArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_get_address_roles(address)(bool,bool,bool,bool,bool) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def rbac_get_role_config( - self, - args: tuple[int, str] | RbacGetRoleConfigArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_get_role_config(uint8,address)(uint64,uint64) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "rbac_get_role_config(uint8,address)(uint64,uint64)", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def asset_create( - self, - args: tuple[str, AssetMetadata] | AssetCreateArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def asset_update( - self, - args: tuple[AssetMetadata] | AssetUpdateArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - -class FixedCouponBondFactoryUpdateParams: - """Parameters for 'update' operations of FixedCouponBond contract""" - - def __init__(self, app_factory: algokit_utils.AppFactory): - self.app_factory = app_factory - - def bare( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - - ) -> algokit_utils.AppUpdateParams: - """Updates an instance using a bare call""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.bare.deploy_update( - algokit_utils.AppClientBareCallParams(**dataclasses.asdict(params)), - ) - -class FixedCouponBondFactoryDeleteParams: - """Parameters for 'delete' operations of FixedCouponBond contract""" - - def __init__(self, app_factory: algokit_utils.AppFactory): - self.app_factory = app_factory - - def bare( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - - ) -> algokit_utils.AppDeleteParams: - """Deletes an instance using a bare call""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.bare.deploy_delete( - algokit_utils.AppClientBareCallParams(**dataclasses.asdict(params)), - ) - - -class FixedCouponBondFactoryCreateTransaction: - """Create transactions for FixedCouponBond contract""" - - def __init__(self, app_factory: algokit_utils.AppFactory): - self.app_factory = app_factory - self.create = FixedCouponBondFactoryCreateTransactionCreate(app_factory) - - -class FixedCouponBondFactoryCreateTransactionCreate: - """Create new instances of FixedCouponBond contract""" - - def __init__(self, app_factory: algokit_utils.AppFactory): - self.app_factory = app_factory - - def bare( - self, - params: algokit_utils.CommonAppCallCreateParams | None = None, - ) -> Transaction: - """Creates a new instance using a bare call""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.create_transaction.bare.create( - algokit_utils.AppFactoryCreateParams(**dataclasses.asdict(params)), - ) - - -class FixedCouponBondFactorySend: - """Send calls to FixedCouponBond contract""" - - def __init__(self, app_factory: algokit_utils.AppFactory): - self.app_factory = app_factory - self.create = FixedCouponBondFactorySendCreate(app_factory) - - -class FixedCouponBondFactorySendCreate: - """Send create calls to FixedCouponBond contract""" - - def __init__(self, app_factory: algokit_utils.AppFactory): - self.app_factory = app_factory - - def bare( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - send_params: algokit_utils.SendParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None, - ) -> tuple[FixedCouponBondClient, algokit_utils.SendAppCreateTransactionResult]: - """Creates a new instance using a bare call""" - params = params or algokit_utils.CommonAppCallCreateParams() - result = self.app_factory.send.bare.create( - algokit_utils.AppFactoryCreateParams(**dataclasses.asdict(params)), - send_params=send_params, - compilation_params=compilation_params - ) - return FixedCouponBondClient(result[0]), result[1] - - def asset_create( - self, - args: tuple[str, AssetMetadata] | AssetCreateArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - send_params: algokit_utils.SendParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> tuple[FixedCouponBondClient, algokit_utils.AppFactoryCreateMethodCallResult[None]]: - """Creates and sends a transaction using the asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - client, result = self.app_factory.send.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void", - "args": _parse_abi_args(args), - } - ), - send_params=send_params, - compilation_params=compilation_params - ) - return_value = None if result.abi_return is None else typing.cast(None, result.abi_return) - - return FixedCouponBondClient(client), algokit_utils.AppFactoryCreateMethodCallResult[None]( - **{ - **result.__dict__, - "app_id": result.app_id, - "abi_return": return_value, - "transaction": result.transaction, - "confirmation": result.confirmation, - "group_id": result.group_id, - "tx_ids": result.tx_ids, - "transactions": result.transactions, - "confirmations": result.confirmations, - "app_address": result.app_address, - } - ) - - -class _FixedCouponBondUpdateComposer: - def __init__(self, composer: "FixedCouponBondComposer"): - self.composer = composer - def asset_update( - self, - args: tuple[AssetMetadata] | AssetUpdateArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "FixedCouponBondComposer": - self.composer._composer.add_app_update_method_call( - self.composer.client.params.update.asset_update( - args=args, - params=params, - compilation_params=compilation_params - ) - ) - self.composer._result_mappers.append( - lambda v: self.composer.client.decode_return_value( - "asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void", v - ) - ) - return self.composer - - -class FixedCouponBondComposer: - """Composer for creating transaction groups for FixedCouponBond contract calls""" - - def __init__(self, client: "FixedCouponBondClient"): - self.client = client - self._composer = client.algorand.new_group() - self._result_mappers: list[typing.Callable[[algokit_utils.ABIReturn | None], object] | None] = [] - - @property - def update(self) -> "_FixedCouponBondUpdateComposer": - return _FixedCouponBondUpdateComposer(self) - - def asset_config( - self, - args: tuple[int, int, int, int, int, int, int, list[int], list[int], list[tuple[int, int]]] | AssetConfigArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "FixedCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.asset_config( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void", v - ) - ) - return self - - def get_account_units_current_value( - self, - args: tuple[str, int] | GetAccountUnitsCurrentValueArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "FixedCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.get_account_units_current_value( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64))", v - ) - ) - return self - - def get_coupon_rates( - self, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "FixedCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.get_coupon_rates( - - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "get_coupon_rates()uint16[]", v - ) - ) - return self - - def get_payment_amount( - self, - args: tuple[str] | GetPaymentAmountArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "FixedCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.get_payment_amount( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "get_payment_amount(address)(uint64,uint64)", v - ) - ) - return self - - def get_coupons_status( - self, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "FixedCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.get_coupons_status( - - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "get_coupons_status()(uint64,uint64,uint64,(uint64,uint64),bool)", v - ) - ) - return self - - def pay_coupon( - self, - args: tuple[str, bytes | str] | PayCouponArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "FixedCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.pay_coupon( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "pay_coupon(address,byte[])(uint64,uint64,byte[])", v - ) - ) - return self - - def pay_principal( - self, - args: tuple[str, bytes | str] | PayPrincipalArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "FixedCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.pay_principal( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "pay_principal(address,byte[])(uint64,uint64,byte[])", v - ) - ) - return self - - def asset_transfer( - self, - args: tuple[str, str, int] | AssetTransferArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "FixedCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.asset_transfer( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "asset_transfer(address,address,uint64)uint64", v - ) - ) - return self - - def set_secondary_time_events( - self, - args: tuple[list[int]] | SetSecondaryTimeEventsArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "FixedCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.set_secondary_time_events( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "set_secondary_time_events(uint64[])(uint64,uint64)", v - ) - ) - return self - - def set_default_status( - self, - args: tuple[bool] | SetDefaultStatusArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "FixedCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.set_default_status( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "set_default_status(bool)uint64", v - ) - ) - return self - - def primary_distribution( - self, - args: tuple[str, int] | PrimaryDistributionArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "FixedCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.primary_distribution( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "primary_distribution(address,uint64)uint64", v - ) - ) - return self - - def get_asset_info( - self, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "FixedCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.get_asset_info( - - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)", v - ) - ) - return self - - def get_time_events( - self, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "FixedCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.get_time_events( - - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "get_time_events()uint64[]", v - ) - ) - return self - - def get_secondary_market_schedule( - self, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "FixedCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.get_secondary_market_schedule( - - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "get_secondary_market_schedule()uint64[]", v - ) - ) - return self - - def get_asset_metadata( - self, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "FixedCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.get_asset_metadata( - - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", v - ) - ) - return self - - def account_gov_suspension( - self, - args: tuple[str, bool] | AccountGovSuspensionArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "FixedCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.account_gov_suspension( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "account_gov_suspension(address,bool)uint64", v - ) - ) - return self - - def account_open( - self, - args: tuple[str, str] | AccountOpenArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "FixedCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.account_open( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "account_open(address,address)uint64", v - ) - ) - return self - - def account_close( - self, - args: tuple[str] | AccountCloseArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "FixedCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.account_close( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "account_close(address)(uint64,uint64)", v - ) - ) - return self - - def account_update_payment_address( - self, - args: tuple[str, str] | AccountUpdatePaymentAddressArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "FixedCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.account_update_payment_address( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "account_update_payment_address(address,address)uint64", v - ) - ) - return self - - def account_get_info( - self, - args: tuple[str] | AccountGetInfoArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "FixedCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.account_get_info( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "account_get_info(address)(address,uint64,uint64,uint64,bool)", v - ) - ) - return self - - def rbac_rotate_arranger( - self, - args: tuple[str] | RbacRotateArrangerArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "FixedCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.rbac_rotate_arranger( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "rbac_rotate_arranger(address)uint64", v - ) - ) - return self - - def rbac_set_op_daemon( - self, - args: tuple[str] | RbacSetOpDaemonArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "FixedCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.rbac_set_op_daemon( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "rbac_set_op_daemon(address)uint64", v - ) - ) - return self - - def rbac_assign_role( - self, - args: tuple[int, str, bytes | str] | RbacAssignRoleArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "FixedCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.rbac_assign_role( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "rbac_assign_role(uint8,address,byte[])uint64", v - ) - ) - return self - - def rbac_revoke_role( - self, - args: tuple[int, str] | RbacRevokeRoleArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "FixedCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.rbac_revoke_role( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "rbac_revoke_role(uint8,address)uint64", v - ) - ) - return self - - def rbac_gov_asset_suspension( - self, - args: tuple[bool] | RbacGovAssetSuspensionArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "FixedCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.rbac_gov_asset_suspension( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "rbac_gov_asset_suspension(bool)uint64", v - ) - ) - return self - - def rbac_get_arranger( - self, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "FixedCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.rbac_get_arranger( - - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "rbac_get_arranger()address", v - ) - ) - return self - - def rbac_get_address_roles( - self, - args: tuple[str] | RbacGetAddressRolesArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "FixedCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.rbac_get_address_roles( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", v - ) - ) - return self - - def rbac_get_role_config( - self, - args: tuple[int, str] | RbacGetRoleConfigArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "FixedCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.rbac_get_role_config( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "rbac_get_role_config(uint8,address)(uint64,uint64)", v - ) - ) - return self - - def asset_create( - self, - args: tuple[str, AssetMetadata] | AssetCreateArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "FixedCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.asset_create( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void", v - ) - ) - return self - - def clear_state( - self, - *, - args: list[bytes] | None = None, - params: algokit_utils.CommonAppCallParams | None = None, - ) -> "FixedCouponBondComposer": - params=params or algokit_utils.CommonAppCallParams() - self._composer.add_app_call( - self.client.params.clear_state( - algokit_utils.AppClientBareCallParams( - **{ - **dataclasses.asdict(params), - "args": args - } - ) - ) - ) - return self - - def add_transaction( - self, txn: Transaction, signer: TransactionSigner | None = None - ) -> "FixedCouponBondComposer": - self._composer.add_transaction(txn, signer) - return self - - def composer(self) -> algokit_utils.TransactionComposer: - return self._composer - - def simulate( - self, - allow_more_logs: bool | None = None, - allow_empty_signatures: bool | None = None, - allow_unnamed_resources: bool | None = None, - extra_opcode_budget: int | None = None, - exec_trace_config: SimulateTraceConfig | None = None, - simulation_round: int | None = None, - skip_signatures: bool | None = None, - ) -> algokit_utils.SendAtomicTransactionComposerResults: - return self._composer.simulate( - allow_more_logs=allow_more_logs, - allow_empty_signatures=allow_empty_signatures, - allow_unnamed_resources=allow_unnamed_resources, - extra_opcode_budget=extra_opcode_budget, - exec_trace_config=exec_trace_config, - simulation_round=simulation_round, - skip_signatures=skip_signatures, - ) - - def send( - self, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAtomicTransactionComposerResults: - return self._composer.send(send_params) diff --git a/smart_contracts/artifacts/mock_module_accounting/MockAccountingModule.approval.puya.map b/smart_contracts/artifacts/mock_module_accounting/MockAccountingModule.approval.puya.map deleted file mode 100644 index e7c96b13..00000000 --- a/smart_contracts/artifacts/mock_module_accounting/MockAccountingModule.approval.puya.map +++ /dev/null @@ -1,7793 +0,0 @@ -{ - "version": 3, - "sources": [ - "../../../modules/accounting.py", - "../../../modules/rbac.py", - "../../mock_module_accounting/contract.py" - ], - "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC8BmD;AAAf;;AAA5B;AAC4C;;AAAf;;AAA7B;AAgBA;;AAAuB;AAAvB;AACA;;AAAuB;AAAvB;AD9BA;;;;;;;;;;;;;AAAmB;AAAnB;AACA;;AAAyB;AAAzB;AACA;;;;;;;;;;;;AAAkB;AAAlB;AACA;;AAAc;AAAd;AEhBR;;AAAA;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAQK;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAEG;AAAsB;;AAAtB;AAFH;AAAA;AFgFA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ACjB+B;AAAgB;;AAArC;;;AAAP;AD9C0B;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAmFA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AACO;;AArBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;ACjD+B;AAAsB;;AAA3C;;;AAAP;ADxCO;AAAA;;AAAA;AAAA;AAAe;;;AAAf;AA+GA;AAAP;AACA;;;AACA;;;AAC8B;;AAAvB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AAIU;AAFsB;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAhC;AAOO;;AAlCV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoCA;;;AAAA;AAAA;AAAA;AAAA;AAAA;ACrF+B;AAAsB;;AAA3C;;;AAAP;ADuGA;;;AA5I0B;;AAAnB;AAAA;AAAA;AAAA;AAAA;;AAAP;AA+Ie;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AACf;;AACA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAhIR;;;AACY;;AAAc;;;AAAd;AAiIiB;;AAzBxB;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAoBU;;AAAA;;AAAA;AAAP;AACA;;;AACA;;;AA3K0B;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AA6KA;AAAA;;AAAA;AACO;;AAzBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAhL6B;;AAAnB;AAAA;AAAA;AAAA;AAAA;;AAAP;AA+LO;AAAA;AAfV;AAAA;AAAA;AAAA;AAAA;AAAA;AC5DA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAWG;;;AACA;AAAA;AAAA;AACO;;AAbV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAeA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAWG;;;AACA;;AAAA;AAAA;AACO;;AAbV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAeA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAsBG;;;AACA;;;AACwB;AAAA;;AAAxB;;;AApGc;AAAX;AAAX;;;AACY;AAAA;;AAAA;AAqGG;;AA1BV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAxEM;AAAW;;AAAX;AAAX;;;AACuC;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AA+FJ;;;AA7FG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AA2FJ;;;AAzFG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAuFJ;;;AArFG;AAAW;;AAAX;AAAX;;;AACuC;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAmFJ;;;AAjFG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;;;;AAkFP;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAmBG;;;AACA;;;AACwB;AAAA;;AAAxB;;;AApGO;AAAW;AAAX;AAAP;AACc;;AAAX;AAAX;;;AACmC;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAmGG;;AAvBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA1EM;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AA8FJ;;;AA5FG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AA0FJ;;;AAxFG;AAAW;;AAAX;AAAX;;;AACmC;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAsFJ;;;AApFG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;;;;AAqFP;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAzJ+B;AAAgB;;AAArC;;;AAAP;AAyKA;;AAAA;AAAA;AACO;;AAjBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BU;AAAA;AAAA;AAAA;AARV;AAAA;AAAA;AAAA;AAAA;AAAA;AAUA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAc4B;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AAlBP;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAcU;AACP;AAAA;;;AAES;AAIA;;;;;;;AALT;;AAAA;;;;;;;;;;;;;;AA+BQ;AAJI;;AA5QL;;AAAA;AAAA;AAAA;AAAA;;AA2QC;AAGO;AAAA;AA7ClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAsCe;AAvQL;;AAAA;AAAA;AAAA;AAAA;;AAsQC;AAGO;AAAA;AAxClB;;;AAiCe;;AAlQL;;AAAA;AAAA;AAAA;AAAA;;AAiQC;AAGO;AAAA;AAnClB;;;AA4Be;;AA7PL;;AAAA;AAAA;AAAA;AAAA;;AA4PC;AAGO;AAAA;AA9BlB;;;AAuBe;AAxPL;;AAAA;AAAA;AAAA;AAAA;;AAuPC;AAGO;AAAA;AAzBlB;;;AAkBkB;;;;;;;;;;;;;;;;;;AAlBlB;;;AA/ND;;;;;AAFW;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAGA;;;AACH;;AAAA;AAAA;AAAA;AAAA;AACG;;AAAA;AAAA;;AADH;AAAA;;;AAEG;;AAAA;AAAA;AAAA;;AAAA;AADA;;AAAA;AADH;;;;AADJ;;AAAA;;;;;AAOyB;;AAbF;AAAA;AAAA;AAAA;AAAhB;AAaP;;AAkBW;AAAA;;AAAA;AAAA;AAAJ;AAAP;;AAGW;AAAA;;AAAA;AAAA;AAAJ;AAAP;;AAEJ;;;AACW;;AACH;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;AAAA;;AAMH;;AANG;AAAA;;;;AAAP;;;", - "op_pc_offset": 0, - "pc_events": { - "1": { - "subroutine": "algopy.arc4.ARC4Contract.approval_program", - "params": {}, - "block": "main", - "stack_in": [], - "op": "intcblock 1 0 32 20" - }, - "7": { - "op": "bytecblock 0x151f7c75 0x52323023 0x52373023 0x52343023 0x52333023 0x52353023 0x52363023 0x52383023 \"asset_suspended\" \"circulating_units\" \"status\" 0x52323523 \"asset_defaulted\"" - }, - "111": { - "op": "txn ApplicationID", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "113": { - "op": "bnz main_after_if_else@2", - "stack_out": [] - }, - "116": { - "op": "bytec_1 // 0x52323023", - "defined_out": [ - "0x52323023" - ], - "stack_out": [ - "0x52323023" - ] - }, - "117": { - "op": "global ZeroAddress", - "defined_out": [ - "0x52323023", - "tmp%0#2" - ], - "stack_out": [ - "0x52323023", - "tmp%0#2" - ] - }, - "119": { - "op": "app_global_put", - "stack_out": [] - }, - "120": { - "op": "bytec 11 // 0x52323523", - "defined_out": [ - "0x52323523" - ], - "stack_out": [ - "0x52323523" - ] - }, - "122": { - "op": "global ZeroAddress", - "defined_out": [ - "0x52323523", - "tmp%1#2" - ], - "stack_out": [ - "0x52323523", - "tmp%1#2" - ] - }, - "124": { - "op": "app_global_put", - "stack_out": [] - }, - "125": { - "op": "bytec 8 // \"asset_suspended\"", - "defined_out": [ - "\"asset_suspended\"" - ], - "stack_out": [ - "\"asset_suspended\"" - ] - }, - "127": { - "op": "intc_1 // 0", - "defined_out": [ - "\"asset_suspended\"", - "0" - ], - "stack_out": [ - "\"asset_suspended\"", - "0" - ] - }, - "128": { - "op": "app_global_put", - "stack_out": [] - }, - "129": { - "op": "bytec 12 // \"asset_defaulted\"", - "defined_out": [ - "\"asset_defaulted\"" - ], - "stack_out": [ - "\"asset_defaulted\"" - ] - }, - "131": { - "op": "intc_1 // 0", - "stack_out": [ - "\"asset_defaulted\"", - "0" - ] - }, - "132": { - "op": "app_global_put", - "stack_out": [] - }, - "133": { - "op": "pushbytes \"total_units\"", - "defined_out": [ - "\"total_units\"" - ], - "stack_out": [ - "\"total_units\"" - ] - }, - "146": { - "op": "intc_1 // 0", - "stack_out": [ - "\"total_units\"", - "0" - ] - }, - "147": { - "op": "app_global_put", - "stack_out": [] - }, - "148": { - "op": "bytec 9 // \"circulating_units\"", - "defined_out": [ - "\"circulating_units\"" - ], - "stack_out": [ - "\"circulating_units\"" - ] - }, - "150": { - "op": "intc_1 // 0", - "stack_out": [ - "\"circulating_units\"", - "0" - ] - }, - "151": { - "op": "app_global_put", - "stack_out": [] - }, - "152": { - "op": "pushbytes \"unit_value\"", - "defined_out": [ - "\"unit_value\"" - ], - "stack_out": [ - "\"unit_value\"" - ] - }, - "164": { - "op": "intc_1 // 0", - "stack_out": [ - "\"unit_value\"", - "0" - ] - }, - "165": { - "op": "app_global_put", - "stack_out": [] - }, - "166": { - "op": "bytec 10 // \"status\"", - "defined_out": [ - "\"status\"" - ], - "stack_out": [ - "\"status\"" - ] - }, - "168": { - "op": "intc_1 // 0", - "stack_out": [ - "\"status\"", - "0" - ] - }, - "169": { - "op": "app_global_put", - "stack_out": [] - }, - "170": { - "block": "main_after_if_else@2", - "stack_in": [], - "op": "txn NumAppArgs", - "defined_out": [ - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1" - ] - }, - "172": { - "op": "bz main_create@22", - "stack_out": [] - }, - "175": { - "op": "txn OnCompletion", - "defined_out": [ - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0" - ] - }, - "177": { - "op": "!", - "defined_out": [ - "tmp%3#0" - ], - "stack_out": [ - "tmp%3#0" - ] - }, - "178": { - "op": "assert", - "stack_out": [] - }, - "179": { - "op": "txn ApplicationID", - "defined_out": [ - "tmp%4#0" - ], - "stack_out": [ - "tmp%4#0" - ] - }, - "181": { - "op": "assert", - "stack_out": [] - }, - "182": { - "op": "pushbytess 0xdc063b35 0x14fc10ef 0x4c113ed5 0x74a7297f 0x105c184e 0x82f71b2d 0xef04f5d3 0x03b83329 0x3dbe80bd 0xdf54e82c 0x010c8299 0x7406acd2 0xc3e4b297 // method \"account_gov_suspension(address,bool)uint64\", method \"account_open(address,address)uint64\", method \"account_close(address)(uint64,uint64)\", method \"account_update_payment_address(address,address)uint64\", method \"account_get_info(address)(address,uint64,uint64,uint64,bool)\", method \"rbac_rotate_arranger(address)uint64\", method \"rbac_set_op_daemon(address)uint64\", method \"rbac_assign_role(uint8,address,byte[])uint64\", method \"rbac_revoke_role(uint8,address)uint64\", method \"rbac_gov_asset_suspension(bool)uint64\", method \"rbac_get_arranger()address\", method \"rbac_get_address_roles(address)(bool,bool,bool,bool,bool)\", method \"rbac_get_role_config(uint8,address)(uint64,uint64)\"", - "defined_out": [ - "Method(account_close(address)(uint64,uint64))", - "Method(account_get_info(address)(address,uint64,uint64,uint64,bool))", - "Method(account_gov_suspension(address,bool)uint64)", - "Method(account_open(address,address)uint64)", - "Method(account_update_payment_address(address,address)uint64)", - "Method(rbac_assign_role(uint8,address,byte[])uint64)", - "Method(rbac_get_address_roles(address)(bool,bool,bool,bool,bool))", - "Method(rbac_get_arranger()address)", - "Method(rbac_get_role_config(uint8,address)(uint64,uint64))", - "Method(rbac_gov_asset_suspension(bool)uint64)", - "Method(rbac_revoke_role(uint8,address)uint64)", - "Method(rbac_rotate_arranger(address)uint64)", - "Method(rbac_set_op_daemon(address)uint64)" - ], - "stack_out": [ - "Method(account_gov_suspension(address,bool)uint64)", - "Method(account_open(address,address)uint64)", - "Method(account_close(address)(uint64,uint64))", - "Method(account_update_payment_address(address,address)uint64)", - "Method(account_get_info(address)(address,uint64,uint64,uint64,bool))", - "Method(rbac_rotate_arranger(address)uint64)", - "Method(rbac_set_op_daemon(address)uint64)", - "Method(rbac_assign_role(uint8,address,byte[])uint64)", - "Method(rbac_revoke_role(uint8,address)uint64)", - "Method(rbac_gov_asset_suspension(bool)uint64)", - "Method(rbac_get_arranger()address)", - "Method(rbac_get_address_roles(address)(bool,bool,bool,bool,bool))", - "Method(rbac_get_role_config(uint8,address)(uint64,uint64))" - ] - }, - "249": { - "op": "txna ApplicationArgs 0", - "defined_out": [ - "Method(account_close(address)(uint64,uint64))", - "Method(account_get_info(address)(address,uint64,uint64,uint64,bool))", - "Method(account_gov_suspension(address,bool)uint64)", - "Method(account_open(address,address)uint64)", - "Method(account_update_payment_address(address,address)uint64)", - "Method(rbac_assign_role(uint8,address,byte[])uint64)", - "Method(rbac_get_address_roles(address)(bool,bool,bool,bool,bool))", - "Method(rbac_get_arranger()address)", - "Method(rbac_get_role_config(uint8,address)(uint64,uint64))", - "Method(rbac_gov_asset_suspension(bool)uint64)", - "Method(rbac_revoke_role(uint8,address)uint64)", - "Method(rbac_rotate_arranger(address)uint64)", - "Method(rbac_set_op_daemon(address)uint64)", - "tmp%6#0" - ], - "stack_out": [ - "Method(account_gov_suspension(address,bool)uint64)", - "Method(account_open(address,address)uint64)", - "Method(account_close(address)(uint64,uint64))", - "Method(account_update_payment_address(address,address)uint64)", - "Method(account_get_info(address)(address,uint64,uint64,uint64,bool))", - "Method(rbac_rotate_arranger(address)uint64)", - "Method(rbac_set_op_daemon(address)uint64)", - "Method(rbac_assign_role(uint8,address,byte[])uint64)", - "Method(rbac_revoke_role(uint8,address)uint64)", - "Method(rbac_gov_asset_suspension(bool)uint64)", - "Method(rbac_get_arranger()address)", - "Method(rbac_get_address_roles(address)(bool,bool,bool,bool,bool))", - "Method(rbac_get_role_config(uint8,address)(uint64,uint64))", - "tmp%6#0" - ] - }, - "252": { - "op": "match account_gov_suspension account_open account_close account_update_payment_address account_get_info rbac_rotate_arranger rbac_set_op_daemon rbac_assign_role rbac_revoke_role rbac_gov_asset_suspension rbac_get_arranger rbac_get_address_roles rbac_get_role_config", - "stack_out": [] - }, - "280": { - "op": "err" - }, - "281": { - "block": "main_create@22", - "stack_in": [], - "op": "txn OnCompletion", - "defined_out": [ - "tmp%7#0" - ], - "stack_out": [ - "tmp%7#0" - ] - }, - "283": { - "op": "!", - "defined_out": [ - "tmp%8#0" - ], - "stack_out": [ - "tmp%8#0" - ] - }, - "284": { - "op": "txn ApplicationID", - "defined_out": [ - "tmp%8#0", - "tmp%9#0" - ], - "stack_out": [ - "tmp%8#0", - "tmp%9#0" - ] - }, - "286": { - "op": "!", - "defined_out": [ - "tmp%10#0", - "tmp%8#0" - ], - "stack_out": [ - "tmp%8#0", - "tmp%10#0" - ] - }, - "287": { - "op": "&&", - "defined_out": [ - "tmp%11#0" - ], - "stack_out": [ - "tmp%11#0" - ] - }, - "288": { - "op": "assert", - "stack_out": [] - }, - "289": { - "op": "bytec_1 // 0x52323023", - "defined_out": [ - "0x52323023" - ], - "stack_out": [ - "0x52323023" - ] - }, - "290": { - "op": "txn Sender", - "defined_out": [ - "0x52323023", - "tmp%0#2" - ], - "stack_out": [ - "0x52323023", - "tmp%0#2" - ] - }, - "292": { - "op": "app_global_put", - "stack_out": [] - }, - "293": { - "op": "intc_0 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "294": { - "op": "return", - "stack_out": [] - }, - "295": { - "subroutine": "modules.accounting.AccountingModule.account_gov_suspension[routing]", - "params": {}, - "block": "account_gov_suspension", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "holding_address#0" - ], - "stack_out": [ - "holding_address#0" - ] - }, - "298": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ] - }, - "299": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0" - ] - }, - "300": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0", - "32" - ] - }, - "301": { - "op": "==", - "defined_out": [ - "eq%0#0", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "eq%0#0" - ] - }, - "302": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "holding_address#0" - ] - }, - "303": { - "op": "txna ApplicationArgs 2", - "defined_out": [ - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0" - ] - }, - "306": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ] - }, - "307": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%1#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "len%1#0" - ] - }, - "308": { - "op": "intc_0 // 1", - "defined_out": [ - "1", - "holding_address#0", - "len%1#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "len%1#0", - "1" - ] - }, - "309": { - "op": "==", - "defined_out": [ - "eq%1#0", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "eq%1#0" - ] - }, - "310": { - "error": "invalid number of bytes for arc4.bool", - "op": "assert // invalid number of bytes for arc4.bool", - "stack_out": [ - "holding_address#0", - "tmp%2#0" - ] - }, - "311": { - "op": "intc_1 // 0", - "defined_out": [ - "0", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "0" - ] - }, - "312": { - "op": "getbit", - "defined_out": [ - "holding_address#0", - "suspended#0" - ], - "stack_out": [ - "holding_address#0", - "suspended#0" - ] - }, - "313": { - "op": "bytec_2 // 0x52373023", - "defined_out": [ - "0x52373023", - "holding_address#0", - "suspended#0" - ], - "stack_out": [ - "holding_address#0", - "suspended#0", - "0x52373023" - ] - }, - "314": { - "op": "txn Sender", - "defined_out": [ - "0x52373023", - "holding_address#0", - "suspended#0", - "tmp%0#2" - ], - "stack_out": [ - "holding_address#0", - "suspended#0", - "0x52373023", - "tmp%0#2" - ] - }, - "316": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "holding_address#0", - "suspended#0", - "tmp%1#0" - ], - "stack_out": [ - "holding_address#0", - "suspended#0", - "tmp%1#0" - ] - }, - "319": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "holding_address#0", - "suspended#0" - ] - }, - "320": { - "op": "bytec 4 // 0x52333023", - "defined_out": [ - "0x52333023", - "holding_address#0", - "suspended#0" - ], - "stack_out": [ - "holding_address#0", - "suspended#0", - "0x52333023" - ] - }, - "322": { - "op": "uncover 2", - "stack_out": [ - "suspended#0", - "0x52333023", - "holding_address#0" - ] - }, - "324": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "suspended#0" - ], - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1" - ] - }, - "325": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "suspended#0" - ], - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "326": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0", - "suspended#0" - ], - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "327": { - "op": "bury 1", - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "329": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1" - ] - }, - "330": { - "op": "dup", - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "331": { - "op": "pushint 56", - "defined_out": [ - "56", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "suspended#0" - ], - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "56" - ] - }, - "333": { - "op": "intc_0 // 1", - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "56", - "1" - ] - }, - "334": { - "op": "box_extract", - "defined_out": [ - "box%box_extract%0#0", - "box_prefixed_key%0#1", - "suspended#0" - ], - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1", - "box%box_extract%0#0" - ] - }, - "335": { - "op": "intc_1 // 0", - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1", - "box%box_extract%0#0", - "0" - ] - }, - "336": { - "op": "uncover 3", - "stack_out": [ - "box_prefixed_key%0#1", - "box%box_extract%0#0", - "0", - "suspended#0" - ] - }, - "338": { - "op": "setbit", - "defined_out": [ - "aggregate%updated_target%0#0", - "box_prefixed_key%0#1" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "aggregate%updated_target%0#0" - ] - }, - "339": { - "op": "pushint 56" - }, - "341": { - "op": "swap", - "stack_out": [ - "box_prefixed_key%0#1", - "56", - "aggregate%updated_target%0#0" - ] - }, - "342": { - "op": "box_replace", - "stack_out": [] - }, - "343": { - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1" - ] - }, - "345": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0" - ] - }, - "346": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0", - "0x151f7c75" - ] - }, - "347": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ] - }, - "348": { - "op": "concat", - "defined_out": [ - "tmp%6#0" - ], - "stack_out": [ - "tmp%6#0" - ] - }, - "349": { - "op": "log", - "stack_out": [] - }, - "350": { - "op": "intc_0 // 1", - "stack_out": [ - "1" - ] - }, - "351": { - "op": "return", - "stack_out": [] - }, - "352": { - "subroutine": "modules.accounting.AccountingModule.account_open[routing]", - "params": {}, - "block": "account_open", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "holding_address#0" - ], - "stack_out": [ - "holding_address#0" - ] - }, - "355": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ] - }, - "356": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0" - ] - }, - "357": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0", - "32" - ] - }, - "358": { - "op": "==", - "defined_out": [ - "eq%0#0", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "eq%0#0" - ] - }, - "359": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "holding_address#0" - ] - }, - "360": { - "op": "txna ApplicationArgs 2", - "defined_out": [ - "holding_address#0", - "payment_address#0" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0" - ] - }, - "363": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "payment_address#0", - "payment_address#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "payment_address#0 (copy)" - ] - }, - "364": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%1#0", - "payment_address#0" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "len%1#0" - ] - }, - "365": { - "op": "intc_2 // 32", - "stack_out": [ - "holding_address#0", - "payment_address#0", - "len%1#0", - "32" - ] - }, - "366": { - "op": "==", - "defined_out": [ - "eq%1#0", - "holding_address#0", - "payment_address#0" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "eq%1#0" - ] - }, - "367": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "holding_address#0", - "payment_address#0" - ] - }, - "368": { - "op": "bytec_3 // 0x52343023", - "defined_out": [ - "0x52343023", - "holding_address#0", - "payment_address#0" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "0x52343023" - ] - }, - "369": { - "op": "txn Sender", - "defined_out": [ - "0x52343023", - "holding_address#0", - "payment_address#0", - "tmp%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "0x52343023", - "tmp%0#3" - ] - }, - "371": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "holding_address#0", - "payment_address#0", - "tmp%1#1" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "tmp%1#1" - ] - }, - "374": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "holding_address#0", - "payment_address#0" - ] - }, - "375": { - "op": "intc_1 // 0", - "defined_out": [ - "0", - "holding_address#0", - "payment_address#0" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "0" - ] - }, - "376": { - "op": "bytec 10 // \"status\"", - "defined_out": [ - "\"status\"", - "0", - "holding_address#0", - "payment_address#0" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "0", - "\"status\"" - ] - }, - "378": { - "op": "app_global_get_ex", - "defined_out": [ - "holding_address#0", - "maybe_exists%0#0", - "maybe_value%0#0", - "payment_address#0" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "379": { - "error": "check self.status exists", - "op": "assert // check self.status exists", - "stack_out": [ - "holding_address#0", - "payment_address#0", - "maybe_value%0#0" - ] - }, - "380": { - "op": "pushint 200", - "defined_out": [ - "200", - "holding_address#0", - "maybe_value%0#0", - "payment_address#0" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "maybe_value%0#0", - "200" - ] - }, - "383": { - "op": "==", - "defined_out": [ - "holding_address#0", - "payment_address#0", - "tmp%0#2" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "tmp%0#2" - ] - }, - "384": { - "op": "!", - "stack_out": [ - "holding_address#0", - "payment_address#0", - "tmp%1#1" - ] - }, - "385": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "holding_address#0", - "payment_address#0" - ] - }, - "386": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "op": "callsub assert_is_not_asset_defaulted" - }, - "389": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_suspended", - "op": "callsub assert_is_not_asset_suspended" - }, - "392": { - "op": "bytec 4 // 0x52333023", - "defined_out": [ - "0x52333023", - "holding_address#0", - "payment_address#0" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "0x52333023" - ] - }, - "394": { - "op": "uncover 2", - "stack_out": [ - "payment_address#0", - "0x52333023", - "holding_address#0" - ] - }, - "396": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#0", - "payment_address#0" - ], - "stack_out": [ - "payment_address#0", - "box_prefixed_key%0#0" - ] - }, - "397": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#0", - "box_prefixed_key%0#0 (copy)", - "payment_address#0" - ], - "stack_out": [ - "payment_address#0", - "box_prefixed_key%0#0", - "box_prefixed_key%0#0 (copy)" - ] - }, - "398": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#0", - "maybe_exists%0#0", - "payment_address#0" - ], - "stack_out": [ - "payment_address#0", - "box_prefixed_key%0#0", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "399": { - "op": "bury 1", - "stack_out": [ - "payment_address#0", - "box_prefixed_key%0#0", - "maybe_exists%0#0" - ] - }, - "401": { - "op": "!", - "defined_out": [ - "box_prefixed_key%0#0", - "payment_address#0", - "tmp%2#1" - ], - "stack_out": [ - "payment_address#0", - "box_prefixed_key%0#0", - "tmp%2#1" - ] - }, - "402": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "payment_address#0", - "box_prefixed_key%0#0" - ] - }, - "403": { - "op": "intc_1 // 0", - "stack_out": [ - "payment_address#0", - "box_prefixed_key%0#0", - "0" - ] - }, - "404": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#0", - "payment_address#0" - ], - "stack_out": [ - "payment_address#0", - "box_prefixed_key%0#0", - "aggregate%val_as_bytes%0#0" - ] - }, - "405": { - "op": "uncover 2", - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%val_as_bytes%0#0", - "payment_address#0" - ] - }, - "407": { - "op": "dig 1", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%0#0 (copy)", - "box_prefixed_key%0#0", - "payment_address#0" - ], - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%val_as_bytes%0#0", - "payment_address#0", - "aggregate%val_as_bytes%0#0 (copy)" - ] - }, - "409": { - "op": "concat", - "defined_out": [ - "aggregate%head%1#0", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%val_as_bytes%0#0", - "aggregate%head%1#0" - ] - }, - "410": { - "op": "dig 1", - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%val_as_bytes%0#0", - "aggregate%head%1#0", - "aggregate%val_as_bytes%0#0 (copy)" - ] - }, - "412": { - "op": "concat", - "defined_out": [ - "aggregate%head%2#0", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%val_as_bytes%0#0", - "aggregate%head%2#0" - ] - }, - "413": { - "op": "swap", - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%head%2#0", - "aggregate%val_as_bytes%0#0" - ] - }, - "414": { - "op": "concat", - "defined_out": [ - "aggregate%head%3#0", - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%head%3#0" - ] - }, - "415": { - "op": "pushbytes 0x00", - "defined_out": [ - "0x00", - "aggregate%head%3#0", - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%head%3#0", - "0x00" - ] - }, - "418": { - "op": "concat", - "defined_out": [ - "aggregate%head%4#0", - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%head%4#0" - ] - }, - "419": { - "op": "box_put", - "stack_out": [] - }, - "420": { - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%4#1" - ], - "stack_out": [ - "tmp%4#1" - ] - }, - "422": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%3#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%3#0" - ] - }, - "423": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%3#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%3#0", - "0x151f7c75" - ] - }, - "424": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%3#0" - ] - }, - "425": { - "op": "concat", - "defined_out": [ - "tmp%6#0" - ], - "stack_out": [ - "tmp%6#0" - ] - }, - "426": { - "op": "log", - "stack_out": [] - }, - "427": { - "op": "intc_0 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "428": { - "op": "return", - "stack_out": [] - }, - "429": { - "subroutine": "modules.accounting.AccountingModule.account_close[routing]", - "params": {}, - "block": "account_close", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "holding_address#0" - ], - "stack_out": [ - "holding_address#0" - ] - }, - "432": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ] - }, - "433": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0" - ] - }, - "434": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0", - "32" - ] - }, - "435": { - "op": "==", - "defined_out": [ - "eq%0#0", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "eq%0#0" - ] - }, - "436": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "holding_address#0" - ] - }, - "437": { - "op": "bytec_3 // 0x52343023", - "defined_out": [ - "0x52343023", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "0x52343023" - ] - }, - "438": { - "op": "txn Sender", - "defined_out": [ - "0x52343023", - "holding_address#0", - "tmp%0#2" - ], - "stack_out": [ - "holding_address#0", - "0x52343023", - "tmp%0#2" - ] - }, - "440": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "holding_address#0", - "tmp%1#2" - ], - "stack_out": [ - "holding_address#0", - "tmp%1#2" - ] - }, - "443": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "holding_address#0" - ] - }, - "444": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "op": "callsub assert_is_not_asset_defaulted" - }, - "447": { - "op": "bytec 4 // 0x52333023", - "defined_out": [ - "0x52333023", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "0x52333023" - ] - }, - "449": { - "op": "swap", - "stack_out": [ - "0x52333023", - "holding_address#0" - ] - }, - "450": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1" - ], - "stack_out": [ - "box_prefixed_key%0#1" - ] - }, - "451": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "452": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "453": { - "op": "bury 1", - "stack_out": [ - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "455": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "box_prefixed_key%0#1" - ] - }, - "456": { - "op": "dup", - "stack_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "457": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0", - "box_prefixed_key%0#1" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "458": { - "op": "pop", - "stack_out": [ - "box_prefixed_key%0#1", - "aggregate%box_get%0#0" - ] - }, - "459": { - "op": "intc_2 // 32", - "stack_out": [ - "box_prefixed_key%0#1", - "aggregate%box_get%0#0", - "32" - ] - }, - "460": { - "op": "extract_uint64", - "defined_out": [ - "box_prefixed_key%0#1", - "closed_units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "closed_units#0" - ] - }, - "461": { - "op": "dup", - "stack_out": [ - "box_prefixed_key%0#1", - "closed_units#0", - "closed_units#0 (copy)" - ] - }, - "462": { - "op": "uncover 2", - "defined_out": [ - "box_prefixed_key%0#1", - "closed_units#0" - ], - "stack_out": [ - "closed_units#0", - "closed_units#0", - "box_prefixed_key%0#1" - ] - }, - "464": { - "op": "box_del", - "defined_out": [ - "closed_units#0", - "{box_del}" - ], - "stack_out": [ - "closed_units#0", - "closed_units#0", - "{box_del}" - ] - }, - "465": { - "op": "pop", - "stack_out": [ - "closed_units#0", - "closed_units#0" - ] - }, - "466": { - "op": "intc_1 // 0", - "stack_out": [ - "closed_units#0", - "closed_units#0", - "0" - ] - }, - "467": { - "op": "bytec 9 // \"circulating_units\"", - "defined_out": [ - "\"circulating_units\"", - "0", - "closed_units#0" - ], - "stack_out": [ - "closed_units#0", - "closed_units#0", - "0", - "\"circulating_units\"" - ] - }, - "469": { - "op": "app_global_get_ex", - "defined_out": [ - "closed_units#0", - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "closed_units#0", - "closed_units#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "470": { - "error": "check self.circulating_units exists", - "op": "assert // check self.circulating_units exists", - "stack_out": [ - "closed_units#0", - "closed_units#0", - "maybe_value%0#0" - ] - }, - "471": { - "op": "swap", - "stack_out": [ - "closed_units#0", - "maybe_value%0#0", - "closed_units#0" - ] - }, - "472": { - "op": "-", - "defined_out": [ - "closed_units#0", - "tmp%0#1" - ], - "stack_out": [ - "closed_units#0", - "tmp%0#1" - ] - }, - "473": { - "op": "bytec 9 // \"circulating_units\"", - "stack_out": [ - "closed_units#0", - "tmp%0#1", - "\"circulating_units\"" - ] - }, - "475": { - "op": "dig 1", - "defined_out": [ - "\"circulating_units\"", - "closed_units#0", - "tmp%0#1", - "tmp%0#1 (copy)" - ], - "stack_out": [ - "closed_units#0", - "tmp%0#1", - "\"circulating_units\"", - "tmp%0#1 (copy)" - ] - }, - "477": { - "op": "app_global_put", - "stack_out": [ - "closed_units#0", - "tmp%0#1" - ] - }, - "478": { - "op": "bnz account_close_after_if_else@3", - "stack_out": [ - "closed_units#0" - ] - }, - "481": { - "op": "bytec 10 // \"status\"", - "defined_out": [ - "\"status\"", - "closed_units#0" - ], - "stack_out": [ - "closed_units#0", - "\"status\"" - ] - }, - "483": { - "op": "pushint 200", - "defined_out": [ - "\"status\"", - "200", - "closed_units#0" - ], - "stack_out": [ - "closed_units#0", - "\"status\"", - "200" - ] - }, - "486": { - "op": "app_global_put", - "stack_out": [ - "closed_units#0" - ] - }, - "487": { - "block": "account_close_after_if_else@3", - "stack_in": [ - "closed_units#0" - ], - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%1#1" - ], - "stack_out": [ - "closed_units#0", - "tmp%1#1" - ] - }, - "489": { - "op": "dig 1", - "defined_out": [ - "closed_units#0", - "tmp%1#1" - ], - "stack_out": [ - "closed_units#0", - "tmp%1#1", - "closed_units#0" - ] - }, - "491": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "closed_units#0", - "tmp%1#1" - ], - "stack_out": [ - "closed_units#0", - "tmp%1#1", - "aggregate%val_as_bytes%0#0" - ] - }, - "492": { - "op": "swap", - "stack_out": [ - "closed_units#0", - "aggregate%val_as_bytes%0#0", - "tmp%1#1" - ] - }, - "493": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0", - "closed_units#0" - ], - "stack_out": [ - "closed_units#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0" - ] - }, - "494": { - "op": "concat", - "defined_out": [ - "aggregate%head%1#0", - "closed_units#0" - ], - "stack_out": [ - "closed_units#0", - "aggregate%head%1#0" - ] - }, - "495": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%head%1#0", - "closed_units#0" - ], - "stack_out": [ - "closed_units#0", - "aggregate%head%1#0", - "0x151f7c75" - ] - }, - "496": { - "op": "swap", - "stack_out": [ - "closed_units#0", - "0x151f7c75", - "aggregate%head%1#0" - ] - }, - "497": { - "op": "concat", - "defined_out": [ - "closed_units#0", - "tmp%5#0" - ], - "stack_out": [ - "closed_units#0", - "tmp%5#0" - ] - }, - "498": { - "op": "log", - "stack_out": [ - "closed_units#0" - ] - }, - "499": { - "op": "intc_0 // 1", - "defined_out": [ - "1", - "closed_units#0" - ], - "stack_out": [ - "closed_units#0", - "1" - ] - }, - "500": { - "op": "return", - "stack_out": [ - "closed_units#0" - ] - }, - "501": { - "subroutine": "modules.accounting.AccountingModule.account_update_payment_address[routing]", - "params": {}, - "block": "account_update_payment_address", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "holding_address#0" - ], - "stack_out": [ - "holding_address#0" - ] - }, - "504": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ] - }, - "505": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0" - ] - }, - "506": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0", - "32" - ] - }, - "507": { - "op": "==", - "defined_out": [ - "eq%0#0", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "eq%0#0" - ] - }, - "508": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "holding_address#0" - ] - }, - "509": { - "op": "txna ApplicationArgs 2", - "defined_out": [ - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0" - ] - }, - "512": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ] - }, - "513": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%1#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "len%1#0" - ] - }, - "514": { - "op": "intc_2 // 32", - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "len%1#0", - "32" - ] - }, - "515": { - "op": "==", - "defined_out": [ - "eq%1#0", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "eq%1#0" - ] - }, - "516": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "holding_address#0", - "tmp%2#0" - ] - }, - "517": { - "op": "txn Sender", - "defined_out": [ - "holding_address#0", - "tmp%0#1", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%0#1" - ] - }, - "519": { - "op": "dig 2", - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%0#1", - "holding_address#0 (copy)" - ] - }, - "521": { - "op": "==", - "defined_out": [ - "holding_address#0", - "tmp%1#1", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%1#1" - ] - }, - "522": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "holding_address#0", - "tmp%2#0" - ] - }, - "523": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "op": "callsub assert_is_not_asset_defaulted" - }, - "526": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_suspended", - "op": "callsub assert_is_not_asset_suspended" - }, - "529": { - "op": "bytec 4 // 0x52333023", - "defined_out": [ - "0x52333023", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "0x52333023" - ] - }, - "531": { - "op": "uncover 2", - "stack_out": [ - "tmp%2#0", - "0x52333023", - "holding_address#0" - ] - }, - "533": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0", - "box_prefixed_key%0#1" - ] - }, - "534": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "535": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0", - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "536": { - "op": "bury 1", - "stack_out": [ - "tmp%2#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "538": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "tmp%2#0", - "box_prefixed_key%0#1" - ] - }, - "539": { - "op": "intc_1 // 0", - "defined_out": [ - "0", - "box_prefixed_key%0#1", - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0", - "box_prefixed_key%0#1", - "0" - ] - }, - "540": { - "op": "uncover 2", - "stack_out": [ - "box_prefixed_key%0#1", - "0", - "tmp%2#0" - ] - }, - "542": { - "op": "box_replace", - "stack_out": [] - }, - "543": { - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%2#1" - ], - "stack_out": [ - "tmp%2#1" - ] - }, - "545": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0" - ] - }, - "546": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0", - "0x151f7c75" - ] - }, - "547": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ] - }, - "548": { - "op": "concat", - "defined_out": [ - "tmp%6#0" - ], - "stack_out": [ - "tmp%6#0" - ] - }, - "549": { - "op": "log", - "stack_out": [] - }, - "550": { - "op": "intc_0 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "551": { - "op": "return", - "stack_out": [] - }, - "552": { - "subroutine": "modules.accounting.AccountingModule.account_get_info[routing]", - "params": {}, - "block": "account_get_info", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "holding_address#0" - ], - "stack_out": [ - "holding_address#0" - ] - }, - "555": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ] - }, - "556": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0" - ] - }, - "557": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0", - "32" - ] - }, - "558": { - "op": "==", - "defined_out": [ - "eq%0#0", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "eq%0#0" - ] - }, - "559": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "holding_address#0" - ] - }, - "560": { - "op": "bytec 4 // 0x52333023", - "defined_out": [ - "0x52333023", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "0x52333023" - ] - }, - "562": { - "op": "swap", - "stack_out": [ - "0x52333023", - "holding_address#0" - ] - }, - "563": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1" - ], - "stack_out": [ - "box_prefixed_key%0#1" - ] - }, - "564": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "565": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "566": { - "op": "bury 1", - "stack_out": [ - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "568": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "box_prefixed_key%0#1" - ] - }, - "569": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ], - "stack_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "570": { - "op": "pop", - "stack_out": [ - "aggregate%box_get%0#0" - ] - }, - "571": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%box_get%0#0" - ], - "stack_out": [ - "aggregate%box_get%0#0", - "0x151f7c75" - ] - }, - "572": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%box_get%0#0" - ] - }, - "573": { - "op": "concat", - "defined_out": [ - "tmp%3#0" - ], - "stack_out": [ - "tmp%3#0" - ] - }, - "574": { - "op": "log", - "stack_out": [] - }, - "575": { - "op": "intc_0 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "576": { - "op": "return", - "stack_out": [] - }, - "577": { - "subroutine": "modules.rbac.RbacModule.rbac_rotate_arranger[routing]", - "params": {}, - "block": "rbac_rotate_arranger", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "new_arranger#0" - ], - "stack_out": [ - "new_arranger#0" - ] - }, - "580": { - "op": "dup", - "defined_out": [ - "new_arranger#0", - "new_arranger#0 (copy)" - ], - "stack_out": [ - "new_arranger#0", - "new_arranger#0 (copy)" - ] - }, - "581": { - "op": "len", - "defined_out": [ - "len%0#0", - "new_arranger#0" - ], - "stack_out": [ - "new_arranger#0", - "len%0#0" - ] - }, - "582": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "len%0#0", - "new_arranger#0" - ], - "stack_out": [ - "new_arranger#0", - "len%0#0", - "32" - ] - }, - "583": { - "op": "==", - "defined_out": [ - "eq%0#0", - "new_arranger#0" - ], - "stack_out": [ - "new_arranger#0", - "eq%0#0" - ] - }, - "584": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "new_arranger#0" - ] - }, - "585": { - "callsub": "modules.rbac.RbacModule.assert_caller_is_arranger", - "op": "callsub assert_caller_is_arranger" - }, - "588": { - "op": "bytec_1 // 0x52323023", - "defined_out": [ - "0x52323023", - "new_arranger#0" - ], - "stack_out": [ - "new_arranger#0", - "0x52323023" - ] - }, - "589": { - "op": "swap", - "stack_out": [ - "0x52323023", - "new_arranger#0" - ] - }, - "590": { - "op": "app_global_put", - "stack_out": [] - }, - "591": { - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1" - ] - }, - "593": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0" - ] - }, - "594": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0", - "0x151f7c75" - ] - }, - "595": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ] - }, - "596": { - "op": "concat", - "defined_out": [ - "tmp%4#0" - ], - "stack_out": [ - "tmp%4#0" - ] - }, - "597": { - "op": "log", - "stack_out": [] - }, - "598": { - "op": "intc_0 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "599": { - "op": "return", - "stack_out": [] - }, - "600": { - "subroutine": "modules.rbac.RbacModule.rbac_set_op_daemon[routing]", - "params": {}, - "block": "rbac_set_op_daemon", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "address#0" - ], - "stack_out": [ - "address#0" - ] - }, - "603": { - "op": "dup", - "defined_out": [ - "address#0", - "address#0 (copy)" - ], - "stack_out": [ - "address#0", - "address#0 (copy)" - ] - }, - "604": { - "op": "len", - "defined_out": [ - "address#0", - "len%0#0" - ], - "stack_out": [ - "address#0", - "len%0#0" - ] - }, - "605": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "address#0", - "len%0#0" - ], - "stack_out": [ - "address#0", - "len%0#0", - "32" - ] - }, - "606": { - "op": "==", - "defined_out": [ - "address#0", - "eq%0#0" - ], - "stack_out": [ - "address#0", - "eq%0#0" - ] - }, - "607": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "address#0" - ] - }, - "608": { - "callsub": "modules.rbac.RbacModule.assert_caller_is_arranger", - "op": "callsub assert_caller_is_arranger" - }, - "611": { - "op": "bytec 11 // 0x52323523", - "defined_out": [ - "0x52323523", - "address#0" - ], - "stack_out": [ - "address#0", - "0x52323523" - ] - }, - "613": { - "op": "swap", - "stack_out": [ - "0x52323523", - "address#0" - ] - }, - "614": { - "op": "app_global_put", - "stack_out": [] - }, - "615": { - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1" - ] - }, - "617": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0" - ] - }, - "618": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0", - "0x151f7c75" - ] - }, - "619": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ] - }, - "620": { - "op": "concat", - "defined_out": [ - "tmp%4#0" - ], - "stack_out": [ - "tmp%4#0" - ] - }, - "621": { - "op": "log", - "stack_out": [] - }, - "622": { - "op": "intc_0 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "623": { - "op": "return", - "stack_out": [] - }, - "624": { - "subroutine": "modules.rbac.RbacModule.rbac_assign_role[routing]", - "params": {}, - "block": "rbac_assign_role", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "role_id#0" - ], - "stack_out": [ - "role_id#0" - ] - }, - "627": { - "op": "dup", - "defined_out": [ - "role_id#0", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0", - "role_id#0 (copy)" - ] - }, - "628": { - "op": "len", - "defined_out": [ - "len%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "len%0#0" - ] - }, - "629": { - "op": "intc_0 // 1", - "defined_out": [ - "1", - "len%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "len%0#0", - "1" - ] - }, - "630": { - "op": "==", - "defined_out": [ - "eq%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "eq%0#0" - ] - }, - "631": { - "error": "invalid number of bytes for arc4.uint8", - "op": "assert // invalid number of bytes for arc4.uint8", - "stack_out": [ - "role_id#0" - ] - }, - "632": { - "op": "txna ApplicationArgs 2" - }, - "635": { - "op": "dup", - "defined_out": [ - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "role_address#0", - "role_address#0" - ] - }, - "636": { - "op": "cover 2", - "defined_out": [ - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "role_address#0" - ] - }, - "638": { - "op": "len", - "defined_out": [ - "len%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "len%1#0" - ] - }, - "639": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "len%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "len%1#0", - "32" - ] - }, - "640": { - "op": "==", - "defined_out": [ - "eq%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "eq%1#0" - ] - }, - "641": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "role_address#0", - "role_id#0" - ] - }, - "642": { - "op": "txna ApplicationArgs 3", - "defined_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0" - ] - }, - "645": { - "op": "dup", - "defined_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "tmp%3#0 (copy)" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "tmp%3#0 (copy)" - ] - }, - "646": { - "op": "intc_1 // 0", - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "tmp%3#0 (copy)", - "0" - ] - }, - "647": { - "error": "invalid array length header", - "op": "extract_uint16 // on error: invalid array length header", - "defined_out": [ - "aggregate%array_length%0#0", - "role_address#0", - "role_id#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "aggregate%array_length%0#0" - ] - }, - "648": { - "op": "pushint 2", - "defined_out": [ - "2", - "aggregate%array_length%0#0", - "role_address#0", - "role_id#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "aggregate%array_length%0#0", - "2" - ] - }, - "650": { - "op": "+", - "defined_out": [ - "add%0#0", - "role_address#0", - "role_id#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "add%0#0" - ] - }, - "651": { - "op": "dig 1", - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "add%0#0", - "tmp%3#0 (copy)" - ] - }, - "653": { - "op": "len", - "defined_out": [ - "add%0#0", - "len%2#0", - "role_address#0", - "role_id#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "add%0#0", - "len%2#0" - ] - }, - "654": { - "op": "==", - "defined_out": [ - "eq%2#0", - "role_address#0", - "role_id#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "eq%2#0" - ] - }, - "655": { - "error": "invalid number of bytes for arc4.dynamic_array", - "op": "assert // invalid number of bytes for arc4.dynamic_array", - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0" - ] - }, - "656": { - "op": "extract 2 0", - "defined_out": [ - "config#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "config#0" - ] - }, - "659": { - "op": "swap", - "defined_out": [ - "config#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#0" - ] - }, - "660": { - "callsub": "modules.rbac.RbacModule.assert_caller_is_arranger", - "op": "callsub assert_caller_is_arranger" - }, - "663": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "op": "callsub assert_is_not_asset_defaulted" - }, - "666": { - "op": "btoi", - "defined_out": [ - "config#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "667": { - "op": "dupn 2", - "defined_out": [ - "config#0", - "role_address#0", - "role_id#1", - "role_id#1 (copy)" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1", - "role_id#1 (copy)" - ] - }, - "669": { - "callsub": "modules.rbac.RbacModule._assert_valid_role", - "op": "callsub _assert_valid_role", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1" - ] - }, - "672": { - "op": "intc_3 // 20", - "defined_out": [ - "20", - "config#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1", - "20" - ] - }, - "673": { - "op": "==", - "defined_out": [ - "config#0", - "role_address#0", - "role_id#1", - "tmp%0#2" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "tmp%0#2" - ] - }, - "674": { - "op": "bz rbac_assign_role_after_if_else@3", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "677": { - "op": "bytec_1 // 0x52323023", - "defined_out": [ - "0x52323023", - "config#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52323023" - ] - }, - "678": { - "op": "dig 3", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52323023", - "role_address#0" - ] - }, - "680": { - "op": "app_global_put", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "681": { - "block": "rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14", - "stack_in": [ - "role_address#0", - "config#0", - "role_id#1" - ], - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%2#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "tmp%2#1" - ] - }, - "683": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "aggregate%val_as_bytes%0#0" - ] - }, - "684": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "aggregate%val_as_bytes%0#0", - "0x151f7c75" - ] - }, - "685": { - "op": "swap", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ] - }, - "686": { - "op": "concat", - "defined_out": [ - "tmp%7#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "tmp%7#0" - ] - }, - "687": { - "op": "log", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "688": { - "op": "intc_0 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "1" - ] - }, - "689": { - "op": "return", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "690": { - "block": "rbac_assign_role_after_if_else@3", - "stack_in": [ - "role_address#0", - "config#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1" - ] - }, - "691": { - "op": "pushint 40", - "defined_out": [ - "40", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1", - "40" - ] - }, - "693": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%1#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "tmp%1#1" - ] - }, - "694": { - "op": "bz rbac_assign_role_after_if_else@5", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "697": { - "op": "bytec_3 // 0x52343023", - "defined_out": [ - "0x52343023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52343023" - ] - }, - "698": { - "op": "dig 3", - "defined_out": [ - "0x52343023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52343023", - "role_address#0" - ] - }, - "700": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%0#0" - ] - }, - "701": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#0", - "box_prefixed_key%0#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%0#0", - "box_prefixed_key%0#0 (copy)" - ] - }, - "702": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#0", - "maybe_exists%0#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%0#0", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "703": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%0#0", - "maybe_exists%0#0" - ] - }, - "705": { - "op": "!", - "defined_out": [ - "box_prefixed_key%0#0", - "role_address#0", - "role_id#1", - "tmp%2#2" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%0#0", - "tmp%2#2" - ] - }, - "706": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%0#0" - ] - }, - "707": { - "op": "dig 2", - "defined_out": [ - "box_prefixed_key%0#0", - "config#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%0#0", - "config#0" - ] - }, - "709": { - "op": "box_put", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "710": { - "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14" - }, - "713": { - "block": "rbac_assign_role_after_if_else@5", - "stack_in": [ - "role_address#0", - "config#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1" - ] - }, - "714": { - "op": "pushint 50", - "defined_out": [ - "50", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1", - "50" - ] - }, - "716": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%3#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "tmp%3#1" - ] - }, - "717": { - "op": "bz rbac_assign_role_after_if_else@7", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "720": { - "op": "bytec 5 // 0x52353023", - "defined_out": [ - "0x52353023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52353023" - ] - }, - "722": { - "op": "dig 3", - "defined_out": [ - "0x52353023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52353023", - "role_address#0" - ] - }, - "724": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%2#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%2#0" - ] - }, - "725": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%2#0", - "box_prefixed_key%2#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%2#0", - "box_prefixed_key%2#0 (copy)" - ] - }, - "726": { - "op": "box_len", - "defined_out": [ - "_%1#0", - "box_prefixed_key%2#0", - "maybe_exists%1#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%2#0", - "_%1#0", - "maybe_exists%1#0" - ] - }, - "727": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%2#0", - "maybe_exists%1#0" - ] - }, - "729": { - "op": "!", - "defined_out": [ - "box_prefixed_key%2#0", - "role_address#0", - "role_id#1", - "tmp%4#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%2#0", - "tmp%4#0" - ] - }, - "730": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%2#0" - ] - }, - "731": { - "op": "dig 2", - "defined_out": [ - "box_prefixed_key%2#0", - "config#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%2#0", - "config#0" - ] - }, - "733": { - "op": "box_put", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "734": { - "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14" - }, - "737": { - "block": "rbac_assign_role_after_if_else@7", - "stack_in": [ - "role_address#0", - "config#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1" - ] - }, - "738": { - "op": "pushint 60", - "defined_out": [ - "60", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1", - "60" - ] - }, - "740": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%5#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "tmp%5#0" - ] - }, - "741": { - "op": "bz rbac_assign_role_after_if_else@9", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "744": { - "op": "bytec 6 // 0x52363023", - "defined_out": [ - "0x52363023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52363023" - ] - }, - "746": { - "op": "dig 3", - "defined_out": [ - "0x52363023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52363023", - "role_address#0" - ] - }, - "748": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%4#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%4#0" - ] - }, - "749": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%4#0", - "box_prefixed_key%4#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%4#0", - "box_prefixed_key%4#0 (copy)" - ] - }, - "750": { - "op": "box_len", - "defined_out": [ - "_%2#0", - "box_prefixed_key%4#0", - "maybe_exists%2#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%4#0", - "_%2#0", - "maybe_exists%2#0" - ] - }, - "751": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%4#0", - "maybe_exists%2#0" - ] - }, - "753": { - "op": "!", - "defined_out": [ - "box_prefixed_key%4#0", - "role_address#0", - "role_id#1", - "tmp%6#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%4#0", - "tmp%6#1" - ] - }, - "754": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%4#0" - ] - }, - "755": { - "op": "dig 2", - "defined_out": [ - "box_prefixed_key%4#0", - "config#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%4#0", - "config#0" - ] - }, - "757": { - "op": "box_put", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "758": { - "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14" - }, - "761": { - "block": "rbac_assign_role_after_if_else@9", - "stack_in": [ - "role_address#0", - "config#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1" - ] - }, - "762": { - "op": "pushint 70", - "defined_out": [ - "70", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1", - "70" - ] - }, - "764": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%7#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "tmp%7#1" - ] - }, - "765": { - "op": "bz rbac_assign_role_after_if_else@11", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "768": { - "op": "bytec_2 // 0x52373023", - "defined_out": [ - "0x52373023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52373023" - ] - }, - "769": { - "op": "dig 3", - "defined_out": [ - "0x52373023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52373023", - "role_address#0" - ] - }, - "771": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%6#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%6#0" - ] - }, - "772": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%6#0", - "box_prefixed_key%6#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%6#0", - "box_prefixed_key%6#0 (copy)" - ] - }, - "773": { - "op": "box_len", - "defined_out": [ - "_%3#0", - "box_prefixed_key%6#0", - "maybe_exists%3#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%6#0", - "_%3#0", - "maybe_exists%3#0" - ] - }, - "774": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%6#0", - "maybe_exists%3#0" - ] - }, - "776": { - "op": "!", - "defined_out": [ - "box_prefixed_key%6#0", - "role_address#0", - "role_id#1", - "tmp%8#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%6#0", - "tmp%8#0" - ] - }, - "777": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%6#0" - ] - }, - "778": { - "op": "dig 2", - "defined_out": [ - "box_prefixed_key%6#0", - "config#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%6#0", - "config#0" - ] - }, - "780": { - "op": "box_put", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "781": { - "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14" - }, - "784": { - "block": "rbac_assign_role_after_if_else@11", - "stack_in": [ - "role_address#0", - "config#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1" - ] - }, - "785": { - "op": "pushint 80", - "defined_out": [ - "80", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1", - "80" - ] - }, - "787": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%9#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "tmp%9#0" - ] - }, - "788": { - "op": "bz rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "791": { - "op": "bytec 7 // 0x52383023", - "defined_out": [ - "0x52383023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52383023" - ] - }, - "793": { - "op": "dig 3", - "defined_out": [ - "0x52383023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52383023", - "role_address#0" - ] - }, - "795": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%8#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%8#0" - ] - }, - "796": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%8#0", - "box_prefixed_key%8#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%8#0", - "box_prefixed_key%8#0 (copy)" - ] - }, - "797": { - "op": "box_len", - "defined_out": [ - "_%4#0", - "box_prefixed_key%8#0", - "maybe_exists%4#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%8#0", - "_%4#0", - "maybe_exists%4#0" - ] - }, - "798": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%8#0", - "maybe_exists%4#0" - ] - }, - "800": { - "op": "!", - "defined_out": [ - "box_prefixed_key%8#0", - "role_address#0", - "role_id#1", - "tmp%10#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%8#0", - "tmp%10#0" - ] - }, - "801": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%8#0" - ] - }, - "802": { - "op": "dig 2", - "defined_out": [ - "box_prefixed_key%8#0", - "config#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%8#0", - "config#0" - ] - }, - "804": { - "op": "box_put", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "805": { - "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14" - }, - "808": { - "subroutine": "modules.rbac.RbacModule.rbac_revoke_role[routing]", - "params": {}, - "block": "rbac_revoke_role", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "role_id#0" - ], - "stack_out": [ - "role_id#0" - ] - }, - "811": { - "op": "dup", - "defined_out": [ - "role_id#0", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0", - "role_id#0 (copy)" - ] - }, - "812": { - "op": "len", - "defined_out": [ - "len%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "len%0#0" - ] - }, - "813": { - "op": "intc_0 // 1", - "defined_out": [ - "1", - "len%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "len%0#0", - "1" - ] - }, - "814": { - "op": "==", - "defined_out": [ - "eq%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "eq%0#0" - ] - }, - "815": { - "error": "invalid number of bytes for arc4.uint8", - "op": "assert // invalid number of bytes for arc4.uint8", - "stack_out": [ - "role_id#0" - ] - }, - "816": { - "op": "txna ApplicationArgs 2" - }, - "819": { - "op": "dup", - "defined_out": [ - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "role_address#0", - "role_address#0" - ] - }, - "820": { - "op": "cover 2", - "defined_out": [ - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "role_address#0" - ] - }, - "822": { - "op": "len", - "defined_out": [ - "len%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "len%1#0" - ] - }, - "823": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "len%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "len%1#0", - "32" - ] - }, - "824": { - "op": "==", - "defined_out": [ - "eq%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "eq%1#0" - ] - }, - "825": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "role_address#0", - "role_id#0" - ] - }, - "826": { - "callsub": "modules.rbac.RbacModule.assert_caller_is_arranger", - "op": "callsub assert_caller_is_arranger" - }, - "829": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "op": "callsub assert_is_not_asset_defaulted" - }, - "832": { - "op": "btoi", - "defined_out": [ - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "833": { - "op": "dupn 2", - "defined_out": [ - "role_address#0", - "role_id#1", - "role_id#1 (copy)" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "role_id#1 (copy)" - ] - }, - "835": { - "callsub": "modules.rbac.RbacModule._assert_valid_role", - "op": "callsub _assert_valid_role", - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1" - ] - }, - "838": { - "op": "dup", - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "role_id#1 (copy)" - ] - }, - "839": { - "op": "intc_3 // 20", - "defined_out": [ - "20", - "role_address#0", - "role_id#1", - "role_id#1 (copy)" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "role_id#1 (copy)", - "20" - ] - }, - "840": { - "op": "!=", - "defined_out": [ - "role_address#0", - "role_id#1", - "tmp%0#2" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "tmp%0#2" - ] - }, - "841": { - "error": "Invalid role identifier", - "op": "assert // Invalid role identifier", - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1" - ] - }, - "842": { - "op": "pushint 40", - "defined_out": [ - "40", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "40" - ] - }, - "844": { - "op": "==", - "defined_out": [ - "role_address#0", - "role_id#1", - "tmp%1#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "tmp%1#1" - ] - }, - "845": { - "op": "bz rbac_revoke_role_after_if_else@3", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "848": { - "op": "bytec_3 // 0x52343023", - "defined_out": [ - "0x52343023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52343023" - ] - }, - "849": { - "op": "dig 2", - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52343023", - "role_address#0" - ] - }, - "851": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%0#0" - ] - }, - "852": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#0", - "box_prefixed_key%0#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%0#0", - "box_prefixed_key%0#0 (copy)" - ] - }, - "853": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#0", - "maybe_exists%0#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%0#0", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "854": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%0#0", - "maybe_exists%0#0" - ] - }, - "856": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%0#0" - ] - }, - "857": { - "op": "box_del", - "defined_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ] - }, - "858": { - "op": "pop", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "859": { - "block": "rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12", - "stack_in": [ - "role_address#0", - "role_id#1" - ], - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%2#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "tmp%2#1" - ] - }, - "861": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "aggregate%val_as_bytes%0#0" - ] - }, - "862": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "aggregate%val_as_bytes%0#0", - "0x151f7c75" - ] - }, - "863": { - "op": "swap", - "stack_out": [ - "role_address#0", - "role_id#1", - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ] - }, - "864": { - "op": "concat", - "defined_out": [ - "tmp%5#0" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "tmp%5#0" - ] - }, - "865": { - "op": "log", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "866": { - "op": "intc_0 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "1" - ] - }, - "867": { - "op": "return", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "868": { - "block": "rbac_revoke_role_after_if_else@3", - "stack_in": [ - "role_address#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1" - ] - }, - "869": { - "op": "pushint 50", - "defined_out": [ - "50", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "50" - ] - }, - "871": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%2#2" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "tmp%2#2" - ] - }, - "872": { - "op": "bz rbac_revoke_role_after_if_else@5", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "875": { - "op": "bytec 5 // 0x52353023", - "defined_out": [ - "0x52353023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52353023" - ] - }, - "877": { - "op": "dig 2", - "defined_out": [ - "0x52353023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52353023", - "role_address#0" - ] - }, - "879": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%2#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%2#0" - ] - }, - "880": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%2#0", - "box_prefixed_key%2#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%2#0", - "box_prefixed_key%2#0 (copy)" - ] - }, - "881": { - "op": "box_len", - "defined_out": [ - "_%1#0", - "box_prefixed_key%2#0", - "maybe_exists%1#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%2#0", - "_%1#0", - "maybe_exists%1#0" - ] - }, - "882": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%2#0", - "maybe_exists%1#0" - ] - }, - "884": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%2#0" - ] - }, - "885": { - "op": "box_del", - "defined_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ] - }, - "886": { - "op": "pop", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "887": { - "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" - }, - "890": { - "block": "rbac_revoke_role_after_if_else@5", - "stack_in": [ - "role_address#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1" - ] - }, - "891": { - "op": "pushint 60", - "defined_out": [ - "60", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "60" - ] - }, - "893": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "tmp%3#0" - ] - }, - "894": { - "op": "bz rbac_revoke_role_after_if_else@7", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "897": { - "op": "bytec 6 // 0x52363023", - "defined_out": [ - "0x52363023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52363023" - ] - }, - "899": { - "op": "dig 2", - "defined_out": [ - "0x52363023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52363023", - "role_address#0" - ] - }, - "901": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%4#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%4#0" - ] - }, - "902": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%4#0", - "box_prefixed_key%4#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%4#0", - "box_prefixed_key%4#0 (copy)" - ] - }, - "903": { - "op": "box_len", - "defined_out": [ - "_%2#0", - "box_prefixed_key%4#0", - "maybe_exists%2#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%4#0", - "_%2#0", - "maybe_exists%2#0" - ] - }, - "904": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%4#0", - "maybe_exists%2#0" - ] - }, - "906": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%4#0" - ] - }, - "907": { - "op": "box_del", - "defined_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ] - }, - "908": { - "op": "pop", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "909": { - "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" - }, - "912": { - "block": "rbac_revoke_role_after_if_else@7", - "stack_in": [ - "role_address#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1" - ] - }, - "913": { - "op": "pushint 70", - "defined_out": [ - "70", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "70" - ] - }, - "915": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%4#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "tmp%4#1" - ] - }, - "916": { - "op": "bz rbac_revoke_role_after_if_else@9", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "919": { - "op": "bytec_2 // 0x52373023", - "defined_out": [ - "0x52373023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52373023" - ] - }, - "920": { - "op": "dig 2", - "defined_out": [ - "0x52373023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52373023", - "role_address#0" - ] - }, - "922": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%6#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%6#0" - ] - }, - "923": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%6#0", - "box_prefixed_key%6#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%6#0", - "box_prefixed_key%6#0 (copy)" - ] - }, - "924": { - "op": "box_len", - "defined_out": [ - "_%3#0", - "box_prefixed_key%6#0", - "maybe_exists%3#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%6#0", - "_%3#0", - "maybe_exists%3#0" - ] - }, - "925": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%6#0", - "maybe_exists%3#0" - ] - }, - "927": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%6#0" - ] - }, - "928": { - "op": "box_del", - "defined_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ] - }, - "929": { - "op": "pop", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "930": { - "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" - }, - "933": { - "block": "rbac_revoke_role_after_if_else@9", - "stack_in": [ - "role_address#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1" - ] - }, - "934": { - "op": "pushint 80", - "defined_out": [ - "80", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "80" - ] - }, - "936": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%5#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "tmp%5#1" - ] - }, - "937": { - "op": "bz rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "940": { - "op": "bytec 7 // 0x52383023", - "defined_out": [ - "0x52383023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52383023" - ] - }, - "942": { - "op": "dig 2", - "defined_out": [ - "0x52383023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52383023", - "role_address#0" - ] - }, - "944": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%8#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%8#0" - ] - }, - "945": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%8#0", - "box_prefixed_key%8#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%8#0", - "box_prefixed_key%8#0 (copy)" - ] - }, - "946": { - "op": "box_len", - "defined_out": [ - "_%4#0", - "box_prefixed_key%8#0", - "maybe_exists%4#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%8#0", - "_%4#0", - "maybe_exists%4#0" - ] - }, - "947": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%8#0", - "maybe_exists%4#0" - ] - }, - "949": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%8#0" - ] - }, - "950": { - "op": "box_del", - "defined_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ] - }, - "951": { - "op": "pop", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "952": { - "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" - }, - "955": { - "subroutine": "modules.rbac.RbacModule.rbac_gov_asset_suspension[routing]", - "params": {}, - "block": "rbac_gov_asset_suspension", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "958": { - "op": "dup", - "defined_out": [ - "tmp%0#0", - "tmp%0#0 (copy)" - ], - "stack_out": [ - "tmp%0#0", - "tmp%0#0 (copy)" - ] - }, - "959": { - "op": "len", - "defined_out": [ - "len%0#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "len%0#0" - ] - }, - "960": { - "op": "intc_0 // 1", - "defined_out": [ - "1", - "len%0#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "len%0#0", - "1" - ] - }, - "961": { - "op": "==", - "defined_out": [ - "eq%0#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "eq%0#0" - ] - }, - "962": { - "error": "invalid number of bytes for arc4.bool", - "op": "assert // invalid number of bytes for arc4.bool", - "stack_out": [ - "tmp%0#0" - ] - }, - "963": { - "op": "intc_1 // 0", - "defined_out": [ - "0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "0" - ] - }, - "964": { - "op": "getbit", - "defined_out": [ - "suspended#0" - ], - "stack_out": [ - "suspended#0" - ] - }, - "965": { - "op": "bytec_2 // 0x52373023", - "defined_out": [ - "0x52373023", - "suspended#0" - ], - "stack_out": [ - "suspended#0", - "0x52373023" - ] - }, - "966": { - "op": "txn Sender", - "defined_out": [ - "0x52373023", - "suspended#0", - "tmp%0#2" - ], - "stack_out": [ - "suspended#0", - "0x52373023", - "tmp%0#2" - ] - }, - "968": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "suspended#0", - "tmp%1#0" - ], - "stack_out": [ - "suspended#0", - "tmp%1#0" - ] - }, - "971": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "suspended#0" - ] - }, - "972": { - "op": "bytec 8 // \"asset_suspended\"", - "defined_out": [ - "\"asset_suspended\"", - "suspended#0" - ], - "stack_out": [ - "suspended#0", - "\"asset_suspended\"" - ] - }, - "974": { - "op": "swap", - "stack_out": [ - "\"asset_suspended\"", - "suspended#0" - ] - }, - "975": { - "op": "app_global_put", - "stack_out": [] - }, - "976": { - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1" - ] - }, - "978": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0" - ] - }, - "979": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0", - "0x151f7c75" - ] - }, - "980": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ] - }, - "981": { - "op": "concat", - "defined_out": [ - "tmp%4#0" - ], - "stack_out": [ - "tmp%4#0" - ] - }, - "982": { - "op": "log", - "stack_out": [] - }, - "983": { - "op": "intc_0 // 1", - "stack_out": [ - "1" - ] - }, - "984": { - "op": "return", - "stack_out": [] - }, - "985": { - "subroutine": "modules.rbac.RbacModule.rbac_get_arranger[routing]", - "params": {}, - "block": "rbac_get_arranger", - "stack_in": [], - "op": "intc_1 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "0" - ] - }, - "986": { - "op": "bytec_1 // 0x52323023", - "defined_out": [ - "0", - "0x52323023" - ], - "stack_out": [ - "0", - "0x52323023" - ] - }, - "987": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "988": { - "error": "check self.arranger exists", - "op": "assert // check self.arranger exists", - "stack_out": [ - "maybe_value%0#0" - ] - }, - "989": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "0x151f7c75" - ] - }, - "990": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "maybe_value%0#0" - ] - }, - "991": { - "op": "concat", - "defined_out": [ - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0" - ] - }, - "992": { - "op": "log", - "stack_out": [] - }, - "993": { - "op": "intc_0 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "994": { - "op": "return", - "stack_out": [] - }, - "995": { - "subroutine": "modules.rbac.RbacModule.rbac_get_address_roles[routing]", - "params": {}, - "block": "rbac_get_address_roles", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "address#0" - ], - "stack_out": [ - "address#0" - ] - }, - "998": { - "op": "dup", - "defined_out": [ - "address#0", - "address#0 (copy)" - ], - "stack_out": [ - "address#0", - "address#0 (copy)" - ] - }, - "999": { - "op": "len", - "defined_out": [ - "address#0", - "len%0#0" - ], - "stack_out": [ - "address#0", - "len%0#0" - ] - }, - "1000": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "address#0", - "len%0#0" - ], - "stack_out": [ - "address#0", - "len%0#0", - "32" - ] - }, - "1001": { - "op": "==", - "defined_out": [ - "address#0", - "eq%0#0" - ], - "stack_out": [ - "address#0", - "eq%0#0" - ] - }, - "1002": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "address#0" - ] - }, - "1003": { - "op": "bytec_3 // 0x52343023", - "defined_out": [ - "0x52343023", - "address#0" - ], - "stack_out": [ - "address#0", - "0x52343023" - ] - }, - "1004": { - "op": "dig 1", - "stack_out": [ - "address#0", - "0x52343023", - "address#0 (copy)" - ] - }, - "1006": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "address#0", - "tmp%0#1" - ], - "stack_out": [ - "address#0", - "tmp%0#1" - ] - }, - "1009": { - "op": "bytec 5 // 0x52353023", - "defined_out": [ - "0x52353023", - "address#0", - "tmp%0#1" - ], - "stack_out": [ - "address#0", - "tmp%0#1", - "0x52353023" - ] - }, - "1011": { - "op": "dig 2", - "stack_out": [ - "address#0", - "tmp%0#1", - "0x52353023", - "address#0 (copy)" - ] - }, - "1013": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1" - ], - "stack_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1" - ] - }, - "1016": { - "op": "bytec 6 // 0x52363023", - "defined_out": [ - "0x52363023", - "address#0", - "tmp%0#1", - "tmp%1#1" - ], - "stack_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "0x52363023" - ] - }, - "1018": { - "op": "dig 3", - "stack_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "0x52363023", - "address#0 (copy)" - ] - }, - "1020": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1" - ], - "stack_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1" - ] - }, - "1023": { - "op": "bytec_2 // 0x52373023", - "defined_out": [ - "0x52373023", - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1" - ], - "stack_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "0x52373023" - ] - }, - "1024": { - "op": "dig 4", - "stack_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "0x52373023", - "address#0 (copy)" - ] - }, - "1026": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1" - ], - "stack_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1" - ] - }, - "1029": { - "op": "bytec 7 // 0x52383023", - "defined_out": [ - "0x52383023", - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1" - ], - "stack_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "0x52383023" - ] - }, - "1031": { - "op": "uncover 5", - "stack_out": [ - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "0x52383023", - "address#0" - ] - }, - "1033": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1" - ] - }, - "1036": { - "op": "pushbytes 0x00", - "defined_out": [ - "0x00", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1", - "0x00" - ] - }, - "1039": { - "op": "intc_1 // 0", - "defined_out": [ - "0", - "0x00", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1", - "0x00", - "0" - ] - }, - "1040": { - "op": "uncover 6", - "stack_out": [ - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1", - "0x00", - "0", - "tmp%0#1" - ] - }, - "1042": { - "op": "setbit", - "defined_out": [ - "aggregate%encoded_bool%0#0", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1", - "aggregate%encoded_bool%0#0" - ] - }, - "1043": { - "op": "intc_0 // 1", - "defined_out": [ - "1", - "aggregate%encoded_bool%0#0", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1", - "aggregate%encoded_bool%0#0", - "1" - ] - }, - "1044": { - "op": "uncover 5", - "stack_out": [ - "tmp%2#1", - "tmp%3#1", - "tmp%4#1", - "aggregate%encoded_bool%0#0", - "1", - "tmp%1#1" - ] - }, - "1046": { - "op": "setbit", - "defined_out": [ - "aggregate%set_bit%0#0", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%2#1", - "tmp%3#1", - "tmp%4#1", - "aggregate%set_bit%0#0" - ] - }, - "1047": { - "op": "pushint 2", - "defined_out": [ - "2", - "aggregate%set_bit%0#0", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%2#1", - "tmp%3#1", - "tmp%4#1", - "aggregate%set_bit%0#0", - "2" - ] - }, - "1049": { - "op": "uncover 4", - "stack_out": [ - "tmp%3#1", - "tmp%4#1", - "aggregate%set_bit%0#0", - "2", - "tmp%2#1" - ] - }, - "1051": { - "op": "setbit", - "defined_out": [ - "aggregate%set_bit%1#0", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%3#1", - "tmp%4#1", - "aggregate%set_bit%1#0" - ] - }, - "1052": { - "op": "pushint 3", - "defined_out": [ - "3", - "aggregate%set_bit%1#0", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%3#1", - "tmp%4#1", - "aggregate%set_bit%1#0", - "3" - ] - }, - "1054": { - "op": "uncover 3", - "stack_out": [ - "tmp%4#1", - "aggregate%set_bit%1#0", - "3", - "tmp%3#1" - ] - }, - "1056": { - "op": "setbit", - "defined_out": [ - "aggregate%set_bit%2#0", - "tmp%4#1" - ], - "stack_out": [ - "tmp%4#1", - "aggregate%set_bit%2#0" - ] - }, - "1057": { - "op": "pushint 4", - "defined_out": [ - "4", - "aggregate%set_bit%2#0", - "tmp%4#1" - ], - "stack_out": [ - "tmp%4#1", - "aggregate%set_bit%2#0", - "4" - ] - }, - "1059": { - "op": "uncover 2", - "stack_out": [ - "aggregate%set_bit%2#0", - "4", - "tmp%4#1" - ] - }, - "1061": { - "op": "setbit", - "defined_out": [ - "aggregate%set_bit%3#0" - ], - "stack_out": [ - "aggregate%set_bit%3#0" - ] - }, - "1062": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%set_bit%3#0" - ], - "stack_out": [ - "aggregate%set_bit%3#0", - "0x151f7c75" - ] - }, - "1063": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%set_bit%3#0" - ] - }, - "1064": { - "op": "concat", - "defined_out": [ - "tmp%8#0" - ], - "stack_out": [ - "tmp%8#0" - ] - }, - "1065": { - "op": "log", - "stack_out": [] - }, - "1066": { - "op": "intc_0 // 1", - "stack_out": [ - "1" - ] - }, - "1067": { - "op": "return", - "stack_out": [] - }, - "1068": { - "subroutine": "modules.rbac.RbacModule.rbac_get_role_config[routing]", - "params": {}, - "block": "rbac_get_role_config", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "role_id#0" - ], - "stack_out": [ - "role_id#0" - ] - }, - "1071": { - "op": "dup", - "defined_out": [ - "role_id#0", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0", - "role_id#0 (copy)" - ] - }, - "1072": { - "op": "len", - "defined_out": [ - "len%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "len%0#0" - ] - }, - "1073": { - "op": "intc_0 // 1", - "defined_out": [ - "1", - "len%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "len%0#0", - "1" - ] - }, - "1074": { - "op": "==", - "defined_out": [ - "eq%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "eq%0#0" - ] - }, - "1075": { - "error": "invalid number of bytes for arc4.uint8", - "op": "assert // invalid number of bytes for arc4.uint8", - "stack_out": [ - "role_id#0" - ] - }, - "1076": { - "op": "txna ApplicationArgs 2" - }, - "1079": { - "op": "dup", - "defined_out": [ - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "role_address#0", - "role_address#0" - ] - }, - "1080": { - "op": "cover 2", - "defined_out": [ - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "role_address#0" - ] - }, - "1082": { - "op": "len", - "defined_out": [ - "len%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "len%1#0" - ] - }, - "1083": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "len%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "len%1#0", - "32" - ] - }, - "1084": { - "op": "==", - "defined_out": [ - "eq%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "eq%1#0" - ] - }, - "1085": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "role_address#0", - "role_id#0" - ] - }, - "1086": { - "op": "btoi", - "defined_out": [ - "role#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "role#0" - ] - }, - "1087": { - "op": "dup", - "defined_out": [ - "role#0", - "role#0 (copy)", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "role#0", - "role#0 (copy)" - ] - }, - "1088": { - "callsub": "modules.rbac.RbacModule._assert_valid_role", - "op": "callsub _assert_valid_role", - "stack_out": [ - "role_address#0", - "role#0" - ] - }, - "1091": { - "op": "intc_3 // 20", - "defined_out": [ - "20", - "role#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "role#0", - "20" - ] - }, - "1092": { - "op": "pushints 40 50 60 70 80", - "defined_out": [ - "20", - "40", - "50", - "60", - "70", - "80", - "role#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "role#0", - "20", - "40", - "50", - "60", - "70", - "80" - ] - }, - "1099": { - "op": "uncover 6", - "stack_out": [ - "role_address#0", - "20", - "40", - "50", - "60", - "70", - "80", - "role#0" - ] - }, - "1101": { - "op": "match rbac_get_role_config_switch_case_0@2 rbac_get_role_config_switch_case_1@3 rbac_get_role_config_switch_case_2@4 rbac_get_role_config_switch_case_3@5 rbac_get_role_config_switch_case_4@6 rbac_get_role_config_switch_case_5@7", - "stack_out": [ - "role_address#0" - ] - }, - "1115": { - "error": "Invalid role identifier", - "op": "err // Invalid role identifier" - }, - "1116": { - "block": "rbac_get_role_config_switch_case_5@7", - "stack_in": [ - "role_address#0" - ], - "op": "bytec 7 // 0x52383023", - "defined_out": [ - "0x52383023" - ], - "stack_out": [ - "role_address#0", - "0x52383023" - ] - }, - "1118": { - "op": "dig 1", - "defined_out": [ - "0x52383023", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "0x52383023", - "role_address#0" - ] - }, - "1120": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "1121": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "1122": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "1123": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "1125": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "1126": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%8#0", - "aggregate%box_get%9#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "aggregate%box_get%8#0", - "aggregate%box_get%9#0" - ] - }, - "1127": { - "op": "pop", - "defined_out": [ - "role_address#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "tmp%3#0" - ] - }, - "1128": { - "block": "rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9", - "stack_in": [ - "role_address#0", - "tmp%3#0" - ], - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75" - ], - "stack_out": [ - "role_address#0", - "tmp%3#0", - "0x151f7c75" - ] - }, - "1129": { - "op": "swap", - "defined_out": [ - "0x151f7c75", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "0x151f7c75", - "tmp%3#0" - ] - }, - "1130": { - "op": "concat", - "defined_out": [ - "tmp%4#0" - ], - "stack_out": [ - "role_address#0", - "tmp%4#0" - ] - }, - "1131": { - "op": "log", - "stack_out": [ - "role_address#0" - ] - }, - "1132": { - "op": "intc_0 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "role_address#0", - "1" - ] - }, - "1133": { - "op": "return", - "stack_out": [ - "role_address#0" - ] - }, - "1134": { - "block": "rbac_get_role_config_switch_case_4@6", - "stack_in": [ - "role_address#0" - ], - "op": "bytec_2 // 0x52373023", - "defined_out": [ - "0x52373023" - ], - "stack_out": [ - "role_address#0", - "0x52373023" - ] - }, - "1135": { - "op": "dig 1", - "defined_out": [ - "0x52373023", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "0x52373023", - "role_address#0" - ] - }, - "1137": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "1138": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "1139": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "1140": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "1142": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "1143": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%6#0", - "aggregate%box_get%7#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "aggregate%box_get%6#0", - "aggregate%box_get%7#0" - ] - }, - "1144": { - "op": "pop", - "defined_out": [ - "role_address#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "tmp%3#0" - ] - }, - "1145": { - "op": "b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9" - }, - "1148": { - "block": "rbac_get_role_config_switch_case_3@5", - "stack_in": [ - "role_address#0" - ], - "op": "bytec 6 // 0x52363023", - "defined_out": [ - "0x52363023" - ], - "stack_out": [ - "role_address#0", - "0x52363023" - ] - }, - "1150": { - "op": "dig 1", - "defined_out": [ - "0x52363023", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "0x52363023", - "role_address#0" - ] - }, - "1152": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "1153": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "1154": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "1155": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "1157": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "1158": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%4#0", - "aggregate%box_get%5#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "aggregate%box_get%4#0", - "aggregate%box_get%5#0" - ] - }, - "1159": { - "op": "pop", - "defined_out": [ - "role_address#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "tmp%3#0" - ] - }, - "1160": { - "op": "b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9" - }, - "1163": { - "block": "rbac_get_role_config_switch_case_2@4", - "stack_in": [ - "role_address#0" - ], - "op": "bytec 5 // 0x52353023", - "defined_out": [ - "0x52353023" - ], - "stack_out": [ - "role_address#0", - "0x52353023" - ] - }, - "1165": { - "op": "dig 1", - "defined_out": [ - "0x52353023", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "0x52353023", - "role_address#0" - ] - }, - "1167": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "1168": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "1169": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "1170": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "1172": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "1173": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%2#0", - "aggregate%box_get%3#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "aggregate%box_get%2#0", - "aggregate%box_get%3#0" - ] - }, - "1174": { - "op": "pop", - "defined_out": [ - "role_address#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "tmp%3#0" - ] - }, - "1175": { - "op": "b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9" - }, - "1178": { - "block": "rbac_get_role_config_switch_case_1@3", - "stack_in": [ - "role_address#0" - ], - "op": "bytec_3 // 0x52343023", - "defined_out": [ - "0x52343023" - ], - "stack_out": [ - "role_address#0", - "0x52343023" - ] - }, - "1179": { - "op": "dig 1", - "defined_out": [ - "0x52343023", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "0x52343023", - "role_address#0" - ] - }, - "1181": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "1182": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "1183": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "1184": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "1186": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "1187": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "1188": { - "op": "pop", - "defined_out": [ - "role_address#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "tmp%3#0" - ] - }, - "1189": { - "op": "b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9" - }, - "1192": { - "block": "rbac_get_role_config_switch_case_0@2", - "stack_in": [ - "role_address#0" - ], - "op": "pushbytes 0x00000000000000000000000000000000", - "defined_out": [ - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "tmp%3#0" - ] - }, - "1210": { - "op": "b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9" - }, - "1213": { - "subroutine": "modules.rbac.RbacModule._role_is_active", - "params": { - "role_map#0": "bytes", - "role_address#0": "bytes" - }, - "block": "_role_is_active", - "stack_in": [], - "op": "proto 2 1" - }, - "1216": { - "op": "pushbytes \"\"", - "stack_out": [ - "awst_tmp%0#0" - ] - }, - "1218": { - "op": "frame_dig -2", - "defined_out": [ - "role_map#0 (copy)" - ], - "stack_out": [ - "awst_tmp%0#0", - "role_map#0 (copy)" - ] - }, - "1220": { - "op": "frame_dig -1", - "defined_out": [ - "role_address#0 (copy)", - "role_map#0 (copy)" - ], - "stack_out": [ - "awst_tmp%0#0", - "role_map#0 (copy)", - "role_address#0 (copy)" - ] - }, - "1222": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1" - ] - }, - "1223": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1" - ] - }, - "1224": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "1225": { - "op": "bury 1", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "1227": { - "op": "bz _role_is_active_bool_false@4", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1" - ] - }, - "1230": { - "op": "frame_dig 1", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1" - ] - }, - "1232": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0", - "box_prefixed_key%0#1" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "1233": { - "error": "check BoxMap entry exists", - "op": "assert // check BoxMap entry exists", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "aggregate%box_get%0#0" - ] - }, - "1234": { - "op": "intc_1 // 0", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "aggregate%box_get%0#0", - "0" - ] - }, - "1235": { - "op": "extract_uint64", - "defined_out": [ - "box_prefixed_key%0#1", - "values%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "values%0#0" - ] - }, - "1236": { - "op": "global LatestTimestamp" - }, - "1238": { - "op": "dup", - "defined_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "values%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "values%0#0", - "awst_tmp%0#0", - "awst_tmp%0#0" - ] - }, - "1239": { - "op": "frame_bury 0", - "defined_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "values%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "values%0#0", - "awst_tmp%0#0" - ] - }, - "1241": { - "op": "<=", - "defined_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "tmp%1#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "tmp%1#0" - ] - }, - "1242": { - "op": "bz _role_is_active_bool_false@4", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1" - ] - }, - "1245": { - "op": "frame_dig 1", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1" - ] - }, - "1247": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%2#0", - "aggregate%box_get%3#0", - "awst_tmp%0#0", - "box_prefixed_key%0#1" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "aggregate%box_get%2#0", - "aggregate%box_get%3#0" - ] - }, - "1248": { - "error": "check BoxMap entry exists", - "op": "assert // check BoxMap entry exists", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "aggregate%box_get%2#0" - ] - }, - "1249": { - "op": "pushint 8", - "defined_out": [ - "8", - "aggregate%box_get%2#0", - "awst_tmp%0#0", - "box_prefixed_key%0#1" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "aggregate%box_get%2#0", - "8" - ] - }, - "1251": { - "op": "extract_uint64", - "defined_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "values%1#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "values%1#0" - ] - }, - "1252": { - "op": "frame_dig 0", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "values%1#0", - "awst_tmp%0#0" - ] - }, - "1254": { - "op": ">=", - "defined_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "tmp%2#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "tmp%2#0" - ] - }, - "1255": { - "op": "bz _role_is_active_bool_false@4", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1" - ] - }, - "1258": { - "op": "intc_0 // 1", - "defined_out": [ - "and_result%0#0", - "awst_tmp%0#0", - "box_prefixed_key%0#1" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "and_result%0#0" - ] - }, - "1259": { - "block": "_role_is_active_bool_merge@5", - "stack_in": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "and_result%0#0" - ], - "op": "frame_bury 0", - "defined_out": [ - "and_result%0#0" - ] - }, - "1261": { - "retsub": true, - "op": "retsub" - }, - "1262": { - "block": "_role_is_active_bool_false@4", - "stack_in": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1" - ], - "op": "intc_1 // 0", - "defined_out": [ - "and_result%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "and_result%0#0" - ] - }, - "1263": { - "op": "b _role_is_active_bool_merge@5" - }, - "1266": { - "subroutine": "modules.rbac.RbacModule.assert_caller_is_arranger", - "params": {}, - "block": "assert_caller_is_arranger", - "stack_in": [], - "op": "txn Sender", - "defined_out": [ - "role_address#0" - ], - "stack_out": [ - "role_address#0" - ] - }, - "1268": { - "op": "intc_1 // 0", - "defined_out": [ - "0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "0" - ] - }, - "1269": { - "op": "bytec_1 // 0x52323023", - "defined_out": [ - "0", - "0x52323023", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "0", - "0x52323023" - ] - }, - "1270": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1271": { - "error": "check self.arranger exists", - "op": "assert // check self.arranger exists", - "stack_out": [ - "role_address#0", - "maybe_value%0#0" - ] - }, - "1272": { - "op": "==", - "defined_out": [ - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1" - ] - }, - "1273": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [] - }, - "1274": { - "retsub": true, - "op": "retsub" - }, - "1275": { - "subroutine": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "params": {}, - "block": "assert_is_not_asset_defaulted", - "stack_in": [], - "op": "intc_1 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "0" - ] - }, - "1276": { - "op": "bytec 12 // \"asset_defaulted\"", - "defined_out": [ - "\"asset_defaulted\"", - "0" - ], - "stack_out": [ - "0", - "\"asset_defaulted\"" - ] - }, - "1278": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1279": { - "error": "check self.asset_defaulted exists", - "op": "assert // check self.asset_defaulted exists", - "stack_out": [ - "maybe_value%0#0" - ] - }, - "1280": { - "op": "!", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "1281": { - "error": "Defaulted", - "op": "assert // Defaulted", - "stack_out": [] - }, - "1282": { - "retsub": true, - "op": "retsub" - }, - "1283": { - "subroutine": "modules.rbac.RbacModule.assert_is_not_asset_suspended", - "params": {}, - "block": "assert_is_not_asset_suspended", - "stack_in": [], - "op": "intc_1 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "0" - ] - }, - "1284": { - "op": "bytec 8 // \"asset_suspended\"", - "defined_out": [ - "\"asset_suspended\"", - "0" - ], - "stack_out": [ - "0", - "\"asset_suspended\"" - ] - }, - "1286": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1287": { - "error": "check self.asset_suspended exists", - "op": "assert // check self.asset_suspended exists", - "stack_out": [ - "maybe_value%0#0" - ] - }, - "1288": { - "op": "!", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "1289": { - "error": "Suspended operations", - "op": "assert // Suspended operations", - "stack_out": [] - }, - "1290": { - "retsub": true, - "op": "retsub" - }, - "1291": { - "subroutine": "modules.rbac.RbacModule._assert_valid_role", - "params": { - "role_id#0": "uint64" - }, - "block": "_assert_valid_role", - "stack_in": [], - "op": "proto 1 0" - }, - "1294": { - "op": "frame_dig -1", - "defined_out": [ - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0 (copy)" - ] - }, - "1296": { - "op": "intc_3 // 20", - "defined_out": [ - "20", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0 (copy)", - "20" - ] - }, - "1297": { - "op": "==", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "1298": { - "op": "bnz _assert_valid_role_bool_true@6", - "stack_out": [] - }, - "1301": { - "op": "frame_dig -1", - "stack_out": [ - "role_id#0 (copy)" - ] - }, - "1303": { - "op": "pushint 40", - "defined_out": [ - "40", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0 (copy)", - "40" - ] - }, - "1305": { - "op": "==", - "defined_out": [ - "tmp%1#0" - ], - "stack_out": [ - "tmp%1#0" - ] - }, - "1306": { - "op": "bnz _assert_valid_role_bool_true@6", - "stack_out": [] - }, - "1309": { - "op": "frame_dig -1", - "stack_out": [ - "role_id#0 (copy)" - ] - }, - "1311": { - "op": "pushint 50", - "defined_out": [ - "50", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0 (copy)", - "50" - ] - }, - "1313": { - "op": "==", - "defined_out": [ - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0" - ] - }, - "1314": { - "op": "bnz _assert_valid_role_bool_true@6", - "stack_out": [] - }, - "1317": { - "op": "frame_dig -1", - "stack_out": [ - "role_id#0 (copy)" - ] - }, - "1319": { - "op": "pushint 60", - "defined_out": [ - "60", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0 (copy)", - "60" - ] - }, - "1321": { - "op": "==", - "defined_out": [ - "tmp%3#0" - ], - "stack_out": [ - "tmp%3#0" - ] - }, - "1322": { - "op": "bnz _assert_valid_role_bool_true@6", - "stack_out": [] - }, - "1325": { - "op": "frame_dig -1", - "stack_out": [ - "role_id#0 (copy)" - ] - }, - "1327": { - "op": "pushint 70", - "defined_out": [ - "70", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0 (copy)", - "70" - ] - }, - "1329": { - "op": "==", - "defined_out": [ - "tmp%4#0" - ], - "stack_out": [ - "tmp%4#0" - ] - }, - "1330": { - "op": "bnz _assert_valid_role_bool_true@6", - "stack_out": [] - }, - "1333": { - "op": "frame_dig -1", - "stack_out": [ - "role_id#0 (copy)" - ] - }, - "1335": { - "op": "pushint 80", - "defined_out": [ - "80", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0 (copy)", - "80" - ] - }, - "1337": { - "op": "==", - "defined_out": [ - "tmp%5#0" - ], - "stack_out": [ - "tmp%5#0" - ] - }, - "1338": { - "op": "bz _assert_valid_role_bool_false@7", - "stack_out": [] - }, - "1341": { - "block": "_assert_valid_role_bool_true@6", - "stack_in": [], - "op": "intc_0 // 1", - "defined_out": [ - "or_result%0#0" - ], - "stack_out": [ - "or_result%0#0" - ] - }, - "1342": { - "error": "Invalid role identifier", - "block": "_assert_valid_role_bool_merge@8", - "stack_in": [ - "or_result%0#0" - ], - "op": "assert // Invalid role identifier", - "defined_out": [], - "stack_out": [] - }, - "1343": { - "retsub": true, - "op": "retsub" - }, - "1344": { - "block": "_assert_valid_role_bool_false@7", - "stack_in": [], - "op": "intc_1 // 0", - "defined_out": [ - "or_result%0#0" - ], - "stack_out": [ - "or_result%0#0" - ] - }, - "1345": { - "op": "b _assert_valid_role_bool_merge@8" - } - } -} \ No newline at end of file diff --git a/smart_contracts/artifacts/mock_module_accounting/MockAccountingModule.approval.teal b/smart_contracts/artifacts/mock_module_accounting/MockAccountingModule.approval.teal deleted file mode 100644 index c7b06048..00000000 --- a/smart_contracts/artifacts/mock_module_accounting/MockAccountingModule.approval.teal +++ /dev/null @@ -1,1383 +0,0 @@ -#pragma version 11 -#pragma typetrack false - -// algopy.arc4.ARC4Contract.approval_program() -> uint64: -main: - intcblock 1 0 32 20 - bytecblock 0x151f7c75 0x52323023 0x52373023 0x52343023 0x52333023 0x52353023 0x52363023 0x52383023 "asset_suspended" "circulating_units" "status" 0x52323523 "asset_defaulted" - txn ApplicationID - bnz main_after_if_else@2 - // modules/rbac.py:30-31 - // # RBAC Roles - // self.arranger = GlobalState(Account(), key=cst.PREFIX_ID_ARRANGER) - bytec_1 // 0x52323023 - global ZeroAddress - app_global_put - // modules/rbac.py:32 - // self.op_daemon = GlobalState(Account(), key=cst.PREFIX_ID_OP_DAEMON) - bytec 11 // 0x52323523 - global ZeroAddress - app_global_put - // modules/rbac.py:47-48 - // # D-ASA Governance - // self.asset_suspended = False - bytec 8 // "asset_suspended" - intc_1 // 0 - app_global_put - // modules/rbac.py:49 - // self.asset_defaulted = False - bytec 12 // "asset_defaulted" - intc_1 // 0 - app_global_put - // modules/accounting.py:19 - // self.total_units = UInt64() - pushbytes "total_units" - intc_1 // 0 - app_global_put - // modules/accounting.py:20 - // self.circulating_units = UInt64() - bytec 9 // "circulating_units" - intc_1 // 0 - app_global_put - // modules/accounting.py:21 - // self.unit_value = UInt64() - pushbytes "unit_value" - intc_1 // 0 - app_global_put - // modules/accounting.py:22 - // self.status = UInt64(enm.STATUS_INACTIVE) - bytec 10 // "status" - intc_1 // 0 - app_global_put - -main_after_if_else@2: - // smart_contracts/mock_module_accounting/contract.py:6 - // class MockAccountingModule(AccountingModule): - txn NumAppArgs - bz main_create@22 - txn OnCompletion - ! - assert - txn ApplicationID - assert - pushbytess 0xdc063b35 0x14fc10ef 0x4c113ed5 0x74a7297f 0x105c184e 0x82f71b2d 0xef04f5d3 0x03b83329 0x3dbe80bd 0xdf54e82c 0x010c8299 0x7406acd2 0xc3e4b297 // method "account_gov_suspension(address,bool)uint64", method "account_open(address,address)uint64", method "account_close(address)(uint64,uint64)", method "account_update_payment_address(address,address)uint64", method "account_get_info(address)(address,uint64,uint64,uint64,bool)", method "rbac_rotate_arranger(address)uint64", method "rbac_set_op_daemon(address)uint64", method "rbac_assign_role(uint8,address,byte[])uint64", method "rbac_revoke_role(uint8,address)uint64", method "rbac_gov_asset_suspension(bool)uint64", method "rbac_get_arranger()address", method "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", method "rbac_get_role_config(uint8,address)(uint64,uint64)" - txna ApplicationArgs 0 - match account_gov_suspension account_open account_close account_update_payment_address account_get_info rbac_rotate_arranger rbac_set_op_daemon rbac_assign_role rbac_revoke_role rbac_gov_asset_suspension rbac_get_arranger rbac_get_address_roles rbac_get_role_config - err - -main_create@22: - // smart_contracts/mock_module_accounting/contract.py:14 - // @arc4.baremethod(create="require") - txn OnCompletion - ! - txn ApplicationID - ! - && - assert - // smart_contracts/mock_module_accounting/contract.py:16 - // self.arranger.value = Txn.sender - bytec_1 // 0x52323023 - txn Sender - app_global_put - // smart_contracts/mock_module_accounting/contract.py:14 - // @arc4.baremethod(create="require") - intc_0 // 1 - return - - -// modules.accounting.AccountingModule.account_gov_suspension[routing]() -> void: -account_gov_suspension: - // modules/accounting.py:94 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - txna ApplicationArgs 2 - dup - len - intc_0 // 1 - == - assert // invalid number of bytes for arc4.bool - intc_1 // 0 - getbit - // modules/rbac.py:77 - // assert self._role_is_active(self.authority, Txn.sender), err.UNAUTHORIZED - bytec_2 // 0x52373023 - txn Sender - callsub _role_is_active - assert // Not authorized - // modules/accounting.py:31 - // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec 4 // 0x52333023 - uncover 2 - concat - dup - box_len - bury 1 - assert // Invalid account holding address - // modules/accounting.py:114 - // self.account[holding_address].suspended = suspended - dup - pushint 56 - intc_0 // 1 - box_extract - intc_1 // 0 - uncover 3 - setbit - pushint 56 - swap - box_replace - // modules/accounting.py:115 - // return Global.latest_timestamp - global LatestTimestamp - // modules/accounting.py:94 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_0 // 1 - return - - -// modules.accounting.AccountingModule.account_open[routing]() -> void: -account_open: - // modules/accounting.py:117 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - txna ApplicationArgs 2 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:68 - // assert self._role_is_active(self.account_manager, Txn.sender), err.UNAUTHORIZED - bytec_3 // 0x52343023 - txn Sender - callsub _role_is_active - assert // Not authorized - // modules/accounting.py:28 - // return self.status == enm.STATUS_ENDED - intc_1 // 0 - bytec 10 // "status" - app_global_get_ex - assert // check self.status exists - pushint 200 - == - // modules/accounting.py:139 - // assert not self.status_is_ended(), err.UNAUTHORIZED - ! - assert // Not authorized - // modules/accounting.py:140 - // self.assert_is_not_asset_defaulted() - callsub assert_is_not_asset_defaulted - // modules/accounting.py:141 - // self.assert_is_not_asset_suspended() - callsub assert_is_not_asset_suspended - // modules/accounting.py:142 - // assert holding_address not in self.account, err.INVALID_HOLDING_ADDRESS - bytec 4 // 0x52333023 - uncover 2 - concat - dup - box_len - bury 1 - ! - assert // Invalid account holding address - // modules/accounting.py:146 - // units=UInt64(0), - intc_1 // 0 - // modules/accounting.py:144-150 - // self.account[holding_address] = typ.AccountInfo( - // payment_address=payment_address, - // units=UInt64(0), - // unit_value=UInt64(0), - // paid_coupons=UInt64(0), - // suspended=False, - // ) - itob - uncover 2 - dig 1 - concat - dig 1 - concat - swap - concat - pushbytes 0x00 - concat - box_put - // modules/accounting.py:151 - // return Global.latest_timestamp - global LatestTimestamp - // modules/accounting.py:117 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_0 // 1 - return - - -// modules.accounting.AccountingModule.account_close[routing]() -> void: -account_close: - // modules/accounting.py:153 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:68 - // assert self._role_is_active(self.account_manager, Txn.sender), err.UNAUTHORIZED - bytec_3 // 0x52343023 - txn Sender - callsub _role_is_active - assert // Not authorized - // modules/accounting.py:171 - // self.assert_is_not_asset_defaulted() - callsub assert_is_not_asset_defaulted - // modules/accounting.py:31 - // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec 4 // 0x52333023 - swap - concat - dup - box_len - bury 1 - assert // Invalid account holding address - // modules/accounting.py:174 - // closed_units = self.account[holding_address].units - dup - box_get - pop - intc_2 // 32 - extract_uint64 - dup - uncover 2 - // modules/accounting.py:175 - // del self.account[holding_address] - box_del - pop - // modules/accounting.py:176 - // self.circulating_units -= closed_units - intc_1 // 0 - bytec 9 // "circulating_units" - app_global_get_ex - assert // check self.circulating_units exists - swap - - - bytec 9 // "circulating_units" - dig 1 - app_global_put - // modules/accounting.py:48 - // if self.circulating_units == UInt64(0): - bnz account_close_after_if_else@3 - // modules/accounting.py:49 - // self.status = UInt64(enm.STATUS_ENDED) - bytec 10 // "status" - pushint 200 - app_global_put - -account_close_after_if_else@3: - // modules/accounting.py:178 - // return closed_units, Global.latest_timestamp - global LatestTimestamp - // modules/accounting.py:153 - // @arc4.abimethod - dig 1 - itob - swap - itob - concat - bytec_0 // 0x151f7c75 - swap - concat - log - intc_0 // 1 - return - - -// modules.accounting.AccountingModule.account_update_payment_address[routing]() -> void: -account_update_payment_address: - // modules/accounting.py:180 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - txna ApplicationArgs 2 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/accounting.py:200 - // assert Txn.sender == holding_address, err.UNAUTHORIZED - txn Sender - dig 2 - == - assert // Not authorized - // modules/accounting.py:201 - // self.assert_is_not_asset_defaulted() - callsub assert_is_not_asset_defaulted - // modules/accounting.py:202 - // self.assert_is_not_asset_suspended() - callsub assert_is_not_asset_suspended - // modules/accounting.py:31 - // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec 4 // 0x52333023 - uncover 2 - concat - dup - box_len - bury 1 - assert // Invalid account holding address - // modules/accounting.py:204 - // self.account[holding_address].payment_address = payment_address - intc_1 // 0 - uncover 2 - box_replace - // modules/accounting.py:205 - // return Global.latest_timestamp - global LatestTimestamp - // modules/accounting.py:180 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_0 // 1 - return - - -// modules.accounting.AccountingModule.account_get_info[routing]() -> void: -account_get_info: - // modules/accounting.py:207 - // @arc4.abimethod(readonly=True) - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/accounting.py:31 - // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec 4 // 0x52333023 - swap - concat - dup - box_len - bury 1 - assert // Invalid account holding address - // modules/accounting.py:222 - // return self.account[holding_address] - box_get - pop - // modules/accounting.py:207 - // @arc4.abimethod(readonly=True) - bytec_0 // 0x151f7c75 - swap - concat - log - intc_0 // 1 - return - - -// modules.rbac.RbacModule.rbac_rotate_arranger[routing]() -> void: -rbac_rotate_arranger: - // modules/rbac.py:147 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:158 - // self.assert_caller_is_arranger() - callsub assert_caller_is_arranger - // modules/rbac.py:159 - // self.arranger.value = new_arranger - bytec_1 // 0x52323023 - swap - app_global_put - // modules/rbac.py:160 - // return Global.latest_timestamp - global LatestTimestamp - // modules/rbac.py:147 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_0 // 1 - return - - -// modules.rbac.RbacModule.rbac_set_op_daemon[routing]() -> void: -rbac_set_op_daemon: - // modules/rbac.py:162 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:173 - // self.assert_caller_is_arranger() - callsub assert_caller_is_arranger - // modules/rbac.py:174 - // self.op_daemon.value = address - bytec 11 // 0x52323523 - swap - app_global_put - // modules/rbac.py:175 - // return Global.latest_timestamp - global LatestTimestamp - // modules/rbac.py:162 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_0 // 1 - return - - -// modules.rbac.RbacModule.rbac_assign_role[routing]() -> void: -rbac_assign_role: - // modules/rbac.py:177 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_0 // 1 - == - assert // invalid number of bytes for arc4.uint8 - txna ApplicationArgs 2 - dup - cover 2 - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - txna ApplicationArgs 3 - dup - intc_1 // 0 - extract_uint16 // on error: invalid array length header - pushint 2 - + - dig 1 - len - == - assert // invalid number of bytes for arc4.dynamic_array - extract 2 0 - swap - // modules/rbac.py:199 - // self.assert_caller_is_arranger() - callsub assert_caller_is_arranger - // modules/rbac.py:200 - // self.assert_is_not_asset_defaulted() - callsub assert_is_not_asset_defaulted - // modules/rbac.py:201 - // self._assert_valid_role(role_id.as_uint64()) - btoi - dupn 2 - callsub _assert_valid_role - // modules/rbac.py:101 - // if role_id == UInt64(cst.ROLE_ARRANGER): - intc_3 // 20 - == - bz rbac_assign_role_after_if_else@3 - // modules/rbac.py:102 - // self.arranger.value = role_address - bytec_1 // 0x52323023 - dig 3 - app_global_put - -rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14: - // modules/rbac.py:203 - // return Global.latest_timestamp - global LatestTimestamp - // modules/rbac.py:177 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_0 // 1 - return - -rbac_assign_role_after_if_else@3: - // modules/rbac.py:105 - // if role_id == UInt64(cst.ROLE_ACCOUNT_MANAGER): - dup - pushint 40 - == - bz rbac_assign_role_after_if_else@5 - // modules/rbac.py:106 - // assert role_address not in self.account_manager, err.INVALID_ROLE_ADDRESS - bytec_3 // 0x52343023 - dig 3 - concat - dup - box_len - bury 1 - ! - assert // Invalid account role address - // modules/rbac.py:107 - // self.account_manager[role_address] = typ.RoleConfig.from_bytes(config) - dig 2 - box_put - // modules/rbac.py:202 - // self._upsert_role(role_id.as_uint64(), role_address, config) - b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14 - -rbac_assign_role_after_if_else@5: - // modules/rbac.py:109 - // if role_id == UInt64(cst.ROLE_PRIMARY_DEALER): - dup - pushint 50 - == - bz rbac_assign_role_after_if_else@7 - // modules/rbac.py:110 - // assert role_address not in self.primary_dealer, err.INVALID_ROLE_ADDRESS - bytec 5 // 0x52353023 - dig 3 - concat - dup - box_len - bury 1 - ! - assert // Invalid account role address - // modules/rbac.py:111 - // self.primary_dealer[role_address] = typ.RoleConfig.from_bytes(config) - dig 2 - box_put - // modules/rbac.py:202 - // self._upsert_role(role_id.as_uint64(), role_address, config) - b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14 - -rbac_assign_role_after_if_else@7: - // modules/rbac.py:113 - // if role_id == UInt64(cst.ROLE_TRUSTEE): - dup - pushint 60 - == - bz rbac_assign_role_after_if_else@9 - // modules/rbac.py:114 - // assert role_address not in self.trustee, err.INVALID_ROLE_ADDRESS - bytec 6 // 0x52363023 - dig 3 - concat - dup - box_len - bury 1 - ! - assert // Invalid account role address - // modules/rbac.py:115 - // self.trustee[role_address] = typ.RoleConfig.from_bytes(config) - dig 2 - box_put - // modules/rbac.py:202 - // self._upsert_role(role_id.as_uint64(), role_address, config) - b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14 - -rbac_assign_role_after_if_else@9: - // modules/rbac.py:117 - // if role_id == UInt64(cst.ROLE_AUTHORITY): - dup - pushint 70 - == - bz rbac_assign_role_after_if_else@11 - // modules/rbac.py:118 - // assert role_address not in self.authority, err.INVALID_ROLE_ADDRESS - bytec_2 // 0x52373023 - dig 3 - concat - dup - box_len - bury 1 - ! - assert // Invalid account role address - // modules/rbac.py:119 - // self.authority[role_address] = typ.RoleConfig.from_bytes(config) - dig 2 - box_put - // modules/rbac.py:202 - // self._upsert_role(role_id.as_uint64(), role_address, config) - b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14 - -rbac_assign_role_after_if_else@11: - // modules/rbac.py:121 - // if role_id == UInt64(cst.ROLE_INTEREST_ORACLE): - dup - pushint 80 - == - bz rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14 - // modules/rbac.py:122 - // assert role_address not in self.interest_oracle, err.INVALID_ROLE_ADDRESS - bytec 7 // 0x52383023 - dig 3 - concat - dup - box_len - bury 1 - ! - assert // Invalid account role address - // modules/rbac.py:123 - // self.interest_oracle[role_address] = typ.RoleConfig.from_bytes(config) - dig 2 - box_put - b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14 - - -// modules.rbac.RbacModule.rbac_revoke_role[routing]() -> void: -rbac_revoke_role: - // modules/rbac.py:205 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_0 // 1 - == - assert // invalid number of bytes for arc4.uint8 - txna ApplicationArgs 2 - dup - cover 2 - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:224 - // self.assert_caller_is_arranger() - callsub assert_caller_is_arranger - // modules/rbac.py:225 - // self.assert_is_not_asset_defaulted() - callsub assert_is_not_asset_defaulted - // modules/rbac.py:226 - // self._assert_valid_role(role_id.as_uint64()) - btoi - dupn 2 - callsub _assert_valid_role - // modules/rbac.py:126 - // assert role_id != UInt64(cst.ROLE_ARRANGER), err.INVALID_ROLE - dup - intc_3 // 20 - != - assert // Invalid role identifier - // modules/rbac.py:127 - // if role_id == UInt64(cst.ROLE_ACCOUNT_MANAGER): - pushint 40 - == - bz rbac_revoke_role_after_if_else@3 - // modules/rbac.py:128 - // assert role_address in self.account_manager, err.INVALID_ROLE_ADDRESS - bytec_3 // 0x52343023 - dig 2 - concat - dup - box_len - bury 1 - assert // Invalid account role address - // modules/rbac.py:129 - // del self.account_manager[role_address] - box_del - pop - -rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12: - // modules/rbac.py:228 - // return Global.latest_timestamp - global LatestTimestamp - // modules/rbac.py:205 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_0 // 1 - return - -rbac_revoke_role_after_if_else@3: - // modules/rbac.py:131 - // if role_id == UInt64(cst.ROLE_PRIMARY_DEALER): - dup - pushint 50 - == - bz rbac_revoke_role_after_if_else@5 - // modules/rbac.py:132 - // assert role_address in self.primary_dealer, err.INVALID_ROLE_ADDRESS - bytec 5 // 0x52353023 - dig 2 - concat - dup - box_len - bury 1 - assert // Invalid account role address - // modules/rbac.py:133 - // del self.primary_dealer[role_address] - box_del - pop - // modules/rbac.py:227 - // self._delete_role(role_id.as_uint64(), role_address) - b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 - -rbac_revoke_role_after_if_else@5: - // modules/rbac.py:135 - // if role_id == UInt64(cst.ROLE_TRUSTEE): - dup - pushint 60 - == - bz rbac_revoke_role_after_if_else@7 - // modules/rbac.py:136 - // assert role_address in self.trustee, err.INVALID_ROLE_ADDRESS - bytec 6 // 0x52363023 - dig 2 - concat - dup - box_len - bury 1 - assert // Invalid account role address - // modules/rbac.py:137 - // del self.trustee[role_address] - box_del - pop - // modules/rbac.py:227 - // self._delete_role(role_id.as_uint64(), role_address) - b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 - -rbac_revoke_role_after_if_else@7: - // modules/rbac.py:139 - // if role_id == UInt64(cst.ROLE_AUTHORITY): - dup - pushint 70 - == - bz rbac_revoke_role_after_if_else@9 - // modules/rbac.py:140 - // assert role_address in self.authority, err.INVALID_ROLE_ADDRESS - bytec_2 // 0x52373023 - dig 2 - concat - dup - box_len - bury 1 - assert // Invalid account role address - // modules/rbac.py:141 - // del self.authority[role_address] - box_del - pop - // modules/rbac.py:227 - // self._delete_role(role_id.as_uint64(), role_address) - b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 - -rbac_revoke_role_after_if_else@9: - // modules/rbac.py:143 - // if role_id == UInt64(cst.ROLE_INTEREST_ORACLE): - dup - pushint 80 - == - bz rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 - // modules/rbac.py:144 - // assert role_address in self.interest_oracle, err.INVALID_ROLE_ADDRESS - bytec 7 // 0x52383023 - dig 2 - concat - dup - box_len - bury 1 - assert // Invalid account role address - // modules/rbac.py:145 - // del self.interest_oracle[role_address] - box_del - pop - b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 - - -// modules.rbac.RbacModule.rbac_gov_asset_suspension[routing]() -> void: -rbac_gov_asset_suspension: - // modules/rbac.py:230 - // @arc4.abimethod # TODO: Update specs and add test - txna ApplicationArgs 1 - dup - len - intc_0 // 1 - == - assert // invalid number of bytes for arc4.bool - intc_1 // 0 - getbit - // modules/rbac.py:77 - // assert self._role_is_active(self.authority, Txn.sender), err.UNAUTHORIZED - bytec_2 // 0x52373023 - txn Sender - callsub _role_is_active - assert // Not authorized - // modules/rbac.py:246 - // self.asset_suspended = suspended - bytec 8 // "asset_suspended" - swap - app_global_put - // modules/rbac.py:247 - // return Global.latest_timestamp - global LatestTimestamp - // modules/rbac.py:230 - // @arc4.abimethod # TODO: Update specs and add test - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_0 // 1 - return - - -// modules.rbac.RbacModule.rbac_get_arranger[routing]() -> void: -rbac_get_arranger: - // modules/rbac.py:257 - // return self.arranger.value - intc_1 // 0 - bytec_1 // 0x52323023 - app_global_get_ex - assert // check self.arranger exists - // modules/rbac.py:249 - // @arc4.abimethod(readonly=True) - bytec_0 // 0x151f7c75 - swap - concat - log - intc_0 // 1 - return - - -// modules.rbac.RbacModule.rbac_get_address_roles[routing]() -> void: -rbac_get_address_roles: - // modules/rbac.py:259 - // @arc4.abimethod(readonly=True) - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:273 - // self._role_is_active(self.account_manager, address), - bytec_3 // 0x52343023 - dig 1 - callsub _role_is_active - // modules/rbac.py:274 - // self._role_is_active(self.primary_dealer, address), - bytec 5 // 0x52353023 - dig 2 - callsub _role_is_active - // modules/rbac.py:275 - // self._role_is_active(self.trustee, address), - bytec 6 // 0x52363023 - dig 3 - callsub _role_is_active - // modules/rbac.py:276 - // self._role_is_active(self.authority, address), - bytec_2 // 0x52373023 - dig 4 - callsub _role_is_active - // modules/rbac.py:277 - // self._role_is_active(self.interest_oracle, address), - bytec 7 // 0x52383023 - uncover 5 - callsub _role_is_active - // modules/rbac.py:259 - // @arc4.abimethod(readonly=True) - pushbytes 0x00 - intc_1 // 0 - uncover 6 - setbit - intc_0 // 1 - uncover 5 - setbit - pushint 2 - uncover 4 - setbit - pushint 3 - uncover 3 - setbit - pushint 4 - uncover 2 - setbit - bytec_0 // 0x151f7c75 - swap - concat - log - intc_0 // 1 - return - - -// modules.rbac.RbacModule.rbac_get_role_config[routing]() -> void: -rbac_get_role_config: - // modules/rbac.py:280 - // @arc4.abimethod(readonly=True) - txna ApplicationArgs 1 - dup - len - intc_0 // 1 - == - assert // invalid number of bytes for arc4.uint8 - txna ApplicationArgs 2 - dup - cover 2 - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:294 - // role = role_id.as_uint64() - btoi - // modules/rbac.py:295 - // self._assert_valid_role(role) - dup - callsub _assert_valid_role - // modules/rbac.py:297 - // case UInt64(cst.ROLE_ARRANGER): - intc_3 // 20 - // modules/rbac.py:301 - // case UInt64(cst.ROLE_ACCOUNT_MANAGER): - pushints 40 50 60 70 80 - // modules/rbac.py:296-327 - // match role: - // case UInt64(cst.ROLE_ARRANGER): - // return typ.RoleConfig( - // role_validity_start=UInt64(0), role_validity_end=UInt64(0) - // ) - // case UInt64(cst.ROLE_ACCOUNT_MANAGER): - // assert self._has_role( - // self.account_manager, role_address - // ), err.INVALID_ROLE_ADDRESS - // return self.account_manager[role_address] - // case UInt64(cst.ROLE_PRIMARY_DEALER): - // assert self._has_role( - // self.primary_dealer, role_address - // ), err.INVALID_ROLE_ADDRESS - // return self.primary_dealer[role_address] - // case UInt64(cst.ROLE_TRUSTEE): - // assert self._has_role( - // self.trustee, role_address - // ), err.INVALID_ROLE_ADDRESS - // return self.trustee[role_address] - // case UInt64(cst.ROLE_AUTHORITY): - // assert self._has_role( - // self.authority, role_address - // ), err.INVALID_ROLE_ADDRESS - // return self.authority[role_address] - // case UInt64(cst.ROLE_INTEREST_ORACLE): - // assert self._has_role( - // self.interest_oracle, role_address - // ), err.INVALID_ROLE_ADDRESS - // return self.interest_oracle[role_address] - // case _: - // op.err(err.INVALID_ROLE) - uncover 6 - match rbac_get_role_config_switch_case_0@2 rbac_get_role_config_switch_case_1@3 rbac_get_role_config_switch_case_2@4 rbac_get_role_config_switch_case_3@5 rbac_get_role_config_switch_case_4@6 rbac_get_role_config_switch_case_5@7 - // modules/rbac.py:327 - // op.err(err.INVALID_ROLE) - err // Invalid role identifier - -rbac_get_role_config_switch_case_5@7: - // modules/rbac.py:323 - // self.interest_oracle, role_address - bytec 7 // 0x52383023 - // modules/rbac.py:55 - // return role_address in role_map - dig 1 - concat - dup - box_len - bury 1 - // modules/rbac.py:322-324 - // assert self._has_role( - // self.interest_oracle, role_address - // ), err.INVALID_ROLE_ADDRESS - assert // Invalid account role address - // modules/rbac.py:325 - // return self.interest_oracle[role_address] - box_get - pop - -rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9: - // modules/rbac.py:280 - // @arc4.abimethod(readonly=True) - bytec_0 // 0x151f7c75 - swap - concat - log - intc_0 // 1 - return - -rbac_get_role_config_switch_case_4@6: - // modules/rbac.py:318 - // self.authority, role_address - bytec_2 // 0x52373023 - // modules/rbac.py:55 - // return role_address in role_map - dig 1 - concat - dup - box_len - bury 1 - // modules/rbac.py:317-319 - // assert self._has_role( - // self.authority, role_address - // ), err.INVALID_ROLE_ADDRESS - assert // Invalid account role address - // modules/rbac.py:320 - // return self.authority[role_address] - box_get - pop - // modules/rbac.py:280 - // @arc4.abimethod(readonly=True) - b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9 - -rbac_get_role_config_switch_case_3@5: - // modules/rbac.py:313 - // self.trustee, role_address - bytec 6 // 0x52363023 - // modules/rbac.py:55 - // return role_address in role_map - dig 1 - concat - dup - box_len - bury 1 - // modules/rbac.py:312-314 - // assert self._has_role( - // self.trustee, role_address - // ), err.INVALID_ROLE_ADDRESS - assert // Invalid account role address - // modules/rbac.py:315 - // return self.trustee[role_address] - box_get - pop - // modules/rbac.py:280 - // @arc4.abimethod(readonly=True) - b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9 - -rbac_get_role_config_switch_case_2@4: - // modules/rbac.py:308 - // self.primary_dealer, role_address - bytec 5 // 0x52353023 - // modules/rbac.py:55 - // return role_address in role_map - dig 1 - concat - dup - box_len - bury 1 - // modules/rbac.py:307-309 - // assert self._has_role( - // self.primary_dealer, role_address - // ), err.INVALID_ROLE_ADDRESS - assert // Invalid account role address - // modules/rbac.py:310 - // return self.primary_dealer[role_address] - box_get - pop - // modules/rbac.py:280 - // @arc4.abimethod(readonly=True) - b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9 - -rbac_get_role_config_switch_case_1@3: - // modules/rbac.py:303 - // self.account_manager, role_address - bytec_3 // 0x52343023 - // modules/rbac.py:55 - // return role_address in role_map - dig 1 - concat - dup - box_len - bury 1 - // modules/rbac.py:302-304 - // assert self._has_role( - // self.account_manager, role_address - // ), err.INVALID_ROLE_ADDRESS - assert // Invalid account role address - // modules/rbac.py:305 - // return self.account_manager[role_address] - box_get - pop - // modules/rbac.py:280 - // @arc4.abimethod(readonly=True) - b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9 - -rbac_get_role_config_switch_case_0@2: - // modules/rbac.py:298-300 - // return typ.RoleConfig( - // role_validity_start=UInt64(0), role_validity_end=UInt64(0) - // ) - pushbytes 0x00000000000000000000000000000000 - // modules/rbac.py:280 - // @arc4.abimethod(readonly=True) - b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9 - - -// modules.rbac.RbacModule._role_is_active(role_map: bytes, role_address: bytes) -> uint64: -_role_is_active: - // modules/rbac.py:57 - // def _role_is_active(self, role_map: typ.RbacRole, role_address: Account) -> bool: - proto 2 1 - pushbytes "" - // modules/rbac.py:55 - // return role_address in role_map - frame_dig -2 - frame_dig -1 - concat - dup - box_len - bury 1 - // modules/rbac.py:58-62 - // return self._has_role(role_map, role_address) and ( - // role_map[role_address].role_validity_start - // <= Global.latest_timestamp - // <= role_map[role_address].role_validity_end - // ) - bz _role_is_active_bool_false@4 - // modules/rbac.py:59 - // role_map[role_address].role_validity_start - frame_dig 1 - box_get - assert // check BoxMap entry exists - intc_1 // 0 - extract_uint64 - // modules/rbac.py:60 - // <= Global.latest_timestamp - global LatestTimestamp - dup - frame_bury 0 - // modules/rbac.py:59-60 - // role_map[role_address].role_validity_start - // <= Global.latest_timestamp - <= - // modules/rbac.py:59-61 - // role_map[role_address].role_validity_start - // <= Global.latest_timestamp - // <= role_map[role_address].role_validity_end - bz _role_is_active_bool_false@4 - // modules/rbac.py:61 - // <= role_map[role_address].role_validity_end - frame_dig 1 - box_get - assert // check BoxMap entry exists - pushint 8 - extract_uint64 - // modules/rbac.py:60-61 - // <= Global.latest_timestamp - // <= role_map[role_address].role_validity_end - frame_dig 0 - >= - // modules/rbac.py:59-61 - // role_map[role_address].role_validity_start - // <= Global.latest_timestamp - // <= role_map[role_address].role_validity_end - bz _role_is_active_bool_false@4 - intc_0 // 1 - -_role_is_active_bool_merge@5: - // modules/rbac.py:58-62 - // return self._has_role(role_map, role_address) and ( - // role_map[role_address].role_validity_start - // <= Global.latest_timestamp - // <= role_map[role_address].role_validity_end - // ) - frame_bury 0 - retsub - -_role_is_active_bool_false@4: - intc_1 // 0 - b _role_is_active_bool_merge@5 - - -// modules.rbac.RbacModule.assert_caller_is_arranger() -> void: -assert_caller_is_arranger: - // modules/rbac.py:65 - // assert self._is_arranger(Txn.sender), err.UNAUTHORIZED - txn Sender - // modules/rbac.py:52 - // return role_address == self.arranger.value - intc_1 // 0 - bytec_1 // 0x52323023 - app_global_get_ex - assert // check self.arranger exists - == - // modules/rbac.py:65 - // assert self._is_arranger(Txn.sender), err.UNAUTHORIZED - assert // Not authorized - retsub - - -// modules.rbac.RbacModule.assert_is_not_asset_defaulted() -> void: -assert_is_not_asset_defaulted: - // modules/rbac.py:83 - // assert not self.asset_defaulted, err.DEFAULTED - intc_1 // 0 - bytec 12 // "asset_defaulted" - app_global_get_ex - assert // check self.asset_defaulted exists - ! - assert // Defaulted - retsub - - -// modules.rbac.RbacModule.assert_is_not_asset_suspended() -> void: -assert_is_not_asset_suspended: - // modules/rbac.py:86 - // assert not self.asset_suspended, err.SUSPENDED - intc_1 // 0 - bytec 8 // "asset_suspended" - app_global_get_ex - assert // check self.asset_suspended exists - ! - assert // Suspended operations - retsub - - -// modules.rbac.RbacModule._assert_valid_role(role_id: uint64) -> void: -_assert_valid_role: - // modules/rbac.py:88 - // def _assert_valid_role(self, role_id: UInt64) -> None: - proto 1 0 - // modules/rbac.py:89-96 - // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - frame_dig -1 - // modules/rbac.py:90 - // UInt64(cst.ROLE_ARRANGER), - intc_3 // 20 - // modules/rbac.py:89-96 - // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - == - bnz _assert_valid_role_bool_true@6 - frame_dig -1 - // modules/rbac.py:91 - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - pushint 40 - // modules/rbac.py:89-96 - // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - == - bnz _assert_valid_role_bool_true@6 - frame_dig -1 - // modules/rbac.py:92 - // UInt64(cst.ROLE_PRIMARY_DEALER), - pushint 50 - // modules/rbac.py:89-96 - // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - == - bnz _assert_valid_role_bool_true@6 - frame_dig -1 - // modules/rbac.py:93 - // UInt64(cst.ROLE_TRUSTEE), - pushint 60 - // modules/rbac.py:89-96 - // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - == - bnz _assert_valid_role_bool_true@6 - frame_dig -1 - // modules/rbac.py:94 - // UInt64(cst.ROLE_AUTHORITY), - pushint 70 - // modules/rbac.py:89-96 - // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - == - bnz _assert_valid_role_bool_true@6 - frame_dig -1 - // modules/rbac.py:95 - // UInt64(cst.ROLE_INTEREST_ORACLE), - pushint 80 - // modules/rbac.py:89-96 - // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - == - bz _assert_valid_role_bool_false@7 - -_assert_valid_role_bool_true@6: - intc_0 // 1 - -_assert_valid_role_bool_merge@8: - // modules/rbac.py:89-96 - // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - assert // Invalid role identifier - retsub - -_assert_valid_role_bool_false@7: - intc_1 // 0 - b _assert_valid_role_bool_merge@8 diff --git a/smart_contracts/artifacts/mock_module_accounting/MockAccountingModule.arc56.json b/smart_contracts/artifacts/mock_module_accounting/MockAccountingModule.arc56.json deleted file mode 100644 index 168af179..00000000 --- a/smart_contracts/artifacts/mock_module_accounting/MockAccountingModule.arc56.json +++ /dev/null @@ -1,662 +0,0 @@ -{ - "name": "MockAccountingModule", - "structs": { - "AccountInfo": [ - { - "name": "payment_address", - "type": "address" - }, - { - "name": "units", - "type": "uint64" - }, - { - "name": "unit_value", - "type": "uint64" - }, - { - "name": "paid_coupons", - "type": "uint64" - }, - { - "name": "suspended", - "type": "bool" - } - ], - "RoleConfig": [ - { - "name": "role_validity_start", - "type": "uint64" - }, - { - "name": "role_validity_end", - "type": "uint64" - } - ] - }, - "methods": [ - { - "name": "account_gov_suspension", - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - }, - { - "type": "bool", - "name": "suspended", - "desc": "Suspension status" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the set account suspension status" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Set account suspension status", - "events": [], - "recommendations": {} - }, - { - "name": "account_open", - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - }, - { - "type": "address", - "name": "payment_address", - "desc": "Account Payment Address" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the account opening" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Open D-ASA account", - "events": [], - "recommendations": {} - }, - { - "name": "account_close", - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - } - ], - "returns": { - "type": "(uint64,uint64)", - "desc": "Closed units, Timestamp of the account closing" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Close D-ASA account", - "events": [], - "recommendations": {} - }, - { - "name": "account_update_payment_address", - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - }, - { - "type": "address", - "name": "payment_address", - "desc": "Account Payment Address" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the account update" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Update the Payment Address of an account", - "events": [], - "recommendations": {} - }, - { - "name": "account_get_info", - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - } - ], - "returns": { - "type": "(address,uint64,uint64,uint64,bool)", - "struct": "AccountInfo", - "desc": "Payment Address, D-ASA units, Unit nominal value in denomination asset, Paid coupons, Suspended" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Get account info", - "events": [], - "recommendations": {} - }, - { - "name": "rbac_rotate_arranger", - "args": [ - { - "type": "address", - "name": "new_arranger", - "desc": "New Arranger address" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the role assignment" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Rotate the Arranger address", - "events": [], - "recommendations": {} - }, - { - "name": "rbac_set_op_daemon", - "args": [ - { - "type": "address", - "name": "address", - "desc": "Operation Daemon address" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the role assignment" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Non-Normative: Set the Operation Daemon address", - "events": [], - "recommendations": {} - }, - { - "name": "rbac_assign_role", - "args": [ - { - "type": "uint8", - "name": "role_id", - "desc": "Role Identifier" - }, - { - "type": "address", - "name": "role_address", - "desc": "Account Role Address" - }, - { - "type": "byte[]", - "name": "config", - "desc": "Role configuration (Optional)" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the role assignment" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Assign a role to an address", - "events": [], - "recommendations": {} - }, - { - "name": "rbac_revoke_role", - "args": [ - { - "type": "uint8", - "name": "role_id", - "desc": "Role Identifier" - }, - { - "type": "address", - "name": "role_address", - "desc": "Account Role Address" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the role revocation" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Revoke a role from an address", - "events": [], - "recommendations": {} - }, - { - "name": "rbac_gov_asset_suspension", - "args": [ - { - "type": "bool", - "name": "suspended", - "desc": "Suspension status" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the set asset suspension status" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Set asset suspension status", - "events": [], - "recommendations": {} - }, - { - "name": "rbac_get_arranger", - "args": [], - "returns": { - "type": "address", - "desc": "Arranger address" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Get Arranger address", - "events": [], - "recommendations": {} - }, - { - "name": "rbac_get_address_roles", - "args": [ - { - "type": "address", - "name": "address", - "desc": "Address to get roles for" - } - ], - "returns": { - "type": "(bool,bool,bool,bool,bool)", - "desc": "Roles mask: (Account Manager, Primary Dealer, Trustee, Authority, Interest Oracle)" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Non-normative - Get roles assigned to an address", - "events": [], - "recommendations": {} - }, - { - "name": "rbac_get_role_config", - "args": [ - { - "type": "uint8", - "name": "role_id", - "desc": "Role Identifier" - }, - { - "type": "address", - "name": "role_address", - "desc": "Account Role Address" - } - ], - "returns": { - "type": "(uint64,uint64)", - "struct": "RoleConfig", - "desc": "Role configuration" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Get role configuration", - "events": [], - "recommendations": {} - } - ], - "arcs": [ - 22, - 28 - ], - "desc": "\n Accounting Module for testing\n ", - "networks": {}, - "state": { - "schema": { - "global": { - "ints": 6, - "bytes": 2 - }, - "local": { - "ints": 0, - "bytes": 0 - } - }, - "keys": { - "global": { - "arranger": { - "keyType": "AVMBytes", - "valueType": "address", - "key": "UjIwIw==" - }, - "op_daemon": { - "keyType": "AVMBytes", - "valueType": "address", - "key": "UjI1Iw==" - }, - "asset_suspended": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "YXNzZXRfc3VzcGVuZGVk" - }, - "asset_defaulted": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "YXNzZXRfZGVmYXVsdGVk" - }, - "total_units": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "dG90YWxfdW5pdHM=" - }, - "circulating_units": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "Y2lyY3VsYXRpbmdfdW5pdHM=" - }, - "unit_value": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "dW5pdF92YWx1ZQ==" - }, - "status": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "c3RhdHVz" - } - }, - "local": {}, - "box": {} - }, - "maps": { - "global": {}, - "local": {}, - "box": { - "account_manager": { - "keyType": "address", - "valueType": "RoleConfig", - "prefix": "UjQwIw==" - }, - "primary_dealer": { - "keyType": "address", - "valueType": "RoleConfig", - "prefix": "UjUwIw==" - }, - "trustee": { - "keyType": "address", - "valueType": "RoleConfig", - "prefix": "UjYwIw==" - }, - "authority": { - "keyType": "address", - "valueType": "RoleConfig", - "prefix": "UjcwIw==" - }, - "interest_oracle": { - "keyType": "address", - "valueType": "RoleConfig", - "prefix": "UjgwIw==" - }, - "account": { - "keyType": "address", - "valueType": "AccountInfo", - "prefix": "UjMwIw==" - } - } - } - }, - "bareActions": { - "create": [ - "NoOp" - ], - "call": [] - }, - "sourceInfo": { - "approval": { - "sourceInfo": [ - { - "pc": [ - 1281 - ], - "errorMessage": "Defaulted" - }, - { - "pc": [ - 329, - 402, - 455, - 538, - 568 - ], - "errorMessage": "Invalid account holding address" - }, - { - "pc": [ - 706, - 730, - 754, - 777, - 801, - 856, - 884, - 906, - 927, - 949, - 1125, - 1142, - 1157, - 1172, - 1186 - ], - "errorMessage": "Invalid account role address" - }, - { - "pc": [ - 841, - 1115, - 1342 - ], - "errorMessage": "Invalid role identifier" - }, - { - "pc": [ - 319, - 374, - 385, - 443, - 522, - 971, - 1273 - ], - "errorMessage": "Not authorized" - }, - { - "pc": [ - 1289 - ], - "errorMessage": "Suspended operations" - }, - { - "pc": [ - 1233, - 1248 - ], - "errorMessage": "check BoxMap entry exists" - }, - { - "pc": [ - 988, - 1271 - ], - "errorMessage": "check self.arranger exists" - }, - { - "pc": [ - 1279 - ], - "errorMessage": "check self.asset_defaulted exists" - }, - { - "pc": [ - 1287 - ], - "errorMessage": "check self.asset_suspended exists" - }, - { - "pc": [ - 470 - ], - "errorMessage": "check self.circulating_units exists" - }, - { - "pc": [ - 379 - ], - "errorMessage": "check self.status exists" - }, - { - "pc": [ - 647 - ], - "errorMessage": "invalid array length header" - }, - { - "pc": [ - 310, - 962 - ], - "errorMessage": "invalid number of bytes for arc4.bool" - }, - { - "pc": [ - 655 - ], - "errorMessage": "invalid number of bytes for arc4.dynamic_array" - }, - { - "pc": [ - 302, - 359, - 367, - 436, - 508, - 516, - 559, - 584, - 607, - 641, - 825, - 1002, - 1085 - ], - "errorMessage": "invalid number of bytes for arc4.static_array" - }, - { - "pc": [ - 631, - 815, - 1075 - ], - "errorMessage": "invalid number of bytes for arc4.uint8" - } - ], - "pcOffsetMethod": "none" - }, - "clear": { - "sourceInfo": [], - "pcOffsetMethod": "none" - } - }, - "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMzIgMjAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAweDUyMzIzMDIzIDB4NTIzNzMwMjMgMHg1MjM0MzAyMyAweDUyMzMzMDIzIDB4NTIzNTMwMjMgMHg1MjM2MzAyMyAweDUyMzgzMDIzICJhc3NldF9zdXNwZW5kZWQiICJjaXJjdWxhdGluZ191bml0cyIgInN0YXR1cyIgMHg1MjMyMzUyMyAiYXNzZXRfZGVmYXVsdGVkIgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwLTMxCiAgICAvLyAjIFJCQUMgUm9sZXMKICAgIC8vIHNlbGYuYXJyYW5nZXIgPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX0FSUkFOR0VSKQogICAgYnl0ZWNfMSAvLyAweDUyMzIzMDIzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzIKICAgIC8vIHNlbGYub3BfZGFlbW9uID0gR2xvYmFsU3RhdGUoQWNjb3VudCgpLCBrZXk9Y3N0LlBSRUZJWF9JRF9PUF9EQUVNT04pCiAgICBieXRlYyAxMSAvLyAweDUyMzIzNTIzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NDctNDgKICAgIC8vICMgRC1BU0EgR292ZXJuYW5jZQogICAgLy8gc2VsZi5hc3NldF9zdXNwZW5kZWQgPSBGYWxzZQogICAgYnl0ZWMgOCAvLyAiYXNzZXRfc3VzcGVuZGVkIgogICAgaW50Y18xIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NDkKICAgIC8vIHNlbGYuYXNzZXRfZGVmYXVsdGVkID0gRmFsc2UKICAgIGJ5dGVjIDEyIC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBpbnRjXzEgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxOQogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IFVJbnQ2NCgpCiAgICBwdXNoYnl0ZXMgInRvdGFsX3VuaXRzIgogICAgaW50Y18xIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjAKICAgIC8vIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgPSBVSW50NjQoKQogICAgYnl0ZWMgOSAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBpbnRjXzEgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMQogICAgLy8gc2VsZi51bml0X3ZhbHVlID0gVUludDY0KCkKICAgIHB1c2hieXRlcyAidW5pdF92YWx1ZSIKICAgIGludGNfMSAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIyCiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbm0uU1RBVFVTX0lOQUNUSVZFKQogICAgYnl0ZWMgMTAgLy8gInN0YXR1cyIKICAgIGludGNfMSAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbW9ja19tb2R1bGVfYWNjb3VudGluZy9jb250cmFjdC5weTo2CiAgICAvLyBjbGFzcyBNb2NrQWNjb3VudGluZ01vZHVsZShBY2NvdW50aW5nTW9kdWxlKToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX2NyZWF0ZUAyMgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4ZGMwNjNiMzUgMHgxNGZjMTBlZiAweDRjMTEzZWQ1IDB4NzRhNzI5N2YgMHgxMDVjMTg0ZSAweDgyZjcxYjJkIDB4ZWYwNGY1ZDMgMHgwM2I4MzMyOSAweDNkYmU4MGJkIDB4ZGY1NGU4MmMgMHgwMTBjODI5OSAweDc0MDZhY2QyIDB4YzNlNGIyOTcgLy8gbWV0aG9kICJhY2NvdW50X2dvdl9zdXNwZW5zaW9uKGFkZHJlc3MsYm9vbCl1aW50NjQiLCBtZXRob2QgImFjY291bnRfb3BlbihhZGRyZXNzLGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X2Nsb3NlKGFkZHJlc3MpKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJhY2NvdW50X3VwZGF0ZV9wYXltZW50X2FkZHJlc3MoYWRkcmVzcyxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAiYWNjb3VudF9nZXRfaW5mbyhhZGRyZXNzKShhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LGJvb2wpIiwgbWV0aG9kICJyYmFjX3JvdGF0ZV9hcnJhbmdlcihhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19zZXRfb3BfZGFlbW9uKGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX2Fzc2lnbl9yb2xlKHVpbnQ4LGFkZHJlc3MsYnl0ZVtdKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19yZXZva2Vfcm9sZSh1aW50OCxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19nb3ZfYXNzZXRfc3VzcGVuc2lvbihib29sKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19nZXRfYXJyYW5nZXIoKWFkZHJlc3MiLCBtZXRob2QgInJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXMoYWRkcmVzcykoYm9vbCxib29sLGJvb2wsYm9vbCxib29sKSIsIG1ldGhvZCAicmJhY19nZXRfcm9sZV9jb25maWcodWludDgsYWRkcmVzcykodWludDY0LHVpbnQ2NCkiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBhY2NvdW50X2dvdl9zdXNwZW5zaW9uIGFjY291bnRfb3BlbiBhY2NvdW50X2Nsb3NlIGFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzcyBhY2NvdW50X2dldF9pbmZvIHJiYWNfcm90YXRlX2FycmFuZ2VyIHJiYWNfc2V0X29wX2RhZW1vbiByYmFjX2Fzc2lnbl9yb2xlIHJiYWNfcmV2b2tlX3JvbGUgcmJhY19nb3ZfYXNzZXRfc3VzcGVuc2lvbiByYmFjX2dldF9hcnJhbmdlciByYmFjX2dldF9hZGRyZXNzX3JvbGVzIHJiYWNfZ2V0X3JvbGVfY29uZmlnCiAgICBlcnIKCm1haW5fY3JlYXRlQDIyOgogICAgLy8gc21hcnRfY29udHJhY3RzL21vY2tfbW9kdWxlX2FjY291bnRpbmcvY29udHJhY3QucHk6MTQKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbW9ja19tb2R1bGVfYWNjb3VudGluZy9jb250cmFjdC5weToxNgogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IFR4bi5zZW5kZXIKICAgIGJ5dGVjXzEgLy8gMHg1MjMyMzAyMwogICAgdHhuIFNlbmRlcgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tb2NrX21vZHVsZV9hY2NvdW50aW5nL2NvbnRyYWN0LnB5OjE0CiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF9nb3Zfc3VzcGVuc2lvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfZ292X3N1c3BlbnNpb246CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6OTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18xIC8vIDAKICAgIGdldGJpdAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojc3CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlY18yIC8vIDB4NTIzNzMwMjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozMQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgNCAvLyAweDUyMzMzMDIzCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTE0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGR1cAogICAgcHVzaGludCA1NgogICAgaW50Y18wIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIHB1c2hpbnQgNTYKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTE1CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF9vcGVuW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF9vcGVuOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjY4CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hY2NvdW50X21hbmFnZXIsIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlY18zIC8vIDB4NTIzNDMwMjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyOAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGVubS5TVEFUVVNfRU5ERUQKICAgIGludGNfMSAvLyAwCiAgICBieXRlYyAxMCAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgMjAwCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzOQogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLnN0YXR1c19pc19lbmRlZCgpLCBlcnIuVU5BVVRIT1JJWkVECiAgICAhCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNDAKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE0MQogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTQyCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgNCAvLyAweDUyMzMzMDIzCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTQ2CiAgICAvLyB1bml0cz1VSW50NjQoMCksCiAgICBpbnRjXzEgLy8gMAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE0NC0xNTAKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gdHlwLkFjY291bnRJbmZvKAogICAgLy8gICAgIHBheW1lbnRfYWRkcmVzcz1wYXltZW50X2FkZHJlc3MsCiAgICAvLyAgICAgdW5pdHM9VUludDY0KDApLAogICAgLy8gICAgIHVuaXRfdmFsdWU9VUludDY0KDApLAogICAgLy8gICAgIHBhaWRfY291cG9ucz1VSW50NjQoMCksCiAgICAvLyAgICAgc3VzcGVuZGVkPUZhbHNlLAogICAgLy8gKQogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDAwCiAgICBjb25jYXQKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNTEKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF9jbG9zZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfY2xvc2U6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTUzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjY4CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hY2NvdW50X21hbmFnZXIsIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlY18zIC8vIDB4NTIzNDMwMjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNzEKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjMxCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA0IC8vIDB4NTIzMzMwMjMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTc0CiAgICAvLyBjbG9zZWRfdW5pdHMgPSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cwogICAgZHVwCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIGludGNfMiAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTc1CiAgICAvLyBkZWwgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE3NgogICAgLy8gc2VsZi5jaXJjdWxhdGluZ191bml0cyAtPSBjbG9zZWRfdW5pdHMKICAgIGludGNfMSAvLyAwCiAgICBieXRlYyA5IC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIHN3YXAKICAgIC0KICAgIGJ5dGVjIDkgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NDgKICAgIC8vIGlmIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgPT0gVUludDY0KDApOgogICAgYm56IGFjY291bnRfY2xvc2VfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NDkKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGVubS5TVEFUVVNfRU5ERUQpCiAgICBieXRlYyAxMCAvLyAic3RhdHVzIgogICAgcHVzaGludCAyMDAKICAgIGFwcF9nbG9iYWxfcHV0CgphY2NvdW50X2Nsb3NlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNzgKICAgIC8vIHJldHVybiBjbG9zZWRfdW5pdHMsIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTUzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGRpZyAxCiAgICBpdG9iCiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5hY2NvdW50X3VwZGF0ZV9wYXltZW50X2FkZHJlc3Nbcm91dGluZ10oKSAtPiB2b2lkOgphY2NvdW50X3VwZGF0ZV9wYXltZW50X2FkZHJlc3M6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjAwCiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIGRpZyAyCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjAxCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMDIKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjMxCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA0IC8vIDB4NTIzMzMwMjMKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMDQKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcyA9IHBheW1lbnRfYWRkcmVzcwogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMDUKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF9nZXRfaW5mb1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfZ2V0X2luZm86CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjA3CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjMxCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA0IC8vIDB4NTIzMzMwMjMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjIyCiAgICAvLyByZXR1cm4gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIwNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19yb3RhdGVfYXJyYW5nZXJbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3JvdGF0ZV9hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTU4CiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTU5CiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gbmV3X2FycmFuZ2VyCiAgICBieXRlY18xIC8vIDB4NTIzMjMwMjMKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTYwCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfc2V0X29wX2RhZW1vbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfc2V0X29wX2RhZW1vbjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTczCiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTc0CiAgICAvLyBzZWxmLm9wX2RhZW1vbi52YWx1ZSA9IGFkZHJlc3MKICAgIGJ5dGVjIDExIC8vIDB4NTIzMjM1MjMKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTc1CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfYXNzaWduX3JvbGVbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2Fzc2lnbl9yb2xlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE3NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTk5CiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAwCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDEKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCkpCiAgICBidG9pCiAgICBkdXBuIDIKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTAxCiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUik6CiAgICBpbnRjXzMgLy8gMjAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwMgogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IHJvbGVfYWRkcmVzcwogICAgYnl0ZWNfMSAvLyAweDUyMzIzMDIzCiAgICBkaWcgMwogICAgYXBwX2dsb2JhbF9wdXQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fdXBzZXJ0X3JvbGVAMTQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAzCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA1CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDQwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDYKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjXzMgLy8gMHg1MjM0MzAyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA3CiAgICAvLyBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcyhjb25maWcpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwMgogICAgLy8gc2VsZi5fdXBzZXJ0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCBjb25maWcpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fdXBzZXJ0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwOQogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTAKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgNSAvLyAweDUyMzUzMDIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTEKICAgIC8vIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDIKICAgIC8vIHNlbGYuX3Vwc2VydF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgY29uZmlnKQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3Vwc2VydF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTMKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGNzdC5ST0xFX1RSVVNURUUpOgogICAgZHVwCiAgICBwdXNoaW50IDYwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTQKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyA2IC8vIDB4NTIzNjMwMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNQogICAgLy8gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZykKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAyCiAgICAvLyBzZWxmLl91cHNlcnRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIGNvbmZpZykKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl91cHNlcnRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE3CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE4CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlY18yIC8vIDB4NTIzNzMwMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExOQogICAgLy8gc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDIKICAgIC8vIHNlbGYuX3Vwc2VydF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgY29uZmlnKQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3Vwc2VydF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMTE6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIxCiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpOgogICAgZHVwCiAgICBwdXNoaW50IDgwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl91cHNlcnRfcm9sZUAxNAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMgogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgNyAvLyAweDUyMzgzMDIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjMKICAgIC8vIHNlbGYuaW50ZXJlc3Rfb3JhY2xlW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZykKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fdXBzZXJ0X3JvbGVAMTQKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3Jldm9rZV9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19yZXZva2Vfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjQKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjUKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNgogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjYKICAgIC8vIGFzc2VydCByb2xlX2lkICE9IFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksIGVyci5JTlZBTElEX1JPTEUKICAgIGR1cAogICAgaW50Y18zIC8vIDIwCiAgICAhPQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI3CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI4CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjXzMgLy8gMHg1MjM0MzAyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI5CiAgICAvLyBkZWwgc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyOAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjA1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMQogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzIKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyA1IC8vIDB4NTIzNTMwMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMwogICAgLy8gZGVsIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI3CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNQogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNjAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNgogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgNiAvLyAweDUyMzYzMDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzcKICAgIC8vIGRlbCBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI3CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzOQogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKToKICAgIGR1cAogICAgcHVzaGludCA3MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQwCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjXzIgLy8gMHg1MjM3MzAyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQxCiAgICAvLyBkZWwgc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI3CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MwogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKToKICAgIGR1cAogICAgcHVzaGludCA4MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDQKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgNyAvLyAweDUyMzgzMDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDUKICAgIC8vIGRlbCBzZWxmLmludGVyZXN0X29yYWNsZVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ292X2Fzc2V0X3N1c3BlbnNpb25bcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dvdl9hc3NldF9zdXNwZW5zaW9uOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kICAjIFRPRE86IFVwZGF0ZSBzcGVjcyBhbmQgYWRkIHRlc3QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzEgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzcKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjXzIgLy8gMHg1MjM3MzAyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0NgogICAgLy8gc2VsZi5hc3NldF9zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGJ5dGVjIDggLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjQ3CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCAgIyBUT0RPOiBVcGRhdGUgc3BlY3MgYW5kIGFkZCB0ZXN0CiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYXJyYW5nZXJbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTcKICAgIC8vIHJldHVybiBzZWxmLmFycmFuZ2VyLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMSAvLyAweDUyMzIzMDIzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJyYW5nZXIgZXhpc3RzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjQ5CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9hZGRyZXNzX3JvbGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfYWRkcmVzc19yb2xlczoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjczCiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmFjY291bnRfbWFuYWdlciwgYWRkcmVzcyksCiAgICBieXRlY18zIC8vIDB4NTIzNDMwMjMKICAgIGRpZyAxCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3NAogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5wcmltYXJ5X2RlYWxlciwgYWRkcmVzcyksCiAgICBieXRlYyA1IC8vIDB4NTIzNTMwMjMKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3NQogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi50cnVzdGVlLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDYgLy8gMHg1MjM2MzAyMwogICAgZGlnIDMKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjc2CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgYWRkcmVzcyksCiAgICBieXRlY18yIC8vIDB4NTIzNzMwMjMKICAgIGRpZyA0CiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3NwogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5pbnRlcmVzdF9vcmFjbGUsIGFkZHJlc3MpLAogICAgYnl0ZWMgNyAvLyAweDUyMzgzMDIzCiAgICB1bmNvdmVyIDUKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHB1c2hieXRlcyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciA2CiAgICBzZXRiaXQKICAgIGludGNfMCAvLyAxCiAgICB1bmNvdmVyIDUKICAgIHNldGJpdAogICAgcHVzaGludCAyCiAgICB1bmNvdmVyIDQKICAgIHNldGJpdAogICAgcHVzaGludCAzCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgcHVzaGludCA0CiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfY29uZmlnW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfcm9sZV9jb25maWc6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjk0CiAgICAvLyByb2xlID0gcm9sZV9pZC5hc191aW50NjQoKQogICAgYnRvaQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5NQogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZSkKICAgIGR1cAogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTcKICAgIC8vIGNhc2UgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKToKICAgIGludGNfMyAvLyAyMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwMQogICAgLy8gY2FzZSBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIHB1c2hpbnRzIDQwIDUwIDYwIDcwIDgwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjk2LTMyNwogICAgLy8gbWF0Y2ggcm9sZToKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUik6CiAgICAvLyAgICAgICAgIHJldHVybiB0eXAuUm9sZUNvbmZpZygKICAgIC8vICAgICAgICAgICAgIHJvbGVfdmFsaWRpdHlfc3RhcnQ9VUludDY0KDApLCByb2xlX3ZhbGlkaXR5X2VuZD1VSW50NjQoMCkKICAgIC8vICAgICAgICAgKQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLnByaW1hcnlfZGVhbGVyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSk6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5pbnRlcmVzdF9vcmFjbGUsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYuaW50ZXJlc3Rfb3JhY2xlW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIF86CiAgICAvLyAgICAgICAgIG9wLmVycihlcnIuSU5WQUxJRF9ST0xFKQogICAgdW5jb3ZlciA2CiAgICBtYXRjaCByYmFjX2dldF9yb2xlX2NvbmZpZ19zd2l0Y2hfY2FzZV8wQDIgcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfMUAzIHJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzJANCByYmFjX2dldF9yb2xlX2NvbmZpZ19zd2l0Y2hfY2FzZV8zQDUgcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfNEA2IHJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzVANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyNwogICAgLy8gb3AuZXJyKGVyci5JTlZBTElEX1JPTEUpCiAgICBlcnIgLy8gSW52YWxpZCByb2xlIGlkZW50aWZpZXIKCnJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzVANzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjMKICAgIC8vIHNlbGYuaW50ZXJlc3Rfb3JhY2xlLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDcgLy8gMHg1MjM4MzAyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMi0zMjQKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLmludGVyZXN0X29yYWNsZSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI1CiAgICAvLyByZXR1cm4gc2VsZi5pbnRlcmVzdF9vcmFjbGVbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCgpyYmFjX2dldF9yb2xlX2NvbmZpZ19hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfY29uZmlnQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCnJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzRANjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTgKICAgIC8vIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjXzIgLy8gMHg1MjM3MzAyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLmF1dGhvcml0eSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzIwCiAgICAvLyByZXR1cm4gc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV9jb25maWdfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX2NvbmZpZ0A5CgpyYmFjX2dldF9yb2xlX2NvbmZpZ19zd2l0Y2hfY2FzZV8zQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEzCiAgICAvLyBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgNiAvLyAweDUyMzYzMDIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEyLTMxNAogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzE1CiAgICAvLyByZXR1cm4gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfY29uZmlnX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV9jb25maWdAOQoKcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfMkA0OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwOAogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyA1IC8vIDB4NTIzNTMwMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDctMzA5CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEwCiAgICAvLyByZXR1cm4gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX2NvbmZpZ19hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfY29uZmlnQDkKCnJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzFAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDMKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjXzMgLy8gMHg1MjM0MzAyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwMi0zMDQKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLmFjY291bnRfbWFuYWdlciwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA1CiAgICAvLyByZXR1cm4gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV9jb25maWdfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX2NvbmZpZ0A5CgpyYmFjX2dldF9yb2xlX2NvbmZpZ19zd2l0Y2hfY2FzZV8wQDI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjk4LTMwMAogICAgLy8gcmV0dXJuIHR5cC5Sb2xlQ29uZmlnKAogICAgLy8gICAgIHJvbGVfdmFsaWRpdHlfc3RhcnQ9VUludDY0KDApLCByb2xlX3ZhbGlkaXR5X2VuZD1VSW50NjQoMCkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV9jb25maWdfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX2NvbmZpZ0A5CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3JvbGVfaXNfYWN0aXZlKHJvbGVfbWFwOiBieXRlcywgcm9sZV9hZGRyZXNzOiBieXRlcykgLT4gdWludDY0Ogpfcm9sZV9pc19hY3RpdmU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTcKICAgIC8vIGRlZiBfcm9sZV9pc19hY3RpdmUoc2VsZiwgcm9sZV9tYXA6IHR5cC5SYmFjUm9sZSwgcm9sZV9hZGRyZXNzOiBBY2NvdW50KSAtPiBib29sOgogICAgcHJvdG8gMiAxCiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OC02MgogICAgLy8gcmV0dXJuIHNlbGYuX2hhc19yb2xlKHJvbGVfbWFwLCByb2xlX2FkZHJlc3MpIGFuZCAoCiAgICAvLyAgICAgcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICAvLyApCiAgICBieiBfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTkKICAgIC8vIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBCb3hNYXAgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2MAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTktNjAKICAgIC8vIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIDw9CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTktNjEKICAgIC8vIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IF9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2MQogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBCb3hNYXAgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDgKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAtNjEKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgPj0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgaW50Y18wIC8vIDEKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX21lcmdlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzEgLy8gMAogICAgYiBfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpIC0+IHZvaWQ6CmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjUKICAgIC8vIGFzc2VydCBzZWxmLl9pc19hcnJhbmdlcihUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjUyCiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzID09IHNlbGYuYXJyYW5nZXIudmFsdWUKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18xIC8vIDB4NTIzMjMwMjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcnJhbmdlciBleGlzdHMKICAgID09CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjUKICAgIC8vIGFzc2VydCBzZWxmLl9pc19hcnJhbmdlcihUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpIC0+IHZvaWQ6CmFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjgzCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYXNzZXRfZGVmYXVsdGVkLCBlcnIuREVGQVVMVEVECiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgMTIgLy8gImFzc2V0X2RlZmF1bHRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9kZWZhdWx0ZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRGVmYXVsdGVkCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpIC0+IHZvaWQ6CmFzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg2CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYXNzZXRfc3VzcGVuZGVkLCBlcnIuU1VTUEVOREVECiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgOCAvLyAiYXNzZXRfc3VzcGVuZGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X3N1c3BlbmRlZCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBTdXNwZW5kZWQgb3BlcmF0aW9ucwogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGVfaWQ6IHVpbnQ2NCkgLT4gdm9pZDoKX2Fzc2VydF92YWxpZF9yb2xlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg4CiAgICAvLyBkZWYgX2Fzc2VydF92YWxpZF9yb2xlKHNlbGYsIHJvbGVfaWQ6IFVJbnQ2NCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk2CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkwCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgaW50Y18zIC8vIDIwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTYKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkxCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIHB1c2hpbnQgNDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTIKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICBwdXNoaW50IDUwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTYKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkzCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICBwdXNoaW50IDYwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTYKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojk0CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIHB1c2hpbnQgNzAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTUKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgcHVzaGludCA4MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk2CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBieiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9mYWxzZUA3CgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDY6CiAgICBpbnRjXzAgLy8gMQoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfbWVyZ2VAODoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBhc3NlcnQgLy8gSW52YWxpZCByb2xlIGlkZW50aWZpZXIKICAgIHJldHN1YgoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfZmFsc2VANzoKICAgIGludGNfMSAvLyAwCiAgICBiIF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX21lcmdlQDgK", - "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" - }, - "byteCode": { - "approval": "CyAEAQAgFCYNBBUffHUEUjIwIwRSNzAjBFI0MCMEUjMwIwRSNTAjBFI2MCMEUjgwIw9hc3NldF9zdXNwZW5kZWQRY2lyY3VsYXRpbmdfdW5pdHMGc3RhdHVzBFIyNSMPYXNzZXRfZGVmYXVsdGVkMRhAADYpMgNnJwsyA2cnCCNnJwwjZ4ALdG90YWxfdW5pdHMjZycJI2eACnVuaXRfdmFsdWUjZycKI2cxG0EAajEZFEQxGESCDQTcBjs1BBT8EO8ETBE+1QR0pyl/BBBcGE4EgvcbLQTvBPXTBAO4MykEPb6AvQTfVOgsBAEMgpkEdAas0gTD5LKXNhoAjg0ADwBIAJUA3QEQASkBQAFYAhACowLBAssDFAAxGRQxGBQQRCkxAGciQzYaAUkVJBJENhoCSRUiEkQjUyoxAIgDfkQnBE8CUEm9RQFESYE4IrojTwNUgThMuzIHFihMULAiQzYaAUkVJBJENhoCSRUkEkQrMQCIA0dEIycKZUSByAESFESIA3aIA3snBE8CUEm9RQEURCMWTwJLAVBLAVBMUIABAFC/MgcWKExQsCJDNhoBSRUkEkQrMQCIAwJEiAM8JwRMUEm9RQFESb5IJFtJTwK8SCMnCWVETAknCUsBZ0AABicKgcgBZzIHSwEWTBZQKExQsCJDNhoBSRUkEkQ2GgJJFSQSRDEASwISRIgC7YgC8icETwJQSb1FAUQjTwK7MgcWKExQsCJDNhoBSRUkEkQnBExQSb1FAUS+SChMULAiQzYaAUkVJBJEiAKmKUxnMgcWKExQsCJDNhoBSRUkEkSIAo8nC0xnMgcWKExQsCJDNhoBSRUiEkQ2GgJJTgIVJBJENhoDSSNZgQIISwEVEkRXAgBMiAJbiAJhF0cCiAJrJRJBAA0pSwNnMgcWKExQsCJDSYEoEkEAECtLA1BJvUUBFERLAr9C/+BJgTISQQARJwVLA1BJvUUBFERLAr9C/8hJgTwSQQARJwZLA1BJvUUBFERLAr9C/7BJgUYSQQAQKksDUEm9RQEUREsCv0L/mUmBUBJB/5InB0sDUEm9RQEUREsCv0L/gTYaAUkVIhJENhoCSU4CFSQSRIgBtYgBuxdHAogBxUklE0SBKBJBABQrSwJQSb1FAUS8SDIHFihMULAiQ0mBMhJBAA8nBUsCUEm9RQFEvEhC/+FJgTwSQQAPJwZLAlBJvUUBRLxIQv/LSYFGEkEADipLAlBJvUUBRLxIQv+2SYFQEkH/rycHSwJQSb1FAUS8SEL/oDYaAUkVIhJEI1MqMQCIAPJEJwhMZzIHFihMULAiQyMpZUQoTFCwIkM2GgFJFSQSRCtLAYgAzCcFSwKIAMUnBksDiAC+KksEiAC4JwdPBYgAsYABACNPBlQiTwVUgQJPBFSBA08DVIEETwJUKExQsCJDNhoBSRUiEkQ2GgJJTgIVJBJEF0mIAMglgwUoMjxGUE8GjgYATQA/ADAAIQATAAEAJwdLAVBJvUUBRL5IKExQsCJDKksBUEm9RQFEvkhC/+wnBksBUEm9RQFEvkhC/90nBUsBUEm9RQFEvkhC/84rSwFQSb1FAUS+SEL/wIAQAAAAAAAAAAAAAAAAAAAAAEL/q4oCAYAAi/6L/1BJvUUBQQAgiwG+RCNbMgdJjAAOQQARiwG+RIEIW4sAD0EABCKMAIkjQv/5MQAjKWVEEkSJIycMZUQURIkjJwhlRBREiYoBAIv/JRJAACiL/4EoEkAAIIv/gTISQAAYi/+BPBJAABCL/4FGEkAACIv/gVASQQADIkSJI0L/+g==", - "clear": "C4EBQw==" - }, - "compilerInfo": { - "compiler": "puya", - "compilerVersion": { - "major": 5, - "minor": 7, - "patch": 1 - } - }, - "events": [], - "templateVariables": {} -} \ No newline at end of file diff --git a/smart_contracts/artifacts/mock_module_accounting/MockAccountingModule.clear.puya.map b/smart_contracts/artifacts/mock_module_accounting/MockAccountingModule.clear.puya.map deleted file mode 100644 index d580b5c4..00000000 --- a/smart_contracts/artifacts/mock_module_accounting/MockAccountingModule.clear.puya.map +++ /dev/null @@ -1,25 +0,0 @@ -{ - "version": 3, - "sources": [], - "mappings": ";;;", - "op_pc_offset": 0, - "pc_events": { - "1": { - "subroutine": "algopy.arc4.ARC4Contract.clear_state_program", - "params": {}, - "block": "main", - "stack_in": [], - "op": "pushint 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "3": { - "op": "return", - "stack_out": [] - } - } -} \ No newline at end of file diff --git a/smart_contracts/artifacts/mock_module_accounting/MockAccountingModule.clear.teal b/smart_contracts/artifacts/mock_module_accounting/MockAccountingModule.clear.teal deleted file mode 100644 index 75f539be..00000000 --- a/smart_contracts/artifacts/mock_module_accounting/MockAccountingModule.clear.teal +++ /dev/null @@ -1,7 +0,0 @@ -#pragma version 11 -#pragma typetrack false - -// algopy.arc4.ARC4Contract.clear_state_program() -> uint64: -main: - pushint 1 - return diff --git a/smart_contracts/artifacts/mock_module_accounting/mock_accounting_module_client.py b/smart_contracts/artifacts/mock_module_accounting/mock_accounting_module_client.py deleted file mode 100644 index cc76b79c..00000000 --- a/smart_contracts/artifacts/mock_module_accounting/mock_accounting_module_client.py +++ /dev/null @@ -1,2065 +0,0 @@ -# flake8: noqa -# fmt: off -# mypy: ignore-errors -# This file was automatically generated by algokit-client-generator. -# DO NOT MODIFY IT BY HAND. -# requires: algokit-utils@^3.0.0 - -# common -import dataclasses -import typing -# core algosdk -import algosdk -from algosdk.transaction import OnComplete -from algosdk.atomic_transaction_composer import TransactionSigner -from algosdk.source_map import SourceMap -from algosdk.transaction import Transaction -from algosdk.v2client.models import SimulateTraceConfig -# utils -import algokit_utils -from algokit_utils import AlgorandClient as _AlgoKitAlgorandClient - -_APP_SPEC_JSON = r"""{"arcs": [22, 28], "bareActions": {"call": [], "create": ["NoOp"]}, "methods": [{"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "bool", "desc": "Suspension status", "name": "suspended"}], "name": "account_gov_suspension", "returns": {"type": "uint64", "desc": "Timestamp of the set account suspension status"}, "desc": "Set account suspension status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "address", "desc": "Account Payment Address", "name": "payment_address"}], "name": "account_open", "returns": {"type": "uint64", "desc": "Timestamp of the account opening"}, "desc": "Open D-ASA account", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}], "name": "account_close", "returns": {"type": "(uint64,uint64)", "desc": "Closed units, Timestamp of the account closing"}, "desc": "Close D-ASA account", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "address", "desc": "Account Payment Address", "name": "payment_address"}], "name": "account_update_payment_address", "returns": {"type": "uint64", "desc": "Timestamp of the account update"}, "desc": "Update the Payment Address of an account", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}], "name": "account_get_info", "returns": {"type": "(address,uint64,uint64,uint64,bool)", "desc": "Payment Address, D-ASA units, Unit nominal value in denomination asset, Paid coupons, Suspended", "struct": "AccountInfo"}, "desc": "Get account info", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "New Arranger address", "name": "new_arranger"}], "name": "rbac_rotate_arranger", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Rotate the Arranger address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Operation Daemon address", "name": "address"}], "name": "rbac_set_op_daemon", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Non-Normative: Set the Operation Daemon address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}, {"type": "byte[]", "desc": "Role configuration (Optional)", "name": "config"}], "name": "rbac_assign_role", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Assign a role to an address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}], "name": "rbac_revoke_role", "returns": {"type": "uint64", "desc": "Timestamp of the role revocation"}, "desc": "Revoke a role from an address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Suspension status", "name": "suspended"}], "name": "rbac_gov_asset_suspension", "returns": {"type": "uint64", "desc": "Timestamp of the set asset suspension status"}, "desc": "Set asset suspension status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "rbac_get_arranger", "returns": {"type": "address", "desc": "Arranger address"}, "desc": "Get Arranger address", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Address to get roles for", "name": "address"}], "name": "rbac_get_address_roles", "returns": {"type": "(bool,bool,bool,bool,bool)", "desc": "Roles mask: (Account Manager, Primary Dealer, Trustee, Authority, Interest Oracle)"}, "desc": "Non-normative - Get roles assigned to an address", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}], "name": "rbac_get_role_config", "returns": {"type": "(uint64,uint64)", "desc": "Role configuration", "struct": "RoleConfig"}, "desc": "Get role configuration", "events": [], "readonly": true, "recommendations": {}}], "name": "MockAccountingModule", "state": {"keys": {"box": {}, "global": {"arranger": {"key": "UjIwIw==", "keyType": "AVMBytes", "valueType": "address"}, "op_daemon": {"key": "UjI1Iw==", "keyType": "AVMBytes", "valueType": "address"}, "asset_suspended": {"key": "YXNzZXRfc3VzcGVuZGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "asset_defaulted": {"key": "YXNzZXRfZGVmYXVsdGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "total_units": {"key": "dG90YWxfdW5pdHM=", "keyType": "AVMString", "valueType": "AVMUint64"}, "circulating_units": {"key": "Y2lyY3VsYXRpbmdfdW5pdHM=", "keyType": "AVMString", "valueType": "AVMUint64"}, "unit_value": {"key": "dW5pdF92YWx1ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "status": {"key": "c3RhdHVz", "keyType": "AVMString", "valueType": "AVMUint64"}}, "local": {}}, "maps": {"box": {"account_manager": {"keyType": "address", "valueType": "RoleConfig", "prefix": "UjQwIw=="}, "primary_dealer": {"keyType": "address", "valueType": "RoleConfig", "prefix": "UjUwIw=="}, "trustee": {"keyType": "address", "valueType": "RoleConfig", "prefix": "UjYwIw=="}, "authority": {"keyType": "address", "valueType": "RoleConfig", "prefix": "UjcwIw=="}, "interest_oracle": {"keyType": "address", "valueType": "RoleConfig", "prefix": "UjgwIw=="}, "account": {"keyType": "address", "valueType": "AccountInfo", "prefix": "UjMwIw=="}}, "global": {}, "local": {}}, "schema": {"global": {"bytes": 2, "ints": 6}, "local": {"bytes": 0, "ints": 0}}}, "structs": {"AccountInfo": [{"name": "payment_address", "type": "address"}, {"name": "units", "type": "uint64"}, {"name": "unit_value", "type": "uint64"}, {"name": "paid_coupons", "type": "uint64"}, {"name": "suspended", "type": "bool"}], "RoleConfig": [{"name": "role_validity_start", "type": "uint64"}, {"name": "role_validity_end", "type": "uint64"}]}, "byteCode": {"approval": "CyAEAQAgFCYNBBUffHUEUjIwIwRSNzAjBFI0MCMEUjMwIwRSNTAjBFI2MCMEUjgwIw9hc3NldF9zdXNwZW5kZWQRY2lyY3VsYXRpbmdfdW5pdHMGc3RhdHVzBFIyNSMPYXNzZXRfZGVmYXVsdGVkMRhAADYpMgNnJwsyA2cnCCNnJwwjZ4ALdG90YWxfdW5pdHMjZycJI2eACnVuaXRfdmFsdWUjZycKI2cxG0EAajEZFEQxGESCDQTcBjs1BBT8EO8ETBE+1QR0pyl/BBBcGE4EgvcbLQTvBPXTBAO4MykEPb6AvQTfVOgsBAEMgpkEdAas0gTD5LKXNhoAjg0ADwBIAJUA3QEQASkBQAFYAhACowLBAssDFAAxGRQxGBQQRCkxAGciQzYaAUkVJBJENhoCSRUiEkQjUyoxAIgDfkQnBE8CUEm9RQFESYE4IrojTwNUgThMuzIHFihMULAiQzYaAUkVJBJENhoCSRUkEkQrMQCIA0dEIycKZUSByAESFESIA3aIA3snBE8CUEm9RQEURCMWTwJLAVBLAVBMUIABAFC/MgcWKExQsCJDNhoBSRUkEkQrMQCIAwJEiAM8JwRMUEm9RQFESb5IJFtJTwK8SCMnCWVETAknCUsBZ0AABicKgcgBZzIHSwEWTBZQKExQsCJDNhoBSRUkEkQ2GgJJFSQSRDEASwISRIgC7YgC8icETwJQSb1FAUQjTwK7MgcWKExQsCJDNhoBSRUkEkQnBExQSb1FAUS+SChMULAiQzYaAUkVJBJEiAKmKUxnMgcWKExQsCJDNhoBSRUkEkSIAo8nC0xnMgcWKExQsCJDNhoBSRUiEkQ2GgJJTgIVJBJENhoDSSNZgQIISwEVEkRXAgBMiAJbiAJhF0cCiAJrJRJBAA0pSwNnMgcWKExQsCJDSYEoEkEAECtLA1BJvUUBFERLAr9C/+BJgTISQQARJwVLA1BJvUUBFERLAr9C/8hJgTwSQQARJwZLA1BJvUUBFERLAr9C/7BJgUYSQQAQKksDUEm9RQEUREsCv0L/mUmBUBJB/5InB0sDUEm9RQEUREsCv0L/gTYaAUkVIhJENhoCSU4CFSQSRIgBtYgBuxdHAogBxUklE0SBKBJBABQrSwJQSb1FAUS8SDIHFihMULAiQ0mBMhJBAA8nBUsCUEm9RQFEvEhC/+FJgTwSQQAPJwZLAlBJvUUBRLxIQv/LSYFGEkEADipLAlBJvUUBRLxIQv+2SYFQEkH/rycHSwJQSb1FAUS8SEL/oDYaAUkVIhJEI1MqMQCIAPJEJwhMZzIHFihMULAiQyMpZUQoTFCwIkM2GgFJFSQSRCtLAYgAzCcFSwKIAMUnBksDiAC+KksEiAC4JwdPBYgAsYABACNPBlQiTwVUgQJPBFSBA08DVIEETwJUKExQsCJDNhoBSRUiEkQ2GgJJTgIVJBJEF0mIAMglgwUoMjxGUE8GjgYATQA/ADAAIQATAAEAJwdLAVBJvUUBRL5IKExQsCJDKksBUEm9RQFEvkhC/+wnBksBUEm9RQFEvkhC/90nBUsBUEm9RQFEvkhC/84rSwFQSb1FAUS+SEL/wIAQAAAAAAAAAAAAAAAAAAAAAEL/q4oCAYAAi/6L/1BJvUUBQQAgiwG+RCNbMgdJjAAOQQARiwG+RIEIW4sAD0EABCKMAIkjQv/5MQAjKWVEEkSJIycMZUQURIkjJwhlRBREiYoBAIv/JRJAACiL/4EoEkAAIIv/gTISQAAYi/+BPBJAABCL/4FGEkAACIv/gVASQQADIkSJI0L/+g==", "clear": "C4EBQw=="}, "desc": "\n Accounting Module for testing\n ", "events": [], "networks": {}, "source": {"approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMzIgMjAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAweDUyMzIzMDIzIDB4NTIzNzMwMjMgMHg1MjM0MzAyMyAweDUyMzMzMDIzIDB4NTIzNTMwMjMgMHg1MjM2MzAyMyAweDUyMzgzMDIzICJhc3NldF9zdXNwZW5kZWQiICJjaXJjdWxhdGluZ191bml0cyIgInN0YXR1cyIgMHg1MjMyMzUyMyAiYXNzZXRfZGVmYXVsdGVkIgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwLTMxCiAgICAvLyAjIFJCQUMgUm9sZXMKICAgIC8vIHNlbGYuYXJyYW5nZXIgPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX0FSUkFOR0VSKQogICAgYnl0ZWNfMSAvLyAweDUyMzIzMDIzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzIKICAgIC8vIHNlbGYub3BfZGFlbW9uID0gR2xvYmFsU3RhdGUoQWNjb3VudCgpLCBrZXk9Y3N0LlBSRUZJWF9JRF9PUF9EQUVNT04pCiAgICBieXRlYyAxMSAvLyAweDUyMzIzNTIzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NDctNDgKICAgIC8vICMgRC1BU0EgR292ZXJuYW5jZQogICAgLy8gc2VsZi5hc3NldF9zdXNwZW5kZWQgPSBGYWxzZQogICAgYnl0ZWMgOCAvLyAiYXNzZXRfc3VzcGVuZGVkIgogICAgaW50Y18xIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NDkKICAgIC8vIHNlbGYuYXNzZXRfZGVmYXVsdGVkID0gRmFsc2UKICAgIGJ5dGVjIDEyIC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBpbnRjXzEgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxOQogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IFVJbnQ2NCgpCiAgICBwdXNoYnl0ZXMgInRvdGFsX3VuaXRzIgogICAgaW50Y18xIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjAKICAgIC8vIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgPSBVSW50NjQoKQogICAgYnl0ZWMgOSAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBpbnRjXzEgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMQogICAgLy8gc2VsZi51bml0X3ZhbHVlID0gVUludDY0KCkKICAgIHB1c2hieXRlcyAidW5pdF92YWx1ZSIKICAgIGludGNfMSAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIyCiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbm0uU1RBVFVTX0lOQUNUSVZFKQogICAgYnl0ZWMgMTAgLy8gInN0YXR1cyIKICAgIGludGNfMSAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbW9ja19tb2R1bGVfYWNjb3VudGluZy9jb250cmFjdC5weTo2CiAgICAvLyBjbGFzcyBNb2NrQWNjb3VudGluZ01vZHVsZShBY2NvdW50aW5nTW9kdWxlKToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX2NyZWF0ZUAyMgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4ZGMwNjNiMzUgMHgxNGZjMTBlZiAweDRjMTEzZWQ1IDB4NzRhNzI5N2YgMHgxMDVjMTg0ZSAweDgyZjcxYjJkIDB4ZWYwNGY1ZDMgMHgwM2I4MzMyOSAweDNkYmU4MGJkIDB4ZGY1NGU4MmMgMHgwMTBjODI5OSAweDc0MDZhY2QyIDB4YzNlNGIyOTcgLy8gbWV0aG9kICJhY2NvdW50X2dvdl9zdXNwZW5zaW9uKGFkZHJlc3MsYm9vbCl1aW50NjQiLCBtZXRob2QgImFjY291bnRfb3BlbihhZGRyZXNzLGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X2Nsb3NlKGFkZHJlc3MpKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJhY2NvdW50X3VwZGF0ZV9wYXltZW50X2FkZHJlc3MoYWRkcmVzcyxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAiYWNjb3VudF9nZXRfaW5mbyhhZGRyZXNzKShhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LGJvb2wpIiwgbWV0aG9kICJyYmFjX3JvdGF0ZV9hcnJhbmdlcihhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19zZXRfb3BfZGFlbW9uKGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX2Fzc2lnbl9yb2xlKHVpbnQ4LGFkZHJlc3MsYnl0ZVtdKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19yZXZva2Vfcm9sZSh1aW50OCxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19nb3ZfYXNzZXRfc3VzcGVuc2lvbihib29sKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19nZXRfYXJyYW5nZXIoKWFkZHJlc3MiLCBtZXRob2QgInJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXMoYWRkcmVzcykoYm9vbCxib29sLGJvb2wsYm9vbCxib29sKSIsIG1ldGhvZCAicmJhY19nZXRfcm9sZV9jb25maWcodWludDgsYWRkcmVzcykodWludDY0LHVpbnQ2NCkiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBhY2NvdW50X2dvdl9zdXNwZW5zaW9uIGFjY291bnRfb3BlbiBhY2NvdW50X2Nsb3NlIGFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzcyBhY2NvdW50X2dldF9pbmZvIHJiYWNfcm90YXRlX2FycmFuZ2VyIHJiYWNfc2V0X29wX2RhZW1vbiByYmFjX2Fzc2lnbl9yb2xlIHJiYWNfcmV2b2tlX3JvbGUgcmJhY19nb3ZfYXNzZXRfc3VzcGVuc2lvbiByYmFjX2dldF9hcnJhbmdlciByYmFjX2dldF9hZGRyZXNzX3JvbGVzIHJiYWNfZ2V0X3JvbGVfY29uZmlnCiAgICBlcnIKCm1haW5fY3JlYXRlQDIyOgogICAgLy8gc21hcnRfY29udHJhY3RzL21vY2tfbW9kdWxlX2FjY291bnRpbmcvY29udHJhY3QucHk6MTQKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbW9ja19tb2R1bGVfYWNjb3VudGluZy9jb250cmFjdC5weToxNgogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IFR4bi5zZW5kZXIKICAgIGJ5dGVjXzEgLy8gMHg1MjMyMzAyMwogICAgdHhuIFNlbmRlcgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tb2NrX21vZHVsZV9hY2NvdW50aW5nL2NvbnRyYWN0LnB5OjE0CiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF9nb3Zfc3VzcGVuc2lvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfZ292X3N1c3BlbnNpb246CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6OTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18xIC8vIDAKICAgIGdldGJpdAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojc3CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlY18yIC8vIDB4NTIzNzMwMjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozMQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgNCAvLyAweDUyMzMzMDIzCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTE0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGR1cAogICAgcHVzaGludCA1NgogICAgaW50Y18wIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIHB1c2hpbnQgNTYKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTE1CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF9vcGVuW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF9vcGVuOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjY4CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hY2NvdW50X21hbmFnZXIsIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlY18zIC8vIDB4NTIzNDMwMjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyOAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGVubS5TVEFUVVNfRU5ERUQKICAgIGludGNfMSAvLyAwCiAgICBieXRlYyAxMCAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgMjAwCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzOQogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLnN0YXR1c19pc19lbmRlZCgpLCBlcnIuVU5BVVRIT1JJWkVECiAgICAhCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNDAKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE0MQogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTQyCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgNCAvLyAweDUyMzMzMDIzCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTQ2CiAgICAvLyB1bml0cz1VSW50NjQoMCksCiAgICBpbnRjXzEgLy8gMAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE0NC0xNTAKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gdHlwLkFjY291bnRJbmZvKAogICAgLy8gICAgIHBheW1lbnRfYWRkcmVzcz1wYXltZW50X2FkZHJlc3MsCiAgICAvLyAgICAgdW5pdHM9VUludDY0KDApLAogICAgLy8gICAgIHVuaXRfdmFsdWU9VUludDY0KDApLAogICAgLy8gICAgIHBhaWRfY291cG9ucz1VSW50NjQoMCksCiAgICAvLyAgICAgc3VzcGVuZGVkPUZhbHNlLAogICAgLy8gKQogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDAwCiAgICBjb25jYXQKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNTEKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF9jbG9zZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfY2xvc2U6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTUzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjY4CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hY2NvdW50X21hbmFnZXIsIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlY18zIC8vIDB4NTIzNDMwMjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNzEKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjMxCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA0IC8vIDB4NTIzMzMwMjMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTc0CiAgICAvLyBjbG9zZWRfdW5pdHMgPSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cwogICAgZHVwCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIGludGNfMiAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTc1CiAgICAvLyBkZWwgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE3NgogICAgLy8gc2VsZi5jaXJjdWxhdGluZ191bml0cyAtPSBjbG9zZWRfdW5pdHMKICAgIGludGNfMSAvLyAwCiAgICBieXRlYyA5IC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIHN3YXAKICAgIC0KICAgIGJ5dGVjIDkgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NDgKICAgIC8vIGlmIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgPT0gVUludDY0KDApOgogICAgYm56IGFjY291bnRfY2xvc2VfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NDkKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGVubS5TVEFUVVNfRU5ERUQpCiAgICBieXRlYyAxMCAvLyAic3RhdHVzIgogICAgcHVzaGludCAyMDAKICAgIGFwcF9nbG9iYWxfcHV0CgphY2NvdW50X2Nsb3NlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNzgKICAgIC8vIHJldHVybiBjbG9zZWRfdW5pdHMsIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTUzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGRpZyAxCiAgICBpdG9iCiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5hY2NvdW50X3VwZGF0ZV9wYXltZW50X2FkZHJlc3Nbcm91dGluZ10oKSAtPiB2b2lkOgphY2NvdW50X3VwZGF0ZV9wYXltZW50X2FkZHJlc3M6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjAwCiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIGRpZyAyCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjAxCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMDIKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjMxCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA0IC8vIDB4NTIzMzMwMjMKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMDQKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcyA9IHBheW1lbnRfYWRkcmVzcwogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMDUKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF9nZXRfaW5mb1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfZ2V0X2luZm86CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjA3CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjMxCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA0IC8vIDB4NTIzMzMwMjMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjIyCiAgICAvLyByZXR1cm4gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIwNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19yb3RhdGVfYXJyYW5nZXJbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3JvdGF0ZV9hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTU4CiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTU5CiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gbmV3X2FycmFuZ2VyCiAgICBieXRlY18xIC8vIDB4NTIzMjMwMjMKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTYwCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfc2V0X29wX2RhZW1vbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfc2V0X29wX2RhZW1vbjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTczCiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTc0CiAgICAvLyBzZWxmLm9wX2RhZW1vbi52YWx1ZSA9IGFkZHJlc3MKICAgIGJ5dGVjIDExIC8vIDB4NTIzMjM1MjMKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTc1CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfYXNzaWduX3JvbGVbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2Fzc2lnbl9yb2xlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE3NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTk5CiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAwCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDEKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCkpCiAgICBidG9pCiAgICBkdXBuIDIKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTAxCiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUik6CiAgICBpbnRjXzMgLy8gMjAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwMgogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IHJvbGVfYWRkcmVzcwogICAgYnl0ZWNfMSAvLyAweDUyMzIzMDIzCiAgICBkaWcgMwogICAgYXBwX2dsb2JhbF9wdXQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fdXBzZXJ0X3JvbGVAMTQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAzCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA1CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDQwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDYKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjXzMgLy8gMHg1MjM0MzAyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA3CiAgICAvLyBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcyhjb25maWcpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwMgogICAgLy8gc2VsZi5fdXBzZXJ0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCBjb25maWcpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fdXBzZXJ0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwOQogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTAKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgNSAvLyAweDUyMzUzMDIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTEKICAgIC8vIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDIKICAgIC8vIHNlbGYuX3Vwc2VydF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgY29uZmlnKQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3Vwc2VydF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTMKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGNzdC5ST0xFX1RSVVNURUUpOgogICAgZHVwCiAgICBwdXNoaW50IDYwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTQKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyA2IC8vIDB4NTIzNjMwMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNQogICAgLy8gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZykKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAyCiAgICAvLyBzZWxmLl91cHNlcnRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIGNvbmZpZykKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl91cHNlcnRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE3CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE4CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlY18yIC8vIDB4NTIzNzMwMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExOQogICAgLy8gc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDIKICAgIC8vIHNlbGYuX3Vwc2VydF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgY29uZmlnKQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3Vwc2VydF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMTE6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIxCiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpOgogICAgZHVwCiAgICBwdXNoaW50IDgwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl91cHNlcnRfcm9sZUAxNAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMgogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgNyAvLyAweDUyMzgzMDIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjMKICAgIC8vIHNlbGYuaW50ZXJlc3Rfb3JhY2xlW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZykKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fdXBzZXJ0X3JvbGVAMTQKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3Jldm9rZV9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19yZXZva2Vfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjQKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjUKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNgogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjYKICAgIC8vIGFzc2VydCByb2xlX2lkICE9IFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksIGVyci5JTlZBTElEX1JPTEUKICAgIGR1cAogICAgaW50Y18zIC8vIDIwCiAgICAhPQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI3CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI4CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjXzMgLy8gMHg1MjM0MzAyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI5CiAgICAvLyBkZWwgc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyOAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjA1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMQogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzIKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyA1IC8vIDB4NTIzNTMwMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMwogICAgLy8gZGVsIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI3CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNQogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNjAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNgogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgNiAvLyAweDUyMzYzMDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzcKICAgIC8vIGRlbCBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI3CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzOQogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKToKICAgIGR1cAogICAgcHVzaGludCA3MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQwCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjXzIgLy8gMHg1MjM3MzAyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQxCiAgICAvLyBkZWwgc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI3CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MwogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKToKICAgIGR1cAogICAgcHVzaGludCA4MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDQKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgNyAvLyAweDUyMzgzMDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDUKICAgIC8vIGRlbCBzZWxmLmludGVyZXN0X29yYWNsZVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ292X2Fzc2V0X3N1c3BlbnNpb25bcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dvdl9hc3NldF9zdXNwZW5zaW9uOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kICAjIFRPRE86IFVwZGF0ZSBzcGVjcyBhbmQgYWRkIHRlc3QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzEgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzcKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjXzIgLy8gMHg1MjM3MzAyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0NgogICAgLy8gc2VsZi5hc3NldF9zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGJ5dGVjIDggLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjQ3CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCAgIyBUT0RPOiBVcGRhdGUgc3BlY3MgYW5kIGFkZCB0ZXN0CiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYXJyYW5nZXJbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTcKICAgIC8vIHJldHVybiBzZWxmLmFycmFuZ2VyLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMSAvLyAweDUyMzIzMDIzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJyYW5nZXIgZXhpc3RzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjQ5CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9hZGRyZXNzX3JvbGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfYWRkcmVzc19yb2xlczoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjczCiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmFjY291bnRfbWFuYWdlciwgYWRkcmVzcyksCiAgICBieXRlY18zIC8vIDB4NTIzNDMwMjMKICAgIGRpZyAxCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3NAogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5wcmltYXJ5X2RlYWxlciwgYWRkcmVzcyksCiAgICBieXRlYyA1IC8vIDB4NTIzNTMwMjMKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3NQogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi50cnVzdGVlLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDYgLy8gMHg1MjM2MzAyMwogICAgZGlnIDMKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjc2CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgYWRkcmVzcyksCiAgICBieXRlY18yIC8vIDB4NTIzNzMwMjMKICAgIGRpZyA0CiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3NwogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5pbnRlcmVzdF9vcmFjbGUsIGFkZHJlc3MpLAogICAgYnl0ZWMgNyAvLyAweDUyMzgzMDIzCiAgICB1bmNvdmVyIDUKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHB1c2hieXRlcyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciA2CiAgICBzZXRiaXQKICAgIGludGNfMCAvLyAxCiAgICB1bmNvdmVyIDUKICAgIHNldGJpdAogICAgcHVzaGludCAyCiAgICB1bmNvdmVyIDQKICAgIHNldGJpdAogICAgcHVzaGludCAzCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgcHVzaGludCA0CiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfY29uZmlnW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfcm9sZV9jb25maWc6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjk0CiAgICAvLyByb2xlID0gcm9sZV9pZC5hc191aW50NjQoKQogICAgYnRvaQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5NQogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZSkKICAgIGR1cAogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTcKICAgIC8vIGNhc2UgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKToKICAgIGludGNfMyAvLyAyMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwMQogICAgLy8gY2FzZSBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIHB1c2hpbnRzIDQwIDUwIDYwIDcwIDgwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjk2LTMyNwogICAgLy8gbWF0Y2ggcm9sZToKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUik6CiAgICAvLyAgICAgICAgIHJldHVybiB0eXAuUm9sZUNvbmZpZygKICAgIC8vICAgICAgICAgICAgIHJvbGVfdmFsaWRpdHlfc3RhcnQ9VUludDY0KDApLCByb2xlX3ZhbGlkaXR5X2VuZD1VSW50NjQoMCkKICAgIC8vICAgICAgICAgKQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLnByaW1hcnlfZGVhbGVyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSk6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5pbnRlcmVzdF9vcmFjbGUsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYuaW50ZXJlc3Rfb3JhY2xlW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIF86CiAgICAvLyAgICAgICAgIG9wLmVycihlcnIuSU5WQUxJRF9ST0xFKQogICAgdW5jb3ZlciA2CiAgICBtYXRjaCByYmFjX2dldF9yb2xlX2NvbmZpZ19zd2l0Y2hfY2FzZV8wQDIgcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfMUAzIHJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzJANCByYmFjX2dldF9yb2xlX2NvbmZpZ19zd2l0Y2hfY2FzZV8zQDUgcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfNEA2IHJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzVANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyNwogICAgLy8gb3AuZXJyKGVyci5JTlZBTElEX1JPTEUpCiAgICBlcnIgLy8gSW52YWxpZCByb2xlIGlkZW50aWZpZXIKCnJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzVANzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjMKICAgIC8vIHNlbGYuaW50ZXJlc3Rfb3JhY2xlLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDcgLy8gMHg1MjM4MzAyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMi0zMjQKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLmludGVyZXN0X29yYWNsZSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI1CiAgICAvLyByZXR1cm4gc2VsZi5pbnRlcmVzdF9vcmFjbGVbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCgpyYmFjX2dldF9yb2xlX2NvbmZpZ19hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfY29uZmlnQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCnJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzRANjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTgKICAgIC8vIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjXzIgLy8gMHg1MjM3MzAyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLmF1dGhvcml0eSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzIwCiAgICAvLyByZXR1cm4gc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV9jb25maWdfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX2NvbmZpZ0A5CgpyYmFjX2dldF9yb2xlX2NvbmZpZ19zd2l0Y2hfY2FzZV8zQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEzCiAgICAvLyBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgNiAvLyAweDUyMzYzMDIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEyLTMxNAogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzE1CiAgICAvLyByZXR1cm4gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfY29uZmlnX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV9jb25maWdAOQoKcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfMkA0OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwOAogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyA1IC8vIDB4NTIzNTMwMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDctMzA5CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEwCiAgICAvLyByZXR1cm4gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX2NvbmZpZ19hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfY29uZmlnQDkKCnJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzFAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDMKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjXzMgLy8gMHg1MjM0MzAyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwMi0zMDQKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLmFjY291bnRfbWFuYWdlciwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA1CiAgICAvLyByZXR1cm4gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV9jb25maWdfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX2NvbmZpZ0A5CgpyYmFjX2dldF9yb2xlX2NvbmZpZ19zd2l0Y2hfY2FzZV8wQDI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjk4LTMwMAogICAgLy8gcmV0dXJuIHR5cC5Sb2xlQ29uZmlnKAogICAgLy8gICAgIHJvbGVfdmFsaWRpdHlfc3RhcnQ9VUludDY0KDApLCByb2xlX3ZhbGlkaXR5X2VuZD1VSW50NjQoMCkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV9jb25maWdfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX2NvbmZpZ0A5CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3JvbGVfaXNfYWN0aXZlKHJvbGVfbWFwOiBieXRlcywgcm9sZV9hZGRyZXNzOiBieXRlcykgLT4gdWludDY0Ogpfcm9sZV9pc19hY3RpdmU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTcKICAgIC8vIGRlZiBfcm9sZV9pc19hY3RpdmUoc2VsZiwgcm9sZV9tYXA6IHR5cC5SYmFjUm9sZSwgcm9sZV9hZGRyZXNzOiBBY2NvdW50KSAtPiBib29sOgogICAgcHJvdG8gMiAxCiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OC02MgogICAgLy8gcmV0dXJuIHNlbGYuX2hhc19yb2xlKHJvbGVfbWFwLCByb2xlX2FkZHJlc3MpIGFuZCAoCiAgICAvLyAgICAgcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICAvLyApCiAgICBieiBfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTkKICAgIC8vIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBCb3hNYXAgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2MAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTktNjAKICAgIC8vIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIDw9CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTktNjEKICAgIC8vIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IF9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2MQogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBCb3hNYXAgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDgKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAtNjEKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgPj0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgaW50Y18wIC8vIDEKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX21lcmdlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzEgLy8gMAogICAgYiBfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpIC0+IHZvaWQ6CmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjUKICAgIC8vIGFzc2VydCBzZWxmLl9pc19hcnJhbmdlcihUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjUyCiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzID09IHNlbGYuYXJyYW5nZXIudmFsdWUKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18xIC8vIDB4NTIzMjMwMjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcnJhbmdlciBleGlzdHMKICAgID09CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjUKICAgIC8vIGFzc2VydCBzZWxmLl9pc19hcnJhbmdlcihUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpIC0+IHZvaWQ6CmFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjgzCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYXNzZXRfZGVmYXVsdGVkLCBlcnIuREVGQVVMVEVECiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgMTIgLy8gImFzc2V0X2RlZmF1bHRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9kZWZhdWx0ZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRGVmYXVsdGVkCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpIC0+IHZvaWQ6CmFzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg2CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYXNzZXRfc3VzcGVuZGVkLCBlcnIuU1VTUEVOREVECiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgOCAvLyAiYXNzZXRfc3VzcGVuZGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X3N1c3BlbmRlZCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBTdXNwZW5kZWQgb3BlcmF0aW9ucwogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGVfaWQ6IHVpbnQ2NCkgLT4gdm9pZDoKX2Fzc2VydF92YWxpZF9yb2xlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg4CiAgICAvLyBkZWYgX2Fzc2VydF92YWxpZF9yb2xlKHNlbGYsIHJvbGVfaWQ6IFVJbnQ2NCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk2CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkwCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgaW50Y18zIC8vIDIwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTYKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkxCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIHB1c2hpbnQgNDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTIKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICBwdXNoaW50IDUwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTYKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkzCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICBwdXNoaW50IDYwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTYKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojk0CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIHB1c2hpbnQgNzAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTUKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgcHVzaGludCA4MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk2CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBieiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9mYWxzZUA3CgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDY6CiAgICBpbnRjXzAgLy8gMQoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfbWVyZ2VAODoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBhc3NlcnQgLy8gSW52YWxpZCByb2xlIGlkZW50aWZpZXIKICAgIHJldHN1YgoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfZmFsc2VANzoKICAgIGludGNfMSAvLyAwCiAgICBiIF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX21lcmdlQDgK", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="}, "sourceInfo": {"approval": {"pcOffsetMethod": "none", "sourceInfo": [{"pc": [1281], "errorMessage": "Defaulted"}, {"pc": [329, 402, 455, 538, 568], "errorMessage": "Invalid account holding address"}, {"pc": [706, 730, 754, 777, 801, 856, 884, 906, 927, 949, 1125, 1142, 1157, 1172, 1186], "errorMessage": "Invalid account role address"}, {"pc": [841, 1115, 1342], "errorMessage": "Invalid role identifier"}, {"pc": [319, 374, 385, 443, 522, 971, 1273], "errorMessage": "Not authorized"}, {"pc": [1289], "errorMessage": "Suspended operations"}, {"pc": [1233, 1248], "errorMessage": "check BoxMap entry exists"}, {"pc": [988, 1271], "errorMessage": "check self.arranger exists"}, {"pc": [1279], "errorMessage": "check self.asset_defaulted exists"}, {"pc": [1287], "errorMessage": "check self.asset_suspended exists"}, {"pc": [470], "errorMessage": "check self.circulating_units exists"}, {"pc": [379], "errorMessage": "check self.status exists"}, {"pc": [647], "errorMessage": "invalid array length header"}, {"pc": [310, 962], "errorMessage": "invalid number of bytes for arc4.bool"}, {"pc": [655], "errorMessage": "invalid number of bytes for arc4.dynamic_array"}, {"pc": [302, 359, 367, 436, 508, 516, 559, 584, 607, 641, 825, 1002, 1085], "errorMessage": "invalid number of bytes for arc4.static_array"}, {"pc": [631, 815, 1075], "errorMessage": "invalid number of bytes for arc4.uint8"}]}, "clear": {"pcOffsetMethod": "none", "sourceInfo": []}}, "templateVariables": {}}""" -APP_SPEC = algokit_utils.Arc56Contract.from_json(_APP_SPEC_JSON) - -def _parse_abi_args(args: object | None = None) -> list[object] | None: - """Helper to parse ABI args into the format expected by underlying client""" - if args is None: - return None - - def convert_dataclass(value: object) -> object: - if dataclasses.is_dataclass(value): - return tuple(convert_dataclass(getattr(value, field.name)) for field in dataclasses.fields(value)) - elif isinstance(value, (list, tuple)): - return type(value)(convert_dataclass(item) for item in value) - return value - - match args: - case tuple(): - method_args = list(args) - case _ if dataclasses.is_dataclass(args): - method_args = [getattr(args, field.name) for field in dataclasses.fields(args)] - case _: - raise ValueError("Invalid 'args' type. Expected 'tuple' or 'TypedDict' for respective typed arguments.") - - return [ - convert_dataclass(arg) if not isinstance(arg, algokit_utils.AppMethodCallTransactionArgument) else arg - for arg in method_args - ] if method_args else None - -def _init_dataclass(cls: type, data: dict) -> object: - """ - Recursively instantiate a dataclass of type `cls` from `data`. - - For each field on the dataclass, if the field type is also a dataclass - and the corresponding data is a dict, instantiate that field recursively. - """ - field_values = {} - for field in dataclasses.fields(cls): - field_value = data.get(field.name) - # Check if the field expects another dataclass and the value is a dict. - if dataclasses.is_dataclass(field.type) and isinstance(field_value, dict): - field_values[field.name] = _init_dataclass(typing.cast(type, field.type), field_value) - else: - field_values[field.name] = field_value - return cls(**field_values) - -@dataclasses.dataclass(frozen=True) -class AccountInfo: - """Struct for AccountInfo""" - payment_address: str - units: int - unit_value: int - paid_coupons: int - suspended: bool - -@dataclasses.dataclass(frozen=True) -class RoleConfig: - """Struct for RoleConfig""" - role_validity_start: int - role_validity_end: int - - -@dataclasses.dataclass(frozen=True, kw_only=True) -class AccountGovSuspensionArgs: - """Dataclass for account_gov_suspension arguments""" - holding_address: str - suspended: bool - - @property - def abi_method_signature(self) -> str: - return "account_gov_suspension(address,bool)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class AccountOpenArgs: - """Dataclass for account_open arguments""" - holding_address: str - payment_address: str - - @property - def abi_method_signature(self) -> str: - return "account_open(address,address)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class AccountCloseArgs: - """Dataclass for account_close arguments""" - holding_address: str - - @property - def abi_method_signature(self) -> str: - return "account_close(address)(uint64,uint64)" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class AccountUpdatePaymentAddressArgs: - """Dataclass for account_update_payment_address arguments""" - holding_address: str - payment_address: str - - @property - def abi_method_signature(self) -> str: - return "account_update_payment_address(address,address)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class AccountGetInfoArgs: - """Dataclass for account_get_info arguments""" - holding_address: str - - @property - def abi_method_signature(self) -> str: - return "account_get_info(address)(address,uint64,uint64,uint64,bool)" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class RbacRotateArrangerArgs: - """Dataclass for rbac_rotate_arranger arguments""" - new_arranger: str - - @property - def abi_method_signature(self) -> str: - return "rbac_rotate_arranger(address)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class RbacSetOpDaemonArgs: - """Dataclass for rbac_set_op_daemon arguments""" - address: str - - @property - def abi_method_signature(self) -> str: - return "rbac_set_op_daemon(address)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class RbacAssignRoleArgs: - """Dataclass for rbac_assign_role arguments""" - role_id: int - role_address: str - config: bytes | str - - @property - def abi_method_signature(self) -> str: - return "rbac_assign_role(uint8,address,byte[])uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class RbacRevokeRoleArgs: - """Dataclass for rbac_revoke_role arguments""" - role_id: int - role_address: str - - @property - def abi_method_signature(self) -> str: - return "rbac_revoke_role(uint8,address)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class RbacGovAssetSuspensionArgs: - """Dataclass for rbac_gov_asset_suspension arguments""" - suspended: bool - - @property - def abi_method_signature(self) -> str: - return "rbac_gov_asset_suspension(bool)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class RbacGetAddressRolesArgs: - """Dataclass for rbac_get_address_roles arguments""" - address: str - - @property - def abi_method_signature(self) -> str: - return "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class RbacGetRoleConfigArgs: - """Dataclass for rbac_get_role_config arguments""" - role_id: int - role_address: str - - @property - def abi_method_signature(self) -> str: - return "rbac_get_role_config(uint8,address)(uint64,uint64)" - - -class MockAccountingModuleParams: - def __init__(self, app_client: algokit_utils.AppClient): - self.app_client = app_client - - def account_gov_suspension( - self, - args: tuple[str, bool] | AccountGovSuspensionArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_gov_suspension(address,bool)uint64", - "args": method_args, - })) - - def account_open( - self, - args: tuple[str, str] | AccountOpenArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_open(address,address)uint64", - "args": method_args, - })) - - def account_close( - self, - args: tuple[str] | AccountCloseArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_close(address)(uint64,uint64)", - "args": method_args, - })) - - def account_update_payment_address( - self, - args: tuple[str, str] | AccountUpdatePaymentAddressArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_update_payment_address(address,address)uint64", - "args": method_args, - })) - - def account_get_info( - self, - args: tuple[str] | AccountGetInfoArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_get_info(address)(address,uint64,uint64,uint64,bool)", - "args": method_args, - })) - - def rbac_rotate_arranger( - self, - args: tuple[str] | RbacRotateArrangerArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_rotate_arranger(address)uint64", - "args": method_args, - })) - - def rbac_set_op_daemon( - self, - args: tuple[str] | RbacSetOpDaemonArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_set_op_daemon(address)uint64", - "args": method_args, - })) - - def rbac_assign_role( - self, - args: tuple[int, str, bytes | str] | RbacAssignRoleArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_assign_role(uint8,address,byte[])uint64", - "args": method_args, - })) - - def rbac_revoke_role( - self, - args: tuple[int, str] | RbacRevokeRoleArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_revoke_role(uint8,address)uint64", - "args": method_args, - })) - - def rbac_gov_asset_suspension( - self, - args: tuple[bool] | RbacGovAssetSuspensionArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_gov_asset_suspension(bool)uint64", - "args": method_args, - })) - - def rbac_get_arranger( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_arranger()address", - })) - - def rbac_get_address_roles( - self, - args: tuple[str] | RbacGetAddressRolesArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", - "args": method_args, - })) - - def rbac_get_role_config( - self, - args: tuple[int, str] | RbacGetRoleConfigArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_role_config(uint8,address)(uint64,uint64)", - "args": method_args, - })) - - def clear_state( - self, - params: algokit_utils.AppClientBareCallParams | None = None, - - ) -> algokit_utils.AppCallParams: - return self.app_client.params.bare.clear_state( - params, - - ) - - -class MockAccountingModuleCreateTransactionParams: - def __init__(self, app_client: algokit_utils.AppClient): - self.app_client = app_client - - def account_gov_suspension( - self, - args: tuple[str, bool] | AccountGovSuspensionArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_gov_suspension(address,bool)uint64", - "args": method_args, - })) - - def account_open( - self, - args: tuple[str, str] | AccountOpenArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_open(address,address)uint64", - "args": method_args, - })) - - def account_close( - self, - args: tuple[str] | AccountCloseArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_close(address)(uint64,uint64)", - "args": method_args, - })) - - def account_update_payment_address( - self, - args: tuple[str, str] | AccountUpdatePaymentAddressArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_update_payment_address(address,address)uint64", - "args": method_args, - })) - - def account_get_info( - self, - args: tuple[str] | AccountGetInfoArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_get_info(address)(address,uint64,uint64,uint64,bool)", - "args": method_args, - })) - - def rbac_rotate_arranger( - self, - args: tuple[str] | RbacRotateArrangerArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_rotate_arranger(address)uint64", - "args": method_args, - })) - - def rbac_set_op_daemon( - self, - args: tuple[str] | RbacSetOpDaemonArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_set_op_daemon(address)uint64", - "args": method_args, - })) - - def rbac_assign_role( - self, - args: tuple[int, str, bytes | str] | RbacAssignRoleArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_assign_role(uint8,address,byte[])uint64", - "args": method_args, - })) - - def rbac_revoke_role( - self, - args: tuple[int, str] | RbacRevokeRoleArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_revoke_role(uint8,address)uint64", - "args": method_args, - })) - - def rbac_gov_asset_suspension( - self, - args: tuple[bool] | RbacGovAssetSuspensionArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_gov_asset_suspension(bool)uint64", - "args": method_args, - })) - - def rbac_get_arranger( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_arranger()address", - })) - - def rbac_get_address_roles( - self, - args: tuple[str] | RbacGetAddressRolesArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", - "args": method_args, - })) - - def rbac_get_role_config( - self, - args: tuple[int, str] | RbacGetRoleConfigArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_role_config(uint8,address)(uint64,uint64)", - "args": method_args, - })) - - def clear_state( - self, - params: algokit_utils.AppClientBareCallParams | None = None, - - ) -> Transaction: - return self.app_client.create_transaction.bare.clear_state( - params, - - ) - - -class MockAccountingModuleSend: - def __init__(self, app_client: algokit_utils.AppClient): - self.app_client = app_client - - def account_gov_suspension( - self, - args: tuple[str, bool] | AccountGovSuspensionArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_gov_suspension(address,bool)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def account_open( - self, - args: tuple[str, str] | AccountOpenArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_open(address,address)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def account_close( - self, - args: tuple[str] | AccountCloseArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[tuple[int, int]]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_close(address)(uint64,uint64)", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[tuple[int, int]], parsed_response) - - def account_update_payment_address( - self, - args: tuple[str, str] | AccountUpdatePaymentAddressArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_update_payment_address(address,address)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def account_get_info( - self, - args: tuple[str] | AccountGetInfoArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[AccountInfo]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_get_info(address)(address,uint64,uint64,uint64,bool)", - "args": method_args, - }), send_params=send_params) - parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(AccountInfo, typing.cast(dict, response.abi_return))) # type: ignore - return typing.cast(algokit_utils.SendAppTransactionResult[AccountInfo], parsed_response) - - def rbac_rotate_arranger( - self, - args: tuple[str] | RbacRotateArrangerArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_rotate_arranger(address)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def rbac_set_op_daemon( - self, - args: tuple[str] | RbacSetOpDaemonArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_set_op_daemon(address)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def rbac_assign_role( - self, - args: tuple[int, str, bytes | str] | RbacAssignRoleArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_assign_role(uint8,address,byte[])uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def rbac_revoke_role( - self, - args: tuple[int, str] | RbacRevokeRoleArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_revoke_role(uint8,address)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def rbac_gov_asset_suspension( - self, - args: tuple[bool] | RbacGovAssetSuspensionArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_gov_asset_suspension(bool)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def rbac_get_arranger( - self, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[str]: - - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_arranger()address", - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[str], parsed_response) - - def rbac_get_address_roles( - self, - args: tuple[str] | RbacGetAddressRolesArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[tuple[bool, bool, bool, bool, bool]]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[tuple[bool, bool, bool, bool, bool]], parsed_response) - - def rbac_get_role_config( - self, - args: tuple[int, str] | RbacGetRoleConfigArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[RoleConfig]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_role_config(uint8,address)(uint64,uint64)", - "args": method_args, - }), send_params=send_params) - parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(RoleConfig, typing.cast(dict, response.abi_return))) # type: ignore - return typing.cast(algokit_utils.SendAppTransactionResult[RoleConfig], parsed_response) - - def clear_state( - self, - params: algokit_utils.AppClientBareCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[algokit_utils.ABIReturn]: - return self.app_client.send.bare.clear_state( - params, - send_params=send_params, - ) - - -class GlobalStateValue(typing.TypedDict): - """Shape of global_state state key values""" - arranger: str - op_daemon: str - asset_suspended: int - asset_defaulted: int - total_units: int - circulating_units: int - unit_value: int - status: int - -class MockAccountingModuleState: - """Methods to access state for the current MockAccountingModule app""" - - def __init__(self, app_client: algokit_utils.AppClient): - self.app_client = app_client - - @property - def global_state( - self - ) -> "_GlobalState": - """Methods to access global_state for the current app""" - return _GlobalState(self.app_client) - - @property - def box( - self - ) -> "_BoxState": - """Methods to access box for the current app""" - return _BoxState(self.app_client) - -class _GlobalState: - def __init__(self, app_client: algokit_utils.AppClient): - self.app_client = app_client - - # Pre-generated mapping of value types to their struct classes - self._struct_classes: dict[str, typing.Type[typing.Any]] = {} - - def get_all(self) -> GlobalStateValue: - """Get all current keyed values from global_state state""" - result = self.app_client.state.global_state.get_all() - if not result: - return typing.cast(GlobalStateValue, {}) - - converted = {} - for key, value in result.items(): - key_info = self.app_client.app_spec.state.keys.global_state.get(key) - struct_class = self._struct_classes.get(key_info.value_type) if key_info else None - converted[key] = ( - _init_dataclass(struct_class, value) if struct_class and isinstance(value, dict) - else value - ) - return typing.cast(GlobalStateValue, converted) - - @property - def arranger(self) -> str: - """Get the current value of the arranger key in global_state state""" - value = self.app_client.state.global_state.get_value("arranger") - if isinstance(value, dict) and "address" in self._struct_classes: - return _init_dataclass(self._struct_classes["address"], value) # type: ignore - return typing.cast(str, value) - - @property - def op_daemon(self) -> str: - """Get the current value of the op_daemon key in global_state state""" - value = self.app_client.state.global_state.get_value("op_daemon") - if isinstance(value, dict) and "address" in self._struct_classes: - return _init_dataclass(self._struct_classes["address"], value) # type: ignore - return typing.cast(str, value) - - @property - def asset_suspended(self) -> int: - """Get the current value of the asset_suspended key in global_state state""" - value = self.app_client.state.global_state.get_value("asset_suspended") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def asset_defaulted(self) -> int: - """Get the current value of the asset_defaulted key in global_state state""" - value = self.app_client.state.global_state.get_value("asset_defaulted") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def total_units(self) -> int: - """Get the current value of the total_units key in global_state state""" - value = self.app_client.state.global_state.get_value("total_units") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def circulating_units(self) -> int: - """Get the current value of the circulating_units key in global_state state""" - value = self.app_client.state.global_state.get_value("circulating_units") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def unit_value(self) -> int: - """Get the current value of the unit_value key in global_state state""" - value = self.app_client.state.global_state.get_value("unit_value") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def status(self) -> int: - """Get the current value of the status key in global_state state""" - value = self.app_client.state.global_state.get_value("status") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - -class _BoxState: - def __init__(self, app_client: algokit_utils.AppClient): - self.app_client = app_client - - # Pre-generated mapping of value types to their struct classes - self._struct_classes: dict[str, typing.Type[typing.Any]] = { - "RoleConfig": RoleConfig, - "AccountInfo": AccountInfo - } - - def get_all(self) -> dict[str, typing.Any]: - """Get all current keyed values from box state""" - result = self.app_client.state.box.get_all() - if not result: - return {} - - converted = {} - for key, value in result.items(): - key_info = self.app_client.app_spec.state.keys.box.get(key) - struct_class = self._struct_classes.get(key_info.value_type) if key_info else None - converted[key] = ( - _init_dataclass(struct_class, value) if struct_class and isinstance(value, dict) - else value - ) - return converted - - @property - def account_manager(self) -> "_MapState[str, RoleConfig]": - """Get values from the account_manager map in box state""" - return _MapState( - self.app_client.state.box, - "account_manager", - self._struct_classes.get("RoleConfig") - ) - - @property - def primary_dealer(self) -> "_MapState[str, RoleConfig]": - """Get values from the primary_dealer map in box state""" - return _MapState( - self.app_client.state.box, - "primary_dealer", - self._struct_classes.get("RoleConfig") - ) - - @property - def trustee(self) -> "_MapState[str, RoleConfig]": - """Get values from the trustee map in box state""" - return _MapState( - self.app_client.state.box, - "trustee", - self._struct_classes.get("RoleConfig") - ) - - @property - def authority(self) -> "_MapState[str, RoleConfig]": - """Get values from the authority map in box state""" - return _MapState( - self.app_client.state.box, - "authority", - self._struct_classes.get("RoleConfig") - ) - - @property - def interest_oracle(self) -> "_MapState[str, RoleConfig]": - """Get values from the interest_oracle map in box state""" - return _MapState( - self.app_client.state.box, - "interest_oracle", - self._struct_classes.get("RoleConfig") - ) - - @property - def account(self) -> "_MapState[str, AccountInfo]": - """Get values from the account map in box state""" - return _MapState( - self.app_client.state.box, - "account", - self._struct_classes.get("AccountInfo") - ) - -_KeyType = typing.TypeVar("_KeyType") -_ValueType = typing.TypeVar("_ValueType") - -class _AppClientStateMethodsProtocol(typing.Protocol): - def get_map(self, map_name: str) -> dict[typing.Any, typing.Any]: - ... - def get_map_value(self, map_name: str, key: typing.Any) -> typing.Any | None: - ... - -class _MapState(typing.Generic[_KeyType, _ValueType]): - """Generic class for accessing state maps with strongly typed keys and values""" - - def __init__(self, state_accessor: _AppClientStateMethodsProtocol, map_name: str, - struct_class: typing.Type[_ValueType] | None = None): - self._state_accessor = state_accessor - self._map_name = map_name - self._struct_class = struct_class - - def get_map(self) -> dict[_KeyType, _ValueType]: - """Get all current values in the map""" - result = self._state_accessor.get_map(self._map_name) - if self._struct_class and result: - return {k: _init_dataclass(self._struct_class, v) if isinstance(v, dict) else v - for k, v in result.items()} # type: ignore - return typing.cast(dict[_KeyType, _ValueType], result or {}) - - def get_value(self, key: _KeyType) -> _ValueType | None: - """Get a value from the map by key""" - key_value = dataclasses.asdict(key) if dataclasses.is_dataclass(key) else key # type: ignore - value = self._state_accessor.get_map_value(self._map_name, key_value) - if value is not None and self._struct_class and isinstance(value, dict): - return _init_dataclass(self._struct_class, value) # type: ignore - return typing.cast(_ValueType | None, value) - - -class MockAccountingModuleClient: - """Client for interacting with MockAccountingModule smart contract""" - - @typing.overload - def __init__(self, app_client: algokit_utils.AppClient) -> None: ... - - @typing.overload - def __init__( - self, - *, - algorand: _AlgoKitAlgorandClient, - app_id: int, - app_name: str | None = None, - default_sender: str | None = None, - default_signer: TransactionSigner | None = None, - approval_source_map: SourceMap | None = None, - clear_source_map: SourceMap | None = None, - ) -> None: ... - - def __init__( - self, - app_client: algokit_utils.AppClient | None = None, - *, - algorand: _AlgoKitAlgorandClient | None = None, - app_id: int | None = None, - app_name: str | None = None, - default_sender: str | None = None, - default_signer: TransactionSigner | None = None, - approval_source_map: SourceMap | None = None, - clear_source_map: SourceMap | None = None, - ) -> None: - if app_client: - self.app_client = app_client - elif algorand and app_id: - self.app_client = algokit_utils.AppClient( - algokit_utils.AppClientParams( - algorand=algorand, - app_spec=APP_SPEC, - app_id=app_id, - app_name=app_name, - default_sender=default_sender, - default_signer=default_signer, - approval_source_map=approval_source_map, - clear_source_map=clear_source_map, - ) - ) - else: - raise ValueError("Either app_client or algorand and app_id must be provided") - - self.params = MockAccountingModuleParams(self.app_client) - self.create_transaction = MockAccountingModuleCreateTransactionParams(self.app_client) - self.send = MockAccountingModuleSend(self.app_client) - self.state = MockAccountingModuleState(self.app_client) - - @staticmethod - def from_creator_and_name( - creator_address: str, - app_name: str, - algorand: _AlgoKitAlgorandClient, - default_sender: str | None = None, - default_signer: TransactionSigner | None = None, - approval_source_map: SourceMap | None = None, - clear_source_map: SourceMap | None = None, - ignore_cache: bool | None = None, - app_lookup_cache: algokit_utils.ApplicationLookup | None = None, - ) -> "MockAccountingModuleClient": - return MockAccountingModuleClient( - algokit_utils.AppClient.from_creator_and_name( - creator_address=creator_address, - app_name=app_name, - app_spec=APP_SPEC, - algorand=algorand, - default_sender=default_sender, - default_signer=default_signer, - approval_source_map=approval_source_map, - clear_source_map=clear_source_map, - ignore_cache=ignore_cache, - app_lookup_cache=app_lookup_cache, - ) - ) - - @staticmethod - def from_network( - algorand: _AlgoKitAlgorandClient, - app_name: str | None = None, - default_sender: str | None = None, - default_signer: TransactionSigner | None = None, - approval_source_map: SourceMap | None = None, - clear_source_map: SourceMap | None = None, - ) -> "MockAccountingModuleClient": - return MockAccountingModuleClient( - algokit_utils.AppClient.from_network( - app_spec=APP_SPEC, - algorand=algorand, - app_name=app_name, - default_sender=default_sender, - default_signer=default_signer, - approval_source_map=approval_source_map, - clear_source_map=clear_source_map, - ) - ) - - @property - def app_id(self) -> int: - return self.app_client.app_id - - @property - def app_address(self) -> str: - return self.app_client.app_address - - @property - def app_name(self) -> str: - return self.app_client.app_name - - @property - def app_spec(self) -> algokit_utils.Arc56Contract: - return self.app_client.app_spec - - @property - def algorand(self) -> _AlgoKitAlgorandClient: - return self.app_client.algorand - - def clone( - self, - app_name: str | None = None, - default_sender: str | None = None, - default_signer: TransactionSigner | None = None, - approval_source_map: SourceMap | None = None, - clear_source_map: SourceMap | None = None, - ) -> "MockAccountingModuleClient": - return MockAccountingModuleClient( - self.app_client.clone( - app_name=app_name, - default_sender=default_sender, - default_signer=default_signer, - approval_source_map=approval_source_map, - clear_source_map=clear_source_map, - ) - ) - - def new_group(self) -> "MockAccountingModuleComposer": - return MockAccountingModuleComposer(self) - - @typing.overload - def decode_return_value( - self, - method: typing.Literal["account_gov_suspension(address,bool)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["account_open(address,address)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["account_close(address)(uint64,uint64)"], - return_value: algokit_utils.ABIReturn | None - ) -> tuple[int, int] | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["account_update_payment_address(address,address)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["account_get_info(address)(address,uint64,uint64,uint64,bool)"], - return_value: algokit_utils.ABIReturn | None - ) -> AccountInfo | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["rbac_rotate_arranger(address)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["rbac_set_op_daemon(address)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["rbac_assign_role(uint8,address,byte[])uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["rbac_revoke_role(uint8,address)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["rbac_gov_asset_suspension(bool)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["rbac_get_arranger()address"], - return_value: algokit_utils.ABIReturn | None - ) -> str | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["rbac_get_address_roles(address)(bool,bool,bool,bool,bool)"], - return_value: algokit_utils.ABIReturn | None - ) -> tuple[bool, bool, bool, bool, bool] | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["rbac_get_role_config(uint8,address)(uint64,uint64)"], - return_value: algokit_utils.ABIReturn | None - ) -> RoleConfig | None: ... - @typing.overload - def decode_return_value( - self, - method: str, - return_value: algokit_utils.ABIReturn | None - ) -> algokit_utils.ABIValue | algokit_utils.ABIStruct | None: ... - - def decode_return_value( - self, - method: str, - return_value: algokit_utils.ABIReturn | None - ) -> algokit_utils.ABIValue | algokit_utils.ABIStruct | None | AccountInfo | RoleConfig | int | str | tuple[bool, bool, bool, bool, bool] | tuple[int, int]: - """Decode ABI return value for the given method.""" - if return_value is None: - return None - - arc56_method = self.app_spec.get_arc56_method(method) - decoded = return_value.get_arc56_value(arc56_method, self.app_spec.structs) - - # If method returns a struct, convert the dict to appropriate dataclass - if (arc56_method and - arc56_method.returns and - arc56_method.returns.struct and - isinstance(decoded, dict)): - struct_class = globals().get(arc56_method.returns.struct) - if struct_class: - return struct_class(**typing.cast(dict, decoded)) - return decoded - - -@dataclasses.dataclass(frozen=True) -class MockAccountingModuleBareCallCreateParams(algokit_utils.AppClientBareCallCreateParams): - """Parameters for creating MockAccountingModule contract with bare calls""" - on_complete: typing.Literal[OnComplete.NoOpOC] | None = None - - def to_algokit_utils_params(self) -> algokit_utils.AppClientBareCallCreateParams: - return algokit_utils.AppClientBareCallCreateParams(**self.__dict__) - -class MockAccountingModuleFactory(algokit_utils.TypedAppFactoryProtocol[MockAccountingModuleBareCallCreateParams, None, None]): - """Factory for deploying and managing MockAccountingModuleClient smart contracts""" - - def __init__( - self, - algorand: _AlgoKitAlgorandClient, - *, - app_name: str | None = None, - default_sender: str | None = None, - default_signer: TransactionSigner | None = None, - version: str | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None, - ): - self.app_factory = algokit_utils.AppFactory( - params=algokit_utils.AppFactoryParams( - algorand=algorand, - app_spec=APP_SPEC, - app_name=app_name, - default_sender=default_sender, - default_signer=default_signer, - version=version, - compilation_params=compilation_params, - ) - ) - self.params = MockAccountingModuleFactoryParams(self.app_factory) - self.create_transaction = MockAccountingModuleFactoryCreateTransaction(self.app_factory) - self.send = MockAccountingModuleFactorySend(self.app_factory) - - @property - def app_name(self) -> str: - return self.app_factory.app_name - - @property - def app_spec(self) -> algokit_utils.Arc56Contract: - return self.app_factory.app_spec - - @property - def algorand(self) -> _AlgoKitAlgorandClient: - return self.app_factory.algorand - - def deploy( - self, - *, - on_update: algokit_utils.OnUpdate | None = None, - on_schema_break: algokit_utils.OnSchemaBreak | None = None, - create_params: MockAccountingModuleBareCallCreateParams | None = None, - update_params: None = None, - delete_params: None = None, - existing_deployments: algokit_utils.ApplicationLookup | None = None, - ignore_cache: bool = False, - app_name: str | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None, - send_params: algokit_utils.SendParams | None = None, - ) -> tuple[MockAccountingModuleClient, algokit_utils.AppFactoryDeployResult]: - """Deploy the application""" - deploy_response = self.app_factory.deploy( - on_update=on_update, - on_schema_break=on_schema_break, - create_params=create_params.to_algokit_utils_params() if create_params else None, - update_params=update_params, - delete_params=delete_params, - existing_deployments=existing_deployments, - ignore_cache=ignore_cache, - app_name=app_name, - compilation_params=compilation_params, - send_params=send_params, - ) - - return MockAccountingModuleClient(deploy_response[0]), deploy_response[1] - - def get_app_client_by_creator_and_name( - self, - creator_address: str, - app_name: str, - default_sender: str | None = None, - default_signer: TransactionSigner | None = None, - ignore_cache: bool | None = None, - app_lookup_cache: algokit_utils.ApplicationLookup | None = None, - approval_source_map: SourceMap | None = None, - clear_source_map: SourceMap | None = None, - ) -> MockAccountingModuleClient: - """Get an app client by creator address and name""" - return MockAccountingModuleClient( - self.app_factory.get_app_client_by_creator_and_name( - creator_address, - app_name, - default_sender, - default_signer, - ignore_cache, - app_lookup_cache, - approval_source_map, - clear_source_map, - ) - ) - - def get_app_client_by_id( - self, - app_id: int, - app_name: str | None = None, - default_sender: str | None = None, - default_signer: TransactionSigner | None = None, - approval_source_map: SourceMap | None = None, - clear_source_map: SourceMap | None = None, - ) -> MockAccountingModuleClient: - """Get an app client by app ID""" - return MockAccountingModuleClient( - self.app_factory.get_app_client_by_id( - app_id, - app_name, - default_sender, - default_signer, - approval_source_map, - clear_source_map, - ) - ) - - -class MockAccountingModuleFactoryParams: - """Parameters for creating transactions for MockAccountingModule contract""" - - def __init__(self, app_factory: algokit_utils.AppFactory): - self.app_factory = app_factory - self.create = MockAccountingModuleFactoryCreateParams(app_factory) - self.update = MockAccountingModuleFactoryUpdateParams(app_factory) - self.delete = MockAccountingModuleFactoryDeleteParams(app_factory) - -class MockAccountingModuleFactoryCreateParams: - """Parameters for 'create' operations of MockAccountingModule contract""" - - def __init__(self, app_factory: algokit_utils.AppFactory): - self.app_factory = app_factory - - def bare( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateParams: - """Creates an instance using a bare call""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.bare.create( - algokit_utils.AppFactoryCreateParams(**dataclasses.asdict(params)), - compilation_params=compilation_params) - - def account_gov_suspension( - self, - args: tuple[str, bool] | AccountGovSuspensionArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the account_gov_suspension(address,bool)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "account_gov_suspension(address,bool)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def account_open( - self, - args: tuple[str, str] | AccountOpenArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the account_open(address,address)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "account_open(address,address)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def account_close( - self, - args: tuple[str] | AccountCloseArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the account_close(address)(uint64,uint64) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "account_close(address)(uint64,uint64)", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def account_update_payment_address( - self, - args: tuple[str, str] | AccountUpdatePaymentAddressArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the account_update_payment_address(address,address)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "account_update_payment_address(address,address)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def account_get_info( - self, - args: tuple[str] | AccountGetInfoArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the account_get_info(address)(address,uint64,uint64,uint64,bool) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "account_get_info(address)(address,uint64,uint64,uint64,bool)", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def rbac_rotate_arranger( - self, - args: tuple[str] | RbacRotateArrangerArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_rotate_arranger(address)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "rbac_rotate_arranger(address)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def rbac_set_op_daemon( - self, - args: tuple[str] | RbacSetOpDaemonArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_set_op_daemon(address)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "rbac_set_op_daemon(address)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def rbac_assign_role( - self, - args: tuple[int, str, bytes | str] | RbacAssignRoleArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_assign_role(uint8,address,byte[])uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "rbac_assign_role(uint8,address,byte[])uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def rbac_revoke_role( - self, - args: tuple[int, str] | RbacRevokeRoleArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_revoke_role(uint8,address)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "rbac_revoke_role(uint8,address)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def rbac_gov_asset_suspension( - self, - args: tuple[bool] | RbacGovAssetSuspensionArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_gov_asset_suspension(bool)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "rbac_gov_asset_suspension(bool)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def rbac_get_arranger( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_get_arranger()address ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "rbac_get_arranger()address", - "args": None, - } - ), - compilation_params=compilation_params - ) - - def rbac_get_address_roles( - self, - args: tuple[str] | RbacGetAddressRolesArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_get_address_roles(address)(bool,bool,bool,bool,bool) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def rbac_get_role_config( - self, - args: tuple[int, str] | RbacGetRoleConfigArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_get_role_config(uint8,address)(uint64,uint64) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "rbac_get_role_config(uint8,address)(uint64,uint64)", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - -class MockAccountingModuleFactoryUpdateParams: - """Parameters for 'update' operations of MockAccountingModule contract""" - - def __init__(self, app_factory: algokit_utils.AppFactory): - self.app_factory = app_factory - - def bare( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - - ) -> algokit_utils.AppUpdateParams: - """Updates an instance using a bare call""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.bare.deploy_update( - algokit_utils.AppClientBareCallParams(**dataclasses.asdict(params)), - ) - -class MockAccountingModuleFactoryDeleteParams: - """Parameters for 'delete' operations of MockAccountingModule contract""" - - def __init__(self, app_factory: algokit_utils.AppFactory): - self.app_factory = app_factory - - def bare( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - - ) -> algokit_utils.AppDeleteParams: - """Deletes an instance using a bare call""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.bare.deploy_delete( - algokit_utils.AppClientBareCallParams(**dataclasses.asdict(params)), - ) - - -class MockAccountingModuleFactoryCreateTransaction: - """Create transactions for MockAccountingModule contract""" - - def __init__(self, app_factory: algokit_utils.AppFactory): - self.app_factory = app_factory - self.create = MockAccountingModuleFactoryCreateTransactionCreate(app_factory) - - -class MockAccountingModuleFactoryCreateTransactionCreate: - """Create new instances of MockAccountingModule contract""" - - def __init__(self, app_factory: algokit_utils.AppFactory): - self.app_factory = app_factory - - def bare( - self, - params: algokit_utils.CommonAppCallCreateParams | None = None, - ) -> Transaction: - """Creates a new instance using a bare call""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.create_transaction.bare.create( - algokit_utils.AppFactoryCreateParams(**dataclasses.asdict(params)), - ) - - -class MockAccountingModuleFactorySend: - """Send calls to MockAccountingModule contract""" - - def __init__(self, app_factory: algokit_utils.AppFactory): - self.app_factory = app_factory - self.create = MockAccountingModuleFactorySendCreate(app_factory) - - -class MockAccountingModuleFactorySendCreate: - """Send create calls to MockAccountingModule contract""" - - def __init__(self, app_factory: algokit_utils.AppFactory): - self.app_factory = app_factory - - def bare( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - send_params: algokit_utils.SendParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None, - ) -> tuple[MockAccountingModuleClient, algokit_utils.SendAppCreateTransactionResult]: - """Creates a new instance using a bare call""" - params = params or algokit_utils.CommonAppCallCreateParams() - result = self.app_factory.send.bare.create( - algokit_utils.AppFactoryCreateParams(**dataclasses.asdict(params)), - send_params=send_params, - compilation_params=compilation_params - ) - return MockAccountingModuleClient(result[0]), result[1] - - -class MockAccountingModuleComposer: - """Composer for creating transaction groups for MockAccountingModule contract calls""" - - def __init__(self, client: "MockAccountingModuleClient"): - self.client = client - self._composer = client.algorand.new_group() - self._result_mappers: list[typing.Callable[[algokit_utils.ABIReturn | None], object] | None] = [] - - def account_gov_suspension( - self, - args: tuple[str, bool] | AccountGovSuspensionArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> "MockAccountingModuleComposer": - self._composer.add_app_call_method_call( - self.client.params.account_gov_suspension( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "account_gov_suspension(address,bool)uint64", v - ) - ) - return self - - def account_open( - self, - args: tuple[str, str] | AccountOpenArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> "MockAccountingModuleComposer": - self._composer.add_app_call_method_call( - self.client.params.account_open( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "account_open(address,address)uint64", v - ) - ) - return self - - def account_close( - self, - args: tuple[str] | AccountCloseArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> "MockAccountingModuleComposer": - self._composer.add_app_call_method_call( - self.client.params.account_close( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "account_close(address)(uint64,uint64)", v - ) - ) - return self - - def account_update_payment_address( - self, - args: tuple[str, str] | AccountUpdatePaymentAddressArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> "MockAccountingModuleComposer": - self._composer.add_app_call_method_call( - self.client.params.account_update_payment_address( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "account_update_payment_address(address,address)uint64", v - ) - ) - return self - - def account_get_info( - self, - args: tuple[str] | AccountGetInfoArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> "MockAccountingModuleComposer": - self._composer.add_app_call_method_call( - self.client.params.account_get_info( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "account_get_info(address)(address,uint64,uint64,uint64,bool)", v - ) - ) - return self - - def rbac_rotate_arranger( - self, - args: tuple[str] | RbacRotateArrangerArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> "MockAccountingModuleComposer": - self._composer.add_app_call_method_call( - self.client.params.rbac_rotate_arranger( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "rbac_rotate_arranger(address)uint64", v - ) - ) - return self - - def rbac_set_op_daemon( - self, - args: tuple[str] | RbacSetOpDaemonArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> "MockAccountingModuleComposer": - self._composer.add_app_call_method_call( - self.client.params.rbac_set_op_daemon( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "rbac_set_op_daemon(address)uint64", v - ) - ) - return self - - def rbac_assign_role( - self, - args: tuple[int, str, bytes | str] | RbacAssignRoleArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> "MockAccountingModuleComposer": - self._composer.add_app_call_method_call( - self.client.params.rbac_assign_role( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "rbac_assign_role(uint8,address,byte[])uint64", v - ) - ) - return self - - def rbac_revoke_role( - self, - args: tuple[int, str] | RbacRevokeRoleArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> "MockAccountingModuleComposer": - self._composer.add_app_call_method_call( - self.client.params.rbac_revoke_role( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "rbac_revoke_role(uint8,address)uint64", v - ) - ) - return self - - def rbac_gov_asset_suspension( - self, - args: tuple[bool] | RbacGovAssetSuspensionArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> "MockAccountingModuleComposer": - self._composer.add_app_call_method_call( - self.client.params.rbac_gov_asset_suspension( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "rbac_gov_asset_suspension(bool)uint64", v - ) - ) - return self - - def rbac_get_arranger( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> "MockAccountingModuleComposer": - self._composer.add_app_call_method_call( - self.client.params.rbac_get_arranger( - - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "rbac_get_arranger()address", v - ) - ) - return self - - def rbac_get_address_roles( - self, - args: tuple[str] | RbacGetAddressRolesArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> "MockAccountingModuleComposer": - self._composer.add_app_call_method_call( - self.client.params.rbac_get_address_roles( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", v - ) - ) - return self - - def rbac_get_role_config( - self, - args: tuple[int, str] | RbacGetRoleConfigArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> "MockAccountingModuleComposer": - self._composer.add_app_call_method_call( - self.client.params.rbac_get_role_config( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "rbac_get_role_config(uint8,address)(uint64,uint64)", v - ) - ) - return self - - def clear_state( - self, - *, - args: list[bytes] | None = None, - params: algokit_utils.CommonAppCallParams | None = None, - ) -> "MockAccountingModuleComposer": - params=params or algokit_utils.CommonAppCallParams() - self._composer.add_app_call( - self.client.params.clear_state( - algokit_utils.AppClientBareCallParams( - **{ - **dataclasses.asdict(params), - "args": args - } - ) - ) - ) - return self - - def add_transaction( - self, txn: Transaction, signer: TransactionSigner | None = None - ) -> "MockAccountingModuleComposer": - self._composer.add_transaction(txn, signer) - return self - - def composer(self) -> algokit_utils.TransactionComposer: - return self._composer - - def simulate( - self, - allow_more_logs: bool | None = None, - allow_empty_signatures: bool | None = None, - allow_unnamed_resources: bool | None = None, - extra_opcode_budget: int | None = None, - exec_trace_config: SimulateTraceConfig | None = None, - simulation_round: int | None = None, - skip_signatures: bool | None = None, - ) -> algokit_utils.SendAtomicTransactionComposerResults: - return self._composer.simulate( - allow_more_logs=allow_more_logs, - allow_empty_signatures=allow_empty_signatures, - allow_unnamed_resources=allow_unnamed_resources, - extra_opcode_budget=extra_opcode_budget, - exec_trace_config=exec_trace_config, - simulation_round=simulation_round, - skip_signatures=skip_signatures, - ) - - def send( - self, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAtomicTransactionComposerResults: - return self._composer.send(send_params) diff --git a/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.approval.puya.map b/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.approval.puya.map deleted file mode 100644 index 4f79d95a..00000000 --- a/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.approval.puya.map +++ /dev/null @@ -1,5572 +0,0 @@ -{ - "version": 3, - "sources": [ - "../../../modules/rbac.py", - "../../mock_module_rbac/contract.py" - ], - "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BmD;AAAf;;AAA5B;AAC4C;;AAAf;;AAA7B;AAgBA;;AAAuB;AAAvB;AACA;;AAAuB;AAAvB;AC3CR;;AAAA;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;AAAA;AAQK;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAEG;AAAsB;;AAAtB;AAFH;AAAA;ADqIA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAWG;;;AACA;AAAA;AAAA;AACO;;AAbV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAeA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAWG;;;AACA;;AAAA;AAAA;AACO;;AAbV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAeA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAsBG;;;AACA;;;AACwB;AAAA;;AAAxB;;;AApGc;AAAX;AAAX;;;AACY;AAAA;;AAAA;AAqGG;;AA1BV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAxEM;AAAW;;AAAX;AAAX;;;AACuC;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AA+FJ;;;AA7FG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AA2FJ;;;AAzFG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAuFJ;;;AArFG;AAAW;;AAAX;AAAX;;;AACuC;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAmFJ;;;AAjFG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;;;;AAkFP;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAmBG;;;AACA;;;AACwB;AAAA;;AAAxB;;;AApGO;AAAW;AAAX;AAAP;AACc;;AAAX;AAAX;;;AACmC;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAmGG;;AAvBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA1EM;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AA8FJ;;;AA5FG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AA0FJ;;;AAxFG;AAAW;;AAAX;AAAX;;;AACmC;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAsFJ;;;AApFG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;;;;AAqFP;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAzJ+B;AAAgB;;AAArC;;;AAAP;AAyKA;;AAAA;AAAA;AACO;;AAjBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BU;AAAA;AAAA;AAAA;AARV;AAAA;AAAA;AAAA;AAAA;AAAA;AAUA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAc4B;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AAlBP;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAcU;AACP;AAAA;;;AAES;AAIA;;;;;;;AALT;;AAAA;;;;;;;;;;;;;;AA+BQ;AAJI;;AA5QL;;AAAA;AAAA;AAAA;AAAA;;AA2QC;AAGO;AAAA;AA7ClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAsCe;AAvQL;;AAAA;AAAA;AAAA;AAAA;;AAsQC;AAGO;AAAA;AAxClB;;;AAiCe;;AAlQL;;AAAA;AAAA;AAAA;AAAA;;AAiQC;AAGO;AAAA;AAnClB;;;AA4Be;;AA7PL;;AAAA;AAAA;AAAA;AAAA;;AA4PC;AAGO;AAAA;AA9BlB;;;AAuBe;AAxPL;;AAAA;AAAA;AAAA;AAAA;;AAuPC;AAGO;AAAA;AAzBlB;;;AAkBkB;;;;;;;;;;;;;;;;;;AAlBlB;;;AA/ND;;;;;AAFW;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAGA;;;AACH;;AAAA;AAAA;AAAA;AAAA;AACG;;AAAA;AAAA;;AADH;AAAA;;;AAEG;;AAAA;AAAA;AAAA;;AAAA;AADA;;AAAA;AADH;;;;AADJ;;AAAA;;;;;AAOyB;;AAbF;AAAA;AAAA;AAAA;AAAhB;AAaP;;AAkBW;AAAA;;AAAA;AAAA;AAAJ;AAAP;;AAKJ;;;AACW;;AACH;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;AAAA;;AAMH;;AANG;AAAA;;;;AAAP;;;", - "op_pc_offset": 0, - "pc_events": { - "1": { - "subroutine": "algopy.arc4.ARC4Contract.approval_program", - "params": {}, - "block": "main", - "stack_in": [], - "op": "intcblock 1 0 32 20" - }, - "7": { - "op": "bytecblock 0x151f7c75 0x52323023 0x52373023 0x52343023 0x52353023 0x52363023 0x52383023 0x52323523 \"asset_suspended\" \"asset_defaulted\"" - }, - "81": { - "op": "txn ApplicationID", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "83": { - "op": "bnz main_after_if_else@2", - "stack_out": [] - }, - "86": { - "op": "bytec_1 // 0x52323023", - "defined_out": [ - "0x52323023" - ], - "stack_out": [ - "0x52323023" - ] - }, - "87": { - "op": "global ZeroAddress", - "defined_out": [ - "0x52323023", - "tmp%0#2" - ], - "stack_out": [ - "0x52323023", - "tmp%0#2" - ] - }, - "89": { - "op": "app_global_put", - "stack_out": [] - }, - "90": { - "op": "bytec 7 // 0x52323523", - "defined_out": [ - "0x52323523" - ], - "stack_out": [ - "0x52323523" - ] - }, - "92": { - "op": "global ZeroAddress", - "defined_out": [ - "0x52323523", - "tmp%1#2" - ], - "stack_out": [ - "0x52323523", - "tmp%1#2" - ] - }, - "94": { - "op": "app_global_put", - "stack_out": [] - }, - "95": { - "op": "bytec 8 // \"asset_suspended\"", - "defined_out": [ - "\"asset_suspended\"" - ], - "stack_out": [ - "\"asset_suspended\"" - ] - }, - "97": { - "op": "intc_1 // 0", - "defined_out": [ - "\"asset_suspended\"", - "0" - ], - "stack_out": [ - "\"asset_suspended\"", - "0" - ] - }, - "98": { - "op": "app_global_put", - "stack_out": [] - }, - "99": { - "op": "bytec 9 // \"asset_defaulted\"", - "defined_out": [ - "\"asset_defaulted\"" - ], - "stack_out": [ - "\"asset_defaulted\"" - ] - }, - "101": { - "op": "intc_1 // 0", - "stack_out": [ - "\"asset_defaulted\"", - "0" - ] - }, - "102": { - "op": "app_global_put", - "stack_out": [] - }, - "103": { - "block": "main_after_if_else@2", - "stack_in": [], - "op": "txn NumAppArgs", - "defined_out": [ - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1" - ] - }, - "105": { - "op": "bz main_create@17", - "stack_out": [] - }, - "108": { - "op": "txn OnCompletion", - "defined_out": [ - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0" - ] - }, - "110": { - "op": "!", - "defined_out": [ - "tmp%3#0" - ], - "stack_out": [ - "tmp%3#0" - ] - }, - "111": { - "op": "assert", - "stack_out": [] - }, - "112": { - "op": "txn ApplicationID", - "defined_out": [ - "tmp%4#0" - ], - "stack_out": [ - "tmp%4#0" - ] - }, - "114": { - "op": "assert", - "stack_out": [] - }, - "115": { - "op": "pushbytess 0x82f71b2d 0xef04f5d3 0x03b83329 0x3dbe80bd 0xdf54e82c 0x010c8299 0x7406acd2 0xc3e4b297 // method \"rbac_rotate_arranger(address)uint64\", method \"rbac_set_op_daemon(address)uint64\", method \"rbac_assign_role(uint8,address,byte[])uint64\", method \"rbac_revoke_role(uint8,address)uint64\", method \"rbac_gov_asset_suspension(bool)uint64\", method \"rbac_get_arranger()address\", method \"rbac_get_address_roles(address)(bool,bool,bool,bool,bool)\", method \"rbac_get_role_config(uint8,address)(uint64,uint64)\"", - "defined_out": [ - "Method(rbac_assign_role(uint8,address,byte[])uint64)", - "Method(rbac_get_address_roles(address)(bool,bool,bool,bool,bool))", - "Method(rbac_get_arranger()address)", - "Method(rbac_get_role_config(uint8,address)(uint64,uint64))", - "Method(rbac_gov_asset_suspension(bool)uint64)", - "Method(rbac_revoke_role(uint8,address)uint64)", - "Method(rbac_rotate_arranger(address)uint64)", - "Method(rbac_set_op_daemon(address)uint64)" - ], - "stack_out": [ - "Method(rbac_rotate_arranger(address)uint64)", - "Method(rbac_set_op_daemon(address)uint64)", - "Method(rbac_assign_role(uint8,address,byte[])uint64)", - "Method(rbac_revoke_role(uint8,address)uint64)", - "Method(rbac_gov_asset_suspension(bool)uint64)", - "Method(rbac_get_arranger()address)", - "Method(rbac_get_address_roles(address)(bool,bool,bool,bool,bool))", - "Method(rbac_get_role_config(uint8,address)(uint64,uint64))" - ] - }, - "157": { - "op": "txna ApplicationArgs 0", - "defined_out": [ - "Method(rbac_assign_role(uint8,address,byte[])uint64)", - "Method(rbac_get_address_roles(address)(bool,bool,bool,bool,bool))", - "Method(rbac_get_arranger()address)", - "Method(rbac_get_role_config(uint8,address)(uint64,uint64))", - "Method(rbac_gov_asset_suspension(bool)uint64)", - "Method(rbac_revoke_role(uint8,address)uint64)", - "Method(rbac_rotate_arranger(address)uint64)", - "Method(rbac_set_op_daemon(address)uint64)", - "tmp%6#0" - ], - "stack_out": [ - "Method(rbac_rotate_arranger(address)uint64)", - "Method(rbac_set_op_daemon(address)uint64)", - "Method(rbac_assign_role(uint8,address,byte[])uint64)", - "Method(rbac_revoke_role(uint8,address)uint64)", - "Method(rbac_gov_asset_suspension(bool)uint64)", - "Method(rbac_get_arranger()address)", - "Method(rbac_get_address_roles(address)(bool,bool,bool,bool,bool))", - "Method(rbac_get_role_config(uint8,address)(uint64,uint64))", - "tmp%6#0" - ] - }, - "160": { - "op": "match rbac_rotate_arranger rbac_set_op_daemon rbac_assign_role rbac_revoke_role rbac_gov_asset_suspension rbac_get_arranger rbac_get_address_roles rbac_get_role_config", - "stack_out": [] - }, - "178": { - "op": "err" - }, - "179": { - "block": "main_create@17", - "stack_in": [], - "op": "txn OnCompletion", - "defined_out": [ - "tmp%7#0" - ], - "stack_out": [ - "tmp%7#0" - ] - }, - "181": { - "op": "!", - "defined_out": [ - "tmp%8#0" - ], - "stack_out": [ - "tmp%8#0" - ] - }, - "182": { - "op": "txn ApplicationID", - "defined_out": [ - "tmp%8#0", - "tmp%9#0" - ], - "stack_out": [ - "tmp%8#0", - "tmp%9#0" - ] - }, - "184": { - "op": "!", - "defined_out": [ - "tmp%10#0", - "tmp%8#0" - ], - "stack_out": [ - "tmp%8#0", - "tmp%10#0" - ] - }, - "185": { - "op": "&&", - "defined_out": [ - "tmp%11#0" - ], - "stack_out": [ - "tmp%11#0" - ] - }, - "186": { - "op": "assert", - "stack_out": [] - }, - "187": { - "op": "bytec_1 // 0x52323023", - "defined_out": [ - "0x52323023" - ], - "stack_out": [ - "0x52323023" - ] - }, - "188": { - "op": "txn Sender", - "defined_out": [ - "0x52323023", - "tmp%0#2" - ], - "stack_out": [ - "0x52323023", - "tmp%0#2" - ] - }, - "190": { - "op": "app_global_put", - "stack_out": [] - }, - "191": { - "op": "intc_0 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "192": { - "op": "return", - "stack_out": [] - }, - "193": { - "subroutine": "modules.rbac.RbacModule.rbac_rotate_arranger[routing]", - "params": {}, - "block": "rbac_rotate_arranger", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "new_arranger#0" - ], - "stack_out": [ - "new_arranger#0" - ] - }, - "196": { - "op": "dup", - "defined_out": [ - "new_arranger#0", - "new_arranger#0 (copy)" - ], - "stack_out": [ - "new_arranger#0", - "new_arranger#0 (copy)" - ] - }, - "197": { - "op": "len", - "defined_out": [ - "len%0#0", - "new_arranger#0" - ], - "stack_out": [ - "new_arranger#0", - "len%0#0" - ] - }, - "198": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "len%0#0", - "new_arranger#0" - ], - "stack_out": [ - "new_arranger#0", - "len%0#0", - "32" - ] - }, - "199": { - "op": "==", - "defined_out": [ - "eq%0#0", - "new_arranger#0" - ], - "stack_out": [ - "new_arranger#0", - "eq%0#0" - ] - }, - "200": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "new_arranger#0" - ] - }, - "201": { - "callsub": "modules.rbac.RbacModule.assert_caller_is_arranger", - "op": "callsub assert_caller_is_arranger" - }, - "204": { - "op": "bytec_1 // 0x52323023", - "defined_out": [ - "0x52323023", - "new_arranger#0" - ], - "stack_out": [ - "new_arranger#0", - "0x52323023" - ] - }, - "205": { - "op": "swap", - "stack_out": [ - "0x52323023", - "new_arranger#0" - ] - }, - "206": { - "op": "app_global_put", - "stack_out": [] - }, - "207": { - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1" - ] - }, - "209": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0" - ] - }, - "210": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0", - "0x151f7c75" - ] - }, - "211": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ] - }, - "212": { - "op": "concat", - "defined_out": [ - "tmp%4#0" - ], - "stack_out": [ - "tmp%4#0" - ] - }, - "213": { - "op": "log", - "stack_out": [] - }, - "214": { - "op": "intc_0 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "215": { - "op": "return", - "stack_out": [] - }, - "216": { - "subroutine": "modules.rbac.RbacModule.rbac_set_op_daemon[routing]", - "params": {}, - "block": "rbac_set_op_daemon", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "address#0" - ], - "stack_out": [ - "address#0" - ] - }, - "219": { - "op": "dup", - "defined_out": [ - "address#0", - "address#0 (copy)" - ], - "stack_out": [ - "address#0", - "address#0 (copy)" - ] - }, - "220": { - "op": "len", - "defined_out": [ - "address#0", - "len%0#0" - ], - "stack_out": [ - "address#0", - "len%0#0" - ] - }, - "221": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "address#0", - "len%0#0" - ], - "stack_out": [ - "address#0", - "len%0#0", - "32" - ] - }, - "222": { - "op": "==", - "defined_out": [ - "address#0", - "eq%0#0" - ], - "stack_out": [ - "address#0", - "eq%0#0" - ] - }, - "223": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "address#0" - ] - }, - "224": { - "callsub": "modules.rbac.RbacModule.assert_caller_is_arranger", - "op": "callsub assert_caller_is_arranger" - }, - "227": { - "op": "bytec 7 // 0x52323523", - "defined_out": [ - "0x52323523", - "address#0" - ], - "stack_out": [ - "address#0", - "0x52323523" - ] - }, - "229": { - "op": "swap", - "stack_out": [ - "0x52323523", - "address#0" - ] - }, - "230": { - "op": "app_global_put", - "stack_out": [] - }, - "231": { - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1" - ] - }, - "233": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0" - ] - }, - "234": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0", - "0x151f7c75" - ] - }, - "235": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ] - }, - "236": { - "op": "concat", - "defined_out": [ - "tmp%4#0" - ], - "stack_out": [ - "tmp%4#0" - ] - }, - "237": { - "op": "log", - "stack_out": [] - }, - "238": { - "op": "intc_0 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "239": { - "op": "return", - "stack_out": [] - }, - "240": { - "subroutine": "modules.rbac.RbacModule.rbac_assign_role[routing]", - "params": {}, - "block": "rbac_assign_role", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "role_id#0" - ], - "stack_out": [ - "role_id#0" - ] - }, - "243": { - "op": "dup", - "defined_out": [ - "role_id#0", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0", - "role_id#0 (copy)" - ] - }, - "244": { - "op": "len", - "defined_out": [ - "len%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "len%0#0" - ] - }, - "245": { - "op": "intc_0 // 1", - "defined_out": [ - "1", - "len%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "len%0#0", - "1" - ] - }, - "246": { - "op": "==", - "defined_out": [ - "eq%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "eq%0#0" - ] - }, - "247": { - "error": "invalid number of bytes for arc4.uint8", - "op": "assert // invalid number of bytes for arc4.uint8", - "stack_out": [ - "role_id#0" - ] - }, - "248": { - "op": "txna ApplicationArgs 2" - }, - "251": { - "op": "dup", - "defined_out": [ - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "role_address#0", - "role_address#0" - ] - }, - "252": { - "op": "cover 2", - "defined_out": [ - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "role_address#0" - ] - }, - "254": { - "op": "len", - "defined_out": [ - "len%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "len%1#0" - ] - }, - "255": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "len%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "len%1#0", - "32" - ] - }, - "256": { - "op": "==", - "defined_out": [ - "eq%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "eq%1#0" - ] - }, - "257": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "role_address#0", - "role_id#0" - ] - }, - "258": { - "op": "txna ApplicationArgs 3", - "defined_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0" - ] - }, - "261": { - "op": "dup", - "defined_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "tmp%3#0 (copy)" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "tmp%3#0 (copy)" - ] - }, - "262": { - "op": "intc_1 // 0", - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "tmp%3#0 (copy)", - "0" - ] - }, - "263": { - "error": "invalid array length header", - "op": "extract_uint16 // on error: invalid array length header", - "defined_out": [ - "aggregate%array_length%0#0", - "role_address#0", - "role_id#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "aggregate%array_length%0#0" - ] - }, - "264": { - "op": "pushint 2", - "defined_out": [ - "2", - "aggregate%array_length%0#0", - "role_address#0", - "role_id#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "aggregate%array_length%0#0", - "2" - ] - }, - "266": { - "op": "+", - "defined_out": [ - "add%0#0", - "role_address#0", - "role_id#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "add%0#0" - ] - }, - "267": { - "op": "dig 1", - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "add%0#0", - "tmp%3#0 (copy)" - ] - }, - "269": { - "op": "len", - "defined_out": [ - "add%0#0", - "len%2#0", - "role_address#0", - "role_id#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "add%0#0", - "len%2#0" - ] - }, - "270": { - "op": "==", - "defined_out": [ - "eq%2#0", - "role_address#0", - "role_id#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "eq%2#0" - ] - }, - "271": { - "error": "invalid number of bytes for arc4.dynamic_array", - "op": "assert // invalid number of bytes for arc4.dynamic_array", - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0" - ] - }, - "272": { - "op": "extract 2 0", - "defined_out": [ - "config#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "config#0" - ] - }, - "275": { - "op": "swap", - "defined_out": [ - "config#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#0" - ] - }, - "276": { - "callsub": "modules.rbac.RbacModule.assert_caller_is_arranger", - "op": "callsub assert_caller_is_arranger" - }, - "279": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "op": "callsub assert_is_not_asset_defaulted" - }, - "282": { - "op": "btoi", - "defined_out": [ - "config#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "283": { - "op": "dupn 2", - "defined_out": [ - "config#0", - "role_address#0", - "role_id#1", - "role_id#1 (copy)" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1", - "role_id#1 (copy)" - ] - }, - "285": { - "callsub": "modules.rbac.RbacModule._assert_valid_role", - "op": "callsub _assert_valid_role", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1" - ] - }, - "288": { - "op": "intc_3 // 20", - "defined_out": [ - "20", - "config#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1", - "20" - ] - }, - "289": { - "op": "==", - "defined_out": [ - "config#0", - "role_address#0", - "role_id#1", - "tmp%0#2" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "tmp%0#2" - ] - }, - "290": { - "op": "bz rbac_assign_role_after_if_else@3", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "293": { - "op": "bytec_1 // 0x52323023", - "defined_out": [ - "0x52323023", - "config#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52323023" - ] - }, - "294": { - "op": "dig 3", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52323023", - "role_address#0" - ] - }, - "296": { - "op": "app_global_put", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "297": { - "block": "rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14", - "stack_in": [ - "role_address#0", - "config#0", - "role_id#1" - ], - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%2#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "tmp%2#1" - ] - }, - "299": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "aggregate%val_as_bytes%0#0" - ] - }, - "300": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "aggregate%val_as_bytes%0#0", - "0x151f7c75" - ] - }, - "301": { - "op": "swap", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ] - }, - "302": { - "op": "concat", - "defined_out": [ - "tmp%7#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "tmp%7#0" - ] - }, - "303": { - "op": "log", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "304": { - "op": "intc_0 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "1" - ] - }, - "305": { - "op": "return", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "306": { - "block": "rbac_assign_role_after_if_else@3", - "stack_in": [ - "role_address#0", - "config#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1" - ] - }, - "307": { - "op": "pushint 40", - "defined_out": [ - "40", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1", - "40" - ] - }, - "309": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%1#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "tmp%1#1" - ] - }, - "310": { - "op": "bz rbac_assign_role_after_if_else@5", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "313": { - "op": "bytec_3 // 0x52343023", - "defined_out": [ - "0x52343023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52343023" - ] - }, - "314": { - "op": "dig 3", - "defined_out": [ - "0x52343023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52343023", - "role_address#0" - ] - }, - "316": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%0#0" - ] - }, - "317": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#0", - "box_prefixed_key%0#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%0#0", - "box_prefixed_key%0#0 (copy)" - ] - }, - "318": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#0", - "maybe_exists%0#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%0#0", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "319": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%0#0", - "maybe_exists%0#0" - ] - }, - "321": { - "op": "!", - "defined_out": [ - "box_prefixed_key%0#0", - "role_address#0", - "role_id#1", - "tmp%2#2" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%0#0", - "tmp%2#2" - ] - }, - "322": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%0#0" - ] - }, - "323": { - "op": "dig 2", - "defined_out": [ - "box_prefixed_key%0#0", - "config#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%0#0", - "config#0" - ] - }, - "325": { - "op": "box_put", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "326": { - "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14" - }, - "329": { - "block": "rbac_assign_role_after_if_else@5", - "stack_in": [ - "role_address#0", - "config#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1" - ] - }, - "330": { - "op": "pushint 50", - "defined_out": [ - "50", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1", - "50" - ] - }, - "332": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%3#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "tmp%3#1" - ] - }, - "333": { - "op": "bz rbac_assign_role_after_if_else@7", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "336": { - "op": "bytec 4 // 0x52353023", - "defined_out": [ - "0x52353023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52353023" - ] - }, - "338": { - "op": "dig 3", - "defined_out": [ - "0x52353023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52353023", - "role_address#0" - ] - }, - "340": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%2#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%2#0" - ] - }, - "341": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%2#0", - "box_prefixed_key%2#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%2#0", - "box_prefixed_key%2#0 (copy)" - ] - }, - "342": { - "op": "box_len", - "defined_out": [ - "_%1#0", - "box_prefixed_key%2#0", - "maybe_exists%1#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%2#0", - "_%1#0", - "maybe_exists%1#0" - ] - }, - "343": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%2#0", - "maybe_exists%1#0" - ] - }, - "345": { - "op": "!", - "defined_out": [ - "box_prefixed_key%2#0", - "role_address#0", - "role_id#1", - "tmp%4#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%2#0", - "tmp%4#0" - ] - }, - "346": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%2#0" - ] - }, - "347": { - "op": "dig 2", - "defined_out": [ - "box_prefixed_key%2#0", - "config#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%2#0", - "config#0" - ] - }, - "349": { - "op": "box_put", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "350": { - "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14" - }, - "353": { - "block": "rbac_assign_role_after_if_else@7", - "stack_in": [ - "role_address#0", - "config#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1" - ] - }, - "354": { - "op": "pushint 60", - "defined_out": [ - "60", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1", - "60" - ] - }, - "356": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%5#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "tmp%5#0" - ] - }, - "357": { - "op": "bz rbac_assign_role_after_if_else@9", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "360": { - "op": "bytec 5 // 0x52363023", - "defined_out": [ - "0x52363023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52363023" - ] - }, - "362": { - "op": "dig 3", - "defined_out": [ - "0x52363023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52363023", - "role_address#0" - ] - }, - "364": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%4#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%4#0" - ] - }, - "365": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%4#0", - "box_prefixed_key%4#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%4#0", - "box_prefixed_key%4#0 (copy)" - ] - }, - "366": { - "op": "box_len", - "defined_out": [ - "_%2#0", - "box_prefixed_key%4#0", - "maybe_exists%2#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%4#0", - "_%2#0", - "maybe_exists%2#0" - ] - }, - "367": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%4#0", - "maybe_exists%2#0" - ] - }, - "369": { - "op": "!", - "defined_out": [ - "box_prefixed_key%4#0", - "role_address#0", - "role_id#1", - "tmp%6#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%4#0", - "tmp%6#1" - ] - }, - "370": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%4#0" - ] - }, - "371": { - "op": "dig 2", - "defined_out": [ - "box_prefixed_key%4#0", - "config#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%4#0", - "config#0" - ] - }, - "373": { - "op": "box_put", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "374": { - "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14" - }, - "377": { - "block": "rbac_assign_role_after_if_else@9", - "stack_in": [ - "role_address#0", - "config#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1" - ] - }, - "378": { - "op": "pushint 70", - "defined_out": [ - "70", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1", - "70" - ] - }, - "380": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%7#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "tmp%7#1" - ] - }, - "381": { - "op": "bz rbac_assign_role_after_if_else@11", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "384": { - "op": "bytec_2 // 0x52373023", - "defined_out": [ - "0x52373023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52373023" - ] - }, - "385": { - "op": "dig 3", - "defined_out": [ - "0x52373023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52373023", - "role_address#0" - ] - }, - "387": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%6#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%6#0" - ] - }, - "388": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%6#0", - "box_prefixed_key%6#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%6#0", - "box_prefixed_key%6#0 (copy)" - ] - }, - "389": { - "op": "box_len", - "defined_out": [ - "_%3#0", - "box_prefixed_key%6#0", - "maybe_exists%3#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%6#0", - "_%3#0", - "maybe_exists%3#0" - ] - }, - "390": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%6#0", - "maybe_exists%3#0" - ] - }, - "392": { - "op": "!", - "defined_out": [ - "box_prefixed_key%6#0", - "role_address#0", - "role_id#1", - "tmp%8#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%6#0", - "tmp%8#0" - ] - }, - "393": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%6#0" - ] - }, - "394": { - "op": "dig 2", - "defined_out": [ - "box_prefixed_key%6#0", - "config#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%6#0", - "config#0" - ] - }, - "396": { - "op": "box_put", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "397": { - "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14" - }, - "400": { - "block": "rbac_assign_role_after_if_else@11", - "stack_in": [ - "role_address#0", - "config#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1" - ] - }, - "401": { - "op": "pushint 80", - "defined_out": [ - "80", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1", - "80" - ] - }, - "403": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%9#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "tmp%9#0" - ] - }, - "404": { - "op": "bz rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "407": { - "op": "bytec 6 // 0x52383023", - "defined_out": [ - "0x52383023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52383023" - ] - }, - "409": { - "op": "dig 3", - "defined_out": [ - "0x52383023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52383023", - "role_address#0" - ] - }, - "411": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%8#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%8#0" - ] - }, - "412": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%8#0", - "box_prefixed_key%8#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%8#0", - "box_prefixed_key%8#0 (copy)" - ] - }, - "413": { - "op": "box_len", - "defined_out": [ - "_%4#0", - "box_prefixed_key%8#0", - "maybe_exists%4#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%8#0", - "_%4#0", - "maybe_exists%4#0" - ] - }, - "414": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%8#0", - "maybe_exists%4#0" - ] - }, - "416": { - "op": "!", - "defined_out": [ - "box_prefixed_key%8#0", - "role_address#0", - "role_id#1", - "tmp%10#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%8#0", - "tmp%10#0" - ] - }, - "417": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%8#0" - ] - }, - "418": { - "op": "dig 2", - "defined_out": [ - "box_prefixed_key%8#0", - "config#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%8#0", - "config#0" - ] - }, - "420": { - "op": "box_put", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "421": { - "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14" - }, - "424": { - "subroutine": "modules.rbac.RbacModule.rbac_revoke_role[routing]", - "params": {}, - "block": "rbac_revoke_role", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "role_id#0" - ], - "stack_out": [ - "role_id#0" - ] - }, - "427": { - "op": "dup", - "defined_out": [ - "role_id#0", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0", - "role_id#0 (copy)" - ] - }, - "428": { - "op": "len", - "defined_out": [ - "len%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "len%0#0" - ] - }, - "429": { - "op": "intc_0 // 1", - "defined_out": [ - "1", - "len%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "len%0#0", - "1" - ] - }, - "430": { - "op": "==", - "defined_out": [ - "eq%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "eq%0#0" - ] - }, - "431": { - "error": "invalid number of bytes for arc4.uint8", - "op": "assert // invalid number of bytes for arc4.uint8", - "stack_out": [ - "role_id#0" - ] - }, - "432": { - "op": "txna ApplicationArgs 2" - }, - "435": { - "op": "dup", - "defined_out": [ - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "role_address#0", - "role_address#0" - ] - }, - "436": { - "op": "cover 2", - "defined_out": [ - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "role_address#0" - ] - }, - "438": { - "op": "len", - "defined_out": [ - "len%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "len%1#0" - ] - }, - "439": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "len%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "len%1#0", - "32" - ] - }, - "440": { - "op": "==", - "defined_out": [ - "eq%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "eq%1#0" - ] - }, - "441": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "role_address#0", - "role_id#0" - ] - }, - "442": { - "callsub": "modules.rbac.RbacModule.assert_caller_is_arranger", - "op": "callsub assert_caller_is_arranger" - }, - "445": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "op": "callsub assert_is_not_asset_defaulted" - }, - "448": { - "op": "btoi", - "defined_out": [ - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "449": { - "op": "dupn 2", - "defined_out": [ - "role_address#0", - "role_id#1", - "role_id#1 (copy)" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "role_id#1 (copy)" - ] - }, - "451": { - "callsub": "modules.rbac.RbacModule._assert_valid_role", - "op": "callsub _assert_valid_role", - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1" - ] - }, - "454": { - "op": "dup", - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "role_id#1 (copy)" - ] - }, - "455": { - "op": "intc_3 // 20", - "defined_out": [ - "20", - "role_address#0", - "role_id#1", - "role_id#1 (copy)" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "role_id#1 (copy)", - "20" - ] - }, - "456": { - "op": "!=", - "defined_out": [ - "role_address#0", - "role_id#1", - "tmp%0#2" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "tmp%0#2" - ] - }, - "457": { - "error": "Invalid role identifier", - "op": "assert // Invalid role identifier", - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1" - ] - }, - "458": { - "op": "pushint 40", - "defined_out": [ - "40", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "40" - ] - }, - "460": { - "op": "==", - "defined_out": [ - "role_address#0", - "role_id#1", - "tmp%1#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "tmp%1#1" - ] - }, - "461": { - "op": "bz rbac_revoke_role_after_if_else@3", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "464": { - "op": "bytec_3 // 0x52343023", - "defined_out": [ - "0x52343023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52343023" - ] - }, - "465": { - "op": "dig 2", - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52343023", - "role_address#0" - ] - }, - "467": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%0#0" - ] - }, - "468": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#0", - "box_prefixed_key%0#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%0#0", - "box_prefixed_key%0#0 (copy)" - ] - }, - "469": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#0", - "maybe_exists%0#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%0#0", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "470": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%0#0", - "maybe_exists%0#0" - ] - }, - "472": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%0#0" - ] - }, - "473": { - "op": "box_del", - "defined_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ] - }, - "474": { - "op": "pop", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "475": { - "block": "rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12", - "stack_in": [ - "role_address#0", - "role_id#1" - ], - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%2#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "tmp%2#1" - ] - }, - "477": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "aggregate%val_as_bytes%0#0" - ] - }, - "478": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "aggregate%val_as_bytes%0#0", - "0x151f7c75" - ] - }, - "479": { - "op": "swap", - "stack_out": [ - "role_address#0", - "role_id#1", - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ] - }, - "480": { - "op": "concat", - "defined_out": [ - "tmp%5#0" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "tmp%5#0" - ] - }, - "481": { - "op": "log", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "482": { - "op": "intc_0 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "1" - ] - }, - "483": { - "op": "return", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "484": { - "block": "rbac_revoke_role_after_if_else@3", - "stack_in": [ - "role_address#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1" - ] - }, - "485": { - "op": "pushint 50", - "defined_out": [ - "50", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "50" - ] - }, - "487": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%2#2" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "tmp%2#2" - ] - }, - "488": { - "op": "bz rbac_revoke_role_after_if_else@5", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "491": { - "op": "bytec 4 // 0x52353023", - "defined_out": [ - "0x52353023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52353023" - ] - }, - "493": { - "op": "dig 2", - "defined_out": [ - "0x52353023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52353023", - "role_address#0" - ] - }, - "495": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%2#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%2#0" - ] - }, - "496": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%2#0", - "box_prefixed_key%2#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%2#0", - "box_prefixed_key%2#0 (copy)" - ] - }, - "497": { - "op": "box_len", - "defined_out": [ - "_%1#0", - "box_prefixed_key%2#0", - "maybe_exists%1#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%2#0", - "_%1#0", - "maybe_exists%1#0" - ] - }, - "498": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%2#0", - "maybe_exists%1#0" - ] - }, - "500": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%2#0" - ] - }, - "501": { - "op": "box_del", - "defined_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ] - }, - "502": { - "op": "pop", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "503": { - "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" - }, - "506": { - "block": "rbac_revoke_role_after_if_else@5", - "stack_in": [ - "role_address#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1" - ] - }, - "507": { - "op": "pushint 60", - "defined_out": [ - "60", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "60" - ] - }, - "509": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "tmp%3#0" - ] - }, - "510": { - "op": "bz rbac_revoke_role_after_if_else@7", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "513": { - "op": "bytec 5 // 0x52363023", - "defined_out": [ - "0x52363023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52363023" - ] - }, - "515": { - "op": "dig 2", - "defined_out": [ - "0x52363023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52363023", - "role_address#0" - ] - }, - "517": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%4#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%4#0" - ] - }, - "518": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%4#0", - "box_prefixed_key%4#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%4#0", - "box_prefixed_key%4#0 (copy)" - ] - }, - "519": { - "op": "box_len", - "defined_out": [ - "_%2#0", - "box_prefixed_key%4#0", - "maybe_exists%2#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%4#0", - "_%2#0", - "maybe_exists%2#0" - ] - }, - "520": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%4#0", - "maybe_exists%2#0" - ] - }, - "522": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%4#0" - ] - }, - "523": { - "op": "box_del", - "defined_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ] - }, - "524": { - "op": "pop", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "525": { - "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" - }, - "528": { - "block": "rbac_revoke_role_after_if_else@7", - "stack_in": [ - "role_address#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1" - ] - }, - "529": { - "op": "pushint 70", - "defined_out": [ - "70", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "70" - ] - }, - "531": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%4#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "tmp%4#1" - ] - }, - "532": { - "op": "bz rbac_revoke_role_after_if_else@9", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "535": { - "op": "bytec_2 // 0x52373023", - "defined_out": [ - "0x52373023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52373023" - ] - }, - "536": { - "op": "dig 2", - "defined_out": [ - "0x52373023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52373023", - "role_address#0" - ] - }, - "538": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%6#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%6#0" - ] - }, - "539": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%6#0", - "box_prefixed_key%6#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%6#0", - "box_prefixed_key%6#0 (copy)" - ] - }, - "540": { - "op": "box_len", - "defined_out": [ - "_%3#0", - "box_prefixed_key%6#0", - "maybe_exists%3#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%6#0", - "_%3#0", - "maybe_exists%3#0" - ] - }, - "541": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%6#0", - "maybe_exists%3#0" - ] - }, - "543": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%6#0" - ] - }, - "544": { - "op": "box_del", - "defined_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ] - }, - "545": { - "op": "pop", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "546": { - "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" - }, - "549": { - "block": "rbac_revoke_role_after_if_else@9", - "stack_in": [ - "role_address#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1" - ] - }, - "550": { - "op": "pushint 80", - "defined_out": [ - "80", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "80" - ] - }, - "552": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%5#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "tmp%5#1" - ] - }, - "553": { - "op": "bz rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "556": { - "op": "bytec 6 // 0x52383023", - "defined_out": [ - "0x52383023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52383023" - ] - }, - "558": { - "op": "dig 2", - "defined_out": [ - "0x52383023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52383023", - "role_address#0" - ] - }, - "560": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%8#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%8#0" - ] - }, - "561": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%8#0", - "box_prefixed_key%8#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%8#0", - "box_prefixed_key%8#0 (copy)" - ] - }, - "562": { - "op": "box_len", - "defined_out": [ - "_%4#0", - "box_prefixed_key%8#0", - "maybe_exists%4#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%8#0", - "_%4#0", - "maybe_exists%4#0" - ] - }, - "563": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%8#0", - "maybe_exists%4#0" - ] - }, - "565": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%8#0" - ] - }, - "566": { - "op": "box_del", - "defined_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ] - }, - "567": { - "op": "pop", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "568": { - "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" - }, - "571": { - "subroutine": "modules.rbac.RbacModule.rbac_gov_asset_suspension[routing]", - "params": {}, - "block": "rbac_gov_asset_suspension", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "574": { - "op": "dup", - "defined_out": [ - "tmp%0#0", - "tmp%0#0 (copy)" - ], - "stack_out": [ - "tmp%0#0", - "tmp%0#0 (copy)" - ] - }, - "575": { - "op": "len", - "defined_out": [ - "len%0#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "len%0#0" - ] - }, - "576": { - "op": "intc_0 // 1", - "defined_out": [ - "1", - "len%0#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "len%0#0", - "1" - ] - }, - "577": { - "op": "==", - "defined_out": [ - "eq%0#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "eq%0#0" - ] - }, - "578": { - "error": "invalid number of bytes for arc4.bool", - "op": "assert // invalid number of bytes for arc4.bool", - "stack_out": [ - "tmp%0#0" - ] - }, - "579": { - "op": "intc_1 // 0", - "defined_out": [ - "0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "0" - ] - }, - "580": { - "op": "getbit", - "defined_out": [ - "suspended#0" - ], - "stack_out": [ - "suspended#0" - ] - }, - "581": { - "op": "bytec_2 // 0x52373023", - "defined_out": [ - "0x52373023", - "suspended#0" - ], - "stack_out": [ - "suspended#0", - "0x52373023" - ] - }, - "582": { - "op": "txn Sender", - "defined_out": [ - "0x52373023", - "suspended#0", - "tmp%0#2" - ], - "stack_out": [ - "suspended#0", - "0x52373023", - "tmp%0#2" - ] - }, - "584": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "suspended#0", - "tmp%1#0" - ], - "stack_out": [ - "suspended#0", - "tmp%1#0" - ] - }, - "587": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "suspended#0" - ] - }, - "588": { - "op": "bytec 8 // \"asset_suspended\"", - "defined_out": [ - "\"asset_suspended\"", - "suspended#0" - ], - "stack_out": [ - "suspended#0", - "\"asset_suspended\"" - ] - }, - "590": { - "op": "swap", - "stack_out": [ - "\"asset_suspended\"", - "suspended#0" - ] - }, - "591": { - "op": "app_global_put", - "stack_out": [] - }, - "592": { - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1" - ] - }, - "594": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0" - ] - }, - "595": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0", - "0x151f7c75" - ] - }, - "596": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ] - }, - "597": { - "op": "concat", - "defined_out": [ - "tmp%4#0" - ], - "stack_out": [ - "tmp%4#0" - ] - }, - "598": { - "op": "log", - "stack_out": [] - }, - "599": { - "op": "intc_0 // 1", - "stack_out": [ - "1" - ] - }, - "600": { - "op": "return", - "stack_out": [] - }, - "601": { - "subroutine": "modules.rbac.RbacModule.rbac_get_arranger[routing]", - "params": {}, - "block": "rbac_get_arranger", - "stack_in": [], - "op": "intc_1 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "0" - ] - }, - "602": { - "op": "bytec_1 // 0x52323023", - "defined_out": [ - "0", - "0x52323023" - ], - "stack_out": [ - "0", - "0x52323023" - ] - }, - "603": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "604": { - "error": "check self.arranger exists", - "op": "assert // check self.arranger exists", - "stack_out": [ - "maybe_value%0#0" - ] - }, - "605": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "0x151f7c75" - ] - }, - "606": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "maybe_value%0#0" - ] - }, - "607": { - "op": "concat", - "defined_out": [ - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0" - ] - }, - "608": { - "op": "log", - "stack_out": [] - }, - "609": { - "op": "intc_0 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "610": { - "op": "return", - "stack_out": [] - }, - "611": { - "subroutine": "modules.rbac.RbacModule.rbac_get_address_roles[routing]", - "params": {}, - "block": "rbac_get_address_roles", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "address#0" - ], - "stack_out": [ - "address#0" - ] - }, - "614": { - "op": "dup", - "defined_out": [ - "address#0", - "address#0 (copy)" - ], - "stack_out": [ - "address#0", - "address#0 (copy)" - ] - }, - "615": { - "op": "len", - "defined_out": [ - "address#0", - "len%0#0" - ], - "stack_out": [ - "address#0", - "len%0#0" - ] - }, - "616": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "address#0", - "len%0#0" - ], - "stack_out": [ - "address#0", - "len%0#0", - "32" - ] - }, - "617": { - "op": "==", - "defined_out": [ - "address#0", - "eq%0#0" - ], - "stack_out": [ - "address#0", - "eq%0#0" - ] - }, - "618": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "address#0" - ] - }, - "619": { - "op": "bytec_3 // 0x52343023", - "defined_out": [ - "0x52343023", - "address#0" - ], - "stack_out": [ - "address#0", - "0x52343023" - ] - }, - "620": { - "op": "dig 1", - "stack_out": [ - "address#0", - "0x52343023", - "address#0 (copy)" - ] - }, - "622": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "address#0", - "tmp%0#1" - ], - "stack_out": [ - "address#0", - "tmp%0#1" - ] - }, - "625": { - "op": "bytec 4 // 0x52353023", - "defined_out": [ - "0x52353023", - "address#0", - "tmp%0#1" - ], - "stack_out": [ - "address#0", - "tmp%0#1", - "0x52353023" - ] - }, - "627": { - "op": "dig 2", - "stack_out": [ - "address#0", - "tmp%0#1", - "0x52353023", - "address#0 (copy)" - ] - }, - "629": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1" - ], - "stack_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1" - ] - }, - "632": { - "op": "bytec 5 // 0x52363023", - "defined_out": [ - "0x52363023", - "address#0", - "tmp%0#1", - "tmp%1#1" - ], - "stack_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "0x52363023" - ] - }, - "634": { - "op": "dig 3", - "stack_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "0x52363023", - "address#0 (copy)" - ] - }, - "636": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1" - ], - "stack_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1" - ] - }, - "639": { - "op": "bytec_2 // 0x52373023", - "defined_out": [ - "0x52373023", - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1" - ], - "stack_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "0x52373023" - ] - }, - "640": { - "op": "dig 4", - "stack_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "0x52373023", - "address#0 (copy)" - ] - }, - "642": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1" - ], - "stack_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1" - ] - }, - "645": { - "op": "bytec 6 // 0x52383023", - "defined_out": [ - "0x52383023", - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1" - ], - "stack_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "0x52383023" - ] - }, - "647": { - "op": "uncover 5", - "stack_out": [ - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "0x52383023", - "address#0" - ] - }, - "649": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1" - ] - }, - "652": { - "op": "pushbytes 0x00", - "defined_out": [ - "0x00", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1", - "0x00" - ] - }, - "655": { - "op": "intc_1 // 0", - "defined_out": [ - "0", - "0x00", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1", - "0x00", - "0" - ] - }, - "656": { - "op": "uncover 6", - "stack_out": [ - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1", - "0x00", - "0", - "tmp%0#1" - ] - }, - "658": { - "op": "setbit", - "defined_out": [ - "aggregate%encoded_bool%0#0", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1", - "aggregate%encoded_bool%0#0" - ] - }, - "659": { - "op": "intc_0 // 1", - "defined_out": [ - "1", - "aggregate%encoded_bool%0#0", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1", - "aggregate%encoded_bool%0#0", - "1" - ] - }, - "660": { - "op": "uncover 5", - "stack_out": [ - "tmp%2#1", - "tmp%3#1", - "tmp%4#1", - "aggregate%encoded_bool%0#0", - "1", - "tmp%1#1" - ] - }, - "662": { - "op": "setbit", - "defined_out": [ - "aggregate%set_bit%0#0", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%2#1", - "tmp%3#1", - "tmp%4#1", - "aggregate%set_bit%0#0" - ] - }, - "663": { - "op": "pushint 2", - "defined_out": [ - "2", - "aggregate%set_bit%0#0", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%2#1", - "tmp%3#1", - "tmp%4#1", - "aggregate%set_bit%0#0", - "2" - ] - }, - "665": { - "op": "uncover 4", - "stack_out": [ - "tmp%3#1", - "tmp%4#1", - "aggregate%set_bit%0#0", - "2", - "tmp%2#1" - ] - }, - "667": { - "op": "setbit", - "defined_out": [ - "aggregate%set_bit%1#0", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%3#1", - "tmp%4#1", - "aggregate%set_bit%1#0" - ] - }, - "668": { - "op": "pushint 3", - "defined_out": [ - "3", - "aggregate%set_bit%1#0", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%3#1", - "tmp%4#1", - "aggregate%set_bit%1#0", - "3" - ] - }, - "670": { - "op": "uncover 3", - "stack_out": [ - "tmp%4#1", - "aggregate%set_bit%1#0", - "3", - "tmp%3#1" - ] - }, - "672": { - "op": "setbit", - "defined_out": [ - "aggregate%set_bit%2#0", - "tmp%4#1" - ], - "stack_out": [ - "tmp%4#1", - "aggregate%set_bit%2#0" - ] - }, - "673": { - "op": "pushint 4", - "defined_out": [ - "4", - "aggregate%set_bit%2#0", - "tmp%4#1" - ], - "stack_out": [ - "tmp%4#1", - "aggregate%set_bit%2#0", - "4" - ] - }, - "675": { - "op": "uncover 2", - "stack_out": [ - "aggregate%set_bit%2#0", - "4", - "tmp%4#1" - ] - }, - "677": { - "op": "setbit", - "defined_out": [ - "aggregate%set_bit%3#0" - ], - "stack_out": [ - "aggregate%set_bit%3#0" - ] - }, - "678": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%set_bit%3#0" - ], - "stack_out": [ - "aggregate%set_bit%3#0", - "0x151f7c75" - ] - }, - "679": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%set_bit%3#0" - ] - }, - "680": { - "op": "concat", - "defined_out": [ - "tmp%8#0" - ], - "stack_out": [ - "tmp%8#0" - ] - }, - "681": { - "op": "log", - "stack_out": [] - }, - "682": { - "op": "intc_0 // 1", - "stack_out": [ - "1" - ] - }, - "683": { - "op": "return", - "stack_out": [] - }, - "684": { - "subroutine": "modules.rbac.RbacModule.rbac_get_role_config[routing]", - "params": {}, - "block": "rbac_get_role_config", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "role_id#0" - ], - "stack_out": [ - "role_id#0" - ] - }, - "687": { - "op": "dup", - "defined_out": [ - "role_id#0", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0", - "role_id#0 (copy)" - ] - }, - "688": { - "op": "len", - "defined_out": [ - "len%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "len%0#0" - ] - }, - "689": { - "op": "intc_0 // 1", - "defined_out": [ - "1", - "len%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "len%0#0", - "1" - ] - }, - "690": { - "op": "==", - "defined_out": [ - "eq%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "eq%0#0" - ] - }, - "691": { - "error": "invalid number of bytes for arc4.uint8", - "op": "assert // invalid number of bytes for arc4.uint8", - "stack_out": [ - "role_id#0" - ] - }, - "692": { - "op": "txna ApplicationArgs 2" - }, - "695": { - "op": "dup", - "defined_out": [ - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "role_address#0", - "role_address#0" - ] - }, - "696": { - "op": "cover 2", - "defined_out": [ - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "role_address#0" - ] - }, - "698": { - "op": "len", - "defined_out": [ - "len%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "len%1#0" - ] - }, - "699": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "len%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "len%1#0", - "32" - ] - }, - "700": { - "op": "==", - "defined_out": [ - "eq%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "eq%1#0" - ] - }, - "701": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "role_address#0", - "role_id#0" - ] - }, - "702": { - "op": "btoi", - "defined_out": [ - "role#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "role#0" - ] - }, - "703": { - "op": "dup", - "defined_out": [ - "role#0", - "role#0 (copy)", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "role#0", - "role#0 (copy)" - ] - }, - "704": { - "callsub": "modules.rbac.RbacModule._assert_valid_role", - "op": "callsub _assert_valid_role", - "stack_out": [ - "role_address#0", - "role#0" - ] - }, - "707": { - "op": "intc_3 // 20", - "defined_out": [ - "20", - "role#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "role#0", - "20" - ] - }, - "708": { - "op": "pushints 40 50 60 70 80", - "defined_out": [ - "20", - "40", - "50", - "60", - "70", - "80", - "role#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "role#0", - "20", - "40", - "50", - "60", - "70", - "80" - ] - }, - "715": { - "op": "uncover 6", - "stack_out": [ - "role_address#0", - "20", - "40", - "50", - "60", - "70", - "80", - "role#0" - ] - }, - "717": { - "op": "match rbac_get_role_config_switch_case_0@2 rbac_get_role_config_switch_case_1@3 rbac_get_role_config_switch_case_2@4 rbac_get_role_config_switch_case_3@5 rbac_get_role_config_switch_case_4@6 rbac_get_role_config_switch_case_5@7", - "stack_out": [ - "role_address#0" - ] - }, - "731": { - "error": "Invalid role identifier", - "op": "err // Invalid role identifier" - }, - "732": { - "block": "rbac_get_role_config_switch_case_5@7", - "stack_in": [ - "role_address#0" - ], - "op": "bytec 6 // 0x52383023", - "defined_out": [ - "0x52383023" - ], - "stack_out": [ - "role_address#0", - "0x52383023" - ] - }, - "734": { - "op": "dig 1", - "defined_out": [ - "0x52383023", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "0x52383023", - "role_address#0" - ] - }, - "736": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "737": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "738": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "739": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "741": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "742": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%8#0", - "aggregate%box_get%9#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "aggregate%box_get%8#0", - "aggregate%box_get%9#0" - ] - }, - "743": { - "op": "pop", - "defined_out": [ - "role_address#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "tmp%3#0" - ] - }, - "744": { - "block": "rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9", - "stack_in": [ - "role_address#0", - "tmp%3#0" - ], - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75" - ], - "stack_out": [ - "role_address#0", - "tmp%3#0", - "0x151f7c75" - ] - }, - "745": { - "op": "swap", - "defined_out": [ - "0x151f7c75", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "0x151f7c75", - "tmp%3#0" - ] - }, - "746": { - "op": "concat", - "defined_out": [ - "tmp%4#0" - ], - "stack_out": [ - "role_address#0", - "tmp%4#0" - ] - }, - "747": { - "op": "log", - "stack_out": [ - "role_address#0" - ] - }, - "748": { - "op": "intc_0 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "role_address#0", - "1" - ] - }, - "749": { - "op": "return", - "stack_out": [ - "role_address#0" - ] - }, - "750": { - "block": "rbac_get_role_config_switch_case_4@6", - "stack_in": [ - "role_address#0" - ], - "op": "bytec_2 // 0x52373023", - "defined_out": [ - "0x52373023" - ], - "stack_out": [ - "role_address#0", - "0x52373023" - ] - }, - "751": { - "op": "dig 1", - "defined_out": [ - "0x52373023", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "0x52373023", - "role_address#0" - ] - }, - "753": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "754": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "755": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "756": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "758": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "759": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%6#0", - "aggregate%box_get%7#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "aggregate%box_get%6#0", - "aggregate%box_get%7#0" - ] - }, - "760": { - "op": "pop", - "defined_out": [ - "role_address#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "tmp%3#0" - ] - }, - "761": { - "op": "b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9" - }, - "764": { - "block": "rbac_get_role_config_switch_case_3@5", - "stack_in": [ - "role_address#0" - ], - "op": "bytec 5 // 0x52363023", - "defined_out": [ - "0x52363023" - ], - "stack_out": [ - "role_address#0", - "0x52363023" - ] - }, - "766": { - "op": "dig 1", - "defined_out": [ - "0x52363023", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "0x52363023", - "role_address#0" - ] - }, - "768": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "769": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "770": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "771": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "773": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "774": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%4#0", - "aggregate%box_get%5#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "aggregate%box_get%4#0", - "aggregate%box_get%5#0" - ] - }, - "775": { - "op": "pop", - "defined_out": [ - "role_address#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "tmp%3#0" - ] - }, - "776": { - "op": "b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9" - }, - "779": { - "block": "rbac_get_role_config_switch_case_2@4", - "stack_in": [ - "role_address#0" - ], - "op": "bytec 4 // 0x52353023", - "defined_out": [ - "0x52353023" - ], - "stack_out": [ - "role_address#0", - "0x52353023" - ] - }, - "781": { - "op": "dig 1", - "defined_out": [ - "0x52353023", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "0x52353023", - "role_address#0" - ] - }, - "783": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "784": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "785": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "786": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "788": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "789": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%2#0", - "aggregate%box_get%3#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "aggregate%box_get%2#0", - "aggregate%box_get%3#0" - ] - }, - "790": { - "op": "pop", - "defined_out": [ - "role_address#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "tmp%3#0" - ] - }, - "791": { - "op": "b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9" - }, - "794": { - "block": "rbac_get_role_config_switch_case_1@3", - "stack_in": [ - "role_address#0" - ], - "op": "bytec_3 // 0x52343023", - "defined_out": [ - "0x52343023" - ], - "stack_out": [ - "role_address#0", - "0x52343023" - ] - }, - "795": { - "op": "dig 1", - "defined_out": [ - "0x52343023", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "0x52343023", - "role_address#0" - ] - }, - "797": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "798": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "799": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "800": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "802": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "803": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "804": { - "op": "pop", - "defined_out": [ - "role_address#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "tmp%3#0" - ] - }, - "805": { - "op": "b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9" - }, - "808": { - "block": "rbac_get_role_config_switch_case_0@2", - "stack_in": [ - "role_address#0" - ], - "op": "pushbytes 0x00000000000000000000000000000000", - "defined_out": [ - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "tmp%3#0" - ] - }, - "826": { - "op": "b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9" - }, - "829": { - "subroutine": "modules.rbac.RbacModule._role_is_active", - "params": { - "role_map#0": "bytes", - "role_address#0": "bytes" - }, - "block": "_role_is_active", - "stack_in": [], - "op": "proto 2 1" - }, - "832": { - "op": "pushbytes \"\"", - "stack_out": [ - "awst_tmp%0#0" - ] - }, - "834": { - "op": "frame_dig -2", - "defined_out": [ - "role_map#0 (copy)" - ], - "stack_out": [ - "awst_tmp%0#0", - "role_map#0 (copy)" - ] - }, - "836": { - "op": "frame_dig -1", - "defined_out": [ - "role_address#0 (copy)", - "role_map#0 (copy)" - ], - "stack_out": [ - "awst_tmp%0#0", - "role_map#0 (copy)", - "role_address#0 (copy)" - ] - }, - "838": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1" - ] - }, - "839": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1" - ] - }, - "840": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "841": { - "op": "bury 1", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "843": { - "op": "bz _role_is_active_bool_false@4", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1" - ] - }, - "846": { - "op": "frame_dig 1", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1" - ] - }, - "848": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0", - "box_prefixed_key%0#1" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "849": { - "error": "check BoxMap entry exists", - "op": "assert // check BoxMap entry exists", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "aggregate%box_get%0#0" - ] - }, - "850": { - "op": "intc_1 // 0", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "aggregate%box_get%0#0", - "0" - ] - }, - "851": { - "op": "extract_uint64", - "defined_out": [ - "box_prefixed_key%0#1", - "values%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "values%0#0" - ] - }, - "852": { - "op": "global LatestTimestamp" - }, - "854": { - "op": "dup", - "defined_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "values%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "values%0#0", - "awst_tmp%0#0", - "awst_tmp%0#0" - ] - }, - "855": { - "op": "frame_bury 0", - "defined_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "values%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "values%0#0", - "awst_tmp%0#0" - ] - }, - "857": { - "op": "<=", - "defined_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "tmp%1#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "tmp%1#0" - ] - }, - "858": { - "op": "bz _role_is_active_bool_false@4", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1" - ] - }, - "861": { - "op": "frame_dig 1", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1" - ] - }, - "863": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%2#0", - "aggregate%box_get%3#0", - "awst_tmp%0#0", - "box_prefixed_key%0#1" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "aggregate%box_get%2#0", - "aggregate%box_get%3#0" - ] - }, - "864": { - "error": "check BoxMap entry exists", - "op": "assert // check BoxMap entry exists", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "aggregate%box_get%2#0" - ] - }, - "865": { - "op": "pushint 8", - "defined_out": [ - "8", - "aggregate%box_get%2#0", - "awst_tmp%0#0", - "box_prefixed_key%0#1" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "aggregate%box_get%2#0", - "8" - ] - }, - "867": { - "op": "extract_uint64", - "defined_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "values%1#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "values%1#0" - ] - }, - "868": { - "op": "frame_dig 0", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "values%1#0", - "awst_tmp%0#0" - ] - }, - "870": { - "op": ">=", - "defined_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "tmp%2#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "tmp%2#0" - ] - }, - "871": { - "op": "bz _role_is_active_bool_false@4", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1" - ] - }, - "874": { - "op": "intc_0 // 1", - "defined_out": [ - "and_result%0#0", - "awst_tmp%0#0", - "box_prefixed_key%0#1" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "and_result%0#0" - ] - }, - "875": { - "block": "_role_is_active_bool_merge@5", - "stack_in": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "and_result%0#0" - ], - "op": "frame_bury 0", - "defined_out": [ - "and_result%0#0" - ] - }, - "877": { - "retsub": true, - "op": "retsub" - }, - "878": { - "block": "_role_is_active_bool_false@4", - "stack_in": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1" - ], - "op": "intc_1 // 0", - "defined_out": [ - "and_result%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "and_result%0#0" - ] - }, - "879": { - "op": "b _role_is_active_bool_merge@5" - }, - "882": { - "subroutine": "modules.rbac.RbacModule.assert_caller_is_arranger", - "params": {}, - "block": "assert_caller_is_arranger", - "stack_in": [], - "op": "txn Sender", - "defined_out": [ - "role_address#0" - ], - "stack_out": [ - "role_address#0" - ] - }, - "884": { - "op": "intc_1 // 0", - "defined_out": [ - "0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "0" - ] - }, - "885": { - "op": "bytec_1 // 0x52323023", - "defined_out": [ - "0", - "0x52323023", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "0", - "0x52323023" - ] - }, - "886": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "887": { - "error": "check self.arranger exists", - "op": "assert // check self.arranger exists", - "stack_out": [ - "role_address#0", - "maybe_value%0#0" - ] - }, - "888": { - "op": "==", - "defined_out": [ - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1" - ] - }, - "889": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [] - }, - "890": { - "retsub": true, - "op": "retsub" - }, - "891": { - "subroutine": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "params": {}, - "block": "assert_is_not_asset_defaulted", - "stack_in": [], - "op": "intc_1 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "0" - ] - }, - "892": { - "op": "bytec 9 // \"asset_defaulted\"", - "defined_out": [ - "\"asset_defaulted\"", - "0" - ], - "stack_out": [ - "0", - "\"asset_defaulted\"" - ] - }, - "894": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "895": { - "error": "check self.asset_defaulted exists", - "op": "assert // check self.asset_defaulted exists", - "stack_out": [ - "maybe_value%0#0" - ] - }, - "896": { - "op": "!", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "897": { - "error": "Defaulted", - "op": "assert // Defaulted", - "stack_out": [] - }, - "898": { - "retsub": true, - "op": "retsub" - }, - "899": { - "subroutine": "modules.rbac.RbacModule._assert_valid_role", - "params": { - "role_id#0": "uint64" - }, - "block": "_assert_valid_role", - "stack_in": [], - "op": "proto 1 0" - }, - "902": { - "op": "frame_dig -1", - "defined_out": [ - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0 (copy)" - ] - }, - "904": { - "op": "intc_3 // 20", - "defined_out": [ - "20", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0 (copy)", - "20" - ] - }, - "905": { - "op": "==", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "906": { - "op": "bnz _assert_valid_role_bool_true@6", - "stack_out": [] - }, - "909": { - "op": "frame_dig -1", - "stack_out": [ - "role_id#0 (copy)" - ] - }, - "911": { - "op": "pushint 40", - "defined_out": [ - "40", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0 (copy)", - "40" - ] - }, - "913": { - "op": "==", - "defined_out": [ - "tmp%1#0" - ], - "stack_out": [ - "tmp%1#0" - ] - }, - "914": { - "op": "bnz _assert_valid_role_bool_true@6", - "stack_out": [] - }, - "917": { - "op": "frame_dig -1", - "stack_out": [ - "role_id#0 (copy)" - ] - }, - "919": { - "op": "pushint 50", - "defined_out": [ - "50", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0 (copy)", - "50" - ] - }, - "921": { - "op": "==", - "defined_out": [ - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0" - ] - }, - "922": { - "op": "bnz _assert_valid_role_bool_true@6", - "stack_out": [] - }, - "925": { - "op": "frame_dig -1", - "stack_out": [ - "role_id#0 (copy)" - ] - }, - "927": { - "op": "pushint 60", - "defined_out": [ - "60", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0 (copy)", - "60" - ] - }, - "929": { - "op": "==", - "defined_out": [ - "tmp%3#0" - ], - "stack_out": [ - "tmp%3#0" - ] - }, - "930": { - "op": "bnz _assert_valid_role_bool_true@6", - "stack_out": [] - }, - "933": { - "op": "frame_dig -1", - "stack_out": [ - "role_id#0 (copy)" - ] - }, - "935": { - "op": "pushint 70", - "defined_out": [ - "70", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0 (copy)", - "70" - ] - }, - "937": { - "op": "==", - "defined_out": [ - "tmp%4#0" - ], - "stack_out": [ - "tmp%4#0" - ] - }, - "938": { - "op": "bnz _assert_valid_role_bool_true@6", - "stack_out": [] - }, - "941": { - "op": "frame_dig -1", - "stack_out": [ - "role_id#0 (copy)" - ] - }, - "943": { - "op": "pushint 80", - "defined_out": [ - "80", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0 (copy)", - "80" - ] - }, - "945": { - "op": "==", - "defined_out": [ - "tmp%5#0" - ], - "stack_out": [ - "tmp%5#0" - ] - }, - "946": { - "op": "bz _assert_valid_role_bool_false@7", - "stack_out": [] - }, - "949": { - "block": "_assert_valid_role_bool_true@6", - "stack_in": [], - "op": "intc_0 // 1", - "defined_out": [ - "or_result%0#0" - ], - "stack_out": [ - "or_result%0#0" - ] - }, - "950": { - "error": "Invalid role identifier", - "block": "_assert_valid_role_bool_merge@8", - "stack_in": [ - "or_result%0#0" - ], - "op": "assert // Invalid role identifier", - "defined_out": [], - "stack_out": [] - }, - "951": { - "retsub": true, - "op": "retsub" - }, - "952": { - "block": "_assert_valid_role_bool_false@7", - "stack_in": [], - "op": "intc_1 // 0", - "defined_out": [ - "or_result%0#0" - ], - "stack_out": [ - "or_result%0#0" - ] - }, - "953": { - "op": "b _assert_valid_role_bool_merge@8" - } - } -} \ No newline at end of file diff --git a/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.approval.teal b/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.approval.teal deleted file mode 100644 index f54d8717..00000000 --- a/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.approval.teal +++ /dev/null @@ -1,1036 +0,0 @@ -#pragma version 11 -#pragma typetrack false - -// algopy.arc4.ARC4Contract.approval_program() -> uint64: -main: - intcblock 1 0 32 20 - bytecblock 0x151f7c75 0x52323023 0x52373023 0x52343023 0x52353023 0x52363023 0x52383023 0x52323523 "asset_suspended" "asset_defaulted" - txn ApplicationID - bnz main_after_if_else@2 - // modules/rbac.py:30-31 - // # RBAC Roles - // self.arranger = GlobalState(Account(), key=cst.PREFIX_ID_ARRANGER) - bytec_1 // 0x52323023 - global ZeroAddress - app_global_put - // modules/rbac.py:32 - // self.op_daemon = GlobalState(Account(), key=cst.PREFIX_ID_OP_DAEMON) - bytec 7 // 0x52323523 - global ZeroAddress - app_global_put - // modules/rbac.py:47-48 - // # D-ASA Governance - // self.asset_suspended = False - bytec 8 // "asset_suspended" - intc_1 // 0 - app_global_put - // modules/rbac.py:49 - // self.asset_defaulted = False - bytec 9 // "asset_defaulted" - intc_1 // 0 - app_global_put - -main_after_if_else@2: - // smart_contracts/mock_module_rbac/contract.py:6 - // class MockRbacModule(RbacModule): - txn NumAppArgs - bz main_create@17 - txn OnCompletion - ! - assert - txn ApplicationID - assert - pushbytess 0x82f71b2d 0xef04f5d3 0x03b83329 0x3dbe80bd 0xdf54e82c 0x010c8299 0x7406acd2 0xc3e4b297 // method "rbac_rotate_arranger(address)uint64", method "rbac_set_op_daemon(address)uint64", method "rbac_assign_role(uint8,address,byte[])uint64", method "rbac_revoke_role(uint8,address)uint64", method "rbac_gov_asset_suspension(bool)uint64", method "rbac_get_arranger()address", method "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", method "rbac_get_role_config(uint8,address)(uint64,uint64)" - txna ApplicationArgs 0 - match rbac_rotate_arranger rbac_set_op_daemon rbac_assign_role rbac_revoke_role rbac_gov_asset_suspension rbac_get_arranger rbac_get_address_roles rbac_get_role_config - err - -main_create@17: - // smart_contracts/mock_module_rbac/contract.py:14 - // @arc4.baremethod(create="require") - txn OnCompletion - ! - txn ApplicationID - ! - && - assert - // smart_contracts/mock_module_rbac/contract.py:16 - // self.arranger.value = Txn.sender - bytec_1 // 0x52323023 - txn Sender - app_global_put - // smart_contracts/mock_module_rbac/contract.py:14 - // @arc4.baremethod(create="require") - intc_0 // 1 - return - - -// modules.rbac.RbacModule.rbac_rotate_arranger[routing]() -> void: -rbac_rotate_arranger: - // modules/rbac.py:147 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:158 - // self.assert_caller_is_arranger() - callsub assert_caller_is_arranger - // modules/rbac.py:159 - // self.arranger.value = new_arranger - bytec_1 // 0x52323023 - swap - app_global_put - // modules/rbac.py:160 - // return Global.latest_timestamp - global LatestTimestamp - // modules/rbac.py:147 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_0 // 1 - return - - -// modules.rbac.RbacModule.rbac_set_op_daemon[routing]() -> void: -rbac_set_op_daemon: - // modules/rbac.py:162 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:173 - // self.assert_caller_is_arranger() - callsub assert_caller_is_arranger - // modules/rbac.py:174 - // self.op_daemon.value = address - bytec 7 // 0x52323523 - swap - app_global_put - // modules/rbac.py:175 - // return Global.latest_timestamp - global LatestTimestamp - // modules/rbac.py:162 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_0 // 1 - return - - -// modules.rbac.RbacModule.rbac_assign_role[routing]() -> void: -rbac_assign_role: - // modules/rbac.py:177 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_0 // 1 - == - assert // invalid number of bytes for arc4.uint8 - txna ApplicationArgs 2 - dup - cover 2 - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - txna ApplicationArgs 3 - dup - intc_1 // 0 - extract_uint16 // on error: invalid array length header - pushint 2 - + - dig 1 - len - == - assert // invalid number of bytes for arc4.dynamic_array - extract 2 0 - swap - // modules/rbac.py:199 - // self.assert_caller_is_arranger() - callsub assert_caller_is_arranger - // modules/rbac.py:200 - // self.assert_is_not_asset_defaulted() - callsub assert_is_not_asset_defaulted - // modules/rbac.py:201 - // self._assert_valid_role(role_id.as_uint64()) - btoi - dupn 2 - callsub _assert_valid_role - // modules/rbac.py:101 - // if role_id == UInt64(cst.ROLE_ARRANGER): - intc_3 // 20 - == - bz rbac_assign_role_after_if_else@3 - // modules/rbac.py:102 - // self.arranger.value = role_address - bytec_1 // 0x52323023 - dig 3 - app_global_put - -rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14: - // modules/rbac.py:203 - // return Global.latest_timestamp - global LatestTimestamp - // modules/rbac.py:177 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_0 // 1 - return - -rbac_assign_role_after_if_else@3: - // modules/rbac.py:105 - // if role_id == UInt64(cst.ROLE_ACCOUNT_MANAGER): - dup - pushint 40 - == - bz rbac_assign_role_after_if_else@5 - // modules/rbac.py:106 - // assert role_address not in self.account_manager, err.INVALID_ROLE_ADDRESS - bytec_3 // 0x52343023 - dig 3 - concat - dup - box_len - bury 1 - ! - assert // Invalid account role address - // modules/rbac.py:107 - // self.account_manager[role_address] = typ.RoleConfig.from_bytes(config) - dig 2 - box_put - // modules/rbac.py:202 - // self._upsert_role(role_id.as_uint64(), role_address, config) - b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14 - -rbac_assign_role_after_if_else@5: - // modules/rbac.py:109 - // if role_id == UInt64(cst.ROLE_PRIMARY_DEALER): - dup - pushint 50 - == - bz rbac_assign_role_after_if_else@7 - // modules/rbac.py:110 - // assert role_address not in self.primary_dealer, err.INVALID_ROLE_ADDRESS - bytec 4 // 0x52353023 - dig 3 - concat - dup - box_len - bury 1 - ! - assert // Invalid account role address - // modules/rbac.py:111 - // self.primary_dealer[role_address] = typ.RoleConfig.from_bytes(config) - dig 2 - box_put - // modules/rbac.py:202 - // self._upsert_role(role_id.as_uint64(), role_address, config) - b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14 - -rbac_assign_role_after_if_else@7: - // modules/rbac.py:113 - // if role_id == UInt64(cst.ROLE_TRUSTEE): - dup - pushint 60 - == - bz rbac_assign_role_after_if_else@9 - // modules/rbac.py:114 - // assert role_address not in self.trustee, err.INVALID_ROLE_ADDRESS - bytec 5 // 0x52363023 - dig 3 - concat - dup - box_len - bury 1 - ! - assert // Invalid account role address - // modules/rbac.py:115 - // self.trustee[role_address] = typ.RoleConfig.from_bytes(config) - dig 2 - box_put - // modules/rbac.py:202 - // self._upsert_role(role_id.as_uint64(), role_address, config) - b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14 - -rbac_assign_role_after_if_else@9: - // modules/rbac.py:117 - // if role_id == UInt64(cst.ROLE_AUTHORITY): - dup - pushint 70 - == - bz rbac_assign_role_after_if_else@11 - // modules/rbac.py:118 - // assert role_address not in self.authority, err.INVALID_ROLE_ADDRESS - bytec_2 // 0x52373023 - dig 3 - concat - dup - box_len - bury 1 - ! - assert // Invalid account role address - // modules/rbac.py:119 - // self.authority[role_address] = typ.RoleConfig.from_bytes(config) - dig 2 - box_put - // modules/rbac.py:202 - // self._upsert_role(role_id.as_uint64(), role_address, config) - b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14 - -rbac_assign_role_after_if_else@11: - // modules/rbac.py:121 - // if role_id == UInt64(cst.ROLE_INTEREST_ORACLE): - dup - pushint 80 - == - bz rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14 - // modules/rbac.py:122 - // assert role_address not in self.interest_oracle, err.INVALID_ROLE_ADDRESS - bytec 6 // 0x52383023 - dig 3 - concat - dup - box_len - bury 1 - ! - assert // Invalid account role address - // modules/rbac.py:123 - // self.interest_oracle[role_address] = typ.RoleConfig.from_bytes(config) - dig 2 - box_put - b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14 - - -// modules.rbac.RbacModule.rbac_revoke_role[routing]() -> void: -rbac_revoke_role: - // modules/rbac.py:205 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_0 // 1 - == - assert // invalid number of bytes for arc4.uint8 - txna ApplicationArgs 2 - dup - cover 2 - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:224 - // self.assert_caller_is_arranger() - callsub assert_caller_is_arranger - // modules/rbac.py:225 - // self.assert_is_not_asset_defaulted() - callsub assert_is_not_asset_defaulted - // modules/rbac.py:226 - // self._assert_valid_role(role_id.as_uint64()) - btoi - dupn 2 - callsub _assert_valid_role - // modules/rbac.py:126 - // assert role_id != UInt64(cst.ROLE_ARRANGER), err.INVALID_ROLE - dup - intc_3 // 20 - != - assert // Invalid role identifier - // modules/rbac.py:127 - // if role_id == UInt64(cst.ROLE_ACCOUNT_MANAGER): - pushint 40 - == - bz rbac_revoke_role_after_if_else@3 - // modules/rbac.py:128 - // assert role_address in self.account_manager, err.INVALID_ROLE_ADDRESS - bytec_3 // 0x52343023 - dig 2 - concat - dup - box_len - bury 1 - assert // Invalid account role address - // modules/rbac.py:129 - // del self.account_manager[role_address] - box_del - pop - -rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12: - // modules/rbac.py:228 - // return Global.latest_timestamp - global LatestTimestamp - // modules/rbac.py:205 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_0 // 1 - return - -rbac_revoke_role_after_if_else@3: - // modules/rbac.py:131 - // if role_id == UInt64(cst.ROLE_PRIMARY_DEALER): - dup - pushint 50 - == - bz rbac_revoke_role_after_if_else@5 - // modules/rbac.py:132 - // assert role_address in self.primary_dealer, err.INVALID_ROLE_ADDRESS - bytec 4 // 0x52353023 - dig 2 - concat - dup - box_len - bury 1 - assert // Invalid account role address - // modules/rbac.py:133 - // del self.primary_dealer[role_address] - box_del - pop - // modules/rbac.py:227 - // self._delete_role(role_id.as_uint64(), role_address) - b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 - -rbac_revoke_role_after_if_else@5: - // modules/rbac.py:135 - // if role_id == UInt64(cst.ROLE_TRUSTEE): - dup - pushint 60 - == - bz rbac_revoke_role_after_if_else@7 - // modules/rbac.py:136 - // assert role_address in self.trustee, err.INVALID_ROLE_ADDRESS - bytec 5 // 0x52363023 - dig 2 - concat - dup - box_len - bury 1 - assert // Invalid account role address - // modules/rbac.py:137 - // del self.trustee[role_address] - box_del - pop - // modules/rbac.py:227 - // self._delete_role(role_id.as_uint64(), role_address) - b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 - -rbac_revoke_role_after_if_else@7: - // modules/rbac.py:139 - // if role_id == UInt64(cst.ROLE_AUTHORITY): - dup - pushint 70 - == - bz rbac_revoke_role_after_if_else@9 - // modules/rbac.py:140 - // assert role_address in self.authority, err.INVALID_ROLE_ADDRESS - bytec_2 // 0x52373023 - dig 2 - concat - dup - box_len - bury 1 - assert // Invalid account role address - // modules/rbac.py:141 - // del self.authority[role_address] - box_del - pop - // modules/rbac.py:227 - // self._delete_role(role_id.as_uint64(), role_address) - b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 - -rbac_revoke_role_after_if_else@9: - // modules/rbac.py:143 - // if role_id == UInt64(cst.ROLE_INTEREST_ORACLE): - dup - pushint 80 - == - bz rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 - // modules/rbac.py:144 - // assert role_address in self.interest_oracle, err.INVALID_ROLE_ADDRESS - bytec 6 // 0x52383023 - dig 2 - concat - dup - box_len - bury 1 - assert // Invalid account role address - // modules/rbac.py:145 - // del self.interest_oracle[role_address] - box_del - pop - b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 - - -// modules.rbac.RbacModule.rbac_gov_asset_suspension[routing]() -> void: -rbac_gov_asset_suspension: - // modules/rbac.py:230 - // @arc4.abimethod # TODO: Update specs and add test - txna ApplicationArgs 1 - dup - len - intc_0 // 1 - == - assert // invalid number of bytes for arc4.bool - intc_1 // 0 - getbit - // modules/rbac.py:77 - // assert self._role_is_active(self.authority, Txn.sender), err.UNAUTHORIZED - bytec_2 // 0x52373023 - txn Sender - callsub _role_is_active - assert // Not authorized - // modules/rbac.py:246 - // self.asset_suspended = suspended - bytec 8 // "asset_suspended" - swap - app_global_put - // modules/rbac.py:247 - // return Global.latest_timestamp - global LatestTimestamp - // modules/rbac.py:230 - // @arc4.abimethod # TODO: Update specs and add test - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_0 // 1 - return - - -// modules.rbac.RbacModule.rbac_get_arranger[routing]() -> void: -rbac_get_arranger: - // modules/rbac.py:257 - // return self.arranger.value - intc_1 // 0 - bytec_1 // 0x52323023 - app_global_get_ex - assert // check self.arranger exists - // modules/rbac.py:249 - // @arc4.abimethod(readonly=True) - bytec_0 // 0x151f7c75 - swap - concat - log - intc_0 // 1 - return - - -// modules.rbac.RbacModule.rbac_get_address_roles[routing]() -> void: -rbac_get_address_roles: - // modules/rbac.py:259 - // @arc4.abimethod(readonly=True) - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:273 - // self._role_is_active(self.account_manager, address), - bytec_3 // 0x52343023 - dig 1 - callsub _role_is_active - // modules/rbac.py:274 - // self._role_is_active(self.primary_dealer, address), - bytec 4 // 0x52353023 - dig 2 - callsub _role_is_active - // modules/rbac.py:275 - // self._role_is_active(self.trustee, address), - bytec 5 // 0x52363023 - dig 3 - callsub _role_is_active - // modules/rbac.py:276 - // self._role_is_active(self.authority, address), - bytec_2 // 0x52373023 - dig 4 - callsub _role_is_active - // modules/rbac.py:277 - // self._role_is_active(self.interest_oracle, address), - bytec 6 // 0x52383023 - uncover 5 - callsub _role_is_active - // modules/rbac.py:259 - // @arc4.abimethod(readonly=True) - pushbytes 0x00 - intc_1 // 0 - uncover 6 - setbit - intc_0 // 1 - uncover 5 - setbit - pushint 2 - uncover 4 - setbit - pushint 3 - uncover 3 - setbit - pushint 4 - uncover 2 - setbit - bytec_0 // 0x151f7c75 - swap - concat - log - intc_0 // 1 - return - - -// modules.rbac.RbacModule.rbac_get_role_config[routing]() -> void: -rbac_get_role_config: - // modules/rbac.py:280 - // @arc4.abimethod(readonly=True) - txna ApplicationArgs 1 - dup - len - intc_0 // 1 - == - assert // invalid number of bytes for arc4.uint8 - txna ApplicationArgs 2 - dup - cover 2 - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:294 - // role = role_id.as_uint64() - btoi - // modules/rbac.py:295 - // self._assert_valid_role(role) - dup - callsub _assert_valid_role - // modules/rbac.py:297 - // case UInt64(cst.ROLE_ARRANGER): - intc_3 // 20 - // modules/rbac.py:301 - // case UInt64(cst.ROLE_ACCOUNT_MANAGER): - pushints 40 50 60 70 80 - // modules/rbac.py:296-327 - // match role: - // case UInt64(cst.ROLE_ARRANGER): - // return typ.RoleConfig( - // role_validity_start=UInt64(0), role_validity_end=UInt64(0) - // ) - // case UInt64(cst.ROLE_ACCOUNT_MANAGER): - // assert self._has_role( - // self.account_manager, role_address - // ), err.INVALID_ROLE_ADDRESS - // return self.account_manager[role_address] - // case UInt64(cst.ROLE_PRIMARY_DEALER): - // assert self._has_role( - // self.primary_dealer, role_address - // ), err.INVALID_ROLE_ADDRESS - // return self.primary_dealer[role_address] - // case UInt64(cst.ROLE_TRUSTEE): - // assert self._has_role( - // self.trustee, role_address - // ), err.INVALID_ROLE_ADDRESS - // return self.trustee[role_address] - // case UInt64(cst.ROLE_AUTHORITY): - // assert self._has_role( - // self.authority, role_address - // ), err.INVALID_ROLE_ADDRESS - // return self.authority[role_address] - // case UInt64(cst.ROLE_INTEREST_ORACLE): - // assert self._has_role( - // self.interest_oracle, role_address - // ), err.INVALID_ROLE_ADDRESS - // return self.interest_oracle[role_address] - // case _: - // op.err(err.INVALID_ROLE) - uncover 6 - match rbac_get_role_config_switch_case_0@2 rbac_get_role_config_switch_case_1@3 rbac_get_role_config_switch_case_2@4 rbac_get_role_config_switch_case_3@5 rbac_get_role_config_switch_case_4@6 rbac_get_role_config_switch_case_5@7 - // modules/rbac.py:327 - // op.err(err.INVALID_ROLE) - err // Invalid role identifier - -rbac_get_role_config_switch_case_5@7: - // modules/rbac.py:323 - // self.interest_oracle, role_address - bytec 6 // 0x52383023 - // modules/rbac.py:55 - // return role_address in role_map - dig 1 - concat - dup - box_len - bury 1 - // modules/rbac.py:322-324 - // assert self._has_role( - // self.interest_oracle, role_address - // ), err.INVALID_ROLE_ADDRESS - assert // Invalid account role address - // modules/rbac.py:325 - // return self.interest_oracle[role_address] - box_get - pop - -rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9: - // modules/rbac.py:280 - // @arc4.abimethod(readonly=True) - bytec_0 // 0x151f7c75 - swap - concat - log - intc_0 // 1 - return - -rbac_get_role_config_switch_case_4@6: - // modules/rbac.py:318 - // self.authority, role_address - bytec_2 // 0x52373023 - // modules/rbac.py:55 - // return role_address in role_map - dig 1 - concat - dup - box_len - bury 1 - // modules/rbac.py:317-319 - // assert self._has_role( - // self.authority, role_address - // ), err.INVALID_ROLE_ADDRESS - assert // Invalid account role address - // modules/rbac.py:320 - // return self.authority[role_address] - box_get - pop - // modules/rbac.py:280 - // @arc4.abimethod(readonly=True) - b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9 - -rbac_get_role_config_switch_case_3@5: - // modules/rbac.py:313 - // self.trustee, role_address - bytec 5 // 0x52363023 - // modules/rbac.py:55 - // return role_address in role_map - dig 1 - concat - dup - box_len - bury 1 - // modules/rbac.py:312-314 - // assert self._has_role( - // self.trustee, role_address - // ), err.INVALID_ROLE_ADDRESS - assert // Invalid account role address - // modules/rbac.py:315 - // return self.trustee[role_address] - box_get - pop - // modules/rbac.py:280 - // @arc4.abimethod(readonly=True) - b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9 - -rbac_get_role_config_switch_case_2@4: - // modules/rbac.py:308 - // self.primary_dealer, role_address - bytec 4 // 0x52353023 - // modules/rbac.py:55 - // return role_address in role_map - dig 1 - concat - dup - box_len - bury 1 - // modules/rbac.py:307-309 - // assert self._has_role( - // self.primary_dealer, role_address - // ), err.INVALID_ROLE_ADDRESS - assert // Invalid account role address - // modules/rbac.py:310 - // return self.primary_dealer[role_address] - box_get - pop - // modules/rbac.py:280 - // @arc4.abimethod(readonly=True) - b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9 - -rbac_get_role_config_switch_case_1@3: - // modules/rbac.py:303 - // self.account_manager, role_address - bytec_3 // 0x52343023 - // modules/rbac.py:55 - // return role_address in role_map - dig 1 - concat - dup - box_len - bury 1 - // modules/rbac.py:302-304 - // assert self._has_role( - // self.account_manager, role_address - // ), err.INVALID_ROLE_ADDRESS - assert // Invalid account role address - // modules/rbac.py:305 - // return self.account_manager[role_address] - box_get - pop - // modules/rbac.py:280 - // @arc4.abimethod(readonly=True) - b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9 - -rbac_get_role_config_switch_case_0@2: - // modules/rbac.py:298-300 - // return typ.RoleConfig( - // role_validity_start=UInt64(0), role_validity_end=UInt64(0) - // ) - pushbytes 0x00000000000000000000000000000000 - // modules/rbac.py:280 - // @arc4.abimethod(readonly=True) - b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9 - - -// modules.rbac.RbacModule._role_is_active(role_map: bytes, role_address: bytes) -> uint64: -_role_is_active: - // modules/rbac.py:57 - // def _role_is_active(self, role_map: typ.RbacRole, role_address: Account) -> bool: - proto 2 1 - pushbytes "" - // modules/rbac.py:55 - // return role_address in role_map - frame_dig -2 - frame_dig -1 - concat - dup - box_len - bury 1 - // modules/rbac.py:58-62 - // return self._has_role(role_map, role_address) and ( - // role_map[role_address].role_validity_start - // <= Global.latest_timestamp - // <= role_map[role_address].role_validity_end - // ) - bz _role_is_active_bool_false@4 - // modules/rbac.py:59 - // role_map[role_address].role_validity_start - frame_dig 1 - box_get - assert // check BoxMap entry exists - intc_1 // 0 - extract_uint64 - // modules/rbac.py:60 - // <= Global.latest_timestamp - global LatestTimestamp - dup - frame_bury 0 - // modules/rbac.py:59-60 - // role_map[role_address].role_validity_start - // <= Global.latest_timestamp - <= - // modules/rbac.py:59-61 - // role_map[role_address].role_validity_start - // <= Global.latest_timestamp - // <= role_map[role_address].role_validity_end - bz _role_is_active_bool_false@4 - // modules/rbac.py:61 - // <= role_map[role_address].role_validity_end - frame_dig 1 - box_get - assert // check BoxMap entry exists - pushint 8 - extract_uint64 - // modules/rbac.py:60-61 - // <= Global.latest_timestamp - // <= role_map[role_address].role_validity_end - frame_dig 0 - >= - // modules/rbac.py:59-61 - // role_map[role_address].role_validity_start - // <= Global.latest_timestamp - // <= role_map[role_address].role_validity_end - bz _role_is_active_bool_false@4 - intc_0 // 1 - -_role_is_active_bool_merge@5: - // modules/rbac.py:58-62 - // return self._has_role(role_map, role_address) and ( - // role_map[role_address].role_validity_start - // <= Global.latest_timestamp - // <= role_map[role_address].role_validity_end - // ) - frame_bury 0 - retsub - -_role_is_active_bool_false@4: - intc_1 // 0 - b _role_is_active_bool_merge@5 - - -// modules.rbac.RbacModule.assert_caller_is_arranger() -> void: -assert_caller_is_arranger: - // modules/rbac.py:65 - // assert self._is_arranger(Txn.sender), err.UNAUTHORIZED - txn Sender - // modules/rbac.py:52 - // return role_address == self.arranger.value - intc_1 // 0 - bytec_1 // 0x52323023 - app_global_get_ex - assert // check self.arranger exists - == - // modules/rbac.py:65 - // assert self._is_arranger(Txn.sender), err.UNAUTHORIZED - assert // Not authorized - retsub - - -// modules.rbac.RbacModule.assert_is_not_asset_defaulted() -> void: -assert_is_not_asset_defaulted: - // modules/rbac.py:83 - // assert not self.asset_defaulted, err.DEFAULTED - intc_1 // 0 - bytec 9 // "asset_defaulted" - app_global_get_ex - assert // check self.asset_defaulted exists - ! - assert // Defaulted - retsub - - -// modules.rbac.RbacModule._assert_valid_role(role_id: uint64) -> void: -_assert_valid_role: - // modules/rbac.py:88 - // def _assert_valid_role(self, role_id: UInt64) -> None: - proto 1 0 - // modules/rbac.py:89-96 - // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - frame_dig -1 - // modules/rbac.py:90 - // UInt64(cst.ROLE_ARRANGER), - intc_3 // 20 - // modules/rbac.py:89-96 - // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - == - bnz _assert_valid_role_bool_true@6 - frame_dig -1 - // modules/rbac.py:91 - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - pushint 40 - // modules/rbac.py:89-96 - // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - == - bnz _assert_valid_role_bool_true@6 - frame_dig -1 - // modules/rbac.py:92 - // UInt64(cst.ROLE_PRIMARY_DEALER), - pushint 50 - // modules/rbac.py:89-96 - // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - == - bnz _assert_valid_role_bool_true@6 - frame_dig -1 - // modules/rbac.py:93 - // UInt64(cst.ROLE_TRUSTEE), - pushint 60 - // modules/rbac.py:89-96 - // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - == - bnz _assert_valid_role_bool_true@6 - frame_dig -1 - // modules/rbac.py:94 - // UInt64(cst.ROLE_AUTHORITY), - pushint 70 - // modules/rbac.py:89-96 - // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - == - bnz _assert_valid_role_bool_true@6 - frame_dig -1 - // modules/rbac.py:95 - // UInt64(cst.ROLE_INTEREST_ORACLE), - pushint 80 - // modules/rbac.py:89-96 - // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - == - bz _assert_valid_role_bool_false@7 - -_assert_valid_role_bool_true@6: - intc_0 // 1 - -_assert_valid_role_bool_merge@8: - // modules/rbac.py:89-96 - // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - assert // Invalid role identifier - retsub - -_assert_valid_role_bool_false@7: - intc_1 // 0 - b _assert_valid_role_bool_merge@8 diff --git a/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.arc56.json b/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.arc56.json deleted file mode 100644 index 2bb07a28..00000000 --- a/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.arc56.json +++ /dev/null @@ -1,432 +0,0 @@ -{ - "name": "MockRbacModule", - "structs": { - "RoleConfig": [ - { - "name": "role_validity_start", - "type": "uint64" - }, - { - "name": "role_validity_end", - "type": "uint64" - } - ] - }, - "methods": [ - { - "name": "rbac_rotate_arranger", - "args": [ - { - "type": "address", - "name": "new_arranger", - "desc": "New Arranger address" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the role assignment" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Rotate the Arranger address", - "events": [], - "recommendations": {} - }, - { - "name": "rbac_set_op_daemon", - "args": [ - { - "type": "address", - "name": "address", - "desc": "Operation Daemon address" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the role assignment" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Non-Normative: Set the Operation Daemon address", - "events": [], - "recommendations": {} - }, - { - "name": "rbac_assign_role", - "args": [ - { - "type": "uint8", - "name": "role_id", - "desc": "Role Identifier" - }, - { - "type": "address", - "name": "role_address", - "desc": "Account Role Address" - }, - { - "type": "byte[]", - "name": "config", - "desc": "Role configuration (Optional)" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the role assignment" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Assign a role to an address", - "events": [], - "recommendations": {} - }, - { - "name": "rbac_revoke_role", - "args": [ - { - "type": "uint8", - "name": "role_id", - "desc": "Role Identifier" - }, - { - "type": "address", - "name": "role_address", - "desc": "Account Role Address" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the role revocation" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Revoke a role from an address", - "events": [], - "recommendations": {} - }, - { - "name": "rbac_gov_asset_suspension", - "args": [ - { - "type": "bool", - "name": "suspended", - "desc": "Suspension status" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the set asset suspension status" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Set asset suspension status", - "events": [], - "recommendations": {} - }, - { - "name": "rbac_get_arranger", - "args": [], - "returns": { - "type": "address", - "desc": "Arranger address" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Get Arranger address", - "events": [], - "recommendations": {} - }, - { - "name": "rbac_get_address_roles", - "args": [ - { - "type": "address", - "name": "address", - "desc": "Address to get roles for" - } - ], - "returns": { - "type": "(bool,bool,bool,bool,bool)", - "desc": "Roles mask: (Account Manager, Primary Dealer, Trustee, Authority, Interest Oracle)" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Non-normative - Get roles assigned to an address", - "events": [], - "recommendations": {} - }, - { - "name": "rbac_get_role_config", - "args": [ - { - "type": "uint8", - "name": "role_id", - "desc": "Role Identifier" - }, - { - "type": "address", - "name": "role_address", - "desc": "Account Role Address" - } - ], - "returns": { - "type": "(uint64,uint64)", - "struct": "RoleConfig", - "desc": "Role configuration" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Get role configuration", - "events": [], - "recommendations": {} - } - ], - "arcs": [ - 22, - 28 - ], - "desc": "\n RBAC Module for testing\n ", - "networks": {}, - "state": { - "schema": { - "global": { - "ints": 2, - "bytes": 2 - }, - "local": { - "ints": 0, - "bytes": 0 - } - }, - "keys": { - "global": { - "arranger": { - "keyType": "AVMBytes", - "valueType": "address", - "key": "UjIwIw==" - }, - "op_daemon": { - "keyType": "AVMBytes", - "valueType": "address", - "key": "UjI1Iw==" - }, - "asset_suspended": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "YXNzZXRfc3VzcGVuZGVk" - }, - "asset_defaulted": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "YXNzZXRfZGVmYXVsdGVk" - } - }, - "local": {}, - "box": {} - }, - "maps": { - "global": {}, - "local": {}, - "box": { - "account_manager": { - "keyType": "address", - "valueType": "RoleConfig", - "prefix": "UjQwIw==" - }, - "primary_dealer": { - "keyType": "address", - "valueType": "RoleConfig", - "prefix": "UjUwIw==" - }, - "trustee": { - "keyType": "address", - "valueType": "RoleConfig", - "prefix": "UjYwIw==" - }, - "authority": { - "keyType": "address", - "valueType": "RoleConfig", - "prefix": "UjcwIw==" - }, - "interest_oracle": { - "keyType": "address", - "valueType": "RoleConfig", - "prefix": "UjgwIw==" - } - } - } - }, - "bareActions": { - "create": [ - "NoOp" - ], - "call": [] - }, - "sourceInfo": { - "approval": { - "sourceInfo": [ - { - "pc": [ - 897 - ], - "errorMessage": "Defaulted" - }, - { - "pc": [ - 322, - 346, - 370, - 393, - 417, - 472, - 500, - 522, - 543, - 565, - 741, - 758, - 773, - 788, - 802 - ], - "errorMessage": "Invalid account role address" - }, - { - "pc": [ - 457, - 731, - 950 - ], - "errorMessage": "Invalid role identifier" - }, - { - "pc": [ - 587, - 889 - ], - "errorMessage": "Not authorized" - }, - { - "pc": [ - 849, - 864 - ], - "errorMessage": "check BoxMap entry exists" - }, - { - "pc": [ - 604, - 887 - ], - "errorMessage": "check self.arranger exists" - }, - { - "pc": [ - 895 - ], - "errorMessage": "check self.asset_defaulted exists" - }, - { - "pc": [ - 263 - ], - "errorMessage": "invalid array length header" - }, - { - "pc": [ - 578 - ], - "errorMessage": "invalid number of bytes for arc4.bool" - }, - { - "pc": [ - 271 - ], - "errorMessage": "invalid number of bytes for arc4.dynamic_array" - }, - { - "pc": [ - 200, - 223, - 257, - 441, - 618, - 701 - ], - "errorMessage": "invalid number of bytes for arc4.static_array" - }, - { - "pc": [ - 247, - 431, - 691 - ], - "errorMessage": "invalid number of bytes for arc4.uint8" - } - ], - "pcOffsetMethod": "none" - }, - "clear": { - "sourceInfo": [], - "pcOffsetMethod": "none" - } - }, - "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMzIgMjAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAweDUyMzIzMDIzIDB4NTIzNzMwMjMgMHg1MjM0MzAyMyAweDUyMzUzMDIzIDB4NTIzNjMwMjMgMHg1MjM4MzAyMyAweDUyMzIzNTIzICJhc3NldF9zdXNwZW5kZWQiICJhc3NldF9kZWZhdWx0ZWQiCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzAtMzEKICAgIC8vICMgUkJBQyBSb2xlcwogICAgLy8gc2VsZi5hcnJhbmdlciA9IEdsb2JhbFN0YXRlKEFjY291bnQoKSwga2V5PWNzdC5QUkVGSVhfSURfQVJSQU5HRVIpCiAgICBieXRlY18xIC8vIDB4NTIzMjMwMjMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMgogICAgLy8gc2VsZi5vcF9kYWVtb24gPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX09QX0RBRU1PTikKICAgIGJ5dGVjIDcgLy8gMHg1MjMyMzUyMwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjQ3LTQ4CiAgICAvLyAjIEQtQVNBIEdvdmVybmFuY2UKICAgIC8vIHNlbGYuYXNzZXRfc3VzcGVuZGVkID0gRmFsc2UKICAgIGJ5dGVjIDggLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIGludGNfMSAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjQ5CiAgICAvLyBzZWxmLmFzc2V0X2RlZmF1bHRlZCA9IEZhbHNlCiAgICBieXRlYyA5IC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBpbnRjXzEgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL21vY2tfbW9kdWxlX3JiYWMvY29udHJhY3QucHk6NgogICAgLy8gY2xhc3MgTW9ja1JiYWNNb2R1bGUoUmJhY01vZHVsZSk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9jcmVhdGVAMTcKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweDgyZjcxYjJkIDB4ZWYwNGY1ZDMgMHgwM2I4MzMyOSAweDNkYmU4MGJkIDB4ZGY1NGU4MmMgMHgwMTBjODI5OSAweDc0MDZhY2QyIDB4YzNlNGIyOTcgLy8gbWV0aG9kICJyYmFjX3JvdGF0ZV9hcnJhbmdlcihhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19zZXRfb3BfZGFlbW9uKGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX2Fzc2lnbl9yb2xlKHVpbnQ4LGFkZHJlc3MsYnl0ZVtdKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19yZXZva2Vfcm9sZSh1aW50OCxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19nb3ZfYXNzZXRfc3VzcGVuc2lvbihib29sKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19nZXRfYXJyYW5nZXIoKWFkZHJlc3MiLCBtZXRob2QgInJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXMoYWRkcmVzcykoYm9vbCxib29sLGJvb2wsYm9vbCxib29sKSIsIG1ldGhvZCAicmJhY19nZXRfcm9sZV9jb25maWcodWludDgsYWRkcmVzcykodWludDY0LHVpbnQ2NCkiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCByYmFjX3JvdGF0ZV9hcnJhbmdlciByYmFjX3NldF9vcF9kYWVtb24gcmJhY19hc3NpZ25fcm9sZSByYmFjX3Jldm9rZV9yb2xlIHJiYWNfZ292X2Fzc2V0X3N1c3BlbnNpb24gcmJhY19nZXRfYXJyYW5nZXIgcmJhY19nZXRfYWRkcmVzc19yb2xlcyByYmFjX2dldF9yb2xlX2NvbmZpZwogICAgZXJyCgptYWluX2NyZWF0ZUAxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tb2NrX21vZHVsZV9yYmFjL2NvbnRyYWN0LnB5OjE0CiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIGFzc2VydAogICAgLy8gc21hcnRfY29udHJhY3RzL21vY2tfbW9kdWxlX3JiYWMvY29udHJhY3QucHk6MTYKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSBUeG4uc2VuZGVyCiAgICBieXRlY18xIC8vIDB4NTIzMjMwMjMKICAgIHR4biBTZW5kZXIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbW9ja19tb2R1bGVfcmJhYy9jb250cmFjdC5weToxNAogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfcm90YXRlX2FycmFuZ2VyW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19yb3RhdGVfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE1OAogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE1OQogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IG5ld19hcnJhbmdlcgogICAgYnl0ZWNfMSAvLyAweDUyMzIzMDIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2MAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3NldF9vcF9kYWVtb25bcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3NldF9vcF9kYWVtb246CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTYyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE3MwogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE3NAogICAgLy8gc2VsZi5vcF9kYWVtb24udmFsdWUgPSBhZGRyZXNzCiAgICBieXRlYyA3IC8vIDB4NTIzMjM1MjMKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTc1CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfYXNzaWduX3JvbGVbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2Fzc2lnbl9yb2xlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE3NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTk5CiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAwCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDEKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCkpCiAgICBidG9pCiAgICBkdXBuIDIKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTAxCiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUik6CiAgICBpbnRjXzMgLy8gMjAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwMgogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IHJvbGVfYWRkcmVzcwogICAgYnl0ZWNfMSAvLyAweDUyMzIzMDIzCiAgICBkaWcgMwogICAgYXBwX2dsb2JhbF9wdXQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fdXBzZXJ0X3JvbGVAMTQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAzCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA1CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDQwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDYKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjXzMgLy8gMHg1MjM0MzAyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA3CiAgICAvLyBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcyhjb25maWcpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwMgogICAgLy8gc2VsZi5fdXBzZXJ0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCBjb25maWcpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fdXBzZXJ0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwOQogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTAKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgNCAvLyAweDUyMzUzMDIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTEKICAgIC8vIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDIKICAgIC8vIHNlbGYuX3Vwc2VydF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgY29uZmlnKQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3Vwc2VydF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTMKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGNzdC5ST0xFX1RSVVNURUUpOgogICAgZHVwCiAgICBwdXNoaW50IDYwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTQKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyA1IC8vIDB4NTIzNjMwMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNQogICAgLy8gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZykKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAyCiAgICAvLyBzZWxmLl91cHNlcnRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIGNvbmZpZykKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl91cHNlcnRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE3CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE4CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlY18yIC8vIDB4NTIzNzMwMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExOQogICAgLy8gc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDIKICAgIC8vIHNlbGYuX3Vwc2VydF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgY29uZmlnKQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3Vwc2VydF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMTE6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIxCiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpOgogICAgZHVwCiAgICBwdXNoaW50IDgwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl91cHNlcnRfcm9sZUAxNAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMgogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgNiAvLyAweDUyMzgzMDIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjMKICAgIC8vIHNlbGYuaW50ZXJlc3Rfb3JhY2xlW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZykKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fdXBzZXJ0X3JvbGVAMTQKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3Jldm9rZV9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19yZXZva2Vfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjQKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjUKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNgogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjYKICAgIC8vIGFzc2VydCByb2xlX2lkICE9IFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksIGVyci5JTlZBTElEX1JPTEUKICAgIGR1cAogICAgaW50Y18zIC8vIDIwCiAgICAhPQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI3CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI4CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjXzMgLy8gMHg1MjM0MzAyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI5CiAgICAvLyBkZWwgc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyOAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjA1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMQogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzIKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyA0IC8vIDB4NTIzNTMwMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMwogICAgLy8gZGVsIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI3CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNQogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNjAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNgogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgNSAvLyAweDUyMzYzMDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzcKICAgIC8vIGRlbCBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI3CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzOQogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKToKICAgIGR1cAogICAgcHVzaGludCA3MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQwCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjXzIgLy8gMHg1MjM3MzAyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQxCiAgICAvLyBkZWwgc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI3CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MwogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKToKICAgIGR1cAogICAgcHVzaGludCA4MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDQKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgNiAvLyAweDUyMzgzMDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDUKICAgIC8vIGRlbCBzZWxmLmludGVyZXN0X29yYWNsZVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ292X2Fzc2V0X3N1c3BlbnNpb25bcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dvdl9hc3NldF9zdXNwZW5zaW9uOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kICAjIFRPRE86IFVwZGF0ZSBzcGVjcyBhbmQgYWRkIHRlc3QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzEgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzcKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjXzIgLy8gMHg1MjM3MzAyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0NgogICAgLy8gc2VsZi5hc3NldF9zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGJ5dGVjIDggLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjQ3CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCAgIyBUT0RPOiBVcGRhdGUgc3BlY3MgYW5kIGFkZCB0ZXN0CiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYXJyYW5nZXJbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTcKICAgIC8vIHJldHVybiBzZWxmLmFycmFuZ2VyLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMSAvLyAweDUyMzIzMDIzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJyYW5nZXIgZXhpc3RzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjQ5CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9hZGRyZXNzX3JvbGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfYWRkcmVzc19yb2xlczoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjczCiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmFjY291bnRfbWFuYWdlciwgYWRkcmVzcyksCiAgICBieXRlY18zIC8vIDB4NTIzNDMwMjMKICAgIGRpZyAxCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3NAogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5wcmltYXJ5X2RlYWxlciwgYWRkcmVzcyksCiAgICBieXRlYyA0IC8vIDB4NTIzNTMwMjMKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3NQogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi50cnVzdGVlLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDUgLy8gMHg1MjM2MzAyMwogICAgZGlnIDMKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjc2CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgYWRkcmVzcyksCiAgICBieXRlY18yIC8vIDB4NTIzNzMwMjMKICAgIGRpZyA0CiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3NwogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5pbnRlcmVzdF9vcmFjbGUsIGFkZHJlc3MpLAogICAgYnl0ZWMgNiAvLyAweDUyMzgzMDIzCiAgICB1bmNvdmVyIDUKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHB1c2hieXRlcyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciA2CiAgICBzZXRiaXQKICAgIGludGNfMCAvLyAxCiAgICB1bmNvdmVyIDUKICAgIHNldGJpdAogICAgcHVzaGludCAyCiAgICB1bmNvdmVyIDQKICAgIHNldGJpdAogICAgcHVzaGludCAzCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgcHVzaGludCA0CiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfY29uZmlnW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfcm9sZV9jb25maWc6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjk0CiAgICAvLyByb2xlID0gcm9sZV9pZC5hc191aW50NjQoKQogICAgYnRvaQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5NQogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZSkKICAgIGR1cAogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTcKICAgIC8vIGNhc2UgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKToKICAgIGludGNfMyAvLyAyMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwMQogICAgLy8gY2FzZSBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIHB1c2hpbnRzIDQwIDUwIDYwIDcwIDgwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjk2LTMyNwogICAgLy8gbWF0Y2ggcm9sZToKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUik6CiAgICAvLyAgICAgICAgIHJldHVybiB0eXAuUm9sZUNvbmZpZygKICAgIC8vICAgICAgICAgICAgIHJvbGVfdmFsaWRpdHlfc3RhcnQ9VUludDY0KDApLCByb2xlX3ZhbGlkaXR5X2VuZD1VSW50NjQoMCkKICAgIC8vICAgICAgICAgKQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLnByaW1hcnlfZGVhbGVyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSk6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5pbnRlcmVzdF9vcmFjbGUsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYuaW50ZXJlc3Rfb3JhY2xlW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIF86CiAgICAvLyAgICAgICAgIG9wLmVycihlcnIuSU5WQUxJRF9ST0xFKQogICAgdW5jb3ZlciA2CiAgICBtYXRjaCByYmFjX2dldF9yb2xlX2NvbmZpZ19zd2l0Y2hfY2FzZV8wQDIgcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfMUAzIHJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzJANCByYmFjX2dldF9yb2xlX2NvbmZpZ19zd2l0Y2hfY2FzZV8zQDUgcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfNEA2IHJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzVANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyNwogICAgLy8gb3AuZXJyKGVyci5JTlZBTElEX1JPTEUpCiAgICBlcnIgLy8gSW52YWxpZCByb2xlIGlkZW50aWZpZXIKCnJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzVANzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjMKICAgIC8vIHNlbGYuaW50ZXJlc3Rfb3JhY2xlLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDYgLy8gMHg1MjM4MzAyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMi0zMjQKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLmludGVyZXN0X29yYWNsZSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI1CiAgICAvLyByZXR1cm4gc2VsZi5pbnRlcmVzdF9vcmFjbGVbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCgpyYmFjX2dldF9yb2xlX2NvbmZpZ19hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfY29uZmlnQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCnJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzRANjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTgKICAgIC8vIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjXzIgLy8gMHg1MjM3MzAyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLmF1dGhvcml0eSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzIwCiAgICAvLyByZXR1cm4gc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV9jb25maWdfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX2NvbmZpZ0A5CgpyYmFjX2dldF9yb2xlX2NvbmZpZ19zd2l0Y2hfY2FzZV8zQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEzCiAgICAvLyBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgNSAvLyAweDUyMzYzMDIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEyLTMxNAogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzE1CiAgICAvLyByZXR1cm4gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfY29uZmlnX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV9jb25maWdAOQoKcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfMkA0OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwOAogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyA0IC8vIDB4NTIzNTMwMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDctMzA5CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEwCiAgICAvLyByZXR1cm4gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX2NvbmZpZ19hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfY29uZmlnQDkKCnJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzFAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDMKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjXzMgLy8gMHg1MjM0MzAyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwMi0zMDQKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLmFjY291bnRfbWFuYWdlciwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA1CiAgICAvLyByZXR1cm4gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV9jb25maWdfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX2NvbmZpZ0A5CgpyYmFjX2dldF9yb2xlX2NvbmZpZ19zd2l0Y2hfY2FzZV8wQDI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjk4LTMwMAogICAgLy8gcmV0dXJuIHR5cC5Sb2xlQ29uZmlnKAogICAgLy8gICAgIHJvbGVfdmFsaWRpdHlfc3RhcnQ9VUludDY0KDApLCByb2xlX3ZhbGlkaXR5X2VuZD1VSW50NjQoMCkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV9jb25maWdfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX2NvbmZpZ0A5CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3JvbGVfaXNfYWN0aXZlKHJvbGVfbWFwOiBieXRlcywgcm9sZV9hZGRyZXNzOiBieXRlcykgLT4gdWludDY0Ogpfcm9sZV9pc19hY3RpdmU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTcKICAgIC8vIGRlZiBfcm9sZV9pc19hY3RpdmUoc2VsZiwgcm9sZV9tYXA6IHR5cC5SYmFjUm9sZSwgcm9sZV9hZGRyZXNzOiBBY2NvdW50KSAtPiBib29sOgogICAgcHJvdG8gMiAxCiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OC02MgogICAgLy8gcmV0dXJuIHNlbGYuX2hhc19yb2xlKHJvbGVfbWFwLCByb2xlX2FkZHJlc3MpIGFuZCAoCiAgICAvLyAgICAgcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICAvLyApCiAgICBieiBfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTkKICAgIC8vIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBCb3hNYXAgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2MAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTktNjAKICAgIC8vIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIDw9CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTktNjEKICAgIC8vIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IF9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2MQogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBCb3hNYXAgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDgKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAtNjEKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgPj0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgaW50Y18wIC8vIDEKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX21lcmdlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzEgLy8gMAogICAgYiBfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpIC0+IHZvaWQ6CmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjUKICAgIC8vIGFzc2VydCBzZWxmLl9pc19hcnJhbmdlcihUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjUyCiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzID09IHNlbGYuYXJyYW5nZXIudmFsdWUKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18xIC8vIDB4NTIzMjMwMjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcnJhbmdlciBleGlzdHMKICAgID09CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjUKICAgIC8vIGFzc2VydCBzZWxmLl9pc19hcnJhbmdlcihUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpIC0+IHZvaWQ6CmFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjgzCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYXNzZXRfZGVmYXVsdGVkLCBlcnIuREVGQVVMVEVECiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgOSAvLyAiYXNzZXRfZGVmYXVsdGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2RlZmF1bHRlZCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBEZWZhdWx0ZWQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkOiB1aW50NjQpIC0+IHZvaWQ6Cl9hc3NlcnRfdmFsaWRfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OAogICAgLy8gZGVmIF9hc3NlcnRfdmFsaWRfcm9sZShzZWxmLCByb2xlX2lkOiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MAogICAgLy8gVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIGludGNfMyAvLyAyMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk2CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MQogICAgLy8gVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICBwdXNoaW50IDQwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTYKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkyCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgcHVzaGludCA1MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk2CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MwogICAgLy8gVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgcHVzaGludCA2MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk2CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NAogICAgLy8gVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICBwdXNoaW50IDcwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTYKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojk1CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIHB1c2hpbnQgODAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfZmFsc2VANwoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA2OgogICAgaW50Y18wIC8vIDEKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX21lcmdlQDg6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTYKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICByZXRzdWIKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX2ZhbHNlQDc6CiAgICBpbnRjXzEgLy8gMAogICAgYiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9tZXJnZUA4Cg==", - "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" - }, - "byteCode": { - "approval": "CyAEAQAgFCYKBBUffHUEUjIwIwRSNzAjBFI0MCMEUjUwIwRSNjAjBFI4MCMEUjI1Iw9hc3NldF9zdXNwZW5kZWQPYXNzZXRfZGVmYXVsdGVkMRhAABEpMgNnJwcyA2cnCCNnJwkjZzEbQQBHMRkURDEYRIIIBIL3Gy0E7wT10wQDuDMpBD2+gL0E31ToLAQBDIKZBHQGrNIEw+SylzYaAI4IAA8AJgA+APYBiQGnAbEB+gAxGRQxGBQQRCkxAGciQzYaAUkVJBJEiAKmKUxnMgcWKExQsCJDNhoBSRUkEkSIAo8nB0xnMgcWKExQsCJDNhoBSRUiEkQ2GgJJTgIVJBJENhoDSSNZgQIISwEVEkRXAgBMiAJbiAJhF0cCiAJjJRJBAA0pSwNnMgcWKExQsCJDSYEoEkEAECtLA1BJvUUBFERLAr9C/+BJgTISQQARJwRLA1BJvUUBFERLAr9C/8hJgTwSQQARJwVLA1BJvUUBFERLAr9C/7BJgUYSQQAQKksDUEm9RQEUREsCv0L/mUmBUBJB/5InBksDUEm9RQEUREsCv0L/gTYaAUkVIhJENhoCSU4CFSQSRIgBtYgBuxdHAogBvUklE0SBKBJBABQrSwJQSb1FAUS8SDIHFihMULAiQ0mBMhJBAA8nBEsCUEm9RQFEvEhC/+FJgTwSQQAPJwVLAlBJvUUBRLxIQv/LSYFGEkEADipLAlBJvUUBRLxIQv+2SYFQEkH/rycGSwJQSb1FAUS8SEL/oDYaAUkVIhJEI1MqMQCIAPJEJwhMZzIHFihMULAiQyMpZUQoTFCwIkM2GgFJFSQSRCtLAYgAzCcESwKIAMUnBUsDiAC+KksEiAC4JwZPBYgAsYABACNPBlQiTwVUgQJPBFSBA08DVIEETwJUKExQsCJDNhoBSRUiEkQ2GgJJTgIVJBJEF0mIAMAlgwUoMjxGUE8GjgYATQA/ADAAIQATAAEAJwZLAVBJvUUBRL5IKExQsCJDKksBUEm9RQFEvkhC/+wnBUsBUEm9RQFEvkhC/90nBEsBUEm9RQFEvkhC/84rSwFQSb1FAUS+SEL/wIAQAAAAAAAAAAAAAAAAAAAAAEL/q4oCAYAAi/6L/1BJvUUBQQAgiwG+RCNbMgdJjAAOQQARiwG+RIEIW4sAD0EABCKMAIkjQv/5MQAjKWVEEkSJIycJZUQURImKAQCL/yUSQAAoi/+BKBJAACCL/4EyEkAAGIv/gTwSQAAQi/+BRhJAAAiL/4FQEkEAAyJEiSNC//o=", - "clear": "C4EBQw==" - }, - "compilerInfo": { - "compiler": "puya", - "compilerVersion": { - "major": 5, - "minor": 7, - "patch": 1 - } - }, - "events": [], - "templateVariables": {} -} \ No newline at end of file diff --git a/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.clear.puya.map b/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.clear.puya.map deleted file mode 100644 index d580b5c4..00000000 --- a/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.clear.puya.map +++ /dev/null @@ -1,25 +0,0 @@ -{ - "version": 3, - "sources": [], - "mappings": ";;;", - "op_pc_offset": 0, - "pc_events": { - "1": { - "subroutine": "algopy.arc4.ARC4Contract.clear_state_program", - "params": {}, - "block": "main", - "stack_in": [], - "op": "pushint 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "3": { - "op": "return", - "stack_out": [] - } - } -} \ No newline at end of file diff --git a/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.clear.teal b/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.clear.teal deleted file mode 100644 index 75f539be..00000000 --- a/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.clear.teal +++ /dev/null @@ -1,7 +0,0 @@ -#pragma version 11 -#pragma typetrack false - -// algopy.arc4.ARC4Contract.clear_state_program() -> uint64: -main: - pushint 1 - return diff --git a/smart_contracts/artifacts/mock_module_rbac/mock_rbac_module_client.py b/smart_contracts/artifacts/mock_module_rbac/mock_rbac_module_client.py deleted file mode 100644 index 6e6b1228..00000000 --- a/smart_contracts/artifacts/mock_module_rbac/mock_rbac_module_client.py +++ /dev/null @@ -1,1532 +0,0 @@ -# flake8: noqa -# fmt: off -# mypy: ignore-errors -# This file was automatically generated by algokit-client-generator. -# DO NOT MODIFY IT BY HAND. -# requires: algokit-utils@^3.0.0 - -# common -import dataclasses -import typing -# core algosdk -import algosdk -from algosdk.transaction import OnComplete -from algosdk.atomic_transaction_composer import TransactionSigner -from algosdk.source_map import SourceMap -from algosdk.transaction import Transaction -from algosdk.v2client.models import SimulateTraceConfig -# utils -import algokit_utils -from algokit_utils import AlgorandClient as _AlgoKitAlgorandClient - -_APP_SPEC_JSON = r"""{"arcs": [22, 28], "bareActions": {"call": [], "create": ["NoOp"]}, "methods": [{"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "New Arranger address", "name": "new_arranger"}], "name": "rbac_rotate_arranger", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Rotate the Arranger address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Operation Daemon address", "name": "address"}], "name": "rbac_set_op_daemon", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Non-Normative: Set the Operation Daemon address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}, {"type": "byte[]", "desc": "Role configuration (Optional)", "name": "config"}], "name": "rbac_assign_role", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Assign a role to an address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}], "name": "rbac_revoke_role", "returns": {"type": "uint64", "desc": "Timestamp of the role revocation"}, "desc": "Revoke a role from an address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Suspension status", "name": "suspended"}], "name": "rbac_gov_asset_suspension", "returns": {"type": "uint64", "desc": "Timestamp of the set asset suspension status"}, "desc": "Set asset suspension status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "rbac_get_arranger", "returns": {"type": "address", "desc": "Arranger address"}, "desc": "Get Arranger address", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Address to get roles for", "name": "address"}], "name": "rbac_get_address_roles", "returns": {"type": "(bool,bool,bool,bool,bool)", "desc": "Roles mask: (Account Manager, Primary Dealer, Trustee, Authority, Interest Oracle)"}, "desc": "Non-normative - Get roles assigned to an address", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}], "name": "rbac_get_role_config", "returns": {"type": "(uint64,uint64)", "desc": "Role configuration", "struct": "RoleConfig"}, "desc": "Get role configuration", "events": [], "readonly": true, "recommendations": {}}], "name": "MockRbacModule", "state": {"keys": {"box": {}, "global": {"arranger": {"key": "UjIwIw==", "keyType": "AVMBytes", "valueType": "address"}, "op_daemon": {"key": "UjI1Iw==", "keyType": "AVMBytes", "valueType": "address"}, "asset_suspended": {"key": "YXNzZXRfc3VzcGVuZGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "asset_defaulted": {"key": "YXNzZXRfZGVmYXVsdGVk", "keyType": "AVMString", "valueType": "AVMUint64"}}, "local": {}}, "maps": {"box": {"account_manager": {"keyType": "address", "valueType": "RoleConfig", "prefix": "UjQwIw=="}, "primary_dealer": {"keyType": "address", "valueType": "RoleConfig", "prefix": "UjUwIw=="}, "trustee": {"keyType": "address", "valueType": "RoleConfig", "prefix": "UjYwIw=="}, "authority": {"keyType": "address", "valueType": "RoleConfig", "prefix": "UjcwIw=="}, "interest_oracle": {"keyType": "address", "valueType": "RoleConfig", "prefix": "UjgwIw=="}}, "global": {}, "local": {}}, "schema": {"global": {"bytes": 2, "ints": 2}, "local": {"bytes": 0, "ints": 0}}}, "structs": {"RoleConfig": [{"name": "role_validity_start", "type": "uint64"}, {"name": "role_validity_end", "type": "uint64"}]}, "byteCode": {"approval": "CyAEAQAgFCYKBBUffHUEUjIwIwRSNzAjBFI0MCMEUjUwIwRSNjAjBFI4MCMEUjI1Iw9hc3NldF9zdXNwZW5kZWQPYXNzZXRfZGVmYXVsdGVkMRhAABEpMgNnJwcyA2cnCCNnJwkjZzEbQQBHMRkURDEYRIIIBIL3Gy0E7wT10wQDuDMpBD2+gL0E31ToLAQBDIKZBHQGrNIEw+SylzYaAI4IAA8AJgA+APYBiQGnAbEB+gAxGRQxGBQQRCkxAGciQzYaAUkVJBJEiAKmKUxnMgcWKExQsCJDNhoBSRUkEkSIAo8nB0xnMgcWKExQsCJDNhoBSRUiEkQ2GgJJTgIVJBJENhoDSSNZgQIISwEVEkRXAgBMiAJbiAJhF0cCiAJjJRJBAA0pSwNnMgcWKExQsCJDSYEoEkEAECtLA1BJvUUBFERLAr9C/+BJgTISQQARJwRLA1BJvUUBFERLAr9C/8hJgTwSQQARJwVLA1BJvUUBFERLAr9C/7BJgUYSQQAQKksDUEm9RQEUREsCv0L/mUmBUBJB/5InBksDUEm9RQEUREsCv0L/gTYaAUkVIhJENhoCSU4CFSQSRIgBtYgBuxdHAogBvUklE0SBKBJBABQrSwJQSb1FAUS8SDIHFihMULAiQ0mBMhJBAA8nBEsCUEm9RQFEvEhC/+FJgTwSQQAPJwVLAlBJvUUBRLxIQv/LSYFGEkEADipLAlBJvUUBRLxIQv+2SYFQEkH/rycGSwJQSb1FAUS8SEL/oDYaAUkVIhJEI1MqMQCIAPJEJwhMZzIHFihMULAiQyMpZUQoTFCwIkM2GgFJFSQSRCtLAYgAzCcESwKIAMUnBUsDiAC+KksEiAC4JwZPBYgAsYABACNPBlQiTwVUgQJPBFSBA08DVIEETwJUKExQsCJDNhoBSRUiEkQ2GgJJTgIVJBJEF0mIAMAlgwUoMjxGUE8GjgYATQA/ADAAIQATAAEAJwZLAVBJvUUBRL5IKExQsCJDKksBUEm9RQFEvkhC/+wnBUsBUEm9RQFEvkhC/90nBEsBUEm9RQFEvkhC/84rSwFQSb1FAUS+SEL/wIAQAAAAAAAAAAAAAAAAAAAAAEL/q4oCAYAAi/6L/1BJvUUBQQAgiwG+RCNbMgdJjAAOQQARiwG+RIEIW4sAD0EABCKMAIkjQv/5MQAjKWVEEkSJIycJZUQURImKAQCL/yUSQAAoi/+BKBJAACCL/4EyEkAAGIv/gTwSQAAQi/+BRhJAAAiL/4FQEkEAAyJEiSNC//o=", "clear": "C4EBQw=="}, "desc": "\n RBAC Module for testing\n ", "events": [], "networks": {}, "source": {"approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMzIgMjAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAweDUyMzIzMDIzIDB4NTIzNzMwMjMgMHg1MjM0MzAyMyAweDUyMzUzMDIzIDB4NTIzNjMwMjMgMHg1MjM4MzAyMyAweDUyMzIzNTIzICJhc3NldF9zdXNwZW5kZWQiICJhc3NldF9kZWZhdWx0ZWQiCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzAtMzEKICAgIC8vICMgUkJBQyBSb2xlcwogICAgLy8gc2VsZi5hcnJhbmdlciA9IEdsb2JhbFN0YXRlKEFjY291bnQoKSwga2V5PWNzdC5QUkVGSVhfSURfQVJSQU5HRVIpCiAgICBieXRlY18xIC8vIDB4NTIzMjMwMjMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMgogICAgLy8gc2VsZi5vcF9kYWVtb24gPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX09QX0RBRU1PTikKICAgIGJ5dGVjIDcgLy8gMHg1MjMyMzUyMwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjQ3LTQ4CiAgICAvLyAjIEQtQVNBIEdvdmVybmFuY2UKICAgIC8vIHNlbGYuYXNzZXRfc3VzcGVuZGVkID0gRmFsc2UKICAgIGJ5dGVjIDggLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIGludGNfMSAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjQ5CiAgICAvLyBzZWxmLmFzc2V0X2RlZmF1bHRlZCA9IEZhbHNlCiAgICBieXRlYyA5IC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBpbnRjXzEgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL21vY2tfbW9kdWxlX3JiYWMvY29udHJhY3QucHk6NgogICAgLy8gY2xhc3MgTW9ja1JiYWNNb2R1bGUoUmJhY01vZHVsZSk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9jcmVhdGVAMTcKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweDgyZjcxYjJkIDB4ZWYwNGY1ZDMgMHgwM2I4MzMyOSAweDNkYmU4MGJkIDB4ZGY1NGU4MmMgMHgwMTBjODI5OSAweDc0MDZhY2QyIDB4YzNlNGIyOTcgLy8gbWV0aG9kICJyYmFjX3JvdGF0ZV9hcnJhbmdlcihhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19zZXRfb3BfZGFlbW9uKGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX2Fzc2lnbl9yb2xlKHVpbnQ4LGFkZHJlc3MsYnl0ZVtdKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19yZXZva2Vfcm9sZSh1aW50OCxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19nb3ZfYXNzZXRfc3VzcGVuc2lvbihib29sKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19nZXRfYXJyYW5nZXIoKWFkZHJlc3MiLCBtZXRob2QgInJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXMoYWRkcmVzcykoYm9vbCxib29sLGJvb2wsYm9vbCxib29sKSIsIG1ldGhvZCAicmJhY19nZXRfcm9sZV9jb25maWcodWludDgsYWRkcmVzcykodWludDY0LHVpbnQ2NCkiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCByYmFjX3JvdGF0ZV9hcnJhbmdlciByYmFjX3NldF9vcF9kYWVtb24gcmJhY19hc3NpZ25fcm9sZSByYmFjX3Jldm9rZV9yb2xlIHJiYWNfZ292X2Fzc2V0X3N1c3BlbnNpb24gcmJhY19nZXRfYXJyYW5nZXIgcmJhY19nZXRfYWRkcmVzc19yb2xlcyByYmFjX2dldF9yb2xlX2NvbmZpZwogICAgZXJyCgptYWluX2NyZWF0ZUAxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tb2NrX21vZHVsZV9yYmFjL2NvbnRyYWN0LnB5OjE0CiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIGFzc2VydAogICAgLy8gc21hcnRfY29udHJhY3RzL21vY2tfbW9kdWxlX3JiYWMvY29udHJhY3QucHk6MTYKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSBUeG4uc2VuZGVyCiAgICBieXRlY18xIC8vIDB4NTIzMjMwMjMKICAgIHR4biBTZW5kZXIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbW9ja19tb2R1bGVfcmJhYy9jb250cmFjdC5weToxNAogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfcm90YXRlX2FycmFuZ2VyW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19yb3RhdGVfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE1OAogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE1OQogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IG5ld19hcnJhbmdlcgogICAgYnl0ZWNfMSAvLyAweDUyMzIzMDIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2MAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3NldF9vcF9kYWVtb25bcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3NldF9vcF9kYWVtb246CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTYyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE3MwogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE3NAogICAgLy8gc2VsZi5vcF9kYWVtb24udmFsdWUgPSBhZGRyZXNzCiAgICBieXRlYyA3IC8vIDB4NTIzMjM1MjMKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTc1CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfYXNzaWduX3JvbGVbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2Fzc2lnbl9yb2xlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE3NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTk5CiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAwCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDEKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCkpCiAgICBidG9pCiAgICBkdXBuIDIKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTAxCiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUik6CiAgICBpbnRjXzMgLy8gMjAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwMgogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IHJvbGVfYWRkcmVzcwogICAgYnl0ZWNfMSAvLyAweDUyMzIzMDIzCiAgICBkaWcgMwogICAgYXBwX2dsb2JhbF9wdXQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fdXBzZXJ0X3JvbGVAMTQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAzCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA1CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDQwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDYKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjXzMgLy8gMHg1MjM0MzAyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA3CiAgICAvLyBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcyhjb25maWcpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwMgogICAgLy8gc2VsZi5fdXBzZXJ0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCBjb25maWcpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fdXBzZXJ0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwOQogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTAKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgNCAvLyAweDUyMzUzMDIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTEKICAgIC8vIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDIKICAgIC8vIHNlbGYuX3Vwc2VydF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgY29uZmlnKQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3Vwc2VydF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTMKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGNzdC5ST0xFX1RSVVNURUUpOgogICAgZHVwCiAgICBwdXNoaW50IDYwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTQKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyA1IC8vIDB4NTIzNjMwMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNQogICAgLy8gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZykKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAyCiAgICAvLyBzZWxmLl91cHNlcnRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIGNvbmZpZykKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl91cHNlcnRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE3CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE4CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlY18yIC8vIDB4NTIzNzMwMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExOQogICAgLy8gc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDIKICAgIC8vIHNlbGYuX3Vwc2VydF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgY29uZmlnKQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3Vwc2VydF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMTE6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIxCiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpOgogICAgZHVwCiAgICBwdXNoaW50IDgwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl91cHNlcnRfcm9sZUAxNAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMgogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgNiAvLyAweDUyMzgzMDIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjMKICAgIC8vIHNlbGYuaW50ZXJlc3Rfb3JhY2xlW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZykKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fdXBzZXJ0X3JvbGVAMTQKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3Jldm9rZV9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19yZXZva2Vfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjQKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjUKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNgogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjYKICAgIC8vIGFzc2VydCByb2xlX2lkICE9IFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksIGVyci5JTlZBTElEX1JPTEUKICAgIGR1cAogICAgaW50Y18zIC8vIDIwCiAgICAhPQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI3CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI4CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjXzMgLy8gMHg1MjM0MzAyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI5CiAgICAvLyBkZWwgc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyOAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjA1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMQogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzIKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyA0IC8vIDB4NTIzNTMwMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMwogICAgLy8gZGVsIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI3CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNQogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNjAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNgogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgNSAvLyAweDUyMzYzMDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzcKICAgIC8vIGRlbCBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI3CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzOQogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKToKICAgIGR1cAogICAgcHVzaGludCA3MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQwCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjXzIgLy8gMHg1MjM3MzAyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQxCiAgICAvLyBkZWwgc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI3CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MwogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKToKICAgIGR1cAogICAgcHVzaGludCA4MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDQKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgNiAvLyAweDUyMzgzMDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDUKICAgIC8vIGRlbCBzZWxmLmludGVyZXN0X29yYWNsZVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ292X2Fzc2V0X3N1c3BlbnNpb25bcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dvdl9hc3NldF9zdXNwZW5zaW9uOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kICAjIFRPRE86IFVwZGF0ZSBzcGVjcyBhbmQgYWRkIHRlc3QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzEgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzcKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjXzIgLy8gMHg1MjM3MzAyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0NgogICAgLy8gc2VsZi5hc3NldF9zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGJ5dGVjIDggLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjQ3CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCAgIyBUT0RPOiBVcGRhdGUgc3BlY3MgYW5kIGFkZCB0ZXN0CiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYXJyYW5nZXJbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTcKICAgIC8vIHJldHVybiBzZWxmLmFycmFuZ2VyLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMSAvLyAweDUyMzIzMDIzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJyYW5nZXIgZXhpc3RzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjQ5CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9hZGRyZXNzX3JvbGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfYWRkcmVzc19yb2xlczoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjczCiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmFjY291bnRfbWFuYWdlciwgYWRkcmVzcyksCiAgICBieXRlY18zIC8vIDB4NTIzNDMwMjMKICAgIGRpZyAxCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3NAogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5wcmltYXJ5X2RlYWxlciwgYWRkcmVzcyksCiAgICBieXRlYyA0IC8vIDB4NTIzNTMwMjMKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3NQogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi50cnVzdGVlLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDUgLy8gMHg1MjM2MzAyMwogICAgZGlnIDMKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjc2CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgYWRkcmVzcyksCiAgICBieXRlY18yIC8vIDB4NTIzNzMwMjMKICAgIGRpZyA0CiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3NwogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5pbnRlcmVzdF9vcmFjbGUsIGFkZHJlc3MpLAogICAgYnl0ZWMgNiAvLyAweDUyMzgzMDIzCiAgICB1bmNvdmVyIDUKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHB1c2hieXRlcyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciA2CiAgICBzZXRiaXQKICAgIGludGNfMCAvLyAxCiAgICB1bmNvdmVyIDUKICAgIHNldGJpdAogICAgcHVzaGludCAyCiAgICB1bmNvdmVyIDQKICAgIHNldGJpdAogICAgcHVzaGludCAzCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgcHVzaGludCA0CiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfY29uZmlnW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfcm9sZV9jb25maWc6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjk0CiAgICAvLyByb2xlID0gcm9sZV9pZC5hc191aW50NjQoKQogICAgYnRvaQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5NQogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZSkKICAgIGR1cAogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTcKICAgIC8vIGNhc2UgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKToKICAgIGludGNfMyAvLyAyMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwMQogICAgLy8gY2FzZSBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIHB1c2hpbnRzIDQwIDUwIDYwIDcwIDgwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjk2LTMyNwogICAgLy8gbWF0Y2ggcm9sZToKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUik6CiAgICAvLyAgICAgICAgIHJldHVybiB0eXAuUm9sZUNvbmZpZygKICAgIC8vICAgICAgICAgICAgIHJvbGVfdmFsaWRpdHlfc3RhcnQ9VUludDY0KDApLCByb2xlX3ZhbGlkaXR5X2VuZD1VSW50NjQoMCkKICAgIC8vICAgICAgICAgKQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLnByaW1hcnlfZGVhbGVyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSk6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5pbnRlcmVzdF9vcmFjbGUsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYuaW50ZXJlc3Rfb3JhY2xlW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIF86CiAgICAvLyAgICAgICAgIG9wLmVycihlcnIuSU5WQUxJRF9ST0xFKQogICAgdW5jb3ZlciA2CiAgICBtYXRjaCByYmFjX2dldF9yb2xlX2NvbmZpZ19zd2l0Y2hfY2FzZV8wQDIgcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfMUAzIHJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzJANCByYmFjX2dldF9yb2xlX2NvbmZpZ19zd2l0Y2hfY2FzZV8zQDUgcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfNEA2IHJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzVANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyNwogICAgLy8gb3AuZXJyKGVyci5JTlZBTElEX1JPTEUpCiAgICBlcnIgLy8gSW52YWxpZCByb2xlIGlkZW50aWZpZXIKCnJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzVANzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjMKICAgIC8vIHNlbGYuaW50ZXJlc3Rfb3JhY2xlLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDYgLy8gMHg1MjM4MzAyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMi0zMjQKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLmludGVyZXN0X29yYWNsZSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI1CiAgICAvLyByZXR1cm4gc2VsZi5pbnRlcmVzdF9vcmFjbGVbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCgpyYmFjX2dldF9yb2xlX2NvbmZpZ19hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfY29uZmlnQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCnJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzRANjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTgKICAgIC8vIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjXzIgLy8gMHg1MjM3MzAyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLmF1dGhvcml0eSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzIwCiAgICAvLyByZXR1cm4gc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV9jb25maWdfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX2NvbmZpZ0A5CgpyYmFjX2dldF9yb2xlX2NvbmZpZ19zd2l0Y2hfY2FzZV8zQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEzCiAgICAvLyBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgNSAvLyAweDUyMzYzMDIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEyLTMxNAogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzE1CiAgICAvLyByZXR1cm4gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfY29uZmlnX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV9jb25maWdAOQoKcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfMkA0OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwOAogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyA0IC8vIDB4NTIzNTMwMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDctMzA5CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEwCiAgICAvLyByZXR1cm4gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX2NvbmZpZ19hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfY29uZmlnQDkKCnJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzFAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDMKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjXzMgLy8gMHg1MjM0MzAyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwMi0zMDQKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLmFjY291bnRfbWFuYWdlciwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA1CiAgICAvLyByZXR1cm4gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV9jb25maWdfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX2NvbmZpZ0A5CgpyYmFjX2dldF9yb2xlX2NvbmZpZ19zd2l0Y2hfY2FzZV8wQDI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjk4LTMwMAogICAgLy8gcmV0dXJuIHR5cC5Sb2xlQ29uZmlnKAogICAgLy8gICAgIHJvbGVfdmFsaWRpdHlfc3RhcnQ9VUludDY0KDApLCByb2xlX3ZhbGlkaXR5X2VuZD1VSW50NjQoMCkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV9jb25maWdfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX2NvbmZpZ0A5CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3JvbGVfaXNfYWN0aXZlKHJvbGVfbWFwOiBieXRlcywgcm9sZV9hZGRyZXNzOiBieXRlcykgLT4gdWludDY0Ogpfcm9sZV9pc19hY3RpdmU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTcKICAgIC8vIGRlZiBfcm9sZV9pc19hY3RpdmUoc2VsZiwgcm9sZV9tYXA6IHR5cC5SYmFjUm9sZSwgcm9sZV9hZGRyZXNzOiBBY2NvdW50KSAtPiBib29sOgogICAgcHJvdG8gMiAxCiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OC02MgogICAgLy8gcmV0dXJuIHNlbGYuX2hhc19yb2xlKHJvbGVfbWFwLCByb2xlX2FkZHJlc3MpIGFuZCAoCiAgICAvLyAgICAgcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICAvLyApCiAgICBieiBfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTkKICAgIC8vIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBCb3hNYXAgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2MAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTktNjAKICAgIC8vIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIDw9CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTktNjEKICAgIC8vIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IF9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2MQogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBCb3hNYXAgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDgKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAtNjEKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgPj0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgaW50Y18wIC8vIDEKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX21lcmdlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzEgLy8gMAogICAgYiBfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpIC0+IHZvaWQ6CmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjUKICAgIC8vIGFzc2VydCBzZWxmLl9pc19hcnJhbmdlcihUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjUyCiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzID09IHNlbGYuYXJyYW5nZXIudmFsdWUKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18xIC8vIDB4NTIzMjMwMjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcnJhbmdlciBleGlzdHMKICAgID09CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjUKICAgIC8vIGFzc2VydCBzZWxmLl9pc19hcnJhbmdlcihUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpIC0+IHZvaWQ6CmFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjgzCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYXNzZXRfZGVmYXVsdGVkLCBlcnIuREVGQVVMVEVECiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgOSAvLyAiYXNzZXRfZGVmYXVsdGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2RlZmF1bHRlZCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBEZWZhdWx0ZWQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkOiB1aW50NjQpIC0+IHZvaWQ6Cl9hc3NlcnRfdmFsaWRfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OAogICAgLy8gZGVmIF9hc3NlcnRfdmFsaWRfcm9sZShzZWxmLCByb2xlX2lkOiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MAogICAgLy8gVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIGludGNfMyAvLyAyMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk2CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MQogICAgLy8gVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICBwdXNoaW50IDQwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTYKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkyCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgcHVzaGludCA1MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk2CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MwogICAgLy8gVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgcHVzaGludCA2MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk2CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NAogICAgLy8gVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICBwdXNoaW50IDcwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTYKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojk1CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIHB1c2hpbnQgODAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfZmFsc2VANwoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA2OgogICAgaW50Y18wIC8vIDEKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX21lcmdlQDg6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTYKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICByZXRzdWIKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX2ZhbHNlQDc6CiAgICBpbnRjXzEgLy8gMAogICAgYiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9tZXJnZUA4Cg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="}, "sourceInfo": {"approval": {"pcOffsetMethod": "none", "sourceInfo": [{"pc": [897], "errorMessage": "Defaulted"}, {"pc": [322, 346, 370, 393, 417, 472, 500, 522, 543, 565, 741, 758, 773, 788, 802], "errorMessage": "Invalid account role address"}, {"pc": [457, 731, 950], "errorMessage": "Invalid role identifier"}, {"pc": [587, 889], "errorMessage": "Not authorized"}, {"pc": [849, 864], "errorMessage": "check BoxMap entry exists"}, {"pc": [604, 887], "errorMessage": "check self.arranger exists"}, {"pc": [895], "errorMessage": "check self.asset_defaulted exists"}, {"pc": [263], "errorMessage": "invalid array length header"}, {"pc": [578], "errorMessage": "invalid number of bytes for arc4.bool"}, {"pc": [271], "errorMessage": "invalid number of bytes for arc4.dynamic_array"}, {"pc": [200, 223, 257, 441, 618, 701], "errorMessage": "invalid number of bytes for arc4.static_array"}, {"pc": [247, 431, 691], "errorMessage": "invalid number of bytes for arc4.uint8"}]}, "clear": {"pcOffsetMethod": "none", "sourceInfo": []}}, "templateVariables": {}}""" -APP_SPEC = algokit_utils.Arc56Contract.from_json(_APP_SPEC_JSON) - -def _parse_abi_args(args: object | None = None) -> list[object] | None: - """Helper to parse ABI args into the format expected by underlying client""" - if args is None: - return None - - def convert_dataclass(value: object) -> object: - if dataclasses.is_dataclass(value): - return tuple(convert_dataclass(getattr(value, field.name)) for field in dataclasses.fields(value)) - elif isinstance(value, (list, tuple)): - return type(value)(convert_dataclass(item) for item in value) - return value - - match args: - case tuple(): - method_args = list(args) - case _ if dataclasses.is_dataclass(args): - method_args = [getattr(args, field.name) for field in dataclasses.fields(args)] - case _: - raise ValueError("Invalid 'args' type. Expected 'tuple' or 'TypedDict' for respective typed arguments.") - - return [ - convert_dataclass(arg) if not isinstance(arg, algokit_utils.AppMethodCallTransactionArgument) else arg - for arg in method_args - ] if method_args else None - -def _init_dataclass(cls: type, data: dict) -> object: - """ - Recursively instantiate a dataclass of type `cls` from `data`. - - For each field on the dataclass, if the field type is also a dataclass - and the corresponding data is a dict, instantiate that field recursively. - """ - field_values = {} - for field in dataclasses.fields(cls): - field_value = data.get(field.name) - # Check if the field expects another dataclass and the value is a dict. - if dataclasses.is_dataclass(field.type) and isinstance(field_value, dict): - field_values[field.name] = _init_dataclass(typing.cast(type, field.type), field_value) - else: - field_values[field.name] = field_value - return cls(**field_values) - -@dataclasses.dataclass(frozen=True) -class RoleConfig: - """Struct for RoleConfig""" - role_validity_start: int - role_validity_end: int - - -@dataclasses.dataclass(frozen=True, kw_only=True) -class RbacRotateArrangerArgs: - """Dataclass for rbac_rotate_arranger arguments""" - new_arranger: str - - @property - def abi_method_signature(self) -> str: - return "rbac_rotate_arranger(address)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class RbacSetOpDaemonArgs: - """Dataclass for rbac_set_op_daemon arguments""" - address: str - - @property - def abi_method_signature(self) -> str: - return "rbac_set_op_daemon(address)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class RbacAssignRoleArgs: - """Dataclass for rbac_assign_role arguments""" - role_id: int - role_address: str - config: bytes | str - - @property - def abi_method_signature(self) -> str: - return "rbac_assign_role(uint8,address,byte[])uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class RbacRevokeRoleArgs: - """Dataclass for rbac_revoke_role arguments""" - role_id: int - role_address: str - - @property - def abi_method_signature(self) -> str: - return "rbac_revoke_role(uint8,address)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class RbacGovAssetSuspensionArgs: - """Dataclass for rbac_gov_asset_suspension arguments""" - suspended: bool - - @property - def abi_method_signature(self) -> str: - return "rbac_gov_asset_suspension(bool)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class RbacGetAddressRolesArgs: - """Dataclass for rbac_get_address_roles arguments""" - address: str - - @property - def abi_method_signature(self) -> str: - return "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class RbacGetRoleConfigArgs: - """Dataclass for rbac_get_role_config arguments""" - role_id: int - role_address: str - - @property - def abi_method_signature(self) -> str: - return "rbac_get_role_config(uint8,address)(uint64,uint64)" - - -class MockRbacModuleParams: - def __init__(self, app_client: algokit_utils.AppClient): - self.app_client = app_client - - def rbac_rotate_arranger( - self, - args: tuple[str] | RbacRotateArrangerArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_rotate_arranger(address)uint64", - "args": method_args, - })) - - def rbac_set_op_daemon( - self, - args: tuple[str] | RbacSetOpDaemonArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_set_op_daemon(address)uint64", - "args": method_args, - })) - - def rbac_assign_role( - self, - args: tuple[int, str, bytes | str] | RbacAssignRoleArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_assign_role(uint8,address,byte[])uint64", - "args": method_args, - })) - - def rbac_revoke_role( - self, - args: tuple[int, str] | RbacRevokeRoleArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_revoke_role(uint8,address)uint64", - "args": method_args, - })) - - def rbac_gov_asset_suspension( - self, - args: tuple[bool] | RbacGovAssetSuspensionArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_gov_asset_suspension(bool)uint64", - "args": method_args, - })) - - def rbac_get_arranger( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_arranger()address", - })) - - def rbac_get_address_roles( - self, - args: tuple[str] | RbacGetAddressRolesArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", - "args": method_args, - })) - - def rbac_get_role_config( - self, - args: tuple[int, str] | RbacGetRoleConfigArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_role_config(uint8,address)(uint64,uint64)", - "args": method_args, - })) - - def clear_state( - self, - params: algokit_utils.AppClientBareCallParams | None = None, - - ) -> algokit_utils.AppCallParams: - return self.app_client.params.bare.clear_state( - params, - - ) - - -class MockRbacModuleCreateTransactionParams: - def __init__(self, app_client: algokit_utils.AppClient): - self.app_client = app_client - - def rbac_rotate_arranger( - self, - args: tuple[str] | RbacRotateArrangerArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_rotate_arranger(address)uint64", - "args": method_args, - })) - - def rbac_set_op_daemon( - self, - args: tuple[str] | RbacSetOpDaemonArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_set_op_daemon(address)uint64", - "args": method_args, - })) - - def rbac_assign_role( - self, - args: tuple[int, str, bytes | str] | RbacAssignRoleArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_assign_role(uint8,address,byte[])uint64", - "args": method_args, - })) - - def rbac_revoke_role( - self, - args: tuple[int, str] | RbacRevokeRoleArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_revoke_role(uint8,address)uint64", - "args": method_args, - })) - - def rbac_gov_asset_suspension( - self, - args: tuple[bool] | RbacGovAssetSuspensionArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_gov_asset_suspension(bool)uint64", - "args": method_args, - })) - - def rbac_get_arranger( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_arranger()address", - })) - - def rbac_get_address_roles( - self, - args: tuple[str] | RbacGetAddressRolesArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", - "args": method_args, - })) - - def rbac_get_role_config( - self, - args: tuple[int, str] | RbacGetRoleConfigArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_role_config(uint8,address)(uint64,uint64)", - "args": method_args, - })) - - def clear_state( - self, - params: algokit_utils.AppClientBareCallParams | None = None, - - ) -> Transaction: - return self.app_client.create_transaction.bare.clear_state( - params, - - ) - - -class MockRbacModuleSend: - def __init__(self, app_client: algokit_utils.AppClient): - self.app_client = app_client - - def rbac_rotate_arranger( - self, - args: tuple[str] | RbacRotateArrangerArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_rotate_arranger(address)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def rbac_set_op_daemon( - self, - args: tuple[str] | RbacSetOpDaemonArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_set_op_daemon(address)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def rbac_assign_role( - self, - args: tuple[int, str, bytes | str] | RbacAssignRoleArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_assign_role(uint8,address,byte[])uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def rbac_revoke_role( - self, - args: tuple[int, str] | RbacRevokeRoleArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_revoke_role(uint8,address)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def rbac_gov_asset_suspension( - self, - args: tuple[bool] | RbacGovAssetSuspensionArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_gov_asset_suspension(bool)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def rbac_get_arranger( - self, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[str]: - - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_arranger()address", - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[str], parsed_response) - - def rbac_get_address_roles( - self, - args: tuple[str] | RbacGetAddressRolesArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[tuple[bool, bool, bool, bool, bool]]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[tuple[bool, bool, bool, bool, bool]], parsed_response) - - def rbac_get_role_config( - self, - args: tuple[int, str] | RbacGetRoleConfigArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[RoleConfig]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_role_config(uint8,address)(uint64,uint64)", - "args": method_args, - }), send_params=send_params) - parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(RoleConfig, typing.cast(dict, response.abi_return))) # type: ignore - return typing.cast(algokit_utils.SendAppTransactionResult[RoleConfig], parsed_response) - - def clear_state( - self, - params: algokit_utils.AppClientBareCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[algokit_utils.ABIReturn]: - return self.app_client.send.bare.clear_state( - params, - send_params=send_params, - ) - - -class GlobalStateValue(typing.TypedDict): - """Shape of global_state state key values""" - arranger: str - op_daemon: str - asset_suspended: int - asset_defaulted: int - -class MockRbacModuleState: - """Methods to access state for the current MockRbacModule app""" - - def __init__(self, app_client: algokit_utils.AppClient): - self.app_client = app_client - - @property - def global_state( - self - ) -> "_GlobalState": - """Methods to access global_state for the current app""" - return _GlobalState(self.app_client) - - @property - def box( - self - ) -> "_BoxState": - """Methods to access box for the current app""" - return _BoxState(self.app_client) - -class _GlobalState: - def __init__(self, app_client: algokit_utils.AppClient): - self.app_client = app_client - - # Pre-generated mapping of value types to their struct classes - self._struct_classes: dict[str, typing.Type[typing.Any]] = {} - - def get_all(self) -> GlobalStateValue: - """Get all current keyed values from global_state state""" - result = self.app_client.state.global_state.get_all() - if not result: - return typing.cast(GlobalStateValue, {}) - - converted = {} - for key, value in result.items(): - key_info = self.app_client.app_spec.state.keys.global_state.get(key) - struct_class = self._struct_classes.get(key_info.value_type) if key_info else None - converted[key] = ( - _init_dataclass(struct_class, value) if struct_class and isinstance(value, dict) - else value - ) - return typing.cast(GlobalStateValue, converted) - - @property - def arranger(self) -> str: - """Get the current value of the arranger key in global_state state""" - value = self.app_client.state.global_state.get_value("arranger") - if isinstance(value, dict) and "address" in self._struct_classes: - return _init_dataclass(self._struct_classes["address"], value) # type: ignore - return typing.cast(str, value) - - @property - def op_daemon(self) -> str: - """Get the current value of the op_daemon key in global_state state""" - value = self.app_client.state.global_state.get_value("op_daemon") - if isinstance(value, dict) and "address" in self._struct_classes: - return _init_dataclass(self._struct_classes["address"], value) # type: ignore - return typing.cast(str, value) - - @property - def asset_suspended(self) -> int: - """Get the current value of the asset_suspended key in global_state state""" - value = self.app_client.state.global_state.get_value("asset_suspended") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def asset_defaulted(self) -> int: - """Get the current value of the asset_defaulted key in global_state state""" - value = self.app_client.state.global_state.get_value("asset_defaulted") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - -class _BoxState: - def __init__(self, app_client: algokit_utils.AppClient): - self.app_client = app_client - - # Pre-generated mapping of value types to their struct classes - self._struct_classes: dict[str, typing.Type[typing.Any]] = { - "RoleConfig": RoleConfig - } - - def get_all(self) -> dict[str, typing.Any]: - """Get all current keyed values from box state""" - result = self.app_client.state.box.get_all() - if not result: - return {} - - converted = {} - for key, value in result.items(): - key_info = self.app_client.app_spec.state.keys.box.get(key) - struct_class = self._struct_classes.get(key_info.value_type) if key_info else None - converted[key] = ( - _init_dataclass(struct_class, value) if struct_class and isinstance(value, dict) - else value - ) - return converted - - @property - def account_manager(self) -> "_MapState[str, RoleConfig]": - """Get values from the account_manager map in box state""" - return _MapState( - self.app_client.state.box, - "account_manager", - self._struct_classes.get("RoleConfig") - ) - - @property - def primary_dealer(self) -> "_MapState[str, RoleConfig]": - """Get values from the primary_dealer map in box state""" - return _MapState( - self.app_client.state.box, - "primary_dealer", - self._struct_classes.get("RoleConfig") - ) - - @property - def trustee(self) -> "_MapState[str, RoleConfig]": - """Get values from the trustee map in box state""" - return _MapState( - self.app_client.state.box, - "trustee", - self._struct_classes.get("RoleConfig") - ) - - @property - def authority(self) -> "_MapState[str, RoleConfig]": - """Get values from the authority map in box state""" - return _MapState( - self.app_client.state.box, - "authority", - self._struct_classes.get("RoleConfig") - ) - - @property - def interest_oracle(self) -> "_MapState[str, RoleConfig]": - """Get values from the interest_oracle map in box state""" - return _MapState( - self.app_client.state.box, - "interest_oracle", - self._struct_classes.get("RoleConfig") - ) - -_KeyType = typing.TypeVar("_KeyType") -_ValueType = typing.TypeVar("_ValueType") - -class _AppClientStateMethodsProtocol(typing.Protocol): - def get_map(self, map_name: str) -> dict[typing.Any, typing.Any]: - ... - def get_map_value(self, map_name: str, key: typing.Any) -> typing.Any | None: - ... - -class _MapState(typing.Generic[_KeyType, _ValueType]): - """Generic class for accessing state maps with strongly typed keys and values""" - - def __init__(self, state_accessor: _AppClientStateMethodsProtocol, map_name: str, - struct_class: typing.Type[_ValueType] | None = None): - self._state_accessor = state_accessor - self._map_name = map_name - self._struct_class = struct_class - - def get_map(self) -> dict[_KeyType, _ValueType]: - """Get all current values in the map""" - result = self._state_accessor.get_map(self._map_name) - if self._struct_class and result: - return {k: _init_dataclass(self._struct_class, v) if isinstance(v, dict) else v - for k, v in result.items()} # type: ignore - return typing.cast(dict[_KeyType, _ValueType], result or {}) - - def get_value(self, key: _KeyType) -> _ValueType | None: - """Get a value from the map by key""" - key_value = dataclasses.asdict(key) if dataclasses.is_dataclass(key) else key # type: ignore - value = self._state_accessor.get_map_value(self._map_name, key_value) - if value is not None and self._struct_class and isinstance(value, dict): - return _init_dataclass(self._struct_class, value) # type: ignore - return typing.cast(_ValueType | None, value) - - -class MockRbacModuleClient: - """Client for interacting with MockRbacModule smart contract""" - - @typing.overload - def __init__(self, app_client: algokit_utils.AppClient) -> None: ... - - @typing.overload - def __init__( - self, - *, - algorand: _AlgoKitAlgorandClient, - app_id: int, - app_name: str | None = None, - default_sender: str | None = None, - default_signer: TransactionSigner | None = None, - approval_source_map: SourceMap | None = None, - clear_source_map: SourceMap | None = None, - ) -> None: ... - - def __init__( - self, - app_client: algokit_utils.AppClient | None = None, - *, - algorand: _AlgoKitAlgorandClient | None = None, - app_id: int | None = None, - app_name: str | None = None, - default_sender: str | None = None, - default_signer: TransactionSigner | None = None, - approval_source_map: SourceMap | None = None, - clear_source_map: SourceMap | None = None, - ) -> None: - if app_client: - self.app_client = app_client - elif algorand and app_id: - self.app_client = algokit_utils.AppClient( - algokit_utils.AppClientParams( - algorand=algorand, - app_spec=APP_SPEC, - app_id=app_id, - app_name=app_name, - default_sender=default_sender, - default_signer=default_signer, - approval_source_map=approval_source_map, - clear_source_map=clear_source_map, - ) - ) - else: - raise ValueError("Either app_client or algorand and app_id must be provided") - - self.params = MockRbacModuleParams(self.app_client) - self.create_transaction = MockRbacModuleCreateTransactionParams(self.app_client) - self.send = MockRbacModuleSend(self.app_client) - self.state = MockRbacModuleState(self.app_client) - - @staticmethod - def from_creator_and_name( - creator_address: str, - app_name: str, - algorand: _AlgoKitAlgorandClient, - default_sender: str | None = None, - default_signer: TransactionSigner | None = None, - approval_source_map: SourceMap | None = None, - clear_source_map: SourceMap | None = None, - ignore_cache: bool | None = None, - app_lookup_cache: algokit_utils.ApplicationLookup | None = None, - ) -> "MockRbacModuleClient": - return MockRbacModuleClient( - algokit_utils.AppClient.from_creator_and_name( - creator_address=creator_address, - app_name=app_name, - app_spec=APP_SPEC, - algorand=algorand, - default_sender=default_sender, - default_signer=default_signer, - approval_source_map=approval_source_map, - clear_source_map=clear_source_map, - ignore_cache=ignore_cache, - app_lookup_cache=app_lookup_cache, - ) - ) - - @staticmethod - def from_network( - algorand: _AlgoKitAlgorandClient, - app_name: str | None = None, - default_sender: str | None = None, - default_signer: TransactionSigner | None = None, - approval_source_map: SourceMap | None = None, - clear_source_map: SourceMap | None = None, - ) -> "MockRbacModuleClient": - return MockRbacModuleClient( - algokit_utils.AppClient.from_network( - app_spec=APP_SPEC, - algorand=algorand, - app_name=app_name, - default_sender=default_sender, - default_signer=default_signer, - approval_source_map=approval_source_map, - clear_source_map=clear_source_map, - ) - ) - - @property - def app_id(self) -> int: - return self.app_client.app_id - - @property - def app_address(self) -> str: - return self.app_client.app_address - - @property - def app_name(self) -> str: - return self.app_client.app_name - - @property - def app_spec(self) -> algokit_utils.Arc56Contract: - return self.app_client.app_spec - - @property - def algorand(self) -> _AlgoKitAlgorandClient: - return self.app_client.algorand - - def clone( - self, - app_name: str | None = None, - default_sender: str | None = None, - default_signer: TransactionSigner | None = None, - approval_source_map: SourceMap | None = None, - clear_source_map: SourceMap | None = None, - ) -> "MockRbacModuleClient": - return MockRbacModuleClient( - self.app_client.clone( - app_name=app_name, - default_sender=default_sender, - default_signer=default_signer, - approval_source_map=approval_source_map, - clear_source_map=clear_source_map, - ) - ) - - def new_group(self) -> "MockRbacModuleComposer": - return MockRbacModuleComposer(self) - - @typing.overload - def decode_return_value( - self, - method: typing.Literal["rbac_rotate_arranger(address)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["rbac_set_op_daemon(address)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["rbac_assign_role(uint8,address,byte[])uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["rbac_revoke_role(uint8,address)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["rbac_gov_asset_suspension(bool)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["rbac_get_arranger()address"], - return_value: algokit_utils.ABIReturn | None - ) -> str | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["rbac_get_address_roles(address)(bool,bool,bool,bool,bool)"], - return_value: algokit_utils.ABIReturn | None - ) -> tuple[bool, bool, bool, bool, bool] | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["rbac_get_role_config(uint8,address)(uint64,uint64)"], - return_value: algokit_utils.ABIReturn | None - ) -> RoleConfig | None: ... - @typing.overload - def decode_return_value( - self, - method: str, - return_value: algokit_utils.ABIReturn | None - ) -> algokit_utils.ABIValue | algokit_utils.ABIStruct | None: ... - - def decode_return_value( - self, - method: str, - return_value: algokit_utils.ABIReturn | None - ) -> algokit_utils.ABIValue | algokit_utils.ABIStruct | None | RoleConfig | int | str | tuple[bool, bool, bool, bool, bool]: - """Decode ABI return value for the given method.""" - if return_value is None: - return None - - arc56_method = self.app_spec.get_arc56_method(method) - decoded = return_value.get_arc56_value(arc56_method, self.app_spec.structs) - - # If method returns a struct, convert the dict to appropriate dataclass - if (arc56_method and - arc56_method.returns and - arc56_method.returns.struct and - isinstance(decoded, dict)): - struct_class = globals().get(arc56_method.returns.struct) - if struct_class: - return struct_class(**typing.cast(dict, decoded)) - return decoded - - -@dataclasses.dataclass(frozen=True) -class MockRbacModuleBareCallCreateParams(algokit_utils.AppClientBareCallCreateParams): - """Parameters for creating MockRbacModule contract with bare calls""" - on_complete: typing.Literal[OnComplete.NoOpOC] | None = None - - def to_algokit_utils_params(self) -> algokit_utils.AppClientBareCallCreateParams: - return algokit_utils.AppClientBareCallCreateParams(**self.__dict__) - -class MockRbacModuleFactory(algokit_utils.TypedAppFactoryProtocol[MockRbacModuleBareCallCreateParams, None, None]): - """Factory for deploying and managing MockRbacModuleClient smart contracts""" - - def __init__( - self, - algorand: _AlgoKitAlgorandClient, - *, - app_name: str | None = None, - default_sender: str | None = None, - default_signer: TransactionSigner | None = None, - version: str | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None, - ): - self.app_factory = algokit_utils.AppFactory( - params=algokit_utils.AppFactoryParams( - algorand=algorand, - app_spec=APP_SPEC, - app_name=app_name, - default_sender=default_sender, - default_signer=default_signer, - version=version, - compilation_params=compilation_params, - ) - ) - self.params = MockRbacModuleFactoryParams(self.app_factory) - self.create_transaction = MockRbacModuleFactoryCreateTransaction(self.app_factory) - self.send = MockRbacModuleFactorySend(self.app_factory) - - @property - def app_name(self) -> str: - return self.app_factory.app_name - - @property - def app_spec(self) -> algokit_utils.Arc56Contract: - return self.app_factory.app_spec - - @property - def algorand(self) -> _AlgoKitAlgorandClient: - return self.app_factory.algorand - - def deploy( - self, - *, - on_update: algokit_utils.OnUpdate | None = None, - on_schema_break: algokit_utils.OnSchemaBreak | None = None, - create_params: MockRbacModuleBareCallCreateParams | None = None, - update_params: None = None, - delete_params: None = None, - existing_deployments: algokit_utils.ApplicationLookup | None = None, - ignore_cache: bool = False, - app_name: str | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None, - send_params: algokit_utils.SendParams | None = None, - ) -> tuple[MockRbacModuleClient, algokit_utils.AppFactoryDeployResult]: - """Deploy the application""" - deploy_response = self.app_factory.deploy( - on_update=on_update, - on_schema_break=on_schema_break, - create_params=create_params.to_algokit_utils_params() if create_params else None, - update_params=update_params, - delete_params=delete_params, - existing_deployments=existing_deployments, - ignore_cache=ignore_cache, - app_name=app_name, - compilation_params=compilation_params, - send_params=send_params, - ) - - return MockRbacModuleClient(deploy_response[0]), deploy_response[1] - - def get_app_client_by_creator_and_name( - self, - creator_address: str, - app_name: str, - default_sender: str | None = None, - default_signer: TransactionSigner | None = None, - ignore_cache: bool | None = None, - app_lookup_cache: algokit_utils.ApplicationLookup | None = None, - approval_source_map: SourceMap | None = None, - clear_source_map: SourceMap | None = None, - ) -> MockRbacModuleClient: - """Get an app client by creator address and name""" - return MockRbacModuleClient( - self.app_factory.get_app_client_by_creator_and_name( - creator_address, - app_name, - default_sender, - default_signer, - ignore_cache, - app_lookup_cache, - approval_source_map, - clear_source_map, - ) - ) - - def get_app_client_by_id( - self, - app_id: int, - app_name: str | None = None, - default_sender: str | None = None, - default_signer: TransactionSigner | None = None, - approval_source_map: SourceMap | None = None, - clear_source_map: SourceMap | None = None, - ) -> MockRbacModuleClient: - """Get an app client by app ID""" - return MockRbacModuleClient( - self.app_factory.get_app_client_by_id( - app_id, - app_name, - default_sender, - default_signer, - approval_source_map, - clear_source_map, - ) - ) - - -class MockRbacModuleFactoryParams: - """Parameters for creating transactions for MockRbacModule contract""" - - def __init__(self, app_factory: algokit_utils.AppFactory): - self.app_factory = app_factory - self.create = MockRbacModuleFactoryCreateParams(app_factory) - self.update = MockRbacModuleFactoryUpdateParams(app_factory) - self.delete = MockRbacModuleFactoryDeleteParams(app_factory) - -class MockRbacModuleFactoryCreateParams: - """Parameters for 'create' operations of MockRbacModule contract""" - - def __init__(self, app_factory: algokit_utils.AppFactory): - self.app_factory = app_factory - - def bare( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateParams: - """Creates an instance using a bare call""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.bare.create( - algokit_utils.AppFactoryCreateParams(**dataclasses.asdict(params)), - compilation_params=compilation_params) - - def rbac_rotate_arranger( - self, - args: tuple[str] | RbacRotateArrangerArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_rotate_arranger(address)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "rbac_rotate_arranger(address)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def rbac_set_op_daemon( - self, - args: tuple[str] | RbacSetOpDaemonArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_set_op_daemon(address)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "rbac_set_op_daemon(address)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def rbac_assign_role( - self, - args: tuple[int, str, bytes | str] | RbacAssignRoleArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_assign_role(uint8,address,byte[])uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "rbac_assign_role(uint8,address,byte[])uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def rbac_revoke_role( - self, - args: tuple[int, str] | RbacRevokeRoleArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_revoke_role(uint8,address)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "rbac_revoke_role(uint8,address)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def rbac_gov_asset_suspension( - self, - args: tuple[bool] | RbacGovAssetSuspensionArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_gov_asset_suspension(bool)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "rbac_gov_asset_suspension(bool)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def rbac_get_arranger( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_get_arranger()address ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "rbac_get_arranger()address", - "args": None, - } - ), - compilation_params=compilation_params - ) - - def rbac_get_address_roles( - self, - args: tuple[str] | RbacGetAddressRolesArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_get_address_roles(address)(bool,bool,bool,bool,bool) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def rbac_get_role_config( - self, - args: tuple[int, str] | RbacGetRoleConfigArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_get_role_config(uint8,address)(uint64,uint64) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "rbac_get_role_config(uint8,address)(uint64,uint64)", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - -class MockRbacModuleFactoryUpdateParams: - """Parameters for 'update' operations of MockRbacModule contract""" - - def __init__(self, app_factory: algokit_utils.AppFactory): - self.app_factory = app_factory - - def bare( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - - ) -> algokit_utils.AppUpdateParams: - """Updates an instance using a bare call""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.bare.deploy_update( - algokit_utils.AppClientBareCallParams(**dataclasses.asdict(params)), - ) - -class MockRbacModuleFactoryDeleteParams: - """Parameters for 'delete' operations of MockRbacModule contract""" - - def __init__(self, app_factory: algokit_utils.AppFactory): - self.app_factory = app_factory - - def bare( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - - ) -> algokit_utils.AppDeleteParams: - """Deletes an instance using a bare call""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.bare.deploy_delete( - algokit_utils.AppClientBareCallParams(**dataclasses.asdict(params)), - ) - - -class MockRbacModuleFactoryCreateTransaction: - """Create transactions for MockRbacModule contract""" - - def __init__(self, app_factory: algokit_utils.AppFactory): - self.app_factory = app_factory - self.create = MockRbacModuleFactoryCreateTransactionCreate(app_factory) - - -class MockRbacModuleFactoryCreateTransactionCreate: - """Create new instances of MockRbacModule contract""" - - def __init__(self, app_factory: algokit_utils.AppFactory): - self.app_factory = app_factory - - def bare( - self, - params: algokit_utils.CommonAppCallCreateParams | None = None, - ) -> Transaction: - """Creates a new instance using a bare call""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.create_transaction.bare.create( - algokit_utils.AppFactoryCreateParams(**dataclasses.asdict(params)), - ) - - -class MockRbacModuleFactorySend: - """Send calls to MockRbacModule contract""" - - def __init__(self, app_factory: algokit_utils.AppFactory): - self.app_factory = app_factory - self.create = MockRbacModuleFactorySendCreate(app_factory) - - -class MockRbacModuleFactorySendCreate: - """Send create calls to MockRbacModule contract""" - - def __init__(self, app_factory: algokit_utils.AppFactory): - self.app_factory = app_factory - - def bare( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - send_params: algokit_utils.SendParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None, - ) -> tuple[MockRbacModuleClient, algokit_utils.SendAppCreateTransactionResult]: - """Creates a new instance using a bare call""" - params = params or algokit_utils.CommonAppCallCreateParams() - result = self.app_factory.send.bare.create( - algokit_utils.AppFactoryCreateParams(**dataclasses.asdict(params)), - send_params=send_params, - compilation_params=compilation_params - ) - return MockRbacModuleClient(result[0]), result[1] - - -class MockRbacModuleComposer: - """Composer for creating transaction groups for MockRbacModule contract calls""" - - def __init__(self, client: "MockRbacModuleClient"): - self.client = client - self._composer = client.algorand.new_group() - self._result_mappers: list[typing.Callable[[algokit_utils.ABIReturn | None], object] | None] = [] - - def rbac_rotate_arranger( - self, - args: tuple[str] | RbacRotateArrangerArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> "MockRbacModuleComposer": - self._composer.add_app_call_method_call( - self.client.params.rbac_rotate_arranger( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "rbac_rotate_arranger(address)uint64", v - ) - ) - return self - - def rbac_set_op_daemon( - self, - args: tuple[str] | RbacSetOpDaemonArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> "MockRbacModuleComposer": - self._composer.add_app_call_method_call( - self.client.params.rbac_set_op_daemon( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "rbac_set_op_daemon(address)uint64", v - ) - ) - return self - - def rbac_assign_role( - self, - args: tuple[int, str, bytes | str] | RbacAssignRoleArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> "MockRbacModuleComposer": - self._composer.add_app_call_method_call( - self.client.params.rbac_assign_role( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "rbac_assign_role(uint8,address,byte[])uint64", v - ) - ) - return self - - def rbac_revoke_role( - self, - args: tuple[int, str] | RbacRevokeRoleArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> "MockRbacModuleComposer": - self._composer.add_app_call_method_call( - self.client.params.rbac_revoke_role( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "rbac_revoke_role(uint8,address)uint64", v - ) - ) - return self - - def rbac_gov_asset_suspension( - self, - args: tuple[bool] | RbacGovAssetSuspensionArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> "MockRbacModuleComposer": - self._composer.add_app_call_method_call( - self.client.params.rbac_gov_asset_suspension( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "rbac_gov_asset_suspension(bool)uint64", v - ) - ) - return self - - def rbac_get_arranger( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> "MockRbacModuleComposer": - self._composer.add_app_call_method_call( - self.client.params.rbac_get_arranger( - - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "rbac_get_arranger()address", v - ) - ) - return self - - def rbac_get_address_roles( - self, - args: tuple[str] | RbacGetAddressRolesArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> "MockRbacModuleComposer": - self._composer.add_app_call_method_call( - self.client.params.rbac_get_address_roles( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", v - ) - ) - return self - - def rbac_get_role_config( - self, - args: tuple[int, str] | RbacGetRoleConfigArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> "MockRbacModuleComposer": - self._composer.add_app_call_method_call( - self.client.params.rbac_get_role_config( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "rbac_get_role_config(uint8,address)(uint64,uint64)", v - ) - ) - return self - - def clear_state( - self, - *, - args: list[bytes] | None = None, - params: algokit_utils.CommonAppCallParams | None = None, - ) -> "MockRbacModuleComposer": - params=params or algokit_utils.CommonAppCallParams() - self._composer.add_app_call( - self.client.params.clear_state( - algokit_utils.AppClientBareCallParams( - **{ - **dataclasses.asdict(params), - "args": args - } - ) - ) - ) - return self - - def add_transaction( - self, txn: Transaction, signer: TransactionSigner | None = None - ) -> "MockRbacModuleComposer": - self._composer.add_transaction(txn, signer) - return self - - def composer(self) -> algokit_utils.TransactionComposer: - return self._composer - - def simulate( - self, - allow_more_logs: bool | None = None, - allow_empty_signatures: bool | None = None, - allow_unnamed_resources: bool | None = None, - extra_opcode_budget: int | None = None, - exec_trace_config: SimulateTraceConfig | None = None, - simulation_round: int | None = None, - skip_signatures: bool | None = None, - ) -> algokit_utils.SendAtomicTransactionComposerResults: - return self._composer.simulate( - allow_more_logs=allow_more_logs, - allow_empty_signatures=allow_empty_signatures, - allow_unnamed_resources=allow_unnamed_resources, - extra_opcode_budget=extra_opcode_budget, - exec_trace_config=exec_trace_config, - simulation_round=simulation_round, - skip_signatures=skip_signatures, - ) - - def send( - self, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAtomicTransactionComposerResults: - return self._composer.send(send_params) diff --git a/smart_contracts/artifacts/perpetual_bond/PerpetualBond.approval.puya.map b/smart_contracts/artifacts/perpetual_bond/PerpetualBond.approval.puya.map deleted file mode 100644 index 6424533d..00000000 --- a/smart_contracts/artifacts/perpetual_bond/PerpetualBond.approval.puya.map +++ /dev/null @@ -1,35014 +0,0 @@ -{ - "version": 3, - "sources": [ - "../../../modules/accounting.py", - "../../../modules/actus/pbn.py", - "../../../modules/core_financial/common.py", - "../../../modules/core_financial/coupon.py", - "../../../modules/payment_agent/common.py", - "../../../modules/payment_agent/coupon.py", - "../../../modules/rbac.py", - "../../../modules/transfer_agent/coupon.py", - "../../perpetual_bond/contract.py" - ], - "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AM8BmD;;AAAf;;AAA5B;AAC4C;;AAAf;;AAA7B;AAgBA;;AAAuB;AAAvB;AACA;;AAAuB;AAAvB;AN9BA;;AAAmB;AAAnB;AACA;;AAAyB;AAAzB;AACA;;AAAkB;AAAlB;AACA;AAAc;AAAd;AEUA;;AAA6B;AAA7B;AACA;;AAA2B;AAA3B;AACA;;AAAkB;AAAlB;AACA;;AAA4B;AAA5B;AAGA;;AAAgB;;AAAhB;AAGA;;AAA0B;AAA1B;AACA;;AAAqB;AAArB;AACA;;AAAqB;AAArB;AAIA;;AAAyC;AAAzC;AACA;;AAAyC;AAAzC;AACA;AAAqB;AAArB;AACA;;AAAqC;AAArC;AACA;;AAAqC;AAArC;AACA;;AAAqB;AAArB;AC5BA;;AAAyB;AAAzB;AAyTA;;AAAqB;AAArB;AKlTO;;AAA6B;;AAA7B;AAAP;AACO;;AAAuB;;AAAvB;AAAP;AACO;;AAAA;AAAP;AACO;;AAAA;AAAP;AAnBR;;;;;;AAAA;;;AAAA;;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;;;;;;AAAA;;;AAAA;;;;AAAA;ANwQK;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;;;;ADvPA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;ACmMG;;;AACO;AAAA;AAAA;AAAA;AAAA;AAAP;AA5KmB;;AAAA;;AAAA;;AACnB;AAGA;;AAAA;;AAAA;AAKI;;AAAA;;AAAA;AADJ;AAKA;;AAAA;;AAAA;AAEA;AAIQ;;AAFW;;AACF;;;;;;;;;AAHjB;;;;;;AAAA;AAwKO;;AAAA;;AAAA;AAAA;AAAP;AACA;;AAAA;;AAAA;AACmB;;AAAA;;AAAA;AAAnB;;AAAA;AAAA;AACA;;AAAA;;AAAA;AAGiC;AAAA;AArK1B;;;AAAA;AAEH;;;AAFG;AAAA;;;;AAAP;AAMA;;AAAA;;AAAA;AAmK0B;;AAAA;AAAA;;AA/JnB;AAAA;;AAAA;AAAA;AAAf;;;AACY;;AAAA;AAGJ;;AAAA;;AAAA;AAGO;;AAAA;AAAA;AAAP;AAGA;;AAAA;;AAAA;ADlF+C;;AAArB;AAAtB;;AAAA;AADJ;ACiPA;;AAAA;;;AD5OA;;AAAA;;AAAA;;AAAA;;AAAA;AACyC;;;AAAA;AAAzC;;AAAA;AAAA;AAGyC;;;AAAA;AAAzC;;AAAA;AAAA;;;AAGqB;AAArB;AAAA;AAAA;AACA;;AAAqB;AAArB;AEuTO;;AAAuB;AAAvB;AAAP;AACyB;;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEzB;AAAA;AACO;AAAP;AAGA;;AAAA;;AAAA;;AAAA;AAAA;AACqB;;AAAA;;;;AAAA;AAAA;AAAA;AAArB;;AAAA;AAAA;ADpFA;AAAc;;AAAd;ADzOH;AAAA;;;;;AAyDA;;;AAAA;AAAA;AAAA;;AAAA;AAAA;AKT+B;;AAAsB;;AAA3C;;;AAAP;AL2BA;;;AACA;;;AACc;;;AACP;;;AAAP;AAGqB;AAArB;;AAAA;AAAA;AACO;;AAzBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;AEwUA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBO;AAAA;;AAAA;AAAA;AAAA;;;AACI;;AAA2B;AAAA;;AAAA;AAAA;AAA3B;AADJ;;;;AADJ;AHtZ0B;AAAnB;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAP;AG2ZO;AAAA;;;AAAa;;AAAA;AAAA;AAAA;AAAA;AAAT;;AAAA;AAAJ;;;;AAAP;AAG8B;;AAAA;AAAA;;AAAA;;;AAAA;;AAEX;AAAnB;;AACY;AAAZ;;AACc;AAAd;;AAGc;;;AAAA;AAAA;;AACd;AAAA;;AAAA;;;AACG;;;AAAX;;;AAC+B;;AAAA;AAAA;;;AACA;;AAAA;;AAAA;;AAAA;;;AAAA;;AAGP;AAAA;AAAA;AAAA;;AACE;AAAA;AAAA;;AAKG;;AAAA;AAAA;;AAAA;AAAA;AAHd;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AA7CV;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;;;AAsDA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AHxb6B;AAAnB;;AAAA;AAAA;AAAA;;AAAP;AGwcI;;;AACE;AAAA;;AAAA;AAAA;AADF;AAEG;;AAFH;AAIG;AAEO;AAFP;AAAA;AApBV;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;AH9bU;AAAA;AAAA;AAAA;AAAe;;AAAf;AGgeO;;;AAAA;;;;;AAxIc;;AAAA;AAAc;AAAd;AAArB;;;AAAA;;AA0IgB;AAAA;;;AAAA;;AACX;AAAZ;;AACc;AAAd;;AACG;;;AAAX;;;AAC+B;;AAAA;;;AACP;AAAA;AAAA;AAAA;;AACE;AAAA;AAAA;;AAEA;AAAA;;AAAA;AAAA;AAGG;;AAAA;AAAA;;AAAA;AAAA;AAJd;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAlBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAS0E;;;;;;AA4BxD;;AH5fR;AAAA;AAAA;AAAA;AAAe;;AAAf;AG6ff;;;AAC2B;;AAAA;AAAA;AAAA;;AAAA;AAVtB;AAAA;;AAAA;AAAA;AAAA;AAAA;AE/eA;;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;ALLU;AAAA;AAAA;AAAA;AAAe;;AAAf;AGcP;AACA;;;AACA;;;AHV0B;AAAnB;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAP;AGaQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AACR;AAEc;;;AACS;AAAA;AAAA;AAAA;;AAAA;AAChB;AAAA;;AAAA;AAAP;AAEO;;;AAAP;AA2WI;;;AAxCsB;AAAA;;AAAA;AAAA;AAAnB;AAAyC;;AAAzC;ACzWJ;AAAA;;AAAA;AAAA;AAAwB;;AAAxB;AAAX;;;AAEgB;;AAAc;AAAA;;AAAA;AAAA;AAAd;AAAA;;;AACG;;AAAA;;AAAA;AADH;;;AAEG;;AAAc;;AAAA;AAAA;AAAA;;;AAAd;AAFH;;;;AADJ;AAQA;;AAAA;AAAA;AAAA;;;AACI;AAAA;;AAAA;AAAA;AADJ;;AAAA;;AAAA;;;AAGQ;;AAAA;AAAA;AAAA;;;AAAA;AAAJ;;;;ACgChB;;;AD3B6C;;AAAjC;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AADJ;ACgCa;;AAAA;AAAA;AAAA;;;AD1Bb;AAIQ;;;;;;;;;;;;AAJR;;;;;;AAAA;AD4BA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAA8C;AAA9C;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AE/CoB;;AAGP;;AAEO;AAAA;;AAAA;AAAA;AACE;AAAA;;AAAA;AACA;AAAA;;AAAA;AAAA;AAAyB;AAAA;;AAAA;AAAA;AAAzB;AARlB;;AAAA;AAAA;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAA;AAAA;;;;AAAA;AAAA;;AAAA;AAAA;AASqB;;AATrB;AAUoB;AAVpB;AAAA;AAAA;;;;;;AAAA;AAAA;AAAA;AADJ;;;;;;AAAA;AAAA;AAAA;AAuDc;;AAFP;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;;;;AAAA;AAAA;AAAA;AAtCV;AAAA;AAAA;AAAA;AAAA;AAAA;AAkCwB;AAAjB;;;;;;;;;;;;;;;;;;;AEvDP;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;APgBU;AAAA;AAAA;AAAA;AAAe;;AAAf;AEgIH;;;AACI;AAAA;;AAAA;AAAA;AAAsC;;AAAtC;AADJ;;;AAGQ;AAAA;;AAAA;AAAA;AAAJ;;;AACG;;AAA0B;AAAA;;AAAA;AAAA;AAA1B;AADH;;;;AAJR;AAmBO;;AAAA;;AAAA;AAAA;;AAAA;AAAP;AACA;;;AACA;;;AF9I0B;AAAnB;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAP;AAA0B;AAAnB;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAP;AEiJA;;AAAA;;;AACA;;AAAA;;;AAaO;;AAAA;;AAAA;AAAP;AACA;;AAAA;AAAA;AACgB;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAT;;AAAA;AAAP;AFjIoB;;;AAAA;;AACjB;AAAA;AAAA;AAAA;AAAX;;;AANY;;AAAA;AAAA;AAAA;;AAAA;AAAmC;;AAAA;AAAA;AAAA;;AAAA;AAAnC;AAAA;;;AACI;;AAAA;AAAA;AAAA;;AAAA;AAAqC;;AAAA;AAAA;AAAA;;AAAA;AAArC;AADJ;;;;AADJ;AOVoB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AJuBN;;;AACd;;AAAA;AAAA;;AAAA;;AAAA;;;AACO;AAAA;;AAAA;AAAA;;AAAA;;AAAA;;;AAAA;;AHDS;;AAAA;AAAA;AAAA;AAAA;AAAT;AAAA;AAAP;AACA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AApBG;AAAA;AAAA;AAAA;AAAX;;;AACuD;AAA3C;AAAA;;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AACA;;AAAA;AAAA;AAsBJ;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AOvBO;;AAAA;AAAA;;AAAA;AA5CV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;AP0DO;;AAAA;AAAA;;AAAA;;AAAA;AACsC;;AAAA;AAAA;AAAA;;;AAAtC;;AAAA;AAAA;;;;;;;;AEuMP;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AASG;;AAAA;;AAAA;AACA;;AAAA;AAAA;AAVH;AAAA;AAYA;;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAQG;;;AACA;;AAAA;AAAA;AATH;AAAA;;AAWA;;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAqBG;;;AF3RO;AAAA;AAAA;AAAA;AAAe;;AAAf;AE4RA;AAAP;AACA;;;AAEA;AAAA;AACyC;AAAtC;AAAX;;;AACY;AAAA;;;AAAA;;AAGA;AAAA;AAAA;AAAA;AACG;;AAAA;AAAA;;;AAAA;;;;AAAA;AADH;AAAA;;AAAA;AADJ;AAIA;;AAAA;AAAA;AAGG;AAAA;;AAAA;AAAA;AAAX;;;AAEgB;AAAA;;AAAA;AAAA;AACgC;;AAAA;AAAA;AAA7B;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AADH;AAAA;;AAAA;AADJ;AAIA;;AAAA;AAAA;AAI8B;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAF3B;AAAA;AAAA;AAAA;AAAA;AA5CV;AAAA;AAAA;AAAA;AAAA;AAAA;AAiDA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AIzQ+B;;AAAc;;AAAnC;;;AAAP;AJsRA;;AAAA;AAAA;AACO;;AAdV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAgBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AF1UU;AAAA;AAAA;AAAA;AAAe;;AAAf;AEwHH;;;AACI;AAAA;;AAAA;AAAA;AACD;;AAAA;AAAA;;AADC;AAAA;;;AAEF;AAAA;;AAAA;AAAA;AADC;;AAAA;AADC;;;;AAFR;AIzE4B;;AAAqB;;AAA1C;;;AAAP;ANxC0B;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AEgWA;;;AACA;;;AACA;;AAAA;AAAA;AACO;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAkC;AAAA;;AAAA;AAAA;AAAlC;;AAAA;AAAP;AAEA;;AAAA;;AAAA;AACA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAC2C;AAAA;;AAAA;AAAA;AAA3C;AAAA;;AAAA;;AAAA;;AAAA;AACO;AAAA;;AAAA;AAAA;AAAA;AAAA;AApCV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;AAgDiB;AACX;;AAA0B;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAA1B;AAAA;;;AAAA;AAAA;;;AACe;;AAAd;;AAED;AAAA;;AAAA;AAAA;AAAX;;;AAC0B;;AAAd;;AAGsB;AAAA;;AAAA;AAAA;AACF;AAAA;;AAAA;AAAA;AF/WjB;AAAA;;AAAA;AAAA;AAAyB;AAAA;;AAAA;AAAA;AAAzB;AAAA;AEkX6B;AAAA;;AAAA;AAAA;AAAX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AACU;AAAA;;AAAA;AAAA;AAAZ;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AACO;AAAA;;AAAA;AAAA;AAAZ;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AACD;AAAA;;AAAA;AAAA;AAEqB;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AACpB;AAAA;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AACJ;AAAA;;AAAA;AAAA;AACE;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAfT;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAjBV;AAAA;AAAA;AAAA;AAAA;AAAA;AA2CiB;;AF3ZP;AAAA;AAAA;AAAA;AAAe;;AAAf;AE4Zf;;;AAC0B;;AAAA;AAAA;AAAA;;AAAA;AAVrB;AAAA;;AAAA;AAAA;AAAA;AAAA;AAsBQ;AAAA;;AAAA;AAAA;AAAoC;AAAA;;AAAA;AAAA;AADlC;AAAA;AAAA;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AARV;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBuC;AAAA;;AAAA;AAAA;AATvC;AAAA;AAAA;AAAA;AAAA;AAAA;AFvWA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AMjB+B;;AAAgB;;AAArC;;;AAAP;AN9C0B;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAmFA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AACO;;AArBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AMjD+B;;AAAsB;;AAA3C;;;AAAP;ANxCO;AAAA;AAAA;AAAA;AAAe;;AAAf;AA+GA;AAAP;AACA;;;AACA;;;AAC8B;AAAvB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AAIU;AAFsB;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAhC;AAOO;;AAlCV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoCA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AMrF+B;;AAAsB;;AAA3C;;;AAAP;ANuGA;;;AA5I0B;AAAnB;AAAA;AAAA;AAAA;AAAA;;AAAP;AA+Ie;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AACf;;AACA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAhIR;;;AACY;AAAc;;AAAd;AAiIiB;;AAzBxB;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAoBU;;AAAA;;AAAA;AAAP;AACA;;;AACA;;;AA3K0B;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AA6KA;AAAA;;AAAA;AACO;;AAzBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAhL6B;AAAnB;AAAA;AAAA;AAAA;AAAA;;AAAP;AA+LO;AAAA;AAfV;AAAA;AAAA;AAAA;AAAA;AAAA;AM5DA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAWG;;;AACA;;AAAA;AAAA;AACO;;AAbV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAeA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAWG;;;AACA;;AAAA;AAAA;AACO;;AAbV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAeA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAsBG;;;AACA;;;AACwB;AAAA;;AAAxB;;;AApGc;;AAAX;AAAX;;;AACY;;AAAA;;AAAA;AAqGG;;AA1BV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAxEM;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AA+FJ;;;AA7FG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AA2FJ;;;AAzFG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAuFJ;;;AArFG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAmFJ;;;AAjFG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;;;;AAkFP;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAmBG;;;AACA;;;AACwB;AAAA;;AAAxB;;;AApGO;AAAW;;AAAX;AAAP;AACc;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAmGG;;AAvBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA1EM;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AA8FJ;;;AA5FG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AA0FJ;;;AAxFG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAsFJ;;;AApFG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;;;;AAqFP;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAzJ+B;;AAAgB;;AAArC;;;AAAP;AAyKA;;AAAA;AAAA;AACO;;AAjBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BU;AAAA;;AAAA;AAAA;AARV;AAAA;AAAA;AAAA;AAAA;AAAA;AAUA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAc4B;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AAlBP;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAcU;AACP;AAAA;;;AAES;;;;;;;;AADT;;AAAA;;;;;;;;;;;;;;AA+BQ;AAJI;;AA5QL;;AAAA;AAAA;AAAA;AAAA;;AA2QC;AAGO;AAAA;AA7ClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAsCe;;AAvQL;;AAAA;AAAA;AAAA;AAAA;;AAsQC;AAGO;AAAA;AAxClB;;;AAiCe;;AAlQL;;AAAA;AAAA;AAAA;AAAA;;AAiQC;AAGO;AAAA;AAnClB;;;AA4Be;;AA7PL;;AAAA;AAAA;AAAA;AAAA;;AA4PC;AAGO;AAAA;AA9BlB;;;AAuBe;;AAxPL;;AAAA;AAAA;AAAA;AAAA;;AAuPC;AAGO;AAAA;AAzBlB;;;AAkBkB;;;;;;;;;;;;;;;;;;AAlBlB;;;AHuED;;;AACkB;AACD;;AAAA;AACG;AAAA;AAAA;AAAA;AAAb;AAAX;;;AACwC;AAAA;AAAA;AAAA;AAAb;;AAAA;AAAA;AAAoC;AAAA;;AAAA;AAAA;AAArC;AAAA;;AAElB;AAEJ;;;AACW;AAAA;AAAA;AAAA;AAA8B;AAAA;;AAAA;AAAA;AAAT;;AAAA;AAArB;AAAP;AAgBJ;;;;;;AAEJ;;AAAA;;;AACkC;AAAA;AAAA;AAAA;AAGF;;AAAA;AAAA;AAAA;;AACR;AAAA;;AAAA;AAAA;AACb;AAAA;;AAAA;AAAA;AAAX;;;AD9Ne;;AAAe;;AAAf;AAAA;;AAAe;;AAAf;ACiOA;;AAAA;AAAA;AAAA;AAAA;AAAP;;AAAA;AAxBkB;AAAlB;;AACR;;AAAA;;;AAC8B;;AAAA;;;AAAA;;;;;;;AA2B1B;;;AACW;AAAA;AAAA;AAAA;AAAA;;;AAA4B;;AAA0B;AAAA;AAAA;AAAA;AAA1B;AAA5B;;;;AAAP;;AAAA;AAEJ;;;AAII;;AAAA;;AAAA;;;AACmB;;AAAA;;;AACK;AAAA;AAAA;AACR;AAAA;AAAA;AAEZ;;AAAA;;AAAA;;;AACE;AAAA;;AAAA;AAAA;AADF;AAAA;;AAAA;AAGI;;AAAA;;AAAA;AAHJ;AADJ;AAzXJ;;;AACW;AAAA;;AAAA;AAAA;AAA0B;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAA1B;AAAP;AAEJ;;;AAIQ;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AADJ;;AD2EJ;;;;;;;AAEQ;;AAAA;;;AAAA;;;;AAAA;AACE;;AADF;AADJ;AAIkB;;AAAA;AAAA;AAAqB;AAArB;AAAP;AAAnB;;AAAA;;AAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKqB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AACkB;AAAN;AAAA;AAAA;;AAAZ;AAAA;AAAA;AAAA;AAAA;;AACF;AAAP;AACG;AAAA;;AAAA;AAAA;AAA6B;;;AAA7B;AAAf;;;AAEwB;;AAAA;;AAAA;AAAmB;;AAApB;AAAA;AAAP;;;;;;;;;;;;;AFzFZ;;;AACe;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAJ;AAAP;;AAEJ;;;AACmB;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAR;;AAAA;AAAP;AAEJ;;;AAEyB;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AADd;;AAAA;AAAA;;;AAAP;AMiBJ;;;;;AAFW;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAGA;;;AACH;;AAAA;AAAA;AAAA;AAAA;AACG;;AAAA;AAAA;;AADH;AAAA;;;AAEG;;AAAA;AAAA;AAAA;AAAA;AADA;;AAAA;AADH;;;;AADJ;;AAAA;;;;;AAOyB;;AAbF;AAAA;;AAAA;AAAA;AAAhB;AAaP;;AAkBW;AAAA;;AAAA;AAAA;AAAJ;AAAP;;AAGW;AAAA;;AAAA;AAAA;AAAJ;AAAP;;AAEJ;;;AACW;;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;AAAA;;AAMH;;AANG;AAAA;;;;AAAP;;;", - "op_pc_offset": 0, - "pc_events": { - "1": { - "subroutine": "algopy.arc4.ARC4Contract.approval_program", - "params": {}, - "block": "main", - "stack_in": [], - "op": "intcblock 0 1 32 8 10000 200 86400" - }, - "14": { - "op": "bytecblock 0x151f7c75 0x52333023 \"status\" \"issuance_date\" \"circulating_units\" \"interest_rate\" 0x52323023 \"unit_value\" \"primary_distribution_opening_date\" \"secondary_market_closure_date\" \"maturity_date\" 0x52373023 0x52343023 \"total_units\" \"settlement_asset_id\" \"day_count_convention\" \"secondary_market_opening_date\" \"coupon_period\" 0x52383023 0x52363023 0x52353023 0x52323523 \"asset_suspended\" \"asset_defaulted\" \"denomination_asset_id\" \"metadata\" \"principal_discount\" \"primary_distribution_closure_date\" \"paid_coupon_units\" 0x74696d65506572696f6473 0x00 \"total_coupons\" 0x74696d654576656e7473 0x0000 0x068101" - }, - "480": { - "op": "txn ApplicationID", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "482": { - "op": "bnz main_after_if_else@2", - "stack_out": [] - }, - "485": { - "op": "bytec 6 // 0x52323023", - "defined_out": [ - "0x52323023" - ], - "stack_out": [ - "0x52323023" - ] - }, - "487": { - "op": "global ZeroAddress", - "defined_out": [ - "0x52323023", - "tmp%0#3" - ], - "stack_out": [ - "0x52323023", - "tmp%0#3" - ] - }, - "489": { - "op": "app_global_put", - "stack_out": [] - }, - "490": { - "op": "bytec 21 // 0x52323523", - "defined_out": [ - "0x52323523" - ], - "stack_out": [ - "0x52323523" - ] - }, - "492": { - "op": "global ZeroAddress", - "defined_out": [ - "0x52323523", - "tmp%1#3" - ], - "stack_out": [ - "0x52323523", - "tmp%1#3" - ] - }, - "494": { - "op": "app_global_put", - "stack_out": [] - }, - "495": { - "op": "bytec 22 // \"asset_suspended\"", - "defined_out": [ - "\"asset_suspended\"" - ], - "stack_out": [ - "\"asset_suspended\"" - ] - }, - "497": { - "op": "intc_0 // 0", - "defined_out": [ - "\"asset_suspended\"", - "0" - ], - "stack_out": [ - "\"asset_suspended\"", - "0" - ] - }, - "498": { - "op": "app_global_put", - "stack_out": [] - }, - "499": { - "op": "bytec 23 // \"asset_defaulted\"", - "defined_out": [ - "\"asset_defaulted\"" - ], - "stack_out": [ - "\"asset_defaulted\"" - ] - }, - "501": { - "op": "intc_0 // 0", - "stack_out": [ - "\"asset_defaulted\"", - "0" - ] - }, - "502": { - "op": "app_global_put", - "stack_out": [] - }, - "503": { - "op": "bytec 13 // \"total_units\"", - "defined_out": [ - "\"total_units\"" - ], - "stack_out": [ - "\"total_units\"" - ] - }, - "505": { - "op": "intc_0 // 0", - "stack_out": [ - "\"total_units\"", - "0" - ] - }, - "506": { - "op": "app_global_put", - "stack_out": [] - }, - "507": { - "op": "bytec 4 // \"circulating_units\"", - "defined_out": [ - "\"circulating_units\"" - ], - "stack_out": [ - "\"circulating_units\"" - ] - }, - "509": { - "op": "intc_0 // 0", - "stack_out": [ - "\"circulating_units\"", - "0" - ] - }, - "510": { - "op": "app_global_put", - "stack_out": [] - }, - "511": { - "op": "bytec 7 // \"unit_value\"", - "defined_out": [ - "\"unit_value\"" - ], - "stack_out": [ - "\"unit_value\"" - ] - }, - "513": { - "op": "intc_0 // 0", - "stack_out": [ - "\"unit_value\"", - "0" - ] - }, - "514": { - "op": "app_global_put", - "stack_out": [] - }, - "515": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"" - ], - "stack_out": [ - "\"status\"" - ] - }, - "516": { - "op": "intc_0 // 0", - "stack_out": [ - "\"status\"", - "0" - ] - }, - "517": { - "op": "app_global_put", - "stack_out": [] - }, - "518": { - "op": "bytec 24 // \"denomination_asset_id\"", - "defined_out": [ - "\"denomination_asset_id\"" - ], - "stack_out": [ - "\"denomination_asset_id\"" - ] - }, - "520": { - "op": "intc_0 // 0", - "stack_out": [ - "\"denomination_asset_id\"", - "0" - ] - }, - "521": { - "op": "app_global_put", - "stack_out": [] - }, - "522": { - "op": "bytec 14 // \"settlement_asset_id\"", - "defined_out": [ - "\"settlement_asset_id\"" - ], - "stack_out": [ - "\"settlement_asset_id\"" - ] - }, - "524": { - "op": "intc_0 // 0", - "stack_out": [ - "\"settlement_asset_id\"", - "0" - ] - }, - "525": { - "op": "app_global_put", - "stack_out": [] - }, - "526": { - "op": "bytec 7 // \"unit_value\"", - "stack_out": [ - "\"unit_value\"" - ] - }, - "528": { - "op": "intc_0 // 0", - "stack_out": [ - "\"unit_value\"", - "0" - ] - }, - "529": { - "op": "app_global_put", - "stack_out": [] - }, - "530": { - "op": "bytec 15 // \"day_count_convention\"", - "defined_out": [ - "\"day_count_convention\"" - ], - "stack_out": [ - "\"day_count_convention\"" - ] - }, - "532": { - "op": "intc_0 // 0", - "stack_out": [ - "\"day_count_convention\"", - "0" - ] - }, - "533": { - "op": "app_global_put", - "stack_out": [] - }, - "534": { - "op": "bytec 25 // \"metadata\"", - "defined_out": [ - "\"metadata\"" - ], - "stack_out": [ - "\"metadata\"" - ] - }, - "536": { - "op": "pushbytes 0x", - "defined_out": [ - "\"metadata\"", - "0x" - ], - "stack_out": [ - "\"metadata\"", - "0x" - ] - }, - "538": { - "op": "app_global_put", - "stack_out": [] - }, - "539": { - "op": "bytec 26 // \"principal_discount\"", - "defined_out": [ - "\"principal_discount\"" - ], - "stack_out": [ - "\"principal_discount\"" - ] - }, - "541": { - "op": "intc_0 // 0", - "stack_out": [ - "\"principal_discount\"", - "0" - ] - }, - "542": { - "op": "app_global_put", - "stack_out": [] - }, - "543": { - "op": "bytec 5 // \"interest_rate\"", - "defined_out": [ - "\"interest_rate\"" - ], - "stack_out": [ - "\"interest_rate\"" - ] - }, - "545": { - "op": "intc_0 // 0", - "stack_out": [ - "\"interest_rate\"", - "0" - ] - }, - "546": { - "op": "app_global_put", - "stack_out": [] - }, - "547": { - "op": "bytec 31 // \"total_coupons\"", - "defined_out": [ - "\"total_coupons\"" - ], - "stack_out": [ - "\"total_coupons\"" - ] - }, - "549": { - "op": "intc_0 // 0", - "stack_out": [ - "\"total_coupons\"", - "0" - ] - }, - "550": { - "op": "app_global_put", - "stack_out": [] - }, - "551": { - "op": "bytec 8 // \"primary_distribution_opening_date\"", - "defined_out": [ - "\"primary_distribution_opening_date\"" - ], - "stack_out": [ - "\"primary_distribution_opening_date\"" - ] - }, - "553": { - "op": "intc_0 // 0", - "stack_out": [ - "\"primary_distribution_opening_date\"", - "0" - ] - }, - "554": { - "op": "app_global_put", - "stack_out": [] - }, - "555": { - "op": "bytec 27 // \"primary_distribution_closure_date\"", - "defined_out": [ - "\"primary_distribution_closure_date\"" - ], - "stack_out": [ - "\"primary_distribution_closure_date\"" - ] - }, - "557": { - "op": "intc_0 // 0", - "stack_out": [ - "\"primary_distribution_closure_date\"", - "0" - ] - }, - "558": { - "op": "app_global_put", - "stack_out": [] - }, - "559": { - "op": "bytec_3 // \"issuance_date\"", - "defined_out": [ - "\"issuance_date\"" - ], - "stack_out": [ - "\"issuance_date\"" - ] - }, - "560": { - "op": "intc_0 // 0", - "stack_out": [ - "\"issuance_date\"", - "0" - ] - }, - "561": { - "op": "app_global_put", - "stack_out": [] - }, - "562": { - "op": "bytec 16 // \"secondary_market_opening_date\"", - "defined_out": [ - "\"secondary_market_opening_date\"" - ], - "stack_out": [ - "\"secondary_market_opening_date\"" - ] - }, - "564": { - "op": "intc_0 // 0", - "stack_out": [ - "\"secondary_market_opening_date\"", - "0" - ] - }, - "565": { - "op": "app_global_put", - "stack_out": [] - }, - "566": { - "op": "bytec 9 // \"secondary_market_closure_date\"", - "defined_out": [ - "\"secondary_market_closure_date\"" - ], - "stack_out": [ - "\"secondary_market_closure_date\"" - ] - }, - "568": { - "op": "intc_0 // 0", - "stack_out": [ - "\"secondary_market_closure_date\"", - "0" - ] - }, - "569": { - "op": "app_global_put", - "stack_out": [] - }, - "570": { - "op": "bytec 10 // \"maturity_date\"", - "defined_out": [ - "\"maturity_date\"" - ], - "stack_out": [ - "\"maturity_date\"" - ] - }, - "572": { - "op": "intc_0 // 0", - "stack_out": [ - "\"maturity_date\"", - "0" - ] - }, - "573": { - "op": "app_global_put", - "stack_out": [] - }, - "574": { - "op": "bytec 28 // \"paid_coupon_units\"", - "defined_out": [ - "\"paid_coupon_units\"" - ], - "stack_out": [ - "\"paid_coupon_units\"" - ] - }, - "576": { - "op": "intc_0 // 0", - "stack_out": [ - "\"paid_coupon_units\"", - "0" - ] - }, - "577": { - "op": "app_global_put", - "stack_out": [] - }, - "578": { - "op": "bytec 17 // \"coupon_period\"", - "defined_out": [ - "\"coupon_period\"" - ], - "stack_out": [ - "\"coupon_period\"" - ] - }, - "580": { - "op": "intc_0 // 0", - "stack_out": [ - "\"coupon_period\"", - "0" - ] - }, - "581": { - "op": "app_global_put", - "stack_out": [] - }, - "582": { - "op": "txn GlobalNumByteSlice", - "defined_out": [ - "tmp%0#2" - ], - "stack_out": [ - "tmp%0#2" - ] - }, - "584": { - "op": "pushint 3", - "defined_out": [ - "3", - "tmp%0#2" - ], - "stack_out": [ - "tmp%0#2", - "3" - ] - }, - "586": { - "op": "==", - "defined_out": [ - "tmp%1#2" - ], - "stack_out": [ - "tmp%1#2" - ] - }, - "587": { - "error": "Wrong Global Bytes allocation", - "op": "assert // Wrong Global Bytes allocation", - "stack_out": [] - }, - "588": { - "op": "txn GlobalNumUint", - "defined_out": [ - "tmp%2#1" - ], - "stack_out": [ - "tmp%2#1" - ] - }, - "590": { - "op": "pushint 20", - "defined_out": [ - "20", - "tmp%2#1" - ], - "stack_out": [ - "tmp%2#1", - "20" - ] - }, - "592": { - "op": "==", - "defined_out": [ - "tmp%3#1" - ], - "stack_out": [ - "tmp%3#1" - ] - }, - "593": { - "error": "Wrong Global UInts allocation", - "op": "assert // Wrong Global UInts allocation", - "stack_out": [] - }, - "594": { - "op": "txn LocalNumByteSlice", - "defined_out": [ - "tmp%4#1" - ], - "stack_out": [ - "tmp%4#1" - ] - }, - "596": { - "op": "!", - "defined_out": [ - "tmp%5#0" - ], - "stack_out": [ - "tmp%5#0" - ] - }, - "597": { - "error": "Wrong Local Bytes allocation", - "op": "assert // Wrong Local Bytes allocation", - "stack_out": [] - }, - "598": { - "op": "txn LocalNumUint", - "defined_out": [ - "tmp%6#0" - ], - "stack_out": [ - "tmp%6#0" - ] - }, - "600": { - "op": "!", - "defined_out": [ - "tmp%7#0" - ], - "stack_out": [ - "tmp%7#0" - ] - }, - "601": { - "error": "Wrong Local UInts allocation", - "op": "assert // Wrong Local UInts allocation", - "stack_out": [] - }, - "602": { - "block": "main_after_if_else@2", - "stack_in": [], - "op": "pushbytes 0x25dba95b // method \"asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void\"", - "defined_out": [ - "Method(asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void)" - ], - "stack_out": [ - "Method(asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void)" - ] - }, - "608": { - "op": "txna ApplicationArgs 0", - "defined_out": [ - "Method(asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void)", - "tmp%0#1" - ], - "stack_out": [ - "Method(asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void)", - "tmp%0#1" - ] - }, - "611": { - "op": "match main_asset_update_route@4", - "stack_out": [] - }, - "615": { - "block": "main_switch_case_next@5", - "stack_in": [], - "op": "txn OnCompletion", - "defined_out": [ - "tmp%6#0" - ], - "stack_out": [ - "tmp%6#0" - ] - }, - "617": { - "op": "!", - "defined_out": [ - "tmp%7#0" - ], - "stack_out": [ - "tmp%7#0" - ] - }, - "618": { - "op": "assert", - "stack_out": [] - }, - "619": { - "op": "txn ApplicationID", - "defined_out": [ - "tmp%8#0" - ], - "stack_out": [ - "tmp%8#0" - ] - }, - "621": { - "op": "bz main_create_NoOp@36", - "stack_out": [] - }, - "624": { - "op": "pushbytess 0x89474134 0x9316298d 0x44363d49 0x67db4f20 0xf6a96c8d 0x229b706f 0x8cf14b51 0x4fd6a3cc 0x1d6fc255 0x25e9997f 0x6c85e3ee 0x402dba47 0xfad2173e 0x08efea35 0xe4a5ab54 0xdc063b35 0x14fc10ef 0x4c113ed5 0x74a7297f 0x105c184e 0x82f71b2d 0xef04f5d3 0x03b83329 0x3dbe80bd 0xdf54e82c 0x010c8299 0x7406acd2 0xc3e4b297 // method \"asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void\", method \"update_interest_rate(uint16)uint64\", method \"get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64))\", method \"get_payment_amount(address)(uint64,uint64)\", method \"get_coupons_status()(uint64,uint64,uint64,(uint64,uint64),bool)\", method \"get_time_periods()(uint64,uint64)[]\", method \"pay_coupon(address,byte[])(uint64,uint64,byte[])\", method \"asset_transfer(address,address,uint64)uint64\", method \"set_secondary_time_events(uint64[])(uint64,uint64)\", method \"set_default_status(bool)uint64\", method \"primary_distribution(address,uint64)uint64\", method \"get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)\", method \"get_time_events()uint64[]\", method \"get_secondary_market_schedule()uint64[]\", method \"get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)\", method \"account_gov_suspension(address,bool)uint64\", method \"account_open(address,address)uint64\", method \"account_close(address)(uint64,uint64)\", method \"account_update_payment_address(address,address)uint64\", method \"account_get_info(address)(address,uint64,uint64,uint64,bool)\", method \"rbac_rotate_arranger(address)uint64\", method \"rbac_set_op_daemon(address)uint64\", method \"rbac_assign_role(uint8,address,byte[])uint64\", method \"rbac_revoke_role(uint8,address)uint64\", method \"rbac_gov_asset_suspension(bool)uint64\", method \"rbac_get_arranger()address\", method \"rbac_get_address_roles(address)(bool,bool,bool,bool,bool)\", method \"rbac_get_role_config(uint8,address)(uint64,uint64)\"", - "defined_out": [ - "Method(account_close(address)(uint64,uint64))", - "Method(account_get_info(address)(address,uint64,uint64,uint64,bool))", - "Method(account_gov_suspension(address,bool)uint64)", - "Method(account_open(address,address)uint64)", - "Method(account_update_payment_address(address,address)uint64)", - "Method(asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void)", - "Method(asset_transfer(address,address,uint64)uint64)", - "Method(get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64)))", - "Method(get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8))", - "Method(get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))", - "Method(get_coupons_status()(uint64,uint64,uint64,(uint64,uint64),bool))", - "Method(get_payment_amount(address)(uint64,uint64))", - "Method(get_secondary_market_schedule()uint64[])", - "Method(get_time_events()uint64[])", - "Method(get_time_periods()(uint64,uint64)[])", - "Method(pay_coupon(address,byte[])(uint64,uint64,byte[]))", - "Method(primary_distribution(address,uint64)uint64)", - "Method(rbac_assign_role(uint8,address,byte[])uint64)", - "Method(rbac_get_address_roles(address)(bool,bool,bool,bool,bool))", - "Method(rbac_get_arranger()address)", - "Method(rbac_get_role_config(uint8,address)(uint64,uint64))", - "Method(rbac_gov_asset_suspension(bool)uint64)", - "Method(rbac_revoke_role(uint8,address)uint64)", - "Method(rbac_rotate_arranger(address)uint64)", - "Method(rbac_set_op_daemon(address)uint64)", - "Method(set_default_status(bool)uint64)", - "Method(set_secondary_time_events(uint64[])(uint64,uint64))", - "Method(update_interest_rate(uint16)uint64)" - ], - "stack_out": [ - "Method(asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void)", - "Method(update_interest_rate(uint16)uint64)", - "Method(get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64)))", - "Method(get_payment_amount(address)(uint64,uint64))", - "Method(get_coupons_status()(uint64,uint64,uint64,(uint64,uint64),bool))", - "Method(get_time_periods()(uint64,uint64)[])", - "Method(pay_coupon(address,byte[])(uint64,uint64,byte[]))", - "Method(asset_transfer(address,address,uint64)uint64)", - "Method(set_secondary_time_events(uint64[])(uint64,uint64))", - "Method(set_default_status(bool)uint64)", - "Method(primary_distribution(address,uint64)uint64)", - "Method(get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8))", - "Method(get_time_events()uint64[])", - "Method(get_secondary_market_schedule()uint64[])", - "Method(get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))", - "Method(account_gov_suspension(address,bool)uint64)", - "Method(account_open(address,address)uint64)", - "Method(account_close(address)(uint64,uint64))", - "Method(account_update_payment_address(address,address)uint64)", - "Method(account_get_info(address)(address,uint64,uint64,uint64,bool))", - "Method(rbac_rotate_arranger(address)uint64)", - "Method(rbac_set_op_daemon(address)uint64)", - "Method(rbac_assign_role(uint8,address,byte[])uint64)", - "Method(rbac_revoke_role(uint8,address)uint64)", - "Method(rbac_gov_asset_suspension(bool)uint64)", - "Method(rbac_get_arranger()address)", - "Method(rbac_get_address_roles(address)(bool,bool,bool,bool,bool))", - "Method(rbac_get_role_config(uint8,address)(uint64,uint64))" - ] - }, - "766": { - "op": "txna ApplicationArgs 0", - "defined_out": [ - "Method(account_close(address)(uint64,uint64))", - "Method(account_get_info(address)(address,uint64,uint64,uint64,bool))", - "Method(account_gov_suspension(address,bool)uint64)", - "Method(account_open(address,address)uint64)", - "Method(account_update_payment_address(address,address)uint64)", - "Method(asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void)", - "Method(asset_transfer(address,address,uint64)uint64)", - "Method(get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64)))", - "Method(get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8))", - "Method(get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))", - "Method(get_coupons_status()(uint64,uint64,uint64,(uint64,uint64),bool))", - "Method(get_payment_amount(address)(uint64,uint64))", - "Method(get_secondary_market_schedule()uint64[])", - "Method(get_time_events()uint64[])", - "Method(get_time_periods()(uint64,uint64)[])", - "Method(pay_coupon(address,byte[])(uint64,uint64,byte[]))", - "Method(primary_distribution(address,uint64)uint64)", - "Method(rbac_assign_role(uint8,address,byte[])uint64)", - "Method(rbac_get_address_roles(address)(bool,bool,bool,bool,bool))", - "Method(rbac_get_arranger()address)", - "Method(rbac_get_role_config(uint8,address)(uint64,uint64))", - "Method(rbac_gov_asset_suspension(bool)uint64)", - "Method(rbac_revoke_role(uint8,address)uint64)", - "Method(rbac_rotate_arranger(address)uint64)", - "Method(rbac_set_op_daemon(address)uint64)", - "Method(set_default_status(bool)uint64)", - "Method(set_secondary_time_events(uint64[])(uint64,uint64))", - "Method(update_interest_rate(uint16)uint64)", - "tmp%10#0" - ], - "stack_out": [ - "Method(asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void)", - "Method(update_interest_rate(uint16)uint64)", - "Method(get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64)))", - "Method(get_payment_amount(address)(uint64,uint64))", - "Method(get_coupons_status()(uint64,uint64,uint64,(uint64,uint64),bool))", - "Method(get_time_periods()(uint64,uint64)[])", - "Method(pay_coupon(address,byte[])(uint64,uint64,byte[]))", - "Method(asset_transfer(address,address,uint64)uint64)", - "Method(set_secondary_time_events(uint64[])(uint64,uint64))", - "Method(set_default_status(bool)uint64)", - "Method(primary_distribution(address,uint64)uint64)", - "Method(get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8))", - "Method(get_time_events()uint64[])", - "Method(get_secondary_market_schedule()uint64[])", - "Method(get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))", - "Method(account_gov_suspension(address,bool)uint64)", - "Method(account_open(address,address)uint64)", - "Method(account_close(address)(uint64,uint64))", - "Method(account_update_payment_address(address,address)uint64)", - "Method(account_get_info(address)(address,uint64,uint64,uint64,bool))", - "Method(rbac_rotate_arranger(address)uint64)", - "Method(rbac_set_op_daemon(address)uint64)", - "Method(rbac_assign_role(uint8,address,byte[])uint64)", - "Method(rbac_revoke_role(uint8,address)uint64)", - "Method(rbac_gov_asset_suspension(bool)uint64)", - "Method(rbac_get_arranger()address)", - "Method(rbac_get_address_roles(address)(bool,bool,bool,bool,bool))", - "Method(rbac_get_role_config(uint8,address)(uint64,uint64))", - "tmp%10#0" - ] - }, - "769": { - "op": "match asset_config update_interest_rate get_account_units_current_value get_payment_amount get_coupons_status get_time_periods pay_coupon asset_transfer set_secondary_time_events set_default_status primary_distribution get_asset_info get_time_events get_secondary_market_schedule get_asset_metadata account_gov_suspension account_open account_close account_update_payment_address account_get_info rbac_rotate_arranger rbac_set_op_daemon rbac_assign_role rbac_revoke_role rbac_gov_asset_suspension rbac_get_arranger rbac_get_address_roles rbac_get_role_config", - "stack_out": [] - }, - "827": { - "op": "err" - }, - "828": { - "block": "main_create_NoOp@36", - "stack_in": [], - "op": "pushbytes 0x3f0efc6c // method \"asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void\"", - "defined_out": [ - "Method(asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void)" - ], - "stack_out": [ - "Method(asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void)" - ] - }, - "834": { - "op": "txna ApplicationArgs 0", - "defined_out": [ - "Method(asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void)", - "tmp%11#0" - ], - "stack_out": [ - "Method(asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void)", - "tmp%11#0" - ] - }, - "837": { - "op": "match asset_create", - "stack_out": [] - }, - "841": { - "op": "err" - }, - "842": { - "block": "main_asset_update_route@4", - "stack_in": [], - "op": "txn OnCompletion", - "defined_out": [ - "tmp%1#1" - ], - "stack_out": [ - "tmp%1#1" - ] - }, - "844": { - "op": "pushint 4 // UpdateApplication", - "defined_out": [ - "UpdateApplication", - "tmp%1#1" - ], - "stack_out": [ - "tmp%1#1", - "UpdateApplication" - ] - }, - "846": { - "op": "==", - "defined_out": [ - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0" - ] - }, - "847": { - "op": "txn ApplicationID", - "defined_out": [ - "tmp%2#0", - "tmp%3#0" - ], - "stack_out": [ - "tmp%2#0", - "tmp%3#0" - ] - }, - "849": { - "op": "&&", - "defined_out": [ - "tmp%5#0" - ], - "stack_out": [ - "tmp%5#0" - ] - }, - "850": { - "op": "assert", - "stack_out": [] - }, - "851": { - "op": "b asset_update" - }, - "854": { - "subroutine": "modules.actus.pbn.PBNCoreMixin.asset_config[routing]", - "params": {}, - "block": "asset_config", - "stack_in": [], - "op": "pushbytes \"\"", - "stack_out": [ - "interest_rate#2" - ] - }, - "856": { - "op": "txna ApplicationArgs 1", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "interest_rate#2", - "tmp%0#0" - ] - }, - "859": { - "op": "dup", - "defined_out": [ - "tmp%0#0", - "tmp%0#0 (copy)" - ], - "stack_out": [ - "interest_rate#2", - "tmp%0#0", - "tmp%0#0 (copy)" - ] - }, - "860": { - "op": "len", - "defined_out": [ - "len%0#0", - "tmp%0#0" - ], - "stack_out": [ - "interest_rate#2", - "tmp%0#0", - "len%0#0" - ] - }, - "861": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "len%0#0", - "tmp%0#0" - ], - "stack_out": [ - "interest_rate#2", - "tmp%0#0", - "len%0#0", - "8" - ] - }, - "862": { - "op": "==", - "defined_out": [ - "eq%0#0", - "tmp%0#0" - ], - "stack_out": [ - "interest_rate#2", - "tmp%0#0", - "eq%0#0" - ] - }, - "863": { - "error": "invalid number of bytes for arc4.uint64", - "op": "assert // invalid number of bytes for arc4.uint64", - "stack_out": [ - "interest_rate#2", - "tmp%0#0" - ] - }, - "864": { - "op": "btoi", - "defined_out": [ - "denomination_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0" - ] - }, - "865": { - "op": "txna ApplicationArgs 2", - "defined_out": [ - "denomination_asset_id#0", - "tmp%2#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "tmp%2#0" - ] - }, - "868": { - "op": "dup", - "defined_out": [ - "denomination_asset_id#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ] - }, - "869": { - "op": "len", - "defined_out": [ - "denomination_asset_id#0", - "len%1#0", - "tmp%2#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "tmp%2#0", - "len%1#0" - ] - }, - "870": { - "op": "intc_3 // 8", - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "tmp%2#0", - "len%1#0", - "8" - ] - }, - "871": { - "op": "==", - "defined_out": [ - "denomination_asset_id#0", - "eq%1#0", - "tmp%2#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "tmp%2#0", - "eq%1#0" - ] - }, - "872": { - "error": "invalid number of bytes for arc4.uint64", - "op": "assert // invalid number of bytes for arc4.uint64", - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "tmp%2#0" - ] - }, - "873": { - "op": "btoi", - "defined_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0" - ] - }, - "874": { - "op": "txna ApplicationArgs 3", - "defined_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0", - "tmp%4#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "tmp%4#0" - ] - }, - "877": { - "op": "dup", - "defined_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0", - "tmp%4#0", - "tmp%4#0 (copy)" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "tmp%4#0", - "tmp%4#0 (copy)" - ] - }, - "878": { - "op": "len", - "defined_out": [ - "denomination_asset_id#0", - "len%2#0", - "settlement_asset_id#0", - "tmp%4#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "tmp%4#0", - "len%2#0" - ] - }, - "879": { - "op": "intc_3 // 8", - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "tmp%4#0", - "len%2#0", - "8" - ] - }, - "880": { - "op": "==", - "defined_out": [ - "denomination_asset_id#0", - "eq%2#0", - "settlement_asset_id#0", - "tmp%4#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "tmp%4#0", - "eq%2#0" - ] - }, - "881": { - "error": "invalid number of bytes for arc4.uint64", - "op": "assert // invalid number of bytes for arc4.uint64", - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "tmp%4#0" - ] - }, - "882": { - "op": "btoi", - "defined_out": [ - "denomination_asset_id#0", - "principal#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0" - ] - }, - "883": { - "op": "txna ApplicationArgs 4", - "defined_out": [ - "denomination_asset_id#0", - "principal#0", - "settlement_asset_id#0", - "tmp%6#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "tmp%6#0" - ] - }, - "886": { - "op": "dup", - "defined_out": [ - "denomination_asset_id#0", - "principal#0", - "settlement_asset_id#0", - "tmp%6#0", - "tmp%6#0 (copy)" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "tmp%6#0", - "tmp%6#0 (copy)" - ] - }, - "887": { - "op": "len", - "defined_out": [ - "denomination_asset_id#0", - "len%3#0", - "principal#0", - "settlement_asset_id#0", - "tmp%6#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "tmp%6#0", - "len%3#0" - ] - }, - "888": { - "op": "intc_3 // 8", - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "tmp%6#0", - "len%3#0", - "8" - ] - }, - "889": { - "op": "==", - "defined_out": [ - "denomination_asset_id#0", - "eq%3#0", - "principal#0", - "settlement_asset_id#0", - "tmp%6#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "tmp%6#0", - "eq%3#0" - ] - }, - "890": { - "error": "invalid number of bytes for arc4.uint64", - "op": "assert // invalid number of bytes for arc4.uint64", - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "tmp%6#0" - ] - }, - "891": { - "op": "btoi", - "defined_out": [ - "denomination_asset_id#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0" - ] - }, - "892": { - "op": "txna ApplicationArgs 5", - "defined_out": [ - "denomination_asset_id#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "tmp%8#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "tmp%8#0" - ] - }, - "895": { - "op": "dup", - "defined_out": [ - "denomination_asset_id#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "tmp%8#0", - "tmp%8#0 (copy)" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "tmp%8#0", - "tmp%8#0 (copy)" - ] - }, - "896": { - "op": "len", - "defined_out": [ - "denomination_asset_id#0", - "len%4#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "tmp%8#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "tmp%8#0", - "len%4#0" - ] - }, - "897": { - "op": "intc_3 // 8", - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "tmp%8#0", - "len%4#0", - "8" - ] - }, - "898": { - "op": "==", - "defined_out": [ - "denomination_asset_id#0", - "eq%4#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "tmp%8#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "tmp%8#0", - "eq%4#0" - ] - }, - "899": { - "error": "invalid number of bytes for arc4.uint64", - "op": "assert // invalid number of bytes for arc4.uint64", - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "tmp%8#0" - ] - }, - "900": { - "op": "btoi", - "defined_out": [ - "denomination_asset_id#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0" - ] - }, - "901": { - "op": "txna ApplicationArgs 6", - "defined_out": [ - "day_count_convention#0", - "denomination_asset_id#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "904": { - "op": "dup", - "defined_out": [ - "day_count_convention#0", - "day_count_convention#0 (copy)", - "denomination_asset_id#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "day_count_convention#0 (copy)" - ] - }, - "905": { - "op": "len", - "defined_out": [ - "day_count_convention#0", - "denomination_asset_id#0", - "len%5#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "len%5#0" - ] - }, - "906": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "day_count_convention#0", - "denomination_asset_id#0", - "len%5#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "len%5#0", - "1" - ] - }, - "907": { - "op": "==", - "defined_out": [ - "day_count_convention#0", - "denomination_asset_id#0", - "eq%5#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "eq%5#0" - ] - }, - "908": { - "error": "invalid number of bytes for arc4.uint8", - "op": "assert // invalid number of bytes for arc4.uint8", - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "909": { - "op": "txna ApplicationArgs 7" - }, - "912": { - "op": "dup", - "defined_out": [ - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "interest_rate#0", - "interest_rate#0" - ] - }, - "913": { - "op": "cover 7", - "defined_out": [ - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "interest_rate#0" - ] - }, - "915": { - "op": "len", - "defined_out": [ - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "len%6#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "len%6#0" - ] - }, - "916": { - "op": "pushint 2", - "defined_out": [ - "2", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "len%6#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "len%6#0", - "2" - ] - }, - "918": { - "op": "==", - "defined_out": [ - "day_count_convention#0", - "denomination_asset_id#0", - "eq%6#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "eq%6#0" - ] - }, - "919": { - "error": "invalid number of bytes for arc4.uint16", - "op": "assert // invalid number of bytes for arc4.uint16", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "920": { - "op": "txna ApplicationArgs 8", - "defined_out": [ - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "coupon_rates#0" - ] - }, - "923": { - "op": "dup", - "defined_out": [ - "coupon_rates#0", - "coupon_rates#0 (copy)", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "coupon_rates#0", - "coupon_rates#0 (copy)" - ] - }, - "924": { - "op": "intc_0 // 0", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "coupon_rates#0", - "coupon_rates#0 (copy)", - "0" - ] - }, - "925": { - "error": "invalid array length header", - "op": "extract_uint16 // on error: invalid array length header", - "defined_out": [ - "aggregate%array_length%0#0", - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "coupon_rates#0", - "aggregate%array_length%0#0" - ] - }, - "926": { - "op": "dup", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "aggregate%array_length%0#0" - ] - }, - "927": { - "op": "cover 8", - "defined_out": [ - "aggregate%array_length%0#0", - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "coupon_rates#0", - "aggregate%array_length%0#0" - ] - }, - "929": { - "op": "pushint 2", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "2" - ] - }, - "931": { - "op": "*", - "defined_out": [ - "aggregate%array_length%0#0", - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "mul%0#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "coupon_rates#0", - "mul%0#0" - ] - }, - "932": { - "op": "pushint 2", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "coupon_rates#0", - "mul%0#0", - "2" - ] - }, - "934": { - "op": "+", - "defined_out": [ - "add%0#0", - "aggregate%array_length%0#0", - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "coupon_rates#0", - "add%0#0" - ] - }, - "935": { - "op": "swap", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "add%0#0", - "coupon_rates#0" - ] - }, - "936": { - "op": "len", - "defined_out": [ - "add%0#0", - "aggregate%array_length%0#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "len%7#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "add%0#0", - "len%7#0" - ] - }, - "937": { - "op": "==", - "defined_out": [ - "aggregate%array_length%0#0", - "day_count_convention#0", - "denomination_asset_id#0", - "eq%7#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "eq%7#0" - ] - }, - "938": { - "error": "invalid number of bytes for arc4.dynamic_array", - "op": "assert // invalid number of bytes for arc4.dynamic_array", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "939": { - "op": "txna ApplicationArgs 9" - }, - "942": { - "op": "dup", - "defined_out": [ - "aggregate%array_length%0#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_events#0", - "time_events#0" - ] - }, - "943": { - "op": "cover 7", - "defined_out": [ - "aggregate%array_length%0#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_events#0" - ] - }, - "945": { - "op": "dup", - "defined_out": [ - "aggregate%array_length%0#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0", - "time_events#0 (copy)" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_events#0", - "time_events#0 (copy)" - ] - }, - "946": { - "op": "intc_0 // 0", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_events#0", - "time_events#0 (copy)", - "0" - ] - }, - "947": { - "error": "invalid array length header", - "op": "extract_uint16 // on error: invalid array length header", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_events#0", - "aggregate%array_length%1#0" - ] - }, - "948": { - "op": "dup", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%1#0" - ] - }, - "949": { - "op": "cover 8", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_events#0", - "aggregate%array_length%1#0" - ] - }, - "951": { - "op": "intc_3 // 8", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_events#0", - "aggregate%array_length%1#0", - "8" - ] - }, - "952": { - "op": "*", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "mul%1#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_events#0", - "mul%1#0" - ] - }, - "953": { - "op": "pushint 2", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_events#0", - "mul%1#0", - "2" - ] - }, - "955": { - "op": "+", - "defined_out": [ - "add%1#0", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_events#0", - "add%1#0" - ] - }, - "956": { - "op": "swap", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "add%1#0", - "time_events#0" - ] - }, - "957": { - "op": "len", - "defined_out": [ - "add%1#0", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "len%8#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "add%1#0", - "len%8#0" - ] - }, - "958": { - "op": "==", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "day_count_convention#0", - "denomination_asset_id#0", - "eq%8#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "eq%8#0" - ] - }, - "959": { - "error": "invalid number of bytes for arc4.dynamic_array", - "op": "assert // invalid number of bytes for arc4.dynamic_array", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "960": { - "op": "txna ApplicationArgs 10" - }, - "963": { - "op": "dup", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_periods#0", - "time_periods#0" - ] - }, - "964": { - "op": "cover 7", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_periods#0" - ] - }, - "966": { - "op": "dup", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0", - "time_periods#0", - "time_periods#0 (copy)" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_periods#0", - "time_periods#0 (copy)" - ] - }, - "967": { - "op": "intc_0 // 0", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_periods#0", - "time_periods#0 (copy)", - "0" - ] - }, - "968": { - "error": "invalid array length header", - "op": "extract_uint16 // on error: invalid array length header", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_periods#0", - "aggregate%array_length%2#0" - ] - }, - "969": { - "op": "dup", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_periods#0", - "aggregate%array_length%2#0", - "aggregate%array_length%2#0" - ] - }, - "970": { - "op": "cover 8", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_periods#0", - "aggregate%array_length%2#0" - ] - }, - "972": { - "op": "pushint 16", - "defined_out": [ - "16", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_periods#0", - "aggregate%array_length%2#0", - "16" - ] - }, - "974": { - "op": "*", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "mul%2#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_periods#0", - "mul%2#0" - ] - }, - "975": { - "op": "pushint 2", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_periods#0", - "mul%2#0", - "2" - ] - }, - "977": { - "op": "+", - "defined_out": [ - "add%2#0", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_periods#0", - "add%2#0" - ] - }, - "978": { - "op": "swap", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "add%2#0", - "time_periods#0" - ] - }, - "979": { - "op": "len", - "defined_out": [ - "add%2#0", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "len%9#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "add%2#0", - "len%9#0" - ] - }, - "980": { - "op": "==", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "denomination_asset_id#0", - "eq%9#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "eq%9#0" - ] - }, - "981": { - "error": "invalid number of bytes for arc4.dynamic_array>", - "op": "assert // invalid number of bytes for arc4.dynamic_array>", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "982": { - "callsub": "modules.rbac.RbacModule.assert_caller_is_arranger", - "op": "callsub assert_caller_is_arranger" - }, - "985": { - "op": "intc_0 // 0", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "0" - ] - }, - "986": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"", - "0", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "0", - "\"status\"" - ] - }, - "987": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "maybe_exists%0#0", - "maybe_value%0#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "988": { - "error": "check self.status exists", - "op": "assert // check self.status exists", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "maybe_value%0#0" - ] - }, - "989": { - "op": "!", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0", - "time_periods#0", - "tmp%0#1" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "tmp%0#1" - ] - }, - "990": { - "error": "D-ASA already configured", - "op": "assert // D-ASA already configured", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "991": { - "op": "dig 5", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "denomination_asset_id#0", - "denomination_asset_id#0 (copy)", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "denomination_asset_id#0 (copy)" - ] - }, - "993": { - "op": "asset_params_get AssetCreator", - "defined_out": [ - "_creator#0", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "denomination_asset_id#0", - "exists#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "_creator#0", - "exists#0" - ] - }, - "995": { - "op": "bury 1", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "exists#0" - ] - }, - "997": { - "error": "Denomination asset is not properly set", - "op": "assert // Denomination asset is not properly set", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "998": { - "op": "bytec 24 // \"denomination_asset_id\"", - "defined_out": [ - "\"denomination_asset_id\"", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "\"denomination_asset_id\"" - ] - }, - "1000": { - "op": "dig 6", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "\"denomination_asset_id\"", - "denomination_asset_id#0 (copy)" - ] - }, - "1002": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "1003": { - "op": "dig 4", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "settlement_asset_id#0 (copy)", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "settlement_asset_id#0 (copy)" - ] - }, - "1005": { - "op": "uncover 6", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "settlement_asset_id#0 (copy)", - "denomination_asset_id#0" - ] - }, - "1007": { - "op": "==", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "tmp%0#1" - ] - }, - "1008": { - "error": "Different settlement asset not supported, must be equal to denomination asset", - "op": "assert // Different settlement asset not supported, must be equal to denomination asset", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "1009": { - "op": "bytec 14 // \"settlement_asset_id\"", - "defined_out": [ - "\"settlement_asset_id\"", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "\"settlement_asset_id\"" - ] - }, - "1011": { - "op": "dig 5", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "\"settlement_asset_id\"", - "settlement_asset_id#0 (copy)" - ] - }, - "1013": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "1014": { - "op": "itxn_begin" - }, - "1015": { - "op": "global MinTxnFee", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "inner_txn_params%0%%param_Fee_idx_0#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "inner_txn_params%0%%param_Fee_idx_0#0" - ] - }, - "1017": { - "op": "global CurrentApplicationAddress", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "inner_txn_params%0%%param_AssetReceiver_idx_0#0", - "inner_txn_params%0%%param_Fee_idx_0#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "inner_txn_params%0%%param_Fee_idx_0#0", - "inner_txn_params%0%%param_AssetReceiver_idx_0#0" - ] - }, - "1019": { - "op": "intc_0 // 0", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "inner_txn_params%0%%param_Fee_idx_0#0", - "inner_txn_params%0%%param_AssetReceiver_idx_0#0", - "0" - ] - }, - "1020": { - "op": "itxn_field AssetAmount", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "inner_txn_params%0%%param_Fee_idx_0#0", - "inner_txn_params%0%%param_AssetReceiver_idx_0#0" - ] - }, - "1022": { - "op": "itxn_field AssetReceiver", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "inner_txn_params%0%%param_Fee_idx_0#0" - ] - }, - "1024": { - "op": "uncover 5", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "inner_txn_params%0%%param_Fee_idx_0#0", - "settlement_asset_id#0" - ] - }, - "1026": { - "op": "itxn_field XferAsset", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "inner_txn_params%0%%param_Fee_idx_0#0" - ] - }, - "1028": { - "op": "pushint 4 // axfer", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "axfer", - "day_count_convention#0", - "inner_txn_params%0%%param_Fee_idx_0#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "inner_txn_params%0%%param_Fee_idx_0#0", - "axfer" - ] - }, - "1030": { - "op": "itxn_field TypeEnum", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "inner_txn_params%0%%param_Fee_idx_0#0" - ] - }, - "1032": { - "op": "itxn_field Fee", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "1034": { - "op": "itxn_submit" - }, - "1035": { - "op": "dig 3", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal#0 (copy)", - "principal_discount#0", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "principal#0 (copy)" - ] - }, - "1037": { - "op": "dig 2", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "interest_rate#0", - "minimum_denomination#0", - "minimum_denomination#0 (copy)", - "principal#0", - "principal#0 (copy)", - "principal_discount#0", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "principal#0 (copy)", - "minimum_denomination#0 (copy)" - ] - }, - "1039": { - "op": "%", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "time_events#0", - "time_periods#0", - "tmp%1#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "tmp%1#0" - ] - }, - "1040": { - "op": "!", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "time_events#0", - "time_periods#0", - "tmp%2#1" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "tmp%2#1" - ] - }, - "1041": { - "error": "Minimum denomination is not a divisor of principal", - "op": "assert // Minimum denomination is not a divisor of principal", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "1042": { - "op": "bytec 7 // \"unit_value\"", - "defined_out": [ - "\"unit_value\"", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "\"unit_value\"" - ] - }, - "1044": { - "op": "dig 2", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "\"unit_value\"", - "minimum_denomination#0 (copy)" - ] - }, - "1046": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "1047": { - "op": "uncover 3", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "principal#0" - ] - }, - "1049": { - "op": "uncover 2", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "principal_discount#0", - "day_count_convention#0", - "principal#0", - "minimum_denomination#0" - ] - }, - "1051": { - "op": "/", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "interest_rate#0", - "principal_discount#0", - "time_events#0", - "time_periods#0", - "tmp%3#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "principal_discount#0", - "day_count_convention#0", - "tmp%3#0" - ] - }, - "1052": { - "op": "bytec 13 // \"total_units\"", - "defined_out": [ - "\"total_units\"", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "interest_rate#0", - "principal_discount#0", - "time_events#0", - "time_periods#0", - "tmp%3#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "principal_discount#0", - "day_count_convention#0", - "tmp%3#0", - "\"total_units\"" - ] - }, - "1054": { - "op": "swap", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "principal_discount#0", - "day_count_convention#0", - "\"total_units\"", - "tmp%3#0" - ] - }, - "1055": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "principal_discount#0", - "day_count_convention#0" - ] - }, - "1056": { - "op": "bytec 26 // \"principal_discount\"", - "defined_out": [ - "\"principal_discount\"", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "interest_rate#0", - "principal_discount#0", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "principal_discount#0", - "day_count_convention#0", - "\"principal_discount\"" - ] - }, - "1058": { - "op": "uncover 2", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "\"principal_discount\"", - "principal_discount#0" - ] - }, - "1060": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#0" - ] - }, - "1061": { - "op": "btoi", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "interest_rate#0", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1062": { - "op": "dup", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "interest_rate#0", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "day_count_convention#2" - ] - }, - "1063": { - "op": "bz asset_config_bool_true@3", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1066": { - "op": "dup", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "day_count_convention#2" - ] - }, - "1067": { - "op": "pushint 255", - "defined_out": [ - "255", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "interest_rate#0", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "day_count_convention#2", - "255" - ] - }, - "1070": { - "op": "==", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "interest_rate#0", - "time_events#0", - "time_periods#0", - "tmp%1#1" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "tmp%1#1" - ] - }, - "1071": { - "op": "bz asset_config_bool_false@4", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1074": { - "block": "asset_config_bool_true@3", - "stack_in": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ], - "op": "intc_1 // 1", - "defined_out": [ - "or_result%0#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "or_result%0#0" - ] - }, - "1075": { - "error": "Invalid day-count convention ID", - "block": "asset_config_bool_merge@5", - "stack_in": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "or_result%0#0" - ], - "op": "assert // Invalid day-count convention ID", - "defined_out": [], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1076": { - "op": "bytec 15 // \"day_count_convention\"", - "defined_out": [ - "\"day_count_convention\"" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "\"day_count_convention\"" - ] - }, - "1078": { - "op": "dig 1", - "defined_out": [ - "\"day_count_convention\"", - "day_count_convention#2" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "\"day_count_convention\"", - "day_count_convention#2" - ] - }, - "1080": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1081": { - "op": "dig 6", - "defined_out": [ - "day_count_convention#2", - "interest_rate#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "interest_rate#0" - ] - }, - "1083": { - "op": "btoi", - "defined_out": [ - "day_count_convention#2", - "interest_rate#0", - "interest_rate#2" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "interest_rate#2" - ] - }, - "1084": { - "op": "bury 8", - "defined_out": [ - "day_count_convention#2", - "interest_rate#0", - "interest_rate#2" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1086": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "day_count_convention#2", - "interest_rate#0", - "interest_rate#2" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "0" - ] - }, - "1087": { - "op": "bytec 26 // \"principal_discount\"", - "defined_out": [ - "\"principal_discount\"", - "0", - "day_count_convention#2", - "interest_rate#0", - "interest_rate#2" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "0", - "\"principal_discount\"" - ] - }, - "1089": { - "op": "app_global_get_ex", - "defined_out": [ - "day_count_convention#2", - "interest_rate#0", - "interest_rate#2", - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1090": { - "error": "check self.principal_discount exists", - "op": "assert // check self.principal_discount exists", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "maybe_value%0#0" - ] - }, - "1091": { - "op": "bnz asset_config_after_if_else@7", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1094": { - "op": "dig 7", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "interest_rate#2" - ] - }, - "1096": { - "error": "Interest rate is not properly defined", - "op": "assert // Interest rate is not properly defined", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1097": { - "block": "asset_config_after_if_else@7", - "stack_in": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ], - "op": "bytec 5 // \"interest_rate\"", - "defined_out": [ - "\"interest_rate\"" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "\"interest_rate\"" - ] - }, - "1099": { - "op": "dig 8", - "defined_out": [ - "\"interest_rate\"", - "interest_rate#2" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "\"interest_rate\"", - "interest_rate#2" - ] - }, - "1101": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1102": { - "op": "dig 5", - "defined_out": [ - "aggregate%array_length%0#0", - "interest_rate#2" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_length%0#0" - ] - }, - "1104": { - "op": "dup", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%0#0 (copy)", - "interest_rate#2" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_length%0#0", - "aggregate%array_length%0#0 (copy)" - ] - }, - "1105": { - "op": "!", - "defined_out": [ - "aggregate%array_length%0#0", - "interest_rate#2", - "tmp%1#1" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_length%0#0", - "tmp%1#1" - ] - }, - "1106": { - "error": "Coupon rates are not properly defined", - "op": "assert // Coupon rates are not properly defined", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_length%0#0" - ] - }, - "1107": { - "op": "bytec 31 // \"total_coupons\"", - "defined_out": [ - "\"total_coupons\"", - "aggregate%array_length%0#0", - "interest_rate#2" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_length%0#0", - "\"total_coupons\"" - ] - }, - "1109": { - "op": "dig 1", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_length%0#0", - "\"total_coupons\"", - "aggregate%array_length%0#0 (copy)" - ] - }, - "1111": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_length%0#0" - ] - }, - "1112": { - "op": "pushint 3", - "defined_out": [ - "3", - "aggregate%array_length%0#0", - "interest_rate#2" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_length%0#0", - "3" - ] - }, - "1114": { - "op": "+", - "defined_out": [ - "aggregate%array_length%0#0", - "interest_rate#2", - "tmp%1#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "tmp%1#0" - ] - }, - "1115": { - "op": "dig 4", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "interest_rate#2", - "tmp%1#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "tmp%1#0", - "aggregate%array_length%1#0" - ] - }, - "1117": { - "op": "==", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "interest_rate#2", - "tmp%2#1" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "tmp%2#1" - ] - }, - "1118": { - "error": "Time events length is invalid", - "op": "assert // Time events length is invalid", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1119": { - "op": "dig 4", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "interest_rate#2", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0" - ] - }, - "1121": { - "callsub": "modules.core_financial.common.CoreFinancialCommonMixin.assert_time_events_sorted", - "op": "callsub assert_time_events_sorted" - }, - "1124": { - "op": "bytec 32 // 0x74696d654576656e7473", - "defined_out": [ - "0x74696d654576656e7473", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "interest_rate#2", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "0x74696d654576656e7473" - ] - }, - "1126": { - "op": "box_del", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "interest_rate#2", - "time_events#0", - "{box_del}" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "{box_del}" - ] - }, - "1127": { - "op": "pop", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0" - ] - }, - "1128": { - "op": "bytec 32 // 0x74696d654576656e7473", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "0x74696d654576656e7473" - ] - }, - "1130": { - "op": "dig 1", - "defined_out": [ - "0x74696d654576656e7473", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "interest_rate#2", - "time_events#0", - "time_events#0 (copy)" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "0x74696d654576656e7473", - "time_events#0 (copy)" - ] - }, - "1132": { - "op": "box_put", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0" - ] - }, - "1133": { - "op": "dup", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "time_events#0 (copy)" - ] - }, - "1134": { - "op": "pushint 2", - "defined_out": [ - "2", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "interest_rate#2", - "time_events#0", - "time_events#0 (copy)" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "time_events#0 (copy)", - "2" - ] - }, - "1136": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "interest_rate#2", - "time_events#0", - "values%0#1" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "values%0#1" - ] - }, - "1137": { - "op": "bytec 8 // \"primary_distribution_opening_date\"", - "defined_out": [ - "\"primary_distribution_opening_date\"", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "interest_rate#2", - "time_events#0", - "values%0#1" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "values%0#1", - "\"primary_distribution_opening_date\"" - ] - }, - "1139": { - "op": "swap", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "\"primary_distribution_opening_date\"", - "values%0#1" - ] - }, - "1140": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0" - ] - }, - "1141": { - "op": "dup", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "time_events#0 (copy)" - ] - }, - "1142": { - "op": "pushint 10", - "defined_out": [ - "10", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "interest_rate#2", - "time_events#0", - "time_events#0 (copy)" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "time_events#0 (copy)", - "10" - ] - }, - "1144": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "interest_rate#2", - "time_events#0", - "values%1#1" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "values%1#1" - ] - }, - "1145": { - "op": "bytec 27 // \"primary_distribution_closure_date\"", - "defined_out": [ - "\"primary_distribution_closure_date\"", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "interest_rate#2", - "time_events#0", - "values%1#1" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "values%1#1", - "\"primary_distribution_closure_date\"" - ] - }, - "1147": { - "op": "swap", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "\"primary_distribution_closure_date\"", - "values%1#1" - ] - }, - "1148": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0" - ] - }, - "1149": { - "op": "pushint 18", - "defined_out": [ - "18", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "interest_rate#2", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "18" - ] - }, - "1151": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "interest_rate#2", - "time_events#0", - "values%2#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "values%2#0" - ] - }, - "1152": { - "op": "bytec_3 // \"issuance_date\"", - "defined_out": [ - "\"issuance_date\"", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "interest_rate#2", - "time_events#0", - "values%2#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "values%2#0", - "\"issuance_date\"" - ] - }, - "1153": { - "op": "swap", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "\"issuance_date\"", - "values%2#0" - ] - }, - "1154": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1155": { - "op": "bytec 10 // \"maturity_date\"", - "defined_out": [ - "\"maturity_date\"", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "interest_rate#2", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "\"maturity_date\"" - ] - }, - "1157": { - "op": "intc_0 // 0", - "defined_out": [ - "\"maturity_date\"", - "0", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "interest_rate#2", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "\"maturity_date\"", - "0" - ] - }, - "1158": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1159": { - "op": "dig 1", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "interest_rate#2", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_length%2#0" - ] - }, - "1161": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "interest_rate#2", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_length%2#0", - "1" - ] - }, - "1162": { - "op": "==", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "tmp%1#1" - ] - }, - "1163": { - "error": "Time periods are not properly defined", - "op": "assert // Time periods are not properly defined", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1164": { - "op": "dig 2", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "interest_rate#2", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_periods#0" - ] - }, - "1166": { - "op": "dup", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "interest_rate#2", - "time_events#0", - "time_periods#0", - "time_periods#0 (copy)" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_periods#0", - "time_periods#0 (copy)" - ] - }, - "1167": { - "op": "extract 2 16", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "aggregate%encoded_element%3#0", - "interest_rate#2", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_periods#0", - "aggregate%encoded_element%3#0" - ] - }, - "1170": { - "op": "dup", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "aggregate%encoded_element%3#0", - "aggregate%encoded_element%3#0 (copy)", - "interest_rate#2", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_periods#0", - "aggregate%encoded_element%3#0", - "aggregate%encoded_element%3#0 (copy)" - ] - }, - "1171": { - "op": "intc_0 // 0", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_periods#0", - "aggregate%encoded_element%3#0", - "aggregate%encoded_element%3#0 (copy)", - "0" - ] - }, - "1172": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "aggregate%encoded_element%3#0", - "coupon_period_duration#0", - "interest_rate#2", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_periods#0", - "aggregate%encoded_element%3#0", - "coupon_period_duration#0" - ] - }, - "1173": { - "op": "swap", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_periods#0", - "coupon_period_duration#0", - "aggregate%encoded_element%3#0" - ] - }, - "1174": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "aggregate%encoded_element%3#0", - "coupon_period_duration#0", - "interest_rate#2", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_periods#0", - "coupon_period_duration#0", - "aggregate%encoded_element%3#0", - "8" - ] - }, - "1175": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "coupon_period_duration#0", - "interest_rate#2", - "repetitions#0", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_periods#0", - "coupon_period_duration#0", - "repetitions#0" - ] - }, - "1176": { - "op": "swap", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_periods#0", - "repetitions#0", - "coupon_period_duration#0" - ] - }, - "1177": { - "error": "Time period durations must be strictly greater than zero", - "op": "assert // Time period durations must be strictly greater than zero", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_periods#0", - "repetitions#0" - ] - }, - "1178": { - "op": "!", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "interest_rate#2", - "time_events#0", - "time_periods#0", - "tmp%3#1" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_periods#0", - "tmp%3#1" - ] - }, - "1179": { - "error": "Time period repetitions are not properly defined", - "op": "assert // Time period repetitions are not properly defined", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_periods#0" - ] - }, - "1180": { - "op": "bytec 29 // 0x74696d65506572696f6473", - "defined_out": [ - "0x74696d65506572696f6473", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "interest_rate#2", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_periods#0", - "0x74696d65506572696f6473" - ] - }, - "1182": { - "op": "box_del", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_periods#0", - "{box_del}" - ] - }, - "1183": { - "op": "pop", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_periods#0" - ] - }, - "1184": { - "op": "bytec 29 // 0x74696d65506572696f6473", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_periods#0", - "0x74696d65506572696f6473" - ] - }, - "1186": { - "op": "swap", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "0x74696d65506572696f6473", - "time_periods#0" - ] - }, - "1187": { - "op": "box_put", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1188": { - "op": "bytec 29 // 0x74696d65506572696f6473", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "0x74696d65506572696f6473" - ] - }, - "1190": { - "op": "pushints 2 16", - "defined_out": [ - "0x74696d65506572696f6473", - "16", - "2", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "interest_rate#2", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "0x74696d65506572696f6473", - "2", - "16" - ] - }, - "1194": { - "op": "box_extract", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "box%box_extract%0#0", - "interest_rate#2", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "box%box_extract%0#0" - ] - }, - "1195": { - "op": "intc_0 // 0", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "box%box_extract%0#0", - "0" - ] - }, - "1196": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "aggregate%item0%1#0", - "interest_rate#2", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%item0%1#0" - ] - }, - "1197": { - "op": "bytec 17 // \"coupon_period\"", - "defined_out": [ - "\"coupon_period\"", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "aggregate%item0%1#0", - "interest_rate#2", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%item0%1#0", - "\"coupon_period\"" - ] - }, - "1199": { - "op": "swap", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "\"coupon_period\"", - "aggregate%item0%1#0" - ] - }, - "1200": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1201": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "interest_rate#2", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "\"status\"" - ] - }, - "1202": { - "op": "pushint 100", - "defined_out": [ - "\"status\"", - "100", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "interest_rate#2", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "\"status\"", - "100" - ] - }, - "1204": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1205": { - "op": "intc_1 // 1", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "1" - ] - }, - "1206": { - "op": "return", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1207": { - "block": "asset_config_bool_false@4", - "stack_in": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ], - "op": "intc_0 // 0", - "defined_out": [ - "or_result%0#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "or_result%0#0" - ] - }, - "1208": { - "op": "b asset_config_bool_merge@5" - }, - "1211": { - "subroutine": "modules.actus.pbn.PBNCoreMixin.update_interest_rate[routing]", - "params": {}, - "block": "update_interest_rate", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "interest_rate#0" - ], - "stack_out": [ - "interest_rate#0" - ] - }, - "1214": { - "op": "dup", - "defined_out": [ - "interest_rate#0", - "interest_rate#0 (copy)" - ], - "stack_out": [ - "interest_rate#0", - "interest_rate#0 (copy)" - ] - }, - "1215": { - "op": "len", - "defined_out": [ - "interest_rate#0", - "len%0#0" - ], - "stack_out": [ - "interest_rate#0", - "len%0#0" - ] - }, - "1216": { - "op": "pushint 2", - "defined_out": [ - "2", - "interest_rate#0", - "len%0#0" - ], - "stack_out": [ - "interest_rate#0", - "len%0#0", - "2" - ] - }, - "1218": { - "op": "==", - "defined_out": [ - "eq%0#0", - "interest_rate#0" - ], - "stack_out": [ - "interest_rate#0", - "eq%0#0" - ] - }, - "1219": { - "error": "invalid number of bytes for arc4.uint16", - "op": "assert // invalid number of bytes for arc4.uint16", - "stack_out": [ - "interest_rate#0" - ] - }, - "1220": { - "op": "bytec 18 // 0x52383023", - "defined_out": [ - "0x52383023", - "interest_rate#0" - ], - "stack_out": [ - "interest_rate#0", - "0x52383023" - ] - }, - "1222": { - "op": "txn Sender", - "defined_out": [ - "0x52383023", - "interest_rate#0", - "tmp%0#0" - ], - "stack_out": [ - "interest_rate#0", - "0x52383023", - "tmp%0#0" - ] - }, - "1224": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "interest_rate#0", - "tmp%1#1" - ], - "stack_out": [ - "interest_rate#0", - "tmp%1#1" - ] - }, - "1227": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "interest_rate#0" - ] - }, - "1228": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "op": "callsub assert_is_not_asset_defaulted" - }, - "1231": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_suspended", - "op": "callsub assert_is_not_asset_suspended" - }, - "1234": { - "callsub": "modules.core_financial.coupon.PerpetualCouponCashflowMixin.count_due_coupons", - "op": "callsub count_due_coupons", - "defined_out": [ - "due_coupons#0", - "interest_rate#0" - ], - "stack_out": [ - "interest_rate#0", - "due_coupons#0" - ] - }, - "1237": { - "callsub": "modules.core_financial.coupon.CouponCashflowMixin.all_due_coupons_paid", - "op": "callsub all_due_coupons_paid", - "stack_out": [ - "interest_rate#0", - "tmp%1#1" - ] - }, - "1240": { - "error": "Pending due coupon payment", - "op": "assert // Pending due coupon payment", - "stack_out": [ - "interest_rate#0" - ] - }, - "1241": { - "op": "btoi", - "defined_out": [ - "tmp%2#1" - ], - "stack_out": [ - "tmp%2#1" - ] - }, - "1242": { - "op": "bytec 5 // \"interest_rate\"", - "defined_out": [ - "\"interest_rate\"", - "tmp%2#1" - ], - "stack_out": [ - "tmp%2#1", - "\"interest_rate\"" - ] - }, - "1244": { - "op": "swap", - "stack_out": [ - "\"interest_rate\"", - "tmp%2#1" - ] - }, - "1245": { - "op": "app_global_put", - "stack_out": [] - }, - "1246": { - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%3#1" - ], - "stack_out": [ - "tmp%3#1" - ] - }, - "1248": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0" - ] - }, - "1249": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0", - "0x151f7c75" - ] - }, - "1250": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ] - }, - "1251": { - "op": "concat", - "defined_out": [ - "tmp%3#0" - ], - "stack_out": [ - "tmp%3#0" - ] - }, - "1252": { - "op": "log", - "stack_out": [] - }, - "1253": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "1254": { - "op": "return", - "stack_out": [] - }, - "1255": { - "subroutine": "modules.core_financial.coupon.PerpetualCouponCashflowMixin.get_account_units_current_value[routing]", - "params": {}, - "block": "get_account_units_current_value", - "stack_in": [], - "op": "intc_0 // 0", - "stack_out": [ - "box_prefixed_key%0#1" - ] - }, - "1256": { - "op": "pushbytes \"\"", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0" - ] - }, - "1258": { - "op": "dupn 4", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0" - ] - }, - "1260": { - "op": "txna ApplicationArgs 1" - }, - "1263": { - "op": "dup", - "defined_out": [ - "holding_address#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "holding_address#0" - ] - }, - "1264": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "len%0#0" - ] - }, - "1265": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "len%0#0", - "32" - ] - }, - "1266": { - "op": "==", - "defined_out": [ - "eq%0#0", - "holding_address#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "eq%0#0" - ] - }, - "1267": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0" - ] - }, - "1268": { - "op": "txna ApplicationArgs 2", - "defined_out": [ - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "tmp%2#0" - ] - }, - "1271": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ] - }, - "1272": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%1#0", - "tmp%2#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "tmp%2#0", - "len%1#0" - ] - }, - "1273": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "holding_address#0", - "len%1#0", - "tmp%2#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "tmp%2#0", - "len%1#0", - "8" - ] - }, - "1274": { - "op": "==", - "defined_out": [ - "eq%1#0", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "tmp%2#0", - "eq%1#0" - ] - }, - "1275": { - "error": "invalid number of bytes for arc4.uint64", - "op": "assert // invalid number of bytes for arc4.uint64", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "tmp%2#0" - ] - }, - "1276": { - "op": "btoi", - "defined_out": [ - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1277": { - "op": "intc_0 // 0", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "0" - ] - }, - "1278": { - "op": "bytec 8 // \"primary_distribution_opening_date\"", - "defined_out": [ - "\"primary_distribution_opening_date\"", - "0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "0", - "\"primary_distribution_opening_date\"" - ] - }, - "1280": { - "op": "app_global_get_ex", - "defined_out": [ - "holding_address#0", - "maybe_exists%0#0", - "maybe_value%0#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1281": { - "error": "check self.primary_distribution_opening_date exists", - "op": "assert // check self.primary_distribution_opening_date exists", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "maybe_value%0#0" - ] - }, - "1282": { - "op": "bz get_account_units_current_value_bool_false@4", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1285": { - "op": "global LatestTimestamp", - "defined_out": [ - "holding_address#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "tmp%1#1" - ] - }, - "1287": { - "op": "intc_0 // 0", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "tmp%1#1", - "0" - ] - }, - "1288": { - "op": "bytec 8 // \"primary_distribution_opening_date\"", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "tmp%1#1", - "0", - "\"primary_distribution_opening_date\"" - ] - }, - "1290": { - "op": "app_global_get_ex", - "defined_out": [ - "holding_address#0", - "maybe_exists%1#0", - "maybe_value%1#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "tmp%1#1", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "1291": { - "error": "check self.primary_distribution_opening_date exists", - "op": "assert // check self.primary_distribution_opening_date exists", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "tmp%1#1", - "maybe_value%1#0" - ] - }, - "1292": { - "op": ">=", - "defined_out": [ - "holding_address#0", - "tmp%2#1", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "tmp%2#1" - ] - }, - "1293": { - "op": "bz get_account_units_current_value_bool_false@4", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1296": { - "op": "intc_1 // 1", - "defined_out": [ - "and_result%0#0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "and_result%0#0" - ] - }, - "1297": { - "error": "Primary distribution not yet executed", - "block": "get_account_units_current_value_bool_merge@5", - "stack_in": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "and_result%0#0" - ], - "op": "assert // Primary distribution not yet executed", - "defined_out": [], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1298": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "0x52333023" - ] - }, - "1299": { - "op": "dig 2", - "defined_out": [ - "0x52333023", - "holding_address#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "0x52333023", - "holding_address#0" - ] - }, - "1301": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1" - ] - }, - "1302": { - "op": "dup", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1" - ] - }, - "1303": { - "op": "bury 9", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1" - ] - }, - "1305": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "holding_address#0", - "maybe_exists%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "1306": { - "op": "bury 1", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "maybe_exists%0#0" - ] - }, - "1308": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1309": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "units#0" - ] - }, - "1310": { - "op": "bz get_account_units_current_value_bool_false@8", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1313": { - "op": "dig 7", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1" - ] - }, - "1315": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0", - "box_prefixed_key%0#1", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "1316": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%box_get%0#0" - ] - }, - "1317": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "aggregate%box_get%0#0", - "box_prefixed_key%0#1", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%box_get%0#0", - "32" - ] - }, - "1318": { - "op": "extract_uint64", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "units#0", - "values%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "values%0#0" - ] - }, - "1319": { - "op": "dig 1", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "values%0#0", - "units#0" - ] - }, - "1321": { - "op": ">=", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "tmp%4#1", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "tmp%4#1" - ] - }, - "1322": { - "op": "bz get_account_units_current_value_bool_false@8", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1325": { - "op": "intc_1 // 1", - "defined_out": [ - "and_result%1#0", - "box_prefixed_key%0#1", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "and_result%1#0" - ] - }, - "1326": { - "error": "Invalid amount of units for the account", - "block": "get_account_units_current_value_bool_merge@9", - "stack_in": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "and_result%1#0" - ], - "op": "assert // Invalid amount of units for the account", - "defined_out": [], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1327": { - "op": "dig 1", - "defined_out": [ - "holding_address#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "holding_address#0" - ] - }, - "1329": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "holding_address#0", - "holding_address#0 (copy)" - ] - }, - "1330": { - "op": "dig 2", - "defined_out": [ - "holding_address#0", - "holding_address#0 (copy)", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "holding_address#0", - "holding_address#0 (copy)", - "units#0" - ] - }, - "1332": { - "callsub": "modules.accounting.AccountingModule.account_units_value", - "op": "callsub account_units_value", - "defined_out": [ - "account_units_nominal_value#0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "holding_address#0", - "account_units_nominal_value#0" - ] - }, - "1335": { - "op": "bury 8", - "defined_out": [ - "account_units_nominal_value#0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "holding_address#0" - ] - }, - "1337": { - "op": "intc_0 // 0", - "defined_out": [ - "account_units_nominal_value#0", - "accrued_interest#0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "holding_address#0", - "accrued_interest#0" - ] - }, - "1338": { - "op": "bury 7", - "defined_out": [ - "account_units_nominal_value#0", - "accrued_interest#0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "holding_address#0" - ] - }, - "1340": { - "op": "intc_0 // 0", - "defined_out": [ - "account_units_nominal_value#0", - "accrued_interest#0", - "holding_address#0", - "numerator#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "holding_address#0", - "numerator#0" - ] - }, - "1341": { - "op": "bury 4", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "holding_address#0" - ] - }, - "1343": { - "op": "intc_0 // 0", - "defined_out": [ - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "holding_address#0", - "numerator#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "holding_address#0", - "denominator#0" - ] - }, - "1344": { - "op": "bury 6", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "holding_address#0" - ] - }, - "1346": { - "callsub": "modules.core_financial.coupon.PerpetualCouponCashflowMixin.count_due_coupons", - "op": "callsub count_due_coupons", - "defined_out": [ - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "holding_address#0", - "numerator#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "holding_address#0", - "due_coupons#0" - ] - }, - "1349": { - "op": "dup", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "holding_address#0", - "due_coupons#0", - "due_coupons#0" - ] - }, - "1350": { - "op": "bury 6", - "defined_out": [ - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "holding_address#0", - "numerator#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "holding_address#0", - "due_coupons#0" - ] - }, - "1352": { - "op": "swap", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "due_coupons#0", - "holding_address#0" - ] - }, - "1353": { - "op": "dig 1", - "defined_out": [ - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "due_coupons#0 (copy)", - "holding_address#0", - "numerator#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "due_coupons#0", - "holding_address#0", - "due_coupons#0 (copy)" - ] - }, - "1355": { - "callsub": "modules.core_financial.coupon.CouponCashflowMixin.assert_no_pending_coupon_payment", - "op": "callsub assert_no_pending_coupon_payment", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "due_coupons#0" - ] - }, - "1358": { - "callsub": "modules.core_financial.coupon.PerpetualCouponCashflowMixin.is_accruing_interest", - "op": "callsub is_accruing_interest", - "defined_out": [ - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "holding_address#0", - "numerator#0", - "tmp%7#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "tmp%7#0" - ] - }, - "1361": { - "op": "bz get_account_units_current_value_after_if_else@11", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1364": { - "op": "dig 3", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "due_coupons#0" - ] - }, - "1366": { - "op": "dup", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "due_coupons#0", - "due_coupons#0 (copy)" - ] - }, - "1367": { - "callsub": "modules.core_financial.coupon.PerpetualCouponCashflowMixin.day_count_factor", - "op": "callsub day_count_factor", - "defined_out": [ - "account_units_nominal_value#0", - "accrued_interest#0", - "day_count_factor#0", - "denominator#0", - "due_coupons#0", - "holding_address#0", - "numerator#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "due_coupons#0", - "day_count_factor#0" - ] - }, - "1370": { - "op": "dig 3", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "due_coupons#0", - "day_count_factor#0", - "holding_address#0" - ] - }, - "1372": { - "op": "dig 3", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "due_coupons#0", - "day_count_factor#0", - "holding_address#0", - "units#0" - ] - }, - "1374": { - "op": "uncover 3", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "day_count_factor#0", - "holding_address#0", - "units#0", - "due_coupons#0" - ] - }, - "1376": { - "callsub": "modules.core_financial.coupon.PerpetualCouponCashflowMixin.accrued_interest_amount", - "op": "callsub accrued_interest_amount", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "day_count_factor#0", - "accrued_interest#0" - ] - }, - "1379": { - "op": "bury 7", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "day_count_factor#0" - ] - }, - "1381": { - "op": "dup", - "defined_out": [ - "account_units_nominal_value#0", - "accrued_interest#0", - "day_count_factor#0", - "day_count_factor#0 (copy)", - "denominator#0", - "due_coupons#0", - "holding_address#0", - "numerator#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "day_count_factor#0", - "day_count_factor#0 (copy)" - ] - }, - "1382": { - "op": "intc_0 // 0", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "day_count_factor#0", - "day_count_factor#0 (copy)", - "0" - ] - }, - "1383": { - "op": "extract_uint64", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "day_count_factor#0", - "numerator#0" - ] - }, - "1384": { - "op": "bury 4", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "day_count_factor#0" - ] - }, - "1386": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "account_units_nominal_value#0", - "accrued_interest#0", - "day_count_factor#0", - "denominator#0", - "due_coupons#0", - "holding_address#0", - "numerator#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "day_count_factor#0", - "8" - ] - }, - "1387": { - "op": "extract_uint64", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "denominator#0" - ] - }, - "1388": { - "op": "bury 5", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1390": { - "block": "get_account_units_current_value_after_if_else@11", - "stack_in": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0" - ], - "op": "dig 2", - "defined_out": [ - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "numerator#0" - ] - }, - "1392": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%val_as_bytes%0#0" - ] - }, - "1393": { - "op": "dig 5", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "denominator#0", - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%val_as_bytes%0#0", - "denominator#0" - ] - }, - "1395": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0", - "denominator#0", - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0" - ] - }, - "1396": { - "op": "concat", - "defined_out": [ - "aggregate%head%1#0", - "denominator#0", - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%head%1#0" - ] - }, - "1397": { - "op": "dig 7", - "defined_out": [ - "account_units_nominal_value#0", - "aggregate%head%1#0", - "denominator#0", - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%head%1#0", - "account_units_nominal_value#0" - ] - }, - "1399": { - "op": "itob", - "defined_out": [ - "account_units_nominal_value#0", - "aggregate%head%1#0", - "aggregate%val_as_bytes%2#0", - "denominator#0", - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%head%1#0", - "aggregate%val_as_bytes%2#0" - ] - }, - "1400": { - "op": "dig 7", - "defined_out": [ - "account_units_nominal_value#0", - "accrued_interest#0", - "aggregate%head%1#0", - "aggregate%val_as_bytes%2#0", - "denominator#0", - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%head%1#0", - "aggregate%val_as_bytes%2#0", - "accrued_interest#0" - ] - }, - "1402": { - "op": "itob", - "defined_out": [ - "account_units_nominal_value#0", - "accrued_interest#0", - "aggregate%head%1#0", - "aggregate%val_as_bytes%2#0", - "aggregate%val_as_bytes%3#0", - "denominator#0", - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%head%1#0", - "aggregate%val_as_bytes%2#0", - "aggregate%val_as_bytes%3#0" - ] - }, - "1403": { - "op": "concat", - "defined_out": [ - "account_units_nominal_value#0", - "accrued_interest#0", - "aggregate%head%1#0", - "aggregate%head%3#0", - "denominator#0", - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%head%1#0", - "aggregate%head%3#0" - ] - }, - "1404": { - "op": "swap", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%head%3#0", - "aggregate%head%1#0" - ] - }, - "1405": { - "op": "concat", - "defined_out": [ - "account_units_nominal_value#0", - "accrued_interest#0", - "aggregate%head%4#0", - "denominator#0", - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%head%4#0" - ] - }, - "1406": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "account_units_nominal_value#0", - "accrued_interest#0", - "aggregate%head%4#0", - "denominator#0", - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%head%4#0", - "0x151f7c75" - ] - }, - "1407": { - "op": "swap", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "0x151f7c75", - "aggregate%head%4#0" - ] - }, - "1408": { - "op": "concat", - "defined_out": [ - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "numerator#0", - "tmp%5#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "tmp%5#0" - ] - }, - "1409": { - "op": "log", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1410": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "1" - ] - }, - "1411": { - "op": "return", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1412": { - "block": "get_account_units_current_value_bool_false@8", - "stack_in": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "and_result%1#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "and_result%1#0" - ] - }, - "1413": { - "op": "b get_account_units_current_value_bool_merge@9" - }, - "1416": { - "block": "get_account_units_current_value_bool_false@4", - "stack_in": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "and_result%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "and_result%0#0" - ] - }, - "1417": { - "op": "b get_account_units_current_value_bool_merge@5" - }, - "1420": { - "subroutine": "modules.core_financial.coupon.PerpetualCouponCashflowMixin.get_payment_amount[routing]", - "params": {}, - "block": "get_payment_amount", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "holding_address#0" - ], - "stack_out": [ - "holding_address#0" - ] - }, - "1423": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ] - }, - "1424": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0" - ] - }, - "1425": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0", - "32" - ] - }, - "1426": { - "op": "==", - "defined_out": [ - "eq%0#0", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "eq%0#0" - ] - }, - "1427": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "holding_address#0" - ] - }, - "1428": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "0x52333023" - ] - }, - "1429": { - "op": "dig 1", - "stack_out": [ - "holding_address#0", - "0x52333023", - "holding_address#0 (copy)" - ] - }, - "1431": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#0", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "box_prefixed_key%0#0" - ] - }, - "1432": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "holding_address#0", - "maybe_exists%0#0" - ], - "stack_out": [ - "holding_address#0", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "1433": { - "op": "bury 1", - "stack_out": [ - "holding_address#0", - "maybe_exists%0#0" - ] - }, - "1435": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "holding_address#0" - ] - }, - "1436": { - "callsub": "modules.accounting.AccountingModule.account_total_units_value", - "op": "callsub account_total_units_value", - "defined_out": [ - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1" - ] - }, - "1439": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1", - "0" - ] - }, - "1440": { - "op": "bytec 5 // \"interest_rate\"", - "defined_out": [ - "\"interest_rate\"", - "0", - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1", - "0", - "\"interest_rate\"" - ] - }, - "1442": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0", - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1443": { - "error": "check self.interest_rate exists", - "op": "assert // check self.interest_rate exists", - "stack_out": [ - "tmp%0#1", - "maybe_value%0#0" - ] - }, - "1444": { - "op": "*", - "defined_out": [ - "tmp%1#1" - ], - "stack_out": [ - "tmp%1#1" - ] - }, - "1445": { - "op": "intc 4 // 10000", - "defined_out": [ - "10000", - "tmp%1#1" - ], - "stack_out": [ - "tmp%1#1", - "10000" - ] - }, - "1447": { - "op": "/", - "defined_out": [ - "interest_amount#0" - ], - "stack_out": [ - "interest_amount#0" - ] - }, - "1448": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0" - ] - }, - "1449": { - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%val_as_bytes%0#0", - "0" - ] - }, - "1450": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0" - ] - }, - "1451": { - "op": "concat", - "defined_out": [ - "aggregate%head%1#0" - ], - "stack_out": [ - "aggregate%head%1#0" - ] - }, - "1452": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%head%1#0" - ], - "stack_out": [ - "aggregate%head%1#0", - "0x151f7c75" - ] - }, - "1453": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%head%1#0" - ] - }, - "1454": { - "op": "concat", - "defined_out": [ - "tmp%3#0" - ], - "stack_out": [ - "tmp%3#0" - ] - }, - "1455": { - "op": "log", - "stack_out": [] - }, - "1456": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "1457": { - "op": "return", - "stack_out": [] - }, - "1458": { - "subroutine": "modules.core_financial.coupon.PerpetualCouponCashflowMixin.get_coupons_status[routing]", - "params": {}, - "block": "get_coupons_status", - "stack_in": [], - "op": "pushbytes \"\"", - "stack_out": [ - "all_due_coupons_paid#0" - ] - }, - "1460": { - "op": "dupn 4", - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ] - }, - "1462": { - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "0" - ] - }, - "1463": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"", - "0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "0", - "\"status\"" - ] - }, - "1464": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1465": { - "error": "check self.status exists", - "op": "assert // check self.status exists", - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "maybe_value%0#0" - ] - }, - "1466": { - "op": "pushint 100", - "defined_out": [ - "100", - "maybe_value%0#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "maybe_value%0#0", - "100" - ] - }, - "1468": { - "op": "==", - "defined_out": [ - "tmp%0#3" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "tmp%0#3" - ] - }, - "1469": { - "op": "bz get_coupons_status_ternary_false@3", - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ] - }, - "1472": { - "callsub": "modules.core_financial.coupon.PerpetualCouponCashflowMixin.count_due_coupons", - "op": "callsub count_due_coupons", - "defined_out": [ - "due_coupons#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "due_coupons#0" - ] - }, - "1475": { - "op": "bury 3", - "defined_out": [ - "due_coupons#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ] - }, - "1477": { - "block": "get_coupons_status_ternary_merge@4", - "stack_in": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ], - "op": "dig 2", - "defined_out": [ - "due_coupons#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "due_coupons#0" - ] - }, - "1479": { - "op": "dup", - "defined_out": [ - "due_coupons#0", - "due_coupons#0 (copy)" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "due_coupons#0", - "due_coupons#0 (copy)" - ] - }, - "1480": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "due_coupons#0", - "due_coupons#0 (copy)" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "due_coupons#0", - "due_coupons#0 (copy)", - "1" - ] - }, - "1481": { - "op": "+", - "defined_out": [ - "due_coupons#0", - "tmp%0#2" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "due_coupons#0", - "tmp%0#2" - ] - }, - "1482": { - "callsub": "modules.core_financial.coupon.PerpetualCouponCashflowMixin.coupon_due_date", - "op": "callsub coupon_due_date", - "defined_out": [ - "due_coupons#0", - "next_coupon_due_date#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "due_coupons#0", - "next_coupon_due_date#0" - ] - }, - "1485": { - "op": "bury 3", - "defined_out": [ - "due_coupons#0", - "next_coupon_due_date#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "due_coupons#0" - ] - }, - "1487": { - "op": "dup", - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "due_coupons#0", - "due_coupons#0 (copy)" - ] - }, - "1488": { - "callsub": "modules.core_financial.coupon.CouponCashflowMixin.all_due_coupons_paid", - "op": "callsub all_due_coupons_paid", - "defined_out": [ - "all_due_coupons_paid#0", - "due_coupons#0", - "next_coupon_due_date#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "due_coupons#0", - "all_due_coupons_paid#0" - ] - }, - "1491": { - "op": "bury 6", - "defined_out": [ - "all_due_coupons_paid#0", - "due_coupons#0", - "next_coupon_due_date#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "due_coupons#0" - ] - }, - "1493": { - "op": "intc_0 // 0", - "defined_out": [ - "all_due_coupons_paid#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "due_coupons#0", - "numerator#0" - ] - }, - "1494": { - "op": "bury 2", - "defined_out": [ - "all_due_coupons_paid#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "due_coupons#0" - ] - }, - "1496": { - "op": "intc_0 // 0", - "defined_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "due_coupons#0", - "denominator#0" - ] - }, - "1497": { - "op": "bury 5", - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "due_coupons#0" - ] - }, - "1499": { - "callsub": "modules.core_financial.coupon.PerpetualCouponCashflowMixin.is_accruing_interest", - "op": "callsub is_accruing_interest", - "defined_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "tmp%3#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "tmp%3#0" - ] - }, - "1502": { - "op": "bz get_coupons_status_after_if_else@6", - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ] - }, - "1505": { - "op": "dig 2", - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "due_coupons#0" - ] - }, - "1507": { - "callsub": "modules.core_financial.coupon.PerpetualCouponCashflowMixin.day_count_factor", - "op": "callsub day_count_factor", - "defined_out": [ - "all_due_coupons_paid#0", - "day_count_factor#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "day_count_factor#0" - ] - }, - "1510": { - "op": "dup", - "defined_out": [ - "all_due_coupons_paid#0", - "day_count_factor#0", - "day_count_factor#0 (copy)", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "day_count_factor#0", - "day_count_factor#0 (copy)" - ] - }, - "1511": { - "op": "intc_0 // 0", - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "day_count_factor#0", - "day_count_factor#0 (copy)", - "0" - ] - }, - "1512": { - "op": "extract_uint64", - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "day_count_factor#0", - "numerator#0" - ] - }, - "1513": { - "op": "bury 2", - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "day_count_factor#0" - ] - }, - "1515": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "all_due_coupons_paid#0", - "day_count_factor#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "day_count_factor#0", - "8" - ] - }, - "1516": { - "op": "extract_uint64", - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "denominator#0" - ] - }, - "1517": { - "op": "bury 4", - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ] - }, - "1519": { - "block": "get_coupons_status_after_if_else@6", - "stack_in": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "0" - ] - }, - "1520": { - "op": "bytec 31 // \"total_coupons\"", - "defined_out": [ - "\"total_coupons\"", - "0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "0", - "\"total_coupons\"" - ] - }, - "1522": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1523": { - "error": "check self.total_coupons exists", - "op": "assert // check self.total_coupons exists", - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "maybe_value%0#0" - ] - }, - "1524": { - "op": "dig 1", - "defined_out": [ - "maybe_value%0#0", - "numerator#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "maybe_value%0#0", - "numerator#0" - ] - }, - "1526": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "maybe_value%0#0", - "numerator#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "maybe_value%0#0", - "aggregate%val_as_bytes%0#0" - ] - }, - "1527": { - "op": "dig 5", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "denominator#0", - "maybe_value%0#0", - "numerator#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "maybe_value%0#0", - "aggregate%val_as_bytes%0#0", - "denominator#0" - ] - }, - "1529": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0", - "denominator#0", - "maybe_value%0#0", - "numerator#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "maybe_value%0#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0" - ] - }, - "1530": { - "op": "concat", - "defined_out": [ - "aggregate%head%1#0", - "denominator#0", - "maybe_value%0#0", - "numerator#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "maybe_value%0#0", - "aggregate%head%1#0" - ] - }, - "1531": { - "op": "swap", - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "aggregate%head%1#0", - "maybe_value%0#0" - ] - }, - "1532": { - "op": "itob", - "defined_out": [ - "aggregate%head%1#0", - "aggregate%val_as_bytes%2#0", - "denominator#0", - "numerator#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "aggregate%head%1#0", - "aggregate%val_as_bytes%2#0" - ] - }, - "1533": { - "op": "dig 4", - "defined_out": [ - "aggregate%head%1#0", - "aggregate%val_as_bytes%2#0", - "denominator#0", - "due_coupons#0", - "numerator#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "aggregate%head%1#0", - "aggregate%val_as_bytes%2#0", - "due_coupons#0" - ] - }, - "1535": { - "op": "itob", - "defined_out": [ - "aggregate%head%1#0", - "aggregate%val_as_bytes%2#0", - "aggregate%val_as_bytes%3#0", - "denominator#0", - "due_coupons#0", - "numerator#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "aggregate%head%1#0", - "aggregate%val_as_bytes%2#0", - "aggregate%val_as_bytes%3#0" - ] - }, - "1536": { - "op": "concat", - "defined_out": [ - "aggregate%head%1#0", - "aggregate%head%3#0", - "denominator#0", - "due_coupons#0", - "numerator#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "aggregate%head%1#0", - "aggregate%head%3#0" - ] - }, - "1537": { - "op": "dig 3", - "defined_out": [ - "aggregate%head%1#0", - "aggregate%head%3#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "aggregate%head%1#0", - "aggregate%head%3#0", - "next_coupon_due_date#0" - ] - }, - "1539": { - "op": "itob", - "defined_out": [ - "aggregate%head%1#0", - "aggregate%head%3#0", - "aggregate%val_as_bytes%4#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "aggregate%head%1#0", - "aggregate%head%3#0", - "aggregate%val_as_bytes%4#0" - ] - }, - "1540": { - "op": "concat", - "defined_out": [ - "aggregate%head%1#0", - "aggregate%head%4#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "aggregate%head%1#0", - "aggregate%head%4#0" - ] - }, - "1541": { - "op": "swap", - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "aggregate%head%4#0", - "aggregate%head%1#0" - ] - }, - "1542": { - "op": "concat", - "defined_out": [ - "aggregate%head%5#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "aggregate%head%5#0" - ] - }, - "1543": { - "op": "bytec 30 // 0x00", - "defined_out": [ - "0x00", - "aggregate%head%5#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "aggregate%head%5#0", - "0x00" - ] - }, - "1545": { - "op": "intc_0 // 0", - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "aggregate%head%5#0", - "0x00", - "0" - ] - }, - "1546": { - "op": "dig 7", - "defined_out": [ - "0", - "0x00", - "aggregate%head%5#0", - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "aggregate%head%5#0", - "0x00", - "0", - "all_due_coupons_paid#0" - ] - }, - "1548": { - "op": "setbit", - "defined_out": [ - "aggregate%encoded_bool%0#0", - "aggregate%head%5#0", - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "aggregate%head%5#0", - "aggregate%encoded_bool%0#0" - ] - }, - "1549": { - "op": "concat", - "defined_out": [ - "aggregate%head%6#0", - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "aggregate%head%6#0" - ] - }, - "1550": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%head%6#0", - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "aggregate%head%6#0", - "0x151f7c75" - ] - }, - "1551": { - "op": "swap", - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "0x151f7c75", - "aggregate%head%6#0" - ] - }, - "1552": { - "op": "concat", - "defined_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "tmp%1#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "tmp%1#0" - ] - }, - "1553": { - "op": "log", - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ] - }, - "1554": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "1" - ] - }, - "1555": { - "op": "return", - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ] - }, - "1556": { - "block": "get_coupons_status_ternary_false@3", - "stack_in": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "due_coupons#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "due_coupons#0" - ] - }, - "1557": { - "op": "bury 3", - "defined_out": [ - "due_coupons#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ] - }, - "1559": { - "op": "b get_coupons_status_ternary_merge@4" - }, - "1562": { - "subroutine": "modules.core_financial.coupon.PerpetualCouponCashflowMixin.get_time_periods[routing]", - "params": {}, - "block": "get_time_periods", - "stack_in": [], - "op": "bytec 33 // 0x0000" - }, - "1564": { - "op": "intc_0 // 0" - }, - "1565": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"", - "0", - "time_periods#0" - ], - "stack_out": [ - "time_periods#0", - "0", - "\"status\"" - ] - }, - "1566": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0", - "time_periods#0" - ], - "stack_out": [ - "time_periods#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1567": { - "error": "check self.status exists", - "op": "assert // check self.status exists", - "stack_out": [ - "time_periods#0", - "maybe_value%0#0" - ] - }, - "1568": { - "op": "pushint 100", - "defined_out": [ - "100", - "maybe_value%0#0", - "time_periods#0" - ], - "stack_out": [ - "time_periods#0", - "maybe_value%0#0", - "100" - ] - }, - "1570": { - "op": "==", - "defined_out": [ - "time_periods#0", - "tmp%0#2" - ], - "stack_out": [ - "time_periods#0", - "tmp%0#2" - ] - }, - "1571": { - "op": "bz get_time_periods_after_if_else@3", - "stack_out": [ - "time_periods#0" - ] - }, - "1574": { - "op": "bytec 29 // 0x74696d65506572696f6473", - "defined_out": [ - "0x74696d65506572696f6473", - "time_periods#0" - ], - "stack_out": [ - "time_periods#0", - "0x74696d65506572696f6473" - ] - }, - "1576": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%1#0", - "time_periods#0" - ], - "stack_out": [ - "time_periods#0", - "time_periods#0", - "aggregate%box_get%1#0" - ] - }, - "1577": { - "op": "swap", - "stack_out": [ - "time_periods#0", - "aggregate%box_get%1#0", - "time_periods#0" - ] - }, - "1578": { - "op": "bury 2", - "stack_out": [ - "time_periods#0", - "aggregate%box_get%1#0" - ] - }, - "1580": { - "error": "check self.time_periods exists", - "op": "assert // check self.time_periods exists", - "stack_out": [ - "time_periods#0" - ] - }, - "1581": { - "block": "get_time_periods_after_if_else@3", - "stack_in": [ - "time_periods#0" - ], - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75" - ], - "stack_out": [ - "time_periods#0", - "0x151f7c75" - ] - }, - "1582": { - "op": "dig 1", - "defined_out": [ - "0x151f7c75", - "time_periods#0" - ], - "stack_out": [ - "time_periods#0", - "0x151f7c75", - "time_periods#0" - ] - }, - "1584": { - "op": "concat", - "defined_out": [ - "time_periods#0", - "tmp%1#0" - ], - "stack_out": [ - "time_periods#0", - "tmp%1#0" - ] - }, - "1585": { - "op": "log", - "stack_out": [ - "time_periods#0" - ] - }, - "1586": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "time_periods#0" - ], - "stack_out": [ - "time_periods#0", - "1" - ] - }, - "1587": { - "op": "return", - "stack_out": [ - "time_periods#0" - ] - }, - "1588": { - "subroutine": "modules.payment_agent.coupon.CouponPaymentAgentMixin.pay_coupon[routing]", - "params": {}, - "block": "pay_coupon", - "stack_in": [], - "op": "txna ApplicationArgs 1" - }, - "1591": { - "op": "dupn 2", - "defined_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0", - "holding_address#0 (copy)" - ] - }, - "1593": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0", - "len%0#0" - ] - }, - "1594": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0", - "len%0#0", - "32" - ] - }, - "1595": { - "op": "==", - "defined_out": [ - "eq%0#0", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0", - "eq%0#0" - ] - }, - "1596": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "holding_address#0", - "holding_address#0" - ] - }, - "1597": { - "op": "txna ApplicationArgs 2", - "defined_out": [ - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0", - "tmp%2#0" - ] - }, - "1600": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ] - }, - "1601": { - "op": "intc_0 // 0", - "stack_out": [ - "holding_address#0", - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)", - "0" - ] - }, - "1602": { - "error": "invalid array length header", - "op": "extract_uint16 // on error: invalid array length header", - "defined_out": [ - "aggregate%array_length%0#0", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0", - "tmp%2#0", - "aggregate%array_length%0#0" - ] - }, - "1603": { - "op": "pushint 2", - "defined_out": [ - "2", - "aggregate%array_length%0#0", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0", - "tmp%2#0", - "aggregate%array_length%0#0", - "2" - ] - }, - "1605": { - "op": "+", - "defined_out": [ - "add%0#0", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0", - "tmp%2#0", - "add%0#0" - ] - }, - "1606": { - "op": "dig 1", - "stack_out": [ - "holding_address#0", - "holding_address#0", - "tmp%2#0", - "add%0#0", - "tmp%2#0 (copy)" - ] - }, - "1608": { - "op": "len", - "defined_out": [ - "add%0#0", - "holding_address#0", - "len%1#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0", - "tmp%2#0", - "add%0#0", - "len%1#0" - ] - }, - "1609": { - "op": "==", - "defined_out": [ - "eq%1#0", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0", - "tmp%2#0", - "eq%1#0" - ] - }, - "1610": { - "error": "invalid number of bytes for arc4.dynamic_array", - "op": "assert // invalid number of bytes for arc4.dynamic_array", - "stack_out": [ - "holding_address#0", - "holding_address#0", - "tmp%2#0" - ] - }, - "1611": { - "op": "extract 2 0", - "defined_out": [ - "holding_address#0", - "payment_info#0" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0", - "payment_info#0" - ] - }, - "1614": { - "op": "swap", - "defined_out": [ - "holding_address#0", - "payment_info#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "holding_address#0" - ] - }, - "1615": { - "op": "intc_0 // 0", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "holding_address#0", - "0" - ] - }, - "1616": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"", - "0", - "holding_address#0", - "payment_info#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "holding_address#0", - "0", - "\"status\"" - ] - }, - "1617": { - "op": "app_global_get_ex", - "defined_out": [ - "holding_address#0", - "maybe_exists%0#0", - "maybe_value%0#0", - "payment_info#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "holding_address#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1618": { - "error": "check self.status exists", - "op": "assert // check self.status exists", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "holding_address#0", - "maybe_value%0#0" - ] - }, - "1619": { - "op": "pushint 100", - "defined_out": [ - "100", - "holding_address#0", - "maybe_value%0#0", - "payment_info#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "holding_address#0", - "maybe_value%0#0", - "100" - ] - }, - "1621": { - "op": "==", - "defined_out": [ - "holding_address#0", - "payment_info#0", - "tmp%0#9" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "holding_address#0", - "tmp%0#9" - ] - }, - "1622": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "holding_address#0" - ] - }, - "1623": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "op": "callsub assert_is_not_asset_defaulted" - }, - "1626": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_suspended", - "op": "callsub assert_is_not_asset_suspended" - }, - "1629": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023", - "holding_address#0", - "payment_info#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "holding_address#0", - "0x52333023" - ] - }, - "1630": { - "op": "dig 1", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "holding_address#0", - "0x52333023", - "holding_address#0 (copy)" - ] - }, - "1632": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_info#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "holding_address#0", - "box_prefixed_key%0#3" - ] - }, - "1633": { - "op": "dup", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "holding_address#0", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3" - ] - }, - "1634": { - "op": "cover 2", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_info#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "box_prefixed_key%0#3" - ] - }, - "1636": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)", - "holding_address#0", - "payment_info#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)" - ] - }, - "1637": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#3", - "holding_address#0", - "maybe_exists%0#0", - "payment_info#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "box_prefixed_key%0#3", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "1638": { - "op": "bury 1", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "box_prefixed_key%0#3", - "maybe_exists%0#0" - ] - }, - "1640": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "box_prefixed_key%0#3" - ] - }, - "1641": { - "op": "dup", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)" - ] - }, - "1642": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0", - "box_prefixed_key%0#3", - "holding_address#0", - "payment_info#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "box_prefixed_key%0#3", - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "1643": { - "op": "pop", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "box_prefixed_key%0#3", - "aggregate%box_get%0#0" - ] - }, - "1644": { - "op": "intc_2 // 32", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "box_prefixed_key%0#3", - "aggregate%box_get%0#0", - "32" - ] - }, - "1645": { - "op": "extract_uint64", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "box_prefixed_key%0#3", - "units#2" - ] - }, - "1646": { - "op": "dup", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "box_prefixed_key%0#3", - "units#2", - "units#2" - ] - }, - "1647": { - "op": "cover 3", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "holding_address#0", - "box_prefixed_key%0#3", - "units#2" - ] - }, - "1649": { - "error": "No D-ASA units", - "op": "assert // No D-ASA units", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "holding_address#0", - "box_prefixed_key%0#3" - ] - }, - "1650": { - "callsub": "modules.core_financial.coupon.PerpetualCouponCashflowMixin.count_due_coupons", - "op": "callsub count_due_coupons", - "defined_out": [ - "box_prefixed_key%0#3", - "due_coupons#0", - "holding_address#0", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "holding_address#0", - "box_prefixed_key%0#3", - "due_coupons#0" - ] - }, - "1653": { - "op": "swap", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "holding_address#0", - "due_coupons#0", - "box_prefixed_key%0#3" - ] - }, - "1654": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%2#0", - "aggregate%box_get%3#0", - "box_prefixed_key%0#3", - "due_coupons#0", - "holding_address#0", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "holding_address#0", - "due_coupons#0", - "aggregate%box_get%2#0", - "aggregate%box_get%3#0" - ] - }, - "1655": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "holding_address#0", - "due_coupons#0", - "aggregate%box_get%2#0" - ] - }, - "1656": { - "op": "pushint 48", - "defined_out": [ - "48", - "aggregate%box_get%2#0", - "box_prefixed_key%0#3", - "due_coupons#0", - "holding_address#0", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "holding_address#0", - "due_coupons#0", - "aggregate%box_get%2#0", - "48" - ] - }, - "1658": { - "op": "extract_uint64", - "defined_out": [ - "account_paid_coupons#0", - "box_prefixed_key%0#3", - "due_coupons#0", - "holding_address#0", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "holding_address#0", - "due_coupons#0", - "account_paid_coupons#0" - ] - }, - "1659": { - "op": "swap", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "holding_address#0", - "account_paid_coupons#0", - "due_coupons#0" - ] - }, - "1660": { - "op": "dig 1", - "defined_out": [ - "account_paid_coupons#0", - "account_paid_coupons#0 (copy)", - "box_prefixed_key%0#3", - "due_coupons#0", - "holding_address#0", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "holding_address#0", - "account_paid_coupons#0", - "due_coupons#0", - "account_paid_coupons#0 (copy)" - ] - }, - "1662": { - "op": ">", - "defined_out": [ - "account_paid_coupons#0", - "box_prefixed_key%0#3", - "holding_address#0", - "payment_info#0", - "tmp%3#3", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "holding_address#0", - "account_paid_coupons#0", - "tmp%3#3" - ] - }, - "1663": { - "error": "No due coupon to pay", - "op": "assert // No due coupon to pay", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "holding_address#0", - "account_paid_coupons#0" - ] - }, - "1664": { - "callsub": "modules.core_financial.coupon.CouponCashflowMixin.all_due_coupons_paid", - "op": "callsub all_due_coupons_paid", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_info#0", - "tmp%4#2", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "holding_address#0", - "tmp%4#2" - ] - }, - "1667": { - "error": "Pending due coupon payment", - "op": "assert // Pending due coupon payment", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "holding_address#0" - ] - }, - "1668": { - "callsub": "modules.accounting.AccountingModule.account_total_units_value", - "op": "callsub account_total_units_value", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_info#0", - "principal_amount#0", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "principal_amount#0" - ] - }, - "1671": { - "op": "intc_0 // 0", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "principal_amount#0", - "0" - ] - }, - "1672": { - "op": "bytec 5 // \"interest_rate\"", - "defined_out": [ - "\"interest_rate\"", - "0", - "box_prefixed_key%0#3", - "holding_address#0", - "payment_info#0", - "principal_amount#0", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "principal_amount#0", - "0", - "\"interest_rate\"" - ] - }, - "1674": { - "op": "app_global_get_ex", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "principal_amount#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1675": { - "error": "check self.interest_rate exists", - "op": "assert // check self.interest_rate exists", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "principal_amount#0", - "maybe_value%0#0" - ] - }, - "1676": { - "op": "*", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_info#0", - "tmp%0#1", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "tmp%0#1" - ] - }, - "1677": { - "op": "intc 4 // 10000", - "defined_out": [ - "10000", - "box_prefixed_key%0#3", - "holding_address#0", - "payment_info#0", - "tmp%0#1", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "tmp%0#1", - "10000" - ] - }, - "1679": { - "op": "/", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_amount#1", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1" - ] - }, - "1680": { - "op": "intc_0 // 0", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "0" - ] - }, - "1681": { - "op": "bytec 21 // 0x52323523", - "defined_out": [ - "0", - "0x52323523", - "box_prefixed_key%0#3", - "holding_address#0", - "payment_amount#1", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "0", - "0x52323523" - ] - }, - "1683": { - "op": "app_global_get_ex", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "maybe_exists%0#0", - "maybe_value%0#5", - "payment_amount#1", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#5", - "maybe_exists%0#0" - ] - }, - "1684": { - "error": "check self.op_daemon exists", - "op": "assert // check self.op_daemon exists", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#5" - ] - }, - "1685": { - "op": "global ZeroAddress", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "maybe_value%0#5", - "payment_amount#1", - "payment_info#0", - "tmp%0#3", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#5", - "tmp%0#3" - ] - }, - "1687": { - "op": "!=", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_amount#1", - "payment_info#0", - "tmp%1#2", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%1#2" - ] - }, - "1688": { - "op": "bz pay_coupon_after_if_else@22", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1" - ] - }, - "1691": { - "op": "txn Sender", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_amount#1", - "payment_info#0", - "tmp%2#3", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%2#3" - ] - }, - "1693": { - "op": "intc_0 // 0", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%2#3", - "0" - ] - }, - "1694": { - "op": "bytec 21 // 0x52323523", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%2#3", - "0", - "0x52323523" - ] - }, - "1696": { - "op": "app_global_get_ex", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "maybe_exists%1#1", - "maybe_value%1#1", - "payment_amount#1", - "payment_info#0", - "tmp%2#3", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%2#3", - "maybe_value%1#1", - "maybe_exists%1#1" - ] - }, - "1697": { - "error": "check self.op_daemon exists", - "op": "assert // check self.op_daemon exists", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%2#3", - "maybe_value%1#1" - ] - }, - "1698": { - "op": "==", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%3#3" - ] - }, - "1699": { - "op": "bnz pay_coupon_bool_true@19", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1" - ] - }, - "1702": { - "op": "txn Sender", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_amount#1", - "payment_info#0", - "tmp%4#3", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%4#3" - ] - }, - "1704": { - "op": "dig 5", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%4#3", - "holding_address#0" - ] - }, - "1706": { - "op": "==", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_amount#1", - "payment_info#0", - "tmp%5#1", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%5#1" - ] - }, - "1707": { - "op": "bnz pay_coupon_bool_true@19", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1" - ] - }, - "1710": { - "op": "txn Sender", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_amount#1", - "payment_info#0", - "tmp%6#0", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%6#0" - ] - }, - "1712": { - "op": "dig 3", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%6#0", - "box_prefixed_key%0#3" - ] - }, - "1714": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%4#0", - "aggregate%box_get%5#0", - "box_prefixed_key%0#3", - "holding_address#0", - "payment_amount#1", - "payment_info#0", - "tmp%6#0", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%6#0", - "aggregate%box_get%4#0", - "aggregate%box_get%5#0" - ] - }, - "1715": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%6#0", - "aggregate%box_get%4#0" - ] - }, - "1716": { - "op": "extract 0 32", - "defined_out": [ - "aggregate%extract%2#0", - "box_prefixed_key%0#3", - "holding_address#0", - "payment_amount#1", - "payment_info#0", - "tmp%6#0", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%6#0", - "aggregate%extract%2#0" - ] - }, - "1719": { - "op": "==", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_amount#1", - "payment_info#0", - "tmp%7#0", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%7#0" - ] - }, - "1720": { - "op": "bz pay_coupon_bool_false@20", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1" - ] - }, - "1723": { - "block": "pay_coupon_bool_true@19", - "stack_in": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1" - ], - "op": "intc_1 // 1", - "defined_out": [ - "or_result%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "or_result%0#0" - ] - }, - "1724": { - "error": "Not authorized", - "block": "pay_coupon_bool_merge@21", - "stack_in": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "or_result%0#0" - ], - "op": "assert // Not authorized", - "defined_out": [], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1" - ] - }, - "1725": { - "block": "pay_coupon_after_if_else@22", - "stack_in": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1" - ], - "op": "dig 2", - "defined_out": [ - "box_prefixed_key%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "box_prefixed_key%0#3" - ] - }, - "1727": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%6#0", - "aggregate%box_get%7#0", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%box_get%6#0", - "aggregate%box_get%7#0" - ] - }, - "1728": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%box_get%6#0" - ] - }, - "1729": { - "op": "extract 0 32", - "defined_out": [ - "aggregate%extract%3#0", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%extract%3#0" - ] - }, - "1732": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "aggregate%extract%3#0", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%extract%3#0", - "0" - ] - }, - "1733": { - "op": "bytec 14 // \"settlement_asset_id\"", - "defined_out": [ - "\"settlement_asset_id\"", - "0", - "aggregate%extract%3#0", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%extract%3#0", - "0", - "\"settlement_asset_id\"" - ] - }, - "1735": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%extract%3#0", - "box_prefixed_key%0#3", - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%extract%3#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1736": { - "error": "check self.settlement_asset_id exists", - "op": "assert // check self.settlement_asset_id exists", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%extract%3#0", - "maybe_value%0#0" - ] - }, - "1737": { - "op": "asset_holding_get AssetBalance", - "defined_out": [ - "box_prefixed_key%0#3", - "tmp%0#1", - "tmp%1#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#1", - "tmp%1#2" - ] - }, - "1739": { - "op": "bury 1", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%1#2" - ] - }, - "1741": { - "op": "bz pay_coupon_bool_false@27", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1" - ] - }, - "1744": { - "op": "dig 2", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "box_prefixed_key%0#3" - ] - }, - "1746": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%8#0", - "aggregate%box_get%9#0", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%box_get%8#0", - "aggregate%box_get%9#0" - ] - }, - "1747": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%box_get%8#0" - ] - }, - "1748": { - "op": "pushint 448", - "defined_out": [ - "448", - "aggregate%box_get%8#0", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%box_get%8#0", - "448" - ] - }, - "1751": { - "op": "getbit", - "defined_out": [ - "aggregate%get_bit%0#0", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%get_bit%0#0" - ] - }, - "1752": { - "op": "bnz pay_coupon_bool_false@27", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1" - ] - }, - "1755": { - "op": "intc_1 // 1", - "defined_out": [ - "and_result%0#0", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "and_result%0#0" - ] - }, - "1756": { - "block": "pay_coupon_bool_merge@28", - "stack_in": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "and_result%0#0" - ], - "op": "bz pay_coupon_else_body@3", - "defined_out": [], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1" - ] - }, - "1759": { - "op": "global CurrentApplicationAddress", - "defined_out": [ - "tmp%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#3" - ] - }, - "1761": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "tmp%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#3", - "0" - ] - }, - "1762": { - "op": "bytec 14 // \"settlement_asset_id\"", - "defined_out": [ - "\"settlement_asset_id\"", - "0", - "tmp%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#3", - "0", - "\"settlement_asset_id\"" - ] - }, - "1764": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0", - "tmp%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#3", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1765": { - "error": "check self.settlement_asset_id exists", - "op": "assert // check self.settlement_asset_id exists", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#3", - "maybe_value%0#0" - ] - }, - "1766": { - "op": "swap", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "tmp%0#3" - ] - }, - "1767": { - "op": "dig 1", - "defined_out": [ - "maybe_value%0#0", - "maybe_value%0#0 (copy)", - "tmp%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "tmp%0#3", - "maybe_value%0#0 (copy)" - ] - }, - "1769": { - "op": "asset_holding_get AssetBalance", - "defined_out": [ - "check%0#0", - "maybe_value%0#0", - "value%0#1" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "value%0#1", - "check%0#0" - ] - }, - "1771": { - "error": "account opted into asset", - "op": "assert // account opted into asset", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "value%0#1" - ] - }, - "1772": { - "op": "dig 2", - "defined_out": [ - "maybe_value%0#0", - "payment_amount#1", - "value%0#1" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "value%0#1", - "payment_amount#1" - ] - }, - "1774": { - "op": "dup", - "defined_out": [ - "maybe_value%0#0", - "payment_amount#1", - "payment_amount#1 (copy)", - "value%0#1" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "value%0#1", - "payment_amount#1 (copy)", - "payment_amount#1 (copy)" - ] - }, - "1775": { - "op": "cover 2", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "payment_amount#1", - "value%0#1", - "payment_amount#1 (copy)" - ] - }, - "1777": { - "op": ">=", - "defined_out": [ - "maybe_value%0#0", - "payment_amount#1", - "tmp%1#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "payment_amount#1", - "tmp%1#2" - ] - }, - "1778": { - "error": "Not enough funds for the payment", - "op": "assert // Not enough funds for the payment", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "payment_amount#1" - ] - }, - "1779": { - "op": "dig 4", - "defined_out": [ - "box_prefixed_key%0#3", - "maybe_value%0#0", - "payment_amount#1" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "payment_amount#1", - "box_prefixed_key%0#3" - ] - }, - "1781": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%10#0", - "aggregate%box_get%11#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "payment_amount#1" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "payment_amount#1", - "aggregate%box_get%10#0", - "aggregate%box_get%11#0" - ] - }, - "1782": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "payment_amount#1", - "aggregate%box_get%10#0" - ] - }, - "1783": { - "op": "extract 0 32", - "defined_out": [ - "box_prefixed_key%0#3", - "maybe_value%0#0", - "payment_amount#1", - "receiver#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "payment_amount#1", - "receiver#0" - ] - }, - "1786": { - "op": "itxn_begin" - }, - "1787": { - "op": "global MinTxnFee", - "defined_out": [ - "box_prefixed_key%0#3", - "inner_txn_params%0%%param_Fee_idx_0#0", - "maybe_value%0#0", - "payment_amount#1", - "receiver#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "payment_amount#1", - "receiver#0", - "inner_txn_params%0%%param_Fee_idx_0#0" - ] - }, - "1789": { - "op": "uncover 2", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "receiver#0", - "inner_txn_params%0%%param_Fee_idx_0#0", - "payment_amount#1" - ] - }, - "1791": { - "op": "itxn_field AssetAmount", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "receiver#0", - "inner_txn_params%0%%param_Fee_idx_0#0" - ] - }, - "1793": { - "op": "swap", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "inner_txn_params%0%%param_Fee_idx_0#0", - "receiver#0" - ] - }, - "1794": { - "op": "itxn_field AssetReceiver", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "inner_txn_params%0%%param_Fee_idx_0#0" - ] - }, - "1796": { - "op": "swap", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "inner_txn_params%0%%param_Fee_idx_0#0", - "maybe_value%0#0" - ] - }, - "1797": { - "op": "itxn_field XferAsset", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "inner_txn_params%0%%param_Fee_idx_0#0" - ] - }, - "1799": { - "op": "pushint 4 // axfer", - "defined_out": [ - "axfer", - "box_prefixed_key%0#3", - "inner_txn_params%0%%param_Fee_idx_0#0", - "payment_amount#1" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "inner_txn_params%0%%param_Fee_idx_0#0", - "axfer" - ] - }, - "1801": { - "op": "itxn_field TypeEnum", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "inner_txn_params%0%%param_Fee_idx_0#0" - ] - }, - "1803": { - "op": "itxn_field Fee", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1" - ] - }, - "1805": { - "op": "itxn_submit" - }, - "1806": { - "block": "pay_coupon_after_if_else@4", - "stack_in": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1" - ], - "op": "dig 2", - "defined_out": [ - "box_prefixed_key%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "box_prefixed_key%0#3" - ] - }, - "1808": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)" - ] - }, - "1809": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%12#0", - "aggregate%box_get%13#0", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "box_prefixed_key%0#3", - "aggregate%box_get%12#0", - "aggregate%box_get%13#0" - ] - }, - "1810": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "box_prefixed_key%0#3", - "aggregate%box_get%12#0" - ] - }, - "1811": { - "op": "pushint 48", - "defined_out": [ - "48", - "aggregate%box_get%12#0", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "box_prefixed_key%0#3", - "aggregate%box_get%12#0", - "48" - ] - }, - "1813": { - "op": "extract_uint64", - "defined_out": [ - "box_prefixed_key%0#3", - "values%0#1" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "box_prefixed_key%0#3", - "values%0#1" - ] - }, - "1814": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "box_prefixed_key%0#3", - "values%0#1" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "box_prefixed_key%0#3", - "values%0#1", - "1" - ] - }, - "1815": { - "op": "+", - "defined_out": [ - "box_prefixed_key%0#3", - "tmp%0#1" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "box_prefixed_key%0#3", - "tmp%0#1" - ] - }, - "1816": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "box_prefixed_key%0#3", - "aggregate%val_as_bytes%0#0" - ] - }, - "1817": { - "op": "pushint 48" - }, - "1819": { - "op": "swap", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "box_prefixed_key%0#3", - "48", - "aggregate%val_as_bytes%0#0" - ] - }, - "1820": { - "op": "box_replace", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1" - ] - }, - "1821": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "0" - ] - }, - "1822": { - "op": "bytec 28 // \"paid_coupon_units\"", - "defined_out": [ - "\"paid_coupon_units\"", - "0", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "0", - "\"paid_coupon_units\"" - ] - }, - "1824": { - "op": "app_global_get_ex", - "defined_out": [ - "box_prefixed_key%0#3", - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1825": { - "error": "check self.paid_coupon_units exists", - "op": "assert // check self.paid_coupon_units exists", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0" - ] - }, - "1826": { - "op": "dig 2", - "defined_out": [ - "box_prefixed_key%0#3", - "maybe_value%0#0", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "units#2" - ] - }, - "1828": { - "op": "+", - "defined_out": [ - "box_prefixed_key%0#3", - "tmp%1#0", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%1#0" - ] - }, - "1829": { - "op": "bytec 28 // \"paid_coupon_units\"", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%1#0", - "\"paid_coupon_units\"" - ] - }, - "1831": { - "op": "swap", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "\"paid_coupon_units\"", - "tmp%1#0" - ] - }, - "1832": { - "op": "app_global_put", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1" - ] - }, - "1833": { - "op": "global CurrentApplicationID", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#1" - ] - }, - "1835": { - "op": "global LatestTimestamp", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#1", - "tmp%1#0" - ] - }, - "1837": { - "op": "intc_0 // 0", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#1", - "tmp%1#0", - "0" - ] - }, - "1838": { - "op": "bytec 24 // \"denomination_asset_id\"", - "defined_out": [ - "\"denomination_asset_id\"", - "0", - "box_prefixed_key%0#3", - "tmp%0#1", - "tmp%1#0", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#1", - "tmp%1#0", - "0", - "\"denomination_asset_id\"" - ] - }, - "1840": { - "op": "app_global_get_ex", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#1", - "tmp%1#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1841": { - "error": "check self.denomination_asset_id exists", - "op": "assert // check self.denomination_asset_id exists", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#1", - "tmp%1#0", - "maybe_value%0#0" - ] - }, - "1842": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#3", - "maybe_value%0#0", - "maybe_value%0#0 (copy)", - "tmp%0#1", - "tmp%1#0", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#1", - "tmp%1#0", - "maybe_value%0#0", - "maybe_value%0#0 (copy)" - ] - }, - "1843": { - "op": "asset_params_get AssetUnitName", - "defined_out": [ - "box_prefixed_key%0#3", - "check%0#0", - "maybe_value%0#0", - "tmp%0#1", - "tmp%1#0", - "units#2", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#1", - "tmp%1#0", - "maybe_value%0#0", - "value%0#0", - "check%0#0" - ] - }, - "1845": { - "error": "asset exists", - "op": "assert // asset exists", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#1", - "tmp%1#0", - "maybe_value%0#0", - "value%0#0" - ] - }, - "1846": { - "op": "intc_0 // 0", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#1", - "tmp%1#0", - "maybe_value%0#0", - "value%0#0", - "0" - ] - }, - "1847": { - "op": "bytec 4 // \"circulating_units\"", - "defined_out": [ - "\"circulating_units\"", - "0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "tmp%0#1", - "tmp%1#0", - "units#2", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#1", - "tmp%1#0", - "maybe_value%0#0", - "value%0#0", - "0", - "\"circulating_units\"" - ] - }, - "1849": { - "op": "app_global_get_ex", - "defined_out": [ - "box_prefixed_key%0#3", - "maybe_exists%2#0", - "maybe_value%0#0", - "maybe_value%2#0", - "tmp%0#1", - "tmp%1#0", - "units#2", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#1", - "tmp%1#0", - "maybe_value%0#0", - "value%0#0", - "maybe_value%2#0", - "maybe_exists%2#0" - ] - }, - "1850": { - "error": "check self.circulating_units exists", - "op": "assert // check self.circulating_units exists", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#1", - "tmp%1#0", - "maybe_value%0#0", - "value%0#0", - "maybe_value%2#0" - ] - }, - "1851": { - "op": "intc_0 // 0", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#1", - "tmp%1#0", - "maybe_value%0#0", - "value%0#0", - "maybe_value%2#0", - "0" - ] - }, - "1852": { - "op": "bytec 7 // \"unit_value\"", - "defined_out": [ - "\"unit_value\"", - "0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "maybe_value%2#0", - "tmp%0#1", - "tmp%1#0", - "units#2", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#1", - "tmp%1#0", - "maybe_value%0#0", - "value%0#0", - "maybe_value%2#0", - "0", - "\"unit_value\"" - ] - }, - "1854": { - "op": "app_global_get_ex", - "defined_out": [ - "box_prefixed_key%0#3", - "maybe_exists%3#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1", - "tmp%1#0", - "units#2", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#1", - "tmp%1#0", - "maybe_value%0#0", - "value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_exists%3#0" - ] - }, - "1855": { - "error": "check self.unit_value exists", - "op": "assert // check self.unit_value exists", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#1", - "tmp%1#0", - "maybe_value%0#0", - "value%0#0", - "maybe_value%2#0", - "maybe_value%3#0" - ] - }, - "1856": { - "op": "*", - "defined_out": [ - "box_prefixed_key%0#3", - "maybe_value%0#0", - "tmp%0#1", - "tmp%1#0", - "tmp%2#2", - "units#2", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#1", - "tmp%1#0", - "maybe_value%0#0", - "value%0#0", - "tmp%2#2" - ] - }, - "1857": { - "op": "uncover 4", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%1#0", - "maybe_value%0#0", - "value%0#0", - "tmp%2#2", - "tmp%0#1" - ] - }, - "1859": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "tmp%1#0", - "tmp%2#2", - "units#2", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%1#0", - "maybe_value%0#0", - "value%0#0", - "tmp%2#2", - "aggregate%val_as_bytes%1#0" - ] - }, - "1860": { - "op": "pushbytes 0x080037", - "defined_out": [ - "0x080037", - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "tmp%1#0", - "tmp%2#2", - "units#2", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%1#0", - "maybe_value%0#0", - "value%0#0", - "tmp%2#2", - "aggregate%val_as_bytes%1#0", - "0x080037" - ] - }, - "1865": { - "op": "concat", - "defined_out": [ - "aggregate%head%2#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "tmp%1#0", - "tmp%2#2", - "units#2", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%1#0", - "maybe_value%0#0", - "value%0#0", - "tmp%2#2", - "aggregate%head%2#0" - ] - }, - "1866": { - "op": "uncover 4", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "value%0#0", - "tmp%2#2", - "aggregate%head%2#0", - "tmp%1#0" - ] - }, - "1868": { - "op": "itob", - "defined_out": [ - "aggregate%head%2#0", - "aggregate%val_as_bytes%2#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "tmp%2#2", - "units#2", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "value%0#0", - "tmp%2#2", - "aggregate%head%2#0", - "aggregate%val_as_bytes%2#0" - ] - }, - "1869": { - "op": "concat", - "defined_out": [ - "aggregate%head%3#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "tmp%2#2", - "units#2", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "value%0#0", - "tmp%2#2", - "aggregate%head%3#0" - ] - }, - "1870": { - "op": "dig 4", - "defined_out": [ - "aggregate%head%3#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "payment_amount#1", - "tmp%2#2", - "units#2", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "value%0#0", - "tmp%2#2", - "aggregate%head%3#0", - "payment_amount#1" - ] - }, - "1872": { - "op": "itob", - "defined_out": [ - "aggregate%head%3#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "payment_amount#1", - "tmp%2#2", - "units#2", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "value%0#0", - "tmp%2#2", - "aggregate%head%3#0", - "aggregate%val_as_bytes%3#0" - ] - }, - "1873": { - "op": "swap", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "value%0#0", - "tmp%2#2", - "aggregate%val_as_bytes%3#0", - "aggregate%head%3#0" - ] - }, - "1874": { - "op": "dig 1", - "defined_out": [ - "aggregate%head%3#0", - "aggregate%val_as_bytes%3#0", - "aggregate%val_as_bytes%3#0 (copy)", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "payment_amount#1", - "tmp%2#2", - "units#2", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "value%0#0", - "tmp%2#2", - "aggregate%val_as_bytes%3#0", - "aggregate%head%3#0", - "aggregate%val_as_bytes%3#0 (copy)" - ] - }, - "1876": { - "op": "concat", - "defined_out": [ - "aggregate%head%4#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "payment_amount#1", - "tmp%2#2", - "units#2", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "value%0#0", - "tmp%2#2", - "aggregate%val_as_bytes%3#0", - "aggregate%head%4#0" - ] - }, - "1877": { - "op": "uncover 4", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "value%0#0", - "tmp%2#2", - "aggregate%val_as_bytes%3#0", - "aggregate%head%4#0", - "maybe_value%0#0" - ] - }, - "1879": { - "op": "itob", - "defined_out": [ - "aggregate%head%4#0", - "aggregate%val_as_bytes%3#0", - "aggregate%val_as_bytes%4#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "tmp%2#2", - "units#2", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "value%0#0", - "tmp%2#2", - "aggregate%val_as_bytes%3#0", - "aggregate%head%4#0", - "aggregate%val_as_bytes%4#0" - ] - }, - "1880": { - "op": "concat", - "defined_out": [ - "aggregate%head%5#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "tmp%2#2", - "units#2", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "value%0#0", - "tmp%2#2", - "aggregate%val_as_bytes%3#0", - "aggregate%head%5#0" - ] - }, - "1881": { - "op": "dig 3", - "defined_out": [ - "aggregate%head%5#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "tmp%2#2", - "units#2", - "value%0#0", - "value%0#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "value%0#0", - "tmp%2#2", - "aggregate%val_as_bytes%3#0", - "aggregate%head%5#0", - "value%0#0 (copy)" - ] - }, - "1883": { - "op": "len", - "defined_out": [ - "aggregate%head%5#0", - "aggregate%length%1#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "tmp%2#2", - "units#2", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "value%0#0", - "tmp%2#2", - "aggregate%val_as_bytes%3#0", - "aggregate%head%5#0", - "aggregate%length%1#0" - ] - }, - "1884": { - "op": "itob", - "defined_out": [ - "aggregate%as_bytes%2#0", - "aggregate%head%5#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "tmp%2#2", - "units#2", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "value%0#0", - "tmp%2#2", - "aggregate%val_as_bytes%3#0", - "aggregate%head%5#0", - "aggregate%as_bytes%2#0" - ] - }, - "1885": { - "op": "extract 6 2", - "defined_out": [ - "aggregate%head%5#0", - "aggregate%length_uint16%1#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "tmp%2#2", - "units#2", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "value%0#0", - "tmp%2#2", - "aggregate%val_as_bytes%3#0", - "aggregate%head%5#0", - "aggregate%length_uint16%1#0" - ] - }, - "1888": { - "op": "uncover 4", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%2#2", - "aggregate%val_as_bytes%3#0", - "aggregate%head%5#0", - "aggregate%length_uint16%1#0", - "value%0#0" - ] - }, - "1890": { - "op": "concat", - "defined_out": [ - "aggregate%encoded_value%1#0", - "aggregate%head%5#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "tmp%2#2", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%2#2", - "aggregate%val_as_bytes%3#0", - "aggregate%head%5#0", - "aggregate%encoded_value%1#0" - ] - }, - "1891": { - "op": "swap", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%2#2", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%5#0" - ] - }, - "1892": { - "op": "pushbytes 0x003b", - "defined_out": [ - "0x003b", - "aggregate%encoded_value%1#0", - "aggregate%head%5#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "tmp%2#2", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%2#2", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%5#0", - "0x003b" - ] - }, - "1896": { - "op": "concat", - "defined_out": [ - "aggregate%encoded_value%1#0", - "aggregate%head%6#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "tmp%2#2", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%2#2", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%6#0" - ] - }, - "1897": { - "op": "uncover 3", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%6#0", - "tmp%2#2" - ] - }, - "1899": { - "op": "itob", - "defined_out": [ - "aggregate%encoded_value%1#0", - "aggregate%head%6#0", - "aggregate%val_as_bytes%3#0", - "aggregate%val_as_bytes%5#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%6#0", - "aggregate%val_as_bytes%5#0" - ] - }, - "1900": { - "op": "concat", - "defined_out": [ - "aggregate%encoded_value%1#0", - "aggregate%head%7#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%7#0" - ] - }, - "1901": { - "op": "bytec 33 // 0x0000", - "defined_out": [ - "0x0000", - "aggregate%encoded_value%1#0", - "aggregate%head%7#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%7#0", - "0x0000" - ] - }, - "1903": { - "op": "concat", - "defined_out": [ - "aggregate%encoded_value%1#0", - "aggregate%head%8#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%8#0" - ] - }, - "1904": { - "op": "intc_0 // 0", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%8#0", - "0" - ] - }, - "1905": { - "op": "itob", - "defined_out": [ - "aggregate%encoded_value%1#0", - "aggregate%head%8#0", - "aggregate%val_as_bytes%3#0", - "aggregate%val_as_bytes%6#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%8#0", - "aggregate%val_as_bytes%6#0" - ] - }, - "1906": { - "op": "concat", - "defined_out": [ - "aggregate%encoded_value%1#0", - "aggregate%head%9#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%9#0" - ] - }, - "1907": { - "op": "pushbytes 0x00024950", - "defined_out": [ - "0x00024950", - "aggregate%encoded_value%1#0", - "aggregate%head%9#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%9#0", - "0x00024950" - ] - }, - "1913": { - "op": "concat", - "defined_out": [ - "aggregate%concat%0#0", - "aggregate%encoded_value%1#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%concat%0#0" - ] - }, - "1914": { - "op": "swap", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%val_as_bytes%3#0", - "aggregate%concat%0#0", - "aggregate%encoded_value%1#0" - ] - }, - "1915": { - "op": "concat", - "defined_out": [ - "aggregate%concat%1#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%val_as_bytes%3#0", - "aggregate%concat%1#0" - ] - }, - "1916": { - "op": "pushbytes 0x8c29904e // method \"Event(uint64,uint8,string,uint64,uint64,uint64,byte[],uint64,uint16,uint64)\"", - "defined_out": [ - "Method(Event(uint64,uint8,string,uint64,uint64,uint64,byte[],uint64,uint16,uint64))", - "aggregate%concat%1#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%val_as_bytes%3#0", - "aggregate%concat%1#0", - "Method(Event(uint64,uint8,string,uint64,uint64,uint64,byte[],uint64,uint16,uint64))" - ] - }, - "1922": { - "op": "swap", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%val_as_bytes%3#0", - "Method(Event(uint64,uint8,string,uint64,uint64,uint64,byte[],uint64,uint16,uint64))", - "aggregate%concat%1#0" - ] - }, - "1923": { - "op": "concat", - "defined_out": [ - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "event%0#0", - "payment_amount#1", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%val_as_bytes%3#0", - "event%0#0" - ] - }, - "1924": { - "op": "log", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%val_as_bytes%3#0" - ] - }, - "1925": { - "op": "global LatestTimestamp", - "defined_out": [ - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "tmp%3#1", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%val_as_bytes%3#0", - "tmp%3#1" - ] - }, - "1927": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%3#0", - "aggregate%val_as_bytes%8#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%val_as_bytes%3#0", - "aggregate%val_as_bytes%8#0" - ] - }, - "1928": { - "op": "concat", - "defined_out": [ - "aggregate%head%11#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%head%11#0" - ] - }, - "1929": { - "op": "dig 4", - "defined_out": [ - "aggregate%head%11#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%head%11#0", - "payment_info#0" - ] - }, - "1931": { - "op": "dup", - "defined_out": [ - "aggregate%head%11#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "payment_info#0", - "payment_info#0 (copy)", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%head%11#0", - "payment_info#0", - "payment_info#0 (copy)" - ] - }, - "1932": { - "op": "len", - "defined_out": [ - "aggregate%head%11#0", - "aggregate%length%2#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%head%11#0", - "payment_info#0", - "aggregate%length%2#0" - ] - }, - "1933": { - "op": "itob", - "defined_out": [ - "aggregate%as_bytes%4#0", - "aggregate%head%11#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%head%11#0", - "payment_info#0", - "aggregate%as_bytes%4#0" - ] - }, - "1934": { - "op": "extract 6 2", - "defined_out": [ - "aggregate%head%11#0", - "aggregate%length_uint16%2#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%head%11#0", - "payment_info#0", - "aggregate%length_uint16%2#0" - ] - }, - "1937": { - "op": "swap", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%head%11#0", - "aggregate%length_uint16%2#0", - "payment_info#0" - ] - }, - "1938": { - "op": "concat", - "defined_out": [ - "aggregate%encoded_value%2#0", - "aggregate%head%11#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%head%11#0", - "aggregate%encoded_value%2#0" - ] - }, - "1939": { - "op": "swap", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%encoded_value%2#0", - "aggregate%head%11#0" - ] - }, - "1940": { - "op": "pushbytes 0x0012", - "defined_out": [ - "0x0012", - "aggregate%encoded_value%2#0", - "aggregate%head%11#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%encoded_value%2#0", - "aggregate%head%11#0", - "0x0012" - ] - }, - "1944": { - "op": "concat", - "defined_out": [ - "aggregate%encoded_value%2#0", - "aggregate%head%12#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%encoded_value%2#0", - "aggregate%head%12#0" - ] - }, - "1945": { - "op": "swap", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%head%12#0", - "aggregate%encoded_value%2#0" - ] - }, - "1946": { - "op": "concat", - "defined_out": [ - "aggregate%concat%2#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%concat%2#0" - ] - }, - "1947": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%concat%2#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%concat%2#0", - "0x151f7c75" - ] - }, - "1948": { - "op": "swap", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "0x151f7c75", - "aggregate%concat%2#0" - ] - }, - "1949": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#3", - "payment_amount#1", - "payment_info#0", - "tmp%5#0", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%5#0" - ] - }, - "1950": { - "op": "log", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1" - ] - }, - "1951": { - "op": "intc_1 // 1", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "1" - ] - }, - "1952": { - "op": "return", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1" - ] - }, - "1953": { - "block": "pay_coupon_else_body@3", - "stack_in": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1" - ], - "op": "intc_0 // 0", - "defined_out": [ - "payment_amount#1" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "payment_amount#1" - ] - }, - "1954": { - "op": "bury 1", - "defined_out": [ - "payment_amount#1" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1" - ] - }, - "1956": { - "op": "b pay_coupon_after_if_else@4" - }, - "1959": { - "block": "pay_coupon_bool_false@27", - "stack_in": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1" - ], - "op": "intc_0 // 0", - "defined_out": [ - "and_result%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "and_result%0#0" - ] - }, - "1960": { - "op": "b pay_coupon_bool_merge@28" - }, - "1963": { - "block": "pay_coupon_bool_false@20", - "stack_in": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1" - ], - "op": "intc_0 // 0", - "defined_out": [ - "or_result%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "or_result%0#0" - ] - }, - "1964": { - "op": "b pay_coupon_bool_merge@21" - }, - "1967": { - "subroutine": "modules.transfer_agent.coupon.CouponTransferAgentMixin.asset_transfer[routing]", - "params": {}, - "block": "asset_transfer", - "stack_in": [], - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%extract%1#0" - ] - }, - "1968": { - "op": "dupn 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3" - ] - }, - "1970": { - "op": "pushbytes \"\"", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0" - ] - }, - "1972": { - "op": "dup", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0" - ] - }, - "1973": { - "op": "txna ApplicationArgs 1" - }, - "1976": { - "op": "dup", - "defined_out": [ - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "sender_holding_address#0" - ] - }, - "1977": { - "op": "len", - "defined_out": [ - "len%0#0", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "len%0#0" - ] - }, - "1978": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "len%0#0", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "len%0#0", - "32" - ] - }, - "1979": { - "op": "==", - "defined_out": [ - "eq%0#0", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "eq%0#0" - ] - }, - "1980": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0" - ] - }, - "1981": { - "op": "txna ApplicationArgs 2" - }, - "1984": { - "op": "dup", - "defined_out": [ - "receiver_holding_address#0", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "receiver_holding_address#0" - ] - }, - "1985": { - "op": "len", - "defined_out": [ - "len%1#0", - "receiver_holding_address#0", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "len%1#0" - ] - }, - "1986": { - "op": "intc_2 // 32", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "len%1#0", - "32" - ] - }, - "1987": { - "op": "==", - "defined_out": [ - "eq%1#0", - "receiver_holding_address#0", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "eq%1#0" - ] - }, - "1988": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0" - ] - }, - "1989": { - "op": "txna ApplicationArgs 3", - "defined_out": [ - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%4#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "tmp%4#0" - ] - }, - "1992": { - "op": "dup", - "defined_out": [ - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%4#0", - "tmp%4#0 (copy)" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "tmp%4#0", - "tmp%4#0 (copy)" - ] - }, - "1993": { - "op": "len", - "defined_out": [ - "len%2#0", - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%4#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "tmp%4#0", - "len%2#0" - ] - }, - "1994": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "len%2#0", - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%4#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "tmp%4#0", - "len%2#0", - "8" - ] - }, - "1995": { - "op": "==", - "defined_out": [ - "eq%2#0", - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%4#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "tmp%4#0", - "eq%2#0" - ] - }, - "1996": { - "error": "invalid number of bytes for arc4.uint64", - "op": "assert // invalid number of bytes for arc4.uint64", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "tmp%4#0" - ] - }, - "1997": { - "op": "btoi", - "defined_out": [ - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "1998": { - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "0" - ] - }, - "1999": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"", - "0", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "0", - "\"status\"" - ] - }, - "2000": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2001": { - "error": "check self.status exists", - "op": "assert // check self.status exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "maybe_value%0#0" - ] - }, - "2002": { - "op": "pushint 100", - "defined_out": [ - "100", - "maybe_value%0#0", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "maybe_value%0#0", - "100" - ] - }, - "2004": { - "op": "==", - "defined_out": [ - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%0#1", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%0#1" - ] - }, - "2005": { - "op": "bz asset_transfer_bool_false@6", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "2008": { - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "0" - ] - }, - "2009": { - "op": "bytec 16 // \"secondary_market_opening_date\"", - "defined_out": [ - "\"secondary_market_opening_date\"", - "0", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "0", - "\"secondary_market_opening_date\"" - ] - }, - "2011": { - "op": "app_global_get_ex", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2012": { - "error": "check self.secondary_market_opening_date exists", - "op": "assert // check self.secondary_market_opening_date exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "maybe_value%0#0" - ] - }, - "2013": { - "op": "global LatestTimestamp", - "defined_out": [ - "maybe_value%0#0", - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "maybe_value%0#0", - "tmp%1#1" - ] - }, - "2015": { - "op": "<=", - "defined_out": [ - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%2#2", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%2#2" - ] - }, - "2016": { - "op": "bz asset_transfer_bool_false@6", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "2019": { - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "0" - ] - }, - "2020": { - "op": "bytec 9 // \"secondary_market_closure_date\"", - "defined_out": [ - "\"secondary_market_closure_date\"", - "0", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "0", - "\"secondary_market_closure_date\"" - ] - }, - "2022": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%1#0", - "maybe_value%1#0", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "2023": { - "error": "check self.secondary_market_closure_date exists", - "op": "assert // check self.secondary_market_closure_date exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "maybe_value%1#0" - ] - }, - "2024": { - "op": "bz asset_transfer_bool_true@5", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "2027": { - "op": "global LatestTimestamp", - "defined_out": [ - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%4#1", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%4#1" - ] - }, - "2029": { - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%4#1", - "0" - ] - }, - "2030": { - "op": "bytec 9 // \"secondary_market_closure_date\"", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%4#1", - "0", - "\"secondary_market_closure_date\"" - ] - }, - "2032": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%2#0", - "maybe_value%2#0", - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%4#1", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%4#1", - "maybe_value%2#0", - "maybe_exists%2#0" - ] - }, - "2033": { - "error": "check self.secondary_market_closure_date exists", - "op": "assert // check self.secondary_market_closure_date exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%4#1", - "maybe_value%2#0" - ] - }, - "2034": { - "op": "<", - "defined_out": [ - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%5#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%5#0" - ] - }, - "2035": { - "op": "bz asset_transfer_bool_false@6", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "2038": { - "block": "asset_transfer_bool_true@5", - "stack_in": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ], - "op": "intc_1 // 1", - "defined_out": [ - "and_result%0#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "and_result%0#0" - ] - }, - "2039": { - "error": "Secondary market is closed", - "block": "asset_transfer_bool_merge@7", - "stack_in": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "and_result%0#0" - ], - "op": "assert // Secondary market is closed", - "defined_out": [], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "2040": { - "op": "txn Sender", - "defined_out": [ - "tmp%0#3" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%0#3" - ] - }, - "2042": { - "op": "dig 3", - "defined_out": [ - "sender_holding_address#0", - "tmp%0#3" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%0#3", - "sender_holding_address#0" - ] - }, - "2044": { - "op": "dup", - "defined_out": [ - "sender_holding_address#0", - "sender_holding_address#0 (copy)", - "tmp%0#3" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%0#3", - "sender_holding_address#0 (copy)", - "sender_holding_address#0 (copy)" - ] - }, - "2045": { - "op": "cover 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "tmp%0#3", - "sender_holding_address#0 (copy)" - ] - }, - "2047": { - "op": "==", - "defined_out": [ - "sender_holding_address#0", - "tmp%1#4" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "tmp%1#4" - ] - }, - "2048": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0" - ] - }, - "2049": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "op": "callsub assert_is_not_asset_defaulted" - }, - "2052": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_suspended", - "op": "callsub assert_is_not_asset_suspended" - }, - "2055": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "0x52333023" - ] - }, - "2056": { - "op": "dig 1", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "0x52333023", - "sender_holding_address#0 (copy)" - ] - }, - "2058": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#2", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2" - ] - }, - "2059": { - "op": "dup", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#2" - ] - }, - "2060": { - "op": "bury 9", - "defined_out": [ - "box_prefixed_key%0#2", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2" - ] - }, - "2062": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#2", - "box_prefixed_key%0#2 (copy)", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#2 (copy)" - ] - }, - "2063": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#2", - "maybe_exists%0#0", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "2064": { - "op": "bury 1", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "maybe_exists%0#0" - ] - }, - "2066": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2" - ] - }, - "2067": { - "op": "bytec_1 // 0x52333023", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "0x52333023" - ] - }, - "2068": { - "op": "dig 4", - "defined_out": [ - "0x52333023", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "0x52333023", - "receiver_holding_address#0" - ] - }, - "2070": { - "op": "dup", - "defined_out": [ - "0x52333023", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "receiver_holding_address#0 (copy)", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "0x52333023", - "receiver_holding_address#0 (copy)", - "receiver_holding_address#0 (copy)" - ] - }, - "2071": { - "op": "cover 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "0x52333023", - "receiver_holding_address#0 (copy)" - ] - }, - "2073": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "box_prefixed_key%0#3" - ] - }, - "2074": { - "op": "dup", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3" - ] - }, - "2075": { - "op": "bury 10", - "defined_out": [ - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "box_prefixed_key%0#3" - ] - }, - "2077": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)", - "receiver_holding_address#0", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)" - ] - }, - "2078": { - "op": "box_len", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "box_prefixed_key%0#3", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "2079": { - "op": "bury 1", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "box_prefixed_key%0#3", - "maybe_exists%0#0" - ] - }, - "2081": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "box_prefixed_key%0#3" - ] - }, - "2082": { - "op": "dig 3", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "box_prefixed_key%0#3", - "sender_holding_address#0 (copy)" - ] - }, - "2084": { - "callsub": "modules.accounting.AccountingModule.assert_is_not_account_suspended", - "op": "callsub assert_is_not_account_suspended", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "box_prefixed_key%0#3" - ] - }, - "2087": { - "op": "dig 1", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "box_prefixed_key%0#3", - "receiver_holding_address#0 (copy)" - ] - }, - "2089": { - "callsub": "modules.accounting.AccountingModule.assert_is_not_account_suspended", - "op": "callsub assert_is_not_account_suspended", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "box_prefixed_key%0#3" - ] - }, - "2092": { - "op": "uncover 3", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "box_prefixed_key%0#3", - "sender_holding_address#0" - ] - }, - "2094": { - "op": "uncover 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "sender_holding_address#0", - "receiver_holding_address#0" - ] - }, - "2096": { - "op": "!=", - "defined_out": [ - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%0#1" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "tmp%0#1" - ] - }, - "2097": { - "error": "Sender and receiver must be different", - "op": "assert // Sender and receiver must be different", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3" - ] - }, - "2098": { - "op": "dig 2", - "defined_out": [ - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "units#0" - ] - }, - "2100": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0", - "units#0 (copy)" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "units#0", - "units#0 (copy)" - ] - }, - "2101": { - "error": "Transfer units must be greater than zero", - "op": "assert // Transfer units must be greater than zero", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "units#0" - ] - }, - "2102": { - "op": "uncover 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "units#0", - "box_prefixed_key%0#2" - ] - }, - "2104": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "units#0", - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "2105": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "units#0", - "aggregate%box_get%0#0" - ] - }, - "2106": { - "op": "dup", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%0#0 (copy)", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "units#0", - "aggregate%box_get%0#0", - "aggregate%box_get%0#0 (copy)" - ] - }, - "2107": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "aggregate%box_get%0#0", - "aggregate%box_get%0#0 (copy)", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "units#0", - "aggregate%box_get%0#0", - "aggregate%box_get%0#0 (copy)", - "32" - ] - }, - "2108": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%box_get%0#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0", - "values%0#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "units#0", - "aggregate%box_get%0#0", - "values%0#0" - ] - }, - "2109": { - "op": "uncover 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "aggregate%box_get%0#0", - "values%0#0", - "units#0" - ] - }, - "2111": { - "op": ">=", - "defined_out": [ - "aggregate%box_get%0#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%2#2", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "aggregate%box_get%0#0", - "tmp%2#2" - ] - }, - "2112": { - "error": "Insufficient sender units to transfer", - "op": "assert // Insufficient sender units to transfer", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "aggregate%box_get%0#0" - ] - }, - "2113": { - "op": "extract 40 8", - "defined_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "aggregate%extract%1#0" - ] - }, - "2116": { - "op": "bury 9", - "defined_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3" - ] - }, - "2118": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%4#0", - "aggregate%box_get%5#0", - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%box_get%4#0", - "aggregate%box_get%5#0" - ] - }, - "2119": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%box_get%4#0" - ] - }, - "2120": { - "op": "intc_2 // 32", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%box_get%4#0", - "32" - ] - }, - "2121": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0", - "values%1#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%1#0" - ] - }, - "2122": { - "op": "bz asset_transfer_else_body@9", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "2125": { - "op": "dig 6", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2" - ] - }, - "2127": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%6#0", - "aggregate%box_get%7#0", - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%box_get%6#0", - "aggregate%box_get%7#0" - ] - }, - "2128": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%box_get%6#0" - ] - }, - "2129": { - "op": "pushint 40", - "defined_out": [ - "40", - "aggregate%box_get%6#0", - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%box_get%6#0", - "40" - ] - }, - "2131": { - "op": "extract_uint64", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%0#0" - ] - }, - "2132": { - "op": "dig 6", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%0#0", - "box_prefixed_key%0#3" - ] - }, - "2134": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%8#0", - "aggregate%box_get%9#0", - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0", - "values%0#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%0#0", - "aggregate%box_get%8#0", - "aggregate%box_get%9#0" - ] - }, - "2135": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%0#0", - "aggregate%box_get%8#0" - ] - }, - "2136": { - "op": "pushint 40", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%0#0", - "aggregate%box_get%8#0", - "40" - ] - }, - "2138": { - "op": "extract_uint64", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%0#0", - "values%1#0" - ] - }, - "2139": { - "op": "==", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%0#1" - ] - }, - "2140": { - "op": "bz asset_transfer_bool_false@20", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "2143": { - "op": "dig 6", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2" - ] - }, - "2145": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%10#0", - "aggregate%box_get%11#0", - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%box_get%10#0", - "aggregate%box_get%11#0" - ] - }, - "2146": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%box_get%10#0" - ] - }, - "2147": { - "op": "pushint 48", - "defined_out": [ - "48", - "aggregate%box_get%10#0", - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%box_get%10#0", - "48" - ] - }, - "2149": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0", - "values%2#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%2#0" - ] - }, - "2150": { - "op": "dig 6", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%2#0", - "box_prefixed_key%0#3" - ] - }, - "2152": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%12#0", - "aggregate%box_get%13#0", - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0", - "values%2#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%2#0", - "aggregate%box_get%12#0", - "aggregate%box_get%13#0" - ] - }, - "2153": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%2#0", - "aggregate%box_get%12#0" - ] - }, - "2154": { - "op": "pushint 48", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%2#0", - "aggregate%box_get%12#0", - "48" - ] - }, - "2156": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0", - "values%2#0", - "values%3#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%2#0", - "values%3#0" - ] - }, - "2157": { - "op": "==", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%1#4" - ] - }, - "2158": { - "op": "bz asset_transfer_bool_false@20", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "2161": { - "op": "intc_1 // 1", - "defined_out": [ - "aggregate%extract%1#0", - "and_result%0#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "and_result%0#0" - ] - }, - "2162": { - "error": "Sender and receiver units are not fungible", - "block": "asset_transfer_bool_merge@21", - "stack_in": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "and_result%0#0" - ], - "op": "assert // Sender and receiver units are not fungible", - "defined_out": [], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "2163": { - "block": "asset_transfer_after_if_else@10", - "stack_in": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ], - "op": "dig 6", - "defined_out": [ - "box_prefixed_key%0#2" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2" - ] - }, - "2165": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#2", - "box_prefixed_key%0#2 (copy)" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#2 (copy)" - ] - }, - "2166": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%16#0", - "aggregate%box_get%17#0", - "box_prefixed_key%0#2" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "aggregate%box_get%16#0", - "aggregate%box_get%17#0" - ] - }, - "2167": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "aggregate%box_get%16#0" - ] - }, - "2168": { - "op": "pushint 40", - "defined_out": [ - "40", - "aggregate%box_get%16#0", - "box_prefixed_key%0#2" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "aggregate%box_get%16#0", - "40" - ] - }, - "2170": { - "op": "extract_uint64", - "defined_out": [ - "box_prefixed_key%0#2", - "sender_unit_value#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "sender_unit_value#0" - ] - }, - "2171": { - "op": "bury 5", - "defined_out": [ - "box_prefixed_key%0#2", - "sender_unit_value#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2" - ] - }, - "2173": { - "callsub": "modules.core_financial.coupon.PerpetualCouponCashflowMixin.count_due_coupons", - "op": "callsub count_due_coupons", - "defined_out": [ - "box_prefixed_key%0#2", - "due_coupons#0", - "sender_unit_value#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "due_coupons#0" - ] - }, - "2176": { - "op": "dig 4", - "defined_out": [ - "box_prefixed_key%0#2", - "due_coupons#0", - "sender_holding_address#0", - "sender_unit_value#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "due_coupons#0", - "sender_holding_address#0" - ] - }, - "2178": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#2", - "due_coupons#0", - "sender_holding_address#0", - "sender_holding_address#0 (copy)", - "sender_unit_value#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "due_coupons#0", - "sender_holding_address#0 (copy)", - "sender_holding_address#0 (copy)" - ] - }, - "2179": { - "op": "cover 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "due_coupons#0", - "sender_holding_address#0 (copy)" - ] - }, - "2181": { - "op": "dig 1", - "defined_out": [ - "box_prefixed_key%0#2", - "due_coupons#0", - "due_coupons#0 (copy)", - "sender_holding_address#0", - "sender_holding_address#0 (copy)", - "sender_unit_value#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "due_coupons#0", - "sender_holding_address#0 (copy)", - "due_coupons#0 (copy)" - ] - }, - "2183": { - "callsub": "modules.core_financial.coupon.CouponCashflowMixin.assert_no_pending_coupon_payment", - "op": "callsub assert_no_pending_coupon_payment", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "due_coupons#0" - ] - }, - "2186": { - "op": "swap", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "due_coupons#0", - "sender_holding_address#0" - ] - }, - "2187": { - "op": "dig 3", - "defined_out": [ - "box_prefixed_key%0#2", - "due_coupons#0", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "due_coupons#0", - "sender_holding_address#0", - "units#0" - ] - }, - "2189": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#2", - "due_coupons#0", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0", - "units#0 (copy)" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "due_coupons#0", - "sender_holding_address#0", - "units#0 (copy)", - "units#0 (copy)" - ] - }, - "2190": { - "op": "cover 3", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "units#0", - "due_coupons#0", - "sender_holding_address#0", - "units#0 (copy)" - ] - }, - "2192": { - "op": "uncover 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "units#0", - "sender_holding_address#0", - "units#0 (copy)", - "due_coupons#0" - ] - }, - "2194": { - "callsub": "modules.core_financial.coupon.PerpetualCouponCashflowMixin.accrued_interest_amount", - "op": "callsub accrued_interest_amount", - "defined_out": [ - "accrued_interest#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "units#0", - "accrued_interest#0" - ] - }, - "2197": { - "op": "bury 7", - "defined_out": [ - "accrued_interest#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "units#0" - ] - }, - "2199": { - "op": "dig 1", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "units#0", - "box_prefixed_key%0#2 (copy)" - ] - }, - "2201": { - "op": "box_get", - "defined_out": [ - "accrued_interest#0", - "aggregate%box_get%18#0", - "aggregate%box_get%19#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "units#0", - "aggregate%box_get%18#0", - "aggregate%box_get%19#0" - ] - }, - "2202": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "units#0", - "aggregate%box_get%18#0" - ] - }, - "2203": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "accrued_interest#0", - "aggregate%box_get%18#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "units#0", - "aggregate%box_get%18#0", - "32" - ] - }, - "2204": { - "op": "extract_uint64", - "defined_out": [ - "accrued_interest#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0", - "values%0#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "units#0", - "values%0#0" - ] - }, - "2205": { - "op": "dup2", - "defined_out": [ - "accrued_interest#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0", - "units#0 (copy)", - "values%0#0", - "values%0#0 (copy)" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "units#0", - "values%0#0", - "units#0 (copy)", - "values%0#0 (copy)" - ] - }, - "2206": { - "op": "<=", - "defined_out": [ - "accrued_interest#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "tmp%0#1", - "units#0", - "values%0#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "units#0", - "values%0#0", - "tmp%0#1" - ] - }, - "2207": { - "error": "Insufficient sender units to transfer", - "op": "assert // Insufficient sender units to transfer", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "units#0", - "values%0#0" - ] - }, - "2208": { - "op": "swap", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "values%0#0", - "units#0" - ] - }, - "2209": { - "op": "-", - "defined_out": [ - "accrued_interest#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "tmp%1#1" - ] - }, - "2210": { - "op": "itob", - "defined_out": [ - "accrued_interest#0", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "aggregate%val_as_bytes%0#0" - ] - }, - "2211": { - "op": "dig 1", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#2 (copy)" - ] - }, - "2213": { - "op": "intc_2 // 32", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#2 (copy)", - "32" - ] - }, - "2214": { - "op": "uncover 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#2 (copy)", - "32", - "aggregate%val_as_bytes%0#0" - ] - }, - "2216": { - "op": "box_replace", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2" - ] - }, - "2217": { - "op": "box_get", - "defined_out": [ - "accrued_interest#0", - "aggregate%box_get%22#0", - "aggregate%box_get%23#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%box_get%22#0", - "aggregate%box_get%23#0" - ] - }, - "2218": { - "op": "pop", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%box_get%22#0" - ] - }, - "2219": { - "op": "intc_2 // 32", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%box_get%22#0", - "32" - ] - }, - "2220": { - "op": "extract_uint64", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%0#0" - ] - }, - "2221": { - "op": "bnz asset_transfer_after_if_else@16", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "2224": { - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "0" - ] - }, - "2225": { - "op": "itob", - "defined_out": [ - "accrued_interest#0", - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%val_as_bytes%1#0" - ] - }, - "2226": { - "op": "dig 7", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#2" - ] - }, - "2228": { - "op": "dup", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#2 (copy)", - "box_prefixed_key%0#2 (copy)" - ] - }, - "2229": { - "op": "cover 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#2 (copy)" - ] - }, - "2231": { - "op": "pushint 40", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#2 (copy)", - "40" - ] - }, - "2233": { - "op": "dig 2", - "defined_out": [ - "40", - "accrued_interest#0", - "aggregate%val_as_bytes%1#0", - "aggregate%val_as_bytes%1#0 (copy)", - "box_prefixed_key%0#2", - "box_prefixed_key%0#2 (copy)", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#2 (copy)", - "40", - "aggregate%val_as_bytes%1#0 (copy)" - ] - }, - "2235": { - "op": "box_replace", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "aggregate%val_as_bytes%1#0" - ] - }, - "2236": { - "op": "pushint 48" - }, - "2238": { - "op": "swap", - "defined_out": [ - "48", - "accrued_interest#0", - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "48", - "aggregate%val_as_bytes%1#0" - ] - }, - "2239": { - "op": "box_replace", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "2240": { - "block": "asset_transfer_after_if_else@16", - "stack_in": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ], - "op": "dig 5", - "defined_out": [ - "box_prefixed_key%0#3" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3" - ] - }, - "2242": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)" - ] - }, - "2243": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%24#0", - "aggregate%box_get%25#0", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "aggregate%box_get%24#0", - "aggregate%box_get%25#0" - ] - }, - "2244": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "aggregate%box_get%24#0" - ] - }, - "2245": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "aggregate%box_get%24#0", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "aggregate%box_get%24#0", - "32" - ] - }, - "2246": { - "op": "extract_uint64", - "defined_out": [ - "box_prefixed_key%0#3", - "values%0#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "values%0#0" - ] - }, - "2247": { - "op": "dig 2", - "defined_out": [ - "box_prefixed_key%0#3", - "units#0", - "values%0#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "values%0#0", - "units#0" - ] - }, - "2249": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#3", - "units#0", - "units#0 (copy)", - "values%0#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "values%0#0", - "units#0 (copy)", - "units#0 (copy)" - ] - }, - "2250": { - "op": "cover 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "units#0", - "values%0#0", - "units#0 (copy)" - ] - }, - "2252": { - "op": "+", - "defined_out": [ - "box_prefixed_key%0#3", - "tmp%0#6", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "units#0", - "tmp%0#6" - ] - }, - "2253": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%2#0", - "box_prefixed_key%0#3", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "units#0", - "aggregate%val_as_bytes%2#0" - ] - }, - "2254": { - "op": "uncover 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "units#0", - "aggregate%val_as_bytes%2#0", - "box_prefixed_key%0#3" - ] - }, - "2256": { - "op": "intc_2 // 32", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "units#0", - "aggregate%val_as_bytes%2#0", - "box_prefixed_key%0#3", - "32" - ] - }, - "2257": { - "op": "uncover 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "units#0", - "box_prefixed_key%0#3", - "32", - "aggregate%val_as_bytes%2#0" - ] - }, - "2259": { - "op": "box_replace", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "units#0" - ] - }, - "2260": { - "op": "dig 4", - "defined_out": [ - "box_prefixed_key%0#3", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "units#0", - "sender_unit_value#0" - ] - }, - "2262": { - "op": "*", - "defined_out": [ - "box_prefixed_key%0#3", - "sender_unit_value#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%1#1" - ] - }, - "2263": { - "op": "dig 5", - "defined_out": [ - "accrued_interest#0", - "box_prefixed_key%0#3", - "sender_unit_value#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%1#1", - "accrued_interest#0" - ] - }, - "2265": { - "op": "+", - "defined_out": [ - "accrued_interest#0", - "box_prefixed_key%0#3", - "sender_unit_value#0", - "tmp%2#1", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%2#1" - ] - }, - "2266": { - "op": "itob", - "defined_out": [ - "accrued_interest#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%val_as_bytes%3#0" - ] - }, - "2267": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "accrued_interest#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%val_as_bytes%3#0", - "0x151f7c75" - ] - }, - "2268": { - "op": "swap", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "0x151f7c75", - "aggregate%val_as_bytes%3#0" - ] - }, - "2269": { - "op": "concat", - "defined_out": [ - "accrued_interest#0", - "box_prefixed_key%0#3", - "sender_unit_value#0", - "tmp%8#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%8#0" - ] - }, - "2270": { - "op": "log", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "2271": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "accrued_interest#0", - "box_prefixed_key%0#3", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "1" - ] - }, - "2272": { - "op": "return", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "2273": { - "block": "asset_transfer_bool_false@20", - "stack_in": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "and_result%0#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "and_result%0#0" - ] - }, - "2274": { - "op": "b asset_transfer_bool_merge@21" - }, - "2277": { - "block": "asset_transfer_else_body@9", - "stack_in": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ], - "op": "dig 5", - "defined_out": [ - "box_prefixed_key%0#3" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3" - ] - }, - "2279": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)" - ] - }, - "2280": { - "op": "pushint 40", - "defined_out": [ - "40", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)", - "40" - ] - }, - "2282": { - "op": "dig 10", - "defined_out": [ - "40", - "aggregate%extract%1#0", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)", - "40", - "aggregate%extract%1#0" - ] - }, - "2284": { - "op": "box_replace", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3" - ] - }, - "2285": { - "op": "dig 7", - "defined_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "box_prefixed_key%0#2" - ] - }, - "2287": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%14#0", - "aggregate%box_get%15#0", - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "aggregate%box_get%14#0", - "aggregate%box_get%15#0" - ] - }, - "2288": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "aggregate%box_get%14#0" - ] - }, - "2289": { - "op": "extract 48 8", - "defined_out": [ - "aggregate%extract%1#0", - "aggregate%extract%7#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "aggregate%extract%7#0" - ] - }, - "2292": { - "op": "pushint 48" - }, - "2294": { - "op": "swap", - "defined_out": [ - "48", - "aggregate%extract%1#0", - "aggregate%extract%7#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "48", - "aggregate%extract%7#0" - ] - }, - "2295": { - "op": "box_replace", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "2296": { - "op": "b asset_transfer_after_if_else@10" - }, - "2299": { - "block": "asset_transfer_bool_false@6", - "stack_in": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "and_result%0#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "and_result%0#0" - ] - }, - "2300": { - "op": "b asset_transfer_bool_merge@7" - }, - "2303": { - "subroutine": "modules.core_financial.common.CoreFinancialCommonMixin.asset_create[routing]", - "params": {}, - "block": "asset_create", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "arranger#0" - ], - "stack_out": [ - "arranger#0" - ] - }, - "2306": { - "op": "dup", - "defined_out": [ - "arranger#0", - "arranger#0 (copy)" - ], - "stack_out": [ - "arranger#0", - "arranger#0 (copy)" - ] - }, - "2307": { - "op": "len", - "defined_out": [ - "arranger#0", - "len%0#0" - ], - "stack_out": [ - "arranger#0", - "len%0#0" - ] - }, - "2308": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "arranger#0", - "len%0#0" - ], - "stack_out": [ - "arranger#0", - "len%0#0", - "32" - ] - }, - "2309": { - "op": "==", - "defined_out": [ - "arranger#0", - "eq%0#0" - ], - "stack_out": [ - "arranger#0", - "eq%0#0" - ] - }, - "2310": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "arranger#0" - ] - }, - "2311": { - "op": "txna ApplicationArgs 2", - "defined_out": [ - "arranger#0", - "metadata#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0" - ] - }, - "2314": { - "op": "dup", - "defined_out": [ - "arranger#0", - "metadata#0", - "metadata#0 (copy)" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "metadata#0 (copy)" - ] - }, - "2315": { - "op": "len", - "defined_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0" - ] - }, - "2316": { - "op": "dig 1", - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "metadata#0 (copy)" - ] - }, - "2318": { - "op": "pushint 38", - "defined_out": [ - "38", - "arranger#0", - "metadata#0", - "metadata#0 (copy)", - "tuple_len%0#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "metadata#0 (copy)", - "38" - ] - }, - "2320": { - "error": "invalid tuple encoding", - "op": "extract_uint16 // on error: invalid tuple encoding", - "defined_out": [ - "arranger#0", - "extract_uint16%0#0", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "extract_uint16%0#0" - ] - }, - "2321": { - "op": "dup", - "defined_out": [ - "arranger#0", - "extract_uint16%0#0", - "extract_uint16%0#0 (copy)", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "extract_uint16%0#0", - "extract_uint16%0#0 (copy)" - ] - }, - "2322": { - "op": "pushint 40", - "defined_out": [ - "40", - "arranger#0", - "extract_uint16%0#0", - "extract_uint16%0#0 (copy)", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "extract_uint16%0#0", - "extract_uint16%0#0 (copy)", - "40" - ] - }, - "2324": { - "op": "==", - "defined_out": [ - "arranger#0", - "eq%1#0", - "extract_uint16%0#0", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "extract_uint16%0#0", - "eq%1#0" - ] - }, - "2325": { - "error": "invalid tail pointer at index 7 of (uint8,uint8,uint8,uint8,uint8,uint8,uint8[32],(len+utf8[]))", - "op": "assert // invalid tail pointer at index 7 of (uint8,uint8,uint8,uint8,uint8,uint8,uint8[32],(len+utf8[]))", - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "extract_uint16%0#0" - ] - }, - "2326": { - "op": "dig 2", - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "extract_uint16%0#0", - "metadata#0 (copy)" - ] - }, - "2328": { - "op": "swap", - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "metadata#0 (copy)", - "extract_uint16%0#0" - ] - }, - "2329": { - "op": "dig 2", - "defined_out": [ - "arranger#0", - "extract_uint16%0#0", - "metadata#0", - "metadata#0 (copy)", - "tuple_len%0#0", - "tuple_len%0#0 (copy)" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "metadata#0 (copy)", - "extract_uint16%0#0", - "tuple_len%0#0 (copy)" - ] - }, - "2331": { - "op": "substring3", - "defined_out": [ - "arranger#0", - "metadata#0", - "substring3%0#0", - "tuple_len%0#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "substring3%0#0" - ] - }, - "2332": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "arranger#0", - "metadata#0", - "substring3%0#0", - "tuple_len%0#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "substring3%0#0", - "0" - ] - }, - "2333": { - "error": "invalid array length header", - "op": "extract_uint16 // on error: invalid array length header", - "defined_out": [ - "aggregate%array_length%0#0", - "arranger#0", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "aggregate%array_length%0#0" - ] - }, - "2334": { - "op": "pushint 42", - "defined_out": [ - "42", - "aggregate%array_length%0#0", - "arranger#0", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "aggregate%array_length%0#0", - "42" - ] - }, - "2336": { - "op": "+", - "defined_out": [ - "add%1#0", - "arranger#0", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "add%1#0" - ] - }, - "2337": { - "op": "==", - "defined_out": [ - "arranger#0", - "eq%2#0", - "metadata#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "eq%2#0" - ] - }, - "2338": { - "error": "invalid number of bytes for smart_contracts.abi_types.AssetMetadata", - "op": "assert // invalid number of bytes for smart_contracts.abi_types.AssetMetadata", - "stack_out": [ - "arranger#0", - "metadata#0" - ] - }, - "2339": { - "op": "bytec 6 // 0x52323023", - "defined_out": [ - "0x52323023", - "arranger#0", - "metadata#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "0x52323023" - ] - }, - "2341": { - "op": "uncover 2", - "stack_out": [ - "metadata#0", - "0x52323023", - "arranger#0" - ] - }, - "2343": { - "op": "app_global_put", - "stack_out": [ - "metadata#0" - ] - }, - "2344": { - "op": "bytec 25 // \"metadata\"", - "defined_out": [ - "\"metadata\"", - "metadata#0" - ], - "stack_out": [ - "metadata#0", - "\"metadata\"" - ] - }, - "2346": { - "op": "swap", - "stack_out": [ - "\"metadata\"", - "metadata#0" - ] - }, - "2347": { - "op": "app_global_put", - "stack_out": [] - }, - "2348": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "2349": { - "op": "return", - "stack_out": [] - }, - "2350": { - "subroutine": "modules.core_financial.common.CoreFinancialCommonMixin.asset_update[routing]", - "params": {}, - "block": "asset_update", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "metadata#0" - ], - "stack_out": [ - "metadata#0" - ] - }, - "2353": { - "op": "dup", - "defined_out": [ - "metadata#0", - "metadata#0 (copy)" - ], - "stack_out": [ - "metadata#0", - "metadata#0 (copy)" - ] - }, - "2354": { - "op": "len", - "defined_out": [ - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "metadata#0", - "tuple_len%0#0" - ] - }, - "2355": { - "op": "dig 1", - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "metadata#0 (copy)" - ] - }, - "2357": { - "op": "pushint 38", - "defined_out": [ - "38", - "metadata#0", - "metadata#0 (copy)", - "tuple_len%0#0" - ], - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "metadata#0 (copy)", - "38" - ] - }, - "2359": { - "error": "invalid tuple encoding", - "op": "extract_uint16 // on error: invalid tuple encoding", - "defined_out": [ - "extract_uint16%0#0", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "extract_uint16%0#0" - ] - }, - "2360": { - "op": "dup", - "defined_out": [ - "extract_uint16%0#0", - "extract_uint16%0#0 (copy)", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "extract_uint16%0#0", - "extract_uint16%0#0 (copy)" - ] - }, - "2361": { - "op": "pushint 40", - "defined_out": [ - "40", - "extract_uint16%0#0", - "extract_uint16%0#0 (copy)", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "extract_uint16%0#0", - "extract_uint16%0#0 (copy)", - "40" - ] - }, - "2363": { - "op": "==", - "defined_out": [ - "eq%0#0", - "extract_uint16%0#0", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "extract_uint16%0#0", - "eq%0#0" - ] - }, - "2364": { - "error": "invalid tail pointer at index 7 of (uint8,uint8,uint8,uint8,uint8,uint8,uint8[32],(len+utf8[]))", - "op": "assert // invalid tail pointer at index 7 of (uint8,uint8,uint8,uint8,uint8,uint8,uint8[32],(len+utf8[]))", - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "extract_uint16%0#0" - ] - }, - "2365": { - "op": "dig 2", - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "extract_uint16%0#0", - "metadata#0 (copy)" - ] - }, - "2367": { - "op": "swap", - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "metadata#0 (copy)", - "extract_uint16%0#0" - ] - }, - "2368": { - "op": "dig 2", - "defined_out": [ - "extract_uint16%0#0", - "metadata#0", - "metadata#0 (copy)", - "tuple_len%0#0", - "tuple_len%0#0 (copy)" - ], - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "metadata#0 (copy)", - "extract_uint16%0#0", - "tuple_len%0#0 (copy)" - ] - }, - "2370": { - "op": "substring3", - "defined_out": [ - "metadata#0", - "substring3%0#0", - "tuple_len%0#0" - ], - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "substring3%0#0" - ] - }, - "2371": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "metadata#0", - "substring3%0#0", - "tuple_len%0#0" - ], - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "substring3%0#0", - "0" - ] - }, - "2372": { - "error": "invalid array length header", - "op": "extract_uint16 // on error: invalid array length header", - "defined_out": [ - "aggregate%array_length%0#0", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "aggregate%array_length%0#0" - ] - }, - "2373": { - "op": "pushint 42", - "defined_out": [ - "42", - "aggregate%array_length%0#0", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "aggregate%array_length%0#0", - "42" - ] - }, - "2375": { - "op": "+", - "defined_out": [ - "add%1#0", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "add%1#0" - ] - }, - "2376": { - "op": "==", - "defined_out": [ - "eq%1#0", - "metadata#0" - ], - "stack_out": [ - "metadata#0", - "eq%1#0" - ] - }, - "2377": { - "error": "invalid number of bytes for smart_contracts.abi_types.AssetMetadata", - "op": "assert // invalid number of bytes for smart_contracts.abi_types.AssetMetadata", - "stack_out": [ - "metadata#0" - ] - }, - "2378": { - "callsub": "modules.rbac.RbacModule.assert_caller_is_arranger", - "op": "callsub assert_caller_is_arranger" - }, - "2381": { - "op": "bytec 25 // \"metadata\"", - "defined_out": [ - "\"metadata\"", - "metadata#0" - ], - "stack_out": [ - "metadata#0", - "\"metadata\"" - ] - }, - "2383": { - "op": "swap", - "stack_out": [ - "\"metadata\"", - "metadata#0" - ] - }, - "2384": { - "op": "app_global_put", - "stack_out": [] - }, - "2385": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "2386": { - "op": "return", - "stack_out": [] - }, - "2387": { - "subroutine": "modules.core_financial.common.CoreFinancialCommonMixin.set_secondary_time_events[routing]", - "params": {}, - "block": "set_secondary_time_events", - "stack_in": [], - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%array_trimmed%0#0" - ] - }, - "2388": { - "op": "txna ApplicationArgs 1" - }, - "2391": { - "op": "dupn 2", - "defined_out": [ - "secondary_market_time_events#0", - "secondary_market_time_events#0 (copy)" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0 (copy)" - ] - }, - "2393": { - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0 (copy)", - "0" - ] - }, - "2394": { - "error": "invalid array length header", - "op": "extract_uint16 // on error: invalid array length header", - "defined_out": [ - "aggregate%array_length%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0" - ] - }, - "2395": { - "op": "dup", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%0#0 (copy)", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "aggregate%array_length%0#0 (copy)" - ] - }, - "2396": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "aggregate%array_length%0#0", - "aggregate%array_length%0#0 (copy)", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "aggregate%array_length%0#0 (copy)", - "8" - ] - }, - "2397": { - "op": "*", - "defined_out": [ - "aggregate%array_length%0#0", - "mul%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "mul%0#0" - ] - }, - "2398": { - "op": "pushint 2", - "defined_out": [ - "2", - "aggregate%array_length%0#0", - "mul%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "mul%0#0", - "2" - ] - }, - "2400": { - "op": "+", - "defined_out": [ - "add%0#0", - "aggregate%array_length%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "add%0#0" - ] - }, - "2401": { - "op": "uncover 2", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "add%0#0", - "secondary_market_time_events#0" - ] - }, - "2403": { - "op": "len", - "defined_out": [ - "add%0#0", - "aggregate%array_length%0#0", - "len%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "add%0#0", - "len%0#0" - ] - }, - "2404": { - "op": "==", - "defined_out": [ - "aggregate%array_length%0#0", - "eq%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "eq%0#0" - ] - }, - "2405": { - "error": "invalid number of bytes for arc4.dynamic_array", - "op": "assert // invalid number of bytes for arc4.dynamic_array", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0" - ] - }, - "2406": { - "callsub": "modules.rbac.RbacModule.assert_caller_is_arranger", - "op": "callsub assert_caller_is_arranger" - }, - "2409": { - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "0" - ] - }, - "2410": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"", - "0", - "aggregate%array_length%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "0", - "\"status\"" - ] - }, - "2411": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%array_length%0#0", - "maybe_exists%0#0", - "maybe_value%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2412": { - "error": "check self.status exists", - "op": "assert // check self.status exists", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "maybe_value%0#0" - ] - }, - "2413": { - "op": "intc 5 // 200", - "defined_out": [ - "200", - "aggregate%array_length%0#0", - "maybe_value%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "maybe_value%0#0", - "200" - ] - }, - "2415": { - "op": "==", - "defined_out": [ - "aggregate%array_length%0#0", - "secondary_market_time_events#0", - "tmp%0#2" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "tmp%0#2" - ] - }, - "2416": { - "op": "!", - "defined_out": [ - "aggregate%array_length%0#0", - "secondary_market_time_events#0", - "tmp%1#1" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "tmp%1#1" - ] - }, - "2417": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0" - ] - }, - "2418": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "op": "callsub assert_is_not_asset_defaulted" - }, - "2421": { - "op": "dup", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "aggregate%array_length%0#0 (copy)" - ] - }, - "2422": { - "error": "Time events length is invalid", - "op": "assert // Time events length is invalid", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0" - ] - }, - "2423": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "aggregate%array_length%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "1" - ] - }, - "2424": { - "op": ">", - "defined_out": [ - "secondary_market_time_events#0", - "tmp%5#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "tmp%5#0" - ] - }, - "2425": { - "op": "bz set_secondary_time_events_after_if_else@3", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0" - ] - }, - "2428": { - "op": "dup", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0" - ] - }, - "2429": { - "callsub": "modules.core_financial.common.CoreFinancialCommonMixin.assert_time_events_sorted", - "op": "callsub assert_time_events_sorted" - }, - "2432": { - "op": "bury 1", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0" - ] - }, - "2434": { - "block": "set_secondary_time_events_after_if_else@3", - "stack_in": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "0" - ] - }, - "2435": { - "op": "bytec_3 // \"issuance_date\"", - "defined_out": [ - "\"issuance_date\"", - "0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "0", - "\"issuance_date\"" - ] - }, - "2436": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2437": { - "error": "check self.issuance_date exists", - "op": "assert // check self.issuance_date exists", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%0#0" - ] - }, - "2438": { - "op": "dig 1", - "defined_out": [ - "maybe_value%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%0#0", - "secondary_market_time_events#0" - ] - }, - "2440": { - "op": "dup", - "defined_out": [ - "maybe_value%0#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0 (copy)" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%0#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0 (copy)" - ] - }, - "2441": { - "op": "extract 2 0", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "maybe_value%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%0#0", - "secondary_market_time_events#0", - "aggregate%array_trimmed%0#0" - ] - }, - "2444": { - "op": "bury 4", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "maybe_value%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%0#0", - "secondary_market_time_events#0" - ] - }, - "2446": { - "op": "pushint 2", - "defined_out": [ - "2", - "aggregate%array_trimmed%0#0", - "maybe_value%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%0#0", - "secondary_market_time_events#0", - "2" - ] - }, - "2448": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "maybe_value%0#0", - "secondary_market_time_events#0", - "values%0#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%0#0", - "values%0#0" - ] - }, - "2449": { - "op": "swap", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "values%0#0", - "maybe_value%0#0" - ] - }, - "2450": { - "op": "dig 1", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "maybe_value%0#0", - "secondary_market_time_events#0", - "values%0#0", - "values%0#0 (copy)" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "values%0#0", - "maybe_value%0#0", - "values%0#0 (copy)" - ] - }, - "2452": { - "op": "<=", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "tmp%6#0", - "values%0#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "values%0#0", - "tmp%6#0" - ] - }, - "2453": { - "error": "Invalid secondary market opening date", - "op": "assert // Invalid secondary market opening date", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "values%0#0" - ] - }, - "2454": { - "op": "bytec 16 // \"secondary_market_opening_date\"", - "defined_out": [ - "\"secondary_market_opening_date\"", - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "values%0#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "values%0#0", - "\"secondary_market_opening_date\"" - ] - }, - "2456": { - "op": "swap", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "\"secondary_market_opening_date\"", - "values%0#0" - ] - }, - "2457": { - "op": "app_global_put", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0" - ] - }, - "2458": { - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "0" - ] - }, - "2459": { - "op": "bytec 10 // \"maturity_date\"", - "defined_out": [ - "\"maturity_date\"", - "0", - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "0", - "\"maturity_date\"" - ] - }, - "2461": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "maybe_exists%1#0", - "maybe_value%1#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "2462": { - "error": "check self.maturity_date exists", - "op": "assert // check self.maturity_date exists", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%1#0" - ] - }, - "2463": { - "op": "bz set_secondary_time_events_after_if_else@5", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0" - ] - }, - "2466": { - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "0" - ] - }, - "2467": { - "op": "bytec 10 // \"maturity_date\"", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "0", - "\"maturity_date\"" - ] - }, - "2469": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "maybe_exists%2#0", - "maybe_value%2#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%2#0", - "maybe_exists%2#0" - ] - }, - "2470": { - "error": "check self.maturity_date exists", - "op": "assert // check self.maturity_date exists", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%2#0" - ] - }, - "2471": { - "op": "dig 1", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%2#0", - "secondary_market_time_events#0" - ] - }, - "2473": { - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%2#0", - "secondary_market_time_events#0", - "0" - ] - }, - "2474": { - "error": "invalid array length header", - "op": "extract_uint16 // on error: invalid array length header", - "defined_out": [ - "aggregate%array_length%3#0", - "aggregate%array_trimmed%0#0", - "maybe_value%2#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%2#0", - "aggregate%array_length%3#0" - ] - }, - "2475": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "aggregate%array_length%3#0", - "aggregate%array_trimmed%0#0", - "maybe_value%2#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%2#0", - "aggregate%array_length%3#0", - "1" - ] - }, - "2476": { - "op": "-", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "maybe_value%2#0", - "secondary_market_time_events#0", - "tmp%9#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%2#0", - "tmp%9#0" - ] - }, - "2477": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "aggregate%array_trimmed%0#0", - "maybe_value%2#0", - "secondary_market_time_events#0", - "tmp%9#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%2#0", - "tmp%9#0", - "8" - ] - }, - "2478": { - "op": "*", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "aggregate%bytes_offset%1#0", - "maybe_value%2#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%2#0", - "aggregate%bytes_offset%1#0" - ] - }, - "2479": { - "op": "dig 3", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%2#0", - "aggregate%bytes_offset%1#0", - "aggregate%array_trimmed%0#0" - ] - }, - "2481": { - "op": "swap", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%2#0", - "aggregate%array_trimmed%0#0", - "aggregate%bytes_offset%1#0" - ] - }, - "2482": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "maybe_value%2#0", - "secondary_market_time_events#0", - "values%2#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%2#0", - "values%2#0" - ] - }, - "2483": { - "op": "swap", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "values%2#0", - "maybe_value%2#0" - ] - }, - "2484": { - "op": "dig 1", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "maybe_value%2#0", - "secondary_market_time_events#0", - "values%2#0", - "values%2#0 (copy)" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "values%2#0", - "maybe_value%2#0", - "values%2#0 (copy)" - ] - }, - "2486": { - "op": ">=", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "tmp%10#0", - "values%2#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "values%2#0", - "tmp%10#0" - ] - }, - "2487": { - "error": "Invalid secondary market closure date", - "op": "assert // Invalid secondary market closure date", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "values%2#0" - ] - }, - "2488": { - "op": "bytec 9 // \"secondary_market_closure_date\"", - "defined_out": [ - "\"secondary_market_closure_date\"", - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "values%2#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "values%2#0", - "\"secondary_market_closure_date\"" - ] - }, - "2490": { - "op": "swap", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "\"secondary_market_closure_date\"", - "values%2#0" - ] - }, - "2491": { - "op": "app_global_put", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0" - ] - }, - "2492": { - "block": "set_secondary_time_events_after_if_else@5", - "stack_in": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "0" - ] - }, - "2493": { - "op": "bytec 16 // \"secondary_market_opening_date\"", - "defined_out": [ - "\"secondary_market_opening_date\"", - "0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "0", - "\"secondary_market_opening_date\"" - ] - }, - "2495": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%3#0", - "maybe_value%3#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%3#0", - "maybe_exists%3#0" - ] - }, - "2496": { - "error": "check self.secondary_market_opening_date exists", - "op": "assert // check self.secondary_market_opening_date exists", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%3#0" - ] - }, - "2497": { - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%3#0", - "0" - ] - }, - "2498": { - "op": "bytec 9 // \"secondary_market_closure_date\"", - "defined_out": [ - "\"secondary_market_closure_date\"", - "0", - "maybe_value%3#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%3#0", - "0", - "\"secondary_market_closure_date\"" - ] - }, - "2500": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%4#0", - "maybe_value%3#0", - "maybe_value%4#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%3#0", - "maybe_value%4#0", - "maybe_exists%4#0" - ] - }, - "2501": { - "error": "check self.secondary_market_closure_date exists", - "op": "assert // check self.secondary_market_closure_date exists", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%3#0", - "maybe_value%4#0" - ] - }, - "2502": { - "op": "swap", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%4#0", - "maybe_value%3#0" - ] - }, - "2503": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "maybe_value%4#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%4#0", - "aggregate%val_as_bytes%0#0" - ] - }, - "2504": { - "op": "swap", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%val_as_bytes%0#0", - "maybe_value%4#0" - ] - }, - "2505": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0" - ] - }, - "2506": { - "op": "concat", - "defined_out": [ - "aggregate%head%1#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%head%1#0" - ] - }, - "2507": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%head%1#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%head%1#0", - "0x151f7c75" - ] - }, - "2508": { - "op": "swap", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "0x151f7c75", - "aggregate%head%1#0" - ] - }, - "2509": { - "op": "concat", - "defined_out": [ - "tmp%2#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "tmp%2#0" - ] - }, - "2510": { - "op": "log", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0" - ] - }, - "2511": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "1" - ] - }, - "2512": { - "op": "return", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0" - ] - }, - "2513": { - "subroutine": "modules.core_financial.common.CoreFinancialCommonMixin.set_default_status[routing]", - "params": {}, - "block": "set_default_status", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "2516": { - "op": "dup", - "defined_out": [ - "tmp%0#0", - "tmp%0#0 (copy)" - ], - "stack_out": [ - "tmp%0#0", - "tmp%0#0 (copy)" - ] - }, - "2517": { - "op": "len", - "defined_out": [ - "len%0#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "len%0#0" - ] - }, - "2518": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "len%0#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "len%0#0", - "1" - ] - }, - "2519": { - "op": "==", - "defined_out": [ - "eq%0#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "eq%0#0" - ] - }, - "2520": { - "error": "invalid number of bytes for arc4.bool", - "op": "assert // invalid number of bytes for arc4.bool", - "stack_out": [ - "tmp%0#0" - ] - }, - "2521": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "0" - ] - }, - "2522": { - "op": "getbit", - "defined_out": [ - "defaulted#0" - ], - "stack_out": [ - "defaulted#0" - ] - }, - "2523": { - "op": "bytec 19 // 0x52363023", - "defined_out": [ - "0x52363023", - "defaulted#0" - ], - "stack_out": [ - "defaulted#0", - "0x52363023" - ] - }, - "2525": { - "op": "txn Sender", - "defined_out": [ - "0x52363023", - "defaulted#0", - "tmp%0#2" - ], - "stack_out": [ - "defaulted#0", - "0x52363023", - "tmp%0#2" - ] - }, - "2527": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "defaulted#0", - "tmp%1#0" - ], - "stack_out": [ - "defaulted#0", - "tmp%1#0" - ] - }, - "2530": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "defaulted#0" - ] - }, - "2531": { - "op": "bytec 23 // \"asset_defaulted\"", - "defined_out": [ - "\"asset_defaulted\"", - "defaulted#0" - ], - "stack_out": [ - "defaulted#0", - "\"asset_defaulted\"" - ] - }, - "2533": { - "op": "swap", - "stack_out": [ - "\"asset_defaulted\"", - "defaulted#0" - ] - }, - "2534": { - "op": "app_global_put", - "stack_out": [] - }, - "2535": { - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1" - ] - }, - "2537": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0" - ] - }, - "2538": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0", - "0x151f7c75" - ] - }, - "2539": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ] - }, - "2540": { - "op": "concat", - "defined_out": [ - "tmp%4#0" - ], - "stack_out": [ - "tmp%4#0" - ] - }, - "2541": { - "op": "log", - "stack_out": [] - }, - "2542": { - "op": "intc_1 // 1", - "stack_out": [ - "1" - ] - }, - "2543": { - "op": "return", - "stack_out": [] - }, - "2544": { - "subroutine": "modules.core_financial.common.CoreFinancialCommonMixin.primary_distribution[routing]", - "params": {}, - "block": "primary_distribution", - "stack_in": [], - "op": "pushbytes \"\"", - "stack_out": [ - "awst_tmp%0#0" - ] - }, - "2546": { - "op": "txna ApplicationArgs 1" - }, - "2549": { - "op": "dup", - "defined_out": [ - "holding_address#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "holding_address#0" - ] - }, - "2550": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "len%0#0" - ] - }, - "2551": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "len%0#0", - "32" - ] - }, - "2552": { - "op": "==", - "defined_out": [ - "eq%0#0", - "holding_address#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "eq%0#0" - ] - }, - "2553": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0" - ] - }, - "2554": { - "op": "txna ApplicationArgs 2", - "defined_out": [ - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "tmp%2#0" - ] - }, - "2557": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ] - }, - "2558": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%1#0", - "tmp%2#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "tmp%2#0", - "len%1#0" - ] - }, - "2559": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "holding_address#0", - "len%1#0", - "tmp%2#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "tmp%2#0", - "len%1#0", - "8" - ] - }, - "2560": { - "op": "==", - "defined_out": [ - "eq%1#0", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "tmp%2#0", - "eq%1#0" - ] - }, - "2561": { - "error": "invalid number of bytes for arc4.uint64", - "op": "assert // invalid number of bytes for arc4.uint64", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "tmp%2#0" - ] - }, - "2562": { - "op": "btoi", - "defined_out": [ - "holding_address#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0" - ] - }, - "2563": { - "op": "intc_0 // 0", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "0" - ] - }, - "2564": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"", - "0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "0", - "\"status\"" - ] - }, - "2565": { - "op": "app_global_get_ex", - "defined_out": [ - "holding_address#0", - "maybe_exists%0#0", - "maybe_value%0#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2566": { - "error": "check self.status exists", - "op": "assert // check self.status exists", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "maybe_value%0#0" - ] - }, - "2567": { - "op": "pushint 100", - "defined_out": [ - "100", - "holding_address#0", - "maybe_value%0#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "maybe_value%0#0", - "100" - ] - }, - "2569": { - "op": "==", - "defined_out": [ - "holding_address#0", - "tmp%0#4", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%0#4" - ] - }, - "2570": { - "op": "bz primary_distribution_bool_false@5", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0" - ] - }, - "2573": { - "op": "intc_0 // 0", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "0" - ] - }, - "2574": { - "op": "bytec 8 // \"primary_distribution_opening_date\"", - "defined_out": [ - "\"primary_distribution_opening_date\"", - "0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "0", - "\"primary_distribution_opening_date\"" - ] - }, - "2576": { - "op": "app_global_get_ex", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2577": { - "error": "check self.primary_distribution_opening_date exists", - "op": "assert // check self.primary_distribution_opening_date exists", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "maybe_value%0#0" - ] - }, - "2578": { - "op": "global LatestTimestamp" - }, - "2580": { - "op": "dup", - "defined_out": [ - "awst_tmp%0#0", - "holding_address#0", - "maybe_value%0#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "maybe_value%0#0", - "awst_tmp%0#0", - "awst_tmp%0#0" - ] - }, - "2581": { - "op": "bury 5", - "defined_out": [ - "awst_tmp%0#0", - "holding_address#0", - "maybe_value%0#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "maybe_value%0#0", - "awst_tmp%0#0" - ] - }, - "2583": { - "op": "<=", - "defined_out": [ - "awst_tmp%0#0", - "holding_address#0", - "tmp%1#2", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%1#2" - ] - }, - "2584": { - "op": "bz primary_distribution_bool_false@5", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0" - ] - }, - "2587": { - "op": "intc_0 // 0", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "0" - ] - }, - "2588": { - "op": "bytec 27 // \"primary_distribution_closure_date\"", - "defined_out": [ - "\"primary_distribution_closure_date\"", - "0", - "awst_tmp%0#0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "0", - "\"primary_distribution_closure_date\"" - ] - }, - "2590": { - "op": "app_global_get_ex", - "defined_out": [ - "awst_tmp%0#0", - "holding_address#0", - "maybe_exists%1#0", - "maybe_value%1#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "2591": { - "error": "check self.primary_distribution_closure_date exists", - "op": "assert // check self.primary_distribution_closure_date exists", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "maybe_value%1#0" - ] - }, - "2592": { - "op": "dig 3", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "maybe_value%1#0", - "awst_tmp%0#0" - ] - }, - "2594": { - "op": ">", - "defined_out": [ - "awst_tmp%0#0", - "holding_address#0", - "tmp%2#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%2#1" - ] - }, - "2595": { - "op": "bz primary_distribution_bool_false@5", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0" - ] - }, - "2598": { - "op": "intc_1 // 1", - "defined_out": [ - "and_result%0#0", - "awst_tmp%0#0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "and_result%0#0" - ] - }, - "2599": { - "error": "Primary distribution is closed", - "block": "primary_distribution_bool_merge@6", - "stack_in": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "and_result%0#0" - ], - "op": "assert // Primary distribution is closed", - "defined_out": [], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0" - ] - }, - "2600": { - "op": "bytec 20 // 0x52353023", - "defined_out": [ - "0x52353023" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "0x52353023" - ] - }, - "2602": { - "op": "txn Sender", - "defined_out": [ - "0x52353023", - "tmp%0#3" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "0x52353023", - "tmp%0#3" - ] - }, - "2604": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "tmp%1#2" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%1#2" - ] - }, - "2607": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0" - ] - }, - "2608": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "0x52333023" - ] - }, - "2609": { - "op": "dig 2", - "defined_out": [ - "0x52333023", - "holding_address#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "0x52333023", - "holding_address#0" - ] - }, - "2611": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1" - ] - }, - "2612": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "holding_address#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "2613": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "holding_address#0", - "maybe_exists%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "2614": { - "op": "bury 1", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "2616": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1" - ] - }, - "2617": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "op": "callsub assert_is_not_asset_defaulted" - }, - "2620": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_suspended", - "op": "callsub assert_is_not_asset_suspended" - }, - "2623": { - "op": "dig 1", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0" - ] - }, - "2625": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "units#0", - "units#0 (copy)" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "units#0 (copy)" - ] - }, - "2626": { - "error": "Can not distribute zero units", - "op": "assert // Can not distribute zero units", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0" - ] - }, - "2627": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "box_prefixed_key%0#1", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "0" - ] - }, - "2628": { - "op": "bytec 4 // \"circulating_units\"", - "defined_out": [ - "\"circulating_units\"", - "0", - "box_prefixed_key%0#1", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "0", - "\"circulating_units\"" - ] - }, - "2630": { - "op": "app_global_get_ex", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "maybe_exists%0#0", - "maybe_value%0#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2631": { - "error": "check self.circulating_units exists", - "op": "assert // check self.circulating_units exists", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "maybe_value%0#0" - ] - }, - "2632": { - "op": "dig 1", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "maybe_value%0#0", - "units#0 (copy)" - ] - }, - "2634": { - "op": "+", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1" - ] - }, - "2635": { - "op": "intc_0 // 0", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "0" - ] - }, - "2636": { - "op": "bytec 13 // \"total_units\"", - "defined_out": [ - "\"total_units\"", - "0", - "box_prefixed_key%0#1", - "holding_address#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "0", - "\"total_units\"" - ] - }, - "2638": { - "op": "app_global_get_ex", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "maybe_exists%1#0", - "maybe_value%1#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "2639": { - "error": "check self.total_units exists", - "op": "assert // check self.total_units exists", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "maybe_value%1#0" - ] - }, - "2640": { - "op": "dig 1", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "maybe_value%1#0", - "tmp%1#1", - "tmp%1#1 (copy)", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "maybe_value%1#0", - "tmp%1#1 (copy)" - ] - }, - "2642": { - "op": ">=", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "tmp%1#1", - "tmp%2#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "tmp%2#1" - ] - }, - "2643": { - "error": "Insufficient remaining D-ASA units", - "op": "assert // Insufficient remaining D-ASA units", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1" - ] - }, - "2644": { - "op": "bytec 4 // \"circulating_units\"", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "\"circulating_units\"" - ] - }, - "2646": { - "op": "dig 1", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "\"circulating_units\"", - "tmp%1#1 (copy)" - ] - }, - "2648": { - "op": "app_global_put", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1" - ] - }, - "2649": { - "op": "dig 2", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "2651": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0", - "box_prefixed_key%0#1", - "holding_address#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "2652": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "aggregate%box_get%0#0" - ] - }, - "2653": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "aggregate%box_get%0#0", - "box_prefixed_key%0#1", - "holding_address#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "aggregate%box_get%0#0", - "32" - ] - }, - "2654": { - "op": "extract_uint64", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "tmp%1#1", - "units#0", - "values%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "values%0#0" - ] - }, - "2655": { - "op": "uncover 2", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "tmp%1#1", - "values%0#0", - "units#0" - ] - }, - "2657": { - "op": "+", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "tmp%1#1", - "tmp%4#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "tmp%1#1", - "tmp%4#1" - ] - }, - "2658": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#1", - "holding_address#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "tmp%1#1", - "aggregate%val_as_bytes%0#0" - ] - }, - "2659": { - "op": "dig 2", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "tmp%1#1", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#1 (copy)" - ] - }, - "2661": { - "op": "intc_2 // 32", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "tmp%1#1", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#1 (copy)", - "32" - ] - }, - "2662": { - "op": "uncover 2", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "tmp%1#1", - "box_prefixed_key%0#1 (copy)", - "32", - "aggregate%val_as_bytes%0#0" - ] - }, - "2664": { - "op": "box_replace", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "tmp%1#1" - ] - }, - "2665": { - "op": "intc_0 // 0", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "tmp%1#1", - "0" - ] - }, - "2666": { - "op": "bytec 7 // \"unit_value\"", - "defined_out": [ - "\"unit_value\"", - "0", - "box_prefixed_key%0#1", - "holding_address#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "tmp%1#1", - "0", - "\"unit_value\"" - ] - }, - "2668": { - "op": "app_global_get_ex", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "maybe_exists%3#0", - "maybe_value%3#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "tmp%1#1", - "maybe_value%3#0", - "maybe_exists%3#0" - ] - }, - "2669": { - "error": "check self.unit_value exists", - "op": "assert // check self.unit_value exists", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "tmp%1#1", - "maybe_value%3#0" - ] - }, - "2670": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#1", - "holding_address#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "tmp%1#1", - "aggregate%val_as_bytes%1#0" - ] - }, - "2671": { - "op": "uncover 2", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%1#1", - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#1" - ] - }, - "2673": { - "op": "pushint 40", - "defined_out": [ - "40", - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#1", - "holding_address#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%1#1", - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#1", - "40" - ] - }, - "2675": { - "op": "uncover 2", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%1#1", - "box_prefixed_key%0#1", - "40", - "aggregate%val_as_bytes%1#0" - ] - }, - "2677": { - "op": "box_replace", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%1#1" - ] - }, - "2678": { - "op": "intc_0 // 0", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%1#1", - "0" - ] - }, - "2679": { - "op": "bytec 13 // \"total_units\"", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%1#1", - "0", - "\"total_units\"" - ] - }, - "2681": { - "op": "app_global_get_ex", - "defined_out": [ - "holding_address#0", - "maybe_exists%4#0", - "maybe_value%4#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%1#1", - "maybe_value%4#0", - "maybe_exists%4#0" - ] - }, - "2682": { - "error": "check self.total_units exists", - "op": "assert // check self.total_units exists", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%1#1", - "maybe_value%4#0" - ] - }, - "2683": { - "op": "swap", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "maybe_value%4#0", - "tmp%1#1" - ] - }, - "2684": { - "op": "-", - "defined_out": [ - "holding_address#0", - "tmp%5#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%5#1" - ] - }, - "2685": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%2#0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "aggregate%val_as_bytes%2#0" - ] - }, - "2686": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%2#0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "aggregate%val_as_bytes%2#0", - "0x151f7c75" - ] - }, - "2687": { - "op": "swap", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "0x151f7c75", - "aggregate%val_as_bytes%2#0" - ] - }, - "2688": { - "op": "concat", - "defined_out": [ - "holding_address#0", - "tmp%6#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%6#0" - ] - }, - "2689": { - "op": "log", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0" - ] - }, - "2690": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "1" - ] - }, - "2691": { - "op": "return", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0" - ] - }, - "2692": { - "block": "primary_distribution_bool_false@5", - "stack_in": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "and_result%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "and_result%0#0" - ] - }, - "2693": { - "op": "b primary_distribution_bool_merge@6" - }, - "2696": { - "subroutine": "modules.core_financial.common.CoreFinancialCommonMixin.get_asset_info[routing]", - "params": {}, - "block": "get_asset_info", - "stack_in": [], - "op": "intc_0 // 0" - }, - "2697": { - "op": "global LatestTimestamp" - }, - "2699": { - "op": "intc_0 // 0" - }, - "2700": { - "op": "bytec 10 // \"maturity_date\"", - "defined_out": [ - "\"maturity_date\"", - "0", - "performance#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "tmp%0#1", - "0", - "\"maturity_date\"" - ] - }, - "2702": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0", - "performance#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "tmp%0#1", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2703": { - "op": "swap", - "stack_out": [ - "performance#0", - "tmp%0#1", - "maybe_exists%0#0", - "maybe_value%0#0" - ] - }, - "2704": { - "op": "dup", - "stack_out": [ - "performance#0", - "tmp%0#1", - "maybe_exists%0#0", - "maybe_value%0#0", - "maybe_value%0#0 (copy)" - ] - }, - "2705": { - "op": "cover 2", - "stack_out": [ - "performance#0", - "tmp%0#1", - "maybe_value%0#0", - "maybe_exists%0#0", - "maybe_value%0#0" - ] - }, - "2707": { - "op": "cover 3", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0", - "performance#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "tmp%0#1", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2709": { - "error": "check self.maturity_date exists", - "op": "assert // check self.maturity_date exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "tmp%0#1", - "maybe_value%0#0" - ] - }, - "2710": { - "op": ">", - "defined_out": [ - "maybe_value%0#0", - "performance#0", - "tmp%1#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "tmp%1#1" - ] - }, - "2711": { - "op": "bz get_asset_info_after_if_else@4", - "stack_out": [ - "performance#0", - "maybe_value%0#0" - ] - }, - "2714": { - "op": "dup", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0" - ] - }, - "2715": { - "op": "bz get_asset_info_after_if_else@4", - "stack_out": [ - "performance#0", - "maybe_value%0#0" - ] - }, - "2718": { - "op": "pushint 4", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#0" - ] - }, - "2720": { - "op": "bury 2", - "stack_out": [ - "performance#0", - "maybe_value%0#0" - ] - }, - "2722": { - "block": "get_asset_info_after_if_else@4", - "stack_in": [ - "performance#0", - "maybe_value%0#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "0" - ] - }, - "2723": { - "op": "bytec 23 // \"asset_defaulted\"", - "defined_out": [ - "\"asset_defaulted\"", - "0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "0", - "\"asset_defaulted\"" - ] - }, - "2725": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%1#0", - "maybe_value%1#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "2726": { - "error": "check self.asset_defaulted exists", - "op": "assert // check self.asset_defaulted exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%1#0" - ] - }, - "2727": { - "op": "bz get_asset_info_after_if_else@6", - "stack_out": [ - "performance#0", - "maybe_value%0#0" - ] - }, - "2730": { - "op": "pushint 3", - "defined_out": [ - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#0" - ] - }, - "2732": { - "op": "bury 2", - "defined_out": [ - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0" - ] - }, - "2734": { - "block": "get_asset_info_after_if_else@6", - "stack_in": [ - "performance#0", - "maybe_value%0#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "0" - ] - }, - "2735": { - "op": "bytec 24 // \"denomination_asset_id\"", - "defined_out": [ - "\"denomination_asset_id\"", - "0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "0", - "\"denomination_asset_id\"" - ] - }, - "2737": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%2#0", - "maybe_value%2#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_exists%2#0" - ] - }, - "2738": { - "error": "check self.denomination_asset_id exists", - "op": "assert // check self.denomination_asset_id exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0" - ] - }, - "2739": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "0" - ] - }, - "2740": { - "op": "bytec 14 // \"settlement_asset_id\"", - "defined_out": [ - "\"settlement_asset_id\"", - "0", - "maybe_value%2#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "0", - "\"settlement_asset_id\"" - ] - }, - "2742": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%3#0", - "maybe_value%2#0", - "maybe_value%3#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_exists%3#0" - ] - }, - "2743": { - "error": "check self.settlement_asset_id exists", - "op": "assert // check self.settlement_asset_id exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0" - ] - }, - "2744": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "0" - ] - }, - "2745": { - "op": "bytec 4 // \"circulating_units\"", - "defined_out": [ - "\"circulating_units\"", - "0", - "maybe_value%2#0", - "maybe_value%3#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "0", - "\"circulating_units\"" - ] - }, - "2747": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2748": { - "error": "check self.circulating_units exists", - "op": "assert // check self.circulating_units exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0" - ] - }, - "2749": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "0" - ] - }, - "2750": { - "op": "bytec 7 // \"unit_value\"", - "defined_out": [ - "\"unit_value\"", - "0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "0", - "\"unit_value\"" - ] - }, - "2752": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%1#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "2753": { - "error": "check self.unit_value exists", - "op": "assert // check self.unit_value exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0" - ] - }, - "2754": { - "op": "dup2", - "defined_out": [ - "maybe_value%0#0", - "maybe_value%0#0 (copy)", - "maybe_value%1#0", - "maybe_value%1#0 (copy)", - "maybe_value%2#0", - "maybe_value%3#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%0#0 (copy)", - "maybe_value%1#0 (copy)" - ] - }, - "2755": { - "op": "*", - "defined_out": [ - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1" - ] - }, - "2756": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "0" - ] - }, - "2757": { - "op": "bytec 15 // \"day_count_convention\"", - "defined_out": [ - "\"day_count_convention\"", - "0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "0", - "\"day_count_convention\"" - ] - }, - "2759": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%5#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%5#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "maybe_value%5#0", - "maybe_exists%5#0" - ] - }, - "2760": { - "error": "check self.day_count_convention exists", - "op": "assert // check self.day_count_convention exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "maybe_value%5#0" - ] - }, - "2761": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%val_as_bytes%0#0" - ] - }, - "2762": { - "op": "dup", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%0#0 (copy)", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%0#0 (copy)" - ] - }, - "2763": { - "op": "bitlen", - "defined_out": [ - "aggregate%bitlen%0#0", - "aggregate%val_as_bytes%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%val_as_bytes%0#0", - "aggregate%bitlen%0#0" - ] - }, - "2764": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "aggregate%bitlen%0#0", - "aggregate%val_as_bytes%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%val_as_bytes%0#0", - "aggregate%bitlen%0#0", - "8" - ] - }, - "2765": { - "op": "<=", - "defined_out": [ - "aggregate%no_overflow%0#0", - "aggregate%val_as_bytes%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%val_as_bytes%0#0", - "aggregate%no_overflow%0#0" - ] - }, - "2766": { - "error": "overflow", - "op": "assert // overflow", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%val_as_bytes%0#0" - ] - }, - "2767": { - "op": "extract 7 1", - "defined_out": [ - "aggregate%uint8%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0" - ] - }, - "2770": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "0" - ] - }, - "2771": { - "op": "bytec 26 // \"principal_discount\"", - "defined_out": [ - "\"principal_discount\"", - "0", - "aggregate%uint8%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "0", - "\"principal_discount\"" - ] - }, - "2773": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%uint8%0#0", - "maybe_exists%6#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%6#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "maybe_value%6#0", - "maybe_exists%6#0" - ] - }, - "2774": { - "error": "check self.principal_discount exists", - "op": "assert // check self.principal_discount exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "maybe_value%6#0" - ] - }, - "2775": { - "op": "itob", - "defined_out": [ - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%1#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%1#0" - ] - }, - "2776": { - "op": "dup", - "defined_out": [ - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%1#0", - "aggregate%val_as_bytes%1#0 (copy)", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%1#0", - "aggregate%val_as_bytes%1#0 (copy)" - ] - }, - "2777": { - "op": "bitlen", - "defined_out": [ - "aggregate%bitlen%1#0", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%1#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%1#0", - "aggregate%bitlen%1#0" - ] - }, - "2778": { - "op": "pushint 16", - "defined_out": [ - "16", - "aggregate%bitlen%1#0", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%1#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%1#0", - "aggregate%bitlen%1#0", - "16" - ] - }, - "2780": { - "op": "<=", - "defined_out": [ - "aggregate%no_overflow%1#0", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%1#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%1#0", - "aggregate%no_overflow%1#0" - ] - }, - "2781": { - "error": "overflow", - "op": "assert // overflow", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%1#0" - ] - }, - "2782": { - "op": "extract 6 2", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint8%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0" - ] - }, - "2785": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "0" - ] - }, - "2786": { - "op": "bytec 5 // \"interest_rate\"", - "defined_out": [ - "\"interest_rate\"", - "0", - "aggregate%uint16%0#0", - "aggregate%uint8%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "0", - "\"interest_rate\"" - ] - }, - "2788": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint8%0#0", - "maybe_exists%7#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%7#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "maybe_value%7#0", - "maybe_exists%7#0" - ] - }, - "2789": { - "error": "check self.interest_rate exists", - "op": "assert // check self.interest_rate exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "maybe_value%7#0" - ] - }, - "2790": { - "op": "itob", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%2#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%val_as_bytes%2#0" - ] - }, - "2791": { - "op": "dup", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%2#0", - "aggregate%val_as_bytes%2#0 (copy)", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%val_as_bytes%2#0", - "aggregate%val_as_bytes%2#0 (copy)" - ] - }, - "2792": { - "op": "bitlen", - "defined_out": [ - "aggregate%bitlen%2#0", - "aggregate%uint16%0#0", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%2#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%val_as_bytes%2#0", - "aggregate%bitlen%2#0" - ] - }, - "2793": { - "op": "pushint 16", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%val_as_bytes%2#0", - "aggregate%bitlen%2#0", - "16" - ] - }, - "2795": { - "op": "<=", - "defined_out": [ - "aggregate%no_overflow%2#0", - "aggregate%uint16%0#0", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%2#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%val_as_bytes%2#0", - "aggregate%no_overflow%2#0" - ] - }, - "2796": { - "error": "overflow", - "op": "assert // overflow", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%val_as_bytes%2#0" - ] - }, - "2797": { - "op": "extract 6 2", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0" - ] - }, - "2800": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "0" - ] - }, - "2801": { - "op": "bytec 13 // \"total_units\"", - "defined_out": [ - "\"total_units\"", - "0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "0", - "\"total_units\"" - ] - }, - "2803": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_exists%8#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_exists%8#0" - ] - }, - "2804": { - "error": "check self.total_units exists", - "op": "assert // check self.total_units exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0" - ] - }, - "2805": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "0" - ] - }, - "2806": { - "op": "bytec 8 // \"primary_distribution_opening_date\"", - "defined_out": [ - "\"primary_distribution_opening_date\"", - "0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "0", - "\"primary_distribution_opening_date\"" - ] - }, - "2808": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_exists%10#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_exists%10#0" - ] - }, - "2809": { - "error": "check self.primary_distribution_opening_date exists", - "op": "assert // check self.primary_distribution_opening_date exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0" - ] - }, - "2810": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "0" - ] - }, - "2811": { - "op": "bytec 27 // \"primary_distribution_closure_date\"", - "defined_out": [ - "\"primary_distribution_closure_date\"", - "0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "0", - "\"primary_distribution_closure_date\"" - ] - }, - "2813": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_exists%11#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_exists%11#0" - ] - }, - "2814": { - "error": "check self.primary_distribution_closure_date exists", - "op": "assert // check self.primary_distribution_closure_date exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0" - ] - }, - "2815": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "0" - ] - }, - "2816": { - "op": "bytec_3 // \"issuance_date\"", - "defined_out": [ - "\"issuance_date\"", - "0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "0", - "\"issuance_date\"" - ] - }, - "2817": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_exists%12#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_exists%12#0" - ] - }, - "2818": { - "error": "check self.issuance_date exists", - "op": "assert // check self.issuance_date exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0" - ] - }, - "2819": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "0" - ] - }, - "2820": { - "op": "bytec 10 // \"maturity_date\"", - "defined_out": [ - "\"maturity_date\"", - "0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "0", - "\"maturity_date\"" - ] - }, - "2822": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_exists%13#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_exists%13#0" - ] - }, - "2823": { - "error": "check self.maturity_date exists", - "op": "assert // check self.maturity_date exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0" - ] - }, - "2824": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "0" - ] - }, - "2825": { - "op": "bytec 22 // \"asset_suspended\"", - "defined_out": [ - "\"asset_suspended\"", - "0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "0", - "\"asset_suspended\"" - ] - }, - "2827": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_exists%14#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_exists%14#0" - ] - }, - "2828": { - "error": "check self.asset_suspended exists", - "op": "assert // check self.asset_suspended exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0" - ] - }, - "2829": { - "op": "dig 15", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "performance#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "performance#0" - ] - }, - "2831": { - "op": "itob", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "performance#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%val_as_bytes%3#0" - ] - }, - "2832": { - "op": "dup", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%3#0", - "aggregate%val_as_bytes%3#0 (copy)", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "performance#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%val_as_bytes%3#0", - "aggregate%val_as_bytes%3#0 (copy)" - ] - }, - "2833": { - "op": "bitlen", - "defined_out": [ - "aggregate%bitlen%3#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "performance#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%val_as_bytes%3#0", - "aggregate%bitlen%3#0" - ] - }, - "2834": { - "op": "intc_3 // 8", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%val_as_bytes%3#0", - "aggregate%bitlen%3#0", - "8" - ] - }, - "2835": { - "op": "<=", - "defined_out": [ - "aggregate%no_overflow%3#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "performance#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%val_as_bytes%3#0", - "aggregate%no_overflow%3#0" - ] - }, - "2836": { - "error": "overflow", - "op": "assert // overflow", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%val_as_bytes%3#0" - ] - }, - "2837": { - "op": "extract 7 1", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "performance#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0" - ] - }, - "2840": { - "op": "uncover 14", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "maybe_value%2#0" - ] - }, - "2842": { - "op": "itob", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%4#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%3#0", - "maybe_value%8#0", - "performance#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%4#0" - ] - }, - "2843": { - "op": "uncover 14", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%4#0", - "maybe_value%3#0" - ] - }, - "2845": { - "op": "itob", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%4#0", - "aggregate%val_as_bytes%5#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%8#0", - "performance#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%4#0", - "aggregate%val_as_bytes%5#0" - ] - }, - "2846": { - "op": "concat", - "defined_out": [ - "aggregate%head%1#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%8#0", - "performance#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%1#0" - ] - }, - "2847": { - "op": "uncover 11", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%1#0", - "tmp%0#1" - ] - }, - "2849": { - "op": "itob", - "defined_out": [ - "aggregate%head%1#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%6#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%8#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%1#0", - "aggregate%val_as_bytes%6#0" - ] - }, - "2850": { - "op": "concat", - "defined_out": [ - "aggregate%head%2#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%8#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%2#0" - ] - }, - "2851": { - "op": "uncover 11", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%2#0", - "maybe_value%1#0" - ] - }, - "2853": { - "op": "itob", - "defined_out": [ - "aggregate%head%2#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%7#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%8#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%2#0", - "aggregate%val_as_bytes%7#0" - ] - }, - "2854": { - "op": "concat", - "defined_out": [ - "aggregate%head%3#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%8#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%3#0" - ] - }, - "2855": { - "op": "uncover 10", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%3#0", - "aggregate%uint8%0#0" - ] - }, - "2857": { - "op": "concat", - "defined_out": [ - "aggregate%head%4#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%8#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%4#0" - ] - }, - "2858": { - "op": "uncover 9", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%4#0", - "aggregate%uint16%0#0" - ] - }, - "2860": { - "op": "concat", - "defined_out": [ - "aggregate%head%5#0", - "aggregate%uint16%1#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%8#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%5#0" - ] - }, - "2861": { - "op": "uncover 8", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%5#0", - "aggregate%uint16%1#0" - ] - }, - "2863": { - "op": "concat", - "defined_out": [ - "aggregate%head%6#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%8#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%6#0" - ] - }, - "2864": { - "op": "uncover 7", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%6#0", - "maybe_value%8#0" - ] - }, - "2866": { - "op": "itob", - "defined_out": [ - "aggregate%head%6#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%8#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%6#0", - "aggregate%val_as_bytes%8#0" - ] - }, - "2867": { - "op": "concat", - "defined_out": [ - "aggregate%head%7#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%7#0" - ] - }, - "2868": { - "op": "uncover 7", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%7#0", - "maybe_value%0#0" - ] - }, - "2870": { - "op": "itob", - "defined_out": [ - "aggregate%head%7#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%9#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%7#0", - "aggregate%val_as_bytes%9#0" - ] - }, - "2871": { - "op": "concat", - "defined_out": [ - "aggregate%head%8#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%8#0" - ] - }, - "2872": { - "op": "uncover 6", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%8#0", - "maybe_value%10#0" - ] - }, - "2874": { - "op": "itob", - "defined_out": [ - "aggregate%head%8#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%10#0", - "maybe_value%0#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%8#0", - "aggregate%val_as_bytes%10#0" - ] - }, - "2875": { - "op": "concat", - "defined_out": [ - "aggregate%head%9#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%9#0" - ] - }, - "2876": { - "op": "uncover 5", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%9#0", - "maybe_value%11#0" - ] - }, - "2878": { - "op": "itob", - "defined_out": [ - "aggregate%head%9#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%11#0", - "maybe_value%0#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%9#0", - "aggregate%val_as_bytes%11#0" - ] - }, - "2879": { - "op": "concat", - "defined_out": [ - "aggregate%head%10#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%10#0" - ] - }, - "2880": { - "op": "uncover 4", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%10#0", - "maybe_value%12#0" - ] - }, - "2882": { - "op": "itob", - "defined_out": [ - "aggregate%head%10#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%12#0", - "maybe_value%0#0", - "maybe_value%13#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%10#0", - "aggregate%val_as_bytes%12#0" - ] - }, - "2883": { - "op": "concat", - "defined_out": [ - "aggregate%head%11#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%13#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%11#0" - ] - }, - "2884": { - "op": "uncover 3", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%11#0", - "maybe_value%13#0" - ] - }, - "2886": { - "op": "itob", - "defined_out": [ - "aggregate%head%11#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%13#0", - "maybe_value%0#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%11#0", - "aggregate%val_as_bytes%13#0" - ] - }, - "2887": { - "op": "concat", - "defined_out": [ - "aggregate%head%12#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%12#0" - ] - }, - "2888": { - "op": "bytec 30 // 0x00", - "defined_out": [ - "0x00", - "aggregate%head%12#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%12#0", - "0x00" - ] - }, - "2890": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%12#0", - "0x00", - "0" - ] - }, - "2891": { - "op": "uncover 4", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "aggregate%uint8%1#0", - "aggregate%head%12#0", - "0x00", - "0", - "maybe_value%14#0" - ] - }, - "2893": { - "op": "setbit", - "defined_out": [ - "aggregate%encoded_bool%0#0", - "aggregate%head%12#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "aggregate%uint8%1#0", - "aggregate%head%12#0", - "aggregate%encoded_bool%0#0" - ] - }, - "2894": { - "op": "concat", - "defined_out": [ - "aggregate%head%13#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "aggregate%uint8%1#0", - "aggregate%head%13#0" - ] - }, - "2895": { - "op": "swap", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "aggregate%head%13#0", - "aggregate%uint8%1#0" - ] - }, - "2896": { - "op": "concat", - "defined_out": [ - "aggregate%head%14#0", - "maybe_value%0#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "aggregate%head%14#0" - ] - }, - "2897": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%head%14#0", - "maybe_value%0#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "aggregate%head%14#0", - "0x151f7c75" - ] - }, - "2898": { - "op": "swap", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "0x151f7c75", - "aggregate%head%14#0" - ] - }, - "2899": { - "op": "concat", - "defined_out": [ - "maybe_value%0#0", - "performance#0", - "tmp%1#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "tmp%1#0" - ] - }, - "2900": { - "op": "log", - "stack_out": [ - "performance#0", - "maybe_value%0#0" - ] - }, - "2901": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "maybe_value%0#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "1" - ] - }, - "2902": { - "op": "return", - "stack_out": [ - "performance#0", - "maybe_value%0#0" - ] - }, - "2903": { - "subroutine": "modules.core_financial.common.CoreFinancialCommonMixin.get_time_events[routing]", - "params": {}, - "block": "get_time_events", - "stack_in": [], - "op": "bytec 33 // 0x0000" - }, - "2905": { - "op": "intc_0 // 0" - }, - "2906": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"", - "0", - "time_events#0" - ], - "stack_out": [ - "time_events#0", - "0", - "\"status\"" - ] - }, - "2907": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0", - "time_events#0" - ], - "stack_out": [ - "time_events#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2908": { - "error": "check self.status exists", - "op": "assert // check self.status exists", - "stack_out": [ - "time_events#0", - "maybe_value%0#0" - ] - }, - "2909": { - "op": "pushint 100", - "defined_out": [ - "100", - "maybe_value%0#0", - "time_events#0" - ], - "stack_out": [ - "time_events#0", - "maybe_value%0#0", - "100" - ] - }, - "2911": { - "op": "==", - "defined_out": [ - "time_events#0", - "tmp%0#2" - ], - "stack_out": [ - "time_events#0", - "tmp%0#2" - ] - }, - "2912": { - "op": "bz get_time_events_after_if_else@3", - "stack_out": [ - "time_events#0" - ] - }, - "2915": { - "op": "bytec 32 // 0x74696d654576656e7473", - "defined_out": [ - "0x74696d654576656e7473", - "time_events#0" - ], - "stack_out": [ - "time_events#0", - "0x74696d654576656e7473" - ] - }, - "2917": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%1#0", - "time_events#0" - ], - "stack_out": [ - "time_events#0", - "time_events#0", - "aggregate%box_get%1#0" - ] - }, - "2918": { - "op": "swap", - "stack_out": [ - "time_events#0", - "aggregate%box_get%1#0", - "time_events#0" - ] - }, - "2919": { - "op": "bury 2", - "stack_out": [ - "time_events#0", - "aggregate%box_get%1#0" - ] - }, - "2921": { - "error": "check self.time_events exists", - "op": "assert // check self.time_events exists", - "stack_out": [ - "time_events#0" - ] - }, - "2922": { - "block": "get_time_events_after_if_else@3", - "stack_in": [ - "time_events#0" - ], - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75" - ], - "stack_out": [ - "time_events#0", - "0x151f7c75" - ] - }, - "2923": { - "op": "dig 1", - "defined_out": [ - "0x151f7c75", - "time_events#0" - ], - "stack_out": [ - "time_events#0", - "0x151f7c75", - "time_events#0" - ] - }, - "2925": { - "op": "concat", - "defined_out": [ - "time_events#0", - "tmp%1#0" - ], - "stack_out": [ - "time_events#0", - "tmp%1#0" - ] - }, - "2926": { - "op": "log", - "stack_out": [ - "time_events#0" - ] - }, - "2927": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "time_events#0" - ], - "stack_out": [ - "time_events#0", - "1" - ] - }, - "2928": { - "op": "return", - "stack_out": [ - "time_events#0" - ] - }, - "2929": { - "subroutine": "modules.core_financial.common.CoreFinancialCommonMixin.get_secondary_market_schedule[routing]", - "params": {}, - "block": "get_secondary_market_schedule", - "stack_in": [], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "0" - ] - }, - "2930": { - "op": "bytec 16 // \"secondary_market_opening_date\"", - "defined_out": [ - "\"secondary_market_opening_date\"", - "0" - ], - "stack_out": [ - "0", - "\"secondary_market_opening_date\"" - ] - }, - "2932": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2933": { - "error": "check self.secondary_market_opening_date exists", - "op": "assert // check self.secondary_market_opening_date exists", - "stack_out": [ - "maybe_value%0#0" - ] - }, - "2934": { - "op": "intc_0 // 0", - "stack_out": [ - "maybe_value%0#0", - "0" - ] - }, - "2935": { - "op": "bytec 9 // \"secondary_market_closure_date\"", - "defined_out": [ - "\"secondary_market_closure_date\"", - "0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "0", - "\"secondary_market_closure_date\"" - ] - }, - "2937": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%1#0", - "maybe_value%0#0", - "maybe_value%1#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "2938": { - "error": "check self.secondary_market_closure_date exists", - "op": "assert // check self.secondary_market_closure_date exists", - "stack_out": [ - "maybe_value%0#0", - "maybe_value%1#0" - ] - }, - "2939": { - "op": "swap", - "stack_out": [ - "maybe_value%1#0", - "maybe_value%0#0" - ] - }, - "2940": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "maybe_value%1#0" - ], - "stack_out": [ - "maybe_value%1#0", - "aggregate%val_as_bytes%0#0" - ] - }, - "2941": { - "op": "pushbytes 0x0002", - "defined_out": [ - "0x0002", - "aggregate%val_as_bytes%0#0", - "maybe_value%1#0" - ], - "stack_out": [ - "maybe_value%1#0", - "aggregate%val_as_bytes%0#0", - "0x0002" - ] - }, - "2945": { - "op": "swap", - "stack_out": [ - "maybe_value%1#0", - "0x0002", - "aggregate%val_as_bytes%0#0" - ] - }, - "2946": { - "op": "concat", - "defined_out": [ - "aggregate%head%0#0", - "maybe_value%1#0" - ], - "stack_out": [ - "maybe_value%1#0", - "aggregate%head%0#0" - ] - }, - "2947": { - "op": "swap", - "stack_out": [ - "aggregate%head%0#0", - "maybe_value%1#0" - ] - }, - "2948": { - "op": "itob", - "defined_out": [ - "aggregate%head%0#0", - "aggregate%val_as_bytes%1#0" - ], - "stack_out": [ - "aggregate%head%0#0", - "aggregate%val_as_bytes%1#0" - ] - }, - "2949": { - "op": "concat", - "defined_out": [ - "aggregate%head%1#0" - ], - "stack_out": [ - "aggregate%head%1#0" - ] - }, - "2950": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%head%1#0" - ], - "stack_out": [ - "aggregate%head%1#0", - "0x151f7c75" - ] - }, - "2951": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%head%1#0" - ] - }, - "2952": { - "op": "concat", - "defined_out": [ - "tmp%1#0" - ], - "stack_out": [ - "tmp%1#0" - ] - }, - "2953": { - "op": "log", - "stack_out": [] - }, - "2954": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "2955": { - "op": "return", - "stack_out": [] - }, - "2956": { - "subroutine": "modules.core_financial.common.CoreFinancialCommonMixin.get_asset_metadata[routing]", - "params": {}, - "block": "get_asset_metadata", - "stack_in": [], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "0" - ] - }, - "2957": { - "op": "bytec 25 // \"metadata\"", - "defined_out": [ - "\"metadata\"", - "0" - ], - "stack_out": [ - "0", - "\"metadata\"" - ] - }, - "2959": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2960": { - "error": "check self.metadata exists", - "op": "assert // check self.metadata exists", - "stack_out": [ - "maybe_value%0#0" - ] - }, - "2961": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "0x151f7c75" - ] - }, - "2962": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "maybe_value%0#0" - ] - }, - "2963": { - "op": "concat", - "defined_out": [ - "tmp%1#0" - ], - "stack_out": [ - "tmp%1#0" - ] - }, - "2964": { - "op": "log", - "stack_out": [] - }, - "2965": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "2966": { - "op": "return", - "stack_out": [] - }, - "2967": { - "subroutine": "modules.accounting.AccountingModule.account_gov_suspension[routing]", - "params": {}, - "block": "account_gov_suspension", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "holding_address#0" - ], - "stack_out": [ - "holding_address#0" - ] - }, - "2970": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ] - }, - "2971": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0" - ] - }, - "2972": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0", - "32" - ] - }, - "2973": { - "op": "==", - "defined_out": [ - "eq%0#0", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "eq%0#0" - ] - }, - "2974": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "holding_address#0" - ] - }, - "2975": { - "op": "txna ApplicationArgs 2", - "defined_out": [ - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0" - ] - }, - "2978": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ] - }, - "2979": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%1#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "len%1#0" - ] - }, - "2980": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "holding_address#0", - "len%1#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "len%1#0", - "1" - ] - }, - "2981": { - "op": "==", - "defined_out": [ - "eq%1#0", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "eq%1#0" - ] - }, - "2982": { - "error": "invalid number of bytes for arc4.bool", - "op": "assert // invalid number of bytes for arc4.bool", - "stack_out": [ - "holding_address#0", - "tmp%2#0" - ] - }, - "2983": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "0" - ] - }, - "2984": { - "op": "getbit", - "defined_out": [ - "holding_address#0", - "suspended#0" - ], - "stack_out": [ - "holding_address#0", - "suspended#0" - ] - }, - "2985": { - "op": "bytec 11 // 0x52373023", - "defined_out": [ - "0x52373023", - "holding_address#0", - "suspended#0" - ], - "stack_out": [ - "holding_address#0", - "suspended#0", - "0x52373023" - ] - }, - "2987": { - "op": "txn Sender", - "defined_out": [ - "0x52373023", - "holding_address#0", - "suspended#0", - "tmp%0#2" - ], - "stack_out": [ - "holding_address#0", - "suspended#0", - "0x52373023", - "tmp%0#2" - ] - }, - "2989": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "holding_address#0", - "suspended#0", - "tmp%1#0" - ], - "stack_out": [ - "holding_address#0", - "suspended#0", - "tmp%1#0" - ] - }, - "2992": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "holding_address#0", - "suspended#0" - ] - }, - "2993": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023", - "holding_address#0", - "suspended#0" - ], - "stack_out": [ - "holding_address#0", - "suspended#0", - "0x52333023" - ] - }, - "2994": { - "op": "uncover 2", - "stack_out": [ - "suspended#0", - "0x52333023", - "holding_address#0" - ] - }, - "2996": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "suspended#0" - ], - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1" - ] - }, - "2997": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "suspended#0" - ], - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "2998": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0", - "suspended#0" - ], - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "2999": { - "op": "bury 1", - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "3001": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1" - ] - }, - "3002": { - "op": "dup", - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "3003": { - "op": "pushint 56", - "defined_out": [ - "56", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "suspended#0" - ], - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "56" - ] - }, - "3005": { - "op": "intc_1 // 1", - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "56", - "1" - ] - }, - "3006": { - "op": "box_extract", - "defined_out": [ - "box%box_extract%0#0", - "box_prefixed_key%0#1", - "suspended#0" - ], - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1", - "box%box_extract%0#0" - ] - }, - "3007": { - "op": "intc_0 // 0", - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1", - "box%box_extract%0#0", - "0" - ] - }, - "3008": { - "op": "uncover 3", - "stack_out": [ - "box_prefixed_key%0#1", - "box%box_extract%0#0", - "0", - "suspended#0" - ] - }, - "3010": { - "op": "setbit", - "defined_out": [ - "aggregate%updated_target%0#0", - "box_prefixed_key%0#1" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "aggregate%updated_target%0#0" - ] - }, - "3011": { - "op": "pushint 56" - }, - "3013": { - "op": "swap", - "stack_out": [ - "box_prefixed_key%0#1", - "56", - "aggregate%updated_target%0#0" - ] - }, - "3014": { - "op": "box_replace", - "stack_out": [] - }, - "3015": { - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1" - ] - }, - "3017": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0" - ] - }, - "3018": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0", - "0x151f7c75" - ] - }, - "3019": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ] - }, - "3020": { - "op": "concat", - "defined_out": [ - "tmp%6#0" - ], - "stack_out": [ - "tmp%6#0" - ] - }, - "3021": { - "op": "log", - "stack_out": [] - }, - "3022": { - "op": "intc_1 // 1", - "stack_out": [ - "1" - ] - }, - "3023": { - "op": "return", - "stack_out": [] - }, - "3024": { - "subroutine": "modules.accounting.AccountingModule.account_open[routing]", - "params": {}, - "block": "account_open", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "holding_address#0" - ], - "stack_out": [ - "holding_address#0" - ] - }, - "3027": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ] - }, - "3028": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0" - ] - }, - "3029": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0", - "32" - ] - }, - "3030": { - "op": "==", - "defined_out": [ - "eq%0#0", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "eq%0#0" - ] - }, - "3031": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "holding_address#0" - ] - }, - "3032": { - "op": "txna ApplicationArgs 2", - "defined_out": [ - "holding_address#0", - "payment_address#0" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0" - ] - }, - "3035": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "payment_address#0", - "payment_address#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "payment_address#0 (copy)" - ] - }, - "3036": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%1#0", - "payment_address#0" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "len%1#0" - ] - }, - "3037": { - "op": "intc_2 // 32", - "stack_out": [ - "holding_address#0", - "payment_address#0", - "len%1#0", - "32" - ] - }, - "3038": { - "op": "==", - "defined_out": [ - "eq%1#0", - "holding_address#0", - "payment_address#0" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "eq%1#0" - ] - }, - "3039": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "holding_address#0", - "payment_address#0" - ] - }, - "3040": { - "op": "bytec 12 // 0x52343023", - "defined_out": [ - "0x52343023", - "holding_address#0", - "payment_address#0" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "0x52343023" - ] - }, - "3042": { - "op": "txn Sender", - "defined_out": [ - "0x52343023", - "holding_address#0", - "payment_address#0", - "tmp%0#2" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "0x52343023", - "tmp%0#2" - ] - }, - "3044": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "holding_address#0", - "payment_address#0", - "tmp%1#1" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "tmp%1#1" - ] - }, - "3047": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "holding_address#0", - "payment_address#0" - ] - }, - "3048": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "holding_address#0", - "payment_address#0" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "0" - ] - }, - "3049": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"", - "0", - "holding_address#0", - "payment_address#0" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "0", - "\"status\"" - ] - }, - "3050": { - "op": "app_global_get_ex", - "defined_out": [ - "holding_address#0", - "maybe_exists%0#0", - "maybe_value%0#0", - "payment_address#0" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "3051": { - "error": "check self.status exists", - "op": "assert // check self.status exists", - "stack_out": [ - "holding_address#0", - "payment_address#0", - "maybe_value%0#0" - ] - }, - "3052": { - "op": "intc 5 // 200", - "defined_out": [ - "200", - "holding_address#0", - "maybe_value%0#0", - "payment_address#0" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "maybe_value%0#0", - "200" - ] - }, - "3054": { - "op": "==", - "defined_out": [ - "holding_address#0", - "payment_address#0", - "tmp%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "tmp%0#3" - ] - }, - "3055": { - "op": "!", - "stack_out": [ - "holding_address#0", - "payment_address#0", - "tmp%1#1" - ] - }, - "3056": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "holding_address#0", - "payment_address#0" - ] - }, - "3057": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "op": "callsub assert_is_not_asset_defaulted" - }, - "3060": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_suspended", - "op": "callsub assert_is_not_asset_suspended" - }, - "3063": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023", - "holding_address#0", - "payment_address#0" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "0x52333023" - ] - }, - "3064": { - "op": "uncover 2", - "stack_out": [ - "payment_address#0", - "0x52333023", - "holding_address#0" - ] - }, - "3066": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#0", - "payment_address#0" - ], - "stack_out": [ - "payment_address#0", - "box_prefixed_key%0#0" - ] - }, - "3067": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#0", - "box_prefixed_key%0#0 (copy)", - "payment_address#0" - ], - "stack_out": [ - "payment_address#0", - "box_prefixed_key%0#0", - "box_prefixed_key%0#0 (copy)" - ] - }, - "3068": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#0", - "maybe_exists%0#0", - "payment_address#0" - ], - "stack_out": [ - "payment_address#0", - "box_prefixed_key%0#0", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "3069": { - "op": "bury 1", - "stack_out": [ - "payment_address#0", - "box_prefixed_key%0#0", - "maybe_exists%0#0" - ] - }, - "3071": { - "op": "!", - "defined_out": [ - "box_prefixed_key%0#0", - "payment_address#0", - "tmp%2#1" - ], - "stack_out": [ - "payment_address#0", - "box_prefixed_key%0#0", - "tmp%2#1" - ] - }, - "3072": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "payment_address#0", - "box_prefixed_key%0#0" - ] - }, - "3073": { - "op": "intc_0 // 0", - "stack_out": [ - "payment_address#0", - "box_prefixed_key%0#0", - "0" - ] - }, - "3074": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#0", - "payment_address#0" - ], - "stack_out": [ - "payment_address#0", - "box_prefixed_key%0#0", - "aggregate%val_as_bytes%0#0" - ] - }, - "3075": { - "op": "uncover 2", - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%val_as_bytes%0#0", - "payment_address#0" - ] - }, - "3077": { - "op": "dig 1", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%0#0 (copy)", - "box_prefixed_key%0#0", - "payment_address#0" - ], - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%val_as_bytes%0#0", - "payment_address#0", - "aggregate%val_as_bytes%0#0 (copy)" - ] - }, - "3079": { - "op": "concat", - "defined_out": [ - "aggregate%head%1#0", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%val_as_bytes%0#0", - "aggregate%head%1#0" - ] - }, - "3080": { - "op": "dig 1", - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%val_as_bytes%0#0", - "aggregate%head%1#0", - "aggregate%val_as_bytes%0#0 (copy)" - ] - }, - "3082": { - "op": "concat", - "defined_out": [ - "aggregate%head%2#0", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%val_as_bytes%0#0", - "aggregate%head%2#0" - ] - }, - "3083": { - "op": "swap", - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%head%2#0", - "aggregate%val_as_bytes%0#0" - ] - }, - "3084": { - "op": "concat", - "defined_out": [ - "aggregate%head%3#0", - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%head%3#0" - ] - }, - "3085": { - "op": "bytec 30 // 0x00", - "defined_out": [ - "0x00", - "aggregate%head%3#0", - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%head%3#0", - "0x00" - ] - }, - "3087": { - "op": "concat", - "defined_out": [ - "aggregate%head%4#0", - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%head%4#0" - ] - }, - "3088": { - "op": "box_put", - "stack_out": [] - }, - "3089": { - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%4#1" - ], - "stack_out": [ - "tmp%4#1" - ] - }, - "3091": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%3#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%3#0" - ] - }, - "3092": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%3#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%3#0", - "0x151f7c75" - ] - }, - "3093": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%3#0" - ] - }, - "3094": { - "op": "concat", - "defined_out": [ - "tmp%6#0" - ], - "stack_out": [ - "tmp%6#0" - ] - }, - "3095": { - "op": "log", - "stack_out": [] - }, - "3096": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "3097": { - "op": "return", - "stack_out": [] - }, - "3098": { - "subroutine": "modules.accounting.AccountingModule.account_close[routing]", - "params": {}, - "block": "account_close", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "holding_address#0" - ], - "stack_out": [ - "holding_address#0" - ] - }, - "3101": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ] - }, - "3102": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0" - ] - }, - "3103": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0", - "32" - ] - }, - "3104": { - "op": "==", - "defined_out": [ - "eq%0#0", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "eq%0#0" - ] - }, - "3105": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "holding_address#0" - ] - }, - "3106": { - "op": "bytec 12 // 0x52343023", - "defined_out": [ - "0x52343023", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "0x52343023" - ] - }, - "3108": { - "op": "txn Sender", - "defined_out": [ - "0x52343023", - "holding_address#0", - "tmp%0#2" - ], - "stack_out": [ - "holding_address#0", - "0x52343023", - "tmp%0#2" - ] - }, - "3110": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "holding_address#0", - "tmp%1#2" - ], - "stack_out": [ - "holding_address#0", - "tmp%1#2" - ] - }, - "3113": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "holding_address#0" - ] - }, - "3114": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "op": "callsub assert_is_not_asset_defaulted" - }, - "3117": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "0x52333023" - ] - }, - "3118": { - "op": "swap", - "stack_out": [ - "0x52333023", - "holding_address#0" - ] - }, - "3119": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1" - ], - "stack_out": [ - "box_prefixed_key%0#1" - ] - }, - "3120": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "3121": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "3122": { - "op": "bury 1", - "stack_out": [ - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "3124": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "box_prefixed_key%0#1" - ] - }, - "3125": { - "op": "dup", - "stack_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "3126": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0", - "box_prefixed_key%0#1" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "3127": { - "op": "pop", - "stack_out": [ - "box_prefixed_key%0#1", - "aggregate%box_get%0#0" - ] - }, - "3128": { - "op": "intc_2 // 32", - "stack_out": [ - "box_prefixed_key%0#1", - "aggregate%box_get%0#0", - "32" - ] - }, - "3129": { - "op": "extract_uint64", - "defined_out": [ - "box_prefixed_key%0#1", - "closed_units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "closed_units#0" - ] - }, - "3130": { - "op": "dup", - "stack_out": [ - "box_prefixed_key%0#1", - "closed_units#0", - "closed_units#0 (copy)" - ] - }, - "3131": { - "op": "uncover 2", - "defined_out": [ - "box_prefixed_key%0#1", - "closed_units#0" - ], - "stack_out": [ - "closed_units#0", - "closed_units#0", - "box_prefixed_key%0#1" - ] - }, - "3133": { - "op": "box_del", - "defined_out": [ - "closed_units#0", - "{box_del}" - ], - "stack_out": [ - "closed_units#0", - "closed_units#0", - "{box_del}" - ] - }, - "3134": { - "op": "pop", - "stack_out": [ - "closed_units#0", - "closed_units#0" - ] - }, - "3135": { - "op": "intc_0 // 0", - "stack_out": [ - "closed_units#0", - "closed_units#0", - "0" - ] - }, - "3136": { - "op": "bytec 4 // \"circulating_units\"", - "defined_out": [ - "\"circulating_units\"", - "0", - "closed_units#0" - ], - "stack_out": [ - "closed_units#0", - "closed_units#0", - "0", - "\"circulating_units\"" - ] - }, - "3138": { - "op": "app_global_get_ex", - "defined_out": [ - "closed_units#0", - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "closed_units#0", - "closed_units#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "3139": { - "error": "check self.circulating_units exists", - "op": "assert // check self.circulating_units exists", - "stack_out": [ - "closed_units#0", - "closed_units#0", - "maybe_value%0#0" - ] - }, - "3140": { - "op": "swap", - "stack_out": [ - "closed_units#0", - "maybe_value%0#0", - "closed_units#0" - ] - }, - "3141": { - "op": "-", - "defined_out": [ - "closed_units#0", - "tmp%0#1" - ], - "stack_out": [ - "closed_units#0", - "tmp%0#1" - ] - }, - "3142": { - "op": "bytec 4 // \"circulating_units\"", - "stack_out": [ - "closed_units#0", - "tmp%0#1", - "\"circulating_units\"" - ] - }, - "3144": { - "op": "dig 1", - "defined_out": [ - "\"circulating_units\"", - "closed_units#0", - "tmp%0#1", - "tmp%0#1 (copy)" - ], - "stack_out": [ - "closed_units#0", - "tmp%0#1", - "\"circulating_units\"", - "tmp%0#1 (copy)" - ] - }, - "3146": { - "op": "app_global_put", - "stack_out": [ - "closed_units#0", - "tmp%0#1" - ] - }, - "3147": { - "op": "bnz account_close_after_if_else@3", - "stack_out": [ - "closed_units#0" - ] - }, - "3150": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"", - "closed_units#0" - ], - "stack_out": [ - "closed_units#0", - "\"status\"" - ] - }, - "3151": { - "op": "intc 5 // 200", - "defined_out": [ - "\"status\"", - "200", - "closed_units#0" - ], - "stack_out": [ - "closed_units#0", - "\"status\"", - "200" - ] - }, - "3153": { - "op": "app_global_put", - "stack_out": [ - "closed_units#0" - ] - }, - "3154": { - "block": "account_close_after_if_else@3", - "stack_in": [ - "closed_units#0" - ], - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%1#1" - ], - "stack_out": [ - "closed_units#0", - "tmp%1#1" - ] - }, - "3156": { - "op": "dig 1", - "defined_out": [ - "closed_units#0", - "tmp%1#1" - ], - "stack_out": [ - "closed_units#0", - "tmp%1#1", - "closed_units#0" - ] - }, - "3158": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "closed_units#0", - "tmp%1#1" - ], - "stack_out": [ - "closed_units#0", - "tmp%1#1", - "aggregate%val_as_bytes%0#0" - ] - }, - "3159": { - "op": "swap", - "stack_out": [ - "closed_units#0", - "aggregate%val_as_bytes%0#0", - "tmp%1#1" - ] - }, - "3160": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0", - "closed_units#0" - ], - "stack_out": [ - "closed_units#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0" - ] - }, - "3161": { - "op": "concat", - "defined_out": [ - "aggregate%head%1#0", - "closed_units#0" - ], - "stack_out": [ - "closed_units#0", - "aggregate%head%1#0" - ] - }, - "3162": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%head%1#0", - "closed_units#0" - ], - "stack_out": [ - "closed_units#0", - "aggregate%head%1#0", - "0x151f7c75" - ] - }, - "3163": { - "op": "swap", - "stack_out": [ - "closed_units#0", - "0x151f7c75", - "aggregate%head%1#0" - ] - }, - "3164": { - "op": "concat", - "defined_out": [ - "closed_units#0", - "tmp%5#0" - ], - "stack_out": [ - "closed_units#0", - "tmp%5#0" - ] - }, - "3165": { - "op": "log", - "stack_out": [ - "closed_units#0" - ] - }, - "3166": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "closed_units#0" - ], - "stack_out": [ - "closed_units#0", - "1" - ] - }, - "3167": { - "op": "return", - "stack_out": [ - "closed_units#0" - ] - }, - "3168": { - "subroutine": "modules.accounting.AccountingModule.account_update_payment_address[routing]", - "params": {}, - "block": "account_update_payment_address", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "holding_address#0" - ], - "stack_out": [ - "holding_address#0" - ] - }, - "3171": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ] - }, - "3172": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0" - ] - }, - "3173": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0", - "32" - ] - }, - "3174": { - "op": "==", - "defined_out": [ - "eq%0#0", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "eq%0#0" - ] - }, - "3175": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "holding_address#0" - ] - }, - "3176": { - "op": "txna ApplicationArgs 2", - "defined_out": [ - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0" - ] - }, - "3179": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ] - }, - "3180": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%1#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "len%1#0" - ] - }, - "3181": { - "op": "intc_2 // 32", - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "len%1#0", - "32" - ] - }, - "3182": { - "op": "==", - "defined_out": [ - "eq%1#0", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "eq%1#0" - ] - }, - "3183": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "holding_address#0", - "tmp%2#0" - ] - }, - "3184": { - "op": "txn Sender", - "defined_out": [ - "holding_address#0", - "tmp%0#1", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%0#1" - ] - }, - "3186": { - "op": "dig 2", - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%0#1", - "holding_address#0 (copy)" - ] - }, - "3188": { - "op": "==", - "defined_out": [ - "holding_address#0", - "tmp%1#1", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%1#1" - ] - }, - "3189": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "holding_address#0", - "tmp%2#0" - ] - }, - "3190": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "op": "callsub assert_is_not_asset_defaulted" - }, - "3193": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_suspended", - "op": "callsub assert_is_not_asset_suspended" - }, - "3196": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "0x52333023" - ] - }, - "3197": { - "op": "uncover 2", - "stack_out": [ - "tmp%2#0", - "0x52333023", - "holding_address#0" - ] - }, - "3199": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0", - "box_prefixed_key%0#1" - ] - }, - "3200": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "3201": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0", - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "3202": { - "op": "bury 1", - "stack_out": [ - "tmp%2#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "3204": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "tmp%2#0", - "box_prefixed_key%0#1" - ] - }, - "3205": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "box_prefixed_key%0#1", - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0", - "box_prefixed_key%0#1", - "0" - ] - }, - "3206": { - "op": "uncover 2", - "stack_out": [ - "box_prefixed_key%0#1", - "0", - "tmp%2#0" - ] - }, - "3208": { - "op": "box_replace", - "stack_out": [] - }, - "3209": { - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%2#1" - ], - "stack_out": [ - "tmp%2#1" - ] - }, - "3211": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0" - ] - }, - "3212": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0", - "0x151f7c75" - ] - }, - "3213": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ] - }, - "3214": { - "op": "concat", - "defined_out": [ - "tmp%6#0" - ], - "stack_out": [ - "tmp%6#0" - ] - }, - "3215": { - "op": "log", - "stack_out": [] - }, - "3216": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "3217": { - "op": "return", - "stack_out": [] - }, - "3218": { - "subroutine": "modules.accounting.AccountingModule.account_get_info[routing]", - "params": {}, - "block": "account_get_info", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "holding_address#0" - ], - "stack_out": [ - "holding_address#0" - ] - }, - "3221": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ] - }, - "3222": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0" - ] - }, - "3223": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0", - "32" - ] - }, - "3224": { - "op": "==", - "defined_out": [ - "eq%0#0", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "eq%0#0" - ] - }, - "3225": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "holding_address#0" - ] - }, - "3226": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "0x52333023" - ] - }, - "3227": { - "op": "swap", - "stack_out": [ - "0x52333023", - "holding_address#0" - ] - }, - "3228": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1" - ], - "stack_out": [ - "box_prefixed_key%0#1" - ] - }, - "3229": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "3230": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "3231": { - "op": "bury 1", - "stack_out": [ - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "3233": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "box_prefixed_key%0#1" - ] - }, - "3234": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ], - "stack_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "3235": { - "op": "pop", - "stack_out": [ - "aggregate%box_get%0#0" - ] - }, - "3236": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%box_get%0#0" - ], - "stack_out": [ - "aggregate%box_get%0#0", - "0x151f7c75" - ] - }, - "3237": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%box_get%0#0" - ] - }, - "3238": { - "op": "concat", - "defined_out": [ - "tmp%3#0" - ], - "stack_out": [ - "tmp%3#0" - ] - }, - "3239": { - "op": "log", - "stack_out": [] - }, - "3240": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "3241": { - "op": "return", - "stack_out": [] - }, - "3242": { - "subroutine": "modules.rbac.RbacModule.rbac_rotate_arranger[routing]", - "params": {}, - "block": "rbac_rotate_arranger", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "new_arranger#0" - ], - "stack_out": [ - "new_arranger#0" - ] - }, - "3245": { - "op": "dup", - "defined_out": [ - "new_arranger#0", - "new_arranger#0 (copy)" - ], - "stack_out": [ - "new_arranger#0", - "new_arranger#0 (copy)" - ] - }, - "3246": { - "op": "len", - "defined_out": [ - "len%0#0", - "new_arranger#0" - ], - "stack_out": [ - "new_arranger#0", - "len%0#0" - ] - }, - "3247": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "len%0#0", - "new_arranger#0" - ], - "stack_out": [ - "new_arranger#0", - "len%0#0", - "32" - ] - }, - "3248": { - "op": "==", - "defined_out": [ - "eq%0#0", - "new_arranger#0" - ], - "stack_out": [ - "new_arranger#0", - "eq%0#0" - ] - }, - "3249": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "new_arranger#0" - ] - }, - "3250": { - "callsub": "modules.rbac.RbacModule.assert_caller_is_arranger", - "op": "callsub assert_caller_is_arranger" - }, - "3253": { - "op": "bytec 6 // 0x52323023", - "defined_out": [ - "0x52323023", - "new_arranger#0" - ], - "stack_out": [ - "new_arranger#0", - "0x52323023" - ] - }, - "3255": { - "op": "swap", - "stack_out": [ - "0x52323023", - "new_arranger#0" - ] - }, - "3256": { - "op": "app_global_put", - "stack_out": [] - }, - "3257": { - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1" - ] - }, - "3259": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0" - ] - }, - "3260": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0", - "0x151f7c75" - ] - }, - "3261": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ] - }, - "3262": { - "op": "concat", - "defined_out": [ - "tmp%4#0" - ], - "stack_out": [ - "tmp%4#0" - ] - }, - "3263": { - "op": "log", - "stack_out": [] - }, - "3264": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "3265": { - "op": "return", - "stack_out": [] - }, - "3266": { - "subroutine": "modules.rbac.RbacModule.rbac_set_op_daemon[routing]", - "params": {}, - "block": "rbac_set_op_daemon", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "address#0" - ], - "stack_out": [ - "address#0" - ] - }, - "3269": { - "op": "dup", - "defined_out": [ - "address#0", - "address#0 (copy)" - ], - "stack_out": [ - "address#0", - "address#0 (copy)" - ] - }, - "3270": { - "op": "len", - "defined_out": [ - "address#0", - "len%0#0" - ], - "stack_out": [ - "address#0", - "len%0#0" - ] - }, - "3271": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "address#0", - "len%0#0" - ], - "stack_out": [ - "address#0", - "len%0#0", - "32" - ] - }, - "3272": { - "op": "==", - "defined_out": [ - "address#0", - "eq%0#0" - ], - "stack_out": [ - "address#0", - "eq%0#0" - ] - }, - "3273": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "address#0" - ] - }, - "3274": { - "callsub": "modules.rbac.RbacModule.assert_caller_is_arranger", - "op": "callsub assert_caller_is_arranger" - }, - "3277": { - "op": "bytec 21 // 0x52323523", - "defined_out": [ - "0x52323523", - "address#0" - ], - "stack_out": [ - "address#0", - "0x52323523" - ] - }, - "3279": { - "op": "swap", - "stack_out": [ - "0x52323523", - "address#0" - ] - }, - "3280": { - "op": "app_global_put", - "stack_out": [] - }, - "3281": { - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1" - ] - }, - "3283": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0" - ] - }, - "3284": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0", - "0x151f7c75" - ] - }, - "3285": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ] - }, - "3286": { - "op": "concat", - "defined_out": [ - "tmp%4#0" - ], - "stack_out": [ - "tmp%4#0" - ] - }, - "3287": { - "op": "log", - "stack_out": [] - }, - "3288": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "3289": { - "op": "return", - "stack_out": [] - }, - "3290": { - "subroutine": "modules.rbac.RbacModule.rbac_assign_role[routing]", - "params": {}, - "block": "rbac_assign_role", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "role_id#0" - ], - "stack_out": [ - "role_id#0" - ] - }, - "3293": { - "op": "dup", - "defined_out": [ - "role_id#0", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0", - "role_id#0 (copy)" - ] - }, - "3294": { - "op": "len", - "defined_out": [ - "len%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "len%0#0" - ] - }, - "3295": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "len%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "len%0#0", - "1" - ] - }, - "3296": { - "op": "==", - "defined_out": [ - "eq%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "eq%0#0" - ] - }, - "3297": { - "error": "invalid number of bytes for arc4.uint8", - "op": "assert // invalid number of bytes for arc4.uint8", - "stack_out": [ - "role_id#0" - ] - }, - "3298": { - "op": "txna ApplicationArgs 2" - }, - "3301": { - "op": "dup", - "defined_out": [ - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "role_address#0", - "role_address#0" - ] - }, - "3302": { - "op": "cover 2", - "defined_out": [ - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "role_address#0" - ] - }, - "3304": { - "op": "len", - "defined_out": [ - "len%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "len%1#0" - ] - }, - "3305": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "len%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "len%1#0", - "32" - ] - }, - "3306": { - "op": "==", - "defined_out": [ - "eq%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "eq%1#0" - ] - }, - "3307": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "role_address#0", - "role_id#0" - ] - }, - "3308": { - "op": "txna ApplicationArgs 3", - "defined_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0" - ] - }, - "3311": { - "op": "dup", - "defined_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "tmp%3#0 (copy)" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "tmp%3#0 (copy)" - ] - }, - "3312": { - "op": "intc_0 // 0", - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "tmp%3#0 (copy)", - "0" - ] - }, - "3313": { - "error": "invalid array length header", - "op": "extract_uint16 // on error: invalid array length header", - "defined_out": [ - "aggregate%array_length%0#0", - "role_address#0", - "role_id#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "aggregate%array_length%0#0" - ] - }, - "3314": { - "op": "pushint 2", - "defined_out": [ - "2", - "aggregate%array_length%0#0", - "role_address#0", - "role_id#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "aggregate%array_length%0#0", - "2" - ] - }, - "3316": { - "op": "+", - "defined_out": [ - "add%0#0", - "role_address#0", - "role_id#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "add%0#0" - ] - }, - "3317": { - "op": "dig 1", - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "add%0#0", - "tmp%3#0 (copy)" - ] - }, - "3319": { - "op": "len", - "defined_out": [ - "add%0#0", - "len%2#0", - "role_address#0", - "role_id#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "add%0#0", - "len%2#0" - ] - }, - "3320": { - "op": "==", - "defined_out": [ - "eq%2#0", - "role_address#0", - "role_id#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "eq%2#0" - ] - }, - "3321": { - "error": "invalid number of bytes for arc4.dynamic_array", - "op": "assert // invalid number of bytes for arc4.dynamic_array", - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0" - ] - }, - "3322": { - "op": "extract 2 0", - "defined_out": [ - "config#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "config#0" - ] - }, - "3325": { - "op": "swap", - "defined_out": [ - "config#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#0" - ] - }, - "3326": { - "callsub": "modules.rbac.RbacModule.assert_caller_is_arranger", - "op": "callsub assert_caller_is_arranger" - }, - "3329": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "op": "callsub assert_is_not_asset_defaulted" - }, - "3332": { - "op": "btoi", - "defined_out": [ - "config#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3333": { - "op": "dupn 2", - "defined_out": [ - "config#0", - "role_address#0", - "role_id#1", - "role_id#1 (copy)" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1", - "role_id#1 (copy)" - ] - }, - "3335": { - "callsub": "modules.rbac.RbacModule._assert_valid_role", - "op": "callsub _assert_valid_role", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1" - ] - }, - "3338": { - "op": "pushint 20", - "defined_out": [ - "20", - "config#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1", - "20" - ] - }, - "3340": { - "op": "==", - "defined_out": [ - "config#0", - "role_address#0", - "role_id#1", - "tmp%0#2" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "tmp%0#2" - ] - }, - "3341": { - "op": "bz rbac_assign_role_after_if_else@3", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3344": { - "op": "bytec 6 // 0x52323023", - "defined_out": [ - "0x52323023", - "config#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52323023" - ] - }, - "3346": { - "op": "dig 3", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52323023", - "role_address#0" - ] - }, - "3348": { - "op": "app_global_put", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3349": { - "block": "rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14", - "stack_in": [ - "role_address#0", - "config#0", - "role_id#1" - ], - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%2#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "tmp%2#1" - ] - }, - "3351": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "aggregate%val_as_bytes%0#0" - ] - }, - "3352": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "aggregate%val_as_bytes%0#0", - "0x151f7c75" - ] - }, - "3353": { - "op": "swap", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ] - }, - "3354": { - "op": "concat", - "defined_out": [ - "tmp%7#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "tmp%7#0" - ] - }, - "3355": { - "op": "log", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3356": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "1" - ] - }, - "3357": { - "op": "return", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3358": { - "block": "rbac_assign_role_after_if_else@3", - "stack_in": [ - "role_address#0", - "config#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1" - ] - }, - "3359": { - "op": "pushint 40", - "defined_out": [ - "40", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1", - "40" - ] - }, - "3361": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%1#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "tmp%1#1" - ] - }, - "3362": { - "op": "bz rbac_assign_role_after_if_else@5", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3365": { - "op": "bytec 12 // 0x52343023", - "defined_out": [ - "0x52343023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52343023" - ] - }, - "3367": { - "op": "dig 3", - "defined_out": [ - "0x52343023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52343023", - "role_address#0" - ] - }, - "3369": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%0#0" - ] - }, - "3370": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#0", - "box_prefixed_key%0#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%0#0", - "box_prefixed_key%0#0 (copy)" - ] - }, - "3371": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#0", - "maybe_exists%0#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%0#0", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "3372": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%0#0", - "maybe_exists%0#0" - ] - }, - "3374": { - "op": "!", - "defined_out": [ - "box_prefixed_key%0#0", - "role_address#0", - "role_id#1", - "tmp%2#2" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%0#0", - "tmp%2#2" - ] - }, - "3375": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%0#0" - ] - }, - "3376": { - "op": "dig 2", - "defined_out": [ - "box_prefixed_key%0#0", - "config#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%0#0", - "config#0" - ] - }, - "3378": { - "op": "box_put", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3379": { - "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14" - }, - "3382": { - "block": "rbac_assign_role_after_if_else@5", - "stack_in": [ - "role_address#0", - "config#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1" - ] - }, - "3383": { - "op": "pushint 50", - "defined_out": [ - "50", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1", - "50" - ] - }, - "3385": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%3#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "tmp%3#1" - ] - }, - "3386": { - "op": "bz rbac_assign_role_after_if_else@7", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3389": { - "op": "bytec 20 // 0x52353023", - "defined_out": [ - "0x52353023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52353023" - ] - }, - "3391": { - "op": "dig 3", - "defined_out": [ - "0x52353023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52353023", - "role_address#0" - ] - }, - "3393": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%2#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%2#0" - ] - }, - "3394": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%2#0", - "box_prefixed_key%2#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%2#0", - "box_prefixed_key%2#0 (copy)" - ] - }, - "3395": { - "op": "box_len", - "defined_out": [ - "_%1#0", - "box_prefixed_key%2#0", - "maybe_exists%1#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%2#0", - "_%1#0", - "maybe_exists%1#0" - ] - }, - "3396": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%2#0", - "maybe_exists%1#0" - ] - }, - "3398": { - "op": "!", - "defined_out": [ - "box_prefixed_key%2#0", - "role_address#0", - "role_id#1", - "tmp%4#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%2#0", - "tmp%4#0" - ] - }, - "3399": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%2#0" - ] - }, - "3400": { - "op": "dig 2", - "defined_out": [ - "box_prefixed_key%2#0", - "config#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%2#0", - "config#0" - ] - }, - "3402": { - "op": "box_put", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3403": { - "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14" - }, - "3406": { - "block": "rbac_assign_role_after_if_else@7", - "stack_in": [ - "role_address#0", - "config#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1" - ] - }, - "3407": { - "op": "pushint 60", - "defined_out": [ - "60", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1", - "60" - ] - }, - "3409": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%5#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "tmp%5#0" - ] - }, - "3410": { - "op": "bz rbac_assign_role_after_if_else@9", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3413": { - "op": "bytec 19 // 0x52363023", - "defined_out": [ - "0x52363023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52363023" - ] - }, - "3415": { - "op": "dig 3", - "defined_out": [ - "0x52363023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52363023", - "role_address#0" - ] - }, - "3417": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%4#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%4#0" - ] - }, - "3418": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%4#0", - "box_prefixed_key%4#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%4#0", - "box_prefixed_key%4#0 (copy)" - ] - }, - "3419": { - "op": "box_len", - "defined_out": [ - "_%2#0", - "box_prefixed_key%4#0", - "maybe_exists%2#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%4#0", - "_%2#0", - "maybe_exists%2#0" - ] - }, - "3420": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%4#0", - "maybe_exists%2#0" - ] - }, - "3422": { - "op": "!", - "defined_out": [ - "box_prefixed_key%4#0", - "role_address#0", - "role_id#1", - "tmp%6#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%4#0", - "tmp%6#1" - ] - }, - "3423": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%4#0" - ] - }, - "3424": { - "op": "dig 2", - "defined_out": [ - "box_prefixed_key%4#0", - "config#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%4#0", - "config#0" - ] - }, - "3426": { - "op": "box_put", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3427": { - "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14" - }, - "3430": { - "block": "rbac_assign_role_after_if_else@9", - "stack_in": [ - "role_address#0", - "config#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1" - ] - }, - "3431": { - "op": "pushint 70", - "defined_out": [ - "70", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1", - "70" - ] - }, - "3433": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%7#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "tmp%7#1" - ] - }, - "3434": { - "op": "bz rbac_assign_role_after_if_else@11", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3437": { - "op": "bytec 11 // 0x52373023", - "defined_out": [ - "0x52373023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52373023" - ] - }, - "3439": { - "op": "dig 3", - "defined_out": [ - "0x52373023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52373023", - "role_address#0" - ] - }, - "3441": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%6#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%6#0" - ] - }, - "3442": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%6#0", - "box_prefixed_key%6#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%6#0", - "box_prefixed_key%6#0 (copy)" - ] - }, - "3443": { - "op": "box_len", - "defined_out": [ - "_%3#0", - "box_prefixed_key%6#0", - "maybe_exists%3#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%6#0", - "_%3#0", - "maybe_exists%3#0" - ] - }, - "3444": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%6#0", - "maybe_exists%3#0" - ] - }, - "3446": { - "op": "!", - "defined_out": [ - "box_prefixed_key%6#0", - "role_address#0", - "role_id#1", - "tmp%8#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%6#0", - "tmp%8#0" - ] - }, - "3447": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%6#0" - ] - }, - "3448": { - "op": "dig 2", - "defined_out": [ - "box_prefixed_key%6#0", - "config#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%6#0", - "config#0" - ] - }, - "3450": { - "op": "box_put", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3451": { - "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14" - }, - "3454": { - "block": "rbac_assign_role_after_if_else@11", - "stack_in": [ - "role_address#0", - "config#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1" - ] - }, - "3455": { - "op": "pushint 80", - "defined_out": [ - "80", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1", - "80" - ] - }, - "3457": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%9#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "tmp%9#0" - ] - }, - "3458": { - "op": "bz rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3461": { - "op": "bytec 18 // 0x52383023", - "defined_out": [ - "0x52383023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52383023" - ] - }, - "3463": { - "op": "dig 3", - "defined_out": [ - "0x52383023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52383023", - "role_address#0" - ] - }, - "3465": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%8#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%8#0" - ] - }, - "3466": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%8#0", - "box_prefixed_key%8#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%8#0", - "box_prefixed_key%8#0 (copy)" - ] - }, - "3467": { - "op": "box_len", - "defined_out": [ - "_%4#0", - "box_prefixed_key%8#0", - "maybe_exists%4#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%8#0", - "_%4#0", - "maybe_exists%4#0" - ] - }, - "3468": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%8#0", - "maybe_exists%4#0" - ] - }, - "3470": { - "op": "!", - "defined_out": [ - "box_prefixed_key%8#0", - "role_address#0", - "role_id#1", - "tmp%10#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%8#0", - "tmp%10#0" - ] - }, - "3471": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%8#0" - ] - }, - "3472": { - "op": "dig 2", - "defined_out": [ - "box_prefixed_key%8#0", - "config#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%8#0", - "config#0" - ] - }, - "3474": { - "op": "box_put", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3475": { - "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14" - }, - "3478": { - "subroutine": "modules.rbac.RbacModule.rbac_revoke_role[routing]", - "params": {}, - "block": "rbac_revoke_role", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "role_id#0" - ], - "stack_out": [ - "role_id#0" - ] - }, - "3481": { - "op": "dup", - "defined_out": [ - "role_id#0", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0", - "role_id#0 (copy)" - ] - }, - "3482": { - "op": "len", - "defined_out": [ - "len%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "len%0#0" - ] - }, - "3483": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "len%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "len%0#0", - "1" - ] - }, - "3484": { - "op": "==", - "defined_out": [ - "eq%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "eq%0#0" - ] - }, - "3485": { - "error": "invalid number of bytes for arc4.uint8", - "op": "assert // invalid number of bytes for arc4.uint8", - "stack_out": [ - "role_id#0" - ] - }, - "3486": { - "op": "txna ApplicationArgs 2" - }, - "3489": { - "op": "dup", - "defined_out": [ - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "role_address#0", - "role_address#0" - ] - }, - "3490": { - "op": "cover 2", - "defined_out": [ - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "role_address#0" - ] - }, - "3492": { - "op": "len", - "defined_out": [ - "len%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "len%1#0" - ] - }, - "3493": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "len%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "len%1#0", - "32" - ] - }, - "3494": { - "op": "==", - "defined_out": [ - "eq%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "eq%1#0" - ] - }, - "3495": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "role_address#0", - "role_id#0" - ] - }, - "3496": { - "callsub": "modules.rbac.RbacModule.assert_caller_is_arranger", - "op": "callsub assert_caller_is_arranger" - }, - "3499": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "op": "callsub assert_is_not_asset_defaulted" - }, - "3502": { - "op": "btoi", - "defined_out": [ - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3503": { - "op": "dupn 2", - "defined_out": [ - "role_address#0", - "role_id#1", - "role_id#1 (copy)" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "role_id#1 (copy)" - ] - }, - "3505": { - "callsub": "modules.rbac.RbacModule._assert_valid_role", - "op": "callsub _assert_valid_role", - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1" - ] - }, - "3508": { - "op": "dup", - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "role_id#1 (copy)" - ] - }, - "3509": { - "op": "pushint 20", - "defined_out": [ - "20", - "role_address#0", - "role_id#1", - "role_id#1 (copy)" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "role_id#1 (copy)", - "20" - ] - }, - "3511": { - "op": "!=", - "defined_out": [ - "role_address#0", - "role_id#1", - "tmp%0#2" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "tmp%0#2" - ] - }, - "3512": { - "error": "Invalid role identifier", - "op": "assert // Invalid role identifier", - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1" - ] - }, - "3513": { - "op": "pushint 40", - "defined_out": [ - "40", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "40" - ] - }, - "3515": { - "op": "==", - "defined_out": [ - "role_address#0", - "role_id#1", - "tmp%1#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "tmp%1#1" - ] - }, - "3516": { - "op": "bz rbac_revoke_role_after_if_else@3", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3519": { - "op": "bytec 12 // 0x52343023", - "defined_out": [ - "0x52343023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52343023" - ] - }, - "3521": { - "op": "dig 2", - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52343023", - "role_address#0" - ] - }, - "3523": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%0#0" - ] - }, - "3524": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#0", - "box_prefixed_key%0#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%0#0", - "box_prefixed_key%0#0 (copy)" - ] - }, - "3525": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#0", - "maybe_exists%0#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%0#0", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "3526": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%0#0", - "maybe_exists%0#0" - ] - }, - "3528": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%0#0" - ] - }, - "3529": { - "op": "box_del", - "defined_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ] - }, - "3530": { - "op": "pop", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3531": { - "block": "rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12", - "stack_in": [ - "role_address#0", - "role_id#1" - ], - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%2#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "tmp%2#1" - ] - }, - "3533": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "aggregate%val_as_bytes%0#0" - ] - }, - "3534": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "aggregate%val_as_bytes%0#0", - "0x151f7c75" - ] - }, - "3535": { - "op": "swap", - "stack_out": [ - "role_address#0", - "role_id#1", - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ] - }, - "3536": { - "op": "concat", - "defined_out": [ - "tmp%5#0" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "tmp%5#0" - ] - }, - "3537": { - "op": "log", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3538": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "1" - ] - }, - "3539": { - "op": "return", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3540": { - "block": "rbac_revoke_role_after_if_else@3", - "stack_in": [ - "role_address#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1" - ] - }, - "3541": { - "op": "pushint 50", - "defined_out": [ - "50", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "50" - ] - }, - "3543": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%2#2" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "tmp%2#2" - ] - }, - "3544": { - "op": "bz rbac_revoke_role_after_if_else@5", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3547": { - "op": "bytec 20 // 0x52353023", - "defined_out": [ - "0x52353023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52353023" - ] - }, - "3549": { - "op": "dig 2", - "defined_out": [ - "0x52353023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52353023", - "role_address#0" - ] - }, - "3551": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%2#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%2#0" - ] - }, - "3552": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%2#0", - "box_prefixed_key%2#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%2#0", - "box_prefixed_key%2#0 (copy)" - ] - }, - "3553": { - "op": "box_len", - "defined_out": [ - "_%1#0", - "box_prefixed_key%2#0", - "maybe_exists%1#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%2#0", - "_%1#0", - "maybe_exists%1#0" - ] - }, - "3554": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%2#0", - "maybe_exists%1#0" - ] - }, - "3556": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%2#0" - ] - }, - "3557": { - "op": "box_del", - "defined_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ] - }, - "3558": { - "op": "pop", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3559": { - "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" - }, - "3562": { - "block": "rbac_revoke_role_after_if_else@5", - "stack_in": [ - "role_address#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1" - ] - }, - "3563": { - "op": "pushint 60", - "defined_out": [ - "60", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "60" - ] - }, - "3565": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "tmp%3#0" - ] - }, - "3566": { - "op": "bz rbac_revoke_role_after_if_else@7", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3569": { - "op": "bytec 19 // 0x52363023", - "defined_out": [ - "0x52363023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52363023" - ] - }, - "3571": { - "op": "dig 2", - "defined_out": [ - "0x52363023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52363023", - "role_address#0" - ] - }, - "3573": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%4#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%4#0" - ] - }, - "3574": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%4#0", - "box_prefixed_key%4#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%4#0", - "box_prefixed_key%4#0 (copy)" - ] - }, - "3575": { - "op": "box_len", - "defined_out": [ - "_%2#0", - "box_prefixed_key%4#0", - "maybe_exists%2#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%4#0", - "_%2#0", - "maybe_exists%2#0" - ] - }, - "3576": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%4#0", - "maybe_exists%2#0" - ] - }, - "3578": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%4#0" - ] - }, - "3579": { - "op": "box_del", - "defined_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ] - }, - "3580": { - "op": "pop", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3581": { - "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" - }, - "3584": { - "block": "rbac_revoke_role_after_if_else@7", - "stack_in": [ - "role_address#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1" - ] - }, - "3585": { - "op": "pushint 70", - "defined_out": [ - "70", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "70" - ] - }, - "3587": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%4#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "tmp%4#1" - ] - }, - "3588": { - "op": "bz rbac_revoke_role_after_if_else@9", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3591": { - "op": "bytec 11 // 0x52373023", - "defined_out": [ - "0x52373023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52373023" - ] - }, - "3593": { - "op": "dig 2", - "defined_out": [ - "0x52373023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52373023", - "role_address#0" - ] - }, - "3595": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%6#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%6#0" - ] - }, - "3596": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%6#0", - "box_prefixed_key%6#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%6#0", - "box_prefixed_key%6#0 (copy)" - ] - }, - "3597": { - "op": "box_len", - "defined_out": [ - "_%3#0", - "box_prefixed_key%6#0", - "maybe_exists%3#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%6#0", - "_%3#0", - "maybe_exists%3#0" - ] - }, - "3598": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%6#0", - "maybe_exists%3#0" - ] - }, - "3600": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%6#0" - ] - }, - "3601": { - "op": "box_del", - "defined_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ] - }, - "3602": { - "op": "pop", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3603": { - "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" - }, - "3606": { - "block": "rbac_revoke_role_after_if_else@9", - "stack_in": [ - "role_address#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1" - ] - }, - "3607": { - "op": "pushint 80", - "defined_out": [ - "80", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "80" - ] - }, - "3609": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%5#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "tmp%5#1" - ] - }, - "3610": { - "op": "bz rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3613": { - "op": "bytec 18 // 0x52383023", - "defined_out": [ - "0x52383023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52383023" - ] - }, - "3615": { - "op": "dig 2", - "defined_out": [ - "0x52383023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52383023", - "role_address#0" - ] - }, - "3617": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%8#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%8#0" - ] - }, - "3618": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%8#0", - "box_prefixed_key%8#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%8#0", - "box_prefixed_key%8#0 (copy)" - ] - }, - "3619": { - "op": "box_len", - "defined_out": [ - "_%4#0", - "box_prefixed_key%8#0", - "maybe_exists%4#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%8#0", - "_%4#0", - "maybe_exists%4#0" - ] - }, - "3620": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%8#0", - "maybe_exists%4#0" - ] - }, - "3622": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%8#0" - ] - }, - "3623": { - "op": "box_del", - "defined_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ] - }, - "3624": { - "op": "pop", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3625": { - "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" - }, - "3628": { - "subroutine": "modules.rbac.RbacModule.rbac_gov_asset_suspension[routing]", - "params": {}, - "block": "rbac_gov_asset_suspension", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "3631": { - "op": "dup", - "defined_out": [ - "tmp%0#0", - "tmp%0#0 (copy)" - ], - "stack_out": [ - "tmp%0#0", - "tmp%0#0 (copy)" - ] - }, - "3632": { - "op": "len", - "defined_out": [ - "len%0#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "len%0#0" - ] - }, - "3633": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "len%0#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "len%0#0", - "1" - ] - }, - "3634": { - "op": "==", - "defined_out": [ - "eq%0#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "eq%0#0" - ] - }, - "3635": { - "error": "invalid number of bytes for arc4.bool", - "op": "assert // invalid number of bytes for arc4.bool", - "stack_out": [ - "tmp%0#0" - ] - }, - "3636": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "0" - ] - }, - "3637": { - "op": "getbit", - "defined_out": [ - "suspended#0" - ], - "stack_out": [ - "suspended#0" - ] - }, - "3638": { - "op": "bytec 11 // 0x52373023", - "defined_out": [ - "0x52373023", - "suspended#0" - ], - "stack_out": [ - "suspended#0", - "0x52373023" - ] - }, - "3640": { - "op": "txn Sender", - "defined_out": [ - "0x52373023", - "suspended#0", - "tmp%0#2" - ], - "stack_out": [ - "suspended#0", - "0x52373023", - "tmp%0#2" - ] - }, - "3642": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "suspended#0", - "tmp%1#0" - ], - "stack_out": [ - "suspended#0", - "tmp%1#0" - ] - }, - "3645": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "suspended#0" - ] - }, - "3646": { - "op": "bytec 22 // \"asset_suspended\"", - "defined_out": [ - "\"asset_suspended\"", - "suspended#0" - ], - "stack_out": [ - "suspended#0", - "\"asset_suspended\"" - ] - }, - "3648": { - "op": "swap", - "stack_out": [ - "\"asset_suspended\"", - "suspended#0" - ] - }, - "3649": { - "op": "app_global_put", - "stack_out": [] - }, - "3650": { - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1" - ] - }, - "3652": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0" - ] - }, - "3653": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0", - "0x151f7c75" - ] - }, - "3654": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ] - }, - "3655": { - "op": "concat", - "defined_out": [ - "tmp%4#0" - ], - "stack_out": [ - "tmp%4#0" - ] - }, - "3656": { - "op": "log", - "stack_out": [] - }, - "3657": { - "op": "intc_1 // 1", - "stack_out": [ - "1" - ] - }, - "3658": { - "op": "return", - "stack_out": [] - }, - "3659": { - "subroutine": "modules.rbac.RbacModule.rbac_get_arranger[routing]", - "params": {}, - "block": "rbac_get_arranger", - "stack_in": [], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "0" - ] - }, - "3660": { - "op": "bytec 6 // 0x52323023", - "defined_out": [ - "0", - "0x52323023" - ], - "stack_out": [ - "0", - "0x52323023" - ] - }, - "3662": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "3663": { - "error": "check self.arranger exists", - "op": "assert // check self.arranger exists", - "stack_out": [ - "maybe_value%0#0" - ] - }, - "3664": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "0x151f7c75" - ] - }, - "3665": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "maybe_value%0#0" - ] - }, - "3666": { - "op": "concat", - "defined_out": [ - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0" - ] - }, - "3667": { - "op": "log", - "stack_out": [] - }, - "3668": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "3669": { - "op": "return", - "stack_out": [] - }, - "3670": { - "subroutine": "modules.rbac.RbacModule.rbac_get_address_roles[routing]", - "params": {}, - "block": "rbac_get_address_roles", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "address#0" - ], - "stack_out": [ - "address#0" - ] - }, - "3673": { - "op": "dup", - "defined_out": [ - "address#0", - "address#0 (copy)" - ], - "stack_out": [ - "address#0", - "address#0 (copy)" - ] - }, - "3674": { - "op": "len", - "defined_out": [ - "address#0", - "len%0#0" - ], - "stack_out": [ - "address#0", - "len%0#0" - ] - }, - "3675": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "address#0", - "len%0#0" - ], - "stack_out": [ - "address#0", - "len%0#0", - "32" - ] - }, - "3676": { - "op": "==", - "defined_out": [ - "address#0", - "eq%0#0" - ], - "stack_out": [ - "address#0", - "eq%0#0" - ] - }, - "3677": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "address#0" - ] - }, - "3678": { - "op": "bytec 12 // 0x52343023", - "defined_out": [ - "0x52343023", - "address#0" - ], - "stack_out": [ - "address#0", - "0x52343023" - ] - }, - "3680": { - "op": "dig 1", - "stack_out": [ - "address#0", - "0x52343023", - "address#0 (copy)" - ] - }, - "3682": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "address#0", - "tmp%0#1" - ], - "stack_out": [ - "address#0", - "tmp%0#1" - ] - }, - "3685": { - "op": "bytec 20 // 0x52353023", - "defined_out": [ - "0x52353023", - "address#0", - "tmp%0#1" - ], - "stack_out": [ - "address#0", - "tmp%0#1", - "0x52353023" - ] - }, - "3687": { - "op": "dig 2", - "stack_out": [ - "address#0", - "tmp%0#1", - "0x52353023", - "address#0 (copy)" - ] - }, - "3689": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1" - ], - "stack_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1" - ] - }, - "3692": { - "op": "bytec 19 // 0x52363023", - "defined_out": [ - "0x52363023", - "address#0", - "tmp%0#1", - "tmp%1#1" - ], - "stack_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "0x52363023" - ] - }, - "3694": { - "op": "dig 3", - "stack_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "0x52363023", - "address#0 (copy)" - ] - }, - "3696": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1" - ], - "stack_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1" - ] - }, - "3699": { - "op": "bytec 11 // 0x52373023", - "defined_out": [ - "0x52373023", - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1" - ], - "stack_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "0x52373023" - ] - }, - "3701": { - "op": "dig 4", - "stack_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "0x52373023", - "address#0 (copy)" - ] - }, - "3703": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1" - ], - "stack_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1" - ] - }, - "3706": { - "op": "bytec 18 // 0x52383023", - "defined_out": [ - "0x52383023", - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1" - ], - "stack_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "0x52383023" - ] - }, - "3708": { - "op": "uncover 5", - "stack_out": [ - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "0x52383023", - "address#0" - ] - }, - "3710": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1" - ] - }, - "3713": { - "op": "bytec 30 // 0x00", - "defined_out": [ - "0x00", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1", - "0x00" - ] - }, - "3715": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "0x00", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1", - "0x00", - "0" - ] - }, - "3716": { - "op": "uncover 6", - "stack_out": [ - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1", - "0x00", - "0", - "tmp%0#1" - ] - }, - "3718": { - "op": "setbit", - "defined_out": [ - "aggregate%encoded_bool%0#0", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1", - "aggregate%encoded_bool%0#0" - ] - }, - "3719": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "aggregate%encoded_bool%0#0", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1", - "aggregate%encoded_bool%0#0", - "1" - ] - }, - "3720": { - "op": "uncover 5", - "stack_out": [ - "tmp%2#1", - "tmp%3#1", - "tmp%4#1", - "aggregate%encoded_bool%0#0", - "1", - "tmp%1#1" - ] - }, - "3722": { - "op": "setbit", - "defined_out": [ - "aggregate%set_bit%0#0", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%2#1", - "tmp%3#1", - "tmp%4#1", - "aggregate%set_bit%0#0" - ] - }, - "3723": { - "op": "pushint 2", - "defined_out": [ - "2", - "aggregate%set_bit%0#0", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%2#1", - "tmp%3#1", - "tmp%4#1", - "aggregate%set_bit%0#0", - "2" - ] - }, - "3725": { - "op": "uncover 4", - "stack_out": [ - "tmp%3#1", - "tmp%4#1", - "aggregate%set_bit%0#0", - "2", - "tmp%2#1" - ] - }, - "3727": { - "op": "setbit", - "defined_out": [ - "aggregate%set_bit%1#0", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%3#1", - "tmp%4#1", - "aggregate%set_bit%1#0" - ] - }, - "3728": { - "op": "pushint 3", - "defined_out": [ - "3", - "aggregate%set_bit%1#0", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%3#1", - "tmp%4#1", - "aggregate%set_bit%1#0", - "3" - ] - }, - "3730": { - "op": "uncover 3", - "stack_out": [ - "tmp%4#1", - "aggregate%set_bit%1#0", - "3", - "tmp%3#1" - ] - }, - "3732": { - "op": "setbit", - "defined_out": [ - "aggregate%set_bit%2#0", - "tmp%4#1" - ], - "stack_out": [ - "tmp%4#1", - "aggregate%set_bit%2#0" - ] - }, - "3733": { - "op": "pushint 4", - "defined_out": [ - "4", - "aggregate%set_bit%2#0", - "tmp%4#1" - ], - "stack_out": [ - "tmp%4#1", - "aggregate%set_bit%2#0", - "4" - ] - }, - "3735": { - "op": "uncover 2", - "stack_out": [ - "aggregate%set_bit%2#0", - "4", - "tmp%4#1" - ] - }, - "3737": { - "op": "setbit", - "defined_out": [ - "aggregate%set_bit%3#0" - ], - "stack_out": [ - "aggregate%set_bit%3#0" - ] - }, - "3738": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%set_bit%3#0" - ], - "stack_out": [ - "aggregate%set_bit%3#0", - "0x151f7c75" - ] - }, - "3739": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%set_bit%3#0" - ] - }, - "3740": { - "op": "concat", - "defined_out": [ - "tmp%8#0" - ], - "stack_out": [ - "tmp%8#0" - ] - }, - "3741": { - "op": "log", - "stack_out": [] - }, - "3742": { - "op": "intc_1 // 1", - "stack_out": [ - "1" - ] - }, - "3743": { - "op": "return", - "stack_out": [] - }, - "3744": { - "subroutine": "modules.rbac.RbacModule.rbac_get_role_config[routing]", - "params": {}, - "block": "rbac_get_role_config", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "role_id#0" - ], - "stack_out": [ - "role_id#0" - ] - }, - "3747": { - "op": "dup", - "defined_out": [ - "role_id#0", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0", - "role_id#0 (copy)" - ] - }, - "3748": { - "op": "len", - "defined_out": [ - "len%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "len%0#0" - ] - }, - "3749": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "len%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "len%0#0", - "1" - ] - }, - "3750": { - "op": "==", - "defined_out": [ - "eq%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "eq%0#0" - ] - }, - "3751": { - "error": "invalid number of bytes for arc4.uint8", - "op": "assert // invalid number of bytes for arc4.uint8", - "stack_out": [ - "role_id#0" - ] - }, - "3752": { - "op": "txna ApplicationArgs 2" - }, - "3755": { - "op": "dup", - "defined_out": [ - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "role_address#0", - "role_address#0" - ] - }, - "3756": { - "op": "cover 2", - "defined_out": [ - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "role_address#0" - ] - }, - "3758": { - "op": "len", - "defined_out": [ - "len%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "len%1#0" - ] - }, - "3759": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "len%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "len%1#0", - "32" - ] - }, - "3760": { - "op": "==", - "defined_out": [ - "eq%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "eq%1#0" - ] - }, - "3761": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "role_address#0", - "role_id#0" - ] - }, - "3762": { - "op": "btoi", - "defined_out": [ - "role#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "role#0" - ] - }, - "3763": { - "op": "dup", - "defined_out": [ - "role#0", - "role#0 (copy)", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "role#0", - "role#0 (copy)" - ] - }, - "3764": { - "callsub": "modules.rbac.RbacModule._assert_valid_role", - "op": "callsub _assert_valid_role", - "stack_out": [ - "role_address#0", - "role#0" - ] - }, - "3767": { - "op": "pushints 20 40 50 60 70 80", - "defined_out": [ - "20", - "40", - "50", - "60", - "70", - "80", - "role#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "role#0", - "20", - "40", - "50", - "60", - "70", - "80" - ] - }, - "3775": { - "op": "uncover 6", - "stack_out": [ - "role_address#0", - "20", - "40", - "50", - "60", - "70", - "80", - "role#0" - ] - }, - "3777": { - "op": "match rbac_get_role_config_switch_case_0@2 rbac_get_role_config_switch_case_1@3 rbac_get_role_config_switch_case_2@4 rbac_get_role_config_switch_case_3@5 rbac_get_role_config_switch_case_4@6 rbac_get_role_config_switch_case_5@7", - "stack_out": [ - "role_address#0" - ] - }, - "3791": { - "error": "Invalid role identifier", - "op": "err // Invalid role identifier" - }, - "3792": { - "block": "rbac_get_role_config_switch_case_5@7", - "stack_in": [ - "role_address#0" - ], - "op": "bytec 18 // 0x52383023", - "defined_out": [ - "0x52383023" - ], - "stack_out": [ - "role_address#0", - "0x52383023" - ] - }, - "3794": { - "op": "dig 1", - "defined_out": [ - "0x52383023", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "0x52383023", - "role_address#0" - ] - }, - "3796": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "3797": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "3798": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "3799": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "3801": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "3802": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%8#0", - "aggregate%box_get%9#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "aggregate%box_get%8#0", - "aggregate%box_get%9#0" - ] - }, - "3803": { - "op": "pop", - "defined_out": [ - "role_address#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "tmp%3#0" - ] - }, - "3804": { - "block": "rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9", - "stack_in": [ - "role_address#0", - "tmp%3#0" - ], - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75" - ], - "stack_out": [ - "role_address#0", - "tmp%3#0", - "0x151f7c75" - ] - }, - "3805": { - "op": "swap", - "defined_out": [ - "0x151f7c75", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "0x151f7c75", - "tmp%3#0" - ] - }, - "3806": { - "op": "concat", - "defined_out": [ - "tmp%4#0" - ], - "stack_out": [ - "role_address#0", - "tmp%4#0" - ] - }, - "3807": { - "op": "log", - "stack_out": [ - "role_address#0" - ] - }, - "3808": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "role_address#0", - "1" - ] - }, - "3809": { - "op": "return", - "stack_out": [ - "role_address#0" - ] - }, - "3810": { - "block": "rbac_get_role_config_switch_case_4@6", - "stack_in": [ - "role_address#0" - ], - "op": "bytec 11 // 0x52373023", - "defined_out": [ - "0x52373023" - ], - "stack_out": [ - "role_address#0", - "0x52373023" - ] - }, - "3812": { - "op": "dig 1", - "defined_out": [ - "0x52373023", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "0x52373023", - "role_address#0" - ] - }, - "3814": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "3815": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "3816": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "3817": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "3819": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "3820": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%6#0", - "aggregate%box_get%7#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "aggregate%box_get%6#0", - "aggregate%box_get%7#0" - ] - }, - "3821": { - "op": "pop", - "defined_out": [ - "role_address#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "tmp%3#0" - ] - }, - "3822": { - "op": "b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9" - }, - "3825": { - "block": "rbac_get_role_config_switch_case_3@5", - "stack_in": [ - "role_address#0" - ], - "op": "bytec 19 // 0x52363023", - "defined_out": [ - "0x52363023" - ], - "stack_out": [ - "role_address#0", - "0x52363023" - ] - }, - "3827": { - "op": "dig 1", - "defined_out": [ - "0x52363023", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "0x52363023", - "role_address#0" - ] - }, - "3829": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "3830": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "3831": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "3832": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "3834": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "3835": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%4#0", - "aggregate%box_get%5#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "aggregate%box_get%4#0", - "aggregate%box_get%5#0" - ] - }, - "3836": { - "op": "pop", - "defined_out": [ - "role_address#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "tmp%3#0" - ] - }, - "3837": { - "op": "b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9" - }, - "3840": { - "block": "rbac_get_role_config_switch_case_2@4", - "stack_in": [ - "role_address#0" - ], - "op": "bytec 20 // 0x52353023", - "defined_out": [ - "0x52353023" - ], - "stack_out": [ - "role_address#0", - "0x52353023" - ] - }, - "3842": { - "op": "dig 1", - "defined_out": [ - "0x52353023", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "0x52353023", - "role_address#0" - ] - }, - "3844": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "3845": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "3846": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "3847": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "3849": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "3850": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%2#0", - "aggregate%box_get%3#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "aggregate%box_get%2#0", - "aggregate%box_get%3#0" - ] - }, - "3851": { - "op": "pop", - "defined_out": [ - "role_address#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "tmp%3#0" - ] - }, - "3852": { - "op": "b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9" - }, - "3855": { - "block": "rbac_get_role_config_switch_case_1@3", - "stack_in": [ - "role_address#0" - ], - "op": "bytec 12 // 0x52343023", - "defined_out": [ - "0x52343023" - ], - "stack_out": [ - "role_address#0", - "0x52343023" - ] - }, - "3857": { - "op": "dig 1", - "defined_out": [ - "0x52343023", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "0x52343023", - "role_address#0" - ] - }, - "3859": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "3860": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "3861": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "3862": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "3864": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "3865": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "3866": { - "op": "pop", - "defined_out": [ - "role_address#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "tmp%3#0" - ] - }, - "3867": { - "op": "b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9" - }, - "3870": { - "block": "rbac_get_role_config_switch_case_0@2", - "stack_in": [ - "role_address#0" - ], - "op": "pushbytes 0x00000000000000000000000000000000", - "defined_out": [ - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "tmp%3#0" - ] - }, - "3888": { - "op": "b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9" - }, - "3891": { - "subroutine": "modules.core_financial.coupon.PerpetualCouponCashflowMixin.count_due_coupons", - "params": {}, - "block": "count_due_coupons", - "stack_in": [], - "op": "proto 0 1" - }, - "3894": { - "op": "intc_0 // 0" - }, - "3895": { - "op": "global LatestTimestamp" - }, - "3897": { - "op": "dup" - }, - "3898": { - "op": "intc_0 // 0" - }, - "3899": { - "op": "bytec_3 // \"issuance_date\"", - "defined_out": [ - "\"issuance_date\"", - "0", - "current_ts#0", - "due_coupons#0" - ], - "stack_out": [ - "due_coupons#0", - "current_ts#0", - "current_ts#0", - "0", - "\"issuance_date\"" - ] - }, - "3900": { - "op": "app_global_get_ex", - "defined_out": [ - "current_ts#0", - "due_coupons#0", - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "due_coupons#0", - "current_ts#0", - "current_ts#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "3901": { - "error": "check self.issuance_date exists", - "op": "assert // check self.issuance_date exists", - "stack_out": [ - "due_coupons#0", - "current_ts#0", - "current_ts#0", - "maybe_value%0#0" - ] - }, - "3902": { - "op": ">", - "defined_out": [ - "current_ts#0", - "due_coupons#0", - "tmp%1#0" - ], - "stack_out": [ - "due_coupons#0", - "current_ts#0", - "tmp%1#0" - ] - }, - "3903": { - "op": "bz count_due_coupons_after_if_else@2", - "stack_out": [ - "due_coupons#0", - "current_ts#0" - ] - }, - "3906": { - "op": "intc_0 // 0", - "stack_out": [ - "due_coupons#0", - "current_ts#0", - "0" - ] - }, - "3907": { - "op": "bytec_3 // \"issuance_date\"", - "stack_out": [ - "due_coupons#0", - "current_ts#0", - "0", - "\"issuance_date\"" - ] - }, - "3908": { - "op": "app_global_get_ex", - "defined_out": [ - "current_ts#0", - "due_coupons#0", - "maybe_exists%1#0", - "maybe_value%1#0" - ], - "stack_out": [ - "due_coupons#0", - "current_ts#0", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "3909": { - "error": "check self.issuance_date exists", - "op": "assert // check self.issuance_date exists", - "stack_out": [ - "due_coupons#0", - "current_ts#0", - "maybe_value%1#0" - ] - }, - "3910": { - "op": "frame_dig 1", - "stack_out": [ - "due_coupons#0", - "current_ts#0", - "maybe_value%1#0", - "current_ts#0" - ] - }, - "3912": { - "op": "swap", - "stack_out": [ - "due_coupons#0", - "current_ts#0", - "current_ts#0", - "maybe_value%1#0" - ] - }, - "3913": { - "op": "-", - "defined_out": [ - "current_ts#0", - "due_coupons#0", - "tmp%2#0" - ], - "stack_out": [ - "due_coupons#0", - "current_ts#0", - "tmp%2#0" - ] - }, - "3914": { - "op": "intc_0 // 0", - "stack_out": [ - "due_coupons#0", - "current_ts#0", - "tmp%2#0", - "0" - ] - }, - "3915": { - "op": "bytec 17 // \"coupon_period\"", - "defined_out": [ - "\"coupon_period\"", - "0", - "current_ts#0", - "due_coupons#0", - "tmp%2#0" - ], - "stack_out": [ - "due_coupons#0", - "current_ts#0", - "tmp%2#0", - "0", - "\"coupon_period\"" - ] - }, - "3917": { - "op": "app_global_get_ex", - "defined_out": [ - "current_ts#0", - "due_coupons#0", - "maybe_exists%2#0", - "maybe_value%2#0", - "tmp%2#0" - ], - "stack_out": [ - "due_coupons#0", - "current_ts#0", - "tmp%2#0", - "maybe_value%2#0", - "maybe_exists%2#0" - ] - }, - "3918": { - "error": "check self.coupon_period exists", - "op": "assert // check self.coupon_period exists", - "stack_out": [ - "due_coupons#0", - "current_ts#0", - "tmp%2#0", - "maybe_value%2#0" - ] - }, - "3919": { - "op": "/", - "stack_out": [ - "due_coupons#0", - "current_ts#0", - "due_coupons#0" - ] - }, - "3920": { - "op": "frame_bury 0", - "stack_out": [ - "due_coupons#0", - "current_ts#0" - ] - }, - "3922": { - "block": "count_due_coupons_after_if_else@2", - "stack_in": [ - "due_coupons#0", - "current_ts#0" - ], - "retsub": true, - "op": "retsub", - "defined_out": [ - "due_coupons#0" - ], - "stack_out": [ - "due_coupons#0", - "current_ts#0", - "due_coupons#0" - ] - }, - "3923": { - "subroutine": "modules.core_financial.coupon.PerpetualCouponCashflowMixin.coupon_due_date", - "params": { - "coupon#0": "uint64" - }, - "block": "coupon_due_date", - "stack_in": [], - "op": "proto 1 1" - }, - "3926": { - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "0" - ] - }, - "3927": { - "op": "bytec_3 // \"issuance_date\"", - "defined_out": [ - "\"issuance_date\"", - "0" - ], - "stack_out": [ - "0", - "\"issuance_date\"" - ] - }, - "3928": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "3929": { - "error": "check self.issuance_date exists", - "op": "assert // check self.issuance_date exists", - "stack_out": [ - "maybe_value%0#0" - ] - }, - "3930": { - "op": "intc_0 // 0", - "stack_out": [ - "maybe_value%0#0", - "0" - ] - }, - "3931": { - "op": "bytec 17 // \"coupon_period\"", - "defined_out": [ - "\"coupon_period\"", - "0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "0", - "\"coupon_period\"" - ] - }, - "3933": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%1#0", - "maybe_value%0#0", - "maybe_value%1#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "3934": { - "error": "check self.coupon_period exists", - "op": "assert // check self.coupon_period exists", - "stack_out": [ - "maybe_value%0#0", - "maybe_value%1#0" - ] - }, - "3935": { - "op": "frame_dig -1", - "defined_out": [ - "coupon#0 (copy)", - "maybe_value%0#0", - "maybe_value%1#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_value%1#0", - "coupon#0 (copy)" - ] - }, - "3937": { - "op": "*", - "defined_out": [ - "maybe_value%0#0", - "tmp%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "tmp%0#0" - ] - }, - "3938": { - "op": "+", - "defined_out": [ - "tmp%1#0" - ], - "stack_out": [ - "tmp%1#0" - ] - }, - "3939": { - "retsub": true, - "op": "retsub" - }, - "3940": { - "subroutine": "modules.core_financial.coupon.PerpetualCouponCashflowMixin.day_count_factor", - "params": { - "due_coupons#0": "uint64" - }, - "block": "day_count_factor", - "stack_in": [], - "op": "proto 1 1" - }, - "3943": { - "op": "pushbytes \"\"", - "stack_out": [ - "coupon_accrued_period#0" - ] - }, - "3945": { - "op": "dup", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0" - ] - }, - "3946": { - "op": "frame_dig -1", - "defined_out": [ - "due_coupons#0 (copy)" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "due_coupons#0 (copy)" - ] - }, - "3948": { - "op": "bnz day_count_factor_else_body@2", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0" - ] - }, - "3951": { - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "0" - ] - }, - "3952": { - "op": "bytec_3 // \"issuance_date\"", - "defined_out": [ - "\"issuance_date\"", - "0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "0", - "\"issuance_date\"" - ] - }, - "3953": { - "op": "app_global_get_ex", - "defined_out": [ - "accruing_start_time#0", - "maybe_exists%0#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "accruing_start_time#0", - "maybe_exists%0#0" - ] - }, - "3954": { - "error": "check self.issuance_date exists", - "op": "assert // check self.issuance_date exists", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "accruing_start_time#0" - ] - }, - "3955": { - "block": "day_count_factor_after_if_else@3", - "stack_in": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "accruing_start_time#0" - ], - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%2#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "accruing_start_time#0", - "tmp%2#0" - ] - }, - "3957": { - "op": "swap", - "defined_out": [ - "accruing_start_time#0", - "tmp%2#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "tmp%2#0", - "accruing_start_time#0" - ] - }, - "3958": { - "op": "-", - "defined_out": [ - "coupon_accrued_period#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "coupon_accrued_period#0" - ] - }, - "3959": { - "op": "frame_bury 0", - "defined_out": [ - "coupon_accrued_period#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0" - ] - }, - "3961": { - "op": "intc_0 // 0", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "0" - ] - }, - "3962": { - "op": "bytec 17 // \"coupon_period\"", - "defined_out": [ - "\"coupon_period\"", - "0", - "coupon_accrued_period#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "0", - "\"coupon_period\"" - ] - }, - "3964": { - "op": "app_global_get_ex", - "defined_out": [ - "coupon_accrued_period#0", - "coupon_period#0", - "maybe_exists%1#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "coupon_period#0", - "maybe_exists%1#0" - ] - }, - "3965": { - "error": "check self.coupon_period exists", - "op": "assert // check self.coupon_period exists", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "coupon_period#0" - ] - }, - "3966": { - "op": "intc_0 // 0", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "coupon_period#0", - "0" - ] - }, - "3967": { - "op": "bytec 15 // \"day_count_convention\"", - "defined_out": [ - "\"day_count_convention\"", - "0", - "coupon_accrued_period#0", - "coupon_period#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "coupon_period#0", - "0", - "\"day_count_convention\"" - ] - }, - "3969": { - "op": "app_global_get_ex", - "defined_out": [ - "coupon_accrued_period#0", - "coupon_period#0", - "maybe_exists%2#0", - "maybe_value%2#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "coupon_period#0", - "maybe_value%2#0", - "maybe_exists%2#0" - ] - }, - "3970": { - "error": "check self.day_count_convention exists", - "op": "assert // check self.day_count_convention exists", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "coupon_period#0", - "maybe_value%2#0" - ] - }, - "3971": { - "op": "bnz day_count_factor_after_if_else@5", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "coupon_period#0" - ] - }, - "3974": { - "op": "frame_dig 0", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "coupon_period#0", - "coupon_accrued_period#0" - ] - }, - "3976": { - "op": "intc 6 // 86400", - "defined_out": [ - "86400", - "coupon_accrued_period#0", - "coupon_period#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "coupon_period#0", - "coupon_accrued_period#0", - "86400" - ] - }, - "3978": { - "op": "/", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "coupon_period#0", - "coupon_accrued_period#0" - ] - }, - "3979": { - "op": "frame_bury 0", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "coupon_period#0" - ] - }, - "3981": { - "op": "intc 6 // 86400", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "coupon_period#0", - "86400" - ] - }, - "3983": { - "op": "/", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "coupon_period#0" - ] - }, - "3984": { - "block": "day_count_factor_after_if_else@5", - "stack_in": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "coupon_period#0" - ], - "op": "frame_dig 0", - "defined_out": [ - "coupon_accrued_period#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "coupon_period#0", - "coupon_accrued_period#0" - ] - }, - "3986": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "coupon_accrued_period#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "coupon_period#0", - "aggregate%val_as_bytes%0#0" - ] - }, - "3987": { - "op": "swap", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "coupon_accrued_period#0", - "coupon_period#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "aggregate%val_as_bytes%0#0", - "coupon_period#0" - ] - }, - "3988": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0", - "coupon_accrued_period#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0" - ] - }, - "3989": { - "op": "concat", - "defined_out": [ - "aggregate%head%1#0", - "coupon_accrued_period#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "aggregate%head%1#0" - ] - }, - "3990": { - "op": "frame_bury 0" - }, - "3992": { - "retsub": true, - "op": "retsub" - }, - "3993": { - "block": "day_count_factor_else_body@2", - "stack_in": [ - "coupon_accrued_period#0", - "coupon_due_date#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "coupon_due_date#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "coupon_due_date#0" - ] - }, - "3994": { - "op": "frame_bury 1", - "defined_out": [ - "coupon_due_date#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0" - ] - }, - "3996": { - "op": "frame_dig -1", - "defined_out": [ - "coupon_due_date#0", - "due_coupons#0 (copy)" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "due_coupons#0 (copy)" - ] - }, - "3998": { - "op": "bz day_count_factor_after_if_else@8", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0" - ] - }, - "4001": { - "op": "frame_dig -1", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "due_coupons#0 (copy)" - ] - }, - "4003": { - "callsub": "modules.core_financial.coupon.PerpetualCouponCashflowMixin.coupon_due_date", - "op": "callsub coupon_due_date", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "coupon_due_date#0" - ] - }, - "4006": { - "op": "frame_bury 1", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0" - ] - }, - "4008": { - "block": "day_count_factor_after_if_else@8", - "stack_in": [ - "coupon_accrued_period#0", - "coupon_due_date#0" - ], - "op": "frame_dig 1", - "defined_out": [ - "accruing_start_time#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "accruing_start_time#0" - ] - }, - "4010": { - "op": "b day_count_factor_after_if_else@3" - }, - "4013": { - "subroutine": "modules.core_financial.coupon.PerpetualCouponCashflowMixin.is_accruing_interest", - "params": { - "_due_coupons#0": "uint64" - }, - "block": "is_accruing_interest", - "stack_in": [], - "op": "proto 1 1" - }, - "4016": { - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "0" - ] - }, - "4017": { - "op": "bytec_3 // \"issuance_date\"", - "defined_out": [ - "\"issuance_date\"", - "0" - ], - "stack_out": [ - "0", - "\"issuance_date\"" - ] - }, - "4018": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "4019": { - "error": "check self.issuance_date exists", - "op": "assert // check self.issuance_date exists", - "stack_out": [ - "maybe_value%0#0" - ] - }, - "4020": { - "op": "bz is_accruing_interest_bool_false@3", - "stack_out": [] - }, - "4023": { - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%1#0" - ], - "stack_out": [ - "tmp%1#0" - ] - }, - "4025": { - "op": "intc_0 // 0", - "stack_out": [ - "tmp%1#0", - "0" - ] - }, - "4026": { - "op": "bytec_3 // \"issuance_date\"", - "stack_out": [ - "tmp%1#0", - "0", - "\"issuance_date\"" - ] - }, - "4027": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%1#0", - "maybe_value%1#0", - "tmp%1#0" - ], - "stack_out": [ - "tmp%1#0", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "4028": { - "error": "check self.issuance_date exists", - "op": "assert // check self.issuance_date exists", - "stack_out": [ - "tmp%1#0", - "maybe_value%1#0" - ] - }, - "4029": { - "op": ">", - "defined_out": [ - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0" - ] - }, - "4030": { - "op": "bz is_accruing_interest_bool_false@3", - "stack_out": [] - }, - "4033": { - "op": "intc_1 // 1", - "defined_out": [ - "and_result%0#0" - ], - "stack_out": [ - "and_result%0#0" - ] - }, - "4034": { - "retsub": true, - "op": "retsub" - }, - "4035": { - "block": "is_accruing_interest_bool_false@3", - "stack_in": [], - "op": "intc_0 // 0", - "defined_out": [ - "and_result%0#0" - ], - "stack_out": [ - "and_result%0#0" - ] - }, - "4036": { - "retsub": true, - "op": "retsub" - }, - "4037": { - "subroutine": "modules.core_financial.coupon.PerpetualCouponCashflowMixin.accrued_interest_amount", - "params": { - "holding_address#0": "bytes", - "units#0": "uint64", - "due_coupons#0": "uint64" - }, - "block": "accrued_interest_amount", - "stack_in": [], - "op": "proto 3 1" - }, - "4040": { - "op": "frame_dig -3", - "defined_out": [ - "holding_address#0 (copy)" - ], - "stack_out": [ - "holding_address#0 (copy)" - ] - }, - "4042": { - "op": "frame_dig -1", - "defined_out": [ - "due_coupons#0 (copy)", - "holding_address#0 (copy)" - ], - "stack_out": [ - "holding_address#0 (copy)", - "due_coupons#0 (copy)" - ] - }, - "4044": { - "callsub": "modules.core_financial.coupon.CouponCashflowMixin.assert_no_pending_coupon_payment", - "op": "callsub assert_no_pending_coupon_payment", - "stack_out": [] - }, - "4047": { - "op": "frame_dig -1", - "stack_out": [ - "due_coupons#0 (copy)" - ] - }, - "4049": { - "callsub": "modules.core_financial.coupon.PerpetualCouponCashflowMixin.day_count_factor", - "op": "callsub day_count_factor", - "defined_out": [ - "day_count_factor#0" - ], - "stack_out": [ - "day_count_factor#0" - ] - }, - "4052": { - "op": "dup", - "defined_out": [ - "day_count_factor#0", - "day_count_factor#0 (copy)" - ], - "stack_out": [ - "day_count_factor#0", - "day_count_factor#0 (copy)" - ] - }, - "4053": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "day_count_factor#0", - "day_count_factor#0 (copy)" - ], - "stack_out": [ - "day_count_factor#0", - "day_count_factor#0 (copy)", - "0" - ] - }, - "4054": { - "op": "extract_uint64", - "defined_out": [ - "coupon_accrued_period#0", - "day_count_factor#0" - ], - "stack_out": [ - "day_count_factor#0", - "coupon_accrued_period#0" - ] - }, - "4055": { - "op": "swap", - "stack_out": [ - "coupon_accrued_period#0", - "day_count_factor#0" - ] - }, - "4056": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "coupon_accrued_period#0", - "day_count_factor#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "day_count_factor#0", - "8" - ] - }, - "4057": { - "op": "extract_uint64", - "defined_out": [ - "coupon_accrued_period#0", - "coupon_period#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_period#0" - ] - }, - "4058": { - "op": "frame_dig -3", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_period#0", - "holding_address#0 (copy)" - ] - }, - "4060": { - "op": "frame_dig -2", - "defined_out": [ - "coupon_accrued_period#0", - "coupon_period#0", - "holding_address#0 (copy)", - "units#0 (copy)" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_period#0", - "holding_address#0 (copy)", - "units#0 (copy)" - ] - }, - "4062": { - "callsub": "modules.accounting.AccountingModule.account_units_value", - "op": "callsub account_units_value", - "defined_out": [ - "coupon_accrued_period#0", - "coupon_period#0", - "tmp%1#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_period#0", - "tmp%1#0" - ] - }, - "4065": { - "op": "intc_0 // 0", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_period#0", - "tmp%1#0", - "0" - ] - }, - "4066": { - "op": "bytec 5 // \"interest_rate\"", - "defined_out": [ - "\"interest_rate\"", - "0", - "coupon_accrued_period#0", - "coupon_period#0", - "tmp%1#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_period#0", - "tmp%1#0", - "0", - "\"interest_rate\"" - ] - }, - "4068": { - "op": "app_global_get_ex", - "defined_out": [ - "coupon_accrued_period#0", - "coupon_period#0", - "maybe_exists%0#0", - "maybe_value%0#0", - "tmp%1#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_period#0", - "tmp%1#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "4069": { - "error": "check self.interest_rate exists", - "op": "assert // check self.interest_rate exists", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_period#0", - "tmp%1#0", - "maybe_value%0#0" - ] - }, - "4070": { - "op": "*", - "defined_out": [ - "coupon_accrued_period#0", - "coupon_period#0", - "tmp%2#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_period#0", - "tmp%2#0" - ] - }, - "4071": { - "op": "uncover 2", - "stack_out": [ - "coupon_period#0", - "tmp%2#0", - "coupon_accrued_period#0" - ] - }, - "4073": { - "op": "*", - "defined_out": [ - "coupon_period#0", - "tmp%3#0" - ], - "stack_out": [ - "coupon_period#0", - "tmp%3#0" - ] - }, - "4074": { - "op": "intc 4 // 10000", - "defined_out": [ - "10000", - "coupon_period#0", - "tmp%3#0" - ], - "stack_out": [ - "coupon_period#0", - "tmp%3#0", - "10000" - ] - }, - "4076": { - "op": "uncover 2", - "stack_out": [ - "tmp%3#0", - "10000", - "coupon_period#0" - ] - }, - "4078": { - "op": "*", - "defined_out": [ - "tmp%3#0", - "tmp%4#0" - ], - "stack_out": [ - "tmp%3#0", - "tmp%4#0" - ] - }, - "4079": { - "op": "/", - "defined_out": [ - "tmp%5#0" - ], - "stack_out": [ - "tmp%5#0" - ] - }, - "4080": { - "retsub": true, - "op": "retsub" - }, - "4081": { - "subroutine": "modules.core_financial.coupon.CouponCashflowMixin.all_due_coupons_paid", - "params": { - "due_coupons#0": "uint64" - }, - "block": "all_due_coupons_paid", - "stack_in": [], - "op": "proto 1 1" - }, - "4084": { - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "0" - ] - }, - "4085": { - "op": "bytec 28 // \"paid_coupon_units\"", - "defined_out": [ - "\"paid_coupon_units\"", - "0" - ], - "stack_out": [ - "0", - "\"paid_coupon_units\"" - ] - }, - "4087": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "4088": { - "error": "check self.paid_coupon_units exists", - "op": "assert // check self.paid_coupon_units exists", - "stack_out": [ - "maybe_value%0#0" - ] - }, - "4089": { - "op": "intc_0 // 0", - "stack_out": [ - "maybe_value%0#0", - "0" - ] - }, - "4090": { - "op": "bytec 4 // \"circulating_units\"", - "defined_out": [ - "\"circulating_units\"", - "0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "0", - "\"circulating_units\"" - ] - }, - "4092": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%1#0", - "maybe_value%0#0", - "maybe_value%1#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "4093": { - "error": "check self.circulating_units exists", - "op": "assert // check self.circulating_units exists", - "stack_out": [ - "maybe_value%0#0", - "maybe_value%1#0" - ] - }, - "4094": { - "op": "frame_dig -1", - "defined_out": [ - "due_coupons#0 (copy)", - "maybe_value%0#0", - "maybe_value%1#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_value%1#0", - "due_coupons#0 (copy)" - ] - }, - "4096": { - "op": "*", - "defined_out": [ - "maybe_value%0#0", - "tmp%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "tmp%0#0" - ] - }, - "4097": { - "op": ">=", - "defined_out": [ - "tmp%1#0" - ], - "stack_out": [ - "tmp%1#0" - ] - }, - "4098": { - "retsub": true, - "op": "retsub" - }, - "4099": { - "subroutine": "modules.core_financial.coupon.CouponCashflowMixin.assert_no_pending_coupon_payment", - "params": { - "holding_address#0": "bytes", - "due_coupons#0": "uint64" - }, - "block": "assert_no_pending_coupon_payment", - "stack_in": [], - "op": "proto 2 0" - }, - "4102": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023" - ], - "stack_out": [ - "0x52333023" - ] - }, - "4103": { - "op": "frame_dig -2", - "defined_out": [ - "0x52333023", - "holding_address#0 (copy)" - ], - "stack_out": [ - "0x52333023", - "holding_address#0 (copy)" - ] - }, - "4105": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0" - ] - }, - "4106": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ], - "stack_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "4107": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%box_get%0#0" - ] - }, - "4108": { - "op": "pushint 48", - "defined_out": [ - "48", - "aggregate%box_get%0#0" - ], - "stack_out": [ - "aggregate%box_get%0#0", - "48" - ] - }, - "4110": { - "op": "extract_uint64", - "defined_out": [ - "values%0#0" - ], - "stack_out": [ - "values%0#0" - ] - }, - "4111": { - "op": "frame_dig -1", - "defined_out": [ - "due_coupons#0 (copy)", - "values%0#0" - ], - "stack_out": [ - "values%0#0", - "due_coupons#0 (copy)" - ] - }, - "4113": { - "op": "==", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "4114": { - "error": "Pending due coupon payment", - "op": "assert // Pending due coupon payment", - "stack_out": [] - }, - "4115": { - "retsub": true, - "op": "retsub" - }, - "4116": { - "subroutine": "modules.core_financial.common.CoreFinancialCommonMixin.assert_time_events_sorted", - "params": { - "time_events#0": "bytes" - }, - "block": "assert_time_events_sorted", - "stack_in": [], - "op": "proto 1 1" - }, - "4119": { - "op": "pushbytes \"\"", - "stack_out": [ - "time_f#0" - ] - }, - "4121": { - "op": "dupn 2", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0" - ] - }, - "4123": { - "op": "frame_dig -1", - "defined_out": [ - "time_events#0 (copy)" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "time_events#0 (copy)" - ] - }, - "4125": { - "op": "extract 2 0", - "defined_out": [ - "aggregate%array_trimmed%0#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0" - ] - }, - "4128": { - "op": "frame_dig -1", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "time_events#0 (copy)" - ] - }, - "4130": { - "op": "pushint 2", - "defined_out": [ - "2", - "aggregate%array_trimmed%0#0", - "time_events#0 (copy)" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "time_events#0 (copy)", - "2" - ] - }, - "4132": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "values%0#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "values%0#0" - ] - }, - "4133": { - "op": "global LatestTimestamp", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "tmp%0#0", - "values%0#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "values%0#0", - "tmp%0#0" - ] - }, - "4135": { - "op": ">", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "tmp%1#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%1#0" - ] - }, - "4136": { - "error": "Time events must be set in the future", - "op": "assert // Time events must be set in the future", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0" - ] - }, - "4137": { - "op": "frame_dig -1", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "time_events#0 (copy)" - ] - }, - "4139": { - "op": "intc_0 // 0", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "time_events#0 (copy)", - "0" - ] - }, - "4140": { - "error": "invalid array length header", - "op": "extract_uint16 // on error: invalid array length header", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_trimmed%0#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "aggregate%array_length%0#0" - ] - }, - "4141": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "aggregate%array_length%0#0", - "aggregate%array_trimmed%0#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "aggregate%array_length%0#0", - "1" - ] - }, - "4142": { - "op": "-", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "tmp%3#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0" - ] - }, - "4143": { - "op": "intc_0 // 0", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "tmp%3#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ] - }, - "4144": { - "block": "assert_time_events_sorted_for_header@1", - "stack_in": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ], - "op": "frame_dig 5", - "defined_out": [ - "idx#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "idx#0" - ] - }, - "4146": { - "op": "frame_dig 4", - "defined_out": [ - "idx#0", - "tmp%3#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "idx#0", - "tmp%3#0" - ] - }, - "4148": { - "op": "<", - "defined_out": [ - "continue_looping%0#0", - "idx#0", - "tmp%3#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "continue_looping%0#0" - ] - }, - "4149": { - "op": "bz assert_time_events_sorted_after_for@6", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ] - }, - "4152": { - "block": "assert_time_events_sorted_while_top@8", - "stack_in": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ], - "op": "pushint 75", - "defined_out": [ - "75" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "75" - ] - }, - "4154": { - "op": "global OpcodeBudget", - "defined_out": [ - "75", - "tmp%1#1" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "75", - "tmp%1#1" - ] - }, - "4156": { - "op": ">", - "defined_out": [ - "tmp%2#1" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "tmp%2#1" - ] - }, - "4157": { - "op": "bz assert_time_events_sorted_after_while@13", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ] - }, - "4160": { - "op": "itxn_begin" - }, - "4161": { - "op": "pushint 6 // appl", - "defined_out": [ - "appl" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "appl" - ] - }, - "4163": { - "op": "itxn_field TypeEnum", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ] - }, - "4165": { - "op": "pushint 5 // DeleteApplication", - "defined_out": [ - "DeleteApplication" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "DeleteApplication" - ] - }, - "4167": { - "op": "itxn_field OnCompletion", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ] - }, - "4169": { - "op": "bytec 34 // 0x068101", - "defined_out": [ - "0x068101" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "0x068101" - ] - }, - "4171": { - "op": "itxn_field ApprovalProgram", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ] - }, - "4173": { - "op": "bytec 34 // 0x068101", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "0x068101" - ] - }, - "4175": { - "op": "itxn_field ClearStateProgram", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ] - }, - "4177": { - "op": "global MinTxnFee", - "defined_out": [ - "tmp%3#1" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "tmp%3#1" - ] - }, - "4179": { - "op": "itxn_field Fee", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ] - }, - "4181": { - "op": "itxn_submit" - }, - "4182": { - "op": "b assert_time_events_sorted_while_top@8" - }, - "4185": { - "block": "assert_time_events_sorted_after_while@13", - "stack_in": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ], - "op": "frame_dig 5", - "defined_out": [ - "idx#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "idx#0" - ] - }, - "4187": { - "op": "dup", - "defined_out": [ - "idx#0", - "idx#0 (copy)" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "idx#0", - "idx#0 (copy)" - ] - }, - "4188": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "idx#0", - "idx#0 (copy)" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "idx#0", - "idx#0 (copy)", - "8" - ] - }, - "4189": { - "op": "*", - "defined_out": [ - "aggregate%bytes_offset%1#0", - "idx#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "idx#0", - "aggregate%bytes_offset%1#0" - ] - }, - "4190": { - "op": "frame_dig 3", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "aggregate%bytes_offset%1#0", - "idx#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "idx#0", - "aggregate%bytes_offset%1#0", - "aggregate%array_trimmed%0#0" - ] - }, - "4192": { - "op": "dup", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "aggregate%array_trimmed%0#0 (copy)", - "aggregate%bytes_offset%1#0", - "idx#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "idx#0", - "aggregate%bytes_offset%1#0", - "aggregate%array_trimmed%0#0 (copy)", - "aggregate%array_trimmed%0#0 (copy)" - ] - }, - "4193": { - "op": "cover 3", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "aggregate%array_trimmed%0#0", - "idx#0", - "aggregate%bytes_offset%1#0", - "aggregate%array_trimmed%0#0 (copy)" - ] - }, - "4195": { - "op": "swap", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "aggregate%array_trimmed%0#0", - "idx#0", - "aggregate%array_trimmed%0#0 (copy)", - "aggregate%bytes_offset%1#0" - ] - }, - "4196": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "time_i#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "aggregate%array_trimmed%0#0", - "idx#0", - "time_i#0" - ] - }, - "4197": { - "op": "dup", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "aggregate%array_trimmed%0#0", - "idx#0", - "time_i#0", - "time_i#0 (copy)" - ] - }, - "4198": { - "op": "cover 3", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_i#0", - "aggregate%array_trimmed%0#0", - "idx#0", - "time_i#0" - ] - }, - "4200": { - "op": "frame_bury 1", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "time_i#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_i#0", - "aggregate%array_trimmed%0#0", - "idx#0" - ] - }, - "4202": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "aggregate%array_trimmed%0#0", - "idx#0", - "time_i#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_i#0", - "aggregate%array_trimmed%0#0", - "idx#0", - "1" - ] - }, - "4203": { - "op": "+", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "time_i#0", - "tmp%4#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_i#0", - "aggregate%array_trimmed%0#0", - "tmp%4#0" - ] - }, - "4204": { - "op": "dup", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_i#0", - "aggregate%array_trimmed%0#0", - "tmp%4#0", - "tmp%4#0" - ] - }, - "4205": { - "op": "frame_bury 2", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "time_i#0", - "tmp%4#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_i#0", - "aggregate%array_trimmed%0#0", - "tmp%4#0" - ] - }, - "4207": { - "op": "intc_3 // 8", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_i#0", - "aggregate%array_trimmed%0#0", - "tmp%4#0", - "8" - ] - }, - "4208": { - "op": "*", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "aggregate%bytes_offset%2#0", - "idx#0", - "time_i#0", - "tmp%4#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_i#0", - "aggregate%array_trimmed%0#0", - "aggregate%bytes_offset%2#0" - ] - }, - "4209": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "time_f#0", - "time_i#0", - "tmp%4#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_i#0", - "time_f#0" - ] - }, - "4210": { - "op": "dup", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_i#0", - "time_f#0", - "time_f#0" - ] - }, - "4211": { - "op": "frame_bury 0", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "time_f#0", - "time_i#0", - "tmp%4#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_i#0", - "time_f#0" - ] - }, - "4213": { - "op": "<", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "time_f#0", - "time_i#0", - "tmp%4#0", - "tmp%5#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "tmp%5#0" - ] - }, - "4214": { - "error": "Time events must be sorted in strictly ascending order", - "op": "assert // Time events must be sorted in strictly ascending order", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ] - }, - "4215": { - "op": "intc_0 // 0", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "0" - ] - }, - "4216": { - "op": "bytec 15 // \"day_count_convention\"", - "defined_out": [ - "\"day_count_convention\"", - "0", - "aggregate%array_trimmed%0#0", - "idx#0", - "time_f#0", - "time_i#0", - "tmp%4#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "0", - "\"day_count_convention\"" - ] - }, - "4218": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "maybe_exists%0#0", - "maybe_value%0#0", - "time_f#0", - "time_i#0", - "tmp%4#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "4219": { - "error": "check self.day_count_convention exists", - "op": "assert // check self.day_count_convention exists", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "maybe_value%0#0" - ] - }, - "4220": { - "op": "pushint 255", - "defined_out": [ - "255", - "aggregate%array_trimmed%0#0", - "idx#0", - "maybe_value%0#0", - "time_f#0", - "time_i#0", - "tmp%4#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "maybe_value%0#0", - "255" - ] - }, - "4223": { - "op": "!=", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "time_f#0", - "time_i#0", - "tmp%4#0", - "tmp%6#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "tmp%6#0" - ] - }, - "4224": { - "op": "bz assert_time_events_sorted_after_if_else@4", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ] - }, - "4227": { - "op": "frame_dig 0", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_f#0" - ] - }, - "4229": { - "op": "frame_dig 1", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_f#0", - "time_i#0" - ] - }, - "4231": { - "op": "-", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "time_f#0", - "time_i#0", - "tmp%4#0", - "tmp%7#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "tmp%7#0" - ] - }, - "4232": { - "op": "intc 6 // 86400", - "defined_out": [ - "86400", - "aggregate%array_trimmed%0#0", - "idx#0", - "time_f#0", - "time_i#0", - "tmp%4#0", - "tmp%7#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "tmp%7#0", - "86400" - ] - }, - "4234": { - "op": "%", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "time_f#0", - "time_i#0", - "tmp%4#0", - "tmp%8#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "tmp%8#0" - ] - }, - "4235": { - "op": "!", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "time_f#0", - "time_i#0", - "tmp%4#0", - "tmp%9#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "tmp%9#0" - ] - }, - "4236": { - "error": "Time periods in Actual/Actual day count convention must be multiples of a day (in seconds)", - "op": "assert // Time periods in Actual/Actual day count convention must be multiples of a day (in seconds)", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ] - }, - "4237": { - "block": "assert_time_events_sorted_after_if_else@4", - "stack_in": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ], - "op": "frame_dig 2", - "defined_out": [ - "idx#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "idx#0" - ] - }, - "4239": { - "op": "frame_bury 5", - "defined_out": [ - "idx#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ] - }, - "4241": { - "op": "b assert_time_events_sorted_for_header@1" - }, - "4244": { - "block": "assert_time_events_sorted_after_for@6", - "stack_in": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ], - "op": "frame_dig -1", - "defined_out": [ - "time_events#0 (copy)" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_events#0 (copy)" - ] - }, - "4246": { - "op": "frame_bury 0" - }, - "4248": { - "retsub": true, - "op": "retsub" - }, - "4249": { - "subroutine": "modules.accounting.AccountingModule.assert_is_not_account_suspended", - "params": { - "holding_address#0": "bytes" - }, - "block": "assert_is_not_account_suspended", - "stack_in": [], - "op": "proto 1 0" - }, - "4252": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023" - ], - "stack_out": [ - "0x52333023" - ] - }, - "4253": { - "op": "frame_dig -1", - "defined_out": [ - "0x52333023", - "holding_address#0 (copy)" - ], - "stack_out": [ - "0x52333023", - "holding_address#0 (copy)" - ] - }, - "4255": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0" - ] - }, - "4256": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ], - "stack_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "4257": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%box_get%0#0" - ] - }, - "4258": { - "op": "pushint 448", - "defined_out": [ - "448", - "aggregate%box_get%0#0" - ], - "stack_out": [ - "aggregate%box_get%0#0", - "448" - ] - }, - "4261": { - "op": "getbit", - "defined_out": [ - "aggregate%get_bit%0#0" - ], - "stack_out": [ - "aggregate%get_bit%0#0" - ] - }, - "4262": { - "op": "!", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "4263": { - "error": "Suspended operations", - "op": "assert // Suspended operations", - "stack_out": [] - }, - "4264": { - "retsub": true, - "op": "retsub" - }, - "4265": { - "subroutine": "modules.accounting.AccountingModule.account_units_value", - "params": { - "holding_address#0": "bytes", - "units#0": "uint64" - }, - "block": "account_units_value", - "stack_in": [], - "op": "proto 2 1" - }, - "4268": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023" - ], - "stack_out": [ - "0x52333023" - ] - }, - "4269": { - "op": "frame_dig -2", - "defined_out": [ - "0x52333023", - "holding_address#0 (copy)" - ], - "stack_out": [ - "0x52333023", - "holding_address#0 (copy)" - ] - }, - "4271": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0" - ] - }, - "4272": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ], - "stack_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "4273": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%box_get%0#0" - ] - }, - "4274": { - "op": "pushint 40", - "defined_out": [ - "40", - "aggregate%box_get%0#0" - ], - "stack_out": [ - "aggregate%box_get%0#0", - "40" - ] - }, - "4276": { - "op": "extract_uint64", - "defined_out": [ - "values%0#0" - ], - "stack_out": [ - "values%0#0" - ] - }, - "4277": { - "op": "frame_dig -1", - "defined_out": [ - "units#0 (copy)", - "values%0#0" - ], - "stack_out": [ - "values%0#0", - "units#0 (copy)" - ] - }, - "4279": { - "op": "*", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "4280": { - "retsub": true, - "op": "retsub" - }, - "4281": { - "subroutine": "modules.accounting.AccountingModule.account_total_units_value", - "params": { - "holding_address#0": "bytes" - }, - "block": "account_total_units_value", - "stack_in": [], - "op": "proto 1 1" - }, - "4284": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023" - ], - "stack_out": [ - "0x52333023" - ] - }, - "4285": { - "op": "frame_dig -1", - "defined_out": [ - "0x52333023", - "holding_address#0 (copy)" - ], - "stack_out": [ - "0x52333023", - "holding_address#0 (copy)" - ] - }, - "4287": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0" - ] - }, - "4288": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ], - "stack_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "4289": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%box_get%0#0" - ] - }, - "4290": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "aggregate%box_get%0#0" - ], - "stack_out": [ - "aggregate%box_get%0#0", - "32" - ] - }, - "4291": { - "op": "extract_uint64", - "defined_out": [ - "values%0#0" - ], - "stack_out": [ - "values%0#0" - ] - }, - "4292": { - "op": "frame_dig -1", - "stack_out": [ - "values%0#0", - "holding_address#0 (copy)" - ] - }, - "4294": { - "op": "swap", - "stack_out": [ - "holding_address#0 (copy)", - "values%0#0" - ] - }, - "4295": { - "callsub": "modules.accounting.AccountingModule.account_units_value", - "op": "callsub account_units_value", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "4298": { - "retsub": true, - "op": "retsub" - }, - "4299": { - "subroutine": "modules.rbac.RbacModule._role_is_active", - "params": { - "role_map#0": "bytes", - "role_address#0": "bytes" - }, - "block": "_role_is_active", - "stack_in": [], - "op": "proto 2 1" - }, - "4302": { - "op": "pushbytes \"\"", - "stack_out": [ - "awst_tmp%0#0" - ] - }, - "4304": { - "op": "frame_dig -2", - "defined_out": [ - "role_map#0 (copy)" - ], - "stack_out": [ - "awst_tmp%0#0", - "role_map#0 (copy)" - ] - }, - "4306": { - "op": "frame_dig -1", - "defined_out": [ - "role_address#0 (copy)", - "role_map#0 (copy)" - ], - "stack_out": [ - "awst_tmp%0#0", - "role_map#0 (copy)", - "role_address#0 (copy)" - ] - }, - "4308": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1" - ] - }, - "4309": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1" - ] - }, - "4310": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "4311": { - "op": "bury 1", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "4313": { - "op": "bz _role_is_active_bool_false@4", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1" - ] - }, - "4316": { - "op": "frame_dig 1", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1" - ] - }, - "4318": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0", - "box_prefixed_key%0#1" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "4319": { - "error": "check BoxMap entry exists", - "op": "assert // check BoxMap entry exists", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "aggregate%box_get%0#0" - ] - }, - "4320": { - "op": "intc_0 // 0", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "aggregate%box_get%0#0", - "0" - ] - }, - "4321": { - "op": "extract_uint64", - "defined_out": [ - "box_prefixed_key%0#1", - "values%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "values%0#0" - ] - }, - "4322": { - "op": "global LatestTimestamp" - }, - "4324": { - "op": "dup", - "defined_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "values%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "values%0#0", - "awst_tmp%0#0", - "awst_tmp%0#0" - ] - }, - "4325": { - "op": "frame_bury 0", - "defined_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "values%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "values%0#0", - "awst_tmp%0#0" - ] - }, - "4327": { - "op": "<=", - "defined_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "tmp%1#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "tmp%1#0" - ] - }, - "4328": { - "op": "bz _role_is_active_bool_false@4", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1" - ] - }, - "4331": { - "op": "frame_dig 1", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1" - ] - }, - "4333": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%2#0", - "aggregate%box_get%3#0", - "awst_tmp%0#0", - "box_prefixed_key%0#1" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "aggregate%box_get%2#0", - "aggregate%box_get%3#0" - ] - }, - "4334": { - "error": "check BoxMap entry exists", - "op": "assert // check BoxMap entry exists", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "aggregate%box_get%2#0" - ] - }, - "4335": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "aggregate%box_get%2#0", - "awst_tmp%0#0", - "box_prefixed_key%0#1" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "aggregate%box_get%2#0", - "8" - ] - }, - "4336": { - "op": "extract_uint64", - "defined_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "values%1#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "values%1#0" - ] - }, - "4337": { - "op": "frame_dig 0", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "values%1#0", - "awst_tmp%0#0" - ] - }, - "4339": { - "op": ">=", - "defined_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "tmp%2#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "tmp%2#0" - ] - }, - "4340": { - "op": "bz _role_is_active_bool_false@4", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1" - ] - }, - "4343": { - "op": "intc_1 // 1", - "defined_out": [ - "and_result%0#0", - "awst_tmp%0#0", - "box_prefixed_key%0#1" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "and_result%0#0" - ] - }, - "4344": { - "block": "_role_is_active_bool_merge@5", - "stack_in": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "and_result%0#0" - ], - "op": "frame_bury 0", - "defined_out": [ - "and_result%0#0" - ] - }, - "4346": { - "retsub": true, - "op": "retsub" - }, - "4347": { - "block": "_role_is_active_bool_false@4", - "stack_in": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1" - ], - "op": "intc_0 // 0", - "defined_out": [ - "and_result%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "and_result%0#0" - ] - }, - "4348": { - "op": "b _role_is_active_bool_merge@5" - }, - "4351": { - "subroutine": "modules.rbac.RbacModule.assert_caller_is_arranger", - "params": {}, - "block": "assert_caller_is_arranger", - "stack_in": [], - "op": "txn Sender", - "defined_out": [ - "role_address#0" - ], - "stack_out": [ - "role_address#0" - ] - }, - "4353": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "0" - ] - }, - "4354": { - "op": "bytec 6 // 0x52323023", - "defined_out": [ - "0", - "0x52323023", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "0", - "0x52323023" - ] - }, - "4356": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "4357": { - "error": "check self.arranger exists", - "op": "assert // check self.arranger exists", - "stack_out": [ - "role_address#0", - "maybe_value%0#0" - ] - }, - "4358": { - "op": "==", - "defined_out": [ - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1" - ] - }, - "4359": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [] - }, - "4360": { - "retsub": true, - "op": "retsub" - }, - "4361": { - "subroutine": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "params": {}, - "block": "assert_is_not_asset_defaulted", - "stack_in": [], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "0" - ] - }, - "4362": { - "op": "bytec 23 // \"asset_defaulted\"", - "defined_out": [ - "\"asset_defaulted\"", - "0" - ], - "stack_out": [ - "0", - "\"asset_defaulted\"" - ] - }, - "4364": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "4365": { - "error": "check self.asset_defaulted exists", - "op": "assert // check self.asset_defaulted exists", - "stack_out": [ - "maybe_value%0#0" - ] - }, - "4366": { - "op": "!", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "4367": { - "error": "Defaulted", - "op": "assert // Defaulted", - "stack_out": [] - }, - "4368": { - "retsub": true, - "op": "retsub" - }, - "4369": { - "subroutine": "modules.rbac.RbacModule.assert_is_not_asset_suspended", - "params": {}, - "block": "assert_is_not_asset_suspended", - "stack_in": [], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "0" - ] - }, - "4370": { - "op": "bytec 22 // \"asset_suspended\"", - "defined_out": [ - "\"asset_suspended\"", - "0" - ], - "stack_out": [ - "0", - "\"asset_suspended\"" - ] - }, - "4372": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "4373": { - "error": "check self.asset_suspended exists", - "op": "assert // check self.asset_suspended exists", - "stack_out": [ - "maybe_value%0#0" - ] - }, - "4374": { - "op": "!", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "4375": { - "error": "Suspended operations", - "op": "assert // Suspended operations", - "stack_out": [] - }, - "4376": { - "retsub": true, - "op": "retsub" - }, - "4377": { - "subroutine": "modules.rbac.RbacModule._assert_valid_role", - "params": { - "role_id#0": "uint64" - }, - "block": "_assert_valid_role", - "stack_in": [], - "op": "proto 1 0" - }, - "4380": { - "op": "frame_dig -1", - "defined_out": [ - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0 (copy)" - ] - }, - "4382": { - "op": "pushint 20", - "defined_out": [ - "20", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0 (copy)", - "20" - ] - }, - "4384": { - "op": "==", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "4385": { - "op": "bnz _assert_valid_role_bool_true@6", - "stack_out": [] - }, - "4388": { - "op": "frame_dig -1", - "stack_out": [ - "role_id#0 (copy)" - ] - }, - "4390": { - "op": "pushint 40", - "defined_out": [ - "40", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0 (copy)", - "40" - ] - }, - "4392": { - "op": "==", - "defined_out": [ - "tmp%1#0" - ], - "stack_out": [ - "tmp%1#0" - ] - }, - "4393": { - "op": "bnz _assert_valid_role_bool_true@6", - "stack_out": [] - }, - "4396": { - "op": "frame_dig -1", - "stack_out": [ - "role_id#0 (copy)" - ] - }, - "4398": { - "op": "pushint 50", - "defined_out": [ - "50", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0 (copy)", - "50" - ] - }, - "4400": { - "op": "==", - "defined_out": [ - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0" - ] - }, - "4401": { - "op": "bnz _assert_valid_role_bool_true@6", - "stack_out": [] - }, - "4404": { - "op": "frame_dig -1", - "stack_out": [ - "role_id#0 (copy)" - ] - }, - "4406": { - "op": "pushint 60", - "defined_out": [ - "60", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0 (copy)", - "60" - ] - }, - "4408": { - "op": "==", - "defined_out": [ - "tmp%3#0" - ], - "stack_out": [ - "tmp%3#0" - ] - }, - "4409": { - "op": "bnz _assert_valid_role_bool_true@6", - "stack_out": [] - }, - "4412": { - "op": "frame_dig -1", - "stack_out": [ - "role_id#0 (copy)" - ] - }, - "4414": { - "op": "pushint 70", - "defined_out": [ - "70", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0 (copy)", - "70" - ] - }, - "4416": { - "op": "==", - "defined_out": [ - "tmp%4#0" - ], - "stack_out": [ - "tmp%4#0" - ] - }, - "4417": { - "op": "bnz _assert_valid_role_bool_true@6", - "stack_out": [] - }, - "4420": { - "op": "frame_dig -1", - "stack_out": [ - "role_id#0 (copy)" - ] - }, - "4422": { - "op": "pushint 80", - "defined_out": [ - "80", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0 (copy)", - "80" - ] - }, - "4424": { - "op": "==", - "defined_out": [ - "tmp%5#0" - ], - "stack_out": [ - "tmp%5#0" - ] - }, - "4425": { - "op": "bz _assert_valid_role_bool_false@7", - "stack_out": [] - }, - "4428": { - "block": "_assert_valid_role_bool_true@6", - "stack_in": [], - "op": "intc_1 // 1", - "defined_out": [ - "or_result%0#0" - ], - "stack_out": [ - "or_result%0#0" - ] - }, - "4429": { - "error": "Invalid role identifier", - "block": "_assert_valid_role_bool_merge@8", - "stack_in": [ - "or_result%0#0" - ], - "op": "assert // Invalid role identifier", - "defined_out": [], - "stack_out": [] - }, - "4430": { - "retsub": true, - "op": "retsub" - }, - "4431": { - "block": "_assert_valid_role_bool_false@7", - "stack_in": [], - "op": "intc_0 // 0", - "defined_out": [ - "or_result%0#0" - ], - "stack_out": [ - "or_result%0#0" - ] - }, - "4432": { - "op": "b _assert_valid_role_bool_merge@8" - } - } -} \ No newline at end of file diff --git a/smart_contracts/artifacts/perpetual_bond/PerpetualBond.approval.teal b/smart_contracts/artifacts/perpetual_bond/PerpetualBond.approval.teal deleted file mode 100644 index 647da9f7..00000000 --- a/smart_contracts/artifacts/perpetual_bond/PerpetualBond.approval.teal +++ /dev/null @@ -1,4455 +0,0 @@ -#pragma version 12 -#pragma typetrack false - -// algopy.arc4.ARC4Contract.approval_program() -> uint64: -main: - intcblock 0 1 32 8 10000 200 86400 - bytecblock 0x151f7c75 0x52333023 "status" "issuance_date" "circulating_units" "interest_rate" 0x52323023 "unit_value" "primary_distribution_opening_date" "secondary_market_closure_date" "maturity_date" 0x52373023 0x52343023 "total_units" "settlement_asset_id" "day_count_convention" "secondary_market_opening_date" "coupon_period" 0x52383023 0x52363023 0x52353023 0x52323523 "asset_suspended" "asset_defaulted" "denomination_asset_id" "metadata" "principal_discount" "primary_distribution_closure_date" "paid_coupon_units" 0x74696d65506572696f6473 0x00 "total_coupons" 0x74696d654576656e7473 0x0000 0x068101 - txn ApplicationID - bnz main_after_if_else@2 - // modules/rbac.py:30-31 - // # RBAC Roles - // self.arranger = GlobalState(Account(), key=cst.PREFIX_ID_ARRANGER) - bytec 6 // 0x52323023 - global ZeroAddress - app_global_put - // modules/rbac.py:32 - // self.op_daemon = GlobalState(Account(), key=cst.PREFIX_ID_OP_DAEMON) - bytec 21 // 0x52323523 - global ZeroAddress - app_global_put - // modules/rbac.py:47-48 - // # D-ASA Governance - // self.asset_suspended = False - bytec 22 // "asset_suspended" - intc_0 // 0 - app_global_put - // modules/rbac.py:49 - // self.asset_defaulted = False - bytec 23 // "asset_defaulted" - intc_0 // 0 - app_global_put - // modules/accounting.py:19 - // self.total_units = UInt64() - bytec 13 // "total_units" - intc_0 // 0 - app_global_put - // modules/accounting.py:20 - // self.circulating_units = UInt64() - bytec 4 // "circulating_units" - intc_0 // 0 - app_global_put - // modules/accounting.py:21 - // self.unit_value = UInt64() - bytec 7 // "unit_value" - intc_0 // 0 - app_global_put - // modules/accounting.py:22 - // self.status = UInt64(enm.STATUS_INACTIVE) - bytec_2 // "status" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:31-32 - // # Asset Configuration - // self.denomination_asset_id = Asset() - bytec 24 // "denomination_asset_id" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:33 - // self.settlement_asset_id = Asset() - bytec 14 // "settlement_asset_id" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:34 - // self.unit_value = UInt64() - bytec 7 // "unit_value" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:35 - // self.day_count_convention = UInt64() - bytec 15 // "day_count_convention" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:37-38 - // # Metadata - // self.metadata = Bytes() - bytec 25 // "metadata" - pushbytes 0x - app_global_put - // modules/core_financial/common.py:40-41 - // # Principal / Rates - // self.principal_discount = UInt64() - bytec 26 // "principal_discount" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:42 - // self.interest_rate = UInt64() - bytec 5 // "interest_rate" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:43 - // self.total_coupons = UInt64() - bytec 31 // "total_coupons" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:47 - // self.primary_distribution_opening_date = UInt64() - bytec 8 // "primary_distribution_opening_date" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:48 - // self.primary_distribution_closure_date = UInt64() - bytec 27 // "primary_distribution_closure_date" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:49 - // self.issuance_date = UInt64() - bytec_3 // "issuance_date" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:50 - // self.secondary_market_opening_date = UInt64() - bytec 16 // "secondary_market_opening_date" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:51 - // self.secondary_market_closure_date = UInt64() - bytec 9 // "secondary_market_closure_date" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:52 - // self.maturity_date = UInt64() - bytec 10 // "maturity_date" - intc_0 // 0 - app_global_put - // modules/core_financial/coupon.py:24 - // self.paid_coupon_units = UInt64() - bytec 28 // "paid_coupon_units" - intc_0 // 0 - app_global_put - // modules/core_financial/coupon.py:337 - // self.coupon_period = UInt64() - bytec 17 // "coupon_period" - intc_0 // 0 - app_global_put - // smart_contracts/perpetual_bond/contract.py:31 - // assert Txn.global_num_byte_slice == cfg.GLOBAL_BYTES, err.WRONG_GLOBAL_BYTES - txn GlobalNumByteSlice - pushint 3 - == - assert // Wrong Global Bytes allocation - // smart_contracts/perpetual_bond/contract.py:32 - // assert Txn.global_num_uint == cfg.GLOBAL_UINTS, err.WRONG_GLOBAL_UINTS - txn GlobalNumUint - pushint 20 - == - assert // Wrong Global UInts allocation - // smart_contracts/perpetual_bond/contract.py:33 - // assert Txn.local_num_byte_slice == cfg.LOCAL_BYTES, err.WRONG_LOCAL_BYTES - txn LocalNumByteSlice - ! - assert // Wrong Local Bytes allocation - // smart_contracts/perpetual_bond/contract.py:34 - // assert Txn.local_num_uint == cfg.LOCAL_UINTS, err.WRONG_LOCAL_UINTS - txn LocalNumUint - ! - assert // Wrong Local UInts allocation - -main_after_if_else@2: - // smart_contracts/perpetual_bond/contract.py:15-28 - // class PerpetualBond( - // PBNCoreMixin, - // PerpetualCouponCashflowMixin, - // NoPrincipalPaymentMixin, - // CouponPaymentAgentMixin, - // CouponTransferAgentMixin, - // state_totals=StateTotals( - // global_bytes=cfg.GLOBAL_BYTES, - // global_uints=cfg.GLOBAL_UINTS, - // local_bytes=cfg.LOCAL_BYTES, - // local_uints=cfg.LOCAL_UINTS, - // ), - // avm_version=12, - // ): - pushbytes 0x25dba95b // method "asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void" - txna ApplicationArgs 0 - match main_asset_update_route@4 - -main_switch_case_next@5: - // smart_contracts/perpetual_bond/contract.py:15-28 - // class PerpetualBond( - // PBNCoreMixin, - // PerpetualCouponCashflowMixin, - // NoPrincipalPaymentMixin, - // CouponPaymentAgentMixin, - // CouponTransferAgentMixin, - // state_totals=StateTotals( - // global_bytes=cfg.GLOBAL_BYTES, - // global_uints=cfg.GLOBAL_UINTS, - // local_bytes=cfg.LOCAL_BYTES, - // local_uints=cfg.LOCAL_UINTS, - // ), - // avm_version=12, - // ): - txn OnCompletion - ! - assert - txn ApplicationID - bz main_create_NoOp@36 - pushbytess 0x89474134 0x9316298d 0x44363d49 0x67db4f20 0xf6a96c8d 0x229b706f 0x8cf14b51 0x4fd6a3cc 0x1d6fc255 0x25e9997f 0x6c85e3ee 0x402dba47 0xfad2173e 0x08efea35 0xe4a5ab54 0xdc063b35 0x14fc10ef 0x4c113ed5 0x74a7297f 0x105c184e 0x82f71b2d 0xef04f5d3 0x03b83329 0x3dbe80bd 0xdf54e82c 0x010c8299 0x7406acd2 0xc3e4b297 // method "asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void", method "update_interest_rate(uint16)uint64", method "get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64))", method "get_payment_amount(address)(uint64,uint64)", method "get_coupons_status()(uint64,uint64,uint64,(uint64,uint64),bool)", method "get_time_periods()(uint64,uint64)[]", method "pay_coupon(address,byte[])(uint64,uint64,byte[])", method "asset_transfer(address,address,uint64)uint64", method "set_secondary_time_events(uint64[])(uint64,uint64)", method "set_default_status(bool)uint64", method "primary_distribution(address,uint64)uint64", method "get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)", method "get_time_events()uint64[]", method "get_secondary_market_schedule()uint64[]", method "get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", method "account_gov_suspension(address,bool)uint64", method "account_open(address,address)uint64", method "account_close(address)(uint64,uint64)", method "account_update_payment_address(address,address)uint64", method "account_get_info(address)(address,uint64,uint64,uint64,bool)", method "rbac_rotate_arranger(address)uint64", method "rbac_set_op_daemon(address)uint64", method "rbac_assign_role(uint8,address,byte[])uint64", method "rbac_revoke_role(uint8,address)uint64", method "rbac_gov_asset_suspension(bool)uint64", method "rbac_get_arranger()address", method "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", method "rbac_get_role_config(uint8,address)(uint64,uint64)" - txna ApplicationArgs 0 - match asset_config update_interest_rate get_account_units_current_value get_payment_amount get_coupons_status get_time_periods pay_coupon asset_transfer set_secondary_time_events set_default_status primary_distribution get_asset_info get_time_events get_secondary_market_schedule get_asset_metadata account_gov_suspension account_open account_close account_update_payment_address account_get_info rbac_rotate_arranger rbac_set_op_daemon rbac_assign_role rbac_revoke_role rbac_gov_asset_suspension rbac_get_arranger rbac_get_address_roles rbac_get_role_config - err - -main_create_NoOp@36: - // smart_contracts/perpetual_bond/contract.py:15-28 - // class PerpetualBond( - // PBNCoreMixin, - // PerpetualCouponCashflowMixin, - // NoPrincipalPaymentMixin, - // CouponPaymentAgentMixin, - // CouponTransferAgentMixin, - // state_totals=StateTotals( - // global_bytes=cfg.GLOBAL_BYTES, - // global_uints=cfg.GLOBAL_UINTS, - // local_bytes=cfg.LOCAL_BYTES, - // local_uints=cfg.LOCAL_UINTS, - // ), - // avm_version=12, - // ): - pushbytes 0x3f0efc6c // method "asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void" - txna ApplicationArgs 0 - match asset_create - err - -main_asset_update_route@4: - // modules/core_financial/common.py:279 - // @arc4.abimethod(allow_actions=["UpdateApplication"]) - txn OnCompletion - pushint 4 // UpdateApplication - == - txn ApplicationID - && - assert - b asset_update - - -// modules.actus.pbn.PBNCoreMixin.asset_config[routing]() -> void: -asset_config: - pushbytes "" - // modules/actus/pbn.py:32 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_3 // 8 - == - assert // invalid number of bytes for arc4.uint64 - btoi - txna ApplicationArgs 2 - dup - len - intc_3 // 8 - == - assert // invalid number of bytes for arc4.uint64 - btoi - txna ApplicationArgs 3 - dup - len - intc_3 // 8 - == - assert // invalid number of bytes for arc4.uint64 - btoi - txna ApplicationArgs 4 - dup - len - intc_3 // 8 - == - assert // invalid number of bytes for arc4.uint64 - btoi - txna ApplicationArgs 5 - dup - len - intc_3 // 8 - == - assert // invalid number of bytes for arc4.uint64 - btoi - txna ApplicationArgs 6 - dup - len - intc_1 // 1 - == - assert // invalid number of bytes for arc4.uint8 - txna ApplicationArgs 7 - dup - cover 7 - len - pushint 2 - == - assert // invalid number of bytes for arc4.uint16 - txna ApplicationArgs 8 - dup - intc_0 // 0 - extract_uint16 // on error: invalid array length header - dup - cover 8 - pushint 2 - * - pushint 2 - + - swap - len - == - assert // invalid number of bytes for arc4.dynamic_array - txna ApplicationArgs 9 - dup - cover 7 - dup - intc_0 // 0 - extract_uint16 // on error: invalid array length header - dup - cover 8 - intc_3 // 8 - * - pushint 2 - + - swap - len - == - assert // invalid number of bytes for arc4.dynamic_array - txna ApplicationArgs 10 - dup - cover 7 - dup - intc_0 // 0 - extract_uint16 // on error: invalid array length header - dup - cover 8 - pushint 16 - * - pushint 2 - + - swap - len - == - assert // invalid number of bytes for arc4.dynamic_array> - // modules/core_financial/common.py:227 - // self.assert_caller_is_arranger() - callsub assert_caller_is_arranger - // modules/core_financial/common.py:228 - // assert self.status == enums.STATUS_INACTIVE, err.ALREADY_CONFIGURED - intc_0 // 0 - bytec_2 // "status" - app_global_get_ex - assert // check self.status exists - ! - assert // D-ASA already configured - // modules/core_financial/common.py:55-56 - // # The reference implementation has on-chain denomination with ASA - // _creator, exists = op.AssetParamsGet.asset_creator(denomination_asset_id) - dig 5 - asset_params_get AssetCreator - bury 1 - // modules/core_financial/common.py:57 - // assert exists, err.INVALID_DENOMINATION - assert // Denomination asset is not properly set - // modules/core_financial/common.py:60 - // self.denomination_asset_id = denomination_asset_id - bytec 24 // "denomination_asset_id" - dig 6 - app_global_put - // modules/core_financial/common.py:65 - // settlement_asset_id == self.denomination_asset_id - dig 4 - uncover 6 - == - // modules/core_financial/common.py:63-66 - // # The reference implementation settlement asset is the denomination asset - // assert ( - // settlement_asset_id == self.denomination_asset_id - // ), err.INVALID_SETTLEMENT_ASSET - assert // Different settlement asset not supported, must be equal to denomination asset - // modules/core_financial/common.py:69 - // self.settlement_asset_id = settlement_asset_id - bytec 14 // "settlement_asset_id" - dig 5 - app_global_put - // modules/core_financial/common.py:70-76 - // # The reference implementation has on-chain settlement with ASA - // itxn.AssetTransfer( - // xfer_asset=self.settlement_asset_id, - // asset_receiver=Global.current_application_address, - // asset_amount=0, - // fee=Global.min_txn_fee, - // ).submit() - itxn_begin - // modules/core_financial/common.py:75 - // fee=Global.min_txn_fee, - global MinTxnFee - // modules/core_financial/common.py:73 - // asset_receiver=Global.current_application_address, - global CurrentApplicationAddress - // modules/core_financial/common.py:74 - // asset_amount=0, - intc_0 // 0 - itxn_field AssetAmount - itxn_field AssetReceiver - uncover 5 - itxn_field XferAsset - // modules/core_financial/common.py:70-71 - // # The reference implementation has on-chain settlement with ASA - // itxn.AssetTransfer( - pushint 4 // axfer - itxn_field TypeEnum - itxn_field Fee - // modules/core_financial/common.py:70-76 - // # The reference implementation has on-chain settlement with ASA - // itxn.AssetTransfer( - // xfer_asset=self.settlement_asset_id, - // asset_receiver=Global.current_application_address, - // asset_amount=0, - // fee=Global.min_txn_fee, - // ).submit() - itxn_submit - // modules/core_financial/common.py:238-239 - // # Set Principal and Minimum Denomination - // assert principal % minimum_denomination == 0, err.INVALID_MINIMUM_DENOMINATION - dig 3 - dig 2 - % - ! - assert // Minimum denomination is not a divisor of principal - // modules/core_financial/common.py:240 - // self.unit_value = minimum_denomination - bytec 7 // "unit_value" - dig 2 - app_global_put - // modules/core_financial/common.py:241 - // self.total_units = principal // minimum_denomination - uncover 3 - uncover 2 - / - bytec 13 // "total_units" - swap - app_global_put - // modules/core_financial/common.py:242 - // self.principal_discount = principal_discount - bytec 26 // "principal_discount" - uncover 2 - app_global_put - // modules/core_financial/common.py:244-245 - // # Set Day-Count Convention - // self.assert_day_count_convention(day_count_convention.as_uint64()) - btoi - dup - // modules/core_financial/common.py:79-83 - // # The reference implementation supports only the Actual/Actual and Continuous day-count conventions - // assert day_count_convention in ( - // UInt64(cst.DCC_A_A), - // UInt64(cst.DCC_CONT), - // ), err.INVALID_DAY_COUNT_CONVENTION - bz asset_config_bool_true@3 - dup - // modules/core_financial/common.py:82 - // UInt64(cst.DCC_CONT), - pushint 255 - // modules/core_financial/common.py:79-83 - // # The reference implementation supports only the Actual/Actual and Continuous day-count conventions - // assert day_count_convention in ( - // UInt64(cst.DCC_A_A), - // UInt64(cst.DCC_CONT), - // ), err.INVALID_DAY_COUNT_CONVENTION - == - bz asset_config_bool_false@4 - -asset_config_bool_true@3: - intc_1 // 1 - -asset_config_bool_merge@5: - // modules/core_financial/common.py:79-83 - // # The reference implementation supports only the Actual/Actual and Continuous day-count conventions - // assert day_count_convention in ( - // UInt64(cst.DCC_A_A), - // UInt64(cst.DCC_CONT), - // ), err.INVALID_DAY_COUNT_CONVENTION - assert // Invalid day-count convention ID - // modules/core_financial/common.py:86 - // self.day_count_convention = day_count_convention - bytec 15 // "day_count_convention" - dig 1 - app_global_put - // modules/core_financial/common.py:248-249 - // # Set Interest Rate - // self.assert_interest_rate(interest_rate.as_uint64()) - dig 6 - btoi - bury 8 - // modules/core_financial/common.py:89-90 - // # This subroutine must be used after the principal discount has been set - // if not self.principal_discount: - intc_0 // 0 - bytec 26 // "principal_discount" - app_global_get_ex - assert // check self.principal_discount exists - bnz asset_config_after_if_else@7 - // modules/core_financial/common.py:91 - // assert interest_rate > UInt64(0), err.INVALID_INTEREST_RATE - dig 7 - assert // Interest rate is not properly defined - -asset_config_after_if_else@7: - // modules/core_financial/common.py:94 - // self.interest_rate = interest_rate - bytec 5 // "interest_rate" - dig 8 - app_global_put - // modules/core_financial/common.py:97 - // assert not coupon_rates.length, err.INVALID_COUPON_RATES - dig 5 - dup - ! - assert // Coupon rates are not properly defined - // modules/core_financial/common.py:100 - // self.total_coupons = coupon_rates.length - bytec 31 // "total_coupons" - dig 1 - app_global_put - // modules/actus/pbn.py:18 - // time_events.length == self.total_coupons + 3 - pushint 3 - + - dig 4 - == - // modules/actus/pbn.py:16-19 - // # PBN has no maturity date in the static schedule - // assert ( - // time_events.length == self.total_coupons + 3 - // ), err.INVALID_TIME_EVENTS_LENGTH - assert // Time events length is invalid - // modules/core_financial/common.py:258 - // self.assert_time_events_sorted(time_events) - dig 4 - callsub assert_time_events_sorted - // modules/actus/pbn.py:22 - // self.time_events.value = time_events.copy() - bytec 32 // 0x74696d654576656e7473 - box_del - pop - bytec 32 // 0x74696d654576656e7473 - dig 1 - box_put - // modules/actus/pbn.py:23-25 - // self.primary_distribution_opening_date = time_events[ - // cfg.PRIMARY_DISTRIBUTION_OPENING_DATE_IDX - // ] - dup - pushint 2 - extract_uint64 - // modules/actus/pbn.py:23 - // self.primary_distribution_opening_date = time_events[ - bytec 8 // "primary_distribution_opening_date" - // modules/actus/pbn.py:23-25 - // self.primary_distribution_opening_date = time_events[ - // cfg.PRIMARY_DISTRIBUTION_OPENING_DATE_IDX - // ] - swap - app_global_put - // modules/actus/pbn.py:26-28 - // self.primary_distribution_closure_date = time_events[ - // cfg.PRIMARY_DISTRIBUTION_CLOSURE_DATE_IDX - // ] - dup - pushint 10 - extract_uint64 - // modules/actus/pbn.py:26 - // self.primary_distribution_closure_date = time_events[ - bytec 27 // "primary_distribution_closure_date" - // modules/actus/pbn.py:26-28 - // self.primary_distribution_closure_date = time_events[ - // cfg.PRIMARY_DISTRIBUTION_CLOSURE_DATE_IDX - // ] - swap - app_global_put - pushint 18 - // modules/actus/pbn.py:29 - // self.issuance_date = time_events[cfg.ISSUANCE_DATE_IDX] - extract_uint64 - bytec_3 // "issuance_date" - swap - app_global_put - // modules/actus/pbn.py:30 - // self.maturity_date = UInt64(0) - bytec 10 // "maturity_date" - intc_0 // 0 - app_global_put - // modules/core_financial/coupon.py:340-341 - // # The perpetual bond defines a single time period for the coupon duration with unlimited repetitions - // assert time_periods.length == UInt64(1), err.INVALID_TIME_PERIODS - dig 1 - intc_1 // 1 - == - assert // Time periods are not properly defined - // modules/core_financial/coupon.py:342 - // coupon_period_duration = time_periods[0][0] - dig 2 - dup - extract 2 16 - dup - intc_0 // 0 - extract_uint64 - swap - intc_3 // 8 - extract_uint64 - // modules/core_financial/coupon.py:344 - // assert coupon_period_duration > UInt64(0), err.INVALID_TIME_PERIOD_DURATION - swap - assert // Time period durations must be strictly greater than zero - // modules/core_financial/coupon.py:345 - // assert repetitions == UInt64(0), err.INVALID_TIME_PERIOD_REPETITIONS - ! - assert // Time period repetitions are not properly defined - // modules/core_financial/coupon.py:348 - // self.time_periods.value = time_periods.copy() - bytec 29 // 0x74696d65506572696f6473 - box_del - pop - bytec 29 // 0x74696d65506572696f6473 - swap - box_put - // modules/core_financial/coupon.py:349 - // self.coupon_period = self.time_periods.value[0][0] - bytec 29 // 0x74696d65506572696f6473 - pushints 2 16 - box_extract - intc_0 // 0 - extract_uint64 - bytec 17 // "coupon_period" - swap - app_global_put - // modules/core_financial/common.py:265 - // self.status = UInt64(enums.STATUS_ACTIVE) - bytec_2 // "status" - pushint 100 - app_global_put - // modules/actus/pbn.py:32 - // @arc4.abimethod - intc_1 // 1 - return - -asset_config_bool_false@4: - intc_0 // 0 - b asset_config_bool_merge@5 - - -// modules.actus.pbn.PBNCoreMixin.update_interest_rate[routing]() -> void: -update_interest_rate: - // modules/actus/pbn.py:89 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - pushint 2 - == - assert // invalid number of bytes for arc4.uint16 - // modules/rbac.py:80 - // assert self._role_is_active(self.interest_oracle, Txn.sender), err.UNAUTHORIZED - bytec 18 // 0x52383023 - txn Sender - callsub _role_is_active - assert // Not authorized - // modules/actus/pbn.py:107 - // self.assert_is_not_asset_defaulted() - callsub assert_is_not_asset_defaulted - // modules/actus/pbn.py:108 - // self.assert_is_not_asset_suspended() - callsub assert_is_not_asset_suspended - // modules/actus/pbn.py:109 - // due_coupons = self.count_due_coupons() - callsub count_due_coupons - // modules/actus/pbn.py:110 - // assert self.all_due_coupons_paid(due_coupons), err.PENDING_COUPON_PAYMENT - callsub all_due_coupons_paid - assert // Pending due coupon payment - // modules/actus/pbn.py:112-113 - // # Update interest rate - // self.interest_rate = interest_rate.as_uint64() - btoi - bytec 5 // "interest_rate" - swap - app_global_put - // modules/actus/pbn.py:114 - // return Global.latest_timestamp - global LatestTimestamp - // modules/actus/pbn.py:89 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.core_financial.coupon.PerpetualCouponCashflowMixin.get_account_units_current_value[routing]() -> void: -get_account_units_current_value: - intc_0 // 0 - pushbytes "" - dupn 4 - // modules/core_financial/coupon.py:417 - // @arc4.abimethod(readonly=True) - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - txna ApplicationArgs 2 - dup - len - intc_3 // 8 - == - assert // invalid number of bytes for arc4.uint64 - btoi - // modules/core_financial/coupon.py:438 - // self.primary_distribution_opening_date - intc_0 // 0 - bytec 8 // "primary_distribution_opening_date" - app_global_get_ex - assert // check self.primary_distribution_opening_date exists - // modules/core_financial/coupon.py:438-439 - // self.primary_distribution_opening_date - // and Global.latest_timestamp >= self.primary_distribution_opening_date - bz get_account_units_current_value_bool_false@4 - // modules/core_financial/coupon.py:439 - // and Global.latest_timestamp >= self.primary_distribution_opening_date - global LatestTimestamp - intc_0 // 0 - bytec 8 // "primary_distribution_opening_date" - app_global_get_ex - assert // check self.primary_distribution_opening_date exists - >= - // modules/core_financial/coupon.py:438-439 - // self.primary_distribution_opening_date - // and Global.latest_timestamp >= self.primary_distribution_opening_date - bz get_account_units_current_value_bool_false@4 - intc_1 // 1 - -get_account_units_current_value_bool_merge@5: - // modules/core_financial/coupon.py:437-440 - // assert ( - // self.primary_distribution_opening_date - // and Global.latest_timestamp >= self.primary_distribution_opening_date - // ), err.NO_PRIMARY_DISTRIBUTION - assert // Primary distribution not yet executed - // modules/accounting.py:31 - // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec_1 // 0x52333023 - dig 2 - concat - dup - bury 9 - box_len - bury 1 - assert // Invalid account holding address - // modules/core_financial/coupon.py:442 - // assert 0 < units <= self.account[holding_address].units, err.INVALID_UNITS - dup - bz get_account_units_current_value_bool_false@8 - dig 7 - box_get - assert // check self.account entry exists - intc_2 // 32 - extract_uint64 - dig 1 - >= - bz get_account_units_current_value_bool_false@8 - intc_1 // 1 - -get_account_units_current_value_bool_merge@9: - // modules/core_financial/coupon.py:442 - // assert 0 < units <= self.account[holding_address].units, err.INVALID_UNITS - assert // Invalid amount of units for the account - // modules/core_financial/coupon.py:444-445 - // # Value during primary distribution - // account_units_nominal_value = self.account_units_value(holding_address, units) - dig 1 - dup - dig 2 - callsub account_units_value - bury 8 - // modules/core_financial/coupon.py:446-447 - // # Accruing interest during primary distribution - // accrued_interest = UInt64() - intc_0 // 0 - bury 7 - // modules/core_financial/coupon.py:448 - // numerator = UInt64() - intc_0 // 0 - bury 4 - // modules/core_financial/coupon.py:449 - // denominator = UInt64() - intc_0 // 0 - bury 6 - // modules/core_financial/coupon.py:451-452 - // # Accruing interest - // due_coupons = self.count_due_coupons() - callsub count_due_coupons - dup - bury 6 - // modules/core_financial/coupon.py:453 - // self.assert_no_pending_coupon_payment(holding_address, due_coupons) - swap - dig 1 - callsub assert_no_pending_coupon_payment - // modules/core_financial/coupon.py:454 - // if self.is_accruing_interest(due_coupons): - callsub is_accruing_interest - bz get_account_units_current_value_after_if_else@11 - // modules/core_financial/coupon.py:455 - // day_count_factor = self.day_count_factor(due_coupons) - dig 3 - dup - callsub day_count_factor - // modules/core_financial/coupon.py:456-458 - // accrued_interest = self.accrued_interest_amount( - // holding_address, units, due_coupons - // ) - dig 3 - dig 3 - uncover 3 - callsub accrued_interest_amount - bury 7 - // modules/core_financial/coupon.py:459 - // numerator = day_count_factor.numerator - dup - intc_0 // 0 - extract_uint64 - bury 4 - // modules/core_financial/coupon.py:460 - // denominator = day_count_factor.denominator - intc_3 // 8 - extract_uint64 - bury 5 - -get_account_units_current_value_after_if_else@11: - // modules/core_financial/coupon.py:465-468 - // day_count_factor=typ.DayCountFactor( - // numerator=numerator, - // denominator=denominator, - // ), - dig 2 - itob - dig 5 - itob - concat - // modules/core_financial/coupon.py:462-469 - // return typ.CurrentUnitsValue( - // units_value=account_units_nominal_value, - // accrued_interest=accrued_interest, - // day_count_factor=typ.DayCountFactor( - // numerator=numerator, - // denominator=denominator, - // ), - // ) - dig 7 - itob - dig 7 - itob - concat - swap - concat - // modules/core_financial/coupon.py:417 - // @arc4.abimethod(readonly=True) - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - -get_account_units_current_value_bool_false@8: - intc_0 // 0 - b get_account_units_current_value_bool_merge@9 - -get_account_units_current_value_bool_false@4: - intc_0 // 0 - b get_account_units_current_value_bool_merge@5 - - -// modules.core_financial.coupon.PerpetualCouponCashflowMixin.get_payment_amount[routing]() -> void: -get_payment_amount: - // modules/core_financial/coupon.py:471 - // @arc4.abimethod(readonly=True) - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/accounting.py:31 - // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec_1 // 0x52333023 - dig 1 - concat - box_len - bury 1 - assert // Invalid account holding address - // modules/core_financial/coupon.py:487 - // self.account_total_units_value(holding_address) - callsub account_total_units_value - // modules/core_financial/coupon.py:488 - // * self.interest_rate - intc_0 // 0 - bytec 5 // "interest_rate" - app_global_get_ex - assert // check self.interest_rate exists - // modules/core_financial/coupon.py:487-488 - // self.account_total_units_value(holding_address) - // * self.interest_rate - * - // modules/core_financial/coupon.py:489 - // // cst.BPS - intc 4 // 10000 - // modules/core_financial/coupon.py:487-489 - // self.account_total_units_value(holding_address) - // * self.interest_rate - // // cst.BPS - / - // modules/core_financial/coupon.py:491-494 - // return typ.PaymentAmounts( - // interest=interest_amount, - // principal=UInt64(0), - // ) - itob - // modules/core_financial/coupon.py:493 - // principal=UInt64(0), - intc_0 // 0 - // modules/core_financial/coupon.py:491-494 - // return typ.PaymentAmounts( - // interest=interest_amount, - // principal=UInt64(0), - // ) - itob - concat - // modules/core_financial/coupon.py:471 - // @arc4.abimethod(readonly=True) - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.core_financial.coupon.PerpetualCouponCashflowMixin.get_coupons_status[routing]() -> void: -get_coupons_status: - pushbytes "" - dupn 4 - // modules/accounting.py:25 - // return self.status == enm.STATUS_ACTIVE - intc_0 // 0 - bytec_2 // "status" - app_global_get_ex - assert // check self.status exists - pushint 100 - == - // modules/core_financial/coupon.py:505 - // due_coupons = self.count_due_coupons() if self.status_is_active() else UInt64() - bz get_coupons_status_ternary_false@3 - callsub count_due_coupons - bury 3 - -get_coupons_status_ternary_merge@4: - // modules/core_financial/coupon.py:369 - // return self.coupon_due_date(due_coupons + 1) - dig 2 - dup - intc_1 // 1 - + - callsub coupon_due_date - bury 3 - // modules/core_financial/coupon.py:507 - // all_due_coupons_paid = self.all_due_coupons_paid(due_coupons) - dup - callsub all_due_coupons_paid - bury 6 - // modules/core_financial/coupon.py:508 - // numerator = UInt64() - intc_0 // 0 - bury 2 - // modules/core_financial/coupon.py:509 - // denominator = UInt64() - intc_0 // 0 - bury 5 - // modules/core_financial/coupon.py:510 - // if self.is_accruing_interest(due_coupons): - callsub is_accruing_interest - bz get_coupons_status_after_if_else@6 - // modules/core_financial/coupon.py:511 - // day_count_factor = self.day_count_factor(due_coupons) - dig 2 - callsub day_count_factor - // modules/core_financial/coupon.py:512 - // numerator = day_count_factor.numerator - dup - intc_0 // 0 - extract_uint64 - bury 2 - // modules/core_financial/coupon.py:513 - // denominator = day_count_factor.denominator - intc_3 // 8 - extract_uint64 - bury 4 - -get_coupons_status_after_if_else@6: - // modules/core_financial/coupon.py:515 - // total_coupons=self.total_coupons, - intc_0 // 0 - bytec 31 // "total_coupons" - app_global_get_ex - assert // check self.total_coupons exists - // modules/core_financial/coupon.py:518-521 - // day_count_factor=typ.DayCountFactor( - // numerator=numerator, - // denominator=denominator, - // ), - dig 1 - itob - dig 5 - itob - concat - // modules/core_financial/coupon.py:514-523 - // return typ.CouponsInfo( - // total_coupons=self.total_coupons, - // due_coupons=due_coupons, - // next_coupon_due_date=next_coupon_due_date, - // day_count_factor=typ.DayCountFactor( - // numerator=numerator, - // denominator=denominator, - // ), - // all_due_coupons_paid=all_due_coupons_paid, - // ) - swap - itob - dig 4 - itob - concat - dig 3 - itob - concat - swap - concat - bytec 30 // 0x00 - intc_0 // 0 - dig 7 - setbit - concat - // modules/core_financial/coupon.py:496 - // @arc4.abimethod(readonly=True) - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - -get_coupons_status_ternary_false@3: - // modules/core_financial/coupon.py:505 - // due_coupons = self.count_due_coupons() if self.status_is_active() else UInt64() - intc_0 // 0 - bury 3 - b get_coupons_status_ternary_merge@4 - - -// modules.core_financial.coupon.PerpetualCouponCashflowMixin.get_time_periods[routing]() -> void: -get_time_periods: - // modules/core_financial/coupon.py:533 - // time_periods = typ.TimePeriods() - bytec 33 // 0x0000 - // modules/accounting.py:25 - // return self.status == enm.STATUS_ACTIVE - intc_0 // 0 - bytec_2 // "status" - app_global_get_ex - assert // check self.status exists - pushint 100 - == - // modules/core_financial/coupon.py:534 - // if self.status_is_active(): - bz get_time_periods_after_if_else@3 - // modules/core_financial/coupon.py:535 - // time_periods = self.time_periods.value.copy() - bytec 29 // 0x74696d65506572696f6473 - box_get - swap - bury 2 - assert // check self.time_periods exists - -get_time_periods_after_if_else@3: - // modules/core_financial/coupon.py:525 - // @arc4.abimethod(readonly=True) - bytec_0 // 0x151f7c75 - dig 1 - concat - log - intc_1 // 1 - return - - -// modules.payment_agent.coupon.CouponPaymentAgentMixin.pay_coupon[routing]() -> void: -pay_coupon: - // modules/payment_agent/coupon.py:30 - // @arc4.abimethod - txna ApplicationArgs 1 - dupn 2 - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - txna ApplicationArgs 2 - dup - intc_0 // 0 - extract_uint16 // on error: invalid array length header - pushint 2 - + - dig 1 - len - == - assert // invalid number of bytes for arc4.dynamic_array - extract 2 0 - swap - // modules/accounting.py:25 - // return self.status == enm.STATUS_ACTIVE - intc_0 // 0 - bytec_2 // "status" - app_global_get_ex - assert // check self.status exists - pushint 100 - == - // modules/core_financial/coupon.py:39 - // assert self.status_is_active(), err.UNAUTHORIZED - assert // Not authorized - // modules/core_financial/coupon.py:40 - // self.assert_is_not_asset_defaulted() - callsub assert_is_not_asset_defaulted - // modules/core_financial/coupon.py:41 - // self.assert_is_not_asset_suspended() - callsub assert_is_not_asset_suspended - // modules/accounting.py:31 - // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec_1 // 0x52333023 - dig 1 - concat - dup - cover 2 - dup - box_len - bury 1 - assert // Invalid account holding address - // modules/core_financial/coupon.py:44 - // units = self.account[holding_address].units - dup - box_get - pop - intc_2 // 32 - extract_uint64 - dup - cover 3 - // modules/core_financial/coupon.py:45 - // assert units > 0, err.NO_UNITS - assert // No D-ASA units - // modules/core_financial/coupon.py:47 - // due_coupons = self.count_due_coupons() - callsub count_due_coupons - // modules/core_financial/coupon.py:48 - // account_paid_coupons = self.account[holding_address].paid_coupons - swap - box_get - assert // check self.account entry exists - pushint 48 - extract_uint64 - // modules/core_financial/coupon.py:49 - // assert due_coupons > account_paid_coupons, err.NO_DUE_COUPON - swap - dig 1 - > - assert // No due coupon to pay - // modules/core_financial/coupon.py:50-53 - // # The following conditions verify if other accounts are still waiting for the payment of previous coupons - // assert self.all_due_coupons_paid( - // account_paid_coupons - // ), err.PENDING_COUPON_PAYMENT - callsub all_due_coupons_paid - assert // Pending due coupon payment - // modules/core_financial/coupon.py:414 - // self.account_total_units_value(holding_address), UInt64(1) - callsub account_total_units_value - // modules/core_financial/coupon.py:374 - // return principal_amount * self.interest_rate // cst.BPS - intc_0 // 0 - bytec 5 // "interest_rate" - app_global_get_ex - assert // check self.interest_rate exists - * - intc 4 // 10000 - / - // modules/payment_agent/common.py:13 - // if self.op_daemon.value != Global.zero_address: - intc_0 // 0 - bytec 21 // 0x52323523 - app_global_get_ex - assert // check self.op_daemon exists - global ZeroAddress - != - bz pay_coupon_after_if_else@22 - // modules/payment_agent/common.py:15 - // Txn.sender == self.op_daemon.value - txn Sender - intc_0 // 0 - bytec 21 // 0x52323523 - app_global_get_ex - assert // check self.op_daemon exists - == - // modules/payment_agent/common.py:15-17 - // Txn.sender == self.op_daemon.value - // or Txn.sender == holding_address - // or Txn.sender == self.account[holding_address].payment_address - bnz pay_coupon_bool_true@19 - // modules/payment_agent/common.py:16 - // or Txn.sender == holding_address - txn Sender - dig 5 - == - // modules/payment_agent/common.py:15-17 - // Txn.sender == self.op_daemon.value - // or Txn.sender == holding_address - // or Txn.sender == self.account[holding_address].payment_address - bnz pay_coupon_bool_true@19 - // modules/payment_agent/common.py:17 - // or Txn.sender == self.account[holding_address].payment_address - txn Sender - dig 3 - box_get - assert // check self.account entry exists - extract 0 32 - == - // modules/payment_agent/common.py:15-17 - // Txn.sender == self.op_daemon.value - // or Txn.sender == holding_address - // or Txn.sender == self.account[holding_address].payment_address - bz pay_coupon_bool_false@20 - -pay_coupon_bool_true@19: - intc_1 // 1 - -pay_coupon_bool_merge@21: - // modules/payment_agent/common.py:14-18 - // assert ( - // Txn.sender == self.op_daemon.value - // or Txn.sender == holding_address - // or Txn.sender == self.account[holding_address].payment_address - // ), err.UNAUTHORIZED - assert // Not authorized - -pay_coupon_after_if_else@22: - // modules/payment_agent/common.py:22 - // self.account[holding_address].payment_address.is_opted_in( - dig 2 - box_get - assert // check self.account entry exists - extract 0 32 - // modules/payment_agent/common.py:23 - // self.settlement_asset_id - intc_0 // 0 - bytec 14 // "settlement_asset_id" - app_global_get_ex - assert // check self.settlement_asset_id exists - // modules/payment_agent/common.py:22-24 - // self.account[holding_address].payment_address.is_opted_in( - // self.settlement_asset_id - // ) - asset_holding_get AssetBalance - bury 1 - // modules/payment_agent/common.py:22-25 - // self.account[holding_address].payment_address.is_opted_in( - // self.settlement_asset_id - // ) - // and not self.account[holding_address].suspended - bz pay_coupon_bool_false@27 - // modules/payment_agent/common.py:25 - // and not self.account[holding_address].suspended - dig 2 - box_get - assert // check self.account entry exists - pushint 448 - getbit - bnz pay_coupon_bool_false@27 - intc_1 // 1 - -pay_coupon_bool_merge@28: - // modules/payment_agent/coupon.py:57 - // if self.is_payment_executable(holding_address): - bz pay_coupon_else_body@3 - // modules/payment_agent/common.py:30 - // self.settlement_asset_id.balance(Global.current_application_address) - global CurrentApplicationAddress - intc_0 // 0 - bytec 14 // "settlement_asset_id" - app_global_get_ex - assert // check self.settlement_asset_id exists - swap - dig 1 - asset_holding_get AssetBalance - assert // account opted into asset - // modules/payment_agent/common.py:30-31 - // self.settlement_asset_id.balance(Global.current_application_address) - // >= payment_amount - dig 2 - dup - cover 2 - >= - // modules/payment_agent/common.py:29-32 - // assert ( - // self.settlement_asset_id.balance(Global.current_application_address) - // >= payment_amount - // ), err.NOT_ENOUGH_FUNDS - assert // Not enough funds for the payment - // modules/payment_agent/coupon.py:60-61 - // # The reference implementation has the same asset for denomination and settlement, no conversion needed - // self.pay(self.account[holding_address].payment_address, payment_amount) - dig 4 - box_get - assert // check self.account entry exists - extract 0 32 - // modules/payment_agent/common.py:35-40 - // itxn.AssetTransfer( - // xfer_asset=self.settlement_asset_id, - // asset_receiver=receiver, - // asset_amount=amount, - // fee=Global.min_txn_fee, - // ).submit() - itxn_begin - // modules/payment_agent/common.py:39 - // fee=Global.min_txn_fee, - global MinTxnFee - uncover 2 - itxn_field AssetAmount - swap - itxn_field AssetReceiver - swap - itxn_field XferAsset - // modules/payment_agent/common.py:35 - // itxn.AssetTransfer( - pushint 4 // axfer - itxn_field TypeEnum - itxn_field Fee - // modules/payment_agent/common.py:35-40 - // itxn.AssetTransfer( - // xfer_asset=self.settlement_asset_id, - // asset_receiver=receiver, - // asset_amount=amount, - // fee=Global.min_txn_fee, - // ).submit() - itxn_submit - -pay_coupon_after_if_else@4: - // modules/core_financial/coupon.py:63 - // self.account[holding_address].paid_coupons += 1 - dig 2 - dup - box_get - assert // check self.account entry exists - pushint 48 - extract_uint64 - intc_1 // 1 - + - itob - pushint 48 - swap - box_replace - // modules/core_financial/coupon.py:64 - // self.paid_coupon_units += units - intc_0 // 0 - bytec 28 // "paid_coupon_units" - app_global_get_ex - assert // check self.paid_coupon_units exists - dig 2 - + - bytec 28 // "paid_coupon_units" - swap - app_global_put - // modules/payment_agent/coupon.py:17 - // contract_id=Global.current_application_id.id, - global CurrentApplicationID - // modules/payment_agent/coupon.py:20 - // time=Global.latest_timestamp, - global LatestTimestamp - // modules/payment_agent/coupon.py:22 - // currency_id=self.denomination_asset_id.id, - intc_0 // 0 - bytec 24 // "denomination_asset_id" - app_global_get_ex - assert // check self.denomination_asset_id exists - // modules/payment_agent/coupon.py:23 - // currency_unit=self.denomination_asset_id.unit_name, - dup - asset_params_get AssetUnitName - assert // asset exists - // modules/payment_agent/coupon.py:24 - // nominal_value=self.circulating_units * self.unit_value, - intc_0 // 0 - bytec 4 // "circulating_units" - app_global_get_ex - assert // check self.circulating_units exists - intc_0 // 0 - bytec 7 // "unit_value" - app_global_get_ex - assert // check self.unit_value exists - * - // modules/payment_agent/coupon.py:16-27 - // Event( - // contract_id=Global.current_application_id.id, - // type=arc4.UInt8(enums.EVT_TYPE_IP), - // type_name=String("IP"), - // time=Global.latest_timestamp, - // payoff=payoff, - // currency_id=self.denomination_asset_id.id, - // currency_unit=self.denomination_asset_id.unit_name, - // nominal_value=self.circulating_units * self.unit_value, - // nominal_rate_bps=arc4.UInt16(0), # TODO: Add interest rate - // nominal_accrued=UInt64(0), - // ) - uncover 4 - itob - pushbytes 0x080037 - concat - uncover 4 - itob - concat - dig 4 - itob - swap - dig 1 - concat - uncover 4 - itob - concat - dig 3 - len - itob - extract 6 2 - uncover 4 - concat - swap - pushbytes 0x003b - concat - uncover 3 - itob - concat - // modules/payment_agent/coupon.py:25 - // nominal_rate_bps=arc4.UInt16(0), # TODO: Add interest rate - bytec 33 // 0x0000 - // modules/payment_agent/coupon.py:16-27 - // Event( - // contract_id=Global.current_application_id.id, - // type=arc4.UInt8(enums.EVT_TYPE_IP), - // type_name=String("IP"), - // time=Global.latest_timestamp, - // payoff=payoff, - // currency_id=self.denomination_asset_id.id, - // currency_unit=self.denomination_asset_id.unit_name, - // nominal_value=self.circulating_units * self.unit_value, - // nominal_rate_bps=arc4.UInt16(0), # TODO: Add interest rate - // nominal_accrued=UInt64(0), - // ) - concat - // modules/payment_agent/coupon.py:26 - // nominal_accrued=UInt64(0), - intc_0 // 0 - // modules/payment_agent/coupon.py:16-27 - // Event( - // contract_id=Global.current_application_id.id, - // type=arc4.UInt8(enums.EVT_TYPE_IP), - // type_name=String("IP"), - // time=Global.latest_timestamp, - // payoff=payoff, - // currency_id=self.denomination_asset_id.id, - // currency_unit=self.denomination_asset_id.unit_name, - // nominal_value=self.circulating_units * self.unit_value, - // nominal_rate_bps=arc4.UInt16(0), # TODO: Add interest rate - // nominal_accrued=UInt64(0), - // ) - itob - concat - pushbytes 0x00024950 - concat - swap - concat - // modules/payment_agent/coupon.py:15-28 - // arc4.emit( - // Event( - // contract_id=Global.current_application_id.id, - // type=arc4.UInt8(enums.EVT_TYPE_IP), - // type_name=String("IP"), - // time=Global.latest_timestamp, - // payoff=payoff, - // currency_id=self.denomination_asset_id.id, - // currency_unit=self.denomination_asset_id.unit_name, - // nominal_value=self.circulating_units * self.unit_value, - // nominal_rate_bps=arc4.UInt16(0), # TODO: Add interest rate - // nominal_accrued=UInt64(0), - // ) - // ) - pushbytes 0x8c29904e // method "Event(uint64,uint8,string,uint64,uint64,uint64,byte[],uint64,uint16,uint64)" - swap - concat - log - // modules/payment_agent/coupon.py:70 - // timestamp=Global.latest_timestamp, - global LatestTimestamp - // modules/payment_agent/coupon.py:68-72 - // return typ.PaymentResult( - // amount=payment_amount, - // timestamp=Global.latest_timestamp, - // context=payment_info, # TODO: Add info on failed payment - // ) - itob - concat - dig 4 - dup - len - itob - extract 6 2 - swap - concat - swap - pushbytes 0x0012 - concat - swap - concat - // modules/payment_agent/coupon.py:30 - // @arc4.abimethod - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - -pay_coupon_else_body@3: - // modules/payment_agent/coupon.py:63-64 - // # Accounts suspended or not opted in at the time of payments must not stall the D-ASA - // payment_amount = UInt64() - intc_0 // 0 - bury 1 - b pay_coupon_after_if_else@4 - -pay_coupon_bool_false@27: - intc_0 // 0 - b pay_coupon_bool_merge@28 - -pay_coupon_bool_false@20: - intc_0 // 0 - b pay_coupon_bool_merge@21 - - -// modules.transfer_agent.coupon.CouponTransferAgentMixin.asset_transfer[routing]() -> void: -asset_transfer: - intc_0 // 0 - dupn 2 - pushbytes "" - dup - // modules/transfer_agent/coupon.py:9 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - txna ApplicationArgs 2 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - txna ApplicationArgs 3 - dup - len - intc_3 // 8 - == - assert // invalid number of bytes for arc4.uint64 - btoi - // modules/accounting.py:25 - // return self.status == enm.STATUS_ACTIVE - intc_0 // 0 - bytec_2 // "status" - app_global_get_ex - assert // check self.status exists - pushint 100 - == - // modules/core_financial/common.py:153-158 - // self.status_is_active() - // and self.secondary_market_opening_date <= Global.latest_timestamp - // and ( - // not self.secondary_market_closure_date - // or Global.latest_timestamp < self.secondary_market_closure_date - // ) - bz asset_transfer_bool_false@6 - // modules/core_financial/common.py:154 - // and self.secondary_market_opening_date <= Global.latest_timestamp - intc_0 // 0 - bytec 16 // "secondary_market_opening_date" - app_global_get_ex - assert // check self.secondary_market_opening_date exists - global LatestTimestamp - <= - // modules/core_financial/common.py:153-158 - // self.status_is_active() - // and self.secondary_market_opening_date <= Global.latest_timestamp - // and ( - // not self.secondary_market_closure_date - // or Global.latest_timestamp < self.secondary_market_closure_date - // ) - bz asset_transfer_bool_false@6 - // modules/core_financial/common.py:156 - // not self.secondary_market_closure_date - intc_0 // 0 - bytec 9 // "secondary_market_closure_date" - app_global_get_ex - assert // check self.secondary_market_closure_date exists - // modules/core_financial/common.py:156-157 - // not self.secondary_market_closure_date - // or Global.latest_timestamp < self.secondary_market_closure_date - bz asset_transfer_bool_true@5 - // modules/core_financial/common.py:157 - // or Global.latest_timestamp < self.secondary_market_closure_date - global LatestTimestamp - intc_0 // 0 - bytec 9 // "secondary_market_closure_date" - app_global_get_ex - assert // check self.secondary_market_closure_date exists - < - // modules/core_financial/common.py:156-157 - // not self.secondary_market_closure_date - // or Global.latest_timestamp < self.secondary_market_closure_date - bz asset_transfer_bool_false@6 - -asset_transfer_bool_true@5: - intc_1 // 1 - -asset_transfer_bool_merge@7: - // modules/core_financial/common.py:152-159 - // assert ( - // self.status_is_active() - // and self.secondary_market_opening_date <= Global.latest_timestamp - // and ( - // not self.secondary_market_closure_date - // or Global.latest_timestamp < self.secondary_market_closure_date - // ) - // ), err.SECONDARY_MARKET_CLOSED - assert // Secondary market is closed - // modules/core_financial/common.py:169-171 - // # The reference implementation grants transfer right to D-ASA owners. Other implementations may relay on other - // # roles, external Apps through C2C calls (e.g., an order book), or off-chain transfer agents. - // assert Txn.sender == sender_holding_address, err.UNAUTHORIZED - txn Sender - dig 3 - dup - cover 2 - == - assert // Not authorized - // modules/core_financial/common.py:172 - // self.assert_is_not_asset_defaulted() - callsub assert_is_not_asset_defaulted - // modules/core_financial/common.py:173 - // self.assert_is_not_asset_suspended() - callsub assert_is_not_asset_suspended - // modules/accounting.py:31 - // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec_1 // 0x52333023 - dig 1 - concat - dup - bury 9 - dup - box_len - bury 1 - assert // Invalid account holding address - bytec_1 // 0x52333023 - dig 4 - dup - cover 2 - concat - dup - bury 10 - dup - box_len - bury 1 - assert // Invalid account holding address - // modules/core_financial/common.py:176 - // self.assert_is_not_account_suspended(sender_holding_address) - dig 3 - callsub assert_is_not_account_suspended - // modules/core_financial/common.py:177 - // self.assert_is_not_account_suspended(receiver_holding_address) - dig 1 - callsub assert_is_not_account_suspended - // modules/core_financial/common.py:190 - // assert sender_holding_address != receiver_holding_address, err.SELF_TRANSFER - uncover 3 - uncover 2 - != - assert // Sender and receiver must be different - // modules/core_financial/common.py:191 - // assert units > 0, err.NULL_TRANSFER - dig 2 - dup - assert // Transfer units must be greater than zero - // modules/core_financial/common.py:192 - // assert units <= self.account[sender_holding_address].units, err.OVER_TRANSFER - uncover 2 - box_get - assert // check self.account entry exists - dup - intc_2 // 32 - extract_uint64 - uncover 2 - >= - assert // Insufficient sender units to transfer - // modules/accounting.py:63 - // sender_unit_value = self.account[sender].unit_value - extract 40 8 - bury 9 - // modules/accounting.py:64 - // if self.account[receiver].units > UInt64(0): - box_get - assert // check self.account entry exists - intc_2 // 32 - extract_uint64 - bz asset_transfer_else_body@9 - // modules/accounting.py:58 - // self.account[sender].unit_value == self.account[receiver].unit_value - dig 6 - box_get - assert // check self.account entry exists - pushint 40 - extract_uint64 - dig 6 - box_get - assert // check self.account entry exists - pushint 40 - extract_uint64 - == - // modules/accounting.py:58-59 - // self.account[sender].unit_value == self.account[receiver].unit_value - // and self.account[sender].paid_coupons == self.account[receiver].paid_coupons - bz asset_transfer_bool_false@20 - // modules/accounting.py:59 - // and self.account[sender].paid_coupons == self.account[receiver].paid_coupons - dig 6 - box_get - assert // check self.account entry exists - pushint 48 - extract_uint64 - dig 6 - box_get - assert // check self.account entry exists - pushint 48 - extract_uint64 - == - // modules/accounting.py:58-59 - // self.account[sender].unit_value == self.account[receiver].unit_value - // and self.account[sender].paid_coupons == self.account[receiver].paid_coupons - bz asset_transfer_bool_false@20 - intc_1 // 1 - -asset_transfer_bool_merge@21: - // modules/accounting.py:57-60 - // assert ( - // self.account[sender].unit_value == self.account[receiver].unit_value - // and self.account[sender].paid_coupons == self.account[receiver].paid_coupons - // ), err.NON_FUNGIBLE_UNITS - assert // Sender and receiver units are not fungible - -asset_transfer_after_if_else@10: - // modules/transfer_agent/coupon.py:46-47 - // # Transferred units value (must be computed before the transfer) - // sender_unit_value = self.account[sender_holding_address].unit_value - dig 6 - dup - box_get - assert // check self.account entry exists - pushint 40 - extract_uint64 - bury 5 - // modules/core_financial/coupon.py:69-70 - // # Transfer is forbidden in case of pending coupon payments - // due_coupons = self.count_due_coupons() - callsub count_due_coupons - // modules/core_financial/coupon.py:71 - // self.assert_no_pending_coupon_payment(sender_holding_address, due_coupons) - dig 4 - dup - cover 2 - dig 1 - callsub assert_no_pending_coupon_payment - // modules/core_financial/coupon.py:72 - // return self.accrued_interest_amount(sender_holding_address, units, due_coupons) - swap - dig 3 - dup - cover 3 - uncover 2 - callsub accrued_interest_amount - bury 7 - // modules/accounting.py:71 - // assert units <= self.account[holding_address].units, err.OVER_TRANSFER - dig 1 - box_get - assert // check self.account entry exists - intc_2 // 32 - extract_uint64 - dup2 - <= - assert // Insufficient sender units to transfer - // modules/accounting.py:72 - // self.account[holding_address].units -= units - swap - - - itob - dig 1 - intc_2 // 32 - uncover 2 - box_replace - // modules/accounting.py:52 - // if self.account[holding_address].units == UInt64(0): - box_get - pop - intc_2 // 32 - extract_uint64 - bnz asset_transfer_after_if_else@16 - // modules/accounting.py:53 - // self.account[holding_address].unit_value = UInt64(0) - intc_0 // 0 - itob - dig 7 - dup - cover 2 - pushint 40 - dig 2 - box_replace - // modules/accounting.py:54 - // self.account[holding_address].paid_coupons = UInt64(0) - pushint 48 - swap - box_replace - -asset_transfer_after_if_else@16: - // modules/accounting.py:76 - // self.account[holding_address].units += units - dig 5 - dup - box_get - assert // check self.account entry exists - intc_2 // 32 - extract_uint64 - dig 2 - dup - cover 2 - + - itob - uncover 2 - intc_2 // 32 - uncover 2 - box_replace - // modules/transfer_agent/coupon.py:53 - // return units * sender_unit_value + accrued_interest - dig 4 - * - dig 5 - + - // modules/transfer_agent/coupon.py:9 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - -asset_transfer_bool_false@20: - intc_0 // 0 - b asset_transfer_bool_merge@21 - -asset_transfer_else_body@9: - // modules/accounting.py:67 - // self.account[receiver].unit_value = sender_unit_value - dig 5 - dup - pushint 40 - dig 10 - box_replace - // modules/accounting.py:68 - // self.account[receiver].paid_coupons = self.account[sender].paid_coupons - dig 7 - box_get - assert // check self.account entry exists - extract 48 8 - pushint 48 - swap - box_replace - b asset_transfer_after_if_else@10 - -asset_transfer_bool_false@6: - intc_0 // 0 - b asset_transfer_bool_merge@7 - - -// modules.core_financial.common.CoreFinancialCommonMixin.asset_create[routing]() -> void: -asset_create: - // modules/core_financial/common.py:267 - // @arc4.abimethod(create="require") - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - txna ApplicationArgs 2 - dup - len - dig 1 - pushint 38 - extract_uint16 // on error: invalid tuple encoding - dup - pushint 40 - == - assert // invalid tail pointer at index 7 of (uint8,uint8,uint8,uint8,uint8,uint8,uint8[32],(len+utf8[])) - dig 2 - swap - dig 2 - substring3 - intc_0 // 0 - extract_uint16 // on error: invalid array length header - pushint 42 - + - == - assert // invalid number of bytes for smart_contracts.abi_types.AssetMetadata - // modules/core_financial/common.py:276 - // self.arranger.value = arranger - bytec 6 // 0x52323023 - uncover 2 - app_global_put - // modules/core_financial/common.py:277 - // self.metadata = metadata.bytes - bytec 25 // "metadata" - swap - app_global_put - // modules/core_financial/common.py:267 - // @arc4.abimethod(create="require") - intc_1 // 1 - return - - -// modules.core_financial.common.CoreFinancialCommonMixin.asset_update[routing]() -> void: -asset_update: - // modules/core_financial/common.py:279 - // @arc4.abimethod(allow_actions=["UpdateApplication"]) - txna ApplicationArgs 1 - dup - len - dig 1 - pushint 38 - extract_uint16 // on error: invalid tuple encoding - dup - pushint 40 - == - assert // invalid tail pointer at index 7 of (uint8,uint8,uint8,uint8,uint8,uint8,uint8[32],(len+utf8[])) - dig 2 - swap - dig 2 - substring3 - intc_0 // 0 - extract_uint16 // on error: invalid array length header - pushint 42 - + - == - assert // invalid number of bytes for smart_contracts.abi_types.AssetMetadata - // modules/core_financial/common.py:284-287 - // # The reference implementation grants the update permissions to the Arranger. - // # Other implementations may disable D-ASA application updatability or change its authorizations. - // # ⚠️ WARNING: Application updates must be executed VERY carefully, as they might introduce breaking changes. - // self.assert_caller_is_arranger() - callsub assert_caller_is_arranger - // modules/core_financial/common.py:288 - // self.metadata = metadata.bytes - bytec 25 // "metadata" - swap - app_global_put - // modules/core_financial/common.py:279 - // @arc4.abimethod(allow_actions=["UpdateApplication"]) - intc_1 // 1 - return - - -// modules.core_financial.common.CoreFinancialCommonMixin.set_secondary_time_events[routing]() -> void: -set_secondary_time_events: - intc_0 // 0 - // modules/core_financial/common.py:290 - // @arc4.abimethod - txna ApplicationArgs 1 - dupn 2 - intc_0 // 0 - extract_uint16 // on error: invalid array length header - dup - intc_3 // 8 - * - pushint 2 - + - uncover 2 - len - == - assert // invalid number of bytes for arc4.dynamic_array - // modules/core_financial/common.py:311 - // self.assert_caller_is_arranger() - callsub assert_caller_is_arranger - // modules/accounting.py:28 - // return self.status == enm.STATUS_ENDED - intc_0 // 0 - bytec_2 // "status" - app_global_get_ex - assert // check self.status exists - intc 5 // 200 - == - // modules/core_financial/common.py:312 - // assert not self.status_is_ended(), err.UNAUTHORIZED - ! - assert // Not authorized - // modules/core_financial/common.py:313 - // self.assert_is_not_asset_defaulted() - callsub assert_is_not_asset_defaulted - // modules/core_financial/common.py:315 - // assert secondary_market_time_events.length >= 1, err.INVALID_TIME_EVENTS_LENGTH - dup - assert // Time events length is invalid - // modules/core_financial/common.py:316 - // if secondary_market_time_events.length > 1: - intc_1 // 1 - > - bz set_secondary_time_events_after_if_else@3 - // modules/core_financial/common.py:317 - // self.assert_time_events_sorted(secondary_market_time_events) - dup - callsub assert_time_events_sorted - bury 1 - -set_secondary_time_events_after_if_else@3: - // modules/core_financial/common.py:320 - // self.issuance_date - intc_0 // 0 - bytec_3 // "issuance_date" - app_global_get_ex - assert // check self.issuance_date exists - // modules/core_financial/common.py:321 - // <= secondary_market_time_events[cfg.SECONDARY_MARKET_OPENING_DATE_IDX] - dig 1 - dup - extract 2 0 - bury 4 - pushint 2 - extract_uint64 - // modules/core_financial/common.py:320-321 - // self.issuance_date - // <= secondary_market_time_events[cfg.SECONDARY_MARKET_OPENING_DATE_IDX] - swap - dig 1 - <= - // modules/core_financial/common.py:319-322 - // assert ( - // self.issuance_date - // <= secondary_market_time_events[cfg.SECONDARY_MARKET_OPENING_DATE_IDX] - // ), err.INVALID_SECONDARY_OPENING_DATE - assert // Invalid secondary market opening date - // modules/core_financial/common.py:323 - // self.secondary_market_opening_date = secondary_market_time_events[ - bytec 16 // "secondary_market_opening_date" - // modules/core_financial/common.py:323-325 - // self.secondary_market_opening_date = secondary_market_time_events[ - // cfg.SECONDARY_MARKET_OPENING_DATE_IDX - // ] - swap - app_global_put - // modules/core_financial/common.py:326 - // if self.maturity_date: - intc_0 // 0 - bytec 10 // "maturity_date" - app_global_get_ex - assert // check self.maturity_date exists - bz set_secondary_time_events_after_if_else@5 - // modules/core_financial/common.py:328 - // self.maturity_date - intc_0 // 0 - bytec 10 // "maturity_date" - app_global_get_ex - assert // check self.maturity_date exists - // modules/core_financial/common.py:329 - // >= secondary_market_time_events[cfg.SECONDARY_MARKET_CLOSURE_DATE_IDX] - dig 1 - intc_0 // 0 - extract_uint16 // on error: invalid array length header - intc_1 // 1 - - - intc_3 // 8 - * - dig 3 - swap - extract_uint64 - // modules/core_financial/common.py:328-329 - // self.maturity_date - // >= secondary_market_time_events[cfg.SECONDARY_MARKET_CLOSURE_DATE_IDX] - swap - dig 1 - >= - // modules/core_financial/common.py:327-330 - // assert ( - // self.maturity_date - // >= secondary_market_time_events[cfg.SECONDARY_MARKET_CLOSURE_DATE_IDX] - // ), err.INVALID_SECONDARY_CLOSURE_DATE - assert // Invalid secondary market closure date - // modules/core_financial/common.py:331 - // self.secondary_market_closure_date = secondary_market_time_events[ - bytec 9 // "secondary_market_closure_date" - // modules/core_financial/common.py:331-333 - // self.secondary_market_closure_date = secondary_market_time_events[ - // cfg.SECONDARY_MARKET_CLOSURE_DATE_IDX - // ] - swap - app_global_put - -set_secondary_time_events_after_if_else@5: - // modules/core_financial/common.py:335 - // secondary_market_opening_date=self.secondary_market_opening_date, - intc_0 // 0 - bytec 16 // "secondary_market_opening_date" - app_global_get_ex - assert // check self.secondary_market_opening_date exists - // modules/core_financial/common.py:336 - // secondary_market_closure_date=self.secondary_market_closure_date, - intc_0 // 0 - bytec 9 // "secondary_market_closure_date" - app_global_get_ex - assert // check self.secondary_market_closure_date exists - // modules/core_financial/common.py:334-337 - // return typ.SecondaryMarketSchedule( - // secondary_market_opening_date=self.secondary_market_opening_date, - // secondary_market_closure_date=self.secondary_market_closure_date, - // ) - swap - itob - swap - itob - concat - // modules/core_financial/common.py:290 - // @arc4.abimethod - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.core_financial.common.CoreFinancialCommonMixin.set_default_status[routing]() -> void: -set_default_status: - // modules/core_financial/common.py:339 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_1 // 1 - == - assert // invalid number of bytes for arc4.bool - intc_0 // 0 - getbit - // modules/rbac.py:74 - // assert self._role_is_active(self.trustee, Txn.sender), err.UNAUTHORIZED - bytec 19 // 0x52363023 - txn Sender - callsub _role_is_active - assert // Not authorized - // modules/core_financial/common.py:352 - // self.asset_defaulted = defaulted - bytec 23 // "asset_defaulted" - swap - app_global_put - // modules/core_financial/common.py:353 - // return Global.latest_timestamp - global LatestTimestamp - // modules/core_financial/common.py:339 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.core_financial.common.CoreFinancialCommonMixin.primary_distribution[routing]() -> void: -primary_distribution: - pushbytes "" - // modules/core_financial/common.py:355 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - txna ApplicationArgs 2 - dup - len - intc_3 // 8 - == - assert // invalid number of bytes for arc4.uint64 - btoi - // modules/accounting.py:25 - // return self.status == enm.STATUS_ACTIVE - intc_0 // 0 - bytec_2 // "status" - app_global_get_ex - assert // check self.status exists - pushint 100 - == - // modules/core_financial/common.py:145-148 - // self.status_is_active() - // and self.primary_distribution_opening_date - // <= Global.latest_timestamp - // < self.primary_distribution_closure_date - bz primary_distribution_bool_false@5 - // modules/core_financial/common.py:146 - // and self.primary_distribution_opening_date - intc_0 // 0 - bytec 8 // "primary_distribution_opening_date" - app_global_get_ex - assert // check self.primary_distribution_opening_date exists - // modules/core_financial/common.py:147 - // <= Global.latest_timestamp - global LatestTimestamp - dup - bury 5 - // modules/core_financial/common.py:146-147 - // and self.primary_distribution_opening_date - // <= Global.latest_timestamp - <= - // modules/core_financial/common.py:146-148 - // and self.primary_distribution_opening_date - // <= Global.latest_timestamp - // < self.primary_distribution_closure_date - bz primary_distribution_bool_false@5 - // modules/core_financial/common.py:148 - // < self.primary_distribution_closure_date - intc_0 // 0 - bytec 27 // "primary_distribution_closure_date" - app_global_get_ex - assert // check self.primary_distribution_closure_date exists - // modules/core_financial/common.py:147-148 - // <= Global.latest_timestamp - // < self.primary_distribution_closure_date - dig 3 - > - // modules/core_financial/common.py:146-148 - // and self.primary_distribution_opening_date - // <= Global.latest_timestamp - // < self.primary_distribution_closure_date - bz primary_distribution_bool_false@5 - intc_1 // 1 - -primary_distribution_bool_merge@6: - // modules/core_financial/common.py:144-149 - // assert ( - // self.status_is_active() - // and self.primary_distribution_opening_date - // <= Global.latest_timestamp - // < self.primary_distribution_closure_date - // ), err.PRIMARY_DISTRIBUTION_CLOSED - assert // Primary distribution is closed - // modules/rbac.py:71 - // assert self._role_is_active(self.primary_dealer, Txn.sender), err.UNAUTHORIZED - bytec 20 // 0x52353023 - txn Sender - callsub _role_is_active - assert // Not authorized - // modules/accounting.py:31 - // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec_1 // 0x52333023 - dig 2 - concat - dup - box_len - bury 1 - assert // Invalid account holding address - // modules/core_financial/common.py:383 - // self.assert_is_not_asset_defaulted() - callsub assert_is_not_asset_defaulted - // modules/core_financial/common.py:384 - // self.assert_is_not_asset_suspended() - callsub assert_is_not_asset_suspended - // modules/core_financial/common.py:385 - // assert units > 0, err.ZERO_UNITS - dig 1 - dup - assert // Can not distribute zero units - // modules/core_financial/common.py:386 - // assert self.circulating_units + units <= self.total_units, err.OVER_DISTRIBUTION - intc_0 // 0 - bytec 4 // "circulating_units" - app_global_get_ex - assert // check self.circulating_units exists - dig 1 - + - intc_0 // 0 - bytec 13 // "total_units" - app_global_get_ex - assert // check self.total_units exists - dig 1 - >= - assert // Insufficient remaining D-ASA units - // modules/core_financial/common.py:388 - // self.circulating_units += units - bytec 4 // "circulating_units" - dig 1 - app_global_put - // modules/core_financial/common.py:389 - // self.account[holding_address].units += units - dig 2 - box_get - assert // check self.account entry exists - intc_2 // 32 - extract_uint64 - uncover 2 - + - itob - dig 2 - intc_2 // 32 - uncover 2 - box_replace - // modules/core_financial/common.py:390 - // self.account[holding_address].unit_value = self.unit_value - intc_0 // 0 - bytec 7 // "unit_value" - app_global_get_ex - assert // check self.unit_value exists - itob - uncover 2 - pushint 40 - uncover 2 - box_replace - // modules/core_financial/common.py:391 - // return self.total_units - self.circulating_units - intc_0 // 0 - bytec 13 // "total_units" - app_global_get_ex - assert // check self.total_units exists - swap - - - // modules/core_financial/common.py:355 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - -primary_distribution_bool_false@5: - intc_0 // 0 - b primary_distribution_bool_merge@6 - - -// modules.core_financial.common.CoreFinancialCommonMixin.get_asset_info[routing]() -> void: -get_asset_info: - // modules/core_financial/common.py:403 - // performance = UInt64(cst.PRF_PERFORMANT) - intc_0 // 0 - // modules/core_financial/common.py:404 - // if Global.latest_timestamp > self.maturity_date > 0: - global LatestTimestamp - intc_0 // 0 - bytec 10 // "maturity_date" - app_global_get_ex - swap - dup - cover 2 - cover 3 - assert // check self.maturity_date exists - > - bz get_asset_info_after_if_else@4 - dup - bz get_asset_info_after_if_else@4 - // modules/core_financial/common.py:405 - // performance = UInt64(cst.PRF_MATURED) - pushint 4 - bury 2 - -get_asset_info_after_if_else@4: - // modules/core_financial/common.py:406-407 - // # The reference implementation has no grace or delinquency periods - // if self.asset_defaulted: - intc_0 // 0 - bytec 23 // "asset_defaulted" - app_global_get_ex - assert // check self.asset_defaulted exists - bz get_asset_info_after_if_else@6 - // modules/core_financial/common.py:408 - // performance = UInt64(cst.PRF_DEFAULTED) - pushint 3 - bury 2 - -get_asset_info_after_if_else@6: - // modules/core_financial/common.py:411 - // denomination_asset_id=self.denomination_asset_id.id, - intc_0 // 0 - bytec 24 // "denomination_asset_id" - app_global_get_ex - assert // check self.denomination_asset_id exists - // modules/core_financial/common.py:412 - // settlement_asset_id=self.settlement_asset_id.id, - intc_0 // 0 - bytec 14 // "settlement_asset_id" - app_global_get_ex - assert // check self.settlement_asset_id exists - // modules/accounting.py:45 - // return self.circulating_units * self.unit_value - intc_0 // 0 - bytec 4 // "circulating_units" - app_global_get_ex - assert // check self.circulating_units exists - intc_0 // 0 - bytec 7 // "unit_value" - app_global_get_ex - assert // check self.unit_value exists - dup2 - * - // modules/core_financial/common.py:415 - // day_count_convention=arc4.UInt8(self.day_count_convention), - intc_0 // 0 - bytec 15 // "day_count_convention" - app_global_get_ex - assert // check self.day_count_convention exists - itob - dup - bitlen - intc_3 // 8 - <= - assert // overflow - extract 7 1 - // modules/core_financial/common.py:416 - // principal_discount=arc4.UInt16(self.principal_discount), - intc_0 // 0 - bytec 26 // "principal_discount" - app_global_get_ex - assert // check self.principal_discount exists - itob - dup - bitlen - pushint 16 - <= - assert // overflow - extract 6 2 - // modules/core_financial/common.py:417 - // interest_rate=arc4.UInt16(self.interest_rate), - intc_0 // 0 - bytec 5 // "interest_rate" - app_global_get_ex - assert // check self.interest_rate exists - itob - dup - bitlen - pushint 16 - <= - assert // overflow - extract 6 2 - // modules/core_financial/common.py:418 - // total_supply=self.total_units, - intc_0 // 0 - bytec 13 // "total_units" - app_global_get_ex - assert // check self.total_units exists - // modules/core_financial/common.py:420 - // primary_distribution_opening_date=self.primary_distribution_opening_date, - intc_0 // 0 - bytec 8 // "primary_distribution_opening_date" - app_global_get_ex - assert // check self.primary_distribution_opening_date exists - // modules/core_financial/common.py:421 - // primary_distribution_closure_date=self.primary_distribution_closure_date, - intc_0 // 0 - bytec 27 // "primary_distribution_closure_date" - app_global_get_ex - assert // check self.primary_distribution_closure_date exists - // modules/core_financial/common.py:422 - // issuance_date=self.issuance_date, - intc_0 // 0 - bytec_3 // "issuance_date" - app_global_get_ex - assert // check self.issuance_date exists - // modules/core_financial/common.py:423 - // maturity_date=self.maturity_date, - intc_0 // 0 - bytec 10 // "maturity_date" - app_global_get_ex - assert // check self.maturity_date exists - // modules/core_financial/common.py:424 - // suspended=self.asset_suspended, - intc_0 // 0 - bytec 22 // "asset_suspended" - app_global_get_ex - assert // check self.asset_suspended exists - // modules/core_financial/common.py:425 - // performance=arc4.UInt8(performance), - dig 15 - itob - dup - bitlen - intc_3 // 8 - <= - assert // overflow - extract 7 1 - // modules/core_financial/common.py:410-426 - // return typ.AssetInfo( - // denomination_asset_id=self.denomination_asset_id.id, - // settlement_asset_id=self.settlement_asset_id.id, - // outstanding_principal=self.outstanding_principal(), - // unit_value=self.unit_value, - // day_count_convention=arc4.UInt8(self.day_count_convention), - // principal_discount=arc4.UInt16(self.principal_discount), - // interest_rate=arc4.UInt16(self.interest_rate), - // total_supply=self.total_units, - // circulating_supply=self.circulating_units, - // primary_distribution_opening_date=self.primary_distribution_opening_date, - // primary_distribution_closure_date=self.primary_distribution_closure_date, - // issuance_date=self.issuance_date, - // maturity_date=self.maturity_date, - // suspended=self.asset_suspended, - // performance=arc4.UInt8(performance), - // ) - uncover 14 - itob - uncover 14 - itob - concat - uncover 11 - itob - concat - uncover 11 - itob - concat - uncover 10 - concat - uncover 9 - concat - uncover 8 - concat - uncover 7 - itob - concat - uncover 7 - itob - concat - uncover 6 - itob - concat - uncover 5 - itob - concat - uncover 4 - itob - concat - uncover 3 - itob - concat - bytec 30 // 0x00 - intc_0 // 0 - uncover 4 - setbit - concat - swap - concat - // modules/core_financial/common.py:393 - // @arc4.abimethod(readonly=True) - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.core_financial.common.CoreFinancialCommonMixin.get_time_events[routing]() -> void: -get_time_events: - // modules/core_financial/common.py:436 - // time_events = typ.TimeEvents() - bytec 33 // 0x0000 - // modules/accounting.py:25 - // return self.status == enm.STATUS_ACTIVE - intc_0 // 0 - bytec_2 // "status" - app_global_get_ex - assert // check self.status exists - pushint 100 - == - // modules/core_financial/common.py:437 - // if self.status_is_active(): - bz get_time_events_after_if_else@3 - // modules/core_financial/common.py:438 - // time_events = self.time_events.value.copy() - bytec 32 // 0x74696d654576656e7473 - box_get - swap - bury 2 - assert // check self.time_events exists - -get_time_events_after_if_else@3: - // modules/core_financial/common.py:428 - // @arc4.abimethod(readonly=True) - bytec_0 // 0x151f7c75 - dig 1 - concat - log - intc_1 // 1 - return - - -// modules.core_financial.common.CoreFinancialCommonMixin.get_secondary_market_schedule[routing]() -> void: -get_secondary_market_schedule: - // modules/core_financial/common.py:450 - // (self.secondary_market_opening_date, self.secondary_market_closure_date) - intc_0 // 0 - bytec 16 // "secondary_market_opening_date" - app_global_get_ex - assert // check self.secondary_market_opening_date exists - intc_0 // 0 - bytec 9 // "secondary_market_closure_date" - app_global_get_ex - assert // check self.secondary_market_closure_date exists - // modules/core_financial/common.py:449-451 - // return typ.TimeEvents( - // (self.secondary_market_opening_date, self.secondary_market_closure_date) - // ) - swap - itob - pushbytes 0x0002 - swap - concat - swap - itob - concat - // modules/core_financial/common.py:441 - // @arc4.abimethod(readonly=True) - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.core_financial.common.CoreFinancialCommonMixin.get_asset_metadata[routing]() -> void: -get_asset_metadata: - // modules/core_financial/common.py:462 - // return typ.AssetMetadata.from_bytes(self.metadata) - intc_0 // 0 - bytec 25 // "metadata" - app_global_get_ex - assert // check self.metadata exists - // modules/core_financial/common.py:453 - // @arc4.abimethod(readonly=True) - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.accounting.AccountingModule.account_gov_suspension[routing]() -> void: -account_gov_suspension: - // modules/accounting.py:94 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - txna ApplicationArgs 2 - dup - len - intc_1 // 1 - == - assert // invalid number of bytes for arc4.bool - intc_0 // 0 - getbit - // modules/rbac.py:77 - // assert self._role_is_active(self.authority, Txn.sender), err.UNAUTHORIZED - bytec 11 // 0x52373023 - txn Sender - callsub _role_is_active - assert // Not authorized - // modules/accounting.py:31 - // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec_1 // 0x52333023 - uncover 2 - concat - dup - box_len - bury 1 - assert // Invalid account holding address - // modules/accounting.py:114 - // self.account[holding_address].suspended = suspended - dup - pushint 56 - intc_1 // 1 - box_extract - intc_0 // 0 - uncover 3 - setbit - pushint 56 - swap - box_replace - // modules/accounting.py:115 - // return Global.latest_timestamp - global LatestTimestamp - // modules/accounting.py:94 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.accounting.AccountingModule.account_open[routing]() -> void: -account_open: - // modules/accounting.py:117 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - txna ApplicationArgs 2 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:68 - // assert self._role_is_active(self.account_manager, Txn.sender), err.UNAUTHORIZED - bytec 12 // 0x52343023 - txn Sender - callsub _role_is_active - assert // Not authorized - // modules/accounting.py:28 - // return self.status == enm.STATUS_ENDED - intc_0 // 0 - bytec_2 // "status" - app_global_get_ex - assert // check self.status exists - intc 5 // 200 - == - // modules/accounting.py:139 - // assert not self.status_is_ended(), err.UNAUTHORIZED - ! - assert // Not authorized - // modules/accounting.py:140 - // self.assert_is_not_asset_defaulted() - callsub assert_is_not_asset_defaulted - // modules/accounting.py:141 - // self.assert_is_not_asset_suspended() - callsub assert_is_not_asset_suspended - // modules/accounting.py:142 - // assert holding_address not in self.account, err.INVALID_HOLDING_ADDRESS - bytec_1 // 0x52333023 - uncover 2 - concat - dup - box_len - bury 1 - ! - assert // Invalid account holding address - // modules/accounting.py:146 - // units=UInt64(0), - intc_0 // 0 - // modules/accounting.py:144-150 - // self.account[holding_address] = typ.AccountInfo( - // payment_address=payment_address, - // units=UInt64(0), - // unit_value=UInt64(0), - // paid_coupons=UInt64(0), - // suspended=False, - // ) - itob - uncover 2 - dig 1 - concat - dig 1 - concat - swap - concat - bytec 30 // 0x00 - concat - box_put - // modules/accounting.py:151 - // return Global.latest_timestamp - global LatestTimestamp - // modules/accounting.py:117 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.accounting.AccountingModule.account_close[routing]() -> void: -account_close: - // modules/accounting.py:153 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:68 - // assert self._role_is_active(self.account_manager, Txn.sender), err.UNAUTHORIZED - bytec 12 // 0x52343023 - txn Sender - callsub _role_is_active - assert // Not authorized - // modules/accounting.py:171 - // self.assert_is_not_asset_defaulted() - callsub assert_is_not_asset_defaulted - // modules/accounting.py:31 - // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec_1 // 0x52333023 - swap - concat - dup - box_len - bury 1 - assert // Invalid account holding address - // modules/accounting.py:174 - // closed_units = self.account[holding_address].units - dup - box_get - pop - intc_2 // 32 - extract_uint64 - dup - uncover 2 - // modules/accounting.py:175 - // del self.account[holding_address] - box_del - pop - // modules/accounting.py:176 - // self.circulating_units -= closed_units - intc_0 // 0 - bytec 4 // "circulating_units" - app_global_get_ex - assert // check self.circulating_units exists - swap - - - bytec 4 // "circulating_units" - dig 1 - app_global_put - // modules/accounting.py:48 - // if self.circulating_units == UInt64(0): - bnz account_close_after_if_else@3 - // modules/accounting.py:49 - // self.status = UInt64(enm.STATUS_ENDED) - bytec_2 // "status" - intc 5 // 200 - app_global_put - -account_close_after_if_else@3: - // modules/accounting.py:178 - // return closed_units, Global.latest_timestamp - global LatestTimestamp - // modules/accounting.py:153 - // @arc4.abimethod - dig 1 - itob - swap - itob - concat - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.accounting.AccountingModule.account_update_payment_address[routing]() -> void: -account_update_payment_address: - // modules/accounting.py:180 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - txna ApplicationArgs 2 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/accounting.py:200 - // assert Txn.sender == holding_address, err.UNAUTHORIZED - txn Sender - dig 2 - == - assert // Not authorized - // modules/accounting.py:201 - // self.assert_is_not_asset_defaulted() - callsub assert_is_not_asset_defaulted - // modules/accounting.py:202 - // self.assert_is_not_asset_suspended() - callsub assert_is_not_asset_suspended - // modules/accounting.py:31 - // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec_1 // 0x52333023 - uncover 2 - concat - dup - box_len - bury 1 - assert // Invalid account holding address - // modules/accounting.py:204 - // self.account[holding_address].payment_address = payment_address - intc_0 // 0 - uncover 2 - box_replace - // modules/accounting.py:205 - // return Global.latest_timestamp - global LatestTimestamp - // modules/accounting.py:180 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.accounting.AccountingModule.account_get_info[routing]() -> void: -account_get_info: - // modules/accounting.py:207 - // @arc4.abimethod(readonly=True) - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/accounting.py:31 - // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec_1 // 0x52333023 - swap - concat - dup - box_len - bury 1 - assert // Invalid account holding address - // modules/accounting.py:222 - // return self.account[holding_address] - box_get - pop - // modules/accounting.py:207 - // @arc4.abimethod(readonly=True) - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.rbac.RbacModule.rbac_rotate_arranger[routing]() -> void: -rbac_rotate_arranger: - // modules/rbac.py:147 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:158 - // self.assert_caller_is_arranger() - callsub assert_caller_is_arranger - // modules/rbac.py:159 - // self.arranger.value = new_arranger - bytec 6 // 0x52323023 - swap - app_global_put - // modules/rbac.py:160 - // return Global.latest_timestamp - global LatestTimestamp - // modules/rbac.py:147 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.rbac.RbacModule.rbac_set_op_daemon[routing]() -> void: -rbac_set_op_daemon: - // modules/rbac.py:162 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:173 - // self.assert_caller_is_arranger() - callsub assert_caller_is_arranger - // modules/rbac.py:174 - // self.op_daemon.value = address - bytec 21 // 0x52323523 - swap - app_global_put - // modules/rbac.py:175 - // return Global.latest_timestamp - global LatestTimestamp - // modules/rbac.py:162 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.rbac.RbacModule.rbac_assign_role[routing]() -> void: -rbac_assign_role: - // modules/rbac.py:177 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_1 // 1 - == - assert // invalid number of bytes for arc4.uint8 - txna ApplicationArgs 2 - dup - cover 2 - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - txna ApplicationArgs 3 - dup - intc_0 // 0 - extract_uint16 // on error: invalid array length header - pushint 2 - + - dig 1 - len - == - assert // invalid number of bytes for arc4.dynamic_array - extract 2 0 - swap - // modules/rbac.py:199 - // self.assert_caller_is_arranger() - callsub assert_caller_is_arranger - // modules/rbac.py:200 - // self.assert_is_not_asset_defaulted() - callsub assert_is_not_asset_defaulted - // modules/rbac.py:201 - // self._assert_valid_role(role_id.as_uint64()) - btoi - dupn 2 - callsub _assert_valid_role - // modules/rbac.py:101 - // if role_id == UInt64(cst.ROLE_ARRANGER): - pushint 20 - == - bz rbac_assign_role_after_if_else@3 - // modules/rbac.py:102 - // self.arranger.value = role_address - bytec 6 // 0x52323023 - dig 3 - app_global_put - -rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14: - // modules/rbac.py:203 - // return Global.latest_timestamp - global LatestTimestamp - // modules/rbac.py:177 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - -rbac_assign_role_after_if_else@3: - // modules/rbac.py:105 - // if role_id == UInt64(cst.ROLE_ACCOUNT_MANAGER): - dup - pushint 40 - == - bz rbac_assign_role_after_if_else@5 - // modules/rbac.py:106 - // assert role_address not in self.account_manager, err.INVALID_ROLE_ADDRESS - bytec 12 // 0x52343023 - dig 3 - concat - dup - box_len - bury 1 - ! - assert // Invalid account role address - // modules/rbac.py:107 - // self.account_manager[role_address] = typ.RoleConfig.from_bytes(config) - dig 2 - box_put - // modules/rbac.py:202 - // self._upsert_role(role_id.as_uint64(), role_address, config) - b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14 - -rbac_assign_role_after_if_else@5: - // modules/rbac.py:109 - // if role_id == UInt64(cst.ROLE_PRIMARY_DEALER): - dup - pushint 50 - == - bz rbac_assign_role_after_if_else@7 - // modules/rbac.py:110 - // assert role_address not in self.primary_dealer, err.INVALID_ROLE_ADDRESS - bytec 20 // 0x52353023 - dig 3 - concat - dup - box_len - bury 1 - ! - assert // Invalid account role address - // modules/rbac.py:111 - // self.primary_dealer[role_address] = typ.RoleConfig.from_bytes(config) - dig 2 - box_put - // modules/rbac.py:202 - // self._upsert_role(role_id.as_uint64(), role_address, config) - b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14 - -rbac_assign_role_after_if_else@7: - // modules/rbac.py:113 - // if role_id == UInt64(cst.ROLE_TRUSTEE): - dup - pushint 60 - == - bz rbac_assign_role_after_if_else@9 - // modules/rbac.py:114 - // assert role_address not in self.trustee, err.INVALID_ROLE_ADDRESS - bytec 19 // 0x52363023 - dig 3 - concat - dup - box_len - bury 1 - ! - assert // Invalid account role address - // modules/rbac.py:115 - // self.trustee[role_address] = typ.RoleConfig.from_bytes(config) - dig 2 - box_put - // modules/rbac.py:202 - // self._upsert_role(role_id.as_uint64(), role_address, config) - b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14 - -rbac_assign_role_after_if_else@9: - // modules/rbac.py:117 - // if role_id == UInt64(cst.ROLE_AUTHORITY): - dup - pushint 70 - == - bz rbac_assign_role_after_if_else@11 - // modules/rbac.py:118 - // assert role_address not in self.authority, err.INVALID_ROLE_ADDRESS - bytec 11 // 0x52373023 - dig 3 - concat - dup - box_len - bury 1 - ! - assert // Invalid account role address - // modules/rbac.py:119 - // self.authority[role_address] = typ.RoleConfig.from_bytes(config) - dig 2 - box_put - // modules/rbac.py:202 - // self._upsert_role(role_id.as_uint64(), role_address, config) - b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14 - -rbac_assign_role_after_if_else@11: - // modules/rbac.py:121 - // if role_id == UInt64(cst.ROLE_INTEREST_ORACLE): - dup - pushint 80 - == - bz rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14 - // modules/rbac.py:122 - // assert role_address not in self.interest_oracle, err.INVALID_ROLE_ADDRESS - bytec 18 // 0x52383023 - dig 3 - concat - dup - box_len - bury 1 - ! - assert // Invalid account role address - // modules/rbac.py:123 - // self.interest_oracle[role_address] = typ.RoleConfig.from_bytes(config) - dig 2 - box_put - b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14 - - -// modules.rbac.RbacModule.rbac_revoke_role[routing]() -> void: -rbac_revoke_role: - // modules/rbac.py:205 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_1 // 1 - == - assert // invalid number of bytes for arc4.uint8 - txna ApplicationArgs 2 - dup - cover 2 - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:224 - // self.assert_caller_is_arranger() - callsub assert_caller_is_arranger - // modules/rbac.py:225 - // self.assert_is_not_asset_defaulted() - callsub assert_is_not_asset_defaulted - // modules/rbac.py:226 - // self._assert_valid_role(role_id.as_uint64()) - btoi - dupn 2 - callsub _assert_valid_role - // modules/rbac.py:126 - // assert role_id != UInt64(cst.ROLE_ARRANGER), err.INVALID_ROLE - dup - pushint 20 - != - assert // Invalid role identifier - // modules/rbac.py:127 - // if role_id == UInt64(cst.ROLE_ACCOUNT_MANAGER): - pushint 40 - == - bz rbac_revoke_role_after_if_else@3 - // modules/rbac.py:128 - // assert role_address in self.account_manager, err.INVALID_ROLE_ADDRESS - bytec 12 // 0x52343023 - dig 2 - concat - dup - box_len - bury 1 - assert // Invalid account role address - // modules/rbac.py:129 - // del self.account_manager[role_address] - box_del - pop - -rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12: - // modules/rbac.py:228 - // return Global.latest_timestamp - global LatestTimestamp - // modules/rbac.py:205 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - -rbac_revoke_role_after_if_else@3: - // modules/rbac.py:131 - // if role_id == UInt64(cst.ROLE_PRIMARY_DEALER): - dup - pushint 50 - == - bz rbac_revoke_role_after_if_else@5 - // modules/rbac.py:132 - // assert role_address in self.primary_dealer, err.INVALID_ROLE_ADDRESS - bytec 20 // 0x52353023 - dig 2 - concat - dup - box_len - bury 1 - assert // Invalid account role address - // modules/rbac.py:133 - // del self.primary_dealer[role_address] - box_del - pop - // modules/rbac.py:227 - // self._delete_role(role_id.as_uint64(), role_address) - b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 - -rbac_revoke_role_after_if_else@5: - // modules/rbac.py:135 - // if role_id == UInt64(cst.ROLE_TRUSTEE): - dup - pushint 60 - == - bz rbac_revoke_role_after_if_else@7 - // modules/rbac.py:136 - // assert role_address in self.trustee, err.INVALID_ROLE_ADDRESS - bytec 19 // 0x52363023 - dig 2 - concat - dup - box_len - bury 1 - assert // Invalid account role address - // modules/rbac.py:137 - // del self.trustee[role_address] - box_del - pop - // modules/rbac.py:227 - // self._delete_role(role_id.as_uint64(), role_address) - b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 - -rbac_revoke_role_after_if_else@7: - // modules/rbac.py:139 - // if role_id == UInt64(cst.ROLE_AUTHORITY): - dup - pushint 70 - == - bz rbac_revoke_role_after_if_else@9 - // modules/rbac.py:140 - // assert role_address in self.authority, err.INVALID_ROLE_ADDRESS - bytec 11 // 0x52373023 - dig 2 - concat - dup - box_len - bury 1 - assert // Invalid account role address - // modules/rbac.py:141 - // del self.authority[role_address] - box_del - pop - // modules/rbac.py:227 - // self._delete_role(role_id.as_uint64(), role_address) - b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 - -rbac_revoke_role_after_if_else@9: - // modules/rbac.py:143 - // if role_id == UInt64(cst.ROLE_INTEREST_ORACLE): - dup - pushint 80 - == - bz rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 - // modules/rbac.py:144 - // assert role_address in self.interest_oracle, err.INVALID_ROLE_ADDRESS - bytec 18 // 0x52383023 - dig 2 - concat - dup - box_len - bury 1 - assert // Invalid account role address - // modules/rbac.py:145 - // del self.interest_oracle[role_address] - box_del - pop - b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 - - -// modules.rbac.RbacModule.rbac_gov_asset_suspension[routing]() -> void: -rbac_gov_asset_suspension: - // modules/rbac.py:230 - // @arc4.abimethod # TODO: Update specs and add test - txna ApplicationArgs 1 - dup - len - intc_1 // 1 - == - assert // invalid number of bytes for arc4.bool - intc_0 // 0 - getbit - // modules/rbac.py:77 - // assert self._role_is_active(self.authority, Txn.sender), err.UNAUTHORIZED - bytec 11 // 0x52373023 - txn Sender - callsub _role_is_active - assert // Not authorized - // modules/rbac.py:246 - // self.asset_suspended = suspended - bytec 22 // "asset_suspended" - swap - app_global_put - // modules/rbac.py:247 - // return Global.latest_timestamp - global LatestTimestamp - // modules/rbac.py:230 - // @arc4.abimethod # TODO: Update specs and add test - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.rbac.RbacModule.rbac_get_arranger[routing]() -> void: -rbac_get_arranger: - // modules/rbac.py:257 - // return self.arranger.value - intc_0 // 0 - bytec 6 // 0x52323023 - app_global_get_ex - assert // check self.arranger exists - // modules/rbac.py:249 - // @arc4.abimethod(readonly=True) - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.rbac.RbacModule.rbac_get_address_roles[routing]() -> void: -rbac_get_address_roles: - // modules/rbac.py:259 - // @arc4.abimethod(readonly=True) - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:273 - // self._role_is_active(self.account_manager, address), - bytec 12 // 0x52343023 - dig 1 - callsub _role_is_active - // modules/rbac.py:274 - // self._role_is_active(self.primary_dealer, address), - bytec 20 // 0x52353023 - dig 2 - callsub _role_is_active - // modules/rbac.py:275 - // self._role_is_active(self.trustee, address), - bytec 19 // 0x52363023 - dig 3 - callsub _role_is_active - // modules/rbac.py:276 - // self._role_is_active(self.authority, address), - bytec 11 // 0x52373023 - dig 4 - callsub _role_is_active - // modules/rbac.py:277 - // self._role_is_active(self.interest_oracle, address), - bytec 18 // 0x52383023 - uncover 5 - callsub _role_is_active - // modules/rbac.py:259 - // @arc4.abimethod(readonly=True) - bytec 30 // 0x00 - intc_0 // 0 - uncover 6 - setbit - intc_1 // 1 - uncover 5 - setbit - pushint 2 - uncover 4 - setbit - pushint 3 - uncover 3 - setbit - pushint 4 - uncover 2 - setbit - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.rbac.RbacModule.rbac_get_role_config[routing]() -> void: -rbac_get_role_config: - // modules/rbac.py:280 - // @arc4.abimethod(readonly=True) - txna ApplicationArgs 1 - dup - len - intc_1 // 1 - == - assert // invalid number of bytes for arc4.uint8 - txna ApplicationArgs 2 - dup - cover 2 - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:294 - // role = role_id.as_uint64() - btoi - // modules/rbac.py:295 - // self._assert_valid_role(role) - dup - callsub _assert_valid_role - // modules/rbac.py:297 - // case UInt64(cst.ROLE_ARRANGER): - pushints 20 40 50 60 70 80 - // modules/rbac.py:296-327 - // match role: - // case UInt64(cst.ROLE_ARRANGER): - // return typ.RoleConfig( - // role_validity_start=UInt64(0), role_validity_end=UInt64(0) - // ) - // case UInt64(cst.ROLE_ACCOUNT_MANAGER): - // assert self._has_role( - // self.account_manager, role_address - // ), err.INVALID_ROLE_ADDRESS - // return self.account_manager[role_address] - // case UInt64(cst.ROLE_PRIMARY_DEALER): - // assert self._has_role( - // self.primary_dealer, role_address - // ), err.INVALID_ROLE_ADDRESS - // return self.primary_dealer[role_address] - // case UInt64(cst.ROLE_TRUSTEE): - // assert self._has_role( - // self.trustee, role_address - // ), err.INVALID_ROLE_ADDRESS - // return self.trustee[role_address] - // case UInt64(cst.ROLE_AUTHORITY): - // assert self._has_role( - // self.authority, role_address - // ), err.INVALID_ROLE_ADDRESS - // return self.authority[role_address] - // case UInt64(cst.ROLE_INTEREST_ORACLE): - // assert self._has_role( - // self.interest_oracle, role_address - // ), err.INVALID_ROLE_ADDRESS - // return self.interest_oracle[role_address] - // case _: - // op.err(err.INVALID_ROLE) - uncover 6 - match rbac_get_role_config_switch_case_0@2 rbac_get_role_config_switch_case_1@3 rbac_get_role_config_switch_case_2@4 rbac_get_role_config_switch_case_3@5 rbac_get_role_config_switch_case_4@6 rbac_get_role_config_switch_case_5@7 - // modules/rbac.py:327 - // op.err(err.INVALID_ROLE) - err // Invalid role identifier - -rbac_get_role_config_switch_case_5@7: - // modules/rbac.py:323 - // self.interest_oracle, role_address - bytec 18 // 0x52383023 - // modules/rbac.py:55 - // return role_address in role_map - dig 1 - concat - dup - box_len - bury 1 - // modules/rbac.py:322-324 - // assert self._has_role( - // self.interest_oracle, role_address - // ), err.INVALID_ROLE_ADDRESS - assert // Invalid account role address - // modules/rbac.py:325 - // return self.interest_oracle[role_address] - box_get - pop - -rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9: - // modules/rbac.py:280 - // @arc4.abimethod(readonly=True) - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - -rbac_get_role_config_switch_case_4@6: - // modules/rbac.py:318 - // self.authority, role_address - bytec 11 // 0x52373023 - // modules/rbac.py:55 - // return role_address in role_map - dig 1 - concat - dup - box_len - bury 1 - // modules/rbac.py:317-319 - // assert self._has_role( - // self.authority, role_address - // ), err.INVALID_ROLE_ADDRESS - assert // Invalid account role address - // modules/rbac.py:320 - // return self.authority[role_address] - box_get - pop - // modules/rbac.py:280 - // @arc4.abimethod(readonly=True) - b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9 - -rbac_get_role_config_switch_case_3@5: - // modules/rbac.py:313 - // self.trustee, role_address - bytec 19 // 0x52363023 - // modules/rbac.py:55 - // return role_address in role_map - dig 1 - concat - dup - box_len - bury 1 - // modules/rbac.py:312-314 - // assert self._has_role( - // self.trustee, role_address - // ), err.INVALID_ROLE_ADDRESS - assert // Invalid account role address - // modules/rbac.py:315 - // return self.trustee[role_address] - box_get - pop - // modules/rbac.py:280 - // @arc4.abimethod(readonly=True) - b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9 - -rbac_get_role_config_switch_case_2@4: - // modules/rbac.py:308 - // self.primary_dealer, role_address - bytec 20 // 0x52353023 - // modules/rbac.py:55 - // return role_address in role_map - dig 1 - concat - dup - box_len - bury 1 - // modules/rbac.py:307-309 - // assert self._has_role( - // self.primary_dealer, role_address - // ), err.INVALID_ROLE_ADDRESS - assert // Invalid account role address - // modules/rbac.py:310 - // return self.primary_dealer[role_address] - box_get - pop - // modules/rbac.py:280 - // @arc4.abimethod(readonly=True) - b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9 - -rbac_get_role_config_switch_case_1@3: - // modules/rbac.py:303 - // self.account_manager, role_address - bytec 12 // 0x52343023 - // modules/rbac.py:55 - // return role_address in role_map - dig 1 - concat - dup - box_len - bury 1 - // modules/rbac.py:302-304 - // assert self._has_role( - // self.account_manager, role_address - // ), err.INVALID_ROLE_ADDRESS - assert // Invalid account role address - // modules/rbac.py:305 - // return self.account_manager[role_address] - box_get - pop - // modules/rbac.py:280 - // @arc4.abimethod(readonly=True) - b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9 - -rbac_get_role_config_switch_case_0@2: - // modules/rbac.py:298-300 - // return typ.RoleConfig( - // role_validity_start=UInt64(0), role_validity_end=UInt64(0) - // ) - pushbytes 0x00000000000000000000000000000000 - // modules/rbac.py:280 - // @arc4.abimethod(readonly=True) - b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9 - - -// modules.core_financial.coupon.PerpetualCouponCashflowMixin.count_due_coupons() -> uint64: -count_due_coupons: - // modules/core_financial/coupon.py:351 - // def count_due_coupons(self) -> UInt64: - proto 0 1 - // modules/core_financial/coupon.py:352 - // due_coupons = UInt64(0) - intc_0 // 0 - // modules/core_financial/coupon.py:353 - // current_ts = Global.latest_timestamp - global LatestTimestamp - dup - // modules/core_financial/coupon.py:354 - // if current_ts > self.issuance_date: - intc_0 // 0 - bytec_3 // "issuance_date" - app_global_get_ex - assert // check self.issuance_date exists - > - bz count_due_coupons_after_if_else@2 - // modules/core_financial/coupon.py:355 - // due_coupons = (current_ts - self.issuance_date) // self.coupon_period - intc_0 // 0 - bytec_3 // "issuance_date" - app_global_get_ex - assert // check self.issuance_date exists - frame_dig 1 - swap - - - intc_0 // 0 - bytec 17 // "coupon_period" - app_global_get_ex - assert // check self.coupon_period exists - / - frame_bury 0 - -count_due_coupons_after_if_else@2: - // modules/core_financial/coupon.py:356-357 - // # div-by-zero: coupon_period != 0 due to assert_time_periods checks - // return due_coupons - retsub - - -// modules.core_financial.coupon.PerpetualCouponCashflowMixin.coupon_due_date(coupon: uint64) -> uint64: -coupon_due_date: - // modules/core_financial/coupon.py:359 - // def coupon_due_date(self, coupon: UInt64) -> UInt64: - proto 1 1 - // modules/core_financial/coupon.py:360 - // return self.issuance_date + coupon * self.coupon_period - intc_0 // 0 - bytec_3 // "issuance_date" - app_global_get_ex - assert // check self.issuance_date exists - intc_0 // 0 - bytec 17 // "coupon_period" - app_global_get_ex - assert // check self.coupon_period exists - frame_dig -1 - * - + - retsub - - -// modules.core_financial.coupon.PerpetualCouponCashflowMixin.day_count_factor(due_coupons: uint64) -> bytes: -day_count_factor: - // modules/core_financial/coupon.py:376 - // def day_count_factor(self, due_coupons: UInt64) -> typ.DayCountFactor: - proto 1 1 - pushbytes "" - dup - // modules/core_financial/coupon.py:377-378 - // # The reference implementation supports only the Actual/Actual and Continuous day-count conventions - // if not due_coupons: - frame_dig -1 - bnz day_count_factor_else_body@2 - // modules/core_financial/coupon.py:379 - // accruing_start_time = self.issuance_date - intc_0 // 0 - bytec_3 // "issuance_date" - app_global_get_ex - assert // check self.issuance_date exists - -day_count_factor_after_if_else@3: - // modules/core_financial/coupon.py:382 - // coupon_accrued_period = Global.latest_timestamp - accruing_start_time - global LatestTimestamp - swap - - - frame_bury 0 - // modules/core_financial/coupon.py:383 - // coupon_period = self.coupon_period - intc_0 // 0 - bytec 17 // "coupon_period" - app_global_get_ex - assert // check self.coupon_period exists - // modules/core_financial/coupon.py:384 - // if self.day_count_convention == UInt64(cst.DCC_A_A): - intc_0 // 0 - bytec 15 // "day_count_convention" - app_global_get_ex - assert // check self.day_count_convention exists - bnz day_count_factor_after_if_else@5 - // modules/core_financial/common.py:162 - // return time_period // UInt64(cst.DAY_2_SEC) - frame_dig 0 - intc 6 // 86400 - / - frame_bury 0 - intc 6 // 86400 - / - -day_count_factor_after_if_else@5: - // modules/core_financial/coupon.py:387-390 - // return typ.DayCountFactor( - // numerator=coupon_accrued_period, - // denominator=coupon_period, - // ) - frame_dig 0 - itob - swap - itob - concat - frame_bury 0 - retsub - -day_count_factor_else_body@2: - // modules/core_financial/coupon.py:363 - // coupon_due_date = UInt64() - intc_0 // 0 - frame_bury 1 - // modules/core_financial/coupon.py:364 - // if due_coupons >= UInt64(1): - frame_dig -1 - bz day_count_factor_after_if_else@8 - // modules/core_financial/coupon.py:365 - // coupon_due_date = self.coupon_due_date(due_coupons) - frame_dig -1 - callsub coupon_due_date - frame_bury 1 - -day_count_factor_after_if_else@8: - frame_dig 1 - b day_count_factor_after_if_else@3 - - -// modules.core_financial.coupon.PerpetualCouponCashflowMixin.is_accruing_interest(_due_coupons: uint64) -> uint64: -is_accruing_interest: - // modules/core_financial/coupon.py:392 - // def is_accruing_interest(self, _due_coupons: UInt64) -> bool: - proto 1 1 - // modules/core_financial/coupon.py:393 - // return self.issuance_date != 0 and Global.latest_timestamp > self.issuance_date - intc_0 // 0 - bytec_3 // "issuance_date" - app_global_get_ex - assert // check self.issuance_date exists - bz is_accruing_interest_bool_false@3 - global LatestTimestamp - intc_0 // 0 - bytec_3 // "issuance_date" - app_global_get_ex - assert // check self.issuance_date exists - > - bz is_accruing_interest_bool_false@3 - intc_1 // 1 - retsub - -is_accruing_interest_bool_false@3: - intc_0 // 0 - // modules/core_financial/coupon.py:393 - // return self.issuance_date != 0 and Global.latest_timestamp > self.issuance_date - retsub - - -// modules.core_financial.coupon.PerpetualCouponCashflowMixin.accrued_interest_amount(holding_address: bytes, units: uint64, due_coupons: uint64) -> uint64: -accrued_interest_amount: - // modules/core_financial/coupon.py:395-397 - // def accrued_interest_amount( - // self, holding_address: Account, units: UInt64, due_coupons: UInt64 - // ) -> UInt64: - proto 3 1 - // modules/core_financial/coupon.py:398-399 - // # The following assert safeguards the subroutine from forbidden invocations - // self.assert_no_pending_coupon_payment(holding_address, due_coupons) - frame_dig -3 - frame_dig -1 - callsub assert_no_pending_coupon_payment - // modules/core_financial/coupon.py:400 - // day_count_factor = self.day_count_factor(due_coupons) - frame_dig -1 - callsub day_count_factor - // modules/core_financial/coupon.py:401 - // coupon_accrued_period = day_count_factor.numerator - dup - intc_0 // 0 - extract_uint64 - // modules/core_financial/coupon.py:402 - // coupon_period = day_count_factor.denominator - swap - intc_3 // 8 - extract_uint64 - // modules/core_financial/coupon.py:404 - // self.account_units_value(holding_address, units) - frame_dig -3 - frame_dig -2 - callsub account_units_value - // modules/core_financial/coupon.py:405 - // * self.interest_rate - intc_0 // 0 - bytec 5 // "interest_rate" - app_global_get_ex - assert // check self.interest_rate exists - // modules/core_financial/coupon.py:404-405 - // self.account_units_value(holding_address, units) - // * self.interest_rate - * - // modules/core_financial/coupon.py:404-406 - // self.account_units_value(holding_address, units) - // * self.interest_rate - // * coupon_accrued_period - uncover 2 - * - // modules/core_financial/coupon.py:407 - // // (cst.BPS * coupon_period) - intc 4 // 10000 - uncover 2 - * - // modules/core_financial/coupon.py:404-407 - // self.account_units_value(holding_address, units) - // * self.interest_rate - // * coupon_accrued_period - // // (cst.BPS * coupon_period) - / - // modules/core_financial/coupon.py:403-408 - // return ( - // self.account_units_value(holding_address, units) - // * self.interest_rate - // * coupon_accrued_period - // // (cst.BPS * coupon_period) - // ) # div-by-zero: coupon_period != 0 due to assert_time_periods checks - retsub - - -// modules.core_financial.coupon.CouponCashflowMixin.all_due_coupons_paid(due_coupons: uint64) -> uint64: -all_due_coupons_paid: - // modules/core_financial/coupon.py:26 - // def all_due_coupons_paid(self, due_coupons: UInt64) -> bool: - proto 1 1 - // modules/core_financial/coupon.py:27 - // return self.paid_coupon_units >= self.circulating_units * due_coupons - intc_0 // 0 - bytec 28 // "paid_coupon_units" - app_global_get_ex - assert // check self.paid_coupon_units exists - intc_0 // 0 - bytec 4 // "circulating_units" - app_global_get_ex - assert // check self.circulating_units exists - frame_dig -1 - * - >= - retsub - - -// modules.core_financial.coupon.CouponCashflowMixin.assert_no_pending_coupon_payment(holding_address: bytes, due_coupons: uint64) -> void: -assert_no_pending_coupon_payment: - // modules/core_financial/coupon.py:29-31 - // def assert_no_pending_coupon_payment( - // self, holding_address: Account, due_coupons: UInt64 - // ) -> None: - proto 2 0 - // modules/core_financial/coupon.py:33 - // self.account[holding_address].paid_coupons == due_coupons - bytec_1 // 0x52333023 - frame_dig -2 - concat - box_get - assert // check self.account entry exists - pushint 48 - extract_uint64 - frame_dig -1 - == - // modules/core_financial/coupon.py:32-34 - // assert ( - // self.account[holding_address].paid_coupons == due_coupons - // ), err.PENDING_COUPON_PAYMENT - assert // Pending due coupon payment - retsub - - -// modules.core_financial.common.CoreFinancialCommonMixin.assert_time_events_sorted(time_events: bytes) -> bytes: -assert_time_events_sorted: - // modules/core_financial/common.py:107 - // def assert_time_events_sorted(self, time_events: typ.TimeEvents) -> None: - proto 1 1 - pushbytes "" - dupn 2 - // modules/core_financial/common.py:109 - // time_events[cfg.PRIMARY_DISTRIBUTION_OPENING_DATE_IDX] - frame_dig -1 - extract 2 0 - frame_dig -1 - pushint 2 - extract_uint64 - // modules/core_financial/common.py:110 - // > Global.latest_timestamp - global LatestTimestamp - // modules/core_financial/common.py:109-110 - // time_events[cfg.PRIMARY_DISTRIBUTION_OPENING_DATE_IDX] - // > Global.latest_timestamp - > - // modules/core_financial/common.py:108-111 - // assert ( - // time_events[cfg.PRIMARY_DISTRIBUTION_OPENING_DATE_IDX] - // > Global.latest_timestamp - // ), err.INVALID_TIME - assert // Time events must be set in the future - // modules/core_financial/common.py:112 - // for idx in urange(time_events.length - 1): - frame_dig -1 - intc_0 // 0 - extract_uint16 // on error: invalid array length header - intc_1 // 1 - - - intc_0 // 0 - -assert_time_events_sorted_for_header@1: - // modules/core_financial/common.py:112 - // for idx in urange(time_events.length - 1): - frame_dig 5 - frame_dig 4 - < - bz assert_time_events_sorted_after_for@6 - -assert_time_events_sorted_while_top@8: - pushint 75 - global OpcodeBudget - > - bz assert_time_events_sorted_after_while@13 - itxn_begin - pushint 6 // appl - itxn_field TypeEnum - pushint 5 // DeleteApplication - itxn_field OnCompletion - bytec 34 // 0x068101 - itxn_field ApprovalProgram - bytec 34 // 0x068101 - itxn_field ClearStateProgram - global MinTxnFee - itxn_field Fee - itxn_submit - b assert_time_events_sorted_while_top@8 - -assert_time_events_sorted_after_while@13: - // modules/core_financial/common.py:117 - // time_i = time_events[idx] - frame_dig 5 - dup - intc_3 // 8 - * - frame_dig 3 - dup - cover 3 - swap - extract_uint64 - dup - cover 3 - frame_bury 1 - // modules/core_financial/common.py:118 - // time_f = time_events[idx + 1] - intc_1 // 1 - + - dup - frame_bury 2 - intc_3 // 8 - * - extract_uint64 - dup - frame_bury 0 - // modules/core_financial/common.py:119 - // assert time_f > time_i, err.INVALID_SORTING - < - assert // Time events must be sorted in strictly ascending order - // modules/core_financial/common.py:120 - // if self.day_count_convention != UInt64(cst.DCC_CONT): - intc_0 // 0 - bytec 15 // "day_count_convention" - app_global_get_ex - assert // check self.day_count_convention exists - pushint 255 - != - bz assert_time_events_sorted_after_if_else@4 - // modules/core_financial/common.py:121-122 - // # The reference implementation requires time periods expressed in days for regular day-count conventions - // assert (time_f - time_i) % UInt64( - frame_dig 0 - frame_dig 1 - - - // modules/core_financial/common.py:121-124 - // # The reference implementation requires time periods expressed in days for regular day-count conventions - // assert (time_f - time_i) % UInt64( - // cst.DAY_2_SEC - // ) == 0, err.INVALID_TIME_PERIOD - intc 6 // 86400 - % - ! - assert // Time periods in Actual/Actual day count convention must be multiples of a day (in seconds) - -assert_time_events_sorted_after_if_else@4: - frame_dig 2 - frame_bury 5 - b assert_time_events_sorted_for_header@1 - -assert_time_events_sorted_after_for@6: - frame_dig -1 - frame_bury 0 - retsub - - -// modules.accounting.AccountingModule.assert_is_not_account_suspended(holding_address: bytes) -> void: -assert_is_not_account_suspended: - // modules/accounting.py:33 - // def assert_is_not_account_suspended(self, holding_address: Account) -> None: - proto 1 0 - // modules/accounting.py:34 - // assert not self.account[holding_address].suspended, err.SUSPENDED - bytec_1 // 0x52333023 - frame_dig -1 - concat - box_get - assert // check self.account entry exists - pushint 448 - getbit - ! - assert // Suspended operations - retsub - - -// modules.accounting.AccountingModule.account_units_value(holding_address: bytes, units: uint64) -> uint64: -account_units_value: - // modules/accounting.py:36 - // def account_units_value(self, holding_address: Account, units: UInt64) -> UInt64: - proto 2 1 - // modules/accounting.py:37 - // return units * self.account[holding_address].unit_value - bytec_1 // 0x52333023 - frame_dig -2 - concat - box_get - assert // check self.account entry exists - pushint 40 - extract_uint64 - frame_dig -1 - * - retsub - - -// modules.accounting.AccountingModule.account_total_units_value(holding_address: bytes) -> uint64: -account_total_units_value: - // modules/accounting.py:39 - // def account_total_units_value(self, holding_address: Account) -> UInt64: - proto 1 1 - // modules/accounting.py:41 - // holding_address, self.account[holding_address].units - bytec_1 // 0x52333023 - frame_dig -1 - concat - box_get - assert // check self.account entry exists - intc_2 // 32 - extract_uint64 - // modules/accounting.py:40-42 - // return self.account_units_value( - // holding_address, self.account[holding_address].units - // ) - frame_dig -1 - swap - callsub account_units_value - retsub - - -// modules.rbac.RbacModule._role_is_active(role_map: bytes, role_address: bytes) -> uint64: -_role_is_active: - // modules/rbac.py:57 - // def _role_is_active(self, role_map: typ.RbacRole, role_address: Account) -> bool: - proto 2 1 - pushbytes "" - // modules/rbac.py:55 - // return role_address in role_map - frame_dig -2 - frame_dig -1 - concat - dup - box_len - bury 1 - // modules/rbac.py:58-62 - // return self._has_role(role_map, role_address) and ( - // role_map[role_address].role_validity_start - // <= Global.latest_timestamp - // <= role_map[role_address].role_validity_end - // ) - bz _role_is_active_bool_false@4 - // modules/rbac.py:59 - // role_map[role_address].role_validity_start - frame_dig 1 - box_get - assert // check BoxMap entry exists - intc_0 // 0 - extract_uint64 - // modules/rbac.py:60 - // <= Global.latest_timestamp - global LatestTimestamp - dup - frame_bury 0 - // modules/rbac.py:59-60 - // role_map[role_address].role_validity_start - // <= Global.latest_timestamp - <= - // modules/rbac.py:59-61 - // role_map[role_address].role_validity_start - // <= Global.latest_timestamp - // <= role_map[role_address].role_validity_end - bz _role_is_active_bool_false@4 - // modules/rbac.py:61 - // <= role_map[role_address].role_validity_end - frame_dig 1 - box_get - assert // check BoxMap entry exists - intc_3 // 8 - extract_uint64 - // modules/rbac.py:60-61 - // <= Global.latest_timestamp - // <= role_map[role_address].role_validity_end - frame_dig 0 - >= - // modules/rbac.py:59-61 - // role_map[role_address].role_validity_start - // <= Global.latest_timestamp - // <= role_map[role_address].role_validity_end - bz _role_is_active_bool_false@4 - intc_1 // 1 - -_role_is_active_bool_merge@5: - // modules/rbac.py:58-62 - // return self._has_role(role_map, role_address) and ( - // role_map[role_address].role_validity_start - // <= Global.latest_timestamp - // <= role_map[role_address].role_validity_end - // ) - frame_bury 0 - retsub - -_role_is_active_bool_false@4: - intc_0 // 0 - b _role_is_active_bool_merge@5 - - -// modules.rbac.RbacModule.assert_caller_is_arranger() -> void: -assert_caller_is_arranger: - // modules/rbac.py:65 - // assert self._is_arranger(Txn.sender), err.UNAUTHORIZED - txn Sender - // modules/rbac.py:52 - // return role_address == self.arranger.value - intc_0 // 0 - bytec 6 // 0x52323023 - app_global_get_ex - assert // check self.arranger exists - == - // modules/rbac.py:65 - // assert self._is_arranger(Txn.sender), err.UNAUTHORIZED - assert // Not authorized - retsub - - -// modules.rbac.RbacModule.assert_is_not_asset_defaulted() -> void: -assert_is_not_asset_defaulted: - // modules/rbac.py:83 - // assert not self.asset_defaulted, err.DEFAULTED - intc_0 // 0 - bytec 23 // "asset_defaulted" - app_global_get_ex - assert // check self.asset_defaulted exists - ! - assert // Defaulted - retsub - - -// modules.rbac.RbacModule.assert_is_not_asset_suspended() -> void: -assert_is_not_asset_suspended: - // modules/rbac.py:86 - // assert not self.asset_suspended, err.SUSPENDED - intc_0 // 0 - bytec 22 // "asset_suspended" - app_global_get_ex - assert // check self.asset_suspended exists - ! - assert // Suspended operations - retsub - - -// modules.rbac.RbacModule._assert_valid_role(role_id: uint64) -> void: -_assert_valid_role: - // modules/rbac.py:88 - // def _assert_valid_role(self, role_id: UInt64) -> None: - proto 1 0 - // modules/rbac.py:89-96 - // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - frame_dig -1 - // modules/rbac.py:90 - // UInt64(cst.ROLE_ARRANGER), - pushint 20 - // modules/rbac.py:89-96 - // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - == - bnz _assert_valid_role_bool_true@6 - frame_dig -1 - // modules/rbac.py:91 - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - pushint 40 - // modules/rbac.py:89-96 - // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - == - bnz _assert_valid_role_bool_true@6 - frame_dig -1 - // modules/rbac.py:92 - // UInt64(cst.ROLE_PRIMARY_DEALER), - pushint 50 - // modules/rbac.py:89-96 - // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - == - bnz _assert_valid_role_bool_true@6 - frame_dig -1 - // modules/rbac.py:93 - // UInt64(cst.ROLE_TRUSTEE), - pushint 60 - // modules/rbac.py:89-96 - // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - == - bnz _assert_valid_role_bool_true@6 - frame_dig -1 - // modules/rbac.py:94 - // UInt64(cst.ROLE_AUTHORITY), - pushint 70 - // modules/rbac.py:89-96 - // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - == - bnz _assert_valid_role_bool_true@6 - frame_dig -1 - // modules/rbac.py:95 - // UInt64(cst.ROLE_INTEREST_ORACLE), - pushint 80 - // modules/rbac.py:89-96 - // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - == - bz _assert_valid_role_bool_false@7 - -_assert_valid_role_bool_true@6: - intc_1 // 1 - -_assert_valid_role_bool_merge@8: - // modules/rbac.py:89-96 - // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - assert // Invalid role identifier - retsub - -_assert_valid_role_bool_false@7: - intc_0 // 0 - b _assert_valid_role_bool_merge@8 diff --git a/smart_contracts/artifacts/perpetual_bond/PerpetualBond.arc56.json b/smart_contracts/artifacts/perpetual_bond/PerpetualBond.arc56.json deleted file mode 100644 index 8df11bb5..00000000 --- a/smart_contracts/artifacts/perpetual_bond/PerpetualBond.arc56.json +++ /dev/null @@ -1,1985 +0,0 @@ -{ - "name": "PerpetualBond", - "structs": { - "AccountInfo": [ - { - "name": "payment_address", - "type": "address" - }, - { - "name": "units", - "type": "uint64" - }, - { - "name": "unit_value", - "type": "uint64" - }, - { - "name": "paid_coupons", - "type": "uint64" - }, - { - "name": "suspended", - "type": "bool" - } - ], - "AssetInfo": [ - { - "name": "denomination_asset_id", - "type": "uint64" - }, - { - "name": "settlement_asset_id", - "type": "uint64" - }, - { - "name": "outstanding_principal", - "type": "uint64" - }, - { - "name": "unit_value", - "type": "uint64" - }, - { - "name": "day_count_convention", - "type": "uint8" - }, - { - "name": "principal_discount", - "type": "uint16" - }, - { - "name": "interest_rate", - "type": "uint16" - }, - { - "name": "total_supply", - "type": "uint64" - }, - { - "name": "circulating_supply", - "type": "uint64" - }, - { - "name": "primary_distribution_opening_date", - "type": "uint64" - }, - { - "name": "primary_distribution_closure_date", - "type": "uint64" - }, - { - "name": "issuance_date", - "type": "uint64" - }, - { - "name": "maturity_date", - "type": "uint64" - }, - { - "name": "suspended", - "type": "bool" - }, - { - "name": "performance", - "type": "uint8" - } - ], - "AssetMetadata": [ - { - "name": "contract_type", - "type": "uint8" - }, - { - "name": "calendar", - "type": "uint8" - }, - { - "name": "business_day_convention", - "type": "uint8" - }, - { - "name": "end_of_month_convention", - "type": "uint8" - }, - { - "name": "prepayment_effect", - "type": "uint8" - }, - { - "name": "penalty_type", - "type": "uint8" - }, - { - "name": "prospectus_hash", - "type": "byte[32]" - }, - { - "name": "prospectus_url", - "type": "string" - } - ], - "CouponsInfo": [ - { - "name": "total_coupons", - "type": "uint64" - }, - { - "name": "due_coupons", - "type": "uint64" - }, - { - "name": "next_coupon_due_date", - "type": "uint64" - }, - { - "name": "day_count_factor", - "type": "DayCountFactor" - }, - { - "name": "all_due_coupons_paid", - "type": "bool" - } - ], - "CurrentUnitsValue": [ - { - "name": "units_value", - "type": "uint64" - }, - { - "name": "accrued_interest", - "type": "uint64" - }, - { - "name": "day_count_factor", - "type": "DayCountFactor" - } - ], - "DayCountFactor": [ - { - "name": "numerator", - "type": "uint64" - }, - { - "name": "denominator", - "type": "uint64" - } - ], - "PaymentAmounts": [ - { - "name": "interest", - "type": "uint64" - }, - { - "name": "principal", - "type": "uint64" - } - ], - "PaymentResult": [ - { - "name": "amount", - "type": "uint64" - }, - { - "name": "timestamp", - "type": "uint64" - }, - { - "name": "context", - "type": "byte[]" - } - ], - "RoleConfig": [ - { - "name": "role_validity_start", - "type": "uint64" - }, - { - "name": "role_validity_end", - "type": "uint64" - } - ], - "SecondaryMarketSchedule": [ - { - "name": "secondary_market_opening_date", - "type": "uint64" - }, - { - "name": "secondary_market_closure_date", - "type": "uint64" - } - ] - }, - "methods": [ - { - "name": "asset_config", - "args": [ - { - "type": "uint64", - "name": "denomination_asset_id", - "desc": "Denomination asset identifier" - }, - { - "type": "uint64", - "name": "settlement_asset_id", - "desc": "Settlement asset identifier" - }, - { - "type": "uint64", - "name": "principal", - "desc": "Principal, expressed in denomination asset" - }, - { - "type": "uint64", - "name": "principal_discount", - "desc": "Principal discount in bps" - }, - { - "type": "uint64", - "name": "minimum_denomination", - "desc": "Minimum denomination, expressed in denomination asset" - }, - { - "type": "uint8", - "name": "day_count_convention", - "desc": "Day-count convention for interests calculation" - }, - { - "type": "uint16", - "name": "interest_rate", - "desc": "Interest rate in bps" - }, - { - "type": "uint16[]", - "name": "coupon_rates", - "desc": "Coupon interest rates in bps" - }, - { - "type": "uint64[]", - "name": "time_events", - "desc": "Time events (strictly ascending order)" - }, - { - "type": "(uint64,uint64)[]", - "name": "time_periods", - "desc": "Time periods of recurring time events" - } - ], - "returns": { - "type": "void" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Configure the Debt Algorand Standard Application", - "events": [], - "recommendations": {} - }, - { - "name": "update_interest_rate", - "args": [ - { - "type": "uint16", - "name": "interest_rate", - "desc": "Interest rate in bps" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the update" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Update variable interest rates in bps", - "events": [], - "recommendations": {} - }, - { - "name": "get_account_units_current_value", - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - }, - { - "type": "uint64", - "name": "units", - "desc": "Account's units for the current value calculation" - } - ], - "returns": { - "type": "(uint64,uint64,(uint64,uint64))", - "struct": "CurrentUnitsValue", - "desc": "Units current value in denomination asset, Accrued interest in denomination asset" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Get account's units current value and accrued interest", - "events": [], - "recommendations": {} - }, - { - "name": "get_payment_amount", - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - } - ], - "returns": { - "type": "(uint64,uint64)", - "struct": "PaymentAmounts", - "desc": "Interest amount in denomination asset, Principal amount in denomination asset" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Get the next payment amount", - "events": [], - "recommendations": {} - }, - { - "name": "get_coupons_status", - "args": [], - "returns": { - "type": "(uint64,uint64,uint64,(uint64,uint64),bool)", - "struct": "CouponsInfo", - "desc": "Total coupons, Due coupons, Next coupon due date, (Day count factor numerator, Day count factor denominator), All due coupons paid" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Get D-ASA coupons status", - "events": [], - "recommendations": {} - }, - { - "name": "get_time_periods", - "args": [], - "returns": { - "type": "(uint64,uint64)[]", - "desc": "Time periods" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Get D-ASA time periods", - "events": [], - "recommendations": {} - }, - { - "name": "pay_coupon", - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - }, - { - "type": "byte[]", - "name": "payment_info", - "desc": "Additional payment information (Optional)" - } - ], - "returns": { - "type": "(uint64,uint64,byte[])", - "struct": "PaymentResult", - "desc": "Paid coupon amount in denomination asset, Payment timestamp, Payment context" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Pay due coupon to an account", - "events": [ - { - "name": "Event", - "args": [ - { - "type": "uint64", - "name": "contract_id" - }, - { - "type": "uint8", - "name": "type" - }, - { - "type": "string", - "name": "type_name" - }, - { - "type": "uint64", - "name": "time" - }, - { - "type": "uint64", - "name": "payoff" - }, - { - "type": "uint64", - "name": "currency_id" - }, - { - "type": "byte[]", - "name": "currency_unit" - }, - { - "type": "uint64", - "name": "nominal_value" - }, - { - "type": "uint16", - "name": "nominal_rate_bps" - }, - { - "type": "uint64", - "name": "nominal_accrued" - } - ], - "desc": "ACTUS Event." - } - ], - "recommendations": {} - }, - { - "name": "asset_transfer", - "args": [ - { - "type": "address", - "name": "sender_holding_address", - "desc": "Sender Account Holding Address" - }, - { - "type": "address", - "name": "receiver_holding_address", - "desc": "Receiver Account Holding Address" - }, - { - "type": "uint64", - "name": "units", - "desc": "Amount of D-ASA units to transfer" - } - ], - "returns": { - "type": "uint64", - "desc": "Transferred actualized value in denomination asset" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Transfer D-ASA units between accounts", - "events": [], - "recommendations": {} - }, - { - "name": "asset_create", - "args": [ - { - "type": "address", - "name": "arranger", - "desc": "D-ASA Arranger Address" - }, - { - "type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", - "struct": "AssetMetadata", - "name": "metadata", - "desc": "D-ASA metadata" - } - ], - "returns": { - "type": "void" - }, - "actions": { - "create": [ - "NoOp" - ], - "call": [] - }, - "readonly": false, - "desc": "Create a new D-ASA", - "events": [], - "recommendations": {} - }, - { - "name": "asset_update", - "args": [ - { - "type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", - "struct": "AssetMetadata", - "name": "metadata" - } - ], - "returns": { - "type": "void" - }, - "actions": { - "create": [], - "call": [ - "UpdateApplication" - ] - }, - "readonly": false, - "desc": "Update D-ASA application.", - "events": [], - "recommendations": {} - }, - { - "name": "set_secondary_time_events", - "args": [ - { - "type": "uint64[]", - "name": "secondary_market_time_events", - "desc": "Secondary market time events (strictly ascending order)" - } - ], - "returns": { - "type": "(uint64,uint64)", - "struct": "SecondaryMarketSchedule", - "desc": "Secondary Market Opening Date, Secondary Market Closure Date" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Set secondary market time schedule", - "events": [], - "recommendations": {} - }, - { - "name": "set_default_status", - "args": [ - { - "type": "bool", - "name": "defaulted", - "desc": "Default status" - } - ], - "returns": { - "type": "uint64" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Set D-ASA default status", - "events": [], - "recommendations": {} - }, - { - "name": "primary_distribution", - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - }, - { - "type": "uint64", - "name": "units", - "desc": "Amount of D-ASA units to distribute" - } - ], - "returns": { - "type": "uint64", - "desc": "Remaining D-ASA units to be distributed" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Distribute D-ASA units to accounts according the primary market", - "events": [], - "recommendations": {} - }, - { - "name": "get_asset_info", - "args": [], - "returns": { - "type": "(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)", - "struct": "AssetInfo", - "desc": "Denomination asset ID, Settlement asset ID, Outstanding principal, Unit nominal value, Day-count convention, Interest rate, Total supply, Circulating supply, Primary distribution opening date, Primary distribution closure date, Issuance date, Maturity date, Suspended, Performance" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Get D-ASA info", - "events": [], - "recommendations": {} - }, - { - "name": "get_time_events", - "args": [], - "returns": { - "type": "uint64[]", - "desc": "Time events" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Get D-ASA time events", - "events": [], - "recommendations": {} - }, - { - "name": "get_secondary_market_schedule", - "args": [], - "returns": { - "type": "uint64[]", - "desc": "Secondary market schedule" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Get secondary market schedule", - "events": [], - "recommendations": {} - }, - { - "name": "get_asset_metadata", - "args": [], - "returns": { - "type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", - "struct": "AssetMetadata", - "desc": "Contract type, Calendar, Business day convention, End of month convention, Early repayment effect, Early repayment penalty type, Prospectus hash, Prospectus URL" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Get D-ASA metadata", - "events": [], - "recommendations": {} - }, - { - "name": "account_gov_suspension", - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - }, - { - "type": "bool", - "name": "suspended", - "desc": "Suspension status" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the set account suspension status" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Set account suspension status", - "events": [], - "recommendations": {} - }, - { - "name": "account_open", - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - }, - { - "type": "address", - "name": "payment_address", - "desc": "Account Payment Address" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the account opening" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Open D-ASA account", - "events": [], - "recommendations": {} - }, - { - "name": "account_close", - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - } - ], - "returns": { - "type": "(uint64,uint64)", - "desc": "Closed units, Timestamp of the account closing" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Close D-ASA account", - "events": [], - "recommendations": {} - }, - { - "name": "account_update_payment_address", - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - }, - { - "type": "address", - "name": "payment_address", - "desc": "Account Payment Address" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the account update" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Update the Payment Address of an account", - "events": [], - "recommendations": {} - }, - { - "name": "account_get_info", - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - } - ], - "returns": { - "type": "(address,uint64,uint64,uint64,bool)", - "struct": "AccountInfo", - "desc": "Payment Address, D-ASA units, Unit nominal value in denomination asset, Paid coupons, Suspended" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Get account info", - "events": [], - "recommendations": {} - }, - { - "name": "rbac_rotate_arranger", - "args": [ - { - "type": "address", - "name": "new_arranger", - "desc": "New Arranger address" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the role assignment" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Rotate the Arranger address", - "events": [], - "recommendations": {} - }, - { - "name": "rbac_set_op_daemon", - "args": [ - { - "type": "address", - "name": "address", - "desc": "Operation Daemon address" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the role assignment" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Non-Normative: Set the Operation Daemon address", - "events": [], - "recommendations": {} - }, - { - "name": "rbac_assign_role", - "args": [ - { - "type": "uint8", - "name": "role_id", - "desc": "Role Identifier" - }, - { - "type": "address", - "name": "role_address", - "desc": "Account Role Address" - }, - { - "type": "byte[]", - "name": "config", - "desc": "Role configuration (Optional)" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the role assignment" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Assign a role to an address", - "events": [], - "recommendations": {} - }, - { - "name": "rbac_revoke_role", - "args": [ - { - "type": "uint8", - "name": "role_id", - "desc": "Role Identifier" - }, - { - "type": "address", - "name": "role_address", - "desc": "Account Role Address" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the role revocation" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Revoke a role from an address", - "events": [], - "recommendations": {} - }, - { - "name": "rbac_gov_asset_suspension", - "args": [ - { - "type": "bool", - "name": "suspended", - "desc": "Suspension status" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the set asset suspension status" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Set asset suspension status", - "events": [], - "recommendations": {} - }, - { - "name": "rbac_get_arranger", - "args": [], - "returns": { - "type": "address", - "desc": "Arranger address" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Get Arranger address", - "events": [], - "recommendations": {} - }, - { - "name": "rbac_get_address_roles", - "args": [ - { - "type": "address", - "name": "address", - "desc": "Address to get roles for" - } - ], - "returns": { - "type": "(bool,bool,bool,bool,bool)", - "desc": "Roles mask: (Account Manager, Primary Dealer, Trustee, Authority, Interest Oracle)" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Non-normative - Get roles assigned to an address", - "events": [], - "recommendations": {} - }, - { - "name": "rbac_get_role_config", - "args": [ - { - "type": "uint8", - "name": "role_id", - "desc": "Role Identifier" - }, - { - "type": "address", - "name": "role_address", - "desc": "Account Role Address" - } - ], - "returns": { - "type": "(uint64,uint64)", - "struct": "RoleConfig", - "desc": "Role configuration" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Get role configuration", - "events": [], - "recommendations": {} - } - ], - "arcs": [ - 22, - 28 - ], - "networks": {}, - "state": { - "schema": { - "global": { - "ints": 20, - "bytes": 3 - }, - "local": { - "ints": 0, - "bytes": 0 - } - }, - "keys": { - "global": { - "arranger": { - "keyType": "AVMBytes", - "valueType": "address", - "key": "UjIwIw==" - }, - "op_daemon": { - "keyType": "AVMBytes", - "valueType": "address", - "key": "UjI1Iw==" - }, - "asset_suspended": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "YXNzZXRfc3VzcGVuZGVk" - }, - "asset_defaulted": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "YXNzZXRfZGVmYXVsdGVk" - }, - "total_units": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "dG90YWxfdW5pdHM=" - }, - "circulating_units": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "Y2lyY3VsYXRpbmdfdW5pdHM=" - }, - "unit_value": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "dW5pdF92YWx1ZQ==" - }, - "status": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "c3RhdHVz" - }, - "denomination_asset_id": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "ZGVub21pbmF0aW9uX2Fzc2V0X2lk" - }, - "settlement_asset_id": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "c2V0dGxlbWVudF9hc3NldF9pZA==" - }, - "day_count_convention": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "ZGF5X2NvdW50X2NvbnZlbnRpb24=" - }, - "metadata": { - "keyType": "AVMString", - "valueType": "AVMBytes", - "key": "bWV0YWRhdGE=" - }, - "principal_discount": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "cHJpbmNpcGFsX2Rpc2NvdW50" - }, - "interest_rate": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "aW50ZXJlc3RfcmF0ZQ==" - }, - "total_coupons": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "dG90YWxfY291cG9ucw==" - }, - "primary_distribution_opening_date": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "cHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRl" - }, - "primary_distribution_closure_date": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "cHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRl" - }, - "issuance_date": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "aXNzdWFuY2VfZGF0ZQ==" - }, - "secondary_market_opening_date": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "c2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGU=" - }, - "secondary_market_closure_date": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "c2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGU=" - }, - "maturity_date": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "bWF0dXJpdHlfZGF0ZQ==" - }, - "paid_coupon_units": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "cGFpZF9jb3Vwb25fdW5pdHM=" - }, - "coupon_period": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "Y291cG9uX3BlcmlvZA==" - } - }, - "local": {}, - "box": { - "time_events": { - "keyType": "AVMBytes", - "valueType": "uint64[]", - "key": "dGltZUV2ZW50cw==" - }, - "time_periods": { - "keyType": "AVMBytes", - "valueType": "(uint64,uint64)[]", - "key": "dGltZVBlcmlvZHM=" - } - } - }, - "maps": { - "global": {}, - "local": {}, - "box": { - "account_manager": { - "keyType": "address", - "valueType": "RoleConfig", - "prefix": "UjQwIw==" - }, - "primary_dealer": { - "keyType": "address", - "valueType": "RoleConfig", - "prefix": "UjUwIw==" - }, - "trustee": { - "keyType": "address", - "valueType": "RoleConfig", - "prefix": "UjYwIw==" - }, - "authority": { - "keyType": "address", - "valueType": "RoleConfig", - "prefix": "UjcwIw==" - }, - "interest_oracle": { - "keyType": "address", - "valueType": "RoleConfig", - "prefix": "UjgwIw==" - }, - "account": { - "keyType": "address", - "valueType": "AccountInfo", - "prefix": "UjMwIw==" - } - } - } - }, - "bareActions": { - "create": [], - "call": [] - }, - "sourceInfo": { - "approval": { - "sourceInfo": [ - { - "pc": [ - 2626 - ], - "errorMessage": "Can not distribute zero units" - }, - { - "pc": [ - 1106 - ], - "errorMessage": "Coupon rates are not properly defined" - }, - { - "pc": [ - 990 - ], - "errorMessage": "D-ASA already configured" - }, - { - "pc": [ - 4367 - ], - "errorMessage": "Defaulted" - }, - { - "pc": [ - 997 - ], - "errorMessage": "Denomination asset is not properly set" - }, - { - "pc": [ - 1008 - ], - "errorMessage": "Different settlement asset not supported, must be equal to denomination asset" - }, - { - "pc": [ - 2643 - ], - "errorMessage": "Insufficient remaining D-ASA units" - }, - { - "pc": [ - 2112, - 2207 - ], - "errorMessage": "Insufficient sender units to transfer" - }, - { - "pc": [ - 1096 - ], - "errorMessage": "Interest rate is not properly defined" - }, - { - "pc": [ - 1308, - 1435, - 1640, - 2066, - 2081, - 2616, - 3001, - 3072, - 3124, - 3204, - 3233 - ], - "errorMessage": "Invalid account holding address" - }, - { - "pc": [ - 3375, - 3399, - 3423, - 3447, - 3471, - 3528, - 3556, - 3578, - 3600, - 3622, - 3801, - 3819, - 3834, - 3849, - 3864 - ], - "errorMessage": "Invalid account role address" - }, - { - "pc": [ - 1326 - ], - "errorMessage": "Invalid amount of units for the account" - }, - { - "pc": [ - 1075 - ], - "errorMessage": "Invalid day-count convention ID" - }, - { - "pc": [ - 3512, - 3791, - 4429 - ], - "errorMessage": "Invalid role identifier" - }, - { - "pc": [ - 2487 - ], - "errorMessage": "Invalid secondary market closure date" - }, - { - "pc": [ - 2453 - ], - "errorMessage": "Invalid secondary market opening date" - }, - { - "pc": [ - 1041 - ], - "errorMessage": "Minimum denomination is not a divisor of principal" - }, - { - "pc": [ - 1649 - ], - "errorMessage": "No D-ASA units" - }, - { - "pc": [ - 1663 - ], - "errorMessage": "No due coupon to pay" - }, - { - "pc": [ - 1227, - 1622, - 1724, - 2048, - 2417, - 2530, - 2607, - 2992, - 3047, - 3056, - 3113, - 3189, - 3645, - 4359 - ], - "errorMessage": "Not authorized" - }, - { - "pc": [ - 1778 - ], - "errorMessage": "Not enough funds for the payment" - }, - { - "pc": [ - 1240, - 1667, - 4114 - ], - "errorMessage": "Pending due coupon payment" - }, - { - "pc": [ - 2599 - ], - "errorMessage": "Primary distribution is closed" - }, - { - "pc": [ - 1297 - ], - "errorMessage": "Primary distribution not yet executed" - }, - { - "pc": [ - 2039 - ], - "errorMessage": "Secondary market is closed" - }, - { - "pc": [ - 2097 - ], - "errorMessage": "Sender and receiver must be different" - }, - { - "pc": [ - 2162 - ], - "errorMessage": "Sender and receiver units are not fungible" - }, - { - "pc": [ - 4263, - 4375 - ], - "errorMessage": "Suspended operations" - }, - { - "pc": [ - 1118, - 2422 - ], - "errorMessage": "Time events length is invalid" - }, - { - "pc": [ - 4136 - ], - "errorMessage": "Time events must be set in the future" - }, - { - "pc": [ - 4214 - ], - "errorMessage": "Time events must be sorted in strictly ascending order" - }, - { - "pc": [ - 1177 - ], - "errorMessage": "Time period durations must be strictly greater than zero" - }, - { - "pc": [ - 1179 - ], - "errorMessage": "Time period repetitions are not properly defined" - }, - { - "pc": [ - 1163 - ], - "errorMessage": "Time periods are not properly defined" - }, - { - "pc": [ - 4236 - ], - "errorMessage": "Time periods in Actual/Actual day count convention must be multiples of a day (in seconds)" - }, - { - "pc": [ - 2101 - ], - "errorMessage": "Transfer units must be greater than zero" - }, - { - "pc": [ - 587 - ], - "errorMessage": "Wrong Global Bytes allocation" - }, - { - "pc": [ - 593 - ], - "errorMessage": "Wrong Global UInts allocation" - }, - { - "pc": [ - 597 - ], - "errorMessage": "Wrong Local Bytes allocation" - }, - { - "pc": [ - 601 - ], - "errorMessage": "Wrong Local UInts allocation" - }, - { - "pc": [ - 1771 - ], - "errorMessage": "account opted into asset" - }, - { - "pc": [ - 1845 - ], - "errorMessage": "asset exists" - }, - { - "pc": [ - 4319, - 4334 - ], - "errorMessage": "check BoxMap entry exists" - }, - { - "pc": [ - 1316, - 1655, - 1715, - 1728, - 1747, - 1782, - 1810, - 2105, - 2119, - 2128, - 2135, - 2146, - 2153, - 2167, - 2202, - 2244, - 2288, - 2652, - 4107, - 4257, - 4273, - 4289 - ], - "errorMessage": "check self.account entry exists" - }, - { - "pc": [ - 3663, - 4357 - ], - "errorMessage": "check self.arranger exists" - }, - { - "pc": [ - 2726, - 4365 - ], - "errorMessage": "check self.asset_defaulted exists" - }, - { - "pc": [ - 2828, - 4373 - ], - "errorMessage": "check self.asset_suspended exists" - }, - { - "pc": [ - 1850, - 2631, - 2748, - 3139, - 4093 - ], - "errorMessage": "check self.circulating_units exists" - }, - { - "pc": [ - 3918, - 3934, - 3965 - ], - "errorMessage": "check self.coupon_period exists" - }, - { - "pc": [ - 2760, - 3970, - 4219 - ], - "errorMessage": "check self.day_count_convention exists" - }, - { - "pc": [ - 1841, - 2738 - ], - "errorMessage": "check self.denomination_asset_id exists" - }, - { - "pc": [ - 1443, - 1675, - 2789, - 4069 - ], - "errorMessage": "check self.interest_rate exists" - }, - { - "pc": [ - 2437, - 2818, - 3901, - 3909, - 3929, - 3954, - 4019, - 4028 - ], - "errorMessage": "check self.issuance_date exists" - }, - { - "pc": [ - 2462, - 2470, - 2709, - 2823 - ], - "errorMessage": "check self.maturity_date exists" - }, - { - "pc": [ - 2960 - ], - "errorMessage": "check self.metadata exists" - }, - { - "pc": [ - 1684, - 1697 - ], - "errorMessage": "check self.op_daemon exists" - }, - { - "pc": [ - 1825, - 4088 - ], - "errorMessage": "check self.paid_coupon_units exists" - }, - { - "pc": [ - 2591, - 2814 - ], - "errorMessage": "check self.primary_distribution_closure_date exists" - }, - { - "pc": [ - 1281, - 1291, - 2577, - 2809 - ], - "errorMessage": "check self.primary_distribution_opening_date exists" - }, - { - "pc": [ - 1090, - 2774 - ], - "errorMessage": "check self.principal_discount exists" - }, - { - "pc": [ - 2023, - 2033, - 2501, - 2938 - ], - "errorMessage": "check self.secondary_market_closure_date exists" - }, - { - "pc": [ - 2012, - 2496, - 2933 - ], - "errorMessage": "check self.secondary_market_opening_date exists" - }, - { - "pc": [ - 1736, - 1765, - 2743 - ], - "errorMessage": "check self.settlement_asset_id exists" - }, - { - "pc": [ - 988, - 1465, - 1567, - 1618, - 2001, - 2412, - 2566, - 2908, - 3051 - ], - "errorMessage": "check self.status exists" - }, - { - "pc": [ - 2921 - ], - "errorMessage": "check self.time_events exists" - }, - { - "pc": [ - 1580 - ], - "errorMessage": "check self.time_periods exists" - }, - { - "pc": [ - 1523 - ], - "errorMessage": "check self.total_coupons exists" - }, - { - "pc": [ - 2639, - 2682, - 2804 - ], - "errorMessage": "check self.total_units exists" - }, - { - "pc": [ - 1855, - 2669, - 2753 - ], - "errorMessage": "check self.unit_value exists" - }, - { - "pc": [ - 925, - 947, - 968, - 1602, - 2333, - 2372, - 2394, - 2474, - 3313, - 4140 - ], - "errorMessage": "invalid array length header" - }, - { - "pc": [ - 2520, - 2982, - 3635 - ], - "errorMessage": "invalid number of bytes for arc4.bool" - }, - { - "pc": [ - 938 - ], - "errorMessage": "invalid number of bytes for arc4.dynamic_array" - }, - { - "pc": [ - 1610, - 3321 - ], - "errorMessage": "invalid number of bytes for arc4.dynamic_array" - }, - { - "pc": [ - 981 - ], - "errorMessage": "invalid number of bytes for arc4.dynamic_array>" - }, - { - "pc": [ - 959, - 2405 - ], - "errorMessage": "invalid number of bytes for arc4.dynamic_array" - }, - { - "pc": [ - 1267, - 1427, - 1596, - 1980, - 1988, - 2310, - 2553, - 2974, - 3031, - 3039, - 3105, - 3175, - 3183, - 3225, - 3249, - 3273, - 3307, - 3495, - 3677, - 3761 - ], - "errorMessage": "invalid number of bytes for arc4.static_array" - }, - { - "pc": [ - 919, - 1219 - ], - "errorMessage": "invalid number of bytes for arc4.uint16" - }, - { - "pc": [ - 863, - 872, - 881, - 890, - 899, - 1275, - 1996, - 2561 - ], - "errorMessage": "invalid number of bytes for arc4.uint64" - }, - { - "pc": [ - 908, - 3297, - 3485, - 3751 - ], - "errorMessage": "invalid number of bytes for arc4.uint8" - }, - { - "pc": [ - 2338, - 2377 - ], - "errorMessage": "invalid number of bytes for smart_contracts.abi_types.AssetMetadata" - }, - { - "pc": [ - 2325, - 2364 - ], - "errorMessage": "invalid tail pointer at index 7 of (uint8,uint8,uint8,uint8,uint8,uint8,uint8[32],(len+utf8[]))" - }, - { - "pc": [ - 2320, - 2359 - ], - "errorMessage": "invalid tuple encoding" - }, - { - "pc": [ - 2766, - 2781, - 2796, - 2836 - ], - "errorMessage": "overflow" - } - ], - "pcOffsetMethod": "none" - }, - "clear": { - "sourceInfo": [], - "pcOffsetMethod": "none" - } - }, - "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgMzIgOCAxMDAwMCAyMDAgODY0MDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAweDUyMzMzMDIzICJzdGF0dXMiICJpc3N1YW5jZV9kYXRlIiAiY2lyY3VsYXRpbmdfdW5pdHMiICJpbnRlcmVzdF9yYXRlIiAweDUyMzIzMDIzICJ1bml0X3ZhbHVlIiAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIiAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiICJtYXR1cml0eV9kYXRlIiAweDUyMzczMDIzIDB4NTIzNDMwMjMgInRvdGFsX3VuaXRzIiAic2V0dGxlbWVudF9hc3NldF9pZCIgImRheV9jb3VudF9jb252ZW50aW9uIiAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiICJjb3Vwb25fcGVyaW9kIiAweDUyMzgzMDIzIDB4NTIzNjMwMjMgMHg1MjM1MzAyMyAweDUyMzIzNTIzICJhc3NldF9zdXNwZW5kZWQiICJhc3NldF9kZWZhdWx0ZWQiICJkZW5vbWluYXRpb25fYXNzZXRfaWQiICJtZXRhZGF0YSIgInByaW5jaXBhbF9kaXNjb3VudCIgInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIgInBhaWRfY291cG9uX3VuaXRzIiAweDc0Njk2ZDY1NTA2NTcyNjk2ZjY0NzMgMHgwMCAidG90YWxfY291cG9ucyIgMHg3NDY5NmQ2NTQ1NzY2NTZlNzQ3MyAweDAwMDAgMHgwNjgxMDEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMC0zMQogICAgLy8gIyBSQkFDIFJvbGVzCiAgICAvLyBzZWxmLmFycmFuZ2VyID0gR2xvYmFsU3RhdGUoQWNjb3VudCgpLCBrZXk9Y3N0LlBSRUZJWF9JRF9BUlJBTkdFUikKICAgIGJ5dGVjIDYgLy8gMHg1MjMyMzAyMwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyCiAgICAvLyBzZWxmLm9wX2RhZW1vbiA9IEdsb2JhbFN0YXRlKEFjY291bnQoKSwga2V5PWNzdC5QUkVGSVhfSURfT1BfREFFTU9OKQogICAgYnl0ZWMgMjEgLy8gMHg1MjMyMzUyMwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjQ3LTQ4CiAgICAvLyAjIEQtQVNBIEdvdmVybmFuY2UKICAgIC8vIHNlbGYuYXNzZXRfc3VzcGVuZGVkID0gRmFsc2UKICAgIGJ5dGVjIDIyIC8vICJhc3NldF9zdXNwZW5kZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo0OQogICAgLy8gc2VsZi5hc3NldF9kZWZhdWx0ZWQgPSBGYWxzZQogICAgYnl0ZWMgMjMgLy8gImFzc2V0X2RlZmF1bHRlZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE5CiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzID0gVUludDY0KCkKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIwCiAgICAvLyBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzID0gVUludDY0KCkKICAgIGJ5dGVjIDQgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjEKICAgIC8vIHNlbGYudW5pdF92YWx1ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA3IC8vICJ1bml0X3ZhbHVlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjIKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGVubS5TVEFUVVNfSU5BQ1RJVkUpCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMxLTMyCiAgICAvLyAjIEFzc2V0IENvbmZpZ3VyYXRpb24KICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gQXNzZXQoKQogICAgYnl0ZWMgMjQgLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzMKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCA9IEFzc2V0KCkKICAgIGJ5dGVjIDE0IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozNAogICAgLy8gc2VsZi51bml0X3ZhbHVlID0gVUludDY0KCkKICAgIGJ5dGVjIDcgLy8gInVuaXRfdmFsdWUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjM1CiAgICAvLyBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uID0gVUludDY0KCkKICAgIGJ5dGVjIDE1IC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzctMzgKICAgIC8vICMgTWV0YWRhdGEKICAgIC8vIHNlbGYubWV0YWRhdGEgPSBCeXRlcygpCiAgICBieXRlYyAyNSAvLyAibWV0YWRhdGEiCiAgICBwdXNoYnl0ZXMgMHgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MC00MQogICAgLy8gIyBQcmluY2lwYWwgLyBSYXRlcwogICAgLy8gc2VsZi5wcmluY2lwYWxfZGlzY291bnQgPSBVSW50NjQoKQogICAgYnl0ZWMgMjYgLy8gInByaW5jaXBhbF9kaXNjb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDIKICAgIC8vIHNlbGYuaW50ZXJlc3RfcmF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA1IC8vICJpbnRlcmVzdF9yYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MwogICAgLy8gc2VsZi50b3RhbF9jb3Vwb25zID0gVUludDY0KCkKICAgIGJ5dGVjIDMxIC8vICJ0b3RhbF9jb3Vwb25zIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0NwogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgOCAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0OAogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMjcgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDkKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlY18zIC8vICJpc3N1YW5jZV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo1MAogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNiAvLyAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjUxCiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDkgLy8gInNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo1MgogICAgLy8gc2VsZi5tYXR1cml0eV9kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDEwIC8vICJtYXR1cml0eV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToyNAogICAgLy8gc2VsZi5wYWlkX2NvdXBvbl91bml0cyA9IFVJbnQ2NCgpCiAgICBieXRlYyAyOCAvLyAicGFpZF9jb3Vwb25fdW5pdHMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjMzNwogICAgLy8gc2VsZi5jb3Vwb25fcGVyaW9kID0gVUludDY0KCkKICAgIGJ5dGVjIDE3IC8vICJjb3Vwb25fcGVyaW9kIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzEKICAgIC8vIGFzc2VydCBUeG4uZ2xvYmFsX251bV9ieXRlX3NsaWNlID09IGNmZy5HTE9CQUxfQllURVMsIGVyci5XUk9OR19HTE9CQUxfQllURVMKICAgIHR4biBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgQnl0ZXMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjMyCiAgICAvLyBhc3NlcnQgVHhuLmdsb2JhbF9udW1fdWludCA9PSBjZmcuR0xPQkFMX1VJTlRTLCBlcnIuV1JPTkdfR0xPQkFMX1VJTlRTCiAgICB0eG4gR2xvYmFsTnVtVWludAogICAgcHVzaGludCAyMAogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgVUludHMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjMzCiAgICAvLyBhc3NlcnQgVHhuLmxvY2FsX251bV9ieXRlX3NsaWNlID09IGNmZy5MT0NBTF9CWVRFUywgZXJyLldST05HX0xPQ0FMX0JZVEVTCiAgICB0eG4gTG9jYWxOdW1CeXRlU2xpY2UKICAgICEKICAgIGFzc2VydCAvLyBXcm9uZyBMb2NhbCBCeXRlcyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzQKICAgIC8vIGFzc2VydCBUeG4ubG9jYWxfbnVtX3VpbnQgPT0gY2ZnLkxPQ0FMX1VJTlRTLCBlcnIuV1JPTkdfTE9DQUxfVUlOVFMKICAgIHR4biBMb2NhbE51bVVpbnQKICAgICEKICAgIGFzc2VydCAvLyBXcm9uZyBMb2NhbCBVSW50cyBhbGxvY2F0aW9uCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxNS0yOAogICAgLy8gY2xhc3MgUGVycGV0dWFsQm9uZCgKICAgIC8vICAgICBQQk5Db3JlTWl4aW4sCiAgICAvLyAgICAgUGVycGV0dWFsQ291cG9uQ2FzaGZsb3dNaXhpbiwKICAgIC8vICAgICBOb1ByaW5jaXBhbFBheW1lbnRNaXhpbiwKICAgIC8vICAgICBDb3Vwb25QYXltZW50QWdlbnRNaXhpbiwKICAgIC8vICAgICBDb3Vwb25UcmFuc2ZlckFnZW50TWl4aW4sCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyAgICAgYXZtX3ZlcnNpb249MTIsCiAgICAvLyApOgogICAgcHVzaGJ5dGVzIDB4MjVkYmE5NWIgLy8gbWV0aG9kICJhc3NldF91cGRhdGUoKHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LGJ5dGVbMzJdLHN0cmluZykpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fYXNzZXRfdXBkYXRlX3JvdXRlQDQKCm1haW5fc3dpdGNoX2Nhc2VfbmV4dEA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE1LTI4CiAgICAvLyBjbGFzcyBQZXJwZXR1YWxCb25kKAogICAgLy8gICAgIFBCTkNvcmVNaXhpbiwKICAgIC8vICAgICBQZXJwZXR1YWxDb3Vwb25DYXNoZmxvd01peGluLAogICAgLy8gICAgIE5vUHJpbmNpcGFsUGF5bWVudE1peGluLAogICAgLy8gICAgIENvdXBvblBheW1lbnRBZ2VudE1peGluLAogICAgLy8gICAgIENvdXBvblRyYW5zZmVyQWdlbnRNaXhpbiwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBhdm1fdmVyc2lvbj0xMiwKICAgIC8vICk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBieiBtYWluX2NyZWF0ZV9Ob09wQDM2CiAgICBwdXNoYnl0ZXNzIDB4ODk0NzQxMzQgMHg5MzE2Mjk4ZCAweDQ0MzYzZDQ5IDB4NjdkYjRmMjAgMHhmNmE5NmM4ZCAweDIyOWI3MDZmIDB4OGNmMTRiNTEgMHg0ZmQ2YTNjYyAweDFkNmZjMjU1IDB4MjVlOTk5N2YgMHg2Yzg1ZTNlZSAweDQwMmRiYTQ3IDB4ZmFkMjE3M2UgMHgwOGVmZWEzNSAweGU0YTVhYjU0IDB4ZGMwNjNiMzUgMHgxNGZjMTBlZiAweDRjMTEzZWQ1IDB4NzRhNzI5N2YgMHgxMDVjMTg0ZSAweDgyZjcxYjJkIDB4ZWYwNGY1ZDMgMHgwM2I4MzMyOSAweDNkYmU4MGJkIDB4ZGY1NGU4MmMgMHgwMTBjODI5OSAweDc0MDZhY2QyIDB4YzNlNGIyOTcgLy8gbWV0aG9kICJhc3NldF9jb25maWcodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50MTYsdWludDE2W10sdWludDY0W10sKHVpbnQ2NCx1aW50NjQpW10pdm9pZCIsIG1ldGhvZCAidXBkYXRlX2ludGVyZXN0X3JhdGUodWludDE2KXVpbnQ2NCIsIG1ldGhvZCAiZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZShhZGRyZXNzLHVpbnQ2NCkodWludDY0LHVpbnQ2NCwodWludDY0LHVpbnQ2NCkpIiwgbWV0aG9kICJnZXRfcGF5bWVudF9hbW91bnQoYWRkcmVzcykodWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImdldF9jb3Vwb25zX3N0YXR1cygpKHVpbnQ2NCx1aW50NjQsdWludDY0LCh1aW50NjQsdWludDY0KSxib29sKSIsIG1ldGhvZCAiZ2V0X3RpbWVfcGVyaW9kcygpKHVpbnQ2NCx1aW50NjQpW10iLCBtZXRob2QgInBheV9jb3Vwb24oYWRkcmVzcyxieXRlW10pKHVpbnQ2NCx1aW50NjQsYnl0ZVtdKSIsIG1ldGhvZCAiYXNzZXRfdHJhbnNmZXIoYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInNldF9zZWNvbmRhcnlfdGltZV9ldmVudHModWludDY0W10pKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJzZXRfZGVmYXVsdF9zdGF0dXMoYm9vbCl1aW50NjQiLCBtZXRob2QgInByaW1hcnlfZGlzdHJpYnV0aW9uKGFkZHJlc3MsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X2luZm8oKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDgsdWludDE2LHVpbnQxNix1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxib29sLHVpbnQ4KSIsIG1ldGhvZCAiZ2V0X3RpbWVfZXZlbnRzKCl1aW50NjRbXSIsIG1ldGhvZCAiZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGUoKXVpbnQ2NFtdIiwgbWV0aG9kICJnZXRfYXNzZXRfbWV0YWRhdGEoKSh1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCxieXRlWzMyXSxzdHJpbmcpIiwgbWV0aG9kICJhY2NvdW50X2dvdl9zdXNwZW5zaW9uKGFkZHJlc3MsYm9vbCl1aW50NjQiLCBtZXRob2QgImFjY291bnRfb3BlbihhZGRyZXNzLGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X2Nsb3NlKGFkZHJlc3MpKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJhY2NvdW50X3VwZGF0ZV9wYXltZW50X2FkZHJlc3MoYWRkcmVzcyxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAiYWNjb3VudF9nZXRfaW5mbyhhZGRyZXNzKShhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LGJvb2wpIiwgbWV0aG9kICJyYmFjX3JvdGF0ZV9hcnJhbmdlcihhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19zZXRfb3BfZGFlbW9uKGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX2Fzc2lnbl9yb2xlKHVpbnQ4LGFkZHJlc3MsYnl0ZVtdKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19yZXZva2Vfcm9sZSh1aW50OCxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19nb3ZfYXNzZXRfc3VzcGVuc2lvbihib29sKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19nZXRfYXJyYW5nZXIoKWFkZHJlc3MiLCBtZXRob2QgInJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXMoYWRkcmVzcykoYm9vbCxib29sLGJvb2wsYm9vbCxib29sKSIsIG1ldGhvZCAicmJhY19nZXRfcm9sZV9jb25maWcodWludDgsYWRkcmVzcykodWludDY0LHVpbnQ2NCkiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBhc3NldF9jb25maWcgdXBkYXRlX2ludGVyZXN0X3JhdGUgZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZSBnZXRfcGF5bWVudF9hbW91bnQgZ2V0X2NvdXBvbnNfc3RhdHVzIGdldF90aW1lX3BlcmlvZHMgcGF5X2NvdXBvbiBhc3NldF90cmFuc2ZlciBzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzIHNldF9kZWZhdWx0X3N0YXR1cyBwcmltYXJ5X2Rpc3RyaWJ1dGlvbiBnZXRfYXNzZXRfaW5mbyBnZXRfdGltZV9ldmVudHMgZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGUgZ2V0X2Fzc2V0X21ldGFkYXRhIGFjY291bnRfZ292X3N1c3BlbnNpb24gYWNjb3VudF9vcGVuIGFjY291bnRfY2xvc2UgYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzIGFjY291bnRfZ2V0X2luZm8gcmJhY19yb3RhdGVfYXJyYW5nZXIgcmJhY19zZXRfb3BfZGFlbW9uIHJiYWNfYXNzaWduX3JvbGUgcmJhY19yZXZva2Vfcm9sZSByYmFjX2dvdl9hc3NldF9zdXNwZW5zaW9uIHJiYWNfZ2V0X2FycmFuZ2VyIHJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXMgcmJhY19nZXRfcm9sZV9jb25maWcKICAgIGVycgoKbWFpbl9jcmVhdGVfTm9PcEAzNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxNS0yOAogICAgLy8gY2xhc3MgUGVycGV0dWFsQm9uZCgKICAgIC8vICAgICBQQk5Db3JlTWl4aW4sCiAgICAvLyAgICAgUGVycGV0dWFsQ291cG9uQ2FzaGZsb3dNaXhpbiwKICAgIC8vICAgICBOb1ByaW5jaXBhbFBheW1lbnRNaXhpbiwKICAgIC8vICAgICBDb3Vwb25QYXltZW50QWdlbnRNaXhpbiwKICAgIC8vICAgICBDb3Vwb25UcmFuc2ZlckFnZW50TWl4aW4sCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyAgICAgYXZtX3ZlcnNpb249MTIsCiAgICAvLyApOgogICAgcHVzaGJ5dGVzIDB4M2YwZWZjNmMgLy8gbWV0aG9kICJhc3NldF9jcmVhdGUoYWRkcmVzcywodWludDgsdWludDgsdWludDgsdWludDgsdWludDgsdWludDgsYnl0ZVszMl0sc3RyaW5nKSl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggYXNzZXRfY3JlYXRlCiAgICBlcnIKCm1haW5fYXNzZXRfdXBkYXRlX3JvdXRlQDQ6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyNzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgNCAvLyBVcGRhdGVBcHBsaWNhdGlvbgogICAgPT0KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0CiAgICBiIGFzc2V0X3VwZGF0ZQoKCi8vIG1vZHVsZXMuYWN0dXMucGJuLlBCTkNvcmVNaXhpbi5hc3NldF9jb25maWdbcm91dGluZ10oKSAtPiB2b2lkOgphc3NldF9jb25maWc6CiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIG1vZHVsZXMvYWN0dXMvcGJuLnB5OjMyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNwogICAgZHVwCiAgICBjb3ZlciA3CiAgICBsZW4KICAgIHB1c2hpbnQgMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50MTYKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDgKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgOAogICAgcHVzaGludCAyCiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIHN3YXAKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDE2PgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOQogICAgZHVwCiAgICBjb3ZlciA3CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGNvdmVyIDgKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIHN3YXAKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PHVpbnQ2ND4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEwCiAgICBkdXAKICAgIGNvdmVyIDcKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgOAogICAgcHVzaGludCAxNgogICAgKgogICAgcHVzaGludCAyCiAgICArCiAgICBzd2FwCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTx0dXBsZTx1aW50NjQsdWludDY0Pj4KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjIyNwogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MjI4CiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgPT0gZW51bXMuU1RBVFVTX0lOQUNUSVZFLCBlcnIuQUxSRUFEWV9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBELUFTQSBhbHJlYWR5IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjU1LTU2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIGRlbm9taW5hdGlvbiB3aXRoIEFTQQogICAgLy8gX2NyZWF0b3IsIGV4aXN0cyA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X2NyZWF0b3IoZGVub21pbmF0aW9uX2Fzc2V0X2lkKQogICAgZGlnIDUKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjU3CiAgICAvLyBhc3NlcnQgZXhpc3RzLCBlcnIuSU5WQUxJRF9ERU5PTUlOQVRJT04KICAgIGFzc2VydCAvLyBEZW5vbWluYXRpb24gYXNzZXQgaXMgbm90IHByb3Blcmx5IHNldAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NjAKICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICBieXRlYyAyNCAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgZGlnIDYKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo2NQogICAgLy8gc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgZGlnIDQKICAgIHVuY292ZXIgNgogICAgPT0KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjYzLTY2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc2V0dGxlbWVudCBhc3NldCBpcyB0aGUgZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQgPT0gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIC8vICksIGVyci5JTlZBTElEX1NFVFRMRU1FTlRfQVNTRVQKICAgIGFzc2VydCAvLyBEaWZmZXJlbnQgc2V0dGxlbWVudCBhc3NldCBub3Qgc3VwcG9ydGVkLCBtdXN0IGJlIGVxdWFsIHRvIGRlbm9taW5hdGlvbiBhc3NldAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NjkKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCA9IHNldHRsZW1lbnRfYXNzZXRfaWQKICAgIGJ5dGVjIDE0IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgZGlnIDUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3MC03NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhc3NldF9hbW91bnQ9MCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NzUKICAgIC8vIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3MwogICAgLy8gYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3NAogICAgLy8gYXNzZXRfYW1vdW50PTAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICB1bmNvdmVyIDUKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3MC03MQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3MC03NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhc3NldF9hbW91bnQ9MCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjIzOC0yMzkKICAgIC8vICMgU2V0IFByaW5jaXBhbCBhbmQgTWluaW11bSBEZW5vbWluYXRpb24KICAgIC8vIGFzc2VydCBwcmluY2lwYWwgJSBtaW5pbXVtX2Rlbm9taW5hdGlvbiA9PSAwLCBlcnIuSU5WQUxJRF9NSU5JTVVNX0RFTk9NSU5BVElPTgogICAgZGlnIDMKICAgIGRpZyAyCiAgICAlCiAgICAhCiAgICBhc3NlcnQgLy8gTWluaW11bSBkZW5vbWluYXRpb24gaXMgbm90IGEgZGl2aXNvciBvZiBwcmluY2lwYWwKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI0MAogICAgLy8gc2VsZi51bml0X3ZhbHVlID0gbWluaW11bV9kZW5vbWluYXRpb24KICAgIGJ5dGVjIDcgLy8gInVuaXRfdmFsdWUiCiAgICBkaWcgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI0MQogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IHByaW5jaXBhbCAvLyBtaW5pbXVtX2Rlbm9taW5hdGlvbgogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIC8KICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyNDIKICAgIC8vIHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50ID0gcHJpbmNpcGFsX2Rpc2NvdW50CiAgICBieXRlYyAyNiAvLyAicHJpbmNpcGFsX2Rpc2NvdW50IgogICAgdW5jb3ZlciAyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MjQ0LTI0NQogICAgLy8gIyBTZXQgRGF5LUNvdW50IENvbnZlbnRpb24KICAgIC8vIHNlbGYuYXNzZXJ0X2RheV9jb3VudF9jb252ZW50aW9uKGRheV9jb3VudF9jb252ZW50aW9uLmFzX3VpbnQ2NCgpKQogICAgYnRvaQogICAgZHVwCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3OS04MwogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIG9ubHkgdGhlIEFjdHVhbC9BY3R1YWwgYW5kIENvbnRpbnVvdXMgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0FfQSksCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQ09OVCksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9EQVlfQ09VTlRfQ09OVkVOVElPTgogICAgYnogYXNzZXRfY29uZmlnX2Jvb2xfdHJ1ZUAzCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjgyCiAgICAvLyBVSW50NjQoY3N0LkRDQ19DT05UKSwKICAgIHB1c2hpbnQgMjU1CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3OS04MwogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIG9ubHkgdGhlIEFjdHVhbC9BY3R1YWwgYW5kIENvbnRpbnVvdXMgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0FfQSksCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQ09OVCksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9EQVlfQ09VTlRfQ09OVkVOVElPTgogICAgPT0KICAgIGJ6IGFzc2V0X2NvbmZpZ19ib29sX2ZhbHNlQDQKCmFzc2V0X2NvbmZpZ19ib29sX3RydWVAMzoKICAgIGludGNfMSAvLyAxCgphc3NldF9jb25maWdfYm9vbF9tZXJnZUA1OgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NzktODMKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBvbmx5IHRoZSBBY3R1YWwvQWN0dWFsIGFuZCBDb250aW51b3VzIGRheS1jb3VudCBjb252ZW50aW9ucwogICAgLy8gYXNzZXJ0IGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19BX0EpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0NPTlQpLAogICAgLy8gKSwgZXJyLklOVkFMSURfREFZX0NPVU5UX0NPTlZFTlRJT04KICAgIGFzc2VydCAvLyBJbnZhbGlkIGRheS1jb3VudCBjb252ZW50aW9uIElECiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo4NgogICAgLy8gc2VsZi5kYXlfY291bnRfY29udmVudGlvbiA9IGRheV9jb3VudF9jb252ZW50aW9uCiAgICBieXRlYyAxNSAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI0OC0yNDkKICAgIC8vICMgU2V0IEludGVyZXN0IFJhdGUKICAgIC8vIHNlbGYuYXNzZXJ0X2ludGVyZXN0X3JhdGUoaW50ZXJlc3RfcmF0ZS5hc191aW50NjQoKSkKICAgIGRpZyA2CiAgICBidG9pCiAgICBidXJ5IDgKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5Ojg5LTkwCiAgICAvLyAjIFRoaXMgc3Vicm91dGluZSBtdXN0IGJlIHVzZWQgYWZ0ZXIgdGhlIHByaW5jaXBhbCBkaXNjb3VudCBoYXMgYmVlbiBzZXQKICAgIC8vIGlmIG5vdCBzZWxmLnByaW5jaXBhbF9kaXNjb3VudDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNiAvLyAicHJpbmNpcGFsX2Rpc2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW5jaXBhbF9kaXNjb3VudCBleGlzdHMKICAgIGJueiBhc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo5MQogICAgLy8gYXNzZXJ0IGludGVyZXN0X3JhdGUgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0lOVEVSRVNUX1JBVEUKICAgIGRpZyA3CiAgICBhc3NlcnQgLy8gSW50ZXJlc3QgcmF0ZSBpcyBub3QgcHJvcGVybHkgZGVmaW5lZAoKYXNzZXRfY29uZmlnX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5Ojk0CiAgICAvLyBzZWxmLmludGVyZXN0X3JhdGUgPSBpbnRlcmVzdF9yYXRlCiAgICBieXRlYyA1IC8vICJpbnRlcmVzdF9yYXRlIgogICAgZGlnIDgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo5NwogICAgLy8gYXNzZXJ0IG5vdCBjb3Vwb25fcmF0ZXMubGVuZ3RoLCBlcnIuSU5WQUxJRF9DT1VQT05fUkFURVMKICAgIGRpZyA1CiAgICBkdXAKICAgICEKICAgIGFzc2VydCAvLyBDb3Vwb24gcmF0ZXMgYXJlIG5vdCBwcm9wZXJseSBkZWZpbmVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMDAKICAgIC8vIHNlbGYudG90YWxfY291cG9ucyA9IGNvdXBvbl9yYXRlcy5sZW5ndGgKICAgIGJ5dGVjIDMxIC8vICJ0b3RhbF9jb3Vwb25zIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzL3Bibi5weToxOAogICAgLy8gdGltZV9ldmVudHMubGVuZ3RoID09IHNlbGYudG90YWxfY291cG9ucyArIDMKICAgIHB1c2hpbnQgMwogICAgKwogICAgZGlnIDQKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzL3Bibi5weToxNi0xOQogICAgLy8gIyBQQk4gaGFzIG5vIG1hdHVyaXR5IGRhdGUgaW4gdGhlIHN0YXRpYyBzY2hlZHVsZQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICB0aW1lX2V2ZW50cy5sZW5ndGggPT0gc2VsZi50b3RhbF9jb3Vwb25zICsgMwogICAgLy8gKSwgZXJyLklOVkFMSURfVElNRV9FVkVOVFNfTEVOR1RICiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbGVuZ3RoIGlzIGludmFsaWQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI1OAogICAgLy8gc2VsZi5hc3NlcnRfdGltZV9ldmVudHNfc29ydGVkKHRpbWVfZXZlbnRzKQogICAgZGlnIDQKICAgIGNhbGxzdWIgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZAogICAgLy8gbW9kdWxlcy9hY3R1cy9wYm4ucHk6MjIKICAgIC8vIHNlbGYudGltZV9ldmVudHMudmFsdWUgPSB0aW1lX2V2ZW50cy5jb3B5KCkKICAgIGJ5dGVjIDMyIC8vIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgMzIgLy8gMHg3NDY5NmQ2NTQ1NzY2NTZlNzQ3MwogICAgZGlnIDEKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXMvcGJuLnB5OjIzLTI1CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyBdCiAgICBkdXAKICAgIHB1c2hpbnQgMgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvYWN0dXMvcGJuLnB5OjIzCiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgYnl0ZWMgOCAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgLy8gbW9kdWxlcy9hY3R1cy9wYm4ucHk6MjMtMjUKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlID0gdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX09QRU5JTkdfREFURV9JRFgKICAgIC8vIF0KICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzL3Bibi5weToyNi0yOAogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgPSB0aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gXQogICAgZHVwCiAgICBwdXNoaW50IDEwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1cy9wYm4ucHk6MjYKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlID0gdGltZV9ldmVudHNbCiAgICBieXRlYyAyNyAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIgogICAgLy8gbW9kdWxlcy9hY3R1cy9wYm4ucHk6MjYtMjgKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlID0gdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX0NMT1NVUkVfREFURV9JRFgKICAgIC8vIF0KICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBwdXNoaW50IDE4CiAgICAvLyBtb2R1bGVzL2FjdHVzL3Bibi5weToyOQogICAgLy8gc2VsZi5pc3N1YW5jZV9kYXRlID0gdGltZV9ldmVudHNbY2ZnLklTU1VBTkNFX0RBVEVfSURYXQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjXzMgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1cy9wYm4ucHk6MzAKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgMTAgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjM0MC0zNDEKICAgIC8vICMgVGhlIHBlcnBldHVhbCBib25kIGRlZmluZXMgYSBzaW5nbGUgdGltZSBwZXJpb2QgZm9yIHRoZSBjb3Vwb24gZHVyYXRpb24gd2l0aCB1bmxpbWl0ZWQgcmVwZXRpdGlvbnMKICAgIC8vIGFzc2VydCB0aW1lX3BlcmlvZHMubGVuZ3RoID09IFVJbnQ2NCgxKSwgZXJyLklOVkFMSURfVElNRV9QRVJJT0RTCiAgICBkaWcgMQogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gVGltZSBwZXJpb2RzIGFyZSBub3QgcHJvcGVybHkgZGVmaW5lZAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MzQyCiAgICAvLyBjb3Vwb25fcGVyaW9kX2R1cmF0aW9uID0gdGltZV9wZXJpb2RzWzBdWzBdCiAgICBkaWcgMgogICAgZHVwCiAgICBleHRyYWN0IDIgMTYKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjM0NAogICAgLy8gYXNzZXJ0IGNvdXBvbl9wZXJpb2RfZHVyYXRpb24gPiBVSW50NjQoMCksIGVyci5JTlZBTElEX1RJTUVfUEVSSU9EX0RVUkFUSU9OCiAgICBzd2FwCiAgICBhc3NlcnQgLy8gVGltZSBwZXJpb2QgZHVyYXRpb25zIG11c3QgYmUgc3RyaWN0bHkgZ3JlYXRlciB0aGFuIHplcm8KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjM0NQogICAgLy8gYXNzZXJ0IHJlcGV0aXRpb25zID09IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfVElNRV9QRVJJT0RfUkVQRVRJVElPTlMKICAgICEKICAgIGFzc2VydCAvLyBUaW1lIHBlcmlvZCByZXBldGl0aW9ucyBhcmUgbm90IHByb3Blcmx5IGRlZmluZWQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjM0OAogICAgLy8gc2VsZi50aW1lX3BlcmlvZHMudmFsdWUgPSB0aW1lX3BlcmlvZHMuY29weSgpCiAgICBieXRlYyAyOSAvLyAweDc0Njk2ZDY1NTA2NTcyNjk2ZjY0NzMKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgMjkgLy8gMHg3NDY5NmQ2NTUwNjU3MjY5NmY2NDczCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTozNDkKICAgIC8vIHNlbGYuY291cG9uX3BlcmlvZCA9IHNlbGYudGltZV9wZXJpb2RzLnZhbHVlWzBdWzBdCiAgICBieXRlYyAyOSAvLyAweDc0Njk2ZDY1NTA2NTcyNjk2ZjY0NzMKICAgIHB1c2hpbnRzIDIgMTYKICAgIGJveF9leHRyYWN0CiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDE3IC8vICJjb3Vwb25fcGVyaW9kIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI2NQogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX0FDVElWRSkKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgMTAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1cy9wYm4ucHk6MzIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKYXNzZXRfY29uZmlnX2Jvb2xfZmFsc2VANDoKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2V0X2NvbmZpZ19ib29sX21lcmdlQDUKCgovLyBtb2R1bGVzLmFjdHVzLnBibi5QQk5Db3JlTWl4aW4udXBkYXRlX2ludGVyZXN0X3JhdGVbcm91dGluZ10oKSAtPiB2b2lkOgp1cGRhdGVfaW50ZXJlc3RfcmF0ZToKICAgIC8vIG1vZHVsZXMvYWN0dXMvcGJuLnB5Ojg5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDE2CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODAKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmludGVyZXN0X29yYWNsZSwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDE4IC8vIDB4NTIzODMwMjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXMvcGJuLnB5OjEwNwogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzL3Bibi5weToxMDgKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY3R1cy9wYm4ucHk6MTA5CiAgICAvLyBkdWVfY291cG9ucyA9IHNlbGYuY291bnRfZHVlX2NvdXBvbnMoKQogICAgY2FsbHN1YiBjb3VudF9kdWVfY291cG9ucwogICAgLy8gbW9kdWxlcy9hY3R1cy9wYm4ucHk6MTEwCiAgICAvLyBhc3NlcnQgc2VsZi5hbGxfZHVlX2NvdXBvbnNfcGFpZChkdWVfY291cG9ucyksIGVyci5QRU5ESU5HX0NPVVBPTl9QQVlNRU5UCiAgICBjYWxsc3ViIGFsbF9kdWVfY291cG9uc19wYWlkCiAgICBhc3NlcnQgLy8gUGVuZGluZyBkdWUgY291cG9uIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvYWN0dXMvcGJuLnB5OjExMi0xMTMKICAgIC8vICMgVXBkYXRlIGludGVyZXN0IHJhdGUKICAgIC8vIHNlbGYuaW50ZXJlc3RfcmF0ZSA9IGludGVyZXN0X3JhdGUuYXNfdWludDY0KCkKICAgIGJ0b2kKICAgIGJ5dGVjIDUgLy8gImludGVyZXN0X3JhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1cy9wYm4ucHk6MTE0CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWN0dXMvcGJuLnB5Ojg5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmNvcmVfZmluYW5jaWFsLmNvdXBvbi5QZXJwZXR1YWxDb3Vwb25DYXNoZmxvd01peGluLmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlOgogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiA0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0MTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0MzgKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOCAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQzOC00MzkKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIGJ6IGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUA0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0MzkKICAgIC8vIGFuZCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDggLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICA+PQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NDM4LTQzOQogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIGFuZCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgYnogZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDQKICAgIGludGNfMSAvLyAxCgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfbWVyZ2VANToKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQzNy00NDAKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vICAgICBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vICksIGVyci5OT19QUklNQVJZX0RJU1RSSUJVVElPTgogICAgYXNzZXJ0IC8vIFByaW1hcnkgZGlzdHJpYnV0aW9uIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozMQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgOQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NDQyCiAgICAvLyBhc3NlcnQgMCA8IHVuaXRzIDw9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLCBlcnIuSU5WQUxJRF9VTklUUwogICAgZHVwCiAgICBieiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VAOAogICAgZGlnIDcKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzIgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMQogICAgPj0KICAgIGJ6IGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUA4CiAgICBpbnRjXzEgLy8gMQoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX21lcmdlQDk6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0NDIKICAgIC8vIGFzc2VydCAwIDwgdW5pdHMgPD0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMsIGVyci5JTlZBTElEX1VOSVRTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhbW91bnQgb2YgdW5pdHMgZm9yIHRoZSBhY2NvdW50CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0NDQtNDQ1CiAgICAvLyAjIFZhbHVlIGR1cmluZyBwcmltYXJ5IGRpc3RyaWJ1dGlvbgogICAgLy8gYWNjb3VudF91bml0c19ub21pbmFsX3ZhbHVlID0gc2VsZi5hY2NvdW50X3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcywgdW5pdHMpCiAgICBkaWcgMQogICAgZHVwCiAgICBkaWcgMgogICAgY2FsbHN1YiBhY2NvdW50X3VuaXRzX3ZhbHVlCiAgICBidXJ5IDgKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQ0Ni00NDcKICAgIC8vICMgQWNjcnVpbmcgaW50ZXJlc3QgZHVyaW5nIHByaW1hcnkgZGlzdHJpYnV0aW9uCiAgICAvLyBhY2NydWVkX2ludGVyZXN0ID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDcKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQ0OAogICAgLy8gbnVtZXJhdG9yID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQ0OQogICAgLy8gZGVub21pbmF0b3IgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NDUxLTQ1MgogICAgLy8gIyBBY2NydWluZyBpbnRlcmVzdAogICAgLy8gZHVlX2NvdXBvbnMgPSBzZWxmLmNvdW50X2R1ZV9jb3Vwb25zKCkKICAgIGNhbGxzdWIgY291bnRfZHVlX2NvdXBvbnMKICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0NTMKICAgIC8vIHNlbGYuYXNzZXJ0X25vX3BlbmRpbmdfY291cG9uX3BheW1lbnQoaG9sZGluZ19hZGRyZXNzLCBkdWVfY291cG9ucykKICAgIHN3YXAKICAgIGRpZyAxCiAgICBjYWxsc3ViIGFzc2VydF9ub19wZW5kaW5nX2NvdXBvbl9wYXltZW50CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0NTQKICAgIC8vIGlmIHNlbGYuaXNfYWNjcnVpbmdfaW50ZXJlc3QoZHVlX2NvdXBvbnMpOgogICAgY2FsbHN1YiBpc19hY2NydWluZ19pbnRlcmVzdAogICAgYnogZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0NTUKICAgIC8vIGRheV9jb3VudF9mYWN0b3IgPSBzZWxmLmRheV9jb3VudF9mYWN0b3IoZHVlX2NvdXBvbnMpCiAgICBkaWcgMwogICAgZHVwCiAgICBjYWxsc3ViIGRheV9jb3VudF9mYWN0b3IKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQ1Ni00NTgKICAgIC8vIGFjY3J1ZWRfaW50ZXJlc3QgPSBzZWxmLmFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50KAogICAgLy8gICAgIGhvbGRpbmdfYWRkcmVzcywgdW5pdHMsIGR1ZV9jb3Vwb25zCiAgICAvLyApCiAgICBkaWcgMwogICAgZGlnIDMKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBhY2NydWVkX2ludGVyZXN0X2Ftb3VudAogICAgYnVyeSA3CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0NTkKICAgIC8vIG51bWVyYXRvciA9IGRheV9jb3VudF9mYWN0b3IubnVtZXJhdG9yCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnVyeSA0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0NjAKICAgIC8vIGRlbm9taW5hdG9yID0gZGF5X2NvdW50X2ZhY3Rvci5kZW5vbWluYXRvcgogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBidXJ5IDUKCmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQ2NS00NjgKICAgIC8vIGRheV9jb3VudF9mYWN0b3I9dHlwLkRheUNvdW50RmFjdG9yKAogICAgLy8gICAgIG51bWVyYXRvcj1udW1lcmF0b3IsCiAgICAvLyAgICAgZGVub21pbmF0b3I9ZGVub21pbmF0b3IsCiAgICAvLyApLAogICAgZGlnIDIKICAgIGl0b2IKICAgIGRpZyA1CiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQ2Mi00NjkKICAgIC8vIHJldHVybiB0eXAuQ3VycmVudFVuaXRzVmFsdWUoCiAgICAvLyAgICAgdW5pdHNfdmFsdWU9YWNjb3VudF91bml0c19ub21pbmFsX3ZhbHVlLAogICAgLy8gICAgIGFjY3J1ZWRfaW50ZXJlc3Q9YWNjcnVlZF9pbnRlcmVzdCwKICAgIC8vICAgICBkYXlfY291bnRfZmFjdG9yPXR5cC5EYXlDb3VudEZhY3RvcigKICAgIC8vICAgICAgICAgbnVtZXJhdG9yPW51bWVyYXRvciwKICAgIC8vICAgICAgICAgZGVub21pbmF0b3I9ZGVub21pbmF0b3IsCiAgICAvLyAgICAgKSwKICAgIC8vICkKICAgIGRpZyA3CiAgICBpdG9iCiAgICBkaWcgNwogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VAODoKICAgIGludGNfMCAvLyAwCiAgICBiIGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9tZXJnZUA5CgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VANDoKICAgIGludGNfMCAvLyAwCiAgICBiIGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9tZXJnZUA1CgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb3Vwb24uUGVycGV0dWFsQ291cG9uQ2FzaGZsb3dNaXhpbi5nZXRfcGF5bWVudF9hbW91bnRbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfcGF5bWVudF9hbW91bnQ6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0NzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZGlnIDEKICAgIGNvbmNhdAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NDg3CiAgICAvLyBzZWxmLmFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzKQogICAgY2FsbHN1YiBhY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0ODgKICAgIC8vICogc2VsZi5pbnRlcmVzdF9yYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9yYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NDg3LTQ4OAogICAgLy8gc2VsZi5hY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcykKICAgIC8vICogc2VsZi5pbnRlcmVzdF9yYXRlCiAgICAqCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0ODkKICAgIC8vIC8vIGNzdC5CUFMKICAgIGludGMgNCAvLyAxMDAwMAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NDg3LTQ4OQogICAgLy8gc2VsZi5hY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcykKICAgIC8vICogc2VsZi5pbnRlcmVzdF9yYXRlCiAgICAvLyAvLyBjc3QuQlBTCiAgICAvCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0OTEtNDk0CiAgICAvLyByZXR1cm4gdHlwLlBheW1lbnRBbW91bnRzKAogICAgLy8gICAgIGludGVyZXN0PWludGVyZXN0X2Ftb3VudCwKICAgIC8vICAgICBwcmluY2lwYWw9VUludDY0KDApLAogICAgLy8gKQogICAgaXRvYgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NDkzCiAgICAvLyBwcmluY2lwYWw9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQ5MS00OTQKICAgIC8vIHJldHVybiB0eXAuUGF5bWVudEFtb3VudHMoCiAgICAvLyAgICAgaW50ZXJlc3Q9aW50ZXJlc3RfYW1vdW50LAogICAgLy8gICAgIHByaW5jaXBhbD1VSW50NjQoMCksCiAgICAvLyApCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQ3MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb3Vwb24uUGVycGV0dWFsQ291cG9uQ2FzaGZsb3dNaXhpbi5nZXRfY291cG9uc19zdGF0dXNbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfY291cG9uc19zdGF0dXM6CiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gNAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gZW5tLlNUQVRVU19BQ1RJVkUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCAxMDAKICAgID09CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo1MDUKICAgIC8vIGR1ZV9jb3Vwb25zID0gc2VsZi5jb3VudF9kdWVfY291cG9ucygpIGlmIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpIGVsc2UgVUludDY0KCkKICAgIGJ6IGdldF9jb3Vwb25zX3N0YXR1c190ZXJuYXJ5X2ZhbHNlQDMKICAgIGNhbGxzdWIgY291bnRfZHVlX2NvdXBvbnMKICAgIGJ1cnkgMwoKZ2V0X2NvdXBvbnNfc3RhdHVzX3Rlcm5hcnlfbWVyZ2VANDoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjM2OQogICAgLy8gcmV0dXJuIHNlbGYuY291cG9uX2R1ZV9kYXRlKGR1ZV9jb3Vwb25zICsgMSkKICAgIGRpZyAyCiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBjYWxsc3ViIGNvdXBvbl9kdWVfZGF0ZQogICAgYnVyeSAzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo1MDcKICAgIC8vIGFsbF9kdWVfY291cG9uc19wYWlkID0gc2VsZi5hbGxfZHVlX2NvdXBvbnNfcGFpZChkdWVfY291cG9ucykKICAgIGR1cAogICAgY2FsbHN1YiBhbGxfZHVlX2NvdXBvbnNfcGFpZAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo1MDgKICAgIC8vIG51bWVyYXRvciA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAyCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo1MDkKICAgIC8vIGRlbm9taW5hdG9yID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDUKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjUxMAogICAgLy8gaWYgc2VsZi5pc19hY2NydWluZ19pbnRlcmVzdChkdWVfY291cG9ucyk6CiAgICBjYWxsc3ViIGlzX2FjY3J1aW5nX2ludGVyZXN0CiAgICBieiBnZXRfY291cG9uc19zdGF0dXNfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo1MTEKICAgIC8vIGRheV9jb3VudF9mYWN0b3IgPSBzZWxmLmRheV9jb3VudF9mYWN0b3IoZHVlX2NvdXBvbnMpCiAgICBkaWcgMgogICAgY2FsbHN1YiBkYXlfY291bnRfZmFjdG9yCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo1MTIKICAgIC8vIG51bWVyYXRvciA9IGRheV9jb3VudF9mYWN0b3IubnVtZXJhdG9yCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnVyeSAyCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo1MTMKICAgIC8vIGRlbm9taW5hdG9yID0gZGF5X2NvdW50X2ZhY3Rvci5kZW5vbWluYXRvcgogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBidXJ5IDQKCmdldF9jb3Vwb25zX3N0YXR1c19hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo1MTUKICAgIC8vIHRvdGFsX2NvdXBvbnM9c2VsZi50b3RhbF9jb3Vwb25zLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDMxIC8vICJ0b3RhbF9jb3Vwb25zIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX2NvdXBvbnMgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo1MTgtNTIxCiAgICAvLyBkYXlfY291bnRfZmFjdG9yPXR5cC5EYXlDb3VudEZhY3RvcigKICAgIC8vICAgICBudW1lcmF0b3I9bnVtZXJhdG9yLAogICAgLy8gICAgIGRlbm9taW5hdG9yPWRlbm9taW5hdG9yLAogICAgLy8gKSwKICAgIGRpZyAxCiAgICBpdG9iCiAgICBkaWcgNQogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo1MTQtNTIzCiAgICAvLyByZXR1cm4gdHlwLkNvdXBvbnNJbmZvKAogICAgLy8gICAgIHRvdGFsX2NvdXBvbnM9c2VsZi50b3RhbF9jb3Vwb25zLAogICAgLy8gICAgIGR1ZV9jb3Vwb25zPWR1ZV9jb3Vwb25zLAogICAgLy8gICAgIG5leHRfY291cG9uX2R1ZV9kYXRlPW5leHRfY291cG9uX2R1ZV9kYXRlLAogICAgLy8gICAgIGRheV9jb3VudF9mYWN0b3I9dHlwLkRheUNvdW50RmFjdG9yKAogICAgLy8gICAgICAgICBudW1lcmF0b3I9bnVtZXJhdG9yLAogICAgLy8gICAgICAgICBkZW5vbWluYXRvcj1kZW5vbWluYXRvciwKICAgIC8vICAgICApLAogICAgLy8gICAgIGFsbF9kdWVfY291cG9uc19wYWlkPWFsbF9kdWVfY291cG9uc19wYWlkLAogICAgLy8gKQogICAgc3dhcAogICAgaXRvYgogICAgZGlnIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZGlnIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlYyAzMCAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgZGlnIDcKICAgIHNldGJpdAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0OTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKZ2V0X2NvdXBvbnNfc3RhdHVzX3Rlcm5hcnlfZmFsc2VAMzoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjUwNQogICAgLy8gZHVlX2NvdXBvbnMgPSBzZWxmLmNvdW50X2R1ZV9jb3Vwb25zKCkgaWYgc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCkgZWxzZSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMwogICAgYiBnZXRfY291cG9uc19zdGF0dXNfdGVybmFyeV9tZXJnZUA0CgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb3Vwb24uUGVycGV0dWFsQ291cG9uQ2FzaGZsb3dNaXhpbi5nZXRfdGltZV9wZXJpb2RzW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X3RpbWVfcGVyaW9kczoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjUzMwogICAgLy8gdGltZV9wZXJpb2RzID0gdHlwLlRpbWVQZXJpb2RzKCkKICAgIGJ5dGVjIDMzIC8vIDB4MDAwMAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gZW5tLlNUQVRVU19BQ1RJVkUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCAxMDAKICAgID09CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo1MzQKICAgIC8vIGlmIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpOgogICAgYnogZ2V0X3RpbWVfcGVyaW9kc19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjUzNQogICAgLy8gdGltZV9wZXJpb2RzID0gc2VsZi50aW1lX3BlcmlvZHMudmFsdWUuY29weSgpCiAgICBieXRlYyAyOSAvLyAweDc0Njk2ZDY1NTA2NTcyNjk2ZjY0NzMKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGJ1cnkgMgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudGltZV9wZXJpb2RzIGV4aXN0cwoKZ2V0X3RpbWVfcGVyaW9kc19hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo1MjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnBheW1lbnRfYWdlbnQuY291cG9uLkNvdXBvblBheW1lbnRBZ2VudE1peGluLnBheV9jb3Vwb25bcm91dGluZ10oKSAtPiB2b2lkOgpwYXlfY291cG9uOgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvdXBvbi5weTozMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gZW5tLlNUQVRVU19BQ1RJVkUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCAxMDAKICAgID09CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTozOQogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQwCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQxCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozMQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NDQKICAgIC8vIHVuaXRzID0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMKICAgIGR1cAogICAgYm94X2dldAogICAgcG9wCiAgICBpbnRjXzIgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQ1CiAgICAvLyBhc3NlcnQgdW5pdHMgPiAwLCBlcnIuTk9fVU5JVFMKICAgIGFzc2VydCAvLyBObyBELUFTQSB1bml0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NDcKICAgIC8vIGR1ZV9jb3Vwb25zID0gc2VsZi5jb3VudF9kdWVfY291cG9ucygpCiAgICBjYWxsc3ViIGNvdW50X2R1ZV9jb3Vwb25zCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0OAogICAgLy8gYWNjb3VudF9wYWlkX2NvdXBvbnMgPSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMKICAgIHN3YXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQ4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NDkKICAgIC8vIGFzc2VydCBkdWVfY291cG9ucyA+IGFjY291bnRfcGFpZF9jb3Vwb25zLCBlcnIuTk9fRFVFX0NPVVBPTgogICAgc3dhcAogICAgZGlnIDEKICAgID4KICAgIGFzc2VydCAvLyBObyBkdWUgY291cG9uIHRvIHBheQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NTAtNTMKICAgIC8vICMgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zIHZlcmlmeSBpZiBvdGhlciBhY2NvdW50cyBhcmUgc3RpbGwgd2FpdGluZyBmb3IgdGhlIHBheW1lbnQgb2YgcHJldmlvdXMgY291cG9ucwogICAgLy8gYXNzZXJ0IHNlbGYuYWxsX2R1ZV9jb3Vwb25zX3BhaWQoCiAgICAvLyAgICAgYWNjb3VudF9wYWlkX2NvdXBvbnMKICAgIC8vICksIGVyci5QRU5ESU5HX0NPVVBPTl9QQVlNRU5UCiAgICBjYWxsc3ViIGFsbF9kdWVfY291cG9uc19wYWlkCiAgICBhc3NlcnQgLy8gUGVuZGluZyBkdWUgY291cG9uIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQxNAogICAgLy8gc2VsZi5hY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcyksIFVJbnQ2NCgxKQogICAgY2FsbHN1YiBhY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTozNzQKICAgIC8vIHJldHVybiBwcmluY2lwYWxfYW1vdW50ICogc2VsZi5pbnRlcmVzdF9yYXRlIC8vIGNzdC5CUFMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJpbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAqCiAgICBpbnRjIDQgLy8gMTAwMDAKICAgIC8KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MTMKICAgIC8vIGlmIHNlbGYub3BfZGFlbW9uLnZhbHVlICE9IEdsb2JhbC56ZXJvX2FkZHJlc3M6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjEgLy8gMHg1MjMyMzUyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wX2RhZW1vbiBleGlzdHMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGJ6IHBheV9jb3Vwb25fYWZ0ZXJfaWZfZWxzZUAyMgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weToxNQogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIxIC8vIDB4NTIzMjM1MjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcF9kYWVtb24gZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weToxNS0xNwogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICBibnogcGF5X2NvdXBvbl9ib29sX3RydWVAMTkKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MTYKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgNQogICAgPT0KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MTUtMTcKICAgIC8vIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICAvLyBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgYm56IHBheV9jb3Vwb25fYm9vbF90cnVlQDE5CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjE3CiAgICAvLyBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgdHhuIFNlbmRlcgogICAgZGlnIDMKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgMzIKICAgID09CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjE1LTE3CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIGJ6IHBheV9jb3Vwb25fYm9vbF9mYWxzZUAyMAoKcGF5X2NvdXBvbl9ib29sX3RydWVAMTk6CiAgICBpbnRjXzEgLy8gMQoKcGF5X2NvdXBvbl9ib29sX21lcmdlQDIxOgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weToxNC0xOAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyAgICAgb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vICAgICBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgLy8gKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCgpwYXlfY291cG9uX2FmdGVyX2lmX2Vsc2VAMjI6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjIyCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MuaXNfb3B0ZWRfaW4oCiAgICBkaWcgMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCAzMgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weToyMwogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTQgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MjItMjQKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5pc19vcHRlZF9pbigKICAgIC8vICAgICBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQKICAgIC8vICkKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjIyLTI1CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MuaXNfb3B0ZWRfaW4oCiAgICAvLyAgICAgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkCiAgICAvLyApCiAgICAvLyBhbmQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZAogICAgYnogcGF5X2NvdXBvbl9ib29sX2ZhbHNlQDI3CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjI1CiAgICAvLyBhbmQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZAogICAgZGlnIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQ0OAogICAgZ2V0Yml0CiAgICBibnogcGF5X2NvdXBvbl9ib29sX2ZhbHNlQDI3CiAgICBpbnRjXzEgLy8gMQoKcGF5X2NvdXBvbl9ib29sX21lcmdlQDI4OgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvdXBvbi5weTo1NwogICAgLy8gaWYgc2VsZi5pc19wYXltZW50X2V4ZWN1dGFibGUoaG9sZGluZ19hZGRyZXNzKToKICAgIGJ6IHBheV9jb3Vwb25fZWxzZV9ib2R5QDMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MzAKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICBzd2FwCiAgICBkaWcgMQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBvcHRlZCBpbnRvIGFzc2V0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjMwLTMxCiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgLy8gPj0gcGF5bWVudF9hbW91bnQKICAgIGRpZyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgID49CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjI5LTMyCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICAvLyAgICAgPj0gcGF5bWVudF9hbW91bnQKICAgIC8vICksIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcyBmb3IgdGhlIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb3Vwb24ucHk6NjAtNjEKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgdGhlIHNhbWUgYXNzZXQgZm9yIGRlbm9taW5hdGlvbiBhbmQgc2V0dGxlbWVudCwgbm8gY29udmVyc2lvbiBuZWVkZWQKICAgIC8vIHNlbGYucGF5KHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcywgcGF5bWVudF9hbW91bnQpCiAgICBkaWcgNAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCAzMgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weTozNS00MAogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXJlY2VpdmVyLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1hbW91bnQsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MzkKICAgIC8vIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgc3dhcAogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MzUKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MzUtNDAKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1yZWNlaXZlciwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9YW1vdW50LAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAoKcGF5X2NvdXBvbl9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo2MwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGFpZF9jb3Vwb25zICs9IDEKICAgIGRpZyAyCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQ4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIHB1c2hpbnQgNDgKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo2NAogICAgLy8gc2VsZi5wYWlkX2NvdXBvbl91bml0cyArPSB1bml0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI4IC8vICJwYWlkX2NvdXBvbl91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wYWlkX2NvdXBvbl91bml0cyBleGlzdHMKICAgIGRpZyAyCiAgICArCiAgICBieXRlYyAyOCAvLyAicGFpZF9jb3Vwb25fdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvdXBvbi5weToxNwogICAgLy8gY29udHJhY3RfaWQ9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25faWQuaWQsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uSUQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb3Vwb24ucHk6MjAKICAgIC8vIHRpbWU9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY291cG9uLnB5OjIyCiAgICAvLyBjdXJyZW5jeV9pZD1zZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZC5pZCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNCAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb3Vwb24ucHk6MjMKICAgIC8vIGN1cnJlbmN5X3VuaXQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQudW5pdF9uYW1lLAogICAgZHVwCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb3Vwb24ucHk6MjQKICAgIC8vIG5vbWluYWxfdmFsdWU9c2VsZi5jaXJjdWxhdGluZ191bml0cyAqIHNlbGYudW5pdF92YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJ1bml0X3ZhbHVlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnVuaXRfdmFsdWUgZXhpc3RzCiAgICAqCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY291cG9uLnB5OjE2LTI3CiAgICAvLyBFdmVudCgKICAgIC8vICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICB0eXBlPWFyYzQuVUludDgoZW51bXMuRVZUX1RZUEVfSVApLAogICAgLy8gICAgIHR5cGVfbmFtZT1TdHJpbmcoIklQIiksCiAgICAvLyAgICAgdGltZT1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICBwYXlvZmY9cGF5b2ZmLAogICAgLy8gICAgIGN1cnJlbmN5X2lkPXNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkLmlkLAogICAgLy8gICAgIGN1cnJlbmN5X3VuaXQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQudW5pdF9uYW1lLAogICAgLy8gICAgIG5vbWluYWxfdmFsdWU9c2VsZi5jaXJjdWxhdGluZ191bml0cyAqIHNlbGYudW5pdF92YWx1ZSwKICAgIC8vICAgICBub21pbmFsX3JhdGVfYnBzPWFyYzQuVUludDE2KDApLCAgIyBUT0RPOiBBZGQgaW50ZXJlc3QgcmF0ZQogICAgLy8gICAgIG5vbWluYWxfYWNjcnVlZD1VSW50NjQoMCksCiAgICAvLyApCiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIHB1c2hieXRlcyAweDA4MDAzNwogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZGlnIDQKICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHVuY292ZXIgNAogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgMwogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHN3YXAKICAgIHB1c2hieXRlcyAweDAwM2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb3Vwb24ucHk6MjUKICAgIC8vIG5vbWluYWxfcmF0ZV9icHM9YXJjNC5VSW50MTYoMCksICAjIFRPRE86IEFkZCBpbnRlcmVzdCByYXRlCiAgICBieXRlYyAzMyAvLyAweDAwMDAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb3Vwb24ucHk6MTYtMjcKICAgIC8vIEV2ZW50KAogICAgLy8gICAgIGNvbnRyYWN0X2lkPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2lkLmlkLAogICAgLy8gICAgIHR5cGU9YXJjNC5VSW50OChlbnVtcy5FVlRfVFlQRV9JUCksCiAgICAvLyAgICAgdHlwZV9uYW1lPVN0cmluZygiSVAiKSwKICAgIC8vICAgICB0aW1lPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gICAgIHBheW9mZj1wYXlvZmYsCiAgICAvLyAgICAgY3VycmVuY3lfaWQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQuaWQsCiAgICAvLyAgICAgY3VycmVuY3lfdW5pdD1zZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZC51bml0X25hbWUsCiAgICAvLyAgICAgbm9taW5hbF92YWx1ZT1zZWxmLmNpcmN1bGF0aW5nX3VuaXRzICogc2VsZi51bml0X3ZhbHVlLAogICAgLy8gICAgIG5vbWluYWxfcmF0ZV9icHM9YXJjNC5VSW50MTYoMCksICAjIFRPRE86IEFkZCBpbnRlcmVzdCByYXRlCiAgICAvLyAgICAgbm9taW5hbF9hY2NydWVkPVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvdXBvbi5weToyNgogICAgLy8gbm9taW5hbF9hY2NydWVkPVVJbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY291cG9uLnB5OjE2LTI3CiAgICAvLyBFdmVudCgKICAgIC8vICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICB0eXBlPWFyYzQuVUludDgoZW51bXMuRVZUX1RZUEVfSVApLAogICAgLy8gICAgIHR5cGVfbmFtZT1TdHJpbmcoIklQIiksCiAgICAvLyAgICAgdGltZT1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICBwYXlvZmY9cGF5b2ZmLAogICAgLy8gICAgIGN1cnJlbmN5X2lkPXNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkLmlkLAogICAgLy8gICAgIGN1cnJlbmN5X3VuaXQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQudW5pdF9uYW1lLAogICAgLy8gICAgIG5vbWluYWxfdmFsdWU9c2VsZi5jaXJjdWxhdGluZ191bml0cyAqIHNlbGYudW5pdF92YWx1ZSwKICAgIC8vICAgICBub21pbmFsX3JhdGVfYnBzPWFyYzQuVUludDE2KDApLCAgIyBUT0RPOiBBZGQgaW50ZXJlc3QgcmF0ZQogICAgLy8gICAgIG5vbWluYWxfYWNjcnVlZD1VSW50NjQoMCksCiAgICAvLyApCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDAwMDI0OTUwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvdXBvbi5weToxNS0yOAogICAgLy8gYXJjNC5lbWl0KAogICAgLy8gICAgIEV2ZW50KAogICAgLy8gICAgICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICAgICAgdHlwZT1hcmM0LlVJbnQ4KGVudW1zLkVWVF9UWVBFX0lQKSwKICAgIC8vICAgICAgICAgdHlwZV9uYW1lPVN0cmluZygiSVAiKSwKICAgIC8vICAgICAgICAgdGltZT1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICAgICAgcGF5b2ZmPXBheW9mZiwKICAgIC8vICAgICAgICAgY3VycmVuY3lfaWQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQuaWQsCiAgICAvLyAgICAgICAgIGN1cnJlbmN5X3VuaXQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQudW5pdF9uYW1lLAogICAgLy8gICAgICAgICBub21pbmFsX3ZhbHVlPXNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKiBzZWxmLnVuaXRfdmFsdWUsCiAgICAvLyAgICAgICAgIG5vbWluYWxfcmF0ZV9icHM9YXJjNC5VSW50MTYoMCksICAjIFRPRE86IEFkZCBpbnRlcmVzdCByYXRlCiAgICAvLyAgICAgICAgIG5vbWluYWxfYWNjcnVlZD1VSW50NjQoMCksCiAgICAvLyAgICAgKQogICAgLy8gKQogICAgcHVzaGJ5dGVzIDB4OGMyOTkwNGUgLy8gbWV0aG9kICJFdmVudCh1aW50NjQsdWludDgsc3RyaW5nLHVpbnQ2NCx1aW50NjQsdWludDY0LGJ5dGVbXSx1aW50NjQsdWludDE2LHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvdXBvbi5weTo3MAogICAgLy8gdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvdXBvbi5weTo2OC03MgogICAgLy8gcmV0dXJuIHR5cC5QYXltZW50UmVzdWx0KAogICAgLy8gICAgIGFtb3VudD1wYXltZW50X2Ftb3VudCwKICAgIC8vICAgICB0aW1lc3RhbXA9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgY29udGV4dD1wYXltZW50X2luZm8sICAjIFRPRE86IEFkZCBpbmZvIG9uIGZhaWxlZCBwYXltZW50CiAgICAvLyApCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyA0CiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgcHVzaGJ5dGVzIDB4MDAxMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb3Vwb24ucHk6MzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKcGF5X2NvdXBvbl9lbHNlX2JvZHlAMzoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb3Vwb24ucHk6NjMtNjQKICAgIC8vICMgQWNjb3VudHMgc3VzcGVuZGVkIG9yIG5vdCBvcHRlZCBpbiBhdCB0aGUgdGltZSBvZiBwYXltZW50cyBtdXN0IG5vdCBzdGFsbCB0aGUgRC1BU0EKICAgIC8vIHBheW1lbnRfYW1vdW50ID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDEKICAgIGIgcGF5X2NvdXBvbl9hZnRlcl9pZl9lbHNlQDQKCnBheV9jb3Vwb25fYm9vbF9mYWxzZUAyNzoKICAgIGludGNfMCAvLyAwCiAgICBiIHBheV9jb3Vwb25fYm9vbF9tZXJnZUAyOAoKcGF5X2NvdXBvbl9ib29sX2ZhbHNlQDIwOgogICAgaW50Y18wIC8vIDAKICAgIGIgcGF5X2NvdXBvbl9ib29sX21lcmdlQDIxCgoKLy8gbW9kdWxlcy50cmFuc2Zlcl9hZ2VudC5jb3Vwb24uQ291cG9uVHJhbnNmZXJBZ2VudE1peGluLmFzc2V0X3RyYW5zZmVyW3JvdXRpbmddKCkgLT4gdm9pZDoKYXNzZXRfdHJhbnNmZXI6CiAgICBpbnRjXzAgLy8gMAogICAgZHVwbiAyCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC9jb3Vwb24ucHk6OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gZW5tLlNUQVRVU19BQ1RJVkUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCAxMDAKICAgID09CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNTMtMTU4CiAgICAvLyBzZWxmLnN0YXR1c19pc19hY3RpdmUoKQogICAgLy8gYW5kIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIGFuZCAoCiAgICAvLyAgICAgbm90IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIC8vICAgICBvciBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIC8vICkKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VANgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTU0CiAgICAvLyBhbmQgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIDw9CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNTMtMTU4CiAgICAvLyBzZWxmLnN0YXR1c19pc19hY3RpdmUoKQogICAgLy8gYW5kIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIGFuZCAoCiAgICAvLyAgICAgbm90IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIC8vICAgICBvciBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIC8vICkKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VANgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTU2CiAgICAvLyBub3Qgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gInNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTU2LTE1NwogICAgLy8gbm90IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIC8vIG9yIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDwgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgYnogYXNzZXRfdHJhbnNmZXJfYm9vbF90cnVlQDUKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE1NwogICAgLy8gb3IgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICA8CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNTYtMTU3CiAgICAvLyBub3Qgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgLy8gb3IgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICBieiBhc3NldF90cmFuc2Zlcl9ib29sX2ZhbHNlQDYKCmFzc2V0X3RyYW5zZmVyX2Jvb2xfdHJ1ZUA1OgogICAgaW50Y18xIC8vIDEKCmFzc2V0X3RyYW5zZmVyX2Jvb2xfbWVyZ2VANzoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE1Mi0xNTkKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCkKICAgIC8vICAgICBhbmQgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIGFuZCAoCiAgICAvLyAgICAgICAgIG5vdCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICAvLyAgICAgICAgIG9yIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDwgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgLy8gICAgICkKICAgIC8vICksIGVyci5TRUNPTkRBUllfTUFSS0VUX0NMT1NFRAogICAgYXNzZXJ0IC8vIFNlY29uZGFyeSBtYXJrZXQgaXMgY2xvc2VkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNjktMTcxCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gZ3JhbnRzIHRyYW5zZmVyIHJpZ2h0IHRvIEQtQVNBIG93bmVycy4gT3RoZXIgaW1wbGVtZW50YXRpb25zIG1heSByZWxheSBvbiBvdGhlcgogICAgLy8gIyByb2xlcywgZXh0ZXJuYWwgQXBwcyB0aHJvdWdoIEMyQyBjYWxscyAoZS5nLiwgYW4gb3JkZXIgYm9vayksIG9yIG9mZi1jaGFpbiB0cmFuc2ZlciBhZ2VudHMuCiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBzZW5kZXJfaG9sZGluZ19hZGRyZXNzLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNzIKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTczCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozMQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgOQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGRpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDEwCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE3NgogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBkaWcgMwogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNzcKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBkaWcgMQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxOTAKICAgIC8vIGFzc2VydCBzZW5kZXJfaG9sZGluZ19hZGRyZXNzICE9IHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcywgZXJyLlNFTEZfVFJBTlNGRVIKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICAhPQogICAgYXNzZXJ0IC8vIFNlbmRlciBhbmQgcmVjZWl2ZXIgbXVzdCBiZSBkaWZmZXJlbnQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE5MQogICAgLy8gYXNzZXJ0IHVuaXRzID4gMCwgZXJyLk5VTExfVFJBTlNGRVIKICAgIGRpZyAyCiAgICBkdXAKICAgIGFzc2VydCAvLyBUcmFuc2ZlciB1bml0cyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxOTIKICAgIC8vIGFzc2VydCB1bml0cyA8PSBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMsIGVyci5PVkVSX1RSQU5TRkVSCiAgICB1bmNvdmVyIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBkdXAKICAgIGludGNfMiAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIHVuY292ZXIgMgogICAgPj0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgc2VuZGVyIHVuaXRzIHRvIHRyYW5zZmVyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NjMKICAgIC8vIHNlbmRlcl91bml0X3ZhbHVlID0gc2VsZi5hY2NvdW50W3NlbmRlcl0udW5pdF92YWx1ZQogICAgZXh0cmFjdCA0MCA4CiAgICBidXJ5IDkKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo2NAogICAgLy8gaWYgc2VsZi5hY2NvdW50W3JlY2VpdmVyXS51bml0cyA+IFVJbnQ2NCgwKToKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzIgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBieiBhc3NldF90cmFuc2Zlcl9lbHNlX2JvZHlAOQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjU4CiAgICAvLyBzZWxmLmFjY291bnRbc2VuZGVyXS51bml0X3ZhbHVlID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0udW5pdF92YWx1ZQogICAgZGlnIDYKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDYKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo1OC01OQogICAgLy8gc2VsZi5hY2NvdW50W3NlbmRlcl0udW5pdF92YWx1ZSA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnVuaXRfdmFsdWUKICAgIC8vIGFuZCBzZWxmLmFjY291bnRbc2VuZGVyXS5wYWlkX2NvdXBvbnMgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS5wYWlkX2NvdXBvbnMKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VAMjAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo1OQogICAgLy8gYW5kIHNlbGYuYWNjb3VudFtzZW5kZXJdLnBhaWRfY291cG9ucyA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnBhaWRfY291cG9ucwogICAgZGlnIDYKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQ4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDYKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQ4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo1OC01OQogICAgLy8gc2VsZi5hY2NvdW50W3NlbmRlcl0udW5pdF92YWx1ZSA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnVuaXRfdmFsdWUKICAgIC8vIGFuZCBzZWxmLmFjY291bnRbc2VuZGVyXS5wYWlkX2NvdXBvbnMgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS5wYWlkX2NvdXBvbnMKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VAMjAKICAgIGludGNfMSAvLyAxCgphc3NldF90cmFuc2Zlcl9ib29sX21lcmdlQDIxOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjU3LTYwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtzZW5kZXJdLnVuaXRfdmFsdWUgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS51bml0X3ZhbHVlCiAgICAvLyAgICAgYW5kIHNlbGYuYWNjb3VudFtzZW5kZXJdLnBhaWRfY291cG9ucyA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnBhaWRfY291cG9ucwogICAgLy8gKSwgZXJyLk5PTl9GVU5HSUJMRV9VTklUUwogICAgYXNzZXJ0IC8vIFNlbmRlciBhbmQgcmVjZWl2ZXIgdW5pdHMgYXJlIG5vdCBmdW5naWJsZQoKYXNzZXRfdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQvY291cG9uLnB5OjQ2LTQ3CiAgICAvLyAjIFRyYW5zZmVycmVkIHVuaXRzIHZhbHVlIChtdXN0IGJlIGNvbXB1dGVkIGJlZm9yZSB0aGUgdHJhbnNmZXIpCiAgICAvLyBzZW5kZXJfdW5pdF92YWx1ZSA9IHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlCiAgICBkaWcgNgogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCA0MAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgNQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NjktNzAKICAgIC8vICMgVHJhbnNmZXIgaXMgZm9yYmlkZGVuIGluIGNhc2Ugb2YgcGVuZGluZyBjb3Vwb24gcGF5bWVudHMKICAgIC8vIGR1ZV9jb3Vwb25zID0gc2VsZi5jb3VudF9kdWVfY291cG9ucygpCiAgICBjYWxsc3ViIGNvdW50X2R1ZV9jb3Vwb25zCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo3MQogICAgLy8gc2VsZi5hc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudChzZW5kZXJfaG9sZGluZ19hZGRyZXNzLCBkdWVfY291cG9ucykKICAgIGRpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGRpZyAxCiAgICBjYWxsc3ViIGFzc2VydF9ub19wZW5kaW5nX2NvdXBvbl9wYXltZW50CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo3MgogICAgLy8gcmV0dXJuIHNlbGYuYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQoc2VuZGVyX2hvbGRpbmdfYWRkcmVzcywgdW5pdHMsIGR1ZV9jb3Vwb25zKQogICAgc3dhcAogICAgZGlnIDMKICAgIGR1cAogICAgY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIGFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50CiAgICBidXJ5IDcKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3MQogICAgLy8gYXNzZXJ0IHVuaXRzIDw9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLCBlcnIuT1ZFUl9UUkFOU0ZFUgogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzIgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAyCiAgICA8PQogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCBzZW5kZXIgdW5pdHMgdG8gdHJhbnNmZXIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3MgogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMgLT0gdW5pdHMKICAgIHN3YXAKICAgIC0KICAgIGl0b2IKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gMzIKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo1MgogICAgLy8gaWYgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPT0gVUludDY0KDApOgogICAgYm94X2dldAogICAgcG9wCiAgICBpbnRjXzIgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBibnogYXNzZXRfdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAxNgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjUzCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgaXRvYgogICAgZGlnIDcKICAgIGR1cAogICAgY292ZXIgMgogICAgcHVzaGludCA0MAogICAgZGlnIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NTQKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucyA9IFVJbnQ2NCgwKQogICAgcHVzaGludCA0OAogICAgc3dhcAogICAgYm94X3JlcGxhY2UKCmFzc2V0X3RyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMTY6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzYKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzICs9IHVuaXRzCiAgICBkaWcgNQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgaW50Y18yIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgKwogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBpbnRjXzIgLy8gMzIKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQvY291cG9uLnB5OjUzCiAgICAvLyByZXR1cm4gdW5pdHMgKiBzZW5kZXJfdW5pdF92YWx1ZSArIGFjY3J1ZWRfaW50ZXJlc3QKICAgIGRpZyA0CiAgICAqCiAgICBkaWcgNQogICAgKwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC9jb3Vwb24ucHk6OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgphc3NldF90cmFuc2Zlcl9ib29sX2ZhbHNlQDIwOgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXRfdHJhbnNmZXJfYm9vbF9tZXJnZUAyMQoKYXNzZXRfdHJhbnNmZXJfZWxzZV9ib2R5QDk6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NjcKICAgIC8vIHNlbGYuYWNjb3VudFtyZWNlaXZlcl0udW5pdF92YWx1ZSA9IHNlbmRlcl91bml0X3ZhbHVlCiAgICBkaWcgNQogICAgZHVwCiAgICBwdXNoaW50IDQwCiAgICBkaWcgMTAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NjgKICAgIC8vIHNlbGYuYWNjb3VudFtyZWNlaXZlcl0ucGFpZF9jb3Vwb25zID0gc2VsZi5hY2NvdW50W3NlbmRlcl0ucGFpZF9jb3Vwb25zCiAgICBkaWcgNwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDggOAogICAgcHVzaGludCA0OAogICAgc3dhcAogICAgYm94X3JlcGxhY2UKICAgIGIgYXNzZXRfdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAxMAoKYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUA2OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXRfdHJhbnNmZXJfYm9vbF9tZXJnZUA3CgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb21tb24uQ29yZUZpbmFuY2lhbENvbW1vbk1peGluLmFzc2V0X2NyZWF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFzc2V0X2NyZWF0ZToKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI2NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBkaWcgMQogICAgcHVzaGludCAzOAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgdHVwbGUgZW5jb2RpbmcKICAgIGR1cAogICAgcHVzaGludCA0MAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHRhaWwgcG9pbnRlciBhdCBpbmRleCA3IG9mICh1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OFszMl0sKGxlbit1dGY4W10pKQogICAgZGlnIDIKICAgIHN3YXAKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCA0MgogICAgKwogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5Bc3NldE1ldGFkYXRhCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyNzYKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSBhcnJhbmdlcgogICAgYnl0ZWMgNiAvLyAweDUyMzIzMDIzCiAgICB1bmNvdmVyIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyNzcKICAgIC8vIHNlbGYubWV0YWRhdGEgPSBtZXRhZGF0YS5ieXRlcwogICAgYnl0ZWMgMjUgLy8gIm1ldGFkYXRhIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI2NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb21tb24uQ29yZUZpbmFuY2lhbENvbW1vbk1peGluLmFzc2V0X3VwZGF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFzc2V0X3VwZGF0ZToKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI3OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGRpZyAxCiAgICBwdXNoaW50IDM4CiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCB0dXBsZSBlbmNvZGluZwogICAgZHVwCiAgICBwdXNoaW50IDQwCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgdGFpbCBwb2ludGVyIGF0IGluZGV4IDcgb2YgKHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4WzMyXSwobGVuK3V0ZjhbXSkpCiAgICBkaWcgMgogICAgc3dhcAogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDQyCiAgICArCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLkFzc2V0TWV0YWRhdGEKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI4NC0yODcKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBncmFudHMgdGhlIHVwZGF0ZSBwZXJtaXNzaW9ucyB0byB0aGUgQXJyYW5nZXIuCiAgICAvLyAjIE90aGVyIGltcGxlbWVudGF0aW9ucyBtYXkgZGlzYWJsZSBELUFTQSBhcHBsaWNhdGlvbiB1cGRhdGFiaWxpdHkgb3IgY2hhbmdlIGl0cyBhdXRob3JpemF0aW9ucy4KICAgIC8vICMg4pqg77iPIFdBUk5JTkc6IEFwcGxpY2F0aW9uIHVwZGF0ZXMgbXVzdCBiZSBleGVjdXRlZCBWRVJZIGNhcmVmdWxseSwgYXMgdGhleSBtaWdodCBpbnRyb2R1Y2UgYnJlYWtpbmcgY2hhbmdlcy4KICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI4OAogICAgLy8gc2VsZi5tZXRhZGF0YSA9IG1ldGFkYXRhLmJ5dGVzCiAgICBieXRlYyAyNSAvLyAibWV0YWRhdGEiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6Mjc5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb21tb24uQ29yZUZpbmFuY2lhbENvbW1vbk1peGluLnNldF9zZWNvbmRhcnlfdGltZV9ldmVudHNbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzOgogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI5MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIHVuY292ZXIgMgogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8dWludDY0PgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzExCiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjgKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBlbm0uU1RBVFVTX0VOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGludGMgNSAvLyAyMDAKICAgID09CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMTIKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5zdGF0dXNfaXNfZW5kZWQoKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgIQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMTMKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzE1CiAgICAvLyBhc3NlcnQgc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50cy5sZW5ndGggPj0gMSwgZXJyLklOVkFMSURfVElNRV9FVkVOVFNfTEVOR1RICiAgICBkdXAKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBsZW5ndGggaXMgaW52YWxpZAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzE2CiAgICAvLyBpZiBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzLmxlbmd0aCA+IDE6CiAgICBpbnRjXzEgLy8gMQogICAgPgogICAgYnogc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50c19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMxNwogICAgLy8gc2VsZi5hc3NlcnRfdGltZV9ldmVudHNfc29ydGVkKHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHMpCiAgICBkdXAKICAgIGNhbGxzdWIgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZAogICAgYnVyeSAxCgpzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMyMAogICAgLy8gc2VsZi5pc3N1YW5jZV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pc3N1YW5jZV9kYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzIxCiAgICAvLyA8PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzW2NmZy5TRUNPTkRBUllfTUFSS0VUX09QRU5JTkdfREFURV9JRFhdCiAgICBkaWcgMQogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgYnVyeSA0CiAgICBwdXNoaW50IDIKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMjAtMzIxCiAgICAvLyBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIC8vIDw9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbY2ZnLlNFQ09OREFSWV9NQVJLRVRfT1BFTklOR19EQVRFX0lEWF0KICAgIHN3YXAKICAgIGRpZyAxCiAgICA8PQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzE5LTMyMgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIC8vICAgICA8PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzW2NmZy5TRUNPTkRBUllfTUFSS0VUX09QRU5JTkdfREFURV9JRFhdCiAgICAvLyApLCBlcnIuSU5WQUxJRF9TRUNPTkRBUllfT1BFTklOR19EQVRFCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzZWNvbmRhcnkgbWFya2V0IG9wZW5pbmcgZGF0ZQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzIzCiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlID0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIGJ5dGVjIDE2IC8vICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMyMy0zMjUKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgPSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX09QRU5JTkdfREFURV9JRFgKICAgIC8vIF0KICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMjYKICAgIC8vIGlmIHNlbGYubWF0dXJpdHlfZGF0ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgYnogc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50c19hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMyOAogICAgLy8gc2VsZi5tYXR1cml0eV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMyOQogICAgLy8gPj0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1tjZmcuU0VDT05EQVJZX01BUktFVF9DTE9TVVJFX0RBVEVfSURYXQogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGRpZyAzCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzI4LTMyOQogICAgLy8gc2VsZi5tYXR1cml0eV9kYXRlCiAgICAvLyA+PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzW2NmZy5TRUNPTkRBUllfTUFSS0VUX0NMT1NVUkVfREFURV9JRFhdCiAgICBzd2FwCiAgICBkaWcgMQogICAgPj0KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMyNy0zMzAKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5tYXR1cml0eV9kYXRlCiAgICAvLyAgICAgPj0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1tjZmcuU0VDT05EQVJZX01BUktFVF9DTE9TVVJFX0RBVEVfSURYXQogICAgLy8gKSwgZXJyLklOVkFMSURfU0VDT05EQVJZX0NMT1NVUkVfREFURQogICAgYXNzZXJ0IC8vIEludmFsaWQgc2Vjb25kYXJ5IG1hcmtldCBjbG9zdXJlIGRhdGUKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMzMQogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSA9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICBieXRlYyA5IC8vICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMzMS0zMzMKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUgPSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX0NMT1NVUkVfREFURV9JRFgKICAgIC8vIF0KICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMzNQogICAgLy8gc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGU9c2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMzYKICAgIC8vIHNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlPXNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMzQtMzM3CiAgICAvLyByZXR1cm4gdHlwLlNlY29uZGFyeU1hcmtldFNjaGVkdWxlKAogICAgLy8gICAgIHNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlPXNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUsCiAgICAvLyAgICAgc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGU9c2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSwKICAgIC8vICkKICAgIHN3YXAKICAgIGl0b2IKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MjkwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmNvcmVfZmluYW5jaWFsLmNvbW1vbi5Db3JlRmluYW5jaWFsQ29tbW9uTWl4aW4uc2V0X2RlZmF1bHRfc3RhdHVzW3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X2RlZmF1bHRfc3RhdHVzOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzM5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzQKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnRydXN0ZWUsIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAxOSAvLyAweDUyMzYzMDIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozNTIKICAgIC8vIHNlbGYuYXNzZXRfZGVmYXVsdGVkID0gZGVmYXVsdGVkCiAgICBieXRlYyAyMyAvLyAiYXNzZXRfZGVmYXVsdGVkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjM1MwogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY29tbW9uLkNvcmVGaW5hbmNpYWxDb21tb25NaXhpbi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnByaW1hcnlfZGlzdHJpYnV0aW9uOgogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozNTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBlbm0uU1RBVFVTX0FDVElWRQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDEwMAogICAgPT0KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE0NS0xNDgKICAgIC8vIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpCiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDUKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE0NgogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOCAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE0NwogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGR1cAogICAgYnVyeSA1CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNDYtMTQ3CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTQ2LTE0OAogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUA1CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNDgKICAgIC8vIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNyAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE0Ny0xNDgKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBkaWcgMwogICAgPgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTQ2LTE0OAogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUA1CiAgICBpbnRjXzEgLy8gMQoKcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9tZXJnZUA2OgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTQ0LTE0OQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnN0YXR1c19pc19hY3RpdmUoKQogICAgLy8gICAgIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgLy8gKSwgZXJyLlBSSU1BUllfRElTVFJJQlVUSU9OX0NMT1NFRAogICAgYXNzZXJ0IC8vIFByaW1hcnkgZGlzdHJpYnV0aW9uIGlzIGNsb3NlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjcxCiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5wcmltYXJ5X2RlYWxlciwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDIwIC8vIDB4NTIzNTMwMjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozMQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjM4MwogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozODQKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6Mzg1CiAgICAvLyBhc3NlcnQgdW5pdHMgPiAwLCBlcnIuWkVST19VTklUUwogICAgZGlnIDEKICAgIGR1cAogICAgYXNzZXJ0IC8vIENhbiBub3QgZGlzdHJpYnV0ZSB6ZXJvIHVuaXRzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozODYKICAgIC8vIGFzc2VydCBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICsgdW5pdHMgPD0gc2VsZi50b3RhbF91bml0cywgZXJyLk9WRVJfRElTVFJJQlVUSU9OCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBkaWcgMQogICAgKwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIGRpZyAxCiAgICA+PQogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCByZW1haW5pbmcgRC1BU0EgdW5pdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjM4OAogICAgLy8gc2VsZi5jaXJjdWxhdGluZ191bml0cyArPSB1bml0cwogICAgYnl0ZWMgNCAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjM4OQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMgKz0gdW5pdHMKICAgIGRpZyAyCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgaW50Y18yIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgdW5jb3ZlciAyCiAgICArCiAgICBpdG9iCiAgICBkaWcgMgogICAgaW50Y18yIC8vIDMyCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozOTAKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRfdmFsdWUgPSBzZWxmLnVuaXRfdmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJ1bml0X3ZhbHVlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnVuaXRfdmFsdWUgZXhpc3RzCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIHB1c2hpbnQgNDAKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjM5MQogICAgLy8gcmV0dXJuIHNlbGYudG90YWxfdW5pdHMgLSBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgc3dhcAogICAgLQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VANToKICAgIGludGNfMCAvLyAwCiAgICBiIHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfbWVyZ2VANgoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY29tbW9uLkNvcmVGaW5hbmNpYWxDb21tb25NaXhpbi5nZXRfYXNzZXRfaW5mb1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9hc3NldF9pbmZvOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDAzCiAgICAvLyBwZXJmb3JtYW5jZSA9IFVJbnQ2NChjc3QuUFJGX1BFUkZPUk1BTlQpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDA0CiAgICAvLyBpZiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+IHNlbGYubWF0dXJpdHlfZGF0ZSA+IDA6CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjb3ZlciAzCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgPgogICAgYnogZ2V0X2Fzc2V0X2luZm9fYWZ0ZXJfaWZfZWxzZUA0CiAgICBkdXAKICAgIGJ6IGdldF9hc3NldF9pbmZvX2FmdGVyX2lmX2Vsc2VANAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDA1CiAgICAvLyBwZXJmb3JtYW5jZSA9IFVJbnQ2NChjc3QuUFJGX01BVFVSRUQpCiAgICBwdXNoaW50IDQKICAgIGJ1cnkgMgoKZ2V0X2Fzc2V0X2luZm9fYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDA2LTQwNwogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBubyBncmFjZSBvciBkZWxpbnF1ZW5jeSBwZXJpb2RzCiAgICAvLyBpZiBzZWxmLmFzc2V0X2RlZmF1bHRlZDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMyAvLyAiYXNzZXRfZGVmYXVsdGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2RlZmF1bHRlZCBleGlzdHMKICAgIGJ6IGdldF9hc3NldF9pbmZvX2FmdGVyX2lmX2Vsc2VANgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDA4CiAgICAvLyBwZXJmb3JtYW5jZSA9IFVJbnQ2NChjc3QuUFJGX0RFRkFVTFRFRCkKICAgIHB1c2hpbnQgMwogICAgYnVyeSAyCgpnZXRfYXNzZXRfaW5mb19hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MTEKICAgIC8vIGRlbm9taW5hdGlvbl9hc3NldF9pZD1zZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZC5pZCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNCAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQxMgogICAgLy8gc2V0dGxlbWVudF9hc3NldF9pZD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuaWQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTQgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo0NQogICAgLy8gcmV0dXJuIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKiBzZWxmLnVuaXRfdmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJ1bml0X3ZhbHVlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnVuaXRfdmFsdWUgZXhpc3RzCiAgICBkdXAyCiAgICAqCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MTUKICAgIC8vIGRheV9jb3VudF9jb252ZW50aW9uPWFyYzQuVUludDgoc2VsZi5kYXlfY291bnRfY29udmVudGlvbiksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uIGV4aXN0cwogICAgaXRvYgogICAgZHVwCiAgICBiaXRsZW4KICAgIGludGNfMyAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBleHRyYWN0IDcgMQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDE2CiAgICAvLyBwcmluY2lwYWxfZGlzY291bnQ9YXJjNC5VSW50MTYoc2VsZi5wcmluY2lwYWxfZGlzY291bnQpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI2IC8vICJwcmluY2lwYWxfZGlzY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50IGV4aXN0cwogICAgaXRvYgogICAgZHVwCiAgICBiaXRsZW4KICAgIHB1c2hpbnQgMTYKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGV4dHJhY3QgNiAyCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MTcKICAgIC8vIGludGVyZXN0X3JhdGU9YXJjNC5VSW50MTYoc2VsZi5pbnRlcmVzdF9yYXRlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJpbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X3JhdGUgZXhpc3RzCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgcHVzaGludCAxNgogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA2IDIKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQxOAogICAgLy8gdG90YWxfc3VwcGx5PXNlbGYudG90YWxfdW5pdHMsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDIwCiAgICAvLyBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGU9c2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOCAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQyMQogICAgLy8gcHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlPXNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI3IC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDIyCiAgICAvLyBpc3N1YW5jZV9kYXRlPXNlbGYuaXNzdWFuY2VfZGF0ZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJpc3N1YW5jZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzc3VhbmNlX2RhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MjMKICAgIC8vIG1hdHVyaXR5X2RhdGU9c2VsZi5tYXR1cml0eV9kYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJtYXR1cml0eV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hdHVyaXR5X2RhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MjQKICAgIC8vIHN1c3BlbmRlZD1zZWxmLmFzc2V0X3N1c3BlbmRlZCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMiAvLyAiYXNzZXRfc3VzcGVuZGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X3N1c3BlbmRlZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQyNQogICAgLy8gcGVyZm9ybWFuY2U9YXJjNC5VSW50OChwZXJmb3JtYW5jZSksCiAgICBkaWcgMTUKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzMgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQxMC00MjYKICAgIC8vIHJldHVybiB0eXAuQXNzZXRJbmZvKAogICAgLy8gICAgIGRlbm9taW5hdGlvbl9hc3NldF9pZD1zZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZC5pZCwKICAgIC8vICAgICBzZXR0bGVtZW50X2Fzc2V0X2lkPXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5pZCwKICAgIC8vICAgICBvdXRzdGFuZGluZ19wcmluY2lwYWw9c2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwoKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPXNlbGYudW5pdF92YWx1ZSwKICAgIC8vICAgICBkYXlfY291bnRfY29udmVudGlvbj1hcmM0LlVJbnQ4KHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24pLAogICAgLy8gICAgIHByaW5jaXBhbF9kaXNjb3VudD1hcmM0LlVJbnQxNihzZWxmLnByaW5jaXBhbF9kaXNjb3VudCksCiAgICAvLyAgICAgaW50ZXJlc3RfcmF0ZT1hcmM0LlVJbnQxNihzZWxmLmludGVyZXN0X3JhdGUpLAogICAgLy8gICAgIHRvdGFsX3N1cHBseT1zZWxmLnRvdGFsX3VuaXRzLAogICAgLy8gICAgIGNpcmN1bGF0aW5nX3N1cHBseT1zZWxmLmNpcmN1bGF0aW5nX3VuaXRzLAogICAgLy8gICAgIHByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZT1zZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSwKICAgIC8vICAgICBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGU9c2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUsCiAgICAvLyAgICAgaXNzdWFuY2VfZGF0ZT1zZWxmLmlzc3VhbmNlX2RhdGUsCiAgICAvLyAgICAgbWF0dXJpdHlfZGF0ZT1zZWxmLm1hdHVyaXR5X2RhdGUsCiAgICAvLyAgICAgc3VzcGVuZGVkPXNlbGYuYXNzZXRfc3VzcGVuZGVkLAogICAgLy8gICAgIHBlcmZvcm1hbmNlPWFyYzQuVUludDgocGVyZm9ybWFuY2UpLAogICAgLy8gKQogICAgdW5jb3ZlciAxNAogICAgaXRvYgogICAgdW5jb3ZlciAxNAogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDExCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTEKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMAogICAgY29uY2F0CiAgICB1bmNvdmVyIDkKICAgIGNvbmNhdAogICAgdW5jb3ZlciA4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDcKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGJ5dGVjIDMwIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDQKICAgIHNldGJpdAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjM5MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb21tb24uQ29yZUZpbmFuY2lhbENvbW1vbk1peGluLmdldF90aW1lX2V2ZW50c1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF90aW1lX2V2ZW50czoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQzNgogICAgLy8gdGltZV9ldmVudHMgPSB0eXAuVGltZUV2ZW50cygpCiAgICBieXRlYyAzMyAvLyAweDAwMDAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGVubS5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgMTAwCiAgICA9PQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDM3CiAgICAvLyBpZiBzZWxmLnN0YXR1c19pc19hY3RpdmUoKToKICAgIGJ6IGdldF90aW1lX2V2ZW50c19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQzOAogICAgLy8gdGltZV9ldmVudHMgPSBzZWxmLnRpbWVfZXZlbnRzLnZhbHVlLmNvcHkoKQogICAgYnl0ZWMgMzIgLy8gMHg3NDY5NmQ2NTQ1NzY2NTZlNzQ3MwogICAgYm94X2dldAogICAgc3dhcAogICAgYnVyeSAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50aW1lX2V2ZW50cyBleGlzdHMKCmdldF90aW1lX2V2ZW50c19hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmNvcmVfZmluYW5jaWFsLmNvbW1vbi5Db3JlRmluYW5jaWFsQ29tbW9uTWl4aW4uZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGVbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZToKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQ1MAogICAgLy8gKHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUsIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gInNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDQ5LTQ1MQogICAgLy8gcmV0dXJuIHR5cC5UaW1lRXZlbnRzKAogICAgLy8gICAgIChzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlLCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlKQogICAgLy8gKQogICAgc3dhcAogICAgaXRvYgogICAgcHVzaGJ5dGVzIDB4MDAwMgogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQ0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb21tb24uQ29yZUZpbmFuY2lhbENvbW1vbk1peGluLmdldF9hc3NldF9tZXRhZGF0YVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9hc3NldF9tZXRhZGF0YToKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQ2MgogICAgLy8gcmV0dXJuIHR5cC5Bc3NldE1ldGFkYXRhLmZyb21fYnl0ZXMoc2VsZi5tZXRhZGF0YSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNSAvLyAibWV0YWRhdGEiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWV0YWRhdGEgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0NTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfZ292X3N1c3BlbnNpb25bcm91dGluZ10oKSAtPiB2b2lkOgphY2NvdW50X2dvdl9zdXNwZW5zaW9uOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojk0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo3NwogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYXV0aG9yaXR5LCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMTEgLy8gMHg1MjM3MzAyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjMxCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTQKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZCA9IHN1c3BlbmRlZAogICAgZHVwCiAgICBwdXNoaW50IDU2CiAgICBpbnRjXzEgLy8gMQogICAgYm94X2V4dHJhY3QKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgcHVzaGludCA1NgogICAgc3dhcAogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTUKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojk0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5hY2NvdW50X29wZW5bcm91dGluZ10oKSAtPiB2b2lkOgphY2NvdW50X29wZW46CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjgKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmFjY291bnRfbWFuYWdlciwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDEyIC8vIDB4NTIzNDMwMjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyOAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGVubS5TVEFUVVNfRU5ERUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgaW50YyA1IC8vIDIwMAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzkKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5zdGF0dXNfaXNfZW5kZWQoKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgIQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTQwCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNDEKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE0MgogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBub3QgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE0NgogICAgLy8gdW5pdHM9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNDQtMTUwCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHR5cC5BY2NvdW50SW5mbygKICAgIC8vICAgICBwYXltZW50X2FkZHJlc3M9cGF5bWVudF9hZGRyZXNzLAogICAgLy8gICAgIHVuaXRzPVVJbnQ2NCgwKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBwYWlkX2NvdXBvbnM9VUludDY0KDApLAogICAgLy8gICAgIHN1c3BlbmRlZD1GYWxzZSwKICAgIC8vICkKICAgIGl0b2IKICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlYyAzMCAvLyAweDAwCiAgICBjb25jYXQKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNTEKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF9jbG9zZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfY2xvc2U6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTUzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjY4CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hY2NvdW50X21hbmFnZXIsIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAxMiAvLyAweDUyMzQzMDIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTcxCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozMQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE3NAogICAgLy8gY2xvc2VkX3VuaXRzID0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMKICAgIGR1cAogICAgYm94X2dldAogICAgcG9wCiAgICBpbnRjXzIgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE3NQogICAgLy8gZGVsIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNzYKICAgIC8vIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgLT0gY2xvc2VkX3VuaXRzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBzd2FwCiAgICAtCiAgICBieXRlYyA0IC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjQ4CiAgICAvLyBpZiBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzID09IFVJbnQ2NCgwKToKICAgIGJueiBhY2NvdW50X2Nsb3NlX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjQ5CiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbm0uU1RBVFVTX0VOREVEKQogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgaW50YyA1IC8vIDIwMAogICAgYXBwX2dsb2JhbF9wdXQKCmFjY291bnRfY2xvc2VfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE3OAogICAgLy8gcmV0dXJuIGNsb3NlZF91bml0cywgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgZGlnIDEKICAgIGl0b2IKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzczoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMDAKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcywgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgZGlnIDIKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMDEKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIwMgogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIwNAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzID0gcGF5bWVudF9hZGRyZXNzCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIwNQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5hY2NvdW50X2dldF9pbmZvW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF9nZXRfaW5mbzoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMjIKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjA3CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3JvdGF0ZV9hcnJhbmdlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfcm90YXRlX2FycmFuZ2VyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTgKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTkKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSBuZXdfYXJyYW5nZXIKICAgIGJ5dGVjIDYgLy8gMHg1MjMyMzAyMwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNjAKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19zZXRfb3BfZGFlbW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19zZXRfb3BfZGFlbW9uOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzMKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzQKICAgIC8vIHNlbGYub3BfZGFlbW9uLnZhbHVlID0gYWRkcmVzcwogICAgYnl0ZWMgMjEgLy8gMHg1MjMyMzUyMwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzUKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19hc3NpZ25fcm9sZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfYXNzaWduX3JvbGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTc3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxOTkKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDAKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwMQogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDEKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKToKICAgIHB1c2hpbnQgMjAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwMgogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgNiAvLyAweDUyMzIzMDIzCiAgICBkaWcgMwogICAgYXBwX2dsb2JhbF9wdXQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fdXBzZXJ0X3JvbGVAMTQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAzCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA1CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDQwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDYKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDEyIC8vIDB4NTIzNDMwMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwNwogICAgLy8gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDIKICAgIC8vIHNlbGYuX3Vwc2VydF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgY29uZmlnKQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3Vwc2VydF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDkKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKToKICAgIGR1cAogICAgcHVzaGludCA1MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTEwCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIwIC8vIDB4NTIzNTMwMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMQogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcyhjb25maWcpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwMgogICAgLy8gc2VsZi5fdXBzZXJ0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCBjb25maWcpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fdXBzZXJ0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMwogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNjAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNAogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDE5IC8vIDB4NTIzNjMwMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNQogICAgLy8gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZykKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAyCiAgICAvLyBzZWxmLl91cHNlcnRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIGNvbmZpZykKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl91cHNlcnRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE3CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE4CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAxMSAvLyAweDUyMzczMDIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTkKICAgIC8vIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZykKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAyCiAgICAvLyBzZWxmLl91cHNlcnRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIGNvbmZpZykKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl91cHNlcnRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMQogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKToKICAgIGR1cAogICAgcHVzaGludCA4MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fdXBzZXJ0X3JvbGVAMTQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjIKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuaW50ZXJlc3Rfb3JhY2xlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDE4IC8vIDB4NTIzODMwMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMwogICAgLy8gc2VsZi5pbnRlcmVzdF9vcmFjbGVbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl91cHNlcnRfcm9sZUAxNAoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfcmV2b2tlX3JvbGVbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3Jldm9rZV9yb2xlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNAogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNQogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI2CiAgICAvLyBzZWxmLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpKQogICAgYnRvaQogICAgZHVwbiAyCiAgICBjYWxsc3ViIF9hc3NlcnRfdmFsaWRfcm9sZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyNgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgIT0gVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwgZXJyLklOVkFMSURfUk9MRQogICAgZHVwCiAgICBwdXNoaW50IDIwCiAgICAhPQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI3CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI4CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDEyIC8vIDB4NTIzNDMwMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyOQogICAgLy8gZGVsIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjgKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzEKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKToKICAgIGR1cAogICAgcHVzaGludCA1MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMyCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjAgLy8gMHg1MjM1MzAyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMzCiAgICAvLyBkZWwgc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjcKICAgIC8vIHNlbGYuX2RlbGV0ZV9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcykKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM1CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKToKICAgIGR1cAogICAgcHVzaGludCA2MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM2CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAxOSAvLyAweDUyMzYzMDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzcKICAgIC8vIGRlbCBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI3CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzOQogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKToKICAgIGR1cAogICAgcHVzaGludCA3MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQwCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDExIC8vIDB4NTIzNzMwMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MQogICAgLy8gZGVsIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNwogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDMKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSk6CiAgICBkdXAKICAgIHB1c2hpbnQgODAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ0CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuaW50ZXJlc3Rfb3JhY2xlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDE4IC8vIDB4NTIzODMwMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NQogICAgLy8gZGVsIHNlbGYuaW50ZXJlc3Rfb3JhY2xlW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nb3ZfYXNzZXRfc3VzcGVuc2lvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ292X2Fzc2V0X3N1c3BlbnNpb246CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QgICMgVE9ETzogVXBkYXRlIHNwZWNzIGFuZCBhZGQgdGVzdAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo3NwogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYXV0aG9yaXR5LCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMTEgLy8gMHg1MjM3MzAyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0NgogICAgLy8gc2VsZi5hc3NldF9zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGJ5dGVjIDIyIC8vICJhc3NldF9zdXNwZW5kZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0NwogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QgICMgVE9ETzogVXBkYXRlIHNwZWNzIGFuZCBhZGQgdGVzdAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X2FycmFuZ2VyW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU3CiAgICAvLyByZXR1cm4gc2VsZi5hcnJhbmdlci52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gMHg1MjMyMzAyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYWRkcmVzc19yb2xlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3MwogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hY2NvdW50X21hbmFnZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMTIgLy8gMHg1MjM0MzAyMwogICAgZGlnIDEKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjc0CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnByaW1hcnlfZGVhbGVyLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDIwIC8vIDB4NTIzNTMwMjMKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3NQogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi50cnVzdGVlLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDE5IC8vIDB4NTIzNjMwMjMKICAgIGRpZyAzCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3NgogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIGFkZHJlc3MpLAogICAgYnl0ZWMgMTEgLy8gMHg1MjM3MzAyMwogICAgZGlnIDQKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjc3CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmludGVyZXN0X29yYWNsZSwgYWRkcmVzcyksCiAgICBieXRlYyAxOCAvLyAweDUyMzgzMDIzCiAgICB1bmNvdmVyIDUKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjIDMwIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDYKICAgIHNldGJpdAogICAgaW50Y18xIC8vIDEKICAgIHVuY292ZXIgNQogICAgc2V0Yml0CiAgICBwdXNoaW50IDIKICAgIHVuY292ZXIgNAogICAgc2V0Yml0CiAgICBwdXNoaW50IDMKICAgIHVuY292ZXIgMwogICAgc2V0Yml0CiAgICBwdXNoaW50IDQKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV9jb25maWdbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9yb2xlX2NvbmZpZzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTQKICAgIC8vIHJvbGUgPSByb2xlX2lkLmFzX3VpbnQ2NCgpCiAgICBidG9pCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjk1CiAgICAvLyBzZWxmLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlKQogICAgZHVwCiAgICBjYWxsc3ViIF9hc3NlcnRfdmFsaWRfcm9sZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5NwogICAgLy8gY2FzZSBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpOgogICAgcHVzaGludHMgMjAgNDAgNTAgNjAgNzAgODAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTYtMzI3CiAgICAvLyBtYXRjaCByb2xlOgogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKToKICAgIC8vICAgICAgICAgcmV0dXJuIHR5cC5Sb2xlQ29uZmlnKAogICAgLy8gICAgICAgICAgICAgcm9sZV92YWxpZGl0eV9zdGFydD1VSW50NjQoMCksIHJvbGVfdmFsaWRpdHlfZW5kPVVJbnQ2NCgwKQogICAgLy8gICAgICAgICApCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5hdXRob3JpdHksIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLmludGVyZXN0X29yYWNsZSwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5pbnRlcmVzdF9vcmFjbGVbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgXzoKICAgIC8vICAgICAgICAgb3AuZXJyKGVyci5JTlZBTElEX1JPTEUpCiAgICB1bmNvdmVyIDYKICAgIG1hdGNoIHJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzBAMiByYmFjX2dldF9yb2xlX2NvbmZpZ19zd2l0Y2hfY2FzZV8xQDMgcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfMkA0IHJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzNANSByYmFjX2dldF9yb2xlX2NvbmZpZ19zd2l0Y2hfY2FzZV80QDYgcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfNUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI3CiAgICAvLyBvcC5lcnIoZXJyLklOVkFMSURfUk9MRSkKICAgIGVyciAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgoKcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfNUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMwogICAgLy8gc2VsZi5pbnRlcmVzdF9vcmFjbGUsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMTggLy8gMHg1MjM4MzAyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMi0zMjQKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLmludGVyZXN0X29yYWNsZSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI1CiAgICAvLyByZXR1cm4gc2VsZi5pbnRlcmVzdF9vcmFjbGVbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCgpyYmFjX2dldF9yb2xlX2NvbmZpZ19hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfY29uZmlnQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzRANjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTgKICAgIC8vIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDExIC8vIDB4NTIzNzMwMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5hdXRob3JpdHksIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMAogICAgLy8gcmV0dXJuIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfY29uZmlnX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV9jb25maWdAOQoKcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfM0A1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxMwogICAgLy8gc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDE5IC8vIDB4NTIzNjMwMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTItMzE0CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTUKICAgIC8vIHJldHVybiBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV9jb25maWdfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX2NvbmZpZ0A5CgpyYmFjX2dldF9yb2xlX2NvbmZpZ19zd2l0Y2hfY2FzZV8yQDQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA4CiAgICAvLyBzZWxmLnByaW1hcnlfZGVhbGVyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDIwIC8vIDB4NTIzNTMwMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDctMzA5CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEwCiAgICAvLyByZXR1cm4gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX2NvbmZpZ19hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfY29uZmlnQDkKCnJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzFAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDMKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDEyIC8vIDB4NTIzNDMwMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDItMzA0CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwNQogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfY29uZmlnX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV9jb25maWdAOQoKcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfMEAyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5OC0zMDAKICAgIC8vIHJldHVybiB0eXAuUm9sZUNvbmZpZygKICAgIC8vICAgICByb2xlX3ZhbGlkaXR5X3N0YXJ0PVVJbnQ2NCgwKSwgcm9sZV92YWxpZGl0eV9lbmQ9VUludDY0KDApCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfY29uZmlnX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV9jb25maWdAOQoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY291cG9uLlBlcnBldHVhbENvdXBvbkNhc2hmbG93TWl4aW4uY291bnRfZHVlX2NvdXBvbnMoKSAtPiB1aW50NjQ6CmNvdW50X2R1ZV9jb3Vwb25zOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MzUxCiAgICAvLyBkZWYgY291bnRfZHVlX2NvdXBvbnMoc2VsZikgLT4gVUludDY0OgogICAgcHJvdG8gMCAxCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTozNTIKICAgIC8vIGR1ZV9jb3Vwb25zID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MzUzCiAgICAvLyBjdXJyZW50X3RzID0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGR1cAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MzU0CiAgICAvLyBpZiBjdXJyZW50X3RzID4gc2VsZi5pc3N1YW5jZV9kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKICAgID4KICAgIGJ6IGNvdW50X2R1ZV9jb3Vwb25zX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MzU1CiAgICAvLyBkdWVfY291cG9ucyA9IChjdXJyZW50X3RzIC0gc2VsZi5pc3N1YW5jZV9kYXRlKSAvLyBzZWxmLmNvdXBvbl9wZXJpb2QKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJpc3N1YW5jZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzc3VhbmNlX2RhdGUgZXhpc3RzCiAgICBmcmFtZV9kaWcgMQogICAgc3dhcAogICAgLQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjb3Vwb25fcGVyaW9kIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvdXBvbl9wZXJpb2QgZXhpc3RzCiAgICAvCiAgICBmcmFtZV9idXJ5IDAKCmNvdW50X2R1ZV9jb3Vwb25zX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjM1Ni0zNTcKICAgIC8vICAgICAjIGRpdi1ieS16ZXJvOiBjb3Vwb25fcGVyaW9kICE9IDAgZHVlIHRvIGFzc2VydF90aW1lX3BlcmlvZHMgY2hlY2tzCiAgICAvLyByZXR1cm4gZHVlX2NvdXBvbnMKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY291cG9uLlBlcnBldHVhbENvdXBvbkNhc2hmbG93TWl4aW4uY291cG9uX2R1ZV9kYXRlKGNvdXBvbjogdWludDY0KSAtPiB1aW50NjQ6CmNvdXBvbl9kdWVfZGF0ZToKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjM1OQogICAgLy8gZGVmIGNvdXBvbl9kdWVfZGF0ZShzZWxmLCBjb3Vwb246IFVJbnQ2NCkgLT4gVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTozNjAKICAgIC8vIHJldHVybiBzZWxmLmlzc3VhbmNlX2RhdGUgKyBjb3Vwb24gKiBzZWxmLmNvdXBvbl9wZXJpb2QKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJpc3N1YW5jZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzc3VhbmNlX2RhdGUgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTcgLy8gImNvdXBvbl9wZXJpb2QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY291cG9uX3BlcmlvZCBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgKgogICAgKwogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb3Vwb24uUGVycGV0dWFsQ291cG9uQ2FzaGZsb3dNaXhpbi5kYXlfY291bnRfZmFjdG9yKGR1ZV9jb3Vwb25zOiB1aW50NjQpIC0+IGJ5dGVzOgpkYXlfY291bnRfZmFjdG9yOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6Mzc2CiAgICAvLyBkZWYgZGF5X2NvdW50X2ZhY3RvcihzZWxmLCBkdWVfY291cG9uczogVUludDY0KSAtPiB0eXAuRGF5Q291bnRGYWN0b3I6CiAgICBwcm90byAxIDEKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTozNzctMzc4CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgb25seSB0aGUgQWN0dWFsL0FjdHVhbCBhbmQgQ29udGludW91cyBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGlmIG5vdCBkdWVfY291cG9uczoKICAgIGZyYW1lX2RpZyAtMQogICAgYm56IGRheV9jb3VudF9mYWN0b3JfZWxzZV9ib2R5QDIKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjM3OQogICAgLy8gYWNjcnVpbmdfc3RhcnRfdGltZSA9IHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKCmRheV9jb3VudF9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MzgyCiAgICAvLyBjb3Vwb25fYWNjcnVlZF9wZXJpb2QgPSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCAtIGFjY3J1aW5nX3N0YXJ0X3RpbWUKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIHN3YXAKICAgIC0KICAgIGZyYW1lX2J1cnkgMAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MzgzCiAgICAvLyBjb3Vwb25fcGVyaW9kID0gc2VsZi5jb3Vwb25fcGVyaW9kCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTcgLy8gImNvdXBvbl9wZXJpb2QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY291cG9uX3BlcmlvZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjM4NAogICAgLy8gaWYgc2VsZi5kYXlfY291bnRfY29udmVudGlvbiA9PSBVSW50NjQoY3N0LkRDQ19BX0EpOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kYXlfY291bnRfY29udmVudGlvbiBleGlzdHMKICAgIGJueiBkYXlfY291bnRfZmFjdG9yX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTYyCiAgICAvLyByZXR1cm4gdGltZV9wZXJpb2QgLy8gVUludDY0KGNzdC5EQVlfMl9TRUMpCiAgICBmcmFtZV9kaWcgMAogICAgaW50YyA2IC8vIDg2NDAwCiAgICAvCiAgICBmcmFtZV9idXJ5IDAKICAgIGludGMgNiAvLyA4NjQwMAogICAgLwoKZGF5X2NvdW50X2ZhY3Rvcl9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTozODctMzkwCiAgICAvLyByZXR1cm4gdHlwLkRheUNvdW50RmFjdG9yKAogICAgLy8gICAgIG51bWVyYXRvcj1jb3Vwb25fYWNjcnVlZF9wZXJpb2QsCiAgICAvLyAgICAgZGVub21pbmF0b3I9Y291cG9uX3BlcmlvZCwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAwCiAgICBpdG9iCiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpkYXlfY291bnRfZmFjdG9yX2Vsc2VfYm9keUAyOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MzYzCiAgICAvLyBjb3Vwb25fZHVlX2RhdGUgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MzY0CiAgICAvLyBpZiBkdWVfY291cG9ucyA+PSBVSW50NjQoMSk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGJ6IGRheV9jb3VudF9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUA4CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTozNjUKICAgIC8vIGNvdXBvbl9kdWVfZGF0ZSA9IHNlbGYuY291cG9uX2R1ZV9kYXRlKGR1ZV9jb3Vwb25zKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGNvdXBvbl9kdWVfZGF0ZQogICAgZnJhbWVfYnVyeSAxCgpkYXlfY291bnRfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAODoKICAgIGZyYW1lX2RpZyAxCiAgICBiIGRheV9jb3VudF9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUAzCgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb3Vwb24uUGVycGV0dWFsQ291cG9uQ2FzaGZsb3dNaXhpbi5pc19hY2NydWluZ19pbnRlcmVzdChfZHVlX2NvdXBvbnM6IHVpbnQ2NCkgLT4gdWludDY0Ogppc19hY2NydWluZ19pbnRlcmVzdDoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjM5MgogICAgLy8gZGVmIGlzX2FjY3J1aW5nX2ludGVyZXN0KHNlbGYsIF9kdWVfY291cG9uczogVUludDY0KSAtPiBib29sOgogICAgcHJvdG8gMSAxCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTozOTMKICAgIC8vIHJldHVybiBzZWxmLmlzc3VhbmNlX2RhdGUgIT0gMCBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPiBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJpc3N1YW5jZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzc3VhbmNlX2RhdGUgZXhpc3RzCiAgICBieiBpc19hY2NydWluZ19pbnRlcmVzdF9ib29sX2ZhbHNlQDMKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJpc3N1YW5jZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzc3VhbmNlX2RhdGUgZXhpc3RzCiAgICA+CiAgICBieiBpc19hY2NydWluZ19pbnRlcmVzdF9ib29sX2ZhbHNlQDMKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCmlzX2FjY3J1aW5nX2ludGVyZXN0X2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTozOTMKICAgIC8vIHJldHVybiBzZWxmLmlzc3VhbmNlX2RhdGUgIT0gMCBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPiBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY291cG9uLlBlcnBldHVhbENvdXBvbkNhc2hmbG93TWl4aW4uYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQoaG9sZGluZ19hZGRyZXNzOiBieXRlcywgdW5pdHM6IHVpbnQ2NCwgZHVlX2NvdXBvbnM6IHVpbnQ2NCkgLT4gdWludDY0OgphY2NydWVkX2ludGVyZXN0X2Ftb3VudDoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjM5NS0zOTcKICAgIC8vIGRlZiBhY2NydWVkX2ludGVyZXN0X2Ftb3VudCgKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IEFjY291bnQsIHVuaXRzOiBVSW50NjQsIGR1ZV9jb3Vwb25zOiBVSW50NjQKICAgIC8vICkgLT4gVUludDY0OgogICAgcHJvdG8gMyAxCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTozOTgtMzk5CiAgICAvLyAjIFRoZSBmb2xsb3dpbmcgYXNzZXJ0IHNhZmVndWFyZHMgdGhlIHN1YnJvdXRpbmUgZnJvbSBmb3JiaWRkZW4gaW52b2NhdGlvbnMKICAgIC8vIHNlbGYuYXNzZXJ0X25vX3BlbmRpbmdfY291cG9uX3BheW1lbnQoaG9sZGluZ19hZGRyZXNzLCBkdWVfY291cG9ucykKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGFzc2VydF9ub19wZW5kaW5nX2NvdXBvbl9wYXltZW50CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0MDAKICAgIC8vIGRheV9jb3VudF9mYWN0b3IgPSBzZWxmLmRheV9jb3VudF9mYWN0b3IoZHVlX2NvdXBvbnMpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZGF5X2NvdW50X2ZhY3RvcgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NDAxCiAgICAvLyBjb3Vwb25fYWNjcnVlZF9wZXJpb2QgPSBkYXlfY291bnRfZmFjdG9yLm51bWVyYXRvcgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQwMgogICAgLy8gY291cG9uX3BlcmlvZCA9IGRheV9jb3VudF9mYWN0b3IuZGVub21pbmF0b3IKICAgIHN3YXAKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NDA0CiAgICAvLyBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIGFjY291bnRfdW5pdHNfdmFsdWUKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQwNQogICAgLy8gKiBzZWxmLmludGVyZXN0X3JhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJpbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0MDQtNDA1CiAgICAvLyBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIC8vICogc2VsZi5pbnRlcmVzdF9yYXRlCiAgICAqCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0MDQtNDA2CiAgICAvLyBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIC8vICogc2VsZi5pbnRlcmVzdF9yYXRlCiAgICAvLyAqIGNvdXBvbl9hY2NydWVkX3BlcmlvZAogICAgdW5jb3ZlciAyCiAgICAqCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0MDcKICAgIC8vIC8vIChjc3QuQlBTICogY291cG9uX3BlcmlvZCkKICAgIGludGMgNCAvLyAxMDAwMAogICAgdW5jb3ZlciAyCiAgICAqCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0MDQtNDA3CiAgICAvLyBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIC8vICogc2VsZi5pbnRlcmVzdF9yYXRlCiAgICAvLyAqIGNvdXBvbl9hY2NydWVkX3BlcmlvZAogICAgLy8gLy8gKGNzdC5CUFMgKiBjb3Vwb25fcGVyaW9kKQogICAgLwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NDAzLTQwOAogICAgLy8gcmV0dXJuICgKICAgIC8vICAgICBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIC8vICAgICAqIHNlbGYuaW50ZXJlc3RfcmF0ZQogICAgLy8gICAgICogY291cG9uX2FjY3J1ZWRfcGVyaW9kCiAgICAvLyAgICAgLy8gKGNzdC5CUFMgKiBjb3Vwb25fcGVyaW9kKQogICAgLy8gKSAgIyBkaXYtYnktemVybzogY291cG9uX3BlcmlvZCAhPSAwIGR1ZSB0byBhc3NlcnRfdGltZV9wZXJpb2RzIGNoZWNrcwogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb3Vwb24uQ291cG9uQ2FzaGZsb3dNaXhpbi5hbGxfZHVlX2NvdXBvbnNfcGFpZChkdWVfY291cG9uczogdWludDY0KSAtPiB1aW50NjQ6CmFsbF9kdWVfY291cG9uc19wYWlkOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MjYKICAgIC8vIGRlZiBhbGxfZHVlX2NvdXBvbnNfcGFpZChzZWxmLCBkdWVfY291cG9uczogVUludDY0KSAtPiBib29sOgogICAgcHJvdG8gMSAxCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToyNwogICAgLy8gcmV0dXJuIHNlbGYucGFpZF9jb3Vwb25fdW5pdHMgPj0gc2VsZi5jaXJjdWxhdGluZ191bml0cyAqIGR1ZV9jb3Vwb25zCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjggLy8gInBhaWRfY291cG9uX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnBhaWRfY291cG9uX3VuaXRzIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICAqCiAgICA+PQogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb3Vwb24uQ291cG9uQ2FzaGZsb3dNaXhpbi5hc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCBkdWVfY291cG9uczogdWludDY0KSAtPiB2b2lkOgphc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudDoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjI5LTMxCiAgICAvLyBkZWYgYXNzZXJ0X25vX3BlbmRpbmdfY291cG9uX3BheW1lbnQoCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50LCBkdWVfY291cG9uczogVUludDY0CiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjMzCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMgPT0gZHVlX2NvdXBvbnMKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQ4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfZGlnIC0xCiAgICA9PQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MzItMzQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGFpZF9jb3Vwb25zID09IGR1ZV9jb3Vwb25zCiAgICAvLyApLCBlcnIuUEVORElOR19DT1VQT05fUEFZTUVOVAogICAgYXNzZXJ0IC8vIFBlbmRpbmcgZHVlIGNvdXBvbiBwYXltZW50CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmNvcmVfZmluYW5jaWFsLmNvbW1vbi5Db3JlRmluYW5jaWFsQ29tbW9uTWl4aW4uYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZCh0aW1lX2V2ZW50czogYnl0ZXMpIC0+IGJ5dGVzOgphc3NlcnRfdGltZV9ldmVudHNfc29ydGVkOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTA3CiAgICAvLyBkZWYgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZChzZWxmLCB0aW1lX2V2ZW50czogdHlwLlRpbWVFdmVudHMpIC0+IE5vbmU6CiAgICBwcm90byAxIDEKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMDkKICAgIC8vIHRpbWVfZXZlbnRzW2NmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9PUEVOSU5HX0RBVEVfSURYXQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDIKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMTAKICAgIC8vID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjEwOS0xMTAKICAgIC8vIHRpbWVfZXZlbnRzW2NmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9PUEVOSU5HX0RBVEVfSURYXQogICAgLy8gPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgPgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTA4LTExMQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICB0aW1lX2V2ZW50c1tjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fT1BFTklOR19EQVRFX0lEWF0KICAgIC8vICAgICA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyApLCBlcnIuSU5WQUxJRF9USU1FCiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbXVzdCBiZSBzZXQgaW4gdGhlIGZ1dHVyZQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTEyCiAgICAvLyBmb3IgaWR4IGluIHVyYW5nZSh0aW1lX2V2ZW50cy5sZW5ndGggLSAxKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBpbnRjXzAgLy8gMAoKYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9mb3JfaGVhZGVyQDE6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMTIKICAgIC8vIGZvciBpZHggaW4gdXJhbmdlKHRpbWVfZXZlbnRzLmxlbmd0aCAtIDEpOgogICAgZnJhbWVfZGlnIDUKICAgIGZyYW1lX2RpZyA0CiAgICA8CiAgICBieiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2FmdGVyX2ZvckA2Cgphc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX3doaWxlX3RvcEA4OgogICAgcHVzaGludCA3NQogICAgZ2xvYmFsIE9wY29kZUJ1ZGdldAogICAgPgogICAgYnogYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9hZnRlcl93aGlsZUAxMwogICAgaXR4bl9iZWdpbgogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGJ5dGVjIDM0IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbQogICAgYnl0ZWMgMzQgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KICAgIGdsb2JhbCBNaW5UeG5GZWUKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgYiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX3doaWxlX3RvcEA4Cgphc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2FmdGVyX3doaWxlQDEzOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTE3CiAgICAvLyB0aW1lX2kgPSB0aW1lX2V2ZW50c1tpZHhdCiAgICBmcmFtZV9kaWcgNQogICAgZHVwCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgY292ZXIgMwogICAgc3dhcAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMwogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMTgKICAgIC8vIHRpbWVfZiA9IHRpbWVfZXZlbnRzW2lkeCArIDFdCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjExOQogICAgLy8gYXNzZXJ0IHRpbWVfZiA+IHRpbWVfaSwgZXJyLklOVkFMSURfU09SVElORwogICAgPAogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIG11c3QgYmUgc29ydGVkIGluIHN0cmljdGx5IGFzY2VuZGluZyBvcmRlcgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTIwCiAgICAvLyBpZiBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uICE9IFVJbnQ2NChjc3QuRENDX0NPTlQpOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kYXlfY291bnRfY29udmVudGlvbiBleGlzdHMKICAgIHB1c2hpbnQgMjU1CiAgICAhPQogICAgYnogYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9hZnRlcl9pZl9lbHNlQDQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjEyMS0xMjIKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiByZXF1aXJlcyB0aW1lIHBlcmlvZHMgZXhwcmVzc2VkIGluIGRheXMgZm9yIHJlZ3VsYXIgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgKHRpbWVfZiAtIHRpbWVfaSkgJSBVSW50NjQoCiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIDEKICAgIC0KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjEyMS0xMjQKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiByZXF1aXJlcyB0aW1lIHBlcmlvZHMgZXhwcmVzc2VkIGluIGRheXMgZm9yIHJlZ3VsYXIgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgKHRpbWVfZiAtIHRpbWVfaSkgJSBVSW50NjQoCiAgICAvLyAgICAgY3N0LkRBWV8yX1NFQwogICAgLy8gKSA9PSAwLCBlcnIuSU5WQUxJRF9USU1FX1BFUklPRAogICAgaW50YyA2IC8vIDg2NDAwCiAgICAlCiAgICAhCiAgICBhc3NlcnQgLy8gVGltZSBwZXJpb2RzIGluIEFjdHVhbC9BY3R1YWwgZGF5IGNvdW50IGNvbnZlbnRpb24gbXVzdCBiZSBtdWx0aXBsZXMgb2YgYSBkYXkgKGluIHNlY29uZHMpCgphc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2FmdGVyX2lmX2Vsc2VANDoKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9idXJ5IDUKICAgIGIgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9mb3JfaGVhZGVyQDEKCmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfYWZ0ZXJfZm9yQDY6CiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB2b2lkOgphc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjMzCiAgICAvLyBkZWYgYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChzZWxmLCBob2xkaW5nX2FkZHJlc3M6IEFjY291bnQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozNAogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQsIGVyci5TVVNQRU5ERUQKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQ0OAogICAgZ2V0Yml0CiAgICAhCiAgICBhc3NlcnQgLy8gU3VzcGVuZGVkIG9wZXJhdGlvbnMKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzOiBieXRlcywgdW5pdHM6IHVpbnQ2NCkgLT4gdWludDY0OgphY2NvdW50X3VuaXRzX3ZhbHVlOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjM2CiAgICAvLyBkZWYgYWNjb3VudF91bml0c192YWx1ZShzZWxmLCBob2xkaW5nX2FkZHJlc3M6IEFjY291bnQsIHVuaXRzOiBVSW50NjQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjM3CiAgICAvLyByZXR1cm4gdW5pdHMgKiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCA0MAogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyAtMQogICAgKgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF90b3RhbF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB1aW50NjQ6CmFjY291bnRfdG90YWxfdW5pdHNfdmFsdWU6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzkKICAgIC8vIGRlZiBhY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlKHNlbGYsIGhvbGRpbmdfYWRkcmVzczogQWNjb3VudCkgLT4gVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NDEKICAgIC8vIGhvbGRpbmdfYWRkcmVzcywgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzIgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NDAtNDIKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoCiAgICAvLyAgICAgaG9sZGluZ19hZGRyZXNzLCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cwogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBjYWxsc3ViIGFjY291bnRfdW5pdHNfdmFsdWUKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9yb2xlX2lzX2FjdGl2ZShyb2xlX21hcDogYnl0ZXMsIHJvbGVfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NDoKX3JvbGVfaXNfYWN0aXZlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU3CiAgICAvLyBkZWYgX3JvbGVfaXNfYWN0aXZlKHNlbGYsIHJvbGVfbWFwOiB0eXAuUmJhY1JvbGUsIHJvbGVfYWRkcmVzczogQWNjb3VudCkgLT4gYm9vbDoKICAgIHByb3RvIDIgMQogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5CiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5LTYwCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5LTYxCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjEKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAtNjEKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgPj0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX21lcmdlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpIC0+IHZvaWQ6CmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjUKICAgIC8vIGFzc2VydCBzZWxmLl9pc19hcnJhbmdlcihUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjUyCiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzID09IHNlbGYuYXJyYW5nZXIudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vIDB4NTIzMjMwMjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcnJhbmdlciBleGlzdHMKICAgID09CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjUKICAgIC8vIGFzc2VydCBzZWxmLl9pc19hcnJhbmdlcihUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpIC0+IHZvaWQ6CmFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjgzCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYXNzZXRfZGVmYXVsdGVkLCBlcnIuREVGQVVMVEVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjMgLy8gImFzc2V0X2RlZmF1bHRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9kZWZhdWx0ZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRGVmYXVsdGVkCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpIC0+IHZvaWQ6CmFzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg2CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYXNzZXRfc3VzcGVuZGVkLCBlcnIuU1VTUEVOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjIgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9zdXNwZW5kZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gU3VzcGVuZGVkIG9wZXJhdGlvbnMKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkOiB1aW50NjQpIC0+IHZvaWQ6Cl9hc3NlcnRfdmFsaWRfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OAogICAgLy8gZGVmIF9hc3NlcnRfdmFsaWRfcm9sZShzZWxmLCByb2xlX2lkOiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MAogICAgLy8gVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIHB1c2hpbnQgMjAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgcHVzaGludCA0MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk2CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MgogICAgLy8gVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIHB1c2hpbnQgNTAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTMKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIHB1c2hpbnQgNjAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTQKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgcHVzaGludCA3MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk2CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NQogICAgLy8gVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICBwdXNoaW50IDgwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTYKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJ6IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX2ZhbHNlQDcKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANjoKICAgIGludGNfMSAvLyAxCgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9tZXJnZUA4OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk2CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgcmV0c3ViCgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9mYWxzZUA3OgogICAgaW50Y18wIC8vIDAKICAgIGIgX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfbWVyZ2VAOAo=", - "clear": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" - }, - "byteCode": { - "approval": "DCAHAAEgCJBOyAGAowUmIwQVH3x1BFIzMCMGc3RhdHVzDWlzc3VhbmNlX2RhdGURY2lyY3VsYXRpbmdfdW5pdHMNaW50ZXJlc3RfcmF0ZQRSMjAjCnVuaXRfdmFsdWUhcHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlHXNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlDW1hdHVyaXR5X2RhdGUEUjcwIwRSNDAjC3RvdGFsX3VuaXRzE3NldHRsZW1lbnRfYXNzZXRfaWQUZGF5X2NvdW50X2NvbnZlbnRpb24dc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUNY291cG9uX3BlcmlvZARSODAjBFI2MCMEUjUwIwRSMjUjD2Fzc2V0X3N1c3BlbmRlZA9hc3NldF9kZWZhdWx0ZWQVZGVub21pbmF0aW9uX2Fzc2V0X2lkCG1ldGFkYXRhEnByaW5jaXBhbF9kaXNjb3VudCFwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGURcGFpZF9jb3Vwb25fdW5pdHMLdGltZVBlcmlvZHMBAA10b3RhbF9jb3Vwb25zCnRpbWVFdmVudHMCAAADBoEBMRhAAHUnBjIDZycVMgNnJxYiZycXImcnDSJnJwQiZycHImcqImcnGCJnJw4iZycHImcnDyJnJxmAAGcnGiJnJwUiZycfImcnCCJnJxsiZysiZycQImcnCSJnJwoiZyccImcnESJnMTWBAxJEMTSBFBJEMTcURDE2FESABCXbqVs2GgCOAQDjMRkURDEYQQDMghwEiUdBNASTFimNBEQ2PUkEZ9tPIAT2qWyNBCKbcG8EjPFLUQRP1qPMBB1vwlUEJemZfwRshePuBEAtukcE+tIXPgQI7+o1BOSlq1QE3AY7NQQU/BDvBEwRPtUEdKcpfwQQXBhOBIL3Gy0E7wT10wQDuDMpBD2+gL0E31ToLAQBDIKZBHQGrNIEw+SylzYaAI4cABsBgAGsAlECdwLfAvkEdAYYBpYGtQdNCBwINghRCFwIlQjfCSUJVwlvCYcJnwpbCvELEAsbC2UAgAQ/DvxsNhoAjgEFtgAxGYEEEjEYEERCBdiAADYaAUkVJRJEFzYaAkkVJRJEFzYaA0kVJRJEFzYaBEkVJRJEFzYaBUkVJRJEFzYaBkkVIxJENhoHSU4HFYECEkQ2GghJIllJTgiBAguBAghMFRJENhoJSU4HSSJZSU4IJQuBAghMFRJENhoKSU4HSSJZSU4IgRALgQIITBUSRIgNJiIqZUQUREsFcQtFAUQnGEsGZ0sETwYSRCcOSwVnsTIAMgoishKyFE8FshGBBLIQsgGzSwNLAhgURCcHSwJnTwNPAgonDUxnJxpPAmcXSUEACEmB/wESQQCFI0QnD0sBZ0sGF0UIIicaZURAAANLB0QnBUsIZ0sFSRREJx9LAWeBAwhLBBJESwSIC7AnILxIJyBLAb9JgQJbJwhMZ0mBClsnG0xngRJbK0xnJwoiZ0sBIxJESwJJVwIQSSJbTCVbTEQURCcdvEgnHUy/Jx2DAgIQuiJbJxFMZyqBZGcjQyJC/3g2GgFJFYECEkQnEjEAiAwARIgMOogMP4gKXogLGUQXJwVMZzIHFihMULAjQyKAAEcENhoBSRUkEkQ2GgJJFSUSRBciJwhlREEAgzIHIicIZUQPQQB4I0QpSwJQSUUJvUUBRElBAGNLB75EJFtLAQ9BAFcjREsBSUsCiAtyRQgiRQciRQQiRQaICe5JRQZMSwGICrWIClxBABpLA0mICgpLA0sDTwOICmJFB0kiW0UEJVtFBUsCFksFFlBLBxZLBxZQTFAoTFCwI0MiQv+mIkL/hTYaAUkVJBJEKUsBUL1FAUSICxoiJwVlRAshBAoWIhZQKExQsCNDgABHBCIqZUSBZBJBAFSICXBFA0sCSSMIiAmGRQNJiAoeRQYiRQIiRQWICc9BAA5LAogJfkkiW0UCJVtFBCInH2VESwEWSwUWUEwWSwQWUEsDFlBMUCceIksHVFAoTFCwI0MiRQNC/6snISIqZUSBZBJBAAcnHb5MRQJEKEsBULAjQzYaAUcCFSQSRDYaAkkiWYECCEsBFRJEVwIATCIqZUSBZBJEiAqviAq0KUsBUElOAkm9RQFESb5IJFtJTgNEiAi+TL5EgTBbTEsBDUSICW5EiAoyIicFZUQLIQQKIicVZUQyAxNBACIxACInFWVEEkAAFTEASwUSQAANMQBLA75EVwAgEkEA8CNESwK+RFcAICInDmVEcABFAUEA10sCvkSBwANTQADMI0EAwjIKIicOZURMSwFwAERLAklOAg9ESwS+RFcAILEyAE8CshJMshRMshGBBLIQsgGzSwJJvkSBMFsjCBaBMEy7IiccZURLAggnHExnMggyByInGGVESXEDRCInBGVEIicHZUQLTwQWgAMIADdQTwQWUEsEFkxLAVBPBBZQSwMVFlcGAk8EUEyAAgA7UE8DFlAnIVAiFlCABAACSVBQTFCABIwpkE5MULAyBxZQSwRJFRZXBgJMUEyAAgASUExQKExQsCNDIkUBQv9nIkL/MSJC/w0iRwKAAEk2GgFJFSQSRDYaAkkVJBJENhoDSRUlEkQXIiplRIFkEkEBIyInEGVEMgcOQQEYIicJZURBAAsyByInCWVEDEEBBSNEMQBLA0lOAhJEiAkFiAkKKUsBUElFCUm9RQFEKUsESU4CUElFCkm9RQFESwOICHJLAYgIbU8DTwITREsCSURPAr5ESSRbTwIPRFcoCEUJvkQkW0EAmEsGvkSBKFtLBr5EgShbEkEAgksGvkSBMFtLBr5EgTBbEkEAcCNESwZJvkSBKFtFBYgGs0sESU4CSwGIB3lMSwNJTgNPAogHMEUHSwG+RCRbSg5ETAkWSwEkTwK7vkgkW0AAECIWSwdJTgKBKEsCu4EwTLtLBUm+RCRbSwJJTgIIFk8CJE8Cu0sEC0sFCBYoTFCwI0MiQv+NSwVJgShLCrtLB75EVzAIgTBMu0L/eCJC/vg2GgFJFSQSRDYaAkkVSwGBJllJgSgSREsCTEsCUiJZgSoIEkQnBk8CZycZTGcjQzYaAUkVSwGBJllJgSgSREsCTEsCUiJZgSoIEkSIB7InGUxnI0MiNhoBRwIiWUklC4ECCE8CFRJEiAeWIiplRCEFEhREiAeUSUQjDUEABkmIBpRFASIrZURLAUlXAgBFBIECW0xLAQ5EJxBMZyInCmVEQQAaIicKZURLASJZIwklC0sDTFtMSwEPRCcJTGciJxBlRCInCWVETBZMFlAoTFCwI0M2GgFJFSMSRCJTJxMxAIgG6UQnF0xnMgcWKExQsCNDgAA2GgFJFSQSRDYaAkkVJRJEFyIqZUSBZBJBAHciJwhlRDIHSUUFDkEAaSInG2VESwMNQQBeI0QnFDEAiAacRClLAlBJvUUBRIgGzYgG0ksBSUQiJwRlREsBCCInDWVESwEPRCcESwFnSwK+RCRbTwIIFksCJE8CuyInB2VEFk8CgShPArsiJw1lREwJFihMULAjQyJC/58iMgciJwplTElOAk4DRA1BAAhJQQAEgQRFAiInF2VEQQAEgQNFAiInGGVEIicOZUQiJwRlRCInB2VESgsiJw9lRBZJkyUORFcHASInGmVEFkmTgRAORFcGAiInBWVEFkmTgRAORFcGAiInDWVEIicIZUQiJxtlRCIrZUQiJwplRCInFmVESw8WSZMlDkRXBwFPDhZPDhZQTwsWUE8LFlBPClBPCVBPCFBPBxZQTwcWUE8GFlBPBRZQTwQWUE8DFlAnHiJPBFRQTFAoTFCwI0MnISIqZUSBZBJBAAcnIL5MRQJEKEsBULAjQyInEGVEIicJZURMFoACAAJMUEwWUChMULAjQyInGWVEKExQsCNDNhoBSRUkEkQ2GgJJFSMSRCJTJwsxAIgFG0QpTwJQSb1FAURJgTgjuiJPA1SBOEy7MgcWKExQsCNDNhoBSRUkEkQ2GgJJFSQSRCcMMQCIBOREIiplRCEFEhREiAUViAUaKU8CUEm9RQEURCIWTwJLAVBLAVBMUCceUL8yBxYoTFCwI0M2GgFJFSQSRCcMMQCIBKJEiATcKUxQSb1FAURJvkgkW0lPArxIIicEZURMCScESwFnQAAEKiEFZzIHSwEWTBZQKExQsCNDNhoBSRUkEkQ2GgJJFSQSRDEASwISRIgEkIgElSlPAlBJvUUBRCJPArsyBxYoTFCwI0M2GgFJFSQSRClMUEm9RQFEvkgoTFCwI0M2GgFJFSQSRIgESicGTGcyBxYoTFCwI0M2GgFJFSQSRIgEMicVTGcyBxYoTFCwI0M2GgFJFSMSRDYaAklOAhUkEkQ2GgNJIlmBAghLARUSRFcCAEyIA/6IBAUXRwKIBA+BFBJBAA4nBksDZzIHFihMULAjQ0mBKBJBABEnDEsDUEm9RQEUREsCv0L/30mBMhJBABEnFEsDUEm9RQEUREsCv0L/x0mBPBJBABEnE0sDUEm9RQEUREsCv0L/r0mBRhJBABEnC0sDUEm9RQEUREsCv0L/l0mBUBJB/5AnEksDUEm9RQEUREsCv0L/fzYaAUkVIxJENhoCSU4CFSQSRIgDVIgDWxdHAogDZUmBFBNEgSgSQQAVJwxLAlBJvUUBRLxIMgcWKExQsCNDSYEyEkEADycUSwJQSb1FAUS8SEL/4UmBPBJBAA8nE0sCUEm9RQFEvEhC/8tJgUYSQQAPJwtLAlBJvUUBRLxIQv+1SYFQEkH/ricSSwJQSb1FAUS8SEL/nzYaAUkVIxJEIlMnCzEAiAKORCcWTGcyBxYoTFCwI0MiJwZlRChMULAjQzYaAUkVJBJEJwxLAYgCZicUSwKIAl8nE0sDiAJYJwtLBIgCUScSTwWIAkonHiJPBlQjTwVUgQJPBFSBA08DVIEETwJUKExQsCNDNhoBSRUjEkQ2GgJJTgIVJBJEF0mIAmKDBhQoMjxGUE8GjgYATwBAADEAIgATAAEAJxJLAVBJvUUBRL5IKExQsCNDJwtLAVBJvUUBRL5IQv/rJxNLAVBJvUUBRL5IQv/cJxRLAVBJvUUBRL5IQv/NJwxLAVBJvUUBRL5IQv++gBAAAAAAAAAAAAAAAAAAAAAAQv+pigABIjIHSSIrZUQNQQAQIitlRIsBTAkiJxFlRAqMAImKAQEiK2VEIicRZUSL/wsIiYoBAYAASYv/QAAqIitlRDIHTAmMACInEWVEIicPZURAAAqLACEGCowAIQYKiwAWTBZQjACJIowBi/9BAAeL/4j/rYwBiwFC/8aKAQEiK2VEQQAMMgciK2VEDUEAAiOJIomKAwGL/Yv/iAA0i/+I/5BJIltMJVuL/Yv+iADIIicFZUQLTwILIQRPAgsKiYoBASInHGVEIicEZUSL/wsPiYoCACmL/lC+RIEwW4v/EkSJigEBgABHAov/VwIAi/+BAlsyBw1Ei/8iWSMJIosFiwQMQQBcgUsyDA1BABmxgQayEIEFshknIrIeJyKyHzIAsgGzQv/fiwVJJQuLA0lOA0xbSU4DjAEjCEmMAiULW0mMAAxEIicPZUSB/wETQQAKiwCLAQkhBhgURIsCjAVC/5yL/4wAiYoBACmL/1C+RIHAA1MURImKAgEpi/5QvkSBKFuL/wuJigEBKYv/UL5EJFuL/0yI/9+JigIBgACL/ov/UEm9RQFBAB+LAb5EIlsyB0mMAA5BABCLAb5EJVuLAA9BAAQjjACJIkL/+TEAIicGZUQSRIkiJxdlRBREiSInFmVEFESJigEAi/+BFBJAACiL/4EoEkAAIIv/gTISQAAYi/+BPBJAABCL/4FGEkAACIv/gVASQQADI0SJIkL/+g==", - "clear": "DIEBQw==" - }, - "compilerInfo": { - "compiler": "puya", - "compilerVersion": { - "major": 5, - "minor": 7, - "patch": 1 - } - }, - "events": [ - { - "name": "Event", - "args": [ - { - "type": "uint64", - "name": "contract_id" - }, - { - "type": "uint8", - "name": "type" - }, - { - "type": "string", - "name": "type_name" - }, - { - "type": "uint64", - "name": "time" - }, - { - "type": "uint64", - "name": "payoff" - }, - { - "type": "uint64", - "name": "currency_id" - }, - { - "type": "byte[]", - "name": "currency_unit" - }, - { - "type": "uint64", - "name": "nominal_value" - }, - { - "type": "uint16", - "name": "nominal_rate_bps" - }, - { - "type": "uint64", - "name": "nominal_accrued" - } - ], - "desc": "ACTUS Event." - } - ], - "templateVariables": {} -} \ No newline at end of file diff --git a/smart_contracts/artifacts/perpetual_bond/PerpetualBond.clear.puya.map b/smart_contracts/artifacts/perpetual_bond/PerpetualBond.clear.puya.map deleted file mode 100644 index d580b5c4..00000000 --- a/smart_contracts/artifacts/perpetual_bond/PerpetualBond.clear.puya.map +++ /dev/null @@ -1,25 +0,0 @@ -{ - "version": 3, - "sources": [], - "mappings": ";;;", - "op_pc_offset": 0, - "pc_events": { - "1": { - "subroutine": "algopy.arc4.ARC4Contract.clear_state_program", - "params": {}, - "block": "main", - "stack_in": [], - "op": "pushint 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "3": { - "op": "return", - "stack_out": [] - } - } -} \ No newline at end of file diff --git a/smart_contracts/artifacts/perpetual_bond/PerpetualBond.clear.teal b/smart_contracts/artifacts/perpetual_bond/PerpetualBond.clear.teal deleted file mode 100644 index a87aa802..00000000 --- a/smart_contracts/artifacts/perpetual_bond/PerpetualBond.clear.teal +++ /dev/null @@ -1,7 +0,0 @@ -#pragma version 12 -#pragma typetrack false - -// algopy.arc4.ARC4Contract.clear_state_program() -> uint64: -main: - pushint 1 - return diff --git a/smart_contracts/artifacts/perpetual_bond/perpetual_bond_client.py b/smart_contracts/artifacts/perpetual_bond/perpetual_bond_client.py deleted file mode 100644 index c63b6d06..00000000 --- a/smart_contracts/artifacts/perpetual_bond/perpetual_bond_client.py +++ /dev/null @@ -1,3965 +0,0 @@ -# flake8: noqa -# fmt: off -# mypy: ignore-errors -# This file was automatically generated by algokit-client-generator. -# DO NOT MODIFY IT BY HAND. -# requires: algokit-utils@^3.0.0 - -# common -import dataclasses -import typing -# core algosdk -import algosdk -from algosdk.transaction import OnComplete -from algosdk.atomic_transaction_composer import TransactionSigner -from algosdk.source_map import SourceMap -from algosdk.transaction import Transaction -from algosdk.v2client.models import SimulateTraceConfig -# utils -import algokit_utils -from algokit_utils import AlgorandClient as _AlgoKitAlgorandClient - -_APP_SPEC_JSON = r"""{"arcs": [22, 28], "bareActions": {"call": [], "create": []}, "methods": [{"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "desc": "Denomination asset identifier", "name": "denomination_asset_id"}, {"type": "uint64", "desc": "Settlement asset identifier", "name": "settlement_asset_id"}, {"type": "uint64", "desc": "Principal, expressed in denomination asset", "name": "principal"}, {"type": "uint64", "desc": "Principal discount in bps", "name": "principal_discount"}, {"type": "uint64", "desc": "Minimum denomination, expressed in denomination asset", "name": "minimum_denomination"}, {"type": "uint8", "desc": "Day-count convention for interests calculation", "name": "day_count_convention"}, {"type": "uint16", "desc": "Interest rate in bps", "name": "interest_rate"}, {"type": "uint16[]", "desc": "Coupon interest rates in bps", "name": "coupon_rates"}, {"type": "uint64[]", "desc": "Time events (strictly ascending order)", "name": "time_events"}, {"type": "(uint64,uint64)[]", "desc": "Time periods of recurring time events", "name": "time_periods"}], "name": "asset_config", "returns": {"type": "void"}, "desc": "Configure the Debt Algorand Standard Application", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint16", "desc": "Interest rate in bps", "name": "interest_rate"}], "name": "update_interest_rate", "returns": {"type": "uint64", "desc": "Timestamp of the update"}, "desc": "Update variable interest rates in bps", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "uint64", "desc": "Account's units for the current value calculation", "name": "units"}], "name": "get_account_units_current_value", "returns": {"type": "(uint64,uint64,(uint64,uint64))", "desc": "Units current value in denomination asset, Accrued interest in denomination asset", "struct": "CurrentUnitsValue"}, "desc": "Get account's units current value and accrued interest", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}], "name": "get_payment_amount", "returns": {"type": "(uint64,uint64)", "desc": "Interest amount in denomination asset, Principal amount in denomination asset", "struct": "PaymentAmounts"}, "desc": "Get the next payment amount", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_coupons_status", "returns": {"type": "(uint64,uint64,uint64,(uint64,uint64),bool)", "desc": "Total coupons, Due coupons, Next coupon due date, (Day count factor numerator, Day count factor denominator), All due coupons paid", "struct": "CouponsInfo"}, "desc": "Get D-ASA coupons status", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_time_periods", "returns": {"type": "(uint64,uint64)[]", "desc": "Time periods"}, "desc": "Get D-ASA time periods", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "byte[]", "desc": "Additional payment information (Optional)", "name": "payment_info"}], "name": "pay_coupon", "returns": {"type": "(uint64,uint64,byte[])", "desc": "Paid coupon amount in denomination asset, Payment timestamp, Payment context", "struct": "PaymentResult"}, "desc": "Pay due coupon to an account", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint8", "name": "type"}, {"type": "string", "name": "type_name"}, {"type": "uint64", "name": "time"}, {"type": "uint64", "name": "payoff"}, {"type": "uint64", "name": "currency_id"}, {"type": "byte[]", "name": "currency_unit"}, {"type": "uint64", "name": "nominal_value"}, {"type": "uint16", "name": "nominal_rate_bps"}, {"type": "uint64", "name": "nominal_accrued"}], "name": "Event", "desc": "ACTUS Event."}], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Sender Account Holding Address", "name": "sender_holding_address"}, {"type": "address", "desc": "Receiver Account Holding Address", "name": "receiver_holding_address"}, {"type": "uint64", "desc": "Amount of D-ASA units to transfer", "name": "units"}], "name": "asset_transfer", "returns": {"type": "uint64", "desc": "Transferred actualized value in denomination asset"}, "desc": "Transfer D-ASA units between accounts", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": [], "create": ["NoOp"]}, "args": [{"type": "address", "desc": "D-ASA Arranger Address", "name": "arranger"}, {"type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", "desc": "D-ASA metadata", "name": "metadata", "struct": "AssetMetadata"}], "name": "asset_create", "returns": {"type": "void"}, "desc": "Create a new D-ASA", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["UpdateApplication"], "create": []}, "args": [{"type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", "name": "metadata", "struct": "AssetMetadata"}], "name": "asset_update", "returns": {"type": "void"}, "desc": "Update D-ASA application.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64[]", "desc": "Secondary market time events (strictly ascending order)", "name": "secondary_market_time_events"}], "name": "set_secondary_time_events", "returns": {"type": "(uint64,uint64)", "desc": "Secondary Market Opening Date, Secondary Market Closure Date", "struct": "SecondaryMarketSchedule"}, "desc": "Set secondary market time schedule", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Default status", "name": "defaulted"}], "name": "set_default_status", "returns": {"type": "uint64"}, "desc": "Set D-ASA default status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "uint64", "desc": "Amount of D-ASA units to distribute", "name": "units"}], "name": "primary_distribution", "returns": {"type": "uint64", "desc": "Remaining D-ASA units to be distributed"}, "desc": "Distribute D-ASA units to accounts according the primary market", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_asset_info", "returns": {"type": "(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)", "desc": "Denomination asset ID, Settlement asset ID, Outstanding principal, Unit nominal value, Day-count convention, Interest rate, Total supply, Circulating supply, Primary distribution opening date, Primary distribution closure date, Issuance date, Maturity date, Suspended, Performance", "struct": "AssetInfo"}, "desc": "Get D-ASA info", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_time_events", "returns": {"type": "uint64[]", "desc": "Time events"}, "desc": "Get D-ASA time events", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_secondary_market_schedule", "returns": {"type": "uint64[]", "desc": "Secondary market schedule"}, "desc": "Get secondary market schedule", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_asset_metadata", "returns": {"type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", "desc": "Contract type, Calendar, Business day convention, End of month convention, Early repayment effect, Early repayment penalty type, Prospectus hash, Prospectus URL", "struct": "AssetMetadata"}, "desc": "Get D-ASA metadata", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "bool", "desc": "Suspension status", "name": "suspended"}], "name": "account_gov_suspension", "returns": {"type": "uint64", "desc": "Timestamp of the set account suspension status"}, "desc": "Set account suspension status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "address", "desc": "Account Payment Address", "name": "payment_address"}], "name": "account_open", "returns": {"type": "uint64", "desc": "Timestamp of the account opening"}, "desc": "Open D-ASA account", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}], "name": "account_close", "returns": {"type": "(uint64,uint64)", "desc": "Closed units, Timestamp of the account closing"}, "desc": "Close D-ASA account", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "address", "desc": "Account Payment Address", "name": "payment_address"}], "name": "account_update_payment_address", "returns": {"type": "uint64", "desc": "Timestamp of the account update"}, "desc": "Update the Payment Address of an account", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}], "name": "account_get_info", "returns": {"type": "(address,uint64,uint64,uint64,bool)", "desc": "Payment Address, D-ASA units, Unit nominal value in denomination asset, Paid coupons, Suspended", "struct": "AccountInfo"}, "desc": "Get account info", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "New Arranger address", "name": "new_arranger"}], "name": "rbac_rotate_arranger", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Rotate the Arranger address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Operation Daemon address", "name": "address"}], "name": "rbac_set_op_daemon", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Non-Normative: Set the Operation Daemon address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}, {"type": "byte[]", "desc": "Role configuration (Optional)", "name": "config"}], "name": "rbac_assign_role", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Assign a role to an address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}], "name": "rbac_revoke_role", "returns": {"type": "uint64", "desc": "Timestamp of the role revocation"}, "desc": "Revoke a role from an address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Suspension status", "name": "suspended"}], "name": "rbac_gov_asset_suspension", "returns": {"type": "uint64", "desc": "Timestamp of the set asset suspension status"}, "desc": "Set asset suspension status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "rbac_get_arranger", "returns": {"type": "address", "desc": "Arranger address"}, "desc": "Get Arranger address", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Address to get roles for", "name": "address"}], "name": "rbac_get_address_roles", "returns": {"type": "(bool,bool,bool,bool,bool)", "desc": "Roles mask: (Account Manager, Primary Dealer, Trustee, Authority, Interest Oracle)"}, "desc": "Non-normative - Get roles assigned to an address", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}], "name": "rbac_get_role_config", "returns": {"type": "(uint64,uint64)", "desc": "Role configuration", "struct": "RoleConfig"}, "desc": "Get role configuration", "events": [], "readonly": true, "recommendations": {}}], "name": "PerpetualBond", "state": {"keys": {"box": {"time_events": {"key": "dGltZUV2ZW50cw==", "keyType": "AVMBytes", "valueType": "uint64[]"}, "time_periods": {"key": "dGltZVBlcmlvZHM=", "keyType": "AVMBytes", "valueType": "(uint64,uint64)[]"}}, "global": {"arranger": {"key": "UjIwIw==", "keyType": "AVMBytes", "valueType": "address"}, "op_daemon": {"key": "UjI1Iw==", "keyType": "AVMBytes", "valueType": "address"}, "asset_suspended": {"key": "YXNzZXRfc3VzcGVuZGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "asset_defaulted": {"key": "YXNzZXRfZGVmYXVsdGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "total_units": {"key": "dG90YWxfdW5pdHM=", "keyType": "AVMString", "valueType": "AVMUint64"}, "circulating_units": {"key": "Y2lyY3VsYXRpbmdfdW5pdHM=", "keyType": "AVMString", "valueType": "AVMUint64"}, "unit_value": {"key": "dW5pdF92YWx1ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "status": {"key": "c3RhdHVz", "keyType": "AVMString", "valueType": "AVMUint64"}, "denomination_asset_id": {"key": "ZGVub21pbmF0aW9uX2Fzc2V0X2lk", "keyType": "AVMString", "valueType": "AVMUint64"}, "settlement_asset_id": {"key": "c2V0dGxlbWVudF9hc3NldF9pZA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "day_count_convention": {"key": "ZGF5X2NvdW50X2NvbnZlbnRpb24=", "keyType": "AVMString", "valueType": "AVMUint64"}, "metadata": {"key": "bWV0YWRhdGE=", "keyType": "AVMString", "valueType": "AVMBytes"}, "principal_discount": {"key": "cHJpbmNpcGFsX2Rpc2NvdW50", "keyType": "AVMString", "valueType": "AVMUint64"}, "interest_rate": {"key": "aW50ZXJlc3RfcmF0ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "total_coupons": {"key": "dG90YWxfY291cG9ucw==", "keyType": "AVMString", "valueType": "AVMUint64"}, "primary_distribution_opening_date": {"key": "cHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "primary_distribution_closure_date": {"key": "cHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "issuance_date": {"key": "aXNzdWFuY2VfZGF0ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "secondary_market_opening_date": {"key": "c2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGU=", "keyType": "AVMString", "valueType": "AVMUint64"}, "secondary_market_closure_date": {"key": "c2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGU=", "keyType": "AVMString", "valueType": "AVMUint64"}, "maturity_date": {"key": "bWF0dXJpdHlfZGF0ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "paid_coupon_units": {"key": "cGFpZF9jb3Vwb25fdW5pdHM=", "keyType": "AVMString", "valueType": "AVMUint64"}, "coupon_period": {"key": "Y291cG9uX3BlcmlvZA==", "keyType": "AVMString", "valueType": "AVMUint64"}}, "local": {}}, "maps": {"box": {"account_manager": {"keyType": "address", "valueType": "RoleConfig", "prefix": "UjQwIw=="}, "primary_dealer": {"keyType": "address", "valueType": "RoleConfig", "prefix": "UjUwIw=="}, "trustee": {"keyType": "address", "valueType": "RoleConfig", "prefix": "UjYwIw=="}, "authority": {"keyType": "address", "valueType": "RoleConfig", "prefix": "UjcwIw=="}, "interest_oracle": {"keyType": "address", "valueType": "RoleConfig", "prefix": "UjgwIw=="}, "account": {"keyType": "address", "valueType": "AccountInfo", "prefix": "UjMwIw=="}}, "global": {}, "local": {}}, "schema": {"global": {"bytes": 3, "ints": 20}, "local": {"bytes": 0, "ints": 0}}}, "structs": {"AccountInfo": [{"name": "payment_address", "type": "address"}, {"name": "units", "type": "uint64"}, {"name": "unit_value", "type": "uint64"}, {"name": "paid_coupons", "type": "uint64"}, {"name": "suspended", "type": "bool"}], "AssetInfo": [{"name": "denomination_asset_id", "type": "uint64"}, {"name": "settlement_asset_id", "type": "uint64"}, {"name": "outstanding_principal", "type": "uint64"}, {"name": "unit_value", "type": "uint64"}, {"name": "day_count_convention", "type": "uint8"}, {"name": "principal_discount", "type": "uint16"}, {"name": "interest_rate", "type": "uint16"}, {"name": "total_supply", "type": "uint64"}, {"name": "circulating_supply", "type": "uint64"}, {"name": "primary_distribution_opening_date", "type": "uint64"}, {"name": "primary_distribution_closure_date", "type": "uint64"}, {"name": "issuance_date", "type": "uint64"}, {"name": "maturity_date", "type": "uint64"}, {"name": "suspended", "type": "bool"}, {"name": "performance", "type": "uint8"}], "AssetMetadata": [{"name": "contract_type", "type": "uint8"}, {"name": "calendar", "type": "uint8"}, {"name": "business_day_convention", "type": "uint8"}, {"name": "end_of_month_convention", "type": "uint8"}, {"name": "prepayment_effect", "type": "uint8"}, {"name": "penalty_type", "type": "uint8"}, {"name": "prospectus_hash", "type": "byte[32]"}, {"name": "prospectus_url", "type": "string"}], "CouponsInfo": [{"name": "total_coupons", "type": "uint64"}, {"name": "due_coupons", "type": "uint64"}, {"name": "next_coupon_due_date", "type": "uint64"}, {"name": "day_count_factor", "type": "DayCountFactor"}, {"name": "all_due_coupons_paid", "type": "bool"}], "CurrentUnitsValue": [{"name": "units_value", "type": "uint64"}, {"name": "accrued_interest", "type": "uint64"}, {"name": "day_count_factor", "type": "DayCountFactor"}], "DayCountFactor": [{"name": "numerator", "type": "uint64"}, {"name": "denominator", "type": "uint64"}], "PaymentAmounts": [{"name": "interest", "type": "uint64"}, {"name": "principal", "type": "uint64"}], "PaymentResult": [{"name": "amount", "type": "uint64"}, {"name": "timestamp", "type": "uint64"}, {"name": "context", "type": "byte[]"}], "RoleConfig": [{"name": "role_validity_start", "type": "uint64"}, {"name": "role_validity_end", "type": "uint64"}], "SecondaryMarketSchedule": [{"name": "secondary_market_opening_date", "type": "uint64"}, {"name": "secondary_market_closure_date", "type": "uint64"}]}, "byteCode": {"approval": "DCAHAAEgCJBOyAGAowUmIwQVH3x1BFIzMCMGc3RhdHVzDWlzc3VhbmNlX2RhdGURY2lyY3VsYXRpbmdfdW5pdHMNaW50ZXJlc3RfcmF0ZQRSMjAjCnVuaXRfdmFsdWUhcHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlHXNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlDW1hdHVyaXR5X2RhdGUEUjcwIwRSNDAjC3RvdGFsX3VuaXRzE3NldHRsZW1lbnRfYXNzZXRfaWQUZGF5X2NvdW50X2NvbnZlbnRpb24dc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUNY291cG9uX3BlcmlvZARSODAjBFI2MCMEUjUwIwRSMjUjD2Fzc2V0X3N1c3BlbmRlZA9hc3NldF9kZWZhdWx0ZWQVZGVub21pbmF0aW9uX2Fzc2V0X2lkCG1ldGFkYXRhEnByaW5jaXBhbF9kaXNjb3VudCFwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGURcGFpZF9jb3Vwb25fdW5pdHMLdGltZVBlcmlvZHMBAA10b3RhbF9jb3Vwb25zCnRpbWVFdmVudHMCAAADBoEBMRhAAHUnBjIDZycVMgNnJxYiZycXImcnDSJnJwQiZycHImcqImcnGCJnJw4iZycHImcnDyJnJxmAAGcnGiJnJwUiZycfImcnCCJnJxsiZysiZycQImcnCSJnJwoiZyccImcnESJnMTWBAxJEMTSBFBJEMTcURDE2FESABCXbqVs2GgCOAQDjMRkURDEYQQDMghwEiUdBNASTFimNBEQ2PUkEZ9tPIAT2qWyNBCKbcG8EjPFLUQRP1qPMBB1vwlUEJemZfwRshePuBEAtukcE+tIXPgQI7+o1BOSlq1QE3AY7NQQU/BDvBEwRPtUEdKcpfwQQXBhOBIL3Gy0E7wT10wQDuDMpBD2+gL0E31ToLAQBDIKZBHQGrNIEw+SylzYaAI4cABsBgAGsAlECdwLfAvkEdAYYBpYGtQdNCBwINghRCFwIlQjfCSUJVwlvCYcJnwpbCvELEAsbC2UAgAQ/DvxsNhoAjgEFtgAxGYEEEjEYEERCBdiAADYaAUkVJRJEFzYaAkkVJRJEFzYaA0kVJRJEFzYaBEkVJRJEFzYaBUkVJRJEFzYaBkkVIxJENhoHSU4HFYECEkQ2GghJIllJTgiBAguBAghMFRJENhoJSU4HSSJZSU4IJQuBAghMFRJENhoKSU4HSSJZSU4IgRALgQIITBUSRIgNJiIqZUQUREsFcQtFAUQnGEsGZ0sETwYSRCcOSwVnsTIAMgoishKyFE8FshGBBLIQsgGzSwNLAhgURCcHSwJnTwNPAgonDUxnJxpPAmcXSUEACEmB/wESQQCFI0QnD0sBZ0sGF0UIIicaZURAAANLB0QnBUsIZ0sFSRREJx9LAWeBAwhLBBJESwSIC7AnILxIJyBLAb9JgQJbJwhMZ0mBClsnG0xngRJbK0xnJwoiZ0sBIxJESwJJVwIQSSJbTCVbTEQURCcdvEgnHUy/Jx2DAgIQuiJbJxFMZyqBZGcjQyJC/3g2GgFJFYECEkQnEjEAiAwARIgMOogMP4gKXogLGUQXJwVMZzIHFihMULAjQyKAAEcENhoBSRUkEkQ2GgJJFSUSRBciJwhlREEAgzIHIicIZUQPQQB4I0QpSwJQSUUJvUUBRElBAGNLB75EJFtLAQ9BAFcjREsBSUsCiAtyRQgiRQciRQQiRQaICe5JRQZMSwGICrWIClxBABpLA0mICgpLA0sDTwOICmJFB0kiW0UEJVtFBUsCFksFFlBLBxZLBxZQTFAoTFCwI0MiQv+mIkL/hTYaAUkVJBJEKUsBUL1FAUSICxoiJwVlRAshBAoWIhZQKExQsCNDgABHBCIqZUSBZBJBAFSICXBFA0sCSSMIiAmGRQNJiAoeRQYiRQIiRQWICc9BAA5LAogJfkkiW0UCJVtFBCInH2VESwEWSwUWUEwWSwQWUEsDFlBMUCceIksHVFAoTFCwI0MiRQNC/6snISIqZUSBZBJBAAcnHb5MRQJEKEsBULAjQzYaAUcCFSQSRDYaAkkiWYECCEsBFRJEVwIATCIqZUSBZBJEiAqviAq0KUsBUElOAkm9RQFESb5IJFtJTgNEiAi+TL5EgTBbTEsBDUSICW5EiAoyIicFZUQLIQQKIicVZUQyAxNBACIxACInFWVEEkAAFTEASwUSQAANMQBLA75EVwAgEkEA8CNESwK+RFcAICInDmVEcABFAUEA10sCvkSBwANTQADMI0EAwjIKIicOZURMSwFwAERLAklOAg9ESwS+RFcAILEyAE8CshJMshRMshGBBLIQsgGzSwJJvkSBMFsjCBaBMEy7IiccZURLAggnHExnMggyByInGGVESXEDRCInBGVEIicHZUQLTwQWgAMIADdQTwQWUEsEFkxLAVBPBBZQSwMVFlcGAk8EUEyAAgA7UE8DFlAnIVAiFlCABAACSVBQTFCABIwpkE5MULAyBxZQSwRJFRZXBgJMUEyAAgASUExQKExQsCNDIkUBQv9nIkL/MSJC/w0iRwKAAEk2GgFJFSQSRDYaAkkVJBJENhoDSRUlEkQXIiplRIFkEkEBIyInEGVEMgcOQQEYIicJZURBAAsyByInCWVEDEEBBSNEMQBLA0lOAhJEiAkFiAkKKUsBUElFCUm9RQFEKUsESU4CUElFCkm9RQFESwOICHJLAYgIbU8DTwITREsCSURPAr5ESSRbTwIPRFcoCEUJvkQkW0EAmEsGvkSBKFtLBr5EgShbEkEAgksGvkSBMFtLBr5EgTBbEkEAcCNESwZJvkSBKFtFBYgGs0sESU4CSwGIB3lMSwNJTgNPAogHMEUHSwG+RCRbSg5ETAkWSwEkTwK7vkgkW0AAECIWSwdJTgKBKEsCu4EwTLtLBUm+RCRbSwJJTgIIFk8CJE8Cu0sEC0sFCBYoTFCwI0MiQv+NSwVJgShLCrtLB75EVzAIgTBMu0L/eCJC/vg2GgFJFSQSRDYaAkkVSwGBJllJgSgSREsCTEsCUiJZgSoIEkQnBk8CZycZTGcjQzYaAUkVSwGBJllJgSgSREsCTEsCUiJZgSoIEkSIB7InGUxnI0MiNhoBRwIiWUklC4ECCE8CFRJEiAeWIiplRCEFEhREiAeUSUQjDUEABkmIBpRFASIrZURLAUlXAgBFBIECW0xLAQ5EJxBMZyInCmVEQQAaIicKZURLASJZIwklC0sDTFtMSwEPRCcJTGciJxBlRCInCWVETBZMFlAoTFCwI0M2GgFJFSMSRCJTJxMxAIgG6UQnF0xnMgcWKExQsCNDgAA2GgFJFSQSRDYaAkkVJRJEFyIqZUSBZBJBAHciJwhlRDIHSUUFDkEAaSInG2VESwMNQQBeI0QnFDEAiAacRClLAlBJvUUBRIgGzYgG0ksBSUQiJwRlREsBCCInDWVESwEPRCcESwFnSwK+RCRbTwIIFksCJE8CuyInB2VEFk8CgShPArsiJw1lREwJFihMULAjQyJC/58iMgciJwplTElOAk4DRA1BAAhJQQAEgQRFAiInF2VEQQAEgQNFAiInGGVEIicOZUQiJwRlRCInB2VESgsiJw9lRBZJkyUORFcHASInGmVEFkmTgRAORFcGAiInBWVEFkmTgRAORFcGAiInDWVEIicIZUQiJxtlRCIrZUQiJwplRCInFmVESw8WSZMlDkRXBwFPDhZPDhZQTwsWUE8LFlBPClBPCVBPCFBPBxZQTwcWUE8GFlBPBRZQTwQWUE8DFlAnHiJPBFRQTFAoTFCwI0MnISIqZUSBZBJBAAcnIL5MRQJEKEsBULAjQyInEGVEIicJZURMFoACAAJMUEwWUChMULAjQyInGWVEKExQsCNDNhoBSRUkEkQ2GgJJFSMSRCJTJwsxAIgFG0QpTwJQSb1FAURJgTgjuiJPA1SBOEy7MgcWKExQsCNDNhoBSRUkEkQ2GgJJFSQSRCcMMQCIBOREIiplRCEFEhREiAUViAUaKU8CUEm9RQEURCIWTwJLAVBLAVBMUCceUL8yBxYoTFCwI0M2GgFJFSQSRCcMMQCIBKJEiATcKUxQSb1FAURJvkgkW0lPArxIIicEZURMCScESwFnQAAEKiEFZzIHSwEWTBZQKExQsCNDNhoBSRUkEkQ2GgJJFSQSRDEASwISRIgEkIgElSlPAlBJvUUBRCJPArsyBxYoTFCwI0M2GgFJFSQSRClMUEm9RQFEvkgoTFCwI0M2GgFJFSQSRIgESicGTGcyBxYoTFCwI0M2GgFJFSQSRIgEMicVTGcyBxYoTFCwI0M2GgFJFSMSRDYaAklOAhUkEkQ2GgNJIlmBAghLARUSRFcCAEyIA/6IBAUXRwKIBA+BFBJBAA4nBksDZzIHFihMULAjQ0mBKBJBABEnDEsDUEm9RQEUREsCv0L/30mBMhJBABEnFEsDUEm9RQEUREsCv0L/x0mBPBJBABEnE0sDUEm9RQEUREsCv0L/r0mBRhJBABEnC0sDUEm9RQEUREsCv0L/l0mBUBJB/5AnEksDUEm9RQEUREsCv0L/fzYaAUkVIxJENhoCSU4CFSQSRIgDVIgDWxdHAogDZUmBFBNEgSgSQQAVJwxLAlBJvUUBRLxIMgcWKExQsCNDSYEyEkEADycUSwJQSb1FAUS8SEL/4UmBPBJBAA8nE0sCUEm9RQFEvEhC/8tJgUYSQQAPJwtLAlBJvUUBRLxIQv+1SYFQEkH/ricSSwJQSb1FAUS8SEL/nzYaAUkVIxJEIlMnCzEAiAKORCcWTGcyBxYoTFCwI0MiJwZlRChMULAjQzYaAUkVJBJEJwxLAYgCZicUSwKIAl8nE0sDiAJYJwtLBIgCUScSTwWIAkonHiJPBlQjTwVUgQJPBFSBA08DVIEETwJUKExQsCNDNhoBSRUjEkQ2GgJJTgIVJBJEF0mIAmKDBhQoMjxGUE8GjgYATwBAADEAIgATAAEAJxJLAVBJvUUBRL5IKExQsCNDJwtLAVBJvUUBRL5IQv/rJxNLAVBJvUUBRL5IQv/cJxRLAVBJvUUBRL5IQv/NJwxLAVBJvUUBRL5IQv++gBAAAAAAAAAAAAAAAAAAAAAAQv+pigABIjIHSSIrZUQNQQAQIitlRIsBTAkiJxFlRAqMAImKAQEiK2VEIicRZUSL/wsIiYoBAYAASYv/QAAqIitlRDIHTAmMACInEWVEIicPZURAAAqLACEGCowAIQYKiwAWTBZQjACJIowBi/9BAAeL/4j/rYwBiwFC/8aKAQEiK2VEQQAMMgciK2VEDUEAAiOJIomKAwGL/Yv/iAA0i/+I/5BJIltMJVuL/Yv+iADIIicFZUQLTwILIQRPAgsKiYoBASInHGVEIicEZUSL/wsPiYoCACmL/lC+RIEwW4v/EkSJigEBgABHAov/VwIAi/+BAlsyBw1Ei/8iWSMJIosFiwQMQQBcgUsyDA1BABmxgQayEIEFshknIrIeJyKyHzIAsgGzQv/fiwVJJQuLA0lOA0xbSU4DjAEjCEmMAiULW0mMAAxEIicPZUSB/wETQQAKiwCLAQkhBhgURIsCjAVC/5yL/4wAiYoBACmL/1C+RIHAA1MURImKAgEpi/5QvkSBKFuL/wuJigEBKYv/UL5EJFuL/0yI/9+JigIBgACL/ov/UEm9RQFBAB+LAb5EIlsyB0mMAA5BABCLAb5EJVuLAA9BAAQjjACJIkL/+TEAIicGZUQSRIkiJxdlRBREiSInFmVEFESJigEAi/+BFBJAACiL/4EoEkAAIIv/gTISQAAYi/+BPBJAABCL/4FGEkAACIv/gVASQQADI0SJIkL/+g==", "clear": "DIEBQw=="}, "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint8", "name": "type"}, {"type": "string", "name": "type_name"}, {"type": "uint64", "name": "time"}, {"type": "uint64", "name": "payoff"}, {"type": "uint64", "name": "currency_id"}, {"type": "byte[]", "name": "currency_unit"}, {"type": "uint64", "name": "nominal_value"}, {"type": "uint16", "name": "nominal_rate_bps"}, {"type": "uint64", "name": "nominal_accrued"}], "name": "Event", "desc": "ACTUS Event."}], "networks": {}, "source": {"approval": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgMzIgOCAxMDAwMCAyMDAgODY0MDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAweDUyMzMzMDIzICJzdGF0dXMiICJpc3N1YW5jZV9kYXRlIiAiY2lyY3VsYXRpbmdfdW5pdHMiICJpbnRlcmVzdF9yYXRlIiAweDUyMzIzMDIzICJ1bml0X3ZhbHVlIiAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIiAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiICJtYXR1cml0eV9kYXRlIiAweDUyMzczMDIzIDB4NTIzNDMwMjMgInRvdGFsX3VuaXRzIiAic2V0dGxlbWVudF9hc3NldF9pZCIgImRheV9jb3VudF9jb252ZW50aW9uIiAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiICJjb3Vwb25fcGVyaW9kIiAweDUyMzgzMDIzIDB4NTIzNjMwMjMgMHg1MjM1MzAyMyAweDUyMzIzNTIzICJhc3NldF9zdXNwZW5kZWQiICJhc3NldF9kZWZhdWx0ZWQiICJkZW5vbWluYXRpb25fYXNzZXRfaWQiICJtZXRhZGF0YSIgInByaW5jaXBhbF9kaXNjb3VudCIgInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIgInBhaWRfY291cG9uX3VuaXRzIiAweDc0Njk2ZDY1NTA2NTcyNjk2ZjY0NzMgMHgwMCAidG90YWxfY291cG9ucyIgMHg3NDY5NmQ2NTQ1NzY2NTZlNzQ3MyAweDAwMDAgMHgwNjgxMDEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMC0zMQogICAgLy8gIyBSQkFDIFJvbGVzCiAgICAvLyBzZWxmLmFycmFuZ2VyID0gR2xvYmFsU3RhdGUoQWNjb3VudCgpLCBrZXk9Y3N0LlBSRUZJWF9JRF9BUlJBTkdFUikKICAgIGJ5dGVjIDYgLy8gMHg1MjMyMzAyMwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyCiAgICAvLyBzZWxmLm9wX2RhZW1vbiA9IEdsb2JhbFN0YXRlKEFjY291bnQoKSwga2V5PWNzdC5QUkVGSVhfSURfT1BfREFFTU9OKQogICAgYnl0ZWMgMjEgLy8gMHg1MjMyMzUyMwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjQ3LTQ4CiAgICAvLyAjIEQtQVNBIEdvdmVybmFuY2UKICAgIC8vIHNlbGYuYXNzZXRfc3VzcGVuZGVkID0gRmFsc2UKICAgIGJ5dGVjIDIyIC8vICJhc3NldF9zdXNwZW5kZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo0OQogICAgLy8gc2VsZi5hc3NldF9kZWZhdWx0ZWQgPSBGYWxzZQogICAgYnl0ZWMgMjMgLy8gImFzc2V0X2RlZmF1bHRlZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE5CiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzID0gVUludDY0KCkKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIwCiAgICAvLyBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzID0gVUludDY0KCkKICAgIGJ5dGVjIDQgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjEKICAgIC8vIHNlbGYudW5pdF92YWx1ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA3IC8vICJ1bml0X3ZhbHVlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjIKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGVubS5TVEFUVVNfSU5BQ1RJVkUpCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMxLTMyCiAgICAvLyAjIEFzc2V0IENvbmZpZ3VyYXRpb24KICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gQXNzZXQoKQogICAgYnl0ZWMgMjQgLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzMKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCA9IEFzc2V0KCkKICAgIGJ5dGVjIDE0IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozNAogICAgLy8gc2VsZi51bml0X3ZhbHVlID0gVUludDY0KCkKICAgIGJ5dGVjIDcgLy8gInVuaXRfdmFsdWUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjM1CiAgICAvLyBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uID0gVUludDY0KCkKICAgIGJ5dGVjIDE1IC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzctMzgKICAgIC8vICMgTWV0YWRhdGEKICAgIC8vIHNlbGYubWV0YWRhdGEgPSBCeXRlcygpCiAgICBieXRlYyAyNSAvLyAibWV0YWRhdGEiCiAgICBwdXNoYnl0ZXMgMHgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MC00MQogICAgLy8gIyBQcmluY2lwYWwgLyBSYXRlcwogICAgLy8gc2VsZi5wcmluY2lwYWxfZGlzY291bnQgPSBVSW50NjQoKQogICAgYnl0ZWMgMjYgLy8gInByaW5jaXBhbF9kaXNjb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDIKICAgIC8vIHNlbGYuaW50ZXJlc3RfcmF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA1IC8vICJpbnRlcmVzdF9yYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MwogICAgLy8gc2VsZi50b3RhbF9jb3Vwb25zID0gVUludDY0KCkKICAgIGJ5dGVjIDMxIC8vICJ0b3RhbF9jb3Vwb25zIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0NwogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgOCAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0OAogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMjcgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDkKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlY18zIC8vICJpc3N1YW5jZV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo1MAogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNiAvLyAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjUxCiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDkgLy8gInNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo1MgogICAgLy8gc2VsZi5tYXR1cml0eV9kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDEwIC8vICJtYXR1cml0eV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToyNAogICAgLy8gc2VsZi5wYWlkX2NvdXBvbl91bml0cyA9IFVJbnQ2NCgpCiAgICBieXRlYyAyOCAvLyAicGFpZF9jb3Vwb25fdW5pdHMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjMzNwogICAgLy8gc2VsZi5jb3Vwb25fcGVyaW9kID0gVUludDY0KCkKICAgIGJ5dGVjIDE3IC8vICJjb3Vwb25fcGVyaW9kIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzEKICAgIC8vIGFzc2VydCBUeG4uZ2xvYmFsX251bV9ieXRlX3NsaWNlID09IGNmZy5HTE9CQUxfQllURVMsIGVyci5XUk9OR19HTE9CQUxfQllURVMKICAgIHR4biBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgQnl0ZXMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjMyCiAgICAvLyBhc3NlcnQgVHhuLmdsb2JhbF9udW1fdWludCA9PSBjZmcuR0xPQkFMX1VJTlRTLCBlcnIuV1JPTkdfR0xPQkFMX1VJTlRTCiAgICB0eG4gR2xvYmFsTnVtVWludAogICAgcHVzaGludCAyMAogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgVUludHMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjMzCiAgICAvLyBhc3NlcnQgVHhuLmxvY2FsX251bV9ieXRlX3NsaWNlID09IGNmZy5MT0NBTF9CWVRFUywgZXJyLldST05HX0xPQ0FMX0JZVEVTCiAgICB0eG4gTG9jYWxOdW1CeXRlU2xpY2UKICAgICEKICAgIGFzc2VydCAvLyBXcm9uZyBMb2NhbCBCeXRlcyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzQKICAgIC8vIGFzc2VydCBUeG4ubG9jYWxfbnVtX3VpbnQgPT0gY2ZnLkxPQ0FMX1VJTlRTLCBlcnIuV1JPTkdfTE9DQUxfVUlOVFMKICAgIHR4biBMb2NhbE51bVVpbnQKICAgICEKICAgIGFzc2VydCAvLyBXcm9uZyBMb2NhbCBVSW50cyBhbGxvY2F0aW9uCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxNS0yOAogICAgLy8gY2xhc3MgUGVycGV0dWFsQm9uZCgKICAgIC8vICAgICBQQk5Db3JlTWl4aW4sCiAgICAvLyAgICAgUGVycGV0dWFsQ291cG9uQ2FzaGZsb3dNaXhpbiwKICAgIC8vICAgICBOb1ByaW5jaXBhbFBheW1lbnRNaXhpbiwKICAgIC8vICAgICBDb3Vwb25QYXltZW50QWdlbnRNaXhpbiwKICAgIC8vICAgICBDb3Vwb25UcmFuc2ZlckFnZW50TWl4aW4sCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyAgICAgYXZtX3ZlcnNpb249MTIsCiAgICAvLyApOgogICAgcHVzaGJ5dGVzIDB4MjVkYmE5NWIgLy8gbWV0aG9kICJhc3NldF91cGRhdGUoKHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LGJ5dGVbMzJdLHN0cmluZykpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fYXNzZXRfdXBkYXRlX3JvdXRlQDQKCm1haW5fc3dpdGNoX2Nhc2VfbmV4dEA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE1LTI4CiAgICAvLyBjbGFzcyBQZXJwZXR1YWxCb25kKAogICAgLy8gICAgIFBCTkNvcmVNaXhpbiwKICAgIC8vICAgICBQZXJwZXR1YWxDb3Vwb25DYXNoZmxvd01peGluLAogICAgLy8gICAgIE5vUHJpbmNpcGFsUGF5bWVudE1peGluLAogICAgLy8gICAgIENvdXBvblBheW1lbnRBZ2VudE1peGluLAogICAgLy8gICAgIENvdXBvblRyYW5zZmVyQWdlbnRNaXhpbiwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBhdm1fdmVyc2lvbj0xMiwKICAgIC8vICk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBieiBtYWluX2NyZWF0ZV9Ob09wQDM2CiAgICBwdXNoYnl0ZXNzIDB4ODk0NzQxMzQgMHg5MzE2Mjk4ZCAweDQ0MzYzZDQ5IDB4NjdkYjRmMjAgMHhmNmE5NmM4ZCAweDIyOWI3MDZmIDB4OGNmMTRiNTEgMHg0ZmQ2YTNjYyAweDFkNmZjMjU1IDB4MjVlOTk5N2YgMHg2Yzg1ZTNlZSAweDQwMmRiYTQ3IDB4ZmFkMjE3M2UgMHgwOGVmZWEzNSAweGU0YTVhYjU0IDB4ZGMwNjNiMzUgMHgxNGZjMTBlZiAweDRjMTEzZWQ1IDB4NzRhNzI5N2YgMHgxMDVjMTg0ZSAweDgyZjcxYjJkIDB4ZWYwNGY1ZDMgMHgwM2I4MzMyOSAweDNkYmU4MGJkIDB4ZGY1NGU4MmMgMHgwMTBjODI5OSAweDc0MDZhY2QyIDB4YzNlNGIyOTcgLy8gbWV0aG9kICJhc3NldF9jb25maWcodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50MTYsdWludDE2W10sdWludDY0W10sKHVpbnQ2NCx1aW50NjQpW10pdm9pZCIsIG1ldGhvZCAidXBkYXRlX2ludGVyZXN0X3JhdGUodWludDE2KXVpbnQ2NCIsIG1ldGhvZCAiZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZShhZGRyZXNzLHVpbnQ2NCkodWludDY0LHVpbnQ2NCwodWludDY0LHVpbnQ2NCkpIiwgbWV0aG9kICJnZXRfcGF5bWVudF9hbW91bnQoYWRkcmVzcykodWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImdldF9jb3Vwb25zX3N0YXR1cygpKHVpbnQ2NCx1aW50NjQsdWludDY0LCh1aW50NjQsdWludDY0KSxib29sKSIsIG1ldGhvZCAiZ2V0X3RpbWVfcGVyaW9kcygpKHVpbnQ2NCx1aW50NjQpW10iLCBtZXRob2QgInBheV9jb3Vwb24oYWRkcmVzcyxieXRlW10pKHVpbnQ2NCx1aW50NjQsYnl0ZVtdKSIsIG1ldGhvZCAiYXNzZXRfdHJhbnNmZXIoYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInNldF9zZWNvbmRhcnlfdGltZV9ldmVudHModWludDY0W10pKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJzZXRfZGVmYXVsdF9zdGF0dXMoYm9vbCl1aW50NjQiLCBtZXRob2QgInByaW1hcnlfZGlzdHJpYnV0aW9uKGFkZHJlc3MsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X2luZm8oKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDgsdWludDE2LHVpbnQxNix1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxib29sLHVpbnQ4KSIsIG1ldGhvZCAiZ2V0X3RpbWVfZXZlbnRzKCl1aW50NjRbXSIsIG1ldGhvZCAiZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGUoKXVpbnQ2NFtdIiwgbWV0aG9kICJnZXRfYXNzZXRfbWV0YWRhdGEoKSh1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCxieXRlWzMyXSxzdHJpbmcpIiwgbWV0aG9kICJhY2NvdW50X2dvdl9zdXNwZW5zaW9uKGFkZHJlc3MsYm9vbCl1aW50NjQiLCBtZXRob2QgImFjY291bnRfb3BlbihhZGRyZXNzLGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X2Nsb3NlKGFkZHJlc3MpKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJhY2NvdW50X3VwZGF0ZV9wYXltZW50X2FkZHJlc3MoYWRkcmVzcyxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAiYWNjb3VudF9nZXRfaW5mbyhhZGRyZXNzKShhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LGJvb2wpIiwgbWV0aG9kICJyYmFjX3JvdGF0ZV9hcnJhbmdlcihhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19zZXRfb3BfZGFlbW9uKGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX2Fzc2lnbl9yb2xlKHVpbnQ4LGFkZHJlc3MsYnl0ZVtdKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19yZXZva2Vfcm9sZSh1aW50OCxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19nb3ZfYXNzZXRfc3VzcGVuc2lvbihib29sKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19nZXRfYXJyYW5nZXIoKWFkZHJlc3MiLCBtZXRob2QgInJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXMoYWRkcmVzcykoYm9vbCxib29sLGJvb2wsYm9vbCxib29sKSIsIG1ldGhvZCAicmJhY19nZXRfcm9sZV9jb25maWcodWludDgsYWRkcmVzcykodWludDY0LHVpbnQ2NCkiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBhc3NldF9jb25maWcgdXBkYXRlX2ludGVyZXN0X3JhdGUgZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZSBnZXRfcGF5bWVudF9hbW91bnQgZ2V0X2NvdXBvbnNfc3RhdHVzIGdldF90aW1lX3BlcmlvZHMgcGF5X2NvdXBvbiBhc3NldF90cmFuc2ZlciBzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzIHNldF9kZWZhdWx0X3N0YXR1cyBwcmltYXJ5X2Rpc3RyaWJ1dGlvbiBnZXRfYXNzZXRfaW5mbyBnZXRfdGltZV9ldmVudHMgZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGUgZ2V0X2Fzc2V0X21ldGFkYXRhIGFjY291bnRfZ292X3N1c3BlbnNpb24gYWNjb3VudF9vcGVuIGFjY291bnRfY2xvc2UgYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzIGFjY291bnRfZ2V0X2luZm8gcmJhY19yb3RhdGVfYXJyYW5nZXIgcmJhY19zZXRfb3BfZGFlbW9uIHJiYWNfYXNzaWduX3JvbGUgcmJhY19yZXZva2Vfcm9sZSByYmFjX2dvdl9hc3NldF9zdXNwZW5zaW9uIHJiYWNfZ2V0X2FycmFuZ2VyIHJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXMgcmJhY19nZXRfcm9sZV9jb25maWcKICAgIGVycgoKbWFpbl9jcmVhdGVfTm9PcEAzNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxNS0yOAogICAgLy8gY2xhc3MgUGVycGV0dWFsQm9uZCgKICAgIC8vICAgICBQQk5Db3JlTWl4aW4sCiAgICAvLyAgICAgUGVycGV0dWFsQ291cG9uQ2FzaGZsb3dNaXhpbiwKICAgIC8vICAgICBOb1ByaW5jaXBhbFBheW1lbnRNaXhpbiwKICAgIC8vICAgICBDb3Vwb25QYXltZW50QWdlbnRNaXhpbiwKICAgIC8vICAgICBDb3Vwb25UcmFuc2ZlckFnZW50TWl4aW4sCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyAgICAgYXZtX3ZlcnNpb249MTIsCiAgICAvLyApOgogICAgcHVzaGJ5dGVzIDB4M2YwZWZjNmMgLy8gbWV0aG9kICJhc3NldF9jcmVhdGUoYWRkcmVzcywodWludDgsdWludDgsdWludDgsdWludDgsdWludDgsdWludDgsYnl0ZVszMl0sc3RyaW5nKSl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggYXNzZXRfY3JlYXRlCiAgICBlcnIKCm1haW5fYXNzZXRfdXBkYXRlX3JvdXRlQDQ6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyNzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgNCAvLyBVcGRhdGVBcHBsaWNhdGlvbgogICAgPT0KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0CiAgICBiIGFzc2V0X3VwZGF0ZQoKCi8vIG1vZHVsZXMuYWN0dXMucGJuLlBCTkNvcmVNaXhpbi5hc3NldF9jb25maWdbcm91dGluZ10oKSAtPiB2b2lkOgphc3NldF9jb25maWc6CiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIG1vZHVsZXMvYWN0dXMvcGJuLnB5OjMyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNwogICAgZHVwCiAgICBjb3ZlciA3CiAgICBsZW4KICAgIHB1c2hpbnQgMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50MTYKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDgKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgOAogICAgcHVzaGludCAyCiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIHN3YXAKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDE2PgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOQogICAgZHVwCiAgICBjb3ZlciA3CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGNvdmVyIDgKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIHN3YXAKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PHVpbnQ2ND4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEwCiAgICBkdXAKICAgIGNvdmVyIDcKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgOAogICAgcHVzaGludCAxNgogICAgKgogICAgcHVzaGludCAyCiAgICArCiAgICBzd2FwCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTx0dXBsZTx1aW50NjQsdWludDY0Pj4KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjIyNwogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MjI4CiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgPT0gZW51bXMuU1RBVFVTX0lOQUNUSVZFLCBlcnIuQUxSRUFEWV9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBELUFTQSBhbHJlYWR5IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjU1LTU2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIGRlbm9taW5hdGlvbiB3aXRoIEFTQQogICAgLy8gX2NyZWF0b3IsIGV4aXN0cyA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X2NyZWF0b3IoZGVub21pbmF0aW9uX2Fzc2V0X2lkKQogICAgZGlnIDUKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjU3CiAgICAvLyBhc3NlcnQgZXhpc3RzLCBlcnIuSU5WQUxJRF9ERU5PTUlOQVRJT04KICAgIGFzc2VydCAvLyBEZW5vbWluYXRpb24gYXNzZXQgaXMgbm90IHByb3Blcmx5IHNldAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NjAKICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICBieXRlYyAyNCAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgZGlnIDYKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo2NQogICAgLy8gc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgZGlnIDQKICAgIHVuY292ZXIgNgogICAgPT0KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjYzLTY2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc2V0dGxlbWVudCBhc3NldCBpcyB0aGUgZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQgPT0gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIC8vICksIGVyci5JTlZBTElEX1NFVFRMRU1FTlRfQVNTRVQKICAgIGFzc2VydCAvLyBEaWZmZXJlbnQgc2V0dGxlbWVudCBhc3NldCBub3Qgc3VwcG9ydGVkLCBtdXN0IGJlIGVxdWFsIHRvIGRlbm9taW5hdGlvbiBhc3NldAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NjkKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCA9IHNldHRsZW1lbnRfYXNzZXRfaWQKICAgIGJ5dGVjIDE0IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgZGlnIDUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3MC03NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhc3NldF9hbW91bnQ9MCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NzUKICAgIC8vIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3MwogICAgLy8gYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3NAogICAgLy8gYXNzZXRfYW1vdW50PTAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICB1bmNvdmVyIDUKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3MC03MQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3MC03NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhc3NldF9hbW91bnQ9MCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjIzOC0yMzkKICAgIC8vICMgU2V0IFByaW5jaXBhbCBhbmQgTWluaW11bSBEZW5vbWluYXRpb24KICAgIC8vIGFzc2VydCBwcmluY2lwYWwgJSBtaW5pbXVtX2Rlbm9taW5hdGlvbiA9PSAwLCBlcnIuSU5WQUxJRF9NSU5JTVVNX0RFTk9NSU5BVElPTgogICAgZGlnIDMKICAgIGRpZyAyCiAgICAlCiAgICAhCiAgICBhc3NlcnQgLy8gTWluaW11bSBkZW5vbWluYXRpb24gaXMgbm90IGEgZGl2aXNvciBvZiBwcmluY2lwYWwKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI0MAogICAgLy8gc2VsZi51bml0X3ZhbHVlID0gbWluaW11bV9kZW5vbWluYXRpb24KICAgIGJ5dGVjIDcgLy8gInVuaXRfdmFsdWUiCiAgICBkaWcgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI0MQogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IHByaW5jaXBhbCAvLyBtaW5pbXVtX2Rlbm9taW5hdGlvbgogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIC8KICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyNDIKICAgIC8vIHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50ID0gcHJpbmNpcGFsX2Rpc2NvdW50CiAgICBieXRlYyAyNiAvLyAicHJpbmNpcGFsX2Rpc2NvdW50IgogICAgdW5jb3ZlciAyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MjQ0LTI0NQogICAgLy8gIyBTZXQgRGF5LUNvdW50IENvbnZlbnRpb24KICAgIC8vIHNlbGYuYXNzZXJ0X2RheV9jb3VudF9jb252ZW50aW9uKGRheV9jb3VudF9jb252ZW50aW9uLmFzX3VpbnQ2NCgpKQogICAgYnRvaQogICAgZHVwCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3OS04MwogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIG9ubHkgdGhlIEFjdHVhbC9BY3R1YWwgYW5kIENvbnRpbnVvdXMgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0FfQSksCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQ09OVCksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9EQVlfQ09VTlRfQ09OVkVOVElPTgogICAgYnogYXNzZXRfY29uZmlnX2Jvb2xfdHJ1ZUAzCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjgyCiAgICAvLyBVSW50NjQoY3N0LkRDQ19DT05UKSwKICAgIHB1c2hpbnQgMjU1CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3OS04MwogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIG9ubHkgdGhlIEFjdHVhbC9BY3R1YWwgYW5kIENvbnRpbnVvdXMgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0FfQSksCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQ09OVCksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9EQVlfQ09VTlRfQ09OVkVOVElPTgogICAgPT0KICAgIGJ6IGFzc2V0X2NvbmZpZ19ib29sX2ZhbHNlQDQKCmFzc2V0X2NvbmZpZ19ib29sX3RydWVAMzoKICAgIGludGNfMSAvLyAxCgphc3NldF9jb25maWdfYm9vbF9tZXJnZUA1OgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NzktODMKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBvbmx5IHRoZSBBY3R1YWwvQWN0dWFsIGFuZCBDb250aW51b3VzIGRheS1jb3VudCBjb252ZW50aW9ucwogICAgLy8gYXNzZXJ0IGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19BX0EpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0NPTlQpLAogICAgLy8gKSwgZXJyLklOVkFMSURfREFZX0NPVU5UX0NPTlZFTlRJT04KICAgIGFzc2VydCAvLyBJbnZhbGlkIGRheS1jb3VudCBjb252ZW50aW9uIElECiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo4NgogICAgLy8gc2VsZi5kYXlfY291bnRfY29udmVudGlvbiA9IGRheV9jb3VudF9jb252ZW50aW9uCiAgICBieXRlYyAxNSAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI0OC0yNDkKICAgIC8vICMgU2V0IEludGVyZXN0IFJhdGUKICAgIC8vIHNlbGYuYXNzZXJ0X2ludGVyZXN0X3JhdGUoaW50ZXJlc3RfcmF0ZS5hc191aW50NjQoKSkKICAgIGRpZyA2CiAgICBidG9pCiAgICBidXJ5IDgKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5Ojg5LTkwCiAgICAvLyAjIFRoaXMgc3Vicm91dGluZSBtdXN0IGJlIHVzZWQgYWZ0ZXIgdGhlIHByaW5jaXBhbCBkaXNjb3VudCBoYXMgYmVlbiBzZXQKICAgIC8vIGlmIG5vdCBzZWxmLnByaW5jaXBhbF9kaXNjb3VudDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNiAvLyAicHJpbmNpcGFsX2Rpc2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW5jaXBhbF9kaXNjb3VudCBleGlzdHMKICAgIGJueiBhc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo5MQogICAgLy8gYXNzZXJ0IGludGVyZXN0X3JhdGUgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0lOVEVSRVNUX1JBVEUKICAgIGRpZyA3CiAgICBhc3NlcnQgLy8gSW50ZXJlc3QgcmF0ZSBpcyBub3QgcHJvcGVybHkgZGVmaW5lZAoKYXNzZXRfY29uZmlnX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5Ojk0CiAgICAvLyBzZWxmLmludGVyZXN0X3JhdGUgPSBpbnRlcmVzdF9yYXRlCiAgICBieXRlYyA1IC8vICJpbnRlcmVzdF9yYXRlIgogICAgZGlnIDgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo5NwogICAgLy8gYXNzZXJ0IG5vdCBjb3Vwb25fcmF0ZXMubGVuZ3RoLCBlcnIuSU5WQUxJRF9DT1VQT05fUkFURVMKICAgIGRpZyA1CiAgICBkdXAKICAgICEKICAgIGFzc2VydCAvLyBDb3Vwb24gcmF0ZXMgYXJlIG5vdCBwcm9wZXJseSBkZWZpbmVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMDAKICAgIC8vIHNlbGYudG90YWxfY291cG9ucyA9IGNvdXBvbl9yYXRlcy5sZW5ndGgKICAgIGJ5dGVjIDMxIC8vICJ0b3RhbF9jb3Vwb25zIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzL3Bibi5weToxOAogICAgLy8gdGltZV9ldmVudHMubGVuZ3RoID09IHNlbGYudG90YWxfY291cG9ucyArIDMKICAgIHB1c2hpbnQgMwogICAgKwogICAgZGlnIDQKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzL3Bibi5weToxNi0xOQogICAgLy8gIyBQQk4gaGFzIG5vIG1hdHVyaXR5IGRhdGUgaW4gdGhlIHN0YXRpYyBzY2hlZHVsZQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICB0aW1lX2V2ZW50cy5sZW5ndGggPT0gc2VsZi50b3RhbF9jb3Vwb25zICsgMwogICAgLy8gKSwgZXJyLklOVkFMSURfVElNRV9FVkVOVFNfTEVOR1RICiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbGVuZ3RoIGlzIGludmFsaWQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI1OAogICAgLy8gc2VsZi5hc3NlcnRfdGltZV9ldmVudHNfc29ydGVkKHRpbWVfZXZlbnRzKQogICAgZGlnIDQKICAgIGNhbGxzdWIgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZAogICAgLy8gbW9kdWxlcy9hY3R1cy9wYm4ucHk6MjIKICAgIC8vIHNlbGYudGltZV9ldmVudHMudmFsdWUgPSB0aW1lX2V2ZW50cy5jb3B5KCkKICAgIGJ5dGVjIDMyIC8vIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgMzIgLy8gMHg3NDY5NmQ2NTQ1NzY2NTZlNzQ3MwogICAgZGlnIDEKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXMvcGJuLnB5OjIzLTI1CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyBdCiAgICBkdXAKICAgIHB1c2hpbnQgMgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvYWN0dXMvcGJuLnB5OjIzCiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgYnl0ZWMgOCAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgLy8gbW9kdWxlcy9hY3R1cy9wYm4ucHk6MjMtMjUKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlID0gdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX09QRU5JTkdfREFURV9JRFgKICAgIC8vIF0KICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzL3Bibi5weToyNi0yOAogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgPSB0aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gXQogICAgZHVwCiAgICBwdXNoaW50IDEwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1cy9wYm4ucHk6MjYKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlID0gdGltZV9ldmVudHNbCiAgICBieXRlYyAyNyAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIgogICAgLy8gbW9kdWxlcy9hY3R1cy9wYm4ucHk6MjYtMjgKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlID0gdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX0NMT1NVUkVfREFURV9JRFgKICAgIC8vIF0KICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBwdXNoaW50IDE4CiAgICAvLyBtb2R1bGVzL2FjdHVzL3Bibi5weToyOQogICAgLy8gc2VsZi5pc3N1YW5jZV9kYXRlID0gdGltZV9ldmVudHNbY2ZnLklTU1VBTkNFX0RBVEVfSURYXQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjXzMgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1cy9wYm4ucHk6MzAKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgMTAgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjM0MC0zNDEKICAgIC8vICMgVGhlIHBlcnBldHVhbCBib25kIGRlZmluZXMgYSBzaW5nbGUgdGltZSBwZXJpb2QgZm9yIHRoZSBjb3Vwb24gZHVyYXRpb24gd2l0aCB1bmxpbWl0ZWQgcmVwZXRpdGlvbnMKICAgIC8vIGFzc2VydCB0aW1lX3BlcmlvZHMubGVuZ3RoID09IFVJbnQ2NCgxKSwgZXJyLklOVkFMSURfVElNRV9QRVJJT0RTCiAgICBkaWcgMQogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gVGltZSBwZXJpb2RzIGFyZSBub3QgcHJvcGVybHkgZGVmaW5lZAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MzQyCiAgICAvLyBjb3Vwb25fcGVyaW9kX2R1cmF0aW9uID0gdGltZV9wZXJpb2RzWzBdWzBdCiAgICBkaWcgMgogICAgZHVwCiAgICBleHRyYWN0IDIgMTYKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjM0NAogICAgLy8gYXNzZXJ0IGNvdXBvbl9wZXJpb2RfZHVyYXRpb24gPiBVSW50NjQoMCksIGVyci5JTlZBTElEX1RJTUVfUEVSSU9EX0RVUkFUSU9OCiAgICBzd2FwCiAgICBhc3NlcnQgLy8gVGltZSBwZXJpb2QgZHVyYXRpb25zIG11c3QgYmUgc3RyaWN0bHkgZ3JlYXRlciB0aGFuIHplcm8KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjM0NQogICAgLy8gYXNzZXJ0IHJlcGV0aXRpb25zID09IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfVElNRV9QRVJJT0RfUkVQRVRJVElPTlMKICAgICEKICAgIGFzc2VydCAvLyBUaW1lIHBlcmlvZCByZXBldGl0aW9ucyBhcmUgbm90IHByb3Blcmx5IGRlZmluZWQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjM0OAogICAgLy8gc2VsZi50aW1lX3BlcmlvZHMudmFsdWUgPSB0aW1lX3BlcmlvZHMuY29weSgpCiAgICBieXRlYyAyOSAvLyAweDc0Njk2ZDY1NTA2NTcyNjk2ZjY0NzMKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgMjkgLy8gMHg3NDY5NmQ2NTUwNjU3MjY5NmY2NDczCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTozNDkKICAgIC8vIHNlbGYuY291cG9uX3BlcmlvZCA9IHNlbGYudGltZV9wZXJpb2RzLnZhbHVlWzBdWzBdCiAgICBieXRlYyAyOSAvLyAweDc0Njk2ZDY1NTA2NTcyNjk2ZjY0NzMKICAgIHB1c2hpbnRzIDIgMTYKICAgIGJveF9leHRyYWN0CiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDE3IC8vICJjb3Vwb25fcGVyaW9kIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI2NQogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX0FDVElWRSkKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgMTAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1cy9wYm4ucHk6MzIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKYXNzZXRfY29uZmlnX2Jvb2xfZmFsc2VANDoKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2V0X2NvbmZpZ19ib29sX21lcmdlQDUKCgovLyBtb2R1bGVzLmFjdHVzLnBibi5QQk5Db3JlTWl4aW4udXBkYXRlX2ludGVyZXN0X3JhdGVbcm91dGluZ10oKSAtPiB2b2lkOgp1cGRhdGVfaW50ZXJlc3RfcmF0ZToKICAgIC8vIG1vZHVsZXMvYWN0dXMvcGJuLnB5Ojg5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDE2CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODAKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmludGVyZXN0X29yYWNsZSwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDE4IC8vIDB4NTIzODMwMjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXMvcGJuLnB5OjEwNwogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzL3Bibi5weToxMDgKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY3R1cy9wYm4ucHk6MTA5CiAgICAvLyBkdWVfY291cG9ucyA9IHNlbGYuY291bnRfZHVlX2NvdXBvbnMoKQogICAgY2FsbHN1YiBjb3VudF9kdWVfY291cG9ucwogICAgLy8gbW9kdWxlcy9hY3R1cy9wYm4ucHk6MTEwCiAgICAvLyBhc3NlcnQgc2VsZi5hbGxfZHVlX2NvdXBvbnNfcGFpZChkdWVfY291cG9ucyksIGVyci5QRU5ESU5HX0NPVVBPTl9QQVlNRU5UCiAgICBjYWxsc3ViIGFsbF9kdWVfY291cG9uc19wYWlkCiAgICBhc3NlcnQgLy8gUGVuZGluZyBkdWUgY291cG9uIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvYWN0dXMvcGJuLnB5OjExMi0xMTMKICAgIC8vICMgVXBkYXRlIGludGVyZXN0IHJhdGUKICAgIC8vIHNlbGYuaW50ZXJlc3RfcmF0ZSA9IGludGVyZXN0X3JhdGUuYXNfdWludDY0KCkKICAgIGJ0b2kKICAgIGJ5dGVjIDUgLy8gImludGVyZXN0X3JhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1cy9wYm4ucHk6MTE0CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWN0dXMvcGJuLnB5Ojg5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmNvcmVfZmluYW5jaWFsLmNvdXBvbi5QZXJwZXR1YWxDb3Vwb25DYXNoZmxvd01peGluLmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlOgogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiA0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0MTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0MzgKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOCAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQzOC00MzkKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIGJ6IGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUA0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0MzkKICAgIC8vIGFuZCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDggLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICA+PQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NDM4LTQzOQogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIGFuZCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgYnogZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDQKICAgIGludGNfMSAvLyAxCgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfbWVyZ2VANToKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQzNy00NDAKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vICAgICBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vICksIGVyci5OT19QUklNQVJZX0RJU1RSSUJVVElPTgogICAgYXNzZXJ0IC8vIFByaW1hcnkgZGlzdHJpYnV0aW9uIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozMQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgOQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NDQyCiAgICAvLyBhc3NlcnQgMCA8IHVuaXRzIDw9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLCBlcnIuSU5WQUxJRF9VTklUUwogICAgZHVwCiAgICBieiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VAOAogICAgZGlnIDcKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzIgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMQogICAgPj0KICAgIGJ6IGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUA4CiAgICBpbnRjXzEgLy8gMQoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX21lcmdlQDk6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0NDIKICAgIC8vIGFzc2VydCAwIDwgdW5pdHMgPD0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMsIGVyci5JTlZBTElEX1VOSVRTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhbW91bnQgb2YgdW5pdHMgZm9yIHRoZSBhY2NvdW50CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0NDQtNDQ1CiAgICAvLyAjIFZhbHVlIGR1cmluZyBwcmltYXJ5IGRpc3RyaWJ1dGlvbgogICAgLy8gYWNjb3VudF91bml0c19ub21pbmFsX3ZhbHVlID0gc2VsZi5hY2NvdW50X3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcywgdW5pdHMpCiAgICBkaWcgMQogICAgZHVwCiAgICBkaWcgMgogICAgY2FsbHN1YiBhY2NvdW50X3VuaXRzX3ZhbHVlCiAgICBidXJ5IDgKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQ0Ni00NDcKICAgIC8vICMgQWNjcnVpbmcgaW50ZXJlc3QgZHVyaW5nIHByaW1hcnkgZGlzdHJpYnV0aW9uCiAgICAvLyBhY2NydWVkX2ludGVyZXN0ID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDcKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQ0OAogICAgLy8gbnVtZXJhdG9yID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQ0OQogICAgLy8gZGVub21pbmF0b3IgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NDUxLTQ1MgogICAgLy8gIyBBY2NydWluZyBpbnRlcmVzdAogICAgLy8gZHVlX2NvdXBvbnMgPSBzZWxmLmNvdW50X2R1ZV9jb3Vwb25zKCkKICAgIGNhbGxzdWIgY291bnRfZHVlX2NvdXBvbnMKICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0NTMKICAgIC8vIHNlbGYuYXNzZXJ0X25vX3BlbmRpbmdfY291cG9uX3BheW1lbnQoaG9sZGluZ19hZGRyZXNzLCBkdWVfY291cG9ucykKICAgIHN3YXAKICAgIGRpZyAxCiAgICBjYWxsc3ViIGFzc2VydF9ub19wZW5kaW5nX2NvdXBvbl9wYXltZW50CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0NTQKICAgIC8vIGlmIHNlbGYuaXNfYWNjcnVpbmdfaW50ZXJlc3QoZHVlX2NvdXBvbnMpOgogICAgY2FsbHN1YiBpc19hY2NydWluZ19pbnRlcmVzdAogICAgYnogZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0NTUKICAgIC8vIGRheV9jb3VudF9mYWN0b3IgPSBzZWxmLmRheV9jb3VudF9mYWN0b3IoZHVlX2NvdXBvbnMpCiAgICBkaWcgMwogICAgZHVwCiAgICBjYWxsc3ViIGRheV9jb3VudF9mYWN0b3IKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQ1Ni00NTgKICAgIC8vIGFjY3J1ZWRfaW50ZXJlc3QgPSBzZWxmLmFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50KAogICAgLy8gICAgIGhvbGRpbmdfYWRkcmVzcywgdW5pdHMsIGR1ZV9jb3Vwb25zCiAgICAvLyApCiAgICBkaWcgMwogICAgZGlnIDMKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBhY2NydWVkX2ludGVyZXN0X2Ftb3VudAogICAgYnVyeSA3CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0NTkKICAgIC8vIG51bWVyYXRvciA9IGRheV9jb3VudF9mYWN0b3IubnVtZXJhdG9yCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnVyeSA0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0NjAKICAgIC8vIGRlbm9taW5hdG9yID0gZGF5X2NvdW50X2ZhY3Rvci5kZW5vbWluYXRvcgogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBidXJ5IDUKCmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQ2NS00NjgKICAgIC8vIGRheV9jb3VudF9mYWN0b3I9dHlwLkRheUNvdW50RmFjdG9yKAogICAgLy8gICAgIG51bWVyYXRvcj1udW1lcmF0b3IsCiAgICAvLyAgICAgZGVub21pbmF0b3I9ZGVub21pbmF0b3IsCiAgICAvLyApLAogICAgZGlnIDIKICAgIGl0b2IKICAgIGRpZyA1CiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQ2Mi00NjkKICAgIC8vIHJldHVybiB0eXAuQ3VycmVudFVuaXRzVmFsdWUoCiAgICAvLyAgICAgdW5pdHNfdmFsdWU9YWNjb3VudF91bml0c19ub21pbmFsX3ZhbHVlLAogICAgLy8gICAgIGFjY3J1ZWRfaW50ZXJlc3Q9YWNjcnVlZF9pbnRlcmVzdCwKICAgIC8vICAgICBkYXlfY291bnRfZmFjdG9yPXR5cC5EYXlDb3VudEZhY3RvcigKICAgIC8vICAgICAgICAgbnVtZXJhdG9yPW51bWVyYXRvciwKICAgIC8vICAgICAgICAgZGVub21pbmF0b3I9ZGVub21pbmF0b3IsCiAgICAvLyAgICAgKSwKICAgIC8vICkKICAgIGRpZyA3CiAgICBpdG9iCiAgICBkaWcgNwogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VAODoKICAgIGludGNfMCAvLyAwCiAgICBiIGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9tZXJnZUA5CgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VANDoKICAgIGludGNfMCAvLyAwCiAgICBiIGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9tZXJnZUA1CgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb3Vwb24uUGVycGV0dWFsQ291cG9uQ2FzaGZsb3dNaXhpbi5nZXRfcGF5bWVudF9hbW91bnRbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfcGF5bWVudF9hbW91bnQ6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0NzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZGlnIDEKICAgIGNvbmNhdAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NDg3CiAgICAvLyBzZWxmLmFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzKQogICAgY2FsbHN1YiBhY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0ODgKICAgIC8vICogc2VsZi5pbnRlcmVzdF9yYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9yYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NDg3LTQ4OAogICAgLy8gc2VsZi5hY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcykKICAgIC8vICogc2VsZi5pbnRlcmVzdF9yYXRlCiAgICAqCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0ODkKICAgIC8vIC8vIGNzdC5CUFMKICAgIGludGMgNCAvLyAxMDAwMAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NDg3LTQ4OQogICAgLy8gc2VsZi5hY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcykKICAgIC8vICogc2VsZi5pbnRlcmVzdF9yYXRlCiAgICAvLyAvLyBjc3QuQlBTCiAgICAvCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0OTEtNDk0CiAgICAvLyByZXR1cm4gdHlwLlBheW1lbnRBbW91bnRzKAogICAgLy8gICAgIGludGVyZXN0PWludGVyZXN0X2Ftb3VudCwKICAgIC8vICAgICBwcmluY2lwYWw9VUludDY0KDApLAogICAgLy8gKQogICAgaXRvYgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NDkzCiAgICAvLyBwcmluY2lwYWw9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQ5MS00OTQKICAgIC8vIHJldHVybiB0eXAuUGF5bWVudEFtb3VudHMoCiAgICAvLyAgICAgaW50ZXJlc3Q9aW50ZXJlc3RfYW1vdW50LAogICAgLy8gICAgIHByaW5jaXBhbD1VSW50NjQoMCksCiAgICAvLyApCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQ3MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb3Vwb24uUGVycGV0dWFsQ291cG9uQ2FzaGZsb3dNaXhpbi5nZXRfY291cG9uc19zdGF0dXNbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfY291cG9uc19zdGF0dXM6CiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gNAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gZW5tLlNUQVRVU19BQ1RJVkUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCAxMDAKICAgID09CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo1MDUKICAgIC8vIGR1ZV9jb3Vwb25zID0gc2VsZi5jb3VudF9kdWVfY291cG9ucygpIGlmIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpIGVsc2UgVUludDY0KCkKICAgIGJ6IGdldF9jb3Vwb25zX3N0YXR1c190ZXJuYXJ5X2ZhbHNlQDMKICAgIGNhbGxzdWIgY291bnRfZHVlX2NvdXBvbnMKICAgIGJ1cnkgMwoKZ2V0X2NvdXBvbnNfc3RhdHVzX3Rlcm5hcnlfbWVyZ2VANDoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjM2OQogICAgLy8gcmV0dXJuIHNlbGYuY291cG9uX2R1ZV9kYXRlKGR1ZV9jb3Vwb25zICsgMSkKICAgIGRpZyAyCiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBjYWxsc3ViIGNvdXBvbl9kdWVfZGF0ZQogICAgYnVyeSAzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo1MDcKICAgIC8vIGFsbF9kdWVfY291cG9uc19wYWlkID0gc2VsZi5hbGxfZHVlX2NvdXBvbnNfcGFpZChkdWVfY291cG9ucykKICAgIGR1cAogICAgY2FsbHN1YiBhbGxfZHVlX2NvdXBvbnNfcGFpZAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo1MDgKICAgIC8vIG51bWVyYXRvciA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAyCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo1MDkKICAgIC8vIGRlbm9taW5hdG9yID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDUKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjUxMAogICAgLy8gaWYgc2VsZi5pc19hY2NydWluZ19pbnRlcmVzdChkdWVfY291cG9ucyk6CiAgICBjYWxsc3ViIGlzX2FjY3J1aW5nX2ludGVyZXN0CiAgICBieiBnZXRfY291cG9uc19zdGF0dXNfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo1MTEKICAgIC8vIGRheV9jb3VudF9mYWN0b3IgPSBzZWxmLmRheV9jb3VudF9mYWN0b3IoZHVlX2NvdXBvbnMpCiAgICBkaWcgMgogICAgY2FsbHN1YiBkYXlfY291bnRfZmFjdG9yCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo1MTIKICAgIC8vIG51bWVyYXRvciA9IGRheV9jb3VudF9mYWN0b3IubnVtZXJhdG9yCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnVyeSAyCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo1MTMKICAgIC8vIGRlbm9taW5hdG9yID0gZGF5X2NvdW50X2ZhY3Rvci5kZW5vbWluYXRvcgogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBidXJ5IDQKCmdldF9jb3Vwb25zX3N0YXR1c19hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo1MTUKICAgIC8vIHRvdGFsX2NvdXBvbnM9c2VsZi50b3RhbF9jb3Vwb25zLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDMxIC8vICJ0b3RhbF9jb3Vwb25zIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX2NvdXBvbnMgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo1MTgtNTIxCiAgICAvLyBkYXlfY291bnRfZmFjdG9yPXR5cC5EYXlDb3VudEZhY3RvcigKICAgIC8vICAgICBudW1lcmF0b3I9bnVtZXJhdG9yLAogICAgLy8gICAgIGRlbm9taW5hdG9yPWRlbm9taW5hdG9yLAogICAgLy8gKSwKICAgIGRpZyAxCiAgICBpdG9iCiAgICBkaWcgNQogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo1MTQtNTIzCiAgICAvLyByZXR1cm4gdHlwLkNvdXBvbnNJbmZvKAogICAgLy8gICAgIHRvdGFsX2NvdXBvbnM9c2VsZi50b3RhbF9jb3Vwb25zLAogICAgLy8gICAgIGR1ZV9jb3Vwb25zPWR1ZV9jb3Vwb25zLAogICAgLy8gICAgIG5leHRfY291cG9uX2R1ZV9kYXRlPW5leHRfY291cG9uX2R1ZV9kYXRlLAogICAgLy8gICAgIGRheV9jb3VudF9mYWN0b3I9dHlwLkRheUNvdW50RmFjdG9yKAogICAgLy8gICAgICAgICBudW1lcmF0b3I9bnVtZXJhdG9yLAogICAgLy8gICAgICAgICBkZW5vbWluYXRvcj1kZW5vbWluYXRvciwKICAgIC8vICAgICApLAogICAgLy8gICAgIGFsbF9kdWVfY291cG9uc19wYWlkPWFsbF9kdWVfY291cG9uc19wYWlkLAogICAgLy8gKQogICAgc3dhcAogICAgaXRvYgogICAgZGlnIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZGlnIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlYyAzMCAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgZGlnIDcKICAgIHNldGJpdAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0OTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKZ2V0X2NvdXBvbnNfc3RhdHVzX3Rlcm5hcnlfZmFsc2VAMzoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjUwNQogICAgLy8gZHVlX2NvdXBvbnMgPSBzZWxmLmNvdW50X2R1ZV9jb3Vwb25zKCkgaWYgc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCkgZWxzZSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMwogICAgYiBnZXRfY291cG9uc19zdGF0dXNfdGVybmFyeV9tZXJnZUA0CgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb3Vwb24uUGVycGV0dWFsQ291cG9uQ2FzaGZsb3dNaXhpbi5nZXRfdGltZV9wZXJpb2RzW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X3RpbWVfcGVyaW9kczoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjUzMwogICAgLy8gdGltZV9wZXJpb2RzID0gdHlwLlRpbWVQZXJpb2RzKCkKICAgIGJ5dGVjIDMzIC8vIDB4MDAwMAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gZW5tLlNUQVRVU19BQ1RJVkUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCAxMDAKICAgID09CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo1MzQKICAgIC8vIGlmIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpOgogICAgYnogZ2V0X3RpbWVfcGVyaW9kc19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjUzNQogICAgLy8gdGltZV9wZXJpb2RzID0gc2VsZi50aW1lX3BlcmlvZHMudmFsdWUuY29weSgpCiAgICBieXRlYyAyOSAvLyAweDc0Njk2ZDY1NTA2NTcyNjk2ZjY0NzMKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGJ1cnkgMgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudGltZV9wZXJpb2RzIGV4aXN0cwoKZ2V0X3RpbWVfcGVyaW9kc19hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo1MjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnBheW1lbnRfYWdlbnQuY291cG9uLkNvdXBvblBheW1lbnRBZ2VudE1peGluLnBheV9jb3Vwb25bcm91dGluZ10oKSAtPiB2b2lkOgpwYXlfY291cG9uOgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvdXBvbi5weTozMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gZW5tLlNUQVRVU19BQ1RJVkUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCAxMDAKICAgID09CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTozOQogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQwCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQxCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozMQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NDQKICAgIC8vIHVuaXRzID0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMKICAgIGR1cAogICAgYm94X2dldAogICAgcG9wCiAgICBpbnRjXzIgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQ1CiAgICAvLyBhc3NlcnQgdW5pdHMgPiAwLCBlcnIuTk9fVU5JVFMKICAgIGFzc2VydCAvLyBObyBELUFTQSB1bml0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NDcKICAgIC8vIGR1ZV9jb3Vwb25zID0gc2VsZi5jb3VudF9kdWVfY291cG9ucygpCiAgICBjYWxsc3ViIGNvdW50X2R1ZV9jb3Vwb25zCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0OAogICAgLy8gYWNjb3VudF9wYWlkX2NvdXBvbnMgPSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMKICAgIHN3YXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQ4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NDkKICAgIC8vIGFzc2VydCBkdWVfY291cG9ucyA+IGFjY291bnRfcGFpZF9jb3Vwb25zLCBlcnIuTk9fRFVFX0NPVVBPTgogICAgc3dhcAogICAgZGlnIDEKICAgID4KICAgIGFzc2VydCAvLyBObyBkdWUgY291cG9uIHRvIHBheQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NTAtNTMKICAgIC8vICMgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zIHZlcmlmeSBpZiBvdGhlciBhY2NvdW50cyBhcmUgc3RpbGwgd2FpdGluZyBmb3IgdGhlIHBheW1lbnQgb2YgcHJldmlvdXMgY291cG9ucwogICAgLy8gYXNzZXJ0IHNlbGYuYWxsX2R1ZV9jb3Vwb25zX3BhaWQoCiAgICAvLyAgICAgYWNjb3VudF9wYWlkX2NvdXBvbnMKICAgIC8vICksIGVyci5QRU5ESU5HX0NPVVBPTl9QQVlNRU5UCiAgICBjYWxsc3ViIGFsbF9kdWVfY291cG9uc19wYWlkCiAgICBhc3NlcnQgLy8gUGVuZGluZyBkdWUgY291cG9uIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQxNAogICAgLy8gc2VsZi5hY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcyksIFVJbnQ2NCgxKQogICAgY2FsbHN1YiBhY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTozNzQKICAgIC8vIHJldHVybiBwcmluY2lwYWxfYW1vdW50ICogc2VsZi5pbnRlcmVzdF9yYXRlIC8vIGNzdC5CUFMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJpbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAqCiAgICBpbnRjIDQgLy8gMTAwMDAKICAgIC8KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MTMKICAgIC8vIGlmIHNlbGYub3BfZGFlbW9uLnZhbHVlICE9IEdsb2JhbC56ZXJvX2FkZHJlc3M6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjEgLy8gMHg1MjMyMzUyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wX2RhZW1vbiBleGlzdHMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGJ6IHBheV9jb3Vwb25fYWZ0ZXJfaWZfZWxzZUAyMgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weToxNQogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIxIC8vIDB4NTIzMjM1MjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcF9kYWVtb24gZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weToxNS0xNwogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICBibnogcGF5X2NvdXBvbl9ib29sX3RydWVAMTkKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MTYKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgNQogICAgPT0KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MTUtMTcKICAgIC8vIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICAvLyBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgYm56IHBheV9jb3Vwb25fYm9vbF90cnVlQDE5CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjE3CiAgICAvLyBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgdHhuIFNlbmRlcgogICAgZGlnIDMKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgMzIKICAgID09CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjE1LTE3CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIGJ6IHBheV9jb3Vwb25fYm9vbF9mYWxzZUAyMAoKcGF5X2NvdXBvbl9ib29sX3RydWVAMTk6CiAgICBpbnRjXzEgLy8gMQoKcGF5X2NvdXBvbl9ib29sX21lcmdlQDIxOgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weToxNC0xOAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyAgICAgb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vICAgICBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgLy8gKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCgpwYXlfY291cG9uX2FmdGVyX2lmX2Vsc2VAMjI6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjIyCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MuaXNfb3B0ZWRfaW4oCiAgICBkaWcgMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCAzMgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weToyMwogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTQgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MjItMjQKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5pc19vcHRlZF9pbigKICAgIC8vICAgICBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQKICAgIC8vICkKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjIyLTI1CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MuaXNfb3B0ZWRfaW4oCiAgICAvLyAgICAgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkCiAgICAvLyApCiAgICAvLyBhbmQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZAogICAgYnogcGF5X2NvdXBvbl9ib29sX2ZhbHNlQDI3CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjI1CiAgICAvLyBhbmQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZAogICAgZGlnIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQ0OAogICAgZ2V0Yml0CiAgICBibnogcGF5X2NvdXBvbl9ib29sX2ZhbHNlQDI3CiAgICBpbnRjXzEgLy8gMQoKcGF5X2NvdXBvbl9ib29sX21lcmdlQDI4OgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvdXBvbi5weTo1NwogICAgLy8gaWYgc2VsZi5pc19wYXltZW50X2V4ZWN1dGFibGUoaG9sZGluZ19hZGRyZXNzKToKICAgIGJ6IHBheV9jb3Vwb25fZWxzZV9ib2R5QDMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MzAKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICBzd2FwCiAgICBkaWcgMQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBvcHRlZCBpbnRvIGFzc2V0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjMwLTMxCiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgLy8gPj0gcGF5bWVudF9hbW91bnQKICAgIGRpZyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgID49CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjI5LTMyCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICAvLyAgICAgPj0gcGF5bWVudF9hbW91bnQKICAgIC8vICksIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcyBmb3IgdGhlIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb3Vwb24ucHk6NjAtNjEKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgdGhlIHNhbWUgYXNzZXQgZm9yIGRlbm9taW5hdGlvbiBhbmQgc2V0dGxlbWVudCwgbm8gY29udmVyc2lvbiBuZWVkZWQKICAgIC8vIHNlbGYucGF5KHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcywgcGF5bWVudF9hbW91bnQpCiAgICBkaWcgNAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCAzMgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weTozNS00MAogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXJlY2VpdmVyLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1hbW91bnQsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MzkKICAgIC8vIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgc3dhcAogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MzUKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MzUtNDAKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1yZWNlaXZlciwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9YW1vdW50LAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAoKcGF5X2NvdXBvbl9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo2MwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGFpZF9jb3Vwb25zICs9IDEKICAgIGRpZyAyCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQ4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIHB1c2hpbnQgNDgKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo2NAogICAgLy8gc2VsZi5wYWlkX2NvdXBvbl91bml0cyArPSB1bml0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI4IC8vICJwYWlkX2NvdXBvbl91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wYWlkX2NvdXBvbl91bml0cyBleGlzdHMKICAgIGRpZyAyCiAgICArCiAgICBieXRlYyAyOCAvLyAicGFpZF9jb3Vwb25fdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvdXBvbi5weToxNwogICAgLy8gY29udHJhY3RfaWQ9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25faWQuaWQsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uSUQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb3Vwb24ucHk6MjAKICAgIC8vIHRpbWU9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY291cG9uLnB5OjIyCiAgICAvLyBjdXJyZW5jeV9pZD1zZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZC5pZCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNCAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb3Vwb24ucHk6MjMKICAgIC8vIGN1cnJlbmN5X3VuaXQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQudW5pdF9uYW1lLAogICAgZHVwCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb3Vwb24ucHk6MjQKICAgIC8vIG5vbWluYWxfdmFsdWU9c2VsZi5jaXJjdWxhdGluZ191bml0cyAqIHNlbGYudW5pdF92YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJ1bml0X3ZhbHVlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnVuaXRfdmFsdWUgZXhpc3RzCiAgICAqCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY291cG9uLnB5OjE2LTI3CiAgICAvLyBFdmVudCgKICAgIC8vICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICB0eXBlPWFyYzQuVUludDgoZW51bXMuRVZUX1RZUEVfSVApLAogICAgLy8gICAgIHR5cGVfbmFtZT1TdHJpbmcoIklQIiksCiAgICAvLyAgICAgdGltZT1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICBwYXlvZmY9cGF5b2ZmLAogICAgLy8gICAgIGN1cnJlbmN5X2lkPXNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkLmlkLAogICAgLy8gICAgIGN1cnJlbmN5X3VuaXQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQudW5pdF9uYW1lLAogICAgLy8gICAgIG5vbWluYWxfdmFsdWU9c2VsZi5jaXJjdWxhdGluZ191bml0cyAqIHNlbGYudW5pdF92YWx1ZSwKICAgIC8vICAgICBub21pbmFsX3JhdGVfYnBzPWFyYzQuVUludDE2KDApLCAgIyBUT0RPOiBBZGQgaW50ZXJlc3QgcmF0ZQogICAgLy8gICAgIG5vbWluYWxfYWNjcnVlZD1VSW50NjQoMCksCiAgICAvLyApCiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIHB1c2hieXRlcyAweDA4MDAzNwogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZGlnIDQKICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHVuY292ZXIgNAogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgMwogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHN3YXAKICAgIHB1c2hieXRlcyAweDAwM2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb3Vwb24ucHk6MjUKICAgIC8vIG5vbWluYWxfcmF0ZV9icHM9YXJjNC5VSW50MTYoMCksICAjIFRPRE86IEFkZCBpbnRlcmVzdCByYXRlCiAgICBieXRlYyAzMyAvLyAweDAwMDAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb3Vwb24ucHk6MTYtMjcKICAgIC8vIEV2ZW50KAogICAgLy8gICAgIGNvbnRyYWN0X2lkPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2lkLmlkLAogICAgLy8gICAgIHR5cGU9YXJjNC5VSW50OChlbnVtcy5FVlRfVFlQRV9JUCksCiAgICAvLyAgICAgdHlwZV9uYW1lPVN0cmluZygiSVAiKSwKICAgIC8vICAgICB0aW1lPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gICAgIHBheW9mZj1wYXlvZmYsCiAgICAvLyAgICAgY3VycmVuY3lfaWQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQuaWQsCiAgICAvLyAgICAgY3VycmVuY3lfdW5pdD1zZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZC51bml0X25hbWUsCiAgICAvLyAgICAgbm9taW5hbF92YWx1ZT1zZWxmLmNpcmN1bGF0aW5nX3VuaXRzICogc2VsZi51bml0X3ZhbHVlLAogICAgLy8gICAgIG5vbWluYWxfcmF0ZV9icHM9YXJjNC5VSW50MTYoMCksICAjIFRPRE86IEFkZCBpbnRlcmVzdCByYXRlCiAgICAvLyAgICAgbm9taW5hbF9hY2NydWVkPVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvdXBvbi5weToyNgogICAgLy8gbm9taW5hbF9hY2NydWVkPVVJbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY291cG9uLnB5OjE2LTI3CiAgICAvLyBFdmVudCgKICAgIC8vICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICB0eXBlPWFyYzQuVUludDgoZW51bXMuRVZUX1RZUEVfSVApLAogICAgLy8gICAgIHR5cGVfbmFtZT1TdHJpbmcoIklQIiksCiAgICAvLyAgICAgdGltZT1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICBwYXlvZmY9cGF5b2ZmLAogICAgLy8gICAgIGN1cnJlbmN5X2lkPXNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkLmlkLAogICAgLy8gICAgIGN1cnJlbmN5X3VuaXQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQudW5pdF9uYW1lLAogICAgLy8gICAgIG5vbWluYWxfdmFsdWU9c2VsZi5jaXJjdWxhdGluZ191bml0cyAqIHNlbGYudW5pdF92YWx1ZSwKICAgIC8vICAgICBub21pbmFsX3JhdGVfYnBzPWFyYzQuVUludDE2KDApLCAgIyBUT0RPOiBBZGQgaW50ZXJlc3QgcmF0ZQogICAgLy8gICAgIG5vbWluYWxfYWNjcnVlZD1VSW50NjQoMCksCiAgICAvLyApCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDAwMDI0OTUwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvdXBvbi5weToxNS0yOAogICAgLy8gYXJjNC5lbWl0KAogICAgLy8gICAgIEV2ZW50KAogICAgLy8gICAgICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICAgICAgdHlwZT1hcmM0LlVJbnQ4KGVudW1zLkVWVF9UWVBFX0lQKSwKICAgIC8vICAgICAgICAgdHlwZV9uYW1lPVN0cmluZygiSVAiKSwKICAgIC8vICAgICAgICAgdGltZT1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICAgICAgcGF5b2ZmPXBheW9mZiwKICAgIC8vICAgICAgICAgY3VycmVuY3lfaWQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQuaWQsCiAgICAvLyAgICAgICAgIGN1cnJlbmN5X3VuaXQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQudW5pdF9uYW1lLAogICAgLy8gICAgICAgICBub21pbmFsX3ZhbHVlPXNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKiBzZWxmLnVuaXRfdmFsdWUsCiAgICAvLyAgICAgICAgIG5vbWluYWxfcmF0ZV9icHM9YXJjNC5VSW50MTYoMCksICAjIFRPRE86IEFkZCBpbnRlcmVzdCByYXRlCiAgICAvLyAgICAgICAgIG5vbWluYWxfYWNjcnVlZD1VSW50NjQoMCksCiAgICAvLyAgICAgKQogICAgLy8gKQogICAgcHVzaGJ5dGVzIDB4OGMyOTkwNGUgLy8gbWV0aG9kICJFdmVudCh1aW50NjQsdWludDgsc3RyaW5nLHVpbnQ2NCx1aW50NjQsdWludDY0LGJ5dGVbXSx1aW50NjQsdWludDE2LHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvdXBvbi5weTo3MAogICAgLy8gdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvdXBvbi5weTo2OC03MgogICAgLy8gcmV0dXJuIHR5cC5QYXltZW50UmVzdWx0KAogICAgLy8gICAgIGFtb3VudD1wYXltZW50X2Ftb3VudCwKICAgIC8vICAgICB0aW1lc3RhbXA9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgY29udGV4dD1wYXltZW50X2luZm8sICAjIFRPRE86IEFkZCBpbmZvIG9uIGZhaWxlZCBwYXltZW50CiAgICAvLyApCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyA0CiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgcHVzaGJ5dGVzIDB4MDAxMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb3Vwb24ucHk6MzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKcGF5X2NvdXBvbl9lbHNlX2JvZHlAMzoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb3Vwb24ucHk6NjMtNjQKICAgIC8vICMgQWNjb3VudHMgc3VzcGVuZGVkIG9yIG5vdCBvcHRlZCBpbiBhdCB0aGUgdGltZSBvZiBwYXltZW50cyBtdXN0IG5vdCBzdGFsbCB0aGUgRC1BU0EKICAgIC8vIHBheW1lbnRfYW1vdW50ID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDEKICAgIGIgcGF5X2NvdXBvbl9hZnRlcl9pZl9lbHNlQDQKCnBheV9jb3Vwb25fYm9vbF9mYWxzZUAyNzoKICAgIGludGNfMCAvLyAwCiAgICBiIHBheV9jb3Vwb25fYm9vbF9tZXJnZUAyOAoKcGF5X2NvdXBvbl9ib29sX2ZhbHNlQDIwOgogICAgaW50Y18wIC8vIDAKICAgIGIgcGF5X2NvdXBvbl9ib29sX21lcmdlQDIxCgoKLy8gbW9kdWxlcy50cmFuc2Zlcl9hZ2VudC5jb3Vwb24uQ291cG9uVHJhbnNmZXJBZ2VudE1peGluLmFzc2V0X3RyYW5zZmVyW3JvdXRpbmddKCkgLT4gdm9pZDoKYXNzZXRfdHJhbnNmZXI6CiAgICBpbnRjXzAgLy8gMAogICAgZHVwbiAyCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC9jb3Vwb24ucHk6OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gZW5tLlNUQVRVU19BQ1RJVkUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCAxMDAKICAgID09CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNTMtMTU4CiAgICAvLyBzZWxmLnN0YXR1c19pc19hY3RpdmUoKQogICAgLy8gYW5kIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIGFuZCAoCiAgICAvLyAgICAgbm90IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIC8vICAgICBvciBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIC8vICkKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VANgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTU0CiAgICAvLyBhbmQgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIDw9CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNTMtMTU4CiAgICAvLyBzZWxmLnN0YXR1c19pc19hY3RpdmUoKQogICAgLy8gYW5kIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIGFuZCAoCiAgICAvLyAgICAgbm90IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIC8vICAgICBvciBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIC8vICkKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VANgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTU2CiAgICAvLyBub3Qgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gInNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTU2LTE1NwogICAgLy8gbm90IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIC8vIG9yIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDwgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgYnogYXNzZXRfdHJhbnNmZXJfYm9vbF90cnVlQDUKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE1NwogICAgLy8gb3IgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICA8CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNTYtMTU3CiAgICAvLyBub3Qgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgLy8gb3IgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICBieiBhc3NldF90cmFuc2Zlcl9ib29sX2ZhbHNlQDYKCmFzc2V0X3RyYW5zZmVyX2Jvb2xfdHJ1ZUA1OgogICAgaW50Y18xIC8vIDEKCmFzc2V0X3RyYW5zZmVyX2Jvb2xfbWVyZ2VANzoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE1Mi0xNTkKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCkKICAgIC8vICAgICBhbmQgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIGFuZCAoCiAgICAvLyAgICAgICAgIG5vdCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICAvLyAgICAgICAgIG9yIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDwgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgLy8gICAgICkKICAgIC8vICksIGVyci5TRUNPTkRBUllfTUFSS0VUX0NMT1NFRAogICAgYXNzZXJ0IC8vIFNlY29uZGFyeSBtYXJrZXQgaXMgY2xvc2VkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNjktMTcxCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gZ3JhbnRzIHRyYW5zZmVyIHJpZ2h0IHRvIEQtQVNBIG93bmVycy4gT3RoZXIgaW1wbGVtZW50YXRpb25zIG1heSByZWxheSBvbiBvdGhlcgogICAgLy8gIyByb2xlcywgZXh0ZXJuYWwgQXBwcyB0aHJvdWdoIEMyQyBjYWxscyAoZS5nLiwgYW4gb3JkZXIgYm9vayksIG9yIG9mZi1jaGFpbiB0cmFuc2ZlciBhZ2VudHMuCiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBzZW5kZXJfaG9sZGluZ19hZGRyZXNzLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNzIKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTczCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozMQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgOQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGRpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDEwCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE3NgogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBkaWcgMwogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNzcKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBkaWcgMQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxOTAKICAgIC8vIGFzc2VydCBzZW5kZXJfaG9sZGluZ19hZGRyZXNzICE9IHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcywgZXJyLlNFTEZfVFJBTlNGRVIKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICAhPQogICAgYXNzZXJ0IC8vIFNlbmRlciBhbmQgcmVjZWl2ZXIgbXVzdCBiZSBkaWZmZXJlbnQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE5MQogICAgLy8gYXNzZXJ0IHVuaXRzID4gMCwgZXJyLk5VTExfVFJBTlNGRVIKICAgIGRpZyAyCiAgICBkdXAKICAgIGFzc2VydCAvLyBUcmFuc2ZlciB1bml0cyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxOTIKICAgIC8vIGFzc2VydCB1bml0cyA8PSBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMsIGVyci5PVkVSX1RSQU5TRkVSCiAgICB1bmNvdmVyIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBkdXAKICAgIGludGNfMiAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIHVuY292ZXIgMgogICAgPj0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgc2VuZGVyIHVuaXRzIHRvIHRyYW5zZmVyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NjMKICAgIC8vIHNlbmRlcl91bml0X3ZhbHVlID0gc2VsZi5hY2NvdW50W3NlbmRlcl0udW5pdF92YWx1ZQogICAgZXh0cmFjdCA0MCA4CiAgICBidXJ5IDkKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo2NAogICAgLy8gaWYgc2VsZi5hY2NvdW50W3JlY2VpdmVyXS51bml0cyA+IFVJbnQ2NCgwKToKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzIgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBieiBhc3NldF90cmFuc2Zlcl9lbHNlX2JvZHlAOQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjU4CiAgICAvLyBzZWxmLmFjY291bnRbc2VuZGVyXS51bml0X3ZhbHVlID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0udW5pdF92YWx1ZQogICAgZGlnIDYKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDYKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo1OC01OQogICAgLy8gc2VsZi5hY2NvdW50W3NlbmRlcl0udW5pdF92YWx1ZSA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnVuaXRfdmFsdWUKICAgIC8vIGFuZCBzZWxmLmFjY291bnRbc2VuZGVyXS5wYWlkX2NvdXBvbnMgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS5wYWlkX2NvdXBvbnMKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VAMjAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo1OQogICAgLy8gYW5kIHNlbGYuYWNjb3VudFtzZW5kZXJdLnBhaWRfY291cG9ucyA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnBhaWRfY291cG9ucwogICAgZGlnIDYKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQ4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDYKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQ4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo1OC01OQogICAgLy8gc2VsZi5hY2NvdW50W3NlbmRlcl0udW5pdF92YWx1ZSA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnVuaXRfdmFsdWUKICAgIC8vIGFuZCBzZWxmLmFjY291bnRbc2VuZGVyXS5wYWlkX2NvdXBvbnMgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS5wYWlkX2NvdXBvbnMKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VAMjAKICAgIGludGNfMSAvLyAxCgphc3NldF90cmFuc2Zlcl9ib29sX21lcmdlQDIxOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjU3LTYwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtzZW5kZXJdLnVuaXRfdmFsdWUgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS51bml0X3ZhbHVlCiAgICAvLyAgICAgYW5kIHNlbGYuYWNjb3VudFtzZW5kZXJdLnBhaWRfY291cG9ucyA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnBhaWRfY291cG9ucwogICAgLy8gKSwgZXJyLk5PTl9GVU5HSUJMRV9VTklUUwogICAgYXNzZXJ0IC8vIFNlbmRlciBhbmQgcmVjZWl2ZXIgdW5pdHMgYXJlIG5vdCBmdW5naWJsZQoKYXNzZXRfdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQvY291cG9uLnB5OjQ2LTQ3CiAgICAvLyAjIFRyYW5zZmVycmVkIHVuaXRzIHZhbHVlIChtdXN0IGJlIGNvbXB1dGVkIGJlZm9yZSB0aGUgdHJhbnNmZXIpCiAgICAvLyBzZW5kZXJfdW5pdF92YWx1ZSA9IHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlCiAgICBkaWcgNgogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCA0MAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgNQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NjktNzAKICAgIC8vICMgVHJhbnNmZXIgaXMgZm9yYmlkZGVuIGluIGNhc2Ugb2YgcGVuZGluZyBjb3Vwb24gcGF5bWVudHMKICAgIC8vIGR1ZV9jb3Vwb25zID0gc2VsZi5jb3VudF9kdWVfY291cG9ucygpCiAgICBjYWxsc3ViIGNvdW50X2R1ZV9jb3Vwb25zCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo3MQogICAgLy8gc2VsZi5hc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudChzZW5kZXJfaG9sZGluZ19hZGRyZXNzLCBkdWVfY291cG9ucykKICAgIGRpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGRpZyAxCiAgICBjYWxsc3ViIGFzc2VydF9ub19wZW5kaW5nX2NvdXBvbl9wYXltZW50CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo3MgogICAgLy8gcmV0dXJuIHNlbGYuYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQoc2VuZGVyX2hvbGRpbmdfYWRkcmVzcywgdW5pdHMsIGR1ZV9jb3Vwb25zKQogICAgc3dhcAogICAgZGlnIDMKICAgIGR1cAogICAgY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIGFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50CiAgICBidXJ5IDcKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3MQogICAgLy8gYXNzZXJ0IHVuaXRzIDw9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLCBlcnIuT1ZFUl9UUkFOU0ZFUgogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzIgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAyCiAgICA8PQogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCBzZW5kZXIgdW5pdHMgdG8gdHJhbnNmZXIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3MgogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMgLT0gdW5pdHMKICAgIHN3YXAKICAgIC0KICAgIGl0b2IKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gMzIKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo1MgogICAgLy8gaWYgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPT0gVUludDY0KDApOgogICAgYm94X2dldAogICAgcG9wCiAgICBpbnRjXzIgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBibnogYXNzZXRfdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAxNgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjUzCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgaXRvYgogICAgZGlnIDcKICAgIGR1cAogICAgY292ZXIgMgogICAgcHVzaGludCA0MAogICAgZGlnIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NTQKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucyA9IFVJbnQ2NCgwKQogICAgcHVzaGludCA0OAogICAgc3dhcAogICAgYm94X3JlcGxhY2UKCmFzc2V0X3RyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMTY6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzYKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzICs9IHVuaXRzCiAgICBkaWcgNQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgaW50Y18yIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgKwogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBpbnRjXzIgLy8gMzIKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQvY291cG9uLnB5OjUzCiAgICAvLyByZXR1cm4gdW5pdHMgKiBzZW5kZXJfdW5pdF92YWx1ZSArIGFjY3J1ZWRfaW50ZXJlc3QKICAgIGRpZyA0CiAgICAqCiAgICBkaWcgNQogICAgKwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC9jb3Vwb24ucHk6OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgphc3NldF90cmFuc2Zlcl9ib29sX2ZhbHNlQDIwOgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXRfdHJhbnNmZXJfYm9vbF9tZXJnZUAyMQoKYXNzZXRfdHJhbnNmZXJfZWxzZV9ib2R5QDk6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NjcKICAgIC8vIHNlbGYuYWNjb3VudFtyZWNlaXZlcl0udW5pdF92YWx1ZSA9IHNlbmRlcl91bml0X3ZhbHVlCiAgICBkaWcgNQogICAgZHVwCiAgICBwdXNoaW50IDQwCiAgICBkaWcgMTAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NjgKICAgIC8vIHNlbGYuYWNjb3VudFtyZWNlaXZlcl0ucGFpZF9jb3Vwb25zID0gc2VsZi5hY2NvdW50W3NlbmRlcl0ucGFpZF9jb3Vwb25zCiAgICBkaWcgNwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDggOAogICAgcHVzaGludCA0OAogICAgc3dhcAogICAgYm94X3JlcGxhY2UKICAgIGIgYXNzZXRfdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAxMAoKYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUA2OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXRfdHJhbnNmZXJfYm9vbF9tZXJnZUA3CgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb21tb24uQ29yZUZpbmFuY2lhbENvbW1vbk1peGluLmFzc2V0X2NyZWF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFzc2V0X2NyZWF0ZToKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI2NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBkaWcgMQogICAgcHVzaGludCAzOAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgdHVwbGUgZW5jb2RpbmcKICAgIGR1cAogICAgcHVzaGludCA0MAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHRhaWwgcG9pbnRlciBhdCBpbmRleCA3IG9mICh1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OFszMl0sKGxlbit1dGY4W10pKQogICAgZGlnIDIKICAgIHN3YXAKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCA0MgogICAgKwogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5Bc3NldE1ldGFkYXRhCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyNzYKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSBhcnJhbmdlcgogICAgYnl0ZWMgNiAvLyAweDUyMzIzMDIzCiAgICB1bmNvdmVyIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyNzcKICAgIC8vIHNlbGYubWV0YWRhdGEgPSBtZXRhZGF0YS5ieXRlcwogICAgYnl0ZWMgMjUgLy8gIm1ldGFkYXRhIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI2NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb21tb24uQ29yZUZpbmFuY2lhbENvbW1vbk1peGluLmFzc2V0X3VwZGF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFzc2V0X3VwZGF0ZToKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI3OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGRpZyAxCiAgICBwdXNoaW50IDM4CiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCB0dXBsZSBlbmNvZGluZwogICAgZHVwCiAgICBwdXNoaW50IDQwCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgdGFpbCBwb2ludGVyIGF0IGluZGV4IDcgb2YgKHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4WzMyXSwobGVuK3V0ZjhbXSkpCiAgICBkaWcgMgogICAgc3dhcAogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDQyCiAgICArCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLkFzc2V0TWV0YWRhdGEKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI4NC0yODcKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBncmFudHMgdGhlIHVwZGF0ZSBwZXJtaXNzaW9ucyB0byB0aGUgQXJyYW5nZXIuCiAgICAvLyAjIE90aGVyIGltcGxlbWVudGF0aW9ucyBtYXkgZGlzYWJsZSBELUFTQSBhcHBsaWNhdGlvbiB1cGRhdGFiaWxpdHkgb3IgY2hhbmdlIGl0cyBhdXRob3JpemF0aW9ucy4KICAgIC8vICMg4pqg77iPIFdBUk5JTkc6IEFwcGxpY2F0aW9uIHVwZGF0ZXMgbXVzdCBiZSBleGVjdXRlZCBWRVJZIGNhcmVmdWxseSwgYXMgdGhleSBtaWdodCBpbnRyb2R1Y2UgYnJlYWtpbmcgY2hhbmdlcy4KICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI4OAogICAgLy8gc2VsZi5tZXRhZGF0YSA9IG1ldGFkYXRhLmJ5dGVzCiAgICBieXRlYyAyNSAvLyAibWV0YWRhdGEiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6Mjc5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb21tb24uQ29yZUZpbmFuY2lhbENvbW1vbk1peGluLnNldF9zZWNvbmRhcnlfdGltZV9ldmVudHNbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzOgogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI5MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIHVuY292ZXIgMgogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8dWludDY0PgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzExCiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjgKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBlbm0uU1RBVFVTX0VOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGludGMgNSAvLyAyMDAKICAgID09CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMTIKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5zdGF0dXNfaXNfZW5kZWQoKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgIQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMTMKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzE1CiAgICAvLyBhc3NlcnQgc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50cy5sZW5ndGggPj0gMSwgZXJyLklOVkFMSURfVElNRV9FVkVOVFNfTEVOR1RICiAgICBkdXAKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBsZW5ndGggaXMgaW52YWxpZAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzE2CiAgICAvLyBpZiBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzLmxlbmd0aCA+IDE6CiAgICBpbnRjXzEgLy8gMQogICAgPgogICAgYnogc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50c19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMxNwogICAgLy8gc2VsZi5hc3NlcnRfdGltZV9ldmVudHNfc29ydGVkKHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHMpCiAgICBkdXAKICAgIGNhbGxzdWIgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZAogICAgYnVyeSAxCgpzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMyMAogICAgLy8gc2VsZi5pc3N1YW5jZV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pc3N1YW5jZV9kYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzIxCiAgICAvLyA8PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzW2NmZy5TRUNPTkRBUllfTUFSS0VUX09QRU5JTkdfREFURV9JRFhdCiAgICBkaWcgMQogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgYnVyeSA0CiAgICBwdXNoaW50IDIKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMjAtMzIxCiAgICAvLyBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIC8vIDw9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbY2ZnLlNFQ09OREFSWV9NQVJLRVRfT1BFTklOR19EQVRFX0lEWF0KICAgIHN3YXAKICAgIGRpZyAxCiAgICA8PQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzE5LTMyMgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIC8vICAgICA8PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzW2NmZy5TRUNPTkRBUllfTUFSS0VUX09QRU5JTkdfREFURV9JRFhdCiAgICAvLyApLCBlcnIuSU5WQUxJRF9TRUNPTkRBUllfT1BFTklOR19EQVRFCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzZWNvbmRhcnkgbWFya2V0IG9wZW5pbmcgZGF0ZQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzIzCiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlID0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIGJ5dGVjIDE2IC8vICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMyMy0zMjUKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgPSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX09QRU5JTkdfREFURV9JRFgKICAgIC8vIF0KICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMjYKICAgIC8vIGlmIHNlbGYubWF0dXJpdHlfZGF0ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgYnogc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50c19hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMyOAogICAgLy8gc2VsZi5tYXR1cml0eV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMyOQogICAgLy8gPj0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1tjZmcuU0VDT05EQVJZX01BUktFVF9DTE9TVVJFX0RBVEVfSURYXQogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGRpZyAzCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzI4LTMyOQogICAgLy8gc2VsZi5tYXR1cml0eV9kYXRlCiAgICAvLyA+PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzW2NmZy5TRUNPTkRBUllfTUFSS0VUX0NMT1NVUkVfREFURV9JRFhdCiAgICBzd2FwCiAgICBkaWcgMQogICAgPj0KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMyNy0zMzAKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5tYXR1cml0eV9kYXRlCiAgICAvLyAgICAgPj0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1tjZmcuU0VDT05EQVJZX01BUktFVF9DTE9TVVJFX0RBVEVfSURYXQogICAgLy8gKSwgZXJyLklOVkFMSURfU0VDT05EQVJZX0NMT1NVUkVfREFURQogICAgYXNzZXJ0IC8vIEludmFsaWQgc2Vjb25kYXJ5IG1hcmtldCBjbG9zdXJlIGRhdGUKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMzMQogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSA9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICBieXRlYyA5IC8vICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMzMS0zMzMKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUgPSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX0NMT1NVUkVfREFURV9JRFgKICAgIC8vIF0KICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMzNQogICAgLy8gc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGU9c2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMzYKICAgIC8vIHNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlPXNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMzQtMzM3CiAgICAvLyByZXR1cm4gdHlwLlNlY29uZGFyeU1hcmtldFNjaGVkdWxlKAogICAgLy8gICAgIHNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlPXNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUsCiAgICAvLyAgICAgc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGU9c2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSwKICAgIC8vICkKICAgIHN3YXAKICAgIGl0b2IKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MjkwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmNvcmVfZmluYW5jaWFsLmNvbW1vbi5Db3JlRmluYW5jaWFsQ29tbW9uTWl4aW4uc2V0X2RlZmF1bHRfc3RhdHVzW3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X2RlZmF1bHRfc3RhdHVzOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzM5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzQKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnRydXN0ZWUsIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAxOSAvLyAweDUyMzYzMDIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozNTIKICAgIC8vIHNlbGYuYXNzZXRfZGVmYXVsdGVkID0gZGVmYXVsdGVkCiAgICBieXRlYyAyMyAvLyAiYXNzZXRfZGVmYXVsdGVkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjM1MwogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY29tbW9uLkNvcmVGaW5hbmNpYWxDb21tb25NaXhpbi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnByaW1hcnlfZGlzdHJpYnV0aW9uOgogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozNTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBlbm0uU1RBVFVTX0FDVElWRQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDEwMAogICAgPT0KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE0NS0xNDgKICAgIC8vIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpCiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDUKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE0NgogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOCAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE0NwogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGR1cAogICAgYnVyeSA1CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNDYtMTQ3CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTQ2LTE0OAogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUA1CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNDgKICAgIC8vIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNyAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE0Ny0xNDgKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBkaWcgMwogICAgPgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTQ2LTE0OAogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUA1CiAgICBpbnRjXzEgLy8gMQoKcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9tZXJnZUA2OgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTQ0LTE0OQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnN0YXR1c19pc19hY3RpdmUoKQogICAgLy8gICAgIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgLy8gKSwgZXJyLlBSSU1BUllfRElTVFJJQlVUSU9OX0NMT1NFRAogICAgYXNzZXJ0IC8vIFByaW1hcnkgZGlzdHJpYnV0aW9uIGlzIGNsb3NlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjcxCiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5wcmltYXJ5X2RlYWxlciwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDIwIC8vIDB4NTIzNTMwMjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozMQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjM4MwogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozODQKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6Mzg1CiAgICAvLyBhc3NlcnQgdW5pdHMgPiAwLCBlcnIuWkVST19VTklUUwogICAgZGlnIDEKICAgIGR1cAogICAgYXNzZXJ0IC8vIENhbiBub3QgZGlzdHJpYnV0ZSB6ZXJvIHVuaXRzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozODYKICAgIC8vIGFzc2VydCBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICsgdW5pdHMgPD0gc2VsZi50b3RhbF91bml0cywgZXJyLk9WRVJfRElTVFJJQlVUSU9OCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBkaWcgMQogICAgKwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIGRpZyAxCiAgICA+PQogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCByZW1haW5pbmcgRC1BU0EgdW5pdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjM4OAogICAgLy8gc2VsZi5jaXJjdWxhdGluZ191bml0cyArPSB1bml0cwogICAgYnl0ZWMgNCAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjM4OQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMgKz0gdW5pdHMKICAgIGRpZyAyCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgaW50Y18yIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgdW5jb3ZlciAyCiAgICArCiAgICBpdG9iCiAgICBkaWcgMgogICAgaW50Y18yIC8vIDMyCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozOTAKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRfdmFsdWUgPSBzZWxmLnVuaXRfdmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJ1bml0X3ZhbHVlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnVuaXRfdmFsdWUgZXhpc3RzCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIHB1c2hpbnQgNDAKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjM5MQogICAgLy8gcmV0dXJuIHNlbGYudG90YWxfdW5pdHMgLSBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgc3dhcAogICAgLQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VANToKICAgIGludGNfMCAvLyAwCiAgICBiIHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfbWVyZ2VANgoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY29tbW9uLkNvcmVGaW5hbmNpYWxDb21tb25NaXhpbi5nZXRfYXNzZXRfaW5mb1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9hc3NldF9pbmZvOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDAzCiAgICAvLyBwZXJmb3JtYW5jZSA9IFVJbnQ2NChjc3QuUFJGX1BFUkZPUk1BTlQpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDA0CiAgICAvLyBpZiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+IHNlbGYubWF0dXJpdHlfZGF0ZSA+IDA6CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjb3ZlciAzCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgPgogICAgYnogZ2V0X2Fzc2V0X2luZm9fYWZ0ZXJfaWZfZWxzZUA0CiAgICBkdXAKICAgIGJ6IGdldF9hc3NldF9pbmZvX2FmdGVyX2lmX2Vsc2VANAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDA1CiAgICAvLyBwZXJmb3JtYW5jZSA9IFVJbnQ2NChjc3QuUFJGX01BVFVSRUQpCiAgICBwdXNoaW50IDQKICAgIGJ1cnkgMgoKZ2V0X2Fzc2V0X2luZm9fYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDA2LTQwNwogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBubyBncmFjZSBvciBkZWxpbnF1ZW5jeSBwZXJpb2RzCiAgICAvLyBpZiBzZWxmLmFzc2V0X2RlZmF1bHRlZDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMyAvLyAiYXNzZXRfZGVmYXVsdGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2RlZmF1bHRlZCBleGlzdHMKICAgIGJ6IGdldF9hc3NldF9pbmZvX2FmdGVyX2lmX2Vsc2VANgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDA4CiAgICAvLyBwZXJmb3JtYW5jZSA9IFVJbnQ2NChjc3QuUFJGX0RFRkFVTFRFRCkKICAgIHB1c2hpbnQgMwogICAgYnVyeSAyCgpnZXRfYXNzZXRfaW5mb19hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MTEKICAgIC8vIGRlbm9taW5hdGlvbl9hc3NldF9pZD1zZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZC5pZCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNCAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQxMgogICAgLy8gc2V0dGxlbWVudF9hc3NldF9pZD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuaWQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTQgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo0NQogICAgLy8gcmV0dXJuIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKiBzZWxmLnVuaXRfdmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJ1bml0X3ZhbHVlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnVuaXRfdmFsdWUgZXhpc3RzCiAgICBkdXAyCiAgICAqCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MTUKICAgIC8vIGRheV9jb3VudF9jb252ZW50aW9uPWFyYzQuVUludDgoc2VsZi5kYXlfY291bnRfY29udmVudGlvbiksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uIGV4aXN0cwogICAgaXRvYgogICAgZHVwCiAgICBiaXRsZW4KICAgIGludGNfMyAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBleHRyYWN0IDcgMQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDE2CiAgICAvLyBwcmluY2lwYWxfZGlzY291bnQ9YXJjNC5VSW50MTYoc2VsZi5wcmluY2lwYWxfZGlzY291bnQpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI2IC8vICJwcmluY2lwYWxfZGlzY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50IGV4aXN0cwogICAgaXRvYgogICAgZHVwCiAgICBiaXRsZW4KICAgIHB1c2hpbnQgMTYKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGV4dHJhY3QgNiAyCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MTcKICAgIC8vIGludGVyZXN0X3JhdGU9YXJjNC5VSW50MTYoc2VsZi5pbnRlcmVzdF9yYXRlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJpbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X3JhdGUgZXhpc3RzCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgcHVzaGludCAxNgogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA2IDIKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQxOAogICAgLy8gdG90YWxfc3VwcGx5PXNlbGYudG90YWxfdW5pdHMsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDIwCiAgICAvLyBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGU9c2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOCAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQyMQogICAgLy8gcHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlPXNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI3IC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDIyCiAgICAvLyBpc3N1YW5jZV9kYXRlPXNlbGYuaXNzdWFuY2VfZGF0ZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJpc3N1YW5jZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzc3VhbmNlX2RhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MjMKICAgIC8vIG1hdHVyaXR5X2RhdGU9c2VsZi5tYXR1cml0eV9kYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJtYXR1cml0eV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hdHVyaXR5X2RhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MjQKICAgIC8vIHN1c3BlbmRlZD1zZWxmLmFzc2V0X3N1c3BlbmRlZCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMiAvLyAiYXNzZXRfc3VzcGVuZGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X3N1c3BlbmRlZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQyNQogICAgLy8gcGVyZm9ybWFuY2U9YXJjNC5VSW50OChwZXJmb3JtYW5jZSksCiAgICBkaWcgMTUKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzMgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQxMC00MjYKICAgIC8vIHJldHVybiB0eXAuQXNzZXRJbmZvKAogICAgLy8gICAgIGRlbm9taW5hdGlvbl9hc3NldF9pZD1zZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZC5pZCwKICAgIC8vICAgICBzZXR0bGVtZW50X2Fzc2V0X2lkPXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5pZCwKICAgIC8vICAgICBvdXRzdGFuZGluZ19wcmluY2lwYWw9c2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwoKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPXNlbGYudW5pdF92YWx1ZSwKICAgIC8vICAgICBkYXlfY291bnRfY29udmVudGlvbj1hcmM0LlVJbnQ4KHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24pLAogICAgLy8gICAgIHByaW5jaXBhbF9kaXNjb3VudD1hcmM0LlVJbnQxNihzZWxmLnByaW5jaXBhbF9kaXNjb3VudCksCiAgICAvLyAgICAgaW50ZXJlc3RfcmF0ZT1hcmM0LlVJbnQxNihzZWxmLmludGVyZXN0X3JhdGUpLAogICAgLy8gICAgIHRvdGFsX3N1cHBseT1zZWxmLnRvdGFsX3VuaXRzLAogICAgLy8gICAgIGNpcmN1bGF0aW5nX3N1cHBseT1zZWxmLmNpcmN1bGF0aW5nX3VuaXRzLAogICAgLy8gICAgIHByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZT1zZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSwKICAgIC8vICAgICBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGU9c2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUsCiAgICAvLyAgICAgaXNzdWFuY2VfZGF0ZT1zZWxmLmlzc3VhbmNlX2RhdGUsCiAgICAvLyAgICAgbWF0dXJpdHlfZGF0ZT1zZWxmLm1hdHVyaXR5X2RhdGUsCiAgICAvLyAgICAgc3VzcGVuZGVkPXNlbGYuYXNzZXRfc3VzcGVuZGVkLAogICAgLy8gICAgIHBlcmZvcm1hbmNlPWFyYzQuVUludDgocGVyZm9ybWFuY2UpLAogICAgLy8gKQogICAgdW5jb3ZlciAxNAogICAgaXRvYgogICAgdW5jb3ZlciAxNAogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDExCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTEKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMAogICAgY29uY2F0CiAgICB1bmNvdmVyIDkKICAgIGNvbmNhdAogICAgdW5jb3ZlciA4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDcKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGJ5dGVjIDMwIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDQKICAgIHNldGJpdAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjM5MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb21tb24uQ29yZUZpbmFuY2lhbENvbW1vbk1peGluLmdldF90aW1lX2V2ZW50c1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF90aW1lX2V2ZW50czoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQzNgogICAgLy8gdGltZV9ldmVudHMgPSB0eXAuVGltZUV2ZW50cygpCiAgICBieXRlYyAzMyAvLyAweDAwMDAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGVubS5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgMTAwCiAgICA9PQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDM3CiAgICAvLyBpZiBzZWxmLnN0YXR1c19pc19hY3RpdmUoKToKICAgIGJ6IGdldF90aW1lX2V2ZW50c19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQzOAogICAgLy8gdGltZV9ldmVudHMgPSBzZWxmLnRpbWVfZXZlbnRzLnZhbHVlLmNvcHkoKQogICAgYnl0ZWMgMzIgLy8gMHg3NDY5NmQ2NTQ1NzY2NTZlNzQ3MwogICAgYm94X2dldAogICAgc3dhcAogICAgYnVyeSAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50aW1lX2V2ZW50cyBleGlzdHMKCmdldF90aW1lX2V2ZW50c19hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmNvcmVfZmluYW5jaWFsLmNvbW1vbi5Db3JlRmluYW5jaWFsQ29tbW9uTWl4aW4uZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGVbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZToKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQ1MAogICAgLy8gKHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUsIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gInNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDQ5LTQ1MQogICAgLy8gcmV0dXJuIHR5cC5UaW1lRXZlbnRzKAogICAgLy8gICAgIChzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlLCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlKQogICAgLy8gKQogICAgc3dhcAogICAgaXRvYgogICAgcHVzaGJ5dGVzIDB4MDAwMgogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQ0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb21tb24uQ29yZUZpbmFuY2lhbENvbW1vbk1peGluLmdldF9hc3NldF9tZXRhZGF0YVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9hc3NldF9tZXRhZGF0YToKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQ2MgogICAgLy8gcmV0dXJuIHR5cC5Bc3NldE1ldGFkYXRhLmZyb21fYnl0ZXMoc2VsZi5tZXRhZGF0YSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNSAvLyAibWV0YWRhdGEiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWV0YWRhdGEgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0NTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfZ292X3N1c3BlbnNpb25bcm91dGluZ10oKSAtPiB2b2lkOgphY2NvdW50X2dvdl9zdXNwZW5zaW9uOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojk0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo3NwogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYXV0aG9yaXR5LCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMTEgLy8gMHg1MjM3MzAyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjMxCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTQKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZCA9IHN1c3BlbmRlZAogICAgZHVwCiAgICBwdXNoaW50IDU2CiAgICBpbnRjXzEgLy8gMQogICAgYm94X2V4dHJhY3QKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgcHVzaGludCA1NgogICAgc3dhcAogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTUKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojk0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5hY2NvdW50X29wZW5bcm91dGluZ10oKSAtPiB2b2lkOgphY2NvdW50X29wZW46CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjgKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmFjY291bnRfbWFuYWdlciwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDEyIC8vIDB4NTIzNDMwMjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyOAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGVubS5TVEFUVVNfRU5ERUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgaW50YyA1IC8vIDIwMAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzkKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5zdGF0dXNfaXNfZW5kZWQoKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgIQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTQwCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNDEKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE0MgogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBub3QgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE0NgogICAgLy8gdW5pdHM9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNDQtMTUwCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHR5cC5BY2NvdW50SW5mbygKICAgIC8vICAgICBwYXltZW50X2FkZHJlc3M9cGF5bWVudF9hZGRyZXNzLAogICAgLy8gICAgIHVuaXRzPVVJbnQ2NCgwKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBwYWlkX2NvdXBvbnM9VUludDY0KDApLAogICAgLy8gICAgIHN1c3BlbmRlZD1GYWxzZSwKICAgIC8vICkKICAgIGl0b2IKICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlYyAzMCAvLyAweDAwCiAgICBjb25jYXQKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNTEKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF9jbG9zZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfY2xvc2U6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTUzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjY4CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hY2NvdW50X21hbmFnZXIsIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAxMiAvLyAweDUyMzQzMDIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTcxCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozMQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE3NAogICAgLy8gY2xvc2VkX3VuaXRzID0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMKICAgIGR1cAogICAgYm94X2dldAogICAgcG9wCiAgICBpbnRjXzIgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE3NQogICAgLy8gZGVsIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNzYKICAgIC8vIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgLT0gY2xvc2VkX3VuaXRzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBzd2FwCiAgICAtCiAgICBieXRlYyA0IC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjQ4CiAgICAvLyBpZiBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzID09IFVJbnQ2NCgwKToKICAgIGJueiBhY2NvdW50X2Nsb3NlX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjQ5CiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbm0uU1RBVFVTX0VOREVEKQogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgaW50YyA1IC8vIDIwMAogICAgYXBwX2dsb2JhbF9wdXQKCmFjY291bnRfY2xvc2VfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE3OAogICAgLy8gcmV0dXJuIGNsb3NlZF91bml0cywgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgZGlnIDEKICAgIGl0b2IKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzczoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMDAKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcywgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgZGlnIDIKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMDEKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIwMgogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIwNAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzID0gcGF5bWVudF9hZGRyZXNzCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIwNQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5hY2NvdW50X2dldF9pbmZvW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF9nZXRfaW5mbzoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMjIKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjA3CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3JvdGF0ZV9hcnJhbmdlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfcm90YXRlX2FycmFuZ2VyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTgKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTkKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSBuZXdfYXJyYW5nZXIKICAgIGJ5dGVjIDYgLy8gMHg1MjMyMzAyMwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNjAKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19zZXRfb3BfZGFlbW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19zZXRfb3BfZGFlbW9uOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzMKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzQKICAgIC8vIHNlbGYub3BfZGFlbW9uLnZhbHVlID0gYWRkcmVzcwogICAgYnl0ZWMgMjEgLy8gMHg1MjMyMzUyMwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzUKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19hc3NpZ25fcm9sZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfYXNzaWduX3JvbGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTc3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxOTkKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDAKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwMQogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDEKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKToKICAgIHB1c2hpbnQgMjAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwMgogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgNiAvLyAweDUyMzIzMDIzCiAgICBkaWcgMwogICAgYXBwX2dsb2JhbF9wdXQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fdXBzZXJ0X3JvbGVAMTQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAzCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA1CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDQwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDYKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDEyIC8vIDB4NTIzNDMwMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwNwogICAgLy8gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDIKICAgIC8vIHNlbGYuX3Vwc2VydF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgY29uZmlnKQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3Vwc2VydF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDkKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKToKICAgIGR1cAogICAgcHVzaGludCA1MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTEwCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIwIC8vIDB4NTIzNTMwMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMQogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcyhjb25maWcpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwMgogICAgLy8gc2VsZi5fdXBzZXJ0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCBjb25maWcpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fdXBzZXJ0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMwogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNjAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNAogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDE5IC8vIDB4NTIzNjMwMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNQogICAgLy8gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZykKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAyCiAgICAvLyBzZWxmLl91cHNlcnRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIGNvbmZpZykKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl91cHNlcnRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE3CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE4CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAxMSAvLyAweDUyMzczMDIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTkKICAgIC8vIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZykKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAyCiAgICAvLyBzZWxmLl91cHNlcnRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIGNvbmZpZykKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl91cHNlcnRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMQogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKToKICAgIGR1cAogICAgcHVzaGludCA4MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fdXBzZXJ0X3JvbGVAMTQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjIKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuaW50ZXJlc3Rfb3JhY2xlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDE4IC8vIDB4NTIzODMwMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMwogICAgLy8gc2VsZi5pbnRlcmVzdF9vcmFjbGVbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl91cHNlcnRfcm9sZUAxNAoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfcmV2b2tlX3JvbGVbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3Jldm9rZV9yb2xlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNAogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNQogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI2CiAgICAvLyBzZWxmLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpKQogICAgYnRvaQogICAgZHVwbiAyCiAgICBjYWxsc3ViIF9hc3NlcnRfdmFsaWRfcm9sZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyNgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgIT0gVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwgZXJyLklOVkFMSURfUk9MRQogICAgZHVwCiAgICBwdXNoaW50IDIwCiAgICAhPQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI3CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI4CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDEyIC8vIDB4NTIzNDMwMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyOQogICAgLy8gZGVsIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjgKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzEKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKToKICAgIGR1cAogICAgcHVzaGludCA1MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMyCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjAgLy8gMHg1MjM1MzAyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMzCiAgICAvLyBkZWwgc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjcKICAgIC8vIHNlbGYuX2RlbGV0ZV9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcykKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM1CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKToKICAgIGR1cAogICAgcHVzaGludCA2MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM2CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAxOSAvLyAweDUyMzYzMDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzcKICAgIC8vIGRlbCBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI3CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzOQogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKToKICAgIGR1cAogICAgcHVzaGludCA3MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQwCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDExIC8vIDB4NTIzNzMwMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MQogICAgLy8gZGVsIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNwogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDMKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSk6CiAgICBkdXAKICAgIHB1c2hpbnQgODAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ0CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuaW50ZXJlc3Rfb3JhY2xlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDE4IC8vIDB4NTIzODMwMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NQogICAgLy8gZGVsIHNlbGYuaW50ZXJlc3Rfb3JhY2xlW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nb3ZfYXNzZXRfc3VzcGVuc2lvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ292X2Fzc2V0X3N1c3BlbnNpb246CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QgICMgVE9ETzogVXBkYXRlIHNwZWNzIGFuZCBhZGQgdGVzdAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo3NwogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYXV0aG9yaXR5LCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMTEgLy8gMHg1MjM3MzAyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0NgogICAgLy8gc2VsZi5hc3NldF9zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGJ5dGVjIDIyIC8vICJhc3NldF9zdXNwZW5kZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0NwogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QgICMgVE9ETzogVXBkYXRlIHNwZWNzIGFuZCBhZGQgdGVzdAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X2FycmFuZ2VyW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU3CiAgICAvLyByZXR1cm4gc2VsZi5hcnJhbmdlci52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gMHg1MjMyMzAyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYWRkcmVzc19yb2xlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3MwogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hY2NvdW50X21hbmFnZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMTIgLy8gMHg1MjM0MzAyMwogICAgZGlnIDEKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjc0CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnByaW1hcnlfZGVhbGVyLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDIwIC8vIDB4NTIzNTMwMjMKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3NQogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi50cnVzdGVlLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDE5IC8vIDB4NTIzNjMwMjMKICAgIGRpZyAzCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3NgogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIGFkZHJlc3MpLAogICAgYnl0ZWMgMTEgLy8gMHg1MjM3MzAyMwogICAgZGlnIDQKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjc3CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmludGVyZXN0X29yYWNsZSwgYWRkcmVzcyksCiAgICBieXRlYyAxOCAvLyAweDUyMzgzMDIzCiAgICB1bmNvdmVyIDUKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjIDMwIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDYKICAgIHNldGJpdAogICAgaW50Y18xIC8vIDEKICAgIHVuY292ZXIgNQogICAgc2V0Yml0CiAgICBwdXNoaW50IDIKICAgIHVuY292ZXIgNAogICAgc2V0Yml0CiAgICBwdXNoaW50IDMKICAgIHVuY292ZXIgMwogICAgc2V0Yml0CiAgICBwdXNoaW50IDQKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV9jb25maWdbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9yb2xlX2NvbmZpZzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTQKICAgIC8vIHJvbGUgPSByb2xlX2lkLmFzX3VpbnQ2NCgpCiAgICBidG9pCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjk1CiAgICAvLyBzZWxmLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlKQogICAgZHVwCiAgICBjYWxsc3ViIF9hc3NlcnRfdmFsaWRfcm9sZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5NwogICAgLy8gY2FzZSBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpOgogICAgcHVzaGludHMgMjAgNDAgNTAgNjAgNzAgODAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTYtMzI3CiAgICAvLyBtYXRjaCByb2xlOgogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKToKICAgIC8vICAgICAgICAgcmV0dXJuIHR5cC5Sb2xlQ29uZmlnKAogICAgLy8gICAgICAgICAgICAgcm9sZV92YWxpZGl0eV9zdGFydD1VSW50NjQoMCksIHJvbGVfdmFsaWRpdHlfZW5kPVVJbnQ2NCgwKQogICAgLy8gICAgICAgICApCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5hdXRob3JpdHksIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLmludGVyZXN0X29yYWNsZSwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5pbnRlcmVzdF9vcmFjbGVbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgXzoKICAgIC8vICAgICAgICAgb3AuZXJyKGVyci5JTlZBTElEX1JPTEUpCiAgICB1bmNvdmVyIDYKICAgIG1hdGNoIHJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzBAMiByYmFjX2dldF9yb2xlX2NvbmZpZ19zd2l0Y2hfY2FzZV8xQDMgcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfMkA0IHJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzNANSByYmFjX2dldF9yb2xlX2NvbmZpZ19zd2l0Y2hfY2FzZV80QDYgcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfNUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI3CiAgICAvLyBvcC5lcnIoZXJyLklOVkFMSURfUk9MRSkKICAgIGVyciAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgoKcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfNUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMwogICAgLy8gc2VsZi5pbnRlcmVzdF9vcmFjbGUsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMTggLy8gMHg1MjM4MzAyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMi0zMjQKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLmludGVyZXN0X29yYWNsZSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI1CiAgICAvLyByZXR1cm4gc2VsZi5pbnRlcmVzdF9vcmFjbGVbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCgpyYmFjX2dldF9yb2xlX2NvbmZpZ19hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfY29uZmlnQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzRANjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTgKICAgIC8vIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDExIC8vIDB4NTIzNzMwMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5hdXRob3JpdHksIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMAogICAgLy8gcmV0dXJuIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfY29uZmlnX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV9jb25maWdAOQoKcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfM0A1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxMwogICAgLy8gc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDE5IC8vIDB4NTIzNjMwMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTItMzE0CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTUKICAgIC8vIHJldHVybiBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV9jb25maWdfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX2NvbmZpZ0A5CgpyYmFjX2dldF9yb2xlX2NvbmZpZ19zd2l0Y2hfY2FzZV8yQDQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA4CiAgICAvLyBzZWxmLnByaW1hcnlfZGVhbGVyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDIwIC8vIDB4NTIzNTMwMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDctMzA5CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEwCiAgICAvLyByZXR1cm4gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX2NvbmZpZ19hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfY29uZmlnQDkKCnJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzFAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDMKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDEyIC8vIDB4NTIzNDMwMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDItMzA0CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwNQogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfY29uZmlnX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV9jb25maWdAOQoKcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfMEAyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5OC0zMDAKICAgIC8vIHJldHVybiB0eXAuUm9sZUNvbmZpZygKICAgIC8vICAgICByb2xlX3ZhbGlkaXR5X3N0YXJ0PVVJbnQ2NCgwKSwgcm9sZV92YWxpZGl0eV9lbmQ9VUludDY0KDApCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfY29uZmlnX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV9jb25maWdAOQoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY291cG9uLlBlcnBldHVhbENvdXBvbkNhc2hmbG93TWl4aW4uY291bnRfZHVlX2NvdXBvbnMoKSAtPiB1aW50NjQ6CmNvdW50X2R1ZV9jb3Vwb25zOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MzUxCiAgICAvLyBkZWYgY291bnRfZHVlX2NvdXBvbnMoc2VsZikgLT4gVUludDY0OgogICAgcHJvdG8gMCAxCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTozNTIKICAgIC8vIGR1ZV9jb3Vwb25zID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MzUzCiAgICAvLyBjdXJyZW50X3RzID0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGR1cAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MzU0CiAgICAvLyBpZiBjdXJyZW50X3RzID4gc2VsZi5pc3N1YW5jZV9kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKICAgID4KICAgIGJ6IGNvdW50X2R1ZV9jb3Vwb25zX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MzU1CiAgICAvLyBkdWVfY291cG9ucyA9IChjdXJyZW50X3RzIC0gc2VsZi5pc3N1YW5jZV9kYXRlKSAvLyBzZWxmLmNvdXBvbl9wZXJpb2QKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJpc3N1YW5jZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzc3VhbmNlX2RhdGUgZXhpc3RzCiAgICBmcmFtZV9kaWcgMQogICAgc3dhcAogICAgLQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjb3Vwb25fcGVyaW9kIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvdXBvbl9wZXJpb2QgZXhpc3RzCiAgICAvCiAgICBmcmFtZV9idXJ5IDAKCmNvdW50X2R1ZV9jb3Vwb25zX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjM1Ni0zNTcKICAgIC8vICAgICAjIGRpdi1ieS16ZXJvOiBjb3Vwb25fcGVyaW9kICE9IDAgZHVlIHRvIGFzc2VydF90aW1lX3BlcmlvZHMgY2hlY2tzCiAgICAvLyByZXR1cm4gZHVlX2NvdXBvbnMKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY291cG9uLlBlcnBldHVhbENvdXBvbkNhc2hmbG93TWl4aW4uY291cG9uX2R1ZV9kYXRlKGNvdXBvbjogdWludDY0KSAtPiB1aW50NjQ6CmNvdXBvbl9kdWVfZGF0ZToKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjM1OQogICAgLy8gZGVmIGNvdXBvbl9kdWVfZGF0ZShzZWxmLCBjb3Vwb246IFVJbnQ2NCkgLT4gVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTozNjAKICAgIC8vIHJldHVybiBzZWxmLmlzc3VhbmNlX2RhdGUgKyBjb3Vwb24gKiBzZWxmLmNvdXBvbl9wZXJpb2QKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJpc3N1YW5jZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzc3VhbmNlX2RhdGUgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTcgLy8gImNvdXBvbl9wZXJpb2QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY291cG9uX3BlcmlvZCBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgKgogICAgKwogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb3Vwb24uUGVycGV0dWFsQ291cG9uQ2FzaGZsb3dNaXhpbi5kYXlfY291bnRfZmFjdG9yKGR1ZV9jb3Vwb25zOiB1aW50NjQpIC0+IGJ5dGVzOgpkYXlfY291bnRfZmFjdG9yOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6Mzc2CiAgICAvLyBkZWYgZGF5X2NvdW50X2ZhY3RvcihzZWxmLCBkdWVfY291cG9uczogVUludDY0KSAtPiB0eXAuRGF5Q291bnRGYWN0b3I6CiAgICBwcm90byAxIDEKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTozNzctMzc4CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgb25seSB0aGUgQWN0dWFsL0FjdHVhbCBhbmQgQ29udGludW91cyBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGlmIG5vdCBkdWVfY291cG9uczoKICAgIGZyYW1lX2RpZyAtMQogICAgYm56IGRheV9jb3VudF9mYWN0b3JfZWxzZV9ib2R5QDIKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjM3OQogICAgLy8gYWNjcnVpbmdfc3RhcnRfdGltZSA9IHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKCmRheV9jb3VudF9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MzgyCiAgICAvLyBjb3Vwb25fYWNjcnVlZF9wZXJpb2QgPSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCAtIGFjY3J1aW5nX3N0YXJ0X3RpbWUKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIHN3YXAKICAgIC0KICAgIGZyYW1lX2J1cnkgMAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MzgzCiAgICAvLyBjb3Vwb25fcGVyaW9kID0gc2VsZi5jb3Vwb25fcGVyaW9kCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTcgLy8gImNvdXBvbl9wZXJpb2QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY291cG9uX3BlcmlvZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjM4NAogICAgLy8gaWYgc2VsZi5kYXlfY291bnRfY29udmVudGlvbiA9PSBVSW50NjQoY3N0LkRDQ19BX0EpOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kYXlfY291bnRfY29udmVudGlvbiBleGlzdHMKICAgIGJueiBkYXlfY291bnRfZmFjdG9yX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTYyCiAgICAvLyByZXR1cm4gdGltZV9wZXJpb2QgLy8gVUludDY0KGNzdC5EQVlfMl9TRUMpCiAgICBmcmFtZV9kaWcgMAogICAgaW50YyA2IC8vIDg2NDAwCiAgICAvCiAgICBmcmFtZV9idXJ5IDAKICAgIGludGMgNiAvLyA4NjQwMAogICAgLwoKZGF5X2NvdW50X2ZhY3Rvcl9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTozODctMzkwCiAgICAvLyByZXR1cm4gdHlwLkRheUNvdW50RmFjdG9yKAogICAgLy8gICAgIG51bWVyYXRvcj1jb3Vwb25fYWNjcnVlZF9wZXJpb2QsCiAgICAvLyAgICAgZGVub21pbmF0b3I9Y291cG9uX3BlcmlvZCwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAwCiAgICBpdG9iCiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpkYXlfY291bnRfZmFjdG9yX2Vsc2VfYm9keUAyOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MzYzCiAgICAvLyBjb3Vwb25fZHVlX2RhdGUgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MzY0CiAgICAvLyBpZiBkdWVfY291cG9ucyA+PSBVSW50NjQoMSk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGJ6IGRheV9jb3VudF9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUA4CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTozNjUKICAgIC8vIGNvdXBvbl9kdWVfZGF0ZSA9IHNlbGYuY291cG9uX2R1ZV9kYXRlKGR1ZV9jb3Vwb25zKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGNvdXBvbl9kdWVfZGF0ZQogICAgZnJhbWVfYnVyeSAxCgpkYXlfY291bnRfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAODoKICAgIGZyYW1lX2RpZyAxCiAgICBiIGRheV9jb3VudF9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUAzCgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb3Vwb24uUGVycGV0dWFsQ291cG9uQ2FzaGZsb3dNaXhpbi5pc19hY2NydWluZ19pbnRlcmVzdChfZHVlX2NvdXBvbnM6IHVpbnQ2NCkgLT4gdWludDY0Ogppc19hY2NydWluZ19pbnRlcmVzdDoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjM5MgogICAgLy8gZGVmIGlzX2FjY3J1aW5nX2ludGVyZXN0KHNlbGYsIF9kdWVfY291cG9uczogVUludDY0KSAtPiBib29sOgogICAgcHJvdG8gMSAxCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTozOTMKICAgIC8vIHJldHVybiBzZWxmLmlzc3VhbmNlX2RhdGUgIT0gMCBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPiBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJpc3N1YW5jZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzc3VhbmNlX2RhdGUgZXhpc3RzCiAgICBieiBpc19hY2NydWluZ19pbnRlcmVzdF9ib29sX2ZhbHNlQDMKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJpc3N1YW5jZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzc3VhbmNlX2RhdGUgZXhpc3RzCiAgICA+CiAgICBieiBpc19hY2NydWluZ19pbnRlcmVzdF9ib29sX2ZhbHNlQDMKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCmlzX2FjY3J1aW5nX2ludGVyZXN0X2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTozOTMKICAgIC8vIHJldHVybiBzZWxmLmlzc3VhbmNlX2RhdGUgIT0gMCBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPiBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY291cG9uLlBlcnBldHVhbENvdXBvbkNhc2hmbG93TWl4aW4uYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQoaG9sZGluZ19hZGRyZXNzOiBieXRlcywgdW5pdHM6IHVpbnQ2NCwgZHVlX2NvdXBvbnM6IHVpbnQ2NCkgLT4gdWludDY0OgphY2NydWVkX2ludGVyZXN0X2Ftb3VudDoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjM5NS0zOTcKICAgIC8vIGRlZiBhY2NydWVkX2ludGVyZXN0X2Ftb3VudCgKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IEFjY291bnQsIHVuaXRzOiBVSW50NjQsIGR1ZV9jb3Vwb25zOiBVSW50NjQKICAgIC8vICkgLT4gVUludDY0OgogICAgcHJvdG8gMyAxCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTozOTgtMzk5CiAgICAvLyAjIFRoZSBmb2xsb3dpbmcgYXNzZXJ0IHNhZmVndWFyZHMgdGhlIHN1YnJvdXRpbmUgZnJvbSBmb3JiaWRkZW4gaW52b2NhdGlvbnMKICAgIC8vIHNlbGYuYXNzZXJ0X25vX3BlbmRpbmdfY291cG9uX3BheW1lbnQoaG9sZGluZ19hZGRyZXNzLCBkdWVfY291cG9ucykKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGFzc2VydF9ub19wZW5kaW5nX2NvdXBvbl9wYXltZW50CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0MDAKICAgIC8vIGRheV9jb3VudF9mYWN0b3IgPSBzZWxmLmRheV9jb3VudF9mYWN0b3IoZHVlX2NvdXBvbnMpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZGF5X2NvdW50X2ZhY3RvcgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NDAxCiAgICAvLyBjb3Vwb25fYWNjcnVlZF9wZXJpb2QgPSBkYXlfY291bnRfZmFjdG9yLm51bWVyYXRvcgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQwMgogICAgLy8gY291cG9uX3BlcmlvZCA9IGRheV9jb3VudF9mYWN0b3IuZGVub21pbmF0b3IKICAgIHN3YXAKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NDA0CiAgICAvLyBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIGFjY291bnRfdW5pdHNfdmFsdWUKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQwNQogICAgLy8gKiBzZWxmLmludGVyZXN0X3JhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJpbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0MDQtNDA1CiAgICAvLyBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIC8vICogc2VsZi5pbnRlcmVzdF9yYXRlCiAgICAqCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0MDQtNDA2CiAgICAvLyBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIC8vICogc2VsZi5pbnRlcmVzdF9yYXRlCiAgICAvLyAqIGNvdXBvbl9hY2NydWVkX3BlcmlvZAogICAgdW5jb3ZlciAyCiAgICAqCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0MDcKICAgIC8vIC8vIChjc3QuQlBTICogY291cG9uX3BlcmlvZCkKICAgIGludGMgNCAvLyAxMDAwMAogICAgdW5jb3ZlciAyCiAgICAqCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0MDQtNDA3CiAgICAvLyBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIC8vICogc2VsZi5pbnRlcmVzdF9yYXRlCiAgICAvLyAqIGNvdXBvbl9hY2NydWVkX3BlcmlvZAogICAgLy8gLy8gKGNzdC5CUFMgKiBjb3Vwb25fcGVyaW9kKQogICAgLwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NDAzLTQwOAogICAgLy8gcmV0dXJuICgKICAgIC8vICAgICBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIC8vICAgICAqIHNlbGYuaW50ZXJlc3RfcmF0ZQogICAgLy8gICAgICogY291cG9uX2FjY3J1ZWRfcGVyaW9kCiAgICAvLyAgICAgLy8gKGNzdC5CUFMgKiBjb3Vwb25fcGVyaW9kKQogICAgLy8gKSAgIyBkaXYtYnktemVybzogY291cG9uX3BlcmlvZCAhPSAwIGR1ZSB0byBhc3NlcnRfdGltZV9wZXJpb2RzIGNoZWNrcwogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb3Vwb24uQ291cG9uQ2FzaGZsb3dNaXhpbi5hbGxfZHVlX2NvdXBvbnNfcGFpZChkdWVfY291cG9uczogdWludDY0KSAtPiB1aW50NjQ6CmFsbF9kdWVfY291cG9uc19wYWlkOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MjYKICAgIC8vIGRlZiBhbGxfZHVlX2NvdXBvbnNfcGFpZChzZWxmLCBkdWVfY291cG9uczogVUludDY0KSAtPiBib29sOgogICAgcHJvdG8gMSAxCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToyNwogICAgLy8gcmV0dXJuIHNlbGYucGFpZF9jb3Vwb25fdW5pdHMgPj0gc2VsZi5jaXJjdWxhdGluZ191bml0cyAqIGR1ZV9jb3Vwb25zCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjggLy8gInBhaWRfY291cG9uX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnBhaWRfY291cG9uX3VuaXRzIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICAqCiAgICA+PQogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb3Vwb24uQ291cG9uQ2FzaGZsb3dNaXhpbi5hc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCBkdWVfY291cG9uczogdWludDY0KSAtPiB2b2lkOgphc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudDoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjI5LTMxCiAgICAvLyBkZWYgYXNzZXJ0X25vX3BlbmRpbmdfY291cG9uX3BheW1lbnQoCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50LCBkdWVfY291cG9uczogVUludDY0CiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjMzCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMgPT0gZHVlX2NvdXBvbnMKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQ4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfZGlnIC0xCiAgICA9PQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MzItMzQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGFpZF9jb3Vwb25zID09IGR1ZV9jb3Vwb25zCiAgICAvLyApLCBlcnIuUEVORElOR19DT1VQT05fUEFZTUVOVAogICAgYXNzZXJ0IC8vIFBlbmRpbmcgZHVlIGNvdXBvbiBwYXltZW50CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmNvcmVfZmluYW5jaWFsLmNvbW1vbi5Db3JlRmluYW5jaWFsQ29tbW9uTWl4aW4uYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZCh0aW1lX2V2ZW50czogYnl0ZXMpIC0+IGJ5dGVzOgphc3NlcnRfdGltZV9ldmVudHNfc29ydGVkOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTA3CiAgICAvLyBkZWYgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZChzZWxmLCB0aW1lX2V2ZW50czogdHlwLlRpbWVFdmVudHMpIC0+IE5vbmU6CiAgICBwcm90byAxIDEKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMDkKICAgIC8vIHRpbWVfZXZlbnRzW2NmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9PUEVOSU5HX0RBVEVfSURYXQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDIKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMTAKICAgIC8vID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjEwOS0xMTAKICAgIC8vIHRpbWVfZXZlbnRzW2NmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9PUEVOSU5HX0RBVEVfSURYXQogICAgLy8gPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgPgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTA4LTExMQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICB0aW1lX2V2ZW50c1tjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fT1BFTklOR19EQVRFX0lEWF0KICAgIC8vICAgICA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyApLCBlcnIuSU5WQUxJRF9USU1FCiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbXVzdCBiZSBzZXQgaW4gdGhlIGZ1dHVyZQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTEyCiAgICAvLyBmb3IgaWR4IGluIHVyYW5nZSh0aW1lX2V2ZW50cy5sZW5ndGggLSAxKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBpbnRjXzAgLy8gMAoKYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9mb3JfaGVhZGVyQDE6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMTIKICAgIC8vIGZvciBpZHggaW4gdXJhbmdlKHRpbWVfZXZlbnRzLmxlbmd0aCAtIDEpOgogICAgZnJhbWVfZGlnIDUKICAgIGZyYW1lX2RpZyA0CiAgICA8CiAgICBieiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2FmdGVyX2ZvckA2Cgphc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX3doaWxlX3RvcEA4OgogICAgcHVzaGludCA3NQogICAgZ2xvYmFsIE9wY29kZUJ1ZGdldAogICAgPgogICAgYnogYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9hZnRlcl93aGlsZUAxMwogICAgaXR4bl9iZWdpbgogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGJ5dGVjIDM0IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbQogICAgYnl0ZWMgMzQgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KICAgIGdsb2JhbCBNaW5UeG5GZWUKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgYiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX3doaWxlX3RvcEA4Cgphc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2FmdGVyX3doaWxlQDEzOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTE3CiAgICAvLyB0aW1lX2kgPSB0aW1lX2V2ZW50c1tpZHhdCiAgICBmcmFtZV9kaWcgNQogICAgZHVwCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgY292ZXIgMwogICAgc3dhcAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMwogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMTgKICAgIC8vIHRpbWVfZiA9IHRpbWVfZXZlbnRzW2lkeCArIDFdCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjExOQogICAgLy8gYXNzZXJ0IHRpbWVfZiA+IHRpbWVfaSwgZXJyLklOVkFMSURfU09SVElORwogICAgPAogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIG11c3QgYmUgc29ydGVkIGluIHN0cmljdGx5IGFzY2VuZGluZyBvcmRlcgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTIwCiAgICAvLyBpZiBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uICE9IFVJbnQ2NChjc3QuRENDX0NPTlQpOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kYXlfY291bnRfY29udmVudGlvbiBleGlzdHMKICAgIHB1c2hpbnQgMjU1CiAgICAhPQogICAgYnogYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9hZnRlcl9pZl9lbHNlQDQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjEyMS0xMjIKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiByZXF1aXJlcyB0aW1lIHBlcmlvZHMgZXhwcmVzc2VkIGluIGRheXMgZm9yIHJlZ3VsYXIgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgKHRpbWVfZiAtIHRpbWVfaSkgJSBVSW50NjQoCiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIDEKICAgIC0KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjEyMS0xMjQKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiByZXF1aXJlcyB0aW1lIHBlcmlvZHMgZXhwcmVzc2VkIGluIGRheXMgZm9yIHJlZ3VsYXIgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgKHRpbWVfZiAtIHRpbWVfaSkgJSBVSW50NjQoCiAgICAvLyAgICAgY3N0LkRBWV8yX1NFQwogICAgLy8gKSA9PSAwLCBlcnIuSU5WQUxJRF9USU1FX1BFUklPRAogICAgaW50YyA2IC8vIDg2NDAwCiAgICAlCiAgICAhCiAgICBhc3NlcnQgLy8gVGltZSBwZXJpb2RzIGluIEFjdHVhbC9BY3R1YWwgZGF5IGNvdW50IGNvbnZlbnRpb24gbXVzdCBiZSBtdWx0aXBsZXMgb2YgYSBkYXkgKGluIHNlY29uZHMpCgphc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2FmdGVyX2lmX2Vsc2VANDoKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9idXJ5IDUKICAgIGIgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9mb3JfaGVhZGVyQDEKCmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfYWZ0ZXJfZm9yQDY6CiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB2b2lkOgphc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjMzCiAgICAvLyBkZWYgYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChzZWxmLCBob2xkaW5nX2FkZHJlc3M6IEFjY291bnQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozNAogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQsIGVyci5TVVNQRU5ERUQKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQ0OAogICAgZ2V0Yml0CiAgICAhCiAgICBhc3NlcnQgLy8gU3VzcGVuZGVkIG9wZXJhdGlvbnMKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzOiBieXRlcywgdW5pdHM6IHVpbnQ2NCkgLT4gdWludDY0OgphY2NvdW50X3VuaXRzX3ZhbHVlOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjM2CiAgICAvLyBkZWYgYWNjb3VudF91bml0c192YWx1ZShzZWxmLCBob2xkaW5nX2FkZHJlc3M6IEFjY291bnQsIHVuaXRzOiBVSW50NjQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjM3CiAgICAvLyByZXR1cm4gdW5pdHMgKiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCA0MAogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyAtMQogICAgKgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF90b3RhbF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB1aW50NjQ6CmFjY291bnRfdG90YWxfdW5pdHNfdmFsdWU6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzkKICAgIC8vIGRlZiBhY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlKHNlbGYsIGhvbGRpbmdfYWRkcmVzczogQWNjb3VudCkgLT4gVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NDEKICAgIC8vIGhvbGRpbmdfYWRkcmVzcywgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzIgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NDAtNDIKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoCiAgICAvLyAgICAgaG9sZGluZ19hZGRyZXNzLCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cwogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBjYWxsc3ViIGFjY291bnRfdW5pdHNfdmFsdWUKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9yb2xlX2lzX2FjdGl2ZShyb2xlX21hcDogYnl0ZXMsIHJvbGVfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NDoKX3JvbGVfaXNfYWN0aXZlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU3CiAgICAvLyBkZWYgX3JvbGVfaXNfYWN0aXZlKHNlbGYsIHJvbGVfbWFwOiB0eXAuUmJhY1JvbGUsIHJvbGVfYWRkcmVzczogQWNjb3VudCkgLT4gYm9vbDoKICAgIHByb3RvIDIgMQogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5CiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5LTYwCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5LTYxCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjEKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAtNjEKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgPj0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX21lcmdlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpIC0+IHZvaWQ6CmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjUKICAgIC8vIGFzc2VydCBzZWxmLl9pc19hcnJhbmdlcihUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjUyCiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzID09IHNlbGYuYXJyYW5nZXIudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vIDB4NTIzMjMwMjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcnJhbmdlciBleGlzdHMKICAgID09CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjUKICAgIC8vIGFzc2VydCBzZWxmLl9pc19hcnJhbmdlcihUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpIC0+IHZvaWQ6CmFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjgzCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYXNzZXRfZGVmYXVsdGVkLCBlcnIuREVGQVVMVEVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjMgLy8gImFzc2V0X2RlZmF1bHRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9kZWZhdWx0ZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRGVmYXVsdGVkCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpIC0+IHZvaWQ6CmFzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg2CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYXNzZXRfc3VzcGVuZGVkLCBlcnIuU1VTUEVOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjIgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9zdXNwZW5kZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gU3VzcGVuZGVkIG9wZXJhdGlvbnMKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkOiB1aW50NjQpIC0+IHZvaWQ6Cl9hc3NlcnRfdmFsaWRfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OAogICAgLy8gZGVmIF9hc3NlcnRfdmFsaWRfcm9sZShzZWxmLCByb2xlX2lkOiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MAogICAgLy8gVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIHB1c2hpbnQgMjAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgcHVzaGludCA0MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk2CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MgogICAgLy8gVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIHB1c2hpbnQgNTAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTMKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIHB1c2hpbnQgNjAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTQKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgcHVzaGludCA3MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk2CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NQogICAgLy8gVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICBwdXNoaW50IDgwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTYKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJ6IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX2ZhbHNlQDcKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANjoKICAgIGludGNfMSAvLyAxCgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9tZXJnZUA4OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk2CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgcmV0c3ViCgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9mYWxzZUA3OgogICAgaW50Y18wIC8vIDAKICAgIGIgX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfbWVyZ2VAOAo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="}, "sourceInfo": {"approval": {"pcOffsetMethod": "none", "sourceInfo": [{"pc": [2626], "errorMessage": "Can not distribute zero units"}, {"pc": [1106], "errorMessage": "Coupon rates are not properly defined"}, {"pc": [990], "errorMessage": "D-ASA already configured"}, {"pc": [4367], "errorMessage": "Defaulted"}, {"pc": [997], "errorMessage": "Denomination asset is not properly set"}, {"pc": [1008], "errorMessage": "Different settlement asset not supported, must be equal to denomination asset"}, {"pc": [2643], "errorMessage": "Insufficient remaining D-ASA units"}, {"pc": [2112, 2207], "errorMessage": "Insufficient sender units to transfer"}, {"pc": [1096], "errorMessage": "Interest rate is not properly defined"}, {"pc": [1308, 1435, 1640, 2066, 2081, 2616, 3001, 3072, 3124, 3204, 3233], "errorMessage": "Invalid account holding address"}, {"pc": [3375, 3399, 3423, 3447, 3471, 3528, 3556, 3578, 3600, 3622, 3801, 3819, 3834, 3849, 3864], "errorMessage": "Invalid account role address"}, {"pc": [1326], "errorMessage": "Invalid amount of units for the account"}, {"pc": [1075], "errorMessage": "Invalid day-count convention ID"}, {"pc": [3512, 3791, 4429], "errorMessage": "Invalid role identifier"}, {"pc": [2487], "errorMessage": "Invalid secondary market closure date"}, {"pc": [2453], "errorMessage": "Invalid secondary market opening date"}, {"pc": [1041], "errorMessage": "Minimum denomination is not a divisor of principal"}, {"pc": [1649], "errorMessage": "No D-ASA units"}, {"pc": [1663], "errorMessage": "No due coupon to pay"}, {"pc": [1227, 1622, 1724, 2048, 2417, 2530, 2607, 2992, 3047, 3056, 3113, 3189, 3645, 4359], "errorMessage": "Not authorized"}, {"pc": [1778], "errorMessage": "Not enough funds for the payment"}, {"pc": [1240, 1667, 4114], "errorMessage": "Pending due coupon payment"}, {"pc": [2599], "errorMessage": "Primary distribution is closed"}, {"pc": [1297], "errorMessage": "Primary distribution not yet executed"}, {"pc": [2039], "errorMessage": "Secondary market is closed"}, {"pc": [2097], "errorMessage": "Sender and receiver must be different"}, {"pc": [2162], "errorMessage": "Sender and receiver units are not fungible"}, {"pc": [4263, 4375], "errorMessage": "Suspended operations"}, {"pc": [1118, 2422], "errorMessage": "Time events length is invalid"}, {"pc": [4136], "errorMessage": "Time events must be set in the future"}, {"pc": [4214], "errorMessage": "Time events must be sorted in strictly ascending order"}, {"pc": [1177], "errorMessage": "Time period durations must be strictly greater than zero"}, {"pc": [1179], "errorMessage": "Time period repetitions are not properly defined"}, {"pc": [1163], "errorMessage": "Time periods are not properly defined"}, {"pc": [4236], "errorMessage": "Time periods in Actual/Actual day count convention must be multiples of a day (in seconds)"}, {"pc": [2101], "errorMessage": "Transfer units must be greater than zero"}, {"pc": [587], "errorMessage": "Wrong Global Bytes allocation"}, {"pc": [593], "errorMessage": "Wrong Global UInts allocation"}, {"pc": [597], "errorMessage": "Wrong Local Bytes allocation"}, {"pc": [601], "errorMessage": "Wrong Local UInts allocation"}, {"pc": [1771], "errorMessage": "account opted into asset"}, {"pc": [1845], "errorMessage": "asset exists"}, {"pc": [4319, 4334], "errorMessage": "check BoxMap entry exists"}, {"pc": [1316, 1655, 1715, 1728, 1747, 1782, 1810, 2105, 2119, 2128, 2135, 2146, 2153, 2167, 2202, 2244, 2288, 2652, 4107, 4257, 4273, 4289], "errorMessage": "check self.account entry exists"}, {"pc": [3663, 4357], "errorMessage": "check self.arranger exists"}, {"pc": [2726, 4365], "errorMessage": "check self.asset_defaulted exists"}, {"pc": [2828, 4373], "errorMessage": "check self.asset_suspended exists"}, {"pc": [1850, 2631, 2748, 3139, 4093], "errorMessage": "check self.circulating_units exists"}, {"pc": [3918, 3934, 3965], "errorMessage": "check self.coupon_period exists"}, {"pc": [2760, 3970, 4219], "errorMessage": "check self.day_count_convention exists"}, {"pc": [1841, 2738], "errorMessage": "check self.denomination_asset_id exists"}, {"pc": [1443, 1675, 2789, 4069], "errorMessage": "check self.interest_rate exists"}, {"pc": [2437, 2818, 3901, 3909, 3929, 3954, 4019, 4028], "errorMessage": "check self.issuance_date exists"}, {"pc": [2462, 2470, 2709, 2823], "errorMessage": "check self.maturity_date exists"}, {"pc": [2960], "errorMessage": "check self.metadata exists"}, {"pc": [1684, 1697], "errorMessage": "check self.op_daemon exists"}, {"pc": [1825, 4088], "errorMessage": "check self.paid_coupon_units exists"}, {"pc": [2591, 2814], "errorMessage": "check self.primary_distribution_closure_date exists"}, {"pc": [1281, 1291, 2577, 2809], "errorMessage": "check self.primary_distribution_opening_date exists"}, {"pc": [1090, 2774], "errorMessage": "check self.principal_discount exists"}, {"pc": [2023, 2033, 2501, 2938], "errorMessage": "check self.secondary_market_closure_date exists"}, {"pc": [2012, 2496, 2933], "errorMessage": "check self.secondary_market_opening_date exists"}, {"pc": [1736, 1765, 2743], "errorMessage": "check self.settlement_asset_id exists"}, {"pc": [988, 1465, 1567, 1618, 2001, 2412, 2566, 2908, 3051], "errorMessage": "check self.status exists"}, {"pc": [2921], "errorMessage": "check self.time_events exists"}, {"pc": [1580], "errorMessage": "check self.time_periods exists"}, {"pc": [1523], "errorMessage": "check self.total_coupons exists"}, {"pc": [2639, 2682, 2804], "errorMessage": "check self.total_units exists"}, {"pc": [1855, 2669, 2753], "errorMessage": "check self.unit_value exists"}, {"pc": [925, 947, 968, 1602, 2333, 2372, 2394, 2474, 3313, 4140], "errorMessage": "invalid array length header"}, {"pc": [2520, 2982, 3635], "errorMessage": "invalid number of bytes for arc4.bool"}, {"pc": [938], "errorMessage": "invalid number of bytes for arc4.dynamic_array"}, {"pc": [1610, 3321], "errorMessage": "invalid number of bytes for arc4.dynamic_array"}, {"pc": [981], "errorMessage": "invalid number of bytes for arc4.dynamic_array>"}, {"pc": [959, 2405], "errorMessage": "invalid number of bytes for arc4.dynamic_array"}, {"pc": [1267, 1427, 1596, 1980, 1988, 2310, 2553, 2974, 3031, 3039, 3105, 3175, 3183, 3225, 3249, 3273, 3307, 3495, 3677, 3761], "errorMessage": "invalid number of bytes for arc4.static_array"}, {"pc": [919, 1219], "errorMessage": "invalid number of bytes for arc4.uint16"}, {"pc": [863, 872, 881, 890, 899, 1275, 1996, 2561], "errorMessage": "invalid number of bytes for arc4.uint64"}, {"pc": [908, 3297, 3485, 3751], "errorMessage": "invalid number of bytes for arc4.uint8"}, {"pc": [2338, 2377], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.AssetMetadata"}, {"pc": [2325, 2364], "errorMessage": "invalid tail pointer at index 7 of (uint8,uint8,uint8,uint8,uint8,uint8,uint8[32],(len+utf8[]))"}, {"pc": [2320, 2359], "errorMessage": "invalid tuple encoding"}, {"pc": [2766, 2781, 2796, 2836], "errorMessage": "overflow"}]}, "clear": {"pcOffsetMethod": "none", "sourceInfo": []}}, "templateVariables": {}}""" -APP_SPEC = algokit_utils.Arc56Contract.from_json(_APP_SPEC_JSON) - -def _parse_abi_args(args: object | None = None) -> list[object] | None: - """Helper to parse ABI args into the format expected by underlying client""" - if args is None: - return None - - def convert_dataclass(value: object) -> object: - if dataclasses.is_dataclass(value): - return tuple(convert_dataclass(getattr(value, field.name)) for field in dataclasses.fields(value)) - elif isinstance(value, (list, tuple)): - return type(value)(convert_dataclass(item) for item in value) - return value - - match args: - case tuple(): - method_args = list(args) - case _ if dataclasses.is_dataclass(args): - method_args = [getattr(args, field.name) for field in dataclasses.fields(args)] - case _: - raise ValueError("Invalid 'args' type. Expected 'tuple' or 'TypedDict' for respective typed arguments.") - - return [ - convert_dataclass(arg) if not isinstance(arg, algokit_utils.AppMethodCallTransactionArgument) else arg - for arg in method_args - ] if method_args else None - -def _init_dataclass(cls: type, data: dict) -> object: - """ - Recursively instantiate a dataclass of type `cls` from `data`. - - For each field on the dataclass, if the field type is also a dataclass - and the corresponding data is a dict, instantiate that field recursively. - """ - field_values = {} - for field in dataclasses.fields(cls): - field_value = data.get(field.name) - # Check if the field expects another dataclass and the value is a dict. - if dataclasses.is_dataclass(field.type) and isinstance(field_value, dict): - field_values[field.name] = _init_dataclass(typing.cast(type, field.type), field_value) - else: - field_values[field.name] = field_value - return cls(**field_values) - -@dataclasses.dataclass(frozen=True) -class AccountInfo: - """Struct for AccountInfo""" - payment_address: str - units: int - unit_value: int - paid_coupons: int - suspended: bool - -@dataclasses.dataclass(frozen=True) -class AssetInfo: - """Struct for AssetInfo""" - denomination_asset_id: int - settlement_asset_id: int - outstanding_principal: int - unit_value: int - day_count_convention: int - principal_discount: int - interest_rate: int - total_supply: int - circulating_supply: int - primary_distribution_opening_date: int - primary_distribution_closure_date: int - issuance_date: int - maturity_date: int - suspended: bool - performance: int - -@dataclasses.dataclass(frozen=True) -class AssetMetadata: - """Struct for AssetMetadata""" - contract_type: int - calendar: int - business_day_convention: int - end_of_month_convention: int - prepayment_effect: int - penalty_type: int - prospectus_hash: bytes - prospectus_url: str - -@dataclasses.dataclass(frozen=True) -class DayCountFactor: - """Struct for DayCountFactor""" - numerator: int - denominator: int - -@dataclasses.dataclass(frozen=True) -class CouponsInfo: - """Struct for CouponsInfo""" - total_coupons: int - due_coupons: int - next_coupon_due_date: int - day_count_factor: DayCountFactor - all_due_coupons_paid: bool - -@dataclasses.dataclass(frozen=True) -class CurrentUnitsValue: - """Struct for CurrentUnitsValue""" - units_value: int - accrued_interest: int - day_count_factor: DayCountFactor - -@dataclasses.dataclass(frozen=True) -class PaymentAmounts: - """Struct for PaymentAmounts""" - interest: int - principal: int - -@dataclasses.dataclass(frozen=True) -class PaymentResult: - """Struct for PaymentResult""" - amount: int - timestamp: int - context: bytes - -@dataclasses.dataclass(frozen=True) -class RoleConfig: - """Struct for RoleConfig""" - role_validity_start: int - role_validity_end: int - -@dataclasses.dataclass(frozen=True) -class SecondaryMarketSchedule: - """Struct for SecondaryMarketSchedule""" - secondary_market_opening_date: int - secondary_market_closure_date: int - - -@dataclasses.dataclass(frozen=True, kw_only=True) -class AssetConfigArgs: - """Dataclass for asset_config arguments""" - denomination_asset_id: int - settlement_asset_id: int - principal: int - principal_discount: int - minimum_denomination: int - day_count_convention: int - interest_rate: int - coupon_rates: list[int] - time_events: list[int] - time_periods: list[tuple[int, int]] - - @property - def abi_method_signature(self) -> str: - return "asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class UpdateInterestRateArgs: - """Dataclass for update_interest_rate arguments""" - interest_rate: int - - @property - def abi_method_signature(self) -> str: - return "update_interest_rate(uint16)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class GetAccountUnitsCurrentValueArgs: - """Dataclass for get_account_units_current_value arguments""" - holding_address: str - units: int - - @property - def abi_method_signature(self) -> str: - return "get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64))" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class GetPaymentAmountArgs: - """Dataclass for get_payment_amount arguments""" - holding_address: str - - @property - def abi_method_signature(self) -> str: - return "get_payment_amount(address)(uint64,uint64)" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class PayCouponArgs: - """Dataclass for pay_coupon arguments""" - holding_address: str - payment_info: bytes | str - - @property - def abi_method_signature(self) -> str: - return "pay_coupon(address,byte[])(uint64,uint64,byte[])" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class AssetTransferArgs: - """Dataclass for asset_transfer arguments""" - sender_holding_address: str - receiver_holding_address: str - units: int - - @property - def abi_method_signature(self) -> str: - return "asset_transfer(address,address,uint64)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class SetSecondaryTimeEventsArgs: - """Dataclass for set_secondary_time_events arguments""" - secondary_market_time_events: list[int] - - @property - def abi_method_signature(self) -> str: - return "set_secondary_time_events(uint64[])(uint64,uint64)" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class SetDefaultStatusArgs: - """Dataclass for set_default_status arguments""" - defaulted: bool - - @property - def abi_method_signature(self) -> str: - return "set_default_status(bool)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class PrimaryDistributionArgs: - """Dataclass for primary_distribution arguments""" - holding_address: str - units: int - - @property - def abi_method_signature(self) -> str: - return "primary_distribution(address,uint64)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class AccountGovSuspensionArgs: - """Dataclass for account_gov_suspension arguments""" - holding_address: str - suspended: bool - - @property - def abi_method_signature(self) -> str: - return "account_gov_suspension(address,bool)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class AccountOpenArgs: - """Dataclass for account_open arguments""" - holding_address: str - payment_address: str - - @property - def abi_method_signature(self) -> str: - return "account_open(address,address)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class AccountCloseArgs: - """Dataclass for account_close arguments""" - holding_address: str - - @property - def abi_method_signature(self) -> str: - return "account_close(address)(uint64,uint64)" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class AccountUpdatePaymentAddressArgs: - """Dataclass for account_update_payment_address arguments""" - holding_address: str - payment_address: str - - @property - def abi_method_signature(self) -> str: - return "account_update_payment_address(address,address)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class AccountGetInfoArgs: - """Dataclass for account_get_info arguments""" - holding_address: str - - @property - def abi_method_signature(self) -> str: - return "account_get_info(address)(address,uint64,uint64,uint64,bool)" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class RbacRotateArrangerArgs: - """Dataclass for rbac_rotate_arranger arguments""" - new_arranger: str - - @property - def abi_method_signature(self) -> str: - return "rbac_rotate_arranger(address)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class RbacSetOpDaemonArgs: - """Dataclass for rbac_set_op_daemon arguments""" - address: str - - @property - def abi_method_signature(self) -> str: - return "rbac_set_op_daemon(address)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class RbacAssignRoleArgs: - """Dataclass for rbac_assign_role arguments""" - role_id: int - role_address: str - config: bytes | str - - @property - def abi_method_signature(self) -> str: - return "rbac_assign_role(uint8,address,byte[])uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class RbacRevokeRoleArgs: - """Dataclass for rbac_revoke_role arguments""" - role_id: int - role_address: str - - @property - def abi_method_signature(self) -> str: - return "rbac_revoke_role(uint8,address)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class RbacGovAssetSuspensionArgs: - """Dataclass for rbac_gov_asset_suspension arguments""" - suspended: bool - - @property - def abi_method_signature(self) -> str: - return "rbac_gov_asset_suspension(bool)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class RbacGetAddressRolesArgs: - """Dataclass for rbac_get_address_roles arguments""" - address: str - - @property - def abi_method_signature(self) -> str: - return "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class RbacGetRoleConfigArgs: - """Dataclass for rbac_get_role_config arguments""" - role_id: int - role_address: str - - @property - def abi_method_signature(self) -> str: - return "rbac_get_role_config(uint8,address)(uint64,uint64)" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class AssetCreateArgs: - """Dataclass for asset_create arguments""" - arranger: str - metadata: AssetMetadata - - @property - def abi_method_signature(self) -> str: - return "asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class AssetUpdateArgs: - """Dataclass for asset_update arguments""" - metadata: AssetMetadata - - @property - def abi_method_signature(self) -> str: - return "asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void" - - -class _PerpetualBondUpdate: - def __init__(self, app_client: algokit_utils.AppClient): - self.app_client = app_client - - def asset_update( - self, - args: tuple[AssetMetadata] | AssetUpdateArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppUpdateMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - compilation_params = compilation_params or algokit_utils.AppClientCompilationParams() - return self.app_client.params.update(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void", - "args": method_args, - })) - - -class PerpetualBondParams: - def __init__(self, app_client: algokit_utils.AppClient): - self.app_client = app_client - - @property - def update(self) -> "_PerpetualBondUpdate": - return _PerpetualBondUpdate(self.app_client) - - def asset_config( - self, - args: tuple[int, int, int, int, int, int, int, list[int], list[int], list[tuple[int, int]]] | AssetConfigArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void", - "args": method_args, - })) - - def update_interest_rate( - self, - args: tuple[int] | UpdateInterestRateArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "update_interest_rate(uint16)uint64", - "args": method_args, - })) - - def get_account_units_current_value( - self, - args: tuple[str, int] | GetAccountUnitsCurrentValueArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64))", - "args": method_args, - })) - - def get_payment_amount( - self, - args: tuple[str] | GetPaymentAmountArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_payment_amount(address)(uint64,uint64)", - "args": method_args, - })) - - def get_coupons_status( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_coupons_status()(uint64,uint64,uint64,(uint64,uint64),bool)", - })) - - def get_time_periods( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_time_periods()(uint64,uint64)[]", - })) - - def pay_coupon( - self, - args: tuple[str, bytes | str] | PayCouponArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "pay_coupon(address,byte[])(uint64,uint64,byte[])", - "args": method_args, - })) - - def asset_transfer( - self, - args: tuple[str, str, int] | AssetTransferArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "asset_transfer(address,address,uint64)uint64", - "args": method_args, - })) - - def set_secondary_time_events( - self, - args: tuple[list[int]] | SetSecondaryTimeEventsArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "set_secondary_time_events(uint64[])(uint64,uint64)", - "args": method_args, - })) - - def set_default_status( - self, - args: tuple[bool] | SetDefaultStatusArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "set_default_status(bool)uint64", - "args": method_args, - })) - - def primary_distribution( - self, - args: tuple[str, int] | PrimaryDistributionArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "primary_distribution(address,uint64)uint64", - "args": method_args, - })) - - def get_asset_info( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)", - })) - - def get_time_events( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_time_events()uint64[]", - })) - - def get_secondary_market_schedule( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_secondary_market_schedule()uint64[]", - })) - - def get_asset_metadata( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", - })) - - def account_gov_suspension( - self, - args: tuple[str, bool] | AccountGovSuspensionArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_gov_suspension(address,bool)uint64", - "args": method_args, - })) - - def account_open( - self, - args: tuple[str, str] | AccountOpenArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_open(address,address)uint64", - "args": method_args, - })) - - def account_close( - self, - args: tuple[str] | AccountCloseArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_close(address)(uint64,uint64)", - "args": method_args, - })) - - def account_update_payment_address( - self, - args: tuple[str, str] | AccountUpdatePaymentAddressArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_update_payment_address(address,address)uint64", - "args": method_args, - })) - - def account_get_info( - self, - args: tuple[str] | AccountGetInfoArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_get_info(address)(address,uint64,uint64,uint64,bool)", - "args": method_args, - })) - - def rbac_rotate_arranger( - self, - args: tuple[str] | RbacRotateArrangerArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_rotate_arranger(address)uint64", - "args": method_args, - })) - - def rbac_set_op_daemon( - self, - args: tuple[str] | RbacSetOpDaemonArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_set_op_daemon(address)uint64", - "args": method_args, - })) - - def rbac_assign_role( - self, - args: tuple[int, str, bytes | str] | RbacAssignRoleArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_assign_role(uint8,address,byte[])uint64", - "args": method_args, - })) - - def rbac_revoke_role( - self, - args: tuple[int, str] | RbacRevokeRoleArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_revoke_role(uint8,address)uint64", - "args": method_args, - })) - - def rbac_gov_asset_suspension( - self, - args: tuple[bool] | RbacGovAssetSuspensionArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_gov_asset_suspension(bool)uint64", - "args": method_args, - })) - - def rbac_get_arranger( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_arranger()address", - })) - - def rbac_get_address_roles( - self, - args: tuple[str] | RbacGetAddressRolesArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", - "args": method_args, - })) - - def rbac_get_role_config( - self, - args: tuple[int, str] | RbacGetRoleConfigArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_role_config(uint8,address)(uint64,uint64)", - "args": method_args, - })) - - def asset_create( - self, - args: tuple[str, AssetMetadata] | AssetCreateArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void", - "args": method_args, - })) - - def clear_state( - self, - params: algokit_utils.AppClientBareCallParams | None = None, - - ) -> algokit_utils.AppCallParams: - return self.app_client.params.bare.clear_state( - params, - - ) - - -class _PerpetualBondUpdateTransaction: - def __init__(self, app_client: algokit_utils.AppClient): - self.app_client = app_client - - def asset_update( - self, - args: tuple[AssetMetadata] | AssetUpdateArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - compilation_params = compilation_params or algokit_utils.AppClientCompilationParams() - return self.app_client.create_transaction.update(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void", - "args": method_args, - })) - - -class PerpetualBondCreateTransactionParams: - def __init__(self, app_client: algokit_utils.AppClient): - self.app_client = app_client - - @property - def update(self) -> "_PerpetualBondUpdateTransaction": - return _PerpetualBondUpdateTransaction(self.app_client) - - def asset_config( - self, - args: tuple[int, int, int, int, int, int, int, list[int], list[int], list[tuple[int, int]]] | AssetConfigArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void", - "args": method_args, - })) - - def update_interest_rate( - self, - args: tuple[int] | UpdateInterestRateArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "update_interest_rate(uint16)uint64", - "args": method_args, - })) - - def get_account_units_current_value( - self, - args: tuple[str, int] | GetAccountUnitsCurrentValueArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64))", - "args": method_args, - })) - - def get_payment_amount( - self, - args: tuple[str] | GetPaymentAmountArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_payment_amount(address)(uint64,uint64)", - "args": method_args, - })) - - def get_coupons_status( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_coupons_status()(uint64,uint64,uint64,(uint64,uint64),bool)", - })) - - def get_time_periods( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_time_periods()(uint64,uint64)[]", - })) - - def pay_coupon( - self, - args: tuple[str, bytes | str] | PayCouponArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "pay_coupon(address,byte[])(uint64,uint64,byte[])", - "args": method_args, - })) - - def asset_transfer( - self, - args: tuple[str, str, int] | AssetTransferArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "asset_transfer(address,address,uint64)uint64", - "args": method_args, - })) - - def set_secondary_time_events( - self, - args: tuple[list[int]] | SetSecondaryTimeEventsArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "set_secondary_time_events(uint64[])(uint64,uint64)", - "args": method_args, - })) - - def set_default_status( - self, - args: tuple[bool] | SetDefaultStatusArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "set_default_status(bool)uint64", - "args": method_args, - })) - - def primary_distribution( - self, - args: tuple[str, int] | PrimaryDistributionArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "primary_distribution(address,uint64)uint64", - "args": method_args, - })) - - def get_asset_info( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)", - })) - - def get_time_events( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_time_events()uint64[]", - })) - - def get_secondary_market_schedule( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_secondary_market_schedule()uint64[]", - })) - - def get_asset_metadata( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", - })) - - def account_gov_suspension( - self, - args: tuple[str, bool] | AccountGovSuspensionArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_gov_suspension(address,bool)uint64", - "args": method_args, - })) - - def account_open( - self, - args: tuple[str, str] | AccountOpenArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_open(address,address)uint64", - "args": method_args, - })) - - def account_close( - self, - args: tuple[str] | AccountCloseArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_close(address)(uint64,uint64)", - "args": method_args, - })) - - def account_update_payment_address( - self, - args: tuple[str, str] | AccountUpdatePaymentAddressArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_update_payment_address(address,address)uint64", - "args": method_args, - })) - - def account_get_info( - self, - args: tuple[str] | AccountGetInfoArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_get_info(address)(address,uint64,uint64,uint64,bool)", - "args": method_args, - })) - - def rbac_rotate_arranger( - self, - args: tuple[str] | RbacRotateArrangerArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_rotate_arranger(address)uint64", - "args": method_args, - })) - - def rbac_set_op_daemon( - self, - args: tuple[str] | RbacSetOpDaemonArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_set_op_daemon(address)uint64", - "args": method_args, - })) - - def rbac_assign_role( - self, - args: tuple[int, str, bytes | str] | RbacAssignRoleArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_assign_role(uint8,address,byte[])uint64", - "args": method_args, - })) - - def rbac_revoke_role( - self, - args: tuple[int, str] | RbacRevokeRoleArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_revoke_role(uint8,address)uint64", - "args": method_args, - })) - - def rbac_gov_asset_suspension( - self, - args: tuple[bool] | RbacGovAssetSuspensionArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_gov_asset_suspension(bool)uint64", - "args": method_args, - })) - - def rbac_get_arranger( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_arranger()address", - })) - - def rbac_get_address_roles( - self, - args: tuple[str] | RbacGetAddressRolesArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", - "args": method_args, - })) - - def rbac_get_role_config( - self, - args: tuple[int, str] | RbacGetRoleConfigArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_role_config(uint8,address)(uint64,uint64)", - "args": method_args, - })) - - def asset_create( - self, - args: tuple[str, AssetMetadata] | AssetCreateArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void", - "args": method_args, - })) - - def clear_state( - self, - params: algokit_utils.AppClientBareCallParams | None = None, - - ) -> Transaction: - return self.app_client.create_transaction.bare.clear_state( - params, - - ) - - -class _PerpetualBondUpdateSend: - def __init__(self, app_client: algokit_utils.AppClient): - self.app_client = app_client - - def asset_update( - self, - args: tuple[AssetMetadata] | AssetUpdateArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.SendAppTransactionResult[None]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - compilation_params = compilation_params or algokit_utils.AppClientCompilationParams() - response = self.app_client.send.update(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void", - "args": method_args, - }), send_params=send_params, compilation_params=compilation_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppUpdateTransactionResult[None], parsed_response) - - -class PerpetualBondSend: - def __init__(self, app_client: algokit_utils.AppClient): - self.app_client = app_client - - @property - def update(self) -> "_PerpetualBondUpdateSend": - return _PerpetualBondUpdateSend(self.app_client) - - def asset_config( - self, - args: tuple[int, int, int, int, int, int, int, list[int], list[int], list[tuple[int, int]]] | AssetConfigArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[None]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[None], parsed_response) - - def update_interest_rate( - self, - args: tuple[int] | UpdateInterestRateArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "update_interest_rate(uint16)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def get_account_units_current_value( - self, - args: tuple[str, int] | GetAccountUnitsCurrentValueArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[CurrentUnitsValue]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64))", - "args": method_args, - }), send_params=send_params) - parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(CurrentUnitsValue, typing.cast(dict, response.abi_return))) # type: ignore - return typing.cast(algokit_utils.SendAppTransactionResult[CurrentUnitsValue], parsed_response) - - def get_payment_amount( - self, - args: tuple[str] | GetPaymentAmountArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[PaymentAmounts]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_payment_amount(address)(uint64,uint64)", - "args": method_args, - }), send_params=send_params) - parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(PaymentAmounts, typing.cast(dict, response.abi_return))) # type: ignore - return typing.cast(algokit_utils.SendAppTransactionResult[PaymentAmounts], parsed_response) - - def get_coupons_status( - self, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[CouponsInfo]: - - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_coupons_status()(uint64,uint64,uint64,(uint64,uint64),bool)", - }), send_params=send_params) - parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(CouponsInfo, typing.cast(dict, response.abi_return))) # type: ignore - return typing.cast(algokit_utils.SendAppTransactionResult[CouponsInfo], parsed_response) - - def get_time_periods( - self, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[list[tuple[int, int]]]: - - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_time_periods()(uint64,uint64)[]", - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[list[tuple[int, int]]], parsed_response) - - def pay_coupon( - self, - args: tuple[str, bytes | str] | PayCouponArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[PaymentResult]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "pay_coupon(address,byte[])(uint64,uint64,byte[])", - "args": method_args, - }), send_params=send_params) - parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(PaymentResult, typing.cast(dict, response.abi_return))) # type: ignore - return typing.cast(algokit_utils.SendAppTransactionResult[PaymentResult], parsed_response) - - def asset_transfer( - self, - args: tuple[str, str, int] | AssetTransferArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "asset_transfer(address,address,uint64)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def set_secondary_time_events( - self, - args: tuple[list[int]] | SetSecondaryTimeEventsArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[SecondaryMarketSchedule]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "set_secondary_time_events(uint64[])(uint64,uint64)", - "args": method_args, - }), send_params=send_params) - parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(SecondaryMarketSchedule, typing.cast(dict, response.abi_return))) # type: ignore - return typing.cast(algokit_utils.SendAppTransactionResult[SecondaryMarketSchedule], parsed_response) - - def set_default_status( - self, - args: tuple[bool] | SetDefaultStatusArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "set_default_status(bool)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def primary_distribution( - self, - args: tuple[str, int] | PrimaryDistributionArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "primary_distribution(address,uint64)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def get_asset_info( - self, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[AssetInfo]: - - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)", - }), send_params=send_params) - parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(AssetInfo, typing.cast(dict, response.abi_return))) # type: ignore - return typing.cast(algokit_utils.SendAppTransactionResult[AssetInfo], parsed_response) - - def get_time_events( - self, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[list[int]]: - - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_time_events()uint64[]", - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[list[int]], parsed_response) - - def get_secondary_market_schedule( - self, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[list[int]]: - - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_secondary_market_schedule()uint64[]", - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[list[int]], parsed_response) - - def get_asset_metadata( - self, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[AssetMetadata]: - - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", - }), send_params=send_params) - parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(AssetMetadata, typing.cast(dict, response.abi_return))) # type: ignore - return typing.cast(algokit_utils.SendAppTransactionResult[AssetMetadata], parsed_response) - - def account_gov_suspension( - self, - args: tuple[str, bool] | AccountGovSuspensionArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_gov_suspension(address,bool)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def account_open( - self, - args: tuple[str, str] | AccountOpenArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_open(address,address)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def account_close( - self, - args: tuple[str] | AccountCloseArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[tuple[int, int]]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_close(address)(uint64,uint64)", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[tuple[int, int]], parsed_response) - - def account_update_payment_address( - self, - args: tuple[str, str] | AccountUpdatePaymentAddressArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_update_payment_address(address,address)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def account_get_info( - self, - args: tuple[str] | AccountGetInfoArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[AccountInfo]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_get_info(address)(address,uint64,uint64,uint64,bool)", - "args": method_args, - }), send_params=send_params) - parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(AccountInfo, typing.cast(dict, response.abi_return))) # type: ignore - return typing.cast(algokit_utils.SendAppTransactionResult[AccountInfo], parsed_response) - - def rbac_rotate_arranger( - self, - args: tuple[str] | RbacRotateArrangerArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_rotate_arranger(address)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def rbac_set_op_daemon( - self, - args: tuple[str] | RbacSetOpDaemonArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_set_op_daemon(address)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def rbac_assign_role( - self, - args: tuple[int, str, bytes | str] | RbacAssignRoleArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_assign_role(uint8,address,byte[])uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def rbac_revoke_role( - self, - args: tuple[int, str] | RbacRevokeRoleArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_revoke_role(uint8,address)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def rbac_gov_asset_suspension( - self, - args: tuple[bool] | RbacGovAssetSuspensionArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_gov_asset_suspension(bool)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def rbac_get_arranger( - self, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[str]: - - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_arranger()address", - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[str], parsed_response) - - def rbac_get_address_roles( - self, - args: tuple[str] | RbacGetAddressRolesArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[tuple[bool, bool, bool, bool, bool]]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[tuple[bool, bool, bool, bool, bool]], parsed_response) - - def rbac_get_role_config( - self, - args: tuple[int, str] | RbacGetRoleConfigArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[RoleConfig]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_role_config(uint8,address)(uint64,uint64)", - "args": method_args, - }), send_params=send_params) - parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(RoleConfig, typing.cast(dict, response.abi_return))) # type: ignore - return typing.cast(algokit_utils.SendAppTransactionResult[RoleConfig], parsed_response) - - def asset_create( - self, - args: tuple[str, AssetMetadata] | AssetCreateArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[None]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[None], parsed_response) - - def clear_state( - self, - params: algokit_utils.AppClientBareCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[algokit_utils.ABIReturn]: - return self.app_client.send.bare.clear_state( - params, - send_params=send_params, - ) - - -class GlobalStateValue(typing.TypedDict): - """Shape of global_state state key values""" - arranger: str - op_daemon: str - asset_suspended: int - asset_defaulted: int - total_units: int - circulating_units: int - unit_value: int - status: int - denomination_asset_id: int - settlement_asset_id: int - day_count_convention: int - metadata: bytes - principal_discount: int - interest_rate: int - total_coupons: int - primary_distribution_opening_date: int - primary_distribution_closure_date: int - issuance_date: int - secondary_market_opening_date: int - secondary_market_closure_date: int - maturity_date: int - paid_coupon_units: int - coupon_period: int - -class BoxStateValue(typing.TypedDict): - """Shape of box state key values""" - time_events: list[int] - time_periods: list[tuple[int, int]] - -class PerpetualBondState: - """Methods to access state for the current PerpetualBond app""" - - def __init__(self, app_client: algokit_utils.AppClient): - self.app_client = app_client - - @property - def global_state( - self - ) -> "_GlobalState": - """Methods to access global_state for the current app""" - return _GlobalState(self.app_client) - - @property - def box( - self - ) -> "_BoxState": - """Methods to access box for the current app""" - return _BoxState(self.app_client) - -class _GlobalState: - def __init__(self, app_client: algokit_utils.AppClient): - self.app_client = app_client - - # Pre-generated mapping of value types to their struct classes - self._struct_classes: dict[str, typing.Type[typing.Any]] = {} - - def get_all(self) -> GlobalStateValue: - """Get all current keyed values from global_state state""" - result = self.app_client.state.global_state.get_all() - if not result: - return typing.cast(GlobalStateValue, {}) - - converted = {} - for key, value in result.items(): - key_info = self.app_client.app_spec.state.keys.global_state.get(key) - struct_class = self._struct_classes.get(key_info.value_type) if key_info else None - converted[key] = ( - _init_dataclass(struct_class, value) if struct_class and isinstance(value, dict) - else value - ) - return typing.cast(GlobalStateValue, converted) - - @property - def arranger(self) -> str: - """Get the current value of the arranger key in global_state state""" - value = self.app_client.state.global_state.get_value("arranger") - if isinstance(value, dict) and "address" in self._struct_classes: - return _init_dataclass(self._struct_classes["address"], value) # type: ignore - return typing.cast(str, value) - - @property - def op_daemon(self) -> str: - """Get the current value of the op_daemon key in global_state state""" - value = self.app_client.state.global_state.get_value("op_daemon") - if isinstance(value, dict) and "address" in self._struct_classes: - return _init_dataclass(self._struct_classes["address"], value) # type: ignore - return typing.cast(str, value) - - @property - def asset_suspended(self) -> int: - """Get the current value of the asset_suspended key in global_state state""" - value = self.app_client.state.global_state.get_value("asset_suspended") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def asset_defaulted(self) -> int: - """Get the current value of the asset_defaulted key in global_state state""" - value = self.app_client.state.global_state.get_value("asset_defaulted") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def total_units(self) -> int: - """Get the current value of the total_units key in global_state state""" - value = self.app_client.state.global_state.get_value("total_units") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def circulating_units(self) -> int: - """Get the current value of the circulating_units key in global_state state""" - value = self.app_client.state.global_state.get_value("circulating_units") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def unit_value(self) -> int: - """Get the current value of the unit_value key in global_state state""" - value = self.app_client.state.global_state.get_value("unit_value") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def status(self) -> int: - """Get the current value of the status key in global_state state""" - value = self.app_client.state.global_state.get_value("status") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def denomination_asset_id(self) -> int: - """Get the current value of the denomination_asset_id key in global_state state""" - value = self.app_client.state.global_state.get_value("denomination_asset_id") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def settlement_asset_id(self) -> int: - """Get the current value of the settlement_asset_id key in global_state state""" - value = self.app_client.state.global_state.get_value("settlement_asset_id") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def day_count_convention(self) -> int: - """Get the current value of the day_count_convention key in global_state state""" - value = self.app_client.state.global_state.get_value("day_count_convention") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def metadata(self) -> bytes: - """Get the current value of the metadata key in global_state state""" - value = self.app_client.state.global_state.get_value("metadata") - if isinstance(value, dict) and "AVMBytes" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMBytes"], value) # type: ignore - return typing.cast(bytes, value) - - @property - def principal_discount(self) -> int: - """Get the current value of the principal_discount key in global_state state""" - value = self.app_client.state.global_state.get_value("principal_discount") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def interest_rate(self) -> int: - """Get the current value of the interest_rate key in global_state state""" - value = self.app_client.state.global_state.get_value("interest_rate") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def total_coupons(self) -> int: - """Get the current value of the total_coupons key in global_state state""" - value = self.app_client.state.global_state.get_value("total_coupons") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def primary_distribution_opening_date(self) -> int: - """Get the current value of the primary_distribution_opening_date key in global_state state""" - value = self.app_client.state.global_state.get_value("primary_distribution_opening_date") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def primary_distribution_closure_date(self) -> int: - """Get the current value of the primary_distribution_closure_date key in global_state state""" - value = self.app_client.state.global_state.get_value("primary_distribution_closure_date") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def issuance_date(self) -> int: - """Get the current value of the issuance_date key in global_state state""" - value = self.app_client.state.global_state.get_value("issuance_date") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def secondary_market_opening_date(self) -> int: - """Get the current value of the secondary_market_opening_date key in global_state state""" - value = self.app_client.state.global_state.get_value("secondary_market_opening_date") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def secondary_market_closure_date(self) -> int: - """Get the current value of the secondary_market_closure_date key in global_state state""" - value = self.app_client.state.global_state.get_value("secondary_market_closure_date") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def maturity_date(self) -> int: - """Get the current value of the maturity_date key in global_state state""" - value = self.app_client.state.global_state.get_value("maturity_date") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def paid_coupon_units(self) -> int: - """Get the current value of the paid_coupon_units key in global_state state""" - value = self.app_client.state.global_state.get_value("paid_coupon_units") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def coupon_period(self) -> int: - """Get the current value of the coupon_period key in global_state state""" - value = self.app_client.state.global_state.get_value("coupon_period") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - -class _BoxState: - def __init__(self, app_client: algokit_utils.AppClient): - self.app_client = app_client - - # Pre-generated mapping of value types to their struct classes - self._struct_classes: dict[str, typing.Type[typing.Any]] = { - "RoleConfig": RoleConfig, - "AccountInfo": AccountInfo - } - - def get_all(self) -> BoxStateValue: - """Get all current keyed values from box state""" - result = self.app_client.state.box.get_all() - if not result: - return typing.cast(BoxStateValue, {}) - - converted = {} - for key, value in result.items(): - key_info = self.app_client.app_spec.state.keys.box.get(key) - struct_class = self._struct_classes.get(key_info.value_type) if key_info else None - converted[key] = ( - _init_dataclass(struct_class, value) if struct_class and isinstance(value, dict) - else value - ) - return typing.cast(BoxStateValue, converted) - - @property - def time_events(self) -> list[int]: - """Get the current value of the time_events key in box state""" - value = self.app_client.state.box.get_value("time_events") - if isinstance(value, dict) and "uint64[]" in self._struct_classes: - return _init_dataclass(self._struct_classes["uint64[]"], value) # type: ignore - return typing.cast(list[int], value) - - @property - def time_periods(self) -> list[tuple[int, int]]: - """Get the current value of the time_periods key in box state""" - value = self.app_client.state.box.get_value("time_periods") - if isinstance(value, dict) and "(uint64,uint64)[]" in self._struct_classes: - return _init_dataclass(self._struct_classes["(uint64,uint64)[]"], value) # type: ignore - return typing.cast(list[tuple[int, int]], value) - - @property - def account_manager(self) -> "_MapState[str, RoleConfig]": - """Get values from the account_manager map in box state""" - return _MapState( - self.app_client.state.box, - "account_manager", - self._struct_classes.get("RoleConfig") - ) - - @property - def primary_dealer(self) -> "_MapState[str, RoleConfig]": - """Get values from the primary_dealer map in box state""" - return _MapState( - self.app_client.state.box, - "primary_dealer", - self._struct_classes.get("RoleConfig") - ) - - @property - def trustee(self) -> "_MapState[str, RoleConfig]": - """Get values from the trustee map in box state""" - return _MapState( - self.app_client.state.box, - "trustee", - self._struct_classes.get("RoleConfig") - ) - - @property - def authority(self) -> "_MapState[str, RoleConfig]": - """Get values from the authority map in box state""" - return _MapState( - self.app_client.state.box, - "authority", - self._struct_classes.get("RoleConfig") - ) - - @property - def interest_oracle(self) -> "_MapState[str, RoleConfig]": - """Get values from the interest_oracle map in box state""" - return _MapState( - self.app_client.state.box, - "interest_oracle", - self._struct_classes.get("RoleConfig") - ) - - @property - def account(self) -> "_MapState[str, AccountInfo]": - """Get values from the account map in box state""" - return _MapState( - self.app_client.state.box, - "account", - self._struct_classes.get("AccountInfo") - ) - -_KeyType = typing.TypeVar("_KeyType") -_ValueType = typing.TypeVar("_ValueType") - -class _AppClientStateMethodsProtocol(typing.Protocol): - def get_map(self, map_name: str) -> dict[typing.Any, typing.Any]: - ... - def get_map_value(self, map_name: str, key: typing.Any) -> typing.Any | None: - ... - -class _MapState(typing.Generic[_KeyType, _ValueType]): - """Generic class for accessing state maps with strongly typed keys and values""" - - def __init__(self, state_accessor: _AppClientStateMethodsProtocol, map_name: str, - struct_class: typing.Type[_ValueType] | None = None): - self._state_accessor = state_accessor - self._map_name = map_name - self._struct_class = struct_class - - def get_map(self) -> dict[_KeyType, _ValueType]: - """Get all current values in the map""" - result = self._state_accessor.get_map(self._map_name) - if self._struct_class and result: - return {k: _init_dataclass(self._struct_class, v) if isinstance(v, dict) else v - for k, v in result.items()} # type: ignore - return typing.cast(dict[_KeyType, _ValueType], result or {}) - - def get_value(self, key: _KeyType) -> _ValueType | None: - """Get a value from the map by key""" - key_value = dataclasses.asdict(key) if dataclasses.is_dataclass(key) else key # type: ignore - value = self._state_accessor.get_map_value(self._map_name, key_value) - if value is not None and self._struct_class and isinstance(value, dict): - return _init_dataclass(self._struct_class, value) # type: ignore - return typing.cast(_ValueType | None, value) - - -class PerpetualBondClient: - """Client for interacting with PerpetualBond smart contract""" - - @typing.overload - def __init__(self, app_client: algokit_utils.AppClient) -> None: ... - - @typing.overload - def __init__( - self, - *, - algorand: _AlgoKitAlgorandClient, - app_id: int, - app_name: str | None = None, - default_sender: str | None = None, - default_signer: TransactionSigner | None = None, - approval_source_map: SourceMap | None = None, - clear_source_map: SourceMap | None = None, - ) -> None: ... - - def __init__( - self, - app_client: algokit_utils.AppClient | None = None, - *, - algorand: _AlgoKitAlgorandClient | None = None, - app_id: int | None = None, - app_name: str | None = None, - default_sender: str | None = None, - default_signer: TransactionSigner | None = None, - approval_source_map: SourceMap | None = None, - clear_source_map: SourceMap | None = None, - ) -> None: - if app_client: - self.app_client = app_client - elif algorand and app_id: - self.app_client = algokit_utils.AppClient( - algokit_utils.AppClientParams( - algorand=algorand, - app_spec=APP_SPEC, - app_id=app_id, - app_name=app_name, - default_sender=default_sender, - default_signer=default_signer, - approval_source_map=approval_source_map, - clear_source_map=clear_source_map, - ) - ) - else: - raise ValueError("Either app_client or algorand and app_id must be provided") - - self.params = PerpetualBondParams(self.app_client) - self.create_transaction = PerpetualBondCreateTransactionParams(self.app_client) - self.send = PerpetualBondSend(self.app_client) - self.state = PerpetualBondState(self.app_client) - - @staticmethod - def from_creator_and_name( - creator_address: str, - app_name: str, - algorand: _AlgoKitAlgorandClient, - default_sender: str | None = None, - default_signer: TransactionSigner | None = None, - approval_source_map: SourceMap | None = None, - clear_source_map: SourceMap | None = None, - ignore_cache: bool | None = None, - app_lookup_cache: algokit_utils.ApplicationLookup | None = None, - ) -> "PerpetualBondClient": - return PerpetualBondClient( - algokit_utils.AppClient.from_creator_and_name( - creator_address=creator_address, - app_name=app_name, - app_spec=APP_SPEC, - algorand=algorand, - default_sender=default_sender, - default_signer=default_signer, - approval_source_map=approval_source_map, - clear_source_map=clear_source_map, - ignore_cache=ignore_cache, - app_lookup_cache=app_lookup_cache, - ) - ) - - @staticmethod - def from_network( - algorand: _AlgoKitAlgorandClient, - app_name: str | None = None, - default_sender: str | None = None, - default_signer: TransactionSigner | None = None, - approval_source_map: SourceMap | None = None, - clear_source_map: SourceMap | None = None, - ) -> "PerpetualBondClient": - return PerpetualBondClient( - algokit_utils.AppClient.from_network( - app_spec=APP_SPEC, - algorand=algorand, - app_name=app_name, - default_sender=default_sender, - default_signer=default_signer, - approval_source_map=approval_source_map, - clear_source_map=clear_source_map, - ) - ) - - @property - def app_id(self) -> int: - return self.app_client.app_id - - @property - def app_address(self) -> str: - return self.app_client.app_address - - @property - def app_name(self) -> str: - return self.app_client.app_name - - @property - def app_spec(self) -> algokit_utils.Arc56Contract: - return self.app_client.app_spec - - @property - def algorand(self) -> _AlgoKitAlgorandClient: - return self.app_client.algorand - - def clone( - self, - app_name: str | None = None, - default_sender: str | None = None, - default_signer: TransactionSigner | None = None, - approval_source_map: SourceMap | None = None, - clear_source_map: SourceMap | None = None, - ) -> "PerpetualBondClient": - return PerpetualBondClient( - self.app_client.clone( - app_name=app_name, - default_sender=default_sender, - default_signer=default_signer, - approval_source_map=approval_source_map, - clear_source_map=clear_source_map, - ) - ) - - def new_group(self) -> "PerpetualBondComposer": - return PerpetualBondComposer(self) - - @typing.overload - def decode_return_value( - self, - method: typing.Literal["asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void"], - return_value: algokit_utils.ABIReturn | None - ) -> None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["update_interest_rate(uint16)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64))"], - return_value: algokit_utils.ABIReturn | None - ) -> CurrentUnitsValue | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["get_payment_amount(address)(uint64,uint64)"], - return_value: algokit_utils.ABIReturn | None - ) -> PaymentAmounts | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["get_coupons_status()(uint64,uint64,uint64,(uint64,uint64),bool)"], - return_value: algokit_utils.ABIReturn | None - ) -> CouponsInfo | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["get_time_periods()(uint64,uint64)[]"], - return_value: algokit_utils.ABIReturn | None - ) -> list[tuple[int, int]] | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["pay_coupon(address,byte[])(uint64,uint64,byte[])"], - return_value: algokit_utils.ABIReturn | None - ) -> PaymentResult | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["asset_transfer(address,address,uint64)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["set_secondary_time_events(uint64[])(uint64,uint64)"], - return_value: algokit_utils.ABIReturn | None - ) -> SecondaryMarketSchedule | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["set_default_status(bool)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["primary_distribution(address,uint64)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)"], - return_value: algokit_utils.ABIReturn | None - ) -> AssetInfo | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["get_time_events()uint64[]"], - return_value: algokit_utils.ABIReturn | None - ) -> list[int] | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["get_secondary_market_schedule()uint64[]"], - return_value: algokit_utils.ABIReturn | None - ) -> list[int] | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)"], - return_value: algokit_utils.ABIReturn | None - ) -> AssetMetadata | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["account_gov_suspension(address,bool)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["account_open(address,address)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["account_close(address)(uint64,uint64)"], - return_value: algokit_utils.ABIReturn | None - ) -> tuple[int, int] | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["account_update_payment_address(address,address)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["account_get_info(address)(address,uint64,uint64,uint64,bool)"], - return_value: algokit_utils.ABIReturn | None - ) -> AccountInfo | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["rbac_rotate_arranger(address)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["rbac_set_op_daemon(address)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["rbac_assign_role(uint8,address,byte[])uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["rbac_revoke_role(uint8,address)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["rbac_gov_asset_suspension(bool)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["rbac_get_arranger()address"], - return_value: algokit_utils.ABIReturn | None - ) -> str | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["rbac_get_address_roles(address)(bool,bool,bool,bool,bool)"], - return_value: algokit_utils.ABIReturn | None - ) -> tuple[bool, bool, bool, bool, bool] | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["rbac_get_role_config(uint8,address)(uint64,uint64)"], - return_value: algokit_utils.ABIReturn | None - ) -> RoleConfig | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void"], - return_value: algokit_utils.ABIReturn | None - ) -> None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void"], - return_value: algokit_utils.ABIReturn | None - ) -> None: ... - @typing.overload - def decode_return_value( - self, - method: str, - return_value: algokit_utils.ABIReturn | None - ) -> algokit_utils.ABIValue | algokit_utils.ABIStruct | None: ... - - def decode_return_value( - self, - method: str, - return_value: algokit_utils.ABIReturn | None - ) -> algokit_utils.ABIValue | algokit_utils.ABIStruct | AccountInfo | AssetInfo | AssetMetadata | CouponsInfo | CurrentUnitsValue | None | PaymentAmounts | PaymentResult | RoleConfig | SecondaryMarketSchedule | int | list[int] | list[tuple[int, int]] | str | tuple[bool, bool, bool, bool, bool] | tuple[int, int]: - """Decode ABI return value for the given method.""" - if return_value is None: - return None - - arc56_method = self.app_spec.get_arc56_method(method) - decoded = return_value.get_arc56_value(arc56_method, self.app_spec.structs) - - # If method returns a struct, convert the dict to appropriate dataclass - if (arc56_method and - arc56_method.returns and - arc56_method.returns.struct and - isinstance(decoded, dict)): - struct_class = globals().get(arc56_method.returns.struct) - if struct_class: - return struct_class(**typing.cast(dict, decoded)) - return decoded - - -@dataclasses.dataclass(frozen=True) -class PerpetualBondMethodCallCreateParams( - algokit_utils.AppClientCreateSchema, algokit_utils.BaseAppClientMethodCallParams[ - AssetCreateArgs, - str | None, - ] -): - """Parameters for creating PerpetualBond contract using ABI""" - on_complete: typing.Literal[OnComplete.NoOpOC] | None = None - method: str | None = None - - def to_algokit_utils_params(self) -> algokit_utils.AppClientMethodCallCreateParams: - method_args = _parse_abi_args(self.args) - return algokit_utils.AppClientMethodCallCreateParams( - **{ - **self.__dict__, - "method": self.method or getattr(self.args, "abi_method_signature", None), - "args": method_args, - } - ) - -@dataclasses.dataclass(frozen=True) -class PerpetualBondMethodCallUpdateParams( - algokit_utils.BaseAppClientMethodCallParams[ - AssetUpdateArgs, - str | None, - ] -): - """Parameters for calling PerpetualBond contract using ABI""" - on_complete: typing.Literal[OnComplete.UpdateApplicationOC] | None = None - method: str | None = None - - def to_algokit_utils_params(self) -> algokit_utils.AppClientMethodCallParams: - method_args = _parse_abi_args(self.args) - return algokit_utils.AppClientMethodCallParams( - **{ - **self.__dict__, - "method": self.method or getattr(self.args, "abi_method_signature", None), - "args": method_args, - } - ) - -class PerpetualBondFactory(algokit_utils.TypedAppFactoryProtocol[PerpetualBondMethodCallCreateParams, PerpetualBondMethodCallUpdateParams, None]): - """Factory for deploying and managing PerpetualBondClient smart contracts""" - - def __init__( - self, - algorand: _AlgoKitAlgorandClient, - *, - app_name: str | None = None, - default_sender: str | None = None, - default_signer: TransactionSigner | None = None, - version: str | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None, - ): - self.app_factory = algokit_utils.AppFactory( - params=algokit_utils.AppFactoryParams( - algorand=algorand, - app_spec=APP_SPEC, - app_name=app_name, - default_sender=default_sender, - default_signer=default_signer, - version=version, - compilation_params=compilation_params, - ) - ) - self.params = PerpetualBondFactoryParams(self.app_factory) - self.create_transaction = PerpetualBondFactoryCreateTransaction(self.app_factory) - self.send = PerpetualBondFactorySend(self.app_factory) - - @property - def app_name(self) -> str: - return self.app_factory.app_name - - @property - def app_spec(self) -> algokit_utils.Arc56Contract: - return self.app_factory.app_spec - - @property - def algorand(self) -> _AlgoKitAlgorandClient: - return self.app_factory.algorand - - def deploy( - self, - *, - on_update: algokit_utils.OnUpdate | None = None, - on_schema_break: algokit_utils.OnSchemaBreak | None = None, - create_params: PerpetualBondMethodCallCreateParams | None = None, - update_params: PerpetualBondMethodCallUpdateParams | None = None, - delete_params: None = None, - existing_deployments: algokit_utils.ApplicationLookup | None = None, - ignore_cache: bool = False, - app_name: str | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None, - send_params: algokit_utils.SendParams | None = None, - ) -> tuple[PerpetualBondClient, algokit_utils.AppFactoryDeployResult]: - """Deploy the application""" - deploy_response = self.app_factory.deploy( - on_update=on_update, - on_schema_break=on_schema_break, - create_params=create_params.to_algokit_utils_params() if create_params else None, - update_params=update_params.to_algokit_utils_params() if update_params else None, - delete_params=delete_params, - existing_deployments=existing_deployments, - ignore_cache=ignore_cache, - app_name=app_name, - compilation_params=compilation_params, - send_params=send_params, - ) - - return PerpetualBondClient(deploy_response[0]), deploy_response[1] - - def get_app_client_by_creator_and_name( - self, - creator_address: str, - app_name: str, - default_sender: str | None = None, - default_signer: TransactionSigner | None = None, - ignore_cache: bool | None = None, - app_lookup_cache: algokit_utils.ApplicationLookup | None = None, - approval_source_map: SourceMap | None = None, - clear_source_map: SourceMap | None = None, - ) -> PerpetualBondClient: - """Get an app client by creator address and name""" - return PerpetualBondClient( - self.app_factory.get_app_client_by_creator_and_name( - creator_address, - app_name, - default_sender, - default_signer, - ignore_cache, - app_lookup_cache, - approval_source_map, - clear_source_map, - ) - ) - - def get_app_client_by_id( - self, - app_id: int, - app_name: str | None = None, - default_sender: str | None = None, - default_signer: TransactionSigner | None = None, - approval_source_map: SourceMap | None = None, - clear_source_map: SourceMap | None = None, - ) -> PerpetualBondClient: - """Get an app client by app ID""" - return PerpetualBondClient( - self.app_factory.get_app_client_by_id( - app_id, - app_name, - default_sender, - default_signer, - approval_source_map, - clear_source_map, - ) - ) - - -class PerpetualBondFactoryParams: - """Parameters for creating transactions for PerpetualBond contract""" - - def __init__(self, app_factory: algokit_utils.AppFactory): - self.app_factory = app_factory - self.create = PerpetualBondFactoryCreateParams(app_factory) - self.update = PerpetualBondFactoryUpdateParams(app_factory) - self.delete = PerpetualBondFactoryDeleteParams(app_factory) - -class PerpetualBondFactoryCreateParams: - """Parameters for 'create' operations of PerpetualBond contract""" - - def __init__(self, app_factory: algokit_utils.AppFactory): - self.app_factory = app_factory - - def bare( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateParams: - """Creates an instance using a bare call""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.bare.create( - algokit_utils.AppFactoryCreateParams(**dataclasses.asdict(params)), - compilation_params=compilation_params) - - def asset_config( - self, - args: tuple[int, int, int, int, int, int, int, list[int], list[int], list[tuple[int, int]]] | AssetConfigArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def update_interest_rate( - self, - args: tuple[int] | UpdateInterestRateArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the update_interest_rate(uint16)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "update_interest_rate(uint16)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def get_account_units_current_value( - self, - args: tuple[str, int] | GetAccountUnitsCurrentValueArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64)) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64))", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def get_payment_amount( - self, - args: tuple[str] | GetPaymentAmountArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the get_payment_amount(address)(uint64,uint64) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "get_payment_amount(address)(uint64,uint64)", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def get_coupons_status( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the get_coupons_status()(uint64,uint64,uint64,(uint64,uint64),bool) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "get_coupons_status()(uint64,uint64,uint64,(uint64,uint64),bool)", - "args": None, - } - ), - compilation_params=compilation_params - ) - - def get_time_periods( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the get_time_periods()(uint64,uint64)[] ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "get_time_periods()(uint64,uint64)[]", - "args": None, - } - ), - compilation_params=compilation_params - ) - - def pay_coupon( - self, - args: tuple[str, bytes | str] | PayCouponArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the pay_coupon(address,byte[])(uint64,uint64,byte[]) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "pay_coupon(address,byte[])(uint64,uint64,byte[])", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def asset_transfer( - self, - args: tuple[str, str, int] | AssetTransferArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the asset_transfer(address,address,uint64)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "asset_transfer(address,address,uint64)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def set_secondary_time_events( - self, - args: tuple[list[int]] | SetSecondaryTimeEventsArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the set_secondary_time_events(uint64[])(uint64,uint64) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "set_secondary_time_events(uint64[])(uint64,uint64)", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def set_default_status( - self, - args: tuple[bool] | SetDefaultStatusArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the set_default_status(bool)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "set_default_status(bool)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def primary_distribution( - self, - args: tuple[str, int] | PrimaryDistributionArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the primary_distribution(address,uint64)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "primary_distribution(address,uint64)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def get_asset_info( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)", - "args": None, - } - ), - compilation_params=compilation_params - ) - - def get_time_events( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the get_time_events()uint64[] ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "get_time_events()uint64[]", - "args": None, - } - ), - compilation_params=compilation_params - ) - - def get_secondary_market_schedule( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the get_secondary_market_schedule()uint64[] ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "get_secondary_market_schedule()uint64[]", - "args": None, - } - ), - compilation_params=compilation_params - ) - - def get_asset_metadata( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", - "args": None, - } - ), - compilation_params=compilation_params - ) - - def account_gov_suspension( - self, - args: tuple[str, bool] | AccountGovSuspensionArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the account_gov_suspension(address,bool)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "account_gov_suspension(address,bool)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def account_open( - self, - args: tuple[str, str] | AccountOpenArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the account_open(address,address)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "account_open(address,address)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def account_close( - self, - args: tuple[str] | AccountCloseArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the account_close(address)(uint64,uint64) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "account_close(address)(uint64,uint64)", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def account_update_payment_address( - self, - args: tuple[str, str] | AccountUpdatePaymentAddressArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the account_update_payment_address(address,address)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "account_update_payment_address(address,address)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def account_get_info( - self, - args: tuple[str] | AccountGetInfoArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the account_get_info(address)(address,uint64,uint64,uint64,bool) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "account_get_info(address)(address,uint64,uint64,uint64,bool)", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def rbac_rotate_arranger( - self, - args: tuple[str] | RbacRotateArrangerArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_rotate_arranger(address)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "rbac_rotate_arranger(address)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def rbac_set_op_daemon( - self, - args: tuple[str] | RbacSetOpDaemonArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_set_op_daemon(address)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "rbac_set_op_daemon(address)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def rbac_assign_role( - self, - args: tuple[int, str, bytes | str] | RbacAssignRoleArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_assign_role(uint8,address,byte[])uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "rbac_assign_role(uint8,address,byte[])uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def rbac_revoke_role( - self, - args: tuple[int, str] | RbacRevokeRoleArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_revoke_role(uint8,address)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "rbac_revoke_role(uint8,address)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def rbac_gov_asset_suspension( - self, - args: tuple[bool] | RbacGovAssetSuspensionArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_gov_asset_suspension(bool)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "rbac_gov_asset_suspension(bool)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def rbac_get_arranger( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_get_arranger()address ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "rbac_get_arranger()address", - "args": None, - } - ), - compilation_params=compilation_params - ) - - def rbac_get_address_roles( - self, - args: tuple[str] | RbacGetAddressRolesArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_get_address_roles(address)(bool,bool,bool,bool,bool) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def rbac_get_role_config( - self, - args: tuple[int, str] | RbacGetRoleConfigArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_get_role_config(uint8,address)(uint64,uint64) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "rbac_get_role_config(uint8,address)(uint64,uint64)", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def asset_create( - self, - args: tuple[str, AssetMetadata] | AssetCreateArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def asset_update( - self, - args: tuple[AssetMetadata] | AssetUpdateArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - -class PerpetualBondFactoryUpdateParams: - """Parameters for 'update' operations of PerpetualBond contract""" - - def __init__(self, app_factory: algokit_utils.AppFactory): - self.app_factory = app_factory - - def bare( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - - ) -> algokit_utils.AppUpdateParams: - """Updates an instance using a bare call""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.bare.deploy_update( - algokit_utils.AppClientBareCallParams(**dataclasses.asdict(params)), - ) - -class PerpetualBondFactoryDeleteParams: - """Parameters for 'delete' operations of PerpetualBond contract""" - - def __init__(self, app_factory: algokit_utils.AppFactory): - self.app_factory = app_factory - - def bare( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - - ) -> algokit_utils.AppDeleteParams: - """Deletes an instance using a bare call""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.bare.deploy_delete( - algokit_utils.AppClientBareCallParams(**dataclasses.asdict(params)), - ) - - -class PerpetualBondFactoryCreateTransaction: - """Create transactions for PerpetualBond contract""" - - def __init__(self, app_factory: algokit_utils.AppFactory): - self.app_factory = app_factory - self.create = PerpetualBondFactoryCreateTransactionCreate(app_factory) - - -class PerpetualBondFactoryCreateTransactionCreate: - """Create new instances of PerpetualBond contract""" - - def __init__(self, app_factory: algokit_utils.AppFactory): - self.app_factory = app_factory - - def bare( - self, - params: algokit_utils.CommonAppCallCreateParams | None = None, - ) -> Transaction: - """Creates a new instance using a bare call""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.create_transaction.bare.create( - algokit_utils.AppFactoryCreateParams(**dataclasses.asdict(params)), - ) - - -class PerpetualBondFactorySend: - """Send calls to PerpetualBond contract""" - - def __init__(self, app_factory: algokit_utils.AppFactory): - self.app_factory = app_factory - self.create = PerpetualBondFactorySendCreate(app_factory) - - -class PerpetualBondFactorySendCreate: - """Send create calls to PerpetualBond contract""" - - def __init__(self, app_factory: algokit_utils.AppFactory): - self.app_factory = app_factory - - def bare( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - send_params: algokit_utils.SendParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None, - ) -> tuple[PerpetualBondClient, algokit_utils.SendAppCreateTransactionResult]: - """Creates a new instance using a bare call""" - params = params or algokit_utils.CommonAppCallCreateParams() - result = self.app_factory.send.bare.create( - algokit_utils.AppFactoryCreateParams(**dataclasses.asdict(params)), - send_params=send_params, - compilation_params=compilation_params - ) - return PerpetualBondClient(result[0]), result[1] - - def asset_create( - self, - args: tuple[str, AssetMetadata] | AssetCreateArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - send_params: algokit_utils.SendParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> tuple[PerpetualBondClient, algokit_utils.AppFactoryCreateMethodCallResult[None]]: - """Creates and sends a transaction using the asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - client, result = self.app_factory.send.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void", - "args": _parse_abi_args(args), - } - ), - send_params=send_params, - compilation_params=compilation_params - ) - return_value = None if result.abi_return is None else typing.cast(None, result.abi_return) - - return PerpetualBondClient(client), algokit_utils.AppFactoryCreateMethodCallResult[None]( - **{ - **result.__dict__, - "app_id": result.app_id, - "abi_return": return_value, - "transaction": result.transaction, - "confirmation": result.confirmation, - "group_id": result.group_id, - "tx_ids": result.tx_ids, - "transactions": result.transactions, - "confirmations": result.confirmations, - "app_address": result.app_address, - } - ) - - -class _PerpetualBondUpdateComposer: - def __init__(self, composer: "PerpetualBondComposer"): - self.composer = composer - def asset_update( - self, - args: tuple[AssetMetadata] | AssetUpdateArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "PerpetualBondComposer": - self.composer._composer.add_app_update_method_call( - self.composer.client.params.update.asset_update( - args=args, - params=params, - compilation_params=compilation_params - ) - ) - self.composer._result_mappers.append( - lambda v: self.composer.client.decode_return_value( - "asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void", v - ) - ) - return self.composer - - -class PerpetualBondComposer: - """Composer for creating transaction groups for PerpetualBond contract calls""" - - def __init__(self, client: "PerpetualBondClient"): - self.client = client - self._composer = client.algorand.new_group() - self._result_mappers: list[typing.Callable[[algokit_utils.ABIReturn | None], object] | None] = [] - - @property - def update(self) -> "_PerpetualBondUpdateComposer": - return _PerpetualBondUpdateComposer(self) - - def asset_config( - self, - args: tuple[int, int, int, int, int, int, int, list[int], list[int], list[tuple[int, int]]] | AssetConfigArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "PerpetualBondComposer": - self._composer.add_app_call_method_call( - self.client.params.asset_config( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void", v - ) - ) - return self - - def update_interest_rate( - self, - args: tuple[int] | UpdateInterestRateArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "PerpetualBondComposer": - self._composer.add_app_call_method_call( - self.client.params.update_interest_rate( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "update_interest_rate(uint16)uint64", v - ) - ) - return self - - def get_account_units_current_value( - self, - args: tuple[str, int] | GetAccountUnitsCurrentValueArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "PerpetualBondComposer": - self._composer.add_app_call_method_call( - self.client.params.get_account_units_current_value( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64))", v - ) - ) - return self - - def get_payment_amount( - self, - args: tuple[str] | GetPaymentAmountArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "PerpetualBondComposer": - self._composer.add_app_call_method_call( - self.client.params.get_payment_amount( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "get_payment_amount(address)(uint64,uint64)", v - ) - ) - return self - - def get_coupons_status( - self, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "PerpetualBondComposer": - self._composer.add_app_call_method_call( - self.client.params.get_coupons_status( - - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "get_coupons_status()(uint64,uint64,uint64,(uint64,uint64),bool)", v - ) - ) - return self - - def get_time_periods( - self, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "PerpetualBondComposer": - self._composer.add_app_call_method_call( - self.client.params.get_time_periods( - - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "get_time_periods()(uint64,uint64)[]", v - ) - ) - return self - - def pay_coupon( - self, - args: tuple[str, bytes | str] | PayCouponArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "PerpetualBondComposer": - self._composer.add_app_call_method_call( - self.client.params.pay_coupon( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "pay_coupon(address,byte[])(uint64,uint64,byte[])", v - ) - ) - return self - - def asset_transfer( - self, - args: tuple[str, str, int] | AssetTransferArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "PerpetualBondComposer": - self._composer.add_app_call_method_call( - self.client.params.asset_transfer( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "asset_transfer(address,address,uint64)uint64", v - ) - ) - return self - - def set_secondary_time_events( - self, - args: tuple[list[int]] | SetSecondaryTimeEventsArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "PerpetualBondComposer": - self._composer.add_app_call_method_call( - self.client.params.set_secondary_time_events( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "set_secondary_time_events(uint64[])(uint64,uint64)", v - ) - ) - return self - - def set_default_status( - self, - args: tuple[bool] | SetDefaultStatusArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "PerpetualBondComposer": - self._composer.add_app_call_method_call( - self.client.params.set_default_status( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "set_default_status(bool)uint64", v - ) - ) - return self - - def primary_distribution( - self, - args: tuple[str, int] | PrimaryDistributionArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "PerpetualBondComposer": - self._composer.add_app_call_method_call( - self.client.params.primary_distribution( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "primary_distribution(address,uint64)uint64", v - ) - ) - return self - - def get_asset_info( - self, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "PerpetualBondComposer": - self._composer.add_app_call_method_call( - self.client.params.get_asset_info( - - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)", v - ) - ) - return self - - def get_time_events( - self, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "PerpetualBondComposer": - self._composer.add_app_call_method_call( - self.client.params.get_time_events( - - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "get_time_events()uint64[]", v - ) - ) - return self - - def get_secondary_market_schedule( - self, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "PerpetualBondComposer": - self._composer.add_app_call_method_call( - self.client.params.get_secondary_market_schedule( - - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "get_secondary_market_schedule()uint64[]", v - ) - ) - return self - - def get_asset_metadata( - self, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "PerpetualBondComposer": - self._composer.add_app_call_method_call( - self.client.params.get_asset_metadata( - - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", v - ) - ) - return self - - def account_gov_suspension( - self, - args: tuple[str, bool] | AccountGovSuspensionArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "PerpetualBondComposer": - self._composer.add_app_call_method_call( - self.client.params.account_gov_suspension( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "account_gov_suspension(address,bool)uint64", v - ) - ) - return self - - def account_open( - self, - args: tuple[str, str] | AccountOpenArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "PerpetualBondComposer": - self._composer.add_app_call_method_call( - self.client.params.account_open( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "account_open(address,address)uint64", v - ) - ) - return self - - def account_close( - self, - args: tuple[str] | AccountCloseArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "PerpetualBondComposer": - self._composer.add_app_call_method_call( - self.client.params.account_close( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "account_close(address)(uint64,uint64)", v - ) - ) - return self - - def account_update_payment_address( - self, - args: tuple[str, str] | AccountUpdatePaymentAddressArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "PerpetualBondComposer": - self._composer.add_app_call_method_call( - self.client.params.account_update_payment_address( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "account_update_payment_address(address,address)uint64", v - ) - ) - return self - - def account_get_info( - self, - args: tuple[str] | AccountGetInfoArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "PerpetualBondComposer": - self._composer.add_app_call_method_call( - self.client.params.account_get_info( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "account_get_info(address)(address,uint64,uint64,uint64,bool)", v - ) - ) - return self - - def rbac_rotate_arranger( - self, - args: tuple[str] | RbacRotateArrangerArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "PerpetualBondComposer": - self._composer.add_app_call_method_call( - self.client.params.rbac_rotate_arranger( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "rbac_rotate_arranger(address)uint64", v - ) - ) - return self - - def rbac_set_op_daemon( - self, - args: tuple[str] | RbacSetOpDaemonArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "PerpetualBondComposer": - self._composer.add_app_call_method_call( - self.client.params.rbac_set_op_daemon( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "rbac_set_op_daemon(address)uint64", v - ) - ) - return self - - def rbac_assign_role( - self, - args: tuple[int, str, bytes | str] | RbacAssignRoleArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "PerpetualBondComposer": - self._composer.add_app_call_method_call( - self.client.params.rbac_assign_role( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "rbac_assign_role(uint8,address,byte[])uint64", v - ) - ) - return self - - def rbac_revoke_role( - self, - args: tuple[int, str] | RbacRevokeRoleArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "PerpetualBondComposer": - self._composer.add_app_call_method_call( - self.client.params.rbac_revoke_role( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "rbac_revoke_role(uint8,address)uint64", v - ) - ) - return self - - def rbac_gov_asset_suspension( - self, - args: tuple[bool] | RbacGovAssetSuspensionArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "PerpetualBondComposer": - self._composer.add_app_call_method_call( - self.client.params.rbac_gov_asset_suspension( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "rbac_gov_asset_suspension(bool)uint64", v - ) - ) - return self - - def rbac_get_arranger( - self, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "PerpetualBondComposer": - self._composer.add_app_call_method_call( - self.client.params.rbac_get_arranger( - - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "rbac_get_arranger()address", v - ) - ) - return self - - def rbac_get_address_roles( - self, - args: tuple[str] | RbacGetAddressRolesArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "PerpetualBondComposer": - self._composer.add_app_call_method_call( - self.client.params.rbac_get_address_roles( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", v - ) - ) - return self - - def rbac_get_role_config( - self, - args: tuple[int, str] | RbacGetRoleConfigArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "PerpetualBondComposer": - self._composer.add_app_call_method_call( - self.client.params.rbac_get_role_config( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "rbac_get_role_config(uint8,address)(uint64,uint64)", v - ) - ) - return self - - def asset_create( - self, - args: tuple[str, AssetMetadata] | AssetCreateArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "PerpetualBondComposer": - self._composer.add_app_call_method_call( - self.client.params.asset_create( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void", v - ) - ) - return self - - def clear_state( - self, - *, - args: list[bytes] | None = None, - params: algokit_utils.CommonAppCallParams | None = None, - ) -> "PerpetualBondComposer": - params=params or algokit_utils.CommonAppCallParams() - self._composer.add_app_call( - self.client.params.clear_state( - algokit_utils.AppClientBareCallParams( - **{ - **dataclasses.asdict(params), - "args": args - } - ) - ) - ) - return self - - def add_transaction( - self, txn: Transaction, signer: TransactionSigner | None = None - ) -> "PerpetualBondComposer": - self._composer.add_transaction(txn, signer) - return self - - def composer(self) -> algokit_utils.TransactionComposer: - return self._composer - - def simulate( - self, - allow_more_logs: bool | None = None, - allow_empty_signatures: bool | None = None, - allow_unnamed_resources: bool | None = None, - extra_opcode_budget: int | None = None, - exec_trace_config: SimulateTraceConfig | None = None, - simulation_round: int | None = None, - skip_signatures: bool | None = None, - ) -> algokit_utils.SendAtomicTransactionComposerResults: - return self._composer.simulate( - allow_more_logs=allow_more_logs, - allow_empty_signatures=allow_empty_signatures, - allow_unnamed_resources=allow_unnamed_resources, - extra_opcode_budget=extra_opcode_budget, - exec_trace_config=exec_trace_config, - simulation_round=simulation_round, - skip_signatures=skip_signatures, - ) - - def send( - self, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAtomicTransactionComposerResults: - return self._composer.send(send_params) diff --git a/smart_contracts/artifacts/zero_coupon_bond/ZeroCouponBond.approval.puya.map b/smart_contracts/artifacts/zero_coupon_bond/ZeroCouponBond.approval.puya.map deleted file mode 100644 index 68771202..00000000 --- a/smart_contracts/artifacts/zero_coupon_bond/ZeroCouponBond.approval.puya.map +++ /dev/null @@ -1,31961 +0,0 @@ -{ - "version": 3, - "sources": [ - "../../../modules/accounting.py", - "../../../modules/actus/pam.py", - "../../../modules/core_financial/common.py", - "../../../modules/core_financial/no_coupon.py", - "../../../modules/payment_agent/common.py", - "../../../modules/payment_agent/principal.py", - "../../../modules/rbac.py", - "../../../modules/transfer_agent/no_coupon.py", - "../../zero_coupon_bond/contract.py" - ], - "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AM8BmD;;AAAf;;AAA5B;AAC4C;;AAAf;;AAA7B;AAgBA;;AAAuB;AAAvB;AACA;;AAAuB;AAAvB;AN9BA;;AAAmB;AAAnB;AACA;AAAyB;AAAzB;AACA;;AAAkB;AAAlB;AACA;AAAc;AAAd;AEUA;;AAA6B;AAA7B;AACA;;AAA2B;AAA3B;AACA;;AAAkB;AAAlB;AACA;;AAA4B;AAA5B;AAGA;;AAAgB;;AAAhB;AAGA;;AAA0B;AAA1B;AACA;;AAAqB;AAArB;AACA;;AAAqB;AAArB;AAIA;;AAAyC;AAAzC;AACA;;AAAyC;AAAzC;AACA;;AAAqB;AAArB;AACA;;AAAqC;AAArC;AACA;;AAAqC;AAArC;AACA;;AAAqB;AAArB;AMzBO;;AAA6B;;AAA7B;AAAP;AACO;;AAAuB;;AAAvB;AAAP;AACO;;AAAA;AAAP;AACO;;AAAA;AAAP;AAlBR;;;;;;AAAA;;;AAAA;;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;;;;;;AAAA;;;AAAA;;;;AAAA;AN2QK;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AD7PA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;ACyMG;;;AACO;AAAA;AAAA;AAAA;AAAA;AAAP;AA5KmB;;AAAA;;AAAA;;AACnB;AAGA;;AAAA;;AAAA;AAKI;;AAAA;;AAAA;AADJ;AAKA;;AAAA;;AAAA;AAEA;AAIQ;;AAFW;;AACF;;;;;;;;;AAHjB;;;;;;AAAA;AAwKO;;AAAA;;AAAA;AAAA;AAAP;AACA;;AAAA;;AAAA;AACmB;;AAAA;;AAAA;AAAnB;;AAAA;AAAA;AACA;;AAAA;;AAAA;AAGiC;AAAA;AArK1B;;;AAAA;AAEH;;;AAFG;AAAA;;;;AAAP;AAMA;;AAAA;;AAAA;AAmK0B;;AAAA;AC1OnB;AAAA;AAAP;AD+EA;;AAAA;AAAA;AAGO;;AAAA;AAAA;AAAP;AAGA;;AAAA;;AAAA;AAI+C;;AAArB;AAAtB;;AAAA;AADJ;AA2JA;;AAAA;;;AAnIA;;AAAA;;AAAA;;AAAA;;AAAA;AACyC;AAAA;;;AAAA;;;;AAAA;AAAzC;;AAAA;AAAA;AAGyC;;;;AAAA;AAAzC;;AAAA;AAAA;AAGqB;;;;AAAA;AAArB;;AAAA;AAAA;AACiC;AAAA;AAAA;AAAZ;AAAA;AAAA;AAAA;AAAA;AAArB;;AAAA;AAAA;AAGO;;AAAA;AAAP;AA+HA;AAAc;;AAAd;AD/OH;AAAA;;;;;;;;;;AEgCA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoBO;AAAA;;AAAA;AAAA;AAAA;;;AACI;;AAA2B;AAAA;;AAAA;AAAA;AAA3B;AADJ;;;;AADJ;AH9C0B;AAAnB;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAP;AGmDO;AAAA;;;AAAa;;AAAA;AAAA;AAAA;AAAA;AAAT;;AAAA;AAAJ;;;;AAAP;AAE8B;AAAA;;;AAAA;AAAA;;AAEI;AAAA;;AAAA;AAAA;AAA9B;;AAAA;AAAyD;;;AAAzD;AAIA;AAAA;;AAIe;AAAnB;;AACY;AAAZ;;AACc;AAAd;;AAjEO;AAAA;;AAAA;AAAA;AAAsB;;AAAA;AAAA;;AAAtB;AAAA;;;AAAgD;AAAA;;AAAA;AAAA;AAA1B;;AAAA;AAAtB;;;;AAoEf;;;AAC+B;;;AACA;;AAAA;;AAAA;;;AAAA;;AACP;AAAA;AAAA;AAAA;;AACE;AAAA;AAAA;;AAGf;;AAA2B;AAAA;;AAAA;AAAA;AAA3B;AAAX;;;;;;;AAM6B;;AAAA;AAAA;;AAAA;AAAA;AAHd;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAnDV;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;;;;;;;AA4DA;;;AAAA;;AAAA;AAAA;AAAA;AAAA;AHvF6B;AAAnB;AAAA;AAAA;AAAA;;AAAP;AGuGmB;AH7GZ;AAAA;AAAA;AAAA;AAAe;;AAAf;AG8Gf;;;AAC+B;;AAAA;;;AAAA;;AACY;AAA5B;AAAA;;AAAA;AAAA;AAnBV;AAAA;AAAA;AAAA;AAAA;AAAA;AExFA;;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;ALLU;AAAA;AAAA;AAAA;AAAe;;AAAf;ACRP;AACA;;;AACA;;;ADY0B;AAAnB;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAP;ACVQ;AAAA;AAAA;AAAA;AACR;AACO;;AAA2B;AAAA;;AAAA;AAAA;AAA3B;AAAP;AE8BO;;;ACxCJ;AAAA;;AAAA;AAAA;AAAwB;;AAAxB;AAAX;;;AAEgB;;AAAc;AAAA;;AAAA;AAAA;AAAd;AAAA;;;AACG;;AAAA;;AAAA;AADH;;;AAEG;;AAAc;;AAAA;AAAA;AAAA;;;AAAd;AAFH;;;;AADJ;AAQA;;AAAA;AAAA;AAAA;;;AACI;AAAA;;AAAA;AAAA;AADJ;;AAAA;;AAAA;;;AAGQ;;AAAA;AAAA;AAAA;;;AAAA;AAAJ;;;;AC+BhB;;;AD1B6C;;AAAjC;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AADJ;AC+Ba;;AAAA;AAAA;AAAA;;;ADzBb;AAIQ;;;;;;;;;;;;AAJR;;;;;;AAAA;AFoKA;AAAA;AAAA;AAAA;AAA0B;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAA1B;AAAA;AAAA;AAAA;AACsC;AAAtC;AAAA;AAAA;AAAA;;AAAA;AACA;;;AGxLoB;;AAGP;;AAEO;AAAA;;AAAA;AAAA;AACE;AAAA;;AAAA;AACA;AAAA;AAAA;AAAA;AAAyB;AAAA;;AAAA;AAAA;AAAzB;AARlB;;AAAA;AAAA;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAA;AAAA;;;;AAAA;AAAA;;AAAA;AAAA;AASqB;;AATrB;AAAA;;AAAA;AAAA;;;;;;AAAA;AAAA;AAAA;AADJ;;;;;;AAAA;AAAA;AAAA;AAsDc;;AAFP;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;;;;AAAA;AAAA;AAAA;AArCV;AAAA;AAAA;AAAA;AAAA;AAAA;AAiCwB;AAAjB;;;;;;;;;;;;;;;;;;;AEtDP;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;APgBU;AAAA;AAAA;AAAA;AAAe;;AAAf;AEgIH;;;AACI;AAAA;;AAAA;AAAA;AAAsC;;AAAtC;AADJ;;;AAGQ;AAAA;;AAAA;AAAA;AAAJ;;;AACG;;AAA0B;AAAA;;AAAA;AAAA;AAA1B;AADH;;;;AAJR;AAmBO;;AAAA;;AAAA;AAAA;;AAAA;AAAP;AACA;;;AACA;;;AF9I0B;AAAnB;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAP;AAA0B;AAAnB;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAP;AEiJA;;AAAA;;;AACA;;AAAA;;;AAaO;;AAAA;;AAAA;AAAP;AACA;;AAAA;AAAA;AACgB;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAT;;AAAA;AAAP;AFjIoB;;;AAAA;;AACjB;AAAA;AAAA;AAAA;AAAX;;;AANY;;AAAA;AAAA;AAAA;;AAAA;AAAmC;;AAAA;AAAA;AAAA;;AAAA;AAAnC;AAAA;;;AACI;;AAAA;AAAA;AAAA;;AAAA;AAAqC;;AAAA;AAAA;AAAA;;AAAA;AAArC;AADJ;;;;AADJ;AOXoB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AJGb;;AAAA;;AAAA;AAAA;;AAAA;;;AAAA;;AHsBS;;AAAA;AAAA;AAAA;AAAA;AAAT;AAAA;AAAP;AACA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AApBG;AAAA;AAAA;AAAA;AAAX;;;AACuD;AAA3C;AAAA;;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AACA;;AAAA;AAAA;AAsBJ;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AOxBO;;AAAA;AAAA;;AAAA;AA3CV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;AP0DO;;AAAA;AAAA;;AAAA;;AAAA;AACsC;;AAAA;AAAA;AAAA;;;AAAtC;;AAAA;AAAA;;;;;;;;AEuMP;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AASG;;AAAA;;AAAA;AACA;;AAAA;AAAA;AAVH;AAAA;AAYA;;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAQG;;;AACA;;AAAA;AAAA;AATH;AAAA;;AAWA;;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAqBG;;;AF3RO;AAAA;AAAA;AAAA;AAAe;;AAAf;AE4RA;AAAP;AACA;;;AAEA;AAAA;AACyC;AAAtC;AAAX;;;AACY;AAAA;;;AAAA;;AAGA;AAAA;;AAAA;AAAA;AACG;;AAAA;AAAA;;;AAAA;;;;AAAA;AADH;AAAA;;AAAA;AADJ;AAIA;;AAAA;AAAA;AAGG;AAAA;;AAAA;AAAA;AAAX;;;AAEgB;AAAA;;AAAA;AAAA;AACgC;;AAAA;AAAA;AAA7B;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AADH;AAAA;;AAAA;AADJ;AAIA;;AAAA;AAAA;AAI8B;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAF3B;AAAA;AAAA;AAAA;AAAA;AA5CV;AAAA;AAAA;AAAA;AAAA;AAAA;AAiDA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AIzQ+B;;AAAc;;AAAnC;;;AAAP;AJsRA;;AAAA;AAAA;AACO;;AAdV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAgBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AF1UU;AAAA;AAAA;AAAA;AAAe;;AAAf;AEwHH;;;AACI;AAAA;;AAAA;AAAA;AACD;;AAAA;AAAA;;AADC;AAAA;;;AAEF;AAAA;;AAAA;AAAA;AADC;;AAAA;AADC;;;;AAFR;AIzE4B;;AAAqB;;AAA1C;;;AAAP;ANxC0B;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AEgWA;;;AACA;;;AACA;;AAAA;AAAA;AACO;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAkC;AAAA;;AAAA;AAAA;AAAlC;;AAAA;AAAP;AAEA;AAAA;;AAAA;AACA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAC2C;AAAA;;AAAA;AAAA;AAA3C;AAAA;;AAAA;;AAAA;;AAAA;AACO;AAAA;;AAAA;AAAA;AAAA;AAAA;AApCV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;AAgDiB;AACX;;AAA0B;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAA1B;AAAA;;;AAAA;AAAA;;;AACe;;AAAd;;AAED;AAAA;;AAAA;AAAA;AAAX;;;AAC0B;;AAAd;;AAGsB;AAAA;;AAAA;AAAA;AACF;AAAA;;AAAA;AAAA;AF/WjB;AAAA;AAAA;AAAA;AAAyB;AAAA;;AAAA;AAAA;AAAzB;AAAA;AEkX6B;AAAA;;AAAA;AAAA;AAAX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AACU;AAAA;;AAAA;AAAA;AAAZ;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AACO;AAAA;;AAAA;AAAA;AAAZ;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AACD;AAAA;;AAAA;AAAA;AAEqB;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AACpB;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AACJ;AAAA;;AAAA;AAAA;AACE;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAfT;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAjBV;AAAA;AAAA;AAAA;AAAA;AAAA;AA2CiB;;AF3ZP;AAAA;AAAA;AAAA;AAAe;;AAAf;AE4Zf;;;AAC0B;;AAAA;AAAA;AAAA;;AAAA;AAVrB;AAAA;;AAAA;AAAA;AAAA;AAAA;AAsBQ;AAAA;;AAAA;AAAA;AAAoC;AAAA;;AAAA;AAAA;AADlC;AAAA;AAAA;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AARV;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBuC;AAAA;;AAAA;AAAA;AATvC;AAAA;AAAA;AAAA;AAAA;AAAA;AFvWA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AMjB+B;;AAAgB;;AAArC;;;AAAP;AN9C0B;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAmFA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AACO;;AArBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AMjD+B;;AAAsB;;AAA3C;;;AAAP;ANxCO;AAAA;AAAA;AAAA;AAAe;;AAAf;AA+GA;AAAP;AACA;;;AACA;;;AAC8B;AAAvB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AAIU;AAFsB;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAhC;AAOO;;AAlCV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoCA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AMrF+B;;AAAsB;;AAA3C;;;AAAP;ANuGA;;;AA5I0B;AAAnB;AAAA;AAAA;AAAA;AAAA;;AAAP;AA+Ie;AAAA;AAAA;AAAA;AAAA;AACf;AAAA;;AACA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AACA;;;AACqB;;AAzBxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAoBU;;AAAA;;AAAA;AAAP;AACA;;;AACA;;;AA3K0B;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AA6KA;AAAA;;AAAA;AACO;;AAzBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAhL6B;AAAnB;AAAA;AAAA;AAAA;AAAA;;AAAP;AA+LO;AAAA;AAfV;AAAA;AAAA;AAAA;AAAA;AAAA;AM5DA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAWG;;;AACA;;AAAA;AAAA;AACO;;AAbV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAeA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAWG;;;AACA;;AAAA;AAAA;AACO;;AAbV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAeA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAsBG;;;AACA;;;AACwB;AAAA;;AAAxB;;;AApGc;;AAAX;AAAX;;;AACY;;AAAA;;AAAA;AAqGG;;AA1BV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAxEM;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AA+FJ;;;AA7FG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AA2FJ;;;AAzFG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAuFJ;;;AArFG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAmFJ;;;AAjFG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;;;;AAkFP;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAmBG;;;AACA;;;AACwB;AAAA;;AAAxB;;;AApGO;AAAW;;AAAX;AAAP;AACc;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAmGG;;AAvBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA1EM;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AA8FJ;;;AA5FG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AA0FJ;;;AAxFG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAsFJ;;;AApFG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;;;;AAqFP;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAzJ+B;;AAAgB;;AAArC;;;AAAP;AAyKA;;AAAA;AAAA;AACO;;AAjBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BU;AAAA;;AAAA;AAAA;AARV;AAAA;AAAA;AAAA;AAAA;AAAA;AAUA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAc4B;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AAlBP;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAcU;AACP;AAAA;;;AAES;;;;;;;;AADT;;AAAA;;;;;;;;;;;;;;AA+BQ;AAJI;;AA5QL;;AAAA;AAAA;AAAA;AAAA;;AA2QC;AAGO;AAAA;AA7ClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAsCe;;AAvQL;;AAAA;AAAA;AAAA;AAAA;;AAsQC;AAGO;AAAA;AAxClB;;;AAiCe;;AAlQL;;AAAA;AAAA;AAAA;AAAA;;AAiQC;AAGO;AAAA;AAnClB;;;AA4Be;;AA7PL;;AAAA;AAAA;AAAA;AAAA;;AA4PC;AAGO;AAAA;AA9BlB;;;AAuBe;;AAxPL;;AAAA;AAAA;AAAA;AAAA;;AAuPC;AAGO;AAAA;AAzBlB;;;AAkBkB;;;;;;;;;;;;;;;;;;AAlBlB;;;AHvQD;;;AAEqB;;AAA0B;AAAA;;AAAA;AAAA;AAA1B;AAAA;;AAAA;AAAA;AACE;AAAA;;AAAA;AAAA;AAAA;AAAA;AAChB;AAAA;;AAAA;AAAA;AAAX;;;AD6Ie;;AAAe;;AAAf;AAAA;;AAAe;;AAAf;AC1IA;;AAAA;AAAA;AAAA;AAAA;AAAP;AAAA;AASJ;;;AAGuB;;;AACF;AAAA;AAAA;AACE;AAAA;AAAA;AAEf;;AAAA;;AAAA;;;AACE;AAAA;;AAAA;AAAA;AADF;AAAA;;AAAA;AAGI;;;AAAA;;AAAA;AAHJ;AADJ;ADoEJ;;;;;;;AAEQ;;AAAA;;;AAAA;;;;AAAA;AACE;;AADF;AADJ;AAIkB;;AAAA;AAAA;AAAqB;AAArB;AAAP;AAAnB;;AAAA;;AAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKqB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AACkB;AAAN;AAAA;AAAA;;AAAZ;AAAA;AAAA;AAAA;AAAA;;AACF;AAAP;AACG;AAAA;;AAAA;AAAA;AAA6B;;;AAA7B;AAAf;;;AAEwB;;AAAA;;AAAA;AAAmB;;AAApB;AAAA;AAAP;;;;;;;;;;;;;AFzFZ;;;AACe;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAJ;AAAP;;AAEJ;;;AACmB;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAR;;AAAA;AAAP;AAEJ;;;AAEyB;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AADd;;AAAA;AAAA;;;AAAP;AAQG;AAAA;AAAA;AAAA;AAAX;;;AACY;AAAc;;AAAd;;AMQR;;;;;AAFW;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAGA;;;AACH;;AAAA;AAAA;AAAA;AAAA;AACG;;AAAA;AAAA;;AADH;AAAA;;;AAEG;;AAAA;AAAA;AAAA;AAAA;AADA;;AAAA;AADH;;;;AADJ;;AAAA;;;;;AAOyB;;AAbF;AAAA;;AAAA;AAAA;AAAhB;AAaP;;AAkBW;AAAA;;AAAA;AAAA;AAAJ;AAAP;;AAGW;AAAA;;AAAA;AAAA;AAAJ;AAAP;;AAEJ;;;AACW;;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;AAAA;;AAMH;;AANG;AAAA;;;;AAAP;;;", - "op_pc_offset": 0, - "pc_events": { - "1": { - "subroutine": "algopy.arc4.ARC4Contract.approval_program", - "params": {}, - "block": "main", - "stack_in": [], - "op": "intcblock 0 1 32 8 200 86400" - }, - "12": { - "op": "bytecblock 0x151f7c75 0x52333023 \"status\" \"circulating_units\" \"maturity_date\" 0x52323023 \"unit_value\" \"primary_distribution_opening_date\" \"issuance_date\" \"secondary_market_closure_date\" 0x52373023 0x52343023 \"total_units\" \"settlement_asset_id\" \"day_count_convention\" \"principal_discount\" \"secondary_market_opening_date\" 0x52363023 0x52353023 0x52323523 \"asset_suspended\" \"asset_defaulted\" \"denomination_asset_id\" \"metadata\" \"primary_distribution_closure_date\" 0x52383023 \"interest_rate\" 0x74696d654576656e7473 0x00 \"total_coupons\" 0x0000 0x068101" - }, - "434": { - "op": "txn ApplicationID", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "436": { - "op": "bnz main_after_if_else@2", - "stack_out": [] - }, - "439": { - "op": "bytec 5 // 0x52323023", - "defined_out": [ - "0x52323023" - ], - "stack_out": [ - "0x52323023" - ] - }, - "441": { - "op": "global ZeroAddress", - "defined_out": [ - "0x52323023", - "tmp%0#3" - ], - "stack_out": [ - "0x52323023", - "tmp%0#3" - ] - }, - "443": { - "op": "app_global_put", - "stack_out": [] - }, - "444": { - "op": "bytec 19 // 0x52323523", - "defined_out": [ - "0x52323523" - ], - "stack_out": [ - "0x52323523" - ] - }, - "446": { - "op": "global ZeroAddress", - "defined_out": [ - "0x52323523", - "tmp%1#3" - ], - "stack_out": [ - "0x52323523", - "tmp%1#3" - ] - }, - "448": { - "op": "app_global_put", - "stack_out": [] - }, - "449": { - "op": "bytec 20 // \"asset_suspended\"", - "defined_out": [ - "\"asset_suspended\"" - ], - "stack_out": [ - "\"asset_suspended\"" - ] - }, - "451": { - "op": "intc_0 // 0", - "defined_out": [ - "\"asset_suspended\"", - "0" - ], - "stack_out": [ - "\"asset_suspended\"", - "0" - ] - }, - "452": { - "op": "app_global_put", - "stack_out": [] - }, - "453": { - "op": "bytec 21 // \"asset_defaulted\"", - "defined_out": [ - "\"asset_defaulted\"" - ], - "stack_out": [ - "\"asset_defaulted\"" - ] - }, - "455": { - "op": "intc_0 // 0", - "stack_out": [ - "\"asset_defaulted\"", - "0" - ] - }, - "456": { - "op": "app_global_put", - "stack_out": [] - }, - "457": { - "op": "bytec 12 // \"total_units\"", - "defined_out": [ - "\"total_units\"" - ], - "stack_out": [ - "\"total_units\"" - ] - }, - "459": { - "op": "intc_0 // 0", - "stack_out": [ - "\"total_units\"", - "0" - ] - }, - "460": { - "op": "app_global_put", - "stack_out": [] - }, - "461": { - "op": "bytec_3 // \"circulating_units\"", - "defined_out": [ - "\"circulating_units\"" - ], - "stack_out": [ - "\"circulating_units\"" - ] - }, - "462": { - "op": "intc_0 // 0", - "stack_out": [ - "\"circulating_units\"", - "0" - ] - }, - "463": { - "op": "app_global_put", - "stack_out": [] - }, - "464": { - "op": "bytec 6 // \"unit_value\"", - "defined_out": [ - "\"unit_value\"" - ], - "stack_out": [ - "\"unit_value\"" - ] - }, - "466": { - "op": "intc_0 // 0", - "stack_out": [ - "\"unit_value\"", - "0" - ] - }, - "467": { - "op": "app_global_put", - "stack_out": [] - }, - "468": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"" - ], - "stack_out": [ - "\"status\"" - ] - }, - "469": { - "op": "intc_0 // 0", - "stack_out": [ - "\"status\"", - "0" - ] - }, - "470": { - "op": "app_global_put", - "stack_out": [] - }, - "471": { - "op": "bytec 22 // \"denomination_asset_id\"", - "defined_out": [ - "\"denomination_asset_id\"" - ], - "stack_out": [ - "\"denomination_asset_id\"" - ] - }, - "473": { - "op": "intc_0 // 0", - "stack_out": [ - "\"denomination_asset_id\"", - "0" - ] - }, - "474": { - "op": "app_global_put", - "stack_out": [] - }, - "475": { - "op": "bytec 13 // \"settlement_asset_id\"", - "defined_out": [ - "\"settlement_asset_id\"" - ], - "stack_out": [ - "\"settlement_asset_id\"" - ] - }, - "477": { - "op": "intc_0 // 0", - "stack_out": [ - "\"settlement_asset_id\"", - "0" - ] - }, - "478": { - "op": "app_global_put", - "stack_out": [] - }, - "479": { - "op": "bytec 6 // \"unit_value\"", - "stack_out": [ - "\"unit_value\"" - ] - }, - "481": { - "op": "intc_0 // 0", - "stack_out": [ - "\"unit_value\"", - "0" - ] - }, - "482": { - "op": "app_global_put", - "stack_out": [] - }, - "483": { - "op": "bytec 14 // \"day_count_convention\"", - "defined_out": [ - "\"day_count_convention\"" - ], - "stack_out": [ - "\"day_count_convention\"" - ] - }, - "485": { - "op": "intc_0 // 0", - "stack_out": [ - "\"day_count_convention\"", - "0" - ] - }, - "486": { - "op": "app_global_put", - "stack_out": [] - }, - "487": { - "op": "bytec 23 // \"metadata\"", - "defined_out": [ - "\"metadata\"" - ], - "stack_out": [ - "\"metadata\"" - ] - }, - "489": { - "op": "pushbytes 0x", - "defined_out": [ - "\"metadata\"", - "0x" - ], - "stack_out": [ - "\"metadata\"", - "0x" - ] - }, - "491": { - "op": "app_global_put", - "stack_out": [] - }, - "492": { - "op": "bytec 15 // \"principal_discount\"", - "defined_out": [ - "\"principal_discount\"" - ], - "stack_out": [ - "\"principal_discount\"" - ] - }, - "494": { - "op": "intc_0 // 0", - "stack_out": [ - "\"principal_discount\"", - "0" - ] - }, - "495": { - "op": "app_global_put", - "stack_out": [] - }, - "496": { - "op": "bytec 26 // \"interest_rate\"", - "defined_out": [ - "\"interest_rate\"" - ], - "stack_out": [ - "\"interest_rate\"" - ] - }, - "498": { - "op": "intc_0 // 0", - "stack_out": [ - "\"interest_rate\"", - "0" - ] - }, - "499": { - "op": "app_global_put", - "stack_out": [] - }, - "500": { - "op": "bytec 29 // \"total_coupons\"", - "defined_out": [ - "\"total_coupons\"" - ], - "stack_out": [ - "\"total_coupons\"" - ] - }, - "502": { - "op": "intc_0 // 0", - "stack_out": [ - "\"total_coupons\"", - "0" - ] - }, - "503": { - "op": "app_global_put", - "stack_out": [] - }, - "504": { - "op": "bytec 7 // \"primary_distribution_opening_date\"", - "defined_out": [ - "\"primary_distribution_opening_date\"" - ], - "stack_out": [ - "\"primary_distribution_opening_date\"" - ] - }, - "506": { - "op": "intc_0 // 0", - "stack_out": [ - "\"primary_distribution_opening_date\"", - "0" - ] - }, - "507": { - "op": "app_global_put", - "stack_out": [] - }, - "508": { - "op": "bytec 24 // \"primary_distribution_closure_date\"", - "defined_out": [ - "\"primary_distribution_closure_date\"" - ], - "stack_out": [ - "\"primary_distribution_closure_date\"" - ] - }, - "510": { - "op": "intc_0 // 0", - "stack_out": [ - "\"primary_distribution_closure_date\"", - "0" - ] - }, - "511": { - "op": "app_global_put", - "stack_out": [] - }, - "512": { - "op": "bytec 8 // \"issuance_date\"", - "defined_out": [ - "\"issuance_date\"" - ], - "stack_out": [ - "\"issuance_date\"" - ] - }, - "514": { - "op": "intc_0 // 0", - "stack_out": [ - "\"issuance_date\"", - "0" - ] - }, - "515": { - "op": "app_global_put", - "stack_out": [] - }, - "516": { - "op": "bytec 16 // \"secondary_market_opening_date\"", - "defined_out": [ - "\"secondary_market_opening_date\"" - ], - "stack_out": [ - "\"secondary_market_opening_date\"" - ] - }, - "518": { - "op": "intc_0 // 0", - "stack_out": [ - "\"secondary_market_opening_date\"", - "0" - ] - }, - "519": { - "op": "app_global_put", - "stack_out": [] - }, - "520": { - "op": "bytec 9 // \"secondary_market_closure_date\"", - "defined_out": [ - "\"secondary_market_closure_date\"" - ], - "stack_out": [ - "\"secondary_market_closure_date\"" - ] - }, - "522": { - "op": "intc_0 // 0", - "stack_out": [ - "\"secondary_market_closure_date\"", - "0" - ] - }, - "523": { - "op": "app_global_put", - "stack_out": [] - }, - "524": { - "op": "bytec 4 // \"maturity_date\"", - "defined_out": [ - "\"maturity_date\"" - ], - "stack_out": [ - "\"maturity_date\"" - ] - }, - "526": { - "op": "intc_0 // 0", - "stack_out": [ - "\"maturity_date\"", - "0" - ] - }, - "527": { - "op": "app_global_put", - "stack_out": [] - }, - "528": { - "op": "txn GlobalNumByteSlice", - "defined_out": [ - "tmp%0#2" - ], - "stack_out": [ - "tmp%0#2" - ] - }, - "530": { - "op": "pushint 3", - "defined_out": [ - "3", - "tmp%0#2" - ], - "stack_out": [ - "tmp%0#2", - "3" - ] - }, - "532": { - "op": "==", - "defined_out": [ - "tmp%1#2" - ], - "stack_out": [ - "tmp%1#2" - ] - }, - "533": { - "error": "Wrong Global Bytes allocation", - "op": "assert // Wrong Global Bytes allocation", - "stack_out": [] - }, - "534": { - "op": "txn GlobalNumUint", - "defined_out": [ - "tmp%2#1" - ], - "stack_out": [ - "tmp%2#1" - ] - }, - "536": { - "op": "pushint 18", - "defined_out": [ - "18", - "tmp%2#1" - ], - "stack_out": [ - "tmp%2#1", - "18" - ] - }, - "538": { - "op": "==", - "defined_out": [ - "tmp%3#1" - ], - "stack_out": [ - "tmp%3#1" - ] - }, - "539": { - "error": "Wrong Global UInts allocation", - "op": "assert // Wrong Global UInts allocation", - "stack_out": [] - }, - "540": { - "op": "txn LocalNumByteSlice", - "defined_out": [ - "tmp%4#1" - ], - "stack_out": [ - "tmp%4#1" - ] - }, - "542": { - "op": "!", - "defined_out": [ - "tmp%5#0" - ], - "stack_out": [ - "tmp%5#0" - ] - }, - "543": { - "error": "Wrong Local Bytes allocation", - "op": "assert // Wrong Local Bytes allocation", - "stack_out": [] - }, - "544": { - "op": "txn LocalNumUint", - "defined_out": [ - "tmp%6#0" - ], - "stack_out": [ - "tmp%6#0" - ] - }, - "546": { - "op": "!", - "defined_out": [ - "tmp%7#0" - ], - "stack_out": [ - "tmp%7#0" - ] - }, - "547": { - "error": "Wrong Local UInts allocation", - "op": "assert // Wrong Local UInts allocation", - "stack_out": [] - }, - "548": { - "block": "main_after_if_else@2", - "stack_in": [], - "op": "pushbytes 0x25dba95b // method \"asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void\"", - "defined_out": [ - "Method(asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void)" - ], - "stack_out": [ - "Method(asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void)" - ] - }, - "554": { - "op": "txna ApplicationArgs 0", - "defined_out": [ - "Method(asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void)", - "tmp%0#1" - ], - "stack_out": [ - "Method(asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void)", - "tmp%0#1" - ] - }, - "557": { - "op": "match main_asset_update_route@4", - "stack_out": [] - }, - "561": { - "block": "main_switch_case_next@5", - "stack_in": [], - "op": "txn OnCompletion", - "defined_out": [ - "tmp%6#0" - ], - "stack_out": [ - "tmp%6#0" - ] - }, - "563": { - "op": "!", - "defined_out": [ - "tmp%7#0" - ], - "stack_out": [ - "tmp%7#0" - ] - }, - "564": { - "op": "assert", - "stack_out": [] - }, - "565": { - "op": "txn ApplicationID", - "defined_out": [ - "tmp%8#0" - ], - "stack_out": [ - "tmp%8#0" - ] - }, - "567": { - "op": "bz main_create_NoOp@33", - "stack_out": [] - }, - "570": { - "op": "pushbytess 0x89474134 0x44363d49 0x67db4f20 0x9c76b6a3 0x4fd6a3cc 0x1d6fc255 0x25e9997f 0x6c85e3ee 0x402dba47 0xfad2173e 0x08efea35 0xe4a5ab54 0xdc063b35 0x14fc10ef 0x4c113ed5 0x74a7297f 0x105c184e 0x82f71b2d 0xef04f5d3 0x03b83329 0x3dbe80bd 0xdf54e82c 0x010c8299 0x7406acd2 0xc3e4b297 // method \"asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void\", method \"get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64))\", method \"get_payment_amount(address)(uint64,uint64)\", method \"pay_principal(address,byte[])(uint64,uint64,byte[])\", method \"asset_transfer(address,address,uint64)uint64\", method \"set_secondary_time_events(uint64[])(uint64,uint64)\", method \"set_default_status(bool)uint64\", method \"primary_distribution(address,uint64)uint64\", method \"get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)\", method \"get_time_events()uint64[]\", method \"get_secondary_market_schedule()uint64[]\", method \"get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)\", method \"account_gov_suspension(address,bool)uint64\", method \"account_open(address,address)uint64\", method \"account_close(address)(uint64,uint64)\", method \"account_update_payment_address(address,address)uint64\", method \"account_get_info(address)(address,uint64,uint64,uint64,bool)\", method \"rbac_rotate_arranger(address)uint64\", method \"rbac_set_op_daemon(address)uint64\", method \"rbac_assign_role(uint8,address,byte[])uint64\", method \"rbac_revoke_role(uint8,address)uint64\", method \"rbac_gov_asset_suspension(bool)uint64\", method \"rbac_get_arranger()address\", method \"rbac_get_address_roles(address)(bool,bool,bool,bool,bool)\", method \"rbac_get_role_config(uint8,address)(uint64,uint64)\"", - "defined_out": [ - "Method(account_close(address)(uint64,uint64))", - "Method(account_get_info(address)(address,uint64,uint64,uint64,bool))", - "Method(account_gov_suspension(address,bool)uint64)", - "Method(account_open(address,address)uint64)", - "Method(account_update_payment_address(address,address)uint64)", - "Method(asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void)", - "Method(asset_transfer(address,address,uint64)uint64)", - "Method(get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64)))", - "Method(get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8))", - "Method(get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))", - "Method(get_payment_amount(address)(uint64,uint64))", - "Method(get_secondary_market_schedule()uint64[])", - "Method(get_time_events()uint64[])", - "Method(pay_principal(address,byte[])(uint64,uint64,byte[]))", - "Method(primary_distribution(address,uint64)uint64)", - "Method(rbac_assign_role(uint8,address,byte[])uint64)", - "Method(rbac_get_address_roles(address)(bool,bool,bool,bool,bool))", - "Method(rbac_get_arranger()address)", - "Method(rbac_get_role_config(uint8,address)(uint64,uint64))", - "Method(rbac_gov_asset_suspension(bool)uint64)", - "Method(rbac_revoke_role(uint8,address)uint64)", - "Method(rbac_rotate_arranger(address)uint64)", - "Method(rbac_set_op_daemon(address)uint64)", - "Method(set_default_status(bool)uint64)", - "Method(set_secondary_time_events(uint64[])(uint64,uint64))" - ], - "stack_out": [ - "Method(asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void)", - "Method(get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64)))", - "Method(get_payment_amount(address)(uint64,uint64))", - "Method(pay_principal(address,byte[])(uint64,uint64,byte[]))", - "Method(asset_transfer(address,address,uint64)uint64)", - "Method(set_secondary_time_events(uint64[])(uint64,uint64))", - "Method(set_default_status(bool)uint64)", - "Method(primary_distribution(address,uint64)uint64)", - "Method(get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8))", - "Method(get_time_events()uint64[])", - "Method(get_secondary_market_schedule()uint64[])", - "Method(get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))", - "Method(account_gov_suspension(address,bool)uint64)", - "Method(account_open(address,address)uint64)", - "Method(account_close(address)(uint64,uint64))", - "Method(account_update_payment_address(address,address)uint64)", - "Method(account_get_info(address)(address,uint64,uint64,uint64,bool))", - "Method(rbac_rotate_arranger(address)uint64)", - "Method(rbac_set_op_daemon(address)uint64)", - "Method(rbac_assign_role(uint8,address,byte[])uint64)", - "Method(rbac_revoke_role(uint8,address)uint64)", - "Method(rbac_gov_asset_suspension(bool)uint64)", - "Method(rbac_get_arranger()address)", - "Method(rbac_get_address_roles(address)(bool,bool,bool,bool,bool))", - "Method(rbac_get_role_config(uint8,address)(uint64,uint64))" - ] - }, - "697": { - "op": "txna ApplicationArgs 0", - "defined_out": [ - "Method(account_close(address)(uint64,uint64))", - "Method(account_get_info(address)(address,uint64,uint64,uint64,bool))", - "Method(account_gov_suspension(address,bool)uint64)", - "Method(account_open(address,address)uint64)", - "Method(account_update_payment_address(address,address)uint64)", - "Method(asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void)", - "Method(asset_transfer(address,address,uint64)uint64)", - "Method(get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64)))", - "Method(get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8))", - "Method(get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))", - "Method(get_payment_amount(address)(uint64,uint64))", - "Method(get_secondary_market_schedule()uint64[])", - "Method(get_time_events()uint64[])", - "Method(pay_principal(address,byte[])(uint64,uint64,byte[]))", - "Method(primary_distribution(address,uint64)uint64)", - "Method(rbac_assign_role(uint8,address,byte[])uint64)", - "Method(rbac_get_address_roles(address)(bool,bool,bool,bool,bool))", - "Method(rbac_get_arranger()address)", - "Method(rbac_get_role_config(uint8,address)(uint64,uint64))", - "Method(rbac_gov_asset_suspension(bool)uint64)", - "Method(rbac_revoke_role(uint8,address)uint64)", - "Method(rbac_rotate_arranger(address)uint64)", - "Method(rbac_set_op_daemon(address)uint64)", - "Method(set_default_status(bool)uint64)", - "Method(set_secondary_time_events(uint64[])(uint64,uint64))", - "tmp%10#0" - ], - "stack_out": [ - "Method(asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void)", - "Method(get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64)))", - "Method(get_payment_amount(address)(uint64,uint64))", - "Method(pay_principal(address,byte[])(uint64,uint64,byte[]))", - "Method(asset_transfer(address,address,uint64)uint64)", - "Method(set_secondary_time_events(uint64[])(uint64,uint64))", - "Method(set_default_status(bool)uint64)", - "Method(primary_distribution(address,uint64)uint64)", - "Method(get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8))", - "Method(get_time_events()uint64[])", - "Method(get_secondary_market_schedule()uint64[])", - "Method(get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))", - "Method(account_gov_suspension(address,bool)uint64)", - "Method(account_open(address,address)uint64)", - "Method(account_close(address)(uint64,uint64))", - "Method(account_update_payment_address(address,address)uint64)", - "Method(account_get_info(address)(address,uint64,uint64,uint64,bool))", - "Method(rbac_rotate_arranger(address)uint64)", - "Method(rbac_set_op_daemon(address)uint64)", - "Method(rbac_assign_role(uint8,address,byte[])uint64)", - "Method(rbac_revoke_role(uint8,address)uint64)", - "Method(rbac_gov_asset_suspension(bool)uint64)", - "Method(rbac_get_arranger()address)", - "Method(rbac_get_address_roles(address)(bool,bool,bool,bool,bool))", - "Method(rbac_get_role_config(uint8,address)(uint64,uint64))", - "tmp%10#0" - ] - }, - "700": { - "op": "match asset_config get_account_units_current_value get_payment_amount pay_principal asset_transfer set_secondary_time_events set_default_status primary_distribution get_asset_info get_time_events get_secondary_market_schedule get_asset_metadata account_gov_suspension account_open account_close account_update_payment_address account_get_info rbac_rotate_arranger rbac_set_op_daemon rbac_assign_role rbac_revoke_role rbac_gov_asset_suspension rbac_get_arranger rbac_get_address_roles rbac_get_role_config", - "stack_out": [] - }, - "752": { - "op": "err" - }, - "753": { - "block": "main_create_NoOp@33", - "stack_in": [], - "op": "pushbytes 0x3f0efc6c // method \"asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void\"", - "defined_out": [ - "Method(asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void)" - ], - "stack_out": [ - "Method(asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void)" - ] - }, - "759": { - "op": "txna ApplicationArgs 0", - "defined_out": [ - "Method(asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void)", - "tmp%11#0" - ], - "stack_out": [ - "Method(asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void)", - "tmp%11#0" - ] - }, - "762": { - "op": "match asset_create", - "stack_out": [] - }, - "766": { - "op": "err" - }, - "767": { - "block": "main_asset_update_route@4", - "stack_in": [], - "op": "txn OnCompletion", - "defined_out": [ - "tmp%1#1" - ], - "stack_out": [ - "tmp%1#1" - ] - }, - "769": { - "op": "pushint 4 // UpdateApplication", - "defined_out": [ - "UpdateApplication", - "tmp%1#1" - ], - "stack_out": [ - "tmp%1#1", - "UpdateApplication" - ] - }, - "771": { - "op": "==", - "defined_out": [ - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0" - ] - }, - "772": { - "op": "txn ApplicationID", - "defined_out": [ - "tmp%2#0", - "tmp%3#0" - ], - "stack_out": [ - "tmp%2#0", - "tmp%3#0" - ] - }, - "774": { - "op": "&&", - "defined_out": [ - "tmp%5#0" - ], - "stack_out": [ - "tmp%5#0" - ] - }, - "775": { - "op": "assert", - "stack_out": [] - }, - "776": { - "op": "b asset_update" - }, - "779": { - "subroutine": "modules.actus.pam.PAMCoreMixin.asset_config[routing]", - "params": {}, - "block": "asset_config", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "782": { - "op": "dup", - "defined_out": [ - "tmp%0#0", - "tmp%0#0 (copy)" - ], - "stack_out": [ - "tmp%0#0", - "tmp%0#0 (copy)" - ] - }, - "783": { - "op": "len", - "defined_out": [ - "len%0#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "len%0#0" - ] - }, - "784": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "len%0#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "len%0#0", - "8" - ] - }, - "785": { - "op": "==", - "defined_out": [ - "eq%0#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "eq%0#0" - ] - }, - "786": { - "error": "invalid number of bytes for arc4.uint64", - "op": "assert // invalid number of bytes for arc4.uint64", - "stack_out": [ - "tmp%0#0" - ] - }, - "787": { - "op": "btoi", - "defined_out": [ - "denomination_asset_id#0" - ], - "stack_out": [ - "denomination_asset_id#0" - ] - }, - "788": { - "op": "txna ApplicationArgs 2", - "defined_out": [ - "denomination_asset_id#0", - "tmp%2#0" - ], - "stack_out": [ - "denomination_asset_id#0", - "tmp%2#0" - ] - }, - "791": { - "op": "dup", - "defined_out": [ - "denomination_asset_id#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ], - "stack_out": [ - "denomination_asset_id#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ] - }, - "792": { - "op": "len", - "defined_out": [ - "denomination_asset_id#0", - "len%1#0", - "tmp%2#0" - ], - "stack_out": [ - "denomination_asset_id#0", - "tmp%2#0", - "len%1#0" - ] - }, - "793": { - "op": "intc_3 // 8", - "stack_out": [ - "denomination_asset_id#0", - "tmp%2#0", - "len%1#0", - "8" - ] - }, - "794": { - "op": "==", - "defined_out": [ - "denomination_asset_id#0", - "eq%1#0", - "tmp%2#0" - ], - "stack_out": [ - "denomination_asset_id#0", - "tmp%2#0", - "eq%1#0" - ] - }, - "795": { - "error": "invalid number of bytes for arc4.uint64", - "op": "assert // invalid number of bytes for arc4.uint64", - "stack_out": [ - "denomination_asset_id#0", - "tmp%2#0" - ] - }, - "796": { - "op": "btoi", - "defined_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0" - ] - }, - "797": { - "op": "txna ApplicationArgs 3", - "defined_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0", - "tmp%4#0" - ], - "stack_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0", - "tmp%4#0" - ] - }, - "800": { - "op": "dup", - "defined_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0", - "tmp%4#0", - "tmp%4#0 (copy)" - ], - "stack_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0", - "tmp%4#0", - "tmp%4#0 (copy)" - ] - }, - "801": { - "op": "len", - "defined_out": [ - "denomination_asset_id#0", - "len%2#0", - "settlement_asset_id#0", - "tmp%4#0" - ], - "stack_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0", - "tmp%4#0", - "len%2#0" - ] - }, - "802": { - "op": "intc_3 // 8", - "stack_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0", - "tmp%4#0", - "len%2#0", - "8" - ] - }, - "803": { - "op": "==", - "defined_out": [ - "denomination_asset_id#0", - "eq%2#0", - "settlement_asset_id#0", - "tmp%4#0" - ], - "stack_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0", - "tmp%4#0", - "eq%2#0" - ] - }, - "804": { - "error": "invalid number of bytes for arc4.uint64", - "op": "assert // invalid number of bytes for arc4.uint64", - "stack_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0", - "tmp%4#0" - ] - }, - "805": { - "op": "btoi", - "defined_out": [ - "denomination_asset_id#0", - "principal#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0" - ] - }, - "806": { - "op": "txna ApplicationArgs 4", - "defined_out": [ - "denomination_asset_id#0", - "principal#0", - "settlement_asset_id#0", - "tmp%6#0" - ], - "stack_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "tmp%6#0" - ] - }, - "809": { - "op": "dup", - "defined_out": [ - "denomination_asset_id#0", - "principal#0", - "settlement_asset_id#0", - "tmp%6#0", - "tmp%6#0 (copy)" - ], - "stack_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "tmp%6#0", - "tmp%6#0 (copy)" - ] - }, - "810": { - "op": "len", - "defined_out": [ - "denomination_asset_id#0", - "len%3#0", - "principal#0", - "settlement_asset_id#0", - "tmp%6#0" - ], - "stack_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "tmp%6#0", - "len%3#0" - ] - }, - "811": { - "op": "intc_3 // 8", - "stack_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "tmp%6#0", - "len%3#0", - "8" - ] - }, - "812": { - "op": "==", - "defined_out": [ - "denomination_asset_id#0", - "eq%3#0", - "principal#0", - "settlement_asset_id#0", - "tmp%6#0" - ], - "stack_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "tmp%6#0", - "eq%3#0" - ] - }, - "813": { - "error": "invalid number of bytes for arc4.uint64", - "op": "assert // invalid number of bytes for arc4.uint64", - "stack_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "tmp%6#0" - ] - }, - "814": { - "op": "btoi", - "defined_out": [ - "denomination_asset_id#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0" - ] - }, - "815": { - "op": "txna ApplicationArgs 5", - "defined_out": [ - "denomination_asset_id#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "tmp%8#0" - ], - "stack_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "tmp%8#0" - ] - }, - "818": { - "op": "dup", - "defined_out": [ - "denomination_asset_id#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "tmp%8#0", - "tmp%8#0 (copy)" - ], - "stack_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "tmp%8#0", - "tmp%8#0 (copy)" - ] - }, - "819": { - "op": "len", - "defined_out": [ - "denomination_asset_id#0", - "len%4#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "tmp%8#0" - ], - "stack_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "tmp%8#0", - "len%4#0" - ] - }, - "820": { - "op": "intc_3 // 8", - "stack_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "tmp%8#0", - "len%4#0", - "8" - ] - }, - "821": { - "op": "==", - "defined_out": [ - "denomination_asset_id#0", - "eq%4#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "tmp%8#0" - ], - "stack_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "tmp%8#0", - "eq%4#0" - ] - }, - "822": { - "error": "invalid number of bytes for arc4.uint64", - "op": "assert // invalid number of bytes for arc4.uint64", - "stack_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "tmp%8#0" - ] - }, - "823": { - "op": "btoi", - "defined_out": [ - "denomination_asset_id#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0" - ] - }, - "824": { - "op": "txna ApplicationArgs 6", - "defined_out": [ - "day_count_convention#0", - "denomination_asset_id#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "827": { - "op": "dup", - "defined_out": [ - "day_count_convention#0", - "day_count_convention#0 (copy)", - "denomination_asset_id#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "day_count_convention#0 (copy)" - ] - }, - "828": { - "op": "len", - "defined_out": [ - "day_count_convention#0", - "denomination_asset_id#0", - "len%5#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "len%5#0" - ] - }, - "829": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "day_count_convention#0", - "denomination_asset_id#0", - "len%5#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "len%5#0", - "1" - ] - }, - "830": { - "op": "==", - "defined_out": [ - "day_count_convention#0", - "denomination_asset_id#0", - "eq%5#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "eq%5#0" - ] - }, - "831": { - "error": "invalid number of bytes for arc4.uint8", - "op": "assert // invalid number of bytes for arc4.uint8", - "stack_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "832": { - "op": "txna ApplicationArgs 7" - }, - "835": { - "op": "dup", - "defined_out": [ - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "interest_rate#0", - "interest_rate#0" - ] - }, - "836": { - "op": "cover 7", - "defined_out": [ - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "interest_rate#0" - ] - }, - "838": { - "op": "len", - "defined_out": [ - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "len%6#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "len%6#0" - ] - }, - "839": { - "op": "pushint 2", - "defined_out": [ - "2", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "len%6#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "len%6#0", - "2" - ] - }, - "841": { - "op": "==", - "defined_out": [ - "day_count_convention#0", - "denomination_asset_id#0", - "eq%6#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "eq%6#0" - ] - }, - "842": { - "error": "invalid number of bytes for arc4.uint16", - "op": "assert // invalid number of bytes for arc4.uint16", - "stack_out": [ - "interest_rate#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "843": { - "op": "txna ApplicationArgs 8", - "defined_out": [ - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "coupon_rates#0" - ] - }, - "846": { - "op": "dup", - "defined_out": [ - "coupon_rates#0", - "coupon_rates#0 (copy)", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "coupon_rates#0", - "coupon_rates#0 (copy)" - ] - }, - "847": { - "op": "intc_0 // 0", - "stack_out": [ - "interest_rate#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "coupon_rates#0", - "coupon_rates#0 (copy)", - "0" - ] - }, - "848": { - "error": "invalid array length header", - "op": "extract_uint16 // on error: invalid array length header", - "defined_out": [ - "aggregate%array_length%0#0", - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "coupon_rates#0", - "aggregate%array_length%0#0" - ] - }, - "849": { - "op": "dup", - "stack_out": [ - "interest_rate#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "aggregate%array_length%0#0" - ] - }, - "850": { - "op": "cover 8", - "defined_out": [ - "aggregate%array_length%0#0", - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "coupon_rates#0", - "aggregate%array_length%0#0" - ] - }, - "852": { - "op": "pushint 2", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "2" - ] - }, - "854": { - "op": "*", - "defined_out": [ - "aggregate%array_length%0#0", - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "mul%0#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "coupon_rates#0", - "mul%0#0" - ] - }, - "855": { - "op": "pushint 2", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "coupon_rates#0", - "mul%0#0", - "2" - ] - }, - "857": { - "op": "+", - "defined_out": [ - "add%0#0", - "aggregate%array_length%0#0", - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "coupon_rates#0", - "add%0#0" - ] - }, - "858": { - "op": "swap", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "add%0#0", - "coupon_rates#0" - ] - }, - "859": { - "op": "len", - "defined_out": [ - "add%0#0", - "aggregate%array_length%0#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "len%7#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "add%0#0", - "len%7#0" - ] - }, - "860": { - "op": "==", - "defined_out": [ - "aggregate%array_length%0#0", - "day_count_convention#0", - "denomination_asset_id#0", - "eq%7#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "eq%7#0" - ] - }, - "861": { - "error": "invalid number of bytes for arc4.dynamic_array", - "op": "assert // invalid number of bytes for arc4.dynamic_array", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "862": { - "op": "txna ApplicationArgs 9" - }, - "865": { - "op": "dup", - "defined_out": [ - "aggregate%array_length%0#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_events#0", - "time_events#0" - ] - }, - "866": { - "op": "cover 7", - "defined_out": [ - "aggregate%array_length%0#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_events#0" - ] - }, - "868": { - "op": "dup", - "defined_out": [ - "aggregate%array_length%0#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0", - "time_events#0 (copy)" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_events#0", - "time_events#0 (copy)" - ] - }, - "869": { - "op": "intc_0 // 0", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_events#0", - "time_events#0 (copy)", - "0" - ] - }, - "870": { - "error": "invalid array length header", - "op": "extract_uint16 // on error: invalid array length header", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_events#0", - "aggregate%array_length%1#0" - ] - }, - "871": { - "op": "dup", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%1#0" - ] - }, - "872": { - "op": "cover 8", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_events#0", - "aggregate%array_length%1#0" - ] - }, - "874": { - "op": "intc_3 // 8", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_events#0", - "aggregate%array_length%1#0", - "8" - ] - }, - "875": { - "op": "*", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "mul%1#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_events#0", - "mul%1#0" - ] - }, - "876": { - "op": "pushint 2", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_events#0", - "mul%1#0", - "2" - ] - }, - "878": { - "op": "+", - "defined_out": [ - "add%1#0", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_events#0", - "add%1#0" - ] - }, - "879": { - "op": "swap", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "add%1#0", - "time_events#0" - ] - }, - "880": { - "op": "len", - "defined_out": [ - "add%1#0", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "len%8#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "add%1#0", - "len%8#0" - ] - }, - "881": { - "op": "==", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "day_count_convention#0", - "denomination_asset_id#0", - "eq%8#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "eq%8#0" - ] - }, - "882": { - "error": "invalid number of bytes for arc4.dynamic_array", - "op": "assert // invalid number of bytes for arc4.dynamic_array", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "883": { - "op": "txna ApplicationArgs 10", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_periods#0" - ] - }, - "886": { - "op": "dup", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0", - "time_periods#0", - "time_periods#0 (copy)" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_periods#0", - "time_periods#0 (copy)" - ] - }, - "887": { - "op": "intc_0 // 0", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_periods#0", - "time_periods#0 (copy)", - "0" - ] - }, - "888": { - "error": "invalid array length header", - "op": "extract_uint16 // on error: invalid array length header", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_periods#0", - "aggregate%array_length%2#0" - ] - }, - "889": { - "op": "dup", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_periods#0", - "aggregate%array_length%2#0", - "aggregate%array_length%2#0" - ] - }, - "890": { - "op": "cover 8", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_periods#0", - "aggregate%array_length%2#0" - ] - }, - "892": { - "op": "pushint 16", - "defined_out": [ - "16", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_periods#0", - "aggregate%array_length%2#0", - "16" - ] - }, - "894": { - "op": "*", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "mul%2#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_periods#0", - "mul%2#0" - ] - }, - "895": { - "op": "pushint 2", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_periods#0", - "mul%2#0", - "2" - ] - }, - "897": { - "op": "+", - "defined_out": [ - "add%2#0", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_periods#0", - "add%2#0" - ] - }, - "898": { - "op": "swap", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "add%2#0", - "time_periods#0" - ] - }, - "899": { - "op": "len", - "defined_out": [ - "add%2#0", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "len%9#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "add%2#0", - "len%9#0" - ] - }, - "900": { - "op": "==", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "denomination_asset_id#0", - "eq%9#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "eq%9#0" - ] - }, - "901": { - "error": "invalid number of bytes for arc4.dynamic_array>", - "op": "assert // invalid number of bytes for arc4.dynamic_array>", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "902": { - "callsub": "modules.rbac.RbacModule.assert_caller_is_arranger", - "op": "callsub assert_caller_is_arranger" - }, - "905": { - "op": "intc_0 // 0", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "0" - ] - }, - "906": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"", - "0", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "0", - "\"status\"" - ] - }, - "907": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "maybe_exists%0#0", - "maybe_value%0#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "908": { - "error": "check self.status exists", - "op": "assert // check self.status exists", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "maybe_value%0#0" - ] - }, - "909": { - "op": "!", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0", - "tmp%0#1" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "tmp%0#1" - ] - }, - "910": { - "error": "D-ASA already configured", - "op": "assert // D-ASA already configured", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "911": { - "op": "dig 5", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "denomination_asset_id#0", - "denomination_asset_id#0 (copy)", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "denomination_asset_id#0 (copy)" - ] - }, - "913": { - "op": "asset_params_get AssetCreator", - "defined_out": [ - "_creator#0", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "denomination_asset_id#0", - "exists#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "_creator#0", - "exists#0" - ] - }, - "915": { - "op": "bury 1", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "exists#0" - ] - }, - "917": { - "error": "Denomination asset is not properly set", - "op": "assert // Denomination asset is not properly set", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "918": { - "op": "bytec 22 // \"denomination_asset_id\"", - "defined_out": [ - "\"denomination_asset_id\"", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "\"denomination_asset_id\"" - ] - }, - "920": { - "op": "dig 6", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "\"denomination_asset_id\"", - "denomination_asset_id#0 (copy)" - ] - }, - "922": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "923": { - "op": "dig 4", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "settlement_asset_id#0 (copy)", - "time_events#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "settlement_asset_id#0 (copy)" - ] - }, - "925": { - "op": "uncover 6", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "settlement_asset_id#0 (copy)", - "denomination_asset_id#0" - ] - }, - "927": { - "op": "==", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "tmp%0#1" - ] - }, - "928": { - "error": "Different settlement asset not supported, must be equal to denomination asset", - "op": "assert // Different settlement asset not supported, must be equal to denomination asset", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "929": { - "op": "bytec 13 // \"settlement_asset_id\"", - "defined_out": [ - "\"settlement_asset_id\"", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "\"settlement_asset_id\"" - ] - }, - "931": { - "op": "dig 5", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "\"settlement_asset_id\"", - "settlement_asset_id#0 (copy)" - ] - }, - "933": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "934": { - "op": "itxn_begin" - }, - "935": { - "op": "global MinTxnFee", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "inner_txn_params%0%%param_Fee_idx_0#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "inner_txn_params%0%%param_Fee_idx_0#0" - ] - }, - "937": { - "op": "global CurrentApplicationAddress", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "inner_txn_params%0%%param_AssetReceiver_idx_0#0", - "inner_txn_params%0%%param_Fee_idx_0#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "inner_txn_params%0%%param_Fee_idx_0#0", - "inner_txn_params%0%%param_AssetReceiver_idx_0#0" - ] - }, - "939": { - "op": "intc_0 // 0", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "inner_txn_params%0%%param_Fee_idx_0#0", - "inner_txn_params%0%%param_AssetReceiver_idx_0#0", - "0" - ] - }, - "940": { - "op": "itxn_field AssetAmount", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "inner_txn_params%0%%param_Fee_idx_0#0", - "inner_txn_params%0%%param_AssetReceiver_idx_0#0" - ] - }, - "942": { - "op": "itxn_field AssetReceiver", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "inner_txn_params%0%%param_Fee_idx_0#0" - ] - }, - "944": { - "op": "uncover 5", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "inner_txn_params%0%%param_Fee_idx_0#0", - "settlement_asset_id#0" - ] - }, - "946": { - "op": "itxn_field XferAsset", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "inner_txn_params%0%%param_Fee_idx_0#0" - ] - }, - "948": { - "op": "pushint 4 // axfer", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "axfer", - "day_count_convention#0", - "inner_txn_params%0%%param_Fee_idx_0#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "inner_txn_params%0%%param_Fee_idx_0#0", - "axfer" - ] - }, - "950": { - "op": "itxn_field TypeEnum", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "inner_txn_params%0%%param_Fee_idx_0#0" - ] - }, - "952": { - "op": "itxn_field Fee", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "954": { - "op": "itxn_submit" - }, - "955": { - "op": "dig 3", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal#0 (copy)", - "principal_discount#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "principal#0 (copy)" - ] - }, - "957": { - "op": "dig 2", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "interest_rate#0", - "minimum_denomination#0", - "minimum_denomination#0 (copy)", - "principal#0", - "principal#0 (copy)", - "principal_discount#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "principal#0 (copy)", - "minimum_denomination#0 (copy)" - ] - }, - "959": { - "op": "%", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "time_events#0", - "tmp%1#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "tmp%1#0" - ] - }, - "960": { - "op": "!", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "time_events#0", - "tmp%2#1" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "tmp%2#1" - ] - }, - "961": { - "error": "Minimum denomination is not a divisor of principal", - "op": "assert // Minimum denomination is not a divisor of principal", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "962": { - "op": "bytec 6 // \"unit_value\"", - "defined_out": [ - "\"unit_value\"", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "\"unit_value\"" - ] - }, - "964": { - "op": "dig 2", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "\"unit_value\"", - "minimum_denomination#0 (copy)" - ] - }, - "966": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "967": { - "op": "uncover 3", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "principal#0" - ] - }, - "969": { - "op": "uncover 2", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal_discount#0", - "day_count_convention#0", - "principal#0", - "minimum_denomination#0" - ] - }, - "971": { - "op": "/", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "interest_rate#0", - "principal_discount#0", - "time_events#0", - "tmp%3#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal_discount#0", - "day_count_convention#0", - "tmp%3#0" - ] - }, - "972": { - "op": "bytec 12 // \"total_units\"", - "defined_out": [ - "\"total_units\"", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "interest_rate#0", - "principal_discount#0", - "time_events#0", - "tmp%3#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal_discount#0", - "day_count_convention#0", - "tmp%3#0", - "\"total_units\"" - ] - }, - "974": { - "op": "swap", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal_discount#0", - "day_count_convention#0", - "\"total_units\"", - "tmp%3#0" - ] - }, - "975": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal_discount#0", - "day_count_convention#0" - ] - }, - "976": { - "op": "bytec 15 // \"principal_discount\"", - "defined_out": [ - "\"principal_discount\"", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "interest_rate#0", - "principal_discount#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal_discount#0", - "day_count_convention#0", - "\"principal_discount\"" - ] - }, - "978": { - "op": "uncover 2", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "\"principal_discount\"", - "principal_discount#0" - ] - }, - "980": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0" - ] - }, - "981": { - "op": "btoi", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "interest_rate#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "982": { - "op": "dup", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "interest_rate#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "day_count_convention#2" - ] - }, - "983": { - "op": "bz asset_config_bool_true@3", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "986": { - "op": "dup", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "day_count_convention#2" - ] - }, - "987": { - "op": "pushint 255", - "defined_out": [ - "255", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "interest_rate#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "day_count_convention#2", - "255" - ] - }, - "990": { - "op": "==", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "interest_rate#0", - "time_events#0", - "tmp%1#1" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "tmp%1#1" - ] - }, - "991": { - "op": "bz asset_config_bool_false@4", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "994": { - "block": "asset_config_bool_true@3", - "stack_in": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ], - "op": "intc_1 // 1", - "defined_out": [ - "or_result%0#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "or_result%0#0" - ] - }, - "995": { - "error": "Invalid day-count convention ID", - "block": "asset_config_bool_merge@5", - "stack_in": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "or_result%0#0" - ], - "op": "assert // Invalid day-count convention ID", - "defined_out": [], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "996": { - "op": "bytec 14 // \"day_count_convention\"", - "defined_out": [ - "\"day_count_convention\"" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "\"day_count_convention\"" - ] - }, - "998": { - "op": "dig 1", - "defined_out": [ - "\"day_count_convention\"", - "day_count_convention#2" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "\"day_count_convention\"", - "day_count_convention#2" - ] - }, - "1000": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1001": { - "op": "dig 5", - "defined_out": [ - "day_count_convention#2", - "interest_rate#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "interest_rate#0" - ] - }, - "1003": { - "op": "btoi", - "defined_out": [ - "day_count_convention#2", - "interest_rate#0", - "interest_rate#2" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "interest_rate#2" - ] - }, - "1004": { - "op": "dup", - "defined_out": [ - "day_count_convention#2", - "interest_rate#0", - "interest_rate#2", - "interest_rate#2 (copy)" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "interest_rate#2", - "interest_rate#2 (copy)" - ] - }, - "1005": { - "op": "!", - "defined_out": [ - "day_count_convention#2", - "interest_rate#0", - "interest_rate#2", - "tmp%0#1" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "interest_rate#2", - "tmp%0#1" - ] - }, - "1006": { - "error": "Interest rate is not properly defined", - "op": "assert // Interest rate is not properly defined", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "interest_rate#2" - ] - }, - "1007": { - "op": "bytec 26 // \"interest_rate\"", - "defined_out": [ - "\"interest_rate\"", - "day_count_convention#2", - "interest_rate#0", - "interest_rate#2" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "interest_rate#2", - "\"interest_rate\"" - ] - }, - "1009": { - "op": "swap", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "\"interest_rate\"", - "interest_rate#2" - ] - }, - "1010": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1011": { - "op": "dig 4", - "defined_out": [ - "aggregate%array_length%0#0", - "day_count_convention#2", - "interest_rate#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_length%0#0" - ] - }, - "1013": { - "op": "dup", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%0#0 (copy)", - "day_count_convention#2", - "interest_rate#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_length%0#0", - "aggregate%array_length%0#0 (copy)" - ] - }, - "1014": { - "op": "!", - "defined_out": [ - "aggregate%array_length%0#0", - "day_count_convention#2", - "interest_rate#0", - "tmp%1#1" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_length%0#0", - "tmp%1#1" - ] - }, - "1015": { - "error": "Coupon rates are not properly defined", - "op": "assert // Coupon rates are not properly defined", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_length%0#0" - ] - }, - "1016": { - "op": "bytec 29 // \"total_coupons\"", - "defined_out": [ - "\"total_coupons\"", - "aggregate%array_length%0#0", - "day_count_convention#2", - "interest_rate#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_length%0#0", - "\"total_coupons\"" - ] - }, - "1018": { - "op": "dig 1", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_length%0#0", - "\"total_coupons\"", - "aggregate%array_length%0#0 (copy)" - ] - }, - "1020": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_length%0#0" - ] - }, - "1021": { - "op": "pushint 4", - "defined_out": [ - "4", - "aggregate%array_length%0#0", - "day_count_convention#2", - "interest_rate#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_length%0#0", - "4" - ] - }, - "1023": { - "op": "+", - "defined_out": [ - "aggregate%array_length%0#0", - "day_count_convention#2", - "interest_rate#0", - "tmp%1#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "tmp%1#0" - ] - }, - "1024": { - "op": "dig 3", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "day_count_convention#2", - "interest_rate#0", - "tmp%1#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "tmp%1#0", - "aggregate%array_length%1#0" - ] - }, - "1026": { - "op": "==", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "day_count_convention#2", - "interest_rate#0", - "tmp%2#1" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "tmp%2#1" - ] - }, - "1027": { - "error": "Time events length is invalid", - "op": "assert // Time events length is invalid", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1028": { - "op": "dig 3", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "day_count_convention#2", - "interest_rate#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0" - ] - }, - "1030": { - "callsub": "modules.core_financial.common.CoreFinancialCommonMixin.assert_time_events_sorted", - "op": "callsub assert_time_events_sorted" - }, - "1033": { - "op": "bytec 27 // 0x74696d654576656e7473", - "defined_out": [ - "0x74696d654576656e7473", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "day_count_convention#2", - "interest_rate#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "0x74696d654576656e7473" - ] - }, - "1035": { - "op": "box_del", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "day_count_convention#2", - "interest_rate#0", - "time_events#0", - "{box_del}" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "{box_del}" - ] - }, - "1036": { - "op": "pop", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0" - ] - }, - "1037": { - "op": "bytec 27 // 0x74696d654576656e7473", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "0x74696d654576656e7473" - ] - }, - "1039": { - "op": "dig 1", - "defined_out": [ - "0x74696d654576656e7473", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "day_count_convention#2", - "interest_rate#0", - "time_events#0", - "time_events#0 (copy)" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "0x74696d654576656e7473", - "time_events#0 (copy)" - ] - }, - "1041": { - "op": "box_put", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0" - ] - }, - "1042": { - "op": "dup", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "time_events#0 (copy)" - ] - }, - "1043": { - "op": "extract 2 0", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_trimmed%0#0", - "day_count_convention#2", - "interest_rate#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0" - ] - }, - "1046": { - "op": "dig 1", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0", - "time_events#0 (copy)" - ] - }, - "1048": { - "op": "pushint 2", - "defined_out": [ - "2", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_trimmed%0#0", - "day_count_convention#2", - "interest_rate#0", - "time_events#0", - "time_events#0 (copy)" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0", - "time_events#0 (copy)", - "2" - ] - }, - "1050": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_trimmed%0#0", - "day_count_convention#2", - "interest_rate#0", - "time_events#0", - "values%0#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0", - "values%0#0" - ] - }, - "1051": { - "op": "bytec 7 // \"primary_distribution_opening_date\"", - "defined_out": [ - "\"primary_distribution_opening_date\"", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_trimmed%0#0", - "day_count_convention#2", - "interest_rate#0", - "time_events#0", - "values%0#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0", - "values%0#0", - "\"primary_distribution_opening_date\"" - ] - }, - "1053": { - "op": "swap", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0", - "\"primary_distribution_opening_date\"", - "values%0#0" - ] - }, - "1054": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0" - ] - }, - "1055": { - "op": "dig 1", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0", - "time_events#0 (copy)" - ] - }, - "1057": { - "op": "pushint 10", - "defined_out": [ - "10", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_trimmed%0#0", - "day_count_convention#2", - "interest_rate#0", - "time_events#0", - "time_events#0 (copy)" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0", - "time_events#0 (copy)", - "10" - ] - }, - "1059": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_trimmed%0#0", - "day_count_convention#2", - "interest_rate#0", - "time_events#0", - "values%1#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0", - "values%1#0" - ] - }, - "1060": { - "op": "bytec 24 // \"primary_distribution_closure_date\"", - "defined_out": [ - "\"primary_distribution_closure_date\"", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_trimmed%0#0", - "day_count_convention#2", - "interest_rate#0", - "time_events#0", - "values%1#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0", - "values%1#0", - "\"primary_distribution_closure_date\"" - ] - }, - "1062": { - "op": "swap", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0", - "\"primary_distribution_closure_date\"", - "values%1#0" - ] - }, - "1063": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0" - ] - }, - "1064": { - "op": "dig 1", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0", - "time_events#0 (copy)" - ] - }, - "1066": { - "op": "pushint 18", - "defined_out": [ - "18", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_trimmed%0#0", - "day_count_convention#2", - "interest_rate#0", - "time_events#0", - "time_events#0 (copy)" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0", - "time_events#0 (copy)", - "18" - ] - }, - "1068": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_trimmed%0#0", - "day_count_convention#2", - "interest_rate#0", - "time_events#0", - "values%2#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0", - "values%2#0" - ] - }, - "1069": { - "op": "bytec 8 // \"issuance_date\"", - "defined_out": [ - "\"issuance_date\"", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_trimmed%0#0", - "day_count_convention#2", - "interest_rate#0", - "time_events#0", - "values%2#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0", - "values%2#0", - "\"issuance_date\"" - ] - }, - "1071": { - "op": "swap", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0", - "\"issuance_date\"", - "values%2#0" - ] - }, - "1072": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0" - ] - }, - "1073": { - "op": "swap", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_trimmed%0#0", - "time_events#0" - ] - }, - "1074": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_trimmed%0#0", - "day_count_convention#2", - "interest_rate#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_trimmed%0#0", - "time_events#0", - "0" - ] - }, - "1075": { - "error": "invalid array length header", - "op": "extract_uint16 // on error: invalid array length header", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%6#0", - "aggregate%array_trimmed%0#0", - "day_count_convention#2", - "interest_rate#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_trimmed%0#0", - "aggregate%array_length%6#0" - ] - }, - "1076": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%6#0", - "aggregate%array_trimmed%0#0", - "day_count_convention#2", - "interest_rate#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_trimmed%0#0", - "aggregate%array_length%6#0", - "1" - ] - }, - "1077": { - "op": "-", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_trimmed%0#0", - "tmp%1#0" - ] - }, - "1078": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_trimmed%0#0", - "day_count_convention#2", - "interest_rate#0", - "time_events#0", - "tmp%1#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_trimmed%0#0", - "tmp%1#0", - "8" - ] - }, - "1079": { - "op": "*", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_trimmed%0#0", - "aggregate%bytes_offset%3#0", - "day_count_convention#2", - "interest_rate#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_trimmed%0#0", - "aggregate%bytes_offset%3#0" - ] - }, - "1080": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "day_count_convention#2", - "interest_rate#0", - "time_events#0", - "values%3#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "values%3#0" - ] - }, - "1081": { - "op": "bytec 4 // \"maturity_date\"", - "defined_out": [ - "\"maturity_date\"", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "day_count_convention#2", - "interest_rate#0", - "time_events#0", - "values%3#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "values%3#0", - "\"maturity_date\"" - ] - }, - "1083": { - "op": "swap", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "\"maturity_date\"", - "values%3#0" - ] - }, - "1084": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1085": { - "op": "dig 1", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "interest_rate#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_length%2#0" - ] - }, - "1087": { - "op": "!", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "tmp%1#1" - ] - }, - "1088": { - "error": "Time periods are not properly defined", - "op": "assert // Time periods are not properly defined", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1089": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "interest_rate#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "\"status\"" - ] - }, - "1090": { - "op": "pushint 100", - "defined_out": [ - "\"status\"", - "100", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "interest_rate#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "\"status\"", - "100" - ] - }, - "1092": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1093": { - "op": "intc_1 // 1", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "1" - ] - }, - "1094": { - "op": "return", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1095": { - "block": "asset_config_bool_false@4", - "stack_in": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ], - "op": "intc_0 // 0", - "defined_out": [ - "or_result%0#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "or_result%0#0" - ] - }, - "1096": { - "op": "b asset_config_bool_merge@5" - }, - "1099": { - "subroutine": "modules.core_financial.no_coupon.NoCouponCashflowMixin.get_account_units_current_value[routing]", - "params": {}, - "block": "get_account_units_current_value", - "stack_in": [], - "op": "intc_0 // 0", - "stack_out": [ - "box_prefixed_key%0#1" - ] - }, - "1100": { - "op": "pushbytes \"\"", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0" - ] - }, - "1102": { - "op": "dupn 5", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0" - ] - }, - "1104": { - "op": "txna ApplicationArgs 1" - }, - "1107": { - "op": "dup", - "defined_out": [ - "holding_address#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "holding_address#0" - ] - }, - "1108": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "len%0#0" - ] - }, - "1109": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "len%0#0", - "32" - ] - }, - "1110": { - "op": "==", - "defined_out": [ - "eq%0#0", - "holding_address#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "eq%0#0" - ] - }, - "1111": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0" - ] - }, - "1112": { - "op": "txna ApplicationArgs 2", - "defined_out": [ - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "tmp%2#0" - ] - }, - "1115": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ] - }, - "1116": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%1#0", - "tmp%2#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "tmp%2#0", - "len%1#0" - ] - }, - "1117": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "holding_address#0", - "len%1#0", - "tmp%2#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "tmp%2#0", - "len%1#0", - "8" - ] - }, - "1118": { - "op": "==", - "defined_out": [ - "eq%1#0", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "tmp%2#0", - "eq%1#0" - ] - }, - "1119": { - "error": "invalid number of bytes for arc4.uint64", - "op": "assert // invalid number of bytes for arc4.uint64", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "tmp%2#0" - ] - }, - "1120": { - "op": "btoi", - "defined_out": [ - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1121": { - "op": "intc_0 // 0", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "0" - ] - }, - "1122": { - "op": "bytec 7 // \"primary_distribution_opening_date\"", - "defined_out": [ - "\"primary_distribution_opening_date\"", - "0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "0", - "\"primary_distribution_opening_date\"" - ] - }, - "1124": { - "op": "app_global_get_ex", - "defined_out": [ - "holding_address#0", - "maybe_exists%0#0", - "maybe_value%0#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1125": { - "error": "check self.primary_distribution_opening_date exists", - "op": "assert // check self.primary_distribution_opening_date exists", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "maybe_value%0#0" - ] - }, - "1126": { - "op": "bz get_account_units_current_value_bool_false@4", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1129": { - "op": "global LatestTimestamp", - "defined_out": [ - "holding_address#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "tmp%1#1" - ] - }, - "1131": { - "op": "intc_0 // 0", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "tmp%1#1", - "0" - ] - }, - "1132": { - "op": "bytec 7 // \"primary_distribution_opening_date\"", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "tmp%1#1", - "0", - "\"primary_distribution_opening_date\"" - ] - }, - "1134": { - "op": "app_global_get_ex", - "defined_out": [ - "holding_address#0", - "maybe_exists%1#0", - "maybe_value%1#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "tmp%1#1", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "1135": { - "error": "check self.primary_distribution_opening_date exists", - "op": "assert // check self.primary_distribution_opening_date exists", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "tmp%1#1", - "maybe_value%1#0" - ] - }, - "1136": { - "op": ">=", - "defined_out": [ - "holding_address#0", - "tmp%2#1", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "tmp%2#1" - ] - }, - "1137": { - "op": "bz get_account_units_current_value_bool_false@4", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1140": { - "op": "intc_1 // 1", - "defined_out": [ - "and_result%0#0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "and_result%0#0" - ] - }, - "1141": { - "error": "Primary distribution not yet executed", - "block": "get_account_units_current_value_bool_merge@5", - "stack_in": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "and_result%0#0" - ], - "op": "assert // Primary distribution not yet executed", - "defined_out": [], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1142": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "0x52333023" - ] - }, - "1143": { - "op": "dig 2", - "defined_out": [ - "0x52333023", - "holding_address#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "0x52333023", - "holding_address#0" - ] - }, - "1145": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1" - ] - }, - "1146": { - "op": "dup", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1" - ] - }, - "1147": { - "op": "bury 10", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1" - ] - }, - "1149": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "holding_address#0", - "maybe_exists%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "1150": { - "op": "bury 1", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "maybe_exists%0#0" - ] - }, - "1152": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1153": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "units#0" - ] - }, - "1154": { - "op": "bz get_account_units_current_value_bool_false@8", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1157": { - "op": "dig 8", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1" - ] - }, - "1159": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0", - "box_prefixed_key%0#1", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "1160": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%box_get%0#0" - ] - }, - "1161": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "aggregate%box_get%0#0", - "box_prefixed_key%0#1", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%box_get%0#0", - "32" - ] - }, - "1162": { - "op": "extract_uint64", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "units#0", - "values%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "values%0#0" - ] - }, - "1163": { - "op": "dig 1", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "values%0#0", - "units#0" - ] - }, - "1165": { - "op": ">=", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "tmp%4#1", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "tmp%4#1" - ] - }, - "1166": { - "op": "bz get_account_units_current_value_bool_false@8", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1169": { - "op": "intc_1 // 1", - "defined_out": [ - "and_result%1#0", - "box_prefixed_key%0#1", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "and_result%1#0" - ] - }, - "1170": { - "error": "Invalid amount of units for the account", - "block": "get_account_units_current_value_bool_merge@9", - "stack_in": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "and_result%1#0" - ], - "op": "assert // Invalid amount of units for the account", - "defined_out": [], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1171": { - "op": "dup2", - "defined_out": [ - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "holding_address#0", - "units#0" - ] - }, - "1172": { - "callsub": "modules.accounting.AccountingModule.account_units_value", - "op": "callsub account_units_value", - "defined_out": [ - "account_units_nominal_value#0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "account_units_nominal_value#0" - ] - }, - "1175": { - "op": "dup", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "account_units_nominal_value#0", - "account_units_nominal_value#0" - ] - }, - "1176": { - "op": "bury 8", - "defined_out": [ - "account_units_nominal_value#0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "account_units_nominal_value#0" - ] - }, - "1178": { - "op": "intc_0 // 0", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "account_units_nominal_value#0", - "0" - ] - }, - "1179": { - "op": "bytec 15 // \"principal_discount\"", - "defined_out": [ - "\"principal_discount\"", - "0", - "account_units_nominal_value#0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "account_units_nominal_value#0", - "0", - "\"principal_discount\"" - ] - }, - "1181": { - "op": "app_global_get_ex", - "defined_out": [ - "account_units_nominal_value#0", - "holding_address#0", - "maybe_exists%2#0", - "maybe_value%2#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "account_units_nominal_value#0", - "maybe_value%2#0", - "maybe_exists%2#0" - ] - }, - "1182": { - "error": "check self.principal_discount exists", - "op": "assert // check self.principal_discount exists", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "account_units_nominal_value#0", - "maybe_value%2#0" - ] - }, - "1183": { - "op": "dig 1", - "defined_out": [ - "account_units_nominal_value#0", - "account_units_nominal_value#0 (copy)", - "holding_address#0", - "maybe_value%2#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "account_units_nominal_value#0", - "maybe_value%2#0", - "account_units_nominal_value#0 (copy)" - ] - }, - "1185": { - "op": "*", - "defined_out": [ - "account_units_nominal_value#0", - "holding_address#0", - "tmp%6#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "account_units_nominal_value#0", - "tmp%6#0" - ] - }, - "1186": { - "op": "pushint 10000", - "defined_out": [ - "10000", - "account_units_nominal_value#0", - "holding_address#0", - "tmp%6#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "account_units_nominal_value#0", - "tmp%6#0", - "10000" - ] - }, - "1189": { - "op": "/", - "defined_out": [ - "account_units_discount#0", - "account_units_nominal_value#0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "account_units_nominal_value#0", - "account_units_discount#0" - ] - }, - "1190": { - "op": "-", - "defined_out": [ - "account_units_current_value#0", - "account_units_nominal_value#0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "account_units_current_value#0" - ] - }, - "1191": { - "op": "bury 8", - "defined_out": [ - "account_units_current_value#0", - "account_units_nominal_value#0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1193": { - "op": "intc_0 // 0", - "defined_out": [ - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "accrued_interest#0" - ] - }, - "1194": { - "op": "bury 6", - "defined_out": [ - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1196": { - "op": "intc_0 // 0", - "defined_out": [ - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "holding_address#0", - "numerator#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "numerator#0" - ] - }, - "1197": { - "op": "bury 3", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1199": { - "op": "intc_0 // 0", - "defined_out": [ - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "holding_address#0", - "numerator#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "denominator#0" - ] - }, - "1200": { - "op": "bury 4", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1202": { - "op": "intc_0 // 0", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "0" - ] - }, - "1203": { - "op": "bytec 8 // \"issuance_date\"", - "defined_out": [ - "\"issuance_date\"", - "0", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "holding_address#0", - "numerator#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "0", - "\"issuance_date\"" - ] - }, - "1205": { - "op": "app_global_get_ex", - "defined_out": [ - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "holding_address#0", - "maybe_exists%0#0", - "maybe_value%0#0", - "numerator#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1206": { - "error": "check self.issuance_date exists", - "op": "assert // check self.issuance_date exists", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "maybe_value%0#0" - ] - }, - "1207": { - "op": "global LatestTimestamp" - }, - "1209": { - "op": "dup", - "defined_out": [ - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "holding_address#0", - "maybe_value%0#0", - "numerator#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "maybe_value%0#0", - "awst_tmp%0#0", - "awst_tmp%0#0" - ] - }, - "1210": { - "op": "bury 7", - "defined_out": [ - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "holding_address#0", - "maybe_value%0#0", - "numerator#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "maybe_value%0#0", - "awst_tmp%0#0" - ] - }, - "1212": { - "op": "<=", - "defined_out": [ - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "holding_address#0", - "numerator#0", - "tmp%0#2", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "tmp%0#2" - ] - }, - "1213": { - "op": "bz get_account_units_current_value_bool_false@17", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1216": { - "op": "intc_0 // 0", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "0" - ] - }, - "1217": { - "op": "bytec 4 // \"maturity_date\"", - "defined_out": [ - "\"maturity_date\"", - "0", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "holding_address#0", - "numerator#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "0", - "\"maturity_date\"" - ] - }, - "1219": { - "op": "app_global_get_ex", - "defined_out": [ - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "holding_address#0", - "maybe_exists%1#0", - "maybe_value%1#0", - "numerator#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "1220": { - "error": "check self.maturity_date exists", - "op": "assert // check self.maturity_date exists", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "maybe_value%1#0" - ] - }, - "1221": { - "op": "dig 5", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "maybe_value%1#0", - "awst_tmp%0#0" - ] - }, - "1223": { - "op": ">", - "defined_out": [ - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "holding_address#0", - "numerator#0", - "tmp%1#2", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "tmp%1#2" - ] - }, - "1224": { - "op": "bz get_account_units_current_value_bool_false@17", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1227": { - "op": "intc_1 // 1", - "defined_out": [ - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "and_result%0#0", - "awst_tmp%0#0", - "denominator#0", - "holding_address#0", - "numerator#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "and_result%0#0" - ] - }, - "1228": { - "block": "get_account_units_current_value_bool_merge@18", - "stack_in": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "and_result%0#0" - ], - "op": "bz get_account_units_current_value_after_if_else@11", - "defined_out": [], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1231": { - "callsub": "modules.core_financial.no_coupon.NoCouponCashflowMixin.day_count_factor", - "op": "callsub day_count_factor", - "defined_out": [ - "day_count_factor#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "day_count_factor#0" - ] - }, - "1234": { - "op": "dig 2", - "defined_out": [ - "day_count_factor#0", - "holding_address#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "day_count_factor#0", - "holding_address#0" - ] - }, - "1236": { - "op": "dig 2", - "defined_out": [ - "day_count_factor#0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "day_count_factor#0", - "holding_address#0", - "units#0" - ] - }, - "1238": { - "callsub": "modules.core_financial.no_coupon.NoCouponCashflowMixin.accrued_interest_amount", - "op": "callsub accrued_interest_amount", - "defined_out": [ - "accrued_interest#0", - "day_count_factor#0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "day_count_factor#0", - "accrued_interest#0" - ] - }, - "1241": { - "op": "bury 7", - "defined_out": [ - "accrued_interest#0", - "day_count_factor#0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "day_count_factor#0" - ] - }, - "1243": { - "op": "dup", - "defined_out": [ - "accrued_interest#0", - "day_count_factor#0", - "day_count_factor#0 (copy)", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "day_count_factor#0", - "day_count_factor#0 (copy)" - ] - }, - "1244": { - "op": "intc_0 // 0", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "day_count_factor#0", - "day_count_factor#0 (copy)", - "0" - ] - }, - "1245": { - "op": "extract_uint64", - "defined_out": [ - "accrued_interest#0", - "day_count_factor#0", - "holding_address#0", - "numerator#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "day_count_factor#0", - "numerator#0" - ] - }, - "1246": { - "op": "bury 4", - "defined_out": [ - "accrued_interest#0", - "day_count_factor#0", - "holding_address#0", - "numerator#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "day_count_factor#0" - ] - }, - "1248": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "accrued_interest#0", - "day_count_factor#0", - "holding_address#0", - "numerator#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "day_count_factor#0", - "8" - ] - }, - "1249": { - "op": "extract_uint64", - "defined_out": [ - "accrued_interest#0", - "denominator#0", - "holding_address#0", - "numerator#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "denominator#0" - ] - }, - "1250": { - "op": "bury 4", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1252": { - "block": "get_account_units_current_value_after_if_else@11", - "stack_in": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0" - ], - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%12#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "tmp%12#0" - ] - }, - "1254": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "tmp%12#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "tmp%12#0", - "0" - ] - }, - "1255": { - "op": "bytec 4 // \"maturity_date\"", - "defined_out": [ - "\"maturity_date\"", - "0", - "tmp%12#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "tmp%12#0", - "0", - "\"maturity_date\"" - ] - }, - "1257": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%3#0", - "maybe_value%3#0", - "tmp%12#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "tmp%12#0", - "maybe_value%3#0", - "maybe_exists%3#0" - ] - }, - "1258": { - "error": "check self.maturity_date exists", - "op": "assert // check self.maturity_date exists", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "tmp%12#0", - "maybe_value%3#0" - ] - }, - "1259": { - "op": ">=", - "defined_out": [ - "tmp%13#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "tmp%13#0" - ] - }, - "1260": { - "op": "bz get_account_units_current_value_after_if_else@13", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1263": { - "op": "dig 6", - "defined_out": [ - "account_units_current_value#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "account_units_current_value#0" - ] - }, - "1265": { - "op": "bury 8", - "defined_out": [ - "account_units_current_value#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1267": { - "block": "get_account_units_current_value_after_if_else@13", - "stack_in": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0" - ], - "op": "dig 2", - "defined_out": [ - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "numerator#0" - ] - }, - "1269": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%val_as_bytes%0#0" - ] - }, - "1270": { - "op": "dig 4", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "denominator#0", - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%val_as_bytes%0#0", - "denominator#0" - ] - }, - "1272": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0", - "denominator#0", - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0" - ] - }, - "1273": { - "op": "concat", - "defined_out": [ - "aggregate%head%1#0", - "denominator#0", - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%head%1#0" - ] - }, - "1274": { - "op": "dig 8", - "defined_out": [ - "account_units_current_value#0", - "aggregate%head%1#0", - "denominator#0", - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%head%1#0", - "account_units_current_value#0" - ] - }, - "1276": { - "op": "itob", - "defined_out": [ - "account_units_current_value#0", - "aggregate%head%1#0", - "aggregate%val_as_bytes%2#0", - "denominator#0", - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%head%1#0", - "aggregate%val_as_bytes%2#0" - ] - }, - "1277": { - "op": "dig 7", - "defined_out": [ - "account_units_current_value#0", - "accrued_interest#0", - "aggregate%head%1#0", - "aggregate%val_as_bytes%2#0", - "denominator#0", - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%head%1#0", - "aggregate%val_as_bytes%2#0", - "accrued_interest#0" - ] - }, - "1279": { - "op": "itob", - "defined_out": [ - "account_units_current_value#0", - "accrued_interest#0", - "aggregate%head%1#0", - "aggregate%val_as_bytes%2#0", - "aggregate%val_as_bytes%3#0", - "denominator#0", - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%head%1#0", - "aggregate%val_as_bytes%2#0", - "aggregate%val_as_bytes%3#0" - ] - }, - "1280": { - "op": "concat", - "defined_out": [ - "account_units_current_value#0", - "accrued_interest#0", - "aggregate%head%1#0", - "aggregate%head%3#0", - "denominator#0", - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%head%1#0", - "aggregate%head%3#0" - ] - }, - "1281": { - "op": "swap", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%head%3#0", - "aggregate%head%1#0" - ] - }, - "1282": { - "op": "concat", - "defined_out": [ - "account_units_current_value#0", - "accrued_interest#0", - "aggregate%head%4#0", - "denominator#0", - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%head%4#0" - ] - }, - "1283": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "account_units_current_value#0", - "accrued_interest#0", - "aggregate%head%4#0", - "denominator#0", - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%head%4#0", - "0x151f7c75" - ] - }, - "1284": { - "op": "swap", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "0x151f7c75", - "aggregate%head%4#0" - ] - }, - "1285": { - "op": "concat", - "defined_out": [ - "account_units_current_value#0", - "accrued_interest#0", - "denominator#0", - "numerator#0", - "tmp%5#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "tmp%5#0" - ] - }, - "1286": { - "op": "log", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1287": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "account_units_current_value#0", - "accrued_interest#0", - "denominator#0", - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "1" - ] - }, - "1288": { - "op": "return", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1289": { - "block": "get_account_units_current_value_bool_false@17", - "stack_in": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "and_result%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "and_result%0#0" - ] - }, - "1290": { - "op": "b get_account_units_current_value_bool_merge@18" - }, - "1293": { - "block": "get_account_units_current_value_bool_false@8", - "stack_in": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "and_result%1#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "and_result%1#0" - ] - }, - "1294": { - "op": "b get_account_units_current_value_bool_merge@9" - }, - "1297": { - "block": "get_account_units_current_value_bool_false@4", - "stack_in": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "and_result%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "and_result%0#0" - ] - }, - "1298": { - "op": "b get_account_units_current_value_bool_merge@5" - }, - "1301": { - "subroutine": "modules.core_financial.no_coupon.NoCouponCashflowMixin.get_payment_amount[routing]", - "params": {}, - "block": "get_payment_amount", - "stack_in": [], - "op": "txna ApplicationArgs 1" - }, - "1304": { - "op": "dupn 2", - "defined_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0", - "holding_address#0 (copy)" - ] - }, - "1306": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0", - "len%0#0" - ] - }, - "1307": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0", - "len%0#0", - "32" - ] - }, - "1308": { - "op": "==", - "defined_out": [ - "eq%0#0", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0", - "eq%0#0" - ] - }, - "1309": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "holding_address#0", - "holding_address#0" - ] - }, - "1310": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0", - "0x52333023" - ] - }, - "1311": { - "op": "swap", - "stack_out": [ - "holding_address#0", - "0x52333023", - "holding_address#0" - ] - }, - "1312": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#0", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "box_prefixed_key%0#0" - ] - }, - "1313": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "holding_address#0", - "maybe_exists%0#0" - ], - "stack_out": [ - "holding_address#0", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "1314": { - "op": "bury 1", - "stack_out": [ - "holding_address#0", - "maybe_exists%0#0" - ] - }, - "1316": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "holding_address#0" - ] - }, - "1317": { - "op": "intc_0 // 0" - }, - "1318": { - "op": "dup" - }, - "1319": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"", - "0", - "holding_address#0", - "principal_amount#0" - ], - "stack_out": [ - "holding_address#0", - "principal_amount#0", - "0", - "\"status\"" - ] - }, - "1320": { - "op": "app_global_get_ex", - "defined_out": [ - "holding_address#0", - "maybe_exists%0#0", - "maybe_value%0#0", - "principal_amount#0" - ], - "stack_out": [ - "holding_address#0", - "principal_amount#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1321": { - "error": "check self.status exists", - "op": "assert // check self.status exists", - "stack_out": [ - "holding_address#0", - "principal_amount#0", - "maybe_value%0#0" - ] - }, - "1322": { - "op": "pushint 100", - "defined_out": [ - "100", - "holding_address#0", - "maybe_value%0#0", - "principal_amount#0" - ], - "stack_out": [ - "holding_address#0", - "principal_amount#0", - "maybe_value%0#0", - "100" - ] - }, - "1324": { - "op": "==", - "defined_out": [ - "holding_address#0", - "principal_amount#0", - "tmp%0#2" - ], - "stack_out": [ - "holding_address#0", - "principal_amount#0", - "tmp%0#2" - ] - }, - "1325": { - "op": "bz get_payment_amount_after_if_else@3", - "stack_out": [ - "holding_address#0", - "principal_amount#0" - ] - }, - "1328": { - "op": "dig 1", - "stack_out": [ - "holding_address#0", - "principal_amount#0", - "holding_address#0" - ] - }, - "1330": { - "callsub": "modules.accounting.AccountingModule.account_total_units_value", - "op": "callsub account_total_units_value", - "stack_out": [ - "holding_address#0", - "principal_amount#0", - "principal_amount#0" - ] - }, - "1333": { - "op": "bury 1", - "stack_out": [ - "holding_address#0", - "principal_amount#0" - ] - }, - "1335": { - "block": "get_payment_amount_after_if_else@3", - "stack_in": [ - "holding_address#0", - "principal_amount#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "holding_address#0", - "principal_amount#0", - "0" - ] - }, - "1336": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "holding_address#0", - "principal_amount#0", - "aggregate%val_as_bytes%0#0" - ] - }, - "1337": { - "op": "dig 1", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "principal_amount#0" - ], - "stack_out": [ - "holding_address#0", - "principal_amount#0", - "aggregate%val_as_bytes%0#0", - "principal_amount#0" - ] - }, - "1339": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0", - "principal_amount#0" - ], - "stack_out": [ - "holding_address#0", - "principal_amount#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0" - ] - }, - "1340": { - "op": "concat", - "defined_out": [ - "aggregate%head%1#0", - "principal_amount#0" - ], - "stack_out": [ - "holding_address#0", - "principal_amount#0", - "aggregate%head%1#0" - ] - }, - "1341": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%head%1#0", - "principal_amount#0" - ], - "stack_out": [ - "holding_address#0", - "principal_amount#0", - "aggregate%head%1#0", - "0x151f7c75" - ] - }, - "1342": { - "op": "swap", - "stack_out": [ - "holding_address#0", - "principal_amount#0", - "0x151f7c75", - "aggregate%head%1#0" - ] - }, - "1343": { - "op": "concat", - "defined_out": [ - "principal_amount#0", - "tmp%3#0" - ], - "stack_out": [ - "holding_address#0", - "principal_amount#0", - "tmp%3#0" - ] - }, - "1344": { - "op": "log", - "stack_out": [ - "holding_address#0", - "principal_amount#0" - ] - }, - "1345": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "principal_amount#0" - ], - "stack_out": [ - "holding_address#0", - "principal_amount#0", - "1" - ] - }, - "1346": { - "op": "return", - "stack_out": [ - "holding_address#0", - "principal_amount#0" - ] - }, - "1347": { - "subroutine": "modules.payment_agent.principal.PrincipalPaymentAgentMixin.pay_principal[routing]", - "params": {}, - "block": "pay_principal", - "stack_in": [], - "op": "txna ApplicationArgs 1" - }, - "1350": { - "op": "dupn 2", - "defined_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0", - "holding_address#0 (copy)" - ] - }, - "1352": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0", - "len%0#0" - ] - }, - "1353": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0", - "len%0#0", - "32" - ] - }, - "1354": { - "op": "==", - "defined_out": [ - "eq%0#0", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0", - "eq%0#0" - ] - }, - "1355": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "holding_address#0", - "holding_address#0" - ] - }, - "1356": { - "op": "txna ApplicationArgs 2", - "defined_out": [ - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0", - "tmp%2#0" - ] - }, - "1359": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ] - }, - "1360": { - "op": "intc_0 // 0", - "stack_out": [ - "holding_address#0", - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)", - "0" - ] - }, - "1361": { - "error": "invalid array length header", - "op": "extract_uint16 // on error: invalid array length header", - "defined_out": [ - "aggregate%array_length%0#0", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0", - "tmp%2#0", - "aggregate%array_length%0#0" - ] - }, - "1362": { - "op": "pushint 2", - "defined_out": [ - "2", - "aggregate%array_length%0#0", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0", - "tmp%2#0", - "aggregate%array_length%0#0", - "2" - ] - }, - "1364": { - "op": "+", - "defined_out": [ - "add%0#0", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0", - "tmp%2#0", - "add%0#0" - ] - }, - "1365": { - "op": "dig 1", - "stack_out": [ - "holding_address#0", - "holding_address#0", - "tmp%2#0", - "add%0#0", - "tmp%2#0 (copy)" - ] - }, - "1367": { - "op": "len", - "defined_out": [ - "add%0#0", - "holding_address#0", - "len%1#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0", - "tmp%2#0", - "add%0#0", - "len%1#0" - ] - }, - "1368": { - "op": "==", - "defined_out": [ - "eq%1#0", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0", - "tmp%2#0", - "eq%1#0" - ] - }, - "1369": { - "error": "invalid number of bytes for arc4.dynamic_array", - "op": "assert // invalid number of bytes for arc4.dynamic_array", - "stack_out": [ - "holding_address#0", - "holding_address#0", - "tmp%2#0" - ] - }, - "1370": { - "op": "extract 2 0", - "defined_out": [ - "holding_address#0", - "payment_info#0" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0", - "payment_info#0" - ] - }, - "1373": { - "op": "swap", - "defined_out": [ - "holding_address#0", - "payment_info#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "holding_address#0" - ] - }, - "1374": { - "op": "intc_0 // 0", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "holding_address#0", - "0" - ] - }, - "1375": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"", - "0", - "holding_address#0", - "payment_info#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "holding_address#0", - "0", - "\"status\"" - ] - }, - "1376": { - "op": "app_global_get_ex", - "defined_out": [ - "holding_address#0", - "maybe_exists%0#0", - "maybe_value%0#0", - "payment_info#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "holding_address#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1377": { - "error": "check self.status exists", - "op": "assert // check self.status exists", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "holding_address#0", - "maybe_value%0#0" - ] - }, - "1378": { - "op": "pushint 100", - "defined_out": [ - "100", - "holding_address#0", - "maybe_value%0#0", - "payment_info#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "holding_address#0", - "maybe_value%0#0", - "100" - ] - }, - "1380": { - "op": "==", - "defined_out": [ - "holding_address#0", - "payment_info#0", - "tmp%0#8" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "holding_address#0", - "tmp%0#8" - ] - }, - "1381": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "holding_address#0" - ] - }, - "1382": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "op": "callsub assert_is_not_asset_defaulted" - }, - "1385": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_suspended", - "op": "callsub assert_is_not_asset_suspended" - }, - "1388": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023", - "holding_address#0", - "payment_info#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "holding_address#0", - "0x52333023" - ] - }, - "1389": { - "op": "dig 1", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "holding_address#0", - "0x52333023", - "holding_address#0 (copy)" - ] - }, - "1391": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_info#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "holding_address#0", - "box_prefixed_key%0#3" - ] - }, - "1392": { - "op": "dup", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "holding_address#0", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3" - ] - }, - "1393": { - "op": "cover 2", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_info#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "box_prefixed_key%0#3" - ] - }, - "1395": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)", - "holding_address#0", - "payment_info#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)" - ] - }, - "1396": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#3", - "holding_address#0", - "maybe_exists%0#0", - "payment_info#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "box_prefixed_key%0#3", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "1397": { - "op": "bury 1", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "box_prefixed_key%0#3", - "maybe_exists%0#0" - ] - }, - "1399": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "box_prefixed_key%0#3" - ] - }, - "1400": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0", - "box_prefixed_key%0#3", - "holding_address#0", - "payment_info#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "1401": { - "op": "pop", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "aggregate%box_get%0#0" - ] - }, - "1402": { - "op": "intc_2 // 32", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "aggregate%box_get%0#0", - "32" - ] - }, - "1403": { - "op": "extract_uint64", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_info#0", - "units#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "units#0" - ] - }, - "1404": { - "error": "No D-ASA units", - "op": "assert // No D-ASA units", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0" - ] - }, - "1405": { - "op": "global LatestTimestamp", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_info#0", - "tmp%2#1" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "tmp%2#1" - ] - }, - "1407": { - "op": "intc_0 // 0", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "tmp%2#1", - "0" - ] - }, - "1408": { - "op": "bytec 4 // \"maturity_date\"", - "defined_out": [ - "\"maturity_date\"", - "0", - "box_prefixed_key%0#3", - "holding_address#0", - "payment_info#0", - "tmp%2#1" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "tmp%2#1", - "0", - "\"maturity_date\"" - ] - }, - "1410": { - "op": "app_global_get_ex", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "tmp%2#1", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1411": { - "error": "check self.maturity_date exists", - "op": "assert // check self.maturity_date exists", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "tmp%2#1", - "maybe_value%0#0" - ] - }, - "1412": { - "op": ">=", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_info#0", - "tmp%3#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "tmp%3#3" - ] - }, - "1413": { - "error": "Not mature", - "op": "assert // Not mature", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0" - ] - }, - "1414": { - "callsub": "modules.accounting.AccountingModule.account_total_units_value", - "op": "callsub account_total_units_value", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_amount#0", - "payment_info#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ] - }, - "1417": { - "op": "intc_0 // 0", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "0" - ] - }, - "1418": { - "op": "bytec 19 // 0x52323523", - "defined_out": [ - "0", - "0x52323523", - "box_prefixed_key%0#3", - "holding_address#0", - "payment_amount#0", - "payment_info#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "0", - "0x52323523" - ] - }, - "1420": { - "op": "app_global_get_ex", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "maybe_exists%0#0", - "maybe_value%0#5", - "payment_amount#0", - "payment_info#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "maybe_value%0#5", - "maybe_exists%0#0" - ] - }, - "1421": { - "error": "check self.op_daemon exists", - "op": "assert // check self.op_daemon exists", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "maybe_value%0#5" - ] - }, - "1422": { - "op": "global ZeroAddress", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "maybe_value%0#5", - "payment_amount#0", - "payment_info#0", - "tmp%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "maybe_value%0#5", - "tmp%0#3" - ] - }, - "1424": { - "op": "!=", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_amount#0", - "payment_info#0", - "tmp%1#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%1#3" - ] - }, - "1425": { - "op": "bz pay_principal_after_if_else@22", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ] - }, - "1428": { - "op": "txn Sender", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_amount#0", - "payment_info#0", - "tmp%2#4" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%2#4" - ] - }, - "1430": { - "op": "intc_0 // 0", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%2#4", - "0" - ] - }, - "1431": { - "op": "bytec 19 // 0x52323523", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%2#4", - "0", - "0x52323523" - ] - }, - "1433": { - "op": "app_global_get_ex", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "maybe_exists%1#1", - "maybe_value%1#1", - "payment_amount#0", - "payment_info#0", - "tmp%2#4" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%2#4", - "maybe_value%1#1", - "maybe_exists%1#1" - ] - }, - "1434": { - "error": "check self.op_daemon exists", - "op": "assert // check self.op_daemon exists", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%2#4", - "maybe_value%1#1" - ] - }, - "1435": { - "op": "==", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%3#3" - ] - }, - "1436": { - "op": "bnz pay_principal_bool_true@19", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ] - }, - "1439": { - "op": "txn Sender", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_amount#0", - "payment_info#0", - "tmp%4#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%4#0" - ] - }, - "1441": { - "op": "dig 4", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%4#0", - "holding_address#0" - ] - }, - "1443": { - "op": "==", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_amount#0", - "payment_info#0", - "tmp%5#1" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%5#1" - ] - }, - "1444": { - "op": "bnz pay_principal_bool_true@19", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ] - }, - "1447": { - "op": "txn Sender", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_amount#0", - "payment_info#0", - "tmp%6#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%6#0" - ] - }, - "1449": { - "op": "dig 2", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%6#0", - "box_prefixed_key%0#3" - ] - }, - "1451": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%2#0", - "aggregate%box_get%3#0", - "box_prefixed_key%0#3", - "holding_address#0", - "payment_amount#0", - "payment_info#0", - "tmp%6#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%6#0", - "aggregate%box_get%2#0", - "aggregate%box_get%3#0" - ] - }, - "1452": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%6#0", - "aggregate%box_get%2#0" - ] - }, - "1453": { - "op": "extract 0 32", - "defined_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#3", - "holding_address#0", - "payment_amount#0", - "payment_info#0", - "tmp%6#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%6#0", - "aggregate%extract%1#0" - ] - }, - "1456": { - "op": "==", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_amount#0", - "payment_info#0", - "tmp%7#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%7#0" - ] - }, - "1457": { - "op": "bz pay_principal_bool_false@20", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ] - }, - "1460": { - "block": "pay_principal_bool_true@19", - "stack_in": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ], - "op": "intc_1 // 1", - "defined_out": [ - "or_result%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "or_result%0#0" - ] - }, - "1461": { - "error": "Not authorized", - "block": "pay_principal_bool_merge@21", - "stack_in": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "or_result%0#0" - ], - "op": "assert // Not authorized", - "defined_out": [], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ] - }, - "1462": { - "block": "pay_principal_after_if_else@22", - "stack_in": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ], - "op": "dig 1", - "defined_out": [ - "box_prefixed_key%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "box_prefixed_key%0#3" - ] - }, - "1464": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%4#0", - "aggregate%box_get%5#0", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%box_get%4#0", - "aggregate%box_get%5#0" - ] - }, - "1465": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%box_get%4#0" - ] - }, - "1466": { - "op": "extract 0 32", - "defined_out": [ - "aggregate%extract%2#0", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%extract%2#0" - ] - }, - "1469": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "aggregate%extract%2#0", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%extract%2#0", - "0" - ] - }, - "1470": { - "op": "bytec 13 // \"settlement_asset_id\"", - "defined_out": [ - "\"settlement_asset_id\"", - "0", - "aggregate%extract%2#0", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%extract%2#0", - "0", - "\"settlement_asset_id\"" - ] - }, - "1472": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%extract%2#0", - "box_prefixed_key%0#3", - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%extract%2#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1473": { - "error": "check self.settlement_asset_id exists", - "op": "assert // check self.settlement_asset_id exists", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%extract%2#0", - "maybe_value%0#0" - ] - }, - "1474": { - "op": "asset_holding_get AssetBalance", - "defined_out": [ - "box_prefixed_key%0#3", - "tmp%0#1", - "tmp%1#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%0#1", - "tmp%1#3" - ] - }, - "1476": { - "op": "bury 1", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%1#3" - ] - }, - "1478": { - "op": "bz pay_principal_bool_false@27", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ] - }, - "1481": { - "op": "dig 1", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "box_prefixed_key%0#3" - ] - }, - "1483": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%6#0", - "aggregate%box_get%7#0", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%box_get%6#0", - "aggregate%box_get%7#0" - ] - }, - "1484": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%box_get%6#0" - ] - }, - "1485": { - "op": "pushint 448", - "defined_out": [ - "448", - "aggregate%box_get%6#0", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%box_get%6#0", - "448" - ] - }, - "1488": { - "op": "getbit", - "defined_out": [ - "aggregate%get_bit%0#0", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%get_bit%0#0" - ] - }, - "1489": { - "op": "bnz pay_principal_bool_false@27", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ] - }, - "1492": { - "op": "intc_1 // 1", - "defined_out": [ - "and_result%0#0", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "and_result%0#0" - ] - }, - "1493": { - "block": "pay_principal_bool_merge@28", - "stack_in": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "and_result%0#0" - ], - "op": "bz pay_principal_else_body@3", - "defined_out": [], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ] - }, - "1496": { - "op": "global CurrentApplicationAddress", - "defined_out": [ - "tmp%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%0#3" - ] - }, - "1498": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "tmp%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%0#3", - "0" - ] - }, - "1499": { - "op": "bytec 13 // \"settlement_asset_id\"", - "defined_out": [ - "\"settlement_asset_id\"", - "0", - "tmp%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%0#3", - "0", - "\"settlement_asset_id\"" - ] - }, - "1501": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0", - "tmp%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%0#3", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1502": { - "error": "check self.settlement_asset_id exists", - "op": "assert // check self.settlement_asset_id exists", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%0#3", - "maybe_value%0#0" - ] - }, - "1503": { - "op": "swap", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "maybe_value%0#0", - "tmp%0#3" - ] - }, - "1504": { - "op": "dig 1", - "defined_out": [ - "maybe_value%0#0", - "maybe_value%0#0 (copy)", - "tmp%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "maybe_value%0#0", - "tmp%0#3", - "maybe_value%0#0 (copy)" - ] - }, - "1506": { - "op": "asset_holding_get AssetBalance", - "defined_out": [ - "check%0#0", - "maybe_value%0#0", - "value%0#1" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "maybe_value%0#0", - "value%0#1", - "check%0#0" - ] - }, - "1508": { - "error": "account opted into asset", - "op": "assert // account opted into asset", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "maybe_value%0#0", - "value%0#1" - ] - }, - "1509": { - "op": "dig 2", - "defined_out": [ - "maybe_value%0#0", - "payment_amount#0", - "value%0#1" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "maybe_value%0#0", - "value%0#1", - "payment_amount#0" - ] - }, - "1511": { - "op": "dup", - "defined_out": [ - "maybe_value%0#0", - "payment_amount#0", - "payment_amount#0 (copy)", - "value%0#1" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "maybe_value%0#0", - "value%0#1", - "payment_amount#0 (copy)", - "payment_amount#0 (copy)" - ] - }, - "1512": { - "op": "cover 2", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "maybe_value%0#0", - "payment_amount#0", - "value%0#1", - "payment_amount#0 (copy)" - ] - }, - "1514": { - "op": ">=", - "defined_out": [ - "maybe_value%0#0", - "payment_amount#0", - "tmp%1#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "maybe_value%0#0", - "payment_amount#0", - "tmp%1#3" - ] - }, - "1515": { - "error": "Not enough funds for the payment", - "op": "assert // Not enough funds for the payment", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "maybe_value%0#0", - "payment_amount#0" - ] - }, - "1516": { - "op": "dig 3", - "defined_out": [ - "box_prefixed_key%0#3", - "maybe_value%0#0", - "payment_amount#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "maybe_value%0#0", - "payment_amount#0", - "box_prefixed_key%0#3" - ] - }, - "1518": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%8#0", - "aggregate%box_get%9#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "payment_amount#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "maybe_value%0#0", - "payment_amount#0", - "aggregate%box_get%8#0", - "aggregate%box_get%9#0" - ] - }, - "1519": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "maybe_value%0#0", - "payment_amount#0", - "aggregate%box_get%8#0" - ] - }, - "1520": { - "op": "extract 0 32", - "defined_out": [ - "box_prefixed_key%0#3", - "maybe_value%0#0", - "payment_amount#0", - "receiver#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "maybe_value%0#0", - "payment_amount#0", - "receiver#0" - ] - }, - "1523": { - "op": "itxn_begin" - }, - "1524": { - "op": "global MinTxnFee", - "defined_out": [ - "box_prefixed_key%0#3", - "inner_txn_params%0%%param_Fee_idx_0#0", - "maybe_value%0#0", - "payment_amount#0", - "receiver#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "maybe_value%0#0", - "payment_amount#0", - "receiver#0", - "inner_txn_params%0%%param_Fee_idx_0#0" - ] - }, - "1526": { - "op": "uncover 2", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "maybe_value%0#0", - "receiver#0", - "inner_txn_params%0%%param_Fee_idx_0#0", - "payment_amount#0" - ] - }, - "1528": { - "op": "itxn_field AssetAmount", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "maybe_value%0#0", - "receiver#0", - "inner_txn_params%0%%param_Fee_idx_0#0" - ] - }, - "1530": { - "op": "swap", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "maybe_value%0#0", - "inner_txn_params%0%%param_Fee_idx_0#0", - "receiver#0" - ] - }, - "1531": { - "op": "itxn_field AssetReceiver", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "maybe_value%0#0", - "inner_txn_params%0%%param_Fee_idx_0#0" - ] - }, - "1533": { - "op": "swap", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "inner_txn_params%0%%param_Fee_idx_0#0", - "maybe_value%0#0" - ] - }, - "1534": { - "op": "itxn_field XferAsset", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "inner_txn_params%0%%param_Fee_idx_0#0" - ] - }, - "1536": { - "op": "pushint 4 // axfer", - "defined_out": [ - "axfer", - "box_prefixed_key%0#3", - "inner_txn_params%0%%param_Fee_idx_0#0", - "payment_amount#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "inner_txn_params%0%%param_Fee_idx_0#0", - "axfer" - ] - }, - "1538": { - "op": "itxn_field TypeEnum", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "inner_txn_params%0%%param_Fee_idx_0#0" - ] - }, - "1540": { - "op": "itxn_field Fee", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ] - }, - "1542": { - "op": "itxn_submit" - }, - "1543": { - "block": "pay_principal_after_if_else@4", - "stack_in": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "0" - ] - }, - "1544": { - "op": "bytec_3 // \"circulating_units\"", - "defined_out": [ - "\"circulating_units\"", - "0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "0", - "\"circulating_units\"" - ] - }, - "1545": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1546": { - "error": "check self.circulating_units exists", - "op": "assert // check self.circulating_units exists", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "maybe_value%0#0" - ] - }, - "1547": { - "op": "dig 2", - "defined_out": [ - "box_prefixed_key%0#3", - "maybe_value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "maybe_value%0#0", - "box_prefixed_key%0#3" - ] - }, - "1549": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)", - "maybe_value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "maybe_value%0#0", - "box_prefixed_key%0#3 (copy)", - "box_prefixed_key%0#3 (copy)" - ] - }, - "1550": { - "op": "cover 2", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "box_prefixed_key%0#3 (copy)" - ] - }, - "1552": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%10#0", - "aggregate%box_get%11#0", - "box_prefixed_key%0#3", - "maybe_value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "aggregate%box_get%10#0", - "aggregate%box_get%11#0" - ] - }, - "1553": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "aggregate%box_get%10#0" - ] - }, - "1554": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "aggregate%box_get%10#0", - "box_prefixed_key%0#3", - "maybe_value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "aggregate%box_get%10#0", - "32" - ] - }, - "1555": { - "op": "extract_uint64", - "defined_out": [ - "box_prefixed_key%0#3", - "maybe_value%0#0", - "values%0#1" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "values%0#1" - ] - }, - "1556": { - "op": "-", - "defined_out": [ - "box_prefixed_key%0#3", - "tmp%0#1" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "box_prefixed_key%0#3", - "tmp%0#1" - ] - }, - "1557": { - "op": "bytec_3 // \"circulating_units\"", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "box_prefixed_key%0#3", - "tmp%0#1", - "\"circulating_units\"" - ] - }, - "1558": { - "op": "swap", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "box_prefixed_key%0#3", - "\"circulating_units\"", - "tmp%0#1" - ] - }, - "1559": { - "op": "app_global_put", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "box_prefixed_key%0#3" - ] - }, - "1560": { - "op": "intc_0 // 0", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "box_prefixed_key%0#3", - "0" - ] - }, - "1561": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "box_prefixed_key%0#3", - "aggregate%val_as_bytes%0#0" - ] - }, - "1562": { - "op": "swap", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#3" - ] - }, - "1563": { - "op": "intc_2 // 32", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#3", - "32" - ] - }, - "1564": { - "op": "dig 2", - "defined_out": [ - "32", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%0#0 (copy)", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#3", - "32", - "aggregate%val_as_bytes%0#0 (copy)" - ] - }, - "1566": { - "op": "box_replace", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0" - ] - }, - "1567": { - "callsub": "modules.accounting.AccountingModule.end_if_no_circulating_units", - "op": "callsub end_if_no_circulating_units" - }, - "1570": { - "op": "global CurrentApplicationID", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%0#1" - ] - }, - "1572": { - "op": "global LatestTimestamp", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#3", - "tmp%0#1", - "tmp%1#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%0#1", - "tmp%1#2" - ] - }, - "1574": { - "op": "intc_0 // 0", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%0#1", - "tmp%1#2", - "0" - ] - }, - "1575": { - "op": "bytec 22 // \"denomination_asset_id\"", - "defined_out": [ - "\"denomination_asset_id\"", - "0", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#3", - "tmp%0#1", - "tmp%1#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%0#1", - "tmp%1#2", - "0", - "\"denomination_asset_id\"" - ] - }, - "1577": { - "op": "app_global_get_ex", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%0#1", - "tmp%1#2", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1578": { - "error": "check self.denomination_asset_id exists", - "op": "assert // check self.denomination_asset_id exists", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%0#1", - "tmp%1#2", - "maybe_value%0#0" - ] - }, - "1579": { - "op": "dup", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "maybe_value%0#0 (copy)", - "tmp%0#1", - "tmp%1#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%0#1", - "tmp%1#2", - "maybe_value%0#0", - "maybe_value%0#0 (copy)" - ] - }, - "1580": { - "op": "asset_params_get AssetUnitName", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#3", - "check%0#0", - "maybe_value%0#0", - "tmp%0#1", - "tmp%1#2", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%0#1", - "tmp%1#2", - "maybe_value%0#0", - "value%0#0", - "check%0#0" - ] - }, - "1582": { - "error": "asset exists", - "op": "assert // asset exists", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%0#1", - "tmp%1#2", - "maybe_value%0#0", - "value%0#0" - ] - }, - "1583": { - "op": "intc_0 // 0", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%0#1", - "tmp%1#2", - "maybe_value%0#0", - "value%0#0", - "0" - ] - }, - "1584": { - "op": "bytec_3 // \"circulating_units\"", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%0#1", - "tmp%1#2", - "maybe_value%0#0", - "value%0#0", - "0", - "\"circulating_units\"" - ] - }, - "1585": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#3", - "maybe_exists%2#0", - "maybe_value%0#0", - "maybe_value%2#0", - "tmp%0#1", - "tmp%1#2", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%0#1", - "tmp%1#2", - "maybe_value%0#0", - "value%0#0", - "maybe_value%2#0", - "maybe_exists%2#0" - ] - }, - "1586": { - "error": "check self.circulating_units exists", - "op": "assert // check self.circulating_units exists", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%0#1", - "tmp%1#2", - "maybe_value%0#0", - "value%0#0", - "maybe_value%2#0" - ] - }, - "1587": { - "op": "intc_0 // 0", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%0#1", - "tmp%1#2", - "maybe_value%0#0", - "value%0#0", - "maybe_value%2#0", - "0" - ] - }, - "1588": { - "op": "bytec 6 // \"unit_value\"", - "defined_out": [ - "\"unit_value\"", - "0", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "maybe_value%2#0", - "tmp%0#1", - "tmp%1#2", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%0#1", - "tmp%1#2", - "maybe_value%0#0", - "value%0#0", - "maybe_value%2#0", - "0", - "\"unit_value\"" - ] - }, - "1590": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#3", - "maybe_exists%3#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1", - "tmp%1#2", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%0#1", - "tmp%1#2", - "maybe_value%0#0", - "value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_exists%3#0" - ] - }, - "1591": { - "error": "check self.unit_value exists", - "op": "assert // check self.unit_value exists", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%0#1", - "tmp%1#2", - "maybe_value%0#0", - "value%0#0", - "maybe_value%2#0", - "maybe_value%3#0" - ] - }, - "1592": { - "op": "*", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "tmp%0#1", - "tmp%1#2", - "tmp%2#1", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%0#1", - "tmp%1#2", - "maybe_value%0#0", - "value%0#0", - "tmp%2#1" - ] - }, - "1593": { - "op": "uncover 4", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%1#2", - "maybe_value%0#0", - "value%0#0", - "tmp%2#1", - "tmp%0#1" - ] - }, - "1595": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "tmp%1#2", - "tmp%2#1", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%1#2", - "maybe_value%0#0", - "value%0#0", - "tmp%2#1", - "aggregate%val_as_bytes%1#0" - ] - }, - "1596": { - "op": "pushbytes 0x030037", - "defined_out": [ - "0x030037", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "tmp%1#2", - "tmp%2#1", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%1#2", - "maybe_value%0#0", - "value%0#0", - "tmp%2#1", - "aggregate%val_as_bytes%1#0", - "0x030037" - ] - }, - "1601": { - "op": "concat", - "defined_out": [ - "aggregate%head%2#0", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "tmp%1#2", - "tmp%2#1", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%1#2", - "maybe_value%0#0", - "value%0#0", - "tmp%2#1", - "aggregate%head%2#0" - ] - }, - "1602": { - "op": "uncover 4", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "maybe_value%0#0", - "value%0#0", - "tmp%2#1", - "aggregate%head%2#0", - "tmp%1#2" - ] - }, - "1604": { - "op": "itob", - "defined_out": [ - "aggregate%head%2#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%2#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "tmp%2#1", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "maybe_value%0#0", - "value%0#0", - "tmp%2#1", - "aggregate%head%2#0", - "aggregate%val_as_bytes%2#0" - ] - }, - "1605": { - "op": "concat", - "defined_out": [ - "aggregate%head%3#0", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "tmp%2#1", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "maybe_value%0#0", - "value%0#0", - "tmp%2#1", - "aggregate%head%3#0" - ] - }, - "1606": { - "op": "dig 5", - "defined_out": [ - "aggregate%head%3#0", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "payment_amount#0", - "tmp%2#1", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "maybe_value%0#0", - "value%0#0", - "tmp%2#1", - "aggregate%head%3#0", - "payment_amount#0" - ] - }, - "1608": { - "op": "itob", - "defined_out": [ - "aggregate%head%3#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "payment_amount#0", - "tmp%2#1", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "maybe_value%0#0", - "value%0#0", - "tmp%2#1", - "aggregate%head%3#0", - "aggregate%val_as_bytes%3#0" - ] - }, - "1609": { - "op": "swap", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "maybe_value%0#0", - "value%0#0", - "tmp%2#1", - "aggregate%val_as_bytes%3#0", - "aggregate%head%3#0" - ] - }, - "1610": { - "op": "dig 1", - "defined_out": [ - "aggregate%head%3#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "aggregate%val_as_bytes%3#0 (copy)", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "payment_amount#0", - "tmp%2#1", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "maybe_value%0#0", - "value%0#0", - "tmp%2#1", - "aggregate%val_as_bytes%3#0", - "aggregate%head%3#0", - "aggregate%val_as_bytes%3#0 (copy)" - ] - }, - "1612": { - "op": "concat", - "defined_out": [ - "aggregate%head%4#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "payment_amount#0", - "tmp%2#1", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "maybe_value%0#0", - "value%0#0", - "tmp%2#1", - "aggregate%val_as_bytes%3#0", - "aggregate%head%4#0" - ] - }, - "1613": { - "op": "uncover 4", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "value%0#0", - "tmp%2#1", - "aggregate%val_as_bytes%3#0", - "aggregate%head%4#0", - "maybe_value%0#0" - ] - }, - "1615": { - "op": "itob", - "defined_out": [ - "aggregate%head%4#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "aggregate%val_as_bytes%4#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%2#1", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "value%0#0", - "tmp%2#1", - "aggregate%val_as_bytes%3#0", - "aggregate%head%4#0", - "aggregate%val_as_bytes%4#0" - ] - }, - "1616": { - "op": "concat", - "defined_out": [ - "aggregate%head%5#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%2#1", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "value%0#0", - "tmp%2#1", - "aggregate%val_as_bytes%3#0", - "aggregate%head%5#0" - ] - }, - "1617": { - "op": "dig 3", - "defined_out": [ - "aggregate%head%5#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%2#1", - "value%0#0", - "value%0#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "value%0#0", - "tmp%2#1", - "aggregate%val_as_bytes%3#0", - "aggregate%head%5#0", - "value%0#0 (copy)" - ] - }, - "1619": { - "op": "len", - "defined_out": [ - "aggregate%head%5#0", - "aggregate%length%1#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%2#1", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "value%0#0", - "tmp%2#1", - "aggregate%val_as_bytes%3#0", - "aggregate%head%5#0", - "aggregate%length%1#0" - ] - }, - "1620": { - "op": "itob", - "defined_out": [ - "aggregate%as_bytes%2#0", - "aggregate%head%5#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%2#1", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "value%0#0", - "tmp%2#1", - "aggregate%val_as_bytes%3#0", - "aggregate%head%5#0", - "aggregate%as_bytes%2#0" - ] - }, - "1621": { - "op": "extract 6 2", - "defined_out": [ - "aggregate%head%5#0", - "aggregate%length_uint16%1#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%2#1", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "value%0#0", - "tmp%2#1", - "aggregate%val_as_bytes%3#0", - "aggregate%head%5#0", - "aggregate%length_uint16%1#0" - ] - }, - "1624": { - "op": "uncover 4", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%2#1", - "aggregate%val_as_bytes%3#0", - "aggregate%head%5#0", - "aggregate%length_uint16%1#0", - "value%0#0" - ] - }, - "1626": { - "op": "concat", - "defined_out": [ - "aggregate%encoded_value%1#0", - "aggregate%head%5#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%2#1" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%2#1", - "aggregate%val_as_bytes%3#0", - "aggregate%head%5#0", - "aggregate%encoded_value%1#0" - ] - }, - "1627": { - "op": "swap", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%2#1", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%5#0" - ] - }, - "1628": { - "op": "pushbytes 0x003b", - "defined_out": [ - "0x003b", - "aggregate%encoded_value%1#0", - "aggregate%head%5#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%2#1" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%2#1", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%5#0", - "0x003b" - ] - }, - "1632": { - "op": "concat", - "defined_out": [ - "aggregate%encoded_value%1#0", - "aggregate%head%6#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%2#1" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%2#1", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%6#0" - ] - }, - "1633": { - "op": "uncover 3", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%6#0", - "tmp%2#1" - ] - }, - "1635": { - "op": "itob", - "defined_out": [ - "aggregate%encoded_value%1#0", - "aggregate%head%6#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "aggregate%val_as_bytes%5#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%6#0", - "aggregate%val_as_bytes%5#0" - ] - }, - "1636": { - "op": "concat", - "defined_out": [ - "aggregate%encoded_value%1#0", - "aggregate%head%7#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%7#0" - ] - }, - "1637": { - "op": "bytec 30 // 0x0000", - "defined_out": [ - "0x0000", - "aggregate%encoded_value%1#0", - "aggregate%head%7#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%7#0", - "0x0000" - ] - }, - "1639": { - "op": "concat", - "defined_out": [ - "aggregate%encoded_value%1#0", - "aggregate%head%8#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%8#0" - ] - }, - "1640": { - "op": "uncover 3", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%8#0", - "aggregate%val_as_bytes%0#0" - ] - }, - "1642": { - "op": "concat", - "defined_out": [ - "aggregate%encoded_value%1#0", - "aggregate%head%9#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%9#0" - ] - }, - "1643": { - "op": "pushbytes 0x00025052", - "defined_out": [ - "0x00025052", - "aggregate%encoded_value%1#0", - "aggregate%head%9#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%9#0", - "0x00025052" - ] - }, - "1649": { - "op": "concat", - "defined_out": [ - "aggregate%concat%0#0", - "aggregate%encoded_value%1#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%concat%0#0" - ] - }, - "1650": { - "op": "swap", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%3#0", - "aggregate%concat%0#0", - "aggregate%encoded_value%1#0" - ] - }, - "1651": { - "op": "concat", - "defined_out": [ - "aggregate%concat%1#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%3#0", - "aggregate%concat%1#0" - ] - }, - "1652": { - "op": "pushbytes 0x8c29904e // method \"Event(uint64,uint8,string,uint64,uint64,uint64,byte[],uint64,uint16,uint64)\"", - "defined_out": [ - "Method(Event(uint64,uint8,string,uint64,uint64,uint64,byte[],uint64,uint16,uint64))", - "aggregate%concat%1#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%3#0", - "aggregate%concat%1#0", - "Method(Event(uint64,uint8,string,uint64,uint64,uint64,byte[],uint64,uint16,uint64))" - ] - }, - "1658": { - "op": "swap", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%3#0", - "Method(Event(uint64,uint8,string,uint64,uint64,uint64,byte[],uint64,uint16,uint64))", - "aggregate%concat%1#0" - ] - }, - "1659": { - "op": "concat", - "defined_out": [ - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "event%0#0", - "payment_amount#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%3#0", - "event%0#0" - ] - }, - "1660": { - "op": "log", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%3#0" - ] - }, - "1661": { - "op": "global LatestTimestamp", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%3#0", - "tmp%2#1" - ] - }, - "1663": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%3#0", - "aggregate%val_as_bytes%8#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%3#0", - "aggregate%val_as_bytes%8#0" - ] - }, - "1664": { - "op": "concat", - "defined_out": [ - "aggregate%head%11#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%head%11#0" - ] - }, - "1665": { - "op": "dig 3", - "defined_out": [ - "aggregate%head%11#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "payment_info#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%head%11#0", - "payment_info#0" - ] - }, - "1667": { - "op": "dup", - "defined_out": [ - "aggregate%head%11#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "payment_info#0", - "payment_info#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%head%11#0", - "payment_info#0", - "payment_info#0 (copy)" - ] - }, - "1668": { - "op": "len", - "defined_out": [ - "aggregate%head%11#0", - "aggregate%length%2#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "payment_info#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%head%11#0", - "payment_info#0", - "aggregate%length%2#0" - ] - }, - "1669": { - "op": "itob", - "defined_out": [ - "aggregate%as_bytes%4#0", - "aggregate%head%11#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "payment_info#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%head%11#0", - "payment_info#0", - "aggregate%as_bytes%4#0" - ] - }, - "1670": { - "op": "extract 6 2", - "defined_out": [ - "aggregate%head%11#0", - "aggregate%length_uint16%2#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "payment_info#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%head%11#0", - "payment_info#0", - "aggregate%length_uint16%2#0" - ] - }, - "1673": { - "op": "swap", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%head%11#0", - "aggregate%length_uint16%2#0", - "payment_info#0" - ] - }, - "1674": { - "op": "concat", - "defined_out": [ - "aggregate%encoded_value%2#0", - "aggregate%head%11#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "payment_info#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%head%11#0", - "aggregate%encoded_value%2#0" - ] - }, - "1675": { - "op": "swap", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%encoded_value%2#0", - "aggregate%head%11#0" - ] - }, - "1676": { - "op": "pushbytes 0x0012", - "defined_out": [ - "0x0012", - "aggregate%encoded_value%2#0", - "aggregate%head%11#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "payment_info#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%encoded_value%2#0", - "aggregate%head%11#0", - "0x0012" - ] - }, - "1680": { - "op": "concat", - "defined_out": [ - "aggregate%encoded_value%2#0", - "aggregate%head%12#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "payment_info#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%encoded_value%2#0", - "aggregate%head%12#0" - ] - }, - "1681": { - "op": "swap", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%head%12#0", - "aggregate%encoded_value%2#0" - ] - }, - "1682": { - "op": "concat", - "defined_out": [ - "aggregate%concat%2#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "payment_info#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%concat%2#0" - ] - }, - "1683": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%concat%2#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "payment_info#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%concat%2#0", - "0x151f7c75" - ] - }, - "1684": { - "op": "swap", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "0x151f7c75", - "aggregate%concat%2#0" - ] - }, - "1685": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#3", - "payment_amount#0", - "payment_info#0", - "tmp%5#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%5#0" - ] - }, - "1686": { - "op": "log", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ] - }, - "1687": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "box_prefixed_key%0#3", - "payment_amount#0", - "payment_info#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "1" - ] - }, - "1688": { - "op": "return", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ] - }, - "1689": { - "block": "pay_principal_else_body@3", - "stack_in": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "payment_amount#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "payment_amount#0" - ] - }, - "1690": { - "op": "bury 1", - "defined_out": [ - "payment_amount#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ] - }, - "1692": { - "op": "b pay_principal_after_if_else@4" - }, - "1695": { - "block": "pay_principal_bool_false@27", - "stack_in": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "and_result%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "and_result%0#0" - ] - }, - "1696": { - "op": "b pay_principal_bool_merge@28" - }, - "1699": { - "block": "pay_principal_bool_false@20", - "stack_in": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "or_result%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "or_result%0#0" - ] - }, - "1700": { - "op": "b pay_principal_bool_merge@21" - }, - "1703": { - "subroutine": "modules.transfer_agent.no_coupon.NoCouponTransferAgentMixin.asset_transfer[routing]", - "params": {}, - "block": "asset_transfer", - "stack_in": [], - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%extract%1#0" - ] - }, - "1704": { - "op": "dupn 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3" - ] - }, - "1706": { - "op": "pushbytes \"\"", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0" - ] - }, - "1708": { - "op": "dup", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0" - ] - }, - "1709": { - "op": "txna ApplicationArgs 1" - }, - "1712": { - "op": "dup", - "defined_out": [ - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "sender_holding_address#0" - ] - }, - "1713": { - "op": "len", - "defined_out": [ - "len%0#0", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "len%0#0" - ] - }, - "1714": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "len%0#0", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "len%0#0", - "32" - ] - }, - "1715": { - "op": "==", - "defined_out": [ - "eq%0#0", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "eq%0#0" - ] - }, - "1716": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0" - ] - }, - "1717": { - "op": "txna ApplicationArgs 2" - }, - "1720": { - "op": "dup", - "defined_out": [ - "receiver_holding_address#0", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "receiver_holding_address#0" - ] - }, - "1721": { - "op": "len", - "defined_out": [ - "len%1#0", - "receiver_holding_address#0", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "len%1#0" - ] - }, - "1722": { - "op": "intc_2 // 32", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "len%1#0", - "32" - ] - }, - "1723": { - "op": "==", - "defined_out": [ - "eq%1#0", - "receiver_holding_address#0", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "eq%1#0" - ] - }, - "1724": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0" - ] - }, - "1725": { - "op": "txna ApplicationArgs 3", - "defined_out": [ - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%4#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "tmp%4#0" - ] - }, - "1728": { - "op": "dup", - "defined_out": [ - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%4#0", - "tmp%4#0 (copy)" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "tmp%4#0", - "tmp%4#0 (copy)" - ] - }, - "1729": { - "op": "len", - "defined_out": [ - "len%2#0", - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%4#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "tmp%4#0", - "len%2#0" - ] - }, - "1730": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "len%2#0", - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%4#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "tmp%4#0", - "len%2#0", - "8" - ] - }, - "1731": { - "op": "==", - "defined_out": [ - "eq%2#0", - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%4#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "tmp%4#0", - "eq%2#0" - ] - }, - "1732": { - "error": "invalid number of bytes for arc4.uint64", - "op": "assert // invalid number of bytes for arc4.uint64", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "tmp%4#0" - ] - }, - "1733": { - "op": "btoi", - "defined_out": [ - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "1734": { - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "0" - ] - }, - "1735": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"", - "0", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "0", - "\"status\"" - ] - }, - "1736": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1737": { - "error": "check self.status exists", - "op": "assert // check self.status exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "maybe_value%0#0" - ] - }, - "1738": { - "op": "pushint 100", - "defined_out": [ - "100", - "maybe_value%0#0", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "maybe_value%0#0", - "100" - ] - }, - "1740": { - "op": "==", - "defined_out": [ - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%0#1", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%0#1" - ] - }, - "1741": { - "op": "bz asset_transfer_bool_false@6", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "1744": { - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "0" - ] - }, - "1745": { - "op": "bytec 16 // \"secondary_market_opening_date\"", - "defined_out": [ - "\"secondary_market_opening_date\"", - "0", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "0", - "\"secondary_market_opening_date\"" - ] - }, - "1747": { - "op": "app_global_get_ex", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1748": { - "error": "check self.secondary_market_opening_date exists", - "op": "assert // check self.secondary_market_opening_date exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "maybe_value%0#0" - ] - }, - "1749": { - "op": "global LatestTimestamp", - "defined_out": [ - "maybe_value%0#0", - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "maybe_value%0#0", - "tmp%1#1" - ] - }, - "1751": { - "op": "<=", - "defined_out": [ - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%2#2", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%2#2" - ] - }, - "1752": { - "op": "bz asset_transfer_bool_false@6", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "1755": { - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "0" - ] - }, - "1756": { - "op": "bytec 9 // \"secondary_market_closure_date\"", - "defined_out": [ - "\"secondary_market_closure_date\"", - "0", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "0", - "\"secondary_market_closure_date\"" - ] - }, - "1758": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%1#0", - "maybe_value%1#0", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "1759": { - "error": "check self.secondary_market_closure_date exists", - "op": "assert // check self.secondary_market_closure_date exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "maybe_value%1#0" - ] - }, - "1760": { - "op": "bz asset_transfer_bool_true@5", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "1763": { - "op": "global LatestTimestamp", - "defined_out": [ - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%4#1", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%4#1" - ] - }, - "1765": { - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%4#1", - "0" - ] - }, - "1766": { - "op": "bytec 9 // \"secondary_market_closure_date\"", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%4#1", - "0", - "\"secondary_market_closure_date\"" - ] - }, - "1768": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%2#0", - "maybe_value%2#0", - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%4#1", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%4#1", - "maybe_value%2#0", - "maybe_exists%2#0" - ] - }, - "1769": { - "error": "check self.secondary_market_closure_date exists", - "op": "assert // check self.secondary_market_closure_date exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%4#1", - "maybe_value%2#0" - ] - }, - "1770": { - "op": "<", - "defined_out": [ - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%5#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%5#0" - ] - }, - "1771": { - "op": "bz asset_transfer_bool_false@6", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "1774": { - "block": "asset_transfer_bool_true@5", - "stack_in": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ], - "op": "intc_1 // 1", - "defined_out": [ - "and_result%0#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "and_result%0#0" - ] - }, - "1775": { - "error": "Secondary market is closed", - "block": "asset_transfer_bool_merge@7", - "stack_in": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "and_result%0#0" - ], - "op": "assert // Secondary market is closed", - "defined_out": [], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "1776": { - "op": "txn Sender", - "defined_out": [ - "tmp%0#3" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%0#3" - ] - }, - "1778": { - "op": "dig 3", - "defined_out": [ - "sender_holding_address#0", - "tmp%0#3" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%0#3", - "sender_holding_address#0" - ] - }, - "1780": { - "op": "dup", - "defined_out": [ - "sender_holding_address#0", - "sender_holding_address#0 (copy)", - "tmp%0#3" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%0#3", - "sender_holding_address#0 (copy)", - "sender_holding_address#0 (copy)" - ] - }, - "1781": { - "op": "cover 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "tmp%0#3", - "sender_holding_address#0 (copy)" - ] - }, - "1783": { - "op": "==", - "defined_out": [ - "sender_holding_address#0", - "tmp%1#4" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "tmp%1#4" - ] - }, - "1784": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0" - ] - }, - "1785": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "op": "callsub assert_is_not_asset_defaulted" - }, - "1788": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_suspended", - "op": "callsub assert_is_not_asset_suspended" - }, - "1791": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "0x52333023" - ] - }, - "1792": { - "op": "dig 1", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "0x52333023", - "sender_holding_address#0 (copy)" - ] - }, - "1794": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#2", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2" - ] - }, - "1795": { - "op": "dup", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#2" - ] - }, - "1796": { - "op": "bury 9", - "defined_out": [ - "box_prefixed_key%0#2", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2" - ] - }, - "1798": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#2", - "box_prefixed_key%0#2 (copy)", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#2 (copy)" - ] - }, - "1799": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#2", - "maybe_exists%0#0", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "1800": { - "op": "bury 1", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "maybe_exists%0#0" - ] - }, - "1802": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2" - ] - }, - "1803": { - "op": "bytec_1 // 0x52333023", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "0x52333023" - ] - }, - "1804": { - "op": "dig 4", - "defined_out": [ - "0x52333023", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "0x52333023", - "receiver_holding_address#0" - ] - }, - "1806": { - "op": "dup", - "defined_out": [ - "0x52333023", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "receiver_holding_address#0 (copy)", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "0x52333023", - "receiver_holding_address#0 (copy)", - "receiver_holding_address#0 (copy)" - ] - }, - "1807": { - "op": "cover 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "0x52333023", - "receiver_holding_address#0 (copy)" - ] - }, - "1809": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "box_prefixed_key%0#3" - ] - }, - "1810": { - "op": "dup", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3" - ] - }, - "1811": { - "op": "bury 10", - "defined_out": [ - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "box_prefixed_key%0#3" - ] - }, - "1813": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)", - "receiver_holding_address#0", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)" - ] - }, - "1814": { - "op": "box_len", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "box_prefixed_key%0#3", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "1815": { - "op": "bury 1", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "box_prefixed_key%0#3", - "maybe_exists%0#0" - ] - }, - "1817": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "box_prefixed_key%0#3" - ] - }, - "1818": { - "op": "dig 3", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "box_prefixed_key%0#3", - "sender_holding_address#0 (copy)" - ] - }, - "1820": { - "callsub": "modules.accounting.AccountingModule.assert_is_not_account_suspended", - "op": "callsub assert_is_not_account_suspended", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "box_prefixed_key%0#3" - ] - }, - "1823": { - "op": "dig 1", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "box_prefixed_key%0#3", - "receiver_holding_address#0 (copy)" - ] - }, - "1825": { - "callsub": "modules.accounting.AccountingModule.assert_is_not_account_suspended", - "op": "callsub assert_is_not_account_suspended", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "box_prefixed_key%0#3" - ] - }, - "1828": { - "op": "uncover 3", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "box_prefixed_key%0#3", - "sender_holding_address#0" - ] - }, - "1830": { - "op": "uncover 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "sender_holding_address#0", - "receiver_holding_address#0" - ] - }, - "1832": { - "op": "!=", - "defined_out": [ - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%0#1" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "tmp%0#1" - ] - }, - "1833": { - "error": "Sender and receiver must be different", - "op": "assert // Sender and receiver must be different", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3" - ] - }, - "1834": { - "op": "dig 2", - "defined_out": [ - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "units#0" - ] - }, - "1836": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0", - "units#0 (copy)" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "units#0", - "units#0 (copy)" - ] - }, - "1837": { - "error": "Transfer units must be greater than zero", - "op": "assert // Transfer units must be greater than zero", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "units#0" - ] - }, - "1838": { - "op": "uncover 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "units#0", - "box_prefixed_key%0#2" - ] - }, - "1840": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "units#0", - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "1841": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "units#0", - "aggregate%box_get%0#0" - ] - }, - "1842": { - "op": "dup", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%0#0 (copy)", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "units#0", - "aggregate%box_get%0#0", - "aggregate%box_get%0#0 (copy)" - ] - }, - "1843": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "aggregate%box_get%0#0", - "aggregate%box_get%0#0 (copy)", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "units#0", - "aggregate%box_get%0#0", - "aggregate%box_get%0#0 (copy)", - "32" - ] - }, - "1844": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%box_get%0#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0", - "values%0#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "units#0", - "aggregate%box_get%0#0", - "values%0#0" - ] - }, - "1845": { - "op": "uncover 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "aggregate%box_get%0#0", - "values%0#0", - "units#0" - ] - }, - "1847": { - "op": ">=", - "defined_out": [ - "aggregate%box_get%0#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%2#2", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "aggregate%box_get%0#0", - "tmp%2#2" - ] - }, - "1848": { - "error": "Insufficient sender units to transfer", - "op": "assert // Insufficient sender units to transfer", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "aggregate%box_get%0#0" - ] - }, - "1849": { - "op": "extract 40 8", - "defined_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "aggregate%extract%1#0" - ] - }, - "1852": { - "op": "bury 9", - "defined_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3" - ] - }, - "1854": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%4#0", - "aggregate%box_get%5#0", - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%box_get%4#0", - "aggregate%box_get%5#0" - ] - }, - "1855": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%box_get%4#0" - ] - }, - "1856": { - "op": "intc_2 // 32", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%box_get%4#0", - "32" - ] - }, - "1857": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0", - "values%1#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%1#0" - ] - }, - "1858": { - "op": "bz asset_transfer_else_body@9", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "1861": { - "op": "dig 6", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2" - ] - }, - "1863": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%6#0", - "aggregate%box_get%7#0", - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%box_get%6#0", - "aggregate%box_get%7#0" - ] - }, - "1864": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%box_get%6#0" - ] - }, - "1865": { - "op": "pushint 40", - "defined_out": [ - "40", - "aggregate%box_get%6#0", - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%box_get%6#0", - "40" - ] - }, - "1867": { - "op": "extract_uint64", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%0#0" - ] - }, - "1868": { - "op": "dig 6", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%0#0", - "box_prefixed_key%0#3" - ] - }, - "1870": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%8#0", - "aggregate%box_get%9#0", - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0", - "values%0#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%0#0", - "aggregate%box_get%8#0", - "aggregate%box_get%9#0" - ] - }, - "1871": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%0#0", - "aggregate%box_get%8#0" - ] - }, - "1872": { - "op": "pushint 40", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%0#0", - "aggregate%box_get%8#0", - "40" - ] - }, - "1874": { - "op": "extract_uint64", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%0#0", - "values%1#0" - ] - }, - "1875": { - "op": "==", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%0#1" - ] - }, - "1876": { - "op": "bz asset_transfer_bool_false@20", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "1879": { - "op": "dig 6", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2" - ] - }, - "1881": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%10#0", - "aggregate%box_get%11#0", - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%box_get%10#0", - "aggregate%box_get%11#0" - ] - }, - "1882": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%box_get%10#0" - ] - }, - "1883": { - "op": "pushint 48", - "defined_out": [ - "48", - "aggregate%box_get%10#0", - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%box_get%10#0", - "48" - ] - }, - "1885": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0", - "values%2#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%2#0" - ] - }, - "1886": { - "op": "dig 6", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%2#0", - "box_prefixed_key%0#3" - ] - }, - "1888": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%12#0", - "aggregate%box_get%13#0", - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0", - "values%2#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%2#0", - "aggregate%box_get%12#0", - "aggregate%box_get%13#0" - ] - }, - "1889": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%2#0", - "aggregate%box_get%12#0" - ] - }, - "1890": { - "op": "pushint 48", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%2#0", - "aggregate%box_get%12#0", - "48" - ] - }, - "1892": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0", - "values%2#0", - "values%3#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%2#0", - "values%3#0" - ] - }, - "1893": { - "op": "==", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%1#4" - ] - }, - "1894": { - "op": "bz asset_transfer_bool_false@20", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "1897": { - "op": "intc_1 // 1", - "defined_out": [ - "aggregate%extract%1#0", - "and_result%0#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "and_result%0#0" - ] - }, - "1898": { - "error": "Sender and receiver units are not fungible", - "block": "asset_transfer_bool_merge@21", - "stack_in": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "and_result%0#0" - ], - "op": "assert // Sender and receiver units are not fungible", - "defined_out": [], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "1899": { - "block": "asset_transfer_after_if_else@10", - "stack_in": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ], - "op": "dig 6", - "defined_out": [ - "box_prefixed_key%0#2" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2" - ] - }, - "1901": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#2", - "box_prefixed_key%0#2 (copy)" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#2 (copy)" - ] - }, - "1902": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%16#0", - "aggregate%box_get%17#0", - "box_prefixed_key%0#2" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "aggregate%box_get%16#0", - "aggregate%box_get%17#0" - ] - }, - "1903": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "aggregate%box_get%16#0" - ] - }, - "1904": { - "op": "pushint 40", - "defined_out": [ - "40", - "aggregate%box_get%16#0", - "box_prefixed_key%0#2" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "aggregate%box_get%16#0", - "40" - ] - }, - "1906": { - "op": "extract_uint64", - "defined_out": [ - "box_prefixed_key%0#2", - "sender_unit_value#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "sender_unit_value#0" - ] - }, - "1907": { - "op": "bury 5", - "defined_out": [ - "box_prefixed_key%0#2", - "sender_unit_value#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2" - ] - }, - "1909": { - "op": "dig 3", - "defined_out": [ - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "sender_holding_address#0" - ] - }, - "1911": { - "op": "dig 2", - "defined_out": [ - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "units#0" - ] - }, - "1913": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0", - "units#0 (copy)" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "units#0 (copy)", - "units#0 (copy)" - ] - }, - "1914": { - "op": "cover 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "units#0", - "sender_holding_address#0", - "units#0 (copy)" - ] - }, - "1916": { - "callsub": "modules.core_financial.no_coupon.NoCouponCashflowMixin.accrued_interest_amount", - "op": "callsub accrued_interest_amount", - "defined_out": [ - "accrued_interest#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "units#0", - "accrued_interest#0" - ] - }, - "1919": { - "op": "bury 7", - "defined_out": [ - "accrued_interest#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "units#0" - ] - }, - "1921": { - "op": "dig 1", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "units#0", - "box_prefixed_key%0#2 (copy)" - ] - }, - "1923": { - "op": "box_get", - "defined_out": [ - "accrued_interest#0", - "aggregate%box_get%18#0", - "aggregate%box_get%19#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "units#0", - "aggregate%box_get%18#0", - "aggregate%box_get%19#0" - ] - }, - "1924": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "units#0", - "aggregate%box_get%18#0" - ] - }, - "1925": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "accrued_interest#0", - "aggregate%box_get%18#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "units#0", - "aggregate%box_get%18#0", - "32" - ] - }, - "1926": { - "op": "extract_uint64", - "defined_out": [ - "accrued_interest#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0", - "values%0#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "units#0", - "values%0#0" - ] - }, - "1927": { - "op": "dup2", - "defined_out": [ - "accrued_interest#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0", - "units#0 (copy)", - "values%0#0", - "values%0#0 (copy)" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "units#0", - "values%0#0", - "units#0 (copy)", - "values%0#0 (copy)" - ] - }, - "1928": { - "op": "<=", - "defined_out": [ - "accrued_interest#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "tmp%0#1", - "units#0", - "values%0#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "units#0", - "values%0#0", - "tmp%0#1" - ] - }, - "1929": { - "error": "Insufficient sender units to transfer", - "op": "assert // Insufficient sender units to transfer", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "units#0", - "values%0#0" - ] - }, - "1930": { - "op": "swap", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "values%0#0", - "units#0" - ] - }, - "1931": { - "op": "-", - "defined_out": [ - "accrued_interest#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "tmp%1#1" - ] - }, - "1932": { - "op": "itob", - "defined_out": [ - "accrued_interest#0", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "aggregate%val_as_bytes%0#0" - ] - }, - "1933": { - "op": "dig 1", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#2 (copy)" - ] - }, - "1935": { - "op": "intc_2 // 32", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#2 (copy)", - "32" - ] - }, - "1936": { - "op": "uncover 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#2 (copy)", - "32", - "aggregate%val_as_bytes%0#0" - ] - }, - "1938": { - "op": "box_replace", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2" - ] - }, - "1939": { - "op": "box_get", - "defined_out": [ - "accrued_interest#0", - "aggregate%box_get%22#0", - "aggregate%box_get%23#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%box_get%22#0", - "aggregate%box_get%23#0" - ] - }, - "1940": { - "op": "pop", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%box_get%22#0" - ] - }, - "1941": { - "op": "intc_2 // 32", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%box_get%22#0", - "32" - ] - }, - "1942": { - "op": "extract_uint64", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%0#0" - ] - }, - "1943": { - "op": "bnz asset_transfer_after_if_else@16", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "1946": { - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "0" - ] - }, - "1947": { - "op": "itob", - "defined_out": [ - "accrued_interest#0", - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%val_as_bytes%1#0" - ] - }, - "1948": { - "op": "dig 7", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#2" - ] - }, - "1950": { - "op": "dup", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#2 (copy)", - "box_prefixed_key%0#2 (copy)" - ] - }, - "1951": { - "op": "cover 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#2 (copy)" - ] - }, - "1953": { - "op": "pushint 40", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#2 (copy)", - "40" - ] - }, - "1955": { - "op": "dig 2", - "defined_out": [ - "40", - "accrued_interest#0", - "aggregate%val_as_bytes%1#0", - "aggregate%val_as_bytes%1#0 (copy)", - "box_prefixed_key%0#2", - "box_prefixed_key%0#2 (copy)", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#2 (copy)", - "40", - "aggregate%val_as_bytes%1#0 (copy)" - ] - }, - "1957": { - "op": "box_replace", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "aggregate%val_as_bytes%1#0" - ] - }, - "1958": { - "op": "pushint 48" - }, - "1960": { - "op": "swap", - "defined_out": [ - "48", - "accrued_interest#0", - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "48", - "aggregate%val_as_bytes%1#0" - ] - }, - "1961": { - "op": "box_replace", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "1962": { - "block": "asset_transfer_after_if_else@16", - "stack_in": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ], - "op": "dig 5", - "defined_out": [ - "box_prefixed_key%0#3" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3" - ] - }, - "1964": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)" - ] - }, - "1965": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%24#0", - "aggregate%box_get%25#0", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "aggregate%box_get%24#0", - "aggregate%box_get%25#0" - ] - }, - "1966": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "aggregate%box_get%24#0" - ] - }, - "1967": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "aggregate%box_get%24#0", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "aggregate%box_get%24#0", - "32" - ] - }, - "1968": { - "op": "extract_uint64", - "defined_out": [ - "box_prefixed_key%0#3", - "values%0#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "values%0#0" - ] - }, - "1969": { - "op": "dig 2", - "defined_out": [ - "box_prefixed_key%0#3", - "units#0", - "values%0#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "values%0#0", - "units#0" - ] - }, - "1971": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#3", - "units#0", - "units#0 (copy)", - "values%0#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "values%0#0", - "units#0 (copy)", - "units#0 (copy)" - ] - }, - "1972": { - "op": "cover 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "units#0", - "values%0#0", - "units#0 (copy)" - ] - }, - "1974": { - "op": "+", - "defined_out": [ - "box_prefixed_key%0#3", - "tmp%0#7", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "units#0", - "tmp%0#7" - ] - }, - "1975": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%2#0", - "box_prefixed_key%0#3", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "units#0", - "aggregate%val_as_bytes%2#0" - ] - }, - "1976": { - "op": "uncover 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "units#0", - "aggregate%val_as_bytes%2#0", - "box_prefixed_key%0#3" - ] - }, - "1978": { - "op": "intc_2 // 32", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "units#0", - "aggregate%val_as_bytes%2#0", - "box_prefixed_key%0#3", - "32" - ] - }, - "1979": { - "op": "uncover 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "units#0", - "box_prefixed_key%0#3", - "32", - "aggregate%val_as_bytes%2#0" - ] - }, - "1981": { - "op": "box_replace", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "units#0" - ] - }, - "1982": { - "op": "dig 4", - "defined_out": [ - "box_prefixed_key%0#3", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "units#0", - "sender_unit_value#0" - ] - }, - "1984": { - "op": "*", - "defined_out": [ - "box_prefixed_key%0#3", - "sender_unit_value#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%1#1" - ] - }, - "1985": { - "op": "dig 5", - "defined_out": [ - "accrued_interest#0", - "box_prefixed_key%0#3", - "sender_unit_value#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%1#1", - "accrued_interest#0" - ] - }, - "1987": { - "op": "+", - "defined_out": [ - "accrued_interest#0", - "box_prefixed_key%0#3", - "sender_unit_value#0", - "tmp%2#1", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%2#1" - ] - }, - "1988": { - "op": "itob", - "defined_out": [ - "accrued_interest#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%val_as_bytes%3#0" - ] - }, - "1989": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "accrued_interest#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%val_as_bytes%3#0", - "0x151f7c75" - ] - }, - "1990": { - "op": "swap", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "0x151f7c75", - "aggregate%val_as_bytes%3#0" - ] - }, - "1991": { - "op": "concat", - "defined_out": [ - "accrued_interest#0", - "box_prefixed_key%0#3", - "sender_unit_value#0", - "tmp%8#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%8#0" - ] - }, - "1992": { - "op": "log", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "1993": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "accrued_interest#0", - "box_prefixed_key%0#3", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "1" - ] - }, - "1994": { - "op": "return", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "1995": { - "block": "asset_transfer_bool_false@20", - "stack_in": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "and_result%0#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "and_result%0#0" - ] - }, - "1996": { - "op": "b asset_transfer_bool_merge@21" - }, - "1999": { - "block": "asset_transfer_else_body@9", - "stack_in": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ], - "op": "dig 5", - "defined_out": [ - "box_prefixed_key%0#3" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3" - ] - }, - "2001": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)" - ] - }, - "2002": { - "op": "pushint 40", - "defined_out": [ - "40", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)", - "40" - ] - }, - "2004": { - "op": "dig 10", - "defined_out": [ - "40", - "aggregate%extract%1#0", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)", - "40", - "aggregate%extract%1#0" - ] - }, - "2006": { - "op": "box_replace", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3" - ] - }, - "2007": { - "op": "dig 7", - "defined_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "box_prefixed_key%0#2" - ] - }, - "2009": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%14#0", - "aggregate%box_get%15#0", - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "aggregate%box_get%14#0", - "aggregate%box_get%15#0" - ] - }, - "2010": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "aggregate%box_get%14#0" - ] - }, - "2011": { - "op": "extract 48 8", - "defined_out": [ - "aggregate%extract%1#0", - "aggregate%extract%7#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "aggregate%extract%7#0" - ] - }, - "2014": { - "op": "pushint 48" - }, - "2016": { - "op": "swap", - "defined_out": [ - "48", - "aggregate%extract%1#0", - "aggregate%extract%7#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "48", - "aggregate%extract%7#0" - ] - }, - "2017": { - "op": "box_replace", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "2018": { - "op": "b asset_transfer_after_if_else@10" - }, - "2021": { - "block": "asset_transfer_bool_false@6", - "stack_in": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "and_result%0#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "and_result%0#0" - ] - }, - "2022": { - "op": "b asset_transfer_bool_merge@7" - }, - "2025": { - "subroutine": "modules.core_financial.common.CoreFinancialCommonMixin.asset_create[routing]", - "params": {}, - "block": "asset_create", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "arranger#0" - ], - "stack_out": [ - "arranger#0" - ] - }, - "2028": { - "op": "dup", - "defined_out": [ - "arranger#0", - "arranger#0 (copy)" - ], - "stack_out": [ - "arranger#0", - "arranger#0 (copy)" - ] - }, - "2029": { - "op": "len", - "defined_out": [ - "arranger#0", - "len%0#0" - ], - "stack_out": [ - "arranger#0", - "len%0#0" - ] - }, - "2030": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "arranger#0", - "len%0#0" - ], - "stack_out": [ - "arranger#0", - "len%0#0", - "32" - ] - }, - "2031": { - "op": "==", - "defined_out": [ - "arranger#0", - "eq%0#0" - ], - "stack_out": [ - "arranger#0", - "eq%0#0" - ] - }, - "2032": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "arranger#0" - ] - }, - "2033": { - "op": "txna ApplicationArgs 2", - "defined_out": [ - "arranger#0", - "metadata#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0" - ] - }, - "2036": { - "op": "dup", - "defined_out": [ - "arranger#0", - "metadata#0", - "metadata#0 (copy)" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "metadata#0 (copy)" - ] - }, - "2037": { - "op": "len", - "defined_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0" - ] - }, - "2038": { - "op": "dig 1", - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "metadata#0 (copy)" - ] - }, - "2040": { - "op": "pushint 38", - "defined_out": [ - "38", - "arranger#0", - "metadata#0", - "metadata#0 (copy)", - "tuple_len%0#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "metadata#0 (copy)", - "38" - ] - }, - "2042": { - "error": "invalid tuple encoding", - "op": "extract_uint16 // on error: invalid tuple encoding", - "defined_out": [ - "arranger#0", - "extract_uint16%0#0", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "extract_uint16%0#0" - ] - }, - "2043": { - "op": "dup", - "defined_out": [ - "arranger#0", - "extract_uint16%0#0", - "extract_uint16%0#0 (copy)", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "extract_uint16%0#0", - "extract_uint16%0#0 (copy)" - ] - }, - "2044": { - "op": "pushint 40", - "defined_out": [ - "40", - "arranger#0", - "extract_uint16%0#0", - "extract_uint16%0#0 (copy)", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "extract_uint16%0#0", - "extract_uint16%0#0 (copy)", - "40" - ] - }, - "2046": { - "op": "==", - "defined_out": [ - "arranger#0", - "eq%1#0", - "extract_uint16%0#0", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "extract_uint16%0#0", - "eq%1#0" - ] - }, - "2047": { - "error": "invalid tail pointer at index 7 of (uint8,uint8,uint8,uint8,uint8,uint8,uint8[32],(len+utf8[]))", - "op": "assert // invalid tail pointer at index 7 of (uint8,uint8,uint8,uint8,uint8,uint8,uint8[32],(len+utf8[]))", - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "extract_uint16%0#0" - ] - }, - "2048": { - "op": "dig 2", - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "extract_uint16%0#0", - "metadata#0 (copy)" - ] - }, - "2050": { - "op": "swap", - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "metadata#0 (copy)", - "extract_uint16%0#0" - ] - }, - "2051": { - "op": "dig 2", - "defined_out": [ - "arranger#0", - "extract_uint16%0#0", - "metadata#0", - "metadata#0 (copy)", - "tuple_len%0#0", - "tuple_len%0#0 (copy)" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "metadata#0 (copy)", - "extract_uint16%0#0", - "tuple_len%0#0 (copy)" - ] - }, - "2053": { - "op": "substring3", - "defined_out": [ - "arranger#0", - "metadata#0", - "substring3%0#0", - "tuple_len%0#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "substring3%0#0" - ] - }, - "2054": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "arranger#0", - "metadata#0", - "substring3%0#0", - "tuple_len%0#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "substring3%0#0", - "0" - ] - }, - "2055": { - "error": "invalid array length header", - "op": "extract_uint16 // on error: invalid array length header", - "defined_out": [ - "aggregate%array_length%0#0", - "arranger#0", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "aggregate%array_length%0#0" - ] - }, - "2056": { - "op": "pushint 42", - "defined_out": [ - "42", - "aggregate%array_length%0#0", - "arranger#0", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "aggregate%array_length%0#0", - "42" - ] - }, - "2058": { - "op": "+", - "defined_out": [ - "add%1#0", - "arranger#0", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "add%1#0" - ] - }, - "2059": { - "op": "==", - "defined_out": [ - "arranger#0", - "eq%2#0", - "metadata#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "eq%2#0" - ] - }, - "2060": { - "error": "invalid number of bytes for smart_contracts.abi_types.AssetMetadata", - "op": "assert // invalid number of bytes for smart_contracts.abi_types.AssetMetadata", - "stack_out": [ - "arranger#0", - "metadata#0" - ] - }, - "2061": { - "op": "bytec 5 // 0x52323023", - "defined_out": [ - "0x52323023", - "arranger#0", - "metadata#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "0x52323023" - ] - }, - "2063": { - "op": "uncover 2", - "stack_out": [ - "metadata#0", - "0x52323023", - "arranger#0" - ] - }, - "2065": { - "op": "app_global_put", - "stack_out": [ - "metadata#0" - ] - }, - "2066": { - "op": "bytec 23 // \"metadata\"", - "defined_out": [ - "\"metadata\"", - "metadata#0" - ], - "stack_out": [ - "metadata#0", - "\"metadata\"" - ] - }, - "2068": { - "op": "swap", - "stack_out": [ - "\"metadata\"", - "metadata#0" - ] - }, - "2069": { - "op": "app_global_put", - "stack_out": [] - }, - "2070": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "2071": { - "op": "return", - "stack_out": [] - }, - "2072": { - "subroutine": "modules.core_financial.common.CoreFinancialCommonMixin.asset_update[routing]", - "params": {}, - "block": "asset_update", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "metadata#0" - ], - "stack_out": [ - "metadata#0" - ] - }, - "2075": { - "op": "dup", - "defined_out": [ - "metadata#0", - "metadata#0 (copy)" - ], - "stack_out": [ - "metadata#0", - "metadata#0 (copy)" - ] - }, - "2076": { - "op": "len", - "defined_out": [ - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "metadata#0", - "tuple_len%0#0" - ] - }, - "2077": { - "op": "dig 1", - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "metadata#0 (copy)" - ] - }, - "2079": { - "op": "pushint 38", - "defined_out": [ - "38", - "metadata#0", - "metadata#0 (copy)", - "tuple_len%0#0" - ], - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "metadata#0 (copy)", - "38" - ] - }, - "2081": { - "error": "invalid tuple encoding", - "op": "extract_uint16 // on error: invalid tuple encoding", - "defined_out": [ - "extract_uint16%0#0", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "extract_uint16%0#0" - ] - }, - "2082": { - "op": "dup", - "defined_out": [ - "extract_uint16%0#0", - "extract_uint16%0#0 (copy)", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "extract_uint16%0#0", - "extract_uint16%0#0 (copy)" - ] - }, - "2083": { - "op": "pushint 40", - "defined_out": [ - "40", - "extract_uint16%0#0", - "extract_uint16%0#0 (copy)", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "extract_uint16%0#0", - "extract_uint16%0#0 (copy)", - "40" - ] - }, - "2085": { - "op": "==", - "defined_out": [ - "eq%0#0", - "extract_uint16%0#0", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "extract_uint16%0#0", - "eq%0#0" - ] - }, - "2086": { - "error": "invalid tail pointer at index 7 of (uint8,uint8,uint8,uint8,uint8,uint8,uint8[32],(len+utf8[]))", - "op": "assert // invalid tail pointer at index 7 of (uint8,uint8,uint8,uint8,uint8,uint8,uint8[32],(len+utf8[]))", - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "extract_uint16%0#0" - ] - }, - "2087": { - "op": "dig 2", - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "extract_uint16%0#0", - "metadata#0 (copy)" - ] - }, - "2089": { - "op": "swap", - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "metadata#0 (copy)", - "extract_uint16%0#0" - ] - }, - "2090": { - "op": "dig 2", - "defined_out": [ - "extract_uint16%0#0", - "metadata#0", - "metadata#0 (copy)", - "tuple_len%0#0", - "tuple_len%0#0 (copy)" - ], - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "metadata#0 (copy)", - "extract_uint16%0#0", - "tuple_len%0#0 (copy)" - ] - }, - "2092": { - "op": "substring3", - "defined_out": [ - "metadata#0", - "substring3%0#0", - "tuple_len%0#0" - ], - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "substring3%0#0" - ] - }, - "2093": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "metadata#0", - "substring3%0#0", - "tuple_len%0#0" - ], - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "substring3%0#0", - "0" - ] - }, - "2094": { - "error": "invalid array length header", - "op": "extract_uint16 // on error: invalid array length header", - "defined_out": [ - "aggregate%array_length%0#0", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "aggregate%array_length%0#0" - ] - }, - "2095": { - "op": "pushint 42", - "defined_out": [ - "42", - "aggregate%array_length%0#0", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "aggregate%array_length%0#0", - "42" - ] - }, - "2097": { - "op": "+", - "defined_out": [ - "add%1#0", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "add%1#0" - ] - }, - "2098": { - "op": "==", - "defined_out": [ - "eq%1#0", - "metadata#0" - ], - "stack_out": [ - "metadata#0", - "eq%1#0" - ] - }, - "2099": { - "error": "invalid number of bytes for smart_contracts.abi_types.AssetMetadata", - "op": "assert // invalid number of bytes for smart_contracts.abi_types.AssetMetadata", - "stack_out": [ - "metadata#0" - ] - }, - "2100": { - "callsub": "modules.rbac.RbacModule.assert_caller_is_arranger", - "op": "callsub assert_caller_is_arranger" - }, - "2103": { - "op": "bytec 23 // \"metadata\"", - "defined_out": [ - "\"metadata\"", - "metadata#0" - ], - "stack_out": [ - "metadata#0", - "\"metadata\"" - ] - }, - "2105": { - "op": "swap", - "stack_out": [ - "\"metadata\"", - "metadata#0" - ] - }, - "2106": { - "op": "app_global_put", - "stack_out": [] - }, - "2107": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "2108": { - "op": "return", - "stack_out": [] - }, - "2109": { - "subroutine": "modules.core_financial.common.CoreFinancialCommonMixin.set_secondary_time_events[routing]", - "params": {}, - "block": "set_secondary_time_events", - "stack_in": [], - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%array_trimmed%0#0" - ] - }, - "2110": { - "op": "txna ApplicationArgs 1" - }, - "2113": { - "op": "dupn 2", - "defined_out": [ - "secondary_market_time_events#0", - "secondary_market_time_events#0 (copy)" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0 (copy)" - ] - }, - "2115": { - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0 (copy)", - "0" - ] - }, - "2116": { - "error": "invalid array length header", - "op": "extract_uint16 // on error: invalid array length header", - "defined_out": [ - "aggregate%array_length%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0" - ] - }, - "2117": { - "op": "dup", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%0#0 (copy)", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "aggregate%array_length%0#0 (copy)" - ] - }, - "2118": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "aggregate%array_length%0#0", - "aggregate%array_length%0#0 (copy)", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "aggregate%array_length%0#0 (copy)", - "8" - ] - }, - "2119": { - "op": "*", - "defined_out": [ - "aggregate%array_length%0#0", - "mul%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "mul%0#0" - ] - }, - "2120": { - "op": "pushint 2", - "defined_out": [ - "2", - "aggregate%array_length%0#0", - "mul%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "mul%0#0", - "2" - ] - }, - "2122": { - "op": "+", - "defined_out": [ - "add%0#0", - "aggregate%array_length%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "add%0#0" - ] - }, - "2123": { - "op": "uncover 2", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "add%0#0", - "secondary_market_time_events#0" - ] - }, - "2125": { - "op": "len", - "defined_out": [ - "add%0#0", - "aggregate%array_length%0#0", - "len%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "add%0#0", - "len%0#0" - ] - }, - "2126": { - "op": "==", - "defined_out": [ - "aggregate%array_length%0#0", - "eq%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "eq%0#0" - ] - }, - "2127": { - "error": "invalid number of bytes for arc4.dynamic_array", - "op": "assert // invalid number of bytes for arc4.dynamic_array", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0" - ] - }, - "2128": { - "callsub": "modules.rbac.RbacModule.assert_caller_is_arranger", - "op": "callsub assert_caller_is_arranger" - }, - "2131": { - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "0" - ] - }, - "2132": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"", - "0", - "aggregate%array_length%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "0", - "\"status\"" - ] - }, - "2133": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%array_length%0#0", - "maybe_exists%0#0", - "maybe_value%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2134": { - "error": "check self.status exists", - "op": "assert // check self.status exists", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "maybe_value%0#0" - ] - }, - "2135": { - "op": "intc 4 // 200", - "defined_out": [ - "200", - "aggregate%array_length%0#0", - "maybe_value%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "maybe_value%0#0", - "200" - ] - }, - "2137": { - "op": "==", - "defined_out": [ - "aggregate%array_length%0#0", - "secondary_market_time_events#0", - "tmp%0#2" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "tmp%0#2" - ] - }, - "2138": { - "op": "!", - "defined_out": [ - "aggregate%array_length%0#0", - "secondary_market_time_events#0", - "tmp%1#1" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "tmp%1#1" - ] - }, - "2139": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0" - ] - }, - "2140": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "op": "callsub assert_is_not_asset_defaulted" - }, - "2143": { - "op": "dup", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "aggregate%array_length%0#0 (copy)" - ] - }, - "2144": { - "error": "Time events length is invalid", - "op": "assert // Time events length is invalid", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0" - ] - }, - "2145": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "aggregate%array_length%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "1" - ] - }, - "2146": { - "op": ">", - "defined_out": [ - "secondary_market_time_events#0", - "tmp%5#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "tmp%5#0" - ] - }, - "2147": { - "op": "bz set_secondary_time_events_after_if_else@3", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0" - ] - }, - "2150": { - "op": "dup", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0" - ] - }, - "2151": { - "callsub": "modules.core_financial.common.CoreFinancialCommonMixin.assert_time_events_sorted", - "op": "callsub assert_time_events_sorted" - }, - "2154": { - "op": "bury 1", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0" - ] - }, - "2156": { - "block": "set_secondary_time_events_after_if_else@3", - "stack_in": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "0" - ] - }, - "2157": { - "op": "bytec 8 // \"issuance_date\"", - "defined_out": [ - "\"issuance_date\"", - "0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "0", - "\"issuance_date\"" - ] - }, - "2159": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2160": { - "error": "check self.issuance_date exists", - "op": "assert // check self.issuance_date exists", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%0#0" - ] - }, - "2161": { - "op": "dig 1", - "defined_out": [ - "maybe_value%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%0#0", - "secondary_market_time_events#0" - ] - }, - "2163": { - "op": "dup", - "defined_out": [ - "maybe_value%0#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0 (copy)" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%0#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0 (copy)" - ] - }, - "2164": { - "op": "extract 2 0", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "maybe_value%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%0#0", - "secondary_market_time_events#0", - "aggregate%array_trimmed%0#0" - ] - }, - "2167": { - "op": "bury 4", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "maybe_value%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%0#0", - "secondary_market_time_events#0" - ] - }, - "2169": { - "op": "pushint 2", - "defined_out": [ - "2", - "aggregate%array_trimmed%0#0", - "maybe_value%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%0#0", - "secondary_market_time_events#0", - "2" - ] - }, - "2171": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "maybe_value%0#0", - "secondary_market_time_events#0", - "values%0#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%0#0", - "values%0#0" - ] - }, - "2172": { - "op": "swap", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "values%0#0", - "maybe_value%0#0" - ] - }, - "2173": { - "op": "dig 1", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "maybe_value%0#0", - "secondary_market_time_events#0", - "values%0#0", - "values%0#0 (copy)" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "values%0#0", - "maybe_value%0#0", - "values%0#0 (copy)" - ] - }, - "2175": { - "op": "<=", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "tmp%6#0", - "values%0#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "values%0#0", - "tmp%6#0" - ] - }, - "2176": { - "error": "Invalid secondary market opening date", - "op": "assert // Invalid secondary market opening date", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "values%0#0" - ] - }, - "2177": { - "op": "bytec 16 // \"secondary_market_opening_date\"", - "defined_out": [ - "\"secondary_market_opening_date\"", - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "values%0#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "values%0#0", - "\"secondary_market_opening_date\"" - ] - }, - "2179": { - "op": "swap", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "\"secondary_market_opening_date\"", - "values%0#0" - ] - }, - "2180": { - "op": "app_global_put", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0" - ] - }, - "2181": { - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "0" - ] - }, - "2182": { - "op": "bytec 4 // \"maturity_date\"", - "defined_out": [ - "\"maturity_date\"", - "0", - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "0", - "\"maturity_date\"" - ] - }, - "2184": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "maybe_exists%1#0", - "maybe_value%1#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "2185": { - "error": "check self.maturity_date exists", - "op": "assert // check self.maturity_date exists", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%1#0" - ] - }, - "2186": { - "op": "bz set_secondary_time_events_after_if_else@5", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0" - ] - }, - "2189": { - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "0" - ] - }, - "2190": { - "op": "bytec 4 // \"maturity_date\"", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "0", - "\"maturity_date\"" - ] - }, - "2192": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "maybe_exists%2#0", - "maybe_value%2#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%2#0", - "maybe_exists%2#0" - ] - }, - "2193": { - "error": "check self.maturity_date exists", - "op": "assert // check self.maturity_date exists", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%2#0" - ] - }, - "2194": { - "op": "dig 1", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%2#0", - "secondary_market_time_events#0" - ] - }, - "2196": { - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%2#0", - "secondary_market_time_events#0", - "0" - ] - }, - "2197": { - "error": "invalid array length header", - "op": "extract_uint16 // on error: invalid array length header", - "defined_out": [ - "aggregate%array_length%3#0", - "aggregate%array_trimmed%0#0", - "maybe_value%2#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%2#0", - "aggregate%array_length%3#0" - ] - }, - "2198": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "aggregate%array_length%3#0", - "aggregate%array_trimmed%0#0", - "maybe_value%2#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%2#0", - "aggregate%array_length%3#0", - "1" - ] - }, - "2199": { - "op": "-", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "maybe_value%2#0", - "secondary_market_time_events#0", - "tmp%9#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%2#0", - "tmp%9#0" - ] - }, - "2200": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "aggregate%array_trimmed%0#0", - "maybe_value%2#0", - "secondary_market_time_events#0", - "tmp%9#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%2#0", - "tmp%9#0", - "8" - ] - }, - "2201": { - "op": "*", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "aggregate%bytes_offset%1#0", - "maybe_value%2#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%2#0", - "aggregate%bytes_offset%1#0" - ] - }, - "2202": { - "op": "dig 3", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%2#0", - "aggregate%bytes_offset%1#0", - "aggregate%array_trimmed%0#0" - ] - }, - "2204": { - "op": "swap", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%2#0", - "aggregate%array_trimmed%0#0", - "aggregate%bytes_offset%1#0" - ] - }, - "2205": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "maybe_value%2#0", - "secondary_market_time_events#0", - "values%2#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%2#0", - "values%2#0" - ] - }, - "2206": { - "op": "swap", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "values%2#0", - "maybe_value%2#0" - ] - }, - "2207": { - "op": "dig 1", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "maybe_value%2#0", - "secondary_market_time_events#0", - "values%2#0", - "values%2#0 (copy)" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "values%2#0", - "maybe_value%2#0", - "values%2#0 (copy)" - ] - }, - "2209": { - "op": ">=", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "tmp%10#0", - "values%2#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "values%2#0", - "tmp%10#0" - ] - }, - "2210": { - "error": "Invalid secondary market closure date", - "op": "assert // Invalid secondary market closure date", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "values%2#0" - ] - }, - "2211": { - "op": "bytec 9 // \"secondary_market_closure_date\"", - "defined_out": [ - "\"secondary_market_closure_date\"", - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "values%2#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "values%2#0", - "\"secondary_market_closure_date\"" - ] - }, - "2213": { - "op": "swap", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "\"secondary_market_closure_date\"", - "values%2#0" - ] - }, - "2214": { - "op": "app_global_put", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0" - ] - }, - "2215": { - "block": "set_secondary_time_events_after_if_else@5", - "stack_in": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "0" - ] - }, - "2216": { - "op": "bytec 16 // \"secondary_market_opening_date\"", - "defined_out": [ - "\"secondary_market_opening_date\"", - "0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "0", - "\"secondary_market_opening_date\"" - ] - }, - "2218": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%3#0", - "maybe_value%3#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%3#0", - "maybe_exists%3#0" - ] - }, - "2219": { - "error": "check self.secondary_market_opening_date exists", - "op": "assert // check self.secondary_market_opening_date exists", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%3#0" - ] - }, - "2220": { - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%3#0", - "0" - ] - }, - "2221": { - "op": "bytec 9 // \"secondary_market_closure_date\"", - "defined_out": [ - "\"secondary_market_closure_date\"", - "0", - "maybe_value%3#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%3#0", - "0", - "\"secondary_market_closure_date\"" - ] - }, - "2223": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%4#0", - "maybe_value%3#0", - "maybe_value%4#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%3#0", - "maybe_value%4#0", - "maybe_exists%4#0" - ] - }, - "2224": { - "error": "check self.secondary_market_closure_date exists", - "op": "assert // check self.secondary_market_closure_date exists", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%3#0", - "maybe_value%4#0" - ] - }, - "2225": { - "op": "swap", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%4#0", - "maybe_value%3#0" - ] - }, - "2226": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "maybe_value%4#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%4#0", - "aggregate%val_as_bytes%0#0" - ] - }, - "2227": { - "op": "swap", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%val_as_bytes%0#0", - "maybe_value%4#0" - ] - }, - "2228": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0" - ] - }, - "2229": { - "op": "concat", - "defined_out": [ - "aggregate%head%1#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%head%1#0" - ] - }, - "2230": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%head%1#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%head%1#0", - "0x151f7c75" - ] - }, - "2231": { - "op": "swap", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "0x151f7c75", - "aggregate%head%1#0" - ] - }, - "2232": { - "op": "concat", - "defined_out": [ - "tmp%2#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "tmp%2#0" - ] - }, - "2233": { - "op": "log", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0" - ] - }, - "2234": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "1" - ] - }, - "2235": { - "op": "return", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0" - ] - }, - "2236": { - "subroutine": "modules.core_financial.common.CoreFinancialCommonMixin.set_default_status[routing]", - "params": {}, - "block": "set_default_status", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "2239": { - "op": "dup", - "defined_out": [ - "tmp%0#0", - "tmp%0#0 (copy)" - ], - "stack_out": [ - "tmp%0#0", - "tmp%0#0 (copy)" - ] - }, - "2240": { - "op": "len", - "defined_out": [ - "len%0#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "len%0#0" - ] - }, - "2241": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "len%0#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "len%0#0", - "1" - ] - }, - "2242": { - "op": "==", - "defined_out": [ - "eq%0#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "eq%0#0" - ] - }, - "2243": { - "error": "invalid number of bytes for arc4.bool", - "op": "assert // invalid number of bytes for arc4.bool", - "stack_out": [ - "tmp%0#0" - ] - }, - "2244": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "0" - ] - }, - "2245": { - "op": "getbit", - "defined_out": [ - "defaulted#0" - ], - "stack_out": [ - "defaulted#0" - ] - }, - "2246": { - "op": "bytec 17 // 0x52363023", - "defined_out": [ - "0x52363023", - "defaulted#0" - ], - "stack_out": [ - "defaulted#0", - "0x52363023" - ] - }, - "2248": { - "op": "txn Sender", - "defined_out": [ - "0x52363023", - "defaulted#0", - "tmp%0#2" - ], - "stack_out": [ - "defaulted#0", - "0x52363023", - "tmp%0#2" - ] - }, - "2250": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "defaulted#0", - "tmp%1#0" - ], - "stack_out": [ - "defaulted#0", - "tmp%1#0" - ] - }, - "2253": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "defaulted#0" - ] - }, - "2254": { - "op": "bytec 21 // \"asset_defaulted\"", - "defined_out": [ - "\"asset_defaulted\"", - "defaulted#0" - ], - "stack_out": [ - "defaulted#0", - "\"asset_defaulted\"" - ] - }, - "2256": { - "op": "swap", - "stack_out": [ - "\"asset_defaulted\"", - "defaulted#0" - ] - }, - "2257": { - "op": "app_global_put", - "stack_out": [] - }, - "2258": { - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1" - ] - }, - "2260": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0" - ] - }, - "2261": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0", - "0x151f7c75" - ] - }, - "2262": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ] - }, - "2263": { - "op": "concat", - "defined_out": [ - "tmp%4#0" - ], - "stack_out": [ - "tmp%4#0" - ] - }, - "2264": { - "op": "log", - "stack_out": [] - }, - "2265": { - "op": "intc_1 // 1", - "stack_out": [ - "1" - ] - }, - "2266": { - "op": "return", - "stack_out": [] - }, - "2267": { - "subroutine": "modules.core_financial.common.CoreFinancialCommonMixin.primary_distribution[routing]", - "params": {}, - "block": "primary_distribution", - "stack_in": [], - "op": "pushbytes \"\"", - "stack_out": [ - "awst_tmp%0#0" - ] - }, - "2269": { - "op": "txna ApplicationArgs 1" - }, - "2272": { - "op": "dup", - "defined_out": [ - "holding_address#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "holding_address#0" - ] - }, - "2273": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "len%0#0" - ] - }, - "2274": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "len%0#0", - "32" - ] - }, - "2275": { - "op": "==", - "defined_out": [ - "eq%0#0", - "holding_address#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "eq%0#0" - ] - }, - "2276": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0" - ] - }, - "2277": { - "op": "txna ApplicationArgs 2", - "defined_out": [ - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "tmp%2#0" - ] - }, - "2280": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ] - }, - "2281": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%1#0", - "tmp%2#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "tmp%2#0", - "len%1#0" - ] - }, - "2282": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "holding_address#0", - "len%1#0", - "tmp%2#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "tmp%2#0", - "len%1#0", - "8" - ] - }, - "2283": { - "op": "==", - "defined_out": [ - "eq%1#0", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "tmp%2#0", - "eq%1#0" - ] - }, - "2284": { - "error": "invalid number of bytes for arc4.uint64", - "op": "assert // invalid number of bytes for arc4.uint64", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "tmp%2#0" - ] - }, - "2285": { - "op": "btoi", - "defined_out": [ - "holding_address#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0" - ] - }, - "2286": { - "op": "intc_0 // 0", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "0" - ] - }, - "2287": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"", - "0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "0", - "\"status\"" - ] - }, - "2288": { - "op": "app_global_get_ex", - "defined_out": [ - "holding_address#0", - "maybe_exists%0#0", - "maybe_value%0#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2289": { - "error": "check self.status exists", - "op": "assert // check self.status exists", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "maybe_value%0#0" - ] - }, - "2290": { - "op": "pushint 100", - "defined_out": [ - "100", - "holding_address#0", - "maybe_value%0#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "maybe_value%0#0", - "100" - ] - }, - "2292": { - "op": "==", - "defined_out": [ - "holding_address#0", - "tmp%0#4", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%0#4" - ] - }, - "2293": { - "op": "bz primary_distribution_bool_false@5", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0" - ] - }, - "2296": { - "op": "intc_0 // 0", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "0" - ] - }, - "2297": { - "op": "bytec 7 // \"primary_distribution_opening_date\"", - "defined_out": [ - "\"primary_distribution_opening_date\"", - "0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "0", - "\"primary_distribution_opening_date\"" - ] - }, - "2299": { - "op": "app_global_get_ex", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2300": { - "error": "check self.primary_distribution_opening_date exists", - "op": "assert // check self.primary_distribution_opening_date exists", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "maybe_value%0#0" - ] - }, - "2301": { - "op": "global LatestTimestamp" - }, - "2303": { - "op": "dup", - "defined_out": [ - "awst_tmp%0#0", - "holding_address#0", - "maybe_value%0#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "maybe_value%0#0", - "awst_tmp%0#0", - "awst_tmp%0#0" - ] - }, - "2304": { - "op": "bury 5", - "defined_out": [ - "awst_tmp%0#0", - "holding_address#0", - "maybe_value%0#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "maybe_value%0#0", - "awst_tmp%0#0" - ] - }, - "2306": { - "op": "<=", - "defined_out": [ - "awst_tmp%0#0", - "holding_address#0", - "tmp%1#2", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%1#2" - ] - }, - "2307": { - "op": "bz primary_distribution_bool_false@5", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0" - ] - }, - "2310": { - "op": "intc_0 // 0", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "0" - ] - }, - "2311": { - "op": "bytec 24 // \"primary_distribution_closure_date\"", - "defined_out": [ - "\"primary_distribution_closure_date\"", - "0", - "awst_tmp%0#0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "0", - "\"primary_distribution_closure_date\"" - ] - }, - "2313": { - "op": "app_global_get_ex", - "defined_out": [ - "awst_tmp%0#0", - "holding_address#0", - "maybe_exists%1#0", - "maybe_value%1#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "2314": { - "error": "check self.primary_distribution_closure_date exists", - "op": "assert // check self.primary_distribution_closure_date exists", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "maybe_value%1#0" - ] - }, - "2315": { - "op": "dig 3", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "maybe_value%1#0", - "awst_tmp%0#0" - ] - }, - "2317": { - "op": ">", - "defined_out": [ - "awst_tmp%0#0", - "holding_address#0", - "tmp%2#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%2#1" - ] - }, - "2318": { - "op": "bz primary_distribution_bool_false@5", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0" - ] - }, - "2321": { - "op": "intc_1 // 1", - "defined_out": [ - "and_result%0#0", - "awst_tmp%0#0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "and_result%0#0" - ] - }, - "2322": { - "error": "Primary distribution is closed", - "block": "primary_distribution_bool_merge@6", - "stack_in": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "and_result%0#0" - ], - "op": "assert // Primary distribution is closed", - "defined_out": [], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0" - ] - }, - "2323": { - "op": "bytec 18 // 0x52353023", - "defined_out": [ - "0x52353023" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "0x52353023" - ] - }, - "2325": { - "op": "txn Sender", - "defined_out": [ - "0x52353023", - "tmp%0#3" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "0x52353023", - "tmp%0#3" - ] - }, - "2327": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "tmp%1#2" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%1#2" - ] - }, - "2330": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0" - ] - }, - "2331": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "0x52333023" - ] - }, - "2332": { - "op": "dig 2", - "defined_out": [ - "0x52333023", - "holding_address#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "0x52333023", - "holding_address#0" - ] - }, - "2334": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1" - ] - }, - "2335": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "holding_address#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "2336": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "holding_address#0", - "maybe_exists%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "2337": { - "op": "bury 1", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "2339": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1" - ] - }, - "2340": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "op": "callsub assert_is_not_asset_defaulted" - }, - "2343": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_suspended", - "op": "callsub assert_is_not_asset_suspended" - }, - "2346": { - "op": "dig 1", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0" - ] - }, - "2348": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "units#0", - "units#0 (copy)" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "units#0 (copy)" - ] - }, - "2349": { - "error": "Can not distribute zero units", - "op": "assert // Can not distribute zero units", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0" - ] - }, - "2350": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "box_prefixed_key%0#1", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "0" - ] - }, - "2351": { - "op": "bytec_3 // \"circulating_units\"", - "defined_out": [ - "\"circulating_units\"", - "0", - "box_prefixed_key%0#1", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "0", - "\"circulating_units\"" - ] - }, - "2352": { - "op": "app_global_get_ex", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "maybe_exists%0#0", - "maybe_value%0#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2353": { - "error": "check self.circulating_units exists", - "op": "assert // check self.circulating_units exists", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "maybe_value%0#0" - ] - }, - "2354": { - "op": "dig 1", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "maybe_value%0#0", - "units#0 (copy)" - ] - }, - "2356": { - "op": "+", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1" - ] - }, - "2357": { - "op": "intc_0 // 0", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "0" - ] - }, - "2358": { - "op": "bytec 12 // \"total_units\"", - "defined_out": [ - "\"total_units\"", - "0", - "box_prefixed_key%0#1", - "holding_address#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "0", - "\"total_units\"" - ] - }, - "2360": { - "op": "app_global_get_ex", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "maybe_exists%1#0", - "maybe_value%1#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "2361": { - "error": "check self.total_units exists", - "op": "assert // check self.total_units exists", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "maybe_value%1#0" - ] - }, - "2362": { - "op": "dig 1", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "maybe_value%1#0", - "tmp%1#1", - "tmp%1#1 (copy)", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "maybe_value%1#0", - "tmp%1#1 (copy)" - ] - }, - "2364": { - "op": ">=", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "tmp%1#1", - "tmp%2#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "tmp%2#1" - ] - }, - "2365": { - "error": "Insufficient remaining D-ASA units", - "op": "assert // Insufficient remaining D-ASA units", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1" - ] - }, - "2366": { - "op": "bytec_3 // \"circulating_units\"", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "\"circulating_units\"" - ] - }, - "2367": { - "op": "dig 1", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "\"circulating_units\"", - "tmp%1#1 (copy)" - ] - }, - "2369": { - "op": "app_global_put", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1" - ] - }, - "2370": { - "op": "dig 2", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "2372": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0", - "box_prefixed_key%0#1", - "holding_address#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "2373": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "aggregate%box_get%0#0" - ] - }, - "2374": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "aggregate%box_get%0#0", - "box_prefixed_key%0#1", - "holding_address#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "aggregate%box_get%0#0", - "32" - ] - }, - "2375": { - "op": "extract_uint64", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "tmp%1#1", - "units#0", - "values%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "values%0#0" - ] - }, - "2376": { - "op": "uncover 2", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "tmp%1#1", - "values%0#0", - "units#0" - ] - }, - "2378": { - "op": "+", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "tmp%1#1", - "tmp%4#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "tmp%1#1", - "tmp%4#1" - ] - }, - "2379": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#1", - "holding_address#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "tmp%1#1", - "aggregate%val_as_bytes%0#0" - ] - }, - "2380": { - "op": "dig 2", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "tmp%1#1", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#1 (copy)" - ] - }, - "2382": { - "op": "intc_2 // 32", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "tmp%1#1", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#1 (copy)", - "32" - ] - }, - "2383": { - "op": "uncover 2", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "tmp%1#1", - "box_prefixed_key%0#1 (copy)", - "32", - "aggregate%val_as_bytes%0#0" - ] - }, - "2385": { - "op": "box_replace", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "tmp%1#1" - ] - }, - "2386": { - "op": "intc_0 // 0", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "tmp%1#1", - "0" - ] - }, - "2387": { - "op": "bytec 6 // \"unit_value\"", - "defined_out": [ - "\"unit_value\"", - "0", - "box_prefixed_key%0#1", - "holding_address#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "tmp%1#1", - "0", - "\"unit_value\"" - ] - }, - "2389": { - "op": "app_global_get_ex", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "maybe_exists%3#0", - "maybe_value%3#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "tmp%1#1", - "maybe_value%3#0", - "maybe_exists%3#0" - ] - }, - "2390": { - "error": "check self.unit_value exists", - "op": "assert // check self.unit_value exists", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "tmp%1#1", - "maybe_value%3#0" - ] - }, - "2391": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#1", - "holding_address#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "tmp%1#1", - "aggregate%val_as_bytes%1#0" - ] - }, - "2392": { - "op": "uncover 2", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%1#1", - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#1" - ] - }, - "2394": { - "op": "pushint 40", - "defined_out": [ - "40", - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#1", - "holding_address#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%1#1", - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#1", - "40" - ] - }, - "2396": { - "op": "uncover 2", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%1#1", - "box_prefixed_key%0#1", - "40", - "aggregate%val_as_bytes%1#0" - ] - }, - "2398": { - "op": "box_replace", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%1#1" - ] - }, - "2399": { - "op": "intc_0 // 0", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%1#1", - "0" - ] - }, - "2400": { - "op": "bytec 12 // \"total_units\"", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%1#1", - "0", - "\"total_units\"" - ] - }, - "2402": { - "op": "app_global_get_ex", - "defined_out": [ - "holding_address#0", - "maybe_exists%4#0", - "maybe_value%4#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%1#1", - "maybe_value%4#0", - "maybe_exists%4#0" - ] - }, - "2403": { - "error": "check self.total_units exists", - "op": "assert // check self.total_units exists", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%1#1", - "maybe_value%4#0" - ] - }, - "2404": { - "op": "swap", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "maybe_value%4#0", - "tmp%1#1" - ] - }, - "2405": { - "op": "-", - "defined_out": [ - "holding_address#0", - "tmp%5#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%5#1" - ] - }, - "2406": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%2#0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "aggregate%val_as_bytes%2#0" - ] - }, - "2407": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%2#0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "aggregate%val_as_bytes%2#0", - "0x151f7c75" - ] - }, - "2408": { - "op": "swap", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "0x151f7c75", - "aggregate%val_as_bytes%2#0" - ] - }, - "2409": { - "op": "concat", - "defined_out": [ - "holding_address#0", - "tmp%6#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%6#0" - ] - }, - "2410": { - "op": "log", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0" - ] - }, - "2411": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "1" - ] - }, - "2412": { - "op": "return", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0" - ] - }, - "2413": { - "block": "primary_distribution_bool_false@5", - "stack_in": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "and_result%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "and_result%0#0" - ] - }, - "2414": { - "op": "b primary_distribution_bool_merge@6" - }, - "2417": { - "subroutine": "modules.core_financial.common.CoreFinancialCommonMixin.get_asset_info[routing]", - "params": {}, - "block": "get_asset_info", - "stack_in": [], - "op": "intc_0 // 0" - }, - "2418": { - "op": "global LatestTimestamp" - }, - "2420": { - "op": "intc_0 // 0" - }, - "2421": { - "op": "bytec 4 // \"maturity_date\"", - "defined_out": [ - "\"maturity_date\"", - "0", - "performance#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "tmp%0#1", - "0", - "\"maturity_date\"" - ] - }, - "2423": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0", - "performance#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "tmp%0#1", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2424": { - "op": "swap", - "stack_out": [ - "performance#0", - "tmp%0#1", - "maybe_exists%0#0", - "maybe_value%0#0" - ] - }, - "2425": { - "op": "dup", - "stack_out": [ - "performance#0", - "tmp%0#1", - "maybe_exists%0#0", - "maybe_value%0#0", - "maybe_value%0#0 (copy)" - ] - }, - "2426": { - "op": "cover 2", - "stack_out": [ - "performance#0", - "tmp%0#1", - "maybe_value%0#0", - "maybe_exists%0#0", - "maybe_value%0#0" - ] - }, - "2428": { - "op": "cover 3", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0", - "performance#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "tmp%0#1", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2430": { - "error": "check self.maturity_date exists", - "op": "assert // check self.maturity_date exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "tmp%0#1", - "maybe_value%0#0" - ] - }, - "2431": { - "op": ">", - "defined_out": [ - "maybe_value%0#0", - "performance#0", - "tmp%1#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "tmp%1#1" - ] - }, - "2432": { - "op": "bz get_asset_info_after_if_else@4", - "stack_out": [ - "performance#0", - "maybe_value%0#0" - ] - }, - "2435": { - "op": "dup", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0" - ] - }, - "2436": { - "op": "bz get_asset_info_after_if_else@4", - "stack_out": [ - "performance#0", - "maybe_value%0#0" - ] - }, - "2439": { - "op": "pushint 4", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#0" - ] - }, - "2441": { - "op": "bury 2", - "stack_out": [ - "performance#0", - "maybe_value%0#0" - ] - }, - "2443": { - "block": "get_asset_info_after_if_else@4", - "stack_in": [ - "performance#0", - "maybe_value%0#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "0" - ] - }, - "2444": { - "op": "bytec 21 // \"asset_defaulted\"", - "defined_out": [ - "\"asset_defaulted\"", - "0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "0", - "\"asset_defaulted\"" - ] - }, - "2446": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%1#0", - "maybe_value%1#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "2447": { - "error": "check self.asset_defaulted exists", - "op": "assert // check self.asset_defaulted exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%1#0" - ] - }, - "2448": { - "op": "bz get_asset_info_after_if_else@6", - "stack_out": [ - "performance#0", - "maybe_value%0#0" - ] - }, - "2451": { - "op": "pushint 3", - "defined_out": [ - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#0" - ] - }, - "2453": { - "op": "bury 2", - "defined_out": [ - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0" - ] - }, - "2455": { - "block": "get_asset_info_after_if_else@6", - "stack_in": [ - "performance#0", - "maybe_value%0#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "0" - ] - }, - "2456": { - "op": "bytec 22 // \"denomination_asset_id\"", - "defined_out": [ - "\"denomination_asset_id\"", - "0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "0", - "\"denomination_asset_id\"" - ] - }, - "2458": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%2#0", - "maybe_value%2#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_exists%2#0" - ] - }, - "2459": { - "error": "check self.denomination_asset_id exists", - "op": "assert // check self.denomination_asset_id exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0" - ] - }, - "2460": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "0" - ] - }, - "2461": { - "op": "bytec 13 // \"settlement_asset_id\"", - "defined_out": [ - "\"settlement_asset_id\"", - "0", - "maybe_value%2#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "0", - "\"settlement_asset_id\"" - ] - }, - "2463": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%3#0", - "maybe_value%2#0", - "maybe_value%3#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_exists%3#0" - ] - }, - "2464": { - "error": "check self.settlement_asset_id exists", - "op": "assert // check self.settlement_asset_id exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0" - ] - }, - "2465": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "0" - ] - }, - "2466": { - "op": "bytec_3 // \"circulating_units\"", - "defined_out": [ - "\"circulating_units\"", - "0", - "maybe_value%2#0", - "maybe_value%3#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "0", - "\"circulating_units\"" - ] - }, - "2467": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2468": { - "error": "check self.circulating_units exists", - "op": "assert // check self.circulating_units exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0" - ] - }, - "2469": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "0" - ] - }, - "2470": { - "op": "bytec 6 // \"unit_value\"", - "defined_out": [ - "\"unit_value\"", - "0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "0", - "\"unit_value\"" - ] - }, - "2472": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%1#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "2473": { - "error": "check self.unit_value exists", - "op": "assert // check self.unit_value exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0" - ] - }, - "2474": { - "op": "dup2", - "defined_out": [ - "maybe_value%0#0", - "maybe_value%0#0 (copy)", - "maybe_value%1#0", - "maybe_value%1#0 (copy)", - "maybe_value%2#0", - "maybe_value%3#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%0#0 (copy)", - "maybe_value%1#0 (copy)" - ] - }, - "2475": { - "op": "*", - "defined_out": [ - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1" - ] - }, - "2476": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "0" - ] - }, - "2477": { - "op": "bytec 14 // \"day_count_convention\"", - "defined_out": [ - "\"day_count_convention\"", - "0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "0", - "\"day_count_convention\"" - ] - }, - "2479": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%5#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%5#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "maybe_value%5#0", - "maybe_exists%5#0" - ] - }, - "2480": { - "error": "check self.day_count_convention exists", - "op": "assert // check self.day_count_convention exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "maybe_value%5#0" - ] - }, - "2481": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%val_as_bytes%0#0" - ] - }, - "2482": { - "op": "dup", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%0#0 (copy)", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%0#0 (copy)" - ] - }, - "2483": { - "op": "bitlen", - "defined_out": [ - "aggregate%bitlen%0#0", - "aggregate%val_as_bytes%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%val_as_bytes%0#0", - "aggregate%bitlen%0#0" - ] - }, - "2484": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "aggregate%bitlen%0#0", - "aggregate%val_as_bytes%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%val_as_bytes%0#0", - "aggregate%bitlen%0#0", - "8" - ] - }, - "2485": { - "op": "<=", - "defined_out": [ - "aggregate%no_overflow%0#0", - "aggregate%val_as_bytes%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%val_as_bytes%0#0", - "aggregate%no_overflow%0#0" - ] - }, - "2486": { - "error": "overflow", - "op": "assert // overflow", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%val_as_bytes%0#0" - ] - }, - "2487": { - "op": "extract 7 1", - "defined_out": [ - "aggregate%uint8%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0" - ] - }, - "2490": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "0" - ] - }, - "2491": { - "op": "bytec 15 // \"principal_discount\"", - "defined_out": [ - "\"principal_discount\"", - "0", - "aggregate%uint8%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "0", - "\"principal_discount\"" - ] - }, - "2493": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%uint8%0#0", - "maybe_exists%6#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%6#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "maybe_value%6#0", - "maybe_exists%6#0" - ] - }, - "2494": { - "error": "check self.principal_discount exists", - "op": "assert // check self.principal_discount exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "maybe_value%6#0" - ] - }, - "2495": { - "op": "itob", - "defined_out": [ - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%1#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%1#0" - ] - }, - "2496": { - "op": "dup", - "defined_out": [ - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%1#0", - "aggregate%val_as_bytes%1#0 (copy)", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%1#0", - "aggregate%val_as_bytes%1#0 (copy)" - ] - }, - "2497": { - "op": "bitlen", - "defined_out": [ - "aggregate%bitlen%1#0", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%1#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%1#0", - "aggregate%bitlen%1#0" - ] - }, - "2498": { - "op": "pushint 16", - "defined_out": [ - "16", - "aggregate%bitlen%1#0", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%1#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%1#0", - "aggregate%bitlen%1#0", - "16" - ] - }, - "2500": { - "op": "<=", - "defined_out": [ - "aggregate%no_overflow%1#0", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%1#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%1#0", - "aggregate%no_overflow%1#0" - ] - }, - "2501": { - "error": "overflow", - "op": "assert // overflow", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%1#0" - ] - }, - "2502": { - "op": "extract 6 2", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint8%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0" - ] - }, - "2505": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "0" - ] - }, - "2506": { - "op": "bytec 26 // \"interest_rate\"", - "defined_out": [ - "\"interest_rate\"", - "0", - "aggregate%uint16%0#0", - "aggregate%uint8%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "0", - "\"interest_rate\"" - ] - }, - "2508": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint8%0#0", - "maybe_exists%7#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%7#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "maybe_value%7#0", - "maybe_exists%7#0" - ] - }, - "2509": { - "error": "check self.interest_rate exists", - "op": "assert // check self.interest_rate exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "maybe_value%7#0" - ] - }, - "2510": { - "op": "itob", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%2#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%val_as_bytes%2#0" - ] - }, - "2511": { - "op": "dup", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%2#0", - "aggregate%val_as_bytes%2#0 (copy)", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%val_as_bytes%2#0", - "aggregate%val_as_bytes%2#0 (copy)" - ] - }, - "2512": { - "op": "bitlen", - "defined_out": [ - "aggregate%bitlen%2#0", - "aggregate%uint16%0#0", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%2#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%val_as_bytes%2#0", - "aggregate%bitlen%2#0" - ] - }, - "2513": { - "op": "pushint 16", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%val_as_bytes%2#0", - "aggregate%bitlen%2#0", - "16" - ] - }, - "2515": { - "op": "<=", - "defined_out": [ - "aggregate%no_overflow%2#0", - "aggregate%uint16%0#0", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%2#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%val_as_bytes%2#0", - "aggregate%no_overflow%2#0" - ] - }, - "2516": { - "error": "overflow", - "op": "assert // overflow", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%val_as_bytes%2#0" - ] - }, - "2517": { - "op": "extract 6 2", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0" - ] - }, - "2520": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "0" - ] - }, - "2521": { - "op": "bytec 12 // \"total_units\"", - "defined_out": [ - "\"total_units\"", - "0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "0", - "\"total_units\"" - ] - }, - "2523": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_exists%8#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_exists%8#0" - ] - }, - "2524": { - "error": "check self.total_units exists", - "op": "assert // check self.total_units exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0" - ] - }, - "2525": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "0" - ] - }, - "2526": { - "op": "bytec 7 // \"primary_distribution_opening_date\"", - "defined_out": [ - "\"primary_distribution_opening_date\"", - "0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "0", - "\"primary_distribution_opening_date\"" - ] - }, - "2528": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_exists%10#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_exists%10#0" - ] - }, - "2529": { - "error": "check self.primary_distribution_opening_date exists", - "op": "assert // check self.primary_distribution_opening_date exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0" - ] - }, - "2530": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "0" - ] - }, - "2531": { - "op": "bytec 24 // \"primary_distribution_closure_date\"", - "defined_out": [ - "\"primary_distribution_closure_date\"", - "0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "0", - "\"primary_distribution_closure_date\"" - ] - }, - "2533": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_exists%11#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_exists%11#0" - ] - }, - "2534": { - "error": "check self.primary_distribution_closure_date exists", - "op": "assert // check self.primary_distribution_closure_date exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0" - ] - }, - "2535": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "0" - ] - }, - "2536": { - "op": "bytec 8 // \"issuance_date\"", - "defined_out": [ - "\"issuance_date\"", - "0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "0", - "\"issuance_date\"" - ] - }, - "2538": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_exists%12#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_exists%12#0" - ] - }, - "2539": { - "error": "check self.issuance_date exists", - "op": "assert // check self.issuance_date exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0" - ] - }, - "2540": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "0" - ] - }, - "2541": { - "op": "bytec 4 // \"maturity_date\"", - "defined_out": [ - "\"maturity_date\"", - "0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "0", - "\"maturity_date\"" - ] - }, - "2543": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_exists%13#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_exists%13#0" - ] - }, - "2544": { - "error": "check self.maturity_date exists", - "op": "assert // check self.maturity_date exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0" - ] - }, - "2545": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "0" - ] - }, - "2546": { - "op": "bytec 20 // \"asset_suspended\"", - "defined_out": [ - "\"asset_suspended\"", - "0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "0", - "\"asset_suspended\"" - ] - }, - "2548": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_exists%14#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_exists%14#0" - ] - }, - "2549": { - "error": "check self.asset_suspended exists", - "op": "assert // check self.asset_suspended exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0" - ] - }, - "2550": { - "op": "dig 15", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "performance#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "performance#0" - ] - }, - "2552": { - "op": "itob", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "performance#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%val_as_bytes%3#0" - ] - }, - "2553": { - "op": "dup", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%3#0", - "aggregate%val_as_bytes%3#0 (copy)", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "performance#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%val_as_bytes%3#0", - "aggregate%val_as_bytes%3#0 (copy)" - ] - }, - "2554": { - "op": "bitlen", - "defined_out": [ - "aggregate%bitlen%3#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "performance#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%val_as_bytes%3#0", - "aggregate%bitlen%3#0" - ] - }, - "2555": { - "op": "intc_3 // 8", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%val_as_bytes%3#0", - "aggregate%bitlen%3#0", - "8" - ] - }, - "2556": { - "op": "<=", - "defined_out": [ - "aggregate%no_overflow%3#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "performance#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%val_as_bytes%3#0", - "aggregate%no_overflow%3#0" - ] - }, - "2557": { - "error": "overflow", - "op": "assert // overflow", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%val_as_bytes%3#0" - ] - }, - "2558": { - "op": "extract 7 1", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "performance#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0" - ] - }, - "2561": { - "op": "uncover 14", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "maybe_value%2#0" - ] - }, - "2563": { - "op": "itob", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%4#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%3#0", - "maybe_value%8#0", - "performance#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%4#0" - ] - }, - "2564": { - "op": "uncover 14", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%4#0", - "maybe_value%3#0" - ] - }, - "2566": { - "op": "itob", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%4#0", - "aggregate%val_as_bytes%5#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%8#0", - "performance#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%4#0", - "aggregate%val_as_bytes%5#0" - ] - }, - "2567": { - "op": "concat", - "defined_out": [ - "aggregate%head%1#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%8#0", - "performance#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%1#0" - ] - }, - "2568": { - "op": "uncover 11", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%1#0", - "tmp%0#1" - ] - }, - "2570": { - "op": "itob", - "defined_out": [ - "aggregate%head%1#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%6#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%8#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%1#0", - "aggregate%val_as_bytes%6#0" - ] - }, - "2571": { - "op": "concat", - "defined_out": [ - "aggregate%head%2#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%8#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%2#0" - ] - }, - "2572": { - "op": "uncover 11", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%2#0", - "maybe_value%1#0" - ] - }, - "2574": { - "op": "itob", - "defined_out": [ - "aggregate%head%2#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%7#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%8#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%2#0", - "aggregate%val_as_bytes%7#0" - ] - }, - "2575": { - "op": "concat", - "defined_out": [ - "aggregate%head%3#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%8#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%3#0" - ] - }, - "2576": { - "op": "uncover 10", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%3#0", - "aggregate%uint8%0#0" - ] - }, - "2578": { - "op": "concat", - "defined_out": [ - "aggregate%head%4#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%8#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%4#0" - ] - }, - "2579": { - "op": "uncover 9", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%4#0", - "aggregate%uint16%0#0" - ] - }, - "2581": { - "op": "concat", - "defined_out": [ - "aggregate%head%5#0", - "aggregate%uint16%1#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%8#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%5#0" - ] - }, - "2582": { - "op": "uncover 8", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%5#0", - "aggregate%uint16%1#0" - ] - }, - "2584": { - "op": "concat", - "defined_out": [ - "aggregate%head%6#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%8#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%6#0" - ] - }, - "2585": { - "op": "uncover 7", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%6#0", - "maybe_value%8#0" - ] - }, - "2587": { - "op": "itob", - "defined_out": [ - "aggregate%head%6#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%8#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%6#0", - "aggregate%val_as_bytes%8#0" - ] - }, - "2588": { - "op": "concat", - "defined_out": [ - "aggregate%head%7#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%7#0" - ] - }, - "2589": { - "op": "uncover 7", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%7#0", - "maybe_value%0#0" - ] - }, - "2591": { - "op": "itob", - "defined_out": [ - "aggregate%head%7#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%9#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%7#0", - "aggregate%val_as_bytes%9#0" - ] - }, - "2592": { - "op": "concat", - "defined_out": [ - "aggregate%head%8#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%8#0" - ] - }, - "2593": { - "op": "uncover 6", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%8#0", - "maybe_value%10#0" - ] - }, - "2595": { - "op": "itob", - "defined_out": [ - "aggregate%head%8#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%10#0", - "maybe_value%0#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%8#0", - "aggregate%val_as_bytes%10#0" - ] - }, - "2596": { - "op": "concat", - "defined_out": [ - "aggregate%head%9#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%9#0" - ] - }, - "2597": { - "op": "uncover 5", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%9#0", - "maybe_value%11#0" - ] - }, - "2599": { - "op": "itob", - "defined_out": [ - "aggregate%head%9#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%11#0", - "maybe_value%0#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%9#0", - "aggregate%val_as_bytes%11#0" - ] - }, - "2600": { - "op": "concat", - "defined_out": [ - "aggregate%head%10#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%10#0" - ] - }, - "2601": { - "op": "uncover 4", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%10#0", - "maybe_value%12#0" - ] - }, - "2603": { - "op": "itob", - "defined_out": [ - "aggregate%head%10#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%12#0", - "maybe_value%0#0", - "maybe_value%13#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%10#0", - "aggregate%val_as_bytes%12#0" - ] - }, - "2604": { - "op": "concat", - "defined_out": [ - "aggregate%head%11#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%13#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%11#0" - ] - }, - "2605": { - "op": "uncover 3", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%11#0", - "maybe_value%13#0" - ] - }, - "2607": { - "op": "itob", - "defined_out": [ - "aggregate%head%11#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%13#0", - "maybe_value%0#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%11#0", - "aggregate%val_as_bytes%13#0" - ] - }, - "2608": { - "op": "concat", - "defined_out": [ - "aggregate%head%12#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%12#0" - ] - }, - "2609": { - "op": "bytec 28 // 0x00", - "defined_out": [ - "0x00", - "aggregate%head%12#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%12#0", - "0x00" - ] - }, - "2611": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%12#0", - "0x00", - "0" - ] - }, - "2612": { - "op": "uncover 4", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "aggregate%uint8%1#0", - "aggregate%head%12#0", - "0x00", - "0", - "maybe_value%14#0" - ] - }, - "2614": { - "op": "setbit", - "defined_out": [ - "aggregate%encoded_bool%0#0", - "aggregate%head%12#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "aggregate%uint8%1#0", - "aggregate%head%12#0", - "aggregate%encoded_bool%0#0" - ] - }, - "2615": { - "op": "concat", - "defined_out": [ - "aggregate%head%13#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "aggregate%uint8%1#0", - "aggregate%head%13#0" - ] - }, - "2616": { - "op": "swap", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "aggregate%head%13#0", - "aggregate%uint8%1#0" - ] - }, - "2617": { - "op": "concat", - "defined_out": [ - "aggregate%head%14#0", - "maybe_value%0#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "aggregate%head%14#0" - ] - }, - "2618": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%head%14#0", - "maybe_value%0#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "aggregate%head%14#0", - "0x151f7c75" - ] - }, - "2619": { - "op": "swap", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "0x151f7c75", - "aggregate%head%14#0" - ] - }, - "2620": { - "op": "concat", - "defined_out": [ - "maybe_value%0#0", - "performance#0", - "tmp%1#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "tmp%1#0" - ] - }, - "2621": { - "op": "log", - "stack_out": [ - "performance#0", - "maybe_value%0#0" - ] - }, - "2622": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "maybe_value%0#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "1" - ] - }, - "2623": { - "op": "return", - "stack_out": [ - "performance#0", - "maybe_value%0#0" - ] - }, - "2624": { - "subroutine": "modules.core_financial.common.CoreFinancialCommonMixin.get_time_events[routing]", - "params": {}, - "block": "get_time_events", - "stack_in": [], - "op": "bytec 30 // 0x0000" - }, - "2626": { - "op": "intc_0 // 0" - }, - "2627": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"", - "0", - "time_events#0" - ], - "stack_out": [ - "time_events#0", - "0", - "\"status\"" - ] - }, - "2628": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0", - "time_events#0" - ], - "stack_out": [ - "time_events#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2629": { - "error": "check self.status exists", - "op": "assert // check self.status exists", - "stack_out": [ - "time_events#0", - "maybe_value%0#0" - ] - }, - "2630": { - "op": "pushint 100", - "defined_out": [ - "100", - "maybe_value%0#0", - "time_events#0" - ], - "stack_out": [ - "time_events#0", - "maybe_value%0#0", - "100" - ] - }, - "2632": { - "op": "==", - "defined_out": [ - "time_events#0", - "tmp%0#2" - ], - "stack_out": [ - "time_events#0", - "tmp%0#2" - ] - }, - "2633": { - "op": "bz get_time_events_after_if_else@3", - "stack_out": [ - "time_events#0" - ] - }, - "2636": { - "op": "bytec 27 // 0x74696d654576656e7473", - "defined_out": [ - "0x74696d654576656e7473", - "time_events#0" - ], - "stack_out": [ - "time_events#0", - "0x74696d654576656e7473" - ] - }, - "2638": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%1#0", - "time_events#0" - ], - "stack_out": [ - "time_events#0", - "time_events#0", - "aggregate%box_get%1#0" - ] - }, - "2639": { - "op": "swap", - "stack_out": [ - "time_events#0", - "aggregate%box_get%1#0", - "time_events#0" - ] - }, - "2640": { - "op": "bury 2", - "stack_out": [ - "time_events#0", - "aggregate%box_get%1#0" - ] - }, - "2642": { - "error": "check self.time_events exists", - "op": "assert // check self.time_events exists", - "stack_out": [ - "time_events#0" - ] - }, - "2643": { - "block": "get_time_events_after_if_else@3", - "stack_in": [ - "time_events#0" - ], - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75" - ], - "stack_out": [ - "time_events#0", - "0x151f7c75" - ] - }, - "2644": { - "op": "dig 1", - "defined_out": [ - "0x151f7c75", - "time_events#0" - ], - "stack_out": [ - "time_events#0", - "0x151f7c75", - "time_events#0" - ] - }, - "2646": { - "op": "concat", - "defined_out": [ - "time_events#0", - "tmp%1#0" - ], - "stack_out": [ - "time_events#0", - "tmp%1#0" - ] - }, - "2647": { - "op": "log", - "stack_out": [ - "time_events#0" - ] - }, - "2648": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "time_events#0" - ], - "stack_out": [ - "time_events#0", - "1" - ] - }, - "2649": { - "op": "return", - "stack_out": [ - "time_events#0" - ] - }, - "2650": { - "subroutine": "modules.core_financial.common.CoreFinancialCommonMixin.get_secondary_market_schedule[routing]", - "params": {}, - "block": "get_secondary_market_schedule", - "stack_in": [], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "0" - ] - }, - "2651": { - "op": "bytec 16 // \"secondary_market_opening_date\"", - "defined_out": [ - "\"secondary_market_opening_date\"", - "0" - ], - "stack_out": [ - "0", - "\"secondary_market_opening_date\"" - ] - }, - "2653": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2654": { - "error": "check self.secondary_market_opening_date exists", - "op": "assert // check self.secondary_market_opening_date exists", - "stack_out": [ - "maybe_value%0#0" - ] - }, - "2655": { - "op": "intc_0 // 0", - "stack_out": [ - "maybe_value%0#0", - "0" - ] - }, - "2656": { - "op": "bytec 9 // \"secondary_market_closure_date\"", - "defined_out": [ - "\"secondary_market_closure_date\"", - "0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "0", - "\"secondary_market_closure_date\"" - ] - }, - "2658": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%1#0", - "maybe_value%0#0", - "maybe_value%1#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "2659": { - "error": "check self.secondary_market_closure_date exists", - "op": "assert // check self.secondary_market_closure_date exists", - "stack_out": [ - "maybe_value%0#0", - "maybe_value%1#0" - ] - }, - "2660": { - "op": "swap", - "stack_out": [ - "maybe_value%1#0", - "maybe_value%0#0" - ] - }, - "2661": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "maybe_value%1#0" - ], - "stack_out": [ - "maybe_value%1#0", - "aggregate%val_as_bytes%0#0" - ] - }, - "2662": { - "op": "pushbytes 0x0002", - "defined_out": [ - "0x0002", - "aggregate%val_as_bytes%0#0", - "maybe_value%1#0" - ], - "stack_out": [ - "maybe_value%1#0", - "aggregate%val_as_bytes%0#0", - "0x0002" - ] - }, - "2666": { - "op": "swap", - "stack_out": [ - "maybe_value%1#0", - "0x0002", - "aggregate%val_as_bytes%0#0" - ] - }, - "2667": { - "op": "concat", - "defined_out": [ - "aggregate%head%0#0", - "maybe_value%1#0" - ], - "stack_out": [ - "maybe_value%1#0", - "aggregate%head%0#0" - ] - }, - "2668": { - "op": "swap", - "stack_out": [ - "aggregate%head%0#0", - "maybe_value%1#0" - ] - }, - "2669": { - "op": "itob", - "defined_out": [ - "aggregate%head%0#0", - "aggregate%val_as_bytes%1#0" - ], - "stack_out": [ - "aggregate%head%0#0", - "aggregate%val_as_bytes%1#0" - ] - }, - "2670": { - "op": "concat", - "defined_out": [ - "aggregate%head%1#0" - ], - "stack_out": [ - "aggregate%head%1#0" - ] - }, - "2671": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%head%1#0" - ], - "stack_out": [ - "aggregate%head%1#0", - "0x151f7c75" - ] - }, - "2672": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%head%1#0" - ] - }, - "2673": { - "op": "concat", - "defined_out": [ - "tmp%1#0" - ], - "stack_out": [ - "tmp%1#0" - ] - }, - "2674": { - "op": "log", - "stack_out": [] - }, - "2675": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "2676": { - "op": "return", - "stack_out": [] - }, - "2677": { - "subroutine": "modules.core_financial.common.CoreFinancialCommonMixin.get_asset_metadata[routing]", - "params": {}, - "block": "get_asset_metadata", - "stack_in": [], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "0" - ] - }, - "2678": { - "op": "bytec 23 // \"metadata\"", - "defined_out": [ - "\"metadata\"", - "0" - ], - "stack_out": [ - "0", - "\"metadata\"" - ] - }, - "2680": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2681": { - "error": "check self.metadata exists", - "op": "assert // check self.metadata exists", - "stack_out": [ - "maybe_value%0#0" - ] - }, - "2682": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "0x151f7c75" - ] - }, - "2683": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "maybe_value%0#0" - ] - }, - "2684": { - "op": "concat", - "defined_out": [ - "tmp%1#0" - ], - "stack_out": [ - "tmp%1#0" - ] - }, - "2685": { - "op": "log", - "stack_out": [] - }, - "2686": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "2687": { - "op": "return", - "stack_out": [] - }, - "2688": { - "subroutine": "modules.accounting.AccountingModule.account_gov_suspension[routing]", - "params": {}, - "block": "account_gov_suspension", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "holding_address#0" - ], - "stack_out": [ - "holding_address#0" - ] - }, - "2691": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ] - }, - "2692": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0" - ] - }, - "2693": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0", - "32" - ] - }, - "2694": { - "op": "==", - "defined_out": [ - "eq%0#0", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "eq%0#0" - ] - }, - "2695": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "holding_address#0" - ] - }, - "2696": { - "op": "txna ApplicationArgs 2", - "defined_out": [ - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0" - ] - }, - "2699": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ] - }, - "2700": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%1#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "len%1#0" - ] - }, - "2701": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "holding_address#0", - "len%1#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "len%1#0", - "1" - ] - }, - "2702": { - "op": "==", - "defined_out": [ - "eq%1#0", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "eq%1#0" - ] - }, - "2703": { - "error": "invalid number of bytes for arc4.bool", - "op": "assert // invalid number of bytes for arc4.bool", - "stack_out": [ - "holding_address#0", - "tmp%2#0" - ] - }, - "2704": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "0" - ] - }, - "2705": { - "op": "getbit", - "defined_out": [ - "holding_address#0", - "suspended#0" - ], - "stack_out": [ - "holding_address#0", - "suspended#0" - ] - }, - "2706": { - "op": "bytec 10 // 0x52373023", - "defined_out": [ - "0x52373023", - "holding_address#0", - "suspended#0" - ], - "stack_out": [ - "holding_address#0", - "suspended#0", - "0x52373023" - ] - }, - "2708": { - "op": "txn Sender", - "defined_out": [ - "0x52373023", - "holding_address#0", - "suspended#0", - "tmp%0#2" - ], - "stack_out": [ - "holding_address#0", - "suspended#0", - "0x52373023", - "tmp%0#2" - ] - }, - "2710": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "holding_address#0", - "suspended#0", - "tmp%1#0" - ], - "stack_out": [ - "holding_address#0", - "suspended#0", - "tmp%1#0" - ] - }, - "2713": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "holding_address#0", - "suspended#0" - ] - }, - "2714": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023", - "holding_address#0", - "suspended#0" - ], - "stack_out": [ - "holding_address#0", - "suspended#0", - "0x52333023" - ] - }, - "2715": { - "op": "uncover 2", - "stack_out": [ - "suspended#0", - "0x52333023", - "holding_address#0" - ] - }, - "2717": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "suspended#0" - ], - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1" - ] - }, - "2718": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "suspended#0" - ], - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "2719": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0", - "suspended#0" - ], - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "2720": { - "op": "bury 1", - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "2722": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1" - ] - }, - "2723": { - "op": "dup", - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "2724": { - "op": "pushint 56", - "defined_out": [ - "56", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "suspended#0" - ], - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "56" - ] - }, - "2726": { - "op": "intc_1 // 1", - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "56", - "1" - ] - }, - "2727": { - "op": "box_extract", - "defined_out": [ - "box%box_extract%0#0", - "box_prefixed_key%0#1", - "suspended#0" - ], - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1", - "box%box_extract%0#0" - ] - }, - "2728": { - "op": "intc_0 // 0", - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1", - "box%box_extract%0#0", - "0" - ] - }, - "2729": { - "op": "uncover 3", - "stack_out": [ - "box_prefixed_key%0#1", - "box%box_extract%0#0", - "0", - "suspended#0" - ] - }, - "2731": { - "op": "setbit", - "defined_out": [ - "aggregate%updated_target%0#0", - "box_prefixed_key%0#1" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "aggregate%updated_target%0#0" - ] - }, - "2732": { - "op": "pushint 56" - }, - "2734": { - "op": "swap", - "stack_out": [ - "box_prefixed_key%0#1", - "56", - "aggregate%updated_target%0#0" - ] - }, - "2735": { - "op": "box_replace", - "stack_out": [] - }, - "2736": { - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1" - ] - }, - "2738": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0" - ] - }, - "2739": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0", - "0x151f7c75" - ] - }, - "2740": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ] - }, - "2741": { - "op": "concat", - "defined_out": [ - "tmp%6#0" - ], - "stack_out": [ - "tmp%6#0" - ] - }, - "2742": { - "op": "log", - "stack_out": [] - }, - "2743": { - "op": "intc_1 // 1", - "stack_out": [ - "1" - ] - }, - "2744": { - "op": "return", - "stack_out": [] - }, - "2745": { - "subroutine": "modules.accounting.AccountingModule.account_open[routing]", - "params": {}, - "block": "account_open", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "holding_address#0" - ], - "stack_out": [ - "holding_address#0" - ] - }, - "2748": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ] - }, - "2749": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0" - ] - }, - "2750": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0", - "32" - ] - }, - "2751": { - "op": "==", - "defined_out": [ - "eq%0#0", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "eq%0#0" - ] - }, - "2752": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "holding_address#0" - ] - }, - "2753": { - "op": "txna ApplicationArgs 2", - "defined_out": [ - "holding_address#0", - "payment_address#0" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0" - ] - }, - "2756": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "payment_address#0", - "payment_address#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "payment_address#0 (copy)" - ] - }, - "2757": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%1#0", - "payment_address#0" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "len%1#0" - ] - }, - "2758": { - "op": "intc_2 // 32", - "stack_out": [ - "holding_address#0", - "payment_address#0", - "len%1#0", - "32" - ] - }, - "2759": { - "op": "==", - "defined_out": [ - "eq%1#0", - "holding_address#0", - "payment_address#0" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "eq%1#0" - ] - }, - "2760": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "holding_address#0", - "payment_address#0" - ] - }, - "2761": { - "op": "bytec 11 // 0x52343023", - "defined_out": [ - "0x52343023", - "holding_address#0", - "payment_address#0" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "0x52343023" - ] - }, - "2763": { - "op": "txn Sender", - "defined_out": [ - "0x52343023", - "holding_address#0", - "payment_address#0", - "tmp%0#2" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "0x52343023", - "tmp%0#2" - ] - }, - "2765": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "holding_address#0", - "payment_address#0", - "tmp%1#1" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "tmp%1#1" - ] - }, - "2768": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "holding_address#0", - "payment_address#0" - ] - }, - "2769": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "holding_address#0", - "payment_address#0" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "0" - ] - }, - "2770": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"", - "0", - "holding_address#0", - "payment_address#0" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "0", - "\"status\"" - ] - }, - "2771": { - "op": "app_global_get_ex", - "defined_out": [ - "holding_address#0", - "maybe_exists%0#0", - "maybe_value%0#0", - "payment_address#0" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2772": { - "error": "check self.status exists", - "op": "assert // check self.status exists", - "stack_out": [ - "holding_address#0", - "payment_address#0", - "maybe_value%0#0" - ] - }, - "2773": { - "op": "intc 4 // 200", - "defined_out": [ - "200", - "holding_address#0", - "maybe_value%0#0", - "payment_address#0" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "maybe_value%0#0", - "200" - ] - }, - "2775": { - "op": "==", - "defined_out": [ - "holding_address#0", - "payment_address#0", - "tmp%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "tmp%0#3" - ] - }, - "2776": { - "op": "!", - "stack_out": [ - "holding_address#0", - "payment_address#0", - "tmp%1#1" - ] - }, - "2777": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "holding_address#0", - "payment_address#0" - ] - }, - "2778": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "op": "callsub assert_is_not_asset_defaulted" - }, - "2781": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_suspended", - "op": "callsub assert_is_not_asset_suspended" - }, - "2784": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023", - "holding_address#0", - "payment_address#0" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "0x52333023" - ] - }, - "2785": { - "op": "uncover 2", - "stack_out": [ - "payment_address#0", - "0x52333023", - "holding_address#0" - ] - }, - "2787": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#0", - "payment_address#0" - ], - "stack_out": [ - "payment_address#0", - "box_prefixed_key%0#0" - ] - }, - "2788": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#0", - "box_prefixed_key%0#0 (copy)", - "payment_address#0" - ], - "stack_out": [ - "payment_address#0", - "box_prefixed_key%0#0", - "box_prefixed_key%0#0 (copy)" - ] - }, - "2789": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#0", - "maybe_exists%0#0", - "payment_address#0" - ], - "stack_out": [ - "payment_address#0", - "box_prefixed_key%0#0", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "2790": { - "op": "bury 1", - "stack_out": [ - "payment_address#0", - "box_prefixed_key%0#0", - "maybe_exists%0#0" - ] - }, - "2792": { - "op": "!", - "defined_out": [ - "box_prefixed_key%0#0", - "payment_address#0", - "tmp%2#1" - ], - "stack_out": [ - "payment_address#0", - "box_prefixed_key%0#0", - "tmp%2#1" - ] - }, - "2793": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "payment_address#0", - "box_prefixed_key%0#0" - ] - }, - "2794": { - "op": "intc_0 // 0", - "stack_out": [ - "payment_address#0", - "box_prefixed_key%0#0", - "0" - ] - }, - "2795": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#0", - "payment_address#0" - ], - "stack_out": [ - "payment_address#0", - "box_prefixed_key%0#0", - "aggregate%val_as_bytes%0#0" - ] - }, - "2796": { - "op": "uncover 2", - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%val_as_bytes%0#0", - "payment_address#0" - ] - }, - "2798": { - "op": "dig 1", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%0#0 (copy)", - "box_prefixed_key%0#0", - "payment_address#0" - ], - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%val_as_bytes%0#0", - "payment_address#0", - "aggregate%val_as_bytes%0#0 (copy)" - ] - }, - "2800": { - "op": "concat", - "defined_out": [ - "aggregate%head%1#0", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%val_as_bytes%0#0", - "aggregate%head%1#0" - ] - }, - "2801": { - "op": "dig 1", - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%val_as_bytes%0#0", - "aggregate%head%1#0", - "aggregate%val_as_bytes%0#0 (copy)" - ] - }, - "2803": { - "op": "concat", - "defined_out": [ - "aggregate%head%2#0", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%val_as_bytes%0#0", - "aggregate%head%2#0" - ] - }, - "2804": { - "op": "swap", - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%head%2#0", - "aggregate%val_as_bytes%0#0" - ] - }, - "2805": { - "op": "concat", - "defined_out": [ - "aggregate%head%3#0", - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%head%3#0" - ] - }, - "2806": { - "op": "bytec 28 // 0x00", - "defined_out": [ - "0x00", - "aggregate%head%3#0", - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%head%3#0", - "0x00" - ] - }, - "2808": { - "op": "concat", - "defined_out": [ - "aggregate%head%4#0", - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%head%4#0" - ] - }, - "2809": { - "op": "box_put", - "stack_out": [] - }, - "2810": { - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%4#1" - ], - "stack_out": [ - "tmp%4#1" - ] - }, - "2812": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%3#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%3#0" - ] - }, - "2813": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%3#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%3#0", - "0x151f7c75" - ] - }, - "2814": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%3#0" - ] - }, - "2815": { - "op": "concat", - "defined_out": [ - "tmp%6#0" - ], - "stack_out": [ - "tmp%6#0" - ] - }, - "2816": { - "op": "log", - "stack_out": [] - }, - "2817": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "2818": { - "op": "return", - "stack_out": [] - }, - "2819": { - "subroutine": "modules.accounting.AccountingModule.account_close[routing]", - "params": {}, - "block": "account_close", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "holding_address#0" - ], - "stack_out": [ - "holding_address#0" - ] - }, - "2822": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ] - }, - "2823": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0" - ] - }, - "2824": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0", - "32" - ] - }, - "2825": { - "op": "==", - "defined_out": [ - "eq%0#0", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "eq%0#0" - ] - }, - "2826": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "holding_address#0" - ] - }, - "2827": { - "op": "bytec 11 // 0x52343023", - "defined_out": [ - "0x52343023", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "0x52343023" - ] - }, - "2829": { - "op": "txn Sender", - "defined_out": [ - "0x52343023", - "holding_address#0", - "tmp%0#2" - ], - "stack_out": [ - "holding_address#0", - "0x52343023", - "tmp%0#2" - ] - }, - "2831": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "holding_address#0", - "tmp%1#2" - ], - "stack_out": [ - "holding_address#0", - "tmp%1#2" - ] - }, - "2834": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "holding_address#0" - ] - }, - "2835": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "op": "callsub assert_is_not_asset_defaulted" - }, - "2838": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "0x52333023" - ] - }, - "2839": { - "op": "swap", - "stack_out": [ - "0x52333023", - "holding_address#0" - ] - }, - "2840": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1" - ], - "stack_out": [ - "box_prefixed_key%0#1" - ] - }, - "2841": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "2842": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "2843": { - "op": "bury 1", - "stack_out": [ - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "2845": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "box_prefixed_key%0#1" - ] - }, - "2846": { - "op": "dup", - "stack_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "2847": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0", - "box_prefixed_key%0#1" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "2848": { - "op": "pop", - "stack_out": [ - "box_prefixed_key%0#1", - "aggregate%box_get%0#0" - ] - }, - "2849": { - "op": "intc_2 // 32", - "stack_out": [ - "box_prefixed_key%0#1", - "aggregate%box_get%0#0", - "32" - ] - }, - "2850": { - "op": "extract_uint64", - "defined_out": [ - "box_prefixed_key%0#1", - "closed_units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "closed_units#0" - ] - }, - "2851": { - "op": "swap", - "stack_out": [ - "closed_units#0", - "box_prefixed_key%0#1" - ] - }, - "2852": { - "op": "box_del", - "defined_out": [ - "closed_units#0", - "{box_del}" - ], - "stack_out": [ - "closed_units#0", - "{box_del}" - ] - }, - "2853": { - "op": "pop", - "stack_out": [ - "closed_units#0" - ] - }, - "2854": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "closed_units#0" - ], - "stack_out": [ - "closed_units#0", - "0" - ] - }, - "2855": { - "op": "bytec_3 // \"circulating_units\"", - "defined_out": [ - "\"circulating_units\"", - "0", - "closed_units#0" - ], - "stack_out": [ - "closed_units#0", - "0", - "\"circulating_units\"" - ] - }, - "2856": { - "op": "app_global_get_ex", - "defined_out": [ - "closed_units#0", - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "closed_units#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2857": { - "error": "check self.circulating_units exists", - "op": "assert // check self.circulating_units exists", - "stack_out": [ - "closed_units#0", - "maybe_value%0#0" - ] - }, - "2858": { - "op": "dig 1", - "defined_out": [ - "closed_units#0", - "closed_units#0 (copy)", - "maybe_value%0#0" - ], - "stack_out": [ - "closed_units#0", - "maybe_value%0#0", - "closed_units#0 (copy)" - ] - }, - "2860": { - "op": "-", - "defined_out": [ - "closed_units#0", - "tmp%0#1" - ], - "stack_out": [ - "closed_units#0", - "tmp%0#1" - ] - }, - "2861": { - "op": "bytec_3 // \"circulating_units\"", - "stack_out": [ - "closed_units#0", - "tmp%0#1", - "\"circulating_units\"" - ] - }, - "2862": { - "op": "swap", - "stack_out": [ - "closed_units#0", - "\"circulating_units\"", - "tmp%0#1" - ] - }, - "2863": { - "op": "app_global_put", - "stack_out": [ - "closed_units#0" - ] - }, - "2864": { - "callsub": "modules.accounting.AccountingModule.end_if_no_circulating_units", - "op": "callsub end_if_no_circulating_units" - }, - "2867": { - "op": "global LatestTimestamp", - "defined_out": [ - "closed_units#0", - "tmp%1#1" - ], - "stack_out": [ - "closed_units#0", - "tmp%1#1" - ] - }, - "2869": { - "op": "swap", - "stack_out": [ - "tmp%1#1", - "closed_units#0" - ] - }, - "2870": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "tmp%1#1" - ], - "stack_out": [ - "tmp%1#1", - "aggregate%val_as_bytes%0#0" - ] - }, - "2871": { - "op": "swap", - "stack_out": [ - "aggregate%val_as_bytes%0#0", - "tmp%1#1" - ] - }, - "2872": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0" - ] - }, - "2873": { - "op": "concat", - "defined_out": [ - "aggregate%head%1#0" - ], - "stack_out": [ - "aggregate%head%1#0" - ] - }, - "2874": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%head%1#0" - ], - "stack_out": [ - "aggregate%head%1#0", - "0x151f7c75" - ] - }, - "2875": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%head%1#0" - ] - }, - "2876": { - "op": "concat", - "defined_out": [ - "tmp%5#0" - ], - "stack_out": [ - "tmp%5#0" - ] - }, - "2877": { - "op": "log", - "stack_out": [] - }, - "2878": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "2879": { - "op": "return", - "stack_out": [] - }, - "2880": { - "subroutine": "modules.accounting.AccountingModule.account_update_payment_address[routing]", - "params": {}, - "block": "account_update_payment_address", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "holding_address#0" - ], - "stack_out": [ - "holding_address#0" - ] - }, - "2883": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ] - }, - "2884": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0" - ] - }, - "2885": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0", - "32" - ] - }, - "2886": { - "op": "==", - "defined_out": [ - "eq%0#0", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "eq%0#0" - ] - }, - "2887": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "holding_address#0" - ] - }, - "2888": { - "op": "txna ApplicationArgs 2", - "defined_out": [ - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0" - ] - }, - "2891": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ] - }, - "2892": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%1#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "len%1#0" - ] - }, - "2893": { - "op": "intc_2 // 32", - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "len%1#0", - "32" - ] - }, - "2894": { - "op": "==", - "defined_out": [ - "eq%1#0", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "eq%1#0" - ] - }, - "2895": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "holding_address#0", - "tmp%2#0" - ] - }, - "2896": { - "op": "txn Sender", - "defined_out": [ - "holding_address#0", - "tmp%0#1", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%0#1" - ] - }, - "2898": { - "op": "dig 2", - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%0#1", - "holding_address#0 (copy)" - ] - }, - "2900": { - "op": "==", - "defined_out": [ - "holding_address#0", - "tmp%1#1", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%1#1" - ] - }, - "2901": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "holding_address#0", - "tmp%2#0" - ] - }, - "2902": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "op": "callsub assert_is_not_asset_defaulted" - }, - "2905": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_suspended", - "op": "callsub assert_is_not_asset_suspended" - }, - "2908": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "0x52333023" - ] - }, - "2909": { - "op": "uncover 2", - "stack_out": [ - "tmp%2#0", - "0x52333023", - "holding_address#0" - ] - }, - "2911": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0", - "box_prefixed_key%0#1" - ] - }, - "2912": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "2913": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0", - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "2914": { - "op": "bury 1", - "stack_out": [ - "tmp%2#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "2916": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "tmp%2#0", - "box_prefixed_key%0#1" - ] - }, - "2917": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "box_prefixed_key%0#1", - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0", - "box_prefixed_key%0#1", - "0" - ] - }, - "2918": { - "op": "uncover 2", - "stack_out": [ - "box_prefixed_key%0#1", - "0", - "tmp%2#0" - ] - }, - "2920": { - "op": "box_replace", - "stack_out": [] - }, - "2921": { - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%2#1" - ], - "stack_out": [ - "tmp%2#1" - ] - }, - "2923": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0" - ] - }, - "2924": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0", - "0x151f7c75" - ] - }, - "2925": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ] - }, - "2926": { - "op": "concat", - "defined_out": [ - "tmp%6#0" - ], - "stack_out": [ - "tmp%6#0" - ] - }, - "2927": { - "op": "log", - "stack_out": [] - }, - "2928": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "2929": { - "op": "return", - "stack_out": [] - }, - "2930": { - "subroutine": "modules.accounting.AccountingModule.account_get_info[routing]", - "params": {}, - "block": "account_get_info", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "holding_address#0" - ], - "stack_out": [ - "holding_address#0" - ] - }, - "2933": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ] - }, - "2934": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0" - ] - }, - "2935": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0", - "32" - ] - }, - "2936": { - "op": "==", - "defined_out": [ - "eq%0#0", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "eq%0#0" - ] - }, - "2937": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "holding_address#0" - ] - }, - "2938": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "0x52333023" - ] - }, - "2939": { - "op": "swap", - "stack_out": [ - "0x52333023", - "holding_address#0" - ] - }, - "2940": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1" - ], - "stack_out": [ - "box_prefixed_key%0#1" - ] - }, - "2941": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "2942": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "2943": { - "op": "bury 1", - "stack_out": [ - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "2945": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "box_prefixed_key%0#1" - ] - }, - "2946": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ], - "stack_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "2947": { - "op": "pop", - "stack_out": [ - "aggregate%box_get%0#0" - ] - }, - "2948": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%box_get%0#0" - ], - "stack_out": [ - "aggregate%box_get%0#0", - "0x151f7c75" - ] - }, - "2949": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%box_get%0#0" - ] - }, - "2950": { - "op": "concat", - "defined_out": [ - "tmp%3#0" - ], - "stack_out": [ - "tmp%3#0" - ] - }, - "2951": { - "op": "log", - "stack_out": [] - }, - "2952": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "2953": { - "op": "return", - "stack_out": [] - }, - "2954": { - "subroutine": "modules.rbac.RbacModule.rbac_rotate_arranger[routing]", - "params": {}, - "block": "rbac_rotate_arranger", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "new_arranger#0" - ], - "stack_out": [ - "new_arranger#0" - ] - }, - "2957": { - "op": "dup", - "defined_out": [ - "new_arranger#0", - "new_arranger#0 (copy)" - ], - "stack_out": [ - "new_arranger#0", - "new_arranger#0 (copy)" - ] - }, - "2958": { - "op": "len", - "defined_out": [ - "len%0#0", - "new_arranger#0" - ], - "stack_out": [ - "new_arranger#0", - "len%0#0" - ] - }, - "2959": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "len%0#0", - "new_arranger#0" - ], - "stack_out": [ - "new_arranger#0", - "len%0#0", - "32" - ] - }, - "2960": { - "op": "==", - "defined_out": [ - "eq%0#0", - "new_arranger#0" - ], - "stack_out": [ - "new_arranger#0", - "eq%0#0" - ] - }, - "2961": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "new_arranger#0" - ] - }, - "2962": { - "callsub": "modules.rbac.RbacModule.assert_caller_is_arranger", - "op": "callsub assert_caller_is_arranger" - }, - "2965": { - "op": "bytec 5 // 0x52323023", - "defined_out": [ - "0x52323023", - "new_arranger#0" - ], - "stack_out": [ - "new_arranger#0", - "0x52323023" - ] - }, - "2967": { - "op": "swap", - "stack_out": [ - "0x52323023", - "new_arranger#0" - ] - }, - "2968": { - "op": "app_global_put", - "stack_out": [] - }, - "2969": { - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1" - ] - }, - "2971": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0" - ] - }, - "2972": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0", - "0x151f7c75" - ] - }, - "2973": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ] - }, - "2974": { - "op": "concat", - "defined_out": [ - "tmp%4#0" - ], - "stack_out": [ - "tmp%4#0" - ] - }, - "2975": { - "op": "log", - "stack_out": [] - }, - "2976": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "2977": { - "op": "return", - "stack_out": [] - }, - "2978": { - "subroutine": "modules.rbac.RbacModule.rbac_set_op_daemon[routing]", - "params": {}, - "block": "rbac_set_op_daemon", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "address#0" - ], - "stack_out": [ - "address#0" - ] - }, - "2981": { - "op": "dup", - "defined_out": [ - "address#0", - "address#0 (copy)" - ], - "stack_out": [ - "address#0", - "address#0 (copy)" - ] - }, - "2982": { - "op": "len", - "defined_out": [ - "address#0", - "len%0#0" - ], - "stack_out": [ - "address#0", - "len%0#0" - ] - }, - "2983": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "address#0", - "len%0#0" - ], - "stack_out": [ - "address#0", - "len%0#0", - "32" - ] - }, - "2984": { - "op": "==", - "defined_out": [ - "address#0", - "eq%0#0" - ], - "stack_out": [ - "address#0", - "eq%0#0" - ] - }, - "2985": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "address#0" - ] - }, - "2986": { - "callsub": "modules.rbac.RbacModule.assert_caller_is_arranger", - "op": "callsub assert_caller_is_arranger" - }, - "2989": { - "op": "bytec 19 // 0x52323523", - "defined_out": [ - "0x52323523", - "address#0" - ], - "stack_out": [ - "address#0", - "0x52323523" - ] - }, - "2991": { - "op": "swap", - "stack_out": [ - "0x52323523", - "address#0" - ] - }, - "2992": { - "op": "app_global_put", - "stack_out": [] - }, - "2993": { - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1" - ] - }, - "2995": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0" - ] - }, - "2996": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0", - "0x151f7c75" - ] - }, - "2997": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ] - }, - "2998": { - "op": "concat", - "defined_out": [ - "tmp%4#0" - ], - "stack_out": [ - "tmp%4#0" - ] - }, - "2999": { - "op": "log", - "stack_out": [] - }, - "3000": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "3001": { - "op": "return", - "stack_out": [] - }, - "3002": { - "subroutine": "modules.rbac.RbacModule.rbac_assign_role[routing]", - "params": {}, - "block": "rbac_assign_role", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "role_id#0" - ], - "stack_out": [ - "role_id#0" - ] - }, - "3005": { - "op": "dup", - "defined_out": [ - "role_id#0", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0", - "role_id#0 (copy)" - ] - }, - "3006": { - "op": "len", - "defined_out": [ - "len%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "len%0#0" - ] - }, - "3007": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "len%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "len%0#0", - "1" - ] - }, - "3008": { - "op": "==", - "defined_out": [ - "eq%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "eq%0#0" - ] - }, - "3009": { - "error": "invalid number of bytes for arc4.uint8", - "op": "assert // invalid number of bytes for arc4.uint8", - "stack_out": [ - "role_id#0" - ] - }, - "3010": { - "op": "txna ApplicationArgs 2" - }, - "3013": { - "op": "dup", - "defined_out": [ - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "role_address#0", - "role_address#0" - ] - }, - "3014": { - "op": "cover 2", - "defined_out": [ - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "role_address#0" - ] - }, - "3016": { - "op": "len", - "defined_out": [ - "len%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "len%1#0" - ] - }, - "3017": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "len%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "len%1#0", - "32" - ] - }, - "3018": { - "op": "==", - "defined_out": [ - "eq%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "eq%1#0" - ] - }, - "3019": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "role_address#0", - "role_id#0" - ] - }, - "3020": { - "op": "txna ApplicationArgs 3", - "defined_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0" - ] - }, - "3023": { - "op": "dup", - "defined_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "tmp%3#0 (copy)" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "tmp%3#0 (copy)" - ] - }, - "3024": { - "op": "intc_0 // 0", - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "tmp%3#0 (copy)", - "0" - ] - }, - "3025": { - "error": "invalid array length header", - "op": "extract_uint16 // on error: invalid array length header", - "defined_out": [ - "aggregate%array_length%0#0", - "role_address#0", - "role_id#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "aggregate%array_length%0#0" - ] - }, - "3026": { - "op": "pushint 2", - "defined_out": [ - "2", - "aggregate%array_length%0#0", - "role_address#0", - "role_id#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "aggregate%array_length%0#0", - "2" - ] - }, - "3028": { - "op": "+", - "defined_out": [ - "add%0#0", - "role_address#0", - "role_id#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "add%0#0" - ] - }, - "3029": { - "op": "dig 1", - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "add%0#0", - "tmp%3#0 (copy)" - ] - }, - "3031": { - "op": "len", - "defined_out": [ - "add%0#0", - "len%2#0", - "role_address#0", - "role_id#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "add%0#0", - "len%2#0" - ] - }, - "3032": { - "op": "==", - "defined_out": [ - "eq%2#0", - "role_address#0", - "role_id#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "eq%2#0" - ] - }, - "3033": { - "error": "invalid number of bytes for arc4.dynamic_array", - "op": "assert // invalid number of bytes for arc4.dynamic_array", - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0" - ] - }, - "3034": { - "op": "extract 2 0", - "defined_out": [ - "config#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "config#0" - ] - }, - "3037": { - "op": "swap", - "defined_out": [ - "config#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#0" - ] - }, - "3038": { - "callsub": "modules.rbac.RbacModule.assert_caller_is_arranger", - "op": "callsub assert_caller_is_arranger" - }, - "3041": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "op": "callsub assert_is_not_asset_defaulted" - }, - "3044": { - "op": "btoi", - "defined_out": [ - "config#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3045": { - "op": "dupn 2", - "defined_out": [ - "config#0", - "role_address#0", - "role_id#1", - "role_id#1 (copy)" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1", - "role_id#1 (copy)" - ] - }, - "3047": { - "callsub": "modules.rbac.RbacModule._assert_valid_role", - "op": "callsub _assert_valid_role", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1" - ] - }, - "3050": { - "op": "pushint 20", - "defined_out": [ - "20", - "config#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1", - "20" - ] - }, - "3052": { - "op": "==", - "defined_out": [ - "config#0", - "role_address#0", - "role_id#1", - "tmp%0#2" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "tmp%0#2" - ] - }, - "3053": { - "op": "bz rbac_assign_role_after_if_else@3", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3056": { - "op": "bytec 5 // 0x52323023", - "defined_out": [ - "0x52323023", - "config#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52323023" - ] - }, - "3058": { - "op": "dig 3", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52323023", - "role_address#0" - ] - }, - "3060": { - "op": "app_global_put", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3061": { - "block": "rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14", - "stack_in": [ - "role_address#0", - "config#0", - "role_id#1" - ], - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%2#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "tmp%2#1" - ] - }, - "3063": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "aggregate%val_as_bytes%0#0" - ] - }, - "3064": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "aggregate%val_as_bytes%0#0", - "0x151f7c75" - ] - }, - "3065": { - "op": "swap", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ] - }, - "3066": { - "op": "concat", - "defined_out": [ - "tmp%7#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "tmp%7#0" - ] - }, - "3067": { - "op": "log", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3068": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "1" - ] - }, - "3069": { - "op": "return", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3070": { - "block": "rbac_assign_role_after_if_else@3", - "stack_in": [ - "role_address#0", - "config#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1" - ] - }, - "3071": { - "op": "pushint 40", - "defined_out": [ - "40", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1", - "40" - ] - }, - "3073": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%1#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "tmp%1#1" - ] - }, - "3074": { - "op": "bz rbac_assign_role_after_if_else@5", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3077": { - "op": "bytec 11 // 0x52343023", - "defined_out": [ - "0x52343023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52343023" - ] - }, - "3079": { - "op": "dig 3", - "defined_out": [ - "0x52343023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52343023", - "role_address#0" - ] - }, - "3081": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%0#0" - ] - }, - "3082": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#0", - "box_prefixed_key%0#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%0#0", - "box_prefixed_key%0#0 (copy)" - ] - }, - "3083": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#0", - "maybe_exists%0#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%0#0", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "3084": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%0#0", - "maybe_exists%0#0" - ] - }, - "3086": { - "op": "!", - "defined_out": [ - "box_prefixed_key%0#0", - "role_address#0", - "role_id#1", - "tmp%2#2" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%0#0", - "tmp%2#2" - ] - }, - "3087": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%0#0" - ] - }, - "3088": { - "op": "dig 2", - "defined_out": [ - "box_prefixed_key%0#0", - "config#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%0#0", - "config#0" - ] - }, - "3090": { - "op": "box_put", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3091": { - "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14" - }, - "3094": { - "block": "rbac_assign_role_after_if_else@5", - "stack_in": [ - "role_address#0", - "config#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1" - ] - }, - "3095": { - "op": "pushint 50", - "defined_out": [ - "50", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1", - "50" - ] - }, - "3097": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%3#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "tmp%3#1" - ] - }, - "3098": { - "op": "bz rbac_assign_role_after_if_else@7", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3101": { - "op": "bytec 18 // 0x52353023", - "defined_out": [ - "0x52353023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52353023" - ] - }, - "3103": { - "op": "dig 3", - "defined_out": [ - "0x52353023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52353023", - "role_address#0" - ] - }, - "3105": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%2#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%2#0" - ] - }, - "3106": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%2#0", - "box_prefixed_key%2#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%2#0", - "box_prefixed_key%2#0 (copy)" - ] - }, - "3107": { - "op": "box_len", - "defined_out": [ - "_%1#0", - "box_prefixed_key%2#0", - "maybe_exists%1#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%2#0", - "_%1#0", - "maybe_exists%1#0" - ] - }, - "3108": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%2#0", - "maybe_exists%1#0" - ] - }, - "3110": { - "op": "!", - "defined_out": [ - "box_prefixed_key%2#0", - "role_address#0", - "role_id#1", - "tmp%4#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%2#0", - "tmp%4#0" - ] - }, - "3111": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%2#0" - ] - }, - "3112": { - "op": "dig 2", - "defined_out": [ - "box_prefixed_key%2#0", - "config#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%2#0", - "config#0" - ] - }, - "3114": { - "op": "box_put", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3115": { - "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14" - }, - "3118": { - "block": "rbac_assign_role_after_if_else@7", - "stack_in": [ - "role_address#0", - "config#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1" - ] - }, - "3119": { - "op": "pushint 60", - "defined_out": [ - "60", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1", - "60" - ] - }, - "3121": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%5#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "tmp%5#0" - ] - }, - "3122": { - "op": "bz rbac_assign_role_after_if_else@9", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3125": { - "op": "bytec 17 // 0x52363023", - "defined_out": [ - "0x52363023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52363023" - ] - }, - "3127": { - "op": "dig 3", - "defined_out": [ - "0x52363023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52363023", - "role_address#0" - ] - }, - "3129": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%4#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%4#0" - ] - }, - "3130": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%4#0", - "box_prefixed_key%4#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%4#0", - "box_prefixed_key%4#0 (copy)" - ] - }, - "3131": { - "op": "box_len", - "defined_out": [ - "_%2#0", - "box_prefixed_key%4#0", - "maybe_exists%2#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%4#0", - "_%2#0", - "maybe_exists%2#0" - ] - }, - "3132": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%4#0", - "maybe_exists%2#0" - ] - }, - "3134": { - "op": "!", - "defined_out": [ - "box_prefixed_key%4#0", - "role_address#0", - "role_id#1", - "tmp%6#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%4#0", - "tmp%6#1" - ] - }, - "3135": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%4#0" - ] - }, - "3136": { - "op": "dig 2", - "defined_out": [ - "box_prefixed_key%4#0", - "config#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%4#0", - "config#0" - ] - }, - "3138": { - "op": "box_put", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3139": { - "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14" - }, - "3142": { - "block": "rbac_assign_role_after_if_else@9", - "stack_in": [ - "role_address#0", - "config#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1" - ] - }, - "3143": { - "op": "pushint 70", - "defined_out": [ - "70", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1", - "70" - ] - }, - "3145": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%7#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "tmp%7#1" - ] - }, - "3146": { - "op": "bz rbac_assign_role_after_if_else@11", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3149": { - "op": "bytec 10 // 0x52373023", - "defined_out": [ - "0x52373023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52373023" - ] - }, - "3151": { - "op": "dig 3", - "defined_out": [ - "0x52373023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52373023", - "role_address#0" - ] - }, - "3153": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%6#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%6#0" - ] - }, - "3154": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%6#0", - "box_prefixed_key%6#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%6#0", - "box_prefixed_key%6#0 (copy)" - ] - }, - "3155": { - "op": "box_len", - "defined_out": [ - "_%3#0", - "box_prefixed_key%6#0", - "maybe_exists%3#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%6#0", - "_%3#0", - "maybe_exists%3#0" - ] - }, - "3156": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%6#0", - "maybe_exists%3#0" - ] - }, - "3158": { - "op": "!", - "defined_out": [ - "box_prefixed_key%6#0", - "role_address#0", - "role_id#1", - "tmp%8#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%6#0", - "tmp%8#0" - ] - }, - "3159": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%6#0" - ] - }, - "3160": { - "op": "dig 2", - "defined_out": [ - "box_prefixed_key%6#0", - "config#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%6#0", - "config#0" - ] - }, - "3162": { - "op": "box_put", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3163": { - "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14" - }, - "3166": { - "block": "rbac_assign_role_after_if_else@11", - "stack_in": [ - "role_address#0", - "config#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1" - ] - }, - "3167": { - "op": "pushint 80", - "defined_out": [ - "80", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1", - "80" - ] - }, - "3169": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%9#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "tmp%9#0" - ] - }, - "3170": { - "op": "bz rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3173": { - "op": "bytec 25 // 0x52383023", - "defined_out": [ - "0x52383023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52383023" - ] - }, - "3175": { - "op": "dig 3", - "defined_out": [ - "0x52383023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52383023", - "role_address#0" - ] - }, - "3177": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%8#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%8#0" - ] - }, - "3178": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%8#0", - "box_prefixed_key%8#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%8#0", - "box_prefixed_key%8#0 (copy)" - ] - }, - "3179": { - "op": "box_len", - "defined_out": [ - "_%4#0", - "box_prefixed_key%8#0", - "maybe_exists%4#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%8#0", - "_%4#0", - "maybe_exists%4#0" - ] - }, - "3180": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%8#0", - "maybe_exists%4#0" - ] - }, - "3182": { - "op": "!", - "defined_out": [ - "box_prefixed_key%8#0", - "role_address#0", - "role_id#1", - "tmp%10#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%8#0", - "tmp%10#0" - ] - }, - "3183": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%8#0" - ] - }, - "3184": { - "op": "dig 2", - "defined_out": [ - "box_prefixed_key%8#0", - "config#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%8#0", - "config#0" - ] - }, - "3186": { - "op": "box_put", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3187": { - "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14" - }, - "3190": { - "subroutine": "modules.rbac.RbacModule.rbac_revoke_role[routing]", - "params": {}, - "block": "rbac_revoke_role", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "role_id#0" - ], - "stack_out": [ - "role_id#0" - ] - }, - "3193": { - "op": "dup", - "defined_out": [ - "role_id#0", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0", - "role_id#0 (copy)" - ] - }, - "3194": { - "op": "len", - "defined_out": [ - "len%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "len%0#0" - ] - }, - "3195": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "len%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "len%0#0", - "1" - ] - }, - "3196": { - "op": "==", - "defined_out": [ - "eq%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "eq%0#0" - ] - }, - "3197": { - "error": "invalid number of bytes for arc4.uint8", - "op": "assert // invalid number of bytes for arc4.uint8", - "stack_out": [ - "role_id#0" - ] - }, - "3198": { - "op": "txna ApplicationArgs 2" - }, - "3201": { - "op": "dup", - "defined_out": [ - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "role_address#0", - "role_address#0" - ] - }, - "3202": { - "op": "cover 2", - "defined_out": [ - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "role_address#0" - ] - }, - "3204": { - "op": "len", - "defined_out": [ - "len%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "len%1#0" - ] - }, - "3205": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "len%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "len%1#0", - "32" - ] - }, - "3206": { - "op": "==", - "defined_out": [ - "eq%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "eq%1#0" - ] - }, - "3207": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "role_address#0", - "role_id#0" - ] - }, - "3208": { - "callsub": "modules.rbac.RbacModule.assert_caller_is_arranger", - "op": "callsub assert_caller_is_arranger" - }, - "3211": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "op": "callsub assert_is_not_asset_defaulted" - }, - "3214": { - "op": "btoi", - "defined_out": [ - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3215": { - "op": "dupn 2", - "defined_out": [ - "role_address#0", - "role_id#1", - "role_id#1 (copy)" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "role_id#1 (copy)" - ] - }, - "3217": { - "callsub": "modules.rbac.RbacModule._assert_valid_role", - "op": "callsub _assert_valid_role", - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1" - ] - }, - "3220": { - "op": "dup", - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "role_id#1 (copy)" - ] - }, - "3221": { - "op": "pushint 20", - "defined_out": [ - "20", - "role_address#0", - "role_id#1", - "role_id#1 (copy)" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "role_id#1 (copy)", - "20" - ] - }, - "3223": { - "op": "!=", - "defined_out": [ - "role_address#0", - "role_id#1", - "tmp%0#2" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "tmp%0#2" - ] - }, - "3224": { - "error": "Invalid role identifier", - "op": "assert // Invalid role identifier", - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1" - ] - }, - "3225": { - "op": "pushint 40", - "defined_out": [ - "40", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "40" - ] - }, - "3227": { - "op": "==", - "defined_out": [ - "role_address#0", - "role_id#1", - "tmp%1#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "tmp%1#1" - ] - }, - "3228": { - "op": "bz rbac_revoke_role_after_if_else@3", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3231": { - "op": "bytec 11 // 0x52343023", - "defined_out": [ - "0x52343023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52343023" - ] - }, - "3233": { - "op": "dig 2", - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52343023", - "role_address#0" - ] - }, - "3235": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%0#0" - ] - }, - "3236": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#0", - "box_prefixed_key%0#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%0#0", - "box_prefixed_key%0#0 (copy)" - ] - }, - "3237": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#0", - "maybe_exists%0#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%0#0", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "3238": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%0#0", - "maybe_exists%0#0" - ] - }, - "3240": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%0#0" - ] - }, - "3241": { - "op": "box_del", - "defined_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ] - }, - "3242": { - "op": "pop", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3243": { - "block": "rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12", - "stack_in": [ - "role_address#0", - "role_id#1" - ], - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%2#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "tmp%2#1" - ] - }, - "3245": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "aggregate%val_as_bytes%0#0" - ] - }, - "3246": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "aggregate%val_as_bytes%0#0", - "0x151f7c75" - ] - }, - "3247": { - "op": "swap", - "stack_out": [ - "role_address#0", - "role_id#1", - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ] - }, - "3248": { - "op": "concat", - "defined_out": [ - "tmp%5#0" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "tmp%5#0" - ] - }, - "3249": { - "op": "log", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3250": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "1" - ] - }, - "3251": { - "op": "return", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3252": { - "block": "rbac_revoke_role_after_if_else@3", - "stack_in": [ - "role_address#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1" - ] - }, - "3253": { - "op": "pushint 50", - "defined_out": [ - "50", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "50" - ] - }, - "3255": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%2#2" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "tmp%2#2" - ] - }, - "3256": { - "op": "bz rbac_revoke_role_after_if_else@5", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3259": { - "op": "bytec 18 // 0x52353023", - "defined_out": [ - "0x52353023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52353023" - ] - }, - "3261": { - "op": "dig 2", - "defined_out": [ - "0x52353023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52353023", - "role_address#0" - ] - }, - "3263": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%2#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%2#0" - ] - }, - "3264": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%2#0", - "box_prefixed_key%2#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%2#0", - "box_prefixed_key%2#0 (copy)" - ] - }, - "3265": { - "op": "box_len", - "defined_out": [ - "_%1#0", - "box_prefixed_key%2#0", - "maybe_exists%1#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%2#0", - "_%1#0", - "maybe_exists%1#0" - ] - }, - "3266": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%2#0", - "maybe_exists%1#0" - ] - }, - "3268": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%2#0" - ] - }, - "3269": { - "op": "box_del", - "defined_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ] - }, - "3270": { - "op": "pop", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3271": { - "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" - }, - "3274": { - "block": "rbac_revoke_role_after_if_else@5", - "stack_in": [ - "role_address#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1" - ] - }, - "3275": { - "op": "pushint 60", - "defined_out": [ - "60", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "60" - ] - }, - "3277": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "tmp%3#0" - ] - }, - "3278": { - "op": "bz rbac_revoke_role_after_if_else@7", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3281": { - "op": "bytec 17 // 0x52363023", - "defined_out": [ - "0x52363023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52363023" - ] - }, - "3283": { - "op": "dig 2", - "defined_out": [ - "0x52363023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52363023", - "role_address#0" - ] - }, - "3285": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%4#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%4#0" - ] - }, - "3286": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%4#0", - "box_prefixed_key%4#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%4#0", - "box_prefixed_key%4#0 (copy)" - ] - }, - "3287": { - "op": "box_len", - "defined_out": [ - "_%2#0", - "box_prefixed_key%4#0", - "maybe_exists%2#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%4#0", - "_%2#0", - "maybe_exists%2#0" - ] - }, - "3288": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%4#0", - "maybe_exists%2#0" - ] - }, - "3290": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%4#0" - ] - }, - "3291": { - "op": "box_del", - "defined_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ] - }, - "3292": { - "op": "pop", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3293": { - "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" - }, - "3296": { - "block": "rbac_revoke_role_after_if_else@7", - "stack_in": [ - "role_address#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1" - ] - }, - "3297": { - "op": "pushint 70", - "defined_out": [ - "70", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "70" - ] - }, - "3299": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%4#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "tmp%4#1" - ] - }, - "3300": { - "op": "bz rbac_revoke_role_after_if_else@9", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3303": { - "op": "bytec 10 // 0x52373023", - "defined_out": [ - "0x52373023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52373023" - ] - }, - "3305": { - "op": "dig 2", - "defined_out": [ - "0x52373023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52373023", - "role_address#0" - ] - }, - "3307": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%6#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%6#0" - ] - }, - "3308": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%6#0", - "box_prefixed_key%6#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%6#0", - "box_prefixed_key%6#0 (copy)" - ] - }, - "3309": { - "op": "box_len", - "defined_out": [ - "_%3#0", - "box_prefixed_key%6#0", - "maybe_exists%3#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%6#0", - "_%3#0", - "maybe_exists%3#0" - ] - }, - "3310": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%6#0", - "maybe_exists%3#0" - ] - }, - "3312": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%6#0" - ] - }, - "3313": { - "op": "box_del", - "defined_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ] - }, - "3314": { - "op": "pop", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3315": { - "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" - }, - "3318": { - "block": "rbac_revoke_role_after_if_else@9", - "stack_in": [ - "role_address#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1" - ] - }, - "3319": { - "op": "pushint 80", - "defined_out": [ - "80", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "80" - ] - }, - "3321": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%5#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "tmp%5#1" - ] - }, - "3322": { - "op": "bz rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3325": { - "op": "bytec 25 // 0x52383023", - "defined_out": [ - "0x52383023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52383023" - ] - }, - "3327": { - "op": "dig 2", - "defined_out": [ - "0x52383023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52383023", - "role_address#0" - ] - }, - "3329": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%8#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%8#0" - ] - }, - "3330": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%8#0", - "box_prefixed_key%8#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%8#0", - "box_prefixed_key%8#0 (copy)" - ] - }, - "3331": { - "op": "box_len", - "defined_out": [ - "_%4#0", - "box_prefixed_key%8#0", - "maybe_exists%4#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%8#0", - "_%4#0", - "maybe_exists%4#0" - ] - }, - "3332": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%8#0", - "maybe_exists%4#0" - ] - }, - "3334": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%8#0" - ] - }, - "3335": { - "op": "box_del", - "defined_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ] - }, - "3336": { - "op": "pop", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3337": { - "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" - }, - "3340": { - "subroutine": "modules.rbac.RbacModule.rbac_gov_asset_suspension[routing]", - "params": {}, - "block": "rbac_gov_asset_suspension", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "3343": { - "op": "dup", - "defined_out": [ - "tmp%0#0", - "tmp%0#0 (copy)" - ], - "stack_out": [ - "tmp%0#0", - "tmp%0#0 (copy)" - ] - }, - "3344": { - "op": "len", - "defined_out": [ - "len%0#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "len%0#0" - ] - }, - "3345": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "len%0#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "len%0#0", - "1" - ] - }, - "3346": { - "op": "==", - "defined_out": [ - "eq%0#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "eq%0#0" - ] - }, - "3347": { - "error": "invalid number of bytes for arc4.bool", - "op": "assert // invalid number of bytes for arc4.bool", - "stack_out": [ - "tmp%0#0" - ] - }, - "3348": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "0" - ] - }, - "3349": { - "op": "getbit", - "defined_out": [ - "suspended#0" - ], - "stack_out": [ - "suspended#0" - ] - }, - "3350": { - "op": "bytec 10 // 0x52373023", - "defined_out": [ - "0x52373023", - "suspended#0" - ], - "stack_out": [ - "suspended#0", - "0x52373023" - ] - }, - "3352": { - "op": "txn Sender", - "defined_out": [ - "0x52373023", - "suspended#0", - "tmp%0#2" - ], - "stack_out": [ - "suspended#0", - "0x52373023", - "tmp%0#2" - ] - }, - "3354": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "suspended#0", - "tmp%1#0" - ], - "stack_out": [ - "suspended#0", - "tmp%1#0" - ] - }, - "3357": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "suspended#0" - ] - }, - "3358": { - "op": "bytec 20 // \"asset_suspended\"", - "defined_out": [ - "\"asset_suspended\"", - "suspended#0" - ], - "stack_out": [ - "suspended#0", - "\"asset_suspended\"" - ] - }, - "3360": { - "op": "swap", - "stack_out": [ - "\"asset_suspended\"", - "suspended#0" - ] - }, - "3361": { - "op": "app_global_put", - "stack_out": [] - }, - "3362": { - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1" - ] - }, - "3364": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0" - ] - }, - "3365": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0", - "0x151f7c75" - ] - }, - "3366": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ] - }, - "3367": { - "op": "concat", - "defined_out": [ - "tmp%4#0" - ], - "stack_out": [ - "tmp%4#0" - ] - }, - "3368": { - "op": "log", - "stack_out": [] - }, - "3369": { - "op": "intc_1 // 1", - "stack_out": [ - "1" - ] - }, - "3370": { - "op": "return", - "stack_out": [] - }, - "3371": { - "subroutine": "modules.rbac.RbacModule.rbac_get_arranger[routing]", - "params": {}, - "block": "rbac_get_arranger", - "stack_in": [], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "0" - ] - }, - "3372": { - "op": "bytec 5 // 0x52323023", - "defined_out": [ - "0", - "0x52323023" - ], - "stack_out": [ - "0", - "0x52323023" - ] - }, - "3374": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "3375": { - "error": "check self.arranger exists", - "op": "assert // check self.arranger exists", - "stack_out": [ - "maybe_value%0#0" - ] - }, - "3376": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "0x151f7c75" - ] - }, - "3377": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "maybe_value%0#0" - ] - }, - "3378": { - "op": "concat", - "defined_out": [ - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0" - ] - }, - "3379": { - "op": "log", - "stack_out": [] - }, - "3380": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "3381": { - "op": "return", - "stack_out": [] - }, - "3382": { - "subroutine": "modules.rbac.RbacModule.rbac_get_address_roles[routing]", - "params": {}, - "block": "rbac_get_address_roles", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "address#0" - ], - "stack_out": [ - "address#0" - ] - }, - "3385": { - "op": "dup", - "defined_out": [ - "address#0", - "address#0 (copy)" - ], - "stack_out": [ - "address#0", - "address#0 (copy)" - ] - }, - "3386": { - "op": "len", - "defined_out": [ - "address#0", - "len%0#0" - ], - "stack_out": [ - "address#0", - "len%0#0" - ] - }, - "3387": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "address#0", - "len%0#0" - ], - "stack_out": [ - "address#0", - "len%0#0", - "32" - ] - }, - "3388": { - "op": "==", - "defined_out": [ - "address#0", - "eq%0#0" - ], - "stack_out": [ - "address#0", - "eq%0#0" - ] - }, - "3389": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "address#0" - ] - }, - "3390": { - "op": "bytec 11 // 0x52343023", - "defined_out": [ - "0x52343023", - "address#0" - ], - "stack_out": [ - "address#0", - "0x52343023" - ] - }, - "3392": { - "op": "dig 1", - "stack_out": [ - "address#0", - "0x52343023", - "address#0 (copy)" - ] - }, - "3394": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "address#0", - "tmp%0#1" - ], - "stack_out": [ - "address#0", - "tmp%0#1" - ] - }, - "3397": { - "op": "bytec 18 // 0x52353023", - "defined_out": [ - "0x52353023", - "address#0", - "tmp%0#1" - ], - "stack_out": [ - "address#0", - "tmp%0#1", - "0x52353023" - ] - }, - "3399": { - "op": "dig 2", - "stack_out": [ - "address#0", - "tmp%0#1", - "0x52353023", - "address#0 (copy)" - ] - }, - "3401": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1" - ], - "stack_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1" - ] - }, - "3404": { - "op": "bytec 17 // 0x52363023", - "defined_out": [ - "0x52363023", - "address#0", - "tmp%0#1", - "tmp%1#1" - ], - "stack_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "0x52363023" - ] - }, - "3406": { - "op": "dig 3", - "stack_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "0x52363023", - "address#0 (copy)" - ] - }, - "3408": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1" - ], - "stack_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1" - ] - }, - "3411": { - "op": "bytec 10 // 0x52373023", - "defined_out": [ - "0x52373023", - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1" - ], - "stack_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "0x52373023" - ] - }, - "3413": { - "op": "dig 4", - "stack_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "0x52373023", - "address#0 (copy)" - ] - }, - "3415": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1" - ], - "stack_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1" - ] - }, - "3418": { - "op": "bytec 25 // 0x52383023", - "defined_out": [ - "0x52383023", - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1" - ], - "stack_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "0x52383023" - ] - }, - "3420": { - "op": "uncover 5", - "stack_out": [ - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "0x52383023", - "address#0" - ] - }, - "3422": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1" - ] - }, - "3425": { - "op": "bytec 28 // 0x00", - "defined_out": [ - "0x00", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1", - "0x00" - ] - }, - "3427": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "0x00", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1", - "0x00", - "0" - ] - }, - "3428": { - "op": "uncover 6", - "stack_out": [ - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1", - "0x00", - "0", - "tmp%0#1" - ] - }, - "3430": { - "op": "setbit", - "defined_out": [ - "aggregate%encoded_bool%0#0", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1", - "aggregate%encoded_bool%0#0" - ] - }, - "3431": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "aggregate%encoded_bool%0#0", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1", - "aggregate%encoded_bool%0#0", - "1" - ] - }, - "3432": { - "op": "uncover 5", - "stack_out": [ - "tmp%2#1", - "tmp%3#1", - "tmp%4#1", - "aggregate%encoded_bool%0#0", - "1", - "tmp%1#1" - ] - }, - "3434": { - "op": "setbit", - "defined_out": [ - "aggregate%set_bit%0#0", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%2#1", - "tmp%3#1", - "tmp%4#1", - "aggregate%set_bit%0#0" - ] - }, - "3435": { - "op": "pushint 2", - "defined_out": [ - "2", - "aggregate%set_bit%0#0", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%2#1", - "tmp%3#1", - "tmp%4#1", - "aggregate%set_bit%0#0", - "2" - ] - }, - "3437": { - "op": "uncover 4", - "stack_out": [ - "tmp%3#1", - "tmp%4#1", - "aggregate%set_bit%0#0", - "2", - "tmp%2#1" - ] - }, - "3439": { - "op": "setbit", - "defined_out": [ - "aggregate%set_bit%1#0", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%3#1", - "tmp%4#1", - "aggregate%set_bit%1#0" - ] - }, - "3440": { - "op": "pushint 3", - "defined_out": [ - "3", - "aggregate%set_bit%1#0", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%3#1", - "tmp%4#1", - "aggregate%set_bit%1#0", - "3" - ] - }, - "3442": { - "op": "uncover 3", - "stack_out": [ - "tmp%4#1", - "aggregate%set_bit%1#0", - "3", - "tmp%3#1" - ] - }, - "3444": { - "op": "setbit", - "defined_out": [ - "aggregate%set_bit%2#0", - "tmp%4#1" - ], - "stack_out": [ - "tmp%4#1", - "aggregate%set_bit%2#0" - ] - }, - "3445": { - "op": "pushint 4", - "defined_out": [ - "4", - "aggregate%set_bit%2#0", - "tmp%4#1" - ], - "stack_out": [ - "tmp%4#1", - "aggregate%set_bit%2#0", - "4" - ] - }, - "3447": { - "op": "uncover 2", - "stack_out": [ - "aggregate%set_bit%2#0", - "4", - "tmp%4#1" - ] - }, - "3449": { - "op": "setbit", - "defined_out": [ - "aggregate%set_bit%3#0" - ], - "stack_out": [ - "aggregate%set_bit%3#0" - ] - }, - "3450": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%set_bit%3#0" - ], - "stack_out": [ - "aggregate%set_bit%3#0", - "0x151f7c75" - ] - }, - "3451": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%set_bit%3#0" - ] - }, - "3452": { - "op": "concat", - "defined_out": [ - "tmp%8#0" - ], - "stack_out": [ - "tmp%8#0" - ] - }, - "3453": { - "op": "log", - "stack_out": [] - }, - "3454": { - "op": "intc_1 // 1", - "stack_out": [ - "1" - ] - }, - "3455": { - "op": "return", - "stack_out": [] - }, - "3456": { - "subroutine": "modules.rbac.RbacModule.rbac_get_role_config[routing]", - "params": {}, - "block": "rbac_get_role_config", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "role_id#0" - ], - "stack_out": [ - "role_id#0" - ] - }, - "3459": { - "op": "dup", - "defined_out": [ - "role_id#0", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0", - "role_id#0 (copy)" - ] - }, - "3460": { - "op": "len", - "defined_out": [ - "len%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "len%0#0" - ] - }, - "3461": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "len%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "len%0#0", - "1" - ] - }, - "3462": { - "op": "==", - "defined_out": [ - "eq%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "eq%0#0" - ] - }, - "3463": { - "error": "invalid number of bytes for arc4.uint8", - "op": "assert // invalid number of bytes for arc4.uint8", - "stack_out": [ - "role_id#0" - ] - }, - "3464": { - "op": "txna ApplicationArgs 2" - }, - "3467": { - "op": "dup", - "defined_out": [ - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "role_address#0", - "role_address#0" - ] - }, - "3468": { - "op": "cover 2", - "defined_out": [ - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "role_address#0" - ] - }, - "3470": { - "op": "len", - "defined_out": [ - "len%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "len%1#0" - ] - }, - "3471": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "len%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "len%1#0", - "32" - ] - }, - "3472": { - "op": "==", - "defined_out": [ - "eq%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "eq%1#0" - ] - }, - "3473": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "role_address#0", - "role_id#0" - ] - }, - "3474": { - "op": "btoi", - "defined_out": [ - "role#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "role#0" - ] - }, - "3475": { - "op": "dup", - "defined_out": [ - "role#0", - "role#0 (copy)", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "role#0", - "role#0 (copy)" - ] - }, - "3476": { - "callsub": "modules.rbac.RbacModule._assert_valid_role", - "op": "callsub _assert_valid_role", - "stack_out": [ - "role_address#0", - "role#0" - ] - }, - "3479": { - "op": "pushints 20 40 50 60 70 80", - "defined_out": [ - "20", - "40", - "50", - "60", - "70", - "80", - "role#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "role#0", - "20", - "40", - "50", - "60", - "70", - "80" - ] - }, - "3487": { - "op": "uncover 6", - "stack_out": [ - "role_address#0", - "20", - "40", - "50", - "60", - "70", - "80", - "role#0" - ] - }, - "3489": { - "op": "match rbac_get_role_config_switch_case_0@2 rbac_get_role_config_switch_case_1@3 rbac_get_role_config_switch_case_2@4 rbac_get_role_config_switch_case_3@5 rbac_get_role_config_switch_case_4@6 rbac_get_role_config_switch_case_5@7", - "stack_out": [ - "role_address#0" - ] - }, - "3503": { - "error": "Invalid role identifier", - "op": "err // Invalid role identifier" - }, - "3504": { - "block": "rbac_get_role_config_switch_case_5@7", - "stack_in": [ - "role_address#0" - ], - "op": "bytec 25 // 0x52383023", - "defined_out": [ - "0x52383023" - ], - "stack_out": [ - "role_address#0", - "0x52383023" - ] - }, - "3506": { - "op": "dig 1", - "defined_out": [ - "0x52383023", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "0x52383023", - "role_address#0" - ] - }, - "3508": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "3509": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "3510": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "3511": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "3513": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "3514": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%8#0", - "aggregate%box_get%9#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "aggregate%box_get%8#0", - "aggregate%box_get%9#0" - ] - }, - "3515": { - "op": "pop", - "defined_out": [ - "role_address#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "tmp%3#0" - ] - }, - "3516": { - "block": "rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9", - "stack_in": [ - "role_address#0", - "tmp%3#0" - ], - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75" - ], - "stack_out": [ - "role_address#0", - "tmp%3#0", - "0x151f7c75" - ] - }, - "3517": { - "op": "swap", - "defined_out": [ - "0x151f7c75", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "0x151f7c75", - "tmp%3#0" - ] - }, - "3518": { - "op": "concat", - "defined_out": [ - "tmp%4#0" - ], - "stack_out": [ - "role_address#0", - "tmp%4#0" - ] - }, - "3519": { - "op": "log", - "stack_out": [ - "role_address#0" - ] - }, - "3520": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "role_address#0", - "1" - ] - }, - "3521": { - "op": "return", - "stack_out": [ - "role_address#0" - ] - }, - "3522": { - "block": "rbac_get_role_config_switch_case_4@6", - "stack_in": [ - "role_address#0" - ], - "op": "bytec 10 // 0x52373023", - "defined_out": [ - "0x52373023" - ], - "stack_out": [ - "role_address#0", - "0x52373023" - ] - }, - "3524": { - "op": "dig 1", - "defined_out": [ - "0x52373023", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "0x52373023", - "role_address#0" - ] - }, - "3526": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "3527": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "3528": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "3529": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "3531": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "3532": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%6#0", - "aggregate%box_get%7#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "aggregate%box_get%6#0", - "aggregate%box_get%7#0" - ] - }, - "3533": { - "op": "pop", - "defined_out": [ - "role_address#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "tmp%3#0" - ] - }, - "3534": { - "op": "b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9" - }, - "3537": { - "block": "rbac_get_role_config_switch_case_3@5", - "stack_in": [ - "role_address#0" - ], - "op": "bytec 17 // 0x52363023", - "defined_out": [ - "0x52363023" - ], - "stack_out": [ - "role_address#0", - "0x52363023" - ] - }, - "3539": { - "op": "dig 1", - "defined_out": [ - "0x52363023", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "0x52363023", - "role_address#0" - ] - }, - "3541": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "3542": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "3543": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "3544": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "3546": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "3547": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%4#0", - "aggregate%box_get%5#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "aggregate%box_get%4#0", - "aggregate%box_get%5#0" - ] - }, - "3548": { - "op": "pop", - "defined_out": [ - "role_address#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "tmp%3#0" - ] - }, - "3549": { - "op": "b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9" - }, - "3552": { - "block": "rbac_get_role_config_switch_case_2@4", - "stack_in": [ - "role_address#0" - ], - "op": "bytec 18 // 0x52353023", - "defined_out": [ - "0x52353023" - ], - "stack_out": [ - "role_address#0", - "0x52353023" - ] - }, - "3554": { - "op": "dig 1", - "defined_out": [ - "0x52353023", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "0x52353023", - "role_address#0" - ] - }, - "3556": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "3557": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "3558": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "3559": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "3561": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "3562": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%2#0", - "aggregate%box_get%3#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "aggregate%box_get%2#0", - "aggregate%box_get%3#0" - ] - }, - "3563": { - "op": "pop", - "defined_out": [ - "role_address#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "tmp%3#0" - ] - }, - "3564": { - "op": "b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9" - }, - "3567": { - "block": "rbac_get_role_config_switch_case_1@3", - "stack_in": [ - "role_address#0" - ], - "op": "bytec 11 // 0x52343023", - "defined_out": [ - "0x52343023" - ], - "stack_out": [ - "role_address#0", - "0x52343023" - ] - }, - "3569": { - "op": "dig 1", - "defined_out": [ - "0x52343023", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "0x52343023", - "role_address#0" - ] - }, - "3571": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "3572": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "3573": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "3574": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "3576": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "3577": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "3578": { - "op": "pop", - "defined_out": [ - "role_address#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "tmp%3#0" - ] - }, - "3579": { - "op": "b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9" - }, - "3582": { - "block": "rbac_get_role_config_switch_case_0@2", - "stack_in": [ - "role_address#0" - ], - "op": "pushbytes 0x00000000000000000000000000000000", - "defined_out": [ - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "tmp%3#0" - ] - }, - "3600": { - "op": "b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9" - }, - "3603": { - "subroutine": "modules.core_financial.no_coupon.NoCouponCashflowMixin.day_count_factor", - "params": {}, - "block": "day_count_factor", - "stack_in": [], - "op": "proto 0 1" - }, - "3606": { - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "3608": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "0" - ] - }, - "3609": { - "op": "bytec 8 // \"issuance_date\"", - "defined_out": [ - "\"issuance_date\"", - "0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "0", - "\"issuance_date\"" - ] - }, - "3611": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "3612": { - "error": "check self.issuance_date exists", - "op": "assert // check self.issuance_date exists", - "stack_out": [ - "tmp%0#0", - "maybe_value%0#0" - ] - }, - "3613": { - "op": "swap", - "stack_out": [ - "maybe_value%0#0", - "tmp%0#0" - ] - }, - "3614": { - "op": "dig 1", - "defined_out": [ - "maybe_value%0#0", - "maybe_value%0#0 (copy)", - "tmp%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "tmp%0#0", - "maybe_value%0#0 (copy)" - ] - }, - "3616": { - "op": "-", - "defined_out": [ - "accrued_period#0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "accrued_period#0" - ] - }, - "3617": { - "op": "swap", - "defined_out": [ - "accrued_period#0", - "maybe_value%0#0" - ], - "stack_out": [ - "accrued_period#0", - "maybe_value%0#0" - ] - }, - "3618": { - "op": "intc_0 // 0", - "stack_out": [ - "accrued_period#0", - "maybe_value%0#0", - "0" - ] - }, - "3619": { - "op": "bytec 4 // \"maturity_date\"", - "defined_out": [ - "\"maturity_date\"", - "0", - "accrued_period#0", - "maybe_value%0#0" - ], - "stack_out": [ - "accrued_period#0", - "maybe_value%0#0", - "0", - "\"maturity_date\"" - ] - }, - "3621": { - "op": "app_global_get_ex", - "defined_out": [ - "accrued_period#0", - "maybe_exists%1#0", - "maybe_value%0#0", - "maybe_value%1#0" - ], - "stack_out": [ - "accrued_period#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "3622": { - "error": "check self.maturity_date exists", - "op": "assert // check self.maturity_date exists", - "stack_out": [ - "accrued_period#0", - "maybe_value%0#0", - "maybe_value%1#0" - ] - }, - "3623": { - "op": "swap", - "stack_out": [ - "accrued_period#0", - "maybe_value%1#0", - "maybe_value%0#0" - ] - }, - "3624": { - "op": "-", - "defined_out": [ - "accrued_period#0", - "principal_period#0" - ], - "stack_out": [ - "accrued_period#0", - "principal_period#0" - ] - }, - "3625": { - "op": "intc_0 // 0", - "stack_out": [ - "accrued_period#0", - "principal_period#0", - "0" - ] - }, - "3626": { - "op": "bytec 14 // \"day_count_convention\"", - "defined_out": [ - "\"day_count_convention\"", - "0", - "accrued_period#0", - "principal_period#0" - ], - "stack_out": [ - "accrued_period#0", - "principal_period#0", - "0", - "\"day_count_convention\"" - ] - }, - "3628": { - "op": "app_global_get_ex", - "defined_out": [ - "accrued_period#0", - "maybe_exists%3#0", - "maybe_value%3#0", - "principal_period#0" - ], - "stack_out": [ - "accrued_period#0", - "principal_period#0", - "maybe_value%3#0", - "maybe_exists%3#0" - ] - }, - "3629": { - "error": "check self.day_count_convention exists", - "op": "assert // check self.day_count_convention exists", - "stack_out": [ - "accrued_period#0", - "principal_period#0", - "maybe_value%3#0" - ] - }, - "3630": { - "op": "bnz day_count_factor_after_if_else@2", - "stack_out": [ - "accrued_period#0", - "principal_period#0" - ] - }, - "3633": { - "op": "frame_dig 0", - "stack_out": [ - "accrued_period#0", - "principal_period#0", - "accrued_period#0" - ] - }, - "3635": { - "op": "intc 5 // 86400", - "defined_out": [ - "86400", - "accrued_period#0", - "principal_period#0" - ], - "stack_out": [ - "accrued_period#0", - "principal_period#0", - "accrued_period#0", - "86400" - ] - }, - "3637": { - "op": "/", - "stack_out": [ - "accrued_period#0", - "principal_period#0", - "accrued_period#0" - ] - }, - "3638": { - "op": "frame_bury 0", - "stack_out": [ - "accrued_period#0", - "principal_period#0" - ] - }, - "3640": { - "op": "intc 5 // 86400", - "stack_out": [ - "accrued_period#0", - "principal_period#0", - "86400" - ] - }, - "3642": { - "op": "/", - "stack_out": [ - "accrued_period#0", - "principal_period#0" - ] - }, - "3643": { - "block": "day_count_factor_after_if_else@2", - "stack_in": [ - "accrued_period#0", - "principal_period#0" - ], - "op": "frame_dig 0", - "defined_out": [ - "accrued_period#0" - ], - "stack_out": [ - "accrued_period#0", - "principal_period#0", - "accrued_period#0" - ] - }, - "3645": { - "op": "itob", - "defined_out": [ - "accrued_period#0", - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "accrued_period#0", - "principal_period#0", - "aggregate%val_as_bytes%0#0" - ] - }, - "3646": { - "op": "swap", - "defined_out": [ - "accrued_period#0", - "aggregate%val_as_bytes%0#0", - "principal_period#0" - ], - "stack_out": [ - "accrued_period#0", - "aggregate%val_as_bytes%0#0", - "principal_period#0" - ] - }, - "3647": { - "op": "itob", - "defined_out": [ - "accrued_period#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0" - ], - "stack_out": [ - "accrued_period#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0" - ] - }, - "3648": { - "op": "concat", - "defined_out": [ - "accrued_period#0", - "aggregate%head%1#0" - ], - "stack_out": [ - "accrued_period#0", - "aggregate%head%1#0" - ] - }, - "3649": { - "op": "swap" - }, - "3650": { - "retsub": true, - "op": "retsub" - }, - "3651": { - "subroutine": "modules.core_financial.no_coupon.NoCouponCashflowMixin.accrued_interest_amount", - "params": { - "holding_address#0": "bytes", - "units#0": "uint64" - }, - "block": "accrued_interest_amount", - "stack_in": [], - "op": "proto 2 1" - }, - "3654": { - "callsub": "modules.core_financial.no_coupon.NoCouponCashflowMixin.day_count_factor", - "op": "callsub day_count_factor", - "defined_out": [ - "day_count_factor#0" - ], - "stack_out": [ - "day_count_factor#0" - ] - }, - "3657": { - "op": "dup", - "defined_out": [ - "day_count_factor#0", - "day_count_factor#0 (copy)" - ], - "stack_out": [ - "day_count_factor#0", - "day_count_factor#0 (copy)" - ] - }, - "3658": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "day_count_factor#0", - "day_count_factor#0 (copy)" - ], - "stack_out": [ - "day_count_factor#0", - "day_count_factor#0 (copy)", - "0" - ] - }, - "3659": { - "op": "extract_uint64", - "defined_out": [ - "accrued_period#0", - "day_count_factor#0" - ], - "stack_out": [ - "day_count_factor#0", - "accrued_period#0" - ] - }, - "3660": { - "op": "swap", - "stack_out": [ - "accrued_period#0", - "day_count_factor#0" - ] - }, - "3661": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "accrued_period#0", - "day_count_factor#0" - ], - "stack_out": [ - "accrued_period#0", - "day_count_factor#0", - "8" - ] - }, - "3662": { - "op": "extract_uint64", - "defined_out": [ - "accrued_period#0", - "principal_period#0" - ], - "stack_out": [ - "accrued_period#0", - "principal_period#0" - ] - }, - "3663": { - "op": "frame_dig -2", - "defined_out": [ - "accrued_period#0", - "holding_address#0 (copy)", - "principal_period#0" - ], - "stack_out": [ - "accrued_period#0", - "principal_period#0", - "holding_address#0 (copy)" - ] - }, - "3665": { - "op": "frame_dig -1", - "defined_out": [ - "accrued_period#0", - "holding_address#0 (copy)", - "principal_period#0", - "units#0 (copy)" - ], - "stack_out": [ - "accrued_period#0", - "principal_period#0", - "holding_address#0 (copy)", - "units#0 (copy)" - ] - }, - "3667": { - "callsub": "modules.accounting.AccountingModule.account_units_value", - "op": "callsub account_units_value", - "defined_out": [ - "accrued_period#0", - "principal_period#0", - "tmp%1#0" - ], - "stack_out": [ - "accrued_period#0", - "principal_period#0", - "tmp%1#0" - ] - }, - "3670": { - "op": "intc_0 // 0", - "stack_out": [ - "accrued_period#0", - "principal_period#0", - "tmp%1#0", - "0" - ] - }, - "3671": { - "op": "bytec 15 // \"principal_discount\"", - "defined_out": [ - "\"principal_discount\"", - "0", - "accrued_period#0", - "principal_period#0", - "tmp%1#0" - ], - "stack_out": [ - "accrued_period#0", - "principal_period#0", - "tmp%1#0", - "0", - "\"principal_discount\"" - ] - }, - "3673": { - "op": "app_global_get_ex", - "defined_out": [ - "accrued_period#0", - "maybe_exists%0#0", - "maybe_value%0#0", - "principal_period#0", - "tmp%1#0" - ], - "stack_out": [ - "accrued_period#0", - "principal_period#0", - "tmp%1#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "3674": { - "error": "check self.principal_discount exists", - "op": "assert // check self.principal_discount exists", - "stack_out": [ - "accrued_period#0", - "principal_period#0", - "tmp%1#0", - "maybe_value%0#0" - ] - }, - "3675": { - "op": "*", - "defined_out": [ - "accrued_period#0", - "principal_period#0", - "tmp%2#0" - ], - "stack_out": [ - "accrued_period#0", - "principal_period#0", - "tmp%2#0" - ] - }, - "3676": { - "op": "uncover 2", - "stack_out": [ - "principal_period#0", - "tmp%2#0", - "accrued_period#0" - ] - }, - "3678": { - "op": "*", - "defined_out": [ - "principal_period#0", - "tmp%3#0" - ], - "stack_out": [ - "principal_period#0", - "tmp%3#0" - ] - }, - "3679": { - "op": "pushint 10000", - "defined_out": [ - "10000", - "principal_period#0", - "tmp%3#0" - ], - "stack_out": [ - "principal_period#0", - "tmp%3#0", - "10000" - ] - }, - "3682": { - "op": "uncover 2", - "stack_out": [ - "tmp%3#0", - "10000", - "principal_period#0" - ] - }, - "3684": { - "op": "*", - "defined_out": [ - "tmp%3#0", - "tmp%4#0" - ], - "stack_out": [ - "tmp%3#0", - "tmp%4#0" - ] - }, - "3685": { - "op": "/", - "defined_out": [ - "tmp%5#0" - ], - "stack_out": [ - "tmp%5#0" - ] - }, - "3686": { - "retsub": true, - "op": "retsub" - }, - "3687": { - "subroutine": "modules.core_financial.common.CoreFinancialCommonMixin.assert_time_events_sorted", - "params": { - "time_events#0": "bytes" - }, - "block": "assert_time_events_sorted", - "stack_in": [], - "op": "proto 1 1" - }, - "3690": { - "op": "pushbytes \"\"", - "stack_out": [ - "time_f#0" - ] - }, - "3692": { - "op": "dupn 2", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0" - ] - }, - "3694": { - "op": "frame_dig -1", - "defined_out": [ - "time_events#0 (copy)" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "time_events#0 (copy)" - ] - }, - "3696": { - "op": "extract 2 0", - "defined_out": [ - "aggregate%array_trimmed%0#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0" - ] - }, - "3699": { - "op": "frame_dig -1", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "time_events#0 (copy)" - ] - }, - "3701": { - "op": "pushint 2", - "defined_out": [ - "2", - "aggregate%array_trimmed%0#0", - "time_events#0 (copy)" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "time_events#0 (copy)", - "2" - ] - }, - "3703": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "values%0#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "values%0#0" - ] - }, - "3704": { - "op": "global LatestTimestamp", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "tmp%0#0", - "values%0#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "values%0#0", - "tmp%0#0" - ] - }, - "3706": { - "op": ">", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "tmp%1#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%1#0" - ] - }, - "3707": { - "error": "Time events must be set in the future", - "op": "assert // Time events must be set in the future", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0" - ] - }, - "3708": { - "op": "frame_dig -1", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "time_events#0 (copy)" - ] - }, - "3710": { - "op": "intc_0 // 0", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "time_events#0 (copy)", - "0" - ] - }, - "3711": { - "error": "invalid array length header", - "op": "extract_uint16 // on error: invalid array length header", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_trimmed%0#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "aggregate%array_length%0#0" - ] - }, - "3712": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "aggregate%array_length%0#0", - "aggregate%array_trimmed%0#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "aggregate%array_length%0#0", - "1" - ] - }, - "3713": { - "op": "-", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "tmp%3#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0" - ] - }, - "3714": { - "op": "intc_0 // 0", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "tmp%3#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ] - }, - "3715": { - "block": "assert_time_events_sorted_for_header@1", - "stack_in": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ], - "op": "frame_dig 5", - "defined_out": [ - "idx#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "idx#0" - ] - }, - "3717": { - "op": "frame_dig 4", - "defined_out": [ - "idx#0", - "tmp%3#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "idx#0", - "tmp%3#0" - ] - }, - "3719": { - "op": "<", - "defined_out": [ - "continue_looping%0#0", - "idx#0", - "tmp%3#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "continue_looping%0#0" - ] - }, - "3720": { - "op": "bz assert_time_events_sorted_after_for@6", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ] - }, - "3723": { - "block": "assert_time_events_sorted_while_top@8", - "stack_in": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ], - "op": "pushint 75", - "defined_out": [ - "75" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "75" - ] - }, - "3725": { - "op": "global OpcodeBudget", - "defined_out": [ - "75", - "tmp%1#1" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "75", - "tmp%1#1" - ] - }, - "3727": { - "op": ">", - "defined_out": [ - "tmp%2#1" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "tmp%2#1" - ] - }, - "3728": { - "op": "bz assert_time_events_sorted_after_while@13", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ] - }, - "3731": { - "op": "itxn_begin" - }, - "3732": { - "op": "pushint 6 // appl", - "defined_out": [ - "appl" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "appl" - ] - }, - "3734": { - "op": "itxn_field TypeEnum", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ] - }, - "3736": { - "op": "pushint 5 // DeleteApplication", - "defined_out": [ - "DeleteApplication" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "DeleteApplication" - ] - }, - "3738": { - "op": "itxn_field OnCompletion", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ] - }, - "3740": { - "op": "bytec 31 // 0x068101", - "defined_out": [ - "0x068101" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "0x068101" - ] - }, - "3742": { - "op": "itxn_field ApprovalProgram", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ] - }, - "3744": { - "op": "bytec 31 // 0x068101", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "0x068101" - ] - }, - "3746": { - "op": "itxn_field ClearStateProgram", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ] - }, - "3748": { - "op": "global MinTxnFee", - "defined_out": [ - "tmp%3#1" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "tmp%3#1" - ] - }, - "3750": { - "op": "itxn_field Fee", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ] - }, - "3752": { - "op": "itxn_submit" - }, - "3753": { - "op": "b assert_time_events_sorted_while_top@8" - }, - "3756": { - "block": "assert_time_events_sorted_after_while@13", - "stack_in": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ], - "op": "frame_dig 5", - "defined_out": [ - "idx#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "idx#0" - ] - }, - "3758": { - "op": "dup", - "defined_out": [ - "idx#0", - "idx#0 (copy)" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "idx#0", - "idx#0 (copy)" - ] - }, - "3759": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "idx#0", - "idx#0 (copy)" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "idx#0", - "idx#0 (copy)", - "8" - ] - }, - "3760": { - "op": "*", - "defined_out": [ - "aggregate%bytes_offset%1#0", - "idx#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "idx#0", - "aggregate%bytes_offset%1#0" - ] - }, - "3761": { - "op": "frame_dig 3", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "aggregate%bytes_offset%1#0", - "idx#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "idx#0", - "aggregate%bytes_offset%1#0", - "aggregate%array_trimmed%0#0" - ] - }, - "3763": { - "op": "dup", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "aggregate%array_trimmed%0#0 (copy)", - "aggregate%bytes_offset%1#0", - "idx#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "idx#0", - "aggregate%bytes_offset%1#0", - "aggregate%array_trimmed%0#0 (copy)", - "aggregate%array_trimmed%0#0 (copy)" - ] - }, - "3764": { - "op": "cover 3", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "aggregate%array_trimmed%0#0", - "idx#0", - "aggregate%bytes_offset%1#0", - "aggregate%array_trimmed%0#0 (copy)" - ] - }, - "3766": { - "op": "swap", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "aggregate%array_trimmed%0#0", - "idx#0", - "aggregate%array_trimmed%0#0 (copy)", - "aggregate%bytes_offset%1#0" - ] - }, - "3767": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "time_i#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "aggregate%array_trimmed%0#0", - "idx#0", - "time_i#0" - ] - }, - "3768": { - "op": "dup", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "aggregate%array_trimmed%0#0", - "idx#0", - "time_i#0", - "time_i#0 (copy)" - ] - }, - "3769": { - "op": "cover 3", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_i#0", - "aggregate%array_trimmed%0#0", - "idx#0", - "time_i#0" - ] - }, - "3771": { - "op": "frame_bury 1", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "time_i#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_i#0", - "aggregate%array_trimmed%0#0", - "idx#0" - ] - }, - "3773": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "aggregate%array_trimmed%0#0", - "idx#0", - "time_i#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_i#0", - "aggregate%array_trimmed%0#0", - "idx#0", - "1" - ] - }, - "3774": { - "op": "+", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "time_i#0", - "tmp%4#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_i#0", - "aggregate%array_trimmed%0#0", - "tmp%4#0" - ] - }, - "3775": { - "op": "dup", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_i#0", - "aggregate%array_trimmed%0#0", - "tmp%4#0", - "tmp%4#0" - ] - }, - "3776": { - "op": "frame_bury 2", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "time_i#0", - "tmp%4#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_i#0", - "aggregate%array_trimmed%0#0", - "tmp%4#0" - ] - }, - "3778": { - "op": "intc_3 // 8", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_i#0", - "aggregate%array_trimmed%0#0", - "tmp%4#0", - "8" - ] - }, - "3779": { - "op": "*", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "aggregate%bytes_offset%2#0", - "idx#0", - "time_i#0", - "tmp%4#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_i#0", - "aggregate%array_trimmed%0#0", - "aggregate%bytes_offset%2#0" - ] - }, - "3780": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "time_f#0", - "time_i#0", - "tmp%4#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_i#0", - "time_f#0" - ] - }, - "3781": { - "op": "dup", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_i#0", - "time_f#0", - "time_f#0" - ] - }, - "3782": { - "op": "frame_bury 0", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "time_f#0", - "time_i#0", - "tmp%4#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_i#0", - "time_f#0" - ] - }, - "3784": { - "op": "<", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "time_f#0", - "time_i#0", - "tmp%4#0", - "tmp%5#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "tmp%5#0" - ] - }, - "3785": { - "error": "Time events must be sorted in strictly ascending order", - "op": "assert // Time events must be sorted in strictly ascending order", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ] - }, - "3786": { - "op": "intc_0 // 0", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "0" - ] - }, - "3787": { - "op": "bytec 14 // \"day_count_convention\"", - "defined_out": [ - "\"day_count_convention\"", - "0", - "aggregate%array_trimmed%0#0", - "idx#0", - "time_f#0", - "time_i#0", - "tmp%4#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "0", - "\"day_count_convention\"" - ] - }, - "3789": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "maybe_exists%0#0", - "maybe_value%0#0", - "time_f#0", - "time_i#0", - "tmp%4#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "3790": { - "error": "check self.day_count_convention exists", - "op": "assert // check self.day_count_convention exists", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "maybe_value%0#0" - ] - }, - "3791": { - "op": "pushint 255", - "defined_out": [ - "255", - "aggregate%array_trimmed%0#0", - "idx#0", - "maybe_value%0#0", - "time_f#0", - "time_i#0", - "tmp%4#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "maybe_value%0#0", - "255" - ] - }, - "3794": { - "op": "!=", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "time_f#0", - "time_i#0", - "tmp%4#0", - "tmp%6#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "tmp%6#0" - ] - }, - "3795": { - "op": "bz assert_time_events_sorted_after_if_else@4", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ] - }, - "3798": { - "op": "frame_dig 0", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_f#0" - ] - }, - "3800": { - "op": "frame_dig 1", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_f#0", - "time_i#0" - ] - }, - "3802": { - "op": "-", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "time_f#0", - "time_i#0", - "tmp%4#0", - "tmp%7#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "tmp%7#0" - ] - }, - "3803": { - "op": "intc 5 // 86400", - "defined_out": [ - "86400", - "aggregate%array_trimmed%0#0", - "idx#0", - "time_f#0", - "time_i#0", - "tmp%4#0", - "tmp%7#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "tmp%7#0", - "86400" - ] - }, - "3805": { - "op": "%", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "time_f#0", - "time_i#0", - "tmp%4#0", - "tmp%8#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "tmp%8#0" - ] - }, - "3806": { - "op": "!", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "time_f#0", - "time_i#0", - "tmp%4#0", - "tmp%9#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "tmp%9#0" - ] - }, - "3807": { - "error": "Time periods in Actual/Actual day count convention must be multiples of a day (in seconds)", - "op": "assert // Time periods in Actual/Actual day count convention must be multiples of a day (in seconds)", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ] - }, - "3808": { - "block": "assert_time_events_sorted_after_if_else@4", - "stack_in": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ], - "op": "frame_dig 2", - "defined_out": [ - "idx#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "idx#0" - ] - }, - "3810": { - "op": "frame_bury 5", - "defined_out": [ - "idx#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ] - }, - "3812": { - "op": "b assert_time_events_sorted_for_header@1" - }, - "3815": { - "block": "assert_time_events_sorted_after_for@6", - "stack_in": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ], - "op": "frame_dig -1", - "defined_out": [ - "time_events#0 (copy)" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_events#0 (copy)" - ] - }, - "3817": { - "op": "frame_bury 0" - }, - "3819": { - "retsub": true, - "op": "retsub" - }, - "3820": { - "subroutine": "modules.accounting.AccountingModule.assert_is_not_account_suspended", - "params": { - "holding_address#0": "bytes" - }, - "block": "assert_is_not_account_suspended", - "stack_in": [], - "op": "proto 1 0" - }, - "3823": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023" - ], - "stack_out": [ - "0x52333023" - ] - }, - "3824": { - "op": "frame_dig -1", - "defined_out": [ - "0x52333023", - "holding_address#0 (copy)" - ], - "stack_out": [ - "0x52333023", - "holding_address#0 (copy)" - ] - }, - "3826": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0" - ] - }, - "3827": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ], - "stack_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "3828": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%box_get%0#0" - ] - }, - "3829": { - "op": "pushint 448", - "defined_out": [ - "448", - "aggregate%box_get%0#0" - ], - "stack_out": [ - "aggregate%box_get%0#0", - "448" - ] - }, - "3832": { - "op": "getbit", - "defined_out": [ - "aggregate%get_bit%0#0" - ], - "stack_out": [ - "aggregate%get_bit%0#0" - ] - }, - "3833": { - "op": "!", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "3834": { - "error": "Suspended operations", - "op": "assert // Suspended operations", - "stack_out": [] - }, - "3835": { - "retsub": true, - "op": "retsub" - }, - "3836": { - "subroutine": "modules.accounting.AccountingModule.account_units_value", - "params": { - "holding_address#0": "bytes", - "units#0": "uint64" - }, - "block": "account_units_value", - "stack_in": [], - "op": "proto 2 1" - }, - "3839": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023" - ], - "stack_out": [ - "0x52333023" - ] - }, - "3840": { - "op": "frame_dig -2", - "defined_out": [ - "0x52333023", - "holding_address#0 (copy)" - ], - "stack_out": [ - "0x52333023", - "holding_address#0 (copy)" - ] - }, - "3842": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0" - ] - }, - "3843": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ], - "stack_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "3844": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%box_get%0#0" - ] - }, - "3845": { - "op": "pushint 40", - "defined_out": [ - "40", - "aggregate%box_get%0#0" - ], - "stack_out": [ - "aggregate%box_get%0#0", - "40" - ] - }, - "3847": { - "op": "extract_uint64", - "defined_out": [ - "values%0#0" - ], - "stack_out": [ - "values%0#0" - ] - }, - "3848": { - "op": "frame_dig -1", - "defined_out": [ - "units#0 (copy)", - "values%0#0" - ], - "stack_out": [ - "values%0#0", - "units#0 (copy)" - ] - }, - "3850": { - "op": "*", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "3851": { - "retsub": true, - "op": "retsub" - }, - "3852": { - "subroutine": "modules.accounting.AccountingModule.account_total_units_value", - "params": { - "holding_address#0": "bytes" - }, - "block": "account_total_units_value", - "stack_in": [], - "op": "proto 1 1" - }, - "3855": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023" - ], - "stack_out": [ - "0x52333023" - ] - }, - "3856": { - "op": "frame_dig -1", - "defined_out": [ - "0x52333023", - "holding_address#0 (copy)" - ], - "stack_out": [ - "0x52333023", - "holding_address#0 (copy)" - ] - }, - "3858": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0" - ] - }, - "3859": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ], - "stack_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "3860": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%box_get%0#0" - ] - }, - "3861": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "aggregate%box_get%0#0" - ], - "stack_out": [ - "aggregate%box_get%0#0", - "32" - ] - }, - "3862": { - "op": "extract_uint64", - "defined_out": [ - "values%0#0" - ], - "stack_out": [ - "values%0#0" - ] - }, - "3863": { - "op": "frame_dig -1", - "stack_out": [ - "values%0#0", - "holding_address#0 (copy)" - ] - }, - "3865": { - "op": "swap", - "stack_out": [ - "holding_address#0 (copy)", - "values%0#0" - ] - }, - "3866": { - "callsub": "modules.accounting.AccountingModule.account_units_value", - "op": "callsub account_units_value", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "3869": { - "retsub": true, - "op": "retsub" - }, - "3870": { - "subroutine": "modules.accounting.AccountingModule.end_if_no_circulating_units", - "params": {}, - "block": "end_if_no_circulating_units", - "stack_in": [], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "0" - ] - }, - "3871": { - "op": "bytec_3 // \"circulating_units\"", - "defined_out": [ - "\"circulating_units\"", - "0" - ], - "stack_out": [ - "0", - "\"circulating_units\"" - ] - }, - "3872": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "3873": { - "error": "check self.circulating_units exists", - "op": "assert // check self.circulating_units exists", - "stack_out": [ - "maybe_value%0#0" - ] - }, - "3874": { - "op": "bnz end_if_no_circulating_units_after_if_else@2", - "stack_out": [] - }, - "3877": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"" - ], - "stack_out": [ - "\"status\"" - ] - }, - "3878": { - "op": "intc 4 // 200", - "defined_out": [ - "\"status\"", - "200" - ], - "stack_out": [ - "\"status\"", - "200" - ] - }, - "3880": { - "op": "app_global_put", - "stack_out": [] - }, - "3881": { - "block": "end_if_no_circulating_units_after_if_else@2", - "stack_in": [], - "retsub": true, - "op": "retsub" - }, - "3882": { - "subroutine": "modules.rbac.RbacModule._role_is_active", - "params": { - "role_map#0": "bytes", - "role_address#0": "bytes" - }, - "block": "_role_is_active", - "stack_in": [], - "op": "proto 2 1" - }, - "3885": { - "op": "pushbytes \"\"", - "stack_out": [ - "awst_tmp%0#0" - ] - }, - "3887": { - "op": "frame_dig -2", - "defined_out": [ - "role_map#0 (copy)" - ], - "stack_out": [ - "awst_tmp%0#0", - "role_map#0 (copy)" - ] - }, - "3889": { - "op": "frame_dig -1", - "defined_out": [ - "role_address#0 (copy)", - "role_map#0 (copy)" - ], - "stack_out": [ - "awst_tmp%0#0", - "role_map#0 (copy)", - "role_address#0 (copy)" - ] - }, - "3891": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1" - ] - }, - "3892": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1" - ] - }, - "3893": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "3894": { - "op": "bury 1", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "3896": { - "op": "bz _role_is_active_bool_false@4", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1" - ] - }, - "3899": { - "op": "frame_dig 1", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1" - ] - }, - "3901": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0", - "box_prefixed_key%0#1" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "3902": { - "error": "check BoxMap entry exists", - "op": "assert // check BoxMap entry exists", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "aggregate%box_get%0#0" - ] - }, - "3903": { - "op": "intc_0 // 0", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "aggregate%box_get%0#0", - "0" - ] - }, - "3904": { - "op": "extract_uint64", - "defined_out": [ - "box_prefixed_key%0#1", - "values%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "values%0#0" - ] - }, - "3905": { - "op": "global LatestTimestamp" - }, - "3907": { - "op": "dup", - "defined_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "values%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "values%0#0", - "awst_tmp%0#0", - "awst_tmp%0#0" - ] - }, - "3908": { - "op": "frame_bury 0", - "defined_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "values%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "values%0#0", - "awst_tmp%0#0" - ] - }, - "3910": { - "op": "<=", - "defined_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "tmp%1#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "tmp%1#0" - ] - }, - "3911": { - "op": "bz _role_is_active_bool_false@4", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1" - ] - }, - "3914": { - "op": "frame_dig 1", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1" - ] - }, - "3916": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%2#0", - "aggregate%box_get%3#0", - "awst_tmp%0#0", - "box_prefixed_key%0#1" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "aggregate%box_get%2#0", - "aggregate%box_get%3#0" - ] - }, - "3917": { - "error": "check BoxMap entry exists", - "op": "assert // check BoxMap entry exists", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "aggregate%box_get%2#0" - ] - }, - "3918": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "aggregate%box_get%2#0", - "awst_tmp%0#0", - "box_prefixed_key%0#1" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "aggregate%box_get%2#0", - "8" - ] - }, - "3919": { - "op": "extract_uint64", - "defined_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "values%1#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "values%1#0" - ] - }, - "3920": { - "op": "frame_dig 0", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "values%1#0", - "awst_tmp%0#0" - ] - }, - "3922": { - "op": ">=", - "defined_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "tmp%2#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "tmp%2#0" - ] - }, - "3923": { - "op": "bz _role_is_active_bool_false@4", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1" - ] - }, - "3926": { - "op": "intc_1 // 1", - "defined_out": [ - "and_result%0#0", - "awst_tmp%0#0", - "box_prefixed_key%0#1" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "and_result%0#0" - ] - }, - "3927": { - "block": "_role_is_active_bool_merge@5", - "stack_in": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "and_result%0#0" - ], - "op": "frame_bury 0", - "defined_out": [ - "and_result%0#0" - ] - }, - "3929": { - "retsub": true, - "op": "retsub" - }, - "3930": { - "block": "_role_is_active_bool_false@4", - "stack_in": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1" - ], - "op": "intc_0 // 0", - "defined_out": [ - "and_result%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "and_result%0#0" - ] - }, - "3931": { - "op": "b _role_is_active_bool_merge@5" - }, - "3934": { - "subroutine": "modules.rbac.RbacModule.assert_caller_is_arranger", - "params": {}, - "block": "assert_caller_is_arranger", - "stack_in": [], - "op": "txn Sender", - "defined_out": [ - "role_address#0" - ], - "stack_out": [ - "role_address#0" - ] - }, - "3936": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "0" - ] - }, - "3937": { - "op": "bytec 5 // 0x52323023", - "defined_out": [ - "0", - "0x52323023", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "0", - "0x52323023" - ] - }, - "3939": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "3940": { - "error": "check self.arranger exists", - "op": "assert // check self.arranger exists", - "stack_out": [ - "role_address#0", - "maybe_value%0#0" - ] - }, - "3941": { - "op": "==", - "defined_out": [ - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1" - ] - }, - "3942": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [] - }, - "3943": { - "retsub": true, - "op": "retsub" - }, - "3944": { - "subroutine": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "params": {}, - "block": "assert_is_not_asset_defaulted", - "stack_in": [], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "0" - ] - }, - "3945": { - "op": "bytec 21 // \"asset_defaulted\"", - "defined_out": [ - "\"asset_defaulted\"", - "0" - ], - "stack_out": [ - "0", - "\"asset_defaulted\"" - ] - }, - "3947": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "3948": { - "error": "check self.asset_defaulted exists", - "op": "assert // check self.asset_defaulted exists", - "stack_out": [ - "maybe_value%0#0" - ] - }, - "3949": { - "op": "!", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "3950": { - "error": "Defaulted", - "op": "assert // Defaulted", - "stack_out": [] - }, - "3951": { - "retsub": true, - "op": "retsub" - }, - "3952": { - "subroutine": "modules.rbac.RbacModule.assert_is_not_asset_suspended", - "params": {}, - "block": "assert_is_not_asset_suspended", - "stack_in": [], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "0" - ] - }, - "3953": { - "op": "bytec 20 // \"asset_suspended\"", - "defined_out": [ - "\"asset_suspended\"", - "0" - ], - "stack_out": [ - "0", - "\"asset_suspended\"" - ] - }, - "3955": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "3956": { - "error": "check self.asset_suspended exists", - "op": "assert // check self.asset_suspended exists", - "stack_out": [ - "maybe_value%0#0" - ] - }, - "3957": { - "op": "!", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "3958": { - "error": "Suspended operations", - "op": "assert // Suspended operations", - "stack_out": [] - }, - "3959": { - "retsub": true, - "op": "retsub" - }, - "3960": { - "subroutine": "modules.rbac.RbacModule._assert_valid_role", - "params": { - "role_id#0": "uint64" - }, - "block": "_assert_valid_role", - "stack_in": [], - "op": "proto 1 0" - }, - "3963": { - "op": "frame_dig -1", - "defined_out": [ - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0 (copy)" - ] - }, - "3965": { - "op": "pushint 20", - "defined_out": [ - "20", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0 (copy)", - "20" - ] - }, - "3967": { - "op": "==", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "3968": { - "op": "bnz _assert_valid_role_bool_true@6", - "stack_out": [] - }, - "3971": { - "op": "frame_dig -1", - "stack_out": [ - "role_id#0 (copy)" - ] - }, - "3973": { - "op": "pushint 40", - "defined_out": [ - "40", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0 (copy)", - "40" - ] - }, - "3975": { - "op": "==", - "defined_out": [ - "tmp%1#0" - ], - "stack_out": [ - "tmp%1#0" - ] - }, - "3976": { - "op": "bnz _assert_valid_role_bool_true@6", - "stack_out": [] - }, - "3979": { - "op": "frame_dig -1", - "stack_out": [ - "role_id#0 (copy)" - ] - }, - "3981": { - "op": "pushint 50", - "defined_out": [ - "50", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0 (copy)", - "50" - ] - }, - "3983": { - "op": "==", - "defined_out": [ - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0" - ] - }, - "3984": { - "op": "bnz _assert_valid_role_bool_true@6", - "stack_out": [] - }, - "3987": { - "op": "frame_dig -1", - "stack_out": [ - "role_id#0 (copy)" - ] - }, - "3989": { - "op": "pushint 60", - "defined_out": [ - "60", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0 (copy)", - "60" - ] - }, - "3991": { - "op": "==", - "defined_out": [ - "tmp%3#0" - ], - "stack_out": [ - "tmp%3#0" - ] - }, - "3992": { - "op": "bnz _assert_valid_role_bool_true@6", - "stack_out": [] - }, - "3995": { - "op": "frame_dig -1", - "stack_out": [ - "role_id#0 (copy)" - ] - }, - "3997": { - "op": "pushint 70", - "defined_out": [ - "70", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0 (copy)", - "70" - ] - }, - "3999": { - "op": "==", - "defined_out": [ - "tmp%4#0" - ], - "stack_out": [ - "tmp%4#0" - ] - }, - "4000": { - "op": "bnz _assert_valid_role_bool_true@6", - "stack_out": [] - }, - "4003": { - "op": "frame_dig -1", - "stack_out": [ - "role_id#0 (copy)" - ] - }, - "4005": { - "op": "pushint 80", - "defined_out": [ - "80", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0 (copy)", - "80" - ] - }, - "4007": { - "op": "==", - "defined_out": [ - "tmp%5#0" - ], - "stack_out": [ - "tmp%5#0" - ] - }, - "4008": { - "op": "bz _assert_valid_role_bool_false@7", - "stack_out": [] - }, - "4011": { - "block": "_assert_valid_role_bool_true@6", - "stack_in": [], - "op": "intc_1 // 1", - "defined_out": [ - "or_result%0#0" - ], - "stack_out": [ - "or_result%0#0" - ] - }, - "4012": { - "error": "Invalid role identifier", - "block": "_assert_valid_role_bool_merge@8", - "stack_in": [ - "or_result%0#0" - ], - "op": "assert // Invalid role identifier", - "defined_out": [], - "stack_out": [] - }, - "4013": { - "retsub": true, - "op": "retsub" - }, - "4014": { - "block": "_assert_valid_role_bool_false@7", - "stack_in": [], - "op": "intc_0 // 0", - "defined_out": [ - "or_result%0#0" - ], - "stack_out": [ - "or_result%0#0" - ] - }, - "4015": { - "op": "b _assert_valid_role_bool_merge@8" - } - } -} \ No newline at end of file diff --git a/smart_contracts/artifacts/zero_coupon_bond/ZeroCouponBond.approval.teal b/smart_contracts/artifacts/zero_coupon_bond/ZeroCouponBond.approval.teal deleted file mode 100644 index bc5f4fed..00000000 --- a/smart_contracts/artifacts/zero_coupon_bond/ZeroCouponBond.approval.teal +++ /dev/null @@ -1,4011 +0,0 @@ -#pragma version 12 -#pragma typetrack false - -// algopy.arc4.ARC4Contract.approval_program() -> uint64: -main: - intcblock 0 1 32 8 200 86400 - bytecblock 0x151f7c75 0x52333023 "status" "circulating_units" "maturity_date" 0x52323023 "unit_value" "primary_distribution_opening_date" "issuance_date" "secondary_market_closure_date" 0x52373023 0x52343023 "total_units" "settlement_asset_id" "day_count_convention" "principal_discount" "secondary_market_opening_date" 0x52363023 0x52353023 0x52323523 "asset_suspended" "asset_defaulted" "denomination_asset_id" "metadata" "primary_distribution_closure_date" 0x52383023 "interest_rate" 0x74696d654576656e7473 0x00 "total_coupons" 0x0000 0x068101 - txn ApplicationID - bnz main_after_if_else@2 - // modules/rbac.py:30-31 - // # RBAC Roles - // self.arranger = GlobalState(Account(), key=cst.PREFIX_ID_ARRANGER) - bytec 5 // 0x52323023 - global ZeroAddress - app_global_put - // modules/rbac.py:32 - // self.op_daemon = GlobalState(Account(), key=cst.PREFIX_ID_OP_DAEMON) - bytec 19 // 0x52323523 - global ZeroAddress - app_global_put - // modules/rbac.py:47-48 - // # D-ASA Governance - // self.asset_suspended = False - bytec 20 // "asset_suspended" - intc_0 // 0 - app_global_put - // modules/rbac.py:49 - // self.asset_defaulted = False - bytec 21 // "asset_defaulted" - intc_0 // 0 - app_global_put - // modules/accounting.py:19 - // self.total_units = UInt64() - bytec 12 // "total_units" - intc_0 // 0 - app_global_put - // modules/accounting.py:20 - // self.circulating_units = UInt64() - bytec_3 // "circulating_units" - intc_0 // 0 - app_global_put - // modules/accounting.py:21 - // self.unit_value = UInt64() - bytec 6 // "unit_value" - intc_0 // 0 - app_global_put - // modules/accounting.py:22 - // self.status = UInt64(enm.STATUS_INACTIVE) - bytec_2 // "status" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:31-32 - // # Asset Configuration - // self.denomination_asset_id = Asset() - bytec 22 // "denomination_asset_id" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:33 - // self.settlement_asset_id = Asset() - bytec 13 // "settlement_asset_id" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:34 - // self.unit_value = UInt64() - bytec 6 // "unit_value" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:35 - // self.day_count_convention = UInt64() - bytec 14 // "day_count_convention" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:37-38 - // # Metadata - // self.metadata = Bytes() - bytec 23 // "metadata" - pushbytes 0x - app_global_put - // modules/core_financial/common.py:40-41 - // # Principal / Rates - // self.principal_discount = UInt64() - bytec 15 // "principal_discount" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:42 - // self.interest_rate = UInt64() - bytec 26 // "interest_rate" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:43 - // self.total_coupons = UInt64() - bytec 29 // "total_coupons" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:47 - // self.primary_distribution_opening_date = UInt64() - bytec 7 // "primary_distribution_opening_date" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:48 - // self.primary_distribution_closure_date = UInt64() - bytec 24 // "primary_distribution_closure_date" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:49 - // self.issuance_date = UInt64() - bytec 8 // "issuance_date" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:50 - // self.secondary_market_opening_date = UInt64() - bytec 16 // "secondary_market_opening_date" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:51 - // self.secondary_market_closure_date = UInt64() - bytec 9 // "secondary_market_closure_date" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:52 - // self.maturity_date = UInt64() - bytec 4 // "maturity_date" - intc_0 // 0 - app_global_put - // smart_contracts/zero_coupon_bond/contract.py:27 - // assert Txn.global_num_byte_slice == cfg.GLOBAL_BYTES, err.WRONG_GLOBAL_BYTES - txn GlobalNumByteSlice - pushint 3 - == - assert // Wrong Global Bytes allocation - // smart_contracts/zero_coupon_bond/contract.py:28 - // assert Txn.global_num_uint == cfg.GLOBAL_UINTS, err.WRONG_GLOBAL_UINTS - txn GlobalNumUint - pushint 18 - == - assert // Wrong Global UInts allocation - // smart_contracts/zero_coupon_bond/contract.py:29 - // assert Txn.local_num_byte_slice == cfg.LOCAL_BYTES, err.WRONG_LOCAL_BYTES - txn LocalNumByteSlice - ! - assert // Wrong Local Bytes allocation - // smart_contracts/zero_coupon_bond/contract.py:30 - // assert Txn.local_num_uint == cfg.LOCAL_UINTS, err.WRONG_LOCAL_UINTS - txn LocalNumUint - ! - assert // Wrong Local UInts allocation - -main_after_if_else@2: - // smart_contracts/zero_coupon_bond/contract.py:12-24 - // class ZeroCouponBond( - // PAMCoreMixin, - // NoCouponCashflowMixin, - // PrincipalPaymentAgentMixin, - // NoCouponTransferAgentMixin, - // state_totals=StateTotals( - // global_bytes=cfg.GLOBAL_BYTES, - // global_uints=cfg.GLOBAL_UINTS, - // local_bytes=cfg.LOCAL_BYTES, - // local_uints=cfg.LOCAL_UINTS, - // ), - // avm_version=12, - // ): - pushbytes 0x25dba95b // method "asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void" - txna ApplicationArgs 0 - match main_asset_update_route@4 - -main_switch_case_next@5: - // smart_contracts/zero_coupon_bond/contract.py:12-24 - // class ZeroCouponBond( - // PAMCoreMixin, - // NoCouponCashflowMixin, - // PrincipalPaymentAgentMixin, - // NoCouponTransferAgentMixin, - // state_totals=StateTotals( - // global_bytes=cfg.GLOBAL_BYTES, - // global_uints=cfg.GLOBAL_UINTS, - // local_bytes=cfg.LOCAL_BYTES, - // local_uints=cfg.LOCAL_UINTS, - // ), - // avm_version=12, - // ): - txn OnCompletion - ! - assert - txn ApplicationID - bz main_create_NoOp@33 - pushbytess 0x89474134 0x44363d49 0x67db4f20 0x9c76b6a3 0x4fd6a3cc 0x1d6fc255 0x25e9997f 0x6c85e3ee 0x402dba47 0xfad2173e 0x08efea35 0xe4a5ab54 0xdc063b35 0x14fc10ef 0x4c113ed5 0x74a7297f 0x105c184e 0x82f71b2d 0xef04f5d3 0x03b83329 0x3dbe80bd 0xdf54e82c 0x010c8299 0x7406acd2 0xc3e4b297 // method "asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void", method "get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64))", method "get_payment_amount(address)(uint64,uint64)", method "pay_principal(address,byte[])(uint64,uint64,byte[])", method "asset_transfer(address,address,uint64)uint64", method "set_secondary_time_events(uint64[])(uint64,uint64)", method "set_default_status(bool)uint64", method "primary_distribution(address,uint64)uint64", method "get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)", method "get_time_events()uint64[]", method "get_secondary_market_schedule()uint64[]", method "get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", method "account_gov_suspension(address,bool)uint64", method "account_open(address,address)uint64", method "account_close(address)(uint64,uint64)", method "account_update_payment_address(address,address)uint64", method "account_get_info(address)(address,uint64,uint64,uint64,bool)", method "rbac_rotate_arranger(address)uint64", method "rbac_set_op_daemon(address)uint64", method "rbac_assign_role(uint8,address,byte[])uint64", method "rbac_revoke_role(uint8,address)uint64", method "rbac_gov_asset_suspension(bool)uint64", method "rbac_get_arranger()address", method "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", method "rbac_get_role_config(uint8,address)(uint64,uint64)" - txna ApplicationArgs 0 - match asset_config get_account_units_current_value get_payment_amount pay_principal asset_transfer set_secondary_time_events set_default_status primary_distribution get_asset_info get_time_events get_secondary_market_schedule get_asset_metadata account_gov_suspension account_open account_close account_update_payment_address account_get_info rbac_rotate_arranger rbac_set_op_daemon rbac_assign_role rbac_revoke_role rbac_gov_asset_suspension rbac_get_arranger rbac_get_address_roles rbac_get_role_config - err - -main_create_NoOp@33: - // smart_contracts/zero_coupon_bond/contract.py:12-24 - // class ZeroCouponBond( - // PAMCoreMixin, - // NoCouponCashflowMixin, - // PrincipalPaymentAgentMixin, - // NoCouponTransferAgentMixin, - // state_totals=StateTotals( - // global_bytes=cfg.GLOBAL_BYTES, - // global_uints=cfg.GLOBAL_UINTS, - // local_bytes=cfg.LOCAL_BYTES, - // local_uints=cfg.LOCAL_UINTS, - // ), - // avm_version=12, - // ): - pushbytes 0x3f0efc6c // method "asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void" - txna ApplicationArgs 0 - match asset_create - err - -main_asset_update_route@4: - // modules/core_financial/common.py:279 - // @arc4.abimethod(allow_actions=["UpdateApplication"]) - txn OnCompletion - pushint 4 // UpdateApplication - == - txn ApplicationID - && - assert - b asset_update - - -// modules.actus.pam.PAMCoreMixin.asset_config[routing]() -> void: -asset_config: - // modules/actus/pam.py:26 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_3 // 8 - == - assert // invalid number of bytes for arc4.uint64 - btoi - txna ApplicationArgs 2 - dup - len - intc_3 // 8 - == - assert // invalid number of bytes for arc4.uint64 - btoi - txna ApplicationArgs 3 - dup - len - intc_3 // 8 - == - assert // invalid number of bytes for arc4.uint64 - btoi - txna ApplicationArgs 4 - dup - len - intc_3 // 8 - == - assert // invalid number of bytes for arc4.uint64 - btoi - txna ApplicationArgs 5 - dup - len - intc_3 // 8 - == - assert // invalid number of bytes for arc4.uint64 - btoi - txna ApplicationArgs 6 - dup - len - intc_1 // 1 - == - assert // invalid number of bytes for arc4.uint8 - txna ApplicationArgs 7 - dup - cover 7 - len - pushint 2 - == - assert // invalid number of bytes for arc4.uint16 - txna ApplicationArgs 8 - dup - intc_0 // 0 - extract_uint16 // on error: invalid array length header - dup - cover 8 - pushint 2 - * - pushint 2 - + - swap - len - == - assert // invalid number of bytes for arc4.dynamic_array - txna ApplicationArgs 9 - dup - cover 7 - dup - intc_0 // 0 - extract_uint16 // on error: invalid array length header - dup - cover 8 - intc_3 // 8 - * - pushint 2 - + - swap - len - == - assert // invalid number of bytes for arc4.dynamic_array - txna ApplicationArgs 10 - dup - intc_0 // 0 - extract_uint16 // on error: invalid array length header - dup - cover 8 - pushint 16 - * - pushint 2 - + - swap - len - == - assert // invalid number of bytes for arc4.dynamic_array> - // modules/core_financial/common.py:227 - // self.assert_caller_is_arranger() - callsub assert_caller_is_arranger - // modules/core_financial/common.py:228 - // assert self.status == enums.STATUS_INACTIVE, err.ALREADY_CONFIGURED - intc_0 // 0 - bytec_2 // "status" - app_global_get_ex - assert // check self.status exists - ! - assert // D-ASA already configured - // modules/core_financial/common.py:55-56 - // # The reference implementation has on-chain denomination with ASA - // _creator, exists = op.AssetParamsGet.asset_creator(denomination_asset_id) - dig 5 - asset_params_get AssetCreator - bury 1 - // modules/core_financial/common.py:57 - // assert exists, err.INVALID_DENOMINATION - assert // Denomination asset is not properly set - // modules/core_financial/common.py:60 - // self.denomination_asset_id = denomination_asset_id - bytec 22 // "denomination_asset_id" - dig 6 - app_global_put - // modules/core_financial/common.py:65 - // settlement_asset_id == self.denomination_asset_id - dig 4 - uncover 6 - == - // modules/core_financial/common.py:63-66 - // # The reference implementation settlement asset is the denomination asset - // assert ( - // settlement_asset_id == self.denomination_asset_id - // ), err.INVALID_SETTLEMENT_ASSET - assert // Different settlement asset not supported, must be equal to denomination asset - // modules/core_financial/common.py:69 - // self.settlement_asset_id = settlement_asset_id - bytec 13 // "settlement_asset_id" - dig 5 - app_global_put - // modules/core_financial/common.py:70-76 - // # The reference implementation has on-chain settlement with ASA - // itxn.AssetTransfer( - // xfer_asset=self.settlement_asset_id, - // asset_receiver=Global.current_application_address, - // asset_amount=0, - // fee=Global.min_txn_fee, - // ).submit() - itxn_begin - // modules/core_financial/common.py:75 - // fee=Global.min_txn_fee, - global MinTxnFee - // modules/core_financial/common.py:73 - // asset_receiver=Global.current_application_address, - global CurrentApplicationAddress - // modules/core_financial/common.py:74 - // asset_amount=0, - intc_0 // 0 - itxn_field AssetAmount - itxn_field AssetReceiver - uncover 5 - itxn_field XferAsset - // modules/core_financial/common.py:70-71 - // # The reference implementation has on-chain settlement with ASA - // itxn.AssetTransfer( - pushint 4 // axfer - itxn_field TypeEnum - itxn_field Fee - // modules/core_financial/common.py:70-76 - // # The reference implementation has on-chain settlement with ASA - // itxn.AssetTransfer( - // xfer_asset=self.settlement_asset_id, - // asset_receiver=Global.current_application_address, - // asset_amount=0, - // fee=Global.min_txn_fee, - // ).submit() - itxn_submit - // modules/core_financial/common.py:238-239 - // # Set Principal and Minimum Denomination - // assert principal % minimum_denomination == 0, err.INVALID_MINIMUM_DENOMINATION - dig 3 - dig 2 - % - ! - assert // Minimum denomination is not a divisor of principal - // modules/core_financial/common.py:240 - // self.unit_value = minimum_denomination - bytec 6 // "unit_value" - dig 2 - app_global_put - // modules/core_financial/common.py:241 - // self.total_units = principal // minimum_denomination - uncover 3 - uncover 2 - / - bytec 12 // "total_units" - swap - app_global_put - // modules/core_financial/common.py:242 - // self.principal_discount = principal_discount - bytec 15 // "principal_discount" - uncover 2 - app_global_put - // modules/core_financial/common.py:244-245 - // # Set Day-Count Convention - // self.assert_day_count_convention(day_count_convention.as_uint64()) - btoi - dup - // modules/core_financial/common.py:79-83 - // # The reference implementation supports only the Actual/Actual and Continuous day-count conventions - // assert day_count_convention in ( - // UInt64(cst.DCC_A_A), - // UInt64(cst.DCC_CONT), - // ), err.INVALID_DAY_COUNT_CONVENTION - bz asset_config_bool_true@3 - dup - // modules/core_financial/common.py:82 - // UInt64(cst.DCC_CONT), - pushint 255 - // modules/core_financial/common.py:79-83 - // # The reference implementation supports only the Actual/Actual and Continuous day-count conventions - // assert day_count_convention in ( - // UInt64(cst.DCC_A_A), - // UInt64(cst.DCC_CONT), - // ), err.INVALID_DAY_COUNT_CONVENTION - == - bz asset_config_bool_false@4 - -asset_config_bool_true@3: - intc_1 // 1 - -asset_config_bool_merge@5: - // modules/core_financial/common.py:79-83 - // # The reference implementation supports only the Actual/Actual and Continuous day-count conventions - // assert day_count_convention in ( - // UInt64(cst.DCC_A_A), - // UInt64(cst.DCC_CONT), - // ), err.INVALID_DAY_COUNT_CONVENTION - assert // Invalid day-count convention ID - // modules/core_financial/common.py:86 - // self.day_count_convention = day_count_convention - bytec 14 // "day_count_convention" - dig 1 - app_global_put - // modules/core_financial/common.py:248-249 - // # Set Interest Rate - // self.assert_interest_rate(interest_rate.as_uint64()) - dig 5 - btoi - // modules/core_financial/no_coupon.py:14-15 - // # This subroutine must be used after the principal discount has been set - // assert interest_rate == UInt64(0), err.INVALID_INTEREST_RATE - dup - ! - assert // Interest rate is not properly defined - // modules/core_financial/common.py:94 - // self.interest_rate = interest_rate - bytec 26 // "interest_rate" - swap - app_global_put - // modules/core_financial/common.py:97 - // assert not coupon_rates.length, err.INVALID_COUPON_RATES - dig 4 - dup - ! - assert // Coupon rates are not properly defined - // modules/core_financial/common.py:100 - // self.total_coupons = coupon_rates.length - bytec 29 // "total_coupons" - dig 1 - app_global_put - // modules/core_financial/common.py:104 - // time_events.length == self.total_coupons + cfg.TIME_SCHEDULE_LIMITS - pushint 4 - + - dig 3 - == - // modules/core_financial/common.py:103-105 - // assert ( - // time_events.length == self.total_coupons + cfg.TIME_SCHEDULE_LIMITS - // ), err.INVALID_TIME_EVENTS_LENGTH - assert // Time events length is invalid - // modules/core_financial/common.py:258 - // self.assert_time_events_sorted(time_events) - dig 3 - callsub assert_time_events_sorted - // modules/core_financial/common.py:127 - // self.time_events.value = time_events.copy() - bytec 27 // 0x74696d654576656e7473 - box_del - pop - bytec 27 // 0x74696d654576656e7473 - dig 1 - box_put - // modules/core_financial/common.py:128-130 - // self.primary_distribution_opening_date = time_events[ - // cfg.PRIMARY_DISTRIBUTION_OPENING_DATE_IDX - // ] - dup - extract 2 0 - dig 1 - pushint 2 - extract_uint64 - // modules/core_financial/common.py:128 - // self.primary_distribution_opening_date = time_events[ - bytec 7 // "primary_distribution_opening_date" - // modules/core_financial/common.py:128-130 - // self.primary_distribution_opening_date = time_events[ - // cfg.PRIMARY_DISTRIBUTION_OPENING_DATE_IDX - // ] - swap - app_global_put - // modules/core_financial/common.py:131-133 - // self.primary_distribution_closure_date = time_events[ - // cfg.PRIMARY_DISTRIBUTION_CLOSURE_DATE_IDX - // ] - dig 1 - pushint 10 - extract_uint64 - // modules/core_financial/common.py:131 - // self.primary_distribution_closure_date = time_events[ - bytec 24 // "primary_distribution_closure_date" - // modules/core_financial/common.py:131-133 - // self.primary_distribution_closure_date = time_events[ - // cfg.PRIMARY_DISTRIBUTION_CLOSURE_DATE_IDX - // ] - swap - app_global_put - // modules/core_financial/common.py:134 - // self.issuance_date = time_events[cfg.ISSUANCE_DATE_IDX] - dig 1 - pushint 18 - extract_uint64 - bytec 8 // "issuance_date" - swap - app_global_put - // modules/core_financial/common.py:135 - // self.maturity_date = time_events[cfg.MATURITY_DATE_IDX] - swap - intc_0 // 0 - extract_uint16 // on error: invalid array length header - intc_1 // 1 - - - intc_3 // 8 - * - extract_uint64 - bytec 4 // "maturity_date" - swap - app_global_put - // modules/core_financial/common.py:138 - // assert not time_periods.length, err.INVALID_TIME_PERIODS - dig 1 - ! - assert // Time periods are not properly defined - // modules/core_financial/common.py:265 - // self.status = UInt64(enums.STATUS_ACTIVE) - bytec_2 // "status" - pushint 100 - app_global_put - // modules/actus/pam.py:26 - // @arc4.abimethod - intc_1 // 1 - return - -asset_config_bool_false@4: - intc_0 // 0 - b asset_config_bool_merge@5 - - -// modules.core_financial.no_coupon.NoCouponCashflowMixin.get_account_units_current_value[routing]() -> void: -get_account_units_current_value: - intc_0 // 0 - pushbytes "" - dupn 5 - // modules/core_financial/no_coupon.py:58 - // @arc4.abimethod(readonly=True) - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - txna ApplicationArgs 2 - dup - len - intc_3 // 8 - == - assert // invalid number of bytes for arc4.uint64 - btoi - // modules/core_financial/no_coupon.py:78 - // self.primary_distribution_opening_date - intc_0 // 0 - bytec 7 // "primary_distribution_opening_date" - app_global_get_ex - assert // check self.primary_distribution_opening_date exists - // modules/core_financial/no_coupon.py:78-79 - // self.primary_distribution_opening_date - // and Global.latest_timestamp >= self.primary_distribution_opening_date - bz get_account_units_current_value_bool_false@4 - // modules/core_financial/no_coupon.py:79 - // and Global.latest_timestamp >= self.primary_distribution_opening_date - global LatestTimestamp - intc_0 // 0 - bytec 7 // "primary_distribution_opening_date" - app_global_get_ex - assert // check self.primary_distribution_opening_date exists - >= - // modules/core_financial/no_coupon.py:78-79 - // self.primary_distribution_opening_date - // and Global.latest_timestamp >= self.primary_distribution_opening_date - bz get_account_units_current_value_bool_false@4 - intc_1 // 1 - -get_account_units_current_value_bool_merge@5: - // modules/core_financial/no_coupon.py:77-80 - // assert ( - // self.primary_distribution_opening_date - // and Global.latest_timestamp >= self.primary_distribution_opening_date - // ), err.NO_PRIMARY_DISTRIBUTION - assert // Primary distribution not yet executed - // modules/accounting.py:31 - // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec_1 // 0x52333023 - dig 2 - concat - dup - bury 10 - box_len - bury 1 - assert // Invalid account holding address - // modules/core_financial/no_coupon.py:82 - // assert 0 < units <= self.account[holding_address].units, err.INVALID_UNITS - dup - bz get_account_units_current_value_bool_false@8 - dig 8 - box_get - assert // check self.account entry exists - intc_2 // 32 - extract_uint64 - dig 1 - >= - bz get_account_units_current_value_bool_false@8 - intc_1 // 1 - -get_account_units_current_value_bool_merge@9: - // modules/core_financial/no_coupon.py:82 - // assert 0 < units <= self.account[holding_address].units, err.INVALID_UNITS - assert // Invalid amount of units for the account - // modules/core_financial/no_coupon.py:84 - // account_units_nominal_value = self.account_units_value(holding_address, units) - dup2 - callsub account_units_value - dup - bury 8 - // modules/core_financial/no_coupon.py:86 - // account_units_nominal_value * self.principal_discount // cst.BPS - intc_0 // 0 - bytec 15 // "principal_discount" - app_global_get_ex - assert // check self.principal_discount exists - dig 1 - * - pushint 10000 - / - // modules/core_financial/no_coupon.py:90 - // account_units_nominal_value - account_units_discount - - - bury 8 - // modules/core_financial/no_coupon.py:93-94 - // # Accruing interest during primary distribution and at maturity - // accrued_interest = UInt64() - intc_0 // 0 - bury 6 - // modules/core_financial/no_coupon.py:95 - // numerator = UInt64() - intc_0 // 0 - bury 3 - // modules/core_financial/no_coupon.py:96 - // denominator = UInt64() - intc_0 // 0 - bury 4 - // modules/core_financial/no_coupon.py:30-31 - // # The check on maturity date ensures D-ASA has been configured as block timestamp cannot be less than 0 (init). - // return self.issuance_date <= Global.latest_timestamp < self.maturity_date - intc_0 // 0 - bytec 8 // "issuance_date" - app_global_get_ex - assert // check self.issuance_date exists - global LatestTimestamp - dup - bury 7 - <= - bz get_account_units_current_value_bool_false@17 - intc_0 // 0 - bytec 4 // "maturity_date" - app_global_get_ex - assert // check self.maturity_date exists - dig 5 - > - bz get_account_units_current_value_bool_false@17 - intc_1 // 1 - -get_account_units_current_value_bool_merge@18: - // modules/core_financial/no_coupon.py:98-99 - // # Accruing interest - // if self.is_accruing_interest(): - bz get_account_units_current_value_after_if_else@11 - // modules/core_financial/no_coupon.py:100 - // day_count_factor = self.day_count_factor() - callsub day_count_factor - // modules/core_financial/no_coupon.py:101 - // accrued_interest = self.accrued_interest_amount(holding_address, units) - dig 2 - dig 2 - callsub accrued_interest_amount - bury 7 - // modules/core_financial/no_coupon.py:102 - // numerator = day_count_factor.numerator - dup - intc_0 // 0 - extract_uint64 - bury 4 - // modules/core_financial/no_coupon.py:103 - // denominator = day_count_factor.denominator - intc_3 // 8 - extract_uint64 - bury 4 - -get_account_units_current_value_after_if_else@11: - // modules/core_financial/no_coupon.py:105-106 - // # Value at maturity - // if Global.latest_timestamp >= self.maturity_date: - global LatestTimestamp - intc_0 // 0 - bytec 4 // "maturity_date" - app_global_get_ex - assert // check self.maturity_date exists - >= - bz get_account_units_current_value_after_if_else@13 - dig 6 - bury 8 - -get_account_units_current_value_after_if_else@13: - // modules/core_financial/no_coupon.py:112-115 - // day_count_factor=typ.DayCountFactor( - // numerator=numerator, - // denominator=denominator, - // ), - dig 2 - itob - dig 4 - itob - concat - // modules/core_financial/no_coupon.py:109-116 - // return typ.CurrentUnitsValue( - // units_value=account_units_current_value, - // accrued_interest=accrued_interest, - // day_count_factor=typ.DayCountFactor( - // numerator=numerator, - // denominator=denominator, - // ), - // ) - dig 8 - itob - dig 7 - itob - concat - swap - concat - // modules/core_financial/no_coupon.py:58 - // @arc4.abimethod(readonly=True) - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - -get_account_units_current_value_bool_false@17: - intc_0 // 0 - b get_account_units_current_value_bool_merge@18 - -get_account_units_current_value_bool_false@8: - intc_0 // 0 - b get_account_units_current_value_bool_merge@9 - -get_account_units_current_value_bool_false@4: - intc_0 // 0 - b get_account_units_current_value_bool_merge@5 - - -// modules.core_financial.no_coupon.NoCouponCashflowMixin.get_payment_amount[routing]() -> void: -get_payment_amount: - // modules/core_financial/no_coupon.py:118 - // @arc4.abimethod(readonly=True) - txna ApplicationArgs 1 - dupn 2 - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/accounting.py:31 - // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec_1 // 0x52333023 - swap - concat - box_len - bury 1 - assert // Invalid account holding address - // modules/core_financial/no_coupon.py:134 - // principal_amount = UInt64() - intc_0 // 0 - // modules/accounting.py:25 - // return self.status == enm.STATUS_ACTIVE - dup - bytec_2 // "status" - app_global_get_ex - assert // check self.status exists - pushint 100 - == - // modules/core_financial/no_coupon.py:135 - // if self.status_is_active(): - bz get_payment_amount_after_if_else@3 - // modules/core_financial/no_coupon.py:136 - // principal_amount = self.account_total_units_value(holding_address) - dig 1 - callsub account_total_units_value - bury 1 - -get_payment_amount_after_if_else@3: - // modules/core_financial/no_coupon.py:137 - // return typ.PaymentAmounts(interest=UInt64(0), principal=principal_amount) - intc_0 // 0 - itob - dig 1 - itob - concat - // modules/core_financial/no_coupon.py:118 - // @arc4.abimethod(readonly=True) - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.payment_agent.principal.PrincipalPaymentAgentMixin.pay_principal[routing]() -> void: -pay_principal: - // modules/payment_agent/principal.py:30 - // @arc4.abimethod - txna ApplicationArgs 1 - dupn 2 - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - txna ApplicationArgs 2 - dup - intc_0 // 0 - extract_uint16 // on error: invalid array length header - pushint 2 - + - dig 1 - len - == - assert // invalid number of bytes for arc4.dynamic_array - extract 2 0 - swap - // modules/accounting.py:25 - // return self.status == enm.STATUS_ACTIVE - intc_0 // 0 - bytec_2 // "status" - app_global_get_ex - assert // check self.status exists - pushint 100 - == - // modules/actus/pam.py:16-17 - // # The reference implementation does not restrict caller authorization - // assert self.status_is_active(), err.UNAUTHORIZED - assert // Not authorized - // modules/actus/pam.py:18 - // self.assert_is_not_asset_defaulted() - callsub assert_is_not_asset_defaulted - // modules/actus/pam.py:19 - // self.assert_is_not_asset_suspended() - callsub assert_is_not_asset_suspended - // modules/accounting.py:31 - // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec_1 // 0x52333023 - dig 1 - concat - dup - cover 2 - dup - box_len - bury 1 - assert // Invalid account holding address - // modules/actus/pam.py:21 - // units = self.account[holding_address].units - box_get - pop - intc_2 // 32 - extract_uint64 - // modules/actus/pam.py:22 - // assert units > 0, err.NO_UNITS - assert // No D-ASA units - // modules/actus/pam.py:23 - // assert Global.latest_timestamp >= self.maturity_date, err.NOT_MATURE - global LatestTimestamp - intc_0 // 0 - bytec 4 // "maturity_date" - app_global_get_ex - assert // check self.maturity_date exists - >= - assert // Not mature - // modules/core_financial/no_coupon.py:53 - // return self.account_total_units_value(holding_address) - callsub account_total_units_value - // modules/payment_agent/common.py:13 - // if self.op_daemon.value != Global.zero_address: - intc_0 // 0 - bytec 19 // 0x52323523 - app_global_get_ex - assert // check self.op_daemon exists - global ZeroAddress - != - bz pay_principal_after_if_else@22 - // modules/payment_agent/common.py:15 - // Txn.sender == self.op_daemon.value - txn Sender - intc_0 // 0 - bytec 19 // 0x52323523 - app_global_get_ex - assert // check self.op_daemon exists - == - // modules/payment_agent/common.py:15-17 - // Txn.sender == self.op_daemon.value - // or Txn.sender == holding_address - // or Txn.sender == self.account[holding_address].payment_address - bnz pay_principal_bool_true@19 - // modules/payment_agent/common.py:16 - // or Txn.sender == holding_address - txn Sender - dig 4 - == - // modules/payment_agent/common.py:15-17 - // Txn.sender == self.op_daemon.value - // or Txn.sender == holding_address - // or Txn.sender == self.account[holding_address].payment_address - bnz pay_principal_bool_true@19 - // modules/payment_agent/common.py:17 - // or Txn.sender == self.account[holding_address].payment_address - txn Sender - dig 2 - box_get - assert // check self.account entry exists - extract 0 32 - == - // modules/payment_agent/common.py:15-17 - // Txn.sender == self.op_daemon.value - // or Txn.sender == holding_address - // or Txn.sender == self.account[holding_address].payment_address - bz pay_principal_bool_false@20 - -pay_principal_bool_true@19: - intc_1 // 1 - -pay_principal_bool_merge@21: - // modules/payment_agent/common.py:14-18 - // assert ( - // Txn.sender == self.op_daemon.value - // or Txn.sender == holding_address - // or Txn.sender == self.account[holding_address].payment_address - // ), err.UNAUTHORIZED - assert // Not authorized - -pay_principal_after_if_else@22: - // modules/payment_agent/common.py:22 - // self.account[holding_address].payment_address.is_opted_in( - dig 1 - box_get - assert // check self.account entry exists - extract 0 32 - // modules/payment_agent/common.py:23 - // self.settlement_asset_id - intc_0 // 0 - bytec 13 // "settlement_asset_id" - app_global_get_ex - assert // check self.settlement_asset_id exists - // modules/payment_agent/common.py:22-24 - // self.account[holding_address].payment_address.is_opted_in( - // self.settlement_asset_id - // ) - asset_holding_get AssetBalance - bury 1 - // modules/payment_agent/common.py:22-25 - // self.account[holding_address].payment_address.is_opted_in( - // self.settlement_asset_id - // ) - // and not self.account[holding_address].suspended - bz pay_principal_bool_false@27 - // modules/payment_agent/common.py:25 - // and not self.account[holding_address].suspended - dig 1 - box_get - assert // check self.account entry exists - pushint 448 - getbit - bnz pay_principal_bool_false@27 - intc_1 // 1 - -pay_principal_bool_merge@28: - // modules/payment_agent/principal.py:56 - // if self.is_payment_executable(holding_address): - bz pay_principal_else_body@3 - // modules/payment_agent/common.py:30 - // self.settlement_asset_id.balance(Global.current_application_address) - global CurrentApplicationAddress - intc_0 // 0 - bytec 13 // "settlement_asset_id" - app_global_get_ex - assert // check self.settlement_asset_id exists - swap - dig 1 - asset_holding_get AssetBalance - assert // account opted into asset - // modules/payment_agent/common.py:30-31 - // self.settlement_asset_id.balance(Global.current_application_address) - // >= payment_amount - dig 2 - dup - cover 2 - >= - // modules/payment_agent/common.py:29-32 - // assert ( - // self.settlement_asset_id.balance(Global.current_application_address) - // >= payment_amount - // ), err.NOT_ENOUGH_FUNDS - assert // Not enough funds for the payment - // modules/payment_agent/principal.py:59-60 - // # The reference implementation has the same asset for denomination and settlement, no conversion needed - // self.pay(self.account[holding_address].payment_address, payment_amount) - dig 3 - box_get - assert // check self.account entry exists - extract 0 32 - // modules/payment_agent/common.py:35-40 - // itxn.AssetTransfer( - // xfer_asset=self.settlement_asset_id, - // asset_receiver=receiver, - // asset_amount=amount, - // fee=Global.min_txn_fee, - // ).submit() - itxn_begin - // modules/payment_agent/common.py:39 - // fee=Global.min_txn_fee, - global MinTxnFee - uncover 2 - itxn_field AssetAmount - swap - itxn_field AssetReceiver - swap - itxn_field XferAsset - // modules/payment_agent/common.py:35 - // itxn.AssetTransfer( - pushint 4 // axfer - itxn_field TypeEnum - itxn_field Fee - // modules/payment_agent/common.py:35-40 - // itxn.AssetTransfer( - // xfer_asset=self.settlement_asset_id, - // asset_receiver=receiver, - // asset_amount=amount, - // fee=Global.min_txn_fee, - // ).submit() - itxn_submit - -pay_principal_after_if_else@4: - // modules/core_financial/common.py:199 - // self.circulating_units -= self.account[holding_address].units - intc_0 // 0 - bytec_3 // "circulating_units" - app_global_get_ex - assert // check self.circulating_units exists - dig 2 - dup - cover 2 - box_get - assert // check self.account entry exists - intc_2 // 32 - extract_uint64 - - - bytec_3 // "circulating_units" - swap - app_global_put - // modules/core_financial/common.py:200 - // self.account[holding_address].units = UInt64() - intc_0 // 0 - itob - swap - intc_2 // 32 - dig 2 - box_replace - // modules/core_financial/common.py:201 - // self.end_if_no_circulating_units() - callsub end_if_no_circulating_units - // modules/payment_agent/principal.py:17 - // contract_id=Global.current_application_id.id, - global CurrentApplicationID - // modules/payment_agent/principal.py:20 - // time=Global.latest_timestamp, - global LatestTimestamp - // modules/payment_agent/principal.py:22 - // currency_id=self.denomination_asset_id.id, - intc_0 // 0 - bytec 22 // "denomination_asset_id" - app_global_get_ex - assert // check self.denomination_asset_id exists - // modules/payment_agent/principal.py:23 - // currency_unit=self.denomination_asset_id.unit_name, - dup - asset_params_get AssetUnitName - assert // asset exists - // modules/payment_agent/principal.py:24 - // nominal_value=self.circulating_units * self.unit_value, - intc_0 // 0 - bytec_3 // "circulating_units" - app_global_get_ex - assert // check self.circulating_units exists - intc_0 // 0 - bytec 6 // "unit_value" - app_global_get_ex - assert // check self.unit_value exists - * - // modules/payment_agent/principal.py:16-27 - // Event( - // contract_id=Global.current_application_id.id, - // type=arc4.UInt8(enums.EVT_TYPE_PR), - // type_name=String("PR"), - // time=Global.latest_timestamp, - // payoff=payoff, - // currency_id=self.denomination_asset_id.id, - // currency_unit=self.denomination_asset_id.unit_name, - // nominal_value=self.circulating_units * self.unit_value, - // nominal_rate_bps=arc4.UInt16(0), - // nominal_accrued=UInt64(0), - // ) - uncover 4 - itob - pushbytes 0x030037 - concat - uncover 4 - itob - concat - dig 5 - itob - swap - dig 1 - concat - uncover 4 - itob - concat - dig 3 - len - itob - extract 6 2 - uncover 4 - concat - swap - pushbytes 0x003b - concat - uncover 3 - itob - concat - // modules/payment_agent/principal.py:25 - // nominal_rate_bps=arc4.UInt16(0), - bytec 30 // 0x0000 - // modules/payment_agent/principal.py:16-27 - // Event( - // contract_id=Global.current_application_id.id, - // type=arc4.UInt8(enums.EVT_TYPE_PR), - // type_name=String("PR"), - // time=Global.latest_timestamp, - // payoff=payoff, - // currency_id=self.denomination_asset_id.id, - // currency_unit=self.denomination_asset_id.unit_name, - // nominal_value=self.circulating_units * self.unit_value, - // nominal_rate_bps=arc4.UInt16(0), - // nominal_accrued=UInt64(0), - // ) - concat - uncover 3 - concat - pushbytes 0x00025052 - concat - swap - concat - // modules/payment_agent/principal.py:15-28 - // arc4.emit( - // Event( - // contract_id=Global.current_application_id.id, - // type=arc4.UInt8(enums.EVT_TYPE_PR), - // type_name=String("PR"), - // time=Global.latest_timestamp, - // payoff=payoff, - // currency_id=self.denomination_asset_id.id, - // currency_unit=self.denomination_asset_id.unit_name, - // nominal_value=self.circulating_units * self.unit_value, - // nominal_rate_bps=arc4.UInt16(0), - // nominal_accrued=UInt64(0), - // ) - // ) - pushbytes 0x8c29904e // method "Event(uint64,uint8,string,uint64,uint64,uint64,byte[],uint64,uint16,uint64)" - swap - concat - log - // modules/payment_agent/principal.py:69 - // timestamp=Global.latest_timestamp, - global LatestTimestamp - // modules/payment_agent/principal.py:67-71 - // return typ.PaymentResult( - // amount=payment_amount, - // timestamp=Global.latest_timestamp, - // context=payment_info, # TODO: Add info on failed payment - // ) - itob - concat - dig 3 - dup - len - itob - extract 6 2 - swap - concat - swap - pushbytes 0x0012 - concat - swap - concat - // modules/payment_agent/principal.py:30 - // @arc4.abimethod - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - -pay_principal_else_body@3: - // modules/payment_agent/principal.py:62-63 - // # Accounts suspended or not opted in at the time of payments must not stall the D-ASA - // payment_amount = UInt64() - intc_0 // 0 - bury 1 - b pay_principal_after_if_else@4 - -pay_principal_bool_false@27: - intc_0 // 0 - b pay_principal_bool_merge@28 - -pay_principal_bool_false@20: - intc_0 // 0 - b pay_principal_bool_merge@21 - - -// modules.transfer_agent.no_coupon.NoCouponTransferAgentMixin.asset_transfer[routing]() -> void: -asset_transfer: - intc_0 // 0 - dupn 2 - pushbytes "" - dup - // modules/transfer_agent/no_coupon.py:9 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - txna ApplicationArgs 2 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - txna ApplicationArgs 3 - dup - len - intc_3 // 8 - == - assert // invalid number of bytes for arc4.uint64 - btoi - // modules/accounting.py:25 - // return self.status == enm.STATUS_ACTIVE - intc_0 // 0 - bytec_2 // "status" - app_global_get_ex - assert // check self.status exists - pushint 100 - == - // modules/core_financial/common.py:153-158 - // self.status_is_active() - // and self.secondary_market_opening_date <= Global.latest_timestamp - // and ( - // not self.secondary_market_closure_date - // or Global.latest_timestamp < self.secondary_market_closure_date - // ) - bz asset_transfer_bool_false@6 - // modules/core_financial/common.py:154 - // and self.secondary_market_opening_date <= Global.latest_timestamp - intc_0 // 0 - bytec 16 // "secondary_market_opening_date" - app_global_get_ex - assert // check self.secondary_market_opening_date exists - global LatestTimestamp - <= - // modules/core_financial/common.py:153-158 - // self.status_is_active() - // and self.secondary_market_opening_date <= Global.latest_timestamp - // and ( - // not self.secondary_market_closure_date - // or Global.latest_timestamp < self.secondary_market_closure_date - // ) - bz asset_transfer_bool_false@6 - // modules/core_financial/common.py:156 - // not self.secondary_market_closure_date - intc_0 // 0 - bytec 9 // "secondary_market_closure_date" - app_global_get_ex - assert // check self.secondary_market_closure_date exists - // modules/core_financial/common.py:156-157 - // not self.secondary_market_closure_date - // or Global.latest_timestamp < self.secondary_market_closure_date - bz asset_transfer_bool_true@5 - // modules/core_financial/common.py:157 - // or Global.latest_timestamp < self.secondary_market_closure_date - global LatestTimestamp - intc_0 // 0 - bytec 9 // "secondary_market_closure_date" - app_global_get_ex - assert // check self.secondary_market_closure_date exists - < - // modules/core_financial/common.py:156-157 - // not self.secondary_market_closure_date - // or Global.latest_timestamp < self.secondary_market_closure_date - bz asset_transfer_bool_false@6 - -asset_transfer_bool_true@5: - intc_1 // 1 - -asset_transfer_bool_merge@7: - // modules/core_financial/common.py:152-159 - // assert ( - // self.status_is_active() - // and self.secondary_market_opening_date <= Global.latest_timestamp - // and ( - // not self.secondary_market_closure_date - // or Global.latest_timestamp < self.secondary_market_closure_date - // ) - // ), err.SECONDARY_MARKET_CLOSED - assert // Secondary market is closed - // modules/core_financial/common.py:169-171 - // # The reference implementation grants transfer right to D-ASA owners. Other implementations may relay on other - // # roles, external Apps through C2C calls (e.g., an order book), or off-chain transfer agents. - // assert Txn.sender == sender_holding_address, err.UNAUTHORIZED - txn Sender - dig 3 - dup - cover 2 - == - assert // Not authorized - // modules/core_financial/common.py:172 - // self.assert_is_not_asset_defaulted() - callsub assert_is_not_asset_defaulted - // modules/core_financial/common.py:173 - // self.assert_is_not_asset_suspended() - callsub assert_is_not_asset_suspended - // modules/accounting.py:31 - // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec_1 // 0x52333023 - dig 1 - concat - dup - bury 9 - dup - box_len - bury 1 - assert // Invalid account holding address - bytec_1 // 0x52333023 - dig 4 - dup - cover 2 - concat - dup - bury 10 - dup - box_len - bury 1 - assert // Invalid account holding address - // modules/core_financial/common.py:176 - // self.assert_is_not_account_suspended(sender_holding_address) - dig 3 - callsub assert_is_not_account_suspended - // modules/core_financial/common.py:177 - // self.assert_is_not_account_suspended(receiver_holding_address) - dig 1 - callsub assert_is_not_account_suspended - // modules/core_financial/common.py:190 - // assert sender_holding_address != receiver_holding_address, err.SELF_TRANSFER - uncover 3 - uncover 2 - != - assert // Sender and receiver must be different - // modules/core_financial/common.py:191 - // assert units > 0, err.NULL_TRANSFER - dig 2 - dup - assert // Transfer units must be greater than zero - // modules/core_financial/common.py:192 - // assert units <= self.account[sender_holding_address].units, err.OVER_TRANSFER - uncover 2 - box_get - assert // check self.account entry exists - dup - intc_2 // 32 - extract_uint64 - uncover 2 - >= - assert // Insufficient sender units to transfer - // modules/accounting.py:63 - // sender_unit_value = self.account[sender].unit_value - extract 40 8 - bury 9 - // modules/accounting.py:64 - // if self.account[receiver].units > UInt64(0): - box_get - assert // check self.account entry exists - intc_2 // 32 - extract_uint64 - bz asset_transfer_else_body@9 - // modules/accounting.py:58 - // self.account[sender].unit_value == self.account[receiver].unit_value - dig 6 - box_get - assert // check self.account entry exists - pushint 40 - extract_uint64 - dig 6 - box_get - assert // check self.account entry exists - pushint 40 - extract_uint64 - == - // modules/accounting.py:58-59 - // self.account[sender].unit_value == self.account[receiver].unit_value - // and self.account[sender].paid_coupons == self.account[receiver].paid_coupons - bz asset_transfer_bool_false@20 - // modules/accounting.py:59 - // and self.account[sender].paid_coupons == self.account[receiver].paid_coupons - dig 6 - box_get - assert // check self.account entry exists - pushint 48 - extract_uint64 - dig 6 - box_get - assert // check self.account entry exists - pushint 48 - extract_uint64 - == - // modules/accounting.py:58-59 - // self.account[sender].unit_value == self.account[receiver].unit_value - // and self.account[sender].paid_coupons == self.account[receiver].paid_coupons - bz asset_transfer_bool_false@20 - intc_1 // 1 - -asset_transfer_bool_merge@21: - // modules/accounting.py:57-60 - // assert ( - // self.account[sender].unit_value == self.account[receiver].unit_value - // and self.account[sender].paid_coupons == self.account[receiver].paid_coupons - // ), err.NON_FUNGIBLE_UNITS - assert // Sender and receiver units are not fungible - -asset_transfer_after_if_else@10: - // modules/transfer_agent/no_coupon.py:45-46 - // # Transferred units value (must be computed before the transfer) - // sender_unit_value = self.account[sender_holding_address].unit_value - dig 6 - dup - box_get - assert // check self.account entry exists - pushint 40 - extract_uint64 - bury 5 - // modules/core_financial/no_coupon.py:49 - // return self.accrued_interest_amount(sender_holding_address, units) - dig 3 - dig 2 - dup - cover 2 - callsub accrued_interest_amount - bury 7 - // modules/accounting.py:71 - // assert units <= self.account[holding_address].units, err.OVER_TRANSFER - dig 1 - box_get - assert // check self.account entry exists - intc_2 // 32 - extract_uint64 - dup2 - <= - assert // Insufficient sender units to transfer - // modules/accounting.py:72 - // self.account[holding_address].units -= units - swap - - - itob - dig 1 - intc_2 // 32 - uncover 2 - box_replace - // modules/accounting.py:52 - // if self.account[holding_address].units == UInt64(0): - box_get - pop - intc_2 // 32 - extract_uint64 - bnz asset_transfer_after_if_else@16 - // modules/accounting.py:53 - // self.account[holding_address].unit_value = UInt64(0) - intc_0 // 0 - itob - dig 7 - dup - cover 2 - pushint 40 - dig 2 - box_replace - // modules/accounting.py:54 - // self.account[holding_address].paid_coupons = UInt64(0) - pushint 48 - swap - box_replace - -asset_transfer_after_if_else@16: - // modules/accounting.py:76 - // self.account[holding_address].units += units - dig 5 - dup - box_get - assert // check self.account entry exists - intc_2 // 32 - extract_uint64 - dig 2 - dup - cover 2 - + - itob - uncover 2 - intc_2 // 32 - uncover 2 - box_replace - // modules/transfer_agent/no_coupon.py:52 - // return units * sender_unit_value + accrued_interest - dig 4 - * - dig 5 - + - // modules/transfer_agent/no_coupon.py:9 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - -asset_transfer_bool_false@20: - intc_0 // 0 - b asset_transfer_bool_merge@21 - -asset_transfer_else_body@9: - // modules/accounting.py:67 - // self.account[receiver].unit_value = sender_unit_value - dig 5 - dup - pushint 40 - dig 10 - box_replace - // modules/accounting.py:68 - // self.account[receiver].paid_coupons = self.account[sender].paid_coupons - dig 7 - box_get - assert // check self.account entry exists - extract 48 8 - pushint 48 - swap - box_replace - b asset_transfer_after_if_else@10 - -asset_transfer_bool_false@6: - intc_0 // 0 - b asset_transfer_bool_merge@7 - - -// modules.core_financial.common.CoreFinancialCommonMixin.asset_create[routing]() -> void: -asset_create: - // modules/core_financial/common.py:267 - // @arc4.abimethod(create="require") - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - txna ApplicationArgs 2 - dup - len - dig 1 - pushint 38 - extract_uint16 // on error: invalid tuple encoding - dup - pushint 40 - == - assert // invalid tail pointer at index 7 of (uint8,uint8,uint8,uint8,uint8,uint8,uint8[32],(len+utf8[])) - dig 2 - swap - dig 2 - substring3 - intc_0 // 0 - extract_uint16 // on error: invalid array length header - pushint 42 - + - == - assert // invalid number of bytes for smart_contracts.abi_types.AssetMetadata - // modules/core_financial/common.py:276 - // self.arranger.value = arranger - bytec 5 // 0x52323023 - uncover 2 - app_global_put - // modules/core_financial/common.py:277 - // self.metadata = metadata.bytes - bytec 23 // "metadata" - swap - app_global_put - // modules/core_financial/common.py:267 - // @arc4.abimethod(create="require") - intc_1 // 1 - return - - -// modules.core_financial.common.CoreFinancialCommonMixin.asset_update[routing]() -> void: -asset_update: - // modules/core_financial/common.py:279 - // @arc4.abimethod(allow_actions=["UpdateApplication"]) - txna ApplicationArgs 1 - dup - len - dig 1 - pushint 38 - extract_uint16 // on error: invalid tuple encoding - dup - pushint 40 - == - assert // invalid tail pointer at index 7 of (uint8,uint8,uint8,uint8,uint8,uint8,uint8[32],(len+utf8[])) - dig 2 - swap - dig 2 - substring3 - intc_0 // 0 - extract_uint16 // on error: invalid array length header - pushint 42 - + - == - assert // invalid number of bytes for smart_contracts.abi_types.AssetMetadata - // modules/core_financial/common.py:284-287 - // # The reference implementation grants the update permissions to the Arranger. - // # Other implementations may disable D-ASA application updatability or change its authorizations. - // # ⚠️ WARNING: Application updates must be executed VERY carefully, as they might introduce breaking changes. - // self.assert_caller_is_arranger() - callsub assert_caller_is_arranger - // modules/core_financial/common.py:288 - // self.metadata = metadata.bytes - bytec 23 // "metadata" - swap - app_global_put - // modules/core_financial/common.py:279 - // @arc4.abimethod(allow_actions=["UpdateApplication"]) - intc_1 // 1 - return - - -// modules.core_financial.common.CoreFinancialCommonMixin.set_secondary_time_events[routing]() -> void: -set_secondary_time_events: - intc_0 // 0 - // modules/core_financial/common.py:290 - // @arc4.abimethod - txna ApplicationArgs 1 - dupn 2 - intc_0 // 0 - extract_uint16 // on error: invalid array length header - dup - intc_3 // 8 - * - pushint 2 - + - uncover 2 - len - == - assert // invalid number of bytes for arc4.dynamic_array - // modules/core_financial/common.py:311 - // self.assert_caller_is_arranger() - callsub assert_caller_is_arranger - // modules/accounting.py:28 - // return self.status == enm.STATUS_ENDED - intc_0 // 0 - bytec_2 // "status" - app_global_get_ex - assert // check self.status exists - intc 4 // 200 - == - // modules/core_financial/common.py:312 - // assert not self.status_is_ended(), err.UNAUTHORIZED - ! - assert // Not authorized - // modules/core_financial/common.py:313 - // self.assert_is_not_asset_defaulted() - callsub assert_is_not_asset_defaulted - // modules/core_financial/common.py:315 - // assert secondary_market_time_events.length >= 1, err.INVALID_TIME_EVENTS_LENGTH - dup - assert // Time events length is invalid - // modules/core_financial/common.py:316 - // if secondary_market_time_events.length > 1: - intc_1 // 1 - > - bz set_secondary_time_events_after_if_else@3 - // modules/core_financial/common.py:317 - // self.assert_time_events_sorted(secondary_market_time_events) - dup - callsub assert_time_events_sorted - bury 1 - -set_secondary_time_events_after_if_else@3: - // modules/core_financial/common.py:320 - // self.issuance_date - intc_0 // 0 - bytec 8 // "issuance_date" - app_global_get_ex - assert // check self.issuance_date exists - // modules/core_financial/common.py:321 - // <= secondary_market_time_events[cfg.SECONDARY_MARKET_OPENING_DATE_IDX] - dig 1 - dup - extract 2 0 - bury 4 - pushint 2 - extract_uint64 - // modules/core_financial/common.py:320-321 - // self.issuance_date - // <= secondary_market_time_events[cfg.SECONDARY_MARKET_OPENING_DATE_IDX] - swap - dig 1 - <= - // modules/core_financial/common.py:319-322 - // assert ( - // self.issuance_date - // <= secondary_market_time_events[cfg.SECONDARY_MARKET_OPENING_DATE_IDX] - // ), err.INVALID_SECONDARY_OPENING_DATE - assert // Invalid secondary market opening date - // modules/core_financial/common.py:323 - // self.secondary_market_opening_date = secondary_market_time_events[ - bytec 16 // "secondary_market_opening_date" - // modules/core_financial/common.py:323-325 - // self.secondary_market_opening_date = secondary_market_time_events[ - // cfg.SECONDARY_MARKET_OPENING_DATE_IDX - // ] - swap - app_global_put - // modules/core_financial/common.py:326 - // if self.maturity_date: - intc_0 // 0 - bytec 4 // "maturity_date" - app_global_get_ex - assert // check self.maturity_date exists - bz set_secondary_time_events_after_if_else@5 - // modules/core_financial/common.py:328 - // self.maturity_date - intc_0 // 0 - bytec 4 // "maturity_date" - app_global_get_ex - assert // check self.maturity_date exists - // modules/core_financial/common.py:329 - // >= secondary_market_time_events[cfg.SECONDARY_MARKET_CLOSURE_DATE_IDX] - dig 1 - intc_0 // 0 - extract_uint16 // on error: invalid array length header - intc_1 // 1 - - - intc_3 // 8 - * - dig 3 - swap - extract_uint64 - // modules/core_financial/common.py:328-329 - // self.maturity_date - // >= secondary_market_time_events[cfg.SECONDARY_MARKET_CLOSURE_DATE_IDX] - swap - dig 1 - >= - // modules/core_financial/common.py:327-330 - // assert ( - // self.maturity_date - // >= secondary_market_time_events[cfg.SECONDARY_MARKET_CLOSURE_DATE_IDX] - // ), err.INVALID_SECONDARY_CLOSURE_DATE - assert // Invalid secondary market closure date - // modules/core_financial/common.py:331 - // self.secondary_market_closure_date = secondary_market_time_events[ - bytec 9 // "secondary_market_closure_date" - // modules/core_financial/common.py:331-333 - // self.secondary_market_closure_date = secondary_market_time_events[ - // cfg.SECONDARY_MARKET_CLOSURE_DATE_IDX - // ] - swap - app_global_put - -set_secondary_time_events_after_if_else@5: - // modules/core_financial/common.py:335 - // secondary_market_opening_date=self.secondary_market_opening_date, - intc_0 // 0 - bytec 16 // "secondary_market_opening_date" - app_global_get_ex - assert // check self.secondary_market_opening_date exists - // modules/core_financial/common.py:336 - // secondary_market_closure_date=self.secondary_market_closure_date, - intc_0 // 0 - bytec 9 // "secondary_market_closure_date" - app_global_get_ex - assert // check self.secondary_market_closure_date exists - // modules/core_financial/common.py:334-337 - // return typ.SecondaryMarketSchedule( - // secondary_market_opening_date=self.secondary_market_opening_date, - // secondary_market_closure_date=self.secondary_market_closure_date, - // ) - swap - itob - swap - itob - concat - // modules/core_financial/common.py:290 - // @arc4.abimethod - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.core_financial.common.CoreFinancialCommonMixin.set_default_status[routing]() -> void: -set_default_status: - // modules/core_financial/common.py:339 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_1 // 1 - == - assert // invalid number of bytes for arc4.bool - intc_0 // 0 - getbit - // modules/rbac.py:74 - // assert self._role_is_active(self.trustee, Txn.sender), err.UNAUTHORIZED - bytec 17 // 0x52363023 - txn Sender - callsub _role_is_active - assert // Not authorized - // modules/core_financial/common.py:352 - // self.asset_defaulted = defaulted - bytec 21 // "asset_defaulted" - swap - app_global_put - // modules/core_financial/common.py:353 - // return Global.latest_timestamp - global LatestTimestamp - // modules/core_financial/common.py:339 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.core_financial.common.CoreFinancialCommonMixin.primary_distribution[routing]() -> void: -primary_distribution: - pushbytes "" - // modules/core_financial/common.py:355 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - txna ApplicationArgs 2 - dup - len - intc_3 // 8 - == - assert // invalid number of bytes for arc4.uint64 - btoi - // modules/accounting.py:25 - // return self.status == enm.STATUS_ACTIVE - intc_0 // 0 - bytec_2 // "status" - app_global_get_ex - assert // check self.status exists - pushint 100 - == - // modules/core_financial/common.py:145-148 - // self.status_is_active() - // and self.primary_distribution_opening_date - // <= Global.latest_timestamp - // < self.primary_distribution_closure_date - bz primary_distribution_bool_false@5 - // modules/core_financial/common.py:146 - // and self.primary_distribution_opening_date - intc_0 // 0 - bytec 7 // "primary_distribution_opening_date" - app_global_get_ex - assert // check self.primary_distribution_opening_date exists - // modules/core_financial/common.py:147 - // <= Global.latest_timestamp - global LatestTimestamp - dup - bury 5 - // modules/core_financial/common.py:146-147 - // and self.primary_distribution_opening_date - // <= Global.latest_timestamp - <= - // modules/core_financial/common.py:146-148 - // and self.primary_distribution_opening_date - // <= Global.latest_timestamp - // < self.primary_distribution_closure_date - bz primary_distribution_bool_false@5 - // modules/core_financial/common.py:148 - // < self.primary_distribution_closure_date - intc_0 // 0 - bytec 24 // "primary_distribution_closure_date" - app_global_get_ex - assert // check self.primary_distribution_closure_date exists - // modules/core_financial/common.py:147-148 - // <= Global.latest_timestamp - // < self.primary_distribution_closure_date - dig 3 - > - // modules/core_financial/common.py:146-148 - // and self.primary_distribution_opening_date - // <= Global.latest_timestamp - // < self.primary_distribution_closure_date - bz primary_distribution_bool_false@5 - intc_1 // 1 - -primary_distribution_bool_merge@6: - // modules/core_financial/common.py:144-149 - // assert ( - // self.status_is_active() - // and self.primary_distribution_opening_date - // <= Global.latest_timestamp - // < self.primary_distribution_closure_date - // ), err.PRIMARY_DISTRIBUTION_CLOSED - assert // Primary distribution is closed - // modules/rbac.py:71 - // assert self._role_is_active(self.primary_dealer, Txn.sender), err.UNAUTHORIZED - bytec 18 // 0x52353023 - txn Sender - callsub _role_is_active - assert // Not authorized - // modules/accounting.py:31 - // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec_1 // 0x52333023 - dig 2 - concat - dup - box_len - bury 1 - assert // Invalid account holding address - // modules/core_financial/common.py:383 - // self.assert_is_not_asset_defaulted() - callsub assert_is_not_asset_defaulted - // modules/core_financial/common.py:384 - // self.assert_is_not_asset_suspended() - callsub assert_is_not_asset_suspended - // modules/core_financial/common.py:385 - // assert units > 0, err.ZERO_UNITS - dig 1 - dup - assert // Can not distribute zero units - // modules/core_financial/common.py:386 - // assert self.circulating_units + units <= self.total_units, err.OVER_DISTRIBUTION - intc_0 // 0 - bytec_3 // "circulating_units" - app_global_get_ex - assert // check self.circulating_units exists - dig 1 - + - intc_0 // 0 - bytec 12 // "total_units" - app_global_get_ex - assert // check self.total_units exists - dig 1 - >= - assert // Insufficient remaining D-ASA units - // modules/core_financial/common.py:388 - // self.circulating_units += units - bytec_3 // "circulating_units" - dig 1 - app_global_put - // modules/core_financial/common.py:389 - // self.account[holding_address].units += units - dig 2 - box_get - assert // check self.account entry exists - intc_2 // 32 - extract_uint64 - uncover 2 - + - itob - dig 2 - intc_2 // 32 - uncover 2 - box_replace - // modules/core_financial/common.py:390 - // self.account[holding_address].unit_value = self.unit_value - intc_0 // 0 - bytec 6 // "unit_value" - app_global_get_ex - assert // check self.unit_value exists - itob - uncover 2 - pushint 40 - uncover 2 - box_replace - // modules/core_financial/common.py:391 - // return self.total_units - self.circulating_units - intc_0 // 0 - bytec 12 // "total_units" - app_global_get_ex - assert // check self.total_units exists - swap - - - // modules/core_financial/common.py:355 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - -primary_distribution_bool_false@5: - intc_0 // 0 - b primary_distribution_bool_merge@6 - - -// modules.core_financial.common.CoreFinancialCommonMixin.get_asset_info[routing]() -> void: -get_asset_info: - // modules/core_financial/common.py:403 - // performance = UInt64(cst.PRF_PERFORMANT) - intc_0 // 0 - // modules/core_financial/common.py:404 - // if Global.latest_timestamp > self.maturity_date > 0: - global LatestTimestamp - intc_0 // 0 - bytec 4 // "maturity_date" - app_global_get_ex - swap - dup - cover 2 - cover 3 - assert // check self.maturity_date exists - > - bz get_asset_info_after_if_else@4 - dup - bz get_asset_info_after_if_else@4 - // modules/core_financial/common.py:405 - // performance = UInt64(cst.PRF_MATURED) - pushint 4 - bury 2 - -get_asset_info_after_if_else@4: - // modules/core_financial/common.py:406-407 - // # The reference implementation has no grace or delinquency periods - // if self.asset_defaulted: - intc_0 // 0 - bytec 21 // "asset_defaulted" - app_global_get_ex - assert // check self.asset_defaulted exists - bz get_asset_info_after_if_else@6 - // modules/core_financial/common.py:408 - // performance = UInt64(cst.PRF_DEFAULTED) - pushint 3 - bury 2 - -get_asset_info_after_if_else@6: - // modules/core_financial/common.py:411 - // denomination_asset_id=self.denomination_asset_id.id, - intc_0 // 0 - bytec 22 // "denomination_asset_id" - app_global_get_ex - assert // check self.denomination_asset_id exists - // modules/core_financial/common.py:412 - // settlement_asset_id=self.settlement_asset_id.id, - intc_0 // 0 - bytec 13 // "settlement_asset_id" - app_global_get_ex - assert // check self.settlement_asset_id exists - // modules/accounting.py:45 - // return self.circulating_units * self.unit_value - intc_0 // 0 - bytec_3 // "circulating_units" - app_global_get_ex - assert // check self.circulating_units exists - intc_0 // 0 - bytec 6 // "unit_value" - app_global_get_ex - assert // check self.unit_value exists - dup2 - * - // modules/core_financial/common.py:415 - // day_count_convention=arc4.UInt8(self.day_count_convention), - intc_0 // 0 - bytec 14 // "day_count_convention" - app_global_get_ex - assert // check self.day_count_convention exists - itob - dup - bitlen - intc_3 // 8 - <= - assert // overflow - extract 7 1 - // modules/core_financial/common.py:416 - // principal_discount=arc4.UInt16(self.principal_discount), - intc_0 // 0 - bytec 15 // "principal_discount" - app_global_get_ex - assert // check self.principal_discount exists - itob - dup - bitlen - pushint 16 - <= - assert // overflow - extract 6 2 - // modules/core_financial/common.py:417 - // interest_rate=arc4.UInt16(self.interest_rate), - intc_0 // 0 - bytec 26 // "interest_rate" - app_global_get_ex - assert // check self.interest_rate exists - itob - dup - bitlen - pushint 16 - <= - assert // overflow - extract 6 2 - // modules/core_financial/common.py:418 - // total_supply=self.total_units, - intc_0 // 0 - bytec 12 // "total_units" - app_global_get_ex - assert // check self.total_units exists - // modules/core_financial/common.py:420 - // primary_distribution_opening_date=self.primary_distribution_opening_date, - intc_0 // 0 - bytec 7 // "primary_distribution_opening_date" - app_global_get_ex - assert // check self.primary_distribution_opening_date exists - // modules/core_financial/common.py:421 - // primary_distribution_closure_date=self.primary_distribution_closure_date, - intc_0 // 0 - bytec 24 // "primary_distribution_closure_date" - app_global_get_ex - assert // check self.primary_distribution_closure_date exists - // modules/core_financial/common.py:422 - // issuance_date=self.issuance_date, - intc_0 // 0 - bytec 8 // "issuance_date" - app_global_get_ex - assert // check self.issuance_date exists - // modules/core_financial/common.py:423 - // maturity_date=self.maturity_date, - intc_0 // 0 - bytec 4 // "maturity_date" - app_global_get_ex - assert // check self.maturity_date exists - // modules/core_financial/common.py:424 - // suspended=self.asset_suspended, - intc_0 // 0 - bytec 20 // "asset_suspended" - app_global_get_ex - assert // check self.asset_suspended exists - // modules/core_financial/common.py:425 - // performance=arc4.UInt8(performance), - dig 15 - itob - dup - bitlen - intc_3 // 8 - <= - assert // overflow - extract 7 1 - // modules/core_financial/common.py:410-426 - // return typ.AssetInfo( - // denomination_asset_id=self.denomination_asset_id.id, - // settlement_asset_id=self.settlement_asset_id.id, - // outstanding_principal=self.outstanding_principal(), - // unit_value=self.unit_value, - // day_count_convention=arc4.UInt8(self.day_count_convention), - // principal_discount=arc4.UInt16(self.principal_discount), - // interest_rate=arc4.UInt16(self.interest_rate), - // total_supply=self.total_units, - // circulating_supply=self.circulating_units, - // primary_distribution_opening_date=self.primary_distribution_opening_date, - // primary_distribution_closure_date=self.primary_distribution_closure_date, - // issuance_date=self.issuance_date, - // maturity_date=self.maturity_date, - // suspended=self.asset_suspended, - // performance=arc4.UInt8(performance), - // ) - uncover 14 - itob - uncover 14 - itob - concat - uncover 11 - itob - concat - uncover 11 - itob - concat - uncover 10 - concat - uncover 9 - concat - uncover 8 - concat - uncover 7 - itob - concat - uncover 7 - itob - concat - uncover 6 - itob - concat - uncover 5 - itob - concat - uncover 4 - itob - concat - uncover 3 - itob - concat - bytec 28 // 0x00 - intc_0 // 0 - uncover 4 - setbit - concat - swap - concat - // modules/core_financial/common.py:393 - // @arc4.abimethod(readonly=True) - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.core_financial.common.CoreFinancialCommonMixin.get_time_events[routing]() -> void: -get_time_events: - // modules/core_financial/common.py:436 - // time_events = typ.TimeEvents() - bytec 30 // 0x0000 - // modules/accounting.py:25 - // return self.status == enm.STATUS_ACTIVE - intc_0 // 0 - bytec_2 // "status" - app_global_get_ex - assert // check self.status exists - pushint 100 - == - // modules/core_financial/common.py:437 - // if self.status_is_active(): - bz get_time_events_after_if_else@3 - // modules/core_financial/common.py:438 - // time_events = self.time_events.value.copy() - bytec 27 // 0x74696d654576656e7473 - box_get - swap - bury 2 - assert // check self.time_events exists - -get_time_events_after_if_else@3: - // modules/core_financial/common.py:428 - // @arc4.abimethod(readonly=True) - bytec_0 // 0x151f7c75 - dig 1 - concat - log - intc_1 // 1 - return - - -// modules.core_financial.common.CoreFinancialCommonMixin.get_secondary_market_schedule[routing]() -> void: -get_secondary_market_schedule: - // modules/core_financial/common.py:450 - // (self.secondary_market_opening_date, self.secondary_market_closure_date) - intc_0 // 0 - bytec 16 // "secondary_market_opening_date" - app_global_get_ex - assert // check self.secondary_market_opening_date exists - intc_0 // 0 - bytec 9 // "secondary_market_closure_date" - app_global_get_ex - assert // check self.secondary_market_closure_date exists - // modules/core_financial/common.py:449-451 - // return typ.TimeEvents( - // (self.secondary_market_opening_date, self.secondary_market_closure_date) - // ) - swap - itob - pushbytes 0x0002 - swap - concat - swap - itob - concat - // modules/core_financial/common.py:441 - // @arc4.abimethod(readonly=True) - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.core_financial.common.CoreFinancialCommonMixin.get_asset_metadata[routing]() -> void: -get_asset_metadata: - // modules/core_financial/common.py:462 - // return typ.AssetMetadata.from_bytes(self.metadata) - intc_0 // 0 - bytec 23 // "metadata" - app_global_get_ex - assert // check self.metadata exists - // modules/core_financial/common.py:453 - // @arc4.abimethod(readonly=True) - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.accounting.AccountingModule.account_gov_suspension[routing]() -> void: -account_gov_suspension: - // modules/accounting.py:94 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - txna ApplicationArgs 2 - dup - len - intc_1 // 1 - == - assert // invalid number of bytes for arc4.bool - intc_0 // 0 - getbit - // modules/rbac.py:77 - // assert self._role_is_active(self.authority, Txn.sender), err.UNAUTHORIZED - bytec 10 // 0x52373023 - txn Sender - callsub _role_is_active - assert // Not authorized - // modules/accounting.py:31 - // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec_1 // 0x52333023 - uncover 2 - concat - dup - box_len - bury 1 - assert // Invalid account holding address - // modules/accounting.py:114 - // self.account[holding_address].suspended = suspended - dup - pushint 56 - intc_1 // 1 - box_extract - intc_0 // 0 - uncover 3 - setbit - pushint 56 - swap - box_replace - // modules/accounting.py:115 - // return Global.latest_timestamp - global LatestTimestamp - // modules/accounting.py:94 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.accounting.AccountingModule.account_open[routing]() -> void: -account_open: - // modules/accounting.py:117 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - txna ApplicationArgs 2 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:68 - // assert self._role_is_active(self.account_manager, Txn.sender), err.UNAUTHORIZED - bytec 11 // 0x52343023 - txn Sender - callsub _role_is_active - assert // Not authorized - // modules/accounting.py:28 - // return self.status == enm.STATUS_ENDED - intc_0 // 0 - bytec_2 // "status" - app_global_get_ex - assert // check self.status exists - intc 4 // 200 - == - // modules/accounting.py:139 - // assert not self.status_is_ended(), err.UNAUTHORIZED - ! - assert // Not authorized - // modules/accounting.py:140 - // self.assert_is_not_asset_defaulted() - callsub assert_is_not_asset_defaulted - // modules/accounting.py:141 - // self.assert_is_not_asset_suspended() - callsub assert_is_not_asset_suspended - // modules/accounting.py:142 - // assert holding_address not in self.account, err.INVALID_HOLDING_ADDRESS - bytec_1 // 0x52333023 - uncover 2 - concat - dup - box_len - bury 1 - ! - assert // Invalid account holding address - // modules/accounting.py:146 - // units=UInt64(0), - intc_0 // 0 - // modules/accounting.py:144-150 - // self.account[holding_address] = typ.AccountInfo( - // payment_address=payment_address, - // units=UInt64(0), - // unit_value=UInt64(0), - // paid_coupons=UInt64(0), - // suspended=False, - // ) - itob - uncover 2 - dig 1 - concat - dig 1 - concat - swap - concat - bytec 28 // 0x00 - concat - box_put - // modules/accounting.py:151 - // return Global.latest_timestamp - global LatestTimestamp - // modules/accounting.py:117 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.accounting.AccountingModule.account_close[routing]() -> void: -account_close: - // modules/accounting.py:153 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:68 - // assert self._role_is_active(self.account_manager, Txn.sender), err.UNAUTHORIZED - bytec 11 // 0x52343023 - txn Sender - callsub _role_is_active - assert // Not authorized - // modules/accounting.py:171 - // self.assert_is_not_asset_defaulted() - callsub assert_is_not_asset_defaulted - // modules/accounting.py:31 - // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec_1 // 0x52333023 - swap - concat - dup - box_len - bury 1 - assert // Invalid account holding address - // modules/accounting.py:174 - // closed_units = self.account[holding_address].units - dup - box_get - pop - intc_2 // 32 - extract_uint64 - // modules/accounting.py:175 - // del self.account[holding_address] - swap - box_del - pop - // modules/accounting.py:176 - // self.circulating_units -= closed_units - intc_0 // 0 - bytec_3 // "circulating_units" - app_global_get_ex - assert // check self.circulating_units exists - dig 1 - - - bytec_3 // "circulating_units" - swap - app_global_put - // modules/accounting.py:177 - // self.end_if_no_circulating_units() - callsub end_if_no_circulating_units - // modules/accounting.py:178 - // return closed_units, Global.latest_timestamp - global LatestTimestamp - // modules/accounting.py:153 - // @arc4.abimethod - swap - itob - swap - itob - concat - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.accounting.AccountingModule.account_update_payment_address[routing]() -> void: -account_update_payment_address: - // modules/accounting.py:180 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - txna ApplicationArgs 2 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/accounting.py:200 - // assert Txn.sender == holding_address, err.UNAUTHORIZED - txn Sender - dig 2 - == - assert // Not authorized - // modules/accounting.py:201 - // self.assert_is_not_asset_defaulted() - callsub assert_is_not_asset_defaulted - // modules/accounting.py:202 - // self.assert_is_not_asset_suspended() - callsub assert_is_not_asset_suspended - // modules/accounting.py:31 - // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec_1 // 0x52333023 - uncover 2 - concat - dup - box_len - bury 1 - assert // Invalid account holding address - // modules/accounting.py:204 - // self.account[holding_address].payment_address = payment_address - intc_0 // 0 - uncover 2 - box_replace - // modules/accounting.py:205 - // return Global.latest_timestamp - global LatestTimestamp - // modules/accounting.py:180 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.accounting.AccountingModule.account_get_info[routing]() -> void: -account_get_info: - // modules/accounting.py:207 - // @arc4.abimethod(readonly=True) - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/accounting.py:31 - // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec_1 // 0x52333023 - swap - concat - dup - box_len - bury 1 - assert // Invalid account holding address - // modules/accounting.py:222 - // return self.account[holding_address] - box_get - pop - // modules/accounting.py:207 - // @arc4.abimethod(readonly=True) - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.rbac.RbacModule.rbac_rotate_arranger[routing]() -> void: -rbac_rotate_arranger: - // modules/rbac.py:147 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:158 - // self.assert_caller_is_arranger() - callsub assert_caller_is_arranger - // modules/rbac.py:159 - // self.arranger.value = new_arranger - bytec 5 // 0x52323023 - swap - app_global_put - // modules/rbac.py:160 - // return Global.latest_timestamp - global LatestTimestamp - // modules/rbac.py:147 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.rbac.RbacModule.rbac_set_op_daemon[routing]() -> void: -rbac_set_op_daemon: - // modules/rbac.py:162 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:173 - // self.assert_caller_is_arranger() - callsub assert_caller_is_arranger - // modules/rbac.py:174 - // self.op_daemon.value = address - bytec 19 // 0x52323523 - swap - app_global_put - // modules/rbac.py:175 - // return Global.latest_timestamp - global LatestTimestamp - // modules/rbac.py:162 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.rbac.RbacModule.rbac_assign_role[routing]() -> void: -rbac_assign_role: - // modules/rbac.py:177 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_1 // 1 - == - assert // invalid number of bytes for arc4.uint8 - txna ApplicationArgs 2 - dup - cover 2 - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - txna ApplicationArgs 3 - dup - intc_0 // 0 - extract_uint16 // on error: invalid array length header - pushint 2 - + - dig 1 - len - == - assert // invalid number of bytes for arc4.dynamic_array - extract 2 0 - swap - // modules/rbac.py:199 - // self.assert_caller_is_arranger() - callsub assert_caller_is_arranger - // modules/rbac.py:200 - // self.assert_is_not_asset_defaulted() - callsub assert_is_not_asset_defaulted - // modules/rbac.py:201 - // self._assert_valid_role(role_id.as_uint64()) - btoi - dupn 2 - callsub _assert_valid_role - // modules/rbac.py:101 - // if role_id == UInt64(cst.ROLE_ARRANGER): - pushint 20 - == - bz rbac_assign_role_after_if_else@3 - // modules/rbac.py:102 - // self.arranger.value = role_address - bytec 5 // 0x52323023 - dig 3 - app_global_put - -rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14: - // modules/rbac.py:203 - // return Global.latest_timestamp - global LatestTimestamp - // modules/rbac.py:177 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - -rbac_assign_role_after_if_else@3: - // modules/rbac.py:105 - // if role_id == UInt64(cst.ROLE_ACCOUNT_MANAGER): - dup - pushint 40 - == - bz rbac_assign_role_after_if_else@5 - // modules/rbac.py:106 - // assert role_address not in self.account_manager, err.INVALID_ROLE_ADDRESS - bytec 11 // 0x52343023 - dig 3 - concat - dup - box_len - bury 1 - ! - assert // Invalid account role address - // modules/rbac.py:107 - // self.account_manager[role_address] = typ.RoleConfig.from_bytes(config) - dig 2 - box_put - // modules/rbac.py:202 - // self._upsert_role(role_id.as_uint64(), role_address, config) - b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14 - -rbac_assign_role_after_if_else@5: - // modules/rbac.py:109 - // if role_id == UInt64(cst.ROLE_PRIMARY_DEALER): - dup - pushint 50 - == - bz rbac_assign_role_after_if_else@7 - // modules/rbac.py:110 - // assert role_address not in self.primary_dealer, err.INVALID_ROLE_ADDRESS - bytec 18 // 0x52353023 - dig 3 - concat - dup - box_len - bury 1 - ! - assert // Invalid account role address - // modules/rbac.py:111 - // self.primary_dealer[role_address] = typ.RoleConfig.from_bytes(config) - dig 2 - box_put - // modules/rbac.py:202 - // self._upsert_role(role_id.as_uint64(), role_address, config) - b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14 - -rbac_assign_role_after_if_else@7: - // modules/rbac.py:113 - // if role_id == UInt64(cst.ROLE_TRUSTEE): - dup - pushint 60 - == - bz rbac_assign_role_after_if_else@9 - // modules/rbac.py:114 - // assert role_address not in self.trustee, err.INVALID_ROLE_ADDRESS - bytec 17 // 0x52363023 - dig 3 - concat - dup - box_len - bury 1 - ! - assert // Invalid account role address - // modules/rbac.py:115 - // self.trustee[role_address] = typ.RoleConfig.from_bytes(config) - dig 2 - box_put - // modules/rbac.py:202 - // self._upsert_role(role_id.as_uint64(), role_address, config) - b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14 - -rbac_assign_role_after_if_else@9: - // modules/rbac.py:117 - // if role_id == UInt64(cst.ROLE_AUTHORITY): - dup - pushint 70 - == - bz rbac_assign_role_after_if_else@11 - // modules/rbac.py:118 - // assert role_address not in self.authority, err.INVALID_ROLE_ADDRESS - bytec 10 // 0x52373023 - dig 3 - concat - dup - box_len - bury 1 - ! - assert // Invalid account role address - // modules/rbac.py:119 - // self.authority[role_address] = typ.RoleConfig.from_bytes(config) - dig 2 - box_put - // modules/rbac.py:202 - // self._upsert_role(role_id.as_uint64(), role_address, config) - b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14 - -rbac_assign_role_after_if_else@11: - // modules/rbac.py:121 - // if role_id == UInt64(cst.ROLE_INTEREST_ORACLE): - dup - pushint 80 - == - bz rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14 - // modules/rbac.py:122 - // assert role_address not in self.interest_oracle, err.INVALID_ROLE_ADDRESS - bytec 25 // 0x52383023 - dig 3 - concat - dup - box_len - bury 1 - ! - assert // Invalid account role address - // modules/rbac.py:123 - // self.interest_oracle[role_address] = typ.RoleConfig.from_bytes(config) - dig 2 - box_put - b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14 - - -// modules.rbac.RbacModule.rbac_revoke_role[routing]() -> void: -rbac_revoke_role: - // modules/rbac.py:205 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_1 // 1 - == - assert // invalid number of bytes for arc4.uint8 - txna ApplicationArgs 2 - dup - cover 2 - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:224 - // self.assert_caller_is_arranger() - callsub assert_caller_is_arranger - // modules/rbac.py:225 - // self.assert_is_not_asset_defaulted() - callsub assert_is_not_asset_defaulted - // modules/rbac.py:226 - // self._assert_valid_role(role_id.as_uint64()) - btoi - dupn 2 - callsub _assert_valid_role - // modules/rbac.py:126 - // assert role_id != UInt64(cst.ROLE_ARRANGER), err.INVALID_ROLE - dup - pushint 20 - != - assert // Invalid role identifier - // modules/rbac.py:127 - // if role_id == UInt64(cst.ROLE_ACCOUNT_MANAGER): - pushint 40 - == - bz rbac_revoke_role_after_if_else@3 - // modules/rbac.py:128 - // assert role_address in self.account_manager, err.INVALID_ROLE_ADDRESS - bytec 11 // 0x52343023 - dig 2 - concat - dup - box_len - bury 1 - assert // Invalid account role address - // modules/rbac.py:129 - // del self.account_manager[role_address] - box_del - pop - -rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12: - // modules/rbac.py:228 - // return Global.latest_timestamp - global LatestTimestamp - // modules/rbac.py:205 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - -rbac_revoke_role_after_if_else@3: - // modules/rbac.py:131 - // if role_id == UInt64(cst.ROLE_PRIMARY_DEALER): - dup - pushint 50 - == - bz rbac_revoke_role_after_if_else@5 - // modules/rbac.py:132 - // assert role_address in self.primary_dealer, err.INVALID_ROLE_ADDRESS - bytec 18 // 0x52353023 - dig 2 - concat - dup - box_len - bury 1 - assert // Invalid account role address - // modules/rbac.py:133 - // del self.primary_dealer[role_address] - box_del - pop - // modules/rbac.py:227 - // self._delete_role(role_id.as_uint64(), role_address) - b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 - -rbac_revoke_role_after_if_else@5: - // modules/rbac.py:135 - // if role_id == UInt64(cst.ROLE_TRUSTEE): - dup - pushint 60 - == - bz rbac_revoke_role_after_if_else@7 - // modules/rbac.py:136 - // assert role_address in self.trustee, err.INVALID_ROLE_ADDRESS - bytec 17 // 0x52363023 - dig 2 - concat - dup - box_len - bury 1 - assert // Invalid account role address - // modules/rbac.py:137 - // del self.trustee[role_address] - box_del - pop - // modules/rbac.py:227 - // self._delete_role(role_id.as_uint64(), role_address) - b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 - -rbac_revoke_role_after_if_else@7: - // modules/rbac.py:139 - // if role_id == UInt64(cst.ROLE_AUTHORITY): - dup - pushint 70 - == - bz rbac_revoke_role_after_if_else@9 - // modules/rbac.py:140 - // assert role_address in self.authority, err.INVALID_ROLE_ADDRESS - bytec 10 // 0x52373023 - dig 2 - concat - dup - box_len - bury 1 - assert // Invalid account role address - // modules/rbac.py:141 - // del self.authority[role_address] - box_del - pop - // modules/rbac.py:227 - // self._delete_role(role_id.as_uint64(), role_address) - b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 - -rbac_revoke_role_after_if_else@9: - // modules/rbac.py:143 - // if role_id == UInt64(cst.ROLE_INTEREST_ORACLE): - dup - pushint 80 - == - bz rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 - // modules/rbac.py:144 - // assert role_address in self.interest_oracle, err.INVALID_ROLE_ADDRESS - bytec 25 // 0x52383023 - dig 2 - concat - dup - box_len - bury 1 - assert // Invalid account role address - // modules/rbac.py:145 - // del self.interest_oracle[role_address] - box_del - pop - b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 - - -// modules.rbac.RbacModule.rbac_gov_asset_suspension[routing]() -> void: -rbac_gov_asset_suspension: - // modules/rbac.py:230 - // @arc4.abimethod # TODO: Update specs and add test - txna ApplicationArgs 1 - dup - len - intc_1 // 1 - == - assert // invalid number of bytes for arc4.bool - intc_0 // 0 - getbit - // modules/rbac.py:77 - // assert self._role_is_active(self.authority, Txn.sender), err.UNAUTHORIZED - bytec 10 // 0x52373023 - txn Sender - callsub _role_is_active - assert // Not authorized - // modules/rbac.py:246 - // self.asset_suspended = suspended - bytec 20 // "asset_suspended" - swap - app_global_put - // modules/rbac.py:247 - // return Global.latest_timestamp - global LatestTimestamp - // modules/rbac.py:230 - // @arc4.abimethod # TODO: Update specs and add test - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.rbac.RbacModule.rbac_get_arranger[routing]() -> void: -rbac_get_arranger: - // modules/rbac.py:257 - // return self.arranger.value - intc_0 // 0 - bytec 5 // 0x52323023 - app_global_get_ex - assert // check self.arranger exists - // modules/rbac.py:249 - // @arc4.abimethod(readonly=True) - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.rbac.RbacModule.rbac_get_address_roles[routing]() -> void: -rbac_get_address_roles: - // modules/rbac.py:259 - // @arc4.abimethod(readonly=True) - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:273 - // self._role_is_active(self.account_manager, address), - bytec 11 // 0x52343023 - dig 1 - callsub _role_is_active - // modules/rbac.py:274 - // self._role_is_active(self.primary_dealer, address), - bytec 18 // 0x52353023 - dig 2 - callsub _role_is_active - // modules/rbac.py:275 - // self._role_is_active(self.trustee, address), - bytec 17 // 0x52363023 - dig 3 - callsub _role_is_active - // modules/rbac.py:276 - // self._role_is_active(self.authority, address), - bytec 10 // 0x52373023 - dig 4 - callsub _role_is_active - // modules/rbac.py:277 - // self._role_is_active(self.interest_oracle, address), - bytec 25 // 0x52383023 - uncover 5 - callsub _role_is_active - // modules/rbac.py:259 - // @arc4.abimethod(readonly=True) - bytec 28 // 0x00 - intc_0 // 0 - uncover 6 - setbit - intc_1 // 1 - uncover 5 - setbit - pushint 2 - uncover 4 - setbit - pushint 3 - uncover 3 - setbit - pushint 4 - uncover 2 - setbit - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.rbac.RbacModule.rbac_get_role_config[routing]() -> void: -rbac_get_role_config: - // modules/rbac.py:280 - // @arc4.abimethod(readonly=True) - txna ApplicationArgs 1 - dup - len - intc_1 // 1 - == - assert // invalid number of bytes for arc4.uint8 - txna ApplicationArgs 2 - dup - cover 2 - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:294 - // role = role_id.as_uint64() - btoi - // modules/rbac.py:295 - // self._assert_valid_role(role) - dup - callsub _assert_valid_role - // modules/rbac.py:297 - // case UInt64(cst.ROLE_ARRANGER): - pushints 20 40 50 60 70 80 - // modules/rbac.py:296-327 - // match role: - // case UInt64(cst.ROLE_ARRANGER): - // return typ.RoleConfig( - // role_validity_start=UInt64(0), role_validity_end=UInt64(0) - // ) - // case UInt64(cst.ROLE_ACCOUNT_MANAGER): - // assert self._has_role( - // self.account_manager, role_address - // ), err.INVALID_ROLE_ADDRESS - // return self.account_manager[role_address] - // case UInt64(cst.ROLE_PRIMARY_DEALER): - // assert self._has_role( - // self.primary_dealer, role_address - // ), err.INVALID_ROLE_ADDRESS - // return self.primary_dealer[role_address] - // case UInt64(cst.ROLE_TRUSTEE): - // assert self._has_role( - // self.trustee, role_address - // ), err.INVALID_ROLE_ADDRESS - // return self.trustee[role_address] - // case UInt64(cst.ROLE_AUTHORITY): - // assert self._has_role( - // self.authority, role_address - // ), err.INVALID_ROLE_ADDRESS - // return self.authority[role_address] - // case UInt64(cst.ROLE_INTEREST_ORACLE): - // assert self._has_role( - // self.interest_oracle, role_address - // ), err.INVALID_ROLE_ADDRESS - // return self.interest_oracle[role_address] - // case _: - // op.err(err.INVALID_ROLE) - uncover 6 - match rbac_get_role_config_switch_case_0@2 rbac_get_role_config_switch_case_1@3 rbac_get_role_config_switch_case_2@4 rbac_get_role_config_switch_case_3@5 rbac_get_role_config_switch_case_4@6 rbac_get_role_config_switch_case_5@7 - // modules/rbac.py:327 - // op.err(err.INVALID_ROLE) - err // Invalid role identifier - -rbac_get_role_config_switch_case_5@7: - // modules/rbac.py:323 - // self.interest_oracle, role_address - bytec 25 // 0x52383023 - // modules/rbac.py:55 - // return role_address in role_map - dig 1 - concat - dup - box_len - bury 1 - // modules/rbac.py:322-324 - // assert self._has_role( - // self.interest_oracle, role_address - // ), err.INVALID_ROLE_ADDRESS - assert // Invalid account role address - // modules/rbac.py:325 - // return self.interest_oracle[role_address] - box_get - pop - -rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9: - // modules/rbac.py:280 - // @arc4.abimethod(readonly=True) - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - -rbac_get_role_config_switch_case_4@6: - // modules/rbac.py:318 - // self.authority, role_address - bytec 10 // 0x52373023 - // modules/rbac.py:55 - // return role_address in role_map - dig 1 - concat - dup - box_len - bury 1 - // modules/rbac.py:317-319 - // assert self._has_role( - // self.authority, role_address - // ), err.INVALID_ROLE_ADDRESS - assert // Invalid account role address - // modules/rbac.py:320 - // return self.authority[role_address] - box_get - pop - // modules/rbac.py:280 - // @arc4.abimethod(readonly=True) - b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9 - -rbac_get_role_config_switch_case_3@5: - // modules/rbac.py:313 - // self.trustee, role_address - bytec 17 // 0x52363023 - // modules/rbac.py:55 - // return role_address in role_map - dig 1 - concat - dup - box_len - bury 1 - // modules/rbac.py:312-314 - // assert self._has_role( - // self.trustee, role_address - // ), err.INVALID_ROLE_ADDRESS - assert // Invalid account role address - // modules/rbac.py:315 - // return self.trustee[role_address] - box_get - pop - // modules/rbac.py:280 - // @arc4.abimethod(readonly=True) - b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9 - -rbac_get_role_config_switch_case_2@4: - // modules/rbac.py:308 - // self.primary_dealer, role_address - bytec 18 // 0x52353023 - // modules/rbac.py:55 - // return role_address in role_map - dig 1 - concat - dup - box_len - bury 1 - // modules/rbac.py:307-309 - // assert self._has_role( - // self.primary_dealer, role_address - // ), err.INVALID_ROLE_ADDRESS - assert // Invalid account role address - // modules/rbac.py:310 - // return self.primary_dealer[role_address] - box_get - pop - // modules/rbac.py:280 - // @arc4.abimethod(readonly=True) - b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9 - -rbac_get_role_config_switch_case_1@3: - // modules/rbac.py:303 - // self.account_manager, role_address - bytec 11 // 0x52343023 - // modules/rbac.py:55 - // return role_address in role_map - dig 1 - concat - dup - box_len - bury 1 - // modules/rbac.py:302-304 - // assert self._has_role( - // self.account_manager, role_address - // ), err.INVALID_ROLE_ADDRESS - assert // Invalid account role address - // modules/rbac.py:305 - // return self.account_manager[role_address] - box_get - pop - // modules/rbac.py:280 - // @arc4.abimethod(readonly=True) - b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9 - -rbac_get_role_config_switch_case_0@2: - // modules/rbac.py:298-300 - // return typ.RoleConfig( - // role_validity_start=UInt64(0), role_validity_end=UInt64(0) - // ) - pushbytes 0x00000000000000000000000000000000 - // modules/rbac.py:280 - // @arc4.abimethod(readonly=True) - b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9 - - -// modules.core_financial.no_coupon.NoCouponCashflowMixin.day_count_factor() -> bytes: -day_count_factor: - // modules/core_financial/no_coupon.py:17 - // def day_count_factor(self) -> typ.DayCountFactor: - proto 0 1 - // modules/core_financial/no_coupon.py:18-19 - // # The reference implementation supports only the Actual/Actual and Continuous day-count conventions - // accrued_period = Global.latest_timestamp - self.issuance_date - global LatestTimestamp - intc_0 // 0 - bytec 8 // "issuance_date" - app_global_get_ex - assert // check self.issuance_date exists - swap - dig 1 - - - swap - // modules/core_financial/no_coupon.py:20 - // principal_period = self.maturity_date - self.issuance_date - intc_0 // 0 - bytec 4 // "maturity_date" - app_global_get_ex - assert // check self.maturity_date exists - swap - - - // modules/core_financial/no_coupon.py:21 - // if self.day_count_convention == UInt64(cst.DCC_A_A): - intc_0 // 0 - bytec 14 // "day_count_convention" - app_global_get_ex - assert // check self.day_count_convention exists - bnz day_count_factor_after_if_else@2 - // modules/core_financial/common.py:162 - // return time_period // UInt64(cst.DAY_2_SEC) - frame_dig 0 - intc 5 // 86400 - / - frame_bury 0 - intc 5 // 86400 - / - -day_count_factor_after_if_else@2: - // modules/core_financial/no_coupon.py:24-27 - // return typ.DayCountFactor( - // numerator=accrued_period, - // denominator=principal_period, - // ) - frame_dig 0 - itob - swap - itob - concat - swap - retsub - - -// modules.core_financial.no_coupon.NoCouponCashflowMixin.accrued_interest_amount(holding_address: bytes, units: uint64) -> uint64: -accrued_interest_amount: - // modules/core_financial/no_coupon.py:33-35 - // def accrued_interest_amount( - // self, holding_address: Account, units: UInt64 - // ) -> UInt64: - proto 2 1 - // modules/core_financial/no_coupon.py:36 - // day_count_factor = self.day_count_factor() - callsub day_count_factor - // modules/core_financial/no_coupon.py:37 - // accrued_period = day_count_factor.numerator - dup - intc_0 // 0 - extract_uint64 - // modules/core_financial/no_coupon.py:38 - // principal_period = day_count_factor.denominator - swap - intc_3 // 8 - extract_uint64 - // modules/core_financial/no_coupon.py:40 - // self.account_units_value(holding_address, units) - frame_dig -2 - frame_dig -1 - callsub account_units_value - // modules/core_financial/no_coupon.py:41 - // * self.principal_discount - intc_0 // 0 - bytec 15 // "principal_discount" - app_global_get_ex - assert // check self.principal_discount exists - // modules/core_financial/no_coupon.py:40-41 - // self.account_units_value(holding_address, units) - // * self.principal_discount - * - // modules/core_financial/no_coupon.py:40-42 - // self.account_units_value(holding_address, units) - // * self.principal_discount - // * accrued_period - uncover 2 - * - // modules/core_financial/no_coupon.py:43 - // // (cst.BPS * principal_period) - pushint 10000 - uncover 2 - * - // modules/core_financial/no_coupon.py:40-43 - // self.account_units_value(holding_address, units) - // * self.principal_discount - // * accrued_period - // // (cst.BPS * principal_period) - / - // modules/core_financial/no_coupon.py:39-44 - // return ( - // self.account_units_value(holding_address, units) - // * self.principal_discount - // * accrued_period - // // (cst.BPS * principal_period) - // ) # div-by-zero: principal_period != 0 due to assert_time_events_sorted checks - retsub - - -// modules.core_financial.common.CoreFinancialCommonMixin.assert_time_events_sorted(time_events: bytes) -> bytes: -assert_time_events_sorted: - // modules/core_financial/common.py:107 - // def assert_time_events_sorted(self, time_events: typ.TimeEvents) -> None: - proto 1 1 - pushbytes "" - dupn 2 - // modules/core_financial/common.py:109 - // time_events[cfg.PRIMARY_DISTRIBUTION_OPENING_DATE_IDX] - frame_dig -1 - extract 2 0 - frame_dig -1 - pushint 2 - extract_uint64 - // modules/core_financial/common.py:110 - // > Global.latest_timestamp - global LatestTimestamp - // modules/core_financial/common.py:109-110 - // time_events[cfg.PRIMARY_DISTRIBUTION_OPENING_DATE_IDX] - // > Global.latest_timestamp - > - // modules/core_financial/common.py:108-111 - // assert ( - // time_events[cfg.PRIMARY_DISTRIBUTION_OPENING_DATE_IDX] - // > Global.latest_timestamp - // ), err.INVALID_TIME - assert // Time events must be set in the future - // modules/core_financial/common.py:112 - // for idx in urange(time_events.length - 1): - frame_dig -1 - intc_0 // 0 - extract_uint16 // on error: invalid array length header - intc_1 // 1 - - - intc_0 // 0 - -assert_time_events_sorted_for_header@1: - // modules/core_financial/common.py:112 - // for idx in urange(time_events.length - 1): - frame_dig 5 - frame_dig 4 - < - bz assert_time_events_sorted_after_for@6 - -assert_time_events_sorted_while_top@8: - pushint 75 - global OpcodeBudget - > - bz assert_time_events_sorted_after_while@13 - itxn_begin - pushint 6 // appl - itxn_field TypeEnum - pushint 5 // DeleteApplication - itxn_field OnCompletion - bytec 31 // 0x068101 - itxn_field ApprovalProgram - bytec 31 // 0x068101 - itxn_field ClearStateProgram - global MinTxnFee - itxn_field Fee - itxn_submit - b assert_time_events_sorted_while_top@8 - -assert_time_events_sorted_after_while@13: - // modules/core_financial/common.py:117 - // time_i = time_events[idx] - frame_dig 5 - dup - intc_3 // 8 - * - frame_dig 3 - dup - cover 3 - swap - extract_uint64 - dup - cover 3 - frame_bury 1 - // modules/core_financial/common.py:118 - // time_f = time_events[idx + 1] - intc_1 // 1 - + - dup - frame_bury 2 - intc_3 // 8 - * - extract_uint64 - dup - frame_bury 0 - // modules/core_financial/common.py:119 - // assert time_f > time_i, err.INVALID_SORTING - < - assert // Time events must be sorted in strictly ascending order - // modules/core_financial/common.py:120 - // if self.day_count_convention != UInt64(cst.DCC_CONT): - intc_0 // 0 - bytec 14 // "day_count_convention" - app_global_get_ex - assert // check self.day_count_convention exists - pushint 255 - != - bz assert_time_events_sorted_after_if_else@4 - // modules/core_financial/common.py:121-122 - // # The reference implementation requires time periods expressed in days for regular day-count conventions - // assert (time_f - time_i) % UInt64( - frame_dig 0 - frame_dig 1 - - - // modules/core_financial/common.py:121-124 - // # The reference implementation requires time periods expressed in days for regular day-count conventions - // assert (time_f - time_i) % UInt64( - // cst.DAY_2_SEC - // ) == 0, err.INVALID_TIME_PERIOD - intc 5 // 86400 - % - ! - assert // Time periods in Actual/Actual day count convention must be multiples of a day (in seconds) - -assert_time_events_sorted_after_if_else@4: - frame_dig 2 - frame_bury 5 - b assert_time_events_sorted_for_header@1 - -assert_time_events_sorted_after_for@6: - frame_dig -1 - frame_bury 0 - retsub - - -// modules.accounting.AccountingModule.assert_is_not_account_suspended(holding_address: bytes) -> void: -assert_is_not_account_suspended: - // modules/accounting.py:33 - // def assert_is_not_account_suspended(self, holding_address: Account) -> None: - proto 1 0 - // modules/accounting.py:34 - // assert not self.account[holding_address].suspended, err.SUSPENDED - bytec_1 // 0x52333023 - frame_dig -1 - concat - box_get - assert // check self.account entry exists - pushint 448 - getbit - ! - assert // Suspended operations - retsub - - -// modules.accounting.AccountingModule.account_units_value(holding_address: bytes, units: uint64) -> uint64: -account_units_value: - // modules/accounting.py:36 - // def account_units_value(self, holding_address: Account, units: UInt64) -> UInt64: - proto 2 1 - // modules/accounting.py:37 - // return units * self.account[holding_address].unit_value - bytec_1 // 0x52333023 - frame_dig -2 - concat - box_get - assert // check self.account entry exists - pushint 40 - extract_uint64 - frame_dig -1 - * - retsub - - -// modules.accounting.AccountingModule.account_total_units_value(holding_address: bytes) -> uint64: -account_total_units_value: - // modules/accounting.py:39 - // def account_total_units_value(self, holding_address: Account) -> UInt64: - proto 1 1 - // modules/accounting.py:41 - // holding_address, self.account[holding_address].units - bytec_1 // 0x52333023 - frame_dig -1 - concat - box_get - assert // check self.account entry exists - intc_2 // 32 - extract_uint64 - // modules/accounting.py:40-42 - // return self.account_units_value( - // holding_address, self.account[holding_address].units - // ) - frame_dig -1 - swap - callsub account_units_value - retsub - - -// modules.accounting.AccountingModule.end_if_no_circulating_units() -> void: -end_if_no_circulating_units: - // modules/accounting.py:48 - // if self.circulating_units == UInt64(0): - intc_0 // 0 - bytec_3 // "circulating_units" - app_global_get_ex - assert // check self.circulating_units exists - bnz end_if_no_circulating_units_after_if_else@2 - // modules/accounting.py:49 - // self.status = UInt64(enm.STATUS_ENDED) - bytec_2 // "status" - intc 4 // 200 - app_global_put - -end_if_no_circulating_units_after_if_else@2: - retsub - - -// modules.rbac.RbacModule._role_is_active(role_map: bytes, role_address: bytes) -> uint64: -_role_is_active: - // modules/rbac.py:57 - // def _role_is_active(self, role_map: typ.RbacRole, role_address: Account) -> bool: - proto 2 1 - pushbytes "" - // modules/rbac.py:55 - // return role_address in role_map - frame_dig -2 - frame_dig -1 - concat - dup - box_len - bury 1 - // modules/rbac.py:58-62 - // return self._has_role(role_map, role_address) and ( - // role_map[role_address].role_validity_start - // <= Global.latest_timestamp - // <= role_map[role_address].role_validity_end - // ) - bz _role_is_active_bool_false@4 - // modules/rbac.py:59 - // role_map[role_address].role_validity_start - frame_dig 1 - box_get - assert // check BoxMap entry exists - intc_0 // 0 - extract_uint64 - // modules/rbac.py:60 - // <= Global.latest_timestamp - global LatestTimestamp - dup - frame_bury 0 - // modules/rbac.py:59-60 - // role_map[role_address].role_validity_start - // <= Global.latest_timestamp - <= - // modules/rbac.py:59-61 - // role_map[role_address].role_validity_start - // <= Global.latest_timestamp - // <= role_map[role_address].role_validity_end - bz _role_is_active_bool_false@4 - // modules/rbac.py:61 - // <= role_map[role_address].role_validity_end - frame_dig 1 - box_get - assert // check BoxMap entry exists - intc_3 // 8 - extract_uint64 - // modules/rbac.py:60-61 - // <= Global.latest_timestamp - // <= role_map[role_address].role_validity_end - frame_dig 0 - >= - // modules/rbac.py:59-61 - // role_map[role_address].role_validity_start - // <= Global.latest_timestamp - // <= role_map[role_address].role_validity_end - bz _role_is_active_bool_false@4 - intc_1 // 1 - -_role_is_active_bool_merge@5: - // modules/rbac.py:58-62 - // return self._has_role(role_map, role_address) and ( - // role_map[role_address].role_validity_start - // <= Global.latest_timestamp - // <= role_map[role_address].role_validity_end - // ) - frame_bury 0 - retsub - -_role_is_active_bool_false@4: - intc_0 // 0 - b _role_is_active_bool_merge@5 - - -// modules.rbac.RbacModule.assert_caller_is_arranger() -> void: -assert_caller_is_arranger: - // modules/rbac.py:65 - // assert self._is_arranger(Txn.sender), err.UNAUTHORIZED - txn Sender - // modules/rbac.py:52 - // return role_address == self.arranger.value - intc_0 // 0 - bytec 5 // 0x52323023 - app_global_get_ex - assert // check self.arranger exists - == - // modules/rbac.py:65 - // assert self._is_arranger(Txn.sender), err.UNAUTHORIZED - assert // Not authorized - retsub - - -// modules.rbac.RbacModule.assert_is_not_asset_defaulted() -> void: -assert_is_not_asset_defaulted: - // modules/rbac.py:83 - // assert not self.asset_defaulted, err.DEFAULTED - intc_0 // 0 - bytec 21 // "asset_defaulted" - app_global_get_ex - assert // check self.asset_defaulted exists - ! - assert // Defaulted - retsub - - -// modules.rbac.RbacModule.assert_is_not_asset_suspended() -> void: -assert_is_not_asset_suspended: - // modules/rbac.py:86 - // assert not self.asset_suspended, err.SUSPENDED - intc_0 // 0 - bytec 20 // "asset_suspended" - app_global_get_ex - assert // check self.asset_suspended exists - ! - assert // Suspended operations - retsub - - -// modules.rbac.RbacModule._assert_valid_role(role_id: uint64) -> void: -_assert_valid_role: - // modules/rbac.py:88 - // def _assert_valid_role(self, role_id: UInt64) -> None: - proto 1 0 - // modules/rbac.py:89-96 - // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - frame_dig -1 - // modules/rbac.py:90 - // UInt64(cst.ROLE_ARRANGER), - pushint 20 - // modules/rbac.py:89-96 - // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - == - bnz _assert_valid_role_bool_true@6 - frame_dig -1 - // modules/rbac.py:91 - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - pushint 40 - // modules/rbac.py:89-96 - // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - == - bnz _assert_valid_role_bool_true@6 - frame_dig -1 - // modules/rbac.py:92 - // UInt64(cst.ROLE_PRIMARY_DEALER), - pushint 50 - // modules/rbac.py:89-96 - // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - == - bnz _assert_valid_role_bool_true@6 - frame_dig -1 - // modules/rbac.py:93 - // UInt64(cst.ROLE_TRUSTEE), - pushint 60 - // modules/rbac.py:89-96 - // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - == - bnz _assert_valid_role_bool_true@6 - frame_dig -1 - // modules/rbac.py:94 - // UInt64(cst.ROLE_AUTHORITY), - pushint 70 - // modules/rbac.py:89-96 - // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - == - bnz _assert_valid_role_bool_true@6 - frame_dig -1 - // modules/rbac.py:95 - // UInt64(cst.ROLE_INTEREST_ORACLE), - pushint 80 - // modules/rbac.py:89-96 - // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - == - bz _assert_valid_role_bool_false@7 - -_assert_valid_role_bool_true@6: - intc_1 // 1 - -_assert_valid_role_bool_merge@8: - // modules/rbac.py:89-96 - // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - assert // Invalid role identifier - retsub - -_assert_valid_role_bool_false@7: - intc_0 // 0 - b _assert_valid_role_bool_merge@8 diff --git a/smart_contracts/artifacts/zero_coupon_bond/ZeroCouponBond.arc56.json b/smart_contracts/artifacts/zero_coupon_bond/ZeroCouponBond.arc56.json deleted file mode 100644 index ec1ff365..00000000 --- a/smart_contracts/artifacts/zero_coupon_bond/ZeroCouponBond.arc56.json +++ /dev/null @@ -1,1835 +0,0 @@ -{ - "name": "ZeroCouponBond", - "structs": { - "AccountInfo": [ - { - "name": "payment_address", - "type": "address" - }, - { - "name": "units", - "type": "uint64" - }, - { - "name": "unit_value", - "type": "uint64" - }, - { - "name": "paid_coupons", - "type": "uint64" - }, - { - "name": "suspended", - "type": "bool" - } - ], - "AssetInfo": [ - { - "name": "denomination_asset_id", - "type": "uint64" - }, - { - "name": "settlement_asset_id", - "type": "uint64" - }, - { - "name": "outstanding_principal", - "type": "uint64" - }, - { - "name": "unit_value", - "type": "uint64" - }, - { - "name": "day_count_convention", - "type": "uint8" - }, - { - "name": "principal_discount", - "type": "uint16" - }, - { - "name": "interest_rate", - "type": "uint16" - }, - { - "name": "total_supply", - "type": "uint64" - }, - { - "name": "circulating_supply", - "type": "uint64" - }, - { - "name": "primary_distribution_opening_date", - "type": "uint64" - }, - { - "name": "primary_distribution_closure_date", - "type": "uint64" - }, - { - "name": "issuance_date", - "type": "uint64" - }, - { - "name": "maturity_date", - "type": "uint64" - }, - { - "name": "suspended", - "type": "bool" - }, - { - "name": "performance", - "type": "uint8" - } - ], - "AssetMetadata": [ - { - "name": "contract_type", - "type": "uint8" - }, - { - "name": "calendar", - "type": "uint8" - }, - { - "name": "business_day_convention", - "type": "uint8" - }, - { - "name": "end_of_month_convention", - "type": "uint8" - }, - { - "name": "prepayment_effect", - "type": "uint8" - }, - { - "name": "penalty_type", - "type": "uint8" - }, - { - "name": "prospectus_hash", - "type": "byte[32]" - }, - { - "name": "prospectus_url", - "type": "string" - } - ], - "CurrentUnitsValue": [ - { - "name": "units_value", - "type": "uint64" - }, - { - "name": "accrued_interest", - "type": "uint64" - }, - { - "name": "day_count_factor", - "type": "DayCountFactor" - } - ], - "DayCountFactor": [ - { - "name": "numerator", - "type": "uint64" - }, - { - "name": "denominator", - "type": "uint64" - } - ], - "PaymentAmounts": [ - { - "name": "interest", - "type": "uint64" - }, - { - "name": "principal", - "type": "uint64" - } - ], - "PaymentResult": [ - { - "name": "amount", - "type": "uint64" - }, - { - "name": "timestamp", - "type": "uint64" - }, - { - "name": "context", - "type": "byte[]" - } - ], - "RoleConfig": [ - { - "name": "role_validity_start", - "type": "uint64" - }, - { - "name": "role_validity_end", - "type": "uint64" - } - ], - "SecondaryMarketSchedule": [ - { - "name": "secondary_market_opening_date", - "type": "uint64" - }, - { - "name": "secondary_market_closure_date", - "type": "uint64" - } - ] - }, - "methods": [ - { - "name": "asset_config", - "args": [ - { - "type": "uint64", - "name": "denomination_asset_id", - "desc": "Denomination asset identifier" - }, - { - "type": "uint64", - "name": "settlement_asset_id", - "desc": "Settlement asset identifier" - }, - { - "type": "uint64", - "name": "principal", - "desc": "Principal, expressed in denomination asset" - }, - { - "type": "uint64", - "name": "principal_discount", - "desc": "Principal discount in bps" - }, - { - "type": "uint64", - "name": "minimum_denomination", - "desc": "Minimum denomination, expressed in denomination asset" - }, - { - "type": "uint8", - "name": "day_count_convention", - "desc": "Day-count convention for interests calculation" - }, - { - "type": "uint16", - "name": "interest_rate", - "desc": "Interest rate in bps" - }, - { - "type": "uint16[]", - "name": "coupon_rates", - "desc": "Coupon interest rates in bps" - }, - { - "type": "uint64[]", - "name": "time_events", - "desc": "Time events (strictly ascending order)" - }, - { - "type": "(uint64,uint64)[]", - "name": "time_periods", - "desc": "Time periods of recurring time events" - } - ], - "returns": { - "type": "void" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Configure the Debt Algorand Standard Application", - "events": [], - "recommendations": {} - }, - { - "name": "get_account_units_current_value", - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - }, - { - "type": "uint64", - "name": "units", - "desc": "Account's units for the current value calculation" - } - ], - "returns": { - "type": "(uint64,uint64,(uint64,uint64))", - "struct": "CurrentUnitsValue", - "desc": "Units current value in denomination asset, Accrued interest in denomination asset" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Get account's units current value and accrued interest", - "events": [], - "recommendations": {} - }, - { - "name": "get_payment_amount", - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - } - ], - "returns": { - "type": "(uint64,uint64)", - "struct": "PaymentAmounts", - "desc": "Interest amount in denomination asset, Principal amount in denomination asset" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Get the next payment amount", - "events": [], - "recommendations": {} - }, - { - "name": "pay_principal", - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - }, - { - "type": "byte[]", - "name": "payment_info", - "desc": "Additional payment information (Optional)" - } - ], - "returns": { - "type": "(uint64,uint64,byte[])", - "struct": "PaymentResult", - "desc": "Paid principal amount in denomination asset, Payment timestamp, Payment context" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Pay the outstanding principal to an account", - "events": [ - { - "name": "Event", - "args": [ - { - "type": "uint64", - "name": "contract_id" - }, - { - "type": "uint8", - "name": "type" - }, - { - "type": "string", - "name": "type_name" - }, - { - "type": "uint64", - "name": "time" - }, - { - "type": "uint64", - "name": "payoff" - }, - { - "type": "uint64", - "name": "currency_id" - }, - { - "type": "byte[]", - "name": "currency_unit" - }, - { - "type": "uint64", - "name": "nominal_value" - }, - { - "type": "uint16", - "name": "nominal_rate_bps" - }, - { - "type": "uint64", - "name": "nominal_accrued" - } - ], - "desc": "ACTUS Event." - } - ], - "recommendations": {} - }, - { - "name": "asset_transfer", - "args": [ - { - "type": "address", - "name": "sender_holding_address", - "desc": "Sender Account Holding Address" - }, - { - "type": "address", - "name": "receiver_holding_address", - "desc": "Receiver Account Holding Address" - }, - { - "type": "uint64", - "name": "units", - "desc": "Amount of D-ASA units to transfer" - } - ], - "returns": { - "type": "uint64", - "desc": "Transferred actualized value in denomination asset" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Transfer D-ASA units between accounts", - "events": [], - "recommendations": {} - }, - { - "name": "asset_create", - "args": [ - { - "type": "address", - "name": "arranger", - "desc": "D-ASA Arranger Address" - }, - { - "type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", - "struct": "AssetMetadata", - "name": "metadata", - "desc": "D-ASA metadata" - } - ], - "returns": { - "type": "void" - }, - "actions": { - "create": [ - "NoOp" - ], - "call": [] - }, - "readonly": false, - "desc": "Create a new D-ASA", - "events": [], - "recommendations": {} - }, - { - "name": "asset_update", - "args": [ - { - "type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", - "struct": "AssetMetadata", - "name": "metadata" - } - ], - "returns": { - "type": "void" - }, - "actions": { - "create": [], - "call": [ - "UpdateApplication" - ] - }, - "readonly": false, - "desc": "Update D-ASA application.", - "events": [], - "recommendations": {} - }, - { - "name": "set_secondary_time_events", - "args": [ - { - "type": "uint64[]", - "name": "secondary_market_time_events", - "desc": "Secondary market time events (strictly ascending order)" - } - ], - "returns": { - "type": "(uint64,uint64)", - "struct": "SecondaryMarketSchedule", - "desc": "Secondary Market Opening Date, Secondary Market Closure Date" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Set secondary market time schedule", - "events": [], - "recommendations": {} - }, - { - "name": "set_default_status", - "args": [ - { - "type": "bool", - "name": "defaulted", - "desc": "Default status" - } - ], - "returns": { - "type": "uint64" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Set D-ASA default status", - "events": [], - "recommendations": {} - }, - { - "name": "primary_distribution", - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - }, - { - "type": "uint64", - "name": "units", - "desc": "Amount of D-ASA units to distribute" - } - ], - "returns": { - "type": "uint64", - "desc": "Remaining D-ASA units to be distributed" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Distribute D-ASA units to accounts according the primary market", - "events": [], - "recommendations": {} - }, - { - "name": "get_asset_info", - "args": [], - "returns": { - "type": "(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)", - "struct": "AssetInfo", - "desc": "Denomination asset ID, Settlement asset ID, Outstanding principal, Unit nominal value, Day-count convention, Interest rate, Total supply, Circulating supply, Primary distribution opening date, Primary distribution closure date, Issuance date, Maturity date, Suspended, Performance" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Get D-ASA info", - "events": [], - "recommendations": {} - }, - { - "name": "get_time_events", - "args": [], - "returns": { - "type": "uint64[]", - "desc": "Time events" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Get D-ASA time events", - "events": [], - "recommendations": {} - }, - { - "name": "get_secondary_market_schedule", - "args": [], - "returns": { - "type": "uint64[]", - "desc": "Secondary market schedule" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Get secondary market schedule", - "events": [], - "recommendations": {} - }, - { - "name": "get_asset_metadata", - "args": [], - "returns": { - "type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", - "struct": "AssetMetadata", - "desc": "Contract type, Calendar, Business day convention, End of month convention, Early repayment effect, Early repayment penalty type, Prospectus hash, Prospectus URL" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Get D-ASA metadata", - "events": [], - "recommendations": {} - }, - { - "name": "account_gov_suspension", - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - }, - { - "type": "bool", - "name": "suspended", - "desc": "Suspension status" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the set account suspension status" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Set account suspension status", - "events": [], - "recommendations": {} - }, - { - "name": "account_open", - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - }, - { - "type": "address", - "name": "payment_address", - "desc": "Account Payment Address" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the account opening" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Open D-ASA account", - "events": [], - "recommendations": {} - }, - { - "name": "account_close", - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - } - ], - "returns": { - "type": "(uint64,uint64)", - "desc": "Closed units, Timestamp of the account closing" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Close D-ASA account", - "events": [], - "recommendations": {} - }, - { - "name": "account_update_payment_address", - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - }, - { - "type": "address", - "name": "payment_address", - "desc": "Account Payment Address" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the account update" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Update the Payment Address of an account", - "events": [], - "recommendations": {} - }, - { - "name": "account_get_info", - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - } - ], - "returns": { - "type": "(address,uint64,uint64,uint64,bool)", - "struct": "AccountInfo", - "desc": "Payment Address, D-ASA units, Unit nominal value in denomination asset, Paid coupons, Suspended" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Get account info", - "events": [], - "recommendations": {} - }, - { - "name": "rbac_rotate_arranger", - "args": [ - { - "type": "address", - "name": "new_arranger", - "desc": "New Arranger address" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the role assignment" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Rotate the Arranger address", - "events": [], - "recommendations": {} - }, - { - "name": "rbac_set_op_daemon", - "args": [ - { - "type": "address", - "name": "address", - "desc": "Operation Daemon address" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the role assignment" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Non-Normative: Set the Operation Daemon address", - "events": [], - "recommendations": {} - }, - { - "name": "rbac_assign_role", - "args": [ - { - "type": "uint8", - "name": "role_id", - "desc": "Role Identifier" - }, - { - "type": "address", - "name": "role_address", - "desc": "Account Role Address" - }, - { - "type": "byte[]", - "name": "config", - "desc": "Role configuration (Optional)" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the role assignment" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Assign a role to an address", - "events": [], - "recommendations": {} - }, - { - "name": "rbac_revoke_role", - "args": [ - { - "type": "uint8", - "name": "role_id", - "desc": "Role Identifier" - }, - { - "type": "address", - "name": "role_address", - "desc": "Account Role Address" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the role revocation" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Revoke a role from an address", - "events": [], - "recommendations": {} - }, - { - "name": "rbac_gov_asset_suspension", - "args": [ - { - "type": "bool", - "name": "suspended", - "desc": "Suspension status" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the set asset suspension status" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Set asset suspension status", - "events": [], - "recommendations": {} - }, - { - "name": "rbac_get_arranger", - "args": [], - "returns": { - "type": "address", - "desc": "Arranger address" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Get Arranger address", - "events": [], - "recommendations": {} - }, - { - "name": "rbac_get_address_roles", - "args": [ - { - "type": "address", - "name": "address", - "desc": "Address to get roles for" - } - ], - "returns": { - "type": "(bool,bool,bool,bool,bool)", - "desc": "Roles mask: (Account Manager, Primary Dealer, Trustee, Authority, Interest Oracle)" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Non-normative - Get roles assigned to an address", - "events": [], - "recommendations": {} - }, - { - "name": "rbac_get_role_config", - "args": [ - { - "type": "uint8", - "name": "role_id", - "desc": "Role Identifier" - }, - { - "type": "address", - "name": "role_address", - "desc": "Account Role Address" - } - ], - "returns": { - "type": "(uint64,uint64)", - "struct": "RoleConfig", - "desc": "Role configuration" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Get role configuration", - "events": [], - "recommendations": {} - } - ], - "arcs": [ - 22, - 28 - ], - "networks": {}, - "state": { - "schema": { - "global": { - "ints": 18, - "bytes": 3 - }, - "local": { - "ints": 0, - "bytes": 0 - } - }, - "keys": { - "global": { - "arranger": { - "keyType": "AVMBytes", - "valueType": "address", - "key": "UjIwIw==" - }, - "op_daemon": { - "keyType": "AVMBytes", - "valueType": "address", - "key": "UjI1Iw==" - }, - "asset_suspended": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "YXNzZXRfc3VzcGVuZGVk" - }, - "asset_defaulted": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "YXNzZXRfZGVmYXVsdGVk" - }, - "total_units": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "dG90YWxfdW5pdHM=" - }, - "circulating_units": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "Y2lyY3VsYXRpbmdfdW5pdHM=" - }, - "unit_value": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "dW5pdF92YWx1ZQ==" - }, - "status": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "c3RhdHVz" - }, - "denomination_asset_id": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "ZGVub21pbmF0aW9uX2Fzc2V0X2lk" - }, - "settlement_asset_id": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "c2V0dGxlbWVudF9hc3NldF9pZA==" - }, - "day_count_convention": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "ZGF5X2NvdW50X2NvbnZlbnRpb24=" - }, - "metadata": { - "keyType": "AVMString", - "valueType": "AVMBytes", - "key": "bWV0YWRhdGE=" - }, - "principal_discount": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "cHJpbmNpcGFsX2Rpc2NvdW50" - }, - "interest_rate": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "aW50ZXJlc3RfcmF0ZQ==" - }, - "total_coupons": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "dG90YWxfY291cG9ucw==" - }, - "primary_distribution_opening_date": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "cHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRl" - }, - "primary_distribution_closure_date": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "cHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRl" - }, - "issuance_date": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "aXNzdWFuY2VfZGF0ZQ==" - }, - "secondary_market_opening_date": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "c2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGU=" - }, - "secondary_market_closure_date": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "c2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGU=" - }, - "maturity_date": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "bWF0dXJpdHlfZGF0ZQ==" - } - }, - "local": {}, - "box": { - "time_events": { - "keyType": "AVMBytes", - "valueType": "uint64[]", - "key": "dGltZUV2ZW50cw==" - } - } - }, - "maps": { - "global": {}, - "local": {}, - "box": { - "account_manager": { - "keyType": "address", - "valueType": "RoleConfig", - "prefix": "UjQwIw==" - }, - "primary_dealer": { - "keyType": "address", - "valueType": "RoleConfig", - "prefix": "UjUwIw==" - }, - "trustee": { - "keyType": "address", - "valueType": "RoleConfig", - "prefix": "UjYwIw==" - }, - "authority": { - "keyType": "address", - "valueType": "RoleConfig", - "prefix": "UjcwIw==" - }, - "interest_oracle": { - "keyType": "address", - "valueType": "RoleConfig", - "prefix": "UjgwIw==" - }, - "account": { - "keyType": "address", - "valueType": "AccountInfo", - "prefix": "UjMwIw==" - } - } - } - }, - "bareActions": { - "create": [], - "call": [] - }, - "sourceInfo": { - "approval": { - "sourceInfo": [ - { - "pc": [ - 2349 - ], - "errorMessage": "Can not distribute zero units" - }, - { - "pc": [ - 1015 - ], - "errorMessage": "Coupon rates are not properly defined" - }, - { - "pc": [ - 910 - ], - "errorMessage": "D-ASA already configured" - }, - { - "pc": [ - 3950 - ], - "errorMessage": "Defaulted" - }, - { - "pc": [ - 917 - ], - "errorMessage": "Denomination asset is not properly set" - }, - { - "pc": [ - 928 - ], - "errorMessage": "Different settlement asset not supported, must be equal to denomination asset" - }, - { - "pc": [ - 2365 - ], - "errorMessage": "Insufficient remaining D-ASA units" - }, - { - "pc": [ - 1848, - 1929 - ], - "errorMessage": "Insufficient sender units to transfer" - }, - { - "pc": [ - 1006 - ], - "errorMessage": "Interest rate is not properly defined" - }, - { - "pc": [ - 1152, - 1316, - 1399, - 1802, - 1817, - 2339, - 2722, - 2793, - 2845, - 2916, - 2945 - ], - "errorMessage": "Invalid account holding address" - }, - { - "pc": [ - 3087, - 3111, - 3135, - 3159, - 3183, - 3240, - 3268, - 3290, - 3312, - 3334, - 3513, - 3531, - 3546, - 3561, - 3576 - ], - "errorMessage": "Invalid account role address" - }, - { - "pc": [ - 1170 - ], - "errorMessage": "Invalid amount of units for the account" - }, - { - "pc": [ - 995 - ], - "errorMessage": "Invalid day-count convention ID" - }, - { - "pc": [ - 3224, - 3503, - 4012 - ], - "errorMessage": "Invalid role identifier" - }, - { - "pc": [ - 2210 - ], - "errorMessage": "Invalid secondary market closure date" - }, - { - "pc": [ - 2176 - ], - "errorMessage": "Invalid secondary market opening date" - }, - { - "pc": [ - 961 - ], - "errorMessage": "Minimum denomination is not a divisor of principal" - }, - { - "pc": [ - 1404 - ], - "errorMessage": "No D-ASA units" - }, - { - "pc": [ - 1381, - 1461, - 1784, - 2139, - 2253, - 2330, - 2713, - 2768, - 2777, - 2834, - 2901, - 3357, - 3942 - ], - "errorMessage": "Not authorized" - }, - { - "pc": [ - 1515 - ], - "errorMessage": "Not enough funds for the payment" - }, - { - "pc": [ - 1413 - ], - "errorMessage": "Not mature" - }, - { - "pc": [ - 2322 - ], - "errorMessage": "Primary distribution is closed" - }, - { - "pc": [ - 1141 - ], - "errorMessage": "Primary distribution not yet executed" - }, - { - "pc": [ - 1775 - ], - "errorMessage": "Secondary market is closed" - }, - { - "pc": [ - 1833 - ], - "errorMessage": "Sender and receiver must be different" - }, - { - "pc": [ - 1898 - ], - "errorMessage": "Sender and receiver units are not fungible" - }, - { - "pc": [ - 3834, - 3958 - ], - "errorMessage": "Suspended operations" - }, - { - "pc": [ - 1027, - 2144 - ], - "errorMessage": "Time events length is invalid" - }, - { - "pc": [ - 3707 - ], - "errorMessage": "Time events must be set in the future" - }, - { - "pc": [ - 3785 - ], - "errorMessage": "Time events must be sorted in strictly ascending order" - }, - { - "pc": [ - 1088 - ], - "errorMessage": "Time periods are not properly defined" - }, - { - "pc": [ - 3807 - ], - "errorMessage": "Time periods in Actual/Actual day count convention must be multiples of a day (in seconds)" - }, - { - "pc": [ - 1837 - ], - "errorMessage": "Transfer units must be greater than zero" - }, - { - "pc": [ - 533 - ], - "errorMessage": "Wrong Global Bytes allocation" - }, - { - "pc": [ - 539 - ], - "errorMessage": "Wrong Global UInts allocation" - }, - { - "pc": [ - 543 - ], - "errorMessage": "Wrong Local Bytes allocation" - }, - { - "pc": [ - 547 - ], - "errorMessage": "Wrong Local UInts allocation" - }, - { - "pc": [ - 1508 - ], - "errorMessage": "account opted into asset" - }, - { - "pc": [ - 1582 - ], - "errorMessage": "asset exists" - }, - { - "pc": [ - 3902, - 3917 - ], - "errorMessage": "check BoxMap entry exists" - }, - { - "pc": [ - 1160, - 1452, - 1465, - 1484, - 1519, - 1553, - 1841, - 1855, - 1864, - 1871, - 1882, - 1889, - 1903, - 1924, - 1966, - 2010, - 2373, - 3828, - 3844, - 3860 - ], - "errorMessage": "check self.account entry exists" - }, - { - "pc": [ - 3375, - 3940 - ], - "errorMessage": "check self.arranger exists" - }, - { - "pc": [ - 2447, - 3948 - ], - "errorMessage": "check self.asset_defaulted exists" - }, - { - "pc": [ - 2549, - 3956 - ], - "errorMessage": "check self.asset_suspended exists" - }, - { - "pc": [ - 1546, - 1586, - 2353, - 2468, - 2857, - 3873 - ], - "errorMessage": "check self.circulating_units exists" - }, - { - "pc": [ - 2480, - 3629, - 3790 - ], - "errorMessage": "check self.day_count_convention exists" - }, - { - "pc": [ - 1578, - 2459 - ], - "errorMessage": "check self.denomination_asset_id exists" - }, - { - "pc": [ - 2509 - ], - "errorMessage": "check self.interest_rate exists" - }, - { - "pc": [ - 1206, - 2160, - 2539, - 3612 - ], - "errorMessage": "check self.issuance_date exists" - }, - { - "pc": [ - 1220, - 1258, - 1411, - 2185, - 2193, - 2430, - 2544, - 3622 - ], - "errorMessage": "check self.maturity_date exists" - }, - { - "pc": [ - 2681 - ], - "errorMessage": "check self.metadata exists" - }, - { - "pc": [ - 1421, - 1434 - ], - "errorMessage": "check self.op_daemon exists" - }, - { - "pc": [ - 2314, - 2534 - ], - "errorMessage": "check self.primary_distribution_closure_date exists" - }, - { - "pc": [ - 1125, - 1135, - 2300, - 2529 - ], - "errorMessage": "check self.primary_distribution_opening_date exists" - }, - { - "pc": [ - 1182, - 2494, - 3674 - ], - "errorMessage": "check self.principal_discount exists" - }, - { - "pc": [ - 1759, - 1769, - 2224, - 2659 - ], - "errorMessage": "check self.secondary_market_closure_date exists" - }, - { - "pc": [ - 1748, - 2219, - 2654 - ], - "errorMessage": "check self.secondary_market_opening_date exists" - }, - { - "pc": [ - 1473, - 1502, - 2464 - ], - "errorMessage": "check self.settlement_asset_id exists" - }, - { - "pc": [ - 908, - 1321, - 1377, - 1737, - 2134, - 2289, - 2629, - 2772 - ], - "errorMessage": "check self.status exists" - }, - { - "pc": [ - 2642 - ], - "errorMessage": "check self.time_events exists" - }, - { - "pc": [ - 2361, - 2403, - 2524 - ], - "errorMessage": "check self.total_units exists" - }, - { - "pc": [ - 1591, - 2390, - 2473 - ], - "errorMessage": "check self.unit_value exists" - }, - { - "pc": [ - 848, - 870, - 888, - 1075, - 1361, - 2055, - 2094, - 2116, - 2197, - 3025, - 3711 - ], - "errorMessage": "invalid array length header" - }, - { - "pc": [ - 2243, - 2703, - 3347 - ], - "errorMessage": "invalid number of bytes for arc4.bool" - }, - { - "pc": [ - 861 - ], - "errorMessage": "invalid number of bytes for arc4.dynamic_array" - }, - { - "pc": [ - 1369, - 3033 - ], - "errorMessage": "invalid number of bytes for arc4.dynamic_array" - }, - { - "pc": [ - 901 - ], - "errorMessage": "invalid number of bytes for arc4.dynamic_array>" - }, - { - "pc": [ - 882, - 2127 - ], - "errorMessage": "invalid number of bytes for arc4.dynamic_array" - }, - { - "pc": [ - 1111, - 1309, - 1355, - 1716, - 1724, - 2032, - 2276, - 2695, - 2752, - 2760, - 2826, - 2887, - 2895, - 2937, - 2961, - 2985, - 3019, - 3207, - 3389, - 3473 - ], - "errorMessage": "invalid number of bytes for arc4.static_array" - }, - { - "pc": [ - 842 - ], - "errorMessage": "invalid number of bytes for arc4.uint16" - }, - { - "pc": [ - 786, - 795, - 804, - 813, - 822, - 1119, - 1732, - 2284 - ], - "errorMessage": "invalid number of bytes for arc4.uint64" - }, - { - "pc": [ - 831, - 3009, - 3197, - 3463 - ], - "errorMessage": "invalid number of bytes for arc4.uint8" - }, - { - "pc": [ - 2060, - 2099 - ], - "errorMessage": "invalid number of bytes for smart_contracts.abi_types.AssetMetadata" - }, - { - "pc": [ - 2047, - 2086 - ], - "errorMessage": "invalid tail pointer at index 7 of (uint8,uint8,uint8,uint8,uint8,uint8,uint8[32],(len+utf8[]))" - }, - { - "pc": [ - 2042, - 2081 - ], - "errorMessage": "invalid tuple encoding" - }, - { - "pc": [ - 2486, - 2501, - 2516, - 2557 - ], - "errorMessage": "overflow" - } - ], - "pcOffsetMethod": "none" - }, - "clear": { - "sourceInfo": [], - "pcOffsetMethod": "none" - } - }, - "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgMzIgOCAyMDAgODY0MDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAweDUyMzMzMDIzICJzdGF0dXMiICJjaXJjdWxhdGluZ191bml0cyIgIm1hdHVyaXR5X2RhdGUiIDB4NTIzMjMwMjMgInVuaXRfdmFsdWUiICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiICJpc3N1YW5jZV9kYXRlIiAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiIDB4NTIzNzMwMjMgMHg1MjM0MzAyMyAidG90YWxfdW5pdHMiICJzZXR0bGVtZW50X2Fzc2V0X2lkIiAiZGF5X2NvdW50X2NvbnZlbnRpb24iICJwcmluY2lwYWxfZGlzY291bnQiICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIgMHg1MjM2MzAyMyAweDUyMzUzMDIzIDB4NTIzMjM1MjMgImFzc2V0X3N1c3BlbmRlZCIgImFzc2V0X2RlZmF1bHRlZCIgImRlbm9taW5hdGlvbl9hc3NldF9pZCIgIm1ldGFkYXRhIiAicHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIiAweDUyMzgzMDIzICJpbnRlcmVzdF9yYXRlIiAweDc0Njk2ZDY1NDU3NjY1NmU3NDczIDB4MDAgInRvdGFsX2NvdXBvbnMiIDB4MDAwMCAweDA2ODEwMQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwLTMxCiAgICAvLyAjIFJCQUMgUm9sZXMKICAgIC8vIHNlbGYuYXJyYW5nZXIgPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX0FSUkFOR0VSKQogICAgYnl0ZWMgNSAvLyAweDUyMzIzMDIzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzIKICAgIC8vIHNlbGYub3BfZGFlbW9uID0gR2xvYmFsU3RhdGUoQWNjb3VudCgpLCBrZXk9Y3N0LlBSRUZJWF9JRF9PUF9EQUVNT04pCiAgICBieXRlYyAxOSAvLyAweDUyMzIzNTIzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NDctNDgKICAgIC8vICMgRC1BU0EgR292ZXJuYW5jZQogICAgLy8gc2VsZi5hc3NldF9zdXNwZW5kZWQgPSBGYWxzZQogICAgYnl0ZWMgMjAgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjQ5CiAgICAvLyBzZWxmLmFzc2V0X2RlZmF1bHRlZCA9IEZhbHNlCiAgICBieXRlYyAyMSAvLyAiYXNzZXRfZGVmYXVsdGVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTkKICAgIC8vIHNlbGYudG90YWxfdW5pdHMgPSBVSW50NjQoKQogICAgYnl0ZWMgMTIgLy8gInRvdGFsX3VuaXRzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjAKICAgIC8vIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgPSBVSW50NjQoKQogICAgYnl0ZWNfMyAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMQogICAgLy8gc2VsZi51bml0X3ZhbHVlID0gVUludDY0KCkKICAgIGJ5dGVjIDYgLy8gInVuaXRfdmFsdWUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMgogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW5tLlNUQVRVU19JTkFDVElWRSkKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzEtMzIKICAgIC8vICMgQXNzZXQgQ29uZmlndXJhdGlvbgogICAgLy8gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgPSBBc3NldCgpCiAgICBieXRlYyAyMiAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMwogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkID0gQXNzZXQoKQogICAgYnl0ZWMgMTMgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjM0CiAgICAvLyBzZWxmLnVuaXRfdmFsdWUgPSBVSW50NjQoKQogICAgYnl0ZWMgNiAvLyAidW5pdF92YWx1ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzUKICAgIC8vIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPSBVSW50NjQoKQogICAgYnl0ZWMgMTQgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozNy0zOAogICAgLy8gIyBNZXRhZGF0YQogICAgLy8gc2VsZi5tZXRhZGF0YSA9IEJ5dGVzKCkKICAgIGJ5dGVjIDIzIC8vICJtZXRhZGF0YSIKICAgIHB1c2hieXRlcyAweAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQwLTQxCiAgICAvLyAjIFByaW5jaXBhbCAvIFJhdGVzCiAgICAvLyBzZWxmLnByaW5jaXBhbF9kaXNjb3VudCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNSAvLyAicHJpbmNpcGFsX2Rpc2NvdW50IgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MgogICAgLy8gc2VsZi5pbnRlcmVzdF9yYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDI2IC8vICJpbnRlcmVzdF9yYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MwogICAgLy8gc2VsZi50b3RhbF9jb3Vwb25zID0gVUludDY0KCkKICAgIGJ5dGVjIDI5IC8vICJ0b3RhbF9jb3Vwb25zIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0NwogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgNyAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0OAogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMjQgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDkKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA4IC8vICJpc3N1YW5jZV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo1MAogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNiAvLyAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjUxCiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDkgLy8gInNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo1MgogICAgLy8gc2VsZi5tYXR1cml0eV9kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDQgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBhc3NlcnQgVHhuLmdsb2JhbF9udW1fYnl0ZV9zbGljZSA9PSBjZmcuR0xPQkFMX0JZVEVTLCBlcnIuV1JPTkdfR0xPQkFMX0JZVEVTCiAgICB0eG4gR2xvYmFsTnVtQnl0ZVNsaWNlCiAgICBwdXNoaW50IDMKICAgID09CiAgICBhc3NlcnQgLy8gV3JvbmcgR2xvYmFsIEJ5dGVzIGFsbG9jYXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBhc3NlcnQgVHhuLmdsb2JhbF9udW1fdWludCA9PSBjZmcuR0xPQkFMX1VJTlRTLCBlcnIuV1JPTkdfR0xPQkFMX1VJTlRTCiAgICB0eG4gR2xvYmFsTnVtVWludAogICAgcHVzaGludCAxOAogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgVUludHMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MjkKICAgIC8vIGFzc2VydCBUeG4ubG9jYWxfbnVtX2J5dGVfc2xpY2UgPT0gY2ZnLkxPQ0FMX0JZVEVTLCBlcnIuV1JPTkdfTE9DQUxfQllURVMKICAgIHR4biBMb2NhbE51bUJ5dGVTbGljZQogICAgIQogICAgYXNzZXJ0IC8vIFdyb25nIExvY2FsIEJ5dGVzIGFsbG9jYXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjMwCiAgICAvLyBhc3NlcnQgVHhuLmxvY2FsX251bV91aW50ID09IGNmZy5MT0NBTF9VSU5UUywgZXJyLldST05HX0xPQ0FMX1VJTlRTCiAgICB0eG4gTG9jYWxOdW1VaW50CiAgICAhCiAgICBhc3NlcnQgLy8gV3JvbmcgTG9jYWwgVUludHMgYWxsb2NhdGlvbgoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMi0yNAogICAgLy8gY2xhc3MgWmVyb0NvdXBvbkJvbmQoCiAgICAvLyAgICAgUEFNQ29yZU1peGluLAogICAgLy8gICAgIE5vQ291cG9uQ2FzaGZsb3dNaXhpbiwKICAgIC8vICAgICBQcmluY2lwYWxQYXltZW50QWdlbnRNaXhpbiwKICAgIC8vICAgICBOb0NvdXBvblRyYW5zZmVyQWdlbnRNaXhpbiwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBhdm1fdmVyc2lvbj0xMiwKICAgIC8vICk6CiAgICBwdXNoYnl0ZXMgMHgyNWRiYTk1YiAvLyBtZXRob2QgImFzc2V0X3VwZGF0ZSgodWludDgsdWludDgsdWludDgsdWludDgsdWludDgsdWludDgsYnl0ZVszMl0sc3RyaW5nKSl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9hc3NldF91cGRhdGVfcm91dGVANAoKbWFpbl9zd2l0Y2hfY2FzZV9uZXh0QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMi0yNAogICAgLy8gY2xhc3MgWmVyb0NvdXBvbkJvbmQoCiAgICAvLyAgICAgUEFNQ29yZU1peGluLAogICAgLy8gICAgIE5vQ291cG9uQ2FzaGZsb3dNaXhpbiwKICAgIC8vICAgICBQcmluY2lwYWxQYXltZW50QWdlbnRNaXhpbiwKICAgIC8vICAgICBOb0NvdXBvblRyYW5zZmVyQWdlbnRNaXhpbiwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBhdm1fdmVyc2lvbj0xMiwKICAgIC8vICk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBieiBtYWluX2NyZWF0ZV9Ob09wQDMzCiAgICBwdXNoYnl0ZXNzIDB4ODk0NzQxMzQgMHg0NDM2M2Q0OSAweDY3ZGI0ZjIwIDB4OWM3NmI2YTMgMHg0ZmQ2YTNjYyAweDFkNmZjMjU1IDB4MjVlOTk5N2YgMHg2Yzg1ZTNlZSAweDQwMmRiYTQ3IDB4ZmFkMjE3M2UgMHgwOGVmZWEzNSAweGU0YTVhYjU0IDB4ZGMwNjNiMzUgMHgxNGZjMTBlZiAweDRjMTEzZWQ1IDB4NzRhNzI5N2YgMHgxMDVjMTg0ZSAweDgyZjcxYjJkIDB4ZWYwNGY1ZDMgMHgwM2I4MzMyOSAweDNkYmU4MGJkIDB4ZGY1NGU4MmMgMHgwMTBjODI5OSAweDc0MDZhY2QyIDB4YzNlNGIyOTcgLy8gbWV0aG9kICJhc3NldF9jb25maWcodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50MTYsdWludDE2W10sdWludDY0W10sKHVpbnQ2NCx1aW50NjQpW10pdm9pZCIsIG1ldGhvZCAiZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZShhZGRyZXNzLHVpbnQ2NCkodWludDY0LHVpbnQ2NCwodWludDY0LHVpbnQ2NCkpIiwgbWV0aG9kICJnZXRfcGF5bWVudF9hbW91bnQoYWRkcmVzcykodWludDY0LHVpbnQ2NCkiLCBtZXRob2QgInBheV9wcmluY2lwYWwoYWRkcmVzcyxieXRlW10pKHVpbnQ2NCx1aW50NjQsYnl0ZVtdKSIsIG1ldGhvZCAiYXNzZXRfdHJhbnNmZXIoYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInNldF9zZWNvbmRhcnlfdGltZV9ldmVudHModWludDY0W10pKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJzZXRfZGVmYXVsdF9zdGF0dXMoYm9vbCl1aW50NjQiLCBtZXRob2QgInByaW1hcnlfZGlzdHJpYnV0aW9uKGFkZHJlc3MsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X2luZm8oKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDgsdWludDE2LHVpbnQxNix1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxib29sLHVpbnQ4KSIsIG1ldGhvZCAiZ2V0X3RpbWVfZXZlbnRzKCl1aW50NjRbXSIsIG1ldGhvZCAiZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGUoKXVpbnQ2NFtdIiwgbWV0aG9kICJnZXRfYXNzZXRfbWV0YWRhdGEoKSh1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCxieXRlWzMyXSxzdHJpbmcpIiwgbWV0aG9kICJhY2NvdW50X2dvdl9zdXNwZW5zaW9uKGFkZHJlc3MsYm9vbCl1aW50NjQiLCBtZXRob2QgImFjY291bnRfb3BlbihhZGRyZXNzLGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X2Nsb3NlKGFkZHJlc3MpKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJhY2NvdW50X3VwZGF0ZV9wYXltZW50X2FkZHJlc3MoYWRkcmVzcyxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAiYWNjb3VudF9nZXRfaW5mbyhhZGRyZXNzKShhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LGJvb2wpIiwgbWV0aG9kICJyYmFjX3JvdGF0ZV9hcnJhbmdlcihhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19zZXRfb3BfZGFlbW9uKGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX2Fzc2lnbl9yb2xlKHVpbnQ4LGFkZHJlc3MsYnl0ZVtdKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19yZXZva2Vfcm9sZSh1aW50OCxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19nb3ZfYXNzZXRfc3VzcGVuc2lvbihib29sKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19nZXRfYXJyYW5nZXIoKWFkZHJlc3MiLCBtZXRob2QgInJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXMoYWRkcmVzcykoYm9vbCxib29sLGJvb2wsYm9vbCxib29sKSIsIG1ldGhvZCAicmJhY19nZXRfcm9sZV9jb25maWcodWludDgsYWRkcmVzcykodWludDY0LHVpbnQ2NCkiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBhc3NldF9jb25maWcgZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZSBnZXRfcGF5bWVudF9hbW91bnQgcGF5X3ByaW5jaXBhbCBhc3NldF90cmFuc2ZlciBzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzIHNldF9kZWZhdWx0X3N0YXR1cyBwcmltYXJ5X2Rpc3RyaWJ1dGlvbiBnZXRfYXNzZXRfaW5mbyBnZXRfdGltZV9ldmVudHMgZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGUgZ2V0X2Fzc2V0X21ldGFkYXRhIGFjY291bnRfZ292X3N1c3BlbnNpb24gYWNjb3VudF9vcGVuIGFjY291bnRfY2xvc2UgYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzIGFjY291bnRfZ2V0X2luZm8gcmJhY19yb3RhdGVfYXJyYW5nZXIgcmJhY19zZXRfb3BfZGFlbW9uIHJiYWNfYXNzaWduX3JvbGUgcmJhY19yZXZva2Vfcm9sZSByYmFjX2dvdl9hc3NldF9zdXNwZW5zaW9uIHJiYWNfZ2V0X2FycmFuZ2VyIHJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXMgcmJhY19nZXRfcm9sZV9jb25maWcKICAgIGVycgoKbWFpbl9jcmVhdGVfTm9PcEAzMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjEyLTI0CiAgICAvLyBjbGFzcyBaZXJvQ291cG9uQm9uZCgKICAgIC8vICAgICBQQU1Db3JlTWl4aW4sCiAgICAvLyAgICAgTm9Db3Vwb25DYXNoZmxvd01peGluLAogICAgLy8gICAgIFByaW5jaXBhbFBheW1lbnRBZ2VudE1peGluLAogICAgLy8gICAgIE5vQ291cG9uVHJhbnNmZXJBZ2VudE1peGluLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gICAgIGF2bV92ZXJzaW9uPTEyLAogICAgLy8gKToKICAgIHB1c2hieXRlcyAweDNmMGVmYzZjIC8vIG1ldGhvZCAiYXNzZXRfY3JlYXRlKGFkZHJlc3MsKHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LGJ5dGVbMzJdLHN0cmluZykpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIGFzc2V0X2NyZWF0ZQogICAgZXJyCgptYWluX2Fzc2V0X3VwZGF0ZV9yb3V0ZUA0OgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6Mjc5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBwdXNoaW50IDQgLy8gVXBkYXRlQXBwbGljYXRpb24KICAgID09CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydAogICAgYiBhc3NldF91cGRhdGUKCgovLyBtb2R1bGVzLmFjdHVzLnBhbS5QQU1Db3JlTWl4aW4uYXNzZXRfY29uZmlnW3JvdXRpbmddKCkgLT4gdm9pZDoKYXNzZXRfY29uZmlnOgogICAgLy8gbW9kdWxlcy9hY3R1cy9wYW0ucHk6MjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA3CiAgICBkdXAKICAgIGNvdmVyIDcKICAgIGxlbgogICAgcHVzaGludCAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQxNgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBjb3ZlciA4CiAgICBwdXNoaW50IDIKICAgICoKICAgIHB1c2hpbnQgMgogICAgKwogICAgc3dhcAogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50MTY+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA5CiAgICBkdXAKICAgIGNvdmVyIDcKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgOAogICAgaW50Y18zIC8vIDgKICAgICoKICAgIHB1c2hpbnQgMgogICAgKwogICAgc3dhcAogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8dWludDY0PgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTAKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgOAogICAgcHVzaGludCAxNgogICAgKgogICAgcHVzaGludCAyCiAgICArCiAgICBzd2FwCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTx0dXBsZTx1aW50NjQsdWludDY0Pj4KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjIyNwogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MjI4CiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgPT0gZW51bXMuU1RBVFVTX0lOQUNUSVZFLCBlcnIuQUxSRUFEWV9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBELUFTQSBhbHJlYWR5IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjU1LTU2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIGRlbm9taW5hdGlvbiB3aXRoIEFTQQogICAgLy8gX2NyZWF0b3IsIGV4aXN0cyA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X2NyZWF0b3IoZGVub21pbmF0aW9uX2Fzc2V0X2lkKQogICAgZGlnIDUKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjU3CiAgICAvLyBhc3NlcnQgZXhpc3RzLCBlcnIuSU5WQUxJRF9ERU5PTUlOQVRJT04KICAgIGFzc2VydCAvLyBEZW5vbWluYXRpb24gYXNzZXQgaXMgbm90IHByb3Blcmx5IHNldAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NjAKICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICBieXRlYyAyMiAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgZGlnIDYKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo2NQogICAgLy8gc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgZGlnIDQKICAgIHVuY292ZXIgNgogICAgPT0KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjYzLTY2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc2V0dGxlbWVudCBhc3NldCBpcyB0aGUgZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQgPT0gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIC8vICksIGVyci5JTlZBTElEX1NFVFRMRU1FTlRfQVNTRVQKICAgIGFzc2VydCAvLyBEaWZmZXJlbnQgc2V0dGxlbWVudCBhc3NldCBub3Qgc3VwcG9ydGVkLCBtdXN0IGJlIGVxdWFsIHRvIGRlbm9taW5hdGlvbiBhc3NldAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NjkKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCA9IHNldHRsZW1lbnRfYXNzZXRfaWQKICAgIGJ5dGVjIDEzIC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgZGlnIDUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3MC03NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhc3NldF9hbW91bnQ9MCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NzUKICAgIC8vIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3MwogICAgLy8gYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3NAogICAgLy8gYXNzZXRfYW1vdW50PTAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICB1bmNvdmVyIDUKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3MC03MQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3MC03NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhc3NldF9hbW91bnQ9MCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjIzOC0yMzkKICAgIC8vICMgU2V0IFByaW5jaXBhbCBhbmQgTWluaW11bSBEZW5vbWluYXRpb24KICAgIC8vIGFzc2VydCBwcmluY2lwYWwgJSBtaW5pbXVtX2Rlbm9taW5hdGlvbiA9PSAwLCBlcnIuSU5WQUxJRF9NSU5JTVVNX0RFTk9NSU5BVElPTgogICAgZGlnIDMKICAgIGRpZyAyCiAgICAlCiAgICAhCiAgICBhc3NlcnQgLy8gTWluaW11bSBkZW5vbWluYXRpb24gaXMgbm90IGEgZGl2aXNvciBvZiBwcmluY2lwYWwKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI0MAogICAgLy8gc2VsZi51bml0X3ZhbHVlID0gbWluaW11bV9kZW5vbWluYXRpb24KICAgIGJ5dGVjIDYgLy8gInVuaXRfdmFsdWUiCiAgICBkaWcgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI0MQogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IHByaW5jaXBhbCAvLyBtaW5pbXVtX2Rlbm9taW5hdGlvbgogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIC8KICAgIGJ5dGVjIDEyIC8vICJ0b3RhbF91bml0cyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyNDIKICAgIC8vIHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50ID0gcHJpbmNpcGFsX2Rpc2NvdW50CiAgICBieXRlYyAxNSAvLyAicHJpbmNpcGFsX2Rpc2NvdW50IgogICAgdW5jb3ZlciAyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MjQ0LTI0NQogICAgLy8gIyBTZXQgRGF5LUNvdW50IENvbnZlbnRpb24KICAgIC8vIHNlbGYuYXNzZXJ0X2RheV9jb3VudF9jb252ZW50aW9uKGRheV9jb3VudF9jb252ZW50aW9uLmFzX3VpbnQ2NCgpKQogICAgYnRvaQogICAgZHVwCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3OS04MwogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIG9ubHkgdGhlIEFjdHVhbC9BY3R1YWwgYW5kIENvbnRpbnVvdXMgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0FfQSksCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQ09OVCksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9EQVlfQ09VTlRfQ09OVkVOVElPTgogICAgYnogYXNzZXRfY29uZmlnX2Jvb2xfdHJ1ZUAzCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjgyCiAgICAvLyBVSW50NjQoY3N0LkRDQ19DT05UKSwKICAgIHB1c2hpbnQgMjU1CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3OS04MwogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIG9ubHkgdGhlIEFjdHVhbC9BY3R1YWwgYW5kIENvbnRpbnVvdXMgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0FfQSksCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQ09OVCksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9EQVlfQ09VTlRfQ09OVkVOVElPTgogICAgPT0KICAgIGJ6IGFzc2V0X2NvbmZpZ19ib29sX2ZhbHNlQDQKCmFzc2V0X2NvbmZpZ19ib29sX3RydWVAMzoKICAgIGludGNfMSAvLyAxCgphc3NldF9jb25maWdfYm9vbF9tZXJnZUA1OgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NzktODMKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBvbmx5IHRoZSBBY3R1YWwvQWN0dWFsIGFuZCBDb250aW51b3VzIGRheS1jb3VudCBjb252ZW50aW9ucwogICAgLy8gYXNzZXJ0IGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19BX0EpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0NPTlQpLAogICAgLy8gKSwgZXJyLklOVkFMSURfREFZX0NPVU5UX0NPTlZFTlRJT04KICAgIGFzc2VydCAvLyBJbnZhbGlkIGRheS1jb3VudCBjb252ZW50aW9uIElECiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo4NgogICAgLy8gc2VsZi5kYXlfY291bnRfY29udmVudGlvbiA9IGRheV9jb3VudF9jb252ZW50aW9uCiAgICBieXRlYyAxNCAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI0OC0yNDkKICAgIC8vICMgU2V0IEludGVyZXN0IFJhdGUKICAgIC8vIHNlbGYuYXNzZXJ0X2ludGVyZXN0X3JhdGUoaW50ZXJlc3RfcmF0ZS5hc191aW50NjQoKSkKICAgIGRpZyA1CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weToxNC0xNQogICAgLy8gIyBUaGlzIHN1YnJvdXRpbmUgbXVzdCBiZSB1c2VkIGFmdGVyIHRoZSBwcmluY2lwYWwgZGlzY291bnQgaGFzIGJlZW4gc2V0CiAgICAvLyBhc3NlcnQgaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCksIGVyci5JTlZBTElEX0lOVEVSRVNUX1JBVEUKICAgIGR1cAogICAgIQogICAgYXNzZXJ0IC8vIEludGVyZXN0IHJhdGUgaXMgbm90IHByb3Blcmx5IGRlZmluZWQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5Ojk0CiAgICAvLyBzZWxmLmludGVyZXN0X3JhdGUgPSBpbnRlcmVzdF9yYXRlCiAgICBieXRlYyAyNiAvLyAiaW50ZXJlc3RfcmF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo5NwogICAgLy8gYXNzZXJ0IG5vdCBjb3Vwb25fcmF0ZXMubGVuZ3RoLCBlcnIuSU5WQUxJRF9DT1VQT05fUkFURVMKICAgIGRpZyA0CiAgICBkdXAKICAgICEKICAgIGFzc2VydCAvLyBDb3Vwb24gcmF0ZXMgYXJlIG5vdCBwcm9wZXJseSBkZWZpbmVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMDAKICAgIC8vIHNlbGYudG90YWxfY291cG9ucyA9IGNvdXBvbl9yYXRlcy5sZW5ndGgKICAgIGJ5dGVjIDI5IC8vICJ0b3RhbF9jb3Vwb25zIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMDQKICAgIC8vIHRpbWVfZXZlbnRzLmxlbmd0aCA9PSBzZWxmLnRvdGFsX2NvdXBvbnMgKyBjZmcuVElNRV9TQ0hFRFVMRV9MSU1JVFMKICAgIHB1c2hpbnQgNAogICAgKwogICAgZGlnIDMKICAgID09CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMDMtMTA1CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHRpbWVfZXZlbnRzLmxlbmd0aCA9PSBzZWxmLnRvdGFsX2NvdXBvbnMgKyBjZmcuVElNRV9TQ0hFRFVMRV9MSU1JVFMKICAgIC8vICksIGVyci5JTlZBTElEX1RJTUVfRVZFTlRTX0xFTkdUSAogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIGxlbmd0aCBpcyBpbnZhbGlkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyNTgKICAgIC8vIHNlbGYuYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZCh0aW1lX2V2ZW50cykKICAgIGRpZyAzCiAgICBjYWxsc3ViIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjEyNwogICAgLy8gc2VsZi50aW1lX2V2ZW50cy52YWx1ZSA9IHRpbWVfZXZlbnRzLmNvcHkoKQogICAgYnl0ZWMgMjcgLy8gMHg3NDY5NmQ2NTQ1NzY2NTZlNzQ3MwogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlYyAyNyAvLyAweDc0Njk2ZDY1NDU3NjY1NmU3NDczCiAgICBkaWcgMQogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTI4LTEzMAogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgPSB0aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fT1BFTklOR19EQVRFX0lEWAogICAgLy8gXQogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDEKICAgIHB1c2hpbnQgMgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjEyOAogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgPSB0aW1lX2V2ZW50c1sKICAgIGJ5dGVjIDcgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjEyOC0xMzAKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlID0gdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX09QRU5JTkdfREFURV9JRFgKICAgIC8vIF0KICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMzEtMTMzCiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TVVJFX0RBVEVfSURYCiAgICAvLyBdCiAgICBkaWcgMQogICAgcHVzaGludCAxMAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjEzMQogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgPSB0aW1lX2V2ZW50c1sKICAgIGJ5dGVjIDI0IC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUiCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMzEtMTMzCiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TVVJFX0RBVEVfSURYCiAgICAvLyBdCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTM0CiAgICAvLyBzZWxmLmlzc3VhbmNlX2RhdGUgPSB0aW1lX2V2ZW50c1tjZmcuSVNTVUFOQ0VfREFURV9JRFhdCiAgICBkaWcgMQogICAgcHVzaGludCAxOAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDggLy8gImlzc3VhbmNlX2RhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTM1CiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSB0aW1lX2V2ZW50c1tjZmcuTUFUVVJJVFlfREFURV9JRFhdCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNCAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMzgKICAgIC8vIGFzc2VydCBub3QgdGltZV9wZXJpb2RzLmxlbmd0aCwgZXJyLklOVkFMSURfVElNRV9QRVJJT0RTCiAgICBkaWcgMQogICAgIQogICAgYXNzZXJ0IC8vIFRpbWUgcGVyaW9kcyBhcmUgbm90IHByb3Blcmx5IGRlZmluZWQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI2NQogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX0FDVElWRSkKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgMTAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1cy9wYW0ucHk6MjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKYXNzZXRfY29uZmlnX2Jvb2xfZmFsc2VANDoKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2V0X2NvbmZpZ19ib29sX21lcmdlQDUKCgovLyBtb2R1bGVzLmNvcmVfZmluYW5jaWFsLm5vX2NvdXBvbi5Ob0NvdXBvbkNhc2hmbG93TWl4aW4uZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWU6CiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDUKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvbm9fY291cG9uLnB5OjU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9ub19jb3Vwb24ucHk6NzgKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvbm9fY291cG9uLnB5Ojc4LTc5CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gYW5kIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID49IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICBieiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9ub19jb3Vwb24ucHk6NzkKICAgIC8vIGFuZCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICA+PQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9ub19jb3Vwb24ucHk6NzgtNzkKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIGJ6IGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUA0CiAgICBpbnRjXzEgLy8gMQoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX21lcmdlQDU6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weTo3Ny04MAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gICAgIGFuZCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gKSwgZXJyLk5PX1BSSU1BUllfRElTVFJJQlVUSU9OCiAgICBhc3NlcnQgLy8gUHJpbWFyeSBkaXN0cmlidXRpb24gbm90IHlldCBleGVjdXRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjMxCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSAxMAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9ub19jb3Vwb24ucHk6ODIKICAgIC8vIGFzc2VydCAwIDwgdW5pdHMgPD0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMsIGVyci5JTlZBTElEX1VOSVRTCiAgICBkdXAKICAgIGJ6IGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUA4CiAgICBkaWcgOAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMiAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxCiAgICA+PQogICAgYnogZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDgKICAgIGludGNfMSAvLyAxCgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfbWVyZ2VAOToKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvbm9fY291cG9uLnB5OjgyCiAgICAvLyBhc3NlcnQgMCA8IHVuaXRzIDw9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLCBlcnIuSU5WQUxJRF9VTklUUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYW1vdW50IG9mIHVuaXRzIGZvciB0aGUgYWNjb3VudAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9ub19jb3Vwb24ucHk6ODQKICAgIC8vIGFjY291bnRfdW5pdHNfbm9taW5hbF92YWx1ZSA9IHNlbGYuYWNjb3VudF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MsIHVuaXRzKQogICAgZHVwMgogICAgY2FsbHN1YiBhY2NvdW50X3VuaXRzX3ZhbHVlCiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9ub19jb3Vwb24ucHk6ODYKICAgIC8vIGFjY291bnRfdW5pdHNfbm9taW5hbF92YWx1ZSAqIHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50IC8vIGNzdC5CUFMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNSAvLyAicHJpbmNpcGFsX2Rpc2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW5jaXBhbF9kaXNjb3VudCBleGlzdHMKICAgIGRpZyAxCiAgICAqCiAgICBwdXNoaW50IDEwMDAwCiAgICAvCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weTo5MAogICAgLy8gYWNjb3VudF91bml0c19ub21pbmFsX3ZhbHVlIC0gYWNjb3VudF91bml0c19kaXNjb3VudAogICAgLQogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weTo5My05NAogICAgLy8gIyBBY2NydWluZyBpbnRlcmVzdCBkdXJpbmcgcHJpbWFyeSBkaXN0cmlidXRpb24gYW5kIGF0IG1hdHVyaXR5CiAgICAvLyBhY2NydWVkX2ludGVyZXN0ID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvbm9fY291cG9uLnB5Ojk1CiAgICAvLyBudW1lcmF0b3IgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9ub19jb3Vwb24ucHk6OTYKICAgIC8vIGRlbm9taW5hdG9yID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvbm9fY291cG9uLnB5OjMwLTMxCiAgICAvLyAjIFRoZSBjaGVjayBvbiBtYXR1cml0eSBkYXRlIGVuc3VyZXMgRC1BU0EgaGFzIGJlZW4gY29uZmlndXJlZCBhcyBibG9jayB0aW1lc3RhbXAgY2Fubm90IGJlIGxlc3MgdGhhbiAwIChpbml0KS4KICAgIC8vIHJldHVybiBzZWxmLmlzc3VhbmNlX2RhdGUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLm1hdHVyaXR5X2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA4IC8vICJpc3N1YW5jZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzc3VhbmNlX2RhdGUgZXhpc3RzCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGJ1cnkgNwogICAgPD0KICAgIGJ6IGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUAxNwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgIGRpZyA1CiAgICA+CiAgICBieiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VAMTcKICAgIGludGNfMSAvLyAxCgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfbWVyZ2VAMTg6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weTo5OC05OQogICAgLy8gIyBBY2NydWluZyBpbnRlcmVzdAogICAgLy8gaWYgc2VsZi5pc19hY2NydWluZ19pbnRlcmVzdCgpOgogICAgYnogZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weToxMDAKICAgIC8vIGRheV9jb3VudF9mYWN0b3IgPSBzZWxmLmRheV9jb3VudF9mYWN0b3IoKQogICAgY2FsbHN1YiBkYXlfY291bnRfZmFjdG9yCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weToxMDEKICAgIC8vIGFjY3J1ZWRfaW50ZXJlc3QgPSBzZWxmLmFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50KGhvbGRpbmdfYWRkcmVzcywgdW5pdHMpCiAgICBkaWcgMgogICAgZGlnIDIKICAgIGNhbGxzdWIgYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQKICAgIGJ1cnkgNwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9ub19jb3Vwb24ucHk6MTAyCiAgICAvLyBudW1lcmF0b3IgPSBkYXlfY291bnRfZmFjdG9yLm51bWVyYXRvcgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgNAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9ub19jb3Vwb24ucHk6MTAzCiAgICAvLyBkZW5vbWluYXRvciA9IGRheV9jb3VudF9mYWN0b3IuZGVub21pbmF0b3IKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnVyeSA0CgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2FmdGVyX2lmX2Vsc2VAMTE6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weToxMDUtMTA2CiAgICAvLyAjIFZhbHVlIGF0IG1hdHVyaXR5CiAgICAvLyBpZiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLm1hdHVyaXR5X2RhdGU6CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgPj0KICAgIGJ6IGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYWZ0ZXJfaWZfZWxzZUAxMwogICAgZGlnIDYKICAgIGJ1cnkgOAoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9ub19jb3Vwb24ucHk6MTEyLTExNQogICAgLy8gZGF5X2NvdW50X2ZhY3Rvcj10eXAuRGF5Q291bnRGYWN0b3IoCiAgICAvLyAgICAgbnVtZXJhdG9yPW51bWVyYXRvciwKICAgIC8vICAgICBkZW5vbWluYXRvcj1kZW5vbWluYXRvciwKICAgIC8vICksCiAgICBkaWcgMgogICAgaXRvYgogICAgZGlnIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9ub19jb3Vwb24ucHk6MTA5LTExNgogICAgLy8gcmV0dXJuIHR5cC5DdXJyZW50VW5pdHNWYWx1ZSgKICAgIC8vICAgICB1bml0c192YWx1ZT1hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWUsCiAgICAvLyAgICAgYWNjcnVlZF9pbnRlcmVzdD1hY2NydWVkX2ludGVyZXN0LAogICAgLy8gICAgIGRheV9jb3VudF9mYWN0b3I9dHlwLkRheUNvdW50RmFjdG9yKAogICAgLy8gICAgICAgICBudW1lcmF0b3I9bnVtZXJhdG9yLAogICAgLy8gICAgICAgICBkZW5vbWluYXRvcj1kZW5vbWluYXRvciwKICAgIC8vICAgICApLAogICAgLy8gKQogICAgZGlnIDgKICAgIGl0b2IKICAgIGRpZyA3CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9ub19jb3Vwb24ucHk6NTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDE3OgogICAgaW50Y18wIC8vIDAKICAgIGIgZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX21lcmdlQDE4CgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VAODoKICAgIGludGNfMCAvLyAwCiAgICBiIGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9tZXJnZUA5CgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VANDoKICAgIGludGNfMCAvLyAwCiAgICBiIGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9tZXJnZUA1CgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5ub19jb3Vwb24uTm9Db3Vwb25DYXNoZmxvd01peGluLmdldF9wYXltZW50X2Ftb3VudFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9wYXltZW50X2Ftb3VudDoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvbm9fY291cG9uLnB5OjExOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozMQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvbm9fY291cG9uLnB5OjEzNAogICAgLy8gcHJpbmNpcGFsX2Ftb3VudCA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gZW5tLlNUQVRVU19BQ1RJVkUKICAgIGR1cAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgMTAwCiAgICA9PQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9ub19jb3Vwb24ucHk6MTM1CiAgICAvLyBpZiBzZWxmLnN0YXR1c19pc19hY3RpdmUoKToKICAgIGJ6IGdldF9wYXltZW50X2Ftb3VudF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvbm9fY291cG9uLnB5OjEzNgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudCA9IHNlbGYuYWNjb3VudF90b3RhbF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MpCiAgICBkaWcgMQogICAgY2FsbHN1YiBhY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlCiAgICBidXJ5IDEKCmdldF9wYXltZW50X2Ftb3VudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weToxMzcKICAgIC8vIHJldHVybiB0eXAuUGF5bWVudEFtb3VudHMoaW50ZXJlc3Q9VUludDY0KDApLCBwcmluY2lwYWw9cHJpbmNpcGFsX2Ftb3VudCkKICAgIGludGNfMCAvLyAwCiAgICBpdG9iCiAgICBkaWcgMQogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weToxMTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucGF5bWVudF9hZ2VudC5wcmluY2lwYWwuUHJpbmNpcGFsUGF5bWVudEFnZW50TWl4aW4ucGF5X3ByaW5jaXBhbFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnBheV9wcmluY2lwYWw6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvcHJpbmNpcGFsLnB5OjMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cG4gMgogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBlbm0uU1RBVFVTX0FDVElWRQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDEwMAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXMvcGFtLnB5OjE2LTE3CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgcmVzdHJpY3QgY2FsbGVyIGF1dGhvcml6YXRpb24KICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1c19pc19hY3RpdmUoKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjdHVzL3BhbS5weToxOAogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzL3BhbS5weToxOQogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWN0dXMvcGFtLnB5OjIxCiAgICAvLyB1bml0cyA9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIGludGNfMiAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvYWN0dXMvcGFtLnB5OjIyCiAgICAvLyBhc3NlcnQgdW5pdHMgPiAwLCBlcnIuTk9fVU5JVFMKICAgIGFzc2VydCAvLyBObyBELUFTQSB1bml0cwogICAgLy8gbW9kdWxlcy9hY3R1cy9wYW0ucHk6MjMKICAgIC8vIGFzc2VydCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLm1hdHVyaXR5X2RhdGUsIGVyci5OT1RfTUFUVVJFCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgbWF0dXJlCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weTo1MwogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudF90b3RhbF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MpCiAgICBjYWxsc3ViIGFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MTMKICAgIC8vIGlmIHNlbGYub3BfZGFlbW9uLnZhbHVlICE9IEdsb2JhbC56ZXJvX2FkZHJlc3M6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gMHg1MjMyMzUyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wX2RhZW1vbiBleGlzdHMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGJ6IHBheV9wcmluY2lwYWxfYWZ0ZXJfaWZfZWxzZUAyMgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weToxNQogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE5IC8vIDB4NTIzMjM1MjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcF9kYWVtb24gZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weToxNS0xNwogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICBibnogcGF5X3ByaW5jaXBhbF9ib29sX3RydWVAMTkKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MTYKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgNAogICAgPT0KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MTUtMTcKICAgIC8vIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICAvLyBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgYm56IHBheV9wcmluY2lwYWxfYm9vbF90cnVlQDE5CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjE3CiAgICAvLyBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgdHhuIFNlbmRlcgogICAgZGlnIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgMzIKICAgID09CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjE1LTE3CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIGJ6IHBheV9wcmluY2lwYWxfYm9vbF9mYWxzZUAyMAoKcGF5X3ByaW5jaXBhbF9ib29sX3RydWVAMTk6CiAgICBpbnRjXzEgLy8gMQoKcGF5X3ByaW5jaXBhbF9ib29sX21lcmdlQDIxOgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weToxNC0xOAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyAgICAgb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vICAgICBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgLy8gKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCgpwYXlfcHJpbmNpcGFsX2FmdGVyX2lmX2Vsc2VAMjI6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjIyCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MuaXNfb3B0ZWRfaW4oCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCAzMgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weToyMwogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MjItMjQKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5pc19vcHRlZF9pbigKICAgIC8vICAgICBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQKICAgIC8vICkKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjIyLTI1CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MuaXNfb3B0ZWRfaW4oCiAgICAvLyAgICAgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkCiAgICAvLyApCiAgICAvLyBhbmQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZAogICAgYnogcGF5X3ByaW5jaXBhbF9ib29sX2ZhbHNlQDI3CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjI1CiAgICAvLyBhbmQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZAogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQ0OAogICAgZ2V0Yml0CiAgICBibnogcGF5X3ByaW5jaXBhbF9ib29sX2ZhbHNlQDI3CiAgICBpbnRjXzEgLy8gMQoKcGF5X3ByaW5jaXBhbF9ib29sX21lcmdlQDI4OgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L3ByaW5jaXBhbC5weTo1NgogICAgLy8gaWYgc2VsZi5pc19wYXltZW50X2V4ZWN1dGFibGUoaG9sZGluZ19hZGRyZXNzKToKICAgIGJ6IHBheV9wcmluY2lwYWxfZWxzZV9ib2R5QDMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MzAKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICBzd2FwCiAgICBkaWcgMQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBvcHRlZCBpbnRvIGFzc2V0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjMwLTMxCiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgLy8gPj0gcGF5bWVudF9hbW91bnQKICAgIGRpZyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgID49CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjI5LTMyCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICAvLyAgICAgPj0gcGF5bWVudF9hbW91bnQKICAgIC8vICksIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcyBmb3IgdGhlIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9wcmluY2lwYWwucHk6NTktNjAKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgdGhlIHNhbWUgYXNzZXQgZm9yIGRlbm9taW5hdGlvbiBhbmQgc2V0dGxlbWVudCwgbm8gY29udmVyc2lvbiBuZWVkZWQKICAgIC8vIHNlbGYucGF5KHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcywgcGF5bWVudF9hbW91bnQpCiAgICBkaWcgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCAzMgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weTozNS00MAogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXJlY2VpdmVyLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1hbW91bnQsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MzkKICAgIC8vIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgc3dhcAogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MzUKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MzUtNDAKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1yZWNlaXZlciwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9YW1vdW50LAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAoKcGF5X3ByaW5jaXBhbF9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxOTkKICAgIC8vIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgLT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGRpZyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzIgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICAtCiAgICBieXRlY18zIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyMDAKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBpdG9iCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMzIKICAgIGRpZyAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MjAxCiAgICAvLyBzZWxmLmVuZF9pZl9ub19jaXJjdWxhdGluZ191bml0cygpCiAgICBjYWxsc3ViIGVuZF9pZl9ub19jaXJjdWxhdGluZ191bml0cwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L3ByaW5jaXBhbC5weToxNwogICAgLy8gY29udHJhY3RfaWQ9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25faWQuaWQsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uSUQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9wcmluY2lwYWwucHk6MjAKICAgIC8vIHRpbWU9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvcHJpbmNpcGFsLnB5OjIyCiAgICAvLyBjdXJyZW5jeV9pZD1zZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZC5pZCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMiAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9wcmluY2lwYWwucHk6MjMKICAgIC8vIGN1cnJlbmN5X3VuaXQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQudW5pdF9uYW1lLAogICAgZHVwCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9wcmluY2lwYWwucHk6MjQKICAgIC8vIG5vbWluYWxfdmFsdWU9c2VsZi5jaXJjdWxhdGluZ191bml0cyAqIHNlbGYudW5pdF92YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJ1bml0X3ZhbHVlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnVuaXRfdmFsdWUgZXhpc3RzCiAgICAqCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvcHJpbmNpcGFsLnB5OjE2LTI3CiAgICAvLyBFdmVudCgKICAgIC8vICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICB0eXBlPWFyYzQuVUludDgoZW51bXMuRVZUX1RZUEVfUFIpLAogICAgLy8gICAgIHR5cGVfbmFtZT1TdHJpbmcoIlBSIiksCiAgICAvLyAgICAgdGltZT1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICBwYXlvZmY9cGF5b2ZmLAogICAgLy8gICAgIGN1cnJlbmN5X2lkPXNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkLmlkLAogICAgLy8gICAgIGN1cnJlbmN5X3VuaXQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQudW5pdF9uYW1lLAogICAgLy8gICAgIG5vbWluYWxfdmFsdWU9c2VsZi5jaXJjdWxhdGluZ191bml0cyAqIHNlbGYudW5pdF92YWx1ZSwKICAgIC8vICAgICBub21pbmFsX3JhdGVfYnBzPWFyYzQuVUludDE2KDApLAogICAgLy8gICAgIG5vbWluYWxfYWNjcnVlZD1VSW50NjQoMCksCiAgICAvLyApCiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIHB1c2hieXRlcyAweDAzMDAzNwogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZGlnIDUKICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHVuY292ZXIgNAogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgMwogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHN3YXAKICAgIHB1c2hieXRlcyAweDAwM2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9wcmluY2lwYWwucHk6MjUKICAgIC8vIG5vbWluYWxfcmF0ZV9icHM9YXJjNC5VSW50MTYoMCksCiAgICBieXRlYyAzMCAvLyAweDAwMDAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9wcmluY2lwYWwucHk6MTYtMjcKICAgIC8vIEV2ZW50KAogICAgLy8gICAgIGNvbnRyYWN0X2lkPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2lkLmlkLAogICAgLy8gICAgIHR5cGU9YXJjNC5VSW50OChlbnVtcy5FVlRfVFlQRV9QUiksCiAgICAvLyAgICAgdHlwZV9uYW1lPVN0cmluZygiUFIiKSwKICAgIC8vICAgICB0aW1lPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gICAgIHBheW9mZj1wYXlvZmYsCiAgICAvLyAgICAgY3VycmVuY3lfaWQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQuaWQsCiAgICAvLyAgICAgY3VycmVuY3lfdW5pdD1zZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZC51bml0X25hbWUsCiAgICAvLyAgICAgbm9taW5hbF92YWx1ZT1zZWxmLmNpcmN1bGF0aW5nX3VuaXRzICogc2VsZi51bml0X3ZhbHVlLAogICAgLy8gICAgIG5vbWluYWxfcmF0ZV9icHM9YXJjNC5VSW50MTYoMCksCiAgICAvLyAgICAgbm9taW5hbF9hY2NydWVkPVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDAwMDI1MDUyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L3ByaW5jaXBhbC5weToxNS0yOAogICAgLy8gYXJjNC5lbWl0KAogICAgLy8gICAgIEV2ZW50KAogICAgLy8gICAgICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICAgICAgdHlwZT1hcmM0LlVJbnQ4KGVudW1zLkVWVF9UWVBFX1BSKSwKICAgIC8vICAgICAgICAgdHlwZV9uYW1lPVN0cmluZygiUFIiKSwKICAgIC8vICAgICAgICAgdGltZT1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICAgICAgcGF5b2ZmPXBheW9mZiwKICAgIC8vICAgICAgICAgY3VycmVuY3lfaWQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQuaWQsCiAgICAvLyAgICAgICAgIGN1cnJlbmN5X3VuaXQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQudW5pdF9uYW1lLAogICAgLy8gICAgICAgICBub21pbmFsX3ZhbHVlPXNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKiBzZWxmLnVuaXRfdmFsdWUsCiAgICAvLyAgICAgICAgIG5vbWluYWxfcmF0ZV9icHM9YXJjNC5VSW50MTYoMCksCiAgICAvLyAgICAgICAgIG5vbWluYWxfYWNjcnVlZD1VSW50NjQoMCksCiAgICAvLyAgICAgKQogICAgLy8gKQogICAgcHVzaGJ5dGVzIDB4OGMyOTkwNGUgLy8gbWV0aG9kICJFdmVudCh1aW50NjQsdWludDgsc3RyaW5nLHVpbnQ2NCx1aW50NjQsdWludDY0LGJ5dGVbXSx1aW50NjQsdWludDE2LHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L3ByaW5jaXBhbC5weTo2OQogICAgLy8gdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L3ByaW5jaXBhbC5weTo2Ny03MQogICAgLy8gcmV0dXJuIHR5cC5QYXltZW50UmVzdWx0KAogICAgLy8gICAgIGFtb3VudD1wYXltZW50X2Ftb3VudCwKICAgIC8vICAgICB0aW1lc3RhbXA9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgY29udGV4dD1wYXltZW50X2luZm8sICAjIFRPRE86IEFkZCBpbmZvIG9uIGZhaWxlZCBwYXltZW50CiAgICAvLyApCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyAzCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgcHVzaGJ5dGVzIDB4MDAxMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9wcmluY2lwYWwucHk6MzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKcGF5X3ByaW5jaXBhbF9lbHNlX2JvZHlAMzoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9wcmluY2lwYWwucHk6NjItNjMKICAgIC8vICMgQWNjb3VudHMgc3VzcGVuZGVkIG9yIG5vdCBvcHRlZCBpbiBhdCB0aGUgdGltZSBvZiBwYXltZW50cyBtdXN0IG5vdCBzdGFsbCB0aGUgRC1BU0EKICAgIC8vIHBheW1lbnRfYW1vdW50ID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDEKICAgIGIgcGF5X3ByaW5jaXBhbF9hZnRlcl9pZl9lbHNlQDQKCnBheV9wcmluY2lwYWxfYm9vbF9mYWxzZUAyNzoKICAgIGludGNfMCAvLyAwCiAgICBiIHBheV9wcmluY2lwYWxfYm9vbF9tZXJnZUAyOAoKcGF5X3ByaW5jaXBhbF9ib29sX2ZhbHNlQDIwOgogICAgaW50Y18wIC8vIDAKICAgIGIgcGF5X3ByaW5jaXBhbF9ib29sX21lcmdlQDIxCgoKLy8gbW9kdWxlcy50cmFuc2Zlcl9hZ2VudC5ub19jb3Vwb24uTm9Db3Vwb25UcmFuc2ZlckFnZW50TWl4aW4uYXNzZXRfdHJhbnNmZXJbcm91dGluZ10oKSAtPiB2b2lkOgphc3NldF90cmFuc2ZlcjoKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDIKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50L25vX2NvdXBvbi5weTo5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBlbm0uU1RBVFVTX0FDVElWRQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDEwMAogICAgPT0KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE1My0xNTgKICAgIC8vIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpCiAgICAvLyBhbmQgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gYW5kICgKICAgIC8vICAgICBub3Qgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgLy8gICAgIG9yIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDwgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgLy8gKQogICAgYnogYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUA2CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNTQKICAgIC8vIGFuZCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIGV4aXN0cwogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPD0KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE1My0xNTgKICAgIC8vIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpCiAgICAvLyBhbmQgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gYW5kICgKICAgIC8vICAgICBub3Qgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgLy8gICAgIG9yIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDwgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgLy8gKQogICAgYnogYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUA2CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNTYKICAgIC8vIG5vdCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNTYtMTU3CiAgICAvLyBub3Qgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgLy8gb3IgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICBieiBhc3NldF90cmFuc2Zlcl9ib29sX3RydWVANQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTU3CiAgICAvLyBvciBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIDwKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE1Ni0xNTcKICAgIC8vIG5vdCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICAvLyBvciBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VANgoKYXNzZXRfdHJhbnNmZXJfYm9vbF90cnVlQDU6CiAgICBpbnRjXzEgLy8gMQoKYXNzZXRfdHJhbnNmZXJfYm9vbF9tZXJnZUA3OgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTUyLTE1OQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnN0YXR1c19pc19hY3RpdmUoKQogICAgLy8gICAgIGFuZCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgYW5kICgKICAgIC8vICAgICAgICAgbm90IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIC8vICAgICAgICAgb3IgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICAvLyAgICAgKQogICAgLy8gKSwgZXJyLlNFQ09OREFSWV9NQVJLRVRfQ0xPU0VECiAgICBhc3NlcnQgLy8gU2Vjb25kYXJ5IG1hcmtldCBpcyBjbG9zZWQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE2OS0xNzEKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBncmFudHMgdHJhbnNmZXIgcmlnaHQgdG8gRC1BU0Egb3duZXJzLiBPdGhlciBpbXBsZW1lbnRhdGlvbnMgbWF5IHJlbGF5IG9uIG90aGVyCiAgICAvLyAjIHJvbGVzLCBleHRlcm5hbCBBcHBzIHRocm91Z2ggQzJDIGNhbGxzIChlLmcuLCBhbiBvcmRlciBib29rKSwgb3Igb2ZmLWNoYWluIHRyYW5zZmVyIGFnZW50cy4KICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIGRpZyAzCiAgICBkdXAKICAgIGNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE3MgogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNzMKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjMxCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA5CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgMTAKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTc2CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQoc2VuZGVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGRpZyAzCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE3NwogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGRpZyAxCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE5MAogICAgLy8gYXNzZXJ0IHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MgIT0gcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzLCBlcnIuU0VMRl9UUkFOU0ZFUgogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgICE9CiAgICBhc3NlcnQgLy8gU2VuZGVyIGFuZCByZWNlaXZlciBtdXN0IGJlIGRpZmZlcmVudAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTkxCiAgICAvLyBhc3NlcnQgdW5pdHMgPiAwLCBlcnIuTlVMTF9UUkFOU0ZFUgogICAgZGlnIDIKICAgIGR1cAogICAgYXNzZXJ0IC8vIFRyYW5zZmVyIHVuaXRzIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE5MgogICAgLy8gYXNzZXJ0IHVuaXRzIDw9IHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cywgZXJyLk9WRVJfVFJBTlNGRVIKICAgIHVuY292ZXIgMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGR1cAogICAgaW50Y18yIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgdW5jb3ZlciAyCiAgICA+PQogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCBzZW5kZXIgdW5pdHMgdG8gdHJhbnNmZXIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo2MwogICAgLy8gc2VuZGVyX3VuaXRfdmFsdWUgPSBzZWxmLmFjY291bnRbc2VuZGVyXS51bml0X3ZhbHVlCiAgICBleHRyYWN0IDQwIDgKICAgIGJ1cnkgOQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjY0CiAgICAvLyBpZiBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnVuaXRzID4gVUludDY0KDApOgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMiAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Vsc2VfYm9keUA5CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NTgKICAgIC8vIHNlbGYuYWNjb3VudFtzZW5kZXJdLnVuaXRfdmFsdWUgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS51bml0X3ZhbHVlCiAgICBkaWcgNgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHB1c2hpbnQgNDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgNgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHB1c2hpbnQgNDAKICAgIGV4dHJhY3RfdWludDY0CiAgICA9PQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjU4LTU5CiAgICAvLyBzZWxmLmFjY291bnRbc2VuZGVyXS51bml0X3ZhbHVlID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0udW5pdF92YWx1ZQogICAgLy8gYW5kIHNlbGYuYWNjb3VudFtzZW5kZXJdLnBhaWRfY291cG9ucyA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnBhaWRfY291cG9ucwogICAgYnogYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUAyMAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjU5CiAgICAvLyBhbmQgc2VsZi5hY2NvdW50W3NlbmRlcl0ucGFpZF9jb3Vwb25zID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0ucGFpZF9jb3Vwb25zCiAgICBkaWcgNgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHB1c2hpbnQgNDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgNgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHB1c2hpbnQgNDgKICAgIGV4dHJhY3RfdWludDY0CiAgICA9PQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjU4LTU5CiAgICAvLyBzZWxmLmFjY291bnRbc2VuZGVyXS51bml0X3ZhbHVlID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0udW5pdF92YWx1ZQogICAgLy8gYW5kIHNlbGYuYWNjb3VudFtzZW5kZXJdLnBhaWRfY291cG9ucyA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnBhaWRfY291cG9ucwogICAgYnogYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUAyMAogICAgaW50Y18xIC8vIDEKCmFzc2V0X3RyYW5zZmVyX2Jvb2xfbWVyZ2VAMjE6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NTctNjAKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50W3NlbmRlcl0udW5pdF92YWx1ZSA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnVuaXRfdmFsdWUKICAgIC8vICAgICBhbmQgc2VsZi5hY2NvdW50W3NlbmRlcl0ucGFpZF9jb3Vwb25zID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0ucGFpZF9jb3Vwb25zCiAgICAvLyApLCBlcnIuTk9OX0ZVTkdJQkxFX1VOSVRTCiAgICBhc3NlcnQgLy8gU2VuZGVyIGFuZCByZWNlaXZlciB1bml0cyBhcmUgbm90IGZ1bmdpYmxlCgphc3NldF90cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDEwOgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC9ub19jb3Vwb24ucHk6NDUtNDYKICAgIC8vICMgVHJhbnNmZXJyZWQgdW5pdHMgdmFsdWUgKG11c3QgYmUgY29tcHV0ZWQgYmVmb3JlIHRoZSB0cmFuc2ZlcikKICAgIC8vIHNlbmRlcl91bml0X3ZhbHVlID0gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRfdmFsdWUKICAgIGRpZyA2CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnVyeSA1CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weTo0OQogICAgLy8gcmV0dXJuIHNlbGYuYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQoc2VuZGVyX2hvbGRpbmdfYWRkcmVzcywgdW5pdHMpCiAgICBkaWcgMwogICAgZGlnIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgY2FsbHN1YiBhY2NydWVkX2ludGVyZXN0X2Ftb3VudAogICAgYnVyeSA3CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzEKICAgIC8vIGFzc2VydCB1bml0cyA8PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cywgZXJyLk9WRVJfVFJBTlNGRVIKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgaW50Y18yIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwMgogICAgPD0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgc2VuZGVyIHVuaXRzIHRvIHRyYW5zZmVyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzIKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzIC09IHVuaXRzCiAgICBzd2FwCiAgICAtCiAgICBpdG9iCiAgICBkaWcgMQogICAgaW50Y18yIC8vIDMyCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NTIKICAgIC8vIGlmIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzID09IFVJbnQ2NCgwKToKICAgIGJveF9nZXQKICAgIHBvcAogICAgaW50Y18yIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYm56IGFzc2V0X3RyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMTYKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo1MwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdF92YWx1ZSA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGl0b2IKICAgIGRpZyA3CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgNDAKICAgIGRpZyAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjU0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMgPSBVSW50NjQoMCkKICAgIHB1c2hpbnQgNDgKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCgphc3NldF90cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDE2OgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojc2CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyArPSB1bml0cwogICAgZGlnIDUKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMiAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgICsKICAgIGl0b2IKICAgIHVuY292ZXIgMgogICAgaW50Y18yIC8vIDMyCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50L25vX2NvdXBvbi5weTo1MgogICAgLy8gcmV0dXJuIHVuaXRzICogc2VuZGVyX3VuaXRfdmFsdWUgKyBhY2NydWVkX2ludGVyZXN0CiAgICBkaWcgNAogICAgKgogICAgZGlnIDUKICAgICsKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQvbm9fY291cG9uLnB5OjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUAyMDoKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2V0X3RyYW5zZmVyX2Jvb2xfbWVyZ2VAMjEKCmFzc2V0X3RyYW5zZmVyX2Vsc2VfYm9keUA5OgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjY3CiAgICAvLyBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnVuaXRfdmFsdWUgPSBzZW5kZXJfdW5pdF92YWx1ZQogICAgZGlnIDUKICAgIGR1cAogICAgcHVzaGludCA0MAogICAgZGlnIDEwCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjY4CiAgICAvLyBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnBhaWRfY291cG9ucyA9IHNlbGYuYWNjb3VudFtzZW5kZXJdLnBhaWRfY291cG9ucwogICAgZGlnIDcKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDQ4IDgKICAgIHB1c2hpbnQgNDgKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICBiIGFzc2V0X3RyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMTAKCmFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VANjoKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2V0X3RyYW5zZmVyX2Jvb2xfbWVyZ2VANwoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY29tbW9uLkNvcmVGaW5hbmNpYWxDb21tb25NaXhpbi5hc3NldF9jcmVhdGVbcm91dGluZ10oKSAtPiB2b2lkOgphc3NldF9jcmVhdGU6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyNjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgZGlnIDEKICAgIHB1c2hpbnQgMzgKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIHR1cGxlIGVuY29kaW5nCiAgICBkdXAKICAgIHB1c2hpbnQgNDAKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCB0YWlsIHBvaW50ZXIgYXQgaW5kZXggNyBvZiAodWludDgsdWludDgsdWludDgsdWludDgsdWludDgsdWludDgsdWludDhbMzJdLChsZW4rdXRmOFtdKSkKICAgIGRpZyAyCiAgICBzd2FwCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgNDIKICAgICsKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuQXNzZXRNZXRhZGF0YQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6Mjc2CiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gYXJyYW5nZXIKICAgIGJ5dGVjIDUgLy8gMHg1MjMyMzAyMwogICAgdW5jb3ZlciAyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6Mjc3CiAgICAvLyBzZWxmLm1ldGFkYXRhID0gbWV0YWRhdGEuYnl0ZXMKICAgIGJ5dGVjIDIzIC8vICJtZXRhZGF0YSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyNjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY29tbW9uLkNvcmVGaW5hbmNpYWxDb21tb25NaXhpbi5hc3NldF91cGRhdGVbcm91dGluZ10oKSAtPiB2b2lkOgphc3NldF91cGRhdGU6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyNzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBkaWcgMQogICAgcHVzaGludCAzOAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgdHVwbGUgZW5jb2RpbmcKICAgIGR1cAogICAgcHVzaGludCA0MAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHRhaWwgcG9pbnRlciBhdCBpbmRleCA3IG9mICh1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OFszMl0sKGxlbit1dGY4W10pKQogICAgZGlnIDIKICAgIHN3YXAKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCA0MgogICAgKwogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5Bc3NldE1ldGFkYXRhCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyODQtMjg3CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gZ3JhbnRzIHRoZSB1cGRhdGUgcGVybWlzc2lvbnMgdG8gdGhlIEFycmFuZ2VyLgogICAgLy8gIyBPdGhlciBpbXBsZW1lbnRhdGlvbnMgbWF5IGRpc2FibGUgRC1BU0EgYXBwbGljYXRpb24gdXBkYXRhYmlsaXR5IG9yIGNoYW5nZSBpdHMgYXV0aG9yaXphdGlvbnMuCiAgICAvLyAjIOKaoO+4jyBXQVJOSU5HOiBBcHBsaWNhdGlvbiB1cGRhdGVzIG11c3QgYmUgZXhlY3V0ZWQgVkVSWSBjYXJlZnVsbHksIGFzIHRoZXkgbWlnaHQgaW50cm9kdWNlIGJyZWFraW5nIGNoYW5nZXMuCiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyODgKICAgIC8vIHNlbGYubWV0YWRhdGEgPSBtZXRhZGF0YS5ieXRlcwogICAgYnl0ZWMgMjMgLy8gIm1ldGFkYXRhIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI3OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY29tbW9uLkNvcmVGaW5hbmNpYWxDb21tb25NaXhpbi5zZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzW3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50czoKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyOTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgcHVzaGludCAyCiAgICArCiAgICB1bmNvdmVyIDIKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PHVpbnQ2ND4KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMxMQogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI4CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gZW5tLlNUQVRVU19FTkRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBpbnRjIDQgLy8gMjAwCiAgICA9PQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzEyCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuc3RhdHVzX2lzX2VuZGVkKCksIGVyci5VTkFVVEhPUklaRUQKICAgICEKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzEzCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMxNQogICAgLy8gYXNzZXJ0IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHMubGVuZ3RoID49IDEsIGVyci5JTlZBTElEX1RJTUVfRVZFTlRTX0xFTkdUSAogICAgZHVwCiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbGVuZ3RoIGlzIGludmFsaWQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMxNgogICAgLy8gaWYgc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50cy5sZW5ndGggPiAxOgogICAgaW50Y18xIC8vIDEKICAgID4KICAgIGJ6IHNldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMTcKICAgIC8vIHNlbGYuYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZChzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzKQogICAgZHVwCiAgICBjYWxsc3ViIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQKICAgIGJ1cnkgMQoKc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50c19hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMjAKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDggLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMyMQogICAgLy8gPD0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1tjZmcuU0VDT05EQVJZX01BUktFVF9PUEVOSU5HX0RBVEVfSURYXQogICAgZGlnIDEKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGJ1cnkgNAogICAgcHVzaGludCAyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzIwLTMyMQogICAgLy8gc2VsZi5pc3N1YW5jZV9kYXRlCiAgICAvLyA8PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzW2NmZy5TRUNPTkRBUllfTUFSS0VUX09QRU5JTkdfREFURV9JRFhdCiAgICBzd2FwCiAgICBkaWcgMQogICAgPD0KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMxOS0zMjIKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5pc3N1YW5jZV9kYXRlCiAgICAvLyAgICAgPD0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1tjZmcuU0VDT05EQVJZX01BUktFVF9PUEVOSU5HX0RBVEVfSURYXQogICAgLy8gKSwgZXJyLklOVkFMSURfU0VDT05EQVJZX09QRU5JTkdfREFURQogICAgYXNzZXJ0IC8vIEludmFsaWQgc2Vjb25kYXJ5IG1hcmtldCBvcGVuaW5nIGRhdGUKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMyMwogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICBieXRlYyAxNiAvLyAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMjMtMzI1CiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlID0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyBdCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzI2CiAgICAvLyBpZiBzZWxmLm1hdHVyaXR5X2RhdGU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgYnogc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50c19hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMyOAogICAgLy8gc2VsZi5tYXR1cml0eV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzI5CiAgICAvLyA+PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzW2NmZy5TRUNPTkRBUllfTUFSS0VUX0NMT1NVUkVfREFURV9JRFhdCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgZGlnIDMKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMjgtMzI5CiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUKICAgIC8vID49IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWF0KICAgIHN3YXAKICAgIGRpZyAxCiAgICA+PQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzI3LTMzMAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLm1hdHVyaXR5X2RhdGUKICAgIC8vICAgICA+PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzW2NmZy5TRUNPTkRBUllfTUFSS0VUX0NMT1NVUkVfREFURV9JRFhdCiAgICAvLyApLCBlcnIuSU5WQUxJRF9TRUNPTkRBUllfQ0xPU1VSRV9EQVRFCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzZWNvbmRhcnkgbWFya2V0IGNsb3N1cmUgZGF0ZQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzMxCiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlID0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIGJ5dGVjIDkgLy8gInNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzMxLTMzMwogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSA9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gXQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCnNldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzM1CiAgICAvLyBzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZT1zZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMzNgogICAgLy8gc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGU9c2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMzNC0zMzcKICAgIC8vIHJldHVybiB0eXAuU2Vjb25kYXJ5TWFya2V0U2NoZWR1bGUoCiAgICAvLyAgICAgc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGU9c2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSwKICAgIC8vICAgICBzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZT1zZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlLAogICAgLy8gKQogICAgc3dhcAogICAgaXRvYgogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyOTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY29tbW9uLkNvcmVGaW5hbmNpYWxDb21tb25NaXhpbi5zZXRfZGVmYXVsdF9zdGF0dXNbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfZGVmYXVsdF9zdGF0dXM6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo3NAogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYudHJ1c3RlZSwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDE3IC8vIDB4NTIzNjMwMjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjM1MgogICAgLy8gc2VsZi5hc3NldF9kZWZhdWx0ZWQgPSBkZWZhdWx0ZWQKICAgIGJ5dGVjIDIxIC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzUzCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMzOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb21tb24uQ29yZUZpbmFuY2lhbENvbW1vbk1peGluLnByaW1hcnlfZGlzdHJpYnV0aW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcHJpbWFyeV9kaXN0cmlidXRpb246CiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjM1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGVubS5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgMTAwCiAgICA9PQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTQ1LTE0OAogICAgLy8gc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCkKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VANQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTQ2CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTQ3CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZHVwCiAgICBidXJ5IDUKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE0Ni0xNDcKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIDw9CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNDYtMTQ4CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDUKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE0OAogICAgLy8gPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI0IC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTQ3LTE0OAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGRpZyAzCiAgICA+CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNDYtMTQ4CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDUKICAgIGludGNfMSAvLyAxCgpwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX21lcmdlQDY6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNDQtMTQ5CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpCiAgICAvLyAgICAgYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICAvLyApLCBlcnIuUFJJTUFSWV9ESVNUUklCVVRJT05fQ0xPU0VECiAgICBhc3NlcnQgLy8gUHJpbWFyeSBkaXN0cmlidXRpb24gaXMgY2xvc2VkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzEKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnByaW1hcnlfZGVhbGVyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMTggLy8gMHg1MjM1MzAyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjMxCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzgzCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjM4NAogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozODUKICAgIC8vIGFzc2VydCB1bml0cyA+IDAsIGVyci5aRVJPX1VOSVRTCiAgICBkaWcgMQogICAgZHVwCiAgICBhc3NlcnQgLy8gQ2FuIG5vdCBkaXN0cmlidXRlIHplcm8gdW5pdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjM4NgogICAgLy8gYXNzZXJ0IHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKyB1bml0cyA8PSBzZWxmLnRvdGFsX3VuaXRzLCBlcnIuT1ZFUl9ESVNUUklCVVRJT04KICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGRpZyAxCiAgICArCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgZGlnIDEKICAgID49CiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IHJlbWFpbmluZyBELUFTQSB1bml0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6Mzg4CiAgICAvLyBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICs9IHVuaXRzCiAgICBieXRlY18zIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6Mzg5CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyArPSB1bml0cwogICAgZGlnIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzIgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICB1bmNvdmVyIDIKICAgICsKICAgIGl0b2IKICAgIGRpZyAyCiAgICBpbnRjXzIgLy8gMzIKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjM5MAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdF92YWx1ZSA9IHNlbGYudW5pdF92YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gInVuaXRfdmFsdWUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudW5pdF92YWx1ZSBleGlzdHMKICAgIGl0b2IKICAgIHVuY292ZXIgMgogICAgcHVzaGludCA0MAogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzkxCiAgICAvLyByZXR1cm4gc2VsZi50b3RhbF91bml0cyAtIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICBzd2FwCiAgICAtCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozNTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUA1OgogICAgaW50Y18wIC8vIDAKICAgIGIgcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9tZXJnZUA2CgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb21tb24uQ29yZUZpbmFuY2lhbENvbW1vbk1peGluLmdldF9hc3NldF9pbmZvW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2Fzc2V0X2luZm86CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MDMKICAgIC8vIHBlcmZvcm1hbmNlID0gVUludDY0KGNzdC5QUkZfUEVSRk9STUFOVCkKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MDQKICAgIC8vIGlmIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID4gc2VsZi5tYXR1cml0eV9kYXRlID4gMDoKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJtYXR1cml0eV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgY292ZXIgMwogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgID4KICAgIGJ6IGdldF9hc3NldF9pbmZvX2FmdGVyX2lmX2Vsc2VANAogICAgZHVwCiAgICBieiBnZXRfYXNzZXRfaW5mb19hZnRlcl9pZl9lbHNlQDQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQwNQogICAgLy8gcGVyZm9ybWFuY2UgPSBVSW50NjQoY3N0LlBSRl9NQVRVUkVEKQogICAgcHVzaGludCA0CiAgICBidXJ5IDIKCmdldF9hc3NldF9pbmZvX2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQwNi00MDcKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgbm8gZ3JhY2Ugb3IgZGVsaW5xdWVuY3kgcGVyaW9kcwogICAgLy8gaWYgc2VsZi5hc3NldF9kZWZhdWx0ZWQ6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjEgLy8gImFzc2V0X2RlZmF1bHRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9kZWZhdWx0ZWQgZXhpc3RzCiAgICBieiBnZXRfYXNzZXRfaW5mb19hZnRlcl9pZl9lbHNlQDYKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQwOAogICAgLy8gcGVyZm9ybWFuY2UgPSBVSW50NjQoY3N0LlBSRl9ERUZBVUxURUQpCiAgICBwdXNoaW50IDMKICAgIGJ1cnkgMgoKZ2V0X2Fzc2V0X2luZm9fYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDExCiAgICAvLyBkZW5vbWluYXRpb25fYXNzZXRfaWQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQuaWQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjIgLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MTIKICAgIC8vIHNldHRsZW1lbnRfYXNzZXRfaWQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLmlkLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NDUKICAgIC8vIHJldHVybiBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICogc2VsZi51bml0X3ZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAidW5pdF92YWx1ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi51bml0X3ZhbHVlIGV4aXN0cwogICAgZHVwMgogICAgKgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDE1CiAgICAvLyBkYXlfY291bnRfY29udmVudGlvbj1hcmM0LlVJbnQ4KHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24pLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kYXlfY291bnRfY29udmVudGlvbiBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzMgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQxNgogICAgLy8gcHJpbmNpcGFsX2Rpc2NvdW50PWFyYzQuVUludDE2KHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50KSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNSAvLyAicHJpbmNpcGFsX2Rpc2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW5jaXBhbF9kaXNjb3VudCBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBwdXNoaW50IDE2CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBleHRyYWN0IDYgMgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDE3CiAgICAvLyBpbnRlcmVzdF9yYXRlPWFyYzQuVUludDE2KHNlbGYuaW50ZXJlc3RfcmF0ZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjYgLy8gImludGVyZXN0X3JhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBwdXNoaW50IDE2CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBleHRyYWN0IDYgMgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDE4CiAgICAvLyB0b3RhbF9zdXBwbHk9c2VsZi50b3RhbF91bml0cywKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MjAKICAgIC8vIHByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZT1zZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDIxCiAgICAvLyBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGU9c2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjQgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MjIKICAgIC8vIGlzc3VhbmNlX2RhdGU9c2VsZi5pc3N1YW5jZV9kYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDggLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQyMwogICAgLy8gbWF0dXJpdHlfZGF0ZT1zZWxmLm1hdHVyaXR5X2RhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDI0CiAgICAvLyBzdXNwZW5kZWQ9c2VsZi5hc3NldF9zdXNwZW5kZWQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjAgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9zdXNwZW5kZWQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MjUKICAgIC8vIHBlcmZvcm1hbmNlPWFyYzQuVUludDgocGVyZm9ybWFuY2UpLAogICAgZGlnIDE1CiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgaW50Y18zIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MTAtNDI2CiAgICAvLyByZXR1cm4gdHlwLkFzc2V0SW5mbygKICAgIC8vICAgICBkZW5vbWluYXRpb25fYXNzZXRfaWQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQuaWQsCiAgICAvLyAgICAgc2V0dGxlbWVudF9hc3NldF9pZD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuaWQsCiAgICAvLyAgICAgb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsKCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1zZWxmLnVuaXRfdmFsdWUsCiAgICAvLyAgICAgZGF5X2NvdW50X2NvbnZlbnRpb249YXJjNC5VSW50OChzZWxmLmRheV9jb3VudF9jb252ZW50aW9uKSwKICAgIC8vICAgICBwcmluY2lwYWxfZGlzY291bnQ9YXJjNC5VSW50MTYoc2VsZi5wcmluY2lwYWxfZGlzY291bnQpLAogICAgLy8gICAgIGludGVyZXN0X3JhdGU9YXJjNC5VSW50MTYoc2VsZi5pbnRlcmVzdF9yYXRlKSwKICAgIC8vICAgICB0b3RhbF9zdXBwbHk9c2VsZi50b3RhbF91bml0cywKICAgIC8vICAgICBjaXJjdWxhdGluZ19zdXBwbHk9c2VsZi5jaXJjdWxhdGluZ191bml0cywKICAgIC8vICAgICBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGU9c2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUsCiAgICAvLyAgICAgcHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlPXNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlLAogICAgLy8gICAgIGlzc3VhbmNlX2RhdGU9c2VsZi5pc3N1YW5jZV9kYXRlLAogICAgLy8gICAgIG1hdHVyaXR5X2RhdGU9c2VsZi5tYXR1cml0eV9kYXRlLAogICAgLy8gICAgIHN1c3BlbmRlZD1zZWxmLmFzc2V0X3N1c3BlbmRlZCwKICAgIC8vICAgICBwZXJmb3JtYW5jZT1hcmM0LlVJbnQ4KHBlcmZvcm1hbmNlKSwKICAgIC8vICkKICAgIHVuY292ZXIgMTQKICAgIGl0b2IKICAgIHVuY292ZXIgMTQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDExCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTAKICAgIGNvbmNhdAogICAgdW5jb3ZlciA5CiAgICBjb25jYXQKICAgIHVuY292ZXIgOAogICAgY29uY2F0CiAgICB1bmNvdmVyIDcKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgY29uY2F0CiAgICBieXRlYyAyOCAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciA0CiAgICBzZXRiaXQKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozOTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY29tbW9uLkNvcmVGaW5hbmNpYWxDb21tb25NaXhpbi5nZXRfdGltZV9ldmVudHNbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfdGltZV9ldmVudHM6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MzYKICAgIC8vIHRpbWVfZXZlbnRzID0gdHlwLlRpbWVFdmVudHMoKQogICAgYnl0ZWMgMzAgLy8gMHgwMDAwCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBlbm0uU1RBVFVTX0FDVElWRQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDEwMAogICAgPT0KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQzNwogICAgLy8gaWYgc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCk6CiAgICBieiBnZXRfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MzgKICAgIC8vIHRpbWVfZXZlbnRzID0gc2VsZi50aW1lX2V2ZW50cy52YWx1ZS5jb3B5KCkKICAgIGJ5dGVjIDI3IC8vIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGJ1cnkgMgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudGltZV9ldmVudHMgZXhpc3RzCgpnZXRfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDI4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgZGlnIDEKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb21tb24uQ29yZUZpbmFuY2lhbENvbW1vbk1peGluLmdldF9zZWNvbmRhcnlfbWFya2V0X3NjaGVkdWxlW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGU6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0NTAKICAgIC8vIChzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlLCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQ0OS00NTEKICAgIC8vIHJldHVybiB0eXAuVGltZUV2ZW50cygKICAgIC8vICAgICAoc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSwgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSkKICAgIC8vICkKICAgIHN3YXAKICAgIGl0b2IKICAgIHB1c2hieXRlcyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0NDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY29tbW9uLkNvcmVGaW5hbmNpYWxDb21tb25NaXhpbi5nZXRfYXNzZXRfbWV0YWRhdGFbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXNzZXRfbWV0YWRhdGE6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0NjIKICAgIC8vIHJldHVybiB0eXAuQXNzZXRNZXRhZGF0YS5mcm9tX2J5dGVzKHNlbGYubWV0YWRhdGEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjMgLy8gIm1ldGFkYXRhIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1ldGFkYXRhIGV4aXN0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDUzCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5hY2NvdW50X2dvdl9zdXNwZW5zaW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF9nb3Zfc3VzcGVuc2lvbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzcKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDEwIC8vIDB4NTIzNzMwMjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozMQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTE0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGR1cAogICAgcHVzaGludCA1NgogICAgaW50Y18xIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIHB1c2hpbnQgNTYKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTE1CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF9vcGVuW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF9vcGVuOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjY4CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hY2NvdW50X21hbmFnZXIsIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAxMSAvLyAweDUyMzQzMDIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjgKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBlbm0uU1RBVFVTX0VOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGludGMgNCAvLyAyMDAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTM5CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuc3RhdHVzX2lzX2VuZGVkKCksIGVyci5VTkFVVEhPUklaRUQKICAgICEKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE0MAogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTQxCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNDIKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNDYKICAgIC8vIHVuaXRzPVVJbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTQ0LTE1MAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSB0eXAuQWNjb3VudEluZm8oCiAgICAvLyAgICAgcGF5bWVudF9hZGRyZXNzPXBheW1lbnRfYWRkcmVzcywKICAgIC8vICAgICB1bml0cz1VSW50NjQoMCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1VSW50NjQoMCksCiAgICAvLyAgICAgcGFpZF9jb3Vwb25zPVVJbnQ2NCgwKSwKICAgIC8vICAgICBzdXNwZW5kZWQ9RmFsc2UsCiAgICAvLyApCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgMjggLy8gMHgwMAogICAgY29uY2F0CiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTUxCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfY2xvc2Vbcm91dGluZ10oKSAtPiB2b2lkOgphY2NvdW50X2Nsb3NlOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2OAogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMTEgLy8gMHg1MjM0MzAyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE3MQogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNzQKICAgIC8vIGNsb3NlZF91bml0cyA9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzCiAgICBkdXAKICAgIGJveF9nZXQKICAgIHBvcAogICAgaW50Y18yIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE3NQogICAgLy8gZGVsIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdCiAgICBzd2FwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNzYKICAgIC8vIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgLT0gY2xvc2VkX3VuaXRzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBkaWcgMQogICAgLQogICAgYnl0ZWNfMyAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE3NwogICAgLy8gc2VsZi5lbmRfaWZfbm9fY2lyY3VsYXRpbmdfdW5pdHMoKQogICAgY2FsbHN1YiBlbmRfaWZfbm9fY2lyY3VsYXRpbmdfdW5pdHMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNzgKICAgIC8vIHJldHVybiBjbG9zZWRfdW5pdHMsIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTUzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHN3YXAKICAgIGl0b2IKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzczoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMDAKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcywgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgZGlnIDIKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMDEKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIwMgogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIwNAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzID0gcGF5bWVudF9hZGRyZXNzCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIwNQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5hY2NvdW50X2dldF9pbmZvW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF9nZXRfaW5mbzoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMjIKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjA3CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3JvdGF0ZV9hcnJhbmdlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfcm90YXRlX2FycmFuZ2VyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTgKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTkKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSBuZXdfYXJyYW5nZXIKICAgIGJ5dGVjIDUgLy8gMHg1MjMyMzAyMwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNjAKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19zZXRfb3BfZGFlbW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19zZXRfb3BfZGFlbW9uOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzMKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzQKICAgIC8vIHNlbGYub3BfZGFlbW9uLnZhbHVlID0gYWRkcmVzcwogICAgYnl0ZWMgMTkgLy8gMHg1MjMyMzUyMwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzUKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19hc3NpZ25fcm9sZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfYXNzaWduX3JvbGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTc3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxOTkKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDAKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwMQogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDEKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKToKICAgIHB1c2hpbnQgMjAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwMgogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgNSAvLyAweDUyMzIzMDIzCiAgICBkaWcgMwogICAgYXBwX2dsb2JhbF9wdXQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fdXBzZXJ0X3JvbGVAMTQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAzCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA1CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDQwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDYKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDExIC8vIDB4NTIzNDMwMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwNwogICAgLy8gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDIKICAgIC8vIHNlbGYuX3Vwc2VydF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgY29uZmlnKQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3Vwc2VydF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDkKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKToKICAgIGR1cAogICAgcHVzaGludCA1MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTEwCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDE4IC8vIDB4NTIzNTMwMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMQogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcyhjb25maWcpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwMgogICAgLy8gc2VsZi5fdXBzZXJ0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCBjb25maWcpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fdXBzZXJ0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMwogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNjAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNAogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDE3IC8vIDB4NTIzNjMwMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNQogICAgLy8gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZykKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAyCiAgICAvLyBzZWxmLl91cHNlcnRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIGNvbmZpZykKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl91cHNlcnRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE3CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE4CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAxMCAvLyAweDUyMzczMDIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTkKICAgIC8vIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZykKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAyCiAgICAvLyBzZWxmLl91cHNlcnRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIGNvbmZpZykKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl91cHNlcnRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMQogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKToKICAgIGR1cAogICAgcHVzaGludCA4MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fdXBzZXJ0X3JvbGVAMTQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjIKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuaW50ZXJlc3Rfb3JhY2xlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI1IC8vIDB4NTIzODMwMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMwogICAgLy8gc2VsZi5pbnRlcmVzdF9vcmFjbGVbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl91cHNlcnRfcm9sZUAxNAoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfcmV2b2tlX3JvbGVbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3Jldm9rZV9yb2xlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNAogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNQogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI2CiAgICAvLyBzZWxmLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpKQogICAgYnRvaQogICAgZHVwbiAyCiAgICBjYWxsc3ViIF9hc3NlcnRfdmFsaWRfcm9sZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyNgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgIT0gVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwgZXJyLklOVkFMSURfUk9MRQogICAgZHVwCiAgICBwdXNoaW50IDIwCiAgICAhPQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI3CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI4CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDExIC8vIDB4NTIzNDMwMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyOQogICAgLy8gZGVsIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjgKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzEKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKToKICAgIGR1cAogICAgcHVzaGludCA1MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMyCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMTggLy8gMHg1MjM1MzAyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMzCiAgICAvLyBkZWwgc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjcKICAgIC8vIHNlbGYuX2RlbGV0ZV9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcykKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM1CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKToKICAgIGR1cAogICAgcHVzaGludCA2MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM2CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAxNyAvLyAweDUyMzYzMDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzcKICAgIC8vIGRlbCBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI3CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzOQogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKToKICAgIGR1cAogICAgcHVzaGludCA3MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQwCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDEwIC8vIDB4NTIzNzMwMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MQogICAgLy8gZGVsIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNwogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDMKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSk6CiAgICBkdXAKICAgIHB1c2hpbnQgODAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ0CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuaW50ZXJlc3Rfb3JhY2xlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI1IC8vIDB4NTIzODMwMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NQogICAgLy8gZGVsIHNlbGYuaW50ZXJlc3Rfb3JhY2xlW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nb3ZfYXNzZXRfc3VzcGVuc2lvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ292X2Fzc2V0X3N1c3BlbnNpb246CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QgICMgVE9ETzogVXBkYXRlIHNwZWNzIGFuZCBhZGQgdGVzdAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo3NwogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYXV0aG9yaXR5LCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMTAgLy8gMHg1MjM3MzAyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0NgogICAgLy8gc2VsZi5hc3NldF9zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGJ5dGVjIDIwIC8vICJhc3NldF9zdXNwZW5kZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0NwogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QgICMgVE9ETzogVXBkYXRlIHNwZWNzIGFuZCBhZGQgdGVzdAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X2FycmFuZ2VyW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU3CiAgICAvLyByZXR1cm4gc2VsZi5hcnJhbmdlci52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gMHg1MjMyMzAyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYWRkcmVzc19yb2xlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3MwogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hY2NvdW50X21hbmFnZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMTEgLy8gMHg1MjM0MzAyMwogICAgZGlnIDEKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjc0CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnByaW1hcnlfZGVhbGVyLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDE4IC8vIDB4NTIzNTMwMjMKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3NQogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi50cnVzdGVlLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDE3IC8vIDB4NTIzNjMwMjMKICAgIGRpZyAzCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3NgogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIGFkZHJlc3MpLAogICAgYnl0ZWMgMTAgLy8gMHg1MjM3MzAyMwogICAgZGlnIDQKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjc3CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmludGVyZXN0X29yYWNsZSwgYWRkcmVzcyksCiAgICBieXRlYyAyNSAvLyAweDUyMzgzMDIzCiAgICB1bmNvdmVyIDUKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjIDI4IC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDYKICAgIHNldGJpdAogICAgaW50Y18xIC8vIDEKICAgIHVuY292ZXIgNQogICAgc2V0Yml0CiAgICBwdXNoaW50IDIKICAgIHVuY292ZXIgNAogICAgc2V0Yml0CiAgICBwdXNoaW50IDMKICAgIHVuY292ZXIgMwogICAgc2V0Yml0CiAgICBwdXNoaW50IDQKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV9jb25maWdbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9yb2xlX2NvbmZpZzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTQKICAgIC8vIHJvbGUgPSByb2xlX2lkLmFzX3VpbnQ2NCgpCiAgICBidG9pCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjk1CiAgICAvLyBzZWxmLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlKQogICAgZHVwCiAgICBjYWxsc3ViIF9hc3NlcnRfdmFsaWRfcm9sZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5NwogICAgLy8gY2FzZSBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpOgogICAgcHVzaGludHMgMjAgNDAgNTAgNjAgNzAgODAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTYtMzI3CiAgICAvLyBtYXRjaCByb2xlOgogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKToKICAgIC8vICAgICAgICAgcmV0dXJuIHR5cC5Sb2xlQ29uZmlnKAogICAgLy8gICAgICAgICAgICAgcm9sZV92YWxpZGl0eV9zdGFydD1VSW50NjQoMCksIHJvbGVfdmFsaWRpdHlfZW5kPVVJbnQ2NCgwKQogICAgLy8gICAgICAgICApCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5hdXRob3JpdHksIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLmludGVyZXN0X29yYWNsZSwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5pbnRlcmVzdF9vcmFjbGVbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgXzoKICAgIC8vICAgICAgICAgb3AuZXJyKGVyci5JTlZBTElEX1JPTEUpCiAgICB1bmNvdmVyIDYKICAgIG1hdGNoIHJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzBAMiByYmFjX2dldF9yb2xlX2NvbmZpZ19zd2l0Y2hfY2FzZV8xQDMgcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfMkA0IHJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzNANSByYmFjX2dldF9yb2xlX2NvbmZpZ19zd2l0Y2hfY2FzZV80QDYgcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfNUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI3CiAgICAvLyBvcC5lcnIoZXJyLklOVkFMSURfUk9MRSkKICAgIGVyciAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgoKcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfNUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMwogICAgLy8gc2VsZi5pbnRlcmVzdF9vcmFjbGUsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMjUgLy8gMHg1MjM4MzAyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMi0zMjQKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLmludGVyZXN0X29yYWNsZSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI1CiAgICAvLyByZXR1cm4gc2VsZi5pbnRlcmVzdF9vcmFjbGVbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCgpyYmFjX2dldF9yb2xlX2NvbmZpZ19hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfY29uZmlnQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzRANjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTgKICAgIC8vIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDEwIC8vIDB4NTIzNzMwMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5hdXRob3JpdHksIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMAogICAgLy8gcmV0dXJuIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfY29uZmlnX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV9jb25maWdAOQoKcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfM0A1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxMwogICAgLy8gc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDE3IC8vIDB4NTIzNjMwMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTItMzE0CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTUKICAgIC8vIHJldHVybiBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV9jb25maWdfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX2NvbmZpZ0A5CgpyYmFjX2dldF9yb2xlX2NvbmZpZ19zd2l0Y2hfY2FzZV8yQDQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA4CiAgICAvLyBzZWxmLnByaW1hcnlfZGVhbGVyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDE4IC8vIDB4NTIzNTMwMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDctMzA5CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEwCiAgICAvLyByZXR1cm4gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX2NvbmZpZ19hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfY29uZmlnQDkKCnJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzFAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDMKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDExIC8vIDB4NTIzNDMwMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDItMzA0CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwNQogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfY29uZmlnX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV9jb25maWdAOQoKcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfMEAyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5OC0zMDAKICAgIC8vIHJldHVybiB0eXAuUm9sZUNvbmZpZygKICAgIC8vICAgICByb2xlX3ZhbGlkaXR5X3N0YXJ0PVVJbnQ2NCgwKSwgcm9sZV92YWxpZGl0eV9lbmQ9VUludDY0KDApCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfY29uZmlnX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV9jb25maWdAOQoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwubm9fY291cG9uLk5vQ291cG9uQ2FzaGZsb3dNaXhpbi5kYXlfY291bnRfZmFjdG9yKCkgLT4gYnl0ZXM6CmRheV9jb3VudF9mYWN0b3I6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weToxNwogICAgLy8gZGVmIGRheV9jb3VudF9mYWN0b3Ioc2VsZikgLT4gdHlwLkRheUNvdW50RmFjdG9yOgogICAgcHJvdG8gMCAxCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weToxOC0xOQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIG9ubHkgdGhlIEFjdHVhbC9BY3R1YWwgYW5kIENvbnRpbnVvdXMgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhY2NydWVkX3BlcmlvZCA9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIC0gc2VsZi5pc3N1YW5jZV9kYXRlCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOCAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pc3N1YW5jZV9kYXRlIGV4aXN0cwogICAgc3dhcAogICAgZGlnIDEKICAgIC0KICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvbm9fY291cG9uLnB5OjIwCiAgICAvLyBwcmluY2lwYWxfcGVyaW9kID0gc2VsZi5tYXR1cml0eV9kYXRlIC0gc2VsZi5pc3N1YW5jZV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgc3dhcAogICAgLQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9ub19jb3Vwb24ucHk6MjEKICAgIC8vIGlmIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPT0gVUludDY0KGNzdC5EQ0NfQV9BKToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNCAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gZXhpc3RzCiAgICBibnogZGF5X2NvdW50X2ZhY3Rvcl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE2MgogICAgLy8gcmV0dXJuIHRpbWVfcGVyaW9kIC8vIFVJbnQ2NChjc3QuREFZXzJfU0VDKQogICAgZnJhbWVfZGlnIDAKICAgIGludGMgNSAvLyA4NjQwMAogICAgLwogICAgZnJhbWVfYnVyeSAwCiAgICBpbnRjIDUgLy8gODY0MDAKICAgIC8KCmRheV9jb3VudF9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9ub19jb3Vwb24ucHk6MjQtMjcKICAgIC8vIHJldHVybiB0eXAuRGF5Q291bnRGYWN0b3IoCiAgICAvLyAgICAgbnVtZXJhdG9yPWFjY3J1ZWRfcGVyaW9kLAogICAgLy8gICAgIGRlbm9taW5hdG9yPXByaW5jaXBhbF9wZXJpb2QsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMAogICAgaXRvYgogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmNvcmVfZmluYW5jaWFsLm5vX2NvdXBvbi5Ob0NvdXBvbkNhc2hmbG93TWl4aW4uYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQoaG9sZGluZ19hZGRyZXNzOiBieXRlcywgdW5pdHM6IHVpbnQ2NCkgLT4gdWludDY0OgphY2NydWVkX2ludGVyZXN0X2Ftb3VudDoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvbm9fY291cG9uLnB5OjMzLTM1CiAgICAvLyBkZWYgYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQoCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50LCB1bml0czogVUludDY0CiAgICAvLyApIC0+IFVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9ub19jb3Vwb24ucHk6MzYKICAgIC8vIGRheV9jb3VudF9mYWN0b3IgPSBzZWxmLmRheV9jb3VudF9mYWN0b3IoKQogICAgY2FsbHN1YiBkYXlfY291bnRfZmFjdG9yCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weTozNwogICAgLy8gYWNjcnVlZF9wZXJpb2QgPSBkYXlfY291bnRfZmFjdG9yLm51bWVyYXRvcgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvbm9fY291cG9uLnB5OjM4CiAgICAvLyBwcmluY2lwYWxfcGVyaW9kID0gZGF5X2NvdW50X2ZhY3Rvci5kZW5vbWluYXRvcgogICAgc3dhcAogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weTo0MAogICAgLy8gc2VsZi5hY2NvdW50X3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcywgdW5pdHMpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBhY2NvdW50X3VuaXRzX3ZhbHVlCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weTo0MQogICAgLy8gKiBzZWxmLnByaW5jaXBhbF9kaXNjb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJwcmluY2lwYWxfZGlzY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9ub19jb3Vwb24ucHk6NDAtNDEKICAgIC8vIHNlbGYuYWNjb3VudF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MsIHVuaXRzKQogICAgLy8gKiBzZWxmLnByaW5jaXBhbF9kaXNjb3VudAogICAgKgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9ub19jb3Vwb24ucHk6NDAtNDIKICAgIC8vIHNlbGYuYWNjb3VudF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MsIHVuaXRzKQogICAgLy8gKiBzZWxmLnByaW5jaXBhbF9kaXNjb3VudAogICAgLy8gKiBhY2NydWVkX3BlcmlvZAogICAgdW5jb3ZlciAyCiAgICAqCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weTo0MwogICAgLy8gLy8gKGNzdC5CUFMgKiBwcmluY2lwYWxfcGVyaW9kKQogICAgcHVzaGludCAxMDAwMAogICAgdW5jb3ZlciAyCiAgICAqCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weTo0MC00MwogICAgLy8gc2VsZi5hY2NvdW50X3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcywgdW5pdHMpCiAgICAvLyAqIHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50CiAgICAvLyAqIGFjY3J1ZWRfcGVyaW9kCiAgICAvLyAvLyAoY3N0LkJQUyAqIHByaW5jaXBhbF9wZXJpb2QpCiAgICAvCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weTozOS00NAogICAgLy8gcmV0dXJuICgKICAgIC8vICAgICBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIC8vICAgICAqIHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50CiAgICAvLyAgICAgKiBhY2NydWVkX3BlcmlvZAogICAgLy8gICAgIC8vIChjc3QuQlBTICogcHJpbmNpcGFsX3BlcmlvZCkKICAgIC8vICkgICMgZGl2LWJ5LXplcm86IHByaW5jaXBhbF9wZXJpb2QgIT0gMCBkdWUgdG8gYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZCBjaGVja3MKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY29tbW9uLkNvcmVGaW5hbmNpYWxDb21tb25NaXhpbi5hc3NlcnRfdGltZV9ldmVudHNfc29ydGVkKHRpbWVfZXZlbnRzOiBieXRlcykgLT4gYnl0ZXM6CmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQ6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMDcKICAgIC8vIGRlZiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkKHNlbGYsIHRpbWVfZXZlbnRzOiB0eXAuVGltZUV2ZW50cykgLT4gTm9uZToKICAgIHByb3RvIDEgMQogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDIKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjEwOQogICAgLy8gdGltZV9ldmVudHNbY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX09QRU5JTkdfREFURV9JRFhdCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjExMAogICAgLy8gPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTA5LTExMAogICAgLy8gdGltZV9ldmVudHNbY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX09QRU5JTkdfREFURV9JRFhdCiAgICAvLyA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA+CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMDgtMTExCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHRpbWVfZXZlbnRzW2NmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9PUEVOSU5HX0RBVEVfSURYXQogICAgLy8gICAgID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICksIGVyci5JTlZBTElEX1RJTUUKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBtdXN0IGJlIHNldCBpbiB0aGUgZnV0dXJlCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMTIKICAgIC8vIGZvciBpZHggaW4gdXJhbmdlKHRpbWVfZXZlbnRzLmxlbmd0aCAtIDEpOgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGludGNfMCAvLyAwCgphc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2Zvcl9oZWFkZXJAMToKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjExMgogICAgLy8gZm9yIGlkeCBpbiB1cmFuZ2UodGltZV9ldmVudHMubGVuZ3RoIC0gMSk6CiAgICBmcmFtZV9kaWcgNQogICAgZnJhbWVfZGlnIDQKICAgIDwKICAgIGJ6IGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfYWZ0ZXJfZm9yQDYKCmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfd2hpbGVfdG9wQDg6CiAgICBwdXNoaW50IDc1CiAgICBnbG9iYWwgT3Bjb2RlQnVkZ2V0CiAgICA+CiAgICBieiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2FmdGVyX3doaWxlQDEzCiAgICBpdHhuX2JlZ2luCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgYnl0ZWMgMzEgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtCiAgICBieXRlYyAzMSAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbQogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBiIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfd2hpbGVfdG9wQDgKCmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfYWZ0ZXJfd2hpbGVAMTM6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMTcKICAgIC8vIHRpbWVfaSA9IHRpbWVfZXZlbnRzW2lkeF0KICAgIGZyYW1lX2RpZyA1CiAgICBkdXAKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBjb3ZlciAzCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAzCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjExOAogICAgLy8gdGltZV9mID0gdGltZV9ldmVudHNbaWR4ICsgMV0KICAgIGludGNfMSAvLyAxCiAgICArCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTE5CiAgICAvLyBhc3NlcnQgdGltZV9mID4gdGltZV9pLCBlcnIuSU5WQUxJRF9TT1JUSU5HCiAgICA8CiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbXVzdCBiZSBzb3J0ZWQgaW4gc3RyaWN0bHkgYXNjZW5kaW5nIG9yZGVyCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMjAKICAgIC8vIGlmIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gIT0gVUludDY0KGNzdC5EQ0NfQ09OVCk6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTQgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uIGV4aXN0cwogICAgcHVzaGludCAyNTUKICAgICE9CiAgICBieiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2FmdGVyX2lmX2Vsc2VANAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTIxLTEyMgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHJlcXVpcmVzIHRpbWUgcGVyaW9kcyBleHByZXNzZWQgaW4gZGF5cyBmb3IgcmVndWxhciBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGFzc2VydCAodGltZV9mIC0gdGltZV9pKSAlIFVJbnQ2NCgKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgMQogICAgLQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTIxLTEyNAogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHJlcXVpcmVzIHRpbWUgcGVyaW9kcyBleHByZXNzZWQgaW4gZGF5cyBmb3IgcmVndWxhciBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGFzc2VydCAodGltZV9mIC0gdGltZV9pKSAlIFVJbnQ2NCgKICAgIC8vICAgICBjc3QuREFZXzJfU0VDCiAgICAvLyApID09IDAsIGVyci5JTlZBTElEX1RJTUVfUEVSSU9ECiAgICBpbnRjIDUgLy8gODY0MDAKICAgICUKICAgICEKICAgIGFzc2VydCAvLyBUaW1lIHBlcmlvZHMgaW4gQWN0dWFsL0FjdHVhbCBkYXkgY291bnQgY29udmVudGlvbiBtdXN0IGJlIG11bHRpcGxlcyBvZiBhIGRheSAoaW4gc2Vjb25kcykKCmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfYWZ0ZXJfaWZfZWxzZUA0OgogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2J1cnkgNQogICAgYiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2Zvcl9oZWFkZXJAMQoKYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9hZnRlcl9mb3JANjoKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IHZvaWQ6CmFzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQ6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzMKICAgIC8vIGRlZiBhc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHNlbGYsIGhvbGRpbmdfYWRkcmVzczogQWNjb3VudCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjM0CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZCwgZXJyLlNVU1BFTkRFRAogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHB1c2hpbnQgNDQ4CiAgICBnZXRiaXQKICAgICEKICAgIGFzc2VydCAvLyBTdXNwZW5kZWQgb3BlcmF0aW9ucwogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCB1bml0czogdWludDY0KSAtPiB1aW50NjQ6CmFjY291bnRfdW5pdHNfdmFsdWU6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzYKICAgIC8vIGRlZiBhY2NvdW50X3VuaXRzX3ZhbHVlKHNlbGYsIGhvbGRpbmdfYWRkcmVzczogQWNjb3VudCwgdW5pdHM6IFVJbnQ2NCkgLT4gVUludDY0OgogICAgcHJvdG8gMiAxCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzcKICAgIC8vIHJldHVybiB1bml0cyAqIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRfdmFsdWUKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfZGlnIC0xCiAgICAqCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5hY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NDoKYWNjb3VudF90b3RhbF91bml0c192YWx1ZToKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozOQogICAgLy8gZGVmIGFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUoc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50KSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo0MQogICAgLy8gaG9sZGluZ19hZGRyZXNzLCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMiAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo0MC00MgogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudF91bml0c192YWx1ZSgKICAgIC8vICAgICBob2xkaW5nX2FkZHJlc3MsIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGNhbGxzdWIgYWNjb3VudF91bml0c192YWx1ZQogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuZW5kX2lmX25vX2NpcmN1bGF0aW5nX3VuaXRzKCkgLT4gdm9pZDoKZW5kX2lmX25vX2NpcmN1bGF0aW5nX3VuaXRzOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjQ4CiAgICAvLyBpZiBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzID09IFVJbnQ2NCgwKToKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGJueiBlbmRfaWZfbm9fY2lyY3VsYXRpbmdfdW5pdHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NDkKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGVubS5TVEFUVVNfRU5ERUQpCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBpbnRjIDQgLy8gMjAwCiAgICBhcHBfZ2xvYmFsX3B1dAoKZW5kX2lmX25vX2NpcmN1bGF0aW5nX3VuaXRzX2FmdGVyX2lmX2Vsc2VAMjoKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9yb2xlX2lzX2FjdGl2ZShyb2xlX21hcDogYnl0ZXMsIHJvbGVfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NDoKX3JvbGVfaXNfYWN0aXZlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU3CiAgICAvLyBkZWYgX3JvbGVfaXNfYWN0aXZlKHNlbGYsIHJvbGVfbWFwOiB0eXAuUmJhY1JvbGUsIHJvbGVfYWRkcmVzczogQWNjb3VudCkgLT4gYm9vbDoKICAgIHByb3RvIDIgMQogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5CiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5LTYwCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5LTYxCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjEKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAtNjEKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgPj0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX21lcmdlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpIC0+IHZvaWQ6CmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjUKICAgIC8vIGFzc2VydCBzZWxmLl9pc19hcnJhbmdlcihUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjUyCiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzID09IHNlbGYuYXJyYW5nZXIudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vIDB4NTIzMjMwMjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcnJhbmdlciBleGlzdHMKICAgID09CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjUKICAgIC8vIGFzc2VydCBzZWxmLl9pc19hcnJhbmdlcihUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpIC0+IHZvaWQ6CmFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjgzCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYXNzZXRfZGVmYXVsdGVkLCBlcnIuREVGQVVMVEVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjEgLy8gImFzc2V0X2RlZmF1bHRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9kZWZhdWx0ZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRGVmYXVsdGVkCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpIC0+IHZvaWQ6CmFzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg2CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYXNzZXRfc3VzcGVuZGVkLCBlcnIuU1VTUEVOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjAgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9zdXNwZW5kZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gU3VzcGVuZGVkIG9wZXJhdGlvbnMKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkOiB1aW50NjQpIC0+IHZvaWQ6Cl9hc3NlcnRfdmFsaWRfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OAogICAgLy8gZGVmIF9hc3NlcnRfdmFsaWRfcm9sZShzZWxmLCByb2xlX2lkOiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MAogICAgLy8gVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIHB1c2hpbnQgMjAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgcHVzaGludCA0MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk2CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MgogICAgLy8gVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIHB1c2hpbnQgNTAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTMKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIHB1c2hpbnQgNjAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTQKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgcHVzaGludCA3MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk2CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NQogICAgLy8gVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICBwdXNoaW50IDgwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTYKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJ6IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX2ZhbHNlQDcKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANjoKICAgIGludGNfMSAvLyAxCgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9tZXJnZUA4OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk2CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgcmV0c3ViCgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9mYWxzZUA3OgogICAgaW50Y18wIC8vIDAKICAgIGIgX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfbWVyZ2VAOAo=", - "clear": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" - }, - "byteCode": { - "approval": "DCAGAAEgCMgBgKMFJiAEFR98dQRSMzAjBnN0YXR1cxFjaXJjdWxhdGluZ191bml0cw1tYXR1cml0eV9kYXRlBFIyMCMKdW5pdF92YWx1ZSFwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUNaXNzdWFuY2VfZGF0ZR1zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQRSNzAjBFI0MCMLdG90YWxfdW5pdHMTc2V0dGxlbWVudF9hc3NldF9pZBRkYXlfY291bnRfY29udmVudGlvbhJwcmluY2lwYWxfZGlzY291bnQdc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUEUjYwIwRSNTAjBFIyNSMPYXNzZXRfc3VzcGVuZGVkD2Fzc2V0X2RlZmF1bHRlZBVkZW5vbWluYXRpb25fYXNzZXRfaWQIbWV0YWRhdGEhcHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlBFI4MCMNaW50ZXJlc3RfcmF0ZQp0aW1lRXZlbnRzAQANdG90YWxfY291cG9ucwIAAAMGgQExGEAAbScFMgNnJxMyA2cnFCJnJxUiZycMImcrImcnBiJnKiJnJxYiZycNImcnBiJnJw4iZycXgABnJw8iZycaImcnHSJnJwciZycYImcnCCJnJxAiZycJImcnBCJnMTWBAxJEMTSBEhJEMTcURDE2FESABCXbqVs2GgCOAQDOMRkURDEYQQC3ghkEiUdBNARENj1JBGfbTyAEnHa2owRP1qPMBB1vwlUEJemZfwRshePuBEAtukcE+tIXPgQI7+o1BOSlq1QE3AY7NQQU/BDvBEwRPtUEdKcpfwQQXBhOBIL3Gy0E7wT10wQDuDMpBD2+gL0E31ToLAQBDIKZBHQGrNIEw+SylzYaAI4ZABsBWwIlAlMDtwVNBcwF6waBB1AHageFB5AHyQgTCFAIggiaCLIIygmGChwKOwpGCpAAgAQ/DvxsNhoAjgEE6wAxGYEEEjEYEERCBQ02GgFJFSUSRBc2GgJJFSUSRBc2GgNJFSUSRBc2GgRJFSUSRBc2GgVJFSUSRBc2GgZJFSMSRDYaB0lOBxWBAhJENhoISSJZSU4IgQILgQIITBUSRDYaCUlOB0kiWUlOCCULgQIITBUSRDYaCkkiWUlOCIEQC4ECCEwVEkSIC9UiKmVEFERLBXELRQFEJxZLBmdLBE8GEkQnDUsFZ7EyADIKIrISshRPBbIRgQSyELIBs0sDSwIYFEQnBksCZ08DTwIKJwxMZycPTwJnF0lBAAhJgf8BEkEAZSNEJw5LAWdLBRdJFEQnGkxnSwRJFEQnHUsBZ4EECEsDEkRLA4gKXicbvEgnG0sBv0lXAgBLAYECWycHTGdLAYEKWycYTGdLAYESWycITGdMIlkjCSULWycETGdLARREKoFkZyNDIkL/mCKAAEcFNhoBSRUkEkQ2GgJJFSUSRBciJwdlREEAqDIHIicHZUQPQQCdI0QpSwJQSUUKvUUBRElBAIhLCL5EJFtLAQ9BAHwjREqICmVJRQgiJw9lREsBC4GQTgoJRQgiRQYiRQMiRQQiJwhlRDIHSUUHDkEASSInBGVESwUNQQA+I0EAFYgJQUsCSwKICWpFB0kiW0UEJVtFBDIHIicEZUQPQQAESwZFCEsCFksEFlBLCBZLBxZQTFAoTFCwI0MiQv+/IkL/gSJC/2A2GgFHAhUkEkQpTFC9RQFEIkkqZUSBZBJBAAdLAYgJ10UBIhZLARZQKExQsCNDNhoBRwIVJBJENhoCSSJZgQIISwEVEkRXAgBMIiplRIFkEkSICf+ICgQpSwFQSU4CSb1FAUS+SCRbRDIHIicEZUQPRIgJgyInE2VEMgMTQQAiMQAiJxNlRBJAABUxAEsEEkAADTEASwK+RFcAIBJBAO8jREsBvkRXACAiJw1lRHAARQFBANZLAb5EgcADU0AAyyNBAMEyCiInDWVETEsBcABESwJJTgIPREsDvkRXACCxMgBPArISTLIUTLIRgQSyELIBsyIrZURLAklOAr5EJFsJK0xnIhZMJEsCu4gI/DIIMgciJxZlRElxA0QiK2VEIicGZUQLTwQWgAMDADdQTwQWUEsFFkxLAVBPBBZQSwMVFlcGAk8EUEyAAgA7UE8DFlAnHlBPA1CABAACUFJQTFCABIwpkE5MULAyBxZQSwNJFRZXBgJMUEyAAgASUExQKExQsCNDIkUBQv9oIkL/MiJC/w4iRwKAAEk2GgFJFSQSRDYaAkkVJBJENhoDSRUlEkQXIiplRIFkEkEBFSInEGVEMgcOQQEKIicJZURBAAsyByInCWVEDEEA9yNEMQBLA0lOAhJEiAhsiAhxKUsBUElFCUm9RQFEKUsESU4CUElFCkm9RQFESwOIB81LAYgHyE8DTwITREsCSURPAr5ESSRbTwIPRFcoCEUJvkQkW0EAiksGvkSBKFtLBr5EgShbEkEAdEsGvkSBMFtLBr5EgTBbEkEAYiNESwZJvkSBKFtFBUsDSwJJTgKIBsRFB0sBvkQkW0oOREwJFksBJE8Cu75IJFtAABAiFksHSU4CgShLAruBMEy7SwVJvkQkW0sCSU4CCBZPAiRPArtLBAtLBQgWKExQsCNDIkL/m0sFSYEoSwq7Swe+RFcwCIEwTLtC/4YiQv8GNhoBSRUkEkQ2GgJJFUsBgSZZSYEoEkRLAkxLAlIiWYEqCBJEJwVPAmcnF0xnI0M2GgFJFUsBgSZZSYEoEkRLAkxLAlIiWYEqCBJEiAcnJxdMZyNDIjYaAUcCIllJJQuBAghPAhUSRIgHCyIqZUQhBBIURIgHCUlEIw1BAAZJiAX9RQEiJwhlREsBSVcCAEUEgQJbTEsBDkQnEExnIicEZURBABoiJwRlREsBIlkjCSULSwNMW0xLAQ9EJwlMZyInEGVEIicJZURMFkwWUChMULAjQzYaAUkVIxJEIlMnETEAiAZdRCcVTGcyBxYoTFCwI0OAADYaAUkVJBJENhoCSRUlEkQXIiplRIFkEkEAdSInB2VEMgdJRQUOQQBnIicYZURLAw1BAFwjRCcSMQCIBhBEKUsCUEm9RQFEiAZBiAZGSwFJRCIrZURLAQgiJwxlREsBD0QrSwFnSwK+RCRbTwIIFksCJE8CuyInBmVEFk8CgShPArsiJwxlREwJFihMULAjQyJC/6EiMgciJwRlTElOAk4DRA1BAAhJQQAEgQRFAiInFWVEQQAEgQNFAiInFmVEIicNZUQiK2VEIicGZURKCyInDmVEFkmTJQ5EVwcBIicPZUQWSZOBEA5EVwYCIicaZUQWSZOBEA5EVwYCIicMZUQiJwdlRCInGGVEIicIZUQiJwRlRCInFGVESw8WSZMlDkRXBwFPDhZPDhZQTwsWUE8LFlBPClBPCVBPCFBPBxZQTwcWUE8GFlBPBRZQTwQWUE8DFlAnHCJPBFRQTFAoTFCwI0MnHiIqZUSBZBJBAAcnG75MRQJEKEsBULAjQyInEGVEIicJZURMFoACAAJMUEwWUChMULAjQyInF2VEKExQsCNDNhoBSRUkEkQ2GgJJFSMSRCJTJwoxAIgEkUQpTwJQSb1FAURJgTgjuiJPA1SBOEy7MgcWKExQsCNDNhoBSRUkEkQ2GgJJFSQSRCcLMQCIBFpEIiplRCEEEhREiASLiASQKU8CUEm9RQEURCIWTwJLAVBLAVBMUCccUL8yBxYoTFCwI0M2GgFJFSQSRCcLMQCIBBhEiARSKUxQSb1FAURJvkgkW0y8SCIrZURLAQkrTGeIA+syB0wWTBZQKExQsCNDNhoBSRUkEkQ2GgJJFSQSRDEASwISRIgED4gEFClPAlBJvUUBRCJPArsyBxYoTFCwI0M2GgFJFSQSRClMUEm9RQFEvkgoTFCwI0M2GgFJFSQSRIgDyScFTGcyBxYoTFCwI0M2GgFJFSQSRIgDsScTTGcyBxYoTFCwI0M2GgFJFSMSRDYaAklOAhUkEkQ2GgNJIlmBAghLARUSRFcCAEyIA32IA4QXRwKIA46BFBJBAA4nBUsDZzIHFihMULAjQ0mBKBJBABEnC0sDUEm9RQEUREsCv0L/30mBMhJBABEnEksDUEm9RQEUREsCv0L/x0mBPBJBABEnEUsDUEm9RQEUREsCv0L/r0mBRhJBABEnCksDUEm9RQEUREsCv0L/l0mBUBJB/5AnGUsDUEm9RQEUREsCv0L/fzYaAUkVIxJENhoCSU4CFSQSRIgC04gC2hdHAogC5EmBFBNEgSgSQQAVJwtLAlBJvUUBRLxIMgcWKExQsCNDSYEyEkEADycSSwJQSb1FAUS8SEL/4UmBPBJBAA8nEUsCUEm9RQFEvEhC/8tJgUYSQQAPJwpLAlBJvUUBRLxIQv+1SYFQEkH/ricZSwJQSb1FAUS8SEL/nzYaAUkVIxJEIlMnCjEAiAINRCcUTGcyBxYoTFCwI0MiJwVlRChMULAjQzYaAUkVJBJEJwtLAYgB5ScSSwKIAd4nEUsDiAHXJwpLBIgB0CcZTwWIAcknHCJPBlQjTwVUgQJPBFSBA08DVIEETwJUKExQsCNDNhoBSRUjEkQ2GgJJTgIVJBJEF0mIAeGDBhQoMjxGUE8GjgYATwBAADEAIgATAAEAJxlLAVBJvUUBRL5IKExQsCNDJwpLAVBJvUUBRL5IQv/rJxFLAVBJvUUBRL5IQv/cJxJLAVBJvUUBRL5IQv/NJwtLAVBJvUUBRL5IQv++gBAAAAAAAAAAAAAAAAAAAAAAQv+pigABMgciJwhlRExLAQlMIicEZURMCSInDmVEQAAKiwAhBQqMACEFCosAFkwWUEyJigIBiP/KSSJbTCVbi/6L/4gApiInD2VEC08CC4GQTk8CCwqJigEBgABHAov/VwIAi/+BAlsyBw1Ei/8iWSMJIosFiwQMQQBcgUsyDA1BABmxgQayEIEFshknH7IeJx+yHzIAsgGzQv/fiwVJJQuLA0lOA0xbSU4DjAEjCEmMAiULW0mMAAxEIicOZUSB/wETQQAKiwCLAQkhBRgURIsCjAVC/5yL/4wAiYoBACmL/1C+RIHAA1MURImKAgEpi/5QvkSBKFuL/wuJigEBKYv/UL5EJFuL/0yI/9+JIitlREAABCohBGeJigIBgACL/ov/UEm9RQFBAB+LAb5EIlsyB0mMAA5BABCLAb5EJVuLAA9BAAQjjACJIkL/+TEAIicFZUQSRIkiJxVlRBREiSInFGVEFESJigEAi/+BFBJAACiL/4EoEkAAIIv/gTISQAAYi/+BPBJAABCL/4FGEkAACIv/gVASQQADI0SJIkL/+g==", - "clear": "DIEBQw==" - }, - "compilerInfo": { - "compiler": "puya", - "compilerVersion": { - "major": 5, - "minor": 7, - "patch": 1 - } - }, - "events": [ - { - "name": "Event", - "args": [ - { - "type": "uint64", - "name": "contract_id" - }, - { - "type": "uint8", - "name": "type" - }, - { - "type": "string", - "name": "type_name" - }, - { - "type": "uint64", - "name": "time" - }, - { - "type": "uint64", - "name": "payoff" - }, - { - "type": "uint64", - "name": "currency_id" - }, - { - "type": "byte[]", - "name": "currency_unit" - }, - { - "type": "uint64", - "name": "nominal_value" - }, - { - "type": "uint16", - "name": "nominal_rate_bps" - }, - { - "type": "uint64", - "name": "nominal_accrued" - } - ], - "desc": "ACTUS Event." - } - ], - "templateVariables": {} -} \ No newline at end of file diff --git a/smart_contracts/artifacts/zero_coupon_bond/ZeroCouponBond.clear.puya.map b/smart_contracts/artifacts/zero_coupon_bond/ZeroCouponBond.clear.puya.map deleted file mode 100644 index d580b5c4..00000000 --- a/smart_contracts/artifacts/zero_coupon_bond/ZeroCouponBond.clear.puya.map +++ /dev/null @@ -1,25 +0,0 @@ -{ - "version": 3, - "sources": [], - "mappings": ";;;", - "op_pc_offset": 0, - "pc_events": { - "1": { - "subroutine": "algopy.arc4.ARC4Contract.clear_state_program", - "params": {}, - "block": "main", - "stack_in": [], - "op": "pushint 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "3": { - "op": "return", - "stack_out": [] - } - } -} \ No newline at end of file diff --git a/smart_contracts/artifacts/zero_coupon_bond/ZeroCouponBond.clear.teal b/smart_contracts/artifacts/zero_coupon_bond/ZeroCouponBond.clear.teal deleted file mode 100644 index a87aa802..00000000 --- a/smart_contracts/artifacts/zero_coupon_bond/ZeroCouponBond.clear.teal +++ /dev/null @@ -1,7 +0,0 @@ -#pragma version 12 -#pragma typetrack false - -// algopy.arc4.ARC4Contract.clear_state_program() -> uint64: -main: - pushint 1 - return diff --git a/smart_contracts/artifacts/zero_coupon_bond/zero_coupon_bond_client.py b/smart_contracts/artifacts/zero_coupon_bond/zero_coupon_bond_client.py deleted file mode 100644 index 6f34fffe..00000000 --- a/smart_contracts/artifacts/zero_coupon_bond/zero_coupon_bond_client.py +++ /dev/null @@ -1,3675 +0,0 @@ -# flake8: noqa -# fmt: off -# mypy: ignore-errors -# This file was automatically generated by algokit-client-generator. -# DO NOT MODIFY IT BY HAND. -# requires: algokit-utils@^3.0.0 - -# common -import dataclasses -import typing -# core algosdk -import algosdk -from algosdk.transaction import OnComplete -from algosdk.atomic_transaction_composer import TransactionSigner -from algosdk.source_map import SourceMap -from algosdk.transaction import Transaction -from algosdk.v2client.models import SimulateTraceConfig -# utils -import algokit_utils -from algokit_utils import AlgorandClient as _AlgoKitAlgorandClient - -_APP_SPEC_JSON = r"""{"arcs": [22, 28], "bareActions": {"call": [], "create": []}, "methods": [{"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "desc": "Denomination asset identifier", "name": "denomination_asset_id"}, {"type": "uint64", "desc": "Settlement asset identifier", "name": "settlement_asset_id"}, {"type": "uint64", "desc": "Principal, expressed in denomination asset", "name": "principal"}, {"type": "uint64", "desc": "Principal discount in bps", "name": "principal_discount"}, {"type": "uint64", "desc": "Minimum denomination, expressed in denomination asset", "name": "minimum_denomination"}, {"type": "uint8", "desc": "Day-count convention for interests calculation", "name": "day_count_convention"}, {"type": "uint16", "desc": "Interest rate in bps", "name": "interest_rate"}, {"type": "uint16[]", "desc": "Coupon interest rates in bps", "name": "coupon_rates"}, {"type": "uint64[]", "desc": "Time events (strictly ascending order)", "name": "time_events"}, {"type": "(uint64,uint64)[]", "desc": "Time periods of recurring time events", "name": "time_periods"}], "name": "asset_config", "returns": {"type": "void"}, "desc": "Configure the Debt Algorand Standard Application", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "uint64", "desc": "Account's units for the current value calculation", "name": "units"}], "name": "get_account_units_current_value", "returns": {"type": "(uint64,uint64,(uint64,uint64))", "desc": "Units current value in denomination asset, Accrued interest in denomination asset", "struct": "CurrentUnitsValue"}, "desc": "Get account's units current value and accrued interest", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}], "name": "get_payment_amount", "returns": {"type": "(uint64,uint64)", "desc": "Interest amount in denomination asset, Principal amount in denomination asset", "struct": "PaymentAmounts"}, "desc": "Get the next payment amount", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "byte[]", "desc": "Additional payment information (Optional)", "name": "payment_info"}], "name": "pay_principal", "returns": {"type": "(uint64,uint64,byte[])", "desc": "Paid principal amount in denomination asset, Payment timestamp, Payment context", "struct": "PaymentResult"}, "desc": "Pay the outstanding principal to an account", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint8", "name": "type"}, {"type": "string", "name": "type_name"}, {"type": "uint64", "name": "time"}, {"type": "uint64", "name": "payoff"}, {"type": "uint64", "name": "currency_id"}, {"type": "byte[]", "name": "currency_unit"}, {"type": "uint64", "name": "nominal_value"}, {"type": "uint16", "name": "nominal_rate_bps"}, {"type": "uint64", "name": "nominal_accrued"}], "name": "Event", "desc": "ACTUS Event."}], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Sender Account Holding Address", "name": "sender_holding_address"}, {"type": "address", "desc": "Receiver Account Holding Address", "name": "receiver_holding_address"}, {"type": "uint64", "desc": "Amount of D-ASA units to transfer", "name": "units"}], "name": "asset_transfer", "returns": {"type": "uint64", "desc": "Transferred actualized value in denomination asset"}, "desc": "Transfer D-ASA units between accounts", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": [], "create": ["NoOp"]}, "args": [{"type": "address", "desc": "D-ASA Arranger Address", "name": "arranger"}, {"type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", "desc": "D-ASA metadata", "name": "metadata", "struct": "AssetMetadata"}], "name": "asset_create", "returns": {"type": "void"}, "desc": "Create a new D-ASA", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["UpdateApplication"], "create": []}, "args": [{"type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", "name": "metadata", "struct": "AssetMetadata"}], "name": "asset_update", "returns": {"type": "void"}, "desc": "Update D-ASA application.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64[]", "desc": "Secondary market time events (strictly ascending order)", "name": "secondary_market_time_events"}], "name": "set_secondary_time_events", "returns": {"type": "(uint64,uint64)", "desc": "Secondary Market Opening Date, Secondary Market Closure Date", "struct": "SecondaryMarketSchedule"}, "desc": "Set secondary market time schedule", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Default status", "name": "defaulted"}], "name": "set_default_status", "returns": {"type": "uint64"}, "desc": "Set D-ASA default status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "uint64", "desc": "Amount of D-ASA units to distribute", "name": "units"}], "name": "primary_distribution", "returns": {"type": "uint64", "desc": "Remaining D-ASA units to be distributed"}, "desc": "Distribute D-ASA units to accounts according the primary market", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_asset_info", "returns": {"type": "(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)", "desc": "Denomination asset ID, Settlement asset ID, Outstanding principal, Unit nominal value, Day-count convention, Interest rate, Total supply, Circulating supply, Primary distribution opening date, Primary distribution closure date, Issuance date, Maturity date, Suspended, Performance", "struct": "AssetInfo"}, "desc": "Get D-ASA info", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_time_events", "returns": {"type": "uint64[]", "desc": "Time events"}, "desc": "Get D-ASA time events", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_secondary_market_schedule", "returns": {"type": "uint64[]", "desc": "Secondary market schedule"}, "desc": "Get secondary market schedule", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_asset_metadata", "returns": {"type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", "desc": "Contract type, Calendar, Business day convention, End of month convention, Early repayment effect, Early repayment penalty type, Prospectus hash, Prospectus URL", "struct": "AssetMetadata"}, "desc": "Get D-ASA metadata", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "bool", "desc": "Suspension status", "name": "suspended"}], "name": "account_gov_suspension", "returns": {"type": "uint64", "desc": "Timestamp of the set account suspension status"}, "desc": "Set account suspension status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "address", "desc": "Account Payment Address", "name": "payment_address"}], "name": "account_open", "returns": {"type": "uint64", "desc": "Timestamp of the account opening"}, "desc": "Open D-ASA account", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}], "name": "account_close", "returns": {"type": "(uint64,uint64)", "desc": "Closed units, Timestamp of the account closing"}, "desc": "Close D-ASA account", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "address", "desc": "Account Payment Address", "name": "payment_address"}], "name": "account_update_payment_address", "returns": {"type": "uint64", "desc": "Timestamp of the account update"}, "desc": "Update the Payment Address of an account", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}], "name": "account_get_info", "returns": {"type": "(address,uint64,uint64,uint64,bool)", "desc": "Payment Address, D-ASA units, Unit nominal value in denomination asset, Paid coupons, Suspended", "struct": "AccountInfo"}, "desc": "Get account info", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "New Arranger address", "name": "new_arranger"}], "name": "rbac_rotate_arranger", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Rotate the Arranger address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Operation Daemon address", "name": "address"}], "name": "rbac_set_op_daemon", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Non-Normative: Set the Operation Daemon address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}, {"type": "byte[]", "desc": "Role configuration (Optional)", "name": "config"}], "name": "rbac_assign_role", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Assign a role to an address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}], "name": "rbac_revoke_role", "returns": {"type": "uint64", "desc": "Timestamp of the role revocation"}, "desc": "Revoke a role from an address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Suspension status", "name": "suspended"}], "name": "rbac_gov_asset_suspension", "returns": {"type": "uint64", "desc": "Timestamp of the set asset suspension status"}, "desc": "Set asset suspension status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "rbac_get_arranger", "returns": {"type": "address", "desc": "Arranger address"}, "desc": "Get Arranger address", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Address to get roles for", "name": "address"}], "name": "rbac_get_address_roles", "returns": {"type": "(bool,bool,bool,bool,bool)", "desc": "Roles mask: (Account Manager, Primary Dealer, Trustee, Authority, Interest Oracle)"}, "desc": "Non-normative - Get roles assigned to an address", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}], "name": "rbac_get_role_config", "returns": {"type": "(uint64,uint64)", "desc": "Role configuration", "struct": "RoleConfig"}, "desc": "Get role configuration", "events": [], "readonly": true, "recommendations": {}}], "name": "ZeroCouponBond", "state": {"keys": {"box": {"time_events": {"key": "dGltZUV2ZW50cw==", "keyType": "AVMBytes", "valueType": "uint64[]"}}, "global": {"arranger": {"key": "UjIwIw==", "keyType": "AVMBytes", "valueType": "address"}, "op_daemon": {"key": "UjI1Iw==", "keyType": "AVMBytes", "valueType": "address"}, "asset_suspended": {"key": "YXNzZXRfc3VzcGVuZGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "asset_defaulted": {"key": "YXNzZXRfZGVmYXVsdGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "total_units": {"key": "dG90YWxfdW5pdHM=", "keyType": "AVMString", "valueType": "AVMUint64"}, "circulating_units": {"key": "Y2lyY3VsYXRpbmdfdW5pdHM=", "keyType": "AVMString", "valueType": "AVMUint64"}, "unit_value": {"key": "dW5pdF92YWx1ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "status": {"key": "c3RhdHVz", "keyType": "AVMString", "valueType": "AVMUint64"}, "denomination_asset_id": {"key": "ZGVub21pbmF0aW9uX2Fzc2V0X2lk", "keyType": "AVMString", "valueType": "AVMUint64"}, "settlement_asset_id": {"key": "c2V0dGxlbWVudF9hc3NldF9pZA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "day_count_convention": {"key": "ZGF5X2NvdW50X2NvbnZlbnRpb24=", "keyType": "AVMString", "valueType": "AVMUint64"}, "metadata": {"key": "bWV0YWRhdGE=", "keyType": "AVMString", "valueType": "AVMBytes"}, "principal_discount": {"key": "cHJpbmNpcGFsX2Rpc2NvdW50", "keyType": "AVMString", "valueType": "AVMUint64"}, "interest_rate": {"key": "aW50ZXJlc3RfcmF0ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "total_coupons": {"key": "dG90YWxfY291cG9ucw==", "keyType": "AVMString", "valueType": "AVMUint64"}, "primary_distribution_opening_date": {"key": "cHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "primary_distribution_closure_date": {"key": "cHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "issuance_date": {"key": "aXNzdWFuY2VfZGF0ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "secondary_market_opening_date": {"key": "c2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGU=", "keyType": "AVMString", "valueType": "AVMUint64"}, "secondary_market_closure_date": {"key": "c2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGU=", "keyType": "AVMString", "valueType": "AVMUint64"}, "maturity_date": {"key": "bWF0dXJpdHlfZGF0ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}}, "local": {}}, "maps": {"box": {"account_manager": {"keyType": "address", "valueType": "RoleConfig", "prefix": "UjQwIw=="}, "primary_dealer": {"keyType": "address", "valueType": "RoleConfig", "prefix": "UjUwIw=="}, "trustee": {"keyType": "address", "valueType": "RoleConfig", "prefix": "UjYwIw=="}, "authority": {"keyType": "address", "valueType": "RoleConfig", "prefix": "UjcwIw=="}, "interest_oracle": {"keyType": "address", "valueType": "RoleConfig", "prefix": "UjgwIw=="}, "account": {"keyType": "address", "valueType": "AccountInfo", "prefix": "UjMwIw=="}}, "global": {}, "local": {}}, "schema": {"global": {"bytes": 3, "ints": 18}, "local": {"bytes": 0, "ints": 0}}}, "structs": {"AccountInfo": [{"name": "payment_address", "type": "address"}, {"name": "units", "type": "uint64"}, {"name": "unit_value", "type": "uint64"}, {"name": "paid_coupons", "type": "uint64"}, {"name": "suspended", "type": "bool"}], "AssetInfo": [{"name": "denomination_asset_id", "type": "uint64"}, {"name": "settlement_asset_id", "type": "uint64"}, {"name": "outstanding_principal", "type": "uint64"}, {"name": "unit_value", "type": "uint64"}, {"name": "day_count_convention", "type": "uint8"}, {"name": "principal_discount", "type": "uint16"}, {"name": "interest_rate", "type": "uint16"}, {"name": "total_supply", "type": "uint64"}, {"name": "circulating_supply", "type": "uint64"}, {"name": "primary_distribution_opening_date", "type": "uint64"}, {"name": "primary_distribution_closure_date", "type": "uint64"}, {"name": "issuance_date", "type": "uint64"}, {"name": "maturity_date", "type": "uint64"}, {"name": "suspended", "type": "bool"}, {"name": "performance", "type": "uint8"}], "AssetMetadata": [{"name": "contract_type", "type": "uint8"}, {"name": "calendar", "type": "uint8"}, {"name": "business_day_convention", "type": "uint8"}, {"name": "end_of_month_convention", "type": "uint8"}, {"name": "prepayment_effect", "type": "uint8"}, {"name": "penalty_type", "type": "uint8"}, {"name": "prospectus_hash", "type": "byte[32]"}, {"name": "prospectus_url", "type": "string"}], "CurrentUnitsValue": [{"name": "units_value", "type": "uint64"}, {"name": "accrued_interest", "type": "uint64"}, {"name": "day_count_factor", "type": "DayCountFactor"}], "DayCountFactor": [{"name": "numerator", "type": "uint64"}, {"name": "denominator", "type": "uint64"}], "PaymentAmounts": [{"name": "interest", "type": "uint64"}, {"name": "principal", "type": "uint64"}], "PaymentResult": [{"name": "amount", "type": "uint64"}, {"name": "timestamp", "type": "uint64"}, {"name": "context", "type": "byte[]"}], "RoleConfig": [{"name": "role_validity_start", "type": "uint64"}, {"name": "role_validity_end", "type": "uint64"}], "SecondaryMarketSchedule": [{"name": "secondary_market_opening_date", "type": "uint64"}, {"name": "secondary_market_closure_date", "type": "uint64"}]}, "byteCode": {"approval": "DCAGAAEgCMgBgKMFJiAEFR98dQRSMzAjBnN0YXR1cxFjaXJjdWxhdGluZ191bml0cw1tYXR1cml0eV9kYXRlBFIyMCMKdW5pdF92YWx1ZSFwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUNaXNzdWFuY2VfZGF0ZR1zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQRSNzAjBFI0MCMLdG90YWxfdW5pdHMTc2V0dGxlbWVudF9hc3NldF9pZBRkYXlfY291bnRfY29udmVudGlvbhJwcmluY2lwYWxfZGlzY291bnQdc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUEUjYwIwRSNTAjBFIyNSMPYXNzZXRfc3VzcGVuZGVkD2Fzc2V0X2RlZmF1bHRlZBVkZW5vbWluYXRpb25fYXNzZXRfaWQIbWV0YWRhdGEhcHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlBFI4MCMNaW50ZXJlc3RfcmF0ZQp0aW1lRXZlbnRzAQANdG90YWxfY291cG9ucwIAAAMGgQExGEAAbScFMgNnJxMyA2cnFCJnJxUiZycMImcrImcnBiJnKiJnJxYiZycNImcnBiJnJw4iZycXgABnJw8iZycaImcnHSJnJwciZycYImcnCCJnJxAiZycJImcnBCJnMTWBAxJEMTSBEhJEMTcURDE2FESABCXbqVs2GgCOAQDOMRkURDEYQQC3ghkEiUdBNARENj1JBGfbTyAEnHa2owRP1qPMBB1vwlUEJemZfwRshePuBEAtukcE+tIXPgQI7+o1BOSlq1QE3AY7NQQU/BDvBEwRPtUEdKcpfwQQXBhOBIL3Gy0E7wT10wQDuDMpBD2+gL0E31ToLAQBDIKZBHQGrNIEw+SylzYaAI4ZABsBWwIlAlMDtwVNBcwF6waBB1AHageFB5AHyQgTCFAIggiaCLIIygmGChwKOwpGCpAAgAQ/DvxsNhoAjgEE6wAxGYEEEjEYEERCBQ02GgFJFSUSRBc2GgJJFSUSRBc2GgNJFSUSRBc2GgRJFSUSRBc2GgVJFSUSRBc2GgZJFSMSRDYaB0lOBxWBAhJENhoISSJZSU4IgQILgQIITBUSRDYaCUlOB0kiWUlOCCULgQIITBUSRDYaCkkiWUlOCIEQC4ECCEwVEkSIC9UiKmVEFERLBXELRQFEJxZLBmdLBE8GEkQnDUsFZ7EyADIKIrISshRPBbIRgQSyELIBs0sDSwIYFEQnBksCZ08DTwIKJwxMZycPTwJnF0lBAAhJgf8BEkEAZSNEJw5LAWdLBRdJFEQnGkxnSwRJFEQnHUsBZ4EECEsDEkRLA4gKXicbvEgnG0sBv0lXAgBLAYECWycHTGdLAYEKWycYTGdLAYESWycITGdMIlkjCSULWycETGdLARREKoFkZyNDIkL/mCKAAEcFNhoBSRUkEkQ2GgJJFSUSRBciJwdlREEAqDIHIicHZUQPQQCdI0QpSwJQSUUKvUUBRElBAIhLCL5EJFtLAQ9BAHwjREqICmVJRQgiJw9lREsBC4GQTgoJRQgiRQYiRQMiRQQiJwhlRDIHSUUHDkEASSInBGVESwUNQQA+I0EAFYgJQUsCSwKICWpFB0kiW0UEJVtFBDIHIicEZUQPQQAESwZFCEsCFksEFlBLCBZLBxZQTFAoTFCwI0MiQv+/IkL/gSJC/2A2GgFHAhUkEkQpTFC9RQFEIkkqZUSBZBJBAAdLAYgJ10UBIhZLARZQKExQsCNDNhoBRwIVJBJENhoCSSJZgQIISwEVEkRXAgBMIiplRIFkEkSICf+ICgQpSwFQSU4CSb1FAUS+SCRbRDIHIicEZUQPRIgJgyInE2VEMgMTQQAiMQAiJxNlRBJAABUxAEsEEkAADTEASwK+RFcAIBJBAO8jREsBvkRXACAiJw1lRHAARQFBANZLAb5EgcADU0AAyyNBAMEyCiInDWVETEsBcABESwJJTgIPREsDvkRXACCxMgBPArISTLIUTLIRgQSyELIBsyIrZURLAklOAr5EJFsJK0xnIhZMJEsCu4gI/DIIMgciJxZlRElxA0QiK2VEIicGZUQLTwQWgAMDADdQTwQWUEsFFkxLAVBPBBZQSwMVFlcGAk8EUEyAAgA7UE8DFlAnHlBPA1CABAACUFJQTFCABIwpkE5MULAyBxZQSwNJFRZXBgJMUEyAAgASUExQKExQsCNDIkUBQv9oIkL/MiJC/w4iRwKAAEk2GgFJFSQSRDYaAkkVJBJENhoDSRUlEkQXIiplRIFkEkEBFSInEGVEMgcOQQEKIicJZURBAAsyByInCWVEDEEA9yNEMQBLA0lOAhJEiAhsiAhxKUsBUElFCUm9RQFEKUsESU4CUElFCkm9RQFESwOIB81LAYgHyE8DTwITREsCSURPAr5ESSRbTwIPRFcoCEUJvkQkW0EAiksGvkSBKFtLBr5EgShbEkEAdEsGvkSBMFtLBr5EgTBbEkEAYiNESwZJvkSBKFtFBUsDSwJJTgKIBsRFB0sBvkQkW0oOREwJFksBJE8Cu75IJFtAABAiFksHSU4CgShLAruBMEy7SwVJvkQkW0sCSU4CCBZPAiRPArtLBAtLBQgWKExQsCNDIkL/m0sFSYEoSwq7Swe+RFcwCIEwTLtC/4YiQv8GNhoBSRUkEkQ2GgJJFUsBgSZZSYEoEkRLAkxLAlIiWYEqCBJEJwVPAmcnF0xnI0M2GgFJFUsBgSZZSYEoEkRLAkxLAlIiWYEqCBJEiAcnJxdMZyNDIjYaAUcCIllJJQuBAghPAhUSRIgHCyIqZUQhBBIURIgHCUlEIw1BAAZJiAX9RQEiJwhlREsBSVcCAEUEgQJbTEsBDkQnEExnIicEZURBABoiJwRlREsBIlkjCSULSwNMW0xLAQ9EJwlMZyInEGVEIicJZURMFkwWUChMULAjQzYaAUkVIxJEIlMnETEAiAZdRCcVTGcyBxYoTFCwI0OAADYaAUkVJBJENhoCSRUlEkQXIiplRIFkEkEAdSInB2VEMgdJRQUOQQBnIicYZURLAw1BAFwjRCcSMQCIBhBEKUsCUEm9RQFEiAZBiAZGSwFJRCIrZURLAQgiJwxlREsBD0QrSwFnSwK+RCRbTwIIFksCJE8CuyInBmVEFk8CgShPArsiJwxlREwJFihMULAjQyJC/6EiMgciJwRlTElOAk4DRA1BAAhJQQAEgQRFAiInFWVEQQAEgQNFAiInFmVEIicNZUQiK2VEIicGZURKCyInDmVEFkmTJQ5EVwcBIicPZUQWSZOBEA5EVwYCIicaZUQWSZOBEA5EVwYCIicMZUQiJwdlRCInGGVEIicIZUQiJwRlRCInFGVESw8WSZMlDkRXBwFPDhZPDhZQTwsWUE8LFlBPClBPCVBPCFBPBxZQTwcWUE8GFlBPBRZQTwQWUE8DFlAnHCJPBFRQTFAoTFCwI0MnHiIqZUSBZBJBAAcnG75MRQJEKEsBULAjQyInEGVEIicJZURMFoACAAJMUEwWUChMULAjQyInF2VEKExQsCNDNhoBSRUkEkQ2GgJJFSMSRCJTJwoxAIgEkUQpTwJQSb1FAURJgTgjuiJPA1SBOEy7MgcWKExQsCNDNhoBSRUkEkQ2GgJJFSQSRCcLMQCIBFpEIiplRCEEEhREiASLiASQKU8CUEm9RQEURCIWTwJLAVBLAVBMUCccUL8yBxYoTFCwI0M2GgFJFSQSRCcLMQCIBBhEiARSKUxQSb1FAURJvkgkW0y8SCIrZURLAQkrTGeIA+syB0wWTBZQKExQsCNDNhoBSRUkEkQ2GgJJFSQSRDEASwISRIgED4gEFClPAlBJvUUBRCJPArsyBxYoTFCwI0M2GgFJFSQSRClMUEm9RQFEvkgoTFCwI0M2GgFJFSQSRIgDyScFTGcyBxYoTFCwI0M2GgFJFSQSRIgDsScTTGcyBxYoTFCwI0M2GgFJFSMSRDYaAklOAhUkEkQ2GgNJIlmBAghLARUSRFcCAEyIA32IA4QXRwKIA46BFBJBAA4nBUsDZzIHFihMULAjQ0mBKBJBABEnC0sDUEm9RQEUREsCv0L/30mBMhJBABEnEksDUEm9RQEUREsCv0L/x0mBPBJBABEnEUsDUEm9RQEUREsCv0L/r0mBRhJBABEnCksDUEm9RQEUREsCv0L/l0mBUBJB/5AnGUsDUEm9RQEUREsCv0L/fzYaAUkVIxJENhoCSU4CFSQSRIgC04gC2hdHAogC5EmBFBNEgSgSQQAVJwtLAlBJvUUBRLxIMgcWKExQsCNDSYEyEkEADycSSwJQSb1FAUS8SEL/4UmBPBJBAA8nEUsCUEm9RQFEvEhC/8tJgUYSQQAPJwpLAlBJvUUBRLxIQv+1SYFQEkH/ricZSwJQSb1FAUS8SEL/nzYaAUkVIxJEIlMnCjEAiAINRCcUTGcyBxYoTFCwI0MiJwVlRChMULAjQzYaAUkVJBJEJwtLAYgB5ScSSwKIAd4nEUsDiAHXJwpLBIgB0CcZTwWIAcknHCJPBlQjTwVUgQJPBFSBA08DVIEETwJUKExQsCNDNhoBSRUjEkQ2GgJJTgIVJBJEF0mIAeGDBhQoMjxGUE8GjgYATwBAADEAIgATAAEAJxlLAVBJvUUBRL5IKExQsCNDJwpLAVBJvUUBRL5IQv/rJxFLAVBJvUUBRL5IQv/cJxJLAVBJvUUBRL5IQv/NJwtLAVBJvUUBRL5IQv++gBAAAAAAAAAAAAAAAAAAAAAAQv+pigABMgciJwhlRExLAQlMIicEZURMCSInDmVEQAAKiwAhBQqMACEFCosAFkwWUEyJigIBiP/KSSJbTCVbi/6L/4gApiInD2VEC08CC4GQTk8CCwqJigEBgABHAov/VwIAi/+BAlsyBw1Ei/8iWSMJIosFiwQMQQBcgUsyDA1BABmxgQayEIEFshknH7IeJx+yHzIAsgGzQv/fiwVJJQuLA0lOA0xbSU4DjAEjCEmMAiULW0mMAAxEIicOZUSB/wETQQAKiwCLAQkhBRgURIsCjAVC/5yL/4wAiYoBACmL/1C+RIHAA1MURImKAgEpi/5QvkSBKFuL/wuJigEBKYv/UL5EJFuL/0yI/9+JIitlREAABCohBGeJigIBgACL/ov/UEm9RQFBAB+LAb5EIlsyB0mMAA5BABCLAb5EJVuLAA9BAAQjjACJIkL/+TEAIicFZUQSRIkiJxVlRBREiSInFGVEFESJigEAi/+BFBJAACiL/4EoEkAAIIv/gTISQAAYi/+BPBJAABCL/4FGEkAACIv/gVASQQADI0SJIkL/+g==", "clear": "DIEBQw=="}, "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint8", "name": "type"}, {"type": "string", "name": "type_name"}, {"type": "uint64", "name": "time"}, {"type": "uint64", "name": "payoff"}, {"type": "uint64", "name": "currency_id"}, {"type": "byte[]", "name": "currency_unit"}, {"type": "uint64", "name": "nominal_value"}, {"type": "uint16", "name": "nominal_rate_bps"}, {"type": "uint64", "name": "nominal_accrued"}], "name": "Event", "desc": "ACTUS Event."}], "networks": {}, "source": {"approval": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgMzIgOCAyMDAgODY0MDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAweDUyMzMzMDIzICJzdGF0dXMiICJjaXJjdWxhdGluZ191bml0cyIgIm1hdHVyaXR5X2RhdGUiIDB4NTIzMjMwMjMgInVuaXRfdmFsdWUiICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiICJpc3N1YW5jZV9kYXRlIiAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiIDB4NTIzNzMwMjMgMHg1MjM0MzAyMyAidG90YWxfdW5pdHMiICJzZXR0bGVtZW50X2Fzc2V0X2lkIiAiZGF5X2NvdW50X2NvbnZlbnRpb24iICJwcmluY2lwYWxfZGlzY291bnQiICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIgMHg1MjM2MzAyMyAweDUyMzUzMDIzIDB4NTIzMjM1MjMgImFzc2V0X3N1c3BlbmRlZCIgImFzc2V0X2RlZmF1bHRlZCIgImRlbm9taW5hdGlvbl9hc3NldF9pZCIgIm1ldGFkYXRhIiAicHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIiAweDUyMzgzMDIzICJpbnRlcmVzdF9yYXRlIiAweDc0Njk2ZDY1NDU3NjY1NmU3NDczIDB4MDAgInRvdGFsX2NvdXBvbnMiIDB4MDAwMCAweDA2ODEwMQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwLTMxCiAgICAvLyAjIFJCQUMgUm9sZXMKICAgIC8vIHNlbGYuYXJyYW5nZXIgPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX0FSUkFOR0VSKQogICAgYnl0ZWMgNSAvLyAweDUyMzIzMDIzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzIKICAgIC8vIHNlbGYub3BfZGFlbW9uID0gR2xvYmFsU3RhdGUoQWNjb3VudCgpLCBrZXk9Y3N0LlBSRUZJWF9JRF9PUF9EQUVNT04pCiAgICBieXRlYyAxOSAvLyAweDUyMzIzNTIzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NDctNDgKICAgIC8vICMgRC1BU0EgR292ZXJuYW5jZQogICAgLy8gc2VsZi5hc3NldF9zdXNwZW5kZWQgPSBGYWxzZQogICAgYnl0ZWMgMjAgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjQ5CiAgICAvLyBzZWxmLmFzc2V0X2RlZmF1bHRlZCA9IEZhbHNlCiAgICBieXRlYyAyMSAvLyAiYXNzZXRfZGVmYXVsdGVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTkKICAgIC8vIHNlbGYudG90YWxfdW5pdHMgPSBVSW50NjQoKQogICAgYnl0ZWMgMTIgLy8gInRvdGFsX3VuaXRzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjAKICAgIC8vIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgPSBVSW50NjQoKQogICAgYnl0ZWNfMyAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMQogICAgLy8gc2VsZi51bml0X3ZhbHVlID0gVUludDY0KCkKICAgIGJ5dGVjIDYgLy8gInVuaXRfdmFsdWUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMgogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW5tLlNUQVRVU19JTkFDVElWRSkKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzEtMzIKICAgIC8vICMgQXNzZXQgQ29uZmlndXJhdGlvbgogICAgLy8gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgPSBBc3NldCgpCiAgICBieXRlYyAyMiAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMwogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkID0gQXNzZXQoKQogICAgYnl0ZWMgMTMgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjM0CiAgICAvLyBzZWxmLnVuaXRfdmFsdWUgPSBVSW50NjQoKQogICAgYnl0ZWMgNiAvLyAidW5pdF92YWx1ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzUKICAgIC8vIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPSBVSW50NjQoKQogICAgYnl0ZWMgMTQgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozNy0zOAogICAgLy8gIyBNZXRhZGF0YQogICAgLy8gc2VsZi5tZXRhZGF0YSA9IEJ5dGVzKCkKICAgIGJ5dGVjIDIzIC8vICJtZXRhZGF0YSIKICAgIHB1c2hieXRlcyAweAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQwLTQxCiAgICAvLyAjIFByaW5jaXBhbCAvIFJhdGVzCiAgICAvLyBzZWxmLnByaW5jaXBhbF9kaXNjb3VudCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNSAvLyAicHJpbmNpcGFsX2Rpc2NvdW50IgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MgogICAgLy8gc2VsZi5pbnRlcmVzdF9yYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDI2IC8vICJpbnRlcmVzdF9yYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MwogICAgLy8gc2VsZi50b3RhbF9jb3Vwb25zID0gVUludDY0KCkKICAgIGJ5dGVjIDI5IC8vICJ0b3RhbF9jb3Vwb25zIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0NwogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgNyAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0OAogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMjQgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDkKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA4IC8vICJpc3N1YW5jZV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo1MAogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNiAvLyAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjUxCiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDkgLy8gInNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo1MgogICAgLy8gc2VsZi5tYXR1cml0eV9kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDQgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBhc3NlcnQgVHhuLmdsb2JhbF9udW1fYnl0ZV9zbGljZSA9PSBjZmcuR0xPQkFMX0JZVEVTLCBlcnIuV1JPTkdfR0xPQkFMX0JZVEVTCiAgICB0eG4gR2xvYmFsTnVtQnl0ZVNsaWNlCiAgICBwdXNoaW50IDMKICAgID09CiAgICBhc3NlcnQgLy8gV3JvbmcgR2xvYmFsIEJ5dGVzIGFsbG9jYXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBhc3NlcnQgVHhuLmdsb2JhbF9udW1fdWludCA9PSBjZmcuR0xPQkFMX1VJTlRTLCBlcnIuV1JPTkdfR0xPQkFMX1VJTlRTCiAgICB0eG4gR2xvYmFsTnVtVWludAogICAgcHVzaGludCAxOAogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgVUludHMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MjkKICAgIC8vIGFzc2VydCBUeG4ubG9jYWxfbnVtX2J5dGVfc2xpY2UgPT0gY2ZnLkxPQ0FMX0JZVEVTLCBlcnIuV1JPTkdfTE9DQUxfQllURVMKICAgIHR4biBMb2NhbE51bUJ5dGVTbGljZQogICAgIQogICAgYXNzZXJ0IC8vIFdyb25nIExvY2FsIEJ5dGVzIGFsbG9jYXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjMwCiAgICAvLyBhc3NlcnQgVHhuLmxvY2FsX251bV91aW50ID09IGNmZy5MT0NBTF9VSU5UUywgZXJyLldST05HX0xPQ0FMX1VJTlRTCiAgICB0eG4gTG9jYWxOdW1VaW50CiAgICAhCiAgICBhc3NlcnQgLy8gV3JvbmcgTG9jYWwgVUludHMgYWxsb2NhdGlvbgoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMi0yNAogICAgLy8gY2xhc3MgWmVyb0NvdXBvbkJvbmQoCiAgICAvLyAgICAgUEFNQ29yZU1peGluLAogICAgLy8gICAgIE5vQ291cG9uQ2FzaGZsb3dNaXhpbiwKICAgIC8vICAgICBQcmluY2lwYWxQYXltZW50QWdlbnRNaXhpbiwKICAgIC8vICAgICBOb0NvdXBvblRyYW5zZmVyQWdlbnRNaXhpbiwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBhdm1fdmVyc2lvbj0xMiwKICAgIC8vICk6CiAgICBwdXNoYnl0ZXMgMHgyNWRiYTk1YiAvLyBtZXRob2QgImFzc2V0X3VwZGF0ZSgodWludDgsdWludDgsdWludDgsdWludDgsdWludDgsdWludDgsYnl0ZVszMl0sc3RyaW5nKSl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9hc3NldF91cGRhdGVfcm91dGVANAoKbWFpbl9zd2l0Y2hfY2FzZV9uZXh0QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMi0yNAogICAgLy8gY2xhc3MgWmVyb0NvdXBvbkJvbmQoCiAgICAvLyAgICAgUEFNQ29yZU1peGluLAogICAgLy8gICAgIE5vQ291cG9uQ2FzaGZsb3dNaXhpbiwKICAgIC8vICAgICBQcmluY2lwYWxQYXltZW50QWdlbnRNaXhpbiwKICAgIC8vICAgICBOb0NvdXBvblRyYW5zZmVyQWdlbnRNaXhpbiwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBhdm1fdmVyc2lvbj0xMiwKICAgIC8vICk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBieiBtYWluX2NyZWF0ZV9Ob09wQDMzCiAgICBwdXNoYnl0ZXNzIDB4ODk0NzQxMzQgMHg0NDM2M2Q0OSAweDY3ZGI0ZjIwIDB4OWM3NmI2YTMgMHg0ZmQ2YTNjYyAweDFkNmZjMjU1IDB4MjVlOTk5N2YgMHg2Yzg1ZTNlZSAweDQwMmRiYTQ3IDB4ZmFkMjE3M2UgMHgwOGVmZWEzNSAweGU0YTVhYjU0IDB4ZGMwNjNiMzUgMHgxNGZjMTBlZiAweDRjMTEzZWQ1IDB4NzRhNzI5N2YgMHgxMDVjMTg0ZSAweDgyZjcxYjJkIDB4ZWYwNGY1ZDMgMHgwM2I4MzMyOSAweDNkYmU4MGJkIDB4ZGY1NGU4MmMgMHgwMTBjODI5OSAweDc0MDZhY2QyIDB4YzNlNGIyOTcgLy8gbWV0aG9kICJhc3NldF9jb25maWcodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50MTYsdWludDE2W10sdWludDY0W10sKHVpbnQ2NCx1aW50NjQpW10pdm9pZCIsIG1ldGhvZCAiZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZShhZGRyZXNzLHVpbnQ2NCkodWludDY0LHVpbnQ2NCwodWludDY0LHVpbnQ2NCkpIiwgbWV0aG9kICJnZXRfcGF5bWVudF9hbW91bnQoYWRkcmVzcykodWludDY0LHVpbnQ2NCkiLCBtZXRob2QgInBheV9wcmluY2lwYWwoYWRkcmVzcyxieXRlW10pKHVpbnQ2NCx1aW50NjQsYnl0ZVtdKSIsIG1ldGhvZCAiYXNzZXRfdHJhbnNmZXIoYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInNldF9zZWNvbmRhcnlfdGltZV9ldmVudHModWludDY0W10pKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJzZXRfZGVmYXVsdF9zdGF0dXMoYm9vbCl1aW50NjQiLCBtZXRob2QgInByaW1hcnlfZGlzdHJpYnV0aW9uKGFkZHJlc3MsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X2luZm8oKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDgsdWludDE2LHVpbnQxNix1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxib29sLHVpbnQ4KSIsIG1ldGhvZCAiZ2V0X3RpbWVfZXZlbnRzKCl1aW50NjRbXSIsIG1ldGhvZCAiZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGUoKXVpbnQ2NFtdIiwgbWV0aG9kICJnZXRfYXNzZXRfbWV0YWRhdGEoKSh1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCxieXRlWzMyXSxzdHJpbmcpIiwgbWV0aG9kICJhY2NvdW50X2dvdl9zdXNwZW5zaW9uKGFkZHJlc3MsYm9vbCl1aW50NjQiLCBtZXRob2QgImFjY291bnRfb3BlbihhZGRyZXNzLGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X2Nsb3NlKGFkZHJlc3MpKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJhY2NvdW50X3VwZGF0ZV9wYXltZW50X2FkZHJlc3MoYWRkcmVzcyxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAiYWNjb3VudF9nZXRfaW5mbyhhZGRyZXNzKShhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LGJvb2wpIiwgbWV0aG9kICJyYmFjX3JvdGF0ZV9hcnJhbmdlcihhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19zZXRfb3BfZGFlbW9uKGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX2Fzc2lnbl9yb2xlKHVpbnQ4LGFkZHJlc3MsYnl0ZVtdKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19yZXZva2Vfcm9sZSh1aW50OCxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19nb3ZfYXNzZXRfc3VzcGVuc2lvbihib29sKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19nZXRfYXJyYW5nZXIoKWFkZHJlc3MiLCBtZXRob2QgInJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXMoYWRkcmVzcykoYm9vbCxib29sLGJvb2wsYm9vbCxib29sKSIsIG1ldGhvZCAicmJhY19nZXRfcm9sZV9jb25maWcodWludDgsYWRkcmVzcykodWludDY0LHVpbnQ2NCkiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBhc3NldF9jb25maWcgZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZSBnZXRfcGF5bWVudF9hbW91bnQgcGF5X3ByaW5jaXBhbCBhc3NldF90cmFuc2ZlciBzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzIHNldF9kZWZhdWx0X3N0YXR1cyBwcmltYXJ5X2Rpc3RyaWJ1dGlvbiBnZXRfYXNzZXRfaW5mbyBnZXRfdGltZV9ldmVudHMgZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGUgZ2V0X2Fzc2V0X21ldGFkYXRhIGFjY291bnRfZ292X3N1c3BlbnNpb24gYWNjb3VudF9vcGVuIGFjY291bnRfY2xvc2UgYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzIGFjY291bnRfZ2V0X2luZm8gcmJhY19yb3RhdGVfYXJyYW5nZXIgcmJhY19zZXRfb3BfZGFlbW9uIHJiYWNfYXNzaWduX3JvbGUgcmJhY19yZXZva2Vfcm9sZSByYmFjX2dvdl9hc3NldF9zdXNwZW5zaW9uIHJiYWNfZ2V0X2FycmFuZ2VyIHJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXMgcmJhY19nZXRfcm9sZV9jb25maWcKICAgIGVycgoKbWFpbl9jcmVhdGVfTm9PcEAzMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjEyLTI0CiAgICAvLyBjbGFzcyBaZXJvQ291cG9uQm9uZCgKICAgIC8vICAgICBQQU1Db3JlTWl4aW4sCiAgICAvLyAgICAgTm9Db3Vwb25DYXNoZmxvd01peGluLAogICAgLy8gICAgIFByaW5jaXBhbFBheW1lbnRBZ2VudE1peGluLAogICAgLy8gICAgIE5vQ291cG9uVHJhbnNmZXJBZ2VudE1peGluLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gICAgIGF2bV92ZXJzaW9uPTEyLAogICAgLy8gKToKICAgIHB1c2hieXRlcyAweDNmMGVmYzZjIC8vIG1ldGhvZCAiYXNzZXRfY3JlYXRlKGFkZHJlc3MsKHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LGJ5dGVbMzJdLHN0cmluZykpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIGFzc2V0X2NyZWF0ZQogICAgZXJyCgptYWluX2Fzc2V0X3VwZGF0ZV9yb3V0ZUA0OgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6Mjc5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBwdXNoaW50IDQgLy8gVXBkYXRlQXBwbGljYXRpb24KICAgID09CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydAogICAgYiBhc3NldF91cGRhdGUKCgovLyBtb2R1bGVzLmFjdHVzLnBhbS5QQU1Db3JlTWl4aW4uYXNzZXRfY29uZmlnW3JvdXRpbmddKCkgLT4gdm9pZDoKYXNzZXRfY29uZmlnOgogICAgLy8gbW9kdWxlcy9hY3R1cy9wYW0ucHk6MjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA3CiAgICBkdXAKICAgIGNvdmVyIDcKICAgIGxlbgogICAgcHVzaGludCAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQxNgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBjb3ZlciA4CiAgICBwdXNoaW50IDIKICAgICoKICAgIHB1c2hpbnQgMgogICAgKwogICAgc3dhcAogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50MTY+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA5CiAgICBkdXAKICAgIGNvdmVyIDcKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgOAogICAgaW50Y18zIC8vIDgKICAgICoKICAgIHB1c2hpbnQgMgogICAgKwogICAgc3dhcAogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8dWludDY0PgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTAKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgOAogICAgcHVzaGludCAxNgogICAgKgogICAgcHVzaGludCAyCiAgICArCiAgICBzd2FwCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTx0dXBsZTx1aW50NjQsdWludDY0Pj4KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjIyNwogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MjI4CiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgPT0gZW51bXMuU1RBVFVTX0lOQUNUSVZFLCBlcnIuQUxSRUFEWV9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBELUFTQSBhbHJlYWR5IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjU1LTU2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIGRlbm9taW5hdGlvbiB3aXRoIEFTQQogICAgLy8gX2NyZWF0b3IsIGV4aXN0cyA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X2NyZWF0b3IoZGVub21pbmF0aW9uX2Fzc2V0X2lkKQogICAgZGlnIDUKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjU3CiAgICAvLyBhc3NlcnQgZXhpc3RzLCBlcnIuSU5WQUxJRF9ERU5PTUlOQVRJT04KICAgIGFzc2VydCAvLyBEZW5vbWluYXRpb24gYXNzZXQgaXMgbm90IHByb3Blcmx5IHNldAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NjAKICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICBieXRlYyAyMiAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgZGlnIDYKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo2NQogICAgLy8gc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgZGlnIDQKICAgIHVuY292ZXIgNgogICAgPT0KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjYzLTY2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc2V0dGxlbWVudCBhc3NldCBpcyB0aGUgZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQgPT0gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIC8vICksIGVyci5JTlZBTElEX1NFVFRMRU1FTlRfQVNTRVQKICAgIGFzc2VydCAvLyBEaWZmZXJlbnQgc2V0dGxlbWVudCBhc3NldCBub3Qgc3VwcG9ydGVkLCBtdXN0IGJlIGVxdWFsIHRvIGRlbm9taW5hdGlvbiBhc3NldAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NjkKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCA9IHNldHRsZW1lbnRfYXNzZXRfaWQKICAgIGJ5dGVjIDEzIC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgZGlnIDUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3MC03NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhc3NldF9hbW91bnQ9MCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NzUKICAgIC8vIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3MwogICAgLy8gYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3NAogICAgLy8gYXNzZXRfYW1vdW50PTAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICB1bmNvdmVyIDUKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3MC03MQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3MC03NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhc3NldF9hbW91bnQ9MCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjIzOC0yMzkKICAgIC8vICMgU2V0IFByaW5jaXBhbCBhbmQgTWluaW11bSBEZW5vbWluYXRpb24KICAgIC8vIGFzc2VydCBwcmluY2lwYWwgJSBtaW5pbXVtX2Rlbm9taW5hdGlvbiA9PSAwLCBlcnIuSU5WQUxJRF9NSU5JTVVNX0RFTk9NSU5BVElPTgogICAgZGlnIDMKICAgIGRpZyAyCiAgICAlCiAgICAhCiAgICBhc3NlcnQgLy8gTWluaW11bSBkZW5vbWluYXRpb24gaXMgbm90IGEgZGl2aXNvciBvZiBwcmluY2lwYWwKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI0MAogICAgLy8gc2VsZi51bml0X3ZhbHVlID0gbWluaW11bV9kZW5vbWluYXRpb24KICAgIGJ5dGVjIDYgLy8gInVuaXRfdmFsdWUiCiAgICBkaWcgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI0MQogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IHByaW5jaXBhbCAvLyBtaW5pbXVtX2Rlbm9taW5hdGlvbgogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIC8KICAgIGJ5dGVjIDEyIC8vICJ0b3RhbF91bml0cyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyNDIKICAgIC8vIHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50ID0gcHJpbmNpcGFsX2Rpc2NvdW50CiAgICBieXRlYyAxNSAvLyAicHJpbmNpcGFsX2Rpc2NvdW50IgogICAgdW5jb3ZlciAyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MjQ0LTI0NQogICAgLy8gIyBTZXQgRGF5LUNvdW50IENvbnZlbnRpb24KICAgIC8vIHNlbGYuYXNzZXJ0X2RheV9jb3VudF9jb252ZW50aW9uKGRheV9jb3VudF9jb252ZW50aW9uLmFzX3VpbnQ2NCgpKQogICAgYnRvaQogICAgZHVwCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3OS04MwogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIG9ubHkgdGhlIEFjdHVhbC9BY3R1YWwgYW5kIENvbnRpbnVvdXMgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0FfQSksCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQ09OVCksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9EQVlfQ09VTlRfQ09OVkVOVElPTgogICAgYnogYXNzZXRfY29uZmlnX2Jvb2xfdHJ1ZUAzCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjgyCiAgICAvLyBVSW50NjQoY3N0LkRDQ19DT05UKSwKICAgIHB1c2hpbnQgMjU1CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3OS04MwogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIG9ubHkgdGhlIEFjdHVhbC9BY3R1YWwgYW5kIENvbnRpbnVvdXMgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0FfQSksCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQ09OVCksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9EQVlfQ09VTlRfQ09OVkVOVElPTgogICAgPT0KICAgIGJ6IGFzc2V0X2NvbmZpZ19ib29sX2ZhbHNlQDQKCmFzc2V0X2NvbmZpZ19ib29sX3RydWVAMzoKICAgIGludGNfMSAvLyAxCgphc3NldF9jb25maWdfYm9vbF9tZXJnZUA1OgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NzktODMKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBvbmx5IHRoZSBBY3R1YWwvQWN0dWFsIGFuZCBDb250aW51b3VzIGRheS1jb3VudCBjb252ZW50aW9ucwogICAgLy8gYXNzZXJ0IGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19BX0EpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0NPTlQpLAogICAgLy8gKSwgZXJyLklOVkFMSURfREFZX0NPVU5UX0NPTlZFTlRJT04KICAgIGFzc2VydCAvLyBJbnZhbGlkIGRheS1jb3VudCBjb252ZW50aW9uIElECiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo4NgogICAgLy8gc2VsZi5kYXlfY291bnRfY29udmVudGlvbiA9IGRheV9jb3VudF9jb252ZW50aW9uCiAgICBieXRlYyAxNCAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI0OC0yNDkKICAgIC8vICMgU2V0IEludGVyZXN0IFJhdGUKICAgIC8vIHNlbGYuYXNzZXJ0X2ludGVyZXN0X3JhdGUoaW50ZXJlc3RfcmF0ZS5hc191aW50NjQoKSkKICAgIGRpZyA1CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weToxNC0xNQogICAgLy8gIyBUaGlzIHN1YnJvdXRpbmUgbXVzdCBiZSB1c2VkIGFmdGVyIHRoZSBwcmluY2lwYWwgZGlzY291bnQgaGFzIGJlZW4gc2V0CiAgICAvLyBhc3NlcnQgaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCksIGVyci5JTlZBTElEX0lOVEVSRVNUX1JBVEUKICAgIGR1cAogICAgIQogICAgYXNzZXJ0IC8vIEludGVyZXN0IHJhdGUgaXMgbm90IHByb3Blcmx5IGRlZmluZWQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5Ojk0CiAgICAvLyBzZWxmLmludGVyZXN0X3JhdGUgPSBpbnRlcmVzdF9yYXRlCiAgICBieXRlYyAyNiAvLyAiaW50ZXJlc3RfcmF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo5NwogICAgLy8gYXNzZXJ0IG5vdCBjb3Vwb25fcmF0ZXMubGVuZ3RoLCBlcnIuSU5WQUxJRF9DT1VQT05fUkFURVMKICAgIGRpZyA0CiAgICBkdXAKICAgICEKICAgIGFzc2VydCAvLyBDb3Vwb24gcmF0ZXMgYXJlIG5vdCBwcm9wZXJseSBkZWZpbmVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMDAKICAgIC8vIHNlbGYudG90YWxfY291cG9ucyA9IGNvdXBvbl9yYXRlcy5sZW5ndGgKICAgIGJ5dGVjIDI5IC8vICJ0b3RhbF9jb3Vwb25zIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMDQKICAgIC8vIHRpbWVfZXZlbnRzLmxlbmd0aCA9PSBzZWxmLnRvdGFsX2NvdXBvbnMgKyBjZmcuVElNRV9TQ0hFRFVMRV9MSU1JVFMKICAgIHB1c2hpbnQgNAogICAgKwogICAgZGlnIDMKICAgID09CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMDMtMTA1CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHRpbWVfZXZlbnRzLmxlbmd0aCA9PSBzZWxmLnRvdGFsX2NvdXBvbnMgKyBjZmcuVElNRV9TQ0hFRFVMRV9MSU1JVFMKICAgIC8vICksIGVyci5JTlZBTElEX1RJTUVfRVZFTlRTX0xFTkdUSAogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIGxlbmd0aCBpcyBpbnZhbGlkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyNTgKICAgIC8vIHNlbGYuYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZCh0aW1lX2V2ZW50cykKICAgIGRpZyAzCiAgICBjYWxsc3ViIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjEyNwogICAgLy8gc2VsZi50aW1lX2V2ZW50cy52YWx1ZSA9IHRpbWVfZXZlbnRzLmNvcHkoKQogICAgYnl0ZWMgMjcgLy8gMHg3NDY5NmQ2NTQ1NzY2NTZlNzQ3MwogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlYyAyNyAvLyAweDc0Njk2ZDY1NDU3NjY1NmU3NDczCiAgICBkaWcgMQogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTI4LTEzMAogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgPSB0aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fT1BFTklOR19EQVRFX0lEWAogICAgLy8gXQogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDEKICAgIHB1c2hpbnQgMgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjEyOAogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgPSB0aW1lX2V2ZW50c1sKICAgIGJ5dGVjIDcgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjEyOC0xMzAKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlID0gdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX09QRU5JTkdfREFURV9JRFgKICAgIC8vIF0KICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMzEtMTMzCiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TVVJFX0RBVEVfSURYCiAgICAvLyBdCiAgICBkaWcgMQogICAgcHVzaGludCAxMAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjEzMQogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgPSB0aW1lX2V2ZW50c1sKICAgIGJ5dGVjIDI0IC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUiCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMzEtMTMzCiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TVVJFX0RBVEVfSURYCiAgICAvLyBdCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTM0CiAgICAvLyBzZWxmLmlzc3VhbmNlX2RhdGUgPSB0aW1lX2V2ZW50c1tjZmcuSVNTVUFOQ0VfREFURV9JRFhdCiAgICBkaWcgMQogICAgcHVzaGludCAxOAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDggLy8gImlzc3VhbmNlX2RhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTM1CiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSB0aW1lX2V2ZW50c1tjZmcuTUFUVVJJVFlfREFURV9JRFhdCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNCAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMzgKICAgIC8vIGFzc2VydCBub3QgdGltZV9wZXJpb2RzLmxlbmd0aCwgZXJyLklOVkFMSURfVElNRV9QRVJJT0RTCiAgICBkaWcgMQogICAgIQogICAgYXNzZXJ0IC8vIFRpbWUgcGVyaW9kcyBhcmUgbm90IHByb3Blcmx5IGRlZmluZWQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI2NQogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX0FDVElWRSkKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgMTAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1cy9wYW0ucHk6MjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKYXNzZXRfY29uZmlnX2Jvb2xfZmFsc2VANDoKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2V0X2NvbmZpZ19ib29sX21lcmdlQDUKCgovLyBtb2R1bGVzLmNvcmVfZmluYW5jaWFsLm5vX2NvdXBvbi5Ob0NvdXBvbkNhc2hmbG93TWl4aW4uZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWU6CiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDUKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvbm9fY291cG9uLnB5OjU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9ub19jb3Vwb24ucHk6NzgKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvbm9fY291cG9uLnB5Ojc4LTc5CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gYW5kIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID49IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICBieiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9ub19jb3Vwb24ucHk6NzkKICAgIC8vIGFuZCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICA+PQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9ub19jb3Vwb24ucHk6NzgtNzkKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIGJ6IGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUA0CiAgICBpbnRjXzEgLy8gMQoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX21lcmdlQDU6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weTo3Ny04MAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gICAgIGFuZCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gKSwgZXJyLk5PX1BSSU1BUllfRElTVFJJQlVUSU9OCiAgICBhc3NlcnQgLy8gUHJpbWFyeSBkaXN0cmlidXRpb24gbm90IHlldCBleGVjdXRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjMxCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSAxMAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9ub19jb3Vwb24ucHk6ODIKICAgIC8vIGFzc2VydCAwIDwgdW5pdHMgPD0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMsIGVyci5JTlZBTElEX1VOSVRTCiAgICBkdXAKICAgIGJ6IGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUA4CiAgICBkaWcgOAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMiAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxCiAgICA+PQogICAgYnogZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDgKICAgIGludGNfMSAvLyAxCgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfbWVyZ2VAOToKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvbm9fY291cG9uLnB5OjgyCiAgICAvLyBhc3NlcnQgMCA8IHVuaXRzIDw9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLCBlcnIuSU5WQUxJRF9VTklUUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYW1vdW50IG9mIHVuaXRzIGZvciB0aGUgYWNjb3VudAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9ub19jb3Vwb24ucHk6ODQKICAgIC8vIGFjY291bnRfdW5pdHNfbm9taW5hbF92YWx1ZSA9IHNlbGYuYWNjb3VudF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MsIHVuaXRzKQogICAgZHVwMgogICAgY2FsbHN1YiBhY2NvdW50X3VuaXRzX3ZhbHVlCiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9ub19jb3Vwb24ucHk6ODYKICAgIC8vIGFjY291bnRfdW5pdHNfbm9taW5hbF92YWx1ZSAqIHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50IC8vIGNzdC5CUFMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNSAvLyAicHJpbmNpcGFsX2Rpc2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW5jaXBhbF9kaXNjb3VudCBleGlzdHMKICAgIGRpZyAxCiAgICAqCiAgICBwdXNoaW50IDEwMDAwCiAgICAvCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weTo5MAogICAgLy8gYWNjb3VudF91bml0c19ub21pbmFsX3ZhbHVlIC0gYWNjb3VudF91bml0c19kaXNjb3VudAogICAgLQogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weTo5My05NAogICAgLy8gIyBBY2NydWluZyBpbnRlcmVzdCBkdXJpbmcgcHJpbWFyeSBkaXN0cmlidXRpb24gYW5kIGF0IG1hdHVyaXR5CiAgICAvLyBhY2NydWVkX2ludGVyZXN0ID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvbm9fY291cG9uLnB5Ojk1CiAgICAvLyBudW1lcmF0b3IgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9ub19jb3Vwb24ucHk6OTYKICAgIC8vIGRlbm9taW5hdG9yID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvbm9fY291cG9uLnB5OjMwLTMxCiAgICAvLyAjIFRoZSBjaGVjayBvbiBtYXR1cml0eSBkYXRlIGVuc3VyZXMgRC1BU0EgaGFzIGJlZW4gY29uZmlndXJlZCBhcyBibG9jayB0aW1lc3RhbXAgY2Fubm90IGJlIGxlc3MgdGhhbiAwIChpbml0KS4KICAgIC8vIHJldHVybiBzZWxmLmlzc3VhbmNlX2RhdGUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLm1hdHVyaXR5X2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA4IC8vICJpc3N1YW5jZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzc3VhbmNlX2RhdGUgZXhpc3RzCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGJ1cnkgNwogICAgPD0KICAgIGJ6IGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUAxNwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgIGRpZyA1CiAgICA+CiAgICBieiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VAMTcKICAgIGludGNfMSAvLyAxCgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfbWVyZ2VAMTg6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weTo5OC05OQogICAgLy8gIyBBY2NydWluZyBpbnRlcmVzdAogICAgLy8gaWYgc2VsZi5pc19hY2NydWluZ19pbnRlcmVzdCgpOgogICAgYnogZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weToxMDAKICAgIC8vIGRheV9jb3VudF9mYWN0b3IgPSBzZWxmLmRheV9jb3VudF9mYWN0b3IoKQogICAgY2FsbHN1YiBkYXlfY291bnRfZmFjdG9yCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weToxMDEKICAgIC8vIGFjY3J1ZWRfaW50ZXJlc3QgPSBzZWxmLmFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50KGhvbGRpbmdfYWRkcmVzcywgdW5pdHMpCiAgICBkaWcgMgogICAgZGlnIDIKICAgIGNhbGxzdWIgYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQKICAgIGJ1cnkgNwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9ub19jb3Vwb24ucHk6MTAyCiAgICAvLyBudW1lcmF0b3IgPSBkYXlfY291bnRfZmFjdG9yLm51bWVyYXRvcgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgNAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9ub19jb3Vwb24ucHk6MTAzCiAgICAvLyBkZW5vbWluYXRvciA9IGRheV9jb3VudF9mYWN0b3IuZGVub21pbmF0b3IKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnVyeSA0CgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2FmdGVyX2lmX2Vsc2VAMTE6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weToxMDUtMTA2CiAgICAvLyAjIFZhbHVlIGF0IG1hdHVyaXR5CiAgICAvLyBpZiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLm1hdHVyaXR5X2RhdGU6CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgPj0KICAgIGJ6IGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYWZ0ZXJfaWZfZWxzZUAxMwogICAgZGlnIDYKICAgIGJ1cnkgOAoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9ub19jb3Vwb24ucHk6MTEyLTExNQogICAgLy8gZGF5X2NvdW50X2ZhY3Rvcj10eXAuRGF5Q291bnRGYWN0b3IoCiAgICAvLyAgICAgbnVtZXJhdG9yPW51bWVyYXRvciwKICAgIC8vICAgICBkZW5vbWluYXRvcj1kZW5vbWluYXRvciwKICAgIC8vICksCiAgICBkaWcgMgogICAgaXRvYgogICAgZGlnIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9ub19jb3Vwb24ucHk6MTA5LTExNgogICAgLy8gcmV0dXJuIHR5cC5DdXJyZW50VW5pdHNWYWx1ZSgKICAgIC8vICAgICB1bml0c192YWx1ZT1hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWUsCiAgICAvLyAgICAgYWNjcnVlZF9pbnRlcmVzdD1hY2NydWVkX2ludGVyZXN0LAogICAgLy8gICAgIGRheV9jb3VudF9mYWN0b3I9dHlwLkRheUNvdW50RmFjdG9yKAogICAgLy8gICAgICAgICBudW1lcmF0b3I9bnVtZXJhdG9yLAogICAgLy8gICAgICAgICBkZW5vbWluYXRvcj1kZW5vbWluYXRvciwKICAgIC8vICAgICApLAogICAgLy8gKQogICAgZGlnIDgKICAgIGl0b2IKICAgIGRpZyA3CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9ub19jb3Vwb24ucHk6NTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDE3OgogICAgaW50Y18wIC8vIDAKICAgIGIgZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX21lcmdlQDE4CgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VAODoKICAgIGludGNfMCAvLyAwCiAgICBiIGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9tZXJnZUA5CgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VANDoKICAgIGludGNfMCAvLyAwCiAgICBiIGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9tZXJnZUA1CgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5ub19jb3Vwb24uTm9Db3Vwb25DYXNoZmxvd01peGluLmdldF9wYXltZW50X2Ftb3VudFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9wYXltZW50X2Ftb3VudDoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvbm9fY291cG9uLnB5OjExOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozMQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvbm9fY291cG9uLnB5OjEzNAogICAgLy8gcHJpbmNpcGFsX2Ftb3VudCA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gZW5tLlNUQVRVU19BQ1RJVkUKICAgIGR1cAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgMTAwCiAgICA9PQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9ub19jb3Vwb24ucHk6MTM1CiAgICAvLyBpZiBzZWxmLnN0YXR1c19pc19hY3RpdmUoKToKICAgIGJ6IGdldF9wYXltZW50X2Ftb3VudF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvbm9fY291cG9uLnB5OjEzNgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudCA9IHNlbGYuYWNjb3VudF90b3RhbF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MpCiAgICBkaWcgMQogICAgY2FsbHN1YiBhY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlCiAgICBidXJ5IDEKCmdldF9wYXltZW50X2Ftb3VudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weToxMzcKICAgIC8vIHJldHVybiB0eXAuUGF5bWVudEFtb3VudHMoaW50ZXJlc3Q9VUludDY0KDApLCBwcmluY2lwYWw9cHJpbmNpcGFsX2Ftb3VudCkKICAgIGludGNfMCAvLyAwCiAgICBpdG9iCiAgICBkaWcgMQogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weToxMTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucGF5bWVudF9hZ2VudC5wcmluY2lwYWwuUHJpbmNpcGFsUGF5bWVudEFnZW50TWl4aW4ucGF5X3ByaW5jaXBhbFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnBheV9wcmluY2lwYWw6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvcHJpbmNpcGFsLnB5OjMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cG4gMgogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBlbm0uU1RBVFVTX0FDVElWRQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDEwMAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXMvcGFtLnB5OjE2LTE3CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgcmVzdHJpY3QgY2FsbGVyIGF1dGhvcml6YXRpb24KICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1c19pc19hY3RpdmUoKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjdHVzL3BhbS5weToxOAogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzL3BhbS5weToxOQogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWN0dXMvcGFtLnB5OjIxCiAgICAvLyB1bml0cyA9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIGludGNfMiAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvYWN0dXMvcGFtLnB5OjIyCiAgICAvLyBhc3NlcnQgdW5pdHMgPiAwLCBlcnIuTk9fVU5JVFMKICAgIGFzc2VydCAvLyBObyBELUFTQSB1bml0cwogICAgLy8gbW9kdWxlcy9hY3R1cy9wYW0ucHk6MjMKICAgIC8vIGFzc2VydCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLm1hdHVyaXR5X2RhdGUsIGVyci5OT1RfTUFUVVJFCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgbWF0dXJlCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weTo1MwogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudF90b3RhbF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MpCiAgICBjYWxsc3ViIGFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MTMKICAgIC8vIGlmIHNlbGYub3BfZGFlbW9uLnZhbHVlICE9IEdsb2JhbC56ZXJvX2FkZHJlc3M6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gMHg1MjMyMzUyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wX2RhZW1vbiBleGlzdHMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGJ6IHBheV9wcmluY2lwYWxfYWZ0ZXJfaWZfZWxzZUAyMgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weToxNQogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE5IC8vIDB4NTIzMjM1MjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcF9kYWVtb24gZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weToxNS0xNwogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICBibnogcGF5X3ByaW5jaXBhbF9ib29sX3RydWVAMTkKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MTYKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgNAogICAgPT0KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MTUtMTcKICAgIC8vIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICAvLyBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgYm56IHBheV9wcmluY2lwYWxfYm9vbF90cnVlQDE5CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjE3CiAgICAvLyBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgdHhuIFNlbmRlcgogICAgZGlnIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgMzIKICAgID09CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjE1LTE3CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIGJ6IHBheV9wcmluY2lwYWxfYm9vbF9mYWxzZUAyMAoKcGF5X3ByaW5jaXBhbF9ib29sX3RydWVAMTk6CiAgICBpbnRjXzEgLy8gMQoKcGF5X3ByaW5jaXBhbF9ib29sX21lcmdlQDIxOgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weToxNC0xOAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyAgICAgb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vICAgICBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgLy8gKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCgpwYXlfcHJpbmNpcGFsX2FmdGVyX2lmX2Vsc2VAMjI6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjIyCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MuaXNfb3B0ZWRfaW4oCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCAzMgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weToyMwogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MjItMjQKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5pc19vcHRlZF9pbigKICAgIC8vICAgICBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQKICAgIC8vICkKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjIyLTI1CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MuaXNfb3B0ZWRfaW4oCiAgICAvLyAgICAgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkCiAgICAvLyApCiAgICAvLyBhbmQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZAogICAgYnogcGF5X3ByaW5jaXBhbF9ib29sX2ZhbHNlQDI3CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjI1CiAgICAvLyBhbmQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZAogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQ0OAogICAgZ2V0Yml0CiAgICBibnogcGF5X3ByaW5jaXBhbF9ib29sX2ZhbHNlQDI3CiAgICBpbnRjXzEgLy8gMQoKcGF5X3ByaW5jaXBhbF9ib29sX21lcmdlQDI4OgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L3ByaW5jaXBhbC5weTo1NgogICAgLy8gaWYgc2VsZi5pc19wYXltZW50X2V4ZWN1dGFibGUoaG9sZGluZ19hZGRyZXNzKToKICAgIGJ6IHBheV9wcmluY2lwYWxfZWxzZV9ib2R5QDMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MzAKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICBzd2FwCiAgICBkaWcgMQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBvcHRlZCBpbnRvIGFzc2V0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjMwLTMxCiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgLy8gPj0gcGF5bWVudF9hbW91bnQKICAgIGRpZyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgID49CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjI5LTMyCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICAvLyAgICAgPj0gcGF5bWVudF9hbW91bnQKICAgIC8vICksIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcyBmb3IgdGhlIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9wcmluY2lwYWwucHk6NTktNjAKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgdGhlIHNhbWUgYXNzZXQgZm9yIGRlbm9taW5hdGlvbiBhbmQgc2V0dGxlbWVudCwgbm8gY29udmVyc2lvbiBuZWVkZWQKICAgIC8vIHNlbGYucGF5KHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcywgcGF5bWVudF9hbW91bnQpCiAgICBkaWcgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCAzMgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weTozNS00MAogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXJlY2VpdmVyLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1hbW91bnQsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MzkKICAgIC8vIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgc3dhcAogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MzUKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MzUtNDAKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1yZWNlaXZlciwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9YW1vdW50LAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAoKcGF5X3ByaW5jaXBhbF9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxOTkKICAgIC8vIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgLT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGRpZyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzIgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICAtCiAgICBieXRlY18zIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyMDAKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBpdG9iCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMzIKICAgIGRpZyAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MjAxCiAgICAvLyBzZWxmLmVuZF9pZl9ub19jaXJjdWxhdGluZ191bml0cygpCiAgICBjYWxsc3ViIGVuZF9pZl9ub19jaXJjdWxhdGluZ191bml0cwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L3ByaW5jaXBhbC5weToxNwogICAgLy8gY29udHJhY3RfaWQ9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25faWQuaWQsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uSUQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9wcmluY2lwYWwucHk6MjAKICAgIC8vIHRpbWU9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvcHJpbmNpcGFsLnB5OjIyCiAgICAvLyBjdXJyZW5jeV9pZD1zZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZC5pZCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMiAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9wcmluY2lwYWwucHk6MjMKICAgIC8vIGN1cnJlbmN5X3VuaXQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQudW5pdF9uYW1lLAogICAgZHVwCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9wcmluY2lwYWwucHk6MjQKICAgIC8vIG5vbWluYWxfdmFsdWU9c2VsZi5jaXJjdWxhdGluZ191bml0cyAqIHNlbGYudW5pdF92YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJ1bml0X3ZhbHVlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnVuaXRfdmFsdWUgZXhpc3RzCiAgICAqCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvcHJpbmNpcGFsLnB5OjE2LTI3CiAgICAvLyBFdmVudCgKICAgIC8vICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICB0eXBlPWFyYzQuVUludDgoZW51bXMuRVZUX1RZUEVfUFIpLAogICAgLy8gICAgIHR5cGVfbmFtZT1TdHJpbmcoIlBSIiksCiAgICAvLyAgICAgdGltZT1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICBwYXlvZmY9cGF5b2ZmLAogICAgLy8gICAgIGN1cnJlbmN5X2lkPXNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkLmlkLAogICAgLy8gICAgIGN1cnJlbmN5X3VuaXQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQudW5pdF9uYW1lLAogICAgLy8gICAgIG5vbWluYWxfdmFsdWU9c2VsZi5jaXJjdWxhdGluZ191bml0cyAqIHNlbGYudW5pdF92YWx1ZSwKICAgIC8vICAgICBub21pbmFsX3JhdGVfYnBzPWFyYzQuVUludDE2KDApLAogICAgLy8gICAgIG5vbWluYWxfYWNjcnVlZD1VSW50NjQoMCksCiAgICAvLyApCiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIHB1c2hieXRlcyAweDAzMDAzNwogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZGlnIDUKICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHVuY292ZXIgNAogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgMwogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHN3YXAKICAgIHB1c2hieXRlcyAweDAwM2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9wcmluY2lwYWwucHk6MjUKICAgIC8vIG5vbWluYWxfcmF0ZV9icHM9YXJjNC5VSW50MTYoMCksCiAgICBieXRlYyAzMCAvLyAweDAwMDAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9wcmluY2lwYWwucHk6MTYtMjcKICAgIC8vIEV2ZW50KAogICAgLy8gICAgIGNvbnRyYWN0X2lkPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2lkLmlkLAogICAgLy8gICAgIHR5cGU9YXJjNC5VSW50OChlbnVtcy5FVlRfVFlQRV9QUiksCiAgICAvLyAgICAgdHlwZV9uYW1lPVN0cmluZygiUFIiKSwKICAgIC8vICAgICB0aW1lPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gICAgIHBheW9mZj1wYXlvZmYsCiAgICAvLyAgICAgY3VycmVuY3lfaWQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQuaWQsCiAgICAvLyAgICAgY3VycmVuY3lfdW5pdD1zZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZC51bml0X25hbWUsCiAgICAvLyAgICAgbm9taW5hbF92YWx1ZT1zZWxmLmNpcmN1bGF0aW5nX3VuaXRzICogc2VsZi51bml0X3ZhbHVlLAogICAgLy8gICAgIG5vbWluYWxfcmF0ZV9icHM9YXJjNC5VSW50MTYoMCksCiAgICAvLyAgICAgbm9taW5hbF9hY2NydWVkPVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDAwMDI1MDUyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L3ByaW5jaXBhbC5weToxNS0yOAogICAgLy8gYXJjNC5lbWl0KAogICAgLy8gICAgIEV2ZW50KAogICAgLy8gICAgICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICAgICAgdHlwZT1hcmM0LlVJbnQ4KGVudW1zLkVWVF9UWVBFX1BSKSwKICAgIC8vICAgICAgICAgdHlwZV9uYW1lPVN0cmluZygiUFIiKSwKICAgIC8vICAgICAgICAgdGltZT1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICAgICAgcGF5b2ZmPXBheW9mZiwKICAgIC8vICAgICAgICAgY3VycmVuY3lfaWQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQuaWQsCiAgICAvLyAgICAgICAgIGN1cnJlbmN5X3VuaXQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQudW5pdF9uYW1lLAogICAgLy8gICAgICAgICBub21pbmFsX3ZhbHVlPXNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKiBzZWxmLnVuaXRfdmFsdWUsCiAgICAvLyAgICAgICAgIG5vbWluYWxfcmF0ZV9icHM9YXJjNC5VSW50MTYoMCksCiAgICAvLyAgICAgICAgIG5vbWluYWxfYWNjcnVlZD1VSW50NjQoMCksCiAgICAvLyAgICAgKQogICAgLy8gKQogICAgcHVzaGJ5dGVzIDB4OGMyOTkwNGUgLy8gbWV0aG9kICJFdmVudCh1aW50NjQsdWludDgsc3RyaW5nLHVpbnQ2NCx1aW50NjQsdWludDY0LGJ5dGVbXSx1aW50NjQsdWludDE2LHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L3ByaW5jaXBhbC5weTo2OQogICAgLy8gdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L3ByaW5jaXBhbC5weTo2Ny03MQogICAgLy8gcmV0dXJuIHR5cC5QYXltZW50UmVzdWx0KAogICAgLy8gICAgIGFtb3VudD1wYXltZW50X2Ftb3VudCwKICAgIC8vICAgICB0aW1lc3RhbXA9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgY29udGV4dD1wYXltZW50X2luZm8sICAjIFRPRE86IEFkZCBpbmZvIG9uIGZhaWxlZCBwYXltZW50CiAgICAvLyApCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyAzCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgcHVzaGJ5dGVzIDB4MDAxMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9wcmluY2lwYWwucHk6MzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKcGF5X3ByaW5jaXBhbF9lbHNlX2JvZHlAMzoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9wcmluY2lwYWwucHk6NjItNjMKICAgIC8vICMgQWNjb3VudHMgc3VzcGVuZGVkIG9yIG5vdCBvcHRlZCBpbiBhdCB0aGUgdGltZSBvZiBwYXltZW50cyBtdXN0IG5vdCBzdGFsbCB0aGUgRC1BU0EKICAgIC8vIHBheW1lbnRfYW1vdW50ID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDEKICAgIGIgcGF5X3ByaW5jaXBhbF9hZnRlcl9pZl9lbHNlQDQKCnBheV9wcmluY2lwYWxfYm9vbF9mYWxzZUAyNzoKICAgIGludGNfMCAvLyAwCiAgICBiIHBheV9wcmluY2lwYWxfYm9vbF9tZXJnZUAyOAoKcGF5X3ByaW5jaXBhbF9ib29sX2ZhbHNlQDIwOgogICAgaW50Y18wIC8vIDAKICAgIGIgcGF5X3ByaW5jaXBhbF9ib29sX21lcmdlQDIxCgoKLy8gbW9kdWxlcy50cmFuc2Zlcl9hZ2VudC5ub19jb3Vwb24uTm9Db3Vwb25UcmFuc2ZlckFnZW50TWl4aW4uYXNzZXRfdHJhbnNmZXJbcm91dGluZ10oKSAtPiB2b2lkOgphc3NldF90cmFuc2ZlcjoKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDIKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50L25vX2NvdXBvbi5weTo5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBlbm0uU1RBVFVTX0FDVElWRQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDEwMAogICAgPT0KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE1My0xNTgKICAgIC8vIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpCiAgICAvLyBhbmQgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gYW5kICgKICAgIC8vICAgICBub3Qgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgLy8gICAgIG9yIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDwgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgLy8gKQogICAgYnogYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUA2CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNTQKICAgIC8vIGFuZCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIGV4aXN0cwogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPD0KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE1My0xNTgKICAgIC8vIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpCiAgICAvLyBhbmQgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gYW5kICgKICAgIC8vICAgICBub3Qgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgLy8gICAgIG9yIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDwgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgLy8gKQogICAgYnogYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUA2CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNTYKICAgIC8vIG5vdCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNTYtMTU3CiAgICAvLyBub3Qgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgLy8gb3IgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICBieiBhc3NldF90cmFuc2Zlcl9ib29sX3RydWVANQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTU3CiAgICAvLyBvciBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIDwKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE1Ni0xNTcKICAgIC8vIG5vdCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICAvLyBvciBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VANgoKYXNzZXRfdHJhbnNmZXJfYm9vbF90cnVlQDU6CiAgICBpbnRjXzEgLy8gMQoKYXNzZXRfdHJhbnNmZXJfYm9vbF9tZXJnZUA3OgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTUyLTE1OQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnN0YXR1c19pc19hY3RpdmUoKQogICAgLy8gICAgIGFuZCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgYW5kICgKICAgIC8vICAgICAgICAgbm90IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIC8vICAgICAgICAgb3IgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICAvLyAgICAgKQogICAgLy8gKSwgZXJyLlNFQ09OREFSWV9NQVJLRVRfQ0xPU0VECiAgICBhc3NlcnQgLy8gU2Vjb25kYXJ5IG1hcmtldCBpcyBjbG9zZWQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE2OS0xNzEKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBncmFudHMgdHJhbnNmZXIgcmlnaHQgdG8gRC1BU0Egb3duZXJzLiBPdGhlciBpbXBsZW1lbnRhdGlvbnMgbWF5IHJlbGF5IG9uIG90aGVyCiAgICAvLyAjIHJvbGVzLCBleHRlcm5hbCBBcHBzIHRocm91Z2ggQzJDIGNhbGxzIChlLmcuLCBhbiBvcmRlciBib29rKSwgb3Igb2ZmLWNoYWluIHRyYW5zZmVyIGFnZW50cy4KICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIGRpZyAzCiAgICBkdXAKICAgIGNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE3MgogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNzMKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjMxCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA5CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgMTAKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTc2CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQoc2VuZGVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGRpZyAzCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE3NwogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGRpZyAxCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE5MAogICAgLy8gYXNzZXJ0IHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MgIT0gcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzLCBlcnIuU0VMRl9UUkFOU0ZFUgogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgICE9CiAgICBhc3NlcnQgLy8gU2VuZGVyIGFuZCByZWNlaXZlciBtdXN0IGJlIGRpZmZlcmVudAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTkxCiAgICAvLyBhc3NlcnQgdW5pdHMgPiAwLCBlcnIuTlVMTF9UUkFOU0ZFUgogICAgZGlnIDIKICAgIGR1cAogICAgYXNzZXJ0IC8vIFRyYW5zZmVyIHVuaXRzIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE5MgogICAgLy8gYXNzZXJ0IHVuaXRzIDw9IHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cywgZXJyLk9WRVJfVFJBTlNGRVIKICAgIHVuY292ZXIgMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGR1cAogICAgaW50Y18yIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgdW5jb3ZlciAyCiAgICA+PQogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCBzZW5kZXIgdW5pdHMgdG8gdHJhbnNmZXIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo2MwogICAgLy8gc2VuZGVyX3VuaXRfdmFsdWUgPSBzZWxmLmFjY291bnRbc2VuZGVyXS51bml0X3ZhbHVlCiAgICBleHRyYWN0IDQwIDgKICAgIGJ1cnkgOQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjY0CiAgICAvLyBpZiBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnVuaXRzID4gVUludDY0KDApOgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMiAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Vsc2VfYm9keUA5CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NTgKICAgIC8vIHNlbGYuYWNjb3VudFtzZW5kZXJdLnVuaXRfdmFsdWUgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS51bml0X3ZhbHVlCiAgICBkaWcgNgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHB1c2hpbnQgNDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgNgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHB1c2hpbnQgNDAKICAgIGV4dHJhY3RfdWludDY0CiAgICA9PQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjU4LTU5CiAgICAvLyBzZWxmLmFjY291bnRbc2VuZGVyXS51bml0X3ZhbHVlID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0udW5pdF92YWx1ZQogICAgLy8gYW5kIHNlbGYuYWNjb3VudFtzZW5kZXJdLnBhaWRfY291cG9ucyA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnBhaWRfY291cG9ucwogICAgYnogYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUAyMAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjU5CiAgICAvLyBhbmQgc2VsZi5hY2NvdW50W3NlbmRlcl0ucGFpZF9jb3Vwb25zID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0ucGFpZF9jb3Vwb25zCiAgICBkaWcgNgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHB1c2hpbnQgNDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgNgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHB1c2hpbnQgNDgKICAgIGV4dHJhY3RfdWludDY0CiAgICA9PQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjU4LTU5CiAgICAvLyBzZWxmLmFjY291bnRbc2VuZGVyXS51bml0X3ZhbHVlID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0udW5pdF92YWx1ZQogICAgLy8gYW5kIHNlbGYuYWNjb3VudFtzZW5kZXJdLnBhaWRfY291cG9ucyA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnBhaWRfY291cG9ucwogICAgYnogYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUAyMAogICAgaW50Y18xIC8vIDEKCmFzc2V0X3RyYW5zZmVyX2Jvb2xfbWVyZ2VAMjE6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NTctNjAKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50W3NlbmRlcl0udW5pdF92YWx1ZSA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnVuaXRfdmFsdWUKICAgIC8vICAgICBhbmQgc2VsZi5hY2NvdW50W3NlbmRlcl0ucGFpZF9jb3Vwb25zID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0ucGFpZF9jb3Vwb25zCiAgICAvLyApLCBlcnIuTk9OX0ZVTkdJQkxFX1VOSVRTCiAgICBhc3NlcnQgLy8gU2VuZGVyIGFuZCByZWNlaXZlciB1bml0cyBhcmUgbm90IGZ1bmdpYmxlCgphc3NldF90cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDEwOgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC9ub19jb3Vwb24ucHk6NDUtNDYKICAgIC8vICMgVHJhbnNmZXJyZWQgdW5pdHMgdmFsdWUgKG11c3QgYmUgY29tcHV0ZWQgYmVmb3JlIHRoZSB0cmFuc2ZlcikKICAgIC8vIHNlbmRlcl91bml0X3ZhbHVlID0gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRfdmFsdWUKICAgIGRpZyA2CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnVyeSA1CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weTo0OQogICAgLy8gcmV0dXJuIHNlbGYuYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQoc2VuZGVyX2hvbGRpbmdfYWRkcmVzcywgdW5pdHMpCiAgICBkaWcgMwogICAgZGlnIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgY2FsbHN1YiBhY2NydWVkX2ludGVyZXN0X2Ftb3VudAogICAgYnVyeSA3CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzEKICAgIC8vIGFzc2VydCB1bml0cyA8PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cywgZXJyLk9WRVJfVFJBTlNGRVIKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgaW50Y18yIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwMgogICAgPD0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgc2VuZGVyIHVuaXRzIHRvIHRyYW5zZmVyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzIKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzIC09IHVuaXRzCiAgICBzd2FwCiAgICAtCiAgICBpdG9iCiAgICBkaWcgMQogICAgaW50Y18yIC8vIDMyCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NTIKICAgIC8vIGlmIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzID09IFVJbnQ2NCgwKToKICAgIGJveF9nZXQKICAgIHBvcAogICAgaW50Y18yIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYm56IGFzc2V0X3RyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMTYKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo1MwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdF92YWx1ZSA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGl0b2IKICAgIGRpZyA3CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgNDAKICAgIGRpZyAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjU0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMgPSBVSW50NjQoMCkKICAgIHB1c2hpbnQgNDgKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCgphc3NldF90cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDE2OgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojc2CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyArPSB1bml0cwogICAgZGlnIDUKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMiAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgICsKICAgIGl0b2IKICAgIHVuY292ZXIgMgogICAgaW50Y18yIC8vIDMyCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50L25vX2NvdXBvbi5weTo1MgogICAgLy8gcmV0dXJuIHVuaXRzICogc2VuZGVyX3VuaXRfdmFsdWUgKyBhY2NydWVkX2ludGVyZXN0CiAgICBkaWcgNAogICAgKgogICAgZGlnIDUKICAgICsKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQvbm9fY291cG9uLnB5OjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUAyMDoKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2V0X3RyYW5zZmVyX2Jvb2xfbWVyZ2VAMjEKCmFzc2V0X3RyYW5zZmVyX2Vsc2VfYm9keUA5OgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjY3CiAgICAvLyBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnVuaXRfdmFsdWUgPSBzZW5kZXJfdW5pdF92YWx1ZQogICAgZGlnIDUKICAgIGR1cAogICAgcHVzaGludCA0MAogICAgZGlnIDEwCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjY4CiAgICAvLyBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnBhaWRfY291cG9ucyA9IHNlbGYuYWNjb3VudFtzZW5kZXJdLnBhaWRfY291cG9ucwogICAgZGlnIDcKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDQ4IDgKICAgIHB1c2hpbnQgNDgKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICBiIGFzc2V0X3RyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMTAKCmFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VANjoKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2V0X3RyYW5zZmVyX2Jvb2xfbWVyZ2VANwoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY29tbW9uLkNvcmVGaW5hbmNpYWxDb21tb25NaXhpbi5hc3NldF9jcmVhdGVbcm91dGluZ10oKSAtPiB2b2lkOgphc3NldF9jcmVhdGU6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyNjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgZGlnIDEKICAgIHB1c2hpbnQgMzgKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIHR1cGxlIGVuY29kaW5nCiAgICBkdXAKICAgIHB1c2hpbnQgNDAKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCB0YWlsIHBvaW50ZXIgYXQgaW5kZXggNyBvZiAodWludDgsdWludDgsdWludDgsdWludDgsdWludDgsdWludDgsdWludDhbMzJdLChsZW4rdXRmOFtdKSkKICAgIGRpZyAyCiAgICBzd2FwCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgNDIKICAgICsKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuQXNzZXRNZXRhZGF0YQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6Mjc2CiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gYXJyYW5nZXIKICAgIGJ5dGVjIDUgLy8gMHg1MjMyMzAyMwogICAgdW5jb3ZlciAyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6Mjc3CiAgICAvLyBzZWxmLm1ldGFkYXRhID0gbWV0YWRhdGEuYnl0ZXMKICAgIGJ5dGVjIDIzIC8vICJtZXRhZGF0YSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyNjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY29tbW9uLkNvcmVGaW5hbmNpYWxDb21tb25NaXhpbi5hc3NldF91cGRhdGVbcm91dGluZ10oKSAtPiB2b2lkOgphc3NldF91cGRhdGU6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyNzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBkaWcgMQogICAgcHVzaGludCAzOAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgdHVwbGUgZW5jb2RpbmcKICAgIGR1cAogICAgcHVzaGludCA0MAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHRhaWwgcG9pbnRlciBhdCBpbmRleCA3IG9mICh1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OFszMl0sKGxlbit1dGY4W10pKQogICAgZGlnIDIKICAgIHN3YXAKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCA0MgogICAgKwogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5Bc3NldE1ldGFkYXRhCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyODQtMjg3CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gZ3JhbnRzIHRoZSB1cGRhdGUgcGVybWlzc2lvbnMgdG8gdGhlIEFycmFuZ2VyLgogICAgLy8gIyBPdGhlciBpbXBsZW1lbnRhdGlvbnMgbWF5IGRpc2FibGUgRC1BU0EgYXBwbGljYXRpb24gdXBkYXRhYmlsaXR5IG9yIGNoYW5nZSBpdHMgYXV0aG9yaXphdGlvbnMuCiAgICAvLyAjIOKaoO+4jyBXQVJOSU5HOiBBcHBsaWNhdGlvbiB1cGRhdGVzIG11c3QgYmUgZXhlY3V0ZWQgVkVSWSBjYXJlZnVsbHksIGFzIHRoZXkgbWlnaHQgaW50cm9kdWNlIGJyZWFraW5nIGNoYW5nZXMuCiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyODgKICAgIC8vIHNlbGYubWV0YWRhdGEgPSBtZXRhZGF0YS5ieXRlcwogICAgYnl0ZWMgMjMgLy8gIm1ldGFkYXRhIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI3OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY29tbW9uLkNvcmVGaW5hbmNpYWxDb21tb25NaXhpbi5zZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzW3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50czoKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyOTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgcHVzaGludCAyCiAgICArCiAgICB1bmNvdmVyIDIKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PHVpbnQ2ND4KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMxMQogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI4CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gZW5tLlNUQVRVU19FTkRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBpbnRjIDQgLy8gMjAwCiAgICA9PQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzEyCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuc3RhdHVzX2lzX2VuZGVkKCksIGVyci5VTkFVVEhPUklaRUQKICAgICEKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzEzCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMxNQogICAgLy8gYXNzZXJ0IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHMubGVuZ3RoID49IDEsIGVyci5JTlZBTElEX1RJTUVfRVZFTlRTX0xFTkdUSAogICAgZHVwCiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbGVuZ3RoIGlzIGludmFsaWQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMxNgogICAgLy8gaWYgc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50cy5sZW5ndGggPiAxOgogICAgaW50Y18xIC8vIDEKICAgID4KICAgIGJ6IHNldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMTcKICAgIC8vIHNlbGYuYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZChzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzKQogICAgZHVwCiAgICBjYWxsc3ViIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQKICAgIGJ1cnkgMQoKc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50c19hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMjAKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDggLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMyMQogICAgLy8gPD0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1tjZmcuU0VDT05EQVJZX01BUktFVF9PUEVOSU5HX0RBVEVfSURYXQogICAgZGlnIDEKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGJ1cnkgNAogICAgcHVzaGludCAyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzIwLTMyMQogICAgLy8gc2VsZi5pc3N1YW5jZV9kYXRlCiAgICAvLyA8PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzW2NmZy5TRUNPTkRBUllfTUFSS0VUX09QRU5JTkdfREFURV9JRFhdCiAgICBzd2FwCiAgICBkaWcgMQogICAgPD0KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMxOS0zMjIKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5pc3N1YW5jZV9kYXRlCiAgICAvLyAgICAgPD0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1tjZmcuU0VDT05EQVJZX01BUktFVF9PUEVOSU5HX0RBVEVfSURYXQogICAgLy8gKSwgZXJyLklOVkFMSURfU0VDT05EQVJZX09QRU5JTkdfREFURQogICAgYXNzZXJ0IC8vIEludmFsaWQgc2Vjb25kYXJ5IG1hcmtldCBvcGVuaW5nIGRhdGUKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMyMwogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICBieXRlYyAxNiAvLyAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMjMtMzI1CiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlID0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyBdCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzI2CiAgICAvLyBpZiBzZWxmLm1hdHVyaXR5X2RhdGU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgYnogc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50c19hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMyOAogICAgLy8gc2VsZi5tYXR1cml0eV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzI5CiAgICAvLyA+PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzW2NmZy5TRUNPTkRBUllfTUFSS0VUX0NMT1NVUkVfREFURV9JRFhdCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgZGlnIDMKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMjgtMzI5CiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUKICAgIC8vID49IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWF0KICAgIHN3YXAKICAgIGRpZyAxCiAgICA+PQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzI3LTMzMAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLm1hdHVyaXR5X2RhdGUKICAgIC8vICAgICA+PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzW2NmZy5TRUNPTkRBUllfTUFSS0VUX0NMT1NVUkVfREFURV9JRFhdCiAgICAvLyApLCBlcnIuSU5WQUxJRF9TRUNPTkRBUllfQ0xPU1VSRV9EQVRFCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzZWNvbmRhcnkgbWFya2V0IGNsb3N1cmUgZGF0ZQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzMxCiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlID0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIGJ5dGVjIDkgLy8gInNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzMxLTMzMwogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSA9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gXQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCnNldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzM1CiAgICAvLyBzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZT1zZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMzNgogICAgLy8gc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGU9c2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMzNC0zMzcKICAgIC8vIHJldHVybiB0eXAuU2Vjb25kYXJ5TWFya2V0U2NoZWR1bGUoCiAgICAvLyAgICAgc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGU9c2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSwKICAgIC8vICAgICBzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZT1zZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlLAogICAgLy8gKQogICAgc3dhcAogICAgaXRvYgogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyOTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY29tbW9uLkNvcmVGaW5hbmNpYWxDb21tb25NaXhpbi5zZXRfZGVmYXVsdF9zdGF0dXNbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfZGVmYXVsdF9zdGF0dXM6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo3NAogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYudHJ1c3RlZSwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDE3IC8vIDB4NTIzNjMwMjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjM1MgogICAgLy8gc2VsZi5hc3NldF9kZWZhdWx0ZWQgPSBkZWZhdWx0ZWQKICAgIGJ5dGVjIDIxIC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzUzCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMzOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb21tb24uQ29yZUZpbmFuY2lhbENvbW1vbk1peGluLnByaW1hcnlfZGlzdHJpYnV0aW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcHJpbWFyeV9kaXN0cmlidXRpb246CiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjM1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGVubS5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgMTAwCiAgICA9PQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTQ1LTE0OAogICAgLy8gc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCkKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VANQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTQ2CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTQ3CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZHVwCiAgICBidXJ5IDUKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE0Ni0xNDcKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIDw9CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNDYtMTQ4CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDUKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE0OAogICAgLy8gPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI0IC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTQ3LTE0OAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGRpZyAzCiAgICA+CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNDYtMTQ4CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDUKICAgIGludGNfMSAvLyAxCgpwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX21lcmdlQDY6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNDQtMTQ5CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpCiAgICAvLyAgICAgYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICAvLyApLCBlcnIuUFJJTUFSWV9ESVNUUklCVVRJT05fQ0xPU0VECiAgICBhc3NlcnQgLy8gUHJpbWFyeSBkaXN0cmlidXRpb24gaXMgY2xvc2VkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzEKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnByaW1hcnlfZGVhbGVyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMTggLy8gMHg1MjM1MzAyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjMxCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzgzCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjM4NAogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozODUKICAgIC8vIGFzc2VydCB1bml0cyA+IDAsIGVyci5aRVJPX1VOSVRTCiAgICBkaWcgMQogICAgZHVwCiAgICBhc3NlcnQgLy8gQ2FuIG5vdCBkaXN0cmlidXRlIHplcm8gdW5pdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjM4NgogICAgLy8gYXNzZXJ0IHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKyB1bml0cyA8PSBzZWxmLnRvdGFsX3VuaXRzLCBlcnIuT1ZFUl9ESVNUUklCVVRJT04KICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGRpZyAxCiAgICArCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgZGlnIDEKICAgID49CiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IHJlbWFpbmluZyBELUFTQSB1bml0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6Mzg4CiAgICAvLyBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICs9IHVuaXRzCiAgICBieXRlY18zIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6Mzg5CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyArPSB1bml0cwogICAgZGlnIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzIgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICB1bmNvdmVyIDIKICAgICsKICAgIGl0b2IKICAgIGRpZyAyCiAgICBpbnRjXzIgLy8gMzIKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjM5MAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdF92YWx1ZSA9IHNlbGYudW5pdF92YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gInVuaXRfdmFsdWUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudW5pdF92YWx1ZSBleGlzdHMKICAgIGl0b2IKICAgIHVuY292ZXIgMgogICAgcHVzaGludCA0MAogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzkxCiAgICAvLyByZXR1cm4gc2VsZi50b3RhbF91bml0cyAtIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICBzd2FwCiAgICAtCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozNTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUA1OgogICAgaW50Y18wIC8vIDAKICAgIGIgcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9tZXJnZUA2CgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb21tb24uQ29yZUZpbmFuY2lhbENvbW1vbk1peGluLmdldF9hc3NldF9pbmZvW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2Fzc2V0X2luZm86CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MDMKICAgIC8vIHBlcmZvcm1hbmNlID0gVUludDY0KGNzdC5QUkZfUEVSRk9STUFOVCkKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MDQKICAgIC8vIGlmIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID4gc2VsZi5tYXR1cml0eV9kYXRlID4gMDoKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJtYXR1cml0eV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgY292ZXIgMwogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgID4KICAgIGJ6IGdldF9hc3NldF9pbmZvX2FmdGVyX2lmX2Vsc2VANAogICAgZHVwCiAgICBieiBnZXRfYXNzZXRfaW5mb19hZnRlcl9pZl9lbHNlQDQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQwNQogICAgLy8gcGVyZm9ybWFuY2UgPSBVSW50NjQoY3N0LlBSRl9NQVRVUkVEKQogICAgcHVzaGludCA0CiAgICBidXJ5IDIKCmdldF9hc3NldF9pbmZvX2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQwNi00MDcKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgbm8gZ3JhY2Ugb3IgZGVsaW5xdWVuY3kgcGVyaW9kcwogICAgLy8gaWYgc2VsZi5hc3NldF9kZWZhdWx0ZWQ6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjEgLy8gImFzc2V0X2RlZmF1bHRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9kZWZhdWx0ZWQgZXhpc3RzCiAgICBieiBnZXRfYXNzZXRfaW5mb19hZnRlcl9pZl9lbHNlQDYKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQwOAogICAgLy8gcGVyZm9ybWFuY2UgPSBVSW50NjQoY3N0LlBSRl9ERUZBVUxURUQpCiAgICBwdXNoaW50IDMKICAgIGJ1cnkgMgoKZ2V0X2Fzc2V0X2luZm9fYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDExCiAgICAvLyBkZW5vbWluYXRpb25fYXNzZXRfaWQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQuaWQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjIgLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MTIKICAgIC8vIHNldHRsZW1lbnRfYXNzZXRfaWQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLmlkLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NDUKICAgIC8vIHJldHVybiBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICogc2VsZi51bml0X3ZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAidW5pdF92YWx1ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi51bml0X3ZhbHVlIGV4aXN0cwogICAgZHVwMgogICAgKgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDE1CiAgICAvLyBkYXlfY291bnRfY29udmVudGlvbj1hcmM0LlVJbnQ4KHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24pLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kYXlfY291bnRfY29udmVudGlvbiBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzMgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQxNgogICAgLy8gcHJpbmNpcGFsX2Rpc2NvdW50PWFyYzQuVUludDE2KHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50KSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNSAvLyAicHJpbmNpcGFsX2Rpc2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW5jaXBhbF9kaXNjb3VudCBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBwdXNoaW50IDE2CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBleHRyYWN0IDYgMgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDE3CiAgICAvLyBpbnRlcmVzdF9yYXRlPWFyYzQuVUludDE2KHNlbGYuaW50ZXJlc3RfcmF0ZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjYgLy8gImludGVyZXN0X3JhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBwdXNoaW50IDE2CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBleHRyYWN0IDYgMgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDE4CiAgICAvLyB0b3RhbF9zdXBwbHk9c2VsZi50b3RhbF91bml0cywKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MjAKICAgIC8vIHByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZT1zZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDIxCiAgICAvLyBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGU9c2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjQgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MjIKICAgIC8vIGlzc3VhbmNlX2RhdGU9c2VsZi5pc3N1YW5jZV9kYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDggLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQyMwogICAgLy8gbWF0dXJpdHlfZGF0ZT1zZWxmLm1hdHVyaXR5X2RhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDI0CiAgICAvLyBzdXNwZW5kZWQ9c2VsZi5hc3NldF9zdXNwZW5kZWQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjAgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9zdXNwZW5kZWQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MjUKICAgIC8vIHBlcmZvcm1hbmNlPWFyYzQuVUludDgocGVyZm9ybWFuY2UpLAogICAgZGlnIDE1CiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgaW50Y18zIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MTAtNDI2CiAgICAvLyByZXR1cm4gdHlwLkFzc2V0SW5mbygKICAgIC8vICAgICBkZW5vbWluYXRpb25fYXNzZXRfaWQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQuaWQsCiAgICAvLyAgICAgc2V0dGxlbWVudF9hc3NldF9pZD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuaWQsCiAgICAvLyAgICAgb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsKCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1zZWxmLnVuaXRfdmFsdWUsCiAgICAvLyAgICAgZGF5X2NvdW50X2NvbnZlbnRpb249YXJjNC5VSW50OChzZWxmLmRheV9jb3VudF9jb252ZW50aW9uKSwKICAgIC8vICAgICBwcmluY2lwYWxfZGlzY291bnQ9YXJjNC5VSW50MTYoc2VsZi5wcmluY2lwYWxfZGlzY291bnQpLAogICAgLy8gICAgIGludGVyZXN0X3JhdGU9YXJjNC5VSW50MTYoc2VsZi5pbnRlcmVzdF9yYXRlKSwKICAgIC8vICAgICB0b3RhbF9zdXBwbHk9c2VsZi50b3RhbF91bml0cywKICAgIC8vICAgICBjaXJjdWxhdGluZ19zdXBwbHk9c2VsZi5jaXJjdWxhdGluZ191bml0cywKICAgIC8vICAgICBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGU9c2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUsCiAgICAvLyAgICAgcHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlPXNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlLAogICAgLy8gICAgIGlzc3VhbmNlX2RhdGU9c2VsZi5pc3N1YW5jZV9kYXRlLAogICAgLy8gICAgIG1hdHVyaXR5X2RhdGU9c2VsZi5tYXR1cml0eV9kYXRlLAogICAgLy8gICAgIHN1c3BlbmRlZD1zZWxmLmFzc2V0X3N1c3BlbmRlZCwKICAgIC8vICAgICBwZXJmb3JtYW5jZT1hcmM0LlVJbnQ4KHBlcmZvcm1hbmNlKSwKICAgIC8vICkKICAgIHVuY292ZXIgMTQKICAgIGl0b2IKICAgIHVuY292ZXIgMTQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDExCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTAKICAgIGNvbmNhdAogICAgdW5jb3ZlciA5CiAgICBjb25jYXQKICAgIHVuY292ZXIgOAogICAgY29uY2F0CiAgICB1bmNvdmVyIDcKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgY29uY2F0CiAgICBieXRlYyAyOCAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciA0CiAgICBzZXRiaXQKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozOTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY29tbW9uLkNvcmVGaW5hbmNpYWxDb21tb25NaXhpbi5nZXRfdGltZV9ldmVudHNbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfdGltZV9ldmVudHM6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MzYKICAgIC8vIHRpbWVfZXZlbnRzID0gdHlwLlRpbWVFdmVudHMoKQogICAgYnl0ZWMgMzAgLy8gMHgwMDAwCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBlbm0uU1RBVFVTX0FDVElWRQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDEwMAogICAgPT0KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQzNwogICAgLy8gaWYgc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCk6CiAgICBieiBnZXRfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MzgKICAgIC8vIHRpbWVfZXZlbnRzID0gc2VsZi50aW1lX2V2ZW50cy52YWx1ZS5jb3B5KCkKICAgIGJ5dGVjIDI3IC8vIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGJ1cnkgMgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudGltZV9ldmVudHMgZXhpc3RzCgpnZXRfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDI4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgZGlnIDEKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb21tb24uQ29yZUZpbmFuY2lhbENvbW1vbk1peGluLmdldF9zZWNvbmRhcnlfbWFya2V0X3NjaGVkdWxlW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGU6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0NTAKICAgIC8vIChzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlLCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQ0OS00NTEKICAgIC8vIHJldHVybiB0eXAuVGltZUV2ZW50cygKICAgIC8vICAgICAoc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSwgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSkKICAgIC8vICkKICAgIHN3YXAKICAgIGl0b2IKICAgIHB1c2hieXRlcyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0NDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY29tbW9uLkNvcmVGaW5hbmNpYWxDb21tb25NaXhpbi5nZXRfYXNzZXRfbWV0YWRhdGFbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXNzZXRfbWV0YWRhdGE6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0NjIKICAgIC8vIHJldHVybiB0eXAuQXNzZXRNZXRhZGF0YS5mcm9tX2J5dGVzKHNlbGYubWV0YWRhdGEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjMgLy8gIm1ldGFkYXRhIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1ldGFkYXRhIGV4aXN0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDUzCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5hY2NvdW50X2dvdl9zdXNwZW5zaW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF9nb3Zfc3VzcGVuc2lvbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzcKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDEwIC8vIDB4NTIzNzMwMjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozMQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTE0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGR1cAogICAgcHVzaGludCA1NgogICAgaW50Y18xIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIHB1c2hpbnQgNTYKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTE1CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF9vcGVuW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF9vcGVuOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjY4CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hY2NvdW50X21hbmFnZXIsIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAxMSAvLyAweDUyMzQzMDIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjgKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBlbm0uU1RBVFVTX0VOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGludGMgNCAvLyAyMDAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTM5CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuc3RhdHVzX2lzX2VuZGVkKCksIGVyci5VTkFVVEhPUklaRUQKICAgICEKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE0MAogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTQxCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNDIKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNDYKICAgIC8vIHVuaXRzPVVJbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTQ0LTE1MAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSB0eXAuQWNjb3VudEluZm8oCiAgICAvLyAgICAgcGF5bWVudF9hZGRyZXNzPXBheW1lbnRfYWRkcmVzcywKICAgIC8vICAgICB1bml0cz1VSW50NjQoMCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1VSW50NjQoMCksCiAgICAvLyAgICAgcGFpZF9jb3Vwb25zPVVJbnQ2NCgwKSwKICAgIC8vICAgICBzdXNwZW5kZWQ9RmFsc2UsCiAgICAvLyApCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgMjggLy8gMHgwMAogICAgY29uY2F0CiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTUxCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfY2xvc2Vbcm91dGluZ10oKSAtPiB2b2lkOgphY2NvdW50X2Nsb3NlOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2OAogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMTEgLy8gMHg1MjM0MzAyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE3MQogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNzQKICAgIC8vIGNsb3NlZF91bml0cyA9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzCiAgICBkdXAKICAgIGJveF9nZXQKICAgIHBvcAogICAgaW50Y18yIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE3NQogICAgLy8gZGVsIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdCiAgICBzd2FwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNzYKICAgIC8vIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgLT0gY2xvc2VkX3VuaXRzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBkaWcgMQogICAgLQogICAgYnl0ZWNfMyAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE3NwogICAgLy8gc2VsZi5lbmRfaWZfbm9fY2lyY3VsYXRpbmdfdW5pdHMoKQogICAgY2FsbHN1YiBlbmRfaWZfbm9fY2lyY3VsYXRpbmdfdW5pdHMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNzgKICAgIC8vIHJldHVybiBjbG9zZWRfdW5pdHMsIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTUzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHN3YXAKICAgIGl0b2IKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzczoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMDAKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcywgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgZGlnIDIKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMDEKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIwMgogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIwNAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzID0gcGF5bWVudF9hZGRyZXNzCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIwNQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5hY2NvdW50X2dldF9pbmZvW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF9nZXRfaW5mbzoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMjIKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjA3CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3JvdGF0ZV9hcnJhbmdlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfcm90YXRlX2FycmFuZ2VyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTgKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTkKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSBuZXdfYXJyYW5nZXIKICAgIGJ5dGVjIDUgLy8gMHg1MjMyMzAyMwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNjAKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19zZXRfb3BfZGFlbW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19zZXRfb3BfZGFlbW9uOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzMKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzQKICAgIC8vIHNlbGYub3BfZGFlbW9uLnZhbHVlID0gYWRkcmVzcwogICAgYnl0ZWMgMTkgLy8gMHg1MjMyMzUyMwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzUKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19hc3NpZ25fcm9sZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfYXNzaWduX3JvbGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTc3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxOTkKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDAKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwMQogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDEKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKToKICAgIHB1c2hpbnQgMjAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwMgogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgNSAvLyAweDUyMzIzMDIzCiAgICBkaWcgMwogICAgYXBwX2dsb2JhbF9wdXQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fdXBzZXJ0X3JvbGVAMTQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAzCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA1CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDQwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDYKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDExIC8vIDB4NTIzNDMwMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwNwogICAgLy8gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDIKICAgIC8vIHNlbGYuX3Vwc2VydF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgY29uZmlnKQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3Vwc2VydF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDkKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKToKICAgIGR1cAogICAgcHVzaGludCA1MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTEwCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDE4IC8vIDB4NTIzNTMwMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMQogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcyhjb25maWcpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwMgogICAgLy8gc2VsZi5fdXBzZXJ0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCBjb25maWcpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fdXBzZXJ0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMwogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNjAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNAogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDE3IC8vIDB4NTIzNjMwMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNQogICAgLy8gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZykKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAyCiAgICAvLyBzZWxmLl91cHNlcnRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIGNvbmZpZykKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl91cHNlcnRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE3CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE4CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAxMCAvLyAweDUyMzczMDIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTkKICAgIC8vIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZykKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAyCiAgICAvLyBzZWxmLl91cHNlcnRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIGNvbmZpZykKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl91cHNlcnRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMQogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKToKICAgIGR1cAogICAgcHVzaGludCA4MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fdXBzZXJ0X3JvbGVAMTQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjIKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuaW50ZXJlc3Rfb3JhY2xlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI1IC8vIDB4NTIzODMwMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMwogICAgLy8gc2VsZi5pbnRlcmVzdF9vcmFjbGVbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl91cHNlcnRfcm9sZUAxNAoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfcmV2b2tlX3JvbGVbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3Jldm9rZV9yb2xlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNAogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNQogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI2CiAgICAvLyBzZWxmLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpKQogICAgYnRvaQogICAgZHVwbiAyCiAgICBjYWxsc3ViIF9hc3NlcnRfdmFsaWRfcm9sZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyNgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgIT0gVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwgZXJyLklOVkFMSURfUk9MRQogICAgZHVwCiAgICBwdXNoaW50IDIwCiAgICAhPQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI3CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI4CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDExIC8vIDB4NTIzNDMwMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyOQogICAgLy8gZGVsIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjgKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzEKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKToKICAgIGR1cAogICAgcHVzaGludCA1MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMyCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMTggLy8gMHg1MjM1MzAyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMzCiAgICAvLyBkZWwgc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjcKICAgIC8vIHNlbGYuX2RlbGV0ZV9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcykKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM1CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKToKICAgIGR1cAogICAgcHVzaGludCA2MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM2CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAxNyAvLyAweDUyMzYzMDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzcKICAgIC8vIGRlbCBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI3CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzOQogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKToKICAgIGR1cAogICAgcHVzaGludCA3MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQwCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDEwIC8vIDB4NTIzNzMwMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MQogICAgLy8gZGVsIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNwogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDMKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSk6CiAgICBkdXAKICAgIHB1c2hpbnQgODAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ0CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuaW50ZXJlc3Rfb3JhY2xlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI1IC8vIDB4NTIzODMwMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NQogICAgLy8gZGVsIHNlbGYuaW50ZXJlc3Rfb3JhY2xlW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nb3ZfYXNzZXRfc3VzcGVuc2lvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ292X2Fzc2V0X3N1c3BlbnNpb246CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QgICMgVE9ETzogVXBkYXRlIHNwZWNzIGFuZCBhZGQgdGVzdAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo3NwogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYXV0aG9yaXR5LCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMTAgLy8gMHg1MjM3MzAyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0NgogICAgLy8gc2VsZi5hc3NldF9zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGJ5dGVjIDIwIC8vICJhc3NldF9zdXNwZW5kZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0NwogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QgICMgVE9ETzogVXBkYXRlIHNwZWNzIGFuZCBhZGQgdGVzdAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X2FycmFuZ2VyW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU3CiAgICAvLyByZXR1cm4gc2VsZi5hcnJhbmdlci52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gMHg1MjMyMzAyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYWRkcmVzc19yb2xlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3MwogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hY2NvdW50X21hbmFnZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMTEgLy8gMHg1MjM0MzAyMwogICAgZGlnIDEKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjc0CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnByaW1hcnlfZGVhbGVyLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDE4IC8vIDB4NTIzNTMwMjMKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3NQogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi50cnVzdGVlLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDE3IC8vIDB4NTIzNjMwMjMKICAgIGRpZyAzCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3NgogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIGFkZHJlc3MpLAogICAgYnl0ZWMgMTAgLy8gMHg1MjM3MzAyMwogICAgZGlnIDQKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjc3CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmludGVyZXN0X29yYWNsZSwgYWRkcmVzcyksCiAgICBieXRlYyAyNSAvLyAweDUyMzgzMDIzCiAgICB1bmNvdmVyIDUKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjIDI4IC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDYKICAgIHNldGJpdAogICAgaW50Y18xIC8vIDEKICAgIHVuY292ZXIgNQogICAgc2V0Yml0CiAgICBwdXNoaW50IDIKICAgIHVuY292ZXIgNAogICAgc2V0Yml0CiAgICBwdXNoaW50IDMKICAgIHVuY292ZXIgMwogICAgc2V0Yml0CiAgICBwdXNoaW50IDQKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV9jb25maWdbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9yb2xlX2NvbmZpZzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTQKICAgIC8vIHJvbGUgPSByb2xlX2lkLmFzX3VpbnQ2NCgpCiAgICBidG9pCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjk1CiAgICAvLyBzZWxmLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlKQogICAgZHVwCiAgICBjYWxsc3ViIF9hc3NlcnRfdmFsaWRfcm9sZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5NwogICAgLy8gY2FzZSBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpOgogICAgcHVzaGludHMgMjAgNDAgNTAgNjAgNzAgODAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTYtMzI3CiAgICAvLyBtYXRjaCByb2xlOgogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKToKICAgIC8vICAgICAgICAgcmV0dXJuIHR5cC5Sb2xlQ29uZmlnKAogICAgLy8gICAgICAgICAgICAgcm9sZV92YWxpZGl0eV9zdGFydD1VSW50NjQoMCksIHJvbGVfdmFsaWRpdHlfZW5kPVVJbnQ2NCgwKQogICAgLy8gICAgICAgICApCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5hdXRob3JpdHksIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLmludGVyZXN0X29yYWNsZSwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5pbnRlcmVzdF9vcmFjbGVbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgXzoKICAgIC8vICAgICAgICAgb3AuZXJyKGVyci5JTlZBTElEX1JPTEUpCiAgICB1bmNvdmVyIDYKICAgIG1hdGNoIHJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzBAMiByYmFjX2dldF9yb2xlX2NvbmZpZ19zd2l0Y2hfY2FzZV8xQDMgcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfMkA0IHJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzNANSByYmFjX2dldF9yb2xlX2NvbmZpZ19zd2l0Y2hfY2FzZV80QDYgcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfNUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI3CiAgICAvLyBvcC5lcnIoZXJyLklOVkFMSURfUk9MRSkKICAgIGVyciAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgoKcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfNUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMwogICAgLy8gc2VsZi5pbnRlcmVzdF9vcmFjbGUsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMjUgLy8gMHg1MjM4MzAyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMi0zMjQKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLmludGVyZXN0X29yYWNsZSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI1CiAgICAvLyByZXR1cm4gc2VsZi5pbnRlcmVzdF9vcmFjbGVbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCgpyYmFjX2dldF9yb2xlX2NvbmZpZ19hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfY29uZmlnQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzRANjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTgKICAgIC8vIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDEwIC8vIDB4NTIzNzMwMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5hdXRob3JpdHksIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMAogICAgLy8gcmV0dXJuIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfY29uZmlnX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV9jb25maWdAOQoKcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfM0A1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxMwogICAgLy8gc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDE3IC8vIDB4NTIzNjMwMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTItMzE0CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTUKICAgIC8vIHJldHVybiBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV9jb25maWdfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX2NvbmZpZ0A5CgpyYmFjX2dldF9yb2xlX2NvbmZpZ19zd2l0Y2hfY2FzZV8yQDQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA4CiAgICAvLyBzZWxmLnByaW1hcnlfZGVhbGVyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDE4IC8vIDB4NTIzNTMwMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDctMzA5CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEwCiAgICAvLyByZXR1cm4gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX2NvbmZpZ19hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfY29uZmlnQDkKCnJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzFAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDMKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDExIC8vIDB4NTIzNDMwMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDItMzA0CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwNQogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfY29uZmlnX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV9jb25maWdAOQoKcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfMEAyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5OC0zMDAKICAgIC8vIHJldHVybiB0eXAuUm9sZUNvbmZpZygKICAgIC8vICAgICByb2xlX3ZhbGlkaXR5X3N0YXJ0PVVJbnQ2NCgwKSwgcm9sZV92YWxpZGl0eV9lbmQ9VUludDY0KDApCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfY29uZmlnX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV9jb25maWdAOQoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwubm9fY291cG9uLk5vQ291cG9uQ2FzaGZsb3dNaXhpbi5kYXlfY291bnRfZmFjdG9yKCkgLT4gYnl0ZXM6CmRheV9jb3VudF9mYWN0b3I6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weToxNwogICAgLy8gZGVmIGRheV9jb3VudF9mYWN0b3Ioc2VsZikgLT4gdHlwLkRheUNvdW50RmFjdG9yOgogICAgcHJvdG8gMCAxCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weToxOC0xOQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIG9ubHkgdGhlIEFjdHVhbC9BY3R1YWwgYW5kIENvbnRpbnVvdXMgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhY2NydWVkX3BlcmlvZCA9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIC0gc2VsZi5pc3N1YW5jZV9kYXRlCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOCAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pc3N1YW5jZV9kYXRlIGV4aXN0cwogICAgc3dhcAogICAgZGlnIDEKICAgIC0KICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvbm9fY291cG9uLnB5OjIwCiAgICAvLyBwcmluY2lwYWxfcGVyaW9kID0gc2VsZi5tYXR1cml0eV9kYXRlIC0gc2VsZi5pc3N1YW5jZV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgc3dhcAogICAgLQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9ub19jb3Vwb24ucHk6MjEKICAgIC8vIGlmIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPT0gVUludDY0KGNzdC5EQ0NfQV9BKToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNCAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gZXhpc3RzCiAgICBibnogZGF5X2NvdW50X2ZhY3Rvcl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE2MgogICAgLy8gcmV0dXJuIHRpbWVfcGVyaW9kIC8vIFVJbnQ2NChjc3QuREFZXzJfU0VDKQogICAgZnJhbWVfZGlnIDAKICAgIGludGMgNSAvLyA4NjQwMAogICAgLwogICAgZnJhbWVfYnVyeSAwCiAgICBpbnRjIDUgLy8gODY0MDAKICAgIC8KCmRheV9jb3VudF9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9ub19jb3Vwb24ucHk6MjQtMjcKICAgIC8vIHJldHVybiB0eXAuRGF5Q291bnRGYWN0b3IoCiAgICAvLyAgICAgbnVtZXJhdG9yPWFjY3J1ZWRfcGVyaW9kLAogICAgLy8gICAgIGRlbm9taW5hdG9yPXByaW5jaXBhbF9wZXJpb2QsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMAogICAgaXRvYgogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmNvcmVfZmluYW5jaWFsLm5vX2NvdXBvbi5Ob0NvdXBvbkNhc2hmbG93TWl4aW4uYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQoaG9sZGluZ19hZGRyZXNzOiBieXRlcywgdW5pdHM6IHVpbnQ2NCkgLT4gdWludDY0OgphY2NydWVkX2ludGVyZXN0X2Ftb3VudDoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvbm9fY291cG9uLnB5OjMzLTM1CiAgICAvLyBkZWYgYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQoCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50LCB1bml0czogVUludDY0CiAgICAvLyApIC0+IFVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9ub19jb3Vwb24ucHk6MzYKICAgIC8vIGRheV9jb3VudF9mYWN0b3IgPSBzZWxmLmRheV9jb3VudF9mYWN0b3IoKQogICAgY2FsbHN1YiBkYXlfY291bnRfZmFjdG9yCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weTozNwogICAgLy8gYWNjcnVlZF9wZXJpb2QgPSBkYXlfY291bnRfZmFjdG9yLm51bWVyYXRvcgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvbm9fY291cG9uLnB5OjM4CiAgICAvLyBwcmluY2lwYWxfcGVyaW9kID0gZGF5X2NvdW50X2ZhY3Rvci5kZW5vbWluYXRvcgogICAgc3dhcAogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weTo0MAogICAgLy8gc2VsZi5hY2NvdW50X3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcywgdW5pdHMpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBhY2NvdW50X3VuaXRzX3ZhbHVlCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weTo0MQogICAgLy8gKiBzZWxmLnByaW5jaXBhbF9kaXNjb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJwcmluY2lwYWxfZGlzY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9ub19jb3Vwb24ucHk6NDAtNDEKICAgIC8vIHNlbGYuYWNjb3VudF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MsIHVuaXRzKQogICAgLy8gKiBzZWxmLnByaW5jaXBhbF9kaXNjb3VudAogICAgKgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9ub19jb3Vwb24ucHk6NDAtNDIKICAgIC8vIHNlbGYuYWNjb3VudF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MsIHVuaXRzKQogICAgLy8gKiBzZWxmLnByaW5jaXBhbF9kaXNjb3VudAogICAgLy8gKiBhY2NydWVkX3BlcmlvZAogICAgdW5jb3ZlciAyCiAgICAqCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weTo0MwogICAgLy8gLy8gKGNzdC5CUFMgKiBwcmluY2lwYWxfcGVyaW9kKQogICAgcHVzaGludCAxMDAwMAogICAgdW5jb3ZlciAyCiAgICAqCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weTo0MC00MwogICAgLy8gc2VsZi5hY2NvdW50X3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcywgdW5pdHMpCiAgICAvLyAqIHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50CiAgICAvLyAqIGFjY3J1ZWRfcGVyaW9kCiAgICAvLyAvLyAoY3N0LkJQUyAqIHByaW5jaXBhbF9wZXJpb2QpCiAgICAvCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weTozOS00NAogICAgLy8gcmV0dXJuICgKICAgIC8vICAgICBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIC8vICAgICAqIHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50CiAgICAvLyAgICAgKiBhY2NydWVkX3BlcmlvZAogICAgLy8gICAgIC8vIChjc3QuQlBTICogcHJpbmNpcGFsX3BlcmlvZCkKICAgIC8vICkgICMgZGl2LWJ5LXplcm86IHByaW5jaXBhbF9wZXJpb2QgIT0gMCBkdWUgdG8gYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZCBjaGVja3MKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY29tbW9uLkNvcmVGaW5hbmNpYWxDb21tb25NaXhpbi5hc3NlcnRfdGltZV9ldmVudHNfc29ydGVkKHRpbWVfZXZlbnRzOiBieXRlcykgLT4gYnl0ZXM6CmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQ6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMDcKICAgIC8vIGRlZiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkKHNlbGYsIHRpbWVfZXZlbnRzOiB0eXAuVGltZUV2ZW50cykgLT4gTm9uZToKICAgIHByb3RvIDEgMQogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDIKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjEwOQogICAgLy8gdGltZV9ldmVudHNbY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX09QRU5JTkdfREFURV9JRFhdCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjExMAogICAgLy8gPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTA5LTExMAogICAgLy8gdGltZV9ldmVudHNbY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX09QRU5JTkdfREFURV9JRFhdCiAgICAvLyA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA+CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMDgtMTExCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHRpbWVfZXZlbnRzW2NmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9PUEVOSU5HX0RBVEVfSURYXQogICAgLy8gICAgID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICksIGVyci5JTlZBTElEX1RJTUUKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBtdXN0IGJlIHNldCBpbiB0aGUgZnV0dXJlCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMTIKICAgIC8vIGZvciBpZHggaW4gdXJhbmdlKHRpbWVfZXZlbnRzLmxlbmd0aCAtIDEpOgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGludGNfMCAvLyAwCgphc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2Zvcl9oZWFkZXJAMToKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjExMgogICAgLy8gZm9yIGlkeCBpbiB1cmFuZ2UodGltZV9ldmVudHMubGVuZ3RoIC0gMSk6CiAgICBmcmFtZV9kaWcgNQogICAgZnJhbWVfZGlnIDQKICAgIDwKICAgIGJ6IGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfYWZ0ZXJfZm9yQDYKCmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfd2hpbGVfdG9wQDg6CiAgICBwdXNoaW50IDc1CiAgICBnbG9iYWwgT3Bjb2RlQnVkZ2V0CiAgICA+CiAgICBieiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2FmdGVyX3doaWxlQDEzCiAgICBpdHhuX2JlZ2luCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgYnl0ZWMgMzEgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtCiAgICBieXRlYyAzMSAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbQogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBiIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfd2hpbGVfdG9wQDgKCmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfYWZ0ZXJfd2hpbGVAMTM6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMTcKICAgIC8vIHRpbWVfaSA9IHRpbWVfZXZlbnRzW2lkeF0KICAgIGZyYW1lX2RpZyA1CiAgICBkdXAKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBjb3ZlciAzCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAzCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjExOAogICAgLy8gdGltZV9mID0gdGltZV9ldmVudHNbaWR4ICsgMV0KICAgIGludGNfMSAvLyAxCiAgICArCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTE5CiAgICAvLyBhc3NlcnQgdGltZV9mID4gdGltZV9pLCBlcnIuSU5WQUxJRF9TT1JUSU5HCiAgICA8CiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbXVzdCBiZSBzb3J0ZWQgaW4gc3RyaWN0bHkgYXNjZW5kaW5nIG9yZGVyCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMjAKICAgIC8vIGlmIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gIT0gVUludDY0KGNzdC5EQ0NfQ09OVCk6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTQgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uIGV4aXN0cwogICAgcHVzaGludCAyNTUKICAgICE9CiAgICBieiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2FmdGVyX2lmX2Vsc2VANAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTIxLTEyMgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHJlcXVpcmVzIHRpbWUgcGVyaW9kcyBleHByZXNzZWQgaW4gZGF5cyBmb3IgcmVndWxhciBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGFzc2VydCAodGltZV9mIC0gdGltZV9pKSAlIFVJbnQ2NCgKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgMQogICAgLQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTIxLTEyNAogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHJlcXVpcmVzIHRpbWUgcGVyaW9kcyBleHByZXNzZWQgaW4gZGF5cyBmb3IgcmVndWxhciBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGFzc2VydCAodGltZV9mIC0gdGltZV9pKSAlIFVJbnQ2NCgKICAgIC8vICAgICBjc3QuREFZXzJfU0VDCiAgICAvLyApID09IDAsIGVyci5JTlZBTElEX1RJTUVfUEVSSU9ECiAgICBpbnRjIDUgLy8gODY0MDAKICAgICUKICAgICEKICAgIGFzc2VydCAvLyBUaW1lIHBlcmlvZHMgaW4gQWN0dWFsL0FjdHVhbCBkYXkgY291bnQgY29udmVudGlvbiBtdXN0IGJlIG11bHRpcGxlcyBvZiBhIGRheSAoaW4gc2Vjb25kcykKCmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfYWZ0ZXJfaWZfZWxzZUA0OgogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2J1cnkgNQogICAgYiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2Zvcl9oZWFkZXJAMQoKYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9hZnRlcl9mb3JANjoKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IHZvaWQ6CmFzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQ6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzMKICAgIC8vIGRlZiBhc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHNlbGYsIGhvbGRpbmdfYWRkcmVzczogQWNjb3VudCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjM0CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZCwgZXJyLlNVU1BFTkRFRAogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHB1c2hpbnQgNDQ4CiAgICBnZXRiaXQKICAgICEKICAgIGFzc2VydCAvLyBTdXNwZW5kZWQgb3BlcmF0aW9ucwogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCB1bml0czogdWludDY0KSAtPiB1aW50NjQ6CmFjY291bnRfdW5pdHNfdmFsdWU6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzYKICAgIC8vIGRlZiBhY2NvdW50X3VuaXRzX3ZhbHVlKHNlbGYsIGhvbGRpbmdfYWRkcmVzczogQWNjb3VudCwgdW5pdHM6IFVJbnQ2NCkgLT4gVUludDY0OgogICAgcHJvdG8gMiAxCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzcKICAgIC8vIHJldHVybiB1bml0cyAqIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRfdmFsdWUKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfZGlnIC0xCiAgICAqCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5hY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NDoKYWNjb3VudF90b3RhbF91bml0c192YWx1ZToKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozOQogICAgLy8gZGVmIGFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUoc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50KSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo0MQogICAgLy8gaG9sZGluZ19hZGRyZXNzLCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMiAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo0MC00MgogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudF91bml0c192YWx1ZSgKICAgIC8vICAgICBob2xkaW5nX2FkZHJlc3MsIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGNhbGxzdWIgYWNjb3VudF91bml0c192YWx1ZQogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuZW5kX2lmX25vX2NpcmN1bGF0aW5nX3VuaXRzKCkgLT4gdm9pZDoKZW5kX2lmX25vX2NpcmN1bGF0aW5nX3VuaXRzOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjQ4CiAgICAvLyBpZiBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzID09IFVJbnQ2NCgwKToKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGJueiBlbmRfaWZfbm9fY2lyY3VsYXRpbmdfdW5pdHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NDkKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGVubS5TVEFUVVNfRU5ERUQpCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBpbnRjIDQgLy8gMjAwCiAgICBhcHBfZ2xvYmFsX3B1dAoKZW5kX2lmX25vX2NpcmN1bGF0aW5nX3VuaXRzX2FmdGVyX2lmX2Vsc2VAMjoKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9yb2xlX2lzX2FjdGl2ZShyb2xlX21hcDogYnl0ZXMsIHJvbGVfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NDoKX3JvbGVfaXNfYWN0aXZlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU3CiAgICAvLyBkZWYgX3JvbGVfaXNfYWN0aXZlKHNlbGYsIHJvbGVfbWFwOiB0eXAuUmJhY1JvbGUsIHJvbGVfYWRkcmVzczogQWNjb3VudCkgLT4gYm9vbDoKICAgIHByb3RvIDIgMQogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5CiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5LTYwCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5LTYxCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjEKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAtNjEKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgPj0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX21lcmdlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpIC0+IHZvaWQ6CmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjUKICAgIC8vIGFzc2VydCBzZWxmLl9pc19hcnJhbmdlcihUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjUyCiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzID09IHNlbGYuYXJyYW5nZXIudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vIDB4NTIzMjMwMjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcnJhbmdlciBleGlzdHMKICAgID09CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjUKICAgIC8vIGFzc2VydCBzZWxmLl9pc19hcnJhbmdlcihUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpIC0+IHZvaWQ6CmFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjgzCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYXNzZXRfZGVmYXVsdGVkLCBlcnIuREVGQVVMVEVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjEgLy8gImFzc2V0X2RlZmF1bHRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9kZWZhdWx0ZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRGVmYXVsdGVkCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpIC0+IHZvaWQ6CmFzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg2CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYXNzZXRfc3VzcGVuZGVkLCBlcnIuU1VTUEVOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjAgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9zdXNwZW5kZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gU3VzcGVuZGVkIG9wZXJhdGlvbnMKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkOiB1aW50NjQpIC0+IHZvaWQ6Cl9hc3NlcnRfdmFsaWRfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OAogICAgLy8gZGVmIF9hc3NlcnRfdmFsaWRfcm9sZShzZWxmLCByb2xlX2lkOiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MAogICAgLy8gVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIHB1c2hpbnQgMjAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgcHVzaGludCA0MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk2CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MgogICAgLy8gVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIHB1c2hpbnQgNTAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTMKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIHB1c2hpbnQgNjAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTQKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgcHVzaGludCA3MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk2CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NQogICAgLy8gVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICBwdXNoaW50IDgwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTYKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJ6IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX2ZhbHNlQDcKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANjoKICAgIGludGNfMSAvLyAxCgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9tZXJnZUA4OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk2CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgcmV0c3ViCgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9mYWxzZUA3OgogICAgaW50Y18wIC8vIDAKICAgIGIgX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfbWVyZ2VAOAo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="}, "sourceInfo": {"approval": {"pcOffsetMethod": "none", "sourceInfo": [{"pc": [2349], "errorMessage": "Can not distribute zero units"}, {"pc": [1015], "errorMessage": "Coupon rates are not properly defined"}, {"pc": [910], "errorMessage": "D-ASA already configured"}, {"pc": [3950], "errorMessage": "Defaulted"}, {"pc": [917], "errorMessage": "Denomination asset is not properly set"}, {"pc": [928], "errorMessage": "Different settlement asset not supported, must be equal to denomination asset"}, {"pc": [2365], "errorMessage": "Insufficient remaining D-ASA units"}, {"pc": [1848, 1929], "errorMessage": "Insufficient sender units to transfer"}, {"pc": [1006], "errorMessage": "Interest rate is not properly defined"}, {"pc": [1152, 1316, 1399, 1802, 1817, 2339, 2722, 2793, 2845, 2916, 2945], "errorMessage": "Invalid account holding address"}, {"pc": [3087, 3111, 3135, 3159, 3183, 3240, 3268, 3290, 3312, 3334, 3513, 3531, 3546, 3561, 3576], "errorMessage": "Invalid account role address"}, {"pc": [1170], "errorMessage": "Invalid amount of units for the account"}, {"pc": [995], "errorMessage": "Invalid day-count convention ID"}, {"pc": [3224, 3503, 4012], "errorMessage": "Invalid role identifier"}, {"pc": [2210], "errorMessage": "Invalid secondary market closure date"}, {"pc": [2176], "errorMessage": "Invalid secondary market opening date"}, {"pc": [961], "errorMessage": "Minimum denomination is not a divisor of principal"}, {"pc": [1404], "errorMessage": "No D-ASA units"}, {"pc": [1381, 1461, 1784, 2139, 2253, 2330, 2713, 2768, 2777, 2834, 2901, 3357, 3942], "errorMessage": "Not authorized"}, {"pc": [1515], "errorMessage": "Not enough funds for the payment"}, {"pc": [1413], "errorMessage": "Not mature"}, {"pc": [2322], "errorMessage": "Primary distribution is closed"}, {"pc": [1141], "errorMessage": "Primary distribution not yet executed"}, {"pc": [1775], "errorMessage": "Secondary market is closed"}, {"pc": [1833], "errorMessage": "Sender and receiver must be different"}, {"pc": [1898], "errorMessage": "Sender and receiver units are not fungible"}, {"pc": [3834, 3958], "errorMessage": "Suspended operations"}, {"pc": [1027, 2144], "errorMessage": "Time events length is invalid"}, {"pc": [3707], "errorMessage": "Time events must be set in the future"}, {"pc": [3785], "errorMessage": "Time events must be sorted in strictly ascending order"}, {"pc": [1088], "errorMessage": "Time periods are not properly defined"}, {"pc": [3807], "errorMessage": "Time periods in Actual/Actual day count convention must be multiples of a day (in seconds)"}, {"pc": [1837], "errorMessage": "Transfer units must be greater than zero"}, {"pc": [533], "errorMessage": "Wrong Global Bytes allocation"}, {"pc": [539], "errorMessage": "Wrong Global UInts allocation"}, {"pc": [543], "errorMessage": "Wrong Local Bytes allocation"}, {"pc": [547], "errorMessage": "Wrong Local UInts allocation"}, {"pc": [1508], "errorMessage": "account opted into asset"}, {"pc": [1582], "errorMessage": "asset exists"}, {"pc": [3902, 3917], "errorMessage": "check BoxMap entry exists"}, {"pc": [1160, 1452, 1465, 1484, 1519, 1553, 1841, 1855, 1864, 1871, 1882, 1889, 1903, 1924, 1966, 2010, 2373, 3828, 3844, 3860], "errorMessage": "check self.account entry exists"}, {"pc": [3375, 3940], "errorMessage": "check self.arranger exists"}, {"pc": [2447, 3948], "errorMessage": "check self.asset_defaulted exists"}, {"pc": [2549, 3956], "errorMessage": "check self.asset_suspended exists"}, {"pc": [1546, 1586, 2353, 2468, 2857, 3873], "errorMessage": "check self.circulating_units exists"}, {"pc": [2480, 3629, 3790], "errorMessage": "check self.day_count_convention exists"}, {"pc": [1578, 2459], "errorMessage": "check self.denomination_asset_id exists"}, {"pc": [2509], "errorMessage": "check self.interest_rate exists"}, {"pc": [1206, 2160, 2539, 3612], "errorMessage": "check self.issuance_date exists"}, {"pc": [1220, 1258, 1411, 2185, 2193, 2430, 2544, 3622], "errorMessage": "check self.maturity_date exists"}, {"pc": [2681], "errorMessage": "check self.metadata exists"}, {"pc": [1421, 1434], "errorMessage": "check self.op_daemon exists"}, {"pc": [2314, 2534], "errorMessage": "check self.primary_distribution_closure_date exists"}, {"pc": [1125, 1135, 2300, 2529], "errorMessage": "check self.primary_distribution_opening_date exists"}, {"pc": [1182, 2494, 3674], "errorMessage": "check self.principal_discount exists"}, {"pc": [1759, 1769, 2224, 2659], "errorMessage": "check self.secondary_market_closure_date exists"}, {"pc": [1748, 2219, 2654], "errorMessage": "check self.secondary_market_opening_date exists"}, {"pc": [1473, 1502, 2464], "errorMessage": "check self.settlement_asset_id exists"}, {"pc": [908, 1321, 1377, 1737, 2134, 2289, 2629, 2772], "errorMessage": "check self.status exists"}, {"pc": [2642], "errorMessage": "check self.time_events exists"}, {"pc": [2361, 2403, 2524], "errorMessage": "check self.total_units exists"}, {"pc": [1591, 2390, 2473], "errorMessage": "check self.unit_value exists"}, {"pc": [848, 870, 888, 1075, 1361, 2055, 2094, 2116, 2197, 3025, 3711], "errorMessage": "invalid array length header"}, {"pc": [2243, 2703, 3347], "errorMessage": "invalid number of bytes for arc4.bool"}, {"pc": [861], "errorMessage": "invalid number of bytes for arc4.dynamic_array"}, {"pc": [1369, 3033], "errorMessage": "invalid number of bytes for arc4.dynamic_array"}, {"pc": [901], "errorMessage": "invalid number of bytes for arc4.dynamic_array>"}, {"pc": [882, 2127], "errorMessage": "invalid number of bytes for arc4.dynamic_array"}, {"pc": [1111, 1309, 1355, 1716, 1724, 2032, 2276, 2695, 2752, 2760, 2826, 2887, 2895, 2937, 2961, 2985, 3019, 3207, 3389, 3473], "errorMessage": "invalid number of bytes for arc4.static_array"}, {"pc": [842], "errorMessage": "invalid number of bytes for arc4.uint16"}, {"pc": [786, 795, 804, 813, 822, 1119, 1732, 2284], "errorMessage": "invalid number of bytes for arc4.uint64"}, {"pc": [831, 3009, 3197, 3463], "errorMessage": "invalid number of bytes for arc4.uint8"}, {"pc": [2060, 2099], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.AssetMetadata"}, {"pc": [2047, 2086], "errorMessage": "invalid tail pointer at index 7 of (uint8,uint8,uint8,uint8,uint8,uint8,uint8[32],(len+utf8[]))"}, {"pc": [2042, 2081], "errorMessage": "invalid tuple encoding"}, {"pc": [2486, 2501, 2516, 2557], "errorMessage": "overflow"}]}, "clear": {"pcOffsetMethod": "none", "sourceInfo": []}}, "templateVariables": {}}""" -APP_SPEC = algokit_utils.Arc56Contract.from_json(_APP_SPEC_JSON) - -def _parse_abi_args(args: object | None = None) -> list[object] | None: - """Helper to parse ABI args into the format expected by underlying client""" - if args is None: - return None - - def convert_dataclass(value: object) -> object: - if dataclasses.is_dataclass(value): - return tuple(convert_dataclass(getattr(value, field.name)) for field in dataclasses.fields(value)) - elif isinstance(value, (list, tuple)): - return type(value)(convert_dataclass(item) for item in value) - return value - - match args: - case tuple(): - method_args = list(args) - case _ if dataclasses.is_dataclass(args): - method_args = [getattr(args, field.name) for field in dataclasses.fields(args)] - case _: - raise ValueError("Invalid 'args' type. Expected 'tuple' or 'TypedDict' for respective typed arguments.") - - return [ - convert_dataclass(arg) if not isinstance(arg, algokit_utils.AppMethodCallTransactionArgument) else arg - for arg in method_args - ] if method_args else None - -def _init_dataclass(cls: type, data: dict) -> object: - """ - Recursively instantiate a dataclass of type `cls` from `data`. - - For each field on the dataclass, if the field type is also a dataclass - and the corresponding data is a dict, instantiate that field recursively. - """ - field_values = {} - for field in dataclasses.fields(cls): - field_value = data.get(field.name) - # Check if the field expects another dataclass and the value is a dict. - if dataclasses.is_dataclass(field.type) and isinstance(field_value, dict): - field_values[field.name] = _init_dataclass(typing.cast(type, field.type), field_value) - else: - field_values[field.name] = field_value - return cls(**field_values) - -@dataclasses.dataclass(frozen=True) -class AccountInfo: - """Struct for AccountInfo""" - payment_address: str - units: int - unit_value: int - paid_coupons: int - suspended: bool - -@dataclasses.dataclass(frozen=True) -class AssetInfo: - """Struct for AssetInfo""" - denomination_asset_id: int - settlement_asset_id: int - outstanding_principal: int - unit_value: int - day_count_convention: int - principal_discount: int - interest_rate: int - total_supply: int - circulating_supply: int - primary_distribution_opening_date: int - primary_distribution_closure_date: int - issuance_date: int - maturity_date: int - suspended: bool - performance: int - -@dataclasses.dataclass(frozen=True) -class AssetMetadata: - """Struct for AssetMetadata""" - contract_type: int - calendar: int - business_day_convention: int - end_of_month_convention: int - prepayment_effect: int - penalty_type: int - prospectus_hash: bytes - prospectus_url: str - -@dataclasses.dataclass(frozen=True) -class DayCountFactor: - """Struct for DayCountFactor""" - numerator: int - denominator: int - -@dataclasses.dataclass(frozen=True) -class CurrentUnitsValue: - """Struct for CurrentUnitsValue""" - units_value: int - accrued_interest: int - day_count_factor: DayCountFactor - -@dataclasses.dataclass(frozen=True) -class PaymentAmounts: - """Struct for PaymentAmounts""" - interest: int - principal: int - -@dataclasses.dataclass(frozen=True) -class PaymentResult: - """Struct for PaymentResult""" - amount: int - timestamp: int - context: bytes - -@dataclasses.dataclass(frozen=True) -class RoleConfig: - """Struct for RoleConfig""" - role_validity_start: int - role_validity_end: int - -@dataclasses.dataclass(frozen=True) -class SecondaryMarketSchedule: - """Struct for SecondaryMarketSchedule""" - secondary_market_opening_date: int - secondary_market_closure_date: int - - -@dataclasses.dataclass(frozen=True, kw_only=True) -class AssetConfigArgs: - """Dataclass for asset_config arguments""" - denomination_asset_id: int - settlement_asset_id: int - principal: int - principal_discount: int - minimum_denomination: int - day_count_convention: int - interest_rate: int - coupon_rates: list[int] - time_events: list[int] - time_periods: list[tuple[int, int]] - - @property - def abi_method_signature(self) -> str: - return "asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class GetAccountUnitsCurrentValueArgs: - """Dataclass for get_account_units_current_value arguments""" - holding_address: str - units: int - - @property - def abi_method_signature(self) -> str: - return "get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64))" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class GetPaymentAmountArgs: - """Dataclass for get_payment_amount arguments""" - holding_address: str - - @property - def abi_method_signature(self) -> str: - return "get_payment_amount(address)(uint64,uint64)" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class PayPrincipalArgs: - """Dataclass for pay_principal arguments""" - holding_address: str - payment_info: bytes | str - - @property - def abi_method_signature(self) -> str: - return "pay_principal(address,byte[])(uint64,uint64,byte[])" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class AssetTransferArgs: - """Dataclass for asset_transfer arguments""" - sender_holding_address: str - receiver_holding_address: str - units: int - - @property - def abi_method_signature(self) -> str: - return "asset_transfer(address,address,uint64)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class SetSecondaryTimeEventsArgs: - """Dataclass for set_secondary_time_events arguments""" - secondary_market_time_events: list[int] - - @property - def abi_method_signature(self) -> str: - return "set_secondary_time_events(uint64[])(uint64,uint64)" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class SetDefaultStatusArgs: - """Dataclass for set_default_status arguments""" - defaulted: bool - - @property - def abi_method_signature(self) -> str: - return "set_default_status(bool)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class PrimaryDistributionArgs: - """Dataclass for primary_distribution arguments""" - holding_address: str - units: int - - @property - def abi_method_signature(self) -> str: - return "primary_distribution(address,uint64)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class AccountGovSuspensionArgs: - """Dataclass for account_gov_suspension arguments""" - holding_address: str - suspended: bool - - @property - def abi_method_signature(self) -> str: - return "account_gov_suspension(address,bool)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class AccountOpenArgs: - """Dataclass for account_open arguments""" - holding_address: str - payment_address: str - - @property - def abi_method_signature(self) -> str: - return "account_open(address,address)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class AccountCloseArgs: - """Dataclass for account_close arguments""" - holding_address: str - - @property - def abi_method_signature(self) -> str: - return "account_close(address)(uint64,uint64)" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class AccountUpdatePaymentAddressArgs: - """Dataclass for account_update_payment_address arguments""" - holding_address: str - payment_address: str - - @property - def abi_method_signature(self) -> str: - return "account_update_payment_address(address,address)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class AccountGetInfoArgs: - """Dataclass for account_get_info arguments""" - holding_address: str - - @property - def abi_method_signature(self) -> str: - return "account_get_info(address)(address,uint64,uint64,uint64,bool)" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class RbacRotateArrangerArgs: - """Dataclass for rbac_rotate_arranger arguments""" - new_arranger: str - - @property - def abi_method_signature(self) -> str: - return "rbac_rotate_arranger(address)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class RbacSetOpDaemonArgs: - """Dataclass for rbac_set_op_daemon arguments""" - address: str - - @property - def abi_method_signature(self) -> str: - return "rbac_set_op_daemon(address)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class RbacAssignRoleArgs: - """Dataclass for rbac_assign_role arguments""" - role_id: int - role_address: str - config: bytes | str - - @property - def abi_method_signature(self) -> str: - return "rbac_assign_role(uint8,address,byte[])uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class RbacRevokeRoleArgs: - """Dataclass for rbac_revoke_role arguments""" - role_id: int - role_address: str - - @property - def abi_method_signature(self) -> str: - return "rbac_revoke_role(uint8,address)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class RbacGovAssetSuspensionArgs: - """Dataclass for rbac_gov_asset_suspension arguments""" - suspended: bool - - @property - def abi_method_signature(self) -> str: - return "rbac_gov_asset_suspension(bool)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class RbacGetAddressRolesArgs: - """Dataclass for rbac_get_address_roles arguments""" - address: str - - @property - def abi_method_signature(self) -> str: - return "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class RbacGetRoleConfigArgs: - """Dataclass for rbac_get_role_config arguments""" - role_id: int - role_address: str - - @property - def abi_method_signature(self) -> str: - return "rbac_get_role_config(uint8,address)(uint64,uint64)" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class AssetCreateArgs: - """Dataclass for asset_create arguments""" - arranger: str - metadata: AssetMetadata - - @property - def abi_method_signature(self) -> str: - return "asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class AssetUpdateArgs: - """Dataclass for asset_update arguments""" - metadata: AssetMetadata - - @property - def abi_method_signature(self) -> str: - return "asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void" - - -class _ZeroCouponBondUpdate: - def __init__(self, app_client: algokit_utils.AppClient): - self.app_client = app_client - - def asset_update( - self, - args: tuple[AssetMetadata] | AssetUpdateArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppUpdateMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - compilation_params = compilation_params or algokit_utils.AppClientCompilationParams() - return self.app_client.params.update(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void", - "args": method_args, - })) - - -class ZeroCouponBondParams: - def __init__(self, app_client: algokit_utils.AppClient): - self.app_client = app_client - - @property - def update(self) -> "_ZeroCouponBondUpdate": - return _ZeroCouponBondUpdate(self.app_client) - - def asset_config( - self, - args: tuple[int, int, int, int, int, int, int, list[int], list[int], list[tuple[int, int]]] | AssetConfigArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void", - "args": method_args, - })) - - def get_account_units_current_value( - self, - args: tuple[str, int] | GetAccountUnitsCurrentValueArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64))", - "args": method_args, - })) - - def get_payment_amount( - self, - args: tuple[str] | GetPaymentAmountArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_payment_amount(address)(uint64,uint64)", - "args": method_args, - })) - - def pay_principal( - self, - args: tuple[str, bytes | str] | PayPrincipalArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "pay_principal(address,byte[])(uint64,uint64,byte[])", - "args": method_args, - })) - - def asset_transfer( - self, - args: tuple[str, str, int] | AssetTransferArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "asset_transfer(address,address,uint64)uint64", - "args": method_args, - })) - - def set_secondary_time_events( - self, - args: tuple[list[int]] | SetSecondaryTimeEventsArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "set_secondary_time_events(uint64[])(uint64,uint64)", - "args": method_args, - })) - - def set_default_status( - self, - args: tuple[bool] | SetDefaultStatusArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "set_default_status(bool)uint64", - "args": method_args, - })) - - def primary_distribution( - self, - args: tuple[str, int] | PrimaryDistributionArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "primary_distribution(address,uint64)uint64", - "args": method_args, - })) - - def get_asset_info( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)", - })) - - def get_time_events( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_time_events()uint64[]", - })) - - def get_secondary_market_schedule( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_secondary_market_schedule()uint64[]", - })) - - def get_asset_metadata( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", - })) - - def account_gov_suspension( - self, - args: tuple[str, bool] | AccountGovSuspensionArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_gov_suspension(address,bool)uint64", - "args": method_args, - })) - - def account_open( - self, - args: tuple[str, str] | AccountOpenArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_open(address,address)uint64", - "args": method_args, - })) - - def account_close( - self, - args: tuple[str] | AccountCloseArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_close(address)(uint64,uint64)", - "args": method_args, - })) - - def account_update_payment_address( - self, - args: tuple[str, str] | AccountUpdatePaymentAddressArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_update_payment_address(address,address)uint64", - "args": method_args, - })) - - def account_get_info( - self, - args: tuple[str] | AccountGetInfoArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_get_info(address)(address,uint64,uint64,uint64,bool)", - "args": method_args, - })) - - def rbac_rotate_arranger( - self, - args: tuple[str] | RbacRotateArrangerArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_rotate_arranger(address)uint64", - "args": method_args, - })) - - def rbac_set_op_daemon( - self, - args: tuple[str] | RbacSetOpDaemonArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_set_op_daemon(address)uint64", - "args": method_args, - })) - - def rbac_assign_role( - self, - args: tuple[int, str, bytes | str] | RbacAssignRoleArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_assign_role(uint8,address,byte[])uint64", - "args": method_args, - })) - - def rbac_revoke_role( - self, - args: tuple[int, str] | RbacRevokeRoleArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_revoke_role(uint8,address)uint64", - "args": method_args, - })) - - def rbac_gov_asset_suspension( - self, - args: tuple[bool] | RbacGovAssetSuspensionArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_gov_asset_suspension(bool)uint64", - "args": method_args, - })) - - def rbac_get_arranger( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_arranger()address", - })) - - def rbac_get_address_roles( - self, - args: tuple[str] | RbacGetAddressRolesArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", - "args": method_args, - })) - - def rbac_get_role_config( - self, - args: tuple[int, str] | RbacGetRoleConfigArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_role_config(uint8,address)(uint64,uint64)", - "args": method_args, - })) - - def asset_create( - self, - args: tuple[str, AssetMetadata] | AssetCreateArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void", - "args": method_args, - })) - - def clear_state( - self, - params: algokit_utils.AppClientBareCallParams | None = None, - - ) -> algokit_utils.AppCallParams: - return self.app_client.params.bare.clear_state( - params, - - ) - - -class _ZeroCouponBondUpdateTransaction: - def __init__(self, app_client: algokit_utils.AppClient): - self.app_client = app_client - - def asset_update( - self, - args: tuple[AssetMetadata] | AssetUpdateArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - compilation_params = compilation_params or algokit_utils.AppClientCompilationParams() - return self.app_client.create_transaction.update(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void", - "args": method_args, - })) - - -class ZeroCouponBondCreateTransactionParams: - def __init__(self, app_client: algokit_utils.AppClient): - self.app_client = app_client - - @property - def update(self) -> "_ZeroCouponBondUpdateTransaction": - return _ZeroCouponBondUpdateTransaction(self.app_client) - - def asset_config( - self, - args: tuple[int, int, int, int, int, int, int, list[int], list[int], list[tuple[int, int]]] | AssetConfigArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void", - "args": method_args, - })) - - def get_account_units_current_value( - self, - args: tuple[str, int] | GetAccountUnitsCurrentValueArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64))", - "args": method_args, - })) - - def get_payment_amount( - self, - args: tuple[str] | GetPaymentAmountArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_payment_amount(address)(uint64,uint64)", - "args": method_args, - })) - - def pay_principal( - self, - args: tuple[str, bytes | str] | PayPrincipalArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "pay_principal(address,byte[])(uint64,uint64,byte[])", - "args": method_args, - })) - - def asset_transfer( - self, - args: tuple[str, str, int] | AssetTransferArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "asset_transfer(address,address,uint64)uint64", - "args": method_args, - })) - - def set_secondary_time_events( - self, - args: tuple[list[int]] | SetSecondaryTimeEventsArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "set_secondary_time_events(uint64[])(uint64,uint64)", - "args": method_args, - })) - - def set_default_status( - self, - args: tuple[bool] | SetDefaultStatusArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "set_default_status(bool)uint64", - "args": method_args, - })) - - def primary_distribution( - self, - args: tuple[str, int] | PrimaryDistributionArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "primary_distribution(address,uint64)uint64", - "args": method_args, - })) - - def get_asset_info( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)", - })) - - def get_time_events( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_time_events()uint64[]", - })) - - def get_secondary_market_schedule( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_secondary_market_schedule()uint64[]", - })) - - def get_asset_metadata( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", - })) - - def account_gov_suspension( - self, - args: tuple[str, bool] | AccountGovSuspensionArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_gov_suspension(address,bool)uint64", - "args": method_args, - })) - - def account_open( - self, - args: tuple[str, str] | AccountOpenArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_open(address,address)uint64", - "args": method_args, - })) - - def account_close( - self, - args: tuple[str] | AccountCloseArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_close(address)(uint64,uint64)", - "args": method_args, - })) - - def account_update_payment_address( - self, - args: tuple[str, str] | AccountUpdatePaymentAddressArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_update_payment_address(address,address)uint64", - "args": method_args, - })) - - def account_get_info( - self, - args: tuple[str] | AccountGetInfoArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_get_info(address)(address,uint64,uint64,uint64,bool)", - "args": method_args, - })) - - def rbac_rotate_arranger( - self, - args: tuple[str] | RbacRotateArrangerArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_rotate_arranger(address)uint64", - "args": method_args, - })) - - def rbac_set_op_daemon( - self, - args: tuple[str] | RbacSetOpDaemonArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_set_op_daemon(address)uint64", - "args": method_args, - })) - - def rbac_assign_role( - self, - args: tuple[int, str, bytes | str] | RbacAssignRoleArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_assign_role(uint8,address,byte[])uint64", - "args": method_args, - })) - - def rbac_revoke_role( - self, - args: tuple[int, str] | RbacRevokeRoleArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_revoke_role(uint8,address)uint64", - "args": method_args, - })) - - def rbac_gov_asset_suspension( - self, - args: tuple[bool] | RbacGovAssetSuspensionArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_gov_asset_suspension(bool)uint64", - "args": method_args, - })) - - def rbac_get_arranger( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_arranger()address", - })) - - def rbac_get_address_roles( - self, - args: tuple[str] | RbacGetAddressRolesArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", - "args": method_args, - })) - - def rbac_get_role_config( - self, - args: tuple[int, str] | RbacGetRoleConfigArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_role_config(uint8,address)(uint64,uint64)", - "args": method_args, - })) - - def asset_create( - self, - args: tuple[str, AssetMetadata] | AssetCreateArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void", - "args": method_args, - })) - - def clear_state( - self, - params: algokit_utils.AppClientBareCallParams | None = None, - - ) -> Transaction: - return self.app_client.create_transaction.bare.clear_state( - params, - - ) - - -class _ZeroCouponBondUpdateSend: - def __init__(self, app_client: algokit_utils.AppClient): - self.app_client = app_client - - def asset_update( - self, - args: tuple[AssetMetadata] | AssetUpdateArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.SendAppTransactionResult[None]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - compilation_params = compilation_params or algokit_utils.AppClientCompilationParams() - response = self.app_client.send.update(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void", - "args": method_args, - }), send_params=send_params, compilation_params=compilation_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppUpdateTransactionResult[None], parsed_response) - - -class ZeroCouponBondSend: - def __init__(self, app_client: algokit_utils.AppClient): - self.app_client = app_client - - @property - def update(self) -> "_ZeroCouponBondUpdateSend": - return _ZeroCouponBondUpdateSend(self.app_client) - - def asset_config( - self, - args: tuple[int, int, int, int, int, int, int, list[int], list[int], list[tuple[int, int]]] | AssetConfigArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[None]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[None], parsed_response) - - def get_account_units_current_value( - self, - args: tuple[str, int] | GetAccountUnitsCurrentValueArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[CurrentUnitsValue]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64))", - "args": method_args, - }), send_params=send_params) - parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(CurrentUnitsValue, typing.cast(dict, response.abi_return))) # type: ignore - return typing.cast(algokit_utils.SendAppTransactionResult[CurrentUnitsValue], parsed_response) - - def get_payment_amount( - self, - args: tuple[str] | GetPaymentAmountArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[PaymentAmounts]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_payment_amount(address)(uint64,uint64)", - "args": method_args, - }), send_params=send_params) - parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(PaymentAmounts, typing.cast(dict, response.abi_return))) # type: ignore - return typing.cast(algokit_utils.SendAppTransactionResult[PaymentAmounts], parsed_response) - - def pay_principal( - self, - args: tuple[str, bytes | str] | PayPrincipalArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[PaymentResult]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "pay_principal(address,byte[])(uint64,uint64,byte[])", - "args": method_args, - }), send_params=send_params) - parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(PaymentResult, typing.cast(dict, response.abi_return))) # type: ignore - return typing.cast(algokit_utils.SendAppTransactionResult[PaymentResult], parsed_response) - - def asset_transfer( - self, - args: tuple[str, str, int] | AssetTransferArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "asset_transfer(address,address,uint64)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def set_secondary_time_events( - self, - args: tuple[list[int]] | SetSecondaryTimeEventsArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[SecondaryMarketSchedule]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "set_secondary_time_events(uint64[])(uint64,uint64)", - "args": method_args, - }), send_params=send_params) - parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(SecondaryMarketSchedule, typing.cast(dict, response.abi_return))) # type: ignore - return typing.cast(algokit_utils.SendAppTransactionResult[SecondaryMarketSchedule], parsed_response) - - def set_default_status( - self, - args: tuple[bool] | SetDefaultStatusArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "set_default_status(bool)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def primary_distribution( - self, - args: tuple[str, int] | PrimaryDistributionArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "primary_distribution(address,uint64)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def get_asset_info( - self, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[AssetInfo]: - - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)", - }), send_params=send_params) - parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(AssetInfo, typing.cast(dict, response.abi_return))) # type: ignore - return typing.cast(algokit_utils.SendAppTransactionResult[AssetInfo], parsed_response) - - def get_time_events( - self, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[list[int]]: - - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_time_events()uint64[]", - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[list[int]], parsed_response) - - def get_secondary_market_schedule( - self, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[list[int]]: - - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_secondary_market_schedule()uint64[]", - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[list[int]], parsed_response) - - def get_asset_metadata( - self, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[AssetMetadata]: - - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", - }), send_params=send_params) - parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(AssetMetadata, typing.cast(dict, response.abi_return))) # type: ignore - return typing.cast(algokit_utils.SendAppTransactionResult[AssetMetadata], parsed_response) - - def account_gov_suspension( - self, - args: tuple[str, bool] | AccountGovSuspensionArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_gov_suspension(address,bool)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def account_open( - self, - args: tuple[str, str] | AccountOpenArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_open(address,address)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def account_close( - self, - args: tuple[str] | AccountCloseArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[tuple[int, int]]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_close(address)(uint64,uint64)", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[tuple[int, int]], parsed_response) - - def account_update_payment_address( - self, - args: tuple[str, str] | AccountUpdatePaymentAddressArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_update_payment_address(address,address)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def account_get_info( - self, - args: tuple[str] | AccountGetInfoArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[AccountInfo]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_get_info(address)(address,uint64,uint64,uint64,bool)", - "args": method_args, - }), send_params=send_params) - parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(AccountInfo, typing.cast(dict, response.abi_return))) # type: ignore - return typing.cast(algokit_utils.SendAppTransactionResult[AccountInfo], parsed_response) - - def rbac_rotate_arranger( - self, - args: tuple[str] | RbacRotateArrangerArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_rotate_arranger(address)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def rbac_set_op_daemon( - self, - args: tuple[str] | RbacSetOpDaemonArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_set_op_daemon(address)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def rbac_assign_role( - self, - args: tuple[int, str, bytes | str] | RbacAssignRoleArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_assign_role(uint8,address,byte[])uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def rbac_revoke_role( - self, - args: tuple[int, str] | RbacRevokeRoleArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_revoke_role(uint8,address)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def rbac_gov_asset_suspension( - self, - args: tuple[bool] | RbacGovAssetSuspensionArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_gov_asset_suspension(bool)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def rbac_get_arranger( - self, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[str]: - - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_arranger()address", - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[str], parsed_response) - - def rbac_get_address_roles( - self, - args: tuple[str] | RbacGetAddressRolesArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[tuple[bool, bool, bool, bool, bool]]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[tuple[bool, bool, bool, bool, bool]], parsed_response) - - def rbac_get_role_config( - self, - args: tuple[int, str] | RbacGetRoleConfigArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[RoleConfig]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_role_config(uint8,address)(uint64,uint64)", - "args": method_args, - }), send_params=send_params) - parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(RoleConfig, typing.cast(dict, response.abi_return))) # type: ignore - return typing.cast(algokit_utils.SendAppTransactionResult[RoleConfig], parsed_response) - - def asset_create( - self, - args: tuple[str, AssetMetadata] | AssetCreateArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[None]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[None], parsed_response) - - def clear_state( - self, - params: algokit_utils.AppClientBareCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[algokit_utils.ABIReturn]: - return self.app_client.send.bare.clear_state( - params, - send_params=send_params, - ) - - -class GlobalStateValue(typing.TypedDict): - """Shape of global_state state key values""" - arranger: str - op_daemon: str - asset_suspended: int - asset_defaulted: int - total_units: int - circulating_units: int - unit_value: int - status: int - denomination_asset_id: int - settlement_asset_id: int - day_count_convention: int - metadata: bytes - principal_discount: int - interest_rate: int - total_coupons: int - primary_distribution_opening_date: int - primary_distribution_closure_date: int - issuance_date: int - secondary_market_opening_date: int - secondary_market_closure_date: int - maturity_date: int - -class BoxStateValue(typing.TypedDict): - """Shape of box state key values""" - time_events: list[int] - -class ZeroCouponBondState: - """Methods to access state for the current ZeroCouponBond app""" - - def __init__(self, app_client: algokit_utils.AppClient): - self.app_client = app_client - - @property - def global_state( - self - ) -> "_GlobalState": - """Methods to access global_state for the current app""" - return _GlobalState(self.app_client) - - @property - def box( - self - ) -> "_BoxState": - """Methods to access box for the current app""" - return _BoxState(self.app_client) - -class _GlobalState: - def __init__(self, app_client: algokit_utils.AppClient): - self.app_client = app_client - - # Pre-generated mapping of value types to their struct classes - self._struct_classes: dict[str, typing.Type[typing.Any]] = {} - - def get_all(self) -> GlobalStateValue: - """Get all current keyed values from global_state state""" - result = self.app_client.state.global_state.get_all() - if not result: - return typing.cast(GlobalStateValue, {}) - - converted = {} - for key, value in result.items(): - key_info = self.app_client.app_spec.state.keys.global_state.get(key) - struct_class = self._struct_classes.get(key_info.value_type) if key_info else None - converted[key] = ( - _init_dataclass(struct_class, value) if struct_class and isinstance(value, dict) - else value - ) - return typing.cast(GlobalStateValue, converted) - - @property - def arranger(self) -> str: - """Get the current value of the arranger key in global_state state""" - value = self.app_client.state.global_state.get_value("arranger") - if isinstance(value, dict) and "address" in self._struct_classes: - return _init_dataclass(self._struct_classes["address"], value) # type: ignore - return typing.cast(str, value) - - @property - def op_daemon(self) -> str: - """Get the current value of the op_daemon key in global_state state""" - value = self.app_client.state.global_state.get_value("op_daemon") - if isinstance(value, dict) and "address" in self._struct_classes: - return _init_dataclass(self._struct_classes["address"], value) # type: ignore - return typing.cast(str, value) - - @property - def asset_suspended(self) -> int: - """Get the current value of the asset_suspended key in global_state state""" - value = self.app_client.state.global_state.get_value("asset_suspended") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def asset_defaulted(self) -> int: - """Get the current value of the asset_defaulted key in global_state state""" - value = self.app_client.state.global_state.get_value("asset_defaulted") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def total_units(self) -> int: - """Get the current value of the total_units key in global_state state""" - value = self.app_client.state.global_state.get_value("total_units") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def circulating_units(self) -> int: - """Get the current value of the circulating_units key in global_state state""" - value = self.app_client.state.global_state.get_value("circulating_units") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def unit_value(self) -> int: - """Get the current value of the unit_value key in global_state state""" - value = self.app_client.state.global_state.get_value("unit_value") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def status(self) -> int: - """Get the current value of the status key in global_state state""" - value = self.app_client.state.global_state.get_value("status") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def denomination_asset_id(self) -> int: - """Get the current value of the denomination_asset_id key in global_state state""" - value = self.app_client.state.global_state.get_value("denomination_asset_id") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def settlement_asset_id(self) -> int: - """Get the current value of the settlement_asset_id key in global_state state""" - value = self.app_client.state.global_state.get_value("settlement_asset_id") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def day_count_convention(self) -> int: - """Get the current value of the day_count_convention key in global_state state""" - value = self.app_client.state.global_state.get_value("day_count_convention") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def metadata(self) -> bytes: - """Get the current value of the metadata key in global_state state""" - value = self.app_client.state.global_state.get_value("metadata") - if isinstance(value, dict) and "AVMBytes" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMBytes"], value) # type: ignore - return typing.cast(bytes, value) - - @property - def principal_discount(self) -> int: - """Get the current value of the principal_discount key in global_state state""" - value = self.app_client.state.global_state.get_value("principal_discount") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def interest_rate(self) -> int: - """Get the current value of the interest_rate key in global_state state""" - value = self.app_client.state.global_state.get_value("interest_rate") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def total_coupons(self) -> int: - """Get the current value of the total_coupons key in global_state state""" - value = self.app_client.state.global_state.get_value("total_coupons") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def primary_distribution_opening_date(self) -> int: - """Get the current value of the primary_distribution_opening_date key in global_state state""" - value = self.app_client.state.global_state.get_value("primary_distribution_opening_date") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def primary_distribution_closure_date(self) -> int: - """Get the current value of the primary_distribution_closure_date key in global_state state""" - value = self.app_client.state.global_state.get_value("primary_distribution_closure_date") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def issuance_date(self) -> int: - """Get the current value of the issuance_date key in global_state state""" - value = self.app_client.state.global_state.get_value("issuance_date") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def secondary_market_opening_date(self) -> int: - """Get the current value of the secondary_market_opening_date key in global_state state""" - value = self.app_client.state.global_state.get_value("secondary_market_opening_date") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def secondary_market_closure_date(self) -> int: - """Get the current value of the secondary_market_closure_date key in global_state state""" - value = self.app_client.state.global_state.get_value("secondary_market_closure_date") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def maturity_date(self) -> int: - """Get the current value of the maturity_date key in global_state state""" - value = self.app_client.state.global_state.get_value("maturity_date") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - -class _BoxState: - def __init__(self, app_client: algokit_utils.AppClient): - self.app_client = app_client - - # Pre-generated mapping of value types to their struct classes - self._struct_classes: dict[str, typing.Type[typing.Any]] = { - "RoleConfig": RoleConfig, - "AccountInfo": AccountInfo - } - - def get_all(self) -> BoxStateValue: - """Get all current keyed values from box state""" - result = self.app_client.state.box.get_all() - if not result: - return typing.cast(BoxStateValue, {}) - - converted = {} - for key, value in result.items(): - key_info = self.app_client.app_spec.state.keys.box.get(key) - struct_class = self._struct_classes.get(key_info.value_type) if key_info else None - converted[key] = ( - _init_dataclass(struct_class, value) if struct_class and isinstance(value, dict) - else value - ) - return typing.cast(BoxStateValue, converted) - - @property - def time_events(self) -> list[int]: - """Get the current value of the time_events key in box state""" - value = self.app_client.state.box.get_value("time_events") - if isinstance(value, dict) and "uint64[]" in self._struct_classes: - return _init_dataclass(self._struct_classes["uint64[]"], value) # type: ignore - return typing.cast(list[int], value) - - @property - def account_manager(self) -> "_MapState[str, RoleConfig]": - """Get values from the account_manager map in box state""" - return _MapState( - self.app_client.state.box, - "account_manager", - self._struct_classes.get("RoleConfig") - ) - - @property - def primary_dealer(self) -> "_MapState[str, RoleConfig]": - """Get values from the primary_dealer map in box state""" - return _MapState( - self.app_client.state.box, - "primary_dealer", - self._struct_classes.get("RoleConfig") - ) - - @property - def trustee(self) -> "_MapState[str, RoleConfig]": - """Get values from the trustee map in box state""" - return _MapState( - self.app_client.state.box, - "trustee", - self._struct_classes.get("RoleConfig") - ) - - @property - def authority(self) -> "_MapState[str, RoleConfig]": - """Get values from the authority map in box state""" - return _MapState( - self.app_client.state.box, - "authority", - self._struct_classes.get("RoleConfig") - ) - - @property - def interest_oracle(self) -> "_MapState[str, RoleConfig]": - """Get values from the interest_oracle map in box state""" - return _MapState( - self.app_client.state.box, - "interest_oracle", - self._struct_classes.get("RoleConfig") - ) - - @property - def account(self) -> "_MapState[str, AccountInfo]": - """Get values from the account map in box state""" - return _MapState( - self.app_client.state.box, - "account", - self._struct_classes.get("AccountInfo") - ) - -_KeyType = typing.TypeVar("_KeyType") -_ValueType = typing.TypeVar("_ValueType") - -class _AppClientStateMethodsProtocol(typing.Protocol): - def get_map(self, map_name: str) -> dict[typing.Any, typing.Any]: - ... - def get_map_value(self, map_name: str, key: typing.Any) -> typing.Any | None: - ... - -class _MapState(typing.Generic[_KeyType, _ValueType]): - """Generic class for accessing state maps with strongly typed keys and values""" - - def __init__(self, state_accessor: _AppClientStateMethodsProtocol, map_name: str, - struct_class: typing.Type[_ValueType] | None = None): - self._state_accessor = state_accessor - self._map_name = map_name - self._struct_class = struct_class - - def get_map(self) -> dict[_KeyType, _ValueType]: - """Get all current values in the map""" - result = self._state_accessor.get_map(self._map_name) - if self._struct_class and result: - return {k: _init_dataclass(self._struct_class, v) if isinstance(v, dict) else v - for k, v in result.items()} # type: ignore - return typing.cast(dict[_KeyType, _ValueType], result or {}) - - def get_value(self, key: _KeyType) -> _ValueType | None: - """Get a value from the map by key""" - key_value = dataclasses.asdict(key) if dataclasses.is_dataclass(key) else key # type: ignore - value = self._state_accessor.get_map_value(self._map_name, key_value) - if value is not None and self._struct_class and isinstance(value, dict): - return _init_dataclass(self._struct_class, value) # type: ignore - return typing.cast(_ValueType | None, value) - - -class ZeroCouponBondClient: - """Client for interacting with ZeroCouponBond smart contract""" - - @typing.overload - def __init__(self, app_client: algokit_utils.AppClient) -> None: ... - - @typing.overload - def __init__( - self, - *, - algorand: _AlgoKitAlgorandClient, - app_id: int, - app_name: str | None = None, - default_sender: str | None = None, - default_signer: TransactionSigner | None = None, - approval_source_map: SourceMap | None = None, - clear_source_map: SourceMap | None = None, - ) -> None: ... - - def __init__( - self, - app_client: algokit_utils.AppClient | None = None, - *, - algorand: _AlgoKitAlgorandClient | None = None, - app_id: int | None = None, - app_name: str | None = None, - default_sender: str | None = None, - default_signer: TransactionSigner | None = None, - approval_source_map: SourceMap | None = None, - clear_source_map: SourceMap | None = None, - ) -> None: - if app_client: - self.app_client = app_client - elif algorand and app_id: - self.app_client = algokit_utils.AppClient( - algokit_utils.AppClientParams( - algorand=algorand, - app_spec=APP_SPEC, - app_id=app_id, - app_name=app_name, - default_sender=default_sender, - default_signer=default_signer, - approval_source_map=approval_source_map, - clear_source_map=clear_source_map, - ) - ) - else: - raise ValueError("Either app_client or algorand and app_id must be provided") - - self.params = ZeroCouponBondParams(self.app_client) - self.create_transaction = ZeroCouponBondCreateTransactionParams(self.app_client) - self.send = ZeroCouponBondSend(self.app_client) - self.state = ZeroCouponBondState(self.app_client) - - @staticmethod - def from_creator_and_name( - creator_address: str, - app_name: str, - algorand: _AlgoKitAlgorandClient, - default_sender: str | None = None, - default_signer: TransactionSigner | None = None, - approval_source_map: SourceMap | None = None, - clear_source_map: SourceMap | None = None, - ignore_cache: bool | None = None, - app_lookup_cache: algokit_utils.ApplicationLookup | None = None, - ) -> "ZeroCouponBondClient": - return ZeroCouponBondClient( - algokit_utils.AppClient.from_creator_and_name( - creator_address=creator_address, - app_name=app_name, - app_spec=APP_SPEC, - algorand=algorand, - default_sender=default_sender, - default_signer=default_signer, - approval_source_map=approval_source_map, - clear_source_map=clear_source_map, - ignore_cache=ignore_cache, - app_lookup_cache=app_lookup_cache, - ) - ) - - @staticmethod - def from_network( - algorand: _AlgoKitAlgorandClient, - app_name: str | None = None, - default_sender: str | None = None, - default_signer: TransactionSigner | None = None, - approval_source_map: SourceMap | None = None, - clear_source_map: SourceMap | None = None, - ) -> "ZeroCouponBondClient": - return ZeroCouponBondClient( - algokit_utils.AppClient.from_network( - app_spec=APP_SPEC, - algorand=algorand, - app_name=app_name, - default_sender=default_sender, - default_signer=default_signer, - approval_source_map=approval_source_map, - clear_source_map=clear_source_map, - ) - ) - - @property - def app_id(self) -> int: - return self.app_client.app_id - - @property - def app_address(self) -> str: - return self.app_client.app_address - - @property - def app_name(self) -> str: - return self.app_client.app_name - - @property - def app_spec(self) -> algokit_utils.Arc56Contract: - return self.app_client.app_spec - - @property - def algorand(self) -> _AlgoKitAlgorandClient: - return self.app_client.algorand - - def clone( - self, - app_name: str | None = None, - default_sender: str | None = None, - default_signer: TransactionSigner | None = None, - approval_source_map: SourceMap | None = None, - clear_source_map: SourceMap | None = None, - ) -> "ZeroCouponBondClient": - return ZeroCouponBondClient( - self.app_client.clone( - app_name=app_name, - default_sender=default_sender, - default_signer=default_signer, - approval_source_map=approval_source_map, - clear_source_map=clear_source_map, - ) - ) - - def new_group(self) -> "ZeroCouponBondComposer": - return ZeroCouponBondComposer(self) - - @typing.overload - def decode_return_value( - self, - method: typing.Literal["asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void"], - return_value: algokit_utils.ABIReturn | None - ) -> None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64))"], - return_value: algokit_utils.ABIReturn | None - ) -> CurrentUnitsValue | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["get_payment_amount(address)(uint64,uint64)"], - return_value: algokit_utils.ABIReturn | None - ) -> PaymentAmounts | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["pay_principal(address,byte[])(uint64,uint64,byte[])"], - return_value: algokit_utils.ABIReturn | None - ) -> PaymentResult | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["asset_transfer(address,address,uint64)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["set_secondary_time_events(uint64[])(uint64,uint64)"], - return_value: algokit_utils.ABIReturn | None - ) -> SecondaryMarketSchedule | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["set_default_status(bool)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["primary_distribution(address,uint64)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)"], - return_value: algokit_utils.ABIReturn | None - ) -> AssetInfo | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["get_time_events()uint64[]"], - return_value: algokit_utils.ABIReturn | None - ) -> list[int] | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["get_secondary_market_schedule()uint64[]"], - return_value: algokit_utils.ABIReturn | None - ) -> list[int] | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)"], - return_value: algokit_utils.ABIReturn | None - ) -> AssetMetadata | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["account_gov_suspension(address,bool)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["account_open(address,address)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["account_close(address)(uint64,uint64)"], - return_value: algokit_utils.ABIReturn | None - ) -> tuple[int, int] | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["account_update_payment_address(address,address)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["account_get_info(address)(address,uint64,uint64,uint64,bool)"], - return_value: algokit_utils.ABIReturn | None - ) -> AccountInfo | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["rbac_rotate_arranger(address)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["rbac_set_op_daemon(address)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["rbac_assign_role(uint8,address,byte[])uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["rbac_revoke_role(uint8,address)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["rbac_gov_asset_suspension(bool)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["rbac_get_arranger()address"], - return_value: algokit_utils.ABIReturn | None - ) -> str | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["rbac_get_address_roles(address)(bool,bool,bool,bool,bool)"], - return_value: algokit_utils.ABIReturn | None - ) -> tuple[bool, bool, bool, bool, bool] | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["rbac_get_role_config(uint8,address)(uint64,uint64)"], - return_value: algokit_utils.ABIReturn | None - ) -> RoleConfig | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void"], - return_value: algokit_utils.ABIReturn | None - ) -> None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void"], - return_value: algokit_utils.ABIReturn | None - ) -> None: ... - @typing.overload - def decode_return_value( - self, - method: str, - return_value: algokit_utils.ABIReturn | None - ) -> algokit_utils.ABIValue | algokit_utils.ABIStruct | None: ... - - def decode_return_value( - self, - method: str, - return_value: algokit_utils.ABIReturn | None - ) -> algokit_utils.ABIValue | algokit_utils.ABIStruct | AccountInfo | AssetInfo | AssetMetadata | CurrentUnitsValue | None | PaymentAmounts | PaymentResult | RoleConfig | SecondaryMarketSchedule | int | list[int] | str | tuple[bool, bool, bool, bool, bool] | tuple[int, int]: - """Decode ABI return value for the given method.""" - if return_value is None: - return None - - arc56_method = self.app_spec.get_arc56_method(method) - decoded = return_value.get_arc56_value(arc56_method, self.app_spec.structs) - - # If method returns a struct, convert the dict to appropriate dataclass - if (arc56_method and - arc56_method.returns and - arc56_method.returns.struct and - isinstance(decoded, dict)): - struct_class = globals().get(arc56_method.returns.struct) - if struct_class: - return struct_class(**typing.cast(dict, decoded)) - return decoded - - -@dataclasses.dataclass(frozen=True) -class ZeroCouponBondMethodCallCreateParams( - algokit_utils.AppClientCreateSchema, algokit_utils.BaseAppClientMethodCallParams[ - AssetCreateArgs, - str | None, - ] -): - """Parameters for creating ZeroCouponBond contract using ABI""" - on_complete: typing.Literal[OnComplete.NoOpOC] | None = None - method: str | None = None - - def to_algokit_utils_params(self) -> algokit_utils.AppClientMethodCallCreateParams: - method_args = _parse_abi_args(self.args) - return algokit_utils.AppClientMethodCallCreateParams( - **{ - **self.__dict__, - "method": self.method or getattr(self.args, "abi_method_signature", None), - "args": method_args, - } - ) - -@dataclasses.dataclass(frozen=True) -class ZeroCouponBondMethodCallUpdateParams( - algokit_utils.BaseAppClientMethodCallParams[ - AssetUpdateArgs, - str | None, - ] -): - """Parameters for calling ZeroCouponBond contract using ABI""" - on_complete: typing.Literal[OnComplete.UpdateApplicationOC] | None = None - method: str | None = None - - def to_algokit_utils_params(self) -> algokit_utils.AppClientMethodCallParams: - method_args = _parse_abi_args(self.args) - return algokit_utils.AppClientMethodCallParams( - **{ - **self.__dict__, - "method": self.method or getattr(self.args, "abi_method_signature", None), - "args": method_args, - } - ) - -class ZeroCouponBondFactory(algokit_utils.TypedAppFactoryProtocol[ZeroCouponBondMethodCallCreateParams, ZeroCouponBondMethodCallUpdateParams, None]): - """Factory for deploying and managing ZeroCouponBondClient smart contracts""" - - def __init__( - self, - algorand: _AlgoKitAlgorandClient, - *, - app_name: str | None = None, - default_sender: str | None = None, - default_signer: TransactionSigner | None = None, - version: str | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None, - ): - self.app_factory = algokit_utils.AppFactory( - params=algokit_utils.AppFactoryParams( - algorand=algorand, - app_spec=APP_SPEC, - app_name=app_name, - default_sender=default_sender, - default_signer=default_signer, - version=version, - compilation_params=compilation_params, - ) - ) - self.params = ZeroCouponBondFactoryParams(self.app_factory) - self.create_transaction = ZeroCouponBondFactoryCreateTransaction(self.app_factory) - self.send = ZeroCouponBondFactorySend(self.app_factory) - - @property - def app_name(self) -> str: - return self.app_factory.app_name - - @property - def app_spec(self) -> algokit_utils.Arc56Contract: - return self.app_factory.app_spec - - @property - def algorand(self) -> _AlgoKitAlgorandClient: - return self.app_factory.algorand - - def deploy( - self, - *, - on_update: algokit_utils.OnUpdate | None = None, - on_schema_break: algokit_utils.OnSchemaBreak | None = None, - create_params: ZeroCouponBondMethodCallCreateParams | None = None, - update_params: ZeroCouponBondMethodCallUpdateParams | None = None, - delete_params: None = None, - existing_deployments: algokit_utils.ApplicationLookup | None = None, - ignore_cache: bool = False, - app_name: str | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None, - send_params: algokit_utils.SendParams | None = None, - ) -> tuple[ZeroCouponBondClient, algokit_utils.AppFactoryDeployResult]: - """Deploy the application""" - deploy_response = self.app_factory.deploy( - on_update=on_update, - on_schema_break=on_schema_break, - create_params=create_params.to_algokit_utils_params() if create_params else None, - update_params=update_params.to_algokit_utils_params() if update_params else None, - delete_params=delete_params, - existing_deployments=existing_deployments, - ignore_cache=ignore_cache, - app_name=app_name, - compilation_params=compilation_params, - send_params=send_params, - ) - - return ZeroCouponBondClient(deploy_response[0]), deploy_response[1] - - def get_app_client_by_creator_and_name( - self, - creator_address: str, - app_name: str, - default_sender: str | None = None, - default_signer: TransactionSigner | None = None, - ignore_cache: bool | None = None, - app_lookup_cache: algokit_utils.ApplicationLookup | None = None, - approval_source_map: SourceMap | None = None, - clear_source_map: SourceMap | None = None, - ) -> ZeroCouponBondClient: - """Get an app client by creator address and name""" - return ZeroCouponBondClient( - self.app_factory.get_app_client_by_creator_and_name( - creator_address, - app_name, - default_sender, - default_signer, - ignore_cache, - app_lookup_cache, - approval_source_map, - clear_source_map, - ) - ) - - def get_app_client_by_id( - self, - app_id: int, - app_name: str | None = None, - default_sender: str | None = None, - default_signer: TransactionSigner | None = None, - approval_source_map: SourceMap | None = None, - clear_source_map: SourceMap | None = None, - ) -> ZeroCouponBondClient: - """Get an app client by app ID""" - return ZeroCouponBondClient( - self.app_factory.get_app_client_by_id( - app_id, - app_name, - default_sender, - default_signer, - approval_source_map, - clear_source_map, - ) - ) - - -class ZeroCouponBondFactoryParams: - """Parameters for creating transactions for ZeroCouponBond contract""" - - def __init__(self, app_factory: algokit_utils.AppFactory): - self.app_factory = app_factory - self.create = ZeroCouponBondFactoryCreateParams(app_factory) - self.update = ZeroCouponBondFactoryUpdateParams(app_factory) - self.delete = ZeroCouponBondFactoryDeleteParams(app_factory) - -class ZeroCouponBondFactoryCreateParams: - """Parameters for 'create' operations of ZeroCouponBond contract""" - - def __init__(self, app_factory: algokit_utils.AppFactory): - self.app_factory = app_factory - - def bare( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateParams: - """Creates an instance using a bare call""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.bare.create( - algokit_utils.AppFactoryCreateParams(**dataclasses.asdict(params)), - compilation_params=compilation_params) - - def asset_config( - self, - args: tuple[int, int, int, int, int, int, int, list[int], list[int], list[tuple[int, int]]] | AssetConfigArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def get_account_units_current_value( - self, - args: tuple[str, int] | GetAccountUnitsCurrentValueArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64)) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64))", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def get_payment_amount( - self, - args: tuple[str] | GetPaymentAmountArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the get_payment_amount(address)(uint64,uint64) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "get_payment_amount(address)(uint64,uint64)", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def pay_principal( - self, - args: tuple[str, bytes | str] | PayPrincipalArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the pay_principal(address,byte[])(uint64,uint64,byte[]) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "pay_principal(address,byte[])(uint64,uint64,byte[])", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def asset_transfer( - self, - args: tuple[str, str, int] | AssetTransferArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the asset_transfer(address,address,uint64)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "asset_transfer(address,address,uint64)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def set_secondary_time_events( - self, - args: tuple[list[int]] | SetSecondaryTimeEventsArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the set_secondary_time_events(uint64[])(uint64,uint64) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "set_secondary_time_events(uint64[])(uint64,uint64)", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def set_default_status( - self, - args: tuple[bool] | SetDefaultStatusArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the set_default_status(bool)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "set_default_status(bool)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def primary_distribution( - self, - args: tuple[str, int] | PrimaryDistributionArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the primary_distribution(address,uint64)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "primary_distribution(address,uint64)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def get_asset_info( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)", - "args": None, - } - ), - compilation_params=compilation_params - ) - - def get_time_events( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the get_time_events()uint64[] ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "get_time_events()uint64[]", - "args": None, - } - ), - compilation_params=compilation_params - ) - - def get_secondary_market_schedule( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the get_secondary_market_schedule()uint64[] ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "get_secondary_market_schedule()uint64[]", - "args": None, - } - ), - compilation_params=compilation_params - ) - - def get_asset_metadata( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", - "args": None, - } - ), - compilation_params=compilation_params - ) - - def account_gov_suspension( - self, - args: tuple[str, bool] | AccountGovSuspensionArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the account_gov_suspension(address,bool)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "account_gov_suspension(address,bool)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def account_open( - self, - args: tuple[str, str] | AccountOpenArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the account_open(address,address)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "account_open(address,address)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def account_close( - self, - args: tuple[str] | AccountCloseArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the account_close(address)(uint64,uint64) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "account_close(address)(uint64,uint64)", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def account_update_payment_address( - self, - args: tuple[str, str] | AccountUpdatePaymentAddressArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the account_update_payment_address(address,address)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "account_update_payment_address(address,address)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def account_get_info( - self, - args: tuple[str] | AccountGetInfoArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the account_get_info(address)(address,uint64,uint64,uint64,bool) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "account_get_info(address)(address,uint64,uint64,uint64,bool)", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def rbac_rotate_arranger( - self, - args: tuple[str] | RbacRotateArrangerArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_rotate_arranger(address)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "rbac_rotate_arranger(address)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def rbac_set_op_daemon( - self, - args: tuple[str] | RbacSetOpDaemonArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_set_op_daemon(address)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "rbac_set_op_daemon(address)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def rbac_assign_role( - self, - args: tuple[int, str, bytes | str] | RbacAssignRoleArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_assign_role(uint8,address,byte[])uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "rbac_assign_role(uint8,address,byte[])uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def rbac_revoke_role( - self, - args: tuple[int, str] | RbacRevokeRoleArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_revoke_role(uint8,address)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "rbac_revoke_role(uint8,address)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def rbac_gov_asset_suspension( - self, - args: tuple[bool] | RbacGovAssetSuspensionArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_gov_asset_suspension(bool)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "rbac_gov_asset_suspension(bool)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def rbac_get_arranger( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_get_arranger()address ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "rbac_get_arranger()address", - "args": None, - } - ), - compilation_params=compilation_params - ) - - def rbac_get_address_roles( - self, - args: tuple[str] | RbacGetAddressRolesArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_get_address_roles(address)(bool,bool,bool,bool,bool) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def rbac_get_role_config( - self, - args: tuple[int, str] | RbacGetRoleConfigArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_get_role_config(uint8,address)(uint64,uint64) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "rbac_get_role_config(uint8,address)(uint64,uint64)", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def asset_create( - self, - args: tuple[str, AssetMetadata] | AssetCreateArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def asset_update( - self, - args: tuple[AssetMetadata] | AssetUpdateArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - -class ZeroCouponBondFactoryUpdateParams: - """Parameters for 'update' operations of ZeroCouponBond contract""" - - def __init__(self, app_factory: algokit_utils.AppFactory): - self.app_factory = app_factory - - def bare( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - - ) -> algokit_utils.AppUpdateParams: - """Updates an instance using a bare call""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.bare.deploy_update( - algokit_utils.AppClientBareCallParams(**dataclasses.asdict(params)), - ) - -class ZeroCouponBondFactoryDeleteParams: - """Parameters for 'delete' operations of ZeroCouponBond contract""" - - def __init__(self, app_factory: algokit_utils.AppFactory): - self.app_factory = app_factory - - def bare( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - - ) -> algokit_utils.AppDeleteParams: - """Deletes an instance using a bare call""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.bare.deploy_delete( - algokit_utils.AppClientBareCallParams(**dataclasses.asdict(params)), - ) - - -class ZeroCouponBondFactoryCreateTransaction: - """Create transactions for ZeroCouponBond contract""" - - def __init__(self, app_factory: algokit_utils.AppFactory): - self.app_factory = app_factory - self.create = ZeroCouponBondFactoryCreateTransactionCreate(app_factory) - - -class ZeroCouponBondFactoryCreateTransactionCreate: - """Create new instances of ZeroCouponBond contract""" - - def __init__(self, app_factory: algokit_utils.AppFactory): - self.app_factory = app_factory - - def bare( - self, - params: algokit_utils.CommonAppCallCreateParams | None = None, - ) -> Transaction: - """Creates a new instance using a bare call""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.create_transaction.bare.create( - algokit_utils.AppFactoryCreateParams(**dataclasses.asdict(params)), - ) - - -class ZeroCouponBondFactorySend: - """Send calls to ZeroCouponBond contract""" - - def __init__(self, app_factory: algokit_utils.AppFactory): - self.app_factory = app_factory - self.create = ZeroCouponBondFactorySendCreate(app_factory) - - -class ZeroCouponBondFactorySendCreate: - """Send create calls to ZeroCouponBond contract""" - - def __init__(self, app_factory: algokit_utils.AppFactory): - self.app_factory = app_factory - - def bare( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - send_params: algokit_utils.SendParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None, - ) -> tuple[ZeroCouponBondClient, algokit_utils.SendAppCreateTransactionResult]: - """Creates a new instance using a bare call""" - params = params or algokit_utils.CommonAppCallCreateParams() - result = self.app_factory.send.bare.create( - algokit_utils.AppFactoryCreateParams(**dataclasses.asdict(params)), - send_params=send_params, - compilation_params=compilation_params - ) - return ZeroCouponBondClient(result[0]), result[1] - - def asset_create( - self, - args: tuple[str, AssetMetadata] | AssetCreateArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - send_params: algokit_utils.SendParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> tuple[ZeroCouponBondClient, algokit_utils.AppFactoryCreateMethodCallResult[None]]: - """Creates and sends a transaction using the asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - client, result = self.app_factory.send.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void", - "args": _parse_abi_args(args), - } - ), - send_params=send_params, - compilation_params=compilation_params - ) - return_value = None if result.abi_return is None else typing.cast(None, result.abi_return) - - return ZeroCouponBondClient(client), algokit_utils.AppFactoryCreateMethodCallResult[None]( - **{ - **result.__dict__, - "app_id": result.app_id, - "abi_return": return_value, - "transaction": result.transaction, - "confirmation": result.confirmation, - "group_id": result.group_id, - "tx_ids": result.tx_ids, - "transactions": result.transactions, - "confirmations": result.confirmations, - "app_address": result.app_address, - } - ) - - -class _ZeroCouponBondUpdateComposer: - def __init__(self, composer: "ZeroCouponBondComposer"): - self.composer = composer - def asset_update( - self, - args: tuple[AssetMetadata] | AssetUpdateArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "ZeroCouponBondComposer": - self.composer._composer.add_app_update_method_call( - self.composer.client.params.update.asset_update( - args=args, - params=params, - compilation_params=compilation_params - ) - ) - self.composer._result_mappers.append( - lambda v: self.composer.client.decode_return_value( - "asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void", v - ) - ) - return self.composer - - -class ZeroCouponBondComposer: - """Composer for creating transaction groups for ZeroCouponBond contract calls""" - - def __init__(self, client: "ZeroCouponBondClient"): - self.client = client - self._composer = client.algorand.new_group() - self._result_mappers: list[typing.Callable[[algokit_utils.ABIReturn | None], object] | None] = [] - - @property - def update(self) -> "_ZeroCouponBondUpdateComposer": - return _ZeroCouponBondUpdateComposer(self) - - def asset_config( - self, - args: tuple[int, int, int, int, int, int, int, list[int], list[int], list[tuple[int, int]]] | AssetConfigArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "ZeroCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.asset_config( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void", v - ) - ) - return self - - def get_account_units_current_value( - self, - args: tuple[str, int] | GetAccountUnitsCurrentValueArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "ZeroCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.get_account_units_current_value( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64))", v - ) - ) - return self - - def get_payment_amount( - self, - args: tuple[str] | GetPaymentAmountArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "ZeroCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.get_payment_amount( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "get_payment_amount(address)(uint64,uint64)", v - ) - ) - return self - - def pay_principal( - self, - args: tuple[str, bytes | str] | PayPrincipalArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "ZeroCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.pay_principal( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "pay_principal(address,byte[])(uint64,uint64,byte[])", v - ) - ) - return self - - def asset_transfer( - self, - args: tuple[str, str, int] | AssetTransferArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "ZeroCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.asset_transfer( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "asset_transfer(address,address,uint64)uint64", v - ) - ) - return self - - def set_secondary_time_events( - self, - args: tuple[list[int]] | SetSecondaryTimeEventsArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "ZeroCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.set_secondary_time_events( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "set_secondary_time_events(uint64[])(uint64,uint64)", v - ) - ) - return self - - def set_default_status( - self, - args: tuple[bool] | SetDefaultStatusArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "ZeroCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.set_default_status( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "set_default_status(bool)uint64", v - ) - ) - return self - - def primary_distribution( - self, - args: tuple[str, int] | PrimaryDistributionArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "ZeroCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.primary_distribution( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "primary_distribution(address,uint64)uint64", v - ) - ) - return self - - def get_asset_info( - self, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "ZeroCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.get_asset_info( - - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)", v - ) - ) - return self - - def get_time_events( - self, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "ZeroCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.get_time_events( - - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "get_time_events()uint64[]", v - ) - ) - return self - - def get_secondary_market_schedule( - self, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "ZeroCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.get_secondary_market_schedule( - - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "get_secondary_market_schedule()uint64[]", v - ) - ) - return self - - def get_asset_metadata( - self, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "ZeroCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.get_asset_metadata( - - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", v - ) - ) - return self - - def account_gov_suspension( - self, - args: tuple[str, bool] | AccountGovSuspensionArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "ZeroCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.account_gov_suspension( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "account_gov_suspension(address,bool)uint64", v - ) - ) - return self - - def account_open( - self, - args: tuple[str, str] | AccountOpenArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "ZeroCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.account_open( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "account_open(address,address)uint64", v - ) - ) - return self - - def account_close( - self, - args: tuple[str] | AccountCloseArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "ZeroCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.account_close( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "account_close(address)(uint64,uint64)", v - ) - ) - return self - - def account_update_payment_address( - self, - args: tuple[str, str] | AccountUpdatePaymentAddressArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "ZeroCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.account_update_payment_address( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "account_update_payment_address(address,address)uint64", v - ) - ) - return self - - def account_get_info( - self, - args: tuple[str] | AccountGetInfoArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "ZeroCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.account_get_info( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "account_get_info(address)(address,uint64,uint64,uint64,bool)", v - ) - ) - return self - - def rbac_rotate_arranger( - self, - args: tuple[str] | RbacRotateArrangerArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "ZeroCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.rbac_rotate_arranger( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "rbac_rotate_arranger(address)uint64", v - ) - ) - return self - - def rbac_set_op_daemon( - self, - args: tuple[str] | RbacSetOpDaemonArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "ZeroCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.rbac_set_op_daemon( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "rbac_set_op_daemon(address)uint64", v - ) - ) - return self - - def rbac_assign_role( - self, - args: tuple[int, str, bytes | str] | RbacAssignRoleArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "ZeroCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.rbac_assign_role( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "rbac_assign_role(uint8,address,byte[])uint64", v - ) - ) - return self - - def rbac_revoke_role( - self, - args: tuple[int, str] | RbacRevokeRoleArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "ZeroCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.rbac_revoke_role( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "rbac_revoke_role(uint8,address)uint64", v - ) - ) - return self - - def rbac_gov_asset_suspension( - self, - args: tuple[bool] | RbacGovAssetSuspensionArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "ZeroCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.rbac_gov_asset_suspension( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "rbac_gov_asset_suspension(bool)uint64", v - ) - ) - return self - - def rbac_get_arranger( - self, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "ZeroCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.rbac_get_arranger( - - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "rbac_get_arranger()address", v - ) - ) - return self - - def rbac_get_address_roles( - self, - args: tuple[str] | RbacGetAddressRolesArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "ZeroCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.rbac_get_address_roles( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", v - ) - ) - return self - - def rbac_get_role_config( - self, - args: tuple[int, str] | RbacGetRoleConfigArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "ZeroCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.rbac_get_role_config( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "rbac_get_role_config(uint8,address)(uint64,uint64)", v - ) - ) - return self - - def asset_create( - self, - args: tuple[str, AssetMetadata] | AssetCreateArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "ZeroCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.asset_create( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void", v - ) - ) - return self - - def clear_state( - self, - *, - args: list[bytes] | None = None, - params: algokit_utils.CommonAppCallParams | None = None, - ) -> "ZeroCouponBondComposer": - params=params or algokit_utils.CommonAppCallParams() - self._composer.add_app_call( - self.client.params.clear_state( - algokit_utils.AppClientBareCallParams( - **{ - **dataclasses.asdict(params), - "args": args - } - ) - ) - ) - return self - - def add_transaction( - self, txn: Transaction, signer: TransactionSigner | None = None - ) -> "ZeroCouponBondComposer": - self._composer.add_transaction(txn, signer) - return self - - def composer(self) -> algokit_utils.TransactionComposer: - return self._composer - - def simulate( - self, - allow_more_logs: bool | None = None, - allow_empty_signatures: bool | None = None, - allow_unnamed_resources: bool | None = None, - extra_opcode_budget: int | None = None, - exec_trace_config: SimulateTraceConfig | None = None, - simulation_round: int | None = None, - skip_signatures: bool | None = None, - ) -> algokit_utils.SendAtomicTransactionComposerResults: - return self._composer.simulate( - allow_more_logs=allow_more_logs, - allow_empty_signatures=allow_empty_signatures, - allow_unnamed_resources=allow_unnamed_resources, - extra_opcode_budget=extra_opcode_budget, - exec_trace_config=exec_trace_config, - simulation_round=simulation_round, - skip_signatures=skip_signatures, - ) - - def send( - self, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAtomicTransactionComposerResults: - return self._composer.send(send_params) diff --git a/smart_contracts/fixed_coupon_bond/config.py b/smart_contracts/fixed_coupon_bond/config.py deleted file mode 100644 index 21ca9bb1..00000000 --- a/smart_contracts/fixed_coupon_bond/config.py +++ /dev/null @@ -1,9 +0,0 @@ -from typing import Final - -from smart_contracts import config as base_cfg - -# State Schema -GLOBAL_BYTES: Final[int] = base_cfg.GLOBAL_BYTES -GLOBAL_UINTS: Final[int] = base_cfg.GLOBAL_UINTS + 2 -LOCAL_BYTES: Final[int] = base_cfg.LOCAL_BYTES -LOCAL_UINTS: Final[int] = base_cfg.LOCAL_UINTS diff --git a/smart_contracts/fixed_coupon_bond/contract.py b/smart_contracts/fixed_coupon_bond/contract.py deleted file mode 100644 index 03b4d113..00000000 --- a/smart_contracts/fixed_coupon_bond/contract.py +++ /dev/null @@ -1,36 +0,0 @@ -from algopy import StateTotals, Txn - -from modules._actus import PAMCoreMixin -from modules._core_financial import ( - FixedCouponCashflowMixin, -) -from modules._payment_agent import ( - CouponPaymentAgentMixin, - PrincipalPaymentAgentMixin, -) -from modules._transfer_agent import CouponTransferAgentMixin -from smart_contracts import errors as err - -from . import config as cfg - - -class FixedCouponBond( - PAMCoreMixin, - FixedCouponCashflowMixin, - CouponPaymentAgentMixin, - PrincipalPaymentAgentMixin, - CouponTransferAgentMixin, - state_totals=StateTotals( - global_bytes=cfg.GLOBAL_BYTES, - global_uints=cfg.GLOBAL_UINTS, - local_bytes=cfg.LOCAL_BYTES, - local_uints=cfg.LOCAL_UINTS, - ), - avm_version=12, -): - def __init__(self) -> None: - super().__init__() - assert Txn.global_num_byte_slice == cfg.GLOBAL_BYTES, err.WRONG_GLOBAL_BYTES - assert Txn.global_num_uint == cfg.GLOBAL_UINTS, err.WRONG_GLOBAL_UINTS - assert Txn.local_num_byte_slice == cfg.LOCAL_BYTES, err.WRONG_LOCAL_BYTES - assert Txn.local_num_uint == cfg.LOCAL_UINTS, err.WRONG_LOCAL_UINTS diff --git a/smart_contracts/fixed_coupon_bond/deploy_config.py b/smart_contracts/fixed_coupon_bond/deploy_config.py deleted file mode 100644 index e72e4ba8..00000000 --- a/smart_contracts/fixed_coupon_bond/deploy_config.py +++ /dev/null @@ -1,61 +0,0 @@ -import logging -import os - -import algokit_utils - -from smart_contracts import constants as sc_cst - -logger = logging.getLogger(__name__) - - -# define deployment behaviour based on supplied app spec -def deploy() -> None: - from smart_contracts.artifacts.fixed_coupon_bond.fixed_coupon_bond_client import ( - AssetCreateArgs, - AssetMetadata, - AssetUpdateArgs, - FixedCouponBondFactory, - FixedCouponBondMethodCallCreateParams, - FixedCouponBondMethodCallUpdateParams, - ) - - algorand = algokit_utils.AlgorandClient.from_environment() - deployer = algorand.account.from_environment("DEPLOYER") - - factory = algorand.client.get_typed_app_factory( - FixedCouponBondFactory, default_sender=deployer.address - ) - - factory.deploy( - on_schema_break=algokit_utils.OnSchemaBreak.AppendApp, - on_update=algokit_utils.OnUpdate.UpdateApp, - create_params=FixedCouponBondMethodCallCreateParams( - args=AssetCreateArgs( - arranger=os.environ["ARRANGER_ADDRESS"], - metadata=AssetMetadata( - contract_type=sc_cst.CT_PAM, - calendar=sc_cst.CLDR_NC, - business_day_convention=sc_cst.BDC_NOS, - end_of_month_convention=sc_cst.EOMC_SD, - prepayment_effect=sc_cst.PPEF_N, - penalty_type=sc_cst.PYTP_N, - prospectus_hash=bytes(32), - prospectus_url="Fixed Coupon Bond Prospectus", - ), - ), - ), - update_params=FixedCouponBondMethodCallUpdateParams( - args=AssetUpdateArgs( - metadata=AssetMetadata( - contract_type=sc_cst.CT_PAM, - calendar=sc_cst.CLDR_NC, - business_day_convention=sc_cst.BDC_NOS, - end_of_month_convention=sc_cst.EOMC_SD, - prepayment_effect=sc_cst.PPEF_N, - penalty_type=sc_cst.PYTP_N, - prospectus_hash=bytes(32), - prospectus_url="Fixed Coupon Bond Prospectus", - ) - ), - ), - ) diff --git a/smart_contracts/mixin_composition.py b/smart_contracts/mixin_composition.py deleted file mode 100644 index 61fe165e..00000000 --- a/smart_contracts/mixin_composition.py +++ /dev/null @@ -1,353 +0,0 @@ -import ast -from dataclasses import dataclass -from pathlib import Path - - -@dataclass(frozen=True) -class ClassInfo: - fqcn: str - module: str - name: str - bases: tuple[str, ...] - methods: frozenset[str] - path: Path - - -class CompositionValidationError(ValueError): - pass - - -_SAFETY_RULES: tuple[tuple[str, tuple[str, ...], str], ...] = ( - ( - "modules.transfer_agent.coupon.CouponTransferAgentMixin", - ("core_prepare_transfer_with_coupon",), - "modules.transfer_agent.common.TransferAgentCommonMixin", - ), - ( - "modules.transfer_agent.no_coupon.NoCouponTransferAgentMixin", - ("core_prepare_transfer_no_coupon",), - "modules.transfer_agent.common.TransferAgentCommonMixin", - ), - ( - "modules.payment_agent.coupon.CouponPaymentAgentMixin", - ("core_prepare_coupon_payment", "core_apply_coupon_payment"), - "modules.payment_agent.common.PaymentAgentCommonMixin", - ), - ( - "modules.payment_agent.principal.PrincipalPaymentAgentMixin", - ("core_prepare_principal_payment", "core_apply_principal_payment"), - "modules.payment_agent.common.PaymentAgentCommonMixin", - ), - ( - "modules.transfer_agent.coupon.CouponTransferAgentMixin", - ("count_due_coupons", "all_due_coupons_paid"), - "modules.core_financial.common.CoreFinancialCommonMixin", - ), - ( - "modules.payment_agent.coupon.CouponPaymentAgentMixin", - ("count_due_coupons", "all_due_coupons_paid"), - "modules.core_financial.common.CoreFinancialCommonMixin", - ), - ( - "modules.payment_agent.principal.PrincipalPaymentAgentMixin", - ("assert_pay_principal_authorization",), - "modules.core_financial.common.CoreFinancialCommonMixin", - ), -) - - -def validate_contract_composition(contract_path: Path, source_root: Path) -> None: - class_map, alias_map = _index_classes(_resolve_source_roots(source_root)) - normalized_contract_path = contract_path.resolve() - target_classes = [ - info - for info in class_map.values() - if info.path.resolve() == normalized_contract_path - and not info.name.endswith("Mixin") - ] - if not target_classes: - raise CompositionValidationError( - f"No concrete contract class found in {contract_path}" - ) - - errors: list[str] = [] - mro_cache: dict[str, tuple[str, ...]] = {} - for target in target_classes: - errors.extend(_validate_class(target.fqcn, class_map, alias_map, mro_cache)) - - if errors: - raise CompositionValidationError("\n".join(errors)) - - -def _validate_class( - contract_fqcn: str, - class_map: dict[str, ClassInfo], - alias_map: dict[str, str], - mro_cache: dict[str, tuple[str, ...]], -) -> list[str]: - mro = _linearize(contract_fqcn, class_map, alias_map, mro_cache, set()) - mro_set = set(mro) - errors: list[str] = [] - - for agent_mixin, hooks, forbidden_owner in _SAFETY_RULES: - if agent_mixin not in mro_set: - continue - for hook in hooks: - owner = _resolve_hook_owner(hook, mro, class_map) - if owner is None: - errors.append( - f"Invalid mixin composition for {contract_fqcn}: hook '{hook}' " - "could not be resolved in MRO. Include the appropriate cashflow " - "mixin before agent mixins or provide an explicit safe override." - ) - continue - if owner == forbidden_owner: - errors.append( - f"Invalid mixin composition for {contract_fqcn}: hook '{hook}' " - f"resolves to unsafe default '{owner}'. Include the appropriate " - "cashflow mixin before agent mixins or provide an explicit safe " - "override." - ) - - return errors - - -def _resolve_hook_owner( - hook_name: str, mro: tuple[str, ...], class_map: dict[str, ClassInfo] -) -> str | None: - for class_fqcn in mro: - class_info = class_map.get(class_fqcn) - if class_info and hook_name in class_info.methods: - return class_fqcn - return None - - -def _linearize( - class_fqcn: str, - class_map: dict[str, ClassInfo], - alias_map: dict[str, str], - mro_cache: dict[str, tuple[str, ...]], - active_stack: set[str], -) -> tuple[str, ...]: - class_fqcn = _canonicalize_fqcn(class_fqcn, alias_map) - if class_fqcn in mro_cache: - return mro_cache[class_fqcn] - if class_fqcn in active_stack: - raise CompositionValidationError( - f"Cyclic inheritance detected while resolving MRO for {class_fqcn}" - ) - - class_info = class_map.get(class_fqcn) - if class_info is None: - mro_cache[class_fqcn] = (class_fqcn,) - return mro_cache[class_fqcn] - - active_stack.add(class_fqcn) - bases = [_canonicalize_fqcn(base, alias_map) for base in class_info.bases] - merged_bases = _c3_merge( - [ - list(_linearize(base, class_map, alias_map, mro_cache, active_stack)) - for base in bases - ] - + [bases.copy()] - ) - active_stack.remove(class_fqcn) - - mro_cache[class_fqcn] = (class_fqcn, *merged_bases) - return mro_cache[class_fqcn] - - -def _c3_merge(sequences: list[list[str]]) -> tuple[str, ...]: - result: list[str] = [] - work = [seq.copy() for seq in sequences if seq] - while work: - candidate = None - for seq in work: - head = seq[0] - if all(head not in other[1:] for other in work): - candidate = head - break - if candidate is None: - raise CompositionValidationError("Cannot resolve class MRO with C3 merge") - - result.append(candidate) - next_work: list[list[str]] = [] - for seq in work: - if seq and seq[0] == candidate: - seq = seq[1:] - if seq: - next_work.append(seq) - work = next_work - - return tuple(result) - - -def _resolve_source_roots(source_root: Path) -> tuple[Path, ...]: - """ - Build source roots for composition indexing. - - Contracts live under `smart_contracts/`, while shared mixins now live in the - sibling top-level `modules/` package. - """ - resolved_source_root = source_root.resolve() - source_roots: list[Path] = [resolved_source_root] - - sibling_modules_root = resolved_source_root.parent / "modules" - if ( - sibling_modules_root.is_dir() - and (sibling_modules_root / "__init__.py").exists() - ): - source_roots.append(sibling_modules_root.resolve()) - - deduped_roots: list[Path] = [] - seen_roots: set[Path] = set() - for root in source_roots: - if root in seen_roots: - continue - seen_roots.add(root) - deduped_roots.append(root) - return tuple(deduped_roots) - - -def _index_classes( - source_roots: tuple[Path, ...], -) -> tuple[dict[str, ClassInfo], dict[str, str]]: - class_map: dict[str, ClassInfo] = {} - alias_map: dict[str, str] = {} - for source_root in source_roots: - for source_file in source_root.rglob("*.py"): - if "artifacts" in source_file.parts: - continue - - module_name = _module_name_from_path(source_file, source_root) - source_ast = ast.parse(source_file.read_text(encoding="utf-8")) - module_class_names = { - node.name for node in source_ast.body if isinstance(node, ast.ClassDef) - } - import_map = _build_import_map( - source_ast, module_name, is_package=source_file.name == "__init__.py" - ) - for local_name, target_name in import_map.items(): - alias_map[f"{module_name}.{local_name}"] = target_name - - for node in source_ast.body: - if not isinstance(node, ast.ClassDef): - continue - base_names = tuple( - _resolve_base_name( - base, module_name, import_map, module_class_names - ) - for base in node.bases - ) - methods = frozenset( - child.name - for child in node.body - if isinstance(child, (ast.FunctionDef, ast.AsyncFunctionDef)) - ) - fqcn = f"{module_name}.{node.name}" - class_map[fqcn] = ClassInfo( - fqcn=fqcn, - module=module_name, - name=node.name, - bases=base_names, - methods=methods, - path=source_file, - ) - return class_map, alias_map - - -def _build_import_map( - module_ast: ast.Module, module_name: str, *, is_package: bool -) -> dict[str, str]: - import_map: dict[str, str] = {} - for node in module_ast.body: - if isinstance(node, ast.Import): - for alias in node.names: - local_name = alias.asname or alias.name.split(".")[0] - import_map[local_name] = alias.name - elif isinstance(node, ast.ImportFrom): - if node.module is None and node.level == 0: - continue - absolute_module = _resolve_import_module( - module_name, node.module, node.level, is_package=is_package - ) - for alias in node.names: - if alias.name == "*": - continue - local_name = alias.asname or alias.name - import_map[local_name] = f"{absolute_module}.{alias.name}" - return import_map - - -def _resolve_base_name( - base: ast.expr, - module_name: str, - import_map: dict[str, str], - module_class_names: set[str], -) -> str: - if isinstance(base, ast.Name): - if base.id in import_map: - return import_map[base.id] - if base.id in module_class_names: - return f"{module_name}.{base.id}" - return base.id - - dotted = _dotted_name(base) - if dotted is None: - return ast.unparse(base) - - root, _, remainder = dotted.partition(".") - if root in import_map: - imported = import_map[root] - return imported if not remainder else f"{imported}.{remainder}" - if root in module_class_names: - return f"{module_name}.{dotted}" - return dotted - - -def _dotted_name(node: ast.expr) -> str | None: - if isinstance(node, ast.Name): - return node.id - if isinstance(node, ast.Attribute): - base = _dotted_name(node.value) - if base is None: - return None - return f"{base}.{node.attr}" - return None - - -def _module_name_from_path(path: Path, source_root: Path) -> str: - parts = list(path.relative_to(source_root.parent).with_suffix("").parts) - if parts and parts[-1] == "__init__": - parts = parts[:-1] - return ".".join(parts) - - -def _resolve_import_module( - module_name: str, imported_module: str | None, level: int, *, is_package: bool -) -> str: - if level == 0: - if imported_module is None: - return module_name - return imported_module - - package_parts = module_name.split(".") - if not is_package: - package_parts = package_parts[:-1] - if level > len(package_parts): - raise CompositionValidationError( - f"Invalid relative import level {level} in module {module_name}" - ) - prefix = package_parts[: len(package_parts) - (level - 1)] - if imported_module: - return ".".join((*prefix, imported_module)) - return ".".join(prefix) - - -def _canonicalize_fqcn(fqcn: str, alias_map: dict[str, str]) -> str: - resolved = fqcn - seen: set[str] = set() - while resolved in alias_map and resolved not in seen: - seen.add(resolved) - resolved = alias_map[resolved] - return resolved diff --git a/smart_contracts/perpetual_bond/config.py b/smart_contracts/perpetual_bond/config.py deleted file mode 100644 index 621dff2c..00000000 --- a/smart_contracts/perpetual_bond/config.py +++ /dev/null @@ -1,13 +0,0 @@ -from typing import Final - -from smart_contracts import config as base_cfg - -# State Schema -GLOBAL_BYTES: Final[int] = base_cfg.GLOBAL_BYTES -GLOBAL_UINTS: Final[int] = base_cfg.GLOBAL_UINTS + 2 -LOCAL_BYTES: Final[int] = base_cfg.LOCAL_BYTES -LOCAL_UINTS: Final[int] = base_cfg.LOCAL_UINTS - -# Time Schedule Limits -# Perpetual bond has no maturity date -TIME_SCHEDULE_LIMITS: Final[int] = base_cfg.TIME_SCHEDULE_LIMITS - 1 diff --git a/smart_contracts/perpetual_bond/contract.py b/smart_contracts/perpetual_bond/contract.py deleted file mode 100644 index c6c4da5f..00000000 --- a/smart_contracts/perpetual_bond/contract.py +++ /dev/null @@ -1,34 +0,0 @@ -from algopy import StateTotals, Txn - -from modules._actus import PBNCoreMixin -from modules._core_financial import PerpetualCouponCashflowMixin -from modules._payment_agent import ( - CouponPaymentAgentMixin, - NoPrincipalPaymentMixin, -) -from modules._transfer_agent import CouponTransferAgentMixin -from smart_contracts import errors as err - -from . import config as cfg - - -class PerpetualBond( - PBNCoreMixin, - PerpetualCouponCashflowMixin, - NoPrincipalPaymentMixin, - CouponPaymentAgentMixin, - CouponTransferAgentMixin, - state_totals=StateTotals( - global_bytes=cfg.GLOBAL_BYTES, - global_uints=cfg.GLOBAL_UINTS, - local_bytes=cfg.LOCAL_BYTES, - local_uints=cfg.LOCAL_UINTS, - ), - avm_version=12, -): - def __init__(self) -> None: - super().__init__() - assert Txn.global_num_byte_slice == cfg.GLOBAL_BYTES, err.WRONG_GLOBAL_BYTES - assert Txn.global_num_uint == cfg.GLOBAL_UINTS, err.WRONG_GLOBAL_UINTS - assert Txn.local_num_byte_slice == cfg.LOCAL_BYTES, err.WRONG_LOCAL_BYTES - assert Txn.local_num_uint == cfg.LOCAL_UINTS, err.WRONG_LOCAL_UINTS diff --git a/smart_contracts/perpetual_bond/deploy_config.py b/smart_contracts/perpetual_bond/deploy_config.py deleted file mode 100644 index c8ea7cc5..00000000 --- a/smart_contracts/perpetual_bond/deploy_config.py +++ /dev/null @@ -1,61 +0,0 @@ -import logging -import os - -import algokit_utils - -from smart_contracts import constants as sc_cst - -logger = logging.getLogger(__name__) - - -# define deployment behaviour based on supplied app spec -def deploy() -> None: - from smart_contracts.artifacts.perpetual_bond.perpetual_bond_client import ( - AssetCreateArgs, - AssetMetadata, - AssetUpdateArgs, - PerpetualBondFactory, - PerpetualBondMethodCallCreateParams, - PerpetualBondMethodCallUpdateParams, - ) - - algorand = algokit_utils.AlgorandClient.from_environment() - deployer = algorand.account.from_environment("DEPLOYER") - - factory = algorand.client.get_typed_app_factory( - PerpetualBondFactory, default_sender=deployer.address - ) - - factory.deploy( - on_schema_break=algokit_utils.OnSchemaBreak.AppendApp, - on_update=algokit_utils.OnUpdate.UpdateApp, - create_params=PerpetualBondMethodCallCreateParams( - args=AssetCreateArgs( - arranger=os.environ["ARRANGER_ADDRESS"], - metadata=AssetMetadata( - contract_type=sc_cst.CT_PBN, - calendar=sc_cst.CLDR_NC, - business_day_convention=sc_cst.BDC_NOS, - end_of_month_convention=sc_cst.EOMC_SD, - prepayment_effect=sc_cst.PPEF_N, - penalty_type=sc_cst.PYTP_N, - prospectus_hash=bytes(32), - prospectus_url="Perpetual Bond Prospectus", - ), - ), - ), - update_params=PerpetualBondMethodCallUpdateParams( - args=AssetUpdateArgs( - metadata=AssetMetadata( - contract_type=sc_cst.CT_PBN, - calendar=sc_cst.CLDR_NC, - business_day_convention=sc_cst.BDC_NOS, - end_of_month_convention=sc_cst.EOMC_SD, - prepayment_effect=sc_cst.PPEF_N, - penalty_type=sc_cst.PYTP_N, - prospectus_hash=bytes(32), - prospectus_url="Perpetual Bond Prospectus", - ), - ), - ), - ) diff --git a/smart_contracts/zero_coupon_bond/config.py b/smart_contracts/zero_coupon_bond/config.py deleted file mode 100644 index 05e93a6d..00000000 --- a/smart_contracts/zero_coupon_bond/config.py +++ /dev/null @@ -1,9 +0,0 @@ -from typing import Final - -from smart_contracts import config as base_cfg - -# State Schema -GLOBAL_BYTES: Final[int] = base_cfg.GLOBAL_BYTES -GLOBAL_UINTS: Final[int] = base_cfg.GLOBAL_UINTS -LOCAL_BYTES: Final[int] = base_cfg.LOCAL_BYTES -LOCAL_UINTS: Final[int] = base_cfg.LOCAL_UINTS diff --git a/smart_contracts/zero_coupon_bond/contract.py b/smart_contracts/zero_coupon_bond/contract.py deleted file mode 100644 index cc44832a..00000000 --- a/smart_contracts/zero_coupon_bond/contract.py +++ /dev/null @@ -1,30 +0,0 @@ -from algopy import StateTotals, Txn - -from modules._actus import PAMCoreMixin -from modules._core_financial import NoCouponCashflowMixin -from modules._payment_agent import PrincipalPaymentAgentMixin -from modules._transfer_agent import NoCouponTransferAgentMixin -from smart_contracts import errors as err - -from . import config as cfg - - -class ZeroCouponBond( - PAMCoreMixin, - NoCouponCashflowMixin, - PrincipalPaymentAgentMixin, - NoCouponTransferAgentMixin, - state_totals=StateTotals( - global_bytes=cfg.GLOBAL_BYTES, - global_uints=cfg.GLOBAL_UINTS, - local_bytes=cfg.LOCAL_BYTES, - local_uints=cfg.LOCAL_UINTS, - ), - avm_version=12, -): - def __init__(self) -> None: - super().__init__() - assert Txn.global_num_byte_slice == cfg.GLOBAL_BYTES, err.WRONG_GLOBAL_BYTES - assert Txn.global_num_uint == cfg.GLOBAL_UINTS, err.WRONG_GLOBAL_UINTS - assert Txn.local_num_byte_slice == cfg.LOCAL_BYTES, err.WRONG_LOCAL_BYTES - assert Txn.local_num_uint == cfg.LOCAL_UINTS, err.WRONG_LOCAL_UINTS diff --git a/smart_contracts/zero_coupon_bond/deploy_config.py b/smart_contracts/zero_coupon_bond/deploy_config.py deleted file mode 100644 index f482b04c..00000000 --- a/smart_contracts/zero_coupon_bond/deploy_config.py +++ /dev/null @@ -1,61 +0,0 @@ -import logging -import os - -import algokit_utils - -from smart_contracts import constants as sc_cst - -logger = logging.getLogger(__name__) - - -# define deployment behaviour based on supplied app spec -def deploy() -> None: - from smart_contracts.artifacts.zero_coupon_bond.zero_coupon_bond_client import ( - AssetCreateArgs, - AssetMetadata, - AssetUpdateArgs, - ZeroCouponBondFactory, - ZeroCouponBondMethodCallCreateParams, - ZeroCouponBondMethodCallUpdateParams, - ) - - algorand = algokit_utils.AlgorandClient.from_environment() - deployer = algorand.account.from_environment("DEPLOYER") - - factory = algorand.client.get_typed_app_factory( - ZeroCouponBondFactory, default_sender=deployer.address - ) - - factory.deploy( - on_schema_break=algokit_utils.OnSchemaBreak.AppendApp, - on_update=algokit_utils.OnUpdate.UpdateApp, - create_params=ZeroCouponBondMethodCallCreateParams( - args=AssetCreateArgs( - arranger=os.environ["ARRANGER_ADDRESS"], - metadata=AssetMetadata( - contract_type=sc_cst.CT_PAM, - calendar=sc_cst.CLDR_NC, - business_day_convention=sc_cst.BDC_NOS, - end_of_month_convention=sc_cst.EOMC_SD, - prepayment_effect=sc_cst.PPEF_N, - penalty_type=sc_cst.PYTP_N, - prospectus_hash=bytes(32), - prospectus_url="Zero Coupon Bond Prospectus", - ), - ), - ), - update_params=ZeroCouponBondMethodCallUpdateParams( - args=AssetUpdateArgs( - metadata=AssetMetadata( - contract_type=sc_cst.CT_PAM, - calendar=sc_cst.CLDR_NC, - business_day_convention=sc_cst.BDC_NOS, - end_of_month_convention=sc_cst.EOMC_SD, - prepayment_effect=sc_cst.PPEF_N, - penalty_type=sc_cst.PYTP_N, - prospectus_hash=bytes(32), - prospectus_url="Zero Coupon Bond Prospectus", - ), - ), - ), - ) diff --git a/tests/test_mixin_composition_guards.py b/tests/test_mixin_composition_guards.py deleted file mode 100644 index 03343698..00000000 --- a/tests/test_mixin_composition_guards.py +++ /dev/null @@ -1,137 +0,0 @@ -from pathlib import Path -from textwrap import dedent - -import pytest - -from smart_contracts.mixin_composition import ( - CompositionValidationError, - validate_contract_composition, -) - -REPO_ROOT = Path(__file__).resolve().parents[1] -SMART_CONTRACTS_ROOT = REPO_ROOT / "smart_contracts" - - -def _validate_source(tmp_path: Path, source: str) -> None: - scratch_dir = SMART_CONTRACTS_ROOT / "_tmp_mixin_guards" - scratch_dir.mkdir(parents=True, exist_ok=True) - - source_path = scratch_dir / f"tmp_{tmp_path.name.replace('-', '_')}.py" - source_path.write_text(dedent(source), encoding="utf-8") - try: - validate_contract_composition(source_path, SMART_CONTRACTS_ROOT) - finally: - source_path.unlink(missing_ok=True) - # Remove directory if empty - try: - scratch_dir.rmdir() - except OSError: - pass - - -def test_pass_existing_fixed_coupon_contract() -> None: - validate_contract_composition( - SMART_CONTRACTS_ROOT / "fixed_coupon_bond" / "contract.py", - SMART_CONTRACTS_ROOT, - ) - - -def test_fail_coupon_transfer_without_coupon_cashflow(tmp_path: Path) -> None: - with pytest.raises( - CompositionValidationError, match="core_prepare_transfer_with_coupon" - ): - _validate_source( - tmp_path, - """ - from modules.transfer_agent import CouponTransferAgentMixin - - - class BrokenCouponTransfer(CouponTransferAgentMixin): - pass - """, - ) - - -def test_fail_coupon_transfer_wrong_mro_default_wins(tmp_path: Path) -> None: - with pytest.raises( - CompositionValidationError, match="core_prepare_transfer_with_coupon" - ): - _validate_source( - tmp_path, - """ - from modules.core_financial import FixedCouponCashflowMixin - from modules.transfer_agent import CouponTransferAgentMixin - - - class WrongOrderCouponTransfer( - CouponTransferAgentMixin, - FixedCouponCashflowMixin, - ): - pass - """, - ) - - -def test_fail_coupon_payment_without_coupon_cashflow(tmp_path: Path) -> None: - with pytest.raises(CompositionValidationError, match="core_prepare_coupon_payment"): - _validate_source( - tmp_path, - """ - from modules.payment_agent import CouponPaymentAgentMixin - - - class BrokenCouponPayment(CouponPaymentAgentMixin): - pass - """, - ) - - -def test_fail_coupon_counting_hook_not_overridden(tmp_path: Path) -> None: - with pytest.raises(CompositionValidationError, match="count_due_coupons"): - _validate_source( - tmp_path, - """ - from modules.core_financial import CouponCashflowMixin - from modules.payment_agent import CouponPaymentAgentMixin - - - class BrokenCouponCounting(CouponCashflowMixin, CouponPaymentAgentMixin): - pass - """, - ) - - -def test_fail_principal_payment_without_cashflow_provider(tmp_path: Path) -> None: - with pytest.raises( - CompositionValidationError, match="core_prepare_principal_payment" - ): - _validate_source( - tmp_path, - """ - from modules.payment_agent import PrincipalPaymentAgentMixin - - - class BrokenPrincipalPayment(PrincipalPaymentAgentMixin): - pass - """, - ) - - -def test_fail_principal_authorization_hook_not_overridden(tmp_path: Path) -> None: - with pytest.raises( - CompositionValidationError, match="assert_pay_principal_authorization" - ): - _validate_source( - tmp_path, - """ - from modules.core_financial import NoCouponCashflowMixin - from modules.payment_agent import PrincipalPaymentAgentMixin - - - class BrokenPrincipalAuthorization( - NoCouponCashflowMixin, - PrincipalPaymentAgentMixin, - ): - pass - """, - ) From e450517c7d62f053b4196fe80a08e44979bd44a2 Mon Sep 17 00:00:00 2001 From: cusma Date: Thu, 12 Mar 2026 17:15:28 +0100 Subject: [PATCH 100/244] chore: remove annotations --- modules/__init__.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/modules/__init__.py b/modules/__init__.py index a6468865..8bff0f3b 100644 --- a/modules/__init__.py +++ b/modules/__init__.py @@ -1,5 +1,3 @@ -from __future__ import annotations - from .accounting import AccountingModule from .kernel import ActusKernelModule from .payment_agent import PaymentAgent From c990c82b504efe809f731285dffeb8ae22f3073b Mon Sep 17 00:00:00 2001 From: cusma Date: Thu, 12 Mar 2026 17:15:46 +0100 Subject: [PATCH 101/244] chore: remove deprecated mixins --- smart_contracts/__main__.py | 53 +++++++------------------------------ 1 file changed, 9 insertions(+), 44 deletions(-) diff --git a/smart_contracts/__main__.py b/smart_contracts/__main__.py index 50e5f440..0ad0ca3d 100644 --- a/smart_contracts/__main__.py +++ b/smart_contracts/__main__.py @@ -10,9 +10,7 @@ from algokit_utils.config import config from dotenv import load_dotenv -from smart_contracts import errors as err - -from .mixin_composition import CompositionValidationError, validate_contract_composition +config.configure(debug=True, trace_all=False) # Set up logging and load environment variables. logging.basicConfig( @@ -22,11 +20,6 @@ logger.info("Loading .env") load_dotenv() -# Set trace_all to True to capture all transactions, defaults to capturing traces only on failure -# Learn more about using AlgoKit AVM Debugger to debug your TEAL source codes and inspect various kinds of -# Algorand transactions in atomic groups -> https://github.com/algorandfoundation/algokit-avm-vscode-debugger -config.configure(debug=True, trace_all=False, logger=logger) - # Determine the root path based on this file's location. root_path = Path(__file__).parent @@ -79,10 +72,6 @@ def has_contract_file(directory: Path) -> bool: # -------------------------- Build Logic -------------------------- # deployment_extension = "py" -INVALID_MIXIN_MARKERS: tuple[str, ...] = ( - "INVALID_MIXIN_COMPOSITION", - err.INVALID_MIXIN_COMPOSITION, -) def _get_output_path(output_dir: Path, deployment_extension: str) -> Path: @@ -94,36 +83,11 @@ def _get_output_path(output_dir: Path, deployment_extension: str) -> Path: ) -def _assert_no_invalid_mixin_markers(output_dir: Path) -> None: - scanned_files = list(output_dir.glob("*.teal")) + list( - output_dir.glob("*.arc56.json") - ) - offending: list[Path] = [] - for artifact_file in scanned_files: - content = artifact_file.read_text(encoding="utf-8") - if any(marker in content for marker in INVALID_MIXIN_MARKERS): - offending.append(artifact_file) - if offending: - file_list = "\n".join(f"- {file}" for file in offending) - raise Exception( - "Invalid mixin composition marker found in compiled artifacts:\n" - f"{file_list}\n" - "This indicates a broken MRO/composition, aborting." - ) - - def build(output_dir: Path, contract_path: Path) -> Path: """ Builds the contract by exporting (compiling) its source and generating a client. If the output directory already exists, it is cleared. """ - try: - validate_contract_composition(contract_path, root_path) - except CompositionValidationError as exc: - raise Exception( - f"Could not build contract due to invalid mixin composition:\n{exc}" - ) from exc - output_dir = output_dir.resolve() if output_dir.exists(): rmtree(output_dir) @@ -138,14 +102,16 @@ def build(output_dir: Path, contract_path: Path) -> Path: "python", str(contract_path.resolve()), f"--out-dir={output_dir}", - "--no-output-arc32", - "--output-arc56", "--output-source-map", ], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True, ) + + if build_result.stdout: + print(build_result.stdout) + if build_result.returncode: raise Exception(f"Could not build contract:\n{build_result.stdout}") @@ -176,6 +142,10 @@ def build(output_dir: Path, contract_path: Path) -> Path: stderr=subprocess.STDOUT, text=True, ) + + if generate_result.stdout: + print(generate_result.stdout) + if generate_result.returncode: if "No such command" in generate_result.stdout: raise Exception( @@ -185,9 +155,6 @@ def build(output_dir: Path, contract_path: Path) -> Path: raise Exception( f"Could not generate typed client:\n{generate_result.stdout}" ) - - _assert_no_invalid_mixin_markers(output_dir) - if client_file: return output_dir / client_file return output_dir @@ -224,7 +191,6 @@ def main(action: str, contract_name: str | None = None) -> None: ) if app_spec_file_name is None: raise Exception("Could not deploy app, .arc56.json file not found") - _assert_no_invalid_mixin_markers(output_dir) if contract.deploy: logger.info(f"Deploying app {contract.name}") contract.deploy() @@ -232,7 +198,6 @@ def main(action: str, contract_name: str | None = None) -> None: for contract in filtered_contracts: logger.info(f"Building app at {contract.path}") build(artifact_path / contract.name, contract.path) - _assert_no_invalid_mixin_markers(artifact_path / contract.name) if contract.deploy: logger.info(f"Deploying {contract.name}") contract.deploy() From 0cf3beba26fd753d9719493bba8aa6132a5943f5 Mon Sep 17 00:00:00 2001 From: cusma Date: Thu, 12 Mar 2026 17:15:53 +0100 Subject: [PATCH 102/244] chore: remove deprecated types --- smart_contracts/abi_types.py | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/smart_contracts/abi_types.py b/smart_contracts/abi_types.py index feb3facf..090b7782 100644 --- a/smart_contracts/abi_types.py +++ b/smart_contracts/abi_types.py @@ -14,21 +14,6 @@ ) -class PaymentAmounts(Struct, kw_only=True): - """D-ASA Payment Amounts""" - - interest: UInt64 - principal: UInt64 - - -class PaymentResult(Struct, kw_only=True): - """D-ASA Payment Result""" - - amount: UInt64 - timestamp: UInt64 - context: Bytes - - class RoleValidity(Struct, kw_only=True): """D-ASA Role Configuration""" From ae400661b91ce1896fedf226c804a86ac9e7aa95 Mon Sep 17 00:00:00 2001 From: cusma Date: Thu, 12 Mar 2026 17:16:01 +0100 Subject: [PATCH 103/244] chore: private subs --- modules/accounting.py | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/modules/accounting.py b/modules/accounting.py index 58970532..6e01f3c6 100644 --- a/modules/accounting.py +++ b/modules/accounting.py @@ -57,7 +57,7 @@ def _settle_position(self, holding_address: Account) -> tuple[UInt64, UInt64]: Tuple of newly accrued `(claimable_interest, claimable_principal)` amounts. """ - self.assert_valid_holding_address(holding_address) + self._assert_valid_holding_address(holding_address) position = self.account[holding_address].copy() # Compute the incremental per-unit fixed-point interest and principal accrued @@ -96,8 +96,8 @@ def _settle_position(self, holding_address: Account) -> tuple[UInt64, UInt64]: def _ensure_units_activated(self, holding_address: Account) -> None: """Move reserved pre-IED units into active units once IED has executed.""" - self.assert_valid_holding_address(holding_address) - if self.status_is_pending_ied(): + self._assert_valid_holding_address(holding_address) + if self._status_is_pending_ied(): return position = self.account[holding_address].copy() @@ -180,8 +180,8 @@ def account_gov_suspension( UNAUTHORIZED: Not authorized INVALID_HOLDING_ADDRESS: Invalid account holding address """ - self.assert_caller_is_authority() - self.assert_valid_holding_address(holding_address) + self._assert_caller_is_authority() + self._assert_valid_holding_address(holding_address) self.account[holding_address].suspended = suspended return Global.latest_timestamp @@ -206,10 +206,10 @@ def account_open( INVALID_HOLDING_ADDRESS: Invalid account holding address """ - self.assert_caller_is_account_manager() - assert not self.status_is_ended(), err.UNAUTHORIZED - self.assert_is_not_asset_defaulted() - self.assert_is_not_asset_suspended() + self._assert_caller_is_account_manager() + assert not self._status_is_ended(), err.UNAUTHORIZED + self._assert_is_not_asset_defaulted() + self._assert_is_not_asset_suspended() assert holding_address not in self.account, err.INVALID_HOLDING_ADDRESS self.account[holding_address] = self._new_account_position(payment_address) return Global.latest_timestamp @@ -234,10 +234,10 @@ def account_update_payment_address( SUSPENDED: Suspended operations INVALID_HOLDING_ADDRESS: Invalid account holding address """ - self.assert_valid_holding_address(holding_address) + self._assert_valid_holding_address(holding_address) assert Txn.sender == holding_address, err.UNAUTHORIZED - self.assert_is_not_asset_defaulted() - self.assert_is_not_asset_suspended() + self._assert_is_not_asset_defaulted() + self._assert_is_not_asset_suspended() self.account[holding_address].payment_address = payment_address return Global.latest_timestamp @@ -255,5 +255,5 @@ def account_get_position(self, *, holding_address: Account) -> typ.AccountPositi Raises: INVALID_HOLDING_ADDRESS: Invalid account holding address """ - self.assert_valid_holding_address(holding_address) + self._assert_valid_holding_address(holding_address) return self.account[holding_address] From add2c42db4d89b0a1530d8607c800e4c1204110d Mon Sep 17 00:00:00 2001 From: cusma Date: Thu, 12 Mar 2026 17:16:10 +0100 Subject: [PATCH 104/244] chore: remove deprecated errors --- smart_contracts/errors.py | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/smart_contracts/errors.py b/smart_contracts/errors.py index 72a4d211..56c1871d 100644 --- a/smart_contracts/errors.py +++ b/smart_contracts/errors.py @@ -1,6 +1,3 @@ -# Build -INVALID_MIXIN_COMPOSITION = "Invalid mixin composition" - # State Schema WRONG_GLOBAL_BYTES = "Wrong Global Bytes allocation" WRONG_GLOBAL_UINTS = "Wrong Global UInts allocation" @@ -63,14 +60,5 @@ NULL_TRANSFER = "Transfer units must be greater than zero" OVER_TRANSFER = "Insufficient sender units to transfer" -# Pay Coupon -NO_DUE_COUPON = "No due coupon to pay" - -# Pay Principal -NOT_MATURE = "Not mature" - # Get Account Units Current Value NO_PRIMARY_DISTRIBUTION = "Primary distribution not yet executed" - -# Get Accrued Interest Amount -INVALID_UNITS = "Invalid amount of units for the account" From eb6229e0d4150a481091c2f3a788eb4f4dedbb14 Mon Sep 17 00:00:00 2001 From: cusma Date: Thu, 12 Mar 2026 17:16:18 +0100 Subject: [PATCH 105/244] chore: lint --- modules/kernel.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/modules/kernel.py b/modules/kernel.py index a119cad5..17e8f76d 100644 --- a/modules/kernel.py +++ b/modules/kernel.py @@ -36,13 +36,14 @@ op, ) -from .rbac import RbacModule from smart_contracts import abi_types as typ from smart_contracts import constants as cst from smart_contracts import enums from smart_contracts import errors as err from smart_contracts.events import ExecutionEvent +from .rbac import RbacModule + class ActusKernelModule(RbacModule): """ @@ -823,7 +824,7 @@ def _store_contract_config( self.reserved_units_total = UInt64(0) # Day-Count Conventions - self.day_count_convention = terms.day_count_convention + self.day_count_convention = terms.day_count_convention.as_uint64() # Time self.initial_exchange_date = terms.initial_exchange_date @@ -1029,7 +1030,7 @@ def contract_config( self._store_contract_config(self.contract_type, terms, initial_state) # Notarize prospectus (optional) - self.prospectus_hash = prospectus.hash + self.prospectus_hash = prospectus.hash.bytes self.prospectus_url = prospectus.url return Global.latest_timestamp From 394a351bcdf2a71815596ff54cfe201f585238f6 Mon Sep 17 00:00:00 2001 From: cusma Date: Thu, 12 Mar 2026 17:16:32 +0100 Subject: [PATCH 106/244] feat: d-asa --- smart_contracts/d-asa/contract.py | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 smart_contracts/d-asa/contract.py diff --git a/smart_contracts/d-asa/contract.py b/smart_contracts/d-asa/contract.py new file mode 100644 index 00000000..88212447 --- /dev/null +++ b/smart_contracts/d-asa/contract.py @@ -0,0 +1,26 @@ +from algopy import StateTotals, Txn + +from modules import PaymentAgent, TransferAgent +from smart_contracts import config as cfg +from smart_contracts import errors as err + + +class ActusApp( + PaymentAgent, + TransferAgent, + state_totals=StateTotals( + global_bytes=cfg.GLOBAL_BYTES, + global_uints=cfg.GLOBAL_UINTS, + local_bytes=cfg.LOCAL_BYTES, + local_uints=cfg.LOCAL_UINTS, + ), + avm_version=12, +): + """Debt Algorand Standard Application.""" + + def __init__(self) -> None: + super().__init__() + assert Txn.global_num_byte_slice == cfg.GLOBAL_BYTES, err.WRONG_GLOBAL_BYTES + assert Txn.global_num_uint == cfg.GLOBAL_UINTS, err.WRONG_GLOBAL_UINTS + assert Txn.local_num_byte_slice == cfg.LOCAL_BYTES, err.WRONG_LOCAL_BYTES + assert Txn.local_num_uint == cfg.LOCAL_UINTS, err.WRONG_LOCAL_UINTS From 8adc973a3b64cdda49f401ce32ecdd930daeebd7 Mon Sep 17 00:00:00 2001 From: cusma Date: Thu, 12 Mar 2026 18:23:21 +0100 Subject: [PATCH 107/244] chore: remove secondary market from normalized terms --- smart_contracts/abi_types.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/smart_contracts/abi_types.py b/smart_contracts/abi_types.py index 090b7782..6bc7d9a3 100644 --- a/smart_contracts/abi_types.py +++ b/smart_contracts/abi_types.py @@ -47,8 +47,6 @@ class NormalizedActusTerms(Struct, kw_only=True): initial_exchange_amount: UInt64 initial_exchange_date: TimeStamp maturity_date: TimeStamp - secondary_market_opening_date: TimeStamp - secondary_market_closure_date: TimeStamp day_count_convention: DayCountConvention rate_reset_spread: UInt64 rate_reset_multiplier: UInt64 From ce4578fe883ae16ec34dce4015c3343a574ba947 Mon Sep 17 00:00:00 2001 From: cusma Date: Thu, 12 Mar 2026 18:23:31 +0100 Subject: [PATCH 108/244] chore: transfer closed --- smart_contracts/errors.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/smart_contracts/errors.py b/smart_contracts/errors.py index 56c1871d..aa00754f 100644 --- a/smart_contracts/errors.py +++ b/smart_contracts/errors.py @@ -55,10 +55,10 @@ PRIMARY_DISTRIBUTION_CLOSED = "Primary distribution is closed" # Asset Transfer -SECONDARY_MARKET_CLOSED = "Secondary market is closed" SELF_TRANSFER = "Sender and receiver must be different" NULL_TRANSFER = "Transfer units must be greater than zero" OVER_TRANSFER = "Insufficient sender units to transfer" +CLOSED_TRANSFER = "Transfer is closed" # Get Account Units Current Value NO_PRIMARY_DISTRIBUTION = "Primary distribution not yet executed" From 1c4b761fce2287cf1045e6302df7c4ea2366da97 Mon Sep 17 00:00:00 2001 From: cusma Date: Thu, 12 Mar 2026 18:23:43 +0100 Subject: [PATCH 109/244] chore: remove event parsing --- smart_contracts/events.py | 45 --------------------------------------- 1 file changed, 45 deletions(-) diff --git a/smart_contracts/events.py b/smart_contracts/events.py index 19368786..87af2581 100644 --- a/smart_contracts/events.py +++ b/smart_contracts/events.py @@ -1,7 +1,6 @@ from typing import TypeAlias from algopy import Asset, UInt64, arc4 -from algosdk.abi import TupleType, UintType Timestamp: TypeAlias = UInt64 @@ -19,47 +18,3 @@ class ExecutionEvent(arc4.Struct, kw_only=True): settled_amount: UInt64 currency_id: Asset sequence: UInt64 - - -_ACTUS_EXECUTION_EVENT_TUPLE = TupleType( - [ - UintType(64), - UintType(64), - UintType(8), - UintType(64), - UintType(64), - UintType(64), - UintType(8), - UintType(64), - UintType(64), - UintType(64), - ] -) - - -def decode_actus_execution_event(event_bytes: bytes) -> dict[str, int]: - """Decode the ARC-28 payload emitted for an ACTUS schedule transition.""" - ( - contract_id, - event_id, - event_type, - scheduled_time, - applied_at, - payoff, - payoff_sign, - settled_amount, - currency_id, - sequence, - ) = _ACTUS_EXECUTION_EVENT_TUPLE.decode(event_bytes) - return { - "contract_id": contract_id, - "event_id": event_id, - "event_type": event_type, - "scheduled_time": scheduled_time, - "applied_at": applied_at, - "payoff": payoff, - "payoff_sign": payoff_sign, - "settled_amount": settled_amount, - "currency_id": currency_id, - "sequence": sequence, - } From 751b932ee2f85885525e42aa2e05bd26ad4e4785 Mon Sep 17 00:00:00 2001 From: cusma Date: Thu, 12 Mar 2026 18:24:06 +0100 Subject: [PATCH 110/244] fix: copy on assignment --- modules/rbac.py | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/modules/rbac.py b/modules/rbac.py index 226dc7a4..81a1f005 100644 --- a/modules/rbac.py +++ b/modules/rbac.py @@ -105,23 +105,23 @@ def _set_role( if role_id == UInt64(enums.ROLE_ACCOUNT_MANAGER): assert role_address not in self.account_manager, err.INVALID_ROLE_ADDRESS - self.account_manager[role_address] = validity + self.account_manager[role_address] = validity.copy() return if role_id == UInt64(enums.ROLE_PRIMARY_DEALER): assert role_address not in self.primary_dealer, err.INVALID_ROLE_ADDRESS - self.primary_dealer[role_address] = validity + self.primary_dealer[role_address] = validity.copy() return if role_id == UInt64(enums.ROLE_TRUSTEE): assert role_address not in self.trustee, err.INVALID_ROLE_ADDRESS - self.trustee[role_address] = validity + self.trustee[role_address] = validity.copy() return if role_id == UInt64(enums.ROLE_AUTHORITY): assert role_address not in self.authority, err.INVALID_ROLE_ADDRESS - self.authority[role_address] = validity + self.authority[role_address] = validity.copy() return if role_id == UInt64(enums.ROLE_OBSERVER): assert role_address not in self.observer, err.INVALID_ROLE_ADDRESS - self.observer[role_address] = validity + self.observer[role_address] = validity.copy() def _delete_role(self, role_id: UInt64, role_address: Account) -> None: assert role_id != UInt64(enums.ROLE_ARRANGER), err.INVALID_ROLE @@ -145,6 +145,16 @@ def _delete_role(self, role_id: UInt64, role_address: Account) -> None: assert role_address in self.observer, err.INVALID_ROLE_ADDRESS del self.observer[role_address] + @arc4.abimethod(allow_actions=["UpdateApplication"]) + def contract_update(self) -> None: + """ + Update D-ASA application. + """ + # The reference implementation grants the update permissions to the Arranger. + # ⚠️ WARNING: Application updates must be executed VERY carefully, as they + # might introduce breaking changes. + self._assert_caller_is_arranger() + @arc4.abimethod def rbac_rotate_arranger(self, *, new_arranger: Account) -> UInt64: """ From 3dce35d9ae38c7e9e9dcc57b6d6ea63c22f0168c Mon Sep 17 00:00:00 2001 From: cusma Date: Thu, 12 Mar 2026 18:24:30 +0100 Subject: [PATCH 111/244] chore: move transfer utilities in transfer agent --- modules/kernel.py | 27 +++++++-------------------- modules/transfer_agent.py | 24 +++++++++++++++++++++++- 2 files changed, 30 insertions(+), 21 deletions(-) diff --git a/modules/kernel.py b/modules/kernel.py index 17e8f76d..7027b290 100644 --- a/modules/kernel.py +++ b/modules/kernel.py @@ -68,8 +68,8 @@ def __init__(self) -> None: # Time self.initial_exchange_date = typ.TimeStamp() self.maturity_date = typ.TimeStamp() - self.secondary_market_opening_date = typ.TimeStamp() - self.secondary_market_closure_date = typ.TimeStamp() + self.transfer_opening_date = typ.TimeStamp() + self.transfer_closure_date = typ.TimeStamp() # Day Count Convention self.day_count_convention = UInt64() @@ -197,7 +197,7 @@ def _store_schedule_page( self, page_index: UInt64, schedule_page: typ.ExecutionSchedulePage ) -> None: """Persist a normalized schedule page.""" - self.schedule_page[page_index] = schedule_page + self.schedule_page[page_index] = schedule_page.copy() def _get_schedule_entry(self, event_id: UInt64) -> typ.ExecutionScheduleEntry: """Load a normalized schedule entry by global event id.""" @@ -451,6 +451,10 @@ def _entry_ied_amount(self, entry: typ.ExecutionScheduleEntry) -> UInt64: assert entry.event_type.as_uint64() == UInt64(enums.EVT_IED), err.NOT_EVT_IED return self.initial_exchange_amount + def _reserved_total(self) -> UInt64: + """Return the settlement funds already ring-fenced for holders.""" + return self.reserved_interest + self.reserved_principal + ############################################################################ # Annuity (ANN) Specific Logic ############################################################################ @@ -718,21 +722,6 @@ def _emit_execution_event( # Others ############################################################################ - def _assert_transfer_window(self) -> None: - """Require transfers to happen within the configured secondary market window.""" - if self.secondary_market_opening_date: - assert ( - self.secondary_market_opening_date <= Global.latest_timestamp - ), err.SECONDARY_MARKET_CLOSED - if self.secondary_market_closure_date: - assert ( - Global.latest_timestamp < self.secondary_market_closure_date - ), err.SECONDARY_MARKET_CLOSED - - def _reserved_total(self) -> UInt64: - """Return the settlement funds already ring-fenced for holders.""" - return self.reserved_interest + self.reserved_principal - def _available_settlement_funds(self) -> UInt64: """Return the app's free settlement balance after reserved cashflows.""" balance = self.settlement_asset_id.balance(Global.current_application_address) @@ -830,8 +819,6 @@ def _store_contract_config( self.initial_exchange_date = terms.initial_exchange_date self.maturity_date = terms.maturity_date self.next_principal_redemption = initial_state.next_principal_redemption - self.secondary_market_opening_date = terms.secondary_market_opening_date - self.secondary_market_closure_date = terms.secondary_market_closure_date # Principal self.initial_exchange_amount = terms.initial_exchange_amount diff --git a/modules/transfer_agent.py b/modules/transfer_agent.py index 4982675a..0f604a20 100644 --- a/modules/transfer_agent.py +++ b/modules/transfer_agent.py @@ -8,6 +8,28 @@ class TransferAgent(AccountingModule): """Provide primary distribution and secondary transfer mechanics.""" + def _assert_transfer_is_open(self) -> None: + """Require transfers to happen within the configured secondary market window.""" + if self.transfer_opening_date: + assert ( + self.transfer_opening_date <= Global.latest_timestamp + ), err.CLOSED_TRANSFER + if self.transfer_closure_date: + assert ( + Global.latest_timestamp < self.transfer_closure_date + ), err.CLOSED_TRANSFER + + @arc4.abimethod + def set_transfer_schedule( + self, *, open_date: UInt64, closure_date: UInt64 + ) -> UInt64: + self._assert_caller_is_arranger() + assert open_date < closure_date, err.INVALID_SORTING + + self.transfer_opening_date = open_date + self.transfer_closure_date = closure_date + return Global.latest_timestamp + @arc4.abimethod def primary_distribution( self, @@ -53,7 +75,7 @@ def transfer( self._assert_is_not_asset_defaulted() self._assert_is_not_asset_suspended() self._assert_initial_exchange_executed() - self._assert_transfer_window() + self._assert_transfer_is_open() assert Txn.sender == sender_holding_address, err.UNAUTHORIZED self._assert_valid_holding_address(sender_holding_address) From ae8acfb4f27f8f6b2715ed586d577cec8810e747 Mon Sep 17 00:00:00 2001 From: cusma Date: Thu, 12 Mar 2026 18:24:37 +0100 Subject: [PATCH 112/244] chore: rename --- smart_contracts/d-asa/contract.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/smart_contracts/d-asa/contract.py b/smart_contracts/d-asa/contract.py index 88212447..fe6d1c5a 100644 --- a/smart_contracts/d-asa/contract.py +++ b/smart_contracts/d-asa/contract.py @@ -5,7 +5,7 @@ from smart_contracts import errors as err -class ActusApp( +class DASA( PaymentAgent, TransferAgent, state_totals=StateTotals( From 2241bec74a8c5c27b0389a1211e06a26d0307a1f Mon Sep 17 00:00:00 2001 From: cusma Date: Thu, 12 Mar 2026 18:24:59 +0100 Subject: [PATCH 113/244] chore: build artifacts --- .../artifacts/d-asa/DASA.approval.puya.map | 60501 ++++++++++++++++ .../artifacts/d-asa/DASA.approval.teal | 6720 ++ .../artifacts/d-asa/DASA.arc56.json | 2268 + .../artifacts/d-asa/DASA.clear.puya.map | 25 + .../artifacts/d-asa/DASA.clear.teal | 7 + .../artifacts/d-asa/dasa_client.py | 3674 + 6 files changed, 73195 insertions(+) create mode 100644 smart_contracts/artifacts/d-asa/DASA.approval.puya.map create mode 100644 smart_contracts/artifacts/d-asa/DASA.approval.teal create mode 100644 smart_contracts/artifacts/d-asa/DASA.arc56.json create mode 100644 smart_contracts/artifacts/d-asa/DASA.clear.puya.map create mode 100644 smart_contracts/artifacts/d-asa/DASA.clear.teal create mode 100644 smart_contracts/artifacts/d-asa/dasa_client.py diff --git a/smart_contracts/artifacts/d-asa/DASA.approval.puya.map b/smart_contracts/artifacts/d-asa/DASA.approval.puya.map new file mode 100644 index 00000000..05b07e6e --- /dev/null +++ b/smart_contracts/artifacts/d-asa/DASA.approval.puya.map @@ -0,0 +1,60501 @@ +{ + "version": 3, + "sources": [ + "../../../modules/accounting.py", + "../../../modules/kernel.py", + "../../../modules/payment_agent.py", + "../../../modules/rbac.py", + "../../../modules/transfer_agent.py", + "../../d-asa/contract.py" + ], + "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AG4BmD;;AAAf;;AAA5B;AAC4C;;AAAf;;AAA7B;AAkBA;;AAAuB;AAAvB;AACA;;AAAuB;AAAvB;AFQA;AAAc;AAAd;AACA;;AAAqB;AAArB;AAGA;;AAAuB;;AAAvB;AACA;;AAAsB;;AAAtB;AAGA;;AAA6B;AAA7B;AACA;;AAA2B;AAA3B;AAGA;;AAA6B;AAA7B;AACA;;AAAqB;AAArB;AACA;;AAA6B;AAA7B;AACA;;AAA6B;AAA7B;AAGA;;AAA4B;AAA5B;AAGA;;AAAmB;AAAnB;AACA;;AAA4B;AAA5B;AAGA;;AAA+B;AAA/B;AACA;AAA6B;AAA7B;AACA;;AAAiC;AAAjC;AACA;;AAAoC;AAApC;AAGA;;AAAiC;AAAjC;AACA;;AAAwB;AAAxB;AAGA;;AAA6B;AAA7B;AACA;;AAAyB;AAAzB;AACA;;AAA6B;AAA7B;AACA;;AAAwB;AAAxB;AACA;;AAAsB;AAAtB;AACA;;AAAuB;AAAvB;AACA;;AAA4B;AAA5B;AACA;;AAA0B;AAA1B;AAGA;;AAA0B;AAA1B;AACA;;AAAyB;AAAzB;AAGA;;AAAiC;AAAjC;AACA;;AAAkC;AAAlC;AAQA;AAAoB;AAApB;AACA;;AAA4B;AAA5B;AAGA;;AAAyB;AAAzB;AIhGO;;AAA6B;;AAA7B;AAAP;AACO;;AAAuB;;AAAvB;AAAP;AACO;;AAAA;AAAP;AACO;;AAAA;AAAP;AAlBR;;;;;;AAAA;;;AAAA;;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;;;;;;AAAA;;;AAAA;;;;AAAA;AF4IK;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;;;;;;;ADtGA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ADiGU;AAAA;AAAA;AAAA;AAAP;AC7FA;;;AACA;;;AACA;;;ADmFO;AAAA;AAAA;AAAA;AAAe;;AAAf;AAYA;AAAP;AC5FmB;AACD;;AAId;;AAAA;;AAAA;AAAA;;;AACI;AAAA;AAAA;AAAA;AAAoB;AAAA;;AAAA;AAAA;AAApB;AADJ;;;AAGiC;AAAA;AAAA;AAAA;AAAzB;;;AAAA;AAAA;;AACL;;AAAA;AAAA;AAAA;;AAAuB;;AAAvB;AAAf;;;AAEuC;;AAAA;AAAA;AAAA;AAAA;;AD6R3B;AADG;AAAA;AAAA;;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;;AC5RA;;;ADkeA;;AAAA;AAAA;AAAkB;AAAA;AAAA;AAAA;AAAlB;AAAP;AACO;;AAAwB;;AAAxB;AAAP;AAxIG;;AAAA;;;AAAA;;AAAyC;;AAAzC;AAAA;;;AACQ;;;AAYE;;AAAA;AAAA;AAAA;AAAA;;AACS;;AAAnB;AAAA;;;AAAA;;AAAyC;;AAAzC;AAAA;;;AACQ;;;AA6HkB;;AAAA;;AAAA;AAAA;;AAG1B;;;AAAX;;;;;;;AAkB+B;;AAAA;;;AACC;;AAAA;;;AACN;;AAAA;;;AAAA;AAAA;;AAAA;;AACC;AAAA;;;AAAA;AAAA;;AACD;;AAAA;;AAAA;AAAA;AAAA;;AAqJyB;;AAAjC;AAAA;;AAAA;AAAA;AAAA;;AAAA;AA/QH;AAAA;;AAAA;AAAA;AAAyB;AAAA;;AAAA;AAAA;AAAzB;;AAAA;AAiRA;;AAAA;;AAAA;AAAP;AACO;;AAAA;AAAA;AAtJH;;AAAA;AADJ;AAIA;;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AACG;;AAAA;AAAA;AAAgC;;AAAhC;AAAX;;;AAEY;AAAA;;AAAA;AAAA;AAAyB;;AAAA;;;AAAA;;AAAzB;AAAA;;AAAA;AAAA;AAGG;;;AAAJ;;;AAAkC;;AAAA;AAAA;AAAgC;;AAAhC;AAAlC;;;AAGkC;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;AACJ;AAAA;;AAAA;AACA;;AAAA;;AAAA;AACA;AAAA;AAAA;AAAA;AAAqB;AAArB;AAAA;AAAA;AAAA;AAEG;;AAAA;;;AAAoB;;;AAApB;AAAA;;;AAEG;AAAA;AAAA;AAAA;AAFH;;;AAGC;AAAc;;;AAAd;AACA;;AAAiC;AAAjC;AAEJ;;AAAA;;AAAA;AAAA;;;AAAA;ACxhBI;;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;;AACA;;AAAoB;AAApB;AAAA;;;;;ADugBA;;AAAwB;AAAxB;;;;AAlCa;;AAAA;AAAA;AAAA;AAAA;;AAGI;;AAAd;AAAf;;;AAEoB;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;;;;;;AAGH;;AAAc;AAAd;AAAjB;;;AAC6C;AAAA;AAAA;AAAA;AAAA;;AAAA;AACR;AAAA;;AAAA;AAAA;AAAA;;AAAA;;;;AACpB;;AAAc;;AAAd;AAAjB;;;;;;;AAAA;;;AAC6C;AAA7B;;AACqB;AAArB;;;;;AA7IL;;;AAAX;;;AACe;;AAAc;;AAAd;AAAf;;;AACuB;AAAA;AAAA;AAAA;;;AAyHQ;;;AAxHJ;AAAA;;AAAA;AAAA;AAAwB;;AAAA;;;AAAA;;AAAxB;AAAA;AAAA;;AACZ;AAAA;;AAAA;AAAA;AAAA;AAAf;;;AACuB;;;AAsHQ;;;AArHA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AACG;AAAA;AAAA;AAAA;AAAnB;AAAf;;;AACuB;AAAA;AAAA;AAAA;;;AAmHQ;;;;;;;AAAA;;;AAhHnB;;AAAA;;AAAA;AAAoC;AAAA;AAAA;AAAA;AAApC;AAAA;AADJ;AAGO;AAAA;;;AA8GgB;;;AAzIhB;AAAA;;AAAA;AAAA;AAAwB;;AAAA;;;AAAA;;AAAxB;;;AAwIe;;;AC7dtB;;AAAA;AAAA;AAIiB;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAEH;;AALP;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AA7BV;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;;;AAqCA;;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AD4DU;AAAA;AAAA;AAAA;AAAP;ADvH0B;;AAAnB;AAAA;AAAA;AAAA;AAAA;;AAAP;AEVG;AAAA;;AAAA;AAAA;AAAwB;;AAAxB;AAAX;;;AAEgB;;AAAc;AAAA;;AAAA;AAAA;AAAd;AAAA;;;AACG;;AAAA;;AAAA;AADH;;;AAEG;;AAAc;;AAAA;AAAA;AAAA;;;AAAd;AAFH;;;;AADJ;AA+EJ;;;AACA;;;ADwCO;AAAA;AAAA;AAAA;AAAe;;AAAf;AAYA;AAAP;ACjDA;;AAAA;AAAA;;;AACA;;;;;AFkBI;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AACE;AAAA;;AAAA;AAAA;AAAA;;AADF;;AAAA;AAAA;AAAA;;AEhBJ;AA7EI;;;AACI;AAAA;;AAAA;AAAA;AADJ;;AAAA;;AAAA;;;AAGQ;AAAA;AAAA;AAAA;;;AAAA;AAAJ;;;;AA+EhB;;;AAzE6C;;AAAjC;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AADJ;AA4Ec;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AArEd;AAIQ;;;;;;;;;;;;;AAJR;;;;;;AAAA;AFuFkB;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AACC;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAGW;AAA9B;AAAA;AAAA;;AAAA;;AACA;AAAA;;AACA;;AAAA;AAAA;AAEO;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACO;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAP;AAGA;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AEzBiB;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AACH;;AAJP;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;;;;AAAA;AAAA;AAAA;AA5BV;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;;;AE7DA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEG;;;AACO;AAAA;AAAP;AAEA;;AAAA;;AAAA;AACA;;AAAA;AAAA;AACO;;AAPV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AHgHU;AAAA;AAAA;AAAA;AAAP;AExE4B;;AAAqB;;AAA1C;;;AAAP;AC9BA;;;AACA;;;AH6FO;AAAA;AAAA;AAAA;AAAe;;AAAf;AG5FP;AJnB0B;;AAAnB;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAP;AIqBA;AAAA;;;AACA;AAAA;AAEI;AAAA;;AAAA;AAAA;AAAA;AAAqC;AAAA;;AAAA;AAAA;AAArC;AADJ;AAGG;AAAA;;AAAA;AAAA;AAAX;;;AAEgB;;AAA2B;AAAA;;AAAA;AAAA;AAA3B;AADJ;AJiGJ;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AI5FA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AACO;AAAA;;AAAA;AAAA;AAAA;AAAA;AA1BV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AA4BA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AHoFU;AAAA;AAAA;AAAA;AAAP;AGtEA;;;AACA;;;AH6DO;AAAA;AAAA;AAAA;AAAe;;AAAf;AAYA;AAAP;AGtIG;AAAA;;AAAA;AAAA;AAAX;;;AAEgB;AAAA;;AAAA;AAAA;AAA8B;;AAA9B;AADJ;AAGD;AAAA;;AAAA;AAAA;AAAX;;;AAEgB;;AAA0B;AAAA;;AAAA;AAAA;AAA1B;AADJ;AA4DG;;AAAA;;AAAA;AAAA;;AAAA;AAAP;AJtD0B;;AAAnB;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAP;AAA0B;;AAAnB;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAP;AIyDA;;AAAA;;;AACA;AAAA;;;AACO;;AAAA;AAAP;AACA;;AAAA;AAAA;AACgB;AAAA;AAAA;AAAA;AAAA;AAAT;AAAP;AH+pBG;AAAA;AAAA;AAAA;AAAqB;AAAA;;AAAA;AAAA;AAArB;AAAX;;;AAE8C;AAAA;AAAA;AAAA;AAAzB;;;AAET;;AAAA;AAA4B;;AAA5B;AADJ;AG/pBA;;AAAA;AAAA;;;AACA;;AAAA;AAAA;;AAAA;;;AACA;;;;;AACA;;;;;AJ6DgB;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAT;;AAAA;AAAA;;AAAA;;AAAA;AAAP;AACA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AATA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AIrFH;AAAA;;AAAA;AAAA;AAAA;AAAA;AJ0GA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AGxF+B;;AAAgB;;AAArC;;;AAAP;AHrD0B;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAiKA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AACO;;AArBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AGxH+B;;AAAsB;;AAA3C;;;AAAP;AFuEO;AAAA;AAAA;AAAA;AAAe;;;AAAf;ADuEA;AAAP;AACA;;;AACA;;;AAC8B;;AAAvB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AAnLU;AAFH;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAsLP;AACO;;AA3BV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA6BA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAjM6B;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAsNO;;AAAA;;AAAA;AAAP;AACA;;;AACA;;;AACA;AAAA;;AAAA;AACO;;AAzBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA5N6B;;AAAnB;AAAA;AAAA;AAAA;AAAA;;AAAP;AA2OO;AAAA;AAfV;AAAA;AAAA;AAAA;AAAA;AAAA;ACqtBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAWG;;AAAA;AAAA;AACO;;AAZV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;AAcA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AA6BG;;;AAGqB;AAAA;AAAA;AAArB;;AAAA;;AAAA;AA7xBO;;;AAAA;AAEH;AAFG;AAAA;;;AAAA;AAGH;;AAHG;AAAA;;;AAAA;AAIH;;AAJG;AAAA;;;AAAA;AAKH;;AALG;AAAA;;;AAAA;AAMH;;AANG;AAAA;;;;AAWP;AAoxB4B;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAprBrB;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAP;AAEI;;AAAA;AAAA;AAAA;;AA9BG;;;AAAA;;AAEH;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;;AAYP;AAoBG;AAAiB;AAAjB;AAAX;;;AACuB;;AAAA;;;AAAA;AAAJ;AAAP;AAsdG;AAAA;AAAA;AAAA;AAAA;AAAP;AACO;AAAA;;AAAA;AAAA;AAAA;AAAP;AAGgC;;AAAA;AAAA;AAAA;AAnCb;AAAA;;AAAA;;AACnB;AAGA;;AAAA;;AAAA;AAmC8B;;AAAA;;AAAA;AA9B1B;AAAA;;AAAA;AADJ;AAKA;;AAAA;;AAAA;AAEA;AAIQ;;AAFW;;AACF;;;;;;;;AAHjB;;;;;;AAAA;AA4BmB;AAAA;;AAAA;AAAnB;;AAAA;AAAA;AACA;;AAA4B;AAA5B;AAGA;;AAAA;;AAAA;AAG6B;AAAA;;AAAA;AAA7B;;AAAA;;AAAA;AACqB;;AAAA;;AAAA;AAArB;;AAAA;;AAAA;AACiC;;AAAA;AAAA;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;AAGA;;AAAA;;AAAA;AACoC;;AAAA;;;AAAA;AAApC;;AAAA;AAAA;AAC6B;;AAAA;;AAAA;AAA7B;AAAA;AAAA;AAGwB;;AAAA;;AAAA;AAAxB;;AAAA;AAAA;AAG6B;;AAAA;AAAA;AAA7B;;AAAA;AAAA;AACiC;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;AACyB;;AAAA;;AAAA;AAAzB;;AAAA;AAAA;AAC6B;;AAAA;;AAAA;AAA7B;;AAAA;AAAA;AACwB;;AAAA;;AAAA;AAAxB;;AAAA;AAAA;AACsB;;AAAA;;AAAA;AAAtB;;AAAA;AAAA;AACuB;;AAAA;;AAAA;AAAvB;;AAAA;AAAA;AAC4B;;AAAA;;;AAAA;AAA5B;;AAAA;AAAA;AAC0B;;AAAA;;;AAAA;AAA1B;;AAAA;AAAA;AAGyB;;AAAA;;AAAA;AAAzB;;AAAA;AAAA;AAGoB;;AAAA;AAAA;AAApB;AAAA;AAAA;AAGiC;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;AACkC;;AAAA;;AAAA;AAAlC;;AAAA;AAAA;AAGA;;AAAyB;AAAzB;AACA;;AAA0B;AAA1B;AAEO;;AAA8B;;AAA9B;AAAP;AACqC;AAAA;AAAA;AAA9B;;AAAA;AAAP;AACO;AAAP;AAkKuB;;AAAA;;;AAAvB;;AAAA;AAAA;AACsB;;AAAA;;;AAAtB;;AAAA;AAAA;AACO;;AAvCV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;;;;;;;;AAyCA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAeG;;;AAGkB;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAxKX;AAAA;AAAA;AAAA;AAAA;AAAP;AACO;AAAwB;;AAAxB;AAAP;AAGO;AAAA;;AAAA;AAAA;AAAP;AAEc;AAAsB;;AAAtB;AAAA;AAOU;;AAAd;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGF;AAAR;;AACM;;AAAA;;AAAA;AAAd;;;AACoB;;AAAA;;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AACW;AADX;AACW;AAAA;AAAA;;AAAA;;AACZ;AAAA;AAAA;AAAA;AAAA;;AAAkB;;AAAA;;AAAA;AAAlB;;AAAA;AAAP;AACA;;AAAA;;AAAA;;;AAGO;AAAA;;AAAA;AAAA;AAAA;;AAAP;AACZ;;;AACA;;AAAA;;;AACmD;;AAAQ;AAAR;AAAd;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAejB;;AAAA;AAAA;;AAAA;AADJ;AAGhB;;AAAA;;;AACuB;;AAAoB;AAApB;AAAP;AAGJ;;AAAS;AAAT;AAAA;;;;;AAjBQ;;AAAA;AAAA;AAC4C;AAAtB;AAElB;AAAuB;;AAAvB;AAAA;AAAA;AAAA;AAAA;;AADJ;AAGgB;AAAA;AAAA;;AAAA;AAAA;AAChB;AAAA;AAE2B;AAAvB;AADa;;AAAA;AAAA;;AAAA;AAAA;;AAAA;;;;AAxsBV;;AAAA;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAqtBR;;AAAA;;;AAEgB;;AAAA;;AAAA;AADJ;;AAAA;AAAA;AAGA;AAAc;;AAAd;AAsHG;;AAvBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAj3BU;AAAA;AAAA;AAAA;AAAP;AAk5BA;;;AACA;;;AACA;;;AAEO;AAAA;AAAA;AAAA;AAAoB;AAAA;;AAAA;AAAA;AAApB;;AAAA;AAAP;AACQ;;;AACD;AAAA;;;AAAA;AAAoB;;;AAApB;AAAP;AAIiB;;AAAA;;;AAEM;;AAAA;;;AACA;;AAAA;;;AACW;;AAAA;;;AAEC;;AAAA;;;AACD;;AAAA;;;AACC;;AAAA;;;AACrB;;AAAA;;;AAVV;;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAMkB;AANlB;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAFJ;;;AAAA;;AAeO;;AA9BV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;AAgCA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AA16BU;AAAA;AAAA;AAAA;AAAP;AAw7BA;;;AACA;;;AAEG;;AAAA;AAAA;AAAgB;;AAAhB;AAAX;;;AAj2Be;AAAA;;AAAA;AAAA;AAAsB;;AAAtB;AAk2BH;AACA;;;AAn2BG;AAAA;;AAAA;AAAA;AAAA;AAAsB;;AAAtB;AAisBP;AACO;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAoB;AAAA;;AAAA;AAAA;AAApB;AAAP;AAEwB;AAAA;;;AAAA;;AAAA;AAAA;AADxB;;;AAIuC;AAAA;;AAAA;AAAA;AAlvBpB;;AAAZ;AAmvBA;;;;AAAA;;AACJ;AAAc;;AAAd;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAX;;;AACmB;;AAAA;AAAA;AAAA;;AAAA;AACJ;;AAAA;AAAA;AAAA;AAAA;AAAc;;AAAd;AAAP;AAKuB;;AAAA;AAAA;;;AACA;;AAAA;;;AACW;;AAAA;;;AACC;;AAAA;;;AACD;;AAAA;;;AACC;;AAAA;;;AAR/B;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AADJ;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAaA;;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAA6B;AAA7B;AAAA;;AAAA;AAAA;AA4ImB;AAAA;AAAA;AAAA;AAAZ;;AAAA;AAAA;;AAAA;AAAP;AACQ;;;AAAA;AAAA;;AAEJ;AAAA;;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAtuBA;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;AAAA;;AAMH;;AANG;AAAA;;;;AAsuBP;AAGO;;AAAoB;;;AAApB;AAAP;AA9tBO;;AAAe;;AAAf;AAAA;;;AAAA;;AAAqC;;AAArC;AAAA;;;;AA+tBf;;;AErgCoC;;AAAe;;AAApC;;;AAAP;AFygCA;;AAAA;;AAAA;;;AAAA;;AACO;;AAjCV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA+BO;;;;;;;;;;;;;;AAz8BG;AAAA;AAAA;AAAA;AAAP;AAAA;AAk9B6B;AAAA;;AAAA;AAAA;AAAX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAEF;AAAA;;AAAA;AAAA;AACS;AAAA;;AAAA;AAAA;AACG;AAAA;;AAAA;AAAA;AACX;AAAA;AAAA;AAAA;AACQ;AAAA;;AAAA;AAAA;AACC;AAAA;AAAA;AAAA;AACI;AAAA;;AAAA;AAAA;AACJ;AAAA;;AAAA;AAAA;AACL;AAAA;;AAAA;AAAA;AACS;AAAA;;AAAA;AAAA;AACC;AAAA;;AAAA;AAAA;AACT;AAAA;;AAAA;AAAA;AACC;AAAA;;AAAA;AAAA;AAfhB;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAJV;AAAA;AAAA;AAAA;AAAA;AAAA;AA78BU;AAAA;AAAA;AAAA;AAAP;AAu+BG;AAAA;AAAA;AAAA;AAAqB;AAAA;;AAAA;AAAA;AAArB;AAAX;;;AAEyB;AAAA;AAAA;AAAA;AADN;AAEQ;;AAFR;AAGY;AAHZ;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AALd;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBmC;AAAA;AAAA;AAAA;AAAzB;;;AAhBV;;;AEt9BG;;;AARH;AAAA;AAUA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAWG;;;AACA;;AAAA;AAAA;AACO;;AAbV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAeA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAWG;;;AACA;;AAAA;AAAA;AACO;;AAbV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAeA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAsBG;;;AACA;;;AACwB;AAAA;;AAAxB;;;AA9Gc;;AAAX;AAAX;;;AACY;;AAAA;;AAAA;AA+GG;;AA1BV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAlFM;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAyGJ;;;AAvGG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAqGJ;;;AAnGG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAiGJ;;;AA/FG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AA6FJ;;;AA3FG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;;;;AA4FP;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAmBG;;;AACA;;;AACwB;AAAA;;AAAxB;;;AA9GO;AAAW;;AAAX;AAAP;AACc;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AA6GG;;AAvBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AApFM;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAwGJ;;;AAtGG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAoGJ;;;AAlGG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAgGJ;;;AA9FG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;;;;AA+FP;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AApK+B;;AAAgB;;AAArC;;;AAAP;AAoLA;;AAAA;AAAA;AACO;;AAjBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BU;AAAA;;AAAA;AAAA;AARV;AAAA;AAAA;AAAA;AAAA;AAAA;AAUA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAc4B;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AAlBP;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAcU;AACP;AAAA;;;AAES;;;;;;;;AADT;;AAAA;;;;;;;;;;;;;;AA+BQ;AAJI;;AAvRL;;AAAA;AAAA;AAAA;AAAA;;AAsRC;AAGO;AAAA;AA7ClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAsCe;;AAlRL;;AAAA;AAAA;AAAA;AAAA;;AAiRC;AAGO;AAAA;AAxClB;;;AAiCe;;AA7QL;;AAAA;AAAA;AAAA;AAAA;;AA4QC;AAGO;AAAA;AAnClB;;;AA4Be;;AAxQL;;AAAA;AAAA;AAAA;AAAA;;AAuQC;AAGO;AAAA;AA9BlB;;;AAuBe;;AAnQL;;AAAA;AAAA;AAAA;AAAA;;AAkQC;AAGO;AAAA;AAzBlB;;;AAkBkB;;;;;;;;;;;;;;;;;;AAlBlB;;;AHzQD;;;AAEe;;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAJ;AAAP;;AAgBJ;;;AApB8B;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAqCW;AAAA;AAAA;AAIM;AAAA;;AAAA;AAAA;AAAiC;;AAAA;;AAAA;AAAjC;AAEb;AAAA;;AAAA;AAAA;AAAkC;;AAAA;;AAAA;AAAlC;AAMgB;;AAAA;AAAA;AAAgB;AAAA;;AAAA;AAAA;AADf;;AAAA;;AAAA;;AAAA;;;AAIgB;AAAA;;AAAA;AAAA;AADf;;AAAA;;AAAA;;AAAA;;;AAMtB;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAI+B;AAAA;;AAAA;AAAA;AAA/B;AAAA;;AACgC;AAAA;;AAAA;AAAA;AAAhC;AAAA;;AAG0B;AAAA;AAAA;AAAA;AAA1B;AAAA;;AAIA;;AAAA;AAAA;AACA;AAEJ;;;;;;AAzE8B;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AC+GO;AAAA;AAAA;AAAA;AAAe;;AAAf;ADnCf;;;AACY;AAEO;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AACR;;AAAA;AAAA;AAAA;;AAAX;;;AACY;AAGJ;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAC0B;AAA1B;AAAA;;AACA;;AAAA;AAAA;AACO;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;AAAA;AAAA;;AAAA;AAAA;;ACyCJ;;;AAIO;;AAAA;;;AAAA;;AAAA;;;AACQ;AAAP;AACQ;;AAAA;;AAAA;AACL;;AAAA;AAAP;AAEJ;;;AAEJ;;AAAA;;;AACmB;AAAP;AACG;AAAA;;AAAA;AAAA;AAAP;AAAA;AACoC;AAAA;;AAAA;AAAA;AAA7B;;AAAA;AAAA;;AAAA;;;AAAP;AAEJ;;;AAOJ;;AAAA;;;AACmB;AAAP;AAEA;AAAA;;AAAA;AAAA;AAEA;AAAA;;AAAA;AAAA;AAHG;;AAAA;AAAA;;;AAAP;AAwBJ;;;AAEsB;AAAA;;AAAA;AAAA;AAAX;;AAAA;AAAP;AAdO;;AAAY;;AAAZ;AAgBA;AAAc;;AAAd;AAAA;AAAA;AAAA;AAAA;;AAAP;AAZO;;AAAW;;AAAX;AAeS;;AAAA;AAAA;;AAAA;AAAA;AAAT;;AAAA;AAAP;AACO;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAP;AAuGJ;;;AA1DO;;AARC;AAQD;AAAA;;;AAAA;;AAPC;AAOD;AAAA;;;AAAA;;AANC;;AAMD;AAAA;;;AAAA;;AALC;;AAKD;AAAA;;;AAAA;;AAJC;;AAID;AAAA;;;AACQ;AA6DX;;AA1DR;;AAAA;;;AAEmB;AAwDJ;;;AAtDJ;;AAAiB;;AAAjB;AAAA;;;AAAyC;;AAAiB;;AAAjB;AAAzC;;;AAIQ;;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;;AAkDJ;;;;AAAA;;;AA7CJ;;AAAiB;AAAjB;AAAX;;;AAEmB;;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;;AA2CJ;;;;AAAA;;;AArCJ;;AAAiB;;AAAjB;AAAX;;;AAEmB;;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;;AAmCJ;;;;AAAA;;;AA5BJ;;AAAiB;;AAAjB;AAAX;;;AAEmB;;AAAc;;AAAd;AA0BJ;;;AAxBA;AAwBA;;;AAkBH;AAAA;;AAAA;AAAA;AAAsB;AAAtB;AAAA;;;AACI;AAAA;;AAAA;AAAA;AADJ;;;;AADJ;;AAAA;AA8CJ;;;AASQ;;AAAA;;AAAA;AAAA;AAAA;;;AACG;AAAA;;AAAA;AAAA;AADH;;;AAEG;AAAA;;AAAA;AAAA;AAFH;;;AAIO;AAAP;;AAAA;;AAAA;AAEA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAHM;;;AAQN;AAAA;;AAAA;AAAA;AAHG;;AAAA;AAAA;;;AAAP;;AAAA;;AAAA;AA+DJ;;;AAMJ;;AAAA;;;AACY;;AAAA;AACU;AAAA;;AAAA;AAAA;AACV;AAAA;;AAAA;AAAA;AADmC;;AAAA;;AAAA;;;AAAzB;AAKd;AAAA;AAGI;AAAA;;AAAA;AAAA;AAFG;;AAAA;AAAA;;AAAA;;;AAAP;AAyIJ;;;;;;;;AAUW;;AAAA;AAAA;AAAkB;AAAA;AAAA;AAAA;AAAlB;AAAP;AACO;;AAAA;;AAAA;AAAwB;;AAAxB;AAAP;AAEa;;AAAA;AAAA;AAAA;AACI;AAAd;AAAA;AAAX;;;AA5ee;AAAA;AAAA;AAAA;AAAe;;AAAf;AA+eH;AAEI;AAAA;;AAAA;AAAA;AAA6B;AAAA;;AAAA;AAAA;AAA7B;AADJ;AAG6B;;AAAA;;AAAA;AAA7B;AAAA;;AAAA;AACA;;AAAA;AAAA;AAC6B;;AAAA;;AAAA;AAA7B;;AAAA;AAAA;AACA;;AAAwB;AAAxB;AACiC;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAqB;AAArB;AAAA;AAAA;AAAA;AACA;AAAc;;AAAd;AA7LJ;;AAAA;AACO;AAAA;;AAAA;AAAA;AA6LH;;AAAA;AAGmB;AAHnB;;;;AAAA;;AAKA;;AAAA;;AAAA;;AAAA;AA/fG;AAAA;AAAA;AAAA;AAAe;;AAAf;AAYA;AAAP;AAsfA;AAAA;;AAAA;AAAA;AAAyB;;AAAA;;;AAAA;;AAAzB;AAAA;;AAAA;AAAA;AAEG;;AAAc;;AAAd;AAAX;;;AAIgB;;AAAA;;AAAA;AACA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAHY;;;AAMI;AAAA;;AAAA;AAAA;AAAhB;AAAA;;AA0EL;AAAA;;AAAA;AAAA;AAAA;;;AAAqC;AAAA;;AAAA;AAAA;AAAP;;AAAA;AAA9B;;;AACQ;AAAA;;AAAA;AAAA;AAAA;;AAAA;AACR;AAAA;;AAAA;AAAA;AAAA;;;AAAmC;AAAA;;AAAA;AAAA;AAAP;;AAAA;AAA5B;;;AACQ;AAAA;;AAAA;AAAA;AAAA;;AAAA;AA9EP;;AAAA;;AAAA;AAYD;;AAAc;;AAAd;AAAX;;;AACyC;;AAAA;;AAAA;AAA7B;AAAA;;AAAA;AACA;;AAAA;AAAA;AAKD;;;AAAX;;;AACe;;AAAc;;AAAd;AAAf;;;AA7L0B;AAAA;;AAAA;AAAA;AAAA;;AAAA;AACJ;AAAd;;AACwB;AAAxB;;AAEG;;AAAA;;AAAA;AAAA;AAAA;;AAAX;;;AAE8B;;AAAA;;AAAA;;;AAAA;AAAA;;AAKM;AAAxB;;;;AAEc;AAAA;AAAA;AAAA;AAAoB;AAApB;AAAA;;AACM;AAAA;;AAAA;AAAA;AAAlB;;AAAA;AAAd;;;AAC2B;;AAAA;;;AAAA;AAAA;;AACK;AAAA;AAAA;AAAA;;AAEuB;;AAArB;AAAA;;;AAClB;;AAAqB;;AAArB;AAAA;;;AACI;;AAAA;;AAAA;AADJ;;;;AAGhB;;;AACA;;AAAA;;;AAC4C;AAAxB;;AAOR;;AAAmB;AAAnB;AAAA;;;;;AAHY;;AAAA;;AAAA;AAFc;;AAAA;AAAA;;;AAAA;AAAA;;AAIlB;;AAAA;AAAA;;;;;;;;;AAGZ;;AAAA;AACY;AAAA;AAAA;AAAA;AACT;;AAAA;;AAAA;AAAc;AAAd;AAAX;;;AAEyB;AAAA;;AAAA;AAAA;AAAb;AAGA;AAAA;;AAAA;AAAA;AAFG;;AAAA;;;AAwJC;;AAAA;AAAA;AAKR;AAAA;AAAA;AAAA;AAAqB;AAArB;AAAA;AAAA;AAAA;AACA;;AAEW;AACQ;AAHnB;;;;AAAA;;;;;;;;;AAFqC;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;;;;AAVC;;AAAc;;AAAd;AAAb;;;AAE6C;AAAA;AAAA;AAAA;AAAjC;;AAAA;AAAA;;;;AAdC;;AAAc;;AAAd;AAAb;;;AACwB;;AAAA;;AAAA;AAAA;AAAA;;AACxB;;;AAC4B;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAChB;;AAAA;;AAAA;;;;AAEG;;AAAA;;AAAA;AAAA;AAAA;;AAAf;;;AACgB;;AAAA;;AAAA;;;;AA2BZ;;;AAUwB;;AACH;;AAAA;AAAA;AACE;;AAAA;;;AACI;;AAAA;;;AACJ;;AAGW;;AALX;AAKW;AA6BtC;;AAAA;;;AACmB;AA/BS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAIA;AAAA;;AAAA;AAAA;AACH;;AAAA;AAAiB;AAAjB;AAZb;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AADJ;;;;;;AAAA;AAAA;AAAA;;;;;;AAwCG;;AAAe;AAAf;AAAA;;;AAAA;;AAAsC;;AAAtC;AAAA;;;AACQ;AAhCC;;;AAiCL;;;AAjCK;;;AEhpBhB;;;;;AAFW;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAGA;;;AACH;;AAAA;AAAA;AAAA;AAAA;AACG;;AAAA;AAAA;;AADH;AAAA;;;AAEG;;AAAA;AAAA;AAAA;AAAA;AADA;;AAAA;AADH;;;;AADJ;;AAAA;;;;;AAOyB;;AAbF;AAAA;;AAAA;AAAA;AAAhB;AAaP;;AAkBW;AAAA;;AAAA;AAAA;AAAJ;AAAP;;AAGW;AAAA;;AAAA;AAAA;AAAJ;AAAP;;AAEJ;;;AACW;;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;AAAA;;AAMH;;AANG;AAAA;;;AAAA;;AAOH;;AAPG;AAAA;;;;AAAP;;;", + "op_pc_offset": 0, + "pc_events": { + "1": { + "subroutine": "algopy.arc4.ARC4Contract.approval_program", + "params": {}, + "block": "main", + "stack_in": [], + "op": "intcblock 0 1 8 32" + }, + "7": { + "op": "bytecblock 0x151f7c75 \"status\" \"event_cursor\" \"outstanding_principal\" \"schedule_entry_count\" \"fixed_point_scale\" \"accrued_interest\" \"interest_calculation_base\" 0x52234163636f756e7423 \"nominal_interest_rate\" \"reserved_units_total\" \"reserved_principal\" \"contract_type\" \"total_units\" \"next_principal_redemption\" \"reserved_interest\" \"cumulative_interest_index\" \"cumulative_principal_index\" 0x5223417272616e67657223 \"settlement_asset_id\" \"initial_exchange_amount\" 0x5223417574686f7269747923 0x52235072696d6172794465616c657223 0x52234163636f756e744d616e6167657223 0x52234f6273657276657223 0x52234f704461656d6f6e23 \"initial_exchange_date\" \"transfer_opening_date\" \"transfer_closure_date\" \"rate_reset_floor\" \"rate_reset_cap\" 0x5323 0x52235472757374656523 \"asset_suspended\" \"dynamic_principal_redemption\" \"rate_reset_spread\" \"rate_reset_multiplier\" \"rate_reset_next\" \"has_rate_reset_floor\" \"has_rate_reset_cap\" 0x00 \"asset_defaulted\" \"prospectus_hash\" \"prospectus_url\" \"denomination_asset_id\" \"maturity_date\" \"day_count_convention\" 0x068101" + }, + "825": { + "op": "txn ApplicationID", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "827": { + "op": "bnz main_after_if_else@2", + "stack_out": [] + }, + "830": { + "op": "bytec 18 // 0x5223417272616e67657223", + "defined_out": [ + "0x5223417272616e67657223" + ], + "stack_out": [ + "0x5223417272616e67657223" + ] + }, + "832": { + "op": "global ZeroAddress", + "defined_out": [ + "0x5223417272616e67657223", + "tmp%0#3" + ], + "stack_out": [ + "0x5223417272616e67657223", + "tmp%0#3" + ] + }, + "834": { + "op": "app_global_put", + "stack_out": [] + }, + "835": { + "op": "bytec 25 // 0x52234f704461656d6f6e23", + "defined_out": [ + "0x52234f704461656d6f6e23" + ], + "stack_out": [ + "0x52234f704461656d6f6e23" + ] + }, + "837": { + "op": "global ZeroAddress", + "defined_out": [ + "0x52234f704461656d6f6e23", + "tmp%1#3" + ], + "stack_out": [ + "0x52234f704461656d6f6e23", + "tmp%1#3" + ] + }, + "839": { + "op": "app_global_put", + "stack_out": [] + }, + "840": { + "op": "bytec 33 // \"asset_suspended\"", + "defined_out": [ + "\"asset_suspended\"" + ], + "stack_out": [ + "\"asset_suspended\"" + ] + }, + "842": { + "op": "intc_0 // 0", + "defined_out": [ + "\"asset_suspended\"", + "0" + ], + "stack_out": [ + "\"asset_suspended\"", + "0" + ] + }, + "843": { + "op": "app_global_put", + "stack_out": [] + }, + "844": { + "op": "bytec 41 // \"asset_defaulted\"", + "defined_out": [ + "\"asset_defaulted\"" + ], + "stack_out": [ + "\"asset_defaulted\"" + ] + }, + "846": { + "op": "intc_0 // 0", + "stack_out": [ + "\"asset_defaulted\"", + "0" + ] + }, + "847": { + "op": "app_global_put", + "stack_out": [] + }, + "848": { + "op": "bytec_1 // \"status\"", + "defined_out": [ + "\"status\"" + ], + "stack_out": [ + "\"status\"" + ] + }, + "849": { + "op": "intc_0 // 0", + "stack_out": [ + "\"status\"", + "0" + ] + }, + "850": { + "op": "app_global_put", + "stack_out": [] + }, + "851": { + "op": "bytec 12 // \"contract_type\"", + "defined_out": [ + "\"contract_type\"" + ], + "stack_out": [ + "\"contract_type\"" + ] + }, + "853": { + "op": "intc_0 // 0", + "stack_out": [ + "\"contract_type\"", + "0" + ] + }, + "854": { + "op": "app_global_put", + "stack_out": [] + }, + "855": { + "op": "bytec 42 // \"prospectus_hash\"", + "defined_out": [ + "\"prospectus_hash\"" + ], + "stack_out": [ + "\"prospectus_hash\"" + ] + }, + "857": { + "op": "pushbytes 0x", + "defined_out": [ + "\"prospectus_hash\"", + "0x" + ], + "stack_out": [ + "\"prospectus_hash\"", + "0x" + ] + }, + "859": { + "op": "app_global_put", + "stack_out": [] + }, + "860": { + "op": "bytec 43 // \"prospectus_url\"", + "defined_out": [ + "\"prospectus_url\"" + ], + "stack_out": [ + "\"prospectus_url\"" + ] + }, + "862": { + "op": "pushbytes \"\"", + "defined_out": [ + "\"\"", + "\"prospectus_url\"" + ], + "stack_out": [ + "\"prospectus_url\"", + "\"\"" + ] + }, + "864": { + "op": "app_global_put", + "stack_out": [] + }, + "865": { + "op": "bytec 44 // \"denomination_asset_id\"", + "defined_out": [ + "\"denomination_asset_id\"" + ], + "stack_out": [ + "\"denomination_asset_id\"" + ] + }, + "867": { + "op": "intc_0 // 0", + "stack_out": [ + "\"denomination_asset_id\"", + "0" + ] + }, + "868": { + "op": "app_global_put", + "stack_out": [] + }, + "869": { + "op": "bytec 19 // \"settlement_asset_id\"", + "defined_out": [ + "\"settlement_asset_id\"" + ], + "stack_out": [ + "\"settlement_asset_id\"" + ] + }, + "871": { + "op": "intc_0 // 0", + "stack_out": [ + "\"settlement_asset_id\"", + "0" + ] + }, + "872": { + "op": "app_global_put", + "stack_out": [] + }, + "873": { + "op": "bytec 26 // \"initial_exchange_date\"", + "defined_out": [ + "\"initial_exchange_date\"" + ], + "stack_out": [ + "\"initial_exchange_date\"" + ] + }, + "875": { + "op": "intc_0 // 0", + "stack_out": [ + "\"initial_exchange_date\"", + "0" + ] + }, + "876": { + "op": "app_global_put", + "stack_out": [] + }, + "877": { + "op": "bytec 45 // \"maturity_date\"", + "defined_out": [ + "\"maturity_date\"" + ], + "stack_out": [ + "\"maturity_date\"" + ] + }, + "879": { + "op": "intc_0 // 0", + "stack_out": [ + "\"maturity_date\"", + "0" + ] + }, + "880": { + "op": "app_global_put", + "stack_out": [] + }, + "881": { + "op": "bytec 27 // \"transfer_opening_date\"", + "defined_out": [ + "\"transfer_opening_date\"" + ], + "stack_out": [ + "\"transfer_opening_date\"" + ] + }, + "883": { + "op": "intc_0 // 0", + "stack_out": [ + "\"transfer_opening_date\"", + "0" + ] + }, + "884": { + "op": "app_global_put", + "stack_out": [] + }, + "885": { + "op": "bytec 28 // \"transfer_closure_date\"", + "defined_out": [ + "\"transfer_closure_date\"" + ], + "stack_out": [ + "\"transfer_closure_date\"" + ] + }, + "887": { + "op": "intc_0 // 0", + "stack_out": [ + "\"transfer_closure_date\"", + "0" + ] + }, + "888": { + "op": "app_global_put", + "stack_out": [] + }, + "889": { + "op": "bytec 46 // \"day_count_convention\"", + "defined_out": [ + "\"day_count_convention\"" + ], + "stack_out": [ + "\"day_count_convention\"" + ] + }, + "891": { + "op": "intc_0 // 0", + "stack_out": [ + "\"day_count_convention\"", + "0" + ] + }, + "892": { + "op": "app_global_put", + "stack_out": [] + }, + "893": { + "op": "bytec 13 // \"total_units\"", + "defined_out": [ + "\"total_units\"" + ], + "stack_out": [ + "\"total_units\"" + ] + }, + "895": { + "op": "intc_0 // 0", + "stack_out": [ + "\"total_units\"", + "0" + ] + }, + "896": { + "op": "app_global_put", + "stack_out": [] + }, + "897": { + "op": "bytec 10 // \"reserved_units_total\"", + "defined_out": [ + "\"reserved_units_total\"" + ], + "stack_out": [ + "\"reserved_units_total\"" + ] + }, + "899": { + "op": "intc_0 // 0", + "stack_out": [ + "\"reserved_units_total\"", + "0" + ] + }, + "900": { + "op": "app_global_put", + "stack_out": [] + }, + "901": { + "op": "bytec 20 // \"initial_exchange_amount\"", + "defined_out": [ + "\"initial_exchange_amount\"" + ], + "stack_out": [ + "\"initial_exchange_amount\"" + ] + }, + "903": { + "op": "intc_0 // 0", + "stack_out": [ + "\"initial_exchange_amount\"", + "0" + ] + }, + "904": { + "op": "app_global_put", + "stack_out": [] + }, + "905": { + "op": "bytec_3 // \"outstanding_principal\"", + "defined_out": [ + "\"outstanding_principal\"" + ], + "stack_out": [ + "\"outstanding_principal\"" + ] + }, + "906": { + "op": "intc_0 // 0", + "stack_out": [ + "\"outstanding_principal\"", + "0" + ] + }, + "907": { + "op": "app_global_put", + "stack_out": [] + }, + "908": { + "op": "bytec 14 // \"next_principal_redemption\"", + "defined_out": [ + "\"next_principal_redemption\"" + ], + "stack_out": [ + "\"next_principal_redemption\"" + ] + }, + "910": { + "op": "intc_0 // 0", + "stack_out": [ + "\"next_principal_redemption\"", + "0" + ] + }, + "911": { + "op": "app_global_put", + "stack_out": [] + }, + "912": { + "op": "bytec 34 // \"dynamic_principal_redemption\"", + "defined_out": [ + "\"dynamic_principal_redemption\"" + ], + "stack_out": [ + "\"dynamic_principal_redemption\"" + ] + }, + "914": { + "op": "intc_0 // 0", + "stack_out": [ + "\"dynamic_principal_redemption\"", + "0" + ] + }, + "915": { + "op": "app_global_put", + "stack_out": [] + }, + "916": { + "op": "bytec 7 // \"interest_calculation_base\"", + "defined_out": [ + "\"interest_calculation_base\"" + ], + "stack_out": [ + "\"interest_calculation_base\"" + ] + }, + "918": { + "op": "intc_0 // 0", + "stack_out": [ + "\"interest_calculation_base\"", + "0" + ] + }, + "919": { + "op": "app_global_put", + "stack_out": [] + }, + "920": { + "op": "bytec 6 // \"accrued_interest\"", + "defined_out": [ + "\"accrued_interest\"" + ], + "stack_out": [ + "\"accrued_interest\"" + ] + }, + "922": { + "op": "intc_0 // 0", + "stack_out": [ + "\"accrued_interest\"", + "0" + ] + }, + "923": { + "op": "app_global_put", + "stack_out": [] + }, + "924": { + "op": "bytec 9 // \"nominal_interest_rate\"", + "defined_out": [ + "\"nominal_interest_rate\"" + ], + "stack_out": [ + "\"nominal_interest_rate\"" + ] + }, + "926": { + "op": "intc_0 // 0", + "stack_out": [ + "\"nominal_interest_rate\"", + "0" + ] + }, + "927": { + "op": "app_global_put", + "stack_out": [] + }, + "928": { + "op": "bytec 35 // \"rate_reset_spread\"", + "defined_out": [ + "\"rate_reset_spread\"" + ], + "stack_out": [ + "\"rate_reset_spread\"" + ] + }, + "930": { + "op": "intc_0 // 0", + "stack_out": [ + "\"rate_reset_spread\"", + "0" + ] + }, + "931": { + "op": "app_global_put", + "stack_out": [] + }, + "932": { + "op": "bytec 36 // \"rate_reset_multiplier\"", + "defined_out": [ + "\"rate_reset_multiplier\"" + ], + "stack_out": [ + "\"rate_reset_multiplier\"" + ] + }, + "934": { + "op": "intc_0 // 0", + "stack_out": [ + "\"rate_reset_multiplier\"", + "0" + ] + }, + "935": { + "op": "app_global_put", + "stack_out": [] + }, + "936": { + "op": "bytec 29 // \"rate_reset_floor\"", + "defined_out": [ + "\"rate_reset_floor\"" + ], + "stack_out": [ + "\"rate_reset_floor\"" + ] + }, + "938": { + "op": "intc_0 // 0", + "stack_out": [ + "\"rate_reset_floor\"", + "0" + ] + }, + "939": { + "op": "app_global_put", + "stack_out": [] + }, + "940": { + "op": "bytec 30 // \"rate_reset_cap\"", + "defined_out": [ + "\"rate_reset_cap\"" + ], + "stack_out": [ + "\"rate_reset_cap\"" + ] + }, + "942": { + "op": "intc_0 // 0", + "stack_out": [ + "\"rate_reset_cap\"", + "0" + ] + }, + "943": { + "op": "app_global_put", + "stack_out": [] + }, + "944": { + "op": "bytec 37 // \"rate_reset_next\"", + "defined_out": [ + "\"rate_reset_next\"" + ], + "stack_out": [ + "\"rate_reset_next\"" + ] + }, + "946": { + "op": "intc_0 // 0", + "stack_out": [ + "\"rate_reset_next\"", + "0" + ] + }, + "947": { + "op": "app_global_put", + "stack_out": [] + }, + "948": { + "op": "bytec 38 // \"has_rate_reset_floor\"", + "defined_out": [ + "\"has_rate_reset_floor\"" + ], + "stack_out": [ + "\"has_rate_reset_floor\"" + ] + }, + "950": { + "op": "intc_0 // 0", + "stack_out": [ + "\"has_rate_reset_floor\"", + "0" + ] + }, + "951": { + "op": "app_global_put", + "stack_out": [] + }, + "952": { + "op": "bytec 39 // \"has_rate_reset_cap\"", + "defined_out": [ + "\"has_rate_reset_cap\"" + ], + "stack_out": [ + "\"has_rate_reset_cap\"" + ] + }, + "954": { + "op": "intc_0 // 0", + "stack_out": [ + "\"has_rate_reset_cap\"", + "0" + ] + }, + "955": { + "op": "app_global_put", + "stack_out": [] + }, + "956": { + "op": "bytec 11 // \"reserved_principal\"", + "defined_out": [ + "\"reserved_principal\"" + ], + "stack_out": [ + "\"reserved_principal\"" + ] + }, + "958": { + "op": "intc_0 // 0", + "stack_out": [ + "\"reserved_principal\"", + "0" + ] + }, + "959": { + "op": "app_global_put", + "stack_out": [] + }, + "960": { + "op": "bytec 15 // \"reserved_interest\"", + "defined_out": [ + "\"reserved_interest\"" + ], + "stack_out": [ + "\"reserved_interest\"" + ] + }, + "962": { + "op": "intc_0 // 0", + "stack_out": [ + "\"reserved_interest\"", + "0" + ] + }, + "963": { + "op": "app_global_put", + "stack_out": [] + }, + "964": { + "op": "bytec 16 // \"cumulative_interest_index\"", + "defined_out": [ + "\"cumulative_interest_index\"" + ], + "stack_out": [ + "\"cumulative_interest_index\"" + ] + }, + "966": { + "op": "intc_0 // 0", + "stack_out": [ + "\"cumulative_interest_index\"", + "0" + ] + }, + "967": { + "op": "app_global_put", + "stack_out": [] + }, + "968": { + "op": "bytec 17 // \"cumulative_principal_index\"", + "defined_out": [ + "\"cumulative_principal_index\"" + ], + "stack_out": [ + "\"cumulative_principal_index\"" + ] + }, + "970": { + "op": "intc_0 // 0", + "stack_out": [ + "\"cumulative_principal_index\"", + "0" + ] + }, + "971": { + "op": "app_global_put", + "stack_out": [] + }, + "972": { + "op": "bytec_2 // \"event_cursor\"", + "defined_out": [ + "\"event_cursor\"" + ], + "stack_out": [ + "\"event_cursor\"" + ] + }, + "973": { + "op": "intc_0 // 0", + "stack_out": [ + "\"event_cursor\"", + "0" + ] + }, + "974": { + "op": "app_global_put", + "stack_out": [] + }, + "975": { + "op": "bytec 4 // \"schedule_entry_count\"", + "defined_out": [ + "\"schedule_entry_count\"" + ], + "stack_out": [ + "\"schedule_entry_count\"" + ] + }, + "977": { + "op": "intc_0 // 0", + "stack_out": [ + "\"schedule_entry_count\"", + "0" + ] + }, + "978": { + "op": "app_global_put", + "stack_out": [] + }, + "979": { + "op": "bytec 5 // \"fixed_point_scale\"", + "defined_out": [ + "\"fixed_point_scale\"" + ], + "stack_out": [ + "\"fixed_point_scale\"" + ] + }, + "981": { + "op": "intc_0 // 0", + "stack_out": [ + "\"fixed_point_scale\"", + "0" + ] + }, + "982": { + "op": "app_global_put", + "stack_out": [] + }, + "983": { + "op": "txn GlobalNumByteSlice", + "defined_out": [ + "tmp%0#2" + ], + "stack_out": [ + "tmp%0#2" + ] + }, + "985": { + "op": "pushint 4", + "defined_out": [ + "4", + "tmp%0#2" + ], + "stack_out": [ + "tmp%0#2", + "4" + ] + }, + "987": { + "op": "==", + "defined_out": [ + "tmp%1#2" + ], + "stack_out": [ + "tmp%1#2" + ] + }, + "988": { + "error": "Wrong Global Bytes allocation", + "op": "assert // Wrong Global Bytes allocation", + "stack_out": [] + }, + "989": { + "op": "txn GlobalNumUint", + "defined_out": [ + "tmp%2#1" + ], + "stack_out": [ + "tmp%2#1" + ] + }, + "991": { + "op": "pushint 37", + "defined_out": [ + "37", + "tmp%2#1" + ], + "stack_out": [ + "tmp%2#1", + "37" + ] + }, + "993": { + "op": "==", + "defined_out": [ + "tmp%3#1" + ], + "stack_out": [ + "tmp%3#1" + ] + }, + "994": { + "error": "Wrong Global UInts allocation", + "op": "assert // Wrong Global UInts allocation", + "stack_out": [] + }, + "995": { + "op": "txn LocalNumByteSlice", + "defined_out": [ + "tmp%4#1" + ], + "stack_out": [ + "tmp%4#1" + ] + }, + "997": { + "op": "!", + "defined_out": [ + "tmp%5#0" + ], + "stack_out": [ + "tmp%5#0" + ] + }, + "998": { + "error": "Wrong Local Bytes allocation", + "op": "assert // Wrong Local Bytes allocation", + "stack_out": [] + }, + "999": { + "op": "txn LocalNumUint", + "defined_out": [ + "tmp%6#0" + ], + "stack_out": [ + "tmp%6#0" + ] + }, + "1001": { + "op": "!", + "defined_out": [ + "tmp%7#0" + ], + "stack_out": [ + "tmp%7#0" + ] + }, + "1002": { + "error": "Wrong Local UInts allocation", + "op": "assert // Wrong Local UInts allocation", + "stack_out": [] + }, + "1003": { + "block": "main_after_if_else@2", + "stack_in": [], + "op": "pushbytes 0x914f04eb // method \"contract_update()void\"", + "defined_out": [ + "Method(contract_update()void)" + ], + "stack_out": [ + "Method(contract_update()void)" + ] + }, + "1009": { + "op": "txna ApplicationArgs 0", + "defined_out": [ + "Method(contract_update()void)", + "tmp%0#1" + ], + "stack_out": [ + "Method(contract_update()void)", + "tmp%0#1" + ] + }, + "1012": { + "op": "match main_contract_update_route@4", + "stack_out": [] + }, + "1016": { + "block": "main_switch_case_next@5", + "stack_in": [], + "op": "txn OnCompletion", + "defined_out": [ + "tmp%6#0" + ], + "stack_out": [ + "tmp%6#0" + ] + }, + "1018": { + "op": "!", + "defined_out": [ + "tmp%7#0" + ], + "stack_out": [ + "tmp%7#0" + ] + }, + "1019": { + "op": "assert", + "stack_out": [] + }, + "1020": { + "op": "txn ApplicationID", + "defined_out": [ + "tmp%8#0" + ], + "stack_out": [ + "tmp%8#0" + ] + }, + "1022": { + "op": "bz main_create_NoOp@31", + "stack_out": [] + }, + "1025": { + "op": "pushbytess 0xb44618c8 0xe7832529 0x7ea20e0b 0x6c85e3ee 0xbdd1a944 0xdc063b35 0x14fc10ef 0x74a7297f 0x09d4fe14 0x9a9bfa85 0x85eed33d 0x9185104a 0xd9f225ac 0x6e0e5c95 0xff3fd4b3 0x82f71b2d 0xef04f5d3 0xdf343550 0x3dbe80bd 0xdf54e82c 0x010c8299 0x7406acd2 0x1a72a2ee // method \"fund_due_cashflows(uint64)(uint64,uint64,uint64,uint64,uint64)\", method \"claim_due_cashflows(address,byte[])(uint64,uint64,uint64,uint64,byte[])\", method \"set_transfer_schedule(uint64,uint64)uint64\", method \"primary_distribution(address,uint64)uint64\", method \"transfer(address,address,uint64)uint64\", method \"account_gov_suspension(address,bool)uint64\", method \"account_open(address,address)uint64\", method \"account_update_payment_address(address,address)uint64\", method \"account_get_position(address)(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64)\", method \"contract_config((uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64),(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64),(byte[32],string))uint64\", method \"contract_schedule(uint64,bool,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[])uint64\", method \"execute_ied()uint64\", method \"apply_non_cash_event(uint64,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64\", method \"get_contract_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)\", method \"get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)\", method \"rbac_rotate_arranger(address)uint64\", method \"rbac_set_op_daemon(address)uint64\", method \"rbac_assign_role(uint8,address,(uint64,uint64))uint64\", method \"rbac_revoke_role(uint8,address)uint64\", method \"rbac_gov_asset_suspension(bool)uint64\", method \"rbac_get_arranger()address\", method \"rbac_get_address_roles(address)(bool,bool,bool,bool,bool)\", method \"rbac_get_role_validity(uint8,address)(uint64,uint64)\"", + "defined_out": [ + "Method(account_get_position(address)(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64))", + "Method(account_gov_suspension(address,bool)uint64)", + "Method(account_open(address,address)uint64)", + "Method(account_update_payment_address(address,address)uint64)", + "Method(apply_non_cash_event(uint64,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64)", + "Method(claim_due_cashflows(address,byte[])(uint64,uint64,uint64,uint64,byte[]))", + "Method(contract_config((uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64),(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64),(byte[32],string))uint64)", + "Method(contract_schedule(uint64,bool,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[])uint64)", + "Method(execute_ied()uint64)", + "Method(fund_due_cashflows(uint64)(uint64,uint64,uint64,uint64,uint64))", + "Method(get_contract_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))", + "Method(get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64))", + "Method(primary_distribution(address,uint64)uint64)", + "Method(rbac_assign_role(uint8,address,(uint64,uint64))uint64)", + "Method(rbac_get_address_roles(address)(bool,bool,bool,bool,bool))", + "Method(rbac_get_arranger()address)", + "Method(rbac_get_role_validity(uint8,address)(uint64,uint64))", + "Method(rbac_gov_asset_suspension(bool)uint64)", + "Method(rbac_revoke_role(uint8,address)uint64)", + "Method(rbac_rotate_arranger(address)uint64)", + "Method(rbac_set_op_daemon(address)uint64)", + "Method(set_transfer_schedule(uint64,uint64)uint64)", + "Method(transfer(address,address,uint64)uint64)" + ], + "stack_out": [ + "Method(fund_due_cashflows(uint64)(uint64,uint64,uint64,uint64,uint64))", + "Method(claim_due_cashflows(address,byte[])(uint64,uint64,uint64,uint64,byte[]))", + "Method(set_transfer_schedule(uint64,uint64)uint64)", + "Method(primary_distribution(address,uint64)uint64)", + "Method(transfer(address,address,uint64)uint64)", + "Method(account_gov_suspension(address,bool)uint64)", + "Method(account_open(address,address)uint64)", + "Method(account_update_payment_address(address,address)uint64)", + "Method(account_get_position(address)(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64))", + "Method(contract_config((uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64),(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64),(byte[32],string))uint64)", + "Method(contract_schedule(uint64,bool,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[])uint64)", + "Method(execute_ied()uint64)", + "Method(apply_non_cash_event(uint64,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64)", + "Method(get_contract_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))", + "Method(get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64))", + "Method(rbac_rotate_arranger(address)uint64)", + "Method(rbac_set_op_daemon(address)uint64)", + "Method(rbac_assign_role(uint8,address,(uint64,uint64))uint64)", + "Method(rbac_revoke_role(uint8,address)uint64)", + "Method(rbac_gov_asset_suspension(bool)uint64)", + "Method(rbac_get_arranger()address)", + "Method(rbac_get_address_roles(address)(bool,bool,bool,bool,bool))", + "Method(rbac_get_role_validity(uint8,address)(uint64,uint64))" + ] + }, + "1142": { + "op": "txna ApplicationArgs 0", + "defined_out": [ + "Method(account_get_position(address)(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64))", + "Method(account_gov_suspension(address,bool)uint64)", + "Method(account_open(address,address)uint64)", + "Method(account_update_payment_address(address,address)uint64)", + "Method(apply_non_cash_event(uint64,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64)", + "Method(claim_due_cashflows(address,byte[])(uint64,uint64,uint64,uint64,byte[]))", + "Method(contract_config((uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64),(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64),(byte[32],string))uint64)", + "Method(contract_schedule(uint64,bool,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[])uint64)", + "Method(execute_ied()uint64)", + "Method(fund_due_cashflows(uint64)(uint64,uint64,uint64,uint64,uint64))", + "Method(get_contract_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))", + "Method(get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64))", + "Method(primary_distribution(address,uint64)uint64)", + "Method(rbac_assign_role(uint8,address,(uint64,uint64))uint64)", + "Method(rbac_get_address_roles(address)(bool,bool,bool,bool,bool))", + "Method(rbac_get_arranger()address)", + "Method(rbac_get_role_validity(uint8,address)(uint64,uint64))", + "Method(rbac_gov_asset_suspension(bool)uint64)", + "Method(rbac_revoke_role(uint8,address)uint64)", + "Method(rbac_rotate_arranger(address)uint64)", + "Method(rbac_set_op_daemon(address)uint64)", + "Method(set_transfer_schedule(uint64,uint64)uint64)", + "Method(transfer(address,address,uint64)uint64)", + "tmp%10#0" + ], + "stack_out": [ + "Method(fund_due_cashflows(uint64)(uint64,uint64,uint64,uint64,uint64))", + "Method(claim_due_cashflows(address,byte[])(uint64,uint64,uint64,uint64,byte[]))", + "Method(set_transfer_schedule(uint64,uint64)uint64)", + "Method(primary_distribution(address,uint64)uint64)", + "Method(transfer(address,address,uint64)uint64)", + "Method(account_gov_suspension(address,bool)uint64)", + "Method(account_open(address,address)uint64)", + "Method(account_update_payment_address(address,address)uint64)", + "Method(account_get_position(address)(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64))", + "Method(contract_config((uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64),(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64),(byte[32],string))uint64)", + "Method(contract_schedule(uint64,bool,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[])uint64)", + "Method(execute_ied()uint64)", + "Method(apply_non_cash_event(uint64,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64)", + "Method(get_contract_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))", + "Method(get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64))", + "Method(rbac_rotate_arranger(address)uint64)", + "Method(rbac_set_op_daemon(address)uint64)", + "Method(rbac_assign_role(uint8,address,(uint64,uint64))uint64)", + "Method(rbac_revoke_role(uint8,address)uint64)", + "Method(rbac_gov_asset_suspension(bool)uint64)", + "Method(rbac_get_arranger()address)", + "Method(rbac_get_address_roles(address)(bool,bool,bool,bool,bool))", + "Method(rbac_get_role_validity(uint8,address)(uint64,uint64))", + "tmp%10#0" + ] + }, + "1145": { + "op": "match fund_due_cashflows claim_due_cashflows set_transfer_schedule primary_distribution transfer account_gov_suspension account_open account_update_payment_address account_get_position contract_config contract_schedule execute_ied apply_non_cash_event get_contract_state get_next_due_event rbac_rotate_arranger rbac_set_op_daemon rbac_assign_role rbac_revoke_role rbac_gov_asset_suspension rbac_get_arranger rbac_get_address_roles rbac_get_role_validity", + "stack_out": [] + }, + "1193": { + "op": "err" + }, + "1194": { + "block": "main_create_NoOp@31", + "stack_in": [], + "op": "pushbytes 0x956d7156 // method \"contract_create(address)uint64\"", + "defined_out": [ + "Method(contract_create(address)uint64)" + ], + "stack_out": [ + "Method(contract_create(address)uint64)" + ] + }, + "1200": { + "op": "txna ApplicationArgs 0", + "defined_out": [ + "Method(contract_create(address)uint64)", + "tmp%11#0" + ], + "stack_out": [ + "Method(contract_create(address)uint64)", + "tmp%11#0" + ] + }, + "1203": { + "op": "match contract_create", + "stack_out": [] + }, + "1207": { + "op": "err" + }, + "1208": { + "block": "main_contract_update_route@4", + "stack_in": [], + "op": "txn OnCompletion", + "defined_out": [ + "tmp%1#1" + ], + "stack_out": [ + "tmp%1#1" + ] + }, + "1210": { + "op": "pushint 4 // UpdateApplication", + "defined_out": [ + "UpdateApplication", + "tmp%1#1" + ], + "stack_out": [ + "tmp%1#1", + "UpdateApplication" + ] + }, + "1212": { + "op": "==", + "defined_out": [ + "tmp%2#0" + ], + "stack_out": [ + "tmp%2#0" + ] + }, + "1213": { + "op": "txn ApplicationID", + "defined_out": [ + "tmp%2#0", + "tmp%3#0" + ], + "stack_out": [ + "tmp%2#0", + "tmp%3#0" + ] + }, + "1215": { + "op": "&&", + "defined_out": [ + "tmp%5#0" + ], + "stack_out": [ + "tmp%5#0" + ] + }, + "1216": { + "op": "assert", + "stack_out": [] + }, + "1217": { + "op": "b contract_update" + }, + "1220": { + "subroutine": "modules.payment_agent.PaymentAgent.fund_due_cashflows[routing]", + "params": {}, + "block": "fund_due_cashflows", + "stack_in": [], + "op": "intc_0 // 0", + "stack_out": [ + "entry#0" + ] + }, + "1221": { + "op": "pushbytes \"\"", + "stack_out": [ + "entry#0", + "event_type#0" + ] + }, + "1223": { + "op": "dupn 10", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0" + ] + }, + "1225": { + "op": "txna ApplicationArgs 1", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "tmp%0#0" + ] + }, + "1228": { + "op": "dup", + "defined_out": [ + "tmp%0#0", + "tmp%0#0 (copy)" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "tmp%0#0", + "tmp%0#0 (copy)" + ] + }, + "1229": { + "op": "len", + "defined_out": [ + "len%0#0", + "tmp%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "tmp%0#0", + "len%0#0" + ] + }, + "1230": { + "op": "intc_2 // 8", + "defined_out": [ + "8", + "len%0#0", + "tmp%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "tmp%0#0", + "len%0#0", + "8" + ] + }, + "1231": { + "op": "==", + "defined_out": [ + "eq%0#0", + "tmp%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "tmp%0#0", + "eq%0#0" + ] + }, + "1232": { + "error": "invalid number of bytes for arc4.uint64", + "op": "assert // invalid number of bytes for arc4.uint64", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "tmp%0#0" + ] + }, + "1233": { + "op": "btoi", + "defined_out": [ + "max_event_count#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ] + }, + "1234": { + "op": "intc_0 // 0", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "0" + ] + }, + "1235": { + "op": "bytec_1 // \"status\"", + "defined_out": [ + "\"status\"", + "0", + "max_event_count#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "0", + "\"status\"" + ] + }, + "1236": { + "op": "app_global_get_ex", + "defined_out": [ + "max_event_count#0", + "maybe_exists%0#0", + "maybe_value%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "1237": { + "error": "check self.status exists", + "op": "assert // check self.status exists", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "maybe_value%0#0" + ] + }, + "1238": { + "error": "D-ASA not configured", + "op": "assert // D-ASA not configured", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ] + }, + "1239": { + "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", + "op": "callsub _assert_caller_is_arranger" + }, + "1242": { + "callsub": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", + "op": "callsub _assert_is_not_asset_defaulted" + }, + "1245": { + "callsub": "modules.rbac.RbacModule._assert_is_not_asset_suspended", + "op": "callsub _assert_is_not_asset_suspended" + }, + "1248": { + "op": "intc_0 // 0", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "0" + ] + }, + "1249": { + "op": "bytec_1 // \"status\"", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "0", + "\"status\"" + ] + }, + "1250": { + "op": "app_global_get_ex", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "1251": { + "error": "check self.status exists", + "op": "assert // check self.status exists", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "maybe_value%0#0" + ] + }, + "1252": { + "op": "pushint 50", + "defined_out": [ + "50", + "max_event_count#0", + "maybe_value%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "maybe_value%0#0", + "50" + ] + }, + "1254": { + "op": "==", + "defined_out": [ + "max_event_count#0", + "tmp%0#1" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "tmp%0#1" + ] + }, + "1255": { + "op": "!", + "defined_out": [ + "max_event_count#0", + "tmp%0#1", + "tmp%1#1" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "tmp%1#1" + ] + }, + "1256": { + "error": "IED not yet executed", + "op": "assert // IED not yet executed", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ] + }, + "1257": { + "op": "intc_0 // 0" + }, + "1258": { + "op": "dupn 2", + "defined_out": [ + "funded_interest#0", + "funded_principal#0", + "max_event_count#0", + "processed_events#0", + "tmp%0#1" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ] + }, + "1260": { + "block": "fund_due_cashflows_while_top@2", + "stack_in": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ], + "op": "dig 2", + "defined_out": [ + "processed_events#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "processed_events#0" + ] + }, + "1262": { + "op": "dig 4", + "defined_out": [ + "max_event_count#0", + "processed_events#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "processed_events#0", + "max_event_count#0" + ] + }, + "1264": { + "op": "<", + "defined_out": [ + "max_event_count#0", + "processed_events#0", + "tmp%0#1" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "tmp%0#1" + ] + }, + "1265": { + "op": "bz fund_due_cashflows_after_while@9", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ] + }, + "1268": { + "op": "intc_0 // 0", + "defined_out": [ + "0", + "max_event_count#0", + "processed_events#0", + "tmp%0#1" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "0" + ] + }, + "1269": { + "op": "bytec_2 // \"event_cursor\"", + "defined_out": [ + "\"event_cursor\"", + "0", + "max_event_count#0", + "processed_events#0", + "tmp%0#1" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "0", + "\"event_cursor\"" + ] + }, + "1270": { + "op": "app_global_get_ex", + "defined_out": [ + "max_event_count#0", + "maybe_exists%0#0", + "maybe_value%0#0", + "processed_events#0", + "tmp%0#1" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "1271": { + "error": "check self.event_cursor exists", + "op": "assert // check self.event_cursor exists", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "maybe_value%0#0" + ] + }, + "1272": { + "op": "intc_0 // 0", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "maybe_value%0#0", + "0" + ] + }, + "1273": { + "op": "bytec 4 // \"schedule_entry_count\"", + "defined_out": [ + "\"schedule_entry_count\"", + "0", + "max_event_count#0", + "maybe_value%0#0", + "processed_events#0", + "tmp%0#1" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "maybe_value%0#0", + "0", + "\"schedule_entry_count\"" + ] + }, + "1275": { + "op": "app_global_get_ex", + "defined_out": [ + "max_event_count#0", + "maybe_exists%1#0", + "maybe_value%0#0", + "maybe_value%1#0", + "processed_events#0", + "tmp%0#1" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "maybe_value%0#0", + "maybe_value%1#0", + "maybe_exists%1#0" + ] + }, + "1276": { + "error": "check self.schedule_entry_count exists", + "op": "assert // check self.schedule_entry_count exists", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "maybe_value%0#0", + "maybe_value%1#0" + ] + }, + "1277": { + "op": "<", + "defined_out": [ + "max_event_count#0", + "processed_events#0", + "tmp%0#1", + "tmp%1#1" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "tmp%1#1" + ] + }, + "1278": { + "op": "bz fund_due_cashflows_after_while@9", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ] + }, + "1281": { + "op": "intc_0 // 0", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "0" + ] + }, + "1282": { + "op": "bytec_2 // \"event_cursor\"", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "0", + "\"event_cursor\"" + ] + }, + "1283": { + "op": "app_global_get_ex", + "defined_out": [ + "max_event_count#0", + "maybe_exists%2#0", + "maybe_value%2#0", + "processed_events#0", + "tmp%0#1" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "maybe_value%2#0", + "maybe_exists%2#0" + ] + }, + "1284": { + "error": "check self.event_cursor exists", + "op": "assert // check self.event_cursor exists", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "maybe_value%2#0" + ] + }, + "1285": { + "callsub": "modules.kernel.ActusKernelModule._get_schedule_entry", + "op": "callsub _get_schedule_entry", + "defined_out": [ + "entry#0", + "max_event_count#0", + "processed_events#0", + "tmp%0#1" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "entry#0" + ] + }, + "1288": { + "op": "dup", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "entry#0", + "entry#0" + ] + }, + "1289": { + "op": "bury 17", + "defined_out": [ + "entry#0", + "max_event_count#0", + "processed_events#0", + "tmp%0#1" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "entry#0" + ] + }, + "1291": { + "op": "pushint 9", + "defined_out": [ + "9", + "entry#0", + "max_event_count#0", + "processed_events#0", + "tmp%0#1" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "entry#0", + "9" + ] + }, + "1293": { + "op": "extract_uint64", + "defined_out": [ + "entry#0", + "max_event_count#0", + "processed_events#0", + "tmp%0#1", + "values%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "values%0#0" + ] + }, + "1294": { + "op": "dup", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "values%0#0", + "values%0#0" + ] + }, + "1295": { + "op": "bury 6", + "defined_out": [ + "entry#0", + "max_event_count#0", + "processed_events#0", + "tmp%0#1", + "values%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "values%0#0" + ] + }, + "1297": { + "op": "global LatestTimestamp", + "defined_out": [ + "entry#0", + "max_event_count#0", + "processed_events#0", + "tmp%0#1", + "tmp%3#1", + "values%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "values%0#0", + "tmp%3#1" + ] + }, + "1299": { + "op": ">", + "defined_out": [ + "entry#0", + "max_event_count#0", + "processed_events#0", + "tmp%0#1", + "tmp%4#0", + "values%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "tmp%4#0" + ] + }, + "1300": { + "op": "bnz fund_due_cashflows_after_while@9", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ] + }, + "1303": { + "op": "dig 15", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "entry#0" + ] + }, + "1305": { + "op": "intc_2 // 8", + "defined_out": [ + "8", + "entry#0", + "max_event_count#0", + "processed_events#0", + "tmp%0#1", + "values%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "entry#0", + "8" + ] + }, + "1306": { + "op": "getbyte", + "defined_out": [ + "entry#0", + "event_type#0", + "max_event_count#0", + "processed_events#0", + "tmp%0#1", + "values%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "event_type#0" + ] + }, + "1307": { + "op": "dup", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "event_type#0", + "event_type#0" + ] + }, + "1308": { + "op": "bury 16", + "defined_out": [ + "entry#0", + "event_type#0", + "max_event_count#0", + "processed_events#0", + "tmp%0#1", + "values%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "event_type#0" + ] + }, + "1310": { + "op": "intc_2 // 8", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "event_type#0", + "8" + ] + }, + "1311": { + "op": "==", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "tmp%0#1" + ] + }, + "1312": { + "op": "dup", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "tmp%0#1", + "tmp%0#1" + ] + }, + "1313": { + "op": "bury 7", + "defined_out": [ + "entry#0", + "event_type#0", + "max_event_count#0", + "processed_events#0", + "tmp%0#1", + "values%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "tmp%0#1" + ] + }, + "1315": { + "op": "bnz fund_due_cashflows_bool_true@50", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ] + }, + "1318": { + "op": "dig 14", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "event_type#0" + ] + }, + "1320": { + "op": "pushint 3", + "defined_out": [ + "3", + "entry#0", + "event_type#0", + "max_event_count#0", + "processed_events#0", + "tmp%0#1", + "values%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "event_type#0", + "3" + ] + }, + "1322": { + "op": "==", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "tmp%1#1" + ] + }, + "1323": { + "op": "bnz fund_due_cashflows_bool_true@50", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ] + }, + "1326": { + "op": "dig 14", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "event_type#0" + ] + }, + "1328": { + "op": "pushint 19", + "defined_out": [ + "19", + "entry#0", + "event_type#0", + "max_event_count#0", + "processed_events#0", + "tmp%0#1", + "values%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "event_type#0", + "19" + ] + }, + "1330": { + "op": "==", + "defined_out": [ + "entry#0", + "event_type#0", + "max_event_count#0", + "processed_events#0", + "tmp%0#1", + "tmp%2#0", + "values%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "tmp%2#0" + ] + }, + "1331": { + "op": "bz fund_due_cashflows_bool_false@51", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ] + }, + "1334": { + "block": "fund_due_cashflows_bool_true@50", + "stack_in": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ], + "op": "intc_1 // 1", + "defined_out": [ + "or_result%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "or_result%0#0" + ] + }, + "1335": { + "block": "fund_due_cashflows_bool_merge@52", + "stack_in": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "or_result%0#0" + ], + "op": "bz fund_due_cashflows_after_while@9", + "defined_out": [], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ] + }, + "1338": { + "op": "dig 15", + "defined_out": [ + "entry#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "entry#0" + ] + }, + "1340": { + "op": "intc_0 // 0", + "defined_out": [ + "0", + "entry#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "entry#0", + "0" + ] + }, + "1341": { + "op": "extract_uint64", + "defined_out": [ + "entry#0", + "values%0#1" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "values%0#1" + ] + }, + "1342": { + "op": "intc_0 // 0", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "values%0#1", + "0" + ] + }, + "1343": { + "op": "bytec_2 // \"event_cursor\"", + "defined_out": [ + "\"event_cursor\"", + "0", + "entry#0", + "values%0#1" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "values%0#1", + "0", + "\"event_cursor\"" + ] + }, + "1344": { + "op": "app_global_get_ex", + "defined_out": [ + "entry#0", + "maybe_exists%0#0", + "maybe_value%0#0", + "values%0#1" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "values%0#1", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "1345": { + "error": "check self.event_cursor exists", + "op": "assert // check self.event_cursor exists", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "values%0#1", + "maybe_value%0#0" + ] + }, + "1346": { + "op": "==", + "defined_out": [ + "entry#0", + "tmp%0#2" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "tmp%0#2" + ] + }, + "1347": { + "error": "Invalid event cursor", + "op": "assert // Invalid event cursor", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ] + }, + "1348": { + "op": "dig 4", + "defined_out": [ + "entry#0", + "values%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "values%0#0" + ] + }, + "1350": { + "op": "global LatestTimestamp", + "defined_out": [ + "entry#0", + "tmp%1#2", + "values%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "values%0#0", + "tmp%1#2" + ] + }, + "1352": { + "op": "<=", + "defined_out": [ + "entry#0", + "tmp%2#0", + "values%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "tmp%2#0" + ] + }, + "1353": { + "error": "No due cashflow to pay", + "op": "assert // No due cashflow to pay", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ] + }, + "1354": { + "op": "dig 5", + "defined_out": [ + "entry#0", + "tmp%0#1", + "values%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "tmp%0#1" + ] + }, + "1356": { + "op": "bnz fund_due_cashflows_after_if_else@13", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ] + }, + "1359": { + "op": "dig 14", + "defined_out": [ + "entry#0", + "event_type#0", + "tmp%0#1", + "values%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "event_type#0" + ] + }, + "1361": { + "op": "pushint 19", + "defined_out": [ + "19", + "entry#0", + "event_type#0", + "tmp%0#1", + "values%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "event_type#0", + "19" + ] + }, + "1363": { + "op": "==", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "tmp%2#0" + ] + }, + "1364": { + "op": "bnz fund_due_cashflows_after_if_else@13", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ] + }, + "1367": { + "op": "intc_0 // 0", + "defined_out": [ + "entry#0", + "event_type#0", + "interest_amount_due#0", + "tmp%0#1", + "values%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount_due#0" + ] + }, + "1368": { + "op": "bury 13", + "defined_out": [ + "entry#0", + "event_type#0", + "interest_amount_due#0", + "tmp%0#1", + "values%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ] + }, + "1370": { + "block": "fund_due_cashflows_after_inlined_modules.kernel.ActusKernelModule._entry_interest_amount@14", + "stack_in": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ], + "op": "dig 15", + "defined_out": [ + "entry#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "entry#0" + ] + }, + "1372": { + "op": "intc_2 // 8", + "defined_out": [ + "8", + "entry#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "entry#0", + "8" + ] + }, + "1373": { + "op": "getbyte", + "defined_out": [ + "entry#0", + "event_type#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "event_type#0" + ] + }, + "1374": { + "op": "dup", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "event_type#0", + "event_type#0" + ] + }, + "1375": { + "op": "bury 16", + "defined_out": [ + "entry#0", + "event_type#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "event_type#0" + ] + }, + "1377": { + "op": "pushint 3", + "defined_out": [ + "3", + "entry#0", + "event_type#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "event_type#0", + "3" + ] + }, + "1379": { + "op": "==", + "defined_out": [ + "entry#0", + "event_type#0", + "tmp%1#1" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "tmp%1#1" + ] + }, + "1380": { + "op": "bnz fund_due_cashflows_after_if_else@17", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ] + }, + "1383": { + "op": "dig 14", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "event_type#0" + ] + }, + "1385": { + "op": "pushint 19", + "defined_out": [ + "19", + "entry#0", + "event_type#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "event_type#0", + "19" + ] + }, + "1387": { + "op": "==", + "defined_out": [ + "entry#0", + "event_type#0", + "tmp%2#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "tmp%2#0" + ] + }, + "1388": { + "op": "bnz fund_due_cashflows_after_if_else@17", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ] + }, + "1391": { + "op": "intc_0 // 0", + "defined_out": [ + "entry#0", + "event_type#0", + "principal_amount_due#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "principal_amount_due#0" + ] + }, + "1392": { + "op": "bury 8", + "defined_out": [ + "entry#0", + "event_type#0", + "principal_amount_due#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ] + }, + "1394": { + "block": "fund_due_cashflows_after_inlined_modules.kernel.ActusKernelModule._entry_principal_amount@26", + "stack_in": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ], + "op": "dig 15", + "defined_out": [ + "entry#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "entry#0" + ] + }, + "1396": { + "op": "pushint 49", + "defined_out": [ + "49", + "entry#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "entry#0", + "49" + ] + }, + "1398": { + "op": "extract_uint64", + "defined_out": [ + "entry#0", + "next_outstanding_principal#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "next_outstanding_principal#0" + ] + }, + "1399": { + "op": "bury 10", + "defined_out": [ + "entry#0", + "next_outstanding_principal#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ] + }, + "1401": { + "callsub": "modules.kernel.ActusKernelModule._is_dynamic_annuity", + "op": "callsub _is_dynamic_annuity", + "defined_out": [ + "entry#0", + "next_outstanding_principal#0", + "tmp%3#2" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "tmp%3#2" + ] + }, + "1404": { + "op": "bnz fund_due_cashflows_if_body@27", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ] + }, + "1407": { + "op": "dig 9", + "defined_out": [ + "entry#0", + "next_interest_base#2", + "next_outstanding_principal#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "next_interest_base#2" + ] + }, + "1409": { + "op": "bury 11", + "defined_out": [ + "entry#0", + "next_interest_base#2", + "next_outstanding_principal#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ] + }, + "1411": { + "block": "fund_due_cashflows_after_if_else@36", + "stack_in": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ], + "op": "dig 12", + "defined_out": [ + "interest_amount_due#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount_due#0" + ] + }, + "1413": { + "callsub": "modules.kernel.ActusKernelModule._amount_to_index_delta", + "op": "callsub _amount_to_index_delta", + "defined_out": [ + "interest_amount_due#0", + "interest_index_delta#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "interest_index_delta#0" + ] + }, + "1416": { + "op": "dig 8", + "defined_out": [ + "interest_amount_due#0", + "interest_index_delta#0", + "principal_amount_due#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "interest_index_delta#0", + "principal_amount_due#0" + ] + }, + "1418": { + "callsub": "modules.kernel.ActusKernelModule._amount_to_index_delta", + "op": "callsub _amount_to_index_delta", + "defined_out": [ + "interest_amount_due#0", + "interest_index_delta#0", + "principal_amount_due#0", + "principal_index_delta#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "interest_index_delta#0", + "principal_index_delta#0" + ] + }, + "1421": { + "op": "dig 1", + "defined_out": [ + "interest_amount_due#0", + "interest_index_delta#0", + "interest_index_delta#0 (copy)", + "principal_amount_due#0", + "principal_index_delta#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "interest_index_delta#0", + "principal_index_delta#0", + "interest_index_delta#0 (copy)" + ] + }, + "1423": { + "callsub": "modules.kernel.ActusKernelModule._index_delta_to_amount", + "op": "callsub _index_delta_to_amount", + "defined_out": [ + "interest_amount#1", + "interest_amount_due#0", + "interest_index_delta#0", + "principal_amount_due#0", + "principal_index_delta#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "interest_index_delta#0", + "principal_index_delta#0", + "interest_amount#1" + ] + }, + "1426": { + "op": "dup", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "interest_index_delta#0", + "principal_index_delta#0", + "interest_amount#1", + "interest_amount#1 (copy)" + ] + }, + "1427": { + "op": "cover 2", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0", + "interest_amount#1" + ] + }, + "1429": { + "op": "bury 17", + "defined_out": [ + "interest_amount#1", + "interest_amount_due#0", + "interest_index_delta#0", + "principal_amount_due#0", + "principal_index_delta#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0" + ] + }, + "1431": { + "op": "dup", + "defined_out": [ + "interest_amount#1", + "interest_amount_due#0", + "interest_index_delta#0", + "principal_amount_due#0", + "principal_index_delta#0", + "principal_index_delta#0 (copy)" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0", + "principal_index_delta#0 (copy)" + ] + }, + "1432": { + "callsub": "modules.kernel.ActusKernelModule._index_delta_to_amount", + "op": "callsub _index_delta_to_amount", + "defined_out": [ + "interest_amount#1", + "interest_amount_due#0", + "interest_index_delta#0", + "principal_amount#1", + "principal_amount_due#0", + "principal_index_delta#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0", + "principal_amount#1" + ] + }, + "1435": { + "op": "dup", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0", + "principal_amount#1", + "principal_amount#1" + ] + }, + "1436": { + "op": "bury 13", + "defined_out": [ + "interest_amount#1", + "interest_amount_due#0", + "interest_index_delta#0", + "principal_amount#1", + "principal_amount_due#0", + "principal_index_delta#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0", + "principal_amount#1" + ] + }, + "1438": { + "op": "dig 2", + "defined_out": [ + "interest_amount#1", + "interest_amount#1 (copy)", + "interest_amount_due#0", + "interest_index_delta#0", + "principal_amount#1", + "principal_amount_due#0", + "principal_index_delta#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0", + "principal_amount#1", + "interest_amount#1 (copy)" + ] + }, + "1440": { + "op": "dig 1", + "defined_out": [ + "interest_amount#1", + "interest_amount#1 (copy)", + "interest_amount_due#0", + "interest_index_delta#0", + "principal_amount#1", + "principal_amount#1 (copy)", + "principal_amount_due#0", + "principal_index_delta#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0", + "principal_amount#1", + "interest_amount#1 (copy)", + "principal_amount#1 (copy)" + ] + }, + "1442": { + "op": "+", + "defined_out": [ + "interest_amount#1", + "interest_amount_due#0", + "interest_index_delta#0", + "principal_amount#1", + "principal_amount_due#0", + "principal_index_delta#0", + "required_amount#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0", + "principal_amount#1", + "required_amount#0" + ] + }, + "1443": { + "op": "dup", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0", + "principal_amount#1", + "required_amount#0", + "required_amount#0" + ] + }, + "1444": { + "op": "bury 12", + "defined_out": [ + "interest_amount#1", + "interest_amount_due#0", + "interest_index_delta#0", + "principal_amount#1", + "principal_amount_due#0", + "principal_index_delta#0", + "required_amount#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0", + "principal_amount#1", + "required_amount#0" + ] + }, + "1446": { + "op": "global CurrentApplicationAddress", + "defined_out": [ + "interest_amount#1", + "interest_amount_due#0", + "interest_index_delta#0", + "principal_amount#1", + "principal_amount_due#0", + "principal_index_delta#0", + "required_amount#0", + "tmp%0#3" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0", + "principal_amount#1", + "required_amount#0", + "tmp%0#3" + ] + }, + "1448": { + "op": "intc_0 // 0", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0", + "principal_amount#1", + "required_amount#0", + "tmp%0#3", + "0" + ] + }, + "1449": { + "op": "bytec 19 // \"settlement_asset_id\"", + "defined_out": [ + "\"settlement_asset_id\"", + "0", + "interest_amount#1", + "interest_amount_due#0", + "interest_index_delta#0", + "principal_amount#1", + "principal_amount_due#0", + "principal_index_delta#0", + "required_amount#0", + "tmp%0#3" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0", + "principal_amount#1", + "required_amount#0", + "tmp%0#3", + "0", + "\"settlement_asset_id\"" + ] + }, + "1451": { + "op": "app_global_get_ex", + "defined_out": [ + "interest_amount#1", + "interest_amount_due#0", + "interest_index_delta#0", + "maybe_exists%0#0", + "maybe_value%0#0", + "principal_amount#1", + "principal_amount_due#0", + "principal_index_delta#0", + "required_amount#0", + "tmp%0#3" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0", + "principal_amount#1", + "required_amount#0", + "tmp%0#3", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "1452": { + "error": "check self.settlement_asset_id exists", + "op": "assert // check self.settlement_asset_id exists", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0", + "principal_amount#1", + "required_amount#0", + "tmp%0#3", + "maybe_value%0#0" + ] + }, + "1453": { + "op": "asset_holding_get AssetBalance", + "defined_out": [ + "balance#0", + "check%0#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_index_delta#0", + "principal_amount#1", + "principal_amount_due#0", + "principal_index_delta#0", + "required_amount#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0", + "principal_amount#1", + "required_amount#0", + "balance#0", + "check%0#0" + ] + }, + "1455": { + "error": "account opted into asset", + "op": "assert // account opted into asset", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0", + "principal_amount#1", + "required_amount#0", + "balance#0" + ] + }, + "1456": { + "op": "intc_0 // 0", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0", + "principal_amount#1", + "required_amount#0", + "balance#0", + "0" + ] + }, + "1457": { + "op": "bytec 15 // \"reserved_interest\"", + "defined_out": [ + "\"reserved_interest\"", + "0", + "balance#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_index_delta#0", + "principal_amount#1", + "principal_amount_due#0", + "principal_index_delta#0", + "required_amount#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0", + "principal_amount#1", + "required_amount#0", + "balance#0", + "0", + "\"reserved_interest\"" + ] + }, + "1459": { + "op": "app_global_get_ex", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0", + "principal_amount#1", + "required_amount#0", + "balance#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "1460": { + "error": "check self.reserved_interest exists", + "op": "assert // check self.reserved_interest exists", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0", + "principal_amount#1", + "required_amount#0", + "balance#0", + "maybe_value%0#0" + ] + }, + "1461": { + "op": "intc_0 // 0", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0", + "principal_amount#1", + "required_amount#0", + "balance#0", + "maybe_value%0#0", + "0" + ] + }, + "1462": { + "op": "bytec 11 // \"reserved_principal\"", + "defined_out": [ + "\"reserved_principal\"", + "0", + "balance#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_index_delta#0", + "maybe_value%0#0", + "principal_amount#1", + "principal_amount_due#0", + "principal_index_delta#0", + "required_amount#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0", + "principal_amount#1", + "required_amount#0", + "balance#0", + "maybe_value%0#0", + "0", + "\"reserved_principal\"" + ] + }, + "1464": { + "op": "app_global_get_ex", + "defined_out": [ + "balance#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_index_delta#0", + "maybe_exists%1#0", + "maybe_value%0#0", + "maybe_value%1#0", + "principal_amount#1", + "principal_amount_due#0", + "principal_index_delta#0", + "required_amount#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0", + "principal_amount#1", + "required_amount#0", + "balance#0", + "maybe_value%0#0", + "maybe_value%1#0", + "maybe_exists%1#0" + ] + }, + "1465": { + "error": "check self.reserved_principal exists", + "op": "assert // check self.reserved_principal exists", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0", + "principal_amount#1", + "required_amount#0", + "balance#0", + "maybe_value%0#0", + "maybe_value%1#0" + ] + }, + "1466": { + "op": "dig 1", + "defined_out": [ + "balance#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_index_delta#0", + "maybe_value%0#0", + "maybe_value%0#0 (copy)", + "maybe_value%1#0", + "principal_amount#1", + "principal_amount_due#0", + "principal_index_delta#0", + "required_amount#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0", + "principal_amount#1", + "required_amount#0", + "balance#0", + "maybe_value%0#0", + "maybe_value%1#0", + "maybe_value%0#0 (copy)" + ] + }, + "1468": { + "op": "+", + "defined_out": [ + "balance#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_index_delta#0", + "maybe_value%0#0", + "principal_amount#1", + "principal_amount_due#0", + "principal_index_delta#0", + "required_amount#0", + "reserved_total#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0", + "principal_amount#1", + "required_amount#0", + "balance#0", + "maybe_value%0#0", + "reserved_total#0" + ] + }, + "1469": { + "op": "dig 2", + "defined_out": [ + "balance#0", + "balance#0 (copy)", + "interest_amount#1", + "interest_amount_due#0", + "interest_index_delta#0", + "maybe_value%0#0", + "principal_amount#1", + "principal_amount_due#0", + "principal_index_delta#0", + "required_amount#0", + "reserved_total#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0", + "principal_amount#1", + "required_amount#0", + "balance#0", + "maybe_value%0#0", + "reserved_total#0", + "balance#0 (copy)" + ] + }, + "1471": { + "op": "dig 1", + "defined_out": [ + "balance#0", + "balance#0 (copy)", + "interest_amount#1", + "interest_amount_due#0", + "interest_index_delta#0", + "maybe_value%0#0", + "principal_amount#1", + "principal_amount_due#0", + "principal_index_delta#0", + "required_amount#0", + "reserved_total#0", + "reserved_total#0 (copy)" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0", + "principal_amount#1", + "required_amount#0", + "balance#0", + "maybe_value%0#0", + "reserved_total#0", + "balance#0 (copy)", + "reserved_total#0 (copy)" + ] + }, + "1473": { + "op": ">=", + "defined_out": [ + "balance#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_index_delta#0", + "maybe_value%0#0", + "principal_amount#1", + "principal_amount_due#0", + "principal_index_delta#0", + "required_amount#0", + "reserved_total#0", + "tmp%2#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0", + "principal_amount#1", + "required_amount#0", + "balance#0", + "maybe_value%0#0", + "reserved_total#0", + "tmp%2#0" + ] + }, + "1474": { + "error": "Not enough funds for the payment", + "op": "assert // Not enough funds for the payment", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0", + "principal_amount#1", + "required_amount#0", + "balance#0", + "maybe_value%0#0", + "reserved_total#0" + ] + }, + "1475": { + "op": "uncover 2", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0", + "principal_amount#1", + "required_amount#0", + "maybe_value%0#0", + "reserved_total#0", + "balance#0" + ] + }, + "1477": { + "op": "swap", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0", + "principal_amount#1", + "required_amount#0", + "maybe_value%0#0", + "balance#0", + "reserved_total#0" + ] + }, + "1478": { + "op": "-", + "defined_out": [ + "interest_amount#1", + "interest_amount_due#0", + "interest_index_delta#0", + "maybe_value%0#0", + "principal_amount#1", + "principal_amount_due#0", + "principal_index_delta#0", + "required_amount#0", + "tmp%3#1" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0", + "principal_amount#1", + "required_amount#0", + "maybe_value%0#0", + "tmp%3#1" + ] + }, + "1479": { + "op": "uncover 2", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0", + "principal_amount#1", + "maybe_value%0#0", + "tmp%3#1", + "required_amount#0" + ] + }, + "1481": { + "op": ">=", + "defined_out": [ + "interest_amount#1", + "interest_amount_due#0", + "interest_index_delta#0", + "maybe_value%0#0", + "principal_amount#1", + "principal_amount_due#0", + "principal_index_delta#0", + "required_amount#0", + "tmp%15#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0", + "principal_amount#1", + "maybe_value%0#0", + "tmp%15#0" + ] + }, + "1482": { + "error": "Not enough funds for the payment", + "op": "assert // Not enough funds for the payment", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0", + "principal_amount#1", + "maybe_value%0#0" + ] + }, + "1483": { + "op": "uncover 3", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "interest_index_delta#0", + "principal_index_delta#0", + "principal_amount#1", + "maybe_value%0#0", + "interest_amount#1" + ] + }, + "1485": { + "op": "+", + "defined_out": [ + "interest_amount#1", + "interest_amount_due#0", + "interest_index_delta#0", + "principal_amount#1", + "principal_amount_due#0", + "principal_index_delta#0", + "required_amount#0", + "tmp%16#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "interest_index_delta#0", + "principal_index_delta#0", + "principal_amount#1", + "tmp%16#0" + ] + }, + "1486": { + "op": "bytec 15 // \"reserved_interest\"", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "interest_index_delta#0", + "principal_index_delta#0", + "principal_amount#1", + "tmp%16#0", + "\"reserved_interest\"" + ] + }, + "1488": { + "op": "swap", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "interest_index_delta#0", + "principal_index_delta#0", + "principal_amount#1", + "\"reserved_interest\"", + "tmp%16#0" + ] + }, + "1489": { + "op": "app_global_put", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "interest_index_delta#0", + "principal_index_delta#0", + "principal_amount#1" + ] + }, + "1490": { + "op": "intc_0 // 0", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "interest_index_delta#0", + "principal_index_delta#0", + "principal_amount#1", + "0" + ] + }, + "1491": { + "op": "bytec 11 // \"reserved_principal\"", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "interest_index_delta#0", + "principal_index_delta#0", + "principal_amount#1", + "0", + "\"reserved_principal\"" + ] + }, + "1493": { + "op": "app_global_get_ex", + "defined_out": [ + "interest_amount#1", + "interest_amount_due#0", + "interest_index_delta#0", + "maybe_exists%5#0", + "maybe_value%5#0", + "principal_amount#1", + "principal_amount_due#0", + "principal_index_delta#0", + "required_amount#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "interest_index_delta#0", + "principal_index_delta#0", + "principal_amount#1", + "maybe_value%5#0", + "maybe_exists%5#0" + ] + }, + "1494": { + "error": "check self.reserved_principal exists", + "op": "assert // check self.reserved_principal exists", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "interest_index_delta#0", + "principal_index_delta#0", + "principal_amount#1", + "maybe_value%5#0" + ] + }, + "1495": { + "op": "+", + "defined_out": [ + "interest_amount#1", + "interest_amount_due#0", + "interest_index_delta#0", + "principal_amount#1", + "principal_amount_due#0", + "principal_index_delta#0", + "required_amount#0", + "tmp%17#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "interest_index_delta#0", + "principal_index_delta#0", + "tmp%17#0" + ] + }, + "1496": { + "op": "bytec 11 // \"reserved_principal\"", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "interest_index_delta#0", + "principal_index_delta#0", + "tmp%17#0", + "\"reserved_principal\"" + ] + }, + "1498": { + "op": "swap", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "interest_index_delta#0", + "principal_index_delta#0", + "\"reserved_principal\"", + "tmp%17#0" + ] + }, + "1499": { + "op": "app_global_put", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "interest_index_delta#0", + "principal_index_delta#0" + ] + }, + "1500": { + "op": "intc_0 // 0", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "interest_index_delta#0", + "principal_index_delta#0", + "0" + ] + }, + "1501": { + "op": "bytec 16 // \"cumulative_interest_index\"", + "defined_out": [ + "\"cumulative_interest_index\"", + "0", + "interest_amount#1", + "interest_amount_due#0", + "interest_index_delta#0", + "principal_amount#1", + "principal_amount_due#0", + "principal_index_delta#0", + "required_amount#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "interest_index_delta#0", + "principal_index_delta#0", + "0", + "\"cumulative_interest_index\"" + ] + }, + "1503": { + "op": "app_global_get_ex", + "defined_out": [ + "interest_amount#1", + "interest_amount_due#0", + "interest_index_delta#0", + "maybe_exists%6#0", + "maybe_value%6#0", + "principal_amount#1", + "principal_amount_due#0", + "principal_index_delta#0", + "required_amount#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "interest_index_delta#0", + "principal_index_delta#0", + "maybe_value%6#0", + "maybe_exists%6#0" + ] + }, + "1504": { + "error": "check self.cumulative_interest_index exists", + "op": "assert // check self.cumulative_interest_index exists", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "interest_index_delta#0", + "principal_index_delta#0", + "maybe_value%6#0" + ] + }, + "1505": { + "op": "uncover 2", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "principal_index_delta#0", + "maybe_value%6#0", + "interest_index_delta#0" + ] + }, + "1507": { + "op": "+", + "defined_out": [ + "interest_amount#1", + "interest_amount_due#0", + "principal_amount#1", + "principal_amount_due#0", + "principal_index_delta#0", + "required_amount#0", + "tmp%18#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "principal_index_delta#0", + "tmp%18#0" + ] + }, + "1508": { + "op": "bytec 16 // \"cumulative_interest_index\"", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "principal_index_delta#0", + "tmp%18#0", + "\"cumulative_interest_index\"" + ] + }, + "1510": { + "op": "swap", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "principal_index_delta#0", + "\"cumulative_interest_index\"", + "tmp%18#0" + ] + }, + "1511": { + "op": "app_global_put", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "principal_index_delta#0" + ] + }, + "1512": { + "op": "intc_0 // 0", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "principal_index_delta#0", + "0" + ] + }, + "1513": { + "op": "bytec 17 // \"cumulative_principal_index\"", + "defined_out": [ + "\"cumulative_principal_index\"", + "0", + "interest_amount#1", + "interest_amount_due#0", + "principal_amount#1", + "principal_amount_due#0", + "principal_index_delta#0", + "required_amount#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "principal_index_delta#0", + "0", + "\"cumulative_principal_index\"" + ] + }, + "1515": { + "op": "app_global_get_ex", + "defined_out": [ + "interest_amount#1", + "interest_amount_due#0", + "maybe_exists%7#0", + "maybe_value%7#0", + "principal_amount#1", + "principal_amount_due#0", + "principal_index_delta#0", + "required_amount#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "principal_index_delta#0", + "maybe_value%7#0", + "maybe_exists%7#0" + ] + }, + "1516": { + "error": "check self.cumulative_principal_index exists", + "op": "assert // check self.cumulative_principal_index exists", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "principal_index_delta#0", + "maybe_value%7#0" + ] + }, + "1517": { + "op": "+", + "defined_out": [ + "interest_amount#1", + "interest_amount_due#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%19#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "tmp%19#0" + ] + }, + "1518": { + "op": "bytec 17 // \"cumulative_principal_index\"", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "tmp%19#0", + "\"cumulative_principal_index\"" + ] + }, + "1520": { + "op": "swap", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "\"cumulative_principal_index\"", + "tmp%19#0" + ] + }, + "1521": { + "op": "app_global_put", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ] + }, + "1522": { + "op": "dig 15", + "defined_out": [ + "entry#0", + "interest_amount#1", + "interest_amount_due#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "entry#0" + ] + }, + "1524": { + "op": "intc_2 // 8", + "defined_out": [ + "8", + "entry#0", + "interest_amount#1", + "interest_amount_due#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "entry#0", + "8" + ] + }, + "1525": { + "op": "getbyte", + "defined_out": [ + "entry#0", + "interest_amount#1", + "interest_amount_due#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%20#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "tmp%20#0" + ] + }, + "1526": { + "op": "pushint 3", + "defined_out": [ + "3", + "entry#0", + "interest_amount#1", + "interest_amount_due#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%20#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "tmp%20#0", + "3" + ] + }, + "1528": { + "op": "==", + "defined_out": [ + "entry#0", + "interest_amount#1", + "interest_amount_due#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%21#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "tmp%21#0" + ] + }, + "1529": { + "op": "bz fund_due_cashflows_else_body@38", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ] + }, + "1532": { + "op": "intc_0 // 0", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "0" + ] + }, + "1533": { + "op": "bytec 6 // \"accrued_interest\"", + "defined_out": [ + "\"accrued_interest\"", + "0", + "entry#0", + "interest_amount#1", + "interest_amount_due#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "0", + "\"accrued_interest\"" + ] + }, + "1535": { + "op": "app_global_get_ex", + "defined_out": [ + "entry#0", + "interest_amount#1", + "interest_amount_due#0", + "maybe_exists%8#0", + "maybe_value%8#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "maybe_value%8#0", + "maybe_exists%8#0" + ] + }, + "1536": { + "error": "check self.accrued_interest exists", + "op": "assert // check self.accrued_interest exists", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "maybe_value%8#0" + ] + }, + "1537": { + "op": "dig 16", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "maybe_value%8#0", + "entry#0" + ] + }, + "1539": { + "callsub": "modules.kernel.ActusKernelModule._entry_interest_segment", + "op": "callsub _entry_interest_segment", + "defined_out": [ + "_entry_interest_segment%0#0", + "entry#0", + "interest_amount#1", + "interest_amount_due#0", + "maybe_value%8#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "maybe_value%8#0", + "_entry_interest_segment%0#0", + "entry#0" + ] + }, + "1542": { + "op": "bury 18", + "defined_out": [ + "_entry_interest_segment%0#0", + "entry#0", + "interest_amount#1", + "interest_amount_due#0", + "maybe_value%8#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "maybe_value%8#0", + "_entry_interest_segment%0#0" + ] + }, + "1544": { + "op": "+", + "defined_out": [ + "entry#0", + "interest_amount#1", + "interest_amount_due#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%22#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "tmp%22#0" + ] + }, + "1545": { + "op": "bytec 6 // \"accrued_interest\"", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "tmp%22#0", + "\"accrued_interest\"" + ] + }, + "1547": { + "op": "swap", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "\"accrued_interest\"", + "tmp%22#0" + ] + }, + "1548": { + "op": "app_global_put", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ] + }, + "1549": { + "block": "fund_due_cashflows_after_if_else@39", + "stack_in": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ], + "callsub": "modules.kernel.ActusKernelModule._is_dynamic_annuity", + "op": "callsub _is_dynamic_annuity", + "defined_out": [ + "tmp%23#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "tmp%23#0" + ] + }, + "1552": { + "op": "bz fund_due_cashflows_if_body@41", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ] + }, + "1555": { + "op": "dig 15", + "defined_out": [ + "entry#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "entry#0" + ] + }, + "1557": { + "op": "intc_2 // 8", + "defined_out": [ + "8", + "entry#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "entry#0", + "8" + ] + }, + "1558": { + "op": "getbyte", + "defined_out": [ + "entry#0", + "tmp%24#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "tmp%24#0" + ] + }, + "1559": { + "op": "pushint 19", + "defined_out": [ + "19", + "entry#0", + "tmp%24#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "tmp%24#0", + "19" + ] + }, + "1561": { + "op": "==", + "defined_out": [ + "entry#0", + "tmp%25#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "tmp%25#0" + ] + }, + "1562": { + "op": "bz fund_due_cashflows_after_if_else@42", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ] + }, + "1565": { + "block": "fund_due_cashflows_if_body@41", + "stack_in": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ], + "op": "dig 15", + "defined_out": [ + "entry#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "entry#0" + ] + }, + "1567": { + "op": "pushint 41", + "defined_out": [ + "41", + "entry#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "entry#0", + "41" + ] + }, + "1569": { + "op": "extract_uint64", + "defined_out": [ + "entry#0", + "values%4#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "values%4#0" + ] + }, + "1570": { + "op": "bytec 14 // \"next_principal_redemption\"", + "defined_out": [ + "\"next_principal_redemption\"", + "entry#0", + "values%4#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "values%4#0", + "\"next_principal_redemption\"" + ] + }, + "1572": { + "op": "swap", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "\"next_principal_redemption\"", + "values%4#0" + ] + }, + "1573": { + "op": "app_global_put", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ] + }, + "1574": { + "block": "fund_due_cashflows_after_if_else@42", + "stack_in": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ], + "op": "bytec_3 // \"outstanding_principal\"", + "defined_out": [ + "\"outstanding_principal\"" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "\"outstanding_principal\"" + ] + }, + "1575": { + "op": "dig 10", + "defined_out": [ + "\"outstanding_principal\"", + "next_outstanding_principal#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "\"outstanding_principal\"", + "next_outstanding_principal#0" + ] + }, + "1577": { + "op": "app_global_put", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ] + }, + "1578": { + "op": "bytec 7 // \"interest_calculation_base\"", + "defined_out": [ + "\"interest_calculation_base\"", + "next_outstanding_principal#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "\"interest_calculation_base\"" + ] + }, + "1580": { + "op": "dig 11", + "defined_out": [ + "\"interest_calculation_base\"", + "next_interest_base#2", + "next_outstanding_principal#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "\"interest_calculation_base\"", + "next_interest_base#2" + ] + }, + "1582": { + "op": "app_global_put", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ] + }, + "1583": { + "op": "intc_0 // 0", + "defined_out": [ + "0", + "next_interest_base#2", + "next_outstanding_principal#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "0" + ] + }, + "1584": { + "op": "bytec_2 // \"event_cursor\"", + "defined_out": [ + "\"event_cursor\"", + "0", + "next_interest_base#2", + "next_outstanding_principal#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "0", + "\"event_cursor\"" + ] + }, + "1585": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%9#0", + "maybe_value%9#0", + "next_interest_base#2", + "next_outstanding_principal#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "maybe_value%9#0", + "maybe_exists%9#0" + ] + }, + "1586": { + "error": "check self.event_cursor exists", + "op": "assert // check self.event_cursor exists", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "maybe_value%9#0" + ] + }, + "1587": { + "op": "intc_1 // 1", + "defined_out": [ + "1", + "maybe_value%9#0", + "next_interest_base#2", + "next_outstanding_principal#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "maybe_value%9#0", + "1" + ] + }, + "1588": { + "op": "+", + "defined_out": [ + "next_interest_base#2", + "next_outstanding_principal#0", + "tmp%26#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "tmp%26#0" + ] + }, + "1589": { + "op": "bytec_2 // \"event_cursor\"", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "tmp%26#0", + "\"event_cursor\"" + ] + }, + "1590": { + "op": "swap", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "\"event_cursor\"", + "tmp%26#0" + ] + }, + "1591": { + "op": "app_global_put", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ] + }, + "1592": { + "op": "dig 15", + "defined_out": [ + "entry#0", + "next_interest_base#2", + "next_outstanding_principal#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "entry#0" + ] + }, + "1594": { + "op": "extract 8 1", + "defined_out": [ + "aggregate%extract%10#0", + "entry#0", + "next_interest_base#2", + "next_outstanding_principal#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "aggregate%extract%10#0" + ] + }, + "1597": { + "op": "pushbytes 0x13", + "defined_out": [ + "0x13", + "aggregate%extract%10#0", + "entry#0", + "next_interest_base#2", + "next_outstanding_principal#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "aggregate%extract%10#0", + "0x13" + ] + }, + "1600": { + "op": "b==", + "defined_out": [ + "entry#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "tmp%27#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "tmp%27#0" + ] + }, + "1601": { + "op": "bz fund_due_cashflows_after_if_else@45", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ] + }, + "1604": { + "op": "intc_0 // 0", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "0" + ] + }, + "1605": { + "op": "bytec_3 // \"outstanding_principal\"", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "0", + "\"outstanding_principal\"" + ] + }, + "1606": { + "op": "app_global_get_ex", + "defined_out": [ + "entry#0", + "maybe_exists%10#0", + "maybe_value%10#0", + "next_interest_base#2", + "next_outstanding_principal#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "maybe_value%10#0", + "maybe_exists%10#0" + ] + }, + "1607": { + "error": "check self.outstanding_principal exists", + "op": "assert // check self.outstanding_principal exists", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "maybe_value%10#0" + ] + }, + "1608": { + "op": "bnz fund_due_cashflows_after_if_else@45", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ] + }, + "1611": { + "op": "bytec_1 // \"status\"", + "defined_out": [ + "\"status\"", + "entry#0", + "next_interest_base#2", + "next_outstanding_principal#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "\"status\"" + ] + }, + "1612": { + "op": "pushint 200", + "defined_out": [ + "\"status\"", + "200", + "entry#0", + "next_interest_base#2", + "next_outstanding_principal#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "\"status\"", + "200" + ] + }, + "1615": { + "op": "app_global_put", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ] + }, + "1616": { + "op": "bytec 7 // \"interest_calculation_base\"", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "\"interest_calculation_base\"" + ] + }, + "1618": { + "op": "intc_0 // 0", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "\"interest_calculation_base\"", + "0" + ] + }, + "1619": { + "op": "app_global_put", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ] + }, + "1620": { + "block": "fund_due_cashflows_after_if_else@45", + "stack_in": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ], + "op": "dig 15", + "defined_out": [ + "entry#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "entry#0" + ] + }, + "1622": { + "op": "dig 7", + "defined_out": [ + "entry#0", + "required_amount#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "entry#0", + "required_amount#0" + ] + }, + "1624": { + "op": "dup", + "defined_out": [ + "entry#0", + "required_amount#0", + "required_amount#0 (copy)" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "entry#0", + "required_amount#0 (copy)", + "required_amount#0" + ] + }, + "1625": { + "callsub": "modules.kernel.ActusKernelModule._emit_execution_event", + "op": "callsub _emit_execution_event", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "entry#0" + ] + }, + "1628": { + "op": "pop", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ] + }, + "1629": { + "op": "dig 1", + "defined_out": [ + "entry#0", + "funded_interest#0", + "required_amount#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "funded_interest#0" + ] + }, + "1631": { + "op": "dig 14", + "defined_out": [ + "entry#0", + "funded_interest#0", + "interest_amount#1", + "required_amount#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "funded_interest#0", + "interest_amount#1" + ] + }, + "1633": { + "op": "+", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "funded_interest#0" + ] + }, + "1634": { + "op": "bury 2", + "defined_out": [ + "entry#0", + "funded_interest#0", + "interest_amount#1", + "required_amount#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ] + }, + "1636": { + "op": "dup", + "defined_out": [ + "entry#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "required_amount#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "funded_principal#0" + ] + }, + "1637": { + "op": "dig 9", + "defined_out": [ + "entry#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "principal_amount#1", + "required_amount#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "funded_principal#0", + "principal_amount#1" + ] + }, + "1639": { + "op": "+", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "funded_principal#0" + ] + }, + "1640": { + "op": "bury 1", + "defined_out": [ + "entry#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "principal_amount#1", + "required_amount#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ] + }, + "1642": { + "op": "dig 2", + "defined_out": [ + "entry#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "principal_amount#1", + "processed_events#0", + "required_amount#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "processed_events#0" + ] + }, + "1644": { + "op": "intc_1 // 1", + "defined_out": [ + "1", + "entry#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "principal_amount#1", + "processed_events#0", + "required_amount#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "processed_events#0", + "1" + ] + }, + "1645": { + "op": "+", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "processed_events#0" + ] + }, + "1646": { + "op": "bury 3", + "defined_out": [ + "entry#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "principal_amount#1", + "processed_events#0", + "required_amount#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ] + }, + "1648": { + "op": "b fund_due_cashflows_while_top@2" + }, + "1651": { + "block": "fund_due_cashflows_else_body@38", + "stack_in": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ], + "op": "bytec 6 // \"accrued_interest\"", + "defined_out": [ + "\"accrued_interest\"" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "\"accrued_interest\"" + ] + }, + "1653": { + "op": "intc_0 // 0", + "defined_out": [ + "\"accrued_interest\"", + "0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "\"accrued_interest\"", + "0" + ] + }, + "1654": { + "op": "app_global_put", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ] + }, + "1655": { + "op": "b fund_due_cashflows_after_if_else@39" + }, + "1658": { + "block": "fund_due_cashflows_if_body@27", + "stack_in": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ], + "op": "dig 15", + "defined_out": [ + "entry#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "entry#0" + ] + }, + "1660": { + "op": "intc_2 // 8", + "defined_out": [ + "8", + "entry#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "entry#0", + "8" + ] + }, + "1661": { + "op": "getbyte", + "defined_out": [ + "entry#0", + "event_type#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "event_type#0" + ] + }, + "1662": { + "op": "dup", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "event_type#0", + "event_type#0" + ] + }, + "1663": { + "op": "bury 16", + "defined_out": [ + "entry#0", + "event_type#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "event_type#0" + ] + }, + "1665": { + "op": "pushint 3", + "defined_out": [ + "3", + "entry#0", + "event_type#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "event_type#0", + "3" + ] + }, + "1667": { + "op": "==", + "defined_out": [ + "entry#0", + "event_type#0", + "tmp%5#1" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "tmp%5#1" + ] + }, + "1668": { + "op": "bz fund_due_cashflows_else_body@29", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ] + }, + "1671": { + "op": "intc_0 // 0", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "0" + ] + }, + "1672": { + "op": "bytec_3 // \"outstanding_principal\"", + "defined_out": [ + "\"outstanding_principal\"", + "0", + "entry#0", + "event_type#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "0", + "\"outstanding_principal\"" + ] + }, + "1673": { + "op": "app_global_get_ex", + "defined_out": [ + "entry#0", + "event_type#0", + "maybe_exists%1#0", + "maybe_value%1#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "maybe_value%1#0", + "maybe_exists%1#0" + ] + }, + "1674": { + "error": "check self.outstanding_principal exists", + "op": "assert // check self.outstanding_principal exists", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "maybe_value%1#0" + ] + }, + "1675": { + "op": "dig 8", + "defined_out": [ + "entry#0", + "event_type#0", + "maybe_value%1#0", + "principal_amount_due#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "maybe_value%1#0", + "principal_amount_due#0" + ] + }, + "1677": { + "op": "-", + "defined_out": [ + "entry#0", + "event_type#0", + "next_outstanding_principal#0", + "principal_amount_due#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "next_outstanding_principal#0" + ] + }, + "1678": { + "op": "dup", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "next_outstanding_principal#0", + "next_outstanding_principal#0" + ] + }, + "1679": { + "op": "bury 11", + "defined_out": [ + "entry#0", + "event_type#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount_due#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "next_interest_base#2" + ] + }, + "1681": { + "op": "bury 11", + "defined_out": [ + "entry#0", + "event_type#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount_due#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ] + }, + "1683": { + "op": "b fund_due_cashflows_after_if_else@36" + }, + "1686": { + "block": "fund_due_cashflows_else_body@29", + "stack_in": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ], + "op": "dig 14", + "defined_out": [ + "event_type#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "event_type#0" + ] + }, + "1688": { + "op": "intc_2 // 8", + "defined_out": [ + "8", + "event_type#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "event_type#0", + "8" + ] + }, + "1689": { + "op": "==", + "defined_out": [ + "event_type#0", + "tmp%7#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "tmp%7#0" + ] + }, + "1690": { + "op": "bz fund_due_cashflows_else_body@31", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ] + }, + "1693": { + "op": "intc_0 // 0", + "defined_out": [ + "0", + "event_type#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "0" + ] + }, + "1694": { + "op": "bytec_3 // \"outstanding_principal\"", + "defined_out": [ + "\"outstanding_principal\"", + "0", + "event_type#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "0", + "\"outstanding_principal\"" + ] + }, + "1695": { + "op": "app_global_get_ex", + "defined_out": [ + "event_type#0", + "maybe_exists%2#0", + "next_outstanding_principal#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "next_outstanding_principal#0", + "maybe_exists%2#0" + ] + }, + "1696": { + "op": "swap", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "maybe_exists%2#0", + "next_outstanding_principal#0" + ] + }, + "1697": { + "op": "bury 11", + "defined_out": [ + "event_type#0", + "maybe_exists%2#0", + "next_outstanding_principal#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "maybe_exists%2#0" + ] + }, + "1699": { + "error": "check self.outstanding_principal exists", + "op": "assert // check self.outstanding_principal exists", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ] + }, + "1700": { + "op": "intc_0 // 0", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "0" + ] + }, + "1701": { + "op": "bytec 7 // \"interest_calculation_base\"", + "defined_out": [ + "\"interest_calculation_base\"", + "0", + "event_type#0", + "next_outstanding_principal#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "0", + "\"interest_calculation_base\"" + ] + }, + "1703": { + "op": "app_global_get_ex", + "defined_out": [ + "event_type#0", + "maybe_exists%3#0", + "next_interest_base#2", + "next_outstanding_principal#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "next_interest_base#2", + "maybe_exists%3#0" + ] + }, + "1704": { + "op": "swap", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "maybe_exists%3#0", + "next_interest_base#2" + ] + }, + "1705": { + "op": "bury 12", + "defined_out": [ + "event_type#0", + "maybe_exists%3#0", + "next_interest_base#2", + "next_outstanding_principal#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "maybe_exists%3#0" + ] + }, + "1707": { + "error": "check self.interest_calculation_base exists", + "op": "assert // check self.interest_calculation_base exists", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ] + }, + "1708": { + "op": "b fund_due_cashflows_after_if_else@36" + }, + "1711": { + "block": "fund_due_cashflows_else_body@31", + "stack_in": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ], + "op": "dig 14", + "defined_out": [ + "event_type#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "event_type#0" + ] + }, + "1713": { + "op": "pushint 19", + "defined_out": [ + "19", + "event_type#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "event_type#0", + "19" + ] + }, + "1715": { + "op": "==", + "defined_out": [ + "event_type#0", + "tmp%8#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "tmp%8#0" + ] + }, + "1716": { + "op": "bnz fund_due_cashflows_if_body@32", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ] + }, + "1719": { + "op": "dig 9", + "defined_out": [ + "event_type#0", + "next_interest_base#2" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "next_interest_base#2" + ] + }, + "1721": { + "op": "bury 11", + "defined_out": [ + "event_type#0", + "next_interest_base#2" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ] + }, + "1723": { + "op": "b fund_due_cashflows_after_if_else@36" + }, + "1726": { + "block": "fund_due_cashflows_if_body@32", + "stack_in": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ], + "op": "intc_0 // 0", + "defined_out": [ + "next_outstanding_principal#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "next_outstanding_principal#0" + ] + }, + "1727": { + "op": "bury 10", + "defined_out": [ + "next_outstanding_principal#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ] + }, + "1729": { + "op": "intc_0 // 0", + "defined_out": [ + "next_interest_base#2", + "next_outstanding_principal#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "next_interest_base#2" + ] + }, + "1730": { + "op": "bury 11", + "defined_out": [ + "next_interest_base#2", + "next_outstanding_principal#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ] + }, + "1732": { + "op": "b fund_due_cashflows_after_if_else@36" + }, + "1735": { + "block": "fund_due_cashflows_after_if_else@17", + "stack_in": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ], + "callsub": "modules.kernel.ActusKernelModule._is_dynamic_annuity", + "op": "callsub _is_dynamic_annuity", + "defined_out": [ + "tmp%3#2" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "tmp%3#2" + ] + }, + "1738": { + "op": "bz fund_due_cashflows_after_if_else@25", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ] + }, + "1741": { + "op": "dig 14", + "defined_out": [ + "event_type#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "event_type#0" + ] + }, + "1743": { + "op": "pushint 19", + "defined_out": [ + "19", + "event_type#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "event_type#0", + "19" + ] + }, + "1745": { + "op": "==", + "defined_out": [ + "event_type#0", + "tmp%4#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "tmp%4#0" + ] + }, + "1746": { + "op": "bz fund_due_cashflows_after_if_else@20", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ] + }, + "1749": { + "op": "intc_0 // 0", + "defined_out": [ + "0", + "event_type#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "0" + ] + }, + "1750": { + "op": "bytec_3 // \"outstanding_principal\"", + "defined_out": [ + "\"outstanding_principal\"", + "0", + "event_type#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "0", + "\"outstanding_principal\"" + ] + }, + "1751": { + "op": "app_global_get_ex", + "defined_out": [ + "event_type#0", + "maybe_exists%0#0", + "maybe_value%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "1752": { + "error": "check self.outstanding_principal exists", + "op": "assert // check self.outstanding_principal exists", + "defined_out": [ + "event_type#0", + "principal_amount_due#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "principal_amount_due#0" + ] + }, + "1753": { + "op": "bury 8", + "defined_out": [ + "event_type#0", + "principal_amount_due#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ] + }, + "1755": { + "op": "b fund_due_cashflows_after_inlined_modules.kernel.ActusKernelModule._entry_principal_amount@26" + }, + "1758": { + "block": "fund_due_cashflows_after_if_else@20", + "stack_in": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ], + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "0" + ] + }, + "1759": { + "op": "bytec 6 // \"accrued_interest\"", + "defined_out": [ + "\"accrued_interest\"", + "0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "0", + "\"accrued_interest\"" + ] + }, + "1761": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%1#0", + "maybe_value%1#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "maybe_value%1#0", + "maybe_exists%1#0" + ] + }, + "1762": { + "error": "check self.accrued_interest exists", + "op": "assert // check self.accrued_interest exists", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "maybe_value%1#0" + ] + }, + "1763": { + "op": "dig 16", + "defined_out": [ + "entry#0", + "maybe_value%1#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "maybe_value%1#0", + "entry#0" + ] + }, + "1765": { + "callsub": "modules.kernel.ActusKernelModule._entry_interest_segment", + "op": "callsub _entry_interest_segment", + "defined_out": [ + "_entry_interest_segment%0#0", + "entry#0", + "maybe_value%1#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "maybe_value%1#0", + "_entry_interest_segment%0#0", + "entry#0" + ] + }, + "1768": { + "op": "bury 18", + "defined_out": [ + "_entry_interest_segment%0#0", + "entry#0", + "maybe_value%1#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "maybe_value%1#0", + "_entry_interest_segment%0#0" + ] + }, + "1770": { + "op": "+", + "defined_out": [ + "entry#0", + "interest_due#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "interest_due#0" + ] + }, + "1771": { + "op": "dup", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "interest_due#0", + "interest_due#0" + ] + }, + "1772": { + "op": "bury 13", + "defined_out": [ + "entry#0", + "interest_due#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "interest_due#0" + ] + }, + "1774": { + "op": "intc_0 // 0", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "interest_due#0", + "0" + ] + }, + "1775": { + "op": "bytec 14 // \"next_principal_redemption\"", + "defined_out": [ + "\"next_principal_redemption\"", + "0", + "entry#0", + "interest_due#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "interest_due#0", + "0", + "\"next_principal_redemption\"" + ] + }, + "1777": { + "op": "app_global_get_ex", + "defined_out": [ + "entry#0", + "interest_due#0", + "maybe_exists%2#0", + "maybe_value%2#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "interest_due#0", + "maybe_value%2#0", + "maybe_exists%2#0" + ] + }, + "1778": { + "error": "check self.next_principal_redemption exists", + "op": "assert // check self.next_principal_redemption exists", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "interest_due#0", + "maybe_value%2#0" + ] + }, + "1779": { + "op": ">=", + "defined_out": [ + "entry#0", + "interest_due#0", + "tmp%6#2" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "tmp%6#2" + ] + }, + "1780": { + "op": "bz fund_due_cashflows_after_if_else@22", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ] + }, + "1783": { + "op": "intc_0 // 0", + "defined_out": [ + "entry#0", + "interest_due#0", + "principal_amount_due#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "principal_amount_due#0" + ] + }, + "1784": { + "op": "bury 8", + "defined_out": [ + "entry#0", + "interest_due#0", + "principal_amount_due#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ] + }, + "1786": { + "op": "b fund_due_cashflows_after_inlined_modules.kernel.ActusKernelModule._entry_principal_amount@26" + }, + "1789": { + "block": "fund_due_cashflows_after_if_else@22", + "stack_in": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ], + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "0" + ] + }, + "1790": { + "op": "bytec 14 // \"next_principal_redemption\"", + "defined_out": [ + "\"next_principal_redemption\"", + "0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "0", + "\"next_principal_redemption\"" + ] + }, + "1792": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%3#0", + "maybe_value%3#1" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "maybe_value%3#1", + "maybe_exists%3#0" + ] + }, + "1793": { + "error": "check self.next_principal_redemption exists", + "op": "assert // check self.next_principal_redemption exists", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "maybe_value%3#1" + ] + }, + "1794": { + "op": "dig 12", + "defined_out": [ + "interest_due#0", + "maybe_value%3#1" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "maybe_value%3#1", + "interest_due#0" + ] + }, + "1796": { + "op": "-", + "defined_out": [ + "interest_due#0", + "principal_amount#1" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "principal_amount#1" + ] + }, + "1797": { + "op": "dup", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "principal_amount#1", + "principal_amount#1" + ] + }, + "1798": { + "op": "bury 10", + "defined_out": [ + "interest_due#0", + "principal_amount#1" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "principal_amount#1" + ] + }, + "1800": { + "op": "intc_0 // 0", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "principal_amount#1", + "0" + ] + }, + "1801": { + "op": "bytec_3 // \"outstanding_principal\"", + "defined_out": [ + "\"outstanding_principal\"", + "0", + "interest_due#0", + "principal_amount#1" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "principal_amount#1", + "0", + "\"outstanding_principal\"" + ] + }, + "1802": { + "op": "app_global_get_ex", + "defined_out": [ + "interest_due#0", + "maybe_exists%4#1", + "maybe_value%4#1", + "principal_amount#1" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "principal_amount#1", + "maybe_value%4#1", + "maybe_exists%4#1" + ] + }, + "1803": { + "error": "check self.outstanding_principal exists", + "op": "assert // check self.outstanding_principal exists", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "principal_amount#1", + "maybe_value%4#1" + ] + }, + "1804": { + "op": ">", + "defined_out": [ + "interest_due#0", + "principal_amount#1", + "tmp%8#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "tmp%8#0" + ] + }, + "1805": { + "op": "bz fund_due_cashflows_after_if_else@24", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ] + }, + "1808": { + "op": "intc_0 // 0", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "0" + ] + }, + "1809": { + "op": "bytec_3 // \"outstanding_principal\"", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "0", + "\"outstanding_principal\"" + ] + }, + "1810": { + "op": "app_global_get_ex", + "defined_out": [ + "interest_due#0", + "maybe_exists%5#0", + "maybe_value%5#0", + "principal_amount#1" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "maybe_value%5#0", + "maybe_exists%5#0" + ] + }, + "1811": { + "error": "check self.outstanding_principal exists", + "op": "assert // check self.outstanding_principal exists", + "defined_out": [ + "interest_due#0", + "principal_amount#1", + "principal_amount_due#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "principal_amount_due#0" + ] + }, + "1812": { + "op": "bury 8", + "defined_out": [ + "interest_due#0", + "principal_amount#1", + "principal_amount_due#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ] + }, + "1814": { + "op": "b fund_due_cashflows_after_inlined_modules.kernel.ActusKernelModule._entry_principal_amount@26" + }, + "1817": { + "block": "fund_due_cashflows_after_if_else@24", + "stack_in": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ], + "op": "dig 8", + "defined_out": [ + "principal_amount_due#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "principal_amount_due#0" + ] + }, + "1819": { + "op": "bury 8", + "defined_out": [ + "principal_amount_due#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ] + }, + "1821": { + "op": "b fund_due_cashflows_after_inlined_modules.kernel.ActusKernelModule._entry_principal_amount@26" + }, + "1824": { + "block": "fund_due_cashflows_after_if_else@25", + "stack_in": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ], + "op": "dig 15", + "defined_out": [ + "entry#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "entry#0" + ] + }, + "1826": { + "op": "pushint 49", + "defined_out": [ + "49", + "entry#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "entry#0", + "49" + ] + }, + "1828": { + "op": "extract_uint64", + "defined_out": [ + "entry#0", + "values%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "values%0#0" + ] + }, + "1829": { + "op": "intc_0 // 0", + "defined_out": [ + "0", + "entry#0", + "values%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "values%0#0", + "0" + ] + }, + "1830": { + "op": "bytec_3 // \"outstanding_principal\"", + "defined_out": [ + "\"outstanding_principal\"", + "0", + "entry#0", + "values%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "values%0#0", + "0", + "\"outstanding_principal\"" + ] + }, + "1831": { + "op": "app_global_get_ex", + "defined_out": [ + "entry#0", + "maybe_exists%6#0", + "maybe_value%6#0", + "values%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "values%0#0", + "maybe_value%6#0", + "maybe_exists%6#0" + ] + }, + "1832": { + "error": "check self.outstanding_principal exists", + "op": "assert // check self.outstanding_principal exists", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "values%0#0", + "maybe_value%6#0" + ] + }, + "1833": { + "op": "dup2", + "defined_out": [ + "entry#0", + "maybe_value%6#0", + "maybe_value%6#0 (copy)", + "values%0#0", + "values%0#0 (copy)" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "values%0#0", + "maybe_value%6#0", + "values%0#0 (copy)", + "maybe_value%6#0 (copy)" + ] + }, + "1834": { + "op": "<=", + "defined_out": [ + "entry#0", + "maybe_value%6#0", + "tmp%9#1", + "values%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "values%0#0", + "maybe_value%6#0", + "tmp%9#1" + ] + }, + "1835": { + "error": "Invalid ACTUS configuration", + "op": "assert // Invalid ACTUS configuration", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "values%0#0", + "maybe_value%6#0" + ] + }, + "1836": { + "op": "swap", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "maybe_value%6#0", + "values%0#0" + ] + }, + "1837": { + "op": "-", + "defined_out": [ + "entry#0", + "principal_amount_due#0", + "values%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "principal_amount_due#0" + ] + }, + "1838": { + "op": "bury 8", + "defined_out": [ + "entry#0", + "principal_amount_due#0", + "values%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ] + }, + "1840": { + "op": "b fund_due_cashflows_after_inlined_modules.kernel.ActusKernelModule._entry_principal_amount@26" + }, + "1843": { + "block": "fund_due_cashflows_after_if_else@13", + "stack_in": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ], + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "0" + ] + }, + "1844": { + "op": "bytec 6 // \"accrued_interest\"", + "defined_out": [ + "\"accrued_interest\"", + "0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "0", + "\"accrued_interest\"" + ] + }, + "1846": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "1847": { + "error": "check self.accrued_interest exists", + "op": "assert // check self.accrued_interest exists", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "maybe_value%0#0" + ] + }, + "1848": { + "op": "dig 16", + "defined_out": [ + "entry#0", + "maybe_value%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "maybe_value%0#0", + "entry#0" + ] + }, + "1850": { + "callsub": "modules.kernel.ActusKernelModule._entry_interest_segment", + "op": "callsub _entry_interest_segment", + "defined_out": [ + "_entry_interest_segment%0#0", + "entry#0", + "maybe_value%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "maybe_value%0#0", + "_entry_interest_segment%0#0", + "entry#0" + ] + }, + "1853": { + "op": "bury 18", + "defined_out": [ + "_entry_interest_segment%0#0", + "entry#0", + "maybe_value%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "maybe_value%0#0", + "_entry_interest_segment%0#0" + ] + }, + "1855": { + "op": "+", + "defined_out": [ + "entry#0", + "interest_amount_due#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount_due#0" + ] + }, + "1856": { + "op": "bury 13", + "defined_out": [ + "entry#0", + "interest_amount_due#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ] + }, + "1858": { + "op": "b fund_due_cashflows_after_inlined_modules.kernel.ActusKernelModule._entry_interest_amount@14" + }, + "1861": { + "block": "fund_due_cashflows_after_while@9", + "stack_in": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ], + "op": "dig 2", + "defined_out": [ + "processed_events#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "processed_events#0" + ] + }, + "1863": { + "op": "dup", + "defined_out": [ + "processed_events#0", + "processed_events#0 (copy)" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "processed_events#0", + "processed_events#0 (copy)" + ] + }, + "1864": { + "error": "No due cashflow to pay", + "op": "assert // No due cashflow to pay", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "processed_events#0" + ] + }, + "1865": { + "op": "dig 2", + "defined_out": [ + "funded_interest#0", + "processed_events#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "processed_events#0", + "funded_interest#0" + ] + }, + "1867": { + "op": "dup", + "defined_out": [ + "funded_interest#0", + "funded_interest#0 (copy)", + "processed_events#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "processed_events#0", + "funded_interest#0", + "funded_interest#0 (copy)" + ] + }, + "1868": { + "op": "dig 3", + "defined_out": [ + "funded_interest#0", + "funded_interest#0 (copy)", + "funded_principal#0", + "processed_events#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "processed_events#0", + "funded_interest#0", + "funded_interest#0 (copy)", + "funded_principal#0" + ] + }, + "1870": { + "op": "dup", + "defined_out": [ + "funded_interest#0", + "funded_interest#0 (copy)", + "funded_principal#0", + "funded_principal#0 (copy)", + "processed_events#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "processed_events#0", + "funded_interest#0", + "funded_interest#0 (copy)", + "funded_principal#0 (copy)", + "funded_principal#0 (copy)" + ] + }, + "1871": { + "op": "cover 3", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "processed_events#0", + "funded_principal#0", + "funded_interest#0", + "funded_interest#0 (copy)", + "funded_principal#0 (copy)" + ] + }, + "1873": { + "op": "+", + "defined_out": [ + "funded_interest#0", + "funded_principal#0", + "processed_events#0", + "tmp%11#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "processed_events#0", + "funded_principal#0", + "funded_interest#0", + "tmp%11#0" + ] + }, + "1874": { + "op": "global LatestTimestamp", + "defined_out": [ + "funded_interest#0", + "funded_principal#0", + "processed_events#0", + "tmp%11#0", + "tmp%12#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "processed_events#0", + "funded_principal#0", + "funded_interest#0", + "tmp%11#0", + "tmp%12#0" + ] + }, + "1876": { + "op": "uncover 2", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "processed_events#0", + "funded_principal#0", + "tmp%11#0", + "tmp%12#0", + "funded_interest#0" + ] + }, + "1878": { + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%0#0", + "funded_interest#0", + "funded_principal#0", + "processed_events#0", + "tmp%11#0", + "tmp%12#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "processed_events#0", + "funded_principal#0", + "tmp%11#0", + "tmp%12#0", + "aggregate%val_as_bytes%0#0" + ] + }, + "1879": { + "op": "uncover 3", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "processed_events#0", + "tmp%11#0", + "tmp%12#0", + "aggregate%val_as_bytes%0#0", + "funded_principal#0" + ] + }, + "1881": { + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%0#0", + "aggregate%val_as_bytes%1#0", + "funded_interest#0", + "funded_principal#0", + "processed_events#0", + "tmp%11#0", + "tmp%12#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "processed_events#0", + "tmp%11#0", + "tmp%12#0", + "aggregate%val_as_bytes%0#0", + "aggregate%val_as_bytes%1#0" + ] + }, + "1882": { + "op": "concat", + "defined_out": [ + "aggregate%head%1#0", + "funded_interest#0", + "funded_principal#0", + "processed_events#0", + "tmp%11#0", + "tmp%12#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "processed_events#0", + "tmp%11#0", + "tmp%12#0", + "aggregate%head%1#0" + ] + }, + "1883": { + "op": "uncover 2", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "processed_events#0", + "tmp%12#0", + "aggregate%head%1#0", + "tmp%11#0" + ] + }, + "1885": { + "op": "itob", + "defined_out": [ + "aggregate%head%1#0", + "aggregate%val_as_bytes%2#0", + "funded_interest#0", + "funded_principal#0", + "processed_events#0", + "tmp%12#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "processed_events#0", + "tmp%12#0", + "aggregate%head%1#0", + "aggregate%val_as_bytes%2#0" + ] + }, + "1886": { + "op": "concat", + "defined_out": [ + "aggregate%head%2#0", + "funded_interest#0", + "funded_principal#0", + "processed_events#0", + "tmp%12#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "processed_events#0", + "tmp%12#0", + "aggregate%head%2#0" + ] + }, + "1887": { + "op": "uncover 2", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "tmp%12#0", + "aggregate%head%2#0", + "processed_events#0" + ] + }, + "1889": { + "op": "itob", + "defined_out": [ + "aggregate%head%2#0", + "aggregate%val_as_bytes%3#0", + "funded_interest#0", + "funded_principal#0", + "processed_events#0", + "tmp%12#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "tmp%12#0", + "aggregate%head%2#0", + "aggregate%val_as_bytes%3#0" + ] + }, + "1890": { + "op": "concat", + "defined_out": [ + "aggregate%head%3#0", + "funded_interest#0", + "funded_principal#0", + "processed_events#0", + "tmp%12#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "tmp%12#0", + "aggregate%head%3#0" + ] + }, + "1891": { + "op": "swap", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "aggregate%head%3#0", + "tmp%12#0" + ] + }, + "1892": { + "op": "itob", + "defined_out": [ + "aggregate%head%3#0", + "aggregate%val_as_bytes%4#0", + "funded_interest#0", + "funded_principal#0", + "processed_events#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "aggregate%head%3#0", + "aggregate%val_as_bytes%4#0" + ] + }, + "1893": { + "op": "concat", + "defined_out": [ + "aggregate%head%4#0", + "funded_interest#0", + "funded_principal#0", + "processed_events#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "aggregate%head%4#0" + ] + }, + "1894": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "aggregate%head%4#0", + "funded_interest#0", + "funded_principal#0", + "processed_events#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "aggregate%head%4#0", + "0x151f7c75" + ] + }, + "1895": { + "op": "swap", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "0x151f7c75", + "aggregate%head%4#0" + ] + }, + "1896": { + "op": "concat", + "defined_out": [ + "funded_interest#0", + "funded_principal#0", + "processed_events#0", + "tmp%3#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "tmp%3#0" + ] + }, + "1897": { + "op": "log", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ] + }, + "1898": { + "op": "intc_1 // 1", + "defined_out": [ + "1", + "funded_interest#0", + "funded_principal#0", + "processed_events#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "1" + ] + }, + "1899": { + "op": "return", + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ] + }, + "1900": { + "block": "fund_due_cashflows_bool_false@51", + "stack_in": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0" + ], + "op": "intc_0 // 0", + "defined_out": [ + "or_result%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_principal#0", + "or_result%0#0" + ] + }, + "1901": { + "op": "b fund_due_cashflows_bool_merge@52" + }, + "1904": { + "subroutine": "modules.payment_agent.PaymentAgent.claim_due_cashflows[routing]", + "params": {}, + "block": "claim_due_cashflows", + "stack_in": [], + "op": "pushbytes \"\"", + "stack_out": [ + "interest_amount#0" + ] + }, + "1906": { + "op": "dupn 2", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0" + ] + }, + "1908": { + "op": "txna ApplicationArgs 1" + }, + "1911": { + "op": "dupn 2", + "defined_out": [ + "holding_address#0", + "holding_address#0 (copy)" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "holding_address#0", + "holding_address#0 (copy)" + ] + }, + "1913": { + "op": "len", + "defined_out": [ + "holding_address#0", + "len%0#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "holding_address#0", + "len%0#0" + ] + }, + "1914": { + "op": "intc_3 // 32", + "defined_out": [ + "32", + "holding_address#0", + "len%0#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "holding_address#0", + "len%0#0", + "32" + ] + }, + "1915": { + "op": "==", + "defined_out": [ + "eq%0#0", + "holding_address#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "holding_address#0", + "eq%0#0" + ] + }, + "1916": { + "error": "invalid number of bytes for arc4.static_array", + "op": "assert // invalid number of bytes for arc4.static_array", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "holding_address#0" + ] + }, + "1917": { + "op": "txna ApplicationArgs 2", + "defined_out": [ + "holding_address#0", + "tmp%2#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "holding_address#0", + "tmp%2#0" + ] + }, + "1920": { + "op": "dup", + "defined_out": [ + "holding_address#0", + "tmp%2#0", + "tmp%2#0 (copy)" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "holding_address#0", + "tmp%2#0", + "tmp%2#0 (copy)" + ] + }, + "1921": { + "op": "intc_0 // 0", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "holding_address#0", + "tmp%2#0", + "tmp%2#0 (copy)", + "0" + ] + }, + "1922": { + "error": "invalid array length header", + "op": "extract_uint16 // on error: invalid array length header", + "defined_out": [ + "aggregate%array_length%0#0", + "holding_address#0", + "tmp%2#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "holding_address#0", + "tmp%2#0", + "aggregate%array_length%0#0" + ] + }, + "1923": { + "op": "pushint 2", + "defined_out": [ + "2", + "aggregate%array_length%0#0", + "holding_address#0", + "tmp%2#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "holding_address#0", + "tmp%2#0", + "aggregate%array_length%0#0", + "2" + ] + }, + "1925": { + "op": "+", + "defined_out": [ + "add%0#0", + "holding_address#0", + "tmp%2#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "holding_address#0", + "tmp%2#0", + "add%0#0" + ] + }, + "1926": { + "op": "dig 1", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "holding_address#0", + "tmp%2#0", + "add%0#0", + "tmp%2#0 (copy)" + ] + }, + "1928": { + "op": "len", + "defined_out": [ + "add%0#0", + "holding_address#0", + "len%1#0", + "tmp%2#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "holding_address#0", + "tmp%2#0", + "add%0#0", + "len%1#0" + ] + }, + "1929": { + "op": "==", + "defined_out": [ + "eq%1#0", + "holding_address#0", + "tmp%2#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "holding_address#0", + "tmp%2#0", + "eq%1#0" + ] + }, + "1930": { + "error": "invalid number of bytes for arc4.dynamic_array", + "op": "assert // invalid number of bytes for arc4.dynamic_array", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "holding_address#0", + "tmp%2#0" + ] + }, + "1931": { + "op": "extract 2 0", + "defined_out": [ + "holding_address#0", + "payment_info#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "holding_address#0", + "payment_info#0" + ] + }, + "1934": { + "op": "swap", + "defined_out": [ + "holding_address#0", + "payment_info#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "holding_address#0" + ] + }, + "1935": { + "op": "intc_0 // 0", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "holding_address#0", + "0" + ] + }, + "1936": { + "op": "bytec_1 // \"status\"", + "defined_out": [ + "\"status\"", + "0", + "holding_address#0", + "payment_info#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "holding_address#0", + "0", + "\"status\"" + ] + }, + "1937": { + "op": "app_global_get_ex", + "defined_out": [ + "holding_address#0", + "maybe_exists%0#0", + "maybe_value%0#0", + "payment_info#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "holding_address#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "1938": { + "error": "check self.status exists", + "op": "assert // check self.status exists", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "holding_address#0", + "maybe_value%0#0" + ] + }, + "1939": { + "error": "D-ASA not configured", + "op": "assert // D-ASA not configured", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "holding_address#0" + ] + }, + "1940": { + "op": "bytec 8 // 0x52234163636f756e7423", + "defined_out": [ + "0x52234163636f756e7423", + "holding_address#0", + "payment_info#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "holding_address#0", + "0x52234163636f756e7423" + ] + }, + "1942": { + "op": "swap", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "0x52234163636f756e7423", + "holding_address#0" + ] + }, + "1943": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%0#4", + "holding_address#0", + "payment_info#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4" + ] + }, + "1944": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%0#4", + "holding_address#0", + "payment_info#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4" + ] + }, + "1945": { + "op": "box_len", + "defined_out": [ + "_%0#0", + "box_prefixed_key%0#4", + "holding_address#0", + "maybe_exists%0#0", + "payment_info#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "_%0#0", + "maybe_exists%0#0" + ] + }, + "1946": { + "op": "bury 1", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "maybe_exists%0#0" + ] + }, + "1948": { + "error": "Invalid account holding address", + "op": "assert // Invalid account holding address", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4" + ] + }, + "1949": { + "op": "intc_0 // 0", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "0" + ] + }, + "1950": { + "op": "bytec 25 // 0x52234f704461656d6f6e23", + "defined_out": [ + "0", + "0x52234f704461656d6f6e23", + "box_prefixed_key%0#4", + "holding_address#0", + "payment_info#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "0", + "0x52234f704461656d6f6e23" + ] + }, + "1952": { + "op": "app_global_get_ex", + "defined_out": [ + "box_prefixed_key%0#4", + "holding_address#0", + "maybe_exists%0#0", + "maybe_value%0#3", + "payment_info#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "maybe_value%0#3", + "maybe_exists%0#0" + ] + }, + "1953": { + "error": "check self.op_daemon exists", + "op": "assert // check self.op_daemon exists", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "maybe_value%0#3" + ] + }, + "1954": { + "op": "global ZeroAddress", + "defined_out": [ + "box_prefixed_key%0#4", + "holding_address#0", + "maybe_value%0#3", + "payment_info#0", + "tmp%0#1" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "maybe_value%0#3", + "tmp%0#1" + ] + }, + "1956": { + "op": "!=", + "defined_out": [ + "box_prefixed_key%0#4", + "holding_address#0", + "payment_info#0", + "tmp%1#2" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "tmp%1#2" + ] + }, + "1957": { + "op": "bz claim_due_cashflows_after_if_else@17", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4" + ] + }, + "1960": { + "op": "txn Sender", + "defined_out": [ + "box_prefixed_key%0#4", + "holding_address#0", + "payment_info#0", + "tmp%2#3" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "tmp%2#3" + ] + }, + "1962": { + "op": "intc_0 // 0", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "tmp%2#3", + "0" + ] + }, + "1963": { + "op": "bytec 25 // 0x52234f704461656d6f6e23", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "tmp%2#3", + "0", + "0x52234f704461656d6f6e23" + ] + }, + "1965": { + "op": "app_global_get_ex", + "defined_out": [ + "box_prefixed_key%0#4", + "holding_address#0", + "maybe_exists%1#0", + "maybe_value%1#1", + "payment_info#0", + "tmp%2#3" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "tmp%2#3", + "maybe_value%1#1", + "maybe_exists%1#0" + ] + }, + "1966": { + "error": "check self.op_daemon exists", + "op": "assert // check self.op_daemon exists", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "tmp%2#3", + "maybe_value%1#1" + ] + }, + "1967": { + "op": "==", + "defined_out": [ + "box_prefixed_key%0#4", + "holding_address#0", + "payment_info#0", + "tmp%3#1" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "tmp%3#1" + ] + }, + "1968": { + "op": "bnz claim_due_cashflows_bool_true@14", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4" + ] + }, + "1971": { + "op": "txn Sender", + "defined_out": [ + "box_prefixed_key%0#4", + "holding_address#0", + "payment_info#0", + "tmp%4#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "tmp%4#0" + ] + }, + "1973": { + "op": "dig 3", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "tmp%4#0", + "holding_address#0" + ] + }, + "1975": { + "op": "==", + "defined_out": [ + "box_prefixed_key%0#4", + "holding_address#0", + "payment_info#0", + "tmp%5#2" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "tmp%5#2" + ] + }, + "1976": { + "op": "bnz claim_due_cashflows_bool_true@14", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4" + ] + }, + "1979": { + "op": "txn Sender", + "defined_out": [ + "box_prefixed_key%0#4", + "holding_address#0", + "payment_info#0", + "tmp%6#1" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "tmp%6#1" + ] + }, + "1981": { + "op": "dig 1", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "tmp%6#1", + "box_prefixed_key%0#4" + ] + }, + "1983": { + "op": "box_get", + "defined_out": [ + "aggregate%box_get%0#0", + "aggregate%box_get%1#0", + "box_prefixed_key%0#4", + "holding_address#0", + "payment_info#0", + "tmp%6#1" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "tmp%6#1", + "aggregate%box_get%0#0", + "aggregate%box_get%1#0" + ] + }, + "1984": { + "error": "check self.account entry exists", + "op": "assert // check self.account entry exists", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "tmp%6#1", + "aggregate%box_get%0#0" + ] + }, + "1985": { + "op": "extract 0 32", + "defined_out": [ + "aggregate%extract%0#0", + "box_prefixed_key%0#4", + "holding_address#0", + "payment_info#0", + "tmp%6#1" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "tmp%6#1", + "aggregate%extract%0#0" + ] + }, + "1988": { + "op": "==", + "defined_out": [ + "box_prefixed_key%0#4", + "holding_address#0", + "payment_info#0", + "tmp%7#1" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "tmp%7#1" + ] + }, + "1989": { + "op": "bz claim_due_cashflows_bool_false@15", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4" + ] + }, + "1992": { + "block": "claim_due_cashflows_bool_true@14", + "stack_in": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4" + ], + "op": "intc_1 // 1", + "defined_out": [ + "or_result%0#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "or_result%0#0" + ] + }, + "1993": { + "error": "Not authorized", + "block": "claim_due_cashflows_bool_merge@16", + "stack_in": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "or_result%0#0" + ], + "op": "assert // Not authorized", + "defined_out": [], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4" + ] + }, + "1994": { + "block": "claim_due_cashflows_after_if_else@17", + "stack_in": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4" + ], + "callsub": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", + "op": "callsub _assert_is_not_asset_defaulted" + }, + "1997": { + "callsub": "modules.rbac.RbacModule._assert_is_not_asset_suspended", + "op": "callsub _assert_is_not_asset_suspended" + }, + "2000": { + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "0" + ] + }, + "2001": { + "op": "bytec_1 // \"status\"", + "defined_out": [ + "\"status\"", + "0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "0", + "\"status\"" + ] + }, + "2002": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "2003": { + "error": "check self.status exists", + "op": "assert // check self.status exists", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "maybe_value%0#0" + ] + }, + "2004": { + "op": "pushint 50", + "defined_out": [ + "50", + "maybe_value%0#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "maybe_value%0#0", + "50" + ] + }, + "2006": { + "op": "==", + "defined_out": [ + "tmp%0#2" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "tmp%0#2" + ] + }, + "2007": { + "op": "!", + "defined_out": [ + "tmp%1#2" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "tmp%1#2" + ] + }, + "2008": { + "error": "IED not yet executed", + "op": "assert // IED not yet executed", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4" + ] + }, + "2009": { + "op": "dig 2", + "defined_out": [ + "holding_address#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "holding_address#0" + ] + }, + "2011": { + "op": "dup", + "defined_out": [ + "holding_address#0", + "holding_address#0 (copy)" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "holding_address#0", + "holding_address#0 (copy)" + ] + }, + "2012": { + "callsub": "modules.accounting.AccountingModule._ensure_units_activated", + "op": "callsub _ensure_units_activated", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "holding_address#0" + ] + }, + "2015": { + "callsub": "modules.accounting.AccountingModule._settle_position", + "op": "callsub _settle_position", + "defined_out": [ + "holding_address#0", + "{_settle_position}.0", + "{_settle_position}.1" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "{_settle_position}.0", + "{_settle_position}.1" + ] + }, + "2018": { + "op": "popn 2", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4" + ] + }, + "2020": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%0#4", + "holding_address#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4" + ] + }, + "2021": { + "op": "box_get", + "defined_out": [ + "aggregate%box_get%2#0", + "aggregate%box_get%3#0", + "box_prefixed_key%0#4", + "holding_address#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "aggregate%box_get%2#0", + "aggregate%box_get%3#0" + ] + }, + "2022": { + "error": "check self.account entry exists", + "op": "assert // check self.account entry exists", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "aggregate%box_get%2#0" + ] + }, + "2023": { + "op": "dup", + "defined_out": [ + "aggregate%box_get%2#0", + "aggregate%box_get%2#0 (copy)", + "box_prefixed_key%0#4", + "holding_address#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "aggregate%box_get%2#0", + "aggregate%box_get%2#0 (copy)" + ] + }, + "2024": { + "op": "pushint 73", + "defined_out": [ + "73", + "aggregate%box_get%2#0", + "aggregate%box_get%2#0 (copy)", + "box_prefixed_key%0#4", + "holding_address#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "aggregate%box_get%2#0", + "aggregate%box_get%2#0 (copy)", + "73" + ] + }, + "2026": { + "op": "extract_uint64", + "defined_out": [ + "aggregate%box_get%2#0", + "box_prefixed_key%0#4", + "holding_address#0", + "interest_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "aggregate%box_get%2#0", + "interest_amount#0" + ] + }, + "2027": { + "op": "dup", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "aggregate%box_get%2#0", + "interest_amount#0", + "interest_amount#0 (copy)" + ] + }, + "2028": { + "op": "cover 2", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "interest_amount#0", + "aggregate%box_get%2#0", + "interest_amount#0" + ] + }, + "2030": { + "op": "bury 8", + "defined_out": [ + "aggregate%box_get%2#0", + "box_prefixed_key%0#4", + "holding_address#0", + "interest_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "interest_amount#0", + "aggregate%box_get%2#0" + ] + }, + "2032": { + "op": "dup", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "interest_amount#0", + "aggregate%box_get%2#0", + "aggregate%box_get%2#0 (copy)" + ] + }, + "2033": { + "op": "pushint 81", + "defined_out": [ + "81", + "aggregate%box_get%2#0", + "aggregate%box_get%2#0 (copy)", + "box_prefixed_key%0#4", + "holding_address#0", + "interest_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "interest_amount#0", + "aggregate%box_get%2#0", + "aggregate%box_get%2#0 (copy)", + "81" + ] + }, + "2035": { + "op": "extract_uint64", + "defined_out": [ + "aggregate%box_get%2#0", + "box_prefixed_key%0#4", + "holding_address#0", + "interest_amount#0", + "principal_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "interest_amount#0", + "aggregate%box_get%2#0", + "principal_amount#0" + ] + }, + "2036": { + "op": "dup", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "interest_amount#0", + "aggregate%box_get%2#0", + "principal_amount#0", + "principal_amount#0" + ] + }, + "2037": { + "op": "bury 8", + "defined_out": [ + "aggregate%box_get%2#0", + "box_prefixed_key%0#4", + "holding_address#0", + "interest_amount#0", + "principal_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "interest_amount#0", + "aggregate%box_get%2#0", + "principal_amount#0" + ] + }, + "2039": { + "op": "uncover 2", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "aggregate%box_get%2#0", + "principal_amount#0", + "interest_amount#0" + ] + }, + "2041": { + "op": "+", + "defined_out": [ + "aggregate%box_get%2#0", + "box_prefixed_key%0#4", + "holding_address#0", + "interest_amount#0", + "principal_amount#0", + "total_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "aggregate%box_get%2#0", + "total_amount#0" + ] + }, + "2042": { + "op": "dup", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "aggregate%box_get%2#0", + "total_amount#0", + "total_amount#0" + ] + }, + "2043": { + "op": "bury 6", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "aggregate%box_get%2#0", + "total_amount#0" + ] + }, + "2045": { + "error": "No due cashflow to pay", + "op": "assert // No due cashflow to pay", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "aggregate%box_get%2#0" + ] + }, + "2046": { + "op": "extract 0 32", + "defined_out": [ + "aggregate%extract%5#0", + "box_prefixed_key%0#4", + "holding_address#0", + "interest_amount#0", + "principal_amount#0", + "total_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "aggregate%extract%5#0" + ] + }, + "2049": { + "op": "intc_0 // 0", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "aggregate%extract%5#0", + "0" + ] + }, + "2050": { + "op": "bytec 19 // \"settlement_asset_id\"", + "defined_out": [ + "\"settlement_asset_id\"", + "0", + "aggregate%extract%5#0", + "box_prefixed_key%0#4", + "holding_address#0", + "interest_amount#0", + "principal_amount#0", + "total_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "aggregate%extract%5#0", + "0", + "\"settlement_asset_id\"" + ] + }, + "2052": { + "op": "app_global_get_ex", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "aggregate%extract%5#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "2053": { + "error": "check self.settlement_asset_id exists", + "op": "assert // check self.settlement_asset_id exists", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "aggregate%extract%5#0", + "maybe_value%0#0" + ] + }, + "2054": { + "op": "asset_holding_get AssetBalance", + "defined_out": [ + "box_prefixed_key%0#4", + "holding_address#0", + "interest_amount#0", + "principal_amount#0", + "tmp%0#5", + "tmp%1#2", + "total_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "tmp%0#5", + "tmp%1#2" + ] + }, + "2056": { + "op": "bury 1", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "tmp%1#2" + ] + }, + "2058": { + "op": "bz claim_due_cashflows_bool_false@24", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4" + ] + }, + "2061": { + "op": "dup", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4" + ] + }, + "2062": { + "op": "box_get", + "defined_out": [ + "aggregate%box_get%12#0", + "aggregate%box_get%13#0", + "box_prefixed_key%0#4", + "holding_address#0", + "interest_amount#0", + "principal_amount#0", + "total_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "aggregate%box_get%12#0", + "aggregate%box_get%13#0" + ] + }, + "2063": { + "error": "check self.account entry exists", + "op": "assert // check self.account entry exists", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "aggregate%box_get%12#0" + ] + }, + "2064": { + "op": "pushint 384", + "defined_out": [ + "384", + "aggregate%box_get%12#0", + "box_prefixed_key%0#4", + "holding_address#0", + "interest_amount#0", + "principal_amount#0", + "total_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "aggregate%box_get%12#0", + "384" + ] + }, + "2067": { + "op": "getbit", + "defined_out": [ + "aggregate%get_bit%0#0", + "box_prefixed_key%0#4", + "holding_address#0", + "interest_amount#0", + "principal_amount#0", + "total_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "aggregate%get_bit%0#0" + ] + }, + "2068": { + "op": "bnz claim_due_cashflows_bool_false@24", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4" + ] + }, + "2071": { + "op": "intc_1 // 1", + "defined_out": [ + "and_result%0#0", + "box_prefixed_key%0#4", + "holding_address#0", + "interest_amount#0", + "principal_amount#0", + "total_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "and_result%0#0" + ] + }, + "2072": { + "block": "claim_due_cashflows_bool_merge@25", + "stack_in": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "and_result%0#0" + ], + "op": "bz claim_due_cashflows_after_if_else@3", + "defined_out": [], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4" + ] + }, + "2075": { + "op": "global CurrentApplicationAddress", + "defined_out": [ + "tmp%0#1" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "tmp%0#1" + ] + }, + "2077": { + "op": "intc_0 // 0", + "defined_out": [ + "0", + "tmp%0#1" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "tmp%0#1", + "0" + ] + }, + "2078": { + "op": "bytec 19 // \"settlement_asset_id\"", + "defined_out": [ + "\"settlement_asset_id\"", + "0", + "tmp%0#1" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "tmp%0#1", + "0", + "\"settlement_asset_id\"" + ] + }, + "2080": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0", + "tmp%0#1" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "tmp%0#1", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "2081": { + "error": "check self.settlement_asset_id exists", + "op": "assert // check self.settlement_asset_id exists", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "tmp%0#1", + "maybe_value%0#0" + ] + }, + "2082": { + "op": "swap", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "maybe_value%0#0", + "tmp%0#1" + ] + }, + "2083": { + "op": "dig 1", + "defined_out": [ + "maybe_value%0#0", + "maybe_value%0#0 (copy)", + "tmp%0#1" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "maybe_value%0#0", + "tmp%0#1", + "maybe_value%0#0 (copy)" + ] + }, + "2085": { + "op": "asset_holding_get AssetBalance", + "defined_out": [ + "check%0#0", + "maybe_value%0#0", + "value%0#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "maybe_value%0#0", + "value%0#0", + "check%0#0" + ] + }, + "2087": { + "error": "account opted into asset", + "op": "assert // account opted into asset", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "maybe_value%0#0", + "value%0#0" + ] + }, + "2088": { + "op": "dig 5", + "defined_out": [ + "maybe_value%0#0", + "total_amount#0", + "value%0#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "maybe_value%0#0", + "value%0#0", + "total_amount#0" + ] + }, + "2090": { + "op": "dup", + "defined_out": [ + "maybe_value%0#0", + "total_amount#0", + "total_amount#0 (copy)", + "value%0#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "maybe_value%0#0", + "value%0#0", + "total_amount#0 (copy)", + "total_amount#0 (copy)" + ] + }, + "2091": { + "op": "cover 2", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "maybe_value%0#0", + "total_amount#0", + "value%0#0", + "total_amount#0 (copy)" + ] + }, + "2093": { + "op": ">=", + "defined_out": [ + "maybe_value%0#0", + "tmp%1#2", + "total_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "maybe_value%0#0", + "total_amount#0", + "tmp%1#2" + ] + }, + "2094": { + "error": "Not enough funds for the payment", + "op": "assert // Not enough funds for the payment", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "maybe_value%0#0", + "total_amount#0" + ] + }, + "2095": { + "op": "dig 2", + "defined_out": [ + "box_prefixed_key%0#4", + "maybe_value%0#0", + "total_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "maybe_value%0#0", + "total_amount#0", + "box_prefixed_key%0#4" + ] + }, + "2097": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%0#4", + "box_prefixed_key%0#4 (copy)", + "maybe_value%0#0", + "total_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "maybe_value%0#0", + "total_amount#0", + "box_prefixed_key%0#4 (copy)", + "box_prefixed_key%0#4 (copy)" + ] + }, + "2098": { + "op": "cover 3", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4", + "maybe_value%0#0", + "total_amount#0", + "box_prefixed_key%0#4 (copy)" + ] + }, + "2100": { + "op": "box_get", + "defined_out": [ + "aggregate%box_get%15#0", + "box_prefixed_key%0#4", + "maybe_value%0#0", + "position#0", + "total_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4", + "maybe_value%0#0", + "total_amount#0", + "position#0", + "aggregate%box_get%15#0" + ] + }, + "2101": { + "error": "check self.account entry exists", + "op": "assert // check self.account entry exists", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4", + "maybe_value%0#0", + "total_amount#0", + "position#0" + ] + }, + "2102": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%0#4", + "maybe_value%0#0", + "position#0", + "position#0 (copy)", + "total_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4", + "maybe_value%0#0", + "total_amount#0", + "position#0", + "position#0 (copy)" + ] + }, + "2103": { + "op": "extract 0 32", + "defined_out": [ + "box_prefixed_key%0#4", + "maybe_value%0#0", + "position#0", + "receiver#0", + "total_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4", + "maybe_value%0#0", + "total_amount#0", + "position#0", + "receiver#0" + ] + }, + "2106": { + "op": "itxn_begin" + }, + "2107": { + "op": "global MinTxnFee", + "defined_out": [ + "box_prefixed_key%0#4", + "inner_txn_params%0%%param_Fee_idx_0#0", + "maybe_value%0#0", + "position#0", + "receiver#0", + "total_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4", + "maybe_value%0#0", + "total_amount#0", + "position#0", + "receiver#0", + "inner_txn_params%0%%param_Fee_idx_0#0" + ] + }, + "2109": { + "op": "uncover 3", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4", + "maybe_value%0#0", + "position#0", + "receiver#0", + "inner_txn_params%0%%param_Fee_idx_0#0", + "total_amount#0" + ] + }, + "2111": { + "op": "itxn_field AssetAmount", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4", + "maybe_value%0#0", + "position#0", + "receiver#0", + "inner_txn_params%0%%param_Fee_idx_0#0" + ] + }, + "2113": { + "op": "swap", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4", + "maybe_value%0#0", + "position#0", + "inner_txn_params%0%%param_Fee_idx_0#0", + "receiver#0" + ] + }, + "2114": { + "op": "itxn_field AssetReceiver", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4", + "maybe_value%0#0", + "position#0", + "inner_txn_params%0%%param_Fee_idx_0#0" + ] + }, + "2116": { + "op": "uncover 2", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4", + "position#0", + "inner_txn_params%0%%param_Fee_idx_0#0", + "maybe_value%0#0" + ] + }, + "2118": { + "op": "itxn_field XferAsset", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4", + "position#0", + "inner_txn_params%0%%param_Fee_idx_0#0" + ] + }, + "2120": { + "op": "pushint 4 // axfer", + "defined_out": [ + "axfer", + "box_prefixed_key%0#4", + "inner_txn_params%0%%param_Fee_idx_0#0", + "position#0", + "total_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4", + "position#0", + "inner_txn_params%0%%param_Fee_idx_0#0", + "axfer" + ] + }, + "2122": { + "op": "itxn_field TypeEnum", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4", + "position#0", + "inner_txn_params%0%%param_Fee_idx_0#0" + ] + }, + "2124": { + "op": "itxn_field Fee", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4", + "position#0" + ] + }, + "2126": { + "op": "itxn_submit" + }, + "2127": { + "op": "dup", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4", + "position#0", + "position#0 (copy)" + ] + }, + "2128": { + "op": "pushint 73", + "defined_out": [ + "73", + "box_prefixed_key%0#4", + "position#0", + "position#0 (copy)", + "total_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4", + "position#0", + "position#0 (copy)", + "73" + ] + }, + "2130": { + "op": "extract_uint64", + "defined_out": [ + "box_prefixed_key%0#4", + "interest_amount#0", + "position#0", + "total_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4", + "position#0", + "interest_amount#0" + ] + }, + "2131": { + "op": "dup", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4", + "position#0", + "interest_amount#0", + "interest_amount#0 (copy)" + ] + }, + "2132": { + "op": "cover 2", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4", + "interest_amount#0", + "position#0", + "interest_amount#0" + ] + }, + "2134": { + "op": "bury 9", + "defined_out": [ + "box_prefixed_key%0#4", + "interest_amount#0", + "position#0", + "total_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4", + "interest_amount#0", + "position#0" + ] + }, + "2136": { + "op": "dup", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4", + "interest_amount#0", + "position#0", + "position#0 (copy)" + ] + }, + "2137": { + "op": "pushint 81", + "defined_out": [ + "81", + "box_prefixed_key%0#4", + "interest_amount#0", + "position#0", + "position#0 (copy)", + "total_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4", + "interest_amount#0", + "position#0", + "position#0 (copy)", + "81" + ] + }, + "2139": { + "op": "extract_uint64", + "defined_out": [ + "box_prefixed_key%0#4", + "interest_amount#0", + "position#0", + "principal_amount#0", + "total_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4", + "interest_amount#0", + "position#0", + "principal_amount#0" + ] + }, + "2140": { + "op": "dup", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4", + "interest_amount#0", + "position#0", + "principal_amount#0", + "principal_amount#0 (copy)" + ] + }, + "2141": { + "op": "cover 3", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4", + "principal_amount#0", + "interest_amount#0", + "position#0", + "principal_amount#0" + ] + }, + "2143": { + "op": "bury 9", + "defined_out": [ + "box_prefixed_key%0#4", + "interest_amount#0", + "position#0", + "principal_amount#0", + "total_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4", + "principal_amount#0", + "interest_amount#0", + "position#0" + ] + }, + "2145": { + "op": "intc_0 // 0", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4", + "principal_amount#0", + "interest_amount#0", + "position#0", + "0" + ] + }, + "2146": { + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%0#0", + "box_prefixed_key%0#4", + "interest_amount#0", + "position#0", + "principal_amount#0", + "total_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4", + "principal_amount#0", + "interest_amount#0", + "position#0", + "aggregate%val_as_bytes%0#0" + ] + }, + "2147": { + "op": "swap", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4", + "principal_amount#0", + "interest_amount#0", + "aggregate%val_as_bytes%0#0", + "position#0" + ] + }, + "2148": { + "op": "dig 1", + "defined_out": [ + "aggregate%val_as_bytes%0#0", + "aggregate%val_as_bytes%0#0 (copy)", + "box_prefixed_key%0#4", + "interest_amount#0", + "position#0", + "principal_amount#0", + "total_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4", + "principal_amount#0", + "interest_amount#0", + "aggregate%val_as_bytes%0#0", + "position#0", + "aggregate%val_as_bytes%0#0 (copy)" + ] + }, + "2150": { + "op": "replace2 73", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4", + "principal_amount#0", + "interest_amount#0", + "aggregate%val_as_bytes%0#0", + "position#0" + ] + }, + "2152": { + "op": "swap", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4", + "principal_amount#0", + "interest_amount#0", + "position#0", + "aggregate%val_as_bytes%0#0" + ] + }, + "2153": { + "op": "replace2 81", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4", + "principal_amount#0", + "interest_amount#0", + "position#0" + ] + }, + "2155": { + "op": "uncover 3", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "principal_amount#0", + "interest_amount#0", + "position#0", + "box_prefixed_key%0#4" + ] + }, + "2157": { + "op": "swap", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "principal_amount#0", + "interest_amount#0", + "box_prefixed_key%0#4", + "position#0" + ] + }, + "2158": { + "op": "box_put", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "principal_amount#0", + "interest_amount#0" + ] + }, + "2159": { + "op": "intc_0 // 0", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "principal_amount#0", + "interest_amount#0", + "0" + ] + }, + "2160": { + "op": "bytec 15 // \"reserved_interest\"", + "defined_out": [ + "\"reserved_interest\"", + "0", + "box_prefixed_key%0#4", + "interest_amount#0", + "principal_amount#0", + "total_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "principal_amount#0", + "interest_amount#0", + "0", + "\"reserved_interest\"" + ] + }, + "2162": { + "op": "app_global_get_ex", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "principal_amount#0", + "interest_amount#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "2163": { + "error": "check self.reserved_interest exists", + "op": "assert // check self.reserved_interest exists", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "principal_amount#0", + "interest_amount#0", + "maybe_value%0#0" + ] + }, + "2164": { + "op": "dup", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "principal_amount#0", + "interest_amount#0", + "maybe_value%0#0", + "maybe_value%0#0 (copy)" + ] + }, + "2165": { + "op": "dig 2", + "defined_out": [ + "box_prefixed_key%0#4", + "interest_amount#0", + "interest_amount#0 (copy)", + "maybe_value%0#0", + "maybe_value%0#0 (copy)", + "principal_amount#0", + "total_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "principal_amount#0", + "interest_amount#0", + "maybe_value%0#0", + "maybe_value%0#0 (copy)", + "interest_amount#0 (copy)" + ] + }, + "2167": { + "op": ">=", + "defined_out": [ + "box_prefixed_key%0#4", + "interest_amount#0", + "maybe_value%0#0", + "principal_amount#0", + "tmp%0#2", + "total_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "principal_amount#0", + "interest_amount#0", + "maybe_value%0#0", + "tmp%0#2" + ] + }, + "2168": { + "error": "Not enough funds for the payment", + "op": "assert // Not enough funds for the payment", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "principal_amount#0", + "interest_amount#0", + "maybe_value%0#0" + ] + }, + "2169": { + "op": "intc_0 // 0", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "principal_amount#0", + "interest_amount#0", + "maybe_value%0#0", + "0" + ] + }, + "2170": { + "op": "bytec 11 // \"reserved_principal\"", + "defined_out": [ + "\"reserved_principal\"", + "0", + "box_prefixed_key%0#4", + "interest_amount#0", + "maybe_value%0#0", + "principal_amount#0", + "total_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "principal_amount#0", + "interest_amount#0", + "maybe_value%0#0", + "0", + "\"reserved_principal\"" + ] + }, + "2172": { + "op": "app_global_get_ex", + "defined_out": [ + "box_prefixed_key%0#4", + "interest_amount#0", + "maybe_exists%1#0", + "maybe_value%0#0", + "maybe_value%1#0", + "principal_amount#0", + "total_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "principal_amount#0", + "interest_amount#0", + "maybe_value%0#0", + "maybe_value%1#0", + "maybe_exists%1#0" + ] + }, + "2173": { + "error": "check self.reserved_principal exists", + "op": "assert // check self.reserved_principal exists", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "principal_amount#0", + "interest_amount#0", + "maybe_value%0#0", + "maybe_value%1#0" + ] + }, + "2174": { + "op": "dig 3", + "defined_out": [ + "box_prefixed_key%0#4", + "interest_amount#0", + "maybe_value%0#0", + "maybe_value%1#0", + "principal_amount#0", + "principal_amount#0 (copy)", + "total_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "principal_amount#0", + "interest_amount#0", + "maybe_value%0#0", + "maybe_value%1#0", + "principal_amount#0 (copy)" + ] + }, + "2176": { + "op": ">=", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "principal_amount#0", + "interest_amount#0", + "maybe_value%0#0", + "tmp%1#2" + ] + }, + "2177": { + "error": "Not enough funds for the payment", + "op": "assert // Not enough funds for the payment", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "principal_amount#0", + "interest_amount#0", + "maybe_value%0#0" + ] + }, + "2178": { + "op": "swap", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "principal_amount#0", + "maybe_value%0#0", + "interest_amount#0" + ] + }, + "2179": { + "op": "-", + "defined_out": [ + "box_prefixed_key%0#4", + "interest_amount#0", + "principal_amount#0", + "tmp%2#2", + "total_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "principal_amount#0", + "tmp%2#2" + ] + }, + "2180": { + "op": "bytec 15 // \"reserved_interest\"", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "principal_amount#0", + "tmp%2#2", + "\"reserved_interest\"" + ] + }, + "2182": { + "op": "swap", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "principal_amount#0", + "\"reserved_interest\"", + "tmp%2#2" + ] + }, + "2183": { + "op": "app_global_put", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "principal_amount#0" + ] + }, + "2184": { + "op": "intc_0 // 0", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "principal_amount#0", + "0" + ] + }, + "2185": { + "op": "bytec 11 // \"reserved_principal\"", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "principal_amount#0", + "0", + "\"reserved_principal\"" + ] + }, + "2187": { + "op": "app_global_get_ex", + "defined_out": [ + "box_prefixed_key%0#4", + "interest_amount#0", + "maybe_exists%3#0", + "maybe_value%3#0", + "principal_amount#0", + "total_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "principal_amount#0", + "maybe_value%3#0", + "maybe_exists%3#0" + ] + }, + "2188": { + "error": "check self.reserved_principal exists", + "op": "assert // check self.reserved_principal exists", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "principal_amount#0", + "maybe_value%3#0" + ] + }, + "2189": { + "op": "swap", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "maybe_value%3#0", + "principal_amount#0" + ] + }, + "2190": { + "op": "-", + "defined_out": [ + "box_prefixed_key%0#4", + "interest_amount#0", + "principal_amount#0", + "tmp%3#0", + "total_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "tmp%3#0" + ] + }, + "2191": { + "op": "bytec 11 // \"reserved_principal\"", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "tmp%3#0", + "\"reserved_principal\"" + ] + }, + "2193": { + "op": "swap", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "\"reserved_principal\"", + "tmp%3#0" + ] + }, + "2194": { + "op": "app_global_put", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4" + ] + }, + "2195": { + "block": "claim_due_cashflows_after_if_else@3", + "stack_in": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4" + ], + "op": "dig 5", + "defined_out": [ + "interest_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "interest_amount#0" + ] + }, + "2197": { + "op": "dup", + "defined_out": [ + "interest_amount#0", + "interest_amount#0 (copy)" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "interest_amount#0", + "interest_amount#0 (copy)" + ] + }, + "2198": { + "op": "dig 6", + "defined_out": [ + "interest_amount#0", + "interest_amount#0 (copy)", + "principal_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "interest_amount#0", + "interest_amount#0 (copy)", + "principal_amount#0" + ] + }, + "2200": { + "op": "dup", + "defined_out": [ + "interest_amount#0", + "interest_amount#0 (copy)", + "principal_amount#0", + "principal_amount#0 (copy)" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "interest_amount#0", + "interest_amount#0 (copy)", + "principal_amount#0 (copy)", + "principal_amount#0 (copy)" + ] + }, + "2201": { + "op": "cover 3", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "principal_amount#0", + "interest_amount#0", + "interest_amount#0 (copy)", + "principal_amount#0 (copy)" + ] + }, + "2203": { + "op": "+", + "defined_out": [ + "interest_amount#0", + "principal_amount#0", + "tmp%5#1" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "principal_amount#0", + "interest_amount#0", + "tmp%5#1" + ] + }, + "2204": { + "op": "global LatestTimestamp", + "defined_out": [ + "interest_amount#0", + "principal_amount#0", + "tmp%5#1", + "tmp%6#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "principal_amount#0", + "interest_amount#0", + "tmp%5#1", + "tmp%6#0" + ] + }, + "2206": { + "op": "uncover 2", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "principal_amount#0", + "tmp%5#1", + "tmp%6#0", + "interest_amount#0" + ] + }, + "2208": { + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%1#0", + "interest_amount#0", + "principal_amount#0", + "tmp%5#1", + "tmp%6#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "principal_amount#0", + "tmp%5#1", + "tmp%6#0", + "aggregate%val_as_bytes%1#0" + ] + }, + "2209": { + "op": "uncover 3", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "tmp%5#1", + "tmp%6#0", + "aggregate%val_as_bytes%1#0", + "principal_amount#0" + ] + }, + "2211": { + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%1#0", + "aggregate%val_as_bytes%2#0", + "interest_amount#0", + "principal_amount#0", + "tmp%5#1", + "tmp%6#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "tmp%5#1", + "tmp%6#0", + "aggregate%val_as_bytes%1#0", + "aggregate%val_as_bytes%2#0" + ] + }, + "2212": { + "op": "concat", + "defined_out": [ + "aggregate%head%1#0", + "interest_amount#0", + "principal_amount#0", + "tmp%5#1", + "tmp%6#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "tmp%5#1", + "tmp%6#0", + "aggregate%head%1#0" + ] + }, + "2213": { + "op": "uncover 2", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "tmp%6#0", + "aggregate%head%1#0", + "tmp%5#1" + ] + }, + "2215": { + "op": "itob", + "defined_out": [ + "aggregate%head%1#0", + "aggregate%val_as_bytes%3#0", + "interest_amount#0", + "principal_amount#0", + "tmp%6#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "tmp%6#0", + "aggregate%head%1#0", + "aggregate%val_as_bytes%3#0" + ] + }, + "2216": { + "op": "concat", + "defined_out": [ + "aggregate%head%2#0", + "interest_amount#0", + "principal_amount#0", + "tmp%6#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "tmp%6#0", + "aggregate%head%2#0" + ] + }, + "2217": { + "op": "swap", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "aggregate%head%2#0", + "tmp%6#0" + ] + }, + "2218": { + "op": "itob", + "defined_out": [ + "aggregate%head%2#0", + "aggregate%val_as_bytes%4#0", + "interest_amount#0", + "principal_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "aggregate%head%2#0", + "aggregate%val_as_bytes%4#0" + ] + }, + "2219": { + "op": "concat", + "defined_out": [ + "aggregate%head%3#0", + "interest_amount#0", + "principal_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "aggregate%head%3#0" + ] + }, + "2220": { + "op": "dig 2", + "defined_out": [ + "aggregate%head%3#0", + "interest_amount#0", + "payment_info#0", + "principal_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "aggregate%head%3#0", + "payment_info#0" + ] + }, + "2222": { + "op": "dup", + "defined_out": [ + "aggregate%head%3#0", + "interest_amount#0", + "payment_info#0", + "payment_info#0 (copy)", + "principal_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "aggregate%head%3#0", + "payment_info#0", + "payment_info#0 (copy)" + ] + }, + "2223": { + "op": "len", + "defined_out": [ + "aggregate%head%3#0", + "aggregate%length%0#0", + "interest_amount#0", + "payment_info#0", + "principal_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "aggregate%head%3#0", + "payment_info#0", + "aggregate%length%0#0" + ] + }, + "2224": { + "op": "itob", + "defined_out": [ + "aggregate%as_bytes%0#0", + "aggregate%head%3#0", + "interest_amount#0", + "payment_info#0", + "principal_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "aggregate%head%3#0", + "payment_info#0", + "aggregate%as_bytes%0#0" + ] + }, + "2225": { + "op": "extract 6 2", + "defined_out": [ + "aggregate%head%3#0", + "aggregate%length_uint16%0#0", + "interest_amount#0", + "payment_info#0", + "principal_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "aggregate%head%3#0", + "payment_info#0", + "aggregate%length_uint16%0#0" + ] + }, + "2228": { + "op": "swap", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "aggregate%head%3#0", + "aggregate%length_uint16%0#0", + "payment_info#0" + ] + }, + "2229": { + "op": "concat", + "defined_out": [ + "aggregate%encoded_value%0#0", + "aggregate%head%3#0", + "interest_amount#0", + "payment_info#0", + "principal_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "aggregate%head%3#0", + "aggregate%encoded_value%0#0" + ] + }, + "2230": { + "op": "swap", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "aggregate%encoded_value%0#0", + "aggregate%head%3#0" + ] + }, + "2231": { + "op": "pushbytes 0x0022", + "defined_out": [ + "0x0022", + "aggregate%encoded_value%0#0", + "aggregate%head%3#0", + "interest_amount#0", + "payment_info#0", + "principal_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "aggregate%encoded_value%0#0", + "aggregate%head%3#0", + "0x0022" + ] + }, + "2235": { + "op": "concat", + "defined_out": [ + "aggregate%encoded_value%0#0", + "aggregate%head%4#0", + "interest_amount#0", + "payment_info#0", + "principal_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "aggregate%encoded_value%0#0", + "aggregate%head%4#0" + ] + }, + "2236": { + "op": "swap", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "aggregate%head%4#0", + "aggregate%encoded_value%0#0" + ] + }, + "2237": { + "op": "concat", + "defined_out": [ + "aggregate%concat%0#0", + "interest_amount#0", + "payment_info#0", + "principal_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "aggregate%concat%0#0" + ] + }, + "2238": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "aggregate%concat%0#0", + "interest_amount#0", + "payment_info#0", + "principal_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "aggregate%concat%0#0", + "0x151f7c75" + ] + }, + "2239": { + "op": "swap", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "0x151f7c75", + "aggregate%concat%0#0" + ] + }, + "2240": { + "op": "concat", + "defined_out": [ + "interest_amount#0", + "payment_info#0", + "principal_amount#0", + "tmp%5#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "tmp%5#0" + ] + }, + "2241": { + "op": "log", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4" + ] + }, + "2242": { + "op": "intc_1 // 1", + "defined_out": [ + "1", + "interest_amount#0", + "payment_info#0", + "principal_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "1" + ] + }, + "2243": { + "op": "return", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4" + ] + }, + "2244": { + "block": "claim_due_cashflows_bool_false@24", + "stack_in": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4" + ], + "op": "intc_0 // 0", + "defined_out": [ + "and_result%0#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "and_result%0#0" + ] + }, + "2245": { + "op": "b claim_due_cashflows_bool_merge@25" + }, + "2248": { + "block": "claim_due_cashflows_bool_false@15", + "stack_in": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4" + ], + "op": "intc_0 // 0", + "defined_out": [ + "or_result%0#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "or_result%0#0" + ] + }, + "2249": { + "op": "b claim_due_cashflows_bool_merge@16" + }, + "2252": { + "subroutine": "modules.transfer_agent.TransferAgent.set_transfer_schedule[routing]", + "params": {}, + "block": "set_transfer_schedule", + "stack_in": [], + "op": "txna ApplicationArgs 1", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "2255": { + "op": "dup", + "defined_out": [ + "tmp%0#0", + "tmp%0#0 (copy)" + ], + "stack_out": [ + "tmp%0#0", + "tmp%0#0 (copy)" + ] + }, + "2256": { + "op": "len", + "defined_out": [ + "len%0#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "len%0#0" + ] + }, + "2257": { + "op": "intc_2 // 8", + "defined_out": [ + "8", + "len%0#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "len%0#0", + "8" + ] + }, + "2258": { + "op": "==", + "defined_out": [ + "eq%0#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "eq%0#0" + ] + }, + "2259": { + "error": "invalid number of bytes for arc4.uint64", + "op": "assert // invalid number of bytes for arc4.uint64", + "stack_out": [ + "tmp%0#0" + ] + }, + "2260": { + "op": "btoi", + "defined_out": [ + "open_date#0" + ], + "stack_out": [ + "open_date#0" + ] + }, + "2261": { + "op": "txna ApplicationArgs 2", + "defined_out": [ + "open_date#0", + "tmp%2#0" + ], + "stack_out": [ + "open_date#0", + "tmp%2#0" + ] + }, + "2264": { + "op": "dup", + "defined_out": [ + "open_date#0", + "tmp%2#0", + "tmp%2#0 (copy)" + ], + "stack_out": [ + "open_date#0", + "tmp%2#0", + "tmp%2#0 (copy)" + ] + }, + "2265": { + "op": "len", + "defined_out": [ + "len%1#0", + "open_date#0", + "tmp%2#0" + ], + "stack_out": [ + "open_date#0", + "tmp%2#0", + "len%1#0" + ] + }, + "2266": { + "op": "intc_2 // 8", + "stack_out": [ + "open_date#0", + "tmp%2#0", + "len%1#0", + "8" + ] + }, + "2267": { + "op": "==", + "defined_out": [ + "eq%1#0", + "open_date#0", + "tmp%2#0" + ], + "stack_out": [ + "open_date#0", + "tmp%2#0", + "eq%1#0" + ] + }, + "2268": { + "error": "invalid number of bytes for arc4.uint64", + "op": "assert // invalid number of bytes for arc4.uint64", + "stack_out": [ + "open_date#0", + "tmp%2#0" + ] + }, + "2269": { + "op": "btoi", + "defined_out": [ + "closure_date#0", + "open_date#0" + ], + "stack_out": [ + "open_date#0", + "closure_date#0" + ] + }, + "2270": { + "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", + "op": "callsub _assert_caller_is_arranger" + }, + "2273": { + "op": "dup2", + "defined_out": [ + "closure_date#0", + "closure_date#0 (copy)", + "open_date#0", + "open_date#0 (copy)" + ], + "stack_out": [ + "open_date#0", + "closure_date#0", + "open_date#0 (copy)", + "closure_date#0 (copy)" + ] + }, + "2274": { + "op": "<", + "defined_out": [ + "closure_date#0", + "open_date#0", + "tmp%0#1" + ], + "stack_out": [ + "open_date#0", + "closure_date#0", + "tmp%0#1" + ] + }, + "2275": { + "error": "Time events must be sorted in strictly ascending order", + "op": "assert // Time events must be sorted in strictly ascending order", + "stack_out": [ + "open_date#0", + "closure_date#0" + ] + }, + "2276": { + "op": "bytec 27 // \"transfer_opening_date\"", + "defined_out": [ + "\"transfer_opening_date\"", + "closure_date#0", + "open_date#0" + ], + "stack_out": [ + "open_date#0", + "closure_date#0", + "\"transfer_opening_date\"" + ] + }, + "2278": { + "op": "uncover 2", + "stack_out": [ + "closure_date#0", + "\"transfer_opening_date\"", + "open_date#0" + ] + }, + "2280": { + "op": "app_global_put", + "stack_out": [ + "closure_date#0" + ] + }, + "2281": { + "op": "bytec 28 // \"transfer_closure_date\"", + "defined_out": [ + "\"transfer_closure_date\"", + "closure_date#0" + ], + "stack_out": [ + "closure_date#0", + "\"transfer_closure_date\"" + ] + }, + "2283": { + "op": "swap", + "stack_out": [ + "\"transfer_closure_date\"", + "closure_date#0" + ] + }, + "2284": { + "op": "app_global_put", + "stack_out": [] + }, + "2285": { + "op": "global LatestTimestamp", + "defined_out": [ + "tmp%1#1" + ], + "stack_out": [ + "tmp%1#1" + ] + }, + "2287": { + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%0#0" + ], + "stack_out": [ + "aggregate%val_as_bytes%0#0" + ] + }, + "2288": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "aggregate%val_as_bytes%0#0" + ], + "stack_out": [ + "aggregate%val_as_bytes%0#0", + "0x151f7c75" + ] + }, + "2289": { + "op": "swap", + "stack_out": [ + "0x151f7c75", + "aggregate%val_as_bytes%0#0" + ] + }, + "2290": { + "op": "concat", + "defined_out": [ + "tmp%6#0" + ], + "stack_out": [ + "tmp%6#0" + ] + }, + "2291": { + "op": "log", + "stack_out": [] + }, + "2292": { + "op": "intc_1 // 1", + "defined_out": [ + "1" + ], + "stack_out": [ + "1" + ] + }, + "2293": { + "op": "return", + "stack_out": [] + }, + "2294": { + "subroutine": "modules.transfer_agent.TransferAgent.primary_distribution[routing]", + "params": {}, + "block": "primary_distribution", + "stack_in": [], + "op": "txna ApplicationArgs 1", + "defined_out": [ + "holding_address#0" + ], + "stack_out": [ + "holding_address#0" + ] + }, + "2297": { + "op": "dup", + "defined_out": [ + "holding_address#0", + "holding_address#0 (copy)" + ], + "stack_out": [ + "holding_address#0", + "holding_address#0 (copy)" + ] + }, + "2298": { + "op": "len", + "defined_out": [ + "holding_address#0", + "len%0#0" + ], + "stack_out": [ + "holding_address#0", + "len%0#0" + ] + }, + "2299": { + "op": "intc_3 // 32", + "defined_out": [ + "32", + "holding_address#0", + "len%0#0" + ], + "stack_out": [ + "holding_address#0", + "len%0#0", + "32" + ] + }, + "2300": { + "op": "==", + "defined_out": [ + "eq%0#0", + "holding_address#0" + ], + "stack_out": [ + "holding_address#0", + "eq%0#0" + ] + }, + "2301": { + "error": "invalid number of bytes for arc4.static_array", + "op": "assert // invalid number of bytes for arc4.static_array", + "stack_out": [ + "holding_address#0" + ] + }, + "2302": { + "op": "txna ApplicationArgs 2", + "defined_out": [ + "holding_address#0", + "tmp%2#0" + ], + "stack_out": [ + "holding_address#0", + "tmp%2#0" + ] + }, + "2305": { + "op": "dup", + "defined_out": [ + "holding_address#0", + "tmp%2#0", + "tmp%2#0 (copy)" + ], + "stack_out": [ + "holding_address#0", + "tmp%2#0", + "tmp%2#0 (copy)" + ] + }, + "2306": { + "op": "len", + "defined_out": [ + "holding_address#0", + "len%1#0", + "tmp%2#0" + ], + "stack_out": [ + "holding_address#0", + "tmp%2#0", + "len%1#0" + ] + }, + "2307": { + "op": "intc_2 // 8", + "defined_out": [ + "8", + "holding_address#0", + "len%1#0", + "tmp%2#0" + ], + "stack_out": [ + "holding_address#0", + "tmp%2#0", + "len%1#0", + "8" + ] + }, + "2308": { + "op": "==", + "defined_out": [ + "eq%1#0", + "holding_address#0", + "tmp%2#0" + ], + "stack_out": [ + "holding_address#0", + "tmp%2#0", + "eq%1#0" + ] + }, + "2309": { + "error": "invalid number of bytes for arc4.uint64", + "op": "assert // invalid number of bytes for arc4.uint64", + "stack_out": [ + "holding_address#0", + "tmp%2#0" + ] + }, + "2310": { + "op": "btoi", + "defined_out": [ + "holding_address#0", + "units#0" + ], + "stack_out": [ + "holding_address#0", + "units#0" + ] + }, + "2311": { + "op": "dup", + "stack_out": [ + "holding_address#0", + "units#0", + "units#0" + ] + }, + "2312": { + "op": "cover 2", + "defined_out": [ + "holding_address#0", + "units#0" + ], + "stack_out": [ + "units#0", + "holding_address#0", + "units#0" + ] + }, + "2314": { + "op": "intc_0 // 0", + "stack_out": [ + "units#0", + "holding_address#0", + "units#0", + "0" + ] + }, + "2315": { + "op": "bytec_1 // \"status\"", + "defined_out": [ + "\"status\"", + "0", + "holding_address#0", + "units#0" + ], + "stack_out": [ + "units#0", + "holding_address#0", + "units#0", + "0", + "\"status\"" + ] + }, + "2316": { + "op": "app_global_get_ex", + "defined_out": [ + "holding_address#0", + "maybe_exists%0#0", + "maybe_value%0#0", + "units#0" + ], + "stack_out": [ + "units#0", + "holding_address#0", + "units#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "2317": { + "error": "check self.status exists", + "op": "assert // check self.status exists", + "stack_out": [ + "units#0", + "holding_address#0", + "units#0", + "maybe_value%0#0" + ] + }, + "2318": { + "error": "D-ASA not configured", + "op": "assert // D-ASA not configured", + "stack_out": [ + "units#0", + "holding_address#0", + "units#0" + ] + }, + "2319": { + "op": "bytec 22 // 0x52235072696d6172794465616c657223", + "defined_out": [ + "0x52235072696d6172794465616c657223", + "holding_address#0", + "units#0" + ], + "stack_out": [ + "units#0", + "holding_address#0", + "units#0", + "0x52235072696d6172794465616c657223" + ] + }, + "2321": { + "op": "txn Sender", + "defined_out": [ + "0x52235072696d6172794465616c657223", + "holding_address#0", + "tmp%0#3", + "units#0" + ], + "stack_out": [ + "units#0", + "holding_address#0", + "units#0", + "0x52235072696d6172794465616c657223", + "tmp%0#3" + ] + }, + "2323": { + "callsub": "modules.rbac.RbacModule._role_is_active", + "op": "callsub _role_is_active", + "defined_out": [ + "holding_address#0", + "tmp%1#2", + "units#0" + ], + "stack_out": [ + "units#0", + "holding_address#0", + "units#0", + "tmp%1#2" + ] + }, + "2326": { + "error": "Not authorized", + "op": "assert // Not authorized", + "stack_out": [ + "units#0", + "holding_address#0", + "units#0" + ] + }, + "2327": { + "callsub": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", + "op": "callsub _assert_is_not_asset_defaulted" + }, + "2330": { + "callsub": "modules.rbac.RbacModule._assert_is_not_asset_suspended", + "op": "callsub _assert_is_not_asset_suspended" + }, + "2333": { + "op": "intc_0 // 0", + "stack_out": [ + "units#0", + "holding_address#0", + "units#0", + "0" + ] + }, + "2334": { + "op": "bytec_1 // \"status\"", + "stack_out": [ + "units#0", + "holding_address#0", + "units#0", + "0", + "\"status\"" + ] + }, + "2335": { + "op": "app_global_get_ex", + "stack_out": [ + "units#0", + "holding_address#0", + "units#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "2336": { + "error": "check self.status exists", + "op": "assert // check self.status exists", + "stack_out": [ + "units#0", + "holding_address#0", + "units#0", + "maybe_value%0#0" + ] + }, + "2337": { + "op": "pushint 50", + "defined_out": [ + "50", + "holding_address#0", + "maybe_value%0#0", + "units#0" + ], + "stack_out": [ + "units#0", + "holding_address#0", + "units#0", + "maybe_value%0#0", + "50" + ] + }, + "2339": { + "op": "==", + "defined_out": [ + "holding_address#0", + "tmp%0#4", + "units#0" + ], + "stack_out": [ + "units#0", + "holding_address#0", + "units#0", + "tmp%0#4" + ] + }, + "2340": { + "error": "Primary distribution is closed", + "op": "assert // Primary distribution is closed", + "stack_out": [ + "units#0", + "holding_address#0", + "units#0" + ] + }, + "2341": { + "op": "bytec 8 // 0x52234163636f756e7423", + "defined_out": [ + "0x52234163636f756e7423", + "holding_address#0", + "units#0" + ], + "stack_out": [ + "units#0", + "holding_address#0", + "units#0", + "0x52234163636f756e7423" + ] + }, + "2343": { + "op": "dig 2", + "stack_out": [ + "units#0", + "holding_address#0", + "units#0", + "0x52234163636f756e7423", + "holding_address#0 (copy)" + ] + }, + "2345": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%0#1", + "holding_address#0", + "units#0" + ], + "stack_out": [ + "units#0", + "holding_address#0", + "units#0", + "box_prefixed_key%0#1" + ] + }, + "2346": { + "op": "dup", + "stack_out": [ + "units#0", + "holding_address#0", + "units#0", + "box_prefixed_key%0#1", + "box_prefixed_key%0#1" + ] + }, + "2347": { + "op": "cover 3", + "defined_out": [ + "box_prefixed_key%0#1", + "holding_address#0", + "units#0" + ], + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "holding_address#0", + "units#0", + "box_prefixed_key%0#1" + ] + }, + "2349": { + "op": "box_len", + "defined_out": [ + "_%0#0", + "box_prefixed_key%0#1", + "holding_address#0", + "maybe_exists%0#0", + "units#0" + ], + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "holding_address#0", + "units#0", + "_%0#0", + "maybe_exists%0#0" + ] + }, + "2350": { + "op": "bury 1", + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "holding_address#0", + "units#0", + "maybe_exists%0#0" + ] + }, + "2352": { + "error": "Invalid account holding address", + "op": "assert // Invalid account holding address", + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "holding_address#0", + "units#0" + ] + }, + "2353": { + "op": "swap", + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "units#0", + "holding_address#0" + ] + }, + "2354": { + "callsub": "modules.accounting.AccountingModule._assert_is_not_account_suspended", + "op": "callsub _assert_is_not_account_suspended", + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "units#0" + ] + }, + "2357": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%0#1", + "units#0", + "units#0 (copy)" + ], + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "units#0", + "units#0 (copy)" + ] + }, + "2358": { + "error": "Can not distribute zero units", + "op": "assert // Can not distribute zero units", + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "units#0" + ] + }, + "2359": { + "op": "intc_0 // 0", + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "units#0", + "0" + ] + }, + "2360": { + "op": "bytec 10 // \"reserved_units_total\"", + "defined_out": [ + "\"reserved_units_total\"", + "0", + "box_prefixed_key%0#1", + "units#0" + ], + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "units#0", + "0", + "\"reserved_units_total\"" + ] + }, + "2362": { + "op": "app_global_get_ex", + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "units#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "2363": { + "error": "check self.reserved_units_total exists", + "op": "assert // check self.reserved_units_total exists", + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "units#0", + "maybe_value%0#0" + ] + }, + "2364": { + "op": "+", + "defined_out": [ + "box_prefixed_key%0#1", + "tmp%2#1", + "units#0" + ], + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "tmp%2#1" + ] + }, + "2365": { + "op": "intc_0 // 0", + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "tmp%2#1", + "0" + ] + }, + "2366": { + "op": "bytec 13 // \"total_units\"", + "defined_out": [ + "\"total_units\"", + "0", + "box_prefixed_key%0#1", + "tmp%2#1", + "units#0" + ], + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "tmp%2#1", + "0", + "\"total_units\"" + ] + }, + "2368": { + "op": "app_global_get_ex", + "defined_out": [ + "box_prefixed_key%0#1", + "maybe_exists%1#0", + "maybe_value%1#0", + "tmp%2#1", + "units#0" + ], + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "tmp%2#1", + "maybe_value%1#0", + "maybe_exists%1#0" + ] + }, + "2369": { + "error": "check self.total_units exists", + "op": "assert // check self.total_units exists", + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "tmp%2#1", + "maybe_value%1#0" + ] + }, + "2370": { + "op": "<=", + "defined_out": [ + "box_prefixed_key%0#1", + "tmp%3#1", + "units#0" + ], + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "tmp%3#1" + ] + }, + "2371": { + "error": "Insufficient remaining D-ASA units", + "op": "assert // Insufficient remaining D-ASA units", + "stack_out": [ + "units#0", + "box_prefixed_key%0#1" + ] + }, + "2372": { + "op": "intc_0 // 0", + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "0" + ] + }, + "2373": { + "op": "bytec 26 // \"initial_exchange_date\"", + "defined_out": [ + "\"initial_exchange_date\"", + "0", + "box_prefixed_key%0#1", + "units#0" + ], + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "0", + "\"initial_exchange_date\"" + ] + }, + "2375": { + "op": "app_global_get_ex", + "defined_out": [ + "box_prefixed_key%0#1", + "maybe_exists%2#0", + "maybe_value%2#0", + "units#0" + ], + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "maybe_value%2#0", + "maybe_exists%2#0" + ] + }, + "2376": { + "error": "check self.initial_exchange_date exists", + "op": "assert // check self.initial_exchange_date exists", + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "maybe_value%2#0" + ] + }, + "2377": { + "op": "bz primary_distribution_after_if_else@3", + "stack_out": [ + "units#0", + "box_prefixed_key%0#1" + ] + }, + "2380": { + "op": "global LatestTimestamp", + "defined_out": [ + "box_prefixed_key%0#1", + "tmp%5#1", + "units#0" + ], + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "tmp%5#1" + ] + }, + "2382": { + "op": "intc_0 // 0", + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "tmp%5#1", + "0" + ] + }, + "2383": { + "op": "bytec 26 // \"initial_exchange_date\"", + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "tmp%5#1", + "0", + "\"initial_exchange_date\"" + ] + }, + "2385": { + "op": "app_global_get_ex", + "defined_out": [ + "box_prefixed_key%0#1", + "maybe_exists%3#0", + "maybe_value%3#0", + "tmp%5#1", + "units#0" + ], + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "tmp%5#1", + "maybe_value%3#0", + "maybe_exists%3#0" + ] + }, + "2386": { + "error": "check self.initial_exchange_date exists", + "op": "assert // check self.initial_exchange_date exists", + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "tmp%5#1", + "maybe_value%3#0" + ] + }, + "2387": { + "op": "<=", + "defined_out": [ + "box_prefixed_key%0#1", + "tmp%6#1", + "units#0" + ], + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "tmp%6#1" + ] + }, + "2388": { + "error": "Primary distribution is closed", + "op": "assert // Primary distribution is closed", + "stack_out": [ + "units#0", + "box_prefixed_key%0#1" + ] + }, + "2389": { + "block": "primary_distribution_after_if_else@3", + "stack_in": [ + "units#0", + "box_prefixed_key%0#1" + ], + "op": "dupn 2", + "defined_out": [ + "box_prefixed_key%0#1", + "box_prefixed_key%0#1 (copy)" + ], + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "box_prefixed_key%0#1", + "box_prefixed_key%0#1 (copy)" + ] + }, + "2391": { + "op": "box_get", + "defined_out": [ + "aggregate%box_get%0#0", + "aggregate%box_get%1#0", + "box_prefixed_key%0#1" + ], + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "box_prefixed_key%0#1", + "aggregate%box_get%0#0", + "aggregate%box_get%1#0" + ] + }, + "2392": { + "error": "check self.account entry exists", + "op": "assert // check self.account entry exists", + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "box_prefixed_key%0#1", + "aggregate%box_get%0#0" + ] + }, + "2393": { + "op": "pushint 40", + "defined_out": [ + "40", + "aggregate%box_get%0#0", + "box_prefixed_key%0#1" + ], + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "box_prefixed_key%0#1", + "aggregate%box_get%0#0", + "40" + ] + }, + "2395": { + "op": "extract_uint64", + "defined_out": [ + "box_prefixed_key%0#1", + "values%0#0" + ], + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "box_prefixed_key%0#1", + "values%0#0" + ] + }, + "2396": { + "op": "dig 3", + "defined_out": [ + "box_prefixed_key%0#1", + "units#0", + "values%0#0" + ], + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "box_prefixed_key%0#1", + "values%0#0", + "units#0" + ] + }, + "2398": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%0#1", + "units#0", + "units#0 (copy)", + "values%0#0" + ], + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "box_prefixed_key%0#1", + "values%0#0", + "units#0 (copy)", + "units#0 (copy)" + ] + }, + "2399": { + "op": "cover 3", + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "units#0", + "box_prefixed_key%0#1", + "values%0#0", + "units#0 (copy)" + ] + }, + "2401": { + "op": "+", + "defined_out": [ + "box_prefixed_key%0#1", + "tmp%0#2", + "units#0" + ], + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "units#0", + "box_prefixed_key%0#1", + "tmp%0#2" + ] + }, + "2402": { + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%0#0", + "box_prefixed_key%0#1", + "units#0" + ], + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "units#0", + "box_prefixed_key%0#1", + "aggregate%val_as_bytes%0#0" + ] + }, + "2403": { + "op": "pushint 40" + }, + "2405": { + "op": "swap", + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "units#0", + "box_prefixed_key%0#1", + "40", + "aggregate%val_as_bytes%0#0" + ] + }, + "2406": { + "op": "box_replace", + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "units#0" + ] + }, + "2407": { + "op": "intc_0 // 0", + "defined_out": [ + "0", + "box_prefixed_key%0#1", + "units#0" + ], + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "units#0", + "0" + ] + }, + "2408": { + "op": "bytec 10 // \"reserved_units_total\"", + "defined_out": [ + "\"reserved_units_total\"", + "0", + "box_prefixed_key%0#1", + "units#0" + ], + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "units#0", + "0", + "\"reserved_units_total\"" + ] + }, + "2410": { + "op": "app_global_get_ex", + "defined_out": [ + "box_prefixed_key%0#1", + "maybe_exists%4#0", + "maybe_value%4#0", + "units#0" + ], + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "units#0", + "maybe_value%4#0", + "maybe_exists%4#0" + ] + }, + "2411": { + "error": "check self.reserved_units_total exists", + "op": "assert // check self.reserved_units_total exists", + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "units#0", + "maybe_value%4#0" + ] + }, + "2412": { + "op": "+", + "defined_out": [ + "box_prefixed_key%0#1", + "tmp%7#0", + "units#0" + ], + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "tmp%7#0" + ] + }, + "2413": { + "op": "bytec 10 // \"reserved_units_total\"", + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "tmp%7#0", + "\"reserved_units_total\"" + ] + }, + "2415": { + "op": "dig 1", + "defined_out": [ + "\"reserved_units_total\"", + "box_prefixed_key%0#1", + "tmp%7#0", + "tmp%7#0 (copy)", + "units#0" + ], + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "tmp%7#0", + "\"reserved_units_total\"", + "tmp%7#0 (copy)" + ] + }, + "2417": { + "op": "app_global_put", + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "tmp%7#0" + ] + }, + "2418": { + "op": "intc_0 // 0", + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "tmp%7#0", + "0" + ] + }, + "2419": { + "op": "bytec 13 // \"total_units\"", + "defined_out": [ + "\"total_units\"", + "0", + "box_prefixed_key%0#1", + "tmp%7#0", + "units#0" + ], + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "tmp%7#0", + "0", + "\"total_units\"" + ] + }, + "2421": { + "op": "app_global_get_ex", + "defined_out": [ + "box_prefixed_key%0#1", + "maybe_exists%5#0", + "maybe_value%5#0", + "tmp%7#0", + "units#0" + ], + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "tmp%7#0", + "maybe_value%5#0", + "maybe_exists%5#0" + ] + }, + "2422": { + "error": "check self.total_units exists", + "op": "assert // check self.total_units exists", + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "tmp%7#0", + "maybe_value%5#0" + ] + }, + "2423": { + "op": "swap", + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "maybe_value%5#0", + "tmp%7#0" + ] + }, + "2424": { + "op": "-", + "defined_out": [ + "box_prefixed_key%0#1", + "tmp%8#0", + "units#0" + ], + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "tmp%8#0" + ] + }, + "2425": { + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%1#0", + "box_prefixed_key%0#1", + "units#0" + ], + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "aggregate%val_as_bytes%1#0" + ] + }, + "2426": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "aggregate%val_as_bytes%1#0", + "box_prefixed_key%0#1", + "units#0" + ], + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "aggregate%val_as_bytes%1#0", + "0x151f7c75" + ] + }, + "2427": { + "op": "swap", + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "0x151f7c75", + "aggregate%val_as_bytes%1#0" + ] + }, + "2428": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%0#1", + "tmp%6#0", + "units#0" + ], + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "tmp%6#0" + ] + }, + "2429": { + "op": "log", + "stack_out": [ + "units#0", + "box_prefixed_key%0#1" + ] + }, + "2430": { + "op": "intc_1 // 1", + "defined_out": [ + "1", + "box_prefixed_key%0#1", + "units#0" + ], + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "1" + ] + }, + "2431": { + "op": "return", + "stack_out": [ + "units#0", + "box_prefixed_key%0#1" + ] + }, + "2432": { + "subroutine": "modules.transfer_agent.TransferAgent.transfer[routing]", + "params": {}, + "block": "transfer", + "stack_in": [], + "op": "intc_0 // 0", + "stack_out": [ + "box_prefixed_key%0#3" + ] + }, + "2433": { + "op": "dup", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4" + ] + }, + "2434": { + "op": "txna ApplicationArgs 1" + }, + "2437": { + "op": "dup", + "defined_out": [ + "sender_holding_address#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "sender_holding_address#0" + ] + }, + "2438": { + "op": "len", + "defined_out": [ + "len%0#0", + "sender_holding_address#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "len%0#0" + ] + }, + "2439": { + "op": "intc_3 // 32", + "defined_out": [ + "32", + "len%0#0", + "sender_holding_address#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "len%0#0", + "32" + ] + }, + "2440": { + "op": "==", + "defined_out": [ + "eq%0#0", + "sender_holding_address#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "eq%0#0" + ] + }, + "2441": { + "error": "invalid number of bytes for arc4.static_array", + "op": "assert // invalid number of bytes for arc4.static_array", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0" + ] + }, + "2442": { + "op": "txna ApplicationArgs 2" + }, + "2445": { + "op": "dup", + "defined_out": [ + "receiver_holding_address#0", + "sender_holding_address#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "receiver_holding_address#0" + ] + }, + "2446": { + "op": "len", + "defined_out": [ + "len%1#0", + "receiver_holding_address#0", + "sender_holding_address#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "len%1#0" + ] + }, + "2447": { + "op": "intc_3 // 32", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "len%1#0", + "32" + ] + }, + "2448": { + "op": "==", + "defined_out": [ + "eq%1#0", + "receiver_holding_address#0", + "sender_holding_address#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "eq%1#0" + ] + }, + "2449": { + "error": "invalid number of bytes for arc4.static_array", + "op": "assert // invalid number of bytes for arc4.static_array", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0" + ] + }, + "2450": { + "op": "txna ApplicationArgs 3" + }, + "2453": { + "op": "dupn 2", + "defined_out": [ + "receiver_holding_address#0", + "sender_holding_address#0", + "tmp%4#0", + "tmp%4#0 (copy)" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "tmp%4#0", + "tmp%4#0 (copy)" + ] + }, + "2455": { + "op": "len", + "defined_out": [ + "len%2#0", + "receiver_holding_address#0", + "sender_holding_address#0", + "tmp%4#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "tmp%4#0", + "len%2#0" + ] + }, + "2456": { + "op": "intc_2 // 8", + "defined_out": [ + "8", + "len%2#0", + "receiver_holding_address#0", + "sender_holding_address#0", + "tmp%4#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "tmp%4#0", + "len%2#0", + "8" + ] + }, + "2457": { + "op": "==", + "defined_out": [ + "eq%2#0", + "receiver_holding_address#0", + "sender_holding_address#0", + "tmp%4#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "tmp%4#0", + "eq%2#0" + ] + }, + "2458": { + "error": "invalid number of bytes for arc4.uint64", + "op": "assert // invalid number of bytes for arc4.uint64", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "tmp%4#0" + ] + }, + "2459": { + "op": "btoi", + "defined_out": [ + "receiver_holding_address#0", + "sender_holding_address#0", + "tmp%4#0", + "units#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0" + ] + }, + "2460": { + "op": "intc_0 // 0", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "0" + ] + }, + "2461": { + "op": "bytec_1 // \"status\"", + "defined_out": [ + "\"status\"", + "0", + "receiver_holding_address#0", + "sender_holding_address#0", + "tmp%4#0", + "units#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "0", + "\"status\"" + ] + }, + "2462": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0", + "receiver_holding_address#0", + "sender_holding_address#0", + "tmp%4#0", + "units#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "2463": { + "error": "check self.status exists", + "op": "assert // check self.status exists", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "maybe_value%0#0" + ] + }, + "2464": { + "error": "D-ASA not configured", + "op": "assert // D-ASA not configured", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0" + ] + }, + "2465": { + "callsub": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", + "op": "callsub _assert_is_not_asset_defaulted" + }, + "2468": { + "callsub": "modules.rbac.RbacModule._assert_is_not_asset_suspended", + "op": "callsub _assert_is_not_asset_suspended" + }, + "2471": { + "op": "intc_0 // 0", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "0" + ] + }, + "2472": { + "op": "bytec_1 // \"status\"", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "0", + "\"status\"" + ] + }, + "2473": { + "op": "app_global_get_ex", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "2474": { + "error": "check self.status exists", + "op": "assert // check self.status exists", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "maybe_value%0#0" + ] + }, + "2475": { + "op": "pushint 50", + "defined_out": [ + "50", + "maybe_value%0#0", + "receiver_holding_address#0", + "sender_holding_address#0", + "tmp%4#0", + "units#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "maybe_value%0#0", + "50" + ] + }, + "2477": { + "op": "==", + "defined_out": [ + "receiver_holding_address#0", + "sender_holding_address#0", + "tmp%0#3", + "tmp%4#0", + "units#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "tmp%0#3" + ] + }, + "2478": { + "op": "!", + "defined_out": [ + "receiver_holding_address#0", + "sender_holding_address#0", + "tmp%1#1", + "tmp%4#0", + "units#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "tmp%1#1" + ] + }, + "2479": { + "error": "IED not yet executed", + "op": "assert // IED not yet executed", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0" + ] + }, + "2480": { + "op": "intc_0 // 0", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "0" + ] + }, + "2481": { + "op": "bytec 27 // \"transfer_opening_date\"", + "defined_out": [ + "\"transfer_opening_date\"", + "0", + "receiver_holding_address#0", + "sender_holding_address#0", + "tmp%4#0", + "units#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "0", + "\"transfer_opening_date\"" + ] + }, + "2483": { + "op": "app_global_get_ex", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "2484": { + "error": "check self.transfer_opening_date exists", + "op": "assert // check self.transfer_opening_date exists", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "maybe_value%0#0" + ] + }, + "2485": { + "op": "bz transfer_after_if_else@3", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0" + ] + }, + "2488": { + "op": "intc_0 // 0", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "0" + ] + }, + "2489": { + "op": "bytec 27 // \"transfer_opening_date\"", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "0", + "\"transfer_opening_date\"" + ] + }, + "2491": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%1#0", + "maybe_value%1#0", + "receiver_holding_address#0", + "sender_holding_address#0", + "tmp%4#0", + "units#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "maybe_value%1#0", + "maybe_exists%1#0" + ] + }, + "2492": { + "error": "check self.transfer_opening_date exists", + "op": "assert // check self.transfer_opening_date exists", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "maybe_value%1#0" + ] + }, + "2493": { + "op": "global LatestTimestamp", + "defined_out": [ + "maybe_value%1#0", + "receiver_holding_address#0", + "sender_holding_address#0", + "tmp%1#2", + "tmp%4#0", + "units#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "maybe_value%1#0", + "tmp%1#2" + ] + }, + "2495": { + "op": "<=", + "defined_out": [ + "receiver_holding_address#0", + "sender_holding_address#0", + "tmp%2#1", + "tmp%4#0", + "units#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "tmp%2#1" + ] + }, + "2496": { + "error": "Transfer is closed", + "op": "assert // Transfer is closed", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0" + ] + }, + "2497": { + "block": "transfer_after_if_else@3", + "stack_in": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0" + ], + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "0" + ] + }, + "2498": { + "op": "bytec 28 // \"transfer_closure_date\"", + "defined_out": [ + "\"transfer_closure_date\"", + "0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "0", + "\"transfer_closure_date\"" + ] + }, + "2500": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%2#0", + "maybe_value%2#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "maybe_value%2#0", + "maybe_exists%2#0" + ] + }, + "2501": { + "error": "check self.transfer_closure_date exists", + "op": "assert // check self.transfer_closure_date exists", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "maybe_value%2#0" + ] + }, + "2502": { + "op": "bz transfer_after_if_else@5", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0" + ] + }, + "2505": { + "op": "global LatestTimestamp", + "defined_out": [ + "tmp%4#2" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "tmp%4#2" + ] + }, + "2507": { + "op": "intc_0 // 0", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "tmp%4#2", + "0" + ] + }, + "2508": { + "op": "bytec 28 // \"transfer_closure_date\"", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "tmp%4#2", + "0", + "\"transfer_closure_date\"" + ] + }, + "2510": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%3#0", + "maybe_value%3#0", + "tmp%4#2" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "tmp%4#2", + "maybe_value%3#0", + "maybe_exists%3#0" + ] + }, + "2511": { + "error": "check self.transfer_closure_date exists", + "op": "assert // check self.transfer_closure_date exists", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "tmp%4#2", + "maybe_value%3#0" + ] + }, + "2512": { + "op": "<", + "defined_out": [ + "tmp%5#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "tmp%5#0" + ] + }, + "2513": { + "error": "Transfer is closed", + "op": "assert // Transfer is closed", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0" + ] + }, + "2514": { + "block": "transfer_after_if_else@5", + "stack_in": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0" + ], + "op": "txn Sender", + "defined_out": [ + "tmp%0#1" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "tmp%0#1" + ] + }, + "2516": { + "op": "dig 4", + "defined_out": [ + "sender_holding_address#0", + "tmp%0#1" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "tmp%0#1", + "sender_holding_address#0" + ] + }, + "2518": { + "op": "dup", + "defined_out": [ + "sender_holding_address#0", + "sender_holding_address#0 (copy)", + "tmp%0#1" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "tmp%0#1", + "sender_holding_address#0 (copy)", + "sender_holding_address#0 (copy)" + ] + }, + "2519": { + "op": "cover 2", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "sender_holding_address#0", + "tmp%0#1", + "sender_holding_address#0 (copy)" + ] + }, + "2521": { + "op": "==", + "defined_out": [ + "sender_holding_address#0", + "tmp%1#1" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "sender_holding_address#0", + "tmp%1#1" + ] + }, + "2522": { + "error": "Not authorized", + "op": "assert // Not authorized", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "sender_holding_address#0" + ] + }, + "2523": { + "op": "bytec 8 // 0x52234163636f756e7423", + "defined_out": [ + "0x52234163636f756e7423", + "sender_holding_address#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "sender_holding_address#0", + "0x52234163636f756e7423" + ] + }, + "2525": { + "op": "dig 1", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "sender_holding_address#0", + "0x52234163636f756e7423", + "sender_holding_address#0 (copy)" + ] + }, + "2527": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%0#3", + "sender_holding_address#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "sender_holding_address#0", + "box_prefixed_key%0#3" + ] + }, + "2528": { + "op": "dup", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "sender_holding_address#0", + "box_prefixed_key%0#3", + "box_prefixed_key%0#3" + ] + }, + "2529": { + "op": "bury 8", + "defined_out": [ + "box_prefixed_key%0#3", + "sender_holding_address#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "sender_holding_address#0", + "box_prefixed_key%0#3" + ] + }, + "2531": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#3 (copy)", + "sender_holding_address#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "sender_holding_address#0", + "box_prefixed_key%0#3", + "box_prefixed_key%0#3 (copy)" + ] + }, + "2532": { + "op": "box_len", + "defined_out": [ + "_%0#0", + "box_prefixed_key%0#3", + "maybe_exists%0#0", + "sender_holding_address#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "sender_holding_address#0", + "box_prefixed_key%0#3", + "_%0#0", + "maybe_exists%0#0" + ] + }, + "2533": { + "op": "bury 1", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "sender_holding_address#0", + "box_prefixed_key%0#3", + "maybe_exists%0#0" + ] + }, + "2535": { + "error": "Invalid account holding address", + "op": "assert // Invalid account holding address", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "sender_holding_address#0", + "box_prefixed_key%0#3" + ] + }, + "2536": { + "op": "bytec 8 // 0x52234163636f756e7423", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "sender_holding_address#0", + "box_prefixed_key%0#3", + "0x52234163636f756e7423" + ] + }, + "2538": { + "op": "dig 5", + "defined_out": [ + "0x52234163636f756e7423", + "box_prefixed_key%0#3", + "receiver_holding_address#0", + "sender_holding_address#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "sender_holding_address#0", + "box_prefixed_key%0#3", + "0x52234163636f756e7423", + "receiver_holding_address#0" + ] + }, + "2540": { + "op": "dup", + "defined_out": [ + "0x52234163636f756e7423", + "box_prefixed_key%0#3", + "receiver_holding_address#0", + "receiver_holding_address#0 (copy)", + "sender_holding_address#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "sender_holding_address#0", + "box_prefixed_key%0#3", + "0x52234163636f756e7423", + "receiver_holding_address#0 (copy)", + "receiver_holding_address#0 (copy)" + ] + }, + "2541": { + "op": "cover 2", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "sender_holding_address#0", + "box_prefixed_key%0#3", + "receiver_holding_address#0", + "0x52234163636f756e7423", + "receiver_holding_address#0 (copy)" + ] + }, + "2543": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "receiver_holding_address#0", + "sender_holding_address#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "sender_holding_address#0", + "box_prefixed_key%0#3", + "receiver_holding_address#0", + "box_prefixed_key%0#4" + ] + }, + "2544": { + "op": "dup", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "sender_holding_address#0", + "box_prefixed_key%0#3", + "receiver_holding_address#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4" + ] + }, + "2545": { + "op": "bury 9", + "defined_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "receiver_holding_address#0", + "sender_holding_address#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "sender_holding_address#0", + "box_prefixed_key%0#3", + "receiver_holding_address#0", + "box_prefixed_key%0#4" + ] + }, + "2547": { + "op": "box_len", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "sender_holding_address#0", + "box_prefixed_key%0#3", + "receiver_holding_address#0", + "_%0#0", + "maybe_exists%0#0" + ] + }, + "2548": { + "op": "bury 1", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "sender_holding_address#0", + "box_prefixed_key%0#3", + "receiver_holding_address#0", + "maybe_exists%0#0" + ] + }, + "2550": { + "error": "Invalid account holding address", + "op": "assert // Invalid account holding address", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "sender_holding_address#0", + "box_prefixed_key%0#3", + "receiver_holding_address#0" + ] + }, + "2551": { + "op": "dig 2", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "sender_holding_address#0", + "box_prefixed_key%0#3", + "receiver_holding_address#0", + "sender_holding_address#0 (copy)" + ] + }, + "2553": { + "callsub": "modules.accounting.AccountingModule._assert_is_not_account_suspended", + "op": "callsub _assert_is_not_account_suspended", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "sender_holding_address#0", + "box_prefixed_key%0#3", + "receiver_holding_address#0" + ] + }, + "2556": { + "op": "dup", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "sender_holding_address#0", + "box_prefixed_key%0#3", + "receiver_holding_address#0", + "receiver_holding_address#0 (copy)" + ] + }, + "2557": { + "callsub": "modules.accounting.AccountingModule._assert_is_not_account_suspended", + "op": "callsub _assert_is_not_account_suspended", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "sender_holding_address#0", + "box_prefixed_key%0#3", + "receiver_holding_address#0" + ] + }, + "2560": { + "op": "uncover 2", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "box_prefixed_key%0#3", + "receiver_holding_address#0", + "sender_holding_address#0" + ] + }, + "2562": { + "op": "!=", + "defined_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "receiver_holding_address#0", + "sender_holding_address#0", + "tmp%2#1" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "box_prefixed_key%0#3", + "tmp%2#1" + ] + }, + "2563": { + "error": "Sender and receiver must be different", + "op": "assert // Sender and receiver must be different", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "box_prefixed_key%0#3" + ] + }, + "2564": { + "op": "dig 1", + "defined_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "receiver_holding_address#0", + "sender_holding_address#0", + "units#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "box_prefixed_key%0#3", + "units#0" + ] + }, + "2566": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "receiver_holding_address#0", + "sender_holding_address#0", + "units#0", + "units#0 (copy)" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "box_prefixed_key%0#3", + "units#0", + "units#0 (copy)" + ] + }, + "2567": { + "error": "Transfer units must be greater than zero", + "op": "assert // Transfer units must be greater than zero", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "box_prefixed_key%0#3", + "units#0" + ] + }, + "2568": { + "op": "swap", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "units#0", + "box_prefixed_key%0#3" + ] + }, + "2569": { + "op": "box_get", + "defined_out": [ + "aggregate%box_get%0#0", + "aggregate%box_get%1#0", + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "receiver_holding_address#0", + "sender_holding_address#0", + "units#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "units#0", + "aggregate%box_get%0#0", + "aggregate%box_get%1#0" + ] + }, + "2570": { + "error": "check self.account entry exists", + "op": "assert // check self.account entry exists", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "units#0", + "aggregate%box_get%0#0" + ] + }, + "2571": { + "op": "intc_3 // 32", + "defined_out": [ + "32", + "aggregate%box_get%0#0", + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "receiver_holding_address#0", + "sender_holding_address#0", + "units#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "units#0", + "aggregate%box_get%0#0", + "32" + ] + }, + "2572": { + "op": "extract_uint64", + "defined_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "receiver_holding_address#0", + "sender_holding_address#0", + "units#0", + "values%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "units#0", + "values%0#0" + ] + }, + "2573": { + "op": "<=", + "defined_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "receiver_holding_address#0", + "sender_holding_address#0", + "tmp%4#1", + "units#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "tmp%4#1" + ] + }, + "2574": { + "error": "Insufficient sender units to transfer", + "op": "assert // Insufficient sender units to transfer", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0" + ] + }, + "2575": { + "op": "intc_0 // 0", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "0" + ] + }, + "2576": { + "op": "bytec_2 // \"event_cursor\"", + "defined_out": [ + "\"event_cursor\"", + "0", + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "receiver_holding_address#0", + "sender_holding_address#0", + "units#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "0", + "\"event_cursor\"" + ] + }, + "2577": { + "op": "app_global_get_ex", + "defined_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "maybe_exists%0#0", + "maybe_value%0#0", + "receiver_holding_address#0", + "sender_holding_address#0", + "units#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "2578": { + "error": "check self.event_cursor exists", + "op": "assert // check self.event_cursor exists", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "maybe_value%0#0" + ] + }, + "2579": { + "op": "intc_0 // 0", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "maybe_value%0#0", + "0" + ] + }, + "2580": { + "op": "bytec 4 // \"schedule_entry_count\"", + "defined_out": [ + "\"schedule_entry_count\"", + "0", + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "maybe_value%0#0", + "receiver_holding_address#0", + "sender_holding_address#0", + "units#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "maybe_value%0#0", + "0", + "\"schedule_entry_count\"" + ] + }, + "2582": { + "op": "app_global_get_ex", + "defined_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "maybe_exists%1#0", + "maybe_value%0#0", + "maybe_value%1#0", + "receiver_holding_address#0", + "sender_holding_address#0", + "units#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "maybe_value%0#0", + "maybe_value%1#0", + "maybe_exists%1#0" + ] + }, + "2583": { + "error": "check self.schedule_entry_count exists", + "op": "assert // check self.schedule_entry_count exists", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "maybe_value%0#0", + "maybe_value%1#0" + ] + }, + "2584": { + "op": ">=", + "defined_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "receiver_holding_address#0", + "sender_holding_address#0", + "tmp%0#3", + "units#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "tmp%0#3" + ] + }, + "2585": { + "op": "bnz transfer_after_inlined_modules.kernel.ActusKernelModule._assert_no_due_event_pending@10", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0" + ] + }, + "2588": { + "op": "intc_0 // 0", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "0" + ] + }, + "2589": { + "op": "bytec_2 // \"event_cursor\"", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "0", + "\"event_cursor\"" + ] + }, + "2590": { + "op": "app_global_get_ex", + "defined_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "maybe_exists%2#0", + "maybe_value%2#0", + "receiver_holding_address#0", + "sender_holding_address#0", + "units#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "maybe_value%2#0", + "maybe_exists%2#0" + ] + }, + "2591": { + "error": "check self.event_cursor exists", + "op": "assert // check self.event_cursor exists", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "maybe_value%2#0" + ] + }, + "2592": { + "callsub": "modules.kernel.ActusKernelModule._get_schedule_entry", + "op": "callsub _get_schedule_entry", + "defined_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "next_entry#0", + "receiver_holding_address#0", + "sender_holding_address#0", + "units#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "next_entry#0" + ] + }, + "2595": { + "op": "pushint 9", + "defined_out": [ + "9", + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "next_entry#0", + "receiver_holding_address#0", + "sender_holding_address#0", + "units#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "next_entry#0", + "9" + ] + }, + "2597": { + "op": "extract_uint64", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "values%0#0" + ] + }, + "2598": { + "op": "global LatestTimestamp", + "defined_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "receiver_holding_address#0", + "sender_holding_address#0", + "tmp%2#3", + "units#0", + "values%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "values%0#0", + "tmp%2#3" + ] + }, + "2600": { + "op": ">", + "defined_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "receiver_holding_address#0", + "sender_holding_address#0", + "tmp%3#3", + "units#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "tmp%3#3" + ] + }, + "2601": { + "error": "ACTUS event not yet executed", + "op": "assert // ACTUS event not yet executed", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0" + ] + }, + "2602": { + "block": "transfer_after_inlined_modules.kernel.ActusKernelModule._assert_no_due_event_pending@10", + "stack_in": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0" + ], + "op": "dig 3", + "defined_out": [ + "sender_holding_address#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "sender_holding_address#0" + ] + }, + "2604": { + "op": "dup", + "defined_out": [ + "sender_holding_address#0", + "sender_holding_address#0 (copy)" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "sender_holding_address#0", + "sender_holding_address#0 (copy)" + ] + }, + "2605": { + "callsub": "modules.accounting.AccountingModule._ensure_units_activated", + "op": "callsub _ensure_units_activated", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "sender_holding_address#0" + ] + }, + "2608": { + "op": "dig 3", + "defined_out": [ + "receiver_holding_address#0", + "sender_holding_address#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "sender_holding_address#0", + "receiver_holding_address#0" + ] + }, + "2610": { + "op": "dup", + "defined_out": [ + "receiver_holding_address#0", + "receiver_holding_address#0 (copy)", + "sender_holding_address#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "sender_holding_address#0", + "receiver_holding_address#0 (copy)", + "receiver_holding_address#0 (copy)" + ] + }, + "2611": { + "op": "cover 2", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "receiver_holding_address#0", + "sender_holding_address#0", + "receiver_holding_address#0 (copy)" + ] + }, + "2613": { + "callsub": "modules.accounting.AccountingModule._ensure_units_activated", + "op": "callsub _ensure_units_activated", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "receiver_holding_address#0", + "sender_holding_address#0" + ] + }, + "2616": { + "callsub": "modules.accounting.AccountingModule._settle_position", + "op": "callsub _settle_position", + "defined_out": [ + "receiver_holding_address#0", + "sender_holding_address#0", + "{_settle_position}.0", + "{_settle_position}.1" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "receiver_holding_address#0", + "{_settle_position}.0", + "{_settle_position}.1" + ] + }, + "2619": { + "op": "popn 2", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "receiver_holding_address#0" + ] + }, + "2621": { + "callsub": "modules.accounting.AccountingModule._settle_position", + "op": "callsub _settle_position", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "{_settle_position}.0", + "{_settle_position}.1" + ] + }, + "2624": { + "op": "popn 2", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0" + ] + }, + "2626": { + "op": "dig 5", + "defined_out": [ + "box_prefixed_key%0#3", + "receiver_holding_address#0", + "sender_holding_address#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "box_prefixed_key%0#3" + ] + }, + "2628": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#3 (copy)", + "receiver_holding_address#0", + "sender_holding_address#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "box_prefixed_key%0#3", + "box_prefixed_key%0#3 (copy)" + ] + }, + "2629": { + "op": "box_get", + "defined_out": [ + "aggregate%box_get%2#0", + "aggregate%box_get%3#0", + "box_prefixed_key%0#3", + "receiver_holding_address#0", + "sender_holding_address#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "box_prefixed_key%0#3", + "aggregate%box_get%2#0", + "aggregate%box_get%3#0" + ] + }, + "2630": { + "error": "check self.account entry exists", + "op": "assert // check self.account entry exists", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "box_prefixed_key%0#3", + "aggregate%box_get%2#0" + ] + }, + "2631": { + "op": "intc_3 // 32", + "defined_out": [ + "32", + "aggregate%box_get%2#0", + "box_prefixed_key%0#3", + "receiver_holding_address#0", + "sender_holding_address#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "box_prefixed_key%0#3", + "aggregate%box_get%2#0", + "32" + ] + }, + "2632": { + "op": "extract_uint64", + "defined_out": [ + "box_prefixed_key%0#3", + "receiver_holding_address#0", + "sender_holding_address#0", + "values%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "box_prefixed_key%0#3", + "values%0#0" + ] + }, + "2633": { + "op": "dig 2", + "defined_out": [ + "box_prefixed_key%0#3", + "receiver_holding_address#0", + "sender_holding_address#0", + "units#0", + "values%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "box_prefixed_key%0#3", + "values%0#0", + "units#0" + ] + }, + "2635": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%0#3", + "receiver_holding_address#0", + "sender_holding_address#0", + "units#0", + "units#0 (copy)", + "values%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "box_prefixed_key%0#3", + "values%0#0", + "units#0 (copy)", + "units#0 (copy)" + ] + }, + "2636": { + "op": "cover 2", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "box_prefixed_key%0#3", + "units#0", + "values%0#0", + "units#0 (copy)" + ] + }, + "2638": { + "op": "dig 1", + "defined_out": [ + "box_prefixed_key%0#3", + "receiver_holding_address#0", + "sender_holding_address#0", + "units#0", + "units#0 (copy)", + "values%0#0", + "values%0#0 (copy)" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "box_prefixed_key%0#3", + "units#0", + "values%0#0", + "units#0 (copy)", + "values%0#0 (copy)" + ] + }, + "2640": { + "op": "<=", + "defined_out": [ + "box_prefixed_key%0#3", + "receiver_holding_address#0", + "sender_holding_address#0", + "tmp%0#3", + "units#0", + "values%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "box_prefixed_key%0#3", + "units#0", + "values%0#0", + "tmp%0#3" + ] + }, + "2641": { + "error": "Insufficient sender units to transfer", + "op": "assert // Insufficient sender units to transfer", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "box_prefixed_key%0#3", + "units#0", + "values%0#0" + ] + }, + "2642": { + "op": "dig 1", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "box_prefixed_key%0#3", + "units#0", + "values%0#0", + "units#0 (copy)" + ] + }, + "2644": { + "op": "-", + "defined_out": [ + "box_prefixed_key%0#3", + "receiver_holding_address#0", + "sender_holding_address#0", + "tmp%1#2", + "units#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "box_prefixed_key%0#3", + "units#0", + "tmp%1#2" + ] + }, + "2645": { + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%0#0", + "box_prefixed_key%0#3", + "receiver_holding_address#0", + "sender_holding_address#0", + "units#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "box_prefixed_key%0#3", + "units#0", + "aggregate%val_as_bytes%0#0" + ] + }, + "2646": { + "op": "uncover 2", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "units#0", + "aggregate%val_as_bytes%0#0", + "box_prefixed_key%0#3" + ] + }, + "2648": { + "op": "intc_3 // 32", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "units#0", + "aggregate%val_as_bytes%0#0", + "box_prefixed_key%0#3", + "32" + ] + }, + "2649": { + "op": "uncover 2", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "units#0", + "box_prefixed_key%0#3", + "32", + "aggregate%val_as_bytes%0#0" + ] + }, + "2651": { + "op": "box_replace", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "units#0" + ] + }, + "2652": { + "op": "dig 5", + "defined_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "receiver_holding_address#0", + "sender_holding_address#0", + "units#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "units#0", + "box_prefixed_key%0#4" + ] + }, + "2654": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4 (copy)", + "receiver_holding_address#0", + "sender_holding_address#0", + "units#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "units#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4 (copy)" + ] + }, + "2655": { + "op": "box_get", + "defined_out": [ + "aggregate%box_get%6#0", + "aggregate%box_get%7#0", + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "receiver_holding_address#0", + "sender_holding_address#0", + "units#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "units#0", + "box_prefixed_key%0#4", + "aggregate%box_get%6#0", + "aggregate%box_get%7#0" + ] + }, + "2656": { + "error": "check self.account entry exists", + "op": "assert // check self.account entry exists", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "units#0", + "box_prefixed_key%0#4", + "aggregate%box_get%6#0" + ] + }, + "2657": { + "op": "intc_3 // 32", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "units#0", + "box_prefixed_key%0#4", + "aggregate%box_get%6#0", + "32" + ] + }, + "2658": { + "op": "extract_uint64", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "units#0", + "box_prefixed_key%0#4", + "values%0#0" + ] + }, + "2659": { + "op": "uncover 2", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "box_prefixed_key%0#4", + "values%0#0", + "units#0" + ] + }, + "2661": { + "op": "+", + "defined_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "receiver_holding_address#0", + "sender_holding_address#0", + "tmp%0#5", + "units#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "box_prefixed_key%0#4", + "tmp%0#5" + ] + }, + "2662": { + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%1#0", + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "receiver_holding_address#0", + "sender_holding_address#0", + "units#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "box_prefixed_key%0#4", + "aggregate%val_as_bytes%1#0" + ] + }, + "2663": { + "op": "intc_3 // 32" + }, + "2664": { + "op": "swap", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "box_prefixed_key%0#4", + "32", + "aggregate%val_as_bytes%1#0" + ] + }, + "2665": { + "op": "box_replace", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0" + ] + }, + "2666": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "receiver_holding_address#0", + "sender_holding_address#0", + "units#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "0x151f7c75" + ] + }, + "2667": { + "op": "dig 2", + "defined_out": [ + "0x151f7c75", + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "receiver_holding_address#0", + "sender_holding_address#0", + "tmp%4#0", + "units#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "0x151f7c75", + "tmp%4#0" + ] + }, + "2669": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "receiver_holding_address#0", + "sender_holding_address#0", + "tmp%4#0", + "tmp%8#0", + "units#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "tmp%8#0" + ] + }, + "2670": { + "op": "log", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0" + ] + }, + "2671": { + "op": "intc_1 // 1", + "defined_out": [ + "1", + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "receiver_holding_address#0", + "sender_holding_address#0", + "tmp%4#0", + "units#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "1" + ] + }, + "2672": { + "op": "return", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0" + ] + }, + "2673": { + "subroutine": "modules.accounting.AccountingModule.account_gov_suspension[routing]", + "params": {}, + "block": "account_gov_suspension", + "stack_in": [], + "op": "txna ApplicationArgs 1", + "defined_out": [ + "holding_address#0" + ], + "stack_out": [ + "holding_address#0" + ] + }, + "2676": { + "op": "dup", + "defined_out": [ + "holding_address#0", + "holding_address#0 (copy)" + ], + "stack_out": [ + "holding_address#0", + "holding_address#0 (copy)" + ] + }, + "2677": { + "op": "len", + "defined_out": [ + "holding_address#0", + "len%0#0" + ], + "stack_out": [ + "holding_address#0", + "len%0#0" + ] + }, + "2678": { + "op": "intc_3 // 32", + "defined_out": [ + "32", + "holding_address#0", + "len%0#0" + ], + "stack_out": [ + "holding_address#0", + "len%0#0", + "32" + ] + }, + "2679": { + "op": "==", + "defined_out": [ + "eq%0#0", + "holding_address#0" + ], + "stack_out": [ + "holding_address#0", + "eq%0#0" + ] + }, + "2680": { + "error": "invalid number of bytes for arc4.static_array", + "op": "assert // invalid number of bytes for arc4.static_array", + "stack_out": [ + "holding_address#0" + ] + }, + "2681": { + "op": "txna ApplicationArgs 2", + "defined_out": [ + "holding_address#0", + "tmp%2#0" + ], + "stack_out": [ + "holding_address#0", + "tmp%2#0" + ] + }, + "2684": { + "op": "dup", + "defined_out": [ + "holding_address#0", + "tmp%2#0", + "tmp%2#0 (copy)" + ], + "stack_out": [ + "holding_address#0", + "tmp%2#0", + "tmp%2#0 (copy)" + ] + }, + "2685": { + "op": "len", + "defined_out": [ + "holding_address#0", + "len%1#0", + "tmp%2#0" + ], + "stack_out": [ + "holding_address#0", + "tmp%2#0", + "len%1#0" + ] + }, + "2686": { + "op": "intc_1 // 1", + "defined_out": [ + "1", + "holding_address#0", + "len%1#0", + "tmp%2#0" + ], + "stack_out": [ + "holding_address#0", + "tmp%2#0", + "len%1#0", + "1" + ] + }, + "2687": { + "op": "==", + "defined_out": [ + "eq%1#0", + "holding_address#0", + "tmp%2#0" + ], + "stack_out": [ + "holding_address#0", + "tmp%2#0", + "eq%1#0" + ] + }, + "2688": { + "error": "invalid number of bytes for arc4.bool", + "op": "assert // invalid number of bytes for arc4.bool", + "stack_out": [ + "holding_address#0", + "tmp%2#0" + ] + }, + "2689": { + "op": "intc_0 // 0", + "defined_out": [ + "0", + "holding_address#0", + "tmp%2#0" + ], + "stack_out": [ + "holding_address#0", + "tmp%2#0", + "0" + ] + }, + "2690": { + "op": "getbit", + "defined_out": [ + "holding_address#0", + "suspended#0" + ], + "stack_out": [ + "holding_address#0", + "suspended#0" + ] + }, + "2691": { + "op": "bytec 21 // 0x5223417574686f7269747923", + "defined_out": [ + "0x5223417574686f7269747923", + "holding_address#0", + "suspended#0" + ], + "stack_out": [ + "holding_address#0", + "suspended#0", + "0x5223417574686f7269747923" + ] + }, + "2693": { + "op": "txn Sender", + "defined_out": [ + "0x5223417574686f7269747923", + "holding_address#0", + "suspended#0", + "tmp%0#2" + ], + "stack_out": [ + "holding_address#0", + "suspended#0", + "0x5223417574686f7269747923", + "tmp%0#2" + ] + }, + "2695": { + "callsub": "modules.rbac.RbacModule._role_is_active", + "op": "callsub _role_is_active", + "defined_out": [ + "holding_address#0", + "suspended#0", + "tmp%1#0" + ], + "stack_out": [ + "holding_address#0", + "suspended#0", + "tmp%1#0" + ] + }, + "2698": { + "error": "Not authorized", + "op": "assert // Not authorized", + "stack_out": [ + "holding_address#0", + "suspended#0" + ] + }, + "2699": { + "op": "bytec 8 // 0x52234163636f756e7423", + "defined_out": [ + "0x52234163636f756e7423", + "holding_address#0", + "suspended#0" + ], + "stack_out": [ + "holding_address#0", + "suspended#0", + "0x52234163636f756e7423" + ] + }, + "2701": { + "op": "uncover 2", + "stack_out": [ + "suspended#0", + "0x52234163636f756e7423", + "holding_address#0" + ] + }, + "2703": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%0#1", + "suspended#0" + ], + "stack_out": [ + "suspended#0", + "box_prefixed_key%0#1" + ] + }, + "2704": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%0#1", + "box_prefixed_key%0#1 (copy)", + "suspended#0" + ], + "stack_out": [ + "suspended#0", + "box_prefixed_key%0#1", + "box_prefixed_key%0#1 (copy)" + ] + }, + "2705": { + "op": "box_len", + "defined_out": [ + "_%0#0", + "box_prefixed_key%0#1", + "maybe_exists%0#0", + "suspended#0" + ], + "stack_out": [ + "suspended#0", + "box_prefixed_key%0#1", + "_%0#0", + "maybe_exists%0#0" + ] + }, + "2706": { + "op": "bury 1", + "stack_out": [ + "suspended#0", + "box_prefixed_key%0#1", + "maybe_exists%0#0" + ] + }, + "2708": { + "error": "Invalid account holding address", + "op": "assert // Invalid account holding address", + "stack_out": [ + "suspended#0", + "box_prefixed_key%0#1" + ] + }, + "2709": { + "op": "dup", + "stack_out": [ + "suspended#0", + "box_prefixed_key%0#1", + "box_prefixed_key%0#1 (copy)" + ] + }, + "2710": { + "op": "pushint 48", + "defined_out": [ + "48", + "box_prefixed_key%0#1", + "box_prefixed_key%0#1 (copy)", + "suspended#0" + ], + "stack_out": [ + "suspended#0", + "box_prefixed_key%0#1", + "box_prefixed_key%0#1 (copy)", + "48" + ] + }, + "2712": { + "op": "intc_1 // 1", + "stack_out": [ + "suspended#0", + "box_prefixed_key%0#1", + "box_prefixed_key%0#1 (copy)", + "48", + "1" + ] + }, + "2713": { + "op": "box_extract", + "defined_out": [ + "box%box_extract%0#0", + "box_prefixed_key%0#1", + "suspended#0" + ], + "stack_out": [ + "suspended#0", + "box_prefixed_key%0#1", + "box%box_extract%0#0" + ] + }, + "2714": { + "op": "intc_0 // 0", + "stack_out": [ + "suspended#0", + "box_prefixed_key%0#1", + "box%box_extract%0#0", + "0" + ] + }, + "2715": { + "op": "uncover 3", + "stack_out": [ + "box_prefixed_key%0#1", + "box%box_extract%0#0", + "0", + "suspended#0" + ] + }, + "2717": { + "op": "setbit", + "defined_out": [ + "aggregate%updated_target%0#0", + "box_prefixed_key%0#1" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "aggregate%updated_target%0#0" + ] + }, + "2718": { + "op": "pushint 48" + }, + "2720": { + "op": "swap", + "stack_out": [ + "box_prefixed_key%0#1", + "48", + "aggregate%updated_target%0#0" + ] + }, + "2721": { + "op": "box_replace", + "stack_out": [] + }, + "2722": { + "op": "global LatestTimestamp", + "defined_out": [ + "tmp%0#1" + ], + "stack_out": [ + "tmp%0#1" + ] + }, + "2724": { + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%0#0" + ], + "stack_out": [ + "aggregate%val_as_bytes%0#0" + ] + }, + "2725": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "aggregate%val_as_bytes%0#0" + ], + "stack_out": [ + "aggregate%val_as_bytes%0#0", + "0x151f7c75" + ] + }, + "2726": { + "op": "swap", + "stack_out": [ + "0x151f7c75", + "aggregate%val_as_bytes%0#0" + ] + }, + "2727": { + "op": "concat", + "defined_out": [ + "tmp%6#0" + ], + "stack_out": [ + "tmp%6#0" + ] + }, + "2728": { + "op": "log", + "stack_out": [] + }, + "2729": { + "op": "intc_1 // 1", + "stack_out": [ + "1" + ] + }, + "2730": { + "op": "return", + "stack_out": [] + }, + "2731": { + "subroutine": "modules.accounting.AccountingModule.account_open[routing]", + "params": {}, + "block": "account_open", + "stack_in": [], + "op": "txna ApplicationArgs 1", + "defined_out": [ + "holding_address#0" + ], + "stack_out": [ + "holding_address#0" + ] + }, + "2734": { + "op": "dup", + "defined_out": [ + "holding_address#0", + "holding_address#0 (copy)" + ], + "stack_out": [ + "holding_address#0", + "holding_address#0 (copy)" + ] + }, + "2735": { + "op": "len", + "defined_out": [ + "holding_address#0", + "len%0#0" + ], + "stack_out": [ + "holding_address#0", + "len%0#0" + ] + }, + "2736": { + "op": "intc_3 // 32", + "defined_out": [ + "32", + "holding_address#0", + "len%0#0" + ], + "stack_out": [ + "holding_address#0", + "len%0#0", + "32" + ] + }, + "2737": { + "op": "==", + "defined_out": [ + "eq%0#0", + "holding_address#0" + ], + "stack_out": [ + "holding_address#0", + "eq%0#0" + ] + }, + "2738": { + "error": "invalid number of bytes for arc4.static_array", + "op": "assert // invalid number of bytes for arc4.static_array", + "stack_out": [ + "holding_address#0" + ] + }, + "2739": { + "op": "txna ApplicationArgs 2", + "defined_out": [ + "holding_address#0", + "payment_address#0" + ], + "stack_out": [ + "holding_address#0", + "payment_address#0" + ] + }, + "2742": { + "op": "dup", + "defined_out": [ + "holding_address#0", + "payment_address#0", + "payment_address#0 (copy)" + ], + "stack_out": [ + "holding_address#0", + "payment_address#0", + "payment_address#0 (copy)" + ] + }, + "2743": { + "op": "len", + "defined_out": [ + "holding_address#0", + "len%1#0", + "payment_address#0" + ], + "stack_out": [ + "holding_address#0", + "payment_address#0", + "len%1#0" + ] + }, + "2744": { + "op": "intc_3 // 32", + "stack_out": [ + "holding_address#0", + "payment_address#0", + "len%1#0", + "32" + ] + }, + "2745": { + "op": "==", + "defined_out": [ + "eq%1#0", + "holding_address#0", + "payment_address#0" + ], + "stack_out": [ + "holding_address#0", + "payment_address#0", + "eq%1#0" + ] + }, + "2746": { + "error": "invalid number of bytes for arc4.static_array", + "op": "assert // invalid number of bytes for arc4.static_array", + "stack_out": [ + "holding_address#0", + "payment_address#0" + ] + }, + "2747": { + "op": "bytec 23 // 0x52234163636f756e744d616e6167657223", + "defined_out": [ + "0x52234163636f756e744d616e6167657223", + "holding_address#0", + "payment_address#0" + ], + "stack_out": [ + "holding_address#0", + "payment_address#0", + "0x52234163636f756e744d616e6167657223" + ] + }, + "2749": { + "op": "txn Sender", + "defined_out": [ + "0x52234163636f756e744d616e6167657223", + "holding_address#0", + "payment_address#0", + "tmp%0#2" + ], + "stack_out": [ + "holding_address#0", + "payment_address#0", + "0x52234163636f756e744d616e6167657223", + "tmp%0#2" + ] + }, + "2751": { + "callsub": "modules.rbac.RbacModule._role_is_active", + "op": "callsub _role_is_active", + "defined_out": [ + "holding_address#0", + "payment_address#0", + "tmp%1#1" + ], + "stack_out": [ + "holding_address#0", + "payment_address#0", + "tmp%1#1" + ] + }, + "2754": { + "error": "Not authorized", + "op": "assert // Not authorized", + "stack_out": [ + "holding_address#0", + "payment_address#0" + ] + }, + "2755": { + "op": "intc_0 // 0", + "defined_out": [ + "0", + "holding_address#0", + "payment_address#0" + ], + "stack_out": [ + "holding_address#0", + "payment_address#0", + "0" + ] + }, + "2756": { + "op": "bytec_1 // \"status\"", + "defined_out": [ + "\"status\"", + "0", + "holding_address#0", + "payment_address#0" + ], + "stack_out": [ + "holding_address#0", + "payment_address#0", + "0", + "\"status\"" + ] + }, + "2757": { + "op": "app_global_get_ex", + "defined_out": [ + "holding_address#0", + "maybe_exists%0#0", + "maybe_value%0#0", + "payment_address#0" + ], + "stack_out": [ + "holding_address#0", + "payment_address#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "2758": { + "error": "check self.status exists", + "op": "assert // check self.status exists", + "stack_out": [ + "holding_address#0", + "payment_address#0", + "maybe_value%0#0" + ] + }, + "2759": { + "op": "pushint 200", + "defined_out": [ + "200", + "holding_address#0", + "maybe_value%0#0", + "payment_address#0" + ], + "stack_out": [ + "holding_address#0", + "payment_address#0", + "maybe_value%0#0", + "200" + ] + }, + "2762": { + "op": "==", + "defined_out": [ + "holding_address#0", + "payment_address#0", + "tmp%0#3" + ], + "stack_out": [ + "holding_address#0", + "payment_address#0", + "tmp%0#3" + ] + }, + "2763": { + "op": "!", + "stack_out": [ + "holding_address#0", + "payment_address#0", + "tmp%1#1" + ] + }, + "2764": { + "error": "Not authorized", + "op": "assert // Not authorized", + "stack_out": [ + "holding_address#0", + "payment_address#0" + ] + }, + "2765": { + "callsub": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", + "op": "callsub _assert_is_not_asset_defaulted" + }, + "2768": { + "callsub": "modules.rbac.RbacModule._assert_is_not_asset_suspended", + "op": "callsub _assert_is_not_asset_suspended" + }, + "2771": { + "op": "bytec 8 // 0x52234163636f756e7423", + "defined_out": [ + "0x52234163636f756e7423", + "holding_address#0", + "payment_address#0" + ], + "stack_out": [ + "holding_address#0", + "payment_address#0", + "0x52234163636f756e7423" + ] + }, + "2773": { + "op": "uncover 2", + "stack_out": [ + "payment_address#0", + "0x52234163636f756e7423", + "holding_address#0" + ] + }, + "2775": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%0#0", + "payment_address#0" + ], + "stack_out": [ + "payment_address#0", + "box_prefixed_key%0#0" + ] + }, + "2776": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%0#0", + "box_prefixed_key%0#0 (copy)", + "payment_address#0" + ], + "stack_out": [ + "payment_address#0", + "box_prefixed_key%0#0", + "box_prefixed_key%0#0 (copy)" + ] + }, + "2777": { + "op": "box_len", + "defined_out": [ + "_%0#0", + "box_prefixed_key%0#0", + "maybe_exists%0#0", + "payment_address#0" + ], + "stack_out": [ + "payment_address#0", + "box_prefixed_key%0#0", + "_%0#0", + "maybe_exists%0#0" + ] + }, + "2778": { + "op": "bury 1", + "stack_out": [ + "payment_address#0", + "box_prefixed_key%0#0", + "maybe_exists%0#0" + ] + }, + "2780": { + "op": "!", + "defined_out": [ + "box_prefixed_key%0#0", + "payment_address#0", + "tmp%2#1" + ], + "stack_out": [ + "payment_address#0", + "box_prefixed_key%0#0", + "tmp%2#1" + ] + }, + "2781": { + "error": "Invalid account holding address", + "op": "assert // Invalid account holding address", + "stack_out": [ + "payment_address#0", + "box_prefixed_key%0#0" + ] + }, + "2782": { + "op": "intc_0 // 0", + "stack_out": [ + "payment_address#0", + "box_prefixed_key%0#0", + "0" + ] + }, + "2783": { + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%0#0", + "box_prefixed_key%0#0", + "payment_address#0" + ], + "stack_out": [ + "payment_address#0", + "box_prefixed_key%0#0", + "aggregate%val_as_bytes%0#0" + ] + }, + "2784": { + "op": "uncover 2", + "stack_out": [ + "box_prefixed_key%0#0", + "aggregate%val_as_bytes%0#0", + "payment_address#0" + ] + }, + "2786": { + "op": "dig 1", + "defined_out": [ + "aggregate%val_as_bytes%0#0", + "aggregate%val_as_bytes%0#0 (copy)", + "box_prefixed_key%0#0", + "payment_address#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "aggregate%val_as_bytes%0#0", + "payment_address#0", + "aggregate%val_as_bytes%0#0 (copy)" + ] + }, + "2788": { + "op": "concat", + "defined_out": [ + "aggregate%head%1#0", + "aggregate%val_as_bytes%0#0", + "box_prefixed_key%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "aggregate%val_as_bytes%0#0", + "aggregate%head%1#0" + ] + }, + "2789": { + "op": "dig 1", + "stack_out": [ + "box_prefixed_key%0#0", + "aggregate%val_as_bytes%0#0", + "aggregate%head%1#0", + "aggregate%val_as_bytes%0#0 (copy)" + ] + }, + "2791": { + "op": "concat", + "defined_out": [ + "aggregate%head%2#0", + "aggregate%val_as_bytes%0#0", + "box_prefixed_key%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "aggregate%val_as_bytes%0#0", + "aggregate%head%2#0" + ] + }, + "2792": { + "op": "bytec 40 // 0x00", + "defined_out": [ + "0x00", + "aggregate%head%2#0", + "aggregate%val_as_bytes%0#0", + "box_prefixed_key%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "aggregate%val_as_bytes%0#0", + "aggregate%head%2#0", + "0x00" + ] + }, + "2794": { + "op": "concat", + "defined_out": [ + "aggregate%head%3#0", + "aggregate%val_as_bytes%0#0", + "box_prefixed_key%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "aggregate%val_as_bytes%0#0", + "aggregate%head%3#0" + ] + }, + "2795": { + "op": "dig 1", + "stack_out": [ + "box_prefixed_key%0#0", + "aggregate%val_as_bytes%0#0", + "aggregate%head%3#0", + "aggregate%val_as_bytes%0#0 (copy)" + ] + }, + "2797": { + "op": "concat", + "defined_out": [ + "aggregate%head%4#0", + "aggregate%val_as_bytes%0#0", + "box_prefixed_key%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "aggregate%val_as_bytes%0#0", + "aggregate%head%4#0" + ] + }, + "2798": { + "op": "dig 1", + "stack_out": [ + "box_prefixed_key%0#0", + "aggregate%val_as_bytes%0#0", + "aggregate%head%4#0", + "aggregate%val_as_bytes%0#0 (copy)" + ] + }, + "2800": { + "op": "concat", + "defined_out": [ + "aggregate%head%5#0", + "aggregate%val_as_bytes%0#0", + "box_prefixed_key%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "aggregate%val_as_bytes%0#0", + "aggregate%head%5#0" + ] + }, + "2801": { + "op": "dig 1", + "stack_out": [ + "box_prefixed_key%0#0", + "aggregate%val_as_bytes%0#0", + "aggregate%head%5#0", + "aggregate%val_as_bytes%0#0 (copy)" + ] + }, + "2803": { + "op": "concat", + "defined_out": [ + "aggregate%head%6#0", + "aggregate%val_as_bytes%0#0", + "box_prefixed_key%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "aggregate%val_as_bytes%0#0", + "aggregate%head%6#0" + ] + }, + "2804": { + "op": "dig 1", + "stack_out": [ + "box_prefixed_key%0#0", + "aggregate%val_as_bytes%0#0", + "aggregate%head%6#0", + "aggregate%val_as_bytes%0#0 (copy)" + ] + }, + "2806": { + "op": "concat", + "defined_out": [ + "aggregate%head%7#0", + "aggregate%val_as_bytes%0#0", + "box_prefixed_key%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "aggregate%val_as_bytes%0#0", + "aggregate%head%7#0" + ] + }, + "2807": { + "op": "swap", + "stack_out": [ + "box_prefixed_key%0#0", + "aggregate%head%7#0", + "aggregate%val_as_bytes%0#0" + ] + }, + "2808": { + "op": "concat", + "defined_out": [ + "aggregate%head%8#0", + "box_prefixed_key%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "aggregate%head%8#0" + ] + }, + "2809": { + "op": "box_put", + "stack_out": [] + }, + "2810": { + "op": "global LatestTimestamp", + "defined_out": [ + "tmp%4#1" + ], + "stack_out": [ + "tmp%4#1" + ] + }, + "2812": { + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%7#0" + ], + "stack_out": [ + "aggregate%val_as_bytes%7#0" + ] + }, + "2813": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "aggregate%val_as_bytes%7#0" + ], + "stack_out": [ + "aggregate%val_as_bytes%7#0", + "0x151f7c75" + ] + }, + "2814": { + "op": "swap", + "stack_out": [ + "0x151f7c75", + "aggregate%val_as_bytes%7#0" + ] + }, + "2815": { + "op": "concat", + "defined_out": [ + "tmp%6#0" + ], + "stack_out": [ + "tmp%6#0" + ] + }, + "2816": { + "op": "log", + "stack_out": [] + }, + "2817": { + "op": "intc_1 // 1", + "defined_out": [ + "1" + ], + "stack_out": [ + "1" + ] + }, + "2818": { + "op": "return", + "stack_out": [] + }, + "2819": { + "subroutine": "modules.accounting.AccountingModule.account_update_payment_address[routing]", + "params": {}, + "block": "account_update_payment_address", + "stack_in": [], + "op": "txna ApplicationArgs 1", + "defined_out": [ + "holding_address#0" + ], + "stack_out": [ + "holding_address#0" + ] + }, + "2822": { + "op": "dup", + "defined_out": [ + "holding_address#0", + "holding_address#0 (copy)" + ], + "stack_out": [ + "holding_address#0", + "holding_address#0 (copy)" + ] + }, + "2823": { + "op": "len", + "defined_out": [ + "holding_address#0", + "len%0#0" + ], + "stack_out": [ + "holding_address#0", + "len%0#0" + ] + }, + "2824": { + "op": "intc_3 // 32", + "defined_out": [ + "32", + "holding_address#0", + "len%0#0" + ], + "stack_out": [ + "holding_address#0", + "len%0#0", + "32" + ] + }, + "2825": { + "op": "==", + "defined_out": [ + "eq%0#0", + "holding_address#0" + ], + "stack_out": [ + "holding_address#0", + "eq%0#0" + ] + }, + "2826": { + "error": "invalid number of bytes for arc4.static_array", + "op": "assert // invalid number of bytes for arc4.static_array", + "stack_out": [ + "holding_address#0" + ] + }, + "2827": { + "op": "txna ApplicationArgs 2", + "defined_out": [ + "holding_address#0", + "tmp%2#0" + ], + "stack_out": [ + "holding_address#0", + "tmp%2#0" + ] + }, + "2830": { + "op": "dup", + "defined_out": [ + "holding_address#0", + "tmp%2#0", + "tmp%2#0 (copy)" + ], + "stack_out": [ + "holding_address#0", + "tmp%2#0", + "tmp%2#0 (copy)" + ] + }, + "2831": { + "op": "len", + "defined_out": [ + "holding_address#0", + "len%1#0", + "tmp%2#0" + ], + "stack_out": [ + "holding_address#0", + "tmp%2#0", + "len%1#0" + ] + }, + "2832": { + "op": "intc_3 // 32", + "stack_out": [ + "holding_address#0", + "tmp%2#0", + "len%1#0", + "32" + ] + }, + "2833": { + "op": "==", + "defined_out": [ + "eq%1#0", + "holding_address#0", + "tmp%2#0" + ], + "stack_out": [ + "holding_address#0", + "tmp%2#0", + "eq%1#0" + ] + }, + "2834": { + "error": "invalid number of bytes for arc4.static_array", + "op": "assert // invalid number of bytes for arc4.static_array", + "stack_out": [ + "holding_address#0", + "tmp%2#0" + ] + }, + "2835": { + "op": "bytec 8 // 0x52234163636f756e7423", + "defined_out": [ + "0x52234163636f756e7423", + "holding_address#0", + "tmp%2#0" + ], + "stack_out": [ + "holding_address#0", + "tmp%2#0", + "0x52234163636f756e7423" + ] + }, + "2837": { + "op": "dig 2", + "stack_out": [ + "holding_address#0", + "tmp%2#0", + "0x52234163636f756e7423", + "holding_address#0 (copy)" + ] + }, + "2839": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%0#1", + "holding_address#0", + "tmp%2#0" + ], + "stack_out": [ + "holding_address#0", + "tmp%2#0", + "box_prefixed_key%0#1" + ] + }, + "2840": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%0#1", + "box_prefixed_key%0#1 (copy)", + "holding_address#0", + "tmp%2#0" + ], + "stack_out": [ + "holding_address#0", + "tmp%2#0", + "box_prefixed_key%0#1", + "box_prefixed_key%0#1 (copy)" + ] + }, + "2841": { + "op": "box_len", + "defined_out": [ + "_%0#0", + "box_prefixed_key%0#1", + "holding_address#0", + "maybe_exists%0#0", + "tmp%2#0" + ], + "stack_out": [ + "holding_address#0", + "tmp%2#0", + "box_prefixed_key%0#1", + "_%0#0", + "maybe_exists%0#0" + ] + }, + "2842": { + "op": "bury 1", + "stack_out": [ + "holding_address#0", + "tmp%2#0", + "box_prefixed_key%0#1", + "maybe_exists%0#0" + ] + }, + "2844": { + "error": "Invalid account holding address", + "op": "assert // Invalid account holding address", + "stack_out": [ + "holding_address#0", + "tmp%2#0", + "box_prefixed_key%0#1" + ] + }, + "2845": { + "op": "txn Sender", + "defined_out": [ + "box_prefixed_key%0#1", + "holding_address#0", + "tmp%0#1", + "tmp%2#0" + ], + "stack_out": [ + "holding_address#0", + "tmp%2#0", + "box_prefixed_key%0#1", + "tmp%0#1" + ] + }, + "2847": { + "op": "uncover 3", + "stack_out": [ + "tmp%2#0", + "box_prefixed_key%0#1", + "tmp%0#1", + "holding_address#0" + ] + }, + "2849": { + "op": "==", + "defined_out": [ + "box_prefixed_key%0#1", + "tmp%1#1", + "tmp%2#0" + ], + "stack_out": [ + "tmp%2#0", + "box_prefixed_key%0#1", + "tmp%1#1" + ] + }, + "2850": { + "error": "Not authorized", + "op": "assert // Not authorized", + "stack_out": [ + "tmp%2#0", + "box_prefixed_key%0#1" + ] + }, + "2851": { + "callsub": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", + "op": "callsub _assert_is_not_asset_defaulted" + }, + "2854": { + "callsub": "modules.rbac.RbacModule._assert_is_not_asset_suspended", + "op": "callsub _assert_is_not_asset_suspended" + }, + "2857": { + "op": "intc_0 // 0", + "defined_out": [ + "0", + "box_prefixed_key%0#1", + "tmp%2#0" + ], + "stack_out": [ + "tmp%2#0", + "box_prefixed_key%0#1", + "0" + ] + }, + "2858": { + "op": "uncover 2", + "stack_out": [ + "box_prefixed_key%0#1", + "0", + "tmp%2#0" + ] + }, + "2860": { + "op": "box_replace", + "stack_out": [] + }, + "2861": { + "op": "global LatestTimestamp", + "defined_out": [ + "tmp%2#1" + ], + "stack_out": [ + "tmp%2#1" + ] + }, + "2863": { + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%0#0" + ], + "stack_out": [ + "aggregate%val_as_bytes%0#0" + ] + }, + "2864": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "aggregate%val_as_bytes%0#0" + ], + "stack_out": [ + "aggregate%val_as_bytes%0#0", + "0x151f7c75" + ] + }, + "2865": { + "op": "swap", + "stack_out": [ + "0x151f7c75", + "aggregate%val_as_bytes%0#0" + ] + }, + "2866": { + "op": "concat", + "defined_out": [ + "tmp%6#0" + ], + "stack_out": [ + "tmp%6#0" + ] + }, + "2867": { + "op": "log", + "stack_out": [] + }, + "2868": { + "op": "intc_1 // 1", + "defined_out": [ + "1" + ], + "stack_out": [ + "1" + ] + }, + "2869": { + "op": "return", + "stack_out": [] + }, + "2870": { + "subroutine": "modules.accounting.AccountingModule.account_get_position[routing]", + "params": {}, + "block": "account_get_position", + "stack_in": [], + "op": "txna ApplicationArgs 1", + "defined_out": [ + "holding_address#0" + ], + "stack_out": [ + "holding_address#0" + ] + }, + "2873": { + "op": "dup", + "defined_out": [ + "holding_address#0", + "holding_address#0 (copy)" + ], + "stack_out": [ + "holding_address#0", + "holding_address#0 (copy)" + ] + }, + "2874": { + "op": "len", + "defined_out": [ + "holding_address#0", + "len%0#0" + ], + "stack_out": [ + "holding_address#0", + "len%0#0" + ] + }, + "2875": { + "op": "intc_3 // 32", + "defined_out": [ + "32", + "holding_address#0", + "len%0#0" + ], + "stack_out": [ + "holding_address#0", + "len%0#0", + "32" + ] + }, + "2876": { + "op": "==", + "defined_out": [ + "eq%0#0", + "holding_address#0" + ], + "stack_out": [ + "holding_address#0", + "eq%0#0" + ] + }, + "2877": { + "error": "invalid number of bytes for arc4.static_array", + "op": "assert // invalid number of bytes for arc4.static_array", + "stack_out": [ + "holding_address#0" + ] + }, + "2878": { + "op": "bytec 8 // 0x52234163636f756e7423", + "defined_out": [ + "0x52234163636f756e7423", + "holding_address#0" + ], + "stack_out": [ + "holding_address#0", + "0x52234163636f756e7423" + ] + }, + "2880": { + "op": "swap", + "stack_out": [ + "0x52234163636f756e7423", + "holding_address#0" + ] + }, + "2881": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%0#1" + ], + "stack_out": [ + "box_prefixed_key%0#1" + ] + }, + "2882": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%0#1", + "box_prefixed_key%0#1 (copy)" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "box_prefixed_key%0#1 (copy)" + ] + }, + "2883": { + "op": "box_len", + "defined_out": [ + "_%0#0", + "box_prefixed_key%0#1", + "maybe_exists%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "_%0#0", + "maybe_exists%0#0" + ] + }, + "2884": { + "op": "bury 1", + "stack_out": [ + "box_prefixed_key%0#1", + "maybe_exists%0#0" + ] + }, + "2886": { + "error": "Invalid account holding address", + "op": "assert // Invalid account holding address", + "stack_out": [ + "box_prefixed_key%0#1" + ] + }, + "2887": { + "op": "box_get", + "defined_out": [ + "aggregate%box_get%0#0", + "aggregate%box_get%1#0" + ], + "stack_out": [ + "aggregate%box_get%0#0", + "aggregate%box_get%1#0" + ] + }, + "2888": { + "op": "pop", + "stack_out": [ + "aggregate%box_get%0#0" + ] + }, + "2889": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "aggregate%box_get%0#0" + ], + "stack_out": [ + "aggregate%box_get%0#0", + "0x151f7c75" + ] + }, + "2890": { + "op": "swap", + "stack_out": [ + "0x151f7c75", + "aggregate%box_get%0#0" + ] + }, + "2891": { + "op": "concat", + "defined_out": [ + "tmp%3#0" + ], + "stack_out": [ + "tmp%3#0" + ] + }, + "2892": { + "op": "log", + "stack_out": [] + }, + "2893": { + "op": "intc_1 // 1", + "defined_out": [ + "1" + ], + "stack_out": [ + "1" + ] + }, + "2894": { + "op": "return", + "stack_out": [] + }, + "2895": { + "subroutine": "modules.kernel.ActusKernelModule.contract_create[routing]", + "params": {}, + "block": "contract_create", + "stack_in": [], + "op": "txna ApplicationArgs 1", + "defined_out": [ + "arranger#0" + ], + "stack_out": [ + "arranger#0" + ] + }, + "2898": { + "op": "dup", + "defined_out": [ + "arranger#0", + "arranger#0 (copy)" + ], + "stack_out": [ + "arranger#0", + "arranger#0 (copy)" + ] + }, + "2899": { + "op": "len", + "defined_out": [ + "arranger#0", + "len%0#0" + ], + "stack_out": [ + "arranger#0", + "len%0#0" + ] + }, + "2900": { + "op": "intc_3 // 32", + "defined_out": [ + "32", + "arranger#0", + "len%0#0" + ], + "stack_out": [ + "arranger#0", + "len%0#0", + "32" + ] + }, + "2901": { + "op": "==", + "defined_out": [ + "arranger#0", + "eq%0#0" + ], + "stack_out": [ + "arranger#0", + "eq%0#0" + ] + }, + "2902": { + "error": "invalid number of bytes for arc4.static_array", + "op": "assert // invalid number of bytes for arc4.static_array", + "stack_out": [ + "arranger#0" + ] + }, + "2903": { + "op": "bytec 18 // 0x5223417272616e67657223", + "defined_out": [ + "0x5223417272616e67657223", + "arranger#0" + ], + "stack_out": [ + "arranger#0", + "0x5223417272616e67657223" + ] + }, + "2905": { + "op": "swap", + "stack_out": [ + "0x5223417272616e67657223", + "arranger#0" + ] + }, + "2906": { + "op": "app_global_put", + "stack_out": [] + }, + "2907": { + "op": "global LatestTimestamp", + "defined_out": [ + "tmp%0#1" + ], + "stack_out": [ + "tmp%0#1" + ] + }, + "2909": { + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%0#0" + ], + "stack_out": [ + "aggregate%val_as_bytes%0#0" + ] + }, + "2910": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "aggregate%val_as_bytes%0#0" + ], + "stack_out": [ + "aggregate%val_as_bytes%0#0", + "0x151f7c75" + ] + }, + "2911": { + "op": "swap", + "stack_out": [ + "0x151f7c75", + "aggregate%val_as_bytes%0#0" + ] + }, + "2912": { + "op": "concat", + "defined_out": [ + "tmp%4#0" + ], + "stack_out": [ + "tmp%4#0" + ] + }, + "2913": { + "op": "log", + "stack_out": [] + }, + "2914": { + "op": "intc_1 // 1", + "defined_out": [ + "1" + ], + "stack_out": [ + "1" + ] + }, + "2915": { + "op": "return", + "stack_out": [] + }, + "2916": { + "subroutine": "modules.kernel.ActusKernelModule.contract_config[routing]", + "params": {}, + "block": "contract_config", + "stack_in": [], + "op": "pushbytes \"\"", + "stack_out": [ + "day_count_convention#0" + ] + }, + "2918": { + "op": "dup", + "stack_out": [ + "day_count_convention#0", + "values%0#2" + ] + }, + "2919": { + "op": "txna ApplicationArgs 1" + }, + "2922": { + "op": "dupn 2", + "defined_out": [ + "terms#0", + "terms#0 (copy)" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "terms#0", + "terms#0 (copy)" + ] + }, + "2924": { + "op": "len", + "defined_out": [ + "len%0#0", + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "terms#0", + "len%0#0" + ] + }, + "2925": { + "op": "pushint 107", + "defined_out": [ + "107", + "len%0#0", + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "terms#0", + "len%0#0", + "107" + ] + }, + "2927": { + "op": "==", + "defined_out": [ + "eq%0#0", + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "terms#0", + "eq%0#0" + ] + }, + "2928": { + "error": "invalid number of bytes for smart_contracts.abi_types.NormalizedActusTerms", + "op": "assert // invalid number of bytes for smart_contracts.abi_types.NormalizedActusTerms", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "terms#0" + ] + }, + "2929": { + "op": "txna ApplicationArgs 2" + }, + "2932": { + "op": "dup", + "defined_out": [ + "initial_state#0", + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "terms#0", + "initial_state#0", + "initial_state#0" + ] + }, + "2933": { + "op": "cover 2", + "defined_out": [ + "initial_state#0", + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "terms#0", + "initial_state#0" + ] + }, + "2935": { + "op": "len", + "defined_out": [ + "initial_state#0", + "len%1#0", + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "terms#0", + "len%1#0" + ] + }, + "2936": { + "op": "pushint 72", + "defined_out": [ + "72", + "initial_state#0", + "len%1#0", + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "terms#0", + "len%1#0", + "72" + ] + }, + "2938": { + "op": "==", + "defined_out": [ + "eq%1#0", + "initial_state#0", + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "terms#0", + "eq%1#0" + ] + }, + "2939": { + "error": "invalid number of bytes for smart_contracts.abi_types.InitialKernelState", + "op": "assert // invalid number of bytes for smart_contracts.abi_types.InitialKernelState", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "terms#0" + ] + }, + "2940": { + "op": "txna ApplicationArgs 3" + }, + "2943": { + "op": "dup", + "defined_out": [ + "initial_state#0", + "prospectus#0", + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "terms#0", + "prospectus#0", + "prospectus#0" + ] + }, + "2944": { + "op": "cover 2", + "defined_out": [ + "initial_state#0", + "prospectus#0", + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "terms#0", + "prospectus#0" + ] + }, + "2946": { + "op": "dup", + "defined_out": [ + "initial_state#0", + "prospectus#0", + "prospectus#0 (copy)", + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "terms#0", + "prospectus#0", + "prospectus#0 (copy)" + ] + }, + "2947": { + "op": "len", + "defined_out": [ + "initial_state#0", + "prospectus#0", + "terms#0", + "tuple_len%0#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "terms#0", + "prospectus#0", + "tuple_len%0#0" + ] + }, + "2948": { + "op": "dig 1", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "terms#0", + "prospectus#0", + "tuple_len%0#0", + "prospectus#0 (copy)" + ] + }, + "2950": { + "op": "intc_3 // 32", + "defined_out": [ + "32", + "initial_state#0", + "prospectus#0", + "prospectus#0 (copy)", + "terms#0", + "tuple_len%0#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "terms#0", + "prospectus#0", + "tuple_len%0#0", + "prospectus#0 (copy)", + "32" + ] + }, + "2951": { + "error": "invalid tuple encoding", + "op": "extract_uint16 // on error: invalid tuple encoding", + "defined_out": [ + "extract_uint16%0#0", + "initial_state#0", + "prospectus#0", + "terms#0", + "tuple_len%0#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "terms#0", + "prospectus#0", + "tuple_len%0#0", + "extract_uint16%0#0" + ] + }, + "2952": { + "op": "dup", + "defined_out": [ + "extract_uint16%0#0", + "extract_uint16%0#0 (copy)", + "initial_state#0", + "prospectus#0", + "terms#0", + "tuple_len%0#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "terms#0", + "prospectus#0", + "tuple_len%0#0", + "extract_uint16%0#0", + "extract_uint16%0#0 (copy)" + ] + }, + "2953": { + "op": "pushint 34", + "defined_out": [ + "34", + "extract_uint16%0#0", + "extract_uint16%0#0 (copy)", + "initial_state#0", + "prospectus#0", + "terms#0", + "tuple_len%0#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "terms#0", + "prospectus#0", + "tuple_len%0#0", + "extract_uint16%0#0", + "extract_uint16%0#0 (copy)", + "34" + ] + }, + "2955": { + "op": "==", + "defined_out": [ + "eq%2#0", + "extract_uint16%0#0", + "initial_state#0", + "prospectus#0", + "terms#0", + "tuple_len%0#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "terms#0", + "prospectus#0", + "tuple_len%0#0", + "extract_uint16%0#0", + "eq%2#0" + ] + }, + "2956": { + "error": "invalid tail pointer at index 1 of (uint8[32],(len+utf8[]))", + "op": "assert // invalid tail pointer at index 1 of (uint8[32],(len+utf8[]))", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "terms#0", + "prospectus#0", + "tuple_len%0#0", + "extract_uint16%0#0" + ] + }, + "2957": { + "op": "uncover 2", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "terms#0", + "tuple_len%0#0", + "extract_uint16%0#0", + "prospectus#0" + ] + }, + "2959": { + "op": "swap", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "terms#0", + "tuple_len%0#0", + "prospectus#0", + "extract_uint16%0#0" + ] + }, + "2960": { + "op": "dig 2", + "defined_out": [ + "extract_uint16%0#0", + "initial_state#0", + "prospectus#0", + "terms#0", + "tuple_len%0#0", + "tuple_len%0#0 (copy)" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "terms#0", + "tuple_len%0#0", + "prospectus#0", + "extract_uint16%0#0", + "tuple_len%0#0 (copy)" + ] + }, + "2962": { + "op": "substring3", + "defined_out": [ + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "terms#0", + "tuple_len%0#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "terms#0", + "tuple_len%0#0", + "substring3%0#0" + ] + }, + "2963": { + "op": "dup", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "terms#0", + "tuple_len%0#0", + "substring3%0#0", + "substring3%0#0" + ] + }, + "2964": { + "op": "cover 3", + "defined_out": [ + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "terms#0", + "tuple_len%0#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "terms#0", + "tuple_len%0#0", + "substring3%0#0" + ] + }, + "2966": { + "op": "intc_0 // 0", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "terms#0", + "tuple_len%0#0", + "substring3%0#0", + "0" + ] + }, + "2967": { + "error": "invalid array length header", + "op": "extract_uint16 // on error: invalid array length header", + "defined_out": [ + "aggregate%array_length%0#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "terms#0", + "tuple_len%0#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "terms#0", + "tuple_len%0#0", + "aggregate%array_length%0#0" + ] + }, + "2968": { + "op": "pushint 36", + "defined_out": [ + "36", + "aggregate%array_length%0#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "terms#0", + "tuple_len%0#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "terms#0", + "tuple_len%0#0", + "aggregate%array_length%0#0", + "36" + ] + }, + "2970": { + "op": "+", + "defined_out": [ + "add%1#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "terms#0", + "tuple_len%0#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "terms#0", + "tuple_len%0#0", + "add%1#0" + ] + }, + "2971": { + "op": "==", + "defined_out": [ + "eq%3#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "terms#0", + "eq%3#0" + ] + }, + "2972": { + "error": "invalid number of bytes for smart_contracts.abi_types.Prospectus", + "op": "assert // invalid number of bytes for smart_contracts.abi_types.Prospectus", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "terms#0" + ] + }, + "2973": { + "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", + "op": "callsub _assert_caller_is_arranger" + }, + "2976": { + "op": "intc_0 // 0", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "terms#0", + "0" + ] + }, + "2977": { + "op": "getbyte", + "defined_out": [ + "contract_type#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0" + ] + }, + "2978": { + "op": "dup", + "defined_out": [ + "contract_type#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "contract_type#0" + ] + }, + "2979": { + "op": "bytec 12 // \"contract_type\"", + "defined_out": [ + "\"contract_type\"", + "contract_type#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "contract_type#0", + "\"contract_type\"" + ] + }, + "2981": { + "op": "dig 1", + "defined_out": [ + "\"contract_type\"", + "contract_type#0", + "contract_type#0 (copy)", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "contract_type#0", + "\"contract_type\"", + "contract_type#0 (copy)" + ] + }, + "2983": { + "op": "app_global_put", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "contract_type#0" + ] + }, + "2984": { + "op": "bz contract_config_bool_true@7", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0" + ] + }, + "2987": { + "op": "dup", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "contract_type#0" + ] + }, + "2988": { + "op": "intc_1 // 1", + "defined_out": [ + "1", + "contract_type#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "contract_type#0", + "1" + ] + }, + "2989": { + "op": "==", + "defined_out": [ + "contract_type#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "terms#0", + "tmp%1#2" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "tmp%1#2" + ] + }, + "2990": { + "op": "bnz contract_config_bool_true@7", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0" + ] + }, + "2993": { + "op": "dup", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "contract_type#0" + ] + }, + "2994": { + "op": "pushint 2", + "defined_out": [ + "2", + "contract_type#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "contract_type#0", + "2" + ] + }, + "2996": { + "op": "==", + "defined_out": [ + "contract_type#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "terms#0", + "tmp%2#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "tmp%2#0" + ] + }, + "2997": { + "op": "bnz contract_config_bool_true@7", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0" + ] + }, + "3000": { + "op": "dup", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "contract_type#0" + ] + }, + "3001": { + "op": "pushint 3", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "contract_type#0", + "3" + ] + }, + "3003": { + "op": "==", + "defined_out": [ + "contract_type#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "terms#0", + "tmp%3#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "tmp%3#0" + ] + }, + "3004": { + "op": "bnz contract_config_bool_true@7", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0" + ] + }, + "3007": { + "op": "dup", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "contract_type#0" + ] + }, + "3008": { + "op": "pushint 4", + "defined_out": [ + "4", + "contract_type#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "contract_type#0", + "4" + ] + }, + "3010": { + "op": "==", + "defined_out": [ + "contract_type#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "terms#0", + "tmp%4#1" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "tmp%4#1" + ] + }, + "3011": { + "op": "bnz contract_config_bool_true@7", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0" + ] + }, + "3014": { + "op": "dup", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "contract_type#0" + ] + }, + "3015": { + "op": "pushint 5", + "defined_out": [ + "5", + "contract_type#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "contract_type#0", + "5" + ] + }, + "3017": { + "op": "==", + "defined_out": [ + "contract_type#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "terms#0", + "tmp%5#1" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "tmp%5#1" + ] + }, + "3018": { + "op": "bz contract_config_bool_false@8", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0" + ] + }, + "3021": { + "block": "contract_config_bool_true@7", + "stack_in": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0" + ], + "op": "intc_1 // 1", + "defined_out": [ + "or_result%0#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "or_result%0#0" + ] + }, + "3022": { + "error": "Invalid ACTUS configuration", + "block": "contract_config_bool_merge@9", + "stack_in": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "or_result%0#0" + ], + "op": "assert // Invalid ACTUS configuration", + "defined_out": [], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0" + ] + }, + "3023": { + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "0" + ] + }, + "3024": { + "op": "bytec 12 // \"contract_type\"", + "defined_out": [ + "\"contract_type\"", + "0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "0", + "\"contract_type\"" + ] + }, + "3026": { + "op": "app_global_get_ex", + "defined_out": [ + "contract_type#0", + "maybe_exists%1#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "contract_type#0", + "maybe_exists%1#0" + ] + }, + "3027": { + "op": "swap", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "maybe_exists%1#0", + "contract_type#0" + ] + }, + "3028": { + "op": "bury 2", + "defined_out": [ + "contract_type#0", + "maybe_exists%1#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "maybe_exists%1#0" + ] + }, + "3030": { + "error": "check self.contract_type exists", + "op": "assert // check self.contract_type exists", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0" + ] + }, + "3031": { + "op": "dig 4", + "defined_out": [ + "contract_type#0", + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0" + ] + }, + "3033": { + "op": "dup", + "defined_out": [ + "contract_type#0", + "terms#0", + "terms#0 (copy)" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "terms#0 (copy)" + ] + }, + "3034": { + "op": "pushint 33", + "defined_out": [ + "33", + "contract_type#0", + "terms#0", + "terms#0 (copy)" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "terms#0 (copy)", + "33" + ] + }, + "3036": { + "op": "extract_uint64", + "defined_out": [ + "contract_type#0", + "terms#0", + "values%0#2" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%0#2" + ] + }, + "3037": { + "op": "dup", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%0#2", + "values%0#2" + ] + }, + "3038": { + "op": "bury 8", + "defined_out": [ + "contract_type#0", + "terms#0", + "values%0#2" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%0#2" + ] + }, + "3040": { + "error": "Invalid ACTUS configuration", + "op": "assert // Invalid ACTUS configuration", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0" + ] + }, + "3041": { + "op": "pushint 57", + "defined_out": [ + "57", + "contract_type#0", + "terms#0", + "values%0#2" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "57" + ] + }, + "3043": { + "op": "getbyte", + "defined_out": [ + "contract_type#0", + "day_count_convention#0", + "terms#0", + "values%0#2" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "day_count_convention#0" + ] + }, + "3044": { + "op": "dup", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "day_count_convention#0", + "day_count_convention#0" + ] + }, + "3045": { + "op": "bury 8", + "defined_out": [ + "contract_type#0", + "day_count_convention#0", + "terms#0", + "values%0#2" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "day_count_convention#0" + ] + }, + "3047": { + "op": "bz contract_config_bool_true@16", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0" + ] + }, + "3050": { + "op": "dig 6", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "day_count_convention#0" + ] + }, + "3052": { + "op": "intc_1 // 1", + "defined_out": [ + "1", + "contract_type#0", + "day_count_convention#0", + "terms#0", + "values%0#2" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "day_count_convention#0", + "1" + ] + }, + "3053": { + "op": "==", + "defined_out": [ + "contract_type#0", + "day_count_convention#0", + "terms#0", + "tmp%1#2", + "values%0#2" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "tmp%1#2" + ] + }, + "3054": { + "op": "bnz contract_config_bool_true@16", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0" + ] + }, + "3057": { + "op": "dig 6", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "day_count_convention#0" + ] + }, + "3059": { + "op": "pushint 2", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "day_count_convention#0", + "2" + ] + }, + "3061": { + "op": "==", + "defined_out": [ + "contract_type#0", + "day_count_convention#0", + "terms#0", + "tmp%2#0", + "values%0#2" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "tmp%2#0" + ] + }, + "3062": { + "op": "bnz contract_config_bool_true@16", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0" + ] + }, + "3065": { + "op": "dig 6", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "day_count_convention#0" + ] + }, + "3067": { + "op": "pushint 3", + "defined_out": [ + "3", + "contract_type#0", + "day_count_convention#0", + "terms#0", + "values%0#2" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "day_count_convention#0", + "3" + ] + }, + "3069": { + "op": "==", + "defined_out": [ + "contract_type#0", + "day_count_convention#0", + "terms#0", + "tmp%3#0", + "values%0#2" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "tmp%3#0" + ] + }, + "3070": { + "op": "bnz contract_config_bool_true@16", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0" + ] + }, + "3073": { + "op": "dig 6", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "day_count_convention#0" + ] + }, + "3075": { + "op": "pushint 4", + "defined_out": [ + "4", + "contract_type#0", + "day_count_convention#0", + "terms#0", + "values%0#2" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "day_count_convention#0", + "4" + ] + }, + "3077": { + "op": "==", + "defined_out": [ + "contract_type#0", + "day_count_convention#0", + "terms#0", + "tmp%4#1", + "values%0#2" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "tmp%4#1" + ] + }, + "3078": { + "op": "bz contract_config_bool_false@17", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0" + ] + }, + "3081": { + "block": "contract_config_bool_true@16", + "stack_in": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0" + ], + "op": "intc_1 // 1", + "defined_out": [ + "or_result%0#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "or_result%0#0" + ] + }, + "3082": { + "error": "Invalid day-count convention ID", + "block": "contract_config_bool_merge@18", + "stack_in": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "or_result%0#0" + ], + "op": "assert // Invalid day-count convention ID", + "defined_out": [], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0" + ] + }, + "3083": { + "op": "dup", + "defined_out": [ + "contract_type#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "contract_type#0" + ] + }, + "3084": { + "op": "intc_1 // 1", + "defined_out": [ + "1", + "contract_type#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "contract_type#0", + "1" + ] + }, + "3085": { + "op": "!=", + "defined_out": [ + "contract_type#0", + "tmp%2#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "tmp%2#0" + ] + }, + "3086": { + "op": "bz contract_config_after_if_else@20", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0" + ] + }, + "3089": { + "op": "dig 4", + "defined_out": [ + "contract_type#0", + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0" + ] + }, + "3091": { + "op": "pushint 786", + "defined_out": [ + "786", + "contract_type#0", + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "786" + ] + }, + "3094": { + "op": "getbit", + "defined_out": [ + "aggregate%get_bit%0#0", + "contract_type#0", + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "aggregate%get_bit%0#0" + ] + }, + "3095": { + "op": "!", + "defined_out": [ + "contract_type#0", + "terms#0", + "tmp%3#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "tmp%3#0" + ] + }, + "3096": { + "error": "Invalid ACTUS configuration", + "op": "assert // Invalid ACTUS configuration", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0" + ] + }, + "3097": { + "block": "contract_config_after_if_else@20", + "stack_in": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0" + ], + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "0" + ] + }, + "3098": { + "op": "bytec_1 // \"status\"", + "defined_out": [ + "\"status\"", + "0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "0", + "\"status\"" + ] + }, + "3099": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%0#1", + "maybe_value%0#1" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "maybe_value%0#1", + "maybe_exists%0#1" + ] + }, + "3100": { + "error": "check self.status exists", + "op": "assert // check self.status exists", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "maybe_value%0#1" + ] + }, + "3101": { + "op": "!", + "defined_out": [ + "tmp%0#2" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "tmp%0#2" + ] + }, + "3102": { + "error": "D-ASA already configured", + "op": "assert // D-ASA already configured", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0" + ] + }, + "3103": { + "op": "intc_0 // 0", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "0" + ] + }, + "3104": { + "op": "bytec 20 // \"initial_exchange_amount\"", + "defined_out": [ + "\"initial_exchange_amount\"", + "0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "0", + "\"initial_exchange_amount\"" + ] + }, + "3106": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%1#0", + "maybe_value%1#1" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "maybe_value%1#1", + "maybe_exists%1#0" + ] + }, + "3107": { + "error": "check self.initial_exchange_amount exists", + "op": "assert // check self.initial_exchange_amount exists", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "maybe_value%1#1" + ] + }, + "3108": { + "op": "!", + "defined_out": [ + "tmp%1#2" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "tmp%1#2" + ] + }, + "3109": { + "error": "D-ASA already configured", + "op": "assert // D-ASA already configured", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0" + ] + }, + "3110": { + "op": "dig 4", + "defined_out": [ + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0" + ] + }, + "3112": { + "op": "dup", + "defined_out": [ + "terms#0", + "terms#0 (copy)" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "terms#0 (copy)" + ] + }, + "3113": { + "op": "intc_1 // 1", + "defined_out": [ + "1", + "terms#0", + "terms#0 (copy)" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "terms#0 (copy)", + "1" + ] + }, + "3114": { + "op": "extract_uint64", + "defined_out": [ + "denomination_asset_id#0", + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "denomination_asset_id#0" + ] + }, + "3115": { + "op": "dup", + "defined_out": [ + "denomination_asset_id#0", + "denomination_asset_id#0 (copy)", + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "denomination_asset_id#0", + "denomination_asset_id#0 (copy)" + ] + }, + "3116": { + "op": "asset_params_get AssetCreator", + "defined_out": [ + "_creator#0", + "denomination_asset_id#0", + "exists#0", + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "denomination_asset_id#0", + "_creator#0", + "exists#0" + ] + }, + "3118": { + "op": "bury 1", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "denomination_asset_id#0", + "exists#0" + ] + }, + "3120": { + "error": "Denomination asset is not properly set", + "op": "assert // Denomination asset is not properly set", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "denomination_asset_id#0" + ] + }, + "3121": { + "op": "bytec 44 // \"denomination_asset_id\"", + "defined_out": [ + "\"denomination_asset_id\"", + "denomination_asset_id#0", + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "denomination_asset_id#0", + "\"denomination_asset_id\"" + ] + }, + "3123": { + "op": "dig 1", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "denomination_asset_id#0", + "\"denomination_asset_id\"", + "denomination_asset_id#0 (copy)" + ] + }, + "3125": { + "op": "app_global_put", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "denomination_asset_id#0" + ] + }, + "3126": { + "op": "dig 1", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "denomination_asset_id#0", + "terms#0 (copy)" + ] + }, + "3128": { + "op": "pushint 9", + "defined_out": [ + "9", + "denomination_asset_id#0", + "terms#0", + "terms#0 (copy)" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "denomination_asset_id#0", + "terms#0 (copy)", + "9" + ] + }, + "3130": { + "op": "extract_uint64", + "defined_out": [ + "denomination_asset_id#0", + "settlement_asset_id#0", + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "denomination_asset_id#0", + "settlement_asset_id#0" + ] + }, + "3131": { + "op": "dup", + "defined_out": [ + "denomination_asset_id#0", + "settlement_asset_id#0", + "settlement_asset_id#0 (copy)", + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "denomination_asset_id#0", + "settlement_asset_id#0", + "settlement_asset_id#0 (copy)" + ] + }, + "3132": { + "op": "uncover 2", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "settlement_asset_id#0", + "settlement_asset_id#0 (copy)", + "denomination_asset_id#0" + ] + }, + "3134": { + "op": "==", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "settlement_asset_id#0", + "tmp%0#2" + ] + }, + "3135": { + "error": "Different settlement asset not supported, must be equal to denomination asset", + "op": "assert // Different settlement asset not supported, must be equal to denomination asset", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "settlement_asset_id#0" + ] + }, + "3136": { + "op": "bytec 19 // \"settlement_asset_id\"", + "defined_out": [ + "\"settlement_asset_id\"", + "settlement_asset_id#0", + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "settlement_asset_id#0", + "\"settlement_asset_id\"" + ] + }, + "3138": { + "op": "dig 1", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "settlement_asset_id#0", + "\"settlement_asset_id\"", + "settlement_asset_id#0 (copy)" + ] + }, + "3140": { + "op": "app_global_put", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "settlement_asset_id#0" + ] + }, + "3141": { + "op": "itxn_begin" + }, + "3142": { + "op": "global MinTxnFee", + "defined_out": [ + "inner_txn_params%0%%param_Fee_idx_0#0", + "settlement_asset_id#0", + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "settlement_asset_id#0", + "inner_txn_params%0%%param_Fee_idx_0#0" + ] + }, + "3144": { + "op": "global CurrentApplicationAddress", + "defined_out": [ + "inner_txn_params%0%%param_AssetReceiver_idx_0#0", + "inner_txn_params%0%%param_Fee_idx_0#0", + "settlement_asset_id#0", + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "settlement_asset_id#0", + "inner_txn_params%0%%param_Fee_idx_0#0", + "inner_txn_params%0%%param_AssetReceiver_idx_0#0" + ] + }, + "3146": { + "op": "intc_0 // 0", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "settlement_asset_id#0", + "inner_txn_params%0%%param_Fee_idx_0#0", + "inner_txn_params%0%%param_AssetReceiver_idx_0#0", + "0" + ] + }, + "3147": { + "op": "itxn_field AssetAmount", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "settlement_asset_id#0", + "inner_txn_params%0%%param_Fee_idx_0#0", + "inner_txn_params%0%%param_AssetReceiver_idx_0#0" + ] + }, + "3149": { + "op": "itxn_field AssetReceiver", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "settlement_asset_id#0", + "inner_txn_params%0%%param_Fee_idx_0#0" + ] + }, + "3151": { + "op": "swap", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "inner_txn_params%0%%param_Fee_idx_0#0", + "settlement_asset_id#0" + ] + }, + "3152": { + "op": "itxn_field XferAsset", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "inner_txn_params%0%%param_Fee_idx_0#0" + ] + }, + "3154": { + "op": "pushint 4 // axfer", + "defined_out": [ + "axfer", + "inner_txn_params%0%%param_Fee_idx_0#0", + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "inner_txn_params%0%%param_Fee_idx_0#0", + "axfer" + ] + }, + "3156": { + "op": "itxn_field TypeEnum", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "inner_txn_params%0%%param_Fee_idx_0#0" + ] + }, + "3158": { + "op": "itxn_field Fee", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0" + ] + }, + "3160": { + "op": "itxn_submit" + }, + "3161": { + "op": "dup", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "terms#0 (copy)" + ] + }, + "3162": { + "op": "pushint 17", + "defined_out": [ + "17", + "terms#0", + "terms#0 (copy)" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "terms#0 (copy)", + "17" + ] + }, + "3164": { + "op": "extract_uint64", + "defined_out": [ + "terms#0", + "values%4#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%4#0" + ] + }, + "3165": { + "op": "bytec 13 // \"total_units\"", + "defined_out": [ + "\"total_units\"", + "terms#0", + "values%4#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%4#0", + "\"total_units\"" + ] + }, + "3167": { + "op": "swap", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "\"total_units\"", + "values%4#0" + ] + }, + "3168": { + "op": "app_global_put", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0" + ] + }, + "3169": { + "op": "bytec 10 // \"reserved_units_total\"", + "defined_out": [ + "\"reserved_units_total\"", + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "\"reserved_units_total\"" + ] + }, + "3171": { + "op": "intc_0 // 0", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "\"reserved_units_total\"", + "0" + ] + }, + "3172": { + "op": "app_global_put", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0" + ] + }, + "3173": { + "op": "bytec 46 // \"day_count_convention\"", + "defined_out": [ + "\"day_count_convention\"", + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "\"day_count_convention\"" + ] + }, + "3175": { + "op": "dig 8", + "defined_out": [ + "\"day_count_convention\"", + "day_count_convention#0", + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "\"day_count_convention\"", + "day_count_convention#0" + ] + }, + "3177": { + "op": "app_global_put", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0" + ] + }, + "3178": { + "op": "dup", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "terms#0 (copy)" + ] + }, + "3179": { + "op": "pushint 41", + "defined_out": [ + "41", + "day_count_convention#0", + "terms#0", + "terms#0 (copy)" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "terms#0 (copy)", + "41" + ] + }, + "3181": { + "op": "extract_uint64", + "defined_out": [ + "day_count_convention#0", + "terms#0", + "values%5#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0" + ] + }, + "3182": { + "op": "bytec 26 // \"initial_exchange_date\"", + "defined_out": [ + "\"initial_exchange_date\"", + "day_count_convention#0", + "terms#0", + "values%5#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "\"initial_exchange_date\"" + ] + }, + "3184": { + "op": "dig 1", + "defined_out": [ + "\"initial_exchange_date\"", + "day_count_convention#0", + "terms#0", + "values%5#0", + "values%5#0 (copy)" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "\"initial_exchange_date\"", + "values%5#0 (copy)" + ] + }, + "3186": { + "op": "app_global_put", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0" + ] + }, + "3187": { + "op": "dig 1", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "terms#0 (copy)" + ] + }, + "3189": { + "op": "pushint 49", + "defined_out": [ + "49", + "day_count_convention#0", + "terms#0", + "terms#0 (copy)", + "values%5#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "terms#0 (copy)", + "49" + ] + }, + "3191": { + "op": "extract_uint64", + "defined_out": [ + "day_count_convention#0", + "terms#0", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "values%6#0" + ] + }, + "3192": { + "op": "bytec 45 // \"maturity_date\"", + "defined_out": [ + "\"maturity_date\"", + "day_count_convention#0", + "terms#0", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "values%6#0", + "\"maturity_date\"" + ] + }, + "3194": { + "op": "dig 1", + "defined_out": [ + "\"maturity_date\"", + "day_count_convention#0", + "terms#0", + "values%5#0", + "values%6#0", + "values%6#0 (copy)" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "values%6#0", + "\"maturity_date\"", + "values%6#0 (copy)" + ] + }, + "3196": { + "op": "app_global_put", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "values%6#0" + ] + }, + "3197": { + "op": "dig 6", + "defined_out": [ + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "values%6#0", + "initial_state#0" + ] + }, + "3199": { + "op": "dup", + "defined_out": [ + "day_count_convention#0", + "initial_state#0", + "initial_state#0 (copy)", + "terms#0", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "values%6#0", + "initial_state#0 (copy)", + "initial_state#0 (copy)" + ] + }, + "3200": { + "op": "cover 2", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "initial_state#0 (copy)" + ] + }, + "3202": { + "op": "pushint 48", + "defined_out": [ + "48", + "day_count_convention#0", + "initial_state#0", + "initial_state#0 (copy)", + "terms#0", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "initial_state#0 (copy)", + "48" + ] + }, + "3204": { + "op": "extract_uint64", + "defined_out": [ + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%5#0", + "values%6#0", + "values%7#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "values%7#0" + ] + }, + "3205": { + "op": "bytec 14 // \"next_principal_redemption\"", + "defined_out": [ + "\"next_principal_redemption\"", + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%5#0", + "values%6#0", + "values%7#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "values%7#0", + "\"next_principal_redemption\"" + ] + }, + "3207": { + "op": "swap", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "\"next_principal_redemption\"", + "values%7#0" + ] + }, + "3208": { + "op": "app_global_put", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0" + ] + }, + "3209": { + "op": "bytec 20 // \"initial_exchange_amount\"", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "\"initial_exchange_amount\"" + ] + }, + "3211": { + "op": "dig 10", + "defined_out": [ + "\"initial_exchange_amount\"", + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%0#2", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "\"initial_exchange_amount\"", + "values%0#2" + ] + }, + "3213": { + "op": "app_global_put", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0" + ] + }, + "3214": { + "op": "dig 3", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "terms#0 (copy)" + ] + }, + "3216": { + "op": "pushint 786", + "defined_out": [ + "786", + "day_count_convention#0", + "initial_state#0", + "terms#0", + "terms#0 (copy)", + "values%0#2", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "terms#0 (copy)", + "786" + ] + }, + "3219": { + "op": "getbit", + "defined_out": [ + "aggregate%get_bit%1#0", + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%0#2", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "aggregate%get_bit%1#0" + ] + }, + "3220": { + "op": "bytec 34 // \"dynamic_principal_redemption\"", + "defined_out": [ + "\"dynamic_principal_redemption\"", + "aggregate%get_bit%1#0", + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%0#2", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "aggregate%get_bit%1#0", + "\"dynamic_principal_redemption\"" + ] + }, + "3222": { + "op": "swap", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "\"dynamic_principal_redemption\"", + "aggregate%get_bit%1#0" + ] + }, + "3223": { + "op": "app_global_put", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0" + ] + }, + "3224": { + "op": "dig 1", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "initial_state#0 (copy)" + ] + }, + "3226": { + "op": "pushint 16", + "defined_out": [ + "16", + "day_count_convention#0", + "initial_state#0", + "initial_state#0 (copy)", + "terms#0", + "values%0#2", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "initial_state#0 (copy)", + "16" + ] + }, + "3228": { + "op": "extract_uint64", + "defined_out": [ + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%0#2", + "values%10#0", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "values%10#0" + ] + }, + "3229": { + "op": "bytec_3 // \"outstanding_principal\"", + "defined_out": [ + "\"outstanding_principal\"", + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%0#2", + "values%10#0", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "values%10#0", + "\"outstanding_principal\"" + ] + }, + "3230": { + "op": "swap", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "\"outstanding_principal\"", + "values%10#0" + ] + }, + "3231": { + "op": "app_global_put", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0" + ] + }, + "3232": { + "op": "dig 1", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "initial_state#0 (copy)" + ] + }, + "3234": { + "op": "pushint 40", + "defined_out": [ + "40", + "day_count_convention#0", + "initial_state#0", + "initial_state#0 (copy)", + "terms#0", + "values%0#2", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "initial_state#0 (copy)", + "40" + ] + }, + "3236": { + "op": "extract_uint64", + "defined_out": [ + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%0#2", + "values%11#0", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "values%11#0" + ] + }, + "3237": { + "op": "bytec 6 // \"accrued_interest\"", + "defined_out": [ + "\"accrued_interest\"", + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%0#2", + "values%11#0", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "values%11#0", + "\"accrued_interest\"" + ] + }, + "3239": { + "op": "swap", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "\"accrued_interest\"", + "values%11#0" + ] + }, + "3240": { + "op": "app_global_put", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0" + ] + }, + "3241": { + "op": "dig 1", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "initial_state#0 (copy)" + ] + }, + "3243": { + "op": "intc_3 // 32", + "defined_out": [ + "32", + "day_count_convention#0", + "initial_state#0", + "initial_state#0 (copy)", + "terms#0", + "values%0#2", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "initial_state#0 (copy)", + "32" + ] + }, + "3244": { + "op": "extract_uint64", + "defined_out": [ + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%0#2", + "values%12#0", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "values%12#0" + ] + }, + "3245": { + "op": "bytec 9 // \"nominal_interest_rate\"", + "defined_out": [ + "\"nominal_interest_rate\"", + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%0#2", + "values%12#0", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "values%12#0", + "\"nominal_interest_rate\"" + ] + }, + "3247": { + "op": "swap", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "\"nominal_interest_rate\"", + "values%12#0" + ] + }, + "3248": { + "op": "app_global_put", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0" + ] + }, + "3249": { + "op": "dig 1", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "initial_state#0 (copy)" + ] + }, + "3251": { + "op": "pushint 24", + "defined_out": [ + "24", + "day_count_convention#0", + "initial_state#0", + "initial_state#0 (copy)", + "terms#0", + "values%0#2", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "initial_state#0 (copy)", + "24" + ] + }, + "3253": { + "op": "extract_uint64", + "defined_out": [ + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%0#2", + "values%13#0", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "values%13#0" + ] + }, + "3254": { + "op": "bytec 7 // \"interest_calculation_base\"", + "defined_out": [ + "\"interest_calculation_base\"", + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%0#2", + "values%13#0", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "values%13#0", + "\"interest_calculation_base\"" + ] + }, + "3256": { + "op": "swap", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "\"interest_calculation_base\"", + "values%13#0" + ] + }, + "3257": { + "op": "app_global_put", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0" + ] + }, + "3258": { + "op": "dig 3", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "terms#0 (copy)" + ] + }, + "3260": { + "op": "pushint 58", + "defined_out": [ + "58", + "day_count_convention#0", + "initial_state#0", + "terms#0", + "terms#0 (copy)", + "values%0#2", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "terms#0 (copy)", + "58" + ] + }, + "3262": { + "op": "extract_uint64", + "defined_out": [ + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%0#2", + "values%14#0", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "values%14#0" + ] + }, + "3263": { + "op": "bytec 35 // \"rate_reset_spread\"", + "defined_out": [ + "\"rate_reset_spread\"", + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%0#2", + "values%14#0", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "values%14#0", + "\"rate_reset_spread\"" + ] + }, + "3265": { + "op": "swap", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "\"rate_reset_spread\"", + "values%14#0" + ] + }, + "3266": { + "op": "app_global_put", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0" + ] + }, + "3267": { + "op": "dig 3", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "terms#0 (copy)" + ] + }, + "3269": { + "op": "pushint 66", + "defined_out": [ + "66", + "day_count_convention#0", + "initial_state#0", + "terms#0", + "terms#0 (copy)", + "values%0#2", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "terms#0 (copy)", + "66" + ] + }, + "3271": { + "op": "extract_uint64", + "defined_out": [ + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%0#2", + "values%15#0", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "values%15#0" + ] + }, + "3272": { + "op": "bytec 36 // \"rate_reset_multiplier\"", + "defined_out": [ + "\"rate_reset_multiplier\"", + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%0#2", + "values%15#0", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "values%15#0", + "\"rate_reset_multiplier\"" + ] + }, + "3274": { + "op": "swap", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "\"rate_reset_multiplier\"", + "values%15#0" + ] + }, + "3275": { + "op": "app_global_put", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0" + ] + }, + "3276": { + "op": "dig 3", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "terms#0 (copy)" + ] + }, + "3278": { + "op": "pushint 74", + "defined_out": [ + "74", + "day_count_convention#0", + "initial_state#0", + "terms#0", + "terms#0 (copy)", + "values%0#2", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "terms#0 (copy)", + "74" + ] + }, + "3280": { + "op": "extract_uint64", + "defined_out": [ + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%0#2", + "values%16#0", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "values%16#0" + ] + }, + "3281": { + "op": "bytec 29 // \"rate_reset_floor\"", + "defined_out": [ + "\"rate_reset_floor\"", + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%0#2", + "values%16#0", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "values%16#0", + "\"rate_reset_floor\"" + ] + }, + "3283": { + "op": "swap", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "\"rate_reset_floor\"", + "values%16#0" + ] + }, + "3284": { + "op": "app_global_put", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0" + ] + }, + "3285": { + "op": "dig 3", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "terms#0 (copy)" + ] + }, + "3287": { + "op": "pushint 82", + "defined_out": [ + "82", + "day_count_convention#0", + "initial_state#0", + "terms#0", + "terms#0 (copy)", + "values%0#2", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "terms#0 (copy)", + "82" + ] + }, + "3289": { + "op": "extract_uint64", + "defined_out": [ + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%0#2", + "values%17#0", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "values%17#0" + ] + }, + "3290": { + "op": "bytec 30 // \"rate_reset_cap\"", + "defined_out": [ + "\"rate_reset_cap\"", + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%0#2", + "values%17#0", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "values%17#0", + "\"rate_reset_cap\"" + ] + }, + "3292": { + "op": "swap", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "\"rate_reset_cap\"", + "values%17#0" + ] + }, + "3293": { + "op": "app_global_put", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0" + ] + }, + "3294": { + "op": "dig 3", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "terms#0 (copy)" + ] + }, + "3296": { + "op": "pushint 90", + "defined_out": [ + "90", + "day_count_convention#0", + "initial_state#0", + "terms#0", + "terms#0 (copy)", + "values%0#2", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "terms#0 (copy)", + "90" + ] + }, + "3298": { + "op": "extract_uint64", + "defined_out": [ + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%0#2", + "values%18#0", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "values%18#0" + ] + }, + "3299": { + "op": "bytec 37 // \"rate_reset_next\"", + "defined_out": [ + "\"rate_reset_next\"", + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%0#2", + "values%18#0", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "values%18#0", + "\"rate_reset_next\"" + ] + }, + "3301": { + "op": "swap", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "\"rate_reset_next\"", + "values%18#0" + ] + }, + "3302": { + "op": "app_global_put", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0" + ] + }, + "3303": { + "op": "dig 3", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "terms#0 (copy)" + ] + }, + "3305": { + "op": "pushint 784", + "defined_out": [ + "784", + "day_count_convention#0", + "initial_state#0", + "terms#0", + "terms#0 (copy)", + "values%0#2", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "terms#0 (copy)", + "784" + ] + }, + "3308": { + "op": "getbit", + "defined_out": [ + "aggregate%get_bit%2#0", + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%0#2", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "aggregate%get_bit%2#0" + ] + }, + "3309": { + "op": "bytec 38 // \"has_rate_reset_floor\"", + "defined_out": [ + "\"has_rate_reset_floor\"", + "aggregate%get_bit%2#0", + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%0#2", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "aggregate%get_bit%2#0", + "\"has_rate_reset_floor\"" + ] + }, + "3311": { + "op": "swap", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "\"has_rate_reset_floor\"", + "aggregate%get_bit%2#0" + ] + }, + "3312": { + "op": "app_global_put", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0" + ] + }, + "3313": { + "op": "dig 3", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "terms#0 (copy)" + ] + }, + "3315": { + "op": "pushint 785", + "defined_out": [ + "785", + "day_count_convention#0", + "initial_state#0", + "terms#0", + "terms#0 (copy)", + "values%0#2", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "terms#0 (copy)", + "785" + ] + }, + "3318": { + "op": "getbit", + "defined_out": [ + "aggregate%get_bit%3#0", + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%0#2", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "aggregate%get_bit%3#0" + ] + }, + "3319": { + "op": "bytec 39 // \"has_rate_reset_cap\"", + "defined_out": [ + "\"has_rate_reset_cap\"", + "aggregate%get_bit%3#0", + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%0#2", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "aggregate%get_bit%3#0", + "\"has_rate_reset_cap\"" + ] + }, + "3321": { + "op": "swap", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "\"has_rate_reset_cap\"", + "aggregate%get_bit%3#0" + ] + }, + "3322": { + "op": "app_global_put", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0" + ] + }, + "3323": { + "op": "uncover 3", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "terms#0" + ] + }, + "3325": { + "op": "pushint 99", + "defined_out": [ + "99", + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%0#2", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "terms#0", + "99" + ] + }, + "3327": { + "op": "extract_uint64", + "defined_out": [ + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%0#2", + "values%21#0", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "values%21#0" + ] + }, + "3328": { + "op": "bytec 5 // \"fixed_point_scale\"", + "defined_out": [ + "\"fixed_point_scale\"", + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%0#2", + "values%21#0", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "values%21#0", + "\"fixed_point_scale\"" + ] + }, + "3330": { + "op": "swap", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "\"fixed_point_scale\"", + "values%21#0" + ] + }, + "3331": { + "op": "app_global_put", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "initial_state#0", + "values%6#0" + ] + }, + "3332": { + "op": "dig 1", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "initial_state#0 (copy)" + ] + }, + "3334": { + "op": "intc_2 // 8", + "defined_out": [ + "8", + "day_count_convention#0", + "initial_state#0", + "initial_state#0 (copy)", + "terms#0", + "values%0#2", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "initial_state#0 (copy)", + "8" + ] + }, + "3335": { + "op": "extract_uint64", + "defined_out": [ + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%0#2", + "values%22#0", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "values%22#0" + ] + }, + "3336": { + "op": "bytec_2 // \"event_cursor\"", + "defined_out": [ + "\"event_cursor\"", + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%0#2", + "values%22#0", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "values%22#0", + "\"event_cursor\"" + ] + }, + "3337": { + "op": "swap", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "\"event_cursor\"", + "values%22#0" + ] + }, + "3338": { + "op": "app_global_put", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "initial_state#0", + "values%6#0" + ] + }, + "3339": { + "op": "dig 1", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "initial_state#0 (copy)" + ] + }, + "3341": { + "op": "pushint 56", + "defined_out": [ + "56", + "day_count_convention#0", + "initial_state#0", + "initial_state#0 (copy)", + "terms#0", + "values%0#2", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "initial_state#0 (copy)", + "56" + ] + }, + "3343": { + "op": "extract_uint64", + "defined_out": [ + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%0#2", + "values%23#0", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "values%23#0" + ] + }, + "3344": { + "op": "bytec 16 // \"cumulative_interest_index\"", + "defined_out": [ + "\"cumulative_interest_index\"", + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%0#2", + "values%23#0", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "values%23#0", + "\"cumulative_interest_index\"" + ] + }, + "3346": { + "op": "swap", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "\"cumulative_interest_index\"", + "values%23#0" + ] + }, + "3347": { + "op": "app_global_put", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "initial_state#0", + "values%6#0" + ] + }, + "3348": { + "op": "dig 1", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "initial_state#0 (copy)" + ] + }, + "3350": { + "op": "pushint 64", + "defined_out": [ + "64", + "day_count_convention#0", + "initial_state#0", + "initial_state#0 (copy)", + "terms#0", + "values%0#2", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "initial_state#0 (copy)", + "64" + ] + }, + "3352": { + "op": "extract_uint64", + "defined_out": [ + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%0#2", + "values%24#0", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "values%24#0" + ] + }, + "3353": { + "op": "bytec 17 // \"cumulative_principal_index\"", + "defined_out": [ + "\"cumulative_principal_index\"", + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%0#2", + "values%24#0", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "values%24#0", + "\"cumulative_principal_index\"" + ] + }, + "3355": { + "op": "swap", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "\"cumulative_principal_index\"", + "values%24#0" + ] + }, + "3356": { + "op": "app_global_put", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "initial_state#0", + "values%6#0" + ] + }, + "3357": { + "op": "bytec 15 // \"reserved_interest\"", + "defined_out": [ + "\"reserved_interest\"", + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%0#2", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "\"reserved_interest\"" + ] + }, + "3359": { + "op": "intc_0 // 0", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "\"reserved_interest\"", + "0" + ] + }, + "3360": { + "op": "app_global_put", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "initial_state#0", + "values%6#0" + ] + }, + "3361": { + "op": "bytec 11 // \"reserved_principal\"", + "defined_out": [ + "\"reserved_principal\"", + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%0#2", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "\"reserved_principal\"" + ] + }, + "3363": { + "op": "intc_0 // 0", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "\"reserved_principal\"", + "0" + ] + }, + "3364": { + "op": "app_global_put", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "initial_state#0", + "values%6#0" + ] + }, + "3365": { + "op": "dig 2", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "values%5#0 (copy)" + ] + }, + "3367": { + "op": "global LatestTimestamp", + "defined_out": [ + "day_count_convention#0", + "initial_state#0", + "terms#0", + "tmp%3#1", + "values%0#2", + "values%5#0", + "values%5#0 (copy)", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "values%5#0 (copy)", + "tmp%3#1" + ] + }, + "3369": { + "op": ">", + "defined_out": [ + "day_count_convention#0", + "initial_state#0", + "terms#0", + "tmp%4#1", + "values%0#2", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "tmp%4#1" + ] + }, + "3370": { + "error": "IED must be set in the future", + "op": "assert // IED must be set in the future", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "initial_state#0", + "values%6#0" + ] + }, + "3371": { + "op": "swap", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "values%6#0", + "initial_state#0" + ] + }, + "3372": { + "op": "intc_0 // 0", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "values%6#0", + "initial_state#0", + "0" + ] + }, + "3373": { + "op": "extract_uint64", + "defined_out": [ + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%0#2", + "values%27#0", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "values%6#0", + "values%27#0" + ] + }, + "3374": { + "op": "dig 2", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "values%6#0", + "values%27#0", + "values%5#0 (copy)" + ] + }, + "3376": { + "op": "<", + "defined_out": [ + "day_count_convention#0", + "initial_state#0", + "terms#0", + "tmp%5#1", + "values%0#2", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "values%6#0", + "tmp%5#1" + ] + }, + "3377": { + "error": "IED must be set in the future", + "op": "assert // IED must be set in the future", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "values%6#0" + ] + }, + "3378": { + "op": "<", + "defined_out": [ + "day_count_convention#0", + "initial_state#0", + "terms#0", + "tmp%6#0", + "values%0#2" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "tmp%6#0" + ] + }, + "3379": { + "error": "IED must be set in the future", + "op": "assert // IED must be set in the future", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0" + ] + }, + "3380": { + "op": "dig 2", + "defined_out": [ + "day_count_convention#0", + "initial_state#0", + "prospectus#0", + "terms#0", + "values%0#2" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "prospectus#0" + ] + }, + "3382": { + "op": "extract 0 32", + "defined_out": [ + "aggregate%extract%23#0", + "day_count_convention#0", + "initial_state#0", + "prospectus#0", + "terms#0", + "values%0#2" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "aggregate%extract%23#0" + ] + }, + "3385": { + "op": "bytec 42 // \"prospectus_hash\"", + "defined_out": [ + "\"prospectus_hash\"", + "aggregate%extract%23#0", + "day_count_convention#0", + "initial_state#0", + "prospectus#0", + "terms#0", + "values%0#2" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "aggregate%extract%23#0", + "\"prospectus_hash\"" + ] + }, + "3387": { + "op": "swap", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "\"prospectus_hash\"", + "aggregate%extract%23#0" + ] + }, + "3388": { + "op": "app_global_put", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0" + ] + }, + "3389": { + "op": "dig 1", + "defined_out": [ + "day_count_convention#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "terms#0", + "values%0#2" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "substring3%0#0" + ] + }, + "3391": { + "op": "extract 2 0", + "defined_out": [ + "day_count_convention#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "terms#0", + "values%0#2", + "values%1#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%1#0" + ] + }, + "3394": { + "op": "bytec 43 // \"prospectus_url\"", + "defined_out": [ + "\"prospectus_url\"", + "day_count_convention#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "terms#0", + "values%0#2", + "values%1#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%1#0", + "\"prospectus_url\"" + ] + }, + "3396": { + "op": "swap", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "\"prospectus_url\"", + "values%1#0" + ] + }, + "3397": { + "op": "app_global_put", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0" + ] + }, + "3398": { + "op": "global LatestTimestamp", + "defined_out": [ + "day_count_convention#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "terms#0", + "tmp%1#1", + "values%0#2" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "tmp%1#1" + ] + }, + "3400": { + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%0#0", + "day_count_convention#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "terms#0", + "values%0#2" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "aggregate%val_as_bytes%0#0" + ] + }, + "3401": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "aggregate%val_as_bytes%0#0", + "day_count_convention#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "terms#0", + "values%0#2" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "aggregate%val_as_bytes%0#0", + "0x151f7c75" + ] + }, + "3402": { + "op": "swap", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "0x151f7c75", + "aggregate%val_as_bytes%0#0" + ] + }, + "3403": { + "op": "concat", + "defined_out": [ + "day_count_convention#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "terms#0", + "tmp%5#0", + "values%0#2" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "tmp%5#0" + ] + }, + "3404": { + "op": "log", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0" + ] + }, + "3405": { + "op": "intc_1 // 1", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "1" + ] + }, + "3406": { + "op": "return", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0" + ] + }, + "3407": { + "block": "contract_config_bool_false@17", + "stack_in": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0" + ], + "op": "intc_0 // 0", + "defined_out": [ + "or_result%0#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "or_result%0#0" + ] + }, + "3408": { + "op": "b contract_config_bool_merge@18" + }, + "3411": { + "block": "contract_config_bool_false@8", + "stack_in": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0" + ], + "op": "intc_0 // 0", + "defined_out": [ + "or_result%0#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "or_result%0#0" + ] + }, + "3412": { + "op": "b contract_config_bool_merge@9" + }, + "3415": { + "subroutine": "modules.kernel.ActusKernelModule.contract_schedule[routing]", + "params": {}, + "block": "contract_schedule", + "stack_in": [], + "op": "intc_0 // 0", + "stack_out": [ + "aggregate%array_trimmed%0#0" + ] + }, + "3416": { + "op": "pushbytes \"\"", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0" + ] + }, + "3418": { + "op": "dupn 3", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0" + ] + }, + "3420": { + "op": "txna ApplicationArgs 1", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "tmp%0#0" + ] + }, + "3423": { + "op": "dup", + "defined_out": [ + "tmp%0#0", + "tmp%0#0 (copy)" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "tmp%0#0", + "tmp%0#0 (copy)" + ] + }, + "3424": { + "op": "len", + "defined_out": [ + "len%0#0", + "tmp%0#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "tmp%0#0", + "len%0#0" + ] + }, + "3425": { + "op": "intc_2 // 8", + "defined_out": [ + "8", + "len%0#0", + "tmp%0#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "tmp%0#0", + "len%0#0", + "8" + ] + }, + "3426": { + "op": "==", + "defined_out": [ + "eq%0#0", + "tmp%0#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "tmp%0#0", + "eq%0#0" + ] + }, + "3427": { + "error": "invalid number of bytes for arc4.uint64", + "op": "assert // invalid number of bytes for arc4.uint64", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "tmp%0#0" + ] + }, + "3428": { + "op": "btoi", + "defined_out": [ + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0" + ] + }, + "3429": { + "op": "dup", + "defined_out": [ + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "schedule_page_index#0" + ] + }, + "3430": { + "op": "txna ApplicationArgs 2", + "defined_out": [ + "schedule_page_index#0", + "tmp%2#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "schedule_page_index#0", + "tmp%2#0" + ] + }, + "3433": { + "op": "dup", + "defined_out": [ + "schedule_page_index#0", + "tmp%2#0", + "tmp%2#0 (copy)" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "schedule_page_index#0", + "tmp%2#0", + "tmp%2#0 (copy)" + ] + }, + "3434": { + "op": "len", + "defined_out": [ + "len%1#0", + "schedule_page_index#0", + "tmp%2#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "schedule_page_index#0", + "tmp%2#0", + "len%1#0" + ] + }, + "3435": { + "op": "intc_1 // 1", + "defined_out": [ + "1", + "len%1#0", + "schedule_page_index#0", + "tmp%2#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "schedule_page_index#0", + "tmp%2#0", + "len%1#0", + "1" + ] + }, + "3436": { + "op": "==", + "defined_out": [ + "eq%1#0", + "schedule_page_index#0", + "tmp%2#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "schedule_page_index#0", + "tmp%2#0", + "eq%1#0" + ] + }, + "3437": { + "error": "invalid number of bytes for arc4.bool", + "op": "assert // invalid number of bytes for arc4.bool", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "schedule_page_index#0", + "tmp%2#0" + ] + }, + "3438": { + "op": "intc_0 // 0", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "schedule_page_index#0", + "tmp%2#0", + "0" + ] + }, + "3439": { + "op": "getbit", + "defined_out": [ + "is_last_page#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "schedule_page_index#0", + "is_last_page#0" + ] + }, + "3440": { + "op": "swap", + "defined_out": [ + "is_last_page#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page_index#0" + ] + }, + "3441": { + "op": "txna ApplicationArgs 3" + }, + "3444": { + "op": "dup", + "defined_out": [ + "is_last_page#0", + "schedule_page#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page_index#0", + "schedule_page#0", + "schedule_page#0" + ] + }, + "3445": { + "op": "cover 2", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "schedule_page_index#0", + "schedule_page#0" + ] + }, + "3447": { + "op": "dup", + "defined_out": [ + "is_last_page#0", + "schedule_page#0", + "schedule_page#0 (copy)", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "schedule_page_index#0", + "schedule_page#0", + "schedule_page#0 (copy)" + ] + }, + "3448": { + "op": "intc_0 // 0", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "schedule_page_index#0", + "schedule_page#0", + "schedule_page#0 (copy)", + "0" + ] + }, + "3449": { + "error": "invalid array length header", + "op": "extract_uint16 // on error: invalid array length header", + "defined_out": [ + "is_last_page#0", + "page_length#0", + "schedule_page#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "schedule_page_index#0", + "schedule_page#0", + "page_length#0" + ] + }, + "3450": { + "op": "dup", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "schedule_page_index#0", + "schedule_page#0", + "page_length#0", + "page_length#0" + ] + }, + "3451": { + "op": "cover 3", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "schedule_page_index#0", + "schedule_page#0", + "page_length#0" + ] + }, + "3453": { + "op": "dup", + "defined_out": [ + "is_last_page#0", + "page_length#0", + "page_length#0 (copy)", + "schedule_page#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "schedule_page_index#0", + "schedule_page#0", + "page_length#0", + "page_length#0 (copy)" + ] + }, + "3454": { + "op": "pushint 65", + "defined_out": [ + "65", + "is_last_page#0", + "page_length#0", + "page_length#0 (copy)", + "schedule_page#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "schedule_page_index#0", + "schedule_page#0", + "page_length#0", + "page_length#0 (copy)", + "65" + ] + }, + "3456": { + "op": "*", + "defined_out": [ + "is_last_page#0", + "mul%0#0", + "page_length#0", + "schedule_page#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "schedule_page_index#0", + "schedule_page#0", + "page_length#0", + "mul%0#0" + ] + }, + "3457": { + "op": "pushint 2", + "defined_out": [ + "2", + "is_last_page#0", + "mul%0#0", + "page_length#0", + "schedule_page#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "schedule_page_index#0", + "schedule_page#0", + "page_length#0", + "mul%0#0", + "2" + ] + }, + "3459": { + "op": "+", + "defined_out": [ + "add%0#0", + "is_last_page#0", + "page_length#0", + "schedule_page#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "schedule_page_index#0", + "schedule_page#0", + "page_length#0", + "add%0#0" + ] + }, + "3460": { + "op": "uncover 2", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "schedule_page_index#0", + "page_length#0", + "add%0#0", + "schedule_page#0" + ] + }, + "3462": { + "op": "len", + "defined_out": [ + "add%0#0", + "is_last_page#0", + "len%2#0", + "page_length#0", + "schedule_page#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "schedule_page_index#0", + "page_length#0", + "add%0#0", + "len%2#0" + ] + }, + "3463": { + "op": "==", + "defined_out": [ + "eq%2#0", + "is_last_page#0", + "page_length#0", + "schedule_page#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "schedule_page_index#0", + "page_length#0", + "eq%2#0" + ] + }, + "3464": { + "error": "invalid number of bytes for arc4.dynamic_array", + "op": "assert // invalid number of bytes for arc4.dynamic_array", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "schedule_page_index#0", + "page_length#0" + ] + }, + "3465": { + "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", + "op": "callsub _assert_caller_is_arranger" + }, + "3468": { + "op": "intc_0 // 0", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "schedule_page_index#0", + "page_length#0", + "0" + ] + }, + "3469": { + "op": "bytec 12 // \"contract_type\"", + "defined_out": [ + "\"contract_type\"", + "0", + "is_last_page#0", + "page_length#0", + "schedule_page#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "schedule_page_index#0", + "page_length#0", + "0", + "\"contract_type\"" + ] + }, + "3471": { + "op": "app_global_get_ex", + "defined_out": [ + "contract_type#0", + "is_last_page#0", + "maybe_exists%0#0", + "page_length#0", + "schedule_page#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "schedule_page_index#0", + "page_length#0", + "contract_type#0", + "maybe_exists%0#0" + ] + }, + "3472": { + "op": "swap", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "schedule_page_index#0", + "page_length#0", + "maybe_exists%0#0", + "contract_type#0" + ] + }, + "3473": { + "op": "cover 3", + "defined_out": [ + "contract_type#0", + "is_last_page#0", + "maybe_exists%0#0", + "page_length#0", + "schedule_page#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "schedule_page_index#0", + "page_length#0", + "maybe_exists%0#0" + ] + }, + "3475": { + "error": "check self.contract_type exists", + "op": "assert // check self.contract_type exists", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "schedule_page_index#0", + "page_length#0" + ] + }, + "3476": { + "op": "intc_0 // 0", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "schedule_page_index#0", + "page_length#0", + "0" + ] + }, + "3477": { + "op": "bytec_1 // \"status\"", + "defined_out": [ + "\"status\"", + "0", + "contract_type#0", + "is_last_page#0", + "page_length#0", + "schedule_page#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "schedule_page_index#0", + "page_length#0", + "0", + "\"status\"" + ] + }, + "3478": { + "op": "app_global_get_ex", + "defined_out": [ + "contract_type#0", + "is_last_page#0", + "maybe_exists%0#0", + "maybe_value%0#1", + "page_length#0", + "schedule_page#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "schedule_page_index#0", + "page_length#0", + "maybe_value%0#1", + "maybe_exists%0#0" + ] + }, + "3479": { + "error": "check self.status exists", + "op": "assert // check self.status exists", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "schedule_page_index#0", + "page_length#0", + "maybe_value%0#1" + ] + }, + "3480": { + "op": "!", + "defined_out": [ + "contract_type#0", + "is_last_page#0", + "page_length#0", + "schedule_page#0", + "schedule_page_index#0", + "tmp%0#2" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "schedule_page_index#0", + "page_length#0", + "tmp%0#2" + ] + }, + "3481": { + "error": "D-ASA already configured", + "op": "assert // D-ASA already configured", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "schedule_page_index#0", + "page_length#0" + ] + }, + "3482": { + "op": "dup", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "schedule_page_index#0", + "page_length#0", + "page_length#0 (copy)" + ] + }, + "3483": { + "op": "pushint 16", + "defined_out": [ + "16", + "contract_type#0", + "is_last_page#0", + "page_length#0", + "page_length#0 (copy)", + "schedule_page#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "schedule_page_index#0", + "page_length#0", + "page_length#0 (copy)", + "16" + ] + }, + "3485": { + "op": "<=", + "defined_out": [ + "contract_type#0", + "is_last_page#0", + "page_length#0", + "schedule_page#0", + "schedule_page_index#0", + "tmp%2#1" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "schedule_page_index#0", + "page_length#0", + "tmp%2#1" + ] + }, + "3486": { + "error": "Invalid schedule page", + "op": "assert // Invalid schedule page", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "schedule_page_index#0", + "page_length#0" + ] + }, + "3487": { + "op": "intc_0 // 0", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "schedule_page_index#0", + "page_length#0", + "0" + ] + }, + "3488": { + "op": "bytec 20 // \"initial_exchange_amount\"", + "defined_out": [ + "\"initial_exchange_amount\"", + "0", + "contract_type#0", + "is_last_page#0", + "page_length#0", + "schedule_page#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "schedule_page_index#0", + "page_length#0", + "0", + "\"initial_exchange_amount\"" + ] + }, + "3490": { + "op": "app_global_get_ex", + "defined_out": [ + "contract_type#0", + "is_last_page#0", + "maybe_exists%1#0", + "maybe_value%1#0", + "page_length#0", + "schedule_page#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "schedule_page_index#0", + "page_length#0", + "maybe_value%1#0", + "maybe_exists%1#0" + ] + }, + "3491": { + "error": "check self.initial_exchange_amount exists", + "op": "assert // check self.initial_exchange_amount exists", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "schedule_page_index#0", + "page_length#0", + "maybe_value%1#0" + ] + }, + "3492": { + "error": "D-ASA terms not configured", + "op": "assert // D-ASA terms not configured", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "schedule_page_index#0", + "page_length#0" + ] + }, + "3493": { + "op": "swap", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_length#0", + "schedule_page_index#0" + ] + }, + "3494": { + "op": "pushint 16", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_length#0", + "schedule_page_index#0", + "16" + ] + }, + "3496": { + "op": "*", + "defined_out": [ + "contract_type#0", + "is_last_page#0", + "page_cursor#0", + "page_length#0", + "schedule_page#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_length#0", + "page_cursor#0" + ] + }, + "3497": { + "op": "swap", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "page_length#0" + ] + }, + "3498": { + "op": "pushint 100", + "defined_out": [ + "100", + "contract_type#0", + "is_last_page#0", + "page_cursor#0", + "page_length#0", + "schedule_page#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "page_length#0", + "100" + ] + }, + "3500": { + "op": "*", + "defined_out": [ + "contract_type#0", + "is_last_page#0", + "page_cursor#0", + "page_length#0", + "schedule_page#0", + "schedule_page_index#0", + "tmp%6#1" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "tmp%6#1" + ] + }, + "3501": { + "op": "pushint 1510", + "defined_out": [ + "1510", + "contract_type#0", + "is_last_page#0", + "page_cursor#0", + "page_length#0", + "schedule_page#0", + "schedule_page_index#0", + "tmp%6#1" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "tmp%6#1", + "1510" + ] + }, + "3504": { + "op": "+", + "defined_out": [ + "contract_type#0", + "is_last_page#0", + "page_cursor#0", + "page_length#0", + "required_budget_with_buffer#0", + "schedule_page#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0" + ] + }, + "3505": { + "block": "contract_schedule_while_top@2", + "stack_in": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0" + ], + "op": "dup" + }, + "3506": { + "op": "global OpcodeBudget", + "defined_out": [ + "required_budget_with_buffer#0", + "tmp%1#1" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "required_budget_with_buffer#0", + "tmp%1#1" + ] + }, + "3508": { + "op": ">", + "defined_out": [ + "required_budget_with_buffer#0", + "tmp%2#1" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "tmp%2#1" + ] + }, + "3509": { + "op": "bz contract_schedule_after_while@5", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0" + ] + }, + "3512": { + "op": "itxn_begin" + }, + "3513": { + "op": "pushint 6 // appl", + "defined_out": [ + "appl", + "required_budget_with_buffer#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "appl" + ] + }, + "3515": { + "op": "itxn_field TypeEnum", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0" + ] + }, + "3517": { + "op": "pushint 5 // DeleteApplication", + "defined_out": [ + "DeleteApplication", + "required_budget_with_buffer#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "DeleteApplication" + ] + }, + "3519": { + "op": "itxn_field OnCompletion", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0" + ] + }, + "3521": { + "op": "bytec 47 // 0x068101", + "defined_out": [ + "0x068101", + "required_budget_with_buffer#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "0x068101" + ] + }, + "3523": { + "op": "itxn_field ApprovalProgram", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0" + ] + }, + "3525": { + "op": "bytec 47 // 0x068101", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "0x068101" + ] + }, + "3527": { + "op": "itxn_field ClearStateProgram", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0" + ] + }, + "3529": { + "op": "intc_0 // 0", + "defined_out": [ + "0", + "required_budget_with_buffer#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "0" + ] + }, + "3530": { + "op": "itxn_field Fee", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0" + ] + }, + "3532": { + "op": "itxn_submit" + }, + "3533": { + "op": "b contract_schedule_while_top@2" + }, + "3536": { + "block": "contract_schedule_after_while@5", + "stack_in": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0" + ], + "op": "intc_0 // 0", + "defined_out": [ + "index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "index#0" + ] + }, + "3537": { + "op": "bury 10", + "defined_out": [ + "index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0" + ] + }, + "3539": { + "block": "contract_schedule_while_top@6", + "stack_in": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0" + ], + "op": "dig 9", + "defined_out": [ + "index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "index#0" + ] + }, + "3541": { + "op": "dig 4", + "defined_out": [ + "index#0", + "page_length#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "index#0", + "page_length#0" + ] + }, + "3543": { + "op": "<", + "defined_out": [ + "index#0", + "page_length#0", + "tmp%8#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "tmp%8#0" + ] + }, + "3544": { + "op": "bz contract_schedule_after_while@15", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0" + ] + }, + "3547": { + "op": "dig 4", + "defined_out": [ + "index#0", + "page_length#0", + "schedule_page#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "schedule_page#0" + ] + }, + "3549": { + "op": "extract 2 0", + "defined_out": [ + "aggregate%array_trimmed%0#0", + "index#0", + "page_length#0", + "schedule_page#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "aggregate%array_trimmed%0#0" + ] + }, + "3552": { + "op": "dup", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "aggregate%array_trimmed%0#0", + "aggregate%array_trimmed%0#0" + ] + }, + "3553": { + "op": "bury 13", + "defined_out": [ + "aggregate%array_trimmed%0#0", + "index#0", + "page_length#0", + "schedule_page#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "aggregate%array_trimmed%0#0" + ] + }, + "3555": { + "op": "dig 10", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "aggregate%array_trimmed%0#0", + "index#0" + ] + }, + "3557": { + "op": "dup", + "defined_out": [ + "aggregate%array_trimmed%0#0", + "index#0", + "index#0 (copy)", + "page_length#0", + "schedule_page#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "aggregate%array_trimmed%0#0", + "index#0 (copy)", + "index#0 (copy)" + ] + }, + "3558": { + "op": "cover 2", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "index#0", + "aggregate%array_trimmed%0#0", + "index#0 (copy)" + ] + }, + "3560": { + "op": "pushint 65", + "defined_out": [ + "65", + "aggregate%array_trimmed%0#0", + "index#0", + "index#0 (copy)", + "page_length#0", + "schedule_page#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "index#0", + "aggregate%array_trimmed%0#0", + "index#0 (copy)", + "65" + ] + }, + "3562": { + "op": "*", + "defined_out": [ + "aggregate%array_trimmed%0#0", + "aggregate%bytes_offset%0#0", + "index#0", + "page_length#0", + "schedule_page#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "index#0", + "aggregate%array_trimmed%0#0", + "aggregate%bytes_offset%0#0" + ] + }, + "3563": { + "op": "pushint 65", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "index#0", + "aggregate%array_trimmed%0#0", + "aggregate%bytes_offset%0#0", + "65" + ] + }, + "3565": { + "error": "index access is out of bounds", + "op": "extract3 // on error: index access is out of bounds", + "defined_out": [ + "aggregate%array_trimmed%0#0", + "aggregate%encoded_element%0#0", + "index#0", + "page_length#0", + "schedule_page#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "index#0", + "aggregate%encoded_element%0#0" + ] + }, + "3566": { + "op": "dup", + "defined_out": [ + "aggregate%array_trimmed%0#0", + "aggregate%encoded_element%0#0", + "aggregate%encoded_element%0#0 (copy)", + "index#0", + "page_length#0", + "schedule_page#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "index#0", + "aggregate%encoded_element%0#0", + "aggregate%encoded_element%0#0 (copy)" + ] + }, + "3567": { + "op": "intc_2 // 8", + "defined_out": [ + "8", + "aggregate%array_trimmed%0#0", + "aggregate%encoded_element%0#0", + "aggregate%encoded_element%0#0 (copy)", + "index#0", + "page_length#0", + "schedule_page#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "index#0", + "aggregate%encoded_element%0#0", + "aggregate%encoded_element%0#0 (copy)", + "8" + ] + }, + "3568": { + "op": "getbyte", + "defined_out": [ + "aggregate%array_trimmed%0#0", + "aggregate%encoded_element%0#0", + "entry_event_type#0", + "index#0", + "page_length#0", + "schedule_page#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "index#0", + "aggregate%encoded_element%0#0", + "entry_event_type#0" + ] + }, + "3569": { + "op": "dup", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "index#0", + "aggregate%encoded_element%0#0", + "entry_event_type#0", + "entry_event_type#0 (copy)" + ] + }, + "3570": { + "op": "cover 2", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "index#0", + "entry_event_type#0", + "aggregate%encoded_element%0#0", + "entry_event_type#0" + ] + }, + "3572": { + "op": "bury 14", + "defined_out": [ + "aggregate%array_trimmed%0#0", + "aggregate%encoded_element%0#0", + "entry_event_type#0", + "index#0", + "page_length#0", + "schedule_page#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "index#0", + "entry_event_type#0", + "aggregate%encoded_element%0#0" + ] + }, + "3574": { + "op": "dup", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "index#0", + "entry_event_type#0", + "aggregate%encoded_element%0#0", + "aggregate%encoded_element%0#0 (copy)" + ] + }, + "3575": { + "op": "intc_0 // 0", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "index#0", + "entry_event_type#0", + "aggregate%encoded_element%0#0", + "aggregate%encoded_element%0#0 (copy)", + "0" + ] + }, + "3576": { + "op": "extract_uint64", + "defined_out": [ + "aggregate%array_trimmed%0#0", + "aggregate%encoded_element%0#0", + "entry_event_type#0", + "index#0", + "page_length#0", + "schedule_page#0", + "values%0#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "index#0", + "entry_event_type#0", + "aggregate%encoded_element%0#0", + "values%0#0" + ] + }, + "3577": { + "op": "dup", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "index#0", + "entry_event_type#0", + "aggregate%encoded_element%0#0", + "values%0#0", + "values%0#0" + ] + }, + "3578": { + "op": "bury 13", + "defined_out": [ + "aggregate%array_trimmed%0#0", + "aggregate%encoded_element%0#0", + "entry_event_type#0", + "index#0", + "page_length#0", + "schedule_page#0", + "values%0#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "index#0", + "entry_event_type#0", + "aggregate%encoded_element%0#0", + "values%0#0" + ] + }, + "3580": { + "op": "dig 5", + "defined_out": [ + "aggregate%array_trimmed%0#0", + "aggregate%encoded_element%0#0", + "entry_event_type#0", + "index#0", + "page_cursor#0", + "page_length#0", + "schedule_page#0", + "values%0#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "index#0", + "entry_event_type#0", + "aggregate%encoded_element%0#0", + "values%0#0", + "page_cursor#0" + ] + }, + "3582": { + "op": "uncover 4", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "entry_event_type#0", + "aggregate%encoded_element%0#0", + "values%0#0", + "page_cursor#0", + "index#0" + ] + }, + "3584": { + "op": "+", + "defined_out": [ + "aggregate%array_trimmed%0#0", + "aggregate%encoded_element%0#0", + "entry_event_type#0", + "index#0", + "page_cursor#0", + "page_length#0", + "schedule_page#0", + "tmp%10#0", + "values%0#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "entry_event_type#0", + "aggregate%encoded_element%0#0", + "values%0#0", + "tmp%10#0" + ] + }, + "3585": { + "op": "dig 1", + "defined_out": [ + "aggregate%array_trimmed%0#0", + "aggregate%encoded_element%0#0", + "entry_event_type#0", + "index#0", + "page_cursor#0", + "page_length#0", + "schedule_page#0", + "tmp%10#0", + "values%0#0", + "values%0#0 (copy)" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "entry_event_type#0", + "aggregate%encoded_element%0#0", + "values%0#0", + "tmp%10#0", + "values%0#0 (copy)" + ] + }, + "3587": { + "op": "==", + "defined_out": [ + "aggregate%array_trimmed%0#0", + "aggregate%encoded_element%0#0", + "entry_event_type#0", + "index#0", + "page_cursor#0", + "page_length#0", + "schedule_page#0", + "tmp%11#0", + "values%0#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "entry_event_type#0", + "aggregate%encoded_element%0#0", + "values%0#0", + "tmp%11#0" + ] + }, + "3588": { + "error": "Invalid event id", + "op": "assert // Invalid event id", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "entry_event_type#0", + "aggregate%encoded_element%0#0", + "values%0#0" + ] + }, + "3589": { + "op": "dig 5", + "defined_out": [ + "aggregate%array_trimmed%0#0", + "aggregate%encoded_element%0#0", + "contract_type#0", + "entry_event_type#0", + "index#0", + "page_cursor#0", + "page_length#0", + "schedule_page#0", + "values%0#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "entry_event_type#0", + "aggregate%encoded_element%0#0", + "values%0#0", + "contract_type#0" + ] + }, + "3591": { + "op": "uncover 3", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "aggregate%encoded_element%0#0", + "values%0#0", + "contract_type#0", + "entry_event_type#0" + ] + }, + "3593": { + "callsub": "modules.kernel.ActusKernelModule._assert_event_allowed_for_contract_type", + "op": "callsub _assert_event_allowed_for_contract_type", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "aggregate%encoded_element%0#0", + "values%0#0" + ] + }, + "3596": { + "op": "swap", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "values%0#0", + "aggregate%encoded_element%0#0" + ] + }, + "3597": { + "op": "pushint 9", + "defined_out": [ + "9", + "aggregate%array_trimmed%0#0", + "aggregate%encoded_element%0#0", + "contract_type#0", + "entry_event_type#0", + "index#0", + "page_cursor#0", + "page_length#0", + "schedule_page#0", + "values%0#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "values%0#0", + "aggregate%encoded_element%0#0", + "9" + ] + }, + "3599": { + "op": "extract_uint64", + "defined_out": [ + "aggregate%array_trimmed%0#0", + "contract_type#0", + "entry_event_type#0", + "index#0", + "page_cursor#0", + "page_length#0", + "schedule_page#0", + "values%0#0", + "values%1#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "values%0#0", + "values%1#0" + ] + }, + "3600": { + "op": "dup", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "values%0#0", + "values%1#0", + "values%1#0" + ] + }, + "3601": { + "op": "bury 10", + "defined_out": [ + "aggregate%array_trimmed%0#0", + "contract_type#0", + "entry_event_type#0", + "index#0", + "page_cursor#0", + "page_length#0", + "schedule_page#0", + "values%0#0", + "values%1#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "values%0#0", + "values%1#0" + ] + }, + "3603": { + "error": "Invalid ACTUS configuration", + "op": "assert // Invalid ACTUS configuration", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "values%0#0" + ] + }, + "3604": { + "op": "bz contract_schedule_after_if_else@12", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0" + ] + }, + "3607": { + "op": "dig 9", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "index#0" + ] + }, + "3609": { + "op": "bz contract_schedule_else_body@10", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0" + ] + }, + "3612": { + "op": "dig 9", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "index#0" + ] + }, + "3614": { + "op": "intc_1 // 1", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "index#0", + "1" + ] + }, + "3615": { + "op": "-", + "defined_out": [ + "aggregate%array_trimmed%0#0", + "contract_type#0", + "entry_event_type#0", + "index#0", + "page_cursor#0", + "page_length#0", + "schedule_page#0", + "tmp%15#0", + "values%0#0", + "values%1#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "tmp%15#0" + ] + }, + "3616": { + "op": "pushint 65", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "tmp%15#0", + "65" + ] + }, + "3618": { + "op": "*", + "defined_out": [ + "aggregate%array_trimmed%0#0", + "aggregate%bytes_offset%3#0", + "contract_type#0", + "entry_event_type#0", + "index#0", + "page_cursor#0", + "page_length#0", + "schedule_page#0", + "values%0#0", + "values%1#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "aggregate%bytes_offset%3#0" + ] + }, + "3619": { + "op": "dig 12", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "aggregate%bytes_offset%3#0", + "aggregate%array_trimmed%0#0" + ] + }, + "3621": { + "op": "swap", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "aggregate%array_trimmed%0#0", + "aggregate%bytes_offset%3#0" + ] + }, + "3622": { + "op": "pushint 65", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "aggregate%array_trimmed%0#0", + "aggregate%bytes_offset%3#0", + "65" + ] + }, + "3624": { + "error": "index access is out of bounds", + "op": "extract3 // on error: index access is out of bounds", + "defined_out": [ + "aggregate%array_trimmed%0#0", + "contract_type#0", + "entry_event_type#0", + "index#0", + "page_cursor#0", + "page_length#0", + "previous_entry#0", + "schedule_page#0", + "values%0#0", + "values%1#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "previous_entry#0" + ] + }, + "3625": { + "block": "contract_schedule_after_if_else@11", + "stack_in": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "previous_entry#0" + ], + "op": "pushint 9", + "defined_out": [ + "9", + "previous_entry#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "previous_entry#0", + "9" + ] + }, + "3627": { + "op": "extract_uint64", + "defined_out": [ + "values%3#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "values%3#0" + ] + }, + "3628": { + "op": "dig 8", + "defined_out": [ + "values%1#0", + "values%3#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "values%3#0", + "values%1#0" + ] + }, + "3630": { + "op": "<=", + "defined_out": [ + "tmp%22#0", + "values%1#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "tmp%22#0" + ] + }, + "3631": { + "error": "Time events must be sorted in strictly ascending order", + "op": "assert // Time events must be sorted in strictly ascending order", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0" + ] + }, + "3632": { + "block": "contract_schedule_after_if_else@12", + "stack_in": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0" + ], + "op": "dig 8", + "defined_out": [ + "values%0#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "values%0#0" + ] + }, + "3634": { + "op": "bnz contract_schedule_after_if_else@14", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0" + ] + }, + "3637": { + "op": "dig 10", + "defined_out": [ + "entry_event_type#0", + "values%0#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "entry_event_type#0" + ] + }, + "3639": { + "op": "intc_1 // 1", + "defined_out": [ + "1", + "entry_event_type#0", + "values%0#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "entry_event_type#0", + "1" + ] + }, + "3640": { + "op": "==", + "defined_out": [ + "entry_event_type#0", + "tmp%24#0", + "values%0#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "tmp%24#0" + ] + }, + "3641": { + "error": "Invalid ACTUS configuration", + "op": "assert // Invalid ACTUS configuration", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0" + ] + }, + "3642": { + "block": "contract_schedule_after_if_else@14", + "stack_in": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0" + ], + "op": "dig 9", + "defined_out": [ + "index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "index#0" + ] + }, + "3644": { + "op": "intc_1 // 1", + "defined_out": [ + "1", + "index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "index#0", + "1" + ] + }, + "3645": { + "op": "+", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "index#0" + ] + }, + "3646": { + "op": "bury 10", + "defined_out": [ + "index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0" + ] + }, + "3648": { + "op": "b contract_schedule_while_top@6" + }, + "3651": { + "block": "contract_schedule_else_body@10", + "stack_in": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0" + ], + "op": "dig 6", + "defined_out": [ + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "schedule_page_index#0" + ] + }, + "3653": { + "op": "dup", + "defined_out": [ + "schedule_page_index#0", + "schedule_page_index#0 (copy)" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "schedule_page_index#0", + "schedule_page_index#0 (copy)" + ] + }, + "3654": { + "error": "Invalid event id", + "op": "assert // Invalid event id", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "schedule_page_index#0" + ] + }, + "3655": { + "op": "intc_1 // 1", + "defined_out": [ + "1", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "schedule_page_index#0", + "1" + ] + }, + "3656": { + "op": "-", + "defined_out": [ + "previous_page_index#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "previous_page_index#0" + ] + }, + "3657": { + "op": "itob", + "defined_out": [ + "encoded_value%0#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "encoded_value%0#0" + ] + }, + "3658": { + "op": "bytec 31 // 0x5323", + "defined_out": [ + "0x5323", + "encoded_value%0#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "encoded_value%0#0", + "0x5323" + ] + }, + "3660": { + "op": "swap", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "0x5323", + "encoded_value%0#0" + ] + }, + "3661": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%0#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "box_prefixed_key%0#0" + ] + }, + "3662": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%0#0", + "box_prefixed_key%0#0 (copy)", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "box_prefixed_key%0#0", + "box_prefixed_key%0#0 (copy)" + ] + }, + "3663": { + "op": "box_len", + "defined_out": [ + "_%0#0", + "box_prefixed_key%0#0", + "maybe_exists%2#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "box_prefixed_key%0#0", + "_%0#0", + "maybe_exists%2#0" + ] + }, + "3664": { + "op": "bury 1", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "box_prefixed_key%0#0", + "maybe_exists%2#0" + ] + }, + "3666": { + "error": "Invalid schedule page", + "op": "assert // Invalid schedule page", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "box_prefixed_key%0#0" + ] + }, + "3667": { + "op": "dup", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "box_prefixed_key%0#0", + "box_prefixed_key%0#0 (copy)" + ] + }, + "3668": { + "op": "intc_0 // 0", + "defined_out": [ + "0", + "box_prefixed_key%0#0", + "box_prefixed_key%0#0 (copy)", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "box_prefixed_key%0#0", + "box_prefixed_key%0#0 (copy)", + "0" + ] + }, + "3669": { + "op": "pushint 2", + "defined_out": [ + "0", + "2", + "box_prefixed_key%0#0", + "box_prefixed_key%0#0 (copy)", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "box_prefixed_key%0#0", + "box_prefixed_key%0#0 (copy)", + "0", + "2" + ] + }, + "3671": { + "op": "box_extract", + "defined_out": [ + "box%box_extract%0#0", + "box_prefixed_key%0#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "box_prefixed_key%0#0", + "box%box_extract%0#0" + ] + }, + "3672": { + "op": "btoi", + "defined_out": [ + "box%array_length%0#0", + "box_prefixed_key%0#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "box_prefixed_key%0#0", + "box%array_length%0#0" + ] + }, + "3673": { + "op": "dup", + "defined_out": [ + "box%array_length%0#0", + "box%array_length%0#0 (copy)", + "box_prefixed_key%0#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "box_prefixed_key%0#0", + "box%array_length%0#0", + "box%array_length%0#0 (copy)" + ] + }, + "3674": { + "error": "Invalid schedule page", + "op": "assert // Invalid schedule page", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "box_prefixed_key%0#0", + "box%array_length%0#0" + ] + }, + "3675": { + "op": "intc_1 // 1", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "box_prefixed_key%0#0", + "box%array_length%0#0", + "1" + ] + }, + "3676": { + "op": "-", + "defined_out": [ + "box_prefixed_key%0#0", + "schedule_page_index#0", + "tmp%21#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "box_prefixed_key%0#0", + "tmp%21#0" + ] + }, + "3677": { + "op": "pushint 65", + "defined_out": [ + "65", + "box_prefixed_key%0#0", + "schedule_page_index#0", + "tmp%21#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "box_prefixed_key%0#0", + "tmp%21#0", + "65" + ] + }, + "3679": { + "op": "*", + "defined_out": [ + "box%element_offset%0#0", + "box_prefixed_key%0#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "box_prefixed_key%0#0", + "box%element_offset%0#0" + ] + }, + "3680": { + "op": "pushint 2", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "box_prefixed_key%0#0", + "box%element_offset%0#0", + "2" + ] + }, + "3682": { + "op": "+", + "defined_out": [ + "box%offset%0#0", + "box_prefixed_key%0#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "box_prefixed_key%0#0", + "box%offset%0#0" + ] + }, + "3683": { + "op": "pushint 65", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "box_prefixed_key%0#0", + "box%offset%0#0", + "65" + ] + }, + "3685": { + "op": "box_extract", + "defined_out": [ + "previous_entry#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "previous_entry#0" + ] + }, + "3686": { + "op": "b contract_schedule_after_if_else@11" + }, + "3689": { + "block": "contract_schedule_after_while@15", + "stack_in": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0" + ], + "op": "dig 6", + "defined_out": [ + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "schedule_page_index#0" + ] + }, + "3691": { + "op": "itob", + "defined_out": [ + "encoded_value%0#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "encoded_value%0#0" + ] + }, + "3692": { + "op": "bytec 31 // 0x5323", + "defined_out": [ + "0x5323", + "encoded_value%0#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "encoded_value%0#0", + "0x5323" + ] + }, + "3694": { + "op": "swap", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "0x5323", + "encoded_value%0#0" + ] + }, + "3695": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%0#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "box_prefixed_key%0#0" + ] + }, + "3696": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%0#0", + "box_prefixed_key%0#0 (copy)", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "box_prefixed_key%0#0", + "box_prefixed_key%0#0 (copy)" + ] + }, + "3697": { + "op": "box_del", + "defined_out": [ + "box_prefixed_key%0#0", + "schedule_page_index#0", + "{box_del}" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "box_prefixed_key%0#0", + "{box_del}" + ] + }, + "3698": { + "op": "pop", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "box_prefixed_key%0#0" + ] + }, + "3699": { + "op": "dig 5", + "defined_out": [ + "box_prefixed_key%0#0", + "schedule_page#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "box_prefixed_key%0#0", + "schedule_page#0" + ] + }, + "3701": { + "op": "box_put", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0" + ] + }, + "3702": { + "op": "dig 5", + "defined_out": [ + "is_last_page#0", + "schedule_page#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "is_last_page#0" + ] + }, + "3704": { + "op": "bz contract_schedule_after_if_else@17", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0" + ] + }, + "3707": { + "op": "dig 1", + "defined_out": [ + "is_last_page#0", + "page_cursor#0", + "schedule_page#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "page_cursor#0" + ] + }, + "3709": { + "op": "dig 4", + "defined_out": [ + "is_last_page#0", + "page_cursor#0", + "page_length#0", + "schedule_page#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "page_cursor#0", + "page_length#0" + ] + }, + "3711": { + "op": "+", + "defined_out": [ + "is_last_page#0", + "page_cursor#0", + "page_length#0", + "schedule_page#0", + "schedule_page_index#0", + "tmp%27#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "tmp%27#0" + ] + }, + "3712": { + "op": "bytec 4 // \"schedule_entry_count\"", + "defined_out": [ + "\"schedule_entry_count\"", + "is_last_page#0", + "page_cursor#0", + "page_length#0", + "schedule_page#0", + "schedule_page_index#0", + "tmp%27#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "tmp%27#0", + "\"schedule_entry_count\"" + ] + }, + "3714": { + "op": "swap", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "\"schedule_entry_count\"", + "tmp%27#0" + ] + }, + "3715": { + "op": "app_global_put", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0" + ] + }, + "3716": { + "op": "bytec_1 // \"status\"", + "defined_out": [ + "\"status\"", + "is_last_page#0", + "page_cursor#0", + "page_length#0", + "schedule_page#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "\"status\"" + ] + }, + "3717": { + "op": "pushint 50", + "defined_out": [ + "\"status\"", + "50", + "is_last_page#0", + "page_cursor#0", + "page_length#0", + "schedule_page#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "\"status\"", + "50" + ] + }, + "3719": { + "op": "app_global_put", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0" + ] + }, + "3720": { + "block": "contract_schedule_after_if_else@17", + "stack_in": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0" + ], + "op": "global LatestTimestamp", + "defined_out": [ + "tmp%0#1" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "tmp%0#1" + ] + }, + "3722": { + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%0#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "aggregate%val_as_bytes%0#0" + ] + }, + "3723": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "aggregate%val_as_bytes%0#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "aggregate%val_as_bytes%0#0", + "0x151f7c75" + ] + }, + "3724": { + "op": "swap", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "0x151f7c75", + "aggregate%val_as_bytes%0#0" + ] + }, + "3725": { + "op": "concat", + "defined_out": [ + "tmp%7#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "tmp%7#0" + ] + }, + "3726": { + "op": "log", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0" + ] + }, + "3727": { + "op": "intc_1 // 1", + "defined_out": [ + "1" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0", + "1" + ] + }, + "3728": { + "op": "return", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "index#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "required_budget_with_buffer#0" + ] + }, + "3729": { + "subroutine": "modules.kernel.ActusKernelModule.execute_ied[routing]", + "params": {}, + "block": "execute_ied", + "stack_in": [], + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "0" + ] + }, + "3730": { + "op": "bytec_1 // \"status\"", + "defined_out": [ + "\"status\"", + "0" + ], + "stack_out": [ + "0", + "\"status\"" + ] + }, + "3731": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0" + ], + "stack_out": [ + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "3732": { + "error": "check self.status exists", + "op": "assert // check self.status exists", + "stack_out": [ + "maybe_value%0#0" + ] + }, + "3733": { + "error": "D-ASA not configured", + "op": "assert // D-ASA not configured", + "stack_out": [] + }, + "3734": { + "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", + "op": "callsub _assert_caller_is_arranger" + }, + "3737": { + "callsub": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", + "op": "callsub _assert_is_not_asset_defaulted" + }, + "3740": { + "callsub": "modules.rbac.RbacModule._assert_is_not_asset_suspended", + "op": "callsub _assert_is_not_asset_suspended" + }, + "3743": { + "op": "intc_0 // 0", + "stack_out": [ + "0" + ] + }, + "3744": { + "op": "bytec_2 // \"event_cursor\"", + "defined_out": [ + "\"event_cursor\"", + "0" + ], + "stack_out": [ + "0", + "\"event_cursor\"" + ] + }, + "3745": { + "op": "app_global_get_ex", + "stack_out": [ + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "3746": { + "error": "check self.event_cursor exists", + "op": "assert // check self.event_cursor exists", + "stack_out": [ + "maybe_value%0#0" + ] + }, + "3747": { + "op": "intc_0 // 0", + "stack_out": [ + "maybe_value%0#0", + "0" + ] + }, + "3748": { + "op": "bytec 4 // \"schedule_entry_count\"", + "defined_out": [ + "\"schedule_entry_count\"", + "0", + "maybe_value%0#0" + ], + "stack_out": [ + "maybe_value%0#0", + "0", + "\"schedule_entry_count\"" + ] + }, + "3750": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%1#0", + "maybe_value%0#0", + "maybe_value%1#0" + ], + "stack_out": [ + "maybe_value%0#0", + "maybe_value%1#0", + "maybe_exists%1#0" + ] + }, + "3751": { + "error": "check self.schedule_entry_count exists", + "op": "assert // check self.schedule_entry_count exists", + "stack_out": [ + "maybe_value%0#0", + "maybe_value%1#0" + ] + }, + "3752": { + "op": "dig 1", + "defined_out": [ + "maybe_value%0#0", + "maybe_value%0#0 (copy)", + "maybe_value%1#0" + ], + "stack_out": [ + "maybe_value%0#0", + "maybe_value%1#0", + "maybe_value%0#0 (copy)" + ] + }, + "3754": { + "op": ">", + "defined_out": [ + "maybe_value%0#0", + "tmp%0#1" + ], + "stack_out": [ + "maybe_value%0#0", + "tmp%0#1" + ] + }, + "3755": { + "error": "Invalid event cursor", + "op": "assert // Invalid event cursor", + "stack_out": [ + "maybe_value%0#0" + ] + }, + "3756": { + "callsub": "modules.kernel.ActusKernelModule._get_schedule_entry", + "op": "callsub _get_schedule_entry", + "defined_out": [ + "entry#0" + ], + "stack_out": [ + "entry#0" + ] + }, + "3759": { + "op": "dup", + "defined_out": [ + "entry#0", + "entry#0 (copy)" + ], + "stack_out": [ + "entry#0", + "entry#0 (copy)" + ] + }, + "3760": { + "op": "extract 8 1", + "defined_out": [ + "aggregate%extract%0#0", + "entry#0" + ], + "stack_out": [ + "entry#0", + "aggregate%extract%0#0" + ] + }, + "3763": { + "op": "dup", + "defined_out": [ + "aggregate%extract%0#0", + "aggregate%extract%0#0 (copy)", + "entry#0" + ], + "stack_out": [ + "entry#0", + "aggregate%extract%0#0", + "aggregate%extract%0#0 (copy)" + ] + }, + "3764": { + "op": "pushbytes 0x01", + "defined_out": [ + "0x01", + "aggregate%extract%0#0", + "aggregate%extract%0#0 (copy)", + "entry#0" + ], + "stack_out": [ + "entry#0", + "aggregate%extract%0#0", + "aggregate%extract%0#0 (copy)", + "0x01" + ] + }, + "3767": { + "op": "b==", + "defined_out": [ + "aggregate%extract%0#0", + "entry#0", + "tmp%2#1" + ], + "stack_out": [ + "entry#0", + "aggregate%extract%0#0", + "tmp%2#1" + ] + }, + "3768": { + "error": "Invalid event type", + "op": "assert // Invalid event type", + "stack_out": [ + "entry#0", + "aggregate%extract%0#0" + ] + }, + "3769": { + "op": "dig 1", + "stack_out": [ + "entry#0", + "aggregate%extract%0#0", + "entry#0 (copy)" + ] + }, + "3771": { + "op": "extract 0 8", + "defined_out": [ + "aggregate%extract%0#0", + "aggregate%extract%1#0", + "entry#0" + ], + "stack_out": [ + "entry#0", + "aggregate%extract%0#0", + "aggregate%extract%1#0" + ] + }, + "3774": { + "op": "dig 2", + "stack_out": [ + "entry#0", + "aggregate%extract%0#0", + "aggregate%extract%1#0", + "entry#0 (copy)" + ] + }, + "3776": { + "op": "extract 9 8", + "defined_out": [ + "aggregate%extract%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "entry#0" + ], + "stack_out": [ + "entry#0", + "aggregate%extract%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0" + ] + }, + "3779": { + "op": "dig 3", + "stack_out": [ + "entry#0", + "aggregate%extract%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "entry#0 (copy)" + ] + }, + "3781": { + "op": "extract 17 8", + "defined_out": [ + "aggregate%extract%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "aggregate%extract%3#0", + "entry#0" + ], + "stack_out": [ + "entry#0", + "aggregate%extract%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "aggregate%extract%3#0" + ] + }, + "3784": { + "op": "dig 4", + "stack_out": [ + "entry#0", + "aggregate%extract%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "aggregate%extract%3#0", + "entry#0 (copy)" + ] + }, + "3786": { + "op": "extract 25 8", + "defined_out": [ + "aggregate%extract%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "entry#0" + ], + "stack_out": [ + "entry#0", + "aggregate%extract%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0" + ] + }, + "3789": { + "op": "dig 5", + "stack_out": [ + "entry#0", + "aggregate%extract%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "entry#0 (copy)" + ] + }, + "3791": { + "op": "extract 33 8", + "defined_out": [ + "aggregate%extract%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "entry#0" + ], + "stack_out": [ + "entry#0", + "aggregate%extract%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0" + ] + }, + "3794": { + "op": "dig 6", + "stack_out": [ + "entry#0", + "aggregate%extract%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "entry#0 (copy)" + ] + }, + "3796": { + "op": "extract 41 8", + "defined_out": [ + "aggregate%extract%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "entry#0" + ], + "stack_out": [ + "entry#0", + "aggregate%extract%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0" + ] + }, + "3799": { + "op": "dig 7", + "stack_out": [ + "entry#0", + "aggregate%extract%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "entry#0 (copy)" + ] + }, + "3801": { + "op": "extract 49 8", + "defined_out": [ + "aggregate%extract%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "entry#0" + ], + "stack_out": [ + "entry#0", + "aggregate%extract%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0" + ] + }, + "3804": { + "op": "dig 8", + "stack_out": [ + "entry#0", + "aggregate%extract%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "entry#0 (copy)" + ] + }, + "3806": { + "op": "extract 57 8", + "defined_out": [ + "aggregate%extract%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "entry#0" + ], + "stack_out": [ + "entry#0", + "aggregate%extract%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0" + ] + }, + "3809": { + "op": "uncover 7", + "stack_out": [ + "entry#0", + "aggregate%extract%0#0", + "aggregate%extract%2#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%extract%1#0" + ] + }, + "3811": { + "op": "uncover 8", + "stack_out": [ + "entry#0", + "aggregate%extract%2#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%extract%1#0", + "aggregate%extract%0#0" + ] + }, + "3813": { + "op": "concat", + "defined_out": [ + "aggregate%extract%2#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%head%1#0", + "entry#0" + ], + "stack_out": [ + "entry#0", + "aggregate%extract%2#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%head%1#0" + ] + }, + "3814": { + "op": "uncover 7", + "stack_out": [ + "entry#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%head%1#0", + "aggregate%extract%2#0" + ] + }, + "3816": { + "op": "concat", + "defined_out": [ + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%head%2#0", + "entry#0" + ], + "stack_out": [ + "entry#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%head%2#0" + ] + }, + "3817": { + "op": "uncover 6", + "stack_out": [ + "entry#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%head%2#0", + "aggregate%extract%3#0" + ] + }, + "3819": { + "op": "concat", + "defined_out": [ + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%head%3#0", + "entry#0" + ], + "stack_out": [ + "entry#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%head%3#0" + ] + }, + "3820": { + "op": "uncover 5", + "stack_out": [ + "entry#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%head%3#0", + "aggregate%extract%4#0" + ] + }, + "3822": { + "op": "concat", + "defined_out": [ + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%head%4#0", + "entry#0" + ], + "stack_out": [ + "entry#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%head%4#0" + ] + }, + "3823": { + "op": "intc_0 // 0", + "stack_out": [ + "entry#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%head%4#0", + "0" + ] + }, + "3824": { + "op": "itob", + "defined_out": [ + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%head%4#0", + "aggregate%val_as_bytes%4#0", + "entry#0" + ], + "stack_out": [ + "entry#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%head%4#0", + "aggregate%val_as_bytes%4#0" + ] + }, + "3825": { + "op": "concat", + "defined_out": [ + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%head%5#0", + "entry#0" + ], + "stack_out": [ + "entry#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%head%5#0" + ] + }, + "3826": { + "op": "uncover 4", + "stack_out": [ + "entry#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%head%5#0", + "aggregate%extract%5#0" + ] + }, + "3828": { + "op": "concat", + "defined_out": [ + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%head%6#0", + "entry#0" + ], + "stack_out": [ + "entry#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%head%6#0" + ] + }, + "3829": { + "op": "uncover 3", + "stack_out": [ + "entry#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%head%6#0", + "aggregate%extract%6#0" + ] + }, + "3831": { + "op": "concat", + "defined_out": [ + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%head%7#0", + "entry#0" + ], + "stack_out": [ + "entry#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%head%7#0" + ] + }, + "3832": { + "op": "uncover 2", + "stack_out": [ + "entry#0", + "aggregate%extract%8#0", + "aggregate%head%7#0", + "aggregate%extract%7#0" + ] + }, + "3834": { + "op": "concat", + "defined_out": [ + "aggregate%extract%8#0", + "aggregate%head%8#0", + "entry#0" + ], + "stack_out": [ + "entry#0", + "aggregate%extract%8#0", + "aggregate%head%8#0" + ] + }, + "3835": { + "op": "swap", + "stack_out": [ + "entry#0", + "aggregate%head%8#0", + "aggregate%extract%8#0" + ] + }, + "3836": { + "op": "concat", + "defined_out": [ + "aggregate%head%9#0", + "entry#0" + ], + "stack_out": [ + "entry#0", + "aggregate%head%9#0" + ] + }, + "3837": { + "callsub": "modules.kernel.ActusKernelModule._apply_non_cash_schedule_entry", + "op": "callsub _apply_non_cash_schedule_entry", + "defined_out": [ + "_apply_non_cash_schedule_entry%1#0", + "entry#0" + ], + "stack_out": [ + "entry#0", + "_apply_non_cash_schedule_entry%1#0" + ] + }, + "3840": { + "op": "popn 2", + "stack_out": [] + }, + "3842": { + "op": "global LatestTimestamp", + "defined_out": [ + "tmp%4#0" + ], + "stack_out": [ + "tmp%4#0" + ] + }, + "3844": { + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%9#0" + ], + "stack_out": [ + "aggregate%val_as_bytes%9#0" + ] + }, + "3845": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "aggregate%val_as_bytes%9#0" + ], + "stack_out": [ + "aggregate%val_as_bytes%9#0", + "0x151f7c75" + ] + }, + "3846": { + "op": "swap", + "stack_out": [ + "0x151f7c75", + "aggregate%val_as_bytes%9#0" + ] + }, + "3847": { + "op": "concat", + "defined_out": [ + "tmp%2#0" + ], + "stack_out": [ + "tmp%2#0" + ] + }, + "3848": { + "op": "log", + "stack_out": [] + }, + "3849": { + "op": "intc_1 // 1", + "defined_out": [ + "1" + ], + "stack_out": [ + "1" + ] + }, + "3850": { + "op": "return", + "stack_out": [] + }, + "3851": { + "subroutine": "modules.kernel.ActusKernelModule.apply_non_cash_event[routing]", + "params": {}, + "block": "apply_non_cash_event", + "stack_in": [], + "op": "intc_0 // 0", + "stack_out": [ + "aggregate%extract%2#0" + ] + }, + "3852": { + "op": "dupn 4", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0" + ] + }, + "3854": { + "op": "pushbytes \"\"", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0" + ] + }, + "3856": { + "op": "dup", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1" + ] + }, + "3857": { + "op": "txna ApplicationArgs 1", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "tmp%0#0" + ] + }, + "3860": { + "op": "dup", + "defined_out": [ + "tmp%0#0", + "tmp%0#0 (copy)" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "tmp%0#0", + "tmp%0#0 (copy)" + ] + }, + "3861": { + "op": "len", + "defined_out": [ + "len%0#0", + "tmp%0#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "tmp%0#0", + "len%0#0" + ] + }, + "3862": { + "op": "intc_2 // 8", + "defined_out": [ + "8", + "len%0#0", + "tmp%0#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "tmp%0#0", + "len%0#0", + "8" + ] + }, + "3863": { + "op": "==", + "defined_out": [ + "eq%0#0", + "tmp%0#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "tmp%0#0", + "eq%0#0" + ] + }, + "3864": { + "error": "invalid number of bytes for arc4.uint64", + "op": "assert // invalid number of bytes for arc4.uint64", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "tmp%0#0" + ] + }, + "3865": { + "op": "btoi", + "defined_out": [ + "event_id#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0" + ] + }, + "3866": { + "op": "txna ApplicationArgs 2" + }, + "3869": { + "op": "dupn 2", + "defined_out": [ + "event_id#0", + "payload#0", + "payload#0 (copy)" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "payload#0", + "payload#0 (copy)" + ] + }, + "3871": { + "op": "len", + "defined_out": [ + "event_id#0", + "len%1#0", + "payload#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "payload#0", + "len%1#0" + ] + }, + "3872": { + "op": "pushint 73", + "defined_out": [ + "73", + "event_id#0", + "len%1#0", + "payload#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "payload#0", + "len%1#0", + "73" + ] + }, + "3874": { + "op": "==", + "defined_out": [ + "eq%1#0", + "event_id#0", + "payload#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "payload#0", + "eq%1#0" + ] + }, + "3875": { + "error": "invalid number of bytes for smart_contracts.abi_types.ObservedEventRequest", + "op": "assert // invalid number of bytes for smart_contracts.abi_types.ObservedEventRequest", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "payload#0" + ] + }, + "3876": { + "op": "intc_0 // 0", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "payload#0", + "0" + ] + }, + "3877": { + "op": "bytec_1 // \"status\"", + "defined_out": [ + "\"status\"", + "0", + "event_id#0", + "payload#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "payload#0", + "0", + "\"status\"" + ] + }, + "3878": { + "op": "app_global_get_ex", + "defined_out": [ + "event_id#0", + "maybe_exists%0#0", + "maybe_value%0#0", + "payload#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "payload#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "3879": { + "error": "check self.status exists", + "op": "assert // check self.status exists", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "payload#0", + "maybe_value%0#0" + ] + }, + "3880": { + "error": "D-ASA not configured", + "op": "assert // D-ASA not configured", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "payload#0" + ] + }, + "3881": { + "callsub": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", + "op": "callsub _assert_is_not_asset_defaulted" + }, + "3884": { + "callsub": "modules.rbac.RbacModule._assert_is_not_asset_suspended", + "op": "callsub _assert_is_not_asset_suspended" + }, + "3887": { + "op": "pushint 65", + "defined_out": [ + "65", + "event_id#0", + "payload#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "payload#0", + "65" + ] + }, + "3889": { + "op": "extract_uint64", + "defined_out": [ + "event_id#0", + "payload#0", + "values%0#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0" + ] + }, + "3890": { + "op": "dup", + "defined_out": [ + "event_id#0", + "payload#0", + "values%0#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "values%0#0" + ] + }, + "3891": { + "op": "pushint 4", + "defined_out": [ + "4", + "event_id#0", + "payload#0", + "values%0#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "values%0#0", + "4" + ] + }, + "3893": { + "op": "&", + "defined_out": [ + "event_id#0", + "payload#0", + "tmp%0#1", + "values%0#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "tmp%0#1" + ] + }, + "3894": { + "op": "bz apply_non_cash_event_after_if_else@3", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0" + ] + }, + "3897": { + "op": "intc_0 // 0", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "0" + ] + }, + "3898": { + "op": "bytec 12 // \"contract_type\"", + "defined_out": [ + "\"contract_type\"", + "0", + "event_id#0", + "payload#0", + "values%0#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "0", + "\"contract_type\"" + ] + }, + "3900": { + "op": "app_global_get_ex", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "3901": { + "error": "check self.contract_type exists", + "op": "assert // check self.contract_type exists", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "maybe_value%0#0" + ] + }, + "3902": { + "op": "pushint 5", + "defined_out": [ + "5", + "event_id#0", + "maybe_value%0#0", + "payload#0", + "values%0#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "maybe_value%0#0", + "5" + ] + }, + "3904": { + "op": "==", + "defined_out": [ + "event_id#0", + "payload#0", + "tmp%0#3", + "values%0#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "tmp%0#3" + ] + }, + "3905": { + "error": "Observed event required to execute this action", + "op": "assert // Observed event required to execute this action", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0" + ] + }, + "3906": { + "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", + "op": "callsub _assert_caller_is_arranger" + }, + "3909": { + "op": "intc_0 // 0", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "0" + ] + }, + "3910": { + "op": "bytec 12 // \"contract_type\"", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "0", + "\"contract_type\"" + ] + }, + "3912": { + "op": "app_global_get_ex", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "3913": { + "error": "check self.contract_type exists", + "op": "assert // check self.contract_type exists", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "maybe_value%0#0" + ] + }, + "3914": { + "op": "dup", + "defined_out": [ + "event_id#0", + "maybe_value%0#0", + "maybe_value%0#0 (copy)", + "payload#0", + "values%0#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "maybe_value%0#0", + "maybe_value%0#0 (copy)" + ] + }, + "3915": { + "op": "pushint 5", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "maybe_value%0#0", + "maybe_value%0#0 (copy)", + "5" + ] + }, + "3917": { + "op": "==", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "maybe_value%0#0", + "tmp%0#3" + ] + }, + "3918": { + "error": "Observed event required to execute this action", + "op": "assert // Observed event required to execute this action", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "maybe_value%0#0" + ] + }, + "3919": { + "op": "dig 2", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "maybe_value%0#0", + "payload#0" + ] + }, + "3921": { + "op": "dup", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "maybe_value%0#0", + "payload#0", + "payload#0 (copy)" + ] + }, + "3922": { + "op": "intc_0 // 0", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "maybe_value%0#0", + "payload#0", + "payload#0 (copy)", + "0" + ] + }, + "3923": { + "op": "extract_uint64", + "defined_out": [ + "event_id#0", + "maybe_value%0#0", + "payload#0", + "values%0#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "maybe_value%0#0", + "payload#0", + "values%0#1" + ] + }, + "3924": { + "op": "dup", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "maybe_value%0#0", + "payload#0", + "values%0#1", + "values%0#1" + ] + }, + "3925": { + "op": "bury 7", + "defined_out": [ + "event_id#0", + "maybe_value%0#0", + "payload#0", + "values%0#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "maybe_value%0#0", + "payload#0", + "values%0#1" + ] + }, + "3927": { + "op": "intc_0 // 0", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "maybe_value%0#0", + "payload#0", + "values%0#1", + "0" + ] + }, + "3928": { + "op": "bytec 4 // \"schedule_entry_count\"", + "defined_out": [ + "\"schedule_entry_count\"", + "0", + "event_id#0", + "maybe_value%0#0", + "payload#0", + "values%0#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "maybe_value%0#0", + "payload#0", + "values%0#1", + "0", + "\"schedule_entry_count\"" + ] + }, + "3930": { + "op": "app_global_get_ex", + "defined_out": [ + "event_id#0", + "maybe_exists%0#0", + "maybe_value%0#0", + "maybe_value%0#1", + "payload#0", + "values%0#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "maybe_value%0#0", + "payload#0", + "values%0#1", + "maybe_value%0#1", + "maybe_exists%0#0" + ] + }, + "3931": { + "error": "check self.schedule_entry_count exists", + "op": "assert // check self.schedule_entry_count exists", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "maybe_value%0#0", + "payload#0", + "values%0#1", + "maybe_value%0#1" + ] + }, + "3932": { + "op": "==", + "defined_out": [ + "event_id#0", + "maybe_value%0#0", + "payload#0", + "tmp%1#2", + "values%0#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "maybe_value%0#0", + "payload#0", + "tmp%1#2" + ] + }, + "3933": { + "error": "Invalid event id", + "op": "assert // Invalid event id", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "maybe_value%0#0", + "payload#0" + ] + }, + "3934": { + "op": "dup", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "maybe_value%0#0", + "payload#0", + "payload#0 (copy)" + ] + }, + "3935": { + "op": "extract 8 1", + "defined_out": [ + "aggregate%extract%2#0", + "event_id#0", + "maybe_value%0#0", + "payload#0", + "values%0#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "maybe_value%0#0", + "payload#0", + "aggregate%extract%2#0" + ] + }, + "3938": { + "op": "bury 12", + "defined_out": [ + "aggregate%extract%2#0", + "event_id#0", + "maybe_value%0#0", + "payload#0", + "values%0#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "maybe_value%0#0", + "payload#0" + ] + }, + "3940": { + "op": "intc_2 // 8", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "maybe_value%0#0", + "payload#0", + "8" + ] + }, + "3941": { + "op": "getbyte", + "defined_out": [ + "aggregate%extract%2#0", + "event_id#0", + "maybe_value%0#0", + "payload#0", + "tmp%2#3", + "values%0#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "maybe_value%0#0", + "tmp%2#3" + ] + }, + "3942": { + "callsub": "modules.kernel.ActusKernelModule._assert_event_allowed_for_contract_type", + "op": "callsub _assert_event_allowed_for_contract_type", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0" + ] + }, + "3945": { + "op": "intc_0 // 0", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "0" + ] + }, + "3946": { + "op": "bytec 4 // \"schedule_entry_count\"", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "0", + "\"schedule_entry_count\"" + ] + }, + "3948": { + "op": "app_global_get_ex", + "defined_out": [ + "aggregate%extract%2#0", + "event_id#0", + "event_id#1", + "maybe_exists%2#0", + "payload#0", + "values%0#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "event_id#1", + "maybe_exists%2#0" + ] + }, + "3949": { + "error": "check self.schedule_entry_count exists", + "op": "assert // check self.schedule_entry_count exists", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "event_id#1" + ] + }, + "3950": { + "op": "pushint 16", + "defined_out": [ + "16", + "aggregate%extract%2#0", + "event_id#0", + "event_id#1", + "payload#0", + "values%0#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "event_id#1", + "16" + ] + }, + "3952": { + "op": "/", + "defined_out": [ + "aggregate%extract%2#0", + "event_id#0", + "page_index#0", + "payload#0", + "values%0#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page_index#0" + ] + }, + "3953": { + "op": "pushbytes 0x0000", + "defined_out": [ + "aggregate%extract%2#0", + "event_id#0", + "page#0", + "page_index#0", + "payload#0", + "values%0#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page_index#0", + "page#0" + ] + }, + "3957": { + "op": "bury 7", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page_index#0" + ] + }, + "3959": { + "op": "itob", + "defined_out": [ + "aggregate%extract%2#0", + "encoded_value%0#0", + "event_id#0", + "page#0", + "payload#0", + "values%0#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "encoded_value%0#0" + ] + }, + "3960": { + "op": "bytec 31 // 0x5323", + "defined_out": [ + "0x5323", + "aggregate%extract%2#0", + "encoded_value%0#0", + "event_id#0", + "page#0", + "payload#0", + "values%0#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "encoded_value%0#0", + "0x5323" + ] + }, + "3962": { + "op": "swap", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "0x5323", + "encoded_value%0#0" + ] + }, + "3963": { + "op": "concat", + "defined_out": [ + "aggregate%extract%2#0", + "box_prefixed_key%0#0", + "event_id#0", + "page#0", + "payload#0", + "values%0#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "box_prefixed_key%0#0" + ] + }, + "3964": { + "op": "dup", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "box_prefixed_key%0#0", + "box_prefixed_key%0#0" + ] + }, + "3965": { + "op": "bury 9", + "defined_out": [ + "aggregate%extract%2#0", + "box_prefixed_key%0#0", + "event_id#0", + "page#0", + "payload#0", + "values%0#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "box_prefixed_key%0#0" + ] + }, + "3967": { + "op": "box_len", + "defined_out": [ + "_%0#0", + "aggregate%extract%2#0", + "box_prefixed_key%0#0", + "event_id#0", + "maybe_exists%3#0", + "page#0", + "payload#0", + "values%0#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "_%0#0", + "maybe_exists%3#0" + ] + }, + "3968": { + "op": "bury 1", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "maybe_exists%3#0" + ] + }, + "3970": { + "op": "bz apply_non_cash_event_after_if_else@27", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0" + ] + }, + "3973": { + "op": "dig 7", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "box_prefixed_key%0#0" + ] + }, + "3975": { + "op": "box_get", + "defined_out": [ + "aggregate%box_get%1#0", + "aggregate%extract%2#0", + "box_prefixed_key%0#0", + "event_id#0", + "page#0", + "payload#0", + "values%0#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%box_get%1#0" + ] + }, + "3976": { + "op": "swap", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "aggregate%box_get%1#0", + "page#0" + ] + }, + "3977": { + "op": "bury 7", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "aggregate%box_get%1#0" + ] + }, + "3979": { + "error": "check self.schedule_page entry exists", + "op": "assert // check self.schedule_page entry exists", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0" + ] + }, + "3980": { + "block": "apply_non_cash_event_after_if_else@27", + "stack_in": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0" + ], + "op": "dig 5", + "defined_out": [ + "page#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0" + ] + }, + "3982": { + "op": "dup", + "defined_out": [ + "page#0", + "page#0 (copy)" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "page#0 (copy)" + ] + }, + "3983": { + "op": "intc_0 // 0", + "defined_out": [ + "0", + "page#0", + "page#0 (copy)" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "page#0 (copy)", + "0" + ] + }, + "3984": { + "error": "invalid array length header", + "op": "extract_uint16 // on error: invalid array length header", + "defined_out": [ + "aggregate%array_length%0#0", + "page#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%array_length%0#0" + ] + }, + "3985": { + "op": "dup", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%array_length%0#0 (copy)", + "page#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%array_length%0#0 (copy)" + ] + }, + "3986": { + "op": "pushint 16", + "defined_out": [ + "16", + "aggregate%array_length%0#0", + "aggregate%array_length%0#0 (copy)", + "page#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%array_length%0#0 (copy)", + "16" + ] + }, + "3988": { + "op": "<", + "defined_out": [ + "aggregate%array_length%0#0", + "page#0", + "tmp%5#2" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%array_length%0#0", + "tmp%5#2" + ] + }, + "3989": { + "error": "Invalid schedule page", + "op": "assert // Invalid schedule page", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%array_length%0#0" + ] + }, + "3990": { + "op": "dig 3", + "defined_out": [ + "aggregate%array_length%0#0", + "page#0", + "payload#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%array_length%0#0", + "payload#0" + ] + }, + "3992": { + "op": "dup", + "defined_out": [ + "aggregate%array_length%0#0", + "page#0", + "payload#0", + "payload#0 (copy)" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%array_length%0#0", + "payload#0", + "payload#0 (copy)" + ] + }, + "3993": { + "op": "extract 9 8", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%3#0", + "page#0", + "payload#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%array_length%0#0", + "payload#0", + "aggregate%extract%3#0" + ] + }, + "3996": { + "op": "dig 1", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%array_length%0#0", + "payload#0", + "aggregate%extract%3#0", + "payload#0 (copy)" + ] + }, + "3998": { + "op": "extract 17 8", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "page#0", + "payload#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%array_length%0#0", + "payload#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0" + ] + }, + "4001": { + "op": "dig 2", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%array_length%0#0", + "payload#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "payload#0 (copy)" + ] + }, + "4003": { + "op": "extract 25 8", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "page#0", + "payload#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%array_length%0#0", + "payload#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0" + ] + }, + "4006": { + "op": "dig 3", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%array_length%0#0", + "payload#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "payload#0 (copy)" + ] + }, + "4008": { + "op": "extract 41 8", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "page#0", + "payload#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%array_length%0#0", + "payload#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0" + ] + }, + "4011": { + "op": "dig 4", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%array_length%0#0", + "payload#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "payload#0 (copy)" + ] + }, + "4013": { + "op": "extract 49 8", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "page#0", + "payload#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%array_length%0#0", + "payload#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0" + ] + }, + "4016": { + "op": "uncover 5", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "payload#0" + ] + }, + "4018": { + "op": "extract 57 8", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "page#0", + "payload#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0" + ] + }, + "4021": { + "op": "dig 11", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "page#0", + "payload#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "values%0#1" + ] + }, + "4023": { + "op": "itob", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%val_as_bytes%0#0", + "page#0", + "payload#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%val_as_bytes%0#0" + ] + }, + "4024": { + "op": "dig 18", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%2#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%val_as_bytes%0#0", + "page#0", + "payload#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%val_as_bytes%0#0", + "aggregate%extract%2#0" + ] + }, + "4026": { + "op": "concat", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%2#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%head%1#0", + "page#0", + "payload#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%head%1#0" + ] + }, + "4027": { + "op": "uncover 6", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%head%1#0", + "aggregate%extract%3#0" + ] + }, + "4029": { + "op": "concat", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%2#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%head%2#0", + "page#0", + "payload#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%head%2#0" + ] + }, + "4030": { + "op": "uncover 5", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%head%2#0", + "aggregate%extract%4#0" + ] + }, + "4032": { + "op": "concat", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%2#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%head%3#0", + "page#0", + "payload#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%head%3#0" + ] + }, + "4033": { + "op": "uncover 4", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%head%3#0", + "aggregate%extract%5#0" + ] + }, + "4035": { + "op": "concat", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%2#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%head%4#0", + "page#0", + "payload#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%head%4#0" + ] + }, + "4036": { + "op": "uncover 3", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%head%4#0", + "aggregate%extract%6#0" + ] + }, + "4038": { + "op": "concat", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%2#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%head%5#0", + "page#0", + "payload#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%head%5#0" + ] + }, + "4039": { + "op": "uncover 2", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%extract%8#0", + "aggregate%head%5#0", + "aggregate%extract%7#0" + ] + }, + "4041": { + "op": "concat", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%2#0", + "aggregate%extract%8#0", + "aggregate%head%6#0", + "page#0", + "payload#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%extract%8#0", + "aggregate%head%6#0" + ] + }, + "4042": { + "op": "swap", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%head%6#0", + "aggregate%extract%8#0" + ] + }, + "4043": { + "op": "concat", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%2#0", + "aggregate%head%7#0", + "page#0", + "payload#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%head%7#0" + ] + }, + "4044": { + "op": "dig 3", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%2#0", + "aggregate%head%7#0", + "page#0", + "payload#0", + "values%0#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%head%7#0", + "values%0#0" + ] + }, + "4046": { + "op": "itob", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%2#0", + "aggregate%head%7#0", + "aggregate%val_as_bytes%7#0", + "page#0", + "payload#0", + "values%0#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%head%7#0", + "aggregate%val_as_bytes%7#0" + ] + }, + "4047": { + "op": "concat", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%2#0", + "aggregate%head%8#0", + "page#0", + "payload#0", + "values%0#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%head%8#0" + ] + }, + "4048": { + "op": "uncover 2", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "aggregate%array_length%0#0", + "aggregate%head%8#0", + "page#0" + ] + }, + "4050": { + "op": "swap", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "aggregate%array_length%0#0", + "page#0", + "aggregate%head%8#0" + ] + }, + "4051": { + "error": "max array length exceeded", + "op": "concat // on error: max array length exceeded", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%2#0", + "concat%0#0", + "page#0", + "payload#0", + "values%0#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "aggregate%array_length%0#0", + "concat%0#0" + ] + }, + "4052": { + "op": "swap", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "concat%0#0", + "aggregate%array_length%0#0" + ] + }, + "4053": { + "op": "intc_1 // 1", + "defined_out": [ + "1", + "aggregate%array_length%0#0", + "aggregate%extract%2#0", + "concat%0#0", + "page#0", + "payload#0", + "values%0#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "concat%0#0", + "aggregate%array_length%0#0", + "1" + ] + }, + "4054": { + "op": "+", + "defined_out": [ + "add%0#0", + "aggregate%extract%2#0", + "concat%0#0", + "page#0", + "payload#0", + "values%0#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "concat%0#0", + "add%0#0" + ] + }, + "4055": { + "op": "itob", + "defined_out": [ + "aggregate%extract%2#0", + "as_bytes%0#0", + "concat%0#0", + "page#0", + "payload#0", + "values%0#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "concat%0#0", + "as_bytes%0#0" + ] + }, + "4056": { + "op": "extract 6 2", + "defined_out": [ + "aggregate%extract%2#0", + "as_u16_bytes%0#0", + "concat%0#0", + "page#0", + "payload#0", + "values%0#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "concat%0#0", + "as_u16_bytes%0#0" + ] + }, + "4059": { + "op": "replace2 0", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0" + ] + }, + "4061": { + "op": "dig 8", + "defined_out": [ + "aggregate%extract%2#0", + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "box_prefixed_key%0#0" + ] + }, + "4063": { + "op": "dup", + "defined_out": [ + "aggregate%extract%2#0", + "box_prefixed_key%0#0", + "box_prefixed_key%0#0 (copy)", + "page#0", + "payload#0", + "values%0#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "box_prefixed_key%0#0", + "box_prefixed_key%0#0 (copy)" + ] + }, + "4064": { + "op": "box_del", + "defined_out": [ + "aggregate%extract%2#0", + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "values%0#1", + "{box_del}" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "box_prefixed_key%0#0", + "{box_del}" + ] + }, + "4065": { + "op": "pop", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "box_prefixed_key%0#0" + ] + }, + "4066": { + "op": "swap", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "box_prefixed_key%0#0", + "page#0" + ] + }, + "4067": { + "op": "box_put", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0" + ] + }, + "4068": { + "op": "intc_0 // 0", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "0" + ] + }, + "4069": { + "op": "bytec 4 // \"schedule_entry_count\"", + "defined_out": [ + "\"schedule_entry_count\"", + "0", + "aggregate%extract%2#0", + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "0", + "\"schedule_entry_count\"" + ] + }, + "4071": { + "op": "app_global_get_ex", + "defined_out": [ + "aggregate%extract%2#0", + "box_prefixed_key%0#0", + "maybe_exists%4#0", + "maybe_value%3#0", + "page#0", + "payload#0", + "values%0#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "maybe_value%3#0", + "maybe_exists%4#0" + ] + }, + "4072": { + "error": "check self.schedule_entry_count exists", + "op": "assert // check self.schedule_entry_count exists", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "maybe_value%3#0" + ] + }, + "4073": { + "op": "intc_1 // 1", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "maybe_value%3#0", + "1" + ] + }, + "4074": { + "op": "+", + "defined_out": [ + "aggregate%extract%2#0", + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "tmp%8#0", + "values%0#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "tmp%8#0" + ] + }, + "4075": { + "op": "bytec 4 // \"schedule_entry_count\"", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "tmp%8#0", + "\"schedule_entry_count\"" + ] + }, + "4077": { + "op": "swap", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "\"schedule_entry_count\"", + "tmp%8#0" + ] + }, + "4078": { + "op": "app_global_put", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0" + ] + }, + "4079": { + "block": "apply_non_cash_event_after_if_else@3", + "stack_in": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0" + ], + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "0" + ] + }, + "4080": { + "op": "bytec_2 // \"event_cursor\"", + "defined_out": [ + "\"event_cursor\"", + "0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "0", + "\"event_cursor\"" + ] + }, + "4081": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "4082": { + "error": "check self.event_cursor exists", + "op": "assert // check self.event_cursor exists", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "maybe_value%0#0" + ] + }, + "4083": { + "op": "dig 3", + "defined_out": [ + "event_id#0", + "maybe_value%0#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "maybe_value%0#0", + "event_id#0" + ] + }, + "4085": { + "op": "dup" + }, + "4086": { + "op": "uncover 2", + "defined_out": [ + "event_id#0", + "event_id#0 (copy)", + "maybe_value%0#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "event_id#0", + "event_id#0 (copy)", + "maybe_value%0#0" + ] + }, + "4088": { + "op": "==", + "defined_out": [ + "event_id#0", + "tmp%3#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "event_id#0", + "tmp%3#1" + ] + }, + "4089": { + "error": "Invalid event cursor", + "op": "assert // Invalid event cursor", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "event_id#0" + ] + }, + "4090": { + "callsub": "modules.kernel.ActusKernelModule._get_schedule_entry", + "op": "callsub _get_schedule_entry", + "defined_out": [ + "entry#0", + "event_id#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "entry#0" + ] + }, + "4093": { + "op": "dup", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "entry#0", + "entry#0" + ] + }, + "4094": { + "op": "bury 8", + "defined_out": [ + "entry#0", + "event_id#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "entry#0" + ] + }, + "4096": { + "op": "dup", + "defined_out": [ + "entry#0", + "entry#0 (copy)", + "event_id#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "entry#0", + "entry#0 (copy)" + ] + }, + "4097": { + "op": "extract 8 1", + "defined_out": [ + "aggregate%extract%9#0", + "entry#0", + "event_id#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "entry#0", + "aggregate%extract%9#0" + ] + }, + "4100": { + "op": "bury 10", + "defined_out": [ + "aggregate%extract%9#0", + "entry#0", + "event_id#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "entry#0" + ] + }, + "4102": { + "op": "intc_2 // 8", + "defined_out": [ + "8", + "aggregate%extract%9#0", + "entry#0", + "event_id#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "entry#0", + "8" + ] + }, + "4103": { + "op": "getbyte", + "defined_out": [ + "aggregate%extract%9#0", + "entry#0", + "event_id#0", + "event_type#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "event_type#0" + ] + }, + "4104": { + "op": "dup", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "event_type#0", + "event_type#0" + ] + }, + "4105": { + "op": "bury 6", + "defined_out": [ + "aggregate%extract%9#0", + "entry#0", + "event_id#0", + "event_type#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "event_type#0" + ] + }, + "4107": { + "op": "intc_1 // 1", + "defined_out": [ + "1", + "aggregate%extract%9#0", + "entry#0", + "event_id#0", + "event_type#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "event_type#0", + "1" + ] + }, + "4108": { + "op": "==", + "defined_out": [ + "aggregate%extract%9#0", + "entry#0", + "event_id#0", + "event_type#0", + "tmp%0#3" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "tmp%0#3" + ] + }, + "4109": { + "op": "bnz apply_non_cash_event_bool_true@15", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0" + ] + }, + "4112": { + "op": "dig 4", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "event_type#0" + ] + }, + "4114": { + "op": "pushint 4", + "defined_out": [ + "4", + "aggregate%extract%9#0", + "entry#0", + "event_id#0", + "event_type#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "event_type#0", + "4" + ] + }, + "4116": { + "op": "==", + "defined_out": [ + "aggregate%extract%9#0", + "entry#0", + "event_id#0", + "event_type#0", + "tmp%1#2" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "tmp%1#2" + ] + }, + "4117": { + "op": "bnz apply_non_cash_event_bool_true@15", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0" + ] + }, + "4120": { + "op": "dig 4", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "event_type#0" + ] + }, + "4122": { + "op": "pushint 12", + "defined_out": [ + "12", + "aggregate%extract%9#0", + "entry#0", + "event_id#0", + "event_type#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "event_type#0", + "12" + ] + }, + "4124": { + "op": "==", + "defined_out": [ + "aggregate%extract%9#0", + "entry#0", + "event_id#0", + "event_type#0", + "tmp%2#2" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "tmp%2#2" + ] + }, + "4125": { + "op": "bnz apply_non_cash_event_bool_true@15", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0" + ] + }, + "4128": { + "op": "dig 4", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "event_type#0" + ] + }, + "4130": { + "op": "pushint 11", + "defined_out": [ + "11", + "aggregate%extract%9#0", + "entry#0", + "event_id#0", + "event_type#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "event_type#0", + "11" + ] + }, + "4132": { + "op": "==", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "tmp%3#1" + ] + }, + "4133": { + "op": "bnz apply_non_cash_event_bool_true@15", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0" + ] + }, + "4136": { + "op": "dig 4", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "event_type#0" + ] + }, + "4138": { + "op": "pushint 18", + "defined_out": [ + "18", + "aggregate%extract%9#0", + "entry#0", + "event_id#0", + "event_type#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "event_type#0", + "18" + ] + }, + "4140": { + "op": "==", + "defined_out": [ + "aggregate%extract%9#0", + "entry#0", + "event_id#0", + "event_type#0", + "tmp%4#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "tmp%4#1" + ] + }, + "4141": { + "op": "bnz apply_non_cash_event_bool_true@15", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0" + ] + }, + "4144": { + "op": "dig 4", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "event_type#0" + ] + }, + "4146": { + "op": "pushint 5", + "defined_out": [ + "5", + "aggregate%extract%9#0", + "entry#0", + "event_id#0", + "event_type#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "event_type#0", + "5" + ] + }, + "4148": { + "op": "==", + "defined_out": [ + "aggregate%extract%9#0", + "entry#0", + "event_id#0", + "event_type#0", + "tmp%5#2" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "tmp%5#2" + ] + }, + "4149": { + "op": "bz apply_non_cash_event_bool_false@16", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0" + ] + }, + "4152": { + "block": "apply_non_cash_event_bool_true@15", + "stack_in": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0" + ], + "op": "intc_1 // 1", + "defined_out": [ + "or_result%0#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "or_result%0#0" + ] + }, + "4153": { + "error": "Invalid event type", + "block": "apply_non_cash_event_bool_merge@17", + "stack_in": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "or_result%0#0" + ], + "op": "assert // Invalid event type", + "defined_out": [], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0" + ] + }, + "4154": { + "op": "dig 8", + "defined_out": [ + "aggregate%extract%9#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "aggregate%extract%9#0" + ] + }, + "4156": { + "op": "pushbytes 0x01", + "defined_out": [ + "0x01", + "aggregate%extract%9#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "aggregate%extract%9#0", + "0x01" + ] + }, + "4159": { + "op": "b!=", + "defined_out": [ + "aggregate%extract%9#0", + "tmp%7#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "tmp%7#0" + ] + }, + "4160": { + "error": "Invalid event type", + "op": "assert // Invalid event type", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0" + ] + }, + "4161": { + "op": "dig 4", + "defined_out": [ + "aggregate%extract%9#0", + "event_type#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "event_type#0" + ] + }, + "4163": { + "op": "pushint 12", + "defined_out": [ + "12", + "aggregate%extract%9#0", + "event_type#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "event_type#0", + "12" + ] + }, + "4165": { + "op": "==", + "defined_out": [ + "aggregate%extract%9#0", + "event_type#0", + "tmp%0#3" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "tmp%0#3" + ] + }, + "4166": { + "op": "bnz apply_non_cash_event_bool_true@21", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0" + ] + }, + "4169": { + "op": "dig 4", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "event_type#0" + ] + }, + "4171": { + "op": "pushint 11", + "defined_out": [ + "11", + "aggregate%extract%9#0", + "event_type#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "event_type#0", + "11" + ] + }, + "4173": { + "op": "==", + "defined_out": [ + "aggregate%extract%9#0", + "event_type#0", + "tmp%1#2" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "tmp%1#2" + ] + }, + "4174": { + "op": "bz apply_non_cash_event_bool_false@22", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0" + ] + }, + "4177": { + "block": "apply_non_cash_event_bool_true@21", + "stack_in": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0" + ], + "op": "intc_1 // 1", + "defined_out": [ + "or_result%0#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "or_result%0#0" + ] + }, + "4178": { + "block": "apply_non_cash_event_bool_merge@23", + "stack_in": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "or_result%0#0" + ], + "op": "bz apply_non_cash_event_else_body@5", + "defined_out": [], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0" + ] + }, + "4181": { + "op": "bytec 24 // 0x52234f6273657276657223", + "defined_out": [ + "0x52234f6273657276657223" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "0x52234f6273657276657223" + ] + }, + "4183": { + "op": "txn Sender", + "defined_out": [ + "0x52234f6273657276657223", + "tmp%0#2" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "0x52234f6273657276657223", + "tmp%0#2" + ] + }, + "4185": { + "callsub": "modules.rbac.RbacModule._role_is_active", + "op": "callsub _role_is_active", + "defined_out": [ + "tmp%1#2" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "tmp%1#2" + ] + }, + "4188": { + "error": "Not authorized", + "op": "assert // Not authorized", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0" + ] + }, + "4189": { + "block": "apply_non_cash_event_after_if_else@6", + "stack_in": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0" + ], + "op": "dig 6", + "defined_out": [ + "entry#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "entry#0" + ] + }, + "4191": { + "op": "dig 2", + "defined_out": [ + "entry#0", + "payload#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "entry#0", + "payload#0" + ] + }, + "4193": { + "callsub": "modules.kernel.ActusKernelModule._apply_non_cash_schedule_entry", + "op": "callsub _apply_non_cash_schedule_entry" + }, + "4196": { + "op": "popn 2", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0" + ] + }, + "4198": { + "op": "global LatestTimestamp", + "defined_out": [ + "entry#0", + "payload#0", + "tmp%10#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "tmp%10#0" + ] + }, + "4200": { + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%8#0", + "entry#0", + "payload#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "aggregate%val_as_bytes%8#0" + ] + }, + "4201": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "aggregate%val_as_bytes%8#0", + "entry#0", + "payload#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "aggregate%val_as_bytes%8#0", + "0x151f7c75" + ] + }, + "4202": { + "op": "swap", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "0x151f7c75", + "aggregate%val_as_bytes%8#0" + ] + }, + "4203": { + "op": "concat", + "defined_out": [ + "entry#0", + "payload#0", + "tmp%5#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "tmp%5#0" + ] + }, + "4204": { + "op": "log", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0" + ] + }, + "4205": { + "op": "intc_1 // 1", + "defined_out": [ + "1", + "entry#0", + "payload#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "1" + ] + }, + "4206": { + "op": "return", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0" + ] + }, + "4207": { + "block": "apply_non_cash_event_else_body@5", + "stack_in": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0" + ], + "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", + "op": "callsub _assert_caller_is_arranger" + }, + "4210": { + "op": "b apply_non_cash_event_after_if_else@6" + }, + "4213": { + "block": "apply_non_cash_event_bool_false@22", + "stack_in": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0" + ], + "op": "intc_0 // 0", + "defined_out": [ + "or_result%0#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "or_result%0#0" + ] + }, + "4214": { + "op": "b apply_non_cash_event_bool_merge@23" + }, + "4217": { + "block": "apply_non_cash_event_bool_false@16", + "stack_in": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0" + ], + "op": "intc_0 // 0", + "defined_out": [ + "or_result%0#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "or_result%0#0" + ] + }, + "4218": { + "op": "b apply_non_cash_event_bool_merge@17" + }, + "4221": { + "subroutine": "modules.kernel.ActusKernelModule.get_contract_state[routing]", + "params": {}, + "block": "get_contract_state", + "stack_in": [], + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "0" + ] + }, + "4222": { + "op": "bytec_1 // \"status\"", + "defined_out": [ + "\"status\"", + "0" + ], + "stack_out": [ + "0", + "\"status\"" + ] + }, + "4223": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#1" + ], + "stack_out": [ + "maybe_value%0#1", + "maybe_exists%0#0" + ] + }, + "4224": { + "error": "check self.status exists", + "op": "assert // check self.status exists", + "stack_out": [ + "maybe_value%0#1" + ] + }, + "4225": { + "op": "dup", + "defined_out": [ + "maybe_value%0#1", + "maybe_value%0#1 (copy)" + ], + "stack_out": [ + "maybe_value%0#1", + "maybe_value%0#1 (copy)" + ] + }, + "4226": { + "error": "D-ASA not configured", + "op": "assert // D-ASA not configured", + "stack_out": [ + "maybe_value%0#1" + ] + }, + "4227": { + "op": "intc_0 // 0", + "stack_out": [ + "maybe_value%0#1", + "0" + ] + }, + "4228": { + "op": "bytec 12 // \"contract_type\"", + "defined_out": [ + "\"contract_type\"", + "0", + "maybe_value%0#1" + ], + "stack_out": [ + "maybe_value%0#1", + "0", + "\"contract_type\"" + ] + }, + "4230": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0", + "maybe_value%0#1" + ], + "stack_out": [ + "maybe_value%0#1", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "4231": { + "error": "check self.contract_type exists", + "op": "assert // check self.contract_type exists", + "stack_out": [ + "maybe_value%0#1", + "maybe_value%0#0" + ] + }, + "4232": { + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%0#0", + "maybe_value%0#1" + ], + "stack_out": [ + "maybe_value%0#1", + "aggregate%val_as_bytes%0#0" + ] + }, + "4233": { + "op": "dup", + "defined_out": [ + "aggregate%val_as_bytes%0#0", + "aggregate%val_as_bytes%0#0 (copy)", + "maybe_value%0#1" + ], + "stack_out": [ + "maybe_value%0#1", + "aggregate%val_as_bytes%0#0", + "aggregate%val_as_bytes%0#0 (copy)" + ] + }, + "4234": { + "op": "bitlen", + "defined_out": [ + "aggregate%bitlen%0#0", + "aggregate%val_as_bytes%0#0", + "maybe_value%0#1" + ], + "stack_out": [ + "maybe_value%0#1", + "aggregate%val_as_bytes%0#0", + "aggregate%bitlen%0#0" + ] + }, + "4235": { + "op": "intc_2 // 8", + "defined_out": [ + "8", + "aggregate%bitlen%0#0", + "aggregate%val_as_bytes%0#0", + "maybe_value%0#1" + ], + "stack_out": [ + "maybe_value%0#1", + "aggregate%val_as_bytes%0#0", + "aggregate%bitlen%0#0", + "8" + ] + }, + "4236": { + "op": "<=", + "defined_out": [ + "aggregate%no_overflow%0#0", + "aggregate%val_as_bytes%0#0", + "maybe_value%0#1" + ], + "stack_out": [ + "maybe_value%0#1", + "aggregate%val_as_bytes%0#0", + "aggregate%no_overflow%0#0" + ] + }, + "4237": { + "error": "overflow", + "op": "assert // overflow", + "stack_out": [ + "maybe_value%0#1", + "aggregate%val_as_bytes%0#0" + ] + }, + "4238": { + "op": "extract 7 1", + "defined_out": [ + "aggregate%uint8%0#0", + "maybe_value%0#1" + ], + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0" + ] + }, + "4241": { + "op": "intc_0 // 0", + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "0" + ] + }, + "4242": { + "op": "bytec 13 // \"total_units\"", + "defined_out": [ + "\"total_units\"", + "0", + "aggregate%uint8%0#0", + "maybe_value%0#1" + ], + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "0", + "\"total_units\"" + ] + }, + "4244": { + "op": "app_global_get_ex", + "defined_out": [ + "aggregate%uint8%0#0", + "maybe_exists%2#0", + "maybe_value%0#1", + "maybe_value%2#0" + ], + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_exists%2#0" + ] + }, + "4245": { + "error": "check self.total_units exists", + "op": "assert // check self.total_units exists", + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0" + ] + }, + "4246": { + "op": "intc_0 // 0", + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "0" + ] + }, + "4247": { + "op": "bytec 10 // \"reserved_units_total\"", + "defined_out": [ + "\"reserved_units_total\"", + "0", + "aggregate%uint8%0#0", + "maybe_value%0#1", + "maybe_value%2#0" + ], + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "0", + "\"reserved_units_total\"" + ] + }, + "4249": { + "op": "app_global_get_ex", + "defined_out": [ + "aggregate%uint8%0#0", + "maybe_exists%3#0", + "maybe_value%0#1", + "maybe_value%2#0", + "maybe_value%3#0" + ], + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_exists%3#0" + ] + }, + "4250": { + "error": "check self.reserved_units_total exists", + "op": "assert // check self.reserved_units_total exists", + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0" + ] + }, + "4251": { + "op": "intc_0 // 0", + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "0" + ] + }, + "4252": { + "op": "bytec 20 // \"initial_exchange_amount\"", + "defined_out": [ + "\"initial_exchange_amount\"", + "0", + "aggregate%uint8%0#0", + "maybe_value%0#1", + "maybe_value%2#0", + "maybe_value%3#0" + ], + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "0", + "\"initial_exchange_amount\"" + ] + }, + "4254": { + "op": "app_global_get_ex", + "defined_out": [ + "aggregate%uint8%0#0", + "maybe_exists%4#0", + "maybe_value%0#1", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0" + ], + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_exists%4#0" + ] + }, + "4255": { + "error": "check self.initial_exchange_amount exists", + "op": "assert // check self.initial_exchange_amount exists", + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0" + ] + }, + "4256": { + "op": "intc_0 // 0", + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "0" + ] + }, + "4257": { + "op": "bytec_2 // \"event_cursor\"", + "defined_out": [ + "\"event_cursor\"", + "0", + "aggregate%uint8%0#0", + "maybe_value%0#1", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0" + ], + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "0", + "\"event_cursor\"" + ] + }, + "4258": { + "op": "app_global_get_ex", + "defined_out": [ + "aggregate%uint8%0#0", + "maybe_exists%5#0", + "maybe_value%0#1", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0" + ], + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_exists%5#0" + ] + }, + "4259": { + "error": "check self.event_cursor exists", + "op": "assert // check self.event_cursor exists", + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0" + ] + }, + "4260": { + "op": "intc_0 // 0", + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "0" + ] + }, + "4261": { + "op": "bytec 4 // \"schedule_entry_count\"", + "defined_out": [ + "\"schedule_entry_count\"", + "0", + "aggregate%uint8%0#0", + "maybe_value%0#1", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0" + ], + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "0", + "\"schedule_entry_count\"" + ] + }, + "4263": { + "op": "app_global_get_ex", + "defined_out": [ + "aggregate%uint8%0#0", + "maybe_exists%6#0", + "maybe_value%0#1", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0" + ], + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_exists%6#0" + ] + }, + "4264": { + "error": "check self.schedule_entry_count exists", + "op": "assert // check self.schedule_entry_count exists", + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0" + ] + }, + "4265": { + "op": "intc_0 // 0", + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "0" + ] + }, + "4266": { + "op": "bytec_3 // \"outstanding_principal\"", + "defined_out": [ + "\"outstanding_principal\"", + "0", + "aggregate%uint8%0#0", + "maybe_value%0#1", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0" + ], + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "0", + "\"outstanding_principal\"" + ] + }, + "4267": { + "op": "app_global_get_ex", + "defined_out": [ + "aggregate%uint8%0#0", + "maybe_exists%7#0", + "maybe_value%0#1", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0" + ], + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_exists%7#0" + ] + }, + "4268": { + "error": "check self.outstanding_principal exists", + "op": "assert // check self.outstanding_principal exists", + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0" + ] + }, + "4269": { + "op": "intc_0 // 0", + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "0" + ] + }, + "4270": { + "op": "bytec 7 // \"interest_calculation_base\"", + "defined_out": [ + "\"interest_calculation_base\"", + "0", + "aggregate%uint8%0#0", + "maybe_value%0#1", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0" + ], + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "0", + "\"interest_calculation_base\"" + ] + }, + "4272": { + "op": "app_global_get_ex", + "defined_out": [ + "aggregate%uint8%0#0", + "maybe_exists%8#0", + "maybe_value%0#1", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0" + ], + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_exists%8#0" + ] + }, + "4273": { + "error": "check self.interest_calculation_base exists", + "op": "assert // check self.interest_calculation_base exists", + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0" + ] + }, + "4274": { + "op": "intc_0 // 0", + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "0" + ] + }, + "4275": { + "op": "bytec 9 // \"nominal_interest_rate\"", + "defined_out": [ + "\"nominal_interest_rate\"", + "0", + "aggregate%uint8%0#0", + "maybe_value%0#1", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0" + ], + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "0", + "\"nominal_interest_rate\"" + ] + }, + "4277": { + "op": "app_global_get_ex", + "defined_out": [ + "aggregate%uint8%0#0", + "maybe_exists%9#0", + "maybe_value%0#1", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0" + ], + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_exists%9#0" + ] + }, + "4278": { + "error": "check self.nominal_interest_rate exists", + "op": "assert // check self.nominal_interest_rate exists", + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0" + ] + }, + "4279": { + "op": "intc_0 // 0", + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "0" + ] + }, + "4280": { + "op": "bytec 6 // \"accrued_interest\"", + "defined_out": [ + "\"accrued_interest\"", + "0", + "aggregate%uint8%0#0", + "maybe_value%0#1", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0" + ], + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "0", + "\"accrued_interest\"" + ] + }, + "4282": { + "op": "app_global_get_ex", + "defined_out": [ + "aggregate%uint8%0#0", + "maybe_exists%10#0", + "maybe_value%0#1", + "maybe_value%10#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0" + ], + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_exists%10#0" + ] + }, + "4283": { + "error": "check self.accrued_interest exists", + "op": "assert // check self.accrued_interest exists", + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0" + ] + }, + "4284": { + "op": "intc_0 // 0", + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "0" + ] + }, + "4285": { + "op": "bytec 16 // \"cumulative_interest_index\"", + "defined_out": [ + "\"cumulative_interest_index\"", + "0", + "aggregate%uint8%0#0", + "maybe_value%0#1", + "maybe_value%10#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0" + ], + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "0", + "\"cumulative_interest_index\"" + ] + }, + "4287": { + "op": "app_global_get_ex", + "defined_out": [ + "aggregate%uint8%0#0", + "maybe_exists%11#0", + "maybe_value%0#1", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0" + ], + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_exists%11#0" + ] + }, + "4288": { + "error": "check self.cumulative_interest_index exists", + "op": "assert // check self.cumulative_interest_index exists", + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0" + ] + }, + "4289": { + "op": "intc_0 // 0", + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "0" + ] + }, + "4290": { + "op": "bytec 17 // \"cumulative_principal_index\"", + "defined_out": [ + "\"cumulative_principal_index\"", + "0", + "aggregate%uint8%0#0", + "maybe_value%0#1", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0" + ], + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "0", + "\"cumulative_principal_index\"" + ] + }, + "4292": { + "op": "app_global_get_ex", + "defined_out": [ + "aggregate%uint8%0#0", + "maybe_exists%12#0", + "maybe_value%0#1", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0" + ], + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_exists%12#0" + ] + }, + "4293": { + "error": "check self.cumulative_principal_index exists", + "op": "assert // check self.cumulative_principal_index exists", + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0" + ] + }, + "4294": { + "op": "intc_0 // 0", + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "0" + ] + }, + "4295": { + "op": "bytec 15 // \"reserved_interest\"", + "defined_out": [ + "\"reserved_interest\"", + "0", + "aggregate%uint8%0#0", + "maybe_value%0#1", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0" + ], + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "0", + "\"reserved_interest\"" + ] + }, + "4297": { + "op": "app_global_get_ex", + "defined_out": [ + "aggregate%uint8%0#0", + "maybe_exists%13#0", + "maybe_value%0#1", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0" + ], + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_exists%13#0" + ] + }, + "4298": { + "error": "check self.reserved_interest exists", + "op": "assert // check self.reserved_interest exists", + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0" + ] + }, + "4299": { + "op": "intc_0 // 0", + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "0" + ] + }, + "4300": { + "op": "bytec 11 // \"reserved_principal\"", + "defined_out": [ + "\"reserved_principal\"", + "0", + "aggregate%uint8%0#0", + "maybe_value%0#1", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0" + ], + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "0", + "\"reserved_principal\"" + ] + }, + "4302": { + "op": "app_global_get_ex", + "defined_out": [ + "aggregate%uint8%0#0", + "maybe_exists%14#0", + "maybe_value%0#1", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0" + ], + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "maybe_exists%14#0" + ] + }, + "4303": { + "error": "check self.reserved_principal exists", + "op": "assert // check self.reserved_principal exists", + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0" + ] + }, + "4304": { + "op": "uncover 14", + "stack_out": [ + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "maybe_value%0#1" + ] + }, + "4306": { + "op": "itob", + "defined_out": [ + "aggregate%uint8%0#0", + "aggregate%val_as_bytes%1#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0" + ], + "stack_out": [ + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "aggregate%val_as_bytes%1#0" + ] + }, + "4307": { + "op": "uncover 14", + "stack_out": [ + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "aggregate%val_as_bytes%1#0", + "aggregate%uint8%0#0" + ] + }, + "4309": { + "op": "swap", + "stack_out": [ + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "aggregate%uint8%0#0", + "aggregate%val_as_bytes%1#0" + ] + }, + "4310": { + "op": "concat", + "defined_out": [ + "aggregate%head%1#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0" + ], + "stack_out": [ + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "aggregate%head%1#0" + ] + }, + "4311": { + "op": "uncover 13", + "stack_out": [ + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "aggregate%head%1#0", + "maybe_value%2#0" + ] + }, + "4313": { + "op": "itob", + "defined_out": [ + "aggregate%head%1#0", + "aggregate%val_as_bytes%2#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0" + ], + "stack_out": [ + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "aggregate%head%1#0", + "aggregate%val_as_bytes%2#0" + ] + }, + "4314": { + "op": "concat", + "defined_out": [ + "aggregate%head%2#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0" + ], + "stack_out": [ + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "aggregate%head%2#0" + ] + }, + "4315": { + "op": "uncover 12", + "stack_out": [ + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "aggregate%head%2#0", + "maybe_value%3#0" + ] + }, + "4317": { + "op": "itob", + "defined_out": [ + "aggregate%head%2#0", + "aggregate%val_as_bytes%3#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0" + ], + "stack_out": [ + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "aggregate%head%2#0", + "aggregate%val_as_bytes%3#0" + ] + }, + "4318": { + "op": "concat", + "defined_out": [ + "aggregate%head%3#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0" + ], + "stack_out": [ + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "aggregate%head%3#0" + ] + }, + "4319": { + "op": "uncover 11", + "stack_out": [ + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "aggregate%head%3#0", + "maybe_value%4#0" + ] + }, + "4321": { + "op": "itob", + "defined_out": [ + "aggregate%head%3#0", + "aggregate%val_as_bytes%4#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0" + ], + "stack_out": [ + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "aggregate%head%3#0", + "aggregate%val_as_bytes%4#0" + ] + }, + "4322": { + "op": "concat", + "defined_out": [ + "aggregate%head%4#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0" + ], + "stack_out": [ + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "aggregate%head%4#0" + ] + }, + "4323": { + "op": "uncover 10", + "stack_out": [ + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "aggregate%head%4#0", + "maybe_value%5#0" + ] + }, + "4325": { + "op": "itob", + "defined_out": [ + "aggregate%head%4#0", + "aggregate%val_as_bytes%5#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0" + ], + "stack_out": [ + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "aggregate%head%4#0", + "aggregate%val_as_bytes%5#0" + ] + }, + "4326": { + "op": "concat", + "defined_out": [ + "aggregate%head%5#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0" + ], + "stack_out": [ + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "aggregate%head%5#0" + ] + }, + "4327": { + "op": "uncover 9", + "stack_out": [ + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "aggregate%head%5#0", + "maybe_value%6#0" + ] + }, + "4329": { + "op": "itob", + "defined_out": [ + "aggregate%head%5#0", + "aggregate%val_as_bytes%6#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0" + ], + "stack_out": [ + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "aggregate%head%5#0", + "aggregate%val_as_bytes%6#0" + ] + }, + "4330": { + "op": "concat", + "defined_out": [ + "aggregate%head%6#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0" + ], + "stack_out": [ + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "aggregate%head%6#0" + ] + }, + "4331": { + "op": "uncover 8", + "stack_out": [ + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "aggregate%head%6#0", + "maybe_value%7#0" + ] + }, + "4333": { + "op": "itob", + "defined_out": [ + "aggregate%head%6#0", + "aggregate%val_as_bytes%7#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "maybe_value%8#0", + "maybe_value%9#0" + ], + "stack_out": [ + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "aggregate%head%6#0", + "aggregate%val_as_bytes%7#0" + ] + }, + "4334": { + "op": "concat", + "defined_out": [ + "aggregate%head%7#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "maybe_value%8#0", + "maybe_value%9#0" + ], + "stack_out": [ + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "aggregate%head%7#0" + ] + }, + "4335": { + "op": "uncover 7", + "stack_out": [ + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "aggregate%head%7#0", + "maybe_value%8#0" + ] + }, + "4337": { + "op": "itob", + "defined_out": [ + "aggregate%head%7#0", + "aggregate%val_as_bytes%8#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "maybe_value%9#0" + ], + "stack_out": [ + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "aggregate%head%7#0", + "aggregate%val_as_bytes%8#0" + ] + }, + "4338": { + "op": "concat", + "defined_out": [ + "aggregate%head%8#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "maybe_value%9#0" + ], + "stack_out": [ + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "aggregate%head%8#0" + ] + }, + "4339": { + "op": "uncover 6", + "stack_out": [ + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "aggregate%head%8#0", + "maybe_value%9#0" + ] + }, + "4341": { + "op": "itob", + "defined_out": [ + "aggregate%head%8#0", + "aggregate%val_as_bytes%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0" + ], + "stack_out": [ + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "aggregate%head%8#0", + "aggregate%val_as_bytes%9#0" + ] + }, + "4342": { + "op": "concat", + "defined_out": [ + "aggregate%head%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0" + ], + "stack_out": [ + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "aggregate%head%9#0" + ] + }, + "4343": { + "op": "uncover 5", + "stack_out": [ + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "aggregate%head%9#0", + "maybe_value%10#0" + ] + }, + "4345": { + "op": "itob", + "defined_out": [ + "aggregate%head%9#0", + "aggregate%val_as_bytes%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0" + ], + "stack_out": [ + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "aggregate%head%9#0", + "aggregate%val_as_bytes%10#0" + ] + }, + "4346": { + "op": "concat", + "defined_out": [ + "aggregate%head%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0" + ], + "stack_out": [ + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "aggregate%head%10#0" + ] + }, + "4347": { + "op": "uncover 4", + "stack_out": [ + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "aggregate%head%10#0", + "maybe_value%11#0" + ] + }, + "4349": { + "op": "itob", + "defined_out": [ + "aggregate%head%10#0", + "aggregate%val_as_bytes%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0" + ], + "stack_out": [ + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "aggregate%head%10#0", + "aggregate%val_as_bytes%11#0" + ] + }, + "4350": { + "op": "concat", + "defined_out": [ + "aggregate%head%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0" + ], + "stack_out": [ + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "aggregate%head%11#0" + ] + }, + "4351": { + "op": "uncover 3", + "stack_out": [ + "maybe_value%13#0", + "maybe_value%14#0", + "aggregate%head%11#0", + "maybe_value%12#0" + ] + }, + "4353": { + "op": "itob", + "defined_out": [ + "aggregate%head%11#0", + "aggregate%val_as_bytes%12#0", + "maybe_value%13#0", + "maybe_value%14#0" + ], + "stack_out": [ + "maybe_value%13#0", + "maybe_value%14#0", + "aggregate%head%11#0", + "aggregate%val_as_bytes%12#0" + ] + }, + "4354": { + "op": "concat", + "defined_out": [ + "aggregate%head%12#0", + "maybe_value%13#0", + "maybe_value%14#0" + ], + "stack_out": [ + "maybe_value%13#0", + "maybe_value%14#0", + "aggregate%head%12#0" + ] + }, + "4355": { + "op": "uncover 2", + "stack_out": [ + "maybe_value%14#0", + "aggregate%head%12#0", + "maybe_value%13#0" + ] + }, + "4357": { + "op": "itob", + "defined_out": [ + "aggregate%head%12#0", + "aggregate%val_as_bytes%13#0", + "maybe_value%14#0" + ], + "stack_out": [ + "maybe_value%14#0", + "aggregate%head%12#0", + "aggregate%val_as_bytes%13#0" + ] + }, + "4358": { + "op": "concat", + "defined_out": [ + "aggregate%head%13#0", + "maybe_value%14#0" + ], + "stack_out": [ + "maybe_value%14#0", + "aggregate%head%13#0" + ] + }, + "4359": { + "op": "swap", + "stack_out": [ + "aggregate%head%13#0", + "maybe_value%14#0" + ] + }, + "4360": { + "op": "itob", + "defined_out": [ + "aggregate%head%13#0", + "aggregate%val_as_bytes%14#0" + ], + "stack_out": [ + "aggregate%head%13#0", + "aggregate%val_as_bytes%14#0" + ] + }, + "4361": { + "op": "concat", + "defined_out": [ + "aggregate%head%14#0" + ], + "stack_out": [ + "aggregate%head%14#0" + ] + }, + "4362": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "aggregate%head%14#0" + ], + "stack_out": [ + "aggregate%head%14#0", + "0x151f7c75" + ] + }, + "4363": { + "op": "swap", + "stack_out": [ + "0x151f7c75", + "aggregate%head%14#0" + ] + }, + "4364": { + "op": "concat", + "defined_out": [ + "tmp%1#0" + ], + "stack_out": [ + "tmp%1#0" + ] + }, + "4365": { + "op": "log", + "stack_out": [] + }, + "4366": { + "op": "intc_1 // 1", + "defined_out": [ + "1" + ], + "stack_out": [ + "1" + ] + }, + "4367": { + "op": "return", + "stack_out": [] + }, + "4368": { + "subroutine": "modules.kernel.ActusKernelModule.get_next_due_event[routing]", + "params": {}, + "block": "get_next_due_event", + "stack_in": [], + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "0" + ] + }, + "4369": { + "op": "bytec_1 // \"status\"", + "defined_out": [ + "\"status\"", + "0" + ], + "stack_out": [ + "0", + "\"status\"" + ] + }, + "4370": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0" + ], + "stack_out": [ + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "4371": { + "error": "check self.status exists", + "op": "assert // check self.status exists", + "stack_out": [ + "maybe_value%0#0" + ] + }, + "4372": { + "error": "D-ASA not configured", + "op": "assert // D-ASA not configured", + "stack_out": [] + }, + "4373": { + "op": "intc_0 // 0", + "stack_out": [ + "0" + ] + }, + "4374": { + "op": "bytec_2 // \"event_cursor\"", + "defined_out": [ + "\"event_cursor\"", + "0" + ], + "stack_out": [ + "0", + "\"event_cursor\"" + ] + }, + "4375": { + "op": "app_global_get_ex", + "stack_out": [ + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "4376": { + "error": "check self.event_cursor exists", + "op": "assert // check self.event_cursor exists", + "stack_out": [ + "maybe_value%0#0" + ] + }, + "4377": { + "op": "intc_0 // 0", + "stack_out": [ + "maybe_value%0#0", + "0" + ] + }, + "4378": { + "op": "bytec 4 // \"schedule_entry_count\"", + "defined_out": [ + "\"schedule_entry_count\"", + "0", + "maybe_value%0#0" + ], + "stack_out": [ + "maybe_value%0#0", + "0", + "\"schedule_entry_count\"" + ] + }, + "4380": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%1#0", + "maybe_value%0#0", + "maybe_value%1#0" + ], + "stack_out": [ + "maybe_value%0#0", + "maybe_value%1#0", + "maybe_exists%1#0" + ] + }, + "4381": { + "error": "check self.schedule_entry_count exists", + "op": "assert // check self.schedule_entry_count exists", + "stack_out": [ + "maybe_value%0#0", + "maybe_value%1#0" + ] + }, + "4382": { + "op": ">=", + "defined_out": [ + "tmp%0#1" + ], + "stack_out": [ + "tmp%0#1" + ] + }, + "4383": { + "op": "bz get_next_due_event_after_if_else@3", + "stack_out": [] + }, + "4386": { + "op": "intc_0 // 0", + "stack_out": [ + "0" + ] + }, + "4387": { + "op": "bytec_2 // \"event_cursor\"", + "stack_out": [ + "0", + "\"event_cursor\"" + ] + }, + "4388": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%2#0", + "maybe_value%2#0" + ], + "stack_out": [ + "maybe_value%2#0", + "maybe_exists%2#0" + ] + }, + "4389": { + "error": "check self.event_cursor exists", + "op": "assert // check self.event_cursor exists", + "stack_out": [ + "maybe_value%2#0" + ] + }, + "4390": { + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%0#0" + ], + "stack_out": [ + "aggregate%val_as_bytes%0#0" + ] + }, + "4391": { + "op": "bytec 40 // 0x00", + "defined_out": [ + "0x00", + "aggregate%val_as_bytes%0#0" + ], + "stack_out": [ + "aggregate%val_as_bytes%0#0", + "0x00" + ] + }, + "4393": { + "op": "concat", + "defined_out": [ + "aggregate%head%1#0" + ], + "stack_out": [ + "aggregate%head%1#0" + ] + }, + "4394": { + "op": "intc_0 // 0", + "stack_out": [ + "aggregate%head%1#0", + "0" + ] + }, + "4395": { + "op": "itob", + "defined_out": [ + "aggregate%head%1#0", + "aggregate%val_as_bytes%1#0" + ], + "stack_out": [ + "aggregate%head%1#0", + "aggregate%val_as_bytes%1#0" + ] + }, + "4396": { + "op": "swap", + "stack_out": [ + "aggregate%val_as_bytes%1#0", + "aggregate%head%1#0" + ] + }, + "4397": { + "op": "dig 1", + "defined_out": [ + "aggregate%head%1#0", + "aggregate%val_as_bytes%1#0", + "aggregate%val_as_bytes%1#0 (copy)" + ], + "stack_out": [ + "aggregate%val_as_bytes%1#0", + "aggregate%head%1#0", + "aggregate%val_as_bytes%1#0 (copy)" + ] + }, + "4399": { + "op": "concat", + "defined_out": [ + "aggregate%head%2#0", + "aggregate%val_as_bytes%1#0" + ], + "stack_out": [ + "aggregate%val_as_bytes%1#0", + "aggregate%head%2#0" + ] + }, + "4400": { + "op": "dig 1", + "stack_out": [ + "aggregate%val_as_bytes%1#0", + "aggregate%head%2#0", + "aggregate%val_as_bytes%1#0 (copy)" + ] + }, + "4402": { + "op": "concat", + "defined_out": [ + "aggregate%head%3#0", + "aggregate%val_as_bytes%1#0" + ], + "stack_out": [ + "aggregate%val_as_bytes%1#0", + "aggregate%head%3#0" + ] + }, + "4403": { + "op": "dig 1", + "stack_out": [ + "aggregate%val_as_bytes%1#0", + "aggregate%head%3#0", + "aggregate%val_as_bytes%1#0 (copy)" + ] + }, + "4405": { + "op": "concat", + "defined_out": [ + "aggregate%head%4#0", + "aggregate%val_as_bytes%1#0" + ], + "stack_out": [ + "aggregate%val_as_bytes%1#0", + "aggregate%head%4#0" + ] + }, + "4406": { + "op": "dig 1", + "stack_out": [ + "aggregate%val_as_bytes%1#0", + "aggregate%head%4#0", + "aggregate%val_as_bytes%1#0 (copy)" + ] + }, + "4408": { + "op": "concat", + "defined_out": [ + "aggregate%head%5#0", + "aggregate%val_as_bytes%1#0" + ], + "stack_out": [ + "aggregate%val_as_bytes%1#0", + "aggregate%head%5#0" + ] + }, + "4409": { + "op": "dig 1", + "stack_out": [ + "aggregate%val_as_bytes%1#0", + "aggregate%head%5#0", + "aggregate%val_as_bytes%1#0 (copy)" + ] + }, + "4411": { + "op": "concat", + "defined_out": [ + "aggregate%head%6#0", + "aggregate%val_as_bytes%1#0" + ], + "stack_out": [ + "aggregate%val_as_bytes%1#0", + "aggregate%head%6#0" + ] + }, + "4412": { + "op": "dig 1", + "stack_out": [ + "aggregate%val_as_bytes%1#0", + "aggregate%head%6#0", + "aggregate%val_as_bytes%1#0 (copy)" + ] + }, + "4414": { + "op": "concat", + "defined_out": [ + "aggregate%head%7#0", + "aggregate%val_as_bytes%1#0" + ], + "stack_out": [ + "aggregate%val_as_bytes%1#0", + "aggregate%head%7#0" + ] + }, + "4415": { + "op": "swap", + "stack_out": [ + "aggregate%head%7#0", + "aggregate%val_as_bytes%1#0" + ] + }, + "4416": { + "op": "concat", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "4417": { + "block": "get_next_due_event_after_inlined_modules.kernel.ActusKernelModule.get_next_due_event@4", + "stack_in": [ + "tmp%0#0" + ], + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75" + ], + "stack_out": [ + "tmp%0#0", + "0x151f7c75" + ] + }, + "4418": { + "op": "swap", + "defined_out": [ + "0x151f7c75", + "tmp%0#0" + ], + "stack_out": [ + "0x151f7c75", + "tmp%0#0" + ] + }, + "4419": { + "op": "concat", + "defined_out": [ + "tmp%1#0" + ], + "stack_out": [ + "tmp%1#0" + ] + }, + "4420": { + "op": "log", + "stack_out": [] + }, + "4421": { + "op": "intc_1 // 1", + "defined_out": [ + "1" + ], + "stack_out": [ + "1" + ] + }, + "4422": { + "op": "return", + "stack_out": [] + }, + "4423": { + "block": "get_next_due_event_after_if_else@3", + "stack_in": [], + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "0" + ] + }, + "4424": { + "op": "bytec_2 // \"event_cursor\"", + "defined_out": [ + "\"event_cursor\"", + "0" + ], + "stack_out": [ + "0", + "\"event_cursor\"" + ] + }, + "4425": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%3#0", + "maybe_value%3#0" + ], + "stack_out": [ + "maybe_value%3#0", + "maybe_exists%3#0" + ] + }, + "4426": { + "error": "check self.event_cursor exists", + "op": "assert // check self.event_cursor exists", + "stack_out": [ + "maybe_value%3#0" + ] + }, + "4427": { + "callsub": "modules.kernel.ActusKernelModule._get_schedule_entry", + "op": "callsub _get_schedule_entry", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "4430": { + "op": "b get_next_due_event_after_inlined_modules.kernel.ActusKernelModule.get_next_due_event@4" + }, + "4433": { + "subroutine": "modules.rbac.RbacModule.contract_update[routing]", + "params": {}, + "block": "contract_update", + "stack_in": [], + "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", + "op": "callsub _assert_caller_is_arranger" + }, + "4436": { + "op": "intc_1 // 1", + "defined_out": [ + "1" + ], + "stack_out": [ + "1" + ] + }, + "4437": { + "op": "return", + "stack_out": [] + }, + "4438": { + "subroutine": "modules.rbac.RbacModule.rbac_rotate_arranger[routing]", + "params": {}, + "block": "rbac_rotate_arranger", + "stack_in": [], + "op": "txna ApplicationArgs 1", + "defined_out": [ + "new_arranger#0" + ], + "stack_out": [ + "new_arranger#0" + ] + }, + "4441": { + "op": "dup", + "defined_out": [ + "new_arranger#0", + "new_arranger#0 (copy)" + ], + "stack_out": [ + "new_arranger#0", + "new_arranger#0 (copy)" + ] + }, + "4442": { + "op": "len", + "defined_out": [ + "len%0#0", + "new_arranger#0" + ], + "stack_out": [ + "new_arranger#0", + "len%0#0" + ] + }, + "4443": { + "op": "intc_3 // 32", + "defined_out": [ + "32", + "len%0#0", + "new_arranger#0" + ], + "stack_out": [ + "new_arranger#0", + "len%0#0", + "32" + ] + }, + "4444": { + "op": "==", + "defined_out": [ + "eq%0#0", + "new_arranger#0" + ], + "stack_out": [ + "new_arranger#0", + "eq%0#0" + ] + }, + "4445": { + "error": "invalid number of bytes for arc4.static_array", + "op": "assert // invalid number of bytes for arc4.static_array", + "stack_out": [ + "new_arranger#0" + ] + }, + "4446": { + "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", + "op": "callsub _assert_caller_is_arranger" + }, + "4449": { + "op": "bytec 18 // 0x5223417272616e67657223", + "defined_out": [ + "0x5223417272616e67657223", + "new_arranger#0" + ], + "stack_out": [ + "new_arranger#0", + "0x5223417272616e67657223" + ] + }, + "4451": { + "op": "swap", + "stack_out": [ + "0x5223417272616e67657223", + "new_arranger#0" + ] + }, + "4452": { + "op": "app_global_put", + "stack_out": [] + }, + "4453": { + "op": "global LatestTimestamp", + "defined_out": [ + "tmp%0#1" + ], + "stack_out": [ + "tmp%0#1" + ] + }, + "4455": { + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%0#0" + ], + "stack_out": [ + "aggregate%val_as_bytes%0#0" + ] + }, + "4456": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "aggregate%val_as_bytes%0#0" + ], + "stack_out": [ + "aggregate%val_as_bytes%0#0", + "0x151f7c75" + ] + }, + "4457": { + "op": "swap", + "stack_out": [ + "0x151f7c75", + "aggregate%val_as_bytes%0#0" + ] + }, + "4458": { + "op": "concat", + "defined_out": [ + "tmp%4#0" + ], + "stack_out": [ + "tmp%4#0" + ] + }, + "4459": { + "op": "log", + "stack_out": [] + }, + "4460": { + "op": "intc_1 // 1", + "defined_out": [ + "1" + ], + "stack_out": [ + "1" + ] + }, + "4461": { + "op": "return", + "stack_out": [] + }, + "4462": { + "subroutine": "modules.rbac.RbacModule.rbac_set_op_daemon[routing]", + "params": {}, + "block": "rbac_set_op_daemon", + "stack_in": [], + "op": "txna ApplicationArgs 1", + "defined_out": [ + "address#0" + ], + "stack_out": [ + "address#0" + ] + }, + "4465": { + "op": "dup", + "defined_out": [ + "address#0", + "address#0 (copy)" + ], + "stack_out": [ + "address#0", + "address#0 (copy)" + ] + }, + "4466": { + "op": "len", + "defined_out": [ + "address#0", + "len%0#0" + ], + "stack_out": [ + "address#0", + "len%0#0" + ] + }, + "4467": { + "op": "intc_3 // 32", + "defined_out": [ + "32", + "address#0", + "len%0#0" + ], + "stack_out": [ + "address#0", + "len%0#0", + "32" + ] + }, + "4468": { + "op": "==", + "defined_out": [ + "address#0", + "eq%0#0" + ], + "stack_out": [ + "address#0", + "eq%0#0" + ] + }, + "4469": { + "error": "invalid number of bytes for arc4.static_array", + "op": "assert // invalid number of bytes for arc4.static_array", + "stack_out": [ + "address#0" + ] + }, + "4470": { + "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", + "op": "callsub _assert_caller_is_arranger" + }, + "4473": { + "op": "bytec 25 // 0x52234f704461656d6f6e23", + "defined_out": [ + "0x52234f704461656d6f6e23", + "address#0" + ], + "stack_out": [ + "address#0", + "0x52234f704461656d6f6e23" + ] + }, + "4475": { + "op": "swap", + "stack_out": [ + "0x52234f704461656d6f6e23", + "address#0" + ] + }, + "4476": { + "op": "app_global_put", + "stack_out": [] + }, + "4477": { + "op": "global LatestTimestamp", + "defined_out": [ + "tmp%0#1" + ], + "stack_out": [ + "tmp%0#1" + ] + }, + "4479": { + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%0#0" + ], + "stack_out": [ + "aggregate%val_as_bytes%0#0" + ] + }, + "4480": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "aggregate%val_as_bytes%0#0" + ], + "stack_out": [ + "aggregate%val_as_bytes%0#0", + "0x151f7c75" + ] + }, + "4481": { + "op": "swap", + "stack_out": [ + "0x151f7c75", + "aggregate%val_as_bytes%0#0" + ] + }, + "4482": { + "op": "concat", + "defined_out": [ + "tmp%4#0" + ], + "stack_out": [ + "tmp%4#0" + ] + }, + "4483": { + "op": "log", + "stack_out": [] + }, + "4484": { + "op": "intc_1 // 1", + "defined_out": [ + "1" + ], + "stack_out": [ + "1" + ] + }, + "4485": { + "op": "return", + "stack_out": [] + }, + "4486": { + "subroutine": "modules.rbac.RbacModule.rbac_assign_role[routing]", + "params": {}, + "block": "rbac_assign_role", + "stack_in": [], + "op": "txna ApplicationArgs 1", + "defined_out": [ + "role_id#0" + ], + "stack_out": [ + "role_id#0" + ] + }, + "4489": { + "op": "dup", + "defined_out": [ + "role_id#0", + "role_id#0 (copy)" + ], + "stack_out": [ + "role_id#0", + "role_id#0 (copy)" + ] + }, + "4490": { + "op": "len", + "defined_out": [ + "len%0#0", + "role_id#0" + ], + "stack_out": [ + "role_id#0", + "len%0#0" + ] + }, + "4491": { + "op": "intc_1 // 1", + "defined_out": [ + "1", + "len%0#0", + "role_id#0" + ], + "stack_out": [ + "role_id#0", + "len%0#0", + "1" + ] + }, + "4492": { + "op": "==", + "defined_out": [ + "eq%0#0", + "role_id#0" + ], + "stack_out": [ + "role_id#0", + "eq%0#0" + ] + }, + "4493": { + "error": "invalid number of bytes for arc4.uint8", + "op": "assert // invalid number of bytes for arc4.uint8", + "stack_out": [ + "role_id#0" + ] + }, + "4494": { + "op": "txna ApplicationArgs 2" + }, + "4497": { + "op": "dup", + "defined_out": [ + "role_address#0", + "role_id#0" + ], + "stack_out": [ + "role_id#0", + "role_address#0", + "role_address#0" + ] + }, + "4498": { + "op": "cover 2", + "defined_out": [ + "role_address#0", + "role_id#0" + ], + "stack_out": [ + "role_address#0", + "role_id#0", + "role_address#0" + ] + }, + "4500": { + "op": "len", + "defined_out": [ + "len%1#0", + "role_address#0", + "role_id#0" + ], + "stack_out": [ + "role_address#0", + "role_id#0", + "len%1#0" + ] + }, + "4501": { + "op": "intc_3 // 32", + "defined_out": [ + "32", + "len%1#0", + "role_address#0", + "role_id#0" + ], + "stack_out": [ + "role_address#0", + "role_id#0", + "len%1#0", + "32" + ] + }, + "4502": { + "op": "==", + "defined_out": [ + "eq%1#0", + "role_address#0", + "role_id#0" + ], + "stack_out": [ + "role_address#0", + "role_id#0", + "eq%1#0" + ] + }, + "4503": { + "error": "invalid number of bytes for arc4.static_array", + "op": "assert // invalid number of bytes for arc4.static_array", + "stack_out": [ + "role_address#0", + "role_id#0" + ] + }, + "4504": { + "op": "txna ApplicationArgs 3" + }, + "4507": { + "op": "dup", + "defined_out": [ + "role_address#0", + "role_id#0", + "validity#0" + ], + "stack_out": [ + "role_address#0", + "role_id#0", + "validity#0", + "validity#0" + ] + }, + "4508": { + "op": "cover 2", + "defined_out": [ + "role_address#0", + "role_id#0", + "validity#0" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#0", + "validity#0" + ] + }, + "4510": { + "op": "len", + "defined_out": [ + "len%2#0", + "role_address#0", + "role_id#0", + "validity#0" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#0", + "len%2#0" + ] + }, + "4511": { + "op": "pushint 16", + "defined_out": [ + "16", + "len%2#0", + "role_address#0", + "role_id#0", + "validity#0" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#0", + "len%2#0", + "16" + ] + }, + "4513": { + "op": "==", + "defined_out": [ + "eq%2#0", + "role_address#0", + "role_id#0", + "validity#0" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#0", + "eq%2#0" + ] + }, + "4514": { + "error": "invalid number of bytes for smart_contracts.abi_types.RoleValidity", + "op": "assert // invalid number of bytes for smart_contracts.abi_types.RoleValidity", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#0" + ] + }, + "4515": { + "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", + "op": "callsub _assert_caller_is_arranger" + }, + "4518": { + "callsub": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", + "op": "callsub _assert_is_not_asset_defaulted" + }, + "4521": { + "op": "btoi", + "defined_out": [ + "role_address#0", + "role_id#1", + "validity#0" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1" + ] + }, + "4522": { + "op": "dupn 2", + "defined_out": [ + "role_address#0", + "role_id#1", + "role_id#1 (copy)", + "validity#0" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "role_id#1", + "role_id#1 (copy)" + ] + }, + "4524": { + "callsub": "modules.rbac.RbacModule._assert_valid_role", + "op": "callsub _assert_valid_role", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "role_id#1" + ] + }, + "4527": { + "op": "pushint 20", + "defined_out": [ + "20", + "role_address#0", + "role_id#1", + "validity#0" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "role_id#1", + "20" + ] + }, + "4529": { + "op": "==", + "defined_out": [ + "role_address#0", + "role_id#1", + "tmp%0#2", + "validity#0" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "tmp%0#2" + ] + }, + "4530": { + "op": "bz rbac_assign_role_after_if_else@3", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1" + ] + }, + "4533": { + "op": "bytec 18 // 0x5223417272616e67657223", + "defined_out": [ + "0x5223417272616e67657223", + "role_address#0", + "role_id#1", + "validity#0" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "0x5223417272616e67657223" + ] + }, + "4535": { + "op": "dig 3", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "0x5223417272616e67657223", + "role_address#0" + ] + }, + "4537": { + "op": "app_global_put", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1" + ] + }, + "4538": { + "block": "rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14", + "stack_in": [ + "role_address#0", + "validity#0", + "role_id#1" + ], + "op": "global LatestTimestamp", + "defined_out": [ + "tmp%2#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "tmp%2#1" + ] + }, + "4540": { + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%0#0" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "aggregate%val_as_bytes%0#0" + ] + }, + "4541": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "aggregate%val_as_bytes%0#0" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "aggregate%val_as_bytes%0#0", + "0x151f7c75" + ] + }, + "4542": { + "op": "swap", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "0x151f7c75", + "aggregate%val_as_bytes%0#0" + ] + }, + "4543": { + "op": "concat", + "defined_out": [ + "tmp%6#0" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "tmp%6#0" + ] + }, + "4544": { + "op": "log", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1" + ] + }, + "4545": { + "op": "intc_1 // 1", + "defined_out": [ + "1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "1" + ] + }, + "4546": { + "op": "return", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1" + ] + }, + "4547": { + "block": "rbac_assign_role_after_if_else@3", + "stack_in": [ + "role_address#0", + "validity#0", + "role_id#1" + ], + "op": "dup", + "defined_out": [ + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "role_id#1" + ] + }, + "4548": { + "op": "pushint 40", + "defined_out": [ + "40", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "role_id#1", + "40" + ] + }, + "4550": { + "op": "==", + "defined_out": [ + "role_id#1", + "tmp%1#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "tmp%1#1" + ] + }, + "4551": { + "op": "bz rbac_assign_role_after_if_else@5", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1" + ] + }, + "4554": { + "op": "bytec 23 // 0x52234163636f756e744d616e6167657223", + "defined_out": [ + "0x52234163636f756e744d616e6167657223", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "0x52234163636f756e744d616e6167657223" + ] + }, + "4556": { + "op": "dig 3", + "defined_out": [ + "0x52234163636f756e744d616e6167657223", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "0x52234163636f756e744d616e6167657223", + "role_address#0" + ] + }, + "4558": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%0#0", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%0#0" + ] + }, + "4559": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%0#0", + "box_prefixed_key%0#0 (copy)", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%0#0", + "box_prefixed_key%0#0 (copy)" + ] + }, + "4560": { + "op": "box_len", + "defined_out": [ + "_%0#0", + "box_prefixed_key%0#0", + "maybe_exists%0#0", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%0#0", + "_%0#0", + "maybe_exists%0#0" + ] + }, + "4561": { + "op": "bury 1", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%0#0", + "maybe_exists%0#0" + ] + }, + "4563": { + "op": "!", + "defined_out": [ + "box_prefixed_key%0#0", + "role_address#0", + "role_id#1", + "tmp%2#2" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%0#0", + "tmp%2#2" + ] + }, + "4564": { + "error": "Invalid account role address", + "op": "assert // Invalid account role address", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%0#0" + ] + }, + "4565": { + "op": "dig 2", + "defined_out": [ + "box_prefixed_key%0#0", + "role_address#0", + "role_id#1", + "validity#0" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%0#0", + "validity#0" + ] + }, + "4567": { + "op": "box_put", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1" + ] + }, + "4568": { + "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14" + }, + "4571": { + "block": "rbac_assign_role_after_if_else@5", + "stack_in": [ + "role_address#0", + "validity#0", + "role_id#1" + ], + "op": "dup", + "defined_out": [ + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "role_id#1" + ] + }, + "4572": { + "op": "pushint 50", + "defined_out": [ + "50", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "role_id#1", + "50" + ] + }, + "4574": { + "op": "==", + "defined_out": [ + "role_id#1", + "tmp%3#0" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "tmp%3#0" + ] + }, + "4575": { + "op": "bz rbac_assign_role_after_if_else@7", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1" + ] + }, + "4578": { + "op": "bytec 22 // 0x52235072696d6172794465616c657223", + "defined_out": [ + "0x52235072696d6172794465616c657223", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "0x52235072696d6172794465616c657223" + ] + }, + "4580": { + "op": "dig 3", + "defined_out": [ + "0x52235072696d6172794465616c657223", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "0x52235072696d6172794465616c657223", + "role_address#0" + ] + }, + "4582": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%2#0", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%2#0" + ] + }, + "4583": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%2#0", + "box_prefixed_key%2#0 (copy)", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%2#0", + "box_prefixed_key%2#0 (copy)" + ] + }, + "4584": { + "op": "box_len", + "defined_out": [ + "_%1#0", + "box_prefixed_key%2#0", + "maybe_exists%1#0", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%2#0", + "_%1#0", + "maybe_exists%1#0" + ] + }, + "4585": { + "op": "bury 1", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%2#0", + "maybe_exists%1#0" + ] + }, + "4587": { + "op": "!", + "defined_out": [ + "box_prefixed_key%2#0", + "role_address#0", + "role_id#1", + "tmp%4#0" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%2#0", + "tmp%4#0" + ] + }, + "4588": { + "error": "Invalid account role address", + "op": "assert // Invalid account role address", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%2#0" + ] + }, + "4589": { + "op": "dig 2", + "defined_out": [ + "box_prefixed_key%2#0", + "role_address#0", + "role_id#1", + "validity#0" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%2#0", + "validity#0" + ] + }, + "4591": { + "op": "box_put", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1" + ] + }, + "4592": { + "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14" + }, + "4595": { + "block": "rbac_assign_role_after_if_else@7", + "stack_in": [ + "role_address#0", + "validity#0", + "role_id#1" + ], + "op": "dup", + "defined_out": [ + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "role_id#1" + ] + }, + "4596": { + "op": "pushint 60", + "defined_out": [ + "60", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "role_id#1", + "60" + ] + }, + "4598": { + "op": "==", + "defined_out": [ + "role_id#1", + "tmp%5#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "tmp%5#1" + ] + }, + "4599": { + "op": "bz rbac_assign_role_after_if_else@9", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1" + ] + }, + "4602": { + "op": "bytec 32 // 0x52235472757374656523", + "defined_out": [ + "0x52235472757374656523", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "0x52235472757374656523" + ] + }, + "4604": { + "op": "dig 3", + "defined_out": [ + "0x52235472757374656523", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "0x52235472757374656523", + "role_address#0" + ] + }, + "4606": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%4#0", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%4#0" + ] + }, + "4607": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%4#0", + "box_prefixed_key%4#0 (copy)", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%4#0", + "box_prefixed_key%4#0 (copy)" + ] + }, + "4608": { + "op": "box_len", + "defined_out": [ + "_%2#0", + "box_prefixed_key%4#0", + "maybe_exists%2#0", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%4#0", + "_%2#0", + "maybe_exists%2#0" + ] + }, + "4609": { + "op": "bury 1", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%4#0", + "maybe_exists%2#0" + ] + }, + "4611": { + "op": "!", + "defined_out": [ + "box_prefixed_key%4#0", + "role_address#0", + "role_id#1", + "tmp%6#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%4#0", + "tmp%6#1" + ] + }, + "4612": { + "error": "Invalid account role address", + "op": "assert // Invalid account role address", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%4#0" + ] + }, + "4613": { + "op": "dig 2", + "defined_out": [ + "box_prefixed_key%4#0", + "role_address#0", + "role_id#1", + "validity#0" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%4#0", + "validity#0" + ] + }, + "4615": { + "op": "box_put", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1" + ] + }, + "4616": { + "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14" + }, + "4619": { + "block": "rbac_assign_role_after_if_else@9", + "stack_in": [ + "role_address#0", + "validity#0", + "role_id#1" + ], + "op": "dup", + "defined_out": [ + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "role_id#1" + ] + }, + "4620": { + "op": "pushint 70", + "defined_out": [ + "70", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "role_id#1", + "70" + ] + }, + "4622": { + "op": "==", + "defined_out": [ + "role_id#1", + "tmp%7#0" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "tmp%7#0" + ] + }, + "4623": { + "op": "bz rbac_assign_role_after_if_else@11", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1" + ] + }, + "4626": { + "op": "bytec 21 // 0x5223417574686f7269747923", + "defined_out": [ + "0x5223417574686f7269747923", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "0x5223417574686f7269747923" + ] + }, + "4628": { + "op": "dig 3", + "defined_out": [ + "0x5223417574686f7269747923", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "0x5223417574686f7269747923", + "role_address#0" + ] + }, + "4630": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%6#0", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%6#0" + ] + }, + "4631": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%6#0", + "box_prefixed_key%6#0 (copy)", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%6#0", + "box_prefixed_key%6#0 (copy)" + ] + }, + "4632": { + "op": "box_len", + "defined_out": [ + "_%3#0", + "box_prefixed_key%6#0", + "maybe_exists%3#0", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%6#0", + "_%3#0", + "maybe_exists%3#0" + ] + }, + "4633": { + "op": "bury 1", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%6#0", + "maybe_exists%3#0" + ] + }, + "4635": { + "op": "!", + "defined_out": [ + "box_prefixed_key%6#0", + "role_address#0", + "role_id#1", + "tmp%8#0" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%6#0", + "tmp%8#0" + ] + }, + "4636": { + "error": "Invalid account role address", + "op": "assert // Invalid account role address", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%6#0" + ] + }, + "4637": { + "op": "dig 2", + "defined_out": [ + "box_prefixed_key%6#0", + "role_address#0", + "role_id#1", + "validity#0" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%6#0", + "validity#0" + ] + }, + "4639": { + "op": "box_put", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1" + ] + }, + "4640": { + "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14" + }, + "4643": { + "block": "rbac_assign_role_after_if_else@11", + "stack_in": [ + "role_address#0", + "validity#0", + "role_id#1" + ], + "op": "dup", + "defined_out": [ + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "role_id#1" + ] + }, + "4644": { + "op": "pushint 80", + "defined_out": [ + "80", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "role_id#1", + "80" + ] + }, + "4646": { + "op": "==", + "defined_out": [ + "role_id#1", + "tmp%9#0" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "tmp%9#0" + ] + }, + "4647": { + "op": "bz rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1" + ] + }, + "4650": { + "op": "bytec 24 // 0x52234f6273657276657223", + "defined_out": [ + "0x52234f6273657276657223", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "0x52234f6273657276657223" + ] + }, + "4652": { + "op": "dig 3", + "defined_out": [ + "0x52234f6273657276657223", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "0x52234f6273657276657223", + "role_address#0" + ] + }, + "4654": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%8#0", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%8#0" + ] + }, + "4655": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%8#0", + "box_prefixed_key%8#0 (copy)", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%8#0", + "box_prefixed_key%8#0 (copy)" + ] + }, + "4656": { + "op": "box_len", + "defined_out": [ + "_%4#0", + "box_prefixed_key%8#0", + "maybe_exists%4#0", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%8#0", + "_%4#0", + "maybe_exists%4#0" + ] + }, + "4657": { + "op": "bury 1", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%8#0", + "maybe_exists%4#0" + ] + }, + "4659": { + "op": "!", + "defined_out": [ + "box_prefixed_key%8#0", + "role_address#0", + "role_id#1", + "tmp%10#0" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%8#0", + "tmp%10#0" + ] + }, + "4660": { + "error": "Invalid account role address", + "op": "assert // Invalid account role address", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%8#0" + ] + }, + "4661": { + "op": "dig 2", + "defined_out": [ + "box_prefixed_key%8#0", + "role_address#0", + "role_id#1", + "validity#0" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%8#0", + "validity#0" + ] + }, + "4663": { + "op": "box_put", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1" + ] + }, + "4664": { + "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14" + }, + "4667": { + "subroutine": "modules.rbac.RbacModule.rbac_revoke_role[routing]", + "params": {}, + "block": "rbac_revoke_role", + "stack_in": [], + "op": "txna ApplicationArgs 1", + "defined_out": [ + "role_id#0" + ], + "stack_out": [ + "role_id#0" + ] + }, + "4670": { + "op": "dup", + "defined_out": [ + "role_id#0", + "role_id#0 (copy)" + ], + "stack_out": [ + "role_id#0", + "role_id#0 (copy)" + ] + }, + "4671": { + "op": "len", + "defined_out": [ + "len%0#0", + "role_id#0" + ], + "stack_out": [ + "role_id#0", + "len%0#0" + ] + }, + "4672": { + "op": "intc_1 // 1", + "defined_out": [ + "1", + "len%0#0", + "role_id#0" + ], + "stack_out": [ + "role_id#0", + "len%0#0", + "1" + ] + }, + "4673": { + "op": "==", + "defined_out": [ + "eq%0#0", + "role_id#0" + ], + "stack_out": [ + "role_id#0", + "eq%0#0" + ] + }, + "4674": { + "error": "invalid number of bytes for arc4.uint8", + "op": "assert // invalid number of bytes for arc4.uint8", + "stack_out": [ + "role_id#0" + ] + }, + "4675": { + "op": "txna ApplicationArgs 2" + }, + "4678": { + "op": "dup", + "defined_out": [ + "role_address#0", + "role_id#0" + ], + "stack_out": [ + "role_id#0", + "role_address#0", + "role_address#0" + ] + }, + "4679": { + "op": "cover 2", + "defined_out": [ + "role_address#0", + "role_id#0" + ], + "stack_out": [ + "role_address#0", + "role_id#0", + "role_address#0" + ] + }, + "4681": { + "op": "len", + "defined_out": [ + "len%1#0", + "role_address#0", + "role_id#0" + ], + "stack_out": [ + "role_address#0", + "role_id#0", + "len%1#0" + ] + }, + "4682": { + "op": "intc_3 // 32", + "defined_out": [ + "32", + "len%1#0", + "role_address#0", + "role_id#0" + ], + "stack_out": [ + "role_address#0", + "role_id#0", + "len%1#0", + "32" + ] + }, + "4683": { + "op": "==", + "defined_out": [ + "eq%1#0", + "role_address#0", + "role_id#0" + ], + "stack_out": [ + "role_address#0", + "role_id#0", + "eq%1#0" + ] + }, + "4684": { + "error": "invalid number of bytes for arc4.static_array", + "op": "assert // invalid number of bytes for arc4.static_array", + "stack_out": [ + "role_address#0", + "role_id#0" + ] + }, + "4685": { + "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", + "op": "callsub _assert_caller_is_arranger" + }, + "4688": { + "callsub": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", + "op": "callsub _assert_is_not_asset_defaulted" + }, + "4691": { + "op": "btoi", + "defined_out": [ + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1" + ] + }, + "4692": { + "op": "dupn 2", + "defined_out": [ + "role_address#0", + "role_id#1", + "role_id#1 (copy)" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "role_id#1", + "role_id#1 (copy)" + ] + }, + "4694": { + "callsub": "modules.rbac.RbacModule._assert_valid_role", + "op": "callsub _assert_valid_role", + "stack_out": [ + "role_address#0", + "role_id#1", + "role_id#1" + ] + }, + "4697": { + "op": "dup", + "stack_out": [ + "role_address#0", + "role_id#1", + "role_id#1", + "role_id#1 (copy)" + ] + }, + "4698": { + "op": "pushint 20", + "defined_out": [ + "20", + "role_address#0", + "role_id#1", + "role_id#1 (copy)" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "role_id#1", + "role_id#1 (copy)", + "20" + ] + }, + "4700": { + "op": "!=", + "defined_out": [ + "role_address#0", + "role_id#1", + "tmp%0#2" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "role_id#1", + "tmp%0#2" + ] + }, + "4701": { + "error": "Invalid role identifier", + "op": "assert // Invalid role identifier", + "stack_out": [ + "role_address#0", + "role_id#1", + "role_id#1" + ] + }, + "4702": { + "op": "pushint 40", + "defined_out": [ + "40", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "role_id#1", + "40" + ] + }, + "4704": { + "op": "==", + "defined_out": [ + "role_address#0", + "role_id#1", + "tmp%1#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "tmp%1#1" + ] + }, + "4705": { + "op": "bz rbac_revoke_role_after_if_else@3", + "stack_out": [ + "role_address#0", + "role_id#1" + ] + }, + "4708": { + "op": "bytec 23 // 0x52234163636f756e744d616e6167657223", + "defined_out": [ + "0x52234163636f756e744d616e6167657223", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "0x52234163636f756e744d616e6167657223" + ] + }, + "4710": { + "op": "dig 2", + "stack_out": [ + "role_address#0", + "role_id#1", + "0x52234163636f756e744d616e6167657223", + "role_address#0" + ] + }, + "4712": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%0#0", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%0#0" + ] + }, + "4713": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%0#0", + "box_prefixed_key%0#0 (copy)", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%0#0", + "box_prefixed_key%0#0 (copy)" + ] + }, + "4714": { + "op": "box_len", + "defined_out": [ + "_%0#0", + "box_prefixed_key%0#0", + "maybe_exists%0#0", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%0#0", + "_%0#0", + "maybe_exists%0#0" + ] + }, + "4715": { + "op": "bury 1", + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%0#0", + "maybe_exists%0#0" + ] + }, + "4717": { + "error": "Invalid account role address", + "op": "assert // Invalid account role address", + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%0#0" + ] + }, + "4718": { + "op": "box_del", + "defined_out": [ + "role_address#0", + "role_id#1", + "{box_del}" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "{box_del}" + ] + }, + "4719": { + "op": "pop", + "stack_out": [ + "role_address#0", + "role_id#1" + ] + }, + "4720": { + "block": "rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12", + "stack_in": [ + "role_address#0", + "role_id#1" + ], + "op": "global LatestTimestamp", + "defined_out": [ + "tmp%2#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "tmp%2#1" + ] + }, + "4722": { + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%0#0" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "aggregate%val_as_bytes%0#0" + ] + }, + "4723": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "aggregate%val_as_bytes%0#0" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "aggregate%val_as_bytes%0#0", + "0x151f7c75" + ] + }, + "4724": { + "op": "swap", + "stack_out": [ + "role_address#0", + "role_id#1", + "0x151f7c75", + "aggregate%val_as_bytes%0#0" + ] + }, + "4725": { + "op": "concat", + "defined_out": [ + "tmp%5#0" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "tmp%5#0" + ] + }, + "4726": { + "op": "log", + "stack_out": [ + "role_address#0", + "role_id#1" + ] + }, + "4727": { + "op": "intc_1 // 1", + "defined_out": [ + "1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "1" + ] + }, + "4728": { + "op": "return", + "stack_out": [ + "role_address#0", + "role_id#1" + ] + }, + "4729": { + "block": "rbac_revoke_role_after_if_else@3", + "stack_in": [ + "role_address#0", + "role_id#1" + ], + "op": "dup", + "defined_out": [ + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "role_id#1" + ] + }, + "4730": { + "op": "pushint 50", + "defined_out": [ + "50", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "role_id#1", + "50" + ] + }, + "4732": { + "op": "==", + "defined_out": [ + "role_id#1", + "tmp%2#2" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "tmp%2#2" + ] + }, + "4733": { + "op": "bz rbac_revoke_role_after_if_else@5", + "stack_out": [ + "role_address#0", + "role_id#1" + ] + }, + "4736": { + "op": "bytec 22 // 0x52235072696d6172794465616c657223", + "defined_out": [ + "0x52235072696d6172794465616c657223", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "0x52235072696d6172794465616c657223" + ] + }, + "4738": { + "op": "dig 2", + "defined_out": [ + "0x52235072696d6172794465616c657223", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "0x52235072696d6172794465616c657223", + "role_address#0" + ] + }, + "4740": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%2#0", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%2#0" + ] + }, + "4741": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%2#0", + "box_prefixed_key%2#0 (copy)", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%2#0", + "box_prefixed_key%2#0 (copy)" + ] + }, + "4742": { + "op": "box_len", + "defined_out": [ + "_%1#0", + "box_prefixed_key%2#0", + "maybe_exists%1#0", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%2#0", + "_%1#0", + "maybe_exists%1#0" + ] + }, + "4743": { + "op": "bury 1", + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%2#0", + "maybe_exists%1#0" + ] + }, + "4745": { + "error": "Invalid account role address", + "op": "assert // Invalid account role address", + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%2#0" + ] + }, + "4746": { + "op": "box_del", + "defined_out": [ + "role_address#0", + "role_id#1", + "{box_del}" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "{box_del}" + ] + }, + "4747": { + "op": "pop", + "stack_out": [ + "role_address#0", + "role_id#1" + ] + }, + "4748": { + "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" + }, + "4751": { + "block": "rbac_revoke_role_after_if_else@5", + "stack_in": [ + "role_address#0", + "role_id#1" + ], + "op": "dup", + "defined_out": [ + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "role_id#1" + ] + }, + "4752": { + "op": "pushint 60", + "defined_out": [ + "60", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "role_id#1", + "60" + ] + }, + "4754": { + "op": "==", + "defined_out": [ + "role_id#1", + "tmp%3#0" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "tmp%3#0" + ] + }, + "4755": { + "op": "bz rbac_revoke_role_after_if_else@7", + "stack_out": [ + "role_address#0", + "role_id#1" + ] + }, + "4758": { + "op": "bytec 32 // 0x52235472757374656523", + "defined_out": [ + "0x52235472757374656523", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "0x52235472757374656523" + ] + }, + "4760": { + "op": "dig 2", + "defined_out": [ + "0x52235472757374656523", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "0x52235472757374656523", + "role_address#0" + ] + }, + "4762": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%4#0", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%4#0" + ] + }, + "4763": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%4#0", + "box_prefixed_key%4#0 (copy)", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%4#0", + "box_prefixed_key%4#0 (copy)" + ] + }, + "4764": { + "op": "box_len", + "defined_out": [ + "_%2#0", + "box_prefixed_key%4#0", + "maybe_exists%2#0", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%4#0", + "_%2#0", + "maybe_exists%2#0" + ] + }, + "4765": { + "op": "bury 1", + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%4#0", + "maybe_exists%2#0" + ] + }, + "4767": { + "error": "Invalid account role address", + "op": "assert // Invalid account role address", + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%4#0" + ] + }, + "4768": { + "op": "box_del", + "defined_out": [ + "role_address#0", + "role_id#1", + "{box_del}" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "{box_del}" + ] + }, + "4769": { + "op": "pop", + "stack_out": [ + "role_address#0", + "role_id#1" + ] + }, + "4770": { + "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" + }, + "4773": { + "block": "rbac_revoke_role_after_if_else@7", + "stack_in": [ + "role_address#0", + "role_id#1" + ], + "op": "dup", + "defined_out": [ + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "role_id#1" + ] + }, + "4774": { + "op": "pushint 70", + "defined_out": [ + "70", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "role_id#1", + "70" + ] + }, + "4776": { + "op": "==", + "defined_out": [ + "role_id#1", + "tmp%4#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "tmp%4#1" + ] + }, + "4777": { + "op": "bz rbac_revoke_role_after_if_else@9", + "stack_out": [ + "role_address#0", + "role_id#1" + ] + }, + "4780": { + "op": "bytec 21 // 0x5223417574686f7269747923", + "defined_out": [ + "0x5223417574686f7269747923", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "0x5223417574686f7269747923" + ] + }, + "4782": { + "op": "dig 2", + "defined_out": [ + "0x5223417574686f7269747923", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "0x5223417574686f7269747923", + "role_address#0" + ] + }, + "4784": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%6#0", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%6#0" + ] + }, + "4785": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%6#0", + "box_prefixed_key%6#0 (copy)", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%6#0", + "box_prefixed_key%6#0 (copy)" + ] + }, + "4786": { + "op": "box_len", + "defined_out": [ + "_%3#0", + "box_prefixed_key%6#0", + "maybe_exists%3#0", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%6#0", + "_%3#0", + "maybe_exists%3#0" + ] + }, + "4787": { + "op": "bury 1", + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%6#0", + "maybe_exists%3#0" + ] + }, + "4789": { + "error": "Invalid account role address", + "op": "assert // Invalid account role address", + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%6#0" + ] + }, + "4790": { + "op": "box_del", + "defined_out": [ + "role_address#0", + "role_id#1", + "{box_del}" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "{box_del}" + ] + }, + "4791": { + "op": "pop", + "stack_out": [ + "role_address#0", + "role_id#1" + ] + }, + "4792": { + "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" + }, + "4795": { + "block": "rbac_revoke_role_after_if_else@9", + "stack_in": [ + "role_address#0", + "role_id#1" + ], + "op": "dup", + "defined_out": [ + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "role_id#1" + ] + }, + "4796": { + "op": "pushint 80", + "defined_out": [ + "80", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "role_id#1", + "80" + ] + }, + "4798": { + "op": "==", + "defined_out": [ + "role_id#1", + "tmp%5#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "tmp%5#1" + ] + }, + "4799": { + "op": "bz rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12", + "stack_out": [ + "role_address#0", + "role_id#1" + ] + }, + "4802": { + "op": "bytec 24 // 0x52234f6273657276657223", + "defined_out": [ + "0x52234f6273657276657223", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "0x52234f6273657276657223" + ] + }, + "4804": { + "op": "dig 2", + "defined_out": [ + "0x52234f6273657276657223", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "0x52234f6273657276657223", + "role_address#0" + ] + }, + "4806": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%8#0", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%8#0" + ] + }, + "4807": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%8#0", + "box_prefixed_key%8#0 (copy)", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%8#0", + "box_prefixed_key%8#0 (copy)" + ] + }, + "4808": { + "op": "box_len", + "defined_out": [ + "_%4#0", + "box_prefixed_key%8#0", + "maybe_exists%4#0", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%8#0", + "_%4#0", + "maybe_exists%4#0" + ] + }, + "4809": { + "op": "bury 1", + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%8#0", + "maybe_exists%4#0" + ] + }, + "4811": { + "error": "Invalid account role address", + "op": "assert // Invalid account role address", + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%8#0" + ] + }, + "4812": { + "op": "box_del", + "defined_out": [ + "role_address#0", + "role_id#1", + "{box_del}" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "{box_del}" + ] + }, + "4813": { + "op": "pop", + "stack_out": [ + "role_address#0", + "role_id#1" + ] + }, + "4814": { + "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" + }, + "4817": { + "subroutine": "modules.rbac.RbacModule.rbac_gov_asset_suspension[routing]", + "params": {}, + "block": "rbac_gov_asset_suspension", + "stack_in": [], + "op": "txna ApplicationArgs 1", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "4820": { + "op": "dup", + "defined_out": [ + "tmp%0#0", + "tmp%0#0 (copy)" + ], + "stack_out": [ + "tmp%0#0", + "tmp%0#0 (copy)" + ] + }, + "4821": { + "op": "len", + "defined_out": [ + "len%0#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "len%0#0" + ] + }, + "4822": { + "op": "intc_1 // 1", + "defined_out": [ + "1", + "len%0#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "len%0#0", + "1" + ] + }, + "4823": { + "op": "==", + "defined_out": [ + "eq%0#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "eq%0#0" + ] + }, + "4824": { + "error": "invalid number of bytes for arc4.bool", + "op": "assert // invalid number of bytes for arc4.bool", + "stack_out": [ + "tmp%0#0" + ] + }, + "4825": { + "op": "intc_0 // 0", + "defined_out": [ + "0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "0" + ] + }, + "4826": { + "op": "getbit", + "defined_out": [ + "suspended#0" + ], + "stack_out": [ + "suspended#0" + ] + }, + "4827": { + "op": "bytec 21 // 0x5223417574686f7269747923", + "defined_out": [ + "0x5223417574686f7269747923", + "suspended#0" + ], + "stack_out": [ + "suspended#0", + "0x5223417574686f7269747923" + ] + }, + "4829": { + "op": "txn Sender", + "defined_out": [ + "0x5223417574686f7269747923", + "suspended#0", + "tmp%0#2" + ], + "stack_out": [ + "suspended#0", + "0x5223417574686f7269747923", + "tmp%0#2" + ] + }, + "4831": { + "callsub": "modules.rbac.RbacModule._role_is_active", + "op": "callsub _role_is_active", + "defined_out": [ + "suspended#0", + "tmp%1#0" + ], + "stack_out": [ + "suspended#0", + "tmp%1#0" + ] + }, + "4834": { + "error": "Not authorized", + "op": "assert // Not authorized", + "stack_out": [ + "suspended#0" + ] + }, + "4835": { + "op": "bytec 33 // \"asset_suspended\"", + "defined_out": [ + "\"asset_suspended\"", + "suspended#0" + ], + "stack_out": [ + "suspended#0", + "\"asset_suspended\"" + ] + }, + "4837": { + "op": "swap", + "stack_out": [ + "\"asset_suspended\"", + "suspended#0" + ] + }, + "4838": { + "op": "app_global_put", + "stack_out": [] + }, + "4839": { + "op": "global LatestTimestamp", + "defined_out": [ + "tmp%0#1" + ], + "stack_out": [ + "tmp%0#1" + ] + }, + "4841": { + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%0#0" + ], + "stack_out": [ + "aggregate%val_as_bytes%0#0" + ] + }, + "4842": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "aggregate%val_as_bytes%0#0" + ], + "stack_out": [ + "aggregate%val_as_bytes%0#0", + "0x151f7c75" + ] + }, + "4843": { + "op": "swap", + "stack_out": [ + "0x151f7c75", + "aggregate%val_as_bytes%0#0" + ] + }, + "4844": { + "op": "concat", + "defined_out": [ + "tmp%4#0" + ], + "stack_out": [ + "tmp%4#0" + ] + }, + "4845": { + "op": "log", + "stack_out": [] + }, + "4846": { + "op": "intc_1 // 1", + "stack_out": [ + "1" + ] + }, + "4847": { + "op": "return", + "stack_out": [] + }, + "4848": { + "subroutine": "modules.rbac.RbacModule.rbac_get_arranger[routing]", + "params": {}, + "block": "rbac_get_arranger", + "stack_in": [], + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "0" + ] + }, + "4849": { + "op": "bytec 18 // 0x5223417272616e67657223", + "defined_out": [ + "0", + "0x5223417272616e67657223" + ], + "stack_out": [ + "0", + "0x5223417272616e67657223" + ] + }, + "4851": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0" + ], + "stack_out": [ + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "4852": { + "error": "check self.arranger exists", + "op": "assert // check self.arranger exists", + "stack_out": [ + "maybe_value%0#0" + ] + }, + "4853": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "maybe_value%0#0" + ], + "stack_out": [ + "maybe_value%0#0", + "0x151f7c75" + ] + }, + "4854": { + "op": "swap", + "stack_out": [ + "0x151f7c75", + "maybe_value%0#0" + ] + }, + "4855": { + "op": "concat", + "defined_out": [ + "tmp%2#0" + ], + "stack_out": [ + "tmp%2#0" + ] + }, + "4856": { + "op": "log", + "stack_out": [] + }, + "4857": { + "op": "intc_1 // 1", + "defined_out": [ + "1" + ], + "stack_out": [ + "1" + ] + }, + "4858": { + "op": "return", + "stack_out": [] + }, + "4859": { + "subroutine": "modules.rbac.RbacModule.rbac_get_address_roles[routing]", + "params": {}, + "block": "rbac_get_address_roles", + "stack_in": [], + "op": "txna ApplicationArgs 1", + "defined_out": [ + "address#0" + ], + "stack_out": [ + "address#0" + ] + }, + "4862": { + "op": "dup", + "defined_out": [ + "address#0", + "address#0 (copy)" + ], + "stack_out": [ + "address#0", + "address#0 (copy)" + ] + }, + "4863": { + "op": "len", + "defined_out": [ + "address#0", + "len%0#0" + ], + "stack_out": [ + "address#0", + "len%0#0" + ] + }, + "4864": { + "op": "intc_3 // 32", + "defined_out": [ + "32", + "address#0", + "len%0#0" + ], + "stack_out": [ + "address#0", + "len%0#0", + "32" + ] + }, + "4865": { + "op": "==", + "defined_out": [ + "address#0", + "eq%0#0" + ], + "stack_out": [ + "address#0", + "eq%0#0" + ] + }, + "4866": { + "error": "invalid number of bytes for arc4.static_array", + "op": "assert // invalid number of bytes for arc4.static_array", + "stack_out": [ + "address#0" + ] + }, + "4867": { + "op": "bytec 23 // 0x52234163636f756e744d616e6167657223", + "defined_out": [ + "0x52234163636f756e744d616e6167657223", + "address#0" + ], + "stack_out": [ + "address#0", + "0x52234163636f756e744d616e6167657223" + ] + }, + "4869": { + "op": "dig 1", + "stack_out": [ + "address#0", + "0x52234163636f756e744d616e6167657223", + "address#0 (copy)" + ] + }, + "4871": { + "callsub": "modules.rbac.RbacModule._role_is_active", + "op": "callsub _role_is_active", + "defined_out": [ + "address#0", + "tmp%0#1" + ], + "stack_out": [ + "address#0", + "tmp%0#1" + ] + }, + "4874": { + "op": "bytec 22 // 0x52235072696d6172794465616c657223", + "defined_out": [ + "0x52235072696d6172794465616c657223", + "address#0", + "tmp%0#1" + ], + "stack_out": [ + "address#0", + "tmp%0#1", + "0x52235072696d6172794465616c657223" + ] + }, + "4876": { + "op": "dig 2", + "stack_out": [ + "address#0", + "tmp%0#1", + "0x52235072696d6172794465616c657223", + "address#0 (copy)" + ] + }, + "4878": { + "callsub": "modules.rbac.RbacModule._role_is_active", + "op": "callsub _role_is_active", + "defined_out": [ + "address#0", + "tmp%0#1", + "tmp%1#1" + ], + "stack_out": [ + "address#0", + "tmp%0#1", + "tmp%1#1" + ] + }, + "4881": { + "op": "bytec 32 // 0x52235472757374656523", + "defined_out": [ + "0x52235472757374656523", + "address#0", + "tmp%0#1", + "tmp%1#1" + ], + "stack_out": [ + "address#0", + "tmp%0#1", + "tmp%1#1", + "0x52235472757374656523" + ] + }, + "4883": { + "op": "dig 3", + "stack_out": [ + "address#0", + "tmp%0#1", + "tmp%1#1", + "0x52235472757374656523", + "address#0 (copy)" + ] + }, + "4885": { + "callsub": "modules.rbac.RbacModule._role_is_active", + "op": "callsub _role_is_active", + "defined_out": [ + "address#0", + "tmp%0#1", + "tmp%1#1", + "tmp%2#1" + ], + "stack_out": [ + "address#0", + "tmp%0#1", + "tmp%1#1", + "tmp%2#1" + ] + }, + "4888": { + "op": "bytec 21 // 0x5223417574686f7269747923", + "defined_out": [ + "0x5223417574686f7269747923", + "address#0", + "tmp%0#1", + "tmp%1#1", + "tmp%2#1" + ], + "stack_out": [ + "address#0", + "tmp%0#1", + "tmp%1#1", + "tmp%2#1", + "0x5223417574686f7269747923" + ] + }, + "4890": { + "op": "dig 4", + "stack_out": [ + "address#0", + "tmp%0#1", + "tmp%1#1", + "tmp%2#1", + "0x5223417574686f7269747923", + "address#0 (copy)" + ] + }, + "4892": { + "callsub": "modules.rbac.RbacModule._role_is_active", + "op": "callsub _role_is_active", + "defined_out": [ + "address#0", + "tmp%0#1", + "tmp%1#1", + "tmp%2#1", + "tmp%3#1" + ], + "stack_out": [ + "address#0", + "tmp%0#1", + "tmp%1#1", + "tmp%2#1", + "tmp%3#1" + ] + }, + "4895": { + "op": "bytec 24 // 0x52234f6273657276657223", + "defined_out": [ + "0x52234f6273657276657223", + "address#0", + "tmp%0#1", + "tmp%1#1", + "tmp%2#1", + "tmp%3#1" + ], + "stack_out": [ + "address#0", + "tmp%0#1", + "tmp%1#1", + "tmp%2#1", + "tmp%3#1", + "0x52234f6273657276657223" + ] + }, + "4897": { + "op": "uncover 5", + "stack_out": [ + "tmp%0#1", + "tmp%1#1", + "tmp%2#1", + "tmp%3#1", + "0x52234f6273657276657223", + "address#0" + ] + }, + "4899": { + "callsub": "modules.rbac.RbacModule._role_is_active", + "op": "callsub _role_is_active", + "defined_out": [ + "tmp%0#1", + "tmp%1#1", + "tmp%2#1", + "tmp%3#1", + "tmp%4#1" + ], + "stack_out": [ + "tmp%0#1", + "tmp%1#1", + "tmp%2#1", + "tmp%3#1", + "tmp%4#1" + ] + }, + "4902": { + "op": "bytec 40 // 0x00", + "defined_out": [ + "0x00", + "tmp%0#1", + "tmp%1#1", + "tmp%2#1", + "tmp%3#1", + "tmp%4#1" + ], + "stack_out": [ + "tmp%0#1", + "tmp%1#1", + "tmp%2#1", + "tmp%3#1", + "tmp%4#1", + "0x00" + ] + }, + "4904": { + "op": "intc_0 // 0", + "defined_out": [ + "0", + "0x00", + "tmp%0#1", + "tmp%1#1", + "tmp%2#1", + "tmp%3#1", + "tmp%4#1" + ], + "stack_out": [ + "tmp%0#1", + "tmp%1#1", + "tmp%2#1", + "tmp%3#1", + "tmp%4#1", + "0x00", + "0" + ] + }, + "4905": { + "op": "uncover 6", + "stack_out": [ + "tmp%1#1", + "tmp%2#1", + "tmp%3#1", + "tmp%4#1", + "0x00", + "0", + "tmp%0#1" + ] + }, + "4907": { + "op": "setbit", + "defined_out": [ + "aggregate%encoded_bool%0#0", + "tmp%1#1", + "tmp%2#1", + "tmp%3#1", + "tmp%4#1" + ], + "stack_out": [ + "tmp%1#1", + "tmp%2#1", + "tmp%3#1", + "tmp%4#1", + "aggregate%encoded_bool%0#0" + ] + }, + "4908": { + "op": "intc_1 // 1", + "defined_out": [ + "1", + "aggregate%encoded_bool%0#0", + "tmp%1#1", + "tmp%2#1", + "tmp%3#1", + "tmp%4#1" + ], + "stack_out": [ + "tmp%1#1", + "tmp%2#1", + "tmp%3#1", + "tmp%4#1", + "aggregate%encoded_bool%0#0", + "1" + ] + }, + "4909": { + "op": "uncover 5", + "stack_out": [ + "tmp%2#1", + "tmp%3#1", + "tmp%4#1", + "aggregate%encoded_bool%0#0", + "1", + "tmp%1#1" + ] + }, + "4911": { + "op": "setbit", + "defined_out": [ + "aggregate%set_bit%0#0", + "tmp%2#1", + "tmp%3#1", + "tmp%4#1" + ], + "stack_out": [ + "tmp%2#1", + "tmp%3#1", + "tmp%4#1", + "aggregate%set_bit%0#0" + ] + }, + "4912": { + "op": "pushint 2", + "defined_out": [ + "2", + "aggregate%set_bit%0#0", + "tmp%2#1", + "tmp%3#1", + "tmp%4#1" + ], + "stack_out": [ + "tmp%2#1", + "tmp%3#1", + "tmp%4#1", + "aggregate%set_bit%0#0", + "2" + ] + }, + "4914": { + "op": "uncover 4", + "stack_out": [ + "tmp%3#1", + "tmp%4#1", + "aggregate%set_bit%0#0", + "2", + "tmp%2#1" + ] + }, + "4916": { + "op": "setbit", + "defined_out": [ + "aggregate%set_bit%1#0", + "tmp%3#1", + "tmp%4#1" + ], + "stack_out": [ + "tmp%3#1", + "tmp%4#1", + "aggregate%set_bit%1#0" + ] + }, + "4917": { + "op": "pushint 3", + "defined_out": [ + "3", + "aggregate%set_bit%1#0", + "tmp%3#1", + "tmp%4#1" + ], + "stack_out": [ + "tmp%3#1", + "tmp%4#1", + "aggregate%set_bit%1#0", + "3" + ] + }, + "4919": { + "op": "uncover 3", + "stack_out": [ + "tmp%4#1", + "aggregate%set_bit%1#0", + "3", + "tmp%3#1" + ] + }, + "4921": { + "op": "setbit", + "defined_out": [ + "aggregate%set_bit%2#0", + "tmp%4#1" + ], + "stack_out": [ + "tmp%4#1", + "aggregate%set_bit%2#0" + ] + }, + "4922": { + "op": "pushint 4", + "defined_out": [ + "4", + "aggregate%set_bit%2#0", + "tmp%4#1" + ], + "stack_out": [ + "tmp%4#1", + "aggregate%set_bit%2#0", + "4" + ] + }, + "4924": { + "op": "uncover 2", + "stack_out": [ + "aggregate%set_bit%2#0", + "4", + "tmp%4#1" + ] + }, + "4926": { + "op": "setbit", + "defined_out": [ + "aggregate%set_bit%3#0" + ], + "stack_out": [ + "aggregate%set_bit%3#0" + ] + }, + "4927": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "aggregate%set_bit%3#0" + ], + "stack_out": [ + "aggregate%set_bit%3#0", + "0x151f7c75" + ] + }, + "4928": { + "op": "swap", + "stack_out": [ + "0x151f7c75", + "aggregate%set_bit%3#0" + ] + }, + "4929": { + "op": "concat", + "defined_out": [ + "tmp%8#0" + ], + "stack_out": [ + "tmp%8#0" + ] + }, + "4930": { + "op": "log", + "stack_out": [] + }, + "4931": { + "op": "intc_1 // 1", + "stack_out": [ + "1" + ] + }, + "4932": { + "op": "return", + "stack_out": [] + }, + "4933": { + "subroutine": "modules.rbac.RbacModule.rbac_get_role_validity[routing]", + "params": {}, + "block": "rbac_get_role_validity", + "stack_in": [], + "op": "txna ApplicationArgs 1", + "defined_out": [ + "role_id#0" + ], + "stack_out": [ + "role_id#0" + ] + }, + "4936": { + "op": "dup", + "defined_out": [ + "role_id#0", + "role_id#0 (copy)" + ], + "stack_out": [ + "role_id#0", + "role_id#0 (copy)" + ] + }, + "4937": { + "op": "len", + "defined_out": [ + "len%0#0", + "role_id#0" + ], + "stack_out": [ + "role_id#0", + "len%0#0" + ] + }, + "4938": { + "op": "intc_1 // 1", + "defined_out": [ + "1", + "len%0#0", + "role_id#0" + ], + "stack_out": [ + "role_id#0", + "len%0#0", + "1" + ] + }, + "4939": { + "op": "==", + "defined_out": [ + "eq%0#0", + "role_id#0" + ], + "stack_out": [ + "role_id#0", + "eq%0#0" + ] + }, + "4940": { + "error": "invalid number of bytes for arc4.uint8", + "op": "assert // invalid number of bytes for arc4.uint8", + "stack_out": [ + "role_id#0" + ] + }, + "4941": { + "op": "txna ApplicationArgs 2" + }, + "4944": { + "op": "dup", + "defined_out": [ + "role_address#0", + "role_id#0" + ], + "stack_out": [ + "role_id#0", + "role_address#0", + "role_address#0" + ] + }, + "4945": { + "op": "cover 2", + "defined_out": [ + "role_address#0", + "role_id#0" + ], + "stack_out": [ + "role_address#0", + "role_id#0", + "role_address#0" + ] + }, + "4947": { + "op": "len", + "defined_out": [ + "len%1#0", + "role_address#0", + "role_id#0" + ], + "stack_out": [ + "role_address#0", + "role_id#0", + "len%1#0" + ] + }, + "4948": { + "op": "intc_3 // 32", + "defined_out": [ + "32", + "len%1#0", + "role_address#0", + "role_id#0" + ], + "stack_out": [ + "role_address#0", + "role_id#0", + "len%1#0", + "32" + ] + }, + "4949": { + "op": "==", + "defined_out": [ + "eq%1#0", + "role_address#0", + "role_id#0" + ], + "stack_out": [ + "role_address#0", + "role_id#0", + "eq%1#0" + ] + }, + "4950": { + "error": "invalid number of bytes for arc4.static_array", + "op": "assert // invalid number of bytes for arc4.static_array", + "stack_out": [ + "role_address#0", + "role_id#0" + ] + }, + "4951": { + "op": "btoi", + "defined_out": [ + "role#0", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "role#0" + ] + }, + "4952": { + "op": "dup", + "defined_out": [ + "role#0", + "role#0 (copy)", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "role#0", + "role#0 (copy)" + ] + }, + "4953": { + "callsub": "modules.rbac.RbacModule._assert_valid_role", + "op": "callsub _assert_valid_role", + "stack_out": [ + "role_address#0", + "role#0" + ] + }, + "4956": { + "op": "pushints 20 40 50 60 70 80", + "defined_out": [ + "20", + "40", + "50", + "60", + "70", + "80", + "role#0", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "role#0", + "20", + "40", + "50", + "60", + "70", + "80" + ] + }, + "4964": { + "op": "uncover 6", + "stack_out": [ + "role_address#0", + "20", + "40", + "50", + "60", + "70", + "80", + "role#0" + ] + }, + "4966": { + "op": "match rbac_get_role_validity_switch_case_0@2 rbac_get_role_validity_switch_case_1@3 rbac_get_role_validity_switch_case_2@4 rbac_get_role_validity_switch_case_3@5 rbac_get_role_validity_switch_case_4@6 rbac_get_role_validity_switch_case_5@7", + "stack_out": [ + "role_address#0" + ] + }, + "4980": { + "error": "Invalid role identifier", + "op": "err // Invalid role identifier" + }, + "4981": { + "block": "rbac_get_role_validity_switch_case_5@7", + "stack_in": [ + "role_address#0" + ], + "op": "bytec 24 // 0x52234f6273657276657223", + "defined_out": [ + "0x52234f6273657276657223" + ], + "stack_out": [ + "role_address#0", + "0x52234f6273657276657223" + ] + }, + "4983": { + "op": "dig 1", + "defined_out": [ + "0x52234f6273657276657223", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "0x52234f6273657276657223", + "role_address#0" + ] + }, + "4985": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%0#1", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1" + ] + }, + "4986": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%0#1", + "box_prefixed_key%0#1 (copy)", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1", + "box_prefixed_key%0#1 (copy)" + ] + }, + "4987": { + "op": "box_len", + "defined_out": [ + "_%0#0", + "box_prefixed_key%0#1", + "maybe_exists%0#0", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1", + "_%0#0", + "maybe_exists%0#0" + ] + }, + "4988": { + "op": "bury 1", + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1", + "maybe_exists%0#0" + ] + }, + "4990": { + "error": "Invalid account role address", + "op": "assert // Invalid account role address", + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1" + ] + }, + "4991": { + "op": "box_get", + "defined_out": [ + "aggregate%box_get%8#0", + "aggregate%box_get%9#0", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "aggregate%box_get%8#0", + "aggregate%box_get%9#0" + ] + }, + "4992": { + "op": "pop", + "defined_out": [ + "role_address#0", + "tmp%3#0" + ], + "stack_out": [ + "role_address#0", + "tmp%3#0" + ] + }, + "4993": { + "block": "rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9", + "stack_in": [ + "role_address#0", + "tmp%3#0" + ], + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75" + ], + "stack_out": [ + "role_address#0", + "tmp%3#0", + "0x151f7c75" + ] + }, + "4994": { + "op": "swap", + "defined_out": [ + "0x151f7c75", + "tmp%3#0" + ], + "stack_out": [ + "role_address#0", + "0x151f7c75", + "tmp%3#0" + ] + }, + "4995": { + "op": "concat", + "defined_out": [ + "tmp%4#0" + ], + "stack_out": [ + "role_address#0", + "tmp%4#0" + ] + }, + "4996": { + "op": "log", + "stack_out": [ + "role_address#0" + ] + }, + "4997": { + "op": "intc_1 // 1", + "defined_out": [ + "1" + ], + "stack_out": [ + "role_address#0", + "1" + ] + }, + "4998": { + "op": "return", + "stack_out": [ + "role_address#0" + ] + }, + "4999": { + "block": "rbac_get_role_validity_switch_case_4@6", + "stack_in": [ + "role_address#0" + ], + "op": "bytec 21 // 0x5223417574686f7269747923", + "defined_out": [ + "0x5223417574686f7269747923" + ], + "stack_out": [ + "role_address#0", + "0x5223417574686f7269747923" + ] + }, + "5001": { + "op": "dig 1", + "defined_out": [ + "0x5223417574686f7269747923", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "0x5223417574686f7269747923", + "role_address#0" + ] + }, + "5003": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%0#1", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1" + ] + }, + "5004": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%0#1", + "box_prefixed_key%0#1 (copy)", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1", + "box_prefixed_key%0#1 (copy)" + ] + }, + "5005": { + "op": "box_len", + "defined_out": [ + "_%0#0", + "box_prefixed_key%0#1", + "maybe_exists%0#0", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1", + "_%0#0", + "maybe_exists%0#0" + ] + }, + "5006": { + "op": "bury 1", + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1", + "maybe_exists%0#0" + ] + }, + "5008": { + "error": "Invalid account role address", + "op": "assert // Invalid account role address", + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1" + ] + }, + "5009": { + "op": "box_get", + "defined_out": [ + "aggregate%box_get%6#0", + "aggregate%box_get%7#0", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "aggregate%box_get%6#0", + "aggregate%box_get%7#0" + ] + }, + "5010": { + "op": "pop", + "defined_out": [ + "role_address#0", + "tmp%3#0" + ], + "stack_out": [ + "role_address#0", + "tmp%3#0" + ] + }, + "5011": { + "op": "b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9" + }, + "5014": { + "block": "rbac_get_role_validity_switch_case_3@5", + "stack_in": [ + "role_address#0" + ], + "op": "bytec 32 // 0x52235472757374656523", + "defined_out": [ + "0x52235472757374656523" + ], + "stack_out": [ + "role_address#0", + "0x52235472757374656523" + ] + }, + "5016": { + "op": "dig 1", + "defined_out": [ + "0x52235472757374656523", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "0x52235472757374656523", + "role_address#0" + ] + }, + "5018": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%0#1", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1" + ] + }, + "5019": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%0#1", + "box_prefixed_key%0#1 (copy)", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1", + "box_prefixed_key%0#1 (copy)" + ] + }, + "5020": { + "op": "box_len", + "defined_out": [ + "_%0#0", + "box_prefixed_key%0#1", + "maybe_exists%0#0", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1", + "_%0#0", + "maybe_exists%0#0" + ] + }, + "5021": { + "op": "bury 1", + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1", + "maybe_exists%0#0" + ] + }, + "5023": { + "error": "Invalid account role address", + "op": "assert // Invalid account role address", + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1" + ] + }, + "5024": { + "op": "box_get", + "defined_out": [ + "aggregate%box_get%4#0", + "aggregate%box_get%5#0", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "aggregate%box_get%4#0", + "aggregate%box_get%5#0" + ] + }, + "5025": { + "op": "pop", + "defined_out": [ + "role_address#0", + "tmp%3#0" + ], + "stack_out": [ + "role_address#0", + "tmp%3#0" + ] + }, + "5026": { + "op": "b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9" + }, + "5029": { + "block": "rbac_get_role_validity_switch_case_2@4", + "stack_in": [ + "role_address#0" + ], + "op": "bytec 22 // 0x52235072696d6172794465616c657223", + "defined_out": [ + "0x52235072696d6172794465616c657223" + ], + "stack_out": [ + "role_address#0", + "0x52235072696d6172794465616c657223" + ] + }, + "5031": { + "op": "dig 1", + "defined_out": [ + "0x52235072696d6172794465616c657223", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "0x52235072696d6172794465616c657223", + "role_address#0" + ] + }, + "5033": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%0#1", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1" + ] + }, + "5034": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%0#1", + "box_prefixed_key%0#1 (copy)", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1", + "box_prefixed_key%0#1 (copy)" + ] + }, + "5035": { + "op": "box_len", + "defined_out": [ + "_%0#0", + "box_prefixed_key%0#1", + "maybe_exists%0#0", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1", + "_%0#0", + "maybe_exists%0#0" + ] + }, + "5036": { + "op": "bury 1", + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1", + "maybe_exists%0#0" + ] + }, + "5038": { + "error": "Invalid account role address", + "op": "assert // Invalid account role address", + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1" + ] + }, + "5039": { + "op": "box_get", + "defined_out": [ + "aggregate%box_get%2#0", + "aggregate%box_get%3#0", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "aggregate%box_get%2#0", + "aggregate%box_get%3#0" + ] + }, + "5040": { + "op": "pop", + "defined_out": [ + "role_address#0", + "tmp%3#0" + ], + "stack_out": [ + "role_address#0", + "tmp%3#0" + ] + }, + "5041": { + "op": "b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9" + }, + "5044": { + "block": "rbac_get_role_validity_switch_case_1@3", + "stack_in": [ + "role_address#0" + ], + "op": "bytec 23 // 0x52234163636f756e744d616e6167657223", + "defined_out": [ + "0x52234163636f756e744d616e6167657223" + ], + "stack_out": [ + "role_address#0", + "0x52234163636f756e744d616e6167657223" + ] + }, + "5046": { + "op": "dig 1", + "defined_out": [ + "0x52234163636f756e744d616e6167657223", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "0x52234163636f756e744d616e6167657223", + "role_address#0" + ] + }, + "5048": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%0#1", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1" + ] + }, + "5049": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%0#1", + "box_prefixed_key%0#1 (copy)", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1", + "box_prefixed_key%0#1 (copy)" + ] + }, + "5050": { + "op": "box_len", + "defined_out": [ + "_%0#0", + "box_prefixed_key%0#1", + "maybe_exists%0#0", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1", + "_%0#0", + "maybe_exists%0#0" + ] + }, + "5051": { + "op": "bury 1", + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1", + "maybe_exists%0#0" + ] + }, + "5053": { + "error": "Invalid account role address", + "op": "assert // Invalid account role address", + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1" + ] + }, + "5054": { + "op": "box_get", + "defined_out": [ + "aggregate%box_get%0#0", + "aggregate%box_get%1#0", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "aggregate%box_get%0#0", + "aggregate%box_get%1#0" + ] + }, + "5055": { + "op": "pop", + "defined_out": [ + "role_address#0", + "tmp%3#0" + ], + "stack_out": [ + "role_address#0", + "tmp%3#0" + ] + }, + "5056": { + "op": "b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9" + }, + "5059": { + "block": "rbac_get_role_validity_switch_case_0@2", + "stack_in": [ + "role_address#0" + ], + "op": "pushbytes 0x00000000000000000000000000000000", + "defined_out": [ + "tmp%3#0" + ], + "stack_out": [ + "role_address#0", + "tmp%3#0" + ] + }, + "5077": { + "op": "b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9" + }, + "5080": { + "subroutine": "modules.accounting.AccountingModule._assert_is_not_account_suspended", + "params": { + "holding_address#0": "bytes" + }, + "block": "_assert_is_not_account_suspended", + "stack_in": [], + "op": "proto 1 0" + }, + "5083": { + "op": "bytec 8 // 0x52234163636f756e7423", + "defined_out": [ + "0x52234163636f756e7423" + ], + "stack_out": [ + "0x52234163636f756e7423" + ] + }, + "5085": { + "op": "frame_dig -1", + "defined_out": [ + "0x52234163636f756e7423", + "holding_address#0 (copy)" + ], + "stack_out": [ + "0x52234163636f756e7423", + "holding_address#0 (copy)" + ] + }, + "5087": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#0" + ] + }, + "5088": { + "op": "box_get", + "defined_out": [ + "aggregate%box_get%0#0", + "aggregate%box_get%1#0" + ], + "stack_out": [ + "aggregate%box_get%0#0", + "aggregate%box_get%1#0" + ] + }, + "5089": { + "error": "check self.account entry exists", + "op": "assert // check self.account entry exists", + "stack_out": [ + "aggregate%box_get%0#0" + ] + }, + "5090": { + "op": "pushint 384", + "defined_out": [ + "384", + "aggregate%box_get%0#0" + ], + "stack_out": [ + "aggregate%box_get%0#0", + "384" + ] + }, + "5093": { + "op": "getbit", + "defined_out": [ + "aggregate%get_bit%0#0" + ], + "stack_out": [ + "aggregate%get_bit%0#0" + ] + }, + "5094": { + "op": "!", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "5095": { + "error": "Suspended operations", + "op": "assert // Suspended operations", + "stack_out": [] + }, + "5096": { + "retsub": true, + "op": "retsub" + }, + "5097": { + "subroutine": "modules.accounting.AccountingModule._settle_position", + "params": { + "holding_address#0": "bytes" + }, + "block": "_settle_position", + "stack_in": [], + "op": "proto 1 2" + }, + "5100": { + "op": "bytec 8 // 0x52234163636f756e7423", + "defined_out": [ + "0x52234163636f756e7423" + ], + "stack_out": [ + "0x52234163636f756e7423" + ] + }, + "5102": { + "op": "frame_dig -1", + "defined_out": [ + "0x52234163636f756e7423", + "holding_address#0 (copy)" + ], + "stack_out": [ + "0x52234163636f756e7423", + "holding_address#0 (copy)" + ] + }, + "5104": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%0#1" + ], + "stack_out": [ + "box_prefixed_key%0#1" + ] + }, + "5105": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%0#1", + "box_prefixed_key%0#1 (copy)" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "box_prefixed_key%0#1 (copy)" + ] + }, + "5106": { + "op": "box_len", + "defined_out": [ + "_%0#0", + "box_prefixed_key%0#1", + "maybe_exists%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "_%0#0", + "maybe_exists%0#0" + ] + }, + "5107": { + "op": "bury 1", + "stack_out": [ + "box_prefixed_key%0#1", + "maybe_exists%0#0" + ] + }, + "5109": { + "error": "Invalid account holding address", + "op": "assert // Invalid account holding address", + "stack_out": [ + "box_prefixed_key%0#1" + ] + }, + "5110": { + "op": "dup", + "stack_out": [ + "box_prefixed_key%0#1", + "box_prefixed_key%0#1 (copy)" + ] + }, + "5111": { + "op": "box_get", + "defined_out": [ + "aggregate%box_get%1#0", + "box_prefixed_key%0#1", + "position#0" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "aggregate%box_get%1#0" + ] + }, + "5112": { + "op": "pop", + "stack_out": [ + "box_prefixed_key%0#1", + "position#0" + ] + }, + "5113": { + "op": "intc_0 // 0", + "defined_out": [ + "0", + "box_prefixed_key%0#1", + "position#0" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "0" + ] + }, + "5114": { + "op": "bytec 16 // \"cumulative_interest_index\"", + "defined_out": [ + "\"cumulative_interest_index\"", + "0", + "box_prefixed_key%0#1", + "position#0" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "0", + "\"cumulative_interest_index\"" + ] + }, + "5116": { + "op": "app_global_get_ex", + "defined_out": [ + "box_prefixed_key%0#1", + "maybe_exists%0#0", + "maybe_value%0#0", + "position#0" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "5117": { + "error": "check self.cumulative_interest_index exists", + "op": "assert // check self.cumulative_interest_index exists", + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "maybe_value%0#0" + ] + }, + "5118": { + "op": "dig 1", + "defined_out": [ + "box_prefixed_key%0#1", + "maybe_value%0#0", + "position#0", + "position#0 (copy)" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "maybe_value%0#0", + "position#0 (copy)" + ] + }, + "5120": { + "op": "pushint 57", + "defined_out": [ + "57", + "box_prefixed_key%0#1", + "maybe_value%0#0", + "position#0", + "position#0 (copy)" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "maybe_value%0#0", + "position#0 (copy)", + "57" + ] + }, + "5122": { + "op": "extract_uint64", + "defined_out": [ + "box_prefixed_key%0#1", + "maybe_value%0#0", + "position#0", + "values%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "maybe_value%0#0", + "values%0#0" + ] + }, + "5123": { + "op": "-", + "defined_out": [ + "box_prefixed_key%0#1", + "interest_delta#0", + "position#0" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "interest_delta#0" + ] + }, + "5124": { + "op": "intc_0 // 0", + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "interest_delta#0", + "0" + ] + }, + "5125": { + "op": "bytec 17 // \"cumulative_principal_index\"", + "defined_out": [ + "\"cumulative_principal_index\"", + "0", + "box_prefixed_key%0#1", + "interest_delta#0", + "position#0" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "interest_delta#0", + "0", + "\"cumulative_principal_index\"" + ] + }, + "5127": { + "op": "app_global_get_ex", + "defined_out": [ + "box_prefixed_key%0#1", + "interest_delta#0", + "maybe_exists%1#0", + "maybe_value%1#0", + "position#0" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "interest_delta#0", + "maybe_value%1#0", + "maybe_exists%1#0" + ] + }, + "5128": { + "error": "check self.cumulative_principal_index exists", + "op": "assert // check self.cumulative_principal_index exists", + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "interest_delta#0", + "maybe_value%1#0" + ] + }, + "5129": { + "op": "dig 2", + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "interest_delta#0", + "maybe_value%1#0", + "position#0 (copy)" + ] + }, + "5131": { + "op": "pushint 65", + "defined_out": [ + "65", + "box_prefixed_key%0#1", + "interest_delta#0", + "maybe_value%1#0", + "position#0", + "position#0 (copy)" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "interest_delta#0", + "maybe_value%1#0", + "position#0 (copy)", + "65" + ] + }, + "5133": { + "op": "extract_uint64", + "defined_out": [ + "box_prefixed_key%0#1", + "interest_delta#0", + "maybe_value%1#0", + "position#0", + "values%1#0" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "interest_delta#0", + "maybe_value%1#0", + "values%1#0" + ] + }, + "5134": { + "op": "-", + "defined_out": [ + "box_prefixed_key%0#1", + "interest_delta#0", + "position#0", + "principal_delta#0" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "interest_delta#0", + "principal_delta#0" + ] + }, + "5135": { + "op": "dig 2", + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "interest_delta#0", + "principal_delta#0", + "position#0 (copy)" + ] + }, + "5137": { + "op": "intc_3 // 32", + "defined_out": [ + "32", + "box_prefixed_key%0#1", + "interest_delta#0", + "position#0", + "position#0 (copy)", + "principal_delta#0" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "interest_delta#0", + "principal_delta#0", + "position#0 (copy)", + "32" + ] + }, + "5138": { + "op": "extract_uint64", + "defined_out": [ + "box_prefixed_key%0#1", + "interest_delta#0", + "position#0", + "principal_delta#0", + "values%2#0" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "interest_delta#0", + "principal_delta#0", + "values%2#0" + ] + }, + "5139": { + "op": "intc_0 // 0", + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "interest_delta#0", + "principal_delta#0", + "values%2#0", + "0" + ] + }, + "5140": { + "op": "bytec 5 // \"fixed_point_scale\"", + "defined_out": [ + "\"fixed_point_scale\"", + "0", + "box_prefixed_key%0#1", + "interest_delta#0", + "position#0", + "principal_delta#0", + "values%2#0" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "interest_delta#0", + "principal_delta#0", + "values%2#0", + "0", + "\"fixed_point_scale\"" + ] + }, + "5142": { + "op": "app_global_get_ex", + "defined_out": [ + "box_prefixed_key%0#1", + "interest_delta#0", + "maybe_exists%2#0", + "maybe_value%2#0", + "position#0", + "principal_delta#0", + "values%2#0" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "interest_delta#0", + "principal_delta#0", + "values%2#0", + "maybe_value%2#0", + "maybe_exists%2#0" + ] + }, + "5143": { + "error": "check self.fixed_point_scale exists", + "op": "assert // check self.fixed_point_scale exists", + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "interest_delta#0", + "principal_delta#0", + "values%2#0", + "maybe_value%2#0" + ] + }, + "5144": { + "op": "uncover 3", + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "principal_delta#0", + "values%2#0", + "maybe_value%2#0", + "interest_delta#0" + ] + }, + "5146": { + "op": "dig 2", + "defined_out": [ + "box_prefixed_key%0#1", + "interest_delta#0", + "maybe_value%2#0", + "position#0", + "principal_delta#0", + "values%2#0", + "values%2#0 (copy)" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "principal_delta#0", + "values%2#0", + "maybe_value%2#0", + "interest_delta#0", + "values%2#0 (copy)" + ] + }, + "5148": { + "op": "uncover 2", + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "principal_delta#0", + "values%2#0", + "interest_delta#0", + "values%2#0 (copy)", + "maybe_value%2#0" + ] + }, + "5150": { + "callsub": "modules.kernel.ActusKernelModule._scaled_mul_div", + "op": "callsub _scaled_mul_div", + "defined_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "position#0", + "principal_delta#0", + "values%2#0" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "principal_delta#0", + "values%2#0", + "claimable_interest#0" + ] + }, + "5153": { + "op": "intc_0 // 0", + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "principal_delta#0", + "values%2#0", + "claimable_interest#0", + "0" + ] + }, + "5154": { + "op": "bytec 5 // \"fixed_point_scale\"", + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "principal_delta#0", + "values%2#0", + "claimable_interest#0", + "0", + "\"fixed_point_scale\"" + ] + }, + "5156": { + "op": "app_global_get_ex", + "defined_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "maybe_exists%3#0", + "maybe_value%3#0", + "position#0", + "principal_delta#0", + "values%2#0" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "principal_delta#0", + "values%2#0", + "claimable_interest#0", + "maybe_value%3#0", + "maybe_exists%3#0" + ] + }, + "5157": { + "error": "check self.fixed_point_scale exists", + "op": "assert // check self.fixed_point_scale exists", + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "principal_delta#0", + "values%2#0", + "claimable_interest#0", + "maybe_value%3#0" + ] + }, + "5158": { + "op": "uncover 3", + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "values%2#0", + "claimable_interest#0", + "maybe_value%3#0", + "principal_delta#0" + ] + }, + "5160": { + "op": "uncover 3", + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "claimable_interest#0", + "maybe_value%3#0", + "principal_delta#0", + "values%2#0" + ] + }, + "5162": { + "op": "uncover 2", + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "claimable_interest#0", + "principal_delta#0", + "values%2#0", + "maybe_value%3#0" + ] + }, + "5164": { + "callsub": "modules.kernel.ActusKernelModule._scaled_mul_div", + "op": "callsub _scaled_mul_div", + "defined_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "claimable_interest#0", + "claimable_principal#0" + ] + }, + "5167": { + "op": "dig 2", + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "claimable_interest#0", + "claimable_principal#0", + "position#0 (copy)" + ] + }, + "5169": { + "op": "pushint 73", + "defined_out": [ + "73", + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0", + "position#0 (copy)" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "claimable_interest#0", + "claimable_principal#0", + "position#0 (copy)", + "73" + ] + }, + "5171": { + "op": "extract_uint64", + "defined_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0", + "values%4#0" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "claimable_interest#0", + "claimable_principal#0", + "values%4#0" + ] + }, + "5172": { + "op": "dig 2", + "defined_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_interest#0 (copy)", + "claimable_principal#0", + "position#0", + "values%4#0" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "claimable_interest#0", + "claimable_principal#0", + "values%4#0", + "claimable_interest#0 (copy)" + ] + }, + "5174": { + "op": "+", + "defined_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0", + "tmp%4#0" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "claimable_interest#0", + "claimable_principal#0", + "tmp%4#0" + ] + }, + "5175": { + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%0#0", + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "claimable_interest#0", + "claimable_principal#0", + "aggregate%val_as_bytes%0#0" + ] + }, + "5176": { + "op": "uncover 3", + "stack_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "aggregate%val_as_bytes%0#0", + "position#0" + ] + }, + "5178": { + "op": "swap", + "stack_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0", + "aggregate%val_as_bytes%0#0" + ] + }, + "5179": { + "op": "replace2 73", + "stack_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0" + ] + }, + "5181": { + "op": "dup", + "stack_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0", + "position#0 (copy)" + ] + }, + "5182": { + "op": "pushint 81", + "defined_out": [ + "81", + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0", + "position#0 (copy)" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0", + "position#0 (copy)", + "81" + ] + }, + "5184": { + "op": "extract_uint64", + "defined_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0", + "values%5#0" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0", + "values%5#0" + ] + }, + "5185": { + "op": "dig 2", + "defined_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "claimable_principal#0 (copy)", + "position#0", + "values%5#0" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0", + "values%5#0", + "claimable_principal#0 (copy)" + ] + }, + "5187": { + "op": "+", + "defined_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0", + "tmp%5#0" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0", + "tmp%5#0" + ] + }, + "5188": { + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%1#0", + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0", + "aggregate%val_as_bytes%1#0" + ] + }, + "5189": { + "op": "replace2 81", + "stack_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0" + ] + }, + "5191": { + "op": "intc_0 // 0", + "stack_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0", + "0" + ] + }, + "5192": { + "op": "bytec 16 // \"cumulative_interest_index\"", + "stack_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0", + "0", + "\"cumulative_interest_index\"" + ] + }, + "5194": { + "op": "app_global_get_ex", + "defined_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "maybe_exists%4#0", + "maybe_value%4#0", + "position#0" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0", + "maybe_value%4#0", + "maybe_exists%4#0" + ] + }, + "5195": { + "error": "check self.cumulative_interest_index exists", + "op": "assert // check self.cumulative_interest_index exists", + "stack_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0", + "maybe_value%4#0" + ] + }, + "5196": { + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%2#0", + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0", + "aggregate%val_as_bytes%2#0" + ] + }, + "5197": { + "op": "replace2 57", + "stack_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0" + ] + }, + "5199": { + "op": "intc_0 // 0", + "stack_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0", + "0" + ] + }, + "5200": { + "op": "bytec 17 // \"cumulative_principal_index\"", + "stack_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0", + "0", + "\"cumulative_principal_index\"" + ] + }, + "5202": { + "op": "app_global_get_ex", + "defined_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "maybe_exists%5#0", + "maybe_value%5#0", + "position#0" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0", + "maybe_value%5#0", + "maybe_exists%5#0" + ] + }, + "5203": { + "error": "check self.cumulative_principal_index exists", + "op": "assert // check self.cumulative_principal_index exists", + "stack_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0", + "maybe_value%5#0" + ] + }, + "5204": { + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%3#0", + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0", + "aggregate%val_as_bytes%3#0" + ] + }, + "5205": { + "op": "replace2 65", + "stack_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0" + ] + }, + "5207": { + "op": "intc_0 // 0", + "stack_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0", + "0" + ] + }, + "5208": { + "op": "bytec_2 // \"event_cursor\"", + "defined_out": [ + "\"event_cursor\"", + "0", + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0", + "0", + "\"event_cursor\"" + ] + }, + "5209": { + "op": "app_global_get_ex", + "defined_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "maybe_exists%6#0", + "maybe_value%6#0", + "position#0" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0", + "maybe_value%6#0", + "maybe_exists%6#0" + ] + }, + "5210": { + "error": "check self.event_cursor exists", + "op": "assert // check self.event_cursor exists", + "stack_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0", + "maybe_value%6#0" + ] + }, + "5211": { + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%4#0", + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0", + "aggregate%val_as_bytes%4#0" + ] + }, + "5212": { + "op": "replace2 49", + "stack_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0" + ] + }, + "5214": { + "op": "uncover 3", + "stack_out": [ + "claimable_interest#0", + "claimable_principal#0", + "position#0", + "box_prefixed_key%0#1" + ] + }, + "5216": { + "op": "swap", + "stack_out": [ + "claimable_interest#0", + "claimable_principal#0", + "box_prefixed_key%0#1", + "position#0" + ] + }, + "5217": { + "op": "box_put", + "stack_out": [ + "claimable_interest#0", + "claimable_principal#0" + ] + }, + "5218": { + "retsub": true, + "op": "retsub" + }, + "5219": { + "subroutine": "modules.accounting.AccountingModule._ensure_units_activated", + "params": { + "holding_address#0": "bytes" + }, + "block": "_ensure_units_activated", + "stack_in": [], + "op": "proto 1 0" + }, + "5222": { + "op": "intc_0 // 0", + "stack_out": [ + "position#0" + ] + }, + "5223": { + "op": "pushbytes \"\"", + "stack_out": [ + "position#0", + "activated_units#0" + ] + }, + "5225": { + "op": "bytec 8 // 0x52234163636f756e7423", + "defined_out": [ + "0x52234163636f756e7423" + ], + "stack_out": [ + "position#0", + "activated_units#0", + "0x52234163636f756e7423" + ] + }, + "5227": { + "op": "frame_dig -1", + "defined_out": [ + "0x52234163636f756e7423", + "holding_address#0 (copy)" + ], + "stack_out": [ + "position#0", + "activated_units#0", + "0x52234163636f756e7423", + "holding_address#0 (copy)" + ] + }, + "5229": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%0#1" + ], + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1" + ] + }, + "5230": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%0#1" + ], + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "box_prefixed_key%0#1" + ] + }, + "5231": { + "op": "box_len", + "defined_out": [ + "_%0#0", + "box_prefixed_key%0#1", + "maybe_exists%0#0" + ], + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "_%0#0", + "maybe_exists%0#0" + ] + }, + "5232": { + "op": "bury 1", + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "maybe_exists%0#0" + ] + }, + "5234": { + "error": "Invalid account holding address", + "op": "assert // Invalid account holding address", + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1" + ] + }, + "5235": { + "op": "intc_0 // 0", + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "0" + ] + }, + "5236": { + "op": "bytec_1 // \"status\"", + "defined_out": [ + "\"status\"", + "0", + "box_prefixed_key%0#1" + ], + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "0", + "\"status\"" + ] + }, + "5237": { + "op": "app_global_get_ex", + "defined_out": [ + "box_prefixed_key%0#1", + "maybe_exists%0#0", + "maybe_value%0#0" + ], + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "5238": { + "error": "check self.status exists", + "op": "assert // check self.status exists", + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "maybe_value%0#0" + ] + }, + "5239": { + "op": "pushint 50", + "defined_out": [ + "50", + "box_prefixed_key%0#1", + "maybe_value%0#0" + ], + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "maybe_value%0#0", + "50" + ] + }, + "5241": { + "op": "==", + "defined_out": [ + "box_prefixed_key%0#1", + "tmp%0#1" + ], + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "tmp%0#1" + ] + }, + "5242": { + "op": "bz _ensure_units_activated_after_if_else@2", + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1" + ] + }, + "5245": { + "retsub": true, + "op": "retsub" + }, + "5246": { + "block": "_ensure_units_activated_after_if_else@2", + "stack_in": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1" + ], + "op": "frame_dig 2", + "defined_out": [ + "box_prefixed_key%0#1" + ], + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "box_prefixed_key%0#1" + ] + }, + "5248": { + "op": "box_get", + "defined_out": [ + "aggregate%box_get%1#0", + "box_prefixed_key%0#1", + "position#0" + ], + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "position#0", + "aggregate%box_get%1#0" + ] + }, + "5249": { + "op": "swap", + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "aggregate%box_get%1#0", + "position#0" + ] + }, + "5250": { + "op": "dup", + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "aggregate%box_get%1#0", + "position#0", + "position#0 (copy)" + ] + }, + "5251": { + "op": "cover 2", + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "position#0", + "aggregate%box_get%1#0", + "position#0" + ] + }, + "5253": { + "op": "frame_bury 0", + "defined_out": [ + "aggregate%box_get%1#0", + "box_prefixed_key%0#1", + "position#0" + ], + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "position#0", + "aggregate%box_get%1#0" + ] + }, + "5255": { + "error": "check self.account entry exists", + "op": "assert // check self.account entry exists", + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "position#0" + ] + }, + "5256": { + "op": "pushint 40", + "defined_out": [ + "40", + "box_prefixed_key%0#1", + "position#0" + ], + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "position#0", + "40" + ] + }, + "5258": { + "op": "extract_uint64", + "defined_out": [ + "activated_units#0", + "box_prefixed_key%0#1", + "position#0" + ], + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "activated_units#0" + ] + }, + "5259": { + "op": "dup", + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "activated_units#0", + "activated_units#0" + ] + }, + "5260": { + "op": "frame_bury 1", + "defined_out": [ + "activated_units#0", + "box_prefixed_key%0#1", + "position#0" + ], + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "activated_units#0" + ] + }, + "5262": { + "op": "bnz _ensure_units_activated_after_if_else@4", + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1" + ] + }, + "5265": { + "retsub": true, + "op": "retsub" + }, + "5266": { + "block": "_ensure_units_activated_after_if_else@4", + "stack_in": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1" + ], + "op": "frame_dig 0", + "defined_out": [ + "position#0" + ], + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "position#0" + ] + }, + "5268": { + "op": "dup", + "defined_out": [ + "position#0", + "position#0 (copy)" + ], + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "position#0", + "position#0 (copy)" + ] + }, + "5269": { + "op": "intc_3 // 32", + "defined_out": [ + "32", + "position#0", + "position#0 (copy)" + ], + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "position#0", + "position#0 (copy)", + "32" + ] + }, + "5270": { + "op": "extract_uint64", + "defined_out": [ + "position#0", + "values%2#0" + ], + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "position#0", + "values%2#0" + ] + }, + "5271": { + "op": "frame_dig 1", + "defined_out": [ + "activated_units#0", + "position#0", + "values%2#0" + ], + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "position#0", + "values%2#0", + "activated_units#0" + ] + }, + "5273": { + "op": "dup", + "defined_out": [ + "activated_units#0", + "activated_units#0 (copy)", + "position#0", + "values%2#0" + ], + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "position#0", + "values%2#0", + "activated_units#0 (copy)", + "activated_units#0 (copy)" + ] + }, + "5274": { + "op": "cover 3", + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "activated_units#0", + "position#0", + "values%2#0", + "activated_units#0 (copy)" + ] + }, + "5276": { + "op": "+", + "defined_out": [ + "activated_units#0", + "position#0", + "tmp%2#0" + ], + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "activated_units#0", + "position#0", + "tmp%2#0" + ] + }, + "5277": { + "op": "itob", + "defined_out": [ + "activated_units#0", + "aggregate%val_as_bytes%0#0", + "position#0" + ], + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "activated_units#0", + "position#0", + "aggregate%val_as_bytes%0#0" + ] + }, + "5278": { + "op": "replace2 32", + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "activated_units#0", + "position#0" + ] + }, + "5280": { + "op": "intc_0 // 0", + "defined_out": [ + "0", + "activated_units#0", + "position#0" + ], + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "activated_units#0", + "position#0", + "0" + ] + }, + "5281": { + "op": "itob", + "defined_out": [ + "activated_units#0", + "aggregate%val_as_bytes%1#0", + "position#0" + ], + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "activated_units#0", + "position#0", + "aggregate%val_as_bytes%1#0" + ] + }, + "5282": { + "op": "replace2 40", + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "activated_units#0", + "position#0" + ] + }, + "5284": { + "op": "frame_dig 2", + "defined_out": [ + "activated_units#0", + "box_prefixed_key%0#1", + "position#0" + ], + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "activated_units#0", + "position#0", + "box_prefixed_key%0#1" + ] + }, + "5286": { + "op": "swap", + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "activated_units#0", + "box_prefixed_key%0#1", + "position#0" + ] + }, + "5287": { + "op": "box_put", + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "activated_units#0" + ] + }, + "5288": { + "op": "intc_0 // 0", + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "activated_units#0", + "0" + ] + }, + "5289": { + "op": "bytec 10 // \"reserved_units_total\"", + "defined_out": [ + "\"reserved_units_total\"", + "0", + "activated_units#0", + "box_prefixed_key%0#1", + "position#0" + ], + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "activated_units#0", + "0", + "\"reserved_units_total\"" + ] + }, + "5291": { + "op": "app_global_get_ex", + "defined_out": [ + "activated_units#0", + "box_prefixed_key%0#1", + "maybe_exists%0#0", + "maybe_value%0#0", + "position#0" + ], + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "activated_units#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "5292": { + "error": "check self.reserved_units_total exists", + "op": "assert // check self.reserved_units_total exists", + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "activated_units#0", + "maybe_value%0#0" + ] + }, + "5293": { + "op": "dup", + "defined_out": [ + "activated_units#0", + "box_prefixed_key%0#1", + "maybe_value%0#0", + "maybe_value%0#0 (copy)", + "position#0" + ], + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "activated_units#0", + "maybe_value%0#0", + "maybe_value%0#0 (copy)" + ] + }, + "5294": { + "op": "dig 2", + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "activated_units#0", + "maybe_value%0#0", + "maybe_value%0#0 (copy)", + "activated_units#0 (copy)" + ] + }, + "5296": { + "op": ">=", + "defined_out": [ + "activated_units#0", + "box_prefixed_key%0#1", + "maybe_value%0#0", + "position#0", + "tmp%3#0" + ], + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "activated_units#0", + "maybe_value%0#0", + "tmp%3#0" + ] + }, + "5297": { + "error": "Insufficient remaining D-ASA units", + "op": "assert // Insufficient remaining D-ASA units", + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "activated_units#0", + "maybe_value%0#0" + ] + }, + "5298": { + "op": "swap", + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "maybe_value%0#0", + "activated_units#0" + ] + }, + "5299": { + "op": "-", + "defined_out": [ + "activated_units#0", + "box_prefixed_key%0#1", + "position#0", + "tmp%4#0" + ], + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "tmp%4#0" + ] + }, + "5300": { + "op": "bytec 10 // \"reserved_units_total\"", + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "tmp%4#0", + "\"reserved_units_total\"" + ] + }, + "5302": { + "op": "swap", + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "\"reserved_units_total\"", + "tmp%4#0" + ] + }, + "5303": { + "op": "app_global_put", + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1" + ] + }, + "5304": { + "retsub": true, + "op": "retsub" + }, + "5305": { + "subroutine": "modules.kernel.ActusKernelModule._scaled_mul_div", + "params": { + "multiplicand#0": "uint64", + "multiplier#0": "uint64", + "divisor#0": "uint64" + }, + "block": "_scaled_mul_div", + "stack_in": [], + "op": "proto 3 1" + }, + "5308": { + "op": "frame_dig -3", + "defined_out": [ + "multiplicand#0 (copy)" + ], + "stack_out": [ + "multiplicand#0 (copy)" + ] + }, + "5310": { + "op": "bz _scaled_mul_div_if_body@2", + "stack_out": [] + }, + "5313": { + "op": "frame_dig -2", + "defined_out": [ + "multiplier#0 (copy)" + ], + "stack_out": [ + "multiplier#0 (copy)" + ] + }, + "5315": { + "op": "bnz _scaled_mul_div_after_if_else@3", + "stack_out": [] + }, + "5318": { + "block": "_scaled_mul_div_if_body@2", + "stack_in": [], + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "0" + ] + }, + "5319": { + "retsub": true, + "op": "retsub" + }, + "5320": { + "block": "_scaled_mul_div_after_if_else@3", + "stack_in": [], + "op": "frame_dig -3", + "defined_out": [ + "multiplicand#0 (copy)" + ], + "stack_out": [ + "multiplicand#0 (copy)" + ] + }, + "5322": { + "op": "frame_dig -2", + "defined_out": [ + "multiplicand#0 (copy)", + "multiplier#0 (copy)" + ], + "stack_out": [ + "multiplicand#0 (copy)", + "multiplier#0 (copy)" + ] + }, + "5324": { + "op": "mulw", + "defined_out": [ + "high#0", + "low#0" + ], + "stack_out": [ + "high#0", + "low#0" + ] + }, + "5325": { + "op": "frame_dig -1", + "defined_out": [ + "divisor#0 (copy)", + "high#0", + "low#0" + ], + "stack_out": [ + "high#0", + "low#0", + "divisor#0 (copy)" + ] + }, + "5327": { + "op": "divw", + "defined_out": [ + "tmp%4#0" + ], + "stack_out": [ + "tmp%4#0" + ] + }, + "5328": { + "retsub": true, + "op": "retsub" + }, + "5329": { + "subroutine": "modules.kernel.ActusKernelModule._amount_to_index_delta", + "params": { + "amount#0": "uint64" + }, + "block": "_amount_to_index_delta", + "stack_in": [], + "op": "proto 1 1" + }, + "5332": { + "op": "frame_dig -1", + "defined_out": [ + "amount#0 (copy)" + ], + "stack_out": [ + "amount#0 (copy)" + ] + }, + "5334": { + "op": "bnz _amount_to_index_delta_after_if_else@2", + "stack_out": [] + }, + "5337": { + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "0" + ] + }, + "5338": { + "retsub": true, + "op": "retsub" + }, + "5339": { + "block": "_amount_to_index_delta_after_if_else@2", + "stack_in": [], + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "0" + ] + }, + "5340": { + "op": "bytec 13 // \"total_units\"", + "defined_out": [ + "\"total_units\"", + "0" + ], + "stack_out": [ + "0", + "\"total_units\"" + ] + }, + "5342": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0" + ], + "stack_out": [ + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "5343": { + "error": "check self.total_units exists", + "op": "assert // check self.total_units exists", + "stack_out": [ + "maybe_value%0#0" + ] + }, + "5344": { + "op": "dup", + "defined_out": [ + "maybe_value%0#0", + "maybe_value%0#0 (copy)" + ], + "stack_out": [ + "maybe_value%0#0", + "maybe_value%0#0 (copy)" + ] + }, + "5345": { + "error": "No D-ASA units", + "op": "assert // No D-ASA units", + "stack_out": [ + "maybe_value%0#0" + ] + }, + "5346": { + "op": "intc_0 // 0", + "stack_out": [ + "maybe_value%0#0", + "0" + ] + }, + "5347": { + "op": "bytec 5 // \"fixed_point_scale\"", + "defined_out": [ + "\"fixed_point_scale\"", + "0", + "maybe_value%0#0" + ], + "stack_out": [ + "maybe_value%0#0", + "0", + "\"fixed_point_scale\"" + ] + }, + "5349": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%1#0", + "maybe_value%0#0", + "maybe_value%1#0" + ], + "stack_out": [ + "maybe_value%0#0", + "maybe_value%1#0", + "maybe_exists%1#0" + ] + }, + "5350": { + "error": "check self.fixed_point_scale exists", + "op": "assert // check self.fixed_point_scale exists", + "stack_out": [ + "maybe_value%0#0", + "maybe_value%1#0" + ] + }, + "5351": { + "op": "frame_dig -1", + "defined_out": [ + "amount#0 (copy)", + "maybe_value%0#0", + "maybe_value%1#0" + ], + "stack_out": [ + "maybe_value%0#0", + "maybe_value%1#0", + "amount#0 (copy)" + ] + }, + "5353": { + "op": "swap", + "stack_out": [ + "maybe_value%0#0", + "amount#0 (copy)", + "maybe_value%1#0" + ] + }, + "5354": { + "op": "uncover 2", + "stack_out": [ + "amount#0 (copy)", + "maybe_value%1#0", + "maybe_value%0#0" + ] + }, + "5356": { + "callsub": "modules.kernel.ActusKernelModule._scaled_mul_div", + "op": "callsub _scaled_mul_div", + "defined_out": [ + "tmp%2#0" + ], + "stack_out": [ + "tmp%2#0" + ] + }, + "5359": { + "retsub": true, + "op": "retsub" + }, + "5360": { + "subroutine": "modules.kernel.ActusKernelModule._index_delta_to_amount", + "params": { + "index_delta#0": "uint64" + }, + "block": "_index_delta_to_amount", + "stack_in": [], + "op": "proto 1 1" + }, + "5363": { + "op": "frame_dig -1", + "defined_out": [ + "index_delta#0 (copy)" + ], + "stack_out": [ + "index_delta#0 (copy)" + ] + }, + "5365": { + "op": "bnz _index_delta_to_amount_after_if_else@2", + "stack_out": [] + }, + "5368": { + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "0" + ] + }, + "5369": { + "retsub": true, + "op": "retsub" + }, + "5370": { + "block": "_index_delta_to_amount_after_if_else@2", + "stack_in": [], + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "0" + ] + }, + "5371": { + "op": "bytec 13 // \"total_units\"", + "defined_out": [ + "\"total_units\"", + "0" + ], + "stack_out": [ + "0", + "\"total_units\"" + ] + }, + "5373": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0" + ], + "stack_out": [ + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "5374": { + "error": "check self.total_units exists", + "op": "assert // check self.total_units exists", + "stack_out": [ + "maybe_value%0#0" + ] + }, + "5375": { + "op": "intc_0 // 0", + "stack_out": [ + "maybe_value%0#0", + "0" + ] + }, + "5376": { + "op": "bytec 5 // \"fixed_point_scale\"", + "defined_out": [ + "\"fixed_point_scale\"", + "0", + "maybe_value%0#0" + ], + "stack_out": [ + "maybe_value%0#0", + "0", + "\"fixed_point_scale\"" + ] + }, + "5378": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%1#0", + "maybe_value%0#0", + "maybe_value%1#0" + ], + "stack_out": [ + "maybe_value%0#0", + "maybe_value%1#0", + "maybe_exists%1#0" + ] + }, + "5379": { + "error": "check self.fixed_point_scale exists", + "op": "assert // check self.fixed_point_scale exists", + "stack_out": [ + "maybe_value%0#0", + "maybe_value%1#0" + ] + }, + "5380": { + "op": "frame_dig -1" + }, + "5382": { + "op": "swap", + "defined_out": [ + "index_delta#0 (copy)", + "maybe_value%0#0", + "maybe_value%1#0" + ], + "stack_out": [ + "maybe_value%0#0", + "index_delta#0 (copy)", + "maybe_value%1#0" + ] + }, + "5383": { + "callsub": "modules.kernel.ActusKernelModule._scaled_mul_div", + "op": "callsub _scaled_mul_div", + "defined_out": [ + "tmp%1#0" + ], + "stack_out": [ + "tmp%1#0" + ] + }, + "5386": { + "retsub": true, + "op": "retsub" + }, + "5387": { + "subroutine": "modules.kernel.ActusKernelModule._get_schedule_entry", + "params": { + "event_id#0": "uint64" + }, + "block": "_get_schedule_entry", + "stack_in": [], + "op": "proto 1 1" + }, + "5390": { + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "0" + ] + }, + "5391": { + "op": "bytec 4 // \"schedule_entry_count\"", + "defined_out": [ + "\"schedule_entry_count\"", + "0" + ], + "stack_out": [ + "0", + "\"schedule_entry_count\"" + ] + }, + "5393": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0" + ], + "stack_out": [ + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "5394": { + "error": "check self.schedule_entry_count exists", + "op": "assert // check self.schedule_entry_count exists", + "stack_out": [ + "maybe_value%0#0" + ] + }, + "5395": { + "op": "frame_dig -1", + "defined_out": [ + "event_id#0 (copy)", + "maybe_value%0#0" + ], + "stack_out": [ + "maybe_value%0#0", + "event_id#0 (copy)" + ] + }, + "5397": { + "op": ">", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "5398": { + "error": "Invalid event id", + "op": "assert // Invalid event id", + "stack_out": [] + }, + "5399": { + "op": "frame_dig -1", + "stack_out": [ + "event_id#0 (copy)" + ] + }, + "5401": { + "op": "pushint 16", + "defined_out": [ + "16", + "event_id#0 (copy)" + ], + "stack_out": [ + "event_id#0 (copy)", + "16" + ] + }, + "5403": { + "op": "/", + "defined_out": [ + "page_index#0" + ], + "stack_out": [ + "page_index#0" + ] + }, + "5404": { + "op": "itob", + "defined_out": [ + "encoded_value%0#0" + ], + "stack_out": [ + "encoded_value%0#0" + ] + }, + "5405": { + "op": "bytec 31 // 0x5323", + "defined_out": [ + "0x5323", + "encoded_value%0#0" + ], + "stack_out": [ + "encoded_value%0#0", + "0x5323" + ] + }, + "5407": { + "op": "swap", + "stack_out": [ + "0x5323", + "encoded_value%0#0" + ] + }, + "5408": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#0" + ] + }, + "5409": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%0#0", + "box_prefixed_key%0#0 (copy)" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "box_prefixed_key%0#0 (copy)" + ] + }, + "5410": { + "op": "box_len", + "defined_out": [ + "_%0#0", + "box_prefixed_key%0#0", + "maybe_exists%1#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "_%0#0", + "maybe_exists%1#0" + ] + }, + "5411": { + "op": "bury 1", + "stack_out": [ + "box_prefixed_key%0#0", + "maybe_exists%1#0" + ] + }, + "5413": { + "error": "Invalid schedule page", + "op": "assert // Invalid schedule page", + "stack_out": [ + "box_prefixed_key%0#0" + ] + }, + "5414": { + "op": "frame_dig -1", + "stack_out": [ + "box_prefixed_key%0#0", + "event_id#0 (copy)" + ] + }, + "5416": { + "op": "pushint 16", + "stack_out": [ + "box_prefixed_key%0#0", + "event_id#0 (copy)", + "16" + ] + }, + "5418": { + "op": "%", + "defined_out": [ + "box_prefixed_key%0#0", + "offset#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "offset#0" + ] + }, + "5419": { + "op": "dig 1", + "stack_out": [ + "box_prefixed_key%0#0", + "offset#0", + "box_prefixed_key%0#0 (copy)" + ] + }, + "5421": { + "op": "intc_0 // 0", + "stack_out": [ + "box_prefixed_key%0#0", + "offset#0", + "box_prefixed_key%0#0 (copy)", + "0" + ] + }, + "5422": { + "op": "pushint 2", + "defined_out": [ + "0", + "2", + "box_prefixed_key%0#0", + "box_prefixed_key%0#0 (copy)", + "offset#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "offset#0", + "box_prefixed_key%0#0 (copy)", + "0", + "2" + ] + }, + "5424": { + "op": "box_extract", + "defined_out": [ + "box%box_extract%0#0", + "box_prefixed_key%0#0", + "offset#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "offset#0", + "box%box_extract%0#0" + ] + }, + "5425": { + "op": "btoi", + "defined_out": [ + "box%array_length%0#0", + "box_prefixed_key%0#0", + "offset#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "offset#0", + "box%array_length%0#0" + ] + }, + "5426": { + "op": "dig 1", + "defined_out": [ + "box%array_length%0#0", + "box_prefixed_key%0#0", + "offset#0", + "offset#0 (copy)" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "offset#0", + "box%array_length%0#0", + "offset#0 (copy)" + ] + }, + "5428": { + "op": ">", + "defined_out": [ + "box_prefixed_key%0#0", + "offset#0", + "tmp%4#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "offset#0", + "tmp%4#0" + ] + }, + "5429": { + "error": "Invalid schedule page", + "op": "assert // Invalid schedule page", + "stack_out": [ + "box_prefixed_key%0#0", + "offset#0" + ] + }, + "5430": { + "op": "pushint 65", + "defined_out": [ + "65", + "box_prefixed_key%0#0", + "offset#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "offset#0", + "65" + ] + }, + "5432": { + "op": "*", + "defined_out": [ + "box%element_offset%0#0", + "box_prefixed_key%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "box%element_offset%0#0" + ] + }, + "5433": { + "op": "pushint 2", + "stack_out": [ + "box_prefixed_key%0#0", + "box%element_offset%0#0", + "2" + ] + }, + "5435": { + "op": "+", + "defined_out": [ + "box%offset%0#0", + "box_prefixed_key%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "box%offset%0#0" + ] + }, + "5436": { + "op": "pushint 65", + "stack_out": [ + "box_prefixed_key%0#0", + "box%offset%0#0", + "65" + ] + }, + "5438": { + "op": "box_extract", + "defined_out": [ + "box%box_extract%1#0" + ], + "stack_out": [ + "box%box_extract%1#0" + ] + }, + "5439": { + "retsub": true, + "op": "retsub" + }, + "5440": { + "subroutine": "modules.kernel.ActusKernelModule._assert_event_allowed_for_contract_type", + "params": { + "contract_type#0": "uint64", + "event_type#0": "uint64" + }, + "block": "_assert_event_allowed_for_contract_type", + "stack_in": [], + "op": "proto 2 0" + }, + "5443": { + "op": "frame_dig -1", + "defined_out": [ + "event_type#0 (copy)" + ], + "stack_out": [ + "event_type#0 (copy)" + ] + }, + "5445": { + "op": "intc_1 // 1", + "defined_out": [ + "1", + "event_type#0 (copy)" + ], + "stack_out": [ + "event_type#0 (copy)", + "1" + ] + }, + "5446": { + "op": "==", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "5447": { + "op": "bnz _assert_event_allowed_for_contract_type_if_body@6", + "stack_out": [] + }, + "5450": { + "op": "frame_dig -1", + "stack_out": [ + "event_type#0 (copy)" + ] + }, + "5452": { + "op": "intc_2 // 8", + "defined_out": [ + "8", + "event_type#0 (copy)" + ], + "stack_out": [ + "event_type#0 (copy)", + "8" + ] + }, + "5453": { + "op": "==", + "defined_out": [ + "tmp%1#0" + ], + "stack_out": [ + "tmp%1#0" + ] + }, + "5454": { + "op": "bnz _assert_event_allowed_for_contract_type_if_body@6", + "stack_out": [] + }, + "5457": { + "op": "frame_dig -1", + "stack_out": [ + "event_type#0 (copy)" + ] + }, + "5459": { + "op": "pushint 19", + "defined_out": [ + "19", + "event_type#0 (copy)" + ], + "stack_out": [ + "event_type#0 (copy)", + "19" + ] + }, + "5461": { + "op": "==", + "defined_out": [ + "tmp%2#0" + ], + "stack_out": [ + "tmp%2#0" + ] + }, + "5462": { + "op": "bnz _assert_event_allowed_for_contract_type_if_body@6", + "stack_out": [] + }, + "5465": { + "op": "frame_dig -1", + "stack_out": [ + "event_type#0 (copy)" + ] + }, + "5467": { + "op": "pushint 12", + "defined_out": [ + "12", + "event_type#0 (copy)" + ], + "stack_out": [ + "event_type#0 (copy)", + "12" + ] + }, + "5469": { + "op": "==", + "defined_out": [ + "tmp%3#0" + ], + "stack_out": [ + "tmp%3#0" + ] + }, + "5470": { + "op": "bnz _assert_event_allowed_for_contract_type_if_body@6", + "stack_out": [] + }, + "5473": { + "op": "frame_dig -1", + "stack_out": [ + "event_type#0 (copy)" + ] + }, + "5475": { + "op": "pushint 11", + "defined_out": [ + "11", + "event_type#0 (copy)" + ], + "stack_out": [ + "event_type#0 (copy)", + "11" + ] + }, + "5477": { + "op": "==", + "defined_out": [ + "tmp%4#0" + ], + "stack_out": [ + "tmp%4#0" + ] + }, + "5478": { + "op": "bz _assert_event_allowed_for_contract_type_after_if_else@7", + "stack_out": [] + }, + "5481": { + "block": "_assert_event_allowed_for_contract_type_if_body@6", + "stack_in": [], + "op": "intc_1 // 1", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "5482": { + "error": "Invalid ACTUS configuration", + "block": "_assert_event_allowed_for_contract_type_after_inlined_modules.kernel.ActusKernelModule._event_allowed_for_contract_type@34", + "stack_in": [ + "tmp%0#0" + ], + "op": "assert // Invalid ACTUS configuration", + "defined_out": [], + "stack_out": [] + }, + "5483": { + "retsub": true, + "op": "retsub" + }, + "5484": { + "block": "_assert_event_allowed_for_contract_type_after_if_else@7", + "stack_in": [], + "op": "frame_dig -2", + "defined_out": [ + "contract_type#0 (copy)" + ], + "stack_out": [ + "contract_type#0 (copy)" + ] + }, + "5486": { + "op": "bnz _assert_event_allowed_for_contract_type_after_if_else@9", + "stack_out": [] + }, + "5489": { + "op": "intc_0 // 0", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "5490": { + "op": "b _assert_event_allowed_for_contract_type_after_inlined_modules.kernel.ActusKernelModule._event_allowed_for_contract_type@34" + }, + "5493": { + "block": "_assert_event_allowed_for_contract_type_after_if_else@9", + "stack_in": [], + "op": "frame_dig -2", + "defined_out": [ + "contract_type#0 (copy)" + ], + "stack_out": [ + "contract_type#0 (copy)" + ] + }, + "5495": { + "op": "pushint 3", + "defined_out": [ + "3", + "contract_type#0 (copy)" + ], + "stack_out": [ + "contract_type#0 (copy)", + "3" + ] + }, + "5497": { + "op": "==", + "defined_out": [ + "tmp%6#0" + ], + "stack_out": [ + "tmp%6#0" + ] + }, + "5498": { + "op": "bnz _assert_event_allowed_for_contract_type_if_body@11", + "stack_out": [] + }, + "5501": { + "op": "frame_dig -2", + "stack_out": [ + "contract_type#0 (copy)" + ] + }, + "5503": { + "op": "pushint 2", + "defined_out": [ + "2", + "contract_type#0 (copy)" + ], + "stack_out": [ + "contract_type#0 (copy)", + "2" + ] + }, + "5505": { + "op": "==", + "defined_out": [ + "tmp%7#0" + ], + "stack_out": [ + "tmp%7#0" + ] + }, + "5506": { + "op": "bz _assert_event_allowed_for_contract_type_after_if_else@16", + "stack_out": [] + }, + "5509": { + "block": "_assert_event_allowed_for_contract_type_if_body@11", + "stack_in": [], + "op": "frame_dig -1", + "defined_out": [ + "event_type#0 (copy)" + ], + "stack_out": [ + "event_type#0 (copy)" + ] + }, + "5511": { + "op": "pushint 3", + "defined_out": [ + "3", + "event_type#0 (copy)" + ], + "stack_out": [ + "event_type#0 (copy)", + "3" + ] + }, + "5513": { + "op": "==", + "defined_out": [ + "tmp%8#0" + ], + "stack_out": [ + "tmp%8#0" + ] + }, + "5514": { + "op": "bnz _assert_event_allowed_for_contract_type_bool_true@13", + "stack_out": [] + }, + "5517": { + "op": "frame_dig -1", + "stack_out": [ + "event_type#0 (copy)" + ] + }, + "5519": { + "op": "pushint 18", + "defined_out": [ + "18", + "event_type#0 (copy)" + ], + "stack_out": [ + "event_type#0 (copy)", + "18" + ] + }, + "5521": { + "op": "==", + "defined_out": [ + "tmp%9#0" + ], + "stack_out": [ + "tmp%9#0" + ] + }, + "5522": { + "op": "bz _assert_event_allowed_for_contract_type_bool_false@14", + "stack_out": [] + }, + "5525": { + "block": "_assert_event_allowed_for_contract_type_bool_true@13", + "stack_in": [], + "op": "intc_1 // 1", + "defined_out": [ + "or_result%0#0" + ], + "stack_out": [ + "or_result%0#0" + ] + }, + "5526": { + "op": "b _assert_event_allowed_for_contract_type_after_inlined_modules.kernel.ActusKernelModule._event_allowed_for_contract_type@34", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "5529": { + "block": "_assert_event_allowed_for_contract_type_bool_false@14", + "stack_in": [], + "op": "intc_0 // 0", + "defined_out": [ + "or_result%0#0" + ], + "stack_out": [ + "or_result%0#0" + ] + }, + "5530": { + "op": "b _assert_event_allowed_for_contract_type_after_inlined_modules.kernel.ActusKernelModule._event_allowed_for_contract_type@34", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "5533": { + "block": "_assert_event_allowed_for_contract_type_after_if_else@16", + "stack_in": [], + "op": "frame_dig -2", + "defined_out": [ + "contract_type#0 (copy)" + ], + "stack_out": [ + "contract_type#0 (copy)" + ] + }, + "5535": { + "op": "intc_1 // 1", + "defined_out": [ + "1", + "contract_type#0 (copy)" + ], + "stack_out": [ + "contract_type#0 (copy)", + "1" + ] + }, + "5536": { + "op": "==", + "defined_out": [ + "tmp%10#0" + ], + "stack_out": [ + "tmp%10#0" + ] + }, + "5537": { + "op": "bz _assert_event_allowed_for_contract_type_after_if_else@23", + "stack_out": [] + }, + "5540": { + "op": "frame_dig -1", + "defined_out": [ + "event_type#0 (copy)" + ], + "stack_out": [ + "event_type#0 (copy)" + ] + }, + "5542": { + "op": "pushint 3", + "defined_out": [ + "3", + "event_type#0 (copy)" + ], + "stack_out": [ + "event_type#0 (copy)", + "3" + ] + }, + "5544": { + "op": "==", + "defined_out": [ + "tmp%11#0" + ], + "stack_out": [ + "tmp%11#0" + ] + }, + "5545": { + "op": "bnz _assert_event_allowed_for_contract_type_bool_true@20", + "stack_out": [] + }, + "5548": { + "op": "frame_dig -1", + "stack_out": [ + "event_type#0 (copy)" + ] + }, + "5550": { + "op": "pushint 18", + "defined_out": [ + "18", + "event_type#0 (copy)" + ], + "stack_out": [ + "event_type#0 (copy)", + "18" + ] + }, + "5552": { + "op": "==", + "defined_out": [ + "tmp%12#0" + ], + "stack_out": [ + "tmp%12#0" + ] + }, + "5553": { + "op": "bnz _assert_event_allowed_for_contract_type_bool_true@20", + "stack_out": [] + }, + "5556": { + "op": "frame_dig -1", + "stack_out": [ + "event_type#0 (copy)" + ] + }, + "5558": { + "op": "pushint 5", + "defined_out": [ + "5", + "event_type#0 (copy)" + ], + "stack_out": [ + "event_type#0 (copy)", + "5" + ] + }, + "5560": { + "op": "==", + "defined_out": [ + "tmp%13#0" + ], + "stack_out": [ + "tmp%13#0" + ] + }, + "5561": { + "op": "bz _assert_event_allowed_for_contract_type_bool_false@21", + "stack_out": [] + }, + "5564": { + "block": "_assert_event_allowed_for_contract_type_bool_true@20", + "stack_in": [], + "op": "intc_1 // 1", + "defined_out": [ + "or_result%1#0" + ], + "stack_out": [ + "or_result%1#0" + ] + }, + "5565": { + "op": "b _assert_event_allowed_for_contract_type_after_inlined_modules.kernel.ActusKernelModule._event_allowed_for_contract_type@34", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "5568": { + "block": "_assert_event_allowed_for_contract_type_bool_false@21", + "stack_in": [], + "op": "intc_0 // 0", + "defined_out": [ + "or_result%1#0" + ], + "stack_out": [ + "or_result%1#0" + ] + }, + "5569": { + "op": "b _assert_event_allowed_for_contract_type_after_inlined_modules.kernel.ActusKernelModule._event_allowed_for_contract_type@34", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "5572": { + "block": "_assert_event_allowed_for_contract_type_after_if_else@23", + "stack_in": [], + "op": "frame_dig -2", + "defined_out": [ + "contract_type#0 (copy)" + ], + "stack_out": [ + "contract_type#0 (copy)" + ] + }, + "5574": { + "op": "pushint 4", + "defined_out": [ + "4", + "contract_type#0 (copy)" + ], + "stack_out": [ + "contract_type#0 (copy)", + "4" + ] + }, + "5576": { + "op": "==", + "defined_out": [ + "tmp%14#0" + ], + "stack_out": [ + "tmp%14#0" + ] + }, + "5577": { + "op": "bz _assert_event_allowed_for_contract_type_after_if_else@31", + "stack_out": [] + }, + "5580": { + "op": "frame_dig -1", + "defined_out": [ + "event_type#0 (copy)" + ], + "stack_out": [ + "event_type#0 (copy)" + ] + }, + "5582": { + "op": "pushint 3", + "defined_out": [ + "3", + "event_type#0 (copy)" + ], + "stack_out": [ + "event_type#0 (copy)", + "3" + ] + }, + "5584": { + "op": "==", + "defined_out": [ + "tmp%15#0" + ], + "stack_out": [ + "tmp%15#0" + ] + }, + "5585": { + "op": "bnz _assert_event_allowed_for_contract_type_bool_true@28", + "stack_out": [] + }, + "5588": { + "op": "frame_dig -1", + "stack_out": [ + "event_type#0 (copy)" + ] + }, + "5590": { + "op": "pushint 4", + "stack_out": [ + "event_type#0 (copy)", + "4" + ] + }, + "5592": { + "op": "==", + "defined_out": [ + "tmp%16#0" + ], + "stack_out": [ + "tmp%16#0" + ] + }, + "5593": { + "op": "bnz _assert_event_allowed_for_contract_type_bool_true@28", + "stack_out": [] + }, + "5596": { + "op": "frame_dig -1", + "stack_out": [ + "event_type#0 (copy)" + ] + }, + "5598": { + "op": "pushint 18", + "defined_out": [ + "18", + "event_type#0 (copy)" + ], + "stack_out": [ + "event_type#0 (copy)", + "18" + ] + }, + "5600": { + "op": "==", + "defined_out": [ + "tmp%17#0" + ], + "stack_out": [ + "tmp%17#0" + ] + }, + "5601": { + "op": "bnz _assert_event_allowed_for_contract_type_bool_true@28", + "stack_out": [] + }, + "5604": { + "op": "frame_dig -1", + "stack_out": [ + "event_type#0 (copy)" + ] + }, + "5606": { + "op": "pushint 5", + "defined_out": [ + "5", + "event_type#0 (copy)" + ], + "stack_out": [ + "event_type#0 (copy)", + "5" + ] + }, + "5608": { + "op": "==", + "defined_out": [ + "tmp%18#0" + ], + "stack_out": [ + "tmp%18#0" + ] + }, + "5609": { + "op": "bz _assert_event_allowed_for_contract_type_bool_false@29", + "stack_out": [] + }, + "5612": { + "block": "_assert_event_allowed_for_contract_type_bool_true@28", + "stack_in": [], + "op": "intc_1 // 1", + "defined_out": [ + "or_result%2#0" + ], + "stack_out": [ + "or_result%2#0" + ] + }, + "5613": { + "op": "b _assert_event_allowed_for_contract_type_after_inlined_modules.kernel.ActusKernelModule._event_allowed_for_contract_type@34", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "5616": { + "block": "_assert_event_allowed_for_contract_type_bool_false@29", + "stack_in": [], + "op": "intc_0 // 0", + "defined_out": [ + "or_result%2#0" + ], + "stack_out": [ + "or_result%2#0" + ] + }, + "5617": { + "op": "b _assert_event_allowed_for_contract_type_after_inlined_modules.kernel.ActusKernelModule._event_allowed_for_contract_type@34", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "5620": { + "block": "_assert_event_allowed_for_contract_type_after_if_else@31", + "stack_in": [], + "op": "frame_dig -2", + "defined_out": [ + "contract_type#0 (copy)" + ], + "stack_out": [ + "contract_type#0 (copy)" + ] + }, + "5622": { + "op": "pushint 5", + "defined_out": [ + "5", + "contract_type#0 (copy)" + ], + "stack_out": [ + "contract_type#0 (copy)", + "5" + ] + }, + "5624": { + "op": "==", + "defined_out": [ + "tmp%19#0" + ], + "stack_out": [ + "tmp%19#0" + ] + }, + "5625": { + "op": "bz _assert_event_allowed_for_contract_type_after_if_else@33", + "stack_out": [] + }, + "5628": { + "op": "frame_dig -1", + "defined_out": [ + "event_type#0 (copy)" + ], + "stack_out": [ + "event_type#0 (copy)" + ] + }, + "5630": { + "op": "pushint 3", + "defined_out": [ + "3", + "event_type#0 (copy)" + ], + "stack_out": [ + "event_type#0 (copy)", + "3" + ] + }, + "5632": { + "op": "==", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "5633": { + "op": "b _assert_event_allowed_for_contract_type_after_inlined_modules.kernel.ActusKernelModule._event_allowed_for_contract_type@34" + }, + "5636": { + "block": "_assert_event_allowed_for_contract_type_after_if_else@33", + "stack_in": [], + "op": "intc_0 // 0", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "5637": { + "op": "b _assert_event_allowed_for_contract_type_after_inlined_modules.kernel.ActusKernelModule._event_allowed_for_contract_type@34" + }, + "5640": { + "subroutine": "modules.kernel.ActusKernelModule._is_dynamic_annuity", + "params": {}, + "block": "_is_dynamic_annuity", + "stack_in": [], + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "0" + ] + }, + "5641": { + "op": "bytec 12 // \"contract_type\"", + "defined_out": [ + "\"contract_type\"", + "0" + ], + "stack_out": [ + "0", + "\"contract_type\"" + ] + }, + "5643": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0" + ], + "stack_out": [ + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "5644": { + "error": "check self.contract_type exists", + "op": "assert // check self.contract_type exists", + "stack_out": [ + "maybe_value%0#0" + ] + }, + "5645": { + "op": "intc_1 // 1", + "defined_out": [ + "1", + "maybe_value%0#0" + ], + "stack_out": [ + "maybe_value%0#0", + "1" + ] + }, + "5646": { + "op": "==", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "5647": { + "op": "bz _is_dynamic_annuity_bool_false@3", + "stack_out": [] + }, + "5650": { + "op": "intc_0 // 0", + "stack_out": [ + "0" + ] + }, + "5651": { + "op": "bytec 34 // \"dynamic_principal_redemption\"", + "defined_out": [ + "\"dynamic_principal_redemption\"", + "0" + ], + "stack_out": [ + "0", + "\"dynamic_principal_redemption\"" + ] + }, + "5653": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%1#0", + "maybe_value%1#0" + ], + "stack_out": [ + "maybe_value%1#0", + "maybe_exists%1#0" + ] + }, + "5654": { + "error": "check self.dynamic_principal_redemption exists", + "op": "assert // check self.dynamic_principal_redemption exists", + "stack_out": [ + "maybe_value%1#0" + ] + }, + "5655": { + "op": "bz _is_dynamic_annuity_bool_false@3", + "stack_out": [] + }, + "5658": { + "op": "intc_1 // 1", + "defined_out": [ + "and_result%0#0" + ], + "stack_out": [ + "and_result%0#0" + ] + }, + "5659": { + "retsub": true, + "op": "retsub" + }, + "5660": { + "block": "_is_dynamic_annuity_bool_false@3", + "stack_in": [], + "op": "intc_0 // 0", + "defined_out": [ + "and_result%0#0" + ], + "stack_out": [ + "and_result%0#0" + ] + }, + "5661": { + "retsub": true, + "op": "retsub" + }, + "5662": { + "subroutine": "modules.kernel.ActusKernelModule._entry_interest_segment", + "params": { + "entry#0": "bytes" + }, + "block": "_entry_interest_segment", + "stack_in": [], + "op": "proto 1 2" + }, + "5665": { + "op": "frame_dig -1", + "defined_out": [ + "entry#0 (copy)" + ], + "stack_out": [ + "entry#0 (copy)" + ] + }, + "5667": { + "op": "pushint 17", + "defined_out": [ + "17", + "entry#0 (copy)" + ], + "stack_out": [ + "entry#0 (copy)", + "17" + ] + }, + "5669": { + "op": "extract_uint64", + "defined_out": [ + "values%0#0" + ], + "stack_out": [ + "values%0#0" + ] + }, + "5670": { + "op": "dup", + "defined_out": [ + "values%0#0" + ], + "stack_out": [ + "values%0#0", + "values%0#0" + ] + }, + "5671": { + "op": "bz _entry_interest_segment_if_body@3", + "stack_out": [ + "values%0#0" + ] + }, + "5674": { + "op": "intc_0 // 0", + "stack_out": [ + "values%0#0", + "0" + ] + }, + "5675": { + "op": "bytec 9 // \"nominal_interest_rate\"", + "defined_out": [ + "\"nominal_interest_rate\"", + "0", + "values%0#0" + ], + "stack_out": [ + "values%0#0", + "0", + "\"nominal_interest_rate\"" + ] + }, + "5677": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0", + "values%0#0" + ], + "stack_out": [ + "values%0#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "5678": { + "error": "check self.nominal_interest_rate exists", + "op": "assert // check self.nominal_interest_rate exists", + "stack_out": [ + "values%0#0", + "maybe_value%0#0" + ] + }, + "5679": { + "op": "bz _entry_interest_segment_if_body@3", + "stack_out": [ + "values%0#0" + ] + }, + "5682": { + "op": "intc_0 // 0", + "stack_out": [ + "values%0#0", + "0" + ] + }, + "5683": { + "op": "bytec 7 // \"interest_calculation_base\"", + "defined_out": [ + "\"interest_calculation_base\"", + "0", + "values%0#0" + ], + "stack_out": [ + "values%0#0", + "0", + "\"interest_calculation_base\"" + ] + }, + "5685": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%1#0", + "maybe_value%1#0", + "values%0#0" + ], + "stack_out": [ + "values%0#0", + "maybe_value%1#0", + "maybe_exists%1#0" + ] + }, + "5686": { + "error": "check self.interest_calculation_base exists", + "op": "assert // check self.interest_calculation_base exists", + "stack_out": [ + "values%0#0", + "maybe_value%1#0" + ] + }, + "5687": { + "op": "bnz _entry_interest_segment_after_if_else@4", + "stack_out": [ + "values%0#0" + ] + }, + "5690": { + "block": "_entry_interest_segment_if_body@3", + "stack_in": [ + "values%0#0" + ], + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "values%0#0", + "0" + ] + }, + "5691": { + "op": "frame_dig -1", + "defined_out": [ + "0", + "entry#0 (copy)" + ], + "stack_out": [ + "values%0#0", + "0", + "entry#0 (copy)" + ] + }, + "5693": { + "op": "uncover 2" + }, + "5695": { + "retsub": true, + "op": "retsub" + }, + "5696": { + "block": "_entry_interest_segment_after_if_else@4", + "stack_in": [ + "values%0#0" + ], + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "values%0#0", + "0" + ] + }, + "5697": { + "op": "bytec 7 // \"interest_calculation_base\"", + "defined_out": [ + "\"interest_calculation_base\"", + "0" + ], + "stack_out": [ + "values%0#0", + "0", + "\"interest_calculation_base\"" + ] + }, + "5699": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%2#0", + "maybe_value%2#0" + ], + "stack_out": [ + "values%0#0", + "maybe_value%2#0", + "maybe_exists%2#0" + ] + }, + "5700": { + "error": "check self.interest_calculation_base exists", + "op": "assert // check self.interest_calculation_base exists", + "stack_out": [ + "values%0#0", + "maybe_value%2#0" + ] + }, + "5701": { + "op": "intc_0 // 0", + "stack_out": [ + "values%0#0", + "maybe_value%2#0", + "0" + ] + }, + "5702": { + "op": "bytec 9 // \"nominal_interest_rate\"", + "defined_out": [ + "\"nominal_interest_rate\"", + "0", + "maybe_value%2#0" + ], + "stack_out": [ + "values%0#0", + "maybe_value%2#0", + "0", + "\"nominal_interest_rate\"" + ] + }, + "5704": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%3#0", + "maybe_value%2#0", + "maybe_value%3#0" + ], + "stack_out": [ + "values%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_exists%3#0" + ] + }, + "5705": { + "error": "check self.nominal_interest_rate exists", + "op": "assert // check self.nominal_interest_rate exists", + "stack_out": [ + "values%0#0", + "maybe_value%2#0", + "maybe_value%3#0" + ] + }, + "5706": { + "op": "intc_0 // 0", + "stack_out": [ + "values%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "0" + ] + }, + "5707": { + "op": "bytec 5 // \"fixed_point_scale\"", + "defined_out": [ + "\"fixed_point_scale\"", + "0", + "maybe_value%2#0", + "maybe_value%3#0" + ], + "stack_out": [ + "values%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "0", + "\"fixed_point_scale\"" + ] + }, + "5709": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%4#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0" + ], + "stack_out": [ + "values%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_exists%4#0" + ] + }, + "5710": { + "error": "check self.fixed_point_scale exists", + "op": "assert // check self.fixed_point_scale exists", + "stack_out": [ + "values%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0" + ] + }, + "5711": { + "callsub": "modules.kernel.ActusKernelModule._scaled_mul_div", + "op": "callsub _scaled_mul_div", + "defined_out": [ + "accrued#0" + ], + "stack_out": [ + "values%0#0", + "accrued#0" + ] + }, + "5714": { + "op": "intc_0 // 0", + "stack_out": [ + "values%0#0", + "accrued#0", + "0" + ] + }, + "5715": { + "op": "bytec 5 // \"fixed_point_scale\"", + "stack_out": [ + "values%0#0", + "accrued#0", + "0", + "\"fixed_point_scale\"" + ] + }, + "5717": { + "op": "app_global_get_ex", + "defined_out": [ + "accrued#0", + "maybe_exists%5#0", + "maybe_value%5#0" + ], + "stack_out": [ + "values%0#0", + "accrued#0", + "maybe_value%5#0", + "maybe_exists%5#0" + ] + }, + "5718": { + "error": "check self.fixed_point_scale exists", + "op": "assert // check self.fixed_point_scale exists", + "stack_out": [ + "values%0#0", + "accrued#0", + "maybe_value%5#0" + ] + }, + "5719": { + "op": "frame_dig 0" + }, + "5721": { + "op": "swap", + "defined_out": [ + "accrued#0", + "maybe_value%5#0", + "values%0#0" + ], + "stack_out": [ + "values%0#0", + "accrued#0", + "values%0#0", + "maybe_value%5#0" + ] + }, + "5722": { + "callsub": "modules.kernel.ActusKernelModule._scaled_mul_div", + "op": "callsub _scaled_mul_div", + "defined_out": [ + "tmp%4#0", + "values%0#0" + ], + "stack_out": [ + "values%0#0", + "tmp%4#0" + ] + }, + "5725": { + "op": "frame_dig -1", + "defined_out": [ + "entry#0 (copy)", + "tmp%4#0", + "values%0#0" + ], + "stack_out": [ + "values%0#0", + "tmp%4#0", + "entry#0 (copy)" + ] + }, + "5727": { + "op": "uncover 2" + }, + "5729": { + "retsub": true, + "op": "retsub" + }, + "5730": { + "subroutine": "modules.kernel.ActusKernelModule._discount_annuity_factor", + "params": { + "discount_factor#0": "uint64", + "redemption_factor#0": "uint64" + }, + "block": "_discount_annuity_factor", + "stack_in": [], + "op": "proto 2 1" + }, + "5733": { + "op": "frame_dig -1", + "defined_out": [ + "redemption_factor#0 (copy)" + ], + "stack_out": [ + "redemption_factor#0 (copy)" + ] + }, + "5735": { + "op": "bnz _discount_annuity_factor_after_if_else@2", + "stack_out": [] + }, + "5738": { + "op": "frame_dig -2", + "defined_out": [ + "discount_factor#0 (copy)" + ], + "stack_out": [ + "discount_factor#0 (copy)" + ] + }, + "5740": { + "retsub": true, + "op": "retsub" + }, + "5741": { + "block": "_discount_annuity_factor_after_if_else@2", + "stack_in": [], + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "0" + ] + }, + "5742": { + "op": "bytec 5 // \"fixed_point_scale\"", + "defined_out": [ + "\"fixed_point_scale\"", + "0" + ], + "stack_out": [ + "0", + "\"fixed_point_scale\"" + ] + }, + "5744": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0" + ], + "stack_out": [ + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "5745": { + "error": "check self.fixed_point_scale exists", + "op": "assert // check self.fixed_point_scale exists", + "stack_out": [ + "maybe_value%0#0" + ] + }, + "5746": { + "op": "intc_0 // 0", + "stack_out": [ + "maybe_value%0#0", + "0" + ] + }, + "5747": { + "op": "bytec 9 // \"nominal_interest_rate\"", + "defined_out": [ + "\"nominal_interest_rate\"", + "0", + "maybe_value%0#0" + ], + "stack_out": [ + "maybe_value%0#0", + "0", + "\"nominal_interest_rate\"" + ] + }, + "5749": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%1#0", + "maybe_value%0#0", + "maybe_value%1#0" + ], + "stack_out": [ + "maybe_value%0#0", + "maybe_value%1#0", + "maybe_exists%1#0" + ] + }, + "5750": { + "error": "check self.nominal_interest_rate exists", + "op": "assert // check self.nominal_interest_rate exists", + "stack_out": [ + "maybe_value%0#0", + "maybe_value%1#0" + ] + }, + "5751": { + "op": "frame_dig -1", + "defined_out": [ + "maybe_value%0#0", + "maybe_value%1#0", + "redemption_factor#0 (copy)" + ], + "stack_out": [ + "maybe_value%0#0", + "maybe_value%1#0", + "redemption_factor#0 (copy)" + ] + }, + "5753": { + "op": "dig 2", + "defined_out": [ + "maybe_value%0#0", + "maybe_value%0#0 (copy)", + "maybe_value%1#0", + "redemption_factor#0 (copy)" + ], + "stack_out": [ + "maybe_value%0#0", + "maybe_value%1#0", + "redemption_factor#0 (copy)", + "maybe_value%0#0 (copy)" + ] + }, + "5755": { + "callsub": "modules.kernel.ActusKernelModule._scaled_mul_div", + "op": "callsub _scaled_mul_div", + "defined_out": [ + "maybe_value%0#0", + "tmp%1#0" + ], + "stack_out": [ + "maybe_value%0#0", + "tmp%1#0" + ] + }, + "5758": { + "op": "+", + "defined_out": [ + "period_rate#0" + ], + "stack_out": [ + "period_rate#0" + ] + }, + "5759": { + "op": "dup", + "defined_out": [ + "period_rate#0", + "period_rate#0 (copy)" + ], + "stack_out": [ + "period_rate#0", + "period_rate#0 (copy)" + ] + }, + "5760": { + "error": "Invalid ACTUS configuration", + "op": "assert // Invalid ACTUS configuration", + "stack_out": [ + "period_rate#0" + ] + }, + "5761": { + "op": "intc_0 // 0", + "stack_out": [ + "period_rate#0", + "0" + ] + }, + "5762": { + "op": "bytec 5 // \"fixed_point_scale\"", + "stack_out": [ + "period_rate#0", + "0", + "\"fixed_point_scale\"" + ] + }, + "5764": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%3#0", + "maybe_value%3#0", + "period_rate#0" + ], + "stack_out": [ + "period_rate#0", + "maybe_value%3#0", + "maybe_exists%3#0" + ] + }, + "5765": { + "error": "check self.fixed_point_scale exists", + "op": "assert // check self.fixed_point_scale exists", + "stack_out": [ + "period_rate#0", + "maybe_value%3#0" + ] + }, + "5766": { + "op": "frame_dig -2", + "defined_out": [ + "discount_factor#0 (copy)", + "maybe_value%3#0", + "period_rate#0" + ], + "stack_out": [ + "period_rate#0", + "maybe_value%3#0", + "discount_factor#0 (copy)" + ] + }, + "5768": { + "op": "swap", + "stack_out": [ + "period_rate#0", + "discount_factor#0 (copy)", + "maybe_value%3#0" + ] + }, + "5769": { + "op": "uncover 2", + "stack_out": [ + "discount_factor#0 (copy)", + "maybe_value%3#0", + "period_rate#0" + ] + }, + "5771": { + "callsub": "modules.kernel.ActusKernelModule._scaled_mul_div", + "op": "callsub _scaled_mul_div", + "defined_out": [ + "tmp%4#0" + ], + "stack_out": [ + "tmp%4#0" + ] + }, + "5774": { + "retsub": true, + "op": "retsub" + }, + "5775": { + "subroutine": "modules.kernel.ActusKernelModule._apply_non_cash_schedule_entry", + "params": { + "entry#0": "bytes", + "payload#0": "bytes" + }, + "block": "_apply_non_cash_schedule_entry", + "stack_in": [], + "op": "proto 2 2" + }, + "5778": { + "op": "intc_0 // 0", + "stack_out": [ + "future_entry#0" + ] + }, + "5779": { + "op": "pushbytes \"\"", + "stack_out": [ + "future_entry#0", + "denominator#0" + ] + }, + "5781": { + "op": "dupn 8", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0" + ] + }, + "5783": { + "op": "frame_dig -2", + "defined_out": [ + "entry#0 (copy)" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "entry#0 (copy)" + ] + }, + "5785": { + "op": "intc_0 // 0", + "defined_out": [ + "0", + "entry#0 (copy)" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "entry#0 (copy)", + "0" + ] + }, + "5786": { + "op": "extract_uint64", + "defined_out": [ + "values%0#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "values%0#0" + ] + }, + "5787": { + "op": "intc_0 // 0", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "values%0#0", + "0" + ] + }, + "5788": { + "op": "bytec_2 // \"event_cursor\"", + "defined_out": [ + "\"event_cursor\"", + "0", + "values%0#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "values%0#0", + "0", + "\"event_cursor\"" + ] + }, + "5789": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0", + "values%0#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "values%0#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "5790": { + "error": "check self.event_cursor exists", + "op": "assert // check self.event_cursor exists", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "values%0#0", + "maybe_value%0#0" + ] + }, + "5791": { + "op": "==", + "defined_out": [ + "tmp%0#0", + "values%0#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "tmp%0#0" + ] + }, + "5792": { + "error": "Invalid event cursor", + "op": "assert // Invalid event cursor", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0" + ] + }, + "5793": { + "op": "frame_dig -2", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "entry#0 (copy)" + ] + }, + "5795": { + "op": "pushint 9", + "defined_out": [ + "9", + "entry#0 (copy)", + "values%0#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "entry#0 (copy)", + "9" + ] + }, + "5797": { + "op": "extract_uint64", + "defined_out": [ + "values%0#0", + "values%1#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "values%1#0" + ] + }, + "5798": { + "op": "global LatestTimestamp", + "defined_out": [ + "tmp%1#0", + "values%0#0", + "values%1#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "values%1#0", + "tmp%1#0" + ] + }, + "5800": { + "op": "<=", + "defined_out": [ + "tmp%2#0", + "values%0#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "tmp%2#0" + ] + }, + "5801": { + "error": "No due cashflow to pay", + "op": "assert // No due cashflow to pay", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0" + ] + }, + "5802": { + "op": "frame_dig -2", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "entry#0 (copy)" + ] + }, + "5804": { + "op": "intc_2 // 8", + "defined_out": [ + "8", + "entry#0 (copy)", + "values%0#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "entry#0 (copy)", + "8" + ] + }, + "5805": { + "op": "getbyte", + "defined_out": [ + "event_type#0", + "values%0#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0" + ] + }, + "5806": { + "op": "dup", + "defined_out": [ + "event_type#0", + "values%0#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "event_type#0" + ] + }, + "5807": { + "op": "intc_1 // 1", + "defined_out": [ + "1", + "event_type#0", + "values%0#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "event_type#0", + "1" + ] + }, + "5808": { + "op": "==", + "defined_out": [ + "event_type#0", + "tmp%4#0", + "values%0#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "5809": { + "op": "dup", + "defined_out": [ + "event_type#0", + "tmp%4#0", + "values%0#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "tmp%4#0" + ] + }, + "5810": { + "op": "bz _apply_non_cash_schedule_entry_after_if_else@6", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "5813": { + "op": "intc_0 // 0", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0" + ] + }, + "5814": { + "op": "bytec_1 // \"status\"", + "defined_out": [ + "\"status\"", + "0", + "event_type#0", + "tmp%4#0", + "values%0#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0", + "\"status\"" + ] + }, + "5815": { + "op": "app_global_get_ex", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "5816": { + "error": "check self.status exists", + "op": "assert // check self.status exists", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%0#0" + ] + }, + "5817": { + "op": "pushint 50", + "defined_out": [ + "50", + "event_type#0", + "maybe_value%0#0", + "tmp%4#0", + "values%0#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%0#0", + "50" + ] + }, + "5819": { + "op": "==", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "tmp%0#0" + ] + }, + "5820": { + "error": "Invalid ACTUS configuration", + "op": "assert // Invalid ACTUS configuration", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "5821": { + "op": "intc_0 // 0", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0" + ] + }, + "5822": { + "op": "bytec 10 // \"reserved_units_total\"", + "defined_out": [ + "\"reserved_units_total\"", + "0", + "event_type#0", + "tmp%4#0", + "values%0#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0", + "\"reserved_units_total\"" + ] + }, + "5824": { + "op": "app_global_get_ex", + "defined_out": [ + "event_type#0", + "maybe_exists%1#0", + "maybe_value%1#0", + "tmp%4#0", + "values%0#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%1#0", + "maybe_exists%1#0" + ] + }, + "5825": { + "error": "check self.reserved_units_total exists", + "op": "assert // check self.reserved_units_total exists", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%1#0" + ] + }, + "5826": { + "op": "intc_0 // 0", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%1#0", + "0" + ] + }, + "5827": { + "op": "bytec 13 // \"total_units\"", + "defined_out": [ + "\"total_units\"", + "0", + "event_type#0", + "maybe_value%1#0", + "tmp%4#0", + "values%0#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%1#0", + "0", + "\"total_units\"" + ] + }, + "5829": { + "op": "app_global_get_ex", + "defined_out": [ + "event_type#0", + "maybe_exists%2#0", + "maybe_value%1#0", + "maybe_value%2#0", + "tmp%4#0", + "values%0#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%1#0", + "maybe_value%2#0", + "maybe_exists%2#0" + ] + }, + "5830": { + "error": "check self.total_units exists", + "op": "assert // check self.total_units exists", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%1#0", + "maybe_value%2#0" + ] + }, + "5831": { + "op": "==", + "defined_out": [ + "event_type#0", + "tmp%4#0", + "tmp%6#0", + "values%0#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "tmp%6#0" + ] + }, + "5832": { + "error": "Primary distribution is not complete", + "op": "assert // Primary distribution is not complete", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "5833": { + "op": "frame_dig -2", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "entry#0 (copy)" + ] + }, + "5835": { + "op": "pushint 49", + "defined_out": [ + "49", + "entry#0 (copy)", + "event_type#0", + "tmp%4#0", + "values%0#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "entry#0 (copy)", + "49" + ] + }, + "5837": { + "op": "extract_uint64", + "defined_out": [ + "event_type#0", + "tmp%4#0", + "values%0#0", + "values%2#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "values%2#0" + ] + }, + "5838": { + "op": "bytec_3 // \"outstanding_principal\"", + "defined_out": [ + "\"outstanding_principal\"", + "event_type#0", + "tmp%4#0", + "values%0#0", + "values%2#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "values%2#0", + "\"outstanding_principal\"" + ] + }, + "5839": { + "op": "dig 1", + "defined_out": [ + "\"outstanding_principal\"", + "event_type#0", + "tmp%4#0", + "values%0#0", + "values%2#0", + "values%2#0 (copy)" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "values%2#0", + "\"outstanding_principal\"", + "values%2#0 (copy)" + ] + }, + "5841": { + "op": "app_global_put", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "values%2#0" + ] + }, + "5842": { + "op": "bytec 7 // \"interest_calculation_base\"", + "defined_out": [ + "\"interest_calculation_base\"", + "event_type#0", + "tmp%4#0", + "values%0#0", + "values%2#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "values%2#0", + "\"interest_calculation_base\"" + ] + }, + "5844": { + "op": "swap", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "\"interest_calculation_base\"", + "values%2#0" + ] + }, + "5845": { + "op": "app_global_put", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "5846": { + "op": "frame_dig -2", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "entry#0 (copy)" + ] + }, + "5848": { + "op": "pushint 33", + "defined_out": [ + "33", + "entry#0 (copy)", + "event_type#0", + "tmp%4#0", + "values%0#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "entry#0 (copy)", + "33" + ] + }, + "5850": { + "op": "extract_uint64", + "defined_out": [ + "event_type#0", + "tmp%4#0", + "values%0#0", + "values%4#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "values%4#0" + ] + }, + "5851": { + "op": "bytec 9 // \"nominal_interest_rate\"", + "defined_out": [ + "\"nominal_interest_rate\"", + "event_type#0", + "tmp%4#0", + "values%0#0", + "values%4#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "values%4#0", + "\"nominal_interest_rate\"" + ] + }, + "5853": { + "op": "swap", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "\"nominal_interest_rate\"", + "values%4#0" + ] + }, + "5854": { + "op": "app_global_put", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "5855": { + "op": "bytec 6 // \"accrued_interest\"", + "defined_out": [ + "\"accrued_interest\"", + "event_type#0", + "tmp%4#0", + "values%0#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "\"accrued_interest\"" + ] + }, + "5857": { + "op": "intc_0 // 0", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "\"accrued_interest\"", + "0" + ] + }, + "5858": { + "op": "app_global_put", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "5859": { + "op": "frame_dig -2", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "entry#0 (copy)" + ] + }, + "5861": { + "op": "pushint 41", + "defined_out": [ + "41", + "entry#0 (copy)", + "event_type#0", + "tmp%4#0", + "values%0#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "entry#0 (copy)", + "41" + ] + }, + "5863": { + "op": "extract_uint64", + "defined_out": [ + "event_type#0", + "tmp%4#0", + "values%0#0", + "values%5#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "values%5#0" + ] + }, + "5864": { + "op": "bytec 14 // \"next_principal_redemption\"", + "defined_out": [ + "\"next_principal_redemption\"", + "event_type#0", + "tmp%4#0", + "values%0#0", + "values%5#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "values%5#0", + "\"next_principal_redemption\"" + ] + }, + "5866": { + "op": "swap", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "\"next_principal_redemption\"", + "values%5#0" + ] + }, + "5867": { + "op": "app_global_put", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "5868": { + "op": "intc_0 // 0", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0" + ] + }, + "5869": { + "op": "bytec_2 // \"event_cursor\"", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0", + "\"event_cursor\"" + ] + }, + "5870": { + "op": "app_global_get_ex", + "defined_out": [ + "event_type#0", + "maybe_exists%3#0", + "maybe_value%3#0", + "tmp%4#0", + "values%0#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%3#0", + "maybe_exists%3#0" + ] + }, + "5871": { + "error": "check self.event_cursor exists", + "op": "assert // check self.event_cursor exists", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%3#0" + ] + }, + "5872": { + "op": "intc_1 // 1", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%3#0", + "1" + ] + }, + "5873": { + "op": "+", + "defined_out": [ + "event_type#0", + "tmp%4#0", + "tmp%7#0", + "values%0#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "tmp%7#0" + ] + }, + "5874": { + "op": "bytec_2 // \"event_cursor\"", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "tmp%7#0", + "\"event_cursor\"" + ] + }, + "5875": { + "op": "swap", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "\"event_cursor\"", + "tmp%7#0" + ] + }, + "5876": { + "op": "app_global_put", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "5877": { + "op": "bytec_1 // \"status\"", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "\"status\"" + ] + }, + "5878": { + "op": "pushint 100", + "defined_out": [ + "\"status\"", + "100", + "event_type#0", + "tmp%4#0", + "values%0#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "\"status\"", + "100" + ] + }, + "5880": { + "op": "app_global_put", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "5881": { + "op": "frame_dig 11", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "tmp%4#0" + ] + }, + "5883": { + "error": "Not IED event", + "op": "assert // Not IED event", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "5884": { + "op": "intc_0 // 0", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0" + ] + }, + "5885": { + "op": "bytec 20 // \"initial_exchange_amount\"", + "defined_out": [ + "\"initial_exchange_amount\"", + "0", + "event_type#0", + "tmp%4#0", + "values%0#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0", + "\"initial_exchange_amount\"" + ] + }, + "5887": { + "op": "app_global_get_ex", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "5888": { + "error": "check self.initial_exchange_amount exists", + "op": "assert // check self.initial_exchange_amount exists", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%0#0" + ] + }, + "5889": { + "op": "frame_dig -2", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%0#0", + "entry#0 (copy)" + ] + }, + "5891": { + "op": "swap", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "entry#0 (copy)", + "maybe_value%0#0" + ] + }, + "5892": { + "op": "intc_0 // 0", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "entry#0 (copy)", + "maybe_value%0#0", + "0" + ] + }, + "5893": { + "callsub": "modules.kernel.ActusKernelModule._emit_execution_event", + "op": "callsub _emit_execution_event", + "defined_out": [ + "entry#0", + "event_type#0", + "tmp%4#0", + "values%0#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "entry#0" + ] + }, + "5896": { + "op": "dup" + }, + "5897": { + "op": "frame_bury -2", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "entry#0 (copy)" + ] + }, + "5899": { + "op": "frame_dig -1", + "defined_out": [ + "entry#0 (copy)", + "event_type#0", + "payload#0 (copy)", + "tmp%4#0", + "values%0#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "entry#0 (copy)", + "payload#0 (copy)" + ] + }, + "5901": { + "op": "frame_bury 1" + }, + "5903": { + "op": "frame_bury 0" + }, + "5905": { + "retsub": true, + "op": "retsub" + }, + "5906": { + "block": "_apply_non_cash_schedule_entry_after_if_else@6", + "stack_in": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ], + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0" + ] + }, + "5907": { + "op": "bytec_1 // \"status\"", + "defined_out": [ + "\"status\"", + "0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0", + "\"status\"" + ] + }, + "5908": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "5909": { + "error": "check self.status exists", + "op": "assert // check self.status exists", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%0#0" + ] + }, + "5910": { + "op": "pushint 50", + "defined_out": [ + "50", + "maybe_value%0#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%0#0", + "50" + ] + }, + "5912": { + "op": "==", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "tmp%0#0" + ] + }, + "5913": { + "op": "!", + "defined_out": [ + "tmp%1#1" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "tmp%1#1" + ] + }, + "5914": { + "error": "IED not yet executed", + "op": "assert // IED not yet executed", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "5915": { + "op": "intc_0 // 0", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0" + ] + }, + "5916": { + "op": "bytec 6 // \"accrued_interest\"", + "defined_out": [ + "\"accrued_interest\"", + "0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0", + "\"accrued_interest\"" + ] + }, + "5918": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%4#0", + "maybe_value%4#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%4#0", + "maybe_exists%4#0" + ] + }, + "5919": { + "error": "check self.accrued_interest exists", + "op": "assert // check self.accrued_interest exists", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%4#0" + ] + }, + "5920": { + "op": "frame_dig -2", + "defined_out": [ + "entry#0 (copy)", + "maybe_value%4#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%4#0", + "entry#0 (copy)" + ] + }, + "5922": { + "callsub": "modules.kernel.ActusKernelModule._entry_interest_segment", + "op": "callsub _entry_interest_segment", + "defined_out": [ + "_entry_interest_segment%0#0", + "entry#0", + "maybe_value%4#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%4#0", + "_entry_interest_segment%0#0", + "entry#0" + ] + }, + "5925": { + "op": "frame_bury -2", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%4#0", + "_entry_interest_segment%0#0" + ] + }, + "5927": { + "op": "+", + "defined_out": [ + "tmp%8#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "tmp%8#0" + ] + }, + "5928": { + "op": "bytec 6 // \"accrued_interest\"", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "tmp%8#0", + "\"accrued_interest\"" + ] + }, + "5930": { + "op": "swap", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "\"accrued_interest\"", + "tmp%8#0" + ] + }, + "5931": { + "op": "app_global_put", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "5932": { + "op": "frame_dig 10", + "defined_out": [ + "event_type#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "event_type#0" + ] + }, + "5934": { + "op": "pushint 12", + "defined_out": [ + "12", + "event_type#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "event_type#0", + "12" + ] + }, + "5936": { + "op": "==", + "defined_out": [ + "event_type#0", + "tmp%9#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "tmp%9#0" + ] + }, + "5937": { + "op": "bz _apply_non_cash_schedule_entry_else_body@10", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "5940": { + "op": "frame_dig -1", + "defined_out": [ + "event_type#0", + "payload#0 (copy)" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "payload#0 (copy)" + ] + }, + "5942": { + "op": "pushint 33", + "defined_out": [ + "33", + "event_type#0", + "payload#0 (copy)" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "payload#0 (copy)", + "33" + ] + }, + "5944": { + "op": "extract_uint64", + "defined_out": [ + "event_type#0", + "values%6#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "values%6#0" + ] + }, + "5945": { + "op": "intc_0 // 0", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "values%6#0", + "0" + ] + }, + "5946": { + "op": "bytec 36 // \"rate_reset_multiplier\"", + "defined_out": [ + "\"rate_reset_multiplier\"", + "0", + "event_type#0", + "values%6#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "values%6#0", + "0", + "\"rate_reset_multiplier\"" + ] + }, + "5948": { + "op": "app_global_get_ex", + "defined_out": [ + "event_type#0", + "maybe_exists%5#0", + "maybe_value%5#0", + "values%6#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "values%6#0", + "maybe_value%5#0", + "maybe_exists%5#0" + ] + }, + "5949": { + "error": "check self.rate_reset_multiplier exists", + "op": "assert // check self.rate_reset_multiplier exists", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "values%6#0", + "maybe_value%5#0" + ] + }, + "5950": { + "op": "intc_0 // 0", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "values%6#0", + "maybe_value%5#0", + "0" + ] + }, + "5951": { + "op": "bytec 5 // \"fixed_point_scale\"", + "defined_out": [ + "\"fixed_point_scale\"", + "0", + "event_type#0", + "maybe_value%5#0", + "values%6#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "values%6#0", + "maybe_value%5#0", + "0", + "\"fixed_point_scale\"" + ] + }, + "5953": { + "op": "app_global_get_ex", + "defined_out": [ + "event_type#0", + "maybe_exists%6#0", + "maybe_value%5#0", + "maybe_value%6#0", + "values%6#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "values%6#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_exists%6#0" + ] + }, + "5954": { + "error": "check self.fixed_point_scale exists", + "op": "assert // check self.fixed_point_scale exists", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "values%6#0", + "maybe_value%5#0", + "maybe_value%6#0" + ] + }, + "5955": { + "callsub": "modules.kernel.ActusKernelModule._scaled_mul_div", + "op": "callsub _scaled_mul_div", + "defined_out": [ + "event_type#0", + "observed_rate#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "observed_rate#0" + ] + }, + "5958": { + "op": "intc_0 // 0", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "observed_rate#0", + "0" + ] + }, + "5959": { + "op": "bytec 35 // \"rate_reset_spread\"", + "defined_out": [ + "\"rate_reset_spread\"", + "0", + "event_type#0", + "observed_rate#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "observed_rate#0", + "0", + "\"rate_reset_spread\"" + ] + }, + "5961": { + "op": "app_global_get_ex", + "defined_out": [ + "event_type#0", + "maybe_exists%7#0", + "maybe_value%7#0", + "observed_rate#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "observed_rate#0", + "maybe_value%7#0", + "maybe_exists%7#0" + ] + }, + "5962": { + "error": "check self.rate_reset_spread exists", + "op": "assert // check self.rate_reset_spread exists", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "observed_rate#0", + "maybe_value%7#0" + ] + }, + "5963": { + "op": "+", + "defined_out": [ + "event_type#0", + "rate#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "rate#0" + ] + }, + "5964": { + "op": "frame_bury 6", + "defined_out": [ + "event_type#0", + "rate#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "5966": { + "op": "intc_0 // 0", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0" + ] + }, + "5967": { + "op": "bytec 38 // \"has_rate_reset_floor\"", + "defined_out": [ + "\"has_rate_reset_floor\"", + "0", + "event_type#0", + "rate#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0", + "\"has_rate_reset_floor\"" + ] + }, + "5969": { + "op": "app_global_get_ex", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "5970": { + "error": "check self.has_rate_reset_floor exists", + "op": "assert // check self.has_rate_reset_floor exists", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%0#0" + ] + }, + "5971": { + "op": "bz _apply_non_cash_schedule_entry_after_if_else@55", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "5974": { + "op": "intc_0 // 0", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0" + ] + }, + "5975": { + "op": "bytec 29 // \"rate_reset_floor\"", + "defined_out": [ + "\"rate_reset_floor\"", + "0", + "event_type#0", + "rate#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0", + "\"rate_reset_floor\"" + ] + }, + "5977": { + "op": "app_global_get_ex", + "defined_out": [ + "event_type#0", + "maybe_exists%1#0", + "maybe_value%1#0", + "rate#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%1#0", + "maybe_exists%1#0" + ] + }, + "5978": { + "error": "check self.rate_reset_floor exists", + "op": "assert // check self.rate_reset_floor exists", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%1#0" + ] + }, + "5979": { + "op": "frame_dig 6", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%1#0", + "rate#0" + ] + }, + "5981": { + "op": ">", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "tmp%0#0" + ] + }, + "5982": { + "op": "bz _apply_non_cash_schedule_entry_after_if_else@55", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "5985": { + "op": "intc_0 // 0", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0" + ] + }, + "5986": { + "op": "bytec 29 // \"rate_reset_floor\"", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0", + "\"rate_reset_floor\"" + ] + }, + "5988": { + "op": "app_global_get_ex", + "defined_out": [ + "event_type#0", + "maybe_exists%2#0", + "rate#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "rate#0", + "maybe_exists%2#0" + ] + }, + "5989": { + "op": "swap", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_exists%2#0", + "rate#0" + ] + }, + "5990": { + "op": "frame_bury 6", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_exists%2#0" + ] + }, + "5992": { + "error": "check self.rate_reset_floor exists", + "op": "assert // check self.rate_reset_floor exists", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "5993": { + "block": "_apply_non_cash_schedule_entry_after_if_else@55", + "stack_in": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ], + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0" + ] + }, + "5994": { + "op": "bytec 39 // \"has_rate_reset_cap\"", + "defined_out": [ + "\"has_rate_reset_cap\"", + "0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0", + "\"has_rate_reset_cap\"" + ] + }, + "5996": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%3#0", + "maybe_value%3#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%3#0", + "maybe_exists%3#0" + ] + }, + "5997": { + "error": "check self.has_rate_reset_cap exists", + "op": "assert // check self.has_rate_reset_cap exists", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%3#0" + ] + }, + "5998": { + "op": "bz _apply_non_cash_schedule_entry_after_if_else@58", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6001": { + "op": "intc_0 // 0", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0" + ] + }, + "6002": { + "op": "bytec 30 // \"rate_reset_cap\"", + "defined_out": [ + "\"rate_reset_cap\"", + "0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0", + "\"rate_reset_cap\"" + ] + }, + "6004": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%4#0", + "maybe_value%4#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%4#0", + "maybe_exists%4#0" + ] + }, + "6005": { + "error": "check self.rate_reset_cap exists", + "op": "assert // check self.rate_reset_cap exists", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%4#0" + ] + }, + "6006": { + "op": "frame_dig 6", + "defined_out": [ + "maybe_value%4#0", + "rate#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%4#0", + "rate#0" + ] + }, + "6008": { + "op": "<", + "defined_out": [ + "rate#0", + "tmp%1#1" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "tmp%1#1" + ] + }, + "6009": { + "op": "bz _apply_non_cash_schedule_entry_after_if_else@58", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6012": { + "op": "intc_0 // 0", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0" + ] + }, + "6013": { + "op": "bytec 30 // \"rate_reset_cap\"", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0", + "\"rate_reset_cap\"" + ] + }, + "6015": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%5#0", + "rate#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "rate#0", + "maybe_exists%5#0" + ] + }, + "6016": { + "op": "swap", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_exists%5#0", + "rate#0" + ] + }, + "6017": { + "op": "frame_bury 6", + "defined_out": [ + "maybe_exists%5#0", + "rate#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_exists%5#0" + ] + }, + "6019": { + "error": "check self.rate_reset_cap exists", + "op": "assert // check self.rate_reset_cap exists", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6020": { + "block": "_apply_non_cash_schedule_entry_after_if_else@58", + "stack_in": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ], + "op": "bytec 9 // \"nominal_interest_rate\"", + "defined_out": [ + "\"nominal_interest_rate\"" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "\"nominal_interest_rate\"" + ] + }, + "6022": { + "op": "frame_dig 6", + "defined_out": [ + "\"nominal_interest_rate\"", + "rate#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "\"nominal_interest_rate\"", + "rate#0" + ] + }, + "6024": { + "op": "app_global_put", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6025": { + "block": "_apply_non_cash_schedule_entry_after_if_else@18", + "stack_in": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ], + "op": "frame_dig 10", + "defined_out": [ + "event_type#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "event_type#0" + ] + }, + "6027": { + "op": "pushint 4", + "defined_out": [ + "4", + "event_type#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "event_type#0", + "4" + ] + }, + "6029": { + "op": "==", + "defined_out": [ + "event_type#0", + "tmp%16#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "tmp%16#0" + ] + }, + "6030": { + "op": "bz _apply_non_cash_schedule_entry_else_body@20", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6033": { + "op": "frame_dig -2", + "defined_out": [ + "entry#0 (copy)", + "event_type#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "entry#0 (copy)" + ] + }, + "6035": { + "op": "pushint 49", + "defined_out": [ + "49", + "entry#0 (copy)", + "event_type#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "entry#0 (copy)", + "49" + ] + }, + "6037": { + "op": "extract_uint64", + "defined_out": [ + "event_type#0", + "values%10#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "values%10#0" + ] + }, + "6038": { + "op": "bytec_3 // \"outstanding_principal\"", + "defined_out": [ + "\"outstanding_principal\"", + "event_type#0", + "values%10#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "values%10#0", + "\"outstanding_principal\"" + ] + }, + "6039": { + "op": "dig 1", + "defined_out": [ + "\"outstanding_principal\"", + "event_type#0", + "values%10#0", + "values%10#0 (copy)" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "values%10#0", + "\"outstanding_principal\"", + "values%10#0 (copy)" + ] + }, + "6041": { + "op": "app_global_put", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "values%10#0" + ] + }, + "6042": { + "op": "bytec 7 // \"interest_calculation_base\"", + "defined_out": [ + "\"interest_calculation_base\"", + "event_type#0", + "values%10#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "values%10#0", + "\"interest_calculation_base\"" + ] + }, + "6044": { + "op": "swap", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "\"interest_calculation_base\"", + "values%10#0" + ] + }, + "6045": { + "op": "app_global_put", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6046": { + "block": "_apply_non_cash_schedule_entry_after_if_else@23", + "stack_in": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ], + "callsub": "modules.kernel.ActusKernelModule._is_dynamic_annuity", + "op": "callsub _is_dynamic_annuity", + "defined_out": [ + "tmp%18#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "tmp%18#0" + ] + }, + "6049": { + "op": "bz _apply_non_cash_schedule_entry_else_body@29", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6052": { + "op": "frame_dig 10", + "defined_out": [ + "event_type#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "event_type#0" + ] + }, + "6054": { + "op": "pushint 5", + "defined_out": [ + "5", + "event_type#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "event_type#0", + "5" + ] + }, + "6056": { + "op": "==", + "defined_out": [ + "event_type#0", + "tmp%19#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "tmp%19#0" + ] + }, + "6057": { + "op": "bz _apply_non_cash_schedule_entry_after_if_else@30", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6060": { + "op": "intc_0 // 0", + "defined_out": [ + "0", + "event_type#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0" + ] + }, + "6061": { + "op": "bytec 5 // \"fixed_point_scale\"", + "defined_out": [ + "\"fixed_point_scale\"", + "0", + "event_type#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0", + "\"fixed_point_scale\"" + ] + }, + "6063": { + "op": "app_global_get_ex", + "defined_out": [ + "discount_factor#0", + "event_type#0", + "maybe_exists%0#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "discount_factor#0", + "maybe_exists%0#0" + ] + }, + "6064": { + "op": "swap", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_exists%0#0", + "discount_factor#0" + ] + }, + "6065": { + "op": "frame_bury 2", + "defined_out": [ + "discount_factor#0", + "event_type#0", + "maybe_exists%0#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_exists%0#0" + ] + }, + "6067": { + "error": "check self.fixed_point_scale exists", + "op": "assert // check self.fixed_point_scale exists", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6068": { + "op": "intc_0 // 0", + "defined_out": [ + "denominator#0", + "discount_factor#0", + "event_type#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "denominator#0" + ] + }, + "6069": { + "op": "frame_bury 1", + "defined_out": [ + "denominator#0", + "discount_factor#0", + "event_type#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6071": { + "op": "intc_0 // 0", + "defined_out": [ + "denominator#0", + "discount_factor#0", + "event_type#0", + "skip_first_redemption#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "skip_first_redemption#0" + ] + }, + "6072": { + "op": "frame_bury 7", + "defined_out": [ + "denominator#0", + "discount_factor#0", + "event_type#0", + "skip_first_redemption#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6074": { + "op": "frame_dig -2", + "defined_out": [ + "denominator#0", + "discount_factor#0", + "entry#0 (copy)", + "event_type#0", + "skip_first_redemption#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "entry#0 (copy)" + ] + }, + "6076": { + "op": "pushint 25", + "defined_out": [ + "25", + "denominator#0", + "discount_factor#0", + "entry#0 (copy)", + "event_type#0", + "skip_first_redemption#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "entry#0 (copy)", + "25" + ] + }, + "6078": { + "op": "extract_uint64", + "defined_out": [ + "denominator#0", + "discount_factor#0", + "event_type#0", + "skip_first_redemption#0", + "values%0#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "values%0#0" + ] + }, + "6079": { + "op": "dup", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "values%0#0", + "values%0#0" + ] + }, + "6080": { + "op": "frame_bury 8", + "defined_out": [ + "denominator#0", + "discount_factor#0", + "event_type#0", + "skip_first_redemption#0", + "values%0#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "values%0#0" + ] + }, + "6082": { + "op": "bz _apply_non_cash_schedule_entry_after_if_else@35", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6085": { + "op": "frame_dig 2", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "discount_factor#0" + ] + }, + "6087": { + "op": "frame_dig 8", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "discount_factor#0", + "values%0#0" + ] + }, + "6089": { + "callsub": "modules.kernel.ActusKernelModule._discount_annuity_factor", + "op": "callsub _discount_annuity_factor", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "discount_factor#0" + ] + }, + "6092": { + "op": "dup", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "discount_factor#0", + "discount_factor#0" + ] + }, + "6093": { + "op": "frame_bury 2", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "discount_factor#0" + ] + }, + "6095": { + "op": "intc_1 // 1", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "discount_factor#0", + "skip_first_redemption#0" + ] + }, + "6096": { + "op": "frame_bury 7", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "denominator#0" + ] + }, + "6098": { + "op": "frame_bury 1", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6100": { + "block": "_apply_non_cash_schedule_entry_after_if_else@35", + "stack_in": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ], + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0" + ] + }, + "6101": { + "op": "bytec_2 // \"event_cursor\"", + "defined_out": [ + "\"event_cursor\"", + "0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0", + "\"event_cursor\"" + ] + }, + "6102": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%1#0", + "maybe_value%1#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%1#0", + "maybe_exists%1#0" + ] + }, + "6103": { + "error": "check self.event_cursor exists", + "op": "assert // check self.event_cursor exists", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%1#0" + ] + }, + "6104": { + "op": "intc_1 // 1", + "defined_out": [ + "1", + "maybe_value%1#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%1#0", + "1" + ] + }, + "6105": { + "op": "+", + "defined_out": [ + "future_event_id#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "future_event_id#0" + ] + }, + "6106": { + "op": "frame_bury 3", + "defined_out": [ + "future_event_id#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6108": { + "block": "_apply_non_cash_schedule_entry_while_top@36", + "stack_in": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ], + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0" + ] + }, + "6109": { + "op": "bytec 4 // \"schedule_entry_count\"", + "defined_out": [ + "\"schedule_entry_count\"", + "0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0", + "\"schedule_entry_count\"" + ] + }, + "6111": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%2#0", + "maybe_value%2#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%2#0", + "maybe_exists%2#0" + ] + }, + "6112": { + "error": "check self.schedule_entry_count exists", + "op": "assert // check self.schedule_entry_count exists", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%2#0" + ] + }, + "6113": { + "op": "frame_dig 3", + "defined_out": [ + "future_event_id#0", + "maybe_value%2#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%2#0", + "future_event_id#0" + ] + }, + "6115": { + "op": ">", + "defined_out": [ + "future_event_id#0", + "tmp%4#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "tmp%4#0" + ] + }, + "6116": { + "op": "bz _apply_non_cash_schedule_entry_after_while@48", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6119": { + "op": "frame_dig 3", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "future_event_id#0" + ] + }, + "6121": { + "callsub": "modules.kernel.ActusKernelModule._get_schedule_entry", + "op": "callsub _get_schedule_entry", + "defined_out": [ + "future_entry#0", + "future_event_id#0", + "tmp%4#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "future_entry#0" + ] + }, + "6124": { + "op": "dup", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "future_entry#0", + "future_entry#0" + ] + }, + "6125": { + "op": "frame_bury 0", + "defined_out": [ + "future_entry#0", + "future_event_id#0", + "tmp%4#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "future_entry#0" + ] + }, + "6127": { + "op": "intc_2 // 8", + "defined_out": [ + "8", + "future_entry#0", + "future_event_id#0", + "tmp%4#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "future_entry#0", + "8" + ] + }, + "6128": { + "op": "getbyte", + "defined_out": [ + "future_entry#0", + "future_event_id#0", + "future_event_type#0", + "tmp%4#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "future_event_type#0" + ] + }, + "6129": { + "op": "dup", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "future_event_type#0", + "future_event_type#0" + ] + }, + "6130": { + "op": "frame_bury 4", + "defined_out": [ + "future_entry#0", + "future_event_id#0", + "future_event_type#0", + "tmp%4#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "future_event_type#0" + ] + }, + "6132": { + "op": "pushint 3", + "defined_out": [ + "3", + "future_entry#0", + "future_event_id#0", + "future_event_type#0", + "tmp%4#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "future_event_type#0", + "3" + ] + }, + "6134": { + "op": "==", + "defined_out": [ + "future_entry#0", + "future_event_id#0", + "future_event_type#0", + "tmp%4#0", + "tmp%7#1" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "tmp%7#1" + ] + }, + "6135": { + "op": "bnz _apply_non_cash_schedule_entry_bool_true@40", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6138": { + "op": "frame_dig 4", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "future_event_type#0" + ] + }, + "6140": { + "op": "pushint 19", + "defined_out": [ + "19", + "future_entry#0", + "future_event_id#0", + "future_event_type#0", + "tmp%4#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "future_event_type#0", + "19" + ] + }, + "6142": { + "op": "==", + "defined_out": [ + "future_entry#0", + "future_event_id#0", + "future_event_type#0", + "tmp%4#0", + "tmp%8#1" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "tmp%8#1" + ] + }, + "6143": { + "op": "bz _apply_non_cash_schedule_entry_bool_false@41", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6146": { + "op": "frame_dig 0", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "future_entry#0" + ] + }, + "6148": { + "op": "pushint 25", + "defined_out": [ + "25", + "future_entry#0", + "future_event_id#0", + "future_event_type#0", + "tmp%4#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "future_entry#0", + "25" + ] + }, + "6150": { + "op": "extract_uint64", + "defined_out": [ + "future_entry#0", + "future_event_id#0", + "future_event_type#0", + "tmp%4#0", + "values%2#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "values%2#0" + ] + }, + "6151": { + "op": "bz _apply_non_cash_schedule_entry_bool_false@41", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6154": { + "block": "_apply_non_cash_schedule_entry_bool_true@40", + "stack_in": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ], + "op": "intc_1 // 1", + "defined_out": [ + "is_redemption_event#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "is_redemption_event#0" + ] + }, + "6155": { + "block": "_apply_non_cash_schedule_entry_bool_merge@42", + "stack_in": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "is_redemption_event#0" + ], + "op": "bz _apply_non_cash_schedule_entry_after_if_else@47", + "defined_out": [], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6158": { + "op": "frame_dig 7", + "defined_out": [ + "skip_first_redemption#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "skip_first_redemption#0" + ] + }, + "6160": { + "op": "bz _apply_non_cash_schedule_entry_else_body@45", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6163": { + "op": "intc_0 // 0", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "skip_first_redemption#0" + ] + }, + "6164": { + "op": "frame_bury 7", + "defined_out": [ + "skip_first_redemption#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6166": { + "block": "_apply_non_cash_schedule_entry_after_if_else@47", + "stack_in": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ], + "op": "frame_dig 3", + "defined_out": [ + "future_event_id#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "future_event_id#0" + ] + }, + "6168": { + "op": "intc_1 // 1", + "defined_out": [ + "1", + "future_event_id#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "future_event_id#0", + "1" + ] + }, + "6169": { + "op": "+", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "future_event_id#0" + ] + }, + "6170": { + "op": "frame_bury 3", + "defined_out": [ + "future_event_id#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6172": { + "op": "b _apply_non_cash_schedule_entry_while_top@36" + }, + "6175": { + "block": "_apply_non_cash_schedule_entry_else_body@45", + "stack_in": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ], + "op": "frame_dig 0", + "defined_out": [ + "future_entry#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "future_entry#0" + ] + }, + "6177": { + "op": "pushint 25", + "defined_out": [ + "25", + "future_entry#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "future_entry#0", + "25" + ] + }, + "6179": { + "op": "extract_uint64", + "defined_out": [ + "future_entry#0", + "values%3#1" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "values%3#1" + ] + }, + "6180": { + "op": "frame_dig 2", + "defined_out": [ + "discount_factor#0", + "future_entry#0", + "values%3#1" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "values%3#1", + "discount_factor#0" + ] + }, + "6182": { + "op": "swap", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "discount_factor#0", + "values%3#1" + ] + }, + "6183": { + "callsub": "modules.kernel.ActusKernelModule._discount_annuity_factor", + "op": "callsub _discount_annuity_factor", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "discount_factor#0" + ] + }, + "6186": { + "op": "dup", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "discount_factor#0", + "discount_factor#0" + ] + }, + "6187": { + "op": "frame_bury 2", + "defined_out": [ + "discount_factor#0", + "future_entry#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "discount_factor#0" + ] + }, + "6189": { + "op": "frame_dig 1", + "defined_out": [ + "denominator#0", + "discount_factor#0", + "future_entry#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "discount_factor#0", + "denominator#0" + ] + }, + "6191": { + "op": "+", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "denominator#0" + ] + }, + "6192": { + "op": "frame_bury 1", + "defined_out": [ + "denominator#0", + "discount_factor#0", + "future_entry#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6194": { + "op": "b _apply_non_cash_schedule_entry_after_if_else@47" + }, + "6197": { + "block": "_apply_non_cash_schedule_entry_bool_false@41", + "stack_in": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ], + "op": "intc_0 // 0", + "defined_out": [ + "is_redemption_event#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "is_redemption_event#0" + ] + }, + "6198": { + "op": "b _apply_non_cash_schedule_entry_bool_merge@42" + }, + "6201": { + "block": "_apply_non_cash_schedule_entry_after_while@48", + "stack_in": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ], + "op": "frame_dig 1", + "defined_out": [ + "denominator#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "denominator#0" + ] + }, + "6203": { + "error": "Invalid ACTUS configuration", + "op": "assert // Invalid ACTUS configuration", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6204": { + "op": "intc_0 // 0", + "defined_out": [ + "0", + "denominator#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0" + ] + }, + "6205": { + "op": "bytec_3 // \"outstanding_principal\"", + "defined_out": [ + "\"outstanding_principal\"", + "0", + "denominator#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0", + "\"outstanding_principal\"" + ] + }, + "6206": { + "op": "app_global_get_ex", + "defined_out": [ + "denominator#0", + "maybe_exists%3#0", + "numerator#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "numerator#0", + "maybe_exists%3#0" + ] + }, + "6207": { + "error": "check self.outstanding_principal exists", + "op": "assert // check self.outstanding_principal exists", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "numerator#0" + ] + }, + "6208": { + "op": "frame_dig -2", + "defined_out": [ + "denominator#0", + "entry#0 (copy)", + "numerator#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "numerator#0", + "entry#0 (copy)" + ] + }, + "6210": { + "op": "pushint 57", + "defined_out": [ + "57", + "denominator#0", + "entry#0 (copy)", + "numerator#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "numerator#0", + "entry#0 (copy)", + "57" + ] + }, + "6212": { + "op": "extract_uint64", + "defined_out": [ + "denominator#0", + "numerator#0", + "values%4#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "numerator#0", + "values%4#0" + ] + }, + "6213": { + "op": "intc_2 // 8", + "defined_out": [ + "8", + "denominator#0", + "numerator#0", + "values%4#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "numerator#0", + "values%4#0", + "8" + ] + }, + "6214": { + "op": "&", + "defined_out": [ + "denominator#0", + "numerator#0", + "tmp%14#1" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "numerator#0", + "tmp%14#1" + ] + }, + "6215": { + "op": "bnz _apply_non_cash_schedule_entry_after_if_else@50", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "numerator#0" + ] + }, + "6218": { + "op": "intc_0 // 0", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "numerator#0", + "0" + ] + }, + "6219": { + "op": "bytec 6 // \"accrued_interest\"", + "defined_out": [ + "\"accrued_interest\"", + "0", + "denominator#0", + "numerator#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "numerator#0", + "0", + "\"accrued_interest\"" + ] + }, + "6221": { + "op": "app_global_get_ex", + "defined_out": [ + "denominator#0", + "maybe_exists%4#0", + "maybe_value%4#0", + "numerator#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "numerator#0", + "maybe_value%4#0", + "maybe_exists%4#0" + ] + }, + "6222": { + "error": "check self.accrued_interest exists", + "op": "assert // check self.accrued_interest exists", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "numerator#0", + "maybe_value%4#0" + ] + }, + "6223": { + "op": "+", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "numerator#0" + ] + }, + "6224": { + "block": "_apply_non_cash_schedule_entry_after_if_else@50", + "stack_in": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "numerator#0" + ], + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "numerator#0", + "0" + ] + }, + "6225": { + "op": "bytec 5 // \"fixed_point_scale\"", + "defined_out": [ + "\"fixed_point_scale\"", + "0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "numerator#0", + "0", + "\"fixed_point_scale\"" + ] + }, + "6227": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%5#0", + "maybe_value%5#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "numerator#0", + "maybe_value%5#0", + "maybe_exists%5#0" + ] + }, + "6228": { + "error": "check self.fixed_point_scale exists", + "op": "assert // check self.fixed_point_scale exists", + "defined_out": [ + "maybe_value%5#0", + "numerator#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "numerator#0", + "maybe_value%5#0" + ] + }, + "6229": { + "op": "frame_dig 1", + "defined_out": [ + "denominator#0", + "maybe_value%5#0", + "numerator#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "numerator#0", + "maybe_value%5#0", + "denominator#0" + ] + }, + "6231": { + "callsub": "modules.kernel.ActusKernelModule._scaled_mul_div", + "op": "callsub _scaled_mul_div", + "defined_out": [ + "denominator#0", + "tmp%17#1" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "tmp%17#1" + ] + }, + "6234": { + "op": "bytec 14 // \"next_principal_redemption\"", + "defined_out": [ + "\"next_principal_redemption\"", + "denominator#0", + "tmp%17#1" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "tmp%17#1", + "\"next_principal_redemption\"" + ] + }, + "6236": { + "op": "swap", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "\"next_principal_redemption\"", + "tmp%17#1" + ] + }, + "6237": { + "op": "app_global_put", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6238": { + "block": "_apply_non_cash_schedule_entry_after_if_else@30", + "stack_in": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ], + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0" + ] + }, + "6239": { + "op": "bytec_2 // \"event_cursor\"", + "defined_out": [ + "\"event_cursor\"", + "0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0", + "\"event_cursor\"" + ] + }, + "6240": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%10#0", + "maybe_value%10#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%10#0", + "maybe_exists%10#0" + ] + }, + "6241": { + "error": "check self.event_cursor exists", + "op": "assert // check self.event_cursor exists", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%10#0" + ] + }, + "6242": { + "op": "intc_1 // 1", + "defined_out": [ + "1", + "maybe_value%10#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%10#0", + "1" + ] + }, + "6243": { + "op": "+", + "defined_out": [ + "tmp%20#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "tmp%20#0" + ] + }, + "6244": { + "op": "bytec_2 // \"event_cursor\"", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "tmp%20#0", + "\"event_cursor\"" + ] + }, + "6245": { + "op": "swap", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "\"event_cursor\"", + "tmp%20#0" + ] + }, + "6246": { + "op": "app_global_put", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6247": { + "op": "frame_dig -2", + "defined_out": [ + "entry#0 (copy)" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "entry#0 (copy)" + ] + }, + "6249": { + "op": "intc_0 // 0", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "entry#0 (copy)", + "0" + ] + }, + "6250": { + "op": "dup", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "entry#0 (copy)", + "0", + "0" + ] + }, + "6251": { + "callsub": "modules.kernel.ActusKernelModule._emit_execution_event", + "op": "callsub _emit_execution_event", + "defined_out": [ + "entry#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "entry#0" + ] + }, + "6254": { + "op": "dup" + }, + "6255": { + "op": "frame_bury -2", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "entry#0 (copy)" + ] + }, + "6257": { + "op": "frame_dig -1", + "defined_out": [ + "entry#0 (copy)", + "payload#0 (copy)" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "entry#0 (copy)", + "payload#0 (copy)" + ] + }, + "6259": { + "op": "frame_bury 1" + }, + "6261": { + "op": "frame_bury 0" + }, + "6263": { + "retsub": true, + "op": "retsub" + }, + "6264": { + "block": "_apply_non_cash_schedule_entry_else_body@29", + "stack_in": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ], + "op": "frame_dig -2", + "defined_out": [ + "entry#0 (copy)" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "entry#0 (copy)" + ] + }, + "6266": { + "op": "pushint 41", + "defined_out": [ + "41", + "entry#0 (copy)" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "entry#0 (copy)", + "41" + ] + }, + "6268": { + "op": "extract_uint64", + "defined_out": [ + "values%12#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "values%12#0" + ] + }, + "6269": { + "op": "bytec 14 // \"next_principal_redemption\"", + "defined_out": [ + "\"next_principal_redemption\"", + "values%12#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "values%12#0", + "\"next_principal_redemption\"" + ] + }, + "6271": { + "op": "swap", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "\"next_principal_redemption\"", + "values%12#0" + ] + }, + "6272": { + "op": "app_global_put", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6273": { + "op": "b _apply_non_cash_schedule_entry_after_if_else@30" + }, + "6276": { + "block": "_apply_non_cash_schedule_entry_else_body@20", + "stack_in": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ], + "op": "frame_dig 10", + "defined_out": [ + "event_type#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "event_type#0" + ] + }, + "6278": { + "op": "pushint 18", + "defined_out": [ + "18", + "event_type#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "event_type#0", + "18" + ] + }, + "6280": { + "op": "==", + "defined_out": [ + "event_type#0", + "tmp%17#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "tmp%17#0" + ] + }, + "6281": { + "op": "bz _apply_non_cash_schedule_entry_after_if_else@23", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6284": { + "op": "intc_0 // 0", + "defined_out": [ + "0", + "event_type#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0" + ] + }, + "6285": { + "op": "bytec_3 // \"outstanding_principal\"", + "defined_out": [ + "\"outstanding_principal\"", + "0", + "event_type#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0", + "\"outstanding_principal\"" + ] + }, + "6286": { + "op": "app_global_get_ex", + "defined_out": [ + "event_type#0", + "maybe_exists%9#0", + "maybe_value%9#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%9#0", + "maybe_exists%9#0" + ] + }, + "6287": { + "error": "check self.outstanding_principal exists", + "op": "assert // check self.outstanding_principal exists", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%9#0" + ] + }, + "6288": { + "op": "bytec 7 // \"interest_calculation_base\"", + "defined_out": [ + "\"interest_calculation_base\"", + "event_type#0", + "maybe_value%9#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%9#0", + "\"interest_calculation_base\"" + ] + }, + "6290": { + "op": "swap", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "\"interest_calculation_base\"", + "maybe_value%9#0" + ] + }, + "6291": { + "op": "app_global_put", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6292": { + "op": "b _apply_non_cash_schedule_entry_after_if_else@23" + }, + "6295": { + "block": "_apply_non_cash_schedule_entry_else_body@10", + "stack_in": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ], + "op": "frame_dig 10", + "defined_out": [ + "event_type#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "event_type#0" + ] + }, + "6297": { + "op": "pushint 11", + "defined_out": [ + "11", + "event_type#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "event_type#0", + "11" + ] + }, + "6299": { + "op": "==", + "defined_out": [ + "event_type#0", + "tmp%13#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "tmp%13#0" + ] + }, + "6300": { + "op": "bz _apply_non_cash_schedule_entry_else_body@14", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6303": { + "op": "frame_dig -2", + "defined_out": [ + "entry#0 (copy)", + "event_type#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "entry#0 (copy)" + ] + }, + "6305": { + "op": "pushint 33", + "defined_out": [ + "33", + "entry#0 (copy)", + "event_type#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "entry#0 (copy)", + "33" + ] + }, + "6307": { + "op": "extract_uint64", + "defined_out": [ + "event_type#0", + "next_rate#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "next_rate#0" + ] + }, + "6308": { + "op": "dup", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "next_rate#0", + "next_rate#0" + ] + }, + "6309": { + "op": "frame_bury 5", + "defined_out": [ + "event_type#0", + "next_rate#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "next_rate#0" + ] + }, + "6311": { + "op": "bnz _apply_non_cash_schedule_entry_after_if_else@13", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6314": { + "op": "intc_0 // 0", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0" + ] + }, + "6315": { + "op": "bytec 37 // \"rate_reset_next\"", + "defined_out": [ + "\"rate_reset_next\"", + "0", + "event_type#0", + "next_rate#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0", + "\"rate_reset_next\"" + ] + }, + "6317": { + "op": "app_global_get_ex", + "defined_out": [ + "event_type#0", + "maybe_exists%8#0", + "next_rate#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "next_rate#0", + "maybe_exists%8#0" + ] + }, + "6318": { + "op": "swap", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_exists%8#0", + "next_rate#0" + ] + }, + "6319": { + "op": "frame_bury 5", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_exists%8#0" + ] + }, + "6321": { + "error": "check self.rate_reset_next exists", + "op": "assert // check self.rate_reset_next exists", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6322": { + "block": "_apply_non_cash_schedule_entry_after_if_else@13", + "stack_in": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ], + "op": "bytec 9 // \"nominal_interest_rate\"", + "defined_out": [ + "\"nominal_interest_rate\"" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "\"nominal_interest_rate\"" + ] + }, + "6324": { + "op": "frame_dig 5", + "defined_out": [ + "\"nominal_interest_rate\"", + "next_rate#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "\"nominal_interest_rate\"", + "next_rate#0" + ] + }, + "6326": { + "op": "app_global_put", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6327": { + "op": "b _apply_non_cash_schedule_entry_after_if_else@18" + }, + "6330": { + "block": "_apply_non_cash_schedule_entry_else_body@14", + "stack_in": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ], + "op": "frame_dig -2", + "defined_out": [ + "entry#0 (copy)" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "entry#0 (copy)" + ] + }, + "6332": { + "op": "pushint 33", + "defined_out": [ + "33", + "entry#0 (copy)" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "entry#0 (copy)", + "33" + ] + }, + "6334": { + "op": "extract_uint64", + "defined_out": [ + "values%8#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "values%8#0" + ] + }, + "6335": { + "op": "dup", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "values%8#0", + "values%8#0" + ] + }, + "6336": { + "op": "frame_bury 9", + "defined_out": [ + "values%8#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "values%8#0" + ] + }, + "6338": { + "op": "bz _apply_non_cash_schedule_entry_after_if_else@18", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6341": { + "op": "bytec 9 // \"nominal_interest_rate\"", + "defined_out": [ + "\"nominal_interest_rate\"", + "values%8#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "\"nominal_interest_rate\"" + ] + }, + "6343": { + "op": "frame_dig 9", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "\"nominal_interest_rate\"", + "values%8#0" + ] + }, + "6345": { + "op": "app_global_put", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6346": { + "op": "b _apply_non_cash_schedule_entry_after_if_else@18" + }, + "6349": { + "subroutine": "modules.kernel.ActusKernelModule._emit_execution_event", + "params": { + "entry#0": "bytes", + "payoff#0": "uint64", + "settled_amount#0": "uint64" + }, + "block": "_emit_execution_event", + "stack_in": [], + "op": "proto 3 1" + }, + "6352": { + "op": "global CurrentApplicationID" + }, + "6354": { + "op": "frame_dig -3" + }, + "6356": { + "op": "intc_0 // 0", + "defined_out": [ + "0", + "entry#0 (copy)", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "entry#0 (copy)", + "0" + ] + }, + "6357": { + "op": "extract_uint64", + "defined_out": [ + "tmp%0#0", + "values%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0" + ] + }, + "6358": { + "op": "frame_dig -3", + "stack_out": [ + "tmp%0#0", + "values%0#0", + "entry#0 (copy)" + ] + }, + "6360": { + "op": "extract 8 1", + "defined_out": [ + "aggregate%extract%1#0", + "tmp%0#0", + "values%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0" + ] + }, + "6363": { + "op": "frame_dig -3", + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "entry#0 (copy)" + ] + }, + "6365": { + "op": "extract 9 8", + "defined_out": [ + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%0#0", + "values%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0" + ] + }, + "6368": { + "op": "global LatestTimestamp" + }, + "6370": { + "op": "frame_dig -3" + }, + "6372": { + "op": "intc_2 // 8", + "defined_out": [ + "8", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "entry#0 (copy)", + "tmp%0#0", + "tmp%1#0", + "values%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "entry#0 (copy)", + "8" + ] + }, + "6373": { + "op": "getbyte", + "defined_out": [ + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "event_type#0", + "tmp%0#0", + "tmp%1#0", + "values%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0" + ] + }, + "6374": { + "op": "frame_dig -2", + "defined_out": [ + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "event_type#0", + "payoff#0 (copy)", + "tmp%0#0", + "tmp%1#0", + "values%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "payoff#0 (copy)" + ] + }, + "6376": { + "op": "bnz _emit_execution_event_after_if_else@3", + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0" + ] + }, + "6379": { + "op": "intc_1 // 1", + "defined_out": [ + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "event_type#0", + "tmp%0#0", + "tmp%1#0", + "tmp%3#0", + "values%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "tmp%3#0" + ] + }, + "6380": { + "block": "_emit_execution_event_after_inlined_modules.kernel.ActusKernelModule._payoff_sign@7", + "stack_in": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "tmp%3#0" + ], + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "aggregate%val_as_bytes%0#0" + ] + }, + "6381": { + "op": "dup", + "defined_out": [ + "aggregate%val_as_bytes%0#0", + "aggregate%val_as_bytes%0#0 (copy)" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "aggregate%val_as_bytes%0#0", + "aggregate%val_as_bytes%0#0 (copy)" + ] + }, + "6382": { + "op": "bitlen", + "defined_out": [ + "aggregate%bitlen%0#0", + "aggregate%val_as_bytes%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "aggregate%val_as_bytes%0#0", + "aggregate%bitlen%0#0" + ] + }, + "6383": { + "op": "intc_2 // 8", + "defined_out": [ + "8", + "aggregate%bitlen%0#0", + "aggregate%val_as_bytes%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "aggregate%val_as_bytes%0#0", + "aggregate%bitlen%0#0", + "8" + ] + }, + "6384": { + "op": "<=", + "defined_out": [ + "aggregate%no_overflow%0#0", + "aggregate%val_as_bytes%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "aggregate%val_as_bytes%0#0", + "aggregate%no_overflow%0#0" + ] + }, + "6385": { + "error": "overflow", + "op": "assert // overflow", + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "aggregate%val_as_bytes%0#0" + ] + }, + "6386": { + "op": "extract 7 1", + "defined_out": [ + "aggregate%uint8%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "aggregate%uint8%0#0" + ] + }, + "6389": { + "op": "intc_0 // 0", + "defined_out": [ + "0", + "aggregate%uint8%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "aggregate%uint8%0#0", + "0" + ] + }, + "6390": { + "op": "bytec 19 // \"settlement_asset_id\"", + "defined_out": [ + "\"settlement_asset_id\"", + "0", + "aggregate%uint8%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "aggregate%uint8%0#0", + "0", + "\"settlement_asset_id\"" + ] + }, + "6392": { + "op": "app_global_get_ex", + "defined_out": [ + "aggregate%uint8%0#0", + "maybe_exists%0#0", + "maybe_value%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "aggregate%uint8%0#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "6393": { + "error": "check self.settlement_asset_id exists", + "op": "assert // check self.settlement_asset_id exists", + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "aggregate%uint8%0#0", + "maybe_value%0#0" + ] + }, + "6394": { + "op": "frame_dig 1", + "defined_out": [ + "aggregate%uint8%0#0", + "maybe_value%0#0", + "values%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "aggregate%uint8%0#0", + "maybe_value%0#0", + "values%0#0" + ] + }, + "6396": { + "op": "dup", + "defined_out": [ + "aggregate%uint8%0#0", + "maybe_value%0#0", + "values%0#0", + "values%0#0 (copy)" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "aggregate%uint8%0#0", + "maybe_value%0#0", + "values%0#0", + "values%0#0 (copy)" + ] + }, + "6397": { + "op": "intc_1 // 1", + "defined_out": [ + "1", + "aggregate%uint8%0#0", + "maybe_value%0#0", + "values%0#0", + "values%0#0 (copy)" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "aggregate%uint8%0#0", + "maybe_value%0#0", + "values%0#0", + "values%0#0 (copy)", + "1" + ] + }, + "6398": { + "op": "+", + "defined_out": [ + "aggregate%uint8%0#0", + "maybe_value%0#0", + "tmp%5#0", + "values%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "aggregate%uint8%0#0", + "maybe_value%0#0", + "values%0#0", + "tmp%5#0" + ] + }, + "6399": { + "op": "frame_dig 0", + "defined_out": [ + "aggregate%uint8%0#0", + "maybe_value%0#0", + "tmp%0#0", + "tmp%5#0", + "values%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "aggregate%uint8%0#0", + "maybe_value%0#0", + "values%0#0", + "tmp%5#0", + "tmp%0#0" + ] + }, + "6401": { + "op": "itob", + "defined_out": [ + "aggregate%uint8%0#0", + "aggregate%val_as_bytes%1#0", + "maybe_value%0#0", + "tmp%0#0", + "tmp%5#0", + "values%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "aggregate%uint8%0#0", + "maybe_value%0#0", + "values%0#0", + "tmp%5#0", + "aggregate%val_as_bytes%1#0" + ] + }, + "6402": { + "op": "uncover 2", + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "aggregate%uint8%0#0", + "maybe_value%0#0", + "tmp%5#0", + "aggregate%val_as_bytes%1#0", + "values%0#0" + ] + }, + "6404": { + "op": "itob", + "defined_out": [ + "aggregate%uint8%0#0", + "aggregate%val_as_bytes%1#0", + "aggregate%val_as_bytes%2#0", + "maybe_value%0#0", + "tmp%0#0", + "tmp%5#0", + "values%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "aggregate%uint8%0#0", + "maybe_value%0#0", + "tmp%5#0", + "aggregate%val_as_bytes%1#0", + "aggregate%val_as_bytes%2#0" + ] + }, + "6405": { + "op": "concat", + "defined_out": [ + "aggregate%head%1#0", + "aggregate%uint8%0#0", + "maybe_value%0#0", + "tmp%0#0", + "tmp%5#0", + "values%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "aggregate%uint8%0#0", + "maybe_value%0#0", + "tmp%5#0", + "aggregate%head%1#0" + ] + }, + "6406": { + "op": "frame_dig 2", + "defined_out": [ + "aggregate%extract%1#0", + "aggregate%head%1#0", + "aggregate%uint8%0#0", + "maybe_value%0#0", + "tmp%0#0", + "tmp%5#0", + "values%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "aggregate%uint8%0#0", + "maybe_value%0#0", + "tmp%5#0", + "aggregate%head%1#0", + "aggregate%extract%1#0" + ] + }, + "6408": { + "op": "concat", + "defined_out": [ + "aggregate%extract%1#0", + "aggregate%head%2#0", + "aggregate%uint8%0#0", + "maybe_value%0#0", + "tmp%0#0", + "tmp%5#0", + "values%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "aggregate%uint8%0#0", + "maybe_value%0#0", + "tmp%5#0", + "aggregate%head%2#0" + ] + }, + "6409": { + "op": "frame_dig 3", + "defined_out": [ + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "aggregate%head%2#0", + "aggregate%uint8%0#0", + "maybe_value%0#0", + "tmp%0#0", + "tmp%5#0", + "values%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "aggregate%uint8%0#0", + "maybe_value%0#0", + "tmp%5#0", + "aggregate%head%2#0", + "aggregate%extract%2#0" + ] + }, + "6411": { + "op": "concat", + "defined_out": [ + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "aggregate%head%3#0", + "aggregate%uint8%0#0", + "maybe_value%0#0", + "tmp%0#0", + "tmp%5#0", + "values%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "aggregate%uint8%0#0", + "maybe_value%0#0", + "tmp%5#0", + "aggregate%head%3#0" + ] + }, + "6412": { + "op": "frame_dig 4", + "defined_out": [ + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "aggregate%head%3#0", + "aggregate%uint8%0#0", + "maybe_value%0#0", + "tmp%0#0", + "tmp%1#0", + "tmp%5#0", + "values%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "aggregate%uint8%0#0", + "maybe_value%0#0", + "tmp%5#0", + "aggregate%head%3#0", + "tmp%1#0" + ] + }, + "6414": { + "op": "itob", + "defined_out": [ + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "aggregate%head%3#0", + "aggregate%uint8%0#0", + "aggregate%val_as_bytes%4#0", + "maybe_value%0#0", + "tmp%0#0", + "tmp%1#0", + "tmp%5#0", + "values%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "aggregate%uint8%0#0", + "maybe_value%0#0", + "tmp%5#0", + "aggregate%head%3#0", + "aggregate%val_as_bytes%4#0" + ] + }, + "6415": { + "op": "concat", + "defined_out": [ + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "aggregate%head%4#0", + "aggregate%uint8%0#0", + "maybe_value%0#0", + "tmp%0#0", + "tmp%1#0", + "tmp%5#0", + "values%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "aggregate%uint8%0#0", + "maybe_value%0#0", + "tmp%5#0", + "aggregate%head%4#0" + ] + }, + "6416": { + "op": "frame_dig -2", + "defined_out": [ + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "aggregate%head%4#0", + "aggregate%uint8%0#0", + "maybe_value%0#0", + "payoff#0 (copy)", + "tmp%0#0", + "tmp%1#0", + "tmp%5#0", + "values%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "aggregate%uint8%0#0", + "maybe_value%0#0", + "tmp%5#0", + "aggregate%head%4#0", + "payoff#0 (copy)" + ] + }, + "6418": { + "op": "itob", + "defined_out": [ + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "aggregate%head%4#0", + "aggregate%uint8%0#0", + "aggregate%val_as_bytes%5#0", + "maybe_value%0#0", + "tmp%0#0", + "tmp%1#0", + "tmp%5#0", + "values%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "aggregate%uint8%0#0", + "maybe_value%0#0", + "tmp%5#0", + "aggregate%head%4#0", + "aggregate%val_as_bytes%5#0" + ] + }, + "6419": { + "op": "concat", + "defined_out": [ + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "aggregate%head%5#0", + "aggregate%uint8%0#0", + "maybe_value%0#0", + "tmp%0#0", + "tmp%1#0", + "tmp%5#0", + "values%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "aggregate%uint8%0#0", + "maybe_value%0#0", + "tmp%5#0", + "aggregate%head%5#0" + ] + }, + "6420": { + "op": "uncover 3", + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "maybe_value%0#0", + "tmp%5#0", + "aggregate%head%5#0", + "aggregate%uint8%0#0" + ] + }, + "6422": { + "op": "concat", + "defined_out": [ + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "aggregate%head%6#0", + "maybe_value%0#0", + "tmp%0#0", + "tmp%1#0", + "tmp%5#0", + "values%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "maybe_value%0#0", + "tmp%5#0", + "aggregate%head%6#0" + ] + }, + "6423": { + "op": "frame_dig -1", + "defined_out": [ + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "aggregate%head%6#0", + "maybe_value%0#0", + "settled_amount#0 (copy)", + "tmp%0#0", + "tmp%1#0", + "tmp%5#0", + "values%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "maybe_value%0#0", + "tmp%5#0", + "aggregate%head%6#0", + "settled_amount#0 (copy)" + ] + }, + "6425": { + "op": "itob", + "defined_out": [ + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "aggregate%head%6#0", + "aggregate%val_as_bytes%6#0", + "maybe_value%0#0", + "tmp%0#0", + "tmp%1#0", + "tmp%5#0", + "values%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "maybe_value%0#0", + "tmp%5#0", + "aggregate%head%6#0", + "aggregate%val_as_bytes%6#0" + ] + }, + "6426": { + "op": "concat", + "defined_out": [ + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "aggregate%head%7#0", + "maybe_value%0#0", + "tmp%0#0", + "tmp%1#0", + "tmp%5#0", + "values%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "maybe_value%0#0", + "tmp%5#0", + "aggregate%head%7#0" + ] + }, + "6427": { + "op": "uncover 2", + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "tmp%5#0", + "aggregate%head%7#0", + "maybe_value%0#0" + ] + }, + "6429": { + "op": "itob", + "defined_out": [ + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "aggregate%head%7#0", + "aggregate%val_as_bytes%7#0", + "tmp%0#0", + "tmp%1#0", + "tmp%5#0", + "values%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "tmp%5#0", + "aggregate%head%7#0", + "aggregate%val_as_bytes%7#0" + ] + }, + "6430": { + "op": "concat", + "defined_out": [ + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "aggregate%head%8#0", + "tmp%0#0", + "tmp%1#0", + "tmp%5#0", + "values%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "tmp%5#0", + "aggregate%head%8#0" + ] + }, + "6431": { + "op": "swap", + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "aggregate%head%8#0", + "tmp%5#0" + ] + }, + "6432": { + "op": "itob", + "defined_out": [ + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "aggregate%head%8#0", + "aggregate%val_as_bytes%8#0", + "tmp%0#0", + "tmp%1#0", + "values%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "aggregate%head%8#0", + "aggregate%val_as_bytes%8#0" + ] + }, + "6433": { + "op": "concat", + "defined_out": [ + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "aggregate%head%9#0", + "tmp%0#0", + "tmp%1#0", + "values%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "aggregate%head%9#0" + ] + }, + "6434": { + "op": "pushbytes 0x9a332b95 // method \"ExecutionEvent(uint64,uint64,uint8,uint64,uint64,uint64,uint8,uint64,uint64,uint64)\"", + "defined_out": [ + "Method(ExecutionEvent(uint64,uint64,uint8,uint64,uint64,uint64,uint8,uint64,uint64,uint64))", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "aggregate%head%9#0", + "tmp%0#0", + "tmp%1#0", + "values%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "aggregate%head%9#0", + "Method(ExecutionEvent(uint64,uint64,uint8,uint64,uint64,uint64,uint8,uint64,uint64,uint64))" + ] + }, + "6440": { + "op": "swap", + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "Method(ExecutionEvent(uint64,uint64,uint8,uint64,uint64,uint64,uint8,uint64,uint64,uint64))", + "aggregate%head%9#0" + ] + }, + "6441": { + "op": "concat", + "defined_out": [ + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "event%0#0", + "tmp%0#0", + "tmp%1#0", + "values%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "event%0#0" + ] + }, + "6442": { + "op": "log", + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0" + ] + }, + "6443": { + "op": "frame_dig -3", + "defined_out": [ + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "entry#0 (copy)", + "tmp%0#0", + "tmp%1#0", + "values%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "entry#0 (copy)" + ] + }, + "6445": { + "op": "frame_bury 0" + }, + "6447": { + "retsub": true, + "op": "retsub" + }, + "6448": { + "block": "_emit_execution_event_after_if_else@3", + "stack_in": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0" + ], + "op": "frame_dig 5", + "defined_out": [ + "event_type#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "event_type#0" + ] + }, + "6450": { + "op": "intc_1 // 1", + "defined_out": [ + "1", + "event_type#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "event_type#0", + "1" + ] + }, + "6451": { + "op": "==", + "defined_out": [ + "event_type#0", + "tmp%1#1" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "tmp%1#1" + ] + }, + "6452": { + "op": "bnz _emit_execution_event_if_body@5", + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0" + ] + }, + "6455": { + "op": "frame_dig 5", + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "event_type#0" + ] + }, + "6457": { + "op": "pushint 4", + "defined_out": [ + "4", + "event_type#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "event_type#0", + "4" + ] + }, + "6459": { + "op": "==", + "defined_out": [ + "event_type#0", + "tmp%2#1" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "tmp%2#1" + ] + }, + "6460": { + "op": "bz _emit_execution_event_after_if_else@6", + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0" + ] + }, + "6463": { + "block": "_emit_execution_event_if_body@5", + "stack_in": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0" + ], + "op": "intc_1 // 1", + "defined_out": [ + "tmp%3#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "tmp%3#0" + ] + }, + "6464": { + "op": "b _emit_execution_event_after_inlined_modules.kernel.ActusKernelModule._payoff_sign@7" + }, + "6467": { + "block": "_emit_execution_event_after_if_else@6", + "stack_in": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0" + ], + "op": "pushint 255", + "defined_out": [ + "tmp%3#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "tmp%3#0" + ] + }, + "6470": { + "op": "b _emit_execution_event_after_inlined_modules.kernel.ActusKernelModule._payoff_sign@7" + }, + "6473": { + "subroutine": "modules.rbac.RbacModule._role_is_active", + "params": { + "role_map#0": "bytes", + "role_address#0": "bytes" + }, + "block": "_role_is_active", + "stack_in": [], + "op": "proto 2 1" + }, + "6476": { + "op": "pushbytes \"\"", + "stack_out": [ + "awst_tmp%0#0" + ] + }, + "6478": { + "op": "frame_dig -2", + "defined_out": [ + "role_map#0 (copy)" + ], + "stack_out": [ + "awst_tmp%0#0", + "role_map#0 (copy)" + ] + }, + "6480": { + "op": "frame_dig -1", + "defined_out": [ + "role_address#0 (copy)", + "role_map#0 (copy)" + ], + "stack_out": [ + "awst_tmp%0#0", + "role_map#0 (copy)", + "role_address#0 (copy)" + ] + }, + "6482": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%0#1" + ], + "stack_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1" + ] + }, + "6483": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%0#1" + ], + "stack_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "box_prefixed_key%0#1" + ] + }, + "6484": { + "op": "box_len", + "defined_out": [ + "_%0#0", + "box_prefixed_key%0#1", + "maybe_exists%0#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "_%0#0", + "maybe_exists%0#0" + ] + }, + "6485": { + "op": "bury 1", + "stack_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "maybe_exists%0#0" + ] + }, + "6487": { + "op": "bz _role_is_active_bool_false@4", + "stack_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1" + ] + }, + "6490": { + "op": "frame_dig 1", + "stack_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "box_prefixed_key%0#1" + ] + }, + "6492": { + "op": "box_get", + "defined_out": [ + "aggregate%box_get%0#0", + "aggregate%box_get%1#0", + "box_prefixed_key%0#1" + ], + "stack_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "aggregate%box_get%0#0", + "aggregate%box_get%1#0" + ] + }, + "6493": { + "error": "check BoxMap entry exists", + "op": "assert // check BoxMap entry exists", + "stack_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "aggregate%box_get%0#0" + ] + }, + "6494": { + "op": "intc_0 // 0", + "stack_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "aggregate%box_get%0#0", + "0" + ] + }, + "6495": { + "op": "extract_uint64", + "defined_out": [ + "box_prefixed_key%0#1", + "values%0#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "values%0#0" + ] + }, + "6496": { + "op": "global LatestTimestamp" + }, + "6498": { + "op": "dup", + "defined_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "values%0#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "values%0#0", + "awst_tmp%0#0", + "awst_tmp%0#0" + ] + }, + "6499": { + "op": "frame_bury 0", + "defined_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "values%0#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "values%0#0", + "awst_tmp%0#0" + ] + }, + "6501": { + "op": "<=", + "defined_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "tmp%1#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "tmp%1#0" + ] + }, + "6502": { + "op": "bz _role_is_active_bool_false@4", + "stack_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1" + ] + }, + "6505": { + "op": "frame_dig 1", + "stack_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "box_prefixed_key%0#1" + ] + }, + "6507": { + "op": "box_get", + "defined_out": [ + "aggregate%box_get%2#0", + "aggregate%box_get%3#0", + "awst_tmp%0#0", + "box_prefixed_key%0#1" + ], + "stack_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "aggregate%box_get%2#0", + "aggregate%box_get%3#0" + ] + }, + "6508": { + "error": "check BoxMap entry exists", + "op": "assert // check BoxMap entry exists", + "stack_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "aggregate%box_get%2#0" + ] + }, + "6509": { + "op": "intc_2 // 8", + "defined_out": [ + "8", + "aggregate%box_get%2#0", + "awst_tmp%0#0", + "box_prefixed_key%0#1" + ], + "stack_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "aggregate%box_get%2#0", + "8" + ] + }, + "6510": { + "op": "extract_uint64", + "defined_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "values%1#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "values%1#0" + ] + }, + "6511": { + "op": "frame_dig 0", + "stack_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "values%1#0", + "awst_tmp%0#0" + ] + }, + "6513": { + "op": ">=", + "defined_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "tmp%2#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "tmp%2#0" + ] + }, + "6514": { + "op": "bz _role_is_active_bool_false@4", + "stack_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1" + ] + }, + "6517": { + "op": "intc_1 // 1", + "defined_out": [ + "and_result%0#0", + "awst_tmp%0#0", + "box_prefixed_key%0#1" + ], + "stack_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "and_result%0#0" + ] + }, + "6518": { + "block": "_role_is_active_bool_merge@5", + "stack_in": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "and_result%0#0" + ], + "op": "frame_bury 0", + "defined_out": [ + "and_result%0#0" + ] + }, + "6520": { + "retsub": true, + "op": "retsub" + }, + "6521": { + "block": "_role_is_active_bool_false@4", + "stack_in": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1" + ], + "op": "intc_0 // 0", + "defined_out": [ + "and_result%0#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "and_result%0#0" + ] + }, + "6522": { + "op": "b _role_is_active_bool_merge@5" + }, + "6525": { + "subroutine": "modules.rbac.RbacModule._assert_caller_is_arranger", + "params": {}, + "block": "_assert_caller_is_arranger", + "stack_in": [], + "op": "txn Sender", + "defined_out": [ + "role_address#0" + ], + "stack_out": [ + "role_address#0" + ] + }, + "6527": { + "op": "intc_0 // 0", + "defined_out": [ + "0", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "0" + ] + }, + "6528": { + "op": "bytec 18 // 0x5223417272616e67657223", + "defined_out": [ + "0", + "0x5223417272616e67657223", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "0", + "0x5223417272616e67657223" + ] + }, + "6530": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "6531": { + "error": "check self.arranger exists", + "op": "assert // check self.arranger exists", + "stack_out": [ + "role_address#0", + "maybe_value%0#0" + ] + }, + "6532": { + "op": "==", + "defined_out": [ + "tmp%0#1" + ], + "stack_out": [ + "tmp%0#1" + ] + }, + "6533": { + "error": "Not authorized", + "op": "assert // Not authorized", + "stack_out": [] + }, + "6534": { + "retsub": true, + "op": "retsub" + }, + "6535": { + "subroutine": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", + "params": {}, + "block": "_assert_is_not_asset_defaulted", + "stack_in": [], + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "0" + ] + }, + "6536": { + "op": "bytec 41 // \"asset_defaulted\"", + "defined_out": [ + "\"asset_defaulted\"", + "0" + ], + "stack_out": [ + "0", + "\"asset_defaulted\"" + ] + }, + "6538": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0" + ], + "stack_out": [ + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "6539": { + "error": "check self.asset_defaulted exists", + "op": "assert // check self.asset_defaulted exists", + "stack_out": [ + "maybe_value%0#0" + ] + }, + "6540": { + "op": "!", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "6541": { + "error": "Defaulted", + "op": "assert // Defaulted", + "stack_out": [] + }, + "6542": { + "retsub": true, + "op": "retsub" + }, + "6543": { + "subroutine": "modules.rbac.RbacModule._assert_is_not_asset_suspended", + "params": {}, + "block": "_assert_is_not_asset_suspended", + "stack_in": [], + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "0" + ] + }, + "6544": { + "op": "bytec 33 // \"asset_suspended\"", + "defined_out": [ + "\"asset_suspended\"", + "0" + ], + "stack_out": [ + "0", + "\"asset_suspended\"" + ] + }, + "6546": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0" + ], + "stack_out": [ + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "6547": { + "error": "check self.asset_suspended exists", + "op": "assert // check self.asset_suspended exists", + "stack_out": [ + "maybe_value%0#0" + ] + }, + "6548": { + "op": "!", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "6549": { + "error": "Suspended operations", + "op": "assert // Suspended operations", + "stack_out": [] + }, + "6550": { + "retsub": true, + "op": "retsub" + }, + "6551": { + "subroutine": "modules.rbac.RbacModule._assert_valid_role", + "params": { + "role_id#0": "uint64" + }, + "block": "_assert_valid_role", + "stack_in": [], + "op": "proto 1 0" + }, + "6554": { + "op": "frame_dig -1", + "defined_out": [ + "role_id#0 (copy)" + ], + "stack_out": [ + "role_id#0 (copy)" + ] + }, + "6556": { + "op": "pushint 20", + "defined_out": [ + "20", + "role_id#0 (copy)" + ], + "stack_out": [ + "role_id#0 (copy)", + "20" + ] + }, + "6558": { + "op": "==", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "6559": { + "op": "bnz _assert_valid_role_bool_true@7", + "stack_out": [] + }, + "6562": { + "op": "frame_dig -1", + "stack_out": [ + "role_id#0 (copy)" + ] + }, + "6564": { + "op": "pushint 25", + "defined_out": [ + "25", + "role_id#0 (copy)" + ], + "stack_out": [ + "role_id#0 (copy)", + "25" + ] + }, + "6566": { + "op": "==", + "defined_out": [ + "tmp%1#0" + ], + "stack_out": [ + "tmp%1#0" + ] + }, + "6567": { + "op": "bnz _assert_valid_role_bool_true@7", + "stack_out": [] + }, + "6570": { + "op": "frame_dig -1", + "stack_out": [ + "role_id#0 (copy)" + ] + }, + "6572": { + "op": "pushint 40", + "defined_out": [ + "40", + "role_id#0 (copy)" + ], + "stack_out": [ + "role_id#0 (copy)", + "40" + ] + }, + "6574": { + "op": "==", + "defined_out": [ + "tmp%2#0" + ], + "stack_out": [ + "tmp%2#0" + ] + }, + "6575": { + "op": "bnz _assert_valid_role_bool_true@7", + "stack_out": [] + }, + "6578": { + "op": "frame_dig -1", + "stack_out": [ + "role_id#0 (copy)" + ] + }, + "6580": { + "op": "pushint 50", + "defined_out": [ + "50", + "role_id#0 (copy)" + ], + "stack_out": [ + "role_id#0 (copy)", + "50" + ] + }, + "6582": { + "op": "==", + "defined_out": [ + "tmp%3#0" + ], + "stack_out": [ + "tmp%3#0" + ] + }, + "6583": { + "op": "bnz _assert_valid_role_bool_true@7", + "stack_out": [] + }, + "6586": { + "op": "frame_dig -1", + "stack_out": [ + "role_id#0 (copy)" + ] + }, + "6588": { + "op": "pushint 60", + "defined_out": [ + "60", + "role_id#0 (copy)" + ], + "stack_out": [ + "role_id#0 (copy)", + "60" + ] + }, + "6590": { + "op": "==", + "defined_out": [ + "tmp%4#0" + ], + "stack_out": [ + "tmp%4#0" + ] + }, + "6591": { + "op": "bnz _assert_valid_role_bool_true@7", + "stack_out": [] + }, + "6594": { + "op": "frame_dig -1", + "stack_out": [ + "role_id#0 (copy)" + ] + }, + "6596": { + "op": "pushint 70", + "defined_out": [ + "70", + "role_id#0 (copy)" + ], + "stack_out": [ + "role_id#0 (copy)", + "70" + ] + }, + "6598": { + "op": "==", + "defined_out": [ + "tmp%5#0" + ], + "stack_out": [ + "tmp%5#0" + ] + }, + "6599": { + "op": "bnz _assert_valid_role_bool_true@7", + "stack_out": [] + }, + "6602": { + "op": "frame_dig -1", + "stack_out": [ + "role_id#0 (copy)" + ] + }, + "6604": { + "op": "pushint 80", + "defined_out": [ + "80", + "role_id#0 (copy)" + ], + "stack_out": [ + "role_id#0 (copy)", + "80" + ] + }, + "6606": { + "op": "==", + "defined_out": [ + "tmp%6#0" + ], + "stack_out": [ + "tmp%6#0" + ] + }, + "6607": { + "op": "bz _assert_valid_role_bool_false@8", + "stack_out": [] + }, + "6610": { + "block": "_assert_valid_role_bool_true@7", + "stack_in": [], + "op": "intc_1 // 1", + "defined_out": [ + "or_result%0#0" + ], + "stack_out": [ + "or_result%0#0" + ] + }, + "6611": { + "error": "Invalid role identifier", + "block": "_assert_valid_role_bool_merge@9", + "stack_in": [ + "or_result%0#0" + ], + "op": "assert // Invalid role identifier", + "defined_out": [], + "stack_out": [] + }, + "6612": { + "retsub": true, + "op": "retsub" + }, + "6613": { + "block": "_assert_valid_role_bool_false@8", + "stack_in": [], + "op": "intc_0 // 0", + "defined_out": [ + "or_result%0#0" + ], + "stack_out": [ + "or_result%0#0" + ] + }, + "6614": { + "op": "b _assert_valid_role_bool_merge@9" + } + } +} \ No newline at end of file diff --git a/smart_contracts/artifacts/d-asa/DASA.approval.teal b/smart_contracts/artifacts/d-asa/DASA.approval.teal new file mode 100644 index 00000000..dcb03181 --- /dev/null +++ b/smart_contracts/artifacts/d-asa/DASA.approval.teal @@ -0,0 +1,6720 @@ +#pragma version 12 +#pragma typetrack false + +// algopy.arc4.ARC4Contract.approval_program() -> uint64: +main: + intcblock 0 1 8 32 + bytecblock 0x151f7c75 "status" "event_cursor" "outstanding_principal" "schedule_entry_count" "fixed_point_scale" "accrued_interest" "interest_calculation_base" 0x52234163636f756e7423 "nominal_interest_rate" "reserved_units_total" "reserved_principal" "contract_type" "total_units" "next_principal_redemption" "reserved_interest" "cumulative_interest_index" "cumulative_principal_index" 0x5223417272616e67657223 "settlement_asset_id" "initial_exchange_amount" 0x5223417574686f7269747923 0x52235072696d6172794465616c657223 0x52234163636f756e744d616e6167657223 0x52234f6273657276657223 0x52234f704461656d6f6e23 "initial_exchange_date" "transfer_opening_date" "transfer_closure_date" "rate_reset_floor" "rate_reset_cap" 0x5323 0x52235472757374656523 "asset_suspended" "dynamic_principal_redemption" "rate_reset_spread" "rate_reset_multiplier" "rate_reset_next" "has_rate_reset_floor" "has_rate_reset_cap" 0x00 "asset_defaulted" "prospectus_hash" "prospectus_url" "denomination_asset_id" "maturity_date" "day_count_convention" 0x068101 + txn ApplicationID + bnz main_after_if_else@2 + // modules/rbac.py:28-29 + // # RBAC Roles + // self.arranger = GlobalState(Account(), key=cst.PREFIX_ID_ARRANGER) + bytec 18 // 0x5223417272616e67657223 + global ZeroAddress + app_global_put + // modules/rbac.py:30 + // self.op_daemon = GlobalState(Account(), key=cst.PREFIX_ID_OP_DAEMON) + bytec 25 // 0x52234f704461656d6f6e23 + global ZeroAddress + app_global_put + // modules/rbac.py:47-48 + // # D-ASA Governance + // self.asset_suspended = False + bytec 33 // "asset_suspended" + intc_0 // 0 + app_global_put + // modules/rbac.py:49 + // self.asset_defaulted = False + bytec 41 // "asset_defaulted" + intc_0 // 0 + app_global_put + // modules/kernel.py:56-57 + // # Contract + // self.status = UInt64(enums.STATUS_INACTIVE) + bytec_1 // "status" + intc_0 // 0 + app_global_put + // modules/kernel.py:58 + // self.contract_type = UInt64() + bytec 12 // "contract_type" + intc_0 // 0 + app_global_put + // modules/kernel.py:60-61 + // # Prospectus (Informational) + // self.prospectus_hash = Bytes() + bytec 42 // "prospectus_hash" + pushbytes 0x + app_global_put + // modules/kernel.py:62 + // self.prospectus_url = String() + bytec 43 // "prospectus_url" + pushbytes "" + app_global_put + // modules/kernel.py:64-65 + // # Denomination + // self.denomination_asset_id = Asset() + bytec 44 // "denomination_asset_id" + intc_0 // 0 + app_global_put + // modules/kernel.py:66 + // self.settlement_asset_id = Asset() + bytec 19 // "settlement_asset_id" + intc_0 // 0 + app_global_put + // modules/kernel.py:68-69 + // # Time + // self.initial_exchange_date = typ.TimeStamp() + bytec 26 // "initial_exchange_date" + intc_0 // 0 + app_global_put + // modules/kernel.py:70 + // self.maturity_date = typ.TimeStamp() + bytec 45 // "maturity_date" + intc_0 // 0 + app_global_put + // modules/kernel.py:71 + // self.transfer_opening_date = typ.TimeStamp() + bytec 27 // "transfer_opening_date" + intc_0 // 0 + app_global_put + // modules/kernel.py:72 + // self.transfer_closure_date = typ.TimeStamp() + bytec 28 // "transfer_closure_date" + intc_0 // 0 + app_global_put + // modules/kernel.py:74-75 + // # Day Count Convention + // self.day_count_convention = UInt64() + bytec 46 // "day_count_convention" + intc_0 // 0 + app_global_put + // modules/kernel.py:77-78 + // # Units + // self.total_units = UInt64() + bytec 13 // "total_units" + intc_0 // 0 + app_global_put + // modules/kernel.py:79 + // self.reserved_units_total = UInt64() + bytec 10 // "reserved_units_total" + intc_0 // 0 + app_global_put + // modules/kernel.py:81-82 + // # Principal + // self.initial_exchange_amount = UInt64() + bytec 20 // "initial_exchange_amount" + intc_0 // 0 + app_global_put + // modules/kernel.py:83 + // self.outstanding_principal = UInt64() + bytec_3 // "outstanding_principal" + intc_0 // 0 + app_global_put + // modules/kernel.py:84 + // self.next_principal_redemption = UInt64() + bytec 14 // "next_principal_redemption" + intc_0 // 0 + app_global_put + // modules/kernel.py:85 + // self.dynamic_principal_redemption = False + bytec 34 // "dynamic_principal_redemption" + intc_0 // 0 + app_global_put + // modules/kernel.py:87-88 + // # Interest + // self.interest_calculation_base = UInt64() + bytec 7 // "interest_calculation_base" + intc_0 // 0 + app_global_put + // modules/kernel.py:89 + // self.accrued_interest = UInt64() + bytec 6 // "accrued_interest" + intc_0 // 0 + app_global_put + // modules/kernel.py:91-92 + // # Interest Rates + // self.nominal_interest_rate = UInt64() + bytec 9 // "nominal_interest_rate" + intc_0 // 0 + app_global_put + // modules/kernel.py:93 + // self.rate_reset_spread = UInt64() + bytec 35 // "rate_reset_spread" + intc_0 // 0 + app_global_put + // modules/kernel.py:94 + // self.rate_reset_multiplier = UInt64() + bytec 36 // "rate_reset_multiplier" + intc_0 // 0 + app_global_put + // modules/kernel.py:95 + // self.rate_reset_floor = UInt64() + bytec 29 // "rate_reset_floor" + intc_0 // 0 + app_global_put + // modules/kernel.py:96 + // self.rate_reset_cap = UInt64() + bytec 30 // "rate_reset_cap" + intc_0 // 0 + app_global_put + // modules/kernel.py:97 + // self.rate_reset_next = UInt64() + bytec 37 // "rate_reset_next" + intc_0 // 0 + app_global_put + // modules/kernel.py:98 + // self.has_rate_reset_floor = False + bytec 38 // "has_rate_reset_floor" + intc_0 // 0 + app_global_put + // modules/kernel.py:99 + // self.has_rate_reset_cap = False + bytec 39 // "has_rate_reset_cap" + intc_0 // 0 + app_global_put + // modules/kernel.py:101-102 + // # Primary Distribution + // self.reserved_principal = UInt64() + bytec 11 // "reserved_principal" + intc_0 // 0 + app_global_put + // modules/kernel.py:103 + // self.reserved_interest = UInt64() + bytec 15 // "reserved_interest" + intc_0 // 0 + app_global_put + // modules/kernel.py:105-106 + // # Cumulative Per-Unit Fixed-Point Indexes + // self.cumulative_interest_index = UInt64() + bytec 16 // "cumulative_interest_index" + intc_0 // 0 + app_global_put + // modules/kernel.py:107 + // self.cumulative_principal_index = UInt64() + bytec 17 // "cumulative_principal_index" + intc_0 // 0 + app_global_put + // modules/kernel.py:115 + // self.event_cursor = UInt64() + bytec_2 // "event_cursor" + intc_0 // 0 + app_global_put + // modules/kernel.py:116 + // self.schedule_entry_count = UInt64() + bytec 4 // "schedule_entry_count" + intc_0 // 0 + app_global_put + // modules/kernel.py:118-119 + // # Scaling + // self.fixed_point_scale = UInt64() + bytec 5 // "fixed_point_scale" + intc_0 // 0 + app_global_put + // smart_contracts/d-asa/contract.py:23 + // assert Txn.global_num_byte_slice == cfg.GLOBAL_BYTES, err.WRONG_GLOBAL_BYTES + txn GlobalNumByteSlice + pushint 4 + == + assert // Wrong Global Bytes allocation + // smart_contracts/d-asa/contract.py:24 + // assert Txn.global_num_uint == cfg.GLOBAL_UINTS, err.WRONG_GLOBAL_UINTS + txn GlobalNumUint + pushint 37 + == + assert // Wrong Global UInts allocation + // smart_contracts/d-asa/contract.py:25 + // assert Txn.local_num_byte_slice == cfg.LOCAL_BYTES, err.WRONG_LOCAL_BYTES + txn LocalNumByteSlice + ! + assert // Wrong Local Bytes allocation + // smart_contracts/d-asa/contract.py:26 + // assert Txn.local_num_uint == cfg.LOCAL_UINTS, err.WRONG_LOCAL_UINTS + txn LocalNumUint + ! + assert // Wrong Local UInts allocation + +main_after_if_else@2: + // smart_contracts/d-asa/contract.py:8-18 + // class DASA( + // PaymentAgent, + // TransferAgent, + // state_totals=StateTotals( + // global_bytes=cfg.GLOBAL_BYTES, + // global_uints=cfg.GLOBAL_UINTS, + // local_bytes=cfg.LOCAL_BYTES, + // local_uints=cfg.LOCAL_UINTS, + // ), + // avm_version=12, + // ): + pushbytes 0x914f04eb // method "contract_update()void" + txna ApplicationArgs 0 + match main_contract_update_route@4 + +main_switch_case_next@5: + // smart_contracts/d-asa/contract.py:8-18 + // class DASA( + // PaymentAgent, + // TransferAgent, + // state_totals=StateTotals( + // global_bytes=cfg.GLOBAL_BYTES, + // global_uints=cfg.GLOBAL_UINTS, + // local_bytes=cfg.LOCAL_BYTES, + // local_uints=cfg.LOCAL_UINTS, + // ), + // avm_version=12, + // ): + txn OnCompletion + ! + assert + txn ApplicationID + bz main_create_NoOp@31 + pushbytess 0xb44618c8 0xe7832529 0x7ea20e0b 0x6c85e3ee 0xbdd1a944 0xdc063b35 0x14fc10ef 0x74a7297f 0x09d4fe14 0x9a9bfa85 0x85eed33d 0x9185104a 0xd9f225ac 0x6e0e5c95 0xff3fd4b3 0x82f71b2d 0xef04f5d3 0xdf343550 0x3dbe80bd 0xdf54e82c 0x010c8299 0x7406acd2 0x1a72a2ee // method "fund_due_cashflows(uint64)(uint64,uint64,uint64,uint64,uint64)", method "claim_due_cashflows(address,byte[])(uint64,uint64,uint64,uint64,byte[])", method "set_transfer_schedule(uint64,uint64)uint64", method "primary_distribution(address,uint64)uint64", method "transfer(address,address,uint64)uint64", method "account_gov_suspension(address,bool)uint64", method "account_open(address,address)uint64", method "account_update_payment_address(address,address)uint64", method "account_get_position(address)(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64)", method "contract_config((uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64),(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64),(byte[32],string))uint64", method "contract_schedule(uint64,bool,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[])uint64", method "execute_ied()uint64", method "apply_non_cash_event(uint64,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64", method "get_contract_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", method "get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", method "rbac_rotate_arranger(address)uint64", method "rbac_set_op_daemon(address)uint64", method "rbac_assign_role(uint8,address,(uint64,uint64))uint64", method "rbac_revoke_role(uint8,address)uint64", method "rbac_gov_asset_suspension(bool)uint64", method "rbac_get_arranger()address", method "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", method "rbac_get_role_validity(uint8,address)(uint64,uint64)" + txna ApplicationArgs 0 + match fund_due_cashflows claim_due_cashflows set_transfer_schedule primary_distribution transfer account_gov_suspension account_open account_update_payment_address account_get_position contract_config contract_schedule execute_ied apply_non_cash_event get_contract_state get_next_due_event rbac_rotate_arranger rbac_set_op_daemon rbac_assign_role rbac_revoke_role rbac_gov_asset_suspension rbac_get_arranger rbac_get_address_roles rbac_get_role_validity + err + +main_create_NoOp@31: + // smart_contracts/d-asa/contract.py:8-18 + // class DASA( + // PaymentAgent, + // TransferAgent, + // state_totals=StateTotals( + // global_bytes=cfg.GLOBAL_BYTES, + // global_uints=cfg.GLOBAL_UINTS, + // local_bytes=cfg.LOCAL_BYTES, + // local_uints=cfg.LOCAL_UINTS, + // ), + // avm_version=12, + // ): + pushbytes 0x956d7156 // method "contract_create(address)uint64" + txna ApplicationArgs 0 + match contract_create + err + +main_contract_update_route@4: + // modules/rbac.py:148 + // @arc4.abimethod(allow_actions=["UpdateApplication"]) + txn OnCompletion + pushint 4 // UpdateApplication + == + txn ApplicationID + && + assert + b contract_update + + +// modules.payment_agent.PaymentAgent.fund_due_cashflows[routing]() -> void: +fund_due_cashflows: + intc_0 // 0 + pushbytes "" + dupn 10 + // modules/payment_agent.py:46 + // @arc4.abimethod + txna ApplicationArgs 1 + dup + len + intc_2 // 8 + == + assert // invalid number of bytes for arc4.uint64 + btoi + // modules/kernel.py:143 + // assert self.status != UInt64(enums.STATUS_INACTIVE), err.NOT_CONFIGURED + intc_0 // 0 + bytec_1 // "status" + app_global_get_ex + assert // check self.status exists + assert // D-ASA not configured + // modules/payment_agent.py:50 + // self._assert_caller_is_arranger() + callsub _assert_caller_is_arranger + // modules/payment_agent.py:51 + // self._assert_is_not_asset_defaulted() + callsub _assert_is_not_asset_defaulted + // modules/payment_agent.py:52 + // self._assert_is_not_asset_suspended() + callsub _assert_is_not_asset_suspended + // modules/kernel.py:135 + // return self.status == UInt64(enums.STATUS_PENDING_IED) + intc_0 // 0 + bytec_1 // "status" + app_global_get_ex + assert // check self.status exists + pushint 50 + == + // modules/kernel.py:147 + // assert not self._status_is_pending_ied(), err.PENDING_IED + ! + assert // IED not yet executed + // modules/payment_agent.py:55 + // processed_events = UInt64(0) + intc_0 // 0 + // modules/payment_agent.py:56-57 + // funded_interest = UInt64(0) + // funded_principal = UInt64(0) + dupn 2 + +fund_due_cashflows_while_top@2: + // modules/payment_agent.py:60 + // processed_events < max_event_count + dig 2 + dig 4 + < + // modules/payment_agent.py:60-61 + // processed_events < max_event_count + // and self.event_cursor < self.schedule_entry_count + bz fund_due_cashflows_after_while@9 + // modules/payment_agent.py:61 + // and self.event_cursor < self.schedule_entry_count + intc_0 // 0 + bytec_2 // "event_cursor" + app_global_get_ex + assert // check self.event_cursor exists + intc_0 // 0 + bytec 4 // "schedule_entry_count" + app_global_get_ex + assert // check self.schedule_entry_count exists + < + // modules/payment_agent.py:60-61 + // processed_events < max_event_count + // and self.event_cursor < self.schedule_entry_count + bz fund_due_cashflows_after_while@9 + // modules/payment_agent.py:63 + // entry = self._get_schedule_entry(self.event_cursor) + intc_0 // 0 + bytec_2 // "event_cursor" + app_global_get_ex + assert // check self.event_cursor exists + callsub _get_schedule_entry + dup + bury 17 + // modules/payment_agent.py:64 + // if entry.scheduled_time > Global.latest_timestamp: + pushint 9 + extract_uint64 + dup + bury 6 + global LatestTimestamp + > + bnz fund_due_cashflows_after_while@9 + // modules/payment_agent.py:66 + // if not self._event_is_cash(entry.event_type.as_uint64()): + dig 15 + intc_2 // 8 + getbyte + dup + bury 16 + // modules/kernel.py:351 + // UInt64(enums.EVT_IP), + intc_2 // 8 + // modules/kernel.py:350-354 + // return event_type in ( + // UInt64(enums.EVT_IP), + // UInt64(enums.EVT_PR), + // UInt64(enums.EVT_MD), + // ) + == + dup + bury 7 + bnz fund_due_cashflows_bool_true@50 + dig 14 + // modules/kernel.py:352 + // UInt64(enums.EVT_PR), + pushint 3 + // modules/kernel.py:350-354 + // return event_type in ( + // UInt64(enums.EVT_IP), + // UInt64(enums.EVT_PR), + // UInt64(enums.EVT_MD), + // ) + == + bnz fund_due_cashflows_bool_true@50 + dig 14 + // modules/kernel.py:353 + // UInt64(enums.EVT_MD), + pushint 19 + // modules/kernel.py:350-354 + // return event_type in ( + // UInt64(enums.EVT_IP), + // UInt64(enums.EVT_PR), + // UInt64(enums.EVT_MD), + // ) + == + bz fund_due_cashflows_bool_false@51 + +fund_due_cashflows_bool_true@50: + intc_1 // 1 + +fund_due_cashflows_bool_merge@52: + // modules/payment_agent.py:66 + // if not self._event_is_cash(entry.event_type.as_uint64()): + bz fund_due_cashflows_after_while@9 + // modules/kernel.py:548 + // assert entry.event_id == self.event_cursor, err.INVALID_EVENT_CURSOR + dig 15 + intc_0 // 0 + extract_uint64 + intc_0 // 0 + bytec_2 // "event_cursor" + app_global_get_ex + assert // check self.event_cursor exists + == + assert // Invalid event cursor + // modules/kernel.py:549 + // assert entry.scheduled_time <= Global.latest_timestamp, err.NO_DUE_CASHFLOW + dig 4 + global LatestTimestamp + <= + assert // No due cashflow to pay + // modules/kernel.py:413 + // if event_type not in (UInt64(enums.EVT_IP), UInt64(enums.EVT_MD)): + dig 5 + bnz fund_due_cashflows_after_if_else@13 + dig 14 + pushint 19 + == + bnz fund_due_cashflows_after_if_else@13 + // modules/kernel.py:414 + // return UInt64(0) + intc_0 // 0 + bury 13 + +fund_due_cashflows_after_inlined_modules.kernel.ActusKernelModule._entry_interest_amount@14: + // modules/kernel.py:426 + // event_type = entry.event_type.as_uint64() + dig 15 + intc_2 // 8 + getbyte + dup + bury 16 + // modules/kernel.py:427 + // if event_type not in (UInt64(enums.EVT_PR), UInt64(enums.EVT_MD)): + pushint 3 + == + bnz fund_due_cashflows_after_if_else@17 + dig 14 + pushint 19 + == + bnz fund_due_cashflows_after_if_else@17 + // modules/kernel.py:428 + // return UInt64(0) + intc_0 // 0 + bury 8 + +fund_due_cashflows_after_inlined_modules.kernel.ActusKernelModule._entry_principal_amount@26: + // modules/kernel.py:553 + // next_outstanding_principal = entry.next_outstanding_principal + dig 15 + pushint 49 + extract_uint64 + bury 10 + // modules/kernel.py:556 + // if self._is_dynamic_annuity(): + callsub _is_dynamic_annuity + bnz fund_due_cashflows_if_body@27 + dig 9 + bury 11 + +fund_due_cashflows_after_if_else@36: + // modules/kernel.py:572-574 + // # Funding uses per-unit cumulative indices so each holder can settle + // # independently from its current unit balance. + // interest_index_delta = self._amount_to_index_delta(interest_amount_due) + dig 12 + callsub _amount_to_index_delta + // modules/kernel.py:575 + // principal_index_delta = self._amount_to_index_delta(principal_amount_due) + dig 8 + callsub _amount_to_index_delta + // modules/kernel.py:576 + // interest_amount = self._index_delta_to_amount(interest_index_delta) + dig 1 + callsub _index_delta_to_amount + dup + cover 2 + bury 17 + // modules/kernel.py:577 + // principal_amount = self._index_delta_to_amount(principal_index_delta) + dup + callsub _index_delta_to_amount + dup + bury 13 + // modules/kernel.py:578 + // required_amount = interest_amount + principal_amount + dig 2 + dig 1 + + + dup + bury 12 + // modules/kernel.py:727 + // balance = self.settlement_asset_id.balance(Global.current_application_address) + global CurrentApplicationAddress + intc_0 // 0 + bytec 19 // "settlement_asset_id" + app_global_get_ex + assert // check self.settlement_asset_id exists + asset_holding_get AssetBalance + assert // account opted into asset + // modules/kernel.py:456 + // return self.reserved_interest + self.reserved_principal + intc_0 // 0 + bytec 15 // "reserved_interest" + app_global_get_ex + assert // check self.reserved_interest exists + intc_0 // 0 + bytec 11 // "reserved_principal" + app_global_get_ex + assert // check self.reserved_principal exists + dig 1 + + + // modules/kernel.py:729 + // assert balance >= reserved_total, err.NOT_ENOUGH_FUNDS + dig 2 + dig 1 + >= + assert // Not enough funds for the payment + // modules/kernel.py:730 + // return balance - reserved_total + uncover 2 + swap + - + // modules/kernel.py:580 + // self._available_settlement_funds() >= required_amount + uncover 2 + >= + // modules/kernel.py:579-581 + // assert ( + // self._available_settlement_funds() >= required_amount + // ), err.NOT_ENOUGH_FUNDS + assert // Not enough funds for the payment + // modules/kernel.py:583 + // self.reserved_interest += interest_amount + uncover 3 + + + bytec 15 // "reserved_interest" + swap + app_global_put + // modules/kernel.py:584 + // self.reserved_principal += principal_amount + intc_0 // 0 + bytec 11 // "reserved_principal" + app_global_get_ex + assert // check self.reserved_principal exists + + + bytec 11 // "reserved_principal" + swap + app_global_put + // modules/kernel.py:585 + // self.cumulative_interest_index += interest_index_delta + intc_0 // 0 + bytec 16 // "cumulative_interest_index" + app_global_get_ex + assert // check self.cumulative_interest_index exists + uncover 2 + + + bytec 16 // "cumulative_interest_index" + swap + app_global_put + // modules/kernel.py:586 + // self.cumulative_principal_index += principal_index_delta + intc_0 // 0 + bytec 17 // "cumulative_principal_index" + app_global_get_ex + assert // check self.cumulative_principal_index exists + + + bytec 17 // "cumulative_principal_index" + swap + app_global_put + // modules/kernel.py:587 + // if entry.event_type.as_uint64() == UInt64(enums.EVT_PR): + dig 15 + intc_2 // 8 + getbyte + pushint 3 + == + bz fund_due_cashflows_else_body@38 + // modules/kernel.py:588-589 + // # For PR, the period interest stays accrued until a later IP or MD. + // self.accrued_interest += self._entry_interest_segment(entry) + intc_0 // 0 + bytec 6 // "accrued_interest" + app_global_get_ex + assert // check self.accrued_interest exists + dig 16 + callsub _entry_interest_segment + bury 18 + + + bytec 6 // "accrued_interest" + swap + app_global_put + +fund_due_cashflows_after_if_else@39: + // modules/kernel.py:592 + // if not self._is_dynamic_annuity() or entry.event_type.as_uint64() == UInt64( + callsub _is_dynamic_annuity + bz fund_due_cashflows_if_body@41 + dig 15 + intc_2 // 8 + getbyte + // modules/kernel.py:592-594 + // if not self._is_dynamic_annuity() or entry.event_type.as_uint64() == UInt64( + // enums.EVT_MD + // ): + pushint 19 + == + bz fund_due_cashflows_after_if_else@42 + +fund_due_cashflows_if_body@41: + // modules/kernel.py:595 + // self.next_principal_redemption = entry.next_principal_redemption + dig 15 + pushint 41 + extract_uint64 + bytec 14 // "next_principal_redemption" + swap + app_global_put + +fund_due_cashflows_after_if_else@42: + // modules/kernel.py:596 + // self.outstanding_principal = next_outstanding_principal + bytec_3 // "outstanding_principal" + dig 10 + app_global_put + // modules/kernel.py:597 + // self.interest_calculation_base = next_interest_base + bytec 7 // "interest_calculation_base" + dig 11 + app_global_put + // modules/kernel.py:598 + // self.event_cursor += UInt64(1) + intc_0 // 0 + bytec_2 // "event_cursor" + app_global_get_ex + assert // check self.event_cursor exists + intc_1 // 1 + + + bytec_2 // "event_cursor" + swap + app_global_put + // modules/kernel.py:600 + // if entry.event_type == arc4.UInt8( + dig 15 + extract 8 1 + // modules/kernel.py:600-602 + // if entry.event_type == arc4.UInt8( + // enums.EVT_MD + // ) and self.outstanding_principal == UInt64(0): + pushbytes 0x13 + b== + bz fund_due_cashflows_after_if_else@45 + // modules/kernel.py:602 + // ) and self.outstanding_principal == UInt64(0): + intc_0 // 0 + bytec_3 // "outstanding_principal" + app_global_get_ex + assert // check self.outstanding_principal exists + // modules/kernel.py:600-602 + // if entry.event_type == arc4.UInt8( + // enums.EVT_MD + // ) and self.outstanding_principal == UInt64(0): + bnz fund_due_cashflows_after_if_else@45 + // modules/kernel.py:603 + // self.status = UInt64(enums.STATUS_ENDED) + bytec_1 // "status" + pushint 200 + app_global_put + // modules/kernel.py:604 + // self.interest_calculation_base = UInt64(0) + bytec 7 // "interest_calculation_base" + intc_0 // 0 + app_global_put + +fund_due_cashflows_after_if_else@45: + // modules/kernel.py:606-610 + // self._emit_execution_event( + // entry=entry, + // payoff=interest_amount + principal_amount, + // settled_amount=interest_amount + principal_amount, + // ) + dig 15 + dig 7 + dup + callsub _emit_execution_event + pop + // modules/payment_agent.py:70 + // funded_interest += interest_amount + dig 1 + dig 14 + + + bury 2 + // modules/payment_agent.py:71 + // funded_principal += principal_amount + dup + dig 9 + + + bury 1 + // modules/payment_agent.py:72 + // processed_events += UInt64(1) + dig 2 + intc_1 // 1 + + + bury 3 + b fund_due_cashflows_while_top@2 + +fund_due_cashflows_else_body@38: + // modules/kernel.py:591 + // self.accrued_interest = UInt64(0) + bytec 6 // "accrued_interest" + intc_0 // 0 + app_global_put + b fund_due_cashflows_after_if_else@39 + +fund_due_cashflows_if_body@27: + // modules/kernel.py:557 + // event_type = entry.event_type.as_uint64() + dig 15 + intc_2 // 8 + getbyte + dup + bury 16 + // modules/kernel.py:558-560 + // # Dynamic annuities derive next state from the payment decomposition, + // # not only from the precomputed `next_*` fields. + // if event_type == UInt64(enums.EVT_PR): + pushint 3 + == + bz fund_due_cashflows_else_body@29 + // modules/kernel.py:562 + // self.outstanding_principal - principal_amount_due + intc_0 // 0 + bytec_3 // "outstanding_principal" + app_global_get_ex + assert // check self.outstanding_principal exists + dig 8 + - + dup + bury 11 + bury 11 + b fund_due_cashflows_after_if_else@36 + +fund_due_cashflows_else_body@29: + // modules/kernel.py:565 + // elif event_type == UInt64(enums.EVT_IP): + dig 14 + intc_2 // 8 + == + bz fund_due_cashflows_else_body@31 + // modules/kernel.py:566 + // next_outstanding_principal = self.outstanding_principal + intc_0 // 0 + bytec_3 // "outstanding_principal" + app_global_get_ex + swap + bury 11 + assert // check self.outstanding_principal exists + // modules/kernel.py:567 + // next_interest_base = self.interest_calculation_base + intc_0 // 0 + bytec 7 // "interest_calculation_base" + app_global_get_ex + swap + bury 12 + assert // check self.interest_calculation_base exists + b fund_due_cashflows_after_if_else@36 + +fund_due_cashflows_else_body@31: + // modules/kernel.py:568 + // elif event_type == UInt64(enums.EVT_MD): + dig 14 + pushint 19 + == + bnz fund_due_cashflows_if_body@32 + dig 9 + bury 11 + b fund_due_cashflows_after_if_else@36 + +fund_due_cashflows_if_body@32: + // modules/kernel.py:569 + // next_outstanding_principal = UInt64(0) + intc_0 // 0 + bury 10 + // modules/kernel.py:570 + // next_interest_base = UInt64(0) + intc_0 // 0 + bury 11 + b fund_due_cashflows_after_if_else@36 + +fund_due_cashflows_after_if_else@17: + // modules/kernel.py:429 + // if self._is_dynamic_annuity(): + callsub _is_dynamic_annuity + bz fund_due_cashflows_after_if_else@25 + // modules/kernel.py:430 + // if event_type == UInt64(enums.EVT_MD): + dig 14 + pushint 19 + == + bz fund_due_cashflows_after_if_else@20 + // modules/kernel.py:431 + // return self.outstanding_principal + intc_0 // 0 + bytec_3 // "outstanding_principal" + app_global_get_ex + assert // check self.outstanding_principal exists + bury 8 + // modules/kernel.py:552 + // principal_amount_due = self._entry_principal_amount(entry) + b fund_due_cashflows_after_inlined_modules.kernel.ActusKernelModule._entry_principal_amount@26 + +fund_due_cashflows_after_if_else@20: + // modules/kernel.py:432 + // interest_due = self.accrued_interest + self._entry_interest_segment(entry) + intc_0 // 0 + bytec 6 // "accrued_interest" + app_global_get_ex + assert // check self.accrued_interest exists + dig 16 + callsub _entry_interest_segment + bury 18 + + + dup + bury 13 + // modules/kernel.py:433 + // if self.next_principal_redemption <= interest_due: + intc_0 // 0 + bytec 14 // "next_principal_redemption" + app_global_get_ex + assert // check self.next_principal_redemption exists + >= + bz fund_due_cashflows_after_if_else@22 + // modules/kernel.py:434 + // return UInt64(0) + intc_0 // 0 + bury 8 + // modules/kernel.py:552 + // principal_amount_due = self._entry_principal_amount(entry) + b fund_due_cashflows_after_inlined_modules.kernel.ActusKernelModule._entry_principal_amount@26 + +fund_due_cashflows_after_if_else@22: + // modules/kernel.py:435 + // principal_amount = self.next_principal_redemption - interest_due + intc_0 // 0 + bytec 14 // "next_principal_redemption" + app_global_get_ex + assert // check self.next_principal_redemption exists + dig 12 + - + dup + bury 10 + // modules/kernel.py:436 + // if principal_amount > self.outstanding_principal: + intc_0 // 0 + bytec_3 // "outstanding_principal" + app_global_get_ex + assert // check self.outstanding_principal exists + > + bz fund_due_cashflows_after_if_else@24 + // modules/kernel.py:437 + // return self.outstanding_principal + intc_0 // 0 + bytec_3 // "outstanding_principal" + app_global_get_ex + assert // check self.outstanding_principal exists + bury 8 + // modules/kernel.py:552 + // principal_amount_due = self._entry_principal_amount(entry) + b fund_due_cashflows_after_inlined_modules.kernel.ActusKernelModule._entry_principal_amount@26 + +fund_due_cashflows_after_if_else@24: + dig 8 + bury 8 + // modules/kernel.py:552 + // principal_amount_due = self._entry_principal_amount(entry) + b fund_due_cashflows_after_inlined_modules.kernel.ActusKernelModule._entry_principal_amount@26 + +fund_due_cashflows_after_if_else@25: + // modules/kernel.py:440 + // entry.next_outstanding_principal <= self.outstanding_principal + dig 15 + pushint 49 + extract_uint64 + intc_0 // 0 + bytec_3 // "outstanding_principal" + app_global_get_ex + assert // check self.outstanding_principal exists + dup2 + <= + // modules/kernel.py:439-441 + // assert ( + // entry.next_outstanding_principal <= self.outstanding_principal + // ), err.INVALID_ACTUS_CONFIG + assert // Invalid ACTUS configuration + // modules/kernel.py:442 + // return self.outstanding_principal - entry.next_outstanding_principal + swap + - + bury 8 + // modules/kernel.py:552 + // principal_amount_due = self._entry_principal_amount(entry) + b fund_due_cashflows_after_inlined_modules.kernel.ActusKernelModule._entry_principal_amount@26 + +fund_due_cashflows_after_if_else@13: + // modules/kernel.py:415 + // return self.accrued_interest + self._entry_interest_segment(entry) + intc_0 // 0 + bytec 6 // "accrued_interest" + app_global_get_ex + assert // check self.accrued_interest exists + dig 16 + callsub _entry_interest_segment + bury 18 + + + bury 13 + // modules/kernel.py:551 + // interest_amount_due = self._entry_interest_amount(entry) + b fund_due_cashflows_after_inlined_modules.kernel.ActusKernelModule._entry_interest_amount@14 + +fund_due_cashflows_after_while@9: + // modules/payment_agent.py:74 + // assert processed_events > UInt64(0), err.NO_DUE_CASHFLOW + dig 2 + dup + assert // No due cashflow to pay + // modules/payment_agent.py:78 + // total_funded=funded_interest + funded_principal, + dig 2 + dup + dig 3 + dup + cover 3 + + + // modules/payment_agent.py:80 + // timestamp=Global.latest_timestamp, + global LatestTimestamp + // modules/payment_agent.py:75-81 + // return typ.CashFundingResult( + // funded_interest=funded_interest, + // funded_principal=funded_principal, + // total_funded=funded_interest + funded_principal, + // processed_events=processed_events, + // timestamp=Global.latest_timestamp, + // ) + uncover 2 + itob + uncover 3 + itob + concat + uncover 2 + itob + concat + uncover 2 + itob + concat + swap + itob + concat + // modules/payment_agent.py:46 + // @arc4.abimethod + bytec_0 // 0x151f7c75 + swap + concat + log + intc_1 // 1 + return + +fund_due_cashflows_bool_false@51: + intc_0 // 0 + b fund_due_cashflows_bool_merge@52 + + +// modules.payment_agent.PaymentAgent.claim_due_cashflows[routing]() -> void: +claim_due_cashflows: + pushbytes "" + dupn 2 + // modules/payment_agent.py:83 + // @arc4.abimethod + txna ApplicationArgs 1 + dupn 2 + len + intc_3 // 32 + == + assert // invalid number of bytes for arc4.static_array + txna ApplicationArgs 2 + dup + intc_0 // 0 + extract_uint16 // on error: invalid array length header + pushint 2 + + + dig 1 + len + == + assert // invalid number of bytes for arc4.dynamic_array + extract 2 0 + swap + // modules/kernel.py:143 + // assert self.status != UInt64(enums.STATUS_INACTIVE), err.NOT_CONFIGURED + intc_0 // 0 + bytec_1 // "status" + app_global_get_ex + assert // check self.status exists + assert // D-ASA not configured + // modules/accounting.py:24 + // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS + bytec 8 // 0x52234163636f756e7423 + swap + concat + dup + box_len + bury 1 + assert // Invalid account holding address + // modules/payment_agent.py:14 + // if self.op_daemon.value != Global.zero_address: + intc_0 // 0 + bytec 25 // 0x52234f704461656d6f6e23 + app_global_get_ex + assert // check self.op_daemon exists + global ZeroAddress + != + bz claim_due_cashflows_after_if_else@17 + // modules/payment_agent.py:16 + // Txn.sender == self.op_daemon.value + txn Sender + intc_0 // 0 + bytec 25 // 0x52234f704461656d6f6e23 + app_global_get_ex + assert // check self.op_daemon exists + == + // modules/payment_agent.py:16-18 + // Txn.sender == self.op_daemon.value + // or Txn.sender == holding_address + // or Txn.sender == self.account[holding_address].payment_address + bnz claim_due_cashflows_bool_true@14 + // modules/payment_agent.py:17 + // or Txn.sender == holding_address + txn Sender + dig 3 + == + // modules/payment_agent.py:16-18 + // Txn.sender == self.op_daemon.value + // or Txn.sender == holding_address + // or Txn.sender == self.account[holding_address].payment_address + bnz claim_due_cashflows_bool_true@14 + // modules/payment_agent.py:18 + // or Txn.sender == self.account[holding_address].payment_address + txn Sender + dig 1 + box_get + assert // check self.account entry exists + extract 0 32 + == + // modules/payment_agent.py:16-18 + // Txn.sender == self.op_daemon.value + // or Txn.sender == holding_address + // or Txn.sender == self.account[holding_address].payment_address + bz claim_due_cashflows_bool_false@15 + +claim_due_cashflows_bool_true@14: + intc_1 // 1 + +claim_due_cashflows_bool_merge@16: + // modules/payment_agent.py:15-19 + // assert ( + // Txn.sender == self.op_daemon.value + // or Txn.sender == holding_address + // or Txn.sender == self.account[holding_address].payment_address + // ), err.UNAUTHORIZED + assert // Not authorized + +claim_due_cashflows_after_if_else@17: + // modules/payment_agent.py:94 + // self._assert_is_not_asset_defaulted() + callsub _assert_is_not_asset_defaulted + // modules/payment_agent.py:95 + // self._assert_is_not_asset_suspended() + callsub _assert_is_not_asset_suspended + // modules/kernel.py:135 + // return self.status == UInt64(enums.STATUS_PENDING_IED) + intc_0 // 0 + bytec_1 // "status" + app_global_get_ex + assert // check self.status exists + pushint 50 + == + // modules/kernel.py:147 + // assert not self._status_is_pending_ied(), err.PENDING_IED + ! + assert // IED not yet executed + // modules/payment_agent.py:98 + // self._ensure_units_activated(holding_address) + dig 2 + dup + callsub _ensure_units_activated + // modules/payment_agent.py:99 + // self._settle_position(holding_address) + callsub _settle_position + popn 2 + // modules/accounting.py:117 + // self.account[holding_address].claimable_interest + dup + box_get + assert // check self.account entry exists + dup + pushint 73 + extract_uint64 + dup + cover 2 + bury 8 + // modules/accounting.py:118 + // + self.account[holding_address].claimable_principal + dup + pushint 81 + extract_uint64 + dup + bury 8 + // modules/accounting.py:117-118 + // self.account[holding_address].claimable_interest + // + self.account[holding_address].claimable_principal + uncover 2 + + + dup + bury 6 + // modules/payment_agent.py:101 + // assert total_amount > UInt64(0), err.NO_DUE_CASHFLOW + assert // No due cashflow to pay + // modules/payment_agent.py:24 + // self.account[holding_address].payment_address.is_opted_in( + extract 0 32 + // modules/payment_agent.py:25 + // self.settlement_asset_id + intc_0 // 0 + bytec 19 // "settlement_asset_id" + app_global_get_ex + assert // check self.settlement_asset_id exists + // modules/payment_agent.py:24-26 + // self.account[holding_address].payment_address.is_opted_in( + // self.settlement_asset_id + // ) + asset_holding_get AssetBalance + bury 1 + // modules/payment_agent.py:24-27 + // self.account[holding_address].payment_address.is_opted_in( + // self.settlement_asset_id + // ) + // and not self.account[holding_address].suspended + bz claim_due_cashflows_bool_false@24 + // modules/payment_agent.py:27 + // and not self.account[holding_address].suspended + dup + box_get + assert // check self.account entry exists + pushint 384 + getbit + bnz claim_due_cashflows_bool_false@24 + intc_1 // 1 + +claim_due_cashflows_bool_merge@25: + // modules/payment_agent.py:106 + // if self._is_payment_executable(holding_address): + bz claim_due_cashflows_after_if_else@3 + // modules/payment_agent.py:33 + // self.settlement_asset_id.balance(Global.current_application_address) + global CurrentApplicationAddress + intc_0 // 0 + bytec 19 // "settlement_asset_id" + app_global_get_ex + assert // check self.settlement_asset_id exists + swap + dig 1 + asset_holding_get AssetBalance + assert // account opted into asset + // modules/payment_agent.py:33-34 + // self.settlement_asset_id.balance(Global.current_application_address) + // >= payment_amount + dig 5 + dup + cover 2 + >= + // modules/payment_agent.py:32-35 + // assert ( + // self.settlement_asset_id.balance(Global.current_application_address) + // >= payment_amount + // ), err.NOT_ENOUGH_FUNDS + assert // Not enough funds for the payment + // modules/payment_agent.py:108 + // self._pay(self.account[holding_address].payment_address, total_amount) + dig 2 + dup + cover 3 + box_get + assert // check self.account entry exists + dup + extract 0 32 + // modules/payment_agent.py:39-44 + // itxn.AssetTransfer( + // xfer_asset=self.settlement_asset_id, + // asset_receiver=receiver, + // asset_amount=amount, + // fee=Global.min_txn_fee, + // ).submit() + itxn_begin + // modules/payment_agent.py:43 + // fee=Global.min_txn_fee, + global MinTxnFee + uncover 3 + itxn_field AssetAmount + swap + itxn_field AssetReceiver + uncover 2 + itxn_field XferAsset + // modules/payment_agent.py:39 + // itxn.AssetTransfer( + pushint 4 // axfer + itxn_field TypeEnum + itxn_field Fee + // modules/payment_agent.py:39-44 + // itxn.AssetTransfer( + // xfer_asset=self.settlement_asset_id, + // asset_receiver=receiver, + // asset_amount=amount, + // fee=Global.min_txn_fee, + // ).submit() + itxn_submit + // modules/accounting.py:125-126 + // # Get the claimable amounts before reset + // interest_amount = position.claimable_interest + dup + pushint 73 + extract_uint64 + dup + cover 2 + bury 9 + // modules/accounting.py:127 + // principal_amount = position.claimable_principal + dup + pushint 81 + extract_uint64 + dup + cover 3 + bury 9 + // modules/accounting.py:129-130 + // # Reset the position's claimable amounts + // position.claimable_interest = UInt64(0) + intc_0 // 0 + itob + swap + dig 1 + replace2 73 + // modules/accounting.py:131 + // position.claimable_principal = UInt64(0) + swap + replace2 81 + // modules/accounting.py:132 + // self.account[holding_address] = position.copy() + uncover 3 + swap + box_put + // modules/accounting.py:134 + // assert self.reserved_interest >= interest_amount, err.NOT_ENOUGH_FUNDS + intc_0 // 0 + bytec 15 // "reserved_interest" + app_global_get_ex + assert // check self.reserved_interest exists + dup + dig 2 + >= + assert // Not enough funds for the payment + // modules/accounting.py:135 + // assert self.reserved_principal >= principal_amount, err.NOT_ENOUGH_FUNDS + intc_0 // 0 + bytec 11 // "reserved_principal" + app_global_get_ex + assert // check self.reserved_principal exists + dig 3 + >= + assert // Not enough funds for the payment + // modules/accounting.py:137-138 + // # Update the global reserved interest and principal amounts + // self.reserved_interest -= interest_amount + swap + - + bytec 15 // "reserved_interest" + swap + app_global_put + // modules/accounting.py:139 + // self.reserved_principal -= principal_amount + intc_0 // 0 + bytec 11 // "reserved_principal" + app_global_get_ex + assert // check self.reserved_principal exists + swap + - + bytec 11 // "reserved_principal" + swap + app_global_put + +claim_due_cashflows_after_if_else@3: + // modules/payment_agent.py:114 + // total_amount=interest_amount + principal_amount, + dig 5 + dup + dig 6 + dup + cover 3 + + + // modules/payment_agent.py:115 + // timestamp=Global.latest_timestamp, + global LatestTimestamp + // modules/payment_agent.py:111-117 + // return typ.CashClaimResult( + // interest_amount=interest_amount, + // principal_amount=principal_amount, + // total_amount=interest_amount + principal_amount, + // timestamp=Global.latest_timestamp, + // context=payment_info, + // ) + uncover 2 + itob + uncover 3 + itob + concat + uncover 2 + itob + concat + swap + itob + concat + dig 2 + dup + len + itob + extract 6 2 + swap + concat + swap + pushbytes 0x0022 + concat + swap + concat + // modules/payment_agent.py:83 + // @arc4.abimethod + bytec_0 // 0x151f7c75 + swap + concat + log + intc_1 // 1 + return + +claim_due_cashflows_bool_false@24: + intc_0 // 0 + b claim_due_cashflows_bool_merge@25 + +claim_due_cashflows_bool_false@15: + intc_0 // 0 + b claim_due_cashflows_bool_merge@16 + + +// modules.transfer_agent.TransferAgent.set_transfer_schedule[routing]() -> void: +set_transfer_schedule: + // modules/transfer_agent.py:22 + // @arc4.abimethod + txna ApplicationArgs 1 + dup + len + intc_2 // 8 + == + assert // invalid number of bytes for arc4.uint64 + btoi + txna ApplicationArgs 2 + dup + len + intc_2 // 8 + == + assert // invalid number of bytes for arc4.uint64 + btoi + // modules/transfer_agent.py:24 + // self._assert_caller_is_arranger() + callsub _assert_caller_is_arranger + // modules/transfer_agent.py:25 + // assert open_date < closure_date, err.INVALID_SORTING + dup2 + < + assert // Time events must be sorted in strictly ascending order + // modules/transfer_agent.py:27 + // self.transfer_opening_date = open_date + bytec 27 // "transfer_opening_date" + uncover 2 + app_global_put + // modules/transfer_agent.py:28 + // self.transfer_closure_date = closure_date + bytec 28 // "transfer_closure_date" + swap + app_global_put + // modules/transfer_agent.py:29 + // return Global.latest_timestamp + global LatestTimestamp + // modules/transfer_agent.py:22 + // @arc4.abimethod + itob + bytec_0 // 0x151f7c75 + swap + concat + log + intc_1 // 1 + return + + +// modules.transfer_agent.TransferAgent.primary_distribution[routing]() -> void: +primary_distribution: + // modules/transfer_agent.py:31 + // @arc4.abimethod + txna ApplicationArgs 1 + dup + len + intc_3 // 32 + == + assert // invalid number of bytes for arc4.static_array + txna ApplicationArgs 2 + dup + len + intc_2 // 8 + == + assert // invalid number of bytes for arc4.uint64 + btoi + dup + cover 2 + // modules/kernel.py:143 + // assert self.status != UInt64(enums.STATUS_INACTIVE), err.NOT_CONFIGURED + intc_0 // 0 + bytec_1 // "status" + app_global_get_ex + assert // check self.status exists + assert // D-ASA not configured + // modules/rbac.py:71 + // assert self._role_is_active(self.primary_dealer, Txn.sender), err.UNAUTHORIZED + bytec 22 // 0x52235072696d6172794465616c657223 + txn Sender + callsub _role_is_active + assert // Not authorized + // modules/transfer_agent.py:41 + // self._assert_is_not_asset_defaulted() + callsub _assert_is_not_asset_defaulted + // modules/transfer_agent.py:42 + // self._assert_is_not_asset_suspended() + callsub _assert_is_not_asset_suspended + // modules/kernel.py:135 + // return self.status == UInt64(enums.STATUS_PENDING_IED) + intc_0 // 0 + bytec_1 // "status" + app_global_get_ex + assert // check self.status exists + pushint 50 + == + // modules/transfer_agent.py:43 + // assert self._status_is_pending_ied(), err.PRIMARY_DISTRIBUTION_CLOSED + assert // Primary distribution is closed + // modules/accounting.py:24 + // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS + bytec 8 // 0x52234163636f756e7423 + dig 2 + concat + dup + cover 3 + box_len + bury 1 + assert // Invalid account holding address + // modules/transfer_agent.py:45 + // self._assert_is_not_account_suspended(holding_address) + swap + callsub _assert_is_not_account_suspended + // modules/transfer_agent.py:46 + // assert units > UInt64(0), err.ZERO_UNITS + dup + assert // Can not distribute zero units + // modules/transfer_agent.py:48 + // self.reserved_units_total + units <= self.total_units + intc_0 // 0 + bytec 10 // "reserved_units_total" + app_global_get_ex + assert // check self.reserved_units_total exists + + + intc_0 // 0 + bytec 13 // "total_units" + app_global_get_ex + assert // check self.total_units exists + <= + // modules/transfer_agent.py:47-49 + // assert ( + // self.reserved_units_total + units <= self.total_units + // ), err.OVER_DISTRIBUTION + assert // Insufficient remaining D-ASA units + // modules/transfer_agent.py:50 + // if self.initial_exchange_date: + intc_0 // 0 + bytec 26 // "initial_exchange_date" + app_global_get_ex + assert // check self.initial_exchange_date exists + bz primary_distribution_after_if_else@3 + // modules/transfer_agent.py:52 + // Global.latest_timestamp <= self.initial_exchange_date + global LatestTimestamp + intc_0 // 0 + bytec 26 // "initial_exchange_date" + app_global_get_ex + assert // check self.initial_exchange_date exists + <= + // modules/transfer_agent.py:51-53 + // assert ( + // Global.latest_timestamp <= self.initial_exchange_date + // ), err.PRIMARY_DISTRIBUTION_CLOSED + assert // Primary distribution is closed + +primary_distribution_after_if_else@3: + // modules/accounting.py:148 + // self.account[holding_address].reserved_units += units + dupn 2 + box_get + assert // check self.account entry exists + pushint 40 + extract_uint64 + dig 3 + dup + cover 3 + + + itob + pushint 40 + swap + box_replace + // modules/transfer_agent.py:56 + // self.reserved_units_total += units + intc_0 // 0 + bytec 10 // "reserved_units_total" + app_global_get_ex + assert // check self.reserved_units_total exists + + + bytec 10 // "reserved_units_total" + dig 1 + app_global_put + // modules/transfer_agent.py:57 + // return self.total_units - self.reserved_units_total + intc_0 // 0 + bytec 13 // "total_units" + app_global_get_ex + assert // check self.total_units exists + swap + - + // modules/transfer_agent.py:31 + // @arc4.abimethod + itob + bytec_0 // 0x151f7c75 + swap + concat + log + intc_1 // 1 + return + + +// modules.transfer_agent.TransferAgent.transfer[routing]() -> void: +transfer: + intc_0 // 0 + dup + // modules/transfer_agent.py:59 + // @arc4.abimethod + txna ApplicationArgs 1 + dup + len + intc_3 // 32 + == + assert // invalid number of bytes for arc4.static_array + txna ApplicationArgs 2 + dup + len + intc_3 // 32 + == + assert // invalid number of bytes for arc4.static_array + txna ApplicationArgs 3 + dupn 2 + len + intc_2 // 8 + == + assert // invalid number of bytes for arc4.uint64 + btoi + // modules/kernel.py:143 + // assert self.status != UInt64(enums.STATUS_INACTIVE), err.NOT_CONFIGURED + intc_0 // 0 + bytec_1 // "status" + app_global_get_ex + assert // check self.status exists + assert // D-ASA not configured + // modules/transfer_agent.py:73 + // self._assert_is_not_asset_defaulted() + callsub _assert_is_not_asset_defaulted + // modules/transfer_agent.py:74 + // self._assert_is_not_asset_suspended() + callsub _assert_is_not_asset_suspended + // modules/kernel.py:135 + // return self.status == UInt64(enums.STATUS_PENDING_IED) + intc_0 // 0 + bytec_1 // "status" + app_global_get_ex + assert // check self.status exists + pushint 50 + == + // modules/kernel.py:147 + // assert not self._status_is_pending_ied(), err.PENDING_IED + ! + assert // IED not yet executed + // modules/transfer_agent.py:13 + // if self.transfer_opening_date: + intc_0 // 0 + bytec 27 // "transfer_opening_date" + app_global_get_ex + assert // check self.transfer_opening_date exists + bz transfer_after_if_else@3 + // modules/transfer_agent.py:15 + // self.transfer_opening_date <= Global.latest_timestamp + intc_0 // 0 + bytec 27 // "transfer_opening_date" + app_global_get_ex + assert // check self.transfer_opening_date exists + global LatestTimestamp + <= + // modules/transfer_agent.py:14-16 + // assert ( + // self.transfer_opening_date <= Global.latest_timestamp + // ), err.CLOSED_TRANSFER + assert // Transfer is closed + +transfer_after_if_else@3: + // modules/transfer_agent.py:17 + // if self.transfer_closure_date: + intc_0 // 0 + bytec 28 // "transfer_closure_date" + app_global_get_ex + assert // check self.transfer_closure_date exists + bz transfer_after_if_else@5 + // modules/transfer_agent.py:19 + // Global.latest_timestamp < self.transfer_closure_date + global LatestTimestamp + intc_0 // 0 + bytec 28 // "transfer_closure_date" + app_global_get_ex + assert // check self.transfer_closure_date exists + < + // modules/transfer_agent.py:18-20 + // assert ( + // Global.latest_timestamp < self.transfer_closure_date + // ), err.CLOSED_TRANSFER + assert // Transfer is closed + +transfer_after_if_else@5: + // modules/transfer_agent.py:78 + // assert Txn.sender == sender_holding_address, err.UNAUTHORIZED + txn Sender + dig 4 + dup + cover 2 + == + assert // Not authorized + // modules/accounting.py:24 + // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS + bytec 8 // 0x52234163636f756e7423 + dig 1 + concat + dup + bury 8 + dup + box_len + bury 1 + assert // Invalid account holding address + bytec 8 // 0x52234163636f756e7423 + dig 5 + dup + cover 2 + concat + dup + bury 9 + box_len + bury 1 + assert // Invalid account holding address + // modules/transfer_agent.py:81 + // self._assert_is_not_account_suspended(sender_holding_address) + dig 2 + callsub _assert_is_not_account_suspended + // modules/transfer_agent.py:82 + // self._assert_is_not_account_suspended(receiver_holding_address) + dup + callsub _assert_is_not_account_suspended + // modules/transfer_agent.py:83 + // assert sender_holding_address != receiver_holding_address, err.SELF_TRANSFER + uncover 2 + != + assert // Sender and receiver must be different + // modules/transfer_agent.py:84 + // assert units > UInt64(0), err.NULL_TRANSFER + dig 1 + dup + assert // Transfer units must be greater than zero + // modules/transfer_agent.py:85 + // assert units <= self.account[sender_holding_address].units, err.OVER_TRANSFER + swap + box_get + assert // check self.account entry exists + intc_3 // 32 + extract_uint64 + <= + assert // Insufficient sender units to transfer + // modules/kernel.py:756 + // if self.event_cursor >= self.schedule_entry_count: + intc_0 // 0 + bytec_2 // "event_cursor" + app_global_get_ex + assert // check self.event_cursor exists + intc_0 // 0 + bytec 4 // "schedule_entry_count" + app_global_get_ex + assert // check self.schedule_entry_count exists + >= + bnz transfer_after_inlined_modules.kernel.ActusKernelModule._assert_no_due_event_pending@10 + // modules/kernel.py:758 + // next_entry = self._get_schedule_entry(self.event_cursor) + intc_0 // 0 + bytec_2 // "event_cursor" + app_global_get_ex + assert // check self.event_cursor exists + callsub _get_schedule_entry + // modules/kernel.py:760 + // next_entry.scheduled_time > Global.latest_timestamp + pushint 9 + extract_uint64 + global LatestTimestamp + > + // modules/kernel.py:759-761 + // assert ( + // next_entry.scheduled_time > Global.latest_timestamp + // ), err.PENDING_ACTUS_EVENT + assert // ACTUS event not yet executed + +transfer_after_inlined_modules.kernel.ActusKernelModule._assert_no_due_event_pending@10: + // modules/transfer_agent.py:88 + // self._ensure_units_activated(sender_holding_address) + dig 3 + dup + callsub _ensure_units_activated + // modules/transfer_agent.py:89 + // self._ensure_units_activated(receiver_holding_address) + dig 3 + dup + cover 2 + callsub _ensure_units_activated + // modules/transfer_agent.py:90 + // self._settle_position(sender_holding_address) + callsub _settle_position + popn 2 + // modules/transfer_agent.py:91 + // self._settle_position(receiver_holding_address) + callsub _settle_position + popn 2 + // modules/accounting.py:152 + // assert units <= self.account[holding_address].units, err.OVER_TRANSFER + dig 5 + dup + box_get + assert // check self.account entry exists + intc_3 // 32 + extract_uint64 + dig 2 + dup + cover 2 + dig 1 + <= + assert // Insufficient sender units to transfer + // modules/accounting.py:153 + // self.account[holding_address].units -= units + dig 1 + - + itob + uncover 2 + intc_3 // 32 + uncover 2 + box_replace + // modules/accounting.py:144 + // self.account[holding_address].units += units + dig 5 + dup + box_get + assert // check self.account entry exists + intc_3 // 32 + extract_uint64 + uncover 2 + + + itob + intc_3 // 32 + swap + box_replace + // modules/transfer_agent.py:59 + // @arc4.abimethod + bytec_0 // 0x151f7c75 + dig 2 + concat + log + intc_1 // 1 + return + + +// modules.accounting.AccountingModule.account_gov_suspension[routing]() -> void: +account_gov_suspension: + // modules/accounting.py:165 + // @arc4.abimethod + txna ApplicationArgs 1 + dup + len + intc_3 // 32 + == + assert // invalid number of bytes for arc4.static_array + txna ApplicationArgs 2 + dup + len + intc_1 // 1 + == + assert // invalid number of bytes for arc4.bool + intc_0 // 0 + getbit + // modules/rbac.py:77 + // assert self._role_is_active(self.authority, Txn.sender), err.UNAUTHORIZED + bytec 21 // 0x5223417574686f7269747923 + txn Sender + callsub _role_is_active + assert // Not authorized + // modules/accounting.py:24 + // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS + bytec 8 // 0x52234163636f756e7423 + uncover 2 + concat + dup + box_len + bury 1 + assert // Invalid account holding address + // modules/accounting.py:185 + // self.account[holding_address].suspended = suspended + dup + pushint 48 + intc_1 // 1 + box_extract + intc_0 // 0 + uncover 3 + setbit + pushint 48 + swap + box_replace + // modules/accounting.py:186 + // return Global.latest_timestamp + global LatestTimestamp + // modules/accounting.py:165 + // @arc4.abimethod + itob + bytec_0 // 0x151f7c75 + swap + concat + log + intc_1 // 1 + return + + +// modules.accounting.AccountingModule.account_open[routing]() -> void: +account_open: + // modules/accounting.py:188 + // @arc4.abimethod + txna ApplicationArgs 1 + dup + len + intc_3 // 32 + == + assert // invalid number of bytes for arc4.static_array + txna ApplicationArgs 2 + dup + len + intc_3 // 32 + == + assert // invalid number of bytes for arc4.static_array + // modules/rbac.py:68 + // assert self._role_is_active(self.account_manager, Txn.sender), err.UNAUTHORIZED + bytec 23 // 0x52234163636f756e744d616e6167657223 + txn Sender + callsub _role_is_active + assert // Not authorized + // modules/kernel.py:139 + // return self.status == UInt64(enums.STATUS_ENDED) + intc_0 // 0 + bytec_1 // "status" + app_global_get_ex + assert // check self.status exists + pushint 200 + == + // modules/accounting.py:210 + // assert not self._status_is_ended(), err.UNAUTHORIZED + ! + assert // Not authorized + // modules/accounting.py:211 + // self._assert_is_not_asset_defaulted() + callsub _assert_is_not_asset_defaulted + // modules/accounting.py:212 + // self._assert_is_not_asset_suspended() + callsub _assert_is_not_asset_suspended + // modules/accounting.py:213 + // assert holding_address not in self.account, err.INVALID_HOLDING_ADDRESS + bytec 8 // 0x52234163636f756e7423 + uncover 2 + concat + dup + box_len + bury 1 + ! + assert // Invalid account holding address + // modules/accounting.py:34 + // units=UInt64(0), + intc_0 // 0 + // modules/accounting.py:32-42 + // return typ.AccountPosition( + // payment_address=payment_address, + // units=UInt64(0), + // reserved_units=UInt64(0), + // suspended=False, + // settled_cursor=UInt64(0), + // interest_checkpoint=UInt64(0), + // principal_checkpoint=UInt64(0), + // claimable_interest=UInt64(0), + // claimable_principal=UInt64(0), + // ) + itob + uncover 2 + dig 1 + concat + dig 1 + concat + bytec 40 // 0x00 + concat + dig 1 + concat + dig 1 + concat + dig 1 + concat + dig 1 + concat + swap + concat + // modules/accounting.py:214 + // self.account[holding_address] = self._new_account_position(payment_address) + box_put + // modules/accounting.py:215 + // return Global.latest_timestamp + global LatestTimestamp + // modules/accounting.py:188 + // @arc4.abimethod + itob + bytec_0 // 0x151f7c75 + swap + concat + log + intc_1 // 1 + return + + +// modules.accounting.AccountingModule.account_update_payment_address[routing]() -> void: +account_update_payment_address: + // modules/accounting.py:217 + // @arc4.abimethod + txna ApplicationArgs 1 + dup + len + intc_3 // 32 + == + assert // invalid number of bytes for arc4.static_array + txna ApplicationArgs 2 + dup + len + intc_3 // 32 + == + assert // invalid number of bytes for arc4.static_array + // modules/accounting.py:24 + // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS + bytec 8 // 0x52234163636f756e7423 + dig 2 + concat + dup + box_len + bury 1 + assert // Invalid account holding address + // modules/accounting.py:238 + // assert Txn.sender == holding_address, err.UNAUTHORIZED + txn Sender + uncover 3 + == + assert // Not authorized + // modules/accounting.py:239 + // self._assert_is_not_asset_defaulted() + callsub _assert_is_not_asset_defaulted + // modules/accounting.py:240 + // self._assert_is_not_asset_suspended() + callsub _assert_is_not_asset_suspended + // modules/accounting.py:241 + // self.account[holding_address].payment_address = payment_address + intc_0 // 0 + uncover 2 + box_replace + // modules/accounting.py:242 + // return Global.latest_timestamp + global LatestTimestamp + // modules/accounting.py:217 + // @arc4.abimethod + itob + bytec_0 // 0x151f7c75 + swap + concat + log + intc_1 // 1 + return + + +// modules.accounting.AccountingModule.account_get_position[routing]() -> void: +account_get_position: + // modules/accounting.py:244 + // @arc4.abimethod(readonly=True) + txna ApplicationArgs 1 + dup + len + intc_3 // 32 + == + assert // invalid number of bytes for arc4.static_array + // modules/accounting.py:24 + // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS + bytec 8 // 0x52234163636f756e7423 + swap + concat + dup + box_len + bury 1 + assert // Invalid account holding address + // modules/accounting.py:259 + // return self.account[holding_address] + box_get + pop + // modules/accounting.py:244 + // @arc4.abimethod(readonly=True) + bytec_0 // 0x151f7c75 + swap + concat + log + intc_1 // 1 + return + + +// modules.kernel.ActusKernelModule.contract_create[routing]() -> void: +contract_create: + // modules/kernel.py:969 + // @arc4.abimethod(create="require") + txna ApplicationArgs 1 + dup + len + intc_3 // 32 + == + assert // invalid number of bytes for arc4.static_array + // modules/kernel.py:980 + // self.arranger.value = arranger + bytec 18 // 0x5223417272616e67657223 + swap + app_global_put + // modules/kernel.py:981 + // return Global.latest_timestamp + global LatestTimestamp + // modules/kernel.py:969 + // @arc4.abimethod(create="require") + itob + bytec_0 // 0x151f7c75 + swap + concat + log + intc_1 // 1 + return + + +// modules.kernel.ActusKernelModule.contract_config[routing]() -> void: +contract_config: + pushbytes "" + dup + // modules/kernel.py:983 + // @arc4.abimethod + txna ApplicationArgs 1 + dupn 2 + len + pushint 107 + == + assert // invalid number of bytes for smart_contracts.abi_types.NormalizedActusTerms + txna ApplicationArgs 2 + dup + cover 2 + len + pushint 72 + == + assert // invalid number of bytes for smart_contracts.abi_types.InitialKernelState + txna ApplicationArgs 3 + dup + cover 2 + dup + len + dig 1 + intc_3 // 32 + extract_uint16 // on error: invalid tuple encoding + dup + pushint 34 + == + assert // invalid tail pointer at index 1 of (uint8[32],(len+utf8[])) + uncover 2 + swap + dig 2 + substring3 + dup + cover 3 + intc_0 // 0 + extract_uint16 // on error: invalid array length header + pushint 36 + + + == + assert // invalid number of bytes for smart_contracts.abi_types.Prospectus + // modules/kernel.py:1012 + // self._assert_caller_is_arranger() + callsub _assert_caller_is_arranger + // modules/kernel.py:1014-1015 + // # Configure Contract + // self.contract_type = terms.contract_type.as_uint64() + intc_0 // 0 + getbyte + dup + bytec 12 // "contract_type" + dig 1 + app_global_put + // modules/kernel.py:218-225 + // return contract_type in ( + // UInt64(enums.CT_PAM), + // UInt64(enums.CT_ANN), + // UInt64(enums.CT_NAM), + // UInt64(enums.CT_LAM), + // UInt64(enums.CT_LAX), + // UInt64(enums.CT_CLM), + // ) + bz contract_config_bool_true@7 + dup + // modules/kernel.py:220 + // UInt64(enums.CT_ANN), + intc_1 // 1 + // modules/kernel.py:218-225 + // return contract_type in ( + // UInt64(enums.CT_PAM), + // UInt64(enums.CT_ANN), + // UInt64(enums.CT_NAM), + // UInt64(enums.CT_LAM), + // UInt64(enums.CT_LAX), + // UInt64(enums.CT_CLM), + // ) + == + bnz contract_config_bool_true@7 + dup + // modules/kernel.py:221 + // UInt64(enums.CT_NAM), + pushint 2 + // modules/kernel.py:218-225 + // return contract_type in ( + // UInt64(enums.CT_PAM), + // UInt64(enums.CT_ANN), + // UInt64(enums.CT_NAM), + // UInt64(enums.CT_LAM), + // UInt64(enums.CT_LAX), + // UInt64(enums.CT_CLM), + // ) + == + bnz contract_config_bool_true@7 + dup + // modules/kernel.py:222 + // UInt64(enums.CT_LAM), + pushint 3 + // modules/kernel.py:218-225 + // return contract_type in ( + // UInt64(enums.CT_PAM), + // UInt64(enums.CT_ANN), + // UInt64(enums.CT_NAM), + // UInt64(enums.CT_LAM), + // UInt64(enums.CT_LAX), + // UInt64(enums.CT_CLM), + // ) + == + bnz contract_config_bool_true@7 + dup + // modules/kernel.py:223 + // UInt64(enums.CT_LAX), + pushint 4 + // modules/kernel.py:218-225 + // return contract_type in ( + // UInt64(enums.CT_PAM), + // UInt64(enums.CT_ANN), + // UInt64(enums.CT_NAM), + // UInt64(enums.CT_LAM), + // UInt64(enums.CT_LAX), + // UInt64(enums.CT_CLM), + // ) + == + bnz contract_config_bool_true@7 + dup + // modules/kernel.py:224 + // UInt64(enums.CT_CLM), + pushint 5 + // modules/kernel.py:218-225 + // return contract_type in ( + // UInt64(enums.CT_PAM), + // UInt64(enums.CT_ANN), + // UInt64(enums.CT_NAM), + // UInt64(enums.CT_LAM), + // UInt64(enums.CT_LAX), + // UInt64(enums.CT_CLM), + // ) + == + bz contract_config_bool_false@8 + +contract_config_bool_true@7: + intc_1 // 1 + +contract_config_bool_merge@9: + // modules/kernel.py:229 + // assert self._is_supported_contract_type(contract_type), err.INVALID_ACTUS_CONFIG + assert // Invalid ACTUS configuration + // modules/kernel.py:1017 + // self._store_contract_config(self.contract_type, terms, initial_state) + intc_0 // 0 + bytec 12 // "contract_type" + app_global_get_ex + swap + bury 2 + assert // check self.contract_type exists + // modules/kernel.py:325 + // assert terms.initial_exchange_amount > UInt64(0), err.INVALID_ACTUS_CONFIG + dig 4 + dup + pushint 33 + extract_uint64 + dup + bury 8 + assert // Invalid ACTUS configuration + // modules/kernel.py:327 + // terms.day_count_convention.as_uint64() + pushint 57 + getbyte + dup + bury 8 + // modules/kernel.py:297-303 + // return day_count_convention in ( + // UInt64(enums.DCC_AA), + // UInt64(enums.DCC_A360), + // UInt64(enums.DCC_A365), + // UInt64(enums.DCC_30E360ISDA), + // UInt64(enums.DCC_30E360), + // ) + bz contract_config_bool_true@16 + dig 6 + // modules/kernel.py:299 + // UInt64(enums.DCC_A360), + intc_1 // 1 + // modules/kernel.py:297-303 + // return day_count_convention in ( + // UInt64(enums.DCC_AA), + // UInt64(enums.DCC_A360), + // UInt64(enums.DCC_A365), + // UInt64(enums.DCC_30E360ISDA), + // UInt64(enums.DCC_30E360), + // ) + == + bnz contract_config_bool_true@16 + dig 6 + // modules/kernel.py:300 + // UInt64(enums.DCC_A365), + pushint 2 + // modules/kernel.py:297-303 + // return day_count_convention in ( + // UInt64(enums.DCC_AA), + // UInt64(enums.DCC_A360), + // UInt64(enums.DCC_A365), + // UInt64(enums.DCC_30E360ISDA), + // UInt64(enums.DCC_30E360), + // ) + == + bnz contract_config_bool_true@16 + dig 6 + // modules/kernel.py:301 + // UInt64(enums.DCC_30E360ISDA), + pushint 3 + // modules/kernel.py:297-303 + // return day_count_convention in ( + // UInt64(enums.DCC_AA), + // UInt64(enums.DCC_A360), + // UInt64(enums.DCC_A365), + // UInt64(enums.DCC_30E360ISDA), + // UInt64(enums.DCC_30E360), + // ) + == + bnz contract_config_bool_true@16 + dig 6 + // modules/kernel.py:302 + // UInt64(enums.DCC_30E360), + pushint 4 + // modules/kernel.py:297-303 + // return day_count_convention in ( + // UInt64(enums.DCC_AA), + // UInt64(enums.DCC_A360), + // UInt64(enums.DCC_A365), + // UInt64(enums.DCC_30E360ISDA), + // UInt64(enums.DCC_30E360), + // ) + == + bz contract_config_bool_false@17 + +contract_config_bool_true@16: + intc_1 // 1 + +contract_config_bool_merge@18: + // modules/kernel.py:309-311 + // assert self._is_supported_day_count_convention( + // day_count_convention + // ), err.INVALID_DAY_COUNT_CONVENTION + assert // Invalid day-count convention ID + // modules/kernel.py:329 + // if contract_type != UInt64(enums.CT_ANN): + dup + intc_1 // 1 + != + bz contract_config_after_if_else@20 + // modules/kernel.py:330 + // assert not terms.dynamic_principal_redemption, err.INVALID_ACTUS_CONFIG + dig 4 + pushint 786 + getbit + ! + assert // Invalid ACTUS configuration + +contract_config_after_if_else@20: + // modules/kernel.py:800 + // assert self.status == UInt64(enums.STATUS_INACTIVE), err.ALREADY_CONFIGURED + intc_0 // 0 + bytec_1 // "status" + app_global_get_ex + assert // check self.status exists + ! + assert // D-ASA already configured + // modules/kernel.py:801 + // assert self.initial_exchange_amount == UInt64(0), err.ALREADY_CONFIGURED + intc_0 // 0 + bytec 20 // "initial_exchange_amount" + app_global_get_ex + assert // check self.initial_exchange_amount exists + ! + assert // D-ASA already configured + // modules/kernel.py:803-804 + // # Set Denomination Asset + // self._assert_denomination_asset(terms.denomination_asset_id) + dig 4 + dup + intc_1 // 1 + extract_uint64 + // modules/kernel.py:768-769 + // # The reference implementation has on-chain denomination with ASA + // _creator, exists = op.AssetParamsGet.asset_creator(denomination_asset_id) + dup + asset_params_get AssetCreator + bury 1 + // modules/kernel.py:770 + // assert exists, err.INVALID_DENOMINATION + assert // Denomination asset is not properly set + // modules/kernel.py:773 + // self.denomination_asset_id = denomination_asset_id + bytec 44 // "denomination_asset_id" + dig 1 + app_global_put + // modules/kernel.py:807-808 + // # Set Settlement Asset + // self._assert_settlement_asset(terms.settlement_asset_id) + dig 1 + pushint 9 + extract_uint64 + // modules/kernel.py:778 + // settlement_asset_id == self.denomination_asset_id + dup + uncover 2 + == + // modules/kernel.py:776-779 + // # The reference implementation settlement asset is the denomination asset + // assert ( + // settlement_asset_id == self.denomination_asset_id + // ), err.INVALID_SETTLEMENT_ASSET + assert // Different settlement asset not supported, must be equal to denomination asset + // modules/kernel.py:782 + // self.settlement_asset_id = settlement_asset_id + bytec 19 // "settlement_asset_id" + dig 1 + app_global_put + // modules/kernel.py:783-789 + // # The reference implementation has on-chain settlement with ASA + // itxn.AssetTransfer( + // xfer_asset=self.settlement_asset_id, + // asset_receiver=Global.current_application_address, + // asset_amount=0, + // fee=Global.min_txn_fee, + // ).submit() + itxn_begin + // modules/kernel.py:788 + // fee=Global.min_txn_fee, + global MinTxnFee + // modules/kernel.py:786 + // asset_receiver=Global.current_application_address, + global CurrentApplicationAddress + // modules/kernel.py:787 + // asset_amount=0, + intc_0 // 0 + itxn_field AssetAmount + itxn_field AssetReceiver + swap + itxn_field XferAsset + // modules/kernel.py:783-784 + // # The reference implementation has on-chain settlement with ASA + // itxn.AssetTransfer( + pushint 4 // axfer + itxn_field TypeEnum + itxn_field Fee + // modules/kernel.py:783-789 + // # The reference implementation has on-chain settlement with ASA + // itxn.AssetTransfer( + // xfer_asset=self.settlement_asset_id, + // asset_receiver=Global.current_application_address, + // asset_amount=0, + // fee=Global.min_txn_fee, + // ).submit() + itxn_submit + // modules/kernel.py:811-812 + // # Units + // self.total_units = terms.total_units + dup + pushint 17 + extract_uint64 + bytec 13 // "total_units" + swap + app_global_put + // modules/kernel.py:813 + // self.reserved_units_total = UInt64(0) + bytec 10 // "reserved_units_total" + intc_0 // 0 + app_global_put + // modules/kernel.py:815-816 + // # Day-Count Conventions + // self.day_count_convention = terms.day_count_convention.as_uint64() + bytec 46 // "day_count_convention" + dig 8 + app_global_put + // modules/kernel.py:818-819 + // # Time + // self.initial_exchange_date = terms.initial_exchange_date + dup + pushint 41 + extract_uint64 + bytec 26 // "initial_exchange_date" + dig 1 + app_global_put + // modules/kernel.py:820 + // self.maturity_date = terms.maturity_date + dig 1 + pushint 49 + extract_uint64 + bytec 45 // "maturity_date" + dig 1 + app_global_put + // modules/kernel.py:821 + // self.next_principal_redemption = initial_state.next_principal_redemption + dig 6 + dup + cover 2 + pushint 48 + extract_uint64 + bytec 14 // "next_principal_redemption" + swap + app_global_put + // modules/kernel.py:823-824 + // # Principal + // self.initial_exchange_amount = terms.initial_exchange_amount + bytec 20 // "initial_exchange_amount" + dig 10 + app_global_put + // modules/kernel.py:825 + // self.dynamic_principal_redemption = terms.dynamic_principal_redemption + dig 3 + pushint 786 + getbit + bytec 34 // "dynamic_principal_redemption" + swap + app_global_put + // modules/kernel.py:826 + // self.outstanding_principal = initial_state.outstanding_principal + dig 1 + pushint 16 + extract_uint64 + bytec_3 // "outstanding_principal" + swap + app_global_put + // modules/kernel.py:828-829 + // # Interest + // self.accrued_interest = initial_state.accrued_interest + dig 1 + pushint 40 + extract_uint64 + bytec 6 // "accrued_interest" + swap + app_global_put + // modules/kernel.py:831-832 + // # Interest Rate + // self.nominal_interest_rate = initial_state.nominal_interest_rate + dig 1 + intc_3 // 32 + extract_uint64 + bytec 9 // "nominal_interest_rate" + swap + app_global_put + // modules/kernel.py:833 + // self.interest_calculation_base = initial_state.interest_calculation_base + dig 1 + pushint 24 + extract_uint64 + bytec 7 // "interest_calculation_base" + swap + app_global_put + // modules/kernel.py:834 + // self.rate_reset_spread = terms.rate_reset_spread + dig 3 + pushint 58 + extract_uint64 + bytec 35 // "rate_reset_spread" + swap + app_global_put + // modules/kernel.py:835 + // self.rate_reset_multiplier = terms.rate_reset_multiplier + dig 3 + pushint 66 + extract_uint64 + bytec 36 // "rate_reset_multiplier" + swap + app_global_put + // modules/kernel.py:836 + // self.rate_reset_floor = terms.rate_reset_floor + dig 3 + pushint 74 + extract_uint64 + bytec 29 // "rate_reset_floor" + swap + app_global_put + // modules/kernel.py:837 + // self.rate_reset_cap = terms.rate_reset_cap + dig 3 + pushint 82 + extract_uint64 + bytec 30 // "rate_reset_cap" + swap + app_global_put + // modules/kernel.py:838 + // self.rate_reset_next = terms.rate_reset_next + dig 3 + pushint 90 + extract_uint64 + bytec 37 // "rate_reset_next" + swap + app_global_put + // modules/kernel.py:839 + // self.has_rate_reset_floor = terms.has_rate_reset_floor + dig 3 + pushint 784 + getbit + bytec 38 // "has_rate_reset_floor" + swap + app_global_put + // modules/kernel.py:840 + // self.has_rate_reset_cap = terms.has_rate_reset_cap + dig 3 + pushint 785 + getbit + bytec 39 // "has_rate_reset_cap" + swap + app_global_put + // modules/kernel.py:842-843 + // # Scaling + // self.fixed_point_scale = terms.fixed_point_scale + uncover 3 + pushint 99 + extract_uint64 + bytec 5 // "fixed_point_scale" + swap + app_global_put + // modules/kernel.py:845-846 + // # Schedule Processing + // self.event_cursor = initial_state.event_cursor + dig 1 + intc_2 // 8 + extract_uint64 + bytec_2 // "event_cursor" + swap + app_global_put + // modules/kernel.py:848-849 + // # Per-Unit Fixed-Point Indexes + // self.cumulative_interest_index = initial_state.cumulative_interest_index + dig 1 + pushint 56 + extract_uint64 + bytec 16 // "cumulative_interest_index" + swap + app_global_put + // modules/kernel.py:850 + // self.cumulative_principal_index = initial_state.cumulative_principal_index + dig 1 + pushint 64 + extract_uint64 + bytec 17 // "cumulative_principal_index" + swap + app_global_put + // modules/kernel.py:852-853 + // # Reserved Amount (for executed cashflows) + // self.reserved_interest = UInt64(0) + bytec 15 // "reserved_interest" + intc_0 // 0 + app_global_put + // modules/kernel.py:854 + // self.reserved_principal = UInt64(0) + bytec 11 // "reserved_principal" + intc_0 // 0 + app_global_put + // modules/kernel.py:856 + // assert terms.initial_exchange_date > Global.latest_timestamp, err.INVALID_IED + dig 2 + global LatestTimestamp + > + assert // IED must be set in the future + // modules/kernel.py:857 + // assert terms.initial_exchange_date > initial_state.status_date, err.INVALID_IED + swap + intc_0 // 0 + extract_uint64 + dig 2 + < + assert // IED must be set in the future + // modules/kernel.py:858 + // assert terms.initial_exchange_date < terms.maturity_date, err.INVALID_IED + < + assert // IED must be set in the future + // modules/kernel.py:1019-1020 + // # Notarize prospectus (optional) + // self.prospectus_hash = prospectus.hash.bytes + dig 2 + extract 0 32 + bytec 42 // "prospectus_hash" + swap + app_global_put + // modules/kernel.py:1021 + // self.prospectus_url = prospectus.url + dig 1 + extract 2 0 + bytec 43 // "prospectus_url" + swap + app_global_put + // modules/kernel.py:1022 + // return Global.latest_timestamp + global LatestTimestamp + // modules/kernel.py:983 + // @arc4.abimethod + itob + bytec_0 // 0x151f7c75 + swap + concat + log + intc_1 // 1 + return + +contract_config_bool_false@17: + intc_0 // 0 + b contract_config_bool_merge@18 + +contract_config_bool_false@8: + intc_0 // 0 + b contract_config_bool_merge@9 + + +// modules.kernel.ActusKernelModule.contract_schedule[routing]() -> void: +contract_schedule: + intc_0 // 0 + pushbytes "" + dupn 3 + // modules/kernel.py:1024 + // @arc4.abimethod + txna ApplicationArgs 1 + dup + len + intc_2 // 8 + == + assert // invalid number of bytes for arc4.uint64 + btoi + dup + txna ApplicationArgs 2 + dup + len + intc_1 // 1 + == + assert // invalid number of bytes for arc4.bool + intc_0 // 0 + getbit + swap + txna ApplicationArgs 3 + dup + cover 2 + dup + intc_0 // 0 + extract_uint16 // on error: invalid array length header + dup + cover 3 + dup + pushint 65 + * + pushint 2 + + + uncover 2 + len + == + assert // invalid number of bytes for arc4.dynamic_array + // modules/kernel.py:1039 + // self._assert_caller_is_arranger() + callsub _assert_caller_is_arranger + // modules/kernel.py:1042 + // contract_type=self.contract_type, + intc_0 // 0 + bytec 12 // "contract_type" + app_global_get_ex + swap + cover 3 + assert // check self.contract_type exists + // modules/kernel.py:874 + // assert self.status == UInt64(enums.STATUS_INACTIVE), err.ALREADY_CONFIGURED + intc_0 // 0 + bytec_1 // "status" + app_global_get_ex + assert // check self.status exists + ! + assert // D-ASA already configured + // modules/kernel.py:875-877 + // assert schedule_page.length <= UInt64( + // cst.SCHEDULE_PAGE_SIZE + // ), err.INVALID_SCHEDULE_PAGE + dup + pushint 16 + <= + assert // Invalid schedule page + // modules/kernel.py:878 + // assert self.initial_exchange_amount > UInt64(0), err.TERMS_NOT_CONFIGURED + intc_0 // 0 + bytec 20 // "initial_exchange_amount" + app_global_get_ex + assert // check self.initial_exchange_amount exists + assert // D-ASA terms not configured + // modules/kernel.py:880 + // page_cursor = schedule_page_index * UInt64(cst.SCHEDULE_PAGE_SIZE) + swap + pushint 16 + * + swap + // modules/kernel.py:887 + // + page_length * UInt64(cst.OP_UP_CONTRACT_CONFIG_PER_ENTRY_BUDGET) + pushint 100 + * + pushint 1510 + + + +contract_schedule_while_top@2: + dup + global OpcodeBudget + > + bz contract_schedule_after_while@5 + itxn_begin + pushint 6 // appl + itxn_field TypeEnum + pushint 5 // DeleteApplication + itxn_field OnCompletion + bytec 47 // 0x068101 + itxn_field ApprovalProgram + bytec 47 // 0x068101 + itxn_field ClearStateProgram + intc_0 // 0 + itxn_field Fee + itxn_submit + b contract_schedule_while_top@2 + +contract_schedule_after_while@5: + // modules/kernel.py:890 + // index = UInt64(0) + intc_0 // 0 + bury 10 + +contract_schedule_while_top@6: + // modules/kernel.py:891 + // while index < page_length: + dig 9 + dig 4 + < + bz contract_schedule_after_while@15 + // modules/kernel.py:892-893 + // entry = schedule_page[index].copy() + // entry_event_type = entry.event_type.as_uint64() + dig 4 + extract 2 0 + dup + bury 13 + dig 10 + dup + cover 2 + pushint 65 + * + pushint 65 + extract3 // on error: index access is out of bounds + // modules/kernel.py:893 + // entry_event_type = entry.event_type.as_uint64() + dup + // modules/kernel.py:892-893 + // entry = schedule_page[index].copy() + // entry_event_type = entry.event_type.as_uint64() + intc_2 // 8 + // modules/kernel.py:893 + // entry_event_type = entry.event_type.as_uint64() + getbyte + dup + cover 2 + bury 14 + // modules/kernel.py:894 + // assert entry.event_id == page_cursor + index, err.INVALID_EVENT_ID + dup + intc_0 // 0 + extract_uint64 + dup + bury 13 + dig 5 + uncover 4 + + + dig 1 + == + assert // Invalid event id + // modules/kernel.py:895-897 + // self._assert_event_allowed_for_contract_type( + // contract_type, entry_event_type + // ) + dig 5 + uncover 3 + callsub _assert_event_allowed_for_contract_type + // modules/kernel.py:898 + // assert entry.scheduled_time > UInt64(0), err.INVALID_ACTUS_CONFIG + swap + pushint 9 + extract_uint64 + dup + bury 10 + assert // Invalid ACTUS configuration + // modules/kernel.py:899 + // if entry.event_id > UInt64(0): + bz contract_schedule_after_if_else@12 + // modules/kernel.py:900 + // if index > UInt64(0): + dig 9 + bz contract_schedule_else_body@10 + // modules/kernel.py:901 + // previous_entry = schedule_page[index - UInt64(1)].copy() + dig 9 + intc_1 // 1 + - + pushint 65 + * + dig 12 + swap + pushint 65 + extract3 // on error: index access is out of bounds + +contract_schedule_after_if_else@11: + // modules/kernel.py:916 + // previous_entry.scheduled_time <= entry.scheduled_time + pushint 9 + extract_uint64 + dig 8 + <= + // modules/kernel.py:915-917 + // assert ( + // previous_entry.scheduled_time <= entry.scheduled_time + // ), err.INVALID_SORTING + assert // Time events must be sorted in strictly ascending order + +contract_schedule_after_if_else@12: + // modules/kernel.py:918 + // if entry.event_id == UInt64(0): + dig 8 + bnz contract_schedule_after_if_else@14 + // modules/kernel.py:919-921 + // assert entry_event_type == UInt64( + // enums.EVT_IED + // ), err.INVALID_ACTUS_CONFIG + dig 10 + intc_1 // 1 + == + assert // Invalid ACTUS configuration + +contract_schedule_after_if_else@14: + // modules/kernel.py:922 + // index += UInt64(1) + dig 9 + intc_1 // 1 + + + bury 10 + b contract_schedule_while_top@6 + +contract_schedule_else_body@10: + // modules/kernel.py:903-905 + // # The first entry of a page must still be ordered after the + // # last entry of the previous page. + // assert schedule_page_index > UInt64(0), err.INVALID_EVENT_ID + dig 6 + dup + assert // Invalid event id + // modules/kernel.py:906 + // previous_page_index = schedule_page_index - UInt64(1) + intc_1 // 1 + - + // modules/kernel.py:908 + // previous_page_index in self.schedule_page + itob + bytec 31 // 0x5323 + swap + concat + dup + box_len + bury 1 + // modules/kernel.py:907-909 + // assert ( + // previous_page_index in self.schedule_page + // ), err.INVALID_SCHEDULE_PAGE + assert // Invalid schedule page + // modules/kernel.py:910-911 + // previous_page = self.schedule_page[previous_page_index].copy() + // assert previous_page.length > UInt64(0), err.INVALID_SCHEDULE_PAGE + dup + intc_0 // 0 + pushint 2 + box_extract + btoi + // modules/kernel.py:911 + // assert previous_page.length > UInt64(0), err.INVALID_SCHEDULE_PAGE + dup + assert // Invalid schedule page + // modules/kernel.py:913 + // previous_page.length - UInt64(1) + intc_1 // 1 + - + // modules/kernel.py:912-914 + // previous_entry = previous_page[ + // previous_page.length - UInt64(1) + // ].copy() + pushint 65 + * + pushint 2 + + + pushint 65 + box_extract + b contract_schedule_after_if_else@11 + +contract_schedule_after_while@15: + // modules/kernel.py:200 + // self.schedule_page[page_index] = schedule_page.copy() + dig 6 + itob + bytec 31 // 0x5323 + swap + concat + dup + box_del + pop + dig 5 + box_put + // modules/kernel.py:925 + // if is_last_page: + dig 5 + bz contract_schedule_after_if_else@17 + // modules/kernel.py:927 + // schedule_page_index * UInt64(cst.SCHEDULE_PAGE_SIZE) + page_length + dig 1 + dig 4 + + + // modules/kernel.py:926 + // self.schedule_entry_count = ( + bytec 4 // "schedule_entry_count" + // modules/kernel.py:926-928 + // self.schedule_entry_count = ( + // schedule_page_index * UInt64(cst.SCHEDULE_PAGE_SIZE) + page_length + // ) + swap + app_global_put + // modules/kernel.py:929 + // self.status = UInt64(enums.STATUS_PENDING_IED) + bytec_1 // "status" + pushint 50 + app_global_put + +contract_schedule_after_if_else@17: + // modules/kernel.py:1047 + // return Global.latest_timestamp + global LatestTimestamp + // modules/kernel.py:1024 + // @arc4.abimethod + itob + bytec_0 // 0x151f7c75 + swap + concat + log + intc_1 // 1 + return + + +// modules.kernel.ActusKernelModule.execute_ied[routing]() -> void: +execute_ied: + // modules/kernel.py:143 + // assert self.status != UInt64(enums.STATUS_INACTIVE), err.NOT_CONFIGURED + intc_0 // 0 + bytec_1 // "status" + app_global_get_ex + assert // check self.status exists + assert // D-ASA not configured + // modules/kernel.py:1057 + // self._assert_caller_is_arranger() + callsub _assert_caller_is_arranger + // modules/kernel.py:1058 + // self._assert_is_not_asset_defaulted() + callsub _assert_is_not_asset_defaulted + // modules/kernel.py:1059 + // self._assert_is_not_asset_suspended() + callsub _assert_is_not_asset_suspended + // modules/kernel.py:1061 + // assert self.event_cursor < self.schedule_entry_count, err.INVALID_EVENT_CURSOR + intc_0 // 0 + bytec_2 // "event_cursor" + app_global_get_ex + assert // check self.event_cursor exists + intc_0 // 0 + bytec 4 // "schedule_entry_count" + app_global_get_ex + assert // check self.schedule_entry_count exists + dig 1 + > + assert // Invalid event cursor + // modules/kernel.py:1062 + // entry = self._get_schedule_entry(self.event_cursor) + callsub _get_schedule_entry + // modules/kernel.py:1063 + // assert entry.event_type == arc4.UInt8(enums.EVT_IED), err.INVALID_EVENT_TYPE + dup + extract 8 1 + dup + pushbytes 0x01 + b== + assert // Invalid event type + // modules/kernel.py:1067 + // event_id=entry.event_id, + dig 1 + extract 0 8 + // modules/kernel.py:1069 + // scheduled_time=entry.scheduled_time, + dig 2 + extract 9 8 + // modules/kernel.py:1070 + // accrual_factor=entry.accrual_factor, + dig 3 + extract 17 8 + // modules/kernel.py:1071 + // redemption_accrual_factor=entry.redemption_accrual_factor, + dig 4 + extract 25 8 + // modules/kernel.py:1073 + // next_nominal_interest_rate=entry.next_nominal_interest_rate, + dig 5 + extract 33 8 + // modules/kernel.py:1074 + // next_principal_redemption=entry.next_principal_redemption, + dig 6 + extract 41 8 + // modules/kernel.py:1075 + // next_outstanding_principal=entry.next_outstanding_principal, + dig 7 + extract 49 8 + // modules/kernel.py:1076 + // flags=entry.flags, + dig 8 + extract 57 8 + // modules/kernel.py:1066-1077 + // typ.ObservedEventRequest( + // event_id=entry.event_id, + // event_type=entry.event_type, + // scheduled_time=entry.scheduled_time, + // accrual_factor=entry.accrual_factor, + // redemption_accrual_factor=entry.redemption_accrual_factor, + // observed_rate=UInt64(0), + // next_nominal_interest_rate=entry.next_nominal_interest_rate, + // next_principal_redemption=entry.next_principal_redemption, + // next_outstanding_principal=entry.next_outstanding_principal, + // flags=entry.flags, + // ), + uncover 7 + uncover 8 + concat + uncover 7 + concat + uncover 6 + concat + uncover 5 + concat + // modules/kernel.py:1072 + // observed_rate=UInt64(0), + intc_0 // 0 + // modules/kernel.py:1066-1077 + // typ.ObservedEventRequest( + // event_id=entry.event_id, + // event_type=entry.event_type, + // scheduled_time=entry.scheduled_time, + // accrual_factor=entry.accrual_factor, + // redemption_accrual_factor=entry.redemption_accrual_factor, + // observed_rate=UInt64(0), + // next_nominal_interest_rate=entry.next_nominal_interest_rate, + // next_principal_redemption=entry.next_principal_redemption, + // next_outstanding_principal=entry.next_outstanding_principal, + // flags=entry.flags, + // ), + itob + concat + uncover 4 + concat + uncover 3 + concat + uncover 2 + concat + swap + concat + // modules/kernel.py:1064-1078 + // self._apply_non_cash_schedule_entry( + // entry, + // typ.ObservedEventRequest( + // event_id=entry.event_id, + // event_type=entry.event_type, + // scheduled_time=entry.scheduled_time, + // accrual_factor=entry.accrual_factor, + // redemption_accrual_factor=entry.redemption_accrual_factor, + // observed_rate=UInt64(0), + // next_nominal_interest_rate=entry.next_nominal_interest_rate, + // next_principal_redemption=entry.next_principal_redemption, + // next_outstanding_principal=entry.next_outstanding_principal, + // flags=entry.flags, + // ), + // ) + callsub _apply_non_cash_schedule_entry + popn 2 + // modules/kernel.py:1079 + // return Global.latest_timestamp + global LatestTimestamp + // modules/kernel.py:1049 + // @arc4.abimethod + itob + bytec_0 // 0x151f7c75 + swap + concat + log + intc_1 // 1 + return + + +// modules.kernel.ActusKernelModule.apply_non_cash_event[routing]() -> void: +apply_non_cash_event: + intc_0 // 0 + dupn 4 + pushbytes "" + dup + // modules/kernel.py:1081 + // @arc4.abimethod + txna ApplicationArgs 1 + dup + len + intc_2 // 8 + == + assert // invalid number of bytes for arc4.uint64 + btoi + txna ApplicationArgs 2 + dupn 2 + len + pushint 73 + == + assert // invalid number of bytes for smart_contracts.abi_types.ObservedEventRequest + // modules/kernel.py:143 + // assert self.status != UInt64(enums.STATUS_INACTIVE), err.NOT_CONFIGURED + intc_0 // 0 + bytec_1 // "status" + app_global_get_ex + assert // check self.status exists + assert // D-ASA not configured + // modules/kernel.py:1095 + // self._assert_is_not_asset_defaulted() + callsub _assert_is_not_asset_defaulted + // modules/kernel.py:1096 + // self._assert_is_not_asset_suspended() + callsub _assert_is_not_asset_suspended + // modules/kernel.py:1098 + // if payload.flags & UInt64(enums.FLAG_OBSERVED_EVENT): + pushint 65 + extract_uint64 + dup + pushint 4 + & + bz apply_non_cash_event_after_if_else@3 + // modules/kernel.py:233 + // return self.contract_type == UInt64(enums.CT_CLM) + intc_0 // 0 + bytec 12 // "contract_type" + app_global_get_ex + assert // check self.contract_type exists + pushint 5 + == + // modules/kernel.py:1099 + // assert self._supports_observed_events(), err.OBSERVED_EVENT_REQUIRED + assert // Observed event required to execute this action + // modules/kernel.py:1100 + // self._assert_caller_is_arranger() + callsub _assert_caller_is_arranger + // modules/kernel.py:233 + // return self.contract_type == UInt64(enums.CT_CLM) + intc_0 // 0 + bytec 12 // "contract_type" + app_global_get_ex + assert // check self.contract_type exists + dup + pushint 5 + == + // modules/kernel.py:938 + // assert self._supports_observed_events(), err.OBSERVED_EVENT_REQUIRED + assert // Observed event required to execute this action + // modules/kernel.py:939 + // assert payload.event_id == self.schedule_entry_count, err.INVALID_EVENT_ID + dig 2 + dup + intc_0 // 0 + extract_uint64 + dup + bury 7 + intc_0 // 0 + bytec 4 // "schedule_entry_count" + app_global_get_ex + assert // check self.schedule_entry_count exists + == + assert // Invalid event id + // modules/kernel.py:941 + // self.contract_type, payload.event_type.as_uint64() + dup + extract 8 1 + bury 12 + intc_2 // 8 + getbyte + // modules/kernel.py:940-942 + // self._assert_event_allowed_for_contract_type( + // self.contract_type, payload.event_type.as_uint64() + // ) + callsub _assert_event_allowed_for_contract_type + // modules/kernel.py:944 + // page_index = self._schedule_page_index(self.schedule_entry_count) + intc_0 // 0 + bytec 4 // "schedule_entry_count" + app_global_get_ex + assert // check self.schedule_entry_count exists + // modules/kernel.py:190 + // return event_id // UInt64(cst.SCHEDULE_PAGE_SIZE) + pushint 16 + / + // modules/kernel.py:945 + // page = typ.ExecutionSchedulePage() + pushbytes 0x0000 + bury 7 + // modules/kernel.py:946 + // if page_index in self.schedule_page: + itob + bytec 31 // 0x5323 + swap + concat + dup + bury 9 + box_len + bury 1 + bz apply_non_cash_event_after_if_else@27 + // modules/kernel.py:947 + // page = self.schedule_page[page_index].copy() + dig 7 + box_get + swap + bury 7 + assert // check self.schedule_page entry exists + +apply_non_cash_event_after_if_else@27: + // modules/kernel.py:948 + // assert page.length < UInt64(cst.SCHEDULE_PAGE_SIZE), err.INVALID_SCHEDULE_PAGE + dig 5 + dup + intc_0 // 0 + extract_uint16 // on error: invalid array length header + dup + pushint 16 + < + assert // Invalid schedule page + // modules/kernel.py:953 + // scheduled_time=payload.scheduled_time, + dig 3 + dup + extract 9 8 + // modules/kernel.py:954 + // accrual_factor=payload.accrual_factor, + dig 1 + extract 17 8 + // modules/kernel.py:955 + // redemption_accrual_factor=payload.redemption_accrual_factor, + dig 2 + extract 25 8 + // modules/kernel.py:956 + // next_nominal_interest_rate=payload.next_nominal_interest_rate, + dig 3 + extract 41 8 + // modules/kernel.py:957 + // next_principal_redemption=payload.next_principal_redemption, + dig 4 + extract 49 8 + // modules/kernel.py:958 + // next_outstanding_principal=payload.next_outstanding_principal, + uncover 5 + extract 57 8 + // modules/kernel.py:950-960 + // typ.ExecutionScheduleEntry( + // event_id=payload.event_id, + // event_type=payload.event_type, + // scheduled_time=payload.scheduled_time, + // accrual_factor=payload.accrual_factor, + // redemption_accrual_factor=payload.redemption_accrual_factor, + // next_nominal_interest_rate=payload.next_nominal_interest_rate, + // next_principal_redemption=payload.next_principal_redemption, + // next_outstanding_principal=payload.next_outstanding_principal, + // flags=payload.flags, + // ) + dig 11 + itob + dig 18 + concat + uncover 6 + concat + uncover 5 + concat + uncover 4 + concat + uncover 3 + concat + uncover 2 + concat + swap + concat + dig 3 + itob + concat + // modules/kernel.py:949-961 + // page.append( + // typ.ExecutionScheduleEntry( + // event_id=payload.event_id, + // event_type=payload.event_type, + // scheduled_time=payload.scheduled_time, + // accrual_factor=payload.accrual_factor, + // redemption_accrual_factor=payload.redemption_accrual_factor, + // next_nominal_interest_rate=payload.next_nominal_interest_rate, + // next_principal_redemption=payload.next_principal_redemption, + // next_outstanding_principal=payload.next_outstanding_principal, + // flags=payload.flags, + // ) + // ) + uncover 2 + swap + concat // on error: max array length exceeded + swap + intc_1 // 1 + + + itob + extract 6 2 + replace2 0 + // modules/kernel.py:962 + // self.schedule_page[page_index] = page.copy() + dig 8 + dup + box_del + pop + swap + box_put + // modules/kernel.py:963 + // self.schedule_entry_count += UInt64(1) + intc_0 // 0 + bytec 4 // "schedule_entry_count" + app_global_get_ex + assert // check self.schedule_entry_count exists + intc_1 // 1 + + + bytec 4 // "schedule_entry_count" + swap + app_global_put + +apply_non_cash_event_after_if_else@3: + // modules/kernel.py:1103 + // assert event_id == self.event_cursor, err.INVALID_EVENT_CURSOR + intc_0 // 0 + bytec_2 // "event_cursor" + app_global_get_ex + assert // check self.event_cursor exists + dig 3 + dup + uncover 2 + == + assert // Invalid event cursor + // modules/kernel.py:1104 + // entry = self._get_schedule_entry(event_id) + callsub _get_schedule_entry + dup + bury 8 + // modules/kernel.py:1106 + // entry.event_type.as_uint64() + dup + extract 8 1 + bury 10 + intc_2 // 8 + getbyte + dup + bury 6 + // modules/kernel.py:364 + // UInt64(enums.EVT_IED), + intc_1 // 1 + // modules/kernel.py:363-370 + // return event_type in ( + // UInt64(enums.EVT_IED), + // UInt64(enums.EVT_PI), + // UInt64(enums.EVT_RR), + // UInt64(enums.EVT_RRF), + // UInt64(enums.EVT_IPCB), + // UInt64(enums.EVT_PRF), + // ) + == + bnz apply_non_cash_event_bool_true@15 + dig 4 + // modules/kernel.py:365 + // UInt64(enums.EVT_PI), + pushint 4 + // modules/kernel.py:363-370 + // return event_type in ( + // UInt64(enums.EVT_IED), + // UInt64(enums.EVT_PI), + // UInt64(enums.EVT_RR), + // UInt64(enums.EVT_RRF), + // UInt64(enums.EVT_IPCB), + // UInt64(enums.EVT_PRF), + // ) + == + bnz apply_non_cash_event_bool_true@15 + dig 4 + // modules/kernel.py:366 + // UInt64(enums.EVT_RR), + pushint 12 + // modules/kernel.py:363-370 + // return event_type in ( + // UInt64(enums.EVT_IED), + // UInt64(enums.EVT_PI), + // UInt64(enums.EVT_RR), + // UInt64(enums.EVT_RRF), + // UInt64(enums.EVT_IPCB), + // UInt64(enums.EVT_PRF), + // ) + == + bnz apply_non_cash_event_bool_true@15 + dig 4 + // modules/kernel.py:367 + // UInt64(enums.EVT_RRF), + pushint 11 + // modules/kernel.py:363-370 + // return event_type in ( + // UInt64(enums.EVT_IED), + // UInt64(enums.EVT_PI), + // UInt64(enums.EVT_RR), + // UInt64(enums.EVT_RRF), + // UInt64(enums.EVT_IPCB), + // UInt64(enums.EVT_PRF), + // ) + == + bnz apply_non_cash_event_bool_true@15 + dig 4 + // modules/kernel.py:368 + // UInt64(enums.EVT_IPCB), + pushint 18 + // modules/kernel.py:363-370 + // return event_type in ( + // UInt64(enums.EVT_IED), + // UInt64(enums.EVT_PI), + // UInt64(enums.EVT_RR), + // UInt64(enums.EVT_RRF), + // UInt64(enums.EVT_IPCB), + // UInt64(enums.EVT_PRF), + // ) + == + bnz apply_non_cash_event_bool_true@15 + dig 4 + // modules/kernel.py:369 + // UInt64(enums.EVT_PRF), + pushint 5 + // modules/kernel.py:363-370 + // return event_type in ( + // UInt64(enums.EVT_IED), + // UInt64(enums.EVT_PI), + // UInt64(enums.EVT_RR), + // UInt64(enums.EVT_RRF), + // UInt64(enums.EVT_IPCB), + // UInt64(enums.EVT_PRF), + // ) + == + bz apply_non_cash_event_bool_false@16 + +apply_non_cash_event_bool_true@15: + intc_1 // 1 + +apply_non_cash_event_bool_merge@17: + // modules/kernel.py:1105-1107 + // assert self._event_is_non_cash( + // entry.event_type.as_uint64() + // ), err.INVALID_EVENT_TYPE + assert // Invalid event type + // modules/kernel.py:1108 + // assert entry.event_type != arc4.UInt8(enums.EVT_IED), err.INVALID_EVENT_TYPE + dig 8 + pushbytes 0x01 + b!= + assert // Invalid event type + // modules/kernel.py:374 + // return event_type in (UInt64(enums.EVT_RR), UInt64(enums.EVT_RRF)) + dig 4 + pushint 12 + == + bnz apply_non_cash_event_bool_true@21 + dig 4 + pushint 11 + == + bz apply_non_cash_event_bool_false@22 + +apply_non_cash_event_bool_true@21: + intc_1 // 1 + +apply_non_cash_event_bool_merge@23: + // modules/kernel.py:1109 + // if self._event_is_rate_reset(entry.event_type.as_uint64()): + bz apply_non_cash_event_else_body@5 + // modules/rbac.py:80 + // assert self._role_is_active(self.observer, Txn.sender), err.UNAUTHORIZED + bytec 24 // 0x52234f6273657276657223 + txn Sender + callsub _role_is_active + assert // Not authorized + +apply_non_cash_event_after_if_else@6: + // modules/kernel.py:1113 + // self._apply_non_cash_schedule_entry(entry, payload) + dig 6 + dig 2 + callsub _apply_non_cash_schedule_entry + popn 2 + // modules/kernel.py:1114 + // return Global.latest_timestamp + global LatestTimestamp + // modules/kernel.py:1081 + // @arc4.abimethod + itob + bytec_0 // 0x151f7c75 + swap + concat + log + intc_1 // 1 + return + +apply_non_cash_event_else_body@5: + // modules/kernel.py:1112 + // self._assert_caller_is_arranger() + callsub _assert_caller_is_arranger + b apply_non_cash_event_after_if_else@6 + +apply_non_cash_event_bool_false@22: + intc_0 // 0 + b apply_non_cash_event_bool_merge@23 + +apply_non_cash_event_bool_false@16: + intc_0 // 0 + b apply_non_cash_event_bool_merge@17 + + +// modules.kernel.ActusKernelModule.get_contract_state[routing]() -> void: +get_contract_state: + // modules/kernel.py:143 + // assert self.status != UInt64(enums.STATUS_INACTIVE), err.NOT_CONFIGURED + intc_0 // 0 + bytec_1 // "status" + app_global_get_ex + assert // check self.status exists + dup + assert // D-ASA not configured + // modules/kernel.py:1121 + // contract_type=arc4.UInt8(self.contract_type), + intc_0 // 0 + bytec 12 // "contract_type" + app_global_get_ex + assert // check self.contract_type exists + itob + dup + bitlen + intc_2 // 8 + <= + assert // overflow + extract 7 1 + // modules/kernel.py:1123 + // total_units=self.total_units, + intc_0 // 0 + bytec 13 // "total_units" + app_global_get_ex + assert // check self.total_units exists + // modules/kernel.py:1124 + // reserved_units_total=self.reserved_units_total, + intc_0 // 0 + bytec 10 // "reserved_units_total" + app_global_get_ex + assert // check self.reserved_units_total exists + // modules/kernel.py:1125 + // initial_exchange_amount=self.initial_exchange_amount, + intc_0 // 0 + bytec 20 // "initial_exchange_amount" + app_global_get_ex + assert // check self.initial_exchange_amount exists + // modules/kernel.py:1126 + // event_cursor=self.event_cursor, + intc_0 // 0 + bytec_2 // "event_cursor" + app_global_get_ex + assert // check self.event_cursor exists + // modules/kernel.py:1127 + // schedule_entry_count=self.schedule_entry_count, + intc_0 // 0 + bytec 4 // "schedule_entry_count" + app_global_get_ex + assert // check self.schedule_entry_count exists + // modules/kernel.py:1128 + // outstanding_principal=self.outstanding_principal, + intc_0 // 0 + bytec_3 // "outstanding_principal" + app_global_get_ex + assert // check self.outstanding_principal exists + // modules/kernel.py:1129 + // interest_calculation_base=self.interest_calculation_base, + intc_0 // 0 + bytec 7 // "interest_calculation_base" + app_global_get_ex + assert // check self.interest_calculation_base exists + // modules/kernel.py:1130 + // nominal_interest_rate=self.nominal_interest_rate, + intc_0 // 0 + bytec 9 // "nominal_interest_rate" + app_global_get_ex + assert // check self.nominal_interest_rate exists + // modules/kernel.py:1131 + // accrued_interest=self.accrued_interest, + intc_0 // 0 + bytec 6 // "accrued_interest" + app_global_get_ex + assert // check self.accrued_interest exists + // modules/kernel.py:1132 + // cumulative_interest_index=self.cumulative_interest_index, + intc_0 // 0 + bytec 16 // "cumulative_interest_index" + app_global_get_ex + assert // check self.cumulative_interest_index exists + // modules/kernel.py:1133 + // cumulative_principal_index=self.cumulative_principal_index, + intc_0 // 0 + bytec 17 // "cumulative_principal_index" + app_global_get_ex + assert // check self.cumulative_principal_index exists + // modules/kernel.py:1134 + // reserved_interest=self.reserved_interest, + intc_0 // 0 + bytec 15 // "reserved_interest" + app_global_get_ex + assert // check self.reserved_interest exists + // modules/kernel.py:1135 + // reserved_principal=self.reserved_principal, + intc_0 // 0 + bytec 11 // "reserved_principal" + app_global_get_ex + assert // check self.reserved_principal exists + // modules/kernel.py:1120-1136 + // return typ.KernelState( + // contract_type=arc4.UInt8(self.contract_type), + // status=self.status, + // total_units=self.total_units, + // reserved_units_total=self.reserved_units_total, + // initial_exchange_amount=self.initial_exchange_amount, + // event_cursor=self.event_cursor, + // schedule_entry_count=self.schedule_entry_count, + // outstanding_principal=self.outstanding_principal, + // interest_calculation_base=self.interest_calculation_base, + // nominal_interest_rate=self.nominal_interest_rate, + // accrued_interest=self.accrued_interest, + // cumulative_interest_index=self.cumulative_interest_index, + // cumulative_principal_index=self.cumulative_principal_index, + // reserved_interest=self.reserved_interest, + // reserved_principal=self.reserved_principal, + // ) + uncover 14 + itob + uncover 14 + swap + concat + uncover 13 + itob + concat + uncover 12 + itob + concat + uncover 11 + itob + concat + uncover 10 + itob + concat + uncover 9 + itob + concat + uncover 8 + itob + concat + uncover 7 + itob + concat + uncover 6 + itob + concat + uncover 5 + itob + concat + uncover 4 + itob + concat + uncover 3 + itob + concat + uncover 2 + itob + concat + swap + itob + concat + // modules/kernel.py:1116 + // @arc4.abimethod(readonly=True) + bytec_0 // 0x151f7c75 + swap + concat + log + intc_1 // 1 + return + + +// modules.kernel.ActusKernelModule.get_next_due_event[routing]() -> void: +get_next_due_event: + // modules/kernel.py:143 + // assert self.status != UInt64(enums.STATUS_INACTIVE), err.NOT_CONFIGURED + intc_0 // 0 + bytec_1 // "status" + app_global_get_ex + assert // check self.status exists + assert // D-ASA not configured + // modules/kernel.py:1142 + // if self.event_cursor >= self.schedule_entry_count: + intc_0 // 0 + bytec_2 // "event_cursor" + app_global_get_ex + assert // check self.event_cursor exists + intc_0 // 0 + bytec 4 // "schedule_entry_count" + app_global_get_ex + assert // check self.schedule_entry_count exists + >= + bz get_next_due_event_after_if_else@3 + // modules/kernel.py:1144 + // event_id=self.event_cursor, + intc_0 // 0 + bytec_2 // "event_cursor" + app_global_get_ex + assert // check self.event_cursor exists + // modules/kernel.py:1143-1153 + // return typ.ExecutionScheduleEntry( + // event_id=self.event_cursor, + // event_type=arc4.UInt8(0), + // scheduled_time=UInt64(0), + // accrual_factor=UInt64(0), + // redemption_accrual_factor=UInt64(0), + // next_nominal_interest_rate=UInt64(0), + // next_principal_redemption=UInt64(0), + // next_outstanding_principal=UInt64(0), + // flags=UInt64(0), + // ) + itob + // modules/kernel.py:1145 + // event_type=arc4.UInt8(0), + bytec 40 // 0x00 + // modules/kernel.py:1143-1153 + // return typ.ExecutionScheduleEntry( + // event_id=self.event_cursor, + // event_type=arc4.UInt8(0), + // scheduled_time=UInt64(0), + // accrual_factor=UInt64(0), + // redemption_accrual_factor=UInt64(0), + // next_nominal_interest_rate=UInt64(0), + // next_principal_redemption=UInt64(0), + // next_outstanding_principal=UInt64(0), + // flags=UInt64(0), + // ) + concat + // modules/kernel.py:1146 + // scheduled_time=UInt64(0), + intc_0 // 0 + // modules/kernel.py:1143-1153 + // return typ.ExecutionScheduleEntry( + // event_id=self.event_cursor, + // event_type=arc4.UInt8(0), + // scheduled_time=UInt64(0), + // accrual_factor=UInt64(0), + // redemption_accrual_factor=UInt64(0), + // next_nominal_interest_rate=UInt64(0), + // next_principal_redemption=UInt64(0), + // next_outstanding_principal=UInt64(0), + // flags=UInt64(0), + // ) + itob + swap + dig 1 + concat + dig 1 + concat + dig 1 + concat + dig 1 + concat + dig 1 + concat + dig 1 + concat + swap + concat + +get_next_due_event_after_inlined_modules.kernel.ActusKernelModule.get_next_due_event@4: + // modules/kernel.py:1138 + // @arc4.abimethod(readonly=True) + bytec_0 // 0x151f7c75 + swap + concat + log + intc_1 // 1 + return + +get_next_due_event_after_if_else@3: + // modules/kernel.py:1154 + // return self._get_schedule_entry(self.event_cursor) + intc_0 // 0 + bytec_2 // "event_cursor" + app_global_get_ex + assert // check self.event_cursor exists + callsub _get_schedule_entry + // modules/kernel.py:1138 + // @arc4.abimethod(readonly=True) + b get_next_due_event_after_inlined_modules.kernel.ActusKernelModule.get_next_due_event@4 + + +// modules.rbac.RbacModule.contract_update[routing]() -> void: +contract_update: + // modules/rbac.py:153-156 + // # The reference implementation grants the update permissions to the Arranger. + // # ⚠️ WARNING: Application updates must be executed VERY carefully, as they + // # might introduce breaking changes. + // self._assert_caller_is_arranger() + callsub _assert_caller_is_arranger + // modules/rbac.py:148 + // @arc4.abimethod(allow_actions=["UpdateApplication"]) + intc_1 // 1 + return + + +// modules.rbac.RbacModule.rbac_rotate_arranger[routing]() -> void: +rbac_rotate_arranger: + // modules/rbac.py:158 + // @arc4.abimethod + txna ApplicationArgs 1 + dup + len + intc_3 // 32 + == + assert // invalid number of bytes for arc4.static_array + // modules/rbac.py:169 + // self._assert_caller_is_arranger() + callsub _assert_caller_is_arranger + // modules/rbac.py:170 + // self.arranger.value = new_arranger + bytec 18 // 0x5223417272616e67657223 + swap + app_global_put + // modules/rbac.py:171 + // return Global.latest_timestamp + global LatestTimestamp + // modules/rbac.py:158 + // @arc4.abimethod + itob + bytec_0 // 0x151f7c75 + swap + concat + log + intc_1 // 1 + return + + +// modules.rbac.RbacModule.rbac_set_op_daemon[routing]() -> void: +rbac_set_op_daemon: + // modules/rbac.py:173 + // @arc4.abimethod + txna ApplicationArgs 1 + dup + len + intc_3 // 32 + == + assert // invalid number of bytes for arc4.static_array + // modules/rbac.py:184 + // self._assert_caller_is_arranger() + callsub _assert_caller_is_arranger + // modules/rbac.py:185 + // self.op_daemon.value = address + bytec 25 // 0x52234f704461656d6f6e23 + swap + app_global_put + // modules/rbac.py:186 + // return Global.latest_timestamp + global LatestTimestamp + // modules/rbac.py:173 + // @arc4.abimethod + itob + bytec_0 // 0x151f7c75 + swap + concat + log + intc_1 // 1 + return + + +// modules.rbac.RbacModule.rbac_assign_role[routing]() -> void: +rbac_assign_role: + // modules/rbac.py:188 + // @arc4.abimethod + txna ApplicationArgs 1 + dup + len + intc_1 // 1 + == + assert // invalid number of bytes for arc4.uint8 + txna ApplicationArgs 2 + dup + cover 2 + len + intc_3 // 32 + == + assert // invalid number of bytes for arc4.static_array + txna ApplicationArgs 3 + dup + cover 2 + len + pushint 16 + == + assert // invalid number of bytes for smart_contracts.abi_types.RoleValidity + // modules/rbac.py:210 + // self._assert_caller_is_arranger() + callsub _assert_caller_is_arranger + // modules/rbac.py:211 + // self._assert_is_not_asset_defaulted() + callsub _assert_is_not_asset_defaulted + // modules/rbac.py:212 + // self._assert_valid_role(role_id.as_uint64()) + btoi + dupn 2 + callsub _assert_valid_role + // modules/rbac.py:102 + // if role_id == UInt64(enums.ROLE_ARRANGER): + pushint 20 + == + bz rbac_assign_role_after_if_else@3 + // modules/rbac.py:103 + // self.arranger.value = role_address + bytec 18 // 0x5223417272616e67657223 + dig 3 + app_global_put + +rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14: + // modules/rbac.py:214 + // return Global.latest_timestamp + global LatestTimestamp + // modules/rbac.py:188 + // @arc4.abimethod + itob + bytec_0 // 0x151f7c75 + swap + concat + log + intc_1 // 1 + return + +rbac_assign_role_after_if_else@3: + // modules/rbac.py:106 + // if role_id == UInt64(enums.ROLE_ACCOUNT_MANAGER): + dup + pushint 40 + == + bz rbac_assign_role_after_if_else@5 + // modules/rbac.py:107 + // assert role_address not in self.account_manager, err.INVALID_ROLE_ADDRESS + bytec 23 // 0x52234163636f756e744d616e6167657223 + dig 3 + concat + dup + box_len + bury 1 + ! + assert // Invalid account role address + // modules/rbac.py:108 + // self.account_manager[role_address] = validity.copy() + dig 2 + box_put + // modules/rbac.py:213 + // self._set_role(role_id.as_uint64(), role_address, validity) + b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14 + +rbac_assign_role_after_if_else@5: + // modules/rbac.py:110 + // if role_id == UInt64(enums.ROLE_PRIMARY_DEALER): + dup + pushint 50 + == + bz rbac_assign_role_after_if_else@7 + // modules/rbac.py:111 + // assert role_address not in self.primary_dealer, err.INVALID_ROLE_ADDRESS + bytec 22 // 0x52235072696d6172794465616c657223 + dig 3 + concat + dup + box_len + bury 1 + ! + assert // Invalid account role address + // modules/rbac.py:112 + // self.primary_dealer[role_address] = validity.copy() + dig 2 + box_put + // modules/rbac.py:213 + // self._set_role(role_id.as_uint64(), role_address, validity) + b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14 + +rbac_assign_role_after_if_else@7: + // modules/rbac.py:114 + // if role_id == UInt64(enums.ROLE_TRUSTEE): + dup + pushint 60 + == + bz rbac_assign_role_after_if_else@9 + // modules/rbac.py:115 + // assert role_address not in self.trustee, err.INVALID_ROLE_ADDRESS + bytec 32 // 0x52235472757374656523 + dig 3 + concat + dup + box_len + bury 1 + ! + assert // Invalid account role address + // modules/rbac.py:116 + // self.trustee[role_address] = validity.copy() + dig 2 + box_put + // modules/rbac.py:213 + // self._set_role(role_id.as_uint64(), role_address, validity) + b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14 + +rbac_assign_role_after_if_else@9: + // modules/rbac.py:118 + // if role_id == UInt64(enums.ROLE_AUTHORITY): + dup + pushint 70 + == + bz rbac_assign_role_after_if_else@11 + // modules/rbac.py:119 + // assert role_address not in self.authority, err.INVALID_ROLE_ADDRESS + bytec 21 // 0x5223417574686f7269747923 + dig 3 + concat + dup + box_len + bury 1 + ! + assert // Invalid account role address + // modules/rbac.py:120 + // self.authority[role_address] = validity.copy() + dig 2 + box_put + // modules/rbac.py:213 + // self._set_role(role_id.as_uint64(), role_address, validity) + b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14 + +rbac_assign_role_after_if_else@11: + // modules/rbac.py:122 + // if role_id == UInt64(enums.ROLE_OBSERVER): + dup + pushint 80 + == + bz rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14 + // modules/rbac.py:123 + // assert role_address not in self.observer, err.INVALID_ROLE_ADDRESS + bytec 24 // 0x52234f6273657276657223 + dig 3 + concat + dup + box_len + bury 1 + ! + assert // Invalid account role address + // modules/rbac.py:124 + // self.observer[role_address] = validity.copy() + dig 2 + box_put + b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14 + + +// modules.rbac.RbacModule.rbac_revoke_role[routing]() -> void: +rbac_revoke_role: + // modules/rbac.py:216 + // @arc4.abimethod + txna ApplicationArgs 1 + dup + len + intc_1 // 1 + == + assert // invalid number of bytes for arc4.uint8 + txna ApplicationArgs 2 + dup + cover 2 + len + intc_3 // 32 + == + assert // invalid number of bytes for arc4.static_array + // modules/rbac.py:235 + // self._assert_caller_is_arranger() + callsub _assert_caller_is_arranger + // modules/rbac.py:236 + // self._assert_is_not_asset_defaulted() + callsub _assert_is_not_asset_defaulted + // modules/rbac.py:237 + // self._assert_valid_role(role_id.as_uint64()) + btoi + dupn 2 + callsub _assert_valid_role + // modules/rbac.py:127 + // assert role_id != UInt64(enums.ROLE_ARRANGER), err.INVALID_ROLE + dup + pushint 20 + != + assert // Invalid role identifier + // modules/rbac.py:128 + // if role_id == UInt64(enums.ROLE_ACCOUNT_MANAGER): + pushint 40 + == + bz rbac_revoke_role_after_if_else@3 + // modules/rbac.py:129 + // assert role_address in self.account_manager, err.INVALID_ROLE_ADDRESS + bytec 23 // 0x52234163636f756e744d616e6167657223 + dig 2 + concat + dup + box_len + bury 1 + assert // Invalid account role address + // modules/rbac.py:130 + // del self.account_manager[role_address] + box_del + pop + +rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12: + // modules/rbac.py:239 + // return Global.latest_timestamp + global LatestTimestamp + // modules/rbac.py:216 + // @arc4.abimethod + itob + bytec_0 // 0x151f7c75 + swap + concat + log + intc_1 // 1 + return + +rbac_revoke_role_after_if_else@3: + // modules/rbac.py:132 + // if role_id == UInt64(enums.ROLE_PRIMARY_DEALER): + dup + pushint 50 + == + bz rbac_revoke_role_after_if_else@5 + // modules/rbac.py:133 + // assert role_address in self.primary_dealer, err.INVALID_ROLE_ADDRESS + bytec 22 // 0x52235072696d6172794465616c657223 + dig 2 + concat + dup + box_len + bury 1 + assert // Invalid account role address + // modules/rbac.py:134 + // del self.primary_dealer[role_address] + box_del + pop + // modules/rbac.py:238 + // self._delete_role(role_id.as_uint64(), role_address) + b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 + +rbac_revoke_role_after_if_else@5: + // modules/rbac.py:136 + // if role_id == UInt64(enums.ROLE_TRUSTEE): + dup + pushint 60 + == + bz rbac_revoke_role_after_if_else@7 + // modules/rbac.py:137 + // assert role_address in self.trustee, err.INVALID_ROLE_ADDRESS + bytec 32 // 0x52235472757374656523 + dig 2 + concat + dup + box_len + bury 1 + assert // Invalid account role address + // modules/rbac.py:138 + // del self.trustee[role_address] + box_del + pop + // modules/rbac.py:238 + // self._delete_role(role_id.as_uint64(), role_address) + b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 + +rbac_revoke_role_after_if_else@7: + // modules/rbac.py:140 + // if role_id == UInt64(enums.ROLE_AUTHORITY): + dup + pushint 70 + == + bz rbac_revoke_role_after_if_else@9 + // modules/rbac.py:141 + // assert role_address in self.authority, err.INVALID_ROLE_ADDRESS + bytec 21 // 0x5223417574686f7269747923 + dig 2 + concat + dup + box_len + bury 1 + assert // Invalid account role address + // modules/rbac.py:142 + // del self.authority[role_address] + box_del + pop + // modules/rbac.py:238 + // self._delete_role(role_id.as_uint64(), role_address) + b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 + +rbac_revoke_role_after_if_else@9: + // modules/rbac.py:144 + // if role_id == UInt64(enums.ROLE_OBSERVER): + dup + pushint 80 + == + bz rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 + // modules/rbac.py:145 + // assert role_address in self.observer, err.INVALID_ROLE_ADDRESS + bytec 24 // 0x52234f6273657276657223 + dig 2 + concat + dup + box_len + bury 1 + assert // Invalid account role address + // modules/rbac.py:146 + // del self.observer[role_address] + box_del + pop + b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 + + +// modules.rbac.RbacModule.rbac_gov_asset_suspension[routing]() -> void: +rbac_gov_asset_suspension: + // modules/rbac.py:241 + // @arc4.abimethod # TODO: Update specs and add test + txna ApplicationArgs 1 + dup + len + intc_1 // 1 + == + assert // invalid number of bytes for arc4.bool + intc_0 // 0 + getbit + // modules/rbac.py:77 + // assert self._role_is_active(self.authority, Txn.sender), err.UNAUTHORIZED + bytec 21 // 0x5223417574686f7269747923 + txn Sender + callsub _role_is_active + assert // Not authorized + // modules/rbac.py:257 + // self.asset_suspended = suspended + bytec 33 // "asset_suspended" + swap + app_global_put + // modules/rbac.py:258 + // return Global.latest_timestamp + global LatestTimestamp + // modules/rbac.py:241 + // @arc4.abimethod # TODO: Update specs and add test + itob + bytec_0 // 0x151f7c75 + swap + concat + log + intc_1 // 1 + return + + +// modules.rbac.RbacModule.rbac_get_arranger[routing]() -> void: +rbac_get_arranger: + // modules/rbac.py:268 + // return self.arranger.value + intc_0 // 0 + bytec 18 // 0x5223417272616e67657223 + app_global_get_ex + assert // check self.arranger exists + // modules/rbac.py:260 + // @arc4.abimethod(readonly=True) + bytec_0 // 0x151f7c75 + swap + concat + log + intc_1 // 1 + return + + +// modules.rbac.RbacModule.rbac_get_address_roles[routing]() -> void: +rbac_get_address_roles: + // modules/rbac.py:270 + // @arc4.abimethod(readonly=True) + txna ApplicationArgs 1 + dup + len + intc_3 // 32 + == + assert // invalid number of bytes for arc4.static_array + // modules/rbac.py:284 + // self._role_is_active(self.account_manager, address), + bytec 23 // 0x52234163636f756e744d616e6167657223 + dig 1 + callsub _role_is_active + // modules/rbac.py:285 + // self._role_is_active(self.primary_dealer, address), + bytec 22 // 0x52235072696d6172794465616c657223 + dig 2 + callsub _role_is_active + // modules/rbac.py:286 + // self._role_is_active(self.trustee, address), + bytec 32 // 0x52235472757374656523 + dig 3 + callsub _role_is_active + // modules/rbac.py:287 + // self._role_is_active(self.authority, address), + bytec 21 // 0x5223417574686f7269747923 + dig 4 + callsub _role_is_active + // modules/rbac.py:288 + // self._role_is_active(self.observer, address), + bytec 24 // 0x52234f6273657276657223 + uncover 5 + callsub _role_is_active + // modules/rbac.py:270 + // @arc4.abimethod(readonly=True) + bytec 40 // 0x00 + intc_0 // 0 + uncover 6 + setbit + intc_1 // 1 + uncover 5 + setbit + pushint 2 + uncover 4 + setbit + pushint 3 + uncover 3 + setbit + pushint 4 + uncover 2 + setbit + bytec_0 // 0x151f7c75 + swap + concat + log + intc_1 // 1 + return + + +// modules.rbac.RbacModule.rbac_get_role_validity[routing]() -> void: +rbac_get_role_validity: + // modules/rbac.py:291 + // @arc4.abimethod(readonly=True) + txna ApplicationArgs 1 + dup + len + intc_1 // 1 + == + assert // invalid number of bytes for arc4.uint8 + txna ApplicationArgs 2 + dup + cover 2 + len + intc_3 // 32 + == + assert // invalid number of bytes for arc4.static_array + // modules/rbac.py:305 + // role = role_id.as_uint64() + btoi + // modules/rbac.py:306 + // self._assert_valid_role(role) + dup + callsub _assert_valid_role + // modules/rbac.py:308 + // case UInt64(enums.ROLE_ARRANGER): + pushints 20 40 50 60 70 80 + // modules/rbac.py:307-338 + // match role: + // case UInt64(enums.ROLE_ARRANGER): + // return typ.RoleValidity( + // role_validity_start=UInt64(0), role_validity_end=UInt64(0) + // ) + // case UInt64(enums.ROLE_ACCOUNT_MANAGER): + // assert self._has_role( + // self.account_manager, role_address + // ), err.INVALID_ROLE_ADDRESS + // return self.account_manager[role_address] + // case UInt64(enums.ROLE_PRIMARY_DEALER): + // assert self._has_role( + // self.primary_dealer, role_address + // ), err.INVALID_ROLE_ADDRESS + // return self.primary_dealer[role_address] + // case UInt64(enums.ROLE_TRUSTEE): + // assert self._has_role( + // self.trustee, role_address + // ), err.INVALID_ROLE_ADDRESS + // return self.trustee[role_address] + // case UInt64(enums.ROLE_AUTHORITY): + // assert self._has_role( + // self.authority, role_address + // ), err.INVALID_ROLE_ADDRESS + // return self.authority[role_address] + // case UInt64(enums.ROLE_OBSERVER): + // assert self._has_role( + // self.observer, role_address + // ), err.INVALID_ROLE_ADDRESS + // return self.observer[role_address] + // case _: + // op.err(err.INVALID_ROLE) + uncover 6 + match rbac_get_role_validity_switch_case_0@2 rbac_get_role_validity_switch_case_1@3 rbac_get_role_validity_switch_case_2@4 rbac_get_role_validity_switch_case_3@5 rbac_get_role_validity_switch_case_4@6 rbac_get_role_validity_switch_case_5@7 + // modules/rbac.py:338 + // op.err(err.INVALID_ROLE) + err // Invalid role identifier + +rbac_get_role_validity_switch_case_5@7: + // modules/rbac.py:334 + // self.observer, role_address + bytec 24 // 0x52234f6273657276657223 + // modules/rbac.py:55 + // return role_address in role_map + dig 1 + concat + dup + box_len + bury 1 + // modules/rbac.py:333-335 + // assert self._has_role( + // self.observer, role_address + // ), err.INVALID_ROLE_ADDRESS + assert // Invalid account role address + // modules/rbac.py:336 + // return self.observer[role_address] + box_get + pop + +rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9: + // modules/rbac.py:291 + // @arc4.abimethod(readonly=True) + bytec_0 // 0x151f7c75 + swap + concat + log + intc_1 // 1 + return + +rbac_get_role_validity_switch_case_4@6: + // modules/rbac.py:329 + // self.authority, role_address + bytec 21 // 0x5223417574686f7269747923 + // modules/rbac.py:55 + // return role_address in role_map + dig 1 + concat + dup + box_len + bury 1 + // modules/rbac.py:328-330 + // assert self._has_role( + // self.authority, role_address + // ), err.INVALID_ROLE_ADDRESS + assert // Invalid account role address + // modules/rbac.py:331 + // return self.authority[role_address] + box_get + pop + // modules/rbac.py:291 + // @arc4.abimethod(readonly=True) + b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9 + +rbac_get_role_validity_switch_case_3@5: + // modules/rbac.py:324 + // self.trustee, role_address + bytec 32 // 0x52235472757374656523 + // modules/rbac.py:55 + // return role_address in role_map + dig 1 + concat + dup + box_len + bury 1 + // modules/rbac.py:323-325 + // assert self._has_role( + // self.trustee, role_address + // ), err.INVALID_ROLE_ADDRESS + assert // Invalid account role address + // modules/rbac.py:326 + // return self.trustee[role_address] + box_get + pop + // modules/rbac.py:291 + // @arc4.abimethod(readonly=True) + b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9 + +rbac_get_role_validity_switch_case_2@4: + // modules/rbac.py:319 + // self.primary_dealer, role_address + bytec 22 // 0x52235072696d6172794465616c657223 + // modules/rbac.py:55 + // return role_address in role_map + dig 1 + concat + dup + box_len + bury 1 + // modules/rbac.py:318-320 + // assert self._has_role( + // self.primary_dealer, role_address + // ), err.INVALID_ROLE_ADDRESS + assert // Invalid account role address + // modules/rbac.py:321 + // return self.primary_dealer[role_address] + box_get + pop + // modules/rbac.py:291 + // @arc4.abimethod(readonly=True) + b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9 + +rbac_get_role_validity_switch_case_1@3: + // modules/rbac.py:314 + // self.account_manager, role_address + bytec 23 // 0x52234163636f756e744d616e6167657223 + // modules/rbac.py:55 + // return role_address in role_map + dig 1 + concat + dup + box_len + bury 1 + // modules/rbac.py:313-315 + // assert self._has_role( + // self.account_manager, role_address + // ), err.INVALID_ROLE_ADDRESS + assert // Invalid account role address + // modules/rbac.py:316 + // return self.account_manager[role_address] + box_get + pop + // modules/rbac.py:291 + // @arc4.abimethod(readonly=True) + b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9 + +rbac_get_role_validity_switch_case_0@2: + // modules/rbac.py:309-311 + // return typ.RoleValidity( + // role_validity_start=UInt64(0), role_validity_end=UInt64(0) + // ) + pushbytes 0x00000000000000000000000000000000 + // modules/rbac.py:291 + // @arc4.abimethod(readonly=True) + b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9 + + +// modules.accounting.AccountingModule._assert_is_not_account_suspended(holding_address: bytes) -> void: +_assert_is_not_account_suspended: + // modules/accounting.py:26 + // def _assert_is_not_account_suspended(self, holding_address: Account) -> None: + proto 1 0 + // modules/accounting.py:28 + // assert not self.account[holding_address].suspended, err.SUSPENDED + bytec 8 // 0x52234163636f756e7423 + frame_dig -1 + concat + box_get + assert // check self.account entry exists + pushint 384 + getbit + ! + assert // Suspended operations + retsub + + +// modules.accounting.AccountingModule._settle_position(holding_address: bytes) -> uint64, uint64: +_settle_position: + // modules/accounting.py:44 + // def _settle_position(self, holding_address: Account) -> tuple[UInt64, UInt64]: + proto 1 2 + // modules/accounting.py:24 + // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS + bytec 8 // 0x52234163636f756e7423 + frame_dig -1 + concat + dup + box_len + bury 1 + assert // Invalid account holding address + // modules/accounting.py:61 + // position = self.account[holding_address].copy() + dup + box_get + pop + // modules/accounting.py:63-65 + // # Compute the incremental per-unit fixed-point interest and principal accrued + // # since this account's last checkpoint. + // interest_delta = self.cumulative_interest_index - position.interest_checkpoint + intc_0 // 0 + bytec 16 // "cumulative_interest_index" + app_global_get_ex + assert // check self.cumulative_interest_index exists + dig 1 + pushint 57 + extract_uint64 + - + // modules/accounting.py:67 + // self.cumulative_principal_index - position.principal_checkpoint + intc_0 // 0 + bytec 17 // "cumulative_principal_index" + app_global_get_ex + assert // check self.cumulative_principal_index exists + dig 2 + pushint 65 + extract_uint64 + - + // modules/accounting.py:73 + // interest_delta, position.units, self.fixed_point_scale + dig 2 + intc_3 // 32 + extract_uint64 + intc_0 // 0 + bytec 5 // "fixed_point_scale" + app_global_get_ex + assert // check self.fixed_point_scale exists + // modules/accounting.py:70-74 + // # Convert the per-unit fixed-point deltas into absolute claimable amounts + // # using the account's active units. + // claimable_interest = self._scaled_mul_div( + // interest_delta, position.units, self.fixed_point_scale + // ) + uncover 3 + dig 2 + uncover 2 + callsub _scaled_mul_div + // modules/accounting.py:76 + // principal_delta, position.units, self.fixed_point_scale + intc_0 // 0 + bytec 5 // "fixed_point_scale" + app_global_get_ex + assert // check self.fixed_point_scale exists + // modules/accounting.py:75-77 + // claimable_principal = self._scaled_mul_div( + // principal_delta, position.units, self.fixed_point_scale + // ) + uncover 3 + uncover 3 + uncover 2 + callsub _scaled_mul_div + // modules/accounting.py:79-81 + // # Accrue the claimable amounts to the account position and make them available + // # for withdrawal. + // position.claimable_interest += claimable_interest + dig 2 + pushint 73 + extract_uint64 + dig 2 + + + itob + uncover 3 + swap + replace2 73 + // modules/accounting.py:82 + // position.claimable_principal += claimable_principal + dup + pushint 81 + extract_uint64 + dig 2 + + + itob + replace2 81 + // modules/accounting.py:84-86 + // # Advance the account's per-unit fixed-point checkpoints to the current global + // # per-unit fixed-point global indices. + // position.interest_checkpoint = self.cumulative_interest_index + intc_0 // 0 + bytec 16 // "cumulative_interest_index" + app_global_get_ex + assert // check self.cumulative_interest_index exists + itob + replace2 57 + // modules/accounting.py:87 + // position.principal_checkpoint = self.cumulative_principal_index + intc_0 // 0 + bytec 17 // "cumulative_principal_index" + app_global_get_ex + assert // check self.cumulative_principal_index exists + itob + replace2 65 + // modules/accounting.py:89-90 + // # Advance the account's event cursor to the current global event cursor. + // position.settled_cursor = self.event_cursor + intc_0 // 0 + bytec_2 // "event_cursor" + app_global_get_ex + assert // check self.event_cursor exists + itob + replace2 49 + // modules/accounting.py:92-94 + // # Update the account position and return the newly accrued claimable amounts + // # added to the total position's claimable amounts. + // self.account[holding_address] = position.copy() + uncover 3 + swap + box_put + // modules/accounting.py:95 + // return claimable_interest, claimable_principal + retsub + + +// modules.accounting.AccountingModule._ensure_units_activated(holding_address: bytes) -> void: +_ensure_units_activated: + // modules/accounting.py:97 + // def _ensure_units_activated(self, holding_address: Account) -> None: + proto 1 0 + intc_0 // 0 + pushbytes "" + // modules/accounting.py:24 + // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS + bytec 8 // 0x52234163636f756e7423 + frame_dig -1 + concat + dup + box_len + bury 1 + assert // Invalid account holding address + // modules/kernel.py:135 + // return self.status == UInt64(enums.STATUS_PENDING_IED) + intc_0 // 0 + bytec_1 // "status" + app_global_get_ex + assert // check self.status exists + pushint 50 + == + // modules/accounting.py:100 + // if self._status_is_pending_ied(): + bz _ensure_units_activated_after_if_else@2 + // modules/accounting.py:101 + // return + retsub + +_ensure_units_activated_after_if_else@2: + // modules/accounting.py:103 + // position = self.account[holding_address].copy() + frame_dig 2 + box_get + swap + dup + cover 2 + frame_bury 0 + assert // check self.account entry exists + // modules/accounting.py:104 + // if position.reserved_units == UInt64(0): + pushint 40 + extract_uint64 + dup + frame_bury 1 + bnz _ensure_units_activated_after_if_else@4 + // modules/accounting.py:105 + // return + retsub + +_ensure_units_activated_after_if_else@4: + // modules/accounting.py:108 + // position.units += activated_units + frame_dig 0 + dup + intc_3 // 32 + extract_uint64 + frame_dig 1 + dup + cover 3 + + + itob + replace2 32 + // modules/accounting.py:109 + // position.reserved_units = UInt64(0) + intc_0 // 0 + itob + replace2 40 + // modules/accounting.py:110 + // self.account[holding_address] = position.copy() + frame_dig 2 + swap + box_put + // modules/accounting.py:111 + // assert self.reserved_units_total >= activated_units, err.OVER_DISTRIBUTION + intc_0 // 0 + bytec 10 // "reserved_units_total" + app_global_get_ex + assert // check self.reserved_units_total exists + dup + dig 2 + >= + assert // Insufficient remaining D-ASA units + // modules/accounting.py:112 + // self.reserved_units_total -= activated_units + swap + - + bytec 10 // "reserved_units_total" + swap + app_global_put + retsub + + +// modules.kernel.ActusKernelModule._scaled_mul_div(multiplicand: uint64, multiplier: uint64, divisor: uint64) -> uint64: +_scaled_mul_div: + // modules/kernel.py:153-155 + // def _scaled_mul_div( + // self, multiplicand: UInt64, multiplier: UInt64, divisor: UInt64 + // ) -> UInt64: + proto 3 1 + // modules/kernel.py:157 + // if multiplicand == UInt64(0) or multiplier == UInt64(0): + frame_dig -3 + bz _scaled_mul_div_if_body@2 + frame_dig -2 + bnz _scaled_mul_div_after_if_else@3 + +_scaled_mul_div_if_body@2: + // modules/kernel.py:158 + // return UInt64(0) + intc_0 // 0 + retsub + +_scaled_mul_div_after_if_else@3: + // modules/kernel.py:159 + // high, low = op.mulw(multiplicand, multiplier) + frame_dig -3 + frame_dig -2 + mulw + // modules/kernel.py:160 + // return op.divw(high, low, divisor) + frame_dig -1 + divw + retsub + + +// modules.kernel.ActusKernelModule._amount_to_index_delta(amount: uint64) -> uint64: +_amount_to_index_delta: + // modules/kernel.py:162 + // def _amount_to_index_delta(self, amount: UInt64) -> UInt64: + proto 1 1 + // modules/kernel.py:164 + // if amount == UInt64(0): + frame_dig -1 + bnz _amount_to_index_delta_after_if_else@2 + // modules/kernel.py:165 + // return UInt64(0) + intc_0 // 0 + retsub + +_amount_to_index_delta_after_if_else@2: + // modules/kernel.py:166 + // assert self.total_units > UInt64(0), err.NO_UNITS + intc_0 // 0 + bytec 13 // "total_units" + app_global_get_ex + assert // check self.total_units exists + dup + assert // No D-ASA units + // modules/kernel.py:167 + // return self._scaled_mul_div(amount, self.fixed_point_scale, self.total_units) + intc_0 // 0 + bytec 5 // "fixed_point_scale" + app_global_get_ex + assert // check self.fixed_point_scale exists + frame_dig -1 + swap + uncover 2 + callsub _scaled_mul_div + retsub + + +// modules.kernel.ActusKernelModule._index_delta_to_amount(index_delta: uint64) -> uint64: +_index_delta_to_amount: + // modules/kernel.py:169 + // def _index_delta_to_amount(self, index_delta: UInt64) -> UInt64: + proto 1 1 + // modules/kernel.py:176 + // if index_delta == UInt64(0): + frame_dig -1 + bnz _index_delta_to_amount_after_if_else@2 + // modules/kernel.py:177 + // return UInt64(0) + intc_0 // 0 + retsub + +_index_delta_to_amount_after_if_else@2: + // modules/kernel.py:179 + // self.total_units, + intc_0 // 0 + bytec 13 // "total_units" + app_global_get_ex + assert // check self.total_units exists + // modules/kernel.py:181 + // self.fixed_point_scale, + intc_0 // 0 + bytec 5 // "fixed_point_scale" + app_global_get_ex + assert // check self.fixed_point_scale exists + // modules/kernel.py:178-182 + // return self._scaled_mul_div( + // self.total_units, + // index_delta, + // self.fixed_point_scale, + // ) + frame_dig -1 + swap + callsub _scaled_mul_div + retsub + + +// modules.kernel.ActusKernelModule._get_schedule_entry(event_id: uint64) -> bytes: +_get_schedule_entry: + // modules/kernel.py:202 + // def _get_schedule_entry(self, event_id: UInt64) -> typ.ExecutionScheduleEntry: + proto 1 1 + // modules/kernel.py:204 + // assert event_id < self.schedule_entry_count, err.INVALID_EVENT_ID + intc_0 // 0 + bytec 4 // "schedule_entry_count" + app_global_get_ex + assert // check self.schedule_entry_count exists + frame_dig -1 + > + assert // Invalid event id + // modules/kernel.py:190 + // return event_id // UInt64(cst.SCHEDULE_PAGE_SIZE) + frame_dig -1 + pushint 16 + / + // modules/kernel.py:206 + // assert page_index in self.schedule_page, err.INVALID_SCHEDULE_PAGE + itob + bytec 31 // 0x5323 + swap + concat + dup + box_len + bury 1 + assert // Invalid schedule page + // modules/kernel.py:194 + // return event_id % UInt64(cst.SCHEDULE_PAGE_SIZE) + frame_dig -1 + pushint 16 + % + // modules/kernel.py:209 + // assert offset < page.length, err.INVALID_SCHEDULE_PAGE + dig 1 + intc_0 // 0 + pushint 2 + box_extract + btoi + dig 1 + > + assert // Invalid schedule page + // modules/kernel.py:210 + // return page[offset].copy() + pushint 65 + * + pushint 2 + + + pushint 65 + box_extract + retsub + + +// modules.kernel.ActusKernelModule._assert_event_allowed_for_contract_type(contract_type: uint64, event_type: uint64) -> void: +_assert_event_allowed_for_contract_type: + // modules/kernel.py:313-315 + // def _assert_event_allowed_for_contract_type( + // self, contract_type: UInt64, event_type: UInt64 + // ) -> None: + proto 2 0 + // modules/kernel.py:254-255 + // # Check common events first + // if event_type in common_events: + frame_dig -1 + // modules/kernel.py:247 + // UInt64(enums.EVT_IED), + intc_1 // 1 + // modules/kernel.py:254-255 + // # Check common events first + // if event_type in common_events: + == + bnz _assert_event_allowed_for_contract_type_if_body@6 + frame_dig -1 + // modules/kernel.py:248 + // UInt64(enums.EVT_IP), + intc_2 // 8 + // modules/kernel.py:254-255 + // # Check common events first + // if event_type in common_events: + == + bnz _assert_event_allowed_for_contract_type_if_body@6 + frame_dig -1 + // modules/kernel.py:249 + // UInt64(enums.EVT_MD), + pushint 19 + // modules/kernel.py:254-255 + // # Check common events first + // if event_type in common_events: + == + bnz _assert_event_allowed_for_contract_type_if_body@6 + frame_dig -1 + // modules/kernel.py:250 + // UInt64(enums.EVT_RR), + pushint 12 + // modules/kernel.py:254-255 + // # Check common events first + // if event_type in common_events: + == + bnz _assert_event_allowed_for_contract_type_if_body@6 + frame_dig -1 + // modules/kernel.py:251 + // UInt64(enums.EVT_RRF), + pushint 11 + // modules/kernel.py:254-255 + // # Check common events first + // if event_type in common_events: + == + bz _assert_event_allowed_for_contract_type_after_if_else@7 + +_assert_event_allowed_for_contract_type_if_body@6: + // modules/kernel.py:256 + // return True + intc_1 // 1 + +_assert_event_allowed_for_contract_type_after_inlined_modules.kernel.ActusKernelModule._event_allowed_for_contract_type@34: + // modules/kernel.py:317-319 + // assert self._event_allowed_for_contract_type( + // contract_type, event_type + // ), err.INVALID_ACTUS_CONFIG + assert // Invalid ACTUS configuration + retsub + +_assert_event_allowed_for_contract_type_after_if_else@7: + // modules/kernel.py:258-259 + // # Contract-specific additional events + // if contract_type == UInt64(enums.CT_PAM): + frame_dig -2 + bnz _assert_event_allowed_for_contract_type_after_if_else@9 + // modules/kernel.py:260-261 + // # PAM only supports common events + // return False + intc_0 // 0 + // modules/kernel.py:317-319 + // assert self._event_allowed_for_contract_type( + // contract_type, event_type + // ), err.INVALID_ACTUS_CONFIG + b _assert_event_allowed_for_contract_type_after_inlined_modules.kernel.ActusKernelModule._event_allowed_for_contract_type@34 + +_assert_event_allowed_for_contract_type_after_if_else@9: + // modules/kernel.py:263 + // if contract_type == UInt64(enums.CT_LAM) or contract_type == UInt64( + frame_dig -2 + pushint 3 + == + // modules/kernel.py:263-265 + // if contract_type == UInt64(enums.CT_LAM) or contract_type == UInt64( + // enums.CT_NAM + // ): + bnz _assert_event_allowed_for_contract_type_if_body@11 + frame_dig -2 + pushint 2 + == + bz _assert_event_allowed_for_contract_type_after_if_else@16 + +_assert_event_allowed_for_contract_type_if_body@11: + // modules/kernel.py:266-270 + // # LAM/NAM add: PR, IPCB + // return event_type in ( + // UInt64(enums.EVT_PR), + // UInt64(enums.EVT_IPCB), + // ) + frame_dig -1 + // modules/kernel.py:268 + // UInt64(enums.EVT_PR), + pushint 3 + // modules/kernel.py:266-270 + // # LAM/NAM add: PR, IPCB + // return event_type in ( + // UInt64(enums.EVT_PR), + // UInt64(enums.EVT_IPCB), + // ) + == + bnz _assert_event_allowed_for_contract_type_bool_true@13 + frame_dig -1 + // modules/kernel.py:269 + // UInt64(enums.EVT_IPCB), + pushint 18 + // modules/kernel.py:266-270 + // # LAM/NAM add: PR, IPCB + // return event_type in ( + // UInt64(enums.EVT_PR), + // UInt64(enums.EVT_IPCB), + // ) + == + bz _assert_event_allowed_for_contract_type_bool_false@14 + +_assert_event_allowed_for_contract_type_bool_true@13: + intc_1 // 1 + // modules/kernel.py:317-319 + // assert self._event_allowed_for_contract_type( + // contract_type, event_type + // ), err.INVALID_ACTUS_CONFIG + b _assert_event_allowed_for_contract_type_after_inlined_modules.kernel.ActusKernelModule._event_allowed_for_contract_type@34 + +_assert_event_allowed_for_contract_type_bool_false@14: + intc_0 // 0 + // modules/kernel.py:317-319 + // assert self._event_allowed_for_contract_type( + // contract_type, event_type + // ), err.INVALID_ACTUS_CONFIG + b _assert_event_allowed_for_contract_type_after_inlined_modules.kernel.ActusKernelModule._event_allowed_for_contract_type@34 + +_assert_event_allowed_for_contract_type_after_if_else@16: + // modules/kernel.py:272 + // if contract_type == UInt64(enums.CT_ANN): + frame_dig -2 + intc_1 // 1 + == + bz _assert_event_allowed_for_contract_type_after_if_else@23 + // modules/kernel.py:273-278 + // # ANN adds: PR, IPCB, PRF + // return event_type in ( + // UInt64(enums.EVT_PR), + // UInt64(enums.EVT_IPCB), + // UInt64(enums.EVT_PRF), + // ) + frame_dig -1 + // modules/kernel.py:275 + // UInt64(enums.EVT_PR), + pushint 3 + // modules/kernel.py:273-278 + // # ANN adds: PR, IPCB, PRF + // return event_type in ( + // UInt64(enums.EVT_PR), + // UInt64(enums.EVT_IPCB), + // UInt64(enums.EVT_PRF), + // ) + == + bnz _assert_event_allowed_for_contract_type_bool_true@20 + frame_dig -1 + // modules/kernel.py:276 + // UInt64(enums.EVT_IPCB), + pushint 18 + // modules/kernel.py:273-278 + // # ANN adds: PR, IPCB, PRF + // return event_type in ( + // UInt64(enums.EVT_PR), + // UInt64(enums.EVT_IPCB), + // UInt64(enums.EVT_PRF), + // ) + == + bnz _assert_event_allowed_for_contract_type_bool_true@20 + frame_dig -1 + // modules/kernel.py:277 + // UInt64(enums.EVT_PRF), + pushint 5 + // modules/kernel.py:273-278 + // # ANN adds: PR, IPCB, PRF + // return event_type in ( + // UInt64(enums.EVT_PR), + // UInt64(enums.EVT_IPCB), + // UInt64(enums.EVT_PRF), + // ) + == + bz _assert_event_allowed_for_contract_type_bool_false@21 + +_assert_event_allowed_for_contract_type_bool_true@20: + intc_1 // 1 + // modules/kernel.py:317-319 + // assert self._event_allowed_for_contract_type( + // contract_type, event_type + // ), err.INVALID_ACTUS_CONFIG + b _assert_event_allowed_for_contract_type_after_inlined_modules.kernel.ActusKernelModule._event_allowed_for_contract_type@34 + +_assert_event_allowed_for_contract_type_bool_false@21: + intc_0 // 0 + // modules/kernel.py:317-319 + // assert self._event_allowed_for_contract_type( + // contract_type, event_type + // ), err.INVALID_ACTUS_CONFIG + b _assert_event_allowed_for_contract_type_after_inlined_modules.kernel.ActusKernelModule._event_allowed_for_contract_type@34 + +_assert_event_allowed_for_contract_type_after_if_else@23: + // modules/kernel.py:280 + // if contract_type == UInt64(enums.CT_LAX): + frame_dig -2 + pushint 4 + == + bz _assert_event_allowed_for_contract_type_after_if_else@31 + // modules/kernel.py:281-287 + // # LAX adds: PR, PI, IPCB, PRF + // return event_type in ( + // UInt64(enums.EVT_PR), + // UInt64(enums.EVT_PI), + // UInt64(enums.EVT_IPCB), + // UInt64(enums.EVT_PRF), + // ) + frame_dig -1 + // modules/kernel.py:283 + // UInt64(enums.EVT_PR), + pushint 3 + // modules/kernel.py:281-287 + // # LAX adds: PR, PI, IPCB, PRF + // return event_type in ( + // UInt64(enums.EVT_PR), + // UInt64(enums.EVT_PI), + // UInt64(enums.EVT_IPCB), + // UInt64(enums.EVT_PRF), + // ) + == + bnz _assert_event_allowed_for_contract_type_bool_true@28 + frame_dig -1 + // modules/kernel.py:284 + // UInt64(enums.EVT_PI), + pushint 4 + // modules/kernel.py:281-287 + // # LAX adds: PR, PI, IPCB, PRF + // return event_type in ( + // UInt64(enums.EVT_PR), + // UInt64(enums.EVT_PI), + // UInt64(enums.EVT_IPCB), + // UInt64(enums.EVT_PRF), + // ) + == + bnz _assert_event_allowed_for_contract_type_bool_true@28 + frame_dig -1 + // modules/kernel.py:285 + // UInt64(enums.EVT_IPCB), + pushint 18 + // modules/kernel.py:281-287 + // # LAX adds: PR, PI, IPCB, PRF + // return event_type in ( + // UInt64(enums.EVT_PR), + // UInt64(enums.EVT_PI), + // UInt64(enums.EVT_IPCB), + // UInt64(enums.EVT_PRF), + // ) + == + bnz _assert_event_allowed_for_contract_type_bool_true@28 + frame_dig -1 + // modules/kernel.py:286 + // UInt64(enums.EVT_PRF), + pushint 5 + // modules/kernel.py:281-287 + // # LAX adds: PR, PI, IPCB, PRF + // return event_type in ( + // UInt64(enums.EVT_PR), + // UInt64(enums.EVT_PI), + // UInt64(enums.EVT_IPCB), + // UInt64(enums.EVT_PRF), + // ) + == + bz _assert_event_allowed_for_contract_type_bool_false@29 + +_assert_event_allowed_for_contract_type_bool_true@28: + intc_1 // 1 + // modules/kernel.py:317-319 + // assert self._event_allowed_for_contract_type( + // contract_type, event_type + // ), err.INVALID_ACTUS_CONFIG + b _assert_event_allowed_for_contract_type_after_inlined_modules.kernel.ActusKernelModule._event_allowed_for_contract_type@34 + +_assert_event_allowed_for_contract_type_bool_false@29: + intc_0 // 0 + // modules/kernel.py:317-319 + // assert self._event_allowed_for_contract_type( + // contract_type, event_type + // ), err.INVALID_ACTUS_CONFIG + b _assert_event_allowed_for_contract_type_after_inlined_modules.kernel.ActusKernelModule._event_allowed_for_contract_type@34 + +_assert_event_allowed_for_contract_type_after_if_else@31: + // modules/kernel.py:289 + // if contract_type == UInt64(enums.CT_CLM): + frame_dig -2 + pushint 5 + == + bz _assert_event_allowed_for_contract_type_after_if_else@33 + // modules/kernel.py:290-291 + // # CLM adds: PR + // return event_type == UInt64(enums.EVT_PR) + frame_dig -1 + pushint 3 + == + // modules/kernel.py:317-319 + // assert self._event_allowed_for_contract_type( + // contract_type, event_type + // ), err.INVALID_ACTUS_CONFIG + b _assert_event_allowed_for_contract_type_after_inlined_modules.kernel.ActusKernelModule._event_allowed_for_contract_type@34 + +_assert_event_allowed_for_contract_type_after_if_else@33: + // modules/kernel.py:293 + // return False + intc_0 // 0 + // modules/kernel.py:317-319 + // assert self._event_allowed_for_contract_type( + // contract_type, event_type + // ), err.INVALID_ACTUS_CONFIG + b _assert_event_allowed_for_contract_type_after_inlined_modules.kernel.ActusKernelModule._event_allowed_for_contract_type@34 + + +// modules.kernel.ActusKernelModule._is_dynamic_annuity() -> uint64: +_is_dynamic_annuity: + // modules/kernel.py:335 + // self.contract_type == UInt64(enums.CT_ANN) + intc_0 // 0 + bytec 12 // "contract_type" + app_global_get_ex + assert // check self.contract_type exists + intc_1 // 1 + == + // modules/kernel.py:335-336 + // self.contract_type == UInt64(enums.CT_ANN) + // and self.dynamic_principal_redemption + bz _is_dynamic_annuity_bool_false@3 + // modules/kernel.py:336 + // and self.dynamic_principal_redemption + intc_0 // 0 + bytec 34 // "dynamic_principal_redemption" + app_global_get_ex + assert // check self.dynamic_principal_redemption exists + // modules/kernel.py:335-336 + // self.contract_type == UInt64(enums.CT_ANN) + // and self.dynamic_principal_redemption + bz _is_dynamic_annuity_bool_false@3 + intc_1 // 1 + // modules/kernel.py:334-337 + // return ( + // self.contract_type == UInt64(enums.CT_ANN) + // and self.dynamic_principal_redemption + // ) + retsub + +_is_dynamic_annuity_bool_false@3: + intc_0 // 0 + // modules/kernel.py:334-337 + // return ( + // self.contract_type == UInt64(enums.CT_ANN) + // and self.dynamic_principal_redemption + // ) + retsub + + +// modules.kernel.ActusKernelModule._entry_interest_segment(entry: bytes) -> uint64, bytes: +_entry_interest_segment: + // modules/kernel.py:380 + // def _entry_interest_segment(self, entry: typ.ExecutionScheduleEntry) -> UInt64: + proto 1 2 + // modules/kernel.py:389 + // entry.accrual_factor == UInt64(0) + frame_dig -1 + pushint 17 + extract_uint64 + dup + // modules/kernel.py:389-391 + // entry.accrual_factor == UInt64(0) + // or self.nominal_interest_rate == UInt64(0) + // or self.interest_calculation_base == UInt64(0) + bz _entry_interest_segment_if_body@3 + // modules/kernel.py:390 + // or self.nominal_interest_rate == UInt64(0) + intc_0 // 0 + bytec 9 // "nominal_interest_rate" + app_global_get_ex + assert // check self.nominal_interest_rate exists + // modules/kernel.py:389-391 + // entry.accrual_factor == UInt64(0) + // or self.nominal_interest_rate == UInt64(0) + // or self.interest_calculation_base == UInt64(0) + bz _entry_interest_segment_if_body@3 + // modules/kernel.py:391 + // or self.interest_calculation_base == UInt64(0) + intc_0 // 0 + bytec 7 // "interest_calculation_base" + app_global_get_ex + assert // check self.interest_calculation_base exists + // modules/kernel.py:389-391 + // entry.accrual_factor == UInt64(0) + // or self.nominal_interest_rate == UInt64(0) + // or self.interest_calculation_base == UInt64(0) + bnz _entry_interest_segment_after_if_else@4 + +_entry_interest_segment_if_body@3: + // modules/kernel.py:393 + // return UInt64(0) + intc_0 // 0 + frame_dig -1 + uncover 2 + retsub + +_entry_interest_segment_after_if_else@4: + // modules/kernel.py:395 + // self.interest_calculation_base, + intc_0 // 0 + bytec 7 // "interest_calculation_base" + app_global_get_ex + assert // check self.interest_calculation_base exists + // modules/kernel.py:396 + // self.nominal_interest_rate, + intc_0 // 0 + bytec 9 // "nominal_interest_rate" + app_global_get_ex + assert // check self.nominal_interest_rate exists + // modules/kernel.py:397 + // self.fixed_point_scale, + intc_0 // 0 + bytec 5 // "fixed_point_scale" + app_global_get_ex + assert // check self.fixed_point_scale exists + // modules/kernel.py:394-398 + // accrued = self._scaled_mul_div( + // self.interest_calculation_base, + // self.nominal_interest_rate, + // self.fixed_point_scale, + // ) + callsub _scaled_mul_div + // modules/kernel.py:402 + // self.fixed_point_scale, + intc_0 // 0 + bytec 5 // "fixed_point_scale" + app_global_get_ex + assert // check self.fixed_point_scale exists + // modules/kernel.py:399-403 + // return self._scaled_mul_div( + // accrued, + // entry.accrual_factor, + // self.fixed_point_scale, + // ) + frame_dig 0 + swap + callsub _scaled_mul_div + frame_dig -1 + uncover 2 + retsub + + +// modules.kernel.ActusKernelModule._discount_annuity_factor(discount_factor: uint64, redemption_factor: uint64) -> uint64: +_discount_annuity_factor: + // modules/kernel.py:462-466 + // def _discount_annuity_factor( + // self, + // discount_factor: UInt64, + // redemption_factor: UInt64, + // ) -> UInt64: + proto 2 1 + // modules/kernel.py:468 + // if redemption_factor == UInt64(0): + frame_dig -1 + bnz _discount_annuity_factor_after_if_else@2 + // modules/kernel.py:469 + // return discount_factor + frame_dig -2 + retsub + +_discount_annuity_factor_after_if_else@2: + // modules/kernel.py:470 + // period_rate = self.fixed_point_scale + self._scaled_mul_div( + intc_0 // 0 + bytec 5 // "fixed_point_scale" + app_global_get_ex + assert // check self.fixed_point_scale exists + // modules/kernel.py:471 + // self.nominal_interest_rate, + intc_0 // 0 + bytec 9 // "nominal_interest_rate" + app_global_get_ex + assert // check self.nominal_interest_rate exists + // modules/kernel.py:470-474 + // period_rate = self.fixed_point_scale + self._scaled_mul_div( + // self.nominal_interest_rate, + // redemption_factor, + // self.fixed_point_scale, + // ) + frame_dig -1 + dig 2 + callsub _scaled_mul_div + + + // modules/kernel.py:475 + // assert period_rate > UInt64(0), err.INVALID_ACTUS_CONFIG + dup + assert // Invalid ACTUS configuration + // modules/kernel.py:478 + // self.fixed_point_scale, + intc_0 // 0 + bytec 5 // "fixed_point_scale" + app_global_get_ex + assert // check self.fixed_point_scale exists + // modules/kernel.py:476-480 + // return self._scaled_mul_div( + // discount_factor, + // self.fixed_point_scale, + // period_rate, + // ) + frame_dig -2 + swap + uncover 2 + callsub _scaled_mul_div + retsub + + +// modules.kernel.ActusKernelModule._apply_non_cash_schedule_entry(entry: bytes, payload: bytes) -> bytes, bytes: +_apply_non_cash_schedule_entry: + // modules/kernel.py:613-615 + // def _apply_non_cash_schedule_entry( + // self, entry: typ.ExecutionScheduleEntry, payload: typ.ObservedEventRequest + // ) -> None: + proto 2 2 + intc_0 // 0 + pushbytes "" + dupn 8 + // modules/kernel.py:623 + // assert entry.event_id == self.event_cursor, err.INVALID_EVENT_CURSOR + frame_dig -2 + intc_0 // 0 + extract_uint64 + intc_0 // 0 + bytec_2 // "event_cursor" + app_global_get_ex + assert // check self.event_cursor exists + == + assert // Invalid event cursor + // modules/kernel.py:624 + // assert entry.scheduled_time <= Global.latest_timestamp, err.NO_DUE_CASHFLOW + frame_dig -2 + pushint 9 + extract_uint64 + global LatestTimestamp + <= + assert // No due cashflow to pay + // modules/kernel.py:626 + // event_type = entry.event_type.as_uint64() + frame_dig -2 + intc_2 // 8 + getbyte + dup + // modules/kernel.py:627 + // if event_type == UInt64(enums.EVT_IED): + intc_1 // 1 + == + dup + bz _apply_non_cash_schedule_entry_after_if_else@6 + // modules/kernel.py:135 + // return self.status == UInt64(enums.STATUS_PENDING_IED) + intc_0 // 0 + bytec_1 // "status" + app_global_get_ex + assert // check self.status exists + pushint 50 + == + // modules/kernel.py:628-630 + // # IED finalizes issuance: reserved units become activatable and the + // # schedule's initial contractual state becomes live. + // assert self._status_is_pending_ied(), err.INVALID_ACTUS_CONFIG + assert // Invalid ACTUS configuration + // modules/kernel.py:632 + // self.reserved_units_total == self.total_units + intc_0 // 0 + bytec 10 // "reserved_units_total" + app_global_get_ex + assert // check self.reserved_units_total exists + intc_0 // 0 + bytec 13 // "total_units" + app_global_get_ex + assert // check self.total_units exists + == + // modules/kernel.py:631-633 + // assert ( + // self.reserved_units_total == self.total_units + // ), err.PRIMARY_DISTRIBUTION_INCOMPLETE + assert // Primary distribution is not complete + // modules/kernel.py:634 + // self.outstanding_principal = entry.next_outstanding_principal + frame_dig -2 + pushint 49 + extract_uint64 + bytec_3 // "outstanding_principal" + dig 1 + app_global_put + // modules/kernel.py:635 + // self.interest_calculation_base = entry.next_outstanding_principal + bytec 7 // "interest_calculation_base" + swap + app_global_put + // modules/kernel.py:636 + // self.nominal_interest_rate = entry.next_nominal_interest_rate + frame_dig -2 + pushint 33 + extract_uint64 + bytec 9 // "nominal_interest_rate" + swap + app_global_put + // modules/kernel.py:637 + // self.accrued_interest = UInt64(0) + bytec 6 // "accrued_interest" + intc_0 // 0 + app_global_put + // modules/kernel.py:638 + // self.next_principal_redemption = entry.next_principal_redemption + frame_dig -2 + pushint 41 + extract_uint64 + bytec 14 // "next_principal_redemption" + swap + app_global_put + // modules/kernel.py:639 + // self.event_cursor += UInt64(1) + intc_0 // 0 + bytec_2 // "event_cursor" + app_global_get_ex + assert // check self.event_cursor exists + intc_1 // 1 + + + bytec_2 // "event_cursor" + swap + app_global_put + // modules/kernel.py:640 + // self.status = UInt64(enums.STATUS_ACTIVE) + bytec_1 // "status" + pushint 100 + app_global_put + // modules/kernel.py:451 + // assert entry.event_type.as_uint64() == UInt64(enums.EVT_IED), err.NOT_EVT_IED + frame_dig 11 + assert // Not IED event + // modules/kernel.py:452 + // return self.initial_exchange_amount + intc_0 // 0 + bytec 20 // "initial_exchange_amount" + app_global_get_ex + assert // check self.initial_exchange_amount exists + // modules/kernel.py:641-645 + // self._emit_execution_event( + // entry=entry, + // payoff=self._entry_ied_amount(entry), + // settled_amount=UInt64(0), + // ) + frame_dig -2 + swap + // modules/kernel.py:644 + // settled_amount=UInt64(0), + intc_0 // 0 + // modules/kernel.py:641-645 + // self._emit_execution_event( + // entry=entry, + // payoff=self._entry_ied_amount(entry), + // settled_amount=UInt64(0), + // ) + callsub _emit_execution_event + dup + frame_bury -2 + // modules/kernel.py:646 + // return + frame_dig -1 + frame_bury 1 + frame_bury 0 + retsub + +_apply_non_cash_schedule_entry_after_if_else@6: + // modules/kernel.py:135 + // return self.status == UInt64(enums.STATUS_PENDING_IED) + intc_0 // 0 + bytec_1 // "status" + app_global_get_ex + assert // check self.status exists + pushint 50 + == + // modules/kernel.py:147 + // assert not self._status_is_pending_ied(), err.PENDING_IED + ! + assert // IED not yet executed + // modules/kernel.py:649 + // self.accrued_interest += self._entry_interest_segment(entry) + intc_0 // 0 + bytec 6 // "accrued_interest" + app_global_get_ex + assert // check self.accrued_interest exists + frame_dig -2 + callsub _entry_interest_segment + frame_bury -2 + + + bytec 6 // "accrued_interest" + swap + app_global_put + // modules/kernel.py:651 + // if event_type == UInt64(enums.EVT_RR): + frame_dig 10 + pushint 12 + == + bz _apply_non_cash_schedule_entry_else_body@10 + // modules/kernel.py:655 + // payload.observed_rate, + frame_dig -1 + pushint 33 + extract_uint64 + // modules/kernel.py:656 + // self.rate_reset_multiplier, + intc_0 // 0 + bytec 36 // "rate_reset_multiplier" + app_global_get_ex + assert // check self.rate_reset_multiplier exists + // modules/kernel.py:657 + // self.fixed_point_scale, + intc_0 // 0 + bytec 5 // "fixed_point_scale" + app_global_get_ex + assert // check self.fixed_point_scale exists + // modules/kernel.py:652-658 + // # RR derives the next rate from an observed oracle value plus the + // # contract spread / multiplier terms, then enforces floor and cap. + // observed_rate = self._scaled_mul_div( + // payload.observed_rate, + // self.rate_reset_multiplier, + // self.fixed_point_scale, + // ) + callsub _scaled_mul_div + // modules/kernel.py:660 + // observed_rate + self.rate_reset_spread + intc_0 // 0 + bytec 35 // "rate_reset_spread" + app_global_get_ex + assert // check self.rate_reset_spread exists + + + frame_bury 6 + // modules/kernel.py:734 + // if self.has_rate_reset_floor and rate < self.rate_reset_floor: + intc_0 // 0 + bytec 38 // "has_rate_reset_floor" + app_global_get_ex + assert // check self.has_rate_reset_floor exists + bz _apply_non_cash_schedule_entry_after_if_else@55 + intc_0 // 0 + bytec 29 // "rate_reset_floor" + app_global_get_ex + assert // check self.rate_reset_floor exists + frame_dig 6 + > + bz _apply_non_cash_schedule_entry_after_if_else@55 + // modules/kernel.py:735 + // rate = self.rate_reset_floor + intc_0 // 0 + bytec 29 // "rate_reset_floor" + app_global_get_ex + swap + frame_bury 6 + assert // check self.rate_reset_floor exists + +_apply_non_cash_schedule_entry_after_if_else@55: + // modules/kernel.py:736 + // if self.has_rate_reset_cap and rate > self.rate_reset_cap: + intc_0 // 0 + bytec 39 // "has_rate_reset_cap" + app_global_get_ex + assert // check self.has_rate_reset_cap exists + bz _apply_non_cash_schedule_entry_after_if_else@58 + intc_0 // 0 + bytec 30 // "rate_reset_cap" + app_global_get_ex + assert // check self.rate_reset_cap exists + frame_dig 6 + < + bz _apply_non_cash_schedule_entry_after_if_else@58 + // modules/kernel.py:737 + // rate = self.rate_reset_cap + intc_0 // 0 + bytec 30 // "rate_reset_cap" + app_global_get_ex + swap + frame_bury 6 + assert // check self.rate_reset_cap exists + +_apply_non_cash_schedule_entry_after_if_else@58: + // modules/kernel.py:659 + // self.nominal_interest_rate = self._clamp_rate( + bytec 9 // "nominal_interest_rate" + // modules/kernel.py:659-661 + // self.nominal_interest_rate = self._clamp_rate( + // observed_rate + self.rate_reset_spread + // ) + frame_dig 6 + app_global_put + +_apply_non_cash_schedule_entry_after_if_else@18: + // modules/kernel.py:671 + // if event_type == UInt64(enums.EVT_PI): + frame_dig 10 + pushint 4 + == + bz _apply_non_cash_schedule_entry_else_body@20 + // modules/kernel.py:672 + // self.outstanding_principal = entry.next_outstanding_principal + frame_dig -2 + pushint 49 + extract_uint64 + bytec_3 // "outstanding_principal" + dig 1 + app_global_put + // modules/kernel.py:673 + // self.interest_calculation_base = entry.next_outstanding_principal + bytec 7 // "interest_calculation_base" + swap + app_global_put + +_apply_non_cash_schedule_entry_after_if_else@23: + // modules/kernel.py:678 + // if self._is_dynamic_annuity(): + callsub _is_dynamic_annuity + bz _apply_non_cash_schedule_entry_else_body@29 + // modules/kernel.py:679 + // if event_type == UInt64(enums.EVT_PRF): + frame_dig 10 + pushint 5 + == + bz _apply_non_cash_schedule_entry_after_if_else@30 + // modules/kernel.py:490 + // discount_factor = self.fixed_point_scale + intc_0 // 0 + bytec 5 // "fixed_point_scale" + app_global_get_ex + swap + frame_bury 2 + assert // check self.fixed_point_scale exists + // modules/kernel.py:491 + // denominator = UInt64(0) + intc_0 // 0 + frame_bury 1 + // modules/kernel.py:492 + // skip_first_redemption = False + intc_0 // 0 + frame_bury 7 + // modules/kernel.py:494 + // if entry.redemption_accrual_factor > UInt64(0): + frame_dig -2 + pushint 25 + extract_uint64 + dup + frame_bury 8 + bz _apply_non_cash_schedule_entry_after_if_else@35 + // modules/kernel.py:495-499 + // # An initial PRF may describe the first redemption period directly. + // discount_factor = self._discount_annuity_factor( + // discount_factor, + // entry.redemption_accrual_factor, + // ) + frame_dig 2 + frame_dig 8 + callsub _discount_annuity_factor + dup + frame_bury 2 + // modules/kernel.py:501 + // skip_first_redemption = True + intc_1 // 1 + frame_bury 7 + frame_bury 1 + +_apply_non_cash_schedule_entry_after_if_else@35: + // modules/kernel.py:503 + // future_event_id = self.event_cursor + UInt64(1) + intc_0 // 0 + bytec_2 // "event_cursor" + app_global_get_ex + assert // check self.event_cursor exists + intc_1 // 1 + + + frame_bury 3 + +_apply_non_cash_schedule_entry_while_top@36: + // modules/kernel.py:504 + // while future_event_id < self.schedule_entry_count: + intc_0 // 0 + bytec 4 // "schedule_entry_count" + app_global_get_ex + assert // check self.schedule_entry_count exists + frame_dig 3 + > + bz _apply_non_cash_schedule_entry_after_while@48 + // modules/kernel.py:505 + // future_entry = self._get_schedule_entry(future_event_id) + frame_dig 3 + callsub _get_schedule_entry + dup + frame_bury 0 + // modules/kernel.py:506 + // future_event_type = future_entry.event_type.as_uint64() + intc_2 // 8 + getbyte + dup + frame_bury 4 + // modules/kernel.py:507-508 + // # Only redemption-bearing events contribute to the annuity denominator. + // is_redemption_event = future_event_type == UInt64(enums.EVT_PR) or ( + pushint 3 + == + // modules/kernel.py:507-511 + // # Only redemption-bearing events contribute to the annuity denominator. + // is_redemption_event = future_event_type == UInt64(enums.EVT_PR) or ( + // future_event_type == UInt64(enums.EVT_MD) + // and future_entry.redemption_accrual_factor > UInt64(0) + // ) + bnz _apply_non_cash_schedule_entry_bool_true@40 + // modules/kernel.py:509 + // future_event_type == UInt64(enums.EVT_MD) + frame_dig 4 + pushint 19 + == + // modules/kernel.py:509-510 + // future_event_type == UInt64(enums.EVT_MD) + // and future_entry.redemption_accrual_factor > UInt64(0) + bz _apply_non_cash_schedule_entry_bool_false@41 + // modules/kernel.py:510 + // and future_entry.redemption_accrual_factor > UInt64(0) + frame_dig 0 + pushint 25 + extract_uint64 + // modules/kernel.py:509-510 + // future_event_type == UInt64(enums.EVT_MD) + // and future_entry.redemption_accrual_factor > UInt64(0) + bz _apply_non_cash_schedule_entry_bool_false@41 + +_apply_non_cash_schedule_entry_bool_true@40: + intc_1 // 1 + +_apply_non_cash_schedule_entry_bool_merge@42: + // modules/kernel.py:512 + // if is_redemption_event: + bz _apply_non_cash_schedule_entry_after_if_else@47 + // modules/kernel.py:513 + // if skip_first_redemption: + frame_dig 7 + bz _apply_non_cash_schedule_entry_else_body@45 + // modules/kernel.py:514 + // skip_first_redemption = False + intc_0 // 0 + frame_bury 7 + +_apply_non_cash_schedule_entry_after_if_else@47: + // modules/kernel.py:521 + // future_event_id += UInt64(1) + frame_dig 3 + intc_1 // 1 + + + frame_bury 3 + b _apply_non_cash_schedule_entry_while_top@36 + +_apply_non_cash_schedule_entry_else_body@45: + // modules/kernel.py:518 + // future_entry.redemption_accrual_factor, + frame_dig 0 + pushint 25 + extract_uint64 + // modules/kernel.py:516-519 + // discount_factor = self._discount_annuity_factor( + // discount_factor, + // future_entry.redemption_accrual_factor, + // ) + frame_dig 2 + swap + callsub _discount_annuity_factor + dup + frame_bury 2 + // modules/kernel.py:520 + // denominator += discount_factor + frame_dig 1 + + + frame_bury 1 + b _apply_non_cash_schedule_entry_after_if_else@47 + +_apply_non_cash_schedule_entry_bool_false@41: + intc_0 // 0 + b _apply_non_cash_schedule_entry_bool_merge@42 + +_apply_non_cash_schedule_entry_after_while@48: + // modules/kernel.py:523 + // assert denominator > UInt64(0), err.INVALID_ACTUS_CONFIG + frame_dig 1 + assert // Invalid ACTUS configuration + // modules/kernel.py:524 + // numerator = self.outstanding_principal + intc_0 // 0 + bytec_3 // "outstanding_principal" + app_global_get_ex + assert // check self.outstanding_principal exists + // modules/kernel.py:525 + // if entry.flags & UInt64(enums.FLAG_INITIAL_PRF) == UInt64(0): + frame_dig -2 + pushint 57 + extract_uint64 + intc_2 // 8 + & + bnz _apply_non_cash_schedule_entry_after_if_else@50 + // modules/kernel.py:526-527 + // # Subsequent PRF events amortize both principal and already accrued carry. + // numerator += self.accrued_interest + intc_0 // 0 + bytec 6 // "accrued_interest" + app_global_get_ex + assert // check self.accrued_interest exists + + + +_apply_non_cash_schedule_entry_after_if_else@50: + // modules/kernel.py:530 + // self.fixed_point_scale, + intc_0 // 0 + bytec 5 // "fixed_point_scale" + app_global_get_ex + assert // check self.fixed_point_scale exists + // modules/kernel.py:528-532 + // return self._scaled_mul_div( + // numerator, + // self.fixed_point_scale, + // denominator, + // ) + frame_dig 1 + callsub _scaled_mul_div + // modules/kernel.py:680 + // self.next_principal_redemption = self._recalculate_annuity_payment( + bytec 14 // "next_principal_redemption" + // modules/kernel.py:680-682 + // self.next_principal_redemption = self._recalculate_annuity_payment( + // entry + // ) + swap + app_global_put + +_apply_non_cash_schedule_entry_after_if_else@30: + // modules/kernel.py:685 + // self.event_cursor += UInt64(1) + intc_0 // 0 + bytec_2 // "event_cursor" + app_global_get_ex + assert // check self.event_cursor exists + intc_1 // 1 + + + bytec_2 // "event_cursor" + swap + app_global_put + // modules/kernel.py:686-690 + // self._emit_execution_event( + // entry=entry, + // payoff=UInt64(0), + // settled_amount=UInt64(0), + // ) + frame_dig -2 + // modules/kernel.py:688 + // payoff=UInt64(0), + intc_0 // 0 + // modules/kernel.py:689 + // settled_amount=UInt64(0), + dup + // modules/kernel.py:686-690 + // self._emit_execution_event( + // entry=entry, + // payoff=UInt64(0), + // settled_amount=UInt64(0), + // ) + callsub _emit_execution_event + dup + frame_bury -2 + frame_dig -1 + frame_bury 1 + frame_bury 0 + retsub + +_apply_non_cash_schedule_entry_else_body@29: + // modules/kernel.py:684 + // self.next_principal_redemption = entry.next_principal_redemption + frame_dig -2 + pushint 41 + extract_uint64 + bytec 14 // "next_principal_redemption" + swap + app_global_put + b _apply_non_cash_schedule_entry_after_if_else@30 + +_apply_non_cash_schedule_entry_else_body@20: + // modules/kernel.py:674 + // elif event_type == UInt64(enums.EVT_IPCB): + frame_dig 10 + pushint 18 + == + bz _apply_non_cash_schedule_entry_after_if_else@23 + // modules/kernel.py:675-676 + // # IPCB keeps principal unchanged and only resets the interest base. + // self.interest_calculation_base = self.outstanding_principal + intc_0 // 0 + bytec_3 // "outstanding_principal" + app_global_get_ex + assert // check self.outstanding_principal exists + bytec 7 // "interest_calculation_base" + swap + app_global_put + b _apply_non_cash_schedule_entry_after_if_else@23 + +_apply_non_cash_schedule_entry_else_body@10: + // modules/kernel.py:662 + // elif event_type == UInt64(enums.EVT_RRF): + frame_dig 10 + pushint 11 + == + bz _apply_non_cash_schedule_entry_else_body@14 + // modules/kernel.py:663 + // next_rate = entry.next_nominal_interest_rate + frame_dig -2 + pushint 33 + extract_uint64 + dup + frame_bury 5 + // modules/kernel.py:664 + // if next_rate == UInt64(0): + bnz _apply_non_cash_schedule_entry_after_if_else@13 + // modules/kernel.py:665 + // next_rate = self.rate_reset_next + intc_0 // 0 + bytec 37 // "rate_reset_next" + app_global_get_ex + swap + frame_bury 5 + assert // check self.rate_reset_next exists + +_apply_non_cash_schedule_entry_after_if_else@13: + // modules/kernel.py:666 + // self.nominal_interest_rate = next_rate + bytec 9 // "nominal_interest_rate" + frame_dig 5 + app_global_put + b _apply_non_cash_schedule_entry_after_if_else@18 + +_apply_non_cash_schedule_entry_else_body@14: + // modules/kernel.py:668 + // if entry.next_nominal_interest_rate != UInt64(0): + frame_dig -2 + pushint 33 + extract_uint64 + dup + frame_bury 9 + bz _apply_non_cash_schedule_entry_after_if_else@18 + // modules/kernel.py:669 + // self.nominal_interest_rate = entry.next_nominal_interest_rate + bytec 9 // "nominal_interest_rate" + frame_dig 9 + app_global_put + b _apply_non_cash_schedule_entry_after_if_else@18 + + +// modules.kernel.ActusKernelModule._emit_execution_event(entry: bytes, payoff: uint64, settled_amount: uint64) -> bytes: +_emit_execution_event: + // modules/kernel.py:696-702 + // def _emit_execution_event( + // self, + // *, + // entry: typ.ExecutionScheduleEntry, + // payoff: UInt64, + // settled_amount: UInt64, + // ) -> None: + proto 3 1 + // modules/kernel.py:706 + // contract_id=Global.current_application_id.id, + global CurrentApplicationID + // modules/kernel.py:707 + // event_id=entry.event_id, + frame_dig -3 + intc_0 // 0 + extract_uint64 + // modules/kernel.py:708 + // event_type=entry.event_type, + frame_dig -3 + extract 8 1 + // modules/kernel.py:709 + // scheduled_time=entry.scheduled_time, + frame_dig -3 + extract 9 8 + // modules/kernel.py:710 + // applied_at=Global.latest_timestamp, + global LatestTimestamp + // modules/kernel.py:713 + // self._payoff_sign(entry.event_type.as_uint64(), payoff) + frame_dig -3 + // modules/kernel.py:708 + // event_type=entry.event_type, + intc_2 // 8 + // modules/kernel.py:713 + // self._payoff_sign(entry.event_type.as_uint64(), payoff) + getbyte + // modules/kernel.py:742 + // if payoff == UInt64(0): + frame_dig -2 + bnz _emit_execution_event_after_if_else@3 + // modules/kernel.py:743 + // return UInt64(enums.PAYOFF_SIGN_POSITIVE) + intc_1 // 1 + +_emit_execution_event_after_inlined_modules.kernel.ActusKernelModule._payoff_sign@7: + // modules/kernel.py:712-714 + // payoff_sign=arc4.UInt8( + // self._payoff_sign(entry.event_type.as_uint64(), payoff) + // ), + itob + dup + bitlen + intc_2 // 8 + <= + assert // overflow + extract 7 1 + // modules/kernel.py:716 + // currency_id=self.settlement_asset_id, + intc_0 // 0 + bytec 19 // "settlement_asset_id" + app_global_get_ex + assert // check self.settlement_asset_id exists + // modules/kernel.py:717 + // sequence=entry.event_id + UInt64(1), + frame_dig 1 + dup + intc_1 // 1 + + + // modules/kernel.py:705-718 + // ExecutionEvent( + // contract_id=Global.current_application_id.id, + // event_id=entry.event_id, + // event_type=entry.event_type, + // scheduled_time=entry.scheduled_time, + // applied_at=Global.latest_timestamp, + // payoff=payoff, + // payoff_sign=arc4.UInt8( + // self._payoff_sign(entry.event_type.as_uint64(), payoff) + // ), + // settled_amount=settled_amount, + // currency_id=self.settlement_asset_id, + // sequence=entry.event_id + UInt64(1), + // ) + frame_dig 0 + itob + uncover 2 + itob + concat + frame_dig 2 + concat + frame_dig 3 + concat + frame_dig 4 + itob + concat + frame_dig -2 + itob + concat + uncover 3 + concat + frame_dig -1 + itob + concat + uncover 2 + itob + concat + swap + itob + concat + // modules/kernel.py:704-719 + // arc4.emit( + // ExecutionEvent( + // contract_id=Global.current_application_id.id, + // event_id=entry.event_id, + // event_type=entry.event_type, + // scheduled_time=entry.scheduled_time, + // applied_at=Global.latest_timestamp, + // payoff=payoff, + // payoff_sign=arc4.UInt8( + // self._payoff_sign(entry.event_type.as_uint64(), payoff) + // ), + // settled_amount=settled_amount, + // currency_id=self.settlement_asset_id, + // sequence=entry.event_id + UInt64(1), + // ) + // ) + pushbytes 0x9a332b95 // method "ExecutionEvent(uint64,uint64,uint8,uint64,uint64,uint64,uint8,uint64,uint64,uint64)" + swap + concat + log + frame_dig -3 + frame_bury 0 + retsub + +_emit_execution_event_after_if_else@3: + // modules/kernel.py:744 + // if event_type in (UInt64(enums.EVT_IED), UInt64(enums.EVT_PI)): + frame_dig 5 + intc_1 // 1 + == + bnz _emit_execution_event_if_body@5 + frame_dig 5 + pushint 4 + == + bz _emit_execution_event_after_if_else@6 + +_emit_execution_event_if_body@5: + // modules/kernel.py:745 + // return UInt64(enums.PAYOFF_SIGN_POSITIVE) + intc_1 // 1 + // modules/kernel.py:713 + // self._payoff_sign(entry.event_type.as_uint64(), payoff) + b _emit_execution_event_after_inlined_modules.kernel.ActusKernelModule._payoff_sign@7 + +_emit_execution_event_after_if_else@6: + // modules/kernel.py:746 + // return UInt64(enums.PAYOFF_SIGN_NEGATIVE) + pushint 255 + // modules/kernel.py:713 + // self._payoff_sign(entry.event_type.as_uint64(), payoff) + b _emit_execution_event_after_inlined_modules.kernel.ActusKernelModule._payoff_sign@7 + + +// modules.rbac.RbacModule._role_is_active(role_map: bytes, role_address: bytes) -> uint64: +_role_is_active: + // modules/rbac.py:57 + // def _role_is_active(self, role_map: typ.RbacRole, role_address: Account) -> bool: + proto 2 1 + pushbytes "" + // modules/rbac.py:55 + // return role_address in role_map + frame_dig -2 + frame_dig -1 + concat + dup + box_len + bury 1 + // modules/rbac.py:58-62 + // return self._has_role(role_map, role_address) and ( + // role_map[role_address].role_validity_start + // <= Global.latest_timestamp + // <= role_map[role_address].role_validity_end + // ) + bz _role_is_active_bool_false@4 + // modules/rbac.py:59 + // role_map[role_address].role_validity_start + frame_dig 1 + box_get + assert // check BoxMap entry exists + intc_0 // 0 + extract_uint64 + // modules/rbac.py:60 + // <= Global.latest_timestamp + global LatestTimestamp + dup + frame_bury 0 + // modules/rbac.py:59-60 + // role_map[role_address].role_validity_start + // <= Global.latest_timestamp + <= + // modules/rbac.py:59-61 + // role_map[role_address].role_validity_start + // <= Global.latest_timestamp + // <= role_map[role_address].role_validity_end + bz _role_is_active_bool_false@4 + // modules/rbac.py:61 + // <= role_map[role_address].role_validity_end + frame_dig 1 + box_get + assert // check BoxMap entry exists + intc_2 // 8 + extract_uint64 + // modules/rbac.py:60-61 + // <= Global.latest_timestamp + // <= role_map[role_address].role_validity_end + frame_dig 0 + >= + // modules/rbac.py:59-61 + // role_map[role_address].role_validity_start + // <= Global.latest_timestamp + // <= role_map[role_address].role_validity_end + bz _role_is_active_bool_false@4 + intc_1 // 1 + +_role_is_active_bool_merge@5: + // modules/rbac.py:58-62 + // return self._has_role(role_map, role_address) and ( + // role_map[role_address].role_validity_start + // <= Global.latest_timestamp + // <= role_map[role_address].role_validity_end + // ) + frame_bury 0 + retsub + +_role_is_active_bool_false@4: + intc_0 // 0 + b _role_is_active_bool_merge@5 + + +// modules.rbac.RbacModule._assert_caller_is_arranger() -> void: +_assert_caller_is_arranger: + // modules/rbac.py:65 + // assert self._is_arranger(Txn.sender), err.UNAUTHORIZED + txn Sender + // modules/rbac.py:52 + // return role_address == self.arranger.value + intc_0 // 0 + bytec 18 // 0x5223417272616e67657223 + app_global_get_ex + assert // check self.arranger exists + == + // modules/rbac.py:65 + // assert self._is_arranger(Txn.sender), err.UNAUTHORIZED + assert // Not authorized + retsub + + +// modules.rbac.RbacModule._assert_is_not_asset_defaulted() -> void: +_assert_is_not_asset_defaulted: + // modules/rbac.py:83 + // assert not self.asset_defaulted, err.DEFAULTED + intc_0 // 0 + bytec 41 // "asset_defaulted" + app_global_get_ex + assert // check self.asset_defaulted exists + ! + assert // Defaulted + retsub + + +// modules.rbac.RbacModule._assert_is_not_asset_suspended() -> void: +_assert_is_not_asset_suspended: + // modules/rbac.py:86 + // assert not self.asset_suspended, err.SUSPENDED + intc_0 // 0 + bytec 33 // "asset_suspended" + app_global_get_ex + assert // check self.asset_suspended exists + ! + assert // Suspended operations + retsub + + +// modules.rbac.RbacModule._assert_valid_role(role_id: uint64) -> void: +_assert_valid_role: + // modules/rbac.py:88 + // def _assert_valid_role(self, role_id: UInt64) -> None: + proto 1 0 + // modules/rbac.py:89-97 + // assert role_id in ( + // UInt64(enums.ROLE_ARRANGER), + // UInt64(enums.ROLE_OP_DAEMON), + // UInt64(enums.ROLE_ACCOUNT_MANAGER), + // UInt64(enums.ROLE_PRIMARY_DEALER), + // UInt64(enums.ROLE_TRUSTEE), + // UInt64(enums.ROLE_AUTHORITY), + // UInt64(enums.ROLE_OBSERVER), + // ), err.INVALID_ROLE + frame_dig -1 + // modules/rbac.py:90 + // UInt64(enums.ROLE_ARRANGER), + pushint 20 + // modules/rbac.py:89-97 + // assert role_id in ( + // UInt64(enums.ROLE_ARRANGER), + // UInt64(enums.ROLE_OP_DAEMON), + // UInt64(enums.ROLE_ACCOUNT_MANAGER), + // UInt64(enums.ROLE_PRIMARY_DEALER), + // UInt64(enums.ROLE_TRUSTEE), + // UInt64(enums.ROLE_AUTHORITY), + // UInt64(enums.ROLE_OBSERVER), + // ), err.INVALID_ROLE + == + bnz _assert_valid_role_bool_true@7 + frame_dig -1 + // modules/rbac.py:91 + // UInt64(enums.ROLE_OP_DAEMON), + pushint 25 + // modules/rbac.py:89-97 + // assert role_id in ( + // UInt64(enums.ROLE_ARRANGER), + // UInt64(enums.ROLE_OP_DAEMON), + // UInt64(enums.ROLE_ACCOUNT_MANAGER), + // UInt64(enums.ROLE_PRIMARY_DEALER), + // UInt64(enums.ROLE_TRUSTEE), + // UInt64(enums.ROLE_AUTHORITY), + // UInt64(enums.ROLE_OBSERVER), + // ), err.INVALID_ROLE + == + bnz _assert_valid_role_bool_true@7 + frame_dig -1 + // modules/rbac.py:92 + // UInt64(enums.ROLE_ACCOUNT_MANAGER), + pushint 40 + // modules/rbac.py:89-97 + // assert role_id in ( + // UInt64(enums.ROLE_ARRANGER), + // UInt64(enums.ROLE_OP_DAEMON), + // UInt64(enums.ROLE_ACCOUNT_MANAGER), + // UInt64(enums.ROLE_PRIMARY_DEALER), + // UInt64(enums.ROLE_TRUSTEE), + // UInt64(enums.ROLE_AUTHORITY), + // UInt64(enums.ROLE_OBSERVER), + // ), err.INVALID_ROLE + == + bnz _assert_valid_role_bool_true@7 + frame_dig -1 + // modules/rbac.py:93 + // UInt64(enums.ROLE_PRIMARY_DEALER), + pushint 50 + // modules/rbac.py:89-97 + // assert role_id in ( + // UInt64(enums.ROLE_ARRANGER), + // UInt64(enums.ROLE_OP_DAEMON), + // UInt64(enums.ROLE_ACCOUNT_MANAGER), + // UInt64(enums.ROLE_PRIMARY_DEALER), + // UInt64(enums.ROLE_TRUSTEE), + // UInt64(enums.ROLE_AUTHORITY), + // UInt64(enums.ROLE_OBSERVER), + // ), err.INVALID_ROLE + == + bnz _assert_valid_role_bool_true@7 + frame_dig -1 + // modules/rbac.py:94 + // UInt64(enums.ROLE_TRUSTEE), + pushint 60 + // modules/rbac.py:89-97 + // assert role_id in ( + // UInt64(enums.ROLE_ARRANGER), + // UInt64(enums.ROLE_OP_DAEMON), + // UInt64(enums.ROLE_ACCOUNT_MANAGER), + // UInt64(enums.ROLE_PRIMARY_DEALER), + // UInt64(enums.ROLE_TRUSTEE), + // UInt64(enums.ROLE_AUTHORITY), + // UInt64(enums.ROLE_OBSERVER), + // ), err.INVALID_ROLE + == + bnz _assert_valid_role_bool_true@7 + frame_dig -1 + // modules/rbac.py:95 + // UInt64(enums.ROLE_AUTHORITY), + pushint 70 + // modules/rbac.py:89-97 + // assert role_id in ( + // UInt64(enums.ROLE_ARRANGER), + // UInt64(enums.ROLE_OP_DAEMON), + // UInt64(enums.ROLE_ACCOUNT_MANAGER), + // UInt64(enums.ROLE_PRIMARY_DEALER), + // UInt64(enums.ROLE_TRUSTEE), + // UInt64(enums.ROLE_AUTHORITY), + // UInt64(enums.ROLE_OBSERVER), + // ), err.INVALID_ROLE + == + bnz _assert_valid_role_bool_true@7 + frame_dig -1 + // modules/rbac.py:96 + // UInt64(enums.ROLE_OBSERVER), + pushint 80 + // modules/rbac.py:89-97 + // assert role_id in ( + // UInt64(enums.ROLE_ARRANGER), + // UInt64(enums.ROLE_OP_DAEMON), + // UInt64(enums.ROLE_ACCOUNT_MANAGER), + // UInt64(enums.ROLE_PRIMARY_DEALER), + // UInt64(enums.ROLE_TRUSTEE), + // UInt64(enums.ROLE_AUTHORITY), + // UInt64(enums.ROLE_OBSERVER), + // ), err.INVALID_ROLE + == + bz _assert_valid_role_bool_false@8 + +_assert_valid_role_bool_true@7: + intc_1 // 1 + +_assert_valid_role_bool_merge@9: + // modules/rbac.py:89-97 + // assert role_id in ( + // UInt64(enums.ROLE_ARRANGER), + // UInt64(enums.ROLE_OP_DAEMON), + // UInt64(enums.ROLE_ACCOUNT_MANAGER), + // UInt64(enums.ROLE_PRIMARY_DEALER), + // UInt64(enums.ROLE_TRUSTEE), + // UInt64(enums.ROLE_AUTHORITY), + // UInt64(enums.ROLE_OBSERVER), + // ), err.INVALID_ROLE + assert // Invalid role identifier + retsub + +_assert_valid_role_bool_false@8: + intc_0 // 0 + b _assert_valid_role_bool_merge@9 diff --git a/smart_contracts/artifacts/d-asa/DASA.arc56.json b/smart_contracts/artifacts/d-asa/DASA.arc56.json new file mode 100644 index 00000000..5afe63f6 --- /dev/null +++ b/smart_contracts/artifacts/d-asa/DASA.arc56.json @@ -0,0 +1,2268 @@ +{ + "name": "DASA", + "structs": { + "AccountPosition": [ + { + "name": "payment_address", + "type": "address" + }, + { + "name": "units", + "type": "uint64" + }, + { + "name": "reserved_units", + "type": "uint64" + }, + { + "name": "suspended", + "type": "bool" + }, + { + "name": "settled_cursor", + "type": "uint64" + }, + { + "name": "interest_checkpoint", + "type": "uint64" + }, + { + "name": "principal_checkpoint", + "type": "uint64" + }, + { + "name": "claimable_interest", + "type": "uint64" + }, + { + "name": "claimable_principal", + "type": "uint64" + } + ], + "CashClaimResult": [ + { + "name": "interest_amount", + "type": "uint64" + }, + { + "name": "principal_amount", + "type": "uint64" + }, + { + "name": "total_amount", + "type": "uint64" + }, + { + "name": "timestamp", + "type": "uint64" + }, + { + "name": "context", + "type": "byte[]" + } + ], + "CashFundingResult": [ + { + "name": "funded_interest", + "type": "uint64" + }, + { + "name": "funded_principal", + "type": "uint64" + }, + { + "name": "total_funded", + "type": "uint64" + }, + { + "name": "processed_events", + "type": "uint64" + }, + { + "name": "timestamp", + "type": "uint64" + } + ], + "ExecutionScheduleEntry": [ + { + "name": "event_id", + "type": "uint64" + }, + { + "name": "event_type", + "type": "uint8" + }, + { + "name": "scheduled_time", + "type": "uint64" + }, + { + "name": "accrual_factor", + "type": "uint64" + }, + { + "name": "redemption_accrual_factor", + "type": "uint64" + }, + { + "name": "next_nominal_interest_rate", + "type": "uint64" + }, + { + "name": "next_principal_redemption", + "type": "uint64" + }, + { + "name": "next_outstanding_principal", + "type": "uint64" + }, + { + "name": "flags", + "type": "uint64" + } + ], + "InitialKernelState": [ + { + "name": "status_date", + "type": "uint64" + }, + { + "name": "event_cursor", + "type": "uint64" + }, + { + "name": "outstanding_principal", + "type": "uint64" + }, + { + "name": "interest_calculation_base", + "type": "uint64" + }, + { + "name": "nominal_interest_rate", + "type": "uint64" + }, + { + "name": "accrued_interest", + "type": "uint64" + }, + { + "name": "next_principal_redemption", + "type": "uint64" + }, + { + "name": "cumulative_interest_index", + "type": "uint64" + }, + { + "name": "cumulative_principal_index", + "type": "uint64" + } + ], + "KernelState": [ + { + "name": "contract_type", + "type": "uint8" + }, + { + "name": "status", + "type": "uint64" + }, + { + "name": "total_units", + "type": "uint64" + }, + { + "name": "reserved_units_total", + "type": "uint64" + }, + { + "name": "initial_exchange_amount", + "type": "uint64" + }, + { + "name": "event_cursor", + "type": "uint64" + }, + { + "name": "schedule_entry_count", + "type": "uint64" + }, + { + "name": "outstanding_principal", + "type": "uint64" + }, + { + "name": "interest_calculation_base", + "type": "uint64" + }, + { + "name": "nominal_interest_rate", + "type": "uint64" + }, + { + "name": "accrued_interest", + "type": "uint64" + }, + { + "name": "cumulative_interest_index", + "type": "uint64" + }, + { + "name": "cumulative_principal_index", + "type": "uint64" + }, + { + "name": "reserved_interest", + "type": "uint64" + }, + { + "name": "reserved_principal", + "type": "uint64" + } + ], + "NormalizedActusTerms": [ + { + "name": "contract_type", + "type": "uint8" + }, + { + "name": "denomination_asset_id", + "type": "uint64" + }, + { + "name": "settlement_asset_id", + "type": "uint64" + }, + { + "name": "total_units", + "type": "uint64" + }, + { + "name": "notional_principal", + "type": "uint64" + }, + { + "name": "initial_exchange_amount", + "type": "uint64" + }, + { + "name": "initial_exchange_date", + "type": "uint64" + }, + { + "name": "maturity_date", + "type": "uint64" + }, + { + "name": "day_count_convention", + "type": "uint8" + }, + { + "name": "rate_reset_spread", + "type": "uint64" + }, + { + "name": "rate_reset_multiplier", + "type": "uint64" + }, + { + "name": "rate_reset_floor", + "type": "uint64" + }, + { + "name": "rate_reset_cap", + "type": "uint64" + }, + { + "name": "rate_reset_next", + "type": "uint64" + }, + { + "name": "has_rate_reset_floor", + "type": "bool" + }, + { + "name": "has_rate_reset_cap", + "type": "bool" + }, + { + "name": "dynamic_principal_redemption", + "type": "bool" + }, + { + "name": "fixed_point_scale", + "type": "uint64" + } + ], + "ObservedEventRequest": [ + { + "name": "event_id", + "type": "uint64" + }, + { + "name": "event_type", + "type": "uint8" + }, + { + "name": "scheduled_time", + "type": "uint64" + }, + { + "name": "accrual_factor", + "type": "uint64" + }, + { + "name": "redemption_accrual_factor", + "type": "uint64" + }, + { + "name": "observed_rate", + "type": "uint64" + }, + { + "name": "next_nominal_interest_rate", + "type": "uint64" + }, + { + "name": "next_principal_redemption", + "type": "uint64" + }, + { + "name": "next_outstanding_principal", + "type": "uint64" + }, + { + "name": "flags", + "type": "uint64" + } + ], + "Prospectus": [ + { + "name": "hash", + "type": "byte[32]" + }, + { + "name": "url", + "type": "string" + } + ], + "RoleValidity": [ + { + "name": "role_validity_start", + "type": "uint64" + }, + { + "name": "role_validity_end", + "type": "uint64" + } + ] + }, + "methods": [ + { + "name": "fund_due_cashflows", + "args": [ + { + "type": "uint64", + "name": "max_event_count" + } + ], + "returns": { + "type": "(uint64,uint64,uint64,uint64,uint64)", + "struct": "CashFundingResult" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Reserve due ACTUS cash events into the escrow-style claim ledger.", + "events": [ + { + "name": "ExecutionEvent", + "args": [ + { + "type": "uint64", + "name": "contract_id" + }, + { + "type": "uint64", + "name": "event_id" + }, + { + "type": "uint8", + "name": "event_type" + }, + { + "type": "uint64", + "name": "scheduled_time" + }, + { + "type": "uint64", + "name": "applied_at" + }, + { + "type": "uint64", + "name": "payoff" + }, + { + "type": "uint8", + "name": "payoff_sign" + }, + { + "type": "uint64", + "name": "settled_amount" + }, + { + "type": "uint64", + "name": "currency_id" + }, + { + "type": "uint64", + "name": "sequence" + } + ], + "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event." + } + ], + "recommendations": {} + }, + { + "name": "claim_due_cashflows", + "args": [ + { + "type": "address", + "name": "holding_address" + }, + { + "type": "byte[]", + "name": "payment_info" + } + ], + "returns": { + "type": "(uint64,uint64,uint64,uint64,byte[])", + "struct": "CashClaimResult" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Withdraw the holder's already funded ACTUS cash entitlements.", + "events": [], + "recommendations": {} + }, + { + "name": "set_transfer_schedule", + "args": [ + { + "type": "uint64", + "name": "open_date" + }, + { + "type": "uint64", + "name": "closure_date" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "primary_distribution", + "args": [ + { + "type": "address", + "name": "holding_address" + }, + { + "type": "uint64", + "name": "units" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Reserve units for a holder before IED finalizes issuance.", + "events": [], + "recommendations": {} + }, + { + "name": "transfer", + "args": [ + { + "type": "address", + "name": "sender_holding_address" + }, + { + "type": "address", + "name": "receiver_holding_address" + }, + { + "type": "uint64", + "name": "units" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Transfer active units after settling both counterparties to the current cursor.\nReturns the number of units moved. The ACTUS kernel no longer persists a nominal per-unit value on-chain, so transfer results are unit-based.", + "events": [], + "recommendations": {} + }, + { + "name": "account_gov_suspension", + "args": [ + { + "type": "address", + "name": "holding_address", + "desc": "Account Holding Address" + }, + { + "type": "bool", + "name": "suspended", + "desc": "Suspension status" + } + ], + "returns": { + "type": "uint64", + "desc": "Timestamp of the set account suspension status" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Set account suspension status", + "events": [], + "recommendations": {} + }, + { + "name": "account_open", + "args": [ + { + "type": "address", + "name": "holding_address", + "desc": "Account Holding Address" + }, + { + "type": "address", + "name": "payment_address", + "desc": "Account Payment Address" + } + ], + "returns": { + "type": "uint64", + "desc": "Timestamp of the account opening" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Open a contract account with a new position and register its payment address.", + "events": [], + "recommendations": {} + }, + { + "name": "account_update_payment_address", + "args": [ + { + "type": "address", + "name": "holding_address", + "desc": "Account Holding Address" + }, + { + "type": "address", + "name": "payment_address", + "desc": "Account Payment Address" + } + ], + "returns": { + "type": "uint64", + "desc": "Timestamp of the account update" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Update the Payment Address of an account", + "events": [], + "recommendations": {} + }, + { + "name": "account_get_position", + "args": [ + { + "type": "address", + "name": "holding_address", + "desc": "Account Holding Address" + } + ], + "returns": { + "type": "(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64)", + "struct": "AccountPosition", + "desc": "Account position" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "desc": "Get account position", + "events": [], + "recommendations": {} + }, + { + "name": "contract_create", + "args": [ + { + "type": "address", + "name": "arranger", + "desc": "D-ASA Arranger Address" + } + ], + "returns": { + "type": "uint64", + "desc": "UNIX timestamp of contract creation" + }, + "actions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "readonly": false, + "desc": "Create a new D-ASA contract and set the Arranger role", + "events": [], + "recommendations": {} + }, + { + "name": "contract_config", + "args": [ + { + "type": "(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64)", + "struct": "NormalizedActusTerms", + "name": "terms", + "desc": "Normalized ACTUS terms" + }, + { + "type": "(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", + "struct": "InitialKernelState", + "name": "initial_state", + "desc": "Initial kernel state (pre-IED)" + }, + { + "type": "(byte[32],string)", + "struct": "Prospectus", + "name": "prospectus", + "desc": "Prospectus (informational only)" + } + ], + "returns": { + "type": "uint64", + "desc": "UNIX timestamp of contract configuration" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Partial contract configuration with: normalized ACTUS terms, initial kernel\nstate (pre-IED), prospectus (informational only). The contract stays inactive until all schedule pages are configured next.", + "events": [], + "recommendations": {} + }, + { + "name": "contract_schedule", + "args": [ + { + "type": "uint64", + "name": "schedule_page_index" + }, + { + "type": "bool", + "name": "is_last_page" + }, + { + "type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[]", + "name": "schedule_page" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Upload one normalized schedule page.\nThe configuration operation is considered complete only when the last page is stored. At that point `schedule_entry_count` is finalized and the contract moves to `STATUS_PENDING_IED`.", + "events": [], + "recommendations": {} + }, + { + "name": "execute_ied", + "args": [], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Execute the first due `IED` entry and activate the contract.\n`IED` is the one non-cash event that moves the app from `STATUS_PENDING_IED` to `STATUS_ACTIVE`.", + "events": [ + { + "name": "ExecutionEvent", + "args": [ + { + "type": "uint64", + "name": "contract_id" + }, + { + "type": "uint64", + "name": "event_id" + }, + { + "type": "uint8", + "name": "event_type" + }, + { + "type": "uint64", + "name": "scheduled_time" + }, + { + "type": "uint64", + "name": "applied_at" + }, + { + "type": "uint64", + "name": "payoff" + }, + { + "type": "uint8", + "name": "payoff_sign" + }, + { + "type": "uint64", + "name": "settled_amount" + }, + { + "type": "uint64", + "name": "currency_id" + }, + { + "type": "uint64", + "name": "sequence" + } + ], + "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event." + } + ], + "recommendations": {} + }, + { + "name": "apply_non_cash_event", + "args": [ + { + "type": "uint64", + "name": "event_id" + }, + { + "type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", + "struct": "ObservedEventRequest", + "name": "payload" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Apply the next due non-cash event, optionally appending one first.\nObserved payloads are appended before execution when flagged. Rate reset events require the interest oracle because they can change the running nominal rate; other non-cash events stay arranger-controlled.", + "events": [ + { + "name": "ExecutionEvent", + "args": [ + { + "type": "uint64", + "name": "contract_id" + }, + { + "type": "uint64", + "name": "event_id" + }, + { + "type": "uint8", + "name": "event_type" + }, + { + "type": "uint64", + "name": "scheduled_time" + }, + { + "type": "uint64", + "name": "applied_at" + }, + { + "type": "uint64", + "name": "payoff" + }, + { + "type": "uint8", + "name": "payoff_sign" + }, + { + "type": "uint64", + "name": "settled_amount" + }, + { + "type": "uint64", + "name": "currency_id" + }, + { + "type": "uint64", + "name": "sequence" + } + ], + "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event." + } + ], + "recommendations": {} + }, + { + "name": "get_contract_state", + "args": [], + "returns": { + "type": "(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", + "struct": "KernelState" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "desc": "Return a readonly snapshot of the generic ACTUS kernel state.", + "events": [], + "recommendations": {} + }, + { + "name": "get_next_due_event", + "args": [], + "returns": { + "type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", + "struct": "ExecutionScheduleEntry" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "desc": "Return the next boxed schedule entry, or a zeroed sentinel if ended.", + "events": [], + "recommendations": {} + }, + { + "name": "contract_update", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "UpdateApplication" + ] + }, + "readonly": false, + "desc": "Update D-ASA application.", + "events": [], + "recommendations": {} + }, + { + "name": "rbac_rotate_arranger", + "args": [ + { + "type": "address", + "name": "new_arranger", + "desc": "New Arranger address" + } + ], + "returns": { + "type": "uint64", + "desc": "Timestamp of the role assignment" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Rotate the Arranger address", + "events": [], + "recommendations": {} + }, + { + "name": "rbac_set_op_daemon", + "args": [ + { + "type": "address", + "name": "address", + "desc": "Operation Daemon address" + } + ], + "returns": { + "type": "uint64", + "desc": "Timestamp of the role assignment" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Non-Normative: Set the Operation Daemon address", + "events": [], + "recommendations": {} + }, + { + "name": "rbac_assign_role", + "args": [ + { + "type": "uint8", + "name": "role_id", + "desc": "Role Identifier" + }, + { + "type": "address", + "name": "role_address", + "desc": "Account Role Address" + }, + { + "type": "(uint64,uint64)", + "struct": "RoleValidity", + "name": "validity", + "desc": "Role time validity" + } + ], + "returns": { + "type": "uint64", + "desc": "Timestamp of the role assignment" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Assign a role to an address", + "events": [], + "recommendations": {} + }, + { + "name": "rbac_revoke_role", + "args": [ + { + "type": "uint8", + "name": "role_id", + "desc": "Role Identifier" + }, + { + "type": "address", + "name": "role_address", + "desc": "Account Role Address" + } + ], + "returns": { + "type": "uint64", + "desc": "Timestamp of the role revocation" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Revoke a role from an address", + "events": [], + "recommendations": {} + }, + { + "name": "rbac_gov_asset_suspension", + "args": [ + { + "type": "bool", + "name": "suspended", + "desc": "Suspension status" + } + ], + "returns": { + "type": "uint64", + "desc": "Timestamp of the set asset suspension status" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Set asset suspension status", + "events": [], + "recommendations": {} + }, + { + "name": "rbac_get_arranger", + "args": [], + "returns": { + "type": "address", + "desc": "Arranger address" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "desc": "Get Arranger address", + "events": [], + "recommendations": {} + }, + { + "name": "rbac_get_address_roles", + "args": [ + { + "type": "address", + "name": "address", + "desc": "Address to get roles for" + } + ], + "returns": { + "type": "(bool,bool,bool,bool,bool)", + "desc": "Roles mask: (Account Manager, Primary Dealer, Trustee, Authority, Observer)" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "desc": "Non-normative - Get roles assigned to an address", + "events": [], + "recommendations": {} + }, + { + "name": "rbac_get_role_validity", + "args": [ + { + "type": "uint8", + "name": "role_id", + "desc": "Role Identifier" + }, + { + "type": "address", + "name": "role_address", + "desc": "Account Role Address" + } + ], + "returns": { + "type": "(uint64,uint64)", + "struct": "RoleValidity", + "desc": "Role validity" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "desc": "Get role validity", + "events": [], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "desc": "Debt Algorand Standard Application.", + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 37, + "bytes": 4 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": { + "arranger": { + "keyType": "AVMBytes", + "valueType": "address", + "key": "UiNBcnJhbmdlciM=" + }, + "op_daemon": { + "keyType": "AVMBytes", + "valueType": "address", + "key": "UiNPcERhZW1vbiM=" + }, + "asset_suspended": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "YXNzZXRfc3VzcGVuZGVk" + }, + "asset_defaulted": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "YXNzZXRfZGVmYXVsdGVk" + }, + "status": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "c3RhdHVz" + }, + "contract_type": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "Y29udHJhY3RfdHlwZQ==" + }, + "prospectus_hash": { + "keyType": "AVMString", + "valueType": "AVMBytes", + "key": "cHJvc3BlY3R1c19oYXNo" + }, + "prospectus_url": { + "keyType": "AVMString", + "valueType": "AVMString", + "key": "cHJvc3BlY3R1c191cmw=" + }, + "denomination_asset_id": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "ZGVub21pbmF0aW9uX2Fzc2V0X2lk" + }, + "settlement_asset_id": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "c2V0dGxlbWVudF9hc3NldF9pZA==" + }, + "initial_exchange_date": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "aW5pdGlhbF9leGNoYW5nZV9kYXRl" + }, + "maturity_date": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "bWF0dXJpdHlfZGF0ZQ==" + }, + "transfer_opening_date": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "dHJhbnNmZXJfb3BlbmluZ19kYXRl" + }, + "transfer_closure_date": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "dHJhbnNmZXJfY2xvc3VyZV9kYXRl" + }, + "day_count_convention": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "ZGF5X2NvdW50X2NvbnZlbnRpb24=" + }, + "total_units": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "dG90YWxfdW5pdHM=" + }, + "reserved_units_total": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "cmVzZXJ2ZWRfdW5pdHNfdG90YWw=" + }, + "initial_exchange_amount": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "aW5pdGlhbF9leGNoYW5nZV9hbW91bnQ=" + }, + "outstanding_principal": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "b3V0c3RhbmRpbmdfcHJpbmNpcGFs" + }, + "next_principal_redemption": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "bmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbg==" + }, + "dynamic_principal_redemption": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "ZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbg==" + }, + "interest_calculation_base": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "aW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZQ==" + }, + "accrued_interest": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "YWNjcnVlZF9pbnRlcmVzdA==" + }, + "nominal_interest_rate": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "bm9taW5hbF9pbnRlcmVzdF9yYXRl" + }, + "rate_reset_spread": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "cmF0ZV9yZXNldF9zcHJlYWQ=" + }, + "rate_reset_multiplier": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "cmF0ZV9yZXNldF9tdWx0aXBsaWVy" + }, + "rate_reset_floor": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "cmF0ZV9yZXNldF9mbG9vcg==" + }, + "rate_reset_cap": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "cmF0ZV9yZXNldF9jYXA=" + }, + "rate_reset_next": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "cmF0ZV9yZXNldF9uZXh0" + }, + "has_rate_reset_floor": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "aGFzX3JhdGVfcmVzZXRfZmxvb3I=" + }, + "has_rate_reset_cap": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "aGFzX3JhdGVfcmVzZXRfY2Fw" + }, + "reserved_principal": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "cmVzZXJ2ZWRfcHJpbmNpcGFs" + }, + "reserved_interest": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "cmVzZXJ2ZWRfaW50ZXJlc3Q=" + }, + "cumulative_interest_index": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "Y3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleA==" + }, + "cumulative_principal_index": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "Y3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXg=" + }, + "event_cursor": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "ZXZlbnRfY3Vyc29y" + }, + "schedule_entry_count": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "c2NoZWR1bGVfZW50cnlfY291bnQ=" + }, + "fixed_point_scale": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "Zml4ZWRfcG9pbnRfc2NhbGU=" + } + }, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": { + "account_manager": { + "keyType": "address", + "valueType": "RoleValidity", + "prefix": "UiNBY2NvdW50TWFuYWdlciM=" + }, + "primary_dealer": { + "keyType": "address", + "valueType": "RoleValidity", + "prefix": "UiNQcmltYXJ5RGVhbGVyIw==" + }, + "trustee": { + "keyType": "address", + "valueType": "RoleValidity", + "prefix": "UiNUcnVzdGVlIw==" + }, + "authority": { + "keyType": "address", + "valueType": "RoleValidity", + "prefix": "UiNBdXRob3JpdHkj" + }, + "observer": { + "keyType": "address", + "valueType": "RoleValidity", + "prefix": "UiNPYnNlcnZlciM=" + }, + "schedule_page": { + "keyType": "uint64", + "valueType": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[]", + "prefix": "UyM=" + }, + "account": { + "keyType": "address", + "valueType": "AccountPosition", + "prefix": "UiNBY2NvdW50Iw==" + } + } + } + }, + "bareActions": { + "create": [], + "call": [] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 2601 + ], + "errorMessage": "ACTUS event not yet executed" + }, + { + "pc": [ + 2358 + ], + "errorMessage": "Can not distribute zero units" + }, + { + "pc": [ + 3102, + 3109, + 3481 + ], + "errorMessage": "D-ASA already configured" + }, + { + "pc": [ + 1238, + 1939, + 2318, + 2464, + 3733, + 3880, + 4226, + 4372 + ], + "errorMessage": "D-ASA not configured" + }, + { + "pc": [ + 3492 + ], + "errorMessage": "D-ASA terms not configured" + }, + { + "pc": [ + 6541 + ], + "errorMessage": "Defaulted" + }, + { + "pc": [ + 3120 + ], + "errorMessage": "Denomination asset is not properly set" + }, + { + "pc": [ + 3135 + ], + "errorMessage": "Different settlement asset not supported, must be equal to denomination asset" + }, + { + "pc": [ + 3370, + 3377, + 3379 + ], + "errorMessage": "IED must be set in the future" + }, + { + "pc": [ + 1256, + 2008, + 2479, + 5914 + ], + "errorMessage": "IED not yet executed" + }, + { + "pc": [ + 2371, + 5297 + ], + "errorMessage": "Insufficient remaining D-ASA units" + }, + { + "pc": [ + 2574, + 2641 + ], + "errorMessage": "Insufficient sender units to transfer" + }, + { + "pc": [ + 1835, + 3022, + 3040, + 3096, + 3603, + 3641, + 5482, + 5760, + 5820, + 6203 + ], + "errorMessage": "Invalid ACTUS configuration" + }, + { + "pc": [ + 1948, + 2352, + 2535, + 2550, + 2708, + 2781, + 2844, + 2886, + 5109, + 5234 + ], + "errorMessage": "Invalid account holding address" + }, + { + "pc": [ + 4564, + 4588, + 4612, + 4636, + 4660, + 4717, + 4745, + 4767, + 4789, + 4811, + 4990, + 5008, + 5023, + 5038, + 5053 + ], + "errorMessage": "Invalid account role address" + }, + { + "pc": [ + 3082 + ], + "errorMessage": "Invalid day-count convention ID" + }, + { + "pc": [ + 1347, + 3755, + 4089, + 5792 + ], + "errorMessage": "Invalid event cursor" + }, + { + "pc": [ + 3588, + 3654, + 3933, + 5398 + ], + "errorMessage": "Invalid event id" + }, + { + "pc": [ + 3768, + 4153, + 4160 + ], + "errorMessage": "Invalid event type" + }, + { + "pc": [ + 4701, + 4980, + 6611 + ], + "errorMessage": "Invalid role identifier" + }, + { + "pc": [ + 3486, + 3666, + 3674, + 3989, + 5413, + 5429 + ], + "errorMessage": "Invalid schedule page" + }, + { + "pc": [ + 5345 + ], + "errorMessage": "No D-ASA units" + }, + { + "pc": [ + 1353, + 1864, + 2045, + 5801 + ], + "errorMessage": "No due cashflow to pay" + }, + { + "pc": [ + 5883 + ], + "errorMessage": "Not IED event" + }, + { + "pc": [ + 1993, + 2326, + 2522, + 2698, + 2754, + 2764, + 2850, + 4188, + 4834, + 6533 + ], + "errorMessage": "Not authorized" + }, + { + "pc": [ + 1474, + 1482, + 2094, + 2168, + 2177 + ], + "errorMessage": "Not enough funds for the payment" + }, + { + "pc": [ + 3905, + 3918 + ], + "errorMessage": "Observed event required to execute this action" + }, + { + "pc": [ + 2340, + 2388 + ], + "errorMessage": "Primary distribution is closed" + }, + { + "pc": [ + 5832 + ], + "errorMessage": "Primary distribution is not complete" + }, + { + "pc": [ + 2563 + ], + "errorMessage": "Sender and receiver must be different" + }, + { + "pc": [ + 5095, + 6549 + ], + "errorMessage": "Suspended operations" + }, + { + "pc": [ + 2275, + 3631 + ], + "errorMessage": "Time events must be sorted in strictly ascending order" + }, + { + "pc": [ + 2496, + 2513 + ], + "errorMessage": "Transfer is closed" + }, + { + "pc": [ + 2567 + ], + "errorMessage": "Transfer units must be greater than zero" + }, + { + "pc": [ + 988 + ], + "errorMessage": "Wrong Global Bytes allocation" + }, + { + "pc": [ + 994 + ], + "errorMessage": "Wrong Global UInts allocation" + }, + { + "pc": [ + 998 + ], + "errorMessage": "Wrong Local Bytes allocation" + }, + { + "pc": [ + 1002 + ], + "errorMessage": "Wrong Local UInts allocation" + }, + { + "pc": [ + 1455, + 2087 + ], + "errorMessage": "account opted into asset" + }, + { + "pc": [ + 6493, + 6508 + ], + "errorMessage": "check BoxMap entry exists" + }, + { + "pc": [ + 1984, + 2022, + 2063, + 2101, + 2392, + 2570, + 2630, + 2656, + 5089, + 5255 + ], + "errorMessage": "check self.account entry exists" + }, + { + "pc": [ + 1536, + 1762, + 1847, + 4283, + 5919, + 6222 + ], + "errorMessage": "check self.accrued_interest exists" + }, + { + "pc": [ + 4852, + 6531 + ], + "errorMessage": "check self.arranger exists" + }, + { + "pc": [ + 6539 + ], + "errorMessage": "check self.asset_defaulted exists" + }, + { + "pc": [ + 6547 + ], + "errorMessage": "check self.asset_suspended exists" + }, + { + "pc": [ + 3030, + 3475, + 3901, + 3913, + 4231, + 5644 + ], + "errorMessage": "check self.contract_type exists" + }, + { + "pc": [ + 1504, + 4288, + 5117, + 5195 + ], + "errorMessage": "check self.cumulative_interest_index exists" + }, + { + "pc": [ + 1516, + 4293, + 5128, + 5203 + ], + "errorMessage": "check self.cumulative_principal_index exists" + }, + { + "pc": [ + 5654 + ], + "errorMessage": "check self.dynamic_principal_redemption exists" + }, + { + "pc": [ + 1271, + 1284, + 1345, + 1586, + 2578, + 2591, + 3746, + 4082, + 4259, + 4376, + 4389, + 4426, + 5210, + 5790, + 5871, + 6103, + 6241 + ], + "errorMessage": "check self.event_cursor exists" + }, + { + "pc": [ + 5143, + 5157, + 5350, + 5379, + 5710, + 5718, + 5745, + 5765, + 5954, + 6067, + 6228 + ], + "errorMessage": "check self.fixed_point_scale exists" + }, + { + "pc": [ + 5997 + ], + "errorMessage": "check self.has_rate_reset_cap exists" + }, + { + "pc": [ + 5970 + ], + "errorMessage": "check self.has_rate_reset_floor exists" + }, + { + "pc": [ + 3107, + 3491, + 4255, + 5888 + ], + "errorMessage": "check self.initial_exchange_amount exists" + }, + { + "pc": [ + 2376, + 2386 + ], + "errorMessage": "check self.initial_exchange_date exists" + }, + { + "pc": [ + 1707, + 4273, + 5686, + 5700 + ], + "errorMessage": "check self.interest_calculation_base exists" + }, + { + "pc": [ + 1778, + 1793 + ], + "errorMessage": "check self.next_principal_redemption exists" + }, + { + "pc": [ + 4278, + 5678, + 5705, + 5750 + ], + "errorMessage": "check self.nominal_interest_rate exists" + }, + { + "pc": [ + 1953, + 1966 + ], + "errorMessage": "check self.op_daemon exists" + }, + { + "pc": [ + 1607, + 1674, + 1699, + 1752, + 1803, + 1811, + 1832, + 4268, + 6207, + 6287 + ], + "errorMessage": "check self.outstanding_principal exists" + }, + { + "pc": [ + 6005, + 6019 + ], + "errorMessage": "check self.rate_reset_cap exists" + }, + { + "pc": [ + 5978, + 5992 + ], + "errorMessage": "check self.rate_reset_floor exists" + }, + { + "pc": [ + 5949 + ], + "errorMessage": "check self.rate_reset_multiplier exists" + }, + { + "pc": [ + 6321 + ], + "errorMessage": "check self.rate_reset_next exists" + }, + { + "pc": [ + 5962 + ], + "errorMessage": "check self.rate_reset_spread exists" + }, + { + "pc": [ + 1460, + 2163, + 4298 + ], + "errorMessage": "check self.reserved_interest exists" + }, + { + "pc": [ + 1465, + 1494, + 2173, + 2188, + 4303 + ], + "errorMessage": "check self.reserved_principal exists" + }, + { + "pc": [ + 2363, + 2411, + 4250, + 5292, + 5825 + ], + "errorMessage": "check self.reserved_units_total exists" + }, + { + "pc": [ + 1276, + 2583, + 3751, + 3931, + 3949, + 4072, + 4264, + 4381, + 5394, + 6112 + ], + "errorMessage": "check self.schedule_entry_count exists" + }, + { + "pc": [ + 3979 + ], + "errorMessage": "check self.schedule_page entry exists" + }, + { + "pc": [ + 1452, + 2053, + 2081, + 6393 + ], + "errorMessage": "check self.settlement_asset_id exists" + }, + { + "pc": [ + 1237, + 1251, + 1938, + 2003, + 2317, + 2336, + 2463, + 2474, + 2758, + 3100, + 3479, + 3732, + 3879, + 4224, + 4371, + 5238, + 5816, + 5909 + ], + "errorMessage": "check self.status exists" + }, + { + "pc": [ + 2369, + 2422, + 4245, + 5343, + 5374, + 5830 + ], + "errorMessage": "check self.total_units exists" + }, + { + "pc": [ + 2501, + 2511 + ], + "errorMessage": "check self.transfer_closure_date exists" + }, + { + "pc": [ + 2484, + 2492 + ], + "errorMessage": "check self.transfer_opening_date exists" + }, + { + "pc": [ + 3565, + 3624 + ], + "errorMessage": "index access is out of bounds" + }, + { + "pc": [ + 1922, + 2967, + 3449, + 3984 + ], + "errorMessage": "invalid array length header" + }, + { + "pc": [ + 2688, + 3437, + 4824 + ], + "errorMessage": "invalid number of bytes for arc4.bool" + }, + { + "pc": [ + 1930 + ], + "errorMessage": "invalid number of bytes for arc4.dynamic_array" + }, + { + "pc": [ + 3464 + ], + "errorMessage": "invalid number of bytes for arc4.dynamic_array" + }, + { + "pc": [ + 1916, + 2301, + 2441, + 2449, + 2680, + 2738, + 2746, + 2826, + 2834, + 2877, + 2902, + 4445, + 4469, + 4503, + 4684, + 4866, + 4950 + ], + "errorMessage": "invalid number of bytes for arc4.static_array" + }, + { + "pc": [ + 1232, + 2259, + 2268, + 2309, + 2458, + 3427, + 3864 + ], + "errorMessage": "invalid number of bytes for arc4.uint64" + }, + { + "pc": [ + 4493, + 4674, + 4940 + ], + "errorMessage": "invalid number of bytes for arc4.uint8" + }, + { + "pc": [ + 2939 + ], + "errorMessage": "invalid number of bytes for smart_contracts.abi_types.InitialKernelState" + }, + { + "pc": [ + 2928 + ], + "errorMessage": "invalid number of bytes for smart_contracts.abi_types.NormalizedActusTerms" + }, + { + "pc": [ + 3875 + ], + "errorMessage": "invalid number of bytes for smart_contracts.abi_types.ObservedEventRequest" + }, + { + "pc": [ + 2972 + ], + "errorMessage": "invalid number of bytes for smart_contracts.abi_types.Prospectus" + }, + { + "pc": [ + 4514 + ], + "errorMessage": "invalid number of bytes for smart_contracts.abi_types.RoleValidity" + }, + { + "pc": [ + 2956 + ], + "errorMessage": "invalid tail pointer at index 1 of (uint8[32],(len+utf8[]))" + }, + { + "pc": [ + 2951 + ], + "errorMessage": "invalid tuple encoding" + }, + { + "pc": [ + 4051 + ], + "errorMessage": "max array length exceeded" + }, + { + "pc": [ + 4237, + 6385 + ], + "errorMessage": "overflow" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCAzMgogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1ICJzdGF0dXMiICJldmVudF9jdXJzb3IiICJvdXRzdGFuZGluZ19wcmluY2lwYWwiICJzY2hlZHVsZV9lbnRyeV9jb3VudCIgImZpeGVkX3BvaW50X3NjYWxlIiAiYWNjcnVlZF9pbnRlcmVzdCIgImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMgIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIgInJlc2VydmVkX3VuaXRzX3RvdGFsIiAicmVzZXJ2ZWRfcHJpbmNpcGFsIiAiY29udHJhY3RfdHlwZSIgInRvdGFsX3VuaXRzIiAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIgInJlc2VydmVkX2ludGVyZXN0IiAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIgImN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IiAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMgInNldHRsZW1lbnRfYXNzZXRfaWQiICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIgMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMgMHg1MjIzNTA3MjY5NmQ2MTcyNzk0NDY1NjE2YzY1NzIyMyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMgMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzIDB4NTIyMzRmNzA0NDYxNjU2ZDZmNmUyMyAiaW5pdGlhbF9leGNoYW5nZV9kYXRlIiAidHJhbnNmZXJfb3BlbmluZ19kYXRlIiAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIiAicmF0ZV9yZXNldF9mbG9vciIgInJhdGVfcmVzZXRfY2FwIiAweDUzMjMgMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMyAiYXNzZXRfc3VzcGVuZGVkIiAiZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiIgInJhdGVfcmVzZXRfc3ByZWFkIiAicmF0ZV9yZXNldF9tdWx0aXBsaWVyIiAicmF0ZV9yZXNldF9uZXh0IiAiaGFzX3JhdGVfcmVzZXRfZmxvb3IiICJoYXNfcmF0ZV9yZXNldF9jYXAiIDB4MDAgImFzc2V0X2RlZmF1bHRlZCIgInByb3NwZWN0dXNfaGFzaCIgInByb3NwZWN0dXNfdXJsIiAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIiAibWF0dXJpdHlfZGF0ZSIgImRheV9jb3VudF9jb252ZW50aW9uIiAweDA2ODEwMQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4LTI5CiAgICAvLyAjIFJCQUMgUm9sZXMKICAgIC8vIHNlbGYuYXJyYW5nZXIgPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX0FSUkFOR0VSKQogICAgYnl0ZWMgMTggLy8gMHg1MjIzNDE3MjcyNjE2ZTY3NjU3MjIzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzAKICAgIC8vIHNlbGYub3BfZGFlbW9uID0gR2xvYmFsU3RhdGUoQWNjb3VudCgpLCBrZXk9Y3N0LlBSRUZJWF9JRF9PUF9EQUVNT04pCiAgICBieXRlYyAyNSAvLyAweDUyMjM0ZjcwNDQ2MTY1NmQ2ZjZlMjMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo0Ny00OAogICAgLy8gIyBELUFTQSBHb3Zlcm5hbmNlCiAgICAvLyBzZWxmLmFzc2V0X3N1c3BlbmRlZCA9IEZhbHNlCiAgICBieXRlYyAzMyAvLyAiYXNzZXRfc3VzcGVuZGVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NDkKICAgIC8vIHNlbGYuYXNzZXRfZGVmYXVsdGVkID0gRmFsc2UKICAgIGJ5dGVjIDQxIC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU2LTU3CiAgICAvLyAjIENvbnRyYWN0CiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU4CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMTIgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYwLTYxCiAgICAvLyAjIFByb3NwZWN0dXMgKEluZm9ybWF0aW9uYWwpCiAgICAvLyBzZWxmLnByb3NwZWN0dXNfaGFzaCA9IEJ5dGVzKCkKICAgIGJ5dGVjIDQyIC8vICJwcm9zcGVjdHVzX2hhc2giCiAgICBwdXNoYnl0ZXMgMHgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2MgogICAgLy8gc2VsZi5wcm9zcGVjdHVzX3VybCA9IFN0cmluZygpCiAgICBieXRlYyA0MyAvLyAicHJvc3BlY3R1c191cmwiCiAgICBwdXNoYnl0ZXMgIiIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2NC02NQogICAgLy8gIyBEZW5vbWluYXRpb24KICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gQXNzZXQoKQogICAgYnl0ZWMgNDQgLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjYKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCA9IEFzc2V0KCkKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2OC02OQogICAgLy8gIyBUaW1lCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgMjYgLy8gImluaXRpYWxfZXhjaGFuZ2VfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzAKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgNDUgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjcxCiAgICAvLyBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgMjcgLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzIKICAgIC8vIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlID0gdHlwLlRpbWVTdGFtcCgpCiAgICBieXRlYyAyOCAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3NC03NQogICAgLy8gIyBEYXkgQ291bnQgQ29udmVudGlvbgogICAgLy8gc2VsZi5kYXlfY291bnRfY29udmVudGlvbiA9IFVJbnQ2NCgpCiAgICBieXRlYyA0NiAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojc3LTc4CiAgICAvLyAjIFVuaXRzCiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzID0gVUludDY0KCkKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzkKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPSBVSW50NjQoKQogICAgYnl0ZWMgMTAgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MS04MgogICAgLy8gIyBQcmluY2lwYWwKICAgIC8vIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPSBVSW50NjQoKQogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MwogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBVSW50NjQoKQogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4NAogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gVUludDY0KCkKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4NQogICAgLy8gc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gRmFsc2UKICAgIGJ5dGVjIDM0IC8vICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4Ny04OAogICAgLy8gIyBJbnRlcmVzdAogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gVUludDY0KCkKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojg5CiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgPSBVSW50NjQoKQogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTEtOTIKICAgIC8vICMgSW50ZXJlc3QgUmF0ZXMKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTMKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQgPSBVSW50NjQoKQogICAgYnl0ZWMgMzUgLy8gInJhdGVfcmVzZXRfc3ByZWFkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NAogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIgPSBVSW50NjQoKQogICAgYnl0ZWMgMzYgLy8gInJhdGVfcmVzZXRfbXVsdGlwbGllciIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTUKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9mbG9vciA9IFVJbnQ2NCgpCiAgICBieXRlYyAyOSAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTYKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9jYXAgPSBVSW50NjQoKQogICAgYnl0ZWMgMzAgLy8gInJhdGVfcmVzZXRfY2FwIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NwogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X25leHQgPSBVSW50NjQoKQogICAgYnl0ZWMgMzcgLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTgKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgPSBGYWxzZQogICAgYnl0ZWMgMzggLy8gImhhc19yYXRlX3Jlc2V0X2Zsb29yIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5OQogICAgLy8gc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgPSBGYWxzZQogICAgYnl0ZWMgMzkgLy8gImhhc19yYXRlX3Jlc2V0X2NhcCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTAxLTEwMgogICAgLy8gIyBQcmltYXJ5IERpc3RyaWJ1dGlvbgogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgPSBVSW50NjQoKQogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTAzCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0ID0gVUludDY0KCkKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA1LTEwNgogICAgLy8gIyBDdW11bGF0aXZlIFBlci1Vbml0IEZpeGVkLVBvaW50IEluZGV4ZXMKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA3CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4ID0gVUludDY0KCkKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTE1CiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciA9IFVJbnQ2NCgpCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExNgogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA9IFVJbnQ2NCgpCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTE4LTExOQogICAgLy8gIyBTY2FsaW5nCiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlID0gVUludDY0KCkKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZC1hc2EvY29udHJhY3QucHk6MjMKICAgIC8vIGFzc2VydCBUeG4uZ2xvYmFsX251bV9ieXRlX3NsaWNlID09IGNmZy5HTE9CQUxfQllURVMsIGVyci5XUk9OR19HTE9CQUxfQllURVMKICAgIHR4biBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgQnl0ZXMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2QtYXNhL2NvbnRyYWN0LnB5OjI0CiAgICAvLyBhc3NlcnQgVHhuLmdsb2JhbF9udW1fdWludCA9PSBjZmcuR0xPQkFMX1VJTlRTLCBlcnIuV1JPTkdfR0xPQkFMX1VJTlRTCiAgICB0eG4gR2xvYmFsTnVtVWludAogICAgcHVzaGludCAzNwogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgVUludHMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2QtYXNhL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBhc3NlcnQgVHhuLmxvY2FsX251bV9ieXRlX3NsaWNlID09IGNmZy5MT0NBTF9CWVRFUywgZXJyLldST05HX0xPQ0FMX0JZVEVTCiAgICB0eG4gTG9jYWxOdW1CeXRlU2xpY2UKICAgICEKICAgIGFzc2VydCAvLyBXcm9uZyBMb2NhbCBCeXRlcyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvZC1hc2EvY29udHJhY3QucHk6MjYKICAgIC8vIGFzc2VydCBUeG4ubG9jYWxfbnVtX3VpbnQgPT0gY2ZnLkxPQ0FMX1VJTlRTLCBlcnIuV1JPTkdfTE9DQUxfVUlOVFMKICAgIHR4biBMb2NhbE51bVVpbnQKICAgICEKICAgIGFzc2VydCAvLyBXcm9uZyBMb2NhbCBVSW50cyBhbGxvY2F0aW9uCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kLWFzYS9jb250cmFjdC5weTo4LTE4CiAgICAvLyBjbGFzcyBEQVNBKAogICAgLy8gICAgIFBheW1lbnRBZ2VudCwKICAgIC8vICAgICBUcmFuc2ZlckFnZW50LAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gICAgIGF2bV92ZXJzaW9uPTEyLAogICAgLy8gKToKICAgIHB1c2hieXRlcyAweDkxNGYwNGViIC8vIG1ldGhvZCAiY29udHJhY3RfdXBkYXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9jb250cmFjdF91cGRhdGVfcm91dGVANAoKbWFpbl9zd2l0Y2hfY2FzZV9uZXh0QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZC1hc2EvY29udHJhY3QucHk6OC0xOAogICAgLy8gY2xhc3MgREFTQSgKICAgIC8vICAgICBQYXltZW50QWdlbnQsCiAgICAvLyAgICAgVHJhbnNmZXJBZ2VudCwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBhdm1fdmVyc2lvbj0xMiwKICAgIC8vICk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBieiBtYWluX2NyZWF0ZV9Ob09wQDMxCiAgICBwdXNoYnl0ZXNzIDB4YjQ0NjE4YzggMHhlNzgzMjUyOSAweDdlYTIwZTBiIDB4NmM4NWUzZWUgMHhiZGQxYTk0NCAweGRjMDYzYjM1IDB4MTRmYzEwZWYgMHg3NGE3Mjk3ZiAweDA5ZDRmZTE0IDB4OWE5YmZhODUgMHg4NWVlZDMzZCAweDkxODUxMDRhIDB4ZDlmMjI1YWMgMHg2ZTBlNWM5NSAweGZmM2ZkNGIzIDB4ODJmNzFiMmQgMHhlZjA0ZjVkMyAweGRmMzQzNTUwIDB4M2RiZTgwYmQgMHhkZjU0ZTgyYyAweDAxMGM4Mjk5IDB4NzQwNmFjZDIgMHgxYTcyYTJlZSAvLyBtZXRob2QgImZ1bmRfZHVlX2Nhc2hmbG93cyh1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJjbGFpbV9kdWVfY2FzaGZsb3dzKGFkZHJlc3MsYnl0ZVtdKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYnl0ZVtdKSIsIG1ldGhvZCAic2V0X3RyYW5zZmVyX3NjaGVkdWxlKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbihhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInRyYW5zZmVyKGFkZHJlc3MsYWRkcmVzcyx1aW50NjQpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X2dvdl9zdXNwZW5zaW9uKGFkZHJlc3MsYm9vbCl1aW50NjQiLCBtZXRob2QgImFjY291bnRfb3BlbihhZGRyZXNzLGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X3VwZGF0ZV9wYXltZW50X2FkZHJlc3MoYWRkcmVzcyxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAiYWNjb3VudF9nZXRfcG9zaXRpb24oYWRkcmVzcykoYWRkcmVzcyx1aW50NjQsdWludDY0LGJvb2wsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImNvbnRyYWN0X2NvbmZpZygodWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYm9vbCxib29sLGJvb2wsdWludDY0KSwodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpLChieXRlWzMyXSxzdHJpbmcpKXVpbnQ2NCIsIG1ldGhvZCAiY29udHJhY3Rfc2NoZWR1bGUodWludDY0LGJvb2wsKHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpW10pdWludDY0IiwgbWV0aG9kICJleGVjdXRlX2llZCgpdWludDY0IiwgbWV0aG9kICJhcHBseV9ub25fY2FzaF9ldmVudCh1aW50NjQsKHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSl1aW50NjQiLCBtZXRob2QgImdldF9jb250cmFjdF9zdGF0ZSgpKHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJnZXRfbmV4dF9kdWVfZXZlbnQoKSh1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAicmJhY19yb3RhdGVfYXJyYW5nZXIoYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgInJiYWNfc2V0X29wX2RhZW1vbihhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19hc3NpZ25fcm9sZSh1aW50OCxhZGRyZXNzLCh1aW50NjQsdWludDY0KSl1aW50NjQiLCBtZXRob2QgInJiYWNfcmV2b2tlX3JvbGUodWludDgsYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgInJiYWNfZ292X2Fzc2V0X3N1c3BlbnNpb24oYm9vbCl1aW50NjQiLCBtZXRob2QgInJiYWNfZ2V0X2FycmFuZ2VyKClhZGRyZXNzIiwgbWV0aG9kICJyYmFjX2dldF9hZGRyZXNzX3JvbGVzKGFkZHJlc3MpKGJvb2wsYm9vbCxib29sLGJvb2wsYm9vbCkiLCBtZXRob2QgInJiYWNfZ2V0X3JvbGVfdmFsaWRpdHkodWludDgsYWRkcmVzcykodWludDY0LHVpbnQ2NCkiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBmdW5kX2R1ZV9jYXNoZmxvd3MgY2xhaW1fZHVlX2Nhc2hmbG93cyBzZXRfdHJhbnNmZXJfc2NoZWR1bGUgcHJpbWFyeV9kaXN0cmlidXRpb24gdHJhbnNmZXIgYWNjb3VudF9nb3Zfc3VzcGVuc2lvbiBhY2NvdW50X29wZW4gYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzIGFjY291bnRfZ2V0X3Bvc2l0aW9uIGNvbnRyYWN0X2NvbmZpZyBjb250cmFjdF9zY2hlZHVsZSBleGVjdXRlX2llZCBhcHBseV9ub25fY2FzaF9ldmVudCBnZXRfY29udHJhY3Rfc3RhdGUgZ2V0X25leHRfZHVlX2V2ZW50IHJiYWNfcm90YXRlX2FycmFuZ2VyIHJiYWNfc2V0X29wX2RhZW1vbiByYmFjX2Fzc2lnbl9yb2xlIHJiYWNfcmV2b2tlX3JvbGUgcmJhY19nb3ZfYXNzZXRfc3VzcGVuc2lvbiByYmFjX2dldF9hcnJhbmdlciByYmFjX2dldF9hZGRyZXNzX3JvbGVzIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHkKICAgIGVycgoKbWFpbl9jcmVhdGVfTm9PcEAzMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kLWFzYS9jb250cmFjdC5weTo4LTE4CiAgICAvLyBjbGFzcyBEQVNBKAogICAgLy8gICAgIFBheW1lbnRBZ2VudCwKICAgIC8vICAgICBUcmFuc2ZlckFnZW50LAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gICAgIGF2bV92ZXJzaW9uPTEyLAogICAgLy8gKToKICAgIHB1c2hieXRlcyAweDk1NmQ3MTU2IC8vIG1ldGhvZCAiY29udHJhY3RfY3JlYXRlKGFkZHJlc3MpdWludDY0IgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggY29udHJhY3RfY3JlYXRlCiAgICBlcnIKCm1haW5fY29udHJhY3RfdXBkYXRlX3JvdXRlQDQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBwdXNoaW50IDQgLy8gVXBkYXRlQXBwbGljYXRpb24KICAgID09CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydAogICAgYiBjb250cmFjdF91cGRhdGUKCgovLyBtb2R1bGVzLnBheW1lbnRfYWdlbnQuUGF5bWVudEFnZW50LmZ1bmRfZHVlX2Nhc2hmbG93c1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmZ1bmRfZHVlX2Nhc2hmbG93czoKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gMTAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjUwCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo1MQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo1MgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNDcKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NTUKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NTYtNTcKICAgIC8vIGZ1bmRlZF9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgLy8gZnVuZGVkX3ByaW5jaXBhbCA9IFVJbnQ2NCgwKQogICAgZHVwbiAyCgpmdW5kX2R1ZV9jYXNoZmxvd3Nfd2hpbGVfdG9wQDI6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjAKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgPCBtYXhfZXZlbnRfY291bnQKICAgIGRpZyAyCiAgICBkaWcgNAogICAgPAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjYwLTYxCiAgICAvLyBwcm9jZXNzZWRfZXZlbnRzIDwgbWF4X2V2ZW50X2NvdW50CiAgICAvLyBhbmQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAOQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjYxCiAgICAvLyBhbmQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIDwKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2MC02MQogICAgLy8gcHJvY2Vzc2VkX2V2ZW50cyA8IG1heF9ldmVudF9jb3VudAogICAgLy8gYW5kIHNlbGYuZXZlbnRfY3Vyc29yIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudAogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDkKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2MwogICAgLy8gZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoc2VsZi5ldmVudF9jdXJzb3IpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgZHVwCiAgICBidXJ5IDE3CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjQKICAgIC8vIGlmIGVudHJ5LnNjaGVkdWxlZF90aW1lID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXA6CiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgNgogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPgogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl93aGlsZUA5CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjYKICAgIC8vIGlmIG5vdCBzZWxmLl9ldmVudF9pc19jYXNoKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkpOgogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBidXJ5IDE2CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozNTEKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgaW50Y18yIC8vIDgKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjM1MC0zNTQKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX01EKSwKICAgIC8vICkKICAgID09CiAgICBkdXAKICAgIGJ1cnkgNwogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX3RydWVANTAKICAgIGRpZyAxNAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzUyCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzUwLTM1NAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfTUQpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDUwCiAgICBkaWcgMTQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjM1MwogICAgLy8gVUludDY0KGVudW1zLkVWVF9NRCksCiAgICBwdXNoaW50IDE5CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozNTAtMzU0CiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9NRCksCiAgICAvLyApCiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VANTEKCmZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX3RydWVANTA6CiAgICBpbnRjXzEgLy8gMQoKZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfbWVyZ2VANTI6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjYKICAgIC8vIGlmIG5vdCBzZWxmLl9ldmVudF9pc19jYXNoKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkpOgogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDkKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU0OAogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X2lkID09IHNlbGYuZXZlbnRfY3Vyc29yLCBlcnIuSU5WQUxJRF9FVkVOVF9DVVJTT1IKICAgIGRpZyAxNQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBjdXJzb3IKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU0OQogICAgLy8gYXNzZXJ0IGVudHJ5LnNjaGVkdWxlZF90aW1lIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLCBlcnIuTk9fRFVFX0NBU0hGTE9XCiAgICBkaWcgNAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPD0KICAgIGFzc2VydCAvLyBObyBkdWUgY2FzaGZsb3cgdG8gcGF5CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0MTMKICAgIC8vIGlmIGV2ZW50X3R5cGUgbm90IGluIChVSW50NjQoZW51bXMuRVZUX0lQKSwgVUludDY0KGVudW1zLkVWVF9NRCkpOgogICAgZGlnIDUKICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxMwogICAgZGlnIDE0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDEzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0MTQKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDEzCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfaW50ZXJlc3RfYW1vdW50QDE0OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDI2CiAgICAvLyBldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBidXJ5IDE2CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0MjcKICAgIC8vIGlmIGV2ZW50X3R5cGUgbm90IGluIChVSW50NjQoZW51bXMuRVZUX1BSKSwgVUludDY0KGVudW1zLkVWVF9NRCkpOgogICAgcHVzaGludCAzCiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE3CiAgICBkaWcgMTQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTcKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQyOAogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnRAMjY6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1NTMKICAgIC8vIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGRpZyAxNQogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgMTAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU1NgogICAgLy8gaWYgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCk6CiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUAyNwogICAgZGlnIDkKICAgIGJ1cnkgMTEKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM2OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTcyLTU3NAogICAgLy8gIyBGdW5kaW5nIHVzZXMgcGVyLXVuaXQgY3VtdWxhdGl2ZSBpbmRpY2VzIHNvIGVhY2ggaG9sZGVyIGNhbiBzZXR0bGUKICAgIC8vICMgaW5kZXBlbmRlbnRseSBmcm9tIGl0cyBjdXJyZW50IHVuaXQgYmFsYW5jZS4KICAgIC8vIGludGVyZXN0X2luZGV4X2RlbHRhID0gc2VsZi5fYW1vdW50X3RvX2luZGV4X2RlbHRhKGludGVyZXN0X2Ftb3VudF9kdWUpCiAgICBkaWcgMTIKICAgIGNhbGxzdWIgX2Ftb3VudF90b19pbmRleF9kZWx0YQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTc1CiAgICAvLyBwcmluY2lwYWxfaW5kZXhfZGVsdGEgPSBzZWxmLl9hbW91bnRfdG9faW5kZXhfZGVsdGEocHJpbmNpcGFsX2Ftb3VudF9kdWUpCiAgICBkaWcgOAogICAgY2FsbHN1YiBfYW1vdW50X3RvX2luZGV4X2RlbHRhCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1NzYKICAgIC8vIGludGVyZXN0X2Ftb3VudCA9IHNlbGYuX2luZGV4X2RlbHRhX3RvX2Ftb3VudChpbnRlcmVzdF9pbmRleF9kZWx0YSkKICAgIGRpZyAxCiAgICBjYWxsc3ViIF9pbmRleF9kZWx0YV90b19hbW91bnQKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSAxNwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTc3CiAgICAvLyBwcmluY2lwYWxfYW1vdW50ID0gc2VsZi5faW5kZXhfZGVsdGFfdG9fYW1vdW50KHByaW5jaXBhbF9pbmRleF9kZWx0YSkKICAgIGR1cAogICAgY2FsbHN1YiBfaW5kZXhfZGVsdGFfdG9fYW1vdW50CiAgICBkdXAKICAgIGJ1cnkgMTMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU3OAogICAgLy8gcmVxdWlyZWRfYW1vdW50ID0gaW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudAogICAgZGlnIDIKICAgIGRpZyAxCiAgICArCiAgICBkdXAKICAgIGJ1cnkgMTIKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjcyNwogICAgLy8gYmFsYW5jZSA9IHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQ1NgogICAgLy8gcmV0dXJuIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgKyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIGRpZyAxCiAgICArCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3MjkKICAgIC8vIGFzc2VydCBiYWxhbmNlID49IHJlc2VydmVkX3RvdGFsLCBlcnIuTk9UX0VOT1VHSF9GVU5EUwogICAgZGlnIDIKICAgIGRpZyAxCiAgICA+PQogICAgYXNzZXJ0IC8vIE5vdCBlbm91Z2ggZnVuZHMgZm9yIHRoZSBwYXltZW50CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3MzAKICAgIC8vIHJldHVybiBiYWxhbmNlIC0gcmVzZXJ2ZWRfdG90YWwKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgLQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTgwCiAgICAvLyBzZWxmLl9hdmFpbGFibGVfc2V0dGxlbWVudF9mdW5kcygpID49IHJlcXVpcmVkX2Ftb3VudAogICAgdW5jb3ZlciAyCiAgICA+PQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTc5LTU4MQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLl9hdmFpbGFibGVfc2V0dGxlbWVudF9mdW5kcygpID49IHJlcXVpcmVkX2Ftb3VudAogICAgLy8gKSwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTgzCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0ICs9IGludGVyZXN0X2Ftb3VudAogICAgdW5jb3ZlciAzCiAgICArCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTg0CiAgICAvLyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCArPSBwcmluY2lwYWxfYW1vdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICArCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU4NQogICAgLy8gc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4ICs9IGludGVyZXN0X2luZGV4X2RlbHRhCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCBleGlzdHMKICAgIHVuY292ZXIgMgogICAgKwogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTg2CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4ICs9IHByaW5jaXBhbF9pbmRleF9kZWx0YQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCBleGlzdHMKICAgICsKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1ODcKICAgIC8vIGlmIGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkgPT0gVUludDY0KGVudW1zLkVWVF9QUik6CiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBwdXNoaW50IDMKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDM4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1ODgtNTg5CiAgICAvLyAjIEZvciBQUiwgdGhlIHBlcmlvZCBpbnRlcmVzdCBzdGF5cyBhY2NydWVkIHVudGlsIGEgbGF0ZXIgSVAgb3IgTUQuCiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgKz0gc2VsZi5fZW50cnlfaW50ZXJlc3Rfc2VnbWVudChlbnRyeSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBkaWcgMTYKICAgIGNhbGxzdWIgX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQKICAgIGJ1cnkgMTgKICAgICsKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzk6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1OTIKICAgIC8vIGlmIG5vdCBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKSBvciBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NCgKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlANDEKICAgIGRpZyAxNQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU5Mi01OTQKICAgIC8vIGlmIG5vdCBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKSBvciBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NCgKICAgIC8vICAgICBlbnVtcy5FVlRfTUQKICAgIC8vICk6CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDIKCmZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDQxOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTk1CiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBkaWcgMTUKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0MjoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU5NgogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgZGlnIDEwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTk3CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBuZXh0X2ludGVyZXN0X2Jhc2UKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBkaWcgMTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1OTgKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYwMAogICAgLy8gaWYgZW50cnkuZXZlbnRfdHlwZSA9PSBhcmM0LlVJbnQ4KAogICAgZGlnIDE1CiAgICBleHRyYWN0IDggMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjAwLTYwMgogICAgLy8gaWYgZW50cnkuZXZlbnRfdHlwZSA9PSBhcmM0LlVJbnQ4KAogICAgLy8gICAgIGVudW1zLkVWVF9NRAogICAgLy8gKSBhbmQgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPT0gVUludDY0KDApOgogICAgcHVzaGJ5dGVzIDB4MTMKICAgIGI9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYwMgogICAgLy8gKSBhbmQgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPT0gVUludDY0KDApOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2MDAtNjAyCiAgICAvLyBpZiBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoCiAgICAvLyAgICAgZW51bXMuRVZUX01ECiAgICAvLyApIGFuZCBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9PSBVSW50NjQoMCk6CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYwMwogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX0VOREVEKQogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgcHVzaGludCAyMDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2MDQKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDU6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2MDYtNjEwCiAgICAvLyBzZWxmLl9lbWl0X2V4ZWN1dGlvbl9ldmVudCgKICAgIC8vICAgICBlbnRyeT1lbnRyeSwKICAgIC8vICAgICBwYXlvZmY9aW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudCwKICAgIC8vICAgICBzZXR0bGVkX2Ftb3VudD1pbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50LAogICAgLy8gKQogICAgZGlnIDE1CiAgICBkaWcgNwogICAgZHVwCiAgICBjYWxsc3ViIF9lbWl0X2V4ZWN1dGlvbl9ldmVudAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzAKICAgIC8vIGZ1bmRlZF9pbnRlcmVzdCArPSBpbnRlcmVzdF9hbW91bnQKICAgIGRpZyAxCiAgICBkaWcgMTQKICAgICsKICAgIGJ1cnkgMgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjcxCiAgICAvLyBmdW5kZWRfcHJpbmNpcGFsICs9IHByaW5jaXBhbF9hbW91bnQKICAgIGR1cAogICAgZGlnIDkKICAgICsKICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjcyCiAgICAvLyBwcm9jZXNzZWRfZXZlbnRzICs9IFVJbnQ2NCgxKQogICAgZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDMKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX3doaWxlX3RvcEAyCgpmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDM4OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTkxCiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzkKCmZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDI3OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTU3CiAgICAvLyBldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBidXJ5IDE2CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1NTgtNTYwCiAgICAvLyAjIER5bmFtaWMgYW5udWl0aWVzIGRlcml2ZSBuZXh0IHN0YXRlIGZyb20gdGhlIHBheW1lbnQgZGVjb21wb3NpdGlvbiwKICAgIC8vICMgbm90IG9ubHkgZnJvbSB0aGUgcHJlY29tcHV0ZWQgYG5leHRfKmAgZmllbGRzLgogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1BSKToKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19lbHNlX2JvZHlAMjkKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU2MgogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgLSBwcmluY2lwYWxfYW1vdW50X2R1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBkaWcgOAogICAgLQogICAgZHVwCiAgICBidXJ5IDExCiAgICBidXJ5IDExCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDI5OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTY1CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9JUCk6CiAgICBkaWcgMTQKICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUAzMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTY2CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGJ1cnkgMTEKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU2NwogICAgLy8gbmV4dF9pbnRlcmVzdF9iYXNlID0gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBidXJ5IDEyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIGV4aXN0cwogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzNgoKZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUAzMToKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU2OAogICAgLy8gZWxpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfTUQpOgogICAgZGlnIDE0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDMyCiAgICBkaWcgOQogICAgYnVyeSAxMQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzNgoKZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlAMzI6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1NjkKICAgIC8vIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAxMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTcwCiAgICAvLyBuZXh0X2ludGVyZXN0X2Jhc2UgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDExCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNzoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQyOQogICAgLy8gaWYgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCk6CiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDI1CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0MzAKICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCk6CiAgICBkaWcgMTQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDMxCiAgICAvLyByZXR1cm4gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1NTIKICAgIC8vIHByaW5jaXBhbF9hbW91bnRfZHVlID0gc2VsZi5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudChlbnRyeSkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnRAMjYKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDIwOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDMyCiAgICAvLyBpbnRlcmVzdF9kdWUgPSBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgKyBzZWxmLl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KGVudHJ5KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgIGRpZyAxNgogICAgY2FsbHN1YiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudAogICAgYnVyeSAxOAogICAgKwogICAgZHVwCiAgICBidXJ5IDEzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0MzMKICAgIC8vIGlmIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA8PSBpbnRlcmVzdF9kdWU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiBleGlzdHMKICAgID49CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyMgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDM0CiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1NTIKICAgIC8vIHByaW5jaXBhbF9hbW91bnRfZHVlID0gc2VsZi5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudChlbnRyeSkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnRAMjYKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDIyOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDM1CiAgICAvLyBwcmluY2lwYWxfYW1vdW50ID0gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIC0gaW50ZXJlc3RfZHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiBleGlzdHMKICAgIGRpZyAxMgogICAgLQogICAgZHVwCiAgICBidXJ5IDEwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0MzYKICAgIC8vIGlmIHByaW5jaXBhbF9hbW91bnQgPiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgPgogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQzNwogICAgLy8gcmV0dXJuIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTUyCiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyNDoKICAgIGRpZyA4CiAgICBidXJ5IDgKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyNgoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjU6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0NDAKICAgIC8vIGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsIDw9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBkaWcgMTUKICAgIHB1c2hpbnQgNDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGR1cDIKICAgIDw9CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0MzktNDQxCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsIDw9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQ0MgogICAgLy8gcmV0dXJuIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIC0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIHN3YXAKICAgIC0KICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTUyCiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQxNQogICAgLy8gcmV0dXJuIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCArIHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZGlnIDE2CiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBidXJ5IDE4CiAgICArCiAgICBidXJ5IDEzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1NTEKICAgIC8vIGludGVyZXN0X2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9pbnRlcmVzdF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9pbnRlcmVzdF9hbW91bnRAMTQKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl93aGlsZUA5OgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojc0CiAgICAvLyBhc3NlcnQgcHJvY2Vzc2VkX2V2ZW50cyA+IFVJbnQ2NCgwKSwgZXJyLk5PX0RVRV9DQVNIRkxPVwogICAgZGlnIDIKICAgIGR1cAogICAgYXNzZXJ0IC8vIE5vIGR1ZSBjYXNoZmxvdyB0byBwYXkKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3OAogICAgLy8gdG90YWxfZnVuZGVkPWZ1bmRlZF9pbnRlcmVzdCArIGZ1bmRlZF9wcmluY2lwYWwsCiAgICBkaWcgMgogICAgZHVwCiAgICBkaWcgMwogICAgZHVwCiAgICBjb3ZlciAzCiAgICArCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODAKICAgIC8vIHRpbWVzdGFtcD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3NS04MQogICAgLy8gcmV0dXJuIHR5cC5DYXNoRnVuZGluZ1Jlc3VsdCgKICAgIC8vICAgICBmdW5kZWRfaW50ZXJlc3Q9ZnVuZGVkX2ludGVyZXN0LAogICAgLy8gICAgIGZ1bmRlZF9wcmluY2lwYWw9ZnVuZGVkX3ByaW5jaXBhbCwKICAgIC8vICAgICB0b3RhbF9mdW5kZWQ9ZnVuZGVkX2ludGVyZXN0ICsgZnVuZGVkX3ByaW5jaXBhbCwKICAgIC8vICAgICBwcm9jZXNzZWRfZXZlbnRzPXByb2Nlc3NlZF9ldmVudHMsCiAgICAvLyAgICAgdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUA1MToKICAgIGludGNfMCAvLyAwCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDUyCgoKLy8gbW9kdWxlcy5wYXltZW50X2FnZW50LlBheW1lbnRBZ2VudC5jbGFpbV9kdWVfY2FzaGZsb3dzW3JvdXRpbmddKCkgLT4gdm9pZDoKY2xhaW1fZHVlX2Nhc2hmbG93czoKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNAogICAgLy8gaWYgc2VsZi5vcF9kYWVtb24udmFsdWUgIT0gR2xvYmFsLnplcm9fYWRkcmVzczoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNSAvLyAweDUyMjM0ZjcwNDQ2MTY1NmQ2ZjZlMjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcF9kYWVtb24gZXhpc3RzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBieiBjbGFpbV9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTcKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNgogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI1IC8vIDB4NTIyMzRmNzA0NDYxNjU2ZDZmNmUyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wX2RhZW1vbiBleGlzdHMKICAgID09CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTYtMTgKICAgIC8vIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICAvLyBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgYm56IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDE0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTcKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNi0xOAogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICBibnogY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX3RydWVAMTQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxOAogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIHR4biBTZW5kZXIKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDMyCiAgICA9PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE2LTE4CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAxNQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX3RydWVAMTQ6CiAgICBpbnRjXzEgLy8gMQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDE2OgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE1LTE5CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vICAgICBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gICAgIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICAvLyApLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNzoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5NAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5NQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNDcKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6OTgKICAgIC8vIHNlbGYuX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQoaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDIKICAgIGR1cAogICAgY2FsbHN1YiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojk5CiAgICAvLyBzZWxmLl9zZXR0bGVfcG9zaXRpb24oaG9sZGluZ19hZGRyZXNzKQogICAgY2FsbHN1YiBfc2V0dGxlX3Bvc2l0aW9uCiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTcKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNsYWltYWJsZV9pbnRlcmVzdAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZHVwCiAgICBwdXNoaW50IDczCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBidXJ5IDgKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTgKICAgIC8vICsgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgZHVwCiAgICBwdXNoaW50IDgxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDgKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTctMTE4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jbGFpbWFibGVfaW50ZXJlc3QKICAgIC8vICsgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgdW5jb3ZlciAyCiAgICArCiAgICBkdXAKICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjEwMQogICAgLy8gYXNzZXJ0IHRvdGFsX2Ftb3VudCA+IFVJbnQ2NCgwKSwgZXJyLk5PX0RVRV9DQVNIRkxPVwogICAgYXNzZXJ0IC8vIE5vIGR1ZSBjYXNoZmxvdyB0byBwYXkKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLmlzX29wdGVkX2luKAogICAgZXh0cmFjdCAwIDMyCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MjUKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MjQtMjYKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5pc19vcHRlZF9pbigKICAgIC8vICAgICBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQKICAgIC8vICkKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MjQtMjcKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5pc19vcHRlZF9pbigKICAgIC8vICAgICBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQKICAgIC8vICkKICAgIC8vIGFuZCBub3Qgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkCiAgICBieiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VAMjQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNwogICAgLy8gYW5kIG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHB1c2hpbnQgMzg0CiAgICBnZXRiaXQKICAgIGJueiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VAMjQKICAgIGludGNfMSAvLyAxCgpjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfbWVyZ2VAMjU6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA2CiAgICAvLyBpZiBzZWxmLl9pc19wYXltZW50X2V4ZWN1dGFibGUoaG9sZGluZ19hZGRyZXNzKToKICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MzMKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICBzd2FwCiAgICBkaWcgMQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBvcHRlZCBpbnRvIGFzc2V0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MzMtMzQKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICAvLyA+PSBwYXltZW50X2Ftb3VudAogICAgZGlnIDUKICAgIGR1cAogICAgY292ZXIgMgogICAgPj0KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozMi0zNQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgLy8gICAgID49IHBheW1lbnRfYW1vdW50CiAgICAvLyApLCBlcnIuTk9UX0VOT1VHSF9GVU5EUwogICAgYXNzZXJ0IC8vIE5vdCBlbm91Z2ggZnVuZHMgZm9yIHRoZSBwYXltZW50CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA4CiAgICAvLyBzZWxmLl9wYXkoc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLCB0b3RhbF9hbW91bnQpCiAgICBkaWcgMgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZHVwCiAgICBleHRyYWN0IDAgMzIKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozOS00NAogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXJlY2VpdmVyLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1hbW91bnQsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0MwogICAgLy8gZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIGdsb2JhbCBNaW5UeG5GZWUKICAgIHVuY292ZXIgMwogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgc3dhcAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MzkKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozOS00NAogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXJlY2VpdmVyLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1hbW91bnQsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTI1LTEyNgogICAgLy8gIyBHZXQgdGhlIGNsYWltYWJsZSBhbW91bnRzIGJlZm9yZSByZXNldAogICAgLy8gaW50ZXJlc3RfYW1vdW50ID0gcG9zaXRpb24uY2xhaW1hYmxlX2ludGVyZXN0CiAgICBkdXAKICAgIHB1c2hpbnQgNzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgOQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEyNwogICAgLy8gcHJpbmNpcGFsX2Ftb3VudCA9IHBvc2l0aW9uLmNsYWltYWJsZV9wcmluY2lwYWwKICAgIGR1cAogICAgcHVzaGludCA4MQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMwogICAgYnVyeSA5CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTI5LTEzMAogICAgLy8gIyBSZXNldCB0aGUgcG9zaXRpb24ncyBjbGFpbWFibGUgYW1vdW50cwogICAgLy8gcG9zaXRpb24uY2xhaW1hYmxlX2ludGVyZXN0ID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgaXRvYgogICAgc3dhcAogICAgZGlnIDEKICAgIHJlcGxhY2UyIDczCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTMxCiAgICAvLyBwb3NpdGlvbi5jbGFpbWFibGVfcHJpbmNpcGFsID0gVUludDY0KDApCiAgICBzd2FwCiAgICByZXBsYWNlMiA4MQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzMgogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSBwb3NpdGlvbi5jb3B5KCkKICAgIHVuY292ZXIgMwogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzNAogICAgLy8gYXNzZXJ0IHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgPj0gaW50ZXJlc3RfYW1vdW50LCBlcnIuTk9UX0VOT1VHSF9GVU5EUwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCBleGlzdHMKICAgIGR1cAogICAgZGlnIDIKICAgID49CiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcyBmb3IgdGhlIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzUKICAgIC8vIGFzc2VydCBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCA+PSBwcmluY2lwYWxfYW1vdW50LCBlcnIuTk9UX0VOT1VHSF9GVU5EUwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIGV4aXN0cwogICAgZGlnIDMKICAgID49CiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcyBmb3IgdGhlIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzctMTM4CiAgICAvLyAjIFVwZGF0ZSB0aGUgZ2xvYmFsIHJlc2VydmVkIGludGVyZXN0IGFuZCBwcmluY2lwYWwgYW1vdW50cwogICAgLy8gc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCAtPSBpbnRlcmVzdF9hbW91bnQKICAgIHN3YXAKICAgIC0KICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTM5CiAgICAvLyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCAtPSBwcmluY2lwYWxfYW1vdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICBzd2FwCiAgICAtCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjExNAogICAgLy8gdG90YWxfYW1vdW50PWludGVyZXN0X2Ftb3VudCArIHByaW5jaXBhbF9hbW91bnQsCiAgICBkaWcgNQogICAgZHVwCiAgICBkaWcgNgogICAgZHVwCiAgICBjb3ZlciAzCiAgICArCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTE1CiAgICAvLyB0aW1lc3RhbXA9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTExLTExNwogICAgLy8gcmV0dXJuIHR5cC5DYXNoQ2xhaW1SZXN1bHQoCiAgICAvLyAgICAgaW50ZXJlc3RfYW1vdW50PWludGVyZXN0X2Ftb3VudCwKICAgIC8vICAgICBwcmluY2lwYWxfYW1vdW50PXByaW5jaXBhbF9hbW91bnQsCiAgICAvLyAgICAgdG90YWxfYW1vdW50PWludGVyZXN0X2Ftb3VudCArIHByaW5jaXBhbF9hbW91bnQsCiAgICAvLyAgICAgdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gICAgIGNvbnRleHQ9cGF5bWVudF9pbmZvLAogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZGlnIDIKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBwdXNoYnl0ZXMgMHgwMDIyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAyNDoKICAgIGludGNfMCAvLyAwCiAgICBiIGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUAyNQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX2ZhbHNlQDE1OgogICAgaW50Y18wIC8vIDAKICAgIGIgY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDE2CgoKLy8gbW9kdWxlcy50cmFuc2Zlcl9hZ2VudC5UcmFuc2ZlckFnZW50LnNldF90cmFuc2Zlcl9zY2hlZHVsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF90cmFuc2Zlcl9zY2hlZHVsZToKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToyNAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjI1CiAgICAvLyBhc3NlcnQgb3Blbl9kYXRlIDwgY2xvc3VyZV9kYXRlLCBlcnIuSU5WQUxJRF9TT1JUSU5HCiAgICBkdXAyCiAgICA8CiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbXVzdCBiZSBzb3J0ZWQgaW4gc3RyaWN0bHkgYXNjZW5kaW5nIG9yZGVyCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjI3CiAgICAvLyBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA9IG9wZW5fZGF0ZQogICAgYnl0ZWMgMjcgLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIHVuY292ZXIgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MjgKICAgIC8vIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlID0gY2xvc3VyZV9kYXRlCiAgICBieXRlYyAyOCAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MjkKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy50cmFuc2Zlcl9hZ2VudC5UcmFuc2ZlckFnZW50LnByaW1hcnlfZGlzdHJpYnV0aW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcHJpbWFyeV9kaXN0cmlidXRpb246CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjcxCiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5wcmltYXJ5X2RlYWxlciwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDIyIC8vIDB4NTIyMzUwNzI2OTZkNjE3Mjc5NDQ2NTYxNmM2NTcyMjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDEKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQyCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDMKICAgIC8vIGFzc2VydCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBSSU1BUllfRElTVFJJQlVUSU9OX0NMT1NFRAogICAgYXNzZXJ0IC8vIFByaW1hcnkgZGlzdHJpYnV0aW9uIGlzIGNsb3NlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgY292ZXIgMwogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo0NQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChob2xkaW5nX2FkZHJlc3MpCiAgICBzd2FwCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQ2CiAgICAvLyBhc3NlcnQgdW5pdHMgPiBVSW50NjQoMCksIGVyci5aRVJPX1VOSVRTCiAgICBkdXAKICAgIGFzc2VydCAvLyBDYW4gbm90IGRpc3RyaWJ1dGUgemVybyB1bml0cwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo0OAogICAgLy8gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCArIHVuaXRzIDw9IHNlbGYudG90YWxfdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICArCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgPD0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDctNDkKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCArIHVuaXRzIDw9IHNlbGYudG90YWxfdW5pdHMKICAgIC8vICksIGVyci5PVkVSX0RJU1RSSUJVVElPTgogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCByZW1haW5pbmcgRC1BU0EgdW5pdHMKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NTAKICAgIC8vIGlmIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI2IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlIGV4aXN0cwogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjUyCiAgICAvLyBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8PSBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI2IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlIGV4aXN0cwogICAgPD0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NTEtNTMKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPD0gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGUKICAgIC8vICksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TRUQKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBjbG9zZWQKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNDgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnJlc2VydmVkX3VuaXRzICs9IHVuaXRzCiAgICBkdXBuIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDMKICAgIGR1cAogICAgY292ZXIgMwogICAgKwogICAgaXRvYgogICAgcHVzaGludCA0MAogICAgc3dhcAogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NTYKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgKz0gdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICArCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NTcKICAgIC8vIHJldHVybiBzZWxmLnRvdGFsX3VuaXRzIC0gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIHN3YXAKICAgIC0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMudHJhbnNmZXJfYWdlbnQuVHJhbnNmZXJBZ2VudC50cmFuc2Zlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnRyYW5zZmVyOgogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo1OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NzMKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojc0CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE0NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTMKICAgIC8vIGlmIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI3IC8vICJ0cmFuc2Zlcl9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlIGV4aXN0cwogICAgYnogdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE1CiAgICAvLyBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI3IC8vICJ0cmFuc2Zlcl9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlIGV4aXN0cwogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPD0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTQtMTYKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICksIGVyci5DTE9TRURfVFJBTlNGRVIKICAgIGFzc2VydCAvLyBUcmFuc2ZlciBpcyBjbG9zZWQKCnRyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTcKICAgIC8vIGlmIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI4IC8vICJ0cmFuc2Zlcl9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgYnogdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE5CiAgICAvLyBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8IHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjggLy8gInRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICA8CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE4LTIwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDwgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGUKICAgIC8vICksIGVyci5DTE9TRURfVFJBTlNGRVIKICAgIGFzc2VydCAvLyBUcmFuc2ZlciBpcyBjbG9zZWQKCnRyYW5zZmVyX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NzgKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIGRpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgOAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIGRpZyA1CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDkKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODEKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQoc2VuZGVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjgyCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGR1cAogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4MwogICAgLy8gYXNzZXJ0IHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MgIT0gcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzLCBlcnIuU0VMRl9UUkFOU0ZFUgogICAgdW5jb3ZlciAyCiAgICAhPQogICAgYXNzZXJ0IC8vIFNlbmRlciBhbmQgcmVjZWl2ZXIgbXVzdCBiZSBkaWZmZXJlbnQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODQKICAgIC8vIGFzc2VydCB1bml0cyA+IFVJbnQ2NCgwKSwgZXJyLk5VTExfVFJBTlNGRVIKICAgIGRpZyAxCiAgICBkdXAKICAgIGFzc2VydCAvLyBUcmFuc2ZlciB1bml0cyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojg1CiAgICAvLyBhc3NlcnQgdW5pdHMgPD0gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLCBlcnIuT1ZFUl9UUkFOU0ZFUgogICAgc3dhcAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIDw9CiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IHNlbmRlciB1bml0cyB0byB0cmFuc2ZlcgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzU2CiAgICAvLyBpZiBzZWxmLmV2ZW50X2N1cnNvciA+PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICA+PQogICAgYm56IHRyYW5zZmVyX2FmdGVyX2lubGluZWRfbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Fzc2VydF9ub19kdWVfZXZlbnRfcGVuZGluZ0AxMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzU4CiAgICAvLyBuZXh0X2VudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KHNlbGYuZXZlbnRfY3Vyc29yKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojc2MAogICAgLy8gbmV4dF9lbnRyeS5zY2hlZHVsZWRfdGltZSA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3NTktNzYxCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIG5leHRfZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gKSwgZXJyLlBFTkRJTkdfQUNUVVNfRVZFTlQKICAgIGFzc2VydCAvLyBBQ1RVUyBldmVudCBub3QgeWV0IGV4ZWN1dGVkCgp0cmFuc2Zlcl9hZnRlcl9pbmxpbmVkX21vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9hc3NlcnRfbm9fZHVlX2V2ZW50X3BlbmRpbmdAMTA6CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojg4CiAgICAvLyBzZWxmLl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBkaWcgMwogICAgZHVwCiAgICBjYWxsc3ViIF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojg5CiAgICAvLyBzZWxmLl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGRpZyAzCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGNhbGxzdWIgX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6OTAKICAgIC8vIHNlbGYuX3NldHRsZV9wb3NpdGlvbihzZW5kZXJfaG9sZGluZ19hZGRyZXNzKQogICAgY2FsbHN1YiBfc2V0dGxlX3Bvc2l0aW9uCiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6OTEKICAgIC8vIHNlbGYuX3NldHRsZV9wb3NpdGlvbihyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBjYWxsc3ViIF9zZXR0bGVfcG9zaXRpb24KICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE1MgogICAgLy8gYXNzZXJ0IHVuaXRzIDw9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLCBlcnIuT1ZFUl9UUkFOU0ZFUgogICAgZGlnIDUKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGRpZyAxCiAgICA8PQogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCBzZW5kZXIgdW5pdHMgdG8gdHJhbnNmZXIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNTMKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzIC09IHVuaXRzCiAgICBkaWcgMQogICAgLQogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBpbnRjXzMgLy8gMzIKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNDQKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzICs9IHVuaXRzCiAgICBkaWcgNQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgdW5jb3ZlciAyCiAgICArCiAgICBpdG9iCiAgICBpbnRjXzMgLy8gMzIKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgZGlnIDIKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF9nb3Zfc3VzcGVuc2lvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfZ292X3N1c3BlbnNpb246CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTY1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo3NwogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYXV0aG9yaXR5LCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjEgLy8gMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTg1CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGR1cAogICAgcHVzaGludCA0OAogICAgaW50Y18xIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIHB1c2hpbnQgNDgKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTg2CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfb3Blbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfb3BlbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2OAogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjMgLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQ0ZDYxNmU2MTY3NjU3MjIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMzkKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0VOREVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDIwMAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTAKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX2VuZGVkKCksIGVyci5VTkFVVEhPUklaRUQKICAgICEKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxMQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTIKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjEzCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzQKICAgIC8vIHVuaXRzPVVJbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzItNDIKICAgIC8vIHJldHVybiB0eXAuQWNjb3VudFBvc2l0aW9uKAogICAgLy8gICAgIHBheW1lbnRfYWRkcmVzcz1wYXltZW50X2FkZHJlc3MsCiAgICAvLyAgICAgdW5pdHM9VUludDY0KDApLAogICAgLy8gICAgIHJlc2VydmVkX3VuaXRzPVVJbnQ2NCgwKSwKICAgIC8vICAgICBzdXNwZW5kZWQ9RmFsc2UsCiAgICAvLyAgICAgc2V0dGxlZF9jdXJzb3I9VUludDY0KDApLAogICAgLy8gICAgIGludGVyZXN0X2NoZWNrcG9pbnQ9VUludDY0KDApLAogICAgLy8gICAgIHByaW5jaXBhbF9jaGVja3BvaW50PVVJbnQ2NCgwKSwKICAgIC8vICAgICBjbGFpbWFibGVfaW50ZXJlc3Q9VUludDY0KDApLAogICAgLy8gICAgIGNsYWltYWJsZV9wcmluY2lwYWw9VUludDY0KDApLAogICAgLy8gKQogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBieXRlYyA0MCAvLyAweDAwCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxNAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSBzZWxmLl9uZXdfYWNjb3VudF9wb3NpdGlvbihwYXltZW50X2FkZHJlc3MpCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjE1CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzczoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMzgKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcywgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgdW5jb3ZlciAzCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjM5CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0MAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDEKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcyA9IHBheW1lbnRfYWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDIKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF9nZXRfcG9zaXRpb25bcm91dGluZ10oKSAtPiB2b2lkOgphY2NvdW50X2dldF9wb3NpdGlvbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNTkKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9jcmVhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9jcmVhdGU6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5ODAKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSBhcnJhbmdlcgogICAgYnl0ZWMgMTggLy8gMHg1MjIzNDE3MjcyNjE2ZTY3NjU3MjIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTgxCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojk2OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfY29uZmlnW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfY29uZmlnOgogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojk4MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGxlbgogICAgcHVzaGludCAxMDcKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuTm9ybWFsaXplZEFjdHVzVGVybXMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDcyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLkluaXRpYWxLZXJuZWxTdGF0ZQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIGxlbgogICAgZGlnIDEKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgdHVwbGUgZW5jb2RpbmcKICAgIGR1cAogICAgcHVzaGludCAzNAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHRhaWwgcG9pbnRlciBhdCBpbmRleCAxIG9mICh1aW50OFszMl0sKGxlbit1dGY4W10pKQogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBjb3ZlciAzCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAzNgogICAgKwogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5Qcm9zcGVjdHVzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDEyCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwMTQtMTAxNQogICAgLy8gIyBDb25maWd1cmUgQ29udHJhY3QKICAgIC8vIHNlbGYuY29udHJhY3RfdHlwZSA9IHRlcm1zLmNvbnRyYWN0X3R5cGUuYXNfdWludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ5dGVjIDEyIC8vICJjb250cmFjdF90eXBlIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICBieiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjIwCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfQU5OKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMjEKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgcHVzaGludCAyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMjIKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMjMKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgcHVzaGludCA0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMjQKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYnogY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAOAoKY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUA3OgogICAgaW50Y18xIC8vIDEKCmNvbnRyYWN0X2NvbmZpZ19ib29sX21lcmdlQDk6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMjkKICAgIC8vIGFzc2VydCBzZWxmLl9pc19zdXBwb3J0ZWRfY29udHJhY3RfdHlwZShjb250cmFjdF90eXBlKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDE3CiAgICAvLyBzZWxmLl9zdG9yZV9jb250cmFjdF9jb25maWcoc2VsZi5jb250cmFjdF90eXBlLCB0ZXJtcywgaW5pdGlhbF9zdGF0ZSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBidXJ5IDIKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozMjUKICAgIC8vIGFzc2VydCB0ZXJtcy5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBkaWcgNAogICAgZHVwCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDgKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMyNwogICAgLy8gdGVybXMuZGF5X2NvdW50X2NvbnZlbnRpb24uYXNfdWludDY0KCkKICAgIHB1c2hpbnQgNTcKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyOTctMzAzCiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgIGJ6IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGRpZyA2CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyOTkKICAgIC8vIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGRpZyA2CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozMDAKICAgIC8vIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICBwdXNoaW50IDIKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI5Ny0zMDMKICAgIC8vIHJldHVybiBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzYwKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwSVNEQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjApLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDE2CiAgICBkaWcgNgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzAxCiAgICAvLyBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyOTctMzAzCiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgID09CiAgICBibnogY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUAxNgogICAgZGlnIDYKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMwMgogICAgLy8gVUludDY0KGVudW1zLkRDQ18zMEUzNjApLAogICAgcHVzaGludCA0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyOTctMzAzCiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgID09CiAgICBieiBjb250cmFjdF9jb25maWdfYm9vbF9mYWxzZUAxNwoKY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUAxNjoKICAgIGludGNfMSAvLyAxCgpjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUAxODoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMwOS0zMTEKICAgIC8vIGFzc2VydCBzZWxmLl9pc19zdXBwb3J0ZWRfZGF5X2NvdW50X2NvbnZlbnRpb24oCiAgICAvLyAgICAgZGF5X2NvdW50X2NvbnZlbnRpb24KICAgIC8vICksIGVyci5JTlZBTElEX0RBWV9DT1VOVF9DT05WRU5USU9OCiAgICBhc3NlcnQgLy8gSW52YWxpZCBkYXktY291bnQgY29udmVudGlvbiBJRAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzI5CiAgICAvLyBpZiBjb250cmFjdF90eXBlICE9IFVJbnQ2NChlbnVtcy5DVF9BTk4pOgogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgIT0KICAgIGJ6IGNvbnRyYWN0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDIwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozMzAKICAgIC8vIGFzc2VydCBub3QgdGVybXMuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBkaWcgNAogICAgcHVzaGludCA3ODYKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgoKY29udHJhY3RfY29uZmlnX2FmdGVyX2lmX2Vsc2VAMjA6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MDAKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MDEKICAgIC8vIGFzc2VydCBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID09IFVJbnQ2NCgwKSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBELUFTQSBhbHJlYWR5IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjgwMy04MDQKICAgIC8vICMgU2V0IERlbm9taW5hdGlvbiBBc3NldAogICAgLy8gc2VsZi5fYXNzZXJ0X2Rlbm9taW5hdGlvbl9hc3NldCh0ZXJtcy5kZW5vbWluYXRpb25fYXNzZXRfaWQpCiAgICBkaWcgNAogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojc2OC03NjkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gZGVub21pbmF0aW9uIHdpdGggQVNBCiAgICAvLyBfY3JlYXRvciwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfY3JlYXRvcihkZW5vbWluYXRpb25fYXNzZXRfaWQpCiAgICBkdXAKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojc3MAogICAgLy8gYXNzZXJ0IGV4aXN0cywgZXJyLklOVkFMSURfREVOT01JTkFUSU9OCiAgICBhc3NlcnQgLy8gRGVub21pbmF0aW9uIGFzc2V0IGlzIG5vdCBwcm9wZXJseSBzZXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojc3MwogICAgLy8gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgPSBkZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIGJ5dGVjIDQ0IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjgwNy04MDgKICAgIC8vICMgU2V0IFNldHRsZW1lbnQgQXNzZXQKICAgIC8vIHNlbGYuX2Fzc2VydF9zZXR0bGVtZW50X2Fzc2V0KHRlcm1zLnNldHRsZW1lbnRfYXNzZXRfaWQpCiAgICBkaWcgMQogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Nzc4CiAgICAvLyBzZXR0bGVtZW50X2Fzc2V0X2lkID09IHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgPT0KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojc3Ni03NzkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzZXR0bGVtZW50IGFzc2V0IGlzIHRoZSBkZW5vbWluYXRpb24gYXNzZXQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgLy8gKSwgZXJyLklOVkFMSURfU0VUVExFTUVOVF9BU1NFVAogICAgYXNzZXJ0IC8vIERpZmZlcmVudCBzZXR0bGVtZW50IGFzc2V0IG5vdCBzdXBwb3J0ZWQsIG11c3QgYmUgZXF1YWwgdG8gZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3ODIKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCA9IHNldHRsZW1lbnRfYXNzZXRfaWQKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3ODMtNzg5CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3ODgKICAgIC8vIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3ODYKICAgIC8vIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Nzg3CiAgICAvLyBhc3NldF9hbW91bnQ9MCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3ODMtNzg0CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojc4My03ODkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gc2V0dGxlbWVudCB3aXRoIEFTQQogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PTAsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MTEtODEyCiAgICAvLyAjIFVuaXRzCiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzID0gdGVybXMudG90YWxfdW5pdHMKICAgIGR1cAogICAgcHVzaGludCAxNwogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MTMKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDEwIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODE1LTgxNgogICAgLy8gIyBEYXktQ291bnQgQ29udmVudGlvbnMKICAgIC8vIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPSB0ZXJtcy5kYXlfY291bnRfY29udmVudGlvbi5hc191aW50NjQoKQogICAgYnl0ZWMgNDYgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgZGlnIDgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MTgtODE5CiAgICAvLyAjIFRpbWUKICAgIC8vIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlID0gdGVybXMuaW5pdGlhbF9leGNoYW5nZV9kYXRlCiAgICBkdXAKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAyNiAvLyAiaW5pdGlhbF9leGNoYW5nZV9kYXRlIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MjAKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IHRlcm1zLm1hdHVyaXR5X2RhdGUKICAgIGRpZyAxCiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNDUgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjgyMQogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gaW5pdGlhbF9zdGF0ZS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBkaWcgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBwdXNoaW50IDQ4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODIzLTgyNAogICAgLy8gIyBQcmluY2lwYWwKICAgIC8vIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPSB0ZXJtcy5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudAogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgZGlnIDEwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODI1CiAgICAvLyBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSB0ZXJtcy5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBkaWcgMwogICAgcHVzaGludCA3ODYKICAgIGdldGJpdAogICAgYnl0ZWMgMzQgLy8gImR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODI2CiAgICAvLyBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9IGluaXRpYWxfc3RhdGUub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBkaWcgMQogICAgcHVzaGludCAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjXzMgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MjgtODI5CiAgICAvLyAjIEludGVyZXN0CiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgPSBpbml0aWFsX3N0YXRlLmFjY3J1ZWRfaW50ZXJlc3QKICAgIGRpZyAxCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MzEtODMyCiAgICAvLyAjIEludGVyZXN0IFJhdGUKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gaW5pdGlhbF9zdGF0ZS5ub21pbmFsX2ludGVyZXN0X3JhdGUKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODMzCiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBpbml0aWFsX3N0YXRlLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UKICAgIGRpZyAxCiAgICBwdXNoaW50IDI0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MzQKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQgPSB0ZXJtcy5yYXRlX3Jlc2V0X3NwcmVhZAogICAgZGlnIDMKICAgIHB1c2hpbnQgNTgKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzNSAvLyAicmF0ZV9yZXNldF9zcHJlYWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODM1CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciA9IHRlcm1zLnJhdGVfcmVzZXRfbXVsdGlwbGllcgogICAgZGlnIDMKICAgIHB1c2hpbnQgNjYKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzNiAvLyAicmF0ZV9yZXNldF9tdWx0aXBsaWVyIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjgzNgogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X2Zsb29yID0gdGVybXMucmF0ZV9yZXNldF9mbG9vcgogICAgZGlnIDMKICAgIHB1c2hpbnQgNzQKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAyOSAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MzcKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9jYXAgPSB0ZXJtcy5yYXRlX3Jlc2V0X2NhcAogICAgZGlnIDMKICAgIHB1c2hpbnQgODIKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzMCAvLyAicmF0ZV9yZXNldF9jYXAiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODM4CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfbmV4dCA9IHRlcm1zLnJhdGVfcmVzZXRfbmV4dAogICAgZGlnIDMKICAgIHB1c2hpbnQgOTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzNyAvLyAicmF0ZV9yZXNldF9uZXh0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjgzOQogICAgLy8gc2VsZi5oYXNfcmF0ZV9yZXNldF9mbG9vciA9IHRlcm1zLmhhc19yYXRlX3Jlc2V0X2Zsb29yCiAgICBkaWcgMwogICAgcHVzaGludCA3ODQKICAgIGdldGJpdAogICAgYnl0ZWMgMzggLy8gImhhc19yYXRlX3Jlc2V0X2Zsb29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojg0MAogICAgLy8gc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgPSB0ZXJtcy5oYXNfcmF0ZV9yZXNldF9jYXAKICAgIGRpZyAzCiAgICBwdXNoaW50IDc4NQogICAgZ2V0Yml0CiAgICBieXRlYyAzOSAvLyAiaGFzX3JhdGVfcmVzZXRfY2FwIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojg0Mi04NDMKICAgIC8vICMgU2NhbGluZwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSA9IHRlcm1zLmZpeGVkX3BvaW50X3NjYWxlCiAgICB1bmNvdmVyIDMKICAgIHB1c2hpbnQgOTkKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4NDUtODQ2CiAgICAvLyAjIFNjaGVkdWxlIFByb2Nlc3NpbmcKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yID0gaW5pdGlhbF9zdGF0ZS5ldmVudF9jdXJzb3IKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4NDgtODQ5CiAgICAvLyAjIFBlci1Vbml0IEZpeGVkLVBvaW50IEluZGV4ZXMKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCA9IGluaXRpYWxfc3RhdGUuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleAogICAgZGlnIDEKICAgIHB1c2hpbnQgNTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4NTAKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggPSBpbml0aWFsX3N0YXRlLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4CiAgICBkaWcgMQogICAgcHVzaGludCA2NAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4NTItODUzCiAgICAvLyAjIFJlc2VydmVkIEFtb3VudCAoZm9yIGV4ZWN1dGVkIGNhc2hmbG93cykKICAgIC8vIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODU0CiAgICAvLyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODU2CiAgICAvLyBhc3NlcnQgdGVybXMuaW5pdGlhbF9leGNoYW5nZV9kYXRlID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsIGVyci5JTlZBTElEX0lFRAogICAgZGlnIDIKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgID4KICAgIGFzc2VydCAvLyBJRUQgbXVzdCBiZSBzZXQgaW4gdGhlIGZ1dHVyZQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODU3CiAgICAvLyBhc3NlcnQgdGVybXMuaW5pdGlhbF9leGNoYW5nZV9kYXRlID4gaW5pdGlhbF9zdGF0ZS5zdGF0dXNfZGF0ZSwgZXJyLklOVkFMSURfSUVECiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICA8CiAgICBhc3NlcnQgLy8gSUVEIG11c3QgYmUgc2V0IGluIHRoZSBmdXR1cmUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojg1OAogICAgLy8gYXNzZXJ0IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA8IHRlcm1zLm1hdHVyaXR5X2RhdGUsIGVyci5JTlZBTElEX0lFRAogICAgPAogICAgYXNzZXJ0IC8vIElFRCBtdXN0IGJlIHNldCBpbiB0aGUgZnV0dXJlCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDE5LTEwMjAKICAgIC8vICMgTm90YXJpemUgcHJvc3BlY3R1cyAob3B0aW9uYWwpCiAgICAvLyBzZWxmLnByb3NwZWN0dXNfaGFzaCA9IHByb3NwZWN0dXMuaGFzaC5ieXRlcwogICAgZGlnIDIKICAgIGV4dHJhY3QgMCAzMgogICAgYnl0ZWMgNDIgLy8gInByb3NwZWN0dXNfaGFzaCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDIxCiAgICAvLyBzZWxmLnByb3NwZWN0dXNfdXJsID0gcHJvc3BlY3R1cy51cmwKICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgYnl0ZWMgNDMgLy8gInByb3NwZWN0dXNfdXJsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwMjIKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNvbnRyYWN0X2NvbmZpZ19ib29sX2ZhbHNlQDE3OgogICAgaW50Y18wIC8vIDAKICAgIGIgY29udHJhY3RfY29uZmlnX2Jvb2xfbWVyZ2VAMTgKCmNvbnRyYWN0X2NvbmZpZ19ib29sX2ZhbHNlQDg6CiAgICBpbnRjXzAgLy8gMAogICAgYiBjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUA5CgoKLy8gbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3Rfc2NoZWR1bGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9zY2hlZHVsZToKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gMwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTAyNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBzd2FwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgMwogICAgZHVwCiAgICBwdXNoaW50IDY1CiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIHVuY292ZXIgMgogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8c21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5FeGVjdXRpb25TY2hlZHVsZUVudHJ5PgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTAzOQogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDQyCiAgICAvLyBjb250cmFjdF90eXBlPXNlbGYuY29udHJhY3RfdHlwZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBjb3ZlciAzCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODc0CiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIEQtQVNBIGFscmVhZHkgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODc1LTg3NwogICAgLy8gYXNzZXJ0IHNjaGVkdWxlX3BhZ2UubGVuZ3RoIDw9IFVJbnQ2NCgKICAgIC8vICAgICBjc3QuU0NIRURVTEVfUEFHRV9TSVpFCiAgICAvLyApLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBkdXAKICAgIHB1c2hpbnQgMTYKICAgIDw9CiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4NzgKICAgIC8vIGFzc2VydCBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID4gVUludDY0KDApLCBlcnIuVEVSTVNfTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMCAvLyAiaW5pdGlhbF9leGNoYW5nZV9hbW91bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0EgdGVybXMgbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojg4MAogICAgLy8gcGFnZV9jdXJzb3IgPSBzY2hlZHVsZV9wYWdlX2luZGV4ICogVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpCiAgICBzd2FwCiAgICBwdXNoaW50IDE2CiAgICAqCiAgICBzd2FwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4ODcKICAgIC8vICsgcGFnZV9sZW5ndGggKiBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19QRVJfRU5UUllfQlVER0VUKQogICAgcHVzaGludCAxMDAKICAgICoKICAgIHB1c2hpbnQgMTUxMAogICAgKwoKY29udHJhY3Rfc2NoZWR1bGVfd2hpbGVfdG9wQDI6CiAgICBkdXAKICAgIGdsb2JhbCBPcGNvZGVCdWRnZXQKICAgID4KICAgIGJ6IGNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX3doaWxlQDUKICAgIGl0eG5fYmVnaW4KICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBwdXNoaW50IDUgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICBieXRlYyA0NyAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW0KICAgIGJ5dGVjIDQ3IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBiIGNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEAyCgpjb250cmFjdF9zY2hlZHVsZV9hZnRlcl93aGlsZUA1OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODkwCiAgICAvLyBpbmRleCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTAKCmNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEA2OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODkxCiAgICAvLyB3aGlsZSBpbmRleCA8IHBhZ2VfbGVuZ3RoOgogICAgZGlnIDkKICAgIGRpZyA0CiAgICA8CiAgICBieiBjb250cmFjdF9zY2hlZHVsZV9hZnRlcl93aGlsZUAxNQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODkyLTg5MwogICAgLy8gZW50cnkgPSBzY2hlZHVsZV9wYWdlW2luZGV4XS5jb3B5KCkKICAgIC8vIGVudHJ5X2V2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBkaWcgNAogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgYnVyeSAxMwogICAgZGlnIDEwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgNjUKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODkzCiAgICAvLyBlbnRyeV9ldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4OTItODkzCiAgICAvLyBlbnRyeSA9IHNjaGVkdWxlX3BhZ2VbaW5kZXhdLmNvcHkoKQogICAgLy8gZW50cnlfZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGludGNfMiAvLyA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4OTMKICAgIC8vIGVudHJ5X2V2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBnZXRieXRlCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgMTQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojg5NAogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X2lkID09IHBhZ2VfY3Vyc29yICsgaW5kZXgsIGVyci5JTlZBTElEX0VWRU5UX0lECiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEzCiAgICBkaWcgNQogICAgdW5jb3ZlciA0CiAgICArCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4OTUtODk3CiAgICAvLyBzZWxmLl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBlbnRyeV9ldmVudF90eXBlCiAgICAvLyApCiAgICBkaWcgNQogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODk4CiAgICAvLyBhc3NlcnQgZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgc3dhcAogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4OTkKICAgIC8vIGlmIGVudHJ5LmV2ZW50X2lkID4gVUludDY0KDApOgogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxMgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTAwCiAgICAvLyBpZiBpbmRleCA+IFVJbnQ2NCgwKToKICAgIGRpZyA5CiAgICBieiBjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlAMTAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjkwMQogICAgLy8gcHJldmlvdXNfZW50cnkgPSBzY2hlZHVsZV9wYWdlW2luZGV4IC0gVUludDY0KDEpXS5jb3B5KCkKICAgIGRpZyA5CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgcHVzaGludCA2NQogICAgKgogICAgZGlnIDEyCiAgICBzd2FwCiAgICBwdXNoaW50IDY1CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTE6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5MTYKICAgIC8vIHByZXZpb3VzX2VudHJ5LnNjaGVkdWxlZF90aW1lIDw9IGVudHJ5LnNjaGVkdWxlZF90aW1lCiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgOAogICAgPD0KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjkxNS05MTcKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgcHJldmlvdXNfZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gZW50cnkuc2NoZWR1bGVkX3RpbWUKICAgIC8vICksIGVyci5JTlZBTElEX1NPUlRJTkcKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBtdXN0IGJlIHNvcnRlZCBpbiBzdHJpY3RseSBhc2NlbmRpbmcgb3JkZXIKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTI6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5MTgKICAgIC8vIGlmIGVudHJ5LmV2ZW50X2lkID09IFVJbnQ2NCgwKToKICAgIGRpZyA4CiAgICBibnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxNAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTE5LTkyMQogICAgLy8gYXNzZXJ0IGVudHJ5X2V2ZW50X3R5cGUgPT0gVUludDY0KAogICAgLy8gICAgIGVudW1zLkVWVF9JRUQKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZGlnIDEwCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTQ6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5MjIKICAgIC8vIGluZGV4ICs9IFVJbnQ2NCgxKQogICAgZGlnIDkKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEwCiAgICBiIGNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEA2Cgpjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlAMTA6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5MDMtOTA1CiAgICAvLyAjIFRoZSBmaXJzdCBlbnRyeSBvZiBhIHBhZ2UgbXVzdCBzdGlsbCBiZSBvcmRlcmVkIGFmdGVyIHRoZQogICAgLy8gIyBsYXN0IGVudHJ5IG9mIHRoZSBwcmV2aW91cyBwYWdlLgogICAgLy8gYXNzZXJ0IHNjaGVkdWxlX3BhZ2VfaW5kZXggPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0VWRU5UX0lECiAgICBkaWcgNgogICAgZHVwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBpZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTA2CiAgICAvLyBwcmV2aW91c19wYWdlX2luZGV4ID0gc2NoZWR1bGVfcGFnZV9pbmRleCAtIFVJbnQ2NCgxKQogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjkwOAogICAgLy8gcHJldmlvdXNfcGFnZV9pbmRleCBpbiBzZWxmLnNjaGVkdWxlX3BhZ2UKICAgIGl0b2IKICAgIGJ5dGVjIDMxIC8vIDB4NTMyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTA3LTkwOQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBwcmV2aW91c19wYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZQogICAgLy8gKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTEwLTkxMQogICAgLy8gcHJldmlvdXNfcGFnZSA9IHNlbGYuc2NoZWR1bGVfcGFnZVtwcmV2aW91c19wYWdlX2luZGV4XS5jb3B5KCkKICAgIC8vIGFzc2VydCBwcmV2aW91c19wYWdlLmxlbmd0aCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGludCAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTExCiAgICAvLyBhc3NlcnQgcHJldmlvdXNfcGFnZS5sZW5ndGggPiBVSW50NjQoMCksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGR1cAogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTEzCiAgICAvLyBwcmV2aW91c19wYWdlLmxlbmd0aCAtIFVJbnQ2NCgxKQogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjkxMi05MTQKICAgIC8vIHByZXZpb3VzX2VudHJ5ID0gcHJldmlvdXNfcGFnZVsKICAgIC8vICAgICBwcmV2aW91c19wYWdlLmxlbmd0aCAtIFVJbnQ2NCgxKQogICAgLy8gXS5jb3B5KCkKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgMgogICAgKwogICAgcHVzaGludCA2NQogICAgYm94X2V4dHJhY3QKICAgIGIgY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxMQoKY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfd2hpbGVAMTU6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMDAKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHNjaGVkdWxlX3BhZ2UuY29weSgpCiAgICBkaWcgNgogICAgaXRvYgogICAgYnl0ZWMgMzEgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBkaWcgNQogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTI1CiAgICAvLyBpZiBpc19sYXN0X3BhZ2U6CiAgICBkaWcgNQogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxNwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTI3CiAgICAvLyBzY2hlZHVsZV9wYWdlX2luZGV4ICogVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpICsgcGFnZV9sZW5ndGgKICAgIGRpZyAxCiAgICBkaWcgNAogICAgKwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTI2CiAgICAvLyBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50ID0gKAogICAgYnl0ZWMgNCAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5MjYtOTI4CiAgICAvLyBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50ID0gKAogICAgLy8gICAgIHNjaGVkdWxlX3BhZ2VfaW5kZXggKiBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkgKyBwYWdlX2xlbmd0aAogICAgLy8gKQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjkyOQogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgcHVzaGludCA1MAogICAgYXBwX2dsb2JhbF9wdXQKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTc6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDQ3CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwMjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmV4ZWN1dGVfaWVkW3JvdXRpbmddKCkgLT4gdm9pZDoKZXhlY3V0ZV9pZWQ6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA1NwogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDU4CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA1OQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwNjEKICAgIC8vIGFzc2VydCBzZWxmLmV2ZW50X2N1cnNvciA8IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICBkaWcgMQogICAgPgogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgY3Vyc29yCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDYyCiAgICAvLyBlbnRyeSA9IHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLmV2ZW50X2N1cnNvcikKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA2MwogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X3R5cGUgPT0gYXJjNC5VSW50OChlbnVtcy5FVlRfSUVEKSwgZXJyLklOVkFMSURfRVZFTlRfVFlQRQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgZHVwCiAgICBwdXNoYnl0ZXMgMHgwMQogICAgYj09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCB0eXBlCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDY3CiAgICAvLyBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIGRpZyAxCiAgICBleHRyYWN0IDAgOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA2OQogICAgLy8gc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICBkaWcgMgogICAgZXh0cmFjdCA5IDgKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwNzAKICAgIC8vIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgZGlnIDMKICAgIGV4dHJhY3QgMTcgOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA3MQogICAgLy8gcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZGlnIDQKICAgIGV4dHJhY3QgMjUgOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA3MwogICAgLy8gbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9ZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBkaWcgNQogICAgZXh0cmFjdCAzMyA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDc0CiAgICAvLyBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICBkaWcgNgogICAgZXh0cmFjdCA0MSA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDc1CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1lbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIGRpZyA3CiAgICBleHRyYWN0IDQ5IDgKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwNzYKICAgIC8vIGZsYWdzPWVudHJ5LmZsYWdzLAogICAgZGlnIDgKICAgIGV4dHJhY3QgNTcgOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA2Ni0xMDc3CiAgICAvLyB0eXAuT2JzZXJ2ZWRFdmVudFJlcXVlc3QoCiAgICAvLyAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBvYnNlcnZlZF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1lbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9ZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9ZW50cnkuZmxhZ3MsCiAgICAvLyApLAogICAgdW5jb3ZlciA3CiAgICB1bmNvdmVyIDgKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA3MgogICAgLy8gb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA2Ni0xMDc3CiAgICAvLyB0eXAuT2JzZXJ2ZWRFdmVudFJlcXVlc3QoCiAgICAvLyAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBvYnNlcnZlZF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1lbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9ZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9ZW50cnkuZmxhZ3MsCiAgICAvLyApLAogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwNjQtMTA3OAogICAgLy8gc2VsZi5fYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkoCiAgICAvLyAgICAgZW50cnksCiAgICAvLyAgICAgdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0KAogICAgLy8gICAgICAgICBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIC8vICAgICAgICAgZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgLy8gICAgICAgICBzY2hlZHVsZWRfdGltZT1lbnRyeS5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICAgICAgYWNjcnVhbF9mYWN0b3I9ZW50cnkuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICAgICAgb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPWVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPWVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgICAgICBmbGFncz1lbnRyeS5mbGFncywKICAgIC8vICAgICApLAogICAgLy8gKQogICAgY2FsbHN1YiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkKICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA3OQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDQ5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5hcHBseV9ub25fY2FzaF9ldmVudFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFwcGx5X25vbl9jYXNoX2V2ZW50OgogICAgaW50Y18wIC8vIDAKICAgIGR1cG4gNAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwODEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwbiAyCiAgICBsZW4KICAgIHB1c2hpbnQgNzMKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuT2JzZXJ2ZWRFdmVudFJlcXVlc3QKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDk1CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA5NgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwOTgKICAgIC8vIGlmIHBheWxvYWQuZmxhZ3MgJiBVSW50NjQoZW51bXMuRkxBR19PQlNFUlZFRF9FVkVOVCk6CiAgICBwdXNoaW50IDY1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBwdXNoaW50IDQKICAgICYKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjMzCiAgICAvLyByZXR1cm4gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9DTE0pCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIHB1c2hpbnQgNQogICAgPT0KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwOTkKICAgIC8vIGFzc2VydCBzZWxmLl9zdXBwb3J0c19vYnNlcnZlZF9ldmVudHMoKSwgZXJyLk9CU0VSVkVEX0VWRU5UX1JFUVVJUkVECiAgICBhc3NlcnQgLy8gT2JzZXJ2ZWQgZXZlbnQgcmVxdWlyZWQgdG8gZXhlY3V0ZSB0aGlzIGFjdGlvbgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEwMAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMzMKICAgIC8vIHJldHVybiBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0NMTSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgZHVwCiAgICBwdXNoaW50IDUKICAgID09CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5MzgKICAgIC8vIGFzc2VydCBzZWxmLl9zdXBwb3J0c19vYnNlcnZlZF9ldmVudHMoKSwgZXJyLk9CU0VSVkVEX0VWRU5UX1JFUVVJUkVECiAgICBhc3NlcnQgLy8gT2JzZXJ2ZWQgZXZlbnQgcmVxdWlyZWQgdG8gZXhlY3V0ZSB0aGlzIGFjdGlvbgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTM5CiAgICAvLyBhc3NlcnQgcGF5bG9hZC5ldmVudF9pZCA9PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LCBlcnIuSU5WQUxJRF9FVkVOVF9JRAogICAgZGlnIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgNwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NDEKICAgIC8vIHNlbGYuY29udHJhY3RfdHlwZSwgcGF5bG9hZC5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBkdXAKICAgIGV4dHJhY3QgOCAxCiAgICBidXJ5IDEyCiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTQwLTk0MgogICAgLy8gc2VsZi5fYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgc2VsZi5jb250cmFjdF90eXBlLCBwYXlsb2FkLmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIC8vICkKICAgIGNhbGxzdWIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NDQKICAgIC8vIHBhZ2VfaW5kZXggPSBzZWxmLl9zY2hlZHVsZV9wYWdlX2luZGV4KHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxOTAKICAgIC8vIHJldHVybiBldmVudF9pZCAvLyBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkKICAgIHB1c2hpbnQgMTYKICAgIC8KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojk0NQogICAgLy8gcGFnZSA9IHR5cC5FeGVjdXRpb25TY2hlZHVsZVBhZ2UoKQogICAgcHVzaGJ5dGVzIDB4MDAwMAogICAgYnVyeSA3CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NDYKICAgIC8vIGlmIHBhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlOgogICAgaXRvYgogICAgYnl0ZWMgMzEgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA5CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMjcKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojk0NwogICAgLy8gcGFnZSA9IHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XS5jb3B5KCkKICAgIGRpZyA3CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidXJ5IDcKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX3BhZ2UgZW50cnkgZXhpc3RzCgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDI3OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTQ4CiAgICAvLyBhc3NlcnQgcGFnZS5sZW5ndGggPCBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGRpZyA1CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgMTYKICAgIDwKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojk1MwogICAgLy8gc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIGRpZyAzCiAgICBkdXAKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NTQKICAgIC8vIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICBkaWcgMQogICAgZXh0cmFjdCAxNyA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NTUKICAgIC8vIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZGlnIDIKICAgIGV4dHJhY3QgMjUgOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTU2CiAgICAvLyBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDMKICAgIGV4dHJhY3QgNDEgOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTU3CiAgICAvLyBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIGRpZyA0CiAgICBleHRyYWN0IDQ5IDgKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojk1OAogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIHVuY292ZXIgNQogICAgZXh0cmFjdCA1NyA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NTAtOTYwCiAgICAvLyB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1wYXlsb2FkLmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9cGF5bG9hZC5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPXBheWxvYWQucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXBheWxvYWQubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICkKICAgIGRpZyAxMQogICAgaXRvYgogICAgZGlnIDE4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMwogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NDktOTYxCiAgICAvLyBwYWdlLmFwcGVuZCgKICAgIC8vICAgICB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9cGF5bG9hZC5ldmVudF9pZCwKICAgIC8vICAgICAgICAgZXZlbnRfdHlwZT1wYXlsb2FkLmV2ZW50X3R5cGUsCiAgICAvLyAgICAgICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIC8vICAgICAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICAgICApCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NjIKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHBhZ2UuY29weSgpCiAgICBkaWcgOAogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojk2MwogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTAzCiAgICAvLyBhc3NlcnQgZXZlbnRfaWQgPT0gc2VsZi5ldmVudF9jdXJzb3IsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBjdXJzb3IKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExMDQKICAgIC8vIGVudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KGV2ZW50X2lkKQogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEwNgogICAgLy8gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgYnVyeSAxMAogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozNjQKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzY1CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzYzLTM3MAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjM2NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9SUiksCiAgICBwdXNoaW50IDEyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzY3CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICBwdXNoaW50IDExCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzY4CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgcHVzaGludCAxOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzYzLTM3MAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjM2OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBieiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX2ZhbHNlQDE2CgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX3RydWVAMTU6CiAgICBpbnRjXzEgLy8gMQoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9tZXJnZUAxNzoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExMDUtMTEwNwogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2lzX25vbl9jYXNoKAogICAgLy8gICAgIGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIC8vICksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IHR5cGUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExMDgKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlICE9IGFyYzQuVUludDgoZW51bXMuRVZUX0lFRCksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGRpZyA4CiAgICBwdXNoYnl0ZXMgMHgwMQogICAgYiE9CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCB0eXBlCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozNzQKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluIChVSW50NjQoZW51bXMuRVZUX1JSKSwgVUludDY0KGVudW1zLkVWVF9SUkYpKQogICAgZGlnIDQKICAgIHB1c2hpbnQgMTIKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDIxCiAgICBkaWcgNAogICAgcHVzaGludCAxMQogICAgPT0KICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfZmFsc2VAMjIKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAyMToKICAgIGludGNfMSAvLyAxCgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX21lcmdlQDIzOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEwOQogICAgLy8gaWYgc2VsZi5fZXZlbnRfaXNfcmF0ZV9yZXNldChlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpKToKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Vsc2VfYm9keUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODAKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLm9ic2VydmVyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjQgLy8gMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTEzCiAgICAvLyBzZWxmLl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeShlbnRyeSwgcGF5bG9hZCkKICAgIGRpZyA2CiAgICBkaWcgMgogICAgY2FsbHN1YiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkKICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTExNAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDgxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Vsc2VfYm9keUA1OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTExMgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICBiIGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VANgoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9mYWxzZUAyMjoKICAgIGludGNfMCAvLyAwCiAgICBiIGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfbWVyZ2VAMjMKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfZmFsc2VAMTY6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX21lcmdlQDE3CgoKLy8gbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuZ2V0X2NvbnRyYWN0X3N0YXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2NvbnRyYWN0X3N0YXRlOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBkdXAKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEyMQogICAgLy8gY29udHJhY3RfdHlwZT1hcmM0LlVJbnQ4KHNlbGYuY29udHJhY3RfdHlwZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzIgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExMjMKICAgIC8vIHRvdGFsX3VuaXRzPXNlbGYudG90YWxfdW5pdHMsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEyNAogICAgLy8gcmVzZXJ2ZWRfdW5pdHNfdG90YWw9c2VsZi5yZXNlcnZlZF91bml0c190b3RhbCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTI1CiAgICAvLyBpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudD1zZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExMjYKICAgIC8vIGV2ZW50X2N1cnNvcj1zZWxmLmV2ZW50X2N1cnNvciwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEyNwogICAgLy8gc2NoZWR1bGVfZW50cnlfY291bnQ9c2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExMjgKICAgIC8vIG91dHN0YW5kaW5nX3ByaW5jaXBhbD1zZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEyOQogICAgLy8gaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZT1zZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEzMAogICAgLy8gbm9taW5hbF9pbnRlcmVzdF9yYXRlPXNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTMxCiAgICAvLyBhY2NydWVkX2ludGVyZXN0PXNlbGYuYWNjcnVlZF9pbnRlcmVzdCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTMyCiAgICAvLyBjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4PXNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEzMwogICAgLy8gY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXg9c2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTM0CiAgICAvLyByZXNlcnZlZF9pbnRlcmVzdD1zZWxmLnJlc2VydmVkX2ludGVyZXN0LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExMzUKICAgIC8vIHJlc2VydmVkX3ByaW5jaXBhbD1zZWxmLnJlc2VydmVkX3ByaW5jaXBhbCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExMjAtMTEzNgogICAgLy8gcmV0dXJuIHR5cC5LZXJuZWxTdGF0ZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlPWFyYzQuVUludDgoc2VsZi5jb250cmFjdF90eXBlKSwKICAgIC8vICAgICBzdGF0dXM9c2VsZi5zdGF0dXMsCiAgICAvLyAgICAgdG90YWxfdW5pdHM9c2VsZi50b3RhbF91bml0cywKICAgIC8vICAgICByZXNlcnZlZF91bml0c190b3RhbD1zZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsLAogICAgLy8gICAgIGluaXRpYWxfZXhjaGFuZ2VfYW1vdW50PXNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQsCiAgICAvLyAgICAgZXZlbnRfY3Vyc29yPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgLy8gICAgIHNjaGVkdWxlX2VudHJ5X2NvdW50PXNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQsCiAgICAvLyAgICAgb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2U9c2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlLAogICAgLy8gICAgIG5vbWluYWxfaW50ZXJlc3RfcmF0ZT1zZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBhY2NydWVkX2ludGVyZXN0PXNlbGYuYWNjcnVlZF9pbnRlcmVzdCwKICAgIC8vICAgICBjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4PXNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCwKICAgIC8vICAgICBjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleD1zZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4LAogICAgLy8gICAgIHJlc2VydmVkX2ludGVyZXN0PXNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QsCiAgICAvLyAgICAgcmVzZXJ2ZWRfcHJpbmNpcGFsPXNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsLAogICAgLy8gKQogICAgdW5jb3ZlciAxNAogICAgaXRvYgogICAgdW5jb3ZlciAxNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDEzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDEwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgOQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDgKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTE2CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5nZXRfbmV4dF9kdWVfZXZlbnRbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfbmV4dF9kdWVfZXZlbnQ6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTE0MgogICAgLy8gaWYgc2VsZi5ldmVudF9jdXJzb3IgPj0gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgPj0KICAgIGJ6IGdldF9uZXh0X2R1ZV9ldmVudF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExNDQKICAgIC8vIGV2ZW50X2lkPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTQzLTExNTMKICAgIC8vIHJldHVybiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1zZWxmLmV2ZW50X2N1cnNvciwKICAgIC8vICAgICBldmVudF90eXBlPWFyYzQuVUludDgoMCksCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9VUludDY0KDApLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9VUludDY0KDApLAogICAgLy8gICAgIGZsYWdzPVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGl0b2IKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExNDUKICAgIC8vIGV2ZW50X3R5cGU9YXJjNC5VSW50OCgwKSwKICAgIGJ5dGVjIDQwIC8vIDB4MDAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExNDMtMTE1MwogICAgLy8gcmV0dXJuIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgIGV2ZW50X2lkPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgLy8gICAgIGV2ZW50X3R5cGU9YXJjNC5VSW50OCgwKSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1VSW50NjQoMCksCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1VSW50NjQoMCksCiAgICAvLyAgICAgZmxhZ3M9VUludDY0KDApLAogICAgLy8gKQogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTQ2CiAgICAvLyBzY2hlZHVsZWRfdGltZT1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTE0My0xMTUzCiAgICAvLyByZXR1cm4gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkoCiAgICAvLyAgICAgZXZlbnRfaWQ9c2VsZi5ldmVudF9jdXJzb3IsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1hcmM0LlVJbnQ4KDApLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPVVJbnQ2NCgwKSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249VUludDY0KDApLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPVVJbnQ2NCgwKSwKICAgIC8vICAgICBmbGFncz1VSW50NjQoMCksCiAgICAvLyApCiAgICBpdG9iCiAgICBzd2FwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKCmdldF9uZXh0X2R1ZV9ldmVudF9hZnRlcl9pbmxpbmVkX21vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmdldF9uZXh0X2R1ZV9ldmVudEA0OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEzOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpnZXRfbmV4dF9kdWVfZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTE1NAogICAgLy8gcmV0dXJuIHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLmV2ZW50X2N1cnNvcikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgZ2V0X25leHRfZHVlX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuZ2V0X25leHRfZHVlX2V2ZW50QDQKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5jb250cmFjdF91cGRhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF91cGRhdGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTUzLTE1NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGdyYW50cyB0aGUgdXBkYXRlIHBlcm1pc3Npb25zIHRvIHRoZSBBcnJhbmdlci4KICAgIC8vICMg4pqg77iPIFdBUk5JTkc6IEFwcGxpY2F0aW9uIHVwZGF0ZXMgbXVzdCBiZSBleGVjdXRlZCBWRVJZIGNhcmVmdWxseSwgYXMgdGhleQogICAgLy8gIyBtaWdodCBpbnRyb2R1Y2UgYnJlYWtpbmcgY2hhbmdlcy4KICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfcm90YXRlX2FycmFuZ2VyW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19yb3RhdGVfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2OQogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTcwCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gbmV3X2FycmFuZ2VyCiAgICBieXRlYyAxOCAvLyAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTcxCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfc2V0X29wX2RhZW1vbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfc2V0X29wX2RhZW1vbjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTg0CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODUKICAgIC8vIHNlbGYub3BfZGFlbW9uLnZhbHVlID0gYWRkcmVzcwogICAgYnl0ZWMgMjUgLy8gMHg1MjIzNGY3MDQ0NjE2NTZkNmY2ZTIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4NgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTczCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2Fzc2lnbl9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19hc3NpZ25fcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDE2CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLlJvbGVWYWxpZGl0eQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjExCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMgogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgcHVzaGludCAyMAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTAzCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gcm9sZV9hZGRyZXNzCiAgICBieXRlYyAxOCAvLyAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMKICAgIGRpZyAzCiAgICBhcHBfZ2xvYmFsX3B1dAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTQKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDYKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIGR1cAogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnRfbWFuYWdlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMyAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwOAogICAgLy8gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMiAvLyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTIKICAgIC8vIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIGR1cAogICAgcHVzaGludCA2MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE1CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMzIgLy8gMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE2CiAgICAvLyBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExOAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMSAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIwCiAgICAvLyBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMwogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgODAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIzCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI0IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI0CiAgICAvLyBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3Jldm9rZV9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19yZXZva2Vfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzUKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzNgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzcKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCkpCiAgICBidG9pCiAgICBkdXBuIDIKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCAhPSBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksIGVyci5JTlZBTElEX1JPTEUKICAgIGR1cAogICAgcHVzaGludCAyMAogICAgIT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyOAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIzIC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0NGQ2MTZlNjE2NzY1NzIyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMwCiAgICAvLyBkZWwgc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzOQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjE2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIyIC8vIDB4NTIyMzUwNzI2OTZkNjE3Mjc5NDQ2NTYxNmM2NTcyMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNAogICAgLy8gZGVsIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjM4CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIGR1cAogICAgcHVzaGludCA2MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAzMiAvLyAweDUyMjM1NDcyNzU3Mzc0NjU2NTIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzgKICAgIC8vIGRlbCBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjM4CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDEKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hdXRob3JpdHksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjEgLy8gMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MgogICAgLy8gZGVsIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzOAogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDQKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDgwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI0IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ2CiAgICAvLyBkZWwgc2VsZi5vYnNlcnZlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ292X2Fzc2V0X3N1c3BlbnNpb25bcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dvdl9hc3NldF9zdXNwZW5zaW9uOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kICAjIFRPRE86IFVwZGF0ZSBzcGVjcyBhbmQgYWRkIHRlc3QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzcKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDIxIC8vIDB4NTIyMzQxNzU3NDY4NmY3MjY5NzQ3OTIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU3CiAgICAvLyBzZWxmLmFzc2V0X3N1c3BlbmRlZCA9IHN1c3BlbmRlZAogICAgYnl0ZWMgMzMgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU4CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCAgIyBUT0RPOiBVcGRhdGUgc3BlY3MgYW5kIGFkZCB0ZXN0CiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYXJyYW5nZXJbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNjgKICAgIC8vIHJldHVybiBzZWxmLmFycmFuZ2VyLnZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTggLy8gMHg1MjIzNDE3MjcyNjE2ZTY3NjU3MjIzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJyYW5nZXIgZXhpc3RzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjYwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9hZGRyZXNzX3JvbGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfYWRkcmVzc19yb2xlczoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg0CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmFjY291bnRfbWFuYWdlciwgYWRkcmVzcyksCiAgICBieXRlYyAyMyAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMKICAgIGRpZyAxCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4NQogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5wcmltYXJ5X2RlYWxlciwgYWRkcmVzcyksCiAgICBieXRlYyAyMiAvLyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzCiAgICBkaWcgMgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODYKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYudHJ1c3RlZSwgYWRkcmVzcyksCiAgICBieXRlYyAzMiAvLyAweDUyMjM1NDcyNzU3Mzc0NjU2NTIzCiAgICBkaWcgMwogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODcKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYXV0aG9yaXR5LCBhZGRyZXNzKSwKICAgIGJ5dGVjIDIxIC8vIDB4NTIyMzQxNzU3NDY4NmY3MjY5NzQ3OTIzCiAgICBkaWcgNAogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODgKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYub2JzZXJ2ZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjQgLy8gMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzCiAgICB1bmNvdmVyIDUKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjcwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjIDQwIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDYKICAgIHNldGJpdAogICAgaW50Y18xIC8vIDEKICAgIHVuY292ZXIgNQogICAgc2V0Yml0CiAgICBwdXNoaW50IDIKICAgIHVuY292ZXIgNAogICAgc2V0Yml0CiAgICBwdXNoaW50IDMKICAgIHVuY292ZXIgMwogICAgc2V0Yml0CiAgICBwdXNoaW50IDQKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA1CiAgICAvLyByb2xlID0gcm9sZV9pZC5hc191aW50NjQoKQogICAgYnRvaQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwNgogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZSkKICAgIGR1cAogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDgKICAgIC8vIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgcHVzaGludHMgMjAgNDAgNTAgNjAgNzAgODAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDctMzM4CiAgICAvLyBtYXRjaCByb2xlOgogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgLy8gICAgICAgICByZXR1cm4gdHlwLlJvbGVWYWxpZGl0eSgKICAgIC8vICAgICAgICAgICAgIHJvbGVfdmFsaWRpdHlfc3RhcnQ9VUludDY0KDApLCByb2xlX3ZhbGlkaXR5X2VuZD1VSW50NjQoMCkKICAgIC8vICAgICAgICAgKQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5hdXRob3JpdHksIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5vYnNlcnZlciwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5vYnNlcnZlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBfOgogICAgLy8gICAgICAgICBvcC5lcnIoZXJyLklOVkFMSURfUk9MRSkKICAgIHVuY292ZXIgNgogICAgbWF0Y2ggcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8wQDIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8xQDMgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8yQDQgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8zQDUgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV80QDYgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV81QDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzgKICAgIC8vIG9wLmVycihlcnIuSU5WQUxJRF9ST0xFKQogICAgZXJyIC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzVANzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzQKICAgIC8vIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMjQgLy8gMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzMzLTMzNQogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMzNgogICAgLy8gcmV0dXJuIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzRANjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjkKICAgIC8vIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDIxIC8vIDB4NTIyMzQxNzU3NDY4NmY3MjY5NzQ3OTIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI4LTMzMAogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzEKICAgIC8vIHJldHVybiBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzNANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjQKICAgIC8vIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAzMiAvLyAweDUyMjM1NDcyNzU3Mzc0NjU2NTIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzIzLTMyNQogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI2CiAgICAvLyByZXR1cm4gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMkA0OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxOQogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAyMiAvLyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzE4LTMyMAogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMQogICAgLy8gcmV0dXJuIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8xQDM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzE0CiAgICAvLyBzZWxmLmFjY291bnRfbWFuYWdlciwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAyMyAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTMtMzE1CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxNgogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMEAyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwOS0zMTEKICAgIC8vIHJldHVybiB0eXAuUm9sZVZhbGlkaXR5KAogICAgLy8gICAgIHJvbGVfdmFsaWRpdHlfc3RhcnQ9VUludDY0KDApLCByb2xlX3ZhbGlkaXR5X2VuZD1VSW50NjQoMCkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLl9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IHZvaWQ6Cl9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI2CiAgICAvLyBkZWYgX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQoc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjgKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkLCBlcnIuU1VTUEVOREVECiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCAzODQKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIFN1c3BlbmRlZCBvcGVyYXRpb25zCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5fc2V0dGxlX3Bvc2l0aW9uKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NCwgdWludDY0Ogpfc2V0dGxlX3Bvc2l0aW9uOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjQ0CiAgICAvLyBkZWYgX3NldHRsZV9wb3NpdGlvbihzZWxmLCBob2xkaW5nX2FkZHJlc3M6IEFjY291bnQpIC0+IHR1cGxlW1VJbnQ2NCwgVUludDY0XToKICAgIHByb3RvIDEgMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo2MQogICAgLy8gcG9zaXRpb24gPSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jb3B5KCkKICAgIGR1cAogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NjMtNjUKICAgIC8vICMgQ29tcHV0ZSB0aGUgaW5jcmVtZW50YWwgcGVyLXVuaXQgZml4ZWQtcG9pbnQgaW50ZXJlc3QgYW5kIHByaW5jaXBhbCBhY2NydWVkCiAgICAvLyAjIHNpbmNlIHRoaXMgYWNjb3VudCdzIGxhc3QgY2hlY2twb2ludC4KICAgIC8vIGludGVyZXN0X2RlbHRhID0gc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IC0gcG9zaXRpb24uaW50ZXJlc3RfY2hlY2twb2ludAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggZXhpc3RzCiAgICBkaWcgMQogICAgcHVzaGludCA1NwogICAgZXh0cmFjdF91aW50NjQKICAgIC0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo2NwogICAgLy8gc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCAtIHBvc2l0aW9uLnByaW5jaXBhbF9jaGVja3BvaW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTcgLy8gImN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IGV4aXN0cwogICAgZGlnIDIKICAgIHB1c2hpbnQgNjUKICAgIGV4dHJhY3RfdWludDY0CiAgICAtCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzMKICAgIC8vIGludGVyZXN0X2RlbHRhLCBwb3NpdGlvbi51bml0cywgc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgZGlnIDIKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3MC03NAogICAgLy8gIyBDb252ZXJ0IHRoZSBwZXItdW5pdCBmaXhlZC1wb2ludCBkZWx0YXMgaW50byBhYnNvbHV0ZSBjbGFpbWFibGUgYW1vdW50cwogICAgLy8gIyB1c2luZyB0aGUgYWNjb3VudCdzIGFjdGl2ZSB1bml0cy4KICAgIC8vIGNsYWltYWJsZV9pbnRlcmVzdCA9IHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIGludGVyZXN0X2RlbHRhLCBwb3NpdGlvbi51bml0cywgc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgLy8gKQogICAgdW5jb3ZlciAzCiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojc2CiAgICAvLyBwcmluY2lwYWxfZGVsdGEsIHBvc2l0aW9uLnVuaXRzLCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzUtNzcKICAgIC8vIGNsYWltYWJsZV9wcmluY2lwYWwgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBwcmluY2lwYWxfZGVsdGEsIHBvc2l0aW9uLnVuaXRzLCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICAvLyApCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojc5LTgxCiAgICAvLyAjIEFjY3J1ZSB0aGUgY2xhaW1hYmxlIGFtb3VudHMgdG8gdGhlIGFjY291bnQgcG9zaXRpb24gYW5kIG1ha2UgdGhlbSBhdmFpbGFibGUKICAgIC8vICMgZm9yIHdpdGhkcmF3YWwuCiAgICAvLyBwb3NpdGlvbi5jbGFpbWFibGVfaW50ZXJlc3QgKz0gY2xhaW1hYmxlX2ludGVyZXN0CiAgICBkaWcgMgogICAgcHVzaGludCA3MwogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICArCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIHN3YXAKICAgIHJlcGxhY2UyIDczCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6ODIKICAgIC8vIHBvc2l0aW9uLmNsYWltYWJsZV9wcmluY2lwYWwgKz0gY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgZHVwCiAgICBwdXNoaW50IDgxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDIKICAgICsKICAgIGl0b2IKICAgIHJlcGxhY2UyIDgxCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6ODQtODYKICAgIC8vICMgQWR2YW5jZSB0aGUgYWNjb3VudCdzIHBlci11bml0IGZpeGVkLXBvaW50IGNoZWNrcG9pbnRzIHRvIHRoZSBjdXJyZW50IGdsb2JhbAogICAgLy8gIyBwZXItdW5pdCBmaXhlZC1wb2ludCBnbG9iYWwgaW5kaWNlcy4KICAgIC8vIHBvc2l0aW9uLmludGVyZXN0X2NoZWNrcG9pbnQgPSBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IGV4aXN0cwogICAgaXRvYgogICAgcmVwbGFjZTIgNTcKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo4NwogICAgLy8gcG9zaXRpb24ucHJpbmNpcGFsX2NoZWNrcG9pbnQgPSBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTcgLy8gImN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IGV4aXN0cwogICAgaXRvYgogICAgcmVwbGFjZTIgNjUKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo4OS05MAogICAgLy8gIyBBZHZhbmNlIHRoZSBhY2NvdW50J3MgZXZlbnQgY3Vyc29yIHRvIHRoZSBjdXJyZW50IGdsb2JhbCBldmVudCBjdXJzb3IuCiAgICAvLyBwb3NpdGlvbi5zZXR0bGVkX2N1cnNvciA9IHNlbGYuZXZlbnRfY3Vyc29yCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGl0b2IKICAgIHJlcGxhY2UyIDQ5CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6OTItOTQKICAgIC8vICMgVXBkYXRlIHRoZSBhY2NvdW50IHBvc2l0aW9uIGFuZCByZXR1cm4gdGhlIG5ld2x5IGFjY3J1ZWQgY2xhaW1hYmxlIGFtb3VudHMKICAgIC8vICMgYWRkZWQgdG8gdGhlIHRvdGFsIHBvc2l0aW9uJ3MgY2xhaW1hYmxlIGFtb3VudHMuCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHBvc2l0aW9uLmNvcHkoKQogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6OTUKICAgIC8vIHJldHVybiBjbGFpbWFibGVfaW50ZXJlc3QsIGNsYWltYWJsZV9wcmluY2lwYWwKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IHZvaWQ6Cl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojk3CiAgICAvLyBkZWYgX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQoc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQyMwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDAKICAgIC8vIGlmIHNlbGYuX3N0YXR1c19pc19wZW5kaW5nX2llZCgpOgogICAgYnogX2Vuc3VyZV91bml0c19hY3RpdmF0ZWRfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTAxCiAgICAvLyByZXR1cm4KICAgIHJldHN1YgoKX2Vuc3VyZV91bml0c19hY3RpdmF0ZWRfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwMwogICAgLy8gcG9zaXRpb24gPSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAyCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDQKICAgIC8vIGlmIHBvc2l0aW9uLnJlc2VydmVkX3VuaXRzID09IFVJbnQ2NCgwKToKICAgIHB1c2hpbnQgNDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgYm56IF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkX2FmdGVyX2lmX2Vsc2VANAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwNQogICAgLy8gcmV0dXJuCiAgICByZXRzdWIKCl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkX2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDgKICAgIC8vIHBvc2l0aW9uLnVuaXRzICs9IGFjdGl2YXRlZF91bml0cwogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMwogICAgKwogICAgaXRvYgogICAgcmVwbGFjZTIgMzIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDkKICAgIC8vIHBvc2l0aW9uLnJlc2VydmVkX3VuaXRzID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgaXRvYgogICAgcmVwbGFjZTIgNDAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTAKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gcG9zaXRpb24uY29weSgpCiAgICBmcmFtZV9kaWcgMgogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExMQogICAgLy8gYXNzZXJ0IHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPj0gYWN0aXZhdGVkX3VuaXRzLCBlcnIuT1ZFUl9ESVNUUklCVVRJT04KICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICBkdXAKICAgIGRpZyAyCiAgICA+PQogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCByZW1haW5pbmcgRC1BU0EgdW5pdHMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTIKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgLT0gYWN0aXZhdGVkX3VuaXRzCiAgICBzd2FwCiAgICAtCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX3NjYWxlZF9tdWxfZGl2KG11bHRpcGxpY2FuZDogdWludDY0LCBtdWx0aXBsaWVyOiB1aW50NjQsIGRpdmlzb3I6IHVpbnQ2NCkgLT4gdWludDY0Ogpfc2NhbGVkX211bF9kaXY6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNTMtMTU1CiAgICAvLyBkZWYgX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIHNlbGYsIG11bHRpcGxpY2FuZDogVUludDY0LCBtdWx0aXBsaWVyOiBVSW50NjQsIGRpdmlzb3I6IFVJbnQ2NAogICAgLy8gKSAtPiBVSW50NjQ6CiAgICBwcm90byAzIDEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE1NwogICAgLy8gaWYgbXVsdGlwbGljYW5kID09IFVJbnQ2NCgwKSBvciBtdWx0aXBsaWVyID09IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMwogICAgYnogX3NjYWxlZF9tdWxfZGl2X2lmX2JvZHlAMgogICAgZnJhbWVfZGlnIC0yCiAgICBibnogX3NjYWxlZF9tdWxfZGl2X2FmdGVyX2lmX2Vsc2VAMwoKX3NjYWxlZF9tdWxfZGl2X2lmX2JvZHlAMjoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE1OAogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKX3NjYWxlZF9tdWxfZGl2X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE1OQogICAgLy8gaGlnaCwgbG93ID0gb3AubXVsdyhtdWx0aXBsaWNhbmQsIG11bHRpcGxpZXIpCiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMgogICAgbXVsdwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTYwCiAgICAvLyByZXR1cm4gb3AuZGl2dyhoaWdoLCBsb3csIGRpdmlzb3IpCiAgICBmcmFtZV9kaWcgLTEKICAgIGRpdncKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9hbW91bnRfdG9faW5kZXhfZGVsdGEoYW1vdW50OiB1aW50NjQpIC0+IHVpbnQ2NDoKX2Ftb3VudF90b19pbmRleF9kZWx0YToKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE2MgogICAgLy8gZGVmIF9hbW91bnRfdG9faW5kZXhfZGVsdGEoc2VsZiwgYW1vdW50OiBVSW50NjQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTY0CiAgICAvLyBpZiBhbW91bnQgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0xCiAgICBibnogX2Ftb3VudF90b19pbmRleF9kZWx0YV9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE2NQogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKX2Ftb3VudF90b19pbmRleF9kZWx0YV9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNjYKICAgIC8vIGFzc2VydCBzZWxmLnRvdGFsX3VuaXRzID4gVUludDY0KDApLCBlcnIuTk9fVU5JVFMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICBkdXAKICAgIGFzc2VydCAvLyBObyBELUFTQSB1bml0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTY3CiAgICAvLyByZXR1cm4gc2VsZi5fc2NhbGVkX211bF9kaXYoYW1vdW50LCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLCBzZWxmLnRvdGFsX3VuaXRzKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5faW5kZXhfZGVsdGFfdG9fYW1vdW50KGluZGV4X2RlbHRhOiB1aW50NjQpIC0+IHVpbnQ2NDoKX2luZGV4X2RlbHRhX3RvX2Ftb3VudDoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE2OQogICAgLy8gZGVmIF9pbmRleF9kZWx0YV90b19hbW91bnQoc2VsZiwgaW5kZXhfZGVsdGE6IFVJbnQ2NCkgLT4gVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNzYKICAgIC8vIGlmIGluZGV4X2RlbHRhID09IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMQogICAgYm56IF9pbmRleF9kZWx0YV90b19hbW91bnRfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNzcKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9pbmRleF9kZWx0YV90b19hbW91bnRfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTc5CiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE4MQogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE3OC0xODIKICAgIC8vIHJldHVybiBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLnRvdGFsX3VuaXRzLAogICAgLy8gICAgIGluZGV4X2RlbHRhLAogICAgLy8gICAgIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZ2V0X3NjaGVkdWxlX2VudHJ5KGV2ZW50X2lkOiB1aW50NjQpIC0+IGJ5dGVzOgpfZ2V0X3NjaGVkdWxlX2VudHJ5OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjAyCiAgICAvLyBkZWYgX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLCBldmVudF9pZDogVUludDY0KSAtPiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeToKICAgIHByb3RvIDEgMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjA0CiAgICAvLyBhc3NlcnQgZXZlbnRfaWQgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LCBlcnIuSU5WQUxJRF9FVkVOVF9JRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICA+CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBpZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTkwCiAgICAvLyByZXR1cm4gZXZlbnRfaWQgLy8gVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMTYKICAgIC8KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjIwNgogICAgLy8gYXNzZXJ0IHBhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBpdG9iCiAgICBieXRlYyAzMSAvLyAweDUzMjMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE5NAogICAgLy8gcmV0dXJuIGV2ZW50X2lkICUgVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMTYKICAgICUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjIwOQogICAgLy8gYXNzZXJ0IG9mZnNldCA8IHBhZ2UubGVuZ3RoLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIHB1c2hpbnQgMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGRpZyAxCiAgICA+CiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMTAKICAgIC8vIHJldHVybiBwYWdlW29mZnNldF0uY29weSgpCiAgICBwdXNoaW50IDY1CiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIHB1c2hpbnQgNjUKICAgIGJveF9leHRyYWN0CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoY29udHJhY3RfdHlwZTogdWludDY0LCBldmVudF90eXBlOiB1aW50NjQpIC0+IHZvaWQ6Cl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZToKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMxMy0zMTUKICAgIC8vIGRlZiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgc2VsZiwgY29udHJhY3RfdHlwZTogVUludDY0LCBldmVudF90eXBlOiBVSW50NjQKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjU0LTI1NQogICAgLy8gIyBDaGVjayBjb21tb24gZXZlbnRzIGZpcnN0CiAgICAvLyBpZiBldmVudF90eXBlIGluIGNvbW1vbl9ldmVudHM6CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI0NwogICAgLy8gVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI0OAogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUCksCiAgICBpbnRjXzIgLy8gOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjU0LTI1NQogICAgLy8gIyBDaGVjayBjb21tb24gZXZlbnRzIGZpcnN0CiAgICAvLyBpZiBldmVudF90eXBlIGluIGNvbW1vbl9ldmVudHM6CiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjQ5CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX01EKSwKICAgIHB1c2hpbnQgMTkKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI1MAogICAgLy8gVUludDY0KGVudW1zLkVWVF9SUiksCiAgICBwdXNoaW50IDEyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyNTEKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIHB1c2hpbnQgMTEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDcKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDY6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyNTYKICAgIC8vIHJldHVybiBUcnVlCiAgICBpbnRjXzEgLy8gMQoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQ6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIHJldHN1YgoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI1OC0yNTkKICAgIC8vICMgQ29udHJhY3Qtc3BlY2lmaWMgYWRkaXRpb25hbCBldmVudHMKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX1BBTSk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyNjAtMjYxCiAgICAvLyAjIFBBTSBvbmx5IHN1cHBvcnRzIGNvbW1vbiBldmVudHMKICAgIC8vIHJldHVybiBGYWxzZQogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI2MwogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfTEFNKSBvciBjb250cmFjdF90eXBlID09IFVJbnQ2NCgKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAzCiAgICA9PQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjYzLTI2NQogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfTEFNKSBvciBjb250cmFjdF90eXBlID09IFVJbnQ2NCgKICAgIC8vICAgICBlbnVtcy5DVF9OQU0KICAgIC8vICk6CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlAMTEKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAyCiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMTYKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDExOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjY2LTI3MAogICAgLy8gIyBMQU0vTkFNIGFkZDogUFIsIElQQ0IKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyNjgKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyNjYtMjcwCiAgICAvLyAjIExBTS9OQU0gYWRkOiBQUiwgSVBDQgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMTMKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjY5CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgcHVzaGludCAxOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjY2LTI3MAogICAgLy8gIyBMQU0vTkFNIGFkZDogUFIsIElQQ0IKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gKQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDE0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDEzOgogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMTQ6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAxNjoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI3MgogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKToKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAyMwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjczLTI3OAogICAgLy8gIyBBTk4gYWRkczogUFIsIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyNzUKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyNzMtMjc4CiAgICAvLyAjIEFOTiBhZGRzOiBQUiwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjAKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Mjc2CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgcHVzaGludCAxOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjczLTI3OAogICAgLy8gIyBBTk4gYWRkczogUFIsIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDIwCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI3NwogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyNzMtMjc4CiAgICAvLyAjIEFOTiBhZGRzOiBQUiwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMjEKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjA6CiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF9mYWxzZUAyMToKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDIzOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjgwCiAgICAvLyBpZiBjb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9MQVgpOgogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDQKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAzMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjgxLTI4NwogICAgLy8gIyBMQVggYWRkczogUFIsIFBJLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjgzCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjgxLTI4NwogICAgLy8gIyBMQVggYWRkczogUFIsIFBJLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyOAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyODQKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgcHVzaGludCA0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyODEtMjg3CiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDI4CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI4NQogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIHB1c2hpbnQgMTgKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI4MS0yODcKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjgKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Mjg2CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICBwdXNoaW50IDUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI4MS0yODcKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMjkKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjg6CiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF9mYWxzZUAyOToKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDMxOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Mjg5CiAgICAvLyBpZiBjb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9DTE0pOgogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDUKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAzMwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjkwLTI5MQogICAgLy8gIyBDTE0gYWRkczogUFIKICAgIC8vIHJldHVybiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMzM6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyOTMKICAgIC8vIHJldHVybiBGYWxzZQogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKCi8vIG1vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9pc19keW5hbWljX2FubnVpdHkoKSAtPiB1aW50NjQ6Cl9pc19keW5hbWljX2FubnVpdHk6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozMzUKICAgIC8vIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMzNS0zMzYKICAgIC8vIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKQogICAgLy8gYW5kIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgYnogX2lzX2R5bmFtaWNfYW5udWl0eV9ib29sX2ZhbHNlQDMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMzNgogICAgLy8gYW5kIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDM0IC8vICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24gZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozMzUtMzM2CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIC8vIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGJ6IF9pc19keW5hbWljX2FubnVpdHlfYm9vbF9mYWxzZUAzCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzM0LTMzNwogICAgLy8gcmV0dXJuICgKICAgIC8vICAgICBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIC8vICAgICBhbmQgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICAvLyApCiAgICByZXRzdWIKCl9pc19keW5hbWljX2FubnVpdHlfYm9vbF9mYWxzZUAzOgogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMzNC0zMzcKICAgIC8vIHJldHVybiAoCiAgICAvLyAgICAgc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICAvLyAgICAgYW5kIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgLy8gKQogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnk6IGJ5dGVzKSAtPiB1aW50NjQsIGJ5dGVzOgpfZW50cnlfaW50ZXJlc3Rfc2VnbWVudDoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjM4MAogICAgLy8gZGVmIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KHNlbGYsIGVudHJ5OiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSkgLT4gVUludDY0OgogICAgcHJvdG8gMSAyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozODkKICAgIC8vIGVudHJ5LmFjY3J1YWxfZmFjdG9yID09IFVJbnQ2NCgwKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDE3CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozODktMzkxCiAgICAvLyBlbnRyeS5hY2NydWFsX2ZhY3RvciA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID09IFVJbnQ2NCgwKQogICAgLy8gb3Igc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID09IFVJbnQ2NCgwKQogICAgYnogX2VudHJ5X2ludGVyZXN0X3NlZ21lbnRfaWZfYm9keUAzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozOTAKICAgIC8vIG9yIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID09IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozODktMzkxCiAgICAvLyBlbnRyeS5hY2NydWFsX2ZhY3RvciA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID09IFVJbnQ2NCgwKQogICAgLy8gb3Igc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID09IFVJbnQ2NCgwKQogICAgYnogX2VudHJ5X2ludGVyZXN0X3NlZ21lbnRfaWZfYm9keUAzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozOTEKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozODktMzkxCiAgICAvLyBlbnRyeS5hY2NydWFsX2ZhY3RvciA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID09IFVJbnQ2NCgwKQogICAgLy8gb3Igc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID09IFVJbnQ2NCgwKQogICAgYm56IF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2FmdGVyX2lmX2Vsc2VANAoKX2VudHJ5X2ludGVyZXN0X3NlZ21lbnRfaWZfYm9keUAzOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzkzCiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfZGlnIC0xCiAgICB1bmNvdmVyIDIKICAgIHJldHN1YgoKX2VudHJ5X2ludGVyZXN0X3NlZ21lbnRfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Mzk1CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Mzk2CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Mzk3CiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Mzk0LTM5OAogICAgLy8gYWNjcnVlZCA9IHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSwKICAgIC8vICAgICBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQwMgogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjM5OS00MDMKICAgIC8vIHJldHVybiBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBhY2NydWVkLAogICAgLy8gICAgIGVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMAogICAgc3dhcAogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIGZyYW1lX2RpZyAtMQogICAgdW5jb3ZlciAyCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZGlzY291bnRfYW5udWl0eV9mYWN0b3IoZGlzY291bnRfZmFjdG9yOiB1aW50NjQsIHJlZGVtcHRpb25fZmFjdG9yOiB1aW50NjQpIC0+IHVpbnQ2NDoKX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDYyLTQ2NgogICAgLy8gZGVmIF9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcigKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgIGRpc2NvdW50X2ZhY3RvcjogVUludDY0LAogICAgLy8gICAgIHJlZGVtcHRpb25fZmFjdG9yOiBVSW50NjQsCiAgICAvLyApIC0+IFVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDY4CiAgICAvLyBpZiByZWRlbXB0aW9uX2ZhY3RvciA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGJueiBfZGlzY291bnRfYW5udWl0eV9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0NjkKICAgIC8vIHJldHVybiBkaXNjb3VudF9mYWN0b3IKICAgIGZyYW1lX2RpZyAtMgogICAgcmV0c3ViCgpfZGlzY291bnRfYW5udWl0eV9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDcwCiAgICAvLyBwZXJpb2RfcmF0ZSA9IHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgKyBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQ3MQogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQ3MC00NzQKICAgIC8vIHBlcmlvZF9yYXRlID0gc2VsZi5maXhlZF9wb2ludF9zY2FsZSArIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIHJlZGVtcHRpb25fZmFjdG9yLAogICAgLy8gICAgIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgKwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDc1CiAgICAvLyBhc3NlcnQgcGVyaW9kX3JhdGUgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZHVwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0NzgKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0NzYtNDgwCiAgICAvLyByZXR1cm4gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgZGlzY291bnRfZmFjdG9yLAogICAgLy8gICAgIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICAvLyAgICAgcGVyaW9kX3JhdGUsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeShlbnRyeTogYnl0ZXMsIHBheWxvYWQ6IGJ5dGVzKSAtPiBieXRlcywgYnl0ZXM6Cl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeToKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYxMy02MTUKICAgIC8vIGRlZiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkoCiAgICAvLyAgICAgc2VsZiwgZW50cnk6IHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5LCBwYXlsb2FkOiB0eXAuT2JzZXJ2ZWRFdmVudFJlcXVlc3QKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDIgMgogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2MjMKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF9pZCA9PSBzZWxmLmV2ZW50X2N1cnNvciwgZXJyLklOVkFMSURfRVZFTlRfQ1VSU09SCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgY3Vyc29yCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2MjQKICAgIC8vIGFzc2VydCBlbnRyeS5zY2hlZHVsZWRfdGltZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwgZXJyLk5PX0RVRV9DQVNIRkxPVwogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA8PQogICAgYXNzZXJ0IC8vIE5vIGR1ZSBjYXNoZmxvdyB0byBwYXkKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYyNgogICAgLy8gZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjI3CiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfSUVEKToKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgZHVwCiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMzUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjI4LTYzMAogICAgLy8gIyBJRUQgZmluYWxpemVzIGlzc3VhbmNlOiByZXNlcnZlZCB1bml0cyBiZWNvbWUgYWN0aXZhdGFibGUgYW5kIHRoZQogICAgLy8gIyBzY2hlZHVsZSdzIGluaXRpYWwgY29udHJhY3R1YWwgc3RhdGUgYmVjb21lcyBsaXZlLgogICAgLy8gYXNzZXJ0IHNlbGYuX3N0YXR1c19pc19wZW5kaW5nX2llZCgpLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYzMgogICAgLy8gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCA9PSBzZWxmLnRvdGFsX3VuaXRzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgID09CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2MzEtNjMzCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPT0gc2VsZi50b3RhbF91bml0cwogICAgLy8gKSwgZXJyLlBSSU1BUllfRElTVFJJQlVUSU9OX0lOQ09NUExFVEUKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBub3QgY29tcGxldGUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYzNAogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2MzUKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYzNgogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPSBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZQogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYzNwogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ID0gVUludDY0KDApCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2MzgKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IGVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA0MQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYzOQogICAgLy8gc2VsZi5ldmVudF9jdXJzb3IgKz0gVUludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjQwCiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbnVtcy5TVEFUVVNfQUNUSVZFKQogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgcHVzaGludCAxMDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0NTEKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwgZXJyLk5PVF9FVlRfSUVECiAgICBmcmFtZV9kaWcgMTEKICAgIGFzc2VydCAvLyBOb3QgSUVEIGV2ZW50CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0NTIKICAgIC8vIHJldHVybiBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjQxLTY0NQogICAgLy8gc2VsZi5fZW1pdF9leGVjdXRpb25fZXZlbnQoCiAgICAvLyAgICAgZW50cnk9ZW50cnksCiAgICAvLyAgICAgcGF5b2ZmPXNlbGYuX2VudHJ5X2llZF9hbW91bnQoZW50cnkpLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjQ0CiAgICAvLyBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjQxLTY0NQogICAgLy8gc2VsZi5fZW1pdF9leGVjdXRpb25fZXZlbnQoCiAgICAvLyAgICAgZW50cnk9ZW50cnksCiAgICAvLyAgICAgcGF5b2ZmPXNlbGYuX2VudHJ5X2llZF9hbW91bnQoZW50cnkpLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGNhbGxzdWIgX2VtaXRfZXhlY3V0aW9uX2V2ZW50CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgLTIKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjY0NgogICAgLy8gcmV0dXJuCiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2J1cnkgMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMzUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTQ3CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuX3N0YXR1c19pc19wZW5kaW5nX2llZCgpLCBlcnIuUEVORElOR19JRUQKICAgICEKICAgIGFzc2VydCAvLyBJRUQgbm90IHlldCBleGVjdXRlZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjQ5CiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgKz0gc2VsZi5fZW50cnlfaW50ZXJlc3Rfc2VnbWVudChlbnRyeSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQKICAgIGZyYW1lX2J1cnkgLTIKICAgICsKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjUxCiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUlIpOgogICAgZnJhbWVfZGlnIDEwCiAgICBwdXNoaW50IDEyCiAgICA9PQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAxMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjU1CiAgICAvLyBwYXlsb2FkLm9ic2VydmVkX3JhdGUsCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2NTYKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9tdWx0aXBsaWVyLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDM2IC8vICJyYXRlX3Jlc2V0X211bHRpcGxpZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9tdWx0aXBsaWVyIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjU3CiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjUyLTY1OAogICAgLy8gIyBSUiBkZXJpdmVzIHRoZSBuZXh0IHJhdGUgZnJvbSBhbiBvYnNlcnZlZCBvcmFjbGUgdmFsdWUgcGx1cyB0aGUKICAgIC8vICMgY29udHJhY3Qgc3ByZWFkIC8gbXVsdGlwbGllciB0ZXJtcywgdGhlbiBlbmZvcmNlcyBmbG9vciBhbmQgY2FwLgogICAgLy8gb2JzZXJ2ZWRfcmF0ZSA9IHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIHBheWxvYWQub2JzZXJ2ZWRfcmF0ZSwKICAgIC8vICAgICBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjY2MAogICAgLy8gb2JzZXJ2ZWRfcmF0ZSArIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzNSAvLyAicmF0ZV9yZXNldF9zcHJlYWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQgZXhpc3RzCiAgICArCiAgICBmcmFtZV9idXJ5IDYKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjczNAogICAgLy8gaWYgc2VsZi5oYXNfcmF0ZV9yZXNldF9mbG9vciBhbmQgcmF0ZSA8IHNlbGYucmF0ZV9yZXNldF9mbG9vcjoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzOCAvLyAiaGFzX3JhdGVfcmVzZXRfZmxvb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgZXhpc3RzCiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1NQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI5IC8vICJyYXRlX3Jlc2V0X2Zsb29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfZmxvb3IgZXhpc3RzCiAgICBmcmFtZV9kaWcgNgogICAgPgogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjczNQogICAgLy8gcmF0ZSA9IHNlbGYucmF0ZV9yZXNldF9mbG9vcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI5IC8vICJyYXRlX3Jlc2V0X2Zsb29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgNgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9mbG9vciBleGlzdHMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU1OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzM2CiAgICAvLyBpZiBzZWxmLmhhc19yYXRlX3Jlc2V0X2NhcCBhbmQgcmF0ZSA+IHNlbGYucmF0ZV9yZXNldF9jYXA6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzkgLy8gImhhc19yYXRlX3Jlc2V0X2NhcCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgZXhpc3RzCiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1OAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDMwIC8vICJyYXRlX3Jlc2V0X2NhcCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X2NhcCBleGlzdHMKICAgIGZyYW1lX2RpZyA2CiAgICA8CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1OAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzM3CiAgICAvLyByYXRlID0gc2VsZi5yYXRlX3Jlc2V0X2NhcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDMwIC8vICJyYXRlX3Jlc2V0X2NhcCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDYKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfY2FwIGV4aXN0cwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTg6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2NTkKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gc2VsZi5fY2xhbXBfcmF0ZSgKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjY1OS02NjEKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gc2VsZi5fY2xhbXBfcmF0ZSgKICAgIC8vICAgICBvYnNlcnZlZF9yYXRlICsgc2VsZi5yYXRlX3Jlc2V0X3NwcmVhZAogICAgLy8gKQogICAgZnJhbWVfZGlnIDYKICAgIGFwcF9nbG9iYWxfcHV0CgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAxODoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjY3MQogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1BJKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCA0CiAgICA9PQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAyMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjcyCiAgICAvLyBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9IGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjY3MwogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMjM6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2NzgKICAgIC8vIGlmIHNlbGYuX2lzX2R5bmFtaWNfYW5udWl0eSgpOgogICAgY2FsbHN1YiBfaXNfZHluYW1pY19hbm51aXR5CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDI5CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2NzkKICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QUkYpOgogICAgZnJhbWVfZGlnIDEwCiAgICBwdXNoaW50IDUKICAgID09CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAzMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDkwCiAgICAvLyBkaXNjb3VudF9mYWN0b3IgPSBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQ5MQogICAgLy8gZGVub21pbmF0b3IgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQ5MgogICAgLy8gc2tpcF9maXJzdF9yZWRlbXB0aW9uID0gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDcKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQ5NAogICAgLy8gaWYgZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAyNQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgZnJhbWVfYnVyeSA4CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAzNQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDk1LTQ5OQogICAgLy8gIyBBbiBpbml0aWFsIFBSRiBtYXkgZGVzY3JpYmUgdGhlIGZpcnN0IHJlZGVtcHRpb24gcGVyaW9kIGRpcmVjdGx5LgogICAgLy8gZGlzY291bnRfZmFjdG9yID0gc2VsZi5fZGlzY291bnRfYW5udWl0eV9mYWN0b3IoCiAgICAvLyAgICAgZGlzY291bnRfZmFjdG9yLAogICAgLy8gICAgIGVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDgKICAgIGNhbGxzdWIgX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTAxCiAgICAvLyBza2lwX2ZpcnN0X3JlZGVtcHRpb24gPSBUcnVlCiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfYnVyeSA3CiAgICBmcmFtZV9idXJ5IDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDM1OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTAzCiAgICAvLyBmdXR1cmVfZXZlbnRfaWQgPSBzZWxmLmV2ZW50X2N1cnNvciArIFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfd2hpbGVfdG9wQDM2OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTA0CiAgICAvLyB3aGlsZSBmdXR1cmVfZXZlbnRfaWQgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgZnJhbWVfZGlnIDMKICAgID4KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl93aGlsZUA0OAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTA1CiAgICAvLyBmdXR1cmVfZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoZnV0dXJlX2V2ZW50X2lkKQogICAgZnJhbWVfZGlnIDMKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjUwNgogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPSBmdXR1cmVfZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1MDctNTA4CiAgICAvLyAjIE9ubHkgcmVkZW1wdGlvbi1iZWFyaW5nIGV2ZW50cyBjb250cmlidXRlIHRvIHRoZSBhbm51aXR5IGRlbm9taW5hdG9yLgogICAgLy8gaXNfcmVkZW1wdGlvbl9ldmVudCA9IGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpIG9yICgKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjUwNy01MTEKICAgIC8vICMgT25seSByZWRlbXB0aW9uLWJlYXJpbmcgZXZlbnRzIGNvbnRyaWJ1dGUgdG8gdGhlIGFubnVpdHkgZGVub21pbmF0b3IuCiAgICAvLyBpc19yZWRlbXB0aW9uX2V2ZW50ID0gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QUikgb3IgKAogICAgLy8gICAgIGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfTUQpCiAgICAvLyAgICAgYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICAvLyApCiAgICBibnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfdHJ1ZUA0MAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTA5CiAgICAvLyBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgZnJhbWVfZGlnIDQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1MDktNTEwCiAgICAvLyBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgLy8gYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF9mYWxzZUA0MQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTEwCiAgICAvLyBhbmQgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IgPiBVSW50NjQoMCkKICAgIGZyYW1lX2RpZyAwCiAgICBwdXNoaW50IDI1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTA5LTUxMAogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCkKICAgIC8vIGFuZCBmdXR1cmVfZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX3RydWVANDA6CiAgICBpbnRjXzEgLy8gMQoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfbWVyZ2VANDI6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1MTIKICAgIC8vIGlmIGlzX3JlZGVtcHRpb25fZXZlbnQ6CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA0NwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTEzCiAgICAvLyBpZiBza2lwX2ZpcnN0X3JlZGVtcHRpb246CiAgICBmcmFtZV9kaWcgNwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUA0NQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTE0CiAgICAvLyBza2lwX2ZpcnN0X3JlZGVtcHRpb24gPSBGYWxzZQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgNwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANDc6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1MjEKICAgIC8vIGZ1dHVyZV9ldmVudF9pZCArPSBVSW50NjQoMSkKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV93aGlsZV90b3BAMzYKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlANDU6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1MTgKICAgIC8vIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZnJhbWVfZGlnIDAKICAgIHB1c2hpbnQgMjUKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1MTYtNTE5CiAgICAvLyBkaXNjb3VudF9mYWN0b3IgPSBzZWxmLl9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcigKICAgIC8vICAgICBkaXNjb3VudF9mYWN0b3IsCiAgICAvLyAgICAgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMgogICAgc3dhcAogICAgY2FsbHN1YiBfZGlzY291bnRfYW5udWl0eV9mYWN0b3IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1MjAKICAgIC8vIGRlbm9taW5hdG9yICs9IGRpc2NvdW50X2ZhY3RvcgogICAgZnJhbWVfZGlnIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA0NwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDE6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF9tZXJnZUA0MgoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX3doaWxlQDQ4OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTIzCiAgICAvLyBhc3NlcnQgZGVub21pbmF0b3IgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZnJhbWVfZGlnIDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjUyNAogICAgLy8gbnVtZXJhdG9yID0gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTI1CiAgICAvLyBpZiBlbnRyeS5mbGFncyAmIFVJbnQ2NChlbnVtcy5GTEFHX0lOSVRJQUxfUFJGKSA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNTcKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gOAogICAgJgogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDUwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1MjYtNTI3CiAgICAvLyAjIFN1YnNlcXVlbnQgUFJGIGV2ZW50cyBhbW9ydGl6ZSBib3RoIHByaW5jaXBhbCBhbmQgYWxyZWFkeSBhY2NydWVkIGNhcnJ5LgogICAgLy8gbnVtZXJhdG9yICs9IHNlbGYuYWNjcnVlZF9pbnRlcmVzdAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgICsKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDUwOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTMwCiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTI4LTUzMgogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIG51bWVyYXRvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gICAgIGRlbm9taW5hdG9yLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDEKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2ODAKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IHNlbGYuX3JlY2FsY3VsYXRlX2FubnVpdHlfcGF5bWVudCgKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjgwLTY4MgogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gc2VsZi5fcmVjYWxjdWxhdGVfYW5udWl0eV9wYXltZW50KAogICAgLy8gICAgIGVudHJ5CiAgICAvLyApCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMzA6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2ODUKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjY4Ni02OTAKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1VSW50NjQoMCksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2ODgKICAgIC8vIHBheW9mZj1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Njg5CiAgICAvLyBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICBkdXAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjY4Ni02OTAKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1VSW50NjQoMCksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgY2FsbHN1YiBfZW1pdF9leGVjdXRpb25fZXZlbnQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDI5OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Njg0CiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDMwCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDIwOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Njc0CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9JUENCKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCAxOAogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDIzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2NzUtNjc2CiAgICAvLyAjIElQQ0Iga2VlcHMgcHJpbmNpcGFsIHVuY2hhbmdlZCBhbmQgb25seSByZXNldHMgdGhlIGludGVyZXN0IGJhc2UuCiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIGIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMjMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMTA6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2NjIKICAgIC8vIGVsaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1JSRik6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgMTEKICAgID09CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDE0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2NjMKICAgIC8vIG5leHRfcmF0ZSA9IGVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjY0CiAgICAvLyBpZiBuZXh0X3JhdGUgPT0gVUludDY0KDApOgogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDEzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2NjUKICAgIC8vIG5leHRfcmF0ZSA9IHNlbGYucmF0ZV9yZXNldF9uZXh0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzcgLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDUKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfbmV4dCBleGlzdHMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjY2CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IG5leHRfcmF0ZQogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgZnJhbWVfZGlnIDUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDE0OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjY4CiAgICAvLyBpZiBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSAhPSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgOQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMTgKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjY2OQogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPSBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZQogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgZnJhbWVfZGlnIDkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CgoKLy8gbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KGVudHJ5OiBieXRlcywgcGF5b2ZmOiB1aW50NjQsIHNldHRsZWRfYW1vdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpfZW1pdF9leGVjdXRpb25fZXZlbnQ6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2OTYtNzAyCiAgICAvLyBkZWYgX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgKiwKICAgIC8vICAgICBlbnRyeTogdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnksCiAgICAvLyAgICAgcGF5b2ZmOiBVSW50NjQsCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ6IFVJbnQ2NCwKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDMgMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzA2CiAgICAvLyBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25JRAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzA3CiAgICAvLyBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIGZyYW1lX2RpZyAtMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3MDgKICAgIC8vIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIGZyYW1lX2RpZyAtMwogICAgZXh0cmFjdCA4IDEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjcwOQogICAgLy8gc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICBmcmFtZV9kaWcgLTMKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3MTAKICAgIC8vIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3MTMKICAgIC8vIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIGZyYW1lX2RpZyAtMwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzA4CiAgICAvLyBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICBpbnRjXzIgLy8gOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzEzCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBnZXRieXRlCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3NDIKICAgIC8vIGlmIHBheW9mZiA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJueiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3NDMKICAgIC8vIHJldHVybiBVSW50NjQoZW51bXMuUEFZT0ZGX1NJR05fUE9TSVRJVkUpCiAgICBpbnRjXzEgLy8gMQoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX3BheW9mZl9zaWduQDc6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3MTItNzE0CiAgICAvLyBwYXlvZmZfc2lnbj1hcmM0LlVJbnQ4KAogICAgLy8gICAgIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIC8vICksCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgaW50Y18yIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3MTYKICAgIC8vIGN1cnJlbmN5X2lkPXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzE3CiAgICAvLyBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3MDUtNzE4CiAgICAvLyBFeGVjdXRpb25FdmVudCgKICAgIC8vICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIC8vICAgICBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYXBwbGllZF9hdD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICBwYXlvZmY9cGF5b2ZmLAogICAgLy8gICAgIHBheW9mZl9zaWduPWFyYzQuVUludDgoCiAgICAvLyAgICAgICAgIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIC8vICAgICApLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PXNldHRsZWRfYW1vdW50LAogICAgLy8gICAgIGN1cnJlbmN5X2lkPXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAwCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzA0LTcxOQogICAgLy8gYXJjNC5lbWl0KAogICAgLy8gICAgIEV4ZWN1dGlvbkV2ZW50KAogICAgLy8gICAgICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgICAgIHBheW9mZj1wYXlvZmYsCiAgICAvLyAgICAgICAgIHBheW9mZl9zaWduPWFyYzQuVUludDgoCiAgICAvLyAgICAgICAgICAgICBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICAvLyAgICAgICAgICksCiAgICAvLyAgICAgICAgIHNldHRsZWRfYW1vdW50PXNldHRsZWRfYW1vdW50LAogICAgLy8gICAgICAgICBjdXJyZW5jeV9pZD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgICAgIHNlcXVlbmNlPWVudHJ5LmV2ZW50X2lkICsgVUludDY0KDEpLAogICAgLy8gICAgICkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDlhMzMyYjk1IC8vIG1ldGhvZCAiRXhlY3V0aW9uRXZlbnQodWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojc0NAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiAoVUludDY0KGVudW1zLkVWVF9JRUQpLCBVSW50NjQoZW51bXMuRVZUX1BJKSk6CiAgICBmcmFtZV9kaWcgNQogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBibnogX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2lmX2JvZHlANQogICAgZnJhbWVfZGlnIDUKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGJ6IF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pZl9lbHNlQDYKCl9lbWl0X2V4ZWN1dGlvbl9ldmVudF9pZl9ib2R5QDU6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3NDUKICAgIC8vIHJldHVybiBVSW50NjQoZW51bXMuUEFZT0ZGX1NJR05fUE9TSVRJVkUpCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzEzCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBiIF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pbmxpbmVkX21vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9wYXlvZmZfc2lnbkA3CgpfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzQ2CiAgICAvLyByZXR1cm4gVUludDY0KGVudW1zLlBBWU9GRl9TSUdOX05FR0FUSVZFKQogICAgcHVzaGludCAyNTUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjcxMwogICAgLy8gc2VsZi5fcGF5b2ZmX3NpZ24oZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSwgcGF5b2ZmKQogICAgYiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fcGF5b2ZmX3NpZ25ANwoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9yb2xlX2lzX2FjdGl2ZShyb2xlX21hcDogYnl0ZXMsIHJvbGVfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NDoKX3JvbGVfaXNfYWN0aXZlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU3CiAgICAvLyBkZWYgX3JvbGVfaXNfYWN0aXZlKHNlbGYsIHJvbGVfbWFwOiB0eXAuUmJhY1JvbGUsIHJvbGVfYWRkcmVzczogQWNjb3VudCkgLT4gYm9vbDoKICAgIHByb3RvIDIgMQogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5CiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5LTYwCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5LTYxCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjEKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAtNjEKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgPj0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX21lcmdlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKSAtPiB2b2lkOgpfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2NQogICAgLy8gYXNzZXJ0IHNlbGYuX2lzX2FycmFuZ2VyKFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTIKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgPT0gc2VsZi5hcnJhbmdlci52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE4IC8vIDB4NTIyMzQxNzI3MjYxNmU2NzY1NzIyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgPT0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2NQogICAgLy8gYXNzZXJ0IHNlbGYuX2lzX2FycmFuZ2VyKFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpIC0+IHZvaWQ6Cl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4MwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFzc2V0X2RlZmF1bHRlZCwgZXJyLkRFRkFVTFRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQxIC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfZGVmYXVsdGVkIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIERlZmF1bHRlZAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkgLT4gdm9pZDoKX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg2CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYXNzZXRfc3VzcGVuZGVkLCBlcnIuU1VTUEVOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzMgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9zdXNwZW5kZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gU3VzcGVuZGVkIG9wZXJhdGlvbnMKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkOiB1aW50NjQpIC0+IHZvaWQ6Cl9hc3NlcnRfdmFsaWRfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OAogICAgLy8gZGVmIF9hc3NlcnRfdmFsaWRfcm9sZShzZWxmLCByb2xlX2lkOiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTAKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIHB1c2hpbnQgMjAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkxCiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgcHVzaGludCAyNQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTIKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICBwdXNoaW50IDQwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MwogICAgLy8gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgcHVzaGludCA1MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTQKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgcHVzaGludCA2MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTUKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICBwdXNoaW50IDcwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NgogICAgLy8gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgcHVzaGludCA4MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfZmFsc2VAOAoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3OgogICAgaW50Y18xIC8vIDEKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX21lcmdlQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgcmV0c3ViCgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9mYWxzZUA4OgogICAgaW50Y18wIC8vIDAKICAgIGIgX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfbWVyZ2VAOQo=", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" + }, + "byteCode": { + "approval": "DCAEAAEIICYwBBUffHUGc3RhdHVzDGV2ZW50X2N1cnNvchVvdXRzdGFuZGluZ19wcmluY2lwYWwUc2NoZWR1bGVfZW50cnlfY291bnQRZml4ZWRfcG9pbnRfc2NhbGUQYWNjcnVlZF9pbnRlcmVzdBlpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlClIjQWNjb3VudCMVbm9taW5hbF9pbnRlcmVzdF9yYXRlFHJlc2VydmVkX3VuaXRzX3RvdGFsEnJlc2VydmVkX3ByaW5jaXBhbA1jb250cmFjdF90eXBlC3RvdGFsX3VuaXRzGW5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24RcmVzZXJ2ZWRfaW50ZXJlc3QZY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleBpjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleAtSI0FycmFuZ2VyIxNzZXR0bGVtZW50X2Fzc2V0X2lkF2luaXRpYWxfZXhjaGFuZ2VfYW1vdW50DFIjQXV0aG9yaXR5IxBSI1ByaW1hcnlEZWFsZXIjEVIjQWNjb3VudE1hbmFnZXIjC1IjT2JzZXJ2ZXIjC1IjT3BEYWVtb24jFWluaXRpYWxfZXhjaGFuZ2VfZGF0ZRV0cmFuc2Zlcl9vcGVuaW5nX2RhdGUVdHJhbnNmZXJfY2xvc3VyZV9kYXRlEHJhdGVfcmVzZXRfZmxvb3IOcmF0ZV9yZXNldF9jYXACUyMKUiNUcnVzdGVlIw9hc3NldF9zdXNwZW5kZWQcZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbhFyYXRlX3Jlc2V0X3NwcmVhZBVyYXRlX3Jlc2V0X211bHRpcGxpZXIPcmF0ZV9yZXNldF9uZXh0FGhhc19yYXRlX3Jlc2V0X2Zsb29yEmhhc19yYXRlX3Jlc2V0X2NhcAEAD2Fzc2V0X2RlZmF1bHRlZA9wcm9zcGVjdHVzX2hhc2gOcHJvc3BlY3R1c191cmwVZGVub21pbmF0aW9uX2Fzc2V0X2lkDW1hdHVyaXR5X2RhdGUUZGF5X2NvdW50X2NvbnZlbnRpb24DBoEBMRhAAK0nEjIDZycZMgNnJyEiZycpImcpImcnDCJnJyqAAGcnK4AAZycsImcnEyJnJxoiZyctImcnGyJnJxwiZycuImcnDSJnJwoiZycUImcrImcnDiJnJyIiZycHImcnBiJnJwkiZycjImcnJCJnJx0iZyceImcnJSJnJyYiZycnImcnCyJnJw8iZycQImcnESJnKiJnJwQiZycFImcxNYEEEkQxNIElEkQxNxREMTYURIAEkU8E6zYaAI4BAMAxGRREMRhBAKmCFwS0RhjIBOeDJSkEfqIOCwRshePuBL3RqUQE3AY7NQQU/BDvBHSnKX8ECdT+FASam/qFBIXu0z0EkYUQSgTZ8iWsBG4OXJUE/z/UswSC9xstBO8E9dME3zQ1UAQ9voC9BN9U6CwEAQyCmQR0BqzSBBpyou42GgCOFwAbAscEIwRNBNcFyAYCBloGjQa7CK4J6ApiC9QMZwytDMUM3Q2SDigORw5SDpwAgASVbXFWNhoAjgEGmAAxGYEEEjEYEERCDI0igABHCjYaAUkVJBJEFyIpZUREiBSjiBSqiBSvIillRIEyEhREIkcCSwJLBAxBAlEiKmVEIicEZUQMQQJEIiplRIgQA0lFEYEJW0lFBjIHDUACLksPJFVJRRAkEklFB0AAEEsOgQMSQAAISw6BExJBAjYjQQILSw8iWyIqZUQSREsEMgcOREsFQAHkSw6BExJAAdwiRQ1LDyRVSUUQgQMSQAFgSw6BExJAAVgiRQhLD4ExW0UKiBCMQAD7SwlFC0sMiA9JSwiID0RLAYgPXklOAkURSYgPVUlFDUsCSwEISUUMMgoiJxNlRHAARCInD2VEIicLZURLAQhLAksBD0RPAkwJTwIPRE8DCCcPTGciJwtlRAgnC0xnIicQZURPAggnEExnIicRZUQIJxFMZ0sPJFWBAxJBAHciJwZlREsQiBAYRRIIJwZMZ4gP+EEACksPJFWBExJBAAlLD4EpWycOTGcrSwpnJwdLC2ciKmVEIwgqTGdLD1cIAYABE6hBABAiK2VEQAAJKYHIAWcnByJnSw9LB0mIEnFISwFLDghFAklLCQhFAUsCIwhFA0L+eScGImdC/5NLDyRVSUUQgQMSQQAPIitlREsICUlFC0ULQv7tSw4kEkEAEiIrZUxFC0QiJwdlTEUMREL+1EsOgRMSQAAHSwlFC0L+xSJFCiJFC0L+vIgPPkEAU0sOgRMSQQAJIitlREUIQv6UIicGZURLEIgPNkUSCElFDSInDmVED0EABiJFCEL+dSInDmVESwwJSUUKIitlRA1BAAkiK2VERQhC/llLCEUIQv5SSw+BMVsiK2VESg5ETAlFCEL+PyInBmVESxCIDuFFEghFDUL+FUsCSURLAklLA0lOAwgyB08CFk8DFlBPAhZQTwIWUEwWUChMULAjQyJC/ceAAEcCNhoBRwIVJRJENhoCSSJZgQIISwEVEkRXAgBMIillREQnCExQSb1FAUQiJxllRDIDE0EAIjEAIicZZUQSQAAVMQBLAxJAAA0xAEsBvkRXACASQQEAI0SIEbqIEb8iKWVEgTISFERLAkmIDISIDAdGAkm+REmBSVtJTgJFCEmBUVtJRQhPAghJRQZEVwAgIicTZURwAEUBQQC3Sb5EgYADU0AArSNBAHgyCiInE2VETEsBcABESwVJTgIPREsCSU4DvkRJVwAgsTIATwOyEkyyFE8CshGBBLIQsgGzSYFJW0lOAkUJSYFRW0lOA0UJIhZMSwFcSUxcUU8DTL8iJw9lRElLAg9EIicLZURLAw9ETAknD0xnIicLZURMCScLTGdLBUlLBklOAwgyB08CFk8DFlBPAhZQTBZQSwJJFRZXBgJMUEyAAgAiUExQKExQsCNDIkL/UCJC/v02GgFJFSQSRBc2GgJJFSQSRBeIEJxKDEQnG08CZyccTGcyBxYoTFCwI0M2GgFJFSUSRDYaAkkVJBJEF0lOAiIpZUREJxYxAIgQM0SIEG2IEHIiKWVEgTISRCcISwJQSU4DvUUBREyICqNJRCInCmVECCInDWVEDkQiJxplREEACTIHIicaZUQOREcCvkSBKFtLA0lOAwgWgShMuyInCmVECCcKSwFnIicNZURMCRYoTFCwI0MiSTYaAUkVJRJENhoCSRUlEkQ2GgNHAhUkEkQXIillRESID+OID+giKWVEgTISFEQiJxtlREEACSInG2VEMgcORCInHGVEQQAJMgciJxxlRAxEMQBLBElOAhJEJwhLAVBJRQhJvUUBRCcISwVJTgJQSUUJvUUBREsCiAncSYgJ2E8CE0RLAUlETL5EJVsORCIqZUQiJwRlRA9AAA4iKmVEiArogQlbMgcNREsDSYgKM0sDSU4CiAoriAmuRgKICalGAksFSb5EJVtLAklOAksBDkRLAQkWTwIlTwK7SwVJvkQlW08CCBYlTLsoSwJQsCNDNhoBSRUlEkQ2GgJJFSMSRCJTJxUxAIgOv0QnCE8CUEm9RQFESYEwI7oiTwNUgTBMuzIHFihMULAjQzYaAUkVJRJENhoCSRUlEkQnFzEAiA6HRCIpZUSByAESFESIDreIDrwnCE8CUEm9RQEURCIWTwJLAVBLAVAnKFBLAVBLAVBLAVBLAVBMUL8yBxYoTFCwI0M2GgFJFSUSRDYaAkkVJRJEJwhLAlBJvUUBRDEATwMSRIgOYYgOZiJPArsyBxYoTFCwI0M2GgFJFSUSRCcITFBJvUUBRL5IKExQsCNDNhoBSRUlEkQnEkxnMgcWKExQsCNDgABJNhoBRwIVgWsSRDYaAklOAhWBSBJENhoDSU4CSRVLASVZSYEiEkRPAkxLAlJJTgMiWYEkCBJEiA3dIlVJJwxLAWdBACJJIxJAABxJgQISQAAVSYEDEkAADkmBBBJAAAdJgQUSQQGGI0QiJwxlTEUCREsESYEhW0lFCESBOVVJRQhBAB9LBiMSQAAYSwaBAhJAABBLBoEDEkAACEsGgQQSQQFGI0RJIxNBAAhLBIGSBlMURCIpZUQURCInFGVEFERLBEkjW0lxC0UBRCcsSwFnSwGBCVtJTwISRCcTSwFnsTIAMgoishKyFEyyEYEEshCyAbNJgRFbJw1MZycKImcnLksIZ0mBKVsnGksBZ0sBgTFbJy1LAWdLBklOAoEwWycOTGcnFEsKZ0sDgZIGUyciTGdLAYEQWytMZ0sBgShbJwZMZ0sBJVsnCUxnSwGBGFsnB0xnSwOBOlsnI0xnSwOBQlsnJExnSwOBSlsnHUxnSwOBUlsnHkxnSwOBWlsnJUxnSwOBkAZTJyZMZ0sDgZEGUycnTGdPA4FjWycFTGdLASRbKkxnSwGBOFsnEExnSwGBQFsnEUxnJw8iZycLImdLAjIHDURMIltLAgxEDERLAlcAICcqTGdLAVcCACcrTGcyBxYoTFCwI0MiQv63IkL+dyKAAEcDNhoBSRUkEkQXSTYaAkkVIxJEIlNMNhoDSU4CSSJZSU4DSYFBC4ECCE8CFRJEiAvxIicMZUxOA0QiKWVEFERJgRAORCInFGVEREyBEAtMgWQLgeYLCEkyDA1BABixgQayEIEFshknL7IeJy+yHyKyAbNC/+EiRQpLCUsEDEEAjksEVwIASUUNSwpJTgKBQQuBQVhJJFVJTgJFDkkiW0lFDUsFTwQISwESREsFTwOIBzRMgQlbSUUKREEAGUsJQQAnSwkjCYFBC0sMTIFBWIEJW0sIDkRLCEAABUsKIxJESwkjCEUKQv+QSwZJRCMJFicfTFBJvUUBREkigQK6F0lEIwmBQQuBAgiBQbpC/8BLBhYnH0xQSbxISwW/SwVBAA1LAUsECCcETGcpgTJnMgcWKExQsCNDIillRESICuSICuuICvAiKmVEIicEZURLAQ1EiAZcSVcIAUmAAQGoREsBVwAISwJXCQhLA1cRCEsEVxkISwVXIQhLBlcpCEsHVzEISwhXOQhPB08IUE8HUE8GUE8FUCIWUE8EUE8DUE8CUExQiAePRgIyBxYoTFCwI0MiRwSAAEk2GgFJFSQSRBc2GgJHAhWBSRJEIillRESICluICmCBQVtJgQQaQQC2IicMZUSBBRJEiAo4IicMZURJgQUSREsCSSJbSUUHIicEZUQSRElXCAFFDCRViAXXIicEZUSBEAqAAgAARQcWJx9MUElFCb1FAUEAB0sHvkxFB0RLBUkiWUmBEAxESwNJVwkISwFXEQhLAlcZCEsDVykISwRXMQhPBVc5CEsLFksSUE8GUE8FUE8EUE8DUE8CUExQSwMWUE8CTFBMIwgWVwYCXABLCEm8SEy/IicEZUQjCCcETGciKmVESwNJTwISRIgFDklFCElXCAFFCiRVSUUGIxJAAChLBIEEEkAAIEsEgQwSQAAYSwSBCxJAABBLBIESEkAACEsEgQUSQQBBI0RLCIABAalESwSBDBJAAAhLBIELEkEAJCNBABonGDEAiAjtREsGSwKIBitGAjIHFihMULAjQ4gJC0L/6CJC/9kiQv+8IillRElEIicMZUQWSZMkDkRXBwEiJw1lRCInCmVEIicUZUQiKmVEIicEZUQiK2VEIicHZUQiJwllRCInBmVEIicQZUQiJxFlRCInD2VEIicLZURPDhZPDkxQTw0WUE8MFlBPCxZQTwoWUE8JFlBPCBZQTwcWUE8GFlBPBRZQTwQWUE8DFlBPAhZQTBZQKExQsCNDIillREQiKmVEIicEZUQPQQAlIiplRBYnKFAiFkxLAVBLAVBLAVBLAVBLAVBLAVBMUChMULAjQyIqZUSIA71C//CICCkjQzYaAUkVJRJEiAgcJxJMZzIHFihMULAjQzYaAUkVJRJEiAgEJxlMZzIHFihMULAjQzYaAUkVIxJENhoCSU4CFSUSRDYaA0lOAhWBEBJEiAfXiAfeF0cCiAfogRQSQQAOJxJLA2cyBxYoTFCwI0NJgSgSQQARJxdLA1BJvUUBFERLAr9C/99JgTISQQARJxZLA1BJvUUBFERLAr9C/8dJgTwSQQARJyBLA1BJvUUBFERLAr9C/69JgUYSQQARJxVLA1BJvUUBFERLAr9C/5dJgVASQf+QJxhLA1BJvUUBFERLAr9C/382GgFJFSMSRDYaAklOAhUlEkSIBy2IBzQXRwKIBz5JgRQTRIEoEkEAFScXSwJQSb1FAUS8SDIHFihMULAjQ0mBMhJBAA8nFksCUEm9RQFEvEhC/+FJgTwSQQAPJyBLAlBJvUUBRLxIQv/LSYFGEkEADycVSwJQSb1FAUS8SEL/tUmBUBJB/64nGEsCUEm9RQFEvEhC/582GgFJFSMSRCJTJxUxAIgGZ0QnIUxnMgcWKExQsCNDIicSZUQoTFCwI0M2GgFJFSUSRCcXSwGIBj8nFksCiAY4JyBLA4gGMScVSwSIBionGE8FiAYjJygiTwZUI08FVIECTwRUgQNPA1SBBE8CVChMULAjQzYaAUkVIxJENhoCSU4CFSUSRBdJiAY7gwYUKDI8RlBPBo4GAE8AQAAxACIAEwABACcYSwFQSb1FAUS+SChMULAjQycVSwFQSb1FAUS+SEL/6ycgSwFQSb1FAUS+SEL/3CcWSwFQSb1FAUS+SEL/zScXSwFQSb1FAUS+SEL/voAQAAAAAAAAAAAAAAAAAAAAAEL/qYoBACcIi/9QvkSBgANTFESJigECJwiL/1BJvUUBREm+SCInEGVESwGBOVsJIicRZURLAoFBWwlLAiVbIicFZURPA0sCTwKIAJgiJwVlRE8DTwNPAogAiksCgUlbSwIIFk8DTFxJSYFRW0sCCBZcUSInEGVEFlw5IicRZUQWXEEiKmVEFlwxTwNMv4mKAQAigAAnCIv/UEm9RQFEIillRIEyEkEAAYmLAr5MSU4CjABEgShbSYwBQAABiYsASSVbiwFJTgMIFlwgIhZcKIsCTL8iJwplRElLAg9ETAknCkxniYoDAYv9QQAFi/5AAAIiiYv9i/4di/+XiYoBAYv/QAACIokiJw1lRElEIicFZUSL/0xPAoj/yomKAQGL/0AAAiKJIicNZUQiJwVlRIv/TIj/r4mKAQEiJwRlRIv/DUSL/4EQChYnH0xQSb1FAUSL/4EQGEsBIoECuhdLAQ1EgUELgQIIgUG6iYoCAIv/IxJAAB+L/yQSQAAYi/+BExJAABCL/4EMEkAACIv/gQsSQQADI0SJi/5AAAQiQv/1i/6BAxJAAAiL/oECEkEAGIv/gQMSQAAIi/+BEhJBAAQjQv/RIkL/zYv+IxJBACCL/4EDEkAAEIv/gRISQAAIi/+BBRJBAAQjQv+qIkL/pov+gQQSQQAoi/+BAxJAABiL/4EEEkAAEIv/gRISQAAIi/+BBRJBAAQjQv96IkL/dov+gQUSQQAIi/+BAxJC/2YiQv9iIicMZUQjEkEACiInImVEQQACI4kiiYoBAov/gRFbSUEAECInCWVEQQAIIicHZURAAAYii/9PAokiJwdlRCInCWVEIicFZUSI/mciJwVlRIsATIj+XIv/TwKJigIBi/9AAAOL/okiJwVlRCInCWVEi/9LAoj+OwhJRCInBWVEi/5MTwKI/iuJigICIoAARwiL/iJbIiplRBJEi/6BCVsyBw5Ei/4kVUkjEklBAF0iKWVEgTISRCInCmVEIicNZUQSRIv+gTFbK0sBZycHTGeL/oEhWycJTGcnBiJni/6BKVsnDkxnIiplRCMIKkxnKYFkZ4sLRCInFGVEi/5MIogBxUmM/ov/jAGMAIkiKWVEgTISFEQiJwZlRIv+iP75jP4IJwZMZ4sKgQwSQQFji/+BIVsiJyRlRCInBWVEiP1zIicjZUQIjAYiJyZlREEAEyInHWVEiwYNQQAIIicdZUyMBkQiJydlREEAEyInHmVEiwYMQQAIIiceZUyMBkQnCYsGZ4sKgQQSQQDzi/6BMVsrSwFnJwdMZ4j+Z0EA1IsKgQUSQQCyIicFZUyMAkQijAEijAeL/oEZW0mMCEEAD4sCiwiI/pZJjAIjjAeMASIqZUQjCIwDIicEZUSLAw1BAFKLA4j9H0mMACRVSYwEgQMSQAAQiwSBExJBADOLAIEZW0EAKyNBAAiLB0EADCKMB4sDIwiMA0L/vYsAgRlbiwJMiP44SYwCiwEIjAFC/+EiQv/SiwFEIitlRIv+gTlbJBpAAAYiJwZlRAgiJwVlRIsBiPxfJw5MZyIqZUQjCCpMZ4v+IkmIAF9JjP6L/4wBjACJi/6BKVsnDkxnQv/aiwqBEhJB/xIiK2VEJwdMZ0L/B4sKgQsSQQAbi/6BIVtJjAVAAAgiJyVlTIwFRCcJiwVnQv7Pi/6BIVtJjAlB/sQnCYsJZ0L+vIoDATIIi/0iW4v9VwgBi/1XCQgyB4v9JFWL/kAARSMWSZMkDkRXBwEiJxNlRIsBSSMIiwAWTwIWUIsCUIsDUIsEFlCL/hZQTwNQi/8WUE8CFlBMFlCABJozK5VMULCL/YwAiYsFIxJAAAiLBYEEEkEABCNC/6mB/wFC/6OKAgGAAIv+i/9QSb1FAUEAH4sBvkQiWzIHSYwADkEAEIsBvkQkW4sAD0EABCOMAIkiQv/5MQAiJxJlRBJEiSInKWVEFESJIichZUQURImKAQCL/4EUEkAAMIv/gRkSQAAoi/+BKBJAACCL/4EyEkAAGIv/gTwSQAAQi/+BRhJAAAiL/4FQEkEAAyNEiSJC//o=", + "clear": "DIEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 5, + "minor": 7, + "patch": 1 + } + }, + "events": [ + { + "name": "ExecutionEvent", + "args": [ + { + "type": "uint64", + "name": "contract_id" + }, + { + "type": "uint64", + "name": "event_id" + }, + { + "type": "uint8", + "name": "event_type" + }, + { + "type": "uint64", + "name": "scheduled_time" + }, + { + "type": "uint64", + "name": "applied_at" + }, + { + "type": "uint64", + "name": "payoff" + }, + { + "type": "uint8", + "name": "payoff_sign" + }, + { + "type": "uint64", + "name": "settled_amount" + }, + { + "type": "uint64", + "name": "currency_id" + }, + { + "type": "uint64", + "name": "sequence" + } + ], + "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event." + } + ], + "templateVariables": {} +} \ No newline at end of file diff --git a/smart_contracts/artifacts/d-asa/DASA.clear.puya.map b/smart_contracts/artifacts/d-asa/DASA.clear.puya.map new file mode 100644 index 00000000..d580b5c4 --- /dev/null +++ b/smart_contracts/artifacts/d-asa/DASA.clear.puya.map @@ -0,0 +1,25 @@ +{ + "version": 3, + "sources": [], + "mappings": ";;;", + "op_pc_offset": 0, + "pc_events": { + "1": { + "subroutine": "algopy.arc4.ARC4Contract.clear_state_program", + "params": {}, + "block": "main", + "stack_in": [], + "op": "pushint 1", + "defined_out": [ + "1" + ], + "stack_out": [ + "1" + ] + }, + "3": { + "op": "return", + "stack_out": [] + } + } +} \ No newline at end of file diff --git a/smart_contracts/artifacts/d-asa/DASA.clear.teal b/smart_contracts/artifacts/d-asa/DASA.clear.teal new file mode 100644 index 00000000..a87aa802 --- /dev/null +++ b/smart_contracts/artifacts/d-asa/DASA.clear.teal @@ -0,0 +1,7 @@ +#pragma version 12 +#pragma typetrack false + +// algopy.arc4.ARC4Contract.clear_state_program() -> uint64: +main: + pushint 1 + return diff --git a/smart_contracts/artifacts/d-asa/dasa_client.py b/smart_contracts/artifacts/d-asa/dasa_client.py new file mode 100644 index 00000000..60664859 --- /dev/null +++ b/smart_contracts/artifacts/d-asa/dasa_client.py @@ -0,0 +1,3674 @@ +# flake8: noqa +# fmt: off +# mypy: ignore-errors +# This file was automatically generated by algokit-client-generator. +# DO NOT MODIFY IT BY HAND. +# requires: algokit-utils@^3.0.0 + +# common +import dataclasses +import typing +# core algosdk +import algosdk +from algosdk.transaction import OnComplete +from algosdk.atomic_transaction_composer import TransactionSigner +from algosdk.source_map import SourceMap +from algosdk.transaction import Transaction +from algosdk.v2client.models import SimulateTraceConfig +# utils +import algokit_utils +from algokit_utils import AlgorandClient as _AlgoKitAlgorandClient + +_APP_SPEC_JSON = r"""{"arcs": [22, 28], "bareActions": {"call": [], "create": []}, "methods": [{"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "name": "max_event_count"}], "name": "fund_due_cashflows", "returns": {"type": "(uint64,uint64,uint64,uint64,uint64)", "struct": "CashFundingResult"}, "desc": "Reserve due ACTUS cash events into the escrow-style claim ledger.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "name": "holding_address"}, {"type": "byte[]", "name": "payment_info"}], "name": "claim_due_cashflows", "returns": {"type": "(uint64,uint64,uint64,uint64,byte[])", "struct": "CashClaimResult"}, "desc": "Withdraw the holder's already funded ACTUS cash entitlements.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "name": "open_date"}, {"type": "uint64", "name": "closure_date"}], "name": "set_transfer_schedule", "returns": {"type": "uint64"}, "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "name": "holding_address"}, {"type": "uint64", "name": "units"}], "name": "primary_distribution", "returns": {"type": "uint64"}, "desc": "Reserve units for a holder before IED finalizes issuance.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "name": "sender_holding_address"}, {"type": "address", "name": "receiver_holding_address"}, {"type": "uint64", "name": "units"}], "name": "transfer", "returns": {"type": "uint64"}, "desc": "Transfer active units after settling both counterparties to the current cursor.\nReturns the number of units moved. The ACTUS kernel no longer persists a nominal per-unit value on-chain, so transfer results are unit-based.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "bool", "desc": "Suspension status", "name": "suspended"}], "name": "account_gov_suspension", "returns": {"type": "uint64", "desc": "Timestamp of the set account suspension status"}, "desc": "Set account suspension status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "address", "desc": "Account Payment Address", "name": "payment_address"}], "name": "account_open", "returns": {"type": "uint64", "desc": "Timestamp of the account opening"}, "desc": "Open a contract account with a new position and register its payment address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "address", "desc": "Account Payment Address", "name": "payment_address"}], "name": "account_update_payment_address", "returns": {"type": "uint64", "desc": "Timestamp of the account update"}, "desc": "Update the Payment Address of an account", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}], "name": "account_get_position", "returns": {"type": "(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64)", "desc": "Account position", "struct": "AccountPosition"}, "desc": "Get account position", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": [], "create": ["NoOp"]}, "args": [{"type": "address", "desc": "D-ASA Arranger Address", "name": "arranger"}], "name": "contract_create", "returns": {"type": "uint64", "desc": "UNIX timestamp of contract creation"}, "desc": "Create a new D-ASA contract and set the Arranger role", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64)", "desc": "Normalized ACTUS terms", "name": "terms", "struct": "NormalizedActusTerms"}, {"type": "(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "desc": "Initial kernel state (pre-IED)", "name": "initial_state", "struct": "InitialKernelState"}, {"type": "(byte[32],string)", "desc": "Prospectus (informational only)", "name": "prospectus", "struct": "Prospectus"}], "name": "contract_config", "returns": {"type": "uint64", "desc": "UNIX timestamp of contract configuration"}, "desc": "Partial contract configuration with: normalized ACTUS terms, initial kernel\nstate (pre-IED), prospectus (informational only). The contract stays inactive until all schedule pages are configured next.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "name": "schedule_page_index"}, {"type": "bool", "name": "is_last_page"}, {"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[]", "name": "schedule_page"}], "name": "contract_schedule", "returns": {"type": "uint64"}, "desc": "Upload one normalized schedule page.\nThe configuration operation is considered complete only when the last page is stored. At that point `schedule_entry_count` is finalized and the contract moves to `STATUS_PENDING_IED`.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "execute_ied", "returns": {"type": "uint64"}, "desc": "Execute the first due `IED` entry and activate the contract.\n`IED` is the one non-cash event that moves the app from `STATUS_PENDING_IED` to `STATUS_ACTIVE`.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "name": "event_id"}, {"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "name": "payload", "struct": "ObservedEventRequest"}], "name": "apply_non_cash_event", "returns": {"type": "uint64"}, "desc": "Apply the next due non-cash event, optionally appending one first.\nObserved payloads are appended before execution when flagged. Rate reset events require the interest oracle because they can change the running nominal rate; other non-cash events stay arranger-controlled.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_contract_state", "returns": {"type": "(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "struct": "KernelState"}, "desc": "Return a readonly snapshot of the generic ACTUS kernel state.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_next_due_event", "returns": {"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "struct": "ExecutionScheduleEntry"}, "desc": "Return the next boxed schedule entry, or a zeroed sentinel if ended.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["UpdateApplication"], "create": []}, "args": [], "name": "contract_update", "returns": {"type": "void"}, "desc": "Update D-ASA application.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "New Arranger address", "name": "new_arranger"}], "name": "rbac_rotate_arranger", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Rotate the Arranger address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Operation Daemon address", "name": "address"}], "name": "rbac_set_op_daemon", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Non-Normative: Set the Operation Daemon address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}, {"type": "(uint64,uint64)", "desc": "Role time validity", "name": "validity", "struct": "RoleValidity"}], "name": "rbac_assign_role", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Assign a role to an address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}], "name": "rbac_revoke_role", "returns": {"type": "uint64", "desc": "Timestamp of the role revocation"}, "desc": "Revoke a role from an address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Suspension status", "name": "suspended"}], "name": "rbac_gov_asset_suspension", "returns": {"type": "uint64", "desc": "Timestamp of the set asset suspension status"}, "desc": "Set asset suspension status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "rbac_get_arranger", "returns": {"type": "address", "desc": "Arranger address"}, "desc": "Get Arranger address", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Address to get roles for", "name": "address"}], "name": "rbac_get_address_roles", "returns": {"type": "(bool,bool,bool,bool,bool)", "desc": "Roles mask: (Account Manager, Primary Dealer, Trustee, Authority, Observer)"}, "desc": "Non-normative - Get roles assigned to an address", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}], "name": "rbac_get_role_validity", "returns": {"type": "(uint64,uint64)", "desc": "Role validity", "struct": "RoleValidity"}, "desc": "Get role validity", "events": [], "readonly": true, "recommendations": {}}], "name": "DASA", "state": {"keys": {"box": {}, "global": {"arranger": {"key": "UiNBcnJhbmdlciM=", "keyType": "AVMBytes", "valueType": "address"}, "op_daemon": {"key": "UiNPcERhZW1vbiM=", "keyType": "AVMBytes", "valueType": "address"}, "asset_suspended": {"key": "YXNzZXRfc3VzcGVuZGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "asset_defaulted": {"key": "YXNzZXRfZGVmYXVsdGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "status": {"key": "c3RhdHVz", "keyType": "AVMString", "valueType": "AVMUint64"}, "contract_type": {"key": "Y29udHJhY3RfdHlwZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "prospectus_hash": {"key": "cHJvc3BlY3R1c19oYXNo", "keyType": "AVMString", "valueType": "AVMBytes"}, "prospectus_url": {"key": "cHJvc3BlY3R1c191cmw=", "keyType": "AVMString", "valueType": "AVMString"}, "denomination_asset_id": {"key": "ZGVub21pbmF0aW9uX2Fzc2V0X2lk", "keyType": "AVMString", "valueType": "AVMUint64"}, "settlement_asset_id": {"key": "c2V0dGxlbWVudF9hc3NldF9pZA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "initial_exchange_date": {"key": "aW5pdGlhbF9leGNoYW5nZV9kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "maturity_date": {"key": "bWF0dXJpdHlfZGF0ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "transfer_opening_date": {"key": "dHJhbnNmZXJfb3BlbmluZ19kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "transfer_closure_date": {"key": "dHJhbnNmZXJfY2xvc3VyZV9kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "day_count_convention": {"key": "ZGF5X2NvdW50X2NvbnZlbnRpb24=", "keyType": "AVMString", "valueType": "AVMUint64"}, "total_units": {"key": "dG90YWxfdW5pdHM=", "keyType": "AVMString", "valueType": "AVMUint64"}, "reserved_units_total": {"key": "cmVzZXJ2ZWRfdW5pdHNfdG90YWw=", "keyType": "AVMString", "valueType": "AVMUint64"}, "initial_exchange_amount": {"key": "aW5pdGlhbF9leGNoYW5nZV9hbW91bnQ=", "keyType": "AVMString", "valueType": "AVMUint64"}, "outstanding_principal": {"key": "b3V0c3RhbmRpbmdfcHJpbmNpcGFs", "keyType": "AVMString", "valueType": "AVMUint64"}, "next_principal_redemption": {"key": "bmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbg==", "keyType": "AVMString", "valueType": "AVMUint64"}, "dynamic_principal_redemption": {"key": "ZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbg==", "keyType": "AVMString", "valueType": "AVMUint64"}, "interest_calculation_base": {"key": "aW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "accrued_interest": {"key": "YWNjcnVlZF9pbnRlcmVzdA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "nominal_interest_rate": {"key": "bm9taW5hbF9pbnRlcmVzdF9yYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_spread": {"key": "cmF0ZV9yZXNldF9zcHJlYWQ=", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_multiplier": {"key": "cmF0ZV9yZXNldF9tdWx0aXBsaWVy", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_floor": {"key": "cmF0ZV9yZXNldF9mbG9vcg==", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_cap": {"key": "cmF0ZV9yZXNldF9jYXA=", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_next": {"key": "cmF0ZV9yZXNldF9uZXh0", "keyType": "AVMString", "valueType": "AVMUint64"}, "has_rate_reset_floor": {"key": "aGFzX3JhdGVfcmVzZXRfZmxvb3I=", "keyType": "AVMString", "valueType": "AVMUint64"}, "has_rate_reset_cap": {"key": "aGFzX3JhdGVfcmVzZXRfY2Fw", "keyType": "AVMString", "valueType": "AVMUint64"}, "reserved_principal": {"key": "cmVzZXJ2ZWRfcHJpbmNpcGFs", "keyType": "AVMString", "valueType": "AVMUint64"}, "reserved_interest": {"key": "cmVzZXJ2ZWRfaW50ZXJlc3Q=", "keyType": "AVMString", "valueType": "AVMUint64"}, "cumulative_interest_index": {"key": "Y3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "cumulative_principal_index": {"key": "Y3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXg=", "keyType": "AVMString", "valueType": "AVMUint64"}, "event_cursor": {"key": "ZXZlbnRfY3Vyc29y", "keyType": "AVMString", "valueType": "AVMUint64"}, "schedule_entry_count": {"key": "c2NoZWR1bGVfZW50cnlfY291bnQ=", "keyType": "AVMString", "valueType": "AVMUint64"}, "fixed_point_scale": {"key": "Zml4ZWRfcG9pbnRfc2NhbGU=", "keyType": "AVMString", "valueType": "AVMUint64"}}, "local": {}}, "maps": {"box": {"account_manager": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNBY2NvdW50TWFuYWdlciM="}, "primary_dealer": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNQcmltYXJ5RGVhbGVyIw=="}, "trustee": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNUcnVzdGVlIw=="}, "authority": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNBdXRob3JpdHkj"}, "observer": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNPYnNlcnZlciM="}, "schedule_page": {"keyType": "uint64", "valueType": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[]", "prefix": "UyM="}, "account": {"keyType": "address", "valueType": "AccountPosition", "prefix": "UiNBY2NvdW50Iw=="}}, "global": {}, "local": {}}, "schema": {"global": {"bytes": 4, "ints": 37}, "local": {"bytes": 0, "ints": 0}}}, "structs": {"AccountPosition": [{"name": "payment_address", "type": "address"}, {"name": "units", "type": "uint64"}, {"name": "reserved_units", "type": "uint64"}, {"name": "suspended", "type": "bool"}, {"name": "settled_cursor", "type": "uint64"}, {"name": "interest_checkpoint", "type": "uint64"}, {"name": "principal_checkpoint", "type": "uint64"}, {"name": "claimable_interest", "type": "uint64"}, {"name": "claimable_principal", "type": "uint64"}], "CashClaimResult": [{"name": "interest_amount", "type": "uint64"}, {"name": "principal_amount", "type": "uint64"}, {"name": "total_amount", "type": "uint64"}, {"name": "timestamp", "type": "uint64"}, {"name": "context", "type": "byte[]"}], "CashFundingResult": [{"name": "funded_interest", "type": "uint64"}, {"name": "funded_principal", "type": "uint64"}, {"name": "total_funded", "type": "uint64"}, {"name": "processed_events", "type": "uint64"}, {"name": "timestamp", "type": "uint64"}], "ExecutionScheduleEntry": [{"name": "event_id", "type": "uint64"}, {"name": "event_type", "type": "uint8"}, {"name": "scheduled_time", "type": "uint64"}, {"name": "accrual_factor", "type": "uint64"}, {"name": "redemption_accrual_factor", "type": "uint64"}, {"name": "next_nominal_interest_rate", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "next_outstanding_principal", "type": "uint64"}, {"name": "flags", "type": "uint64"}], "InitialKernelState": [{"name": "status_date", "type": "uint64"}, {"name": "event_cursor", "type": "uint64"}, {"name": "outstanding_principal", "type": "uint64"}, {"name": "interest_calculation_base", "type": "uint64"}, {"name": "nominal_interest_rate", "type": "uint64"}, {"name": "accrued_interest", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "cumulative_interest_index", "type": "uint64"}, {"name": "cumulative_principal_index", "type": "uint64"}], "KernelState": [{"name": "contract_type", "type": "uint8"}, {"name": "status", "type": "uint64"}, {"name": "total_units", "type": "uint64"}, {"name": "reserved_units_total", "type": "uint64"}, {"name": "initial_exchange_amount", "type": "uint64"}, {"name": "event_cursor", "type": "uint64"}, {"name": "schedule_entry_count", "type": "uint64"}, {"name": "outstanding_principal", "type": "uint64"}, {"name": "interest_calculation_base", "type": "uint64"}, {"name": "nominal_interest_rate", "type": "uint64"}, {"name": "accrued_interest", "type": "uint64"}, {"name": "cumulative_interest_index", "type": "uint64"}, {"name": "cumulative_principal_index", "type": "uint64"}, {"name": "reserved_interest", "type": "uint64"}, {"name": "reserved_principal", "type": "uint64"}], "NormalizedActusTerms": [{"name": "contract_type", "type": "uint8"}, {"name": "denomination_asset_id", "type": "uint64"}, {"name": "settlement_asset_id", "type": "uint64"}, {"name": "total_units", "type": "uint64"}, {"name": "notional_principal", "type": "uint64"}, {"name": "initial_exchange_amount", "type": "uint64"}, {"name": "initial_exchange_date", "type": "uint64"}, {"name": "maturity_date", "type": "uint64"}, {"name": "day_count_convention", "type": "uint8"}, {"name": "rate_reset_spread", "type": "uint64"}, {"name": "rate_reset_multiplier", "type": "uint64"}, {"name": "rate_reset_floor", "type": "uint64"}, {"name": "rate_reset_cap", "type": "uint64"}, {"name": "rate_reset_next", "type": "uint64"}, {"name": "has_rate_reset_floor", "type": "bool"}, {"name": "has_rate_reset_cap", "type": "bool"}, {"name": "dynamic_principal_redemption", "type": "bool"}, {"name": "fixed_point_scale", "type": "uint64"}], "ObservedEventRequest": [{"name": "event_id", "type": "uint64"}, {"name": "event_type", "type": "uint8"}, {"name": "scheduled_time", "type": "uint64"}, {"name": "accrual_factor", "type": "uint64"}, {"name": "redemption_accrual_factor", "type": "uint64"}, {"name": "observed_rate", "type": "uint64"}, {"name": "next_nominal_interest_rate", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "next_outstanding_principal", "type": "uint64"}, {"name": "flags", "type": "uint64"}], "Prospectus": [{"name": "hash", "type": "byte[32]"}, {"name": "url", "type": "string"}], "RoleValidity": [{"name": "role_validity_start", "type": "uint64"}, {"name": "role_validity_end", "type": "uint64"}]}, "byteCode": {"approval": "DCAEAAEIICYwBBUffHUGc3RhdHVzDGV2ZW50X2N1cnNvchVvdXRzdGFuZGluZ19wcmluY2lwYWwUc2NoZWR1bGVfZW50cnlfY291bnQRZml4ZWRfcG9pbnRfc2NhbGUQYWNjcnVlZF9pbnRlcmVzdBlpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlClIjQWNjb3VudCMVbm9taW5hbF9pbnRlcmVzdF9yYXRlFHJlc2VydmVkX3VuaXRzX3RvdGFsEnJlc2VydmVkX3ByaW5jaXBhbA1jb250cmFjdF90eXBlC3RvdGFsX3VuaXRzGW5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24RcmVzZXJ2ZWRfaW50ZXJlc3QZY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleBpjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleAtSI0FycmFuZ2VyIxNzZXR0bGVtZW50X2Fzc2V0X2lkF2luaXRpYWxfZXhjaGFuZ2VfYW1vdW50DFIjQXV0aG9yaXR5IxBSI1ByaW1hcnlEZWFsZXIjEVIjQWNjb3VudE1hbmFnZXIjC1IjT2JzZXJ2ZXIjC1IjT3BEYWVtb24jFWluaXRpYWxfZXhjaGFuZ2VfZGF0ZRV0cmFuc2Zlcl9vcGVuaW5nX2RhdGUVdHJhbnNmZXJfY2xvc3VyZV9kYXRlEHJhdGVfcmVzZXRfZmxvb3IOcmF0ZV9yZXNldF9jYXACUyMKUiNUcnVzdGVlIw9hc3NldF9zdXNwZW5kZWQcZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbhFyYXRlX3Jlc2V0X3NwcmVhZBVyYXRlX3Jlc2V0X211bHRpcGxpZXIPcmF0ZV9yZXNldF9uZXh0FGhhc19yYXRlX3Jlc2V0X2Zsb29yEmhhc19yYXRlX3Jlc2V0X2NhcAEAD2Fzc2V0X2RlZmF1bHRlZA9wcm9zcGVjdHVzX2hhc2gOcHJvc3BlY3R1c191cmwVZGVub21pbmF0aW9uX2Fzc2V0X2lkDW1hdHVyaXR5X2RhdGUUZGF5X2NvdW50X2NvbnZlbnRpb24DBoEBMRhAAK0nEjIDZycZMgNnJyEiZycpImcpImcnDCJnJyqAAGcnK4AAZycsImcnEyJnJxoiZyctImcnGyJnJxwiZycuImcnDSJnJwoiZycUImcrImcnDiJnJyIiZycHImcnBiJnJwkiZycjImcnJCJnJx0iZyceImcnJSJnJyYiZycnImcnCyJnJw8iZycQImcnESJnKiJnJwQiZycFImcxNYEEEkQxNIElEkQxNxREMTYURIAEkU8E6zYaAI4BAMAxGRREMRhBAKmCFwS0RhjIBOeDJSkEfqIOCwRshePuBL3RqUQE3AY7NQQU/BDvBHSnKX8ECdT+FASam/qFBIXu0z0EkYUQSgTZ8iWsBG4OXJUE/z/UswSC9xstBO8E9dME3zQ1UAQ9voC9BN9U6CwEAQyCmQR0BqzSBBpyou42GgCOFwAbAscEIwRNBNcFyAYCBloGjQa7CK4J6ApiC9QMZwytDMUM3Q2SDigORw5SDpwAgASVbXFWNhoAjgEGmAAxGYEEEjEYEERCDI0igABHCjYaAUkVJBJEFyIpZUREiBSjiBSqiBSvIillRIEyEhREIkcCSwJLBAxBAlEiKmVEIicEZUQMQQJEIiplRIgQA0lFEYEJW0lFBjIHDUACLksPJFVJRRAkEklFB0AAEEsOgQMSQAAISw6BExJBAjYjQQILSw8iWyIqZUQSREsEMgcOREsFQAHkSw6BExJAAdwiRQ1LDyRVSUUQgQMSQAFgSw6BExJAAVgiRQhLD4ExW0UKiBCMQAD7SwlFC0sMiA9JSwiID0RLAYgPXklOAkURSYgPVUlFDUsCSwEISUUMMgoiJxNlRHAARCInD2VEIicLZURLAQhLAksBD0RPAkwJTwIPRE8DCCcPTGciJwtlRAgnC0xnIicQZURPAggnEExnIicRZUQIJxFMZ0sPJFWBAxJBAHciJwZlREsQiBAYRRIIJwZMZ4gP+EEACksPJFWBExJBAAlLD4EpWycOTGcrSwpnJwdLC2ciKmVEIwgqTGdLD1cIAYABE6hBABAiK2VEQAAJKYHIAWcnByJnSw9LB0mIEnFISwFLDghFAklLCQhFAUsCIwhFA0L+eScGImdC/5NLDyRVSUUQgQMSQQAPIitlREsICUlFC0ULQv7tSw4kEkEAEiIrZUxFC0QiJwdlTEUMREL+1EsOgRMSQAAHSwlFC0L+xSJFCiJFC0L+vIgPPkEAU0sOgRMSQQAJIitlREUIQv6UIicGZURLEIgPNkUSCElFDSInDmVED0EABiJFCEL+dSInDmVESwwJSUUKIitlRA1BAAkiK2VERQhC/llLCEUIQv5SSw+BMVsiK2VESg5ETAlFCEL+PyInBmVESxCIDuFFEghFDUL+FUsCSURLAklLA0lOAwgyB08CFk8DFlBPAhZQTwIWUEwWUChMULAjQyJC/ceAAEcCNhoBRwIVJRJENhoCSSJZgQIISwEVEkRXAgBMIillREQnCExQSb1FAUQiJxllRDIDE0EAIjEAIicZZUQSQAAVMQBLAxJAAA0xAEsBvkRXACASQQEAI0SIEbqIEb8iKWVEgTISFERLAkmIDISIDAdGAkm+REmBSVtJTgJFCEmBUVtJRQhPAghJRQZEVwAgIicTZURwAEUBQQC3Sb5EgYADU0AArSNBAHgyCiInE2VETEsBcABESwVJTgIPREsCSU4DvkRJVwAgsTIATwOyEkyyFE8CshGBBLIQsgGzSYFJW0lOAkUJSYFRW0lOA0UJIhZMSwFcSUxcUU8DTL8iJw9lRElLAg9EIicLZURLAw9ETAknD0xnIicLZURMCScLTGdLBUlLBklOAwgyB08CFk8DFlBPAhZQTBZQSwJJFRZXBgJMUEyAAgAiUExQKExQsCNDIkL/UCJC/v02GgFJFSQSRBc2GgJJFSQSRBeIEJxKDEQnG08CZyccTGcyBxYoTFCwI0M2GgFJFSUSRDYaAkkVJBJEF0lOAiIpZUREJxYxAIgQM0SIEG2IEHIiKWVEgTISRCcISwJQSU4DvUUBREyICqNJRCInCmVECCInDWVEDkQiJxplREEACTIHIicaZUQOREcCvkSBKFtLA0lOAwgWgShMuyInCmVECCcKSwFnIicNZURMCRYoTFCwI0MiSTYaAUkVJRJENhoCSRUlEkQ2GgNHAhUkEkQXIillRESID+OID+giKWVEgTISFEQiJxtlREEACSInG2VEMgcORCInHGVEQQAJMgciJxxlRAxEMQBLBElOAhJEJwhLAVBJRQhJvUUBRCcISwVJTgJQSUUJvUUBREsCiAncSYgJ2E8CE0RLAUlETL5EJVsORCIqZUQiJwRlRA9AAA4iKmVEiArogQlbMgcNREsDSYgKM0sDSU4CiAoriAmuRgKICalGAksFSb5EJVtLAklOAksBDkRLAQkWTwIlTwK7SwVJvkQlW08CCBYlTLsoSwJQsCNDNhoBSRUlEkQ2GgJJFSMSRCJTJxUxAIgOv0QnCE8CUEm9RQFESYEwI7oiTwNUgTBMuzIHFihMULAjQzYaAUkVJRJENhoCSRUlEkQnFzEAiA6HRCIpZUSByAESFESIDreIDrwnCE8CUEm9RQEURCIWTwJLAVBLAVAnKFBLAVBLAVBLAVBLAVBMUL8yBxYoTFCwI0M2GgFJFSUSRDYaAkkVJRJEJwhLAlBJvUUBRDEATwMSRIgOYYgOZiJPArsyBxYoTFCwI0M2GgFJFSUSRCcITFBJvUUBRL5IKExQsCNDNhoBSRUlEkQnEkxnMgcWKExQsCNDgABJNhoBRwIVgWsSRDYaAklOAhWBSBJENhoDSU4CSRVLASVZSYEiEkRPAkxLAlJJTgMiWYEkCBJEiA3dIlVJJwxLAWdBACJJIxJAABxJgQISQAAVSYEDEkAADkmBBBJAAAdJgQUSQQGGI0QiJwxlTEUCREsESYEhW0lFCESBOVVJRQhBAB9LBiMSQAAYSwaBAhJAABBLBoEDEkAACEsGgQQSQQFGI0RJIxNBAAhLBIGSBlMURCIpZUQURCInFGVEFERLBEkjW0lxC0UBRCcsSwFnSwGBCVtJTwISRCcTSwFnsTIAMgoishKyFEyyEYEEshCyAbNJgRFbJw1MZycKImcnLksIZ0mBKVsnGksBZ0sBgTFbJy1LAWdLBklOAoEwWycOTGcnFEsKZ0sDgZIGUyciTGdLAYEQWytMZ0sBgShbJwZMZ0sBJVsnCUxnSwGBGFsnB0xnSwOBOlsnI0xnSwOBQlsnJExnSwOBSlsnHUxnSwOBUlsnHkxnSwOBWlsnJUxnSwOBkAZTJyZMZ0sDgZEGUycnTGdPA4FjWycFTGdLASRbKkxnSwGBOFsnEExnSwGBQFsnEUxnJw8iZycLImdLAjIHDURMIltLAgxEDERLAlcAICcqTGdLAVcCACcrTGcyBxYoTFCwI0MiQv63IkL+dyKAAEcDNhoBSRUkEkQXSTYaAkkVIxJEIlNMNhoDSU4CSSJZSU4DSYFBC4ECCE8CFRJEiAvxIicMZUxOA0QiKWVEFERJgRAORCInFGVEREyBEAtMgWQLgeYLCEkyDA1BABixgQayEIEFshknL7IeJy+yHyKyAbNC/+EiRQpLCUsEDEEAjksEVwIASUUNSwpJTgKBQQuBQVhJJFVJTgJFDkkiW0lFDUsFTwQISwESREsFTwOIBzRMgQlbSUUKREEAGUsJQQAnSwkjCYFBC0sMTIFBWIEJW0sIDkRLCEAABUsKIxJESwkjCEUKQv+QSwZJRCMJFicfTFBJvUUBREkigQK6F0lEIwmBQQuBAgiBQbpC/8BLBhYnH0xQSbxISwW/SwVBAA1LAUsECCcETGcpgTJnMgcWKExQsCNDIillRESICuSICuuICvAiKmVEIicEZURLAQ1EiAZcSVcIAUmAAQGoREsBVwAISwJXCQhLA1cRCEsEVxkISwVXIQhLBlcpCEsHVzEISwhXOQhPB08IUE8HUE8GUE8FUCIWUE8EUE8DUE8CUExQiAePRgIyBxYoTFCwI0MiRwSAAEk2GgFJFSQSRBc2GgJHAhWBSRJEIillRESICluICmCBQVtJgQQaQQC2IicMZUSBBRJEiAo4IicMZURJgQUSREsCSSJbSUUHIicEZUQSRElXCAFFDCRViAXXIicEZUSBEAqAAgAARQcWJx9MUElFCb1FAUEAB0sHvkxFB0RLBUkiWUmBEAxESwNJVwkISwFXEQhLAlcZCEsDVykISwRXMQhPBVc5CEsLFksSUE8GUE8FUE8EUE8DUE8CUExQSwMWUE8CTFBMIwgWVwYCXABLCEm8SEy/IicEZUQjCCcETGciKmVESwNJTwISRIgFDklFCElXCAFFCiRVSUUGIxJAAChLBIEEEkAAIEsEgQwSQAAYSwSBCxJAABBLBIESEkAACEsEgQUSQQBBI0RLCIABAalESwSBDBJAAAhLBIELEkEAJCNBABonGDEAiAjtREsGSwKIBitGAjIHFihMULAjQ4gJC0L/6CJC/9kiQv+8IillRElEIicMZUQWSZMkDkRXBwEiJw1lRCInCmVEIicUZUQiKmVEIicEZUQiK2VEIicHZUQiJwllRCInBmVEIicQZUQiJxFlRCInD2VEIicLZURPDhZPDkxQTw0WUE8MFlBPCxZQTwoWUE8JFlBPCBZQTwcWUE8GFlBPBRZQTwQWUE8DFlBPAhZQTBZQKExQsCNDIillREQiKmVEIicEZUQPQQAlIiplRBYnKFAiFkxLAVBLAVBLAVBLAVBLAVBLAVBMUChMULAjQyIqZUSIA71C//CICCkjQzYaAUkVJRJEiAgcJxJMZzIHFihMULAjQzYaAUkVJRJEiAgEJxlMZzIHFihMULAjQzYaAUkVIxJENhoCSU4CFSUSRDYaA0lOAhWBEBJEiAfXiAfeF0cCiAfogRQSQQAOJxJLA2cyBxYoTFCwI0NJgSgSQQARJxdLA1BJvUUBFERLAr9C/99JgTISQQARJxZLA1BJvUUBFERLAr9C/8dJgTwSQQARJyBLA1BJvUUBFERLAr9C/69JgUYSQQARJxVLA1BJvUUBFERLAr9C/5dJgVASQf+QJxhLA1BJvUUBFERLAr9C/382GgFJFSMSRDYaAklOAhUlEkSIBy2IBzQXRwKIBz5JgRQTRIEoEkEAFScXSwJQSb1FAUS8SDIHFihMULAjQ0mBMhJBAA8nFksCUEm9RQFEvEhC/+FJgTwSQQAPJyBLAlBJvUUBRLxIQv/LSYFGEkEADycVSwJQSb1FAUS8SEL/tUmBUBJB/64nGEsCUEm9RQFEvEhC/582GgFJFSMSRCJTJxUxAIgGZ0QnIUxnMgcWKExQsCNDIicSZUQoTFCwI0M2GgFJFSUSRCcXSwGIBj8nFksCiAY4JyBLA4gGMScVSwSIBionGE8FiAYjJygiTwZUI08FVIECTwRUgQNPA1SBBE8CVChMULAjQzYaAUkVIxJENhoCSU4CFSUSRBdJiAY7gwYUKDI8RlBPBo4GAE8AQAAxACIAEwABACcYSwFQSb1FAUS+SChMULAjQycVSwFQSb1FAUS+SEL/6ycgSwFQSb1FAUS+SEL/3CcWSwFQSb1FAUS+SEL/zScXSwFQSb1FAUS+SEL/voAQAAAAAAAAAAAAAAAAAAAAAEL/qYoBACcIi/9QvkSBgANTFESJigECJwiL/1BJvUUBREm+SCInEGVESwGBOVsJIicRZURLAoFBWwlLAiVbIicFZURPA0sCTwKIAJgiJwVlRE8DTwNPAogAiksCgUlbSwIIFk8DTFxJSYFRW0sCCBZcUSInEGVEFlw5IicRZUQWXEEiKmVEFlwxTwNMv4mKAQAigAAnCIv/UEm9RQFEIillRIEyEkEAAYmLAr5MSU4CjABEgShbSYwBQAABiYsASSVbiwFJTgMIFlwgIhZcKIsCTL8iJwplRElLAg9ETAknCkxniYoDAYv9QQAFi/5AAAIiiYv9i/4di/+XiYoBAYv/QAACIokiJw1lRElEIicFZUSL/0xPAoj/yomKAQGL/0AAAiKJIicNZUQiJwVlRIv/TIj/r4mKAQEiJwRlRIv/DUSL/4EQChYnH0xQSb1FAUSL/4EQGEsBIoECuhdLAQ1EgUELgQIIgUG6iYoCAIv/IxJAAB+L/yQSQAAYi/+BExJAABCL/4EMEkAACIv/gQsSQQADI0SJi/5AAAQiQv/1i/6BAxJAAAiL/oECEkEAGIv/gQMSQAAIi/+BEhJBAAQjQv/RIkL/zYv+IxJBACCL/4EDEkAAEIv/gRISQAAIi/+BBRJBAAQjQv+qIkL/pov+gQQSQQAoi/+BAxJAABiL/4EEEkAAEIv/gRISQAAIi/+BBRJBAAQjQv96IkL/dov+gQUSQQAIi/+BAxJC/2YiQv9iIicMZUQjEkEACiInImVEQQACI4kiiYoBAov/gRFbSUEAECInCWVEQQAIIicHZURAAAYii/9PAokiJwdlRCInCWVEIicFZUSI/mciJwVlRIsATIj+XIv/TwKJigIBi/9AAAOL/okiJwVlRCInCWVEi/9LAoj+OwhJRCInBWVEi/5MTwKI/iuJigICIoAARwiL/iJbIiplRBJEi/6BCVsyBw5Ei/4kVUkjEklBAF0iKWVEgTISRCInCmVEIicNZUQSRIv+gTFbK0sBZycHTGeL/oEhWycJTGcnBiJni/6BKVsnDkxnIiplRCMIKkxnKYFkZ4sLRCInFGVEi/5MIogBxUmM/ov/jAGMAIkiKWVEgTISFEQiJwZlRIv+iP75jP4IJwZMZ4sKgQwSQQFji/+BIVsiJyRlRCInBWVEiP1zIicjZUQIjAYiJyZlREEAEyInHWVEiwYNQQAIIicdZUyMBkQiJydlREEAEyInHmVEiwYMQQAIIiceZUyMBkQnCYsGZ4sKgQQSQQDzi/6BMVsrSwFnJwdMZ4j+Z0EA1IsKgQUSQQCyIicFZUyMAkQijAEijAeL/oEZW0mMCEEAD4sCiwiI/pZJjAIjjAeMASIqZUQjCIwDIicEZUSLAw1BAFKLA4j9H0mMACRVSYwEgQMSQAAQiwSBExJBADOLAIEZW0EAKyNBAAiLB0EADCKMB4sDIwiMA0L/vYsAgRlbiwJMiP44SYwCiwEIjAFC/+EiQv/SiwFEIitlRIv+gTlbJBpAAAYiJwZlRAgiJwVlRIsBiPxfJw5MZyIqZUQjCCpMZ4v+IkmIAF9JjP6L/4wBjACJi/6BKVsnDkxnQv/aiwqBEhJB/xIiK2VEJwdMZ0L/B4sKgQsSQQAbi/6BIVtJjAVAAAgiJyVlTIwFRCcJiwVnQv7Pi/6BIVtJjAlB/sQnCYsJZ0L+vIoDATIIi/0iW4v9VwgBi/1XCQgyB4v9JFWL/kAARSMWSZMkDkRXBwEiJxNlRIsBSSMIiwAWTwIWUIsCUIsDUIsEFlCL/hZQTwNQi/8WUE8CFlBMFlCABJozK5VMULCL/YwAiYsFIxJAAAiLBYEEEkEABCNC/6mB/wFC/6OKAgGAAIv+i/9QSb1FAUEAH4sBvkQiWzIHSYwADkEAEIsBvkQkW4sAD0EABCOMAIkiQv/5MQAiJxJlRBJEiSInKWVEFESJIichZUQURImKAQCL/4EUEkAAMIv/gRkSQAAoi/+BKBJAACCL/4EyEkAAGIv/gTwSQAAQi/+BRhJAAAiL/4FQEkEAAyNEiSJC//o=", "clear": "DIEBQw=="}, "desc": "Debt Algorand Standard Application.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "networks": {}, "source": {"approval": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCAzMgogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1ICJzdGF0dXMiICJldmVudF9jdXJzb3IiICJvdXRzdGFuZGluZ19wcmluY2lwYWwiICJzY2hlZHVsZV9lbnRyeV9jb3VudCIgImZpeGVkX3BvaW50X3NjYWxlIiAiYWNjcnVlZF9pbnRlcmVzdCIgImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMgIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIgInJlc2VydmVkX3VuaXRzX3RvdGFsIiAicmVzZXJ2ZWRfcHJpbmNpcGFsIiAiY29udHJhY3RfdHlwZSIgInRvdGFsX3VuaXRzIiAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIgInJlc2VydmVkX2ludGVyZXN0IiAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIgImN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IiAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMgInNldHRsZW1lbnRfYXNzZXRfaWQiICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIgMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMgMHg1MjIzNTA3MjY5NmQ2MTcyNzk0NDY1NjE2YzY1NzIyMyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMgMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzIDB4NTIyMzRmNzA0NDYxNjU2ZDZmNmUyMyAiaW5pdGlhbF9leGNoYW5nZV9kYXRlIiAidHJhbnNmZXJfb3BlbmluZ19kYXRlIiAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIiAicmF0ZV9yZXNldF9mbG9vciIgInJhdGVfcmVzZXRfY2FwIiAweDUzMjMgMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMyAiYXNzZXRfc3VzcGVuZGVkIiAiZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiIgInJhdGVfcmVzZXRfc3ByZWFkIiAicmF0ZV9yZXNldF9tdWx0aXBsaWVyIiAicmF0ZV9yZXNldF9uZXh0IiAiaGFzX3JhdGVfcmVzZXRfZmxvb3IiICJoYXNfcmF0ZV9yZXNldF9jYXAiIDB4MDAgImFzc2V0X2RlZmF1bHRlZCIgInByb3NwZWN0dXNfaGFzaCIgInByb3NwZWN0dXNfdXJsIiAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIiAibWF0dXJpdHlfZGF0ZSIgImRheV9jb3VudF9jb252ZW50aW9uIiAweDA2ODEwMQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4LTI5CiAgICAvLyAjIFJCQUMgUm9sZXMKICAgIC8vIHNlbGYuYXJyYW5nZXIgPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX0FSUkFOR0VSKQogICAgYnl0ZWMgMTggLy8gMHg1MjIzNDE3MjcyNjE2ZTY3NjU3MjIzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzAKICAgIC8vIHNlbGYub3BfZGFlbW9uID0gR2xvYmFsU3RhdGUoQWNjb3VudCgpLCBrZXk9Y3N0LlBSRUZJWF9JRF9PUF9EQUVNT04pCiAgICBieXRlYyAyNSAvLyAweDUyMjM0ZjcwNDQ2MTY1NmQ2ZjZlMjMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo0Ny00OAogICAgLy8gIyBELUFTQSBHb3Zlcm5hbmNlCiAgICAvLyBzZWxmLmFzc2V0X3N1c3BlbmRlZCA9IEZhbHNlCiAgICBieXRlYyAzMyAvLyAiYXNzZXRfc3VzcGVuZGVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NDkKICAgIC8vIHNlbGYuYXNzZXRfZGVmYXVsdGVkID0gRmFsc2UKICAgIGJ5dGVjIDQxIC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU2LTU3CiAgICAvLyAjIENvbnRyYWN0CiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU4CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMTIgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYwLTYxCiAgICAvLyAjIFByb3NwZWN0dXMgKEluZm9ybWF0aW9uYWwpCiAgICAvLyBzZWxmLnByb3NwZWN0dXNfaGFzaCA9IEJ5dGVzKCkKICAgIGJ5dGVjIDQyIC8vICJwcm9zcGVjdHVzX2hhc2giCiAgICBwdXNoYnl0ZXMgMHgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2MgogICAgLy8gc2VsZi5wcm9zcGVjdHVzX3VybCA9IFN0cmluZygpCiAgICBieXRlYyA0MyAvLyAicHJvc3BlY3R1c191cmwiCiAgICBwdXNoYnl0ZXMgIiIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2NC02NQogICAgLy8gIyBEZW5vbWluYXRpb24KICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gQXNzZXQoKQogICAgYnl0ZWMgNDQgLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjYKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCA9IEFzc2V0KCkKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2OC02OQogICAgLy8gIyBUaW1lCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgMjYgLy8gImluaXRpYWxfZXhjaGFuZ2VfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzAKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgNDUgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjcxCiAgICAvLyBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgMjcgLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzIKICAgIC8vIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlID0gdHlwLlRpbWVTdGFtcCgpCiAgICBieXRlYyAyOCAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3NC03NQogICAgLy8gIyBEYXkgQ291bnQgQ29udmVudGlvbgogICAgLy8gc2VsZi5kYXlfY291bnRfY29udmVudGlvbiA9IFVJbnQ2NCgpCiAgICBieXRlYyA0NiAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojc3LTc4CiAgICAvLyAjIFVuaXRzCiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzID0gVUludDY0KCkKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzkKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPSBVSW50NjQoKQogICAgYnl0ZWMgMTAgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MS04MgogICAgLy8gIyBQcmluY2lwYWwKICAgIC8vIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPSBVSW50NjQoKQogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MwogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBVSW50NjQoKQogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4NAogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gVUludDY0KCkKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4NQogICAgLy8gc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gRmFsc2UKICAgIGJ5dGVjIDM0IC8vICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4Ny04OAogICAgLy8gIyBJbnRlcmVzdAogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gVUludDY0KCkKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojg5CiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgPSBVSW50NjQoKQogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTEtOTIKICAgIC8vICMgSW50ZXJlc3QgUmF0ZXMKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTMKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQgPSBVSW50NjQoKQogICAgYnl0ZWMgMzUgLy8gInJhdGVfcmVzZXRfc3ByZWFkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NAogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIgPSBVSW50NjQoKQogICAgYnl0ZWMgMzYgLy8gInJhdGVfcmVzZXRfbXVsdGlwbGllciIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTUKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9mbG9vciA9IFVJbnQ2NCgpCiAgICBieXRlYyAyOSAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTYKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9jYXAgPSBVSW50NjQoKQogICAgYnl0ZWMgMzAgLy8gInJhdGVfcmVzZXRfY2FwIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NwogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X25leHQgPSBVSW50NjQoKQogICAgYnl0ZWMgMzcgLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTgKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgPSBGYWxzZQogICAgYnl0ZWMgMzggLy8gImhhc19yYXRlX3Jlc2V0X2Zsb29yIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5OQogICAgLy8gc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgPSBGYWxzZQogICAgYnl0ZWMgMzkgLy8gImhhc19yYXRlX3Jlc2V0X2NhcCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTAxLTEwMgogICAgLy8gIyBQcmltYXJ5IERpc3RyaWJ1dGlvbgogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgPSBVSW50NjQoKQogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTAzCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0ID0gVUludDY0KCkKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA1LTEwNgogICAgLy8gIyBDdW11bGF0aXZlIFBlci1Vbml0IEZpeGVkLVBvaW50IEluZGV4ZXMKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA3CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4ID0gVUludDY0KCkKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTE1CiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciA9IFVJbnQ2NCgpCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExNgogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA9IFVJbnQ2NCgpCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTE4LTExOQogICAgLy8gIyBTY2FsaW5nCiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlID0gVUludDY0KCkKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZC1hc2EvY29udHJhY3QucHk6MjMKICAgIC8vIGFzc2VydCBUeG4uZ2xvYmFsX251bV9ieXRlX3NsaWNlID09IGNmZy5HTE9CQUxfQllURVMsIGVyci5XUk9OR19HTE9CQUxfQllURVMKICAgIHR4biBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgQnl0ZXMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2QtYXNhL2NvbnRyYWN0LnB5OjI0CiAgICAvLyBhc3NlcnQgVHhuLmdsb2JhbF9udW1fdWludCA9PSBjZmcuR0xPQkFMX1VJTlRTLCBlcnIuV1JPTkdfR0xPQkFMX1VJTlRTCiAgICB0eG4gR2xvYmFsTnVtVWludAogICAgcHVzaGludCAzNwogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgVUludHMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2QtYXNhL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBhc3NlcnQgVHhuLmxvY2FsX251bV9ieXRlX3NsaWNlID09IGNmZy5MT0NBTF9CWVRFUywgZXJyLldST05HX0xPQ0FMX0JZVEVTCiAgICB0eG4gTG9jYWxOdW1CeXRlU2xpY2UKICAgICEKICAgIGFzc2VydCAvLyBXcm9uZyBMb2NhbCBCeXRlcyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvZC1hc2EvY29udHJhY3QucHk6MjYKICAgIC8vIGFzc2VydCBUeG4ubG9jYWxfbnVtX3VpbnQgPT0gY2ZnLkxPQ0FMX1VJTlRTLCBlcnIuV1JPTkdfTE9DQUxfVUlOVFMKICAgIHR4biBMb2NhbE51bVVpbnQKICAgICEKICAgIGFzc2VydCAvLyBXcm9uZyBMb2NhbCBVSW50cyBhbGxvY2F0aW9uCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kLWFzYS9jb250cmFjdC5weTo4LTE4CiAgICAvLyBjbGFzcyBEQVNBKAogICAgLy8gICAgIFBheW1lbnRBZ2VudCwKICAgIC8vICAgICBUcmFuc2ZlckFnZW50LAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gICAgIGF2bV92ZXJzaW9uPTEyLAogICAgLy8gKToKICAgIHB1c2hieXRlcyAweDkxNGYwNGViIC8vIG1ldGhvZCAiY29udHJhY3RfdXBkYXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9jb250cmFjdF91cGRhdGVfcm91dGVANAoKbWFpbl9zd2l0Y2hfY2FzZV9uZXh0QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZC1hc2EvY29udHJhY3QucHk6OC0xOAogICAgLy8gY2xhc3MgREFTQSgKICAgIC8vICAgICBQYXltZW50QWdlbnQsCiAgICAvLyAgICAgVHJhbnNmZXJBZ2VudCwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBhdm1fdmVyc2lvbj0xMiwKICAgIC8vICk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBieiBtYWluX2NyZWF0ZV9Ob09wQDMxCiAgICBwdXNoYnl0ZXNzIDB4YjQ0NjE4YzggMHhlNzgzMjUyOSAweDdlYTIwZTBiIDB4NmM4NWUzZWUgMHhiZGQxYTk0NCAweGRjMDYzYjM1IDB4MTRmYzEwZWYgMHg3NGE3Mjk3ZiAweDA5ZDRmZTE0IDB4OWE5YmZhODUgMHg4NWVlZDMzZCAweDkxODUxMDRhIDB4ZDlmMjI1YWMgMHg2ZTBlNWM5NSAweGZmM2ZkNGIzIDB4ODJmNzFiMmQgMHhlZjA0ZjVkMyAweGRmMzQzNTUwIDB4M2RiZTgwYmQgMHhkZjU0ZTgyYyAweDAxMGM4Mjk5IDB4NzQwNmFjZDIgMHgxYTcyYTJlZSAvLyBtZXRob2QgImZ1bmRfZHVlX2Nhc2hmbG93cyh1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJjbGFpbV9kdWVfY2FzaGZsb3dzKGFkZHJlc3MsYnl0ZVtdKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYnl0ZVtdKSIsIG1ldGhvZCAic2V0X3RyYW5zZmVyX3NjaGVkdWxlKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbihhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInRyYW5zZmVyKGFkZHJlc3MsYWRkcmVzcyx1aW50NjQpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X2dvdl9zdXNwZW5zaW9uKGFkZHJlc3MsYm9vbCl1aW50NjQiLCBtZXRob2QgImFjY291bnRfb3BlbihhZGRyZXNzLGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X3VwZGF0ZV9wYXltZW50X2FkZHJlc3MoYWRkcmVzcyxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAiYWNjb3VudF9nZXRfcG9zaXRpb24oYWRkcmVzcykoYWRkcmVzcyx1aW50NjQsdWludDY0LGJvb2wsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImNvbnRyYWN0X2NvbmZpZygodWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYm9vbCxib29sLGJvb2wsdWludDY0KSwodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpLChieXRlWzMyXSxzdHJpbmcpKXVpbnQ2NCIsIG1ldGhvZCAiY29udHJhY3Rfc2NoZWR1bGUodWludDY0LGJvb2wsKHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpW10pdWludDY0IiwgbWV0aG9kICJleGVjdXRlX2llZCgpdWludDY0IiwgbWV0aG9kICJhcHBseV9ub25fY2FzaF9ldmVudCh1aW50NjQsKHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSl1aW50NjQiLCBtZXRob2QgImdldF9jb250cmFjdF9zdGF0ZSgpKHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJnZXRfbmV4dF9kdWVfZXZlbnQoKSh1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAicmJhY19yb3RhdGVfYXJyYW5nZXIoYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgInJiYWNfc2V0X29wX2RhZW1vbihhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19hc3NpZ25fcm9sZSh1aW50OCxhZGRyZXNzLCh1aW50NjQsdWludDY0KSl1aW50NjQiLCBtZXRob2QgInJiYWNfcmV2b2tlX3JvbGUodWludDgsYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgInJiYWNfZ292X2Fzc2V0X3N1c3BlbnNpb24oYm9vbCl1aW50NjQiLCBtZXRob2QgInJiYWNfZ2V0X2FycmFuZ2VyKClhZGRyZXNzIiwgbWV0aG9kICJyYmFjX2dldF9hZGRyZXNzX3JvbGVzKGFkZHJlc3MpKGJvb2wsYm9vbCxib29sLGJvb2wsYm9vbCkiLCBtZXRob2QgInJiYWNfZ2V0X3JvbGVfdmFsaWRpdHkodWludDgsYWRkcmVzcykodWludDY0LHVpbnQ2NCkiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBmdW5kX2R1ZV9jYXNoZmxvd3MgY2xhaW1fZHVlX2Nhc2hmbG93cyBzZXRfdHJhbnNmZXJfc2NoZWR1bGUgcHJpbWFyeV9kaXN0cmlidXRpb24gdHJhbnNmZXIgYWNjb3VudF9nb3Zfc3VzcGVuc2lvbiBhY2NvdW50X29wZW4gYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzIGFjY291bnRfZ2V0X3Bvc2l0aW9uIGNvbnRyYWN0X2NvbmZpZyBjb250cmFjdF9zY2hlZHVsZSBleGVjdXRlX2llZCBhcHBseV9ub25fY2FzaF9ldmVudCBnZXRfY29udHJhY3Rfc3RhdGUgZ2V0X25leHRfZHVlX2V2ZW50IHJiYWNfcm90YXRlX2FycmFuZ2VyIHJiYWNfc2V0X29wX2RhZW1vbiByYmFjX2Fzc2lnbl9yb2xlIHJiYWNfcmV2b2tlX3JvbGUgcmJhY19nb3ZfYXNzZXRfc3VzcGVuc2lvbiByYmFjX2dldF9hcnJhbmdlciByYmFjX2dldF9hZGRyZXNzX3JvbGVzIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHkKICAgIGVycgoKbWFpbl9jcmVhdGVfTm9PcEAzMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kLWFzYS9jb250cmFjdC5weTo4LTE4CiAgICAvLyBjbGFzcyBEQVNBKAogICAgLy8gICAgIFBheW1lbnRBZ2VudCwKICAgIC8vICAgICBUcmFuc2ZlckFnZW50LAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gICAgIGF2bV92ZXJzaW9uPTEyLAogICAgLy8gKToKICAgIHB1c2hieXRlcyAweDk1NmQ3MTU2IC8vIG1ldGhvZCAiY29udHJhY3RfY3JlYXRlKGFkZHJlc3MpdWludDY0IgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggY29udHJhY3RfY3JlYXRlCiAgICBlcnIKCm1haW5fY29udHJhY3RfdXBkYXRlX3JvdXRlQDQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBwdXNoaW50IDQgLy8gVXBkYXRlQXBwbGljYXRpb24KICAgID09CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydAogICAgYiBjb250cmFjdF91cGRhdGUKCgovLyBtb2R1bGVzLnBheW1lbnRfYWdlbnQuUGF5bWVudEFnZW50LmZ1bmRfZHVlX2Nhc2hmbG93c1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmZ1bmRfZHVlX2Nhc2hmbG93czoKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gMTAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjUwCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo1MQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo1MgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNDcKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NTUKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NTYtNTcKICAgIC8vIGZ1bmRlZF9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgLy8gZnVuZGVkX3ByaW5jaXBhbCA9IFVJbnQ2NCgwKQogICAgZHVwbiAyCgpmdW5kX2R1ZV9jYXNoZmxvd3Nfd2hpbGVfdG9wQDI6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjAKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgPCBtYXhfZXZlbnRfY291bnQKICAgIGRpZyAyCiAgICBkaWcgNAogICAgPAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjYwLTYxCiAgICAvLyBwcm9jZXNzZWRfZXZlbnRzIDwgbWF4X2V2ZW50X2NvdW50CiAgICAvLyBhbmQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAOQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjYxCiAgICAvLyBhbmQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIDwKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2MC02MQogICAgLy8gcHJvY2Vzc2VkX2V2ZW50cyA8IG1heF9ldmVudF9jb3VudAogICAgLy8gYW5kIHNlbGYuZXZlbnRfY3Vyc29yIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudAogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDkKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2MwogICAgLy8gZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoc2VsZi5ldmVudF9jdXJzb3IpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgZHVwCiAgICBidXJ5IDE3CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjQKICAgIC8vIGlmIGVudHJ5LnNjaGVkdWxlZF90aW1lID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXA6CiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgNgogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPgogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl93aGlsZUA5CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjYKICAgIC8vIGlmIG5vdCBzZWxmLl9ldmVudF9pc19jYXNoKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkpOgogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBidXJ5IDE2CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozNTEKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgaW50Y18yIC8vIDgKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjM1MC0zNTQKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX01EKSwKICAgIC8vICkKICAgID09CiAgICBkdXAKICAgIGJ1cnkgNwogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX3RydWVANTAKICAgIGRpZyAxNAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzUyCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzUwLTM1NAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfTUQpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDUwCiAgICBkaWcgMTQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjM1MwogICAgLy8gVUludDY0KGVudW1zLkVWVF9NRCksCiAgICBwdXNoaW50IDE5CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozNTAtMzU0CiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9NRCksCiAgICAvLyApCiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VANTEKCmZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX3RydWVANTA6CiAgICBpbnRjXzEgLy8gMQoKZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfbWVyZ2VANTI6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjYKICAgIC8vIGlmIG5vdCBzZWxmLl9ldmVudF9pc19jYXNoKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkpOgogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDkKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU0OAogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X2lkID09IHNlbGYuZXZlbnRfY3Vyc29yLCBlcnIuSU5WQUxJRF9FVkVOVF9DVVJTT1IKICAgIGRpZyAxNQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBjdXJzb3IKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU0OQogICAgLy8gYXNzZXJ0IGVudHJ5LnNjaGVkdWxlZF90aW1lIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLCBlcnIuTk9fRFVFX0NBU0hGTE9XCiAgICBkaWcgNAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPD0KICAgIGFzc2VydCAvLyBObyBkdWUgY2FzaGZsb3cgdG8gcGF5CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0MTMKICAgIC8vIGlmIGV2ZW50X3R5cGUgbm90IGluIChVSW50NjQoZW51bXMuRVZUX0lQKSwgVUludDY0KGVudW1zLkVWVF9NRCkpOgogICAgZGlnIDUKICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxMwogICAgZGlnIDE0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDEzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0MTQKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDEzCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfaW50ZXJlc3RfYW1vdW50QDE0OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDI2CiAgICAvLyBldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBidXJ5IDE2CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0MjcKICAgIC8vIGlmIGV2ZW50X3R5cGUgbm90IGluIChVSW50NjQoZW51bXMuRVZUX1BSKSwgVUludDY0KGVudW1zLkVWVF9NRCkpOgogICAgcHVzaGludCAzCiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE3CiAgICBkaWcgMTQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTcKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQyOAogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnRAMjY6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1NTMKICAgIC8vIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGRpZyAxNQogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgMTAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU1NgogICAgLy8gaWYgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCk6CiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUAyNwogICAgZGlnIDkKICAgIGJ1cnkgMTEKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM2OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTcyLTU3NAogICAgLy8gIyBGdW5kaW5nIHVzZXMgcGVyLXVuaXQgY3VtdWxhdGl2ZSBpbmRpY2VzIHNvIGVhY2ggaG9sZGVyIGNhbiBzZXR0bGUKICAgIC8vICMgaW5kZXBlbmRlbnRseSBmcm9tIGl0cyBjdXJyZW50IHVuaXQgYmFsYW5jZS4KICAgIC8vIGludGVyZXN0X2luZGV4X2RlbHRhID0gc2VsZi5fYW1vdW50X3RvX2luZGV4X2RlbHRhKGludGVyZXN0X2Ftb3VudF9kdWUpCiAgICBkaWcgMTIKICAgIGNhbGxzdWIgX2Ftb3VudF90b19pbmRleF9kZWx0YQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTc1CiAgICAvLyBwcmluY2lwYWxfaW5kZXhfZGVsdGEgPSBzZWxmLl9hbW91bnRfdG9faW5kZXhfZGVsdGEocHJpbmNpcGFsX2Ftb3VudF9kdWUpCiAgICBkaWcgOAogICAgY2FsbHN1YiBfYW1vdW50X3RvX2luZGV4X2RlbHRhCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1NzYKICAgIC8vIGludGVyZXN0X2Ftb3VudCA9IHNlbGYuX2luZGV4X2RlbHRhX3RvX2Ftb3VudChpbnRlcmVzdF9pbmRleF9kZWx0YSkKICAgIGRpZyAxCiAgICBjYWxsc3ViIF9pbmRleF9kZWx0YV90b19hbW91bnQKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSAxNwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTc3CiAgICAvLyBwcmluY2lwYWxfYW1vdW50ID0gc2VsZi5faW5kZXhfZGVsdGFfdG9fYW1vdW50KHByaW5jaXBhbF9pbmRleF9kZWx0YSkKICAgIGR1cAogICAgY2FsbHN1YiBfaW5kZXhfZGVsdGFfdG9fYW1vdW50CiAgICBkdXAKICAgIGJ1cnkgMTMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU3OAogICAgLy8gcmVxdWlyZWRfYW1vdW50ID0gaW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudAogICAgZGlnIDIKICAgIGRpZyAxCiAgICArCiAgICBkdXAKICAgIGJ1cnkgMTIKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjcyNwogICAgLy8gYmFsYW5jZSA9IHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQ1NgogICAgLy8gcmV0dXJuIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgKyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIGRpZyAxCiAgICArCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3MjkKICAgIC8vIGFzc2VydCBiYWxhbmNlID49IHJlc2VydmVkX3RvdGFsLCBlcnIuTk9UX0VOT1VHSF9GVU5EUwogICAgZGlnIDIKICAgIGRpZyAxCiAgICA+PQogICAgYXNzZXJ0IC8vIE5vdCBlbm91Z2ggZnVuZHMgZm9yIHRoZSBwYXltZW50CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3MzAKICAgIC8vIHJldHVybiBiYWxhbmNlIC0gcmVzZXJ2ZWRfdG90YWwKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgLQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTgwCiAgICAvLyBzZWxmLl9hdmFpbGFibGVfc2V0dGxlbWVudF9mdW5kcygpID49IHJlcXVpcmVkX2Ftb3VudAogICAgdW5jb3ZlciAyCiAgICA+PQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTc5LTU4MQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLl9hdmFpbGFibGVfc2V0dGxlbWVudF9mdW5kcygpID49IHJlcXVpcmVkX2Ftb3VudAogICAgLy8gKSwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTgzCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0ICs9IGludGVyZXN0X2Ftb3VudAogICAgdW5jb3ZlciAzCiAgICArCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTg0CiAgICAvLyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCArPSBwcmluY2lwYWxfYW1vdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICArCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU4NQogICAgLy8gc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4ICs9IGludGVyZXN0X2luZGV4X2RlbHRhCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCBleGlzdHMKICAgIHVuY292ZXIgMgogICAgKwogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTg2CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4ICs9IHByaW5jaXBhbF9pbmRleF9kZWx0YQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCBleGlzdHMKICAgICsKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1ODcKICAgIC8vIGlmIGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkgPT0gVUludDY0KGVudW1zLkVWVF9QUik6CiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBwdXNoaW50IDMKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDM4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1ODgtNTg5CiAgICAvLyAjIEZvciBQUiwgdGhlIHBlcmlvZCBpbnRlcmVzdCBzdGF5cyBhY2NydWVkIHVudGlsIGEgbGF0ZXIgSVAgb3IgTUQuCiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgKz0gc2VsZi5fZW50cnlfaW50ZXJlc3Rfc2VnbWVudChlbnRyeSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBkaWcgMTYKICAgIGNhbGxzdWIgX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQKICAgIGJ1cnkgMTgKICAgICsKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzk6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1OTIKICAgIC8vIGlmIG5vdCBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKSBvciBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NCgKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlANDEKICAgIGRpZyAxNQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU5Mi01OTQKICAgIC8vIGlmIG5vdCBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKSBvciBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NCgKICAgIC8vICAgICBlbnVtcy5FVlRfTUQKICAgIC8vICk6CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDIKCmZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDQxOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTk1CiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBkaWcgMTUKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0MjoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU5NgogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgZGlnIDEwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTk3CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBuZXh0X2ludGVyZXN0X2Jhc2UKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBkaWcgMTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1OTgKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYwMAogICAgLy8gaWYgZW50cnkuZXZlbnRfdHlwZSA9PSBhcmM0LlVJbnQ4KAogICAgZGlnIDE1CiAgICBleHRyYWN0IDggMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjAwLTYwMgogICAgLy8gaWYgZW50cnkuZXZlbnRfdHlwZSA9PSBhcmM0LlVJbnQ4KAogICAgLy8gICAgIGVudW1zLkVWVF9NRAogICAgLy8gKSBhbmQgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPT0gVUludDY0KDApOgogICAgcHVzaGJ5dGVzIDB4MTMKICAgIGI9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYwMgogICAgLy8gKSBhbmQgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPT0gVUludDY0KDApOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2MDAtNjAyCiAgICAvLyBpZiBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoCiAgICAvLyAgICAgZW51bXMuRVZUX01ECiAgICAvLyApIGFuZCBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9PSBVSW50NjQoMCk6CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYwMwogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX0VOREVEKQogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgcHVzaGludCAyMDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2MDQKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDU6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2MDYtNjEwCiAgICAvLyBzZWxmLl9lbWl0X2V4ZWN1dGlvbl9ldmVudCgKICAgIC8vICAgICBlbnRyeT1lbnRyeSwKICAgIC8vICAgICBwYXlvZmY9aW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudCwKICAgIC8vICAgICBzZXR0bGVkX2Ftb3VudD1pbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50LAogICAgLy8gKQogICAgZGlnIDE1CiAgICBkaWcgNwogICAgZHVwCiAgICBjYWxsc3ViIF9lbWl0X2V4ZWN1dGlvbl9ldmVudAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzAKICAgIC8vIGZ1bmRlZF9pbnRlcmVzdCArPSBpbnRlcmVzdF9hbW91bnQKICAgIGRpZyAxCiAgICBkaWcgMTQKICAgICsKICAgIGJ1cnkgMgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjcxCiAgICAvLyBmdW5kZWRfcHJpbmNpcGFsICs9IHByaW5jaXBhbF9hbW91bnQKICAgIGR1cAogICAgZGlnIDkKICAgICsKICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjcyCiAgICAvLyBwcm9jZXNzZWRfZXZlbnRzICs9IFVJbnQ2NCgxKQogICAgZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDMKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX3doaWxlX3RvcEAyCgpmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDM4OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTkxCiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzkKCmZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDI3OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTU3CiAgICAvLyBldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBidXJ5IDE2CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1NTgtNTYwCiAgICAvLyAjIER5bmFtaWMgYW5udWl0aWVzIGRlcml2ZSBuZXh0IHN0YXRlIGZyb20gdGhlIHBheW1lbnQgZGVjb21wb3NpdGlvbiwKICAgIC8vICMgbm90IG9ubHkgZnJvbSB0aGUgcHJlY29tcHV0ZWQgYG5leHRfKmAgZmllbGRzLgogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1BSKToKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19lbHNlX2JvZHlAMjkKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU2MgogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgLSBwcmluY2lwYWxfYW1vdW50X2R1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBkaWcgOAogICAgLQogICAgZHVwCiAgICBidXJ5IDExCiAgICBidXJ5IDExCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDI5OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTY1CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9JUCk6CiAgICBkaWcgMTQKICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUAzMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTY2CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGJ1cnkgMTEKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU2NwogICAgLy8gbmV4dF9pbnRlcmVzdF9iYXNlID0gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBidXJ5IDEyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIGV4aXN0cwogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzNgoKZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUAzMToKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU2OAogICAgLy8gZWxpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfTUQpOgogICAgZGlnIDE0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDMyCiAgICBkaWcgOQogICAgYnVyeSAxMQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzNgoKZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlAMzI6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1NjkKICAgIC8vIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAxMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTcwCiAgICAvLyBuZXh0X2ludGVyZXN0X2Jhc2UgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDExCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNzoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQyOQogICAgLy8gaWYgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCk6CiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDI1CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0MzAKICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCk6CiAgICBkaWcgMTQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDMxCiAgICAvLyByZXR1cm4gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1NTIKICAgIC8vIHByaW5jaXBhbF9hbW91bnRfZHVlID0gc2VsZi5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudChlbnRyeSkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnRAMjYKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDIwOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDMyCiAgICAvLyBpbnRlcmVzdF9kdWUgPSBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgKyBzZWxmLl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KGVudHJ5KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgIGRpZyAxNgogICAgY2FsbHN1YiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudAogICAgYnVyeSAxOAogICAgKwogICAgZHVwCiAgICBidXJ5IDEzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0MzMKICAgIC8vIGlmIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA8PSBpbnRlcmVzdF9kdWU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiBleGlzdHMKICAgID49CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyMgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDM0CiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1NTIKICAgIC8vIHByaW5jaXBhbF9hbW91bnRfZHVlID0gc2VsZi5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudChlbnRyeSkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnRAMjYKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDIyOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDM1CiAgICAvLyBwcmluY2lwYWxfYW1vdW50ID0gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIC0gaW50ZXJlc3RfZHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiBleGlzdHMKICAgIGRpZyAxMgogICAgLQogICAgZHVwCiAgICBidXJ5IDEwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0MzYKICAgIC8vIGlmIHByaW5jaXBhbF9hbW91bnQgPiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgPgogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQzNwogICAgLy8gcmV0dXJuIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTUyCiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyNDoKICAgIGRpZyA4CiAgICBidXJ5IDgKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyNgoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjU6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0NDAKICAgIC8vIGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsIDw9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBkaWcgMTUKICAgIHB1c2hpbnQgNDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGR1cDIKICAgIDw9CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0MzktNDQxCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsIDw9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQ0MgogICAgLy8gcmV0dXJuIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIC0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIHN3YXAKICAgIC0KICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTUyCiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQxNQogICAgLy8gcmV0dXJuIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCArIHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZGlnIDE2CiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBidXJ5IDE4CiAgICArCiAgICBidXJ5IDEzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1NTEKICAgIC8vIGludGVyZXN0X2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9pbnRlcmVzdF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9pbnRlcmVzdF9hbW91bnRAMTQKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl93aGlsZUA5OgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojc0CiAgICAvLyBhc3NlcnQgcHJvY2Vzc2VkX2V2ZW50cyA+IFVJbnQ2NCgwKSwgZXJyLk5PX0RVRV9DQVNIRkxPVwogICAgZGlnIDIKICAgIGR1cAogICAgYXNzZXJ0IC8vIE5vIGR1ZSBjYXNoZmxvdyB0byBwYXkKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3OAogICAgLy8gdG90YWxfZnVuZGVkPWZ1bmRlZF9pbnRlcmVzdCArIGZ1bmRlZF9wcmluY2lwYWwsCiAgICBkaWcgMgogICAgZHVwCiAgICBkaWcgMwogICAgZHVwCiAgICBjb3ZlciAzCiAgICArCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODAKICAgIC8vIHRpbWVzdGFtcD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3NS04MQogICAgLy8gcmV0dXJuIHR5cC5DYXNoRnVuZGluZ1Jlc3VsdCgKICAgIC8vICAgICBmdW5kZWRfaW50ZXJlc3Q9ZnVuZGVkX2ludGVyZXN0LAogICAgLy8gICAgIGZ1bmRlZF9wcmluY2lwYWw9ZnVuZGVkX3ByaW5jaXBhbCwKICAgIC8vICAgICB0b3RhbF9mdW5kZWQ9ZnVuZGVkX2ludGVyZXN0ICsgZnVuZGVkX3ByaW5jaXBhbCwKICAgIC8vICAgICBwcm9jZXNzZWRfZXZlbnRzPXByb2Nlc3NlZF9ldmVudHMsCiAgICAvLyAgICAgdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUA1MToKICAgIGludGNfMCAvLyAwCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDUyCgoKLy8gbW9kdWxlcy5wYXltZW50X2FnZW50LlBheW1lbnRBZ2VudC5jbGFpbV9kdWVfY2FzaGZsb3dzW3JvdXRpbmddKCkgLT4gdm9pZDoKY2xhaW1fZHVlX2Nhc2hmbG93czoKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNAogICAgLy8gaWYgc2VsZi5vcF9kYWVtb24udmFsdWUgIT0gR2xvYmFsLnplcm9fYWRkcmVzczoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNSAvLyAweDUyMjM0ZjcwNDQ2MTY1NmQ2ZjZlMjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcF9kYWVtb24gZXhpc3RzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBieiBjbGFpbV9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTcKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNgogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI1IC8vIDB4NTIyMzRmNzA0NDYxNjU2ZDZmNmUyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wX2RhZW1vbiBleGlzdHMKICAgID09CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTYtMTgKICAgIC8vIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICAvLyBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgYm56IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDE0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTcKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNi0xOAogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICBibnogY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX3RydWVAMTQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxOAogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIHR4biBTZW5kZXIKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDMyCiAgICA9PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE2LTE4CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAxNQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX3RydWVAMTQ6CiAgICBpbnRjXzEgLy8gMQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDE2OgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE1LTE5CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vICAgICBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gICAgIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICAvLyApLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNzoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5NAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5NQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNDcKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6OTgKICAgIC8vIHNlbGYuX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQoaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDIKICAgIGR1cAogICAgY2FsbHN1YiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojk5CiAgICAvLyBzZWxmLl9zZXR0bGVfcG9zaXRpb24oaG9sZGluZ19hZGRyZXNzKQogICAgY2FsbHN1YiBfc2V0dGxlX3Bvc2l0aW9uCiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTcKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNsYWltYWJsZV9pbnRlcmVzdAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZHVwCiAgICBwdXNoaW50IDczCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBidXJ5IDgKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTgKICAgIC8vICsgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgZHVwCiAgICBwdXNoaW50IDgxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDgKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTctMTE4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jbGFpbWFibGVfaW50ZXJlc3QKICAgIC8vICsgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgdW5jb3ZlciAyCiAgICArCiAgICBkdXAKICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjEwMQogICAgLy8gYXNzZXJ0IHRvdGFsX2Ftb3VudCA+IFVJbnQ2NCgwKSwgZXJyLk5PX0RVRV9DQVNIRkxPVwogICAgYXNzZXJ0IC8vIE5vIGR1ZSBjYXNoZmxvdyB0byBwYXkKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLmlzX29wdGVkX2luKAogICAgZXh0cmFjdCAwIDMyCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MjUKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MjQtMjYKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5pc19vcHRlZF9pbigKICAgIC8vICAgICBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQKICAgIC8vICkKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MjQtMjcKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5pc19vcHRlZF9pbigKICAgIC8vICAgICBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQKICAgIC8vICkKICAgIC8vIGFuZCBub3Qgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkCiAgICBieiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VAMjQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNwogICAgLy8gYW5kIG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHB1c2hpbnQgMzg0CiAgICBnZXRiaXQKICAgIGJueiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VAMjQKICAgIGludGNfMSAvLyAxCgpjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfbWVyZ2VAMjU6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA2CiAgICAvLyBpZiBzZWxmLl9pc19wYXltZW50X2V4ZWN1dGFibGUoaG9sZGluZ19hZGRyZXNzKToKICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MzMKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICBzd2FwCiAgICBkaWcgMQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBvcHRlZCBpbnRvIGFzc2V0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MzMtMzQKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICAvLyA+PSBwYXltZW50X2Ftb3VudAogICAgZGlnIDUKICAgIGR1cAogICAgY292ZXIgMgogICAgPj0KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozMi0zNQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgLy8gICAgID49IHBheW1lbnRfYW1vdW50CiAgICAvLyApLCBlcnIuTk9UX0VOT1VHSF9GVU5EUwogICAgYXNzZXJ0IC8vIE5vdCBlbm91Z2ggZnVuZHMgZm9yIHRoZSBwYXltZW50CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA4CiAgICAvLyBzZWxmLl9wYXkoc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLCB0b3RhbF9hbW91bnQpCiAgICBkaWcgMgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZHVwCiAgICBleHRyYWN0IDAgMzIKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozOS00NAogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXJlY2VpdmVyLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1hbW91bnQsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0MwogICAgLy8gZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIGdsb2JhbCBNaW5UeG5GZWUKICAgIHVuY292ZXIgMwogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgc3dhcAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MzkKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozOS00NAogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXJlY2VpdmVyLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1hbW91bnQsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTI1LTEyNgogICAgLy8gIyBHZXQgdGhlIGNsYWltYWJsZSBhbW91bnRzIGJlZm9yZSByZXNldAogICAgLy8gaW50ZXJlc3RfYW1vdW50ID0gcG9zaXRpb24uY2xhaW1hYmxlX2ludGVyZXN0CiAgICBkdXAKICAgIHB1c2hpbnQgNzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgOQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEyNwogICAgLy8gcHJpbmNpcGFsX2Ftb3VudCA9IHBvc2l0aW9uLmNsYWltYWJsZV9wcmluY2lwYWwKICAgIGR1cAogICAgcHVzaGludCA4MQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMwogICAgYnVyeSA5CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTI5LTEzMAogICAgLy8gIyBSZXNldCB0aGUgcG9zaXRpb24ncyBjbGFpbWFibGUgYW1vdW50cwogICAgLy8gcG9zaXRpb24uY2xhaW1hYmxlX2ludGVyZXN0ID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgaXRvYgogICAgc3dhcAogICAgZGlnIDEKICAgIHJlcGxhY2UyIDczCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTMxCiAgICAvLyBwb3NpdGlvbi5jbGFpbWFibGVfcHJpbmNpcGFsID0gVUludDY0KDApCiAgICBzd2FwCiAgICByZXBsYWNlMiA4MQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzMgogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSBwb3NpdGlvbi5jb3B5KCkKICAgIHVuY292ZXIgMwogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzNAogICAgLy8gYXNzZXJ0IHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgPj0gaW50ZXJlc3RfYW1vdW50LCBlcnIuTk9UX0VOT1VHSF9GVU5EUwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCBleGlzdHMKICAgIGR1cAogICAgZGlnIDIKICAgID49CiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcyBmb3IgdGhlIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzUKICAgIC8vIGFzc2VydCBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCA+PSBwcmluY2lwYWxfYW1vdW50LCBlcnIuTk9UX0VOT1VHSF9GVU5EUwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIGV4aXN0cwogICAgZGlnIDMKICAgID49CiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcyBmb3IgdGhlIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzctMTM4CiAgICAvLyAjIFVwZGF0ZSB0aGUgZ2xvYmFsIHJlc2VydmVkIGludGVyZXN0IGFuZCBwcmluY2lwYWwgYW1vdW50cwogICAgLy8gc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCAtPSBpbnRlcmVzdF9hbW91bnQKICAgIHN3YXAKICAgIC0KICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTM5CiAgICAvLyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCAtPSBwcmluY2lwYWxfYW1vdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICBzd2FwCiAgICAtCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjExNAogICAgLy8gdG90YWxfYW1vdW50PWludGVyZXN0X2Ftb3VudCArIHByaW5jaXBhbF9hbW91bnQsCiAgICBkaWcgNQogICAgZHVwCiAgICBkaWcgNgogICAgZHVwCiAgICBjb3ZlciAzCiAgICArCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTE1CiAgICAvLyB0aW1lc3RhbXA9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTExLTExNwogICAgLy8gcmV0dXJuIHR5cC5DYXNoQ2xhaW1SZXN1bHQoCiAgICAvLyAgICAgaW50ZXJlc3RfYW1vdW50PWludGVyZXN0X2Ftb3VudCwKICAgIC8vICAgICBwcmluY2lwYWxfYW1vdW50PXByaW5jaXBhbF9hbW91bnQsCiAgICAvLyAgICAgdG90YWxfYW1vdW50PWludGVyZXN0X2Ftb3VudCArIHByaW5jaXBhbF9hbW91bnQsCiAgICAvLyAgICAgdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gICAgIGNvbnRleHQ9cGF5bWVudF9pbmZvLAogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZGlnIDIKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBwdXNoYnl0ZXMgMHgwMDIyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAyNDoKICAgIGludGNfMCAvLyAwCiAgICBiIGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUAyNQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX2ZhbHNlQDE1OgogICAgaW50Y18wIC8vIDAKICAgIGIgY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDE2CgoKLy8gbW9kdWxlcy50cmFuc2Zlcl9hZ2VudC5UcmFuc2ZlckFnZW50LnNldF90cmFuc2Zlcl9zY2hlZHVsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF90cmFuc2Zlcl9zY2hlZHVsZToKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToyNAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjI1CiAgICAvLyBhc3NlcnQgb3Blbl9kYXRlIDwgY2xvc3VyZV9kYXRlLCBlcnIuSU5WQUxJRF9TT1JUSU5HCiAgICBkdXAyCiAgICA8CiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbXVzdCBiZSBzb3J0ZWQgaW4gc3RyaWN0bHkgYXNjZW5kaW5nIG9yZGVyCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjI3CiAgICAvLyBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA9IG9wZW5fZGF0ZQogICAgYnl0ZWMgMjcgLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIHVuY292ZXIgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MjgKICAgIC8vIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlID0gY2xvc3VyZV9kYXRlCiAgICBieXRlYyAyOCAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MjkKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy50cmFuc2Zlcl9hZ2VudC5UcmFuc2ZlckFnZW50LnByaW1hcnlfZGlzdHJpYnV0aW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcHJpbWFyeV9kaXN0cmlidXRpb246CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjcxCiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5wcmltYXJ5X2RlYWxlciwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDIyIC8vIDB4NTIyMzUwNzI2OTZkNjE3Mjc5NDQ2NTYxNmM2NTcyMjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDEKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQyCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDMKICAgIC8vIGFzc2VydCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBSSU1BUllfRElTVFJJQlVUSU9OX0NMT1NFRAogICAgYXNzZXJ0IC8vIFByaW1hcnkgZGlzdHJpYnV0aW9uIGlzIGNsb3NlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgY292ZXIgMwogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo0NQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChob2xkaW5nX2FkZHJlc3MpCiAgICBzd2FwCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQ2CiAgICAvLyBhc3NlcnQgdW5pdHMgPiBVSW50NjQoMCksIGVyci5aRVJPX1VOSVRTCiAgICBkdXAKICAgIGFzc2VydCAvLyBDYW4gbm90IGRpc3RyaWJ1dGUgemVybyB1bml0cwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo0OAogICAgLy8gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCArIHVuaXRzIDw9IHNlbGYudG90YWxfdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICArCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgPD0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDctNDkKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCArIHVuaXRzIDw9IHNlbGYudG90YWxfdW5pdHMKICAgIC8vICksIGVyci5PVkVSX0RJU1RSSUJVVElPTgogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCByZW1haW5pbmcgRC1BU0EgdW5pdHMKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NTAKICAgIC8vIGlmIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI2IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlIGV4aXN0cwogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjUyCiAgICAvLyBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8PSBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI2IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlIGV4aXN0cwogICAgPD0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NTEtNTMKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPD0gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGUKICAgIC8vICksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TRUQKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBjbG9zZWQKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNDgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnJlc2VydmVkX3VuaXRzICs9IHVuaXRzCiAgICBkdXBuIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDMKICAgIGR1cAogICAgY292ZXIgMwogICAgKwogICAgaXRvYgogICAgcHVzaGludCA0MAogICAgc3dhcAogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NTYKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgKz0gdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICArCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NTcKICAgIC8vIHJldHVybiBzZWxmLnRvdGFsX3VuaXRzIC0gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIHN3YXAKICAgIC0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMudHJhbnNmZXJfYWdlbnQuVHJhbnNmZXJBZ2VudC50cmFuc2Zlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnRyYW5zZmVyOgogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo1OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NzMKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojc0CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE0NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTMKICAgIC8vIGlmIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI3IC8vICJ0cmFuc2Zlcl9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlIGV4aXN0cwogICAgYnogdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE1CiAgICAvLyBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI3IC8vICJ0cmFuc2Zlcl9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlIGV4aXN0cwogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPD0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTQtMTYKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICksIGVyci5DTE9TRURfVFJBTlNGRVIKICAgIGFzc2VydCAvLyBUcmFuc2ZlciBpcyBjbG9zZWQKCnRyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTcKICAgIC8vIGlmIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI4IC8vICJ0cmFuc2Zlcl9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgYnogdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE5CiAgICAvLyBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8IHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjggLy8gInRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICA8CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE4LTIwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDwgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGUKICAgIC8vICksIGVyci5DTE9TRURfVFJBTlNGRVIKICAgIGFzc2VydCAvLyBUcmFuc2ZlciBpcyBjbG9zZWQKCnRyYW5zZmVyX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NzgKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIGRpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgOAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIGRpZyA1CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDkKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODEKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQoc2VuZGVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjgyCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGR1cAogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4MwogICAgLy8gYXNzZXJ0IHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MgIT0gcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzLCBlcnIuU0VMRl9UUkFOU0ZFUgogICAgdW5jb3ZlciAyCiAgICAhPQogICAgYXNzZXJ0IC8vIFNlbmRlciBhbmQgcmVjZWl2ZXIgbXVzdCBiZSBkaWZmZXJlbnQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODQKICAgIC8vIGFzc2VydCB1bml0cyA+IFVJbnQ2NCgwKSwgZXJyLk5VTExfVFJBTlNGRVIKICAgIGRpZyAxCiAgICBkdXAKICAgIGFzc2VydCAvLyBUcmFuc2ZlciB1bml0cyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojg1CiAgICAvLyBhc3NlcnQgdW5pdHMgPD0gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLCBlcnIuT1ZFUl9UUkFOU0ZFUgogICAgc3dhcAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIDw9CiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IHNlbmRlciB1bml0cyB0byB0cmFuc2ZlcgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzU2CiAgICAvLyBpZiBzZWxmLmV2ZW50X2N1cnNvciA+PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICA+PQogICAgYm56IHRyYW5zZmVyX2FmdGVyX2lubGluZWRfbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Fzc2VydF9ub19kdWVfZXZlbnRfcGVuZGluZ0AxMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzU4CiAgICAvLyBuZXh0X2VudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KHNlbGYuZXZlbnRfY3Vyc29yKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojc2MAogICAgLy8gbmV4dF9lbnRyeS5zY2hlZHVsZWRfdGltZSA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3NTktNzYxCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIG5leHRfZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gKSwgZXJyLlBFTkRJTkdfQUNUVVNfRVZFTlQKICAgIGFzc2VydCAvLyBBQ1RVUyBldmVudCBub3QgeWV0IGV4ZWN1dGVkCgp0cmFuc2Zlcl9hZnRlcl9pbmxpbmVkX21vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9hc3NlcnRfbm9fZHVlX2V2ZW50X3BlbmRpbmdAMTA6CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojg4CiAgICAvLyBzZWxmLl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBkaWcgMwogICAgZHVwCiAgICBjYWxsc3ViIF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojg5CiAgICAvLyBzZWxmLl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGRpZyAzCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGNhbGxzdWIgX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6OTAKICAgIC8vIHNlbGYuX3NldHRsZV9wb3NpdGlvbihzZW5kZXJfaG9sZGluZ19hZGRyZXNzKQogICAgY2FsbHN1YiBfc2V0dGxlX3Bvc2l0aW9uCiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6OTEKICAgIC8vIHNlbGYuX3NldHRsZV9wb3NpdGlvbihyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBjYWxsc3ViIF9zZXR0bGVfcG9zaXRpb24KICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE1MgogICAgLy8gYXNzZXJ0IHVuaXRzIDw9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLCBlcnIuT1ZFUl9UUkFOU0ZFUgogICAgZGlnIDUKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGRpZyAxCiAgICA8PQogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCBzZW5kZXIgdW5pdHMgdG8gdHJhbnNmZXIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNTMKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzIC09IHVuaXRzCiAgICBkaWcgMQogICAgLQogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBpbnRjXzMgLy8gMzIKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNDQKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzICs9IHVuaXRzCiAgICBkaWcgNQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgdW5jb3ZlciAyCiAgICArCiAgICBpdG9iCiAgICBpbnRjXzMgLy8gMzIKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgZGlnIDIKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF9nb3Zfc3VzcGVuc2lvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfZ292X3N1c3BlbnNpb246CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTY1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo3NwogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYXV0aG9yaXR5LCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjEgLy8gMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTg1CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGR1cAogICAgcHVzaGludCA0OAogICAgaW50Y18xIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIHB1c2hpbnQgNDgKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTg2CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfb3Blbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfb3BlbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2OAogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjMgLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQ0ZDYxNmU2MTY3NjU3MjIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMzkKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0VOREVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDIwMAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTAKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX2VuZGVkKCksIGVyci5VTkFVVEhPUklaRUQKICAgICEKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxMQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTIKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjEzCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzQKICAgIC8vIHVuaXRzPVVJbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzItNDIKICAgIC8vIHJldHVybiB0eXAuQWNjb3VudFBvc2l0aW9uKAogICAgLy8gICAgIHBheW1lbnRfYWRkcmVzcz1wYXltZW50X2FkZHJlc3MsCiAgICAvLyAgICAgdW5pdHM9VUludDY0KDApLAogICAgLy8gICAgIHJlc2VydmVkX3VuaXRzPVVJbnQ2NCgwKSwKICAgIC8vICAgICBzdXNwZW5kZWQ9RmFsc2UsCiAgICAvLyAgICAgc2V0dGxlZF9jdXJzb3I9VUludDY0KDApLAogICAgLy8gICAgIGludGVyZXN0X2NoZWNrcG9pbnQ9VUludDY0KDApLAogICAgLy8gICAgIHByaW5jaXBhbF9jaGVja3BvaW50PVVJbnQ2NCgwKSwKICAgIC8vICAgICBjbGFpbWFibGVfaW50ZXJlc3Q9VUludDY0KDApLAogICAgLy8gICAgIGNsYWltYWJsZV9wcmluY2lwYWw9VUludDY0KDApLAogICAgLy8gKQogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBieXRlYyA0MCAvLyAweDAwCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxNAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSBzZWxmLl9uZXdfYWNjb3VudF9wb3NpdGlvbihwYXltZW50X2FkZHJlc3MpCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjE1CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzczoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMzgKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcywgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgdW5jb3ZlciAzCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjM5CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0MAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDEKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcyA9IHBheW1lbnRfYWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDIKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF9nZXRfcG9zaXRpb25bcm91dGluZ10oKSAtPiB2b2lkOgphY2NvdW50X2dldF9wb3NpdGlvbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNTkKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9jcmVhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9jcmVhdGU6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5ODAKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSBhcnJhbmdlcgogICAgYnl0ZWMgMTggLy8gMHg1MjIzNDE3MjcyNjE2ZTY3NjU3MjIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTgxCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojk2OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfY29uZmlnW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfY29uZmlnOgogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojk4MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGxlbgogICAgcHVzaGludCAxMDcKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuTm9ybWFsaXplZEFjdHVzVGVybXMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDcyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLkluaXRpYWxLZXJuZWxTdGF0ZQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIGxlbgogICAgZGlnIDEKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgdHVwbGUgZW5jb2RpbmcKICAgIGR1cAogICAgcHVzaGludCAzNAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHRhaWwgcG9pbnRlciBhdCBpbmRleCAxIG9mICh1aW50OFszMl0sKGxlbit1dGY4W10pKQogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBjb3ZlciAzCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAzNgogICAgKwogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5Qcm9zcGVjdHVzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDEyCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwMTQtMTAxNQogICAgLy8gIyBDb25maWd1cmUgQ29udHJhY3QKICAgIC8vIHNlbGYuY29udHJhY3RfdHlwZSA9IHRlcm1zLmNvbnRyYWN0X3R5cGUuYXNfdWludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ5dGVjIDEyIC8vICJjb250cmFjdF90eXBlIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICBieiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjIwCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfQU5OKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMjEKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgcHVzaGludCAyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMjIKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMjMKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgcHVzaGludCA0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMjQKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYnogY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAOAoKY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUA3OgogICAgaW50Y18xIC8vIDEKCmNvbnRyYWN0X2NvbmZpZ19ib29sX21lcmdlQDk6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMjkKICAgIC8vIGFzc2VydCBzZWxmLl9pc19zdXBwb3J0ZWRfY29udHJhY3RfdHlwZShjb250cmFjdF90eXBlKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDE3CiAgICAvLyBzZWxmLl9zdG9yZV9jb250cmFjdF9jb25maWcoc2VsZi5jb250cmFjdF90eXBlLCB0ZXJtcywgaW5pdGlhbF9zdGF0ZSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBidXJ5IDIKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozMjUKICAgIC8vIGFzc2VydCB0ZXJtcy5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBkaWcgNAogICAgZHVwCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDgKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMyNwogICAgLy8gdGVybXMuZGF5X2NvdW50X2NvbnZlbnRpb24uYXNfdWludDY0KCkKICAgIHB1c2hpbnQgNTcKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyOTctMzAzCiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgIGJ6IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGRpZyA2CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyOTkKICAgIC8vIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGRpZyA2CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozMDAKICAgIC8vIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICBwdXNoaW50IDIKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI5Ny0zMDMKICAgIC8vIHJldHVybiBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzYwKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwSVNEQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjApLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDE2CiAgICBkaWcgNgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzAxCiAgICAvLyBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyOTctMzAzCiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgID09CiAgICBibnogY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUAxNgogICAgZGlnIDYKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMwMgogICAgLy8gVUludDY0KGVudW1zLkRDQ18zMEUzNjApLAogICAgcHVzaGludCA0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyOTctMzAzCiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgID09CiAgICBieiBjb250cmFjdF9jb25maWdfYm9vbF9mYWxzZUAxNwoKY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUAxNjoKICAgIGludGNfMSAvLyAxCgpjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUAxODoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMwOS0zMTEKICAgIC8vIGFzc2VydCBzZWxmLl9pc19zdXBwb3J0ZWRfZGF5X2NvdW50X2NvbnZlbnRpb24oCiAgICAvLyAgICAgZGF5X2NvdW50X2NvbnZlbnRpb24KICAgIC8vICksIGVyci5JTlZBTElEX0RBWV9DT1VOVF9DT05WRU5USU9OCiAgICBhc3NlcnQgLy8gSW52YWxpZCBkYXktY291bnQgY29udmVudGlvbiBJRAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzI5CiAgICAvLyBpZiBjb250cmFjdF90eXBlICE9IFVJbnQ2NChlbnVtcy5DVF9BTk4pOgogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgIT0KICAgIGJ6IGNvbnRyYWN0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDIwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozMzAKICAgIC8vIGFzc2VydCBub3QgdGVybXMuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBkaWcgNAogICAgcHVzaGludCA3ODYKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgoKY29udHJhY3RfY29uZmlnX2FmdGVyX2lmX2Vsc2VAMjA6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MDAKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MDEKICAgIC8vIGFzc2VydCBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID09IFVJbnQ2NCgwKSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBELUFTQSBhbHJlYWR5IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjgwMy04MDQKICAgIC8vICMgU2V0IERlbm9taW5hdGlvbiBBc3NldAogICAgLy8gc2VsZi5fYXNzZXJ0X2Rlbm9taW5hdGlvbl9hc3NldCh0ZXJtcy5kZW5vbWluYXRpb25fYXNzZXRfaWQpCiAgICBkaWcgNAogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojc2OC03NjkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gZGVub21pbmF0aW9uIHdpdGggQVNBCiAgICAvLyBfY3JlYXRvciwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfY3JlYXRvcihkZW5vbWluYXRpb25fYXNzZXRfaWQpCiAgICBkdXAKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojc3MAogICAgLy8gYXNzZXJ0IGV4aXN0cywgZXJyLklOVkFMSURfREVOT01JTkFUSU9OCiAgICBhc3NlcnQgLy8gRGVub21pbmF0aW9uIGFzc2V0IGlzIG5vdCBwcm9wZXJseSBzZXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojc3MwogICAgLy8gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgPSBkZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIGJ5dGVjIDQ0IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjgwNy04MDgKICAgIC8vICMgU2V0IFNldHRsZW1lbnQgQXNzZXQKICAgIC8vIHNlbGYuX2Fzc2VydF9zZXR0bGVtZW50X2Fzc2V0KHRlcm1zLnNldHRsZW1lbnRfYXNzZXRfaWQpCiAgICBkaWcgMQogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Nzc4CiAgICAvLyBzZXR0bGVtZW50X2Fzc2V0X2lkID09IHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgPT0KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojc3Ni03NzkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzZXR0bGVtZW50IGFzc2V0IGlzIHRoZSBkZW5vbWluYXRpb24gYXNzZXQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgLy8gKSwgZXJyLklOVkFMSURfU0VUVExFTUVOVF9BU1NFVAogICAgYXNzZXJ0IC8vIERpZmZlcmVudCBzZXR0bGVtZW50IGFzc2V0IG5vdCBzdXBwb3J0ZWQsIG11c3QgYmUgZXF1YWwgdG8gZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3ODIKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCA9IHNldHRsZW1lbnRfYXNzZXRfaWQKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3ODMtNzg5CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3ODgKICAgIC8vIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3ODYKICAgIC8vIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Nzg3CiAgICAvLyBhc3NldF9hbW91bnQ9MCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3ODMtNzg0CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojc4My03ODkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gc2V0dGxlbWVudCB3aXRoIEFTQQogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PTAsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MTEtODEyCiAgICAvLyAjIFVuaXRzCiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzID0gdGVybXMudG90YWxfdW5pdHMKICAgIGR1cAogICAgcHVzaGludCAxNwogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MTMKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDEwIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODE1LTgxNgogICAgLy8gIyBEYXktQ291bnQgQ29udmVudGlvbnMKICAgIC8vIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPSB0ZXJtcy5kYXlfY291bnRfY29udmVudGlvbi5hc191aW50NjQoKQogICAgYnl0ZWMgNDYgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgZGlnIDgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MTgtODE5CiAgICAvLyAjIFRpbWUKICAgIC8vIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlID0gdGVybXMuaW5pdGlhbF9leGNoYW5nZV9kYXRlCiAgICBkdXAKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAyNiAvLyAiaW5pdGlhbF9leGNoYW5nZV9kYXRlIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MjAKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IHRlcm1zLm1hdHVyaXR5X2RhdGUKICAgIGRpZyAxCiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNDUgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjgyMQogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gaW5pdGlhbF9zdGF0ZS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBkaWcgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBwdXNoaW50IDQ4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODIzLTgyNAogICAgLy8gIyBQcmluY2lwYWwKICAgIC8vIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPSB0ZXJtcy5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudAogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgZGlnIDEwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODI1CiAgICAvLyBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSB0ZXJtcy5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBkaWcgMwogICAgcHVzaGludCA3ODYKICAgIGdldGJpdAogICAgYnl0ZWMgMzQgLy8gImR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODI2CiAgICAvLyBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9IGluaXRpYWxfc3RhdGUub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBkaWcgMQogICAgcHVzaGludCAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjXzMgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MjgtODI5CiAgICAvLyAjIEludGVyZXN0CiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgPSBpbml0aWFsX3N0YXRlLmFjY3J1ZWRfaW50ZXJlc3QKICAgIGRpZyAxCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MzEtODMyCiAgICAvLyAjIEludGVyZXN0IFJhdGUKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gaW5pdGlhbF9zdGF0ZS5ub21pbmFsX2ludGVyZXN0X3JhdGUKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODMzCiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBpbml0aWFsX3N0YXRlLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UKICAgIGRpZyAxCiAgICBwdXNoaW50IDI0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MzQKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQgPSB0ZXJtcy5yYXRlX3Jlc2V0X3NwcmVhZAogICAgZGlnIDMKICAgIHB1c2hpbnQgNTgKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzNSAvLyAicmF0ZV9yZXNldF9zcHJlYWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODM1CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciA9IHRlcm1zLnJhdGVfcmVzZXRfbXVsdGlwbGllcgogICAgZGlnIDMKICAgIHB1c2hpbnQgNjYKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzNiAvLyAicmF0ZV9yZXNldF9tdWx0aXBsaWVyIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjgzNgogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X2Zsb29yID0gdGVybXMucmF0ZV9yZXNldF9mbG9vcgogICAgZGlnIDMKICAgIHB1c2hpbnQgNzQKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAyOSAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MzcKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9jYXAgPSB0ZXJtcy5yYXRlX3Jlc2V0X2NhcAogICAgZGlnIDMKICAgIHB1c2hpbnQgODIKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzMCAvLyAicmF0ZV9yZXNldF9jYXAiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODM4CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfbmV4dCA9IHRlcm1zLnJhdGVfcmVzZXRfbmV4dAogICAgZGlnIDMKICAgIHB1c2hpbnQgOTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzNyAvLyAicmF0ZV9yZXNldF9uZXh0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjgzOQogICAgLy8gc2VsZi5oYXNfcmF0ZV9yZXNldF9mbG9vciA9IHRlcm1zLmhhc19yYXRlX3Jlc2V0X2Zsb29yCiAgICBkaWcgMwogICAgcHVzaGludCA3ODQKICAgIGdldGJpdAogICAgYnl0ZWMgMzggLy8gImhhc19yYXRlX3Jlc2V0X2Zsb29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojg0MAogICAgLy8gc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgPSB0ZXJtcy5oYXNfcmF0ZV9yZXNldF9jYXAKICAgIGRpZyAzCiAgICBwdXNoaW50IDc4NQogICAgZ2V0Yml0CiAgICBieXRlYyAzOSAvLyAiaGFzX3JhdGVfcmVzZXRfY2FwIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojg0Mi04NDMKICAgIC8vICMgU2NhbGluZwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSA9IHRlcm1zLmZpeGVkX3BvaW50X3NjYWxlCiAgICB1bmNvdmVyIDMKICAgIHB1c2hpbnQgOTkKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4NDUtODQ2CiAgICAvLyAjIFNjaGVkdWxlIFByb2Nlc3NpbmcKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yID0gaW5pdGlhbF9zdGF0ZS5ldmVudF9jdXJzb3IKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4NDgtODQ5CiAgICAvLyAjIFBlci1Vbml0IEZpeGVkLVBvaW50IEluZGV4ZXMKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCA9IGluaXRpYWxfc3RhdGUuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleAogICAgZGlnIDEKICAgIHB1c2hpbnQgNTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4NTAKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggPSBpbml0aWFsX3N0YXRlLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4CiAgICBkaWcgMQogICAgcHVzaGludCA2NAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4NTItODUzCiAgICAvLyAjIFJlc2VydmVkIEFtb3VudCAoZm9yIGV4ZWN1dGVkIGNhc2hmbG93cykKICAgIC8vIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODU0CiAgICAvLyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODU2CiAgICAvLyBhc3NlcnQgdGVybXMuaW5pdGlhbF9leGNoYW5nZV9kYXRlID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsIGVyci5JTlZBTElEX0lFRAogICAgZGlnIDIKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgID4KICAgIGFzc2VydCAvLyBJRUQgbXVzdCBiZSBzZXQgaW4gdGhlIGZ1dHVyZQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODU3CiAgICAvLyBhc3NlcnQgdGVybXMuaW5pdGlhbF9leGNoYW5nZV9kYXRlID4gaW5pdGlhbF9zdGF0ZS5zdGF0dXNfZGF0ZSwgZXJyLklOVkFMSURfSUVECiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICA8CiAgICBhc3NlcnQgLy8gSUVEIG11c3QgYmUgc2V0IGluIHRoZSBmdXR1cmUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojg1OAogICAgLy8gYXNzZXJ0IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA8IHRlcm1zLm1hdHVyaXR5X2RhdGUsIGVyci5JTlZBTElEX0lFRAogICAgPAogICAgYXNzZXJ0IC8vIElFRCBtdXN0IGJlIHNldCBpbiB0aGUgZnV0dXJlCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDE5LTEwMjAKICAgIC8vICMgTm90YXJpemUgcHJvc3BlY3R1cyAob3B0aW9uYWwpCiAgICAvLyBzZWxmLnByb3NwZWN0dXNfaGFzaCA9IHByb3NwZWN0dXMuaGFzaC5ieXRlcwogICAgZGlnIDIKICAgIGV4dHJhY3QgMCAzMgogICAgYnl0ZWMgNDIgLy8gInByb3NwZWN0dXNfaGFzaCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDIxCiAgICAvLyBzZWxmLnByb3NwZWN0dXNfdXJsID0gcHJvc3BlY3R1cy51cmwKICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgYnl0ZWMgNDMgLy8gInByb3NwZWN0dXNfdXJsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwMjIKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNvbnRyYWN0X2NvbmZpZ19ib29sX2ZhbHNlQDE3OgogICAgaW50Y18wIC8vIDAKICAgIGIgY29udHJhY3RfY29uZmlnX2Jvb2xfbWVyZ2VAMTgKCmNvbnRyYWN0X2NvbmZpZ19ib29sX2ZhbHNlQDg6CiAgICBpbnRjXzAgLy8gMAogICAgYiBjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUA5CgoKLy8gbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3Rfc2NoZWR1bGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9zY2hlZHVsZToKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gMwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTAyNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBzd2FwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgMwogICAgZHVwCiAgICBwdXNoaW50IDY1CiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIHVuY292ZXIgMgogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8c21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5FeGVjdXRpb25TY2hlZHVsZUVudHJ5PgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTAzOQogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDQyCiAgICAvLyBjb250cmFjdF90eXBlPXNlbGYuY29udHJhY3RfdHlwZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBjb3ZlciAzCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODc0CiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIEQtQVNBIGFscmVhZHkgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODc1LTg3NwogICAgLy8gYXNzZXJ0IHNjaGVkdWxlX3BhZ2UubGVuZ3RoIDw9IFVJbnQ2NCgKICAgIC8vICAgICBjc3QuU0NIRURVTEVfUEFHRV9TSVpFCiAgICAvLyApLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBkdXAKICAgIHB1c2hpbnQgMTYKICAgIDw9CiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4NzgKICAgIC8vIGFzc2VydCBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID4gVUludDY0KDApLCBlcnIuVEVSTVNfTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMCAvLyAiaW5pdGlhbF9leGNoYW5nZV9hbW91bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0EgdGVybXMgbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojg4MAogICAgLy8gcGFnZV9jdXJzb3IgPSBzY2hlZHVsZV9wYWdlX2luZGV4ICogVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpCiAgICBzd2FwCiAgICBwdXNoaW50IDE2CiAgICAqCiAgICBzd2FwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4ODcKICAgIC8vICsgcGFnZV9sZW5ndGggKiBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19QRVJfRU5UUllfQlVER0VUKQogICAgcHVzaGludCAxMDAKICAgICoKICAgIHB1c2hpbnQgMTUxMAogICAgKwoKY29udHJhY3Rfc2NoZWR1bGVfd2hpbGVfdG9wQDI6CiAgICBkdXAKICAgIGdsb2JhbCBPcGNvZGVCdWRnZXQKICAgID4KICAgIGJ6IGNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX3doaWxlQDUKICAgIGl0eG5fYmVnaW4KICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBwdXNoaW50IDUgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICBieXRlYyA0NyAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW0KICAgIGJ5dGVjIDQ3IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBiIGNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEAyCgpjb250cmFjdF9zY2hlZHVsZV9hZnRlcl93aGlsZUA1OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODkwCiAgICAvLyBpbmRleCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTAKCmNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEA2OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODkxCiAgICAvLyB3aGlsZSBpbmRleCA8IHBhZ2VfbGVuZ3RoOgogICAgZGlnIDkKICAgIGRpZyA0CiAgICA8CiAgICBieiBjb250cmFjdF9zY2hlZHVsZV9hZnRlcl93aGlsZUAxNQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODkyLTg5MwogICAgLy8gZW50cnkgPSBzY2hlZHVsZV9wYWdlW2luZGV4XS5jb3B5KCkKICAgIC8vIGVudHJ5X2V2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBkaWcgNAogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgYnVyeSAxMwogICAgZGlnIDEwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgNjUKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODkzCiAgICAvLyBlbnRyeV9ldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4OTItODkzCiAgICAvLyBlbnRyeSA9IHNjaGVkdWxlX3BhZ2VbaW5kZXhdLmNvcHkoKQogICAgLy8gZW50cnlfZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGludGNfMiAvLyA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4OTMKICAgIC8vIGVudHJ5X2V2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBnZXRieXRlCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgMTQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojg5NAogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X2lkID09IHBhZ2VfY3Vyc29yICsgaW5kZXgsIGVyci5JTlZBTElEX0VWRU5UX0lECiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEzCiAgICBkaWcgNQogICAgdW5jb3ZlciA0CiAgICArCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4OTUtODk3CiAgICAvLyBzZWxmLl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBlbnRyeV9ldmVudF90eXBlCiAgICAvLyApCiAgICBkaWcgNQogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODk4CiAgICAvLyBhc3NlcnQgZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgc3dhcAogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4OTkKICAgIC8vIGlmIGVudHJ5LmV2ZW50X2lkID4gVUludDY0KDApOgogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxMgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTAwCiAgICAvLyBpZiBpbmRleCA+IFVJbnQ2NCgwKToKICAgIGRpZyA5CiAgICBieiBjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlAMTAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjkwMQogICAgLy8gcHJldmlvdXNfZW50cnkgPSBzY2hlZHVsZV9wYWdlW2luZGV4IC0gVUludDY0KDEpXS5jb3B5KCkKICAgIGRpZyA5CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgcHVzaGludCA2NQogICAgKgogICAgZGlnIDEyCiAgICBzd2FwCiAgICBwdXNoaW50IDY1CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTE6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5MTYKICAgIC8vIHByZXZpb3VzX2VudHJ5LnNjaGVkdWxlZF90aW1lIDw9IGVudHJ5LnNjaGVkdWxlZF90aW1lCiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgOAogICAgPD0KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjkxNS05MTcKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgcHJldmlvdXNfZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gZW50cnkuc2NoZWR1bGVkX3RpbWUKICAgIC8vICksIGVyci5JTlZBTElEX1NPUlRJTkcKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBtdXN0IGJlIHNvcnRlZCBpbiBzdHJpY3RseSBhc2NlbmRpbmcgb3JkZXIKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTI6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5MTgKICAgIC8vIGlmIGVudHJ5LmV2ZW50X2lkID09IFVJbnQ2NCgwKToKICAgIGRpZyA4CiAgICBibnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxNAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTE5LTkyMQogICAgLy8gYXNzZXJ0IGVudHJ5X2V2ZW50X3R5cGUgPT0gVUludDY0KAogICAgLy8gICAgIGVudW1zLkVWVF9JRUQKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZGlnIDEwCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTQ6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5MjIKICAgIC8vIGluZGV4ICs9IFVJbnQ2NCgxKQogICAgZGlnIDkKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEwCiAgICBiIGNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEA2Cgpjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlAMTA6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5MDMtOTA1CiAgICAvLyAjIFRoZSBmaXJzdCBlbnRyeSBvZiBhIHBhZ2UgbXVzdCBzdGlsbCBiZSBvcmRlcmVkIGFmdGVyIHRoZQogICAgLy8gIyBsYXN0IGVudHJ5IG9mIHRoZSBwcmV2aW91cyBwYWdlLgogICAgLy8gYXNzZXJ0IHNjaGVkdWxlX3BhZ2VfaW5kZXggPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0VWRU5UX0lECiAgICBkaWcgNgogICAgZHVwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBpZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTA2CiAgICAvLyBwcmV2aW91c19wYWdlX2luZGV4ID0gc2NoZWR1bGVfcGFnZV9pbmRleCAtIFVJbnQ2NCgxKQogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjkwOAogICAgLy8gcHJldmlvdXNfcGFnZV9pbmRleCBpbiBzZWxmLnNjaGVkdWxlX3BhZ2UKICAgIGl0b2IKICAgIGJ5dGVjIDMxIC8vIDB4NTMyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTA3LTkwOQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBwcmV2aW91c19wYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZQogICAgLy8gKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTEwLTkxMQogICAgLy8gcHJldmlvdXNfcGFnZSA9IHNlbGYuc2NoZWR1bGVfcGFnZVtwcmV2aW91c19wYWdlX2luZGV4XS5jb3B5KCkKICAgIC8vIGFzc2VydCBwcmV2aW91c19wYWdlLmxlbmd0aCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGludCAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTExCiAgICAvLyBhc3NlcnQgcHJldmlvdXNfcGFnZS5sZW5ndGggPiBVSW50NjQoMCksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGR1cAogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTEzCiAgICAvLyBwcmV2aW91c19wYWdlLmxlbmd0aCAtIFVJbnQ2NCgxKQogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjkxMi05MTQKICAgIC8vIHByZXZpb3VzX2VudHJ5ID0gcHJldmlvdXNfcGFnZVsKICAgIC8vICAgICBwcmV2aW91c19wYWdlLmxlbmd0aCAtIFVJbnQ2NCgxKQogICAgLy8gXS5jb3B5KCkKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgMgogICAgKwogICAgcHVzaGludCA2NQogICAgYm94X2V4dHJhY3QKICAgIGIgY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxMQoKY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfd2hpbGVAMTU6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMDAKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHNjaGVkdWxlX3BhZ2UuY29weSgpCiAgICBkaWcgNgogICAgaXRvYgogICAgYnl0ZWMgMzEgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBkaWcgNQogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTI1CiAgICAvLyBpZiBpc19sYXN0X3BhZ2U6CiAgICBkaWcgNQogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxNwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTI3CiAgICAvLyBzY2hlZHVsZV9wYWdlX2luZGV4ICogVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpICsgcGFnZV9sZW5ndGgKICAgIGRpZyAxCiAgICBkaWcgNAogICAgKwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTI2CiAgICAvLyBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50ID0gKAogICAgYnl0ZWMgNCAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5MjYtOTI4CiAgICAvLyBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50ID0gKAogICAgLy8gICAgIHNjaGVkdWxlX3BhZ2VfaW5kZXggKiBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkgKyBwYWdlX2xlbmd0aAogICAgLy8gKQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjkyOQogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgcHVzaGludCA1MAogICAgYXBwX2dsb2JhbF9wdXQKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTc6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDQ3CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwMjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmV4ZWN1dGVfaWVkW3JvdXRpbmddKCkgLT4gdm9pZDoKZXhlY3V0ZV9pZWQ6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA1NwogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDU4CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA1OQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwNjEKICAgIC8vIGFzc2VydCBzZWxmLmV2ZW50X2N1cnNvciA8IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICBkaWcgMQogICAgPgogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgY3Vyc29yCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDYyCiAgICAvLyBlbnRyeSA9IHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLmV2ZW50X2N1cnNvcikKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA2MwogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X3R5cGUgPT0gYXJjNC5VSW50OChlbnVtcy5FVlRfSUVEKSwgZXJyLklOVkFMSURfRVZFTlRfVFlQRQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgZHVwCiAgICBwdXNoYnl0ZXMgMHgwMQogICAgYj09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCB0eXBlCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDY3CiAgICAvLyBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIGRpZyAxCiAgICBleHRyYWN0IDAgOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA2OQogICAgLy8gc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICBkaWcgMgogICAgZXh0cmFjdCA5IDgKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwNzAKICAgIC8vIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgZGlnIDMKICAgIGV4dHJhY3QgMTcgOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA3MQogICAgLy8gcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZGlnIDQKICAgIGV4dHJhY3QgMjUgOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA3MwogICAgLy8gbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9ZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBkaWcgNQogICAgZXh0cmFjdCAzMyA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDc0CiAgICAvLyBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICBkaWcgNgogICAgZXh0cmFjdCA0MSA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDc1CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1lbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIGRpZyA3CiAgICBleHRyYWN0IDQ5IDgKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwNzYKICAgIC8vIGZsYWdzPWVudHJ5LmZsYWdzLAogICAgZGlnIDgKICAgIGV4dHJhY3QgNTcgOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA2Ni0xMDc3CiAgICAvLyB0eXAuT2JzZXJ2ZWRFdmVudFJlcXVlc3QoCiAgICAvLyAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBvYnNlcnZlZF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1lbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9ZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9ZW50cnkuZmxhZ3MsCiAgICAvLyApLAogICAgdW5jb3ZlciA3CiAgICB1bmNvdmVyIDgKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA3MgogICAgLy8gb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA2Ni0xMDc3CiAgICAvLyB0eXAuT2JzZXJ2ZWRFdmVudFJlcXVlc3QoCiAgICAvLyAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBvYnNlcnZlZF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1lbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9ZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9ZW50cnkuZmxhZ3MsCiAgICAvLyApLAogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwNjQtMTA3OAogICAgLy8gc2VsZi5fYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkoCiAgICAvLyAgICAgZW50cnksCiAgICAvLyAgICAgdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0KAogICAgLy8gICAgICAgICBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIC8vICAgICAgICAgZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgLy8gICAgICAgICBzY2hlZHVsZWRfdGltZT1lbnRyeS5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICAgICAgYWNjcnVhbF9mYWN0b3I9ZW50cnkuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICAgICAgb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPWVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPWVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgICAgICBmbGFncz1lbnRyeS5mbGFncywKICAgIC8vICAgICApLAogICAgLy8gKQogICAgY2FsbHN1YiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkKICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA3OQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDQ5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5hcHBseV9ub25fY2FzaF9ldmVudFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFwcGx5X25vbl9jYXNoX2V2ZW50OgogICAgaW50Y18wIC8vIDAKICAgIGR1cG4gNAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwODEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwbiAyCiAgICBsZW4KICAgIHB1c2hpbnQgNzMKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuT2JzZXJ2ZWRFdmVudFJlcXVlc3QKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDk1CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA5NgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwOTgKICAgIC8vIGlmIHBheWxvYWQuZmxhZ3MgJiBVSW50NjQoZW51bXMuRkxBR19PQlNFUlZFRF9FVkVOVCk6CiAgICBwdXNoaW50IDY1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBwdXNoaW50IDQKICAgICYKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjMzCiAgICAvLyByZXR1cm4gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9DTE0pCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIHB1c2hpbnQgNQogICAgPT0KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwOTkKICAgIC8vIGFzc2VydCBzZWxmLl9zdXBwb3J0c19vYnNlcnZlZF9ldmVudHMoKSwgZXJyLk9CU0VSVkVEX0VWRU5UX1JFUVVJUkVECiAgICBhc3NlcnQgLy8gT2JzZXJ2ZWQgZXZlbnQgcmVxdWlyZWQgdG8gZXhlY3V0ZSB0aGlzIGFjdGlvbgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEwMAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMzMKICAgIC8vIHJldHVybiBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0NMTSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgZHVwCiAgICBwdXNoaW50IDUKICAgID09CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5MzgKICAgIC8vIGFzc2VydCBzZWxmLl9zdXBwb3J0c19vYnNlcnZlZF9ldmVudHMoKSwgZXJyLk9CU0VSVkVEX0VWRU5UX1JFUVVJUkVECiAgICBhc3NlcnQgLy8gT2JzZXJ2ZWQgZXZlbnQgcmVxdWlyZWQgdG8gZXhlY3V0ZSB0aGlzIGFjdGlvbgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTM5CiAgICAvLyBhc3NlcnQgcGF5bG9hZC5ldmVudF9pZCA9PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LCBlcnIuSU5WQUxJRF9FVkVOVF9JRAogICAgZGlnIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgNwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NDEKICAgIC8vIHNlbGYuY29udHJhY3RfdHlwZSwgcGF5bG9hZC5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBkdXAKICAgIGV4dHJhY3QgOCAxCiAgICBidXJ5IDEyCiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTQwLTk0MgogICAgLy8gc2VsZi5fYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgc2VsZi5jb250cmFjdF90eXBlLCBwYXlsb2FkLmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIC8vICkKICAgIGNhbGxzdWIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NDQKICAgIC8vIHBhZ2VfaW5kZXggPSBzZWxmLl9zY2hlZHVsZV9wYWdlX2luZGV4KHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxOTAKICAgIC8vIHJldHVybiBldmVudF9pZCAvLyBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkKICAgIHB1c2hpbnQgMTYKICAgIC8KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojk0NQogICAgLy8gcGFnZSA9IHR5cC5FeGVjdXRpb25TY2hlZHVsZVBhZ2UoKQogICAgcHVzaGJ5dGVzIDB4MDAwMAogICAgYnVyeSA3CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NDYKICAgIC8vIGlmIHBhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlOgogICAgaXRvYgogICAgYnl0ZWMgMzEgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA5CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMjcKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojk0NwogICAgLy8gcGFnZSA9IHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XS5jb3B5KCkKICAgIGRpZyA3CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidXJ5IDcKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX3BhZ2UgZW50cnkgZXhpc3RzCgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDI3OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTQ4CiAgICAvLyBhc3NlcnQgcGFnZS5sZW5ndGggPCBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGRpZyA1CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgMTYKICAgIDwKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojk1MwogICAgLy8gc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIGRpZyAzCiAgICBkdXAKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NTQKICAgIC8vIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICBkaWcgMQogICAgZXh0cmFjdCAxNyA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NTUKICAgIC8vIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZGlnIDIKICAgIGV4dHJhY3QgMjUgOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTU2CiAgICAvLyBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDMKICAgIGV4dHJhY3QgNDEgOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTU3CiAgICAvLyBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIGRpZyA0CiAgICBleHRyYWN0IDQ5IDgKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojk1OAogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIHVuY292ZXIgNQogICAgZXh0cmFjdCA1NyA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NTAtOTYwCiAgICAvLyB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1wYXlsb2FkLmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9cGF5bG9hZC5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPXBheWxvYWQucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXBheWxvYWQubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICkKICAgIGRpZyAxMQogICAgaXRvYgogICAgZGlnIDE4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMwogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NDktOTYxCiAgICAvLyBwYWdlLmFwcGVuZCgKICAgIC8vICAgICB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9cGF5bG9hZC5ldmVudF9pZCwKICAgIC8vICAgICAgICAgZXZlbnRfdHlwZT1wYXlsb2FkLmV2ZW50X3R5cGUsCiAgICAvLyAgICAgICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIC8vICAgICAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICAgICApCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NjIKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHBhZ2UuY29weSgpCiAgICBkaWcgOAogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojk2MwogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTAzCiAgICAvLyBhc3NlcnQgZXZlbnRfaWQgPT0gc2VsZi5ldmVudF9jdXJzb3IsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBjdXJzb3IKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExMDQKICAgIC8vIGVudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KGV2ZW50X2lkKQogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEwNgogICAgLy8gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgYnVyeSAxMAogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozNjQKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzY1CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzYzLTM3MAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjM2NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9SUiksCiAgICBwdXNoaW50IDEyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzY3CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICBwdXNoaW50IDExCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzY4CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgcHVzaGludCAxOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzYzLTM3MAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjM2OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBieiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX2ZhbHNlQDE2CgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX3RydWVAMTU6CiAgICBpbnRjXzEgLy8gMQoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9tZXJnZUAxNzoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExMDUtMTEwNwogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2lzX25vbl9jYXNoKAogICAgLy8gICAgIGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIC8vICksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IHR5cGUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExMDgKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlICE9IGFyYzQuVUludDgoZW51bXMuRVZUX0lFRCksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGRpZyA4CiAgICBwdXNoYnl0ZXMgMHgwMQogICAgYiE9CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCB0eXBlCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozNzQKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluIChVSW50NjQoZW51bXMuRVZUX1JSKSwgVUludDY0KGVudW1zLkVWVF9SUkYpKQogICAgZGlnIDQKICAgIHB1c2hpbnQgMTIKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDIxCiAgICBkaWcgNAogICAgcHVzaGludCAxMQogICAgPT0KICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfZmFsc2VAMjIKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAyMToKICAgIGludGNfMSAvLyAxCgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX21lcmdlQDIzOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEwOQogICAgLy8gaWYgc2VsZi5fZXZlbnRfaXNfcmF0ZV9yZXNldChlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpKToKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Vsc2VfYm9keUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODAKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLm9ic2VydmVyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjQgLy8gMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTEzCiAgICAvLyBzZWxmLl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeShlbnRyeSwgcGF5bG9hZCkKICAgIGRpZyA2CiAgICBkaWcgMgogICAgY2FsbHN1YiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkKICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTExNAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDgxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Vsc2VfYm9keUA1OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTExMgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICBiIGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VANgoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9mYWxzZUAyMjoKICAgIGludGNfMCAvLyAwCiAgICBiIGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfbWVyZ2VAMjMKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfZmFsc2VAMTY6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX21lcmdlQDE3CgoKLy8gbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuZ2V0X2NvbnRyYWN0X3N0YXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2NvbnRyYWN0X3N0YXRlOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBkdXAKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEyMQogICAgLy8gY29udHJhY3RfdHlwZT1hcmM0LlVJbnQ4KHNlbGYuY29udHJhY3RfdHlwZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzIgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExMjMKICAgIC8vIHRvdGFsX3VuaXRzPXNlbGYudG90YWxfdW5pdHMsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEyNAogICAgLy8gcmVzZXJ2ZWRfdW5pdHNfdG90YWw9c2VsZi5yZXNlcnZlZF91bml0c190b3RhbCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTI1CiAgICAvLyBpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudD1zZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExMjYKICAgIC8vIGV2ZW50X2N1cnNvcj1zZWxmLmV2ZW50X2N1cnNvciwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEyNwogICAgLy8gc2NoZWR1bGVfZW50cnlfY291bnQ9c2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExMjgKICAgIC8vIG91dHN0YW5kaW5nX3ByaW5jaXBhbD1zZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEyOQogICAgLy8gaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZT1zZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEzMAogICAgLy8gbm9taW5hbF9pbnRlcmVzdF9yYXRlPXNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTMxCiAgICAvLyBhY2NydWVkX2ludGVyZXN0PXNlbGYuYWNjcnVlZF9pbnRlcmVzdCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTMyCiAgICAvLyBjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4PXNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEzMwogICAgLy8gY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXg9c2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTM0CiAgICAvLyByZXNlcnZlZF9pbnRlcmVzdD1zZWxmLnJlc2VydmVkX2ludGVyZXN0LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExMzUKICAgIC8vIHJlc2VydmVkX3ByaW5jaXBhbD1zZWxmLnJlc2VydmVkX3ByaW5jaXBhbCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExMjAtMTEzNgogICAgLy8gcmV0dXJuIHR5cC5LZXJuZWxTdGF0ZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlPWFyYzQuVUludDgoc2VsZi5jb250cmFjdF90eXBlKSwKICAgIC8vICAgICBzdGF0dXM9c2VsZi5zdGF0dXMsCiAgICAvLyAgICAgdG90YWxfdW5pdHM9c2VsZi50b3RhbF91bml0cywKICAgIC8vICAgICByZXNlcnZlZF91bml0c190b3RhbD1zZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsLAogICAgLy8gICAgIGluaXRpYWxfZXhjaGFuZ2VfYW1vdW50PXNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQsCiAgICAvLyAgICAgZXZlbnRfY3Vyc29yPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgLy8gICAgIHNjaGVkdWxlX2VudHJ5X2NvdW50PXNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQsCiAgICAvLyAgICAgb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2U9c2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlLAogICAgLy8gICAgIG5vbWluYWxfaW50ZXJlc3RfcmF0ZT1zZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBhY2NydWVkX2ludGVyZXN0PXNlbGYuYWNjcnVlZF9pbnRlcmVzdCwKICAgIC8vICAgICBjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4PXNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCwKICAgIC8vICAgICBjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleD1zZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4LAogICAgLy8gICAgIHJlc2VydmVkX2ludGVyZXN0PXNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QsCiAgICAvLyAgICAgcmVzZXJ2ZWRfcHJpbmNpcGFsPXNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsLAogICAgLy8gKQogICAgdW5jb3ZlciAxNAogICAgaXRvYgogICAgdW5jb3ZlciAxNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDEzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDEwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgOQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDgKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTE2CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5nZXRfbmV4dF9kdWVfZXZlbnRbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfbmV4dF9kdWVfZXZlbnQ6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTE0MgogICAgLy8gaWYgc2VsZi5ldmVudF9jdXJzb3IgPj0gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgPj0KICAgIGJ6IGdldF9uZXh0X2R1ZV9ldmVudF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExNDQKICAgIC8vIGV2ZW50X2lkPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTQzLTExNTMKICAgIC8vIHJldHVybiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1zZWxmLmV2ZW50X2N1cnNvciwKICAgIC8vICAgICBldmVudF90eXBlPWFyYzQuVUludDgoMCksCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9VUludDY0KDApLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9VUludDY0KDApLAogICAgLy8gICAgIGZsYWdzPVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGl0b2IKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExNDUKICAgIC8vIGV2ZW50X3R5cGU9YXJjNC5VSW50OCgwKSwKICAgIGJ5dGVjIDQwIC8vIDB4MDAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExNDMtMTE1MwogICAgLy8gcmV0dXJuIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgIGV2ZW50X2lkPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgLy8gICAgIGV2ZW50X3R5cGU9YXJjNC5VSW50OCgwKSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1VSW50NjQoMCksCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1VSW50NjQoMCksCiAgICAvLyAgICAgZmxhZ3M9VUludDY0KDApLAogICAgLy8gKQogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTQ2CiAgICAvLyBzY2hlZHVsZWRfdGltZT1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTE0My0xMTUzCiAgICAvLyByZXR1cm4gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkoCiAgICAvLyAgICAgZXZlbnRfaWQ9c2VsZi5ldmVudF9jdXJzb3IsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1hcmM0LlVJbnQ4KDApLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPVVJbnQ2NCgwKSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249VUludDY0KDApLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPVVJbnQ2NCgwKSwKICAgIC8vICAgICBmbGFncz1VSW50NjQoMCksCiAgICAvLyApCiAgICBpdG9iCiAgICBzd2FwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKCmdldF9uZXh0X2R1ZV9ldmVudF9hZnRlcl9pbmxpbmVkX21vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmdldF9uZXh0X2R1ZV9ldmVudEA0OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEzOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpnZXRfbmV4dF9kdWVfZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTE1NAogICAgLy8gcmV0dXJuIHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLmV2ZW50X2N1cnNvcikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgZ2V0X25leHRfZHVlX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuZ2V0X25leHRfZHVlX2V2ZW50QDQKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5jb250cmFjdF91cGRhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF91cGRhdGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTUzLTE1NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGdyYW50cyB0aGUgdXBkYXRlIHBlcm1pc3Npb25zIHRvIHRoZSBBcnJhbmdlci4KICAgIC8vICMg4pqg77iPIFdBUk5JTkc6IEFwcGxpY2F0aW9uIHVwZGF0ZXMgbXVzdCBiZSBleGVjdXRlZCBWRVJZIGNhcmVmdWxseSwgYXMgdGhleQogICAgLy8gIyBtaWdodCBpbnRyb2R1Y2UgYnJlYWtpbmcgY2hhbmdlcy4KICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfcm90YXRlX2FycmFuZ2VyW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19yb3RhdGVfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2OQogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTcwCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gbmV3X2FycmFuZ2VyCiAgICBieXRlYyAxOCAvLyAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTcxCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfc2V0X29wX2RhZW1vbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfc2V0X29wX2RhZW1vbjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTg0CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODUKICAgIC8vIHNlbGYub3BfZGFlbW9uLnZhbHVlID0gYWRkcmVzcwogICAgYnl0ZWMgMjUgLy8gMHg1MjIzNGY3MDQ0NjE2NTZkNmY2ZTIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4NgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTczCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2Fzc2lnbl9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19hc3NpZ25fcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDE2CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLlJvbGVWYWxpZGl0eQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjExCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMgogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgcHVzaGludCAyMAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTAzCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gcm9sZV9hZGRyZXNzCiAgICBieXRlYyAxOCAvLyAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMKICAgIGRpZyAzCiAgICBhcHBfZ2xvYmFsX3B1dAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTQKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDYKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIGR1cAogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnRfbWFuYWdlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMyAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwOAogICAgLy8gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMiAvLyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTIKICAgIC8vIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIGR1cAogICAgcHVzaGludCA2MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE1CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMzIgLy8gMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE2CiAgICAvLyBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExOAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMSAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIwCiAgICAvLyBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMwogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgODAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIzCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI0IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI0CiAgICAvLyBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3Jldm9rZV9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19yZXZva2Vfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzUKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzNgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzcKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCkpCiAgICBidG9pCiAgICBkdXBuIDIKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCAhPSBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksIGVyci5JTlZBTElEX1JPTEUKICAgIGR1cAogICAgcHVzaGludCAyMAogICAgIT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyOAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIzIC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0NGQ2MTZlNjE2NzY1NzIyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMwCiAgICAvLyBkZWwgc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzOQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjE2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIyIC8vIDB4NTIyMzUwNzI2OTZkNjE3Mjc5NDQ2NTYxNmM2NTcyMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNAogICAgLy8gZGVsIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjM4CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIGR1cAogICAgcHVzaGludCA2MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAzMiAvLyAweDUyMjM1NDcyNzU3Mzc0NjU2NTIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzgKICAgIC8vIGRlbCBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjM4CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDEKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hdXRob3JpdHksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjEgLy8gMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MgogICAgLy8gZGVsIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzOAogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDQKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDgwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI0IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ2CiAgICAvLyBkZWwgc2VsZi5vYnNlcnZlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ292X2Fzc2V0X3N1c3BlbnNpb25bcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dvdl9hc3NldF9zdXNwZW5zaW9uOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kICAjIFRPRE86IFVwZGF0ZSBzcGVjcyBhbmQgYWRkIHRlc3QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzcKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDIxIC8vIDB4NTIyMzQxNzU3NDY4NmY3MjY5NzQ3OTIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU3CiAgICAvLyBzZWxmLmFzc2V0X3N1c3BlbmRlZCA9IHN1c3BlbmRlZAogICAgYnl0ZWMgMzMgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU4CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCAgIyBUT0RPOiBVcGRhdGUgc3BlY3MgYW5kIGFkZCB0ZXN0CiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYXJyYW5nZXJbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNjgKICAgIC8vIHJldHVybiBzZWxmLmFycmFuZ2VyLnZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTggLy8gMHg1MjIzNDE3MjcyNjE2ZTY3NjU3MjIzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJyYW5nZXIgZXhpc3RzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjYwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9hZGRyZXNzX3JvbGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfYWRkcmVzc19yb2xlczoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg0CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmFjY291bnRfbWFuYWdlciwgYWRkcmVzcyksCiAgICBieXRlYyAyMyAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMKICAgIGRpZyAxCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4NQogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5wcmltYXJ5X2RlYWxlciwgYWRkcmVzcyksCiAgICBieXRlYyAyMiAvLyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzCiAgICBkaWcgMgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODYKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYudHJ1c3RlZSwgYWRkcmVzcyksCiAgICBieXRlYyAzMiAvLyAweDUyMjM1NDcyNzU3Mzc0NjU2NTIzCiAgICBkaWcgMwogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODcKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYXV0aG9yaXR5LCBhZGRyZXNzKSwKICAgIGJ5dGVjIDIxIC8vIDB4NTIyMzQxNzU3NDY4NmY3MjY5NzQ3OTIzCiAgICBkaWcgNAogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODgKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYub2JzZXJ2ZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjQgLy8gMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzCiAgICB1bmNvdmVyIDUKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjcwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjIDQwIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDYKICAgIHNldGJpdAogICAgaW50Y18xIC8vIDEKICAgIHVuY292ZXIgNQogICAgc2V0Yml0CiAgICBwdXNoaW50IDIKICAgIHVuY292ZXIgNAogICAgc2V0Yml0CiAgICBwdXNoaW50IDMKICAgIHVuY292ZXIgMwogICAgc2V0Yml0CiAgICBwdXNoaW50IDQKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA1CiAgICAvLyByb2xlID0gcm9sZV9pZC5hc191aW50NjQoKQogICAgYnRvaQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwNgogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZSkKICAgIGR1cAogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDgKICAgIC8vIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgcHVzaGludHMgMjAgNDAgNTAgNjAgNzAgODAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDctMzM4CiAgICAvLyBtYXRjaCByb2xlOgogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgLy8gICAgICAgICByZXR1cm4gdHlwLlJvbGVWYWxpZGl0eSgKICAgIC8vICAgICAgICAgICAgIHJvbGVfdmFsaWRpdHlfc3RhcnQ9VUludDY0KDApLCByb2xlX3ZhbGlkaXR5X2VuZD1VSW50NjQoMCkKICAgIC8vICAgICAgICAgKQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5hdXRob3JpdHksIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5vYnNlcnZlciwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5vYnNlcnZlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBfOgogICAgLy8gICAgICAgICBvcC5lcnIoZXJyLklOVkFMSURfUk9MRSkKICAgIHVuY292ZXIgNgogICAgbWF0Y2ggcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8wQDIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8xQDMgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8yQDQgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8zQDUgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV80QDYgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV81QDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzgKICAgIC8vIG9wLmVycihlcnIuSU5WQUxJRF9ST0xFKQogICAgZXJyIC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzVANzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzQKICAgIC8vIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMjQgLy8gMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzMzLTMzNQogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMzNgogICAgLy8gcmV0dXJuIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzRANjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjkKICAgIC8vIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDIxIC8vIDB4NTIyMzQxNzU3NDY4NmY3MjY5NzQ3OTIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI4LTMzMAogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzEKICAgIC8vIHJldHVybiBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzNANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjQKICAgIC8vIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAzMiAvLyAweDUyMjM1NDcyNzU3Mzc0NjU2NTIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzIzLTMyNQogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI2CiAgICAvLyByZXR1cm4gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMkA0OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxOQogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAyMiAvLyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzE4LTMyMAogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMQogICAgLy8gcmV0dXJuIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8xQDM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzE0CiAgICAvLyBzZWxmLmFjY291bnRfbWFuYWdlciwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAyMyAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTMtMzE1CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxNgogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMEAyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwOS0zMTEKICAgIC8vIHJldHVybiB0eXAuUm9sZVZhbGlkaXR5KAogICAgLy8gICAgIHJvbGVfdmFsaWRpdHlfc3RhcnQ9VUludDY0KDApLCByb2xlX3ZhbGlkaXR5X2VuZD1VSW50NjQoMCkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLl9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IHZvaWQ6Cl9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI2CiAgICAvLyBkZWYgX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQoc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjgKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkLCBlcnIuU1VTUEVOREVECiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCAzODQKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIFN1c3BlbmRlZCBvcGVyYXRpb25zCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5fc2V0dGxlX3Bvc2l0aW9uKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NCwgdWludDY0Ogpfc2V0dGxlX3Bvc2l0aW9uOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjQ0CiAgICAvLyBkZWYgX3NldHRsZV9wb3NpdGlvbihzZWxmLCBob2xkaW5nX2FkZHJlc3M6IEFjY291bnQpIC0+IHR1cGxlW1VJbnQ2NCwgVUludDY0XToKICAgIHByb3RvIDEgMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo2MQogICAgLy8gcG9zaXRpb24gPSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jb3B5KCkKICAgIGR1cAogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NjMtNjUKICAgIC8vICMgQ29tcHV0ZSB0aGUgaW5jcmVtZW50YWwgcGVyLXVuaXQgZml4ZWQtcG9pbnQgaW50ZXJlc3QgYW5kIHByaW5jaXBhbCBhY2NydWVkCiAgICAvLyAjIHNpbmNlIHRoaXMgYWNjb3VudCdzIGxhc3QgY2hlY2twb2ludC4KICAgIC8vIGludGVyZXN0X2RlbHRhID0gc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IC0gcG9zaXRpb24uaW50ZXJlc3RfY2hlY2twb2ludAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggZXhpc3RzCiAgICBkaWcgMQogICAgcHVzaGludCA1NwogICAgZXh0cmFjdF91aW50NjQKICAgIC0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo2NwogICAgLy8gc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCAtIHBvc2l0aW9uLnByaW5jaXBhbF9jaGVja3BvaW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTcgLy8gImN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IGV4aXN0cwogICAgZGlnIDIKICAgIHB1c2hpbnQgNjUKICAgIGV4dHJhY3RfdWludDY0CiAgICAtCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzMKICAgIC8vIGludGVyZXN0X2RlbHRhLCBwb3NpdGlvbi51bml0cywgc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgZGlnIDIKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3MC03NAogICAgLy8gIyBDb252ZXJ0IHRoZSBwZXItdW5pdCBmaXhlZC1wb2ludCBkZWx0YXMgaW50byBhYnNvbHV0ZSBjbGFpbWFibGUgYW1vdW50cwogICAgLy8gIyB1c2luZyB0aGUgYWNjb3VudCdzIGFjdGl2ZSB1bml0cy4KICAgIC8vIGNsYWltYWJsZV9pbnRlcmVzdCA9IHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIGludGVyZXN0X2RlbHRhLCBwb3NpdGlvbi51bml0cywgc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgLy8gKQogICAgdW5jb3ZlciAzCiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojc2CiAgICAvLyBwcmluY2lwYWxfZGVsdGEsIHBvc2l0aW9uLnVuaXRzLCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzUtNzcKICAgIC8vIGNsYWltYWJsZV9wcmluY2lwYWwgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBwcmluY2lwYWxfZGVsdGEsIHBvc2l0aW9uLnVuaXRzLCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICAvLyApCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojc5LTgxCiAgICAvLyAjIEFjY3J1ZSB0aGUgY2xhaW1hYmxlIGFtb3VudHMgdG8gdGhlIGFjY291bnQgcG9zaXRpb24gYW5kIG1ha2UgdGhlbSBhdmFpbGFibGUKICAgIC8vICMgZm9yIHdpdGhkcmF3YWwuCiAgICAvLyBwb3NpdGlvbi5jbGFpbWFibGVfaW50ZXJlc3QgKz0gY2xhaW1hYmxlX2ludGVyZXN0CiAgICBkaWcgMgogICAgcHVzaGludCA3MwogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICArCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIHN3YXAKICAgIHJlcGxhY2UyIDczCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6ODIKICAgIC8vIHBvc2l0aW9uLmNsYWltYWJsZV9wcmluY2lwYWwgKz0gY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgZHVwCiAgICBwdXNoaW50IDgxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDIKICAgICsKICAgIGl0b2IKICAgIHJlcGxhY2UyIDgxCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6ODQtODYKICAgIC8vICMgQWR2YW5jZSB0aGUgYWNjb3VudCdzIHBlci11bml0IGZpeGVkLXBvaW50IGNoZWNrcG9pbnRzIHRvIHRoZSBjdXJyZW50IGdsb2JhbAogICAgLy8gIyBwZXItdW5pdCBmaXhlZC1wb2ludCBnbG9iYWwgaW5kaWNlcy4KICAgIC8vIHBvc2l0aW9uLmludGVyZXN0X2NoZWNrcG9pbnQgPSBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IGV4aXN0cwogICAgaXRvYgogICAgcmVwbGFjZTIgNTcKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo4NwogICAgLy8gcG9zaXRpb24ucHJpbmNpcGFsX2NoZWNrcG9pbnQgPSBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTcgLy8gImN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IGV4aXN0cwogICAgaXRvYgogICAgcmVwbGFjZTIgNjUKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo4OS05MAogICAgLy8gIyBBZHZhbmNlIHRoZSBhY2NvdW50J3MgZXZlbnQgY3Vyc29yIHRvIHRoZSBjdXJyZW50IGdsb2JhbCBldmVudCBjdXJzb3IuCiAgICAvLyBwb3NpdGlvbi5zZXR0bGVkX2N1cnNvciA9IHNlbGYuZXZlbnRfY3Vyc29yCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGl0b2IKICAgIHJlcGxhY2UyIDQ5CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6OTItOTQKICAgIC8vICMgVXBkYXRlIHRoZSBhY2NvdW50IHBvc2l0aW9uIGFuZCByZXR1cm4gdGhlIG5ld2x5IGFjY3J1ZWQgY2xhaW1hYmxlIGFtb3VudHMKICAgIC8vICMgYWRkZWQgdG8gdGhlIHRvdGFsIHBvc2l0aW9uJ3MgY2xhaW1hYmxlIGFtb3VudHMuCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHBvc2l0aW9uLmNvcHkoKQogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6OTUKICAgIC8vIHJldHVybiBjbGFpbWFibGVfaW50ZXJlc3QsIGNsYWltYWJsZV9wcmluY2lwYWwKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IHZvaWQ6Cl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojk3CiAgICAvLyBkZWYgX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQoc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQyMwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDAKICAgIC8vIGlmIHNlbGYuX3N0YXR1c19pc19wZW5kaW5nX2llZCgpOgogICAgYnogX2Vuc3VyZV91bml0c19hY3RpdmF0ZWRfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTAxCiAgICAvLyByZXR1cm4KICAgIHJldHN1YgoKX2Vuc3VyZV91bml0c19hY3RpdmF0ZWRfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwMwogICAgLy8gcG9zaXRpb24gPSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAyCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDQKICAgIC8vIGlmIHBvc2l0aW9uLnJlc2VydmVkX3VuaXRzID09IFVJbnQ2NCgwKToKICAgIHB1c2hpbnQgNDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgYm56IF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkX2FmdGVyX2lmX2Vsc2VANAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwNQogICAgLy8gcmV0dXJuCiAgICByZXRzdWIKCl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkX2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDgKICAgIC8vIHBvc2l0aW9uLnVuaXRzICs9IGFjdGl2YXRlZF91bml0cwogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMwogICAgKwogICAgaXRvYgogICAgcmVwbGFjZTIgMzIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDkKICAgIC8vIHBvc2l0aW9uLnJlc2VydmVkX3VuaXRzID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgaXRvYgogICAgcmVwbGFjZTIgNDAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTAKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gcG9zaXRpb24uY29weSgpCiAgICBmcmFtZV9kaWcgMgogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExMQogICAgLy8gYXNzZXJ0IHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPj0gYWN0aXZhdGVkX3VuaXRzLCBlcnIuT1ZFUl9ESVNUUklCVVRJT04KICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICBkdXAKICAgIGRpZyAyCiAgICA+PQogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCByZW1haW5pbmcgRC1BU0EgdW5pdHMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTIKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgLT0gYWN0aXZhdGVkX3VuaXRzCiAgICBzd2FwCiAgICAtCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX3NjYWxlZF9tdWxfZGl2KG11bHRpcGxpY2FuZDogdWludDY0LCBtdWx0aXBsaWVyOiB1aW50NjQsIGRpdmlzb3I6IHVpbnQ2NCkgLT4gdWludDY0Ogpfc2NhbGVkX211bF9kaXY6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNTMtMTU1CiAgICAvLyBkZWYgX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIHNlbGYsIG11bHRpcGxpY2FuZDogVUludDY0LCBtdWx0aXBsaWVyOiBVSW50NjQsIGRpdmlzb3I6IFVJbnQ2NAogICAgLy8gKSAtPiBVSW50NjQ6CiAgICBwcm90byAzIDEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE1NwogICAgLy8gaWYgbXVsdGlwbGljYW5kID09IFVJbnQ2NCgwKSBvciBtdWx0aXBsaWVyID09IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMwogICAgYnogX3NjYWxlZF9tdWxfZGl2X2lmX2JvZHlAMgogICAgZnJhbWVfZGlnIC0yCiAgICBibnogX3NjYWxlZF9tdWxfZGl2X2FmdGVyX2lmX2Vsc2VAMwoKX3NjYWxlZF9tdWxfZGl2X2lmX2JvZHlAMjoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE1OAogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKX3NjYWxlZF9tdWxfZGl2X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE1OQogICAgLy8gaGlnaCwgbG93ID0gb3AubXVsdyhtdWx0aXBsaWNhbmQsIG11bHRpcGxpZXIpCiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMgogICAgbXVsdwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTYwCiAgICAvLyByZXR1cm4gb3AuZGl2dyhoaWdoLCBsb3csIGRpdmlzb3IpCiAgICBmcmFtZV9kaWcgLTEKICAgIGRpdncKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9hbW91bnRfdG9faW5kZXhfZGVsdGEoYW1vdW50OiB1aW50NjQpIC0+IHVpbnQ2NDoKX2Ftb3VudF90b19pbmRleF9kZWx0YToKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE2MgogICAgLy8gZGVmIF9hbW91bnRfdG9faW5kZXhfZGVsdGEoc2VsZiwgYW1vdW50OiBVSW50NjQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTY0CiAgICAvLyBpZiBhbW91bnQgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0xCiAgICBibnogX2Ftb3VudF90b19pbmRleF9kZWx0YV9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE2NQogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKX2Ftb3VudF90b19pbmRleF9kZWx0YV9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNjYKICAgIC8vIGFzc2VydCBzZWxmLnRvdGFsX3VuaXRzID4gVUludDY0KDApLCBlcnIuTk9fVU5JVFMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICBkdXAKICAgIGFzc2VydCAvLyBObyBELUFTQSB1bml0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTY3CiAgICAvLyByZXR1cm4gc2VsZi5fc2NhbGVkX211bF9kaXYoYW1vdW50LCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLCBzZWxmLnRvdGFsX3VuaXRzKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5faW5kZXhfZGVsdGFfdG9fYW1vdW50KGluZGV4X2RlbHRhOiB1aW50NjQpIC0+IHVpbnQ2NDoKX2luZGV4X2RlbHRhX3RvX2Ftb3VudDoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE2OQogICAgLy8gZGVmIF9pbmRleF9kZWx0YV90b19hbW91bnQoc2VsZiwgaW5kZXhfZGVsdGE6IFVJbnQ2NCkgLT4gVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNzYKICAgIC8vIGlmIGluZGV4X2RlbHRhID09IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMQogICAgYm56IF9pbmRleF9kZWx0YV90b19hbW91bnRfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNzcKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9pbmRleF9kZWx0YV90b19hbW91bnRfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTc5CiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE4MQogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE3OC0xODIKICAgIC8vIHJldHVybiBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLnRvdGFsX3VuaXRzLAogICAgLy8gICAgIGluZGV4X2RlbHRhLAogICAgLy8gICAgIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZ2V0X3NjaGVkdWxlX2VudHJ5KGV2ZW50X2lkOiB1aW50NjQpIC0+IGJ5dGVzOgpfZ2V0X3NjaGVkdWxlX2VudHJ5OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjAyCiAgICAvLyBkZWYgX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLCBldmVudF9pZDogVUludDY0KSAtPiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeToKICAgIHByb3RvIDEgMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjA0CiAgICAvLyBhc3NlcnQgZXZlbnRfaWQgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LCBlcnIuSU5WQUxJRF9FVkVOVF9JRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICA+CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBpZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTkwCiAgICAvLyByZXR1cm4gZXZlbnRfaWQgLy8gVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMTYKICAgIC8KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjIwNgogICAgLy8gYXNzZXJ0IHBhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBpdG9iCiAgICBieXRlYyAzMSAvLyAweDUzMjMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE5NAogICAgLy8gcmV0dXJuIGV2ZW50X2lkICUgVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMTYKICAgICUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjIwOQogICAgLy8gYXNzZXJ0IG9mZnNldCA8IHBhZ2UubGVuZ3RoLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIHB1c2hpbnQgMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGRpZyAxCiAgICA+CiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMTAKICAgIC8vIHJldHVybiBwYWdlW29mZnNldF0uY29weSgpCiAgICBwdXNoaW50IDY1CiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIHB1c2hpbnQgNjUKICAgIGJveF9leHRyYWN0CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoY29udHJhY3RfdHlwZTogdWludDY0LCBldmVudF90eXBlOiB1aW50NjQpIC0+IHZvaWQ6Cl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZToKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMxMy0zMTUKICAgIC8vIGRlZiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgc2VsZiwgY29udHJhY3RfdHlwZTogVUludDY0LCBldmVudF90eXBlOiBVSW50NjQKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjU0LTI1NQogICAgLy8gIyBDaGVjayBjb21tb24gZXZlbnRzIGZpcnN0CiAgICAvLyBpZiBldmVudF90eXBlIGluIGNvbW1vbl9ldmVudHM6CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI0NwogICAgLy8gVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI0OAogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUCksCiAgICBpbnRjXzIgLy8gOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjU0LTI1NQogICAgLy8gIyBDaGVjayBjb21tb24gZXZlbnRzIGZpcnN0CiAgICAvLyBpZiBldmVudF90eXBlIGluIGNvbW1vbl9ldmVudHM6CiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjQ5CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX01EKSwKICAgIHB1c2hpbnQgMTkKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI1MAogICAgLy8gVUludDY0KGVudW1zLkVWVF9SUiksCiAgICBwdXNoaW50IDEyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyNTEKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIHB1c2hpbnQgMTEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDcKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDY6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyNTYKICAgIC8vIHJldHVybiBUcnVlCiAgICBpbnRjXzEgLy8gMQoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQ6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIHJldHN1YgoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI1OC0yNTkKICAgIC8vICMgQ29udHJhY3Qtc3BlY2lmaWMgYWRkaXRpb25hbCBldmVudHMKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX1BBTSk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyNjAtMjYxCiAgICAvLyAjIFBBTSBvbmx5IHN1cHBvcnRzIGNvbW1vbiBldmVudHMKICAgIC8vIHJldHVybiBGYWxzZQogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI2MwogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfTEFNKSBvciBjb250cmFjdF90eXBlID09IFVJbnQ2NCgKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAzCiAgICA9PQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjYzLTI2NQogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfTEFNKSBvciBjb250cmFjdF90eXBlID09IFVJbnQ2NCgKICAgIC8vICAgICBlbnVtcy5DVF9OQU0KICAgIC8vICk6CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlAMTEKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAyCiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMTYKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDExOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjY2LTI3MAogICAgLy8gIyBMQU0vTkFNIGFkZDogUFIsIElQQ0IKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyNjgKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyNjYtMjcwCiAgICAvLyAjIExBTS9OQU0gYWRkOiBQUiwgSVBDQgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMTMKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjY5CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgcHVzaGludCAxOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjY2LTI3MAogICAgLy8gIyBMQU0vTkFNIGFkZDogUFIsIElQQ0IKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gKQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDE0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDEzOgogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMTQ6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAxNjoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI3MgogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKToKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAyMwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjczLTI3OAogICAgLy8gIyBBTk4gYWRkczogUFIsIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyNzUKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyNzMtMjc4CiAgICAvLyAjIEFOTiBhZGRzOiBQUiwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjAKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Mjc2CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgcHVzaGludCAxOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjczLTI3OAogICAgLy8gIyBBTk4gYWRkczogUFIsIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDIwCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI3NwogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyNzMtMjc4CiAgICAvLyAjIEFOTiBhZGRzOiBQUiwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMjEKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjA6CiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF9mYWxzZUAyMToKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDIzOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjgwCiAgICAvLyBpZiBjb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9MQVgpOgogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDQKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAzMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjgxLTI4NwogICAgLy8gIyBMQVggYWRkczogUFIsIFBJLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjgzCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjgxLTI4NwogICAgLy8gIyBMQVggYWRkczogUFIsIFBJLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyOAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyODQKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgcHVzaGludCA0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyODEtMjg3CiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDI4CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI4NQogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIHB1c2hpbnQgMTgKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI4MS0yODcKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjgKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Mjg2CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICBwdXNoaW50IDUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI4MS0yODcKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMjkKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjg6CiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF9mYWxzZUAyOToKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDMxOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Mjg5CiAgICAvLyBpZiBjb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9DTE0pOgogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDUKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAzMwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjkwLTI5MQogICAgLy8gIyBDTE0gYWRkczogUFIKICAgIC8vIHJldHVybiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMzM6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyOTMKICAgIC8vIHJldHVybiBGYWxzZQogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKCi8vIG1vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9pc19keW5hbWljX2FubnVpdHkoKSAtPiB1aW50NjQ6Cl9pc19keW5hbWljX2FubnVpdHk6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozMzUKICAgIC8vIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMzNS0zMzYKICAgIC8vIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKQogICAgLy8gYW5kIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgYnogX2lzX2R5bmFtaWNfYW5udWl0eV9ib29sX2ZhbHNlQDMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMzNgogICAgLy8gYW5kIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDM0IC8vICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24gZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozMzUtMzM2CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIC8vIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGJ6IF9pc19keW5hbWljX2FubnVpdHlfYm9vbF9mYWxzZUAzCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzM0LTMzNwogICAgLy8gcmV0dXJuICgKICAgIC8vICAgICBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIC8vICAgICBhbmQgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICAvLyApCiAgICByZXRzdWIKCl9pc19keW5hbWljX2FubnVpdHlfYm9vbF9mYWxzZUAzOgogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMzNC0zMzcKICAgIC8vIHJldHVybiAoCiAgICAvLyAgICAgc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICAvLyAgICAgYW5kIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgLy8gKQogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnk6IGJ5dGVzKSAtPiB1aW50NjQsIGJ5dGVzOgpfZW50cnlfaW50ZXJlc3Rfc2VnbWVudDoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjM4MAogICAgLy8gZGVmIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KHNlbGYsIGVudHJ5OiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSkgLT4gVUludDY0OgogICAgcHJvdG8gMSAyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozODkKICAgIC8vIGVudHJ5LmFjY3J1YWxfZmFjdG9yID09IFVJbnQ2NCgwKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDE3CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozODktMzkxCiAgICAvLyBlbnRyeS5hY2NydWFsX2ZhY3RvciA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID09IFVJbnQ2NCgwKQogICAgLy8gb3Igc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID09IFVJbnQ2NCgwKQogICAgYnogX2VudHJ5X2ludGVyZXN0X3NlZ21lbnRfaWZfYm9keUAzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozOTAKICAgIC8vIG9yIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID09IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozODktMzkxCiAgICAvLyBlbnRyeS5hY2NydWFsX2ZhY3RvciA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID09IFVJbnQ2NCgwKQogICAgLy8gb3Igc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID09IFVJbnQ2NCgwKQogICAgYnogX2VudHJ5X2ludGVyZXN0X3NlZ21lbnRfaWZfYm9keUAzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozOTEKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozODktMzkxCiAgICAvLyBlbnRyeS5hY2NydWFsX2ZhY3RvciA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID09IFVJbnQ2NCgwKQogICAgLy8gb3Igc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID09IFVJbnQ2NCgwKQogICAgYm56IF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2FmdGVyX2lmX2Vsc2VANAoKX2VudHJ5X2ludGVyZXN0X3NlZ21lbnRfaWZfYm9keUAzOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzkzCiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfZGlnIC0xCiAgICB1bmNvdmVyIDIKICAgIHJldHN1YgoKX2VudHJ5X2ludGVyZXN0X3NlZ21lbnRfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Mzk1CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Mzk2CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Mzk3CiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Mzk0LTM5OAogICAgLy8gYWNjcnVlZCA9IHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSwKICAgIC8vICAgICBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQwMgogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjM5OS00MDMKICAgIC8vIHJldHVybiBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBhY2NydWVkLAogICAgLy8gICAgIGVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMAogICAgc3dhcAogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIGZyYW1lX2RpZyAtMQogICAgdW5jb3ZlciAyCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZGlzY291bnRfYW5udWl0eV9mYWN0b3IoZGlzY291bnRfZmFjdG9yOiB1aW50NjQsIHJlZGVtcHRpb25fZmFjdG9yOiB1aW50NjQpIC0+IHVpbnQ2NDoKX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDYyLTQ2NgogICAgLy8gZGVmIF9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcigKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgIGRpc2NvdW50X2ZhY3RvcjogVUludDY0LAogICAgLy8gICAgIHJlZGVtcHRpb25fZmFjdG9yOiBVSW50NjQsCiAgICAvLyApIC0+IFVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDY4CiAgICAvLyBpZiByZWRlbXB0aW9uX2ZhY3RvciA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGJueiBfZGlzY291bnRfYW5udWl0eV9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0NjkKICAgIC8vIHJldHVybiBkaXNjb3VudF9mYWN0b3IKICAgIGZyYW1lX2RpZyAtMgogICAgcmV0c3ViCgpfZGlzY291bnRfYW5udWl0eV9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDcwCiAgICAvLyBwZXJpb2RfcmF0ZSA9IHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgKyBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQ3MQogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQ3MC00NzQKICAgIC8vIHBlcmlvZF9yYXRlID0gc2VsZi5maXhlZF9wb2ludF9zY2FsZSArIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIHJlZGVtcHRpb25fZmFjdG9yLAogICAgLy8gICAgIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgKwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDc1CiAgICAvLyBhc3NlcnQgcGVyaW9kX3JhdGUgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZHVwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0NzgKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0NzYtNDgwCiAgICAvLyByZXR1cm4gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgZGlzY291bnRfZmFjdG9yLAogICAgLy8gICAgIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICAvLyAgICAgcGVyaW9kX3JhdGUsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeShlbnRyeTogYnl0ZXMsIHBheWxvYWQ6IGJ5dGVzKSAtPiBieXRlcywgYnl0ZXM6Cl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeToKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYxMy02MTUKICAgIC8vIGRlZiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkoCiAgICAvLyAgICAgc2VsZiwgZW50cnk6IHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5LCBwYXlsb2FkOiB0eXAuT2JzZXJ2ZWRFdmVudFJlcXVlc3QKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDIgMgogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2MjMKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF9pZCA9PSBzZWxmLmV2ZW50X2N1cnNvciwgZXJyLklOVkFMSURfRVZFTlRfQ1VSU09SCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgY3Vyc29yCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2MjQKICAgIC8vIGFzc2VydCBlbnRyeS5zY2hlZHVsZWRfdGltZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwgZXJyLk5PX0RVRV9DQVNIRkxPVwogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA8PQogICAgYXNzZXJ0IC8vIE5vIGR1ZSBjYXNoZmxvdyB0byBwYXkKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYyNgogICAgLy8gZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjI3CiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfSUVEKToKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgZHVwCiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMzUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjI4LTYzMAogICAgLy8gIyBJRUQgZmluYWxpemVzIGlzc3VhbmNlOiByZXNlcnZlZCB1bml0cyBiZWNvbWUgYWN0aXZhdGFibGUgYW5kIHRoZQogICAgLy8gIyBzY2hlZHVsZSdzIGluaXRpYWwgY29udHJhY3R1YWwgc3RhdGUgYmVjb21lcyBsaXZlLgogICAgLy8gYXNzZXJ0IHNlbGYuX3N0YXR1c19pc19wZW5kaW5nX2llZCgpLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYzMgogICAgLy8gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCA9PSBzZWxmLnRvdGFsX3VuaXRzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgID09CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2MzEtNjMzCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPT0gc2VsZi50b3RhbF91bml0cwogICAgLy8gKSwgZXJyLlBSSU1BUllfRElTVFJJQlVUSU9OX0lOQ09NUExFVEUKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBub3QgY29tcGxldGUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYzNAogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2MzUKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYzNgogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPSBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZQogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYzNwogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ID0gVUludDY0KDApCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2MzgKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IGVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA0MQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYzOQogICAgLy8gc2VsZi5ldmVudF9jdXJzb3IgKz0gVUludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjQwCiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbnVtcy5TVEFUVVNfQUNUSVZFKQogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgcHVzaGludCAxMDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0NTEKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwgZXJyLk5PVF9FVlRfSUVECiAgICBmcmFtZV9kaWcgMTEKICAgIGFzc2VydCAvLyBOb3QgSUVEIGV2ZW50CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0NTIKICAgIC8vIHJldHVybiBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjQxLTY0NQogICAgLy8gc2VsZi5fZW1pdF9leGVjdXRpb25fZXZlbnQoCiAgICAvLyAgICAgZW50cnk9ZW50cnksCiAgICAvLyAgICAgcGF5b2ZmPXNlbGYuX2VudHJ5X2llZF9hbW91bnQoZW50cnkpLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjQ0CiAgICAvLyBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjQxLTY0NQogICAgLy8gc2VsZi5fZW1pdF9leGVjdXRpb25fZXZlbnQoCiAgICAvLyAgICAgZW50cnk9ZW50cnksCiAgICAvLyAgICAgcGF5b2ZmPXNlbGYuX2VudHJ5X2llZF9hbW91bnQoZW50cnkpLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGNhbGxzdWIgX2VtaXRfZXhlY3V0aW9uX2V2ZW50CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgLTIKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjY0NgogICAgLy8gcmV0dXJuCiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2J1cnkgMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMzUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTQ3CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuX3N0YXR1c19pc19wZW5kaW5nX2llZCgpLCBlcnIuUEVORElOR19JRUQKICAgICEKICAgIGFzc2VydCAvLyBJRUQgbm90IHlldCBleGVjdXRlZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjQ5CiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgKz0gc2VsZi5fZW50cnlfaW50ZXJlc3Rfc2VnbWVudChlbnRyeSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQKICAgIGZyYW1lX2J1cnkgLTIKICAgICsKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjUxCiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUlIpOgogICAgZnJhbWVfZGlnIDEwCiAgICBwdXNoaW50IDEyCiAgICA9PQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAxMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjU1CiAgICAvLyBwYXlsb2FkLm9ic2VydmVkX3JhdGUsCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2NTYKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9tdWx0aXBsaWVyLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDM2IC8vICJyYXRlX3Jlc2V0X211bHRpcGxpZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9tdWx0aXBsaWVyIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjU3CiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjUyLTY1OAogICAgLy8gIyBSUiBkZXJpdmVzIHRoZSBuZXh0IHJhdGUgZnJvbSBhbiBvYnNlcnZlZCBvcmFjbGUgdmFsdWUgcGx1cyB0aGUKICAgIC8vICMgY29udHJhY3Qgc3ByZWFkIC8gbXVsdGlwbGllciB0ZXJtcywgdGhlbiBlbmZvcmNlcyBmbG9vciBhbmQgY2FwLgogICAgLy8gb2JzZXJ2ZWRfcmF0ZSA9IHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIHBheWxvYWQub2JzZXJ2ZWRfcmF0ZSwKICAgIC8vICAgICBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjY2MAogICAgLy8gb2JzZXJ2ZWRfcmF0ZSArIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzNSAvLyAicmF0ZV9yZXNldF9zcHJlYWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQgZXhpc3RzCiAgICArCiAgICBmcmFtZV9idXJ5IDYKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjczNAogICAgLy8gaWYgc2VsZi5oYXNfcmF0ZV9yZXNldF9mbG9vciBhbmQgcmF0ZSA8IHNlbGYucmF0ZV9yZXNldF9mbG9vcjoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzOCAvLyAiaGFzX3JhdGVfcmVzZXRfZmxvb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgZXhpc3RzCiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1NQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI5IC8vICJyYXRlX3Jlc2V0X2Zsb29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfZmxvb3IgZXhpc3RzCiAgICBmcmFtZV9kaWcgNgogICAgPgogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjczNQogICAgLy8gcmF0ZSA9IHNlbGYucmF0ZV9yZXNldF9mbG9vcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI5IC8vICJyYXRlX3Jlc2V0X2Zsb29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgNgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9mbG9vciBleGlzdHMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU1OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzM2CiAgICAvLyBpZiBzZWxmLmhhc19yYXRlX3Jlc2V0X2NhcCBhbmQgcmF0ZSA+IHNlbGYucmF0ZV9yZXNldF9jYXA6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzkgLy8gImhhc19yYXRlX3Jlc2V0X2NhcCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgZXhpc3RzCiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1OAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDMwIC8vICJyYXRlX3Jlc2V0X2NhcCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X2NhcCBleGlzdHMKICAgIGZyYW1lX2RpZyA2CiAgICA8CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1OAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzM3CiAgICAvLyByYXRlID0gc2VsZi5yYXRlX3Jlc2V0X2NhcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDMwIC8vICJyYXRlX3Jlc2V0X2NhcCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDYKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfY2FwIGV4aXN0cwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTg6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2NTkKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gc2VsZi5fY2xhbXBfcmF0ZSgKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjY1OS02NjEKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gc2VsZi5fY2xhbXBfcmF0ZSgKICAgIC8vICAgICBvYnNlcnZlZF9yYXRlICsgc2VsZi5yYXRlX3Jlc2V0X3NwcmVhZAogICAgLy8gKQogICAgZnJhbWVfZGlnIDYKICAgIGFwcF9nbG9iYWxfcHV0CgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAxODoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjY3MQogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1BJKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCA0CiAgICA9PQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAyMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjcyCiAgICAvLyBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9IGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjY3MwogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMjM6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2NzgKICAgIC8vIGlmIHNlbGYuX2lzX2R5bmFtaWNfYW5udWl0eSgpOgogICAgY2FsbHN1YiBfaXNfZHluYW1pY19hbm51aXR5CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDI5CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2NzkKICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QUkYpOgogICAgZnJhbWVfZGlnIDEwCiAgICBwdXNoaW50IDUKICAgID09CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAzMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDkwCiAgICAvLyBkaXNjb3VudF9mYWN0b3IgPSBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQ5MQogICAgLy8gZGVub21pbmF0b3IgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQ5MgogICAgLy8gc2tpcF9maXJzdF9yZWRlbXB0aW9uID0gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDcKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQ5NAogICAgLy8gaWYgZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAyNQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgZnJhbWVfYnVyeSA4CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAzNQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDk1LTQ5OQogICAgLy8gIyBBbiBpbml0aWFsIFBSRiBtYXkgZGVzY3JpYmUgdGhlIGZpcnN0IHJlZGVtcHRpb24gcGVyaW9kIGRpcmVjdGx5LgogICAgLy8gZGlzY291bnRfZmFjdG9yID0gc2VsZi5fZGlzY291bnRfYW5udWl0eV9mYWN0b3IoCiAgICAvLyAgICAgZGlzY291bnRfZmFjdG9yLAogICAgLy8gICAgIGVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDgKICAgIGNhbGxzdWIgX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTAxCiAgICAvLyBza2lwX2ZpcnN0X3JlZGVtcHRpb24gPSBUcnVlCiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfYnVyeSA3CiAgICBmcmFtZV9idXJ5IDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDM1OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTAzCiAgICAvLyBmdXR1cmVfZXZlbnRfaWQgPSBzZWxmLmV2ZW50X2N1cnNvciArIFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfd2hpbGVfdG9wQDM2OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTA0CiAgICAvLyB3aGlsZSBmdXR1cmVfZXZlbnRfaWQgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgZnJhbWVfZGlnIDMKICAgID4KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl93aGlsZUA0OAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTA1CiAgICAvLyBmdXR1cmVfZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoZnV0dXJlX2V2ZW50X2lkKQogICAgZnJhbWVfZGlnIDMKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjUwNgogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPSBmdXR1cmVfZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1MDctNTA4CiAgICAvLyAjIE9ubHkgcmVkZW1wdGlvbi1iZWFyaW5nIGV2ZW50cyBjb250cmlidXRlIHRvIHRoZSBhbm51aXR5IGRlbm9taW5hdG9yLgogICAgLy8gaXNfcmVkZW1wdGlvbl9ldmVudCA9IGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpIG9yICgKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjUwNy01MTEKICAgIC8vICMgT25seSByZWRlbXB0aW9uLWJlYXJpbmcgZXZlbnRzIGNvbnRyaWJ1dGUgdG8gdGhlIGFubnVpdHkgZGVub21pbmF0b3IuCiAgICAvLyBpc19yZWRlbXB0aW9uX2V2ZW50ID0gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QUikgb3IgKAogICAgLy8gICAgIGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfTUQpCiAgICAvLyAgICAgYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICAvLyApCiAgICBibnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfdHJ1ZUA0MAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTA5CiAgICAvLyBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgZnJhbWVfZGlnIDQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1MDktNTEwCiAgICAvLyBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgLy8gYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF9mYWxzZUA0MQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTEwCiAgICAvLyBhbmQgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IgPiBVSW50NjQoMCkKICAgIGZyYW1lX2RpZyAwCiAgICBwdXNoaW50IDI1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTA5LTUxMAogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCkKICAgIC8vIGFuZCBmdXR1cmVfZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX3RydWVANDA6CiAgICBpbnRjXzEgLy8gMQoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfbWVyZ2VANDI6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1MTIKICAgIC8vIGlmIGlzX3JlZGVtcHRpb25fZXZlbnQ6CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA0NwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTEzCiAgICAvLyBpZiBza2lwX2ZpcnN0X3JlZGVtcHRpb246CiAgICBmcmFtZV9kaWcgNwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUA0NQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTE0CiAgICAvLyBza2lwX2ZpcnN0X3JlZGVtcHRpb24gPSBGYWxzZQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgNwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANDc6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1MjEKICAgIC8vIGZ1dHVyZV9ldmVudF9pZCArPSBVSW50NjQoMSkKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV93aGlsZV90b3BAMzYKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlANDU6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1MTgKICAgIC8vIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZnJhbWVfZGlnIDAKICAgIHB1c2hpbnQgMjUKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1MTYtNTE5CiAgICAvLyBkaXNjb3VudF9mYWN0b3IgPSBzZWxmLl9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcigKICAgIC8vICAgICBkaXNjb3VudF9mYWN0b3IsCiAgICAvLyAgICAgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMgogICAgc3dhcAogICAgY2FsbHN1YiBfZGlzY291bnRfYW5udWl0eV9mYWN0b3IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1MjAKICAgIC8vIGRlbm9taW5hdG9yICs9IGRpc2NvdW50X2ZhY3RvcgogICAgZnJhbWVfZGlnIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA0NwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDE6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF9tZXJnZUA0MgoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX3doaWxlQDQ4OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTIzCiAgICAvLyBhc3NlcnQgZGVub21pbmF0b3IgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZnJhbWVfZGlnIDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjUyNAogICAgLy8gbnVtZXJhdG9yID0gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTI1CiAgICAvLyBpZiBlbnRyeS5mbGFncyAmIFVJbnQ2NChlbnVtcy5GTEFHX0lOSVRJQUxfUFJGKSA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNTcKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gOAogICAgJgogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDUwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1MjYtNTI3CiAgICAvLyAjIFN1YnNlcXVlbnQgUFJGIGV2ZW50cyBhbW9ydGl6ZSBib3RoIHByaW5jaXBhbCBhbmQgYWxyZWFkeSBhY2NydWVkIGNhcnJ5LgogICAgLy8gbnVtZXJhdG9yICs9IHNlbGYuYWNjcnVlZF9pbnRlcmVzdAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgICsKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDUwOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTMwCiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTI4LTUzMgogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIG51bWVyYXRvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gICAgIGRlbm9taW5hdG9yLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDEKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2ODAKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IHNlbGYuX3JlY2FsY3VsYXRlX2FubnVpdHlfcGF5bWVudCgKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjgwLTY4MgogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gc2VsZi5fcmVjYWxjdWxhdGVfYW5udWl0eV9wYXltZW50KAogICAgLy8gICAgIGVudHJ5CiAgICAvLyApCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMzA6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2ODUKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjY4Ni02OTAKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1VSW50NjQoMCksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2ODgKICAgIC8vIHBheW9mZj1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Njg5CiAgICAvLyBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICBkdXAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjY4Ni02OTAKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1VSW50NjQoMCksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgY2FsbHN1YiBfZW1pdF9leGVjdXRpb25fZXZlbnQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDI5OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Njg0CiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDMwCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDIwOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Njc0CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9JUENCKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCAxOAogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDIzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2NzUtNjc2CiAgICAvLyAjIElQQ0Iga2VlcHMgcHJpbmNpcGFsIHVuY2hhbmdlZCBhbmQgb25seSByZXNldHMgdGhlIGludGVyZXN0IGJhc2UuCiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIGIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMjMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMTA6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2NjIKICAgIC8vIGVsaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1JSRik6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgMTEKICAgID09CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDE0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2NjMKICAgIC8vIG5leHRfcmF0ZSA9IGVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjY0CiAgICAvLyBpZiBuZXh0X3JhdGUgPT0gVUludDY0KDApOgogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDEzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2NjUKICAgIC8vIG5leHRfcmF0ZSA9IHNlbGYucmF0ZV9yZXNldF9uZXh0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzcgLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDUKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfbmV4dCBleGlzdHMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjY2CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IG5leHRfcmF0ZQogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgZnJhbWVfZGlnIDUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDE0OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjY4CiAgICAvLyBpZiBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSAhPSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgOQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMTgKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjY2OQogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPSBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZQogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgZnJhbWVfZGlnIDkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CgoKLy8gbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KGVudHJ5OiBieXRlcywgcGF5b2ZmOiB1aW50NjQsIHNldHRsZWRfYW1vdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpfZW1pdF9leGVjdXRpb25fZXZlbnQ6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2OTYtNzAyCiAgICAvLyBkZWYgX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgKiwKICAgIC8vICAgICBlbnRyeTogdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnksCiAgICAvLyAgICAgcGF5b2ZmOiBVSW50NjQsCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ6IFVJbnQ2NCwKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDMgMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzA2CiAgICAvLyBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25JRAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzA3CiAgICAvLyBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIGZyYW1lX2RpZyAtMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3MDgKICAgIC8vIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIGZyYW1lX2RpZyAtMwogICAgZXh0cmFjdCA4IDEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjcwOQogICAgLy8gc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICBmcmFtZV9kaWcgLTMKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3MTAKICAgIC8vIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3MTMKICAgIC8vIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIGZyYW1lX2RpZyAtMwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzA4CiAgICAvLyBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICBpbnRjXzIgLy8gOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzEzCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBnZXRieXRlCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3NDIKICAgIC8vIGlmIHBheW9mZiA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJueiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3NDMKICAgIC8vIHJldHVybiBVSW50NjQoZW51bXMuUEFZT0ZGX1NJR05fUE9TSVRJVkUpCiAgICBpbnRjXzEgLy8gMQoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX3BheW9mZl9zaWduQDc6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3MTItNzE0CiAgICAvLyBwYXlvZmZfc2lnbj1hcmM0LlVJbnQ4KAogICAgLy8gICAgIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIC8vICksCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgaW50Y18yIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3MTYKICAgIC8vIGN1cnJlbmN5X2lkPXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzE3CiAgICAvLyBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3MDUtNzE4CiAgICAvLyBFeGVjdXRpb25FdmVudCgKICAgIC8vICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIC8vICAgICBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYXBwbGllZF9hdD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICBwYXlvZmY9cGF5b2ZmLAogICAgLy8gICAgIHBheW9mZl9zaWduPWFyYzQuVUludDgoCiAgICAvLyAgICAgICAgIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIC8vICAgICApLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PXNldHRsZWRfYW1vdW50LAogICAgLy8gICAgIGN1cnJlbmN5X2lkPXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAwCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzA0LTcxOQogICAgLy8gYXJjNC5lbWl0KAogICAgLy8gICAgIEV4ZWN1dGlvbkV2ZW50KAogICAgLy8gICAgICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgICAgIHBheW9mZj1wYXlvZmYsCiAgICAvLyAgICAgICAgIHBheW9mZl9zaWduPWFyYzQuVUludDgoCiAgICAvLyAgICAgICAgICAgICBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICAvLyAgICAgICAgICksCiAgICAvLyAgICAgICAgIHNldHRsZWRfYW1vdW50PXNldHRsZWRfYW1vdW50LAogICAgLy8gICAgICAgICBjdXJyZW5jeV9pZD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgICAgIHNlcXVlbmNlPWVudHJ5LmV2ZW50X2lkICsgVUludDY0KDEpLAogICAgLy8gICAgICkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDlhMzMyYjk1IC8vIG1ldGhvZCAiRXhlY3V0aW9uRXZlbnQodWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojc0NAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiAoVUludDY0KGVudW1zLkVWVF9JRUQpLCBVSW50NjQoZW51bXMuRVZUX1BJKSk6CiAgICBmcmFtZV9kaWcgNQogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBibnogX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2lmX2JvZHlANQogICAgZnJhbWVfZGlnIDUKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGJ6IF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pZl9lbHNlQDYKCl9lbWl0X2V4ZWN1dGlvbl9ldmVudF9pZl9ib2R5QDU6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3NDUKICAgIC8vIHJldHVybiBVSW50NjQoZW51bXMuUEFZT0ZGX1NJR05fUE9TSVRJVkUpCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzEzCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBiIF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pbmxpbmVkX21vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9wYXlvZmZfc2lnbkA3CgpfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzQ2CiAgICAvLyByZXR1cm4gVUludDY0KGVudW1zLlBBWU9GRl9TSUdOX05FR0FUSVZFKQogICAgcHVzaGludCAyNTUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjcxMwogICAgLy8gc2VsZi5fcGF5b2ZmX3NpZ24oZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSwgcGF5b2ZmKQogICAgYiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fcGF5b2ZmX3NpZ25ANwoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9yb2xlX2lzX2FjdGl2ZShyb2xlX21hcDogYnl0ZXMsIHJvbGVfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NDoKX3JvbGVfaXNfYWN0aXZlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU3CiAgICAvLyBkZWYgX3JvbGVfaXNfYWN0aXZlKHNlbGYsIHJvbGVfbWFwOiB0eXAuUmJhY1JvbGUsIHJvbGVfYWRkcmVzczogQWNjb3VudCkgLT4gYm9vbDoKICAgIHByb3RvIDIgMQogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5CiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5LTYwCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5LTYxCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjEKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAtNjEKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgPj0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX21lcmdlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKSAtPiB2b2lkOgpfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2NQogICAgLy8gYXNzZXJ0IHNlbGYuX2lzX2FycmFuZ2VyKFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTIKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgPT0gc2VsZi5hcnJhbmdlci52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE4IC8vIDB4NTIyMzQxNzI3MjYxNmU2NzY1NzIyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgPT0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2NQogICAgLy8gYXNzZXJ0IHNlbGYuX2lzX2FycmFuZ2VyKFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpIC0+IHZvaWQ6Cl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4MwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFzc2V0X2RlZmF1bHRlZCwgZXJyLkRFRkFVTFRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQxIC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfZGVmYXVsdGVkIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIERlZmF1bHRlZAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkgLT4gdm9pZDoKX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg2CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYXNzZXRfc3VzcGVuZGVkLCBlcnIuU1VTUEVOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzMgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9zdXNwZW5kZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gU3VzcGVuZGVkIG9wZXJhdGlvbnMKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkOiB1aW50NjQpIC0+IHZvaWQ6Cl9hc3NlcnRfdmFsaWRfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OAogICAgLy8gZGVmIF9hc3NlcnRfdmFsaWRfcm9sZShzZWxmLCByb2xlX2lkOiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTAKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIHB1c2hpbnQgMjAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkxCiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgcHVzaGludCAyNQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTIKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICBwdXNoaW50IDQwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MwogICAgLy8gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgcHVzaGludCA1MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTQKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgcHVzaGludCA2MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTUKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICBwdXNoaW50IDcwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NgogICAgLy8gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgcHVzaGludCA4MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfZmFsc2VAOAoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3OgogICAgaW50Y18xIC8vIDEKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX21lcmdlQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgcmV0c3ViCgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9mYWxzZUA4OgogICAgaW50Y18wIC8vIDAKICAgIGIgX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfbWVyZ2VAOQo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="}, "sourceInfo": {"approval": {"pcOffsetMethod": "none", "sourceInfo": [{"pc": [2601], "errorMessage": "ACTUS event not yet executed"}, {"pc": [2358], "errorMessage": "Can not distribute zero units"}, {"pc": [3102, 3109, 3481], "errorMessage": "D-ASA already configured"}, {"pc": [1238, 1939, 2318, 2464, 3733, 3880, 4226, 4372], "errorMessage": "D-ASA not configured"}, {"pc": [3492], "errorMessage": "D-ASA terms not configured"}, {"pc": [6541], "errorMessage": "Defaulted"}, {"pc": [3120], "errorMessage": "Denomination asset is not properly set"}, {"pc": [3135], "errorMessage": "Different settlement asset not supported, must be equal to denomination asset"}, {"pc": [3370, 3377, 3379], "errorMessage": "IED must be set in the future"}, {"pc": [1256, 2008, 2479, 5914], "errorMessage": "IED not yet executed"}, {"pc": [2371, 5297], "errorMessage": "Insufficient remaining D-ASA units"}, {"pc": [2574, 2641], "errorMessage": "Insufficient sender units to transfer"}, {"pc": [1835, 3022, 3040, 3096, 3603, 3641, 5482, 5760, 5820, 6203], "errorMessage": "Invalid ACTUS configuration"}, {"pc": [1948, 2352, 2535, 2550, 2708, 2781, 2844, 2886, 5109, 5234], "errorMessage": "Invalid account holding address"}, {"pc": [4564, 4588, 4612, 4636, 4660, 4717, 4745, 4767, 4789, 4811, 4990, 5008, 5023, 5038, 5053], "errorMessage": "Invalid account role address"}, {"pc": [3082], "errorMessage": "Invalid day-count convention ID"}, {"pc": [1347, 3755, 4089, 5792], "errorMessage": "Invalid event cursor"}, {"pc": [3588, 3654, 3933, 5398], "errorMessage": "Invalid event id"}, {"pc": [3768, 4153, 4160], "errorMessage": "Invalid event type"}, {"pc": [4701, 4980, 6611], "errorMessage": "Invalid role identifier"}, {"pc": [3486, 3666, 3674, 3989, 5413, 5429], "errorMessage": "Invalid schedule page"}, {"pc": [5345], "errorMessage": "No D-ASA units"}, {"pc": [1353, 1864, 2045, 5801], "errorMessage": "No due cashflow to pay"}, {"pc": [5883], "errorMessage": "Not IED event"}, {"pc": [1993, 2326, 2522, 2698, 2754, 2764, 2850, 4188, 4834, 6533], "errorMessage": "Not authorized"}, {"pc": [1474, 1482, 2094, 2168, 2177], "errorMessage": "Not enough funds for the payment"}, {"pc": [3905, 3918], "errorMessage": "Observed event required to execute this action"}, {"pc": [2340, 2388], "errorMessage": "Primary distribution is closed"}, {"pc": [5832], "errorMessage": "Primary distribution is not complete"}, {"pc": [2563], "errorMessage": "Sender and receiver must be different"}, {"pc": [5095, 6549], "errorMessage": "Suspended operations"}, {"pc": [2275, 3631], "errorMessage": "Time events must be sorted in strictly ascending order"}, {"pc": [2496, 2513], "errorMessage": "Transfer is closed"}, {"pc": [2567], "errorMessage": "Transfer units must be greater than zero"}, {"pc": [988], "errorMessage": "Wrong Global Bytes allocation"}, {"pc": [994], "errorMessage": "Wrong Global UInts allocation"}, {"pc": [998], "errorMessage": "Wrong Local Bytes allocation"}, {"pc": [1002], "errorMessage": "Wrong Local UInts allocation"}, {"pc": [1455, 2087], "errorMessage": "account opted into asset"}, {"pc": [6493, 6508], "errorMessage": "check BoxMap entry exists"}, {"pc": [1984, 2022, 2063, 2101, 2392, 2570, 2630, 2656, 5089, 5255], "errorMessage": "check self.account entry exists"}, {"pc": [1536, 1762, 1847, 4283, 5919, 6222], "errorMessage": "check self.accrued_interest exists"}, {"pc": [4852, 6531], "errorMessage": "check self.arranger exists"}, {"pc": [6539], "errorMessage": "check self.asset_defaulted exists"}, {"pc": [6547], "errorMessage": "check self.asset_suspended exists"}, {"pc": [3030, 3475, 3901, 3913, 4231, 5644], "errorMessage": "check self.contract_type exists"}, {"pc": [1504, 4288, 5117, 5195], "errorMessage": "check self.cumulative_interest_index exists"}, {"pc": [1516, 4293, 5128, 5203], "errorMessage": "check self.cumulative_principal_index exists"}, {"pc": [5654], "errorMessage": "check self.dynamic_principal_redemption exists"}, {"pc": [1271, 1284, 1345, 1586, 2578, 2591, 3746, 4082, 4259, 4376, 4389, 4426, 5210, 5790, 5871, 6103, 6241], "errorMessage": "check self.event_cursor exists"}, {"pc": [5143, 5157, 5350, 5379, 5710, 5718, 5745, 5765, 5954, 6067, 6228], "errorMessage": "check self.fixed_point_scale exists"}, {"pc": [5997], "errorMessage": "check self.has_rate_reset_cap exists"}, {"pc": [5970], "errorMessage": "check self.has_rate_reset_floor exists"}, {"pc": [3107, 3491, 4255, 5888], "errorMessage": "check self.initial_exchange_amount exists"}, {"pc": [2376, 2386], "errorMessage": "check self.initial_exchange_date exists"}, {"pc": [1707, 4273, 5686, 5700], "errorMessage": "check self.interest_calculation_base exists"}, {"pc": [1778, 1793], "errorMessage": "check self.next_principal_redemption exists"}, {"pc": [4278, 5678, 5705, 5750], "errorMessage": "check self.nominal_interest_rate exists"}, {"pc": [1953, 1966], "errorMessage": "check self.op_daemon exists"}, {"pc": [1607, 1674, 1699, 1752, 1803, 1811, 1832, 4268, 6207, 6287], "errorMessage": "check self.outstanding_principal exists"}, {"pc": [6005, 6019], "errorMessage": "check self.rate_reset_cap exists"}, {"pc": [5978, 5992], "errorMessage": "check self.rate_reset_floor exists"}, {"pc": [5949], "errorMessage": "check self.rate_reset_multiplier exists"}, {"pc": [6321], "errorMessage": "check self.rate_reset_next exists"}, {"pc": [5962], "errorMessage": "check self.rate_reset_spread exists"}, {"pc": [1460, 2163, 4298], "errorMessage": "check self.reserved_interest exists"}, {"pc": [1465, 1494, 2173, 2188, 4303], "errorMessage": "check self.reserved_principal exists"}, {"pc": [2363, 2411, 4250, 5292, 5825], "errorMessage": "check self.reserved_units_total exists"}, {"pc": [1276, 2583, 3751, 3931, 3949, 4072, 4264, 4381, 5394, 6112], "errorMessage": "check self.schedule_entry_count exists"}, {"pc": [3979], "errorMessage": "check self.schedule_page entry exists"}, {"pc": [1452, 2053, 2081, 6393], "errorMessage": "check self.settlement_asset_id exists"}, {"pc": [1237, 1251, 1938, 2003, 2317, 2336, 2463, 2474, 2758, 3100, 3479, 3732, 3879, 4224, 4371, 5238, 5816, 5909], "errorMessage": "check self.status exists"}, {"pc": [2369, 2422, 4245, 5343, 5374, 5830], "errorMessage": "check self.total_units exists"}, {"pc": [2501, 2511], "errorMessage": "check self.transfer_closure_date exists"}, {"pc": [2484, 2492], "errorMessage": "check self.transfer_opening_date exists"}, {"pc": [3565, 3624], "errorMessage": "index access is out of bounds"}, {"pc": [1922, 2967, 3449, 3984], "errorMessage": "invalid array length header"}, {"pc": [2688, 3437, 4824], "errorMessage": "invalid number of bytes for arc4.bool"}, {"pc": [1930], "errorMessage": "invalid number of bytes for arc4.dynamic_array"}, {"pc": [3464], "errorMessage": "invalid number of bytes for arc4.dynamic_array"}, {"pc": [1916, 2301, 2441, 2449, 2680, 2738, 2746, 2826, 2834, 2877, 2902, 4445, 4469, 4503, 4684, 4866, 4950], "errorMessage": "invalid number of bytes for arc4.static_array"}, {"pc": [1232, 2259, 2268, 2309, 2458, 3427, 3864], "errorMessage": "invalid number of bytes for arc4.uint64"}, {"pc": [4493, 4674, 4940], "errorMessage": "invalid number of bytes for arc4.uint8"}, {"pc": [2939], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.InitialKernelState"}, {"pc": [2928], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.NormalizedActusTerms"}, {"pc": [3875], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.ObservedEventRequest"}, {"pc": [2972], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.Prospectus"}, {"pc": [4514], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.RoleValidity"}, {"pc": [2956], "errorMessage": "invalid tail pointer at index 1 of (uint8[32],(len+utf8[]))"}, {"pc": [2951], "errorMessage": "invalid tuple encoding"}, {"pc": [4051], "errorMessage": "max array length exceeded"}, {"pc": [4237, 6385], "errorMessage": "overflow"}]}, "clear": {"pcOffsetMethod": "none", "sourceInfo": []}}, "templateVariables": {}}""" +APP_SPEC = algokit_utils.Arc56Contract.from_json(_APP_SPEC_JSON) + +def _parse_abi_args(args: object | None = None) -> list[object] | None: + """Helper to parse ABI args into the format expected by underlying client""" + if args is None: + return None + + def convert_dataclass(value: object) -> object: + if dataclasses.is_dataclass(value): + return tuple(convert_dataclass(getattr(value, field.name)) for field in dataclasses.fields(value)) + elif isinstance(value, (list, tuple)): + return type(value)(convert_dataclass(item) for item in value) + return value + + match args: + case tuple(): + method_args = list(args) + case _ if dataclasses.is_dataclass(args): + method_args = [getattr(args, field.name) for field in dataclasses.fields(args)] + case _: + raise ValueError("Invalid 'args' type. Expected 'tuple' or 'TypedDict' for respective typed arguments.") + + return [ + convert_dataclass(arg) if not isinstance(arg, algokit_utils.AppMethodCallTransactionArgument) else arg + for arg in method_args + ] if method_args else None + +def _init_dataclass(cls: type, data: dict) -> object: + """ + Recursively instantiate a dataclass of type `cls` from `data`. + + For each field on the dataclass, if the field type is also a dataclass + and the corresponding data is a dict, instantiate that field recursively. + """ + field_values = {} + for field in dataclasses.fields(cls): + field_value = data.get(field.name) + # Check if the field expects another dataclass and the value is a dict. + if dataclasses.is_dataclass(field.type) and isinstance(field_value, dict): + field_values[field.name] = _init_dataclass(typing.cast(type, field.type), field_value) + else: + field_values[field.name] = field_value + return cls(**field_values) + +@dataclasses.dataclass(frozen=True) +class AccountPosition: + """Struct for AccountPosition""" + payment_address: str + units: int + reserved_units: int + suspended: bool + settled_cursor: int + interest_checkpoint: int + principal_checkpoint: int + claimable_interest: int + claimable_principal: int + +@dataclasses.dataclass(frozen=True) +class CashClaimResult: + """Struct for CashClaimResult""" + interest_amount: int + principal_amount: int + total_amount: int + timestamp: int + context: bytes + +@dataclasses.dataclass(frozen=True) +class CashFundingResult: + """Struct for CashFundingResult""" + funded_interest: int + funded_principal: int + total_funded: int + processed_events: int + timestamp: int + +@dataclasses.dataclass(frozen=True) +class ExecutionScheduleEntry: + """Struct for ExecutionScheduleEntry""" + event_id: int + event_type: int + scheduled_time: int + accrual_factor: int + redemption_accrual_factor: int + next_nominal_interest_rate: int + next_principal_redemption: int + next_outstanding_principal: int + flags: int + +@dataclasses.dataclass(frozen=True) +class InitialKernelState: + """Struct for InitialKernelState""" + status_date: int + event_cursor: int + outstanding_principal: int + interest_calculation_base: int + nominal_interest_rate: int + accrued_interest: int + next_principal_redemption: int + cumulative_interest_index: int + cumulative_principal_index: int + +@dataclasses.dataclass(frozen=True) +class KernelState: + """Struct for KernelState""" + contract_type: int + status: int + total_units: int + reserved_units_total: int + initial_exchange_amount: int + event_cursor: int + schedule_entry_count: int + outstanding_principal: int + interest_calculation_base: int + nominal_interest_rate: int + accrued_interest: int + cumulative_interest_index: int + cumulative_principal_index: int + reserved_interest: int + reserved_principal: int + +@dataclasses.dataclass(frozen=True) +class NormalizedActusTerms: + """Struct for NormalizedActusTerms""" + contract_type: int + denomination_asset_id: int + settlement_asset_id: int + total_units: int + notional_principal: int + initial_exchange_amount: int + initial_exchange_date: int + maturity_date: int + day_count_convention: int + rate_reset_spread: int + rate_reset_multiplier: int + rate_reset_floor: int + rate_reset_cap: int + rate_reset_next: int + has_rate_reset_floor: bool + has_rate_reset_cap: bool + dynamic_principal_redemption: bool + fixed_point_scale: int + +@dataclasses.dataclass(frozen=True) +class ObservedEventRequest: + """Struct for ObservedEventRequest""" + event_id: int + event_type: int + scheduled_time: int + accrual_factor: int + redemption_accrual_factor: int + observed_rate: int + next_nominal_interest_rate: int + next_principal_redemption: int + next_outstanding_principal: int + flags: int + +@dataclasses.dataclass(frozen=True) +class Prospectus: + """Struct for Prospectus""" + hash: bytes + url: str + +@dataclasses.dataclass(frozen=True) +class RoleValidity: + """Struct for RoleValidity""" + role_validity_start: int + role_validity_end: int + + +@dataclasses.dataclass(frozen=True, kw_only=True) +class FundDueCashflowsArgs: + """Dataclass for fund_due_cashflows arguments""" + max_event_count: int + + @property + def abi_method_signature(self) -> str: + return "fund_due_cashflows(uint64)(uint64,uint64,uint64,uint64,uint64)" + +@dataclasses.dataclass(frozen=True, kw_only=True) +class ClaimDueCashflowsArgs: + """Dataclass for claim_due_cashflows arguments""" + holding_address: str + payment_info: bytes | str + + @property + def abi_method_signature(self) -> str: + return "claim_due_cashflows(address,byte[])(uint64,uint64,uint64,uint64,byte[])" + +@dataclasses.dataclass(frozen=True, kw_only=True) +class SetTransferScheduleArgs: + """Dataclass for set_transfer_schedule arguments""" + open_date: int + closure_date: int + + @property + def abi_method_signature(self) -> str: + return "set_transfer_schedule(uint64,uint64)uint64" + +@dataclasses.dataclass(frozen=True, kw_only=True) +class PrimaryDistributionArgs: + """Dataclass for primary_distribution arguments""" + holding_address: str + units: int + + @property + def abi_method_signature(self) -> str: + return "primary_distribution(address,uint64)uint64" + +@dataclasses.dataclass(frozen=True, kw_only=True) +class TransferArgs: + """Dataclass for transfer arguments""" + sender_holding_address: str + receiver_holding_address: str + units: int + + @property + def abi_method_signature(self) -> str: + return "transfer(address,address,uint64)uint64" + +@dataclasses.dataclass(frozen=True, kw_only=True) +class AccountGovSuspensionArgs: + """Dataclass for account_gov_suspension arguments""" + holding_address: str + suspended: bool + + @property + def abi_method_signature(self) -> str: + return "account_gov_suspension(address,bool)uint64" + +@dataclasses.dataclass(frozen=True, kw_only=True) +class AccountOpenArgs: + """Dataclass for account_open arguments""" + holding_address: str + payment_address: str + + @property + def abi_method_signature(self) -> str: + return "account_open(address,address)uint64" + +@dataclasses.dataclass(frozen=True, kw_only=True) +class AccountUpdatePaymentAddressArgs: + """Dataclass for account_update_payment_address arguments""" + holding_address: str + payment_address: str + + @property + def abi_method_signature(self) -> str: + return "account_update_payment_address(address,address)uint64" + +@dataclasses.dataclass(frozen=True, kw_only=True) +class AccountGetPositionArgs: + """Dataclass for account_get_position arguments""" + holding_address: str + + @property + def abi_method_signature(self) -> str: + return "account_get_position(address)(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64)" + +@dataclasses.dataclass(frozen=True, kw_only=True) +class ContractConfigArgs: + """Dataclass for contract_config arguments""" + terms: NormalizedActusTerms + initial_state: InitialKernelState + prospectus: Prospectus + + @property + def abi_method_signature(self) -> str: + return "contract_config((uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64),(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64),(byte[32],string))uint64" + +@dataclasses.dataclass(frozen=True, kw_only=True) +class ContractScheduleArgs: + """Dataclass for contract_schedule arguments""" + schedule_page_index: int + is_last_page: bool + schedule_page: list[tuple[int, int, int, int, int, int, int, int, int]] + + @property + def abi_method_signature(self) -> str: + return "contract_schedule(uint64,bool,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[])uint64" + +@dataclasses.dataclass(frozen=True, kw_only=True) +class ApplyNonCashEventArgs: + """Dataclass for apply_non_cash_event arguments""" + event_id: int + payload: ObservedEventRequest + + @property + def abi_method_signature(self) -> str: + return "apply_non_cash_event(uint64,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64" + +@dataclasses.dataclass(frozen=True, kw_only=True) +class RbacRotateArrangerArgs: + """Dataclass for rbac_rotate_arranger arguments""" + new_arranger: str + + @property + def abi_method_signature(self) -> str: + return "rbac_rotate_arranger(address)uint64" + +@dataclasses.dataclass(frozen=True, kw_only=True) +class RbacSetOpDaemonArgs: + """Dataclass for rbac_set_op_daemon arguments""" + address: str + + @property + def abi_method_signature(self) -> str: + return "rbac_set_op_daemon(address)uint64" + +@dataclasses.dataclass(frozen=True, kw_only=True) +class RbacAssignRoleArgs: + """Dataclass for rbac_assign_role arguments""" + role_id: int + role_address: str + validity: RoleValidity + + @property + def abi_method_signature(self) -> str: + return "rbac_assign_role(uint8,address,(uint64,uint64))uint64" + +@dataclasses.dataclass(frozen=True, kw_only=True) +class RbacRevokeRoleArgs: + """Dataclass for rbac_revoke_role arguments""" + role_id: int + role_address: str + + @property + def abi_method_signature(self) -> str: + return "rbac_revoke_role(uint8,address)uint64" + +@dataclasses.dataclass(frozen=True, kw_only=True) +class RbacGovAssetSuspensionArgs: + """Dataclass for rbac_gov_asset_suspension arguments""" + suspended: bool + + @property + def abi_method_signature(self) -> str: + return "rbac_gov_asset_suspension(bool)uint64" + +@dataclasses.dataclass(frozen=True, kw_only=True) +class RbacGetAddressRolesArgs: + """Dataclass for rbac_get_address_roles arguments""" + address: str + + @property + def abi_method_signature(self) -> str: + return "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)" + +@dataclasses.dataclass(frozen=True, kw_only=True) +class RbacGetRoleValidityArgs: + """Dataclass for rbac_get_role_validity arguments""" + role_id: int + role_address: str + + @property + def abi_method_signature(self) -> str: + return "rbac_get_role_validity(uint8,address)(uint64,uint64)" + +@dataclasses.dataclass(frozen=True, kw_only=True) +class ContractCreateArgs: + """Dataclass for contract_create arguments""" + arranger: str + + @property + def abi_method_signature(self) -> str: + return "contract_create(address)uint64" + + +class _DasaUpdate: + def __init__(self, app_client: algokit_utils.AppClient): + self.app_client = app_client + + def contract_update( + self, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.AppUpdateMethodCallParams: + + params = params or algokit_utils.CommonAppCallParams() + compilation_params = compilation_params or algokit_utils.AppClientCompilationParams() + return self.app_client.params.update(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "contract_update()void", + })) + + +class DasaParams: + def __init__(self, app_client: algokit_utils.AppClient): + self.app_client = app_client + + @property + def update(self) -> "_DasaUpdate": + return _DasaUpdate(self.app_client) + + def fund_due_cashflows( + self, + args: tuple[int] | FundDueCashflowsArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.AppCallMethodCallParams: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "fund_due_cashflows(uint64)(uint64,uint64,uint64,uint64,uint64)", + "args": method_args, + })) + + def claim_due_cashflows( + self, + args: tuple[str, bytes | str] | ClaimDueCashflowsArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.AppCallMethodCallParams: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "claim_due_cashflows(address,byte[])(uint64,uint64,uint64,uint64,byte[])", + "args": method_args, + })) + + def set_transfer_schedule( + self, + args: tuple[int, int] | SetTransferScheduleArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.AppCallMethodCallParams: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "set_transfer_schedule(uint64,uint64)uint64", + "args": method_args, + })) + + def primary_distribution( + self, + args: tuple[str, int] | PrimaryDistributionArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.AppCallMethodCallParams: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "primary_distribution(address,uint64)uint64", + "args": method_args, + })) + + def transfer( + self, + args: tuple[str, str, int] | TransferArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.AppCallMethodCallParams: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "transfer(address,address,uint64)uint64", + "args": method_args, + })) + + def account_gov_suspension( + self, + args: tuple[str, bool] | AccountGovSuspensionArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.AppCallMethodCallParams: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "account_gov_suspension(address,bool)uint64", + "args": method_args, + })) + + def account_open( + self, + args: tuple[str, str] | AccountOpenArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.AppCallMethodCallParams: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "account_open(address,address)uint64", + "args": method_args, + })) + + def account_update_payment_address( + self, + args: tuple[str, str] | AccountUpdatePaymentAddressArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.AppCallMethodCallParams: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "account_update_payment_address(address,address)uint64", + "args": method_args, + })) + + def account_get_position( + self, + args: tuple[str] | AccountGetPositionArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.AppCallMethodCallParams: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "account_get_position(address)(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64)", + "args": method_args, + })) + + def contract_config( + self, + args: tuple[NormalizedActusTerms, InitialKernelState, Prospectus] | ContractConfigArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.AppCallMethodCallParams: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "contract_config((uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64),(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64),(byte[32],string))uint64", + "args": method_args, + })) + + def contract_schedule( + self, + args: tuple[int, bool, list[tuple[int, int, int, int, int, int, int, int, int]]] | ContractScheduleArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.AppCallMethodCallParams: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "contract_schedule(uint64,bool,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[])uint64", + "args": method_args, + })) + + def execute_ied( + self, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.AppCallMethodCallParams: + + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "execute_ied()uint64", + })) + + def apply_non_cash_event( + self, + args: tuple[int, ObservedEventRequest] | ApplyNonCashEventArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.AppCallMethodCallParams: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "apply_non_cash_event(uint64,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64", + "args": method_args, + })) + + def get_contract_state( + self, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.AppCallMethodCallParams: + + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "get_contract_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", + })) + + def get_next_due_event( + self, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.AppCallMethodCallParams: + + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", + })) + + def rbac_rotate_arranger( + self, + args: tuple[str] | RbacRotateArrangerArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.AppCallMethodCallParams: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_rotate_arranger(address)uint64", + "args": method_args, + })) + + def rbac_set_op_daemon( + self, + args: tuple[str] | RbacSetOpDaemonArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.AppCallMethodCallParams: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_set_op_daemon(address)uint64", + "args": method_args, + })) + + def rbac_assign_role( + self, + args: tuple[int, str, RoleValidity] | RbacAssignRoleArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.AppCallMethodCallParams: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_assign_role(uint8,address,(uint64,uint64))uint64", + "args": method_args, + })) + + def rbac_revoke_role( + self, + args: tuple[int, str] | RbacRevokeRoleArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.AppCallMethodCallParams: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_revoke_role(uint8,address)uint64", + "args": method_args, + })) + + def rbac_gov_asset_suspension( + self, + args: tuple[bool] | RbacGovAssetSuspensionArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.AppCallMethodCallParams: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_gov_asset_suspension(bool)uint64", + "args": method_args, + })) + + def rbac_get_arranger( + self, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.AppCallMethodCallParams: + + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_get_arranger()address", + })) + + def rbac_get_address_roles( + self, + args: tuple[str] | RbacGetAddressRolesArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.AppCallMethodCallParams: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", + "args": method_args, + })) + + def rbac_get_role_validity( + self, + args: tuple[int, str] | RbacGetRoleValidityArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.AppCallMethodCallParams: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_get_role_validity(uint8,address)(uint64,uint64)", + "args": method_args, + })) + + def contract_create( + self, + args: tuple[str] | ContractCreateArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.AppCallMethodCallParams: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "contract_create(address)uint64", + "args": method_args, + })) + + def clear_state( + self, + params: algokit_utils.AppClientBareCallParams | None = None, + + ) -> algokit_utils.AppCallParams: + return self.app_client.params.bare.clear_state( + params, + + ) + + +class _DasaUpdateTransaction: + def __init__(self, app_client: algokit_utils.AppClient): + self.app_client = app_client + + def contract_update( + self, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.BuiltTransactions: + + params = params or algokit_utils.CommonAppCallParams() + compilation_params = compilation_params or algokit_utils.AppClientCompilationParams() + return self.app_client.create_transaction.update(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "contract_update()void", + })) + + +class DasaCreateTransactionParams: + def __init__(self, app_client: algokit_utils.AppClient): + self.app_client = app_client + + @property + def update(self) -> "_DasaUpdateTransaction": + return _DasaUpdateTransaction(self.app_client) + + def fund_due_cashflows( + self, + args: tuple[int] | FundDueCashflowsArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.BuiltTransactions: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "fund_due_cashflows(uint64)(uint64,uint64,uint64,uint64,uint64)", + "args": method_args, + })) + + def claim_due_cashflows( + self, + args: tuple[str, bytes | str] | ClaimDueCashflowsArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.BuiltTransactions: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "claim_due_cashflows(address,byte[])(uint64,uint64,uint64,uint64,byte[])", + "args": method_args, + })) + + def set_transfer_schedule( + self, + args: tuple[int, int] | SetTransferScheduleArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.BuiltTransactions: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "set_transfer_schedule(uint64,uint64)uint64", + "args": method_args, + })) + + def primary_distribution( + self, + args: tuple[str, int] | PrimaryDistributionArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.BuiltTransactions: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "primary_distribution(address,uint64)uint64", + "args": method_args, + })) + + def transfer( + self, + args: tuple[str, str, int] | TransferArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.BuiltTransactions: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "transfer(address,address,uint64)uint64", + "args": method_args, + })) + + def account_gov_suspension( + self, + args: tuple[str, bool] | AccountGovSuspensionArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.BuiltTransactions: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "account_gov_suspension(address,bool)uint64", + "args": method_args, + })) + + def account_open( + self, + args: tuple[str, str] | AccountOpenArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.BuiltTransactions: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "account_open(address,address)uint64", + "args": method_args, + })) + + def account_update_payment_address( + self, + args: tuple[str, str] | AccountUpdatePaymentAddressArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.BuiltTransactions: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "account_update_payment_address(address,address)uint64", + "args": method_args, + })) + + def account_get_position( + self, + args: tuple[str] | AccountGetPositionArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.BuiltTransactions: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "account_get_position(address)(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64)", + "args": method_args, + })) + + def contract_config( + self, + args: tuple[NormalizedActusTerms, InitialKernelState, Prospectus] | ContractConfigArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.BuiltTransactions: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "contract_config((uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64),(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64),(byte[32],string))uint64", + "args": method_args, + })) + + def contract_schedule( + self, + args: tuple[int, bool, list[tuple[int, int, int, int, int, int, int, int, int]]] | ContractScheduleArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.BuiltTransactions: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "contract_schedule(uint64,bool,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[])uint64", + "args": method_args, + })) + + def execute_ied( + self, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.BuiltTransactions: + + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "execute_ied()uint64", + })) + + def apply_non_cash_event( + self, + args: tuple[int, ObservedEventRequest] | ApplyNonCashEventArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.BuiltTransactions: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "apply_non_cash_event(uint64,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64", + "args": method_args, + })) + + def get_contract_state( + self, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.BuiltTransactions: + + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "get_contract_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", + })) + + def get_next_due_event( + self, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.BuiltTransactions: + + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", + })) + + def rbac_rotate_arranger( + self, + args: tuple[str] | RbacRotateArrangerArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.BuiltTransactions: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_rotate_arranger(address)uint64", + "args": method_args, + })) + + def rbac_set_op_daemon( + self, + args: tuple[str] | RbacSetOpDaemonArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.BuiltTransactions: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_set_op_daemon(address)uint64", + "args": method_args, + })) + + def rbac_assign_role( + self, + args: tuple[int, str, RoleValidity] | RbacAssignRoleArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.BuiltTransactions: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_assign_role(uint8,address,(uint64,uint64))uint64", + "args": method_args, + })) + + def rbac_revoke_role( + self, + args: tuple[int, str] | RbacRevokeRoleArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.BuiltTransactions: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_revoke_role(uint8,address)uint64", + "args": method_args, + })) + + def rbac_gov_asset_suspension( + self, + args: tuple[bool] | RbacGovAssetSuspensionArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.BuiltTransactions: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_gov_asset_suspension(bool)uint64", + "args": method_args, + })) + + def rbac_get_arranger( + self, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.BuiltTransactions: + + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_get_arranger()address", + })) + + def rbac_get_address_roles( + self, + args: tuple[str] | RbacGetAddressRolesArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.BuiltTransactions: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", + "args": method_args, + })) + + def rbac_get_role_validity( + self, + args: tuple[int, str] | RbacGetRoleValidityArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.BuiltTransactions: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_get_role_validity(uint8,address)(uint64,uint64)", + "args": method_args, + })) + + def contract_create( + self, + args: tuple[str] | ContractCreateArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.BuiltTransactions: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "contract_create(address)uint64", + "args": method_args, + })) + + def clear_state( + self, + params: algokit_utils.AppClientBareCallParams | None = None, + + ) -> Transaction: + return self.app_client.create_transaction.bare.clear_state( + params, + + ) + + +class _DasaUpdateSend: + def __init__(self, app_client: algokit_utils.AppClient): + self.app_client = app_client + + def contract_update( + self, + params: algokit_utils.CommonAppCallParams | None = None, + send_params: algokit_utils.SendParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.SendAppTransactionResult[None]: + + params = params or algokit_utils.CommonAppCallParams() + compilation_params = compilation_params or algokit_utils.AppClientCompilationParams() + response = self.app_client.send.update(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "contract_update()void", + }), send_params=send_params, compilation_params=compilation_params) + parsed_response = response + return typing.cast(algokit_utils.SendAppUpdateTransactionResult[None], parsed_response) + + +class DasaSend: + def __init__(self, app_client: algokit_utils.AppClient): + self.app_client = app_client + + @property + def update(self) -> "_DasaUpdateSend": + return _DasaUpdateSend(self.app_client) + + def fund_due_cashflows( + self, + args: tuple[int] | FundDueCashflowsArgs, + params: algokit_utils.CommonAppCallParams | None = None, + send_params: algokit_utils.SendParams | None = None + ) -> algokit_utils.SendAppTransactionResult[CashFundingResult]: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "fund_due_cashflows(uint64)(uint64,uint64,uint64,uint64,uint64)", + "args": method_args, + }), send_params=send_params) + parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(CashFundingResult, typing.cast(dict, response.abi_return))) # type: ignore + return typing.cast(algokit_utils.SendAppTransactionResult[CashFundingResult], parsed_response) + + def claim_due_cashflows( + self, + args: tuple[str, bytes | str] | ClaimDueCashflowsArgs, + params: algokit_utils.CommonAppCallParams | None = None, + send_params: algokit_utils.SendParams | None = None + ) -> algokit_utils.SendAppTransactionResult[CashClaimResult]: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "claim_due_cashflows(address,byte[])(uint64,uint64,uint64,uint64,byte[])", + "args": method_args, + }), send_params=send_params) + parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(CashClaimResult, typing.cast(dict, response.abi_return))) # type: ignore + return typing.cast(algokit_utils.SendAppTransactionResult[CashClaimResult], parsed_response) + + def set_transfer_schedule( + self, + args: tuple[int, int] | SetTransferScheduleArgs, + params: algokit_utils.CommonAppCallParams | None = None, + send_params: algokit_utils.SendParams | None = None + ) -> algokit_utils.SendAppTransactionResult[int]: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "set_transfer_schedule(uint64,uint64)uint64", + "args": method_args, + }), send_params=send_params) + parsed_response = response + return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) + + def primary_distribution( + self, + args: tuple[str, int] | PrimaryDistributionArgs, + params: algokit_utils.CommonAppCallParams | None = None, + send_params: algokit_utils.SendParams | None = None + ) -> algokit_utils.SendAppTransactionResult[int]: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "primary_distribution(address,uint64)uint64", + "args": method_args, + }), send_params=send_params) + parsed_response = response + return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) + + def transfer( + self, + args: tuple[str, str, int] | TransferArgs, + params: algokit_utils.CommonAppCallParams | None = None, + send_params: algokit_utils.SendParams | None = None + ) -> algokit_utils.SendAppTransactionResult[int]: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "transfer(address,address,uint64)uint64", + "args": method_args, + }), send_params=send_params) + parsed_response = response + return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) + + def account_gov_suspension( + self, + args: tuple[str, bool] | AccountGovSuspensionArgs, + params: algokit_utils.CommonAppCallParams | None = None, + send_params: algokit_utils.SendParams | None = None + ) -> algokit_utils.SendAppTransactionResult[int]: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "account_gov_suspension(address,bool)uint64", + "args": method_args, + }), send_params=send_params) + parsed_response = response + return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) + + def account_open( + self, + args: tuple[str, str] | AccountOpenArgs, + params: algokit_utils.CommonAppCallParams | None = None, + send_params: algokit_utils.SendParams | None = None + ) -> algokit_utils.SendAppTransactionResult[int]: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "account_open(address,address)uint64", + "args": method_args, + }), send_params=send_params) + parsed_response = response + return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) + + def account_update_payment_address( + self, + args: tuple[str, str] | AccountUpdatePaymentAddressArgs, + params: algokit_utils.CommonAppCallParams | None = None, + send_params: algokit_utils.SendParams | None = None + ) -> algokit_utils.SendAppTransactionResult[int]: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "account_update_payment_address(address,address)uint64", + "args": method_args, + }), send_params=send_params) + parsed_response = response + return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) + + def account_get_position( + self, + args: tuple[str] | AccountGetPositionArgs, + params: algokit_utils.CommonAppCallParams | None = None, + send_params: algokit_utils.SendParams | None = None + ) -> algokit_utils.SendAppTransactionResult[AccountPosition]: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "account_get_position(address)(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64)", + "args": method_args, + }), send_params=send_params) + parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(AccountPosition, typing.cast(dict, response.abi_return))) # type: ignore + return typing.cast(algokit_utils.SendAppTransactionResult[AccountPosition], parsed_response) + + def contract_config( + self, + args: tuple[NormalizedActusTerms, InitialKernelState, Prospectus] | ContractConfigArgs, + params: algokit_utils.CommonAppCallParams | None = None, + send_params: algokit_utils.SendParams | None = None + ) -> algokit_utils.SendAppTransactionResult[int]: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "contract_config((uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64),(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64),(byte[32],string))uint64", + "args": method_args, + }), send_params=send_params) + parsed_response = response + return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) + + def contract_schedule( + self, + args: tuple[int, bool, list[tuple[int, int, int, int, int, int, int, int, int]]] | ContractScheduleArgs, + params: algokit_utils.CommonAppCallParams | None = None, + send_params: algokit_utils.SendParams | None = None + ) -> algokit_utils.SendAppTransactionResult[int]: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "contract_schedule(uint64,bool,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[])uint64", + "args": method_args, + }), send_params=send_params) + parsed_response = response + return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) + + def execute_ied( + self, + params: algokit_utils.CommonAppCallParams | None = None, + send_params: algokit_utils.SendParams | None = None + ) -> algokit_utils.SendAppTransactionResult[int]: + + params = params or algokit_utils.CommonAppCallParams() + response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "execute_ied()uint64", + }), send_params=send_params) + parsed_response = response + return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) + + def apply_non_cash_event( + self, + args: tuple[int, ObservedEventRequest] | ApplyNonCashEventArgs, + params: algokit_utils.CommonAppCallParams | None = None, + send_params: algokit_utils.SendParams | None = None + ) -> algokit_utils.SendAppTransactionResult[int]: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "apply_non_cash_event(uint64,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64", + "args": method_args, + }), send_params=send_params) + parsed_response = response + return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) + + def get_contract_state( + self, + params: algokit_utils.CommonAppCallParams | None = None, + send_params: algokit_utils.SendParams | None = None + ) -> algokit_utils.SendAppTransactionResult[KernelState]: + + params = params or algokit_utils.CommonAppCallParams() + response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "get_contract_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", + }), send_params=send_params) + parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(KernelState, typing.cast(dict, response.abi_return))) # type: ignore + return typing.cast(algokit_utils.SendAppTransactionResult[KernelState], parsed_response) + + def get_next_due_event( + self, + params: algokit_utils.CommonAppCallParams | None = None, + send_params: algokit_utils.SendParams | None = None + ) -> algokit_utils.SendAppTransactionResult[ExecutionScheduleEntry]: + + params = params or algokit_utils.CommonAppCallParams() + response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", + }), send_params=send_params) + parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(ExecutionScheduleEntry, typing.cast(dict, response.abi_return))) # type: ignore + return typing.cast(algokit_utils.SendAppTransactionResult[ExecutionScheduleEntry], parsed_response) + + def rbac_rotate_arranger( + self, + args: tuple[str] | RbacRotateArrangerArgs, + params: algokit_utils.CommonAppCallParams | None = None, + send_params: algokit_utils.SendParams | None = None + ) -> algokit_utils.SendAppTransactionResult[int]: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_rotate_arranger(address)uint64", + "args": method_args, + }), send_params=send_params) + parsed_response = response + return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) + + def rbac_set_op_daemon( + self, + args: tuple[str] | RbacSetOpDaemonArgs, + params: algokit_utils.CommonAppCallParams | None = None, + send_params: algokit_utils.SendParams | None = None + ) -> algokit_utils.SendAppTransactionResult[int]: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_set_op_daemon(address)uint64", + "args": method_args, + }), send_params=send_params) + parsed_response = response + return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) + + def rbac_assign_role( + self, + args: tuple[int, str, RoleValidity] | RbacAssignRoleArgs, + params: algokit_utils.CommonAppCallParams | None = None, + send_params: algokit_utils.SendParams | None = None + ) -> algokit_utils.SendAppTransactionResult[int]: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_assign_role(uint8,address,(uint64,uint64))uint64", + "args": method_args, + }), send_params=send_params) + parsed_response = response + return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) + + def rbac_revoke_role( + self, + args: tuple[int, str] | RbacRevokeRoleArgs, + params: algokit_utils.CommonAppCallParams | None = None, + send_params: algokit_utils.SendParams | None = None + ) -> algokit_utils.SendAppTransactionResult[int]: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_revoke_role(uint8,address)uint64", + "args": method_args, + }), send_params=send_params) + parsed_response = response + return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) + + def rbac_gov_asset_suspension( + self, + args: tuple[bool] | RbacGovAssetSuspensionArgs, + params: algokit_utils.CommonAppCallParams | None = None, + send_params: algokit_utils.SendParams | None = None + ) -> algokit_utils.SendAppTransactionResult[int]: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_gov_asset_suspension(bool)uint64", + "args": method_args, + }), send_params=send_params) + parsed_response = response + return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) + + def rbac_get_arranger( + self, + params: algokit_utils.CommonAppCallParams | None = None, + send_params: algokit_utils.SendParams | None = None + ) -> algokit_utils.SendAppTransactionResult[str]: + + params = params or algokit_utils.CommonAppCallParams() + response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_get_arranger()address", + }), send_params=send_params) + parsed_response = response + return typing.cast(algokit_utils.SendAppTransactionResult[str], parsed_response) + + def rbac_get_address_roles( + self, + args: tuple[str] | RbacGetAddressRolesArgs, + params: algokit_utils.CommonAppCallParams | None = None, + send_params: algokit_utils.SendParams | None = None + ) -> algokit_utils.SendAppTransactionResult[tuple[bool, bool, bool, bool, bool]]: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", + "args": method_args, + }), send_params=send_params) + parsed_response = response + return typing.cast(algokit_utils.SendAppTransactionResult[tuple[bool, bool, bool, bool, bool]], parsed_response) + + def rbac_get_role_validity( + self, + args: tuple[int, str] | RbacGetRoleValidityArgs, + params: algokit_utils.CommonAppCallParams | None = None, + send_params: algokit_utils.SendParams | None = None + ) -> algokit_utils.SendAppTransactionResult[RoleValidity]: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_get_role_validity(uint8,address)(uint64,uint64)", + "args": method_args, + }), send_params=send_params) + parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(RoleValidity, typing.cast(dict, response.abi_return))) # type: ignore + return typing.cast(algokit_utils.SendAppTransactionResult[RoleValidity], parsed_response) + + def contract_create( + self, + args: tuple[str] | ContractCreateArgs, + params: algokit_utils.CommonAppCallParams | None = None, + send_params: algokit_utils.SendParams | None = None + ) -> algokit_utils.SendAppTransactionResult[int]: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "contract_create(address)uint64", + "args": method_args, + }), send_params=send_params) + parsed_response = response + return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) + + def clear_state( + self, + params: algokit_utils.AppClientBareCallParams | None = None, + send_params: algokit_utils.SendParams | None = None + ) -> algokit_utils.SendAppTransactionResult[algokit_utils.ABIReturn]: + return self.app_client.send.bare.clear_state( + params, + send_params=send_params, + ) + + +class GlobalStateValue(typing.TypedDict): + """Shape of global_state state key values""" + arranger: str + op_daemon: str + asset_suspended: int + asset_defaulted: int + status: int + contract_type: int + prospectus_hash: bytes + prospectus_url: str + denomination_asset_id: int + settlement_asset_id: int + initial_exchange_date: int + maturity_date: int + transfer_opening_date: int + transfer_closure_date: int + day_count_convention: int + total_units: int + reserved_units_total: int + initial_exchange_amount: int + outstanding_principal: int + next_principal_redemption: int + dynamic_principal_redemption: int + interest_calculation_base: int + accrued_interest: int + nominal_interest_rate: int + rate_reset_spread: int + rate_reset_multiplier: int + rate_reset_floor: int + rate_reset_cap: int + rate_reset_next: int + has_rate_reset_floor: int + has_rate_reset_cap: int + reserved_principal: int + reserved_interest: int + cumulative_interest_index: int + cumulative_principal_index: int + event_cursor: int + schedule_entry_count: int + fixed_point_scale: int + +class DasaState: + """Methods to access state for the current DASA app""" + + def __init__(self, app_client: algokit_utils.AppClient): + self.app_client = app_client + + @property + def global_state( + self + ) -> "_GlobalState": + """Methods to access global_state for the current app""" + return _GlobalState(self.app_client) + + @property + def box( + self + ) -> "_BoxState": + """Methods to access box for the current app""" + return _BoxState(self.app_client) + +class _GlobalState: + def __init__(self, app_client: algokit_utils.AppClient): + self.app_client = app_client + + # Pre-generated mapping of value types to their struct classes + self._struct_classes: dict[str, typing.Type[typing.Any]] = {} + + def get_all(self) -> GlobalStateValue: + """Get all current keyed values from global_state state""" + result = self.app_client.state.global_state.get_all() + if not result: + return typing.cast(GlobalStateValue, {}) + + converted = {} + for key, value in result.items(): + key_info = self.app_client.app_spec.state.keys.global_state.get(key) + struct_class = self._struct_classes.get(key_info.value_type) if key_info else None + converted[key] = ( + _init_dataclass(struct_class, value) if struct_class and isinstance(value, dict) + else value + ) + return typing.cast(GlobalStateValue, converted) + + @property + def arranger(self) -> str: + """Get the current value of the arranger key in global_state state""" + value = self.app_client.state.global_state.get_value("arranger") + if isinstance(value, dict) and "address" in self._struct_classes: + return _init_dataclass(self._struct_classes["address"], value) # type: ignore + return typing.cast(str, value) + + @property + def op_daemon(self) -> str: + """Get the current value of the op_daemon key in global_state state""" + value = self.app_client.state.global_state.get_value("op_daemon") + if isinstance(value, dict) and "address" in self._struct_classes: + return _init_dataclass(self._struct_classes["address"], value) # type: ignore + return typing.cast(str, value) + + @property + def asset_suspended(self) -> int: + """Get the current value of the asset_suspended key in global_state state""" + value = self.app_client.state.global_state.get_value("asset_suspended") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore + return typing.cast(int, value) + + @property + def asset_defaulted(self) -> int: + """Get the current value of the asset_defaulted key in global_state state""" + value = self.app_client.state.global_state.get_value("asset_defaulted") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore + return typing.cast(int, value) + + @property + def status(self) -> int: + """Get the current value of the status key in global_state state""" + value = self.app_client.state.global_state.get_value("status") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore + return typing.cast(int, value) + + @property + def contract_type(self) -> int: + """Get the current value of the contract_type key in global_state state""" + value = self.app_client.state.global_state.get_value("contract_type") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore + return typing.cast(int, value) + + @property + def prospectus_hash(self) -> bytes: + """Get the current value of the prospectus_hash key in global_state state""" + value = self.app_client.state.global_state.get_value("prospectus_hash") + if isinstance(value, dict) and "AVMBytes" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMBytes"], value) # type: ignore + return typing.cast(bytes, value) + + @property + def prospectus_url(self) -> str: + """Get the current value of the prospectus_url key in global_state state""" + value = self.app_client.state.global_state.get_value("prospectus_url") + if isinstance(value, dict) and "AVMString" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMString"], value) # type: ignore + return typing.cast(str, value) + + @property + def denomination_asset_id(self) -> int: + """Get the current value of the denomination_asset_id key in global_state state""" + value = self.app_client.state.global_state.get_value("denomination_asset_id") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore + return typing.cast(int, value) + + @property + def settlement_asset_id(self) -> int: + """Get the current value of the settlement_asset_id key in global_state state""" + value = self.app_client.state.global_state.get_value("settlement_asset_id") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore + return typing.cast(int, value) + + @property + def initial_exchange_date(self) -> int: + """Get the current value of the initial_exchange_date key in global_state state""" + value = self.app_client.state.global_state.get_value("initial_exchange_date") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore + return typing.cast(int, value) + + @property + def maturity_date(self) -> int: + """Get the current value of the maturity_date key in global_state state""" + value = self.app_client.state.global_state.get_value("maturity_date") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore + return typing.cast(int, value) + + @property + def transfer_opening_date(self) -> int: + """Get the current value of the transfer_opening_date key in global_state state""" + value = self.app_client.state.global_state.get_value("transfer_opening_date") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore + return typing.cast(int, value) + + @property + def transfer_closure_date(self) -> int: + """Get the current value of the transfer_closure_date key in global_state state""" + value = self.app_client.state.global_state.get_value("transfer_closure_date") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore + return typing.cast(int, value) + + @property + def day_count_convention(self) -> int: + """Get the current value of the day_count_convention key in global_state state""" + value = self.app_client.state.global_state.get_value("day_count_convention") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore + return typing.cast(int, value) + + @property + def total_units(self) -> int: + """Get the current value of the total_units key in global_state state""" + value = self.app_client.state.global_state.get_value("total_units") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore + return typing.cast(int, value) + + @property + def reserved_units_total(self) -> int: + """Get the current value of the reserved_units_total key in global_state state""" + value = self.app_client.state.global_state.get_value("reserved_units_total") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore + return typing.cast(int, value) + + @property + def initial_exchange_amount(self) -> int: + """Get the current value of the initial_exchange_amount key in global_state state""" + value = self.app_client.state.global_state.get_value("initial_exchange_amount") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore + return typing.cast(int, value) + + @property + def outstanding_principal(self) -> int: + """Get the current value of the outstanding_principal key in global_state state""" + value = self.app_client.state.global_state.get_value("outstanding_principal") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore + return typing.cast(int, value) + + @property + def next_principal_redemption(self) -> int: + """Get the current value of the next_principal_redemption key in global_state state""" + value = self.app_client.state.global_state.get_value("next_principal_redemption") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore + return typing.cast(int, value) + + @property + def dynamic_principal_redemption(self) -> int: + """Get the current value of the dynamic_principal_redemption key in global_state state""" + value = self.app_client.state.global_state.get_value("dynamic_principal_redemption") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore + return typing.cast(int, value) + + @property + def interest_calculation_base(self) -> int: + """Get the current value of the interest_calculation_base key in global_state state""" + value = self.app_client.state.global_state.get_value("interest_calculation_base") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore + return typing.cast(int, value) + + @property + def accrued_interest(self) -> int: + """Get the current value of the accrued_interest key in global_state state""" + value = self.app_client.state.global_state.get_value("accrued_interest") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore + return typing.cast(int, value) + + @property + def nominal_interest_rate(self) -> int: + """Get the current value of the nominal_interest_rate key in global_state state""" + value = self.app_client.state.global_state.get_value("nominal_interest_rate") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore + return typing.cast(int, value) + + @property + def rate_reset_spread(self) -> int: + """Get the current value of the rate_reset_spread key in global_state state""" + value = self.app_client.state.global_state.get_value("rate_reset_spread") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore + return typing.cast(int, value) + + @property + def rate_reset_multiplier(self) -> int: + """Get the current value of the rate_reset_multiplier key in global_state state""" + value = self.app_client.state.global_state.get_value("rate_reset_multiplier") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore + return typing.cast(int, value) + + @property + def rate_reset_floor(self) -> int: + """Get the current value of the rate_reset_floor key in global_state state""" + value = self.app_client.state.global_state.get_value("rate_reset_floor") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore + return typing.cast(int, value) + + @property + def rate_reset_cap(self) -> int: + """Get the current value of the rate_reset_cap key in global_state state""" + value = self.app_client.state.global_state.get_value("rate_reset_cap") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore + return typing.cast(int, value) + + @property + def rate_reset_next(self) -> int: + """Get the current value of the rate_reset_next key in global_state state""" + value = self.app_client.state.global_state.get_value("rate_reset_next") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore + return typing.cast(int, value) + + @property + def has_rate_reset_floor(self) -> int: + """Get the current value of the has_rate_reset_floor key in global_state state""" + value = self.app_client.state.global_state.get_value("has_rate_reset_floor") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore + return typing.cast(int, value) + + @property + def has_rate_reset_cap(self) -> int: + """Get the current value of the has_rate_reset_cap key in global_state state""" + value = self.app_client.state.global_state.get_value("has_rate_reset_cap") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore + return typing.cast(int, value) + + @property + def reserved_principal(self) -> int: + """Get the current value of the reserved_principal key in global_state state""" + value = self.app_client.state.global_state.get_value("reserved_principal") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore + return typing.cast(int, value) + + @property + def reserved_interest(self) -> int: + """Get the current value of the reserved_interest key in global_state state""" + value = self.app_client.state.global_state.get_value("reserved_interest") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore + return typing.cast(int, value) + + @property + def cumulative_interest_index(self) -> int: + """Get the current value of the cumulative_interest_index key in global_state state""" + value = self.app_client.state.global_state.get_value("cumulative_interest_index") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore + return typing.cast(int, value) + + @property + def cumulative_principal_index(self) -> int: + """Get the current value of the cumulative_principal_index key in global_state state""" + value = self.app_client.state.global_state.get_value("cumulative_principal_index") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore + return typing.cast(int, value) + + @property + def event_cursor(self) -> int: + """Get the current value of the event_cursor key in global_state state""" + value = self.app_client.state.global_state.get_value("event_cursor") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore + return typing.cast(int, value) + + @property + def schedule_entry_count(self) -> int: + """Get the current value of the schedule_entry_count key in global_state state""" + value = self.app_client.state.global_state.get_value("schedule_entry_count") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore + return typing.cast(int, value) + + @property + def fixed_point_scale(self) -> int: + """Get the current value of the fixed_point_scale key in global_state state""" + value = self.app_client.state.global_state.get_value("fixed_point_scale") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore + return typing.cast(int, value) + +class _BoxState: + def __init__(self, app_client: algokit_utils.AppClient): + self.app_client = app_client + + # Pre-generated mapping of value types to their struct classes + self._struct_classes: dict[str, typing.Type[typing.Any]] = { + "RoleValidity": RoleValidity, + "AccountPosition": AccountPosition + } + + def get_all(self) -> dict[str, typing.Any]: + """Get all current keyed values from box state""" + result = self.app_client.state.box.get_all() + if not result: + return {} + + converted = {} + for key, value in result.items(): + key_info = self.app_client.app_spec.state.keys.box.get(key) + struct_class = self._struct_classes.get(key_info.value_type) if key_info else None + converted[key] = ( + _init_dataclass(struct_class, value) if struct_class and isinstance(value, dict) + else value + ) + return converted + + @property + def account_manager(self) -> "_MapState[str, RoleValidity]": + """Get values from the account_manager map in box state""" + return _MapState( + self.app_client.state.box, + "account_manager", + self._struct_classes.get("RoleValidity") + ) + + @property + def primary_dealer(self) -> "_MapState[str, RoleValidity]": + """Get values from the primary_dealer map in box state""" + return _MapState( + self.app_client.state.box, + "primary_dealer", + self._struct_classes.get("RoleValidity") + ) + + @property + def trustee(self) -> "_MapState[str, RoleValidity]": + """Get values from the trustee map in box state""" + return _MapState( + self.app_client.state.box, + "trustee", + self._struct_classes.get("RoleValidity") + ) + + @property + def authority(self) -> "_MapState[str, RoleValidity]": + """Get values from the authority map in box state""" + return _MapState( + self.app_client.state.box, + "authority", + self._struct_classes.get("RoleValidity") + ) + + @property + def observer(self) -> "_MapState[str, RoleValidity]": + """Get values from the observer map in box state""" + return _MapState( + self.app_client.state.box, + "observer", + self._struct_classes.get("RoleValidity") + ) + + @property + def schedule_page(self) -> "_MapState[int, list[tuple[int, int, int, int, int, int, int, int, int]]]": + """Get values from the schedule_page map in box state""" + return _MapState( + self.app_client.state.box, + "schedule_page", + None + ) + + @property + def account(self) -> "_MapState[str, AccountPosition]": + """Get values from the account map in box state""" + return _MapState( + self.app_client.state.box, + "account", + self._struct_classes.get("AccountPosition") + ) + +_KeyType = typing.TypeVar("_KeyType") +_ValueType = typing.TypeVar("_ValueType") + +class _AppClientStateMethodsProtocol(typing.Protocol): + def get_map(self, map_name: str) -> dict[typing.Any, typing.Any]: + ... + def get_map_value(self, map_name: str, key: typing.Any) -> typing.Any | None: + ... + +class _MapState(typing.Generic[_KeyType, _ValueType]): + """Generic class for accessing state maps with strongly typed keys and values""" + + def __init__(self, state_accessor: _AppClientStateMethodsProtocol, map_name: str, + struct_class: typing.Type[_ValueType] | None = None): + self._state_accessor = state_accessor + self._map_name = map_name + self._struct_class = struct_class + + def get_map(self) -> dict[_KeyType, _ValueType]: + """Get all current values in the map""" + result = self._state_accessor.get_map(self._map_name) + if self._struct_class and result: + return {k: _init_dataclass(self._struct_class, v) if isinstance(v, dict) else v + for k, v in result.items()} # type: ignore + return typing.cast(dict[_KeyType, _ValueType], result or {}) + + def get_value(self, key: _KeyType) -> _ValueType | None: + """Get a value from the map by key""" + key_value = dataclasses.asdict(key) if dataclasses.is_dataclass(key) else key # type: ignore + value = self._state_accessor.get_map_value(self._map_name, key_value) + if value is not None and self._struct_class and isinstance(value, dict): + return _init_dataclass(self._struct_class, value) # type: ignore + return typing.cast(_ValueType | None, value) + + +class DasaClient: + """Client for interacting with DASA smart contract""" + + @typing.overload + def __init__(self, app_client: algokit_utils.AppClient) -> None: ... + + @typing.overload + def __init__( + self, + *, + algorand: _AlgoKitAlgorandClient, + app_id: int, + app_name: str | None = None, + default_sender: str | None = None, + default_signer: TransactionSigner | None = None, + approval_source_map: SourceMap | None = None, + clear_source_map: SourceMap | None = None, + ) -> None: ... + + def __init__( + self, + app_client: algokit_utils.AppClient | None = None, + *, + algorand: _AlgoKitAlgorandClient | None = None, + app_id: int | None = None, + app_name: str | None = None, + default_sender: str | None = None, + default_signer: TransactionSigner | None = None, + approval_source_map: SourceMap | None = None, + clear_source_map: SourceMap | None = None, + ) -> None: + if app_client: + self.app_client = app_client + elif algorand and app_id: + self.app_client = algokit_utils.AppClient( + algokit_utils.AppClientParams( + algorand=algorand, + app_spec=APP_SPEC, + app_id=app_id, + app_name=app_name, + default_sender=default_sender, + default_signer=default_signer, + approval_source_map=approval_source_map, + clear_source_map=clear_source_map, + ) + ) + else: + raise ValueError("Either app_client or algorand and app_id must be provided") + + self.params = DasaParams(self.app_client) + self.create_transaction = DasaCreateTransactionParams(self.app_client) + self.send = DasaSend(self.app_client) + self.state = DasaState(self.app_client) + + @staticmethod + def from_creator_and_name( + creator_address: str, + app_name: str, + algorand: _AlgoKitAlgorandClient, + default_sender: str | None = None, + default_signer: TransactionSigner | None = None, + approval_source_map: SourceMap | None = None, + clear_source_map: SourceMap | None = None, + ignore_cache: bool | None = None, + app_lookup_cache: algokit_utils.ApplicationLookup | None = None, + ) -> "DasaClient": + return DasaClient( + algokit_utils.AppClient.from_creator_and_name( + creator_address=creator_address, + app_name=app_name, + app_spec=APP_SPEC, + algorand=algorand, + default_sender=default_sender, + default_signer=default_signer, + approval_source_map=approval_source_map, + clear_source_map=clear_source_map, + ignore_cache=ignore_cache, + app_lookup_cache=app_lookup_cache, + ) + ) + + @staticmethod + def from_network( + algorand: _AlgoKitAlgorandClient, + app_name: str | None = None, + default_sender: str | None = None, + default_signer: TransactionSigner | None = None, + approval_source_map: SourceMap | None = None, + clear_source_map: SourceMap | None = None, + ) -> "DasaClient": + return DasaClient( + algokit_utils.AppClient.from_network( + app_spec=APP_SPEC, + algorand=algorand, + app_name=app_name, + default_sender=default_sender, + default_signer=default_signer, + approval_source_map=approval_source_map, + clear_source_map=clear_source_map, + ) + ) + + @property + def app_id(self) -> int: + return self.app_client.app_id + + @property + def app_address(self) -> str: + return self.app_client.app_address + + @property + def app_name(self) -> str: + return self.app_client.app_name + + @property + def app_spec(self) -> algokit_utils.Arc56Contract: + return self.app_client.app_spec + + @property + def algorand(self) -> _AlgoKitAlgorandClient: + return self.app_client.algorand + + def clone( + self, + app_name: str | None = None, + default_sender: str | None = None, + default_signer: TransactionSigner | None = None, + approval_source_map: SourceMap | None = None, + clear_source_map: SourceMap | None = None, + ) -> "DasaClient": + return DasaClient( + self.app_client.clone( + app_name=app_name, + default_sender=default_sender, + default_signer=default_signer, + approval_source_map=approval_source_map, + clear_source_map=clear_source_map, + ) + ) + + def new_group(self) -> "DasaComposer": + return DasaComposer(self) + + @typing.overload + def decode_return_value( + self, + method: typing.Literal["fund_due_cashflows(uint64)(uint64,uint64,uint64,uint64,uint64)"], + return_value: algokit_utils.ABIReturn | None + ) -> CashFundingResult | None: ... + @typing.overload + def decode_return_value( + self, + method: typing.Literal["claim_due_cashflows(address,byte[])(uint64,uint64,uint64,uint64,byte[])"], + return_value: algokit_utils.ABIReturn | None + ) -> CashClaimResult | None: ... + @typing.overload + def decode_return_value( + self, + method: typing.Literal["set_transfer_schedule(uint64,uint64)uint64"], + return_value: algokit_utils.ABIReturn | None + ) -> int | None: ... + @typing.overload + def decode_return_value( + self, + method: typing.Literal["primary_distribution(address,uint64)uint64"], + return_value: algokit_utils.ABIReturn | None + ) -> int | None: ... + @typing.overload + def decode_return_value( + self, + method: typing.Literal["transfer(address,address,uint64)uint64"], + return_value: algokit_utils.ABIReturn | None + ) -> int | None: ... + @typing.overload + def decode_return_value( + self, + method: typing.Literal["account_gov_suspension(address,bool)uint64"], + return_value: algokit_utils.ABIReturn | None + ) -> int | None: ... + @typing.overload + def decode_return_value( + self, + method: typing.Literal["account_open(address,address)uint64"], + return_value: algokit_utils.ABIReturn | None + ) -> int | None: ... + @typing.overload + def decode_return_value( + self, + method: typing.Literal["account_update_payment_address(address,address)uint64"], + return_value: algokit_utils.ABIReturn | None + ) -> int | None: ... + @typing.overload + def decode_return_value( + self, + method: typing.Literal["account_get_position(address)(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64)"], + return_value: algokit_utils.ABIReturn | None + ) -> AccountPosition | None: ... + @typing.overload + def decode_return_value( + self, + method: typing.Literal["contract_config((uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64),(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64),(byte[32],string))uint64"], + return_value: algokit_utils.ABIReturn | None + ) -> int | None: ... + @typing.overload + def decode_return_value( + self, + method: typing.Literal["contract_schedule(uint64,bool,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[])uint64"], + return_value: algokit_utils.ABIReturn | None + ) -> int | None: ... + @typing.overload + def decode_return_value( + self, + method: typing.Literal["execute_ied()uint64"], + return_value: algokit_utils.ABIReturn | None + ) -> int | None: ... + @typing.overload + def decode_return_value( + self, + method: typing.Literal["apply_non_cash_event(uint64,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64"], + return_value: algokit_utils.ABIReturn | None + ) -> int | None: ... + @typing.overload + def decode_return_value( + self, + method: typing.Literal["get_contract_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)"], + return_value: algokit_utils.ABIReturn | None + ) -> KernelState | None: ... + @typing.overload + def decode_return_value( + self, + method: typing.Literal["get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)"], + return_value: algokit_utils.ABIReturn | None + ) -> ExecutionScheduleEntry | None: ... + @typing.overload + def decode_return_value( + self, + method: typing.Literal["rbac_rotate_arranger(address)uint64"], + return_value: algokit_utils.ABIReturn | None + ) -> int | None: ... + @typing.overload + def decode_return_value( + self, + method: typing.Literal["rbac_set_op_daemon(address)uint64"], + return_value: algokit_utils.ABIReturn | None + ) -> int | None: ... + @typing.overload + def decode_return_value( + self, + method: typing.Literal["rbac_assign_role(uint8,address,(uint64,uint64))uint64"], + return_value: algokit_utils.ABIReturn | None + ) -> int | None: ... + @typing.overload + def decode_return_value( + self, + method: typing.Literal["rbac_revoke_role(uint8,address)uint64"], + return_value: algokit_utils.ABIReturn | None + ) -> int | None: ... + @typing.overload + def decode_return_value( + self, + method: typing.Literal["rbac_gov_asset_suspension(bool)uint64"], + return_value: algokit_utils.ABIReturn | None + ) -> int | None: ... + @typing.overload + def decode_return_value( + self, + method: typing.Literal["rbac_get_arranger()address"], + return_value: algokit_utils.ABIReturn | None + ) -> str | None: ... + @typing.overload + def decode_return_value( + self, + method: typing.Literal["rbac_get_address_roles(address)(bool,bool,bool,bool,bool)"], + return_value: algokit_utils.ABIReturn | None + ) -> tuple[bool, bool, bool, bool, bool] | None: ... + @typing.overload + def decode_return_value( + self, + method: typing.Literal["rbac_get_role_validity(uint8,address)(uint64,uint64)"], + return_value: algokit_utils.ABIReturn | None + ) -> RoleValidity | None: ... + @typing.overload + def decode_return_value( + self, + method: typing.Literal["contract_create(address)uint64"], + return_value: algokit_utils.ABIReturn | None + ) -> int | None: ... + @typing.overload + def decode_return_value( + self, + method: typing.Literal["contract_update()void"], + return_value: algokit_utils.ABIReturn | None + ) -> None: ... + @typing.overload + def decode_return_value( + self, + method: str, + return_value: algokit_utils.ABIReturn | None + ) -> algokit_utils.ABIValue | algokit_utils.ABIStruct | None: ... + + def decode_return_value( + self, + method: str, + return_value: algokit_utils.ABIReturn | None + ) -> algokit_utils.ABIValue | algokit_utils.ABIStruct | AccountPosition | CashClaimResult | CashFundingResult | ExecutionScheduleEntry | KernelState | None | RoleValidity | int | str | tuple[bool, bool, bool, bool, bool]: + """Decode ABI return value for the given method.""" + if return_value is None: + return None + + arc56_method = self.app_spec.get_arc56_method(method) + decoded = return_value.get_arc56_value(arc56_method, self.app_spec.structs) + + # If method returns a struct, convert the dict to appropriate dataclass + if (arc56_method and + arc56_method.returns and + arc56_method.returns.struct and + isinstance(decoded, dict)): + struct_class = globals().get(arc56_method.returns.struct) + if struct_class: + return struct_class(**typing.cast(dict, decoded)) + return decoded + + +@dataclasses.dataclass(frozen=True) +class DasaMethodCallCreateParams( + algokit_utils.AppClientCreateSchema, algokit_utils.BaseAppClientMethodCallParams[ + ContractCreateArgs, + str | None, + ] +): + """Parameters for creating Dasa contract using ABI""" + on_complete: typing.Literal[OnComplete.NoOpOC] | None = None + method: str | None = None + + def to_algokit_utils_params(self) -> algokit_utils.AppClientMethodCallCreateParams: + method_args = _parse_abi_args(self.args) + return algokit_utils.AppClientMethodCallCreateParams( + **{ + **self.__dict__, + "method": self.method or getattr(self.args, "abi_method_signature", None), + "args": method_args, + } + ) + +@dataclasses.dataclass(frozen=True) +class DasaMethodCallUpdateParams( + algokit_utils.BaseAppClientMethodCallParams[ + typing.Any, + str | None, + ] +): + """Parameters for calling Dasa contract using ABI""" + on_complete: typing.Literal[OnComplete.UpdateApplicationOC] | None = None + method: str | None = None + + def to_algokit_utils_params(self) -> algokit_utils.AppClientMethodCallParams: + method_args = _parse_abi_args(self.args) + return algokit_utils.AppClientMethodCallParams( + **{ + **self.__dict__, + "method": self.method or getattr(self.args, "abi_method_signature", None), + "args": method_args, + } + ) + +class DasaFactory(algokit_utils.TypedAppFactoryProtocol[DasaMethodCallCreateParams, DasaMethodCallUpdateParams, None]): + """Factory for deploying and managing DasaClient smart contracts""" + + def __init__( + self, + algorand: _AlgoKitAlgorandClient, + *, + app_name: str | None = None, + default_sender: str | None = None, + default_signer: TransactionSigner | None = None, + version: str | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None, + ): + self.app_factory = algokit_utils.AppFactory( + params=algokit_utils.AppFactoryParams( + algorand=algorand, + app_spec=APP_SPEC, + app_name=app_name, + default_sender=default_sender, + default_signer=default_signer, + version=version, + compilation_params=compilation_params, + ) + ) + self.params = DasaFactoryParams(self.app_factory) + self.create_transaction = DasaFactoryCreateTransaction(self.app_factory) + self.send = DasaFactorySend(self.app_factory) + + @property + def app_name(self) -> str: + return self.app_factory.app_name + + @property + def app_spec(self) -> algokit_utils.Arc56Contract: + return self.app_factory.app_spec + + @property + def algorand(self) -> _AlgoKitAlgorandClient: + return self.app_factory.algorand + + def deploy( + self, + *, + on_update: algokit_utils.OnUpdate | None = None, + on_schema_break: algokit_utils.OnSchemaBreak | None = None, + create_params: DasaMethodCallCreateParams | None = None, + update_params: DasaMethodCallUpdateParams | None = None, + delete_params: None = None, + existing_deployments: algokit_utils.ApplicationLookup | None = None, + ignore_cache: bool = False, + app_name: str | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None, + send_params: algokit_utils.SendParams | None = None, + ) -> tuple[DasaClient, algokit_utils.AppFactoryDeployResult]: + """Deploy the application""" + deploy_response = self.app_factory.deploy( + on_update=on_update, + on_schema_break=on_schema_break, + create_params=create_params.to_algokit_utils_params() if create_params else None, + update_params=update_params.to_algokit_utils_params() if update_params else None, + delete_params=delete_params, + existing_deployments=existing_deployments, + ignore_cache=ignore_cache, + app_name=app_name, + compilation_params=compilation_params, + send_params=send_params, + ) + + return DasaClient(deploy_response[0]), deploy_response[1] + + def get_app_client_by_creator_and_name( + self, + creator_address: str, + app_name: str, + default_sender: str | None = None, + default_signer: TransactionSigner | None = None, + ignore_cache: bool | None = None, + app_lookup_cache: algokit_utils.ApplicationLookup | None = None, + approval_source_map: SourceMap | None = None, + clear_source_map: SourceMap | None = None, + ) -> DasaClient: + """Get an app client by creator address and name""" + return DasaClient( + self.app_factory.get_app_client_by_creator_and_name( + creator_address, + app_name, + default_sender, + default_signer, + ignore_cache, + app_lookup_cache, + approval_source_map, + clear_source_map, + ) + ) + + def get_app_client_by_id( + self, + app_id: int, + app_name: str | None = None, + default_sender: str | None = None, + default_signer: TransactionSigner | None = None, + approval_source_map: SourceMap | None = None, + clear_source_map: SourceMap | None = None, + ) -> DasaClient: + """Get an app client by app ID""" + return DasaClient( + self.app_factory.get_app_client_by_id( + app_id, + app_name, + default_sender, + default_signer, + approval_source_map, + clear_source_map, + ) + ) + + +class DasaFactoryParams: + """Parameters for creating transactions for Dasa contract""" + + def __init__(self, app_factory: algokit_utils.AppFactory): + self.app_factory = app_factory + self.create = DasaFactoryCreateParams(app_factory) + self.update = DasaFactoryUpdateParams(app_factory) + self.delete = DasaFactoryDeleteParams(app_factory) + +class DasaFactoryCreateParams: + """Parameters for 'create' operations of Dasa contract""" + + def __init__(self, app_factory: algokit_utils.AppFactory): + self.app_factory = app_factory + + def bare( + self, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.AppCreateParams: + """Creates an instance using a bare call""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.bare.create( + algokit_utils.AppFactoryCreateParams(**dataclasses.asdict(params)), + compilation_params=compilation_params) + + def fund_due_cashflows( + self, + args: tuple[int] | FundDueCashflowsArgs, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.AppCreateMethodCallParams: + """Creates a new instance using the fund_due_cashflows(uint64)(uint64,uint64,uint64,uint64,uint64) ABI method""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.create( + algokit_utils.AppFactoryCreateMethodCallParams( + **{ + **dataclasses.asdict(params), + "method": "fund_due_cashflows(uint64)(uint64,uint64,uint64,uint64,uint64)", + "args": _parse_abi_args(args), + } + ), + compilation_params=compilation_params + ) + + def claim_due_cashflows( + self, + args: tuple[str, bytes | str] | ClaimDueCashflowsArgs, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.AppCreateMethodCallParams: + """Creates a new instance using the claim_due_cashflows(address,byte[])(uint64,uint64,uint64,uint64,byte[]) ABI method""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.create( + algokit_utils.AppFactoryCreateMethodCallParams( + **{ + **dataclasses.asdict(params), + "method": "claim_due_cashflows(address,byte[])(uint64,uint64,uint64,uint64,byte[])", + "args": _parse_abi_args(args), + } + ), + compilation_params=compilation_params + ) + + def set_transfer_schedule( + self, + args: tuple[int, int] | SetTransferScheduleArgs, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.AppCreateMethodCallParams: + """Creates a new instance using the set_transfer_schedule(uint64,uint64)uint64 ABI method""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.create( + algokit_utils.AppFactoryCreateMethodCallParams( + **{ + **dataclasses.asdict(params), + "method": "set_transfer_schedule(uint64,uint64)uint64", + "args": _parse_abi_args(args), + } + ), + compilation_params=compilation_params + ) + + def primary_distribution( + self, + args: tuple[str, int] | PrimaryDistributionArgs, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.AppCreateMethodCallParams: + """Creates a new instance using the primary_distribution(address,uint64)uint64 ABI method""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.create( + algokit_utils.AppFactoryCreateMethodCallParams( + **{ + **dataclasses.asdict(params), + "method": "primary_distribution(address,uint64)uint64", + "args": _parse_abi_args(args), + } + ), + compilation_params=compilation_params + ) + + def transfer( + self, + args: tuple[str, str, int] | TransferArgs, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.AppCreateMethodCallParams: + """Creates a new instance using the transfer(address,address,uint64)uint64 ABI method""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.create( + algokit_utils.AppFactoryCreateMethodCallParams( + **{ + **dataclasses.asdict(params), + "method": "transfer(address,address,uint64)uint64", + "args": _parse_abi_args(args), + } + ), + compilation_params=compilation_params + ) + + def account_gov_suspension( + self, + args: tuple[str, bool] | AccountGovSuspensionArgs, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.AppCreateMethodCallParams: + """Creates a new instance using the account_gov_suspension(address,bool)uint64 ABI method""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.create( + algokit_utils.AppFactoryCreateMethodCallParams( + **{ + **dataclasses.asdict(params), + "method": "account_gov_suspension(address,bool)uint64", + "args": _parse_abi_args(args), + } + ), + compilation_params=compilation_params + ) + + def account_open( + self, + args: tuple[str, str] | AccountOpenArgs, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.AppCreateMethodCallParams: + """Creates a new instance using the account_open(address,address)uint64 ABI method""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.create( + algokit_utils.AppFactoryCreateMethodCallParams( + **{ + **dataclasses.asdict(params), + "method": "account_open(address,address)uint64", + "args": _parse_abi_args(args), + } + ), + compilation_params=compilation_params + ) + + def account_update_payment_address( + self, + args: tuple[str, str] | AccountUpdatePaymentAddressArgs, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.AppCreateMethodCallParams: + """Creates a new instance using the account_update_payment_address(address,address)uint64 ABI method""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.create( + algokit_utils.AppFactoryCreateMethodCallParams( + **{ + **dataclasses.asdict(params), + "method": "account_update_payment_address(address,address)uint64", + "args": _parse_abi_args(args), + } + ), + compilation_params=compilation_params + ) + + def account_get_position( + self, + args: tuple[str] | AccountGetPositionArgs, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.AppCreateMethodCallParams: + """Creates a new instance using the account_get_position(address)(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64) ABI method""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.create( + algokit_utils.AppFactoryCreateMethodCallParams( + **{ + **dataclasses.asdict(params), + "method": "account_get_position(address)(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64)", + "args": _parse_abi_args(args), + } + ), + compilation_params=compilation_params + ) + + def contract_config( + self, + args: tuple[NormalizedActusTerms, InitialKernelState, Prospectus] | ContractConfigArgs, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.AppCreateMethodCallParams: + """Creates a new instance using the contract_config((uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64),(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64),(byte[32],string))uint64 ABI method""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.create( + algokit_utils.AppFactoryCreateMethodCallParams( + **{ + **dataclasses.asdict(params), + "method": "contract_config((uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64),(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64),(byte[32],string))uint64", + "args": _parse_abi_args(args), + } + ), + compilation_params=compilation_params + ) + + def contract_schedule( + self, + args: tuple[int, bool, list[tuple[int, int, int, int, int, int, int, int, int]]] | ContractScheduleArgs, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.AppCreateMethodCallParams: + """Creates a new instance using the contract_schedule(uint64,bool,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[])uint64 ABI method""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.create( + algokit_utils.AppFactoryCreateMethodCallParams( + **{ + **dataclasses.asdict(params), + "method": "contract_schedule(uint64,bool,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[])uint64", + "args": _parse_abi_args(args), + } + ), + compilation_params=compilation_params + ) + + def execute_ied( + self, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.AppCreateMethodCallParams: + """Creates a new instance using the execute_ied()uint64 ABI method""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.create( + algokit_utils.AppFactoryCreateMethodCallParams( + **{ + **dataclasses.asdict(params), + "method": "execute_ied()uint64", + "args": None, + } + ), + compilation_params=compilation_params + ) + + def apply_non_cash_event( + self, + args: tuple[int, ObservedEventRequest] | ApplyNonCashEventArgs, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.AppCreateMethodCallParams: + """Creates a new instance using the apply_non_cash_event(uint64,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64 ABI method""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.create( + algokit_utils.AppFactoryCreateMethodCallParams( + **{ + **dataclasses.asdict(params), + "method": "apply_non_cash_event(uint64,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64", + "args": _parse_abi_args(args), + } + ), + compilation_params=compilation_params + ) + + def get_contract_state( + self, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.AppCreateMethodCallParams: + """Creates a new instance using the get_contract_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64) ABI method""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.create( + algokit_utils.AppFactoryCreateMethodCallParams( + **{ + **dataclasses.asdict(params), + "method": "get_contract_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", + "args": None, + } + ), + compilation_params=compilation_params + ) + + def get_next_due_event( + self, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.AppCreateMethodCallParams: + """Creates a new instance using the get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64) ABI method""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.create( + algokit_utils.AppFactoryCreateMethodCallParams( + **{ + **dataclasses.asdict(params), + "method": "get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", + "args": None, + } + ), + compilation_params=compilation_params + ) + + def rbac_rotate_arranger( + self, + args: tuple[str] | RbacRotateArrangerArgs, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.AppCreateMethodCallParams: + """Creates a new instance using the rbac_rotate_arranger(address)uint64 ABI method""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.create( + algokit_utils.AppFactoryCreateMethodCallParams( + **{ + **dataclasses.asdict(params), + "method": "rbac_rotate_arranger(address)uint64", + "args": _parse_abi_args(args), + } + ), + compilation_params=compilation_params + ) + + def rbac_set_op_daemon( + self, + args: tuple[str] | RbacSetOpDaemonArgs, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.AppCreateMethodCallParams: + """Creates a new instance using the rbac_set_op_daemon(address)uint64 ABI method""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.create( + algokit_utils.AppFactoryCreateMethodCallParams( + **{ + **dataclasses.asdict(params), + "method": "rbac_set_op_daemon(address)uint64", + "args": _parse_abi_args(args), + } + ), + compilation_params=compilation_params + ) + + def rbac_assign_role( + self, + args: tuple[int, str, RoleValidity] | RbacAssignRoleArgs, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.AppCreateMethodCallParams: + """Creates a new instance using the rbac_assign_role(uint8,address,(uint64,uint64))uint64 ABI method""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.create( + algokit_utils.AppFactoryCreateMethodCallParams( + **{ + **dataclasses.asdict(params), + "method": "rbac_assign_role(uint8,address,(uint64,uint64))uint64", + "args": _parse_abi_args(args), + } + ), + compilation_params=compilation_params + ) + + def rbac_revoke_role( + self, + args: tuple[int, str] | RbacRevokeRoleArgs, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.AppCreateMethodCallParams: + """Creates a new instance using the rbac_revoke_role(uint8,address)uint64 ABI method""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.create( + algokit_utils.AppFactoryCreateMethodCallParams( + **{ + **dataclasses.asdict(params), + "method": "rbac_revoke_role(uint8,address)uint64", + "args": _parse_abi_args(args), + } + ), + compilation_params=compilation_params + ) + + def rbac_gov_asset_suspension( + self, + args: tuple[bool] | RbacGovAssetSuspensionArgs, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.AppCreateMethodCallParams: + """Creates a new instance using the rbac_gov_asset_suspension(bool)uint64 ABI method""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.create( + algokit_utils.AppFactoryCreateMethodCallParams( + **{ + **dataclasses.asdict(params), + "method": "rbac_gov_asset_suspension(bool)uint64", + "args": _parse_abi_args(args), + } + ), + compilation_params=compilation_params + ) + + def rbac_get_arranger( + self, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.AppCreateMethodCallParams: + """Creates a new instance using the rbac_get_arranger()address ABI method""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.create( + algokit_utils.AppFactoryCreateMethodCallParams( + **{ + **dataclasses.asdict(params), + "method": "rbac_get_arranger()address", + "args": None, + } + ), + compilation_params=compilation_params + ) + + def rbac_get_address_roles( + self, + args: tuple[str] | RbacGetAddressRolesArgs, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.AppCreateMethodCallParams: + """Creates a new instance using the rbac_get_address_roles(address)(bool,bool,bool,bool,bool) ABI method""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.create( + algokit_utils.AppFactoryCreateMethodCallParams( + **{ + **dataclasses.asdict(params), + "method": "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", + "args": _parse_abi_args(args), + } + ), + compilation_params=compilation_params + ) + + def rbac_get_role_validity( + self, + args: tuple[int, str] | RbacGetRoleValidityArgs, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.AppCreateMethodCallParams: + """Creates a new instance using the rbac_get_role_validity(uint8,address)(uint64,uint64) ABI method""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.create( + algokit_utils.AppFactoryCreateMethodCallParams( + **{ + **dataclasses.asdict(params), + "method": "rbac_get_role_validity(uint8,address)(uint64,uint64)", + "args": _parse_abi_args(args), + } + ), + compilation_params=compilation_params + ) + + def contract_create( + self, + args: tuple[str] | ContractCreateArgs, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.AppCreateMethodCallParams: + """Creates a new instance using the contract_create(address)uint64 ABI method""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.create( + algokit_utils.AppFactoryCreateMethodCallParams( + **{ + **dataclasses.asdict(params), + "method": "contract_create(address)uint64", + "args": _parse_abi_args(args), + } + ), + compilation_params=compilation_params + ) + + def contract_update( + self, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.AppCreateMethodCallParams: + """Creates a new instance using the contract_update()void ABI method""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.create( + algokit_utils.AppFactoryCreateMethodCallParams( + **{ + **dataclasses.asdict(params), + "method": "contract_update()void", + "args": None, + } + ), + compilation_params=compilation_params + ) + +class DasaFactoryUpdateParams: + """Parameters for 'update' operations of Dasa contract""" + + def __init__(self, app_factory: algokit_utils.AppFactory): + self.app_factory = app_factory + + def bare( + self, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + + ) -> algokit_utils.AppUpdateParams: + """Updates an instance using a bare call""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.bare.deploy_update( + algokit_utils.AppClientBareCallParams(**dataclasses.asdict(params)), + ) + +class DasaFactoryDeleteParams: + """Parameters for 'delete' operations of Dasa contract""" + + def __init__(self, app_factory: algokit_utils.AppFactory): + self.app_factory = app_factory + + def bare( + self, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + + ) -> algokit_utils.AppDeleteParams: + """Deletes an instance using a bare call""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.bare.deploy_delete( + algokit_utils.AppClientBareCallParams(**dataclasses.asdict(params)), + ) + + +class DasaFactoryCreateTransaction: + """Create transactions for Dasa contract""" + + def __init__(self, app_factory: algokit_utils.AppFactory): + self.app_factory = app_factory + self.create = DasaFactoryCreateTransactionCreate(app_factory) + + +class DasaFactoryCreateTransactionCreate: + """Create new instances of Dasa contract""" + + def __init__(self, app_factory: algokit_utils.AppFactory): + self.app_factory = app_factory + + def bare( + self, + params: algokit_utils.CommonAppCallCreateParams | None = None, + ) -> Transaction: + """Creates a new instance using a bare call""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.create_transaction.bare.create( + algokit_utils.AppFactoryCreateParams(**dataclasses.asdict(params)), + ) + + +class DasaFactorySend: + """Send calls to Dasa contract""" + + def __init__(self, app_factory: algokit_utils.AppFactory): + self.app_factory = app_factory + self.create = DasaFactorySendCreate(app_factory) + + +class DasaFactorySendCreate: + """Send create calls to Dasa contract""" + + def __init__(self, app_factory: algokit_utils.AppFactory): + self.app_factory = app_factory + + def bare( + self, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + send_params: algokit_utils.SendParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None, + ) -> tuple[DasaClient, algokit_utils.SendAppCreateTransactionResult]: + """Creates a new instance using a bare call""" + params = params or algokit_utils.CommonAppCallCreateParams() + result = self.app_factory.send.bare.create( + algokit_utils.AppFactoryCreateParams(**dataclasses.asdict(params)), + send_params=send_params, + compilation_params=compilation_params + ) + return DasaClient(result[0]), result[1] + + def contract_create( + self, + args: tuple[str] | ContractCreateArgs, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + send_params: algokit_utils.SendParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> tuple[DasaClient, algokit_utils.AppFactoryCreateMethodCallResult[int]]: + """Creates and sends a transaction using the contract_create(address)uint64 ABI method""" + params = params or algokit_utils.CommonAppCallCreateParams() + client, result = self.app_factory.send.create( + algokit_utils.AppFactoryCreateMethodCallParams( + **{ + **dataclasses.asdict(params), + "method": "contract_create(address)uint64", + "args": _parse_abi_args(args), + } + ), + send_params=send_params, + compilation_params=compilation_params + ) + return_value = None if result.abi_return is None else typing.cast(int, result.abi_return) + + return DasaClient(client), algokit_utils.AppFactoryCreateMethodCallResult[int]( + **{ + **result.__dict__, + "app_id": result.app_id, + "abi_return": return_value, + "transaction": result.transaction, + "confirmation": result.confirmation, + "group_id": result.group_id, + "tx_ids": result.tx_ids, + "transactions": result.transactions, + "confirmations": result.confirmations, + "app_address": result.app_address, + } + ) + + +class _DasaUpdateComposer: + def __init__(self, composer: "DasaComposer"): + self.composer = composer + def contract_update( + self, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> "DasaComposer": + self.composer._composer.add_app_update_method_call( + self.composer.client.params.update.contract_update( + + params=params, + compilation_params=compilation_params + ) + ) + self.composer._result_mappers.append( + lambda v: self.composer.client.decode_return_value( + "contract_update()void", v + ) + ) + return self.composer + + +class DasaComposer: + """Composer for creating transaction groups for Dasa contract calls""" + + def __init__(self, client: "DasaClient"): + self.client = client + self._composer = client.algorand.new_group() + self._result_mappers: list[typing.Callable[[algokit_utils.ABIReturn | None], object] | None] = [] + + @property + def update(self) -> "_DasaUpdateComposer": + return _DasaUpdateComposer(self) + + def fund_due_cashflows( + self, + args: tuple[int] | FundDueCashflowsArgs, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> "DasaComposer": + self._composer.add_app_call_method_call( + self.client.params.fund_due_cashflows( + args=args, + params=params, + ) + ) + self._result_mappers.append( + lambda v: self.client.decode_return_value( + "fund_due_cashflows(uint64)(uint64,uint64,uint64,uint64,uint64)", v + ) + ) + return self + + def claim_due_cashflows( + self, + args: tuple[str, bytes | str] | ClaimDueCashflowsArgs, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> "DasaComposer": + self._composer.add_app_call_method_call( + self.client.params.claim_due_cashflows( + args=args, + params=params, + ) + ) + self._result_mappers.append( + lambda v: self.client.decode_return_value( + "claim_due_cashflows(address,byte[])(uint64,uint64,uint64,uint64,byte[])", v + ) + ) + return self + + def set_transfer_schedule( + self, + args: tuple[int, int] | SetTransferScheduleArgs, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> "DasaComposer": + self._composer.add_app_call_method_call( + self.client.params.set_transfer_schedule( + args=args, + params=params, + ) + ) + self._result_mappers.append( + lambda v: self.client.decode_return_value( + "set_transfer_schedule(uint64,uint64)uint64", v + ) + ) + return self + + def primary_distribution( + self, + args: tuple[str, int] | PrimaryDistributionArgs, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> "DasaComposer": + self._composer.add_app_call_method_call( + self.client.params.primary_distribution( + args=args, + params=params, + ) + ) + self._result_mappers.append( + lambda v: self.client.decode_return_value( + "primary_distribution(address,uint64)uint64", v + ) + ) + return self + + def transfer( + self, + args: tuple[str, str, int] | TransferArgs, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> "DasaComposer": + self._composer.add_app_call_method_call( + self.client.params.transfer( + args=args, + params=params, + ) + ) + self._result_mappers.append( + lambda v: self.client.decode_return_value( + "transfer(address,address,uint64)uint64", v + ) + ) + return self + + def account_gov_suspension( + self, + args: tuple[str, bool] | AccountGovSuspensionArgs, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> "DasaComposer": + self._composer.add_app_call_method_call( + self.client.params.account_gov_suspension( + args=args, + params=params, + ) + ) + self._result_mappers.append( + lambda v: self.client.decode_return_value( + "account_gov_suspension(address,bool)uint64", v + ) + ) + return self + + def account_open( + self, + args: tuple[str, str] | AccountOpenArgs, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> "DasaComposer": + self._composer.add_app_call_method_call( + self.client.params.account_open( + args=args, + params=params, + ) + ) + self._result_mappers.append( + lambda v: self.client.decode_return_value( + "account_open(address,address)uint64", v + ) + ) + return self + + def account_update_payment_address( + self, + args: tuple[str, str] | AccountUpdatePaymentAddressArgs, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> "DasaComposer": + self._composer.add_app_call_method_call( + self.client.params.account_update_payment_address( + args=args, + params=params, + ) + ) + self._result_mappers.append( + lambda v: self.client.decode_return_value( + "account_update_payment_address(address,address)uint64", v + ) + ) + return self + + def account_get_position( + self, + args: tuple[str] | AccountGetPositionArgs, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> "DasaComposer": + self._composer.add_app_call_method_call( + self.client.params.account_get_position( + args=args, + params=params, + ) + ) + self._result_mappers.append( + lambda v: self.client.decode_return_value( + "account_get_position(address)(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64)", v + ) + ) + return self + + def contract_config( + self, + args: tuple[NormalizedActusTerms, InitialKernelState, Prospectus] | ContractConfigArgs, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> "DasaComposer": + self._composer.add_app_call_method_call( + self.client.params.contract_config( + args=args, + params=params, + ) + ) + self._result_mappers.append( + lambda v: self.client.decode_return_value( + "contract_config((uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64),(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64),(byte[32],string))uint64", v + ) + ) + return self + + def contract_schedule( + self, + args: tuple[int, bool, list[tuple[int, int, int, int, int, int, int, int, int]]] | ContractScheduleArgs, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> "DasaComposer": + self._composer.add_app_call_method_call( + self.client.params.contract_schedule( + args=args, + params=params, + ) + ) + self._result_mappers.append( + lambda v: self.client.decode_return_value( + "contract_schedule(uint64,bool,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[])uint64", v + ) + ) + return self + + def execute_ied( + self, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> "DasaComposer": + self._composer.add_app_call_method_call( + self.client.params.execute_ied( + + params=params, + ) + ) + self._result_mappers.append( + lambda v: self.client.decode_return_value( + "execute_ied()uint64", v + ) + ) + return self + + def apply_non_cash_event( + self, + args: tuple[int, ObservedEventRequest] | ApplyNonCashEventArgs, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> "DasaComposer": + self._composer.add_app_call_method_call( + self.client.params.apply_non_cash_event( + args=args, + params=params, + ) + ) + self._result_mappers.append( + lambda v: self.client.decode_return_value( + "apply_non_cash_event(uint64,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64", v + ) + ) + return self + + def get_contract_state( + self, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> "DasaComposer": + self._composer.add_app_call_method_call( + self.client.params.get_contract_state( + + params=params, + ) + ) + self._result_mappers.append( + lambda v: self.client.decode_return_value( + "get_contract_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", v + ) + ) + return self + + def get_next_due_event( + self, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> "DasaComposer": + self._composer.add_app_call_method_call( + self.client.params.get_next_due_event( + + params=params, + ) + ) + self._result_mappers.append( + lambda v: self.client.decode_return_value( + "get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", v + ) + ) + return self + + def rbac_rotate_arranger( + self, + args: tuple[str] | RbacRotateArrangerArgs, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> "DasaComposer": + self._composer.add_app_call_method_call( + self.client.params.rbac_rotate_arranger( + args=args, + params=params, + ) + ) + self._result_mappers.append( + lambda v: self.client.decode_return_value( + "rbac_rotate_arranger(address)uint64", v + ) + ) + return self + + def rbac_set_op_daemon( + self, + args: tuple[str] | RbacSetOpDaemonArgs, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> "DasaComposer": + self._composer.add_app_call_method_call( + self.client.params.rbac_set_op_daemon( + args=args, + params=params, + ) + ) + self._result_mappers.append( + lambda v: self.client.decode_return_value( + "rbac_set_op_daemon(address)uint64", v + ) + ) + return self + + def rbac_assign_role( + self, + args: tuple[int, str, RoleValidity] | RbacAssignRoleArgs, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> "DasaComposer": + self._composer.add_app_call_method_call( + self.client.params.rbac_assign_role( + args=args, + params=params, + ) + ) + self._result_mappers.append( + lambda v: self.client.decode_return_value( + "rbac_assign_role(uint8,address,(uint64,uint64))uint64", v + ) + ) + return self + + def rbac_revoke_role( + self, + args: tuple[int, str] | RbacRevokeRoleArgs, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> "DasaComposer": + self._composer.add_app_call_method_call( + self.client.params.rbac_revoke_role( + args=args, + params=params, + ) + ) + self._result_mappers.append( + lambda v: self.client.decode_return_value( + "rbac_revoke_role(uint8,address)uint64", v + ) + ) + return self + + def rbac_gov_asset_suspension( + self, + args: tuple[bool] | RbacGovAssetSuspensionArgs, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> "DasaComposer": + self._composer.add_app_call_method_call( + self.client.params.rbac_gov_asset_suspension( + args=args, + params=params, + ) + ) + self._result_mappers.append( + lambda v: self.client.decode_return_value( + "rbac_gov_asset_suspension(bool)uint64", v + ) + ) + return self + + def rbac_get_arranger( + self, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> "DasaComposer": + self._composer.add_app_call_method_call( + self.client.params.rbac_get_arranger( + + params=params, + ) + ) + self._result_mappers.append( + lambda v: self.client.decode_return_value( + "rbac_get_arranger()address", v + ) + ) + return self + + def rbac_get_address_roles( + self, + args: tuple[str] | RbacGetAddressRolesArgs, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> "DasaComposer": + self._composer.add_app_call_method_call( + self.client.params.rbac_get_address_roles( + args=args, + params=params, + ) + ) + self._result_mappers.append( + lambda v: self.client.decode_return_value( + "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", v + ) + ) + return self + + def rbac_get_role_validity( + self, + args: tuple[int, str] | RbacGetRoleValidityArgs, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> "DasaComposer": + self._composer.add_app_call_method_call( + self.client.params.rbac_get_role_validity( + args=args, + params=params, + ) + ) + self._result_mappers.append( + lambda v: self.client.decode_return_value( + "rbac_get_role_validity(uint8,address)(uint64,uint64)", v + ) + ) + return self + + def contract_create( + self, + args: tuple[str] | ContractCreateArgs, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> "DasaComposer": + self._composer.add_app_call_method_call( + self.client.params.contract_create( + args=args, + params=params, + ) + ) + self._result_mappers.append( + lambda v: self.client.decode_return_value( + "contract_create(address)uint64", v + ) + ) + return self + + def clear_state( + self, + *, + args: list[bytes] | None = None, + params: algokit_utils.CommonAppCallParams | None = None, + ) -> "DasaComposer": + params=params or algokit_utils.CommonAppCallParams() + self._composer.add_app_call( + self.client.params.clear_state( + algokit_utils.AppClientBareCallParams( + **{ + **dataclasses.asdict(params), + "args": args + } + ) + ) + ) + return self + + def add_transaction( + self, txn: Transaction, signer: TransactionSigner | None = None + ) -> "DasaComposer": + self._composer.add_transaction(txn, signer) + return self + + def composer(self) -> algokit_utils.TransactionComposer: + return self._composer + + def simulate( + self, + allow_more_logs: bool | None = None, + allow_empty_signatures: bool | None = None, + allow_unnamed_resources: bool | None = None, + extra_opcode_budget: int | None = None, + exec_trace_config: SimulateTraceConfig | None = None, + simulation_round: int | None = None, + skip_signatures: bool | None = None, + ) -> algokit_utils.SendAtomicTransactionComposerResults: + return self._composer.simulate( + allow_more_logs=allow_more_logs, + allow_empty_signatures=allow_empty_signatures, + allow_unnamed_resources=allow_unnamed_resources, + extra_opcode_budget=extra_opcode_budget, + exec_trace_config=exec_trace_config, + simulation_round=simulation_round, + skip_signatures=skip_signatures, + ) + + def send( + self, + send_params: algokit_utils.SendParams | None = None + ) -> algokit_utils.SendAtomicTransactionComposerResults: + return self._composer.send(send_params) From 46bb9454e0cabb7adba3a23112fb2984a2490ecf Mon Sep 17 00:00:00 2001 From: cusma Date: Thu, 12 Mar 2026 19:58:34 +0100 Subject: [PATCH 114/244] chore: delete old tests --- tests/fixed_coupon_bond/__init__.py | 0 tests/fixed_coupon_bond/conftest.py | 321 ----------------- tests/fixed_coupon_bond/test_actus_events.py | 288 --------------- tests/fixed_coupon_bond/test_asset_config.py | 173 --------- tests/fixed_coupon_bond/test_asset_create.py | 89 ----- .../fixed_coupon_bond/test_asset_transfer.py | 306 ---------------- .../test_get_account_units_current_value.py | 96 ----- .../test_get_coupon_rates.py | 19 - .../test_get_coupon_status.py | 92 ----- .../test_get_payment_amount.py | 94 ----- tests/fixed_coupon_bond/test_pay_coupon.py | 279 -------------- tests/fixed_coupon_bond/test_pay_principal.py | 162 --------- .../test_sub_accrued_interest_amount.py | 104 ------ .../test_sub_all_due_coupons_paid.py | 56 --- .../test_sub_count_due_coupons.py | 45 --- .../test_sub_latest_coupon_date.py | 1 - .../test_sub_next_coupon_due_date.py | 53 --- tests/mock_module_accounting/__init__.py | 0 tests/mock_module_accounting/conftest.py | 81 ----- .../test_account_close.py | 141 -------- .../test_account_get_info.py | 66 ---- .../test_account_gov_suspension.py | 118 ------ .../test_account_open.py | 228 ------------ .../test_account_update_payment_address.py | 115 ------ tests/mock_module_rbac/__init__.py | 0 .../test_policy_set_asset_suspension.py | 66 ---- .../mock_module_rbac/test_rbac_assign_role.py | 153 -------- .../test_rbac_get_address_role.py | 73 ---- .../test_rbac_get_arranger.py | 19 - .../test_rbac_get_role_config.py | 104 ------ .../mock_module_rbac/test_rbac_revoke_role.py | 155 -------- .../test_rbac_rotate_arranger.py | 51 --- tests/perpetual_bond/__init__.py | 0 tests/perpetual_bond/conftest.py | 302 ---------------- tests/perpetual_bond/test_asset_config.py | 131 ------- tests/perpetual_bond/test_asset_create.py | 90 ----- tests/perpetual_bond/test_asset_transfer.py | 268 -------------- .../test_get_account_units_current_value.py | 96 ----- .../perpetual_bond/test_get_coupon_status.py | 78 ---- .../perpetual_bond/test_get_payment_amount.py | 76 ---- tests/perpetual_bond/test_pay_coupon.py | 293 --------------- .../test_sub_accrued_interest_amount.py | 107 ------ .../test_sub_all_due_coupons_paid.py | 59 --- .../test_sub_count_due_coupons.py | 37 -- .../test_sub_latest_coupon_date.py | 1 - .../test_sub_next_coupon_due_date.py | 39 -- .../test_update_interest_rate.py | 153 -------- tests/shared/__init__.py | 0 tests/shared/cases.py | 340 ------------------ tests/shared/conftest.py | 229 ------------ tests/shared/test_asset_config.py | 267 -------------- tests/shared/test_asset_create.py | 58 --- tests/shared/test_asset_update.py | 49 --- tests/shared/test_core_getters.py | 86 ----- tests/shared/test_financial_error_paths.py | 197 ---------- tests/shared/test_primary_distribution.py | 183 ---------- tests/shared/test_secondary_schedule.py | 172 --------- tests/shared/test_set_default_status.py | 32 -- tests/zero_coupon_bond/__init__.py | 0 tests/zero_coupon_bond/conftest.py | 249 ------------- tests/zero_coupon_bond/test_asset_config.py | 170 --------- tests/zero_coupon_bond/test_asset_create.py | 88 ----- tests/zero_coupon_bond/test_asset_transfer.py | 260 -------------- .../test_get_account_units_current_value.py | 110 ------ .../test_get_payment_amount.py | 63 ---- tests/zero_coupon_bond/test_pay_principal.py | 142 -------- .../test_sub_accrued_interest_amount.py | 87 ----- 67 files changed, 8060 deletions(-) delete mode 100644 tests/fixed_coupon_bond/__init__.py delete mode 100644 tests/fixed_coupon_bond/conftest.py delete mode 100644 tests/fixed_coupon_bond/test_actus_events.py delete mode 100644 tests/fixed_coupon_bond/test_asset_config.py delete mode 100644 tests/fixed_coupon_bond/test_asset_create.py delete mode 100644 tests/fixed_coupon_bond/test_asset_transfer.py delete mode 100644 tests/fixed_coupon_bond/test_get_account_units_current_value.py delete mode 100644 tests/fixed_coupon_bond/test_get_coupon_rates.py delete mode 100644 tests/fixed_coupon_bond/test_get_coupon_status.py delete mode 100644 tests/fixed_coupon_bond/test_get_payment_amount.py delete mode 100644 tests/fixed_coupon_bond/test_pay_coupon.py delete mode 100644 tests/fixed_coupon_bond/test_pay_principal.py delete mode 100644 tests/fixed_coupon_bond/test_sub_accrued_interest_amount.py delete mode 100644 tests/fixed_coupon_bond/test_sub_all_due_coupons_paid.py delete mode 100644 tests/fixed_coupon_bond/test_sub_count_due_coupons.py delete mode 100644 tests/fixed_coupon_bond/test_sub_latest_coupon_date.py delete mode 100644 tests/fixed_coupon_bond/test_sub_next_coupon_due_date.py delete mode 100644 tests/mock_module_accounting/__init__.py delete mode 100644 tests/mock_module_accounting/conftest.py delete mode 100644 tests/mock_module_accounting/test_account_close.py delete mode 100644 tests/mock_module_accounting/test_account_get_info.py delete mode 100644 tests/mock_module_accounting/test_account_gov_suspension.py delete mode 100644 tests/mock_module_accounting/test_account_open.py delete mode 100644 tests/mock_module_accounting/test_account_update_payment_address.py delete mode 100644 tests/mock_module_rbac/__init__.py delete mode 100644 tests/mock_module_rbac/test_policy_set_asset_suspension.py delete mode 100644 tests/mock_module_rbac/test_rbac_assign_role.py delete mode 100644 tests/mock_module_rbac/test_rbac_get_address_role.py delete mode 100644 tests/mock_module_rbac/test_rbac_get_arranger.py delete mode 100644 tests/mock_module_rbac/test_rbac_get_role_config.py delete mode 100644 tests/mock_module_rbac/test_rbac_revoke_role.py delete mode 100644 tests/mock_module_rbac/test_rbac_rotate_arranger.py delete mode 100644 tests/perpetual_bond/__init__.py delete mode 100644 tests/perpetual_bond/conftest.py delete mode 100644 tests/perpetual_bond/test_asset_config.py delete mode 100644 tests/perpetual_bond/test_asset_create.py delete mode 100644 tests/perpetual_bond/test_asset_transfer.py delete mode 100644 tests/perpetual_bond/test_get_account_units_current_value.py delete mode 100644 tests/perpetual_bond/test_get_coupon_status.py delete mode 100644 tests/perpetual_bond/test_get_payment_amount.py delete mode 100644 tests/perpetual_bond/test_pay_coupon.py delete mode 100644 tests/perpetual_bond/test_sub_accrued_interest_amount.py delete mode 100644 tests/perpetual_bond/test_sub_all_due_coupons_paid.py delete mode 100644 tests/perpetual_bond/test_sub_count_due_coupons.py delete mode 100644 tests/perpetual_bond/test_sub_latest_coupon_date.py delete mode 100644 tests/perpetual_bond/test_sub_next_coupon_due_date.py delete mode 100644 tests/perpetual_bond/test_update_interest_rate.py delete mode 100644 tests/shared/__init__.py delete mode 100644 tests/shared/cases.py delete mode 100644 tests/shared/conftest.py delete mode 100644 tests/shared/test_asset_config.py delete mode 100644 tests/shared/test_asset_create.py delete mode 100644 tests/shared/test_asset_update.py delete mode 100644 tests/shared/test_core_getters.py delete mode 100644 tests/shared/test_financial_error_paths.py delete mode 100644 tests/shared/test_primary_distribution.py delete mode 100644 tests/shared/test_secondary_schedule.py delete mode 100644 tests/shared/test_set_default_status.py delete mode 100644 tests/zero_coupon_bond/__init__.py delete mode 100644 tests/zero_coupon_bond/conftest.py delete mode 100644 tests/zero_coupon_bond/test_asset_config.py delete mode 100644 tests/zero_coupon_bond/test_asset_create.py delete mode 100644 tests/zero_coupon_bond/test_asset_transfer.py delete mode 100644 tests/zero_coupon_bond/test_get_account_units_current_value.py delete mode 100644 tests/zero_coupon_bond/test_get_payment_amount.py delete mode 100644 tests/zero_coupon_bond/test_pay_principal.py delete mode 100644 tests/zero_coupon_bond/test_sub_accrued_interest_amount.py diff --git a/tests/fixed_coupon_bond/__init__.py b/tests/fixed_coupon_bond/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/tests/fixed_coupon_bond/conftest.py b/tests/fixed_coupon_bond/conftest.py deleted file mode 100644 index c0d00789..00000000 --- a/tests/fixed_coupon_bond/conftest.py +++ /dev/null @@ -1,321 +0,0 @@ -from collections.abc import Callable -from typing import Final - -import pytest -from algokit_utils import ( - AlgorandClient, - CommonAppCallParams, - SendParams, - SigningAccount, -) - -from smart_contracts import config as sc_cfg -from smart_contracts import constants as sc_cst -from smart_contracts.artifacts.fixed_coupon_bond.fixed_coupon_bond_client import ( - AccountOpenArgs, - AssetConfigArgs, - AssetCreateArgs, - AssetMetadata, - FixedCouponBondClient, - FixedCouponBondFactory, - PayCouponArgs, - PrimaryDistributionArgs, - RbacAssignRoleArgs, - RbacGovAssetSuspensionArgs, - SetDefaultStatusArgs, - SetSecondaryTimeEventsArgs, -) -from tests import conftest_helpers as helpers -from tests import utils -from tests.conftest import ( - APR, - INITIAL_D_ASA_UNITS, - ISSUANCE_DELAY, - MATURITY_DELAY, - MINIMUM_DENOMINATION, - PRIMARY_DISTRIBUTION_DELAY, - PRIMARY_DISTRIBUTION_DURATION, - PRINCIPAL, -) - -TOTAL_COUPONS: Final[int] = 2 # Max 120 -COUPON_RATE: Final[int] = APR // TOTAL_COUPONS -COUPON_RATE_INCREASE: Final[int] = 5 # BPS equal to 0.05% -COUPON_RATES: Final[list[int]] = [ - COUPON_RATE + i * COUPON_RATE_INCREASE for i in range(TOTAL_COUPONS) -] -INTEREST_RATE = sum(COUPON_RATES) -COUPON_PERIOD: Final[int] = 30 * sc_cst.DAY_2_SEC - -TOTAL_ASA_FUNDS: Final[int] = PRINCIPAL * (sc_cst.BPS + INTEREST_RATE) // sc_cst.BPS - -PROSPECTUS_URL: Final[str] = "Fixed Coupon Bond Prospectus" - - -@pytest.fixture(scope="session") -def asset_metadata() -> AssetMetadata: - return AssetMetadata( - contract_type=sc_cst.CT_PAM, - calendar=sc_cst.CLDR_NC, - business_day_convention=sc_cst.BDC_NOS, - end_of_month_convention=sc_cst.EOMC_SD, - prepayment_effect=sc_cst.PPEF_N, - penalty_type=sc_cst.PYTP_N, - prospectus_hash=bytes(32), - prospectus_url=PROSPECTUS_URL, - ) - - -@pytest.fixture(scope="session") -def coupon_rates() -> utils.CouponRates: - return COUPON_RATES - - -@pytest.fixture(scope="function") -def time_events(algorand: AlgorandClient) -> utils.TimeEvents: - current_ts = utils.get_latest_timestamp(algorand.client.algod) - primary_distribution_opening = current_ts + PRIMARY_DISTRIBUTION_DELAY - primary_distribution_closure = ( - primary_distribution_opening + PRIMARY_DISTRIBUTION_DURATION - ) - issuance_date = primary_distribution_closure + ISSUANCE_DELAY - coupon_dates = [ - issuance_date + i * COUPON_PERIOD for i in range(1, TOTAL_COUPONS + 1) - ] - maturity_date = coupon_dates[-1] + MATURITY_DELAY - return [ - primary_distribution_opening, - primary_distribution_closure, - issuance_date, - *coupon_dates, - maturity_date, - ] - - -@pytest.fixture(scope="function") -def fixed_coupon_bond_cfg( - currency: utils.Currency, - coupon_rates: utils.CouponRates, - time_events: utils.TimeEvents, - day_count_convention: int, -) -> utils.DAsaConfig: - return utils.DAsaConfig( - denomination_asset_id=currency.id, - settlement_asset_id=currency.id, - principal=PRINCIPAL, - principal_discount=0, - minimum_denomination=MINIMUM_DENOMINATION, - day_count_convention=day_count_convention, - interest_rate=INTEREST_RATE, - coupon_rates=coupon_rates, - time_events=time_events, - time_periods=[], - ) - - -@pytest.fixture(scope="function") -def fixed_coupon_bond_client_empty( - algorand: AlgorandClient, - arranger: SigningAccount, - asset_metadata: AssetMetadata, -) -> FixedCouponBondClient: - return helpers.create_and_fund_client( - algorand, - FixedCouponBondFactory, - arranger, - AssetCreateArgs(arranger=arranger.address, metadata=asset_metadata), - ) - - -@pytest.fixture(scope="function") -def account_manager( - algorand: AlgorandClient, - fixed_coupon_bond_cfg: utils.DAsaConfig, - fixed_coupon_bond_client_empty: FixedCouponBondClient, -) -> utils.DAsaAccountManager: - return helpers.create_role_account( - algorand, - utils.DAsaAccountManager, - fixed_coupon_bond_client_empty, - rbac_assign_role_args_class=RbacAssignRoleArgs, - ) - - -@pytest.fixture(scope="function") -def trustee( - algorand: AlgorandClient, - fixed_coupon_bond_cfg: utils.DAsaConfig, - fixed_coupon_bond_client_empty: FixedCouponBondClient, -) -> utils.DAsaTrustee: - return helpers.create_role_account( - algorand, - utils.DAsaTrustee, - fixed_coupon_bond_client_empty, - rbac_assign_role_args_class=RbacAssignRoleArgs, - ) - - -@pytest.fixture(scope="function") -def authority( - algorand: AlgorandClient, - fixed_coupon_bond_cfg: utils.DAsaConfig, - fixed_coupon_bond_client_empty: FixedCouponBondClient, -) -> utils.DAsaAuthority: - return helpers.create_role_account( - algorand, - utils.DAsaAuthority, - fixed_coupon_bond_client_empty, - rbac_assign_role_args_class=RbacAssignRoleArgs, - ) - - -@pytest.fixture(scope="function") -def fixed_coupon_bond_client_active( - algorand: AlgorandClient, - bank: SigningAccount, - fixed_coupon_bond_cfg: utils.DAsaConfig, - fixed_coupon_bond_client_empty: FixedCouponBondClient, -) -> FixedCouponBondClient: - return helpers.activate_client_with_config_and_funding( - algorand, - fixed_coupon_bond_client_empty, - bank, - fixed_coupon_bond_cfg, - TOTAL_ASA_FUNDS, - AssetConfigArgs, - ) - - -@pytest.fixture(scope="function") -def primary_dealer( - algorand: AlgorandClient, - fixed_coupon_bond_client_active: FixedCouponBondClient, -) -> utils.DAsaPrimaryDealer: - state = fixed_coupon_bond_client_active.state.global_state - role_config = utils.set_role_config( - state.primary_distribution_opening_date, state.primary_distribution_closure_date - ) - return helpers.create_role_account( - algorand, - utils.DAsaPrimaryDealer, - fixed_coupon_bond_client_active, - role_config, - RbacAssignRoleArgs, - ) - - -@pytest.fixture(scope="function") -def account_factory( - algorand: AlgorandClient, - bank: SigningAccount, - currency: utils.Currency, - account_manager: utils.DAsaAccountManager, -) -> Callable[..., utils.DAsaAccount]: - return helpers.build_account_factory( - algorand, currency, account_manager, AccountOpenArgs - ) - - -@pytest.fixture(scope="function") -def fixed_coupon_bond_client_primary( - fixed_coupon_bond_client_active: FixedCouponBondClient, -) -> FixedCouponBondClient: - state = fixed_coupon_bond_client_active.state.global_state - return helpers.set_client_to_primary_phase( - fixed_coupon_bond_client_active, - SetSecondaryTimeEventsArgs, - [state.issuance_date, state.maturity_date], - ) - - -@pytest.fixture(scope="function") -def account_with_units_factory( - account_factory: Callable[..., utils.DAsaAccount], - primary_dealer: utils.DAsaPrimaryDealer, - fixed_coupon_bond_client_primary: FixedCouponBondClient, -) -> Callable[..., utils.DAsaAccount]: - return helpers.build_account_with_units_factory( - account_factory, - primary_dealer, - fixed_coupon_bond_client_primary, - PrimaryDistributionArgs, - INITIAL_D_ASA_UNITS, - ) - - -@pytest.fixture(scope="function") -def account_a( - account_with_units_factory: Callable[..., utils.DAsaAccount], -) -> utils.DAsaAccount: - return account_with_units_factory() - - -@pytest.fixture(scope="function") -def account_b( - account_with_units_factory: Callable[..., utils.DAsaAccount], -) -> utils.DAsaAccount: - return account_with_units_factory(units=2 * INITIAL_D_ASA_UNITS) - - -@pytest.fixture(scope="function") -def account_with_coupons_factory( - account_with_units_factory: Callable[..., utils.DAsaAccount], - fixed_coupon_bond_client_primary: FixedCouponBondClient, -) -> Callable[..., utils.DAsaAccount]: - state = fixed_coupon_bond_client_primary.state.global_state - - def _factory( - *, units: int = INITIAL_D_ASA_UNITS, coupons: int = state.total_coupons - ) -> utils.DAsaAccount: - account = account_with_units_factory(units=units) - time_events = fixed_coupon_bond_client_primary.send.get_time_events().abi_return - utils.time_warp(time_events[sc_cfg.FIRST_COUPON_DATE_IDX + coupons - 1]) - for _ in range(1, coupons + 1): - fixed_coupon_bond_client_primary.send.pay_coupon( - PayCouponArgs( - holding_address=account.holding_address, - payment_info=b"", - ), - params=CommonAppCallParams(max_fee=utils.max_fee_per_coupon(coupons)), - send_params=SendParams(cover_app_call_inner_transaction_fees=True), - ) - return account - - return _factory - - -@pytest.fixture(scope="function") -def fixed_coupon_bond_client_ongoing( - fixed_coupon_bond_client_primary: FixedCouponBondClient, -) -> FixedCouponBondClient: - state = fixed_coupon_bond_client_primary.state.global_state - utils.time_warp(state.issuance_date) - return fixed_coupon_bond_client_primary - - -@pytest.fixture(scope="function") -def fixed_coupon_bond_client_at_maturity( - fixed_coupon_bond_client_ongoing: FixedCouponBondClient, -) -> FixedCouponBondClient: - state = fixed_coupon_bond_client_ongoing.state.global_state - utils.time_warp(state.maturity_date) - return fixed_coupon_bond_client_ongoing - - -@pytest.fixture(scope="function") -def fixed_coupon_bond_client_suspended( - authority: utils.DAsaAuthority, - fixed_coupon_bond_client_ongoing: FixedCouponBondClient, -) -> FixedCouponBondClient: - return helpers.suspend_client( - fixed_coupon_bond_client_ongoing, authority, RbacGovAssetSuspensionArgs - ) - - -@pytest.fixture(scope="function") -def fixed_coupon_bond_client_defaulted( - trustee: utils.DAsaTrustee, fixed_coupon_bond_client_ongoing: FixedCouponBondClient -) -> FixedCouponBondClient: - return helpers.set_client_to_default( - fixed_coupon_bond_client_ongoing, trustee, SetDefaultStatusArgs - ) diff --git a/tests/fixed_coupon_bond/test_actus_events.py b/tests/fixed_coupon_bond/test_actus_events.py deleted file mode 100644 index f0ce5cc6..00000000 --- a/tests/fixed_coupon_bond/test_actus_events.py +++ /dev/null @@ -1,288 +0,0 @@ -from datetime import datetime, timezone - -from algokit_utils import ( - AlgorandClient, - AssetOptInParams, - AssetTransferParams, - CommonAppCallParams, - SendParams, - SigningAccount, -) - -from smart_contracts import constants as sc_cst -from smart_contracts.artifacts.fixed_coupon_bond.fixed_coupon_bond_client import ( - AssetConfigArgs, - AssetCreateArgs, - AssetMetadata, - FixedCouponBondFactory, - PayCouponArgs, - PayPrincipalArgs, - PrimaryDistributionArgs, - RbacAssignRoleArgs, -) -from tests import conftest_helpers as helpers -from tests import utils - -# Configuration -PRINCIPAL = 10_000_00 # 10,000 EUR with 2 decimals -MINIMUM_DENOMINATION = 100_00 # 100 EUR with 2 decimals -TOTAL_COUPONS = 20 -COUPON_PER_YEAR = 4 -NOMINAL_RATE = 200 # 2% in BPS -COUPON_RATE = NOMINAL_RATE // COUPON_PER_YEAR # 0.5% per coupon = 50 BPS -INTEREST_RATE = TOTAL_COUPONS * COUPON_RATE -COUPON_PERIOD = 90 * sc_cst.DAY_2_SEC # 3 months = 90 days -ISSUANCE_DATE = 1893369600 # Mon Dec 31 2029 00:00:00 GMT+0000 - - -def test_actus_events( - algorand: AlgorandClient, - bank: SigningAccount, - currency: utils.Currency, - arranger: SigningAccount, -) -> None: - """ - Test ACTUS events (IP, PR) for a fixed coupon bond. - - All dates are calculated relative to the LocalNet time. - """ - - # Time schedule (all dates relative to current time) - current_ts = utils.get_latest_timestamp(algorand.client.algod) - - # Primary distribution (before issuance date) - primary_opening = current_ts + 1 * sc_cst.DAY_2_SEC - primary_closure = primary_opening + 7 * sc_cst.DAY_2_SEC - - # Generate coupon dates (every 3 months starting from issuance) - coupon_dates = [ - ISSUANCE_DATE + i * COUPON_PERIOD for i in range(1, TOTAL_COUPONS + 1) - ] - - # Maturity: 1 second after the last coupon - maturity_date = coupon_dates[-1] + 1 - - time_events = [ - primary_opening, - primary_closure, - ISSUANCE_DATE, - *coupon_dates, - maturity_date, - ] - - # Create and configure D-ASA - asset_metadata = AssetMetadata( - contract_type=sc_cst.CT_PAM, - calendar=sc_cst.CLDR_NC, - business_day_convention=sc_cst.BDC_NOS, - end_of_month_convention=sc_cst.EOMC_SD, - prepayment_effect=sc_cst.PPEF_N, - penalty_type=sc_cst.PYTP_N, - prospectus_hash=bytes(32), - prospectus_url="Fixed Coupon Bond Test", - ) - - client = helpers.create_and_fund_client( - algorand, - FixedCouponBondFactory, - arranger, - AssetCreateArgs(arranger=arranger.address, metadata=asset_metadata), - ) - - # Configure asset (this also opts the contract into the settlement asset) - coupon_rates = [COUPON_RATE] * TOTAL_COUPONS - - client.send.asset_config( - AssetConfigArgs( - denomination_asset_id=currency.id, - settlement_asset_id=currency.id, - principal=PRINCIPAL, - principal_discount=0, - minimum_denomination=MINIMUM_DENOMINATION, - day_count_convention=sc_cst.DCC_CONT, - interest_rate=INTEREST_RATE, - coupon_rates=coupon_rates, - time_events=time_events, - time_periods=[], - ) - ) - - # Fund the D-ASA contract with settlement asset - total_funds = PRINCIPAL * (sc_cst.BPS + INTEREST_RATE) // sc_cst.BPS - - # Transfer denomination assets to the contract - algorand.send.asset_transfer( - AssetTransferParams( - asset_id=currency.id, - amount=total_funds, - receiver=client.app_address, - sender=bank.address, - signer=bank.signer, - ) - ) - - # Create primary dealer - primary_dealer = helpers.create_role_account( - algorand, - utils.DAsaPrimaryDealer, - client, - utils.set_role_config(primary_opening, primary_closure), - RbacAssignRoleArgs, - ) - - # Create an account to receive units - account_manager = helpers.create_role_account( - algorand, - utils.DAsaAccountManager, - client, - rbac_assign_role_args_class=RbacAssignRoleArgs, - ) - - # Time warp to primary distribution - utils.time_warp(primary_opening) - - # Create account - investor = algorand.account.random() - algorand.account.ensure_funded_from_environment( - account_to_fund=investor.address, - min_spending_balance=utils.AlgoAmount.from_algo(10), - ) - - # Opt-in to currency - algorand.send.asset_opt_in( - AssetOptInParams( - asset_id=currency.id, - sender=investor.address, - signer=investor.signer, - ) - ) - - # Open account on D-ASA - from smart_contracts.artifacts.fixed_coupon_bond.fixed_coupon_bond_client import ( - AccountOpenArgs, - ) - - client.send.account_open( - AccountOpenArgs( - holding_address=investor.address, - payment_address=investor.address, - ), - params=CommonAppCallParams( - sender=account_manager.address, signer=account_manager.signer - ), - ) - - # Create DAsaAccount wrapper - investor_account = utils.DAsaAccount( - holding_address=investor.address, - d_asa_client=client, - private_key=investor.private_key, - ) - - # Primary distribution - this will emit IED event - units_to_distribute = PRINCIPAL // MINIMUM_DENOMINATION # All units - - print("\n" + "=" * 80) - print("ACTUS EVENTS FOR FIXED COUPON BOND") - print("=" * 80) - print("\nBond Configuration:") - print(f" Principal: {PRINCIPAL * currency.asa_to_unit:.2f} EUR") - print(f" Total Coupons: {TOTAL_COUPONS}") - print(f" Interest Rate per Coupon: {COUPON_RATE / 100:.2f}%") - print(f" Total Interest Rate: {INTEREST_RATE / 100:.2f}%") - print(f" Coupon Period: {COUPON_PERIOD // sc_cst.DAY_2_SEC} days") - print( - f" Issuance Date: {datetime.fromtimestamp(ISSUANCE_DATE, tz=timezone.utc).strftime('%Y-%m-%d %H:%M:%S')} UTC" - ) - print( - f" Maturity Date: {datetime.fromtimestamp(maturity_date, tz=timezone.utc).strftime('%Y-%m-%d %H:%M:%S')} UTC" - ) - print("\n" + "=" * 80) - - client.send.primary_distribution( - PrimaryDistributionArgs( - holding_address=investor_account.holding_address, - units=units_to_distribute, - ), - params=CommonAppCallParams( - sender=primary_dealer.address, signer=primary_dealer.signer - ), - ) - - # Time warp to issuance - utils.time_warp(ISSUANCE_DATE) - - # Pay all coupons - print("\n2. IP (Interest Payment) Events:") - total_interest_paid = 0 - for coupon_idx in range(1, TOTAL_COUPONS + 1): - # Time warp to coupon date - coupon_date = coupon_dates[coupon_idx - 1] - utils.time_warp(coupon_date) - - # Pay coupon - this will emit IP event - result_ip = client.send.pay_coupon( - PayCouponArgs( - holding_address=investor_account.holding_address, - payment_info=b"", - ), - params=CommonAppCallParams(max_fee=utils.max_fee_per_coupon(TOTAL_COUPONS)), - send_params=SendParams(cover_app_call_inner_transaction_fees=True), - ) - - # Extract and print IP event - ip_event_bytes = utils.get_event_from_call_result(result_ip) - ip_event = utils.decode_actus_event(ip_event_bytes) - - # Accumulate total interest - total_interest_paid += ip_event["payoff"] - - print(f"\n Coupon {coupon_idx}/{TOTAL_COUPONS}:") - print(f" Type: {ip_event['type_name']}") - print( - f" Time: {datetime.fromtimestamp(ip_event['time'], tz=timezone.utc).strftime('%Y-%m-%d %H:%M:%S')} UTC ({ip_event['time']})" - ) - print( - f" Payoff: {ip_event['payoff'] * currency.asa_to_unit:.2f} {ip_event['currency_unit']}" - ) - print( - f" Nominal Value: {ip_event['nominal_value'] * currency.asa_to_unit:.2f} {ip_event['currency_unit']}" - ) - - # Time warp to maturity - utils.time_warp(maturity_date) - - # Pay principal - this will emit PR event - result_pr = client.send.pay_principal( - PayPrincipalArgs( - holding_address=investor_account.holding_address, - payment_info=b"", - ), - ) - - # Extract and print PR event - pr_event_bytes = utils.get_event_from_call_result(result_pr) - pr_event = utils.decode_actus_event(pr_event_bytes) - - print("\n3. PR (Principal Redemption) Event:") - print(f" Type: {pr_event['type_name']}") - print( - f" Time: {datetime.fromtimestamp(pr_event['time'], tz=timezone.utc).strftime('%Y-%m-%d %H:%M:%S')} UTC ({pr_event['time']})" - ) - print( - f" Payoff: {pr_event['payoff'] * currency.asa_to_unit:.2f} {pr_event['currency_unit']}" - ) - print( - f" Nominal Value: {pr_event['nominal_value'] * currency.asa_to_unit:.2f} {pr_event['currency_unit']}" - ) - - print("\n" + "=" * 80) - print("SUMMARY") - print("=" * 80) - print(f"Total Events: {TOTAL_COUPONS + 1} ({TOTAL_COUPONS} IP + 1 PR)") - print(f"Total Interest Paid: {total_interest_paid * currency.asa_to_unit:.2f} EUR") - print(f"Principal Redeemed: {pr_event['payoff'] * currency.asa_to_unit:.2f} EUR") - print( - f"Total Cashflow: {(total_interest_paid + pr_event['payoff']) * currency.asa_to_unit:.2f} EUR" - ) - print("=" * 80 + "\n") diff --git a/tests/fixed_coupon_bond/test_asset_config.py b/tests/fixed_coupon_bond/test_asset_config.py deleted file mode 100644 index 3356cff9..00000000 --- a/tests/fixed_coupon_bond/test_asset_config.py +++ /dev/null @@ -1,173 +0,0 @@ -from copy import deepcopy - -import pytest -from algokit_utils import LogicError - -from smart_contracts import config as sc_cfg -from smart_contracts import enums -from smart_contracts import errors as err -from smart_contracts.artifacts.fixed_coupon_bond.fixed_coupon_bond_client import ( - AssetConfigArgs, - FixedCouponBondClient, -) -from tests.utils import Currency, DAsaConfig - - -def test_pass_asset_config( - day_count_convention: int, - currency: Currency, - fixed_coupon_bond_cfg: DAsaConfig, - fixed_coupon_bond_client_empty: FixedCouponBondClient, -) -> None: - fixed_coupon_bond_client_empty.send.asset_config( - AssetConfigArgs(**fixed_coupon_bond_cfg.dictify()) - ) - - state = fixed_coupon_bond_client_empty.state.global_state - expected_coupon_rates = ( - fixed_coupon_bond_client_empty.send.get_coupon_rates().abi_return - ) - expected_time_events = ( - fixed_coupon_bond_client_empty.send.get_time_events().abi_return - ) - - # Asset Configuration - assert state.denomination_asset_id == currency.id - assert state.settlement_asset_id == state.denomination_asset_id - assert state.unit_value == fixed_coupon_bond_cfg.minimum_denomination - assert state.day_count_convention == fixed_coupon_bond_cfg.day_count_convention - - # Principal and Supply - assert ( - state.total_units - == fixed_coupon_bond_cfg.principal // fixed_coupon_bond_cfg.minimum_denomination - ) - assert not state.circulating_units - assert not state.principal_discount - - # Interest Rate - assert state.interest_rate == fixed_coupon_bond_cfg.interest_rate - - # Coupons - assert expected_coupon_rates == fixed_coupon_bond_cfg.coupon_rates - assert state.total_coupons == fixed_coupon_bond_cfg.total_coupons - assert not state.paid_coupon_units - - # Time Schedule - assert expected_time_events == fixed_coupon_bond_cfg.time_events - assert ( - state.primary_distribution_opening_date - == fixed_coupon_bond_cfg.time_events[ - sc_cfg.PRIMARY_DISTRIBUTION_OPENING_DATE_IDX - ] - # == time_schedule_limits.primary_distribution_opening_date - ) - assert ( - state.primary_distribution_closure_date - == fixed_coupon_bond_cfg.time_events[ - sc_cfg.PRIMARY_DISTRIBUTION_CLOSURE_DATE_IDX - ] - # == time_schedule_limits.primary_distribution_closure_date - ) - assert ( - state.issuance_date - == fixed_coupon_bond_cfg.time_events[sc_cfg.ISSUANCE_DATE_IDX] - # == time_schedule_limits.issuance_date - ) - assert not state.secondary_market_opening_date - assert not state.secondary_market_closure_date - assert ( - state.maturity_date - == fixed_coupon_bond_cfg.time_events[sc_cfg.MATURITY_DATE_IDX] - # == time_schedule_limits.maturity_date - ) - - # Status - assert state.status == enums.STATUS_ACTIVE - assert not state.asset_suspended - - -def test_fail_unauthorized() -> None: - pass # TODO - - -def test_fail_already_configured() -> None: - pass # TODO - - -def test_fail_invalid_denomination() -> None: - pass # TODO - - -def test_fail_invalid_minimum_denomination() -> None: - pass # TODO - - -def test_fail_invalid_interest_rate() -> None: - pass # TODO - - -def test_fail_invalid_time_events_length( - fixed_coupon_bond_cfg: DAsaConfig, - fixed_coupon_bond_client_empty: FixedCouponBondClient, -) -> None: - wrong_d_asa_cfg = deepcopy(fixed_coupon_bond_cfg) - wrong_d_asa_cfg.time_events = [*fixed_coupon_bond_cfg.time_events, 0] - with pytest.raises(LogicError, match=err.INVALID_TIME_EVENTS_LENGTH): - fixed_coupon_bond_client_empty.send.asset_config( - AssetConfigArgs(**wrong_d_asa_cfg.dictify()) - ) - - -def test_fail_invalid_time( - fixed_coupon_bond_cfg: DAsaConfig, - fixed_coupon_bond_client_empty: FixedCouponBondClient, -) -> None: - wrong_d_asa_cfg = deepcopy(fixed_coupon_bond_cfg) - wrong_d_asa_cfg.time_events[0] = 0 - with pytest.raises(LogicError, match=err.INVALID_TIME): - fixed_coupon_bond_client_empty.send.asset_config( - AssetConfigArgs(**wrong_d_asa_cfg.dictify()) - ) - - -def test_fail_invalid_sorting( - fixed_coupon_bond_cfg: DAsaConfig, - fixed_coupon_bond_client_empty: FixedCouponBondClient, -) -> None: - wrong_d_asa_cfg = deepcopy(fixed_coupon_bond_cfg) - wrong_d_asa_cfg.time_events[-1] = fixed_coupon_bond_cfg.time_events[-2] - with pytest.raises(LogicError, match=err.INVALID_SORTING): - fixed_coupon_bond_client_empty.send.asset_config( - AssetConfigArgs(**wrong_d_asa_cfg.dictify()) - ) - - wrong_d_asa_cfg = deepcopy(fixed_coupon_bond_cfg) - wrong_d_asa_cfg.time_events[0] = fixed_coupon_bond_cfg.time_events[-1] - with pytest.raises(LogicError, match=err.INVALID_SORTING): - fixed_coupon_bond_client_empty.send.asset_config( - AssetConfigArgs(**wrong_d_asa_cfg.dictify()) - ) - - -def test_fail_invalid_time_period_duration() -> None: - pass # TODO - - -def test_fail_invalid_settlement_asset() -> None: - pass # TODO - - -def test_fail_invalid_time_periods() -> None: - pass # TODO - - -def test_fail_invalid_time_period_representations() -> None: - pass # TODO - - -def test_fail_invalid_coupon_rates() -> None: - pass # TODO - - -# TODO: Test INVALID_TIME_PERIOD for Actual/Actual convention diff --git a/tests/fixed_coupon_bond/test_asset_create.py b/tests/fixed_coupon_bond/test_asset_create.py deleted file mode 100644 index 00b9266e..00000000 --- a/tests/fixed_coupon_bond/test_asset_create.py +++ /dev/null @@ -1,89 +0,0 @@ -from algokit_utils import AlgorandClient, SigningAccount -from algosdk.abi import ArrayStaticType, ByteType, StringType, TupleType, UintType - -from smart_contracts import constants as sc_cst -from smart_contracts import enums -from smart_contracts.artifacts.fixed_coupon_bond.fixed_coupon_bond_client import ( - AssetCreateArgs, - AssetMetadata, - FixedCouponBondFactory, -) - -from .conftest import PROSPECTUS_URL - - -def test_pass_asset_create( - algorand: AlgorandClient, - asset_metadata: AssetMetadata, - day_count_convention: int, - arranger: SigningAccount, -) -> None: - factory = algorand.client.get_typed_app_factory( - FixedCouponBondFactory, - default_sender=arranger.address, - default_signer=arranger.signer, - ) - fixed_coupon_bond_client, _ = factory.send.create.asset_create( - AssetCreateArgs(arranger=arranger.address, metadata=asset_metadata) - ) - - state = fixed_coupon_bond_client.state.global_state - - # Roles - assert state.arranger == arranger.address - - # Asset Configuration - assert not state.denomination_asset_id - assert not state.settlement_asset_id - assert not state.unit_value - assert not state.day_count_convention - - # Metadata - assert state.metadata == TupleType( - [ - UintType(8), # Contract Type - UintType(8), # Calendar - UintType(8), # Business Day Convention - UintType(8), # End of Month Convention - UintType(8), # Prepayment Effect - UintType(8), # Penalty Type - ArrayStaticType(ByteType(), 32), # Prospectus Hash - StringType(), # Prospectus URL - ] - ).encode( - [ - sc_cst.CT_PAM, - sc_cst.CLDR_NC, - sc_cst.BDC_NOS, - sc_cst.EOMC_SD, - sc_cst.PPEF_N, - sc_cst.PYTP_N, - bytes(32), - PROSPECTUS_URL, - ] - ) - - # Principal and Supply - assert not state.total_units - assert not state.circulating_units - assert not state.principal_discount - - # Coupons - assert not state.total_coupons - assert not state.paid_coupon_units - - # Time Schedule - assert not state.primary_distribution_opening_date - assert not state.primary_distribution_closure_date - assert not state.issuance_date - assert not state.secondary_market_opening_date - assert not state.secondary_market_closure_date - assert not state.maturity_date - - # Status - assert state.status == enums.STATUS_INACTIVE - assert not state.asset_suspended - - -def test_fail_invalid_state_schema() -> None: - pass # TODO diff --git a/tests/fixed_coupon_bond/test_asset_transfer.py b/tests/fixed_coupon_bond/test_asset_transfer.py deleted file mode 100644 index 093a71b2..00000000 --- a/tests/fixed_coupon_bond/test_asset_transfer.py +++ /dev/null @@ -1,306 +0,0 @@ -from collections.abc import Callable - -import pytest -from algokit_utils import ( - CommonAppCallParams, - LogicError, - SigningAccount, -) - -from smart_contracts import config as sc_cfg -from smart_contracts import errors as err -from smart_contracts.artifacts.fixed_coupon_bond.fixed_coupon_bond_client import ( - AssetTransferArgs, - FixedCouponBondClient, - GetAccountUnitsCurrentValueArgs, - PayCouponArgs, -) -from tests.utils import DAsaAccount, DAsaConfig, time_warp - - -def test_pass_asset_transfer( - fixed_coupon_bond_cfg: DAsaConfig, - fixed_coupon_bond_client_primary: FixedCouponBondClient, - account_factory: Callable[..., DAsaAccount], - account_with_coupons_factory: Callable[..., DAsaAccount], -) -> None: - paid_coupons = 1 - account_a = account_with_coupons_factory(units=3, coupons=paid_coupons) - account_b = account_factory(fixed_coupon_bond_client_primary) - - coupon_1_date = fixed_coupon_bond_cfg.time_events[ - sc_cfg.ISSUANCE_DATE_IDX + paid_coupons - ] - coupon_2_date = fixed_coupon_bond_cfg.time_events[ - sc_cfg.ISSUANCE_DATE_IDX + paid_coupons + 1 - ] - coupon_period = coupon_2_date - coupon_1_date - - pre_transfer_units_a = account_a.units - pre_transfer_units_b = account_b.units - pre_transfer_unit_value_a = account_a.unit_value - pre_transfer_unit_value_b = account_b.unit_value - - assert pre_transfer_unit_value_a != pre_transfer_unit_value_b - assert pre_transfer_unit_value_b == 0 - assert account_a.paid_coupons != account_b.paid_coupons - - time_warp(coupon_1_date + coupon_period // 10) - - transfer_1_units = 1 - accrued_interest_1 = ( - fixed_coupon_bond_client_primary.send.get_account_units_current_value( - GetAccountUnitsCurrentValueArgs( - holding_address=account_a.holding_address, - units=transfer_1_units, - ) - ).abi_return.accrued_interest - ) - transferred_value_1 = fixed_coupon_bond_client_primary.send.asset_transfer( - AssetTransferArgs( - sender_holding_address=account_a.holding_address, - receiver_holding_address=account_b.holding_address, - units=transfer_1_units, - ), - params=CommonAppCallParams(sender=account_a.address), - ).abi_return - - post_transfer_1_units_a = account_a.units - post_transfer_1_units_b = account_b.units - post_transfer_1_unit_value_a = account_a.unit_value - post_transfer_1_unit_value_b = account_b.unit_value - - assert ( - transferred_value_1 - == fixed_coupon_bond_cfg.minimum_denomination * transfer_1_units - + accrued_interest_1 - ) - assert post_transfer_1_units_a == pre_transfer_units_a - transfer_1_units - assert post_transfer_1_units_b == pre_transfer_units_b + transfer_1_units - assert post_transfer_1_unit_value_a == post_transfer_1_unit_value_b - assert account_a.paid_coupons == account_b.paid_coupons - - time_warp(coupon_1_date + coupon_period // 5) - - transfer_2_units = 1 - accrued_interest_2 = ( - fixed_coupon_bond_client_primary.send.get_account_units_current_value( - GetAccountUnitsCurrentValueArgs( - holding_address=account_a.holding_address, - units=transfer_2_units, - ), - ).abi_return.accrued_interest - ) - transferred_value_2 = fixed_coupon_bond_client_primary.send.asset_transfer( - AssetTransferArgs( - sender_holding_address=account_a.holding_address, - receiver_holding_address=account_b.holding_address, - units=transfer_2_units, - ), - params=CommonAppCallParams(sender=account_a.address), - ).abi_return - - post_transfer_2_units_a = account_a.units - post_transfer_2_units_b = account_b.units - post_transfer_2_unit_value_a = account_a.unit_value - post_transfer_2_unit_value_b = account_b.unit_value - - assert ( - transferred_value_2 - == fixed_coupon_bond_cfg.minimum_denomination * transfer_2_units - + accrued_interest_2 - ) - assert post_transfer_2_units_a == post_transfer_1_units_a - transfer_2_units - assert post_transfer_2_units_b == post_transfer_1_units_b + transfer_2_units - assert post_transfer_2_unit_value_a == post_transfer_2_unit_value_b - assert account_a.paid_coupons == account_b.paid_coupons - - time_warp(coupon_1_date + coupon_period // 2) - - transfer_3_units = 1 - accrued_interest_3 = ( - fixed_coupon_bond_client_primary.send.get_account_units_current_value( - GetAccountUnitsCurrentValueArgs( - holding_address=account_a.holding_address, - units=transfer_3_units, - ) - ).abi_return.accrued_interest - ) - transferred_value_3 = fixed_coupon_bond_client_primary.send.asset_transfer( - AssetTransferArgs( - sender_holding_address=account_a.holding_address, - receiver_holding_address=account_b.holding_address, - units=transfer_3_units, - ), - params=CommonAppCallParams(sender=account_a.address), - ).abi_return - - post_transfer_3_units_a = account_a.units - post_transfer_3_units_b = account_b.units - post_transfer_3_unit_value_a = account_a.unit_value - - assert ( - transferred_value_3 - == fixed_coupon_bond_cfg.minimum_denomination * transfer_3_units - + accrued_interest_3 - ) - assert post_transfer_3_units_a == 0 - assert ( - post_transfer_3_units_b - == transfer_1_units + transfer_2_units + transfer_3_units - ) - assert post_transfer_3_unit_value_a == 0 - assert account_a.paid_coupons == 0 - - -def test_fail_secondary_market_not_open_yet( - fixed_coupon_bond_client_primary: FixedCouponBondClient, - account_a: DAsaAccount, - account_b: DAsaAccount, -) -> None: - with pytest.raises(LogicError, match=err.SECONDARY_MARKET_CLOSED): - fixed_coupon_bond_client_primary.send.asset_transfer( - AssetTransferArgs( - sender_holding_address=account_a.holding_address, - receiver_holding_address=account_b.holding_address, - units=1, - ), - params=CommonAppCallParams(sender=account_a.address), - ) - - -# TODO: test_fail_secondary_market_closed - - -def test_fail_unauthorized( - no_role_account: SigningAccount, - account_a: DAsaAccount, - account_b: DAsaAccount, - fixed_coupon_bond_client_ongoing: FixedCouponBondClient, -) -> None: - with pytest.raises(LogicError, match=err.UNAUTHORIZED): - fixed_coupon_bond_client_ongoing.send.asset_transfer( - AssetTransferArgs( - sender_holding_address=account_a.holding_address, - receiver_holding_address=account_b.holding_address, - units=1, - ), - params=CommonAppCallParams(sender=no_role_account.address), - ) - - -def test_fail_suspended( - account_a: DAsaAccount, - account_b: DAsaAccount, - fixed_coupon_bond_client_suspended: FixedCouponBondClient, -) -> None: - with pytest.raises(LogicError, match=err.SUSPENDED): - fixed_coupon_bond_client_suspended.send.asset_transfer( - AssetTransferArgs( - sender_holding_address=account_a.holding_address, - receiver_holding_address=account_b.holding_address, - units=1, - ), - params=CommonAppCallParams(sender=account_a.address), - ) - - -def test_fail_invalid_sender( - no_role_account: SigningAccount, - account_a: DAsaAccount, - fixed_coupon_bond_client_ongoing: FixedCouponBondClient, -) -> None: - with pytest.raises(LogicError, match=err.INVALID_HOLDING_ADDRESS): - fixed_coupon_bond_client_ongoing.send.asset_transfer( - AssetTransferArgs( - sender_holding_address=no_role_account.address, - receiver_holding_address=account_a.holding_address, - units=1, - ), - params=CommonAppCallParams(sender=no_role_account.address), - ) - - -def test_fail_invalid_receiver( - no_role_account: SigningAccount, - account_a: DAsaAccount, - fixed_coupon_bond_client_ongoing: FixedCouponBondClient, -) -> None: - with pytest.raises(LogicError, match=err.INVALID_HOLDING_ADDRESS): - fixed_coupon_bond_client_ongoing.send.asset_transfer( - AssetTransferArgs( - sender_holding_address=account_a.holding_address, - receiver_holding_address=no_role_account.address, - units=1, - ), - params=CommonAppCallParams(sender=account_a.address), - ) - - -def test_fail_defaulted_status() -> None: - pass # TODO - - -def test_fail_suspended_sender() -> None: - pass # TODO - - -def test_fail_suspended_receiver() -> None: - pass # TODO - - -def test_fail_self_transfer() -> None: - pass # TODO - - -def test_fail_null_transfer() -> None: - pass # TODO - - -def test_fail_over_transfer( - account_a: DAsaAccount, - account_b: DAsaAccount, - fixed_coupon_bond_client_ongoing: FixedCouponBondClient, -) -> None: - with pytest.raises(LogicError, match=err.OVER_TRANSFER): - fixed_coupon_bond_client_ongoing.send.asset_transfer( - AssetTransferArgs( - sender_holding_address=account_a.holding_address, - receiver_holding_address=account_b.holding_address, - units=account_a.units + 1, - ), - params=CommonAppCallParams(sender=account_a.address), - ) - - -def test_fail_pending_coupon_payment() -> None: - pass # TODO - - -def test_fail_not_fungible( - fixed_coupon_bond_cfg: DAsaConfig, - fixed_coupon_bond_client_primary: FixedCouponBondClient, - account_with_units_factory: Callable[..., DAsaAccount], -) -> None: - account_a = account_with_units_factory() - account_b = account_with_units_factory() - - coupon_1_date = fixed_coupon_bond_cfg.time_events[sc_cfg.ISSUANCE_DATE_IDX + 1] - time_warp(coupon_1_date) - - fixed_coupon_bond_client_primary.send.pay_coupon( - PayCouponArgs( - holding_address=account_a.holding_address, - payment_info=b"", - ) - ) - - with pytest.raises(LogicError, match=err.NON_FUNGIBLE_UNITS): - fixed_coupon_bond_client_primary.send.asset_transfer( - AssetTransferArgs( - sender_holding_address=account_a.holding_address, - receiver_holding_address=account_b.holding_address, - units=1, - ), - params=CommonAppCallParams(sender=account_a.address), - ) diff --git a/tests/fixed_coupon_bond/test_get_account_units_current_value.py b/tests/fixed_coupon_bond/test_get_account_units_current_value.py deleted file mode 100644 index 1cde8e07..00000000 --- a/tests/fixed_coupon_bond/test_get_account_units_current_value.py +++ /dev/null @@ -1,96 +0,0 @@ -from collections.abc import Callable -from typing import Final - -from smart_contracts import config as sc_cfg -from smart_contracts import constants as sc_cst -from smart_contracts.artifacts.fixed_coupon_bond.fixed_coupon_bond_client import ( - FixedCouponBondClient, - GetAccountUnitsCurrentValueArgs, - PayCouponArgs, -) -from tests.utils import Currency, DAsaAccount, DAsaConfig, time_warp - -D_ASA_TEST_UNITS: Final[int] = 3 - -# TODO: Add Actual/Actual DDC tests - - -def test_pass_get_account_units_current_value( - currency: Currency, - fixed_coupon_bond_cfg: DAsaConfig, - fixed_coupon_bond_client_primary: FixedCouponBondClient, - account_with_units_factory: Callable[..., DAsaAccount], -) -> None: - account = account_with_units_factory(units=D_ASA_TEST_UNITS) - - value = fixed_coupon_bond_client_primary.send.get_account_units_current_value( - GetAccountUnitsCurrentValueArgs( - holding_address=account.holding_address, - units=D_ASA_TEST_UNITS, - ), - ).abi_return - print("Initial units' value:") - print(value.__dict__) - assert ( - value.units_value - == D_ASA_TEST_UNITS * fixed_coupon_bond_cfg.minimum_denomination - ) - assert not value.accrued_interest - - for coupon in range(1, fixed_coupon_bond_cfg.total_coupons + 1): - next_due_date_idx = sc_cfg.FIRST_COUPON_DATE_IDX - 1 + coupon - next_due_date = fixed_coupon_bond_cfg.time_events[next_due_date_idx] - coupon_period = ( - fixed_coupon_bond_cfg.time_events[next_due_date_idx + 1] - next_due_date - ) - coupon_period_fraction = 10 - time_warp(next_due_date + coupon_period // coupon_period_fraction) - if coupon <= fixed_coupon_bond_cfg.total_coupons: - fixed_coupon_bond_client_primary.send.pay_coupon( - PayCouponArgs( - holding_address=account.holding_address, - payment_info=b"", - ) - ) - - units_value = ( - fixed_coupon_bond_client_primary.send.get_account_units_current_value( - GetAccountUnitsCurrentValueArgs( - holding_address=account.holding_address, - units=D_ASA_TEST_UNITS, - ), - ).abi_return - ) - print(f"Units' value after {coupon} coupon due date:") - print(units_value.__dict__) - assert ( - value.units_value - == D_ASA_TEST_UNITS * fixed_coupon_bond_cfg.minimum_denomination - ) - if coupon < fixed_coupon_bond_cfg.total_coupons: - assert ( - value.accrued_interest - == value.units_value - * fixed_coupon_bond_cfg.coupon_rates[coupon] - * coupon_period_fraction - // (sc_cst.BPS * coupon_period) - ) - else: - assert not value.accrued_interest - # TODO: validate day count factor - - -def test_fail_no_primary_distribution() -> None: - pass # TODO - - -def test_fail_invalid_holding_address() -> None: - pass # TODO - - -def test_fail_invalid_units() -> None: - pass # TODO - - -def test_fail_pending_coupon_payment() -> None: - pass # TODO diff --git a/tests/fixed_coupon_bond/test_get_coupon_rates.py b/tests/fixed_coupon_bond/test_get_coupon_rates.py deleted file mode 100644 index 3b23bd15..00000000 --- a/tests/fixed_coupon_bond/test_get_coupon_rates.py +++ /dev/null @@ -1,19 +0,0 @@ -from smart_contracts.artifacts.fixed_coupon_bond.fixed_coupon_bond_client import ( - FixedCouponBondClient, -) -from tests.utils import DAsaConfig - - -def test_pass_get_coupon_rates( - fixed_coupon_bond_cfg: DAsaConfig, - fixed_coupon_bond_client_active: FixedCouponBondClient, -) -> None: - coupon_rates = fixed_coupon_bond_client_active.send.get_coupon_rates().abi_return - assert coupon_rates == fixed_coupon_bond_cfg.coupon_rates - - -def test_pass_not_configured( - fixed_coupon_bond_client_empty: FixedCouponBondClient, -) -> None: - coupon_rates = fixed_coupon_bond_client_empty.send.get_coupon_rates().abi_return - assert not coupon_rates diff --git a/tests/fixed_coupon_bond/test_get_coupon_status.py b/tests/fixed_coupon_bond/test_get_coupon_status.py deleted file mode 100644 index 5d4f9727..00000000 --- a/tests/fixed_coupon_bond/test_get_coupon_status.py +++ /dev/null @@ -1,92 +0,0 @@ -from collections.abc import Callable -from typing import Final - -from smart_contracts import config as sc_cfg -from smart_contracts.artifacts.fixed_coupon_bond.fixed_coupon_bond_client import ( - FixedCouponBondClient, - PayCouponArgs, -) -from tests.utils import DAsaAccount, DAsaConfig, time_warp - -D_ASA_TEST_UNITS: Final[int] = 3 - - -def test_pass_get_coupon_status( - fixed_coupon_bond_cfg: DAsaConfig, - fixed_coupon_bond_client_primary: FixedCouponBondClient, - account_with_units_factory: Callable[..., DAsaAccount], -) -> None: - account = account_with_units_factory(units=D_ASA_TEST_UNITS) - - coupon_status = ( - fixed_coupon_bond_client_primary.send.get_coupons_status().abi_return - ) - print("Initial coupon status:") - print(coupon_status.__dict__) - assert coupon_status.total_coupons == fixed_coupon_bond_cfg.total_coupons - assert not coupon_status.due_coupons - assert ( - coupon_status.next_coupon_due_date - == fixed_coupon_bond_cfg.time_events[sc_cfg.FIRST_COUPON_DATE_IDX] - ) - assert coupon_status.all_due_coupons_paid - assert coupon_status.day_count_factor.numerator == 0 - assert coupon_status.day_count_factor.denominator == 0 - - for coupon in range(1, fixed_coupon_bond_cfg.total_coupons + 1): - next_coupon_date_idx = sc_cfg.FIRST_COUPON_DATE_IDX - 1 + coupon - next_coupon_due_date = fixed_coupon_bond_cfg.time_events[next_coupon_date_idx] - coupon_period = ( - fixed_coupon_bond_cfg.time_events[next_coupon_date_idx + 1] - - next_coupon_due_date - ) - coupon_period_fraction = 10 - time_warp(next_coupon_due_date + coupon_period // coupon_period_fraction) - - coupon_status = ( - fixed_coupon_bond_client_primary.send.get_coupons_status().abi_return - ) - print(f"Coupon status after {coupon} coupon due date:") - print(coupon_status.__dict__) - assert coupon_status.due_coupons == coupon - if coupon < fixed_coupon_bond_cfg.total_coupons: - assert ( - coupon_status.next_coupon_due_date - == fixed_coupon_bond_cfg.time_events[next_coupon_date_idx + 1] - ) - else: - assert not coupon_status.next_coupon_due_date - assert not coupon_status.all_due_coupons_paid - assert ( - coupon_status.day_count_factor.numerator - == coupon_status.day_count_factor.denominator // coupon_period_fraction - ) - - fixed_coupon_bond_client_primary.send.pay_coupon( - PayCouponArgs(holding_address=account.holding_address, payment_info=b""), - ) - coupon_status = ( - fixed_coupon_bond_client_primary.send.get_coupons_status().abi_return - ) - print(f"Coupon status after {coupon} coupon payment:") - print(coupon_status.__dict__) - assert coupon_status.due_coupons == coupon - if coupon < fixed_coupon_bond_cfg.total_coupons: - assert ( - coupon_status.next_coupon_due_date - == fixed_coupon_bond_cfg.time_events[next_coupon_date_idx + 1] - ) - else: - assert not coupon_status.next_coupon_due_date - assert coupon_status.all_due_coupons_paid - assert ( - coupon_status.day_count_factor.numerator - == coupon_status.day_count_factor.denominator // coupon_period_fraction - ) - - -def test_pass_not_configured( - fixed_coupon_bond_client_empty: FixedCouponBondClient, -) -> None: - coupon_status = fixed_coupon_bond_client_empty.send.get_coupons_status().abi_return - print(coupon_status.__dict__) diff --git a/tests/fixed_coupon_bond/test_get_payment_amount.py b/tests/fixed_coupon_bond/test_get_payment_amount.py deleted file mode 100644 index 110b5909..00000000 --- a/tests/fixed_coupon_bond/test_get_payment_amount.py +++ /dev/null @@ -1,94 +0,0 @@ -from collections.abc import Callable -from typing import Final - -import pytest -from algokit_utils import LogicError, SigningAccount - -from smart_contracts import config as sc_cfg -from smart_contracts import constants as sc_cst -from smart_contracts import errors as err -from smart_contracts.artifacts.fixed_coupon_bond.fixed_coupon_bond_client import ( - FixedCouponBondClient, - GetPaymentAmountArgs, - PayCouponArgs, -) -from tests.utils import Currency, DAsaAccount, DAsaConfig, time_warp - -D_ASA_TEST_UNITS: Final[int] = 3 - - -def test_pass_get_coupon_payment_amount( - currency: Currency, - fixed_coupon_bond_cfg: DAsaConfig, - fixed_coupon_bond_client_primary: FixedCouponBondClient, - account_with_units_factory: Callable[..., DAsaAccount], -) -> None: - account = account_with_units_factory(units=D_ASA_TEST_UNITS) - - time_events = fixed_coupon_bond_client_primary.send.get_time_events().abi_return - - coupon_rates = fixed_coupon_bond_client_primary.send.get_coupon_rates().abi_return - - print(f"Principal: {account.principal * currency.asa_to_unit:.2f} EUR") - for coupon in range(1, fixed_coupon_bond_cfg.total_coupons + 1): - payment_amount = fixed_coupon_bond_client_primary.send.get_payment_amount( - GetPaymentAmountArgs(holding_address=account.holding_address), - ).abi_return - coupon_rate_bps = coupon_rates[coupon - 1] - print(f"Coupon rate {coupon}:\t\t{coupon_rate_bps / 100:.2f}%") - print( - f"Coupon amount {coupon}:\t{payment_amount.interest * currency.asa_to_unit:.2f} EUR\n" - ) - assert ( - payment_amount.interest == account.principal * coupon_rate_bps // sc_cst.BPS - ) - assert payment_amount.principal == 0 - - # Coupon reaches due date - coupon_due_date = time_events[sc_cfg.FIRST_COUPON_DATE_IDX - 1 + coupon] - time_warp(coupon_due_date) - fixed_coupon_bond_client_primary.send.pay_coupon( - PayCouponArgs(holding_address=account.holding_address, payment_info=b"") - ) - - -def test_pass_get_principal_payment_amount( - currency: Currency, - fixed_coupon_bond_cfg: DAsaConfig, - fixed_coupon_bond_client_primary: FixedCouponBondClient, - account_with_coupons_factory: Callable[..., DAsaAccount], -) -> None: - # Account with all coupons paid and principal repayment left - account = account_with_coupons_factory() - - payment_amount = fixed_coupon_bond_client_primary.send.get_payment_amount( - GetPaymentAmountArgs(holding_address=account.holding_address), - ).abi_return - - print(f"Interest rate:\t\t{fixed_coupon_bond_cfg.interest_rate / 100:.2f}%") - print(f"Principal amount:\t{account.principal * currency.asa_to_unit:.2f} EUR") - print(f"Interest amount with principal:\t{0:.2f} EUR\n") - assert payment_amount.principal == account.principal - assert payment_amount.interest == 0 - - -def test_pass_not_configured( - fixed_coupon_bond_client_empty: FixedCouponBondClient, - account_factory: Callable[..., DAsaAccount], -) -> None: - account = account_factory(fixed_coupon_bond_client_empty) - payment_amount = fixed_coupon_bond_client_empty.send.get_payment_amount( - GetPaymentAmountArgs(holding_address=account.holding_address), - ).abi_return - assert payment_amount.interest == 0 - assert payment_amount.principal == 0 - - -def test_fail_invalid_holding_address( - no_role_account: SigningAccount, - fixed_coupon_bond_client_at_maturity: FixedCouponBondClient, -) -> None: - with pytest.raises(LogicError, match=err.INVALID_HOLDING_ADDRESS): - fixed_coupon_bond_client_at_maturity.send.get_payment_amount( - GetPaymentAmountArgs(holding_address=no_role_account.address), - ) diff --git a/tests/fixed_coupon_bond/test_pay_coupon.py b/tests/fixed_coupon_bond/test_pay_coupon.py deleted file mode 100644 index 03480f6b..00000000 --- a/tests/fixed_coupon_bond/test_pay_coupon.py +++ /dev/null @@ -1,279 +0,0 @@ -from collections.abc import Callable - -import pytest -from algokit_utils import LogicError, SigningAccount - -from smart_contracts import config as sc_cfg -from smart_contracts import errors as err -from smart_contracts.artifacts.fixed_coupon_bond.fixed_coupon_bond_client import ( - FixedCouponBondClient, - GetPaymentAmountArgs, - PayCouponArgs, -) -from tests.utils import Currency, DAsaAccount, DAsaConfig, time_warp - - -def test_pass_pay_coupon( - currency: Currency, - fixed_coupon_bond_cfg: DAsaConfig, - account_a: DAsaAccount, - account_b: DAsaAccount, - fixed_coupon_bond_client_ongoing: FixedCouponBondClient, -) -> None: - account_a_units = account_a.units - account_b_units = account_b.units - - time_events = fixed_coupon_bond_client_ongoing.send.get_time_events().abi_return - - for coupon in range(1, fixed_coupon_bond_cfg.total_coupons + 1): - print(f"Coupon {coupon} of {fixed_coupon_bond_cfg.total_coupons}") - due_coupons = ( - fixed_coupon_bond_client_ongoing.send.get_coupons_status().abi_return.due_coupons - ) - assert due_coupons == coupon - 1 - - # Pre payment sate - pre_payment_account_a_paid_coupons = account_a.paid_coupons - pre_payment_account_b_paid_coupons = account_a.paid_coupons - pre_payment_state = fixed_coupon_bond_client_ongoing.state.global_state - assert pre_payment_account_a_paid_coupons == due_coupons - assert pre_payment_account_b_paid_coupons == due_coupons - assert ( - pre_payment_state.paid_coupon_units - == account_a_units * pre_payment_account_a_paid_coupons - + account_b_units * pre_payment_account_b_paid_coupons - ) - - account_a_coupon_amount = ( - fixed_coupon_bond_client_ongoing.send.get_payment_amount( - GetPaymentAmountArgs(holding_address=account_a.holding_address), - ).abi_return.interest - ) - - account_b_coupon_amount = ( - fixed_coupon_bond_client_ongoing.send.get_payment_amount( - GetPaymentAmountArgs(holding_address=account_b.holding_address), - ).abi_return.interest - ) - - # Coupon reaches due date - coupon_due_date = time_events[sc_cfg.FIRST_COUPON_DATE_IDX - 1 + coupon] - time_warp(coupon_due_date) - due_coupons = ( - fixed_coupon_bond_client_ongoing.send.get_coupons_status().abi_return.due_coupons - ) - assert due_coupons == coupon - - # Coupon payment - payment_a = fixed_coupon_bond_client_ongoing.send.pay_coupon( - PayCouponArgs( - holding_address=account_a.holding_address, - payment_info=b"", - ), - ).abi_return - assert payment_a.amount == account_a_coupon_amount - print("Account A:") - print( - f"Paid amount: {payment_a.amount * currency.asa_to_unit:.2f} EUR, Due date: {coupon_due_date}, " - f"Payment timestamp: {payment_a.timestamp}" - ) - - payment_b = fixed_coupon_bond_client_ongoing.send.pay_coupon( - PayCouponArgs( - holding_address=account_b.holding_address, - payment_info=b"", - ), - ).abi_return - assert payment_b.amount == account_b_coupon_amount - print("Account B:") - print( - f"Paid amount: {payment_b.amount * currency.asa_to_unit:.2f} EUR, Due date: {coupon_due_date}, " - f"Payment timestamp: {payment_b.timestamp}\n" - ) - - # Post payment state - post_payment_account_a_paid_coupons = account_a.paid_coupons - post_payment_account_b_paid_coupons = account_b.paid_coupons - post_payment_state = fixed_coupon_bond_client_ongoing.state.global_state - assert ( - post_payment_account_a_paid_coupons - == pre_payment_account_a_paid_coupons + 1 - ) - assert ( - post_payment_account_b_paid_coupons - == pre_payment_account_b_paid_coupons + 1 - ) - assert ( - post_payment_state.paid_coupon_units - == account_a_units * post_payment_account_a_paid_coupons - + account_b_units * post_payment_account_b_paid_coupons - ) - # TODO: assert balance updates - - -def test_pass_pay_multiple_coupons( - currency: Currency, - fixed_coupon_bond_cfg: DAsaConfig, - account_a: DAsaAccount, - fixed_coupon_bond_client_at_maturity: FixedCouponBondClient, -) -> None: - account_units = account_a.units - - time_events = fixed_coupon_bond_client_at_maturity.send.get_time_events().abi_return - - due_coupons = ( - fixed_coupon_bond_client_at_maturity.send.get_coupons_status().abi_return.due_coupons - ) - assert due_coupons == fixed_coupon_bond_cfg.total_coupons - - for coupon in range(1, fixed_coupon_bond_cfg.total_coupons + 1): - print(f"Coupon {coupon} of {fixed_coupon_bond_cfg.total_coupons}") - coupon_amount = fixed_coupon_bond_client_at_maturity.send.get_payment_amount( - GetPaymentAmountArgs(holding_address=account_a.holding_address), - ).abi_return.interest - - # Pre payment sate - pre_payment_account_paid_coupons = account_a.paid_coupons - pre_payment_state = fixed_coupon_bond_client_at_maturity.state.global_state - assert ( - pre_payment_state.paid_coupon_units - == account_units * pre_payment_account_paid_coupons - ) - - # Coupon payment - coupon_due_date = time_events[sc_cfg.FIRST_COUPON_DATE_IDX - 1 + coupon] - payment = fixed_coupon_bond_client_at_maturity.send.pay_coupon( - PayCouponArgs( - holding_address=account_a.holding_address, - payment_info=b"", - ), - ).abi_return - assert payment.amount == coupon_amount - print( - f"Paid amount: {payment.amount * currency.asa_to_unit:.2f} EUR, Due date: {coupon_due_date}, " - f"Payment timestamp: {payment.timestamp}" - ) - - # Post payment state - post_payment_account_paid_coupons = account_a.paid_coupons - post_payment_state = fixed_coupon_bond_client_at_maturity.state.global_state - assert post_payment_account_paid_coupons == pre_payment_account_paid_coupons + 1 - assert ( - post_payment_state.paid_coupon_units - == account_units * post_payment_account_paid_coupons - ) - # TODO: assert balance updates - - -def test_pass_skip_suspended_account() -> None: - pass # TODO - - -def test_pass_skip_not_opted_in_account() -> None: - pass # TODO - - -def test_fail_unauthorized() -> None: - pass # TODO - - -def test_fail_unauthorized_status() -> None: - pass # TODO - - -def test_fail_defaulted_status() -> None: - pass # TODO - - -def test_fail_suspended() -> None: - pass # TODO - - -def test_fail_invalid_holding_address( - no_role_account: SigningAccount, - fixed_coupon_bond_client_at_maturity: FixedCouponBondClient, -) -> None: - with pytest.raises(LogicError, match=err.INVALID_HOLDING_ADDRESS): - fixed_coupon_bond_client_at_maturity.send.pay_coupon( - PayCouponArgs( - holding_address=no_role_account.address, - payment_info=b"", - ) - ) - - -def test_fail_no_units( - account_factory: Callable[..., DAsaAccount], - fixed_coupon_bond_client_primary: FixedCouponBondClient, -) -> None: - account = account_factory(fixed_coupon_bond_client_primary) - - with pytest.raises(LogicError, match=err.NO_UNITS): - fixed_coupon_bond_client_primary.send.pay_coupon( - PayCouponArgs( - holding_address=account.holding_address, - payment_info=b"", - ) - ) - - -def test_fail_no_due_coupon( - fixed_coupon_bond_cfg: DAsaConfig, - account_a: DAsaAccount, - fixed_coupon_bond_client_ongoing: FixedCouponBondClient, -) -> None: - time_events = fixed_coupon_bond_client_ongoing.send.get_time_events().abi_return - - for coupon in range(1, fixed_coupon_bond_cfg.total_coupons + 1): - with pytest.raises(LogicError, match=err.NO_DUE_COUPON): - fixed_coupon_bond_client_ongoing.send.pay_coupon( - PayCouponArgs( - holding_address=account_a.holding_address, - payment_info=b"", - ) - ) - coupon_due_date = time_events[sc_cfg.FIRST_COUPON_DATE_IDX - 1 + coupon] - time_warp(coupon_due_date) - fixed_coupon_bond_client_ongoing.send.pay_coupon( - PayCouponArgs( - holding_address=account_a.holding_address, - payment_info=b"", - ) - ) - - -def test_fail_pending_coupon_payment( - fixed_coupon_bond_cfg: DAsaConfig, - account_a: DAsaAccount, - account_b: DAsaAccount, - fixed_coupon_bond_client_at_maturity: FixedCouponBondClient, -) -> None: - for coupon in range(fixed_coupon_bond_cfg.total_coupons - 1): - if coupon % 2: - first_payee = account_a - second_payee = account_b - else: - first_payee = account_b - second_payee = account_a - - fixed_coupon_bond_client_at_maturity.send.pay_coupon( - PayCouponArgs( - holding_address=first_payee.holding_address, - payment_info=b"", - ) - ) - - with pytest.raises(LogicError, match=err.PENDING_COUPON_PAYMENT): - fixed_coupon_bond_client_at_maturity.send.pay_coupon( - PayCouponArgs( - holding_address=first_payee.holding_address, - payment_info=b"", - ) - ) - - fixed_coupon_bond_client_at_maturity.send.pay_coupon( - PayCouponArgs( - holding_address=second_payee.holding_address, - payment_info=b"", - ) - ) diff --git a/tests/fixed_coupon_bond/test_pay_principal.py b/tests/fixed_coupon_bond/test_pay_principal.py deleted file mode 100644 index 463edc8e..00000000 --- a/tests/fixed_coupon_bond/test_pay_principal.py +++ /dev/null @@ -1,162 +0,0 @@ -from collections.abc import Callable - -import pytest -from algokit_utils import LogicError, SigningAccount - -from smart_contracts import errors as err -from smart_contracts.artifacts.fixed_coupon_bond.fixed_coupon_bond_client import ( - AccountGetInfoArgs, - FixedCouponBondClient, - PayPrincipalArgs, -) -from tests.utils import ( - Currency, - DAsaAccount, - DAsaConfig, - get_latest_timestamp, - time_warp, -) - - -def test_pass_pay_principal( - currency: Currency, - account_with_coupons_factory: Callable[..., DAsaAccount], - fixed_coupon_bond_client_primary: FixedCouponBondClient, -) -> None: - account_all_coupons = account_with_coupons_factory( - units=fixed_coupon_bond_client_primary.state.global_state.total_units - ) - # Pre payment state - pre_payment_state = fixed_coupon_bond_client_primary.state.global_state - time_warp(pre_payment_state.maturity_date) - - pre_payment_account_info = fixed_coupon_bond_client_primary.send.account_get_info( - AccountGetInfoArgs(holding_address=account_all_coupons.holding_address), - ).abi_return - - pre_payment_account_principal = account_all_coupons.principal - - maturity_date = pre_payment_state.maturity_date - pre_payment_account_units = pre_payment_account_info.units - pre_payment_circulating_units = pre_payment_state.circulating_units - assert ( - get_latest_timestamp(fixed_coupon_bond_client_primary.algorand.client.algod) - >= maturity_date - ) - - # Principal payment - payment = fixed_coupon_bond_client_primary.send.pay_principal( - PayPrincipalArgs( - holding_address=account_all_coupons.holding_address, - payment_info=b"", - ), - ).abi_return - - assert payment.amount == pre_payment_account_principal - print( - f"Paid amount: {payment.amount * currency.asa_to_unit:.2f} EUR, Maturity date: {maturity_date}, " - f"Payment timestamp: {payment.timestamp}" - ) - - # Post payment state - post_payment_state = fixed_coupon_bond_client_primary.state.global_state - - post_payment_account_info = fixed_coupon_bond_client_primary.send.account_get_info( - AccountGetInfoArgs(holding_address=account_all_coupons.holding_address), - ).abi_return - - assert ( - post_payment_state.circulating_units - == pre_payment_circulating_units - pre_payment_account_units - ) - assert post_payment_account_info.units == 0 - # TODO: assert balance updates - # TODO: assert STATUS_ENDED - - -def test_pass_skip_suspended_account() -> None: - pass # TODO - - -def test_pass_skip_not_opted_in_account() -> None: - pass # TODO - - -def test_fail_unauthorized() -> None: - pass # TODO - - -def test_fail_unauthorized_status() -> None: - pass # TODO - - -def test_fail_defaulted_status() -> None: - pass # TODO - - -def test_fail_suspended() -> None: - pass # TODO - - -def test_fail_invalid_holding_address( - no_role_account: SigningAccount, - fixed_coupon_bond_client_at_maturity: FixedCouponBondClient, -) -> None: - with pytest.raises(LogicError, match=err.INVALID_HOLDING_ADDRESS): - fixed_coupon_bond_client_at_maturity.send.pay_principal( - PayPrincipalArgs( - holding_address=no_role_account.address, - payment_info=b"", - ) - ) - - -def test_fail_no_units( - account_factory: Callable[..., DAsaAccount], - fixed_coupon_bond_client_primary: FixedCouponBondClient, -) -> None: - account = account_factory(fixed_coupon_bond_client_primary) - - with pytest.raises(LogicError, match=err.NO_UNITS): - fixed_coupon_bond_client_primary.send.pay_principal( - PayPrincipalArgs( - holding_address=account.holding_address, - payment_info=b"", - ) - ) - - -def test_fail_not_mature( - account_with_coupons_factory: Callable[..., DAsaAccount], - fixed_coupon_bond_client_primary: FixedCouponBondClient, -) -> None: - account_all_coupons = account_with_coupons_factory() - with pytest.raises(LogicError, match=err.NOT_MATURE): - fixed_coupon_bond_client_primary.send.pay_principal( - PayPrincipalArgs( - holding_address=account_all_coupons.holding_address, - payment_info=b"", - ) - ) - - -def test_fail_pending_coupon_payment( - fixed_coupon_bond_cfg: DAsaConfig, - account_with_coupons_factory: Callable[..., DAsaAccount], - fixed_coupon_bond_client_primary: FixedCouponBondClient, -) -> None: - account = account_with_coupons_factory( - coupons=fixed_coupon_bond_cfg.total_coupons - 1 - ) - state = fixed_coupon_bond_client_primary.state.global_state - time_warp(state.maturity_date) - with pytest.raises(LogicError, match=err.PENDING_COUPON_PAYMENT): - fixed_coupon_bond_client_primary.send.pay_principal( - PayPrincipalArgs( - holding_address=account.holding_address, - payment_info=b"", - ) - ) - - -# TODO: Test the scenario where maturity is reached, an account has a coupon pending but that account is closed diff --git a/tests/fixed_coupon_bond/test_sub_accrued_interest_amount.py b/tests/fixed_coupon_bond/test_sub_accrued_interest_amount.py deleted file mode 100644 index 8e519ca6..00000000 --- a/tests/fixed_coupon_bond/test_sub_accrued_interest_amount.py +++ /dev/null @@ -1,104 +0,0 @@ -from typing import Final - -from smart_contracts.artifacts.fixed_coupon_bond.fixed_coupon_bond_client import ( - FixedCouponBondClient, - GetAccountUnitsCurrentValueArgs, - GetPaymentAmountArgs, - PayCouponArgs, -) -from tests.utils import Currency, DAsaAccount, get_latest_timestamp, time_warp - -TEST_UNITS: Final[int] = 3 - -# TODO: Add Actual/Actual DDC tests - - -def test_from_issuance( - account_a: DAsaAccount, - fixed_coupon_bond_client_ongoing: FixedCouponBondClient, -) -> None: - current_date = get_latest_timestamp( - fixed_coupon_bond_client_ongoing.algorand.client.algod - ) - next_coupon_due_date = ( - fixed_coupon_bond_client_ongoing.send.get_coupons_status().abi_return.next_coupon_due_date - ) - state = fixed_coupon_bond_client_ongoing.state.global_state - assert current_date == state.issuance_date - - # Coupon accrued half period - half_coupon_period = (next_coupon_due_date - current_date) // 2 - time_warp(current_date + half_coupon_period) - due_coupons = ( - fixed_coupon_bond_client_ongoing.send.get_coupons_status().abi_return.due_coupons - ) - assert due_coupons == 0 - - accrued_interest = ( - fixed_coupon_bond_client_ongoing.send.get_account_units_current_value( - GetAccountUnitsCurrentValueArgs( - holding_address=account_a.holding_address, - units=account_a.units, - ) - ).abi_return.accrued_interest - ) - - coupon_amount = fixed_coupon_bond_client_ongoing.send.get_payment_amount( - GetPaymentAmountArgs(holding_address=account_a.holding_address) - ).abi_return.interest - assert accrued_interest == coupon_amount // 2 - - -def test_from_latest_coupon_due_date( - currency: Currency, - account_a: DAsaAccount, - fixed_coupon_bond_client_ongoing: FixedCouponBondClient, -) -> None: - first_coupon_due_date = ( - fixed_coupon_bond_client_ongoing.send.get_coupons_status().abi_return.next_coupon_due_date - ) - time_warp(first_coupon_due_date) - current_date = get_latest_timestamp( - fixed_coupon_bond_client_ongoing.algorand.client.algod - ) - assert current_date == first_coupon_due_date - fixed_coupon_bond_client_ongoing.send.pay_coupon( - PayCouponArgs( - holding_address=account_a.holding_address, - payment_info=b"", - ) - ) - - next_coupon_due_date = ( - fixed_coupon_bond_client_ongoing.send.get_coupons_status().abi_return.next_coupon_due_date - ) - - # Coupon accrued a tenth of period - tenth_coupon_period = (next_coupon_due_date - current_date) // 10 - time_warp(current_date + tenth_coupon_period) - due_coupons = ( - fixed_coupon_bond_client_ongoing.send.get_coupons_status().abi_return.due_coupons - ) - assert due_coupons == 1 - - accrued_interest = ( - fixed_coupon_bond_client_ongoing.send.get_account_units_current_value( - GetAccountUnitsCurrentValueArgs( - holding_address=account_a.holding_address, - units=account_a.units, - ), - ).abi_return.accrued_interest - ) - - coupon_amount = fixed_coupon_bond_client_ongoing.send.get_payment_amount( - GetPaymentAmountArgs(holding_address=account_a.holding_address), - ).abi_return.interest - assert accrued_interest == coupon_amount // 10 - - -def test_on_coupon_due_date() -> None: - pass # TODO: Must be tested directly at subroutine level, not through get_payment_amount - - -def test_fail_pending_coupon_payment() -> None: - pass # TODO diff --git a/tests/fixed_coupon_bond/test_sub_all_due_coupons_paid.py b/tests/fixed_coupon_bond/test_sub_all_due_coupons_paid.py deleted file mode 100644 index 2a70630a..00000000 --- a/tests/fixed_coupon_bond/test_sub_all_due_coupons_paid.py +++ /dev/null @@ -1,56 +0,0 @@ -from algokit_utils import AlgorandClient - -from smart_contracts import config as sc_cfg -from smart_contracts.artifacts.fixed_coupon_bond.fixed_coupon_bond_client import ( - FixedCouponBondClient, - PayCouponArgs, -) -from tests.utils import DAsaAccount, DAsaConfig, time_warp - - -def test_all_due_coupons_paid( - algorand: AlgorandClient, - fixed_coupon_bond_cfg: DAsaConfig, - account_a: DAsaAccount, - account_b: DAsaAccount, - fixed_coupon_bond_client_ongoing: FixedCouponBondClient, -) -> None: - time_events = fixed_coupon_bond_client_ongoing.send.get_time_events().abi_return - - for coupon in range(1, fixed_coupon_bond_cfg.total_coupons + 1): - all_paid = ( - fixed_coupon_bond_client_ongoing.send.get_coupons_status().abi_return.all_due_coupons_paid - ) - assert all_paid - - # Coupon reaches due date - coupon_due_date = time_events[sc_cfg.FIRST_COUPON_DATE_IDX - 1 + coupon] - time_warp(coupon_due_date) - all_paid = ( - fixed_coupon_bond_client_ongoing.send.get_coupons_status().abi_return.all_due_coupons_paid - ) - assert not all_paid - - # Coupon payment - fixed_coupon_bond_client_ongoing.send.pay_coupon( - PayCouponArgs( - holding_address=account_a.holding_address, - payment_info=b"", - ) - ) - - all_paid = ( - fixed_coupon_bond_client_ongoing.send.get_coupons_status().abi_return.all_due_coupons_paid - ) - assert not all_paid - - fixed_coupon_bond_client_ongoing.send.pay_coupon( - PayCouponArgs( - holding_address=account_b.holding_address, - payment_info=b"", - ), - ) - all_paid = ( - fixed_coupon_bond_client_ongoing.send.get_coupons_status().abi_return.all_due_coupons_paid - ) - assert all_paid diff --git a/tests/fixed_coupon_bond/test_sub_count_due_coupons.py b/tests/fixed_coupon_bond/test_sub_count_due_coupons.py deleted file mode 100644 index 706ad194..00000000 --- a/tests/fixed_coupon_bond/test_sub_count_due_coupons.py +++ /dev/null @@ -1,45 +0,0 @@ -from algokit_utils import CommonAppCallParams, SendParams, SigningAccount - -from smart_contracts import config as sc_cfg -from smart_contracts.artifacts.fixed_coupon_bond.fixed_coupon_bond_client import ( - FixedCouponBondClient, -) -from tests.utils import DAsaConfig, max_fee_per_coupon, time_warp - - -def test_count_due_coupons_before_issuance( - fixed_coupon_bond_client_primary: FixedCouponBondClient, -) -> None: - due_coupons = ( - fixed_coupon_bond_client_primary.send.get_coupons_status().abi_return.due_coupons - ) - assert due_coupons == 0 - - -def test_count_due_coupons_ongoing( - arranger: SigningAccount, - fixed_coupon_bond_cfg: DAsaConfig, - fixed_coupon_bond_client_ongoing: FixedCouponBondClient, -) -> None: - time_events = fixed_coupon_bond_client_ongoing.send.get_time_events().abi_return - for coupon in range(1, fixed_coupon_bond_cfg.total_coupons + 1): - coupon_due_date = time_events[sc_cfg.FIRST_COUPON_DATE_IDX - 1 + coupon] - time_warp(coupon_due_date) - due_coupons = fixed_coupon_bond_client_ongoing.send.get_coupons_status( - params=CommonAppCallParams( - max_fee=max_fee_per_coupon(fixed_coupon_bond_cfg.total_coupons) - ), - send_params=SendParams(cover_app_call_inner_transaction_fees=True), - ).abi_return.due_coupons - print("Due coupons: ", due_coupons) - assert due_coupons == coupon - - -def test_count_due_coupons_at_maturity( - fixed_coupon_bond_cfg: DAsaConfig, - fixed_coupon_bond_client_at_maturity: FixedCouponBondClient, -) -> None: - due_coupons = ( - fixed_coupon_bond_client_at_maturity.send.get_coupons_status().abi_return.due_coupons - ) - assert due_coupons == fixed_coupon_bond_cfg.total_coupons diff --git a/tests/fixed_coupon_bond/test_sub_latest_coupon_date.py b/tests/fixed_coupon_bond/test_sub_latest_coupon_date.py deleted file mode 100644 index 46409041..00000000 --- a/tests/fixed_coupon_bond/test_sub_latest_coupon_date.py +++ /dev/null @@ -1 +0,0 @@ -# TODO diff --git a/tests/fixed_coupon_bond/test_sub_next_coupon_due_date.py b/tests/fixed_coupon_bond/test_sub_next_coupon_due_date.py deleted file mode 100644 index b42ac9fb..00000000 --- a/tests/fixed_coupon_bond/test_sub_next_coupon_due_date.py +++ /dev/null @@ -1,53 +0,0 @@ -from algokit_utils import ( - AlgorandClient, - CommonAppCallParams, - SendParams, - SigningAccount, -) - -from smart_contracts import config as sc_cfg -from smart_contracts.artifacts.fixed_coupon_bond.fixed_coupon_bond_client import ( - FixedCouponBondClient, -) -from tests.utils import DAsaConfig, max_fee_per_coupon, time_warp - -TIME_LEFT_TO_DUE_DATE = 100 # Seconds - - -def test_next_coupon_due_date_before_issuance( - fixed_coupon_bond_client_primary: FixedCouponBondClient, -) -> None: - time_events = fixed_coupon_bond_client_primary.send.get_time_events().abi_return - next_coupon_due_date = ( - fixed_coupon_bond_client_primary.send.get_coupons_status().abi_return.next_coupon_due_date - ) - assert next_coupon_due_date == time_events[sc_cfg.FIRST_COUPON_DATE_IDX] - - -def test_next_coupon_due_date_ongoing( - algorand: AlgorandClient, - arranger: SigningAccount, - fixed_coupon_bond_cfg: DAsaConfig, - fixed_coupon_bond_client_ongoing: FixedCouponBondClient, -) -> None: - time_events = fixed_coupon_bond_client_ongoing.send.get_time_events().abi_return - for coupon in range(1, fixed_coupon_bond_cfg.total_coupons + 1): - coupon_due_date = time_events[sc_cfg.FIRST_COUPON_DATE_IDX - 1 + coupon] - time_warp(coupon_due_date - TIME_LEFT_TO_DUE_DATE) - next_coupon_due_date = fixed_coupon_bond_client_ongoing.send.get_coupons_status( - params=CommonAppCallParams( - max_fee=max_fee_per_coupon(fixed_coupon_bond_cfg.total_coupons) - ), - send_params=SendParams(cover_app_call_inner_transaction_fees=True), - ).abi_return.next_coupon_due_date - print("Next coupon due date: ", next_coupon_due_date) - assert next_coupon_due_date == coupon_due_date - - -def test_next_coupon_due_date_at_maturity( - fixed_coupon_bond_client_at_maturity: FixedCouponBondClient, -) -> None: - next_coupon_due_date = ( - fixed_coupon_bond_client_at_maturity.send.get_coupons_status().abi_return.next_coupon_due_date - ) - assert next_coupon_due_date == 0 diff --git a/tests/mock_module_accounting/__init__.py b/tests/mock_module_accounting/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/tests/mock_module_accounting/conftest.py b/tests/mock_module_accounting/conftest.py deleted file mode 100644 index c6c1eceb..00000000 --- a/tests/mock_module_accounting/conftest.py +++ /dev/null @@ -1,81 +0,0 @@ -import pytest -from algokit_utils import ( - AlgorandClient, - SigningAccount, -) - -from smart_contracts.artifacts.mock_module_accounting.mock_accounting_module_client import ( - MockAccountingModuleClient, - MockAccountingModuleFactory, - RbacAssignRoleArgs, -) -from tests import conftest_helpers as helpers -from tests import utils -from tests.shared import conftest as shared_fixtures - -contract_case = shared_fixtures.contract_case -shared_asset_metadata = shared_fixtures.shared_asset_metadata -shared_time_events = shared_fixtures.shared_time_events -shared_cfg = shared_fixtures.shared_cfg -shared_client_empty = shared_fixtures.shared_client_empty -shared_account_manager = shared_fixtures.shared_account_manager -shared_authority = shared_fixtures.shared_authority -shared_trustee = shared_fixtures.shared_trustee -shared_interest_oracle = shared_fixtures.shared_interest_oracle -shared_client_active = shared_fixtures.shared_client_active -shared_primary_dealer = shared_fixtures.shared_primary_dealer -shared_account_factory = shared_fixtures.shared_account_factory -shared_client_primary = shared_fixtures.shared_client_primary -shared_account_with_units_factory = shared_fixtures.shared_account_with_units_factory -shared_account_a = shared_fixtures.shared_account_a -shared_account_b = shared_fixtures.shared_account_b -shared_client_ongoing = shared_fixtures.shared_client_ongoing - - -@pytest.fixture(scope="function") -def accounting_client( - algorand: AlgorandClient, - arranger: SigningAccount, -) -> MockAccountingModuleClient: - return helpers.create_bare_client_and_fund( - algorand, MockAccountingModuleFactory, arranger - ) - - -@pytest.fixture(scope="function") -def account_manager( - algorand: AlgorandClient, - accounting_client: MockAccountingModuleClient, -) -> utils.DAsaAccountManager: - return helpers.create_role_account( - algorand, - utils.DAsaAccountManager, - accounting_client, - rbac_assign_role_args_class=RbacAssignRoleArgs, - ) - - -@pytest.fixture(scope="function") -def authority( - algorand: AlgorandClient, - accounting_client: MockAccountingModuleClient, -) -> utils.DAsaAuthority: - return helpers.create_role_account( - algorand, - utils.DAsaAuthority, - accounting_client, - rbac_assign_role_args_class=RbacAssignRoleArgs, - ) - - -@pytest.fixture(scope="function") -def trustee( - algorand: AlgorandClient, - accounting_client: MockAccountingModuleClient, -) -> utils.DAsaTrustee: - return helpers.create_role_account( - algorand, - utils.DAsaTrustee, - accounting_client, - rbac_assign_role_args_class=RbacAssignRoleArgs, - ) diff --git a/tests/mock_module_accounting/test_account_close.py b/tests/mock_module_accounting/test_account_close.py deleted file mode 100644 index f0ab1945..00000000 --- a/tests/mock_module_accounting/test_account_close.py +++ /dev/null @@ -1,141 +0,0 @@ -import pytest -from algokit_utils import CommonAppCallParams, LogicError, SigningAccount - -from smart_contracts import errors as err -from smart_contracts.artifacts.mock_module_accounting.mock_accounting_module_client import ( - AccountCloseArgs, - AccountOpenArgs, - MockAccountingModuleClient, -) -from tests.utils import DAsaAccountManager - - -def test_pass_close_account( - no_role_account: SigningAccount, - account_manager: DAsaAccountManager, - accounting_client: MockAccountingModuleClient, -) -> None: - accounting_client.send.account_open( - AccountOpenArgs( - holding_address=no_role_account.address, - payment_address=no_role_account.address, - ), - params=CommonAppCallParams(sender=account_manager.address), - ) - - close_result = accounting_client.send.account_close( - AccountCloseArgs(holding_address=no_role_account.address), - params=CommonAppCallParams(sender=account_manager.address), - ).abi_return - assert close_result[0] == 0 - - with pytest.raises(LogicError, match=err.INVALID_HOLDING_ADDRESS): - accounting_client.send.account_close( - AccountCloseArgs(holding_address=no_role_account.address), - params=CommonAppCallParams(sender=account_manager.address), - ) - - -def test_fail_unauthorized_caller( - no_role_account: SigningAccount, - account_manager: DAsaAccountManager, - accounting_client: MockAccountingModuleClient, -) -> None: - accounting_client.send.account_open( - AccountOpenArgs( - holding_address=no_role_account.address, - payment_address=no_role_account.address, - ), - params=CommonAppCallParams(sender=account_manager.address), - ) - - with pytest.raises(LogicError, match=err.UNAUTHORIZED): - accounting_client.send.account_close( - AccountCloseArgs(holding_address=no_role_account.address), - params=CommonAppCallParams(sender=no_role_account.address), - ) - - -def test_fail_unauthorized_status( - no_role_account: SigningAccount, - accounting_client: MockAccountingModuleClient, -) -> None: - with pytest.raises(LogicError, match=err.UNAUTHORIZED): - accounting_client.send.account_close( - AccountCloseArgs(holding_address=no_role_account.address), - params=CommonAppCallParams(sender=no_role_account.address), - ) - - -def test_fail_invalid_holding_address( - no_role_account: SigningAccount, - account_manager: DAsaAccountManager, - accounting_client: MockAccountingModuleClient, -) -> None: - with pytest.raises(LogicError, match=err.INVALID_HOLDING_ADDRESS): - accounting_client.send.account_close( - AccountCloseArgs(holding_address=no_role_account.address), - params=CommonAppCallParams(sender=account_manager.address), - ) - - -def test_concrete_pass_close_account( - shared_account_manager, - shared_account_factory, - shared_client_active, -) -> None: - account = shared_account_factory(shared_client_active) - close_result = shared_client_active.send.account_close( - (account.holding_address,), - params=CommonAppCallParams(sender=shared_account_manager.address), - ).abi_return - assert close_result[0] == 0 - - with pytest.raises(LogicError, match=err.INVALID_HOLDING_ADDRESS): - shared_client_active.send.account_close( - (account.holding_address,), - params=CommonAppCallParams(sender=shared_account_manager.address), - ) - - -def test_concrete_fail_unauthorized_caller( - no_role_account: SigningAccount, - shared_account_factory, - shared_client_active, -) -> None: - account = shared_account_factory(shared_client_active) - with pytest.raises(LogicError, match=err.UNAUTHORIZED): - shared_client_active.send.account_close( - (account.holding_address,), - params=CommonAppCallParams(sender=no_role_account.address), - ) - - -def test_concrete_fail_defaulted_status( - shared_trustee, - shared_account_manager, - shared_account_factory, - shared_client_active, -) -> None: - account = shared_account_factory(shared_client_active) - shared_client_active.send.set_default_status( - (True,), - params=CommonAppCallParams(sender=shared_trustee.address), - ) - with pytest.raises(LogicError, match=err.DEFAULTED): - shared_client_active.send.account_close( - (account.holding_address,), - params=CommonAppCallParams(sender=shared_account_manager.address), - ) - - -def test_concrete_fail_invalid_holding_address( - no_role_account: SigningAccount, - shared_account_manager, - shared_client_active, -) -> None: - with pytest.raises(LogicError, match=err.INVALID_HOLDING_ADDRESS): - shared_client_active.send.account_close( - (no_role_account.address,), - params=CommonAppCallParams(sender=shared_account_manager.address), - ) diff --git a/tests/mock_module_accounting/test_account_get_info.py b/tests/mock_module_accounting/test_account_get_info.py deleted file mode 100644 index 82246218..00000000 --- a/tests/mock_module_accounting/test_account_get_info.py +++ /dev/null @@ -1,66 +0,0 @@ -import pytest -from algokit_utils import CommonAppCallParams, LogicError, SigningAccount - -from smart_contracts import errors as err -from smart_contracts.artifacts.mock_module_accounting.mock_accounting_module_client import ( - AccountGetInfoArgs, - AccountOpenArgs, - MockAccountingModuleClient, -) -from tests.utils import DAsaAccountManager - - -def test_pass_account_get_info( - no_role_account: SigningAccount, - account_manager: DAsaAccountManager, - accounting_client: MockAccountingModuleClient, -) -> None: - accounting_client.send.account_open( - AccountOpenArgs( - holding_address=no_role_account.address, - payment_address=no_role_account.address, - ), - params=CommonAppCallParams(sender=account_manager.address), - ) - - account_info = accounting_client.send.account_get_info( - AccountGetInfoArgs(holding_address=no_role_account.address) - ).abi_return - assert account_info.payment_address == no_role_account.address - assert account_info.units == 0 - assert account_info.unit_value == 0 - assert account_info.paid_coupons == 0 - assert not account_info.suspended - - -def test_fail_invalid_holding_address( - no_role_account: SigningAccount, - accounting_client: MockAccountingModuleClient, -) -> None: - with pytest.raises(LogicError, match=err.INVALID_HOLDING_ADDRESS): - accounting_client.send.account_get_info( - AccountGetInfoArgs(holding_address=no_role_account.address) - ) - - -def test_concrete_pass_account_get_info( - shared_account_factory, - shared_client_active, -) -> None: - account = shared_account_factory(shared_client_active) - account_info = shared_client_active.send.account_get_info( - (account.holding_address,) - ).abi_return - assert account_info.payment_address == account.holding_address - assert account_info.units == 0 - assert account_info.unit_value == 0 - assert account_info.paid_coupons == 0 - assert not account_info.suspended - - -def test_concrete_fail_invalid_holding_address( - no_role_account: SigningAccount, - shared_client_active, -) -> None: - with pytest.raises(LogicError, match=err.INVALID_HOLDING_ADDRESS): - shared_client_active.send.account_get_info((no_role_account.address,)) diff --git a/tests/mock_module_accounting/test_account_gov_suspension.py b/tests/mock_module_accounting/test_account_gov_suspension.py deleted file mode 100644 index 32ede387..00000000 --- a/tests/mock_module_accounting/test_account_gov_suspension.py +++ /dev/null @@ -1,118 +0,0 @@ -import pytest -from algokit_utils import CommonAppCallParams, LogicError, SigningAccount - -from smart_contracts import errors as err -from smart_contracts.artifacts.mock_module_accounting.mock_accounting_module_client import ( - AccountGetInfoArgs, - AccountGovSuspensionArgs, - AccountOpenArgs, - MockAccountingModuleClient, -) -from tests.utils import DAsaAccountManager, DAsaAuthority - - -def test_pass_account_gov_suspension( - authority: DAsaAuthority, - no_role_account: SigningAccount, - account_manager: DAsaAccountManager, - accounting_client: MockAccountingModuleClient, -) -> None: - accounting_client.send.account_open( - AccountOpenArgs( - holding_address=no_role_account.address, - payment_address=no_role_account.address, - ), - params=CommonAppCallParams(sender=account_manager.address), - ) - - accounting_client.send.account_gov_suspension( - AccountGovSuspensionArgs( - holding_address=no_role_account.address, - suspended=True, - ), - params=CommonAppCallParams(sender=authority.address), - ) - - account_info = accounting_client.send.account_get_info( - AccountGetInfoArgs(holding_address=no_role_account.address) - ).abi_return - assert account_info.suspended - - -def test_fail_unauthorized( - no_role_account: SigningAccount, - accounting_client: MockAccountingModuleClient, -) -> None: - with pytest.raises(LogicError, match=err.UNAUTHORIZED): - accounting_client.send.account_gov_suspension( - AccountGovSuspensionArgs( - holding_address=no_role_account.address, - suspended=True, - ), - params=CommonAppCallParams(sender=no_role_account.address), - ) - - -def test_fail_invalid_holding_address( - authority: DAsaAuthority, - no_role_account: SigningAccount, - accounting_client: MockAccountingModuleClient, -) -> None: - with pytest.raises(LogicError, match=err.INVALID_HOLDING_ADDRESS): - accounting_client.send.account_gov_suspension( - AccountGovSuspensionArgs( - holding_address=no_role_account.address, - suspended=True, - ), - params=CommonAppCallParams(sender=authority.address), - ) - - -def test_concrete_pass_account_gov_suspension( - shared_authority, - shared_account_factory, - shared_client_active, -) -> None: - account = shared_account_factory(shared_client_active) - shared_client_active.send.account_gov_suspension( - (account.holding_address, True), - params=CommonAppCallParams(sender=shared_authority.address), - ) - account_info = shared_client_active.send.account_get_info( - (account.holding_address,) - ).abi_return - assert account_info.suspended - - shared_client_active.send.account_gov_suspension( - (account.holding_address, False), - params=CommonAppCallParams(sender=shared_authority.address), - ) - account_info = shared_client_active.send.account_get_info( - (account.holding_address,) - ).abi_return - assert not account_info.suspended - - -def test_concrete_fail_unauthorized( - no_role_account: SigningAccount, - shared_account_factory, - shared_client_active, -) -> None: - account = shared_account_factory(shared_client_active) - with pytest.raises(LogicError, match=err.UNAUTHORIZED): - shared_client_active.send.account_gov_suspension( - (account.holding_address, True), - params=CommonAppCallParams(sender=no_role_account.address), - ) - - -def test_concrete_fail_invalid_holding_address( - no_role_account: SigningAccount, - shared_authority, - shared_client_active, -) -> None: - with pytest.raises(LogicError, match=err.INVALID_HOLDING_ADDRESS): - shared_client_active.send.account_gov_suspension( - (no_role_account.address, True), - params=CommonAppCallParams(sender=shared_authority.address), - ) diff --git a/tests/mock_module_accounting/test_account_open.py b/tests/mock_module_accounting/test_account_open.py deleted file mode 100644 index 252847bd..00000000 --- a/tests/mock_module_accounting/test_account_open.py +++ /dev/null @@ -1,228 +0,0 @@ -from typing import Any, Final - -import pytest -from algokit_utils import ( - AlgorandClient, - CommonAppCallParams, - LogicError, - SigningAccount, -) - -from smart_contracts import errors as err -from smart_contracts.artifacts.mock_module_accounting.mock_accounting_module_client import ( - AccountCloseArgs, - AccountGetInfoArgs, - AccountOpenArgs, - MockAccountingModuleClient, - RbacGovAssetSuspensionArgs, -) -from tests.utils import DAsaAccountManager, DAsaAuthority - -ACCOUNT_TEST_UNITS: Final[int] = 7 - - -def test_pass_account_open( - no_role_account: SigningAccount, - accounting_client: MockAccountingModuleClient, - account_manager: DAsaAccountManager, -) -> None: - accounting_client.send.account_open( - AccountOpenArgs( - holding_address=no_role_account.address, - payment_address=no_role_account.address, - ), - params=CommonAppCallParams( - sender=account_manager.address, - ), - ) - - d_asa_account_info = accounting_client.send.account_get_info( - AccountGetInfoArgs( - holding_address=no_role_account.address, - ), - params=CommonAppCallParams( - sender=account_manager.address, - ), - ).abi_return - - assert d_asa_account_info.payment_address == no_role_account.address - assert d_asa_account_info.units == 0 - assert d_asa_account_info.unit_value == 0 - assert d_asa_account_info.paid_coupons == 0 - assert not d_asa_account_info.suspended - - -def test_fail_unauthorized_caller( - no_role_account: SigningAccount, - accounting_client: MockAccountingModuleClient, -) -> None: - with pytest.raises(LogicError, match=err.UNAUTHORIZED): - accounting_client.send.account_open( - AccountOpenArgs( - holding_address=no_role_account.address, - payment_address=no_role_account.address, - ), - params=CommonAppCallParams( - sender=no_role_account.address, - ), - ) - - -def test_fail_unauthorized_status( - no_role_account: SigningAccount, - account_manager: DAsaAccountManager, - accounting_client: MockAccountingModuleClient, -) -> None: - accounting_client.send.account_open( - AccountOpenArgs( - holding_address=no_role_account.address, - payment_address=no_role_account.address, - ), - params=CommonAppCallParams(sender=account_manager.address), - ) - accounting_client.send.account_close( - AccountCloseArgs(holding_address=no_role_account.address), - params=CommonAppCallParams(sender=account_manager.address), - ) - with pytest.raises(LogicError, match=err.UNAUTHORIZED): - accounting_client.send.account_open( - AccountOpenArgs( - holding_address=no_role_account.address, - payment_address=no_role_account.address, - ), - params=CommonAppCallParams(sender=account_manager.address), - ) - - -def test_fail_suspended( - arranger: SigningAccount, - no_role_account: SigningAccount, - authority: DAsaAuthority, - account_manager: DAsaAccountManager, - accounting_client: MockAccountingModuleClient, -) -> None: - accounting_client.send.rbac_gov_asset_suspension( - RbacGovAssetSuspensionArgs(suspended=True), - params=CommonAppCallParams( - sender=authority.address, - ), - ) - with pytest.raises(LogicError, match=err.SUSPENDED): - accounting_client.send.account_open( - AccountOpenArgs( - holding_address=no_role_account.address, - payment_address=no_role_account.address, - ), - params=CommonAppCallParams( - sender=account_manager.address, - ), - ) - - -def test_fail_invalid_holding_address( - no_role_account: SigningAccount, - account_manager: DAsaAccountManager, - accounting_client: MockAccountingModuleClient, -) -> None: - accounting_client.send.account_open( - AccountOpenArgs( - holding_address=no_role_account.address, - payment_address=no_role_account.address, - ), - params=CommonAppCallParams( - sender=account_manager.address, - ), - ) - - with pytest.raises(LogicError, match=err.INVALID_HOLDING_ADDRESS): - accounting_client.send.account_open( - AccountOpenArgs( - holding_address=no_role_account.address, - payment_address=no_role_account.address, - ), - params=CommonAppCallParams( - sender=account_manager.address, - ), - ) - - -def test_concrete_pass_account_open( - algorand: AlgorandClient, - shared_account_manager, - shared_client_active: Any, -) -> None: - account = algorand.account.random() - shared_client_active.send.account_open( - (account.address, account.address), - params=CommonAppCallParams(sender=shared_account_manager.address), - ) - account_info = shared_client_active.send.account_get_info( - (account.address,) - ).abi_return - assert account_info.payment_address == account.address - assert account_info.units == 0 - assert account_info.unit_value == 0 - assert account_info.paid_coupons == 0 - assert not account_info.suspended - - -def test_concrete_fail_unauthorized( - algorand: AlgorandClient, - no_role_account: SigningAccount, - shared_client_active: Any, -) -> None: - account = algorand.account.random() - with pytest.raises(LogicError, match=err.UNAUTHORIZED): - shared_client_active.send.account_open( - (account.address, account.address), - params=CommonAppCallParams(sender=no_role_account.address), - ) - - -def test_concrete_fail_defaulted_status( - algorand: AlgorandClient, - shared_account_manager, - shared_trustee, - shared_client_active: Any, -) -> None: - account = algorand.account.random() - shared_client_active.send.set_default_status( - (True,), - params=CommonAppCallParams(sender=shared_trustee.address), - ) - with pytest.raises(LogicError, match=err.DEFAULTED): - shared_client_active.send.account_open( - (account.address, account.address), - params=CommonAppCallParams(sender=shared_account_manager.address), - ) - - -def test_concrete_fail_suspended( - algorand: AlgorandClient, - shared_authority, - shared_account_manager, - shared_client_active: Any, -) -> None: - account = algorand.account.random() - shared_client_active.send.rbac_gov_asset_suspension( - (True,), - params=CommonAppCallParams(sender=shared_authority.address), - ) - with pytest.raises(LogicError, match=err.SUSPENDED): - shared_client_active.send.account_open( - (account.address, account.address), - params=CommonAppCallParams(sender=shared_account_manager.address), - ) - - -def test_concrete_fail_invalid_holding_address( - shared_account_manager, - shared_account_factory, - shared_client_active: Any, -) -> None: - account = shared_account_factory(shared_client_active) - with pytest.raises(LogicError, match=err.INVALID_HOLDING_ADDRESS): - shared_client_active.send.account_open( - (account.holding_address, account.holding_address), - params=CommonAppCallParams(sender=shared_account_manager.address), - ) diff --git a/tests/mock_module_accounting/test_account_update_payment_address.py b/tests/mock_module_accounting/test_account_update_payment_address.py deleted file mode 100644 index 4b09fdab..00000000 --- a/tests/mock_module_accounting/test_account_update_payment_address.py +++ /dev/null @@ -1,115 +0,0 @@ -import pytest -from algokit_utils import CommonAppCallParams, LogicError, SigningAccount - -from smart_contracts import errors as err -from smart_contracts.artifacts.mock_module_accounting.mock_accounting_module_client import ( - AccountOpenArgs, - AccountUpdatePaymentAddressArgs, - MockAccountingModuleClient, -) -from tests.utils import DAsaAccountManager - - -def test_pass_account_update_payment_address( - arranger: SigningAccount, - no_role_account: SigningAccount, - account_manager: DAsaAccountManager, - accounting_client: MockAccountingModuleClient, -) -> None: - accounting_client.send.account_open( - AccountOpenArgs( - holding_address=no_role_account.address, - payment_address=no_role_account.address, - ), - params=CommonAppCallParams(sender=account_manager.address), - ) - - accounting_client.send.account_update_payment_address( - AccountUpdatePaymentAddressArgs( - holding_address=no_role_account.address, - payment_address=arranger.address, - ), - params=CommonAppCallParams(sender=no_role_account.address), - ) - - account_info = accounting_client.send.account_get_info( - (no_role_account.address,) - ).abi_return - assert account_info.payment_address == arranger.address - - -def test_fail_invalid_holding_address( - no_role_account: SigningAccount, - accounting_client: MockAccountingModuleClient, -) -> None: - with pytest.raises(LogicError, match=err.INVALID_HOLDING_ADDRESS): - accounting_client.send.account_update_payment_address( - AccountUpdatePaymentAddressArgs( - holding_address=no_role_account.address, - payment_address=no_role_account.address, - ), - params=CommonAppCallParams(sender=no_role_account.address), - ) - - -def test_fail_unauthorized( - arranger: SigningAccount, - no_role_account: SigningAccount, - account_manager: DAsaAccountManager, - accounting_client: MockAccountingModuleClient, -) -> None: - accounting_client.send.account_open( - AccountOpenArgs( - holding_address=no_role_account.address, - payment_address=no_role_account.address, - ), - params=CommonAppCallParams(sender=account_manager.address), - ) - with pytest.raises(LogicError, match=err.UNAUTHORIZED): - accounting_client.send.account_update_payment_address( - AccountUpdatePaymentAddressArgs( - holding_address=no_role_account.address, - payment_address=arranger.address, - ), - params=CommonAppCallParams(sender=arranger.address), - ) - - -def test_concrete_pass_account_update_payment_address( - no_role_account: SigningAccount, - shared_account_factory, - shared_client_active, -) -> None: - account = shared_account_factory(shared_client_active) - shared_client_active.send.account_update_payment_address( - (account.holding_address, no_role_account.address), - params=CommonAppCallParams(sender=account.address), - ) - account_info = shared_client_active.send.account_get_info( - (account.holding_address,) - ).abi_return - assert account_info.payment_address == no_role_account.address - - -def test_concrete_fail_invalid_holding_address( - no_role_account: SigningAccount, - shared_client_active, -) -> None: - with pytest.raises(LogicError, match=err.INVALID_HOLDING_ADDRESS): - shared_client_active.send.account_update_payment_address( - (no_role_account.address, no_role_account.address), - params=CommonAppCallParams(sender=no_role_account.address), - ) - - -def test_concrete_fail_unauthorized( - no_role_account: SigningAccount, - shared_account_factory, - shared_client_active, -) -> None: - account = shared_account_factory(shared_client_active) - with pytest.raises(LogicError, match=err.UNAUTHORIZED): - shared_client_active.send.account_update_payment_address( - (account.holding_address, no_role_account.address), - params=CommonAppCallParams(sender=no_role_account.address), - ) diff --git a/tests/mock_module_rbac/__init__.py b/tests/mock_module_rbac/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/tests/mock_module_rbac/test_policy_set_asset_suspension.py b/tests/mock_module_rbac/test_policy_set_asset_suspension.py deleted file mode 100644 index e3cdf0c2..00000000 --- a/tests/mock_module_rbac/test_policy_set_asset_suspension.py +++ /dev/null @@ -1,66 +0,0 @@ -import pytest -from algokit_utils import CommonAppCallParams, LogicError, SigningAccount - -from smart_contracts import errors as err -from smart_contracts.artifacts.mock_module_rbac.mock_rbac_module_client import ( - MockRbacModuleClient, - RbacGovAssetSuspensionArgs, -) -from tests.utils import DAsaAuthority - - -def test_pass_rbac_gov_asset_suspension( - authority: DAsaAuthority, rbac_client: MockRbacModuleClient -) -> None: - asset_suspended = rbac_client.state.global_state.asset_suspended - assert not asset_suspended - - rbac_client.send.rbac_gov_asset_suspension( - RbacGovAssetSuspensionArgs(suspended=True), - params=CommonAppCallParams( - sender=authority.address, - ), - ) - - asset_suspended = rbac_client.state.global_state.asset_suspended - assert asset_suspended - - -def test_fail_unauthorized( - no_role_account: SigningAccount, rbac_client: MockRbacModuleClient -) -> None: - with pytest.raises(LogicError, match=err.UNAUTHORIZED): - rbac_client.send.rbac_gov_asset_suspension( - RbacGovAssetSuspensionArgs(suspended=True), - params=CommonAppCallParams( - sender=no_role_account.address, - ), - ) - - -def test_concrete_pass_rbac_gov_asset_suspension( - shared_authority, - shared_client_active, -) -> None: - shared_client_active.send.rbac_gov_asset_suspension( - (True,), - params=CommonAppCallParams(sender=shared_authority.address), - ) - assert shared_client_active.send.get_asset_info().abi_return.suspended - - shared_client_active.send.rbac_gov_asset_suspension( - (False,), - params=CommonAppCallParams(sender=shared_authority.address), - ) - assert not shared_client_active.send.get_asset_info().abi_return.suspended - - -def test_concrete_fail_unauthorized( - no_role_account: SigningAccount, - shared_client_active, -) -> None: - with pytest.raises(LogicError, match=err.UNAUTHORIZED): - shared_client_active.send.rbac_gov_asset_suspension( - (True,), - params=CommonAppCallParams(sender=no_role_account.address), - ) diff --git a/tests/mock_module_rbac/test_rbac_assign_role.py b/tests/mock_module_rbac/test_rbac_assign_role.py deleted file mode 100644 index 6674c8c1..00000000 --- a/tests/mock_module_rbac/test_rbac_assign_role.py +++ /dev/null @@ -1,153 +0,0 @@ -import pytest -from algokit_utils import CommonAppCallParams, LogicError, SigningAccount - -from smart_contracts import constants as sc_cst -from smart_contracts import errors as err -from smart_contracts.artifacts.mock_module_rbac.mock_rbac_module_client import ( - MockRbacModuleClient, - RbacAssignRoleArgs, -) -from tests import utils - - -def test_pass_rbac_assign_role( - no_role_account: SigningAccount, - rbac_client: MockRbacModuleClient, -) -> None: - rbac_client.send.rbac_assign_role( - RbacAssignRoleArgs( - role_id=sc_cst.ROLE_AUTHORITY, - role_address=no_role_account.address, - config=b"", - ) - ) - - -def test_fail_unauthorized( - no_role_account: SigningAccount, rbac_client: MockRbacModuleClient -) -> None: - with pytest.raises(LogicError, match=err.UNAUTHORIZED): - rbac_client.send.rbac_assign_role( - RbacAssignRoleArgs( - role_id=sc_cst.ROLE_AUTHORITY, - role_address=no_role_account.address, - config=b"", - ), - params=CommonAppCallParams( - sender=no_role_account.address, - ), - ) - - -def test_fail_invalid_role( - no_role_account: SigningAccount, - rbac_client: MockRbacModuleClient, -) -> None: - with pytest.raises(LogicError, match=err.INVALID_ROLE): - rbac_client.send.rbac_assign_role( - RbacAssignRoleArgs( - role_id=0, - role_address=no_role_account.address, - config=b"", - ) - ) - - -def test_fail_invalid_role_address( - authority: SigningAccount, - rbac_client: MockRbacModuleClient, -) -> None: - with pytest.raises(LogicError, match=err.INVALID_ROLE_ADDRESS): - rbac_client.send.rbac_assign_role( - RbacAssignRoleArgs( - role_id=sc_cst.ROLE_AUTHORITY, - role_address=authority.address, - config=b"", - ) - ) - - -def test_concrete_pass_rbac_assign_role( - no_role_account: SigningAccount, - shared_client_empty, -) -> None: - shared_client_empty.send.rbac_assign_role( - ( - sc_cst.ROLE_ACCOUNT_MANAGER, - no_role_account.address, - utils.set_role_config(), - ) - ) - roles = shared_client_empty.send.rbac_get_address_roles( - (no_role_account.address,) - ).abi_return - assert roles[0] - - -def test_concrete_fail_unauthorized( - no_role_account: SigningAccount, - shared_client_empty, -) -> None: - with pytest.raises(LogicError, match=err.UNAUTHORIZED): - shared_client_empty.send.rbac_assign_role( - ( - sc_cst.ROLE_ACCOUNT_MANAGER, - no_role_account.address, - utils.set_role_config(), - ), - params=CommonAppCallParams(sender=no_role_account.address), - ) - - -def test_concrete_fail_defaulted( - no_role_account: SigningAccount, - shared_trustee, - shared_client_empty, -) -> None: - shared_client_empty.send.set_default_status( - (True,), - params=CommonAppCallParams(sender=shared_trustee.address), - ) - with pytest.raises(LogicError, match=err.DEFAULTED): - shared_client_empty.send.rbac_assign_role( - ( - sc_cst.ROLE_ACCOUNT_MANAGER, - no_role_account.address, - utils.set_role_config(), - ) - ) - - -def test_concrete_fail_invalid_role( - no_role_account: SigningAccount, - shared_client_empty, -) -> None: - with pytest.raises(LogicError, match=err.INVALID_ROLE): - shared_client_empty.send.rbac_assign_role( - ( - 0, - no_role_account.address, - utils.set_role_config(), - ) - ) - - -def test_concrete_fail_invalid_role_address( - no_role_account: SigningAccount, - shared_client_empty, -) -> None: - shared_client_empty.send.rbac_assign_role( - ( - sc_cst.ROLE_ACCOUNT_MANAGER, - no_role_account.address, - utils.set_role_config(), - ) - ) - with pytest.raises(LogicError, match=err.INVALID_ROLE_ADDRESS): - shared_client_empty.send.rbac_assign_role( - ( - sc_cst.ROLE_ACCOUNT_MANAGER, - no_role_account.address, - utils.set_role_config(), - ) - ) diff --git a/tests/mock_module_rbac/test_rbac_get_address_role.py b/tests/mock_module_rbac/test_rbac_get_address_role.py deleted file mode 100644 index 21772dab..00000000 --- a/tests/mock_module_rbac/test_rbac_get_address_role.py +++ /dev/null @@ -1,73 +0,0 @@ -from algokit_utils import SigningAccount - -from smart_contracts.artifacts.mock_module_rbac.mock_rbac_module_client import ( - MockRbacModuleClient, - RbacGetAddressRolesArgs, -) -from tests.utils import ( - DAsaAccountManager, - DAsaAuthority, - DAsaInterestOracle, - DAsaPrimaryDealer, - DAsaTrustee, -) - - -def test_pass_rbac_get_address_roles_for_assigned_accounts( - rbac_client: MockRbacModuleClient, - account_manager: DAsaAccountManager, - primary_dealer: DAsaPrimaryDealer, - trustee: DAsaTrustee, - authority: DAsaAuthority, - interest_oracle: DAsaInterestOracle, -) -> None: - account_manager_roles = rbac_client.send.rbac_get_address_roles( - RbacGetAddressRolesArgs(address=account_manager.address) - ).abi_return - assert account_manager_roles == [True, False, False, False, False] - - primary_dealer_roles = rbac_client.send.rbac_get_address_roles( - RbacGetAddressRolesArgs(address=primary_dealer.address) - ).abi_return - assert primary_dealer_roles == [False, True, False, False, False] - - trustee_roles = rbac_client.send.rbac_get_address_roles( - RbacGetAddressRolesArgs(address=trustee.address) - ).abi_return - assert trustee_roles == [False, False, True, False, False] - - authority_roles = rbac_client.send.rbac_get_address_roles( - RbacGetAddressRolesArgs(address=authority.address) - ).abi_return - assert authority_roles == [False, False, False, True, False] - - interest_oracle_roles = rbac_client.send.rbac_get_address_roles( - RbacGetAddressRolesArgs(address=interest_oracle.address) - ).abi_return - assert interest_oracle_roles == [False, False, False, False, True] - - -def test_pass_rbac_get_address_roles_for_unassigned_account( - no_role_account: SigningAccount, - rbac_client: MockRbacModuleClient, -) -> None: - roles = rbac_client.send.rbac_get_address_roles( - RbacGetAddressRolesArgs(address=no_role_account.address) - ).abi_return - assert roles == [False, False, False, False, False] - - -def test_concrete_pass_rbac_get_address_roles( - no_role_account: SigningAccount, - shared_account_manager, - shared_client_empty, -) -> None: - manager_roles = shared_client_empty.send.rbac_get_address_roles( - RbacGetAddressRolesArgs(address=shared_account_manager.address) - ).abi_return - assert manager_roles == [True, False, False, False, False] - - unassigned_roles = shared_client_empty.send.rbac_get_address_roles( - RbacGetAddressRolesArgs(address=no_role_account.address) - ).abi_return - assert unassigned_roles == [False, False, False, False, False] diff --git a/tests/mock_module_rbac/test_rbac_get_arranger.py b/tests/mock_module_rbac/test_rbac_get_arranger.py deleted file mode 100644 index 6957fb46..00000000 --- a/tests/mock_module_rbac/test_rbac_get_arranger.py +++ /dev/null @@ -1,19 +0,0 @@ -from algokit_utils import SigningAccount - -from smart_contracts.artifacts.mock_module_rbac.mock_rbac_module_client import ( - MockRbacModuleClient, -) - - -def test_pass_rbac_get_arranger( - arranger: SigningAccount, - rbac_client: MockRbacModuleClient, -) -> None: - assert rbac_client.send.rbac_get_arranger().abi_return == arranger.address - - -def test_concrete_pass_rbac_get_arranger(shared_client_empty) -> None: - assert ( - shared_client_empty.send.rbac_get_arranger().abi_return - == shared_client_empty.state.global_state.arranger - ) diff --git a/tests/mock_module_rbac/test_rbac_get_role_config.py b/tests/mock_module_rbac/test_rbac_get_role_config.py deleted file mode 100644 index a8bc5e45..00000000 --- a/tests/mock_module_rbac/test_rbac_get_role_config.py +++ /dev/null @@ -1,104 +0,0 @@ -import pytest -from algokit_utils import LogicError - -from smart_contracts import constants as sc_cst -from smart_contracts import errors as err -from smart_contracts.artifacts.mock_module_rbac.mock_rbac_module_client import ( - MockRbacModuleClient, - RbacGetRoleConfigArgs, -) -from tests import utils -from tests.utils import DAsaAuthority - - -def test_pass_rbac_get_role_config( - authority: DAsaAuthority, - rbac_client: MockRbacModuleClient, -) -> None: - config = rbac_client.send.rbac_get_role_config( - RbacGetRoleConfigArgs( - role_id=sc_cst.ROLE_AUTHORITY, - role_address=authority.address, - ) - ).abi_return - - expected = utils.set_role_config() - # Decode the expected bytes manually (2 uint64 values = 16 bytes total, big-endian) - import struct - - expected_start, expected_end = struct.unpack(">QQ", expected) - - assert config.role_validity_start == expected_start - assert config.role_validity_end == expected_end - - -def test_pass_rbac_get_arranger_role_config( - arranger, - rbac_client: MockRbacModuleClient, -) -> None: - config = rbac_client.send.rbac_get_role_config( - RbacGetRoleConfigArgs( - role_id=sc_cst.ROLE_ARRANGER, - role_address=arranger.address, - ) - ).abi_return - assert config.role_validity_start == 0 - assert config.role_validity_end == 0 - - -def test_fail_invalid_role(rbac_client: MockRbacModuleClient) -> None: - with pytest.raises(LogicError, match=err.INVALID_ROLE): - rbac_client.send.rbac_get_role_config( - RbacGetRoleConfigArgs(role_id=0, role_address=rbac_client.app_address) - ) - - -def test_fail_invalid_role_address( - no_role_account, - rbac_client: MockRbacModuleClient, -) -> None: - with pytest.raises(LogicError, match=err.INVALID_ROLE_ADDRESS): - rbac_client.send.rbac_get_role_config( - RbacGetRoleConfigArgs( - role_id=sc_cst.ROLE_AUTHORITY, - role_address=no_role_account.address, - ) - ) - - -def test_concrete_pass_rbac_get_role_config( - shared_account_manager, - shared_client_empty, -) -> None: - config = shared_client_empty.send.rbac_get_role_config( - (sc_cst.ROLE_ACCOUNT_MANAGER, shared_account_manager.address) - ).abi_return - assert config.role_validity_start == 0 - assert config.role_validity_end == 2**64 - 1 - - -def test_concrete_pass_rbac_get_arranger_role_config(shared_client_empty) -> None: - arranger = shared_client_empty.state.global_state.arranger - config = shared_client_empty.send.rbac_get_role_config( - (sc_cst.ROLE_ARRANGER, arranger) - ).abi_return - assert config.role_validity_start == 0 - assert config.role_validity_end == 0 - - -def test_concrete_fail_invalid_role( - no_role_account, - shared_client_empty, -) -> None: - with pytest.raises(LogicError, match=err.INVALID_ROLE): - shared_client_empty.send.rbac_get_role_config((0, no_role_account.address)) - - -def test_concrete_fail_invalid_role_address( - no_role_account, - shared_client_empty, -) -> None: - with pytest.raises(LogicError, match=err.INVALID_ROLE_ADDRESS): - shared_client_empty.send.rbac_get_role_config( - (sc_cst.ROLE_ACCOUNT_MANAGER, no_role_account.address) - ) diff --git a/tests/mock_module_rbac/test_rbac_revoke_role.py b/tests/mock_module_rbac/test_rbac_revoke_role.py deleted file mode 100644 index 0b3f3d3d..00000000 --- a/tests/mock_module_rbac/test_rbac_revoke_role.py +++ /dev/null @@ -1,155 +0,0 @@ -import pytest -from algokit_utils import CommonAppCallParams, LogicError, SigningAccount - -from smart_contracts import constants as sc_cst -from smart_contracts import errors as err -from smart_contracts.artifacts.mock_module_rbac.mock_rbac_module_client import ( - MockRbacModuleClient, - RbacAssignRoleArgs, - RbacGetAddressRolesArgs, - RbacRevokeRoleArgs, -) -from tests import utils -from tests.utils import DAsaAuthority - - -def test_pass_rbac_revoke_role( - no_role_account: SigningAccount, - rbac_client: MockRbacModuleClient, -) -> None: - rbac_client.send.rbac_assign_role( - RbacAssignRoleArgs( - role_id=sc_cst.ROLE_AUTHORITY, - role_address=no_role_account.address, - config=b"", - ) - ) - - rbac_client.send.rbac_revoke_role( - RbacRevokeRoleArgs( - role_id=sc_cst.ROLE_AUTHORITY, - role_address=no_role_account.address, - ) - ) - - roles = rbac_client.send.rbac_get_address_roles( - RbacGetAddressRolesArgs(address=no_role_account.address), - ).abi_return - assert not roles[3] - - -def test_fail_unauthorized( - no_role_account: SigningAccount, - authority: DAsaAuthority, - rbac_client: MockRbacModuleClient, -) -> None: - with pytest.raises(LogicError, match=err.UNAUTHORIZED): - rbac_client.send.rbac_revoke_role( - RbacRevokeRoleArgs( - role_id=sc_cst.ROLE_AUTHORITY, - role_address=authority.address, - ), - params=CommonAppCallParams(sender=no_role_account.address), - ) - - -def test_fail_invalid_role( - authority: DAsaAuthority, - rbac_client: MockRbacModuleClient, -) -> None: - with pytest.raises(LogicError, match=err.INVALID_ROLE): - rbac_client.send.rbac_revoke_role( - RbacRevokeRoleArgs( - role_id=0, - role_address=authority.address, - ) - ) - - -def test_fail_invalid_role_address( - no_role_account: SigningAccount, - rbac_client: MockRbacModuleClient, -) -> None: - with pytest.raises(LogicError, match=err.INVALID_ROLE_ADDRESS): - rbac_client.send.rbac_revoke_role( - RbacRevokeRoleArgs( - role_id=sc_cst.ROLE_AUTHORITY, - role_address=no_role_account.address, - ) - ) - - -def test_concrete_pass_rbac_revoke_role( - no_role_account: SigningAccount, - shared_client_empty, -) -> None: - shared_client_empty.send.rbac_assign_role( - ( - sc_cst.ROLE_ACCOUNT_MANAGER, - no_role_account.address, - utils.set_role_config(), - ) - ) - shared_client_empty.send.rbac_revoke_role( - ( - sc_cst.ROLE_ACCOUNT_MANAGER, - no_role_account.address, - ) - ) - roles = shared_client_empty.send.rbac_get_address_roles( - (no_role_account.address,) - ).abi_return - assert not roles[0] - - -def test_concrete_fail_unauthorized( - no_role_account: SigningAccount, - shared_client_empty, -) -> None: - with pytest.raises(LogicError, match=err.UNAUTHORIZED): - shared_client_empty.send.rbac_revoke_role( - ( - sc_cst.ROLE_ACCOUNT_MANAGER, - no_role_account.address, - ), - params=CommonAppCallParams(sender=no_role_account.address), - ) - - -def test_concrete_fail_defaulted( - no_role_account: SigningAccount, - shared_trustee, - shared_client_empty, -) -> None: - shared_client_empty.send.set_default_status( - (True,), - params=CommonAppCallParams(sender=shared_trustee.address), - ) - with pytest.raises(LogicError, match=err.DEFAULTED): - shared_client_empty.send.rbac_revoke_role( - ( - sc_cst.ROLE_ACCOUNT_MANAGER, - no_role_account.address, - ) - ) - - -def test_concrete_fail_invalid_role( - no_role_account: SigningAccount, - shared_client_empty, -) -> None: - with pytest.raises(LogicError, match=err.INVALID_ROLE): - shared_client_empty.send.rbac_revoke_role((0, no_role_account.address)) - - -def test_concrete_fail_invalid_role_address( - no_role_account: SigningAccount, - shared_client_empty, -) -> None: - with pytest.raises(LogicError, match=err.INVALID_ROLE_ADDRESS): - shared_client_empty.send.rbac_revoke_role( - ( - sc_cst.ROLE_ACCOUNT_MANAGER, - no_role_account.address, - ) - ) diff --git a/tests/mock_module_rbac/test_rbac_rotate_arranger.py b/tests/mock_module_rbac/test_rbac_rotate_arranger.py deleted file mode 100644 index 9766b2ef..00000000 --- a/tests/mock_module_rbac/test_rbac_rotate_arranger.py +++ /dev/null @@ -1,51 +0,0 @@ -import pytest -from algokit_utils import CommonAppCallParams, LogicError, SigningAccount - -from smart_contracts import errors as err -from smart_contracts.artifacts.mock_module_rbac.mock_rbac_module_client import ( - MockRbacModuleClient, - RbacRotateArrangerArgs, -) - - -def test_pass_rbac_rotate_arranger( - no_role_account: SigningAccount, - rbac_client: MockRbacModuleClient, -) -> None: - rbac_client.send.rbac_rotate_arranger( - RbacRotateArrangerArgs(new_arranger=no_role_account.address) - ) - assert rbac_client.send.rbac_get_arranger().abi_return == no_role_account.address - - -def test_fail_unauthorized( - no_role_account: SigningAccount, - rbac_client: MockRbacModuleClient, -) -> None: - with pytest.raises(LogicError, match=err.UNAUTHORIZED): - rbac_client.send.rbac_rotate_arranger( - RbacRotateArrangerArgs(new_arranger=no_role_account.address), - params=CommonAppCallParams(sender=no_role_account.address), - ) - - -def test_concrete_pass_rbac_rotate_arranger( - no_role_account: SigningAccount, - shared_client_empty, -) -> None: - shared_client_empty.send.rbac_rotate_arranger((no_role_account.address,)) - assert ( - shared_client_empty.send.rbac_get_arranger().abi_return - == no_role_account.address - ) - - -def test_concrete_fail_unauthorized( - no_role_account: SigningAccount, - shared_client_empty, -) -> None: - with pytest.raises(LogicError, match=err.UNAUTHORIZED): - shared_client_empty.send.rbac_rotate_arranger( - (no_role_account.address,), - params=CommonAppCallParams(sender=no_role_account.address), - ) diff --git a/tests/perpetual_bond/__init__.py b/tests/perpetual_bond/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/tests/perpetual_bond/conftest.py b/tests/perpetual_bond/conftest.py deleted file mode 100644 index af873813..00000000 --- a/tests/perpetual_bond/conftest.py +++ /dev/null @@ -1,302 +0,0 @@ -from collections.abc import Callable -from typing import Final - -import pytest -from algokit_utils import ( - AlgorandClient, - SigningAccount, -) - -from smart_contracts import constants as sc_cst -from smart_contracts.artifacts.perpetual_bond.perpetual_bond_client import ( - AccountOpenArgs, - AssetConfigArgs, - AssetCreateArgs, - AssetMetadata, - PayCouponArgs, - PerpetualBondClient, - PerpetualBondFactory, - PrimaryDistributionArgs, - RbacAssignRoleArgs, - RbacGovAssetSuspensionArgs, - SetDefaultStatusArgs, - SetSecondaryTimeEventsArgs, -) -from tests import conftest_helpers as helpers -from tests import utils -from tests.conftest import ( - APR, - INITIAL_D_ASA_UNITS, - ISSUANCE_DELAY, - MINIMUM_DENOMINATION, - PRIMARY_DISTRIBUTION_DELAY, - PRIMARY_DISTRIBUTION_DURATION, - PRINCIPAL, -) - -COUPON_PERIOD: Final[int] = 360 * sc_cst.DAY_2_SEC -DUE_COUPONS: Final[int] = 4 - -TOTAL_ASA_FUNDS: Final[int] = PRINCIPAL * (sc_cst.BPS + APR) // sc_cst.BPS - -PROSPECTUS_URL: Final[str] = "Perpetual Bond Prospectus" - - -@pytest.fixture(scope="session") -def asset_metadata() -> AssetMetadata: - return AssetMetadata( - contract_type=sc_cst.CT_PBN, - calendar=sc_cst.CLDR_NC, - business_day_convention=sc_cst.BDC_NOS, - end_of_month_convention=sc_cst.EOMC_SD, - prepayment_effect=sc_cst.PPEF_N, - penalty_type=sc_cst.PYTP_N, - prospectus_hash=bytes(32), - prospectus_url=PROSPECTUS_URL, - ) - - -@pytest.fixture(scope="function") -def time_events(algorand: AlgorandClient) -> utils.TimeEvents: - current_ts = utils.get_latest_timestamp(algorand.client.algod) - primary_distribution_opening = current_ts + PRIMARY_DISTRIBUTION_DELAY - primary_distribution_closure = ( - primary_distribution_opening + PRIMARY_DISTRIBUTION_DURATION - ) - issuance_date = primary_distribution_closure + ISSUANCE_DELAY - return [ - primary_distribution_opening, - primary_distribution_closure, - issuance_date, - ] - - -@pytest.fixture(scope="function") -def perpetual_bond_cfg( - currency: utils.Currency, - time_events: utils.TimeEvents, - day_count_convention: int, -) -> utils.DAsaConfig: - return utils.DAsaConfig( - denomination_asset_id=currency.id, - settlement_asset_id=currency.id, - principal=PRINCIPAL, - principal_discount=0, - minimum_denomination=MINIMUM_DENOMINATION, - day_count_convention=day_count_convention, - interest_rate=APR, - coupon_rates=[], - time_events=time_events, - time_periods=[(COUPON_PERIOD, 0)], - ) - - -@pytest.fixture(scope="function") -def perpetual_bond_client_empty( - algorand: AlgorandClient, - arranger: SigningAccount, - asset_metadata: AssetMetadata, -) -> PerpetualBondClient: - return helpers.create_and_fund_client( - algorand, - PerpetualBondFactory, - arranger, - AssetCreateArgs(arranger=arranger.address, metadata=asset_metadata), - ) - - -@pytest.fixture(scope="function") -def account_manager( - algorand: AlgorandClient, - perpetual_bond_cfg: utils.DAsaConfig, - perpetual_bond_client_empty: PerpetualBondClient, -) -> utils.DAsaAccountManager: - return helpers.create_role_account( - algorand, - utils.DAsaAccountManager, - perpetual_bond_client_empty, - rbac_assign_role_args_class=RbacAssignRoleArgs, - ) - - -@pytest.fixture(scope="function") -def trustee( - algorand: AlgorandClient, - perpetual_bond_cfg: utils.DAsaConfig, - perpetual_bond_client_empty: PerpetualBondClient, -) -> utils.DAsaTrustee: - return helpers.create_role_account( - algorand, - utils.DAsaTrustee, - perpetual_bond_client_empty, - rbac_assign_role_args_class=RbacAssignRoleArgs, - ) - - -@pytest.fixture(scope="function") -def authority( - algorand: AlgorandClient, - perpetual_bond_cfg: utils.DAsaConfig, - perpetual_bond_client_empty: PerpetualBondClient, -) -> utils.DAsaAuthority: - return helpers.create_role_account( - algorand, - utils.DAsaAuthority, - perpetual_bond_client_empty, - rbac_assign_role_args_class=RbacAssignRoleArgs, - ) - - -@pytest.fixture(scope="function") -def interest_oracle( - algorand: AlgorandClient, - perpetual_bond_cfg: utils.DAsaConfig, - perpetual_bond_client_empty: PerpetualBondClient, -) -> utils.DAsaInterestOracle: - return helpers.create_role_account( - algorand, - utils.DAsaInterestOracle, - perpetual_bond_client_empty, - rbac_assign_role_args_class=RbacAssignRoleArgs, - ) - - -@pytest.fixture(scope="function") -def perpetual_bond_client_active( - algorand: AlgorandClient, - bank: SigningAccount, - perpetual_bond_cfg: utils.DAsaConfig, - perpetual_bond_client_empty: PerpetualBondClient, -) -> PerpetualBondClient: - return helpers.activate_client_with_config_and_funding( - algorand, - perpetual_bond_client_empty, - bank, - perpetual_bond_cfg, - TOTAL_ASA_FUNDS, - AssetConfigArgs, - ) - - -@pytest.fixture(scope="function") -def primary_dealer( - algorand: AlgorandClient, - perpetual_bond_client_active: PerpetualBondClient, -) -> utils.DAsaPrimaryDealer: - state = perpetual_bond_client_active.state.global_state - role_config = utils.set_role_config( - state.primary_distribution_opening_date, state.primary_distribution_closure_date - ) - return helpers.create_role_account( - algorand, - utils.DAsaPrimaryDealer, - perpetual_bond_client_active, - role_config, - RbacAssignRoleArgs, - ) - - -@pytest.fixture(scope="function") -def account_factory( - algorand: AlgorandClient, - bank: SigningAccount, - currency: utils.Currency, - account_manager: utils.DAsaAccountManager, -) -> Callable[..., utils.DAsaAccount]: - return helpers.build_account_factory( - algorand, currency, account_manager, AccountOpenArgs - ) - - -@pytest.fixture(scope="function") -def perpetual_bond_client_primary( - perpetual_bond_client_active: PerpetualBondClient, -) -> PerpetualBondClient: - state = perpetual_bond_client_active.state.global_state - return helpers.set_client_to_primary_phase( - perpetual_bond_client_active, - SetSecondaryTimeEventsArgs, - [state.issuance_date], - ) - - -@pytest.fixture(scope="function") -def account_with_units_factory( - account_factory: Callable[..., utils.DAsaAccount], - primary_dealer: utils.DAsaPrimaryDealer, - perpetual_bond_client_primary: PerpetualBondClient, -) -> Callable[..., utils.DAsaAccount]: - return helpers.build_account_with_units_factory( - account_factory, - primary_dealer, - perpetual_bond_client_primary, - PrimaryDistributionArgs, - INITIAL_D_ASA_UNITS, - ) - - -@pytest.fixture(scope="function") -def account_a( - account_with_units_factory: Callable[..., utils.DAsaAccount], -) -> utils.DAsaAccount: - return account_with_units_factory() - - -@pytest.fixture(scope="function") -def account_b( - account_with_units_factory: Callable[..., utils.DAsaAccount], -) -> utils.DAsaAccount: - return account_with_units_factory(units=2 * INITIAL_D_ASA_UNITS) - - -@pytest.fixture(scope="function") -def account_with_coupons_factory( - account_with_units_factory: Callable[..., utils.DAsaAccount], - perpetual_bond_client_primary: PerpetualBondClient, -) -> Callable[..., utils.DAsaAccount]: - state = perpetual_bond_client_primary.state.global_state - - def _factory( - *, units: int = INITIAL_D_ASA_UNITS, coupons: int = DUE_COUPONS - ) -> utils.DAsaAccount: - account = account_with_units_factory(units=units) - issuance_date = state.issuance_date - utils.time_warp(issuance_date + COUPON_PERIOD * coupons) - for _ in range(1, coupons + 1): - perpetual_bond_client_primary.send.pay_coupon( - PayCouponArgs( - holding_address=account.holding_address, - payment_info=b"", - ) - ) - return account - - return _factory - - -@pytest.fixture(scope="function") -def perpetual_bond_client_ongoing( - perpetual_bond_client_primary: PerpetualBondClient, -) -> PerpetualBondClient: - state = perpetual_bond_client_primary.state.global_state - utils.time_warp(state.issuance_date) - return perpetual_bond_client_primary - - -@pytest.fixture(scope="function") -def perpetual_bond_client_suspended( - authority: utils.DAsaAuthority, - perpetual_bond_client_ongoing: PerpetualBondClient, -) -> PerpetualBondClient: - return helpers.suspend_client( - perpetual_bond_client_ongoing, authority, RbacGovAssetSuspensionArgs - ) - - -@pytest.fixture(scope="function") -def perpetual_bond_client_defaulted( - trustee: utils.DAsaTrustee, perpetual_bond_client_ongoing: PerpetualBondClient -) -> PerpetualBondClient: - return helpers.set_client_to_default( - perpetual_bond_client_ongoing, trustee, SetDefaultStatusArgs - ) diff --git a/tests/perpetual_bond/test_asset_config.py b/tests/perpetual_bond/test_asset_config.py deleted file mode 100644 index d14d7eb1..00000000 --- a/tests/perpetual_bond/test_asset_config.py +++ /dev/null @@ -1,131 +0,0 @@ -from copy import deepcopy - -import pytest -from algokit_utils import LogicError - -from smart_contracts import config as sc_cfg -from smart_contracts import enums -from smart_contracts import errors as err -from smart_contracts.artifacts.perpetual_bond.perpetual_bond_client import ( - AssetConfigArgs, - PerpetualBondClient, -) -from tests.utils import Currency, DAsaConfig - - -def test_pass_asset_config( - day_count_convention: int, - currency: Currency, - perpetual_bond_cfg: DAsaConfig, - perpetual_bond_client_empty: PerpetualBondClient, -) -> None: - perpetual_bond_client_empty.send.asset_config( - AssetConfigArgs(**perpetual_bond_cfg.dictify()) - ) - - state = perpetual_bond_client_empty.state.global_state - expected_time_events = perpetual_bond_client_empty.send.get_time_events().abi_return - expected_time_periods = ( - perpetual_bond_client_empty.send.get_time_periods().abi_return - ) - - # Asset Configuration - assert state.denomination_asset_id == currency.id - assert state.settlement_asset_id == state.denomination_asset_id - assert state.unit_value == perpetual_bond_cfg.minimum_denomination - assert state.day_count_convention == perpetual_bond_cfg.day_count_convention - - # Principal and Supply - assert ( - state.total_units - == perpetual_bond_cfg.principal // perpetual_bond_cfg.minimum_denomination - ) - assert not state.circulating_units - assert not state.principal_discount - - # Interest Rate - assert state.interest_rate == perpetual_bond_cfg.interest_rate - - # Coupons - assert state.total_coupons == perpetual_bond_cfg.total_coupons - assert state.coupon_period == perpetual_bond_cfg.time_periods[0][0] - assert not state.paid_coupon_units - - # Time Schedule - assert expected_time_events == perpetual_bond_cfg.time_events - # FIXME: algosdk has a bug ARC4 type decoding: https://github.com/algorand/py-algorand-sdk/issues/355 - # assert expected_time_periods == perpetual_bond_cfg.time_periods - assert not expected_time_periods[0][1] - assert ( - state.primary_distribution_opening_date - == perpetual_bond_cfg.time_events[sc_cfg.PRIMARY_DISTRIBUTION_OPENING_DATE_IDX] - # == time_schedule_limits.primary_distribution_opening_date - ) - assert ( - state.primary_distribution_closure_date - == perpetual_bond_cfg.time_events[sc_cfg.PRIMARY_DISTRIBUTION_CLOSURE_DATE_IDX] - # == time_schedule_limits.primary_distribution_closure_date - ) - assert ( - state.issuance_date - == perpetual_bond_cfg.time_events[sc_cfg.ISSUANCE_DATE_IDX] - # == time_schedule_limits.issuance_date - ) - assert not state.secondary_market_opening_date - assert not state.secondary_market_closure_date - assert not state.maturity_date - - # Status - assert state.status == enums.STATUS_ACTIVE - assert not state.asset_suspended - - -def test_fail_invalid_time_events_length( - perpetual_bond_cfg: DAsaConfig, - perpetual_bond_client_empty: PerpetualBondClient, -) -> None: - wrong_d_asa_cfg = deepcopy(perpetual_bond_cfg) - wrong_d_asa_cfg.time_events = [*perpetual_bond_cfg.time_events, 0] - with pytest.raises(LogicError, match=err.INVALID_TIME_EVENTS_LENGTH): - perpetual_bond_client_empty.send.asset_config( - AssetConfigArgs(**wrong_d_asa_cfg.dictify()) - ) - - -def test_fail_invalid_time_periods( - perpetual_bond_cfg: DAsaConfig, - perpetual_bond_client_empty: PerpetualBondClient, -) -> None: - wrong_d_asa_cfg = deepcopy(perpetual_bond_cfg) - wrong_d_asa_cfg.time_periods = [*perpetual_bond_cfg.time_periods, (1, 1)] - with pytest.raises(LogicError, match=err.INVALID_TIME_PERIODS): - perpetual_bond_client_empty.send.asset_config( - AssetConfigArgs(**wrong_d_asa_cfg.dictify()) - ) - - -def test_fail_invalid_time_period_durations( - perpetual_bond_cfg: DAsaConfig, - perpetual_bond_client_empty: PerpetualBondClient, -) -> None: - wrong_d_asa_cfg = deepcopy(perpetual_bond_cfg) - wrong_d_asa_cfg.time_periods[0] = (0, 1) - with pytest.raises(LogicError, match=err.INVALID_TIME_PERIOD_DURATION): - perpetual_bond_client_empty.send.asset_config( - AssetConfigArgs(**wrong_d_asa_cfg.dictify()) - ) - - -def test_fail_invalid_time_period_repetitions( - perpetual_bond_cfg: DAsaConfig, - perpetual_bond_client_empty: PerpetualBondClient, -) -> None: - wrong_d_asa_cfg = deepcopy(perpetual_bond_cfg) - wrong_d_asa_cfg.time_periods[0] = (1, 1) - with pytest.raises(LogicError, match=err.INVALID_TIME_PERIOD_REPETITIONS): - perpetual_bond_client_empty.send.asset_config( - AssetConfigArgs(**wrong_d_asa_cfg.dictify()) - ) - - -# TODO: Test INVALID_TIME_PERIOD for Actual/Actual convention diff --git a/tests/perpetual_bond/test_asset_create.py b/tests/perpetual_bond/test_asset_create.py deleted file mode 100644 index b50cddd4..00000000 --- a/tests/perpetual_bond/test_asset_create.py +++ /dev/null @@ -1,90 +0,0 @@ -from algokit_utils import AlgorandClient, SigningAccount -from algosdk.abi import ArrayStaticType, ByteType, StringType, TupleType, UintType - -from smart_contracts import constants as sc_cst -from smart_contracts import enums -from smart_contracts.artifacts.perpetual_bond.perpetual_bond_client import ( - AssetCreateArgs, - AssetMetadata, - PerpetualBondFactory, -) - -from .conftest import PROSPECTUS_URL - - -def test_pass_asset_create( - algorand: AlgorandClient, - day_count_convention: int, - asset_metadata: AssetMetadata, - arranger: SigningAccount, -) -> None: - factory = algorand.client.get_typed_app_factory( - PerpetualBondFactory, - default_sender=arranger.address, - default_signer=arranger.signer, - ) - perpetual_bond_client, _ = factory.send.create.asset_create( - AssetCreateArgs(arranger=arranger.address, metadata=asset_metadata) - ) - - state = perpetual_bond_client.state.global_state - - # Roles - assert state.arranger == arranger.address - - # Asset Configuration - assert not state.denomination_asset_id - assert not state.settlement_asset_id - assert not state.unit_value - assert not state.day_count_convention - - # Metadata - assert state.metadata == TupleType( - [ - UintType(8), # Contract Type - UintType(8), # Calendar - UintType(8), # Business Day Convention - UintType(8), # End of Month Convention - UintType(8), # Prepayment Effect - UintType(8), # Penalty Type - ArrayStaticType(ByteType(), 32), # Prospectus Hash - StringType(), # Prospectus URL - ] - ).encode( - [ - sc_cst.CT_PBN, - sc_cst.CLDR_NC, - sc_cst.BDC_NOS, - sc_cst.EOMC_SD, - sc_cst.PPEF_N, - sc_cst.PYTP_N, - bytes(32), - PROSPECTUS_URL, - ] - ) - - # Principal and Supply - assert not state.total_units - assert not state.circulating_units - assert not state.principal_discount - - # Coupons - assert not state.total_coupons - assert not state.coupon_period - assert not state.paid_coupon_units - - # Time Schedule - assert not state.primary_distribution_opening_date - assert not state.primary_distribution_closure_date - assert not state.issuance_date - assert not state.secondary_market_opening_date - assert not state.secondary_market_closure_date - assert not state.maturity_date - - # Status - assert state.status == enums.STATUS_INACTIVE - assert not state.asset_suspended - - -def test_fail_invalid_state_schema() -> None: - pass # TODO diff --git a/tests/perpetual_bond/test_asset_transfer.py b/tests/perpetual_bond/test_asset_transfer.py deleted file mode 100644 index aa141d62..00000000 --- a/tests/perpetual_bond/test_asset_transfer.py +++ /dev/null @@ -1,268 +0,0 @@ -from collections.abc import Callable - -import pytest -from algokit_utils import CommonAppCallParams, LogicError, SigningAccount - -from smart_contracts import errors as err -from smart_contracts.artifacts.perpetual_bond.perpetual_bond_client import ( - AccountGovSuspensionArgs, - AssetTransferArgs, - GetAccountUnitsCurrentValueArgs, - PayCouponArgs, - PerpetualBondClient, -) -from tests.utils import DAsaAccount, DAsaAuthority, DAsaConfig, time_warp - - -def test_pass_asset_transfer( - perpetual_bond_cfg: DAsaConfig, - perpetual_bond_client_primary: PerpetualBondClient, - account_factory: Callable[..., DAsaAccount], - account_with_coupons_factory: Callable[..., DAsaAccount], -) -> None: - account_a = account_with_coupons_factory(units=3, coupons=1) - account_b = account_factory(perpetual_bond_client_primary) - - state = perpetual_bond_client_primary.state.global_state - coupon_1_date = state.issuance_date + state.coupon_period - - pre_transfer_units_a = account_a.units - pre_transfer_units_b = account_b.units - pre_transfer_unit_value_a = account_a.unit_value - pre_transfer_unit_value_b = account_b.unit_value - - assert pre_transfer_unit_value_a != pre_transfer_unit_value_b - assert pre_transfer_unit_value_b == 0 - assert account_a.paid_coupons != account_b.paid_coupons - - time_warp(coupon_1_date + state.coupon_period // 10) - - transfer_units = 1 - accrued_interest = ( - perpetual_bond_client_primary.send.get_account_units_current_value( - GetAccountUnitsCurrentValueArgs( - holding_address=account_a.holding_address, - units=transfer_units, - ) - ).abi_return.accrued_interest - ) - - transferred_value = perpetual_bond_client_primary.send.asset_transfer( - AssetTransferArgs( - sender_holding_address=account_a.holding_address, - receiver_holding_address=account_b.holding_address, - units=transfer_units, - ), - params=CommonAppCallParams(sender=account_a.address), - ).abi_return - - post_transfer_units_a = account_a.units - post_transfer_units_b = account_b.units - post_transfer_unit_value_a = account_a.unit_value - post_transfer_unit_value_b = account_b.unit_value - - assert ( - transferred_value - == perpetual_bond_cfg.minimum_denomination * transfer_units + accrued_interest - ) - assert post_transfer_units_a == pre_transfer_units_a - transfer_units - assert post_transfer_units_b == pre_transfer_units_b + transfer_units - assert post_transfer_unit_value_a == post_transfer_unit_value_b - assert account_a.paid_coupons == account_b.paid_coupons - - -def test_fail_secondary_market_not_open_yet( - perpetual_bond_client_primary: PerpetualBondClient, - account_a: DAsaAccount, - account_b: DAsaAccount, -) -> None: - with pytest.raises(LogicError, match=err.SECONDARY_MARKET_CLOSED): - perpetual_bond_client_primary.send.asset_transfer( - AssetTransferArgs( - sender_holding_address=account_a.holding_address, - receiver_holding_address=account_b.holding_address, - units=1, - ), - params=CommonAppCallParams(sender=account_a.address), - ) - - -def test_fail_unauthorized( - no_role_account: SigningAccount, - account_a: DAsaAccount, - account_b: DAsaAccount, - perpetual_bond_client_ongoing: PerpetualBondClient, -) -> None: - with pytest.raises(LogicError, match=err.UNAUTHORIZED): - perpetual_bond_client_ongoing.send.asset_transfer( - AssetTransferArgs( - sender_holding_address=account_a.holding_address, - receiver_holding_address=account_b.holding_address, - units=1, - ), - params=CommonAppCallParams(sender=no_role_account.address), - ) - - -def test_fail_defaulted_status( - account_a: DAsaAccount, - account_b: DAsaAccount, - perpetual_bond_client_defaulted: PerpetualBondClient, -) -> None: - with pytest.raises(LogicError, match=err.DEFAULTED): - perpetual_bond_client_defaulted.send.asset_transfer( - AssetTransferArgs( - sender_holding_address=account_a.holding_address, - receiver_holding_address=account_b.holding_address, - units=1, - ), - params=CommonAppCallParams(sender=account_a.address), - ) - - -def test_fail_suspended( - account_a: DAsaAccount, - account_b: DAsaAccount, - perpetual_bond_client_suspended: PerpetualBondClient, -) -> None: - with pytest.raises(LogicError, match=err.SUSPENDED): - perpetual_bond_client_suspended.send.asset_transfer( - AssetTransferArgs( - sender_holding_address=account_a.holding_address, - receiver_holding_address=account_b.holding_address, - units=1, - ), - params=CommonAppCallParams(sender=account_a.address), - ) - - -def test_fail_invalid_sender( - no_role_account: SigningAccount, - account_a: DAsaAccount, - perpetual_bond_client_ongoing: PerpetualBondClient, -) -> None: - with pytest.raises(LogicError, match=err.INVALID_HOLDING_ADDRESS): - perpetual_bond_client_ongoing.send.asset_transfer( - AssetTransferArgs( - sender_holding_address=no_role_account.address, - receiver_holding_address=account_a.holding_address, - units=1, - ), - params=CommonAppCallParams(sender=no_role_account.address), - ) - - -def test_fail_invalid_receiver( - no_role_account: SigningAccount, - account_a: DAsaAccount, - perpetual_bond_client_ongoing: PerpetualBondClient, -) -> None: - with pytest.raises(LogicError, match=err.INVALID_HOLDING_ADDRESS): - perpetual_bond_client_ongoing.send.asset_transfer( - AssetTransferArgs( - sender_holding_address=account_a.holding_address, - receiver_holding_address=no_role_account.address, - units=1, - ), - params=CommonAppCallParams(sender=account_a.address), - ) - - -def test_fail_suspended_sender( - authority: DAsaAuthority, - account_a: DAsaAccount, - account_b: DAsaAccount, - perpetual_bond_client_ongoing: PerpetualBondClient, -) -> None: - perpetual_bond_client_ongoing.send.account_gov_suspension( - AccountGovSuspensionArgs( - holding_address=account_a.holding_address, - suspended=True, - ), - params=CommonAppCallParams(sender=authority.address), - ) - - with pytest.raises(LogicError, match=err.SUSPENDED): - perpetual_bond_client_ongoing.send.asset_transfer( - AssetTransferArgs( - sender_holding_address=account_a.holding_address, - receiver_holding_address=account_b.holding_address, - units=1, - ), - params=CommonAppCallParams(sender=account_a.address), - ) - - -def test_fail_suspended_receiver( - authority: DAsaAuthority, - account_a: DAsaAccount, - account_b: DAsaAccount, - perpetual_bond_client_ongoing: PerpetualBondClient, -) -> None: - perpetual_bond_client_ongoing.send.account_gov_suspension( - AccountGovSuspensionArgs( - holding_address=account_b.holding_address, - suspended=True, - ), - params=CommonAppCallParams(sender=authority.address), - ) - - with pytest.raises(LogicError, match=err.SUSPENDED): - perpetual_bond_client_ongoing.send.asset_transfer( - AssetTransferArgs( - sender_holding_address=account_a.holding_address, - receiver_holding_address=account_b.holding_address, - units=1, - ), - params=CommonAppCallParams(sender=account_a.address), - ) - - -def test_fail_self_transfer() -> None: - pass # TODO - - -def test_fail_null_transfer() -> None: - pass # TODO - - -def test_fail_over_transfer( - account_a: DAsaAccount, - account_b: DAsaAccount, - perpetual_bond_client_ongoing: PerpetualBondClient, -) -> None: - with pytest.raises(LogicError, match=err.OVER_TRANSFER): - perpetual_bond_client_ongoing.send.asset_transfer( - AssetTransferArgs( - sender_holding_address=account_a.holding_address, - receiver_holding_address=account_b.holding_address, - units=account_a.units + 1, - ), - params=CommonAppCallParams(sender=account_a.address), - ) - - -@pytest.mark.skip("The PENDING_COUPON_PAYMENT is shadowed by NON_FUNGIBLE_UNITS") -def test_fail_pending_coupon_payment( - account_a: DAsaAccount, - account_b: DAsaAccount, - perpetual_bond_client_ongoing: PerpetualBondClient, -) -> None: - state = perpetual_bond_client_ongoing.state.global_state - time_warp(state.issuance_date + state.coupon_period) - perpetual_bond_client_ongoing.send.pay_coupon( - PayCouponArgs( - holding_address=account_a.holding_address, - payment_info=b"", - ) - ) - - with pytest.raises(LogicError, match=err.PENDING_COUPON_PAYMENT): - perpetual_bond_client_ongoing.send.asset_transfer( - AssetTransferArgs( - sender_holding_address=account_b.holding_address, - receiver_holding_address=account_a.holding_address, - units=1, - ), - params=CommonAppCallParams(sender=account_b.address), - ) diff --git a/tests/perpetual_bond/test_get_account_units_current_value.py b/tests/perpetual_bond/test_get_account_units_current_value.py deleted file mode 100644 index dd2e3bba..00000000 --- a/tests/perpetual_bond/test_get_account_units_current_value.py +++ /dev/null @@ -1,96 +0,0 @@ -from collections.abc import Callable -from typing import Final - -from smart_contracts import constants as sc_cst -from smart_contracts.artifacts.perpetual_bond.perpetual_bond_client import ( - GetAccountUnitsCurrentValueArgs, - PayCouponArgs, - PerpetualBondClient, -) -from tests.utils import Currency, DAsaAccount, DAsaConfig, time_warp - -from .conftest import DUE_COUPONS - -D_ASA_TEST_UNITS: Final[int] = 3 - -# TODO: Add Actual/Actual DDC tests - - -def test_pass_get_account_units_current_value( - currency: Currency, - perpetual_bond_cfg: DAsaConfig, - perpetual_bond_client_primary: PerpetualBondClient, - account_with_units_factory: Callable[..., DAsaAccount], -) -> None: - account = account_with_units_factory(units=D_ASA_TEST_UNITS) - state = perpetual_bond_client_primary.state.global_state - issuance_date = state.issuance_date - coupon_period = state.coupon_period - - value = perpetual_bond_client_primary.send.get_account_units_current_value( - GetAccountUnitsCurrentValueArgs( - holding_address=account.holding_address, - units=D_ASA_TEST_UNITS, - ) - ).abi_return - print("Initial units' value:") - print(value.__dict__) - assert ( - value.units_value == D_ASA_TEST_UNITS * perpetual_bond_cfg.minimum_denomination - ) - assert not value.accrued_interest - - for coupon in range(1, DUE_COUPONS + 1): - coupon_due_date = issuance_date + coupon_period * coupon - time_warp(coupon_due_date) - coupon_period_fraction = 10 - time_warp(coupon_due_date + coupon_period // coupon_period_fraction) - if coupon <= DUE_COUPONS: - perpetual_bond_client_primary.send.pay_coupon( - PayCouponArgs( - holding_address=account.holding_address, - payment_info=b"", - ) - ) - - units_value = ( - perpetual_bond_client_primary.send.get_account_units_current_value( - GetAccountUnitsCurrentValueArgs( - holding_address=account.holding_address, - units=D_ASA_TEST_UNITS, - ) - ).abi_return - ) - print(f"Units' value after {coupon} coupon due date:") - print(units_value.__dict__) - assert ( - value.units_value - == D_ASA_TEST_UNITS * perpetual_bond_cfg.minimum_denomination - ) - if coupon < perpetual_bond_cfg.total_coupons: - assert ( - value.accrued_interest - == value.units_value - * perpetual_bond_cfg.coupon_rates[coupon] - * coupon_period_fraction - // (sc_cst.BPS * coupon_period) - ) - else: - assert not value.accrued_interest - # TODO: validate day count factor - - -def test_fail_no_primary_distribution() -> None: - pass # TODO - - -def test_fail_invalid_holding_address() -> None: - pass # TODO - - -def test_fail_invalid_units() -> None: - pass # TODO - - -def test_fail_pending_coupon_payment() -> None: - pass # TODO diff --git a/tests/perpetual_bond/test_get_coupon_status.py b/tests/perpetual_bond/test_get_coupon_status.py deleted file mode 100644 index 8c0af710..00000000 --- a/tests/perpetual_bond/test_get_coupon_status.py +++ /dev/null @@ -1,78 +0,0 @@ -from collections.abc import Callable -from typing import Final - -from smart_contracts.artifacts.perpetual_bond.perpetual_bond_client import ( - PayCouponArgs, - PerpetualBondClient, -) -from tests.utils import Currency, DAsaAccount, DAsaConfig, time_warp - -from .conftest import DUE_COUPONS - -D_ASA_TEST_UNITS: Final[int] = 3 - - -def test_pass_get_coupon_status( - currency: Currency, - perpetual_bond_cfg: DAsaConfig, - perpetual_bond_client_primary: PerpetualBondClient, - account_with_units_factory: Callable[..., DAsaAccount], -) -> None: - account = account_with_units_factory(units=D_ASA_TEST_UNITS) - state = perpetual_bond_client_primary.state.global_state - issuance_date = state.issuance_date - coupon_period = state.coupon_period - - coupon_status = perpetual_bond_client_primary.send.get_coupons_status().abi_return - print("Initial coupon status:") - print(coupon_status.__dict__) - assert not coupon_status.total_coupons - assert not coupon_status.due_coupons - assert coupon_status.next_coupon_due_date == issuance_date + coupon_period - assert coupon_status.all_due_coupons_paid - assert coupon_status.day_count_factor.numerator == 0 - assert coupon_status.day_count_factor.denominator == 0 - - for coupon in range(1, DUE_COUPONS + 1): - coupon_due_date = issuance_date + coupon_period * coupon - coupon_period_fraction = 10 - time_warp(coupon_due_date + coupon_period // coupon_period_fraction) - - coupon_status = ( - perpetual_bond_client_primary.send.get_coupons_status().abi_return - ) - print(f"Coupon status after {coupon} coupon due date:") - print(coupon_status.__dict__) - assert coupon_status.due_coupons == coupon - assert coupon_status.next_coupon_due_date == coupon_due_date + coupon_period - assert not coupon_status.all_due_coupons_paid - assert ( - coupon_status.day_count_factor.numerator - == coupon_status.day_count_factor.denominator // coupon_period_fraction - ) - - perpetual_bond_client_primary.send.pay_coupon( - PayCouponArgs( - holding_address=account.holding_address, - payment_info=b"", - ) - ) - coupon_status = ( - perpetual_bond_client_primary.send.get_coupons_status().abi_return - ) - print(f"Coupon status after {coupon} coupon payment:") - print(coupon_status.__dict__) - assert coupon_status.due_coupons == coupon - assert coupon_status.next_coupon_due_date == coupon_due_date + coupon_period - assert coupon_status.all_due_coupons_paid - assert ( - coupon_status.day_count_factor.numerator - == coupon_status.day_count_factor.denominator // coupon_period_fraction - ) - - -def test_pass_not_configured( - perpetual_bond_client_empty: PerpetualBondClient, -) -> None: - coupon_status = perpetual_bond_client_empty.send.get_coupons_status().abi_return - print(coupon_status.__dict__) diff --git a/tests/perpetual_bond/test_get_payment_amount.py b/tests/perpetual_bond/test_get_payment_amount.py deleted file mode 100644 index 20cd9581..00000000 --- a/tests/perpetual_bond/test_get_payment_amount.py +++ /dev/null @@ -1,76 +0,0 @@ -from collections.abc import Callable -from typing import Final - -import pytest -from algokit_utils import LogicError, SigningAccount - -from smart_contracts import constants as sc_cst -from smart_contracts import errors as err -from smart_contracts.artifacts.fixed_coupon_bond.fixed_coupon_bond_client import ( - PayCouponArgs, -) -from smart_contracts.artifacts.perpetual_bond.perpetual_bond_client import ( - GetPaymentAmountArgs, - PerpetualBondClient, -) -from tests.utils import Currency, DAsaAccount, DAsaConfig, time_warp - -from .conftest import DUE_COUPONS - -D_ASA_TEST_UNITS: Final[int] = 3 - - -def test_pass_get_coupon_payment_amount( - currency: Currency, - perpetual_bond_cfg: DAsaConfig, - perpetual_bond_client_primary: PerpetualBondClient, - account_with_units_factory: Callable[..., DAsaAccount], -) -> None: - account = account_with_units_factory(units=D_ASA_TEST_UNITS) - state = perpetual_bond_client_primary.state.global_state - - print(f"Principal: {account.principal * currency.asa_to_unit:.2f} EUR") - for coupon in range(1, DUE_COUPONS + 1): - payment_amount = perpetual_bond_client_primary.send.get_payment_amount( - GetPaymentAmountArgs(holding_address=account.holding_address) - ).abi_return - coupon_rate_bps = perpetual_bond_cfg.interest_rate - print(f"Coupon rate {coupon}:\t\t{coupon_rate_bps / 100:.2f}%") - print( - f"Coupon amount {coupon}:\t{payment_amount.interest * currency.asa_to_unit:.2f} EUR\n" - ) - assert ( - payment_amount.interest == account.principal * coupon_rate_bps // sc_cst.BPS - ) - assert payment_amount.principal == 0 - - # Coupon reaches due date - coupon_due_date = state.issuance_date + state.coupon_period * coupon - time_warp(coupon_due_date) - perpetual_bond_client_primary.send.pay_coupon( - PayCouponArgs( - holding_address=account.holding_address, - payment_info=b"", - ) - ) - - -def test_pass_not_configured( - perpetual_bond_client_empty: PerpetualBondClient, - account_factory: Callable[..., DAsaAccount], -) -> None: - account = account_factory(perpetual_bond_client_empty) - payment_amount = perpetual_bond_client_empty.send.get_payment_amount( - GetPaymentAmountArgs(holding_address=account.holding_address) - ).abi_return - assert payment_amount.interest == 0 - assert payment_amount.principal == 0 - - -def test_fail_invalid_holding_address( - no_role_account: SigningAccount, perpetual_bond_client_ongoing: PerpetualBondClient -) -> None: - with pytest.raises(LogicError, match=err.INVALID_HOLDING_ADDRESS): - perpetual_bond_client_ongoing.send.get_payment_amount( - GetPaymentAmountArgs(holding_address=no_role_account.address) - ) diff --git a/tests/perpetual_bond/test_pay_coupon.py b/tests/perpetual_bond/test_pay_coupon.py deleted file mode 100644 index 39969778..00000000 --- a/tests/perpetual_bond/test_pay_coupon.py +++ /dev/null @@ -1,293 +0,0 @@ -from collections.abc import Callable - -import pytest -from algokit_utils import ( - AlgorandClient, - LogicError, - SigningAccount, -) - -from smart_contracts import errors as err -from smart_contracts.artifacts.perpetual_bond.perpetual_bond_client import ( - GetPaymentAmountArgs, - PayCouponArgs, - PerpetualBondClient, -) -from tests.utils import Currency, DAsaAccount, DAsaConfig, time_warp - -from .conftest import DUE_COUPONS - - -def test_pass_pay_coupon( - algorand: AlgorandClient, - currency: Currency, - perpetual_bond_cfg: DAsaConfig, - account_a: DAsaAccount, - account_b: DAsaAccount, - perpetual_bond_client_ongoing: PerpetualBondClient, -) -> None: - account_a_units = account_a.units - account_b_units = account_b.units - state = perpetual_bond_client_ongoing.state.global_state - issuance_date = state.issuance_date - coupon_period = state.coupon_period - - for coupon in range(1, DUE_COUPONS + 1): - print(f"Coupon {coupon}") - due_coupons = ( - perpetual_bond_client_ongoing.send.get_coupons_status().abi_return.due_coupons - ) - assert due_coupons == coupon - 1 - - # Pre payment sate - pre_payment_account_a_paid_coupons = account_a.paid_coupons - pre_payment_account_b_paid_coupons = account_a.paid_coupons - pre_payment_state = perpetual_bond_client_ongoing.state.global_state - assert pre_payment_account_a_paid_coupons == due_coupons - assert pre_payment_account_b_paid_coupons == due_coupons - assert ( - pre_payment_state.paid_coupon_units - == account_a_units * pre_payment_account_a_paid_coupons - + account_b_units * pre_payment_account_b_paid_coupons - ) - - account_a_coupon_amount = perpetual_bond_client_ongoing.send.get_payment_amount( - GetPaymentAmountArgs(holding_address=account_a.holding_address) - ).abi_return.interest - - account_b_coupon_amount = perpetual_bond_client_ongoing.send.get_payment_amount( - GetPaymentAmountArgs(holding_address=account_b.holding_address) - ).abi_return.interest - - # Coupon reaches due date - coupon_due_date = issuance_date + coupon_period * coupon - time_warp(coupon_due_date) - due_coupons = ( - perpetual_bond_client_ongoing.send.get_coupons_status().abi_return.due_coupons - ) - assert due_coupons == coupon - - # Coupon payment - payment_a = perpetual_bond_client_ongoing.send.pay_coupon( - PayCouponArgs( - holding_address=account_a.holding_address, - payment_info=b"", - ) - ).abi_return - assert payment_a.amount == account_a_coupon_amount - print("Account A:") - print( - f"Paid amount: {payment_a.amount * currency.asa_to_unit:.2f} EUR, Due date: {coupon_due_date}, " - f"Payment timestamp: {payment_a.timestamp}" - ) - - payment_b = perpetual_bond_client_ongoing.send.pay_coupon( - PayCouponArgs( - holding_address=account_b.holding_address, - payment_info=b"", - ) - ).abi_return - assert payment_b.amount == account_b_coupon_amount - print("Account B:") - print( - f"Paid amount: {payment_b.amount * currency.asa_to_unit:.2f} EUR, Due date: {coupon_due_date}, " - f"Payment timestamp: {payment_b.timestamp}\n" - ) - - # Post payment state - post_payment_account_a_paid_coupons = account_a.paid_coupons - post_payment_account_b_paid_coupons = account_b.paid_coupons - post_payment_state = perpetual_bond_client_ongoing.state.global_state - assert ( - post_payment_account_a_paid_coupons - == pre_payment_account_a_paid_coupons + 1 - ) - assert ( - post_payment_account_b_paid_coupons - == pre_payment_account_b_paid_coupons + 1 - ) - assert ( - post_payment_state.paid_coupon_units - == account_a_units * post_payment_account_a_paid_coupons - + account_b_units * post_payment_account_b_paid_coupons - ) - # TODO: assert balance updates - - -def test_pass_pay_multiple_coupons( - currency: Currency, - perpetual_bond_cfg: DAsaConfig, - account_a: DAsaAccount, - perpetual_bond_client_ongoing: PerpetualBondClient, -) -> None: - account_units = account_a.units - state = perpetual_bond_client_ongoing.state.global_state - issuance_date = state.issuance_date - coupon_period = state.coupon_period - - time_warp(issuance_date + coupon_period * DUE_COUPONS) - - due_coupons = ( - perpetual_bond_client_ongoing.send.get_coupons_status().abi_return.due_coupons - ) - assert due_coupons == DUE_COUPONS - - for coupon in range(1, DUE_COUPONS + 1): - print(f"Coupon {coupon}") - coupon_amount = perpetual_bond_client_ongoing.send.get_payment_amount( - GetPaymentAmountArgs(holding_address=account_a.holding_address) - ).abi_return.interest - - # Pre payment sate - pre_payment_account_paid_coupons = account_a.paid_coupons - pre_payment_state = perpetual_bond_client_ongoing.state.global_state - assert ( - pre_payment_state.paid_coupon_units - == account_units * pre_payment_account_paid_coupons - ) - - # Coupon payment - coupon_due_date = pre_payment_state.issuance_date + state.coupon_period * coupon - payment = perpetual_bond_client_ongoing.send.pay_coupon( - PayCouponArgs( - holding_address=account_a.holding_address, - payment_info=b"", - ) - ).abi_return - assert payment.amount == coupon_amount - print( - f"Paid amount: {payment.amount * currency.asa_to_unit:.2f} EUR, Due date: {coupon_due_date}, " - f"Payment timestamp: {payment.timestamp}" - ) - - # Post payment state - post_payment_account_paid_coupons = account_a.paid_coupons - post_payment_state = perpetual_bond_client_ongoing.state.global_state - assert post_payment_account_paid_coupons == pre_payment_account_paid_coupons + 1 - assert ( - post_payment_state.paid_coupon_units - == account_units * post_payment_account_paid_coupons - ) - # TODO: assert balance updates - - -def test_pass_skip_suspended_account() -> None: - pass # TODO - - -def test_pass_skip_not_opted_in_account() -> None: - pass # TODO - - -def test_fail_unauthorized() -> None: - pass # TODO - - -def test_fail_unauthorized_status() -> None: - pass # TODO - - -def test_fail_defaulted_status() -> None: - pass # TODO - - -def test_fail_suspended() -> None: - pass # TODO - - -def test_fail_invalid_holding_address( - no_role_account: SigningAccount, perpetual_bond_client_ongoing: PerpetualBondClient -) -> None: - with pytest.raises(LogicError, match=err.INVALID_HOLDING_ADDRESS): - perpetual_bond_client_ongoing.send.pay_coupon( - PayCouponArgs( - holding_address=no_role_account.address, - payment_info=b"", - ) - ) - - -def test_fail_no_units( - account_factory: Callable[..., DAsaAccount], - perpetual_bond_client_primary: PerpetualBondClient, -) -> None: - account = account_factory(perpetual_bond_client_primary) - - with pytest.raises(LogicError, match=err.NO_UNITS): - perpetual_bond_client_primary.send.pay_coupon( - PayCouponArgs( - holding_address=account.holding_address, - payment_info=b"", - ) - ) - - -def test_fail_no_due_coupon( - algorand: AlgorandClient, - perpetual_bond_cfg: DAsaConfig, - account_a: DAsaAccount, - perpetual_bond_client_ongoing: PerpetualBondClient, -) -> None: - state = perpetual_bond_client_ongoing.state.global_state - - for coupon in range(1, DUE_COUPONS + 1): - with pytest.raises(LogicError, match=err.NO_DUE_COUPON): - perpetual_bond_client_ongoing.send.pay_coupon( - PayCouponArgs( - holding_address=account_a.holding_address, - payment_info=b"", - ) - ) - coupon_due_date = state.issuance_date + state.coupon_period * coupon - time_warp(coupon_due_date) - perpetual_bond_client_ongoing.send.pay_coupon( - PayCouponArgs( - holding_address=account_a.holding_address, - payment_info=b"", - ) - ) - - -def test_fail_pending_coupon_payment( - perpetual_bond_cfg: DAsaConfig, - account_a: DAsaAccount, - account_b: DAsaAccount, - perpetual_bond_client_ongoing: PerpetualBondClient, -) -> None: - state = perpetual_bond_client_ongoing.state.global_state - issuance_date = state.issuance_date - coupon_period = state.coupon_period - - for coupon in range(1, DUE_COUPONS): - coupon_due_date = issuance_date + coupon_period * coupon - time_warp(coupon_due_date) - if coupon % 2: - first_payee = account_a - second_payee = account_b - else: - first_payee = account_b - second_payee = account_a - - perpetual_bond_client_ongoing.send.pay_coupon( - PayCouponArgs( - holding_address=first_payee.holding_address, - payment_info=b"", - ) - ) - - coupon_due_date = issuance_date + coupon_period * (coupon + 1) - time_warp(coupon_due_date) - with pytest.raises(LogicError, match=err.PENDING_COUPON_PAYMENT): - perpetual_bond_client_ongoing.send.pay_coupon( - PayCouponArgs( - holding_address=first_payee.holding_address, - payment_info=b"", - ) - ) - - perpetual_bond_client_ongoing.send.pay_coupon( - PayCouponArgs( - holding_address=second_payee.holding_address, - payment_info=b"", - ) - ) diff --git a/tests/perpetual_bond/test_sub_accrued_interest_amount.py b/tests/perpetual_bond/test_sub_accrued_interest_amount.py deleted file mode 100644 index ded9e71f..00000000 --- a/tests/perpetual_bond/test_sub_accrued_interest_amount.py +++ /dev/null @@ -1,107 +0,0 @@ -from typing import Final - -from algokit_utils import AlgorandClient - -from smart_contracts.artifacts.perpetual_bond.perpetual_bond_client import ( - GetAccountUnitsCurrentValueArgs, - GetPaymentAmountArgs, - PayCouponArgs, - PerpetualBondClient, -) -from tests.utils import Currency, DAsaAccount, get_latest_timestamp, time_warp - -TEST_UNITS: Final[int] = 3 - -# TODO: Add Actual/Actual DDC tests - - -def test_from_issuance( - account_a: DAsaAccount, - perpetual_bond_client_ongoing: PerpetualBondClient, -) -> None: - current_date = get_latest_timestamp( - perpetual_bond_client_ongoing.algorand.client.algod - ) - next_coupon_due_date = ( - perpetual_bond_client_ongoing.send.get_coupons_status().abi_return.next_coupon_due_date - ) - state = perpetual_bond_client_ongoing.state.global_state - assert current_date == state.issuance_date - - # Coupon accrued half period - half_coupon_period = (next_coupon_due_date - current_date) // 2 - time_warp(current_date + half_coupon_period) - due_coupons = ( - perpetual_bond_client_ongoing.send.get_coupons_status().abi_return.due_coupons - ) - assert due_coupons == 0 - - accrued_interest = ( - perpetual_bond_client_ongoing.send.get_account_units_current_value( - GetAccountUnitsCurrentValueArgs( - holding_address=account_a.holding_address, - units=account_a.units, - ) - ).abi_return.accrued_interest - ) - - coupon_amount = perpetual_bond_client_ongoing.send.get_payment_amount( - GetPaymentAmountArgs(holding_address=account_a.holding_address) - ).abi_return.interest - assert accrued_interest == coupon_amount // 2 - - -def test_from_latest_coupon_due_date( - currency: Currency, - algorand: AlgorandClient, - account_a: DAsaAccount, - perpetual_bond_client_ongoing: PerpetualBondClient, -) -> None: - first_coupon_due_date = ( - perpetual_bond_client_ongoing.send.get_coupons_status().abi_return.next_coupon_due_date - ) - time_warp(first_coupon_due_date) - current_date = get_latest_timestamp( - perpetual_bond_client_ongoing.algorand.client.algod - ) - assert current_date == first_coupon_due_date - perpetual_bond_client_ongoing.send.pay_coupon( - PayCouponArgs( - holding_address=account_a.holding_address, - payment_info=b"", - ) - ) - - next_coupon_due_date = ( - perpetual_bond_client_ongoing.send.get_coupons_status().abi_return.next_coupon_due_date - ) - - # Coupon accrued a tenth of period - tenth_coupon_period = (next_coupon_due_date - current_date) // 10 - time_warp(current_date + tenth_coupon_period) - due_coupons = ( - perpetual_bond_client_ongoing.send.get_coupons_status().abi_return.due_coupons - ) - assert due_coupons == 1 - - accrued_interest = ( - perpetual_bond_client_ongoing.send.get_account_units_current_value( - GetAccountUnitsCurrentValueArgs( - holding_address=account_a.holding_address, - units=account_a.units, - ) - ).abi_return.accrued_interest - ) - - coupon_amount = perpetual_bond_client_ongoing.send.get_payment_amount( - GetPaymentAmountArgs(holding_address=account_a.holding_address) - ).abi_return.interest - assert accrued_interest == coupon_amount // 10 - - -def test_on_coupon_due_date() -> None: - pass # TODO: Must be tested directly at subroutine level, not through get_payment_amount - - -def test_fail_pending_coupon_payment() -> None: - pass # TODO diff --git a/tests/perpetual_bond/test_sub_all_due_coupons_paid.py b/tests/perpetual_bond/test_sub_all_due_coupons_paid.py deleted file mode 100644 index e926f32e..00000000 --- a/tests/perpetual_bond/test_sub_all_due_coupons_paid.py +++ /dev/null @@ -1,59 +0,0 @@ -from algokit_utils import AlgorandClient - -from smart_contracts.artifacts.perpetual_bond.perpetual_bond_client import ( - PayCouponArgs, - PerpetualBondClient, -) -from tests.utils import DAsaAccount, DAsaConfig, time_warp - -from .conftest import DUE_COUPONS - - -def test_all_due_coupons_paid( - algorand: AlgorandClient, - perpetual_bond_cfg: DAsaConfig, - account_a: DAsaAccount, - account_b: DAsaAccount, - perpetual_bond_client_ongoing: PerpetualBondClient, -) -> None: - state = perpetual_bond_client_ongoing.state.global_state - issuance_date = state.issuance_date - coupon_period = state.coupon_period - - for coupon in range(1, DUE_COUPONS + 1): - all_paid = ( - perpetual_bond_client_ongoing.send.get_coupons_status().abi_return.all_due_coupons_paid - ) - assert all_paid - - # Coupon reaches due date - coupon_due_date = issuance_date + coupon_period * coupon - time_warp(coupon_due_date) - all_paid = ( - perpetual_bond_client_ongoing.send.get_coupons_status().abi_return.all_due_coupons_paid - ) - assert not all_paid - - # Coupon payment - perpetual_bond_client_ongoing.send.pay_coupon( - PayCouponArgs( - holding_address=account_a.holding_address, - payment_info=b"", - ) - ) - - all_paid = ( - perpetual_bond_client_ongoing.send.get_coupons_status().abi_return.all_due_coupons_paid - ) - assert not all_paid - - perpetual_bond_client_ongoing.send.pay_coupon( - PayCouponArgs( - holding_address=account_b.holding_address, - payment_info=b"", - ) - ) - all_paid = ( - perpetual_bond_client_ongoing.send.get_coupons_status().abi_return.all_due_coupons_paid - ) - assert all_paid diff --git a/tests/perpetual_bond/test_sub_count_due_coupons.py b/tests/perpetual_bond/test_sub_count_due_coupons.py deleted file mode 100644 index d065aa3f..00000000 --- a/tests/perpetual_bond/test_sub_count_due_coupons.py +++ /dev/null @@ -1,37 +0,0 @@ -from algokit_utils import AlgorandClient, SigningAccount - -from smart_contracts.artifacts.perpetual_bond.perpetual_bond_client import ( - PerpetualBondClient, -) -from tests.utils import DAsaConfig, time_warp - -from .conftest import DUE_COUPONS - - -def test_count_due_coupons_before_issuance( - perpetual_bond_client_primary: PerpetualBondClient, -) -> None: - due_coupons = ( - perpetual_bond_client_primary.send.get_coupons_status().abi_return.due_coupons - ) - assert due_coupons == 0 - - -def test_count_due_coupons_ongoing( - algorand: AlgorandClient, - arranger: SigningAccount, - perpetual_bond_cfg: DAsaConfig, - perpetual_bond_client_ongoing: PerpetualBondClient, -) -> None: - state = perpetual_bond_client_ongoing.state.global_state - issuance_date = state.issuance_date - coupon_period = state.coupon_period - - for coupon in range(1, DUE_COUPONS + 1): - coupon_due_date = issuance_date + coupon_period * coupon - time_warp(coupon_due_date) - due_coupons = ( - perpetual_bond_client_ongoing.send.get_coupons_status().abi_return.due_coupons - ) - print("Due coupons: ", due_coupons) - assert due_coupons == coupon diff --git a/tests/perpetual_bond/test_sub_latest_coupon_date.py b/tests/perpetual_bond/test_sub_latest_coupon_date.py deleted file mode 100644 index 46409041..00000000 --- a/tests/perpetual_bond/test_sub_latest_coupon_date.py +++ /dev/null @@ -1 +0,0 @@ -# TODO diff --git a/tests/perpetual_bond/test_sub_next_coupon_due_date.py b/tests/perpetual_bond/test_sub_next_coupon_due_date.py deleted file mode 100644 index 62bc10ba..00000000 --- a/tests/perpetual_bond/test_sub_next_coupon_due_date.py +++ /dev/null @@ -1,39 +0,0 @@ -from algokit_utils import AlgorandClient, SigningAccount - -from smart_contracts.artifacts.perpetual_bond.perpetual_bond_client import ( - PerpetualBondClient, -) -from tests.utils import DAsaConfig, time_warp - -from .conftest import DUE_COUPONS - -TIME_LEFT_TO_DUE_DATE = 100 # Seconds - - -def test_next_coupon_due_date_before_issuance( - perpetual_bond_client_primary: PerpetualBondClient, -) -> None: - state = perpetual_bond_client_primary.state.global_state - next_coupon_due_date = ( - perpetual_bond_client_primary.send.get_coupons_status().abi_return.next_coupon_due_date - ) - assert next_coupon_due_date == state.issuance_date + state.coupon_period - - -def test_next_coupon_due_date_ongoing( - algorand: AlgorandClient, - arranger: SigningAccount, - perpetual_bond_cfg: DAsaConfig, - perpetual_bond_client_ongoing: PerpetualBondClient, -) -> None: - state = perpetual_bond_client_ongoing.state.global_state - issuance_date = state.issuance_date - coupon_period = state.coupon_period - for coupon in range(1, DUE_COUPONS + 1): - coupon_due_date = issuance_date + coupon_period * coupon - time_warp(coupon_due_date - TIME_LEFT_TO_DUE_DATE) - next_coupon_due_date = ( - perpetual_bond_client_ongoing.send.get_coupons_status().abi_return.next_coupon_due_date - ) - print("Next coupon due date: ", next_coupon_due_date) - assert next_coupon_due_date == coupon_due_date diff --git a/tests/perpetual_bond/test_update_interest_rate.py b/tests/perpetual_bond/test_update_interest_rate.py deleted file mode 100644 index a9fadd91..00000000 --- a/tests/perpetual_bond/test_update_interest_rate.py +++ /dev/null @@ -1,153 +0,0 @@ -from collections.abc import Callable -from typing import Final - -import pytest -from algokit_utils import ( - AlgorandClient, - CommonAppCallParams, - LogicError, - SigningAccount, -) - -from smart_contracts import errors as err -from smart_contracts.artifacts.fixed_coupon_bond.fixed_coupon_bond_client import ( - PayCouponArgs, -) -from smart_contracts.artifacts.perpetual_bond.perpetual_bond_client import ( - PerpetualBondClient, - UpdateInterestRateArgs, -) -from tests.utils import Currency, DAsaAccount, DAsaConfig, DAsaInterestOracle, time_warp - -from .conftest import DUE_COUPONS - -D_ASA_TEST_UNITS: Final[int] = 3 -INTEREST_RATE_INCREASE: Final[int] = 100 # BPS equal to 1% - - -def test_pass_primary_distribution( - algorand: AlgorandClient, - interest_oracle: DAsaInterestOracle, - perpetual_bond_client_primary: PerpetualBondClient, -) -> None: - interest_rate = perpetual_bond_client_primary.state.global_state.interest_rate - print(f"Interest rate:\t\t{interest_rate / 100:.2f}%") - perpetual_bond_client_primary.send.update_interest_rate( - UpdateInterestRateArgs(interest_rate=interest_rate + INTEREST_RATE_INCREASE), - params=CommonAppCallParams(sender=interest_oracle.address), - ) - updated_interest_rate = ( - perpetual_bond_client_primary.state.global_state.interest_rate - ) - print(f"Interest rate:\t\t{updated_interest_rate / 100:.2f}%") - assert updated_interest_rate == interest_rate + INTEREST_RATE_INCREASE - - -def test_pass_after_issuance( - currency: Currency, - interest_oracle: DAsaInterestOracle, - perpetual_bond_client_primary: PerpetualBondClient, - account_with_units_factory: Callable[..., DAsaAccount], -) -> None: - account = account_with_units_factory(units=D_ASA_TEST_UNITS) - state = perpetual_bond_client_primary.state.global_state - issuance_date = state.issuance_date - coupon_period = state.coupon_period - - for coupon in range(1, DUE_COUPONS + 1): - print(f"Interest rate:\t\t{state.interest_rate / 100:.2f}%") - # Coupon reaches due date - coupon_due_date = issuance_date + coupon_period * coupon - time_warp(coupon_due_date) - - # Coupon payment - perpetual_bond_client_primary.send.pay_coupon( - PayCouponArgs( - holding_address=account.holding_address, - payment_info=b"", - ) - ) - - # Update interest rate - interest_rate = state.interest_rate - perpetual_bond_client_primary.send.update_interest_rate( - UpdateInterestRateArgs( - interest_rate=interest_rate + INTEREST_RATE_INCREASE - ), - params=CommonAppCallParams(sender=interest_oracle.address), - ) - state = perpetual_bond_client_primary.state.global_state - updated_interest_rate = state.interest_rate - assert updated_interest_rate == interest_rate + INTEREST_RATE_INCREASE - - -def test_fail_unauthorized( - algorand: AlgorandClient, - no_role_account: SigningAccount, - perpetual_bond_client_primary: PerpetualBondClient, -) -> None: - interest_rate = perpetual_bond_client_primary.state.global_state.interest_rate - with pytest.raises(LogicError, match=err.UNAUTHORIZED): - perpetual_bond_client_primary.send.update_interest_rate( - UpdateInterestRateArgs(interest_rate=interest_rate + INTEREST_RATE_INCREASE) - ) - - -def test_fail_defaulted_status() -> None: - pass # TODO - - -def test_fail_suspended() -> None: - pass # TODO - - -def test_fail_pending_coupon_payment( - interest_oracle: DAsaInterestOracle, - perpetual_bond_cfg: DAsaConfig, - account_a: DAsaAccount, - account_b: DAsaAccount, - perpetual_bond_client_ongoing: PerpetualBondClient, -) -> None: - state = perpetual_bond_client_ongoing.state.global_state - issuance_date = state.issuance_date - coupon_period = state.coupon_period - interest_rate = state.interest_rate - - for coupon in range(1, DUE_COUPONS): - coupon_due_date = issuance_date + coupon_period * coupon - time_warp(coupon_due_date) - if coupon % 2: - first_payee = account_a - second_payee = account_b - else: - first_payee = account_b - second_payee = account_a - - perpetual_bond_client_ongoing.send.pay_coupon( - PayCouponArgs( - holding_address=first_payee.holding_address, - payment_info=b"", - ) - ) - - with pytest.raises(LogicError, match=err.PENDING_COUPON_PAYMENT): - perpetual_bond_client_ongoing.send.update_interest_rate( - UpdateInterestRateArgs( - interest_rate=interest_rate + INTEREST_RATE_INCREASE - ), - params=CommonAppCallParams(sender=interest_oracle.address), - ) - - perpetual_bond_client_ongoing.send.pay_coupon( - PayCouponArgs( - holding_address=second_payee.holding_address, - payment_info=b"", - ) - ) - - perpetual_bond_client_ongoing.send.update_interest_rate( - UpdateInterestRateArgs( - interest_rate=interest_rate + INTEREST_RATE_INCREASE - ), - params=CommonAppCallParams(sender=interest_oracle.address), - ) diff --git a/tests/shared/__init__.py b/tests/shared/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/tests/shared/cases.py b/tests/shared/cases.py deleted file mode 100644 index b1ab8b25..00000000 --- a/tests/shared/cases.py +++ /dev/null @@ -1,340 +0,0 @@ -from __future__ import annotations - -from collections.abc import Callable -from dataclasses import dataclass -from typing import Any - -from smart_contracts import constants as sc_cst -from smart_contracts.artifacts.fixed_coupon_bond.fixed_coupon_bond_client import ( - AccountOpenArgs as FixedAccountOpenArgs, -) -from smart_contracts.artifacts.fixed_coupon_bond.fixed_coupon_bond_client import ( - AssetConfigArgs as FixedAssetConfigArgs, -) -from smart_contracts.artifacts.fixed_coupon_bond.fixed_coupon_bond_client import ( - AssetCreateArgs as FixedAssetCreateArgs, -) -from smart_contracts.artifacts.fixed_coupon_bond.fixed_coupon_bond_client import ( - AssetMetadata as FixedAssetMetadata, -) -from smart_contracts.artifacts.fixed_coupon_bond.fixed_coupon_bond_client import ( - AssetUpdateArgs as FixedAssetUpdateArgs, -) -from smart_contracts.artifacts.fixed_coupon_bond.fixed_coupon_bond_client import ( - FixedCouponBondFactory, -) -from smart_contracts.artifacts.fixed_coupon_bond.fixed_coupon_bond_client import ( - PrimaryDistributionArgs as FixedPrimaryDistributionArgs, -) -from smart_contracts.artifacts.fixed_coupon_bond.fixed_coupon_bond_client import ( - RbacAssignRoleArgs as FixedRbacAssignRoleArgs, -) -from smart_contracts.artifacts.fixed_coupon_bond.fixed_coupon_bond_client import ( - RbacGovAssetSuspensionArgs as FixedRbacGovAssetSuspensionArgs, -) -from smart_contracts.artifacts.fixed_coupon_bond.fixed_coupon_bond_client import ( - SetDefaultStatusArgs as FixedSetDefaultStatusArgs, -) -from smart_contracts.artifacts.fixed_coupon_bond.fixed_coupon_bond_client import ( - SetSecondaryTimeEventsArgs as FixedSetSecondaryTimeEventsArgs, -) -from smart_contracts.artifacts.perpetual_bond.perpetual_bond_client import ( - AccountOpenArgs as PerpetualAccountOpenArgs, -) -from smart_contracts.artifacts.perpetual_bond.perpetual_bond_client import ( - AssetConfigArgs as PerpetualAssetConfigArgs, -) -from smart_contracts.artifacts.perpetual_bond.perpetual_bond_client import ( - AssetCreateArgs as PerpetualAssetCreateArgs, -) -from smart_contracts.artifacts.perpetual_bond.perpetual_bond_client import ( - AssetMetadata as PerpetualAssetMetadata, -) -from smart_contracts.artifacts.perpetual_bond.perpetual_bond_client import ( - AssetUpdateArgs as PerpetualAssetUpdateArgs, -) -from smart_contracts.artifacts.perpetual_bond.perpetual_bond_client import ( - PerpetualBondFactory, -) -from smart_contracts.artifacts.perpetual_bond.perpetual_bond_client import ( - PrimaryDistributionArgs as PerpetualPrimaryDistributionArgs, -) -from smart_contracts.artifacts.perpetual_bond.perpetual_bond_client import ( - RbacAssignRoleArgs as PerpetualRbacAssignRoleArgs, -) -from smart_contracts.artifacts.perpetual_bond.perpetual_bond_client import ( - RbacGovAssetSuspensionArgs as PerpetualRbacGovAssetSuspensionArgs, -) -from smart_contracts.artifacts.perpetual_bond.perpetual_bond_client import ( - SetDefaultStatusArgs as PerpetualSetDefaultStatusArgs, -) -from smart_contracts.artifacts.perpetual_bond.perpetual_bond_client import ( - SetSecondaryTimeEventsArgs as PerpetualSetSecondaryTimeEventsArgs, -) -from smart_contracts.artifacts.zero_coupon_bond.zero_coupon_bond_client import ( - AccountOpenArgs as ZeroAccountOpenArgs, -) -from smart_contracts.artifacts.zero_coupon_bond.zero_coupon_bond_client import ( - AssetConfigArgs as ZeroAssetConfigArgs, -) -from smart_contracts.artifacts.zero_coupon_bond.zero_coupon_bond_client import ( - AssetCreateArgs as ZeroAssetCreateArgs, -) -from smart_contracts.artifacts.zero_coupon_bond.zero_coupon_bond_client import ( - AssetMetadata as ZeroAssetMetadata, -) -from smart_contracts.artifacts.zero_coupon_bond.zero_coupon_bond_client import ( - AssetUpdateArgs as ZeroAssetUpdateArgs, -) -from smart_contracts.artifacts.zero_coupon_bond.zero_coupon_bond_client import ( - PrimaryDistributionArgs as ZeroPrimaryDistributionArgs, -) -from smart_contracts.artifacts.zero_coupon_bond.zero_coupon_bond_client import ( - RbacAssignRoleArgs as ZeroRbacAssignRoleArgs, -) -from smart_contracts.artifacts.zero_coupon_bond.zero_coupon_bond_client import ( - RbacGovAssetSuspensionArgs as ZeroRbacGovAssetSuspensionArgs, -) -from smart_contracts.artifacts.zero_coupon_bond.zero_coupon_bond_client import ( - SetDefaultStatusArgs as ZeroSetDefaultStatusArgs, -) -from smart_contracts.artifacts.zero_coupon_bond.zero_coupon_bond_client import ( - SetSecondaryTimeEventsArgs as ZeroSetSecondaryTimeEventsArgs, -) -from smart_contracts.artifacts.zero_coupon_bond.zero_coupon_bond_client import ( - ZeroCouponBondFactory, -) -from tests import utils -from tests.conftest import ( - APR, - ISSUANCE_DELAY, - MATURITY_DELAY, - MINIMUM_DENOMINATION, - PRIMARY_DISTRIBUTION_DELAY, - PRIMARY_DISTRIBUTION_DURATION, - PRINCIPAL, -) - -_FIXED_TOTAL_COUPONS = 2 -_FIXED_COUPON_RATE = APR // _FIXED_TOTAL_COUPONS -_FIXED_COUPON_RATE_INCREASE = 5 -_FIXED_COUPON_RATES = [ - _FIXED_COUPON_RATE + idx * _FIXED_COUPON_RATE_INCREASE - for idx in range(_FIXED_TOTAL_COUPONS) -] -_FIXED_INTEREST_RATE = sum(_FIXED_COUPON_RATES) -_FIXED_COUPON_PERIOD = 30 * sc_cst.DAY_2_SEC - -_ZERO_MATURITY_DELAY = 366 * sc_cst.DAY_2_SEC -_PERPETUAL_COUPON_PERIOD = 360 * sc_cst.DAY_2_SEC - - -@dataclass(frozen=True) -class ContractCapabilities: - has_maturity: bool - has_coupon: bool - has_principal: bool - has_time_periods: bool - has_coupon_rates: bool - - -@dataclass(frozen=True) -class ContractCase: - name: str - metadata_contract_type: int - prospectus_url: str - factory_class: Any - asset_metadata_cls: Any - asset_create_args_cls: Any - asset_config_args_cls: Any - asset_update_args_cls: Any - account_open_args_cls: Any - primary_distribution_args_cls: Any - set_secondary_time_events_args_cls: Any - rbac_assign_role_args_cls: Any - rbac_gov_asset_suspension_args_cls: Any - set_default_status_args_cls: Any - capabilities: ContractCapabilities - build_time_events: Callable[[int], utils.TimeEvents] - build_config: Callable[[utils.Currency, utils.TimeEvents, int], utils.DAsaConfig] - secondary_market_time_events: Callable[[Any], list[int]] - - def total_asa_funds(self, cfg: utils.DAsaConfig) -> int: - funding_rate = ( - cfg.interest_rate if cfg.interest_rate else cfg.principal_discount - ) - return cfg.principal * (sc_cst.BPS + funding_rate) // sc_cst.BPS - - -def _zero_time_events(current_ts: int) -> utils.TimeEvents: - primary_open = current_ts + PRIMARY_DISTRIBUTION_DELAY - primary_close = primary_open + PRIMARY_DISTRIBUTION_DURATION - issuance_date = primary_close + ISSUANCE_DELAY - maturity_date = issuance_date + _ZERO_MATURITY_DELAY - return [primary_open, primary_close, issuance_date, maturity_date] - - -def _fixed_time_events(current_ts: int) -> utils.TimeEvents: - primary_open = current_ts + PRIMARY_DISTRIBUTION_DELAY - primary_close = primary_open + PRIMARY_DISTRIBUTION_DURATION - issuance_date = primary_close + ISSUANCE_DELAY - coupon_dates = [ - issuance_date + idx * _FIXED_COUPON_PERIOD - for idx in range(1, _FIXED_TOTAL_COUPONS + 1) - ] - maturity_date = coupon_dates[-1] + MATURITY_DELAY - return [primary_open, primary_close, issuance_date, *coupon_dates, maturity_date] - - -def _perpetual_time_events(current_ts: int) -> utils.TimeEvents: - primary_open = current_ts + PRIMARY_DISTRIBUTION_DELAY - primary_close = primary_open + PRIMARY_DISTRIBUTION_DURATION - issuance_date = primary_close + ISSUANCE_DELAY - return [primary_open, primary_close, issuance_date] - - -def _zero_config( - currency: utils.Currency, - time_events: utils.TimeEvents, - day_count_convention: int, -) -> utils.DAsaConfig: - return utils.DAsaConfig( - denomination_asset_id=currency.id, - settlement_asset_id=currency.id, - principal=PRINCIPAL, - principal_discount=APR, - minimum_denomination=MINIMUM_DENOMINATION, - day_count_convention=day_count_convention, - interest_rate=0, - coupon_rates=[], - time_events=time_events, - time_periods=[], - ) - - -def _fixed_config( - currency: utils.Currency, - time_events: utils.TimeEvents, - day_count_convention: int, -) -> utils.DAsaConfig: - return utils.DAsaConfig( - denomination_asset_id=currency.id, - settlement_asset_id=currency.id, - principal=PRINCIPAL, - principal_discount=0, - minimum_denomination=MINIMUM_DENOMINATION, - day_count_convention=day_count_convention, - interest_rate=_FIXED_INTEREST_RATE, - coupon_rates=_FIXED_COUPON_RATES, - time_events=time_events, - time_periods=[], - ) - - -def _perpetual_config( - currency: utils.Currency, - time_events: utils.TimeEvents, - day_count_convention: int, -) -> utils.DAsaConfig: - return utils.DAsaConfig( - denomination_asset_id=currency.id, - settlement_asset_id=currency.id, - principal=PRINCIPAL, - principal_discount=0, - minimum_denomination=MINIMUM_DENOMINATION, - day_count_convention=day_count_convention, - interest_rate=APR, - coupon_rates=[], - time_events=time_events, - time_periods=[(_PERPETUAL_COUPON_PERIOD, 0)], - ) - - -def _secondary_schedule_with_maturity(state: Any) -> list[int]: - return [state.issuance_date, state.maturity_date] - - -def _secondary_schedule_perpetual(state: Any) -> list[int]: - return [state.issuance_date] - - -CONTRACT_CASES = ( - ContractCase( - name="zero_coupon_bond", - metadata_contract_type=sc_cst.CT_PAM, - prospectus_url="Zero Coupon Bond Prospectus", - factory_class=ZeroCouponBondFactory, - asset_metadata_cls=ZeroAssetMetadata, - asset_create_args_cls=ZeroAssetCreateArgs, - asset_config_args_cls=ZeroAssetConfigArgs, - asset_update_args_cls=ZeroAssetUpdateArgs, - account_open_args_cls=ZeroAccountOpenArgs, - primary_distribution_args_cls=ZeroPrimaryDistributionArgs, - set_secondary_time_events_args_cls=ZeroSetSecondaryTimeEventsArgs, - rbac_assign_role_args_cls=ZeroRbacAssignRoleArgs, - rbac_gov_asset_suspension_args_cls=ZeroRbacGovAssetSuspensionArgs, - set_default_status_args_cls=ZeroSetDefaultStatusArgs, - capabilities=ContractCapabilities( - has_maturity=True, - has_coupon=False, - has_principal=True, - has_time_periods=False, - has_coupon_rates=False, - ), - build_time_events=_zero_time_events, - build_config=_zero_config, - secondary_market_time_events=_secondary_schedule_with_maturity, - ), - ContractCase( - name="fixed_coupon_bond", - metadata_contract_type=sc_cst.CT_PAM, - prospectus_url="Fixed Coupon Bond Prospectus", - factory_class=FixedCouponBondFactory, - asset_metadata_cls=FixedAssetMetadata, - asset_create_args_cls=FixedAssetCreateArgs, - asset_config_args_cls=FixedAssetConfigArgs, - asset_update_args_cls=FixedAssetUpdateArgs, - account_open_args_cls=FixedAccountOpenArgs, - primary_distribution_args_cls=FixedPrimaryDistributionArgs, - set_secondary_time_events_args_cls=FixedSetSecondaryTimeEventsArgs, - rbac_assign_role_args_cls=FixedRbacAssignRoleArgs, - rbac_gov_asset_suspension_args_cls=FixedRbacGovAssetSuspensionArgs, - set_default_status_args_cls=FixedSetDefaultStatusArgs, - capabilities=ContractCapabilities( - has_maturity=True, - has_coupon=True, - has_principal=True, - has_time_periods=False, - has_coupon_rates=True, - ), - build_time_events=_fixed_time_events, - build_config=_fixed_config, - secondary_market_time_events=_secondary_schedule_with_maturity, - ), - ContractCase( - name="perpetual_bond", - metadata_contract_type=sc_cst.CT_PBN, - prospectus_url="Perpetual Bond Prospectus", - factory_class=PerpetualBondFactory, - asset_metadata_cls=PerpetualAssetMetadata, - asset_create_args_cls=PerpetualAssetCreateArgs, - asset_config_args_cls=PerpetualAssetConfigArgs, - asset_update_args_cls=PerpetualAssetUpdateArgs, - account_open_args_cls=PerpetualAccountOpenArgs, - primary_distribution_args_cls=PerpetualPrimaryDistributionArgs, - set_secondary_time_events_args_cls=PerpetualSetSecondaryTimeEventsArgs, - rbac_assign_role_args_cls=PerpetualRbacAssignRoleArgs, - rbac_gov_asset_suspension_args_cls=PerpetualRbacGovAssetSuspensionArgs, - set_default_status_args_cls=PerpetualSetDefaultStatusArgs, - capabilities=ContractCapabilities( - has_maturity=False, - has_coupon=True, - has_principal=False, - has_time_periods=True, - has_coupon_rates=False, - ), - build_time_events=_perpetual_time_events, - build_config=_perpetual_config, - secondary_market_time_events=_secondary_schedule_perpetual, - ), -) diff --git a/tests/shared/conftest.py b/tests/shared/conftest.py deleted file mode 100644 index da7988fa..00000000 --- a/tests/shared/conftest.py +++ /dev/null @@ -1,229 +0,0 @@ -from collections.abc import Callable -from typing import Any - -import pytest -from algokit_utils import AlgorandClient, SigningAccount - -from smart_contracts import constants as sc_cst -from tests import conftest_helpers as helpers -from tests import utils -from tests.conftest import INITIAL_D_ASA_UNITS - -from .cases import CONTRACT_CASES, ContractCase - - -@pytest.fixture(scope="function", params=CONTRACT_CASES, ids=lambda case: case.name) -def contract_case(request: pytest.FixtureRequest) -> ContractCase: - return request.param - - -@pytest.fixture(scope="function") -def shared_asset_metadata(contract_case: ContractCase) -> Any: - return contract_case.asset_metadata_cls( - contract_type=contract_case.metadata_contract_type, - calendar=sc_cst.CLDR_NC, - business_day_convention=sc_cst.BDC_NOS, - end_of_month_convention=sc_cst.EOMC_SD, - prepayment_effect=sc_cst.PPEF_N, - penalty_type=sc_cst.PYTP_N, - prospectus_hash=bytes(32), - prospectus_url=contract_case.prospectus_url, - ) - - -@pytest.fixture(scope="function") -def shared_time_events( - algorand: AlgorandClient, - contract_case: ContractCase, -) -> utils.TimeEvents: - current_ts = utils.get_latest_timestamp(algorand.client.algod) - return contract_case.build_time_events(current_ts) - - -@pytest.fixture(scope="function") -def shared_cfg( - contract_case: ContractCase, - currency: utils.Currency, - shared_time_events: utils.TimeEvents, - day_count_convention: int, -) -> utils.DAsaConfig: - return contract_case.build_config( - currency, shared_time_events, day_count_convention - ) - - -@pytest.fixture(scope="function") -def shared_client_empty( - algorand: AlgorandClient, - arranger: SigningAccount, - contract_case: ContractCase, - shared_asset_metadata: Any, -) -> Any: - return helpers.create_and_fund_client( - algorand, - contract_case.factory_class, - arranger, - contract_case.asset_create_args_cls( - arranger=arranger.address, - metadata=shared_asset_metadata, - ), - ) - - -@pytest.fixture(scope="function") -def shared_account_manager( - algorand: AlgorandClient, - contract_case: ContractCase, - shared_client_empty: Any, -) -> utils.DAsaAccountManager: - return helpers.create_role_account( - algorand, - utils.DAsaAccountManager, - shared_client_empty, - rbac_assign_role_args_class=contract_case.rbac_assign_role_args_cls, - ) - - -@pytest.fixture(scope="function") -def shared_authority( - algorand: AlgorandClient, - contract_case: ContractCase, - shared_client_empty: Any, -) -> utils.DAsaAuthority: - return helpers.create_role_account( - algorand, - utils.DAsaAuthority, - shared_client_empty, - rbac_assign_role_args_class=contract_case.rbac_assign_role_args_cls, - ) - - -@pytest.fixture(scope="function") -def shared_trustee( - algorand: AlgorandClient, - contract_case: ContractCase, - shared_client_empty: Any, -) -> utils.DAsaTrustee: - return helpers.create_role_account( - algorand, - utils.DAsaTrustee, - shared_client_empty, - rbac_assign_role_args_class=contract_case.rbac_assign_role_args_cls, - ) - - -@pytest.fixture(scope="function") -def shared_interest_oracle( - algorand: AlgorandClient, - contract_case: ContractCase, - shared_client_empty: Any, -) -> utils.DAsaInterestOracle: - return helpers.create_role_account( - algorand, - utils.DAsaInterestOracle, - shared_client_empty, - rbac_assign_role_args_class=contract_case.rbac_assign_role_args_cls, - ) - - -@pytest.fixture(scope="function") -def shared_client_active( - algorand: AlgorandClient, - bank: SigningAccount, - contract_case: ContractCase, - shared_cfg: utils.DAsaConfig, - shared_client_empty: Any, -) -> Any: - return helpers.activate_client_with_config_and_funding( - algorand, - shared_client_empty, - bank, - shared_cfg, - contract_case.total_asa_funds(shared_cfg), - contract_case.asset_config_args_cls, - ) - - -@pytest.fixture(scope="function") -def shared_primary_dealer( - algorand: AlgorandClient, - contract_case: ContractCase, - shared_client_active: Any, -) -> utils.DAsaPrimaryDealer: - state = shared_client_active.state.global_state - role_config = utils.set_role_config( - state.primary_distribution_opening_date, - state.primary_distribution_closure_date, - ) - return helpers.create_role_account( - algorand, - utils.DAsaPrimaryDealer, - shared_client_active, - role_config, - contract_case.rbac_assign_role_args_cls, - ) - - -@pytest.fixture(scope="function") -def shared_account_factory( - algorand: AlgorandClient, - currency: utils.Currency, - shared_account_manager: utils.DAsaAccountManager, - contract_case: ContractCase, -) -> Callable[[Any], utils.DAsaAccount]: - return helpers.build_account_factory( - algorand, - currency, - shared_account_manager, - contract_case.account_open_args_cls, - ) - - -@pytest.fixture(scope="function") -def shared_client_primary( - contract_case: ContractCase, - shared_client_active: Any, -) -> Any: - state = shared_client_active.state.global_state - return helpers.set_client_to_primary_phase( - shared_client_active, - contract_case.set_secondary_time_events_args_cls, - contract_case.secondary_market_time_events(state), - ) - - -@pytest.fixture(scope="function") -def shared_account_with_units_factory( - shared_account_factory: Callable[[Any], utils.DAsaAccount], - shared_primary_dealer: utils.DAsaPrimaryDealer, - shared_client_primary: Any, - contract_case: ContractCase, -) -> Callable[..., utils.DAsaAccount]: - return helpers.build_account_with_units_factory( - shared_account_factory, - shared_primary_dealer, - shared_client_primary, - contract_case.primary_distribution_args_cls, - INITIAL_D_ASA_UNITS, - ) - - -@pytest.fixture(scope="function") -def shared_account_a( - shared_account_with_units_factory: Callable[..., utils.DAsaAccount], -) -> utils.DAsaAccount: - return shared_account_with_units_factory() - - -@pytest.fixture(scope="function") -def shared_account_b( - shared_account_with_units_factory: Callable[..., utils.DAsaAccount], -) -> utils.DAsaAccount: - return shared_account_with_units_factory(units=2 * INITIAL_D_ASA_UNITS) - - -@pytest.fixture(scope="function") -def shared_client_ongoing(shared_client_primary: Any) -> Any: - state = shared_client_primary.state.global_state - utils.time_warp(state.issuance_date) - return shared_client_primary diff --git a/tests/shared/test_asset_config.py b/tests/shared/test_asset_config.py deleted file mode 100644 index 01e45f48..00000000 --- a/tests/shared/test_asset_config.py +++ /dev/null @@ -1,267 +0,0 @@ -import re -from copy import deepcopy -from typing import Any - -import pytest -from algokit_utils import CommonAppCallParams, LogicError, SigningAccount - -from smart_contracts import constants as sc_cst -from smart_contracts import enums -from smart_contracts import errors as err - -from .cases import ContractCase - - -def test_pass_asset_config( - contract_case: ContractCase, - currency: Any, - shared_cfg: Any, - shared_client_empty: Any, -) -> None: - shared_client_empty.send.asset_config( - contract_case.asset_config_args_cls(**shared_cfg.dictify()) - ) - - state = shared_client_empty.state.global_state - expected_time_events = shared_client_empty.send.get_time_events().abi_return - - assert state.denomination_asset_id == currency.id - assert state.settlement_asset_id == state.denomination_asset_id - assert state.unit_value == shared_cfg.minimum_denomination - assert state.day_count_convention == shared_cfg.day_count_convention - - assert state.total_units == shared_cfg.principal // shared_cfg.minimum_denomination - assert not state.circulating_units - assert state.principal_discount == shared_cfg.principal_discount - assert state.interest_rate == shared_cfg.interest_rate - assert state.total_coupons == shared_cfg.total_coupons - - if contract_case.capabilities.has_coupon_rates: - expected_coupon_rates = shared_client_empty.send.get_coupon_rates().abi_return - assert expected_coupon_rates == shared_cfg.coupon_rates - - if contract_case.capabilities.has_time_periods: - expected_time_periods = shared_client_empty.send.get_time_periods().abi_return - assert expected_time_periods[0][0] == shared_cfg.time_periods[0][0] - assert expected_time_periods[0][1] == shared_cfg.time_periods[0][1] - assert state.coupon_period == shared_cfg.time_periods[0][0] - - assert expected_time_events == shared_cfg.time_events - assert state.primary_distribution_opening_date == shared_cfg.time_events[0] - assert state.primary_distribution_closure_date == shared_cfg.time_events[1] - assert state.issuance_date == shared_cfg.time_events[2] - assert not state.secondary_market_opening_date - assert not state.secondary_market_closure_date - - if contract_case.capabilities.has_maturity: - assert state.maturity_date == shared_cfg.time_events[-1] - else: - assert not state.maturity_date - - assert state.status == enums.STATUS_ACTIVE - assert not state.asset_suspended - - -def test_fail_unauthorized( - contract_case: ContractCase, - no_role_account: SigningAccount, - shared_cfg: Any, - shared_client_empty: Any, -) -> None: - with pytest.raises(LogicError, match=err.UNAUTHORIZED): - shared_client_empty.send.asset_config( - contract_case.asset_config_args_cls(**shared_cfg.dictify()), - params=CommonAppCallParams(sender=no_role_account.address), - ) - - -def test_fail_already_configured( - contract_case: ContractCase, - shared_cfg: Any, - shared_client_active: Any, -) -> None: - with pytest.raises(LogicError, match=err.ALREADY_CONFIGURED): - shared_client_active.send.asset_config( - contract_case.asset_config_args_cls(**shared_cfg.dictify()) - ) - - -def test_fail_invalid_denomination( - contract_case: ContractCase, - shared_cfg: Any, - shared_client_empty: Any, -) -> None: - wrong_cfg = deepcopy(shared_cfg) - wrong_cfg.denomination_asset_id = 0 - with pytest.raises(LogicError, match=err.INVALID_DENOMINATION): - shared_client_empty.send.asset_config( - contract_case.asset_config_args_cls(**wrong_cfg.dictify()) - ) - - -def test_fail_invalid_minimum_denomination( - contract_case: ContractCase, - shared_cfg: Any, - shared_client_empty: Any, -) -> None: - wrong_cfg = deepcopy(shared_cfg) - wrong_cfg.minimum_denomination -= 1 - with pytest.raises(LogicError, match=err.INVALID_MINIMUM_DENOMINATION): - shared_client_empty.send.asset_config( - contract_case.asset_config_args_cls(**wrong_cfg.dictify()) - ) - - -def test_fail_invalid_day_count_convention( - contract_case: ContractCase, - shared_cfg: Any, - shared_client_empty: Any, -) -> None: - wrong_cfg = deepcopy(shared_cfg) - wrong_cfg.day_count_convention = sc_cst.DCC_CONT - 1 - with pytest.raises(LogicError, match=err.INVALID_DAY_COUNT_CONVENTION): - shared_client_empty.send.asset_config( - contract_case.asset_config_args_cls(**wrong_cfg.dictify()) - ) - - -def test_fail_invalid_interest_rate( - contract_case: ContractCase, - shared_cfg: Any, - shared_client_empty: Any, -) -> None: - wrong_cfg = deepcopy(shared_cfg) - wrong_cfg.interest_rate = 1 if shared_cfg.principal_discount else 0 - with pytest.raises(LogicError, match=err.INVALID_INTEREST_RATE): - shared_client_empty.send.asset_config( - contract_case.asset_config_args_cls(**wrong_cfg.dictify()) - ) - - -def test_fail_invalid_coupon_rates( - contract_case: ContractCase, - shared_cfg: Any, - shared_client_empty: Any, -) -> None: - wrong_cfg = deepcopy(shared_cfg) - wrong_cfg.coupon_rates = [] if contract_case.capabilities.has_coupon_rates else [1] - with pytest.raises(LogicError, match=err.INVALID_COUPON_RATES): - shared_client_empty.send.asset_config( - contract_case.asset_config_args_cls(**wrong_cfg.dictify()) - ) - - -def test_fail_invalid_time_events_length( - contract_case: ContractCase, - shared_cfg: Any, - shared_client_empty: Any, -) -> None: - wrong_cfg = deepcopy(shared_cfg) - wrong_cfg.time_events = [*shared_cfg.time_events, 0] - with pytest.raises(LogicError, match=err.INVALID_TIME_EVENTS_LENGTH): - shared_client_empty.send.asset_config( - contract_case.asset_config_args_cls(**wrong_cfg.dictify()) - ) - - -def test_fail_invalid_time( - contract_case: ContractCase, - shared_cfg: Any, - shared_client_empty: Any, -) -> None: - wrong_cfg = deepcopy(shared_cfg) - wrong_cfg.time_events[0] = 0 - with pytest.raises(LogicError, match=err.INVALID_TIME): - shared_client_empty.send.asset_config( - contract_case.asset_config_args_cls(**wrong_cfg.dictify()) - ) - - -def test_fail_invalid_sorting( - contract_case: ContractCase, - shared_cfg: Any, - shared_client_empty: Any, -) -> None: - wrong_cfg = deepcopy(shared_cfg) - wrong_cfg.time_events[-1] = shared_cfg.time_events[-2] - with pytest.raises(LogicError, match=err.INVALID_SORTING): - shared_client_empty.send.asset_config( - contract_case.asset_config_args_cls(**wrong_cfg.dictify()) - ) - - -def test_fail_invalid_time_period_representation( - contract_case: ContractCase, - shared_cfg: Any, - shared_client_empty: Any, -) -> None: - wrong_cfg = deepcopy(shared_cfg) - wrong_cfg.time_periods = ( - [] if contract_case.capabilities.has_time_periods else [(1, 1)] - ) - with pytest.raises(LogicError, match=err.INVALID_TIME_PERIODS): - shared_client_empty.send.asset_config( - contract_case.asset_config_args_cls(**wrong_cfg.dictify()) - ) - - -def test_fail_invalid_settlement_asset( - contract_case: ContractCase, - shared_cfg: Any, - shared_client_empty: Any, -) -> None: - wrong_cfg = deepcopy(shared_cfg) - wrong_cfg.settlement_asset_id = wrong_cfg.denomination_asset_id + 1 - with pytest.raises(LogicError, match=err.INVALID_SETTLEMENT_ASSET): - shared_client_empty.send.asset_config( - contract_case.asset_config_args_cls(**wrong_cfg.dictify()) - ) - - -def test_fail_invalid_time_period_for_actual_actual( - contract_case: ContractCase, - day_count_convention: int, - shared_cfg: Any, - shared_client_empty: Any, -) -> None: - if day_count_convention != sc_cst.DCC_A_A: - pytest.skip("requires Actual/Actual day count convention") - - wrong_cfg = deepcopy(shared_cfg) - wrong_cfg.time_events[1] = wrong_cfg.time_events[0] + 1 - with pytest.raises(LogicError, match=re.escape(err.INVALID_TIME_PERIOD)): - shared_client_empty.send.asset_config( - contract_case.asset_config_args_cls(**wrong_cfg.dictify()) - ) - - -def test_fail_invalid_time_period_duration_for_perpetual( - contract_case: ContractCase, - shared_cfg: Any, - shared_client_empty: Any, -) -> None: - if not contract_case.capabilities.has_time_periods: - pytest.skip("contract has no recurring time periods") - - wrong_cfg = deepcopy(shared_cfg) - wrong_cfg.time_periods[0] = (0, 0) - with pytest.raises(LogicError, match=err.INVALID_TIME_PERIOD_DURATION): - shared_client_empty.send.asset_config( - contract_case.asset_config_args_cls(**wrong_cfg.dictify()) - ) - - -def test_fail_invalid_time_period_repetitions_for_perpetual( - contract_case: ContractCase, - shared_cfg: Any, - shared_client_empty: Any, -) -> None: - if not contract_case.capabilities.has_time_periods: - pytest.skip("contract has no recurring time periods") - - wrong_cfg = deepcopy(shared_cfg) - wrong_cfg.time_periods[0] = (shared_cfg.time_periods[0][0], 1) - with pytest.raises(LogicError, match=err.INVALID_TIME_PERIOD_REPETITIONS): - shared_client_empty.send.asset_config( - contract_case.asset_config_args_cls(**wrong_cfg.dictify()) - ) diff --git a/tests/shared/test_asset_create.py b/tests/shared/test_asset_create.py deleted file mode 100644 index 52b669e4..00000000 --- a/tests/shared/test_asset_create.py +++ /dev/null @@ -1,58 +0,0 @@ -from typing import Any - -from algokit_utils import SigningAccount - -from smart_contracts import enums - -from .cases import ContractCase - - -def test_pass_asset_create( - arranger: SigningAccount, - contract_case: ContractCase, - shared_asset_metadata: Any, - shared_client_empty: Any, -) -> None: - state = shared_client_empty.state.global_state - - assert state.arranger == arranger.address - assert not state.denomination_asset_id - assert not state.settlement_asset_id - assert not state.unit_value - assert not state.day_count_convention - - metadata = shared_client_empty.send.get_asset_metadata().abi_return - assert metadata.contract_type == shared_asset_metadata.contract_type - assert metadata.calendar == shared_asset_metadata.calendar - assert ( - metadata.business_day_convention - == shared_asset_metadata.business_day_convention - ) - assert ( - metadata.end_of_month_convention - == shared_asset_metadata.end_of_month_convention - ) - assert metadata.prepayment_effect == shared_asset_metadata.prepayment_effect - assert metadata.penalty_type == shared_asset_metadata.penalty_type - assert bytes(metadata.prospectus_hash) == shared_asset_metadata.prospectus_hash - assert metadata.prospectus_url == shared_asset_metadata.prospectus_url - - assert not state.total_units - assert not state.circulating_units - assert not state.principal_discount - assert not state.total_coupons - - if contract_case.capabilities.has_coupon and hasattr(state, "paid_coupon_units"): - assert not state.paid_coupon_units - if contract_case.capabilities.has_time_periods and hasattr(state, "coupon_period"): - assert not state.coupon_period - - assert not state.primary_distribution_opening_date - assert not state.primary_distribution_closure_date - assert not state.issuance_date - assert not state.secondary_market_opening_date - assert not state.secondary_market_closure_date - assert not state.maturity_date - - assert state.status == enums.STATUS_INACTIVE - assert not state.asset_suspended diff --git a/tests/shared/test_asset_update.py b/tests/shared/test_asset_update.py deleted file mode 100644 index 9ac83d89..00000000 --- a/tests/shared/test_asset_update.py +++ /dev/null @@ -1,49 +0,0 @@ -from typing import Any - -import pytest -from algokit_utils import CommonAppCallParams, LogicError, SigningAccount - -from smart_contracts import errors as err - -from .cases import ContractCase - -_UPDATED_PROSPECTUS_URL = "Updated Prospectus" - - -def test_pass_asset_update( - contract_case: ContractCase, - shared_asset_metadata: Any, - shared_client_active: Any, -) -> None: - metadata = shared_client_active.send.get_asset_metadata().abi_return - assert metadata.prospectus_url == shared_asset_metadata.prospectus_url - - updated_metadata = contract_case.asset_metadata_cls( - contract_type=shared_asset_metadata.contract_type, - calendar=shared_asset_metadata.calendar, - business_day_convention=shared_asset_metadata.business_day_convention, - end_of_month_convention=shared_asset_metadata.end_of_month_convention, - prepayment_effect=shared_asset_metadata.prepayment_effect, - penalty_type=shared_asset_metadata.penalty_type, - prospectus_hash=shared_asset_metadata.prospectus_hash, - prospectus_url=_UPDATED_PROSPECTUS_URL, - ) - shared_client_active.send.update.asset_update( - contract_case.asset_update_args_cls(metadata=updated_metadata) - ) - - metadata = shared_client_active.send.get_asset_metadata().abi_return - assert metadata.prospectus_url == _UPDATED_PROSPECTUS_URL - - -def test_fail_unauthorized( - contract_case: ContractCase, - no_role_account: SigningAccount, - shared_asset_metadata: Any, - shared_client_active: Any, -) -> None: - with pytest.raises(LogicError, match=err.UNAUTHORIZED): - shared_client_active.send.update.asset_update( - contract_case.asset_update_args_cls(metadata=shared_asset_metadata), - params=CommonAppCallParams(sender=no_role_account.address), - ) diff --git a/tests/shared/test_core_getters.py b/tests/shared/test_core_getters.py deleted file mode 100644 index a130b15f..00000000 --- a/tests/shared/test_core_getters.py +++ /dev/null @@ -1,86 +0,0 @@ -from typing import Any - -import pytest -from algokit_utils import CommonAppCallParams - -from smart_contracts import constants as sc_cst - -from .cases import ContractCase - - -def test_get_time_events_when_not_configured(shared_client_empty: Any) -> None: - assert not shared_client_empty.send.get_time_events().abi_return - - -def test_get_time_events_after_config( - shared_cfg: Any, shared_client_active: Any -) -> None: - assert ( - shared_client_active.send.get_time_events().abi_return == shared_cfg.time_events - ) - - -def test_get_asset_metadata( - shared_asset_metadata: Any, shared_client_empty: Any -) -> None: - metadata = shared_client_empty.send.get_asset_metadata().abi_return - assert metadata.contract_type == shared_asset_metadata.contract_type - assert metadata.prospectus_url == shared_asset_metadata.prospectus_url - - -def test_get_secondary_market_schedule_default(shared_client_active: Any) -> None: - schedule = shared_client_active.send.get_secondary_market_schedule().abi_return - assert schedule == [0, 0] - - -def test_get_asset_info_active(shared_cfg: Any, shared_client_active: Any) -> None: - info = shared_client_active.send.get_asset_info().abi_return - - assert info.denomination_asset_id == shared_cfg.denomination_asset_id - assert info.settlement_asset_id == shared_cfg.settlement_asset_id - assert info.outstanding_principal == 0 - assert info.unit_value == shared_cfg.minimum_denomination - assert info.day_count_convention == shared_cfg.day_count_convention - assert info.principal_discount == shared_cfg.principal_discount - assert info.interest_rate == shared_cfg.interest_rate - assert info.total_supply == shared_cfg.principal // shared_cfg.minimum_denomination - assert info.circulating_supply == 0 - assert info.primary_distribution_opening_date == shared_cfg.time_events[0] - assert info.primary_distribution_closure_date == shared_cfg.time_events[1] - assert info.issuance_date == shared_cfg.time_events[2] - if len(shared_cfg.time_events) > 3: - assert info.maturity_date == shared_cfg.time_events[-1] - else: - assert info.maturity_date == 0 - assert not info.suspended - assert info.performance == sc_cst.PRF_PERFORMANT - - -def test_get_asset_info_defaulted( - contract_case: ContractCase, - shared_client_ongoing: Any, - shared_trustee: Any, -) -> None: - shared_client_ongoing.send.set_default_status( - contract_case.set_default_status_args_cls(defaulted=True), - params=CommonAppCallParams(sender=shared_trustee.address), - ) - info = shared_client_ongoing.send.get_asset_info().abi_return - assert info.performance == sc_cst.PRF_DEFAULTED - - -def test_get_asset_info_matured( - contract_case: ContractCase, - shared_client_primary: Any, -) -> None: - if not contract_case.capabilities.has_maturity: - pytest.skip("perpetual contract has no maturity date") - - state = shared_client_primary.state.global_state - from tests.utils import ( - time_warp, - ) # local import avoids circular fixture module import at load time - - time_warp(state.maturity_date + sc_cst.DAY_2_SEC) - info = shared_client_primary.send.get_asset_info().abi_return - assert info.performance == sc_cst.PRF_MATURED diff --git a/tests/shared/test_financial_error_paths.py b/tests/shared/test_financial_error_paths.py deleted file mode 100644 index 7159e123..00000000 --- a/tests/shared/test_financial_error_paths.py +++ /dev/null @@ -1,197 +0,0 @@ -from typing import Any - -import pytest -from algokit_utils import CommonAppCallParams, LogicError, SigningAccount - -from smart_contracts import errors as err -from tests import utils -from tests.utils import time_warp - -from .cases import ContractCase - - -def test_fail_get_account_units_current_value_no_primary_distribution( - no_role_account: SigningAccount, - shared_client_active: Any, -) -> None: - with pytest.raises(LogicError, match=err.NO_PRIMARY_DISTRIBUTION): - shared_client_active.send.get_account_units_current_value( - (no_role_account.address, 1) - ) - - -def test_fail_get_account_units_current_value_invalid_holding_address( - no_role_account: SigningAccount, - shared_client_primary: Any, -) -> None: - with pytest.raises(LogicError, match=err.INVALID_HOLDING_ADDRESS): - shared_client_primary.send.get_account_units_current_value( - (no_role_account.address, 1) - ) - - -def test_fail_get_account_units_current_value_invalid_units( - shared_account_a: utils.DAsaAccount, - shared_client_primary: Any, -) -> None: - with pytest.raises(LogicError, match=err.INVALID_UNITS): - shared_client_primary.send.get_account_units_current_value( - (shared_account_a.holding_address, shared_account_a.units + 1) - ) - - -def test_fail_get_account_units_current_value_pending_coupon_payment( - contract_case: ContractCase, - shared_account_a: utils.DAsaAccount, - shared_account_b: utils.DAsaAccount, - shared_client_ongoing: Any, -) -> None: - if not contract_case.capabilities.has_coupon: - pytest.skip("contract has no coupons") - - next_coupon_due_date = ( - shared_client_ongoing.send.get_coupons_status().abi_return.next_coupon_due_date - ) - time_warp(next_coupon_due_date) - shared_client_ongoing.send.pay_coupon((shared_account_a.holding_address, b"")) - - with pytest.raises(LogicError, match=err.PENDING_COUPON_PAYMENT): - shared_client_ongoing.send.get_account_units_current_value( - (shared_account_b.holding_address, 1) - ) - - -def test_fail_pay_principal_unauthorized_status( - contract_case: ContractCase, - no_role_account: SigningAccount, - shared_client_empty: Any, -) -> None: - if not contract_case.capabilities.has_principal: - pytest.skip("contract has no principal payments") - - with pytest.raises(LogicError, match=err.UNAUTHORIZED): - shared_client_empty.send.pay_principal((no_role_account.address, b"")) - - -def test_fail_pay_principal_defaulted( - contract_case: ContractCase, - shared_account_a: utils.DAsaAccount, - shared_trustee: utils.DAsaTrustee, - shared_client_ongoing: Any, -) -> None: - if not contract_case.capabilities.has_principal: - pytest.skip("contract has no principal payments") - - shared_client_ongoing.send.set_default_status( - (True,), - params=CommonAppCallParams(sender=shared_trustee.address), - ) - with pytest.raises(LogicError, match=err.DEFAULTED): - shared_client_ongoing.send.pay_principal( - (shared_account_a.holding_address, b"") - ) - - -def test_fail_pay_principal_suspended( - contract_case: ContractCase, - shared_account_a: utils.DAsaAccount, - shared_authority: utils.DAsaAuthority, - shared_client_ongoing: Any, -) -> None: - if not contract_case.capabilities.has_principal: - pytest.skip("contract has no principal payments") - - shared_client_ongoing.send.rbac_gov_asset_suspension( - (True,), - params=CommonAppCallParams(sender=shared_authority.address), - ) - with pytest.raises(LogicError, match=err.SUSPENDED): - shared_client_ongoing.send.pay_principal( - (shared_account_a.holding_address, b"") - ) - - -def test_fail_pay_coupon_unauthorized_status( - contract_case: ContractCase, - no_role_account: SigningAccount, - shared_client_empty: Any, -) -> None: - if not contract_case.capabilities.has_coupon: - pytest.skip("contract has no coupon payments") - - with pytest.raises(LogicError, match=err.UNAUTHORIZED): - shared_client_empty.send.pay_coupon((no_role_account.address, b"")) - - -def test_fail_pay_coupon_defaulted( - contract_case: ContractCase, - shared_account_a: utils.DAsaAccount, - shared_trustee: utils.DAsaTrustee, - shared_client_ongoing: Any, -) -> None: - if not contract_case.capabilities.has_coupon: - pytest.skip("contract has no coupon payments") - - shared_client_ongoing.send.set_default_status( - (True,), - params=CommonAppCallParams(sender=shared_trustee.address), - ) - with pytest.raises(LogicError, match=err.DEFAULTED): - shared_client_ongoing.send.pay_coupon((shared_account_a.holding_address, b"")) - - -def test_fail_pay_coupon_suspended( - contract_case: ContractCase, - shared_account_a: utils.DAsaAccount, - shared_authority: utils.DAsaAuthority, - shared_client_ongoing: Any, -) -> None: - if not contract_case.capabilities.has_coupon: - pytest.skip("contract has no coupon payments") - - shared_client_ongoing.send.rbac_gov_asset_suspension( - (True,), - params=CommonAppCallParams(sender=shared_authority.address), - ) - with pytest.raises(LogicError, match=err.SUSPENDED): - shared_client_ongoing.send.pay_coupon((shared_account_a.holding_address, b"")) - - -def test_fail_update_interest_rate_defaulted( - contract_case: ContractCase, - shared_interest_oracle: utils.DAsaInterestOracle, - shared_trustee: utils.DAsaTrustee, - shared_client_ongoing: Any, -) -> None: - if contract_case.name != "perpetual_bond": - pytest.skip("only perpetual supports interest rate updates") - - shared_client_ongoing.send.set_default_status( - (True,), - params=CommonAppCallParams(sender=shared_trustee.address), - ) - with pytest.raises(LogicError, match=err.DEFAULTED): - shared_client_ongoing.send.update_interest_rate( - (shared_client_ongoing.state.global_state.interest_rate + 1,), - params=CommonAppCallParams(sender=shared_interest_oracle.address), - ) - - -def test_fail_update_interest_rate_suspended( - contract_case: ContractCase, - shared_interest_oracle: utils.DAsaInterestOracle, - shared_authority: utils.DAsaAuthority, - shared_client_ongoing: Any, -) -> None: - if contract_case.name != "perpetual_bond": - pytest.skip("only perpetual supports interest rate updates") - - shared_client_ongoing.send.rbac_gov_asset_suspension( - (True,), - params=CommonAppCallParams(sender=shared_authority.address), - ) - with pytest.raises(LogicError, match=err.SUSPENDED): - shared_client_ongoing.send.update_interest_rate( - (shared_client_ongoing.state.global_state.interest_rate + 1,), - params=CommonAppCallParams(sender=shared_interest_oracle.address), - ) diff --git a/tests/shared/test_primary_distribution.py b/tests/shared/test_primary_distribution.py deleted file mode 100644 index fbe521b2..00000000 --- a/tests/shared/test_primary_distribution.py +++ /dev/null @@ -1,183 +0,0 @@ -from collections.abc import Callable -from typing import Any - -import pytest -from algokit_utils import ( - AlgorandClient, - CommonAppCallParams, - LogicError, - SigningAccount, -) - -from smart_contracts import errors as err -from tests.utils import DAsaAccount, get_latest_timestamp, time_warp - -from .cases import ContractCase - -_ACCOUNT_TEST_UNITS = 7 - - -def test_pass_primary_distribution( - contract_case: ContractCase, - shared_primary_dealer: Any, - shared_client_primary: Any, - shared_account_factory: Callable[[Any], DAsaAccount], -) -> None: - account = shared_account_factory(shared_client_primary) - state = shared_client_primary.state.global_state - assert state.circulating_units == 0 - - remaining_units = shared_client_primary.send.primary_distribution( - contract_case.primary_distribution_args_cls( - holding_address=account.holding_address, - units=_ACCOUNT_TEST_UNITS, - ), - params=CommonAppCallParams(sender=shared_primary_dealer.address), - ).abi_return - - state = shared_client_primary.state.global_state - assert state.circulating_units == _ACCOUNT_TEST_UNITS - assert remaining_units == state.total_units - state.circulating_units - assert account.payment_address == account.holding_address - assert account.units == _ACCOUNT_TEST_UNITS - assert account.paid_coupons == 0 - - -def test_fail_primary_distribution_closed( - algorand: AlgorandClient, - contract_case: ContractCase, - shared_primary_dealer: Any, - shared_client_primary: Any, - shared_account_factory: Callable[[Any], DAsaAccount], -) -> None: - account = shared_account_factory(shared_client_primary) - state = shared_client_primary.state.global_state - time_warp(state.primary_distribution_closure_date) - assert ( - get_latest_timestamp(algorand.client.algod) - >= state.primary_distribution_closure_date - ) - - with pytest.raises(LogicError, match=err.PRIMARY_DISTRIBUTION_CLOSED): - shared_client_primary.send.primary_distribution( - contract_case.primary_distribution_args_cls( - holding_address=account.holding_address, - units=_ACCOUNT_TEST_UNITS, - ), - params=CommonAppCallParams(sender=shared_primary_dealer.address), - ) - - -def test_fail_unauthorized( - contract_case: ContractCase, - no_role_account: SigningAccount, - shared_client_primary: Any, - shared_account_factory: Callable[[Any], DAsaAccount], -) -> None: - account = shared_account_factory(shared_client_primary) - with pytest.raises(LogicError, match=err.UNAUTHORIZED): - shared_client_primary.send.primary_distribution( - contract_case.primary_distribution_args_cls( - holding_address=account.holding_address, - units=_ACCOUNT_TEST_UNITS, - ), - params=CommonAppCallParams(sender=no_role_account.address), - ) - - -def test_fail_invalid_holding_address( - contract_case: ContractCase, - no_role_account: SigningAccount, - shared_primary_dealer: Any, - shared_client_primary: Any, -) -> None: - with pytest.raises(LogicError, match=err.INVALID_HOLDING_ADDRESS): - shared_client_primary.send.primary_distribution( - contract_case.primary_distribution_args_cls( - holding_address=no_role_account.address, - units=_ACCOUNT_TEST_UNITS, - ), - params=CommonAppCallParams(sender=shared_primary_dealer.address), - ) - - -def test_fail_defaulted_status( - contract_case: ContractCase, - shared_client_primary: Any, - shared_trustee: Any, - shared_primary_dealer: Any, - shared_account_factory: Callable[[Any], DAsaAccount], -) -> None: - account = shared_account_factory(shared_client_primary) - shared_client_primary.send.set_default_status( - contract_case.set_default_status_args_cls(defaulted=True), - params=CommonAppCallParams(sender=shared_trustee.address), - ) - - with pytest.raises(LogicError, match=err.DEFAULTED): - shared_client_primary.send.primary_distribution( - contract_case.primary_distribution_args_cls( - holding_address=account.holding_address, - units=_ACCOUNT_TEST_UNITS, - ), - params=CommonAppCallParams(sender=shared_primary_dealer.address), - ) - - -def test_fail_suspended( - contract_case: ContractCase, - shared_authority: Any, - shared_primary_dealer: Any, - shared_client_primary: Any, - shared_account_factory: Callable[[Any], DAsaAccount], -) -> None: - account = shared_account_factory(shared_client_primary) - shared_client_primary.send.rbac_gov_asset_suspension( - contract_case.rbac_gov_asset_suspension_args_cls(suspended=True), - params=CommonAppCallParams(sender=shared_authority.address), - ) - - with pytest.raises(LogicError, match=err.SUSPENDED): - shared_client_primary.send.primary_distribution( - contract_case.primary_distribution_args_cls( - holding_address=account.holding_address, - units=_ACCOUNT_TEST_UNITS, - ), - params=CommonAppCallParams(sender=shared_primary_dealer.address), - ) - - -def test_fail_zero_units( - contract_case: ContractCase, - shared_primary_dealer: Any, - shared_client_primary: Any, - shared_account_factory: Callable[[Any], DAsaAccount], -) -> None: - account = shared_account_factory(shared_client_primary) - with pytest.raises(LogicError, match=err.ZERO_UNITS): - shared_client_primary.send.primary_distribution( - contract_case.primary_distribution_args_cls( - holding_address=account.holding_address, - units=0, - ), - params=CommonAppCallParams(sender=shared_primary_dealer.address), - ) - - -def test_fail_over_distribution( - contract_case: ContractCase, - shared_primary_dealer: Any, - shared_client_primary: Any, - shared_account_factory: Callable[[Any], DAsaAccount], -) -> None: - account = shared_account_factory(shared_client_primary) - state = shared_client_primary.state.global_state - - with pytest.raises(LogicError, match=err.OVER_DISTRIBUTION): - shared_client_primary.send.primary_distribution( - contract_case.primary_distribution_args_cls( - holding_address=account.holding_address, - units=state.total_units + 1, - ), - params=CommonAppCallParams(sender=shared_primary_dealer.address), - ) diff --git a/tests/shared/test_secondary_schedule.py b/tests/shared/test_secondary_schedule.py deleted file mode 100644 index 776b0850..00000000 --- a/tests/shared/test_secondary_schedule.py +++ /dev/null @@ -1,172 +0,0 @@ -from collections.abc import Callable -from typing import Any - -import pytest -from algokit_utils import CommonAppCallParams, LogicError, SigningAccount - -from smart_contracts import constants as sc_cst -from smart_contracts import errors as err -from smart_contracts.artifacts.zero_coupon_bond.zero_coupon_bond_client import ( - PayPrincipalArgs, -) -from tests.utils import DAsaAccount, time_warp - -from .cases import ContractCase - - -def test_pass_set_secondary_time_events( - contract_case: ContractCase, - shared_client_active: Any, -) -> None: - state = shared_client_active.state.global_state - secondary_market_time_events = contract_case.secondary_market_time_events(state) - expected_schedule = shared_client_active.send.set_secondary_time_events( - contract_case.set_secondary_time_events_args_cls( - secondary_market_time_events=secondary_market_time_events, - ) - ).abi_return - - state = shared_client_active.state.global_state - assert state.secondary_market_opening_date == secondary_market_time_events[0] - assert ( - expected_schedule.secondary_market_opening_date - == secondary_market_time_events[0] - ) - - if contract_case.capabilities.has_maturity: - assert state.secondary_market_closure_date == secondary_market_time_events[1] - assert ( - expected_schedule.secondary_market_closure_date - == secondary_market_time_events[1] - ) - else: - assert state.secondary_market_closure_date == 0 - assert expected_schedule.secondary_market_closure_date == 0 - - -def test_fail_unauthorized_caller( - contract_case: ContractCase, - no_role_account: SigningAccount, - shared_client_active: Any, -) -> None: - state = shared_client_active.state.global_state - with pytest.raises(LogicError, match=err.UNAUTHORIZED): - shared_client_active.send.set_secondary_time_events( - contract_case.set_secondary_time_events_args_cls( - secondary_market_time_events=contract_case.secondary_market_time_events( - state - ) - ), - params=CommonAppCallParams(sender=no_role_account.address), - ) - - -def test_fail_unauthorized_status_ended( - contract_case: ContractCase, - shared_client_primary: Any, - shared_account_with_units_factory: Callable[..., DAsaAccount], -) -> None: - if contract_case.name != "zero_coupon_bond": - pytest.skip("ended status scenario is stable only on zero coupon flow") - - account = shared_account_with_units_factory(units=1) - state = shared_client_primary.state.global_state - time_warp(state.maturity_date) - shared_client_primary.send.pay_principal( - PayPrincipalArgs(holding_address=account.holding_address, payment_info=b"") - ) - - with pytest.raises(LogicError, match=err.UNAUTHORIZED): - shared_client_primary.send.set_secondary_time_events( - contract_case.set_secondary_time_events_args_cls( - secondary_market_time_events=contract_case.secondary_market_time_events( - state - ) - ) - ) - - -def test_fail_defaulted_status( - contract_case: ContractCase, - shared_client_active: Any, - shared_trustee: Any, -) -> None: - state = shared_client_active.state.global_state - shared_client_active.send.set_default_status( - contract_case.set_default_status_args_cls(defaulted=True), - params=CommonAppCallParams(sender=shared_trustee.address), - ) - - with pytest.raises(LogicError, match=err.DEFAULTED): - shared_client_active.send.set_secondary_time_events( - contract_case.set_secondary_time_events_args_cls( - secondary_market_time_events=contract_case.secondary_market_time_events( - state - ) - ) - ) - - -def test_fail_invalid_time_events_length( - contract_case: ContractCase, - shared_client_active: Any, -) -> None: - with pytest.raises(LogicError, match=err.INVALID_TIME_EVENTS_LENGTH): - shared_client_active.send.set_secondary_time_events( - contract_case.set_secondary_time_events_args_cls( - secondary_market_time_events=[] - ) - ) - - -def test_fail_invalid_sorting( - contract_case: ContractCase, - shared_client_active: Any, -) -> None: - state = shared_client_active.state.global_state - invalid_schedule = [state.issuance_date + 2 * sc_cst.DAY_2_SEC, state.issuance_date] - with pytest.raises(LogicError, match=err.INVALID_SORTING): - shared_client_active.send.set_secondary_time_events( - contract_case.set_secondary_time_events_args_cls( - secondary_market_time_events=invalid_schedule, - ) - ) - - -def test_fail_invalid_secondary_opening_date( - contract_case: ContractCase, - shared_client_active: Any, -) -> None: - state = shared_client_active.state.global_state - with pytest.raises(LogicError, match=err.INVALID_SECONDARY_OPENING_DATE): - shared_client_active.send.set_secondary_time_events( - contract_case.set_secondary_time_events_args_cls( - secondary_market_time_events=( - [ - state.issuance_date - sc_cst.DAY_2_SEC, - state.maturity_date, - ] - if contract_case.capabilities.has_maturity - else [state.issuance_date - sc_cst.DAY_2_SEC] - ), - ) - ) - - -def test_fail_invalid_secondary_closure_date( - contract_case: ContractCase, - shared_client_active: Any, -) -> None: - if not contract_case.capabilities.has_maturity: - pytest.skip("perpetual contract has no maturity closure") - - state = shared_client_active.state.global_state - with pytest.raises(LogicError, match=err.INVALID_SECONDARY_CLOSURE_DATE): - shared_client_active.send.set_secondary_time_events( - contract_case.set_secondary_time_events_args_cls( - secondary_market_time_events=[ - state.issuance_date, - state.maturity_date + sc_cst.DAY_2_SEC, - ] - ) - ) diff --git a/tests/shared/test_set_default_status.py b/tests/shared/test_set_default_status.py deleted file mode 100644 index 01f4154a..00000000 --- a/tests/shared/test_set_default_status.py +++ /dev/null @@ -1,32 +0,0 @@ -import pytest -from algokit_utils import CommonAppCallParams, LogicError, SigningAccount - -from smart_contracts import errors as err - - -def test_concrete_pass_set_default_status( - shared_trustee, - shared_client_active, -) -> None: - shared_client_active.send.set_default_status( - (True,), - params=CommonAppCallParams(sender=shared_trustee.address), - ) - assert shared_client_active.state.global_state.asset_defaulted - - shared_client_active.send.set_default_status( - (False,), - params=CommonAppCallParams(sender=shared_trustee.address), - ) - assert not shared_client_active.state.global_state.asset_defaulted - - -def test_concrete_fail_unauthorized( - no_role_account: SigningAccount, - shared_client_active, -) -> None: - with pytest.raises(LogicError, match=err.UNAUTHORIZED): - shared_client_active.send.set_default_status( - (True,), - params=CommonAppCallParams(sender=no_role_account.address), - ) diff --git a/tests/zero_coupon_bond/__init__.py b/tests/zero_coupon_bond/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/tests/zero_coupon_bond/conftest.py b/tests/zero_coupon_bond/conftest.py deleted file mode 100644 index 42e88ee4..00000000 --- a/tests/zero_coupon_bond/conftest.py +++ /dev/null @@ -1,249 +0,0 @@ -from collections.abc import Callable -from typing import Final - -import pytest -from algokit_utils import ( - AlgorandClient, - SigningAccount, -) - -from smart_contracts import constants as sc_cst -from smart_contracts.artifacts.zero_coupon_bond.zero_coupon_bond_client import ( - AccountOpenArgs, - AssetConfigArgs, - AssetCreateArgs, - AssetMetadata, - PrimaryDistributionArgs, - RbacAssignRoleArgs, - RbacGovAssetSuspensionArgs, - SetSecondaryTimeEventsArgs, - ZeroCouponBondClient, - ZeroCouponBondFactory, -) -from tests import conftest_helpers as helpers -from tests import utils -from tests.conftest import ( - APR, - INITIAL_D_ASA_UNITS, - ISSUANCE_DELAY, - MINIMUM_DENOMINATION, - PRIMARY_DISTRIBUTION_DELAY, - PRIMARY_DISTRIBUTION_DURATION, - PRINCIPAL, -) - -MATURITY_DELAY: Final[int] = 366 * sc_cst.DAY_2_SEC -TOTAL_ASA_FUNDS: Final[int] = PRINCIPAL * (sc_cst.BPS + APR) // sc_cst.BPS - -PROSPECTUS_URL: Final[str] = "Zero Coupon Bond Prospectus" - - -@pytest.fixture(scope="session") -def asset_metadata() -> AssetMetadata: - return AssetMetadata( - contract_type=sc_cst.CT_PAM, - calendar=sc_cst.CLDR_NC, - business_day_convention=sc_cst.BDC_NOS, - end_of_month_convention=sc_cst.EOMC_SD, - prepayment_effect=sc_cst.PPEF_N, - penalty_type=sc_cst.PYTP_N, - prospectus_hash=bytes(32), - prospectus_url=PROSPECTUS_URL, - ) - - -@pytest.fixture(scope="function") -def time_events( - algorand: AlgorandClient, -) -> utils.TimeEvents: - current_ts = utils.get_latest_timestamp(algorand.client.algod) - primary_distribution_opening = current_ts + PRIMARY_DISTRIBUTION_DELAY - primary_distribution_closure = ( - primary_distribution_opening + PRIMARY_DISTRIBUTION_DURATION - ) - issuance_date = primary_distribution_closure + ISSUANCE_DELAY - maturity_date = issuance_date + MATURITY_DELAY - return [ - primary_distribution_opening, - primary_distribution_closure, - issuance_date, - maturity_date, - ] - - -@pytest.fixture(scope="function") -def zero_coupon_bond_cfg( - currency: utils.Currency, - time_events: utils.TimeEvents, - day_count_convention: int, -) -> utils.DAsaConfig: - return utils.DAsaConfig( - denomination_asset_id=currency.id, - settlement_asset_id=currency.id, - principal=PRINCIPAL, - principal_discount=APR, - minimum_denomination=MINIMUM_DENOMINATION, - day_count_convention=day_count_convention, - interest_rate=0, - coupon_rates=[], - time_events=time_events, - time_periods=[], - ) - - -@pytest.fixture(scope="function") -def zero_coupon_bond_client_empty( - algorand: AlgorandClient, - arranger: SigningAccount, - asset_metadata: AssetMetadata, -) -> ZeroCouponBondClient: - return helpers.create_and_fund_client( - algorand, - ZeroCouponBondFactory, - arranger, - AssetCreateArgs(arranger=arranger.address, metadata=asset_metadata), - ) - - -@pytest.fixture(scope="function") -def account_manager( - algorand: AlgorandClient, - zero_coupon_bond_cfg: utils.DAsaConfig, - zero_coupon_bond_client_empty: ZeroCouponBondClient, -) -> utils.DAsaAccountManager: - return helpers.create_role_account( - algorand, - utils.DAsaAccountManager, - zero_coupon_bond_client_empty, - rbac_assign_role_args_class=RbacAssignRoleArgs, - ) - - -@pytest.fixture(scope="function") -def authority( - algorand: AlgorandClient, - zero_coupon_bond_cfg: utils.DAsaConfig, - zero_coupon_bond_client_empty: ZeroCouponBondClient, -) -> utils.DAsaAuthority: - return helpers.create_role_account( - algorand, - utils.DAsaAuthority, - zero_coupon_bond_client_empty, - rbac_assign_role_args_class=RbacAssignRoleArgs, - ) - - -@pytest.fixture(scope="function") -def zero_coupon_bond_client_active( - algorand: AlgorandClient, - bank: SigningAccount, - zero_coupon_bond_cfg: utils.DAsaConfig, - zero_coupon_bond_client_empty: ZeroCouponBondClient, -) -> ZeroCouponBondClient: - return helpers.activate_client_with_config_and_funding( - algorand, - zero_coupon_bond_client_empty, - bank, - zero_coupon_bond_cfg, - TOTAL_ASA_FUNDS, - AssetConfigArgs, - ) - - -@pytest.fixture(scope="function") -def primary_dealer( - algorand: AlgorandClient, - zero_coupon_bond_client_active: ZeroCouponBondClient, -) -> utils.DAsaPrimaryDealer: - state = zero_coupon_bond_client_active.state.global_state - role_config = utils.set_role_config( - state.primary_distribution_opening_date, state.primary_distribution_closure_date - ) - return helpers.create_role_account( - algorand, - utils.DAsaPrimaryDealer, - zero_coupon_bond_client_active, - role_config, - RbacAssignRoleArgs, - ) - - -@pytest.fixture(scope="function") -def account_factory( - algorand: AlgorandClient, - bank: SigningAccount, - currency: utils.Currency, - account_manager: utils.DAsaAccountManager, -) -> Callable[..., utils.DAsaAccount]: - return helpers.build_account_factory( - algorand, currency, account_manager, AccountOpenArgs - ) - - -@pytest.fixture(scope="function") -def zero_coupon_bond_client_primary( - zero_coupon_bond_client_active: ZeroCouponBondClient, -) -> ZeroCouponBondClient: - state = zero_coupon_bond_client_active.state.global_state - return helpers.set_client_to_primary_phase( - zero_coupon_bond_client_active, - SetSecondaryTimeEventsArgs, - [state.issuance_date, state.maturity_date], - ) - - -@pytest.fixture(scope="function") -def account_with_units_factory( - account_factory: Callable[..., utils.DAsaAccount], - primary_dealer: utils.DAsaPrimaryDealer, - zero_coupon_bond_client_primary: ZeroCouponBondClient, -) -> Callable[..., utils.DAsaAccount]: - return helpers.build_account_with_units_factory( - account_factory, - primary_dealer, - zero_coupon_bond_client_primary, - PrimaryDistributionArgs, - INITIAL_D_ASA_UNITS, - ) - - -@pytest.fixture(scope="function") -def account_a( - account_with_units_factory: Callable[..., utils.DAsaAccount], -) -> utils.DAsaAccount: - return account_with_units_factory() - - -@pytest.fixture(scope="function") -def account_b( - account_with_units_factory: Callable[..., utils.DAsaAccount], -) -> utils.DAsaAccount: - return account_with_units_factory(units=2 * INITIAL_D_ASA_UNITS) - - -@pytest.fixture(scope="function") -def zero_coupon_bond_client_ongoing( - zero_coupon_bond_client_primary: ZeroCouponBondClient, -) -> ZeroCouponBondClient: - state = zero_coupon_bond_client_primary.state.global_state - utils.time_warp(state.issuance_date) - return zero_coupon_bond_client_primary - - -@pytest.fixture(scope="function") -def zero_coupon_bond_client_at_maturity( - zero_coupon_bond_client_ongoing: ZeroCouponBondClient, -) -> ZeroCouponBondClient: - state = zero_coupon_bond_client_ongoing.state.global_state - utils.time_warp(state.maturity_date) - return zero_coupon_bond_client_ongoing - - -@pytest.fixture(scope="function") -def zero_coupon_bond_client_suspended( - authority: utils.DAsaAuthority, - zero_coupon_bond_client_ongoing: ZeroCouponBondClient, -) -> ZeroCouponBondClient: - return helpers.suspend_client( - zero_coupon_bond_client_ongoing, authority, RbacGovAssetSuspensionArgs - ) diff --git a/tests/zero_coupon_bond/test_asset_config.py b/tests/zero_coupon_bond/test_asset_config.py deleted file mode 100644 index 29e6123a..00000000 --- a/tests/zero_coupon_bond/test_asset_config.py +++ /dev/null @@ -1,170 +0,0 @@ -from copy import deepcopy - -import pytest -from algokit_utils import LogicError - -from smart_contracts import config as sc_cfg -from smart_contracts import enums -from smart_contracts import errors as err -from smart_contracts.artifacts.zero_coupon_bond.zero_coupon_bond_client import ( - AssetConfigArgs, - ZeroCouponBondClient, -) -from tests.utils import Currency, DAsaConfig - - -def test_pass_asset_config( - day_count_convention: int, - currency: Currency, - zero_coupon_bond_cfg: DAsaConfig, - zero_coupon_bond_client_empty: ZeroCouponBondClient, -) -> None: - zero_coupon_bond_client_empty.send.asset_config( - AssetConfigArgs(**zero_coupon_bond_cfg.dictify()) - ) - - state = zero_coupon_bond_client_empty.state.global_state - expected_coupon_rates = [] - expected_time_events = ( - zero_coupon_bond_client_empty.send.get_time_events().abi_return - ) - - # Asset Configuration - assert state.denomination_asset_id == currency.id - assert state.settlement_asset_id == state.denomination_asset_id - assert state.unit_value == zero_coupon_bond_cfg.minimum_denomination - assert state.day_count_convention == zero_coupon_bond_cfg.day_count_convention - - # Principal and Supply - assert ( - state.total_units - == zero_coupon_bond_cfg.principal // zero_coupon_bond_cfg.minimum_denomination - ) - assert not state.circulating_units - assert state.principal_discount == zero_coupon_bond_cfg.principal_discount - - # Interest Rate - assert state.interest_rate == zero_coupon_bond_cfg.interest_rate - - # Coupons - assert expected_coupon_rates == zero_coupon_bond_cfg.coupon_rates - assert state.total_coupons == zero_coupon_bond_cfg.total_coupons - - # Time Schedule - assert expected_time_events == zero_coupon_bond_cfg.time_events - assert ( - state.primary_distribution_opening_date - == zero_coupon_bond_cfg.time_events[ - sc_cfg.PRIMARY_DISTRIBUTION_OPENING_DATE_IDX - ] - # == time_schedule_limits.primary_distribution_opening_date - ) - assert ( - state.primary_distribution_closure_date - == zero_coupon_bond_cfg.time_events[ - sc_cfg.PRIMARY_DISTRIBUTION_CLOSURE_DATE_IDX - ] - # == time_schedule_limits.primary_distribution_closure_date - ) - assert ( - state.issuance_date - == zero_coupon_bond_cfg.time_events[sc_cfg.ISSUANCE_DATE_IDX] - # == time_schedule_limits.issuance_date - ) - assert not state.secondary_market_opening_date - assert not state.secondary_market_closure_date - assert ( - state.maturity_date - == zero_coupon_bond_cfg.time_events[sc_cfg.MATURITY_DATE_IDX] - # == time_schedule_limits.maturity_date - ) - - # Status - assert state.status == enums.STATUS_ACTIVE - assert not state.asset_suspended - - -def test_fail_unauthorized() -> None: - pass # TODO - - -def test_fail_already_configured() -> None: - pass # TODO - - -def test_fail_invalid_denomination() -> None: - pass # TODO - - -def test_fail_invalid_minimum_denomination() -> None: - pass # TODO - - -def test_fail_invalid_interest_rate() -> None: - pass # TODO - - -def test_fail_invalid_time_events_length( - zero_coupon_bond_cfg: DAsaConfig, - zero_coupon_bond_client_empty: ZeroCouponBondClient, -) -> None: - wrong_d_asa_cfg = deepcopy(zero_coupon_bond_cfg) - wrong_d_asa_cfg.time_events = [*zero_coupon_bond_cfg.time_events, 0] - with pytest.raises(LogicError, match=err.INVALID_TIME_EVENTS_LENGTH): - zero_coupon_bond_client_empty.send.asset_config( - AssetConfigArgs(**wrong_d_asa_cfg.dictify()) - ) - - -def test_fail_invalid_time( - zero_coupon_bond_cfg: DAsaConfig, - zero_coupon_bond_client_empty: ZeroCouponBondClient, -) -> None: - wrong_d_asa_cfg = deepcopy(zero_coupon_bond_cfg) - wrong_d_asa_cfg.time_events[0] = 0 - with pytest.raises(LogicError, match=err.INVALID_TIME): - zero_coupon_bond_client_empty.send.asset_config( - AssetConfigArgs(**wrong_d_asa_cfg.dictify()) - ) - - -def test_fail_invalid_sorting( - zero_coupon_bond_cfg: DAsaConfig, - zero_coupon_bond_client_empty: ZeroCouponBondClient, -) -> None: - wrong_d_asa_cfg = deepcopy(zero_coupon_bond_cfg) - wrong_d_asa_cfg.time_events[-1] = zero_coupon_bond_cfg.time_events[-2] - with pytest.raises(LogicError, match=err.INVALID_SORTING): - zero_coupon_bond_client_empty.send.asset_config( - AssetConfigArgs(**wrong_d_asa_cfg.dictify()) - ) - - wrong_d_asa_cfg = deepcopy(zero_coupon_bond_cfg) - wrong_d_asa_cfg.time_events[0] = zero_coupon_bond_cfg.time_events[-1] - with pytest.raises(LogicError, match=err.INVALID_SORTING): - zero_coupon_bond_client_empty.send.asset_config( - AssetConfigArgs(**wrong_d_asa_cfg.dictify()) - ) - - -def test_fail_invalid_time_period_duration() -> None: - pass # TODO - - -def test_fail_invalid_settlement_asset() -> None: - pass # TODO - - -def test_fail_invalid_time_periods() -> None: - pass # TODO - - -def test_fail_invalid_time_period_representations() -> None: - pass # TODO - - -def test_fail_invalid_coupon_rates() -> None: - pass # TODO - - -# TODO: Test INVALID_TIME_PERIOD for Actual/Actual convention diff --git a/tests/zero_coupon_bond/test_asset_create.py b/tests/zero_coupon_bond/test_asset_create.py deleted file mode 100644 index db2cf5b1..00000000 --- a/tests/zero_coupon_bond/test_asset_create.py +++ /dev/null @@ -1,88 +0,0 @@ -from algokit_utils import AlgorandClient, SigningAccount -from algosdk.abi import ArrayStaticType, ByteType, StringType, TupleType, UintType - -from smart_contracts import constants as sc_cst -from smart_contracts import enums -from smart_contracts.artifacts.zero_coupon_bond.zero_coupon_bond_client import ( - AssetCreateArgs, - AssetMetadata, - ZeroCouponBondFactory, -) - -from .conftest import PROSPECTUS_URL - - -def test_pass_asset_create( - algorand: AlgorandClient, - day_count_convention: int, - asset_metadata: AssetMetadata, - arranger: SigningAccount, -) -> None: - factory = algorand.client.get_typed_app_factory( - ZeroCouponBondFactory, - default_sender=arranger.address, - default_signer=arranger.signer, - ) - zero_coupon_bond_client, _ = factory.send.create.asset_create( - AssetCreateArgs(arranger=arranger.address, metadata=asset_metadata) - ) - - state = zero_coupon_bond_client.state.global_state - - # Roles - assert state.arranger == arranger.address - - # Asset Configuration - assert not state.denomination_asset_id - assert not state.settlement_asset_id - assert not state.unit_value - assert not state.day_count_convention - - # Metadata - assert state.metadata == TupleType( - [ - UintType(8), # Contract Type - UintType(8), # Calendar - UintType(8), # Business Day Convention - UintType(8), # End of Month Convention - UintType(8), # Prepayment Effect - UintType(8), # Penalty Type - ArrayStaticType(ByteType(), 32), # Prospectus Hash - StringType(), # Prospectus URL - ] - ).encode( - [ - sc_cst.CT_PAM, - sc_cst.CLDR_NC, - sc_cst.BDC_NOS, - sc_cst.EOMC_SD, - sc_cst.PPEF_N, - sc_cst.PYTP_N, - bytes(32), - PROSPECTUS_URL, - ] - ) - - # Principal and Supply - assert not state.total_units - assert not state.circulating_units - assert not state.principal_discount - - # Coupons - assert not state.total_coupons - - # Time Schedule - assert not state.primary_distribution_opening_date - assert not state.primary_distribution_closure_date - assert not state.issuance_date - assert not state.secondary_market_opening_date - assert not state.secondary_market_closure_date - assert not state.maturity_date - - # Status - assert state.status == enums.STATUS_INACTIVE - assert not state.asset_suspended - - -def test_fail_invalid_state_schema() -> None: - pass # TODO diff --git a/tests/zero_coupon_bond/test_asset_transfer.py b/tests/zero_coupon_bond/test_asset_transfer.py deleted file mode 100644 index c5269d03..00000000 --- a/tests/zero_coupon_bond/test_asset_transfer.py +++ /dev/null @@ -1,260 +0,0 @@ -from collections.abc import Callable - -import pytest -from algokit_utils import CommonAppCallParams, LogicError, SigningAccount - -from smart_contracts import errors as err -from smart_contracts.artifacts.zero_coupon_bond.zero_coupon_bond_client import ( - AssetTransferArgs, - GetAccountUnitsCurrentValueArgs, - ZeroCouponBondClient, -) -from tests.utils import DAsaAccount, DAsaConfig, time_warp - - -def test_pass_asset_transfer( - zero_coupon_bond_cfg: DAsaConfig, - zero_coupon_bond_client_primary: ZeroCouponBondClient, - account_factory: Callable[..., DAsaAccount], - account_with_units_factory: Callable[..., DAsaAccount], -) -> None: - account_a = account_with_units_factory(units=3) - account_b = account_factory(zero_coupon_bond_client_primary) - - asset_info = zero_coupon_bond_client_primary.state.global_state - maturity_period = asset_info.maturity_date - asset_info.issuance_date - - pre_transfer_units_a = account_a.units - pre_transfer_units_b = account_b.units - pre_transfer_unit_value_a = account_a.unit_value - pre_transfer_unit_value_b = account_b.unit_value - - assert pre_transfer_unit_value_a != pre_transfer_unit_value_b - assert pre_transfer_unit_value_b == 0 - - time_warp(asset_info.issuance_date + maturity_period // 10) - - transfer_1_units = 1 - accrued_interest_1 = ( - zero_coupon_bond_client_primary.send.get_account_units_current_value( - GetAccountUnitsCurrentValueArgs( - holding_address=account_a.holding_address, - units=transfer_1_units, - ) - ).abi_return.accrued_interest - ) - transferred_value_1 = zero_coupon_bond_client_primary.send.asset_transfer( - AssetTransferArgs( - sender_holding_address=account_a.holding_address, - receiver_holding_address=account_b.holding_address, - units=transfer_1_units, - ), - params=CommonAppCallParams(sender=account_a.address), - ).abi_return - - post_transfer_1_units_a = account_a.units - post_transfer_1_units_b = account_b.units - post_transfer_1_unit_value_a = account_a.unit_value - post_transfer_1_unit_value_b = account_b.unit_value - - assert ( - transferred_value_1 - == zero_coupon_bond_cfg.minimum_denomination * transfer_1_units - + accrued_interest_1 - ) - assert post_transfer_1_units_a == pre_transfer_units_a - transfer_1_units - assert post_transfer_1_units_b == pre_transfer_units_b + transfer_1_units - assert post_transfer_1_unit_value_a == post_transfer_1_unit_value_b - assert account_a.paid_coupons == account_b.paid_coupons - - time_warp(asset_info.issuance_date + maturity_period // 5) - - transfer_2_units = 1 - accrued_interest_2 = ( - zero_coupon_bond_client_primary.send.get_account_units_current_value( - GetAccountUnitsCurrentValueArgs( - holding_address=account_a.holding_address, - units=transfer_2_units, - ) - ).abi_return.accrued_interest - ) - transferred_value_2 = zero_coupon_bond_client_primary.send.asset_transfer( - AssetTransferArgs( - sender_holding_address=account_a.holding_address, - receiver_holding_address=account_b.holding_address, - units=transfer_2_units, - ), - params=CommonAppCallParams(sender=account_a.address), - ).abi_return - - post_transfer_2_units_a = account_a.units - post_transfer_2_units_b = account_b.units - post_transfer_2_unit_value_a = account_a.unit_value - post_transfer_2_unit_value_b = account_b.unit_value - - assert ( - transferred_value_2 - == zero_coupon_bond_cfg.minimum_denomination * transfer_2_units - + accrued_interest_2 - ) - assert post_transfer_2_units_a == post_transfer_1_units_a - transfer_2_units - assert post_transfer_2_units_b == post_transfer_1_units_b + transfer_2_units - assert post_transfer_2_unit_value_a == post_transfer_2_unit_value_b - assert account_a.paid_coupons == account_b.paid_coupons - - time_warp(asset_info.issuance_date + maturity_period // 2) - - transfer_3_units = 1 - accrued_interest_3 = ( - zero_coupon_bond_client_primary.send.get_account_units_current_value( - GetAccountUnitsCurrentValueArgs( - holding_address=account_a.holding_address, - units=transfer_3_units, - ) - ).abi_return.accrued_interest - ) - transferred_value_3 = zero_coupon_bond_client_primary.send.asset_transfer( - AssetTransferArgs( - sender_holding_address=account_a.holding_address, - receiver_holding_address=account_b.holding_address, - units=transfer_3_units, - ), - params=CommonAppCallParams(sender=account_a.address), - ).abi_return - - post_transfer_3_units_a = account_a.units - post_transfer_3_units_b = account_b.units - post_transfer_3_unit_value_a = account_a.unit_value - - assert ( - transferred_value_3 - == zero_coupon_bond_cfg.minimum_denomination * transfer_3_units - + accrued_interest_3 - ) - assert post_transfer_3_units_a == 0 - assert ( - post_transfer_3_units_b - == transfer_1_units + transfer_2_units + transfer_3_units - ) - assert post_transfer_3_unit_value_a == 0 - assert account_a.paid_coupons == 0 - - -def test_fail_secondary_market_not_open_yet( - zero_coupon_bond_client_primary: ZeroCouponBondClient, - account_a: DAsaAccount, - account_b: DAsaAccount, -) -> None: - with pytest.raises(LogicError, match=err.SECONDARY_MARKET_CLOSED): - zero_coupon_bond_client_primary.send.asset_transfer( - AssetTransferArgs( - sender_holding_address=account_a.holding_address, - receiver_holding_address=account_b.holding_address, - units=1, - ), - params=CommonAppCallParams(sender=account_a.address), - ) - - -# TODO: test_fail_secondary_market_closed - - -def test_fail_unauthorized( - no_role_account: SigningAccount, - account_a: DAsaAccount, - account_b: DAsaAccount, - zero_coupon_bond_client_ongoing: ZeroCouponBondClient, -) -> None: - with pytest.raises(LogicError, match=err.UNAUTHORIZED): - zero_coupon_bond_client_ongoing.send.asset_transfer( - AssetTransferArgs( - sender_holding_address=account_a.holding_address, - receiver_holding_address=account_b.holding_address, - units=1, - ), - params=CommonAppCallParams(sender=no_role_account.address), - ) - - -def test_fail_suspended( - account_a: DAsaAccount, - account_b: DAsaAccount, - zero_coupon_bond_client_suspended: ZeroCouponBondClient, -) -> None: - with pytest.raises(LogicError, match=err.SUSPENDED): - zero_coupon_bond_client_suspended.send.asset_transfer( - AssetTransferArgs( - sender_holding_address=account_a.holding_address, - receiver_holding_address=account_b.holding_address, - units=1, - ), - params=CommonAppCallParams(sender=account_a.address), - ) - - -def test_fail_invalid_sender( - no_role_account: SigningAccount, - account_a: DAsaAccount, - zero_coupon_bond_client_ongoing: ZeroCouponBondClient, -) -> None: - with pytest.raises(LogicError, match=err.INVALID_HOLDING_ADDRESS): - zero_coupon_bond_client_ongoing.send.asset_transfer( - AssetTransferArgs( - sender_holding_address=no_role_account.address, - receiver_holding_address=account_a.holding_address, - units=1, - ), - params=CommonAppCallParams(sender=no_role_account.address), - ) - - -def test_fail_invalid_receiver( - no_role_account: SigningAccount, - account_a: DAsaAccount, - zero_coupon_bond_client_ongoing: ZeroCouponBondClient, -) -> None: - with pytest.raises(LogicError, match=err.INVALID_HOLDING_ADDRESS): - zero_coupon_bond_client_ongoing.send.asset_transfer( - AssetTransferArgs( - sender_holding_address=account_a.holding_address, - receiver_holding_address=no_role_account.address, - units=1, - ), - params=CommonAppCallParams(sender=account_a.address), - ) - - -def test_fail_defaulted_status() -> None: - pass # TODO - - -def test_fail_suspended_sender() -> None: - pass # TODO - - -def test_fail_suspended_receiver() -> None: - pass # TODO - - -def test_fail_self_transfer() -> None: - pass # TODO - - -def test_fail_null_transfer() -> None: - pass # TODO - - -def test_fail_over_transfer( - account_a: DAsaAccount, - account_b: DAsaAccount, - zero_coupon_bond_client_ongoing: ZeroCouponBondClient, -) -> None: - with pytest.raises(LogicError, match=err.OVER_TRANSFER): - zero_coupon_bond_client_ongoing.send.asset_transfer( - AssetTransferArgs( - sender_holding_address=account_a.holding_address, - receiver_holding_address=account_b.holding_address, - units=account_a.units + 1, - ), - params=CommonAppCallParams(sender=account_a.address), - ) diff --git a/tests/zero_coupon_bond/test_get_account_units_current_value.py b/tests/zero_coupon_bond/test_get_account_units_current_value.py deleted file mode 100644 index 3b594a69..00000000 --- a/tests/zero_coupon_bond/test_get_account_units_current_value.py +++ /dev/null @@ -1,110 +0,0 @@ -from collections.abc import Callable -from typing import Final - -from smart_contracts import constants as sc_cst -from smart_contracts.artifacts.zero_coupon_bond.zero_coupon_bond_client import ( - GetAccountUnitsCurrentValueArgs, - ZeroCouponBondClient, -) -from tests.utils import DAsaAccount, DAsaConfig, get_latest_timestamp, time_warp - -D_ASA_TEST_UNITS: Final[int] = 3 - - -def test_account_units_value_during_primary( - zero_coupon_bond_client_primary: ZeroCouponBondClient, - account_with_units_factory: Callable[..., DAsaAccount], -) -> None: - state = zero_coupon_bond_client_primary.state.global_state - account = account_with_units_factory(units=D_ASA_TEST_UNITS) - - value = zero_coupon_bond_client_primary.send.get_account_units_current_value( - GetAccountUnitsCurrentValueArgs( - holding_address=account.holding_address, - units=D_ASA_TEST_UNITS, - ) - ).abi_return - print("Primary distribution units value:") - print(value.__dict__) - assert ( - value.units_value - == account.principal * (sc_cst.BPS - state.principal_discount) // sc_cst.BPS - ) - assert value.accrued_interest == 0 - assert not value.day_count_factor.numerator - assert not value.day_count_factor.denominator - - -def test_account_units_value_at_issuance( - zero_coupon_bond_cfg: DAsaConfig, - zero_coupon_bond_client_primary: ZeroCouponBondClient, - account_with_units_factory: Callable[..., DAsaAccount], -) -> None: - state = zero_coupon_bond_client_primary.state.global_state - account = account_with_units_factory(units=D_ASA_TEST_UNITS) - - time_warp(state.issuance_date) - issuance_date = get_latest_timestamp( - zero_coupon_bond_client_primary.algorand.client.algod - ) - assert issuance_date == state.issuance_date - - value = zero_coupon_bond_client_primary.send.get_account_units_current_value( - GetAccountUnitsCurrentValueArgs( - holding_address=account.holding_address, - units=D_ASA_TEST_UNITS, - ) - ).abi_return - print("Primary distribution units value:") - print(value.__dict__) - - maturity_period = state.maturity_date - state.issuance_date - if zero_coupon_bond_cfg.day_count_convention == sc_cst.DCC_A_A: - maturity_period = maturity_period // sc_cst.DAY_2_SEC - - assert ( - value.units_value - == account.principal * (sc_cst.BPS - state.principal_discount) // sc_cst.BPS - ) - assert value.accrued_interest == 0 - assert value.day_count_factor.numerator == 0 - assert value.day_count_factor.denominator == maturity_period - - -def test_account_units_value_at_maturity( - zero_coupon_bond_client_primary: ZeroCouponBondClient, - account_with_units_factory: Callable[..., DAsaAccount], -) -> None: - state = zero_coupon_bond_client_primary.state.global_state - account = account_with_units_factory(units=D_ASA_TEST_UNITS) - - time_warp(state.maturity_date) - maturity_date = get_latest_timestamp( - zero_coupon_bond_client_primary.algorand.client.algod - ) - assert maturity_date == state.maturity_date - - value = zero_coupon_bond_client_primary.send.get_account_units_current_value( - GetAccountUnitsCurrentValueArgs( - holding_address=account.holding_address, - units=D_ASA_TEST_UNITS, - ) - ).abi_return - print("Primary distribution units value:") - print(value.__dict__) - assert value.units_value == account.principal - assert value.accrued_interest == 0 - assert value.day_count_factor.numerator == 0 - assert value.day_count_factor.denominator == 0 - - -def test_fail_no_primary_distribution() -> None: - pass # TODO - - -def test_fail_invalid_holding_address() -> None: - pass # TODO - - -def test_fail_invalid_units() -> None: - pass # TODO diff --git a/tests/zero_coupon_bond/test_get_payment_amount.py b/tests/zero_coupon_bond/test_get_payment_amount.py deleted file mode 100644 index a1f3fc5b..00000000 --- a/tests/zero_coupon_bond/test_get_payment_amount.py +++ /dev/null @@ -1,63 +0,0 @@ -from collections.abc import Callable -from typing import Final - -import pytest -from algokit_utils import LogicError, SigningAccount - -from smart_contracts import constants as sc_cst -from smart_contracts import errors as err -from smart_contracts.artifacts.fixed_coupon_bond.fixed_coupon_bond_client import ( - FixedCouponBondClient, -) -from smart_contracts.artifacts.zero_coupon_bond.zero_coupon_bond_client import ( - GetPaymentAmountArgs, -) -from tests.utils import Currency, DAsaAccount, DAsaConfig - -D_ASA_TEST_UNITS: Final[int] = 3 - - -def test_pass_get_principal_payment_amount( - currency: Currency, - zero_coupon_bond_cfg: DAsaConfig, - zero_coupon_bond_client_primary: FixedCouponBondClient, - account_with_units_factory: Callable[..., DAsaAccount], -) -> None: - account = account_with_units_factory(units=D_ASA_TEST_UNITS) - - payment_amount = zero_coupon_bond_client_primary.send.get_payment_amount( - GetPaymentAmountArgs(holding_address=account.holding_address) - ).abi_return - - print(f"Interest rate:\t\t{zero_coupon_bond_cfg.interest_rate / 100:.2f}%") - print(f"Principal amount:\t{account.principal * currency.asa_to_unit:.2f} EUR") - print( - f"Interest amount:\t{payment_amount.interest * currency.asa_to_unit:.2f} EUR\n" - ) - assert payment_amount.principal == account.principal - assert ( - payment_amount.interest - == account.principal * zero_coupon_bond_cfg.interest_rate // sc_cst.BPS - ) - - -def test_pass_not_configured( - zero_coupon_bond_client_empty: FixedCouponBondClient, - account_factory: Callable[..., DAsaAccount], -) -> None: - account = account_factory(zero_coupon_bond_client_empty) - payment_amount = zero_coupon_bond_client_empty.send.get_payment_amount( - GetPaymentAmountArgs(holding_address=account.holding_address) - ).abi_return - assert payment_amount.interest == 0 - assert payment_amount.principal == 0 - - -def test_fail_invalid_holding_address( - no_role_account: SigningAccount, - zero_coupon_bond_client_primary: FixedCouponBondClient, -) -> None: - with pytest.raises(LogicError, match=err.INVALID_HOLDING_ADDRESS): - zero_coupon_bond_client_primary.send.get_payment_amount( - GetPaymentAmountArgs(holding_address=no_role_account.address) - ) diff --git a/tests/zero_coupon_bond/test_pay_principal.py b/tests/zero_coupon_bond/test_pay_principal.py deleted file mode 100644 index 90645ae7..00000000 --- a/tests/zero_coupon_bond/test_pay_principal.py +++ /dev/null @@ -1,142 +0,0 @@ -from collections.abc import Callable - -import pytest -from algokit_utils import ( - AlgorandClient, - LogicError, - SigningAccount, -) - -from smart_contracts import errors as err -from smart_contracts.artifacts.zero_coupon_bond.zero_coupon_bond_client import ( - AccountGetInfoArgs, - PayPrincipalArgs, - ZeroCouponBondClient, -) -from tests.utils import ( - Currency, - DAsaAccount, - get_latest_timestamp, -) - - -def test_pass_pay_principal( - algorand: AlgorandClient, - currency: Currency, - account_a: DAsaAccount, - zero_coupon_bond_client_at_maturity: ZeroCouponBondClient, -) -> None: - # Pre payment state - pre_payment_state = zero_coupon_bond_client_at_maturity.state.global_state - - pre_payment_account_info = ( - zero_coupon_bond_client_at_maturity.send.account_get_info( - AccountGetInfoArgs(holding_address=account_a.holding_address) - ).abi_return - ) - - pre_payment_account_principal = account_a.principal - - maturity_date = pre_payment_state.maturity_date - pre_payment_account_units = pre_payment_account_info.units - pre_payment_circulating_units = pre_payment_state.circulating_units - assert ( - get_latest_timestamp(zero_coupon_bond_client_at_maturity.algorand.client.algod) - >= maturity_date - ) - - # Principal payment - payment = zero_coupon_bond_client_at_maturity.send.pay_principal( - PayPrincipalArgs( - holding_address=account_a.holding_address, - payment_info=b"", - ) - ).abi_return - - assert payment.amount == pre_payment_account_principal - print( - f"Paid amount: {payment.amount * currency.asa_to_unit:.2f} EUR, Maturity date: {maturity_date}, " - f"Payment timestamp: {payment.timestamp}" - ) - - # Post payment state - post_payment_state = zero_coupon_bond_client_at_maturity.state.global_state - - post_payment_account_info = ( - zero_coupon_bond_client_at_maturity.send.account_get_info( - AccountGetInfoArgs(holding_address=account_a.holding_address) - ).abi_return - ) - - assert ( - post_payment_state.circulating_units - == pre_payment_circulating_units - pre_payment_account_units - ) - assert post_payment_account_info.units == 0 - # TODO: assert balance updates - # TODO: assert STATUS_ENDED - - -def test_pass_skip_suspended_account() -> None: - pass # TODO - - -def test_pass_skip_not_opted_in_account() -> None: - pass # TODO - - -def test_fail_unauthorized() -> None: - pass # TODO - - -def test_fail_unauthorized_status() -> None: - pass # TODO - - -def test_fail_defaulted_status() -> None: - pass # TODO - - -def test_fail_suspended() -> None: - pass # TODO - - -def test_fail_invalid_holding_address( - no_role_account: SigningAccount, - zero_coupon_bond_client_at_maturity: ZeroCouponBondClient, -) -> None: - with pytest.raises(LogicError, match=err.INVALID_HOLDING_ADDRESS): - zero_coupon_bond_client_at_maturity.send.pay_principal( - PayPrincipalArgs( - holding_address=no_role_account.address, - payment_info=b"", - ) - ) - - -def test_fail_no_units( - account_factory: Callable[..., DAsaAccount], - zero_coupon_bond_client_primary: ZeroCouponBondClient, -) -> None: - account = account_factory(zero_coupon_bond_client_primary) - - with pytest.raises(LogicError, match=err.NO_UNITS): - zero_coupon_bond_client_primary.send.pay_principal( - PayPrincipalArgs( - holding_address=account.holding_address, - payment_info=b"", - ) - ) - - -def test_fail_not_mature( - zero_coupon_bond_client_primary: ZeroCouponBondClient, - account_a: DAsaAccount, -) -> None: - with pytest.raises(LogicError, match=err.NOT_MATURE): - zero_coupon_bond_client_primary.send.pay_principal( - PayPrincipalArgs( - holding_address=account_a.holding_address, - payment_info=b"", - ) - ) diff --git a/tests/zero_coupon_bond/test_sub_accrued_interest_amount.py b/tests/zero_coupon_bond/test_sub_accrued_interest_amount.py deleted file mode 100644 index 09222c6c..00000000 --- a/tests/zero_coupon_bond/test_sub_accrued_interest_amount.py +++ /dev/null @@ -1,87 +0,0 @@ -from typing import Final - -from algokit_utils import AlgorandClient - -from smart_contracts import constants as sc_cst -from smart_contracts.artifacts.zero_coupon_bond.zero_coupon_bond_client import ( - GetAccountUnitsCurrentValueArgs, - ZeroCouponBondClient, -) -from tests.utils import DAsaAccount, get_latest_timestamp, time_warp - -TEST_UNITS: Final[int] = 3 - - -def test_at_issuance( - algorand: AlgorandClient, - account_a: DAsaAccount, - zero_coupon_bond_client_ongoing: ZeroCouponBondClient, -) -> None: - issuance_date = get_latest_timestamp( - zero_coupon_bond_client_ongoing.algorand.client.algod - ) - state = zero_coupon_bond_client_ongoing.state.global_state - assert issuance_date == state.issuance_date - - value = zero_coupon_bond_client_ongoing.send.get_account_units_current_value( - GetAccountUnitsCurrentValueArgs( - holding_address=account_a.holding_address, - units=account_a.units, - ) - ).abi_return - print("Value at issuance:") - print(value.__dict__) - assert value.accrued_interest == 0 - - -def test_at_half_period( - algorand: AlgorandClient, - account_a: DAsaAccount, - zero_coupon_bond_client_ongoing: ZeroCouponBondClient, -) -> None: - issuance_date = get_latest_timestamp( - zero_coupon_bond_client_ongoing.algorand.client.algod - ) - state = zero_coupon_bond_client_ongoing.state.global_state - assert issuance_date == state.issuance_date - - maturity_period = state.maturity_date - issuance_date - - # Principal accrued half period - half_maturity_period = maturity_period // 2 - time_warp(issuance_date + half_maturity_period) - - value = zero_coupon_bond_client_ongoing.send.get_account_units_current_value( - GetAccountUnitsCurrentValueArgs( - holding_address=account_a.holding_address, - units=account_a.units, - ) - ).abi_return - print("Value at half period:") - print(value.__dict__) - assert ( - value.accrued_interest - == (account_a.principal * state.principal_discount // 2) // sc_cst.BPS - ) - - -def test_on_maturity_date( - algorand: AlgorandClient, - account_a: DAsaAccount, - zero_coupon_bond_client_at_maturity: ZeroCouponBondClient, -) -> None: - state = zero_coupon_bond_client_at_maturity.state.global_state - current_date = get_latest_timestamp( - zero_coupon_bond_client_at_maturity.algorand.client.algod - ) - assert current_date == state.maturity_date - - value = zero_coupon_bond_client_at_maturity.send.get_account_units_current_value( - GetAccountUnitsCurrentValueArgs( - holding_address=account_a.holding_address, - units=account_a.units, - ) - ).abi_return - print("Value at maturity:") - print(value.__dict__) - assert value.accrued_interest == 0 From 5be3a66e94fab1f039c1be799715fa8135e365dc Mon Sep 17 00:00:00 2001 From: cusma Date: Thu, 12 Mar 2026 19:59:25 +0100 Subject: [PATCH 115/244] chore: delete old mock module --- .../mock_module_accounting/contract.py | 16 ---------------- 1 file changed, 16 deletions(-) delete mode 100644 smart_contracts/mock_module_accounting/contract.py diff --git a/smart_contracts/mock_module_accounting/contract.py b/smart_contracts/mock_module_accounting/contract.py deleted file mode 100644 index 9c68af05..00000000 --- a/smart_contracts/mock_module_accounting/contract.py +++ /dev/null @@ -1,16 +0,0 @@ -from algopy import Txn, arc4 - -from modules.accounting import AccountingModule - - -class MockAccountingModule(AccountingModule): - """ - Accounting Module for testing - """ - - def __init__(self) -> None: - super().__init__() - - @arc4.baremethod(create="require") - def create(self) -> None: - self.arranger.value = Txn.sender From fcf1f003cd38a167e8d0cedf012198ca9adda4fb Mon Sep 17 00:00:00 2001 From: cusma Date: Thu, 12 Mar 2026 19:59:48 +0100 Subject: [PATCH 116/244] chore: rename folder --- smart_contracts/{d-asa => d_asa}/contract.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename smart_contracts/{d-asa => d_asa}/contract.py (100%) diff --git a/smart_contracts/d-asa/contract.py b/smart_contracts/d_asa/contract.py similarity index 100% rename from smart_contracts/d-asa/contract.py rename to smart_contracts/d_asa/contract.py From 22231b933d01695e45c877cdfa138429f789ab0c Mon Sep 17 00:00:00 2001 From: cusma Date: Thu, 12 Mar 2026 20:00:13 +0100 Subject: [PATCH 117/244] chore: build artifacts --- .../{d-asa => d_asa}/DASA.approval.puya.map | 4 +- .../{d-asa => d_asa}/DASA.approval.teal | 80 +- .../{d-asa => d_asa}/DASA.arc56.json | 2 +- .../{d-asa => d_asa}/DASA.clear.puya.map | 0 .../{d-asa => d_asa}/DASA.clear.teal | 0 .../artifacts/{d-asa => d_asa}/dasa_client.py | 2 +- .../MockRbacModule.approval.puya.map | 5631 +++++++++++++++++ .../MockRbacModule.approval.teal | 1087 ++++ .../MockRbacModule.arc56.json | 444 ++ .../MockRbacModule.clear.puya.map | 25 + .../MockRbacModule.clear.teal | 7 + .../mock_rbac_module_client.py | 1682 +++++ 12 files changed, 8920 insertions(+), 44 deletions(-) rename smart_contracts/artifacts/{d-asa => d_asa}/DASA.approval.puya.map (99%) rename smart_contracts/artifacts/{d-asa => d_asa}/DASA.approval.teal (99%) rename smart_contracts/artifacts/{d-asa => d_asa}/DASA.arc56.json (99%) rename smart_contracts/artifacts/{d-asa => d_asa}/DASA.clear.puya.map (100%) rename smart_contracts/artifacts/{d-asa => d_asa}/DASA.clear.teal (100%) rename smart_contracts/artifacts/{d-asa => d_asa}/dasa_client.py (99%) create mode 100644 smart_contracts/artifacts/mock_module_rbac/MockRbacModule.approval.puya.map create mode 100644 smart_contracts/artifacts/mock_module_rbac/MockRbacModule.approval.teal create mode 100644 smart_contracts/artifacts/mock_module_rbac/MockRbacModule.arc56.json create mode 100644 smart_contracts/artifacts/mock_module_rbac/MockRbacModule.clear.puya.map create mode 100644 smart_contracts/artifacts/mock_module_rbac/MockRbacModule.clear.teal create mode 100644 smart_contracts/artifacts/mock_module_rbac/mock_rbac_module_client.py diff --git a/smart_contracts/artifacts/d-asa/DASA.approval.puya.map b/smart_contracts/artifacts/d_asa/DASA.approval.puya.map similarity index 99% rename from smart_contracts/artifacts/d-asa/DASA.approval.puya.map rename to smart_contracts/artifacts/d_asa/DASA.approval.puya.map index 05b07e6e..0d9b73dd 100644 --- a/smart_contracts/artifacts/d-asa/DASA.approval.puya.map +++ b/smart_contracts/artifacts/d_asa/DASA.approval.puya.map @@ -6,9 +6,9 @@ "../../../modules/payment_agent.py", "../../../modules/rbac.py", "../../../modules/transfer_agent.py", - "../../d-asa/contract.py" + "../../d_asa/contract.py" ], - "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AG4BmD;;AAAf;;AAA5B;AAC4C;;AAAf;;AAA7B;AAkBA;;AAAuB;AAAvB;AACA;;AAAuB;AAAvB;AFQA;AAAc;AAAd;AACA;;AAAqB;AAArB;AAGA;;AAAuB;;AAAvB;AACA;;AAAsB;;AAAtB;AAGA;;AAA6B;AAA7B;AACA;;AAA2B;AAA3B;AAGA;;AAA6B;AAA7B;AACA;;AAAqB;AAArB;AACA;;AAA6B;AAA7B;AACA;;AAA6B;AAA7B;AAGA;;AAA4B;AAA5B;AAGA;;AAAmB;AAAnB;AACA;;AAA4B;AAA5B;AAGA;;AAA+B;AAA/B;AACA;AAA6B;AAA7B;AACA;;AAAiC;AAAjC;AACA;;AAAoC;AAApC;AAGA;;AAAiC;AAAjC;AACA;;AAAwB;AAAxB;AAGA;;AAA6B;AAA7B;AACA;;AAAyB;AAAzB;AACA;;AAA6B;AAA7B;AACA;;AAAwB;AAAxB;AACA;;AAAsB;AAAtB;AACA;;AAAuB;AAAvB;AACA;;AAA4B;AAA5B;AACA;;AAA0B;AAA1B;AAGA;;AAA0B;AAA1B;AACA;;AAAyB;AAAzB;AAGA;;AAAiC;AAAjC;AACA;;AAAkC;AAAlC;AAQA;AAAoB;AAApB;AACA;;AAA4B;AAA5B;AAGA;;AAAyB;AAAzB;AIhGO;;AAA6B;;AAA7B;AAAP;AACO;;AAAuB;;AAAvB;AAAP;AACO;;AAAA;AAAP;AACO;;AAAA;AAAP;AAlBR;;;;;;AAAA;;;AAAA;;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;;;;;;AAAA;;;AAAA;;;;AAAA;AF4IK;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;;;;;;;ADtGA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ADiGU;AAAA;AAAA;AAAA;AAAP;AC7FA;;;AACA;;;AACA;;;ADmFO;AAAA;AAAA;AAAA;AAAe;;AAAf;AAYA;AAAP;AC5FmB;AACD;;AAId;;AAAA;;AAAA;AAAA;;;AACI;AAAA;AAAA;AAAA;AAAoB;AAAA;;AAAA;AAAA;AAApB;AADJ;;;AAGiC;AAAA;AAAA;AAAA;AAAzB;;;AAAA;AAAA;;AACL;;AAAA;AAAA;AAAA;;AAAuB;;AAAvB;AAAf;;;AAEuC;;AAAA;AAAA;AAAA;AAAA;;AD6R3B;AADG;AAAA;AAAA;;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;;AC5RA;;;ADkeA;;AAAA;AAAA;AAAkB;AAAA;AAAA;AAAA;AAAlB;AAAP;AACO;;AAAwB;;AAAxB;AAAP;AAxIG;;AAAA;;;AAAA;;AAAyC;;AAAzC;AAAA;;;AACQ;;;AAYE;;AAAA;AAAA;AAAA;AAAA;;AACS;;AAAnB;AAAA;;;AAAA;;AAAyC;;AAAzC;AAAA;;;AACQ;;;AA6HkB;;AAAA;;AAAA;AAAA;;AAG1B;;;AAAX;;;;;;;AAkB+B;;AAAA;;;AACC;;AAAA;;;AACN;;AAAA;;;AAAA;AAAA;;AAAA;;AACC;AAAA;;;AAAA;AAAA;;AACD;;AAAA;;AAAA;AAAA;AAAA;;AAqJyB;;AAAjC;AAAA;;AAAA;AAAA;AAAA;;AAAA;AA/QH;AAAA;;AAAA;AAAA;AAAyB;AAAA;;AAAA;AAAA;AAAzB;;AAAA;AAiRA;;AAAA;;AAAA;AAAP;AACO;;AAAA;AAAA;AAtJH;;AAAA;AADJ;AAIA;;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AACG;;AAAA;AAAA;AAAgC;;AAAhC;AAAX;;;AAEY;AAAA;;AAAA;AAAA;AAAyB;;AAAA;;;AAAA;;AAAzB;AAAA;;AAAA;AAAA;AAGG;;;AAAJ;;;AAAkC;;AAAA;AAAA;AAAgC;;AAAhC;AAAlC;;;AAGkC;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;AACJ;AAAA;;AAAA;AACA;;AAAA;;AAAA;AACA;AAAA;AAAA;AAAA;AAAqB;AAArB;AAAA;AAAA;AAAA;AAEG;;AAAA;;;AAAoB;;;AAApB;AAAA;;;AAEG;AAAA;AAAA;AAAA;AAFH;;;AAGC;AAAc;;;AAAd;AACA;;AAAiC;AAAjC;AAEJ;;AAAA;;AAAA;AAAA;;;AAAA;ACxhBI;;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;;AACA;;AAAoB;AAApB;AAAA;;;;;ADugBA;;AAAwB;AAAxB;;;;AAlCa;;AAAA;AAAA;AAAA;AAAA;;AAGI;;AAAd;AAAf;;;AAEoB;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;;;;;;AAGH;;AAAc;AAAd;AAAjB;;;AAC6C;AAAA;AAAA;AAAA;AAAA;;AAAA;AACR;AAAA;;AAAA;AAAA;AAAA;;AAAA;;;;AACpB;;AAAc;;AAAd;AAAjB;;;;;;;AAAA;;;AAC6C;AAA7B;;AACqB;AAArB;;;;;AA7IL;;;AAAX;;;AACe;;AAAc;;AAAd;AAAf;;;AACuB;AAAA;AAAA;AAAA;;;AAyHQ;;;AAxHJ;AAAA;;AAAA;AAAA;AAAwB;;AAAA;;;AAAA;;AAAxB;AAAA;AAAA;;AACZ;AAAA;;AAAA;AAAA;AAAA;AAAf;;;AACuB;;;AAsHQ;;;AArHA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AACG;AAAA;AAAA;AAAA;AAAnB;AAAf;;;AACuB;AAAA;AAAA;AAAA;;;AAmHQ;;;;;;;AAAA;;;AAhHnB;;AAAA;;AAAA;AAAoC;AAAA;AAAA;AAAA;AAApC;AAAA;AADJ;AAGO;AAAA;;;AA8GgB;;;AAzIhB;AAAA;;AAAA;AAAA;AAAwB;;AAAA;;;AAAA;;AAAxB;;;AAwIe;;;AC7dtB;;AAAA;AAAA;AAIiB;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAEH;;AALP;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AA7BV;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;;;AAqCA;;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AD4DU;AAAA;AAAA;AAAA;AAAP;ADvH0B;;AAAnB;AAAA;AAAA;AAAA;AAAA;;AAAP;AEVG;AAAA;;AAAA;AAAA;AAAwB;;AAAxB;AAAX;;;AAEgB;;AAAc;AAAA;;AAAA;AAAA;AAAd;AAAA;;;AACG;;AAAA;;AAAA;AADH;;;AAEG;;AAAc;;AAAA;AAAA;AAAA;;;AAAd;AAFH;;;;AADJ;AA+EJ;;;AACA;;;ADwCO;AAAA;AAAA;AAAA;AAAe;;AAAf;AAYA;AAAP;ACjDA;;AAAA;AAAA;;;AACA;;;;;AFkBI;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AACE;AAAA;;AAAA;AAAA;AAAA;;AADF;;AAAA;AAAA;AAAA;;AEhBJ;AA7EI;;;AACI;AAAA;;AAAA;AAAA;AADJ;;AAAA;;AAAA;;;AAGQ;AAAA;AAAA;AAAA;;;AAAA;AAAJ;;;;AA+EhB;;;AAzE6C;;AAAjC;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AADJ;AA4Ec;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AArEd;AAIQ;;;;;;;;;;;;;AAJR;;;;;;AAAA;AFuFkB;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AACC;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAGW;AAA9B;AAAA;AAAA;;AAAA;;AACA;AAAA;;AACA;;AAAA;AAAA;AAEO;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACO;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAP;AAGA;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AEzBiB;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AACH;;AAJP;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;;;;AAAA;AAAA;AAAA;AA5BV;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;;;AE7DA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEG;;;AACO;AAAA;AAAP;AAEA;;AAAA;;AAAA;AACA;;AAAA;AAAA;AACO;;AAPV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AHgHU;AAAA;AAAA;AAAA;AAAP;AExE4B;;AAAqB;;AAA1C;;;AAAP;AC9BA;;;AACA;;;AH6FO;AAAA;AAAA;AAAA;AAAe;;AAAf;AG5FP;AJnB0B;;AAAnB;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAP;AIqBA;AAAA;;;AACA;AAAA;AAEI;AAAA;;AAAA;AAAA;AAAA;AAAqC;AAAA;;AAAA;AAAA;AAArC;AADJ;AAGG;AAAA;;AAAA;AAAA;AAAX;;;AAEgB;;AAA2B;AAAA;;AAAA;AAAA;AAA3B;AADJ;AJiGJ;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AI5FA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AACO;AAAA;;AAAA;AAAA;AAAA;AAAA;AA1BV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AA4BA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AHoFU;AAAA;AAAA;AAAA;AAAP;AGtEA;;;AACA;;;AH6DO;AAAA;AAAA;AAAA;AAAe;;AAAf;AAYA;AAAP;AGtIG;AAAA;;AAAA;AAAA;AAAX;;;AAEgB;AAAA;;AAAA;AAAA;AAA8B;;AAA9B;AADJ;AAGD;AAAA;;AAAA;AAAA;AAAX;;;AAEgB;;AAA0B;AAAA;;AAAA;AAAA;AAA1B;AADJ;AA4DG;;AAAA;;AAAA;AAAA;;AAAA;AAAP;AJtD0B;;AAAnB;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAP;AAA0B;;AAAnB;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAP;AIyDA;;AAAA;;;AACA;AAAA;;;AACO;;AAAA;AAAP;AACA;;AAAA;AAAA;AACgB;AAAA;AAAA;AAAA;AAAA;AAAT;AAAP;AH+pBG;AAAA;AAAA;AAAA;AAAqB;AAAA;;AAAA;AAAA;AAArB;AAAX;;;AAE8C;AAAA;AAAA;AAAA;AAAzB;;;AAET;;AAAA;AAA4B;;AAA5B;AADJ;AG/pBA;;AAAA;AAAA;;;AACA;;AAAA;AAAA;;AAAA;;;AACA;;;;;AACA;;;;;AJ6DgB;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAT;;AAAA;AAAA;;AAAA;;AAAA;AAAP;AACA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AATA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AIrFH;AAAA;;AAAA;AAAA;AAAA;AAAA;AJ0GA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AGxF+B;;AAAgB;;AAArC;;;AAAP;AHrD0B;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAiKA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AACO;;AArBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AGxH+B;;AAAsB;;AAA3C;;;AAAP;AFuEO;AAAA;AAAA;AAAA;AAAe;;;AAAf;ADuEA;AAAP;AACA;;;AACA;;;AAC8B;;AAAvB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AAnLU;AAFH;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAsLP;AACO;;AA3BV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA6BA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAjM6B;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAsNO;;AAAA;;AAAA;AAAP;AACA;;;AACA;;;AACA;AAAA;;AAAA;AACO;;AAzBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA5N6B;;AAAnB;AAAA;AAAA;AAAA;AAAA;;AAAP;AA2OO;AAAA;AAfV;AAAA;AAAA;AAAA;AAAA;AAAA;ACqtBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAWG;;AAAA;AAAA;AACO;;AAZV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;AAcA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AA6BG;;;AAGqB;AAAA;AAAA;AAArB;;AAAA;;AAAA;AA7xBO;;;AAAA;AAEH;AAFG;AAAA;;;AAAA;AAGH;;AAHG;AAAA;;;AAAA;AAIH;;AAJG;AAAA;;;AAAA;AAKH;;AALG;AAAA;;;AAAA;AAMH;;AANG;AAAA;;;;AAWP;AAoxB4B;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAprBrB;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAP;AAEI;;AAAA;AAAA;AAAA;;AA9BG;;;AAAA;;AAEH;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;;AAYP;AAoBG;AAAiB;AAAjB;AAAX;;;AACuB;;AAAA;;;AAAA;AAAJ;AAAP;AAsdG;AAAA;AAAA;AAAA;AAAA;AAAP;AACO;AAAA;;AAAA;AAAA;AAAA;AAAP;AAGgC;;AAAA;AAAA;AAAA;AAnCb;AAAA;;AAAA;;AACnB;AAGA;;AAAA;;AAAA;AAmC8B;;AAAA;;AAAA;AA9B1B;AAAA;;AAAA;AADJ;AAKA;;AAAA;;AAAA;AAEA;AAIQ;;AAFW;;AACF;;;;;;;;AAHjB;;;;;;AAAA;AA4BmB;AAAA;;AAAA;AAAnB;;AAAA;AAAA;AACA;;AAA4B;AAA5B;AAGA;;AAAA;;AAAA;AAG6B;AAAA;;AAAA;AAA7B;;AAAA;;AAAA;AACqB;;AAAA;;AAAA;AAArB;;AAAA;;AAAA;AACiC;;AAAA;AAAA;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;AAGA;;AAAA;;AAAA;AACoC;;AAAA;;;AAAA;AAApC;;AAAA;AAAA;AAC6B;;AAAA;;AAAA;AAA7B;AAAA;AAAA;AAGwB;;AAAA;;AAAA;AAAxB;;AAAA;AAAA;AAG6B;;AAAA;AAAA;AAA7B;;AAAA;AAAA;AACiC;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;AACyB;;AAAA;;AAAA;AAAzB;;AAAA;AAAA;AAC6B;;AAAA;;AAAA;AAA7B;;AAAA;AAAA;AACwB;;AAAA;;AAAA;AAAxB;;AAAA;AAAA;AACsB;;AAAA;;AAAA;AAAtB;;AAAA;AAAA;AACuB;;AAAA;;AAAA;AAAvB;;AAAA;AAAA;AAC4B;;AAAA;;;AAAA;AAA5B;;AAAA;AAAA;AAC0B;;AAAA;;;AAAA;AAA1B;;AAAA;AAAA;AAGyB;;AAAA;;AAAA;AAAzB;;AAAA;AAAA;AAGoB;;AAAA;AAAA;AAApB;AAAA;AAAA;AAGiC;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;AACkC;;AAAA;;AAAA;AAAlC;;AAAA;AAAA;AAGA;;AAAyB;AAAzB;AACA;;AAA0B;AAA1B;AAEO;;AAA8B;;AAA9B;AAAP;AACqC;AAAA;AAAA;AAA9B;;AAAA;AAAP;AACO;AAAP;AAkKuB;;AAAA;;;AAAvB;;AAAA;AAAA;AACsB;;AAAA;;;AAAtB;;AAAA;AAAA;AACO;;AAvCV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;;;;;;;;AAyCA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAeG;;;AAGkB;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAxKX;AAAA;AAAA;AAAA;AAAA;AAAP;AACO;AAAwB;;AAAxB;AAAP;AAGO;AAAA;;AAAA;AAAA;AAAP;AAEc;AAAsB;;AAAtB;AAAA;AAOU;;AAAd;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGF;AAAR;;AACM;;AAAA;;AAAA;AAAd;;;AACoB;;AAAA;;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AACW;AADX;AACW;AAAA;AAAA;;AAAA;;AACZ;AAAA;AAAA;AAAA;AAAA;;AAAkB;;AAAA;;AAAA;AAAlB;;AAAA;AAAP;AACA;;AAAA;;AAAA;;;AAGO;AAAA;;AAAA;AAAA;AAAA;;AAAP;AACZ;;;AACA;;AAAA;;;AACmD;;AAAQ;AAAR;AAAd;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAejB;;AAAA;AAAA;;AAAA;AADJ;AAGhB;;AAAA;;;AACuB;;AAAoB;AAApB;AAAP;AAGJ;;AAAS;AAAT;AAAA;;;;;AAjBQ;;AAAA;AAAA;AAC4C;AAAtB;AAElB;AAAuB;;AAAvB;AAAA;AAAA;AAAA;AAAA;;AADJ;AAGgB;AAAA;AAAA;;AAAA;AAAA;AAChB;AAAA;AAE2B;AAAvB;AADa;;AAAA;AAAA;;AAAA;AAAA;;AAAA;;;;AAxsBV;;AAAA;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAqtBR;;AAAA;;;AAEgB;;AAAA;;AAAA;AADJ;;AAAA;AAAA;AAGA;AAAc;;AAAd;AAsHG;;AAvBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAj3BU;AAAA;AAAA;AAAA;AAAP;AAk5BA;;;AACA;;;AACA;;;AAEO;AAAA;AAAA;AAAA;AAAoB;AAAA;;AAAA;AAAA;AAApB;;AAAA;AAAP;AACQ;;;AACD;AAAA;;;AAAA;AAAoB;;;AAApB;AAAP;AAIiB;;AAAA;;;AAEM;;AAAA;;;AACA;;AAAA;;;AACW;;AAAA;;;AAEC;;AAAA;;;AACD;;AAAA;;;AACC;;AAAA;;;AACrB;;AAAA;;;AAVV;;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAMkB;AANlB;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAFJ;;;AAAA;;AAeO;;AA9BV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;AAgCA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AA16BU;AAAA;AAAA;AAAA;AAAP;AAw7BA;;;AACA;;;AAEG;;AAAA;AAAA;AAAgB;;AAAhB;AAAX;;;AAj2Be;AAAA;;AAAA;AAAA;AAAsB;;AAAtB;AAk2BH;AACA;;;AAn2BG;AAAA;;AAAA;AAAA;AAAA;AAAsB;;AAAtB;AAisBP;AACO;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAoB;AAAA;;AAAA;AAAA;AAApB;AAAP;AAEwB;AAAA;;;AAAA;;AAAA;AAAA;AADxB;;;AAIuC;AAAA;;AAAA;AAAA;AAlvBpB;;AAAZ;AAmvBA;;;;AAAA;;AACJ;AAAc;;AAAd;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAX;;;AACmB;;AAAA;AAAA;AAAA;;AAAA;AACJ;;AAAA;AAAA;AAAA;AAAA;AAAc;;AAAd;AAAP;AAKuB;;AAAA;AAAA;;;AACA;;AAAA;;;AACW;;AAAA;;;AACC;;AAAA;;;AACD;;AAAA;;;AACC;;AAAA;;;AAR/B;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AADJ;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAaA;;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAA6B;AAA7B;AAAA;;AAAA;AAAA;AA4ImB;AAAA;AAAA;AAAA;AAAZ;;AAAA;AAAA;;AAAA;AAAP;AACQ;;;AAAA;AAAA;;AAEJ;AAAA;;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAtuBA;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;AAAA;;AAMH;;AANG;AAAA;;;;AAsuBP;AAGO;;AAAoB;;;AAApB;AAAP;AA9tBO;;AAAe;;AAAf;AAAA;;;AAAA;;AAAqC;;AAArC;AAAA;;;;AA+tBf;;;AErgCoC;;AAAe;;AAApC;;;AAAP;AFygCA;;AAAA;;AAAA;;;AAAA;;AACO;;AAjCV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA+BO;;;;;;;;;;;;;;AAz8BG;AAAA;AAAA;AAAA;AAAP;AAAA;AAk9B6B;AAAA;;AAAA;AAAA;AAAX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAEF;AAAA;;AAAA;AAAA;AACS;AAAA;;AAAA;AAAA;AACG;AAAA;;AAAA;AAAA;AACX;AAAA;AAAA;AAAA;AACQ;AAAA;;AAAA;AAAA;AACC;AAAA;AAAA;AAAA;AACI;AAAA;;AAAA;AAAA;AACJ;AAAA;;AAAA;AAAA;AACL;AAAA;;AAAA;AAAA;AACS;AAAA;;AAAA;AAAA;AACC;AAAA;;AAAA;AAAA;AACT;AAAA;;AAAA;AAAA;AACC;AAAA;;AAAA;AAAA;AAfhB;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAJV;AAAA;AAAA;AAAA;AAAA;AAAA;AA78BU;AAAA;AAAA;AAAA;AAAP;AAu+BG;AAAA;AAAA;AAAA;AAAqB;AAAA;;AAAA;AAAA;AAArB;AAAX;;;AAEyB;AAAA;AAAA;AAAA;AADN;AAEQ;;AAFR;AAGY;AAHZ;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AALd;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBmC;AAAA;AAAA;AAAA;AAAzB;;;AAhBV;;;AEt9BG;;;AARH;AAAA;AAUA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAWG;;;AACA;;AAAA;AAAA;AACO;;AAbV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAeA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAWG;;;AACA;;AAAA;AAAA;AACO;;AAbV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAeA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAsBG;;;AACA;;;AACwB;AAAA;;AAAxB;;;AA9Gc;;AAAX;AAAX;;;AACY;;AAAA;;AAAA;AA+GG;;AA1BV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAlFM;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAyGJ;;;AAvGG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAqGJ;;;AAnGG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAiGJ;;;AA/FG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AA6FJ;;;AA3FG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;;;;AA4FP;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAmBG;;;AACA;;;AACwB;AAAA;;AAAxB;;;AA9GO;AAAW;;AAAX;AAAP;AACc;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AA6GG;;AAvBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AApFM;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAwGJ;;;AAtGG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAoGJ;;;AAlGG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAgGJ;;;AA9FG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;;;;AA+FP;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AApK+B;;AAAgB;;AAArC;;;AAAP;AAoLA;;AAAA;AAAA;AACO;;AAjBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BU;AAAA;;AAAA;AAAA;AARV;AAAA;AAAA;AAAA;AAAA;AAAA;AAUA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAc4B;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AAlBP;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAcU;AACP;AAAA;;;AAES;;;;;;;;AADT;;AAAA;;;;;;;;;;;;;;AA+BQ;AAJI;;AAvRL;;AAAA;AAAA;AAAA;AAAA;;AAsRC;AAGO;AAAA;AA7ClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAsCe;;AAlRL;;AAAA;AAAA;AAAA;AAAA;;AAiRC;AAGO;AAAA;AAxClB;;;AAiCe;;AA7QL;;AAAA;AAAA;AAAA;AAAA;;AA4QC;AAGO;AAAA;AAnClB;;;AA4Be;;AAxQL;;AAAA;AAAA;AAAA;AAAA;;AAuQC;AAGO;AAAA;AA9BlB;;;AAuBe;;AAnQL;;AAAA;AAAA;AAAA;AAAA;;AAkQC;AAGO;AAAA;AAzBlB;;;AAkBkB;;;;;;;;;;;;;;;;;;AAlBlB;;;AHzQD;;;AAEe;;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAJ;AAAP;;AAgBJ;;;AApB8B;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAqCW;AAAA;AAAA;AAIM;AAAA;;AAAA;AAAA;AAAiC;;AAAA;;AAAA;AAAjC;AAEb;AAAA;;AAAA;AAAA;AAAkC;;AAAA;;AAAA;AAAlC;AAMgB;;AAAA;AAAA;AAAgB;AAAA;;AAAA;AAAA;AADf;;AAAA;;AAAA;;AAAA;;;AAIgB;AAAA;;AAAA;AAAA;AADf;;AAAA;;AAAA;;AAAA;;;AAMtB;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAI+B;AAAA;;AAAA;AAAA;AAA/B;AAAA;;AACgC;AAAA;;AAAA;AAAA;AAAhC;AAAA;;AAG0B;AAAA;AAAA;AAAA;AAA1B;AAAA;;AAIA;;AAAA;AAAA;AACA;AAEJ;;;;;;AAzE8B;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AC+GO;AAAA;AAAA;AAAA;AAAe;;AAAf;ADnCf;;;AACY;AAEO;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AACR;;AAAA;AAAA;AAAA;;AAAX;;;AACY;AAGJ;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAC0B;AAA1B;AAAA;;AACA;;AAAA;AAAA;AACO;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;AAAA;AAAA;;AAAA;AAAA;;ACyCJ;;;AAIO;;AAAA;;;AAAA;;AAAA;;;AACQ;AAAP;AACQ;;AAAA;;AAAA;AACL;;AAAA;AAAP;AAEJ;;;AAEJ;;AAAA;;;AACmB;AAAP;AACG;AAAA;;AAAA;AAAA;AAAP;AAAA;AACoC;AAAA;;AAAA;AAAA;AAA7B;;AAAA;AAAA;;AAAA;;;AAAP;AAEJ;;;AAOJ;;AAAA;;;AACmB;AAAP;AAEA;AAAA;;AAAA;AAAA;AAEA;AAAA;;AAAA;AAAA;AAHG;;AAAA;AAAA;;;AAAP;AAwBJ;;;AAEsB;AAAA;;AAAA;AAAA;AAAX;;AAAA;AAAP;AAdO;;AAAY;;AAAZ;AAgBA;AAAc;;AAAd;AAAA;AAAA;AAAA;AAAA;;AAAP;AAZO;;AAAW;;AAAX;AAeS;;AAAA;AAAA;;AAAA;AAAA;AAAT;;AAAA;AAAP;AACO;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAP;AAuGJ;;;AA1DO;;AARC;AAQD;AAAA;;;AAAA;;AAPC;AAOD;AAAA;;;AAAA;;AANC;;AAMD;AAAA;;;AAAA;;AALC;;AAKD;AAAA;;;AAAA;;AAJC;;AAID;AAAA;;;AACQ;AA6DX;;AA1DR;;AAAA;;;AAEmB;AAwDJ;;;AAtDJ;;AAAiB;;AAAjB;AAAA;;;AAAyC;;AAAiB;;AAAjB;AAAzC;;;AAIQ;;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;;AAkDJ;;;;AAAA;;;AA7CJ;;AAAiB;AAAjB;AAAX;;;AAEmB;;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;;AA2CJ;;;;AAAA;;;AArCJ;;AAAiB;;AAAjB;AAAX;;;AAEmB;;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;;AAmCJ;;;;AAAA;;;AA5BJ;;AAAiB;;AAAjB;AAAX;;;AAEmB;;AAAc;;AAAd;AA0BJ;;;AAxBA;AAwBA;;;AAkBH;AAAA;;AAAA;AAAA;AAAsB;AAAtB;AAAA;;;AACI;AAAA;;AAAA;AAAA;AADJ;;;;AADJ;;AAAA;AA8CJ;;;AASQ;;AAAA;;AAAA;AAAA;AAAA;;;AACG;AAAA;;AAAA;AAAA;AADH;;;AAEG;AAAA;;AAAA;AAAA;AAFH;;;AAIO;AAAP;;AAAA;;AAAA;AAEA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAHM;;;AAQN;AAAA;;AAAA;AAAA;AAHG;;AAAA;AAAA;;;AAAP;;AAAA;;AAAA;AA+DJ;;;AAMJ;;AAAA;;;AACY;;AAAA;AACU;AAAA;;AAAA;AAAA;AACV;AAAA;;AAAA;AAAA;AADmC;;AAAA;;AAAA;;;AAAzB;AAKd;AAAA;AAGI;AAAA;;AAAA;AAAA;AAFG;;AAAA;AAAA;;AAAA;;;AAAP;AAyIJ;;;;;;;;AAUW;;AAAA;AAAA;AAAkB;AAAA;AAAA;AAAA;AAAlB;AAAP;AACO;;AAAA;;AAAA;AAAwB;;AAAxB;AAAP;AAEa;;AAAA;AAAA;AAAA;AACI;AAAd;AAAA;AAAX;;;AA5ee;AAAA;AAAA;AAAA;AAAe;;AAAf;AA+eH;AAEI;AAAA;;AAAA;AAAA;AAA6B;AAAA;;AAAA;AAAA;AAA7B;AADJ;AAG6B;;AAAA;;AAAA;AAA7B;AAAA;;AAAA;AACA;;AAAA;AAAA;AAC6B;;AAAA;;AAAA;AAA7B;;AAAA;AAAA;AACA;;AAAwB;AAAxB;AACiC;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAqB;AAArB;AAAA;AAAA;AAAA;AACA;AAAc;;AAAd;AA7LJ;;AAAA;AACO;AAAA;;AAAA;AAAA;AA6LH;;AAAA;AAGmB;AAHnB;;;;AAAA;;AAKA;;AAAA;;AAAA;;AAAA;AA/fG;AAAA;AAAA;AAAA;AAAe;;AAAf;AAYA;AAAP;AAsfA;AAAA;;AAAA;AAAA;AAAyB;;AAAA;;;AAAA;;AAAzB;AAAA;;AAAA;AAAA;AAEG;;AAAc;;AAAd;AAAX;;;AAIgB;;AAAA;;AAAA;AACA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAHY;;;AAMI;AAAA;;AAAA;AAAA;AAAhB;AAAA;;AA0EL;AAAA;;AAAA;AAAA;AAAA;;;AAAqC;AAAA;;AAAA;AAAA;AAAP;;AAAA;AAA9B;;;AACQ;AAAA;;AAAA;AAAA;AAAA;;AAAA;AACR;AAAA;;AAAA;AAAA;AAAA;;;AAAmC;AAAA;;AAAA;AAAA;AAAP;;AAAA;AAA5B;;;AACQ;AAAA;;AAAA;AAAA;AAAA;;AAAA;AA9EP;;AAAA;;AAAA;AAYD;;AAAc;;AAAd;AAAX;;;AACyC;;AAAA;;AAAA;AAA7B;AAAA;;AAAA;AACA;;AAAA;AAAA;AAKD;;;AAAX;;;AACe;;AAAc;;AAAd;AAAf;;;AA7L0B;AAAA;;AAAA;AAAA;AAAA;;AAAA;AACJ;AAAd;;AACwB;AAAxB;;AAEG;;AAAA;;AAAA;AAAA;AAAA;;AAAX;;;AAE8B;;AAAA;;AAAA;;;AAAA;AAAA;;AAKM;AAAxB;;;;AAEc;AAAA;AAAA;AAAA;AAAoB;AAApB;AAAA;;AACM;AAAA;;AAAA;AAAA;AAAlB;;AAAA;AAAd;;;AAC2B;;AAAA;;;AAAA;AAAA;;AACK;AAAA;AAAA;AAAA;;AAEuB;;AAArB;AAAA;;;AAClB;;AAAqB;;AAArB;AAAA;;;AACI;;AAAA;;AAAA;AADJ;;;;AAGhB;;;AACA;;AAAA;;;AAC4C;AAAxB;;AAOR;;AAAmB;AAAnB;AAAA;;;;;AAHY;;AAAA;;AAAA;AAFc;;AAAA;AAAA;;;AAAA;AAAA;;AAIlB;;AAAA;AAAA;;;;;;;;;AAGZ;;AAAA;AACY;AAAA;AAAA;AAAA;AACT;;AAAA;;AAAA;AAAc;AAAd;AAAX;;;AAEyB;AAAA;;AAAA;AAAA;AAAb;AAGA;AAAA;;AAAA;AAAA;AAFG;;AAAA;;;AAwJC;;AAAA;AAAA;AAKR;AAAA;AAAA;AAAA;AAAqB;AAArB;AAAA;AAAA;AAAA;AACA;;AAEW;AACQ;AAHnB;;;;AAAA;;;;;;;;;AAFqC;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;;;;AAVC;;AAAc;;AAAd;AAAb;;;AAE6C;AAAA;AAAA;AAAA;AAAjC;;AAAA;AAAA;;;;AAdC;;AAAc;;AAAd;AAAb;;;AACwB;;AAAA;;AAAA;AAAA;AAAA;;AACxB;;;AAC4B;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAChB;;AAAA;;AAAA;;;;AAEG;;AAAA;;AAAA;AAAA;AAAA;;AAAf;;;AACgB;;AAAA;;AAAA;;;;AA2BZ;;;AAUwB;;AACH;;AAAA;AAAA;AACE;;AAAA;;;AACI;;AAAA;;;AACJ;;AAGW;;AALX;AAKW;AA6BtC;;AAAA;;;AACmB;AA/BS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAIA;AAAA;;AAAA;AAAA;AACH;;AAAA;AAAiB;AAAjB;AAZb;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AADJ;;;;;;AAAA;AAAA;AAAA;;;;;;AAwCG;;AAAe;AAAf;AAAA;;;AAAA;;AAAsC;;AAAtC;AAAA;;;AACQ;AAhCC;;;AAiCL;;;AAjCK;;;AEhpBhB;;;;;AAFW;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAGA;;;AACH;;AAAA;AAAA;AAAA;AAAA;AACG;;AAAA;AAAA;;AADH;AAAA;;;AAEG;;AAAA;AAAA;AAAA;AAAA;AADA;;AAAA;AADH;;;;AADJ;;AAAA;;;;;AAOyB;;AAbF;AAAA;;AAAA;AAAA;AAAhB;AAaP;;AAkBW;AAAA;;AAAA;AAAA;AAAJ;AAAP;;AAGW;AAAA;;AAAA;AAAA;AAAJ;AAAP;;AAEJ;;;AACW;;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;AAAA;;AAMH;;AANG;AAAA;;;AAAA;;AAOH;;AAPG;AAAA;;;;AAAP;;;", + "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AG4BmD;;AAAf;;AAA5B;AAC4C;;AAAf;;AAA7B;AAkBA;;AAAuB;AAAvB;AACA;;AAAuB;AAAvB;AFQA;AAAc;AAAd;AACA;;AAAqB;AAArB;AAGA;;AAAuB;;AAAvB;AACA;;AAAsB;;AAAtB;AAGA;;AAA6B;AAA7B;AACA;;AAA2B;AAA3B;AAGA;;AAA6B;AAA7B;AACA;;AAAqB;AAArB;AACA;;AAA6B;AAA7B;AACA;;AAA6B;AAA7B;AAGA;;AAA4B;AAA5B;AAGA;;AAAmB;AAAnB;AACA;;AAA4B;AAA5B;AAGA;;AAA+B;AAA/B;AACA;AAA6B;AAA7B;AACA;;AAAiC;AAAjC;AACA;;AAAoC;AAApC;AAGA;;AAAiC;AAAjC;AACA;;AAAwB;AAAxB;AAGA;;AAA6B;AAA7B;AACA;;AAAyB;AAAzB;AACA;;AAA6B;AAA7B;AACA;;AAAwB;AAAxB;AACA;;AAAsB;AAAtB;AACA;;AAAuB;AAAvB;AACA;;AAA4B;AAA5B;AACA;;AAA0B;AAA1B;AAGA;;AAA0B;AAA1B;AACA;;AAAyB;AAAzB;AAGA;;AAAiC;AAAjC;AACA;;AAAkC;AAAlC;AAQA;AAAoB;AAApB;AACA;;AAA4B;AAA5B;AAGA;;AAAyB;AAAzB;AIhGO;;AAA6B;;AAA7B;AAAP;AACO;;AAAuB;;AAAvB;AAAP;AACO;;AAAA;AAAP;AACO;;AAAA;AAAP;AAlBR;;;;;;AAAA;;;AAAA;;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;;;;;;AAAA;;;AAAA;;;;AAAA;AF4IK;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;;;;;;;ADtGA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ADiGU;AAAA;AAAA;AAAA;AAAP;AC7FA;;;AACA;;;AACA;;;ADmFO;AAAA;AAAA;AAAA;AAAe;;AAAf;AAYA;AAAP;AC5FmB;AACD;;AAId;;AAAA;;AAAA;AAAA;;;AACI;AAAA;AAAA;AAAA;AAAoB;AAAA;;AAAA;AAAA;AAApB;AADJ;;;AAGiC;AAAA;AAAA;AAAA;AAAzB;;;AAAA;AAAA;;AACL;;AAAA;AAAA;AAAA;;AAAuB;;AAAvB;AAAf;;;AAEuC;;AAAA;AAAA;AAAA;AAAA;;AD6R3B;AADG;AAAA;AAAA;;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;;AC5RA;;;ADkeA;;AAAA;AAAA;AAAkB;AAAA;AAAA;AAAA;AAAlB;AAAP;AACO;;AAAwB;;AAAxB;AAAP;AAxIG;;AAAA;;;AAAA;;AAAyC;;AAAzC;AAAA;;;AACQ;;;AAYE;;AAAA;AAAA;AAAA;AAAA;;AACS;;AAAnB;AAAA;;;AAAA;;AAAyC;;AAAzC;AAAA;;;AACQ;;;AA6HkB;;AAAA;;AAAA;AAAA;;AAG1B;;;AAAX;;;;;;;AAkB+B;;AAAA;;;AACC;;AAAA;;;AACN;;AAAA;;;AAAA;AAAA;;AAAA;;AACC;AAAA;;;AAAA;AAAA;;AACD;;AAAA;;AAAA;AAAA;AAAA;;AAqJyB;;AAAjC;AAAA;;AAAA;AAAA;AAAA;;AAAA;AA/QH;AAAA;;AAAA;AAAA;AAAyB;AAAA;;AAAA;AAAA;AAAzB;;AAAA;AAiRA;;AAAA;;AAAA;AAAP;AACO;;AAAA;AAAA;AAtJH;;AAAA;AADJ;AAIA;;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AACG;;AAAA;AAAA;AAAgC;;AAAhC;AAAX;;;AAEY;AAAA;;AAAA;AAAA;AAAyB;;AAAA;;;AAAA;;AAAzB;AAAA;;AAAA;AAAA;AAGG;;;AAAJ;;;AAAkC;;AAAA;AAAA;AAAgC;;AAAhC;AAAlC;;;AAGkC;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;AACJ;AAAA;;AAAA;AACA;;AAAA;;AAAA;AACA;AAAA;AAAA;AAAA;AAAqB;AAArB;AAAA;AAAA;AAAA;AAEG;;AAAA;;;AAAoB;;;AAApB;AAAA;;;AAEG;AAAA;AAAA;AAAA;AAFH;;;AAGC;AAAc;;;AAAd;AACA;;AAAiC;AAAjC;AAEJ;;AAAA;;AAAA;AAAA;;;AAAA;ACxhBI;;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;;AACA;;AAAoB;AAApB;AAAA;;;;;ADugBA;;AAAwB;AAAxB;;;;AAlCa;;AAAA;AAAA;AAAA;AAAA;;AAGI;;AAAd;AAAf;;;AAEoB;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;;;;;;AAGH;;AAAc;AAAd;AAAjB;;;AAC6C;AAAA;AAAA;AAAA;AAAA;;AAAA;AACR;AAAA;;AAAA;AAAA;AAAA;;AAAA;;;;AACpB;;AAAc;;AAAd;AAAjB;;;;;;;AAAA;;;AAC6C;AAA7B;;AACqB;AAArB;;;;;AA7IL;;;AAAX;;;AACe;;AAAc;;AAAd;AAAf;;;AACuB;AAAA;AAAA;AAAA;;;AAyHQ;;;AAxHJ;AAAA;;AAAA;AAAA;AAAwB;;AAAA;;;AAAA;;AAAxB;AAAA;AAAA;;AACZ;AAAA;;AAAA;AAAA;AAAA;AAAf;;;AACuB;;;AAsHQ;;;AArHA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AACG;AAAA;AAAA;AAAA;AAAnB;AAAf;;;AACuB;AAAA;AAAA;AAAA;;;AAmHQ;;;;;;;AAAA;;;AAhHnB;;AAAA;;AAAA;AAAoC;AAAA;AAAA;AAAA;AAApC;AAAA;AADJ;AAGO;AAAA;;;AA8GgB;;;AAzIhB;AAAA;;AAAA;AAAA;AAAwB;;AAAA;;;AAAA;;AAAxB;;;AAwIe;;;AC7dtB;;AAAA;AAAA;AAIiB;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAEH;;AALP;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AA7BV;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;;;AAqCA;;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AD4DU;AAAA;AAAA;AAAA;AAAP;ADvH0B;;AAAnB;AAAA;AAAA;AAAA;AAAA;;AAAP;AEVG;AAAA;;AAAA;AAAA;AAAwB;;AAAxB;AAAX;;;AAEgB;;AAAc;AAAA;;AAAA;AAAA;AAAd;AAAA;;;AACG;;AAAA;;AAAA;AADH;;;AAEG;;AAAc;;AAAA;AAAA;AAAA;;;AAAd;AAFH;;;;AADJ;AA+EJ;;;AACA;;;ADwCO;AAAA;AAAA;AAAA;AAAe;;AAAf;AAYA;AAAP;ACjDA;;AAAA;AAAA;;;AACA;;;;;AFkBI;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AACE;AAAA;;AAAA;AAAA;AAAA;;AADF;;AAAA;AAAA;AAAA;;AEhBJ;AA7EI;;;AACI;AAAA;;AAAA;AAAA;AADJ;;AAAA;;AAAA;;;AAGQ;AAAA;AAAA;AAAA;;;AAAA;AAAJ;;;;AA+EhB;;;AAzE6C;;AAAjC;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AADJ;AA4Ec;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AArEd;AAIQ;;;;;;;;;;;;;AAJR;;;;;;AAAA;AFuFkB;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AACC;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAGW;AAA9B;AAAA;AAAA;;AAAA;;AACA;AAAA;;AACA;;AAAA;AAAA;AAEO;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACO;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAP;AAGA;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AEzBiB;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AACH;;AAJP;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;;;;AAAA;AAAA;AAAA;AA5BV;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;;;AE7DA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIG;;;AACO;AAAA;AAAP;AAEA;;AAAA;;AAAA;AACA;;AAAA;AAAA;AACO;;AATV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AH8GU;AAAA;AAAA;AAAA;AAAP;AExE4B;;AAAqB;;AAA1C;;;AAAP;AC5BA;;;AACA;;;AH2FO;AAAA;AAAA;AAAA;AAAe;;AAAf;AG1FP;AJrB0B;;AAAnB;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAP;AIuBA;AAAA;;;AACA;AAAA;AAEI;AAAA;;AAAA;AAAA;AAAA;AAAqC;AAAA;;AAAA;AAAA;AAArC;AADJ;AAGG;AAAA;;AAAA;AAAA;AAAX;;;AAEgB;;AAA2B;AAAA;;AAAA;AAAA;AAA3B;AADJ;AJ+FJ;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AI1FA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AACO;AAAA;;AAAA;AAAA;AAAA;AAAA;AA1BV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AA4BA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AHkFU;AAAA;AAAA;AAAA;AAAP;AGpEA;;;AACA;;;AH2DO;AAAA;AAAA;AAAA;AAAe;;AAAf;AAYA;AAAP;AGtIG;AAAA;;AAAA;AAAA;AAAX;;;AAEgB;AAAA;;AAAA;AAAA;AAA8B;;AAA9B;AADJ;AAGD;AAAA;;AAAA;AAAA;AAAX;;;AAEgB;;AAA0B;AAAA;;AAAA;AAAA;AAA1B;AADJ;AA8DG;;AAAA;;AAAA;AAAA;;AAAA;AAAP;AJxD0B;;AAAnB;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAP;AAA0B;;AAAnB;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAP;AI2DA;;AAAA;;;AACA;AAAA;;;AACO;;AAAA;AAAP;AACA;;AAAA;AAAA;AACgB;AAAA;AAAA;AAAA;AAAA;AAAT;AAAP;AH6pBG;AAAA;AAAA;AAAA;AAAqB;AAAA;;AAAA;AAAA;AAArB;AAAX;;;AAE8C;AAAA;AAAA;AAAA;AAAzB;;;AAET;;AAAA;AAA4B;;AAA5B;AADJ;AG7pBA;;AAAA;AAAA;;;AACA;;AAAA;AAAA;;AAAA;;;AACA;;;;;AACA;;;;;AJ2DgB;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAT;;AAAA;AAAA;;AAAA;;AAAA;AAAP;AACA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AATA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AInFH;AAAA;;AAAA;AAAA;AAAA;AAAA;AJwGA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AGxF+B;;AAAgB;;AAArC;;;AAAP;AHrD0B;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAiKA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AACO;;AArBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AGxH+B;;AAAsB;;AAA3C;;;AAAP;AFuEO;AAAA;AAAA;AAAA;AAAe;;;AAAf;ADuEA;AAAP;AACA;;;AACA;;;AAC8B;;AAAvB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AAnLU;AAFH;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAsLP;AACO;;AA3BV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA6BA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAjM6B;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAsNO;;AAAA;;AAAA;AAAP;AACA;;;AACA;;;AACA;AAAA;;AAAA;AACO;;AAzBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA5N6B;;AAAnB;AAAA;AAAA;AAAA;AAAA;;AAAP;AA2OO;AAAA;AAfV;AAAA;AAAA;AAAA;AAAA;AAAA;ACqtBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAWG;;AAAA;AAAA;AACO;;AAZV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;AAcA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AA6BG;;;AAGqB;AAAA;AAAA;AAArB;;AAAA;;AAAA;AA7xBO;;;AAAA;AAEH;AAFG;AAAA;;;AAAA;AAGH;;AAHG;AAAA;;;AAAA;AAIH;;AAJG;AAAA;;;AAAA;AAKH;;AALG;AAAA;;;AAAA;AAMH;;AANG;AAAA;;;;AAWP;AAoxB4B;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAprBrB;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAP;AAEI;;AAAA;AAAA;AAAA;;AA9BG;;;AAAA;;AAEH;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;;AAYP;AAoBG;AAAiB;AAAjB;AAAX;;;AACuB;;AAAA;;;AAAA;AAAJ;AAAP;AAsdG;AAAA;AAAA;AAAA;AAAA;AAAP;AACO;AAAA;;AAAA;AAAA;AAAA;AAAP;AAGgC;;AAAA;AAAA;AAAA;AAnCb;AAAA;;AAAA;;AACnB;AAGA;;AAAA;;AAAA;AAmC8B;;AAAA;;AAAA;AA9B1B;AAAA;;AAAA;AADJ;AAKA;;AAAA;;AAAA;AAEA;AAIQ;;AAFW;;AACF;;;;;;;;AAHjB;;;;;;AAAA;AA4BmB;AAAA;;AAAA;AAAnB;;AAAA;AAAA;AACA;;AAA4B;AAA5B;AAGA;;AAAA;;AAAA;AAG6B;AAAA;;AAAA;AAA7B;;AAAA;;AAAA;AACqB;;AAAA;;AAAA;AAArB;;AAAA;;AAAA;AACiC;;AAAA;AAAA;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;AAGA;;AAAA;;AAAA;AACoC;;AAAA;;;AAAA;AAApC;;AAAA;AAAA;AAC6B;;AAAA;;AAAA;AAA7B;AAAA;AAAA;AAGwB;;AAAA;;AAAA;AAAxB;;AAAA;AAAA;AAG6B;;AAAA;AAAA;AAA7B;;AAAA;AAAA;AACiC;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;AACyB;;AAAA;;AAAA;AAAzB;;AAAA;AAAA;AAC6B;;AAAA;;AAAA;AAA7B;;AAAA;AAAA;AACwB;;AAAA;;AAAA;AAAxB;;AAAA;AAAA;AACsB;;AAAA;;AAAA;AAAtB;;AAAA;AAAA;AACuB;;AAAA;;AAAA;AAAvB;;AAAA;AAAA;AAC4B;;AAAA;;;AAAA;AAA5B;;AAAA;AAAA;AAC0B;;AAAA;;;AAAA;AAA1B;;AAAA;AAAA;AAGyB;;AAAA;;AAAA;AAAzB;;AAAA;AAAA;AAGoB;;AAAA;AAAA;AAApB;AAAA;AAAA;AAGiC;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;AACkC;;AAAA;;AAAA;AAAlC;;AAAA;AAAA;AAGA;;AAAyB;AAAzB;AACA;;AAA0B;AAA1B;AAEO;;AAA8B;;AAA9B;AAAP;AACqC;AAAA;AAAA;AAA9B;;AAAA;AAAP;AACO;AAAP;AAkKuB;;AAAA;;;AAAvB;;AAAA;AAAA;AACsB;;AAAA;;;AAAtB;;AAAA;AAAA;AACO;;AAvCV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;;;;;;;;AAyCA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAeG;;;AAGkB;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAxKX;AAAA;AAAA;AAAA;AAAA;AAAP;AACO;AAAwB;;AAAxB;AAAP;AAGO;AAAA;;AAAA;AAAA;AAAP;AAEc;AAAsB;;AAAtB;AAAA;AAOU;;AAAd;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGF;AAAR;;AACM;;AAAA;;AAAA;AAAd;;;AACoB;;AAAA;;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AACW;AADX;AACW;AAAA;AAAA;;AAAA;;AACZ;AAAA;AAAA;AAAA;AAAA;;AAAkB;;AAAA;;AAAA;AAAlB;;AAAA;AAAP;AACA;;AAAA;;AAAA;;;AAGO;AAAA;;AAAA;AAAA;AAAA;;AAAP;AACZ;;;AACA;;AAAA;;;AACmD;;AAAQ;AAAR;AAAd;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAejB;;AAAA;AAAA;;AAAA;AADJ;AAGhB;;AAAA;;;AACuB;;AAAoB;AAApB;AAAP;AAGJ;;AAAS;AAAT;AAAA;;;;;AAjBQ;;AAAA;AAAA;AAC4C;AAAtB;AAElB;AAAuB;;AAAvB;AAAA;AAAA;AAAA;AAAA;;AADJ;AAGgB;AAAA;AAAA;;AAAA;AAAA;AAChB;AAAA;AAE2B;AAAvB;AADa;;AAAA;AAAA;;AAAA;AAAA;;AAAA;;;;AAxsBV;;AAAA;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAqtBR;;AAAA;;;AAEgB;;AAAA;;AAAA;AADJ;;AAAA;AAAA;AAGA;AAAc;;AAAd;AAsHG;;AAvBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAj3BU;AAAA;AAAA;AAAA;AAAP;AAk5BA;;;AACA;;;AACA;;;AAEO;AAAA;AAAA;AAAA;AAAoB;AAAA;;AAAA;AAAA;AAApB;;AAAA;AAAP;AACQ;;;AACD;AAAA;;;AAAA;AAAoB;;;AAApB;AAAP;AAIiB;;AAAA;;;AAEM;;AAAA;;;AACA;;AAAA;;;AACW;;AAAA;;;AAEC;;AAAA;;;AACD;;AAAA;;;AACC;;AAAA;;;AACrB;;AAAA;;;AAVV;;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAMkB;AANlB;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAFJ;;;AAAA;;AAeO;;AA9BV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;AAgCA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AA16BU;AAAA;AAAA;AAAA;AAAP;AAw7BA;;;AACA;;;AAEG;;AAAA;AAAA;AAAgB;;AAAhB;AAAX;;;AAj2Be;AAAA;;AAAA;AAAA;AAAsB;;AAAtB;AAk2BH;AACA;;;AAn2BG;AAAA;;AAAA;AAAA;AAAA;AAAsB;;AAAtB;AAisBP;AACO;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAoB;AAAA;;AAAA;AAAA;AAApB;AAAP;AAEwB;AAAA;;;AAAA;;AAAA;AAAA;AADxB;;;AAIuC;AAAA;;AAAA;AAAA;AAlvBpB;;AAAZ;AAmvBA;;;;AAAA;;AACJ;AAAc;;AAAd;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAX;;;AACmB;;AAAA;AAAA;AAAA;;AAAA;AACJ;;AAAA;AAAA;AAAA;AAAA;AAAc;;AAAd;AAAP;AAKuB;;AAAA;AAAA;;;AACA;;AAAA;;;AACW;;AAAA;;;AACC;;AAAA;;;AACD;;AAAA;;;AACC;;AAAA;;;AAR/B;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AADJ;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAaA;;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAA6B;AAA7B;AAAA;;AAAA;AAAA;AA4ImB;AAAA;AAAA;AAAA;AAAZ;;AAAA;AAAA;;AAAA;AAAP;AACQ;;;AAAA;AAAA;;AAEJ;AAAA;;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAtuBA;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;AAAA;;AAMH;;AANG;AAAA;;;;AAsuBP;AAGO;;AAAoB;;;AAApB;AAAP;AA9tBO;;AAAe;;AAAf;AAAA;;;AAAA;;AAAqC;;AAArC;AAAA;;;;AA+tBf;;;AErgCoC;;AAAe;;AAApC;;;AAAP;AFygCA;;AAAA;;AAAA;;;AAAA;;AACO;;AAjCV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA+BO;;;;;;;;;;;;;;AAz8BG;AAAA;AAAA;AAAA;AAAP;AAAA;AAk9B6B;AAAA;;AAAA;AAAA;AAAX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAEF;AAAA;;AAAA;AAAA;AACS;AAAA;;AAAA;AAAA;AACG;AAAA;;AAAA;AAAA;AACX;AAAA;AAAA;AAAA;AACQ;AAAA;;AAAA;AAAA;AACC;AAAA;AAAA;AAAA;AACI;AAAA;;AAAA;AAAA;AACJ;AAAA;;AAAA;AAAA;AACL;AAAA;;AAAA;AAAA;AACS;AAAA;;AAAA;AAAA;AACC;AAAA;;AAAA;AAAA;AACT;AAAA;;AAAA;AAAA;AACC;AAAA;;AAAA;AAAA;AAfhB;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAJV;AAAA;AAAA;AAAA;AAAA;AAAA;AA78BU;AAAA;AAAA;AAAA;AAAP;AAu+BG;AAAA;AAAA;AAAA;AAAqB;AAAA;;AAAA;AAAA;AAArB;AAAX;;;AAEyB;AAAA;AAAA;AAAA;AADN;AAEQ;;AAFR;AAGY;AAHZ;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AALd;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBmC;AAAA;AAAA;AAAA;AAAzB;;;AAhBV;;;AEt9BG;;;AARH;AAAA;AAUA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAWG;;;AACA;;AAAA;AAAA;AACO;;AAbV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAeA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAWG;;;AACA;;AAAA;AAAA;AACO;;AAbV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAeA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAsBG;;;AACA;;;AACwB;AAAA;;AAAxB;;;AA9Gc;;AAAX;AAAX;;;AACY;;AAAA;;AAAA;AA+GG;;AA1BV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAlFM;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAyGJ;;;AAvGG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAqGJ;;;AAnGG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAiGJ;;;AA/FG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AA6FJ;;;AA3FG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;;;;AA4FP;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAmBG;;;AACA;;;AACwB;AAAA;;AAAxB;;;AA9GO;AAAW;;AAAX;AAAP;AACc;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AA6GG;;AAvBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AApFM;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAwGJ;;;AAtGG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAoGJ;;;AAlGG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAgGJ;;;AA9FG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;;;;AA+FP;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AApK+B;;AAAgB;;AAArC;;;AAAP;AAoLA;;AAAA;AAAA;AACO;;AAjBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BU;AAAA;;AAAA;AAAA;AARV;AAAA;AAAA;AAAA;AAAA;AAAA;AAUA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAc4B;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AAlBP;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAcU;AACP;AAAA;;;AAES;;;;;;;;AADT;;AAAA;;;;;;;;;;;;;;AA+BQ;AAJI;;AAvRL;;AAAA;AAAA;AAAA;AAAA;;AAsRC;AAGO;AAAA;AA7ClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAsCe;;AAlRL;;AAAA;AAAA;AAAA;AAAA;;AAiRC;AAGO;AAAA;AAxClB;;;AAiCe;;AA7QL;;AAAA;AAAA;AAAA;AAAA;;AA4QC;AAGO;AAAA;AAnClB;;;AA4Be;;AAxQL;;AAAA;AAAA;AAAA;AAAA;;AAuQC;AAGO;AAAA;AA9BlB;;;AAuBe;;AAnQL;;AAAA;AAAA;AAAA;AAAA;;AAkQC;AAGO;AAAA;AAzBlB;;;AAkBkB;;;;;;;;;;;;;;;;;;AAlBlB;;;AHzQD;;;AAEe;;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAJ;AAAP;;AAgBJ;;;AApB8B;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAqCW;AAAA;AAAA;AAIM;AAAA;;AAAA;AAAA;AAAiC;;AAAA;;AAAA;AAAjC;AAEb;AAAA;;AAAA;AAAA;AAAkC;;AAAA;;AAAA;AAAlC;AAMgB;;AAAA;AAAA;AAAgB;AAAA;;AAAA;AAAA;AADf;;AAAA;;AAAA;;AAAA;;;AAIgB;AAAA;;AAAA;AAAA;AADf;;AAAA;;AAAA;;AAAA;;;AAMtB;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAI+B;AAAA;;AAAA;AAAA;AAA/B;AAAA;;AACgC;AAAA;;AAAA;AAAA;AAAhC;AAAA;;AAG0B;AAAA;AAAA;AAAA;AAA1B;AAAA;;AAIA;;AAAA;AAAA;AACA;AAEJ;;;;;;AAzE8B;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AC+GO;AAAA;AAAA;AAAA;AAAe;;AAAf;ADnCf;;;AACY;AAEO;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AACR;;AAAA;AAAA;AAAA;;AAAX;;;AACY;AAGJ;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAC0B;AAA1B;AAAA;;AACA;;AAAA;AAAA;AACO;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;AAAA;AAAA;;AAAA;AAAA;;ACyCJ;;;AAIO;;AAAA;;;AAAA;;AAAA;;;AACQ;AAAP;AACQ;;AAAA;;AAAA;AACL;;AAAA;AAAP;AAEJ;;;AAEJ;;AAAA;;;AACmB;AAAP;AACG;AAAA;;AAAA;AAAA;AAAP;AAAA;AACoC;AAAA;;AAAA;AAAA;AAA7B;;AAAA;AAAA;;AAAA;;;AAAP;AAEJ;;;AAOJ;;AAAA;;;AACmB;AAAP;AAEA;AAAA;;AAAA;AAAA;AAEA;AAAA;;AAAA;AAAA;AAHG;;AAAA;AAAA;;;AAAP;AAwBJ;;;AAEsB;AAAA;;AAAA;AAAA;AAAX;;AAAA;AAAP;AAdO;;AAAY;;AAAZ;AAgBA;AAAc;;AAAd;AAAA;AAAA;AAAA;AAAA;;AAAP;AAZO;;AAAW;;AAAX;AAeS;;AAAA;AAAA;;AAAA;AAAA;AAAT;;AAAA;AAAP;AACO;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAP;AAuGJ;;;AA1DO;;AARC;AAQD;AAAA;;;AAAA;;AAPC;AAOD;AAAA;;;AAAA;;AANC;;AAMD;AAAA;;;AAAA;;AALC;;AAKD;AAAA;;;AAAA;;AAJC;;AAID;AAAA;;;AACQ;AA6DX;;AA1DR;;AAAA;;;AAEmB;AAwDJ;;;AAtDJ;;AAAiB;;AAAjB;AAAA;;;AAAyC;;AAAiB;;AAAjB;AAAzC;;;AAIQ;;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;;AAkDJ;;;;AAAA;;;AA7CJ;;AAAiB;AAAjB;AAAX;;;AAEmB;;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;;AA2CJ;;;;AAAA;;;AArCJ;;AAAiB;;AAAjB;AAAX;;;AAEmB;;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;;AAmCJ;;;;AAAA;;;AA5BJ;;AAAiB;;AAAjB;AAAX;;;AAEmB;;AAAc;;AAAd;AA0BJ;;;AAxBA;AAwBA;;;AAkBH;AAAA;;AAAA;AAAA;AAAsB;AAAtB;AAAA;;;AACI;AAAA;;AAAA;AAAA;AADJ;;;;AADJ;;AAAA;AA8CJ;;;AASQ;;AAAA;;AAAA;AAAA;AAAA;;;AACG;AAAA;;AAAA;AAAA;AADH;;;AAEG;AAAA;;AAAA;AAAA;AAFH;;;AAIO;AAAP;;AAAA;;AAAA;AAEA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAHM;;;AAQN;AAAA;;AAAA;AAAA;AAHG;;AAAA;AAAA;;;AAAP;;AAAA;;AAAA;AA+DJ;;;AAMJ;;AAAA;;;AACY;;AAAA;AACU;AAAA;;AAAA;AAAA;AACV;AAAA;;AAAA;AAAA;AADmC;;AAAA;;AAAA;;;AAAzB;AAKd;AAAA;AAGI;AAAA;;AAAA;AAAA;AAFG;;AAAA;AAAA;;AAAA;;;AAAP;AAyIJ;;;;;;;;AAUW;;AAAA;AAAA;AAAkB;AAAA;AAAA;AAAA;AAAlB;AAAP;AACO;;AAAA;;AAAA;AAAwB;;AAAxB;AAAP;AAEa;;AAAA;AAAA;AAAA;AACI;AAAd;AAAA;AAAX;;;AA5ee;AAAA;AAAA;AAAA;AAAe;;AAAf;AA+eH;AAEI;AAAA;;AAAA;AAAA;AAA6B;AAAA;;AAAA;AAAA;AAA7B;AADJ;AAG6B;;AAAA;;AAAA;AAA7B;AAAA;;AAAA;AACA;;AAAA;AAAA;AAC6B;;AAAA;;AAAA;AAA7B;;AAAA;AAAA;AACA;;AAAwB;AAAxB;AACiC;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAqB;AAArB;AAAA;AAAA;AAAA;AACA;AAAc;;AAAd;AA7LJ;;AAAA;AACO;AAAA;;AAAA;AAAA;AA6LH;;AAAA;AAGmB;AAHnB;;;;AAAA;;AAKA;;AAAA;;AAAA;;AAAA;AA/fG;AAAA;AAAA;AAAA;AAAe;;AAAf;AAYA;AAAP;AAsfA;AAAA;;AAAA;AAAA;AAAyB;;AAAA;;;AAAA;;AAAzB;AAAA;;AAAA;AAAA;AAEG;;AAAc;;AAAd;AAAX;;;AAIgB;;AAAA;;AAAA;AACA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAHY;;;AAMI;AAAA;;AAAA;AAAA;AAAhB;AAAA;;AA0EL;AAAA;;AAAA;AAAA;AAAA;;;AAAqC;AAAA;;AAAA;AAAA;AAAP;;AAAA;AAA9B;;;AACQ;AAAA;;AAAA;AAAA;AAAA;;AAAA;AACR;AAAA;;AAAA;AAAA;AAAA;;;AAAmC;AAAA;;AAAA;AAAA;AAAP;;AAAA;AAA5B;;;AACQ;AAAA;;AAAA;AAAA;AAAA;;AAAA;AA9EP;;AAAA;;AAAA;AAYD;;AAAc;;AAAd;AAAX;;;AACyC;;AAAA;;AAAA;AAA7B;AAAA;;AAAA;AACA;;AAAA;AAAA;AAKD;;;AAAX;;;AACe;;AAAc;;AAAd;AAAf;;;AA7L0B;AAAA;;AAAA;AAAA;AAAA;;AAAA;AACJ;AAAd;;AACwB;AAAxB;;AAEG;;AAAA;;AAAA;AAAA;AAAA;;AAAX;;;AAE8B;;AAAA;;AAAA;;;AAAA;AAAA;;AAKM;AAAxB;;;;AAEc;AAAA;AAAA;AAAA;AAAoB;AAApB;AAAA;;AACM;AAAA;;AAAA;AAAA;AAAlB;;AAAA;AAAd;;;AAC2B;;AAAA;;;AAAA;AAAA;;AACK;AAAA;AAAA;AAAA;;AAEuB;;AAArB;AAAA;;;AAClB;;AAAqB;;AAArB;AAAA;;;AACI;;AAAA;;AAAA;AADJ;;;;AAGhB;;;AACA;;AAAA;;;AAC4C;AAAxB;;AAOR;;AAAmB;AAAnB;AAAA;;;;;AAHY;;AAAA;;AAAA;AAFc;;AAAA;AAAA;;;AAAA;AAAA;;AAIlB;;AAAA;AAAA;;;;;;;;;AAGZ;;AAAA;AACY;AAAA;AAAA;AAAA;AACT;;AAAA;;AAAA;AAAc;AAAd;AAAX;;;AAEyB;AAAA;;AAAA;AAAA;AAAb;AAGA;AAAA;;AAAA;AAAA;AAFG;;AAAA;;;AAwJC;;AAAA;AAAA;AAKR;AAAA;AAAA;AAAA;AAAqB;AAArB;AAAA;AAAA;AAAA;AACA;;AAEW;AACQ;AAHnB;;;;AAAA;;;;;;;;;AAFqC;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;;;;AAVC;;AAAc;;AAAd;AAAb;;;AAE6C;AAAA;AAAA;AAAA;AAAjC;;AAAA;AAAA;;;;AAdC;;AAAc;;AAAd;AAAb;;;AACwB;;AAAA;;AAAA;AAAA;AAAA;;AACxB;;;AAC4B;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAChB;;AAAA;;AAAA;;;;AAEG;;AAAA;;AAAA;AAAA;AAAA;;AAAf;;;AACgB;;AAAA;;AAAA;;;;AA2BZ;;;AAUwB;;AACH;;AAAA;AAAA;AACE;;AAAA;;;AACI;;AAAA;;;AACJ;;AAGW;;AALX;AAKW;AA6BtC;;AAAA;;;AACmB;AA/BS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAIA;AAAA;;AAAA;AAAA;AACH;;AAAA;AAAiB;AAAjB;AAZb;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AADJ;;;;;;AAAA;AAAA;AAAA;;;;;;AAwCG;;AAAe;AAAf;AAAA;;;AAAA;;AAAsC;;AAAtC;AAAA;;;AACQ;AAhCC;;;AAiCL;;;AAjCK;;;AEhpBhB;;;;;AAFW;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAGA;;;AACH;;AAAA;AAAA;AAAA;AAAA;AACG;;AAAA;AAAA;;AADH;AAAA;;;AAEG;;AAAA;AAAA;AAAA;AAAA;AADA;;AAAA;AADH;;;;AADJ;;AAAA;;;;;AAOyB;;AAbF;AAAA;;AAAA;AAAA;AAAhB;AAaP;;AAkBW;AAAA;;AAAA;AAAA;AAAJ;AAAP;;AAGW;AAAA;;AAAA;AAAA;AAAJ;AAAP;;AAEJ;;;AACW;;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;AAAA;;AAMH;;AANG;AAAA;;;AAAA;;AAOH;;AAPG;AAAA;;;;AAAP;;;", "op_pc_offset": 0, "pc_events": { "1": { diff --git a/smart_contracts/artifacts/d-asa/DASA.approval.teal b/smart_contracts/artifacts/d_asa/DASA.approval.teal similarity index 99% rename from smart_contracts/artifacts/d-asa/DASA.approval.teal rename to smart_contracts/artifacts/d_asa/DASA.approval.teal index dcb03181..928498ba 100644 --- a/smart_contracts/artifacts/d-asa/DASA.approval.teal +++ b/smart_contracts/artifacts/d_asa/DASA.approval.teal @@ -211,31 +211,31 @@ main: bytec 5 // "fixed_point_scale" intc_0 // 0 app_global_put - // smart_contracts/d-asa/contract.py:23 + // smart_contracts/d_asa/contract.py:23 // assert Txn.global_num_byte_slice == cfg.GLOBAL_BYTES, err.WRONG_GLOBAL_BYTES txn GlobalNumByteSlice pushint 4 == assert // Wrong Global Bytes allocation - // smart_contracts/d-asa/contract.py:24 + // smart_contracts/d_asa/contract.py:24 // assert Txn.global_num_uint == cfg.GLOBAL_UINTS, err.WRONG_GLOBAL_UINTS txn GlobalNumUint pushint 37 == assert // Wrong Global UInts allocation - // smart_contracts/d-asa/contract.py:25 + // smart_contracts/d_asa/contract.py:25 // assert Txn.local_num_byte_slice == cfg.LOCAL_BYTES, err.WRONG_LOCAL_BYTES txn LocalNumByteSlice ! assert // Wrong Local Bytes allocation - // smart_contracts/d-asa/contract.py:26 + // smart_contracts/d_asa/contract.py:26 // assert Txn.local_num_uint == cfg.LOCAL_UINTS, err.WRONG_LOCAL_UINTS txn LocalNumUint ! assert // Wrong Local UInts allocation main_after_if_else@2: - // smart_contracts/d-asa/contract.py:8-18 + // smart_contracts/d_asa/contract.py:8-18 // class DASA( // PaymentAgent, // TransferAgent, @@ -252,7 +252,7 @@ main_after_if_else@2: match main_contract_update_route@4 main_switch_case_next@5: - // smart_contracts/d-asa/contract.py:8-18 + // smart_contracts/d_asa/contract.py:8-18 // class DASA( // PaymentAgent, // TransferAgent, @@ -275,7 +275,7 @@ main_switch_case_next@5: err main_create_NoOp@31: - // smart_contracts/d-asa/contract.py:8-18 + // smart_contracts/d_asa/contract.py:8-18 // class DASA( // PaymentAgent, // TransferAgent, @@ -1431,25 +1431,25 @@ set_transfer_schedule: == assert // invalid number of bytes for arc4.uint64 btoi - // modules/transfer_agent.py:24 + // modules/transfer_agent.py:26 // self._assert_caller_is_arranger() callsub _assert_caller_is_arranger - // modules/transfer_agent.py:25 + // modules/transfer_agent.py:27 // assert open_date < closure_date, err.INVALID_SORTING dup2 < assert // Time events must be sorted in strictly ascending order - // modules/transfer_agent.py:27 + // modules/transfer_agent.py:29 // self.transfer_opening_date = open_date bytec 27 // "transfer_opening_date" uncover 2 app_global_put - // modules/transfer_agent.py:28 + // modules/transfer_agent.py:30 // self.transfer_closure_date = closure_date bytec 28 // "transfer_closure_date" swap app_global_put - // modules/transfer_agent.py:29 + // modules/transfer_agent.py:31 // return Global.latest_timestamp global LatestTimestamp // modules/transfer_agent.py:22 @@ -1465,7 +1465,7 @@ set_transfer_schedule: // modules.transfer_agent.TransferAgent.primary_distribution[routing]() -> void: primary_distribution: - // modules/transfer_agent.py:31 + // modules/transfer_agent.py:33 // @arc4.abimethod txna ApplicationArgs 1 dup @@ -1495,10 +1495,10 @@ primary_distribution: txn Sender callsub _role_is_active assert // Not authorized - // modules/transfer_agent.py:41 + // modules/transfer_agent.py:43 // self._assert_is_not_asset_defaulted() callsub _assert_is_not_asset_defaulted - // modules/transfer_agent.py:42 + // modules/transfer_agent.py:44 // self._assert_is_not_asset_suspended() callsub _assert_is_not_asset_suspended // modules/kernel.py:135 @@ -1509,7 +1509,7 @@ primary_distribution: assert // check self.status exists pushint 50 == - // modules/transfer_agent.py:43 + // modules/transfer_agent.py:45 // assert self._status_is_pending_ied(), err.PRIMARY_DISTRIBUTION_CLOSED assert // Primary distribution is closed // modules/accounting.py:24 @@ -1522,15 +1522,15 @@ primary_distribution: box_len bury 1 assert // Invalid account holding address - // modules/transfer_agent.py:45 + // modules/transfer_agent.py:47 // self._assert_is_not_account_suspended(holding_address) swap callsub _assert_is_not_account_suspended - // modules/transfer_agent.py:46 + // modules/transfer_agent.py:48 // assert units > UInt64(0), err.ZERO_UNITS dup assert // Can not distribute zero units - // modules/transfer_agent.py:48 + // modules/transfer_agent.py:50 // self.reserved_units_total + units <= self.total_units intc_0 // 0 bytec 10 // "reserved_units_total" @@ -1542,19 +1542,19 @@ primary_distribution: app_global_get_ex assert // check self.total_units exists <= - // modules/transfer_agent.py:47-49 + // modules/transfer_agent.py:49-51 // assert ( // self.reserved_units_total + units <= self.total_units // ), err.OVER_DISTRIBUTION assert // Insufficient remaining D-ASA units - // modules/transfer_agent.py:50 + // modules/transfer_agent.py:52 // if self.initial_exchange_date: intc_0 // 0 bytec 26 // "initial_exchange_date" app_global_get_ex assert // check self.initial_exchange_date exists bz primary_distribution_after_if_else@3 - // modules/transfer_agent.py:52 + // modules/transfer_agent.py:54 // Global.latest_timestamp <= self.initial_exchange_date global LatestTimestamp intc_0 // 0 @@ -1562,7 +1562,7 @@ primary_distribution: app_global_get_ex assert // check self.initial_exchange_date exists <= - // modules/transfer_agent.py:51-53 + // modules/transfer_agent.py:53-55 // assert ( // Global.latest_timestamp <= self.initial_exchange_date // ), err.PRIMARY_DISTRIBUTION_CLOSED @@ -1584,7 +1584,7 @@ primary_distribution_after_if_else@3: pushint 40 swap box_replace - // modules/transfer_agent.py:56 + // modules/transfer_agent.py:58 // self.reserved_units_total += units intc_0 // 0 bytec 10 // "reserved_units_total" @@ -1594,7 +1594,7 @@ primary_distribution_after_if_else@3: bytec 10 // "reserved_units_total" dig 1 app_global_put - // modules/transfer_agent.py:57 + // modules/transfer_agent.py:59 // return self.total_units - self.reserved_units_total intc_0 // 0 bytec 13 // "total_units" @@ -1602,7 +1602,7 @@ primary_distribution_after_if_else@3: assert // check self.total_units exists swap - - // modules/transfer_agent.py:31 + // modules/transfer_agent.py:33 // @arc4.abimethod itob bytec_0 // 0x151f7c75 @@ -1617,7 +1617,7 @@ primary_distribution_after_if_else@3: transfer: intc_0 // 0 dup - // modules/transfer_agent.py:59 + // modules/transfer_agent.py:61 // @arc4.abimethod txna ApplicationArgs 1 dup @@ -1645,10 +1645,10 @@ transfer: app_global_get_ex assert // check self.status exists assert // D-ASA not configured - // modules/transfer_agent.py:73 + // modules/transfer_agent.py:75 // self._assert_is_not_asset_defaulted() callsub _assert_is_not_asset_defaulted - // modules/transfer_agent.py:74 + // modules/transfer_agent.py:76 // self._assert_is_not_asset_suspended() callsub _assert_is_not_asset_suspended // modules/kernel.py:135 @@ -1707,7 +1707,7 @@ transfer_after_if_else@3: assert // Transfer is closed transfer_after_if_else@5: - // modules/transfer_agent.py:78 + // modules/transfer_agent.py:80 // assert Txn.sender == sender_holding_address, err.UNAUTHORIZED txn Sender dig 4 @@ -1736,25 +1736,25 @@ transfer_after_if_else@5: box_len bury 1 assert // Invalid account holding address - // modules/transfer_agent.py:81 + // modules/transfer_agent.py:83 // self._assert_is_not_account_suspended(sender_holding_address) dig 2 callsub _assert_is_not_account_suspended - // modules/transfer_agent.py:82 + // modules/transfer_agent.py:84 // self._assert_is_not_account_suspended(receiver_holding_address) dup callsub _assert_is_not_account_suspended - // modules/transfer_agent.py:83 + // modules/transfer_agent.py:85 // assert sender_holding_address != receiver_holding_address, err.SELF_TRANSFER uncover 2 != assert // Sender and receiver must be different - // modules/transfer_agent.py:84 + // modules/transfer_agent.py:86 // assert units > UInt64(0), err.NULL_TRANSFER dig 1 dup assert // Transfer units must be greater than zero - // modules/transfer_agent.py:85 + // modules/transfer_agent.py:87 // assert units <= self.account[sender_holding_address].units, err.OVER_TRANSFER swap box_get @@ -1795,22 +1795,22 @@ transfer_after_if_else@5: assert // ACTUS event not yet executed transfer_after_inlined_modules.kernel.ActusKernelModule._assert_no_due_event_pending@10: - // modules/transfer_agent.py:88 + // modules/transfer_agent.py:90 // self._ensure_units_activated(sender_holding_address) dig 3 dup callsub _ensure_units_activated - // modules/transfer_agent.py:89 + // modules/transfer_agent.py:91 // self._ensure_units_activated(receiver_holding_address) dig 3 dup cover 2 callsub _ensure_units_activated - // modules/transfer_agent.py:90 + // modules/transfer_agent.py:92 // self._settle_position(sender_holding_address) callsub _settle_position popn 2 - // modules/transfer_agent.py:91 + // modules/transfer_agent.py:93 // self._settle_position(receiver_holding_address) callsub _settle_position popn 2 @@ -1851,7 +1851,7 @@ transfer_after_inlined_modules.kernel.ActusKernelModule._assert_no_due_event_pen intc_3 // 32 swap box_replace - // modules/transfer_agent.py:59 + // modules/transfer_agent.py:61 // @arc4.abimethod bytec_0 // 0x151f7c75 dig 2 diff --git a/smart_contracts/artifacts/d-asa/DASA.arc56.json b/smart_contracts/artifacts/d_asa/DASA.arc56.json similarity index 99% rename from smart_contracts/artifacts/d-asa/DASA.arc56.json rename to smart_contracts/artifacts/d_asa/DASA.arc56.json index 5afe63f6..29943434 100644 --- a/smart_contracts/artifacts/d-asa/DASA.arc56.json +++ b/smart_contracts/artifacts/d_asa/DASA.arc56.json @@ -2201,7 +2201,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCAzMgogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1ICJzdGF0dXMiICJldmVudF9jdXJzb3IiICJvdXRzdGFuZGluZ19wcmluY2lwYWwiICJzY2hlZHVsZV9lbnRyeV9jb3VudCIgImZpeGVkX3BvaW50X3NjYWxlIiAiYWNjcnVlZF9pbnRlcmVzdCIgImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMgIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIgInJlc2VydmVkX3VuaXRzX3RvdGFsIiAicmVzZXJ2ZWRfcHJpbmNpcGFsIiAiY29udHJhY3RfdHlwZSIgInRvdGFsX3VuaXRzIiAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIgInJlc2VydmVkX2ludGVyZXN0IiAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIgImN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IiAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMgInNldHRsZW1lbnRfYXNzZXRfaWQiICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIgMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMgMHg1MjIzNTA3MjY5NmQ2MTcyNzk0NDY1NjE2YzY1NzIyMyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMgMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzIDB4NTIyMzRmNzA0NDYxNjU2ZDZmNmUyMyAiaW5pdGlhbF9leGNoYW5nZV9kYXRlIiAidHJhbnNmZXJfb3BlbmluZ19kYXRlIiAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIiAicmF0ZV9yZXNldF9mbG9vciIgInJhdGVfcmVzZXRfY2FwIiAweDUzMjMgMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMyAiYXNzZXRfc3VzcGVuZGVkIiAiZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiIgInJhdGVfcmVzZXRfc3ByZWFkIiAicmF0ZV9yZXNldF9tdWx0aXBsaWVyIiAicmF0ZV9yZXNldF9uZXh0IiAiaGFzX3JhdGVfcmVzZXRfZmxvb3IiICJoYXNfcmF0ZV9yZXNldF9jYXAiIDB4MDAgImFzc2V0X2RlZmF1bHRlZCIgInByb3NwZWN0dXNfaGFzaCIgInByb3NwZWN0dXNfdXJsIiAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIiAibWF0dXJpdHlfZGF0ZSIgImRheV9jb3VudF9jb252ZW50aW9uIiAweDA2ODEwMQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4LTI5CiAgICAvLyAjIFJCQUMgUm9sZXMKICAgIC8vIHNlbGYuYXJyYW5nZXIgPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX0FSUkFOR0VSKQogICAgYnl0ZWMgMTggLy8gMHg1MjIzNDE3MjcyNjE2ZTY3NjU3MjIzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzAKICAgIC8vIHNlbGYub3BfZGFlbW9uID0gR2xvYmFsU3RhdGUoQWNjb3VudCgpLCBrZXk9Y3N0LlBSRUZJWF9JRF9PUF9EQUVNT04pCiAgICBieXRlYyAyNSAvLyAweDUyMjM0ZjcwNDQ2MTY1NmQ2ZjZlMjMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo0Ny00OAogICAgLy8gIyBELUFTQSBHb3Zlcm5hbmNlCiAgICAvLyBzZWxmLmFzc2V0X3N1c3BlbmRlZCA9IEZhbHNlCiAgICBieXRlYyAzMyAvLyAiYXNzZXRfc3VzcGVuZGVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NDkKICAgIC8vIHNlbGYuYXNzZXRfZGVmYXVsdGVkID0gRmFsc2UKICAgIGJ5dGVjIDQxIC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU2LTU3CiAgICAvLyAjIENvbnRyYWN0CiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU4CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMTIgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYwLTYxCiAgICAvLyAjIFByb3NwZWN0dXMgKEluZm9ybWF0aW9uYWwpCiAgICAvLyBzZWxmLnByb3NwZWN0dXNfaGFzaCA9IEJ5dGVzKCkKICAgIGJ5dGVjIDQyIC8vICJwcm9zcGVjdHVzX2hhc2giCiAgICBwdXNoYnl0ZXMgMHgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2MgogICAgLy8gc2VsZi5wcm9zcGVjdHVzX3VybCA9IFN0cmluZygpCiAgICBieXRlYyA0MyAvLyAicHJvc3BlY3R1c191cmwiCiAgICBwdXNoYnl0ZXMgIiIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2NC02NQogICAgLy8gIyBEZW5vbWluYXRpb24KICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gQXNzZXQoKQogICAgYnl0ZWMgNDQgLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjYKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCA9IEFzc2V0KCkKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2OC02OQogICAgLy8gIyBUaW1lCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgMjYgLy8gImluaXRpYWxfZXhjaGFuZ2VfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzAKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgNDUgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjcxCiAgICAvLyBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgMjcgLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzIKICAgIC8vIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlID0gdHlwLlRpbWVTdGFtcCgpCiAgICBieXRlYyAyOCAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3NC03NQogICAgLy8gIyBEYXkgQ291bnQgQ29udmVudGlvbgogICAgLy8gc2VsZi5kYXlfY291bnRfY29udmVudGlvbiA9IFVJbnQ2NCgpCiAgICBieXRlYyA0NiAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojc3LTc4CiAgICAvLyAjIFVuaXRzCiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzID0gVUludDY0KCkKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzkKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPSBVSW50NjQoKQogICAgYnl0ZWMgMTAgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MS04MgogICAgLy8gIyBQcmluY2lwYWwKICAgIC8vIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPSBVSW50NjQoKQogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MwogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBVSW50NjQoKQogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4NAogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gVUludDY0KCkKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4NQogICAgLy8gc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gRmFsc2UKICAgIGJ5dGVjIDM0IC8vICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4Ny04OAogICAgLy8gIyBJbnRlcmVzdAogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gVUludDY0KCkKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojg5CiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgPSBVSW50NjQoKQogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTEtOTIKICAgIC8vICMgSW50ZXJlc3QgUmF0ZXMKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTMKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQgPSBVSW50NjQoKQogICAgYnl0ZWMgMzUgLy8gInJhdGVfcmVzZXRfc3ByZWFkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NAogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIgPSBVSW50NjQoKQogICAgYnl0ZWMgMzYgLy8gInJhdGVfcmVzZXRfbXVsdGlwbGllciIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTUKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9mbG9vciA9IFVJbnQ2NCgpCiAgICBieXRlYyAyOSAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTYKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9jYXAgPSBVSW50NjQoKQogICAgYnl0ZWMgMzAgLy8gInJhdGVfcmVzZXRfY2FwIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NwogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X25leHQgPSBVSW50NjQoKQogICAgYnl0ZWMgMzcgLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTgKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgPSBGYWxzZQogICAgYnl0ZWMgMzggLy8gImhhc19yYXRlX3Jlc2V0X2Zsb29yIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5OQogICAgLy8gc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgPSBGYWxzZQogICAgYnl0ZWMgMzkgLy8gImhhc19yYXRlX3Jlc2V0X2NhcCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTAxLTEwMgogICAgLy8gIyBQcmltYXJ5IERpc3RyaWJ1dGlvbgogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgPSBVSW50NjQoKQogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTAzCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0ID0gVUludDY0KCkKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA1LTEwNgogICAgLy8gIyBDdW11bGF0aXZlIFBlci1Vbml0IEZpeGVkLVBvaW50IEluZGV4ZXMKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA3CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4ID0gVUludDY0KCkKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTE1CiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciA9IFVJbnQ2NCgpCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExNgogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA9IFVJbnQ2NCgpCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTE4LTExOQogICAgLy8gIyBTY2FsaW5nCiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlID0gVUludDY0KCkKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZC1hc2EvY29udHJhY3QucHk6MjMKICAgIC8vIGFzc2VydCBUeG4uZ2xvYmFsX251bV9ieXRlX3NsaWNlID09IGNmZy5HTE9CQUxfQllURVMsIGVyci5XUk9OR19HTE9CQUxfQllURVMKICAgIHR4biBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgQnl0ZXMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2QtYXNhL2NvbnRyYWN0LnB5OjI0CiAgICAvLyBhc3NlcnQgVHhuLmdsb2JhbF9udW1fdWludCA9PSBjZmcuR0xPQkFMX1VJTlRTLCBlcnIuV1JPTkdfR0xPQkFMX1VJTlRTCiAgICB0eG4gR2xvYmFsTnVtVWludAogICAgcHVzaGludCAzNwogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgVUludHMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2QtYXNhL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBhc3NlcnQgVHhuLmxvY2FsX251bV9ieXRlX3NsaWNlID09IGNmZy5MT0NBTF9CWVRFUywgZXJyLldST05HX0xPQ0FMX0JZVEVTCiAgICB0eG4gTG9jYWxOdW1CeXRlU2xpY2UKICAgICEKICAgIGFzc2VydCAvLyBXcm9uZyBMb2NhbCBCeXRlcyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvZC1hc2EvY29udHJhY3QucHk6MjYKICAgIC8vIGFzc2VydCBUeG4ubG9jYWxfbnVtX3VpbnQgPT0gY2ZnLkxPQ0FMX1VJTlRTLCBlcnIuV1JPTkdfTE9DQUxfVUlOVFMKICAgIHR4biBMb2NhbE51bVVpbnQKICAgICEKICAgIGFzc2VydCAvLyBXcm9uZyBMb2NhbCBVSW50cyBhbGxvY2F0aW9uCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kLWFzYS9jb250cmFjdC5weTo4LTE4CiAgICAvLyBjbGFzcyBEQVNBKAogICAgLy8gICAgIFBheW1lbnRBZ2VudCwKICAgIC8vICAgICBUcmFuc2ZlckFnZW50LAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gICAgIGF2bV92ZXJzaW9uPTEyLAogICAgLy8gKToKICAgIHB1c2hieXRlcyAweDkxNGYwNGViIC8vIG1ldGhvZCAiY29udHJhY3RfdXBkYXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9jb250cmFjdF91cGRhdGVfcm91dGVANAoKbWFpbl9zd2l0Y2hfY2FzZV9uZXh0QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZC1hc2EvY29udHJhY3QucHk6OC0xOAogICAgLy8gY2xhc3MgREFTQSgKICAgIC8vICAgICBQYXltZW50QWdlbnQsCiAgICAvLyAgICAgVHJhbnNmZXJBZ2VudCwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBhdm1fdmVyc2lvbj0xMiwKICAgIC8vICk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBieiBtYWluX2NyZWF0ZV9Ob09wQDMxCiAgICBwdXNoYnl0ZXNzIDB4YjQ0NjE4YzggMHhlNzgzMjUyOSAweDdlYTIwZTBiIDB4NmM4NWUzZWUgMHhiZGQxYTk0NCAweGRjMDYzYjM1IDB4MTRmYzEwZWYgMHg3NGE3Mjk3ZiAweDA5ZDRmZTE0IDB4OWE5YmZhODUgMHg4NWVlZDMzZCAweDkxODUxMDRhIDB4ZDlmMjI1YWMgMHg2ZTBlNWM5NSAweGZmM2ZkNGIzIDB4ODJmNzFiMmQgMHhlZjA0ZjVkMyAweGRmMzQzNTUwIDB4M2RiZTgwYmQgMHhkZjU0ZTgyYyAweDAxMGM4Mjk5IDB4NzQwNmFjZDIgMHgxYTcyYTJlZSAvLyBtZXRob2QgImZ1bmRfZHVlX2Nhc2hmbG93cyh1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJjbGFpbV9kdWVfY2FzaGZsb3dzKGFkZHJlc3MsYnl0ZVtdKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYnl0ZVtdKSIsIG1ldGhvZCAic2V0X3RyYW5zZmVyX3NjaGVkdWxlKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbihhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInRyYW5zZmVyKGFkZHJlc3MsYWRkcmVzcyx1aW50NjQpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X2dvdl9zdXNwZW5zaW9uKGFkZHJlc3MsYm9vbCl1aW50NjQiLCBtZXRob2QgImFjY291bnRfb3BlbihhZGRyZXNzLGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X3VwZGF0ZV9wYXltZW50X2FkZHJlc3MoYWRkcmVzcyxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAiYWNjb3VudF9nZXRfcG9zaXRpb24oYWRkcmVzcykoYWRkcmVzcyx1aW50NjQsdWludDY0LGJvb2wsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImNvbnRyYWN0X2NvbmZpZygodWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYm9vbCxib29sLGJvb2wsdWludDY0KSwodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpLChieXRlWzMyXSxzdHJpbmcpKXVpbnQ2NCIsIG1ldGhvZCAiY29udHJhY3Rfc2NoZWR1bGUodWludDY0LGJvb2wsKHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpW10pdWludDY0IiwgbWV0aG9kICJleGVjdXRlX2llZCgpdWludDY0IiwgbWV0aG9kICJhcHBseV9ub25fY2FzaF9ldmVudCh1aW50NjQsKHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSl1aW50NjQiLCBtZXRob2QgImdldF9jb250cmFjdF9zdGF0ZSgpKHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJnZXRfbmV4dF9kdWVfZXZlbnQoKSh1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAicmJhY19yb3RhdGVfYXJyYW5nZXIoYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgInJiYWNfc2V0X29wX2RhZW1vbihhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19hc3NpZ25fcm9sZSh1aW50OCxhZGRyZXNzLCh1aW50NjQsdWludDY0KSl1aW50NjQiLCBtZXRob2QgInJiYWNfcmV2b2tlX3JvbGUodWludDgsYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgInJiYWNfZ292X2Fzc2V0X3N1c3BlbnNpb24oYm9vbCl1aW50NjQiLCBtZXRob2QgInJiYWNfZ2V0X2FycmFuZ2VyKClhZGRyZXNzIiwgbWV0aG9kICJyYmFjX2dldF9hZGRyZXNzX3JvbGVzKGFkZHJlc3MpKGJvb2wsYm9vbCxib29sLGJvb2wsYm9vbCkiLCBtZXRob2QgInJiYWNfZ2V0X3JvbGVfdmFsaWRpdHkodWludDgsYWRkcmVzcykodWludDY0LHVpbnQ2NCkiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBmdW5kX2R1ZV9jYXNoZmxvd3MgY2xhaW1fZHVlX2Nhc2hmbG93cyBzZXRfdHJhbnNmZXJfc2NoZWR1bGUgcHJpbWFyeV9kaXN0cmlidXRpb24gdHJhbnNmZXIgYWNjb3VudF9nb3Zfc3VzcGVuc2lvbiBhY2NvdW50X29wZW4gYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzIGFjY291bnRfZ2V0X3Bvc2l0aW9uIGNvbnRyYWN0X2NvbmZpZyBjb250cmFjdF9zY2hlZHVsZSBleGVjdXRlX2llZCBhcHBseV9ub25fY2FzaF9ldmVudCBnZXRfY29udHJhY3Rfc3RhdGUgZ2V0X25leHRfZHVlX2V2ZW50IHJiYWNfcm90YXRlX2FycmFuZ2VyIHJiYWNfc2V0X29wX2RhZW1vbiByYmFjX2Fzc2lnbl9yb2xlIHJiYWNfcmV2b2tlX3JvbGUgcmJhY19nb3ZfYXNzZXRfc3VzcGVuc2lvbiByYmFjX2dldF9hcnJhbmdlciByYmFjX2dldF9hZGRyZXNzX3JvbGVzIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHkKICAgIGVycgoKbWFpbl9jcmVhdGVfTm9PcEAzMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kLWFzYS9jb250cmFjdC5weTo4LTE4CiAgICAvLyBjbGFzcyBEQVNBKAogICAgLy8gICAgIFBheW1lbnRBZ2VudCwKICAgIC8vICAgICBUcmFuc2ZlckFnZW50LAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gICAgIGF2bV92ZXJzaW9uPTEyLAogICAgLy8gKToKICAgIHB1c2hieXRlcyAweDk1NmQ3MTU2IC8vIG1ldGhvZCAiY29udHJhY3RfY3JlYXRlKGFkZHJlc3MpdWludDY0IgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggY29udHJhY3RfY3JlYXRlCiAgICBlcnIKCm1haW5fY29udHJhY3RfdXBkYXRlX3JvdXRlQDQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBwdXNoaW50IDQgLy8gVXBkYXRlQXBwbGljYXRpb24KICAgID09CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydAogICAgYiBjb250cmFjdF91cGRhdGUKCgovLyBtb2R1bGVzLnBheW1lbnRfYWdlbnQuUGF5bWVudEFnZW50LmZ1bmRfZHVlX2Nhc2hmbG93c1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmZ1bmRfZHVlX2Nhc2hmbG93czoKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gMTAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjUwCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo1MQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo1MgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNDcKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NTUKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NTYtNTcKICAgIC8vIGZ1bmRlZF9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgLy8gZnVuZGVkX3ByaW5jaXBhbCA9IFVJbnQ2NCgwKQogICAgZHVwbiAyCgpmdW5kX2R1ZV9jYXNoZmxvd3Nfd2hpbGVfdG9wQDI6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjAKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgPCBtYXhfZXZlbnRfY291bnQKICAgIGRpZyAyCiAgICBkaWcgNAogICAgPAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjYwLTYxCiAgICAvLyBwcm9jZXNzZWRfZXZlbnRzIDwgbWF4X2V2ZW50X2NvdW50CiAgICAvLyBhbmQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAOQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjYxCiAgICAvLyBhbmQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIDwKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2MC02MQogICAgLy8gcHJvY2Vzc2VkX2V2ZW50cyA8IG1heF9ldmVudF9jb3VudAogICAgLy8gYW5kIHNlbGYuZXZlbnRfY3Vyc29yIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudAogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDkKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2MwogICAgLy8gZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoc2VsZi5ldmVudF9jdXJzb3IpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgZHVwCiAgICBidXJ5IDE3CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjQKICAgIC8vIGlmIGVudHJ5LnNjaGVkdWxlZF90aW1lID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXA6CiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgNgogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPgogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl93aGlsZUA5CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjYKICAgIC8vIGlmIG5vdCBzZWxmLl9ldmVudF9pc19jYXNoKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkpOgogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBidXJ5IDE2CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozNTEKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgaW50Y18yIC8vIDgKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjM1MC0zNTQKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX01EKSwKICAgIC8vICkKICAgID09CiAgICBkdXAKICAgIGJ1cnkgNwogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX3RydWVANTAKICAgIGRpZyAxNAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzUyCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzUwLTM1NAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfTUQpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDUwCiAgICBkaWcgMTQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjM1MwogICAgLy8gVUludDY0KGVudW1zLkVWVF9NRCksCiAgICBwdXNoaW50IDE5CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozNTAtMzU0CiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9NRCksCiAgICAvLyApCiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VANTEKCmZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX3RydWVANTA6CiAgICBpbnRjXzEgLy8gMQoKZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfbWVyZ2VANTI6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjYKICAgIC8vIGlmIG5vdCBzZWxmLl9ldmVudF9pc19jYXNoKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkpOgogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDkKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU0OAogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X2lkID09IHNlbGYuZXZlbnRfY3Vyc29yLCBlcnIuSU5WQUxJRF9FVkVOVF9DVVJTT1IKICAgIGRpZyAxNQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBjdXJzb3IKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU0OQogICAgLy8gYXNzZXJ0IGVudHJ5LnNjaGVkdWxlZF90aW1lIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLCBlcnIuTk9fRFVFX0NBU0hGTE9XCiAgICBkaWcgNAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPD0KICAgIGFzc2VydCAvLyBObyBkdWUgY2FzaGZsb3cgdG8gcGF5CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0MTMKICAgIC8vIGlmIGV2ZW50X3R5cGUgbm90IGluIChVSW50NjQoZW51bXMuRVZUX0lQKSwgVUludDY0KGVudW1zLkVWVF9NRCkpOgogICAgZGlnIDUKICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxMwogICAgZGlnIDE0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDEzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0MTQKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDEzCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfaW50ZXJlc3RfYW1vdW50QDE0OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDI2CiAgICAvLyBldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBidXJ5IDE2CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0MjcKICAgIC8vIGlmIGV2ZW50X3R5cGUgbm90IGluIChVSW50NjQoZW51bXMuRVZUX1BSKSwgVUludDY0KGVudW1zLkVWVF9NRCkpOgogICAgcHVzaGludCAzCiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE3CiAgICBkaWcgMTQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTcKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQyOAogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnRAMjY6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1NTMKICAgIC8vIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGRpZyAxNQogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgMTAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU1NgogICAgLy8gaWYgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCk6CiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUAyNwogICAgZGlnIDkKICAgIGJ1cnkgMTEKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM2OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTcyLTU3NAogICAgLy8gIyBGdW5kaW5nIHVzZXMgcGVyLXVuaXQgY3VtdWxhdGl2ZSBpbmRpY2VzIHNvIGVhY2ggaG9sZGVyIGNhbiBzZXR0bGUKICAgIC8vICMgaW5kZXBlbmRlbnRseSBmcm9tIGl0cyBjdXJyZW50IHVuaXQgYmFsYW5jZS4KICAgIC8vIGludGVyZXN0X2luZGV4X2RlbHRhID0gc2VsZi5fYW1vdW50X3RvX2luZGV4X2RlbHRhKGludGVyZXN0X2Ftb3VudF9kdWUpCiAgICBkaWcgMTIKICAgIGNhbGxzdWIgX2Ftb3VudF90b19pbmRleF9kZWx0YQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTc1CiAgICAvLyBwcmluY2lwYWxfaW5kZXhfZGVsdGEgPSBzZWxmLl9hbW91bnRfdG9faW5kZXhfZGVsdGEocHJpbmNpcGFsX2Ftb3VudF9kdWUpCiAgICBkaWcgOAogICAgY2FsbHN1YiBfYW1vdW50X3RvX2luZGV4X2RlbHRhCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1NzYKICAgIC8vIGludGVyZXN0X2Ftb3VudCA9IHNlbGYuX2luZGV4X2RlbHRhX3RvX2Ftb3VudChpbnRlcmVzdF9pbmRleF9kZWx0YSkKICAgIGRpZyAxCiAgICBjYWxsc3ViIF9pbmRleF9kZWx0YV90b19hbW91bnQKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSAxNwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTc3CiAgICAvLyBwcmluY2lwYWxfYW1vdW50ID0gc2VsZi5faW5kZXhfZGVsdGFfdG9fYW1vdW50KHByaW5jaXBhbF9pbmRleF9kZWx0YSkKICAgIGR1cAogICAgY2FsbHN1YiBfaW5kZXhfZGVsdGFfdG9fYW1vdW50CiAgICBkdXAKICAgIGJ1cnkgMTMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU3OAogICAgLy8gcmVxdWlyZWRfYW1vdW50ID0gaW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudAogICAgZGlnIDIKICAgIGRpZyAxCiAgICArCiAgICBkdXAKICAgIGJ1cnkgMTIKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjcyNwogICAgLy8gYmFsYW5jZSA9IHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQ1NgogICAgLy8gcmV0dXJuIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgKyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIGRpZyAxCiAgICArCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3MjkKICAgIC8vIGFzc2VydCBiYWxhbmNlID49IHJlc2VydmVkX3RvdGFsLCBlcnIuTk9UX0VOT1VHSF9GVU5EUwogICAgZGlnIDIKICAgIGRpZyAxCiAgICA+PQogICAgYXNzZXJ0IC8vIE5vdCBlbm91Z2ggZnVuZHMgZm9yIHRoZSBwYXltZW50CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3MzAKICAgIC8vIHJldHVybiBiYWxhbmNlIC0gcmVzZXJ2ZWRfdG90YWwKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgLQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTgwCiAgICAvLyBzZWxmLl9hdmFpbGFibGVfc2V0dGxlbWVudF9mdW5kcygpID49IHJlcXVpcmVkX2Ftb3VudAogICAgdW5jb3ZlciAyCiAgICA+PQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTc5LTU4MQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLl9hdmFpbGFibGVfc2V0dGxlbWVudF9mdW5kcygpID49IHJlcXVpcmVkX2Ftb3VudAogICAgLy8gKSwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTgzCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0ICs9IGludGVyZXN0X2Ftb3VudAogICAgdW5jb3ZlciAzCiAgICArCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTg0CiAgICAvLyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCArPSBwcmluY2lwYWxfYW1vdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICArCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU4NQogICAgLy8gc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4ICs9IGludGVyZXN0X2luZGV4X2RlbHRhCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCBleGlzdHMKICAgIHVuY292ZXIgMgogICAgKwogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTg2CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4ICs9IHByaW5jaXBhbF9pbmRleF9kZWx0YQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCBleGlzdHMKICAgICsKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1ODcKICAgIC8vIGlmIGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkgPT0gVUludDY0KGVudW1zLkVWVF9QUik6CiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBwdXNoaW50IDMKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDM4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1ODgtNTg5CiAgICAvLyAjIEZvciBQUiwgdGhlIHBlcmlvZCBpbnRlcmVzdCBzdGF5cyBhY2NydWVkIHVudGlsIGEgbGF0ZXIgSVAgb3IgTUQuCiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgKz0gc2VsZi5fZW50cnlfaW50ZXJlc3Rfc2VnbWVudChlbnRyeSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBkaWcgMTYKICAgIGNhbGxzdWIgX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQKICAgIGJ1cnkgMTgKICAgICsKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzk6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1OTIKICAgIC8vIGlmIG5vdCBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKSBvciBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NCgKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlANDEKICAgIGRpZyAxNQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU5Mi01OTQKICAgIC8vIGlmIG5vdCBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKSBvciBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NCgKICAgIC8vICAgICBlbnVtcy5FVlRfTUQKICAgIC8vICk6CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDIKCmZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDQxOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTk1CiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBkaWcgMTUKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0MjoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU5NgogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgZGlnIDEwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTk3CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBuZXh0X2ludGVyZXN0X2Jhc2UKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBkaWcgMTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1OTgKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYwMAogICAgLy8gaWYgZW50cnkuZXZlbnRfdHlwZSA9PSBhcmM0LlVJbnQ4KAogICAgZGlnIDE1CiAgICBleHRyYWN0IDggMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjAwLTYwMgogICAgLy8gaWYgZW50cnkuZXZlbnRfdHlwZSA9PSBhcmM0LlVJbnQ4KAogICAgLy8gICAgIGVudW1zLkVWVF9NRAogICAgLy8gKSBhbmQgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPT0gVUludDY0KDApOgogICAgcHVzaGJ5dGVzIDB4MTMKICAgIGI9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYwMgogICAgLy8gKSBhbmQgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPT0gVUludDY0KDApOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2MDAtNjAyCiAgICAvLyBpZiBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoCiAgICAvLyAgICAgZW51bXMuRVZUX01ECiAgICAvLyApIGFuZCBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9PSBVSW50NjQoMCk6CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYwMwogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX0VOREVEKQogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgcHVzaGludCAyMDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2MDQKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDU6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2MDYtNjEwCiAgICAvLyBzZWxmLl9lbWl0X2V4ZWN1dGlvbl9ldmVudCgKICAgIC8vICAgICBlbnRyeT1lbnRyeSwKICAgIC8vICAgICBwYXlvZmY9aW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudCwKICAgIC8vICAgICBzZXR0bGVkX2Ftb3VudD1pbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50LAogICAgLy8gKQogICAgZGlnIDE1CiAgICBkaWcgNwogICAgZHVwCiAgICBjYWxsc3ViIF9lbWl0X2V4ZWN1dGlvbl9ldmVudAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzAKICAgIC8vIGZ1bmRlZF9pbnRlcmVzdCArPSBpbnRlcmVzdF9hbW91bnQKICAgIGRpZyAxCiAgICBkaWcgMTQKICAgICsKICAgIGJ1cnkgMgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjcxCiAgICAvLyBmdW5kZWRfcHJpbmNpcGFsICs9IHByaW5jaXBhbF9hbW91bnQKICAgIGR1cAogICAgZGlnIDkKICAgICsKICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjcyCiAgICAvLyBwcm9jZXNzZWRfZXZlbnRzICs9IFVJbnQ2NCgxKQogICAgZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDMKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX3doaWxlX3RvcEAyCgpmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDM4OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTkxCiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzkKCmZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDI3OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTU3CiAgICAvLyBldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBidXJ5IDE2CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1NTgtNTYwCiAgICAvLyAjIER5bmFtaWMgYW5udWl0aWVzIGRlcml2ZSBuZXh0IHN0YXRlIGZyb20gdGhlIHBheW1lbnQgZGVjb21wb3NpdGlvbiwKICAgIC8vICMgbm90IG9ubHkgZnJvbSB0aGUgcHJlY29tcHV0ZWQgYG5leHRfKmAgZmllbGRzLgogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1BSKToKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19lbHNlX2JvZHlAMjkKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU2MgogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgLSBwcmluY2lwYWxfYW1vdW50X2R1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBkaWcgOAogICAgLQogICAgZHVwCiAgICBidXJ5IDExCiAgICBidXJ5IDExCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDI5OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTY1CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9JUCk6CiAgICBkaWcgMTQKICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUAzMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTY2CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGJ1cnkgMTEKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU2NwogICAgLy8gbmV4dF9pbnRlcmVzdF9iYXNlID0gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBidXJ5IDEyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIGV4aXN0cwogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzNgoKZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUAzMToKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU2OAogICAgLy8gZWxpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfTUQpOgogICAgZGlnIDE0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDMyCiAgICBkaWcgOQogICAgYnVyeSAxMQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzNgoKZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlAMzI6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1NjkKICAgIC8vIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAxMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTcwCiAgICAvLyBuZXh0X2ludGVyZXN0X2Jhc2UgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDExCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNzoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQyOQogICAgLy8gaWYgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCk6CiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDI1CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0MzAKICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCk6CiAgICBkaWcgMTQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDMxCiAgICAvLyByZXR1cm4gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1NTIKICAgIC8vIHByaW5jaXBhbF9hbW91bnRfZHVlID0gc2VsZi5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudChlbnRyeSkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnRAMjYKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDIwOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDMyCiAgICAvLyBpbnRlcmVzdF9kdWUgPSBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgKyBzZWxmLl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KGVudHJ5KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgIGRpZyAxNgogICAgY2FsbHN1YiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudAogICAgYnVyeSAxOAogICAgKwogICAgZHVwCiAgICBidXJ5IDEzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0MzMKICAgIC8vIGlmIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA8PSBpbnRlcmVzdF9kdWU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiBleGlzdHMKICAgID49CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyMgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDM0CiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1NTIKICAgIC8vIHByaW5jaXBhbF9hbW91bnRfZHVlID0gc2VsZi5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudChlbnRyeSkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnRAMjYKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDIyOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDM1CiAgICAvLyBwcmluY2lwYWxfYW1vdW50ID0gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIC0gaW50ZXJlc3RfZHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiBleGlzdHMKICAgIGRpZyAxMgogICAgLQogICAgZHVwCiAgICBidXJ5IDEwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0MzYKICAgIC8vIGlmIHByaW5jaXBhbF9hbW91bnQgPiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgPgogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQzNwogICAgLy8gcmV0dXJuIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTUyCiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyNDoKICAgIGRpZyA4CiAgICBidXJ5IDgKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyNgoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjU6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0NDAKICAgIC8vIGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsIDw9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBkaWcgMTUKICAgIHB1c2hpbnQgNDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGR1cDIKICAgIDw9CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0MzktNDQxCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsIDw9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQ0MgogICAgLy8gcmV0dXJuIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIC0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIHN3YXAKICAgIC0KICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTUyCiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQxNQogICAgLy8gcmV0dXJuIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCArIHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZGlnIDE2CiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBidXJ5IDE4CiAgICArCiAgICBidXJ5IDEzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1NTEKICAgIC8vIGludGVyZXN0X2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9pbnRlcmVzdF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9pbnRlcmVzdF9hbW91bnRAMTQKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl93aGlsZUA5OgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojc0CiAgICAvLyBhc3NlcnQgcHJvY2Vzc2VkX2V2ZW50cyA+IFVJbnQ2NCgwKSwgZXJyLk5PX0RVRV9DQVNIRkxPVwogICAgZGlnIDIKICAgIGR1cAogICAgYXNzZXJ0IC8vIE5vIGR1ZSBjYXNoZmxvdyB0byBwYXkKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3OAogICAgLy8gdG90YWxfZnVuZGVkPWZ1bmRlZF9pbnRlcmVzdCArIGZ1bmRlZF9wcmluY2lwYWwsCiAgICBkaWcgMgogICAgZHVwCiAgICBkaWcgMwogICAgZHVwCiAgICBjb3ZlciAzCiAgICArCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODAKICAgIC8vIHRpbWVzdGFtcD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3NS04MQogICAgLy8gcmV0dXJuIHR5cC5DYXNoRnVuZGluZ1Jlc3VsdCgKICAgIC8vICAgICBmdW5kZWRfaW50ZXJlc3Q9ZnVuZGVkX2ludGVyZXN0LAogICAgLy8gICAgIGZ1bmRlZF9wcmluY2lwYWw9ZnVuZGVkX3ByaW5jaXBhbCwKICAgIC8vICAgICB0b3RhbF9mdW5kZWQ9ZnVuZGVkX2ludGVyZXN0ICsgZnVuZGVkX3ByaW5jaXBhbCwKICAgIC8vICAgICBwcm9jZXNzZWRfZXZlbnRzPXByb2Nlc3NlZF9ldmVudHMsCiAgICAvLyAgICAgdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUA1MToKICAgIGludGNfMCAvLyAwCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDUyCgoKLy8gbW9kdWxlcy5wYXltZW50X2FnZW50LlBheW1lbnRBZ2VudC5jbGFpbV9kdWVfY2FzaGZsb3dzW3JvdXRpbmddKCkgLT4gdm9pZDoKY2xhaW1fZHVlX2Nhc2hmbG93czoKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNAogICAgLy8gaWYgc2VsZi5vcF9kYWVtb24udmFsdWUgIT0gR2xvYmFsLnplcm9fYWRkcmVzczoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNSAvLyAweDUyMjM0ZjcwNDQ2MTY1NmQ2ZjZlMjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcF9kYWVtb24gZXhpc3RzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBieiBjbGFpbV9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTcKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNgogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI1IC8vIDB4NTIyMzRmNzA0NDYxNjU2ZDZmNmUyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wX2RhZW1vbiBleGlzdHMKICAgID09CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTYtMTgKICAgIC8vIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICAvLyBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgYm56IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDE0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTcKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNi0xOAogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICBibnogY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX3RydWVAMTQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxOAogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIHR4biBTZW5kZXIKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDMyCiAgICA9PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE2LTE4CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAxNQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX3RydWVAMTQ6CiAgICBpbnRjXzEgLy8gMQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDE2OgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE1LTE5CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vICAgICBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gICAgIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICAvLyApLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNzoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5NAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5NQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNDcKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6OTgKICAgIC8vIHNlbGYuX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQoaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDIKICAgIGR1cAogICAgY2FsbHN1YiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojk5CiAgICAvLyBzZWxmLl9zZXR0bGVfcG9zaXRpb24oaG9sZGluZ19hZGRyZXNzKQogICAgY2FsbHN1YiBfc2V0dGxlX3Bvc2l0aW9uCiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTcKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNsYWltYWJsZV9pbnRlcmVzdAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZHVwCiAgICBwdXNoaW50IDczCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBidXJ5IDgKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTgKICAgIC8vICsgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgZHVwCiAgICBwdXNoaW50IDgxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDgKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTctMTE4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jbGFpbWFibGVfaW50ZXJlc3QKICAgIC8vICsgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgdW5jb3ZlciAyCiAgICArCiAgICBkdXAKICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjEwMQogICAgLy8gYXNzZXJ0IHRvdGFsX2Ftb3VudCA+IFVJbnQ2NCgwKSwgZXJyLk5PX0RVRV9DQVNIRkxPVwogICAgYXNzZXJ0IC8vIE5vIGR1ZSBjYXNoZmxvdyB0byBwYXkKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLmlzX29wdGVkX2luKAogICAgZXh0cmFjdCAwIDMyCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MjUKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MjQtMjYKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5pc19vcHRlZF9pbigKICAgIC8vICAgICBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQKICAgIC8vICkKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MjQtMjcKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5pc19vcHRlZF9pbigKICAgIC8vICAgICBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQKICAgIC8vICkKICAgIC8vIGFuZCBub3Qgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkCiAgICBieiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VAMjQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNwogICAgLy8gYW5kIG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHB1c2hpbnQgMzg0CiAgICBnZXRiaXQKICAgIGJueiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VAMjQKICAgIGludGNfMSAvLyAxCgpjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfbWVyZ2VAMjU6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA2CiAgICAvLyBpZiBzZWxmLl9pc19wYXltZW50X2V4ZWN1dGFibGUoaG9sZGluZ19hZGRyZXNzKToKICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MzMKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICBzd2FwCiAgICBkaWcgMQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBvcHRlZCBpbnRvIGFzc2V0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MzMtMzQKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICAvLyA+PSBwYXltZW50X2Ftb3VudAogICAgZGlnIDUKICAgIGR1cAogICAgY292ZXIgMgogICAgPj0KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozMi0zNQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgLy8gICAgID49IHBheW1lbnRfYW1vdW50CiAgICAvLyApLCBlcnIuTk9UX0VOT1VHSF9GVU5EUwogICAgYXNzZXJ0IC8vIE5vdCBlbm91Z2ggZnVuZHMgZm9yIHRoZSBwYXltZW50CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA4CiAgICAvLyBzZWxmLl9wYXkoc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLCB0b3RhbF9hbW91bnQpCiAgICBkaWcgMgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZHVwCiAgICBleHRyYWN0IDAgMzIKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozOS00NAogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXJlY2VpdmVyLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1hbW91bnQsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0MwogICAgLy8gZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIGdsb2JhbCBNaW5UeG5GZWUKICAgIHVuY292ZXIgMwogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgc3dhcAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MzkKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozOS00NAogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXJlY2VpdmVyLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1hbW91bnQsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTI1LTEyNgogICAgLy8gIyBHZXQgdGhlIGNsYWltYWJsZSBhbW91bnRzIGJlZm9yZSByZXNldAogICAgLy8gaW50ZXJlc3RfYW1vdW50ID0gcG9zaXRpb24uY2xhaW1hYmxlX2ludGVyZXN0CiAgICBkdXAKICAgIHB1c2hpbnQgNzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgOQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEyNwogICAgLy8gcHJpbmNpcGFsX2Ftb3VudCA9IHBvc2l0aW9uLmNsYWltYWJsZV9wcmluY2lwYWwKICAgIGR1cAogICAgcHVzaGludCA4MQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMwogICAgYnVyeSA5CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTI5LTEzMAogICAgLy8gIyBSZXNldCB0aGUgcG9zaXRpb24ncyBjbGFpbWFibGUgYW1vdW50cwogICAgLy8gcG9zaXRpb24uY2xhaW1hYmxlX2ludGVyZXN0ID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgaXRvYgogICAgc3dhcAogICAgZGlnIDEKICAgIHJlcGxhY2UyIDczCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTMxCiAgICAvLyBwb3NpdGlvbi5jbGFpbWFibGVfcHJpbmNpcGFsID0gVUludDY0KDApCiAgICBzd2FwCiAgICByZXBsYWNlMiA4MQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzMgogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSBwb3NpdGlvbi5jb3B5KCkKICAgIHVuY292ZXIgMwogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzNAogICAgLy8gYXNzZXJ0IHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgPj0gaW50ZXJlc3RfYW1vdW50LCBlcnIuTk9UX0VOT1VHSF9GVU5EUwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCBleGlzdHMKICAgIGR1cAogICAgZGlnIDIKICAgID49CiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcyBmb3IgdGhlIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzUKICAgIC8vIGFzc2VydCBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCA+PSBwcmluY2lwYWxfYW1vdW50LCBlcnIuTk9UX0VOT1VHSF9GVU5EUwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIGV4aXN0cwogICAgZGlnIDMKICAgID49CiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcyBmb3IgdGhlIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzctMTM4CiAgICAvLyAjIFVwZGF0ZSB0aGUgZ2xvYmFsIHJlc2VydmVkIGludGVyZXN0IGFuZCBwcmluY2lwYWwgYW1vdW50cwogICAgLy8gc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCAtPSBpbnRlcmVzdF9hbW91bnQKICAgIHN3YXAKICAgIC0KICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTM5CiAgICAvLyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCAtPSBwcmluY2lwYWxfYW1vdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICBzd2FwCiAgICAtCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjExNAogICAgLy8gdG90YWxfYW1vdW50PWludGVyZXN0X2Ftb3VudCArIHByaW5jaXBhbF9hbW91bnQsCiAgICBkaWcgNQogICAgZHVwCiAgICBkaWcgNgogICAgZHVwCiAgICBjb3ZlciAzCiAgICArCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTE1CiAgICAvLyB0aW1lc3RhbXA9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTExLTExNwogICAgLy8gcmV0dXJuIHR5cC5DYXNoQ2xhaW1SZXN1bHQoCiAgICAvLyAgICAgaW50ZXJlc3RfYW1vdW50PWludGVyZXN0X2Ftb3VudCwKICAgIC8vICAgICBwcmluY2lwYWxfYW1vdW50PXByaW5jaXBhbF9hbW91bnQsCiAgICAvLyAgICAgdG90YWxfYW1vdW50PWludGVyZXN0X2Ftb3VudCArIHByaW5jaXBhbF9hbW91bnQsCiAgICAvLyAgICAgdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gICAgIGNvbnRleHQ9cGF5bWVudF9pbmZvLAogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZGlnIDIKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBwdXNoYnl0ZXMgMHgwMDIyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAyNDoKICAgIGludGNfMCAvLyAwCiAgICBiIGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUAyNQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX2ZhbHNlQDE1OgogICAgaW50Y18wIC8vIDAKICAgIGIgY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDE2CgoKLy8gbW9kdWxlcy50cmFuc2Zlcl9hZ2VudC5UcmFuc2ZlckFnZW50LnNldF90cmFuc2Zlcl9zY2hlZHVsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF90cmFuc2Zlcl9zY2hlZHVsZToKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToyNAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjI1CiAgICAvLyBhc3NlcnQgb3Blbl9kYXRlIDwgY2xvc3VyZV9kYXRlLCBlcnIuSU5WQUxJRF9TT1JUSU5HCiAgICBkdXAyCiAgICA8CiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbXVzdCBiZSBzb3J0ZWQgaW4gc3RyaWN0bHkgYXNjZW5kaW5nIG9yZGVyCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjI3CiAgICAvLyBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA9IG9wZW5fZGF0ZQogICAgYnl0ZWMgMjcgLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIHVuY292ZXIgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MjgKICAgIC8vIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlID0gY2xvc3VyZV9kYXRlCiAgICBieXRlYyAyOCAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MjkKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy50cmFuc2Zlcl9hZ2VudC5UcmFuc2ZlckFnZW50LnByaW1hcnlfZGlzdHJpYnV0aW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcHJpbWFyeV9kaXN0cmlidXRpb246CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjcxCiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5wcmltYXJ5X2RlYWxlciwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDIyIC8vIDB4NTIyMzUwNzI2OTZkNjE3Mjc5NDQ2NTYxNmM2NTcyMjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDEKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQyCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDMKICAgIC8vIGFzc2VydCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBSSU1BUllfRElTVFJJQlVUSU9OX0NMT1NFRAogICAgYXNzZXJ0IC8vIFByaW1hcnkgZGlzdHJpYnV0aW9uIGlzIGNsb3NlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgY292ZXIgMwogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo0NQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChob2xkaW5nX2FkZHJlc3MpCiAgICBzd2FwCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQ2CiAgICAvLyBhc3NlcnQgdW5pdHMgPiBVSW50NjQoMCksIGVyci5aRVJPX1VOSVRTCiAgICBkdXAKICAgIGFzc2VydCAvLyBDYW4gbm90IGRpc3RyaWJ1dGUgemVybyB1bml0cwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo0OAogICAgLy8gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCArIHVuaXRzIDw9IHNlbGYudG90YWxfdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICArCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgPD0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDctNDkKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCArIHVuaXRzIDw9IHNlbGYudG90YWxfdW5pdHMKICAgIC8vICksIGVyci5PVkVSX0RJU1RSSUJVVElPTgogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCByZW1haW5pbmcgRC1BU0EgdW5pdHMKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NTAKICAgIC8vIGlmIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI2IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlIGV4aXN0cwogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjUyCiAgICAvLyBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8PSBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI2IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlIGV4aXN0cwogICAgPD0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NTEtNTMKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPD0gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGUKICAgIC8vICksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TRUQKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBjbG9zZWQKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNDgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnJlc2VydmVkX3VuaXRzICs9IHVuaXRzCiAgICBkdXBuIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDMKICAgIGR1cAogICAgY292ZXIgMwogICAgKwogICAgaXRvYgogICAgcHVzaGludCA0MAogICAgc3dhcAogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NTYKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgKz0gdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICArCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NTcKICAgIC8vIHJldHVybiBzZWxmLnRvdGFsX3VuaXRzIC0gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIHN3YXAKICAgIC0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMudHJhbnNmZXJfYWdlbnQuVHJhbnNmZXJBZ2VudC50cmFuc2Zlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnRyYW5zZmVyOgogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo1OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NzMKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojc0CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE0NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTMKICAgIC8vIGlmIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI3IC8vICJ0cmFuc2Zlcl9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlIGV4aXN0cwogICAgYnogdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE1CiAgICAvLyBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI3IC8vICJ0cmFuc2Zlcl9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlIGV4aXN0cwogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPD0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTQtMTYKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICksIGVyci5DTE9TRURfVFJBTlNGRVIKICAgIGFzc2VydCAvLyBUcmFuc2ZlciBpcyBjbG9zZWQKCnRyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTcKICAgIC8vIGlmIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI4IC8vICJ0cmFuc2Zlcl9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgYnogdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE5CiAgICAvLyBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8IHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjggLy8gInRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICA8CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE4LTIwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDwgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGUKICAgIC8vICksIGVyci5DTE9TRURfVFJBTlNGRVIKICAgIGFzc2VydCAvLyBUcmFuc2ZlciBpcyBjbG9zZWQKCnRyYW5zZmVyX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NzgKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIGRpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgOAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIGRpZyA1CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDkKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODEKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQoc2VuZGVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjgyCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGR1cAogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4MwogICAgLy8gYXNzZXJ0IHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MgIT0gcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzLCBlcnIuU0VMRl9UUkFOU0ZFUgogICAgdW5jb3ZlciAyCiAgICAhPQogICAgYXNzZXJ0IC8vIFNlbmRlciBhbmQgcmVjZWl2ZXIgbXVzdCBiZSBkaWZmZXJlbnQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODQKICAgIC8vIGFzc2VydCB1bml0cyA+IFVJbnQ2NCgwKSwgZXJyLk5VTExfVFJBTlNGRVIKICAgIGRpZyAxCiAgICBkdXAKICAgIGFzc2VydCAvLyBUcmFuc2ZlciB1bml0cyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojg1CiAgICAvLyBhc3NlcnQgdW5pdHMgPD0gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLCBlcnIuT1ZFUl9UUkFOU0ZFUgogICAgc3dhcAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIDw9CiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IHNlbmRlciB1bml0cyB0byB0cmFuc2ZlcgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzU2CiAgICAvLyBpZiBzZWxmLmV2ZW50X2N1cnNvciA+PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICA+PQogICAgYm56IHRyYW5zZmVyX2FmdGVyX2lubGluZWRfbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Fzc2VydF9ub19kdWVfZXZlbnRfcGVuZGluZ0AxMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzU4CiAgICAvLyBuZXh0X2VudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KHNlbGYuZXZlbnRfY3Vyc29yKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojc2MAogICAgLy8gbmV4dF9lbnRyeS5zY2hlZHVsZWRfdGltZSA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3NTktNzYxCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIG5leHRfZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gKSwgZXJyLlBFTkRJTkdfQUNUVVNfRVZFTlQKICAgIGFzc2VydCAvLyBBQ1RVUyBldmVudCBub3QgeWV0IGV4ZWN1dGVkCgp0cmFuc2Zlcl9hZnRlcl9pbmxpbmVkX21vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9hc3NlcnRfbm9fZHVlX2V2ZW50X3BlbmRpbmdAMTA6CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojg4CiAgICAvLyBzZWxmLl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBkaWcgMwogICAgZHVwCiAgICBjYWxsc3ViIF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojg5CiAgICAvLyBzZWxmLl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGRpZyAzCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGNhbGxzdWIgX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6OTAKICAgIC8vIHNlbGYuX3NldHRsZV9wb3NpdGlvbihzZW5kZXJfaG9sZGluZ19hZGRyZXNzKQogICAgY2FsbHN1YiBfc2V0dGxlX3Bvc2l0aW9uCiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6OTEKICAgIC8vIHNlbGYuX3NldHRsZV9wb3NpdGlvbihyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBjYWxsc3ViIF9zZXR0bGVfcG9zaXRpb24KICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE1MgogICAgLy8gYXNzZXJ0IHVuaXRzIDw9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLCBlcnIuT1ZFUl9UUkFOU0ZFUgogICAgZGlnIDUKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGRpZyAxCiAgICA8PQogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCBzZW5kZXIgdW5pdHMgdG8gdHJhbnNmZXIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNTMKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzIC09IHVuaXRzCiAgICBkaWcgMQogICAgLQogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBpbnRjXzMgLy8gMzIKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNDQKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzICs9IHVuaXRzCiAgICBkaWcgNQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgdW5jb3ZlciAyCiAgICArCiAgICBpdG9iCiAgICBpbnRjXzMgLy8gMzIKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgZGlnIDIKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF9nb3Zfc3VzcGVuc2lvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfZ292X3N1c3BlbnNpb246CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTY1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo3NwogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYXV0aG9yaXR5LCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjEgLy8gMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTg1CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGR1cAogICAgcHVzaGludCA0OAogICAgaW50Y18xIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIHB1c2hpbnQgNDgKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTg2CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfb3Blbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfb3BlbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2OAogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjMgLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQ0ZDYxNmU2MTY3NjU3MjIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMzkKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0VOREVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDIwMAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTAKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX2VuZGVkKCksIGVyci5VTkFVVEhPUklaRUQKICAgICEKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxMQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTIKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjEzCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzQKICAgIC8vIHVuaXRzPVVJbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzItNDIKICAgIC8vIHJldHVybiB0eXAuQWNjb3VudFBvc2l0aW9uKAogICAgLy8gICAgIHBheW1lbnRfYWRkcmVzcz1wYXltZW50X2FkZHJlc3MsCiAgICAvLyAgICAgdW5pdHM9VUludDY0KDApLAogICAgLy8gICAgIHJlc2VydmVkX3VuaXRzPVVJbnQ2NCgwKSwKICAgIC8vICAgICBzdXNwZW5kZWQ9RmFsc2UsCiAgICAvLyAgICAgc2V0dGxlZF9jdXJzb3I9VUludDY0KDApLAogICAgLy8gICAgIGludGVyZXN0X2NoZWNrcG9pbnQ9VUludDY0KDApLAogICAgLy8gICAgIHByaW5jaXBhbF9jaGVja3BvaW50PVVJbnQ2NCgwKSwKICAgIC8vICAgICBjbGFpbWFibGVfaW50ZXJlc3Q9VUludDY0KDApLAogICAgLy8gICAgIGNsYWltYWJsZV9wcmluY2lwYWw9VUludDY0KDApLAogICAgLy8gKQogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBieXRlYyA0MCAvLyAweDAwCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxNAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSBzZWxmLl9uZXdfYWNjb3VudF9wb3NpdGlvbihwYXltZW50X2FkZHJlc3MpCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjE1CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzczoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMzgKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcywgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgdW5jb3ZlciAzCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjM5CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0MAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDEKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcyA9IHBheW1lbnRfYWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDIKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF9nZXRfcG9zaXRpb25bcm91dGluZ10oKSAtPiB2b2lkOgphY2NvdW50X2dldF9wb3NpdGlvbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNTkKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9jcmVhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9jcmVhdGU6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5ODAKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSBhcnJhbmdlcgogICAgYnl0ZWMgMTggLy8gMHg1MjIzNDE3MjcyNjE2ZTY3NjU3MjIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTgxCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojk2OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfY29uZmlnW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfY29uZmlnOgogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojk4MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGxlbgogICAgcHVzaGludCAxMDcKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuTm9ybWFsaXplZEFjdHVzVGVybXMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDcyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLkluaXRpYWxLZXJuZWxTdGF0ZQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIGxlbgogICAgZGlnIDEKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgdHVwbGUgZW5jb2RpbmcKICAgIGR1cAogICAgcHVzaGludCAzNAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHRhaWwgcG9pbnRlciBhdCBpbmRleCAxIG9mICh1aW50OFszMl0sKGxlbit1dGY4W10pKQogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBjb3ZlciAzCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAzNgogICAgKwogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5Qcm9zcGVjdHVzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDEyCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwMTQtMTAxNQogICAgLy8gIyBDb25maWd1cmUgQ29udHJhY3QKICAgIC8vIHNlbGYuY29udHJhY3RfdHlwZSA9IHRlcm1zLmNvbnRyYWN0X3R5cGUuYXNfdWludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ5dGVjIDEyIC8vICJjb250cmFjdF90eXBlIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICBieiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjIwCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfQU5OKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMjEKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgcHVzaGludCAyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMjIKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMjMKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgcHVzaGludCA0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMjQKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYnogY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAOAoKY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUA3OgogICAgaW50Y18xIC8vIDEKCmNvbnRyYWN0X2NvbmZpZ19ib29sX21lcmdlQDk6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMjkKICAgIC8vIGFzc2VydCBzZWxmLl9pc19zdXBwb3J0ZWRfY29udHJhY3RfdHlwZShjb250cmFjdF90eXBlKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDE3CiAgICAvLyBzZWxmLl9zdG9yZV9jb250cmFjdF9jb25maWcoc2VsZi5jb250cmFjdF90eXBlLCB0ZXJtcywgaW5pdGlhbF9zdGF0ZSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBidXJ5IDIKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozMjUKICAgIC8vIGFzc2VydCB0ZXJtcy5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBkaWcgNAogICAgZHVwCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDgKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMyNwogICAgLy8gdGVybXMuZGF5X2NvdW50X2NvbnZlbnRpb24uYXNfdWludDY0KCkKICAgIHB1c2hpbnQgNTcKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyOTctMzAzCiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgIGJ6IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGRpZyA2CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyOTkKICAgIC8vIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGRpZyA2CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozMDAKICAgIC8vIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICBwdXNoaW50IDIKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI5Ny0zMDMKICAgIC8vIHJldHVybiBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzYwKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwSVNEQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjApLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDE2CiAgICBkaWcgNgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzAxCiAgICAvLyBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyOTctMzAzCiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgID09CiAgICBibnogY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUAxNgogICAgZGlnIDYKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMwMgogICAgLy8gVUludDY0KGVudW1zLkRDQ18zMEUzNjApLAogICAgcHVzaGludCA0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyOTctMzAzCiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgID09CiAgICBieiBjb250cmFjdF9jb25maWdfYm9vbF9mYWxzZUAxNwoKY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUAxNjoKICAgIGludGNfMSAvLyAxCgpjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUAxODoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMwOS0zMTEKICAgIC8vIGFzc2VydCBzZWxmLl9pc19zdXBwb3J0ZWRfZGF5X2NvdW50X2NvbnZlbnRpb24oCiAgICAvLyAgICAgZGF5X2NvdW50X2NvbnZlbnRpb24KICAgIC8vICksIGVyci5JTlZBTElEX0RBWV9DT1VOVF9DT05WRU5USU9OCiAgICBhc3NlcnQgLy8gSW52YWxpZCBkYXktY291bnQgY29udmVudGlvbiBJRAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzI5CiAgICAvLyBpZiBjb250cmFjdF90eXBlICE9IFVJbnQ2NChlbnVtcy5DVF9BTk4pOgogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgIT0KICAgIGJ6IGNvbnRyYWN0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDIwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozMzAKICAgIC8vIGFzc2VydCBub3QgdGVybXMuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBkaWcgNAogICAgcHVzaGludCA3ODYKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgoKY29udHJhY3RfY29uZmlnX2FmdGVyX2lmX2Vsc2VAMjA6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MDAKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MDEKICAgIC8vIGFzc2VydCBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID09IFVJbnQ2NCgwKSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBELUFTQSBhbHJlYWR5IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjgwMy04MDQKICAgIC8vICMgU2V0IERlbm9taW5hdGlvbiBBc3NldAogICAgLy8gc2VsZi5fYXNzZXJ0X2Rlbm9taW5hdGlvbl9hc3NldCh0ZXJtcy5kZW5vbWluYXRpb25fYXNzZXRfaWQpCiAgICBkaWcgNAogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojc2OC03NjkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gZGVub21pbmF0aW9uIHdpdGggQVNBCiAgICAvLyBfY3JlYXRvciwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfY3JlYXRvcihkZW5vbWluYXRpb25fYXNzZXRfaWQpCiAgICBkdXAKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojc3MAogICAgLy8gYXNzZXJ0IGV4aXN0cywgZXJyLklOVkFMSURfREVOT01JTkFUSU9OCiAgICBhc3NlcnQgLy8gRGVub21pbmF0aW9uIGFzc2V0IGlzIG5vdCBwcm9wZXJseSBzZXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojc3MwogICAgLy8gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgPSBkZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIGJ5dGVjIDQ0IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjgwNy04MDgKICAgIC8vICMgU2V0IFNldHRsZW1lbnQgQXNzZXQKICAgIC8vIHNlbGYuX2Fzc2VydF9zZXR0bGVtZW50X2Fzc2V0KHRlcm1zLnNldHRsZW1lbnRfYXNzZXRfaWQpCiAgICBkaWcgMQogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Nzc4CiAgICAvLyBzZXR0bGVtZW50X2Fzc2V0X2lkID09IHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgPT0KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojc3Ni03NzkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzZXR0bGVtZW50IGFzc2V0IGlzIHRoZSBkZW5vbWluYXRpb24gYXNzZXQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgLy8gKSwgZXJyLklOVkFMSURfU0VUVExFTUVOVF9BU1NFVAogICAgYXNzZXJ0IC8vIERpZmZlcmVudCBzZXR0bGVtZW50IGFzc2V0IG5vdCBzdXBwb3J0ZWQsIG11c3QgYmUgZXF1YWwgdG8gZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3ODIKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCA9IHNldHRsZW1lbnRfYXNzZXRfaWQKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3ODMtNzg5CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3ODgKICAgIC8vIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3ODYKICAgIC8vIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Nzg3CiAgICAvLyBhc3NldF9hbW91bnQ9MCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3ODMtNzg0CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojc4My03ODkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gc2V0dGxlbWVudCB3aXRoIEFTQQogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PTAsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MTEtODEyCiAgICAvLyAjIFVuaXRzCiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzID0gdGVybXMudG90YWxfdW5pdHMKICAgIGR1cAogICAgcHVzaGludCAxNwogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MTMKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDEwIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODE1LTgxNgogICAgLy8gIyBEYXktQ291bnQgQ29udmVudGlvbnMKICAgIC8vIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPSB0ZXJtcy5kYXlfY291bnRfY29udmVudGlvbi5hc191aW50NjQoKQogICAgYnl0ZWMgNDYgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgZGlnIDgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MTgtODE5CiAgICAvLyAjIFRpbWUKICAgIC8vIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlID0gdGVybXMuaW5pdGlhbF9leGNoYW5nZV9kYXRlCiAgICBkdXAKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAyNiAvLyAiaW5pdGlhbF9leGNoYW5nZV9kYXRlIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MjAKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IHRlcm1zLm1hdHVyaXR5X2RhdGUKICAgIGRpZyAxCiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNDUgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjgyMQogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gaW5pdGlhbF9zdGF0ZS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBkaWcgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBwdXNoaW50IDQ4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODIzLTgyNAogICAgLy8gIyBQcmluY2lwYWwKICAgIC8vIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPSB0ZXJtcy5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudAogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgZGlnIDEwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODI1CiAgICAvLyBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSB0ZXJtcy5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBkaWcgMwogICAgcHVzaGludCA3ODYKICAgIGdldGJpdAogICAgYnl0ZWMgMzQgLy8gImR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODI2CiAgICAvLyBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9IGluaXRpYWxfc3RhdGUub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBkaWcgMQogICAgcHVzaGludCAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjXzMgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MjgtODI5CiAgICAvLyAjIEludGVyZXN0CiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgPSBpbml0aWFsX3N0YXRlLmFjY3J1ZWRfaW50ZXJlc3QKICAgIGRpZyAxCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MzEtODMyCiAgICAvLyAjIEludGVyZXN0IFJhdGUKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gaW5pdGlhbF9zdGF0ZS5ub21pbmFsX2ludGVyZXN0X3JhdGUKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODMzCiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBpbml0aWFsX3N0YXRlLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UKICAgIGRpZyAxCiAgICBwdXNoaW50IDI0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MzQKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQgPSB0ZXJtcy5yYXRlX3Jlc2V0X3NwcmVhZAogICAgZGlnIDMKICAgIHB1c2hpbnQgNTgKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzNSAvLyAicmF0ZV9yZXNldF9zcHJlYWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODM1CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciA9IHRlcm1zLnJhdGVfcmVzZXRfbXVsdGlwbGllcgogICAgZGlnIDMKICAgIHB1c2hpbnQgNjYKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzNiAvLyAicmF0ZV9yZXNldF9tdWx0aXBsaWVyIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjgzNgogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X2Zsb29yID0gdGVybXMucmF0ZV9yZXNldF9mbG9vcgogICAgZGlnIDMKICAgIHB1c2hpbnQgNzQKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAyOSAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MzcKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9jYXAgPSB0ZXJtcy5yYXRlX3Jlc2V0X2NhcAogICAgZGlnIDMKICAgIHB1c2hpbnQgODIKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzMCAvLyAicmF0ZV9yZXNldF9jYXAiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODM4CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfbmV4dCA9IHRlcm1zLnJhdGVfcmVzZXRfbmV4dAogICAgZGlnIDMKICAgIHB1c2hpbnQgOTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzNyAvLyAicmF0ZV9yZXNldF9uZXh0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjgzOQogICAgLy8gc2VsZi5oYXNfcmF0ZV9yZXNldF9mbG9vciA9IHRlcm1zLmhhc19yYXRlX3Jlc2V0X2Zsb29yCiAgICBkaWcgMwogICAgcHVzaGludCA3ODQKICAgIGdldGJpdAogICAgYnl0ZWMgMzggLy8gImhhc19yYXRlX3Jlc2V0X2Zsb29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojg0MAogICAgLy8gc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgPSB0ZXJtcy5oYXNfcmF0ZV9yZXNldF9jYXAKICAgIGRpZyAzCiAgICBwdXNoaW50IDc4NQogICAgZ2V0Yml0CiAgICBieXRlYyAzOSAvLyAiaGFzX3JhdGVfcmVzZXRfY2FwIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojg0Mi04NDMKICAgIC8vICMgU2NhbGluZwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSA9IHRlcm1zLmZpeGVkX3BvaW50X3NjYWxlCiAgICB1bmNvdmVyIDMKICAgIHB1c2hpbnQgOTkKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4NDUtODQ2CiAgICAvLyAjIFNjaGVkdWxlIFByb2Nlc3NpbmcKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yID0gaW5pdGlhbF9zdGF0ZS5ldmVudF9jdXJzb3IKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4NDgtODQ5CiAgICAvLyAjIFBlci1Vbml0IEZpeGVkLVBvaW50IEluZGV4ZXMKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCA9IGluaXRpYWxfc3RhdGUuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleAogICAgZGlnIDEKICAgIHB1c2hpbnQgNTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4NTAKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggPSBpbml0aWFsX3N0YXRlLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4CiAgICBkaWcgMQogICAgcHVzaGludCA2NAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4NTItODUzCiAgICAvLyAjIFJlc2VydmVkIEFtb3VudCAoZm9yIGV4ZWN1dGVkIGNhc2hmbG93cykKICAgIC8vIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODU0CiAgICAvLyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODU2CiAgICAvLyBhc3NlcnQgdGVybXMuaW5pdGlhbF9leGNoYW5nZV9kYXRlID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsIGVyci5JTlZBTElEX0lFRAogICAgZGlnIDIKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgID4KICAgIGFzc2VydCAvLyBJRUQgbXVzdCBiZSBzZXQgaW4gdGhlIGZ1dHVyZQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODU3CiAgICAvLyBhc3NlcnQgdGVybXMuaW5pdGlhbF9leGNoYW5nZV9kYXRlID4gaW5pdGlhbF9zdGF0ZS5zdGF0dXNfZGF0ZSwgZXJyLklOVkFMSURfSUVECiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICA8CiAgICBhc3NlcnQgLy8gSUVEIG11c3QgYmUgc2V0IGluIHRoZSBmdXR1cmUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojg1OAogICAgLy8gYXNzZXJ0IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA8IHRlcm1zLm1hdHVyaXR5X2RhdGUsIGVyci5JTlZBTElEX0lFRAogICAgPAogICAgYXNzZXJ0IC8vIElFRCBtdXN0IGJlIHNldCBpbiB0aGUgZnV0dXJlCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDE5LTEwMjAKICAgIC8vICMgTm90YXJpemUgcHJvc3BlY3R1cyAob3B0aW9uYWwpCiAgICAvLyBzZWxmLnByb3NwZWN0dXNfaGFzaCA9IHByb3NwZWN0dXMuaGFzaC5ieXRlcwogICAgZGlnIDIKICAgIGV4dHJhY3QgMCAzMgogICAgYnl0ZWMgNDIgLy8gInByb3NwZWN0dXNfaGFzaCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDIxCiAgICAvLyBzZWxmLnByb3NwZWN0dXNfdXJsID0gcHJvc3BlY3R1cy51cmwKICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgYnl0ZWMgNDMgLy8gInByb3NwZWN0dXNfdXJsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwMjIKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNvbnRyYWN0X2NvbmZpZ19ib29sX2ZhbHNlQDE3OgogICAgaW50Y18wIC8vIDAKICAgIGIgY29udHJhY3RfY29uZmlnX2Jvb2xfbWVyZ2VAMTgKCmNvbnRyYWN0X2NvbmZpZ19ib29sX2ZhbHNlQDg6CiAgICBpbnRjXzAgLy8gMAogICAgYiBjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUA5CgoKLy8gbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3Rfc2NoZWR1bGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9zY2hlZHVsZToKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gMwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTAyNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBzd2FwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgMwogICAgZHVwCiAgICBwdXNoaW50IDY1CiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIHVuY292ZXIgMgogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8c21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5FeGVjdXRpb25TY2hlZHVsZUVudHJ5PgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTAzOQogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDQyCiAgICAvLyBjb250cmFjdF90eXBlPXNlbGYuY29udHJhY3RfdHlwZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBjb3ZlciAzCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODc0CiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIEQtQVNBIGFscmVhZHkgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODc1LTg3NwogICAgLy8gYXNzZXJ0IHNjaGVkdWxlX3BhZ2UubGVuZ3RoIDw9IFVJbnQ2NCgKICAgIC8vICAgICBjc3QuU0NIRURVTEVfUEFHRV9TSVpFCiAgICAvLyApLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBkdXAKICAgIHB1c2hpbnQgMTYKICAgIDw9CiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4NzgKICAgIC8vIGFzc2VydCBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID4gVUludDY0KDApLCBlcnIuVEVSTVNfTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMCAvLyAiaW5pdGlhbF9leGNoYW5nZV9hbW91bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0EgdGVybXMgbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojg4MAogICAgLy8gcGFnZV9jdXJzb3IgPSBzY2hlZHVsZV9wYWdlX2luZGV4ICogVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpCiAgICBzd2FwCiAgICBwdXNoaW50IDE2CiAgICAqCiAgICBzd2FwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4ODcKICAgIC8vICsgcGFnZV9sZW5ndGggKiBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19QRVJfRU5UUllfQlVER0VUKQogICAgcHVzaGludCAxMDAKICAgICoKICAgIHB1c2hpbnQgMTUxMAogICAgKwoKY29udHJhY3Rfc2NoZWR1bGVfd2hpbGVfdG9wQDI6CiAgICBkdXAKICAgIGdsb2JhbCBPcGNvZGVCdWRnZXQKICAgID4KICAgIGJ6IGNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX3doaWxlQDUKICAgIGl0eG5fYmVnaW4KICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBwdXNoaW50IDUgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICBieXRlYyA0NyAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW0KICAgIGJ5dGVjIDQ3IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBiIGNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEAyCgpjb250cmFjdF9zY2hlZHVsZV9hZnRlcl93aGlsZUA1OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODkwCiAgICAvLyBpbmRleCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTAKCmNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEA2OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODkxCiAgICAvLyB3aGlsZSBpbmRleCA8IHBhZ2VfbGVuZ3RoOgogICAgZGlnIDkKICAgIGRpZyA0CiAgICA8CiAgICBieiBjb250cmFjdF9zY2hlZHVsZV9hZnRlcl93aGlsZUAxNQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODkyLTg5MwogICAgLy8gZW50cnkgPSBzY2hlZHVsZV9wYWdlW2luZGV4XS5jb3B5KCkKICAgIC8vIGVudHJ5X2V2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBkaWcgNAogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgYnVyeSAxMwogICAgZGlnIDEwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgNjUKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODkzCiAgICAvLyBlbnRyeV9ldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4OTItODkzCiAgICAvLyBlbnRyeSA9IHNjaGVkdWxlX3BhZ2VbaW5kZXhdLmNvcHkoKQogICAgLy8gZW50cnlfZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGludGNfMiAvLyA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4OTMKICAgIC8vIGVudHJ5X2V2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBnZXRieXRlCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgMTQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojg5NAogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X2lkID09IHBhZ2VfY3Vyc29yICsgaW5kZXgsIGVyci5JTlZBTElEX0VWRU5UX0lECiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEzCiAgICBkaWcgNQogICAgdW5jb3ZlciA0CiAgICArCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4OTUtODk3CiAgICAvLyBzZWxmLl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBlbnRyeV9ldmVudF90eXBlCiAgICAvLyApCiAgICBkaWcgNQogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODk4CiAgICAvLyBhc3NlcnQgZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgc3dhcAogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4OTkKICAgIC8vIGlmIGVudHJ5LmV2ZW50X2lkID4gVUludDY0KDApOgogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxMgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTAwCiAgICAvLyBpZiBpbmRleCA+IFVJbnQ2NCgwKToKICAgIGRpZyA5CiAgICBieiBjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlAMTAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjkwMQogICAgLy8gcHJldmlvdXNfZW50cnkgPSBzY2hlZHVsZV9wYWdlW2luZGV4IC0gVUludDY0KDEpXS5jb3B5KCkKICAgIGRpZyA5CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgcHVzaGludCA2NQogICAgKgogICAgZGlnIDEyCiAgICBzd2FwCiAgICBwdXNoaW50IDY1CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTE6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5MTYKICAgIC8vIHByZXZpb3VzX2VudHJ5LnNjaGVkdWxlZF90aW1lIDw9IGVudHJ5LnNjaGVkdWxlZF90aW1lCiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgOAogICAgPD0KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjkxNS05MTcKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgcHJldmlvdXNfZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gZW50cnkuc2NoZWR1bGVkX3RpbWUKICAgIC8vICksIGVyci5JTlZBTElEX1NPUlRJTkcKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBtdXN0IGJlIHNvcnRlZCBpbiBzdHJpY3RseSBhc2NlbmRpbmcgb3JkZXIKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTI6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5MTgKICAgIC8vIGlmIGVudHJ5LmV2ZW50X2lkID09IFVJbnQ2NCgwKToKICAgIGRpZyA4CiAgICBibnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxNAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTE5LTkyMQogICAgLy8gYXNzZXJ0IGVudHJ5X2V2ZW50X3R5cGUgPT0gVUludDY0KAogICAgLy8gICAgIGVudW1zLkVWVF9JRUQKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZGlnIDEwCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTQ6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5MjIKICAgIC8vIGluZGV4ICs9IFVJbnQ2NCgxKQogICAgZGlnIDkKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEwCiAgICBiIGNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEA2Cgpjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlAMTA6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5MDMtOTA1CiAgICAvLyAjIFRoZSBmaXJzdCBlbnRyeSBvZiBhIHBhZ2UgbXVzdCBzdGlsbCBiZSBvcmRlcmVkIGFmdGVyIHRoZQogICAgLy8gIyBsYXN0IGVudHJ5IG9mIHRoZSBwcmV2aW91cyBwYWdlLgogICAgLy8gYXNzZXJ0IHNjaGVkdWxlX3BhZ2VfaW5kZXggPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0VWRU5UX0lECiAgICBkaWcgNgogICAgZHVwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBpZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTA2CiAgICAvLyBwcmV2aW91c19wYWdlX2luZGV4ID0gc2NoZWR1bGVfcGFnZV9pbmRleCAtIFVJbnQ2NCgxKQogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjkwOAogICAgLy8gcHJldmlvdXNfcGFnZV9pbmRleCBpbiBzZWxmLnNjaGVkdWxlX3BhZ2UKICAgIGl0b2IKICAgIGJ5dGVjIDMxIC8vIDB4NTMyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTA3LTkwOQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBwcmV2aW91c19wYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZQogICAgLy8gKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTEwLTkxMQogICAgLy8gcHJldmlvdXNfcGFnZSA9IHNlbGYuc2NoZWR1bGVfcGFnZVtwcmV2aW91c19wYWdlX2luZGV4XS5jb3B5KCkKICAgIC8vIGFzc2VydCBwcmV2aW91c19wYWdlLmxlbmd0aCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGludCAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTExCiAgICAvLyBhc3NlcnQgcHJldmlvdXNfcGFnZS5sZW5ndGggPiBVSW50NjQoMCksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGR1cAogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTEzCiAgICAvLyBwcmV2aW91c19wYWdlLmxlbmd0aCAtIFVJbnQ2NCgxKQogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjkxMi05MTQKICAgIC8vIHByZXZpb3VzX2VudHJ5ID0gcHJldmlvdXNfcGFnZVsKICAgIC8vICAgICBwcmV2aW91c19wYWdlLmxlbmd0aCAtIFVJbnQ2NCgxKQogICAgLy8gXS5jb3B5KCkKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgMgogICAgKwogICAgcHVzaGludCA2NQogICAgYm94X2V4dHJhY3QKICAgIGIgY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxMQoKY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfd2hpbGVAMTU6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMDAKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHNjaGVkdWxlX3BhZ2UuY29weSgpCiAgICBkaWcgNgogICAgaXRvYgogICAgYnl0ZWMgMzEgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBkaWcgNQogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTI1CiAgICAvLyBpZiBpc19sYXN0X3BhZ2U6CiAgICBkaWcgNQogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxNwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTI3CiAgICAvLyBzY2hlZHVsZV9wYWdlX2luZGV4ICogVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpICsgcGFnZV9sZW5ndGgKICAgIGRpZyAxCiAgICBkaWcgNAogICAgKwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTI2CiAgICAvLyBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50ID0gKAogICAgYnl0ZWMgNCAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5MjYtOTI4CiAgICAvLyBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50ID0gKAogICAgLy8gICAgIHNjaGVkdWxlX3BhZ2VfaW5kZXggKiBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkgKyBwYWdlX2xlbmd0aAogICAgLy8gKQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjkyOQogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgcHVzaGludCA1MAogICAgYXBwX2dsb2JhbF9wdXQKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTc6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDQ3CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwMjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmV4ZWN1dGVfaWVkW3JvdXRpbmddKCkgLT4gdm9pZDoKZXhlY3V0ZV9pZWQ6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA1NwogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDU4CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA1OQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwNjEKICAgIC8vIGFzc2VydCBzZWxmLmV2ZW50X2N1cnNvciA8IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICBkaWcgMQogICAgPgogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgY3Vyc29yCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDYyCiAgICAvLyBlbnRyeSA9IHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLmV2ZW50X2N1cnNvcikKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA2MwogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X3R5cGUgPT0gYXJjNC5VSW50OChlbnVtcy5FVlRfSUVEKSwgZXJyLklOVkFMSURfRVZFTlRfVFlQRQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgZHVwCiAgICBwdXNoYnl0ZXMgMHgwMQogICAgYj09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCB0eXBlCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDY3CiAgICAvLyBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIGRpZyAxCiAgICBleHRyYWN0IDAgOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA2OQogICAgLy8gc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICBkaWcgMgogICAgZXh0cmFjdCA5IDgKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwNzAKICAgIC8vIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgZGlnIDMKICAgIGV4dHJhY3QgMTcgOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA3MQogICAgLy8gcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZGlnIDQKICAgIGV4dHJhY3QgMjUgOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA3MwogICAgLy8gbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9ZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBkaWcgNQogICAgZXh0cmFjdCAzMyA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDc0CiAgICAvLyBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICBkaWcgNgogICAgZXh0cmFjdCA0MSA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDc1CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1lbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIGRpZyA3CiAgICBleHRyYWN0IDQ5IDgKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwNzYKICAgIC8vIGZsYWdzPWVudHJ5LmZsYWdzLAogICAgZGlnIDgKICAgIGV4dHJhY3QgNTcgOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA2Ni0xMDc3CiAgICAvLyB0eXAuT2JzZXJ2ZWRFdmVudFJlcXVlc3QoCiAgICAvLyAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBvYnNlcnZlZF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1lbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9ZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9ZW50cnkuZmxhZ3MsCiAgICAvLyApLAogICAgdW5jb3ZlciA3CiAgICB1bmNvdmVyIDgKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA3MgogICAgLy8gb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA2Ni0xMDc3CiAgICAvLyB0eXAuT2JzZXJ2ZWRFdmVudFJlcXVlc3QoCiAgICAvLyAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBvYnNlcnZlZF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1lbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9ZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9ZW50cnkuZmxhZ3MsCiAgICAvLyApLAogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwNjQtMTA3OAogICAgLy8gc2VsZi5fYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkoCiAgICAvLyAgICAgZW50cnksCiAgICAvLyAgICAgdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0KAogICAgLy8gICAgICAgICBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIC8vICAgICAgICAgZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgLy8gICAgICAgICBzY2hlZHVsZWRfdGltZT1lbnRyeS5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICAgICAgYWNjcnVhbF9mYWN0b3I9ZW50cnkuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICAgICAgb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPWVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPWVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgICAgICBmbGFncz1lbnRyeS5mbGFncywKICAgIC8vICAgICApLAogICAgLy8gKQogICAgY2FsbHN1YiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkKICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA3OQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDQ5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5hcHBseV9ub25fY2FzaF9ldmVudFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFwcGx5X25vbl9jYXNoX2V2ZW50OgogICAgaW50Y18wIC8vIDAKICAgIGR1cG4gNAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwODEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwbiAyCiAgICBsZW4KICAgIHB1c2hpbnQgNzMKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuT2JzZXJ2ZWRFdmVudFJlcXVlc3QKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDk1CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA5NgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwOTgKICAgIC8vIGlmIHBheWxvYWQuZmxhZ3MgJiBVSW50NjQoZW51bXMuRkxBR19PQlNFUlZFRF9FVkVOVCk6CiAgICBwdXNoaW50IDY1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBwdXNoaW50IDQKICAgICYKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjMzCiAgICAvLyByZXR1cm4gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9DTE0pCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIHB1c2hpbnQgNQogICAgPT0KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwOTkKICAgIC8vIGFzc2VydCBzZWxmLl9zdXBwb3J0c19vYnNlcnZlZF9ldmVudHMoKSwgZXJyLk9CU0VSVkVEX0VWRU5UX1JFUVVJUkVECiAgICBhc3NlcnQgLy8gT2JzZXJ2ZWQgZXZlbnQgcmVxdWlyZWQgdG8gZXhlY3V0ZSB0aGlzIGFjdGlvbgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEwMAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMzMKICAgIC8vIHJldHVybiBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0NMTSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgZHVwCiAgICBwdXNoaW50IDUKICAgID09CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5MzgKICAgIC8vIGFzc2VydCBzZWxmLl9zdXBwb3J0c19vYnNlcnZlZF9ldmVudHMoKSwgZXJyLk9CU0VSVkVEX0VWRU5UX1JFUVVJUkVECiAgICBhc3NlcnQgLy8gT2JzZXJ2ZWQgZXZlbnQgcmVxdWlyZWQgdG8gZXhlY3V0ZSB0aGlzIGFjdGlvbgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTM5CiAgICAvLyBhc3NlcnQgcGF5bG9hZC5ldmVudF9pZCA9PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LCBlcnIuSU5WQUxJRF9FVkVOVF9JRAogICAgZGlnIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgNwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NDEKICAgIC8vIHNlbGYuY29udHJhY3RfdHlwZSwgcGF5bG9hZC5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBkdXAKICAgIGV4dHJhY3QgOCAxCiAgICBidXJ5IDEyCiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTQwLTk0MgogICAgLy8gc2VsZi5fYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgc2VsZi5jb250cmFjdF90eXBlLCBwYXlsb2FkLmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIC8vICkKICAgIGNhbGxzdWIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NDQKICAgIC8vIHBhZ2VfaW5kZXggPSBzZWxmLl9zY2hlZHVsZV9wYWdlX2luZGV4KHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxOTAKICAgIC8vIHJldHVybiBldmVudF9pZCAvLyBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkKICAgIHB1c2hpbnQgMTYKICAgIC8KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojk0NQogICAgLy8gcGFnZSA9IHR5cC5FeGVjdXRpb25TY2hlZHVsZVBhZ2UoKQogICAgcHVzaGJ5dGVzIDB4MDAwMAogICAgYnVyeSA3CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NDYKICAgIC8vIGlmIHBhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlOgogICAgaXRvYgogICAgYnl0ZWMgMzEgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA5CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMjcKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojk0NwogICAgLy8gcGFnZSA9IHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XS5jb3B5KCkKICAgIGRpZyA3CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidXJ5IDcKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX3BhZ2UgZW50cnkgZXhpc3RzCgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDI3OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTQ4CiAgICAvLyBhc3NlcnQgcGFnZS5sZW5ndGggPCBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGRpZyA1CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgMTYKICAgIDwKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojk1MwogICAgLy8gc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIGRpZyAzCiAgICBkdXAKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NTQKICAgIC8vIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICBkaWcgMQogICAgZXh0cmFjdCAxNyA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NTUKICAgIC8vIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZGlnIDIKICAgIGV4dHJhY3QgMjUgOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTU2CiAgICAvLyBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDMKICAgIGV4dHJhY3QgNDEgOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTU3CiAgICAvLyBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIGRpZyA0CiAgICBleHRyYWN0IDQ5IDgKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojk1OAogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIHVuY292ZXIgNQogICAgZXh0cmFjdCA1NyA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NTAtOTYwCiAgICAvLyB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1wYXlsb2FkLmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9cGF5bG9hZC5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPXBheWxvYWQucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXBheWxvYWQubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICkKICAgIGRpZyAxMQogICAgaXRvYgogICAgZGlnIDE4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMwogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NDktOTYxCiAgICAvLyBwYWdlLmFwcGVuZCgKICAgIC8vICAgICB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9cGF5bG9hZC5ldmVudF9pZCwKICAgIC8vICAgICAgICAgZXZlbnRfdHlwZT1wYXlsb2FkLmV2ZW50X3R5cGUsCiAgICAvLyAgICAgICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIC8vICAgICAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICAgICApCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NjIKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHBhZ2UuY29weSgpCiAgICBkaWcgOAogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojk2MwogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTAzCiAgICAvLyBhc3NlcnQgZXZlbnRfaWQgPT0gc2VsZi5ldmVudF9jdXJzb3IsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBjdXJzb3IKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExMDQKICAgIC8vIGVudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KGV2ZW50X2lkKQogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEwNgogICAgLy8gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgYnVyeSAxMAogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozNjQKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzY1CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzYzLTM3MAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjM2NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9SUiksCiAgICBwdXNoaW50IDEyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzY3CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICBwdXNoaW50IDExCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzY4CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgcHVzaGludCAxOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzYzLTM3MAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjM2OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBieiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX2ZhbHNlQDE2CgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX3RydWVAMTU6CiAgICBpbnRjXzEgLy8gMQoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9tZXJnZUAxNzoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExMDUtMTEwNwogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2lzX25vbl9jYXNoKAogICAgLy8gICAgIGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIC8vICksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IHR5cGUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExMDgKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlICE9IGFyYzQuVUludDgoZW51bXMuRVZUX0lFRCksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGRpZyA4CiAgICBwdXNoYnl0ZXMgMHgwMQogICAgYiE9CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCB0eXBlCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozNzQKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluIChVSW50NjQoZW51bXMuRVZUX1JSKSwgVUludDY0KGVudW1zLkVWVF9SUkYpKQogICAgZGlnIDQKICAgIHB1c2hpbnQgMTIKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDIxCiAgICBkaWcgNAogICAgcHVzaGludCAxMQogICAgPT0KICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfZmFsc2VAMjIKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAyMToKICAgIGludGNfMSAvLyAxCgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX21lcmdlQDIzOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEwOQogICAgLy8gaWYgc2VsZi5fZXZlbnRfaXNfcmF0ZV9yZXNldChlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpKToKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Vsc2VfYm9keUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODAKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLm9ic2VydmVyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjQgLy8gMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTEzCiAgICAvLyBzZWxmLl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeShlbnRyeSwgcGF5bG9hZCkKICAgIGRpZyA2CiAgICBkaWcgMgogICAgY2FsbHN1YiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkKICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTExNAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDgxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Vsc2VfYm9keUA1OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTExMgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICBiIGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VANgoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9mYWxzZUAyMjoKICAgIGludGNfMCAvLyAwCiAgICBiIGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfbWVyZ2VAMjMKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfZmFsc2VAMTY6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX21lcmdlQDE3CgoKLy8gbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuZ2V0X2NvbnRyYWN0X3N0YXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2NvbnRyYWN0X3N0YXRlOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBkdXAKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEyMQogICAgLy8gY29udHJhY3RfdHlwZT1hcmM0LlVJbnQ4KHNlbGYuY29udHJhY3RfdHlwZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzIgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExMjMKICAgIC8vIHRvdGFsX3VuaXRzPXNlbGYudG90YWxfdW5pdHMsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEyNAogICAgLy8gcmVzZXJ2ZWRfdW5pdHNfdG90YWw9c2VsZi5yZXNlcnZlZF91bml0c190b3RhbCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTI1CiAgICAvLyBpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudD1zZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExMjYKICAgIC8vIGV2ZW50X2N1cnNvcj1zZWxmLmV2ZW50X2N1cnNvciwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEyNwogICAgLy8gc2NoZWR1bGVfZW50cnlfY291bnQ9c2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExMjgKICAgIC8vIG91dHN0YW5kaW5nX3ByaW5jaXBhbD1zZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEyOQogICAgLy8gaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZT1zZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEzMAogICAgLy8gbm9taW5hbF9pbnRlcmVzdF9yYXRlPXNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTMxCiAgICAvLyBhY2NydWVkX2ludGVyZXN0PXNlbGYuYWNjcnVlZF9pbnRlcmVzdCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTMyCiAgICAvLyBjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4PXNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEzMwogICAgLy8gY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXg9c2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTM0CiAgICAvLyByZXNlcnZlZF9pbnRlcmVzdD1zZWxmLnJlc2VydmVkX2ludGVyZXN0LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExMzUKICAgIC8vIHJlc2VydmVkX3ByaW5jaXBhbD1zZWxmLnJlc2VydmVkX3ByaW5jaXBhbCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExMjAtMTEzNgogICAgLy8gcmV0dXJuIHR5cC5LZXJuZWxTdGF0ZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlPWFyYzQuVUludDgoc2VsZi5jb250cmFjdF90eXBlKSwKICAgIC8vICAgICBzdGF0dXM9c2VsZi5zdGF0dXMsCiAgICAvLyAgICAgdG90YWxfdW5pdHM9c2VsZi50b3RhbF91bml0cywKICAgIC8vICAgICByZXNlcnZlZF91bml0c190b3RhbD1zZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsLAogICAgLy8gICAgIGluaXRpYWxfZXhjaGFuZ2VfYW1vdW50PXNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQsCiAgICAvLyAgICAgZXZlbnRfY3Vyc29yPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgLy8gICAgIHNjaGVkdWxlX2VudHJ5X2NvdW50PXNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQsCiAgICAvLyAgICAgb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2U9c2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlLAogICAgLy8gICAgIG5vbWluYWxfaW50ZXJlc3RfcmF0ZT1zZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBhY2NydWVkX2ludGVyZXN0PXNlbGYuYWNjcnVlZF9pbnRlcmVzdCwKICAgIC8vICAgICBjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4PXNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCwKICAgIC8vICAgICBjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleD1zZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4LAogICAgLy8gICAgIHJlc2VydmVkX2ludGVyZXN0PXNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QsCiAgICAvLyAgICAgcmVzZXJ2ZWRfcHJpbmNpcGFsPXNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsLAogICAgLy8gKQogICAgdW5jb3ZlciAxNAogICAgaXRvYgogICAgdW5jb3ZlciAxNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDEzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDEwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgOQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDgKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTE2CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5nZXRfbmV4dF9kdWVfZXZlbnRbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfbmV4dF9kdWVfZXZlbnQ6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTE0MgogICAgLy8gaWYgc2VsZi5ldmVudF9jdXJzb3IgPj0gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgPj0KICAgIGJ6IGdldF9uZXh0X2R1ZV9ldmVudF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExNDQKICAgIC8vIGV2ZW50X2lkPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTQzLTExNTMKICAgIC8vIHJldHVybiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1zZWxmLmV2ZW50X2N1cnNvciwKICAgIC8vICAgICBldmVudF90eXBlPWFyYzQuVUludDgoMCksCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9VUludDY0KDApLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9VUludDY0KDApLAogICAgLy8gICAgIGZsYWdzPVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGl0b2IKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExNDUKICAgIC8vIGV2ZW50X3R5cGU9YXJjNC5VSW50OCgwKSwKICAgIGJ5dGVjIDQwIC8vIDB4MDAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExNDMtMTE1MwogICAgLy8gcmV0dXJuIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgIGV2ZW50X2lkPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgLy8gICAgIGV2ZW50X3R5cGU9YXJjNC5VSW50OCgwKSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1VSW50NjQoMCksCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1VSW50NjQoMCksCiAgICAvLyAgICAgZmxhZ3M9VUludDY0KDApLAogICAgLy8gKQogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTQ2CiAgICAvLyBzY2hlZHVsZWRfdGltZT1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTE0My0xMTUzCiAgICAvLyByZXR1cm4gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkoCiAgICAvLyAgICAgZXZlbnRfaWQ9c2VsZi5ldmVudF9jdXJzb3IsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1hcmM0LlVJbnQ4KDApLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPVVJbnQ2NCgwKSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249VUludDY0KDApLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPVVJbnQ2NCgwKSwKICAgIC8vICAgICBmbGFncz1VSW50NjQoMCksCiAgICAvLyApCiAgICBpdG9iCiAgICBzd2FwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKCmdldF9uZXh0X2R1ZV9ldmVudF9hZnRlcl9pbmxpbmVkX21vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmdldF9uZXh0X2R1ZV9ldmVudEA0OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEzOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpnZXRfbmV4dF9kdWVfZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTE1NAogICAgLy8gcmV0dXJuIHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLmV2ZW50X2N1cnNvcikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgZ2V0X25leHRfZHVlX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuZ2V0X25leHRfZHVlX2V2ZW50QDQKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5jb250cmFjdF91cGRhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF91cGRhdGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTUzLTE1NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGdyYW50cyB0aGUgdXBkYXRlIHBlcm1pc3Npb25zIHRvIHRoZSBBcnJhbmdlci4KICAgIC8vICMg4pqg77iPIFdBUk5JTkc6IEFwcGxpY2F0aW9uIHVwZGF0ZXMgbXVzdCBiZSBleGVjdXRlZCBWRVJZIGNhcmVmdWxseSwgYXMgdGhleQogICAgLy8gIyBtaWdodCBpbnRyb2R1Y2UgYnJlYWtpbmcgY2hhbmdlcy4KICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfcm90YXRlX2FycmFuZ2VyW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19yb3RhdGVfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2OQogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTcwCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gbmV3X2FycmFuZ2VyCiAgICBieXRlYyAxOCAvLyAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTcxCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfc2V0X29wX2RhZW1vbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfc2V0X29wX2RhZW1vbjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTg0CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODUKICAgIC8vIHNlbGYub3BfZGFlbW9uLnZhbHVlID0gYWRkcmVzcwogICAgYnl0ZWMgMjUgLy8gMHg1MjIzNGY3MDQ0NjE2NTZkNmY2ZTIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4NgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTczCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2Fzc2lnbl9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19hc3NpZ25fcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDE2CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLlJvbGVWYWxpZGl0eQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjExCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMgogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgcHVzaGludCAyMAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTAzCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gcm9sZV9hZGRyZXNzCiAgICBieXRlYyAxOCAvLyAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMKICAgIGRpZyAzCiAgICBhcHBfZ2xvYmFsX3B1dAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTQKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDYKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIGR1cAogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnRfbWFuYWdlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMyAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwOAogICAgLy8gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMiAvLyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTIKICAgIC8vIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIGR1cAogICAgcHVzaGludCA2MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE1CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMzIgLy8gMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE2CiAgICAvLyBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExOAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMSAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIwCiAgICAvLyBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMwogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgODAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIzCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI0IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI0CiAgICAvLyBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3Jldm9rZV9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19yZXZva2Vfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzUKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzNgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzcKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCkpCiAgICBidG9pCiAgICBkdXBuIDIKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCAhPSBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksIGVyci5JTlZBTElEX1JPTEUKICAgIGR1cAogICAgcHVzaGludCAyMAogICAgIT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyOAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIzIC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0NGQ2MTZlNjE2NzY1NzIyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMwCiAgICAvLyBkZWwgc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzOQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjE2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIyIC8vIDB4NTIyMzUwNzI2OTZkNjE3Mjc5NDQ2NTYxNmM2NTcyMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNAogICAgLy8gZGVsIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjM4CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIGR1cAogICAgcHVzaGludCA2MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAzMiAvLyAweDUyMjM1NDcyNzU3Mzc0NjU2NTIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzgKICAgIC8vIGRlbCBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjM4CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDEKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hdXRob3JpdHksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjEgLy8gMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MgogICAgLy8gZGVsIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzOAogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDQKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDgwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI0IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ2CiAgICAvLyBkZWwgc2VsZi5vYnNlcnZlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ292X2Fzc2V0X3N1c3BlbnNpb25bcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dvdl9hc3NldF9zdXNwZW5zaW9uOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kICAjIFRPRE86IFVwZGF0ZSBzcGVjcyBhbmQgYWRkIHRlc3QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzcKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDIxIC8vIDB4NTIyMzQxNzU3NDY4NmY3MjY5NzQ3OTIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU3CiAgICAvLyBzZWxmLmFzc2V0X3N1c3BlbmRlZCA9IHN1c3BlbmRlZAogICAgYnl0ZWMgMzMgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU4CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCAgIyBUT0RPOiBVcGRhdGUgc3BlY3MgYW5kIGFkZCB0ZXN0CiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYXJyYW5nZXJbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNjgKICAgIC8vIHJldHVybiBzZWxmLmFycmFuZ2VyLnZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTggLy8gMHg1MjIzNDE3MjcyNjE2ZTY3NjU3MjIzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJyYW5nZXIgZXhpc3RzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjYwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9hZGRyZXNzX3JvbGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfYWRkcmVzc19yb2xlczoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg0CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmFjY291bnRfbWFuYWdlciwgYWRkcmVzcyksCiAgICBieXRlYyAyMyAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMKICAgIGRpZyAxCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4NQogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5wcmltYXJ5X2RlYWxlciwgYWRkcmVzcyksCiAgICBieXRlYyAyMiAvLyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzCiAgICBkaWcgMgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODYKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYudHJ1c3RlZSwgYWRkcmVzcyksCiAgICBieXRlYyAzMiAvLyAweDUyMjM1NDcyNzU3Mzc0NjU2NTIzCiAgICBkaWcgMwogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODcKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYXV0aG9yaXR5LCBhZGRyZXNzKSwKICAgIGJ5dGVjIDIxIC8vIDB4NTIyMzQxNzU3NDY4NmY3MjY5NzQ3OTIzCiAgICBkaWcgNAogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODgKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYub2JzZXJ2ZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjQgLy8gMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzCiAgICB1bmNvdmVyIDUKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjcwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjIDQwIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDYKICAgIHNldGJpdAogICAgaW50Y18xIC8vIDEKICAgIHVuY292ZXIgNQogICAgc2V0Yml0CiAgICBwdXNoaW50IDIKICAgIHVuY292ZXIgNAogICAgc2V0Yml0CiAgICBwdXNoaW50IDMKICAgIHVuY292ZXIgMwogICAgc2V0Yml0CiAgICBwdXNoaW50IDQKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA1CiAgICAvLyByb2xlID0gcm9sZV9pZC5hc191aW50NjQoKQogICAgYnRvaQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwNgogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZSkKICAgIGR1cAogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDgKICAgIC8vIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgcHVzaGludHMgMjAgNDAgNTAgNjAgNzAgODAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDctMzM4CiAgICAvLyBtYXRjaCByb2xlOgogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgLy8gICAgICAgICByZXR1cm4gdHlwLlJvbGVWYWxpZGl0eSgKICAgIC8vICAgICAgICAgICAgIHJvbGVfdmFsaWRpdHlfc3RhcnQ9VUludDY0KDApLCByb2xlX3ZhbGlkaXR5X2VuZD1VSW50NjQoMCkKICAgIC8vICAgICAgICAgKQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5hdXRob3JpdHksIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5vYnNlcnZlciwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5vYnNlcnZlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBfOgogICAgLy8gICAgICAgICBvcC5lcnIoZXJyLklOVkFMSURfUk9MRSkKICAgIHVuY292ZXIgNgogICAgbWF0Y2ggcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8wQDIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8xQDMgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8yQDQgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8zQDUgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV80QDYgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV81QDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzgKICAgIC8vIG9wLmVycihlcnIuSU5WQUxJRF9ST0xFKQogICAgZXJyIC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzVANzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzQKICAgIC8vIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMjQgLy8gMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzMzLTMzNQogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMzNgogICAgLy8gcmV0dXJuIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzRANjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjkKICAgIC8vIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDIxIC8vIDB4NTIyMzQxNzU3NDY4NmY3MjY5NzQ3OTIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI4LTMzMAogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzEKICAgIC8vIHJldHVybiBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzNANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjQKICAgIC8vIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAzMiAvLyAweDUyMjM1NDcyNzU3Mzc0NjU2NTIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzIzLTMyNQogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI2CiAgICAvLyByZXR1cm4gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMkA0OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxOQogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAyMiAvLyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzE4LTMyMAogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMQogICAgLy8gcmV0dXJuIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8xQDM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzE0CiAgICAvLyBzZWxmLmFjY291bnRfbWFuYWdlciwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAyMyAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTMtMzE1CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxNgogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMEAyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwOS0zMTEKICAgIC8vIHJldHVybiB0eXAuUm9sZVZhbGlkaXR5KAogICAgLy8gICAgIHJvbGVfdmFsaWRpdHlfc3RhcnQ9VUludDY0KDApLCByb2xlX3ZhbGlkaXR5X2VuZD1VSW50NjQoMCkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLl9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IHZvaWQ6Cl9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI2CiAgICAvLyBkZWYgX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQoc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjgKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkLCBlcnIuU1VTUEVOREVECiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCAzODQKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIFN1c3BlbmRlZCBvcGVyYXRpb25zCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5fc2V0dGxlX3Bvc2l0aW9uKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NCwgdWludDY0Ogpfc2V0dGxlX3Bvc2l0aW9uOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjQ0CiAgICAvLyBkZWYgX3NldHRsZV9wb3NpdGlvbihzZWxmLCBob2xkaW5nX2FkZHJlc3M6IEFjY291bnQpIC0+IHR1cGxlW1VJbnQ2NCwgVUludDY0XToKICAgIHByb3RvIDEgMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo2MQogICAgLy8gcG9zaXRpb24gPSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jb3B5KCkKICAgIGR1cAogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NjMtNjUKICAgIC8vICMgQ29tcHV0ZSB0aGUgaW5jcmVtZW50YWwgcGVyLXVuaXQgZml4ZWQtcG9pbnQgaW50ZXJlc3QgYW5kIHByaW5jaXBhbCBhY2NydWVkCiAgICAvLyAjIHNpbmNlIHRoaXMgYWNjb3VudCdzIGxhc3QgY2hlY2twb2ludC4KICAgIC8vIGludGVyZXN0X2RlbHRhID0gc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IC0gcG9zaXRpb24uaW50ZXJlc3RfY2hlY2twb2ludAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggZXhpc3RzCiAgICBkaWcgMQogICAgcHVzaGludCA1NwogICAgZXh0cmFjdF91aW50NjQKICAgIC0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo2NwogICAgLy8gc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCAtIHBvc2l0aW9uLnByaW5jaXBhbF9jaGVja3BvaW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTcgLy8gImN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IGV4aXN0cwogICAgZGlnIDIKICAgIHB1c2hpbnQgNjUKICAgIGV4dHJhY3RfdWludDY0CiAgICAtCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzMKICAgIC8vIGludGVyZXN0X2RlbHRhLCBwb3NpdGlvbi51bml0cywgc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgZGlnIDIKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3MC03NAogICAgLy8gIyBDb252ZXJ0IHRoZSBwZXItdW5pdCBmaXhlZC1wb2ludCBkZWx0YXMgaW50byBhYnNvbHV0ZSBjbGFpbWFibGUgYW1vdW50cwogICAgLy8gIyB1c2luZyB0aGUgYWNjb3VudCdzIGFjdGl2ZSB1bml0cy4KICAgIC8vIGNsYWltYWJsZV9pbnRlcmVzdCA9IHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIGludGVyZXN0X2RlbHRhLCBwb3NpdGlvbi51bml0cywgc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgLy8gKQogICAgdW5jb3ZlciAzCiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojc2CiAgICAvLyBwcmluY2lwYWxfZGVsdGEsIHBvc2l0aW9uLnVuaXRzLCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzUtNzcKICAgIC8vIGNsYWltYWJsZV9wcmluY2lwYWwgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBwcmluY2lwYWxfZGVsdGEsIHBvc2l0aW9uLnVuaXRzLCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICAvLyApCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojc5LTgxCiAgICAvLyAjIEFjY3J1ZSB0aGUgY2xhaW1hYmxlIGFtb3VudHMgdG8gdGhlIGFjY291bnQgcG9zaXRpb24gYW5kIG1ha2UgdGhlbSBhdmFpbGFibGUKICAgIC8vICMgZm9yIHdpdGhkcmF3YWwuCiAgICAvLyBwb3NpdGlvbi5jbGFpbWFibGVfaW50ZXJlc3QgKz0gY2xhaW1hYmxlX2ludGVyZXN0CiAgICBkaWcgMgogICAgcHVzaGludCA3MwogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICArCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIHN3YXAKICAgIHJlcGxhY2UyIDczCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6ODIKICAgIC8vIHBvc2l0aW9uLmNsYWltYWJsZV9wcmluY2lwYWwgKz0gY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgZHVwCiAgICBwdXNoaW50IDgxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDIKICAgICsKICAgIGl0b2IKICAgIHJlcGxhY2UyIDgxCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6ODQtODYKICAgIC8vICMgQWR2YW5jZSB0aGUgYWNjb3VudCdzIHBlci11bml0IGZpeGVkLXBvaW50IGNoZWNrcG9pbnRzIHRvIHRoZSBjdXJyZW50IGdsb2JhbAogICAgLy8gIyBwZXItdW5pdCBmaXhlZC1wb2ludCBnbG9iYWwgaW5kaWNlcy4KICAgIC8vIHBvc2l0aW9uLmludGVyZXN0X2NoZWNrcG9pbnQgPSBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IGV4aXN0cwogICAgaXRvYgogICAgcmVwbGFjZTIgNTcKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo4NwogICAgLy8gcG9zaXRpb24ucHJpbmNpcGFsX2NoZWNrcG9pbnQgPSBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTcgLy8gImN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IGV4aXN0cwogICAgaXRvYgogICAgcmVwbGFjZTIgNjUKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo4OS05MAogICAgLy8gIyBBZHZhbmNlIHRoZSBhY2NvdW50J3MgZXZlbnQgY3Vyc29yIHRvIHRoZSBjdXJyZW50IGdsb2JhbCBldmVudCBjdXJzb3IuCiAgICAvLyBwb3NpdGlvbi5zZXR0bGVkX2N1cnNvciA9IHNlbGYuZXZlbnRfY3Vyc29yCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGl0b2IKICAgIHJlcGxhY2UyIDQ5CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6OTItOTQKICAgIC8vICMgVXBkYXRlIHRoZSBhY2NvdW50IHBvc2l0aW9uIGFuZCByZXR1cm4gdGhlIG5ld2x5IGFjY3J1ZWQgY2xhaW1hYmxlIGFtb3VudHMKICAgIC8vICMgYWRkZWQgdG8gdGhlIHRvdGFsIHBvc2l0aW9uJ3MgY2xhaW1hYmxlIGFtb3VudHMuCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHBvc2l0aW9uLmNvcHkoKQogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6OTUKICAgIC8vIHJldHVybiBjbGFpbWFibGVfaW50ZXJlc3QsIGNsYWltYWJsZV9wcmluY2lwYWwKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IHZvaWQ6Cl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojk3CiAgICAvLyBkZWYgX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQoc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQyMwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDAKICAgIC8vIGlmIHNlbGYuX3N0YXR1c19pc19wZW5kaW5nX2llZCgpOgogICAgYnogX2Vuc3VyZV91bml0c19hY3RpdmF0ZWRfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTAxCiAgICAvLyByZXR1cm4KICAgIHJldHN1YgoKX2Vuc3VyZV91bml0c19hY3RpdmF0ZWRfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwMwogICAgLy8gcG9zaXRpb24gPSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAyCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDQKICAgIC8vIGlmIHBvc2l0aW9uLnJlc2VydmVkX3VuaXRzID09IFVJbnQ2NCgwKToKICAgIHB1c2hpbnQgNDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgYm56IF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkX2FmdGVyX2lmX2Vsc2VANAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwNQogICAgLy8gcmV0dXJuCiAgICByZXRzdWIKCl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkX2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDgKICAgIC8vIHBvc2l0aW9uLnVuaXRzICs9IGFjdGl2YXRlZF91bml0cwogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMwogICAgKwogICAgaXRvYgogICAgcmVwbGFjZTIgMzIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDkKICAgIC8vIHBvc2l0aW9uLnJlc2VydmVkX3VuaXRzID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgaXRvYgogICAgcmVwbGFjZTIgNDAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTAKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gcG9zaXRpb24uY29weSgpCiAgICBmcmFtZV9kaWcgMgogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExMQogICAgLy8gYXNzZXJ0IHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPj0gYWN0aXZhdGVkX3VuaXRzLCBlcnIuT1ZFUl9ESVNUUklCVVRJT04KICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICBkdXAKICAgIGRpZyAyCiAgICA+PQogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCByZW1haW5pbmcgRC1BU0EgdW5pdHMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTIKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgLT0gYWN0aXZhdGVkX3VuaXRzCiAgICBzd2FwCiAgICAtCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX3NjYWxlZF9tdWxfZGl2KG11bHRpcGxpY2FuZDogdWludDY0LCBtdWx0aXBsaWVyOiB1aW50NjQsIGRpdmlzb3I6IHVpbnQ2NCkgLT4gdWludDY0Ogpfc2NhbGVkX211bF9kaXY6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNTMtMTU1CiAgICAvLyBkZWYgX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIHNlbGYsIG11bHRpcGxpY2FuZDogVUludDY0LCBtdWx0aXBsaWVyOiBVSW50NjQsIGRpdmlzb3I6IFVJbnQ2NAogICAgLy8gKSAtPiBVSW50NjQ6CiAgICBwcm90byAzIDEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE1NwogICAgLy8gaWYgbXVsdGlwbGljYW5kID09IFVJbnQ2NCgwKSBvciBtdWx0aXBsaWVyID09IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMwogICAgYnogX3NjYWxlZF9tdWxfZGl2X2lmX2JvZHlAMgogICAgZnJhbWVfZGlnIC0yCiAgICBibnogX3NjYWxlZF9tdWxfZGl2X2FmdGVyX2lmX2Vsc2VAMwoKX3NjYWxlZF9tdWxfZGl2X2lmX2JvZHlAMjoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE1OAogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKX3NjYWxlZF9tdWxfZGl2X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE1OQogICAgLy8gaGlnaCwgbG93ID0gb3AubXVsdyhtdWx0aXBsaWNhbmQsIG11bHRpcGxpZXIpCiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMgogICAgbXVsdwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTYwCiAgICAvLyByZXR1cm4gb3AuZGl2dyhoaWdoLCBsb3csIGRpdmlzb3IpCiAgICBmcmFtZV9kaWcgLTEKICAgIGRpdncKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9hbW91bnRfdG9faW5kZXhfZGVsdGEoYW1vdW50OiB1aW50NjQpIC0+IHVpbnQ2NDoKX2Ftb3VudF90b19pbmRleF9kZWx0YToKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE2MgogICAgLy8gZGVmIF9hbW91bnRfdG9faW5kZXhfZGVsdGEoc2VsZiwgYW1vdW50OiBVSW50NjQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTY0CiAgICAvLyBpZiBhbW91bnQgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0xCiAgICBibnogX2Ftb3VudF90b19pbmRleF9kZWx0YV9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE2NQogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKX2Ftb3VudF90b19pbmRleF9kZWx0YV9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNjYKICAgIC8vIGFzc2VydCBzZWxmLnRvdGFsX3VuaXRzID4gVUludDY0KDApLCBlcnIuTk9fVU5JVFMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICBkdXAKICAgIGFzc2VydCAvLyBObyBELUFTQSB1bml0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTY3CiAgICAvLyByZXR1cm4gc2VsZi5fc2NhbGVkX211bF9kaXYoYW1vdW50LCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLCBzZWxmLnRvdGFsX3VuaXRzKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5faW5kZXhfZGVsdGFfdG9fYW1vdW50KGluZGV4X2RlbHRhOiB1aW50NjQpIC0+IHVpbnQ2NDoKX2luZGV4X2RlbHRhX3RvX2Ftb3VudDoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE2OQogICAgLy8gZGVmIF9pbmRleF9kZWx0YV90b19hbW91bnQoc2VsZiwgaW5kZXhfZGVsdGE6IFVJbnQ2NCkgLT4gVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNzYKICAgIC8vIGlmIGluZGV4X2RlbHRhID09IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMQogICAgYm56IF9pbmRleF9kZWx0YV90b19hbW91bnRfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNzcKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9pbmRleF9kZWx0YV90b19hbW91bnRfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTc5CiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE4MQogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE3OC0xODIKICAgIC8vIHJldHVybiBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLnRvdGFsX3VuaXRzLAogICAgLy8gICAgIGluZGV4X2RlbHRhLAogICAgLy8gICAgIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZ2V0X3NjaGVkdWxlX2VudHJ5KGV2ZW50X2lkOiB1aW50NjQpIC0+IGJ5dGVzOgpfZ2V0X3NjaGVkdWxlX2VudHJ5OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjAyCiAgICAvLyBkZWYgX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLCBldmVudF9pZDogVUludDY0KSAtPiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeToKICAgIHByb3RvIDEgMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjA0CiAgICAvLyBhc3NlcnQgZXZlbnRfaWQgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LCBlcnIuSU5WQUxJRF9FVkVOVF9JRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICA+CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBpZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTkwCiAgICAvLyByZXR1cm4gZXZlbnRfaWQgLy8gVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMTYKICAgIC8KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjIwNgogICAgLy8gYXNzZXJ0IHBhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBpdG9iCiAgICBieXRlYyAzMSAvLyAweDUzMjMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE5NAogICAgLy8gcmV0dXJuIGV2ZW50X2lkICUgVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMTYKICAgICUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjIwOQogICAgLy8gYXNzZXJ0IG9mZnNldCA8IHBhZ2UubGVuZ3RoLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIHB1c2hpbnQgMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGRpZyAxCiAgICA+CiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMTAKICAgIC8vIHJldHVybiBwYWdlW29mZnNldF0uY29weSgpCiAgICBwdXNoaW50IDY1CiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIHB1c2hpbnQgNjUKICAgIGJveF9leHRyYWN0CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoY29udHJhY3RfdHlwZTogdWludDY0LCBldmVudF90eXBlOiB1aW50NjQpIC0+IHZvaWQ6Cl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZToKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMxMy0zMTUKICAgIC8vIGRlZiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgc2VsZiwgY29udHJhY3RfdHlwZTogVUludDY0LCBldmVudF90eXBlOiBVSW50NjQKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjU0LTI1NQogICAgLy8gIyBDaGVjayBjb21tb24gZXZlbnRzIGZpcnN0CiAgICAvLyBpZiBldmVudF90eXBlIGluIGNvbW1vbl9ldmVudHM6CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI0NwogICAgLy8gVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI0OAogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUCksCiAgICBpbnRjXzIgLy8gOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjU0LTI1NQogICAgLy8gIyBDaGVjayBjb21tb24gZXZlbnRzIGZpcnN0CiAgICAvLyBpZiBldmVudF90eXBlIGluIGNvbW1vbl9ldmVudHM6CiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjQ5CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX01EKSwKICAgIHB1c2hpbnQgMTkKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI1MAogICAgLy8gVUludDY0KGVudW1zLkVWVF9SUiksCiAgICBwdXNoaW50IDEyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyNTEKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIHB1c2hpbnQgMTEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDcKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDY6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyNTYKICAgIC8vIHJldHVybiBUcnVlCiAgICBpbnRjXzEgLy8gMQoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQ6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIHJldHN1YgoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI1OC0yNTkKICAgIC8vICMgQ29udHJhY3Qtc3BlY2lmaWMgYWRkaXRpb25hbCBldmVudHMKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX1BBTSk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyNjAtMjYxCiAgICAvLyAjIFBBTSBvbmx5IHN1cHBvcnRzIGNvbW1vbiBldmVudHMKICAgIC8vIHJldHVybiBGYWxzZQogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI2MwogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfTEFNKSBvciBjb250cmFjdF90eXBlID09IFVJbnQ2NCgKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAzCiAgICA9PQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjYzLTI2NQogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfTEFNKSBvciBjb250cmFjdF90eXBlID09IFVJbnQ2NCgKICAgIC8vICAgICBlbnVtcy5DVF9OQU0KICAgIC8vICk6CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlAMTEKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAyCiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMTYKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDExOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjY2LTI3MAogICAgLy8gIyBMQU0vTkFNIGFkZDogUFIsIElQQ0IKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyNjgKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyNjYtMjcwCiAgICAvLyAjIExBTS9OQU0gYWRkOiBQUiwgSVBDQgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMTMKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjY5CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgcHVzaGludCAxOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjY2LTI3MAogICAgLy8gIyBMQU0vTkFNIGFkZDogUFIsIElQQ0IKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gKQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDE0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDEzOgogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMTQ6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAxNjoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI3MgogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKToKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAyMwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjczLTI3OAogICAgLy8gIyBBTk4gYWRkczogUFIsIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyNzUKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyNzMtMjc4CiAgICAvLyAjIEFOTiBhZGRzOiBQUiwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjAKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Mjc2CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgcHVzaGludCAxOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjczLTI3OAogICAgLy8gIyBBTk4gYWRkczogUFIsIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDIwCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI3NwogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyNzMtMjc4CiAgICAvLyAjIEFOTiBhZGRzOiBQUiwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMjEKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjA6CiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF9mYWxzZUAyMToKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDIzOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjgwCiAgICAvLyBpZiBjb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9MQVgpOgogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDQKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAzMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjgxLTI4NwogICAgLy8gIyBMQVggYWRkczogUFIsIFBJLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjgzCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjgxLTI4NwogICAgLy8gIyBMQVggYWRkczogUFIsIFBJLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyOAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyODQKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgcHVzaGludCA0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyODEtMjg3CiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDI4CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI4NQogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIHB1c2hpbnQgMTgKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI4MS0yODcKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjgKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Mjg2CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICBwdXNoaW50IDUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI4MS0yODcKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMjkKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjg6CiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF9mYWxzZUAyOToKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDMxOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Mjg5CiAgICAvLyBpZiBjb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9DTE0pOgogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDUKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAzMwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjkwLTI5MQogICAgLy8gIyBDTE0gYWRkczogUFIKICAgIC8vIHJldHVybiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMzM6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyOTMKICAgIC8vIHJldHVybiBGYWxzZQogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKCi8vIG1vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9pc19keW5hbWljX2FubnVpdHkoKSAtPiB1aW50NjQ6Cl9pc19keW5hbWljX2FubnVpdHk6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozMzUKICAgIC8vIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMzNS0zMzYKICAgIC8vIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKQogICAgLy8gYW5kIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgYnogX2lzX2R5bmFtaWNfYW5udWl0eV9ib29sX2ZhbHNlQDMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMzNgogICAgLy8gYW5kIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDM0IC8vICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24gZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozMzUtMzM2CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIC8vIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGJ6IF9pc19keW5hbWljX2FubnVpdHlfYm9vbF9mYWxzZUAzCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzM0LTMzNwogICAgLy8gcmV0dXJuICgKICAgIC8vICAgICBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIC8vICAgICBhbmQgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICAvLyApCiAgICByZXRzdWIKCl9pc19keW5hbWljX2FubnVpdHlfYm9vbF9mYWxzZUAzOgogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMzNC0zMzcKICAgIC8vIHJldHVybiAoCiAgICAvLyAgICAgc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICAvLyAgICAgYW5kIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgLy8gKQogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnk6IGJ5dGVzKSAtPiB1aW50NjQsIGJ5dGVzOgpfZW50cnlfaW50ZXJlc3Rfc2VnbWVudDoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjM4MAogICAgLy8gZGVmIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KHNlbGYsIGVudHJ5OiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSkgLT4gVUludDY0OgogICAgcHJvdG8gMSAyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozODkKICAgIC8vIGVudHJ5LmFjY3J1YWxfZmFjdG9yID09IFVJbnQ2NCgwKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDE3CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozODktMzkxCiAgICAvLyBlbnRyeS5hY2NydWFsX2ZhY3RvciA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID09IFVJbnQ2NCgwKQogICAgLy8gb3Igc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID09IFVJbnQ2NCgwKQogICAgYnogX2VudHJ5X2ludGVyZXN0X3NlZ21lbnRfaWZfYm9keUAzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozOTAKICAgIC8vIG9yIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID09IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozODktMzkxCiAgICAvLyBlbnRyeS5hY2NydWFsX2ZhY3RvciA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID09IFVJbnQ2NCgwKQogICAgLy8gb3Igc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID09IFVJbnQ2NCgwKQogICAgYnogX2VudHJ5X2ludGVyZXN0X3NlZ21lbnRfaWZfYm9keUAzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozOTEKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozODktMzkxCiAgICAvLyBlbnRyeS5hY2NydWFsX2ZhY3RvciA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID09IFVJbnQ2NCgwKQogICAgLy8gb3Igc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID09IFVJbnQ2NCgwKQogICAgYm56IF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2FmdGVyX2lmX2Vsc2VANAoKX2VudHJ5X2ludGVyZXN0X3NlZ21lbnRfaWZfYm9keUAzOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzkzCiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfZGlnIC0xCiAgICB1bmNvdmVyIDIKICAgIHJldHN1YgoKX2VudHJ5X2ludGVyZXN0X3NlZ21lbnRfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Mzk1CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Mzk2CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Mzk3CiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Mzk0LTM5OAogICAgLy8gYWNjcnVlZCA9IHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSwKICAgIC8vICAgICBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQwMgogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjM5OS00MDMKICAgIC8vIHJldHVybiBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBhY2NydWVkLAogICAgLy8gICAgIGVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMAogICAgc3dhcAogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIGZyYW1lX2RpZyAtMQogICAgdW5jb3ZlciAyCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZGlzY291bnRfYW5udWl0eV9mYWN0b3IoZGlzY291bnRfZmFjdG9yOiB1aW50NjQsIHJlZGVtcHRpb25fZmFjdG9yOiB1aW50NjQpIC0+IHVpbnQ2NDoKX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDYyLTQ2NgogICAgLy8gZGVmIF9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcigKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgIGRpc2NvdW50X2ZhY3RvcjogVUludDY0LAogICAgLy8gICAgIHJlZGVtcHRpb25fZmFjdG9yOiBVSW50NjQsCiAgICAvLyApIC0+IFVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDY4CiAgICAvLyBpZiByZWRlbXB0aW9uX2ZhY3RvciA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGJueiBfZGlzY291bnRfYW5udWl0eV9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0NjkKICAgIC8vIHJldHVybiBkaXNjb3VudF9mYWN0b3IKICAgIGZyYW1lX2RpZyAtMgogICAgcmV0c3ViCgpfZGlzY291bnRfYW5udWl0eV9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDcwCiAgICAvLyBwZXJpb2RfcmF0ZSA9IHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgKyBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQ3MQogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQ3MC00NzQKICAgIC8vIHBlcmlvZF9yYXRlID0gc2VsZi5maXhlZF9wb2ludF9zY2FsZSArIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIHJlZGVtcHRpb25fZmFjdG9yLAogICAgLy8gICAgIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgKwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDc1CiAgICAvLyBhc3NlcnQgcGVyaW9kX3JhdGUgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZHVwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0NzgKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0NzYtNDgwCiAgICAvLyByZXR1cm4gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgZGlzY291bnRfZmFjdG9yLAogICAgLy8gICAgIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICAvLyAgICAgcGVyaW9kX3JhdGUsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeShlbnRyeTogYnl0ZXMsIHBheWxvYWQ6IGJ5dGVzKSAtPiBieXRlcywgYnl0ZXM6Cl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeToKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYxMy02MTUKICAgIC8vIGRlZiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkoCiAgICAvLyAgICAgc2VsZiwgZW50cnk6IHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5LCBwYXlsb2FkOiB0eXAuT2JzZXJ2ZWRFdmVudFJlcXVlc3QKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDIgMgogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2MjMKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF9pZCA9PSBzZWxmLmV2ZW50X2N1cnNvciwgZXJyLklOVkFMSURfRVZFTlRfQ1VSU09SCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgY3Vyc29yCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2MjQKICAgIC8vIGFzc2VydCBlbnRyeS5zY2hlZHVsZWRfdGltZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwgZXJyLk5PX0RVRV9DQVNIRkxPVwogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA8PQogICAgYXNzZXJ0IC8vIE5vIGR1ZSBjYXNoZmxvdyB0byBwYXkKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYyNgogICAgLy8gZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjI3CiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfSUVEKToKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgZHVwCiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMzUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjI4LTYzMAogICAgLy8gIyBJRUQgZmluYWxpemVzIGlzc3VhbmNlOiByZXNlcnZlZCB1bml0cyBiZWNvbWUgYWN0aXZhdGFibGUgYW5kIHRoZQogICAgLy8gIyBzY2hlZHVsZSdzIGluaXRpYWwgY29udHJhY3R1YWwgc3RhdGUgYmVjb21lcyBsaXZlLgogICAgLy8gYXNzZXJ0IHNlbGYuX3N0YXR1c19pc19wZW5kaW5nX2llZCgpLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYzMgogICAgLy8gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCA9PSBzZWxmLnRvdGFsX3VuaXRzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgID09CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2MzEtNjMzCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPT0gc2VsZi50b3RhbF91bml0cwogICAgLy8gKSwgZXJyLlBSSU1BUllfRElTVFJJQlVUSU9OX0lOQ09NUExFVEUKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBub3QgY29tcGxldGUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYzNAogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2MzUKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYzNgogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPSBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZQogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYzNwogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ID0gVUludDY0KDApCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2MzgKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IGVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA0MQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYzOQogICAgLy8gc2VsZi5ldmVudF9jdXJzb3IgKz0gVUludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjQwCiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbnVtcy5TVEFUVVNfQUNUSVZFKQogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgcHVzaGludCAxMDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0NTEKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwgZXJyLk5PVF9FVlRfSUVECiAgICBmcmFtZV9kaWcgMTEKICAgIGFzc2VydCAvLyBOb3QgSUVEIGV2ZW50CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0NTIKICAgIC8vIHJldHVybiBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjQxLTY0NQogICAgLy8gc2VsZi5fZW1pdF9leGVjdXRpb25fZXZlbnQoCiAgICAvLyAgICAgZW50cnk9ZW50cnksCiAgICAvLyAgICAgcGF5b2ZmPXNlbGYuX2VudHJ5X2llZF9hbW91bnQoZW50cnkpLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjQ0CiAgICAvLyBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjQxLTY0NQogICAgLy8gc2VsZi5fZW1pdF9leGVjdXRpb25fZXZlbnQoCiAgICAvLyAgICAgZW50cnk9ZW50cnksCiAgICAvLyAgICAgcGF5b2ZmPXNlbGYuX2VudHJ5X2llZF9hbW91bnQoZW50cnkpLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGNhbGxzdWIgX2VtaXRfZXhlY3V0aW9uX2V2ZW50CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgLTIKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjY0NgogICAgLy8gcmV0dXJuCiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2J1cnkgMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMzUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTQ3CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuX3N0YXR1c19pc19wZW5kaW5nX2llZCgpLCBlcnIuUEVORElOR19JRUQKICAgICEKICAgIGFzc2VydCAvLyBJRUQgbm90IHlldCBleGVjdXRlZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjQ5CiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgKz0gc2VsZi5fZW50cnlfaW50ZXJlc3Rfc2VnbWVudChlbnRyeSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQKICAgIGZyYW1lX2J1cnkgLTIKICAgICsKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjUxCiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUlIpOgogICAgZnJhbWVfZGlnIDEwCiAgICBwdXNoaW50IDEyCiAgICA9PQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAxMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjU1CiAgICAvLyBwYXlsb2FkLm9ic2VydmVkX3JhdGUsCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2NTYKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9tdWx0aXBsaWVyLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDM2IC8vICJyYXRlX3Jlc2V0X211bHRpcGxpZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9tdWx0aXBsaWVyIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjU3CiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjUyLTY1OAogICAgLy8gIyBSUiBkZXJpdmVzIHRoZSBuZXh0IHJhdGUgZnJvbSBhbiBvYnNlcnZlZCBvcmFjbGUgdmFsdWUgcGx1cyB0aGUKICAgIC8vICMgY29udHJhY3Qgc3ByZWFkIC8gbXVsdGlwbGllciB0ZXJtcywgdGhlbiBlbmZvcmNlcyBmbG9vciBhbmQgY2FwLgogICAgLy8gb2JzZXJ2ZWRfcmF0ZSA9IHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIHBheWxvYWQub2JzZXJ2ZWRfcmF0ZSwKICAgIC8vICAgICBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjY2MAogICAgLy8gb2JzZXJ2ZWRfcmF0ZSArIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzNSAvLyAicmF0ZV9yZXNldF9zcHJlYWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQgZXhpc3RzCiAgICArCiAgICBmcmFtZV9idXJ5IDYKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjczNAogICAgLy8gaWYgc2VsZi5oYXNfcmF0ZV9yZXNldF9mbG9vciBhbmQgcmF0ZSA8IHNlbGYucmF0ZV9yZXNldF9mbG9vcjoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzOCAvLyAiaGFzX3JhdGVfcmVzZXRfZmxvb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgZXhpc3RzCiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1NQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI5IC8vICJyYXRlX3Jlc2V0X2Zsb29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfZmxvb3IgZXhpc3RzCiAgICBmcmFtZV9kaWcgNgogICAgPgogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjczNQogICAgLy8gcmF0ZSA9IHNlbGYucmF0ZV9yZXNldF9mbG9vcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI5IC8vICJyYXRlX3Jlc2V0X2Zsb29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgNgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9mbG9vciBleGlzdHMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU1OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzM2CiAgICAvLyBpZiBzZWxmLmhhc19yYXRlX3Jlc2V0X2NhcCBhbmQgcmF0ZSA+IHNlbGYucmF0ZV9yZXNldF9jYXA6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzkgLy8gImhhc19yYXRlX3Jlc2V0X2NhcCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgZXhpc3RzCiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1OAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDMwIC8vICJyYXRlX3Jlc2V0X2NhcCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X2NhcCBleGlzdHMKICAgIGZyYW1lX2RpZyA2CiAgICA8CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1OAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzM3CiAgICAvLyByYXRlID0gc2VsZi5yYXRlX3Jlc2V0X2NhcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDMwIC8vICJyYXRlX3Jlc2V0X2NhcCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDYKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfY2FwIGV4aXN0cwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTg6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2NTkKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gc2VsZi5fY2xhbXBfcmF0ZSgKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjY1OS02NjEKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gc2VsZi5fY2xhbXBfcmF0ZSgKICAgIC8vICAgICBvYnNlcnZlZF9yYXRlICsgc2VsZi5yYXRlX3Jlc2V0X3NwcmVhZAogICAgLy8gKQogICAgZnJhbWVfZGlnIDYKICAgIGFwcF9nbG9iYWxfcHV0CgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAxODoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjY3MQogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1BJKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCA0CiAgICA9PQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAyMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjcyCiAgICAvLyBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9IGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjY3MwogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMjM6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2NzgKICAgIC8vIGlmIHNlbGYuX2lzX2R5bmFtaWNfYW5udWl0eSgpOgogICAgY2FsbHN1YiBfaXNfZHluYW1pY19hbm51aXR5CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDI5CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2NzkKICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QUkYpOgogICAgZnJhbWVfZGlnIDEwCiAgICBwdXNoaW50IDUKICAgID09CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAzMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDkwCiAgICAvLyBkaXNjb3VudF9mYWN0b3IgPSBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQ5MQogICAgLy8gZGVub21pbmF0b3IgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQ5MgogICAgLy8gc2tpcF9maXJzdF9yZWRlbXB0aW9uID0gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDcKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQ5NAogICAgLy8gaWYgZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAyNQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgZnJhbWVfYnVyeSA4CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAzNQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDk1LTQ5OQogICAgLy8gIyBBbiBpbml0aWFsIFBSRiBtYXkgZGVzY3JpYmUgdGhlIGZpcnN0IHJlZGVtcHRpb24gcGVyaW9kIGRpcmVjdGx5LgogICAgLy8gZGlzY291bnRfZmFjdG9yID0gc2VsZi5fZGlzY291bnRfYW5udWl0eV9mYWN0b3IoCiAgICAvLyAgICAgZGlzY291bnRfZmFjdG9yLAogICAgLy8gICAgIGVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDgKICAgIGNhbGxzdWIgX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTAxCiAgICAvLyBza2lwX2ZpcnN0X3JlZGVtcHRpb24gPSBUcnVlCiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfYnVyeSA3CiAgICBmcmFtZV9idXJ5IDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDM1OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTAzCiAgICAvLyBmdXR1cmVfZXZlbnRfaWQgPSBzZWxmLmV2ZW50X2N1cnNvciArIFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfd2hpbGVfdG9wQDM2OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTA0CiAgICAvLyB3aGlsZSBmdXR1cmVfZXZlbnRfaWQgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgZnJhbWVfZGlnIDMKICAgID4KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl93aGlsZUA0OAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTA1CiAgICAvLyBmdXR1cmVfZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoZnV0dXJlX2V2ZW50X2lkKQogICAgZnJhbWVfZGlnIDMKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjUwNgogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPSBmdXR1cmVfZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1MDctNTA4CiAgICAvLyAjIE9ubHkgcmVkZW1wdGlvbi1iZWFyaW5nIGV2ZW50cyBjb250cmlidXRlIHRvIHRoZSBhbm51aXR5IGRlbm9taW5hdG9yLgogICAgLy8gaXNfcmVkZW1wdGlvbl9ldmVudCA9IGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpIG9yICgKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjUwNy01MTEKICAgIC8vICMgT25seSByZWRlbXB0aW9uLWJlYXJpbmcgZXZlbnRzIGNvbnRyaWJ1dGUgdG8gdGhlIGFubnVpdHkgZGVub21pbmF0b3IuCiAgICAvLyBpc19yZWRlbXB0aW9uX2V2ZW50ID0gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QUikgb3IgKAogICAgLy8gICAgIGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfTUQpCiAgICAvLyAgICAgYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICAvLyApCiAgICBibnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfdHJ1ZUA0MAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTA5CiAgICAvLyBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgZnJhbWVfZGlnIDQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1MDktNTEwCiAgICAvLyBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgLy8gYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF9mYWxzZUA0MQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTEwCiAgICAvLyBhbmQgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IgPiBVSW50NjQoMCkKICAgIGZyYW1lX2RpZyAwCiAgICBwdXNoaW50IDI1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTA5LTUxMAogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCkKICAgIC8vIGFuZCBmdXR1cmVfZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX3RydWVANDA6CiAgICBpbnRjXzEgLy8gMQoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfbWVyZ2VANDI6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1MTIKICAgIC8vIGlmIGlzX3JlZGVtcHRpb25fZXZlbnQ6CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA0NwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTEzCiAgICAvLyBpZiBza2lwX2ZpcnN0X3JlZGVtcHRpb246CiAgICBmcmFtZV9kaWcgNwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUA0NQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTE0CiAgICAvLyBza2lwX2ZpcnN0X3JlZGVtcHRpb24gPSBGYWxzZQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgNwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANDc6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1MjEKICAgIC8vIGZ1dHVyZV9ldmVudF9pZCArPSBVSW50NjQoMSkKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV93aGlsZV90b3BAMzYKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlANDU6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1MTgKICAgIC8vIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZnJhbWVfZGlnIDAKICAgIHB1c2hpbnQgMjUKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1MTYtNTE5CiAgICAvLyBkaXNjb3VudF9mYWN0b3IgPSBzZWxmLl9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcigKICAgIC8vICAgICBkaXNjb3VudF9mYWN0b3IsCiAgICAvLyAgICAgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMgogICAgc3dhcAogICAgY2FsbHN1YiBfZGlzY291bnRfYW5udWl0eV9mYWN0b3IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1MjAKICAgIC8vIGRlbm9taW5hdG9yICs9IGRpc2NvdW50X2ZhY3RvcgogICAgZnJhbWVfZGlnIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA0NwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDE6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF9tZXJnZUA0MgoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX3doaWxlQDQ4OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTIzCiAgICAvLyBhc3NlcnQgZGVub21pbmF0b3IgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZnJhbWVfZGlnIDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjUyNAogICAgLy8gbnVtZXJhdG9yID0gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTI1CiAgICAvLyBpZiBlbnRyeS5mbGFncyAmIFVJbnQ2NChlbnVtcy5GTEFHX0lOSVRJQUxfUFJGKSA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNTcKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gOAogICAgJgogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDUwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1MjYtNTI3CiAgICAvLyAjIFN1YnNlcXVlbnQgUFJGIGV2ZW50cyBhbW9ydGl6ZSBib3RoIHByaW5jaXBhbCBhbmQgYWxyZWFkeSBhY2NydWVkIGNhcnJ5LgogICAgLy8gbnVtZXJhdG9yICs9IHNlbGYuYWNjcnVlZF9pbnRlcmVzdAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgICsKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDUwOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTMwCiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTI4LTUzMgogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIG51bWVyYXRvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gICAgIGRlbm9taW5hdG9yLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDEKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2ODAKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IHNlbGYuX3JlY2FsY3VsYXRlX2FubnVpdHlfcGF5bWVudCgKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjgwLTY4MgogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gc2VsZi5fcmVjYWxjdWxhdGVfYW5udWl0eV9wYXltZW50KAogICAgLy8gICAgIGVudHJ5CiAgICAvLyApCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMzA6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2ODUKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjY4Ni02OTAKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1VSW50NjQoMCksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2ODgKICAgIC8vIHBheW9mZj1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Njg5CiAgICAvLyBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICBkdXAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjY4Ni02OTAKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1VSW50NjQoMCksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgY2FsbHN1YiBfZW1pdF9leGVjdXRpb25fZXZlbnQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDI5OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Njg0CiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDMwCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDIwOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Njc0CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9JUENCKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCAxOAogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDIzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2NzUtNjc2CiAgICAvLyAjIElQQ0Iga2VlcHMgcHJpbmNpcGFsIHVuY2hhbmdlZCBhbmQgb25seSByZXNldHMgdGhlIGludGVyZXN0IGJhc2UuCiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIGIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMjMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMTA6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2NjIKICAgIC8vIGVsaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1JSRik6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgMTEKICAgID09CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDE0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2NjMKICAgIC8vIG5leHRfcmF0ZSA9IGVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjY0CiAgICAvLyBpZiBuZXh0X3JhdGUgPT0gVUludDY0KDApOgogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDEzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2NjUKICAgIC8vIG5leHRfcmF0ZSA9IHNlbGYucmF0ZV9yZXNldF9uZXh0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzcgLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDUKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfbmV4dCBleGlzdHMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjY2CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IG5leHRfcmF0ZQogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgZnJhbWVfZGlnIDUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDE0OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjY4CiAgICAvLyBpZiBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSAhPSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgOQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMTgKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjY2OQogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPSBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZQogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgZnJhbWVfZGlnIDkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CgoKLy8gbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KGVudHJ5OiBieXRlcywgcGF5b2ZmOiB1aW50NjQsIHNldHRsZWRfYW1vdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpfZW1pdF9leGVjdXRpb25fZXZlbnQ6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2OTYtNzAyCiAgICAvLyBkZWYgX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgKiwKICAgIC8vICAgICBlbnRyeTogdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnksCiAgICAvLyAgICAgcGF5b2ZmOiBVSW50NjQsCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ6IFVJbnQ2NCwKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDMgMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzA2CiAgICAvLyBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25JRAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzA3CiAgICAvLyBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIGZyYW1lX2RpZyAtMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3MDgKICAgIC8vIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIGZyYW1lX2RpZyAtMwogICAgZXh0cmFjdCA4IDEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjcwOQogICAgLy8gc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICBmcmFtZV9kaWcgLTMKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3MTAKICAgIC8vIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3MTMKICAgIC8vIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIGZyYW1lX2RpZyAtMwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzA4CiAgICAvLyBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICBpbnRjXzIgLy8gOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzEzCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBnZXRieXRlCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3NDIKICAgIC8vIGlmIHBheW9mZiA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJueiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3NDMKICAgIC8vIHJldHVybiBVSW50NjQoZW51bXMuUEFZT0ZGX1NJR05fUE9TSVRJVkUpCiAgICBpbnRjXzEgLy8gMQoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX3BheW9mZl9zaWduQDc6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3MTItNzE0CiAgICAvLyBwYXlvZmZfc2lnbj1hcmM0LlVJbnQ4KAogICAgLy8gICAgIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIC8vICksCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgaW50Y18yIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3MTYKICAgIC8vIGN1cnJlbmN5X2lkPXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzE3CiAgICAvLyBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3MDUtNzE4CiAgICAvLyBFeGVjdXRpb25FdmVudCgKICAgIC8vICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIC8vICAgICBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYXBwbGllZF9hdD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICBwYXlvZmY9cGF5b2ZmLAogICAgLy8gICAgIHBheW9mZl9zaWduPWFyYzQuVUludDgoCiAgICAvLyAgICAgICAgIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIC8vICAgICApLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PXNldHRsZWRfYW1vdW50LAogICAgLy8gICAgIGN1cnJlbmN5X2lkPXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAwCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzA0LTcxOQogICAgLy8gYXJjNC5lbWl0KAogICAgLy8gICAgIEV4ZWN1dGlvbkV2ZW50KAogICAgLy8gICAgICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgICAgIHBheW9mZj1wYXlvZmYsCiAgICAvLyAgICAgICAgIHBheW9mZl9zaWduPWFyYzQuVUludDgoCiAgICAvLyAgICAgICAgICAgICBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICAvLyAgICAgICAgICksCiAgICAvLyAgICAgICAgIHNldHRsZWRfYW1vdW50PXNldHRsZWRfYW1vdW50LAogICAgLy8gICAgICAgICBjdXJyZW5jeV9pZD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgICAgIHNlcXVlbmNlPWVudHJ5LmV2ZW50X2lkICsgVUludDY0KDEpLAogICAgLy8gICAgICkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDlhMzMyYjk1IC8vIG1ldGhvZCAiRXhlY3V0aW9uRXZlbnQodWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojc0NAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiAoVUludDY0KGVudW1zLkVWVF9JRUQpLCBVSW50NjQoZW51bXMuRVZUX1BJKSk6CiAgICBmcmFtZV9kaWcgNQogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBibnogX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2lmX2JvZHlANQogICAgZnJhbWVfZGlnIDUKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGJ6IF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pZl9lbHNlQDYKCl9lbWl0X2V4ZWN1dGlvbl9ldmVudF9pZl9ib2R5QDU6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3NDUKICAgIC8vIHJldHVybiBVSW50NjQoZW51bXMuUEFZT0ZGX1NJR05fUE9TSVRJVkUpCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzEzCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBiIF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pbmxpbmVkX21vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9wYXlvZmZfc2lnbkA3CgpfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzQ2CiAgICAvLyByZXR1cm4gVUludDY0KGVudW1zLlBBWU9GRl9TSUdOX05FR0FUSVZFKQogICAgcHVzaGludCAyNTUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjcxMwogICAgLy8gc2VsZi5fcGF5b2ZmX3NpZ24oZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSwgcGF5b2ZmKQogICAgYiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fcGF5b2ZmX3NpZ25ANwoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9yb2xlX2lzX2FjdGl2ZShyb2xlX21hcDogYnl0ZXMsIHJvbGVfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NDoKX3JvbGVfaXNfYWN0aXZlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU3CiAgICAvLyBkZWYgX3JvbGVfaXNfYWN0aXZlKHNlbGYsIHJvbGVfbWFwOiB0eXAuUmJhY1JvbGUsIHJvbGVfYWRkcmVzczogQWNjb3VudCkgLT4gYm9vbDoKICAgIHByb3RvIDIgMQogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5CiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5LTYwCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5LTYxCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjEKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAtNjEKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgPj0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX21lcmdlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKSAtPiB2b2lkOgpfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2NQogICAgLy8gYXNzZXJ0IHNlbGYuX2lzX2FycmFuZ2VyKFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTIKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgPT0gc2VsZi5hcnJhbmdlci52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE4IC8vIDB4NTIyMzQxNzI3MjYxNmU2NzY1NzIyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgPT0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2NQogICAgLy8gYXNzZXJ0IHNlbGYuX2lzX2FycmFuZ2VyKFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpIC0+IHZvaWQ6Cl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4MwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFzc2V0X2RlZmF1bHRlZCwgZXJyLkRFRkFVTFRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQxIC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfZGVmYXVsdGVkIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIERlZmF1bHRlZAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkgLT4gdm9pZDoKX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg2CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYXNzZXRfc3VzcGVuZGVkLCBlcnIuU1VTUEVOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzMgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9zdXNwZW5kZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gU3VzcGVuZGVkIG9wZXJhdGlvbnMKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkOiB1aW50NjQpIC0+IHZvaWQ6Cl9hc3NlcnRfdmFsaWRfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OAogICAgLy8gZGVmIF9hc3NlcnRfdmFsaWRfcm9sZShzZWxmLCByb2xlX2lkOiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTAKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIHB1c2hpbnQgMjAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkxCiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgcHVzaGludCAyNQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTIKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICBwdXNoaW50IDQwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MwogICAgLy8gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgcHVzaGludCA1MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTQKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgcHVzaGludCA2MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTUKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICBwdXNoaW50IDcwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NgogICAgLy8gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgcHVzaGludCA4MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfZmFsc2VAOAoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3OgogICAgaW50Y18xIC8vIDEKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX21lcmdlQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgcmV0c3ViCgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9mYWxzZUA4OgogICAgaW50Y18wIC8vIDAKICAgIGIgX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfbWVyZ2VAOQo=", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCAzMgogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1ICJzdGF0dXMiICJldmVudF9jdXJzb3IiICJvdXRzdGFuZGluZ19wcmluY2lwYWwiICJzY2hlZHVsZV9lbnRyeV9jb3VudCIgImZpeGVkX3BvaW50X3NjYWxlIiAiYWNjcnVlZF9pbnRlcmVzdCIgImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMgIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIgInJlc2VydmVkX3VuaXRzX3RvdGFsIiAicmVzZXJ2ZWRfcHJpbmNpcGFsIiAiY29udHJhY3RfdHlwZSIgInRvdGFsX3VuaXRzIiAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIgInJlc2VydmVkX2ludGVyZXN0IiAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIgImN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IiAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMgInNldHRsZW1lbnRfYXNzZXRfaWQiICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIgMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMgMHg1MjIzNTA3MjY5NmQ2MTcyNzk0NDY1NjE2YzY1NzIyMyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMgMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzIDB4NTIyMzRmNzA0NDYxNjU2ZDZmNmUyMyAiaW5pdGlhbF9leGNoYW5nZV9kYXRlIiAidHJhbnNmZXJfb3BlbmluZ19kYXRlIiAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIiAicmF0ZV9yZXNldF9mbG9vciIgInJhdGVfcmVzZXRfY2FwIiAweDUzMjMgMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMyAiYXNzZXRfc3VzcGVuZGVkIiAiZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiIgInJhdGVfcmVzZXRfc3ByZWFkIiAicmF0ZV9yZXNldF9tdWx0aXBsaWVyIiAicmF0ZV9yZXNldF9uZXh0IiAiaGFzX3JhdGVfcmVzZXRfZmxvb3IiICJoYXNfcmF0ZV9yZXNldF9jYXAiIDB4MDAgImFzc2V0X2RlZmF1bHRlZCIgInByb3NwZWN0dXNfaGFzaCIgInByb3NwZWN0dXNfdXJsIiAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIiAibWF0dXJpdHlfZGF0ZSIgImRheV9jb3VudF9jb252ZW50aW9uIiAweDA2ODEwMQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4LTI5CiAgICAvLyAjIFJCQUMgUm9sZXMKICAgIC8vIHNlbGYuYXJyYW5nZXIgPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX0FSUkFOR0VSKQogICAgYnl0ZWMgMTggLy8gMHg1MjIzNDE3MjcyNjE2ZTY3NjU3MjIzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzAKICAgIC8vIHNlbGYub3BfZGFlbW9uID0gR2xvYmFsU3RhdGUoQWNjb3VudCgpLCBrZXk9Y3N0LlBSRUZJWF9JRF9PUF9EQUVNT04pCiAgICBieXRlYyAyNSAvLyAweDUyMjM0ZjcwNDQ2MTY1NmQ2ZjZlMjMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo0Ny00OAogICAgLy8gIyBELUFTQSBHb3Zlcm5hbmNlCiAgICAvLyBzZWxmLmFzc2V0X3N1c3BlbmRlZCA9IEZhbHNlCiAgICBieXRlYyAzMyAvLyAiYXNzZXRfc3VzcGVuZGVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NDkKICAgIC8vIHNlbGYuYXNzZXRfZGVmYXVsdGVkID0gRmFsc2UKICAgIGJ5dGVjIDQxIC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU2LTU3CiAgICAvLyAjIENvbnRyYWN0CiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU4CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMTIgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYwLTYxCiAgICAvLyAjIFByb3NwZWN0dXMgKEluZm9ybWF0aW9uYWwpCiAgICAvLyBzZWxmLnByb3NwZWN0dXNfaGFzaCA9IEJ5dGVzKCkKICAgIGJ5dGVjIDQyIC8vICJwcm9zcGVjdHVzX2hhc2giCiAgICBwdXNoYnl0ZXMgMHgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2MgogICAgLy8gc2VsZi5wcm9zcGVjdHVzX3VybCA9IFN0cmluZygpCiAgICBieXRlYyA0MyAvLyAicHJvc3BlY3R1c191cmwiCiAgICBwdXNoYnl0ZXMgIiIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2NC02NQogICAgLy8gIyBEZW5vbWluYXRpb24KICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gQXNzZXQoKQogICAgYnl0ZWMgNDQgLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjYKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCA9IEFzc2V0KCkKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2OC02OQogICAgLy8gIyBUaW1lCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgMjYgLy8gImluaXRpYWxfZXhjaGFuZ2VfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzAKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgNDUgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjcxCiAgICAvLyBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgMjcgLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzIKICAgIC8vIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlID0gdHlwLlRpbWVTdGFtcCgpCiAgICBieXRlYyAyOCAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3NC03NQogICAgLy8gIyBEYXkgQ291bnQgQ29udmVudGlvbgogICAgLy8gc2VsZi5kYXlfY291bnRfY29udmVudGlvbiA9IFVJbnQ2NCgpCiAgICBieXRlYyA0NiAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojc3LTc4CiAgICAvLyAjIFVuaXRzCiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzID0gVUludDY0KCkKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzkKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPSBVSW50NjQoKQogICAgYnl0ZWMgMTAgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MS04MgogICAgLy8gIyBQcmluY2lwYWwKICAgIC8vIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPSBVSW50NjQoKQogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MwogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBVSW50NjQoKQogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4NAogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gVUludDY0KCkKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4NQogICAgLy8gc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gRmFsc2UKICAgIGJ5dGVjIDM0IC8vICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4Ny04OAogICAgLy8gIyBJbnRlcmVzdAogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gVUludDY0KCkKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojg5CiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgPSBVSW50NjQoKQogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTEtOTIKICAgIC8vICMgSW50ZXJlc3QgUmF0ZXMKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTMKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQgPSBVSW50NjQoKQogICAgYnl0ZWMgMzUgLy8gInJhdGVfcmVzZXRfc3ByZWFkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NAogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIgPSBVSW50NjQoKQogICAgYnl0ZWMgMzYgLy8gInJhdGVfcmVzZXRfbXVsdGlwbGllciIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTUKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9mbG9vciA9IFVJbnQ2NCgpCiAgICBieXRlYyAyOSAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTYKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9jYXAgPSBVSW50NjQoKQogICAgYnl0ZWMgMzAgLy8gInJhdGVfcmVzZXRfY2FwIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NwogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X25leHQgPSBVSW50NjQoKQogICAgYnl0ZWMgMzcgLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTgKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgPSBGYWxzZQogICAgYnl0ZWMgMzggLy8gImhhc19yYXRlX3Jlc2V0X2Zsb29yIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5OQogICAgLy8gc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgPSBGYWxzZQogICAgYnl0ZWMgMzkgLy8gImhhc19yYXRlX3Jlc2V0X2NhcCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTAxLTEwMgogICAgLy8gIyBQcmltYXJ5IERpc3RyaWJ1dGlvbgogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgPSBVSW50NjQoKQogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTAzCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0ID0gVUludDY0KCkKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA1LTEwNgogICAgLy8gIyBDdW11bGF0aXZlIFBlci1Vbml0IEZpeGVkLVBvaW50IEluZGV4ZXMKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA3CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4ID0gVUludDY0KCkKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTE1CiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciA9IFVJbnQ2NCgpCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExNgogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA9IFVJbnQ2NCgpCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTE4LTExOQogICAgLy8gIyBTY2FsaW5nCiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlID0gVUludDY0KCkKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6MjMKICAgIC8vIGFzc2VydCBUeG4uZ2xvYmFsX251bV9ieXRlX3NsaWNlID09IGNmZy5HTE9CQUxfQllURVMsIGVyci5XUk9OR19HTE9CQUxfQllURVMKICAgIHR4biBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgQnl0ZXMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjI0CiAgICAvLyBhc3NlcnQgVHhuLmdsb2JhbF9udW1fdWludCA9PSBjZmcuR0xPQkFMX1VJTlRTLCBlcnIuV1JPTkdfR0xPQkFMX1VJTlRTCiAgICB0eG4gR2xvYmFsTnVtVWludAogICAgcHVzaGludCAzNwogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgVUludHMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBhc3NlcnQgVHhuLmxvY2FsX251bV9ieXRlX3NsaWNlID09IGNmZy5MT0NBTF9CWVRFUywgZXJyLldST05HX0xPQ0FMX0JZVEVTCiAgICB0eG4gTG9jYWxOdW1CeXRlU2xpY2UKICAgICEKICAgIGFzc2VydCAvLyBXcm9uZyBMb2NhbCBCeXRlcyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6MjYKICAgIC8vIGFzc2VydCBUeG4ubG9jYWxfbnVtX3VpbnQgPT0gY2ZnLkxPQ0FMX1VJTlRTLCBlcnIuV1JPTkdfTE9DQUxfVUlOVFMKICAgIHR4biBMb2NhbE51bVVpbnQKICAgICEKICAgIGFzc2VydCAvLyBXcm9uZyBMb2NhbCBVSW50cyBhbGxvY2F0aW9uCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kX2FzYS9jb250cmFjdC5weTo4LTE4CiAgICAvLyBjbGFzcyBEQVNBKAogICAgLy8gICAgIFBheW1lbnRBZ2VudCwKICAgIC8vICAgICBUcmFuc2ZlckFnZW50LAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gICAgIGF2bV92ZXJzaW9uPTEyLAogICAgLy8gKToKICAgIHB1c2hieXRlcyAweDkxNGYwNGViIC8vIG1ldGhvZCAiY29udHJhY3RfdXBkYXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9jb250cmFjdF91cGRhdGVfcm91dGVANAoKbWFpbl9zd2l0Y2hfY2FzZV9uZXh0QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6OC0xOAogICAgLy8gY2xhc3MgREFTQSgKICAgIC8vICAgICBQYXltZW50QWdlbnQsCiAgICAvLyAgICAgVHJhbnNmZXJBZ2VudCwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBhdm1fdmVyc2lvbj0xMiwKICAgIC8vICk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBieiBtYWluX2NyZWF0ZV9Ob09wQDMxCiAgICBwdXNoYnl0ZXNzIDB4YjQ0NjE4YzggMHhlNzgzMjUyOSAweDdlYTIwZTBiIDB4NmM4NWUzZWUgMHhiZGQxYTk0NCAweGRjMDYzYjM1IDB4MTRmYzEwZWYgMHg3NGE3Mjk3ZiAweDA5ZDRmZTE0IDB4OWE5YmZhODUgMHg4NWVlZDMzZCAweDkxODUxMDRhIDB4ZDlmMjI1YWMgMHg2ZTBlNWM5NSAweGZmM2ZkNGIzIDB4ODJmNzFiMmQgMHhlZjA0ZjVkMyAweGRmMzQzNTUwIDB4M2RiZTgwYmQgMHhkZjU0ZTgyYyAweDAxMGM4Mjk5IDB4NzQwNmFjZDIgMHgxYTcyYTJlZSAvLyBtZXRob2QgImZ1bmRfZHVlX2Nhc2hmbG93cyh1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJjbGFpbV9kdWVfY2FzaGZsb3dzKGFkZHJlc3MsYnl0ZVtdKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYnl0ZVtdKSIsIG1ldGhvZCAic2V0X3RyYW5zZmVyX3NjaGVkdWxlKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbihhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInRyYW5zZmVyKGFkZHJlc3MsYWRkcmVzcyx1aW50NjQpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X2dvdl9zdXNwZW5zaW9uKGFkZHJlc3MsYm9vbCl1aW50NjQiLCBtZXRob2QgImFjY291bnRfb3BlbihhZGRyZXNzLGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X3VwZGF0ZV9wYXltZW50X2FkZHJlc3MoYWRkcmVzcyxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAiYWNjb3VudF9nZXRfcG9zaXRpb24oYWRkcmVzcykoYWRkcmVzcyx1aW50NjQsdWludDY0LGJvb2wsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImNvbnRyYWN0X2NvbmZpZygodWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYm9vbCxib29sLGJvb2wsdWludDY0KSwodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpLChieXRlWzMyXSxzdHJpbmcpKXVpbnQ2NCIsIG1ldGhvZCAiY29udHJhY3Rfc2NoZWR1bGUodWludDY0LGJvb2wsKHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpW10pdWludDY0IiwgbWV0aG9kICJleGVjdXRlX2llZCgpdWludDY0IiwgbWV0aG9kICJhcHBseV9ub25fY2FzaF9ldmVudCh1aW50NjQsKHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSl1aW50NjQiLCBtZXRob2QgImdldF9jb250cmFjdF9zdGF0ZSgpKHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJnZXRfbmV4dF9kdWVfZXZlbnQoKSh1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAicmJhY19yb3RhdGVfYXJyYW5nZXIoYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgInJiYWNfc2V0X29wX2RhZW1vbihhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19hc3NpZ25fcm9sZSh1aW50OCxhZGRyZXNzLCh1aW50NjQsdWludDY0KSl1aW50NjQiLCBtZXRob2QgInJiYWNfcmV2b2tlX3JvbGUodWludDgsYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgInJiYWNfZ292X2Fzc2V0X3N1c3BlbnNpb24oYm9vbCl1aW50NjQiLCBtZXRob2QgInJiYWNfZ2V0X2FycmFuZ2VyKClhZGRyZXNzIiwgbWV0aG9kICJyYmFjX2dldF9hZGRyZXNzX3JvbGVzKGFkZHJlc3MpKGJvb2wsYm9vbCxib29sLGJvb2wsYm9vbCkiLCBtZXRob2QgInJiYWNfZ2V0X3JvbGVfdmFsaWRpdHkodWludDgsYWRkcmVzcykodWludDY0LHVpbnQ2NCkiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBmdW5kX2R1ZV9jYXNoZmxvd3MgY2xhaW1fZHVlX2Nhc2hmbG93cyBzZXRfdHJhbnNmZXJfc2NoZWR1bGUgcHJpbWFyeV9kaXN0cmlidXRpb24gdHJhbnNmZXIgYWNjb3VudF9nb3Zfc3VzcGVuc2lvbiBhY2NvdW50X29wZW4gYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzIGFjY291bnRfZ2V0X3Bvc2l0aW9uIGNvbnRyYWN0X2NvbmZpZyBjb250cmFjdF9zY2hlZHVsZSBleGVjdXRlX2llZCBhcHBseV9ub25fY2FzaF9ldmVudCBnZXRfY29udHJhY3Rfc3RhdGUgZ2V0X25leHRfZHVlX2V2ZW50IHJiYWNfcm90YXRlX2FycmFuZ2VyIHJiYWNfc2V0X29wX2RhZW1vbiByYmFjX2Fzc2lnbl9yb2xlIHJiYWNfcmV2b2tlX3JvbGUgcmJhY19nb3ZfYXNzZXRfc3VzcGVuc2lvbiByYmFjX2dldF9hcnJhbmdlciByYmFjX2dldF9hZGRyZXNzX3JvbGVzIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHkKICAgIGVycgoKbWFpbl9jcmVhdGVfTm9PcEAzMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kX2FzYS9jb250cmFjdC5weTo4LTE4CiAgICAvLyBjbGFzcyBEQVNBKAogICAgLy8gICAgIFBheW1lbnRBZ2VudCwKICAgIC8vICAgICBUcmFuc2ZlckFnZW50LAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gICAgIGF2bV92ZXJzaW9uPTEyLAogICAgLy8gKToKICAgIHB1c2hieXRlcyAweDk1NmQ3MTU2IC8vIG1ldGhvZCAiY29udHJhY3RfY3JlYXRlKGFkZHJlc3MpdWludDY0IgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggY29udHJhY3RfY3JlYXRlCiAgICBlcnIKCm1haW5fY29udHJhY3RfdXBkYXRlX3JvdXRlQDQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBwdXNoaW50IDQgLy8gVXBkYXRlQXBwbGljYXRpb24KICAgID09CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydAogICAgYiBjb250cmFjdF91cGRhdGUKCgovLyBtb2R1bGVzLnBheW1lbnRfYWdlbnQuUGF5bWVudEFnZW50LmZ1bmRfZHVlX2Nhc2hmbG93c1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmZ1bmRfZHVlX2Nhc2hmbG93czoKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gMTAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjUwCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo1MQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo1MgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNDcKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NTUKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NTYtNTcKICAgIC8vIGZ1bmRlZF9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgLy8gZnVuZGVkX3ByaW5jaXBhbCA9IFVJbnQ2NCgwKQogICAgZHVwbiAyCgpmdW5kX2R1ZV9jYXNoZmxvd3Nfd2hpbGVfdG9wQDI6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjAKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgPCBtYXhfZXZlbnRfY291bnQKICAgIGRpZyAyCiAgICBkaWcgNAogICAgPAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjYwLTYxCiAgICAvLyBwcm9jZXNzZWRfZXZlbnRzIDwgbWF4X2V2ZW50X2NvdW50CiAgICAvLyBhbmQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAOQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjYxCiAgICAvLyBhbmQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIDwKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2MC02MQogICAgLy8gcHJvY2Vzc2VkX2V2ZW50cyA8IG1heF9ldmVudF9jb3VudAogICAgLy8gYW5kIHNlbGYuZXZlbnRfY3Vyc29yIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudAogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDkKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2MwogICAgLy8gZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoc2VsZi5ldmVudF9jdXJzb3IpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgZHVwCiAgICBidXJ5IDE3CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjQKICAgIC8vIGlmIGVudHJ5LnNjaGVkdWxlZF90aW1lID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXA6CiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgNgogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPgogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl93aGlsZUA5CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjYKICAgIC8vIGlmIG5vdCBzZWxmLl9ldmVudF9pc19jYXNoKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkpOgogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBidXJ5IDE2CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozNTEKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgaW50Y18yIC8vIDgKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjM1MC0zNTQKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX01EKSwKICAgIC8vICkKICAgID09CiAgICBkdXAKICAgIGJ1cnkgNwogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX3RydWVANTAKICAgIGRpZyAxNAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzUyCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzUwLTM1NAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfTUQpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDUwCiAgICBkaWcgMTQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjM1MwogICAgLy8gVUludDY0KGVudW1zLkVWVF9NRCksCiAgICBwdXNoaW50IDE5CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozNTAtMzU0CiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9NRCksCiAgICAvLyApCiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VANTEKCmZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX3RydWVANTA6CiAgICBpbnRjXzEgLy8gMQoKZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfbWVyZ2VANTI6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjYKICAgIC8vIGlmIG5vdCBzZWxmLl9ldmVudF9pc19jYXNoKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkpOgogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDkKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU0OAogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X2lkID09IHNlbGYuZXZlbnRfY3Vyc29yLCBlcnIuSU5WQUxJRF9FVkVOVF9DVVJTT1IKICAgIGRpZyAxNQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBjdXJzb3IKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU0OQogICAgLy8gYXNzZXJ0IGVudHJ5LnNjaGVkdWxlZF90aW1lIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLCBlcnIuTk9fRFVFX0NBU0hGTE9XCiAgICBkaWcgNAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPD0KICAgIGFzc2VydCAvLyBObyBkdWUgY2FzaGZsb3cgdG8gcGF5CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0MTMKICAgIC8vIGlmIGV2ZW50X3R5cGUgbm90IGluIChVSW50NjQoZW51bXMuRVZUX0lQKSwgVUludDY0KGVudW1zLkVWVF9NRCkpOgogICAgZGlnIDUKICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxMwogICAgZGlnIDE0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDEzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0MTQKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDEzCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfaW50ZXJlc3RfYW1vdW50QDE0OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDI2CiAgICAvLyBldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBidXJ5IDE2CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0MjcKICAgIC8vIGlmIGV2ZW50X3R5cGUgbm90IGluIChVSW50NjQoZW51bXMuRVZUX1BSKSwgVUludDY0KGVudW1zLkVWVF9NRCkpOgogICAgcHVzaGludCAzCiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE3CiAgICBkaWcgMTQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTcKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQyOAogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnRAMjY6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1NTMKICAgIC8vIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGRpZyAxNQogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgMTAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU1NgogICAgLy8gaWYgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCk6CiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUAyNwogICAgZGlnIDkKICAgIGJ1cnkgMTEKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM2OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTcyLTU3NAogICAgLy8gIyBGdW5kaW5nIHVzZXMgcGVyLXVuaXQgY3VtdWxhdGl2ZSBpbmRpY2VzIHNvIGVhY2ggaG9sZGVyIGNhbiBzZXR0bGUKICAgIC8vICMgaW5kZXBlbmRlbnRseSBmcm9tIGl0cyBjdXJyZW50IHVuaXQgYmFsYW5jZS4KICAgIC8vIGludGVyZXN0X2luZGV4X2RlbHRhID0gc2VsZi5fYW1vdW50X3RvX2luZGV4X2RlbHRhKGludGVyZXN0X2Ftb3VudF9kdWUpCiAgICBkaWcgMTIKICAgIGNhbGxzdWIgX2Ftb3VudF90b19pbmRleF9kZWx0YQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTc1CiAgICAvLyBwcmluY2lwYWxfaW5kZXhfZGVsdGEgPSBzZWxmLl9hbW91bnRfdG9faW5kZXhfZGVsdGEocHJpbmNpcGFsX2Ftb3VudF9kdWUpCiAgICBkaWcgOAogICAgY2FsbHN1YiBfYW1vdW50X3RvX2luZGV4X2RlbHRhCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1NzYKICAgIC8vIGludGVyZXN0X2Ftb3VudCA9IHNlbGYuX2luZGV4X2RlbHRhX3RvX2Ftb3VudChpbnRlcmVzdF9pbmRleF9kZWx0YSkKICAgIGRpZyAxCiAgICBjYWxsc3ViIF9pbmRleF9kZWx0YV90b19hbW91bnQKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSAxNwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTc3CiAgICAvLyBwcmluY2lwYWxfYW1vdW50ID0gc2VsZi5faW5kZXhfZGVsdGFfdG9fYW1vdW50KHByaW5jaXBhbF9pbmRleF9kZWx0YSkKICAgIGR1cAogICAgY2FsbHN1YiBfaW5kZXhfZGVsdGFfdG9fYW1vdW50CiAgICBkdXAKICAgIGJ1cnkgMTMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU3OAogICAgLy8gcmVxdWlyZWRfYW1vdW50ID0gaW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudAogICAgZGlnIDIKICAgIGRpZyAxCiAgICArCiAgICBkdXAKICAgIGJ1cnkgMTIKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjcyNwogICAgLy8gYmFsYW5jZSA9IHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQ1NgogICAgLy8gcmV0dXJuIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgKyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIGRpZyAxCiAgICArCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3MjkKICAgIC8vIGFzc2VydCBiYWxhbmNlID49IHJlc2VydmVkX3RvdGFsLCBlcnIuTk9UX0VOT1VHSF9GVU5EUwogICAgZGlnIDIKICAgIGRpZyAxCiAgICA+PQogICAgYXNzZXJ0IC8vIE5vdCBlbm91Z2ggZnVuZHMgZm9yIHRoZSBwYXltZW50CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3MzAKICAgIC8vIHJldHVybiBiYWxhbmNlIC0gcmVzZXJ2ZWRfdG90YWwKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgLQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTgwCiAgICAvLyBzZWxmLl9hdmFpbGFibGVfc2V0dGxlbWVudF9mdW5kcygpID49IHJlcXVpcmVkX2Ftb3VudAogICAgdW5jb3ZlciAyCiAgICA+PQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTc5LTU4MQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLl9hdmFpbGFibGVfc2V0dGxlbWVudF9mdW5kcygpID49IHJlcXVpcmVkX2Ftb3VudAogICAgLy8gKSwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTgzCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0ICs9IGludGVyZXN0X2Ftb3VudAogICAgdW5jb3ZlciAzCiAgICArCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTg0CiAgICAvLyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCArPSBwcmluY2lwYWxfYW1vdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICArCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU4NQogICAgLy8gc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4ICs9IGludGVyZXN0X2luZGV4X2RlbHRhCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCBleGlzdHMKICAgIHVuY292ZXIgMgogICAgKwogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTg2CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4ICs9IHByaW5jaXBhbF9pbmRleF9kZWx0YQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCBleGlzdHMKICAgICsKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1ODcKICAgIC8vIGlmIGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkgPT0gVUludDY0KGVudW1zLkVWVF9QUik6CiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBwdXNoaW50IDMKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDM4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1ODgtNTg5CiAgICAvLyAjIEZvciBQUiwgdGhlIHBlcmlvZCBpbnRlcmVzdCBzdGF5cyBhY2NydWVkIHVudGlsIGEgbGF0ZXIgSVAgb3IgTUQuCiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgKz0gc2VsZi5fZW50cnlfaW50ZXJlc3Rfc2VnbWVudChlbnRyeSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBkaWcgMTYKICAgIGNhbGxzdWIgX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQKICAgIGJ1cnkgMTgKICAgICsKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzk6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1OTIKICAgIC8vIGlmIG5vdCBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKSBvciBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NCgKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlANDEKICAgIGRpZyAxNQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU5Mi01OTQKICAgIC8vIGlmIG5vdCBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKSBvciBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NCgKICAgIC8vICAgICBlbnVtcy5FVlRfTUQKICAgIC8vICk6CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDIKCmZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDQxOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTk1CiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBkaWcgMTUKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0MjoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU5NgogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgZGlnIDEwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTk3CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBuZXh0X2ludGVyZXN0X2Jhc2UKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBkaWcgMTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1OTgKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYwMAogICAgLy8gaWYgZW50cnkuZXZlbnRfdHlwZSA9PSBhcmM0LlVJbnQ4KAogICAgZGlnIDE1CiAgICBleHRyYWN0IDggMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjAwLTYwMgogICAgLy8gaWYgZW50cnkuZXZlbnRfdHlwZSA9PSBhcmM0LlVJbnQ4KAogICAgLy8gICAgIGVudW1zLkVWVF9NRAogICAgLy8gKSBhbmQgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPT0gVUludDY0KDApOgogICAgcHVzaGJ5dGVzIDB4MTMKICAgIGI9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYwMgogICAgLy8gKSBhbmQgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPT0gVUludDY0KDApOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2MDAtNjAyCiAgICAvLyBpZiBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoCiAgICAvLyAgICAgZW51bXMuRVZUX01ECiAgICAvLyApIGFuZCBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9PSBVSW50NjQoMCk6CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYwMwogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX0VOREVEKQogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgcHVzaGludCAyMDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2MDQKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDU6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2MDYtNjEwCiAgICAvLyBzZWxmLl9lbWl0X2V4ZWN1dGlvbl9ldmVudCgKICAgIC8vICAgICBlbnRyeT1lbnRyeSwKICAgIC8vICAgICBwYXlvZmY9aW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudCwKICAgIC8vICAgICBzZXR0bGVkX2Ftb3VudD1pbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50LAogICAgLy8gKQogICAgZGlnIDE1CiAgICBkaWcgNwogICAgZHVwCiAgICBjYWxsc3ViIF9lbWl0X2V4ZWN1dGlvbl9ldmVudAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzAKICAgIC8vIGZ1bmRlZF9pbnRlcmVzdCArPSBpbnRlcmVzdF9hbW91bnQKICAgIGRpZyAxCiAgICBkaWcgMTQKICAgICsKICAgIGJ1cnkgMgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjcxCiAgICAvLyBmdW5kZWRfcHJpbmNpcGFsICs9IHByaW5jaXBhbF9hbW91bnQKICAgIGR1cAogICAgZGlnIDkKICAgICsKICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjcyCiAgICAvLyBwcm9jZXNzZWRfZXZlbnRzICs9IFVJbnQ2NCgxKQogICAgZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDMKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX3doaWxlX3RvcEAyCgpmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDM4OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTkxCiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzkKCmZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDI3OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTU3CiAgICAvLyBldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBidXJ5IDE2CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1NTgtNTYwCiAgICAvLyAjIER5bmFtaWMgYW5udWl0aWVzIGRlcml2ZSBuZXh0IHN0YXRlIGZyb20gdGhlIHBheW1lbnQgZGVjb21wb3NpdGlvbiwKICAgIC8vICMgbm90IG9ubHkgZnJvbSB0aGUgcHJlY29tcHV0ZWQgYG5leHRfKmAgZmllbGRzLgogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1BSKToKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19lbHNlX2JvZHlAMjkKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU2MgogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgLSBwcmluY2lwYWxfYW1vdW50X2R1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBkaWcgOAogICAgLQogICAgZHVwCiAgICBidXJ5IDExCiAgICBidXJ5IDExCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDI5OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTY1CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9JUCk6CiAgICBkaWcgMTQKICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUAzMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTY2CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGJ1cnkgMTEKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU2NwogICAgLy8gbmV4dF9pbnRlcmVzdF9iYXNlID0gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBidXJ5IDEyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIGV4aXN0cwogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzNgoKZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUAzMToKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU2OAogICAgLy8gZWxpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfTUQpOgogICAgZGlnIDE0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDMyCiAgICBkaWcgOQogICAgYnVyeSAxMQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzNgoKZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlAMzI6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1NjkKICAgIC8vIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAxMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTcwCiAgICAvLyBuZXh0X2ludGVyZXN0X2Jhc2UgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDExCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNzoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQyOQogICAgLy8gaWYgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCk6CiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDI1CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0MzAKICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCk6CiAgICBkaWcgMTQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDMxCiAgICAvLyByZXR1cm4gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1NTIKICAgIC8vIHByaW5jaXBhbF9hbW91bnRfZHVlID0gc2VsZi5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudChlbnRyeSkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnRAMjYKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDIwOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDMyCiAgICAvLyBpbnRlcmVzdF9kdWUgPSBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgKyBzZWxmLl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KGVudHJ5KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgIGRpZyAxNgogICAgY2FsbHN1YiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudAogICAgYnVyeSAxOAogICAgKwogICAgZHVwCiAgICBidXJ5IDEzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0MzMKICAgIC8vIGlmIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA8PSBpbnRlcmVzdF9kdWU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiBleGlzdHMKICAgID49CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyMgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDM0CiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1NTIKICAgIC8vIHByaW5jaXBhbF9hbW91bnRfZHVlID0gc2VsZi5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudChlbnRyeSkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnRAMjYKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDIyOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDM1CiAgICAvLyBwcmluY2lwYWxfYW1vdW50ID0gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIC0gaW50ZXJlc3RfZHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiBleGlzdHMKICAgIGRpZyAxMgogICAgLQogICAgZHVwCiAgICBidXJ5IDEwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0MzYKICAgIC8vIGlmIHByaW5jaXBhbF9hbW91bnQgPiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgPgogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQzNwogICAgLy8gcmV0dXJuIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTUyCiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyNDoKICAgIGRpZyA4CiAgICBidXJ5IDgKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyNgoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjU6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0NDAKICAgIC8vIGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsIDw9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBkaWcgMTUKICAgIHB1c2hpbnQgNDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGR1cDIKICAgIDw9CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0MzktNDQxCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsIDw9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQ0MgogICAgLy8gcmV0dXJuIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIC0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIHN3YXAKICAgIC0KICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTUyCiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQxNQogICAgLy8gcmV0dXJuIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCArIHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZGlnIDE2CiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBidXJ5IDE4CiAgICArCiAgICBidXJ5IDEzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1NTEKICAgIC8vIGludGVyZXN0X2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9pbnRlcmVzdF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9pbnRlcmVzdF9hbW91bnRAMTQKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl93aGlsZUA5OgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojc0CiAgICAvLyBhc3NlcnQgcHJvY2Vzc2VkX2V2ZW50cyA+IFVJbnQ2NCgwKSwgZXJyLk5PX0RVRV9DQVNIRkxPVwogICAgZGlnIDIKICAgIGR1cAogICAgYXNzZXJ0IC8vIE5vIGR1ZSBjYXNoZmxvdyB0byBwYXkKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3OAogICAgLy8gdG90YWxfZnVuZGVkPWZ1bmRlZF9pbnRlcmVzdCArIGZ1bmRlZF9wcmluY2lwYWwsCiAgICBkaWcgMgogICAgZHVwCiAgICBkaWcgMwogICAgZHVwCiAgICBjb3ZlciAzCiAgICArCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODAKICAgIC8vIHRpbWVzdGFtcD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3NS04MQogICAgLy8gcmV0dXJuIHR5cC5DYXNoRnVuZGluZ1Jlc3VsdCgKICAgIC8vICAgICBmdW5kZWRfaW50ZXJlc3Q9ZnVuZGVkX2ludGVyZXN0LAogICAgLy8gICAgIGZ1bmRlZF9wcmluY2lwYWw9ZnVuZGVkX3ByaW5jaXBhbCwKICAgIC8vICAgICB0b3RhbF9mdW5kZWQ9ZnVuZGVkX2ludGVyZXN0ICsgZnVuZGVkX3ByaW5jaXBhbCwKICAgIC8vICAgICBwcm9jZXNzZWRfZXZlbnRzPXByb2Nlc3NlZF9ldmVudHMsCiAgICAvLyAgICAgdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUA1MToKICAgIGludGNfMCAvLyAwCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDUyCgoKLy8gbW9kdWxlcy5wYXltZW50X2FnZW50LlBheW1lbnRBZ2VudC5jbGFpbV9kdWVfY2FzaGZsb3dzW3JvdXRpbmddKCkgLT4gdm9pZDoKY2xhaW1fZHVlX2Nhc2hmbG93czoKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNAogICAgLy8gaWYgc2VsZi5vcF9kYWVtb24udmFsdWUgIT0gR2xvYmFsLnplcm9fYWRkcmVzczoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNSAvLyAweDUyMjM0ZjcwNDQ2MTY1NmQ2ZjZlMjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcF9kYWVtb24gZXhpc3RzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBieiBjbGFpbV9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTcKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNgogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI1IC8vIDB4NTIyMzRmNzA0NDYxNjU2ZDZmNmUyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wX2RhZW1vbiBleGlzdHMKICAgID09CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTYtMTgKICAgIC8vIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICAvLyBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgYm56IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDE0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTcKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNi0xOAogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICBibnogY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX3RydWVAMTQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxOAogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIHR4biBTZW5kZXIKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDMyCiAgICA9PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE2LTE4CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAxNQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX3RydWVAMTQ6CiAgICBpbnRjXzEgLy8gMQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDE2OgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE1LTE5CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vICAgICBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gICAgIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICAvLyApLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNzoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5NAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5NQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNDcKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6OTgKICAgIC8vIHNlbGYuX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQoaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDIKICAgIGR1cAogICAgY2FsbHN1YiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojk5CiAgICAvLyBzZWxmLl9zZXR0bGVfcG9zaXRpb24oaG9sZGluZ19hZGRyZXNzKQogICAgY2FsbHN1YiBfc2V0dGxlX3Bvc2l0aW9uCiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTcKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNsYWltYWJsZV9pbnRlcmVzdAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZHVwCiAgICBwdXNoaW50IDczCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBidXJ5IDgKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTgKICAgIC8vICsgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgZHVwCiAgICBwdXNoaW50IDgxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDgKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTctMTE4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jbGFpbWFibGVfaW50ZXJlc3QKICAgIC8vICsgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgdW5jb3ZlciAyCiAgICArCiAgICBkdXAKICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjEwMQogICAgLy8gYXNzZXJ0IHRvdGFsX2Ftb3VudCA+IFVJbnQ2NCgwKSwgZXJyLk5PX0RVRV9DQVNIRkxPVwogICAgYXNzZXJ0IC8vIE5vIGR1ZSBjYXNoZmxvdyB0byBwYXkKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLmlzX29wdGVkX2luKAogICAgZXh0cmFjdCAwIDMyCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MjUKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MjQtMjYKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5pc19vcHRlZF9pbigKICAgIC8vICAgICBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQKICAgIC8vICkKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MjQtMjcKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5pc19vcHRlZF9pbigKICAgIC8vICAgICBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQKICAgIC8vICkKICAgIC8vIGFuZCBub3Qgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkCiAgICBieiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VAMjQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNwogICAgLy8gYW5kIG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHB1c2hpbnQgMzg0CiAgICBnZXRiaXQKICAgIGJueiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VAMjQKICAgIGludGNfMSAvLyAxCgpjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfbWVyZ2VAMjU6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA2CiAgICAvLyBpZiBzZWxmLl9pc19wYXltZW50X2V4ZWN1dGFibGUoaG9sZGluZ19hZGRyZXNzKToKICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MzMKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICBzd2FwCiAgICBkaWcgMQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBvcHRlZCBpbnRvIGFzc2V0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MzMtMzQKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICAvLyA+PSBwYXltZW50X2Ftb3VudAogICAgZGlnIDUKICAgIGR1cAogICAgY292ZXIgMgogICAgPj0KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozMi0zNQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgLy8gICAgID49IHBheW1lbnRfYW1vdW50CiAgICAvLyApLCBlcnIuTk9UX0VOT1VHSF9GVU5EUwogICAgYXNzZXJ0IC8vIE5vdCBlbm91Z2ggZnVuZHMgZm9yIHRoZSBwYXltZW50CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA4CiAgICAvLyBzZWxmLl9wYXkoc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLCB0b3RhbF9hbW91bnQpCiAgICBkaWcgMgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZHVwCiAgICBleHRyYWN0IDAgMzIKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozOS00NAogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXJlY2VpdmVyLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1hbW91bnQsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0MwogICAgLy8gZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIGdsb2JhbCBNaW5UeG5GZWUKICAgIHVuY292ZXIgMwogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgc3dhcAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MzkKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozOS00NAogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXJlY2VpdmVyLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1hbW91bnQsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTI1LTEyNgogICAgLy8gIyBHZXQgdGhlIGNsYWltYWJsZSBhbW91bnRzIGJlZm9yZSByZXNldAogICAgLy8gaW50ZXJlc3RfYW1vdW50ID0gcG9zaXRpb24uY2xhaW1hYmxlX2ludGVyZXN0CiAgICBkdXAKICAgIHB1c2hpbnQgNzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgOQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEyNwogICAgLy8gcHJpbmNpcGFsX2Ftb3VudCA9IHBvc2l0aW9uLmNsYWltYWJsZV9wcmluY2lwYWwKICAgIGR1cAogICAgcHVzaGludCA4MQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMwogICAgYnVyeSA5CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTI5LTEzMAogICAgLy8gIyBSZXNldCB0aGUgcG9zaXRpb24ncyBjbGFpbWFibGUgYW1vdW50cwogICAgLy8gcG9zaXRpb24uY2xhaW1hYmxlX2ludGVyZXN0ID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgaXRvYgogICAgc3dhcAogICAgZGlnIDEKICAgIHJlcGxhY2UyIDczCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTMxCiAgICAvLyBwb3NpdGlvbi5jbGFpbWFibGVfcHJpbmNpcGFsID0gVUludDY0KDApCiAgICBzd2FwCiAgICByZXBsYWNlMiA4MQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzMgogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSBwb3NpdGlvbi5jb3B5KCkKICAgIHVuY292ZXIgMwogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzNAogICAgLy8gYXNzZXJ0IHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgPj0gaW50ZXJlc3RfYW1vdW50LCBlcnIuTk9UX0VOT1VHSF9GVU5EUwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCBleGlzdHMKICAgIGR1cAogICAgZGlnIDIKICAgID49CiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcyBmb3IgdGhlIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzUKICAgIC8vIGFzc2VydCBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCA+PSBwcmluY2lwYWxfYW1vdW50LCBlcnIuTk9UX0VOT1VHSF9GVU5EUwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIGV4aXN0cwogICAgZGlnIDMKICAgID49CiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcyBmb3IgdGhlIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzctMTM4CiAgICAvLyAjIFVwZGF0ZSB0aGUgZ2xvYmFsIHJlc2VydmVkIGludGVyZXN0IGFuZCBwcmluY2lwYWwgYW1vdW50cwogICAgLy8gc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCAtPSBpbnRlcmVzdF9hbW91bnQKICAgIHN3YXAKICAgIC0KICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTM5CiAgICAvLyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCAtPSBwcmluY2lwYWxfYW1vdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICBzd2FwCiAgICAtCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjExNAogICAgLy8gdG90YWxfYW1vdW50PWludGVyZXN0X2Ftb3VudCArIHByaW5jaXBhbF9hbW91bnQsCiAgICBkaWcgNQogICAgZHVwCiAgICBkaWcgNgogICAgZHVwCiAgICBjb3ZlciAzCiAgICArCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTE1CiAgICAvLyB0aW1lc3RhbXA9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTExLTExNwogICAgLy8gcmV0dXJuIHR5cC5DYXNoQ2xhaW1SZXN1bHQoCiAgICAvLyAgICAgaW50ZXJlc3RfYW1vdW50PWludGVyZXN0X2Ftb3VudCwKICAgIC8vICAgICBwcmluY2lwYWxfYW1vdW50PXByaW5jaXBhbF9hbW91bnQsCiAgICAvLyAgICAgdG90YWxfYW1vdW50PWludGVyZXN0X2Ftb3VudCArIHByaW5jaXBhbF9hbW91bnQsCiAgICAvLyAgICAgdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gICAgIGNvbnRleHQ9cGF5bWVudF9pbmZvLAogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZGlnIDIKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBwdXNoYnl0ZXMgMHgwMDIyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAyNDoKICAgIGludGNfMCAvLyAwCiAgICBiIGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUAyNQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX2ZhbHNlQDE1OgogICAgaW50Y18wIC8vIDAKICAgIGIgY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDE2CgoKLy8gbW9kdWxlcy50cmFuc2Zlcl9hZ2VudC5UcmFuc2ZlckFnZW50LnNldF90cmFuc2Zlcl9zY2hlZHVsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF90cmFuc2Zlcl9zY2hlZHVsZToKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToyNgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjI3CiAgICAvLyBhc3NlcnQgb3Blbl9kYXRlIDwgY2xvc3VyZV9kYXRlLCBlcnIuSU5WQUxJRF9TT1JUSU5HCiAgICBkdXAyCiAgICA8CiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbXVzdCBiZSBzb3J0ZWQgaW4gc3RyaWN0bHkgYXNjZW5kaW5nIG9yZGVyCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjI5CiAgICAvLyBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA9IG9wZW5fZGF0ZQogICAgYnl0ZWMgMjcgLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIHVuY292ZXIgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MzAKICAgIC8vIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlID0gY2xvc3VyZV9kYXRlCiAgICBieXRlYyAyOCAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MzEKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy50cmFuc2Zlcl9hZ2VudC5UcmFuc2ZlckFnZW50LnByaW1hcnlfZGlzdHJpYnV0aW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcHJpbWFyeV9kaXN0cmlidXRpb246CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjcxCiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5wcmltYXJ5X2RlYWxlciwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDIyIC8vIDB4NTIyMzUwNzI2OTZkNjE3Mjc5NDQ2NTYxNmM2NTcyMjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDMKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQ0CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDUKICAgIC8vIGFzc2VydCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBSSU1BUllfRElTVFJJQlVUSU9OX0NMT1NFRAogICAgYXNzZXJ0IC8vIFByaW1hcnkgZGlzdHJpYnV0aW9uIGlzIGNsb3NlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgY292ZXIgMwogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo0NwogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChob2xkaW5nX2FkZHJlc3MpCiAgICBzd2FwCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQ4CiAgICAvLyBhc3NlcnQgdW5pdHMgPiBVSW50NjQoMCksIGVyci5aRVJPX1VOSVRTCiAgICBkdXAKICAgIGFzc2VydCAvLyBDYW4gbm90IGRpc3RyaWJ1dGUgemVybyB1bml0cwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo1MAogICAgLy8gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCArIHVuaXRzIDw9IHNlbGYudG90YWxfdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICArCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgPD0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDktNTEKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCArIHVuaXRzIDw9IHNlbGYudG90YWxfdW5pdHMKICAgIC8vICksIGVyci5PVkVSX0RJU1RSSUJVVElPTgogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCByZW1haW5pbmcgRC1BU0EgdW5pdHMKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NTIKICAgIC8vIGlmIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI2IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlIGV4aXN0cwogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjU0CiAgICAvLyBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8PSBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI2IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlIGV4aXN0cwogICAgPD0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NTMtNTUKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPD0gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGUKICAgIC8vICksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TRUQKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBjbG9zZWQKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNDgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnJlc2VydmVkX3VuaXRzICs9IHVuaXRzCiAgICBkdXBuIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDMKICAgIGR1cAogICAgY292ZXIgMwogICAgKwogICAgaXRvYgogICAgcHVzaGludCA0MAogICAgc3dhcAogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NTgKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgKz0gdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICArCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NTkKICAgIC8vIHJldHVybiBzZWxmLnRvdGFsX3VuaXRzIC0gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIHN3YXAKICAgIC0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMudHJhbnNmZXJfYWdlbnQuVHJhbnNmZXJBZ2VudC50cmFuc2Zlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnRyYW5zZmVyOgogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo2MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NzUKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojc2CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE0NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTMKICAgIC8vIGlmIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI3IC8vICJ0cmFuc2Zlcl9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlIGV4aXN0cwogICAgYnogdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE1CiAgICAvLyBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI3IC8vICJ0cmFuc2Zlcl9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlIGV4aXN0cwogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPD0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTQtMTYKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICksIGVyci5DTE9TRURfVFJBTlNGRVIKICAgIGFzc2VydCAvLyBUcmFuc2ZlciBpcyBjbG9zZWQKCnRyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTcKICAgIC8vIGlmIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI4IC8vICJ0cmFuc2Zlcl9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgYnogdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE5CiAgICAvLyBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8IHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjggLy8gInRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICA8CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE4LTIwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDwgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGUKICAgIC8vICksIGVyci5DTE9TRURfVFJBTlNGRVIKICAgIGFzc2VydCAvLyBUcmFuc2ZlciBpcyBjbG9zZWQKCnRyYW5zZmVyX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODAKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIGRpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgOAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIGRpZyA1CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDkKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODMKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQoc2VuZGVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojg0CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGR1cAogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4NQogICAgLy8gYXNzZXJ0IHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MgIT0gcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzLCBlcnIuU0VMRl9UUkFOU0ZFUgogICAgdW5jb3ZlciAyCiAgICAhPQogICAgYXNzZXJ0IC8vIFNlbmRlciBhbmQgcmVjZWl2ZXIgbXVzdCBiZSBkaWZmZXJlbnQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODYKICAgIC8vIGFzc2VydCB1bml0cyA+IFVJbnQ2NCgwKSwgZXJyLk5VTExfVFJBTlNGRVIKICAgIGRpZyAxCiAgICBkdXAKICAgIGFzc2VydCAvLyBUcmFuc2ZlciB1bml0cyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojg3CiAgICAvLyBhc3NlcnQgdW5pdHMgPD0gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLCBlcnIuT1ZFUl9UUkFOU0ZFUgogICAgc3dhcAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIDw9CiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IHNlbmRlciB1bml0cyB0byB0cmFuc2ZlcgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzU2CiAgICAvLyBpZiBzZWxmLmV2ZW50X2N1cnNvciA+PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICA+PQogICAgYm56IHRyYW5zZmVyX2FmdGVyX2lubGluZWRfbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Fzc2VydF9ub19kdWVfZXZlbnRfcGVuZGluZ0AxMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzU4CiAgICAvLyBuZXh0X2VudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KHNlbGYuZXZlbnRfY3Vyc29yKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojc2MAogICAgLy8gbmV4dF9lbnRyeS5zY2hlZHVsZWRfdGltZSA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3NTktNzYxCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIG5leHRfZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gKSwgZXJyLlBFTkRJTkdfQUNUVVNfRVZFTlQKICAgIGFzc2VydCAvLyBBQ1RVUyBldmVudCBub3QgeWV0IGV4ZWN1dGVkCgp0cmFuc2Zlcl9hZnRlcl9pbmxpbmVkX21vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9hc3NlcnRfbm9fZHVlX2V2ZW50X3BlbmRpbmdAMTA6CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjkwCiAgICAvLyBzZWxmLl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBkaWcgMwogICAgZHVwCiAgICBjYWxsc3ViIF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjkxCiAgICAvLyBzZWxmLl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGRpZyAzCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGNhbGxzdWIgX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6OTIKICAgIC8vIHNlbGYuX3NldHRsZV9wb3NpdGlvbihzZW5kZXJfaG9sZGluZ19hZGRyZXNzKQogICAgY2FsbHN1YiBfc2V0dGxlX3Bvc2l0aW9uCiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6OTMKICAgIC8vIHNlbGYuX3NldHRsZV9wb3NpdGlvbihyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBjYWxsc3ViIF9zZXR0bGVfcG9zaXRpb24KICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE1MgogICAgLy8gYXNzZXJ0IHVuaXRzIDw9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLCBlcnIuT1ZFUl9UUkFOU0ZFUgogICAgZGlnIDUKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGRpZyAxCiAgICA8PQogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCBzZW5kZXIgdW5pdHMgdG8gdHJhbnNmZXIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNTMKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzIC09IHVuaXRzCiAgICBkaWcgMQogICAgLQogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBpbnRjXzMgLy8gMzIKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNDQKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzICs9IHVuaXRzCiAgICBkaWcgNQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgdW5jb3ZlciAyCiAgICArCiAgICBpdG9iCiAgICBpbnRjXzMgLy8gMzIKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgZGlnIDIKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF9nb3Zfc3VzcGVuc2lvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfZ292X3N1c3BlbnNpb246CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTY1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo3NwogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYXV0aG9yaXR5LCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjEgLy8gMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTg1CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGR1cAogICAgcHVzaGludCA0OAogICAgaW50Y18xIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIHB1c2hpbnQgNDgKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTg2CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfb3Blbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfb3BlbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2OAogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjMgLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQ0ZDYxNmU2MTY3NjU3MjIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMzkKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0VOREVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDIwMAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTAKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX2VuZGVkKCksIGVyci5VTkFVVEhPUklaRUQKICAgICEKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxMQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTIKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjEzCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzQKICAgIC8vIHVuaXRzPVVJbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzItNDIKICAgIC8vIHJldHVybiB0eXAuQWNjb3VudFBvc2l0aW9uKAogICAgLy8gICAgIHBheW1lbnRfYWRkcmVzcz1wYXltZW50X2FkZHJlc3MsCiAgICAvLyAgICAgdW5pdHM9VUludDY0KDApLAogICAgLy8gICAgIHJlc2VydmVkX3VuaXRzPVVJbnQ2NCgwKSwKICAgIC8vICAgICBzdXNwZW5kZWQ9RmFsc2UsCiAgICAvLyAgICAgc2V0dGxlZF9jdXJzb3I9VUludDY0KDApLAogICAgLy8gICAgIGludGVyZXN0X2NoZWNrcG9pbnQ9VUludDY0KDApLAogICAgLy8gICAgIHByaW5jaXBhbF9jaGVja3BvaW50PVVJbnQ2NCgwKSwKICAgIC8vICAgICBjbGFpbWFibGVfaW50ZXJlc3Q9VUludDY0KDApLAogICAgLy8gICAgIGNsYWltYWJsZV9wcmluY2lwYWw9VUludDY0KDApLAogICAgLy8gKQogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBieXRlYyA0MCAvLyAweDAwCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxNAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSBzZWxmLl9uZXdfYWNjb3VudF9wb3NpdGlvbihwYXltZW50X2FkZHJlc3MpCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjE1CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzczoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMzgKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcywgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgdW5jb3ZlciAzCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjM5CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0MAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDEKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcyA9IHBheW1lbnRfYWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDIKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF9nZXRfcG9zaXRpb25bcm91dGluZ10oKSAtPiB2b2lkOgphY2NvdW50X2dldF9wb3NpdGlvbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNTkKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9jcmVhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9jcmVhdGU6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5ODAKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSBhcnJhbmdlcgogICAgYnl0ZWMgMTggLy8gMHg1MjIzNDE3MjcyNjE2ZTY3NjU3MjIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTgxCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojk2OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfY29uZmlnW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfY29uZmlnOgogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojk4MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGxlbgogICAgcHVzaGludCAxMDcKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuTm9ybWFsaXplZEFjdHVzVGVybXMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDcyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLkluaXRpYWxLZXJuZWxTdGF0ZQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIGxlbgogICAgZGlnIDEKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgdHVwbGUgZW5jb2RpbmcKICAgIGR1cAogICAgcHVzaGludCAzNAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHRhaWwgcG9pbnRlciBhdCBpbmRleCAxIG9mICh1aW50OFszMl0sKGxlbit1dGY4W10pKQogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBjb3ZlciAzCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAzNgogICAgKwogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5Qcm9zcGVjdHVzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDEyCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwMTQtMTAxNQogICAgLy8gIyBDb25maWd1cmUgQ29udHJhY3QKICAgIC8vIHNlbGYuY29udHJhY3RfdHlwZSA9IHRlcm1zLmNvbnRyYWN0X3R5cGUuYXNfdWludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ5dGVjIDEyIC8vICJjb250cmFjdF90eXBlIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICBieiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjIwCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfQU5OKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMjEKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgcHVzaGludCAyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMjIKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMjMKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgcHVzaGludCA0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMjQKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYnogY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAOAoKY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUA3OgogICAgaW50Y18xIC8vIDEKCmNvbnRyYWN0X2NvbmZpZ19ib29sX21lcmdlQDk6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMjkKICAgIC8vIGFzc2VydCBzZWxmLl9pc19zdXBwb3J0ZWRfY29udHJhY3RfdHlwZShjb250cmFjdF90eXBlKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDE3CiAgICAvLyBzZWxmLl9zdG9yZV9jb250cmFjdF9jb25maWcoc2VsZi5jb250cmFjdF90eXBlLCB0ZXJtcywgaW5pdGlhbF9zdGF0ZSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBidXJ5IDIKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozMjUKICAgIC8vIGFzc2VydCB0ZXJtcy5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBkaWcgNAogICAgZHVwCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDgKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMyNwogICAgLy8gdGVybXMuZGF5X2NvdW50X2NvbnZlbnRpb24uYXNfdWludDY0KCkKICAgIHB1c2hpbnQgNTcKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyOTctMzAzCiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgIGJ6IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGRpZyA2CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyOTkKICAgIC8vIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGRpZyA2CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozMDAKICAgIC8vIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICBwdXNoaW50IDIKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI5Ny0zMDMKICAgIC8vIHJldHVybiBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzYwKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwSVNEQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjApLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDE2CiAgICBkaWcgNgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzAxCiAgICAvLyBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyOTctMzAzCiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgID09CiAgICBibnogY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUAxNgogICAgZGlnIDYKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMwMgogICAgLy8gVUludDY0KGVudW1zLkRDQ18zMEUzNjApLAogICAgcHVzaGludCA0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyOTctMzAzCiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgID09CiAgICBieiBjb250cmFjdF9jb25maWdfYm9vbF9mYWxzZUAxNwoKY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUAxNjoKICAgIGludGNfMSAvLyAxCgpjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUAxODoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMwOS0zMTEKICAgIC8vIGFzc2VydCBzZWxmLl9pc19zdXBwb3J0ZWRfZGF5X2NvdW50X2NvbnZlbnRpb24oCiAgICAvLyAgICAgZGF5X2NvdW50X2NvbnZlbnRpb24KICAgIC8vICksIGVyci5JTlZBTElEX0RBWV9DT1VOVF9DT05WRU5USU9OCiAgICBhc3NlcnQgLy8gSW52YWxpZCBkYXktY291bnQgY29udmVudGlvbiBJRAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzI5CiAgICAvLyBpZiBjb250cmFjdF90eXBlICE9IFVJbnQ2NChlbnVtcy5DVF9BTk4pOgogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgIT0KICAgIGJ6IGNvbnRyYWN0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDIwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozMzAKICAgIC8vIGFzc2VydCBub3QgdGVybXMuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBkaWcgNAogICAgcHVzaGludCA3ODYKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgoKY29udHJhY3RfY29uZmlnX2FmdGVyX2lmX2Vsc2VAMjA6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MDAKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MDEKICAgIC8vIGFzc2VydCBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID09IFVJbnQ2NCgwKSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBELUFTQSBhbHJlYWR5IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjgwMy04MDQKICAgIC8vICMgU2V0IERlbm9taW5hdGlvbiBBc3NldAogICAgLy8gc2VsZi5fYXNzZXJ0X2Rlbm9taW5hdGlvbl9hc3NldCh0ZXJtcy5kZW5vbWluYXRpb25fYXNzZXRfaWQpCiAgICBkaWcgNAogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojc2OC03NjkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gZGVub21pbmF0aW9uIHdpdGggQVNBCiAgICAvLyBfY3JlYXRvciwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfY3JlYXRvcihkZW5vbWluYXRpb25fYXNzZXRfaWQpCiAgICBkdXAKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojc3MAogICAgLy8gYXNzZXJ0IGV4aXN0cywgZXJyLklOVkFMSURfREVOT01JTkFUSU9OCiAgICBhc3NlcnQgLy8gRGVub21pbmF0aW9uIGFzc2V0IGlzIG5vdCBwcm9wZXJseSBzZXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojc3MwogICAgLy8gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgPSBkZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIGJ5dGVjIDQ0IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjgwNy04MDgKICAgIC8vICMgU2V0IFNldHRsZW1lbnQgQXNzZXQKICAgIC8vIHNlbGYuX2Fzc2VydF9zZXR0bGVtZW50X2Fzc2V0KHRlcm1zLnNldHRsZW1lbnRfYXNzZXRfaWQpCiAgICBkaWcgMQogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Nzc4CiAgICAvLyBzZXR0bGVtZW50X2Fzc2V0X2lkID09IHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgPT0KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojc3Ni03NzkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzZXR0bGVtZW50IGFzc2V0IGlzIHRoZSBkZW5vbWluYXRpb24gYXNzZXQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgLy8gKSwgZXJyLklOVkFMSURfU0VUVExFTUVOVF9BU1NFVAogICAgYXNzZXJ0IC8vIERpZmZlcmVudCBzZXR0bGVtZW50IGFzc2V0IG5vdCBzdXBwb3J0ZWQsIG11c3QgYmUgZXF1YWwgdG8gZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3ODIKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCA9IHNldHRsZW1lbnRfYXNzZXRfaWQKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3ODMtNzg5CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3ODgKICAgIC8vIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3ODYKICAgIC8vIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Nzg3CiAgICAvLyBhc3NldF9hbW91bnQ9MCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3ODMtNzg0CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojc4My03ODkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gc2V0dGxlbWVudCB3aXRoIEFTQQogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PTAsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MTEtODEyCiAgICAvLyAjIFVuaXRzCiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzID0gdGVybXMudG90YWxfdW5pdHMKICAgIGR1cAogICAgcHVzaGludCAxNwogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MTMKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDEwIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODE1LTgxNgogICAgLy8gIyBEYXktQ291bnQgQ29udmVudGlvbnMKICAgIC8vIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPSB0ZXJtcy5kYXlfY291bnRfY29udmVudGlvbi5hc191aW50NjQoKQogICAgYnl0ZWMgNDYgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgZGlnIDgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MTgtODE5CiAgICAvLyAjIFRpbWUKICAgIC8vIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlID0gdGVybXMuaW5pdGlhbF9leGNoYW5nZV9kYXRlCiAgICBkdXAKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAyNiAvLyAiaW5pdGlhbF9leGNoYW5nZV9kYXRlIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MjAKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IHRlcm1zLm1hdHVyaXR5X2RhdGUKICAgIGRpZyAxCiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNDUgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjgyMQogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gaW5pdGlhbF9zdGF0ZS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBkaWcgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBwdXNoaW50IDQ4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODIzLTgyNAogICAgLy8gIyBQcmluY2lwYWwKICAgIC8vIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPSB0ZXJtcy5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudAogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgZGlnIDEwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODI1CiAgICAvLyBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSB0ZXJtcy5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBkaWcgMwogICAgcHVzaGludCA3ODYKICAgIGdldGJpdAogICAgYnl0ZWMgMzQgLy8gImR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODI2CiAgICAvLyBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9IGluaXRpYWxfc3RhdGUub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBkaWcgMQogICAgcHVzaGludCAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjXzMgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MjgtODI5CiAgICAvLyAjIEludGVyZXN0CiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgPSBpbml0aWFsX3N0YXRlLmFjY3J1ZWRfaW50ZXJlc3QKICAgIGRpZyAxCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MzEtODMyCiAgICAvLyAjIEludGVyZXN0IFJhdGUKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gaW5pdGlhbF9zdGF0ZS5ub21pbmFsX2ludGVyZXN0X3JhdGUKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODMzCiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBpbml0aWFsX3N0YXRlLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UKICAgIGRpZyAxCiAgICBwdXNoaW50IDI0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MzQKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQgPSB0ZXJtcy5yYXRlX3Jlc2V0X3NwcmVhZAogICAgZGlnIDMKICAgIHB1c2hpbnQgNTgKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzNSAvLyAicmF0ZV9yZXNldF9zcHJlYWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODM1CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciA9IHRlcm1zLnJhdGVfcmVzZXRfbXVsdGlwbGllcgogICAgZGlnIDMKICAgIHB1c2hpbnQgNjYKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzNiAvLyAicmF0ZV9yZXNldF9tdWx0aXBsaWVyIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjgzNgogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X2Zsb29yID0gdGVybXMucmF0ZV9yZXNldF9mbG9vcgogICAgZGlnIDMKICAgIHB1c2hpbnQgNzQKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAyOSAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MzcKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9jYXAgPSB0ZXJtcy5yYXRlX3Jlc2V0X2NhcAogICAgZGlnIDMKICAgIHB1c2hpbnQgODIKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzMCAvLyAicmF0ZV9yZXNldF9jYXAiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODM4CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfbmV4dCA9IHRlcm1zLnJhdGVfcmVzZXRfbmV4dAogICAgZGlnIDMKICAgIHB1c2hpbnQgOTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzNyAvLyAicmF0ZV9yZXNldF9uZXh0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjgzOQogICAgLy8gc2VsZi5oYXNfcmF0ZV9yZXNldF9mbG9vciA9IHRlcm1zLmhhc19yYXRlX3Jlc2V0X2Zsb29yCiAgICBkaWcgMwogICAgcHVzaGludCA3ODQKICAgIGdldGJpdAogICAgYnl0ZWMgMzggLy8gImhhc19yYXRlX3Jlc2V0X2Zsb29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojg0MAogICAgLy8gc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgPSB0ZXJtcy5oYXNfcmF0ZV9yZXNldF9jYXAKICAgIGRpZyAzCiAgICBwdXNoaW50IDc4NQogICAgZ2V0Yml0CiAgICBieXRlYyAzOSAvLyAiaGFzX3JhdGVfcmVzZXRfY2FwIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojg0Mi04NDMKICAgIC8vICMgU2NhbGluZwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSA9IHRlcm1zLmZpeGVkX3BvaW50X3NjYWxlCiAgICB1bmNvdmVyIDMKICAgIHB1c2hpbnQgOTkKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4NDUtODQ2CiAgICAvLyAjIFNjaGVkdWxlIFByb2Nlc3NpbmcKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yID0gaW5pdGlhbF9zdGF0ZS5ldmVudF9jdXJzb3IKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4NDgtODQ5CiAgICAvLyAjIFBlci1Vbml0IEZpeGVkLVBvaW50IEluZGV4ZXMKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCA9IGluaXRpYWxfc3RhdGUuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleAogICAgZGlnIDEKICAgIHB1c2hpbnQgNTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4NTAKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggPSBpbml0aWFsX3N0YXRlLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4CiAgICBkaWcgMQogICAgcHVzaGludCA2NAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4NTItODUzCiAgICAvLyAjIFJlc2VydmVkIEFtb3VudCAoZm9yIGV4ZWN1dGVkIGNhc2hmbG93cykKICAgIC8vIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODU0CiAgICAvLyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODU2CiAgICAvLyBhc3NlcnQgdGVybXMuaW5pdGlhbF9leGNoYW5nZV9kYXRlID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsIGVyci5JTlZBTElEX0lFRAogICAgZGlnIDIKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgID4KICAgIGFzc2VydCAvLyBJRUQgbXVzdCBiZSBzZXQgaW4gdGhlIGZ1dHVyZQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODU3CiAgICAvLyBhc3NlcnQgdGVybXMuaW5pdGlhbF9leGNoYW5nZV9kYXRlID4gaW5pdGlhbF9zdGF0ZS5zdGF0dXNfZGF0ZSwgZXJyLklOVkFMSURfSUVECiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICA8CiAgICBhc3NlcnQgLy8gSUVEIG11c3QgYmUgc2V0IGluIHRoZSBmdXR1cmUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojg1OAogICAgLy8gYXNzZXJ0IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA8IHRlcm1zLm1hdHVyaXR5X2RhdGUsIGVyci5JTlZBTElEX0lFRAogICAgPAogICAgYXNzZXJ0IC8vIElFRCBtdXN0IGJlIHNldCBpbiB0aGUgZnV0dXJlCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDE5LTEwMjAKICAgIC8vICMgTm90YXJpemUgcHJvc3BlY3R1cyAob3B0aW9uYWwpCiAgICAvLyBzZWxmLnByb3NwZWN0dXNfaGFzaCA9IHByb3NwZWN0dXMuaGFzaC5ieXRlcwogICAgZGlnIDIKICAgIGV4dHJhY3QgMCAzMgogICAgYnl0ZWMgNDIgLy8gInByb3NwZWN0dXNfaGFzaCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDIxCiAgICAvLyBzZWxmLnByb3NwZWN0dXNfdXJsID0gcHJvc3BlY3R1cy51cmwKICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgYnl0ZWMgNDMgLy8gInByb3NwZWN0dXNfdXJsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwMjIKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNvbnRyYWN0X2NvbmZpZ19ib29sX2ZhbHNlQDE3OgogICAgaW50Y18wIC8vIDAKICAgIGIgY29udHJhY3RfY29uZmlnX2Jvb2xfbWVyZ2VAMTgKCmNvbnRyYWN0X2NvbmZpZ19ib29sX2ZhbHNlQDg6CiAgICBpbnRjXzAgLy8gMAogICAgYiBjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUA5CgoKLy8gbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3Rfc2NoZWR1bGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9zY2hlZHVsZToKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gMwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTAyNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBzd2FwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgMwogICAgZHVwCiAgICBwdXNoaW50IDY1CiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIHVuY292ZXIgMgogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8c21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5FeGVjdXRpb25TY2hlZHVsZUVudHJ5PgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTAzOQogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDQyCiAgICAvLyBjb250cmFjdF90eXBlPXNlbGYuY29udHJhY3RfdHlwZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBjb3ZlciAzCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODc0CiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIEQtQVNBIGFscmVhZHkgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODc1LTg3NwogICAgLy8gYXNzZXJ0IHNjaGVkdWxlX3BhZ2UubGVuZ3RoIDw9IFVJbnQ2NCgKICAgIC8vICAgICBjc3QuU0NIRURVTEVfUEFHRV9TSVpFCiAgICAvLyApLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBkdXAKICAgIHB1c2hpbnQgMTYKICAgIDw9CiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4NzgKICAgIC8vIGFzc2VydCBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID4gVUludDY0KDApLCBlcnIuVEVSTVNfTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMCAvLyAiaW5pdGlhbF9leGNoYW5nZV9hbW91bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0EgdGVybXMgbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojg4MAogICAgLy8gcGFnZV9jdXJzb3IgPSBzY2hlZHVsZV9wYWdlX2luZGV4ICogVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpCiAgICBzd2FwCiAgICBwdXNoaW50IDE2CiAgICAqCiAgICBzd2FwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4ODcKICAgIC8vICsgcGFnZV9sZW5ndGggKiBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19QRVJfRU5UUllfQlVER0VUKQogICAgcHVzaGludCAxMDAKICAgICoKICAgIHB1c2hpbnQgMTUxMAogICAgKwoKY29udHJhY3Rfc2NoZWR1bGVfd2hpbGVfdG9wQDI6CiAgICBkdXAKICAgIGdsb2JhbCBPcGNvZGVCdWRnZXQKICAgID4KICAgIGJ6IGNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX3doaWxlQDUKICAgIGl0eG5fYmVnaW4KICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBwdXNoaW50IDUgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICBieXRlYyA0NyAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW0KICAgIGJ5dGVjIDQ3IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBiIGNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEAyCgpjb250cmFjdF9zY2hlZHVsZV9hZnRlcl93aGlsZUA1OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODkwCiAgICAvLyBpbmRleCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTAKCmNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEA2OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODkxCiAgICAvLyB3aGlsZSBpbmRleCA8IHBhZ2VfbGVuZ3RoOgogICAgZGlnIDkKICAgIGRpZyA0CiAgICA8CiAgICBieiBjb250cmFjdF9zY2hlZHVsZV9hZnRlcl93aGlsZUAxNQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODkyLTg5MwogICAgLy8gZW50cnkgPSBzY2hlZHVsZV9wYWdlW2luZGV4XS5jb3B5KCkKICAgIC8vIGVudHJ5X2V2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBkaWcgNAogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgYnVyeSAxMwogICAgZGlnIDEwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgNjUKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODkzCiAgICAvLyBlbnRyeV9ldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4OTItODkzCiAgICAvLyBlbnRyeSA9IHNjaGVkdWxlX3BhZ2VbaW5kZXhdLmNvcHkoKQogICAgLy8gZW50cnlfZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGludGNfMiAvLyA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4OTMKICAgIC8vIGVudHJ5X2V2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBnZXRieXRlCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgMTQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojg5NAogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X2lkID09IHBhZ2VfY3Vyc29yICsgaW5kZXgsIGVyci5JTlZBTElEX0VWRU5UX0lECiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEzCiAgICBkaWcgNQogICAgdW5jb3ZlciA0CiAgICArCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4OTUtODk3CiAgICAvLyBzZWxmLl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBlbnRyeV9ldmVudF90eXBlCiAgICAvLyApCiAgICBkaWcgNQogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODk4CiAgICAvLyBhc3NlcnQgZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgc3dhcAogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4OTkKICAgIC8vIGlmIGVudHJ5LmV2ZW50X2lkID4gVUludDY0KDApOgogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxMgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTAwCiAgICAvLyBpZiBpbmRleCA+IFVJbnQ2NCgwKToKICAgIGRpZyA5CiAgICBieiBjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlAMTAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjkwMQogICAgLy8gcHJldmlvdXNfZW50cnkgPSBzY2hlZHVsZV9wYWdlW2luZGV4IC0gVUludDY0KDEpXS5jb3B5KCkKICAgIGRpZyA5CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgcHVzaGludCA2NQogICAgKgogICAgZGlnIDEyCiAgICBzd2FwCiAgICBwdXNoaW50IDY1CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTE6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5MTYKICAgIC8vIHByZXZpb3VzX2VudHJ5LnNjaGVkdWxlZF90aW1lIDw9IGVudHJ5LnNjaGVkdWxlZF90aW1lCiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgOAogICAgPD0KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjkxNS05MTcKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgcHJldmlvdXNfZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gZW50cnkuc2NoZWR1bGVkX3RpbWUKICAgIC8vICksIGVyci5JTlZBTElEX1NPUlRJTkcKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBtdXN0IGJlIHNvcnRlZCBpbiBzdHJpY3RseSBhc2NlbmRpbmcgb3JkZXIKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTI6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5MTgKICAgIC8vIGlmIGVudHJ5LmV2ZW50X2lkID09IFVJbnQ2NCgwKToKICAgIGRpZyA4CiAgICBibnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxNAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTE5LTkyMQogICAgLy8gYXNzZXJ0IGVudHJ5X2V2ZW50X3R5cGUgPT0gVUludDY0KAogICAgLy8gICAgIGVudW1zLkVWVF9JRUQKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZGlnIDEwCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTQ6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5MjIKICAgIC8vIGluZGV4ICs9IFVJbnQ2NCgxKQogICAgZGlnIDkKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEwCiAgICBiIGNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEA2Cgpjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlAMTA6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5MDMtOTA1CiAgICAvLyAjIFRoZSBmaXJzdCBlbnRyeSBvZiBhIHBhZ2UgbXVzdCBzdGlsbCBiZSBvcmRlcmVkIGFmdGVyIHRoZQogICAgLy8gIyBsYXN0IGVudHJ5IG9mIHRoZSBwcmV2aW91cyBwYWdlLgogICAgLy8gYXNzZXJ0IHNjaGVkdWxlX3BhZ2VfaW5kZXggPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0VWRU5UX0lECiAgICBkaWcgNgogICAgZHVwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBpZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTA2CiAgICAvLyBwcmV2aW91c19wYWdlX2luZGV4ID0gc2NoZWR1bGVfcGFnZV9pbmRleCAtIFVJbnQ2NCgxKQogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjkwOAogICAgLy8gcHJldmlvdXNfcGFnZV9pbmRleCBpbiBzZWxmLnNjaGVkdWxlX3BhZ2UKICAgIGl0b2IKICAgIGJ5dGVjIDMxIC8vIDB4NTMyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTA3LTkwOQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBwcmV2aW91c19wYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZQogICAgLy8gKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTEwLTkxMQogICAgLy8gcHJldmlvdXNfcGFnZSA9IHNlbGYuc2NoZWR1bGVfcGFnZVtwcmV2aW91c19wYWdlX2luZGV4XS5jb3B5KCkKICAgIC8vIGFzc2VydCBwcmV2aW91c19wYWdlLmxlbmd0aCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGludCAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTExCiAgICAvLyBhc3NlcnQgcHJldmlvdXNfcGFnZS5sZW5ndGggPiBVSW50NjQoMCksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGR1cAogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTEzCiAgICAvLyBwcmV2aW91c19wYWdlLmxlbmd0aCAtIFVJbnQ2NCgxKQogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjkxMi05MTQKICAgIC8vIHByZXZpb3VzX2VudHJ5ID0gcHJldmlvdXNfcGFnZVsKICAgIC8vICAgICBwcmV2aW91c19wYWdlLmxlbmd0aCAtIFVJbnQ2NCgxKQogICAgLy8gXS5jb3B5KCkKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgMgogICAgKwogICAgcHVzaGludCA2NQogICAgYm94X2V4dHJhY3QKICAgIGIgY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxMQoKY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfd2hpbGVAMTU6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMDAKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHNjaGVkdWxlX3BhZ2UuY29weSgpCiAgICBkaWcgNgogICAgaXRvYgogICAgYnl0ZWMgMzEgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBkaWcgNQogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTI1CiAgICAvLyBpZiBpc19sYXN0X3BhZ2U6CiAgICBkaWcgNQogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxNwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTI3CiAgICAvLyBzY2hlZHVsZV9wYWdlX2luZGV4ICogVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpICsgcGFnZV9sZW5ndGgKICAgIGRpZyAxCiAgICBkaWcgNAogICAgKwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTI2CiAgICAvLyBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50ID0gKAogICAgYnl0ZWMgNCAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5MjYtOTI4CiAgICAvLyBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50ID0gKAogICAgLy8gICAgIHNjaGVkdWxlX3BhZ2VfaW5kZXggKiBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkgKyBwYWdlX2xlbmd0aAogICAgLy8gKQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjkyOQogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgcHVzaGludCA1MAogICAgYXBwX2dsb2JhbF9wdXQKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTc6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDQ3CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwMjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmV4ZWN1dGVfaWVkW3JvdXRpbmddKCkgLT4gdm9pZDoKZXhlY3V0ZV9pZWQ6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA1NwogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDU4CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA1OQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwNjEKICAgIC8vIGFzc2VydCBzZWxmLmV2ZW50X2N1cnNvciA8IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICBkaWcgMQogICAgPgogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgY3Vyc29yCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDYyCiAgICAvLyBlbnRyeSA9IHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLmV2ZW50X2N1cnNvcikKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA2MwogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X3R5cGUgPT0gYXJjNC5VSW50OChlbnVtcy5FVlRfSUVEKSwgZXJyLklOVkFMSURfRVZFTlRfVFlQRQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgZHVwCiAgICBwdXNoYnl0ZXMgMHgwMQogICAgYj09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCB0eXBlCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDY3CiAgICAvLyBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIGRpZyAxCiAgICBleHRyYWN0IDAgOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA2OQogICAgLy8gc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICBkaWcgMgogICAgZXh0cmFjdCA5IDgKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwNzAKICAgIC8vIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgZGlnIDMKICAgIGV4dHJhY3QgMTcgOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA3MQogICAgLy8gcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZGlnIDQKICAgIGV4dHJhY3QgMjUgOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA3MwogICAgLy8gbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9ZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBkaWcgNQogICAgZXh0cmFjdCAzMyA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDc0CiAgICAvLyBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICBkaWcgNgogICAgZXh0cmFjdCA0MSA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDc1CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1lbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIGRpZyA3CiAgICBleHRyYWN0IDQ5IDgKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwNzYKICAgIC8vIGZsYWdzPWVudHJ5LmZsYWdzLAogICAgZGlnIDgKICAgIGV4dHJhY3QgNTcgOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA2Ni0xMDc3CiAgICAvLyB0eXAuT2JzZXJ2ZWRFdmVudFJlcXVlc3QoCiAgICAvLyAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBvYnNlcnZlZF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1lbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9ZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9ZW50cnkuZmxhZ3MsCiAgICAvLyApLAogICAgdW5jb3ZlciA3CiAgICB1bmNvdmVyIDgKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA3MgogICAgLy8gb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA2Ni0xMDc3CiAgICAvLyB0eXAuT2JzZXJ2ZWRFdmVudFJlcXVlc3QoCiAgICAvLyAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBvYnNlcnZlZF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1lbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9ZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9ZW50cnkuZmxhZ3MsCiAgICAvLyApLAogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwNjQtMTA3OAogICAgLy8gc2VsZi5fYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkoCiAgICAvLyAgICAgZW50cnksCiAgICAvLyAgICAgdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0KAogICAgLy8gICAgICAgICBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIC8vICAgICAgICAgZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgLy8gICAgICAgICBzY2hlZHVsZWRfdGltZT1lbnRyeS5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICAgICAgYWNjcnVhbF9mYWN0b3I9ZW50cnkuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICAgICAgb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPWVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPWVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgICAgICBmbGFncz1lbnRyeS5mbGFncywKICAgIC8vICAgICApLAogICAgLy8gKQogICAgY2FsbHN1YiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkKICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA3OQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDQ5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5hcHBseV9ub25fY2FzaF9ldmVudFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFwcGx5X25vbl9jYXNoX2V2ZW50OgogICAgaW50Y18wIC8vIDAKICAgIGR1cG4gNAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwODEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwbiAyCiAgICBsZW4KICAgIHB1c2hpbnQgNzMKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuT2JzZXJ2ZWRFdmVudFJlcXVlc3QKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDk1CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA5NgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwOTgKICAgIC8vIGlmIHBheWxvYWQuZmxhZ3MgJiBVSW50NjQoZW51bXMuRkxBR19PQlNFUlZFRF9FVkVOVCk6CiAgICBwdXNoaW50IDY1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBwdXNoaW50IDQKICAgICYKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjMzCiAgICAvLyByZXR1cm4gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9DTE0pCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIHB1c2hpbnQgNQogICAgPT0KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwOTkKICAgIC8vIGFzc2VydCBzZWxmLl9zdXBwb3J0c19vYnNlcnZlZF9ldmVudHMoKSwgZXJyLk9CU0VSVkVEX0VWRU5UX1JFUVVJUkVECiAgICBhc3NlcnQgLy8gT2JzZXJ2ZWQgZXZlbnQgcmVxdWlyZWQgdG8gZXhlY3V0ZSB0aGlzIGFjdGlvbgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEwMAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMzMKICAgIC8vIHJldHVybiBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0NMTSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgZHVwCiAgICBwdXNoaW50IDUKICAgID09CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5MzgKICAgIC8vIGFzc2VydCBzZWxmLl9zdXBwb3J0c19vYnNlcnZlZF9ldmVudHMoKSwgZXJyLk9CU0VSVkVEX0VWRU5UX1JFUVVJUkVECiAgICBhc3NlcnQgLy8gT2JzZXJ2ZWQgZXZlbnQgcmVxdWlyZWQgdG8gZXhlY3V0ZSB0aGlzIGFjdGlvbgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTM5CiAgICAvLyBhc3NlcnQgcGF5bG9hZC5ldmVudF9pZCA9PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LCBlcnIuSU5WQUxJRF9FVkVOVF9JRAogICAgZGlnIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgNwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NDEKICAgIC8vIHNlbGYuY29udHJhY3RfdHlwZSwgcGF5bG9hZC5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBkdXAKICAgIGV4dHJhY3QgOCAxCiAgICBidXJ5IDEyCiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTQwLTk0MgogICAgLy8gc2VsZi5fYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgc2VsZi5jb250cmFjdF90eXBlLCBwYXlsb2FkLmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIC8vICkKICAgIGNhbGxzdWIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NDQKICAgIC8vIHBhZ2VfaW5kZXggPSBzZWxmLl9zY2hlZHVsZV9wYWdlX2luZGV4KHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxOTAKICAgIC8vIHJldHVybiBldmVudF9pZCAvLyBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkKICAgIHB1c2hpbnQgMTYKICAgIC8KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojk0NQogICAgLy8gcGFnZSA9IHR5cC5FeGVjdXRpb25TY2hlZHVsZVBhZ2UoKQogICAgcHVzaGJ5dGVzIDB4MDAwMAogICAgYnVyeSA3CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NDYKICAgIC8vIGlmIHBhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlOgogICAgaXRvYgogICAgYnl0ZWMgMzEgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA5CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMjcKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojk0NwogICAgLy8gcGFnZSA9IHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XS5jb3B5KCkKICAgIGRpZyA3CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidXJ5IDcKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX3BhZ2UgZW50cnkgZXhpc3RzCgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDI3OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTQ4CiAgICAvLyBhc3NlcnQgcGFnZS5sZW5ndGggPCBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGRpZyA1CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgMTYKICAgIDwKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojk1MwogICAgLy8gc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIGRpZyAzCiAgICBkdXAKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NTQKICAgIC8vIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICBkaWcgMQogICAgZXh0cmFjdCAxNyA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NTUKICAgIC8vIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZGlnIDIKICAgIGV4dHJhY3QgMjUgOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTU2CiAgICAvLyBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDMKICAgIGV4dHJhY3QgNDEgOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTU3CiAgICAvLyBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIGRpZyA0CiAgICBleHRyYWN0IDQ5IDgKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojk1OAogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIHVuY292ZXIgNQogICAgZXh0cmFjdCA1NyA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NTAtOTYwCiAgICAvLyB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1wYXlsb2FkLmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9cGF5bG9hZC5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPXBheWxvYWQucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXBheWxvYWQubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICkKICAgIGRpZyAxMQogICAgaXRvYgogICAgZGlnIDE4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMwogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NDktOTYxCiAgICAvLyBwYWdlLmFwcGVuZCgKICAgIC8vICAgICB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9cGF5bG9hZC5ldmVudF9pZCwKICAgIC8vICAgICAgICAgZXZlbnRfdHlwZT1wYXlsb2FkLmV2ZW50X3R5cGUsCiAgICAvLyAgICAgICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIC8vICAgICAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICAgICApCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NjIKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHBhZ2UuY29weSgpCiAgICBkaWcgOAogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojk2MwogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTAzCiAgICAvLyBhc3NlcnQgZXZlbnRfaWQgPT0gc2VsZi5ldmVudF9jdXJzb3IsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBjdXJzb3IKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExMDQKICAgIC8vIGVudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KGV2ZW50X2lkKQogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEwNgogICAgLy8gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgYnVyeSAxMAogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozNjQKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzY1CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzYzLTM3MAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjM2NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9SUiksCiAgICBwdXNoaW50IDEyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzY3CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICBwdXNoaW50IDExCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzY4CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgcHVzaGludCAxOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzYzLTM3MAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjM2OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBieiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX2ZhbHNlQDE2CgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX3RydWVAMTU6CiAgICBpbnRjXzEgLy8gMQoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9tZXJnZUAxNzoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExMDUtMTEwNwogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2lzX25vbl9jYXNoKAogICAgLy8gICAgIGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIC8vICksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IHR5cGUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExMDgKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlICE9IGFyYzQuVUludDgoZW51bXMuRVZUX0lFRCksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGRpZyA4CiAgICBwdXNoYnl0ZXMgMHgwMQogICAgYiE9CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCB0eXBlCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozNzQKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluIChVSW50NjQoZW51bXMuRVZUX1JSKSwgVUludDY0KGVudW1zLkVWVF9SUkYpKQogICAgZGlnIDQKICAgIHB1c2hpbnQgMTIKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDIxCiAgICBkaWcgNAogICAgcHVzaGludCAxMQogICAgPT0KICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfZmFsc2VAMjIKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAyMToKICAgIGludGNfMSAvLyAxCgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX21lcmdlQDIzOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEwOQogICAgLy8gaWYgc2VsZi5fZXZlbnRfaXNfcmF0ZV9yZXNldChlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpKToKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Vsc2VfYm9keUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODAKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLm9ic2VydmVyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjQgLy8gMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTEzCiAgICAvLyBzZWxmLl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeShlbnRyeSwgcGF5bG9hZCkKICAgIGRpZyA2CiAgICBkaWcgMgogICAgY2FsbHN1YiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkKICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTExNAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDgxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Vsc2VfYm9keUA1OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTExMgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICBiIGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VANgoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9mYWxzZUAyMjoKICAgIGludGNfMCAvLyAwCiAgICBiIGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfbWVyZ2VAMjMKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfZmFsc2VAMTY6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX21lcmdlQDE3CgoKLy8gbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuZ2V0X2NvbnRyYWN0X3N0YXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2NvbnRyYWN0X3N0YXRlOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBkdXAKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEyMQogICAgLy8gY29udHJhY3RfdHlwZT1hcmM0LlVJbnQ4KHNlbGYuY29udHJhY3RfdHlwZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzIgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExMjMKICAgIC8vIHRvdGFsX3VuaXRzPXNlbGYudG90YWxfdW5pdHMsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEyNAogICAgLy8gcmVzZXJ2ZWRfdW5pdHNfdG90YWw9c2VsZi5yZXNlcnZlZF91bml0c190b3RhbCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTI1CiAgICAvLyBpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudD1zZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExMjYKICAgIC8vIGV2ZW50X2N1cnNvcj1zZWxmLmV2ZW50X2N1cnNvciwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEyNwogICAgLy8gc2NoZWR1bGVfZW50cnlfY291bnQ9c2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExMjgKICAgIC8vIG91dHN0YW5kaW5nX3ByaW5jaXBhbD1zZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEyOQogICAgLy8gaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZT1zZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEzMAogICAgLy8gbm9taW5hbF9pbnRlcmVzdF9yYXRlPXNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTMxCiAgICAvLyBhY2NydWVkX2ludGVyZXN0PXNlbGYuYWNjcnVlZF9pbnRlcmVzdCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTMyCiAgICAvLyBjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4PXNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEzMwogICAgLy8gY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXg9c2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTM0CiAgICAvLyByZXNlcnZlZF9pbnRlcmVzdD1zZWxmLnJlc2VydmVkX2ludGVyZXN0LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExMzUKICAgIC8vIHJlc2VydmVkX3ByaW5jaXBhbD1zZWxmLnJlc2VydmVkX3ByaW5jaXBhbCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExMjAtMTEzNgogICAgLy8gcmV0dXJuIHR5cC5LZXJuZWxTdGF0ZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlPWFyYzQuVUludDgoc2VsZi5jb250cmFjdF90eXBlKSwKICAgIC8vICAgICBzdGF0dXM9c2VsZi5zdGF0dXMsCiAgICAvLyAgICAgdG90YWxfdW5pdHM9c2VsZi50b3RhbF91bml0cywKICAgIC8vICAgICByZXNlcnZlZF91bml0c190b3RhbD1zZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsLAogICAgLy8gICAgIGluaXRpYWxfZXhjaGFuZ2VfYW1vdW50PXNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQsCiAgICAvLyAgICAgZXZlbnRfY3Vyc29yPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgLy8gICAgIHNjaGVkdWxlX2VudHJ5X2NvdW50PXNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQsCiAgICAvLyAgICAgb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2U9c2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlLAogICAgLy8gICAgIG5vbWluYWxfaW50ZXJlc3RfcmF0ZT1zZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBhY2NydWVkX2ludGVyZXN0PXNlbGYuYWNjcnVlZF9pbnRlcmVzdCwKICAgIC8vICAgICBjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4PXNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCwKICAgIC8vICAgICBjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleD1zZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4LAogICAgLy8gICAgIHJlc2VydmVkX2ludGVyZXN0PXNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QsCiAgICAvLyAgICAgcmVzZXJ2ZWRfcHJpbmNpcGFsPXNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsLAogICAgLy8gKQogICAgdW5jb3ZlciAxNAogICAgaXRvYgogICAgdW5jb3ZlciAxNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDEzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDEwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgOQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDgKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTE2CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5nZXRfbmV4dF9kdWVfZXZlbnRbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfbmV4dF9kdWVfZXZlbnQ6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTE0MgogICAgLy8gaWYgc2VsZi5ldmVudF9jdXJzb3IgPj0gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgPj0KICAgIGJ6IGdldF9uZXh0X2R1ZV9ldmVudF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExNDQKICAgIC8vIGV2ZW50X2lkPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTQzLTExNTMKICAgIC8vIHJldHVybiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1zZWxmLmV2ZW50X2N1cnNvciwKICAgIC8vICAgICBldmVudF90eXBlPWFyYzQuVUludDgoMCksCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9VUludDY0KDApLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9VUludDY0KDApLAogICAgLy8gICAgIGZsYWdzPVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGl0b2IKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExNDUKICAgIC8vIGV2ZW50X3R5cGU9YXJjNC5VSW50OCgwKSwKICAgIGJ5dGVjIDQwIC8vIDB4MDAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExNDMtMTE1MwogICAgLy8gcmV0dXJuIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgIGV2ZW50X2lkPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgLy8gICAgIGV2ZW50X3R5cGU9YXJjNC5VSW50OCgwKSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1VSW50NjQoMCksCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1VSW50NjQoMCksCiAgICAvLyAgICAgZmxhZ3M9VUludDY0KDApLAogICAgLy8gKQogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTQ2CiAgICAvLyBzY2hlZHVsZWRfdGltZT1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTE0My0xMTUzCiAgICAvLyByZXR1cm4gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkoCiAgICAvLyAgICAgZXZlbnRfaWQ9c2VsZi5ldmVudF9jdXJzb3IsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1hcmM0LlVJbnQ4KDApLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPVVJbnQ2NCgwKSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249VUludDY0KDApLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPVVJbnQ2NCgwKSwKICAgIC8vICAgICBmbGFncz1VSW50NjQoMCksCiAgICAvLyApCiAgICBpdG9iCiAgICBzd2FwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKCmdldF9uZXh0X2R1ZV9ldmVudF9hZnRlcl9pbmxpbmVkX21vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmdldF9uZXh0X2R1ZV9ldmVudEA0OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEzOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpnZXRfbmV4dF9kdWVfZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTE1NAogICAgLy8gcmV0dXJuIHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLmV2ZW50X2N1cnNvcikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgZ2V0X25leHRfZHVlX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuZ2V0X25leHRfZHVlX2V2ZW50QDQKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5jb250cmFjdF91cGRhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF91cGRhdGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTUzLTE1NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGdyYW50cyB0aGUgdXBkYXRlIHBlcm1pc3Npb25zIHRvIHRoZSBBcnJhbmdlci4KICAgIC8vICMg4pqg77iPIFdBUk5JTkc6IEFwcGxpY2F0aW9uIHVwZGF0ZXMgbXVzdCBiZSBleGVjdXRlZCBWRVJZIGNhcmVmdWxseSwgYXMgdGhleQogICAgLy8gIyBtaWdodCBpbnRyb2R1Y2UgYnJlYWtpbmcgY2hhbmdlcy4KICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfcm90YXRlX2FycmFuZ2VyW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19yb3RhdGVfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2OQogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTcwCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gbmV3X2FycmFuZ2VyCiAgICBieXRlYyAxOCAvLyAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTcxCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfc2V0X29wX2RhZW1vbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfc2V0X29wX2RhZW1vbjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTg0CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODUKICAgIC8vIHNlbGYub3BfZGFlbW9uLnZhbHVlID0gYWRkcmVzcwogICAgYnl0ZWMgMjUgLy8gMHg1MjIzNGY3MDQ0NjE2NTZkNmY2ZTIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4NgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTczCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2Fzc2lnbl9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19hc3NpZ25fcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDE2CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLlJvbGVWYWxpZGl0eQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjExCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMgogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgcHVzaGludCAyMAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTAzCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gcm9sZV9hZGRyZXNzCiAgICBieXRlYyAxOCAvLyAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMKICAgIGRpZyAzCiAgICBhcHBfZ2xvYmFsX3B1dAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTQKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDYKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIGR1cAogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnRfbWFuYWdlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMyAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwOAogICAgLy8gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMiAvLyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTIKICAgIC8vIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIGR1cAogICAgcHVzaGludCA2MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE1CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMzIgLy8gMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE2CiAgICAvLyBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExOAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMSAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIwCiAgICAvLyBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMwogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgODAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIzCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI0IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI0CiAgICAvLyBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3Jldm9rZV9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19yZXZva2Vfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzUKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzNgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzcKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCkpCiAgICBidG9pCiAgICBkdXBuIDIKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCAhPSBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksIGVyci5JTlZBTElEX1JPTEUKICAgIGR1cAogICAgcHVzaGludCAyMAogICAgIT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyOAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIzIC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0NGQ2MTZlNjE2NzY1NzIyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMwCiAgICAvLyBkZWwgc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzOQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjE2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIyIC8vIDB4NTIyMzUwNzI2OTZkNjE3Mjc5NDQ2NTYxNmM2NTcyMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNAogICAgLy8gZGVsIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjM4CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIGR1cAogICAgcHVzaGludCA2MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAzMiAvLyAweDUyMjM1NDcyNzU3Mzc0NjU2NTIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzgKICAgIC8vIGRlbCBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjM4CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDEKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hdXRob3JpdHksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjEgLy8gMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MgogICAgLy8gZGVsIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzOAogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDQKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDgwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI0IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ2CiAgICAvLyBkZWwgc2VsZi5vYnNlcnZlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ292X2Fzc2V0X3N1c3BlbnNpb25bcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dvdl9hc3NldF9zdXNwZW5zaW9uOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kICAjIFRPRE86IFVwZGF0ZSBzcGVjcyBhbmQgYWRkIHRlc3QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzcKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDIxIC8vIDB4NTIyMzQxNzU3NDY4NmY3MjY5NzQ3OTIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU3CiAgICAvLyBzZWxmLmFzc2V0X3N1c3BlbmRlZCA9IHN1c3BlbmRlZAogICAgYnl0ZWMgMzMgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU4CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCAgIyBUT0RPOiBVcGRhdGUgc3BlY3MgYW5kIGFkZCB0ZXN0CiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYXJyYW5nZXJbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNjgKICAgIC8vIHJldHVybiBzZWxmLmFycmFuZ2VyLnZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTggLy8gMHg1MjIzNDE3MjcyNjE2ZTY3NjU3MjIzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJyYW5nZXIgZXhpc3RzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjYwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9hZGRyZXNzX3JvbGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfYWRkcmVzc19yb2xlczoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg0CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmFjY291bnRfbWFuYWdlciwgYWRkcmVzcyksCiAgICBieXRlYyAyMyAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMKICAgIGRpZyAxCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4NQogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5wcmltYXJ5X2RlYWxlciwgYWRkcmVzcyksCiAgICBieXRlYyAyMiAvLyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzCiAgICBkaWcgMgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODYKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYudHJ1c3RlZSwgYWRkcmVzcyksCiAgICBieXRlYyAzMiAvLyAweDUyMjM1NDcyNzU3Mzc0NjU2NTIzCiAgICBkaWcgMwogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODcKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYXV0aG9yaXR5LCBhZGRyZXNzKSwKICAgIGJ5dGVjIDIxIC8vIDB4NTIyMzQxNzU3NDY4NmY3MjY5NzQ3OTIzCiAgICBkaWcgNAogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODgKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYub2JzZXJ2ZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjQgLy8gMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzCiAgICB1bmNvdmVyIDUKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjcwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjIDQwIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDYKICAgIHNldGJpdAogICAgaW50Y18xIC8vIDEKICAgIHVuY292ZXIgNQogICAgc2V0Yml0CiAgICBwdXNoaW50IDIKICAgIHVuY292ZXIgNAogICAgc2V0Yml0CiAgICBwdXNoaW50IDMKICAgIHVuY292ZXIgMwogICAgc2V0Yml0CiAgICBwdXNoaW50IDQKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA1CiAgICAvLyByb2xlID0gcm9sZV9pZC5hc191aW50NjQoKQogICAgYnRvaQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwNgogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZSkKICAgIGR1cAogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDgKICAgIC8vIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgcHVzaGludHMgMjAgNDAgNTAgNjAgNzAgODAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDctMzM4CiAgICAvLyBtYXRjaCByb2xlOgogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgLy8gICAgICAgICByZXR1cm4gdHlwLlJvbGVWYWxpZGl0eSgKICAgIC8vICAgICAgICAgICAgIHJvbGVfdmFsaWRpdHlfc3RhcnQ9VUludDY0KDApLCByb2xlX3ZhbGlkaXR5X2VuZD1VSW50NjQoMCkKICAgIC8vICAgICAgICAgKQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5hdXRob3JpdHksIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5vYnNlcnZlciwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5vYnNlcnZlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBfOgogICAgLy8gICAgICAgICBvcC5lcnIoZXJyLklOVkFMSURfUk9MRSkKICAgIHVuY292ZXIgNgogICAgbWF0Y2ggcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8wQDIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8xQDMgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8yQDQgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8zQDUgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV80QDYgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV81QDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzgKICAgIC8vIG9wLmVycihlcnIuSU5WQUxJRF9ST0xFKQogICAgZXJyIC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzVANzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzQKICAgIC8vIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMjQgLy8gMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzMzLTMzNQogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMzNgogICAgLy8gcmV0dXJuIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzRANjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjkKICAgIC8vIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDIxIC8vIDB4NTIyMzQxNzU3NDY4NmY3MjY5NzQ3OTIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI4LTMzMAogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzEKICAgIC8vIHJldHVybiBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzNANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjQKICAgIC8vIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAzMiAvLyAweDUyMjM1NDcyNzU3Mzc0NjU2NTIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzIzLTMyNQogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI2CiAgICAvLyByZXR1cm4gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMkA0OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxOQogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAyMiAvLyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzE4LTMyMAogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMQogICAgLy8gcmV0dXJuIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8xQDM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzE0CiAgICAvLyBzZWxmLmFjY291bnRfbWFuYWdlciwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAyMyAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTMtMzE1CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxNgogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMEAyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwOS0zMTEKICAgIC8vIHJldHVybiB0eXAuUm9sZVZhbGlkaXR5KAogICAgLy8gICAgIHJvbGVfdmFsaWRpdHlfc3RhcnQ9VUludDY0KDApLCByb2xlX3ZhbGlkaXR5X2VuZD1VSW50NjQoMCkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLl9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IHZvaWQ6Cl9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI2CiAgICAvLyBkZWYgX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQoc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjgKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkLCBlcnIuU1VTUEVOREVECiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCAzODQKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIFN1c3BlbmRlZCBvcGVyYXRpb25zCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5fc2V0dGxlX3Bvc2l0aW9uKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NCwgdWludDY0Ogpfc2V0dGxlX3Bvc2l0aW9uOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjQ0CiAgICAvLyBkZWYgX3NldHRsZV9wb3NpdGlvbihzZWxmLCBob2xkaW5nX2FkZHJlc3M6IEFjY291bnQpIC0+IHR1cGxlW1VJbnQ2NCwgVUludDY0XToKICAgIHByb3RvIDEgMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo2MQogICAgLy8gcG9zaXRpb24gPSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jb3B5KCkKICAgIGR1cAogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NjMtNjUKICAgIC8vICMgQ29tcHV0ZSB0aGUgaW5jcmVtZW50YWwgcGVyLXVuaXQgZml4ZWQtcG9pbnQgaW50ZXJlc3QgYW5kIHByaW5jaXBhbCBhY2NydWVkCiAgICAvLyAjIHNpbmNlIHRoaXMgYWNjb3VudCdzIGxhc3QgY2hlY2twb2ludC4KICAgIC8vIGludGVyZXN0X2RlbHRhID0gc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IC0gcG9zaXRpb24uaW50ZXJlc3RfY2hlY2twb2ludAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggZXhpc3RzCiAgICBkaWcgMQogICAgcHVzaGludCA1NwogICAgZXh0cmFjdF91aW50NjQKICAgIC0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo2NwogICAgLy8gc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCAtIHBvc2l0aW9uLnByaW5jaXBhbF9jaGVja3BvaW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTcgLy8gImN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IGV4aXN0cwogICAgZGlnIDIKICAgIHB1c2hpbnQgNjUKICAgIGV4dHJhY3RfdWludDY0CiAgICAtCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzMKICAgIC8vIGludGVyZXN0X2RlbHRhLCBwb3NpdGlvbi51bml0cywgc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgZGlnIDIKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3MC03NAogICAgLy8gIyBDb252ZXJ0IHRoZSBwZXItdW5pdCBmaXhlZC1wb2ludCBkZWx0YXMgaW50byBhYnNvbHV0ZSBjbGFpbWFibGUgYW1vdW50cwogICAgLy8gIyB1c2luZyB0aGUgYWNjb3VudCdzIGFjdGl2ZSB1bml0cy4KICAgIC8vIGNsYWltYWJsZV9pbnRlcmVzdCA9IHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIGludGVyZXN0X2RlbHRhLCBwb3NpdGlvbi51bml0cywgc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgLy8gKQogICAgdW5jb3ZlciAzCiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojc2CiAgICAvLyBwcmluY2lwYWxfZGVsdGEsIHBvc2l0aW9uLnVuaXRzLCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzUtNzcKICAgIC8vIGNsYWltYWJsZV9wcmluY2lwYWwgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBwcmluY2lwYWxfZGVsdGEsIHBvc2l0aW9uLnVuaXRzLCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICAvLyApCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojc5LTgxCiAgICAvLyAjIEFjY3J1ZSB0aGUgY2xhaW1hYmxlIGFtb3VudHMgdG8gdGhlIGFjY291bnQgcG9zaXRpb24gYW5kIG1ha2UgdGhlbSBhdmFpbGFibGUKICAgIC8vICMgZm9yIHdpdGhkcmF3YWwuCiAgICAvLyBwb3NpdGlvbi5jbGFpbWFibGVfaW50ZXJlc3QgKz0gY2xhaW1hYmxlX2ludGVyZXN0CiAgICBkaWcgMgogICAgcHVzaGludCA3MwogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICArCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIHN3YXAKICAgIHJlcGxhY2UyIDczCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6ODIKICAgIC8vIHBvc2l0aW9uLmNsYWltYWJsZV9wcmluY2lwYWwgKz0gY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgZHVwCiAgICBwdXNoaW50IDgxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDIKICAgICsKICAgIGl0b2IKICAgIHJlcGxhY2UyIDgxCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6ODQtODYKICAgIC8vICMgQWR2YW5jZSB0aGUgYWNjb3VudCdzIHBlci11bml0IGZpeGVkLXBvaW50IGNoZWNrcG9pbnRzIHRvIHRoZSBjdXJyZW50IGdsb2JhbAogICAgLy8gIyBwZXItdW5pdCBmaXhlZC1wb2ludCBnbG9iYWwgaW5kaWNlcy4KICAgIC8vIHBvc2l0aW9uLmludGVyZXN0X2NoZWNrcG9pbnQgPSBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IGV4aXN0cwogICAgaXRvYgogICAgcmVwbGFjZTIgNTcKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo4NwogICAgLy8gcG9zaXRpb24ucHJpbmNpcGFsX2NoZWNrcG9pbnQgPSBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTcgLy8gImN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IGV4aXN0cwogICAgaXRvYgogICAgcmVwbGFjZTIgNjUKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo4OS05MAogICAgLy8gIyBBZHZhbmNlIHRoZSBhY2NvdW50J3MgZXZlbnQgY3Vyc29yIHRvIHRoZSBjdXJyZW50IGdsb2JhbCBldmVudCBjdXJzb3IuCiAgICAvLyBwb3NpdGlvbi5zZXR0bGVkX2N1cnNvciA9IHNlbGYuZXZlbnRfY3Vyc29yCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGl0b2IKICAgIHJlcGxhY2UyIDQ5CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6OTItOTQKICAgIC8vICMgVXBkYXRlIHRoZSBhY2NvdW50IHBvc2l0aW9uIGFuZCByZXR1cm4gdGhlIG5ld2x5IGFjY3J1ZWQgY2xhaW1hYmxlIGFtb3VudHMKICAgIC8vICMgYWRkZWQgdG8gdGhlIHRvdGFsIHBvc2l0aW9uJ3MgY2xhaW1hYmxlIGFtb3VudHMuCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHBvc2l0aW9uLmNvcHkoKQogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6OTUKICAgIC8vIHJldHVybiBjbGFpbWFibGVfaW50ZXJlc3QsIGNsYWltYWJsZV9wcmluY2lwYWwKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IHZvaWQ6Cl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojk3CiAgICAvLyBkZWYgX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQoc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQyMwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDAKICAgIC8vIGlmIHNlbGYuX3N0YXR1c19pc19wZW5kaW5nX2llZCgpOgogICAgYnogX2Vuc3VyZV91bml0c19hY3RpdmF0ZWRfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTAxCiAgICAvLyByZXR1cm4KICAgIHJldHN1YgoKX2Vuc3VyZV91bml0c19hY3RpdmF0ZWRfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwMwogICAgLy8gcG9zaXRpb24gPSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAyCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDQKICAgIC8vIGlmIHBvc2l0aW9uLnJlc2VydmVkX3VuaXRzID09IFVJbnQ2NCgwKToKICAgIHB1c2hpbnQgNDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgYm56IF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkX2FmdGVyX2lmX2Vsc2VANAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwNQogICAgLy8gcmV0dXJuCiAgICByZXRzdWIKCl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkX2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDgKICAgIC8vIHBvc2l0aW9uLnVuaXRzICs9IGFjdGl2YXRlZF91bml0cwogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMwogICAgKwogICAgaXRvYgogICAgcmVwbGFjZTIgMzIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDkKICAgIC8vIHBvc2l0aW9uLnJlc2VydmVkX3VuaXRzID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgaXRvYgogICAgcmVwbGFjZTIgNDAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTAKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gcG9zaXRpb24uY29weSgpCiAgICBmcmFtZV9kaWcgMgogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExMQogICAgLy8gYXNzZXJ0IHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPj0gYWN0aXZhdGVkX3VuaXRzLCBlcnIuT1ZFUl9ESVNUUklCVVRJT04KICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICBkdXAKICAgIGRpZyAyCiAgICA+PQogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCByZW1haW5pbmcgRC1BU0EgdW5pdHMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTIKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgLT0gYWN0aXZhdGVkX3VuaXRzCiAgICBzd2FwCiAgICAtCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX3NjYWxlZF9tdWxfZGl2KG11bHRpcGxpY2FuZDogdWludDY0LCBtdWx0aXBsaWVyOiB1aW50NjQsIGRpdmlzb3I6IHVpbnQ2NCkgLT4gdWludDY0Ogpfc2NhbGVkX211bF9kaXY6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNTMtMTU1CiAgICAvLyBkZWYgX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIHNlbGYsIG11bHRpcGxpY2FuZDogVUludDY0LCBtdWx0aXBsaWVyOiBVSW50NjQsIGRpdmlzb3I6IFVJbnQ2NAogICAgLy8gKSAtPiBVSW50NjQ6CiAgICBwcm90byAzIDEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE1NwogICAgLy8gaWYgbXVsdGlwbGljYW5kID09IFVJbnQ2NCgwKSBvciBtdWx0aXBsaWVyID09IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMwogICAgYnogX3NjYWxlZF9tdWxfZGl2X2lmX2JvZHlAMgogICAgZnJhbWVfZGlnIC0yCiAgICBibnogX3NjYWxlZF9tdWxfZGl2X2FmdGVyX2lmX2Vsc2VAMwoKX3NjYWxlZF9tdWxfZGl2X2lmX2JvZHlAMjoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE1OAogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKX3NjYWxlZF9tdWxfZGl2X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE1OQogICAgLy8gaGlnaCwgbG93ID0gb3AubXVsdyhtdWx0aXBsaWNhbmQsIG11bHRpcGxpZXIpCiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMgogICAgbXVsdwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTYwCiAgICAvLyByZXR1cm4gb3AuZGl2dyhoaWdoLCBsb3csIGRpdmlzb3IpCiAgICBmcmFtZV9kaWcgLTEKICAgIGRpdncKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9hbW91bnRfdG9faW5kZXhfZGVsdGEoYW1vdW50OiB1aW50NjQpIC0+IHVpbnQ2NDoKX2Ftb3VudF90b19pbmRleF9kZWx0YToKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE2MgogICAgLy8gZGVmIF9hbW91bnRfdG9faW5kZXhfZGVsdGEoc2VsZiwgYW1vdW50OiBVSW50NjQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTY0CiAgICAvLyBpZiBhbW91bnQgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0xCiAgICBibnogX2Ftb3VudF90b19pbmRleF9kZWx0YV9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE2NQogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKX2Ftb3VudF90b19pbmRleF9kZWx0YV9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNjYKICAgIC8vIGFzc2VydCBzZWxmLnRvdGFsX3VuaXRzID4gVUludDY0KDApLCBlcnIuTk9fVU5JVFMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICBkdXAKICAgIGFzc2VydCAvLyBObyBELUFTQSB1bml0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTY3CiAgICAvLyByZXR1cm4gc2VsZi5fc2NhbGVkX211bF9kaXYoYW1vdW50LCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLCBzZWxmLnRvdGFsX3VuaXRzKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5faW5kZXhfZGVsdGFfdG9fYW1vdW50KGluZGV4X2RlbHRhOiB1aW50NjQpIC0+IHVpbnQ2NDoKX2luZGV4X2RlbHRhX3RvX2Ftb3VudDoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE2OQogICAgLy8gZGVmIF9pbmRleF9kZWx0YV90b19hbW91bnQoc2VsZiwgaW5kZXhfZGVsdGE6IFVJbnQ2NCkgLT4gVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNzYKICAgIC8vIGlmIGluZGV4X2RlbHRhID09IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMQogICAgYm56IF9pbmRleF9kZWx0YV90b19hbW91bnRfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNzcKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9pbmRleF9kZWx0YV90b19hbW91bnRfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTc5CiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE4MQogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE3OC0xODIKICAgIC8vIHJldHVybiBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLnRvdGFsX3VuaXRzLAogICAgLy8gICAgIGluZGV4X2RlbHRhLAogICAgLy8gICAgIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZ2V0X3NjaGVkdWxlX2VudHJ5KGV2ZW50X2lkOiB1aW50NjQpIC0+IGJ5dGVzOgpfZ2V0X3NjaGVkdWxlX2VudHJ5OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjAyCiAgICAvLyBkZWYgX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLCBldmVudF9pZDogVUludDY0KSAtPiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeToKICAgIHByb3RvIDEgMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjA0CiAgICAvLyBhc3NlcnQgZXZlbnRfaWQgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LCBlcnIuSU5WQUxJRF9FVkVOVF9JRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICA+CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBpZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTkwCiAgICAvLyByZXR1cm4gZXZlbnRfaWQgLy8gVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMTYKICAgIC8KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjIwNgogICAgLy8gYXNzZXJ0IHBhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBpdG9iCiAgICBieXRlYyAzMSAvLyAweDUzMjMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE5NAogICAgLy8gcmV0dXJuIGV2ZW50X2lkICUgVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMTYKICAgICUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjIwOQogICAgLy8gYXNzZXJ0IG9mZnNldCA8IHBhZ2UubGVuZ3RoLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIHB1c2hpbnQgMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGRpZyAxCiAgICA+CiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMTAKICAgIC8vIHJldHVybiBwYWdlW29mZnNldF0uY29weSgpCiAgICBwdXNoaW50IDY1CiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIHB1c2hpbnQgNjUKICAgIGJveF9leHRyYWN0CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoY29udHJhY3RfdHlwZTogdWludDY0LCBldmVudF90eXBlOiB1aW50NjQpIC0+IHZvaWQ6Cl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZToKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMxMy0zMTUKICAgIC8vIGRlZiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgc2VsZiwgY29udHJhY3RfdHlwZTogVUludDY0LCBldmVudF90eXBlOiBVSW50NjQKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjU0LTI1NQogICAgLy8gIyBDaGVjayBjb21tb24gZXZlbnRzIGZpcnN0CiAgICAvLyBpZiBldmVudF90eXBlIGluIGNvbW1vbl9ldmVudHM6CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI0NwogICAgLy8gVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI0OAogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUCksCiAgICBpbnRjXzIgLy8gOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjU0LTI1NQogICAgLy8gIyBDaGVjayBjb21tb24gZXZlbnRzIGZpcnN0CiAgICAvLyBpZiBldmVudF90eXBlIGluIGNvbW1vbl9ldmVudHM6CiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjQ5CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX01EKSwKICAgIHB1c2hpbnQgMTkKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI1MAogICAgLy8gVUludDY0KGVudW1zLkVWVF9SUiksCiAgICBwdXNoaW50IDEyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyNTEKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIHB1c2hpbnQgMTEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDcKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDY6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyNTYKICAgIC8vIHJldHVybiBUcnVlCiAgICBpbnRjXzEgLy8gMQoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQ6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIHJldHN1YgoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI1OC0yNTkKICAgIC8vICMgQ29udHJhY3Qtc3BlY2lmaWMgYWRkaXRpb25hbCBldmVudHMKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX1BBTSk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyNjAtMjYxCiAgICAvLyAjIFBBTSBvbmx5IHN1cHBvcnRzIGNvbW1vbiBldmVudHMKICAgIC8vIHJldHVybiBGYWxzZQogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI2MwogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfTEFNKSBvciBjb250cmFjdF90eXBlID09IFVJbnQ2NCgKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAzCiAgICA9PQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjYzLTI2NQogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfTEFNKSBvciBjb250cmFjdF90eXBlID09IFVJbnQ2NCgKICAgIC8vICAgICBlbnVtcy5DVF9OQU0KICAgIC8vICk6CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlAMTEKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAyCiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMTYKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDExOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjY2LTI3MAogICAgLy8gIyBMQU0vTkFNIGFkZDogUFIsIElQQ0IKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyNjgKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyNjYtMjcwCiAgICAvLyAjIExBTS9OQU0gYWRkOiBQUiwgSVBDQgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMTMKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjY5CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgcHVzaGludCAxOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjY2LTI3MAogICAgLy8gIyBMQU0vTkFNIGFkZDogUFIsIElQQ0IKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gKQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDE0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDEzOgogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMTQ6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAxNjoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI3MgogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKToKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAyMwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjczLTI3OAogICAgLy8gIyBBTk4gYWRkczogUFIsIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyNzUKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyNzMtMjc4CiAgICAvLyAjIEFOTiBhZGRzOiBQUiwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjAKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Mjc2CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgcHVzaGludCAxOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjczLTI3OAogICAgLy8gIyBBTk4gYWRkczogUFIsIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDIwCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI3NwogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyNzMtMjc4CiAgICAvLyAjIEFOTiBhZGRzOiBQUiwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMjEKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjA6CiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF9mYWxzZUAyMToKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDIzOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjgwCiAgICAvLyBpZiBjb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9MQVgpOgogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDQKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAzMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjgxLTI4NwogICAgLy8gIyBMQVggYWRkczogUFIsIFBJLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjgzCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjgxLTI4NwogICAgLy8gIyBMQVggYWRkczogUFIsIFBJLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyOAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyODQKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgcHVzaGludCA0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyODEtMjg3CiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDI4CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI4NQogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIHB1c2hpbnQgMTgKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI4MS0yODcKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjgKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Mjg2CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICBwdXNoaW50IDUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI4MS0yODcKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMjkKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjg6CiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF9mYWxzZUAyOToKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDMxOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Mjg5CiAgICAvLyBpZiBjb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9DTE0pOgogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDUKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAzMwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjkwLTI5MQogICAgLy8gIyBDTE0gYWRkczogUFIKICAgIC8vIHJldHVybiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMzM6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyOTMKICAgIC8vIHJldHVybiBGYWxzZQogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKCi8vIG1vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9pc19keW5hbWljX2FubnVpdHkoKSAtPiB1aW50NjQ6Cl9pc19keW5hbWljX2FubnVpdHk6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozMzUKICAgIC8vIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMzNS0zMzYKICAgIC8vIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKQogICAgLy8gYW5kIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgYnogX2lzX2R5bmFtaWNfYW5udWl0eV9ib29sX2ZhbHNlQDMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMzNgogICAgLy8gYW5kIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDM0IC8vICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24gZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozMzUtMzM2CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIC8vIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGJ6IF9pc19keW5hbWljX2FubnVpdHlfYm9vbF9mYWxzZUAzCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzM0LTMzNwogICAgLy8gcmV0dXJuICgKICAgIC8vICAgICBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIC8vICAgICBhbmQgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICAvLyApCiAgICByZXRzdWIKCl9pc19keW5hbWljX2FubnVpdHlfYm9vbF9mYWxzZUAzOgogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMzNC0zMzcKICAgIC8vIHJldHVybiAoCiAgICAvLyAgICAgc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICAvLyAgICAgYW5kIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgLy8gKQogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnk6IGJ5dGVzKSAtPiB1aW50NjQsIGJ5dGVzOgpfZW50cnlfaW50ZXJlc3Rfc2VnbWVudDoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjM4MAogICAgLy8gZGVmIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KHNlbGYsIGVudHJ5OiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSkgLT4gVUludDY0OgogICAgcHJvdG8gMSAyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozODkKICAgIC8vIGVudHJ5LmFjY3J1YWxfZmFjdG9yID09IFVJbnQ2NCgwKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDE3CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozODktMzkxCiAgICAvLyBlbnRyeS5hY2NydWFsX2ZhY3RvciA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID09IFVJbnQ2NCgwKQogICAgLy8gb3Igc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID09IFVJbnQ2NCgwKQogICAgYnogX2VudHJ5X2ludGVyZXN0X3NlZ21lbnRfaWZfYm9keUAzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozOTAKICAgIC8vIG9yIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID09IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozODktMzkxCiAgICAvLyBlbnRyeS5hY2NydWFsX2ZhY3RvciA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID09IFVJbnQ2NCgwKQogICAgLy8gb3Igc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID09IFVJbnQ2NCgwKQogICAgYnogX2VudHJ5X2ludGVyZXN0X3NlZ21lbnRfaWZfYm9keUAzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozOTEKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozODktMzkxCiAgICAvLyBlbnRyeS5hY2NydWFsX2ZhY3RvciA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID09IFVJbnQ2NCgwKQogICAgLy8gb3Igc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID09IFVJbnQ2NCgwKQogICAgYm56IF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2FmdGVyX2lmX2Vsc2VANAoKX2VudHJ5X2ludGVyZXN0X3NlZ21lbnRfaWZfYm9keUAzOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzkzCiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfZGlnIC0xCiAgICB1bmNvdmVyIDIKICAgIHJldHN1YgoKX2VudHJ5X2ludGVyZXN0X3NlZ21lbnRfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Mzk1CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Mzk2CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Mzk3CiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Mzk0LTM5OAogICAgLy8gYWNjcnVlZCA9IHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSwKICAgIC8vICAgICBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQwMgogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjM5OS00MDMKICAgIC8vIHJldHVybiBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBhY2NydWVkLAogICAgLy8gICAgIGVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMAogICAgc3dhcAogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIGZyYW1lX2RpZyAtMQogICAgdW5jb3ZlciAyCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZGlzY291bnRfYW5udWl0eV9mYWN0b3IoZGlzY291bnRfZmFjdG9yOiB1aW50NjQsIHJlZGVtcHRpb25fZmFjdG9yOiB1aW50NjQpIC0+IHVpbnQ2NDoKX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDYyLTQ2NgogICAgLy8gZGVmIF9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcigKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgIGRpc2NvdW50X2ZhY3RvcjogVUludDY0LAogICAgLy8gICAgIHJlZGVtcHRpb25fZmFjdG9yOiBVSW50NjQsCiAgICAvLyApIC0+IFVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDY4CiAgICAvLyBpZiByZWRlbXB0aW9uX2ZhY3RvciA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGJueiBfZGlzY291bnRfYW5udWl0eV9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0NjkKICAgIC8vIHJldHVybiBkaXNjb3VudF9mYWN0b3IKICAgIGZyYW1lX2RpZyAtMgogICAgcmV0c3ViCgpfZGlzY291bnRfYW5udWl0eV9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDcwCiAgICAvLyBwZXJpb2RfcmF0ZSA9IHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgKyBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQ3MQogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQ3MC00NzQKICAgIC8vIHBlcmlvZF9yYXRlID0gc2VsZi5maXhlZF9wb2ludF9zY2FsZSArIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIHJlZGVtcHRpb25fZmFjdG9yLAogICAgLy8gICAgIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgKwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDc1CiAgICAvLyBhc3NlcnQgcGVyaW9kX3JhdGUgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZHVwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0NzgKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0NzYtNDgwCiAgICAvLyByZXR1cm4gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgZGlzY291bnRfZmFjdG9yLAogICAgLy8gICAgIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICAvLyAgICAgcGVyaW9kX3JhdGUsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeShlbnRyeTogYnl0ZXMsIHBheWxvYWQ6IGJ5dGVzKSAtPiBieXRlcywgYnl0ZXM6Cl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeToKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYxMy02MTUKICAgIC8vIGRlZiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkoCiAgICAvLyAgICAgc2VsZiwgZW50cnk6IHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5LCBwYXlsb2FkOiB0eXAuT2JzZXJ2ZWRFdmVudFJlcXVlc3QKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDIgMgogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2MjMKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF9pZCA9PSBzZWxmLmV2ZW50X2N1cnNvciwgZXJyLklOVkFMSURfRVZFTlRfQ1VSU09SCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgY3Vyc29yCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2MjQKICAgIC8vIGFzc2VydCBlbnRyeS5zY2hlZHVsZWRfdGltZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwgZXJyLk5PX0RVRV9DQVNIRkxPVwogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA8PQogICAgYXNzZXJ0IC8vIE5vIGR1ZSBjYXNoZmxvdyB0byBwYXkKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYyNgogICAgLy8gZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjI3CiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfSUVEKToKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgZHVwCiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMzUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjI4LTYzMAogICAgLy8gIyBJRUQgZmluYWxpemVzIGlzc3VhbmNlOiByZXNlcnZlZCB1bml0cyBiZWNvbWUgYWN0aXZhdGFibGUgYW5kIHRoZQogICAgLy8gIyBzY2hlZHVsZSdzIGluaXRpYWwgY29udHJhY3R1YWwgc3RhdGUgYmVjb21lcyBsaXZlLgogICAgLy8gYXNzZXJ0IHNlbGYuX3N0YXR1c19pc19wZW5kaW5nX2llZCgpLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYzMgogICAgLy8gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCA9PSBzZWxmLnRvdGFsX3VuaXRzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgID09CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2MzEtNjMzCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPT0gc2VsZi50b3RhbF91bml0cwogICAgLy8gKSwgZXJyLlBSSU1BUllfRElTVFJJQlVUSU9OX0lOQ09NUExFVEUKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBub3QgY29tcGxldGUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYzNAogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2MzUKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYzNgogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPSBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZQogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYzNwogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ID0gVUludDY0KDApCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2MzgKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IGVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA0MQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYzOQogICAgLy8gc2VsZi5ldmVudF9jdXJzb3IgKz0gVUludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjQwCiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbnVtcy5TVEFUVVNfQUNUSVZFKQogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgcHVzaGludCAxMDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0NTEKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwgZXJyLk5PVF9FVlRfSUVECiAgICBmcmFtZV9kaWcgMTEKICAgIGFzc2VydCAvLyBOb3QgSUVEIGV2ZW50CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0NTIKICAgIC8vIHJldHVybiBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjQxLTY0NQogICAgLy8gc2VsZi5fZW1pdF9leGVjdXRpb25fZXZlbnQoCiAgICAvLyAgICAgZW50cnk9ZW50cnksCiAgICAvLyAgICAgcGF5b2ZmPXNlbGYuX2VudHJ5X2llZF9hbW91bnQoZW50cnkpLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjQ0CiAgICAvLyBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjQxLTY0NQogICAgLy8gc2VsZi5fZW1pdF9leGVjdXRpb25fZXZlbnQoCiAgICAvLyAgICAgZW50cnk9ZW50cnksCiAgICAvLyAgICAgcGF5b2ZmPXNlbGYuX2VudHJ5X2llZF9hbW91bnQoZW50cnkpLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGNhbGxzdWIgX2VtaXRfZXhlY3V0aW9uX2V2ZW50CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgLTIKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjY0NgogICAgLy8gcmV0dXJuCiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2J1cnkgMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMzUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTQ3CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuX3N0YXR1c19pc19wZW5kaW5nX2llZCgpLCBlcnIuUEVORElOR19JRUQKICAgICEKICAgIGFzc2VydCAvLyBJRUQgbm90IHlldCBleGVjdXRlZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjQ5CiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgKz0gc2VsZi5fZW50cnlfaW50ZXJlc3Rfc2VnbWVudChlbnRyeSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQKICAgIGZyYW1lX2J1cnkgLTIKICAgICsKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjUxCiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUlIpOgogICAgZnJhbWVfZGlnIDEwCiAgICBwdXNoaW50IDEyCiAgICA9PQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAxMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjU1CiAgICAvLyBwYXlsb2FkLm9ic2VydmVkX3JhdGUsCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2NTYKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9tdWx0aXBsaWVyLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDM2IC8vICJyYXRlX3Jlc2V0X211bHRpcGxpZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9tdWx0aXBsaWVyIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjU3CiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjUyLTY1OAogICAgLy8gIyBSUiBkZXJpdmVzIHRoZSBuZXh0IHJhdGUgZnJvbSBhbiBvYnNlcnZlZCBvcmFjbGUgdmFsdWUgcGx1cyB0aGUKICAgIC8vICMgY29udHJhY3Qgc3ByZWFkIC8gbXVsdGlwbGllciB0ZXJtcywgdGhlbiBlbmZvcmNlcyBmbG9vciBhbmQgY2FwLgogICAgLy8gb2JzZXJ2ZWRfcmF0ZSA9IHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIHBheWxvYWQub2JzZXJ2ZWRfcmF0ZSwKICAgIC8vICAgICBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjY2MAogICAgLy8gb2JzZXJ2ZWRfcmF0ZSArIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzNSAvLyAicmF0ZV9yZXNldF9zcHJlYWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQgZXhpc3RzCiAgICArCiAgICBmcmFtZV9idXJ5IDYKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjczNAogICAgLy8gaWYgc2VsZi5oYXNfcmF0ZV9yZXNldF9mbG9vciBhbmQgcmF0ZSA8IHNlbGYucmF0ZV9yZXNldF9mbG9vcjoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzOCAvLyAiaGFzX3JhdGVfcmVzZXRfZmxvb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgZXhpc3RzCiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1NQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI5IC8vICJyYXRlX3Jlc2V0X2Zsb29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfZmxvb3IgZXhpc3RzCiAgICBmcmFtZV9kaWcgNgogICAgPgogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjczNQogICAgLy8gcmF0ZSA9IHNlbGYucmF0ZV9yZXNldF9mbG9vcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI5IC8vICJyYXRlX3Jlc2V0X2Zsb29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgNgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9mbG9vciBleGlzdHMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU1OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzM2CiAgICAvLyBpZiBzZWxmLmhhc19yYXRlX3Jlc2V0X2NhcCBhbmQgcmF0ZSA+IHNlbGYucmF0ZV9yZXNldF9jYXA6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzkgLy8gImhhc19yYXRlX3Jlc2V0X2NhcCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgZXhpc3RzCiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1OAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDMwIC8vICJyYXRlX3Jlc2V0X2NhcCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X2NhcCBleGlzdHMKICAgIGZyYW1lX2RpZyA2CiAgICA8CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1OAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzM3CiAgICAvLyByYXRlID0gc2VsZi5yYXRlX3Jlc2V0X2NhcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDMwIC8vICJyYXRlX3Jlc2V0X2NhcCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDYKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfY2FwIGV4aXN0cwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTg6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2NTkKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gc2VsZi5fY2xhbXBfcmF0ZSgKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjY1OS02NjEKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gc2VsZi5fY2xhbXBfcmF0ZSgKICAgIC8vICAgICBvYnNlcnZlZF9yYXRlICsgc2VsZi5yYXRlX3Jlc2V0X3NwcmVhZAogICAgLy8gKQogICAgZnJhbWVfZGlnIDYKICAgIGFwcF9nbG9iYWxfcHV0CgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAxODoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjY3MQogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1BJKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCA0CiAgICA9PQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAyMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjcyCiAgICAvLyBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9IGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjY3MwogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMjM6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2NzgKICAgIC8vIGlmIHNlbGYuX2lzX2R5bmFtaWNfYW5udWl0eSgpOgogICAgY2FsbHN1YiBfaXNfZHluYW1pY19hbm51aXR5CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDI5CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2NzkKICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QUkYpOgogICAgZnJhbWVfZGlnIDEwCiAgICBwdXNoaW50IDUKICAgID09CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAzMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDkwCiAgICAvLyBkaXNjb3VudF9mYWN0b3IgPSBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQ5MQogICAgLy8gZGVub21pbmF0b3IgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQ5MgogICAgLy8gc2tpcF9maXJzdF9yZWRlbXB0aW9uID0gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDcKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQ5NAogICAgLy8gaWYgZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAyNQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgZnJhbWVfYnVyeSA4CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAzNQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDk1LTQ5OQogICAgLy8gIyBBbiBpbml0aWFsIFBSRiBtYXkgZGVzY3JpYmUgdGhlIGZpcnN0IHJlZGVtcHRpb24gcGVyaW9kIGRpcmVjdGx5LgogICAgLy8gZGlzY291bnRfZmFjdG9yID0gc2VsZi5fZGlzY291bnRfYW5udWl0eV9mYWN0b3IoCiAgICAvLyAgICAgZGlzY291bnRfZmFjdG9yLAogICAgLy8gICAgIGVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDgKICAgIGNhbGxzdWIgX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTAxCiAgICAvLyBza2lwX2ZpcnN0X3JlZGVtcHRpb24gPSBUcnVlCiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfYnVyeSA3CiAgICBmcmFtZV9idXJ5IDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDM1OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTAzCiAgICAvLyBmdXR1cmVfZXZlbnRfaWQgPSBzZWxmLmV2ZW50X2N1cnNvciArIFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfd2hpbGVfdG9wQDM2OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTA0CiAgICAvLyB3aGlsZSBmdXR1cmVfZXZlbnRfaWQgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgZnJhbWVfZGlnIDMKICAgID4KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl93aGlsZUA0OAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTA1CiAgICAvLyBmdXR1cmVfZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoZnV0dXJlX2V2ZW50X2lkKQogICAgZnJhbWVfZGlnIDMKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjUwNgogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPSBmdXR1cmVfZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1MDctNTA4CiAgICAvLyAjIE9ubHkgcmVkZW1wdGlvbi1iZWFyaW5nIGV2ZW50cyBjb250cmlidXRlIHRvIHRoZSBhbm51aXR5IGRlbm9taW5hdG9yLgogICAgLy8gaXNfcmVkZW1wdGlvbl9ldmVudCA9IGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpIG9yICgKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjUwNy01MTEKICAgIC8vICMgT25seSByZWRlbXB0aW9uLWJlYXJpbmcgZXZlbnRzIGNvbnRyaWJ1dGUgdG8gdGhlIGFubnVpdHkgZGVub21pbmF0b3IuCiAgICAvLyBpc19yZWRlbXB0aW9uX2V2ZW50ID0gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QUikgb3IgKAogICAgLy8gICAgIGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfTUQpCiAgICAvLyAgICAgYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICAvLyApCiAgICBibnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfdHJ1ZUA0MAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTA5CiAgICAvLyBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgZnJhbWVfZGlnIDQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1MDktNTEwCiAgICAvLyBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgLy8gYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF9mYWxzZUA0MQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTEwCiAgICAvLyBhbmQgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IgPiBVSW50NjQoMCkKICAgIGZyYW1lX2RpZyAwCiAgICBwdXNoaW50IDI1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTA5LTUxMAogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCkKICAgIC8vIGFuZCBmdXR1cmVfZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX3RydWVANDA6CiAgICBpbnRjXzEgLy8gMQoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfbWVyZ2VANDI6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1MTIKICAgIC8vIGlmIGlzX3JlZGVtcHRpb25fZXZlbnQ6CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA0NwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTEzCiAgICAvLyBpZiBza2lwX2ZpcnN0X3JlZGVtcHRpb246CiAgICBmcmFtZV9kaWcgNwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUA0NQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTE0CiAgICAvLyBza2lwX2ZpcnN0X3JlZGVtcHRpb24gPSBGYWxzZQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgNwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANDc6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1MjEKICAgIC8vIGZ1dHVyZV9ldmVudF9pZCArPSBVSW50NjQoMSkKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV93aGlsZV90b3BAMzYKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlANDU6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1MTgKICAgIC8vIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZnJhbWVfZGlnIDAKICAgIHB1c2hpbnQgMjUKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1MTYtNTE5CiAgICAvLyBkaXNjb3VudF9mYWN0b3IgPSBzZWxmLl9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcigKICAgIC8vICAgICBkaXNjb3VudF9mYWN0b3IsCiAgICAvLyAgICAgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMgogICAgc3dhcAogICAgY2FsbHN1YiBfZGlzY291bnRfYW5udWl0eV9mYWN0b3IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1MjAKICAgIC8vIGRlbm9taW5hdG9yICs9IGRpc2NvdW50X2ZhY3RvcgogICAgZnJhbWVfZGlnIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA0NwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDE6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF9tZXJnZUA0MgoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX3doaWxlQDQ4OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTIzCiAgICAvLyBhc3NlcnQgZGVub21pbmF0b3IgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZnJhbWVfZGlnIDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjUyNAogICAgLy8gbnVtZXJhdG9yID0gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTI1CiAgICAvLyBpZiBlbnRyeS5mbGFncyAmIFVJbnQ2NChlbnVtcy5GTEFHX0lOSVRJQUxfUFJGKSA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNTcKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gOAogICAgJgogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDUwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1MjYtNTI3CiAgICAvLyAjIFN1YnNlcXVlbnQgUFJGIGV2ZW50cyBhbW9ydGl6ZSBib3RoIHByaW5jaXBhbCBhbmQgYWxyZWFkeSBhY2NydWVkIGNhcnJ5LgogICAgLy8gbnVtZXJhdG9yICs9IHNlbGYuYWNjcnVlZF9pbnRlcmVzdAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgICsKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDUwOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTMwCiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTI4LTUzMgogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIG51bWVyYXRvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gICAgIGRlbm9taW5hdG9yLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDEKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2ODAKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IHNlbGYuX3JlY2FsY3VsYXRlX2FubnVpdHlfcGF5bWVudCgKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjgwLTY4MgogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gc2VsZi5fcmVjYWxjdWxhdGVfYW5udWl0eV9wYXltZW50KAogICAgLy8gICAgIGVudHJ5CiAgICAvLyApCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMzA6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2ODUKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjY4Ni02OTAKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1VSW50NjQoMCksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2ODgKICAgIC8vIHBheW9mZj1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Njg5CiAgICAvLyBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICBkdXAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjY4Ni02OTAKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1VSW50NjQoMCksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgY2FsbHN1YiBfZW1pdF9leGVjdXRpb25fZXZlbnQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDI5OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Njg0CiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDMwCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDIwOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Njc0CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9JUENCKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCAxOAogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDIzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2NzUtNjc2CiAgICAvLyAjIElQQ0Iga2VlcHMgcHJpbmNpcGFsIHVuY2hhbmdlZCBhbmQgb25seSByZXNldHMgdGhlIGludGVyZXN0IGJhc2UuCiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIGIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMjMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMTA6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2NjIKICAgIC8vIGVsaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1JSRik6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgMTEKICAgID09CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDE0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2NjMKICAgIC8vIG5leHRfcmF0ZSA9IGVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjY0CiAgICAvLyBpZiBuZXh0X3JhdGUgPT0gVUludDY0KDApOgogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDEzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2NjUKICAgIC8vIG5leHRfcmF0ZSA9IHNlbGYucmF0ZV9yZXNldF9uZXh0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzcgLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDUKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfbmV4dCBleGlzdHMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjY2CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IG5leHRfcmF0ZQogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgZnJhbWVfZGlnIDUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDE0OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjY4CiAgICAvLyBpZiBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSAhPSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgOQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMTgKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjY2OQogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPSBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZQogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgZnJhbWVfZGlnIDkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CgoKLy8gbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KGVudHJ5OiBieXRlcywgcGF5b2ZmOiB1aW50NjQsIHNldHRsZWRfYW1vdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpfZW1pdF9leGVjdXRpb25fZXZlbnQ6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2OTYtNzAyCiAgICAvLyBkZWYgX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgKiwKICAgIC8vICAgICBlbnRyeTogdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnksCiAgICAvLyAgICAgcGF5b2ZmOiBVSW50NjQsCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ6IFVJbnQ2NCwKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDMgMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzA2CiAgICAvLyBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25JRAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzA3CiAgICAvLyBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIGZyYW1lX2RpZyAtMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3MDgKICAgIC8vIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIGZyYW1lX2RpZyAtMwogICAgZXh0cmFjdCA4IDEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjcwOQogICAgLy8gc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICBmcmFtZV9kaWcgLTMKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3MTAKICAgIC8vIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3MTMKICAgIC8vIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIGZyYW1lX2RpZyAtMwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzA4CiAgICAvLyBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICBpbnRjXzIgLy8gOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzEzCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBnZXRieXRlCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3NDIKICAgIC8vIGlmIHBheW9mZiA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJueiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3NDMKICAgIC8vIHJldHVybiBVSW50NjQoZW51bXMuUEFZT0ZGX1NJR05fUE9TSVRJVkUpCiAgICBpbnRjXzEgLy8gMQoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX3BheW9mZl9zaWduQDc6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3MTItNzE0CiAgICAvLyBwYXlvZmZfc2lnbj1hcmM0LlVJbnQ4KAogICAgLy8gICAgIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIC8vICksCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgaW50Y18yIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3MTYKICAgIC8vIGN1cnJlbmN5X2lkPXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzE3CiAgICAvLyBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3MDUtNzE4CiAgICAvLyBFeGVjdXRpb25FdmVudCgKICAgIC8vICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIC8vICAgICBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYXBwbGllZF9hdD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICBwYXlvZmY9cGF5b2ZmLAogICAgLy8gICAgIHBheW9mZl9zaWduPWFyYzQuVUludDgoCiAgICAvLyAgICAgICAgIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIC8vICAgICApLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PXNldHRsZWRfYW1vdW50LAogICAgLy8gICAgIGN1cnJlbmN5X2lkPXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAwCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzA0LTcxOQogICAgLy8gYXJjNC5lbWl0KAogICAgLy8gICAgIEV4ZWN1dGlvbkV2ZW50KAogICAgLy8gICAgICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgICAgIHBheW9mZj1wYXlvZmYsCiAgICAvLyAgICAgICAgIHBheW9mZl9zaWduPWFyYzQuVUludDgoCiAgICAvLyAgICAgICAgICAgICBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICAvLyAgICAgICAgICksCiAgICAvLyAgICAgICAgIHNldHRsZWRfYW1vdW50PXNldHRsZWRfYW1vdW50LAogICAgLy8gICAgICAgICBjdXJyZW5jeV9pZD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgICAgIHNlcXVlbmNlPWVudHJ5LmV2ZW50X2lkICsgVUludDY0KDEpLAogICAgLy8gICAgICkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDlhMzMyYjk1IC8vIG1ldGhvZCAiRXhlY3V0aW9uRXZlbnQodWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojc0NAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiAoVUludDY0KGVudW1zLkVWVF9JRUQpLCBVSW50NjQoZW51bXMuRVZUX1BJKSk6CiAgICBmcmFtZV9kaWcgNQogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBibnogX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2lmX2JvZHlANQogICAgZnJhbWVfZGlnIDUKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGJ6IF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pZl9lbHNlQDYKCl9lbWl0X2V4ZWN1dGlvbl9ldmVudF9pZl9ib2R5QDU6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3NDUKICAgIC8vIHJldHVybiBVSW50NjQoZW51bXMuUEFZT0ZGX1NJR05fUE9TSVRJVkUpCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzEzCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBiIF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pbmxpbmVkX21vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9wYXlvZmZfc2lnbkA3CgpfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzQ2CiAgICAvLyByZXR1cm4gVUludDY0KGVudW1zLlBBWU9GRl9TSUdOX05FR0FUSVZFKQogICAgcHVzaGludCAyNTUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjcxMwogICAgLy8gc2VsZi5fcGF5b2ZmX3NpZ24oZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSwgcGF5b2ZmKQogICAgYiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fcGF5b2ZmX3NpZ25ANwoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9yb2xlX2lzX2FjdGl2ZShyb2xlX21hcDogYnl0ZXMsIHJvbGVfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NDoKX3JvbGVfaXNfYWN0aXZlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU3CiAgICAvLyBkZWYgX3JvbGVfaXNfYWN0aXZlKHNlbGYsIHJvbGVfbWFwOiB0eXAuUmJhY1JvbGUsIHJvbGVfYWRkcmVzczogQWNjb3VudCkgLT4gYm9vbDoKICAgIHByb3RvIDIgMQogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5CiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5LTYwCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5LTYxCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjEKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAtNjEKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgPj0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX21lcmdlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKSAtPiB2b2lkOgpfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2NQogICAgLy8gYXNzZXJ0IHNlbGYuX2lzX2FycmFuZ2VyKFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTIKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgPT0gc2VsZi5hcnJhbmdlci52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE4IC8vIDB4NTIyMzQxNzI3MjYxNmU2NzY1NzIyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgPT0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2NQogICAgLy8gYXNzZXJ0IHNlbGYuX2lzX2FycmFuZ2VyKFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpIC0+IHZvaWQ6Cl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4MwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFzc2V0X2RlZmF1bHRlZCwgZXJyLkRFRkFVTFRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQxIC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfZGVmYXVsdGVkIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIERlZmF1bHRlZAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkgLT4gdm9pZDoKX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg2CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYXNzZXRfc3VzcGVuZGVkLCBlcnIuU1VTUEVOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzMgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9zdXNwZW5kZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gU3VzcGVuZGVkIG9wZXJhdGlvbnMKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkOiB1aW50NjQpIC0+IHZvaWQ6Cl9hc3NlcnRfdmFsaWRfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OAogICAgLy8gZGVmIF9hc3NlcnRfdmFsaWRfcm9sZShzZWxmLCByb2xlX2lkOiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTAKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIHB1c2hpbnQgMjAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkxCiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgcHVzaGludCAyNQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTIKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICBwdXNoaW50IDQwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MwogICAgLy8gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgcHVzaGludCA1MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTQKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgcHVzaGludCA2MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTUKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICBwdXNoaW50IDcwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NgogICAgLy8gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgcHVzaGludCA4MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfZmFsc2VAOAoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3OgogICAgaW50Y18xIC8vIDEKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX21lcmdlQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgcmV0c3ViCgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9mYWxzZUA4OgogICAgaW50Y18wIC8vIDAKICAgIGIgX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfbWVyZ2VAOQo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" }, "byteCode": { diff --git a/smart_contracts/artifacts/d-asa/DASA.clear.puya.map b/smart_contracts/artifacts/d_asa/DASA.clear.puya.map similarity index 100% rename from smart_contracts/artifacts/d-asa/DASA.clear.puya.map rename to smart_contracts/artifacts/d_asa/DASA.clear.puya.map diff --git a/smart_contracts/artifacts/d-asa/DASA.clear.teal b/smart_contracts/artifacts/d_asa/DASA.clear.teal similarity index 100% rename from smart_contracts/artifacts/d-asa/DASA.clear.teal rename to smart_contracts/artifacts/d_asa/DASA.clear.teal diff --git a/smart_contracts/artifacts/d-asa/dasa_client.py b/smart_contracts/artifacts/d_asa/dasa_client.py similarity index 99% rename from smart_contracts/artifacts/d-asa/dasa_client.py rename to smart_contracts/artifacts/d_asa/dasa_client.py index 60664859..eef67f7e 100644 --- a/smart_contracts/artifacts/d-asa/dasa_client.py +++ b/smart_contracts/artifacts/d_asa/dasa_client.py @@ -19,7 +19,7 @@ import algokit_utils from algokit_utils import AlgorandClient as _AlgoKitAlgorandClient -_APP_SPEC_JSON = r"""{"arcs": [22, 28], "bareActions": {"call": [], "create": []}, "methods": [{"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "name": "max_event_count"}], "name": "fund_due_cashflows", "returns": {"type": "(uint64,uint64,uint64,uint64,uint64)", "struct": "CashFundingResult"}, "desc": "Reserve due ACTUS cash events into the escrow-style claim ledger.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "name": "holding_address"}, {"type": "byte[]", "name": "payment_info"}], "name": "claim_due_cashflows", "returns": {"type": "(uint64,uint64,uint64,uint64,byte[])", "struct": "CashClaimResult"}, "desc": "Withdraw the holder's already funded ACTUS cash entitlements.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "name": "open_date"}, {"type": "uint64", "name": "closure_date"}], "name": "set_transfer_schedule", "returns": {"type": "uint64"}, "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "name": "holding_address"}, {"type": "uint64", "name": "units"}], "name": "primary_distribution", "returns": {"type": "uint64"}, "desc": "Reserve units for a holder before IED finalizes issuance.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "name": "sender_holding_address"}, {"type": "address", "name": "receiver_holding_address"}, {"type": "uint64", "name": "units"}], "name": "transfer", "returns": {"type": "uint64"}, "desc": "Transfer active units after settling both counterparties to the current cursor.\nReturns the number of units moved. The ACTUS kernel no longer persists a nominal per-unit value on-chain, so transfer results are unit-based.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "bool", "desc": "Suspension status", "name": "suspended"}], "name": "account_gov_suspension", "returns": {"type": "uint64", "desc": "Timestamp of the set account suspension status"}, "desc": "Set account suspension status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "address", "desc": "Account Payment Address", "name": "payment_address"}], "name": "account_open", "returns": {"type": "uint64", "desc": "Timestamp of the account opening"}, "desc": "Open a contract account with a new position and register its payment address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "address", "desc": "Account Payment Address", "name": "payment_address"}], "name": "account_update_payment_address", "returns": {"type": "uint64", "desc": "Timestamp of the account update"}, "desc": "Update the Payment Address of an account", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}], "name": "account_get_position", "returns": {"type": "(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64)", "desc": "Account position", "struct": "AccountPosition"}, "desc": "Get account position", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": [], "create": ["NoOp"]}, "args": [{"type": "address", "desc": "D-ASA Arranger Address", "name": "arranger"}], "name": "contract_create", "returns": {"type": "uint64", "desc": "UNIX timestamp of contract creation"}, "desc": "Create a new D-ASA contract and set the Arranger role", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64)", "desc": "Normalized ACTUS terms", "name": "terms", "struct": "NormalizedActusTerms"}, {"type": "(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "desc": "Initial kernel state (pre-IED)", "name": "initial_state", "struct": "InitialKernelState"}, {"type": "(byte[32],string)", "desc": "Prospectus (informational only)", "name": "prospectus", "struct": "Prospectus"}], "name": "contract_config", "returns": {"type": "uint64", "desc": "UNIX timestamp of contract configuration"}, "desc": "Partial contract configuration with: normalized ACTUS terms, initial kernel\nstate (pre-IED), prospectus (informational only). The contract stays inactive until all schedule pages are configured next.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "name": "schedule_page_index"}, {"type": "bool", "name": "is_last_page"}, {"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[]", "name": "schedule_page"}], "name": "contract_schedule", "returns": {"type": "uint64"}, "desc": "Upload one normalized schedule page.\nThe configuration operation is considered complete only when the last page is stored. At that point `schedule_entry_count` is finalized and the contract moves to `STATUS_PENDING_IED`.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "execute_ied", "returns": {"type": "uint64"}, "desc": "Execute the first due `IED` entry and activate the contract.\n`IED` is the one non-cash event that moves the app from `STATUS_PENDING_IED` to `STATUS_ACTIVE`.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "name": "event_id"}, {"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "name": "payload", "struct": "ObservedEventRequest"}], "name": "apply_non_cash_event", "returns": {"type": "uint64"}, "desc": "Apply the next due non-cash event, optionally appending one first.\nObserved payloads are appended before execution when flagged. Rate reset events require the interest oracle because they can change the running nominal rate; other non-cash events stay arranger-controlled.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_contract_state", "returns": {"type": "(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "struct": "KernelState"}, "desc": "Return a readonly snapshot of the generic ACTUS kernel state.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_next_due_event", "returns": {"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "struct": "ExecutionScheduleEntry"}, "desc": "Return the next boxed schedule entry, or a zeroed sentinel if ended.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["UpdateApplication"], "create": []}, "args": [], "name": "contract_update", "returns": {"type": "void"}, "desc": "Update D-ASA application.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "New Arranger address", "name": "new_arranger"}], "name": "rbac_rotate_arranger", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Rotate the Arranger address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Operation Daemon address", "name": "address"}], "name": "rbac_set_op_daemon", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Non-Normative: Set the Operation Daemon address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}, {"type": "(uint64,uint64)", "desc": "Role time validity", "name": "validity", "struct": "RoleValidity"}], "name": "rbac_assign_role", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Assign a role to an address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}], "name": "rbac_revoke_role", "returns": {"type": "uint64", "desc": "Timestamp of the role revocation"}, "desc": "Revoke a role from an address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Suspension status", "name": "suspended"}], "name": "rbac_gov_asset_suspension", "returns": {"type": "uint64", "desc": "Timestamp of the set asset suspension status"}, "desc": "Set asset suspension status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "rbac_get_arranger", "returns": {"type": "address", "desc": "Arranger address"}, "desc": "Get Arranger address", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Address to get roles for", "name": "address"}], "name": "rbac_get_address_roles", "returns": {"type": "(bool,bool,bool,bool,bool)", "desc": "Roles mask: (Account Manager, Primary Dealer, Trustee, Authority, Observer)"}, "desc": "Non-normative - Get roles assigned to an address", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}], "name": "rbac_get_role_validity", "returns": {"type": "(uint64,uint64)", "desc": "Role validity", "struct": "RoleValidity"}, "desc": "Get role validity", "events": [], "readonly": true, "recommendations": {}}], "name": "DASA", "state": {"keys": {"box": {}, "global": {"arranger": {"key": "UiNBcnJhbmdlciM=", "keyType": "AVMBytes", "valueType": "address"}, "op_daemon": {"key": "UiNPcERhZW1vbiM=", "keyType": "AVMBytes", "valueType": "address"}, "asset_suspended": {"key": "YXNzZXRfc3VzcGVuZGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "asset_defaulted": {"key": "YXNzZXRfZGVmYXVsdGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "status": {"key": "c3RhdHVz", "keyType": "AVMString", "valueType": "AVMUint64"}, "contract_type": {"key": "Y29udHJhY3RfdHlwZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "prospectus_hash": {"key": "cHJvc3BlY3R1c19oYXNo", "keyType": "AVMString", "valueType": "AVMBytes"}, "prospectus_url": {"key": "cHJvc3BlY3R1c191cmw=", "keyType": "AVMString", "valueType": "AVMString"}, "denomination_asset_id": {"key": "ZGVub21pbmF0aW9uX2Fzc2V0X2lk", "keyType": "AVMString", "valueType": "AVMUint64"}, "settlement_asset_id": {"key": "c2V0dGxlbWVudF9hc3NldF9pZA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "initial_exchange_date": {"key": "aW5pdGlhbF9leGNoYW5nZV9kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "maturity_date": {"key": "bWF0dXJpdHlfZGF0ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "transfer_opening_date": {"key": "dHJhbnNmZXJfb3BlbmluZ19kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "transfer_closure_date": {"key": "dHJhbnNmZXJfY2xvc3VyZV9kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "day_count_convention": {"key": "ZGF5X2NvdW50X2NvbnZlbnRpb24=", "keyType": "AVMString", "valueType": "AVMUint64"}, "total_units": {"key": "dG90YWxfdW5pdHM=", "keyType": "AVMString", "valueType": "AVMUint64"}, "reserved_units_total": {"key": "cmVzZXJ2ZWRfdW5pdHNfdG90YWw=", "keyType": "AVMString", "valueType": "AVMUint64"}, "initial_exchange_amount": {"key": "aW5pdGlhbF9leGNoYW5nZV9hbW91bnQ=", "keyType": "AVMString", "valueType": "AVMUint64"}, "outstanding_principal": {"key": "b3V0c3RhbmRpbmdfcHJpbmNpcGFs", "keyType": "AVMString", "valueType": "AVMUint64"}, "next_principal_redemption": {"key": "bmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbg==", "keyType": "AVMString", "valueType": "AVMUint64"}, "dynamic_principal_redemption": {"key": "ZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbg==", "keyType": "AVMString", "valueType": "AVMUint64"}, "interest_calculation_base": {"key": "aW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "accrued_interest": {"key": "YWNjcnVlZF9pbnRlcmVzdA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "nominal_interest_rate": {"key": "bm9taW5hbF9pbnRlcmVzdF9yYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_spread": {"key": "cmF0ZV9yZXNldF9zcHJlYWQ=", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_multiplier": {"key": "cmF0ZV9yZXNldF9tdWx0aXBsaWVy", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_floor": {"key": "cmF0ZV9yZXNldF9mbG9vcg==", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_cap": {"key": "cmF0ZV9yZXNldF9jYXA=", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_next": {"key": "cmF0ZV9yZXNldF9uZXh0", "keyType": "AVMString", "valueType": "AVMUint64"}, "has_rate_reset_floor": {"key": "aGFzX3JhdGVfcmVzZXRfZmxvb3I=", "keyType": "AVMString", "valueType": "AVMUint64"}, "has_rate_reset_cap": {"key": "aGFzX3JhdGVfcmVzZXRfY2Fw", "keyType": "AVMString", "valueType": "AVMUint64"}, "reserved_principal": {"key": "cmVzZXJ2ZWRfcHJpbmNpcGFs", "keyType": "AVMString", "valueType": "AVMUint64"}, "reserved_interest": {"key": "cmVzZXJ2ZWRfaW50ZXJlc3Q=", "keyType": "AVMString", "valueType": "AVMUint64"}, "cumulative_interest_index": {"key": "Y3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "cumulative_principal_index": {"key": "Y3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXg=", "keyType": "AVMString", "valueType": "AVMUint64"}, "event_cursor": {"key": "ZXZlbnRfY3Vyc29y", "keyType": "AVMString", "valueType": "AVMUint64"}, "schedule_entry_count": {"key": "c2NoZWR1bGVfZW50cnlfY291bnQ=", "keyType": "AVMString", "valueType": "AVMUint64"}, "fixed_point_scale": {"key": "Zml4ZWRfcG9pbnRfc2NhbGU=", "keyType": "AVMString", "valueType": "AVMUint64"}}, "local": {}}, "maps": {"box": {"account_manager": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNBY2NvdW50TWFuYWdlciM="}, "primary_dealer": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNQcmltYXJ5RGVhbGVyIw=="}, "trustee": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNUcnVzdGVlIw=="}, "authority": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNBdXRob3JpdHkj"}, "observer": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNPYnNlcnZlciM="}, "schedule_page": {"keyType": "uint64", "valueType": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[]", "prefix": "UyM="}, "account": {"keyType": "address", "valueType": "AccountPosition", "prefix": "UiNBY2NvdW50Iw=="}}, "global": {}, "local": {}}, "schema": {"global": {"bytes": 4, "ints": 37}, "local": {"bytes": 0, "ints": 0}}}, "structs": {"AccountPosition": [{"name": "payment_address", "type": "address"}, {"name": "units", "type": "uint64"}, {"name": "reserved_units", "type": "uint64"}, {"name": "suspended", "type": "bool"}, {"name": "settled_cursor", "type": "uint64"}, {"name": "interest_checkpoint", "type": "uint64"}, {"name": "principal_checkpoint", "type": "uint64"}, {"name": "claimable_interest", "type": "uint64"}, {"name": "claimable_principal", "type": "uint64"}], "CashClaimResult": [{"name": "interest_amount", "type": "uint64"}, {"name": "principal_amount", "type": "uint64"}, {"name": "total_amount", "type": "uint64"}, {"name": "timestamp", "type": "uint64"}, {"name": "context", "type": "byte[]"}], "CashFundingResult": [{"name": "funded_interest", "type": "uint64"}, {"name": "funded_principal", "type": "uint64"}, {"name": "total_funded", "type": "uint64"}, {"name": "processed_events", "type": "uint64"}, {"name": "timestamp", "type": "uint64"}], "ExecutionScheduleEntry": [{"name": "event_id", "type": "uint64"}, {"name": "event_type", "type": "uint8"}, {"name": "scheduled_time", "type": "uint64"}, {"name": "accrual_factor", "type": "uint64"}, {"name": "redemption_accrual_factor", "type": "uint64"}, {"name": "next_nominal_interest_rate", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "next_outstanding_principal", "type": "uint64"}, {"name": "flags", "type": "uint64"}], "InitialKernelState": [{"name": "status_date", "type": "uint64"}, {"name": "event_cursor", "type": "uint64"}, {"name": "outstanding_principal", "type": "uint64"}, {"name": "interest_calculation_base", "type": "uint64"}, {"name": "nominal_interest_rate", "type": "uint64"}, {"name": "accrued_interest", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "cumulative_interest_index", "type": "uint64"}, {"name": "cumulative_principal_index", "type": "uint64"}], "KernelState": [{"name": "contract_type", "type": "uint8"}, {"name": "status", "type": "uint64"}, {"name": "total_units", "type": "uint64"}, {"name": "reserved_units_total", "type": "uint64"}, {"name": "initial_exchange_amount", "type": "uint64"}, {"name": "event_cursor", "type": "uint64"}, {"name": "schedule_entry_count", "type": "uint64"}, {"name": "outstanding_principal", "type": "uint64"}, {"name": "interest_calculation_base", "type": "uint64"}, {"name": "nominal_interest_rate", "type": "uint64"}, {"name": "accrued_interest", "type": "uint64"}, {"name": "cumulative_interest_index", "type": "uint64"}, {"name": "cumulative_principal_index", "type": "uint64"}, {"name": "reserved_interest", "type": "uint64"}, {"name": "reserved_principal", "type": "uint64"}], "NormalizedActusTerms": [{"name": "contract_type", "type": "uint8"}, {"name": "denomination_asset_id", "type": "uint64"}, {"name": "settlement_asset_id", "type": "uint64"}, {"name": "total_units", "type": "uint64"}, {"name": "notional_principal", "type": "uint64"}, {"name": "initial_exchange_amount", "type": "uint64"}, {"name": "initial_exchange_date", "type": "uint64"}, {"name": "maturity_date", "type": "uint64"}, {"name": "day_count_convention", "type": "uint8"}, {"name": "rate_reset_spread", "type": "uint64"}, {"name": "rate_reset_multiplier", "type": "uint64"}, {"name": "rate_reset_floor", "type": "uint64"}, {"name": "rate_reset_cap", "type": "uint64"}, {"name": "rate_reset_next", "type": "uint64"}, {"name": "has_rate_reset_floor", "type": "bool"}, {"name": "has_rate_reset_cap", "type": "bool"}, {"name": "dynamic_principal_redemption", "type": "bool"}, {"name": "fixed_point_scale", "type": "uint64"}], "ObservedEventRequest": [{"name": "event_id", "type": "uint64"}, {"name": "event_type", "type": "uint8"}, {"name": "scheduled_time", "type": "uint64"}, {"name": "accrual_factor", "type": "uint64"}, {"name": "redemption_accrual_factor", "type": "uint64"}, {"name": "observed_rate", "type": "uint64"}, {"name": "next_nominal_interest_rate", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "next_outstanding_principal", "type": "uint64"}, {"name": "flags", "type": "uint64"}], "Prospectus": [{"name": "hash", "type": "byte[32]"}, {"name": "url", "type": "string"}], "RoleValidity": [{"name": "role_validity_start", "type": "uint64"}, {"name": "role_validity_end", "type": "uint64"}]}, "byteCode": {"approval": "DCAEAAEIICYwBBUffHUGc3RhdHVzDGV2ZW50X2N1cnNvchVvdXRzdGFuZGluZ19wcmluY2lwYWwUc2NoZWR1bGVfZW50cnlfY291bnQRZml4ZWRfcG9pbnRfc2NhbGUQYWNjcnVlZF9pbnRlcmVzdBlpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlClIjQWNjb3VudCMVbm9taW5hbF9pbnRlcmVzdF9yYXRlFHJlc2VydmVkX3VuaXRzX3RvdGFsEnJlc2VydmVkX3ByaW5jaXBhbA1jb250cmFjdF90eXBlC3RvdGFsX3VuaXRzGW5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24RcmVzZXJ2ZWRfaW50ZXJlc3QZY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleBpjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleAtSI0FycmFuZ2VyIxNzZXR0bGVtZW50X2Fzc2V0X2lkF2luaXRpYWxfZXhjaGFuZ2VfYW1vdW50DFIjQXV0aG9yaXR5IxBSI1ByaW1hcnlEZWFsZXIjEVIjQWNjb3VudE1hbmFnZXIjC1IjT2JzZXJ2ZXIjC1IjT3BEYWVtb24jFWluaXRpYWxfZXhjaGFuZ2VfZGF0ZRV0cmFuc2Zlcl9vcGVuaW5nX2RhdGUVdHJhbnNmZXJfY2xvc3VyZV9kYXRlEHJhdGVfcmVzZXRfZmxvb3IOcmF0ZV9yZXNldF9jYXACUyMKUiNUcnVzdGVlIw9hc3NldF9zdXNwZW5kZWQcZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbhFyYXRlX3Jlc2V0X3NwcmVhZBVyYXRlX3Jlc2V0X211bHRpcGxpZXIPcmF0ZV9yZXNldF9uZXh0FGhhc19yYXRlX3Jlc2V0X2Zsb29yEmhhc19yYXRlX3Jlc2V0X2NhcAEAD2Fzc2V0X2RlZmF1bHRlZA9wcm9zcGVjdHVzX2hhc2gOcHJvc3BlY3R1c191cmwVZGVub21pbmF0aW9uX2Fzc2V0X2lkDW1hdHVyaXR5X2RhdGUUZGF5X2NvdW50X2NvbnZlbnRpb24DBoEBMRhAAK0nEjIDZycZMgNnJyEiZycpImcpImcnDCJnJyqAAGcnK4AAZycsImcnEyJnJxoiZyctImcnGyJnJxwiZycuImcnDSJnJwoiZycUImcrImcnDiJnJyIiZycHImcnBiJnJwkiZycjImcnJCJnJx0iZyceImcnJSJnJyYiZycnImcnCyJnJw8iZycQImcnESJnKiJnJwQiZycFImcxNYEEEkQxNIElEkQxNxREMTYURIAEkU8E6zYaAI4BAMAxGRREMRhBAKmCFwS0RhjIBOeDJSkEfqIOCwRshePuBL3RqUQE3AY7NQQU/BDvBHSnKX8ECdT+FASam/qFBIXu0z0EkYUQSgTZ8iWsBG4OXJUE/z/UswSC9xstBO8E9dME3zQ1UAQ9voC9BN9U6CwEAQyCmQR0BqzSBBpyou42GgCOFwAbAscEIwRNBNcFyAYCBloGjQa7CK4J6ApiC9QMZwytDMUM3Q2SDigORw5SDpwAgASVbXFWNhoAjgEGmAAxGYEEEjEYEERCDI0igABHCjYaAUkVJBJEFyIpZUREiBSjiBSqiBSvIillRIEyEhREIkcCSwJLBAxBAlEiKmVEIicEZUQMQQJEIiplRIgQA0lFEYEJW0lFBjIHDUACLksPJFVJRRAkEklFB0AAEEsOgQMSQAAISw6BExJBAjYjQQILSw8iWyIqZUQSREsEMgcOREsFQAHkSw6BExJAAdwiRQ1LDyRVSUUQgQMSQAFgSw6BExJAAVgiRQhLD4ExW0UKiBCMQAD7SwlFC0sMiA9JSwiID0RLAYgPXklOAkURSYgPVUlFDUsCSwEISUUMMgoiJxNlRHAARCInD2VEIicLZURLAQhLAksBD0RPAkwJTwIPRE8DCCcPTGciJwtlRAgnC0xnIicQZURPAggnEExnIicRZUQIJxFMZ0sPJFWBAxJBAHciJwZlREsQiBAYRRIIJwZMZ4gP+EEACksPJFWBExJBAAlLD4EpWycOTGcrSwpnJwdLC2ciKmVEIwgqTGdLD1cIAYABE6hBABAiK2VEQAAJKYHIAWcnByJnSw9LB0mIEnFISwFLDghFAklLCQhFAUsCIwhFA0L+eScGImdC/5NLDyRVSUUQgQMSQQAPIitlREsICUlFC0ULQv7tSw4kEkEAEiIrZUxFC0QiJwdlTEUMREL+1EsOgRMSQAAHSwlFC0L+xSJFCiJFC0L+vIgPPkEAU0sOgRMSQQAJIitlREUIQv6UIicGZURLEIgPNkUSCElFDSInDmVED0EABiJFCEL+dSInDmVESwwJSUUKIitlRA1BAAkiK2VERQhC/llLCEUIQv5SSw+BMVsiK2VESg5ETAlFCEL+PyInBmVESxCIDuFFEghFDUL+FUsCSURLAklLA0lOAwgyB08CFk8DFlBPAhZQTwIWUEwWUChMULAjQyJC/ceAAEcCNhoBRwIVJRJENhoCSSJZgQIISwEVEkRXAgBMIillREQnCExQSb1FAUQiJxllRDIDE0EAIjEAIicZZUQSQAAVMQBLAxJAAA0xAEsBvkRXACASQQEAI0SIEbqIEb8iKWVEgTISFERLAkmIDISIDAdGAkm+REmBSVtJTgJFCEmBUVtJRQhPAghJRQZEVwAgIicTZURwAEUBQQC3Sb5EgYADU0AArSNBAHgyCiInE2VETEsBcABESwVJTgIPREsCSU4DvkRJVwAgsTIATwOyEkyyFE8CshGBBLIQsgGzSYFJW0lOAkUJSYFRW0lOA0UJIhZMSwFcSUxcUU8DTL8iJw9lRElLAg9EIicLZURLAw9ETAknD0xnIicLZURMCScLTGdLBUlLBklOAwgyB08CFk8DFlBPAhZQTBZQSwJJFRZXBgJMUEyAAgAiUExQKExQsCNDIkL/UCJC/v02GgFJFSQSRBc2GgJJFSQSRBeIEJxKDEQnG08CZyccTGcyBxYoTFCwI0M2GgFJFSUSRDYaAkkVJBJEF0lOAiIpZUREJxYxAIgQM0SIEG2IEHIiKWVEgTISRCcISwJQSU4DvUUBREyICqNJRCInCmVECCInDWVEDkQiJxplREEACTIHIicaZUQOREcCvkSBKFtLA0lOAwgWgShMuyInCmVECCcKSwFnIicNZURMCRYoTFCwI0MiSTYaAUkVJRJENhoCSRUlEkQ2GgNHAhUkEkQXIillRESID+OID+giKWVEgTISFEQiJxtlREEACSInG2VEMgcORCInHGVEQQAJMgciJxxlRAxEMQBLBElOAhJEJwhLAVBJRQhJvUUBRCcISwVJTgJQSUUJvUUBREsCiAncSYgJ2E8CE0RLAUlETL5EJVsORCIqZUQiJwRlRA9AAA4iKmVEiArogQlbMgcNREsDSYgKM0sDSU4CiAoriAmuRgKICalGAksFSb5EJVtLAklOAksBDkRLAQkWTwIlTwK7SwVJvkQlW08CCBYlTLsoSwJQsCNDNhoBSRUlEkQ2GgJJFSMSRCJTJxUxAIgOv0QnCE8CUEm9RQFESYEwI7oiTwNUgTBMuzIHFihMULAjQzYaAUkVJRJENhoCSRUlEkQnFzEAiA6HRCIpZUSByAESFESIDreIDrwnCE8CUEm9RQEURCIWTwJLAVBLAVAnKFBLAVBLAVBLAVBLAVBMUL8yBxYoTFCwI0M2GgFJFSUSRDYaAkkVJRJEJwhLAlBJvUUBRDEATwMSRIgOYYgOZiJPArsyBxYoTFCwI0M2GgFJFSUSRCcITFBJvUUBRL5IKExQsCNDNhoBSRUlEkQnEkxnMgcWKExQsCNDgABJNhoBRwIVgWsSRDYaAklOAhWBSBJENhoDSU4CSRVLASVZSYEiEkRPAkxLAlJJTgMiWYEkCBJEiA3dIlVJJwxLAWdBACJJIxJAABxJgQISQAAVSYEDEkAADkmBBBJAAAdJgQUSQQGGI0QiJwxlTEUCREsESYEhW0lFCESBOVVJRQhBAB9LBiMSQAAYSwaBAhJAABBLBoEDEkAACEsGgQQSQQFGI0RJIxNBAAhLBIGSBlMURCIpZUQURCInFGVEFERLBEkjW0lxC0UBRCcsSwFnSwGBCVtJTwISRCcTSwFnsTIAMgoishKyFEyyEYEEshCyAbNJgRFbJw1MZycKImcnLksIZ0mBKVsnGksBZ0sBgTFbJy1LAWdLBklOAoEwWycOTGcnFEsKZ0sDgZIGUyciTGdLAYEQWytMZ0sBgShbJwZMZ0sBJVsnCUxnSwGBGFsnB0xnSwOBOlsnI0xnSwOBQlsnJExnSwOBSlsnHUxnSwOBUlsnHkxnSwOBWlsnJUxnSwOBkAZTJyZMZ0sDgZEGUycnTGdPA4FjWycFTGdLASRbKkxnSwGBOFsnEExnSwGBQFsnEUxnJw8iZycLImdLAjIHDURMIltLAgxEDERLAlcAICcqTGdLAVcCACcrTGcyBxYoTFCwI0MiQv63IkL+dyKAAEcDNhoBSRUkEkQXSTYaAkkVIxJEIlNMNhoDSU4CSSJZSU4DSYFBC4ECCE8CFRJEiAvxIicMZUxOA0QiKWVEFERJgRAORCInFGVEREyBEAtMgWQLgeYLCEkyDA1BABixgQayEIEFshknL7IeJy+yHyKyAbNC/+EiRQpLCUsEDEEAjksEVwIASUUNSwpJTgKBQQuBQVhJJFVJTgJFDkkiW0lFDUsFTwQISwESREsFTwOIBzRMgQlbSUUKREEAGUsJQQAnSwkjCYFBC0sMTIFBWIEJW0sIDkRLCEAABUsKIxJESwkjCEUKQv+QSwZJRCMJFicfTFBJvUUBREkigQK6F0lEIwmBQQuBAgiBQbpC/8BLBhYnH0xQSbxISwW/SwVBAA1LAUsECCcETGcpgTJnMgcWKExQsCNDIillRESICuSICuuICvAiKmVEIicEZURLAQ1EiAZcSVcIAUmAAQGoREsBVwAISwJXCQhLA1cRCEsEVxkISwVXIQhLBlcpCEsHVzEISwhXOQhPB08IUE8HUE8GUE8FUCIWUE8EUE8DUE8CUExQiAePRgIyBxYoTFCwI0MiRwSAAEk2GgFJFSQSRBc2GgJHAhWBSRJEIillRESICluICmCBQVtJgQQaQQC2IicMZUSBBRJEiAo4IicMZURJgQUSREsCSSJbSUUHIicEZUQSRElXCAFFDCRViAXXIicEZUSBEAqAAgAARQcWJx9MUElFCb1FAUEAB0sHvkxFB0RLBUkiWUmBEAxESwNJVwkISwFXEQhLAlcZCEsDVykISwRXMQhPBVc5CEsLFksSUE8GUE8FUE8EUE8DUE8CUExQSwMWUE8CTFBMIwgWVwYCXABLCEm8SEy/IicEZUQjCCcETGciKmVESwNJTwISRIgFDklFCElXCAFFCiRVSUUGIxJAAChLBIEEEkAAIEsEgQwSQAAYSwSBCxJAABBLBIESEkAACEsEgQUSQQBBI0RLCIABAalESwSBDBJAAAhLBIELEkEAJCNBABonGDEAiAjtREsGSwKIBitGAjIHFihMULAjQ4gJC0L/6CJC/9kiQv+8IillRElEIicMZUQWSZMkDkRXBwEiJw1lRCInCmVEIicUZUQiKmVEIicEZUQiK2VEIicHZUQiJwllRCInBmVEIicQZUQiJxFlRCInD2VEIicLZURPDhZPDkxQTw0WUE8MFlBPCxZQTwoWUE8JFlBPCBZQTwcWUE8GFlBPBRZQTwQWUE8DFlBPAhZQTBZQKExQsCNDIillREQiKmVEIicEZUQPQQAlIiplRBYnKFAiFkxLAVBLAVBLAVBLAVBLAVBLAVBMUChMULAjQyIqZUSIA71C//CICCkjQzYaAUkVJRJEiAgcJxJMZzIHFihMULAjQzYaAUkVJRJEiAgEJxlMZzIHFihMULAjQzYaAUkVIxJENhoCSU4CFSUSRDYaA0lOAhWBEBJEiAfXiAfeF0cCiAfogRQSQQAOJxJLA2cyBxYoTFCwI0NJgSgSQQARJxdLA1BJvUUBFERLAr9C/99JgTISQQARJxZLA1BJvUUBFERLAr9C/8dJgTwSQQARJyBLA1BJvUUBFERLAr9C/69JgUYSQQARJxVLA1BJvUUBFERLAr9C/5dJgVASQf+QJxhLA1BJvUUBFERLAr9C/382GgFJFSMSRDYaAklOAhUlEkSIBy2IBzQXRwKIBz5JgRQTRIEoEkEAFScXSwJQSb1FAUS8SDIHFihMULAjQ0mBMhJBAA8nFksCUEm9RQFEvEhC/+FJgTwSQQAPJyBLAlBJvUUBRLxIQv/LSYFGEkEADycVSwJQSb1FAUS8SEL/tUmBUBJB/64nGEsCUEm9RQFEvEhC/582GgFJFSMSRCJTJxUxAIgGZ0QnIUxnMgcWKExQsCNDIicSZUQoTFCwI0M2GgFJFSUSRCcXSwGIBj8nFksCiAY4JyBLA4gGMScVSwSIBionGE8FiAYjJygiTwZUI08FVIECTwRUgQNPA1SBBE8CVChMULAjQzYaAUkVIxJENhoCSU4CFSUSRBdJiAY7gwYUKDI8RlBPBo4GAE8AQAAxACIAEwABACcYSwFQSb1FAUS+SChMULAjQycVSwFQSb1FAUS+SEL/6ycgSwFQSb1FAUS+SEL/3CcWSwFQSb1FAUS+SEL/zScXSwFQSb1FAUS+SEL/voAQAAAAAAAAAAAAAAAAAAAAAEL/qYoBACcIi/9QvkSBgANTFESJigECJwiL/1BJvUUBREm+SCInEGVESwGBOVsJIicRZURLAoFBWwlLAiVbIicFZURPA0sCTwKIAJgiJwVlRE8DTwNPAogAiksCgUlbSwIIFk8DTFxJSYFRW0sCCBZcUSInEGVEFlw5IicRZUQWXEEiKmVEFlwxTwNMv4mKAQAigAAnCIv/UEm9RQFEIillRIEyEkEAAYmLAr5MSU4CjABEgShbSYwBQAABiYsASSVbiwFJTgMIFlwgIhZcKIsCTL8iJwplRElLAg9ETAknCkxniYoDAYv9QQAFi/5AAAIiiYv9i/4di/+XiYoBAYv/QAACIokiJw1lRElEIicFZUSL/0xPAoj/yomKAQGL/0AAAiKJIicNZUQiJwVlRIv/TIj/r4mKAQEiJwRlRIv/DUSL/4EQChYnH0xQSb1FAUSL/4EQGEsBIoECuhdLAQ1EgUELgQIIgUG6iYoCAIv/IxJAAB+L/yQSQAAYi/+BExJAABCL/4EMEkAACIv/gQsSQQADI0SJi/5AAAQiQv/1i/6BAxJAAAiL/oECEkEAGIv/gQMSQAAIi/+BEhJBAAQjQv/RIkL/zYv+IxJBACCL/4EDEkAAEIv/gRISQAAIi/+BBRJBAAQjQv+qIkL/pov+gQQSQQAoi/+BAxJAABiL/4EEEkAAEIv/gRISQAAIi/+BBRJBAAQjQv96IkL/dov+gQUSQQAIi/+BAxJC/2YiQv9iIicMZUQjEkEACiInImVEQQACI4kiiYoBAov/gRFbSUEAECInCWVEQQAIIicHZURAAAYii/9PAokiJwdlRCInCWVEIicFZUSI/mciJwVlRIsATIj+XIv/TwKJigIBi/9AAAOL/okiJwVlRCInCWVEi/9LAoj+OwhJRCInBWVEi/5MTwKI/iuJigICIoAARwiL/iJbIiplRBJEi/6BCVsyBw5Ei/4kVUkjEklBAF0iKWVEgTISRCInCmVEIicNZUQSRIv+gTFbK0sBZycHTGeL/oEhWycJTGcnBiJni/6BKVsnDkxnIiplRCMIKkxnKYFkZ4sLRCInFGVEi/5MIogBxUmM/ov/jAGMAIkiKWVEgTISFEQiJwZlRIv+iP75jP4IJwZMZ4sKgQwSQQFji/+BIVsiJyRlRCInBWVEiP1zIicjZUQIjAYiJyZlREEAEyInHWVEiwYNQQAIIicdZUyMBkQiJydlREEAEyInHmVEiwYMQQAIIiceZUyMBkQnCYsGZ4sKgQQSQQDzi/6BMVsrSwFnJwdMZ4j+Z0EA1IsKgQUSQQCyIicFZUyMAkQijAEijAeL/oEZW0mMCEEAD4sCiwiI/pZJjAIjjAeMASIqZUQjCIwDIicEZUSLAw1BAFKLA4j9H0mMACRVSYwEgQMSQAAQiwSBExJBADOLAIEZW0EAKyNBAAiLB0EADCKMB4sDIwiMA0L/vYsAgRlbiwJMiP44SYwCiwEIjAFC/+EiQv/SiwFEIitlRIv+gTlbJBpAAAYiJwZlRAgiJwVlRIsBiPxfJw5MZyIqZUQjCCpMZ4v+IkmIAF9JjP6L/4wBjACJi/6BKVsnDkxnQv/aiwqBEhJB/xIiK2VEJwdMZ0L/B4sKgQsSQQAbi/6BIVtJjAVAAAgiJyVlTIwFRCcJiwVnQv7Pi/6BIVtJjAlB/sQnCYsJZ0L+vIoDATIIi/0iW4v9VwgBi/1XCQgyB4v9JFWL/kAARSMWSZMkDkRXBwEiJxNlRIsBSSMIiwAWTwIWUIsCUIsDUIsEFlCL/hZQTwNQi/8WUE8CFlBMFlCABJozK5VMULCL/YwAiYsFIxJAAAiLBYEEEkEABCNC/6mB/wFC/6OKAgGAAIv+i/9QSb1FAUEAH4sBvkQiWzIHSYwADkEAEIsBvkQkW4sAD0EABCOMAIkiQv/5MQAiJxJlRBJEiSInKWVEFESJIichZUQURImKAQCL/4EUEkAAMIv/gRkSQAAoi/+BKBJAACCL/4EyEkAAGIv/gTwSQAAQi/+BRhJAAAiL/4FQEkEAAyNEiSJC//o=", "clear": "DIEBQw=="}, "desc": "Debt Algorand Standard Application.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "networks": {}, "source": {"approval": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCAzMgogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1ICJzdGF0dXMiICJldmVudF9jdXJzb3IiICJvdXRzdGFuZGluZ19wcmluY2lwYWwiICJzY2hlZHVsZV9lbnRyeV9jb3VudCIgImZpeGVkX3BvaW50X3NjYWxlIiAiYWNjcnVlZF9pbnRlcmVzdCIgImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMgIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIgInJlc2VydmVkX3VuaXRzX3RvdGFsIiAicmVzZXJ2ZWRfcHJpbmNpcGFsIiAiY29udHJhY3RfdHlwZSIgInRvdGFsX3VuaXRzIiAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIgInJlc2VydmVkX2ludGVyZXN0IiAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIgImN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IiAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMgInNldHRsZW1lbnRfYXNzZXRfaWQiICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIgMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMgMHg1MjIzNTA3MjY5NmQ2MTcyNzk0NDY1NjE2YzY1NzIyMyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMgMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzIDB4NTIyMzRmNzA0NDYxNjU2ZDZmNmUyMyAiaW5pdGlhbF9leGNoYW5nZV9kYXRlIiAidHJhbnNmZXJfb3BlbmluZ19kYXRlIiAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIiAicmF0ZV9yZXNldF9mbG9vciIgInJhdGVfcmVzZXRfY2FwIiAweDUzMjMgMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMyAiYXNzZXRfc3VzcGVuZGVkIiAiZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiIgInJhdGVfcmVzZXRfc3ByZWFkIiAicmF0ZV9yZXNldF9tdWx0aXBsaWVyIiAicmF0ZV9yZXNldF9uZXh0IiAiaGFzX3JhdGVfcmVzZXRfZmxvb3IiICJoYXNfcmF0ZV9yZXNldF9jYXAiIDB4MDAgImFzc2V0X2RlZmF1bHRlZCIgInByb3NwZWN0dXNfaGFzaCIgInByb3NwZWN0dXNfdXJsIiAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIiAibWF0dXJpdHlfZGF0ZSIgImRheV9jb3VudF9jb252ZW50aW9uIiAweDA2ODEwMQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4LTI5CiAgICAvLyAjIFJCQUMgUm9sZXMKICAgIC8vIHNlbGYuYXJyYW5nZXIgPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX0FSUkFOR0VSKQogICAgYnl0ZWMgMTggLy8gMHg1MjIzNDE3MjcyNjE2ZTY3NjU3MjIzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzAKICAgIC8vIHNlbGYub3BfZGFlbW9uID0gR2xvYmFsU3RhdGUoQWNjb3VudCgpLCBrZXk9Y3N0LlBSRUZJWF9JRF9PUF9EQUVNT04pCiAgICBieXRlYyAyNSAvLyAweDUyMjM0ZjcwNDQ2MTY1NmQ2ZjZlMjMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo0Ny00OAogICAgLy8gIyBELUFTQSBHb3Zlcm5hbmNlCiAgICAvLyBzZWxmLmFzc2V0X3N1c3BlbmRlZCA9IEZhbHNlCiAgICBieXRlYyAzMyAvLyAiYXNzZXRfc3VzcGVuZGVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NDkKICAgIC8vIHNlbGYuYXNzZXRfZGVmYXVsdGVkID0gRmFsc2UKICAgIGJ5dGVjIDQxIC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU2LTU3CiAgICAvLyAjIENvbnRyYWN0CiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU4CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMTIgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYwLTYxCiAgICAvLyAjIFByb3NwZWN0dXMgKEluZm9ybWF0aW9uYWwpCiAgICAvLyBzZWxmLnByb3NwZWN0dXNfaGFzaCA9IEJ5dGVzKCkKICAgIGJ5dGVjIDQyIC8vICJwcm9zcGVjdHVzX2hhc2giCiAgICBwdXNoYnl0ZXMgMHgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2MgogICAgLy8gc2VsZi5wcm9zcGVjdHVzX3VybCA9IFN0cmluZygpCiAgICBieXRlYyA0MyAvLyAicHJvc3BlY3R1c191cmwiCiAgICBwdXNoYnl0ZXMgIiIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2NC02NQogICAgLy8gIyBEZW5vbWluYXRpb24KICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gQXNzZXQoKQogICAgYnl0ZWMgNDQgLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjYKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCA9IEFzc2V0KCkKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2OC02OQogICAgLy8gIyBUaW1lCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgMjYgLy8gImluaXRpYWxfZXhjaGFuZ2VfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzAKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgNDUgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjcxCiAgICAvLyBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgMjcgLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzIKICAgIC8vIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlID0gdHlwLlRpbWVTdGFtcCgpCiAgICBieXRlYyAyOCAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3NC03NQogICAgLy8gIyBEYXkgQ291bnQgQ29udmVudGlvbgogICAgLy8gc2VsZi5kYXlfY291bnRfY29udmVudGlvbiA9IFVJbnQ2NCgpCiAgICBieXRlYyA0NiAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojc3LTc4CiAgICAvLyAjIFVuaXRzCiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzID0gVUludDY0KCkKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzkKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPSBVSW50NjQoKQogICAgYnl0ZWMgMTAgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MS04MgogICAgLy8gIyBQcmluY2lwYWwKICAgIC8vIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPSBVSW50NjQoKQogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MwogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBVSW50NjQoKQogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4NAogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gVUludDY0KCkKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4NQogICAgLy8gc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gRmFsc2UKICAgIGJ5dGVjIDM0IC8vICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4Ny04OAogICAgLy8gIyBJbnRlcmVzdAogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gVUludDY0KCkKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojg5CiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgPSBVSW50NjQoKQogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTEtOTIKICAgIC8vICMgSW50ZXJlc3QgUmF0ZXMKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTMKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQgPSBVSW50NjQoKQogICAgYnl0ZWMgMzUgLy8gInJhdGVfcmVzZXRfc3ByZWFkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NAogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIgPSBVSW50NjQoKQogICAgYnl0ZWMgMzYgLy8gInJhdGVfcmVzZXRfbXVsdGlwbGllciIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTUKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9mbG9vciA9IFVJbnQ2NCgpCiAgICBieXRlYyAyOSAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTYKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9jYXAgPSBVSW50NjQoKQogICAgYnl0ZWMgMzAgLy8gInJhdGVfcmVzZXRfY2FwIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NwogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X25leHQgPSBVSW50NjQoKQogICAgYnl0ZWMgMzcgLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTgKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgPSBGYWxzZQogICAgYnl0ZWMgMzggLy8gImhhc19yYXRlX3Jlc2V0X2Zsb29yIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5OQogICAgLy8gc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgPSBGYWxzZQogICAgYnl0ZWMgMzkgLy8gImhhc19yYXRlX3Jlc2V0X2NhcCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTAxLTEwMgogICAgLy8gIyBQcmltYXJ5IERpc3RyaWJ1dGlvbgogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgPSBVSW50NjQoKQogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTAzCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0ID0gVUludDY0KCkKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA1LTEwNgogICAgLy8gIyBDdW11bGF0aXZlIFBlci1Vbml0IEZpeGVkLVBvaW50IEluZGV4ZXMKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA3CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4ID0gVUludDY0KCkKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTE1CiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciA9IFVJbnQ2NCgpCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExNgogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA9IFVJbnQ2NCgpCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTE4LTExOQogICAgLy8gIyBTY2FsaW5nCiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlID0gVUludDY0KCkKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZC1hc2EvY29udHJhY3QucHk6MjMKICAgIC8vIGFzc2VydCBUeG4uZ2xvYmFsX251bV9ieXRlX3NsaWNlID09IGNmZy5HTE9CQUxfQllURVMsIGVyci5XUk9OR19HTE9CQUxfQllURVMKICAgIHR4biBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgQnl0ZXMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2QtYXNhL2NvbnRyYWN0LnB5OjI0CiAgICAvLyBhc3NlcnQgVHhuLmdsb2JhbF9udW1fdWludCA9PSBjZmcuR0xPQkFMX1VJTlRTLCBlcnIuV1JPTkdfR0xPQkFMX1VJTlRTCiAgICB0eG4gR2xvYmFsTnVtVWludAogICAgcHVzaGludCAzNwogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgVUludHMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2QtYXNhL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBhc3NlcnQgVHhuLmxvY2FsX251bV9ieXRlX3NsaWNlID09IGNmZy5MT0NBTF9CWVRFUywgZXJyLldST05HX0xPQ0FMX0JZVEVTCiAgICB0eG4gTG9jYWxOdW1CeXRlU2xpY2UKICAgICEKICAgIGFzc2VydCAvLyBXcm9uZyBMb2NhbCBCeXRlcyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvZC1hc2EvY29udHJhY3QucHk6MjYKICAgIC8vIGFzc2VydCBUeG4ubG9jYWxfbnVtX3VpbnQgPT0gY2ZnLkxPQ0FMX1VJTlRTLCBlcnIuV1JPTkdfTE9DQUxfVUlOVFMKICAgIHR4biBMb2NhbE51bVVpbnQKICAgICEKICAgIGFzc2VydCAvLyBXcm9uZyBMb2NhbCBVSW50cyBhbGxvY2F0aW9uCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kLWFzYS9jb250cmFjdC5weTo4LTE4CiAgICAvLyBjbGFzcyBEQVNBKAogICAgLy8gICAgIFBheW1lbnRBZ2VudCwKICAgIC8vICAgICBUcmFuc2ZlckFnZW50LAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gICAgIGF2bV92ZXJzaW9uPTEyLAogICAgLy8gKToKICAgIHB1c2hieXRlcyAweDkxNGYwNGViIC8vIG1ldGhvZCAiY29udHJhY3RfdXBkYXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9jb250cmFjdF91cGRhdGVfcm91dGVANAoKbWFpbl9zd2l0Y2hfY2FzZV9uZXh0QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZC1hc2EvY29udHJhY3QucHk6OC0xOAogICAgLy8gY2xhc3MgREFTQSgKICAgIC8vICAgICBQYXltZW50QWdlbnQsCiAgICAvLyAgICAgVHJhbnNmZXJBZ2VudCwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBhdm1fdmVyc2lvbj0xMiwKICAgIC8vICk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBieiBtYWluX2NyZWF0ZV9Ob09wQDMxCiAgICBwdXNoYnl0ZXNzIDB4YjQ0NjE4YzggMHhlNzgzMjUyOSAweDdlYTIwZTBiIDB4NmM4NWUzZWUgMHhiZGQxYTk0NCAweGRjMDYzYjM1IDB4MTRmYzEwZWYgMHg3NGE3Mjk3ZiAweDA5ZDRmZTE0IDB4OWE5YmZhODUgMHg4NWVlZDMzZCAweDkxODUxMDRhIDB4ZDlmMjI1YWMgMHg2ZTBlNWM5NSAweGZmM2ZkNGIzIDB4ODJmNzFiMmQgMHhlZjA0ZjVkMyAweGRmMzQzNTUwIDB4M2RiZTgwYmQgMHhkZjU0ZTgyYyAweDAxMGM4Mjk5IDB4NzQwNmFjZDIgMHgxYTcyYTJlZSAvLyBtZXRob2QgImZ1bmRfZHVlX2Nhc2hmbG93cyh1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJjbGFpbV9kdWVfY2FzaGZsb3dzKGFkZHJlc3MsYnl0ZVtdKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYnl0ZVtdKSIsIG1ldGhvZCAic2V0X3RyYW5zZmVyX3NjaGVkdWxlKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbihhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInRyYW5zZmVyKGFkZHJlc3MsYWRkcmVzcyx1aW50NjQpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X2dvdl9zdXNwZW5zaW9uKGFkZHJlc3MsYm9vbCl1aW50NjQiLCBtZXRob2QgImFjY291bnRfb3BlbihhZGRyZXNzLGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X3VwZGF0ZV9wYXltZW50X2FkZHJlc3MoYWRkcmVzcyxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAiYWNjb3VudF9nZXRfcG9zaXRpb24oYWRkcmVzcykoYWRkcmVzcyx1aW50NjQsdWludDY0LGJvb2wsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImNvbnRyYWN0X2NvbmZpZygodWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYm9vbCxib29sLGJvb2wsdWludDY0KSwodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpLChieXRlWzMyXSxzdHJpbmcpKXVpbnQ2NCIsIG1ldGhvZCAiY29udHJhY3Rfc2NoZWR1bGUodWludDY0LGJvb2wsKHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpW10pdWludDY0IiwgbWV0aG9kICJleGVjdXRlX2llZCgpdWludDY0IiwgbWV0aG9kICJhcHBseV9ub25fY2FzaF9ldmVudCh1aW50NjQsKHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSl1aW50NjQiLCBtZXRob2QgImdldF9jb250cmFjdF9zdGF0ZSgpKHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJnZXRfbmV4dF9kdWVfZXZlbnQoKSh1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAicmJhY19yb3RhdGVfYXJyYW5nZXIoYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgInJiYWNfc2V0X29wX2RhZW1vbihhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19hc3NpZ25fcm9sZSh1aW50OCxhZGRyZXNzLCh1aW50NjQsdWludDY0KSl1aW50NjQiLCBtZXRob2QgInJiYWNfcmV2b2tlX3JvbGUodWludDgsYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgInJiYWNfZ292X2Fzc2V0X3N1c3BlbnNpb24oYm9vbCl1aW50NjQiLCBtZXRob2QgInJiYWNfZ2V0X2FycmFuZ2VyKClhZGRyZXNzIiwgbWV0aG9kICJyYmFjX2dldF9hZGRyZXNzX3JvbGVzKGFkZHJlc3MpKGJvb2wsYm9vbCxib29sLGJvb2wsYm9vbCkiLCBtZXRob2QgInJiYWNfZ2V0X3JvbGVfdmFsaWRpdHkodWludDgsYWRkcmVzcykodWludDY0LHVpbnQ2NCkiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBmdW5kX2R1ZV9jYXNoZmxvd3MgY2xhaW1fZHVlX2Nhc2hmbG93cyBzZXRfdHJhbnNmZXJfc2NoZWR1bGUgcHJpbWFyeV9kaXN0cmlidXRpb24gdHJhbnNmZXIgYWNjb3VudF9nb3Zfc3VzcGVuc2lvbiBhY2NvdW50X29wZW4gYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzIGFjY291bnRfZ2V0X3Bvc2l0aW9uIGNvbnRyYWN0X2NvbmZpZyBjb250cmFjdF9zY2hlZHVsZSBleGVjdXRlX2llZCBhcHBseV9ub25fY2FzaF9ldmVudCBnZXRfY29udHJhY3Rfc3RhdGUgZ2V0X25leHRfZHVlX2V2ZW50IHJiYWNfcm90YXRlX2FycmFuZ2VyIHJiYWNfc2V0X29wX2RhZW1vbiByYmFjX2Fzc2lnbl9yb2xlIHJiYWNfcmV2b2tlX3JvbGUgcmJhY19nb3ZfYXNzZXRfc3VzcGVuc2lvbiByYmFjX2dldF9hcnJhbmdlciByYmFjX2dldF9hZGRyZXNzX3JvbGVzIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHkKICAgIGVycgoKbWFpbl9jcmVhdGVfTm9PcEAzMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kLWFzYS9jb250cmFjdC5weTo4LTE4CiAgICAvLyBjbGFzcyBEQVNBKAogICAgLy8gICAgIFBheW1lbnRBZ2VudCwKICAgIC8vICAgICBUcmFuc2ZlckFnZW50LAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gICAgIGF2bV92ZXJzaW9uPTEyLAogICAgLy8gKToKICAgIHB1c2hieXRlcyAweDk1NmQ3MTU2IC8vIG1ldGhvZCAiY29udHJhY3RfY3JlYXRlKGFkZHJlc3MpdWludDY0IgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggY29udHJhY3RfY3JlYXRlCiAgICBlcnIKCm1haW5fY29udHJhY3RfdXBkYXRlX3JvdXRlQDQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBwdXNoaW50IDQgLy8gVXBkYXRlQXBwbGljYXRpb24KICAgID09CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydAogICAgYiBjb250cmFjdF91cGRhdGUKCgovLyBtb2R1bGVzLnBheW1lbnRfYWdlbnQuUGF5bWVudEFnZW50LmZ1bmRfZHVlX2Nhc2hmbG93c1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmZ1bmRfZHVlX2Nhc2hmbG93czoKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gMTAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjUwCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo1MQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo1MgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNDcKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NTUKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NTYtNTcKICAgIC8vIGZ1bmRlZF9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgLy8gZnVuZGVkX3ByaW5jaXBhbCA9IFVJbnQ2NCgwKQogICAgZHVwbiAyCgpmdW5kX2R1ZV9jYXNoZmxvd3Nfd2hpbGVfdG9wQDI6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjAKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgPCBtYXhfZXZlbnRfY291bnQKICAgIGRpZyAyCiAgICBkaWcgNAogICAgPAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjYwLTYxCiAgICAvLyBwcm9jZXNzZWRfZXZlbnRzIDwgbWF4X2V2ZW50X2NvdW50CiAgICAvLyBhbmQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAOQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjYxCiAgICAvLyBhbmQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIDwKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2MC02MQogICAgLy8gcHJvY2Vzc2VkX2V2ZW50cyA8IG1heF9ldmVudF9jb3VudAogICAgLy8gYW5kIHNlbGYuZXZlbnRfY3Vyc29yIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudAogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDkKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2MwogICAgLy8gZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoc2VsZi5ldmVudF9jdXJzb3IpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgZHVwCiAgICBidXJ5IDE3CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjQKICAgIC8vIGlmIGVudHJ5LnNjaGVkdWxlZF90aW1lID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXA6CiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgNgogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPgogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl93aGlsZUA5CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjYKICAgIC8vIGlmIG5vdCBzZWxmLl9ldmVudF9pc19jYXNoKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkpOgogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBidXJ5IDE2CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozNTEKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgaW50Y18yIC8vIDgKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjM1MC0zNTQKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX01EKSwKICAgIC8vICkKICAgID09CiAgICBkdXAKICAgIGJ1cnkgNwogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX3RydWVANTAKICAgIGRpZyAxNAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzUyCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzUwLTM1NAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfTUQpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDUwCiAgICBkaWcgMTQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjM1MwogICAgLy8gVUludDY0KGVudW1zLkVWVF9NRCksCiAgICBwdXNoaW50IDE5CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozNTAtMzU0CiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9NRCksCiAgICAvLyApCiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VANTEKCmZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX3RydWVANTA6CiAgICBpbnRjXzEgLy8gMQoKZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfbWVyZ2VANTI6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjYKICAgIC8vIGlmIG5vdCBzZWxmLl9ldmVudF9pc19jYXNoKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkpOgogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDkKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU0OAogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X2lkID09IHNlbGYuZXZlbnRfY3Vyc29yLCBlcnIuSU5WQUxJRF9FVkVOVF9DVVJTT1IKICAgIGRpZyAxNQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBjdXJzb3IKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU0OQogICAgLy8gYXNzZXJ0IGVudHJ5LnNjaGVkdWxlZF90aW1lIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLCBlcnIuTk9fRFVFX0NBU0hGTE9XCiAgICBkaWcgNAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPD0KICAgIGFzc2VydCAvLyBObyBkdWUgY2FzaGZsb3cgdG8gcGF5CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0MTMKICAgIC8vIGlmIGV2ZW50X3R5cGUgbm90IGluIChVSW50NjQoZW51bXMuRVZUX0lQKSwgVUludDY0KGVudW1zLkVWVF9NRCkpOgogICAgZGlnIDUKICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxMwogICAgZGlnIDE0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDEzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0MTQKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDEzCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfaW50ZXJlc3RfYW1vdW50QDE0OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDI2CiAgICAvLyBldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBidXJ5IDE2CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0MjcKICAgIC8vIGlmIGV2ZW50X3R5cGUgbm90IGluIChVSW50NjQoZW51bXMuRVZUX1BSKSwgVUludDY0KGVudW1zLkVWVF9NRCkpOgogICAgcHVzaGludCAzCiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE3CiAgICBkaWcgMTQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTcKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQyOAogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnRAMjY6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1NTMKICAgIC8vIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGRpZyAxNQogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgMTAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU1NgogICAgLy8gaWYgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCk6CiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUAyNwogICAgZGlnIDkKICAgIGJ1cnkgMTEKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM2OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTcyLTU3NAogICAgLy8gIyBGdW5kaW5nIHVzZXMgcGVyLXVuaXQgY3VtdWxhdGl2ZSBpbmRpY2VzIHNvIGVhY2ggaG9sZGVyIGNhbiBzZXR0bGUKICAgIC8vICMgaW5kZXBlbmRlbnRseSBmcm9tIGl0cyBjdXJyZW50IHVuaXQgYmFsYW5jZS4KICAgIC8vIGludGVyZXN0X2luZGV4X2RlbHRhID0gc2VsZi5fYW1vdW50X3RvX2luZGV4X2RlbHRhKGludGVyZXN0X2Ftb3VudF9kdWUpCiAgICBkaWcgMTIKICAgIGNhbGxzdWIgX2Ftb3VudF90b19pbmRleF9kZWx0YQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTc1CiAgICAvLyBwcmluY2lwYWxfaW5kZXhfZGVsdGEgPSBzZWxmLl9hbW91bnRfdG9faW5kZXhfZGVsdGEocHJpbmNpcGFsX2Ftb3VudF9kdWUpCiAgICBkaWcgOAogICAgY2FsbHN1YiBfYW1vdW50X3RvX2luZGV4X2RlbHRhCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1NzYKICAgIC8vIGludGVyZXN0X2Ftb3VudCA9IHNlbGYuX2luZGV4X2RlbHRhX3RvX2Ftb3VudChpbnRlcmVzdF9pbmRleF9kZWx0YSkKICAgIGRpZyAxCiAgICBjYWxsc3ViIF9pbmRleF9kZWx0YV90b19hbW91bnQKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSAxNwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTc3CiAgICAvLyBwcmluY2lwYWxfYW1vdW50ID0gc2VsZi5faW5kZXhfZGVsdGFfdG9fYW1vdW50KHByaW5jaXBhbF9pbmRleF9kZWx0YSkKICAgIGR1cAogICAgY2FsbHN1YiBfaW5kZXhfZGVsdGFfdG9fYW1vdW50CiAgICBkdXAKICAgIGJ1cnkgMTMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU3OAogICAgLy8gcmVxdWlyZWRfYW1vdW50ID0gaW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudAogICAgZGlnIDIKICAgIGRpZyAxCiAgICArCiAgICBkdXAKICAgIGJ1cnkgMTIKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjcyNwogICAgLy8gYmFsYW5jZSA9IHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQ1NgogICAgLy8gcmV0dXJuIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgKyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIGRpZyAxCiAgICArCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3MjkKICAgIC8vIGFzc2VydCBiYWxhbmNlID49IHJlc2VydmVkX3RvdGFsLCBlcnIuTk9UX0VOT1VHSF9GVU5EUwogICAgZGlnIDIKICAgIGRpZyAxCiAgICA+PQogICAgYXNzZXJ0IC8vIE5vdCBlbm91Z2ggZnVuZHMgZm9yIHRoZSBwYXltZW50CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3MzAKICAgIC8vIHJldHVybiBiYWxhbmNlIC0gcmVzZXJ2ZWRfdG90YWwKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgLQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTgwCiAgICAvLyBzZWxmLl9hdmFpbGFibGVfc2V0dGxlbWVudF9mdW5kcygpID49IHJlcXVpcmVkX2Ftb3VudAogICAgdW5jb3ZlciAyCiAgICA+PQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTc5LTU4MQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLl9hdmFpbGFibGVfc2V0dGxlbWVudF9mdW5kcygpID49IHJlcXVpcmVkX2Ftb3VudAogICAgLy8gKSwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTgzCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0ICs9IGludGVyZXN0X2Ftb3VudAogICAgdW5jb3ZlciAzCiAgICArCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTg0CiAgICAvLyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCArPSBwcmluY2lwYWxfYW1vdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICArCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU4NQogICAgLy8gc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4ICs9IGludGVyZXN0X2luZGV4X2RlbHRhCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCBleGlzdHMKICAgIHVuY292ZXIgMgogICAgKwogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTg2CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4ICs9IHByaW5jaXBhbF9pbmRleF9kZWx0YQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCBleGlzdHMKICAgICsKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1ODcKICAgIC8vIGlmIGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkgPT0gVUludDY0KGVudW1zLkVWVF9QUik6CiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBwdXNoaW50IDMKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDM4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1ODgtNTg5CiAgICAvLyAjIEZvciBQUiwgdGhlIHBlcmlvZCBpbnRlcmVzdCBzdGF5cyBhY2NydWVkIHVudGlsIGEgbGF0ZXIgSVAgb3IgTUQuCiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgKz0gc2VsZi5fZW50cnlfaW50ZXJlc3Rfc2VnbWVudChlbnRyeSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBkaWcgMTYKICAgIGNhbGxzdWIgX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQKICAgIGJ1cnkgMTgKICAgICsKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzk6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1OTIKICAgIC8vIGlmIG5vdCBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKSBvciBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NCgKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlANDEKICAgIGRpZyAxNQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU5Mi01OTQKICAgIC8vIGlmIG5vdCBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKSBvciBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NCgKICAgIC8vICAgICBlbnVtcy5FVlRfTUQKICAgIC8vICk6CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDIKCmZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDQxOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTk1CiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBkaWcgMTUKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0MjoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU5NgogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgZGlnIDEwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTk3CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBuZXh0X2ludGVyZXN0X2Jhc2UKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBkaWcgMTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1OTgKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYwMAogICAgLy8gaWYgZW50cnkuZXZlbnRfdHlwZSA9PSBhcmM0LlVJbnQ4KAogICAgZGlnIDE1CiAgICBleHRyYWN0IDggMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjAwLTYwMgogICAgLy8gaWYgZW50cnkuZXZlbnRfdHlwZSA9PSBhcmM0LlVJbnQ4KAogICAgLy8gICAgIGVudW1zLkVWVF9NRAogICAgLy8gKSBhbmQgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPT0gVUludDY0KDApOgogICAgcHVzaGJ5dGVzIDB4MTMKICAgIGI9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYwMgogICAgLy8gKSBhbmQgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPT0gVUludDY0KDApOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2MDAtNjAyCiAgICAvLyBpZiBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoCiAgICAvLyAgICAgZW51bXMuRVZUX01ECiAgICAvLyApIGFuZCBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9PSBVSW50NjQoMCk6CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYwMwogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX0VOREVEKQogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgcHVzaGludCAyMDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2MDQKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDU6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2MDYtNjEwCiAgICAvLyBzZWxmLl9lbWl0X2V4ZWN1dGlvbl9ldmVudCgKICAgIC8vICAgICBlbnRyeT1lbnRyeSwKICAgIC8vICAgICBwYXlvZmY9aW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudCwKICAgIC8vICAgICBzZXR0bGVkX2Ftb3VudD1pbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50LAogICAgLy8gKQogICAgZGlnIDE1CiAgICBkaWcgNwogICAgZHVwCiAgICBjYWxsc3ViIF9lbWl0X2V4ZWN1dGlvbl9ldmVudAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzAKICAgIC8vIGZ1bmRlZF9pbnRlcmVzdCArPSBpbnRlcmVzdF9hbW91bnQKICAgIGRpZyAxCiAgICBkaWcgMTQKICAgICsKICAgIGJ1cnkgMgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjcxCiAgICAvLyBmdW5kZWRfcHJpbmNpcGFsICs9IHByaW5jaXBhbF9hbW91bnQKICAgIGR1cAogICAgZGlnIDkKICAgICsKICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjcyCiAgICAvLyBwcm9jZXNzZWRfZXZlbnRzICs9IFVJbnQ2NCgxKQogICAgZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDMKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX3doaWxlX3RvcEAyCgpmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDM4OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTkxCiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzkKCmZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDI3OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTU3CiAgICAvLyBldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBidXJ5IDE2CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1NTgtNTYwCiAgICAvLyAjIER5bmFtaWMgYW5udWl0aWVzIGRlcml2ZSBuZXh0IHN0YXRlIGZyb20gdGhlIHBheW1lbnQgZGVjb21wb3NpdGlvbiwKICAgIC8vICMgbm90IG9ubHkgZnJvbSB0aGUgcHJlY29tcHV0ZWQgYG5leHRfKmAgZmllbGRzLgogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1BSKToKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19lbHNlX2JvZHlAMjkKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU2MgogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgLSBwcmluY2lwYWxfYW1vdW50X2R1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBkaWcgOAogICAgLQogICAgZHVwCiAgICBidXJ5IDExCiAgICBidXJ5IDExCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDI5OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTY1CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9JUCk6CiAgICBkaWcgMTQKICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUAzMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTY2CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGJ1cnkgMTEKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU2NwogICAgLy8gbmV4dF9pbnRlcmVzdF9iYXNlID0gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBidXJ5IDEyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIGV4aXN0cwogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzNgoKZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUAzMToKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU2OAogICAgLy8gZWxpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfTUQpOgogICAgZGlnIDE0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDMyCiAgICBkaWcgOQogICAgYnVyeSAxMQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzNgoKZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlAMzI6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1NjkKICAgIC8vIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAxMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTcwCiAgICAvLyBuZXh0X2ludGVyZXN0X2Jhc2UgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDExCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNzoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQyOQogICAgLy8gaWYgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCk6CiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDI1CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0MzAKICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCk6CiAgICBkaWcgMTQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDMxCiAgICAvLyByZXR1cm4gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1NTIKICAgIC8vIHByaW5jaXBhbF9hbW91bnRfZHVlID0gc2VsZi5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudChlbnRyeSkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnRAMjYKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDIwOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDMyCiAgICAvLyBpbnRlcmVzdF9kdWUgPSBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgKyBzZWxmLl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KGVudHJ5KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgIGRpZyAxNgogICAgY2FsbHN1YiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudAogICAgYnVyeSAxOAogICAgKwogICAgZHVwCiAgICBidXJ5IDEzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0MzMKICAgIC8vIGlmIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA8PSBpbnRlcmVzdF9kdWU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiBleGlzdHMKICAgID49CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyMgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDM0CiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1NTIKICAgIC8vIHByaW5jaXBhbF9hbW91bnRfZHVlID0gc2VsZi5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudChlbnRyeSkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnRAMjYKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDIyOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDM1CiAgICAvLyBwcmluY2lwYWxfYW1vdW50ID0gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIC0gaW50ZXJlc3RfZHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiBleGlzdHMKICAgIGRpZyAxMgogICAgLQogICAgZHVwCiAgICBidXJ5IDEwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0MzYKICAgIC8vIGlmIHByaW5jaXBhbF9hbW91bnQgPiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgPgogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQzNwogICAgLy8gcmV0dXJuIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTUyCiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyNDoKICAgIGRpZyA4CiAgICBidXJ5IDgKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyNgoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjU6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0NDAKICAgIC8vIGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsIDw9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBkaWcgMTUKICAgIHB1c2hpbnQgNDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGR1cDIKICAgIDw9CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0MzktNDQxCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsIDw9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQ0MgogICAgLy8gcmV0dXJuIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIC0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIHN3YXAKICAgIC0KICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTUyCiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQxNQogICAgLy8gcmV0dXJuIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCArIHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZGlnIDE2CiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBidXJ5IDE4CiAgICArCiAgICBidXJ5IDEzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1NTEKICAgIC8vIGludGVyZXN0X2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9pbnRlcmVzdF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9pbnRlcmVzdF9hbW91bnRAMTQKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl93aGlsZUA5OgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojc0CiAgICAvLyBhc3NlcnQgcHJvY2Vzc2VkX2V2ZW50cyA+IFVJbnQ2NCgwKSwgZXJyLk5PX0RVRV9DQVNIRkxPVwogICAgZGlnIDIKICAgIGR1cAogICAgYXNzZXJ0IC8vIE5vIGR1ZSBjYXNoZmxvdyB0byBwYXkKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3OAogICAgLy8gdG90YWxfZnVuZGVkPWZ1bmRlZF9pbnRlcmVzdCArIGZ1bmRlZF9wcmluY2lwYWwsCiAgICBkaWcgMgogICAgZHVwCiAgICBkaWcgMwogICAgZHVwCiAgICBjb3ZlciAzCiAgICArCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODAKICAgIC8vIHRpbWVzdGFtcD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3NS04MQogICAgLy8gcmV0dXJuIHR5cC5DYXNoRnVuZGluZ1Jlc3VsdCgKICAgIC8vICAgICBmdW5kZWRfaW50ZXJlc3Q9ZnVuZGVkX2ludGVyZXN0LAogICAgLy8gICAgIGZ1bmRlZF9wcmluY2lwYWw9ZnVuZGVkX3ByaW5jaXBhbCwKICAgIC8vICAgICB0b3RhbF9mdW5kZWQ9ZnVuZGVkX2ludGVyZXN0ICsgZnVuZGVkX3ByaW5jaXBhbCwKICAgIC8vICAgICBwcm9jZXNzZWRfZXZlbnRzPXByb2Nlc3NlZF9ldmVudHMsCiAgICAvLyAgICAgdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUA1MToKICAgIGludGNfMCAvLyAwCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDUyCgoKLy8gbW9kdWxlcy5wYXltZW50X2FnZW50LlBheW1lbnRBZ2VudC5jbGFpbV9kdWVfY2FzaGZsb3dzW3JvdXRpbmddKCkgLT4gdm9pZDoKY2xhaW1fZHVlX2Nhc2hmbG93czoKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNAogICAgLy8gaWYgc2VsZi5vcF9kYWVtb24udmFsdWUgIT0gR2xvYmFsLnplcm9fYWRkcmVzczoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNSAvLyAweDUyMjM0ZjcwNDQ2MTY1NmQ2ZjZlMjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcF9kYWVtb24gZXhpc3RzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBieiBjbGFpbV9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTcKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNgogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI1IC8vIDB4NTIyMzRmNzA0NDYxNjU2ZDZmNmUyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wX2RhZW1vbiBleGlzdHMKICAgID09CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTYtMTgKICAgIC8vIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICAvLyBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgYm56IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDE0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTcKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNi0xOAogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICBibnogY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX3RydWVAMTQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxOAogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIHR4biBTZW5kZXIKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDMyCiAgICA9PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE2LTE4CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAxNQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX3RydWVAMTQ6CiAgICBpbnRjXzEgLy8gMQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDE2OgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE1LTE5CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vICAgICBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gICAgIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICAvLyApLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNzoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5NAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5NQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNDcKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6OTgKICAgIC8vIHNlbGYuX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQoaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDIKICAgIGR1cAogICAgY2FsbHN1YiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojk5CiAgICAvLyBzZWxmLl9zZXR0bGVfcG9zaXRpb24oaG9sZGluZ19hZGRyZXNzKQogICAgY2FsbHN1YiBfc2V0dGxlX3Bvc2l0aW9uCiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTcKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNsYWltYWJsZV9pbnRlcmVzdAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZHVwCiAgICBwdXNoaW50IDczCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBidXJ5IDgKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTgKICAgIC8vICsgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgZHVwCiAgICBwdXNoaW50IDgxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDgKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTctMTE4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jbGFpbWFibGVfaW50ZXJlc3QKICAgIC8vICsgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgdW5jb3ZlciAyCiAgICArCiAgICBkdXAKICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjEwMQogICAgLy8gYXNzZXJ0IHRvdGFsX2Ftb3VudCA+IFVJbnQ2NCgwKSwgZXJyLk5PX0RVRV9DQVNIRkxPVwogICAgYXNzZXJ0IC8vIE5vIGR1ZSBjYXNoZmxvdyB0byBwYXkKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLmlzX29wdGVkX2luKAogICAgZXh0cmFjdCAwIDMyCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MjUKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MjQtMjYKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5pc19vcHRlZF9pbigKICAgIC8vICAgICBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQKICAgIC8vICkKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MjQtMjcKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5pc19vcHRlZF9pbigKICAgIC8vICAgICBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQKICAgIC8vICkKICAgIC8vIGFuZCBub3Qgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkCiAgICBieiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VAMjQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNwogICAgLy8gYW5kIG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHB1c2hpbnQgMzg0CiAgICBnZXRiaXQKICAgIGJueiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VAMjQKICAgIGludGNfMSAvLyAxCgpjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfbWVyZ2VAMjU6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA2CiAgICAvLyBpZiBzZWxmLl9pc19wYXltZW50X2V4ZWN1dGFibGUoaG9sZGluZ19hZGRyZXNzKToKICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MzMKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICBzd2FwCiAgICBkaWcgMQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBvcHRlZCBpbnRvIGFzc2V0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MzMtMzQKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICAvLyA+PSBwYXltZW50X2Ftb3VudAogICAgZGlnIDUKICAgIGR1cAogICAgY292ZXIgMgogICAgPj0KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozMi0zNQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgLy8gICAgID49IHBheW1lbnRfYW1vdW50CiAgICAvLyApLCBlcnIuTk9UX0VOT1VHSF9GVU5EUwogICAgYXNzZXJ0IC8vIE5vdCBlbm91Z2ggZnVuZHMgZm9yIHRoZSBwYXltZW50CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA4CiAgICAvLyBzZWxmLl9wYXkoc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLCB0b3RhbF9hbW91bnQpCiAgICBkaWcgMgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZHVwCiAgICBleHRyYWN0IDAgMzIKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozOS00NAogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXJlY2VpdmVyLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1hbW91bnQsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0MwogICAgLy8gZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIGdsb2JhbCBNaW5UeG5GZWUKICAgIHVuY292ZXIgMwogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgc3dhcAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MzkKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozOS00NAogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXJlY2VpdmVyLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1hbW91bnQsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTI1LTEyNgogICAgLy8gIyBHZXQgdGhlIGNsYWltYWJsZSBhbW91bnRzIGJlZm9yZSByZXNldAogICAgLy8gaW50ZXJlc3RfYW1vdW50ID0gcG9zaXRpb24uY2xhaW1hYmxlX2ludGVyZXN0CiAgICBkdXAKICAgIHB1c2hpbnQgNzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgOQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEyNwogICAgLy8gcHJpbmNpcGFsX2Ftb3VudCA9IHBvc2l0aW9uLmNsYWltYWJsZV9wcmluY2lwYWwKICAgIGR1cAogICAgcHVzaGludCA4MQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMwogICAgYnVyeSA5CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTI5LTEzMAogICAgLy8gIyBSZXNldCB0aGUgcG9zaXRpb24ncyBjbGFpbWFibGUgYW1vdW50cwogICAgLy8gcG9zaXRpb24uY2xhaW1hYmxlX2ludGVyZXN0ID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgaXRvYgogICAgc3dhcAogICAgZGlnIDEKICAgIHJlcGxhY2UyIDczCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTMxCiAgICAvLyBwb3NpdGlvbi5jbGFpbWFibGVfcHJpbmNpcGFsID0gVUludDY0KDApCiAgICBzd2FwCiAgICByZXBsYWNlMiA4MQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzMgogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSBwb3NpdGlvbi5jb3B5KCkKICAgIHVuY292ZXIgMwogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzNAogICAgLy8gYXNzZXJ0IHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgPj0gaW50ZXJlc3RfYW1vdW50LCBlcnIuTk9UX0VOT1VHSF9GVU5EUwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCBleGlzdHMKICAgIGR1cAogICAgZGlnIDIKICAgID49CiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcyBmb3IgdGhlIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzUKICAgIC8vIGFzc2VydCBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCA+PSBwcmluY2lwYWxfYW1vdW50LCBlcnIuTk9UX0VOT1VHSF9GVU5EUwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIGV4aXN0cwogICAgZGlnIDMKICAgID49CiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcyBmb3IgdGhlIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzctMTM4CiAgICAvLyAjIFVwZGF0ZSB0aGUgZ2xvYmFsIHJlc2VydmVkIGludGVyZXN0IGFuZCBwcmluY2lwYWwgYW1vdW50cwogICAgLy8gc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCAtPSBpbnRlcmVzdF9hbW91bnQKICAgIHN3YXAKICAgIC0KICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTM5CiAgICAvLyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCAtPSBwcmluY2lwYWxfYW1vdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICBzd2FwCiAgICAtCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjExNAogICAgLy8gdG90YWxfYW1vdW50PWludGVyZXN0X2Ftb3VudCArIHByaW5jaXBhbF9hbW91bnQsCiAgICBkaWcgNQogICAgZHVwCiAgICBkaWcgNgogICAgZHVwCiAgICBjb3ZlciAzCiAgICArCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTE1CiAgICAvLyB0aW1lc3RhbXA9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTExLTExNwogICAgLy8gcmV0dXJuIHR5cC5DYXNoQ2xhaW1SZXN1bHQoCiAgICAvLyAgICAgaW50ZXJlc3RfYW1vdW50PWludGVyZXN0X2Ftb3VudCwKICAgIC8vICAgICBwcmluY2lwYWxfYW1vdW50PXByaW5jaXBhbF9hbW91bnQsCiAgICAvLyAgICAgdG90YWxfYW1vdW50PWludGVyZXN0X2Ftb3VudCArIHByaW5jaXBhbF9hbW91bnQsCiAgICAvLyAgICAgdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gICAgIGNvbnRleHQ9cGF5bWVudF9pbmZvLAogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZGlnIDIKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBwdXNoYnl0ZXMgMHgwMDIyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAyNDoKICAgIGludGNfMCAvLyAwCiAgICBiIGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUAyNQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX2ZhbHNlQDE1OgogICAgaW50Y18wIC8vIDAKICAgIGIgY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDE2CgoKLy8gbW9kdWxlcy50cmFuc2Zlcl9hZ2VudC5UcmFuc2ZlckFnZW50LnNldF90cmFuc2Zlcl9zY2hlZHVsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF90cmFuc2Zlcl9zY2hlZHVsZToKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToyNAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjI1CiAgICAvLyBhc3NlcnQgb3Blbl9kYXRlIDwgY2xvc3VyZV9kYXRlLCBlcnIuSU5WQUxJRF9TT1JUSU5HCiAgICBkdXAyCiAgICA8CiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbXVzdCBiZSBzb3J0ZWQgaW4gc3RyaWN0bHkgYXNjZW5kaW5nIG9yZGVyCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjI3CiAgICAvLyBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA9IG9wZW5fZGF0ZQogICAgYnl0ZWMgMjcgLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIHVuY292ZXIgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MjgKICAgIC8vIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlID0gY2xvc3VyZV9kYXRlCiAgICBieXRlYyAyOCAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MjkKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy50cmFuc2Zlcl9hZ2VudC5UcmFuc2ZlckFnZW50LnByaW1hcnlfZGlzdHJpYnV0aW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcHJpbWFyeV9kaXN0cmlidXRpb246CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjcxCiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5wcmltYXJ5X2RlYWxlciwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDIyIC8vIDB4NTIyMzUwNzI2OTZkNjE3Mjc5NDQ2NTYxNmM2NTcyMjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDEKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQyCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDMKICAgIC8vIGFzc2VydCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBSSU1BUllfRElTVFJJQlVUSU9OX0NMT1NFRAogICAgYXNzZXJ0IC8vIFByaW1hcnkgZGlzdHJpYnV0aW9uIGlzIGNsb3NlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgY292ZXIgMwogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo0NQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChob2xkaW5nX2FkZHJlc3MpCiAgICBzd2FwCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQ2CiAgICAvLyBhc3NlcnQgdW5pdHMgPiBVSW50NjQoMCksIGVyci5aRVJPX1VOSVRTCiAgICBkdXAKICAgIGFzc2VydCAvLyBDYW4gbm90IGRpc3RyaWJ1dGUgemVybyB1bml0cwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo0OAogICAgLy8gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCArIHVuaXRzIDw9IHNlbGYudG90YWxfdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICArCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgPD0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDctNDkKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCArIHVuaXRzIDw9IHNlbGYudG90YWxfdW5pdHMKICAgIC8vICksIGVyci5PVkVSX0RJU1RSSUJVVElPTgogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCByZW1haW5pbmcgRC1BU0EgdW5pdHMKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NTAKICAgIC8vIGlmIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI2IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlIGV4aXN0cwogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjUyCiAgICAvLyBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8PSBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI2IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlIGV4aXN0cwogICAgPD0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NTEtNTMKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPD0gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGUKICAgIC8vICksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TRUQKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBjbG9zZWQKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNDgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnJlc2VydmVkX3VuaXRzICs9IHVuaXRzCiAgICBkdXBuIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDMKICAgIGR1cAogICAgY292ZXIgMwogICAgKwogICAgaXRvYgogICAgcHVzaGludCA0MAogICAgc3dhcAogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NTYKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgKz0gdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICArCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NTcKICAgIC8vIHJldHVybiBzZWxmLnRvdGFsX3VuaXRzIC0gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIHN3YXAKICAgIC0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMudHJhbnNmZXJfYWdlbnQuVHJhbnNmZXJBZ2VudC50cmFuc2Zlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnRyYW5zZmVyOgogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo1OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NzMKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojc0CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE0NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTMKICAgIC8vIGlmIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI3IC8vICJ0cmFuc2Zlcl9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlIGV4aXN0cwogICAgYnogdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE1CiAgICAvLyBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI3IC8vICJ0cmFuc2Zlcl9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlIGV4aXN0cwogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPD0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTQtMTYKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICksIGVyci5DTE9TRURfVFJBTlNGRVIKICAgIGFzc2VydCAvLyBUcmFuc2ZlciBpcyBjbG9zZWQKCnRyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTcKICAgIC8vIGlmIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI4IC8vICJ0cmFuc2Zlcl9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgYnogdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE5CiAgICAvLyBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8IHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjggLy8gInRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICA8CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE4LTIwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDwgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGUKICAgIC8vICksIGVyci5DTE9TRURfVFJBTlNGRVIKICAgIGFzc2VydCAvLyBUcmFuc2ZlciBpcyBjbG9zZWQKCnRyYW5zZmVyX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NzgKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIGRpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgOAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIGRpZyA1CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDkKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODEKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQoc2VuZGVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjgyCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGR1cAogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4MwogICAgLy8gYXNzZXJ0IHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MgIT0gcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzLCBlcnIuU0VMRl9UUkFOU0ZFUgogICAgdW5jb3ZlciAyCiAgICAhPQogICAgYXNzZXJ0IC8vIFNlbmRlciBhbmQgcmVjZWl2ZXIgbXVzdCBiZSBkaWZmZXJlbnQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODQKICAgIC8vIGFzc2VydCB1bml0cyA+IFVJbnQ2NCgwKSwgZXJyLk5VTExfVFJBTlNGRVIKICAgIGRpZyAxCiAgICBkdXAKICAgIGFzc2VydCAvLyBUcmFuc2ZlciB1bml0cyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojg1CiAgICAvLyBhc3NlcnQgdW5pdHMgPD0gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLCBlcnIuT1ZFUl9UUkFOU0ZFUgogICAgc3dhcAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIDw9CiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IHNlbmRlciB1bml0cyB0byB0cmFuc2ZlcgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzU2CiAgICAvLyBpZiBzZWxmLmV2ZW50X2N1cnNvciA+PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICA+PQogICAgYm56IHRyYW5zZmVyX2FmdGVyX2lubGluZWRfbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Fzc2VydF9ub19kdWVfZXZlbnRfcGVuZGluZ0AxMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzU4CiAgICAvLyBuZXh0X2VudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KHNlbGYuZXZlbnRfY3Vyc29yKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojc2MAogICAgLy8gbmV4dF9lbnRyeS5zY2hlZHVsZWRfdGltZSA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3NTktNzYxCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIG5leHRfZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gKSwgZXJyLlBFTkRJTkdfQUNUVVNfRVZFTlQKICAgIGFzc2VydCAvLyBBQ1RVUyBldmVudCBub3QgeWV0IGV4ZWN1dGVkCgp0cmFuc2Zlcl9hZnRlcl9pbmxpbmVkX21vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9hc3NlcnRfbm9fZHVlX2V2ZW50X3BlbmRpbmdAMTA6CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojg4CiAgICAvLyBzZWxmLl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBkaWcgMwogICAgZHVwCiAgICBjYWxsc3ViIF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojg5CiAgICAvLyBzZWxmLl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGRpZyAzCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGNhbGxzdWIgX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6OTAKICAgIC8vIHNlbGYuX3NldHRsZV9wb3NpdGlvbihzZW5kZXJfaG9sZGluZ19hZGRyZXNzKQogICAgY2FsbHN1YiBfc2V0dGxlX3Bvc2l0aW9uCiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6OTEKICAgIC8vIHNlbGYuX3NldHRsZV9wb3NpdGlvbihyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBjYWxsc3ViIF9zZXR0bGVfcG9zaXRpb24KICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE1MgogICAgLy8gYXNzZXJ0IHVuaXRzIDw9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLCBlcnIuT1ZFUl9UUkFOU0ZFUgogICAgZGlnIDUKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGRpZyAxCiAgICA8PQogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCBzZW5kZXIgdW5pdHMgdG8gdHJhbnNmZXIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNTMKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzIC09IHVuaXRzCiAgICBkaWcgMQogICAgLQogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBpbnRjXzMgLy8gMzIKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNDQKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzICs9IHVuaXRzCiAgICBkaWcgNQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgdW5jb3ZlciAyCiAgICArCiAgICBpdG9iCiAgICBpbnRjXzMgLy8gMzIKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgZGlnIDIKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF9nb3Zfc3VzcGVuc2lvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfZ292X3N1c3BlbnNpb246CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTY1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo3NwogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYXV0aG9yaXR5LCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjEgLy8gMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTg1CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGR1cAogICAgcHVzaGludCA0OAogICAgaW50Y18xIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIHB1c2hpbnQgNDgKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTg2CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfb3Blbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfb3BlbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2OAogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjMgLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQ0ZDYxNmU2MTY3NjU3MjIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMzkKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0VOREVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDIwMAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTAKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX2VuZGVkKCksIGVyci5VTkFVVEhPUklaRUQKICAgICEKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxMQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTIKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjEzCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzQKICAgIC8vIHVuaXRzPVVJbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzItNDIKICAgIC8vIHJldHVybiB0eXAuQWNjb3VudFBvc2l0aW9uKAogICAgLy8gICAgIHBheW1lbnRfYWRkcmVzcz1wYXltZW50X2FkZHJlc3MsCiAgICAvLyAgICAgdW5pdHM9VUludDY0KDApLAogICAgLy8gICAgIHJlc2VydmVkX3VuaXRzPVVJbnQ2NCgwKSwKICAgIC8vICAgICBzdXNwZW5kZWQ9RmFsc2UsCiAgICAvLyAgICAgc2V0dGxlZF9jdXJzb3I9VUludDY0KDApLAogICAgLy8gICAgIGludGVyZXN0X2NoZWNrcG9pbnQ9VUludDY0KDApLAogICAgLy8gICAgIHByaW5jaXBhbF9jaGVja3BvaW50PVVJbnQ2NCgwKSwKICAgIC8vICAgICBjbGFpbWFibGVfaW50ZXJlc3Q9VUludDY0KDApLAogICAgLy8gICAgIGNsYWltYWJsZV9wcmluY2lwYWw9VUludDY0KDApLAogICAgLy8gKQogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBieXRlYyA0MCAvLyAweDAwCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxNAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSBzZWxmLl9uZXdfYWNjb3VudF9wb3NpdGlvbihwYXltZW50X2FkZHJlc3MpCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjE1CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzczoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMzgKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcywgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgdW5jb3ZlciAzCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjM5CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0MAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDEKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcyA9IHBheW1lbnRfYWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDIKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF9nZXRfcG9zaXRpb25bcm91dGluZ10oKSAtPiB2b2lkOgphY2NvdW50X2dldF9wb3NpdGlvbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNTkKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9jcmVhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9jcmVhdGU6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5ODAKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSBhcnJhbmdlcgogICAgYnl0ZWMgMTggLy8gMHg1MjIzNDE3MjcyNjE2ZTY3NjU3MjIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTgxCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojk2OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfY29uZmlnW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfY29uZmlnOgogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojk4MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGxlbgogICAgcHVzaGludCAxMDcKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuTm9ybWFsaXplZEFjdHVzVGVybXMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDcyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLkluaXRpYWxLZXJuZWxTdGF0ZQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIGxlbgogICAgZGlnIDEKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgdHVwbGUgZW5jb2RpbmcKICAgIGR1cAogICAgcHVzaGludCAzNAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHRhaWwgcG9pbnRlciBhdCBpbmRleCAxIG9mICh1aW50OFszMl0sKGxlbit1dGY4W10pKQogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBjb3ZlciAzCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAzNgogICAgKwogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5Qcm9zcGVjdHVzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDEyCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwMTQtMTAxNQogICAgLy8gIyBDb25maWd1cmUgQ29udHJhY3QKICAgIC8vIHNlbGYuY29udHJhY3RfdHlwZSA9IHRlcm1zLmNvbnRyYWN0X3R5cGUuYXNfdWludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ5dGVjIDEyIC8vICJjb250cmFjdF90eXBlIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICBieiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjIwCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfQU5OKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMjEKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgcHVzaGludCAyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMjIKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMjMKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgcHVzaGludCA0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMjQKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYnogY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAOAoKY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUA3OgogICAgaW50Y18xIC8vIDEKCmNvbnRyYWN0X2NvbmZpZ19ib29sX21lcmdlQDk6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMjkKICAgIC8vIGFzc2VydCBzZWxmLl9pc19zdXBwb3J0ZWRfY29udHJhY3RfdHlwZShjb250cmFjdF90eXBlKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDE3CiAgICAvLyBzZWxmLl9zdG9yZV9jb250cmFjdF9jb25maWcoc2VsZi5jb250cmFjdF90eXBlLCB0ZXJtcywgaW5pdGlhbF9zdGF0ZSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBidXJ5IDIKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozMjUKICAgIC8vIGFzc2VydCB0ZXJtcy5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBkaWcgNAogICAgZHVwCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDgKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMyNwogICAgLy8gdGVybXMuZGF5X2NvdW50X2NvbnZlbnRpb24uYXNfdWludDY0KCkKICAgIHB1c2hpbnQgNTcKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyOTctMzAzCiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgIGJ6IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGRpZyA2CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyOTkKICAgIC8vIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGRpZyA2CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozMDAKICAgIC8vIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICBwdXNoaW50IDIKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI5Ny0zMDMKICAgIC8vIHJldHVybiBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzYwKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwSVNEQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjApLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDE2CiAgICBkaWcgNgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzAxCiAgICAvLyBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyOTctMzAzCiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgID09CiAgICBibnogY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUAxNgogICAgZGlnIDYKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMwMgogICAgLy8gVUludDY0KGVudW1zLkRDQ18zMEUzNjApLAogICAgcHVzaGludCA0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyOTctMzAzCiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgID09CiAgICBieiBjb250cmFjdF9jb25maWdfYm9vbF9mYWxzZUAxNwoKY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUAxNjoKICAgIGludGNfMSAvLyAxCgpjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUAxODoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMwOS0zMTEKICAgIC8vIGFzc2VydCBzZWxmLl9pc19zdXBwb3J0ZWRfZGF5X2NvdW50X2NvbnZlbnRpb24oCiAgICAvLyAgICAgZGF5X2NvdW50X2NvbnZlbnRpb24KICAgIC8vICksIGVyci5JTlZBTElEX0RBWV9DT1VOVF9DT05WRU5USU9OCiAgICBhc3NlcnQgLy8gSW52YWxpZCBkYXktY291bnQgY29udmVudGlvbiBJRAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzI5CiAgICAvLyBpZiBjb250cmFjdF90eXBlICE9IFVJbnQ2NChlbnVtcy5DVF9BTk4pOgogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgIT0KICAgIGJ6IGNvbnRyYWN0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDIwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozMzAKICAgIC8vIGFzc2VydCBub3QgdGVybXMuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBkaWcgNAogICAgcHVzaGludCA3ODYKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgoKY29udHJhY3RfY29uZmlnX2FmdGVyX2lmX2Vsc2VAMjA6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MDAKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MDEKICAgIC8vIGFzc2VydCBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID09IFVJbnQ2NCgwKSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBELUFTQSBhbHJlYWR5IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjgwMy04MDQKICAgIC8vICMgU2V0IERlbm9taW5hdGlvbiBBc3NldAogICAgLy8gc2VsZi5fYXNzZXJ0X2Rlbm9taW5hdGlvbl9hc3NldCh0ZXJtcy5kZW5vbWluYXRpb25fYXNzZXRfaWQpCiAgICBkaWcgNAogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojc2OC03NjkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gZGVub21pbmF0aW9uIHdpdGggQVNBCiAgICAvLyBfY3JlYXRvciwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfY3JlYXRvcihkZW5vbWluYXRpb25fYXNzZXRfaWQpCiAgICBkdXAKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojc3MAogICAgLy8gYXNzZXJ0IGV4aXN0cywgZXJyLklOVkFMSURfREVOT01JTkFUSU9OCiAgICBhc3NlcnQgLy8gRGVub21pbmF0aW9uIGFzc2V0IGlzIG5vdCBwcm9wZXJseSBzZXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojc3MwogICAgLy8gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgPSBkZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIGJ5dGVjIDQ0IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjgwNy04MDgKICAgIC8vICMgU2V0IFNldHRsZW1lbnQgQXNzZXQKICAgIC8vIHNlbGYuX2Fzc2VydF9zZXR0bGVtZW50X2Fzc2V0KHRlcm1zLnNldHRsZW1lbnRfYXNzZXRfaWQpCiAgICBkaWcgMQogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Nzc4CiAgICAvLyBzZXR0bGVtZW50X2Fzc2V0X2lkID09IHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgPT0KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojc3Ni03NzkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzZXR0bGVtZW50IGFzc2V0IGlzIHRoZSBkZW5vbWluYXRpb24gYXNzZXQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgLy8gKSwgZXJyLklOVkFMSURfU0VUVExFTUVOVF9BU1NFVAogICAgYXNzZXJ0IC8vIERpZmZlcmVudCBzZXR0bGVtZW50IGFzc2V0IG5vdCBzdXBwb3J0ZWQsIG11c3QgYmUgZXF1YWwgdG8gZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3ODIKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCA9IHNldHRsZW1lbnRfYXNzZXRfaWQKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3ODMtNzg5CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3ODgKICAgIC8vIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3ODYKICAgIC8vIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Nzg3CiAgICAvLyBhc3NldF9hbW91bnQ9MCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3ODMtNzg0CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojc4My03ODkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gc2V0dGxlbWVudCB3aXRoIEFTQQogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PTAsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MTEtODEyCiAgICAvLyAjIFVuaXRzCiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzID0gdGVybXMudG90YWxfdW5pdHMKICAgIGR1cAogICAgcHVzaGludCAxNwogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MTMKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDEwIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODE1LTgxNgogICAgLy8gIyBEYXktQ291bnQgQ29udmVudGlvbnMKICAgIC8vIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPSB0ZXJtcy5kYXlfY291bnRfY29udmVudGlvbi5hc191aW50NjQoKQogICAgYnl0ZWMgNDYgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgZGlnIDgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MTgtODE5CiAgICAvLyAjIFRpbWUKICAgIC8vIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlID0gdGVybXMuaW5pdGlhbF9leGNoYW5nZV9kYXRlCiAgICBkdXAKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAyNiAvLyAiaW5pdGlhbF9leGNoYW5nZV9kYXRlIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MjAKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IHRlcm1zLm1hdHVyaXR5X2RhdGUKICAgIGRpZyAxCiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNDUgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjgyMQogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gaW5pdGlhbF9zdGF0ZS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBkaWcgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBwdXNoaW50IDQ4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODIzLTgyNAogICAgLy8gIyBQcmluY2lwYWwKICAgIC8vIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPSB0ZXJtcy5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudAogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgZGlnIDEwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODI1CiAgICAvLyBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSB0ZXJtcy5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBkaWcgMwogICAgcHVzaGludCA3ODYKICAgIGdldGJpdAogICAgYnl0ZWMgMzQgLy8gImR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODI2CiAgICAvLyBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9IGluaXRpYWxfc3RhdGUub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBkaWcgMQogICAgcHVzaGludCAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjXzMgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MjgtODI5CiAgICAvLyAjIEludGVyZXN0CiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgPSBpbml0aWFsX3N0YXRlLmFjY3J1ZWRfaW50ZXJlc3QKICAgIGRpZyAxCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MzEtODMyCiAgICAvLyAjIEludGVyZXN0IFJhdGUKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gaW5pdGlhbF9zdGF0ZS5ub21pbmFsX2ludGVyZXN0X3JhdGUKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODMzCiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBpbml0aWFsX3N0YXRlLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UKICAgIGRpZyAxCiAgICBwdXNoaW50IDI0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MzQKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQgPSB0ZXJtcy5yYXRlX3Jlc2V0X3NwcmVhZAogICAgZGlnIDMKICAgIHB1c2hpbnQgNTgKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzNSAvLyAicmF0ZV9yZXNldF9zcHJlYWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODM1CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciA9IHRlcm1zLnJhdGVfcmVzZXRfbXVsdGlwbGllcgogICAgZGlnIDMKICAgIHB1c2hpbnQgNjYKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzNiAvLyAicmF0ZV9yZXNldF9tdWx0aXBsaWVyIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjgzNgogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X2Zsb29yID0gdGVybXMucmF0ZV9yZXNldF9mbG9vcgogICAgZGlnIDMKICAgIHB1c2hpbnQgNzQKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAyOSAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MzcKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9jYXAgPSB0ZXJtcy5yYXRlX3Jlc2V0X2NhcAogICAgZGlnIDMKICAgIHB1c2hpbnQgODIKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzMCAvLyAicmF0ZV9yZXNldF9jYXAiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODM4CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfbmV4dCA9IHRlcm1zLnJhdGVfcmVzZXRfbmV4dAogICAgZGlnIDMKICAgIHB1c2hpbnQgOTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzNyAvLyAicmF0ZV9yZXNldF9uZXh0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjgzOQogICAgLy8gc2VsZi5oYXNfcmF0ZV9yZXNldF9mbG9vciA9IHRlcm1zLmhhc19yYXRlX3Jlc2V0X2Zsb29yCiAgICBkaWcgMwogICAgcHVzaGludCA3ODQKICAgIGdldGJpdAogICAgYnl0ZWMgMzggLy8gImhhc19yYXRlX3Jlc2V0X2Zsb29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojg0MAogICAgLy8gc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgPSB0ZXJtcy5oYXNfcmF0ZV9yZXNldF9jYXAKICAgIGRpZyAzCiAgICBwdXNoaW50IDc4NQogICAgZ2V0Yml0CiAgICBieXRlYyAzOSAvLyAiaGFzX3JhdGVfcmVzZXRfY2FwIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojg0Mi04NDMKICAgIC8vICMgU2NhbGluZwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSA9IHRlcm1zLmZpeGVkX3BvaW50X3NjYWxlCiAgICB1bmNvdmVyIDMKICAgIHB1c2hpbnQgOTkKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4NDUtODQ2CiAgICAvLyAjIFNjaGVkdWxlIFByb2Nlc3NpbmcKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yID0gaW5pdGlhbF9zdGF0ZS5ldmVudF9jdXJzb3IKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4NDgtODQ5CiAgICAvLyAjIFBlci1Vbml0IEZpeGVkLVBvaW50IEluZGV4ZXMKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCA9IGluaXRpYWxfc3RhdGUuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleAogICAgZGlnIDEKICAgIHB1c2hpbnQgNTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4NTAKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggPSBpbml0aWFsX3N0YXRlLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4CiAgICBkaWcgMQogICAgcHVzaGludCA2NAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4NTItODUzCiAgICAvLyAjIFJlc2VydmVkIEFtb3VudCAoZm9yIGV4ZWN1dGVkIGNhc2hmbG93cykKICAgIC8vIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODU0CiAgICAvLyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODU2CiAgICAvLyBhc3NlcnQgdGVybXMuaW5pdGlhbF9leGNoYW5nZV9kYXRlID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsIGVyci5JTlZBTElEX0lFRAogICAgZGlnIDIKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgID4KICAgIGFzc2VydCAvLyBJRUQgbXVzdCBiZSBzZXQgaW4gdGhlIGZ1dHVyZQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODU3CiAgICAvLyBhc3NlcnQgdGVybXMuaW5pdGlhbF9leGNoYW5nZV9kYXRlID4gaW5pdGlhbF9zdGF0ZS5zdGF0dXNfZGF0ZSwgZXJyLklOVkFMSURfSUVECiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICA8CiAgICBhc3NlcnQgLy8gSUVEIG11c3QgYmUgc2V0IGluIHRoZSBmdXR1cmUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojg1OAogICAgLy8gYXNzZXJ0IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA8IHRlcm1zLm1hdHVyaXR5X2RhdGUsIGVyci5JTlZBTElEX0lFRAogICAgPAogICAgYXNzZXJ0IC8vIElFRCBtdXN0IGJlIHNldCBpbiB0aGUgZnV0dXJlCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDE5LTEwMjAKICAgIC8vICMgTm90YXJpemUgcHJvc3BlY3R1cyAob3B0aW9uYWwpCiAgICAvLyBzZWxmLnByb3NwZWN0dXNfaGFzaCA9IHByb3NwZWN0dXMuaGFzaC5ieXRlcwogICAgZGlnIDIKICAgIGV4dHJhY3QgMCAzMgogICAgYnl0ZWMgNDIgLy8gInByb3NwZWN0dXNfaGFzaCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDIxCiAgICAvLyBzZWxmLnByb3NwZWN0dXNfdXJsID0gcHJvc3BlY3R1cy51cmwKICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgYnl0ZWMgNDMgLy8gInByb3NwZWN0dXNfdXJsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwMjIKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNvbnRyYWN0X2NvbmZpZ19ib29sX2ZhbHNlQDE3OgogICAgaW50Y18wIC8vIDAKICAgIGIgY29udHJhY3RfY29uZmlnX2Jvb2xfbWVyZ2VAMTgKCmNvbnRyYWN0X2NvbmZpZ19ib29sX2ZhbHNlQDg6CiAgICBpbnRjXzAgLy8gMAogICAgYiBjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUA5CgoKLy8gbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3Rfc2NoZWR1bGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9zY2hlZHVsZToKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gMwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTAyNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBzd2FwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgMwogICAgZHVwCiAgICBwdXNoaW50IDY1CiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIHVuY292ZXIgMgogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8c21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5FeGVjdXRpb25TY2hlZHVsZUVudHJ5PgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTAzOQogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDQyCiAgICAvLyBjb250cmFjdF90eXBlPXNlbGYuY29udHJhY3RfdHlwZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBjb3ZlciAzCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODc0CiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIEQtQVNBIGFscmVhZHkgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODc1LTg3NwogICAgLy8gYXNzZXJ0IHNjaGVkdWxlX3BhZ2UubGVuZ3RoIDw9IFVJbnQ2NCgKICAgIC8vICAgICBjc3QuU0NIRURVTEVfUEFHRV9TSVpFCiAgICAvLyApLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBkdXAKICAgIHB1c2hpbnQgMTYKICAgIDw9CiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4NzgKICAgIC8vIGFzc2VydCBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID4gVUludDY0KDApLCBlcnIuVEVSTVNfTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMCAvLyAiaW5pdGlhbF9leGNoYW5nZV9hbW91bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0EgdGVybXMgbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojg4MAogICAgLy8gcGFnZV9jdXJzb3IgPSBzY2hlZHVsZV9wYWdlX2luZGV4ICogVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpCiAgICBzd2FwCiAgICBwdXNoaW50IDE2CiAgICAqCiAgICBzd2FwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4ODcKICAgIC8vICsgcGFnZV9sZW5ndGggKiBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19QRVJfRU5UUllfQlVER0VUKQogICAgcHVzaGludCAxMDAKICAgICoKICAgIHB1c2hpbnQgMTUxMAogICAgKwoKY29udHJhY3Rfc2NoZWR1bGVfd2hpbGVfdG9wQDI6CiAgICBkdXAKICAgIGdsb2JhbCBPcGNvZGVCdWRnZXQKICAgID4KICAgIGJ6IGNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX3doaWxlQDUKICAgIGl0eG5fYmVnaW4KICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBwdXNoaW50IDUgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICBieXRlYyA0NyAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW0KICAgIGJ5dGVjIDQ3IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBiIGNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEAyCgpjb250cmFjdF9zY2hlZHVsZV9hZnRlcl93aGlsZUA1OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODkwCiAgICAvLyBpbmRleCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTAKCmNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEA2OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODkxCiAgICAvLyB3aGlsZSBpbmRleCA8IHBhZ2VfbGVuZ3RoOgogICAgZGlnIDkKICAgIGRpZyA0CiAgICA8CiAgICBieiBjb250cmFjdF9zY2hlZHVsZV9hZnRlcl93aGlsZUAxNQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODkyLTg5MwogICAgLy8gZW50cnkgPSBzY2hlZHVsZV9wYWdlW2luZGV4XS5jb3B5KCkKICAgIC8vIGVudHJ5X2V2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBkaWcgNAogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgYnVyeSAxMwogICAgZGlnIDEwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgNjUKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODkzCiAgICAvLyBlbnRyeV9ldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4OTItODkzCiAgICAvLyBlbnRyeSA9IHNjaGVkdWxlX3BhZ2VbaW5kZXhdLmNvcHkoKQogICAgLy8gZW50cnlfZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGludGNfMiAvLyA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4OTMKICAgIC8vIGVudHJ5X2V2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBnZXRieXRlCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgMTQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojg5NAogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X2lkID09IHBhZ2VfY3Vyc29yICsgaW5kZXgsIGVyci5JTlZBTElEX0VWRU5UX0lECiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEzCiAgICBkaWcgNQogICAgdW5jb3ZlciA0CiAgICArCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4OTUtODk3CiAgICAvLyBzZWxmLl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBlbnRyeV9ldmVudF90eXBlCiAgICAvLyApCiAgICBkaWcgNQogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODk4CiAgICAvLyBhc3NlcnQgZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgc3dhcAogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4OTkKICAgIC8vIGlmIGVudHJ5LmV2ZW50X2lkID4gVUludDY0KDApOgogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxMgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTAwCiAgICAvLyBpZiBpbmRleCA+IFVJbnQ2NCgwKToKICAgIGRpZyA5CiAgICBieiBjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlAMTAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjkwMQogICAgLy8gcHJldmlvdXNfZW50cnkgPSBzY2hlZHVsZV9wYWdlW2luZGV4IC0gVUludDY0KDEpXS5jb3B5KCkKICAgIGRpZyA5CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgcHVzaGludCA2NQogICAgKgogICAgZGlnIDEyCiAgICBzd2FwCiAgICBwdXNoaW50IDY1CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTE6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5MTYKICAgIC8vIHByZXZpb3VzX2VudHJ5LnNjaGVkdWxlZF90aW1lIDw9IGVudHJ5LnNjaGVkdWxlZF90aW1lCiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgOAogICAgPD0KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjkxNS05MTcKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgcHJldmlvdXNfZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gZW50cnkuc2NoZWR1bGVkX3RpbWUKICAgIC8vICksIGVyci5JTlZBTElEX1NPUlRJTkcKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBtdXN0IGJlIHNvcnRlZCBpbiBzdHJpY3RseSBhc2NlbmRpbmcgb3JkZXIKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTI6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5MTgKICAgIC8vIGlmIGVudHJ5LmV2ZW50X2lkID09IFVJbnQ2NCgwKToKICAgIGRpZyA4CiAgICBibnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxNAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTE5LTkyMQogICAgLy8gYXNzZXJ0IGVudHJ5X2V2ZW50X3R5cGUgPT0gVUludDY0KAogICAgLy8gICAgIGVudW1zLkVWVF9JRUQKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZGlnIDEwCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTQ6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5MjIKICAgIC8vIGluZGV4ICs9IFVJbnQ2NCgxKQogICAgZGlnIDkKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEwCiAgICBiIGNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEA2Cgpjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlAMTA6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5MDMtOTA1CiAgICAvLyAjIFRoZSBmaXJzdCBlbnRyeSBvZiBhIHBhZ2UgbXVzdCBzdGlsbCBiZSBvcmRlcmVkIGFmdGVyIHRoZQogICAgLy8gIyBsYXN0IGVudHJ5IG9mIHRoZSBwcmV2aW91cyBwYWdlLgogICAgLy8gYXNzZXJ0IHNjaGVkdWxlX3BhZ2VfaW5kZXggPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0VWRU5UX0lECiAgICBkaWcgNgogICAgZHVwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBpZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTA2CiAgICAvLyBwcmV2aW91c19wYWdlX2luZGV4ID0gc2NoZWR1bGVfcGFnZV9pbmRleCAtIFVJbnQ2NCgxKQogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjkwOAogICAgLy8gcHJldmlvdXNfcGFnZV9pbmRleCBpbiBzZWxmLnNjaGVkdWxlX3BhZ2UKICAgIGl0b2IKICAgIGJ5dGVjIDMxIC8vIDB4NTMyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTA3LTkwOQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBwcmV2aW91c19wYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZQogICAgLy8gKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTEwLTkxMQogICAgLy8gcHJldmlvdXNfcGFnZSA9IHNlbGYuc2NoZWR1bGVfcGFnZVtwcmV2aW91c19wYWdlX2luZGV4XS5jb3B5KCkKICAgIC8vIGFzc2VydCBwcmV2aW91c19wYWdlLmxlbmd0aCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGludCAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTExCiAgICAvLyBhc3NlcnQgcHJldmlvdXNfcGFnZS5sZW5ndGggPiBVSW50NjQoMCksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGR1cAogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTEzCiAgICAvLyBwcmV2aW91c19wYWdlLmxlbmd0aCAtIFVJbnQ2NCgxKQogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjkxMi05MTQKICAgIC8vIHByZXZpb3VzX2VudHJ5ID0gcHJldmlvdXNfcGFnZVsKICAgIC8vICAgICBwcmV2aW91c19wYWdlLmxlbmd0aCAtIFVJbnQ2NCgxKQogICAgLy8gXS5jb3B5KCkKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgMgogICAgKwogICAgcHVzaGludCA2NQogICAgYm94X2V4dHJhY3QKICAgIGIgY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxMQoKY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfd2hpbGVAMTU6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMDAKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHNjaGVkdWxlX3BhZ2UuY29weSgpCiAgICBkaWcgNgogICAgaXRvYgogICAgYnl0ZWMgMzEgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBkaWcgNQogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTI1CiAgICAvLyBpZiBpc19sYXN0X3BhZ2U6CiAgICBkaWcgNQogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxNwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTI3CiAgICAvLyBzY2hlZHVsZV9wYWdlX2luZGV4ICogVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpICsgcGFnZV9sZW5ndGgKICAgIGRpZyAxCiAgICBkaWcgNAogICAgKwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTI2CiAgICAvLyBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50ID0gKAogICAgYnl0ZWMgNCAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5MjYtOTI4CiAgICAvLyBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50ID0gKAogICAgLy8gICAgIHNjaGVkdWxlX3BhZ2VfaW5kZXggKiBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkgKyBwYWdlX2xlbmd0aAogICAgLy8gKQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjkyOQogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgcHVzaGludCA1MAogICAgYXBwX2dsb2JhbF9wdXQKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTc6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDQ3CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwMjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmV4ZWN1dGVfaWVkW3JvdXRpbmddKCkgLT4gdm9pZDoKZXhlY3V0ZV9pZWQ6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA1NwogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDU4CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA1OQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwNjEKICAgIC8vIGFzc2VydCBzZWxmLmV2ZW50X2N1cnNvciA8IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICBkaWcgMQogICAgPgogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgY3Vyc29yCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDYyCiAgICAvLyBlbnRyeSA9IHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLmV2ZW50X2N1cnNvcikKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA2MwogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X3R5cGUgPT0gYXJjNC5VSW50OChlbnVtcy5FVlRfSUVEKSwgZXJyLklOVkFMSURfRVZFTlRfVFlQRQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgZHVwCiAgICBwdXNoYnl0ZXMgMHgwMQogICAgYj09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCB0eXBlCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDY3CiAgICAvLyBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIGRpZyAxCiAgICBleHRyYWN0IDAgOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA2OQogICAgLy8gc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICBkaWcgMgogICAgZXh0cmFjdCA5IDgKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwNzAKICAgIC8vIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgZGlnIDMKICAgIGV4dHJhY3QgMTcgOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA3MQogICAgLy8gcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZGlnIDQKICAgIGV4dHJhY3QgMjUgOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA3MwogICAgLy8gbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9ZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBkaWcgNQogICAgZXh0cmFjdCAzMyA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDc0CiAgICAvLyBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICBkaWcgNgogICAgZXh0cmFjdCA0MSA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDc1CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1lbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIGRpZyA3CiAgICBleHRyYWN0IDQ5IDgKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwNzYKICAgIC8vIGZsYWdzPWVudHJ5LmZsYWdzLAogICAgZGlnIDgKICAgIGV4dHJhY3QgNTcgOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA2Ni0xMDc3CiAgICAvLyB0eXAuT2JzZXJ2ZWRFdmVudFJlcXVlc3QoCiAgICAvLyAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBvYnNlcnZlZF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1lbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9ZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9ZW50cnkuZmxhZ3MsCiAgICAvLyApLAogICAgdW5jb3ZlciA3CiAgICB1bmNvdmVyIDgKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA3MgogICAgLy8gb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA2Ni0xMDc3CiAgICAvLyB0eXAuT2JzZXJ2ZWRFdmVudFJlcXVlc3QoCiAgICAvLyAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBvYnNlcnZlZF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1lbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9ZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9ZW50cnkuZmxhZ3MsCiAgICAvLyApLAogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwNjQtMTA3OAogICAgLy8gc2VsZi5fYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkoCiAgICAvLyAgICAgZW50cnksCiAgICAvLyAgICAgdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0KAogICAgLy8gICAgICAgICBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIC8vICAgICAgICAgZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgLy8gICAgICAgICBzY2hlZHVsZWRfdGltZT1lbnRyeS5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICAgICAgYWNjcnVhbF9mYWN0b3I9ZW50cnkuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICAgICAgb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPWVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPWVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgICAgICBmbGFncz1lbnRyeS5mbGFncywKICAgIC8vICAgICApLAogICAgLy8gKQogICAgY2FsbHN1YiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkKICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA3OQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDQ5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5hcHBseV9ub25fY2FzaF9ldmVudFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFwcGx5X25vbl9jYXNoX2V2ZW50OgogICAgaW50Y18wIC8vIDAKICAgIGR1cG4gNAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwODEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwbiAyCiAgICBsZW4KICAgIHB1c2hpbnQgNzMKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuT2JzZXJ2ZWRFdmVudFJlcXVlc3QKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDk1CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA5NgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwOTgKICAgIC8vIGlmIHBheWxvYWQuZmxhZ3MgJiBVSW50NjQoZW51bXMuRkxBR19PQlNFUlZFRF9FVkVOVCk6CiAgICBwdXNoaW50IDY1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBwdXNoaW50IDQKICAgICYKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjMzCiAgICAvLyByZXR1cm4gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9DTE0pCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIHB1c2hpbnQgNQogICAgPT0KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwOTkKICAgIC8vIGFzc2VydCBzZWxmLl9zdXBwb3J0c19vYnNlcnZlZF9ldmVudHMoKSwgZXJyLk9CU0VSVkVEX0VWRU5UX1JFUVVJUkVECiAgICBhc3NlcnQgLy8gT2JzZXJ2ZWQgZXZlbnQgcmVxdWlyZWQgdG8gZXhlY3V0ZSB0aGlzIGFjdGlvbgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEwMAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMzMKICAgIC8vIHJldHVybiBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0NMTSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgZHVwCiAgICBwdXNoaW50IDUKICAgID09CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5MzgKICAgIC8vIGFzc2VydCBzZWxmLl9zdXBwb3J0c19vYnNlcnZlZF9ldmVudHMoKSwgZXJyLk9CU0VSVkVEX0VWRU5UX1JFUVVJUkVECiAgICBhc3NlcnQgLy8gT2JzZXJ2ZWQgZXZlbnQgcmVxdWlyZWQgdG8gZXhlY3V0ZSB0aGlzIGFjdGlvbgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTM5CiAgICAvLyBhc3NlcnQgcGF5bG9hZC5ldmVudF9pZCA9PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LCBlcnIuSU5WQUxJRF9FVkVOVF9JRAogICAgZGlnIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgNwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NDEKICAgIC8vIHNlbGYuY29udHJhY3RfdHlwZSwgcGF5bG9hZC5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBkdXAKICAgIGV4dHJhY3QgOCAxCiAgICBidXJ5IDEyCiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTQwLTk0MgogICAgLy8gc2VsZi5fYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgc2VsZi5jb250cmFjdF90eXBlLCBwYXlsb2FkLmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIC8vICkKICAgIGNhbGxzdWIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NDQKICAgIC8vIHBhZ2VfaW5kZXggPSBzZWxmLl9zY2hlZHVsZV9wYWdlX2luZGV4KHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxOTAKICAgIC8vIHJldHVybiBldmVudF9pZCAvLyBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkKICAgIHB1c2hpbnQgMTYKICAgIC8KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojk0NQogICAgLy8gcGFnZSA9IHR5cC5FeGVjdXRpb25TY2hlZHVsZVBhZ2UoKQogICAgcHVzaGJ5dGVzIDB4MDAwMAogICAgYnVyeSA3CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NDYKICAgIC8vIGlmIHBhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlOgogICAgaXRvYgogICAgYnl0ZWMgMzEgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA5CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMjcKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojk0NwogICAgLy8gcGFnZSA9IHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XS5jb3B5KCkKICAgIGRpZyA3CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidXJ5IDcKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX3BhZ2UgZW50cnkgZXhpc3RzCgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDI3OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTQ4CiAgICAvLyBhc3NlcnQgcGFnZS5sZW5ndGggPCBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGRpZyA1CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgMTYKICAgIDwKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojk1MwogICAgLy8gc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIGRpZyAzCiAgICBkdXAKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NTQKICAgIC8vIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICBkaWcgMQogICAgZXh0cmFjdCAxNyA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NTUKICAgIC8vIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZGlnIDIKICAgIGV4dHJhY3QgMjUgOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTU2CiAgICAvLyBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDMKICAgIGV4dHJhY3QgNDEgOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTU3CiAgICAvLyBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIGRpZyA0CiAgICBleHRyYWN0IDQ5IDgKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojk1OAogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIHVuY292ZXIgNQogICAgZXh0cmFjdCA1NyA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NTAtOTYwCiAgICAvLyB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1wYXlsb2FkLmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9cGF5bG9hZC5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPXBheWxvYWQucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXBheWxvYWQubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICkKICAgIGRpZyAxMQogICAgaXRvYgogICAgZGlnIDE4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMwogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NDktOTYxCiAgICAvLyBwYWdlLmFwcGVuZCgKICAgIC8vICAgICB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9cGF5bG9hZC5ldmVudF9pZCwKICAgIC8vICAgICAgICAgZXZlbnRfdHlwZT1wYXlsb2FkLmV2ZW50X3R5cGUsCiAgICAvLyAgICAgICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIC8vICAgICAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICAgICApCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NjIKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHBhZ2UuY29weSgpCiAgICBkaWcgOAogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojk2MwogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTAzCiAgICAvLyBhc3NlcnQgZXZlbnRfaWQgPT0gc2VsZi5ldmVudF9jdXJzb3IsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBjdXJzb3IKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExMDQKICAgIC8vIGVudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KGV2ZW50X2lkKQogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEwNgogICAgLy8gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgYnVyeSAxMAogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozNjQKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzY1CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzYzLTM3MAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjM2NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9SUiksCiAgICBwdXNoaW50IDEyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzY3CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICBwdXNoaW50IDExCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzY4CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgcHVzaGludCAxOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzYzLTM3MAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjM2OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBieiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX2ZhbHNlQDE2CgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX3RydWVAMTU6CiAgICBpbnRjXzEgLy8gMQoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9tZXJnZUAxNzoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExMDUtMTEwNwogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2lzX25vbl9jYXNoKAogICAgLy8gICAgIGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIC8vICksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IHR5cGUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExMDgKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlICE9IGFyYzQuVUludDgoZW51bXMuRVZUX0lFRCksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGRpZyA4CiAgICBwdXNoYnl0ZXMgMHgwMQogICAgYiE9CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCB0eXBlCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozNzQKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluIChVSW50NjQoZW51bXMuRVZUX1JSKSwgVUludDY0KGVudW1zLkVWVF9SUkYpKQogICAgZGlnIDQKICAgIHB1c2hpbnQgMTIKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDIxCiAgICBkaWcgNAogICAgcHVzaGludCAxMQogICAgPT0KICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfZmFsc2VAMjIKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAyMToKICAgIGludGNfMSAvLyAxCgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX21lcmdlQDIzOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEwOQogICAgLy8gaWYgc2VsZi5fZXZlbnRfaXNfcmF0ZV9yZXNldChlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpKToKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Vsc2VfYm9keUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODAKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLm9ic2VydmVyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjQgLy8gMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTEzCiAgICAvLyBzZWxmLl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeShlbnRyeSwgcGF5bG9hZCkKICAgIGRpZyA2CiAgICBkaWcgMgogICAgY2FsbHN1YiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkKICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTExNAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDgxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Vsc2VfYm9keUA1OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTExMgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICBiIGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VANgoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9mYWxzZUAyMjoKICAgIGludGNfMCAvLyAwCiAgICBiIGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfbWVyZ2VAMjMKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfZmFsc2VAMTY6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX21lcmdlQDE3CgoKLy8gbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuZ2V0X2NvbnRyYWN0X3N0YXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2NvbnRyYWN0X3N0YXRlOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBkdXAKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEyMQogICAgLy8gY29udHJhY3RfdHlwZT1hcmM0LlVJbnQ4KHNlbGYuY29udHJhY3RfdHlwZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzIgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExMjMKICAgIC8vIHRvdGFsX3VuaXRzPXNlbGYudG90YWxfdW5pdHMsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEyNAogICAgLy8gcmVzZXJ2ZWRfdW5pdHNfdG90YWw9c2VsZi5yZXNlcnZlZF91bml0c190b3RhbCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTI1CiAgICAvLyBpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudD1zZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExMjYKICAgIC8vIGV2ZW50X2N1cnNvcj1zZWxmLmV2ZW50X2N1cnNvciwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEyNwogICAgLy8gc2NoZWR1bGVfZW50cnlfY291bnQ9c2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExMjgKICAgIC8vIG91dHN0YW5kaW5nX3ByaW5jaXBhbD1zZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEyOQogICAgLy8gaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZT1zZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEzMAogICAgLy8gbm9taW5hbF9pbnRlcmVzdF9yYXRlPXNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTMxCiAgICAvLyBhY2NydWVkX2ludGVyZXN0PXNlbGYuYWNjcnVlZF9pbnRlcmVzdCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTMyCiAgICAvLyBjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4PXNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEzMwogICAgLy8gY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXg9c2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTM0CiAgICAvLyByZXNlcnZlZF9pbnRlcmVzdD1zZWxmLnJlc2VydmVkX2ludGVyZXN0LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExMzUKICAgIC8vIHJlc2VydmVkX3ByaW5jaXBhbD1zZWxmLnJlc2VydmVkX3ByaW5jaXBhbCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExMjAtMTEzNgogICAgLy8gcmV0dXJuIHR5cC5LZXJuZWxTdGF0ZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlPWFyYzQuVUludDgoc2VsZi5jb250cmFjdF90eXBlKSwKICAgIC8vICAgICBzdGF0dXM9c2VsZi5zdGF0dXMsCiAgICAvLyAgICAgdG90YWxfdW5pdHM9c2VsZi50b3RhbF91bml0cywKICAgIC8vICAgICByZXNlcnZlZF91bml0c190b3RhbD1zZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsLAogICAgLy8gICAgIGluaXRpYWxfZXhjaGFuZ2VfYW1vdW50PXNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQsCiAgICAvLyAgICAgZXZlbnRfY3Vyc29yPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgLy8gICAgIHNjaGVkdWxlX2VudHJ5X2NvdW50PXNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQsCiAgICAvLyAgICAgb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2U9c2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlLAogICAgLy8gICAgIG5vbWluYWxfaW50ZXJlc3RfcmF0ZT1zZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBhY2NydWVkX2ludGVyZXN0PXNlbGYuYWNjcnVlZF9pbnRlcmVzdCwKICAgIC8vICAgICBjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4PXNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCwKICAgIC8vICAgICBjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleD1zZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4LAogICAgLy8gICAgIHJlc2VydmVkX2ludGVyZXN0PXNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QsCiAgICAvLyAgICAgcmVzZXJ2ZWRfcHJpbmNpcGFsPXNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsLAogICAgLy8gKQogICAgdW5jb3ZlciAxNAogICAgaXRvYgogICAgdW5jb3ZlciAxNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDEzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDEwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgOQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDgKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTE2CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5nZXRfbmV4dF9kdWVfZXZlbnRbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfbmV4dF9kdWVfZXZlbnQ6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTE0MgogICAgLy8gaWYgc2VsZi5ldmVudF9jdXJzb3IgPj0gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgPj0KICAgIGJ6IGdldF9uZXh0X2R1ZV9ldmVudF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExNDQKICAgIC8vIGV2ZW50X2lkPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTQzLTExNTMKICAgIC8vIHJldHVybiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1zZWxmLmV2ZW50X2N1cnNvciwKICAgIC8vICAgICBldmVudF90eXBlPWFyYzQuVUludDgoMCksCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9VUludDY0KDApLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9VUludDY0KDApLAogICAgLy8gICAgIGZsYWdzPVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGl0b2IKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExNDUKICAgIC8vIGV2ZW50X3R5cGU9YXJjNC5VSW50OCgwKSwKICAgIGJ5dGVjIDQwIC8vIDB4MDAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExNDMtMTE1MwogICAgLy8gcmV0dXJuIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgIGV2ZW50X2lkPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgLy8gICAgIGV2ZW50X3R5cGU9YXJjNC5VSW50OCgwKSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1VSW50NjQoMCksCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1VSW50NjQoMCksCiAgICAvLyAgICAgZmxhZ3M9VUludDY0KDApLAogICAgLy8gKQogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTQ2CiAgICAvLyBzY2hlZHVsZWRfdGltZT1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTE0My0xMTUzCiAgICAvLyByZXR1cm4gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkoCiAgICAvLyAgICAgZXZlbnRfaWQ9c2VsZi5ldmVudF9jdXJzb3IsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1hcmM0LlVJbnQ4KDApLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPVVJbnQ2NCgwKSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249VUludDY0KDApLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPVVJbnQ2NCgwKSwKICAgIC8vICAgICBmbGFncz1VSW50NjQoMCksCiAgICAvLyApCiAgICBpdG9iCiAgICBzd2FwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKCmdldF9uZXh0X2R1ZV9ldmVudF9hZnRlcl9pbmxpbmVkX21vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmdldF9uZXh0X2R1ZV9ldmVudEA0OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEzOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpnZXRfbmV4dF9kdWVfZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTE1NAogICAgLy8gcmV0dXJuIHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLmV2ZW50X2N1cnNvcikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgZ2V0X25leHRfZHVlX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuZ2V0X25leHRfZHVlX2V2ZW50QDQKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5jb250cmFjdF91cGRhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF91cGRhdGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTUzLTE1NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGdyYW50cyB0aGUgdXBkYXRlIHBlcm1pc3Npb25zIHRvIHRoZSBBcnJhbmdlci4KICAgIC8vICMg4pqg77iPIFdBUk5JTkc6IEFwcGxpY2F0aW9uIHVwZGF0ZXMgbXVzdCBiZSBleGVjdXRlZCBWRVJZIGNhcmVmdWxseSwgYXMgdGhleQogICAgLy8gIyBtaWdodCBpbnRyb2R1Y2UgYnJlYWtpbmcgY2hhbmdlcy4KICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfcm90YXRlX2FycmFuZ2VyW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19yb3RhdGVfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2OQogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTcwCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gbmV3X2FycmFuZ2VyCiAgICBieXRlYyAxOCAvLyAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTcxCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfc2V0X29wX2RhZW1vbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfc2V0X29wX2RhZW1vbjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTg0CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODUKICAgIC8vIHNlbGYub3BfZGFlbW9uLnZhbHVlID0gYWRkcmVzcwogICAgYnl0ZWMgMjUgLy8gMHg1MjIzNGY3MDQ0NjE2NTZkNmY2ZTIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4NgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTczCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2Fzc2lnbl9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19hc3NpZ25fcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDE2CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLlJvbGVWYWxpZGl0eQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjExCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMgogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgcHVzaGludCAyMAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTAzCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gcm9sZV9hZGRyZXNzCiAgICBieXRlYyAxOCAvLyAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMKICAgIGRpZyAzCiAgICBhcHBfZ2xvYmFsX3B1dAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTQKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDYKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIGR1cAogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnRfbWFuYWdlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMyAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwOAogICAgLy8gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMiAvLyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTIKICAgIC8vIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIGR1cAogICAgcHVzaGludCA2MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE1CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMzIgLy8gMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE2CiAgICAvLyBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExOAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMSAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIwCiAgICAvLyBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMwogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgODAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIzCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI0IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI0CiAgICAvLyBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3Jldm9rZV9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19yZXZva2Vfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzUKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzNgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzcKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCkpCiAgICBidG9pCiAgICBkdXBuIDIKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCAhPSBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksIGVyci5JTlZBTElEX1JPTEUKICAgIGR1cAogICAgcHVzaGludCAyMAogICAgIT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyOAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIzIC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0NGQ2MTZlNjE2NzY1NzIyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMwCiAgICAvLyBkZWwgc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzOQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjE2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIyIC8vIDB4NTIyMzUwNzI2OTZkNjE3Mjc5NDQ2NTYxNmM2NTcyMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNAogICAgLy8gZGVsIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjM4CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIGR1cAogICAgcHVzaGludCA2MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAzMiAvLyAweDUyMjM1NDcyNzU3Mzc0NjU2NTIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzgKICAgIC8vIGRlbCBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjM4CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDEKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hdXRob3JpdHksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjEgLy8gMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MgogICAgLy8gZGVsIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzOAogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDQKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDgwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI0IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ2CiAgICAvLyBkZWwgc2VsZi5vYnNlcnZlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ292X2Fzc2V0X3N1c3BlbnNpb25bcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dvdl9hc3NldF9zdXNwZW5zaW9uOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kICAjIFRPRE86IFVwZGF0ZSBzcGVjcyBhbmQgYWRkIHRlc3QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzcKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDIxIC8vIDB4NTIyMzQxNzU3NDY4NmY3MjY5NzQ3OTIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU3CiAgICAvLyBzZWxmLmFzc2V0X3N1c3BlbmRlZCA9IHN1c3BlbmRlZAogICAgYnl0ZWMgMzMgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU4CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCAgIyBUT0RPOiBVcGRhdGUgc3BlY3MgYW5kIGFkZCB0ZXN0CiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYXJyYW5nZXJbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNjgKICAgIC8vIHJldHVybiBzZWxmLmFycmFuZ2VyLnZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTggLy8gMHg1MjIzNDE3MjcyNjE2ZTY3NjU3MjIzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJyYW5nZXIgZXhpc3RzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjYwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9hZGRyZXNzX3JvbGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfYWRkcmVzc19yb2xlczoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg0CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmFjY291bnRfbWFuYWdlciwgYWRkcmVzcyksCiAgICBieXRlYyAyMyAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMKICAgIGRpZyAxCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4NQogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5wcmltYXJ5X2RlYWxlciwgYWRkcmVzcyksCiAgICBieXRlYyAyMiAvLyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzCiAgICBkaWcgMgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODYKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYudHJ1c3RlZSwgYWRkcmVzcyksCiAgICBieXRlYyAzMiAvLyAweDUyMjM1NDcyNzU3Mzc0NjU2NTIzCiAgICBkaWcgMwogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODcKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYXV0aG9yaXR5LCBhZGRyZXNzKSwKICAgIGJ5dGVjIDIxIC8vIDB4NTIyMzQxNzU3NDY4NmY3MjY5NzQ3OTIzCiAgICBkaWcgNAogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODgKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYub2JzZXJ2ZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjQgLy8gMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzCiAgICB1bmNvdmVyIDUKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjcwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjIDQwIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDYKICAgIHNldGJpdAogICAgaW50Y18xIC8vIDEKICAgIHVuY292ZXIgNQogICAgc2V0Yml0CiAgICBwdXNoaW50IDIKICAgIHVuY292ZXIgNAogICAgc2V0Yml0CiAgICBwdXNoaW50IDMKICAgIHVuY292ZXIgMwogICAgc2V0Yml0CiAgICBwdXNoaW50IDQKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA1CiAgICAvLyByb2xlID0gcm9sZV9pZC5hc191aW50NjQoKQogICAgYnRvaQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwNgogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZSkKICAgIGR1cAogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDgKICAgIC8vIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgcHVzaGludHMgMjAgNDAgNTAgNjAgNzAgODAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDctMzM4CiAgICAvLyBtYXRjaCByb2xlOgogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgLy8gICAgICAgICByZXR1cm4gdHlwLlJvbGVWYWxpZGl0eSgKICAgIC8vICAgICAgICAgICAgIHJvbGVfdmFsaWRpdHlfc3RhcnQ9VUludDY0KDApLCByb2xlX3ZhbGlkaXR5X2VuZD1VSW50NjQoMCkKICAgIC8vICAgICAgICAgKQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5hdXRob3JpdHksIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5vYnNlcnZlciwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5vYnNlcnZlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBfOgogICAgLy8gICAgICAgICBvcC5lcnIoZXJyLklOVkFMSURfUk9MRSkKICAgIHVuY292ZXIgNgogICAgbWF0Y2ggcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8wQDIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8xQDMgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8yQDQgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8zQDUgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV80QDYgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV81QDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzgKICAgIC8vIG9wLmVycihlcnIuSU5WQUxJRF9ST0xFKQogICAgZXJyIC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzVANzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzQKICAgIC8vIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMjQgLy8gMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzMzLTMzNQogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMzNgogICAgLy8gcmV0dXJuIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzRANjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjkKICAgIC8vIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDIxIC8vIDB4NTIyMzQxNzU3NDY4NmY3MjY5NzQ3OTIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI4LTMzMAogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzEKICAgIC8vIHJldHVybiBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzNANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjQKICAgIC8vIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAzMiAvLyAweDUyMjM1NDcyNzU3Mzc0NjU2NTIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzIzLTMyNQogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI2CiAgICAvLyByZXR1cm4gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMkA0OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxOQogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAyMiAvLyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzE4LTMyMAogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMQogICAgLy8gcmV0dXJuIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8xQDM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzE0CiAgICAvLyBzZWxmLmFjY291bnRfbWFuYWdlciwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAyMyAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTMtMzE1CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxNgogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMEAyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwOS0zMTEKICAgIC8vIHJldHVybiB0eXAuUm9sZVZhbGlkaXR5KAogICAgLy8gICAgIHJvbGVfdmFsaWRpdHlfc3RhcnQ9VUludDY0KDApLCByb2xlX3ZhbGlkaXR5X2VuZD1VSW50NjQoMCkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLl9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IHZvaWQ6Cl9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI2CiAgICAvLyBkZWYgX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQoc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjgKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkLCBlcnIuU1VTUEVOREVECiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCAzODQKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIFN1c3BlbmRlZCBvcGVyYXRpb25zCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5fc2V0dGxlX3Bvc2l0aW9uKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NCwgdWludDY0Ogpfc2V0dGxlX3Bvc2l0aW9uOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjQ0CiAgICAvLyBkZWYgX3NldHRsZV9wb3NpdGlvbihzZWxmLCBob2xkaW5nX2FkZHJlc3M6IEFjY291bnQpIC0+IHR1cGxlW1VJbnQ2NCwgVUludDY0XToKICAgIHByb3RvIDEgMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo2MQogICAgLy8gcG9zaXRpb24gPSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jb3B5KCkKICAgIGR1cAogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NjMtNjUKICAgIC8vICMgQ29tcHV0ZSB0aGUgaW5jcmVtZW50YWwgcGVyLXVuaXQgZml4ZWQtcG9pbnQgaW50ZXJlc3QgYW5kIHByaW5jaXBhbCBhY2NydWVkCiAgICAvLyAjIHNpbmNlIHRoaXMgYWNjb3VudCdzIGxhc3QgY2hlY2twb2ludC4KICAgIC8vIGludGVyZXN0X2RlbHRhID0gc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IC0gcG9zaXRpb24uaW50ZXJlc3RfY2hlY2twb2ludAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggZXhpc3RzCiAgICBkaWcgMQogICAgcHVzaGludCA1NwogICAgZXh0cmFjdF91aW50NjQKICAgIC0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo2NwogICAgLy8gc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCAtIHBvc2l0aW9uLnByaW5jaXBhbF9jaGVja3BvaW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTcgLy8gImN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IGV4aXN0cwogICAgZGlnIDIKICAgIHB1c2hpbnQgNjUKICAgIGV4dHJhY3RfdWludDY0CiAgICAtCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzMKICAgIC8vIGludGVyZXN0X2RlbHRhLCBwb3NpdGlvbi51bml0cywgc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgZGlnIDIKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3MC03NAogICAgLy8gIyBDb252ZXJ0IHRoZSBwZXItdW5pdCBmaXhlZC1wb2ludCBkZWx0YXMgaW50byBhYnNvbHV0ZSBjbGFpbWFibGUgYW1vdW50cwogICAgLy8gIyB1c2luZyB0aGUgYWNjb3VudCdzIGFjdGl2ZSB1bml0cy4KICAgIC8vIGNsYWltYWJsZV9pbnRlcmVzdCA9IHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIGludGVyZXN0X2RlbHRhLCBwb3NpdGlvbi51bml0cywgc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgLy8gKQogICAgdW5jb3ZlciAzCiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojc2CiAgICAvLyBwcmluY2lwYWxfZGVsdGEsIHBvc2l0aW9uLnVuaXRzLCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzUtNzcKICAgIC8vIGNsYWltYWJsZV9wcmluY2lwYWwgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBwcmluY2lwYWxfZGVsdGEsIHBvc2l0aW9uLnVuaXRzLCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICAvLyApCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojc5LTgxCiAgICAvLyAjIEFjY3J1ZSB0aGUgY2xhaW1hYmxlIGFtb3VudHMgdG8gdGhlIGFjY291bnQgcG9zaXRpb24gYW5kIG1ha2UgdGhlbSBhdmFpbGFibGUKICAgIC8vICMgZm9yIHdpdGhkcmF3YWwuCiAgICAvLyBwb3NpdGlvbi5jbGFpbWFibGVfaW50ZXJlc3QgKz0gY2xhaW1hYmxlX2ludGVyZXN0CiAgICBkaWcgMgogICAgcHVzaGludCA3MwogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICArCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIHN3YXAKICAgIHJlcGxhY2UyIDczCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6ODIKICAgIC8vIHBvc2l0aW9uLmNsYWltYWJsZV9wcmluY2lwYWwgKz0gY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgZHVwCiAgICBwdXNoaW50IDgxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDIKICAgICsKICAgIGl0b2IKICAgIHJlcGxhY2UyIDgxCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6ODQtODYKICAgIC8vICMgQWR2YW5jZSB0aGUgYWNjb3VudCdzIHBlci11bml0IGZpeGVkLXBvaW50IGNoZWNrcG9pbnRzIHRvIHRoZSBjdXJyZW50IGdsb2JhbAogICAgLy8gIyBwZXItdW5pdCBmaXhlZC1wb2ludCBnbG9iYWwgaW5kaWNlcy4KICAgIC8vIHBvc2l0aW9uLmludGVyZXN0X2NoZWNrcG9pbnQgPSBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IGV4aXN0cwogICAgaXRvYgogICAgcmVwbGFjZTIgNTcKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo4NwogICAgLy8gcG9zaXRpb24ucHJpbmNpcGFsX2NoZWNrcG9pbnQgPSBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTcgLy8gImN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IGV4aXN0cwogICAgaXRvYgogICAgcmVwbGFjZTIgNjUKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo4OS05MAogICAgLy8gIyBBZHZhbmNlIHRoZSBhY2NvdW50J3MgZXZlbnQgY3Vyc29yIHRvIHRoZSBjdXJyZW50IGdsb2JhbCBldmVudCBjdXJzb3IuCiAgICAvLyBwb3NpdGlvbi5zZXR0bGVkX2N1cnNvciA9IHNlbGYuZXZlbnRfY3Vyc29yCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGl0b2IKICAgIHJlcGxhY2UyIDQ5CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6OTItOTQKICAgIC8vICMgVXBkYXRlIHRoZSBhY2NvdW50IHBvc2l0aW9uIGFuZCByZXR1cm4gdGhlIG5ld2x5IGFjY3J1ZWQgY2xhaW1hYmxlIGFtb3VudHMKICAgIC8vICMgYWRkZWQgdG8gdGhlIHRvdGFsIHBvc2l0aW9uJ3MgY2xhaW1hYmxlIGFtb3VudHMuCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHBvc2l0aW9uLmNvcHkoKQogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6OTUKICAgIC8vIHJldHVybiBjbGFpbWFibGVfaW50ZXJlc3QsIGNsYWltYWJsZV9wcmluY2lwYWwKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IHZvaWQ6Cl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojk3CiAgICAvLyBkZWYgX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQoc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQyMwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDAKICAgIC8vIGlmIHNlbGYuX3N0YXR1c19pc19wZW5kaW5nX2llZCgpOgogICAgYnogX2Vuc3VyZV91bml0c19hY3RpdmF0ZWRfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTAxCiAgICAvLyByZXR1cm4KICAgIHJldHN1YgoKX2Vuc3VyZV91bml0c19hY3RpdmF0ZWRfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwMwogICAgLy8gcG9zaXRpb24gPSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAyCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDQKICAgIC8vIGlmIHBvc2l0aW9uLnJlc2VydmVkX3VuaXRzID09IFVJbnQ2NCgwKToKICAgIHB1c2hpbnQgNDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgYm56IF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkX2FmdGVyX2lmX2Vsc2VANAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwNQogICAgLy8gcmV0dXJuCiAgICByZXRzdWIKCl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkX2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDgKICAgIC8vIHBvc2l0aW9uLnVuaXRzICs9IGFjdGl2YXRlZF91bml0cwogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMwogICAgKwogICAgaXRvYgogICAgcmVwbGFjZTIgMzIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDkKICAgIC8vIHBvc2l0aW9uLnJlc2VydmVkX3VuaXRzID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgaXRvYgogICAgcmVwbGFjZTIgNDAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTAKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gcG9zaXRpb24uY29weSgpCiAgICBmcmFtZV9kaWcgMgogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExMQogICAgLy8gYXNzZXJ0IHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPj0gYWN0aXZhdGVkX3VuaXRzLCBlcnIuT1ZFUl9ESVNUUklCVVRJT04KICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICBkdXAKICAgIGRpZyAyCiAgICA+PQogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCByZW1haW5pbmcgRC1BU0EgdW5pdHMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTIKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgLT0gYWN0aXZhdGVkX3VuaXRzCiAgICBzd2FwCiAgICAtCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX3NjYWxlZF9tdWxfZGl2KG11bHRpcGxpY2FuZDogdWludDY0LCBtdWx0aXBsaWVyOiB1aW50NjQsIGRpdmlzb3I6IHVpbnQ2NCkgLT4gdWludDY0Ogpfc2NhbGVkX211bF9kaXY6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNTMtMTU1CiAgICAvLyBkZWYgX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIHNlbGYsIG11bHRpcGxpY2FuZDogVUludDY0LCBtdWx0aXBsaWVyOiBVSW50NjQsIGRpdmlzb3I6IFVJbnQ2NAogICAgLy8gKSAtPiBVSW50NjQ6CiAgICBwcm90byAzIDEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE1NwogICAgLy8gaWYgbXVsdGlwbGljYW5kID09IFVJbnQ2NCgwKSBvciBtdWx0aXBsaWVyID09IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMwogICAgYnogX3NjYWxlZF9tdWxfZGl2X2lmX2JvZHlAMgogICAgZnJhbWVfZGlnIC0yCiAgICBibnogX3NjYWxlZF9tdWxfZGl2X2FmdGVyX2lmX2Vsc2VAMwoKX3NjYWxlZF9tdWxfZGl2X2lmX2JvZHlAMjoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE1OAogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKX3NjYWxlZF9tdWxfZGl2X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE1OQogICAgLy8gaGlnaCwgbG93ID0gb3AubXVsdyhtdWx0aXBsaWNhbmQsIG11bHRpcGxpZXIpCiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMgogICAgbXVsdwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTYwCiAgICAvLyByZXR1cm4gb3AuZGl2dyhoaWdoLCBsb3csIGRpdmlzb3IpCiAgICBmcmFtZV9kaWcgLTEKICAgIGRpdncKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9hbW91bnRfdG9faW5kZXhfZGVsdGEoYW1vdW50OiB1aW50NjQpIC0+IHVpbnQ2NDoKX2Ftb3VudF90b19pbmRleF9kZWx0YToKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE2MgogICAgLy8gZGVmIF9hbW91bnRfdG9faW5kZXhfZGVsdGEoc2VsZiwgYW1vdW50OiBVSW50NjQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTY0CiAgICAvLyBpZiBhbW91bnQgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0xCiAgICBibnogX2Ftb3VudF90b19pbmRleF9kZWx0YV9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE2NQogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKX2Ftb3VudF90b19pbmRleF9kZWx0YV9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNjYKICAgIC8vIGFzc2VydCBzZWxmLnRvdGFsX3VuaXRzID4gVUludDY0KDApLCBlcnIuTk9fVU5JVFMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICBkdXAKICAgIGFzc2VydCAvLyBObyBELUFTQSB1bml0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTY3CiAgICAvLyByZXR1cm4gc2VsZi5fc2NhbGVkX211bF9kaXYoYW1vdW50LCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLCBzZWxmLnRvdGFsX3VuaXRzKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5faW5kZXhfZGVsdGFfdG9fYW1vdW50KGluZGV4X2RlbHRhOiB1aW50NjQpIC0+IHVpbnQ2NDoKX2luZGV4X2RlbHRhX3RvX2Ftb3VudDoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE2OQogICAgLy8gZGVmIF9pbmRleF9kZWx0YV90b19hbW91bnQoc2VsZiwgaW5kZXhfZGVsdGE6IFVJbnQ2NCkgLT4gVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNzYKICAgIC8vIGlmIGluZGV4X2RlbHRhID09IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMQogICAgYm56IF9pbmRleF9kZWx0YV90b19hbW91bnRfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNzcKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9pbmRleF9kZWx0YV90b19hbW91bnRfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTc5CiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE4MQogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE3OC0xODIKICAgIC8vIHJldHVybiBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLnRvdGFsX3VuaXRzLAogICAgLy8gICAgIGluZGV4X2RlbHRhLAogICAgLy8gICAgIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZ2V0X3NjaGVkdWxlX2VudHJ5KGV2ZW50X2lkOiB1aW50NjQpIC0+IGJ5dGVzOgpfZ2V0X3NjaGVkdWxlX2VudHJ5OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjAyCiAgICAvLyBkZWYgX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLCBldmVudF9pZDogVUludDY0KSAtPiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeToKICAgIHByb3RvIDEgMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjA0CiAgICAvLyBhc3NlcnQgZXZlbnRfaWQgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LCBlcnIuSU5WQUxJRF9FVkVOVF9JRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICA+CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBpZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTkwCiAgICAvLyByZXR1cm4gZXZlbnRfaWQgLy8gVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMTYKICAgIC8KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjIwNgogICAgLy8gYXNzZXJ0IHBhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBpdG9iCiAgICBieXRlYyAzMSAvLyAweDUzMjMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE5NAogICAgLy8gcmV0dXJuIGV2ZW50X2lkICUgVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMTYKICAgICUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjIwOQogICAgLy8gYXNzZXJ0IG9mZnNldCA8IHBhZ2UubGVuZ3RoLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIHB1c2hpbnQgMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGRpZyAxCiAgICA+CiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMTAKICAgIC8vIHJldHVybiBwYWdlW29mZnNldF0uY29weSgpCiAgICBwdXNoaW50IDY1CiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIHB1c2hpbnQgNjUKICAgIGJveF9leHRyYWN0CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoY29udHJhY3RfdHlwZTogdWludDY0LCBldmVudF90eXBlOiB1aW50NjQpIC0+IHZvaWQ6Cl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZToKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMxMy0zMTUKICAgIC8vIGRlZiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgc2VsZiwgY29udHJhY3RfdHlwZTogVUludDY0LCBldmVudF90eXBlOiBVSW50NjQKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjU0LTI1NQogICAgLy8gIyBDaGVjayBjb21tb24gZXZlbnRzIGZpcnN0CiAgICAvLyBpZiBldmVudF90eXBlIGluIGNvbW1vbl9ldmVudHM6CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI0NwogICAgLy8gVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI0OAogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUCksCiAgICBpbnRjXzIgLy8gOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjU0LTI1NQogICAgLy8gIyBDaGVjayBjb21tb24gZXZlbnRzIGZpcnN0CiAgICAvLyBpZiBldmVudF90eXBlIGluIGNvbW1vbl9ldmVudHM6CiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjQ5CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX01EKSwKICAgIHB1c2hpbnQgMTkKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI1MAogICAgLy8gVUludDY0KGVudW1zLkVWVF9SUiksCiAgICBwdXNoaW50IDEyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyNTEKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIHB1c2hpbnQgMTEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDcKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDY6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyNTYKICAgIC8vIHJldHVybiBUcnVlCiAgICBpbnRjXzEgLy8gMQoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQ6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIHJldHN1YgoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI1OC0yNTkKICAgIC8vICMgQ29udHJhY3Qtc3BlY2lmaWMgYWRkaXRpb25hbCBldmVudHMKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX1BBTSk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyNjAtMjYxCiAgICAvLyAjIFBBTSBvbmx5IHN1cHBvcnRzIGNvbW1vbiBldmVudHMKICAgIC8vIHJldHVybiBGYWxzZQogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI2MwogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfTEFNKSBvciBjb250cmFjdF90eXBlID09IFVJbnQ2NCgKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAzCiAgICA9PQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjYzLTI2NQogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfTEFNKSBvciBjb250cmFjdF90eXBlID09IFVJbnQ2NCgKICAgIC8vICAgICBlbnVtcy5DVF9OQU0KICAgIC8vICk6CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlAMTEKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAyCiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMTYKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDExOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjY2LTI3MAogICAgLy8gIyBMQU0vTkFNIGFkZDogUFIsIElQQ0IKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyNjgKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyNjYtMjcwCiAgICAvLyAjIExBTS9OQU0gYWRkOiBQUiwgSVBDQgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMTMKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjY5CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgcHVzaGludCAxOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjY2LTI3MAogICAgLy8gIyBMQU0vTkFNIGFkZDogUFIsIElQQ0IKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gKQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDE0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDEzOgogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMTQ6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAxNjoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI3MgogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKToKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAyMwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjczLTI3OAogICAgLy8gIyBBTk4gYWRkczogUFIsIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyNzUKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyNzMtMjc4CiAgICAvLyAjIEFOTiBhZGRzOiBQUiwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjAKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Mjc2CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgcHVzaGludCAxOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjczLTI3OAogICAgLy8gIyBBTk4gYWRkczogUFIsIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDIwCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI3NwogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyNzMtMjc4CiAgICAvLyAjIEFOTiBhZGRzOiBQUiwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMjEKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjA6CiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF9mYWxzZUAyMToKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDIzOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjgwCiAgICAvLyBpZiBjb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9MQVgpOgogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDQKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAzMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjgxLTI4NwogICAgLy8gIyBMQVggYWRkczogUFIsIFBJLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjgzCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjgxLTI4NwogICAgLy8gIyBMQVggYWRkczogUFIsIFBJLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyOAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyODQKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgcHVzaGludCA0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyODEtMjg3CiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDI4CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI4NQogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIHB1c2hpbnQgMTgKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI4MS0yODcKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjgKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Mjg2CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICBwdXNoaW50IDUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI4MS0yODcKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMjkKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjg6CiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF9mYWxzZUAyOToKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDMxOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Mjg5CiAgICAvLyBpZiBjb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9DTE0pOgogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDUKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAzMwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjkwLTI5MQogICAgLy8gIyBDTE0gYWRkczogUFIKICAgIC8vIHJldHVybiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMzM6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyOTMKICAgIC8vIHJldHVybiBGYWxzZQogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKCi8vIG1vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9pc19keW5hbWljX2FubnVpdHkoKSAtPiB1aW50NjQ6Cl9pc19keW5hbWljX2FubnVpdHk6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozMzUKICAgIC8vIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMzNS0zMzYKICAgIC8vIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKQogICAgLy8gYW5kIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgYnogX2lzX2R5bmFtaWNfYW5udWl0eV9ib29sX2ZhbHNlQDMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMzNgogICAgLy8gYW5kIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDM0IC8vICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24gZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozMzUtMzM2CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIC8vIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGJ6IF9pc19keW5hbWljX2FubnVpdHlfYm9vbF9mYWxzZUAzCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzM0LTMzNwogICAgLy8gcmV0dXJuICgKICAgIC8vICAgICBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIC8vICAgICBhbmQgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICAvLyApCiAgICByZXRzdWIKCl9pc19keW5hbWljX2FubnVpdHlfYm9vbF9mYWxzZUAzOgogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMzNC0zMzcKICAgIC8vIHJldHVybiAoCiAgICAvLyAgICAgc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICAvLyAgICAgYW5kIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgLy8gKQogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnk6IGJ5dGVzKSAtPiB1aW50NjQsIGJ5dGVzOgpfZW50cnlfaW50ZXJlc3Rfc2VnbWVudDoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjM4MAogICAgLy8gZGVmIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KHNlbGYsIGVudHJ5OiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSkgLT4gVUludDY0OgogICAgcHJvdG8gMSAyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozODkKICAgIC8vIGVudHJ5LmFjY3J1YWxfZmFjdG9yID09IFVJbnQ2NCgwKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDE3CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozODktMzkxCiAgICAvLyBlbnRyeS5hY2NydWFsX2ZhY3RvciA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID09IFVJbnQ2NCgwKQogICAgLy8gb3Igc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID09IFVJbnQ2NCgwKQogICAgYnogX2VudHJ5X2ludGVyZXN0X3NlZ21lbnRfaWZfYm9keUAzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozOTAKICAgIC8vIG9yIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID09IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozODktMzkxCiAgICAvLyBlbnRyeS5hY2NydWFsX2ZhY3RvciA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID09IFVJbnQ2NCgwKQogICAgLy8gb3Igc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID09IFVJbnQ2NCgwKQogICAgYnogX2VudHJ5X2ludGVyZXN0X3NlZ21lbnRfaWZfYm9keUAzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozOTEKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozODktMzkxCiAgICAvLyBlbnRyeS5hY2NydWFsX2ZhY3RvciA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID09IFVJbnQ2NCgwKQogICAgLy8gb3Igc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID09IFVJbnQ2NCgwKQogICAgYm56IF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2FmdGVyX2lmX2Vsc2VANAoKX2VudHJ5X2ludGVyZXN0X3NlZ21lbnRfaWZfYm9keUAzOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzkzCiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfZGlnIC0xCiAgICB1bmNvdmVyIDIKICAgIHJldHN1YgoKX2VudHJ5X2ludGVyZXN0X3NlZ21lbnRfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Mzk1CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Mzk2CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Mzk3CiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Mzk0LTM5OAogICAgLy8gYWNjcnVlZCA9IHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSwKICAgIC8vICAgICBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQwMgogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjM5OS00MDMKICAgIC8vIHJldHVybiBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBhY2NydWVkLAogICAgLy8gICAgIGVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMAogICAgc3dhcAogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIGZyYW1lX2RpZyAtMQogICAgdW5jb3ZlciAyCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZGlzY291bnRfYW5udWl0eV9mYWN0b3IoZGlzY291bnRfZmFjdG9yOiB1aW50NjQsIHJlZGVtcHRpb25fZmFjdG9yOiB1aW50NjQpIC0+IHVpbnQ2NDoKX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDYyLTQ2NgogICAgLy8gZGVmIF9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcigKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgIGRpc2NvdW50X2ZhY3RvcjogVUludDY0LAogICAgLy8gICAgIHJlZGVtcHRpb25fZmFjdG9yOiBVSW50NjQsCiAgICAvLyApIC0+IFVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDY4CiAgICAvLyBpZiByZWRlbXB0aW9uX2ZhY3RvciA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGJueiBfZGlzY291bnRfYW5udWl0eV9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0NjkKICAgIC8vIHJldHVybiBkaXNjb3VudF9mYWN0b3IKICAgIGZyYW1lX2RpZyAtMgogICAgcmV0c3ViCgpfZGlzY291bnRfYW5udWl0eV9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDcwCiAgICAvLyBwZXJpb2RfcmF0ZSA9IHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgKyBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQ3MQogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQ3MC00NzQKICAgIC8vIHBlcmlvZF9yYXRlID0gc2VsZi5maXhlZF9wb2ludF9zY2FsZSArIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIHJlZGVtcHRpb25fZmFjdG9yLAogICAgLy8gICAgIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgKwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDc1CiAgICAvLyBhc3NlcnQgcGVyaW9kX3JhdGUgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZHVwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0NzgKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0NzYtNDgwCiAgICAvLyByZXR1cm4gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgZGlzY291bnRfZmFjdG9yLAogICAgLy8gICAgIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICAvLyAgICAgcGVyaW9kX3JhdGUsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeShlbnRyeTogYnl0ZXMsIHBheWxvYWQ6IGJ5dGVzKSAtPiBieXRlcywgYnl0ZXM6Cl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeToKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYxMy02MTUKICAgIC8vIGRlZiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkoCiAgICAvLyAgICAgc2VsZiwgZW50cnk6IHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5LCBwYXlsb2FkOiB0eXAuT2JzZXJ2ZWRFdmVudFJlcXVlc3QKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDIgMgogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2MjMKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF9pZCA9PSBzZWxmLmV2ZW50X2N1cnNvciwgZXJyLklOVkFMSURfRVZFTlRfQ1VSU09SCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgY3Vyc29yCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2MjQKICAgIC8vIGFzc2VydCBlbnRyeS5zY2hlZHVsZWRfdGltZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwgZXJyLk5PX0RVRV9DQVNIRkxPVwogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA8PQogICAgYXNzZXJ0IC8vIE5vIGR1ZSBjYXNoZmxvdyB0byBwYXkKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYyNgogICAgLy8gZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjI3CiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfSUVEKToKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgZHVwCiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMzUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjI4LTYzMAogICAgLy8gIyBJRUQgZmluYWxpemVzIGlzc3VhbmNlOiByZXNlcnZlZCB1bml0cyBiZWNvbWUgYWN0aXZhdGFibGUgYW5kIHRoZQogICAgLy8gIyBzY2hlZHVsZSdzIGluaXRpYWwgY29udHJhY3R1YWwgc3RhdGUgYmVjb21lcyBsaXZlLgogICAgLy8gYXNzZXJ0IHNlbGYuX3N0YXR1c19pc19wZW5kaW5nX2llZCgpLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYzMgogICAgLy8gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCA9PSBzZWxmLnRvdGFsX3VuaXRzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgID09CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2MzEtNjMzCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPT0gc2VsZi50b3RhbF91bml0cwogICAgLy8gKSwgZXJyLlBSSU1BUllfRElTVFJJQlVUSU9OX0lOQ09NUExFVEUKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBub3QgY29tcGxldGUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYzNAogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2MzUKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYzNgogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPSBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZQogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYzNwogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ID0gVUludDY0KDApCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2MzgKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IGVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA0MQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYzOQogICAgLy8gc2VsZi5ldmVudF9jdXJzb3IgKz0gVUludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjQwCiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbnVtcy5TVEFUVVNfQUNUSVZFKQogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgcHVzaGludCAxMDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0NTEKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwgZXJyLk5PVF9FVlRfSUVECiAgICBmcmFtZV9kaWcgMTEKICAgIGFzc2VydCAvLyBOb3QgSUVEIGV2ZW50CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0NTIKICAgIC8vIHJldHVybiBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjQxLTY0NQogICAgLy8gc2VsZi5fZW1pdF9leGVjdXRpb25fZXZlbnQoCiAgICAvLyAgICAgZW50cnk9ZW50cnksCiAgICAvLyAgICAgcGF5b2ZmPXNlbGYuX2VudHJ5X2llZF9hbW91bnQoZW50cnkpLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjQ0CiAgICAvLyBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjQxLTY0NQogICAgLy8gc2VsZi5fZW1pdF9leGVjdXRpb25fZXZlbnQoCiAgICAvLyAgICAgZW50cnk9ZW50cnksCiAgICAvLyAgICAgcGF5b2ZmPXNlbGYuX2VudHJ5X2llZF9hbW91bnQoZW50cnkpLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGNhbGxzdWIgX2VtaXRfZXhlY3V0aW9uX2V2ZW50CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgLTIKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjY0NgogICAgLy8gcmV0dXJuCiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2J1cnkgMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMzUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTQ3CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuX3N0YXR1c19pc19wZW5kaW5nX2llZCgpLCBlcnIuUEVORElOR19JRUQKICAgICEKICAgIGFzc2VydCAvLyBJRUQgbm90IHlldCBleGVjdXRlZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjQ5CiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgKz0gc2VsZi5fZW50cnlfaW50ZXJlc3Rfc2VnbWVudChlbnRyeSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQKICAgIGZyYW1lX2J1cnkgLTIKICAgICsKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjUxCiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUlIpOgogICAgZnJhbWVfZGlnIDEwCiAgICBwdXNoaW50IDEyCiAgICA9PQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAxMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjU1CiAgICAvLyBwYXlsb2FkLm9ic2VydmVkX3JhdGUsCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2NTYKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9tdWx0aXBsaWVyLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDM2IC8vICJyYXRlX3Jlc2V0X211bHRpcGxpZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9tdWx0aXBsaWVyIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjU3CiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjUyLTY1OAogICAgLy8gIyBSUiBkZXJpdmVzIHRoZSBuZXh0IHJhdGUgZnJvbSBhbiBvYnNlcnZlZCBvcmFjbGUgdmFsdWUgcGx1cyB0aGUKICAgIC8vICMgY29udHJhY3Qgc3ByZWFkIC8gbXVsdGlwbGllciB0ZXJtcywgdGhlbiBlbmZvcmNlcyBmbG9vciBhbmQgY2FwLgogICAgLy8gb2JzZXJ2ZWRfcmF0ZSA9IHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIHBheWxvYWQub2JzZXJ2ZWRfcmF0ZSwKICAgIC8vICAgICBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjY2MAogICAgLy8gb2JzZXJ2ZWRfcmF0ZSArIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzNSAvLyAicmF0ZV9yZXNldF9zcHJlYWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQgZXhpc3RzCiAgICArCiAgICBmcmFtZV9idXJ5IDYKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjczNAogICAgLy8gaWYgc2VsZi5oYXNfcmF0ZV9yZXNldF9mbG9vciBhbmQgcmF0ZSA8IHNlbGYucmF0ZV9yZXNldF9mbG9vcjoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzOCAvLyAiaGFzX3JhdGVfcmVzZXRfZmxvb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgZXhpc3RzCiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1NQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI5IC8vICJyYXRlX3Jlc2V0X2Zsb29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfZmxvb3IgZXhpc3RzCiAgICBmcmFtZV9kaWcgNgogICAgPgogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjczNQogICAgLy8gcmF0ZSA9IHNlbGYucmF0ZV9yZXNldF9mbG9vcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI5IC8vICJyYXRlX3Jlc2V0X2Zsb29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgNgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9mbG9vciBleGlzdHMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU1OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzM2CiAgICAvLyBpZiBzZWxmLmhhc19yYXRlX3Jlc2V0X2NhcCBhbmQgcmF0ZSA+IHNlbGYucmF0ZV9yZXNldF9jYXA6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzkgLy8gImhhc19yYXRlX3Jlc2V0X2NhcCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgZXhpc3RzCiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1OAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDMwIC8vICJyYXRlX3Jlc2V0X2NhcCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X2NhcCBleGlzdHMKICAgIGZyYW1lX2RpZyA2CiAgICA8CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1OAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzM3CiAgICAvLyByYXRlID0gc2VsZi5yYXRlX3Jlc2V0X2NhcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDMwIC8vICJyYXRlX3Jlc2V0X2NhcCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDYKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfY2FwIGV4aXN0cwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTg6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2NTkKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gc2VsZi5fY2xhbXBfcmF0ZSgKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjY1OS02NjEKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gc2VsZi5fY2xhbXBfcmF0ZSgKICAgIC8vICAgICBvYnNlcnZlZF9yYXRlICsgc2VsZi5yYXRlX3Jlc2V0X3NwcmVhZAogICAgLy8gKQogICAgZnJhbWVfZGlnIDYKICAgIGFwcF9nbG9iYWxfcHV0CgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAxODoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjY3MQogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1BJKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCA0CiAgICA9PQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAyMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjcyCiAgICAvLyBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9IGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjY3MwogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMjM6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2NzgKICAgIC8vIGlmIHNlbGYuX2lzX2R5bmFtaWNfYW5udWl0eSgpOgogICAgY2FsbHN1YiBfaXNfZHluYW1pY19hbm51aXR5CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDI5CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2NzkKICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QUkYpOgogICAgZnJhbWVfZGlnIDEwCiAgICBwdXNoaW50IDUKICAgID09CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAzMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDkwCiAgICAvLyBkaXNjb3VudF9mYWN0b3IgPSBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQ5MQogICAgLy8gZGVub21pbmF0b3IgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQ5MgogICAgLy8gc2tpcF9maXJzdF9yZWRlbXB0aW9uID0gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDcKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQ5NAogICAgLy8gaWYgZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAyNQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgZnJhbWVfYnVyeSA4CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAzNQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDk1LTQ5OQogICAgLy8gIyBBbiBpbml0aWFsIFBSRiBtYXkgZGVzY3JpYmUgdGhlIGZpcnN0IHJlZGVtcHRpb24gcGVyaW9kIGRpcmVjdGx5LgogICAgLy8gZGlzY291bnRfZmFjdG9yID0gc2VsZi5fZGlzY291bnRfYW5udWl0eV9mYWN0b3IoCiAgICAvLyAgICAgZGlzY291bnRfZmFjdG9yLAogICAgLy8gICAgIGVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDgKICAgIGNhbGxzdWIgX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTAxCiAgICAvLyBza2lwX2ZpcnN0X3JlZGVtcHRpb24gPSBUcnVlCiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfYnVyeSA3CiAgICBmcmFtZV9idXJ5IDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDM1OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTAzCiAgICAvLyBmdXR1cmVfZXZlbnRfaWQgPSBzZWxmLmV2ZW50X2N1cnNvciArIFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfd2hpbGVfdG9wQDM2OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTA0CiAgICAvLyB3aGlsZSBmdXR1cmVfZXZlbnRfaWQgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgZnJhbWVfZGlnIDMKICAgID4KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl93aGlsZUA0OAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTA1CiAgICAvLyBmdXR1cmVfZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoZnV0dXJlX2V2ZW50X2lkKQogICAgZnJhbWVfZGlnIDMKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjUwNgogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPSBmdXR1cmVfZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1MDctNTA4CiAgICAvLyAjIE9ubHkgcmVkZW1wdGlvbi1iZWFyaW5nIGV2ZW50cyBjb250cmlidXRlIHRvIHRoZSBhbm51aXR5IGRlbm9taW5hdG9yLgogICAgLy8gaXNfcmVkZW1wdGlvbl9ldmVudCA9IGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpIG9yICgKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjUwNy01MTEKICAgIC8vICMgT25seSByZWRlbXB0aW9uLWJlYXJpbmcgZXZlbnRzIGNvbnRyaWJ1dGUgdG8gdGhlIGFubnVpdHkgZGVub21pbmF0b3IuCiAgICAvLyBpc19yZWRlbXB0aW9uX2V2ZW50ID0gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QUikgb3IgKAogICAgLy8gICAgIGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfTUQpCiAgICAvLyAgICAgYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICAvLyApCiAgICBibnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfdHJ1ZUA0MAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTA5CiAgICAvLyBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgZnJhbWVfZGlnIDQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1MDktNTEwCiAgICAvLyBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgLy8gYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF9mYWxzZUA0MQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTEwCiAgICAvLyBhbmQgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IgPiBVSW50NjQoMCkKICAgIGZyYW1lX2RpZyAwCiAgICBwdXNoaW50IDI1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTA5LTUxMAogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCkKICAgIC8vIGFuZCBmdXR1cmVfZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX3RydWVANDA6CiAgICBpbnRjXzEgLy8gMQoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfbWVyZ2VANDI6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1MTIKICAgIC8vIGlmIGlzX3JlZGVtcHRpb25fZXZlbnQ6CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA0NwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTEzCiAgICAvLyBpZiBza2lwX2ZpcnN0X3JlZGVtcHRpb246CiAgICBmcmFtZV9kaWcgNwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUA0NQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTE0CiAgICAvLyBza2lwX2ZpcnN0X3JlZGVtcHRpb24gPSBGYWxzZQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgNwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANDc6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1MjEKICAgIC8vIGZ1dHVyZV9ldmVudF9pZCArPSBVSW50NjQoMSkKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV93aGlsZV90b3BAMzYKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlANDU6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1MTgKICAgIC8vIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZnJhbWVfZGlnIDAKICAgIHB1c2hpbnQgMjUKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1MTYtNTE5CiAgICAvLyBkaXNjb3VudF9mYWN0b3IgPSBzZWxmLl9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcigKICAgIC8vICAgICBkaXNjb3VudF9mYWN0b3IsCiAgICAvLyAgICAgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMgogICAgc3dhcAogICAgY2FsbHN1YiBfZGlzY291bnRfYW5udWl0eV9mYWN0b3IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1MjAKICAgIC8vIGRlbm9taW5hdG9yICs9IGRpc2NvdW50X2ZhY3RvcgogICAgZnJhbWVfZGlnIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA0NwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDE6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF9tZXJnZUA0MgoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX3doaWxlQDQ4OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTIzCiAgICAvLyBhc3NlcnQgZGVub21pbmF0b3IgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZnJhbWVfZGlnIDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjUyNAogICAgLy8gbnVtZXJhdG9yID0gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTI1CiAgICAvLyBpZiBlbnRyeS5mbGFncyAmIFVJbnQ2NChlbnVtcy5GTEFHX0lOSVRJQUxfUFJGKSA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNTcKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gOAogICAgJgogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDUwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1MjYtNTI3CiAgICAvLyAjIFN1YnNlcXVlbnQgUFJGIGV2ZW50cyBhbW9ydGl6ZSBib3RoIHByaW5jaXBhbCBhbmQgYWxyZWFkeSBhY2NydWVkIGNhcnJ5LgogICAgLy8gbnVtZXJhdG9yICs9IHNlbGYuYWNjcnVlZF9pbnRlcmVzdAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgICsKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDUwOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTMwCiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTI4LTUzMgogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIG51bWVyYXRvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gICAgIGRlbm9taW5hdG9yLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDEKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2ODAKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IHNlbGYuX3JlY2FsY3VsYXRlX2FubnVpdHlfcGF5bWVudCgKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjgwLTY4MgogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gc2VsZi5fcmVjYWxjdWxhdGVfYW5udWl0eV9wYXltZW50KAogICAgLy8gICAgIGVudHJ5CiAgICAvLyApCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMzA6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2ODUKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjY4Ni02OTAKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1VSW50NjQoMCksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2ODgKICAgIC8vIHBheW9mZj1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Njg5CiAgICAvLyBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICBkdXAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjY4Ni02OTAKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1VSW50NjQoMCksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgY2FsbHN1YiBfZW1pdF9leGVjdXRpb25fZXZlbnQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDI5OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Njg0CiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDMwCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDIwOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Njc0CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9JUENCKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCAxOAogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDIzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2NzUtNjc2CiAgICAvLyAjIElQQ0Iga2VlcHMgcHJpbmNpcGFsIHVuY2hhbmdlZCBhbmQgb25seSByZXNldHMgdGhlIGludGVyZXN0IGJhc2UuCiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIGIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMjMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMTA6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2NjIKICAgIC8vIGVsaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1JSRik6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgMTEKICAgID09CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDE0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2NjMKICAgIC8vIG5leHRfcmF0ZSA9IGVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjY0CiAgICAvLyBpZiBuZXh0X3JhdGUgPT0gVUludDY0KDApOgogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDEzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2NjUKICAgIC8vIG5leHRfcmF0ZSA9IHNlbGYucmF0ZV9yZXNldF9uZXh0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzcgLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDUKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfbmV4dCBleGlzdHMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjY2CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IG5leHRfcmF0ZQogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgZnJhbWVfZGlnIDUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDE0OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjY4CiAgICAvLyBpZiBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSAhPSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgOQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMTgKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjY2OQogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPSBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZQogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgZnJhbWVfZGlnIDkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CgoKLy8gbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KGVudHJ5OiBieXRlcywgcGF5b2ZmOiB1aW50NjQsIHNldHRsZWRfYW1vdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpfZW1pdF9leGVjdXRpb25fZXZlbnQ6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2OTYtNzAyCiAgICAvLyBkZWYgX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgKiwKICAgIC8vICAgICBlbnRyeTogdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnksCiAgICAvLyAgICAgcGF5b2ZmOiBVSW50NjQsCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ6IFVJbnQ2NCwKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDMgMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzA2CiAgICAvLyBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25JRAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzA3CiAgICAvLyBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIGZyYW1lX2RpZyAtMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3MDgKICAgIC8vIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIGZyYW1lX2RpZyAtMwogICAgZXh0cmFjdCA4IDEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjcwOQogICAgLy8gc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICBmcmFtZV9kaWcgLTMKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3MTAKICAgIC8vIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3MTMKICAgIC8vIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIGZyYW1lX2RpZyAtMwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzA4CiAgICAvLyBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICBpbnRjXzIgLy8gOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzEzCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBnZXRieXRlCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3NDIKICAgIC8vIGlmIHBheW9mZiA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJueiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3NDMKICAgIC8vIHJldHVybiBVSW50NjQoZW51bXMuUEFZT0ZGX1NJR05fUE9TSVRJVkUpCiAgICBpbnRjXzEgLy8gMQoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX3BheW9mZl9zaWduQDc6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3MTItNzE0CiAgICAvLyBwYXlvZmZfc2lnbj1hcmM0LlVJbnQ4KAogICAgLy8gICAgIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIC8vICksCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgaW50Y18yIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3MTYKICAgIC8vIGN1cnJlbmN5X2lkPXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzE3CiAgICAvLyBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3MDUtNzE4CiAgICAvLyBFeGVjdXRpb25FdmVudCgKICAgIC8vICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIC8vICAgICBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYXBwbGllZF9hdD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICBwYXlvZmY9cGF5b2ZmLAogICAgLy8gICAgIHBheW9mZl9zaWduPWFyYzQuVUludDgoCiAgICAvLyAgICAgICAgIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIC8vICAgICApLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PXNldHRsZWRfYW1vdW50LAogICAgLy8gICAgIGN1cnJlbmN5X2lkPXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAwCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzA0LTcxOQogICAgLy8gYXJjNC5lbWl0KAogICAgLy8gICAgIEV4ZWN1dGlvbkV2ZW50KAogICAgLy8gICAgICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgICAgIHBheW9mZj1wYXlvZmYsCiAgICAvLyAgICAgICAgIHBheW9mZl9zaWduPWFyYzQuVUludDgoCiAgICAvLyAgICAgICAgICAgICBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICAvLyAgICAgICAgICksCiAgICAvLyAgICAgICAgIHNldHRsZWRfYW1vdW50PXNldHRsZWRfYW1vdW50LAogICAgLy8gICAgICAgICBjdXJyZW5jeV9pZD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgICAgIHNlcXVlbmNlPWVudHJ5LmV2ZW50X2lkICsgVUludDY0KDEpLAogICAgLy8gICAgICkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDlhMzMyYjk1IC8vIG1ldGhvZCAiRXhlY3V0aW9uRXZlbnQodWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojc0NAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiAoVUludDY0KGVudW1zLkVWVF9JRUQpLCBVSW50NjQoZW51bXMuRVZUX1BJKSk6CiAgICBmcmFtZV9kaWcgNQogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBibnogX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2lmX2JvZHlANQogICAgZnJhbWVfZGlnIDUKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGJ6IF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pZl9lbHNlQDYKCl9lbWl0X2V4ZWN1dGlvbl9ldmVudF9pZl9ib2R5QDU6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3NDUKICAgIC8vIHJldHVybiBVSW50NjQoZW51bXMuUEFZT0ZGX1NJR05fUE9TSVRJVkUpCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzEzCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBiIF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pbmxpbmVkX21vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9wYXlvZmZfc2lnbkA3CgpfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzQ2CiAgICAvLyByZXR1cm4gVUludDY0KGVudW1zLlBBWU9GRl9TSUdOX05FR0FUSVZFKQogICAgcHVzaGludCAyNTUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjcxMwogICAgLy8gc2VsZi5fcGF5b2ZmX3NpZ24oZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSwgcGF5b2ZmKQogICAgYiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fcGF5b2ZmX3NpZ25ANwoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9yb2xlX2lzX2FjdGl2ZShyb2xlX21hcDogYnl0ZXMsIHJvbGVfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NDoKX3JvbGVfaXNfYWN0aXZlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU3CiAgICAvLyBkZWYgX3JvbGVfaXNfYWN0aXZlKHNlbGYsIHJvbGVfbWFwOiB0eXAuUmJhY1JvbGUsIHJvbGVfYWRkcmVzczogQWNjb3VudCkgLT4gYm9vbDoKICAgIHByb3RvIDIgMQogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5CiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5LTYwCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5LTYxCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjEKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAtNjEKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgPj0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX21lcmdlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKSAtPiB2b2lkOgpfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2NQogICAgLy8gYXNzZXJ0IHNlbGYuX2lzX2FycmFuZ2VyKFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTIKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgPT0gc2VsZi5hcnJhbmdlci52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE4IC8vIDB4NTIyMzQxNzI3MjYxNmU2NzY1NzIyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgPT0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2NQogICAgLy8gYXNzZXJ0IHNlbGYuX2lzX2FycmFuZ2VyKFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpIC0+IHZvaWQ6Cl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4MwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFzc2V0X2RlZmF1bHRlZCwgZXJyLkRFRkFVTFRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQxIC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfZGVmYXVsdGVkIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIERlZmF1bHRlZAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkgLT4gdm9pZDoKX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg2CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYXNzZXRfc3VzcGVuZGVkLCBlcnIuU1VTUEVOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzMgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9zdXNwZW5kZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gU3VzcGVuZGVkIG9wZXJhdGlvbnMKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkOiB1aW50NjQpIC0+IHZvaWQ6Cl9hc3NlcnRfdmFsaWRfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OAogICAgLy8gZGVmIF9hc3NlcnRfdmFsaWRfcm9sZShzZWxmLCByb2xlX2lkOiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTAKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIHB1c2hpbnQgMjAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkxCiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgcHVzaGludCAyNQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTIKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICBwdXNoaW50IDQwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MwogICAgLy8gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgcHVzaGludCA1MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTQKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgcHVzaGludCA2MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTUKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICBwdXNoaW50IDcwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NgogICAgLy8gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgcHVzaGludCA4MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfZmFsc2VAOAoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3OgogICAgaW50Y18xIC8vIDEKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX21lcmdlQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgcmV0c3ViCgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9mYWxzZUA4OgogICAgaW50Y18wIC8vIDAKICAgIGIgX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfbWVyZ2VAOQo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="}, "sourceInfo": {"approval": {"pcOffsetMethod": "none", "sourceInfo": [{"pc": [2601], "errorMessage": "ACTUS event not yet executed"}, {"pc": [2358], "errorMessage": "Can not distribute zero units"}, {"pc": [3102, 3109, 3481], "errorMessage": "D-ASA already configured"}, {"pc": [1238, 1939, 2318, 2464, 3733, 3880, 4226, 4372], "errorMessage": "D-ASA not configured"}, {"pc": [3492], "errorMessage": "D-ASA terms not configured"}, {"pc": [6541], "errorMessage": "Defaulted"}, {"pc": [3120], "errorMessage": "Denomination asset is not properly set"}, {"pc": [3135], "errorMessage": "Different settlement asset not supported, must be equal to denomination asset"}, {"pc": [3370, 3377, 3379], "errorMessage": "IED must be set in the future"}, {"pc": [1256, 2008, 2479, 5914], "errorMessage": "IED not yet executed"}, {"pc": [2371, 5297], "errorMessage": "Insufficient remaining D-ASA units"}, {"pc": [2574, 2641], "errorMessage": "Insufficient sender units to transfer"}, {"pc": [1835, 3022, 3040, 3096, 3603, 3641, 5482, 5760, 5820, 6203], "errorMessage": "Invalid ACTUS configuration"}, {"pc": [1948, 2352, 2535, 2550, 2708, 2781, 2844, 2886, 5109, 5234], "errorMessage": "Invalid account holding address"}, {"pc": [4564, 4588, 4612, 4636, 4660, 4717, 4745, 4767, 4789, 4811, 4990, 5008, 5023, 5038, 5053], "errorMessage": "Invalid account role address"}, {"pc": [3082], "errorMessage": "Invalid day-count convention ID"}, {"pc": [1347, 3755, 4089, 5792], "errorMessage": "Invalid event cursor"}, {"pc": [3588, 3654, 3933, 5398], "errorMessage": "Invalid event id"}, {"pc": [3768, 4153, 4160], "errorMessage": "Invalid event type"}, {"pc": [4701, 4980, 6611], "errorMessage": "Invalid role identifier"}, {"pc": [3486, 3666, 3674, 3989, 5413, 5429], "errorMessage": "Invalid schedule page"}, {"pc": [5345], "errorMessage": "No D-ASA units"}, {"pc": [1353, 1864, 2045, 5801], "errorMessage": "No due cashflow to pay"}, {"pc": [5883], "errorMessage": "Not IED event"}, {"pc": [1993, 2326, 2522, 2698, 2754, 2764, 2850, 4188, 4834, 6533], "errorMessage": "Not authorized"}, {"pc": [1474, 1482, 2094, 2168, 2177], "errorMessage": "Not enough funds for the payment"}, {"pc": [3905, 3918], "errorMessage": "Observed event required to execute this action"}, {"pc": [2340, 2388], "errorMessage": "Primary distribution is closed"}, {"pc": [5832], "errorMessage": "Primary distribution is not complete"}, {"pc": [2563], "errorMessage": "Sender and receiver must be different"}, {"pc": [5095, 6549], "errorMessage": "Suspended operations"}, {"pc": [2275, 3631], "errorMessage": "Time events must be sorted in strictly ascending order"}, {"pc": [2496, 2513], "errorMessage": "Transfer is closed"}, {"pc": [2567], "errorMessage": "Transfer units must be greater than zero"}, {"pc": [988], "errorMessage": "Wrong Global Bytes allocation"}, {"pc": [994], "errorMessage": "Wrong Global UInts allocation"}, {"pc": [998], "errorMessage": "Wrong Local Bytes allocation"}, {"pc": [1002], "errorMessage": "Wrong Local UInts allocation"}, {"pc": [1455, 2087], "errorMessage": "account opted into asset"}, {"pc": [6493, 6508], "errorMessage": "check BoxMap entry exists"}, {"pc": [1984, 2022, 2063, 2101, 2392, 2570, 2630, 2656, 5089, 5255], "errorMessage": "check self.account entry exists"}, {"pc": [1536, 1762, 1847, 4283, 5919, 6222], "errorMessage": "check self.accrued_interest exists"}, {"pc": [4852, 6531], "errorMessage": "check self.arranger exists"}, {"pc": [6539], "errorMessage": "check self.asset_defaulted exists"}, {"pc": [6547], "errorMessage": "check self.asset_suspended exists"}, {"pc": [3030, 3475, 3901, 3913, 4231, 5644], "errorMessage": "check self.contract_type exists"}, {"pc": [1504, 4288, 5117, 5195], "errorMessage": "check self.cumulative_interest_index exists"}, {"pc": [1516, 4293, 5128, 5203], "errorMessage": "check self.cumulative_principal_index exists"}, {"pc": [5654], "errorMessage": "check self.dynamic_principal_redemption exists"}, {"pc": [1271, 1284, 1345, 1586, 2578, 2591, 3746, 4082, 4259, 4376, 4389, 4426, 5210, 5790, 5871, 6103, 6241], "errorMessage": "check self.event_cursor exists"}, {"pc": [5143, 5157, 5350, 5379, 5710, 5718, 5745, 5765, 5954, 6067, 6228], "errorMessage": "check self.fixed_point_scale exists"}, {"pc": [5997], "errorMessage": "check self.has_rate_reset_cap exists"}, {"pc": [5970], "errorMessage": "check self.has_rate_reset_floor exists"}, {"pc": [3107, 3491, 4255, 5888], "errorMessage": "check self.initial_exchange_amount exists"}, {"pc": [2376, 2386], "errorMessage": "check self.initial_exchange_date exists"}, {"pc": [1707, 4273, 5686, 5700], "errorMessage": "check self.interest_calculation_base exists"}, {"pc": [1778, 1793], "errorMessage": "check self.next_principal_redemption exists"}, {"pc": [4278, 5678, 5705, 5750], "errorMessage": "check self.nominal_interest_rate exists"}, {"pc": [1953, 1966], "errorMessage": "check self.op_daemon exists"}, {"pc": [1607, 1674, 1699, 1752, 1803, 1811, 1832, 4268, 6207, 6287], "errorMessage": "check self.outstanding_principal exists"}, {"pc": [6005, 6019], "errorMessage": "check self.rate_reset_cap exists"}, {"pc": [5978, 5992], "errorMessage": "check self.rate_reset_floor exists"}, {"pc": [5949], "errorMessage": "check self.rate_reset_multiplier exists"}, {"pc": [6321], "errorMessage": "check self.rate_reset_next exists"}, {"pc": [5962], "errorMessage": "check self.rate_reset_spread exists"}, {"pc": [1460, 2163, 4298], "errorMessage": "check self.reserved_interest exists"}, {"pc": [1465, 1494, 2173, 2188, 4303], "errorMessage": "check self.reserved_principal exists"}, {"pc": [2363, 2411, 4250, 5292, 5825], "errorMessage": "check self.reserved_units_total exists"}, {"pc": [1276, 2583, 3751, 3931, 3949, 4072, 4264, 4381, 5394, 6112], "errorMessage": "check self.schedule_entry_count exists"}, {"pc": [3979], "errorMessage": "check self.schedule_page entry exists"}, {"pc": [1452, 2053, 2081, 6393], "errorMessage": "check self.settlement_asset_id exists"}, {"pc": [1237, 1251, 1938, 2003, 2317, 2336, 2463, 2474, 2758, 3100, 3479, 3732, 3879, 4224, 4371, 5238, 5816, 5909], "errorMessage": "check self.status exists"}, {"pc": [2369, 2422, 4245, 5343, 5374, 5830], "errorMessage": "check self.total_units exists"}, {"pc": [2501, 2511], "errorMessage": "check self.transfer_closure_date exists"}, {"pc": [2484, 2492], "errorMessage": "check self.transfer_opening_date exists"}, {"pc": [3565, 3624], "errorMessage": "index access is out of bounds"}, {"pc": [1922, 2967, 3449, 3984], "errorMessage": "invalid array length header"}, {"pc": [2688, 3437, 4824], "errorMessage": "invalid number of bytes for arc4.bool"}, {"pc": [1930], "errorMessage": "invalid number of bytes for arc4.dynamic_array"}, {"pc": [3464], "errorMessage": "invalid number of bytes for arc4.dynamic_array"}, {"pc": [1916, 2301, 2441, 2449, 2680, 2738, 2746, 2826, 2834, 2877, 2902, 4445, 4469, 4503, 4684, 4866, 4950], "errorMessage": "invalid number of bytes for arc4.static_array"}, {"pc": [1232, 2259, 2268, 2309, 2458, 3427, 3864], "errorMessage": "invalid number of bytes for arc4.uint64"}, {"pc": [4493, 4674, 4940], "errorMessage": "invalid number of bytes for arc4.uint8"}, {"pc": [2939], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.InitialKernelState"}, {"pc": [2928], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.NormalizedActusTerms"}, {"pc": [3875], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.ObservedEventRequest"}, {"pc": [2972], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.Prospectus"}, {"pc": [4514], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.RoleValidity"}, {"pc": [2956], "errorMessage": "invalid tail pointer at index 1 of (uint8[32],(len+utf8[]))"}, {"pc": [2951], "errorMessage": "invalid tuple encoding"}, {"pc": [4051], "errorMessage": "max array length exceeded"}, {"pc": [4237, 6385], "errorMessage": "overflow"}]}, "clear": {"pcOffsetMethod": "none", "sourceInfo": []}}, "templateVariables": {}}""" +_APP_SPEC_JSON = r"""{"arcs": [22, 28], "bareActions": {"call": [], "create": []}, "methods": [{"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "name": "max_event_count"}], "name": "fund_due_cashflows", "returns": {"type": "(uint64,uint64,uint64,uint64,uint64)", "struct": "CashFundingResult"}, "desc": "Reserve due ACTUS cash events into the escrow-style claim ledger.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "name": "holding_address"}, {"type": "byte[]", "name": "payment_info"}], "name": "claim_due_cashflows", "returns": {"type": "(uint64,uint64,uint64,uint64,byte[])", "struct": "CashClaimResult"}, "desc": "Withdraw the holder's already funded ACTUS cash entitlements.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "name": "open_date"}, {"type": "uint64", "name": "closure_date"}], "name": "set_transfer_schedule", "returns": {"type": "uint64"}, "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "name": "holding_address"}, {"type": "uint64", "name": "units"}], "name": "primary_distribution", "returns": {"type": "uint64"}, "desc": "Reserve units for a holder before IED finalizes issuance.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "name": "sender_holding_address"}, {"type": "address", "name": "receiver_holding_address"}, {"type": "uint64", "name": "units"}], "name": "transfer", "returns": {"type": "uint64"}, "desc": "Transfer active units after settling both counterparties to the current cursor.\nReturns the number of units moved. The ACTUS kernel no longer persists a nominal per-unit value on-chain, so transfer results are unit-based.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "bool", "desc": "Suspension status", "name": "suspended"}], "name": "account_gov_suspension", "returns": {"type": "uint64", "desc": "Timestamp of the set account suspension status"}, "desc": "Set account suspension status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "address", "desc": "Account Payment Address", "name": "payment_address"}], "name": "account_open", "returns": {"type": "uint64", "desc": "Timestamp of the account opening"}, "desc": "Open a contract account with a new position and register its payment address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "address", "desc": "Account Payment Address", "name": "payment_address"}], "name": "account_update_payment_address", "returns": {"type": "uint64", "desc": "Timestamp of the account update"}, "desc": "Update the Payment Address of an account", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}], "name": "account_get_position", "returns": {"type": "(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64)", "desc": "Account position", "struct": "AccountPosition"}, "desc": "Get account position", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": [], "create": ["NoOp"]}, "args": [{"type": "address", "desc": "D-ASA Arranger Address", "name": "arranger"}], "name": "contract_create", "returns": {"type": "uint64", "desc": "UNIX timestamp of contract creation"}, "desc": "Create a new D-ASA contract and set the Arranger role", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64)", "desc": "Normalized ACTUS terms", "name": "terms", "struct": "NormalizedActusTerms"}, {"type": "(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "desc": "Initial kernel state (pre-IED)", "name": "initial_state", "struct": "InitialKernelState"}, {"type": "(byte[32],string)", "desc": "Prospectus (informational only)", "name": "prospectus", "struct": "Prospectus"}], "name": "contract_config", "returns": {"type": "uint64", "desc": "UNIX timestamp of contract configuration"}, "desc": "Partial contract configuration with: normalized ACTUS terms, initial kernel\nstate (pre-IED), prospectus (informational only). The contract stays inactive until all schedule pages are configured next.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "name": "schedule_page_index"}, {"type": "bool", "name": "is_last_page"}, {"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[]", "name": "schedule_page"}], "name": "contract_schedule", "returns": {"type": "uint64"}, "desc": "Upload one normalized schedule page.\nThe configuration operation is considered complete only when the last page is stored. At that point `schedule_entry_count` is finalized and the contract moves to `STATUS_PENDING_IED`.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "execute_ied", "returns": {"type": "uint64"}, "desc": "Execute the first due `IED` entry and activate the contract.\n`IED` is the one non-cash event that moves the app from `STATUS_PENDING_IED` to `STATUS_ACTIVE`.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "name": "event_id"}, {"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "name": "payload", "struct": "ObservedEventRequest"}], "name": "apply_non_cash_event", "returns": {"type": "uint64"}, "desc": "Apply the next due non-cash event, optionally appending one first.\nObserved payloads are appended before execution when flagged. Rate reset events require the interest oracle because they can change the running nominal rate; other non-cash events stay arranger-controlled.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_contract_state", "returns": {"type": "(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "struct": "KernelState"}, "desc": "Return a readonly snapshot of the generic ACTUS kernel state.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_next_due_event", "returns": {"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "struct": "ExecutionScheduleEntry"}, "desc": "Return the next boxed schedule entry, or a zeroed sentinel if ended.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["UpdateApplication"], "create": []}, "args": [], "name": "contract_update", "returns": {"type": "void"}, "desc": "Update D-ASA application.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "New Arranger address", "name": "new_arranger"}], "name": "rbac_rotate_arranger", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Rotate the Arranger address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Operation Daemon address", "name": "address"}], "name": "rbac_set_op_daemon", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Non-Normative: Set the Operation Daemon address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}, {"type": "(uint64,uint64)", "desc": "Role time validity", "name": "validity", "struct": "RoleValidity"}], "name": "rbac_assign_role", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Assign a role to an address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}], "name": "rbac_revoke_role", "returns": {"type": "uint64", "desc": "Timestamp of the role revocation"}, "desc": "Revoke a role from an address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Suspension status", "name": "suspended"}], "name": "rbac_gov_asset_suspension", "returns": {"type": "uint64", "desc": "Timestamp of the set asset suspension status"}, "desc": "Set asset suspension status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "rbac_get_arranger", "returns": {"type": "address", "desc": "Arranger address"}, "desc": "Get Arranger address", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Address to get roles for", "name": "address"}], "name": "rbac_get_address_roles", "returns": {"type": "(bool,bool,bool,bool,bool)", "desc": "Roles mask: (Account Manager, Primary Dealer, Trustee, Authority, Observer)"}, "desc": "Non-normative - Get roles assigned to an address", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}], "name": "rbac_get_role_validity", "returns": {"type": "(uint64,uint64)", "desc": "Role validity", "struct": "RoleValidity"}, "desc": "Get role validity", "events": [], "readonly": true, "recommendations": {}}], "name": "DASA", "state": {"keys": {"box": {}, "global": {"arranger": {"key": "UiNBcnJhbmdlciM=", "keyType": "AVMBytes", "valueType": "address"}, "op_daemon": {"key": "UiNPcERhZW1vbiM=", "keyType": "AVMBytes", "valueType": "address"}, "asset_suspended": {"key": "YXNzZXRfc3VzcGVuZGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "asset_defaulted": {"key": "YXNzZXRfZGVmYXVsdGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "status": {"key": "c3RhdHVz", "keyType": "AVMString", "valueType": "AVMUint64"}, "contract_type": {"key": "Y29udHJhY3RfdHlwZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "prospectus_hash": {"key": "cHJvc3BlY3R1c19oYXNo", "keyType": "AVMString", "valueType": "AVMBytes"}, "prospectus_url": {"key": "cHJvc3BlY3R1c191cmw=", "keyType": "AVMString", "valueType": "AVMString"}, "denomination_asset_id": {"key": "ZGVub21pbmF0aW9uX2Fzc2V0X2lk", "keyType": "AVMString", "valueType": "AVMUint64"}, "settlement_asset_id": {"key": "c2V0dGxlbWVudF9hc3NldF9pZA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "initial_exchange_date": {"key": "aW5pdGlhbF9leGNoYW5nZV9kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "maturity_date": {"key": "bWF0dXJpdHlfZGF0ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "transfer_opening_date": {"key": "dHJhbnNmZXJfb3BlbmluZ19kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "transfer_closure_date": {"key": "dHJhbnNmZXJfY2xvc3VyZV9kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "day_count_convention": {"key": "ZGF5X2NvdW50X2NvbnZlbnRpb24=", "keyType": "AVMString", "valueType": "AVMUint64"}, "total_units": {"key": "dG90YWxfdW5pdHM=", "keyType": "AVMString", "valueType": "AVMUint64"}, "reserved_units_total": {"key": "cmVzZXJ2ZWRfdW5pdHNfdG90YWw=", "keyType": "AVMString", "valueType": "AVMUint64"}, "initial_exchange_amount": {"key": "aW5pdGlhbF9leGNoYW5nZV9hbW91bnQ=", "keyType": "AVMString", "valueType": "AVMUint64"}, "outstanding_principal": {"key": "b3V0c3RhbmRpbmdfcHJpbmNpcGFs", "keyType": "AVMString", "valueType": "AVMUint64"}, "next_principal_redemption": {"key": "bmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbg==", "keyType": "AVMString", "valueType": "AVMUint64"}, "dynamic_principal_redemption": {"key": "ZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbg==", "keyType": "AVMString", "valueType": "AVMUint64"}, "interest_calculation_base": {"key": "aW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "accrued_interest": {"key": "YWNjcnVlZF9pbnRlcmVzdA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "nominal_interest_rate": {"key": "bm9taW5hbF9pbnRlcmVzdF9yYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_spread": {"key": "cmF0ZV9yZXNldF9zcHJlYWQ=", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_multiplier": {"key": "cmF0ZV9yZXNldF9tdWx0aXBsaWVy", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_floor": {"key": "cmF0ZV9yZXNldF9mbG9vcg==", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_cap": {"key": "cmF0ZV9yZXNldF9jYXA=", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_next": {"key": "cmF0ZV9yZXNldF9uZXh0", "keyType": "AVMString", "valueType": "AVMUint64"}, "has_rate_reset_floor": {"key": "aGFzX3JhdGVfcmVzZXRfZmxvb3I=", "keyType": "AVMString", "valueType": "AVMUint64"}, "has_rate_reset_cap": {"key": "aGFzX3JhdGVfcmVzZXRfY2Fw", "keyType": "AVMString", "valueType": "AVMUint64"}, "reserved_principal": {"key": "cmVzZXJ2ZWRfcHJpbmNpcGFs", "keyType": "AVMString", "valueType": "AVMUint64"}, "reserved_interest": {"key": "cmVzZXJ2ZWRfaW50ZXJlc3Q=", "keyType": "AVMString", "valueType": "AVMUint64"}, "cumulative_interest_index": {"key": "Y3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "cumulative_principal_index": {"key": "Y3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXg=", "keyType": "AVMString", "valueType": "AVMUint64"}, "event_cursor": {"key": "ZXZlbnRfY3Vyc29y", "keyType": "AVMString", "valueType": "AVMUint64"}, "schedule_entry_count": {"key": "c2NoZWR1bGVfZW50cnlfY291bnQ=", "keyType": "AVMString", "valueType": "AVMUint64"}, "fixed_point_scale": {"key": "Zml4ZWRfcG9pbnRfc2NhbGU=", "keyType": "AVMString", "valueType": "AVMUint64"}}, "local": {}}, "maps": {"box": {"account_manager": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNBY2NvdW50TWFuYWdlciM="}, "primary_dealer": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNQcmltYXJ5RGVhbGVyIw=="}, "trustee": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNUcnVzdGVlIw=="}, "authority": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNBdXRob3JpdHkj"}, "observer": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNPYnNlcnZlciM="}, "schedule_page": {"keyType": "uint64", "valueType": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[]", "prefix": "UyM="}, "account": {"keyType": "address", "valueType": "AccountPosition", "prefix": "UiNBY2NvdW50Iw=="}}, "global": {}, "local": {}}, "schema": {"global": {"bytes": 4, "ints": 37}, "local": {"bytes": 0, "ints": 0}}}, "structs": {"AccountPosition": [{"name": "payment_address", "type": "address"}, {"name": "units", "type": "uint64"}, {"name": "reserved_units", "type": "uint64"}, {"name": "suspended", "type": "bool"}, {"name": "settled_cursor", "type": "uint64"}, {"name": "interest_checkpoint", "type": "uint64"}, {"name": "principal_checkpoint", "type": "uint64"}, {"name": "claimable_interest", "type": "uint64"}, {"name": "claimable_principal", "type": "uint64"}], "CashClaimResult": [{"name": "interest_amount", "type": "uint64"}, {"name": "principal_amount", "type": "uint64"}, {"name": "total_amount", "type": "uint64"}, {"name": "timestamp", "type": "uint64"}, {"name": "context", "type": "byte[]"}], "CashFundingResult": [{"name": "funded_interest", "type": "uint64"}, {"name": "funded_principal", "type": "uint64"}, {"name": "total_funded", "type": "uint64"}, {"name": "processed_events", "type": "uint64"}, {"name": "timestamp", "type": "uint64"}], "ExecutionScheduleEntry": [{"name": "event_id", "type": "uint64"}, {"name": "event_type", "type": "uint8"}, {"name": "scheduled_time", "type": "uint64"}, {"name": "accrual_factor", "type": "uint64"}, {"name": "redemption_accrual_factor", "type": "uint64"}, {"name": "next_nominal_interest_rate", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "next_outstanding_principal", "type": "uint64"}, {"name": "flags", "type": "uint64"}], "InitialKernelState": [{"name": "status_date", "type": "uint64"}, {"name": "event_cursor", "type": "uint64"}, {"name": "outstanding_principal", "type": "uint64"}, {"name": "interest_calculation_base", "type": "uint64"}, {"name": "nominal_interest_rate", "type": "uint64"}, {"name": "accrued_interest", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "cumulative_interest_index", "type": "uint64"}, {"name": "cumulative_principal_index", "type": "uint64"}], "KernelState": [{"name": "contract_type", "type": "uint8"}, {"name": "status", "type": "uint64"}, {"name": "total_units", "type": "uint64"}, {"name": "reserved_units_total", "type": "uint64"}, {"name": "initial_exchange_amount", "type": "uint64"}, {"name": "event_cursor", "type": "uint64"}, {"name": "schedule_entry_count", "type": "uint64"}, {"name": "outstanding_principal", "type": "uint64"}, {"name": "interest_calculation_base", "type": "uint64"}, {"name": "nominal_interest_rate", "type": "uint64"}, {"name": "accrued_interest", "type": "uint64"}, {"name": "cumulative_interest_index", "type": "uint64"}, {"name": "cumulative_principal_index", "type": "uint64"}, {"name": "reserved_interest", "type": "uint64"}, {"name": "reserved_principal", "type": "uint64"}], "NormalizedActusTerms": [{"name": "contract_type", "type": "uint8"}, {"name": "denomination_asset_id", "type": "uint64"}, {"name": "settlement_asset_id", "type": "uint64"}, {"name": "total_units", "type": "uint64"}, {"name": "notional_principal", "type": "uint64"}, {"name": "initial_exchange_amount", "type": "uint64"}, {"name": "initial_exchange_date", "type": "uint64"}, {"name": "maturity_date", "type": "uint64"}, {"name": "day_count_convention", "type": "uint8"}, {"name": "rate_reset_spread", "type": "uint64"}, {"name": "rate_reset_multiplier", "type": "uint64"}, {"name": "rate_reset_floor", "type": "uint64"}, {"name": "rate_reset_cap", "type": "uint64"}, {"name": "rate_reset_next", "type": "uint64"}, {"name": "has_rate_reset_floor", "type": "bool"}, {"name": "has_rate_reset_cap", "type": "bool"}, {"name": "dynamic_principal_redemption", "type": "bool"}, {"name": "fixed_point_scale", "type": "uint64"}], "ObservedEventRequest": [{"name": "event_id", "type": "uint64"}, {"name": "event_type", "type": "uint8"}, {"name": "scheduled_time", "type": "uint64"}, {"name": "accrual_factor", "type": "uint64"}, {"name": "redemption_accrual_factor", "type": "uint64"}, {"name": "observed_rate", "type": "uint64"}, {"name": "next_nominal_interest_rate", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "next_outstanding_principal", "type": "uint64"}, {"name": "flags", "type": "uint64"}], "Prospectus": [{"name": "hash", "type": "byte[32]"}, {"name": "url", "type": "string"}], "RoleValidity": [{"name": "role_validity_start", "type": "uint64"}, {"name": "role_validity_end", "type": "uint64"}]}, "byteCode": {"approval": "DCAEAAEIICYwBBUffHUGc3RhdHVzDGV2ZW50X2N1cnNvchVvdXRzdGFuZGluZ19wcmluY2lwYWwUc2NoZWR1bGVfZW50cnlfY291bnQRZml4ZWRfcG9pbnRfc2NhbGUQYWNjcnVlZF9pbnRlcmVzdBlpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlClIjQWNjb3VudCMVbm9taW5hbF9pbnRlcmVzdF9yYXRlFHJlc2VydmVkX3VuaXRzX3RvdGFsEnJlc2VydmVkX3ByaW5jaXBhbA1jb250cmFjdF90eXBlC3RvdGFsX3VuaXRzGW5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24RcmVzZXJ2ZWRfaW50ZXJlc3QZY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleBpjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleAtSI0FycmFuZ2VyIxNzZXR0bGVtZW50X2Fzc2V0X2lkF2luaXRpYWxfZXhjaGFuZ2VfYW1vdW50DFIjQXV0aG9yaXR5IxBSI1ByaW1hcnlEZWFsZXIjEVIjQWNjb3VudE1hbmFnZXIjC1IjT2JzZXJ2ZXIjC1IjT3BEYWVtb24jFWluaXRpYWxfZXhjaGFuZ2VfZGF0ZRV0cmFuc2Zlcl9vcGVuaW5nX2RhdGUVdHJhbnNmZXJfY2xvc3VyZV9kYXRlEHJhdGVfcmVzZXRfZmxvb3IOcmF0ZV9yZXNldF9jYXACUyMKUiNUcnVzdGVlIw9hc3NldF9zdXNwZW5kZWQcZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbhFyYXRlX3Jlc2V0X3NwcmVhZBVyYXRlX3Jlc2V0X211bHRpcGxpZXIPcmF0ZV9yZXNldF9uZXh0FGhhc19yYXRlX3Jlc2V0X2Zsb29yEmhhc19yYXRlX3Jlc2V0X2NhcAEAD2Fzc2V0X2RlZmF1bHRlZA9wcm9zcGVjdHVzX2hhc2gOcHJvc3BlY3R1c191cmwVZGVub21pbmF0aW9uX2Fzc2V0X2lkDW1hdHVyaXR5X2RhdGUUZGF5X2NvdW50X2NvbnZlbnRpb24DBoEBMRhAAK0nEjIDZycZMgNnJyEiZycpImcpImcnDCJnJyqAAGcnK4AAZycsImcnEyJnJxoiZyctImcnGyJnJxwiZycuImcnDSJnJwoiZycUImcrImcnDiJnJyIiZycHImcnBiJnJwkiZycjImcnJCJnJx0iZyceImcnJSJnJyYiZycnImcnCyJnJw8iZycQImcnESJnKiJnJwQiZycFImcxNYEEEkQxNIElEkQxNxREMTYURIAEkU8E6zYaAI4BAMAxGRREMRhBAKmCFwS0RhjIBOeDJSkEfqIOCwRshePuBL3RqUQE3AY7NQQU/BDvBHSnKX8ECdT+FASam/qFBIXu0z0EkYUQSgTZ8iWsBG4OXJUE/z/UswSC9xstBO8E9dME3zQ1UAQ9voC9BN9U6CwEAQyCmQR0BqzSBBpyou42GgCOFwAbAscEIwRNBNcFyAYCBloGjQa7CK4J6ApiC9QMZwytDMUM3Q2SDigORw5SDpwAgASVbXFWNhoAjgEGmAAxGYEEEjEYEERCDI0igABHCjYaAUkVJBJEFyIpZUREiBSjiBSqiBSvIillRIEyEhREIkcCSwJLBAxBAlEiKmVEIicEZUQMQQJEIiplRIgQA0lFEYEJW0lFBjIHDUACLksPJFVJRRAkEklFB0AAEEsOgQMSQAAISw6BExJBAjYjQQILSw8iWyIqZUQSREsEMgcOREsFQAHkSw6BExJAAdwiRQ1LDyRVSUUQgQMSQAFgSw6BExJAAVgiRQhLD4ExW0UKiBCMQAD7SwlFC0sMiA9JSwiID0RLAYgPXklOAkURSYgPVUlFDUsCSwEISUUMMgoiJxNlRHAARCInD2VEIicLZURLAQhLAksBD0RPAkwJTwIPRE8DCCcPTGciJwtlRAgnC0xnIicQZURPAggnEExnIicRZUQIJxFMZ0sPJFWBAxJBAHciJwZlREsQiBAYRRIIJwZMZ4gP+EEACksPJFWBExJBAAlLD4EpWycOTGcrSwpnJwdLC2ciKmVEIwgqTGdLD1cIAYABE6hBABAiK2VEQAAJKYHIAWcnByJnSw9LB0mIEnFISwFLDghFAklLCQhFAUsCIwhFA0L+eScGImdC/5NLDyRVSUUQgQMSQQAPIitlREsICUlFC0ULQv7tSw4kEkEAEiIrZUxFC0QiJwdlTEUMREL+1EsOgRMSQAAHSwlFC0L+xSJFCiJFC0L+vIgPPkEAU0sOgRMSQQAJIitlREUIQv6UIicGZURLEIgPNkUSCElFDSInDmVED0EABiJFCEL+dSInDmVESwwJSUUKIitlRA1BAAkiK2VERQhC/llLCEUIQv5SSw+BMVsiK2VESg5ETAlFCEL+PyInBmVESxCIDuFFEghFDUL+FUsCSURLAklLA0lOAwgyB08CFk8DFlBPAhZQTwIWUEwWUChMULAjQyJC/ceAAEcCNhoBRwIVJRJENhoCSSJZgQIISwEVEkRXAgBMIillREQnCExQSb1FAUQiJxllRDIDE0EAIjEAIicZZUQSQAAVMQBLAxJAAA0xAEsBvkRXACASQQEAI0SIEbqIEb8iKWVEgTISFERLAkmIDISIDAdGAkm+REmBSVtJTgJFCEmBUVtJRQhPAghJRQZEVwAgIicTZURwAEUBQQC3Sb5EgYADU0AArSNBAHgyCiInE2VETEsBcABESwVJTgIPREsCSU4DvkRJVwAgsTIATwOyEkyyFE8CshGBBLIQsgGzSYFJW0lOAkUJSYFRW0lOA0UJIhZMSwFcSUxcUU8DTL8iJw9lRElLAg9EIicLZURLAw9ETAknD0xnIicLZURMCScLTGdLBUlLBklOAwgyB08CFk8DFlBPAhZQTBZQSwJJFRZXBgJMUEyAAgAiUExQKExQsCNDIkL/UCJC/v02GgFJFSQSRBc2GgJJFSQSRBeIEJxKDEQnG08CZyccTGcyBxYoTFCwI0M2GgFJFSUSRDYaAkkVJBJEF0lOAiIpZUREJxYxAIgQM0SIEG2IEHIiKWVEgTISRCcISwJQSU4DvUUBREyICqNJRCInCmVECCInDWVEDkQiJxplREEACTIHIicaZUQOREcCvkSBKFtLA0lOAwgWgShMuyInCmVECCcKSwFnIicNZURMCRYoTFCwI0MiSTYaAUkVJRJENhoCSRUlEkQ2GgNHAhUkEkQXIillRESID+OID+giKWVEgTISFEQiJxtlREEACSInG2VEMgcORCInHGVEQQAJMgciJxxlRAxEMQBLBElOAhJEJwhLAVBJRQhJvUUBRCcISwVJTgJQSUUJvUUBREsCiAncSYgJ2E8CE0RLAUlETL5EJVsORCIqZUQiJwRlRA9AAA4iKmVEiArogQlbMgcNREsDSYgKM0sDSU4CiAoriAmuRgKICalGAksFSb5EJVtLAklOAksBDkRLAQkWTwIlTwK7SwVJvkQlW08CCBYlTLsoSwJQsCNDNhoBSRUlEkQ2GgJJFSMSRCJTJxUxAIgOv0QnCE8CUEm9RQFESYEwI7oiTwNUgTBMuzIHFihMULAjQzYaAUkVJRJENhoCSRUlEkQnFzEAiA6HRCIpZUSByAESFESIDreIDrwnCE8CUEm9RQEURCIWTwJLAVBLAVAnKFBLAVBLAVBLAVBLAVBMUL8yBxYoTFCwI0M2GgFJFSUSRDYaAkkVJRJEJwhLAlBJvUUBRDEATwMSRIgOYYgOZiJPArsyBxYoTFCwI0M2GgFJFSUSRCcITFBJvUUBRL5IKExQsCNDNhoBSRUlEkQnEkxnMgcWKExQsCNDgABJNhoBRwIVgWsSRDYaAklOAhWBSBJENhoDSU4CSRVLASVZSYEiEkRPAkxLAlJJTgMiWYEkCBJEiA3dIlVJJwxLAWdBACJJIxJAABxJgQISQAAVSYEDEkAADkmBBBJAAAdJgQUSQQGGI0QiJwxlTEUCREsESYEhW0lFCESBOVVJRQhBAB9LBiMSQAAYSwaBAhJAABBLBoEDEkAACEsGgQQSQQFGI0RJIxNBAAhLBIGSBlMURCIpZUQURCInFGVEFERLBEkjW0lxC0UBRCcsSwFnSwGBCVtJTwISRCcTSwFnsTIAMgoishKyFEyyEYEEshCyAbNJgRFbJw1MZycKImcnLksIZ0mBKVsnGksBZ0sBgTFbJy1LAWdLBklOAoEwWycOTGcnFEsKZ0sDgZIGUyciTGdLAYEQWytMZ0sBgShbJwZMZ0sBJVsnCUxnSwGBGFsnB0xnSwOBOlsnI0xnSwOBQlsnJExnSwOBSlsnHUxnSwOBUlsnHkxnSwOBWlsnJUxnSwOBkAZTJyZMZ0sDgZEGUycnTGdPA4FjWycFTGdLASRbKkxnSwGBOFsnEExnSwGBQFsnEUxnJw8iZycLImdLAjIHDURMIltLAgxEDERLAlcAICcqTGdLAVcCACcrTGcyBxYoTFCwI0MiQv63IkL+dyKAAEcDNhoBSRUkEkQXSTYaAkkVIxJEIlNMNhoDSU4CSSJZSU4DSYFBC4ECCE8CFRJEiAvxIicMZUxOA0QiKWVEFERJgRAORCInFGVEREyBEAtMgWQLgeYLCEkyDA1BABixgQayEIEFshknL7IeJy+yHyKyAbNC/+EiRQpLCUsEDEEAjksEVwIASUUNSwpJTgKBQQuBQVhJJFVJTgJFDkkiW0lFDUsFTwQISwESREsFTwOIBzRMgQlbSUUKREEAGUsJQQAnSwkjCYFBC0sMTIFBWIEJW0sIDkRLCEAABUsKIxJESwkjCEUKQv+QSwZJRCMJFicfTFBJvUUBREkigQK6F0lEIwmBQQuBAgiBQbpC/8BLBhYnH0xQSbxISwW/SwVBAA1LAUsECCcETGcpgTJnMgcWKExQsCNDIillRESICuSICuuICvAiKmVEIicEZURLAQ1EiAZcSVcIAUmAAQGoREsBVwAISwJXCQhLA1cRCEsEVxkISwVXIQhLBlcpCEsHVzEISwhXOQhPB08IUE8HUE8GUE8FUCIWUE8EUE8DUE8CUExQiAePRgIyBxYoTFCwI0MiRwSAAEk2GgFJFSQSRBc2GgJHAhWBSRJEIillRESICluICmCBQVtJgQQaQQC2IicMZUSBBRJEiAo4IicMZURJgQUSREsCSSJbSUUHIicEZUQSRElXCAFFDCRViAXXIicEZUSBEAqAAgAARQcWJx9MUElFCb1FAUEAB0sHvkxFB0RLBUkiWUmBEAxESwNJVwkISwFXEQhLAlcZCEsDVykISwRXMQhPBVc5CEsLFksSUE8GUE8FUE8EUE8DUE8CUExQSwMWUE8CTFBMIwgWVwYCXABLCEm8SEy/IicEZUQjCCcETGciKmVESwNJTwISRIgFDklFCElXCAFFCiRVSUUGIxJAAChLBIEEEkAAIEsEgQwSQAAYSwSBCxJAABBLBIESEkAACEsEgQUSQQBBI0RLCIABAalESwSBDBJAAAhLBIELEkEAJCNBABonGDEAiAjtREsGSwKIBitGAjIHFihMULAjQ4gJC0L/6CJC/9kiQv+8IillRElEIicMZUQWSZMkDkRXBwEiJw1lRCInCmVEIicUZUQiKmVEIicEZUQiK2VEIicHZUQiJwllRCInBmVEIicQZUQiJxFlRCInD2VEIicLZURPDhZPDkxQTw0WUE8MFlBPCxZQTwoWUE8JFlBPCBZQTwcWUE8GFlBPBRZQTwQWUE8DFlBPAhZQTBZQKExQsCNDIillREQiKmVEIicEZUQPQQAlIiplRBYnKFAiFkxLAVBLAVBLAVBLAVBLAVBLAVBMUChMULAjQyIqZUSIA71C//CICCkjQzYaAUkVJRJEiAgcJxJMZzIHFihMULAjQzYaAUkVJRJEiAgEJxlMZzIHFihMULAjQzYaAUkVIxJENhoCSU4CFSUSRDYaA0lOAhWBEBJEiAfXiAfeF0cCiAfogRQSQQAOJxJLA2cyBxYoTFCwI0NJgSgSQQARJxdLA1BJvUUBFERLAr9C/99JgTISQQARJxZLA1BJvUUBFERLAr9C/8dJgTwSQQARJyBLA1BJvUUBFERLAr9C/69JgUYSQQARJxVLA1BJvUUBFERLAr9C/5dJgVASQf+QJxhLA1BJvUUBFERLAr9C/382GgFJFSMSRDYaAklOAhUlEkSIBy2IBzQXRwKIBz5JgRQTRIEoEkEAFScXSwJQSb1FAUS8SDIHFihMULAjQ0mBMhJBAA8nFksCUEm9RQFEvEhC/+FJgTwSQQAPJyBLAlBJvUUBRLxIQv/LSYFGEkEADycVSwJQSb1FAUS8SEL/tUmBUBJB/64nGEsCUEm9RQFEvEhC/582GgFJFSMSRCJTJxUxAIgGZ0QnIUxnMgcWKExQsCNDIicSZUQoTFCwI0M2GgFJFSUSRCcXSwGIBj8nFksCiAY4JyBLA4gGMScVSwSIBionGE8FiAYjJygiTwZUI08FVIECTwRUgQNPA1SBBE8CVChMULAjQzYaAUkVIxJENhoCSU4CFSUSRBdJiAY7gwYUKDI8RlBPBo4GAE8AQAAxACIAEwABACcYSwFQSb1FAUS+SChMULAjQycVSwFQSb1FAUS+SEL/6ycgSwFQSb1FAUS+SEL/3CcWSwFQSb1FAUS+SEL/zScXSwFQSb1FAUS+SEL/voAQAAAAAAAAAAAAAAAAAAAAAEL/qYoBACcIi/9QvkSBgANTFESJigECJwiL/1BJvUUBREm+SCInEGVESwGBOVsJIicRZURLAoFBWwlLAiVbIicFZURPA0sCTwKIAJgiJwVlRE8DTwNPAogAiksCgUlbSwIIFk8DTFxJSYFRW0sCCBZcUSInEGVEFlw5IicRZUQWXEEiKmVEFlwxTwNMv4mKAQAigAAnCIv/UEm9RQFEIillRIEyEkEAAYmLAr5MSU4CjABEgShbSYwBQAABiYsASSVbiwFJTgMIFlwgIhZcKIsCTL8iJwplRElLAg9ETAknCkxniYoDAYv9QQAFi/5AAAIiiYv9i/4di/+XiYoBAYv/QAACIokiJw1lRElEIicFZUSL/0xPAoj/yomKAQGL/0AAAiKJIicNZUQiJwVlRIv/TIj/r4mKAQEiJwRlRIv/DUSL/4EQChYnH0xQSb1FAUSL/4EQGEsBIoECuhdLAQ1EgUELgQIIgUG6iYoCAIv/IxJAAB+L/yQSQAAYi/+BExJAABCL/4EMEkAACIv/gQsSQQADI0SJi/5AAAQiQv/1i/6BAxJAAAiL/oECEkEAGIv/gQMSQAAIi/+BEhJBAAQjQv/RIkL/zYv+IxJBACCL/4EDEkAAEIv/gRISQAAIi/+BBRJBAAQjQv+qIkL/pov+gQQSQQAoi/+BAxJAABiL/4EEEkAAEIv/gRISQAAIi/+BBRJBAAQjQv96IkL/dov+gQUSQQAIi/+BAxJC/2YiQv9iIicMZUQjEkEACiInImVEQQACI4kiiYoBAov/gRFbSUEAECInCWVEQQAIIicHZURAAAYii/9PAokiJwdlRCInCWVEIicFZUSI/mciJwVlRIsATIj+XIv/TwKJigIBi/9AAAOL/okiJwVlRCInCWVEi/9LAoj+OwhJRCInBWVEi/5MTwKI/iuJigICIoAARwiL/iJbIiplRBJEi/6BCVsyBw5Ei/4kVUkjEklBAF0iKWVEgTISRCInCmVEIicNZUQSRIv+gTFbK0sBZycHTGeL/oEhWycJTGcnBiJni/6BKVsnDkxnIiplRCMIKkxnKYFkZ4sLRCInFGVEi/5MIogBxUmM/ov/jAGMAIkiKWVEgTISFEQiJwZlRIv+iP75jP4IJwZMZ4sKgQwSQQFji/+BIVsiJyRlRCInBWVEiP1zIicjZUQIjAYiJyZlREEAEyInHWVEiwYNQQAIIicdZUyMBkQiJydlREEAEyInHmVEiwYMQQAIIiceZUyMBkQnCYsGZ4sKgQQSQQDzi/6BMVsrSwFnJwdMZ4j+Z0EA1IsKgQUSQQCyIicFZUyMAkQijAEijAeL/oEZW0mMCEEAD4sCiwiI/pZJjAIjjAeMASIqZUQjCIwDIicEZUSLAw1BAFKLA4j9H0mMACRVSYwEgQMSQAAQiwSBExJBADOLAIEZW0EAKyNBAAiLB0EADCKMB4sDIwiMA0L/vYsAgRlbiwJMiP44SYwCiwEIjAFC/+EiQv/SiwFEIitlRIv+gTlbJBpAAAYiJwZlRAgiJwVlRIsBiPxfJw5MZyIqZUQjCCpMZ4v+IkmIAF9JjP6L/4wBjACJi/6BKVsnDkxnQv/aiwqBEhJB/xIiK2VEJwdMZ0L/B4sKgQsSQQAbi/6BIVtJjAVAAAgiJyVlTIwFRCcJiwVnQv7Pi/6BIVtJjAlB/sQnCYsJZ0L+vIoDATIIi/0iW4v9VwgBi/1XCQgyB4v9JFWL/kAARSMWSZMkDkRXBwEiJxNlRIsBSSMIiwAWTwIWUIsCUIsDUIsEFlCL/hZQTwNQi/8WUE8CFlBMFlCABJozK5VMULCL/YwAiYsFIxJAAAiLBYEEEkEABCNC/6mB/wFC/6OKAgGAAIv+i/9QSb1FAUEAH4sBvkQiWzIHSYwADkEAEIsBvkQkW4sAD0EABCOMAIkiQv/5MQAiJxJlRBJEiSInKWVEFESJIichZUQURImKAQCL/4EUEkAAMIv/gRkSQAAoi/+BKBJAACCL/4EyEkAAGIv/gTwSQAAQi/+BRhJAAAiL/4FQEkEAAyNEiSJC//o=", "clear": "DIEBQw=="}, "desc": "Debt Algorand Standard Application.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "networks": {}, "source": {"approval": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCAzMgogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1ICJzdGF0dXMiICJldmVudF9jdXJzb3IiICJvdXRzdGFuZGluZ19wcmluY2lwYWwiICJzY2hlZHVsZV9lbnRyeV9jb3VudCIgImZpeGVkX3BvaW50X3NjYWxlIiAiYWNjcnVlZF9pbnRlcmVzdCIgImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMgIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIgInJlc2VydmVkX3VuaXRzX3RvdGFsIiAicmVzZXJ2ZWRfcHJpbmNpcGFsIiAiY29udHJhY3RfdHlwZSIgInRvdGFsX3VuaXRzIiAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIgInJlc2VydmVkX2ludGVyZXN0IiAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIgImN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IiAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMgInNldHRsZW1lbnRfYXNzZXRfaWQiICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIgMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMgMHg1MjIzNTA3MjY5NmQ2MTcyNzk0NDY1NjE2YzY1NzIyMyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMgMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzIDB4NTIyMzRmNzA0NDYxNjU2ZDZmNmUyMyAiaW5pdGlhbF9leGNoYW5nZV9kYXRlIiAidHJhbnNmZXJfb3BlbmluZ19kYXRlIiAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIiAicmF0ZV9yZXNldF9mbG9vciIgInJhdGVfcmVzZXRfY2FwIiAweDUzMjMgMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMyAiYXNzZXRfc3VzcGVuZGVkIiAiZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiIgInJhdGVfcmVzZXRfc3ByZWFkIiAicmF0ZV9yZXNldF9tdWx0aXBsaWVyIiAicmF0ZV9yZXNldF9uZXh0IiAiaGFzX3JhdGVfcmVzZXRfZmxvb3IiICJoYXNfcmF0ZV9yZXNldF9jYXAiIDB4MDAgImFzc2V0X2RlZmF1bHRlZCIgInByb3NwZWN0dXNfaGFzaCIgInByb3NwZWN0dXNfdXJsIiAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIiAibWF0dXJpdHlfZGF0ZSIgImRheV9jb3VudF9jb252ZW50aW9uIiAweDA2ODEwMQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4LTI5CiAgICAvLyAjIFJCQUMgUm9sZXMKICAgIC8vIHNlbGYuYXJyYW5nZXIgPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX0FSUkFOR0VSKQogICAgYnl0ZWMgMTggLy8gMHg1MjIzNDE3MjcyNjE2ZTY3NjU3MjIzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzAKICAgIC8vIHNlbGYub3BfZGFlbW9uID0gR2xvYmFsU3RhdGUoQWNjb3VudCgpLCBrZXk9Y3N0LlBSRUZJWF9JRF9PUF9EQUVNT04pCiAgICBieXRlYyAyNSAvLyAweDUyMjM0ZjcwNDQ2MTY1NmQ2ZjZlMjMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo0Ny00OAogICAgLy8gIyBELUFTQSBHb3Zlcm5hbmNlCiAgICAvLyBzZWxmLmFzc2V0X3N1c3BlbmRlZCA9IEZhbHNlCiAgICBieXRlYyAzMyAvLyAiYXNzZXRfc3VzcGVuZGVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NDkKICAgIC8vIHNlbGYuYXNzZXRfZGVmYXVsdGVkID0gRmFsc2UKICAgIGJ5dGVjIDQxIC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU2LTU3CiAgICAvLyAjIENvbnRyYWN0CiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU4CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMTIgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYwLTYxCiAgICAvLyAjIFByb3NwZWN0dXMgKEluZm9ybWF0aW9uYWwpCiAgICAvLyBzZWxmLnByb3NwZWN0dXNfaGFzaCA9IEJ5dGVzKCkKICAgIGJ5dGVjIDQyIC8vICJwcm9zcGVjdHVzX2hhc2giCiAgICBwdXNoYnl0ZXMgMHgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2MgogICAgLy8gc2VsZi5wcm9zcGVjdHVzX3VybCA9IFN0cmluZygpCiAgICBieXRlYyA0MyAvLyAicHJvc3BlY3R1c191cmwiCiAgICBwdXNoYnl0ZXMgIiIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2NC02NQogICAgLy8gIyBEZW5vbWluYXRpb24KICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gQXNzZXQoKQogICAgYnl0ZWMgNDQgLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjYKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCA9IEFzc2V0KCkKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2OC02OQogICAgLy8gIyBUaW1lCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgMjYgLy8gImluaXRpYWxfZXhjaGFuZ2VfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzAKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgNDUgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjcxCiAgICAvLyBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgMjcgLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzIKICAgIC8vIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlID0gdHlwLlRpbWVTdGFtcCgpCiAgICBieXRlYyAyOCAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3NC03NQogICAgLy8gIyBEYXkgQ291bnQgQ29udmVudGlvbgogICAgLy8gc2VsZi5kYXlfY291bnRfY29udmVudGlvbiA9IFVJbnQ2NCgpCiAgICBieXRlYyA0NiAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojc3LTc4CiAgICAvLyAjIFVuaXRzCiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzID0gVUludDY0KCkKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzkKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPSBVSW50NjQoKQogICAgYnl0ZWMgMTAgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MS04MgogICAgLy8gIyBQcmluY2lwYWwKICAgIC8vIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPSBVSW50NjQoKQogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MwogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBVSW50NjQoKQogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4NAogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gVUludDY0KCkKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4NQogICAgLy8gc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gRmFsc2UKICAgIGJ5dGVjIDM0IC8vICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4Ny04OAogICAgLy8gIyBJbnRlcmVzdAogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gVUludDY0KCkKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojg5CiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgPSBVSW50NjQoKQogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTEtOTIKICAgIC8vICMgSW50ZXJlc3QgUmF0ZXMKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTMKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQgPSBVSW50NjQoKQogICAgYnl0ZWMgMzUgLy8gInJhdGVfcmVzZXRfc3ByZWFkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NAogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIgPSBVSW50NjQoKQogICAgYnl0ZWMgMzYgLy8gInJhdGVfcmVzZXRfbXVsdGlwbGllciIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTUKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9mbG9vciA9IFVJbnQ2NCgpCiAgICBieXRlYyAyOSAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTYKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9jYXAgPSBVSW50NjQoKQogICAgYnl0ZWMgMzAgLy8gInJhdGVfcmVzZXRfY2FwIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NwogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X25leHQgPSBVSW50NjQoKQogICAgYnl0ZWMgMzcgLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTgKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgPSBGYWxzZQogICAgYnl0ZWMgMzggLy8gImhhc19yYXRlX3Jlc2V0X2Zsb29yIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5OQogICAgLy8gc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgPSBGYWxzZQogICAgYnl0ZWMgMzkgLy8gImhhc19yYXRlX3Jlc2V0X2NhcCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTAxLTEwMgogICAgLy8gIyBQcmltYXJ5IERpc3RyaWJ1dGlvbgogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgPSBVSW50NjQoKQogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTAzCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0ID0gVUludDY0KCkKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA1LTEwNgogICAgLy8gIyBDdW11bGF0aXZlIFBlci1Vbml0IEZpeGVkLVBvaW50IEluZGV4ZXMKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA3CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4ID0gVUludDY0KCkKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTE1CiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciA9IFVJbnQ2NCgpCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExNgogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA9IFVJbnQ2NCgpCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTE4LTExOQogICAgLy8gIyBTY2FsaW5nCiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlID0gVUludDY0KCkKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6MjMKICAgIC8vIGFzc2VydCBUeG4uZ2xvYmFsX251bV9ieXRlX3NsaWNlID09IGNmZy5HTE9CQUxfQllURVMsIGVyci5XUk9OR19HTE9CQUxfQllURVMKICAgIHR4biBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgQnl0ZXMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjI0CiAgICAvLyBhc3NlcnQgVHhuLmdsb2JhbF9udW1fdWludCA9PSBjZmcuR0xPQkFMX1VJTlRTLCBlcnIuV1JPTkdfR0xPQkFMX1VJTlRTCiAgICB0eG4gR2xvYmFsTnVtVWludAogICAgcHVzaGludCAzNwogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgVUludHMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBhc3NlcnQgVHhuLmxvY2FsX251bV9ieXRlX3NsaWNlID09IGNmZy5MT0NBTF9CWVRFUywgZXJyLldST05HX0xPQ0FMX0JZVEVTCiAgICB0eG4gTG9jYWxOdW1CeXRlU2xpY2UKICAgICEKICAgIGFzc2VydCAvLyBXcm9uZyBMb2NhbCBCeXRlcyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6MjYKICAgIC8vIGFzc2VydCBUeG4ubG9jYWxfbnVtX3VpbnQgPT0gY2ZnLkxPQ0FMX1VJTlRTLCBlcnIuV1JPTkdfTE9DQUxfVUlOVFMKICAgIHR4biBMb2NhbE51bVVpbnQKICAgICEKICAgIGFzc2VydCAvLyBXcm9uZyBMb2NhbCBVSW50cyBhbGxvY2F0aW9uCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kX2FzYS9jb250cmFjdC5weTo4LTE4CiAgICAvLyBjbGFzcyBEQVNBKAogICAgLy8gICAgIFBheW1lbnRBZ2VudCwKICAgIC8vICAgICBUcmFuc2ZlckFnZW50LAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gICAgIGF2bV92ZXJzaW9uPTEyLAogICAgLy8gKToKICAgIHB1c2hieXRlcyAweDkxNGYwNGViIC8vIG1ldGhvZCAiY29udHJhY3RfdXBkYXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9jb250cmFjdF91cGRhdGVfcm91dGVANAoKbWFpbl9zd2l0Y2hfY2FzZV9uZXh0QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6OC0xOAogICAgLy8gY2xhc3MgREFTQSgKICAgIC8vICAgICBQYXltZW50QWdlbnQsCiAgICAvLyAgICAgVHJhbnNmZXJBZ2VudCwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBhdm1fdmVyc2lvbj0xMiwKICAgIC8vICk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBieiBtYWluX2NyZWF0ZV9Ob09wQDMxCiAgICBwdXNoYnl0ZXNzIDB4YjQ0NjE4YzggMHhlNzgzMjUyOSAweDdlYTIwZTBiIDB4NmM4NWUzZWUgMHhiZGQxYTk0NCAweGRjMDYzYjM1IDB4MTRmYzEwZWYgMHg3NGE3Mjk3ZiAweDA5ZDRmZTE0IDB4OWE5YmZhODUgMHg4NWVlZDMzZCAweDkxODUxMDRhIDB4ZDlmMjI1YWMgMHg2ZTBlNWM5NSAweGZmM2ZkNGIzIDB4ODJmNzFiMmQgMHhlZjA0ZjVkMyAweGRmMzQzNTUwIDB4M2RiZTgwYmQgMHhkZjU0ZTgyYyAweDAxMGM4Mjk5IDB4NzQwNmFjZDIgMHgxYTcyYTJlZSAvLyBtZXRob2QgImZ1bmRfZHVlX2Nhc2hmbG93cyh1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJjbGFpbV9kdWVfY2FzaGZsb3dzKGFkZHJlc3MsYnl0ZVtdKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYnl0ZVtdKSIsIG1ldGhvZCAic2V0X3RyYW5zZmVyX3NjaGVkdWxlKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbihhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInRyYW5zZmVyKGFkZHJlc3MsYWRkcmVzcyx1aW50NjQpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X2dvdl9zdXNwZW5zaW9uKGFkZHJlc3MsYm9vbCl1aW50NjQiLCBtZXRob2QgImFjY291bnRfb3BlbihhZGRyZXNzLGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X3VwZGF0ZV9wYXltZW50X2FkZHJlc3MoYWRkcmVzcyxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAiYWNjb3VudF9nZXRfcG9zaXRpb24oYWRkcmVzcykoYWRkcmVzcyx1aW50NjQsdWludDY0LGJvb2wsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImNvbnRyYWN0X2NvbmZpZygodWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYm9vbCxib29sLGJvb2wsdWludDY0KSwodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpLChieXRlWzMyXSxzdHJpbmcpKXVpbnQ2NCIsIG1ldGhvZCAiY29udHJhY3Rfc2NoZWR1bGUodWludDY0LGJvb2wsKHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpW10pdWludDY0IiwgbWV0aG9kICJleGVjdXRlX2llZCgpdWludDY0IiwgbWV0aG9kICJhcHBseV9ub25fY2FzaF9ldmVudCh1aW50NjQsKHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSl1aW50NjQiLCBtZXRob2QgImdldF9jb250cmFjdF9zdGF0ZSgpKHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJnZXRfbmV4dF9kdWVfZXZlbnQoKSh1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAicmJhY19yb3RhdGVfYXJyYW5nZXIoYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgInJiYWNfc2V0X29wX2RhZW1vbihhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19hc3NpZ25fcm9sZSh1aW50OCxhZGRyZXNzLCh1aW50NjQsdWludDY0KSl1aW50NjQiLCBtZXRob2QgInJiYWNfcmV2b2tlX3JvbGUodWludDgsYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgInJiYWNfZ292X2Fzc2V0X3N1c3BlbnNpb24oYm9vbCl1aW50NjQiLCBtZXRob2QgInJiYWNfZ2V0X2FycmFuZ2VyKClhZGRyZXNzIiwgbWV0aG9kICJyYmFjX2dldF9hZGRyZXNzX3JvbGVzKGFkZHJlc3MpKGJvb2wsYm9vbCxib29sLGJvb2wsYm9vbCkiLCBtZXRob2QgInJiYWNfZ2V0X3JvbGVfdmFsaWRpdHkodWludDgsYWRkcmVzcykodWludDY0LHVpbnQ2NCkiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBmdW5kX2R1ZV9jYXNoZmxvd3MgY2xhaW1fZHVlX2Nhc2hmbG93cyBzZXRfdHJhbnNmZXJfc2NoZWR1bGUgcHJpbWFyeV9kaXN0cmlidXRpb24gdHJhbnNmZXIgYWNjb3VudF9nb3Zfc3VzcGVuc2lvbiBhY2NvdW50X29wZW4gYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzIGFjY291bnRfZ2V0X3Bvc2l0aW9uIGNvbnRyYWN0X2NvbmZpZyBjb250cmFjdF9zY2hlZHVsZSBleGVjdXRlX2llZCBhcHBseV9ub25fY2FzaF9ldmVudCBnZXRfY29udHJhY3Rfc3RhdGUgZ2V0X25leHRfZHVlX2V2ZW50IHJiYWNfcm90YXRlX2FycmFuZ2VyIHJiYWNfc2V0X29wX2RhZW1vbiByYmFjX2Fzc2lnbl9yb2xlIHJiYWNfcmV2b2tlX3JvbGUgcmJhY19nb3ZfYXNzZXRfc3VzcGVuc2lvbiByYmFjX2dldF9hcnJhbmdlciByYmFjX2dldF9hZGRyZXNzX3JvbGVzIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHkKICAgIGVycgoKbWFpbl9jcmVhdGVfTm9PcEAzMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kX2FzYS9jb250cmFjdC5weTo4LTE4CiAgICAvLyBjbGFzcyBEQVNBKAogICAgLy8gICAgIFBheW1lbnRBZ2VudCwKICAgIC8vICAgICBUcmFuc2ZlckFnZW50LAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gICAgIGF2bV92ZXJzaW9uPTEyLAogICAgLy8gKToKICAgIHB1c2hieXRlcyAweDk1NmQ3MTU2IC8vIG1ldGhvZCAiY29udHJhY3RfY3JlYXRlKGFkZHJlc3MpdWludDY0IgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggY29udHJhY3RfY3JlYXRlCiAgICBlcnIKCm1haW5fY29udHJhY3RfdXBkYXRlX3JvdXRlQDQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBwdXNoaW50IDQgLy8gVXBkYXRlQXBwbGljYXRpb24KICAgID09CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydAogICAgYiBjb250cmFjdF91cGRhdGUKCgovLyBtb2R1bGVzLnBheW1lbnRfYWdlbnQuUGF5bWVudEFnZW50LmZ1bmRfZHVlX2Nhc2hmbG93c1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmZ1bmRfZHVlX2Nhc2hmbG93czoKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gMTAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjUwCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo1MQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo1MgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNDcKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NTUKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NTYtNTcKICAgIC8vIGZ1bmRlZF9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgLy8gZnVuZGVkX3ByaW5jaXBhbCA9IFVJbnQ2NCgwKQogICAgZHVwbiAyCgpmdW5kX2R1ZV9jYXNoZmxvd3Nfd2hpbGVfdG9wQDI6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjAKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgPCBtYXhfZXZlbnRfY291bnQKICAgIGRpZyAyCiAgICBkaWcgNAogICAgPAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjYwLTYxCiAgICAvLyBwcm9jZXNzZWRfZXZlbnRzIDwgbWF4X2V2ZW50X2NvdW50CiAgICAvLyBhbmQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAOQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjYxCiAgICAvLyBhbmQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIDwKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2MC02MQogICAgLy8gcHJvY2Vzc2VkX2V2ZW50cyA8IG1heF9ldmVudF9jb3VudAogICAgLy8gYW5kIHNlbGYuZXZlbnRfY3Vyc29yIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudAogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDkKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2MwogICAgLy8gZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoc2VsZi5ldmVudF9jdXJzb3IpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgZHVwCiAgICBidXJ5IDE3CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjQKICAgIC8vIGlmIGVudHJ5LnNjaGVkdWxlZF90aW1lID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXA6CiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgNgogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPgogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl93aGlsZUA5CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjYKICAgIC8vIGlmIG5vdCBzZWxmLl9ldmVudF9pc19jYXNoKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkpOgogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBidXJ5IDE2CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozNTEKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgaW50Y18yIC8vIDgKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjM1MC0zNTQKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX01EKSwKICAgIC8vICkKICAgID09CiAgICBkdXAKICAgIGJ1cnkgNwogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX3RydWVANTAKICAgIGRpZyAxNAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzUyCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzUwLTM1NAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfTUQpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDUwCiAgICBkaWcgMTQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjM1MwogICAgLy8gVUludDY0KGVudW1zLkVWVF9NRCksCiAgICBwdXNoaW50IDE5CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozNTAtMzU0CiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9NRCksCiAgICAvLyApCiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VANTEKCmZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX3RydWVANTA6CiAgICBpbnRjXzEgLy8gMQoKZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfbWVyZ2VANTI6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjYKICAgIC8vIGlmIG5vdCBzZWxmLl9ldmVudF9pc19jYXNoKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkpOgogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDkKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU0OAogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X2lkID09IHNlbGYuZXZlbnRfY3Vyc29yLCBlcnIuSU5WQUxJRF9FVkVOVF9DVVJTT1IKICAgIGRpZyAxNQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBjdXJzb3IKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU0OQogICAgLy8gYXNzZXJ0IGVudHJ5LnNjaGVkdWxlZF90aW1lIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLCBlcnIuTk9fRFVFX0NBU0hGTE9XCiAgICBkaWcgNAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPD0KICAgIGFzc2VydCAvLyBObyBkdWUgY2FzaGZsb3cgdG8gcGF5CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0MTMKICAgIC8vIGlmIGV2ZW50X3R5cGUgbm90IGluIChVSW50NjQoZW51bXMuRVZUX0lQKSwgVUludDY0KGVudW1zLkVWVF9NRCkpOgogICAgZGlnIDUKICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxMwogICAgZGlnIDE0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDEzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0MTQKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDEzCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfaW50ZXJlc3RfYW1vdW50QDE0OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDI2CiAgICAvLyBldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBidXJ5IDE2CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0MjcKICAgIC8vIGlmIGV2ZW50X3R5cGUgbm90IGluIChVSW50NjQoZW51bXMuRVZUX1BSKSwgVUludDY0KGVudW1zLkVWVF9NRCkpOgogICAgcHVzaGludCAzCiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE3CiAgICBkaWcgMTQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTcKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQyOAogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnRAMjY6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1NTMKICAgIC8vIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGRpZyAxNQogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgMTAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU1NgogICAgLy8gaWYgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCk6CiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUAyNwogICAgZGlnIDkKICAgIGJ1cnkgMTEKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM2OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTcyLTU3NAogICAgLy8gIyBGdW5kaW5nIHVzZXMgcGVyLXVuaXQgY3VtdWxhdGl2ZSBpbmRpY2VzIHNvIGVhY2ggaG9sZGVyIGNhbiBzZXR0bGUKICAgIC8vICMgaW5kZXBlbmRlbnRseSBmcm9tIGl0cyBjdXJyZW50IHVuaXQgYmFsYW5jZS4KICAgIC8vIGludGVyZXN0X2luZGV4X2RlbHRhID0gc2VsZi5fYW1vdW50X3RvX2luZGV4X2RlbHRhKGludGVyZXN0X2Ftb3VudF9kdWUpCiAgICBkaWcgMTIKICAgIGNhbGxzdWIgX2Ftb3VudF90b19pbmRleF9kZWx0YQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTc1CiAgICAvLyBwcmluY2lwYWxfaW5kZXhfZGVsdGEgPSBzZWxmLl9hbW91bnRfdG9faW5kZXhfZGVsdGEocHJpbmNpcGFsX2Ftb3VudF9kdWUpCiAgICBkaWcgOAogICAgY2FsbHN1YiBfYW1vdW50X3RvX2luZGV4X2RlbHRhCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1NzYKICAgIC8vIGludGVyZXN0X2Ftb3VudCA9IHNlbGYuX2luZGV4X2RlbHRhX3RvX2Ftb3VudChpbnRlcmVzdF9pbmRleF9kZWx0YSkKICAgIGRpZyAxCiAgICBjYWxsc3ViIF9pbmRleF9kZWx0YV90b19hbW91bnQKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSAxNwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTc3CiAgICAvLyBwcmluY2lwYWxfYW1vdW50ID0gc2VsZi5faW5kZXhfZGVsdGFfdG9fYW1vdW50KHByaW5jaXBhbF9pbmRleF9kZWx0YSkKICAgIGR1cAogICAgY2FsbHN1YiBfaW5kZXhfZGVsdGFfdG9fYW1vdW50CiAgICBkdXAKICAgIGJ1cnkgMTMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU3OAogICAgLy8gcmVxdWlyZWRfYW1vdW50ID0gaW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudAogICAgZGlnIDIKICAgIGRpZyAxCiAgICArCiAgICBkdXAKICAgIGJ1cnkgMTIKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjcyNwogICAgLy8gYmFsYW5jZSA9IHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQ1NgogICAgLy8gcmV0dXJuIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgKyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIGRpZyAxCiAgICArCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3MjkKICAgIC8vIGFzc2VydCBiYWxhbmNlID49IHJlc2VydmVkX3RvdGFsLCBlcnIuTk9UX0VOT1VHSF9GVU5EUwogICAgZGlnIDIKICAgIGRpZyAxCiAgICA+PQogICAgYXNzZXJ0IC8vIE5vdCBlbm91Z2ggZnVuZHMgZm9yIHRoZSBwYXltZW50CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3MzAKICAgIC8vIHJldHVybiBiYWxhbmNlIC0gcmVzZXJ2ZWRfdG90YWwKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgLQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTgwCiAgICAvLyBzZWxmLl9hdmFpbGFibGVfc2V0dGxlbWVudF9mdW5kcygpID49IHJlcXVpcmVkX2Ftb3VudAogICAgdW5jb3ZlciAyCiAgICA+PQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTc5LTU4MQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLl9hdmFpbGFibGVfc2V0dGxlbWVudF9mdW5kcygpID49IHJlcXVpcmVkX2Ftb3VudAogICAgLy8gKSwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTgzCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0ICs9IGludGVyZXN0X2Ftb3VudAogICAgdW5jb3ZlciAzCiAgICArCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTg0CiAgICAvLyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCArPSBwcmluY2lwYWxfYW1vdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICArCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU4NQogICAgLy8gc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4ICs9IGludGVyZXN0X2luZGV4X2RlbHRhCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCBleGlzdHMKICAgIHVuY292ZXIgMgogICAgKwogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTg2CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4ICs9IHByaW5jaXBhbF9pbmRleF9kZWx0YQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCBleGlzdHMKICAgICsKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1ODcKICAgIC8vIGlmIGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkgPT0gVUludDY0KGVudW1zLkVWVF9QUik6CiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBwdXNoaW50IDMKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDM4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1ODgtNTg5CiAgICAvLyAjIEZvciBQUiwgdGhlIHBlcmlvZCBpbnRlcmVzdCBzdGF5cyBhY2NydWVkIHVudGlsIGEgbGF0ZXIgSVAgb3IgTUQuCiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgKz0gc2VsZi5fZW50cnlfaW50ZXJlc3Rfc2VnbWVudChlbnRyeSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBkaWcgMTYKICAgIGNhbGxzdWIgX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQKICAgIGJ1cnkgMTgKICAgICsKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzk6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1OTIKICAgIC8vIGlmIG5vdCBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKSBvciBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NCgKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlANDEKICAgIGRpZyAxNQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU5Mi01OTQKICAgIC8vIGlmIG5vdCBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKSBvciBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NCgKICAgIC8vICAgICBlbnVtcy5FVlRfTUQKICAgIC8vICk6CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDIKCmZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDQxOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTk1CiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBkaWcgMTUKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0MjoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU5NgogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgZGlnIDEwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTk3CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBuZXh0X2ludGVyZXN0X2Jhc2UKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBkaWcgMTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1OTgKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYwMAogICAgLy8gaWYgZW50cnkuZXZlbnRfdHlwZSA9PSBhcmM0LlVJbnQ4KAogICAgZGlnIDE1CiAgICBleHRyYWN0IDggMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjAwLTYwMgogICAgLy8gaWYgZW50cnkuZXZlbnRfdHlwZSA9PSBhcmM0LlVJbnQ4KAogICAgLy8gICAgIGVudW1zLkVWVF9NRAogICAgLy8gKSBhbmQgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPT0gVUludDY0KDApOgogICAgcHVzaGJ5dGVzIDB4MTMKICAgIGI9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYwMgogICAgLy8gKSBhbmQgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPT0gVUludDY0KDApOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2MDAtNjAyCiAgICAvLyBpZiBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoCiAgICAvLyAgICAgZW51bXMuRVZUX01ECiAgICAvLyApIGFuZCBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9PSBVSW50NjQoMCk6CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYwMwogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX0VOREVEKQogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgcHVzaGludCAyMDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2MDQKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDU6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2MDYtNjEwCiAgICAvLyBzZWxmLl9lbWl0X2V4ZWN1dGlvbl9ldmVudCgKICAgIC8vICAgICBlbnRyeT1lbnRyeSwKICAgIC8vICAgICBwYXlvZmY9aW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudCwKICAgIC8vICAgICBzZXR0bGVkX2Ftb3VudD1pbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50LAogICAgLy8gKQogICAgZGlnIDE1CiAgICBkaWcgNwogICAgZHVwCiAgICBjYWxsc3ViIF9lbWl0X2V4ZWN1dGlvbl9ldmVudAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzAKICAgIC8vIGZ1bmRlZF9pbnRlcmVzdCArPSBpbnRlcmVzdF9hbW91bnQKICAgIGRpZyAxCiAgICBkaWcgMTQKICAgICsKICAgIGJ1cnkgMgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjcxCiAgICAvLyBmdW5kZWRfcHJpbmNpcGFsICs9IHByaW5jaXBhbF9hbW91bnQKICAgIGR1cAogICAgZGlnIDkKICAgICsKICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjcyCiAgICAvLyBwcm9jZXNzZWRfZXZlbnRzICs9IFVJbnQ2NCgxKQogICAgZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDMKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX3doaWxlX3RvcEAyCgpmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDM4OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTkxCiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzkKCmZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDI3OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTU3CiAgICAvLyBldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBidXJ5IDE2CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1NTgtNTYwCiAgICAvLyAjIER5bmFtaWMgYW5udWl0aWVzIGRlcml2ZSBuZXh0IHN0YXRlIGZyb20gdGhlIHBheW1lbnQgZGVjb21wb3NpdGlvbiwKICAgIC8vICMgbm90IG9ubHkgZnJvbSB0aGUgcHJlY29tcHV0ZWQgYG5leHRfKmAgZmllbGRzLgogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1BSKToKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19lbHNlX2JvZHlAMjkKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU2MgogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgLSBwcmluY2lwYWxfYW1vdW50X2R1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBkaWcgOAogICAgLQogICAgZHVwCiAgICBidXJ5IDExCiAgICBidXJ5IDExCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDI5OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTY1CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9JUCk6CiAgICBkaWcgMTQKICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUAzMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTY2CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGJ1cnkgMTEKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU2NwogICAgLy8gbmV4dF9pbnRlcmVzdF9iYXNlID0gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBidXJ5IDEyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIGV4aXN0cwogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzNgoKZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUAzMToKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU2OAogICAgLy8gZWxpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfTUQpOgogICAgZGlnIDE0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDMyCiAgICBkaWcgOQogICAgYnVyeSAxMQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzNgoKZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlAMzI6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1NjkKICAgIC8vIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAxMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTcwCiAgICAvLyBuZXh0X2ludGVyZXN0X2Jhc2UgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDExCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNzoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQyOQogICAgLy8gaWYgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCk6CiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDI1CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0MzAKICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCk6CiAgICBkaWcgMTQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDMxCiAgICAvLyByZXR1cm4gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1NTIKICAgIC8vIHByaW5jaXBhbF9hbW91bnRfZHVlID0gc2VsZi5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudChlbnRyeSkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnRAMjYKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDIwOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDMyCiAgICAvLyBpbnRlcmVzdF9kdWUgPSBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgKyBzZWxmLl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KGVudHJ5KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgIGRpZyAxNgogICAgY2FsbHN1YiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudAogICAgYnVyeSAxOAogICAgKwogICAgZHVwCiAgICBidXJ5IDEzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0MzMKICAgIC8vIGlmIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA8PSBpbnRlcmVzdF9kdWU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiBleGlzdHMKICAgID49CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyMgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDM0CiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1NTIKICAgIC8vIHByaW5jaXBhbF9hbW91bnRfZHVlID0gc2VsZi5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudChlbnRyeSkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnRAMjYKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDIyOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDM1CiAgICAvLyBwcmluY2lwYWxfYW1vdW50ID0gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIC0gaW50ZXJlc3RfZHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiBleGlzdHMKICAgIGRpZyAxMgogICAgLQogICAgZHVwCiAgICBidXJ5IDEwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0MzYKICAgIC8vIGlmIHByaW5jaXBhbF9hbW91bnQgPiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgPgogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQzNwogICAgLy8gcmV0dXJuIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTUyCiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyNDoKICAgIGRpZyA4CiAgICBidXJ5IDgKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyNgoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjU6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0NDAKICAgIC8vIGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsIDw9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBkaWcgMTUKICAgIHB1c2hpbnQgNDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGR1cDIKICAgIDw9CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0MzktNDQxCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsIDw9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQ0MgogICAgLy8gcmV0dXJuIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIC0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIHN3YXAKICAgIC0KICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTUyCiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQxNQogICAgLy8gcmV0dXJuIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCArIHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZGlnIDE2CiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBidXJ5IDE4CiAgICArCiAgICBidXJ5IDEzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1NTEKICAgIC8vIGludGVyZXN0X2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9pbnRlcmVzdF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9pbnRlcmVzdF9hbW91bnRAMTQKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl93aGlsZUA5OgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojc0CiAgICAvLyBhc3NlcnQgcHJvY2Vzc2VkX2V2ZW50cyA+IFVJbnQ2NCgwKSwgZXJyLk5PX0RVRV9DQVNIRkxPVwogICAgZGlnIDIKICAgIGR1cAogICAgYXNzZXJ0IC8vIE5vIGR1ZSBjYXNoZmxvdyB0byBwYXkKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3OAogICAgLy8gdG90YWxfZnVuZGVkPWZ1bmRlZF9pbnRlcmVzdCArIGZ1bmRlZF9wcmluY2lwYWwsCiAgICBkaWcgMgogICAgZHVwCiAgICBkaWcgMwogICAgZHVwCiAgICBjb3ZlciAzCiAgICArCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODAKICAgIC8vIHRpbWVzdGFtcD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3NS04MQogICAgLy8gcmV0dXJuIHR5cC5DYXNoRnVuZGluZ1Jlc3VsdCgKICAgIC8vICAgICBmdW5kZWRfaW50ZXJlc3Q9ZnVuZGVkX2ludGVyZXN0LAogICAgLy8gICAgIGZ1bmRlZF9wcmluY2lwYWw9ZnVuZGVkX3ByaW5jaXBhbCwKICAgIC8vICAgICB0b3RhbF9mdW5kZWQ9ZnVuZGVkX2ludGVyZXN0ICsgZnVuZGVkX3ByaW5jaXBhbCwKICAgIC8vICAgICBwcm9jZXNzZWRfZXZlbnRzPXByb2Nlc3NlZF9ldmVudHMsCiAgICAvLyAgICAgdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUA1MToKICAgIGludGNfMCAvLyAwCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDUyCgoKLy8gbW9kdWxlcy5wYXltZW50X2FnZW50LlBheW1lbnRBZ2VudC5jbGFpbV9kdWVfY2FzaGZsb3dzW3JvdXRpbmddKCkgLT4gdm9pZDoKY2xhaW1fZHVlX2Nhc2hmbG93czoKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNAogICAgLy8gaWYgc2VsZi5vcF9kYWVtb24udmFsdWUgIT0gR2xvYmFsLnplcm9fYWRkcmVzczoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNSAvLyAweDUyMjM0ZjcwNDQ2MTY1NmQ2ZjZlMjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcF9kYWVtb24gZXhpc3RzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBieiBjbGFpbV9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTcKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNgogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI1IC8vIDB4NTIyMzRmNzA0NDYxNjU2ZDZmNmUyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wX2RhZW1vbiBleGlzdHMKICAgID09CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTYtMTgKICAgIC8vIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICAvLyBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgYm56IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDE0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTcKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNi0xOAogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICBibnogY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX3RydWVAMTQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxOAogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIHR4biBTZW5kZXIKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDMyCiAgICA9PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE2LTE4CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAxNQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX3RydWVAMTQ6CiAgICBpbnRjXzEgLy8gMQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDE2OgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE1LTE5CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vICAgICBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gICAgIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICAvLyApLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNzoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5NAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5NQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNDcKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6OTgKICAgIC8vIHNlbGYuX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQoaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDIKICAgIGR1cAogICAgY2FsbHN1YiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojk5CiAgICAvLyBzZWxmLl9zZXR0bGVfcG9zaXRpb24oaG9sZGluZ19hZGRyZXNzKQogICAgY2FsbHN1YiBfc2V0dGxlX3Bvc2l0aW9uCiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTcKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNsYWltYWJsZV9pbnRlcmVzdAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZHVwCiAgICBwdXNoaW50IDczCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBidXJ5IDgKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTgKICAgIC8vICsgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgZHVwCiAgICBwdXNoaW50IDgxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDgKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTctMTE4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jbGFpbWFibGVfaW50ZXJlc3QKICAgIC8vICsgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgdW5jb3ZlciAyCiAgICArCiAgICBkdXAKICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjEwMQogICAgLy8gYXNzZXJ0IHRvdGFsX2Ftb3VudCA+IFVJbnQ2NCgwKSwgZXJyLk5PX0RVRV9DQVNIRkxPVwogICAgYXNzZXJ0IC8vIE5vIGR1ZSBjYXNoZmxvdyB0byBwYXkKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLmlzX29wdGVkX2luKAogICAgZXh0cmFjdCAwIDMyCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MjUKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MjQtMjYKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5pc19vcHRlZF9pbigKICAgIC8vICAgICBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQKICAgIC8vICkKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MjQtMjcKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5pc19vcHRlZF9pbigKICAgIC8vICAgICBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQKICAgIC8vICkKICAgIC8vIGFuZCBub3Qgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkCiAgICBieiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VAMjQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNwogICAgLy8gYW5kIG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHB1c2hpbnQgMzg0CiAgICBnZXRiaXQKICAgIGJueiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VAMjQKICAgIGludGNfMSAvLyAxCgpjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfbWVyZ2VAMjU6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA2CiAgICAvLyBpZiBzZWxmLl9pc19wYXltZW50X2V4ZWN1dGFibGUoaG9sZGluZ19hZGRyZXNzKToKICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MzMKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICBzd2FwCiAgICBkaWcgMQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBvcHRlZCBpbnRvIGFzc2V0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MzMtMzQKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICAvLyA+PSBwYXltZW50X2Ftb3VudAogICAgZGlnIDUKICAgIGR1cAogICAgY292ZXIgMgogICAgPj0KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozMi0zNQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgLy8gICAgID49IHBheW1lbnRfYW1vdW50CiAgICAvLyApLCBlcnIuTk9UX0VOT1VHSF9GVU5EUwogICAgYXNzZXJ0IC8vIE5vdCBlbm91Z2ggZnVuZHMgZm9yIHRoZSBwYXltZW50CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA4CiAgICAvLyBzZWxmLl9wYXkoc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLCB0b3RhbF9hbW91bnQpCiAgICBkaWcgMgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZHVwCiAgICBleHRyYWN0IDAgMzIKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozOS00NAogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXJlY2VpdmVyLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1hbW91bnQsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0MwogICAgLy8gZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIGdsb2JhbCBNaW5UeG5GZWUKICAgIHVuY292ZXIgMwogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgc3dhcAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MzkKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozOS00NAogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXJlY2VpdmVyLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1hbW91bnQsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTI1LTEyNgogICAgLy8gIyBHZXQgdGhlIGNsYWltYWJsZSBhbW91bnRzIGJlZm9yZSByZXNldAogICAgLy8gaW50ZXJlc3RfYW1vdW50ID0gcG9zaXRpb24uY2xhaW1hYmxlX2ludGVyZXN0CiAgICBkdXAKICAgIHB1c2hpbnQgNzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgOQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEyNwogICAgLy8gcHJpbmNpcGFsX2Ftb3VudCA9IHBvc2l0aW9uLmNsYWltYWJsZV9wcmluY2lwYWwKICAgIGR1cAogICAgcHVzaGludCA4MQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMwogICAgYnVyeSA5CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTI5LTEzMAogICAgLy8gIyBSZXNldCB0aGUgcG9zaXRpb24ncyBjbGFpbWFibGUgYW1vdW50cwogICAgLy8gcG9zaXRpb24uY2xhaW1hYmxlX2ludGVyZXN0ID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgaXRvYgogICAgc3dhcAogICAgZGlnIDEKICAgIHJlcGxhY2UyIDczCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTMxCiAgICAvLyBwb3NpdGlvbi5jbGFpbWFibGVfcHJpbmNpcGFsID0gVUludDY0KDApCiAgICBzd2FwCiAgICByZXBsYWNlMiA4MQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzMgogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSBwb3NpdGlvbi5jb3B5KCkKICAgIHVuY292ZXIgMwogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzNAogICAgLy8gYXNzZXJ0IHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgPj0gaW50ZXJlc3RfYW1vdW50LCBlcnIuTk9UX0VOT1VHSF9GVU5EUwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCBleGlzdHMKICAgIGR1cAogICAgZGlnIDIKICAgID49CiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcyBmb3IgdGhlIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzUKICAgIC8vIGFzc2VydCBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCA+PSBwcmluY2lwYWxfYW1vdW50LCBlcnIuTk9UX0VOT1VHSF9GVU5EUwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIGV4aXN0cwogICAgZGlnIDMKICAgID49CiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcyBmb3IgdGhlIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzctMTM4CiAgICAvLyAjIFVwZGF0ZSB0aGUgZ2xvYmFsIHJlc2VydmVkIGludGVyZXN0IGFuZCBwcmluY2lwYWwgYW1vdW50cwogICAgLy8gc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCAtPSBpbnRlcmVzdF9hbW91bnQKICAgIHN3YXAKICAgIC0KICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTM5CiAgICAvLyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCAtPSBwcmluY2lwYWxfYW1vdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICBzd2FwCiAgICAtCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjExNAogICAgLy8gdG90YWxfYW1vdW50PWludGVyZXN0X2Ftb3VudCArIHByaW5jaXBhbF9hbW91bnQsCiAgICBkaWcgNQogICAgZHVwCiAgICBkaWcgNgogICAgZHVwCiAgICBjb3ZlciAzCiAgICArCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTE1CiAgICAvLyB0aW1lc3RhbXA9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTExLTExNwogICAgLy8gcmV0dXJuIHR5cC5DYXNoQ2xhaW1SZXN1bHQoCiAgICAvLyAgICAgaW50ZXJlc3RfYW1vdW50PWludGVyZXN0X2Ftb3VudCwKICAgIC8vICAgICBwcmluY2lwYWxfYW1vdW50PXByaW5jaXBhbF9hbW91bnQsCiAgICAvLyAgICAgdG90YWxfYW1vdW50PWludGVyZXN0X2Ftb3VudCArIHByaW5jaXBhbF9hbW91bnQsCiAgICAvLyAgICAgdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gICAgIGNvbnRleHQ9cGF5bWVudF9pbmZvLAogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZGlnIDIKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBwdXNoYnl0ZXMgMHgwMDIyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAyNDoKICAgIGludGNfMCAvLyAwCiAgICBiIGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUAyNQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX2ZhbHNlQDE1OgogICAgaW50Y18wIC8vIDAKICAgIGIgY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDE2CgoKLy8gbW9kdWxlcy50cmFuc2Zlcl9hZ2VudC5UcmFuc2ZlckFnZW50LnNldF90cmFuc2Zlcl9zY2hlZHVsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF90cmFuc2Zlcl9zY2hlZHVsZToKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToyNgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjI3CiAgICAvLyBhc3NlcnQgb3Blbl9kYXRlIDwgY2xvc3VyZV9kYXRlLCBlcnIuSU5WQUxJRF9TT1JUSU5HCiAgICBkdXAyCiAgICA8CiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbXVzdCBiZSBzb3J0ZWQgaW4gc3RyaWN0bHkgYXNjZW5kaW5nIG9yZGVyCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjI5CiAgICAvLyBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA9IG9wZW5fZGF0ZQogICAgYnl0ZWMgMjcgLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIHVuY292ZXIgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MzAKICAgIC8vIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlID0gY2xvc3VyZV9kYXRlCiAgICBieXRlYyAyOCAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MzEKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy50cmFuc2Zlcl9hZ2VudC5UcmFuc2ZlckFnZW50LnByaW1hcnlfZGlzdHJpYnV0aW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcHJpbWFyeV9kaXN0cmlidXRpb246CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjcxCiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5wcmltYXJ5X2RlYWxlciwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDIyIC8vIDB4NTIyMzUwNzI2OTZkNjE3Mjc5NDQ2NTYxNmM2NTcyMjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDMKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQ0CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDUKICAgIC8vIGFzc2VydCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBSSU1BUllfRElTVFJJQlVUSU9OX0NMT1NFRAogICAgYXNzZXJ0IC8vIFByaW1hcnkgZGlzdHJpYnV0aW9uIGlzIGNsb3NlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgY292ZXIgMwogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo0NwogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChob2xkaW5nX2FkZHJlc3MpCiAgICBzd2FwCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQ4CiAgICAvLyBhc3NlcnQgdW5pdHMgPiBVSW50NjQoMCksIGVyci5aRVJPX1VOSVRTCiAgICBkdXAKICAgIGFzc2VydCAvLyBDYW4gbm90IGRpc3RyaWJ1dGUgemVybyB1bml0cwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo1MAogICAgLy8gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCArIHVuaXRzIDw9IHNlbGYudG90YWxfdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICArCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgPD0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDktNTEKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCArIHVuaXRzIDw9IHNlbGYudG90YWxfdW5pdHMKICAgIC8vICksIGVyci5PVkVSX0RJU1RSSUJVVElPTgogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCByZW1haW5pbmcgRC1BU0EgdW5pdHMKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NTIKICAgIC8vIGlmIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI2IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlIGV4aXN0cwogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjU0CiAgICAvLyBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8PSBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI2IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlIGV4aXN0cwogICAgPD0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NTMtNTUKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPD0gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGUKICAgIC8vICksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TRUQKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBjbG9zZWQKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNDgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnJlc2VydmVkX3VuaXRzICs9IHVuaXRzCiAgICBkdXBuIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDMKICAgIGR1cAogICAgY292ZXIgMwogICAgKwogICAgaXRvYgogICAgcHVzaGludCA0MAogICAgc3dhcAogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NTgKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgKz0gdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICArCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NTkKICAgIC8vIHJldHVybiBzZWxmLnRvdGFsX3VuaXRzIC0gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIHN3YXAKICAgIC0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMudHJhbnNmZXJfYWdlbnQuVHJhbnNmZXJBZ2VudC50cmFuc2Zlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnRyYW5zZmVyOgogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo2MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NzUKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojc2CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE0NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTMKICAgIC8vIGlmIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI3IC8vICJ0cmFuc2Zlcl9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlIGV4aXN0cwogICAgYnogdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE1CiAgICAvLyBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI3IC8vICJ0cmFuc2Zlcl9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlIGV4aXN0cwogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPD0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTQtMTYKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICksIGVyci5DTE9TRURfVFJBTlNGRVIKICAgIGFzc2VydCAvLyBUcmFuc2ZlciBpcyBjbG9zZWQKCnRyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTcKICAgIC8vIGlmIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI4IC8vICJ0cmFuc2Zlcl9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgYnogdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE5CiAgICAvLyBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8IHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjggLy8gInRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICA8CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE4LTIwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDwgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGUKICAgIC8vICksIGVyci5DTE9TRURfVFJBTlNGRVIKICAgIGFzc2VydCAvLyBUcmFuc2ZlciBpcyBjbG9zZWQKCnRyYW5zZmVyX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODAKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIGRpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgOAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIGRpZyA1CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDkKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODMKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQoc2VuZGVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojg0CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGR1cAogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4NQogICAgLy8gYXNzZXJ0IHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MgIT0gcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzLCBlcnIuU0VMRl9UUkFOU0ZFUgogICAgdW5jb3ZlciAyCiAgICAhPQogICAgYXNzZXJ0IC8vIFNlbmRlciBhbmQgcmVjZWl2ZXIgbXVzdCBiZSBkaWZmZXJlbnQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODYKICAgIC8vIGFzc2VydCB1bml0cyA+IFVJbnQ2NCgwKSwgZXJyLk5VTExfVFJBTlNGRVIKICAgIGRpZyAxCiAgICBkdXAKICAgIGFzc2VydCAvLyBUcmFuc2ZlciB1bml0cyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojg3CiAgICAvLyBhc3NlcnQgdW5pdHMgPD0gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLCBlcnIuT1ZFUl9UUkFOU0ZFUgogICAgc3dhcAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIDw9CiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IHNlbmRlciB1bml0cyB0byB0cmFuc2ZlcgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzU2CiAgICAvLyBpZiBzZWxmLmV2ZW50X2N1cnNvciA+PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICA+PQogICAgYm56IHRyYW5zZmVyX2FmdGVyX2lubGluZWRfbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Fzc2VydF9ub19kdWVfZXZlbnRfcGVuZGluZ0AxMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzU4CiAgICAvLyBuZXh0X2VudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KHNlbGYuZXZlbnRfY3Vyc29yKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojc2MAogICAgLy8gbmV4dF9lbnRyeS5zY2hlZHVsZWRfdGltZSA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3NTktNzYxCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIG5leHRfZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gKSwgZXJyLlBFTkRJTkdfQUNUVVNfRVZFTlQKICAgIGFzc2VydCAvLyBBQ1RVUyBldmVudCBub3QgeWV0IGV4ZWN1dGVkCgp0cmFuc2Zlcl9hZnRlcl9pbmxpbmVkX21vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9hc3NlcnRfbm9fZHVlX2V2ZW50X3BlbmRpbmdAMTA6CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjkwCiAgICAvLyBzZWxmLl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBkaWcgMwogICAgZHVwCiAgICBjYWxsc3ViIF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjkxCiAgICAvLyBzZWxmLl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGRpZyAzCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGNhbGxzdWIgX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6OTIKICAgIC8vIHNlbGYuX3NldHRsZV9wb3NpdGlvbihzZW5kZXJfaG9sZGluZ19hZGRyZXNzKQogICAgY2FsbHN1YiBfc2V0dGxlX3Bvc2l0aW9uCiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6OTMKICAgIC8vIHNlbGYuX3NldHRsZV9wb3NpdGlvbihyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBjYWxsc3ViIF9zZXR0bGVfcG9zaXRpb24KICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE1MgogICAgLy8gYXNzZXJ0IHVuaXRzIDw9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLCBlcnIuT1ZFUl9UUkFOU0ZFUgogICAgZGlnIDUKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGRpZyAxCiAgICA8PQogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCBzZW5kZXIgdW5pdHMgdG8gdHJhbnNmZXIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNTMKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzIC09IHVuaXRzCiAgICBkaWcgMQogICAgLQogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBpbnRjXzMgLy8gMzIKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNDQKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzICs9IHVuaXRzCiAgICBkaWcgNQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgdW5jb3ZlciAyCiAgICArCiAgICBpdG9iCiAgICBpbnRjXzMgLy8gMzIKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgZGlnIDIKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF9nb3Zfc3VzcGVuc2lvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfZ292X3N1c3BlbnNpb246CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTY1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo3NwogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYXV0aG9yaXR5LCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjEgLy8gMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTg1CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGR1cAogICAgcHVzaGludCA0OAogICAgaW50Y18xIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIHB1c2hpbnQgNDgKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTg2CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfb3Blbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfb3BlbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2OAogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjMgLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQ0ZDYxNmU2MTY3NjU3MjIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMzkKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0VOREVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDIwMAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTAKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX2VuZGVkKCksIGVyci5VTkFVVEhPUklaRUQKICAgICEKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxMQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTIKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjEzCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzQKICAgIC8vIHVuaXRzPVVJbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzItNDIKICAgIC8vIHJldHVybiB0eXAuQWNjb3VudFBvc2l0aW9uKAogICAgLy8gICAgIHBheW1lbnRfYWRkcmVzcz1wYXltZW50X2FkZHJlc3MsCiAgICAvLyAgICAgdW5pdHM9VUludDY0KDApLAogICAgLy8gICAgIHJlc2VydmVkX3VuaXRzPVVJbnQ2NCgwKSwKICAgIC8vICAgICBzdXNwZW5kZWQ9RmFsc2UsCiAgICAvLyAgICAgc2V0dGxlZF9jdXJzb3I9VUludDY0KDApLAogICAgLy8gICAgIGludGVyZXN0X2NoZWNrcG9pbnQ9VUludDY0KDApLAogICAgLy8gICAgIHByaW5jaXBhbF9jaGVja3BvaW50PVVJbnQ2NCgwKSwKICAgIC8vICAgICBjbGFpbWFibGVfaW50ZXJlc3Q9VUludDY0KDApLAogICAgLy8gICAgIGNsYWltYWJsZV9wcmluY2lwYWw9VUludDY0KDApLAogICAgLy8gKQogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBieXRlYyA0MCAvLyAweDAwCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxNAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSBzZWxmLl9uZXdfYWNjb3VudF9wb3NpdGlvbihwYXltZW50X2FkZHJlc3MpCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjE1CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzczoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMzgKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcywgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgdW5jb3ZlciAzCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjM5CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0MAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDEKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcyA9IHBheW1lbnRfYWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDIKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF9nZXRfcG9zaXRpb25bcm91dGluZ10oKSAtPiB2b2lkOgphY2NvdW50X2dldF9wb3NpdGlvbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNTkKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9jcmVhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9jcmVhdGU6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5ODAKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSBhcnJhbmdlcgogICAgYnl0ZWMgMTggLy8gMHg1MjIzNDE3MjcyNjE2ZTY3NjU3MjIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTgxCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojk2OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfY29uZmlnW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfY29uZmlnOgogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojk4MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGxlbgogICAgcHVzaGludCAxMDcKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuTm9ybWFsaXplZEFjdHVzVGVybXMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDcyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLkluaXRpYWxLZXJuZWxTdGF0ZQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIGxlbgogICAgZGlnIDEKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgdHVwbGUgZW5jb2RpbmcKICAgIGR1cAogICAgcHVzaGludCAzNAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHRhaWwgcG9pbnRlciBhdCBpbmRleCAxIG9mICh1aW50OFszMl0sKGxlbit1dGY4W10pKQogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBjb3ZlciAzCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAzNgogICAgKwogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5Qcm9zcGVjdHVzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDEyCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwMTQtMTAxNQogICAgLy8gIyBDb25maWd1cmUgQ29udHJhY3QKICAgIC8vIHNlbGYuY29udHJhY3RfdHlwZSA9IHRlcm1zLmNvbnRyYWN0X3R5cGUuYXNfdWludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ5dGVjIDEyIC8vICJjb250cmFjdF90eXBlIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICBieiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjIwCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfQU5OKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMjEKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgcHVzaGludCAyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMjIKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMjMKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgcHVzaGludCA0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMjQKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYnogY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAOAoKY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUA3OgogICAgaW50Y18xIC8vIDEKCmNvbnRyYWN0X2NvbmZpZ19ib29sX21lcmdlQDk6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMjkKICAgIC8vIGFzc2VydCBzZWxmLl9pc19zdXBwb3J0ZWRfY29udHJhY3RfdHlwZShjb250cmFjdF90eXBlKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDE3CiAgICAvLyBzZWxmLl9zdG9yZV9jb250cmFjdF9jb25maWcoc2VsZi5jb250cmFjdF90eXBlLCB0ZXJtcywgaW5pdGlhbF9zdGF0ZSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBidXJ5IDIKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozMjUKICAgIC8vIGFzc2VydCB0ZXJtcy5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBkaWcgNAogICAgZHVwCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDgKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMyNwogICAgLy8gdGVybXMuZGF5X2NvdW50X2NvbnZlbnRpb24uYXNfdWludDY0KCkKICAgIHB1c2hpbnQgNTcKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyOTctMzAzCiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgIGJ6IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGRpZyA2CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyOTkKICAgIC8vIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGRpZyA2CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozMDAKICAgIC8vIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICBwdXNoaW50IDIKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI5Ny0zMDMKICAgIC8vIHJldHVybiBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzYwKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwSVNEQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjApLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDE2CiAgICBkaWcgNgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzAxCiAgICAvLyBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyOTctMzAzCiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgID09CiAgICBibnogY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUAxNgogICAgZGlnIDYKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMwMgogICAgLy8gVUludDY0KGVudW1zLkRDQ18zMEUzNjApLAogICAgcHVzaGludCA0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyOTctMzAzCiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgID09CiAgICBieiBjb250cmFjdF9jb25maWdfYm9vbF9mYWxzZUAxNwoKY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUAxNjoKICAgIGludGNfMSAvLyAxCgpjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUAxODoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMwOS0zMTEKICAgIC8vIGFzc2VydCBzZWxmLl9pc19zdXBwb3J0ZWRfZGF5X2NvdW50X2NvbnZlbnRpb24oCiAgICAvLyAgICAgZGF5X2NvdW50X2NvbnZlbnRpb24KICAgIC8vICksIGVyci5JTlZBTElEX0RBWV9DT1VOVF9DT05WRU5USU9OCiAgICBhc3NlcnQgLy8gSW52YWxpZCBkYXktY291bnQgY29udmVudGlvbiBJRAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzI5CiAgICAvLyBpZiBjb250cmFjdF90eXBlICE9IFVJbnQ2NChlbnVtcy5DVF9BTk4pOgogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgIT0KICAgIGJ6IGNvbnRyYWN0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDIwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozMzAKICAgIC8vIGFzc2VydCBub3QgdGVybXMuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBkaWcgNAogICAgcHVzaGludCA3ODYKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgoKY29udHJhY3RfY29uZmlnX2FmdGVyX2lmX2Vsc2VAMjA6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MDAKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MDEKICAgIC8vIGFzc2VydCBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID09IFVJbnQ2NCgwKSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBELUFTQSBhbHJlYWR5IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjgwMy04MDQKICAgIC8vICMgU2V0IERlbm9taW5hdGlvbiBBc3NldAogICAgLy8gc2VsZi5fYXNzZXJ0X2Rlbm9taW5hdGlvbl9hc3NldCh0ZXJtcy5kZW5vbWluYXRpb25fYXNzZXRfaWQpCiAgICBkaWcgNAogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojc2OC03NjkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gZGVub21pbmF0aW9uIHdpdGggQVNBCiAgICAvLyBfY3JlYXRvciwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfY3JlYXRvcihkZW5vbWluYXRpb25fYXNzZXRfaWQpCiAgICBkdXAKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojc3MAogICAgLy8gYXNzZXJ0IGV4aXN0cywgZXJyLklOVkFMSURfREVOT01JTkFUSU9OCiAgICBhc3NlcnQgLy8gRGVub21pbmF0aW9uIGFzc2V0IGlzIG5vdCBwcm9wZXJseSBzZXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojc3MwogICAgLy8gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgPSBkZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIGJ5dGVjIDQ0IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjgwNy04MDgKICAgIC8vICMgU2V0IFNldHRsZW1lbnQgQXNzZXQKICAgIC8vIHNlbGYuX2Fzc2VydF9zZXR0bGVtZW50X2Fzc2V0KHRlcm1zLnNldHRsZW1lbnRfYXNzZXRfaWQpCiAgICBkaWcgMQogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Nzc4CiAgICAvLyBzZXR0bGVtZW50X2Fzc2V0X2lkID09IHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgPT0KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojc3Ni03NzkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzZXR0bGVtZW50IGFzc2V0IGlzIHRoZSBkZW5vbWluYXRpb24gYXNzZXQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgLy8gKSwgZXJyLklOVkFMSURfU0VUVExFTUVOVF9BU1NFVAogICAgYXNzZXJ0IC8vIERpZmZlcmVudCBzZXR0bGVtZW50IGFzc2V0IG5vdCBzdXBwb3J0ZWQsIG11c3QgYmUgZXF1YWwgdG8gZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3ODIKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCA9IHNldHRsZW1lbnRfYXNzZXRfaWQKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3ODMtNzg5CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3ODgKICAgIC8vIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3ODYKICAgIC8vIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Nzg3CiAgICAvLyBhc3NldF9hbW91bnQ9MCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3ODMtNzg0CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojc4My03ODkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gc2V0dGxlbWVudCB3aXRoIEFTQQogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PTAsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MTEtODEyCiAgICAvLyAjIFVuaXRzCiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzID0gdGVybXMudG90YWxfdW5pdHMKICAgIGR1cAogICAgcHVzaGludCAxNwogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MTMKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDEwIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODE1LTgxNgogICAgLy8gIyBEYXktQ291bnQgQ29udmVudGlvbnMKICAgIC8vIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPSB0ZXJtcy5kYXlfY291bnRfY29udmVudGlvbi5hc191aW50NjQoKQogICAgYnl0ZWMgNDYgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgZGlnIDgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MTgtODE5CiAgICAvLyAjIFRpbWUKICAgIC8vIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlID0gdGVybXMuaW5pdGlhbF9leGNoYW5nZV9kYXRlCiAgICBkdXAKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAyNiAvLyAiaW5pdGlhbF9leGNoYW5nZV9kYXRlIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MjAKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IHRlcm1zLm1hdHVyaXR5X2RhdGUKICAgIGRpZyAxCiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNDUgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjgyMQogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gaW5pdGlhbF9zdGF0ZS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBkaWcgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBwdXNoaW50IDQ4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODIzLTgyNAogICAgLy8gIyBQcmluY2lwYWwKICAgIC8vIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPSB0ZXJtcy5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudAogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgZGlnIDEwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODI1CiAgICAvLyBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSB0ZXJtcy5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBkaWcgMwogICAgcHVzaGludCA3ODYKICAgIGdldGJpdAogICAgYnl0ZWMgMzQgLy8gImR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODI2CiAgICAvLyBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9IGluaXRpYWxfc3RhdGUub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBkaWcgMQogICAgcHVzaGludCAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjXzMgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MjgtODI5CiAgICAvLyAjIEludGVyZXN0CiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgPSBpbml0aWFsX3N0YXRlLmFjY3J1ZWRfaW50ZXJlc3QKICAgIGRpZyAxCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MzEtODMyCiAgICAvLyAjIEludGVyZXN0IFJhdGUKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gaW5pdGlhbF9zdGF0ZS5ub21pbmFsX2ludGVyZXN0X3JhdGUKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODMzCiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBpbml0aWFsX3N0YXRlLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UKICAgIGRpZyAxCiAgICBwdXNoaW50IDI0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MzQKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQgPSB0ZXJtcy5yYXRlX3Jlc2V0X3NwcmVhZAogICAgZGlnIDMKICAgIHB1c2hpbnQgNTgKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzNSAvLyAicmF0ZV9yZXNldF9zcHJlYWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODM1CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciA9IHRlcm1zLnJhdGVfcmVzZXRfbXVsdGlwbGllcgogICAgZGlnIDMKICAgIHB1c2hpbnQgNjYKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzNiAvLyAicmF0ZV9yZXNldF9tdWx0aXBsaWVyIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjgzNgogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X2Zsb29yID0gdGVybXMucmF0ZV9yZXNldF9mbG9vcgogICAgZGlnIDMKICAgIHB1c2hpbnQgNzQKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAyOSAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MzcKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9jYXAgPSB0ZXJtcy5yYXRlX3Jlc2V0X2NhcAogICAgZGlnIDMKICAgIHB1c2hpbnQgODIKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzMCAvLyAicmF0ZV9yZXNldF9jYXAiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODM4CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfbmV4dCA9IHRlcm1zLnJhdGVfcmVzZXRfbmV4dAogICAgZGlnIDMKICAgIHB1c2hpbnQgOTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzNyAvLyAicmF0ZV9yZXNldF9uZXh0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjgzOQogICAgLy8gc2VsZi5oYXNfcmF0ZV9yZXNldF9mbG9vciA9IHRlcm1zLmhhc19yYXRlX3Jlc2V0X2Zsb29yCiAgICBkaWcgMwogICAgcHVzaGludCA3ODQKICAgIGdldGJpdAogICAgYnl0ZWMgMzggLy8gImhhc19yYXRlX3Jlc2V0X2Zsb29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojg0MAogICAgLy8gc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgPSB0ZXJtcy5oYXNfcmF0ZV9yZXNldF9jYXAKICAgIGRpZyAzCiAgICBwdXNoaW50IDc4NQogICAgZ2V0Yml0CiAgICBieXRlYyAzOSAvLyAiaGFzX3JhdGVfcmVzZXRfY2FwIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojg0Mi04NDMKICAgIC8vICMgU2NhbGluZwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSA9IHRlcm1zLmZpeGVkX3BvaW50X3NjYWxlCiAgICB1bmNvdmVyIDMKICAgIHB1c2hpbnQgOTkKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4NDUtODQ2CiAgICAvLyAjIFNjaGVkdWxlIFByb2Nlc3NpbmcKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yID0gaW5pdGlhbF9zdGF0ZS5ldmVudF9jdXJzb3IKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4NDgtODQ5CiAgICAvLyAjIFBlci1Vbml0IEZpeGVkLVBvaW50IEluZGV4ZXMKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCA9IGluaXRpYWxfc3RhdGUuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleAogICAgZGlnIDEKICAgIHB1c2hpbnQgNTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4NTAKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggPSBpbml0aWFsX3N0YXRlLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4CiAgICBkaWcgMQogICAgcHVzaGludCA2NAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4NTItODUzCiAgICAvLyAjIFJlc2VydmVkIEFtb3VudCAoZm9yIGV4ZWN1dGVkIGNhc2hmbG93cykKICAgIC8vIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODU0CiAgICAvLyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODU2CiAgICAvLyBhc3NlcnQgdGVybXMuaW5pdGlhbF9leGNoYW5nZV9kYXRlID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsIGVyci5JTlZBTElEX0lFRAogICAgZGlnIDIKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgID4KICAgIGFzc2VydCAvLyBJRUQgbXVzdCBiZSBzZXQgaW4gdGhlIGZ1dHVyZQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODU3CiAgICAvLyBhc3NlcnQgdGVybXMuaW5pdGlhbF9leGNoYW5nZV9kYXRlID4gaW5pdGlhbF9zdGF0ZS5zdGF0dXNfZGF0ZSwgZXJyLklOVkFMSURfSUVECiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICA8CiAgICBhc3NlcnQgLy8gSUVEIG11c3QgYmUgc2V0IGluIHRoZSBmdXR1cmUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojg1OAogICAgLy8gYXNzZXJ0IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA8IHRlcm1zLm1hdHVyaXR5X2RhdGUsIGVyci5JTlZBTElEX0lFRAogICAgPAogICAgYXNzZXJ0IC8vIElFRCBtdXN0IGJlIHNldCBpbiB0aGUgZnV0dXJlCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDE5LTEwMjAKICAgIC8vICMgTm90YXJpemUgcHJvc3BlY3R1cyAob3B0aW9uYWwpCiAgICAvLyBzZWxmLnByb3NwZWN0dXNfaGFzaCA9IHByb3NwZWN0dXMuaGFzaC5ieXRlcwogICAgZGlnIDIKICAgIGV4dHJhY3QgMCAzMgogICAgYnl0ZWMgNDIgLy8gInByb3NwZWN0dXNfaGFzaCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDIxCiAgICAvLyBzZWxmLnByb3NwZWN0dXNfdXJsID0gcHJvc3BlY3R1cy51cmwKICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgYnl0ZWMgNDMgLy8gInByb3NwZWN0dXNfdXJsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwMjIKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNvbnRyYWN0X2NvbmZpZ19ib29sX2ZhbHNlQDE3OgogICAgaW50Y18wIC8vIDAKICAgIGIgY29udHJhY3RfY29uZmlnX2Jvb2xfbWVyZ2VAMTgKCmNvbnRyYWN0X2NvbmZpZ19ib29sX2ZhbHNlQDg6CiAgICBpbnRjXzAgLy8gMAogICAgYiBjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUA5CgoKLy8gbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3Rfc2NoZWR1bGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9zY2hlZHVsZToKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gMwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTAyNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBzd2FwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgMwogICAgZHVwCiAgICBwdXNoaW50IDY1CiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIHVuY292ZXIgMgogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8c21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5FeGVjdXRpb25TY2hlZHVsZUVudHJ5PgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTAzOQogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDQyCiAgICAvLyBjb250cmFjdF90eXBlPXNlbGYuY29udHJhY3RfdHlwZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBjb3ZlciAzCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODc0CiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIEQtQVNBIGFscmVhZHkgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODc1LTg3NwogICAgLy8gYXNzZXJ0IHNjaGVkdWxlX3BhZ2UubGVuZ3RoIDw9IFVJbnQ2NCgKICAgIC8vICAgICBjc3QuU0NIRURVTEVfUEFHRV9TSVpFCiAgICAvLyApLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBkdXAKICAgIHB1c2hpbnQgMTYKICAgIDw9CiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4NzgKICAgIC8vIGFzc2VydCBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID4gVUludDY0KDApLCBlcnIuVEVSTVNfTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMCAvLyAiaW5pdGlhbF9leGNoYW5nZV9hbW91bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0EgdGVybXMgbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojg4MAogICAgLy8gcGFnZV9jdXJzb3IgPSBzY2hlZHVsZV9wYWdlX2luZGV4ICogVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpCiAgICBzd2FwCiAgICBwdXNoaW50IDE2CiAgICAqCiAgICBzd2FwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4ODcKICAgIC8vICsgcGFnZV9sZW5ndGggKiBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19QRVJfRU5UUllfQlVER0VUKQogICAgcHVzaGludCAxMDAKICAgICoKICAgIHB1c2hpbnQgMTUxMAogICAgKwoKY29udHJhY3Rfc2NoZWR1bGVfd2hpbGVfdG9wQDI6CiAgICBkdXAKICAgIGdsb2JhbCBPcGNvZGVCdWRnZXQKICAgID4KICAgIGJ6IGNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX3doaWxlQDUKICAgIGl0eG5fYmVnaW4KICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBwdXNoaW50IDUgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICBieXRlYyA0NyAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW0KICAgIGJ5dGVjIDQ3IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBiIGNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEAyCgpjb250cmFjdF9zY2hlZHVsZV9hZnRlcl93aGlsZUA1OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODkwCiAgICAvLyBpbmRleCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTAKCmNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEA2OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODkxCiAgICAvLyB3aGlsZSBpbmRleCA8IHBhZ2VfbGVuZ3RoOgogICAgZGlnIDkKICAgIGRpZyA0CiAgICA8CiAgICBieiBjb250cmFjdF9zY2hlZHVsZV9hZnRlcl93aGlsZUAxNQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODkyLTg5MwogICAgLy8gZW50cnkgPSBzY2hlZHVsZV9wYWdlW2luZGV4XS5jb3B5KCkKICAgIC8vIGVudHJ5X2V2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBkaWcgNAogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgYnVyeSAxMwogICAgZGlnIDEwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgNjUKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODkzCiAgICAvLyBlbnRyeV9ldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4OTItODkzCiAgICAvLyBlbnRyeSA9IHNjaGVkdWxlX3BhZ2VbaW5kZXhdLmNvcHkoKQogICAgLy8gZW50cnlfZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGludGNfMiAvLyA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4OTMKICAgIC8vIGVudHJ5X2V2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBnZXRieXRlCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgMTQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojg5NAogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X2lkID09IHBhZ2VfY3Vyc29yICsgaW5kZXgsIGVyci5JTlZBTElEX0VWRU5UX0lECiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEzCiAgICBkaWcgNQogICAgdW5jb3ZlciA0CiAgICArCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4OTUtODk3CiAgICAvLyBzZWxmLl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBlbnRyeV9ldmVudF90eXBlCiAgICAvLyApCiAgICBkaWcgNQogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODk4CiAgICAvLyBhc3NlcnQgZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgc3dhcAogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4OTkKICAgIC8vIGlmIGVudHJ5LmV2ZW50X2lkID4gVUludDY0KDApOgogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxMgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTAwCiAgICAvLyBpZiBpbmRleCA+IFVJbnQ2NCgwKToKICAgIGRpZyA5CiAgICBieiBjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlAMTAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjkwMQogICAgLy8gcHJldmlvdXNfZW50cnkgPSBzY2hlZHVsZV9wYWdlW2luZGV4IC0gVUludDY0KDEpXS5jb3B5KCkKICAgIGRpZyA5CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgcHVzaGludCA2NQogICAgKgogICAgZGlnIDEyCiAgICBzd2FwCiAgICBwdXNoaW50IDY1CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTE6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5MTYKICAgIC8vIHByZXZpb3VzX2VudHJ5LnNjaGVkdWxlZF90aW1lIDw9IGVudHJ5LnNjaGVkdWxlZF90aW1lCiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgOAogICAgPD0KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjkxNS05MTcKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgcHJldmlvdXNfZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gZW50cnkuc2NoZWR1bGVkX3RpbWUKICAgIC8vICksIGVyci5JTlZBTElEX1NPUlRJTkcKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBtdXN0IGJlIHNvcnRlZCBpbiBzdHJpY3RseSBhc2NlbmRpbmcgb3JkZXIKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTI6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5MTgKICAgIC8vIGlmIGVudHJ5LmV2ZW50X2lkID09IFVJbnQ2NCgwKToKICAgIGRpZyA4CiAgICBibnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxNAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTE5LTkyMQogICAgLy8gYXNzZXJ0IGVudHJ5X2V2ZW50X3R5cGUgPT0gVUludDY0KAogICAgLy8gICAgIGVudW1zLkVWVF9JRUQKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZGlnIDEwCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTQ6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5MjIKICAgIC8vIGluZGV4ICs9IFVJbnQ2NCgxKQogICAgZGlnIDkKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEwCiAgICBiIGNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEA2Cgpjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlAMTA6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5MDMtOTA1CiAgICAvLyAjIFRoZSBmaXJzdCBlbnRyeSBvZiBhIHBhZ2UgbXVzdCBzdGlsbCBiZSBvcmRlcmVkIGFmdGVyIHRoZQogICAgLy8gIyBsYXN0IGVudHJ5IG9mIHRoZSBwcmV2aW91cyBwYWdlLgogICAgLy8gYXNzZXJ0IHNjaGVkdWxlX3BhZ2VfaW5kZXggPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0VWRU5UX0lECiAgICBkaWcgNgogICAgZHVwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBpZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTA2CiAgICAvLyBwcmV2aW91c19wYWdlX2luZGV4ID0gc2NoZWR1bGVfcGFnZV9pbmRleCAtIFVJbnQ2NCgxKQogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjkwOAogICAgLy8gcHJldmlvdXNfcGFnZV9pbmRleCBpbiBzZWxmLnNjaGVkdWxlX3BhZ2UKICAgIGl0b2IKICAgIGJ5dGVjIDMxIC8vIDB4NTMyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTA3LTkwOQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBwcmV2aW91c19wYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZQogICAgLy8gKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTEwLTkxMQogICAgLy8gcHJldmlvdXNfcGFnZSA9IHNlbGYuc2NoZWR1bGVfcGFnZVtwcmV2aW91c19wYWdlX2luZGV4XS5jb3B5KCkKICAgIC8vIGFzc2VydCBwcmV2aW91c19wYWdlLmxlbmd0aCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGludCAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTExCiAgICAvLyBhc3NlcnQgcHJldmlvdXNfcGFnZS5sZW5ndGggPiBVSW50NjQoMCksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGR1cAogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTEzCiAgICAvLyBwcmV2aW91c19wYWdlLmxlbmd0aCAtIFVJbnQ2NCgxKQogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjkxMi05MTQKICAgIC8vIHByZXZpb3VzX2VudHJ5ID0gcHJldmlvdXNfcGFnZVsKICAgIC8vICAgICBwcmV2aW91c19wYWdlLmxlbmd0aCAtIFVJbnQ2NCgxKQogICAgLy8gXS5jb3B5KCkKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgMgogICAgKwogICAgcHVzaGludCA2NQogICAgYm94X2V4dHJhY3QKICAgIGIgY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxMQoKY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfd2hpbGVAMTU6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMDAKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHNjaGVkdWxlX3BhZ2UuY29weSgpCiAgICBkaWcgNgogICAgaXRvYgogICAgYnl0ZWMgMzEgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBkaWcgNQogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTI1CiAgICAvLyBpZiBpc19sYXN0X3BhZ2U6CiAgICBkaWcgNQogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxNwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTI3CiAgICAvLyBzY2hlZHVsZV9wYWdlX2luZGV4ICogVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpICsgcGFnZV9sZW5ndGgKICAgIGRpZyAxCiAgICBkaWcgNAogICAgKwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTI2CiAgICAvLyBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50ID0gKAogICAgYnl0ZWMgNCAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5MjYtOTI4CiAgICAvLyBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50ID0gKAogICAgLy8gICAgIHNjaGVkdWxlX3BhZ2VfaW5kZXggKiBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkgKyBwYWdlX2xlbmd0aAogICAgLy8gKQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjkyOQogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgcHVzaGludCA1MAogICAgYXBwX2dsb2JhbF9wdXQKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTc6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDQ3CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwMjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmV4ZWN1dGVfaWVkW3JvdXRpbmddKCkgLT4gdm9pZDoKZXhlY3V0ZV9pZWQ6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA1NwogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDU4CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA1OQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwNjEKICAgIC8vIGFzc2VydCBzZWxmLmV2ZW50X2N1cnNvciA8IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICBkaWcgMQogICAgPgogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgY3Vyc29yCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDYyCiAgICAvLyBlbnRyeSA9IHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLmV2ZW50X2N1cnNvcikKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA2MwogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X3R5cGUgPT0gYXJjNC5VSW50OChlbnVtcy5FVlRfSUVEKSwgZXJyLklOVkFMSURfRVZFTlRfVFlQRQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgZHVwCiAgICBwdXNoYnl0ZXMgMHgwMQogICAgYj09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCB0eXBlCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDY3CiAgICAvLyBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIGRpZyAxCiAgICBleHRyYWN0IDAgOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA2OQogICAgLy8gc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICBkaWcgMgogICAgZXh0cmFjdCA5IDgKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwNzAKICAgIC8vIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgZGlnIDMKICAgIGV4dHJhY3QgMTcgOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA3MQogICAgLy8gcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZGlnIDQKICAgIGV4dHJhY3QgMjUgOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA3MwogICAgLy8gbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9ZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBkaWcgNQogICAgZXh0cmFjdCAzMyA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDc0CiAgICAvLyBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICBkaWcgNgogICAgZXh0cmFjdCA0MSA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDc1CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1lbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIGRpZyA3CiAgICBleHRyYWN0IDQ5IDgKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwNzYKICAgIC8vIGZsYWdzPWVudHJ5LmZsYWdzLAogICAgZGlnIDgKICAgIGV4dHJhY3QgNTcgOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA2Ni0xMDc3CiAgICAvLyB0eXAuT2JzZXJ2ZWRFdmVudFJlcXVlc3QoCiAgICAvLyAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBvYnNlcnZlZF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1lbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9ZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9ZW50cnkuZmxhZ3MsCiAgICAvLyApLAogICAgdW5jb3ZlciA3CiAgICB1bmNvdmVyIDgKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA3MgogICAgLy8gb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA2Ni0xMDc3CiAgICAvLyB0eXAuT2JzZXJ2ZWRFdmVudFJlcXVlc3QoCiAgICAvLyAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBvYnNlcnZlZF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1lbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9ZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9ZW50cnkuZmxhZ3MsCiAgICAvLyApLAogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwNjQtMTA3OAogICAgLy8gc2VsZi5fYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkoCiAgICAvLyAgICAgZW50cnksCiAgICAvLyAgICAgdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0KAogICAgLy8gICAgICAgICBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIC8vICAgICAgICAgZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgLy8gICAgICAgICBzY2hlZHVsZWRfdGltZT1lbnRyeS5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICAgICAgYWNjcnVhbF9mYWN0b3I9ZW50cnkuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICAgICAgb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPWVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPWVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgICAgICBmbGFncz1lbnRyeS5mbGFncywKICAgIC8vICAgICApLAogICAgLy8gKQogICAgY2FsbHN1YiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkKICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA3OQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDQ5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5hcHBseV9ub25fY2FzaF9ldmVudFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFwcGx5X25vbl9jYXNoX2V2ZW50OgogICAgaW50Y18wIC8vIDAKICAgIGR1cG4gNAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwODEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwbiAyCiAgICBsZW4KICAgIHB1c2hpbnQgNzMKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuT2JzZXJ2ZWRFdmVudFJlcXVlc3QKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDk1CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA5NgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwOTgKICAgIC8vIGlmIHBheWxvYWQuZmxhZ3MgJiBVSW50NjQoZW51bXMuRkxBR19PQlNFUlZFRF9FVkVOVCk6CiAgICBwdXNoaW50IDY1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBwdXNoaW50IDQKICAgICYKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjMzCiAgICAvLyByZXR1cm4gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9DTE0pCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIHB1c2hpbnQgNQogICAgPT0KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwOTkKICAgIC8vIGFzc2VydCBzZWxmLl9zdXBwb3J0c19vYnNlcnZlZF9ldmVudHMoKSwgZXJyLk9CU0VSVkVEX0VWRU5UX1JFUVVJUkVECiAgICBhc3NlcnQgLy8gT2JzZXJ2ZWQgZXZlbnQgcmVxdWlyZWQgdG8gZXhlY3V0ZSB0aGlzIGFjdGlvbgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEwMAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMzMKICAgIC8vIHJldHVybiBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0NMTSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgZHVwCiAgICBwdXNoaW50IDUKICAgID09CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5MzgKICAgIC8vIGFzc2VydCBzZWxmLl9zdXBwb3J0c19vYnNlcnZlZF9ldmVudHMoKSwgZXJyLk9CU0VSVkVEX0VWRU5UX1JFUVVJUkVECiAgICBhc3NlcnQgLy8gT2JzZXJ2ZWQgZXZlbnQgcmVxdWlyZWQgdG8gZXhlY3V0ZSB0aGlzIGFjdGlvbgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTM5CiAgICAvLyBhc3NlcnQgcGF5bG9hZC5ldmVudF9pZCA9PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LCBlcnIuSU5WQUxJRF9FVkVOVF9JRAogICAgZGlnIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgNwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NDEKICAgIC8vIHNlbGYuY29udHJhY3RfdHlwZSwgcGF5bG9hZC5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBkdXAKICAgIGV4dHJhY3QgOCAxCiAgICBidXJ5IDEyCiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTQwLTk0MgogICAgLy8gc2VsZi5fYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgc2VsZi5jb250cmFjdF90eXBlLCBwYXlsb2FkLmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIC8vICkKICAgIGNhbGxzdWIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NDQKICAgIC8vIHBhZ2VfaW5kZXggPSBzZWxmLl9zY2hlZHVsZV9wYWdlX2luZGV4KHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxOTAKICAgIC8vIHJldHVybiBldmVudF9pZCAvLyBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkKICAgIHB1c2hpbnQgMTYKICAgIC8KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojk0NQogICAgLy8gcGFnZSA9IHR5cC5FeGVjdXRpb25TY2hlZHVsZVBhZ2UoKQogICAgcHVzaGJ5dGVzIDB4MDAwMAogICAgYnVyeSA3CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NDYKICAgIC8vIGlmIHBhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlOgogICAgaXRvYgogICAgYnl0ZWMgMzEgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA5CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMjcKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojk0NwogICAgLy8gcGFnZSA9IHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XS5jb3B5KCkKICAgIGRpZyA3CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidXJ5IDcKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX3BhZ2UgZW50cnkgZXhpc3RzCgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDI3OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTQ4CiAgICAvLyBhc3NlcnQgcGFnZS5sZW5ndGggPCBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGRpZyA1CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgMTYKICAgIDwKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojk1MwogICAgLy8gc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIGRpZyAzCiAgICBkdXAKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NTQKICAgIC8vIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICBkaWcgMQogICAgZXh0cmFjdCAxNyA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NTUKICAgIC8vIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZGlnIDIKICAgIGV4dHJhY3QgMjUgOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTU2CiAgICAvLyBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDMKICAgIGV4dHJhY3QgNDEgOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTU3CiAgICAvLyBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIGRpZyA0CiAgICBleHRyYWN0IDQ5IDgKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojk1OAogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIHVuY292ZXIgNQogICAgZXh0cmFjdCA1NyA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NTAtOTYwCiAgICAvLyB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1wYXlsb2FkLmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9cGF5bG9hZC5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPXBheWxvYWQucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXBheWxvYWQubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICkKICAgIGRpZyAxMQogICAgaXRvYgogICAgZGlnIDE4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMwogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NDktOTYxCiAgICAvLyBwYWdlLmFwcGVuZCgKICAgIC8vICAgICB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9cGF5bG9hZC5ldmVudF9pZCwKICAgIC8vICAgICAgICAgZXZlbnRfdHlwZT1wYXlsb2FkLmV2ZW50X3R5cGUsCiAgICAvLyAgICAgICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIC8vICAgICAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICAgICApCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NjIKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHBhZ2UuY29weSgpCiAgICBkaWcgOAogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojk2MwogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTAzCiAgICAvLyBhc3NlcnQgZXZlbnRfaWQgPT0gc2VsZi5ldmVudF9jdXJzb3IsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBjdXJzb3IKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExMDQKICAgIC8vIGVudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KGV2ZW50X2lkKQogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEwNgogICAgLy8gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgYnVyeSAxMAogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozNjQKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzY1CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzYzLTM3MAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjM2NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9SUiksCiAgICBwdXNoaW50IDEyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzY3CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICBwdXNoaW50IDExCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzY4CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgcHVzaGludCAxOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzYzLTM3MAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjM2OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBieiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX2ZhbHNlQDE2CgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX3RydWVAMTU6CiAgICBpbnRjXzEgLy8gMQoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9tZXJnZUAxNzoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExMDUtMTEwNwogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2lzX25vbl9jYXNoKAogICAgLy8gICAgIGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIC8vICksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IHR5cGUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExMDgKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlICE9IGFyYzQuVUludDgoZW51bXMuRVZUX0lFRCksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGRpZyA4CiAgICBwdXNoYnl0ZXMgMHgwMQogICAgYiE9CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCB0eXBlCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozNzQKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluIChVSW50NjQoZW51bXMuRVZUX1JSKSwgVUludDY0KGVudW1zLkVWVF9SUkYpKQogICAgZGlnIDQKICAgIHB1c2hpbnQgMTIKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDIxCiAgICBkaWcgNAogICAgcHVzaGludCAxMQogICAgPT0KICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfZmFsc2VAMjIKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAyMToKICAgIGludGNfMSAvLyAxCgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX21lcmdlQDIzOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEwOQogICAgLy8gaWYgc2VsZi5fZXZlbnRfaXNfcmF0ZV9yZXNldChlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpKToKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Vsc2VfYm9keUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODAKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLm9ic2VydmVyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjQgLy8gMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTEzCiAgICAvLyBzZWxmLl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeShlbnRyeSwgcGF5bG9hZCkKICAgIGRpZyA2CiAgICBkaWcgMgogICAgY2FsbHN1YiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkKICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTExNAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDgxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Vsc2VfYm9keUA1OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTExMgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICBiIGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VANgoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9mYWxzZUAyMjoKICAgIGludGNfMCAvLyAwCiAgICBiIGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfbWVyZ2VAMjMKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfZmFsc2VAMTY6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX21lcmdlQDE3CgoKLy8gbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuZ2V0X2NvbnRyYWN0X3N0YXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2NvbnRyYWN0X3N0YXRlOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBkdXAKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEyMQogICAgLy8gY29udHJhY3RfdHlwZT1hcmM0LlVJbnQ4KHNlbGYuY29udHJhY3RfdHlwZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzIgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExMjMKICAgIC8vIHRvdGFsX3VuaXRzPXNlbGYudG90YWxfdW5pdHMsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEyNAogICAgLy8gcmVzZXJ2ZWRfdW5pdHNfdG90YWw9c2VsZi5yZXNlcnZlZF91bml0c190b3RhbCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTI1CiAgICAvLyBpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudD1zZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExMjYKICAgIC8vIGV2ZW50X2N1cnNvcj1zZWxmLmV2ZW50X2N1cnNvciwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEyNwogICAgLy8gc2NoZWR1bGVfZW50cnlfY291bnQ9c2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExMjgKICAgIC8vIG91dHN0YW5kaW5nX3ByaW5jaXBhbD1zZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEyOQogICAgLy8gaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZT1zZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEzMAogICAgLy8gbm9taW5hbF9pbnRlcmVzdF9yYXRlPXNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTMxCiAgICAvLyBhY2NydWVkX2ludGVyZXN0PXNlbGYuYWNjcnVlZF9pbnRlcmVzdCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTMyCiAgICAvLyBjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4PXNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEzMwogICAgLy8gY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXg9c2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTM0CiAgICAvLyByZXNlcnZlZF9pbnRlcmVzdD1zZWxmLnJlc2VydmVkX2ludGVyZXN0LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExMzUKICAgIC8vIHJlc2VydmVkX3ByaW5jaXBhbD1zZWxmLnJlc2VydmVkX3ByaW5jaXBhbCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExMjAtMTEzNgogICAgLy8gcmV0dXJuIHR5cC5LZXJuZWxTdGF0ZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlPWFyYzQuVUludDgoc2VsZi5jb250cmFjdF90eXBlKSwKICAgIC8vICAgICBzdGF0dXM9c2VsZi5zdGF0dXMsCiAgICAvLyAgICAgdG90YWxfdW5pdHM9c2VsZi50b3RhbF91bml0cywKICAgIC8vICAgICByZXNlcnZlZF91bml0c190b3RhbD1zZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsLAogICAgLy8gICAgIGluaXRpYWxfZXhjaGFuZ2VfYW1vdW50PXNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQsCiAgICAvLyAgICAgZXZlbnRfY3Vyc29yPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgLy8gICAgIHNjaGVkdWxlX2VudHJ5X2NvdW50PXNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQsCiAgICAvLyAgICAgb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2U9c2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlLAogICAgLy8gICAgIG5vbWluYWxfaW50ZXJlc3RfcmF0ZT1zZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBhY2NydWVkX2ludGVyZXN0PXNlbGYuYWNjcnVlZF9pbnRlcmVzdCwKICAgIC8vICAgICBjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4PXNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCwKICAgIC8vICAgICBjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleD1zZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4LAogICAgLy8gICAgIHJlc2VydmVkX2ludGVyZXN0PXNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QsCiAgICAvLyAgICAgcmVzZXJ2ZWRfcHJpbmNpcGFsPXNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsLAogICAgLy8gKQogICAgdW5jb3ZlciAxNAogICAgaXRvYgogICAgdW5jb3ZlciAxNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDEzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDEwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgOQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDgKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTE2CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5nZXRfbmV4dF9kdWVfZXZlbnRbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfbmV4dF9kdWVfZXZlbnQ6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTE0MgogICAgLy8gaWYgc2VsZi5ldmVudF9jdXJzb3IgPj0gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgPj0KICAgIGJ6IGdldF9uZXh0X2R1ZV9ldmVudF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExNDQKICAgIC8vIGV2ZW50X2lkPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTQzLTExNTMKICAgIC8vIHJldHVybiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1zZWxmLmV2ZW50X2N1cnNvciwKICAgIC8vICAgICBldmVudF90eXBlPWFyYzQuVUludDgoMCksCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9VUludDY0KDApLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9VUludDY0KDApLAogICAgLy8gICAgIGZsYWdzPVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGl0b2IKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExNDUKICAgIC8vIGV2ZW50X3R5cGU9YXJjNC5VSW50OCgwKSwKICAgIGJ5dGVjIDQwIC8vIDB4MDAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExNDMtMTE1MwogICAgLy8gcmV0dXJuIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgIGV2ZW50X2lkPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgLy8gICAgIGV2ZW50X3R5cGU9YXJjNC5VSW50OCgwKSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1VSW50NjQoMCksCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1VSW50NjQoMCksCiAgICAvLyAgICAgZmxhZ3M9VUludDY0KDApLAogICAgLy8gKQogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTQ2CiAgICAvLyBzY2hlZHVsZWRfdGltZT1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTE0My0xMTUzCiAgICAvLyByZXR1cm4gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkoCiAgICAvLyAgICAgZXZlbnRfaWQ9c2VsZi5ldmVudF9jdXJzb3IsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1hcmM0LlVJbnQ4KDApLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPVVJbnQ2NCgwKSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249VUludDY0KDApLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPVVJbnQ2NCgwKSwKICAgIC8vICAgICBmbGFncz1VSW50NjQoMCksCiAgICAvLyApCiAgICBpdG9iCiAgICBzd2FwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKCmdldF9uZXh0X2R1ZV9ldmVudF9hZnRlcl9pbmxpbmVkX21vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmdldF9uZXh0X2R1ZV9ldmVudEA0OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEzOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpnZXRfbmV4dF9kdWVfZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTE1NAogICAgLy8gcmV0dXJuIHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLmV2ZW50X2N1cnNvcikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgZ2V0X25leHRfZHVlX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuZ2V0X25leHRfZHVlX2V2ZW50QDQKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5jb250cmFjdF91cGRhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF91cGRhdGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTUzLTE1NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGdyYW50cyB0aGUgdXBkYXRlIHBlcm1pc3Npb25zIHRvIHRoZSBBcnJhbmdlci4KICAgIC8vICMg4pqg77iPIFdBUk5JTkc6IEFwcGxpY2F0aW9uIHVwZGF0ZXMgbXVzdCBiZSBleGVjdXRlZCBWRVJZIGNhcmVmdWxseSwgYXMgdGhleQogICAgLy8gIyBtaWdodCBpbnRyb2R1Y2UgYnJlYWtpbmcgY2hhbmdlcy4KICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfcm90YXRlX2FycmFuZ2VyW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19yb3RhdGVfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2OQogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTcwCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gbmV3X2FycmFuZ2VyCiAgICBieXRlYyAxOCAvLyAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTcxCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfc2V0X29wX2RhZW1vbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfc2V0X29wX2RhZW1vbjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTg0CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODUKICAgIC8vIHNlbGYub3BfZGFlbW9uLnZhbHVlID0gYWRkcmVzcwogICAgYnl0ZWMgMjUgLy8gMHg1MjIzNGY3MDQ0NjE2NTZkNmY2ZTIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4NgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTczCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2Fzc2lnbl9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19hc3NpZ25fcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDE2CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLlJvbGVWYWxpZGl0eQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjExCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMgogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgcHVzaGludCAyMAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTAzCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gcm9sZV9hZGRyZXNzCiAgICBieXRlYyAxOCAvLyAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMKICAgIGRpZyAzCiAgICBhcHBfZ2xvYmFsX3B1dAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTQKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDYKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIGR1cAogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnRfbWFuYWdlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMyAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwOAogICAgLy8gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMiAvLyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTIKICAgIC8vIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIGR1cAogICAgcHVzaGludCA2MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE1CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMzIgLy8gMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE2CiAgICAvLyBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExOAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMSAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIwCiAgICAvLyBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMwogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgODAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIzCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI0IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI0CiAgICAvLyBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3Jldm9rZV9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19yZXZva2Vfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzUKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzNgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzcKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCkpCiAgICBidG9pCiAgICBkdXBuIDIKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCAhPSBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksIGVyci5JTlZBTElEX1JPTEUKICAgIGR1cAogICAgcHVzaGludCAyMAogICAgIT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyOAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIzIC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0NGQ2MTZlNjE2NzY1NzIyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMwCiAgICAvLyBkZWwgc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzOQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjE2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIyIC8vIDB4NTIyMzUwNzI2OTZkNjE3Mjc5NDQ2NTYxNmM2NTcyMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNAogICAgLy8gZGVsIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjM4CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIGR1cAogICAgcHVzaGludCA2MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAzMiAvLyAweDUyMjM1NDcyNzU3Mzc0NjU2NTIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzgKICAgIC8vIGRlbCBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjM4CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDEKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hdXRob3JpdHksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjEgLy8gMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MgogICAgLy8gZGVsIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzOAogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDQKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDgwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI0IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ2CiAgICAvLyBkZWwgc2VsZi5vYnNlcnZlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ292X2Fzc2V0X3N1c3BlbnNpb25bcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dvdl9hc3NldF9zdXNwZW5zaW9uOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kICAjIFRPRE86IFVwZGF0ZSBzcGVjcyBhbmQgYWRkIHRlc3QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzcKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDIxIC8vIDB4NTIyMzQxNzU3NDY4NmY3MjY5NzQ3OTIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU3CiAgICAvLyBzZWxmLmFzc2V0X3N1c3BlbmRlZCA9IHN1c3BlbmRlZAogICAgYnl0ZWMgMzMgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU4CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCAgIyBUT0RPOiBVcGRhdGUgc3BlY3MgYW5kIGFkZCB0ZXN0CiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYXJyYW5nZXJbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNjgKICAgIC8vIHJldHVybiBzZWxmLmFycmFuZ2VyLnZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTggLy8gMHg1MjIzNDE3MjcyNjE2ZTY3NjU3MjIzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJyYW5nZXIgZXhpc3RzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjYwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9hZGRyZXNzX3JvbGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfYWRkcmVzc19yb2xlczoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg0CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmFjY291bnRfbWFuYWdlciwgYWRkcmVzcyksCiAgICBieXRlYyAyMyAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMKICAgIGRpZyAxCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4NQogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5wcmltYXJ5X2RlYWxlciwgYWRkcmVzcyksCiAgICBieXRlYyAyMiAvLyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzCiAgICBkaWcgMgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODYKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYudHJ1c3RlZSwgYWRkcmVzcyksCiAgICBieXRlYyAzMiAvLyAweDUyMjM1NDcyNzU3Mzc0NjU2NTIzCiAgICBkaWcgMwogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODcKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYXV0aG9yaXR5LCBhZGRyZXNzKSwKICAgIGJ5dGVjIDIxIC8vIDB4NTIyMzQxNzU3NDY4NmY3MjY5NzQ3OTIzCiAgICBkaWcgNAogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODgKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYub2JzZXJ2ZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjQgLy8gMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzCiAgICB1bmNvdmVyIDUKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjcwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjIDQwIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDYKICAgIHNldGJpdAogICAgaW50Y18xIC8vIDEKICAgIHVuY292ZXIgNQogICAgc2V0Yml0CiAgICBwdXNoaW50IDIKICAgIHVuY292ZXIgNAogICAgc2V0Yml0CiAgICBwdXNoaW50IDMKICAgIHVuY292ZXIgMwogICAgc2V0Yml0CiAgICBwdXNoaW50IDQKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA1CiAgICAvLyByb2xlID0gcm9sZV9pZC5hc191aW50NjQoKQogICAgYnRvaQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwNgogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZSkKICAgIGR1cAogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDgKICAgIC8vIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgcHVzaGludHMgMjAgNDAgNTAgNjAgNzAgODAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDctMzM4CiAgICAvLyBtYXRjaCByb2xlOgogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgLy8gICAgICAgICByZXR1cm4gdHlwLlJvbGVWYWxpZGl0eSgKICAgIC8vICAgICAgICAgICAgIHJvbGVfdmFsaWRpdHlfc3RhcnQ9VUludDY0KDApLCByb2xlX3ZhbGlkaXR5X2VuZD1VSW50NjQoMCkKICAgIC8vICAgICAgICAgKQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5hdXRob3JpdHksIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5vYnNlcnZlciwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5vYnNlcnZlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBfOgogICAgLy8gICAgICAgICBvcC5lcnIoZXJyLklOVkFMSURfUk9MRSkKICAgIHVuY292ZXIgNgogICAgbWF0Y2ggcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8wQDIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8xQDMgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8yQDQgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8zQDUgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV80QDYgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV81QDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzgKICAgIC8vIG9wLmVycihlcnIuSU5WQUxJRF9ST0xFKQogICAgZXJyIC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzVANzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzQKICAgIC8vIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMjQgLy8gMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzMzLTMzNQogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMzNgogICAgLy8gcmV0dXJuIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzRANjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjkKICAgIC8vIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDIxIC8vIDB4NTIyMzQxNzU3NDY4NmY3MjY5NzQ3OTIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI4LTMzMAogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzEKICAgIC8vIHJldHVybiBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzNANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjQKICAgIC8vIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAzMiAvLyAweDUyMjM1NDcyNzU3Mzc0NjU2NTIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzIzLTMyNQogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI2CiAgICAvLyByZXR1cm4gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMkA0OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxOQogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAyMiAvLyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzE4LTMyMAogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMQogICAgLy8gcmV0dXJuIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8xQDM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzE0CiAgICAvLyBzZWxmLmFjY291bnRfbWFuYWdlciwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAyMyAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTMtMzE1CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxNgogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMEAyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwOS0zMTEKICAgIC8vIHJldHVybiB0eXAuUm9sZVZhbGlkaXR5KAogICAgLy8gICAgIHJvbGVfdmFsaWRpdHlfc3RhcnQ9VUludDY0KDApLCByb2xlX3ZhbGlkaXR5X2VuZD1VSW50NjQoMCkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLl9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IHZvaWQ6Cl9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI2CiAgICAvLyBkZWYgX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQoc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjgKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkLCBlcnIuU1VTUEVOREVECiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCAzODQKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIFN1c3BlbmRlZCBvcGVyYXRpb25zCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5fc2V0dGxlX3Bvc2l0aW9uKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NCwgdWludDY0Ogpfc2V0dGxlX3Bvc2l0aW9uOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjQ0CiAgICAvLyBkZWYgX3NldHRsZV9wb3NpdGlvbihzZWxmLCBob2xkaW5nX2FkZHJlc3M6IEFjY291bnQpIC0+IHR1cGxlW1VJbnQ2NCwgVUludDY0XToKICAgIHByb3RvIDEgMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo2MQogICAgLy8gcG9zaXRpb24gPSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jb3B5KCkKICAgIGR1cAogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NjMtNjUKICAgIC8vICMgQ29tcHV0ZSB0aGUgaW5jcmVtZW50YWwgcGVyLXVuaXQgZml4ZWQtcG9pbnQgaW50ZXJlc3QgYW5kIHByaW5jaXBhbCBhY2NydWVkCiAgICAvLyAjIHNpbmNlIHRoaXMgYWNjb3VudCdzIGxhc3QgY2hlY2twb2ludC4KICAgIC8vIGludGVyZXN0X2RlbHRhID0gc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IC0gcG9zaXRpb24uaW50ZXJlc3RfY2hlY2twb2ludAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggZXhpc3RzCiAgICBkaWcgMQogICAgcHVzaGludCA1NwogICAgZXh0cmFjdF91aW50NjQKICAgIC0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo2NwogICAgLy8gc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCAtIHBvc2l0aW9uLnByaW5jaXBhbF9jaGVja3BvaW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTcgLy8gImN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IGV4aXN0cwogICAgZGlnIDIKICAgIHB1c2hpbnQgNjUKICAgIGV4dHJhY3RfdWludDY0CiAgICAtCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzMKICAgIC8vIGludGVyZXN0X2RlbHRhLCBwb3NpdGlvbi51bml0cywgc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgZGlnIDIKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3MC03NAogICAgLy8gIyBDb252ZXJ0IHRoZSBwZXItdW5pdCBmaXhlZC1wb2ludCBkZWx0YXMgaW50byBhYnNvbHV0ZSBjbGFpbWFibGUgYW1vdW50cwogICAgLy8gIyB1c2luZyB0aGUgYWNjb3VudCdzIGFjdGl2ZSB1bml0cy4KICAgIC8vIGNsYWltYWJsZV9pbnRlcmVzdCA9IHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIGludGVyZXN0X2RlbHRhLCBwb3NpdGlvbi51bml0cywgc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgLy8gKQogICAgdW5jb3ZlciAzCiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojc2CiAgICAvLyBwcmluY2lwYWxfZGVsdGEsIHBvc2l0aW9uLnVuaXRzLCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzUtNzcKICAgIC8vIGNsYWltYWJsZV9wcmluY2lwYWwgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBwcmluY2lwYWxfZGVsdGEsIHBvc2l0aW9uLnVuaXRzLCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICAvLyApCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojc5LTgxCiAgICAvLyAjIEFjY3J1ZSB0aGUgY2xhaW1hYmxlIGFtb3VudHMgdG8gdGhlIGFjY291bnQgcG9zaXRpb24gYW5kIG1ha2UgdGhlbSBhdmFpbGFibGUKICAgIC8vICMgZm9yIHdpdGhkcmF3YWwuCiAgICAvLyBwb3NpdGlvbi5jbGFpbWFibGVfaW50ZXJlc3QgKz0gY2xhaW1hYmxlX2ludGVyZXN0CiAgICBkaWcgMgogICAgcHVzaGludCA3MwogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICArCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIHN3YXAKICAgIHJlcGxhY2UyIDczCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6ODIKICAgIC8vIHBvc2l0aW9uLmNsYWltYWJsZV9wcmluY2lwYWwgKz0gY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgZHVwCiAgICBwdXNoaW50IDgxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDIKICAgICsKICAgIGl0b2IKICAgIHJlcGxhY2UyIDgxCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6ODQtODYKICAgIC8vICMgQWR2YW5jZSB0aGUgYWNjb3VudCdzIHBlci11bml0IGZpeGVkLXBvaW50IGNoZWNrcG9pbnRzIHRvIHRoZSBjdXJyZW50IGdsb2JhbAogICAgLy8gIyBwZXItdW5pdCBmaXhlZC1wb2ludCBnbG9iYWwgaW5kaWNlcy4KICAgIC8vIHBvc2l0aW9uLmludGVyZXN0X2NoZWNrcG9pbnQgPSBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IGV4aXN0cwogICAgaXRvYgogICAgcmVwbGFjZTIgNTcKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo4NwogICAgLy8gcG9zaXRpb24ucHJpbmNpcGFsX2NoZWNrcG9pbnQgPSBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTcgLy8gImN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IGV4aXN0cwogICAgaXRvYgogICAgcmVwbGFjZTIgNjUKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo4OS05MAogICAgLy8gIyBBZHZhbmNlIHRoZSBhY2NvdW50J3MgZXZlbnQgY3Vyc29yIHRvIHRoZSBjdXJyZW50IGdsb2JhbCBldmVudCBjdXJzb3IuCiAgICAvLyBwb3NpdGlvbi5zZXR0bGVkX2N1cnNvciA9IHNlbGYuZXZlbnRfY3Vyc29yCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGl0b2IKICAgIHJlcGxhY2UyIDQ5CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6OTItOTQKICAgIC8vICMgVXBkYXRlIHRoZSBhY2NvdW50IHBvc2l0aW9uIGFuZCByZXR1cm4gdGhlIG5ld2x5IGFjY3J1ZWQgY2xhaW1hYmxlIGFtb3VudHMKICAgIC8vICMgYWRkZWQgdG8gdGhlIHRvdGFsIHBvc2l0aW9uJ3MgY2xhaW1hYmxlIGFtb3VudHMuCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHBvc2l0aW9uLmNvcHkoKQogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6OTUKICAgIC8vIHJldHVybiBjbGFpbWFibGVfaW50ZXJlc3QsIGNsYWltYWJsZV9wcmluY2lwYWwKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IHZvaWQ6Cl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojk3CiAgICAvLyBkZWYgX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQoc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQyMwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDAKICAgIC8vIGlmIHNlbGYuX3N0YXR1c19pc19wZW5kaW5nX2llZCgpOgogICAgYnogX2Vuc3VyZV91bml0c19hY3RpdmF0ZWRfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTAxCiAgICAvLyByZXR1cm4KICAgIHJldHN1YgoKX2Vuc3VyZV91bml0c19hY3RpdmF0ZWRfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwMwogICAgLy8gcG9zaXRpb24gPSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAyCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDQKICAgIC8vIGlmIHBvc2l0aW9uLnJlc2VydmVkX3VuaXRzID09IFVJbnQ2NCgwKToKICAgIHB1c2hpbnQgNDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgYm56IF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkX2FmdGVyX2lmX2Vsc2VANAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwNQogICAgLy8gcmV0dXJuCiAgICByZXRzdWIKCl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkX2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDgKICAgIC8vIHBvc2l0aW9uLnVuaXRzICs9IGFjdGl2YXRlZF91bml0cwogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMwogICAgKwogICAgaXRvYgogICAgcmVwbGFjZTIgMzIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDkKICAgIC8vIHBvc2l0aW9uLnJlc2VydmVkX3VuaXRzID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgaXRvYgogICAgcmVwbGFjZTIgNDAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTAKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gcG9zaXRpb24uY29weSgpCiAgICBmcmFtZV9kaWcgMgogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExMQogICAgLy8gYXNzZXJ0IHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPj0gYWN0aXZhdGVkX3VuaXRzLCBlcnIuT1ZFUl9ESVNUUklCVVRJT04KICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICBkdXAKICAgIGRpZyAyCiAgICA+PQogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCByZW1haW5pbmcgRC1BU0EgdW5pdHMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTIKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgLT0gYWN0aXZhdGVkX3VuaXRzCiAgICBzd2FwCiAgICAtCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX3NjYWxlZF9tdWxfZGl2KG11bHRpcGxpY2FuZDogdWludDY0LCBtdWx0aXBsaWVyOiB1aW50NjQsIGRpdmlzb3I6IHVpbnQ2NCkgLT4gdWludDY0Ogpfc2NhbGVkX211bF9kaXY6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNTMtMTU1CiAgICAvLyBkZWYgX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIHNlbGYsIG11bHRpcGxpY2FuZDogVUludDY0LCBtdWx0aXBsaWVyOiBVSW50NjQsIGRpdmlzb3I6IFVJbnQ2NAogICAgLy8gKSAtPiBVSW50NjQ6CiAgICBwcm90byAzIDEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE1NwogICAgLy8gaWYgbXVsdGlwbGljYW5kID09IFVJbnQ2NCgwKSBvciBtdWx0aXBsaWVyID09IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMwogICAgYnogX3NjYWxlZF9tdWxfZGl2X2lmX2JvZHlAMgogICAgZnJhbWVfZGlnIC0yCiAgICBibnogX3NjYWxlZF9tdWxfZGl2X2FmdGVyX2lmX2Vsc2VAMwoKX3NjYWxlZF9tdWxfZGl2X2lmX2JvZHlAMjoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE1OAogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKX3NjYWxlZF9tdWxfZGl2X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE1OQogICAgLy8gaGlnaCwgbG93ID0gb3AubXVsdyhtdWx0aXBsaWNhbmQsIG11bHRpcGxpZXIpCiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMgogICAgbXVsdwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTYwCiAgICAvLyByZXR1cm4gb3AuZGl2dyhoaWdoLCBsb3csIGRpdmlzb3IpCiAgICBmcmFtZV9kaWcgLTEKICAgIGRpdncKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9hbW91bnRfdG9faW5kZXhfZGVsdGEoYW1vdW50OiB1aW50NjQpIC0+IHVpbnQ2NDoKX2Ftb3VudF90b19pbmRleF9kZWx0YToKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE2MgogICAgLy8gZGVmIF9hbW91bnRfdG9faW5kZXhfZGVsdGEoc2VsZiwgYW1vdW50OiBVSW50NjQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTY0CiAgICAvLyBpZiBhbW91bnQgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0xCiAgICBibnogX2Ftb3VudF90b19pbmRleF9kZWx0YV9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE2NQogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKX2Ftb3VudF90b19pbmRleF9kZWx0YV9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNjYKICAgIC8vIGFzc2VydCBzZWxmLnRvdGFsX3VuaXRzID4gVUludDY0KDApLCBlcnIuTk9fVU5JVFMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICBkdXAKICAgIGFzc2VydCAvLyBObyBELUFTQSB1bml0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTY3CiAgICAvLyByZXR1cm4gc2VsZi5fc2NhbGVkX211bF9kaXYoYW1vdW50LCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLCBzZWxmLnRvdGFsX3VuaXRzKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5faW5kZXhfZGVsdGFfdG9fYW1vdW50KGluZGV4X2RlbHRhOiB1aW50NjQpIC0+IHVpbnQ2NDoKX2luZGV4X2RlbHRhX3RvX2Ftb3VudDoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE2OQogICAgLy8gZGVmIF9pbmRleF9kZWx0YV90b19hbW91bnQoc2VsZiwgaW5kZXhfZGVsdGE6IFVJbnQ2NCkgLT4gVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNzYKICAgIC8vIGlmIGluZGV4X2RlbHRhID09IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMQogICAgYm56IF9pbmRleF9kZWx0YV90b19hbW91bnRfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNzcKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9pbmRleF9kZWx0YV90b19hbW91bnRfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTc5CiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE4MQogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE3OC0xODIKICAgIC8vIHJldHVybiBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLnRvdGFsX3VuaXRzLAogICAgLy8gICAgIGluZGV4X2RlbHRhLAogICAgLy8gICAgIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZ2V0X3NjaGVkdWxlX2VudHJ5KGV2ZW50X2lkOiB1aW50NjQpIC0+IGJ5dGVzOgpfZ2V0X3NjaGVkdWxlX2VudHJ5OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjAyCiAgICAvLyBkZWYgX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLCBldmVudF9pZDogVUludDY0KSAtPiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeToKICAgIHByb3RvIDEgMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjA0CiAgICAvLyBhc3NlcnQgZXZlbnRfaWQgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LCBlcnIuSU5WQUxJRF9FVkVOVF9JRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICA+CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBpZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTkwCiAgICAvLyByZXR1cm4gZXZlbnRfaWQgLy8gVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMTYKICAgIC8KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjIwNgogICAgLy8gYXNzZXJ0IHBhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBpdG9iCiAgICBieXRlYyAzMSAvLyAweDUzMjMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE5NAogICAgLy8gcmV0dXJuIGV2ZW50X2lkICUgVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMTYKICAgICUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjIwOQogICAgLy8gYXNzZXJ0IG9mZnNldCA8IHBhZ2UubGVuZ3RoLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIHB1c2hpbnQgMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGRpZyAxCiAgICA+CiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMTAKICAgIC8vIHJldHVybiBwYWdlW29mZnNldF0uY29weSgpCiAgICBwdXNoaW50IDY1CiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIHB1c2hpbnQgNjUKICAgIGJveF9leHRyYWN0CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoY29udHJhY3RfdHlwZTogdWludDY0LCBldmVudF90eXBlOiB1aW50NjQpIC0+IHZvaWQ6Cl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZToKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMxMy0zMTUKICAgIC8vIGRlZiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgc2VsZiwgY29udHJhY3RfdHlwZTogVUludDY0LCBldmVudF90eXBlOiBVSW50NjQKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjU0LTI1NQogICAgLy8gIyBDaGVjayBjb21tb24gZXZlbnRzIGZpcnN0CiAgICAvLyBpZiBldmVudF90eXBlIGluIGNvbW1vbl9ldmVudHM6CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI0NwogICAgLy8gVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI0OAogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUCksCiAgICBpbnRjXzIgLy8gOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjU0LTI1NQogICAgLy8gIyBDaGVjayBjb21tb24gZXZlbnRzIGZpcnN0CiAgICAvLyBpZiBldmVudF90eXBlIGluIGNvbW1vbl9ldmVudHM6CiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjQ5CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX01EKSwKICAgIHB1c2hpbnQgMTkKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI1MAogICAgLy8gVUludDY0KGVudW1zLkVWVF9SUiksCiAgICBwdXNoaW50IDEyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyNTEKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIHB1c2hpbnQgMTEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDcKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDY6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyNTYKICAgIC8vIHJldHVybiBUcnVlCiAgICBpbnRjXzEgLy8gMQoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQ6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIHJldHN1YgoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI1OC0yNTkKICAgIC8vICMgQ29udHJhY3Qtc3BlY2lmaWMgYWRkaXRpb25hbCBldmVudHMKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX1BBTSk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyNjAtMjYxCiAgICAvLyAjIFBBTSBvbmx5IHN1cHBvcnRzIGNvbW1vbiBldmVudHMKICAgIC8vIHJldHVybiBGYWxzZQogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI2MwogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfTEFNKSBvciBjb250cmFjdF90eXBlID09IFVJbnQ2NCgKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAzCiAgICA9PQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjYzLTI2NQogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfTEFNKSBvciBjb250cmFjdF90eXBlID09IFVJbnQ2NCgKICAgIC8vICAgICBlbnVtcy5DVF9OQU0KICAgIC8vICk6CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlAMTEKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAyCiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMTYKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDExOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjY2LTI3MAogICAgLy8gIyBMQU0vTkFNIGFkZDogUFIsIElQQ0IKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyNjgKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyNjYtMjcwCiAgICAvLyAjIExBTS9OQU0gYWRkOiBQUiwgSVBDQgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMTMKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjY5CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgcHVzaGludCAxOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjY2LTI3MAogICAgLy8gIyBMQU0vTkFNIGFkZDogUFIsIElQQ0IKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gKQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDE0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDEzOgogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMTQ6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAxNjoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI3MgogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKToKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAyMwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjczLTI3OAogICAgLy8gIyBBTk4gYWRkczogUFIsIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyNzUKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyNzMtMjc4CiAgICAvLyAjIEFOTiBhZGRzOiBQUiwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjAKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Mjc2CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgcHVzaGludCAxOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjczLTI3OAogICAgLy8gIyBBTk4gYWRkczogUFIsIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDIwCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI3NwogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyNzMtMjc4CiAgICAvLyAjIEFOTiBhZGRzOiBQUiwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMjEKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjA6CiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF9mYWxzZUAyMToKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDIzOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjgwCiAgICAvLyBpZiBjb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9MQVgpOgogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDQKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAzMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjgxLTI4NwogICAgLy8gIyBMQVggYWRkczogUFIsIFBJLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjgzCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjgxLTI4NwogICAgLy8gIyBMQVggYWRkczogUFIsIFBJLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyOAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyODQKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgcHVzaGludCA0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyODEtMjg3CiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDI4CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI4NQogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIHB1c2hpbnQgMTgKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI4MS0yODcKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjgKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Mjg2CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICBwdXNoaW50IDUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI4MS0yODcKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMjkKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjg6CiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF9mYWxzZUAyOToKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDMxOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Mjg5CiAgICAvLyBpZiBjb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9DTE0pOgogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDUKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAzMwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjkwLTI5MQogICAgLy8gIyBDTE0gYWRkczogUFIKICAgIC8vIHJldHVybiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMzM6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyOTMKICAgIC8vIHJldHVybiBGYWxzZQogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKCi8vIG1vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9pc19keW5hbWljX2FubnVpdHkoKSAtPiB1aW50NjQ6Cl9pc19keW5hbWljX2FubnVpdHk6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozMzUKICAgIC8vIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMzNS0zMzYKICAgIC8vIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKQogICAgLy8gYW5kIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgYnogX2lzX2R5bmFtaWNfYW5udWl0eV9ib29sX2ZhbHNlQDMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMzNgogICAgLy8gYW5kIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDM0IC8vICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24gZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozMzUtMzM2CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIC8vIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGJ6IF9pc19keW5hbWljX2FubnVpdHlfYm9vbF9mYWxzZUAzCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzM0LTMzNwogICAgLy8gcmV0dXJuICgKICAgIC8vICAgICBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIC8vICAgICBhbmQgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICAvLyApCiAgICByZXRzdWIKCl9pc19keW5hbWljX2FubnVpdHlfYm9vbF9mYWxzZUAzOgogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMzNC0zMzcKICAgIC8vIHJldHVybiAoCiAgICAvLyAgICAgc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICAvLyAgICAgYW5kIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgLy8gKQogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnk6IGJ5dGVzKSAtPiB1aW50NjQsIGJ5dGVzOgpfZW50cnlfaW50ZXJlc3Rfc2VnbWVudDoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjM4MAogICAgLy8gZGVmIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KHNlbGYsIGVudHJ5OiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSkgLT4gVUludDY0OgogICAgcHJvdG8gMSAyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozODkKICAgIC8vIGVudHJ5LmFjY3J1YWxfZmFjdG9yID09IFVJbnQ2NCgwKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDE3CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozODktMzkxCiAgICAvLyBlbnRyeS5hY2NydWFsX2ZhY3RvciA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID09IFVJbnQ2NCgwKQogICAgLy8gb3Igc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID09IFVJbnQ2NCgwKQogICAgYnogX2VudHJ5X2ludGVyZXN0X3NlZ21lbnRfaWZfYm9keUAzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozOTAKICAgIC8vIG9yIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID09IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozODktMzkxCiAgICAvLyBlbnRyeS5hY2NydWFsX2ZhY3RvciA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID09IFVJbnQ2NCgwKQogICAgLy8gb3Igc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID09IFVJbnQ2NCgwKQogICAgYnogX2VudHJ5X2ludGVyZXN0X3NlZ21lbnRfaWZfYm9keUAzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozOTEKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozODktMzkxCiAgICAvLyBlbnRyeS5hY2NydWFsX2ZhY3RvciA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID09IFVJbnQ2NCgwKQogICAgLy8gb3Igc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID09IFVJbnQ2NCgwKQogICAgYm56IF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2FmdGVyX2lmX2Vsc2VANAoKX2VudHJ5X2ludGVyZXN0X3NlZ21lbnRfaWZfYm9keUAzOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzkzCiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfZGlnIC0xCiAgICB1bmNvdmVyIDIKICAgIHJldHN1YgoKX2VudHJ5X2ludGVyZXN0X3NlZ21lbnRfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Mzk1CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Mzk2CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Mzk3CiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Mzk0LTM5OAogICAgLy8gYWNjcnVlZCA9IHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSwKICAgIC8vICAgICBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQwMgogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjM5OS00MDMKICAgIC8vIHJldHVybiBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBhY2NydWVkLAogICAgLy8gICAgIGVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMAogICAgc3dhcAogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIGZyYW1lX2RpZyAtMQogICAgdW5jb3ZlciAyCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZGlzY291bnRfYW5udWl0eV9mYWN0b3IoZGlzY291bnRfZmFjdG9yOiB1aW50NjQsIHJlZGVtcHRpb25fZmFjdG9yOiB1aW50NjQpIC0+IHVpbnQ2NDoKX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDYyLTQ2NgogICAgLy8gZGVmIF9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcigKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgIGRpc2NvdW50X2ZhY3RvcjogVUludDY0LAogICAgLy8gICAgIHJlZGVtcHRpb25fZmFjdG9yOiBVSW50NjQsCiAgICAvLyApIC0+IFVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDY4CiAgICAvLyBpZiByZWRlbXB0aW9uX2ZhY3RvciA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGJueiBfZGlzY291bnRfYW5udWl0eV9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0NjkKICAgIC8vIHJldHVybiBkaXNjb3VudF9mYWN0b3IKICAgIGZyYW1lX2RpZyAtMgogICAgcmV0c3ViCgpfZGlzY291bnRfYW5udWl0eV9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDcwCiAgICAvLyBwZXJpb2RfcmF0ZSA9IHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgKyBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQ3MQogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQ3MC00NzQKICAgIC8vIHBlcmlvZF9yYXRlID0gc2VsZi5maXhlZF9wb2ludF9zY2FsZSArIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIHJlZGVtcHRpb25fZmFjdG9yLAogICAgLy8gICAgIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgKwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDc1CiAgICAvLyBhc3NlcnQgcGVyaW9kX3JhdGUgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZHVwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0NzgKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0NzYtNDgwCiAgICAvLyByZXR1cm4gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgZGlzY291bnRfZmFjdG9yLAogICAgLy8gICAgIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICAvLyAgICAgcGVyaW9kX3JhdGUsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeShlbnRyeTogYnl0ZXMsIHBheWxvYWQ6IGJ5dGVzKSAtPiBieXRlcywgYnl0ZXM6Cl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeToKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYxMy02MTUKICAgIC8vIGRlZiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkoCiAgICAvLyAgICAgc2VsZiwgZW50cnk6IHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5LCBwYXlsb2FkOiB0eXAuT2JzZXJ2ZWRFdmVudFJlcXVlc3QKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDIgMgogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2MjMKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF9pZCA9PSBzZWxmLmV2ZW50X2N1cnNvciwgZXJyLklOVkFMSURfRVZFTlRfQ1VSU09SCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgY3Vyc29yCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2MjQKICAgIC8vIGFzc2VydCBlbnRyeS5zY2hlZHVsZWRfdGltZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwgZXJyLk5PX0RVRV9DQVNIRkxPVwogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA8PQogICAgYXNzZXJ0IC8vIE5vIGR1ZSBjYXNoZmxvdyB0byBwYXkKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYyNgogICAgLy8gZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjI3CiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfSUVEKToKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgZHVwCiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMzUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjI4LTYzMAogICAgLy8gIyBJRUQgZmluYWxpemVzIGlzc3VhbmNlOiByZXNlcnZlZCB1bml0cyBiZWNvbWUgYWN0aXZhdGFibGUgYW5kIHRoZQogICAgLy8gIyBzY2hlZHVsZSdzIGluaXRpYWwgY29udHJhY3R1YWwgc3RhdGUgYmVjb21lcyBsaXZlLgogICAgLy8gYXNzZXJ0IHNlbGYuX3N0YXR1c19pc19wZW5kaW5nX2llZCgpLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYzMgogICAgLy8gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCA9PSBzZWxmLnRvdGFsX3VuaXRzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgID09CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2MzEtNjMzCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPT0gc2VsZi50b3RhbF91bml0cwogICAgLy8gKSwgZXJyLlBSSU1BUllfRElTVFJJQlVUSU9OX0lOQ09NUExFVEUKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBub3QgY29tcGxldGUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYzNAogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2MzUKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYzNgogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPSBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZQogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYzNwogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ID0gVUludDY0KDApCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2MzgKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IGVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA0MQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYzOQogICAgLy8gc2VsZi5ldmVudF9jdXJzb3IgKz0gVUludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjQwCiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbnVtcy5TVEFUVVNfQUNUSVZFKQogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgcHVzaGludCAxMDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0NTEKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwgZXJyLk5PVF9FVlRfSUVECiAgICBmcmFtZV9kaWcgMTEKICAgIGFzc2VydCAvLyBOb3QgSUVEIGV2ZW50CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0NTIKICAgIC8vIHJldHVybiBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjQxLTY0NQogICAgLy8gc2VsZi5fZW1pdF9leGVjdXRpb25fZXZlbnQoCiAgICAvLyAgICAgZW50cnk9ZW50cnksCiAgICAvLyAgICAgcGF5b2ZmPXNlbGYuX2VudHJ5X2llZF9hbW91bnQoZW50cnkpLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjQ0CiAgICAvLyBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjQxLTY0NQogICAgLy8gc2VsZi5fZW1pdF9leGVjdXRpb25fZXZlbnQoCiAgICAvLyAgICAgZW50cnk9ZW50cnksCiAgICAvLyAgICAgcGF5b2ZmPXNlbGYuX2VudHJ5X2llZF9hbW91bnQoZW50cnkpLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGNhbGxzdWIgX2VtaXRfZXhlY3V0aW9uX2V2ZW50CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgLTIKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjY0NgogICAgLy8gcmV0dXJuCiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2J1cnkgMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMzUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTQ3CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuX3N0YXR1c19pc19wZW5kaW5nX2llZCgpLCBlcnIuUEVORElOR19JRUQKICAgICEKICAgIGFzc2VydCAvLyBJRUQgbm90IHlldCBleGVjdXRlZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjQ5CiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgKz0gc2VsZi5fZW50cnlfaW50ZXJlc3Rfc2VnbWVudChlbnRyeSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQKICAgIGZyYW1lX2J1cnkgLTIKICAgICsKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjUxCiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUlIpOgogICAgZnJhbWVfZGlnIDEwCiAgICBwdXNoaW50IDEyCiAgICA9PQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAxMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjU1CiAgICAvLyBwYXlsb2FkLm9ic2VydmVkX3JhdGUsCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2NTYKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9tdWx0aXBsaWVyLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDM2IC8vICJyYXRlX3Jlc2V0X211bHRpcGxpZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9tdWx0aXBsaWVyIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjU3CiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjUyLTY1OAogICAgLy8gIyBSUiBkZXJpdmVzIHRoZSBuZXh0IHJhdGUgZnJvbSBhbiBvYnNlcnZlZCBvcmFjbGUgdmFsdWUgcGx1cyB0aGUKICAgIC8vICMgY29udHJhY3Qgc3ByZWFkIC8gbXVsdGlwbGllciB0ZXJtcywgdGhlbiBlbmZvcmNlcyBmbG9vciBhbmQgY2FwLgogICAgLy8gb2JzZXJ2ZWRfcmF0ZSA9IHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIHBheWxvYWQub2JzZXJ2ZWRfcmF0ZSwKICAgIC8vICAgICBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjY2MAogICAgLy8gb2JzZXJ2ZWRfcmF0ZSArIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzNSAvLyAicmF0ZV9yZXNldF9zcHJlYWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQgZXhpc3RzCiAgICArCiAgICBmcmFtZV9idXJ5IDYKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjczNAogICAgLy8gaWYgc2VsZi5oYXNfcmF0ZV9yZXNldF9mbG9vciBhbmQgcmF0ZSA8IHNlbGYucmF0ZV9yZXNldF9mbG9vcjoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzOCAvLyAiaGFzX3JhdGVfcmVzZXRfZmxvb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgZXhpc3RzCiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1NQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI5IC8vICJyYXRlX3Jlc2V0X2Zsb29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfZmxvb3IgZXhpc3RzCiAgICBmcmFtZV9kaWcgNgogICAgPgogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjczNQogICAgLy8gcmF0ZSA9IHNlbGYucmF0ZV9yZXNldF9mbG9vcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI5IC8vICJyYXRlX3Jlc2V0X2Zsb29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgNgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9mbG9vciBleGlzdHMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU1OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzM2CiAgICAvLyBpZiBzZWxmLmhhc19yYXRlX3Jlc2V0X2NhcCBhbmQgcmF0ZSA+IHNlbGYucmF0ZV9yZXNldF9jYXA6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzkgLy8gImhhc19yYXRlX3Jlc2V0X2NhcCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgZXhpc3RzCiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1OAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDMwIC8vICJyYXRlX3Jlc2V0X2NhcCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X2NhcCBleGlzdHMKICAgIGZyYW1lX2RpZyA2CiAgICA8CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1OAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzM3CiAgICAvLyByYXRlID0gc2VsZi5yYXRlX3Jlc2V0X2NhcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDMwIC8vICJyYXRlX3Jlc2V0X2NhcCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDYKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfY2FwIGV4aXN0cwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTg6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2NTkKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gc2VsZi5fY2xhbXBfcmF0ZSgKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjY1OS02NjEKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gc2VsZi5fY2xhbXBfcmF0ZSgKICAgIC8vICAgICBvYnNlcnZlZF9yYXRlICsgc2VsZi5yYXRlX3Jlc2V0X3NwcmVhZAogICAgLy8gKQogICAgZnJhbWVfZGlnIDYKICAgIGFwcF9nbG9iYWxfcHV0CgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAxODoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjY3MQogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1BJKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCA0CiAgICA9PQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAyMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjcyCiAgICAvLyBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9IGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjY3MwogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMjM6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2NzgKICAgIC8vIGlmIHNlbGYuX2lzX2R5bmFtaWNfYW5udWl0eSgpOgogICAgY2FsbHN1YiBfaXNfZHluYW1pY19hbm51aXR5CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDI5CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2NzkKICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QUkYpOgogICAgZnJhbWVfZGlnIDEwCiAgICBwdXNoaW50IDUKICAgID09CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAzMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDkwCiAgICAvLyBkaXNjb3VudF9mYWN0b3IgPSBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQ5MQogICAgLy8gZGVub21pbmF0b3IgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQ5MgogICAgLy8gc2tpcF9maXJzdF9yZWRlbXB0aW9uID0gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDcKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQ5NAogICAgLy8gaWYgZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAyNQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgZnJhbWVfYnVyeSA4CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAzNQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDk1LTQ5OQogICAgLy8gIyBBbiBpbml0aWFsIFBSRiBtYXkgZGVzY3JpYmUgdGhlIGZpcnN0IHJlZGVtcHRpb24gcGVyaW9kIGRpcmVjdGx5LgogICAgLy8gZGlzY291bnRfZmFjdG9yID0gc2VsZi5fZGlzY291bnRfYW5udWl0eV9mYWN0b3IoCiAgICAvLyAgICAgZGlzY291bnRfZmFjdG9yLAogICAgLy8gICAgIGVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDgKICAgIGNhbGxzdWIgX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTAxCiAgICAvLyBza2lwX2ZpcnN0X3JlZGVtcHRpb24gPSBUcnVlCiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfYnVyeSA3CiAgICBmcmFtZV9idXJ5IDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDM1OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTAzCiAgICAvLyBmdXR1cmVfZXZlbnRfaWQgPSBzZWxmLmV2ZW50X2N1cnNvciArIFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfd2hpbGVfdG9wQDM2OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTA0CiAgICAvLyB3aGlsZSBmdXR1cmVfZXZlbnRfaWQgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgZnJhbWVfZGlnIDMKICAgID4KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl93aGlsZUA0OAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTA1CiAgICAvLyBmdXR1cmVfZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoZnV0dXJlX2V2ZW50X2lkKQogICAgZnJhbWVfZGlnIDMKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjUwNgogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPSBmdXR1cmVfZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1MDctNTA4CiAgICAvLyAjIE9ubHkgcmVkZW1wdGlvbi1iZWFyaW5nIGV2ZW50cyBjb250cmlidXRlIHRvIHRoZSBhbm51aXR5IGRlbm9taW5hdG9yLgogICAgLy8gaXNfcmVkZW1wdGlvbl9ldmVudCA9IGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpIG9yICgKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjUwNy01MTEKICAgIC8vICMgT25seSByZWRlbXB0aW9uLWJlYXJpbmcgZXZlbnRzIGNvbnRyaWJ1dGUgdG8gdGhlIGFubnVpdHkgZGVub21pbmF0b3IuCiAgICAvLyBpc19yZWRlbXB0aW9uX2V2ZW50ID0gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QUikgb3IgKAogICAgLy8gICAgIGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfTUQpCiAgICAvLyAgICAgYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICAvLyApCiAgICBibnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfdHJ1ZUA0MAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTA5CiAgICAvLyBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgZnJhbWVfZGlnIDQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1MDktNTEwCiAgICAvLyBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgLy8gYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF9mYWxzZUA0MQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTEwCiAgICAvLyBhbmQgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IgPiBVSW50NjQoMCkKICAgIGZyYW1lX2RpZyAwCiAgICBwdXNoaW50IDI1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTA5LTUxMAogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCkKICAgIC8vIGFuZCBmdXR1cmVfZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX3RydWVANDA6CiAgICBpbnRjXzEgLy8gMQoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfbWVyZ2VANDI6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1MTIKICAgIC8vIGlmIGlzX3JlZGVtcHRpb25fZXZlbnQ6CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA0NwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTEzCiAgICAvLyBpZiBza2lwX2ZpcnN0X3JlZGVtcHRpb246CiAgICBmcmFtZV9kaWcgNwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUA0NQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTE0CiAgICAvLyBza2lwX2ZpcnN0X3JlZGVtcHRpb24gPSBGYWxzZQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgNwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANDc6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1MjEKICAgIC8vIGZ1dHVyZV9ldmVudF9pZCArPSBVSW50NjQoMSkKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV93aGlsZV90b3BAMzYKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlANDU6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1MTgKICAgIC8vIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZnJhbWVfZGlnIDAKICAgIHB1c2hpbnQgMjUKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1MTYtNTE5CiAgICAvLyBkaXNjb3VudF9mYWN0b3IgPSBzZWxmLl9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcigKICAgIC8vICAgICBkaXNjb3VudF9mYWN0b3IsCiAgICAvLyAgICAgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMgogICAgc3dhcAogICAgY2FsbHN1YiBfZGlzY291bnRfYW5udWl0eV9mYWN0b3IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1MjAKICAgIC8vIGRlbm9taW5hdG9yICs9IGRpc2NvdW50X2ZhY3RvcgogICAgZnJhbWVfZGlnIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA0NwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDE6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF9tZXJnZUA0MgoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX3doaWxlQDQ4OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTIzCiAgICAvLyBhc3NlcnQgZGVub21pbmF0b3IgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZnJhbWVfZGlnIDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjUyNAogICAgLy8gbnVtZXJhdG9yID0gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTI1CiAgICAvLyBpZiBlbnRyeS5mbGFncyAmIFVJbnQ2NChlbnVtcy5GTEFHX0lOSVRJQUxfUFJGKSA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNTcKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gOAogICAgJgogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDUwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1MjYtNTI3CiAgICAvLyAjIFN1YnNlcXVlbnQgUFJGIGV2ZW50cyBhbW9ydGl6ZSBib3RoIHByaW5jaXBhbCBhbmQgYWxyZWFkeSBhY2NydWVkIGNhcnJ5LgogICAgLy8gbnVtZXJhdG9yICs9IHNlbGYuYWNjcnVlZF9pbnRlcmVzdAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgICsKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDUwOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTMwCiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTI4LTUzMgogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIG51bWVyYXRvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gICAgIGRlbm9taW5hdG9yLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDEKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2ODAKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IHNlbGYuX3JlY2FsY3VsYXRlX2FubnVpdHlfcGF5bWVudCgKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjgwLTY4MgogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gc2VsZi5fcmVjYWxjdWxhdGVfYW5udWl0eV9wYXltZW50KAogICAgLy8gICAgIGVudHJ5CiAgICAvLyApCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMzA6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2ODUKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjY4Ni02OTAKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1VSW50NjQoMCksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2ODgKICAgIC8vIHBheW9mZj1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Njg5CiAgICAvLyBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICBkdXAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjY4Ni02OTAKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1VSW50NjQoMCksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgY2FsbHN1YiBfZW1pdF9leGVjdXRpb25fZXZlbnQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDI5OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Njg0CiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDMwCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDIwOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Njc0CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9JUENCKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCAxOAogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDIzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2NzUtNjc2CiAgICAvLyAjIElQQ0Iga2VlcHMgcHJpbmNpcGFsIHVuY2hhbmdlZCBhbmQgb25seSByZXNldHMgdGhlIGludGVyZXN0IGJhc2UuCiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIGIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMjMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMTA6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2NjIKICAgIC8vIGVsaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1JSRik6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgMTEKICAgID09CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDE0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2NjMKICAgIC8vIG5leHRfcmF0ZSA9IGVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjY0CiAgICAvLyBpZiBuZXh0X3JhdGUgPT0gVUludDY0KDApOgogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDEzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2NjUKICAgIC8vIG5leHRfcmF0ZSA9IHNlbGYucmF0ZV9yZXNldF9uZXh0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzcgLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDUKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfbmV4dCBleGlzdHMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjY2CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IG5leHRfcmF0ZQogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgZnJhbWVfZGlnIDUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDE0OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjY4CiAgICAvLyBpZiBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSAhPSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgOQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMTgKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjY2OQogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPSBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZQogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgZnJhbWVfZGlnIDkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CgoKLy8gbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KGVudHJ5OiBieXRlcywgcGF5b2ZmOiB1aW50NjQsIHNldHRsZWRfYW1vdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpfZW1pdF9leGVjdXRpb25fZXZlbnQ6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2OTYtNzAyCiAgICAvLyBkZWYgX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgKiwKICAgIC8vICAgICBlbnRyeTogdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnksCiAgICAvLyAgICAgcGF5b2ZmOiBVSW50NjQsCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ6IFVJbnQ2NCwKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDMgMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzA2CiAgICAvLyBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25JRAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzA3CiAgICAvLyBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIGZyYW1lX2RpZyAtMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3MDgKICAgIC8vIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIGZyYW1lX2RpZyAtMwogICAgZXh0cmFjdCA4IDEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjcwOQogICAgLy8gc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICBmcmFtZV9kaWcgLTMKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3MTAKICAgIC8vIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3MTMKICAgIC8vIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIGZyYW1lX2RpZyAtMwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzA4CiAgICAvLyBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICBpbnRjXzIgLy8gOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzEzCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBnZXRieXRlCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3NDIKICAgIC8vIGlmIHBheW9mZiA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJueiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3NDMKICAgIC8vIHJldHVybiBVSW50NjQoZW51bXMuUEFZT0ZGX1NJR05fUE9TSVRJVkUpCiAgICBpbnRjXzEgLy8gMQoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX3BheW9mZl9zaWduQDc6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3MTItNzE0CiAgICAvLyBwYXlvZmZfc2lnbj1hcmM0LlVJbnQ4KAogICAgLy8gICAgIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIC8vICksCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgaW50Y18yIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3MTYKICAgIC8vIGN1cnJlbmN5X2lkPXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzE3CiAgICAvLyBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3MDUtNzE4CiAgICAvLyBFeGVjdXRpb25FdmVudCgKICAgIC8vICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIC8vICAgICBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYXBwbGllZF9hdD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICBwYXlvZmY9cGF5b2ZmLAogICAgLy8gICAgIHBheW9mZl9zaWduPWFyYzQuVUludDgoCiAgICAvLyAgICAgICAgIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIC8vICAgICApLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PXNldHRsZWRfYW1vdW50LAogICAgLy8gICAgIGN1cnJlbmN5X2lkPXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAwCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzA0LTcxOQogICAgLy8gYXJjNC5lbWl0KAogICAgLy8gICAgIEV4ZWN1dGlvbkV2ZW50KAogICAgLy8gICAgICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgICAgIHBheW9mZj1wYXlvZmYsCiAgICAvLyAgICAgICAgIHBheW9mZl9zaWduPWFyYzQuVUludDgoCiAgICAvLyAgICAgICAgICAgICBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICAvLyAgICAgICAgICksCiAgICAvLyAgICAgICAgIHNldHRsZWRfYW1vdW50PXNldHRsZWRfYW1vdW50LAogICAgLy8gICAgICAgICBjdXJyZW5jeV9pZD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgICAgIHNlcXVlbmNlPWVudHJ5LmV2ZW50X2lkICsgVUludDY0KDEpLAogICAgLy8gICAgICkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDlhMzMyYjk1IC8vIG1ldGhvZCAiRXhlY3V0aW9uRXZlbnQodWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojc0NAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiAoVUludDY0KGVudW1zLkVWVF9JRUQpLCBVSW50NjQoZW51bXMuRVZUX1BJKSk6CiAgICBmcmFtZV9kaWcgNQogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBibnogX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2lmX2JvZHlANQogICAgZnJhbWVfZGlnIDUKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGJ6IF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pZl9lbHNlQDYKCl9lbWl0X2V4ZWN1dGlvbl9ldmVudF9pZl9ib2R5QDU6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3NDUKICAgIC8vIHJldHVybiBVSW50NjQoZW51bXMuUEFZT0ZGX1NJR05fUE9TSVRJVkUpCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzEzCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBiIF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pbmxpbmVkX21vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9wYXlvZmZfc2lnbkA3CgpfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzQ2CiAgICAvLyByZXR1cm4gVUludDY0KGVudW1zLlBBWU9GRl9TSUdOX05FR0FUSVZFKQogICAgcHVzaGludCAyNTUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjcxMwogICAgLy8gc2VsZi5fcGF5b2ZmX3NpZ24oZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSwgcGF5b2ZmKQogICAgYiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fcGF5b2ZmX3NpZ25ANwoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9yb2xlX2lzX2FjdGl2ZShyb2xlX21hcDogYnl0ZXMsIHJvbGVfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NDoKX3JvbGVfaXNfYWN0aXZlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU3CiAgICAvLyBkZWYgX3JvbGVfaXNfYWN0aXZlKHNlbGYsIHJvbGVfbWFwOiB0eXAuUmJhY1JvbGUsIHJvbGVfYWRkcmVzczogQWNjb3VudCkgLT4gYm9vbDoKICAgIHByb3RvIDIgMQogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5CiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5LTYwCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5LTYxCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjEKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAtNjEKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgPj0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX21lcmdlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKSAtPiB2b2lkOgpfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2NQogICAgLy8gYXNzZXJ0IHNlbGYuX2lzX2FycmFuZ2VyKFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTIKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgPT0gc2VsZi5hcnJhbmdlci52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE4IC8vIDB4NTIyMzQxNzI3MjYxNmU2NzY1NzIyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgPT0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2NQogICAgLy8gYXNzZXJ0IHNlbGYuX2lzX2FycmFuZ2VyKFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpIC0+IHZvaWQ6Cl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4MwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFzc2V0X2RlZmF1bHRlZCwgZXJyLkRFRkFVTFRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQxIC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfZGVmYXVsdGVkIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIERlZmF1bHRlZAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkgLT4gdm9pZDoKX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg2CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYXNzZXRfc3VzcGVuZGVkLCBlcnIuU1VTUEVOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzMgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9zdXNwZW5kZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gU3VzcGVuZGVkIG9wZXJhdGlvbnMKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkOiB1aW50NjQpIC0+IHZvaWQ6Cl9hc3NlcnRfdmFsaWRfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OAogICAgLy8gZGVmIF9hc3NlcnRfdmFsaWRfcm9sZShzZWxmLCByb2xlX2lkOiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTAKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIHB1c2hpbnQgMjAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkxCiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgcHVzaGludCAyNQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTIKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICBwdXNoaW50IDQwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MwogICAgLy8gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgcHVzaGludCA1MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTQKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgcHVzaGludCA2MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTUKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICBwdXNoaW50IDcwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NgogICAgLy8gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgcHVzaGludCA4MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfZmFsc2VAOAoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3OgogICAgaW50Y18xIC8vIDEKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX21lcmdlQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgcmV0c3ViCgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9mYWxzZUA4OgogICAgaW50Y18wIC8vIDAKICAgIGIgX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfbWVyZ2VAOQo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="}, "sourceInfo": {"approval": {"pcOffsetMethod": "none", "sourceInfo": [{"pc": [2601], "errorMessage": "ACTUS event not yet executed"}, {"pc": [2358], "errorMessage": "Can not distribute zero units"}, {"pc": [3102, 3109, 3481], "errorMessage": "D-ASA already configured"}, {"pc": [1238, 1939, 2318, 2464, 3733, 3880, 4226, 4372], "errorMessage": "D-ASA not configured"}, {"pc": [3492], "errorMessage": "D-ASA terms not configured"}, {"pc": [6541], "errorMessage": "Defaulted"}, {"pc": [3120], "errorMessage": "Denomination asset is not properly set"}, {"pc": [3135], "errorMessage": "Different settlement asset not supported, must be equal to denomination asset"}, {"pc": [3370, 3377, 3379], "errorMessage": "IED must be set in the future"}, {"pc": [1256, 2008, 2479, 5914], "errorMessage": "IED not yet executed"}, {"pc": [2371, 5297], "errorMessage": "Insufficient remaining D-ASA units"}, {"pc": [2574, 2641], "errorMessage": "Insufficient sender units to transfer"}, {"pc": [1835, 3022, 3040, 3096, 3603, 3641, 5482, 5760, 5820, 6203], "errorMessage": "Invalid ACTUS configuration"}, {"pc": [1948, 2352, 2535, 2550, 2708, 2781, 2844, 2886, 5109, 5234], "errorMessage": "Invalid account holding address"}, {"pc": [4564, 4588, 4612, 4636, 4660, 4717, 4745, 4767, 4789, 4811, 4990, 5008, 5023, 5038, 5053], "errorMessage": "Invalid account role address"}, {"pc": [3082], "errorMessage": "Invalid day-count convention ID"}, {"pc": [1347, 3755, 4089, 5792], "errorMessage": "Invalid event cursor"}, {"pc": [3588, 3654, 3933, 5398], "errorMessage": "Invalid event id"}, {"pc": [3768, 4153, 4160], "errorMessage": "Invalid event type"}, {"pc": [4701, 4980, 6611], "errorMessage": "Invalid role identifier"}, {"pc": [3486, 3666, 3674, 3989, 5413, 5429], "errorMessage": "Invalid schedule page"}, {"pc": [5345], "errorMessage": "No D-ASA units"}, {"pc": [1353, 1864, 2045, 5801], "errorMessage": "No due cashflow to pay"}, {"pc": [5883], "errorMessage": "Not IED event"}, {"pc": [1993, 2326, 2522, 2698, 2754, 2764, 2850, 4188, 4834, 6533], "errorMessage": "Not authorized"}, {"pc": [1474, 1482, 2094, 2168, 2177], "errorMessage": "Not enough funds for the payment"}, {"pc": [3905, 3918], "errorMessage": "Observed event required to execute this action"}, {"pc": [2340, 2388], "errorMessage": "Primary distribution is closed"}, {"pc": [5832], "errorMessage": "Primary distribution is not complete"}, {"pc": [2563], "errorMessage": "Sender and receiver must be different"}, {"pc": [5095, 6549], "errorMessage": "Suspended operations"}, {"pc": [2275, 3631], "errorMessage": "Time events must be sorted in strictly ascending order"}, {"pc": [2496, 2513], "errorMessage": "Transfer is closed"}, {"pc": [2567], "errorMessage": "Transfer units must be greater than zero"}, {"pc": [988], "errorMessage": "Wrong Global Bytes allocation"}, {"pc": [994], "errorMessage": "Wrong Global UInts allocation"}, {"pc": [998], "errorMessage": "Wrong Local Bytes allocation"}, {"pc": [1002], "errorMessage": "Wrong Local UInts allocation"}, {"pc": [1455, 2087], "errorMessage": "account opted into asset"}, {"pc": [6493, 6508], "errorMessage": "check BoxMap entry exists"}, {"pc": [1984, 2022, 2063, 2101, 2392, 2570, 2630, 2656, 5089, 5255], "errorMessage": "check self.account entry exists"}, {"pc": [1536, 1762, 1847, 4283, 5919, 6222], "errorMessage": "check self.accrued_interest exists"}, {"pc": [4852, 6531], "errorMessage": "check self.arranger exists"}, {"pc": [6539], "errorMessage": "check self.asset_defaulted exists"}, {"pc": [6547], "errorMessage": "check self.asset_suspended exists"}, {"pc": [3030, 3475, 3901, 3913, 4231, 5644], "errorMessage": "check self.contract_type exists"}, {"pc": [1504, 4288, 5117, 5195], "errorMessage": "check self.cumulative_interest_index exists"}, {"pc": [1516, 4293, 5128, 5203], "errorMessage": "check self.cumulative_principal_index exists"}, {"pc": [5654], "errorMessage": "check self.dynamic_principal_redemption exists"}, {"pc": [1271, 1284, 1345, 1586, 2578, 2591, 3746, 4082, 4259, 4376, 4389, 4426, 5210, 5790, 5871, 6103, 6241], "errorMessage": "check self.event_cursor exists"}, {"pc": [5143, 5157, 5350, 5379, 5710, 5718, 5745, 5765, 5954, 6067, 6228], "errorMessage": "check self.fixed_point_scale exists"}, {"pc": [5997], "errorMessage": "check self.has_rate_reset_cap exists"}, {"pc": [5970], "errorMessage": "check self.has_rate_reset_floor exists"}, {"pc": [3107, 3491, 4255, 5888], "errorMessage": "check self.initial_exchange_amount exists"}, {"pc": [2376, 2386], "errorMessage": "check self.initial_exchange_date exists"}, {"pc": [1707, 4273, 5686, 5700], "errorMessage": "check self.interest_calculation_base exists"}, {"pc": [1778, 1793], "errorMessage": "check self.next_principal_redemption exists"}, {"pc": [4278, 5678, 5705, 5750], "errorMessage": "check self.nominal_interest_rate exists"}, {"pc": [1953, 1966], "errorMessage": "check self.op_daemon exists"}, {"pc": [1607, 1674, 1699, 1752, 1803, 1811, 1832, 4268, 6207, 6287], "errorMessage": "check self.outstanding_principal exists"}, {"pc": [6005, 6019], "errorMessage": "check self.rate_reset_cap exists"}, {"pc": [5978, 5992], "errorMessage": "check self.rate_reset_floor exists"}, {"pc": [5949], "errorMessage": "check self.rate_reset_multiplier exists"}, {"pc": [6321], "errorMessage": "check self.rate_reset_next exists"}, {"pc": [5962], "errorMessage": "check self.rate_reset_spread exists"}, {"pc": [1460, 2163, 4298], "errorMessage": "check self.reserved_interest exists"}, {"pc": [1465, 1494, 2173, 2188, 4303], "errorMessage": "check self.reserved_principal exists"}, {"pc": [2363, 2411, 4250, 5292, 5825], "errorMessage": "check self.reserved_units_total exists"}, {"pc": [1276, 2583, 3751, 3931, 3949, 4072, 4264, 4381, 5394, 6112], "errorMessage": "check self.schedule_entry_count exists"}, {"pc": [3979], "errorMessage": "check self.schedule_page entry exists"}, {"pc": [1452, 2053, 2081, 6393], "errorMessage": "check self.settlement_asset_id exists"}, {"pc": [1237, 1251, 1938, 2003, 2317, 2336, 2463, 2474, 2758, 3100, 3479, 3732, 3879, 4224, 4371, 5238, 5816, 5909], "errorMessage": "check self.status exists"}, {"pc": [2369, 2422, 4245, 5343, 5374, 5830], "errorMessage": "check self.total_units exists"}, {"pc": [2501, 2511], "errorMessage": "check self.transfer_closure_date exists"}, {"pc": [2484, 2492], "errorMessage": "check self.transfer_opening_date exists"}, {"pc": [3565, 3624], "errorMessage": "index access is out of bounds"}, {"pc": [1922, 2967, 3449, 3984], "errorMessage": "invalid array length header"}, {"pc": [2688, 3437, 4824], "errorMessage": "invalid number of bytes for arc4.bool"}, {"pc": [1930], "errorMessage": "invalid number of bytes for arc4.dynamic_array"}, {"pc": [3464], "errorMessage": "invalid number of bytes for arc4.dynamic_array"}, {"pc": [1916, 2301, 2441, 2449, 2680, 2738, 2746, 2826, 2834, 2877, 2902, 4445, 4469, 4503, 4684, 4866, 4950], "errorMessage": "invalid number of bytes for arc4.static_array"}, {"pc": [1232, 2259, 2268, 2309, 2458, 3427, 3864], "errorMessage": "invalid number of bytes for arc4.uint64"}, {"pc": [4493, 4674, 4940], "errorMessage": "invalid number of bytes for arc4.uint8"}, {"pc": [2939], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.InitialKernelState"}, {"pc": [2928], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.NormalizedActusTerms"}, {"pc": [3875], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.ObservedEventRequest"}, {"pc": [2972], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.Prospectus"}, {"pc": [4514], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.RoleValidity"}, {"pc": [2956], "errorMessage": "invalid tail pointer at index 1 of (uint8[32],(len+utf8[]))"}, {"pc": [2951], "errorMessage": "invalid tuple encoding"}, {"pc": [4051], "errorMessage": "max array length exceeded"}, {"pc": [4237, 6385], "errorMessage": "overflow"}]}, "clear": {"pcOffsetMethod": "none", "sourceInfo": []}}, "templateVariables": {}}""" APP_SPEC = algokit_utils.Arc56Contract.from_json(_APP_SPEC_JSON) def _parse_abi_args(args: object | None = None) -> list[object] | None: diff --git a/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.approval.puya.map b/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.approval.puya.map new file mode 100644 index 00000000..3ec1f3b0 --- /dev/null +++ b/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.approval.puya.map @@ -0,0 +1,5631 @@ +{ + "version": 3, + "sources": [ + "../../../modules/rbac.py", + "../../mock_module_rbac/contract.py" + ], + "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BmD;AAAf;;AAA5B;AAC4C;;AAAf;;AAA7B;AAkBA;;AAAuB;AAAvB;AACA;;AAAuB;AAAvB;AC3CR;;AAAA;;;AAAA;;;;;;AAAA;;;AAAA;;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;AAAA;AD8IK;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;;ACtIA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAEG;AAAsB;;AAAtB;AAFH;AAAA;AD8IG;;;AARH;AAAA;AAUA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAWG;;;AACA;AAAA;AAAA;AACO;;AAbV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAeA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAWG;;;AACA;;AAAA;AAAA;AACO;;AAbV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAeA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAsBG;;;AACA;;;AACwB;AAAA;;AAAxB;;;AA9Gc;AAAX;AAAX;;;AACY;AAAA;;AAAA;AA+GG;;AA1BV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAlFM;AAAW;;AAAX;AAAX;;;AACuC;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAyGJ;;;AAvGG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAqGJ;;;AAnGG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAiGJ;;;AA/FG;AAAW;;AAAX;AAAX;;;AACuC;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AA6FJ;;;AA3FG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;;;;AA4FP;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAmBG;;;AACA;;;AACwB;AAAA;;AAAxB;;;AA9GO;AAAW;AAAX;AAAP;AACc;;AAAX;AAAX;;;AACmC;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AA6GG;;AAvBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AApFM;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAwGJ;;;AAtGG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAoGJ;;;AAlGG;AAAW;;AAAX;AAAX;;;AACmC;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAgGJ;;;AA9FG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;;;;AA+FP;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AApK+B;AAAgB;;AAArC;;;AAAP;AAoLA;;AAAA;AAAA;AACO;;AAjBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BU;AAAA;AAAA;AAAA;AARV;AAAA;AAAA;AAAA;AAAA;AAAA;AAUA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAc4B;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AAlBP;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAcU;AACP;AAAA;;;AAES;AAIA;;;;;;;AALT;;AAAA;;;;;;;;;;;;;;AA+BQ;AAJI;;AAvRL;;AAAA;AAAA;AAAA;AAAA;;AAsRC;AAGO;AAAA;AA7ClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAsCe;AAlRL;;AAAA;AAAA;AAAA;AAAA;;AAiRC;AAGO;AAAA;AAxClB;;;AAiCe;;AA7QL;;AAAA;AAAA;AAAA;AAAA;;AA4QC;AAGO;AAAA;AAnClB;;;AA4Be;;AAxQL;;AAAA;AAAA;AAAA;AAAA;;AAuQC;AAGO;AAAA;AA9BlB;;;AAuBe;AAnQL;;AAAA;AAAA;AAAA;AAAA;;AAkQC;AAGO;AAAA;AAzBlB;;;AAkBkB;;;;;;;;;;;;;;;;;;AAlBlB;;;AA1OD;;;;;AAFW;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAGA;;;AACH;;AAAA;AAAA;AAAA;AAAA;AACG;;AAAA;AAAA;;AADH;AAAA;;;AAEG;;AAAA;AAAA;AAAA;;AAAA;AADA;;AAAA;AADH;;;;AADJ;;AAAA;;;;;AAOyB;;AAbF;AAAA;AAAA;AAAA;AAAhB;AAaP;;AAkBW;AAAA;;AAAA;AAAA;AAAJ;AAAP;;AAKJ;;;AACW;;AACH;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;AAAA;;AAMH;;AANG;AAAA;;;AAAA;;AAOH;;AAPG;AAAA;;;;AAAP;;;", + "op_pc_offset": 0, + "pc_events": { + "1": { + "subroutine": "algopy.arc4.ARC4Contract.approval_program", + "params": {}, + "block": "main", + "stack_in": [], + "op": "intcblock 1 0 32 20" + }, + "7": { + "op": "bytecblock 0x151f7c75 0x5223417272616e67657223 0x5223417574686f7269747923 0x52234163636f756e744d616e6167657223 0x52235072696d6172794465616c657223 0x52235472757374656523 0x52234f6273657276657223 0x52234f704461656d6f6e23 \"asset_suspended\" \"asset_defaulted\"" + }, + "141": { + "op": "txn ApplicationID", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "143": { + "op": "bnz main_after_if_else@2", + "stack_out": [] + }, + "146": { + "op": "bytec_1 // 0x5223417272616e67657223", + "defined_out": [ + "0x5223417272616e67657223" + ], + "stack_out": [ + "0x5223417272616e67657223" + ] + }, + "147": { + "op": "global ZeroAddress", + "defined_out": [ + "0x5223417272616e67657223", + "tmp%0#2" + ], + "stack_out": [ + "0x5223417272616e67657223", + "tmp%0#2" + ] + }, + "149": { + "op": "app_global_put", + "stack_out": [] + }, + "150": { + "op": "bytec 7 // 0x52234f704461656d6f6e23", + "defined_out": [ + "0x52234f704461656d6f6e23" + ], + "stack_out": [ + "0x52234f704461656d6f6e23" + ] + }, + "152": { + "op": "global ZeroAddress", + "defined_out": [ + "0x52234f704461656d6f6e23", + "tmp%1#2" + ], + "stack_out": [ + "0x52234f704461656d6f6e23", + "tmp%1#2" + ] + }, + "154": { + "op": "app_global_put", + "stack_out": [] + }, + "155": { + "op": "bytec 8 // \"asset_suspended\"", + "defined_out": [ + "\"asset_suspended\"" + ], + "stack_out": [ + "\"asset_suspended\"" + ] + }, + "157": { + "op": "intc_1 // 0", + "defined_out": [ + "\"asset_suspended\"", + "0" + ], + "stack_out": [ + "\"asset_suspended\"", + "0" + ] + }, + "158": { + "op": "app_global_put", + "stack_out": [] + }, + "159": { + "op": "bytec 9 // \"asset_defaulted\"", + "defined_out": [ + "\"asset_defaulted\"" + ], + "stack_out": [ + "\"asset_defaulted\"" + ] + }, + "161": { + "op": "intc_1 // 0", + "stack_out": [ + "\"asset_defaulted\"", + "0" + ] + }, + "162": { + "op": "app_global_put", + "stack_out": [] + }, + "163": { + "block": "main_after_if_else@2", + "stack_in": [], + "op": "txn NumAppArgs", + "defined_out": [ + "tmp%0#1" + ], + "stack_out": [ + "tmp%0#1" + ] + }, + "165": { + "op": "bz main_create@19", + "stack_out": [] + }, + "168": { + "op": "pushbytes 0x914f04eb // method \"contract_update()void\"", + "defined_out": [ + "Method(contract_update()void)" + ], + "stack_out": [ + "Method(contract_update()void)" + ] + }, + "174": { + "op": "txna ApplicationArgs 0", + "defined_out": [ + "Method(contract_update()void)", + "tmp%2#0" + ], + "stack_out": [ + "Method(contract_update()void)", + "tmp%2#0" + ] + }, + "177": { + "op": "match main_contract_update_route@5", + "stack_out": [] + }, + "181": { + "block": "main_switch_case_next@6", + "stack_in": [], + "op": "txn OnCompletion", + "defined_out": [ + "tmp%8#0" + ], + "stack_out": [ + "tmp%8#0" + ] + }, + "183": { + "op": "!", + "defined_out": [ + "tmp%9#0" + ], + "stack_out": [ + "tmp%9#0" + ] + }, + "184": { + "op": "assert", + "stack_out": [] + }, + "185": { + "op": "txn ApplicationID", + "defined_out": [ + "tmp%10#0" + ], + "stack_out": [ + "tmp%10#0" + ] + }, + "187": { + "op": "assert", + "stack_out": [] + }, + "188": { + "op": "pushbytess 0x82f71b2d 0xef04f5d3 0xdf343550 0x3dbe80bd 0xdf54e82c 0x010c8299 0x7406acd2 0x1a72a2ee // method \"rbac_rotate_arranger(address)uint64\", method \"rbac_set_op_daemon(address)uint64\", method \"rbac_assign_role(uint8,address,(uint64,uint64))uint64\", method \"rbac_revoke_role(uint8,address)uint64\", method \"rbac_gov_asset_suspension(bool)uint64\", method \"rbac_get_arranger()address\", method \"rbac_get_address_roles(address)(bool,bool,bool,bool,bool)\", method \"rbac_get_role_validity(uint8,address)(uint64,uint64)\"", + "defined_out": [ + "Method(rbac_assign_role(uint8,address,(uint64,uint64))uint64)", + "Method(rbac_get_address_roles(address)(bool,bool,bool,bool,bool))", + "Method(rbac_get_arranger()address)", + "Method(rbac_get_role_validity(uint8,address)(uint64,uint64))", + "Method(rbac_gov_asset_suspension(bool)uint64)", + "Method(rbac_revoke_role(uint8,address)uint64)", + "Method(rbac_rotate_arranger(address)uint64)", + "Method(rbac_set_op_daemon(address)uint64)" + ], + "stack_out": [ + "Method(rbac_rotate_arranger(address)uint64)", + "Method(rbac_set_op_daemon(address)uint64)", + "Method(rbac_assign_role(uint8,address,(uint64,uint64))uint64)", + "Method(rbac_revoke_role(uint8,address)uint64)", + "Method(rbac_gov_asset_suspension(bool)uint64)", + "Method(rbac_get_arranger()address)", + "Method(rbac_get_address_roles(address)(bool,bool,bool,bool,bool))", + "Method(rbac_get_role_validity(uint8,address)(uint64,uint64))" + ] + }, + "230": { + "op": "txna ApplicationArgs 0", + "defined_out": [ + "Method(rbac_assign_role(uint8,address,(uint64,uint64))uint64)", + "Method(rbac_get_address_roles(address)(bool,bool,bool,bool,bool))", + "Method(rbac_get_arranger()address)", + "Method(rbac_get_role_validity(uint8,address)(uint64,uint64))", + "Method(rbac_gov_asset_suspension(bool)uint64)", + "Method(rbac_revoke_role(uint8,address)uint64)", + "Method(rbac_rotate_arranger(address)uint64)", + "Method(rbac_set_op_daemon(address)uint64)", + "tmp%12#0" + ], + "stack_out": [ + "Method(rbac_rotate_arranger(address)uint64)", + "Method(rbac_set_op_daemon(address)uint64)", + "Method(rbac_assign_role(uint8,address,(uint64,uint64))uint64)", + "Method(rbac_revoke_role(uint8,address)uint64)", + "Method(rbac_gov_asset_suspension(bool)uint64)", + "Method(rbac_get_arranger()address)", + "Method(rbac_get_address_roles(address)(bool,bool,bool,bool,bool))", + "Method(rbac_get_role_validity(uint8,address)(uint64,uint64))", + "tmp%12#0" + ] + }, + "233": { + "op": "match rbac_rotate_arranger rbac_set_op_daemon rbac_assign_role rbac_revoke_role rbac_gov_asset_suspension rbac_get_arranger rbac_get_address_roles rbac_get_role_validity", + "stack_out": [] + }, + "251": { + "op": "err" + }, + "252": { + "block": "main_contract_update_route@5", + "stack_in": [], + "op": "txn OnCompletion", + "defined_out": [ + "tmp%3#0" + ], + "stack_out": [ + "tmp%3#0" + ] + }, + "254": { + "op": "pushint 4 // UpdateApplication", + "defined_out": [ + "UpdateApplication", + "tmp%3#0" + ], + "stack_out": [ + "tmp%3#0", + "UpdateApplication" + ] + }, + "256": { + "op": "==", + "defined_out": [ + "tmp%4#0" + ], + "stack_out": [ + "tmp%4#0" + ] + }, + "257": { + "op": "txn ApplicationID", + "defined_out": [ + "tmp%4#0", + "tmp%5#0" + ], + "stack_out": [ + "tmp%4#0", + "tmp%5#0" + ] + }, + "259": { + "op": "&&", + "defined_out": [ + "tmp%7#0" + ], + "stack_out": [ + "tmp%7#0" + ] + }, + "260": { + "op": "assert", + "stack_out": [] + }, + "261": { + "op": "b contract_update" + }, + "264": { + "block": "main_create@19", + "stack_in": [], + "op": "txn OnCompletion", + "defined_out": [ + "tmp%13#0" + ], + "stack_out": [ + "tmp%13#0" + ] + }, + "266": { + "op": "!", + "defined_out": [ + "tmp%14#0" + ], + "stack_out": [ + "tmp%14#0" + ] + }, + "267": { + "op": "txn ApplicationID", + "defined_out": [ + "tmp%14#0", + "tmp%15#0" + ], + "stack_out": [ + "tmp%14#0", + "tmp%15#0" + ] + }, + "269": { + "op": "!", + "defined_out": [ + "tmp%14#0", + "tmp%16#0" + ], + "stack_out": [ + "tmp%14#0", + "tmp%16#0" + ] + }, + "270": { + "op": "&&", + "defined_out": [ + "tmp%17#0" + ], + "stack_out": [ + "tmp%17#0" + ] + }, + "271": { + "op": "assert", + "stack_out": [] + }, + "272": { + "op": "bytec_1 // 0x5223417272616e67657223", + "defined_out": [ + "0x5223417272616e67657223" + ], + "stack_out": [ + "0x5223417272616e67657223" + ] + }, + "273": { + "op": "txn Sender", + "defined_out": [ + "0x5223417272616e67657223", + "tmp%0#2" + ], + "stack_out": [ + "0x5223417272616e67657223", + "tmp%0#2" + ] + }, + "275": { + "op": "app_global_put", + "stack_out": [] + }, + "276": { + "op": "intc_0 // 1", + "defined_out": [ + "1" + ], + "stack_out": [ + "1" + ] + }, + "277": { + "op": "return", + "stack_out": [] + }, + "278": { + "subroutine": "modules.rbac.RbacModule.contract_update[routing]", + "params": {}, + "block": "contract_update", + "stack_in": [], + "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", + "op": "callsub _assert_caller_is_arranger" + }, + "281": { + "op": "intc_0 // 1", + "defined_out": [ + "1" + ], + "stack_out": [ + "1" + ] + }, + "282": { + "op": "return", + "stack_out": [] + }, + "283": { + "subroutine": "modules.rbac.RbacModule.rbac_rotate_arranger[routing]", + "params": {}, + "block": "rbac_rotate_arranger", + "stack_in": [], + "op": "txna ApplicationArgs 1", + "defined_out": [ + "new_arranger#0" + ], + "stack_out": [ + "new_arranger#0" + ] + }, + "286": { + "op": "dup", + "defined_out": [ + "new_arranger#0", + "new_arranger#0 (copy)" + ], + "stack_out": [ + "new_arranger#0", + "new_arranger#0 (copy)" + ] + }, + "287": { + "op": "len", + "defined_out": [ + "len%0#0", + "new_arranger#0" + ], + "stack_out": [ + "new_arranger#0", + "len%0#0" + ] + }, + "288": { + "op": "intc_2 // 32", + "defined_out": [ + "32", + "len%0#0", + "new_arranger#0" + ], + "stack_out": [ + "new_arranger#0", + "len%0#0", + "32" + ] + }, + "289": { + "op": "==", + "defined_out": [ + "eq%0#0", + "new_arranger#0" + ], + "stack_out": [ + "new_arranger#0", + "eq%0#0" + ] + }, + "290": { + "error": "invalid number of bytes for arc4.static_array", + "op": "assert // invalid number of bytes for arc4.static_array", + "stack_out": [ + "new_arranger#0" + ] + }, + "291": { + "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", + "op": "callsub _assert_caller_is_arranger" + }, + "294": { + "op": "bytec_1 // 0x5223417272616e67657223", + "defined_out": [ + "0x5223417272616e67657223", + "new_arranger#0" + ], + "stack_out": [ + "new_arranger#0", + "0x5223417272616e67657223" + ] + }, + "295": { + "op": "swap", + "stack_out": [ + "0x5223417272616e67657223", + "new_arranger#0" + ] + }, + "296": { + "op": "app_global_put", + "stack_out": [] + }, + "297": { + "op": "global LatestTimestamp", + "defined_out": [ + "tmp%0#1" + ], + "stack_out": [ + "tmp%0#1" + ] + }, + "299": { + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%0#0" + ], + "stack_out": [ + "aggregate%val_as_bytes%0#0" + ] + }, + "300": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "aggregate%val_as_bytes%0#0" + ], + "stack_out": [ + "aggregate%val_as_bytes%0#0", + "0x151f7c75" + ] + }, + "301": { + "op": "swap", + "stack_out": [ + "0x151f7c75", + "aggregate%val_as_bytes%0#0" + ] + }, + "302": { + "op": "concat", + "defined_out": [ + "tmp%4#0" + ], + "stack_out": [ + "tmp%4#0" + ] + }, + "303": { + "op": "log", + "stack_out": [] + }, + "304": { + "op": "intc_0 // 1", + "defined_out": [ + "1" + ], + "stack_out": [ + "1" + ] + }, + "305": { + "op": "return", + "stack_out": [] + }, + "306": { + "subroutine": "modules.rbac.RbacModule.rbac_set_op_daemon[routing]", + "params": {}, + "block": "rbac_set_op_daemon", + "stack_in": [], + "op": "txna ApplicationArgs 1", + "defined_out": [ + "address#0" + ], + "stack_out": [ + "address#0" + ] + }, + "309": { + "op": "dup", + "defined_out": [ + "address#0", + "address#0 (copy)" + ], + "stack_out": [ + "address#0", + "address#0 (copy)" + ] + }, + "310": { + "op": "len", + "defined_out": [ + "address#0", + "len%0#0" + ], + "stack_out": [ + "address#0", + "len%0#0" + ] + }, + "311": { + "op": "intc_2 // 32", + "defined_out": [ + "32", + "address#0", + "len%0#0" + ], + "stack_out": [ + "address#0", + "len%0#0", + "32" + ] + }, + "312": { + "op": "==", + "defined_out": [ + "address#0", + "eq%0#0" + ], + "stack_out": [ + "address#0", + "eq%0#0" + ] + }, + "313": { + "error": "invalid number of bytes for arc4.static_array", + "op": "assert // invalid number of bytes for arc4.static_array", + "stack_out": [ + "address#0" + ] + }, + "314": { + "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", + "op": "callsub _assert_caller_is_arranger" + }, + "317": { + "op": "bytec 7 // 0x52234f704461656d6f6e23", + "defined_out": [ + "0x52234f704461656d6f6e23", + "address#0" + ], + "stack_out": [ + "address#0", + "0x52234f704461656d6f6e23" + ] + }, + "319": { + "op": "swap", + "stack_out": [ + "0x52234f704461656d6f6e23", + "address#0" + ] + }, + "320": { + "op": "app_global_put", + "stack_out": [] + }, + "321": { + "op": "global LatestTimestamp", + "defined_out": [ + "tmp%0#1" + ], + "stack_out": [ + "tmp%0#1" + ] + }, + "323": { + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%0#0" + ], + "stack_out": [ + "aggregate%val_as_bytes%0#0" + ] + }, + "324": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "aggregate%val_as_bytes%0#0" + ], + "stack_out": [ + "aggregate%val_as_bytes%0#0", + "0x151f7c75" + ] + }, + "325": { + "op": "swap", + "stack_out": [ + "0x151f7c75", + "aggregate%val_as_bytes%0#0" + ] + }, + "326": { + "op": "concat", + "defined_out": [ + "tmp%4#0" + ], + "stack_out": [ + "tmp%4#0" + ] + }, + "327": { + "op": "log", + "stack_out": [] + }, + "328": { + "op": "intc_0 // 1", + "defined_out": [ + "1" + ], + "stack_out": [ + "1" + ] + }, + "329": { + "op": "return", + "stack_out": [] + }, + "330": { + "subroutine": "modules.rbac.RbacModule.rbac_assign_role[routing]", + "params": {}, + "block": "rbac_assign_role", + "stack_in": [], + "op": "txna ApplicationArgs 1", + "defined_out": [ + "role_id#0" + ], + "stack_out": [ + "role_id#0" + ] + }, + "333": { + "op": "dup", + "defined_out": [ + "role_id#0", + "role_id#0 (copy)" + ], + "stack_out": [ + "role_id#0", + "role_id#0 (copy)" + ] + }, + "334": { + "op": "len", + "defined_out": [ + "len%0#0", + "role_id#0" + ], + "stack_out": [ + "role_id#0", + "len%0#0" + ] + }, + "335": { + "op": "intc_0 // 1", + "defined_out": [ + "1", + "len%0#0", + "role_id#0" + ], + "stack_out": [ + "role_id#0", + "len%0#0", + "1" + ] + }, + "336": { + "op": "==", + "defined_out": [ + "eq%0#0", + "role_id#0" + ], + "stack_out": [ + "role_id#0", + "eq%0#0" + ] + }, + "337": { + "error": "invalid number of bytes for arc4.uint8", + "op": "assert // invalid number of bytes for arc4.uint8", + "stack_out": [ + "role_id#0" + ] + }, + "338": { + "op": "txna ApplicationArgs 2" + }, + "341": { + "op": "dup", + "defined_out": [ + "role_address#0", + "role_id#0" + ], + "stack_out": [ + "role_id#0", + "role_address#0", + "role_address#0" + ] + }, + "342": { + "op": "cover 2", + "defined_out": [ + "role_address#0", + "role_id#0" + ], + "stack_out": [ + "role_address#0", + "role_id#0", + "role_address#0" + ] + }, + "344": { + "op": "len", + "defined_out": [ + "len%1#0", + "role_address#0", + "role_id#0" + ], + "stack_out": [ + "role_address#0", + "role_id#0", + "len%1#0" + ] + }, + "345": { + "op": "intc_2 // 32", + "defined_out": [ + "32", + "len%1#0", + "role_address#0", + "role_id#0" + ], + "stack_out": [ + "role_address#0", + "role_id#0", + "len%1#0", + "32" + ] + }, + "346": { + "op": "==", + "defined_out": [ + "eq%1#0", + "role_address#0", + "role_id#0" + ], + "stack_out": [ + "role_address#0", + "role_id#0", + "eq%1#0" + ] + }, + "347": { + "error": "invalid number of bytes for arc4.static_array", + "op": "assert // invalid number of bytes for arc4.static_array", + "stack_out": [ + "role_address#0", + "role_id#0" + ] + }, + "348": { + "op": "txna ApplicationArgs 3" + }, + "351": { + "op": "dup", + "defined_out": [ + "role_address#0", + "role_id#0", + "validity#0" + ], + "stack_out": [ + "role_address#0", + "role_id#0", + "validity#0", + "validity#0" + ] + }, + "352": { + "op": "cover 2", + "defined_out": [ + "role_address#0", + "role_id#0", + "validity#0" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#0", + "validity#0" + ] + }, + "354": { + "op": "len", + "defined_out": [ + "len%2#0", + "role_address#0", + "role_id#0", + "validity#0" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#0", + "len%2#0" + ] + }, + "355": { + "op": "pushint 16", + "defined_out": [ + "16", + "len%2#0", + "role_address#0", + "role_id#0", + "validity#0" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#0", + "len%2#0", + "16" + ] + }, + "357": { + "op": "==", + "defined_out": [ + "eq%2#0", + "role_address#0", + "role_id#0", + "validity#0" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#0", + "eq%2#0" + ] + }, + "358": { + "error": "invalid number of bytes for smart_contracts.abi_types.RoleValidity", + "op": "assert // invalid number of bytes for smart_contracts.abi_types.RoleValidity", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#0" + ] + }, + "359": { + "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", + "op": "callsub _assert_caller_is_arranger" + }, + "362": { + "callsub": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", + "op": "callsub _assert_is_not_asset_defaulted" + }, + "365": { + "op": "btoi", + "defined_out": [ + "role_address#0", + "role_id#1", + "validity#0" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1" + ] + }, + "366": { + "op": "dupn 2", + "defined_out": [ + "role_address#0", + "role_id#1", + "role_id#1 (copy)", + "validity#0" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "role_id#1", + "role_id#1 (copy)" + ] + }, + "368": { + "callsub": "modules.rbac.RbacModule._assert_valid_role", + "op": "callsub _assert_valid_role", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "role_id#1" + ] + }, + "371": { + "op": "intc_3 // 20", + "defined_out": [ + "20", + "role_address#0", + "role_id#1", + "validity#0" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "role_id#1", + "20" + ] + }, + "372": { + "op": "==", + "defined_out": [ + "role_address#0", + "role_id#1", + "tmp%0#2", + "validity#0" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "tmp%0#2" + ] + }, + "373": { + "op": "bz rbac_assign_role_after_if_else@3", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1" + ] + }, + "376": { + "op": "bytec_1 // 0x5223417272616e67657223", + "defined_out": [ + "0x5223417272616e67657223", + "role_address#0", + "role_id#1", + "validity#0" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "0x5223417272616e67657223" + ] + }, + "377": { + "op": "dig 3", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "0x5223417272616e67657223", + "role_address#0" + ] + }, + "379": { + "op": "app_global_put", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1" + ] + }, + "380": { + "block": "rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14", + "stack_in": [ + "role_address#0", + "validity#0", + "role_id#1" + ], + "op": "global LatestTimestamp", + "defined_out": [ + "tmp%2#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "tmp%2#1" + ] + }, + "382": { + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%0#0" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "aggregate%val_as_bytes%0#0" + ] + }, + "383": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "aggregate%val_as_bytes%0#0" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "aggregate%val_as_bytes%0#0", + "0x151f7c75" + ] + }, + "384": { + "op": "swap", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "0x151f7c75", + "aggregate%val_as_bytes%0#0" + ] + }, + "385": { + "op": "concat", + "defined_out": [ + "tmp%6#0" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "tmp%6#0" + ] + }, + "386": { + "op": "log", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1" + ] + }, + "387": { + "op": "intc_0 // 1", + "defined_out": [ + "1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "1" + ] + }, + "388": { + "op": "return", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1" + ] + }, + "389": { + "block": "rbac_assign_role_after_if_else@3", + "stack_in": [ + "role_address#0", + "validity#0", + "role_id#1" + ], + "op": "dup", + "defined_out": [ + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "role_id#1" + ] + }, + "390": { + "op": "pushint 40", + "defined_out": [ + "40", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "role_id#1", + "40" + ] + }, + "392": { + "op": "==", + "defined_out": [ + "role_id#1", + "tmp%1#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "tmp%1#1" + ] + }, + "393": { + "op": "bz rbac_assign_role_after_if_else@5", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1" + ] + }, + "396": { + "op": "bytec_3 // 0x52234163636f756e744d616e6167657223", + "defined_out": [ + "0x52234163636f756e744d616e6167657223", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "0x52234163636f756e744d616e6167657223" + ] + }, + "397": { + "op": "dig 3", + "defined_out": [ + "0x52234163636f756e744d616e6167657223", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "0x52234163636f756e744d616e6167657223", + "role_address#0" + ] + }, + "399": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%0#0", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%0#0" + ] + }, + "400": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%0#0", + "box_prefixed_key%0#0 (copy)", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%0#0", + "box_prefixed_key%0#0 (copy)" + ] + }, + "401": { + "op": "box_len", + "defined_out": [ + "_%0#0", + "box_prefixed_key%0#0", + "maybe_exists%0#0", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%0#0", + "_%0#0", + "maybe_exists%0#0" + ] + }, + "402": { + "op": "bury 1", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%0#0", + "maybe_exists%0#0" + ] + }, + "404": { + "op": "!", + "defined_out": [ + "box_prefixed_key%0#0", + "role_address#0", + "role_id#1", + "tmp%2#2" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%0#0", + "tmp%2#2" + ] + }, + "405": { + "error": "Invalid account role address", + "op": "assert // Invalid account role address", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%0#0" + ] + }, + "406": { + "op": "dig 2", + "defined_out": [ + "box_prefixed_key%0#0", + "role_address#0", + "role_id#1", + "validity#0" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%0#0", + "validity#0" + ] + }, + "408": { + "op": "box_put", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1" + ] + }, + "409": { + "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14" + }, + "412": { + "block": "rbac_assign_role_after_if_else@5", + "stack_in": [ + "role_address#0", + "validity#0", + "role_id#1" + ], + "op": "dup", + "defined_out": [ + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "role_id#1" + ] + }, + "413": { + "op": "pushint 50", + "defined_out": [ + "50", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "role_id#1", + "50" + ] + }, + "415": { + "op": "==", + "defined_out": [ + "role_id#1", + "tmp%3#0" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "tmp%3#0" + ] + }, + "416": { + "op": "bz rbac_assign_role_after_if_else@7", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1" + ] + }, + "419": { + "op": "bytec 4 // 0x52235072696d6172794465616c657223", + "defined_out": [ + "0x52235072696d6172794465616c657223", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "0x52235072696d6172794465616c657223" + ] + }, + "421": { + "op": "dig 3", + "defined_out": [ + "0x52235072696d6172794465616c657223", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "0x52235072696d6172794465616c657223", + "role_address#0" + ] + }, + "423": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%2#0", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%2#0" + ] + }, + "424": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%2#0", + "box_prefixed_key%2#0 (copy)", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%2#0", + "box_prefixed_key%2#0 (copy)" + ] + }, + "425": { + "op": "box_len", + "defined_out": [ + "_%1#0", + "box_prefixed_key%2#0", + "maybe_exists%1#0", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%2#0", + "_%1#0", + "maybe_exists%1#0" + ] + }, + "426": { + "op": "bury 1", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%2#0", + "maybe_exists%1#0" + ] + }, + "428": { + "op": "!", + "defined_out": [ + "box_prefixed_key%2#0", + "role_address#0", + "role_id#1", + "tmp%4#0" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%2#0", + "tmp%4#0" + ] + }, + "429": { + "error": "Invalid account role address", + "op": "assert // Invalid account role address", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%2#0" + ] + }, + "430": { + "op": "dig 2", + "defined_out": [ + "box_prefixed_key%2#0", + "role_address#0", + "role_id#1", + "validity#0" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%2#0", + "validity#0" + ] + }, + "432": { + "op": "box_put", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1" + ] + }, + "433": { + "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14" + }, + "436": { + "block": "rbac_assign_role_after_if_else@7", + "stack_in": [ + "role_address#0", + "validity#0", + "role_id#1" + ], + "op": "dup", + "defined_out": [ + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "role_id#1" + ] + }, + "437": { + "op": "pushint 60", + "defined_out": [ + "60", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "role_id#1", + "60" + ] + }, + "439": { + "op": "==", + "defined_out": [ + "role_id#1", + "tmp%5#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "tmp%5#1" + ] + }, + "440": { + "op": "bz rbac_assign_role_after_if_else@9", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1" + ] + }, + "443": { + "op": "bytec 5 // 0x52235472757374656523", + "defined_out": [ + "0x52235472757374656523", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "0x52235472757374656523" + ] + }, + "445": { + "op": "dig 3", + "defined_out": [ + "0x52235472757374656523", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "0x52235472757374656523", + "role_address#0" + ] + }, + "447": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%4#0", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%4#0" + ] + }, + "448": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%4#0", + "box_prefixed_key%4#0 (copy)", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%4#0", + "box_prefixed_key%4#0 (copy)" + ] + }, + "449": { + "op": "box_len", + "defined_out": [ + "_%2#0", + "box_prefixed_key%4#0", + "maybe_exists%2#0", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%4#0", + "_%2#0", + "maybe_exists%2#0" + ] + }, + "450": { + "op": "bury 1", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%4#0", + "maybe_exists%2#0" + ] + }, + "452": { + "op": "!", + "defined_out": [ + "box_prefixed_key%4#0", + "role_address#0", + "role_id#1", + "tmp%6#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%4#0", + "tmp%6#1" + ] + }, + "453": { + "error": "Invalid account role address", + "op": "assert // Invalid account role address", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%4#0" + ] + }, + "454": { + "op": "dig 2", + "defined_out": [ + "box_prefixed_key%4#0", + "role_address#0", + "role_id#1", + "validity#0" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%4#0", + "validity#0" + ] + }, + "456": { + "op": "box_put", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1" + ] + }, + "457": { + "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14" + }, + "460": { + "block": "rbac_assign_role_after_if_else@9", + "stack_in": [ + "role_address#0", + "validity#0", + "role_id#1" + ], + "op": "dup", + "defined_out": [ + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "role_id#1" + ] + }, + "461": { + "op": "pushint 70", + "defined_out": [ + "70", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "role_id#1", + "70" + ] + }, + "463": { + "op": "==", + "defined_out": [ + "role_id#1", + "tmp%7#0" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "tmp%7#0" + ] + }, + "464": { + "op": "bz rbac_assign_role_after_if_else@11", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1" + ] + }, + "467": { + "op": "bytec_2 // 0x5223417574686f7269747923", + "defined_out": [ + "0x5223417574686f7269747923", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "0x5223417574686f7269747923" + ] + }, + "468": { + "op": "dig 3", + "defined_out": [ + "0x5223417574686f7269747923", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "0x5223417574686f7269747923", + "role_address#0" + ] + }, + "470": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%6#0", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%6#0" + ] + }, + "471": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%6#0", + "box_prefixed_key%6#0 (copy)", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%6#0", + "box_prefixed_key%6#0 (copy)" + ] + }, + "472": { + "op": "box_len", + "defined_out": [ + "_%3#0", + "box_prefixed_key%6#0", + "maybe_exists%3#0", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%6#0", + "_%3#0", + "maybe_exists%3#0" + ] + }, + "473": { + "op": "bury 1", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%6#0", + "maybe_exists%3#0" + ] + }, + "475": { + "op": "!", + "defined_out": [ + "box_prefixed_key%6#0", + "role_address#0", + "role_id#1", + "tmp%8#0" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%6#0", + "tmp%8#0" + ] + }, + "476": { + "error": "Invalid account role address", + "op": "assert // Invalid account role address", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%6#0" + ] + }, + "477": { + "op": "dig 2", + "defined_out": [ + "box_prefixed_key%6#0", + "role_address#0", + "role_id#1", + "validity#0" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%6#0", + "validity#0" + ] + }, + "479": { + "op": "box_put", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1" + ] + }, + "480": { + "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14" + }, + "483": { + "block": "rbac_assign_role_after_if_else@11", + "stack_in": [ + "role_address#0", + "validity#0", + "role_id#1" + ], + "op": "dup", + "defined_out": [ + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "role_id#1" + ] + }, + "484": { + "op": "pushint 80", + "defined_out": [ + "80", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "role_id#1", + "80" + ] + }, + "486": { + "op": "==", + "defined_out": [ + "role_id#1", + "tmp%9#0" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "tmp%9#0" + ] + }, + "487": { + "op": "bz rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1" + ] + }, + "490": { + "op": "bytec 6 // 0x52234f6273657276657223", + "defined_out": [ + "0x52234f6273657276657223", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "0x52234f6273657276657223" + ] + }, + "492": { + "op": "dig 3", + "defined_out": [ + "0x52234f6273657276657223", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "0x52234f6273657276657223", + "role_address#0" + ] + }, + "494": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%8#0", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%8#0" + ] + }, + "495": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%8#0", + "box_prefixed_key%8#0 (copy)", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%8#0", + "box_prefixed_key%8#0 (copy)" + ] + }, + "496": { + "op": "box_len", + "defined_out": [ + "_%4#0", + "box_prefixed_key%8#0", + "maybe_exists%4#0", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%8#0", + "_%4#0", + "maybe_exists%4#0" + ] + }, + "497": { + "op": "bury 1", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%8#0", + "maybe_exists%4#0" + ] + }, + "499": { + "op": "!", + "defined_out": [ + "box_prefixed_key%8#0", + "role_address#0", + "role_id#1", + "tmp%10#0" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%8#0", + "tmp%10#0" + ] + }, + "500": { + "error": "Invalid account role address", + "op": "assert // Invalid account role address", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%8#0" + ] + }, + "501": { + "op": "dig 2", + "defined_out": [ + "box_prefixed_key%8#0", + "role_address#0", + "role_id#1", + "validity#0" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%8#0", + "validity#0" + ] + }, + "503": { + "op": "box_put", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1" + ] + }, + "504": { + "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14" + }, + "507": { + "subroutine": "modules.rbac.RbacModule.rbac_revoke_role[routing]", + "params": {}, + "block": "rbac_revoke_role", + "stack_in": [], + "op": "txna ApplicationArgs 1", + "defined_out": [ + "role_id#0" + ], + "stack_out": [ + "role_id#0" + ] + }, + "510": { + "op": "dup", + "defined_out": [ + "role_id#0", + "role_id#0 (copy)" + ], + "stack_out": [ + "role_id#0", + "role_id#0 (copy)" + ] + }, + "511": { + "op": "len", + "defined_out": [ + "len%0#0", + "role_id#0" + ], + "stack_out": [ + "role_id#0", + "len%0#0" + ] + }, + "512": { + "op": "intc_0 // 1", + "defined_out": [ + "1", + "len%0#0", + "role_id#0" + ], + "stack_out": [ + "role_id#0", + "len%0#0", + "1" + ] + }, + "513": { + "op": "==", + "defined_out": [ + "eq%0#0", + "role_id#0" + ], + "stack_out": [ + "role_id#0", + "eq%0#0" + ] + }, + "514": { + "error": "invalid number of bytes for arc4.uint8", + "op": "assert // invalid number of bytes for arc4.uint8", + "stack_out": [ + "role_id#0" + ] + }, + "515": { + "op": "txna ApplicationArgs 2" + }, + "518": { + "op": "dup", + "defined_out": [ + "role_address#0", + "role_id#0" + ], + "stack_out": [ + "role_id#0", + "role_address#0", + "role_address#0" + ] + }, + "519": { + "op": "cover 2", + "defined_out": [ + "role_address#0", + "role_id#0" + ], + "stack_out": [ + "role_address#0", + "role_id#0", + "role_address#0" + ] + }, + "521": { + "op": "len", + "defined_out": [ + "len%1#0", + "role_address#0", + "role_id#0" + ], + "stack_out": [ + "role_address#0", + "role_id#0", + "len%1#0" + ] + }, + "522": { + "op": "intc_2 // 32", + "defined_out": [ + "32", + "len%1#0", + "role_address#0", + "role_id#0" + ], + "stack_out": [ + "role_address#0", + "role_id#0", + "len%1#0", + "32" + ] + }, + "523": { + "op": "==", + "defined_out": [ + "eq%1#0", + "role_address#0", + "role_id#0" + ], + "stack_out": [ + "role_address#0", + "role_id#0", + "eq%1#0" + ] + }, + "524": { + "error": "invalid number of bytes for arc4.static_array", + "op": "assert // invalid number of bytes for arc4.static_array", + "stack_out": [ + "role_address#0", + "role_id#0" + ] + }, + "525": { + "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", + "op": "callsub _assert_caller_is_arranger" + }, + "528": { + "callsub": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", + "op": "callsub _assert_is_not_asset_defaulted" + }, + "531": { + "op": "btoi", + "defined_out": [ + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1" + ] + }, + "532": { + "op": "dupn 2", + "defined_out": [ + "role_address#0", + "role_id#1", + "role_id#1 (copy)" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "role_id#1", + "role_id#1 (copy)" + ] + }, + "534": { + "callsub": "modules.rbac.RbacModule._assert_valid_role", + "op": "callsub _assert_valid_role", + "stack_out": [ + "role_address#0", + "role_id#1", + "role_id#1" + ] + }, + "537": { + "op": "dup", + "stack_out": [ + "role_address#0", + "role_id#1", + "role_id#1", + "role_id#1 (copy)" + ] + }, + "538": { + "op": "intc_3 // 20", + "defined_out": [ + "20", + "role_address#0", + "role_id#1", + "role_id#1 (copy)" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "role_id#1", + "role_id#1 (copy)", + "20" + ] + }, + "539": { + "op": "!=", + "defined_out": [ + "role_address#0", + "role_id#1", + "tmp%0#2" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "role_id#1", + "tmp%0#2" + ] + }, + "540": { + "error": "Invalid role identifier", + "op": "assert // Invalid role identifier", + "stack_out": [ + "role_address#0", + "role_id#1", + "role_id#1" + ] + }, + "541": { + "op": "pushint 40", + "defined_out": [ + "40", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "role_id#1", + "40" + ] + }, + "543": { + "op": "==", + "defined_out": [ + "role_address#0", + "role_id#1", + "tmp%1#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "tmp%1#1" + ] + }, + "544": { + "op": "bz rbac_revoke_role_after_if_else@3", + "stack_out": [ + "role_address#0", + "role_id#1" + ] + }, + "547": { + "op": "bytec_3 // 0x52234163636f756e744d616e6167657223", + "defined_out": [ + "0x52234163636f756e744d616e6167657223", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "0x52234163636f756e744d616e6167657223" + ] + }, + "548": { + "op": "dig 2", + "stack_out": [ + "role_address#0", + "role_id#1", + "0x52234163636f756e744d616e6167657223", + "role_address#0" + ] + }, + "550": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%0#0", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%0#0" + ] + }, + "551": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%0#0", + "box_prefixed_key%0#0 (copy)", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%0#0", + "box_prefixed_key%0#0 (copy)" + ] + }, + "552": { + "op": "box_len", + "defined_out": [ + "_%0#0", + "box_prefixed_key%0#0", + "maybe_exists%0#0", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%0#0", + "_%0#0", + "maybe_exists%0#0" + ] + }, + "553": { + "op": "bury 1", + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%0#0", + "maybe_exists%0#0" + ] + }, + "555": { + "error": "Invalid account role address", + "op": "assert // Invalid account role address", + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%0#0" + ] + }, + "556": { + "op": "box_del", + "defined_out": [ + "role_address#0", + "role_id#1", + "{box_del}" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "{box_del}" + ] + }, + "557": { + "op": "pop", + "stack_out": [ + "role_address#0", + "role_id#1" + ] + }, + "558": { + "block": "rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12", + "stack_in": [ + "role_address#0", + "role_id#1" + ], + "op": "global LatestTimestamp", + "defined_out": [ + "tmp%2#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "tmp%2#1" + ] + }, + "560": { + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%0#0" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "aggregate%val_as_bytes%0#0" + ] + }, + "561": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "aggregate%val_as_bytes%0#0" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "aggregate%val_as_bytes%0#0", + "0x151f7c75" + ] + }, + "562": { + "op": "swap", + "stack_out": [ + "role_address#0", + "role_id#1", + "0x151f7c75", + "aggregate%val_as_bytes%0#0" + ] + }, + "563": { + "op": "concat", + "defined_out": [ + "tmp%5#0" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "tmp%5#0" + ] + }, + "564": { + "op": "log", + "stack_out": [ + "role_address#0", + "role_id#1" + ] + }, + "565": { + "op": "intc_0 // 1", + "defined_out": [ + "1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "1" + ] + }, + "566": { + "op": "return", + "stack_out": [ + "role_address#0", + "role_id#1" + ] + }, + "567": { + "block": "rbac_revoke_role_after_if_else@3", + "stack_in": [ + "role_address#0", + "role_id#1" + ], + "op": "dup", + "defined_out": [ + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "role_id#1" + ] + }, + "568": { + "op": "pushint 50", + "defined_out": [ + "50", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "role_id#1", + "50" + ] + }, + "570": { + "op": "==", + "defined_out": [ + "role_id#1", + "tmp%2#2" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "tmp%2#2" + ] + }, + "571": { + "op": "bz rbac_revoke_role_after_if_else@5", + "stack_out": [ + "role_address#0", + "role_id#1" + ] + }, + "574": { + "op": "bytec 4 // 0x52235072696d6172794465616c657223", + "defined_out": [ + "0x52235072696d6172794465616c657223", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "0x52235072696d6172794465616c657223" + ] + }, + "576": { + "op": "dig 2", + "defined_out": [ + "0x52235072696d6172794465616c657223", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "0x52235072696d6172794465616c657223", + "role_address#0" + ] + }, + "578": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%2#0", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%2#0" + ] + }, + "579": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%2#0", + "box_prefixed_key%2#0 (copy)", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%2#0", + "box_prefixed_key%2#0 (copy)" + ] + }, + "580": { + "op": "box_len", + "defined_out": [ + "_%1#0", + "box_prefixed_key%2#0", + "maybe_exists%1#0", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%2#0", + "_%1#0", + "maybe_exists%1#0" + ] + }, + "581": { + "op": "bury 1", + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%2#0", + "maybe_exists%1#0" + ] + }, + "583": { + "error": "Invalid account role address", + "op": "assert // Invalid account role address", + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%2#0" + ] + }, + "584": { + "op": "box_del", + "defined_out": [ + "role_address#0", + "role_id#1", + "{box_del}" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "{box_del}" + ] + }, + "585": { + "op": "pop", + "stack_out": [ + "role_address#0", + "role_id#1" + ] + }, + "586": { + "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" + }, + "589": { + "block": "rbac_revoke_role_after_if_else@5", + "stack_in": [ + "role_address#0", + "role_id#1" + ], + "op": "dup", + "defined_out": [ + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "role_id#1" + ] + }, + "590": { + "op": "pushint 60", + "defined_out": [ + "60", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "role_id#1", + "60" + ] + }, + "592": { + "op": "==", + "defined_out": [ + "role_id#1", + "tmp%3#0" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "tmp%3#0" + ] + }, + "593": { + "op": "bz rbac_revoke_role_after_if_else@7", + "stack_out": [ + "role_address#0", + "role_id#1" + ] + }, + "596": { + "op": "bytec 5 // 0x52235472757374656523", + "defined_out": [ + "0x52235472757374656523", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "0x52235472757374656523" + ] + }, + "598": { + "op": "dig 2", + "defined_out": [ + "0x52235472757374656523", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "0x52235472757374656523", + "role_address#0" + ] + }, + "600": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%4#0", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%4#0" + ] + }, + "601": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%4#0", + "box_prefixed_key%4#0 (copy)", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%4#0", + "box_prefixed_key%4#0 (copy)" + ] + }, + "602": { + "op": "box_len", + "defined_out": [ + "_%2#0", + "box_prefixed_key%4#0", + "maybe_exists%2#0", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%4#0", + "_%2#0", + "maybe_exists%2#0" + ] + }, + "603": { + "op": "bury 1", + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%4#0", + "maybe_exists%2#0" + ] + }, + "605": { + "error": "Invalid account role address", + "op": "assert // Invalid account role address", + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%4#0" + ] + }, + "606": { + "op": "box_del", + "defined_out": [ + "role_address#0", + "role_id#1", + "{box_del}" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "{box_del}" + ] + }, + "607": { + "op": "pop", + "stack_out": [ + "role_address#0", + "role_id#1" + ] + }, + "608": { + "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" + }, + "611": { + "block": "rbac_revoke_role_after_if_else@7", + "stack_in": [ + "role_address#0", + "role_id#1" + ], + "op": "dup", + "defined_out": [ + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "role_id#1" + ] + }, + "612": { + "op": "pushint 70", + "defined_out": [ + "70", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "role_id#1", + "70" + ] + }, + "614": { + "op": "==", + "defined_out": [ + "role_id#1", + "tmp%4#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "tmp%4#1" + ] + }, + "615": { + "op": "bz rbac_revoke_role_after_if_else@9", + "stack_out": [ + "role_address#0", + "role_id#1" + ] + }, + "618": { + "op": "bytec_2 // 0x5223417574686f7269747923", + "defined_out": [ + "0x5223417574686f7269747923", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "0x5223417574686f7269747923" + ] + }, + "619": { + "op": "dig 2", + "defined_out": [ + "0x5223417574686f7269747923", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "0x5223417574686f7269747923", + "role_address#0" + ] + }, + "621": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%6#0", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%6#0" + ] + }, + "622": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%6#0", + "box_prefixed_key%6#0 (copy)", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%6#0", + "box_prefixed_key%6#0 (copy)" + ] + }, + "623": { + "op": "box_len", + "defined_out": [ + "_%3#0", + "box_prefixed_key%6#0", + "maybe_exists%3#0", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%6#0", + "_%3#0", + "maybe_exists%3#0" + ] + }, + "624": { + "op": "bury 1", + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%6#0", + "maybe_exists%3#0" + ] + }, + "626": { + "error": "Invalid account role address", + "op": "assert // Invalid account role address", + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%6#0" + ] + }, + "627": { + "op": "box_del", + "defined_out": [ + "role_address#0", + "role_id#1", + "{box_del}" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "{box_del}" + ] + }, + "628": { + "op": "pop", + "stack_out": [ + "role_address#0", + "role_id#1" + ] + }, + "629": { + "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" + }, + "632": { + "block": "rbac_revoke_role_after_if_else@9", + "stack_in": [ + "role_address#0", + "role_id#1" + ], + "op": "dup", + "defined_out": [ + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "role_id#1" + ] + }, + "633": { + "op": "pushint 80", + "defined_out": [ + "80", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "role_id#1", + "80" + ] + }, + "635": { + "op": "==", + "defined_out": [ + "role_id#1", + "tmp%5#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "tmp%5#1" + ] + }, + "636": { + "op": "bz rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12", + "stack_out": [ + "role_address#0", + "role_id#1" + ] + }, + "639": { + "op": "bytec 6 // 0x52234f6273657276657223", + "defined_out": [ + "0x52234f6273657276657223", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "0x52234f6273657276657223" + ] + }, + "641": { + "op": "dig 2", + "defined_out": [ + "0x52234f6273657276657223", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "0x52234f6273657276657223", + "role_address#0" + ] + }, + "643": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%8#0", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%8#0" + ] + }, + "644": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%8#0", + "box_prefixed_key%8#0 (copy)", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%8#0", + "box_prefixed_key%8#0 (copy)" + ] + }, + "645": { + "op": "box_len", + "defined_out": [ + "_%4#0", + "box_prefixed_key%8#0", + "maybe_exists%4#0", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%8#0", + "_%4#0", + "maybe_exists%4#0" + ] + }, + "646": { + "op": "bury 1", + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%8#0", + "maybe_exists%4#0" + ] + }, + "648": { + "error": "Invalid account role address", + "op": "assert // Invalid account role address", + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%8#0" + ] + }, + "649": { + "op": "box_del", + "defined_out": [ + "role_address#0", + "role_id#1", + "{box_del}" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "{box_del}" + ] + }, + "650": { + "op": "pop", + "stack_out": [ + "role_address#0", + "role_id#1" + ] + }, + "651": { + "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" + }, + "654": { + "subroutine": "modules.rbac.RbacModule.rbac_gov_asset_suspension[routing]", + "params": {}, + "block": "rbac_gov_asset_suspension", + "stack_in": [], + "op": "txna ApplicationArgs 1", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "657": { + "op": "dup", + "defined_out": [ + "tmp%0#0", + "tmp%0#0 (copy)" + ], + "stack_out": [ + "tmp%0#0", + "tmp%0#0 (copy)" + ] + }, + "658": { + "op": "len", + "defined_out": [ + "len%0#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "len%0#0" + ] + }, + "659": { + "op": "intc_0 // 1", + "defined_out": [ + "1", + "len%0#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "len%0#0", + "1" + ] + }, + "660": { + "op": "==", + "defined_out": [ + "eq%0#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "eq%0#0" + ] + }, + "661": { + "error": "invalid number of bytes for arc4.bool", + "op": "assert // invalid number of bytes for arc4.bool", + "stack_out": [ + "tmp%0#0" + ] + }, + "662": { + "op": "intc_1 // 0", + "defined_out": [ + "0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "0" + ] + }, + "663": { + "op": "getbit", + "defined_out": [ + "suspended#0" + ], + "stack_out": [ + "suspended#0" + ] + }, + "664": { + "op": "bytec_2 // 0x5223417574686f7269747923", + "defined_out": [ + "0x5223417574686f7269747923", + "suspended#0" + ], + "stack_out": [ + "suspended#0", + "0x5223417574686f7269747923" + ] + }, + "665": { + "op": "txn Sender", + "defined_out": [ + "0x5223417574686f7269747923", + "suspended#0", + "tmp%0#2" + ], + "stack_out": [ + "suspended#0", + "0x5223417574686f7269747923", + "tmp%0#2" + ] + }, + "667": { + "callsub": "modules.rbac.RbacModule._role_is_active", + "op": "callsub _role_is_active", + "defined_out": [ + "suspended#0", + "tmp%1#0" + ], + "stack_out": [ + "suspended#0", + "tmp%1#0" + ] + }, + "670": { + "error": "Not authorized", + "op": "assert // Not authorized", + "stack_out": [ + "suspended#0" + ] + }, + "671": { + "op": "bytec 8 // \"asset_suspended\"", + "defined_out": [ + "\"asset_suspended\"", + "suspended#0" + ], + "stack_out": [ + "suspended#0", + "\"asset_suspended\"" + ] + }, + "673": { + "op": "swap", + "stack_out": [ + "\"asset_suspended\"", + "suspended#0" + ] + }, + "674": { + "op": "app_global_put", + "stack_out": [] + }, + "675": { + "op": "global LatestTimestamp", + "defined_out": [ + "tmp%0#1" + ], + "stack_out": [ + "tmp%0#1" + ] + }, + "677": { + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%0#0" + ], + "stack_out": [ + "aggregate%val_as_bytes%0#0" + ] + }, + "678": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "aggregate%val_as_bytes%0#0" + ], + "stack_out": [ + "aggregate%val_as_bytes%0#0", + "0x151f7c75" + ] + }, + "679": { + "op": "swap", + "stack_out": [ + "0x151f7c75", + "aggregate%val_as_bytes%0#0" + ] + }, + "680": { + "op": "concat", + "defined_out": [ + "tmp%4#0" + ], + "stack_out": [ + "tmp%4#0" + ] + }, + "681": { + "op": "log", + "stack_out": [] + }, + "682": { + "op": "intc_0 // 1", + "stack_out": [ + "1" + ] + }, + "683": { + "op": "return", + "stack_out": [] + }, + "684": { + "subroutine": "modules.rbac.RbacModule.rbac_get_arranger[routing]", + "params": {}, + "block": "rbac_get_arranger", + "stack_in": [], + "op": "intc_1 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "0" + ] + }, + "685": { + "op": "bytec_1 // 0x5223417272616e67657223", + "defined_out": [ + "0", + "0x5223417272616e67657223" + ], + "stack_out": [ + "0", + "0x5223417272616e67657223" + ] + }, + "686": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0" + ], + "stack_out": [ + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "687": { + "error": "check self.arranger exists", + "op": "assert // check self.arranger exists", + "stack_out": [ + "maybe_value%0#0" + ] + }, + "688": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "maybe_value%0#0" + ], + "stack_out": [ + "maybe_value%0#0", + "0x151f7c75" + ] + }, + "689": { + "op": "swap", + "stack_out": [ + "0x151f7c75", + "maybe_value%0#0" + ] + }, + "690": { + "op": "concat", + "defined_out": [ + "tmp%2#0" + ], + "stack_out": [ + "tmp%2#0" + ] + }, + "691": { + "op": "log", + "stack_out": [] + }, + "692": { + "op": "intc_0 // 1", + "defined_out": [ + "1" + ], + "stack_out": [ + "1" + ] + }, + "693": { + "op": "return", + "stack_out": [] + }, + "694": { + "subroutine": "modules.rbac.RbacModule.rbac_get_address_roles[routing]", + "params": {}, + "block": "rbac_get_address_roles", + "stack_in": [], + "op": "txna ApplicationArgs 1", + "defined_out": [ + "address#0" + ], + "stack_out": [ + "address#0" + ] + }, + "697": { + "op": "dup", + "defined_out": [ + "address#0", + "address#0 (copy)" + ], + "stack_out": [ + "address#0", + "address#0 (copy)" + ] + }, + "698": { + "op": "len", + "defined_out": [ + "address#0", + "len%0#0" + ], + "stack_out": [ + "address#0", + "len%0#0" + ] + }, + "699": { + "op": "intc_2 // 32", + "defined_out": [ + "32", + "address#0", + "len%0#0" + ], + "stack_out": [ + "address#0", + "len%0#0", + "32" + ] + }, + "700": { + "op": "==", + "defined_out": [ + "address#0", + "eq%0#0" + ], + "stack_out": [ + "address#0", + "eq%0#0" + ] + }, + "701": { + "error": "invalid number of bytes for arc4.static_array", + "op": "assert // invalid number of bytes for arc4.static_array", + "stack_out": [ + "address#0" + ] + }, + "702": { + "op": "bytec_3 // 0x52234163636f756e744d616e6167657223", + "defined_out": [ + "0x52234163636f756e744d616e6167657223", + "address#0" + ], + "stack_out": [ + "address#0", + "0x52234163636f756e744d616e6167657223" + ] + }, + "703": { + "op": "dig 1", + "stack_out": [ + "address#0", + "0x52234163636f756e744d616e6167657223", + "address#0 (copy)" + ] + }, + "705": { + "callsub": "modules.rbac.RbacModule._role_is_active", + "op": "callsub _role_is_active", + "defined_out": [ + "address#0", + "tmp%0#1" + ], + "stack_out": [ + "address#0", + "tmp%0#1" + ] + }, + "708": { + "op": "bytec 4 // 0x52235072696d6172794465616c657223", + "defined_out": [ + "0x52235072696d6172794465616c657223", + "address#0", + "tmp%0#1" + ], + "stack_out": [ + "address#0", + "tmp%0#1", + "0x52235072696d6172794465616c657223" + ] + }, + "710": { + "op": "dig 2", + "stack_out": [ + "address#0", + "tmp%0#1", + "0x52235072696d6172794465616c657223", + "address#0 (copy)" + ] + }, + "712": { + "callsub": "modules.rbac.RbacModule._role_is_active", + "op": "callsub _role_is_active", + "defined_out": [ + "address#0", + "tmp%0#1", + "tmp%1#1" + ], + "stack_out": [ + "address#0", + "tmp%0#1", + "tmp%1#1" + ] + }, + "715": { + "op": "bytec 5 // 0x52235472757374656523", + "defined_out": [ + "0x52235472757374656523", + "address#0", + "tmp%0#1", + "tmp%1#1" + ], + "stack_out": [ + "address#0", + "tmp%0#1", + "tmp%1#1", + "0x52235472757374656523" + ] + }, + "717": { + "op": "dig 3", + "stack_out": [ + "address#0", + "tmp%0#1", + "tmp%1#1", + "0x52235472757374656523", + "address#0 (copy)" + ] + }, + "719": { + "callsub": "modules.rbac.RbacModule._role_is_active", + "op": "callsub _role_is_active", + "defined_out": [ + "address#0", + "tmp%0#1", + "tmp%1#1", + "tmp%2#1" + ], + "stack_out": [ + "address#0", + "tmp%0#1", + "tmp%1#1", + "tmp%2#1" + ] + }, + "722": { + "op": "bytec_2 // 0x5223417574686f7269747923", + "defined_out": [ + "0x5223417574686f7269747923", + "address#0", + "tmp%0#1", + "tmp%1#1", + "tmp%2#1" + ], + "stack_out": [ + "address#0", + "tmp%0#1", + "tmp%1#1", + "tmp%2#1", + "0x5223417574686f7269747923" + ] + }, + "723": { + "op": "dig 4", + "stack_out": [ + "address#0", + "tmp%0#1", + "tmp%1#1", + "tmp%2#1", + "0x5223417574686f7269747923", + "address#0 (copy)" + ] + }, + "725": { + "callsub": "modules.rbac.RbacModule._role_is_active", + "op": "callsub _role_is_active", + "defined_out": [ + "address#0", + "tmp%0#1", + "tmp%1#1", + "tmp%2#1", + "tmp%3#1" + ], + "stack_out": [ + "address#0", + "tmp%0#1", + "tmp%1#1", + "tmp%2#1", + "tmp%3#1" + ] + }, + "728": { + "op": "bytec 6 // 0x52234f6273657276657223", + "defined_out": [ + "0x52234f6273657276657223", + "address#0", + "tmp%0#1", + "tmp%1#1", + "tmp%2#1", + "tmp%3#1" + ], + "stack_out": [ + "address#0", + "tmp%0#1", + "tmp%1#1", + "tmp%2#1", + "tmp%3#1", + "0x52234f6273657276657223" + ] + }, + "730": { + "op": "uncover 5", + "stack_out": [ + "tmp%0#1", + "tmp%1#1", + "tmp%2#1", + "tmp%3#1", + "0x52234f6273657276657223", + "address#0" + ] + }, + "732": { + "callsub": "modules.rbac.RbacModule._role_is_active", + "op": "callsub _role_is_active", + "defined_out": [ + "tmp%0#1", + "tmp%1#1", + "tmp%2#1", + "tmp%3#1", + "tmp%4#1" + ], + "stack_out": [ + "tmp%0#1", + "tmp%1#1", + "tmp%2#1", + "tmp%3#1", + "tmp%4#1" + ] + }, + "735": { + "op": "pushbytes 0x00", + "defined_out": [ + "0x00", + "tmp%0#1", + "tmp%1#1", + "tmp%2#1", + "tmp%3#1", + "tmp%4#1" + ], + "stack_out": [ + "tmp%0#1", + "tmp%1#1", + "tmp%2#1", + "tmp%3#1", + "tmp%4#1", + "0x00" + ] + }, + "738": { + "op": "intc_1 // 0", + "defined_out": [ + "0", + "0x00", + "tmp%0#1", + "tmp%1#1", + "tmp%2#1", + "tmp%3#1", + "tmp%4#1" + ], + "stack_out": [ + "tmp%0#1", + "tmp%1#1", + "tmp%2#1", + "tmp%3#1", + "tmp%4#1", + "0x00", + "0" + ] + }, + "739": { + "op": "uncover 6", + "stack_out": [ + "tmp%1#1", + "tmp%2#1", + "tmp%3#1", + "tmp%4#1", + "0x00", + "0", + "tmp%0#1" + ] + }, + "741": { + "op": "setbit", + "defined_out": [ + "aggregate%encoded_bool%0#0", + "tmp%1#1", + "tmp%2#1", + "tmp%3#1", + "tmp%4#1" + ], + "stack_out": [ + "tmp%1#1", + "tmp%2#1", + "tmp%3#1", + "tmp%4#1", + "aggregate%encoded_bool%0#0" + ] + }, + "742": { + "op": "intc_0 // 1", + "defined_out": [ + "1", + "aggregate%encoded_bool%0#0", + "tmp%1#1", + "tmp%2#1", + "tmp%3#1", + "tmp%4#1" + ], + "stack_out": [ + "tmp%1#1", + "tmp%2#1", + "tmp%3#1", + "tmp%4#1", + "aggregate%encoded_bool%0#0", + "1" + ] + }, + "743": { + "op": "uncover 5", + "stack_out": [ + "tmp%2#1", + "tmp%3#1", + "tmp%4#1", + "aggregate%encoded_bool%0#0", + "1", + "tmp%1#1" + ] + }, + "745": { + "op": "setbit", + "defined_out": [ + "aggregate%set_bit%0#0", + "tmp%2#1", + "tmp%3#1", + "tmp%4#1" + ], + "stack_out": [ + "tmp%2#1", + "tmp%3#1", + "tmp%4#1", + "aggregate%set_bit%0#0" + ] + }, + "746": { + "op": "pushint 2", + "defined_out": [ + "2", + "aggregate%set_bit%0#0", + "tmp%2#1", + "tmp%3#1", + "tmp%4#1" + ], + "stack_out": [ + "tmp%2#1", + "tmp%3#1", + "tmp%4#1", + "aggregate%set_bit%0#0", + "2" + ] + }, + "748": { + "op": "uncover 4", + "stack_out": [ + "tmp%3#1", + "tmp%4#1", + "aggregate%set_bit%0#0", + "2", + "tmp%2#1" + ] + }, + "750": { + "op": "setbit", + "defined_out": [ + "aggregate%set_bit%1#0", + "tmp%3#1", + "tmp%4#1" + ], + "stack_out": [ + "tmp%3#1", + "tmp%4#1", + "aggregate%set_bit%1#0" + ] + }, + "751": { + "op": "pushint 3", + "defined_out": [ + "3", + "aggregate%set_bit%1#0", + "tmp%3#1", + "tmp%4#1" + ], + "stack_out": [ + "tmp%3#1", + "tmp%4#1", + "aggregate%set_bit%1#0", + "3" + ] + }, + "753": { + "op": "uncover 3", + "stack_out": [ + "tmp%4#1", + "aggregate%set_bit%1#0", + "3", + "tmp%3#1" + ] + }, + "755": { + "op": "setbit", + "defined_out": [ + "aggregate%set_bit%2#0", + "tmp%4#1" + ], + "stack_out": [ + "tmp%4#1", + "aggregate%set_bit%2#0" + ] + }, + "756": { + "op": "pushint 4", + "defined_out": [ + "4", + "aggregate%set_bit%2#0", + "tmp%4#1" + ], + "stack_out": [ + "tmp%4#1", + "aggregate%set_bit%2#0", + "4" + ] + }, + "758": { + "op": "uncover 2", + "stack_out": [ + "aggregate%set_bit%2#0", + "4", + "tmp%4#1" + ] + }, + "760": { + "op": "setbit", + "defined_out": [ + "aggregate%set_bit%3#0" + ], + "stack_out": [ + "aggregate%set_bit%3#0" + ] + }, + "761": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "aggregate%set_bit%3#0" + ], + "stack_out": [ + "aggregate%set_bit%3#0", + "0x151f7c75" + ] + }, + "762": { + "op": "swap", + "stack_out": [ + "0x151f7c75", + "aggregate%set_bit%3#0" + ] + }, + "763": { + "op": "concat", + "defined_out": [ + "tmp%8#0" + ], + "stack_out": [ + "tmp%8#0" + ] + }, + "764": { + "op": "log", + "stack_out": [] + }, + "765": { + "op": "intc_0 // 1", + "stack_out": [ + "1" + ] + }, + "766": { + "op": "return", + "stack_out": [] + }, + "767": { + "subroutine": "modules.rbac.RbacModule.rbac_get_role_validity[routing]", + "params": {}, + "block": "rbac_get_role_validity", + "stack_in": [], + "op": "txna ApplicationArgs 1", + "defined_out": [ + "role_id#0" + ], + "stack_out": [ + "role_id#0" + ] + }, + "770": { + "op": "dup", + "defined_out": [ + "role_id#0", + "role_id#0 (copy)" + ], + "stack_out": [ + "role_id#0", + "role_id#0 (copy)" + ] + }, + "771": { + "op": "len", + "defined_out": [ + "len%0#0", + "role_id#0" + ], + "stack_out": [ + "role_id#0", + "len%0#0" + ] + }, + "772": { + "op": "intc_0 // 1", + "defined_out": [ + "1", + "len%0#0", + "role_id#0" + ], + "stack_out": [ + "role_id#0", + "len%0#0", + "1" + ] + }, + "773": { + "op": "==", + "defined_out": [ + "eq%0#0", + "role_id#0" + ], + "stack_out": [ + "role_id#0", + "eq%0#0" + ] + }, + "774": { + "error": "invalid number of bytes for arc4.uint8", + "op": "assert // invalid number of bytes for arc4.uint8", + "stack_out": [ + "role_id#0" + ] + }, + "775": { + "op": "txna ApplicationArgs 2" + }, + "778": { + "op": "dup", + "defined_out": [ + "role_address#0", + "role_id#0" + ], + "stack_out": [ + "role_id#0", + "role_address#0", + "role_address#0" + ] + }, + "779": { + "op": "cover 2", + "defined_out": [ + "role_address#0", + "role_id#0" + ], + "stack_out": [ + "role_address#0", + "role_id#0", + "role_address#0" + ] + }, + "781": { + "op": "len", + "defined_out": [ + "len%1#0", + "role_address#0", + "role_id#0" + ], + "stack_out": [ + "role_address#0", + "role_id#0", + "len%1#0" + ] + }, + "782": { + "op": "intc_2 // 32", + "defined_out": [ + "32", + "len%1#0", + "role_address#0", + "role_id#0" + ], + "stack_out": [ + "role_address#0", + "role_id#0", + "len%1#0", + "32" + ] + }, + "783": { + "op": "==", + "defined_out": [ + "eq%1#0", + "role_address#0", + "role_id#0" + ], + "stack_out": [ + "role_address#0", + "role_id#0", + "eq%1#0" + ] + }, + "784": { + "error": "invalid number of bytes for arc4.static_array", + "op": "assert // invalid number of bytes for arc4.static_array", + "stack_out": [ + "role_address#0", + "role_id#0" + ] + }, + "785": { + "op": "btoi", + "defined_out": [ + "role#0", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "role#0" + ] + }, + "786": { + "op": "dup", + "defined_out": [ + "role#0", + "role#0 (copy)", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "role#0", + "role#0 (copy)" + ] + }, + "787": { + "callsub": "modules.rbac.RbacModule._assert_valid_role", + "op": "callsub _assert_valid_role", + "stack_out": [ + "role_address#0", + "role#0" + ] + }, + "790": { + "op": "intc_3 // 20", + "defined_out": [ + "20", + "role#0", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "role#0", + "20" + ] + }, + "791": { + "op": "pushints 40 50 60 70 80", + "defined_out": [ + "20", + "40", + "50", + "60", + "70", + "80", + "role#0", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "role#0", + "20", + "40", + "50", + "60", + "70", + "80" + ] + }, + "798": { + "op": "uncover 6", + "stack_out": [ + "role_address#0", + "20", + "40", + "50", + "60", + "70", + "80", + "role#0" + ] + }, + "800": { + "op": "match rbac_get_role_validity_switch_case_0@2 rbac_get_role_validity_switch_case_1@3 rbac_get_role_validity_switch_case_2@4 rbac_get_role_validity_switch_case_3@5 rbac_get_role_validity_switch_case_4@6 rbac_get_role_validity_switch_case_5@7", + "stack_out": [ + "role_address#0" + ] + }, + "814": { + "error": "Invalid role identifier", + "op": "err // Invalid role identifier" + }, + "815": { + "block": "rbac_get_role_validity_switch_case_5@7", + "stack_in": [ + "role_address#0" + ], + "op": "bytec 6 // 0x52234f6273657276657223", + "defined_out": [ + "0x52234f6273657276657223" + ], + "stack_out": [ + "role_address#0", + "0x52234f6273657276657223" + ] + }, + "817": { + "op": "dig 1", + "defined_out": [ + "0x52234f6273657276657223", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "0x52234f6273657276657223", + "role_address#0" + ] + }, + "819": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%0#1", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1" + ] + }, + "820": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%0#1", + "box_prefixed_key%0#1 (copy)", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1", + "box_prefixed_key%0#1 (copy)" + ] + }, + "821": { + "op": "box_len", + "defined_out": [ + "_%0#0", + "box_prefixed_key%0#1", + "maybe_exists%0#0", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1", + "_%0#0", + "maybe_exists%0#0" + ] + }, + "822": { + "op": "bury 1", + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1", + "maybe_exists%0#0" + ] + }, + "824": { + "error": "Invalid account role address", + "op": "assert // Invalid account role address", + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1" + ] + }, + "825": { + "op": "box_get", + "defined_out": [ + "aggregate%box_get%8#0", + "aggregate%box_get%9#0", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "aggregate%box_get%8#0", + "aggregate%box_get%9#0" + ] + }, + "826": { + "op": "pop", + "defined_out": [ + "role_address#0", + "tmp%3#0" + ], + "stack_out": [ + "role_address#0", + "tmp%3#0" + ] + }, + "827": { + "block": "rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9", + "stack_in": [ + "role_address#0", + "tmp%3#0" + ], + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75" + ], + "stack_out": [ + "role_address#0", + "tmp%3#0", + "0x151f7c75" + ] + }, + "828": { + "op": "swap", + "defined_out": [ + "0x151f7c75", + "tmp%3#0" + ], + "stack_out": [ + "role_address#0", + "0x151f7c75", + "tmp%3#0" + ] + }, + "829": { + "op": "concat", + "defined_out": [ + "tmp%4#0" + ], + "stack_out": [ + "role_address#0", + "tmp%4#0" + ] + }, + "830": { + "op": "log", + "stack_out": [ + "role_address#0" + ] + }, + "831": { + "op": "intc_0 // 1", + "defined_out": [ + "1" + ], + "stack_out": [ + "role_address#0", + "1" + ] + }, + "832": { + "op": "return", + "stack_out": [ + "role_address#0" + ] + }, + "833": { + "block": "rbac_get_role_validity_switch_case_4@6", + "stack_in": [ + "role_address#0" + ], + "op": "bytec_2 // 0x5223417574686f7269747923", + "defined_out": [ + "0x5223417574686f7269747923" + ], + "stack_out": [ + "role_address#0", + "0x5223417574686f7269747923" + ] + }, + "834": { + "op": "dig 1", + "defined_out": [ + "0x5223417574686f7269747923", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "0x5223417574686f7269747923", + "role_address#0" + ] + }, + "836": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%0#1", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1" + ] + }, + "837": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%0#1", + "box_prefixed_key%0#1 (copy)", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1", + "box_prefixed_key%0#1 (copy)" + ] + }, + "838": { + "op": "box_len", + "defined_out": [ + "_%0#0", + "box_prefixed_key%0#1", + "maybe_exists%0#0", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1", + "_%0#0", + "maybe_exists%0#0" + ] + }, + "839": { + "op": "bury 1", + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1", + "maybe_exists%0#0" + ] + }, + "841": { + "error": "Invalid account role address", + "op": "assert // Invalid account role address", + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1" + ] + }, + "842": { + "op": "box_get", + "defined_out": [ + "aggregate%box_get%6#0", + "aggregate%box_get%7#0", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "aggregate%box_get%6#0", + "aggregate%box_get%7#0" + ] + }, + "843": { + "op": "pop", + "defined_out": [ + "role_address#0", + "tmp%3#0" + ], + "stack_out": [ + "role_address#0", + "tmp%3#0" + ] + }, + "844": { + "op": "b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9" + }, + "847": { + "block": "rbac_get_role_validity_switch_case_3@5", + "stack_in": [ + "role_address#0" + ], + "op": "bytec 5 // 0x52235472757374656523", + "defined_out": [ + "0x52235472757374656523" + ], + "stack_out": [ + "role_address#0", + "0x52235472757374656523" + ] + }, + "849": { + "op": "dig 1", + "defined_out": [ + "0x52235472757374656523", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "0x52235472757374656523", + "role_address#0" + ] + }, + "851": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%0#1", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1" + ] + }, + "852": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%0#1", + "box_prefixed_key%0#1 (copy)", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1", + "box_prefixed_key%0#1 (copy)" + ] + }, + "853": { + "op": "box_len", + "defined_out": [ + "_%0#0", + "box_prefixed_key%0#1", + "maybe_exists%0#0", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1", + "_%0#0", + "maybe_exists%0#0" + ] + }, + "854": { + "op": "bury 1", + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1", + "maybe_exists%0#0" + ] + }, + "856": { + "error": "Invalid account role address", + "op": "assert // Invalid account role address", + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1" + ] + }, + "857": { + "op": "box_get", + "defined_out": [ + "aggregate%box_get%4#0", + "aggregate%box_get%5#0", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "aggregate%box_get%4#0", + "aggregate%box_get%5#0" + ] + }, + "858": { + "op": "pop", + "defined_out": [ + "role_address#0", + "tmp%3#0" + ], + "stack_out": [ + "role_address#0", + "tmp%3#0" + ] + }, + "859": { + "op": "b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9" + }, + "862": { + "block": "rbac_get_role_validity_switch_case_2@4", + "stack_in": [ + "role_address#0" + ], + "op": "bytec 4 // 0x52235072696d6172794465616c657223", + "defined_out": [ + "0x52235072696d6172794465616c657223" + ], + "stack_out": [ + "role_address#0", + "0x52235072696d6172794465616c657223" + ] + }, + "864": { + "op": "dig 1", + "defined_out": [ + "0x52235072696d6172794465616c657223", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "0x52235072696d6172794465616c657223", + "role_address#0" + ] + }, + "866": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%0#1", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1" + ] + }, + "867": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%0#1", + "box_prefixed_key%0#1 (copy)", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1", + "box_prefixed_key%0#1 (copy)" + ] + }, + "868": { + "op": "box_len", + "defined_out": [ + "_%0#0", + "box_prefixed_key%0#1", + "maybe_exists%0#0", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1", + "_%0#0", + "maybe_exists%0#0" + ] + }, + "869": { + "op": "bury 1", + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1", + "maybe_exists%0#0" + ] + }, + "871": { + "error": "Invalid account role address", + "op": "assert // Invalid account role address", + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1" + ] + }, + "872": { + "op": "box_get", + "defined_out": [ + "aggregate%box_get%2#0", + "aggregate%box_get%3#0", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "aggregate%box_get%2#0", + "aggregate%box_get%3#0" + ] + }, + "873": { + "op": "pop", + "defined_out": [ + "role_address#0", + "tmp%3#0" + ], + "stack_out": [ + "role_address#0", + "tmp%3#0" + ] + }, + "874": { + "op": "b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9" + }, + "877": { + "block": "rbac_get_role_validity_switch_case_1@3", + "stack_in": [ + "role_address#0" + ], + "op": "bytec_3 // 0x52234163636f756e744d616e6167657223", + "defined_out": [ + "0x52234163636f756e744d616e6167657223" + ], + "stack_out": [ + "role_address#0", + "0x52234163636f756e744d616e6167657223" + ] + }, + "878": { + "op": "dig 1", + "defined_out": [ + "0x52234163636f756e744d616e6167657223", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "0x52234163636f756e744d616e6167657223", + "role_address#0" + ] + }, + "880": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%0#1", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1" + ] + }, + "881": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%0#1", + "box_prefixed_key%0#1 (copy)", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1", + "box_prefixed_key%0#1 (copy)" + ] + }, + "882": { + "op": "box_len", + "defined_out": [ + "_%0#0", + "box_prefixed_key%0#1", + "maybe_exists%0#0", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1", + "_%0#0", + "maybe_exists%0#0" + ] + }, + "883": { + "op": "bury 1", + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1", + "maybe_exists%0#0" + ] + }, + "885": { + "error": "Invalid account role address", + "op": "assert // Invalid account role address", + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1" + ] + }, + "886": { + "op": "box_get", + "defined_out": [ + "aggregate%box_get%0#0", + "aggregate%box_get%1#0", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "aggregate%box_get%0#0", + "aggregate%box_get%1#0" + ] + }, + "887": { + "op": "pop", + "defined_out": [ + "role_address#0", + "tmp%3#0" + ], + "stack_out": [ + "role_address#0", + "tmp%3#0" + ] + }, + "888": { + "op": "b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9" + }, + "891": { + "block": "rbac_get_role_validity_switch_case_0@2", + "stack_in": [ + "role_address#0" + ], + "op": "pushbytes 0x00000000000000000000000000000000", + "defined_out": [ + "tmp%3#0" + ], + "stack_out": [ + "role_address#0", + "tmp%3#0" + ] + }, + "909": { + "op": "b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9" + }, + "912": { + "subroutine": "modules.rbac.RbacModule._role_is_active", + "params": { + "role_map#0": "bytes", + "role_address#0": "bytes" + }, + "block": "_role_is_active", + "stack_in": [], + "op": "proto 2 1" + }, + "915": { + "op": "pushbytes \"\"", + "stack_out": [ + "awst_tmp%0#0" + ] + }, + "917": { + "op": "frame_dig -2", + "defined_out": [ + "role_map#0 (copy)" + ], + "stack_out": [ + "awst_tmp%0#0", + "role_map#0 (copy)" + ] + }, + "919": { + "op": "frame_dig -1", + "defined_out": [ + "role_address#0 (copy)", + "role_map#0 (copy)" + ], + "stack_out": [ + "awst_tmp%0#0", + "role_map#0 (copy)", + "role_address#0 (copy)" + ] + }, + "921": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%0#1" + ], + "stack_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1" + ] + }, + "922": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%0#1" + ], + "stack_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "box_prefixed_key%0#1" + ] + }, + "923": { + "op": "box_len", + "defined_out": [ + "_%0#0", + "box_prefixed_key%0#1", + "maybe_exists%0#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "_%0#0", + "maybe_exists%0#0" + ] + }, + "924": { + "op": "bury 1", + "stack_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "maybe_exists%0#0" + ] + }, + "926": { + "op": "bz _role_is_active_bool_false@4", + "stack_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1" + ] + }, + "929": { + "op": "frame_dig 1", + "stack_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "box_prefixed_key%0#1" + ] + }, + "931": { + "op": "box_get", + "defined_out": [ + "aggregate%box_get%0#0", + "aggregate%box_get%1#0", + "box_prefixed_key%0#1" + ], + "stack_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "aggregate%box_get%0#0", + "aggregate%box_get%1#0" + ] + }, + "932": { + "error": "check BoxMap entry exists", + "op": "assert // check BoxMap entry exists", + "stack_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "aggregate%box_get%0#0" + ] + }, + "933": { + "op": "intc_1 // 0", + "stack_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "aggregate%box_get%0#0", + "0" + ] + }, + "934": { + "op": "extract_uint64", + "defined_out": [ + "box_prefixed_key%0#1", + "values%0#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "values%0#0" + ] + }, + "935": { + "op": "global LatestTimestamp" + }, + "937": { + "op": "dup", + "defined_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "values%0#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "values%0#0", + "awst_tmp%0#0", + "awst_tmp%0#0" + ] + }, + "938": { + "op": "frame_bury 0", + "defined_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "values%0#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "values%0#0", + "awst_tmp%0#0" + ] + }, + "940": { + "op": "<=", + "defined_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "tmp%1#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "tmp%1#0" + ] + }, + "941": { + "op": "bz _role_is_active_bool_false@4", + "stack_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1" + ] + }, + "944": { + "op": "frame_dig 1", + "stack_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "box_prefixed_key%0#1" + ] + }, + "946": { + "op": "box_get", + "defined_out": [ + "aggregate%box_get%2#0", + "aggregate%box_get%3#0", + "awst_tmp%0#0", + "box_prefixed_key%0#1" + ], + "stack_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "aggregate%box_get%2#0", + "aggregate%box_get%3#0" + ] + }, + "947": { + "error": "check BoxMap entry exists", + "op": "assert // check BoxMap entry exists", + "stack_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "aggregate%box_get%2#0" + ] + }, + "948": { + "op": "pushint 8", + "defined_out": [ + "8", + "aggregate%box_get%2#0", + "awst_tmp%0#0", + "box_prefixed_key%0#1" + ], + "stack_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "aggregate%box_get%2#0", + "8" + ] + }, + "950": { + "op": "extract_uint64", + "defined_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "values%1#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "values%1#0" + ] + }, + "951": { + "op": "frame_dig 0", + "stack_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "values%1#0", + "awst_tmp%0#0" + ] + }, + "953": { + "op": ">=", + "defined_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "tmp%2#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "tmp%2#0" + ] + }, + "954": { + "op": "bz _role_is_active_bool_false@4", + "stack_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1" + ] + }, + "957": { + "op": "intc_0 // 1", + "defined_out": [ + "and_result%0#0", + "awst_tmp%0#0", + "box_prefixed_key%0#1" + ], + "stack_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "and_result%0#0" + ] + }, + "958": { + "block": "_role_is_active_bool_merge@5", + "stack_in": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "and_result%0#0" + ], + "op": "frame_bury 0", + "defined_out": [ + "and_result%0#0" + ] + }, + "960": { + "retsub": true, + "op": "retsub" + }, + "961": { + "block": "_role_is_active_bool_false@4", + "stack_in": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1" + ], + "op": "intc_1 // 0", + "defined_out": [ + "and_result%0#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "and_result%0#0" + ] + }, + "962": { + "op": "b _role_is_active_bool_merge@5" + }, + "965": { + "subroutine": "modules.rbac.RbacModule._assert_caller_is_arranger", + "params": {}, + "block": "_assert_caller_is_arranger", + "stack_in": [], + "op": "txn Sender", + "defined_out": [ + "role_address#0" + ], + "stack_out": [ + "role_address#0" + ] + }, + "967": { + "op": "intc_1 // 0", + "defined_out": [ + "0", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "0" + ] + }, + "968": { + "op": "bytec_1 // 0x5223417272616e67657223", + "defined_out": [ + "0", + "0x5223417272616e67657223", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "0", + "0x5223417272616e67657223" + ] + }, + "969": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "970": { + "error": "check self.arranger exists", + "op": "assert // check self.arranger exists", + "stack_out": [ + "role_address#0", + "maybe_value%0#0" + ] + }, + "971": { + "op": "==", + "defined_out": [ + "tmp%0#1" + ], + "stack_out": [ + "tmp%0#1" + ] + }, + "972": { + "error": "Not authorized", + "op": "assert // Not authorized", + "stack_out": [] + }, + "973": { + "retsub": true, + "op": "retsub" + }, + "974": { + "subroutine": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", + "params": {}, + "block": "_assert_is_not_asset_defaulted", + "stack_in": [], + "op": "intc_1 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "0" + ] + }, + "975": { + "op": "bytec 9 // \"asset_defaulted\"", + "defined_out": [ + "\"asset_defaulted\"", + "0" + ], + "stack_out": [ + "0", + "\"asset_defaulted\"" + ] + }, + "977": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0" + ], + "stack_out": [ + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "978": { + "error": "check self.asset_defaulted exists", + "op": "assert // check self.asset_defaulted exists", + "stack_out": [ + "maybe_value%0#0" + ] + }, + "979": { + "op": "!", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "980": { + "error": "Defaulted", + "op": "assert // Defaulted", + "stack_out": [] + }, + "981": { + "retsub": true, + "op": "retsub" + }, + "982": { + "subroutine": "modules.rbac.RbacModule._assert_valid_role", + "params": { + "role_id#0": "uint64" + }, + "block": "_assert_valid_role", + "stack_in": [], + "op": "proto 1 0" + }, + "985": { + "op": "frame_dig -1", + "defined_out": [ + "role_id#0 (copy)" + ], + "stack_out": [ + "role_id#0 (copy)" + ] + }, + "987": { + "op": "intc_3 // 20", + "defined_out": [ + "20", + "role_id#0 (copy)" + ], + "stack_out": [ + "role_id#0 (copy)", + "20" + ] + }, + "988": { + "op": "==", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "989": { + "op": "bnz _assert_valid_role_bool_true@7", + "stack_out": [] + }, + "992": { + "op": "frame_dig -1", + "stack_out": [ + "role_id#0 (copy)" + ] + }, + "994": { + "op": "pushint 25", + "defined_out": [ + "25", + "role_id#0 (copy)" + ], + "stack_out": [ + "role_id#0 (copy)", + "25" + ] + }, + "996": { + "op": "==", + "defined_out": [ + "tmp%1#0" + ], + "stack_out": [ + "tmp%1#0" + ] + }, + "997": { + "op": "bnz _assert_valid_role_bool_true@7", + "stack_out": [] + }, + "1000": { + "op": "frame_dig -1", + "stack_out": [ + "role_id#0 (copy)" + ] + }, + "1002": { + "op": "pushint 40", + "defined_out": [ + "40", + "role_id#0 (copy)" + ], + "stack_out": [ + "role_id#0 (copy)", + "40" + ] + }, + "1004": { + "op": "==", + "defined_out": [ + "tmp%2#0" + ], + "stack_out": [ + "tmp%2#0" + ] + }, + "1005": { + "op": "bnz _assert_valid_role_bool_true@7", + "stack_out": [] + }, + "1008": { + "op": "frame_dig -1", + "stack_out": [ + "role_id#0 (copy)" + ] + }, + "1010": { + "op": "pushint 50", + "defined_out": [ + "50", + "role_id#0 (copy)" + ], + "stack_out": [ + "role_id#0 (copy)", + "50" + ] + }, + "1012": { + "op": "==", + "defined_out": [ + "tmp%3#0" + ], + "stack_out": [ + "tmp%3#0" + ] + }, + "1013": { + "op": "bnz _assert_valid_role_bool_true@7", + "stack_out": [] + }, + "1016": { + "op": "frame_dig -1", + "stack_out": [ + "role_id#0 (copy)" + ] + }, + "1018": { + "op": "pushint 60", + "defined_out": [ + "60", + "role_id#0 (copy)" + ], + "stack_out": [ + "role_id#0 (copy)", + "60" + ] + }, + "1020": { + "op": "==", + "defined_out": [ + "tmp%4#0" + ], + "stack_out": [ + "tmp%4#0" + ] + }, + "1021": { + "op": "bnz _assert_valid_role_bool_true@7", + "stack_out": [] + }, + "1024": { + "op": "frame_dig -1", + "stack_out": [ + "role_id#0 (copy)" + ] + }, + "1026": { + "op": "pushint 70", + "defined_out": [ + "70", + "role_id#0 (copy)" + ], + "stack_out": [ + "role_id#0 (copy)", + "70" + ] + }, + "1028": { + "op": "==", + "defined_out": [ + "tmp%5#0" + ], + "stack_out": [ + "tmp%5#0" + ] + }, + "1029": { + "op": "bnz _assert_valid_role_bool_true@7", + "stack_out": [] + }, + "1032": { + "op": "frame_dig -1", + "stack_out": [ + "role_id#0 (copy)" + ] + }, + "1034": { + "op": "pushint 80", + "defined_out": [ + "80", + "role_id#0 (copy)" + ], + "stack_out": [ + "role_id#0 (copy)", + "80" + ] + }, + "1036": { + "op": "==", + "defined_out": [ + "tmp%6#0" + ], + "stack_out": [ + "tmp%6#0" + ] + }, + "1037": { + "op": "bz _assert_valid_role_bool_false@8", + "stack_out": [] + }, + "1040": { + "block": "_assert_valid_role_bool_true@7", + "stack_in": [], + "op": "intc_0 // 1", + "defined_out": [ + "or_result%0#0" + ], + "stack_out": [ + "or_result%0#0" + ] + }, + "1041": { + "error": "Invalid role identifier", + "block": "_assert_valid_role_bool_merge@9", + "stack_in": [ + "or_result%0#0" + ], + "op": "assert // Invalid role identifier", + "defined_out": [], + "stack_out": [] + }, + "1042": { + "retsub": true, + "op": "retsub" + }, + "1043": { + "block": "_assert_valid_role_bool_false@8", + "stack_in": [], + "op": "intc_1 // 0", + "defined_out": [ + "or_result%0#0" + ], + "stack_out": [ + "or_result%0#0" + ] + }, + "1044": { + "op": "b _assert_valid_role_bool_merge@9" + } + } +} \ No newline at end of file diff --git a/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.approval.teal b/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.approval.teal new file mode 100644 index 00000000..e0bc52d3 --- /dev/null +++ b/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.approval.teal @@ -0,0 +1,1087 @@ +#pragma version 11 +#pragma typetrack false + +// algopy.arc4.ARC4Contract.approval_program() -> uint64: +main: + intcblock 1 0 32 20 + bytecblock 0x151f7c75 0x5223417272616e67657223 0x5223417574686f7269747923 0x52234163636f756e744d616e6167657223 0x52235072696d6172794465616c657223 0x52235472757374656523 0x52234f6273657276657223 0x52234f704461656d6f6e23 "asset_suspended" "asset_defaulted" + txn ApplicationID + bnz main_after_if_else@2 + // modules/rbac.py:28-29 + // # RBAC Roles + // self.arranger = GlobalState(Account(), key=cst.PREFIX_ID_ARRANGER) + bytec_1 // 0x5223417272616e67657223 + global ZeroAddress + app_global_put + // modules/rbac.py:30 + // self.op_daemon = GlobalState(Account(), key=cst.PREFIX_ID_OP_DAEMON) + bytec 7 // 0x52234f704461656d6f6e23 + global ZeroAddress + app_global_put + // modules/rbac.py:47-48 + // # D-ASA Governance + // self.asset_suspended = False + bytec 8 // "asset_suspended" + intc_1 // 0 + app_global_put + // modules/rbac.py:49 + // self.asset_defaulted = False + bytec 9 // "asset_defaulted" + intc_1 // 0 + app_global_put + +main_after_if_else@2: + // smart_contracts/mock_module_rbac/contract.py:6 + // class MockRbacModule(RbacModule): + txn NumAppArgs + bz main_create@19 + pushbytes 0x914f04eb // method "contract_update()void" + txna ApplicationArgs 0 + match main_contract_update_route@5 + +main_switch_case_next@6: + // smart_contracts/mock_module_rbac/contract.py:6 + // class MockRbacModule(RbacModule): + txn OnCompletion + ! + assert + txn ApplicationID + assert + pushbytess 0x82f71b2d 0xef04f5d3 0xdf343550 0x3dbe80bd 0xdf54e82c 0x010c8299 0x7406acd2 0x1a72a2ee // method "rbac_rotate_arranger(address)uint64", method "rbac_set_op_daemon(address)uint64", method "rbac_assign_role(uint8,address,(uint64,uint64))uint64", method "rbac_revoke_role(uint8,address)uint64", method "rbac_gov_asset_suspension(bool)uint64", method "rbac_get_arranger()address", method "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", method "rbac_get_role_validity(uint8,address)(uint64,uint64)" + txna ApplicationArgs 0 + match rbac_rotate_arranger rbac_set_op_daemon rbac_assign_role rbac_revoke_role rbac_gov_asset_suspension rbac_get_arranger rbac_get_address_roles rbac_get_role_validity + err + +main_contract_update_route@5: + // modules/rbac.py:148 + // @arc4.abimethod(allow_actions=["UpdateApplication"]) + txn OnCompletion + pushint 4 // UpdateApplication + == + txn ApplicationID + && + assert + b contract_update + +main_create@19: + // smart_contracts/mock_module_rbac/contract.py:14 + // @arc4.baremethod(create="require") + txn OnCompletion + ! + txn ApplicationID + ! + && + assert + // smart_contracts/mock_module_rbac/contract.py:16 + // self.arranger.value = Txn.sender + bytec_1 // 0x5223417272616e67657223 + txn Sender + app_global_put + // smart_contracts/mock_module_rbac/contract.py:14 + // @arc4.baremethod(create="require") + intc_0 // 1 + return + + +// modules.rbac.RbacModule.contract_update[routing]() -> void: +contract_update: + // modules/rbac.py:153-156 + // # The reference implementation grants the update permissions to the Arranger. + // # ⚠️ WARNING: Application updates must be executed VERY carefully, as they + // # might introduce breaking changes. + // self._assert_caller_is_arranger() + callsub _assert_caller_is_arranger + // modules/rbac.py:148 + // @arc4.abimethod(allow_actions=["UpdateApplication"]) + intc_0 // 1 + return + + +// modules.rbac.RbacModule.rbac_rotate_arranger[routing]() -> void: +rbac_rotate_arranger: + // modules/rbac.py:158 + // @arc4.abimethod + txna ApplicationArgs 1 + dup + len + intc_2 // 32 + == + assert // invalid number of bytes for arc4.static_array + // modules/rbac.py:169 + // self._assert_caller_is_arranger() + callsub _assert_caller_is_arranger + // modules/rbac.py:170 + // self.arranger.value = new_arranger + bytec_1 // 0x5223417272616e67657223 + swap + app_global_put + // modules/rbac.py:171 + // return Global.latest_timestamp + global LatestTimestamp + // modules/rbac.py:158 + // @arc4.abimethod + itob + bytec_0 // 0x151f7c75 + swap + concat + log + intc_0 // 1 + return + + +// modules.rbac.RbacModule.rbac_set_op_daemon[routing]() -> void: +rbac_set_op_daemon: + // modules/rbac.py:173 + // @arc4.abimethod + txna ApplicationArgs 1 + dup + len + intc_2 // 32 + == + assert // invalid number of bytes for arc4.static_array + // modules/rbac.py:184 + // self._assert_caller_is_arranger() + callsub _assert_caller_is_arranger + // modules/rbac.py:185 + // self.op_daemon.value = address + bytec 7 // 0x52234f704461656d6f6e23 + swap + app_global_put + // modules/rbac.py:186 + // return Global.latest_timestamp + global LatestTimestamp + // modules/rbac.py:173 + // @arc4.abimethod + itob + bytec_0 // 0x151f7c75 + swap + concat + log + intc_0 // 1 + return + + +// modules.rbac.RbacModule.rbac_assign_role[routing]() -> void: +rbac_assign_role: + // modules/rbac.py:188 + // @arc4.abimethod + txna ApplicationArgs 1 + dup + len + intc_0 // 1 + == + assert // invalid number of bytes for arc4.uint8 + txna ApplicationArgs 2 + dup + cover 2 + len + intc_2 // 32 + == + assert // invalid number of bytes for arc4.static_array + txna ApplicationArgs 3 + dup + cover 2 + len + pushint 16 + == + assert // invalid number of bytes for smart_contracts.abi_types.RoleValidity + // modules/rbac.py:210 + // self._assert_caller_is_arranger() + callsub _assert_caller_is_arranger + // modules/rbac.py:211 + // self._assert_is_not_asset_defaulted() + callsub _assert_is_not_asset_defaulted + // modules/rbac.py:212 + // self._assert_valid_role(role_id.as_uint64()) + btoi + dupn 2 + callsub _assert_valid_role + // modules/rbac.py:102 + // if role_id == UInt64(enums.ROLE_ARRANGER): + intc_3 // 20 + == + bz rbac_assign_role_after_if_else@3 + // modules/rbac.py:103 + // self.arranger.value = role_address + bytec_1 // 0x5223417272616e67657223 + dig 3 + app_global_put + +rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14: + // modules/rbac.py:214 + // return Global.latest_timestamp + global LatestTimestamp + // modules/rbac.py:188 + // @arc4.abimethod + itob + bytec_0 // 0x151f7c75 + swap + concat + log + intc_0 // 1 + return + +rbac_assign_role_after_if_else@3: + // modules/rbac.py:106 + // if role_id == UInt64(enums.ROLE_ACCOUNT_MANAGER): + dup + pushint 40 + == + bz rbac_assign_role_after_if_else@5 + // modules/rbac.py:107 + // assert role_address not in self.account_manager, err.INVALID_ROLE_ADDRESS + bytec_3 // 0x52234163636f756e744d616e6167657223 + dig 3 + concat + dup + box_len + bury 1 + ! + assert // Invalid account role address + // modules/rbac.py:108 + // self.account_manager[role_address] = validity.copy() + dig 2 + box_put + // modules/rbac.py:213 + // self._set_role(role_id.as_uint64(), role_address, validity) + b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14 + +rbac_assign_role_after_if_else@5: + // modules/rbac.py:110 + // if role_id == UInt64(enums.ROLE_PRIMARY_DEALER): + dup + pushint 50 + == + bz rbac_assign_role_after_if_else@7 + // modules/rbac.py:111 + // assert role_address not in self.primary_dealer, err.INVALID_ROLE_ADDRESS + bytec 4 // 0x52235072696d6172794465616c657223 + dig 3 + concat + dup + box_len + bury 1 + ! + assert // Invalid account role address + // modules/rbac.py:112 + // self.primary_dealer[role_address] = validity.copy() + dig 2 + box_put + // modules/rbac.py:213 + // self._set_role(role_id.as_uint64(), role_address, validity) + b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14 + +rbac_assign_role_after_if_else@7: + // modules/rbac.py:114 + // if role_id == UInt64(enums.ROLE_TRUSTEE): + dup + pushint 60 + == + bz rbac_assign_role_after_if_else@9 + // modules/rbac.py:115 + // assert role_address not in self.trustee, err.INVALID_ROLE_ADDRESS + bytec 5 // 0x52235472757374656523 + dig 3 + concat + dup + box_len + bury 1 + ! + assert // Invalid account role address + // modules/rbac.py:116 + // self.trustee[role_address] = validity.copy() + dig 2 + box_put + // modules/rbac.py:213 + // self._set_role(role_id.as_uint64(), role_address, validity) + b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14 + +rbac_assign_role_after_if_else@9: + // modules/rbac.py:118 + // if role_id == UInt64(enums.ROLE_AUTHORITY): + dup + pushint 70 + == + bz rbac_assign_role_after_if_else@11 + // modules/rbac.py:119 + // assert role_address not in self.authority, err.INVALID_ROLE_ADDRESS + bytec_2 // 0x5223417574686f7269747923 + dig 3 + concat + dup + box_len + bury 1 + ! + assert // Invalid account role address + // modules/rbac.py:120 + // self.authority[role_address] = validity.copy() + dig 2 + box_put + // modules/rbac.py:213 + // self._set_role(role_id.as_uint64(), role_address, validity) + b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14 + +rbac_assign_role_after_if_else@11: + // modules/rbac.py:122 + // if role_id == UInt64(enums.ROLE_OBSERVER): + dup + pushint 80 + == + bz rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14 + // modules/rbac.py:123 + // assert role_address not in self.observer, err.INVALID_ROLE_ADDRESS + bytec 6 // 0x52234f6273657276657223 + dig 3 + concat + dup + box_len + bury 1 + ! + assert // Invalid account role address + // modules/rbac.py:124 + // self.observer[role_address] = validity.copy() + dig 2 + box_put + b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14 + + +// modules.rbac.RbacModule.rbac_revoke_role[routing]() -> void: +rbac_revoke_role: + // modules/rbac.py:216 + // @arc4.abimethod + txna ApplicationArgs 1 + dup + len + intc_0 // 1 + == + assert // invalid number of bytes for arc4.uint8 + txna ApplicationArgs 2 + dup + cover 2 + len + intc_2 // 32 + == + assert // invalid number of bytes for arc4.static_array + // modules/rbac.py:235 + // self._assert_caller_is_arranger() + callsub _assert_caller_is_arranger + // modules/rbac.py:236 + // self._assert_is_not_asset_defaulted() + callsub _assert_is_not_asset_defaulted + // modules/rbac.py:237 + // self._assert_valid_role(role_id.as_uint64()) + btoi + dupn 2 + callsub _assert_valid_role + // modules/rbac.py:127 + // assert role_id != UInt64(enums.ROLE_ARRANGER), err.INVALID_ROLE + dup + intc_3 // 20 + != + assert // Invalid role identifier + // modules/rbac.py:128 + // if role_id == UInt64(enums.ROLE_ACCOUNT_MANAGER): + pushint 40 + == + bz rbac_revoke_role_after_if_else@3 + // modules/rbac.py:129 + // assert role_address in self.account_manager, err.INVALID_ROLE_ADDRESS + bytec_3 // 0x52234163636f756e744d616e6167657223 + dig 2 + concat + dup + box_len + bury 1 + assert // Invalid account role address + // modules/rbac.py:130 + // del self.account_manager[role_address] + box_del + pop + +rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12: + // modules/rbac.py:239 + // return Global.latest_timestamp + global LatestTimestamp + // modules/rbac.py:216 + // @arc4.abimethod + itob + bytec_0 // 0x151f7c75 + swap + concat + log + intc_0 // 1 + return + +rbac_revoke_role_after_if_else@3: + // modules/rbac.py:132 + // if role_id == UInt64(enums.ROLE_PRIMARY_DEALER): + dup + pushint 50 + == + bz rbac_revoke_role_after_if_else@5 + // modules/rbac.py:133 + // assert role_address in self.primary_dealer, err.INVALID_ROLE_ADDRESS + bytec 4 // 0x52235072696d6172794465616c657223 + dig 2 + concat + dup + box_len + bury 1 + assert // Invalid account role address + // modules/rbac.py:134 + // del self.primary_dealer[role_address] + box_del + pop + // modules/rbac.py:238 + // self._delete_role(role_id.as_uint64(), role_address) + b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 + +rbac_revoke_role_after_if_else@5: + // modules/rbac.py:136 + // if role_id == UInt64(enums.ROLE_TRUSTEE): + dup + pushint 60 + == + bz rbac_revoke_role_after_if_else@7 + // modules/rbac.py:137 + // assert role_address in self.trustee, err.INVALID_ROLE_ADDRESS + bytec 5 // 0x52235472757374656523 + dig 2 + concat + dup + box_len + bury 1 + assert // Invalid account role address + // modules/rbac.py:138 + // del self.trustee[role_address] + box_del + pop + // modules/rbac.py:238 + // self._delete_role(role_id.as_uint64(), role_address) + b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 + +rbac_revoke_role_after_if_else@7: + // modules/rbac.py:140 + // if role_id == UInt64(enums.ROLE_AUTHORITY): + dup + pushint 70 + == + bz rbac_revoke_role_after_if_else@9 + // modules/rbac.py:141 + // assert role_address in self.authority, err.INVALID_ROLE_ADDRESS + bytec_2 // 0x5223417574686f7269747923 + dig 2 + concat + dup + box_len + bury 1 + assert // Invalid account role address + // modules/rbac.py:142 + // del self.authority[role_address] + box_del + pop + // modules/rbac.py:238 + // self._delete_role(role_id.as_uint64(), role_address) + b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 + +rbac_revoke_role_after_if_else@9: + // modules/rbac.py:144 + // if role_id == UInt64(enums.ROLE_OBSERVER): + dup + pushint 80 + == + bz rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 + // modules/rbac.py:145 + // assert role_address in self.observer, err.INVALID_ROLE_ADDRESS + bytec 6 // 0x52234f6273657276657223 + dig 2 + concat + dup + box_len + bury 1 + assert // Invalid account role address + // modules/rbac.py:146 + // del self.observer[role_address] + box_del + pop + b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 + + +// modules.rbac.RbacModule.rbac_gov_asset_suspension[routing]() -> void: +rbac_gov_asset_suspension: + // modules/rbac.py:241 + // @arc4.abimethod # TODO: Update specs and add test + txna ApplicationArgs 1 + dup + len + intc_0 // 1 + == + assert // invalid number of bytes for arc4.bool + intc_1 // 0 + getbit + // modules/rbac.py:77 + // assert self._role_is_active(self.authority, Txn.sender), err.UNAUTHORIZED + bytec_2 // 0x5223417574686f7269747923 + txn Sender + callsub _role_is_active + assert // Not authorized + // modules/rbac.py:257 + // self.asset_suspended = suspended + bytec 8 // "asset_suspended" + swap + app_global_put + // modules/rbac.py:258 + // return Global.latest_timestamp + global LatestTimestamp + // modules/rbac.py:241 + // @arc4.abimethod # TODO: Update specs and add test + itob + bytec_0 // 0x151f7c75 + swap + concat + log + intc_0 // 1 + return + + +// modules.rbac.RbacModule.rbac_get_arranger[routing]() -> void: +rbac_get_arranger: + // modules/rbac.py:268 + // return self.arranger.value + intc_1 // 0 + bytec_1 // 0x5223417272616e67657223 + app_global_get_ex + assert // check self.arranger exists + // modules/rbac.py:260 + // @arc4.abimethod(readonly=True) + bytec_0 // 0x151f7c75 + swap + concat + log + intc_0 // 1 + return + + +// modules.rbac.RbacModule.rbac_get_address_roles[routing]() -> void: +rbac_get_address_roles: + // modules/rbac.py:270 + // @arc4.abimethod(readonly=True) + txna ApplicationArgs 1 + dup + len + intc_2 // 32 + == + assert // invalid number of bytes for arc4.static_array + // modules/rbac.py:284 + // self._role_is_active(self.account_manager, address), + bytec_3 // 0x52234163636f756e744d616e6167657223 + dig 1 + callsub _role_is_active + // modules/rbac.py:285 + // self._role_is_active(self.primary_dealer, address), + bytec 4 // 0x52235072696d6172794465616c657223 + dig 2 + callsub _role_is_active + // modules/rbac.py:286 + // self._role_is_active(self.trustee, address), + bytec 5 // 0x52235472757374656523 + dig 3 + callsub _role_is_active + // modules/rbac.py:287 + // self._role_is_active(self.authority, address), + bytec_2 // 0x5223417574686f7269747923 + dig 4 + callsub _role_is_active + // modules/rbac.py:288 + // self._role_is_active(self.observer, address), + bytec 6 // 0x52234f6273657276657223 + uncover 5 + callsub _role_is_active + // modules/rbac.py:270 + // @arc4.abimethod(readonly=True) + pushbytes 0x00 + intc_1 // 0 + uncover 6 + setbit + intc_0 // 1 + uncover 5 + setbit + pushint 2 + uncover 4 + setbit + pushint 3 + uncover 3 + setbit + pushint 4 + uncover 2 + setbit + bytec_0 // 0x151f7c75 + swap + concat + log + intc_0 // 1 + return + + +// modules.rbac.RbacModule.rbac_get_role_validity[routing]() -> void: +rbac_get_role_validity: + // modules/rbac.py:291 + // @arc4.abimethod(readonly=True) + txna ApplicationArgs 1 + dup + len + intc_0 // 1 + == + assert // invalid number of bytes for arc4.uint8 + txna ApplicationArgs 2 + dup + cover 2 + len + intc_2 // 32 + == + assert // invalid number of bytes for arc4.static_array + // modules/rbac.py:305 + // role = role_id.as_uint64() + btoi + // modules/rbac.py:306 + // self._assert_valid_role(role) + dup + callsub _assert_valid_role + // modules/rbac.py:308 + // case UInt64(enums.ROLE_ARRANGER): + intc_3 // 20 + // modules/rbac.py:312 + // case UInt64(enums.ROLE_ACCOUNT_MANAGER): + pushints 40 50 60 70 80 + // modules/rbac.py:307-338 + // match role: + // case UInt64(enums.ROLE_ARRANGER): + // return typ.RoleValidity( + // role_validity_start=UInt64(0), role_validity_end=UInt64(0) + // ) + // case UInt64(enums.ROLE_ACCOUNT_MANAGER): + // assert self._has_role( + // self.account_manager, role_address + // ), err.INVALID_ROLE_ADDRESS + // return self.account_manager[role_address] + // case UInt64(enums.ROLE_PRIMARY_DEALER): + // assert self._has_role( + // self.primary_dealer, role_address + // ), err.INVALID_ROLE_ADDRESS + // return self.primary_dealer[role_address] + // case UInt64(enums.ROLE_TRUSTEE): + // assert self._has_role( + // self.trustee, role_address + // ), err.INVALID_ROLE_ADDRESS + // return self.trustee[role_address] + // case UInt64(enums.ROLE_AUTHORITY): + // assert self._has_role( + // self.authority, role_address + // ), err.INVALID_ROLE_ADDRESS + // return self.authority[role_address] + // case UInt64(enums.ROLE_OBSERVER): + // assert self._has_role( + // self.observer, role_address + // ), err.INVALID_ROLE_ADDRESS + // return self.observer[role_address] + // case _: + // op.err(err.INVALID_ROLE) + uncover 6 + match rbac_get_role_validity_switch_case_0@2 rbac_get_role_validity_switch_case_1@3 rbac_get_role_validity_switch_case_2@4 rbac_get_role_validity_switch_case_3@5 rbac_get_role_validity_switch_case_4@6 rbac_get_role_validity_switch_case_5@7 + // modules/rbac.py:338 + // op.err(err.INVALID_ROLE) + err // Invalid role identifier + +rbac_get_role_validity_switch_case_5@7: + // modules/rbac.py:334 + // self.observer, role_address + bytec 6 // 0x52234f6273657276657223 + // modules/rbac.py:55 + // return role_address in role_map + dig 1 + concat + dup + box_len + bury 1 + // modules/rbac.py:333-335 + // assert self._has_role( + // self.observer, role_address + // ), err.INVALID_ROLE_ADDRESS + assert // Invalid account role address + // modules/rbac.py:336 + // return self.observer[role_address] + box_get + pop + +rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9: + // modules/rbac.py:291 + // @arc4.abimethod(readonly=True) + bytec_0 // 0x151f7c75 + swap + concat + log + intc_0 // 1 + return + +rbac_get_role_validity_switch_case_4@6: + // modules/rbac.py:329 + // self.authority, role_address + bytec_2 // 0x5223417574686f7269747923 + // modules/rbac.py:55 + // return role_address in role_map + dig 1 + concat + dup + box_len + bury 1 + // modules/rbac.py:328-330 + // assert self._has_role( + // self.authority, role_address + // ), err.INVALID_ROLE_ADDRESS + assert // Invalid account role address + // modules/rbac.py:331 + // return self.authority[role_address] + box_get + pop + // modules/rbac.py:291 + // @arc4.abimethod(readonly=True) + b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9 + +rbac_get_role_validity_switch_case_3@5: + // modules/rbac.py:324 + // self.trustee, role_address + bytec 5 // 0x52235472757374656523 + // modules/rbac.py:55 + // return role_address in role_map + dig 1 + concat + dup + box_len + bury 1 + // modules/rbac.py:323-325 + // assert self._has_role( + // self.trustee, role_address + // ), err.INVALID_ROLE_ADDRESS + assert // Invalid account role address + // modules/rbac.py:326 + // return self.trustee[role_address] + box_get + pop + // modules/rbac.py:291 + // @arc4.abimethod(readonly=True) + b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9 + +rbac_get_role_validity_switch_case_2@4: + // modules/rbac.py:319 + // self.primary_dealer, role_address + bytec 4 // 0x52235072696d6172794465616c657223 + // modules/rbac.py:55 + // return role_address in role_map + dig 1 + concat + dup + box_len + bury 1 + // modules/rbac.py:318-320 + // assert self._has_role( + // self.primary_dealer, role_address + // ), err.INVALID_ROLE_ADDRESS + assert // Invalid account role address + // modules/rbac.py:321 + // return self.primary_dealer[role_address] + box_get + pop + // modules/rbac.py:291 + // @arc4.abimethod(readonly=True) + b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9 + +rbac_get_role_validity_switch_case_1@3: + // modules/rbac.py:314 + // self.account_manager, role_address + bytec_3 // 0x52234163636f756e744d616e6167657223 + // modules/rbac.py:55 + // return role_address in role_map + dig 1 + concat + dup + box_len + bury 1 + // modules/rbac.py:313-315 + // assert self._has_role( + // self.account_manager, role_address + // ), err.INVALID_ROLE_ADDRESS + assert // Invalid account role address + // modules/rbac.py:316 + // return self.account_manager[role_address] + box_get + pop + // modules/rbac.py:291 + // @arc4.abimethod(readonly=True) + b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9 + +rbac_get_role_validity_switch_case_0@2: + // modules/rbac.py:309-311 + // return typ.RoleValidity( + // role_validity_start=UInt64(0), role_validity_end=UInt64(0) + // ) + pushbytes 0x00000000000000000000000000000000 + // modules/rbac.py:291 + // @arc4.abimethod(readonly=True) + b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9 + + +// modules.rbac.RbacModule._role_is_active(role_map: bytes, role_address: bytes) -> uint64: +_role_is_active: + // modules/rbac.py:57 + // def _role_is_active(self, role_map: typ.RbacRole, role_address: Account) -> bool: + proto 2 1 + pushbytes "" + // modules/rbac.py:55 + // return role_address in role_map + frame_dig -2 + frame_dig -1 + concat + dup + box_len + bury 1 + // modules/rbac.py:58-62 + // return self._has_role(role_map, role_address) and ( + // role_map[role_address].role_validity_start + // <= Global.latest_timestamp + // <= role_map[role_address].role_validity_end + // ) + bz _role_is_active_bool_false@4 + // modules/rbac.py:59 + // role_map[role_address].role_validity_start + frame_dig 1 + box_get + assert // check BoxMap entry exists + intc_1 // 0 + extract_uint64 + // modules/rbac.py:60 + // <= Global.latest_timestamp + global LatestTimestamp + dup + frame_bury 0 + // modules/rbac.py:59-60 + // role_map[role_address].role_validity_start + // <= Global.latest_timestamp + <= + // modules/rbac.py:59-61 + // role_map[role_address].role_validity_start + // <= Global.latest_timestamp + // <= role_map[role_address].role_validity_end + bz _role_is_active_bool_false@4 + // modules/rbac.py:61 + // <= role_map[role_address].role_validity_end + frame_dig 1 + box_get + assert // check BoxMap entry exists + pushint 8 + extract_uint64 + // modules/rbac.py:60-61 + // <= Global.latest_timestamp + // <= role_map[role_address].role_validity_end + frame_dig 0 + >= + // modules/rbac.py:59-61 + // role_map[role_address].role_validity_start + // <= Global.latest_timestamp + // <= role_map[role_address].role_validity_end + bz _role_is_active_bool_false@4 + intc_0 // 1 + +_role_is_active_bool_merge@5: + // modules/rbac.py:58-62 + // return self._has_role(role_map, role_address) and ( + // role_map[role_address].role_validity_start + // <= Global.latest_timestamp + // <= role_map[role_address].role_validity_end + // ) + frame_bury 0 + retsub + +_role_is_active_bool_false@4: + intc_1 // 0 + b _role_is_active_bool_merge@5 + + +// modules.rbac.RbacModule._assert_caller_is_arranger() -> void: +_assert_caller_is_arranger: + // modules/rbac.py:65 + // assert self._is_arranger(Txn.sender), err.UNAUTHORIZED + txn Sender + // modules/rbac.py:52 + // return role_address == self.arranger.value + intc_1 // 0 + bytec_1 // 0x5223417272616e67657223 + app_global_get_ex + assert // check self.arranger exists + == + // modules/rbac.py:65 + // assert self._is_arranger(Txn.sender), err.UNAUTHORIZED + assert // Not authorized + retsub + + +// modules.rbac.RbacModule._assert_is_not_asset_defaulted() -> void: +_assert_is_not_asset_defaulted: + // modules/rbac.py:83 + // assert not self.asset_defaulted, err.DEFAULTED + intc_1 // 0 + bytec 9 // "asset_defaulted" + app_global_get_ex + assert // check self.asset_defaulted exists + ! + assert // Defaulted + retsub + + +// modules.rbac.RbacModule._assert_valid_role(role_id: uint64) -> void: +_assert_valid_role: + // modules/rbac.py:88 + // def _assert_valid_role(self, role_id: UInt64) -> None: + proto 1 0 + // modules/rbac.py:89-97 + // assert role_id in ( + // UInt64(enums.ROLE_ARRANGER), + // UInt64(enums.ROLE_OP_DAEMON), + // UInt64(enums.ROLE_ACCOUNT_MANAGER), + // UInt64(enums.ROLE_PRIMARY_DEALER), + // UInt64(enums.ROLE_TRUSTEE), + // UInt64(enums.ROLE_AUTHORITY), + // UInt64(enums.ROLE_OBSERVER), + // ), err.INVALID_ROLE + frame_dig -1 + // modules/rbac.py:90 + // UInt64(enums.ROLE_ARRANGER), + intc_3 // 20 + // modules/rbac.py:89-97 + // assert role_id in ( + // UInt64(enums.ROLE_ARRANGER), + // UInt64(enums.ROLE_OP_DAEMON), + // UInt64(enums.ROLE_ACCOUNT_MANAGER), + // UInt64(enums.ROLE_PRIMARY_DEALER), + // UInt64(enums.ROLE_TRUSTEE), + // UInt64(enums.ROLE_AUTHORITY), + // UInt64(enums.ROLE_OBSERVER), + // ), err.INVALID_ROLE + == + bnz _assert_valid_role_bool_true@7 + frame_dig -1 + // modules/rbac.py:91 + // UInt64(enums.ROLE_OP_DAEMON), + pushint 25 + // modules/rbac.py:89-97 + // assert role_id in ( + // UInt64(enums.ROLE_ARRANGER), + // UInt64(enums.ROLE_OP_DAEMON), + // UInt64(enums.ROLE_ACCOUNT_MANAGER), + // UInt64(enums.ROLE_PRIMARY_DEALER), + // UInt64(enums.ROLE_TRUSTEE), + // UInt64(enums.ROLE_AUTHORITY), + // UInt64(enums.ROLE_OBSERVER), + // ), err.INVALID_ROLE + == + bnz _assert_valid_role_bool_true@7 + frame_dig -1 + // modules/rbac.py:92 + // UInt64(enums.ROLE_ACCOUNT_MANAGER), + pushint 40 + // modules/rbac.py:89-97 + // assert role_id in ( + // UInt64(enums.ROLE_ARRANGER), + // UInt64(enums.ROLE_OP_DAEMON), + // UInt64(enums.ROLE_ACCOUNT_MANAGER), + // UInt64(enums.ROLE_PRIMARY_DEALER), + // UInt64(enums.ROLE_TRUSTEE), + // UInt64(enums.ROLE_AUTHORITY), + // UInt64(enums.ROLE_OBSERVER), + // ), err.INVALID_ROLE + == + bnz _assert_valid_role_bool_true@7 + frame_dig -1 + // modules/rbac.py:93 + // UInt64(enums.ROLE_PRIMARY_DEALER), + pushint 50 + // modules/rbac.py:89-97 + // assert role_id in ( + // UInt64(enums.ROLE_ARRANGER), + // UInt64(enums.ROLE_OP_DAEMON), + // UInt64(enums.ROLE_ACCOUNT_MANAGER), + // UInt64(enums.ROLE_PRIMARY_DEALER), + // UInt64(enums.ROLE_TRUSTEE), + // UInt64(enums.ROLE_AUTHORITY), + // UInt64(enums.ROLE_OBSERVER), + // ), err.INVALID_ROLE + == + bnz _assert_valid_role_bool_true@7 + frame_dig -1 + // modules/rbac.py:94 + // UInt64(enums.ROLE_TRUSTEE), + pushint 60 + // modules/rbac.py:89-97 + // assert role_id in ( + // UInt64(enums.ROLE_ARRANGER), + // UInt64(enums.ROLE_OP_DAEMON), + // UInt64(enums.ROLE_ACCOUNT_MANAGER), + // UInt64(enums.ROLE_PRIMARY_DEALER), + // UInt64(enums.ROLE_TRUSTEE), + // UInt64(enums.ROLE_AUTHORITY), + // UInt64(enums.ROLE_OBSERVER), + // ), err.INVALID_ROLE + == + bnz _assert_valid_role_bool_true@7 + frame_dig -1 + // modules/rbac.py:95 + // UInt64(enums.ROLE_AUTHORITY), + pushint 70 + // modules/rbac.py:89-97 + // assert role_id in ( + // UInt64(enums.ROLE_ARRANGER), + // UInt64(enums.ROLE_OP_DAEMON), + // UInt64(enums.ROLE_ACCOUNT_MANAGER), + // UInt64(enums.ROLE_PRIMARY_DEALER), + // UInt64(enums.ROLE_TRUSTEE), + // UInt64(enums.ROLE_AUTHORITY), + // UInt64(enums.ROLE_OBSERVER), + // ), err.INVALID_ROLE + == + bnz _assert_valid_role_bool_true@7 + frame_dig -1 + // modules/rbac.py:96 + // UInt64(enums.ROLE_OBSERVER), + pushint 80 + // modules/rbac.py:89-97 + // assert role_id in ( + // UInt64(enums.ROLE_ARRANGER), + // UInt64(enums.ROLE_OP_DAEMON), + // UInt64(enums.ROLE_ACCOUNT_MANAGER), + // UInt64(enums.ROLE_PRIMARY_DEALER), + // UInt64(enums.ROLE_TRUSTEE), + // UInt64(enums.ROLE_AUTHORITY), + // UInt64(enums.ROLE_OBSERVER), + // ), err.INVALID_ROLE + == + bz _assert_valid_role_bool_false@8 + +_assert_valid_role_bool_true@7: + intc_0 // 1 + +_assert_valid_role_bool_merge@9: + // modules/rbac.py:89-97 + // assert role_id in ( + // UInt64(enums.ROLE_ARRANGER), + // UInt64(enums.ROLE_OP_DAEMON), + // UInt64(enums.ROLE_ACCOUNT_MANAGER), + // UInt64(enums.ROLE_PRIMARY_DEALER), + // UInt64(enums.ROLE_TRUSTEE), + // UInt64(enums.ROLE_AUTHORITY), + // UInt64(enums.ROLE_OBSERVER), + // ), err.INVALID_ROLE + assert // Invalid role identifier + retsub + +_assert_valid_role_bool_false@8: + intc_1 // 0 + b _assert_valid_role_bool_merge@9 diff --git a/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.arc56.json b/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.arc56.json new file mode 100644 index 00000000..0668643b --- /dev/null +++ b/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.arc56.json @@ -0,0 +1,444 @@ +{ + "name": "MockRbacModule", + "structs": { + "RoleValidity": [ + { + "name": "role_validity_start", + "type": "uint64" + }, + { + "name": "role_validity_end", + "type": "uint64" + } + ] + }, + "methods": [ + { + "name": "contract_update", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "UpdateApplication" + ] + }, + "readonly": false, + "desc": "Update D-ASA application.", + "events": [], + "recommendations": {} + }, + { + "name": "rbac_rotate_arranger", + "args": [ + { + "type": "address", + "name": "new_arranger", + "desc": "New Arranger address" + } + ], + "returns": { + "type": "uint64", + "desc": "Timestamp of the role assignment" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Rotate the Arranger address", + "events": [], + "recommendations": {} + }, + { + "name": "rbac_set_op_daemon", + "args": [ + { + "type": "address", + "name": "address", + "desc": "Operation Daemon address" + } + ], + "returns": { + "type": "uint64", + "desc": "Timestamp of the role assignment" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Non-Normative: Set the Operation Daemon address", + "events": [], + "recommendations": {} + }, + { + "name": "rbac_assign_role", + "args": [ + { + "type": "uint8", + "name": "role_id", + "desc": "Role Identifier" + }, + { + "type": "address", + "name": "role_address", + "desc": "Account Role Address" + }, + { + "type": "(uint64,uint64)", + "struct": "RoleValidity", + "name": "validity", + "desc": "Role time validity" + } + ], + "returns": { + "type": "uint64", + "desc": "Timestamp of the role assignment" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Assign a role to an address", + "events": [], + "recommendations": {} + }, + { + "name": "rbac_revoke_role", + "args": [ + { + "type": "uint8", + "name": "role_id", + "desc": "Role Identifier" + }, + { + "type": "address", + "name": "role_address", + "desc": "Account Role Address" + } + ], + "returns": { + "type": "uint64", + "desc": "Timestamp of the role revocation" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Revoke a role from an address", + "events": [], + "recommendations": {} + }, + { + "name": "rbac_gov_asset_suspension", + "args": [ + { + "type": "bool", + "name": "suspended", + "desc": "Suspension status" + } + ], + "returns": { + "type": "uint64", + "desc": "Timestamp of the set asset suspension status" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Set asset suspension status", + "events": [], + "recommendations": {} + }, + { + "name": "rbac_get_arranger", + "args": [], + "returns": { + "type": "address", + "desc": "Arranger address" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "desc": "Get Arranger address", + "events": [], + "recommendations": {} + }, + { + "name": "rbac_get_address_roles", + "args": [ + { + "type": "address", + "name": "address", + "desc": "Address to get roles for" + } + ], + "returns": { + "type": "(bool,bool,bool,bool,bool)", + "desc": "Roles mask: (Account Manager, Primary Dealer, Trustee, Authority, Observer)" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "desc": "Non-normative - Get roles assigned to an address", + "events": [], + "recommendations": {} + }, + { + "name": "rbac_get_role_validity", + "args": [ + { + "type": "uint8", + "name": "role_id", + "desc": "Role Identifier" + }, + { + "type": "address", + "name": "role_address", + "desc": "Account Role Address" + } + ], + "returns": { + "type": "(uint64,uint64)", + "struct": "RoleValidity", + "desc": "Role validity" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "desc": "Get role validity", + "events": [], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "desc": "\n RBAC Module for testing\n ", + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 2, + "bytes": 2 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": { + "arranger": { + "keyType": "AVMBytes", + "valueType": "address", + "key": "UiNBcnJhbmdlciM=" + }, + "op_daemon": { + "keyType": "AVMBytes", + "valueType": "address", + "key": "UiNPcERhZW1vbiM=" + }, + "asset_suspended": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "YXNzZXRfc3VzcGVuZGVk" + }, + "asset_defaulted": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "YXNzZXRfZGVmYXVsdGVk" + } + }, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": { + "account_manager": { + "keyType": "address", + "valueType": "RoleValidity", + "prefix": "UiNBY2NvdW50TWFuYWdlciM=" + }, + "primary_dealer": { + "keyType": "address", + "valueType": "RoleValidity", + "prefix": "UiNQcmltYXJ5RGVhbGVyIw==" + }, + "trustee": { + "keyType": "address", + "valueType": "RoleValidity", + "prefix": "UiNUcnVzdGVlIw==" + }, + "authority": { + "keyType": "address", + "valueType": "RoleValidity", + "prefix": "UiNBdXRob3JpdHkj" + }, + "observer": { + "keyType": "address", + "valueType": "RoleValidity", + "prefix": "UiNPYnNlcnZlciM=" + } + } + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 980 + ], + "errorMessage": "Defaulted" + }, + { + "pc": [ + 405, + 429, + 453, + 476, + 500, + 555, + 583, + 605, + 626, + 648, + 824, + 841, + 856, + 871, + 885 + ], + "errorMessage": "Invalid account role address" + }, + { + "pc": [ + 540, + 814, + 1041 + ], + "errorMessage": "Invalid role identifier" + }, + { + "pc": [ + 670, + 972 + ], + "errorMessage": "Not authorized" + }, + { + "pc": [ + 932, + 947 + ], + "errorMessage": "check BoxMap entry exists" + }, + { + "pc": [ + 687, + 970 + ], + "errorMessage": "check self.arranger exists" + }, + { + "pc": [ + 978 + ], + "errorMessage": "check self.asset_defaulted exists" + }, + { + "pc": [ + 661 + ], + "errorMessage": "invalid number of bytes for arc4.bool" + }, + { + "pc": [ + 290, + 313, + 347, + 524, + 701, + 784 + ], + "errorMessage": "invalid number of bytes for arc4.static_array" + }, + { + "pc": [ + 337, + 514, + 774 + ], + "errorMessage": "invalid number of bytes for arc4.uint8" + }, + { + "pc": [ + 358 + ], + "errorMessage": "invalid number of bytes for smart_contracts.abi_types.RoleValidity" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMzIgMjAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMgMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMgMHg1MjIzNDE2MzYzNmY3NTZlNzQ0ZDYxNmU2MTY3NjU3MjIzIDB4NTIyMzUwNzI2OTZkNjE3Mjc5NDQ2NTYxNmM2NTcyMjMgMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMyAweDUyMjM0ZjYyNzM2NTcyNzY2NTcyMjMgMHg1MjIzNGY3MDQ0NjE2NTZkNmY2ZTIzICJhc3NldF9zdXNwZW5kZWQiICJhc3NldF9kZWZhdWx0ZWQiCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgtMjkKICAgIC8vICMgUkJBQyBSb2xlcwogICAgLy8gc2VsZi5hcnJhbmdlciA9IEdsb2JhbFN0YXRlKEFjY291bnQoKSwga2V5PWNzdC5QUkVGSVhfSURfQVJSQU5HRVIpCiAgICBieXRlY18xIC8vIDB4NTIyMzQxNzI3MjYxNmU2NzY1NzIyMwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwCiAgICAvLyBzZWxmLm9wX2RhZW1vbiA9IEdsb2JhbFN0YXRlKEFjY291bnQoKSwga2V5PWNzdC5QUkVGSVhfSURfT1BfREFFTU9OKQogICAgYnl0ZWMgNyAvLyAweDUyMjM0ZjcwNDQ2MTY1NmQ2ZjZlMjMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo0Ny00OAogICAgLy8gIyBELUFTQSBHb3Zlcm5hbmNlCiAgICAvLyBzZWxmLmFzc2V0X3N1c3BlbmRlZCA9IEZhbHNlCiAgICBieXRlYyA4IC8vICJhc3NldF9zdXNwZW5kZWQiCiAgICBpbnRjXzEgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo0OQogICAgLy8gc2VsZi5hc3NldF9kZWZhdWx0ZWQgPSBGYWxzZQogICAgYnl0ZWMgOSAvLyAiYXNzZXRfZGVmYXVsdGVkIgogICAgaW50Y18xIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tb2NrX21vZHVsZV9yYmFjL2NvbnRyYWN0LnB5OjYKICAgIC8vIGNsYXNzIE1vY2tSYmFjTW9kdWxlKFJiYWNNb2R1bGUpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fY3JlYXRlQDE5CiAgICBwdXNoYnl0ZXMgMHg5MTRmMDRlYiAvLyBtZXRob2QgImNvbnRyYWN0X3VwZGF0ZSgpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fY29udHJhY3RfdXBkYXRlX3JvdXRlQDUKCm1haW5fc3dpdGNoX2Nhc2VfbmV4dEA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL21vY2tfbW9kdWxlX3JiYWMvY29udHJhY3QucHk6NgogICAgLy8gY2xhc3MgTW9ja1JiYWNNb2R1bGUoUmJhY01vZHVsZSk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHg4MmY3MWIyZCAweGVmMDRmNWQzIDB4ZGYzNDM1NTAgMHgzZGJlODBiZCAweGRmNTRlODJjIDB4MDEwYzgyOTkgMHg3NDA2YWNkMiAweDFhNzJhMmVlIC8vIG1ldGhvZCAicmJhY19yb3RhdGVfYXJyYW5nZXIoYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgInJiYWNfc2V0X29wX2RhZW1vbihhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19hc3NpZ25fcm9sZSh1aW50OCxhZGRyZXNzLCh1aW50NjQsdWludDY0KSl1aW50NjQiLCBtZXRob2QgInJiYWNfcmV2b2tlX3JvbGUodWludDgsYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgInJiYWNfZ292X2Fzc2V0X3N1c3BlbnNpb24oYm9vbCl1aW50NjQiLCBtZXRob2QgInJiYWNfZ2V0X2FycmFuZ2VyKClhZGRyZXNzIiwgbWV0aG9kICJyYmFjX2dldF9hZGRyZXNzX3JvbGVzKGFkZHJlc3MpKGJvb2wsYm9vbCxib29sLGJvb2wsYm9vbCkiLCBtZXRob2QgInJiYWNfZ2V0X3JvbGVfdmFsaWRpdHkodWludDgsYWRkcmVzcykodWludDY0LHVpbnQ2NCkiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCByYmFjX3JvdGF0ZV9hcnJhbmdlciByYmFjX3NldF9vcF9kYWVtb24gcmJhY19hc3NpZ25fcm9sZSByYmFjX3Jldm9rZV9yb2xlIHJiYWNfZ292X2Fzc2V0X3N1c3BlbnNpb24gcmJhY19nZXRfYXJyYW5nZXIgcmJhY19nZXRfYWRkcmVzc19yb2xlcyByYmFjX2dldF9yb2xlX3ZhbGlkaXR5CiAgICBlcnIKCm1haW5fY29udHJhY3RfdXBkYXRlX3JvdXRlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBwdXNoaW50IDQgLy8gVXBkYXRlQXBwbGljYXRpb24KICAgID09CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydAogICAgYiBjb250cmFjdF91cGRhdGUKCm1haW5fY3JlYXRlQDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL21vY2tfbW9kdWxlX3JiYWMvY29udHJhY3QucHk6MTQKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbW9ja19tb2R1bGVfcmJhYy9jb250cmFjdC5weToxNgogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IFR4bi5zZW5kZXIKICAgIGJ5dGVjXzEgLy8gMHg1MjIzNDE3MjcyNjE2ZTY3NjU3MjIzCiAgICB0eG4gU2VuZGVyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL21vY2tfbW9kdWxlX3JiYWMvY29udHJhY3QucHk6MTQKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5jb250cmFjdF91cGRhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF91cGRhdGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTUzLTE1NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGdyYW50cyB0aGUgdXBkYXRlIHBlcm1pc3Npb25zIHRvIHRoZSBBcnJhbmdlci4KICAgIC8vICMg4pqg77iPIFdBUk5JTkc6IEFwcGxpY2F0aW9uIHVwZGF0ZXMgbXVzdCBiZSBleGVjdXRlZCBWRVJZIGNhcmVmdWxseSwgYXMgdGhleQogICAgLy8gIyBtaWdodCBpbnRyb2R1Y2UgYnJlYWtpbmcgY2hhbmdlcy4KICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfcm90YXRlX2FycmFuZ2VyW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19yb3RhdGVfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2OQogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTcwCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gbmV3X2FycmFuZ2VyCiAgICBieXRlY18xIC8vIDB4NTIyMzQxNzI3MjYxNmU2NzY1NzIyMwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzEKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE1OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19zZXRfb3BfZGFlbW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19zZXRfb3BfZGFlbW9uOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE3MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODQKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4NQogICAgLy8gc2VsZi5vcF9kYWVtb24udmFsdWUgPSBhZGRyZXNzCiAgICBieXRlYyA3IC8vIDB4NTIyMzRmNzA0NDYxNjU2ZDZmNmUyMwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODYKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE3MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19hc3NpZ25fcm9sZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfYXNzaWduX3JvbGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgcHVzaGludCAxNgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5Sb2xlVmFsaWRpdHkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTAKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTIKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCkpCiAgICBidG9pCiAgICBkdXBuIDIKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTAyCiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKToKICAgIGludGNfMyAvLyAyMAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTAzCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gcm9sZV9hZGRyZXNzCiAgICBieXRlY18xIC8vIDB4NTIyMzQxNzI3MjYxNmU2NzY1NzIyMwogICAgZGlnIDMKICAgIGFwcF9nbG9iYWxfcHV0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxNAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwNgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDQwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDcKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjXzMgLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQ0ZDYxNmU2MTY3NjU3MjIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDgKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjEzCiAgICAvLyBzZWxmLl9zZXRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIHZhbGlkaXR5KQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTAKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTEKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgNCAvLyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTIKICAgIC8vIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIGR1cAogICAgcHVzaGludCA2MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE1CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgNSAvLyAweDUyMjM1NDcyNzU3Mzc0NjU2NTIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTYKICAgIC8vIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMwogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE4CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNzAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTkKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjXzIgLy8gMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMAogICAgLy8gc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDgwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5vYnNlcnZlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyA2IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI0CiAgICAvLyBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3Jldm9rZV9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19yZXZva2Vfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzUKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzNgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzcKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCkpCiAgICBidG9pCiAgICBkdXBuIDIKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCAhPSBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksIGVyci5JTlZBTElEX1JPTEUKICAgIGR1cAogICAgaW50Y18zIC8vIDIwCiAgICAhPQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI4CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICBwdXNoaW50IDQwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjkKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWNfMyAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMAogICAgLy8gZGVsIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzkKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzMKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyA0IC8vIDB4NTIyMzUwNzI2OTZkNjE3Mjc5NDQ2NTYxNmM2NTcyMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNAogICAgLy8gZGVsIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjM4CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIGR1cAogICAgcHVzaGludCA2MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyA1IC8vIDB4NTIyMzU0NzI3NTczNzQ2NTY1MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzOAogICAgLy8gZGVsIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzgKICAgIC8vIHNlbGYuX2RlbGV0ZV9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcykKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQwCiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNzAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlY18yIC8vIDB4NTIyMzQxNzU3NDY4NmY3MjY5NzQ3OTIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDIKICAgIC8vIGRlbCBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzgKICAgIC8vIHNlbGYuX2RlbGV0ZV9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcykKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ0CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKToKICAgIGR1cAogICAgcHVzaGludCA4MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDUKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5vYnNlcnZlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyA2IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ2CiAgICAvLyBkZWwgc2VsZi5vYnNlcnZlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ292X2Fzc2V0X3N1c3BlbnNpb25bcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dvdl9hc3NldF9zdXNwZW5zaW9uOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kICAjIFRPRE86IFVwZGF0ZSBzcGVjcyBhbmQgYWRkIHRlc3QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzEgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzcKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjXzIgLy8gMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTcKICAgIC8vIHNlbGYuYXNzZXRfc3VzcGVuZGVkID0gc3VzcGVuZGVkCiAgICBieXRlYyA4IC8vICJhc3NldF9zdXNwZW5kZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1OAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QgICMgVE9ETzogVXBkYXRlIHNwZWNzIGFuZCBhZGQgdGVzdAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X2FycmFuZ2VyW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjY4CiAgICAvLyByZXR1cm4gc2VsZi5hcnJhbmdlci52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzEgLy8gMHg1MjIzNDE3MjcyNjE2ZTY3NjU3MjIzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJyYW5nZXIgZXhpc3RzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjYwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9hZGRyZXNzX3JvbGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfYWRkcmVzc19yb2xlczoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg0CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmFjY291bnRfbWFuYWdlciwgYWRkcmVzcyksCiAgICBieXRlY18zIC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0NGQ2MTZlNjE2NzY1NzIyMwogICAgZGlnIDEKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg1CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnByaW1hcnlfZGVhbGVyLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDQgLy8gMHg1MjIzNTA3MjY5NmQ2MTcyNzk0NDY1NjE2YzY1NzIyMwogICAgZGlnIDIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg2CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnRydXN0ZWUsIGFkZHJlc3MpLAogICAgYnl0ZWMgNSAvLyAweDUyMjM1NDcyNzU3Mzc0NjU2NTIzCiAgICBkaWcgMwogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODcKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYXV0aG9yaXR5LCBhZGRyZXNzKSwKICAgIGJ5dGVjXzIgLy8gMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMKICAgIGRpZyA0CiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4OAogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5vYnNlcnZlciwgYWRkcmVzcyksCiAgICBieXRlYyA2IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgdW5jb3ZlciA1CiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBwdXNoYnl0ZXMgMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgNgogICAgc2V0Yml0CiAgICBpbnRjXzAgLy8gMQogICAgdW5jb3ZlciA1CiAgICBzZXRiaXQKICAgIHB1c2hpbnQgMgogICAgdW5jb3ZlciA0CiAgICBzZXRiaXQKICAgIHB1c2hpbnQgMwogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIHB1c2hpbnQgNAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5W3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfcm9sZV92YWxpZGl0eToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDUKICAgIC8vIHJvbGUgPSByb2xlX2lkLmFzX3VpbnQ2NCgpCiAgICBidG9pCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA2CiAgICAvLyBzZWxmLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlKQogICAgZHVwCiAgICBjYWxsc3ViIF9hc3NlcnRfdmFsaWRfcm9sZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwOAogICAgLy8gY2FzZSBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUik6CiAgICBpbnRjXzMgLy8gMjAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTIKICAgIC8vIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIHB1c2hpbnRzIDQwIDUwIDYwIDcwIDgwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA3LTMzOAogICAgLy8gbWF0Y2ggcm9sZToKICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKToKICAgIC8vICAgICAgICAgcmV0dXJuIHR5cC5Sb2xlVmFsaWRpdHkoCiAgICAvLyAgICAgICAgICAgICByb2xlX3ZhbGlkaXR5X3N0YXJ0PVVJbnQ2NCgwKSwgcm9sZV92YWxpZGl0eV9lbmQ9VUludDY0KDApCiAgICAvLyAgICAgICAgICkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSk6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSk6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgXzoKICAgIC8vICAgICAgICAgb3AuZXJyKGVyci5JTlZBTElEX1JPTEUpCiAgICB1bmNvdmVyIDYKICAgIG1hdGNoIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMEAyIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMUAzIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMkA0IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfM0A1IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNEA2IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzM4CiAgICAvLyBvcC5lcnIoZXJyLklOVkFMSURfUk9MRSkKICAgIGVyciAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV81QDc6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzM0CiAgICAvLyBzZWxmLm9ic2VydmVyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDYgLy8gMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzMzLTMzNQogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMzNgogICAgLy8gcmV0dXJuIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzRANjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjkKICAgIC8vIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjXzIgLy8gMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjgtMzMwCiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5hdXRob3JpdHksIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMzMQogICAgLy8gcmV0dXJuIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfM0A1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyNAogICAgLy8gc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDUgLy8gMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMy0zMjUKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyNgogICAgLy8gcmV0dXJuIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzJANDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTkKICAgIC8vIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgNCAvLyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzE4LTMyMAogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMQogICAgLy8gcmV0dXJuIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8xQDM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzE0CiAgICAvLyBzZWxmLmFjY291bnRfbWFuYWdlciwgcm9sZV9hZGRyZXNzCiAgICBieXRlY18zIC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0NGQ2MTZlNjE2NzY1NzIyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxMy0zMTUKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLmFjY291bnRfbWFuYWdlciwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzE2CiAgICAvLyByZXR1cm4gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8wQDI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA5LTMxMQogICAgLy8gcmV0dXJuIHR5cC5Sb2xlVmFsaWRpdHkoCiAgICAvLyAgICAgcm9sZV92YWxpZGl0eV9zdGFydD1VSW50NjQoMCksIHJvbGVfdmFsaWRpdHlfZW5kPVVJbnQ2NCgwKQogICAgLy8gKQogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3JvbGVfaXNfYWN0aXZlKHJvbGVfbWFwOiBieXRlcywgcm9sZV9hZGRyZXNzOiBieXRlcykgLT4gdWludDY0Ogpfcm9sZV9pc19hY3RpdmU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTcKICAgIC8vIGRlZiBfcm9sZV9pc19hY3RpdmUoc2VsZiwgcm9sZV9tYXA6IHR5cC5SYmFjUm9sZSwgcm9sZV9hZGRyZXNzOiBBY2NvdW50KSAtPiBib29sOgogICAgcHJvdG8gMiAxCiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OC02MgogICAgLy8gcmV0dXJuIHNlbGYuX2hhc19yb2xlKHJvbGVfbWFwLCByb2xlX2FkZHJlc3MpIGFuZCAoCiAgICAvLyAgICAgcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICAvLyApCiAgICBieiBfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTkKICAgIC8vIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBCb3hNYXAgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2MAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTktNjAKICAgIC8vIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIDw9CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTktNjEKICAgIC8vIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IF9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2MQogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBCb3hNYXAgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDgKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAtNjEKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgPj0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgaW50Y18wIC8vIDEKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX21lcmdlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzEgLy8gMAogICAgYiBfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKSAtPiB2b2lkOgpfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2NQogICAgLy8gYXNzZXJ0IHNlbGYuX2lzX2FycmFuZ2VyKFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTIKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgPT0gc2VsZi5hcnJhbmdlci52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzEgLy8gMHg1MjIzNDE3MjcyNjE2ZTY3NjU3MjIzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJyYW5nZXIgZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjY1CiAgICAvLyBhc3NlcnQgc2VsZi5faXNfYXJyYW5nZXIoVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkgLT4gdm9pZDoKX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjgzCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYXNzZXRfZGVmYXVsdGVkLCBlcnIuREVGQVVMVEVECiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgOSAvLyAiYXNzZXRfZGVmYXVsdGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2RlZmF1bHRlZCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBEZWZhdWx0ZWQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkOiB1aW50NjQpIC0+IHZvaWQ6Cl9hc3NlcnRfdmFsaWRfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OAogICAgLy8gZGVmIF9hc3NlcnRfdmFsaWRfcm9sZShzZWxmLCByb2xlX2lkOiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTAKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIGludGNfMyAvLyAyMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICBwdXNoaW50IDI1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MgogICAgLy8gVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIHB1c2hpbnQgNDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkzCiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICBwdXNoaW50IDUwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NAogICAgLy8gVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICBwdXNoaW50IDYwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NQogICAgLy8gVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIHB1c2hpbnQgNzAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojk2CiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICBwdXNoaW50IDgwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBieiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9mYWxzZUA4CgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDc6CiAgICBpbnRjXzAgLy8gMQoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfbWVyZ2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICByZXRzdWIKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX2ZhbHNlQDg6CiAgICBpbnRjXzEgLy8gMAogICAgYiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9tZXJnZUA5Cg==", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" + }, + "byteCode": { + "approval": "CyAEAQAgFCYKBBUffHULUiNBcnJhbmdlciMMUiNBdXRob3JpdHkjEVIjQWNjb3VudE1hbmFnZXIjEFIjUHJpbWFyeURlYWxlciMKUiNUcnVzdGVlIwtSI09ic2VydmVyIwtSI09wRGFlbW9uIw9hc3NldF9zdXNwZW5kZWQPYXNzZXRfZGVmYXVsdGVkMRhAABEpMgNnJwcyA2cnCCNnJwkjZzEbQQBggASRTwTrNhoAjgEARzEZFEQxGESCCASC9xstBO8E9dME3zQ1UAQ9voC9BN9U6CwEAQyCmQR0BqzSBBpyou42GgCOCAAgADcATwEAAZMBsQG7AgQAMRmBBBIxGBBEQgAOMRkUMRgUEEQpMQBnIkOIAqwiQzYaAUkVJBJEiAKfKUxnMgcWKExQsCJDNhoBSRUkEkSIAognB0xnMgcWKExQsCJDNhoBSRUiEkQ2GgJJTgIVJBJENhoDSU4CFYEQEkSIAluIAmEXRwKIAmMlEkEADSlLA2cyBxYoTFCwIkNJgSgSQQAQK0sDUEm9RQEUREsCv0L/4EmBMhJBABEnBEsDUEm9RQEUREsCv0L/yEmBPBJBABEnBUsDUEm9RQEUREsCv0L/sEmBRhJBABAqSwNQSb1FARRESwK/Qv+ZSYFQEkH/kicGSwNQSb1FARRESwK/Qv+BNhoBSRUiEkQ2GgJJTgIVJBJEiAG1iAG7F0cCiAG9SSUTRIEoEkEAFCtLAlBJvUUBRLxIMgcWKExQsCJDSYEyEkEADycESwJQSb1FAUS8SEL/4UmBPBJBAA8nBUsCUEm9RQFEvEhC/8tJgUYSQQAOKksCUEm9RQFEvEhC/7ZJgVASQf+vJwZLAlBJvUUBRLxIQv+gNhoBSRUiEkQjUyoxAIgA8kQnCExnMgcWKExQsCJDIyllRChMULAiQzYaAUkVJBJEK0sBiADMJwRLAogAxScFSwOIAL4qSwSIALgnBk8FiACxgAEAI08GVCJPBVSBAk8EVIEDTwNUgQRPAlQoTFCwIkM2GgFJFSISRDYaAklOAhUkEkQXSYgAwCWDBSgyPEZQTwaOBgBNAD8AMAAhABMAAQAnBksBUEm9RQFEvkgoTFCwIkMqSwFQSb1FAUS+SEL/7CcFSwFQSb1FAUS+SEL/3ScESwFQSb1FAUS+SEL/zitLAVBJvUUBRL5IQv/AgBAAAAAAAAAAAAAAAAAAAAAAQv+rigIBgACL/ov/UEm9RQFBACCLAb5EI1syB0mMAA5BABGLAb5EgQhbiwAPQQAEIowAiSNC//kxACMpZUQSRIkjJwllRBREiYoBAIv/JRJAADCL/4EZEkAAKIv/gSgSQAAgi/+BMhJAABiL/4E8EkAAEIv/gUYSQAAIi/+BUBJBAAMiRIkjQv/6", + "clear": "C4EBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 5, + "minor": 7, + "patch": 1 + } + }, + "events": [], + "templateVariables": {} +} \ No newline at end of file diff --git a/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.clear.puya.map b/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.clear.puya.map new file mode 100644 index 00000000..d580b5c4 --- /dev/null +++ b/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.clear.puya.map @@ -0,0 +1,25 @@ +{ + "version": 3, + "sources": [], + "mappings": ";;;", + "op_pc_offset": 0, + "pc_events": { + "1": { + "subroutine": "algopy.arc4.ARC4Contract.clear_state_program", + "params": {}, + "block": "main", + "stack_in": [], + "op": "pushint 1", + "defined_out": [ + "1" + ], + "stack_out": [ + "1" + ] + }, + "3": { + "op": "return", + "stack_out": [] + } + } +} \ No newline at end of file diff --git a/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.clear.teal b/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.clear.teal new file mode 100644 index 00000000..75f539be --- /dev/null +++ b/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.clear.teal @@ -0,0 +1,7 @@ +#pragma version 11 +#pragma typetrack false + +// algopy.arc4.ARC4Contract.clear_state_program() -> uint64: +main: + pushint 1 + return diff --git a/smart_contracts/artifacts/mock_module_rbac/mock_rbac_module_client.py b/smart_contracts/artifacts/mock_module_rbac/mock_rbac_module_client.py new file mode 100644 index 00000000..43b8fda4 --- /dev/null +++ b/smart_contracts/artifacts/mock_module_rbac/mock_rbac_module_client.py @@ -0,0 +1,1682 @@ +# flake8: noqa +# fmt: off +# mypy: ignore-errors +# This file was automatically generated by algokit-client-generator. +# DO NOT MODIFY IT BY HAND. +# requires: algokit-utils@^3.0.0 + +# common +import dataclasses +import typing +# core algosdk +import algosdk +from algosdk.transaction import OnComplete +from algosdk.atomic_transaction_composer import TransactionSigner +from algosdk.source_map import SourceMap +from algosdk.transaction import Transaction +from algosdk.v2client.models import SimulateTraceConfig +# utils +import algokit_utils +from algokit_utils import AlgorandClient as _AlgoKitAlgorandClient + +_APP_SPEC_JSON = r"""{"arcs": [22, 28], "bareActions": {"call": [], "create": ["NoOp"]}, "methods": [{"actions": {"call": ["UpdateApplication"], "create": []}, "args": [], "name": "contract_update", "returns": {"type": "void"}, "desc": "Update D-ASA application.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "New Arranger address", "name": "new_arranger"}], "name": "rbac_rotate_arranger", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Rotate the Arranger address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Operation Daemon address", "name": "address"}], "name": "rbac_set_op_daemon", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Non-Normative: Set the Operation Daemon address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}, {"type": "(uint64,uint64)", "desc": "Role time validity", "name": "validity", "struct": "RoleValidity"}], "name": "rbac_assign_role", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Assign a role to an address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}], "name": "rbac_revoke_role", "returns": {"type": "uint64", "desc": "Timestamp of the role revocation"}, "desc": "Revoke a role from an address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Suspension status", "name": "suspended"}], "name": "rbac_gov_asset_suspension", "returns": {"type": "uint64", "desc": "Timestamp of the set asset suspension status"}, "desc": "Set asset suspension status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "rbac_get_arranger", "returns": {"type": "address", "desc": "Arranger address"}, "desc": "Get Arranger address", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Address to get roles for", "name": "address"}], "name": "rbac_get_address_roles", "returns": {"type": "(bool,bool,bool,bool,bool)", "desc": "Roles mask: (Account Manager, Primary Dealer, Trustee, Authority, Observer)"}, "desc": "Non-normative - Get roles assigned to an address", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}], "name": "rbac_get_role_validity", "returns": {"type": "(uint64,uint64)", "desc": "Role validity", "struct": "RoleValidity"}, "desc": "Get role validity", "events": [], "readonly": true, "recommendations": {}}], "name": "MockRbacModule", "state": {"keys": {"box": {}, "global": {"arranger": {"key": "UiNBcnJhbmdlciM=", "keyType": "AVMBytes", "valueType": "address"}, "op_daemon": {"key": "UiNPcERhZW1vbiM=", "keyType": "AVMBytes", "valueType": "address"}, "asset_suspended": {"key": "YXNzZXRfc3VzcGVuZGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "asset_defaulted": {"key": "YXNzZXRfZGVmYXVsdGVk", "keyType": "AVMString", "valueType": "AVMUint64"}}, "local": {}}, "maps": {"box": {"account_manager": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNBY2NvdW50TWFuYWdlciM="}, "primary_dealer": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNQcmltYXJ5RGVhbGVyIw=="}, "trustee": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNUcnVzdGVlIw=="}, "authority": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNBdXRob3JpdHkj"}, "observer": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNPYnNlcnZlciM="}}, "global": {}, "local": {}}, "schema": {"global": {"bytes": 2, "ints": 2}, "local": {"bytes": 0, "ints": 0}}}, "structs": {"RoleValidity": [{"name": "role_validity_start", "type": "uint64"}, {"name": "role_validity_end", "type": "uint64"}]}, "byteCode": {"approval": "CyAEAQAgFCYKBBUffHULUiNBcnJhbmdlciMMUiNBdXRob3JpdHkjEVIjQWNjb3VudE1hbmFnZXIjEFIjUHJpbWFyeURlYWxlciMKUiNUcnVzdGVlIwtSI09ic2VydmVyIwtSI09wRGFlbW9uIw9hc3NldF9zdXNwZW5kZWQPYXNzZXRfZGVmYXVsdGVkMRhAABEpMgNnJwcyA2cnCCNnJwkjZzEbQQBggASRTwTrNhoAjgEARzEZFEQxGESCCASC9xstBO8E9dME3zQ1UAQ9voC9BN9U6CwEAQyCmQR0BqzSBBpyou42GgCOCAAgADcATwEAAZMBsQG7AgQAMRmBBBIxGBBEQgAOMRkUMRgUEEQpMQBnIkOIAqwiQzYaAUkVJBJEiAKfKUxnMgcWKExQsCJDNhoBSRUkEkSIAognB0xnMgcWKExQsCJDNhoBSRUiEkQ2GgJJTgIVJBJENhoDSU4CFYEQEkSIAluIAmEXRwKIAmMlEkEADSlLA2cyBxYoTFCwIkNJgSgSQQAQK0sDUEm9RQEUREsCv0L/4EmBMhJBABEnBEsDUEm9RQEUREsCv0L/yEmBPBJBABEnBUsDUEm9RQEUREsCv0L/sEmBRhJBABAqSwNQSb1FARRESwK/Qv+ZSYFQEkH/kicGSwNQSb1FARRESwK/Qv+BNhoBSRUiEkQ2GgJJTgIVJBJEiAG1iAG7F0cCiAG9SSUTRIEoEkEAFCtLAlBJvUUBRLxIMgcWKExQsCJDSYEyEkEADycESwJQSb1FAUS8SEL/4UmBPBJBAA8nBUsCUEm9RQFEvEhC/8tJgUYSQQAOKksCUEm9RQFEvEhC/7ZJgVASQf+vJwZLAlBJvUUBRLxIQv+gNhoBSRUiEkQjUyoxAIgA8kQnCExnMgcWKExQsCJDIyllRChMULAiQzYaAUkVJBJEK0sBiADMJwRLAogAxScFSwOIAL4qSwSIALgnBk8FiACxgAEAI08GVCJPBVSBAk8EVIEDTwNUgQRPAlQoTFCwIkM2GgFJFSISRDYaAklOAhUkEkQXSYgAwCWDBSgyPEZQTwaOBgBNAD8AMAAhABMAAQAnBksBUEm9RQFEvkgoTFCwIkMqSwFQSb1FAUS+SEL/7CcFSwFQSb1FAUS+SEL/3ScESwFQSb1FAUS+SEL/zitLAVBJvUUBRL5IQv/AgBAAAAAAAAAAAAAAAAAAAAAAQv+rigIBgACL/ov/UEm9RQFBACCLAb5EI1syB0mMAA5BABGLAb5EgQhbiwAPQQAEIowAiSNC//kxACMpZUQSRIkjJwllRBREiYoBAIv/JRJAADCL/4EZEkAAKIv/gSgSQAAgi/+BMhJAABiL/4E8EkAAEIv/gUYSQAAIi/+BUBJBAAMiRIkjQv/6", "clear": "C4EBQw=="}, "desc": "\n RBAC Module for testing\n ", "events": [], "networks": {}, "source": {"approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMzIgMjAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMgMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMgMHg1MjIzNDE2MzYzNmY3NTZlNzQ0ZDYxNmU2MTY3NjU3MjIzIDB4NTIyMzUwNzI2OTZkNjE3Mjc5NDQ2NTYxNmM2NTcyMjMgMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMyAweDUyMjM0ZjYyNzM2NTcyNzY2NTcyMjMgMHg1MjIzNGY3MDQ0NjE2NTZkNmY2ZTIzICJhc3NldF9zdXNwZW5kZWQiICJhc3NldF9kZWZhdWx0ZWQiCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgtMjkKICAgIC8vICMgUkJBQyBSb2xlcwogICAgLy8gc2VsZi5hcnJhbmdlciA9IEdsb2JhbFN0YXRlKEFjY291bnQoKSwga2V5PWNzdC5QUkVGSVhfSURfQVJSQU5HRVIpCiAgICBieXRlY18xIC8vIDB4NTIyMzQxNzI3MjYxNmU2NzY1NzIyMwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwCiAgICAvLyBzZWxmLm9wX2RhZW1vbiA9IEdsb2JhbFN0YXRlKEFjY291bnQoKSwga2V5PWNzdC5QUkVGSVhfSURfT1BfREFFTU9OKQogICAgYnl0ZWMgNyAvLyAweDUyMjM0ZjcwNDQ2MTY1NmQ2ZjZlMjMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo0Ny00OAogICAgLy8gIyBELUFTQSBHb3Zlcm5hbmNlCiAgICAvLyBzZWxmLmFzc2V0X3N1c3BlbmRlZCA9IEZhbHNlCiAgICBieXRlYyA4IC8vICJhc3NldF9zdXNwZW5kZWQiCiAgICBpbnRjXzEgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo0OQogICAgLy8gc2VsZi5hc3NldF9kZWZhdWx0ZWQgPSBGYWxzZQogICAgYnl0ZWMgOSAvLyAiYXNzZXRfZGVmYXVsdGVkIgogICAgaW50Y18xIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tb2NrX21vZHVsZV9yYmFjL2NvbnRyYWN0LnB5OjYKICAgIC8vIGNsYXNzIE1vY2tSYmFjTW9kdWxlKFJiYWNNb2R1bGUpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fY3JlYXRlQDE5CiAgICBwdXNoYnl0ZXMgMHg5MTRmMDRlYiAvLyBtZXRob2QgImNvbnRyYWN0X3VwZGF0ZSgpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fY29udHJhY3RfdXBkYXRlX3JvdXRlQDUKCm1haW5fc3dpdGNoX2Nhc2VfbmV4dEA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL21vY2tfbW9kdWxlX3JiYWMvY29udHJhY3QucHk6NgogICAgLy8gY2xhc3MgTW9ja1JiYWNNb2R1bGUoUmJhY01vZHVsZSk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHg4MmY3MWIyZCAweGVmMDRmNWQzIDB4ZGYzNDM1NTAgMHgzZGJlODBiZCAweGRmNTRlODJjIDB4MDEwYzgyOTkgMHg3NDA2YWNkMiAweDFhNzJhMmVlIC8vIG1ldGhvZCAicmJhY19yb3RhdGVfYXJyYW5nZXIoYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgInJiYWNfc2V0X29wX2RhZW1vbihhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19hc3NpZ25fcm9sZSh1aW50OCxhZGRyZXNzLCh1aW50NjQsdWludDY0KSl1aW50NjQiLCBtZXRob2QgInJiYWNfcmV2b2tlX3JvbGUodWludDgsYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgInJiYWNfZ292X2Fzc2V0X3N1c3BlbnNpb24oYm9vbCl1aW50NjQiLCBtZXRob2QgInJiYWNfZ2V0X2FycmFuZ2VyKClhZGRyZXNzIiwgbWV0aG9kICJyYmFjX2dldF9hZGRyZXNzX3JvbGVzKGFkZHJlc3MpKGJvb2wsYm9vbCxib29sLGJvb2wsYm9vbCkiLCBtZXRob2QgInJiYWNfZ2V0X3JvbGVfdmFsaWRpdHkodWludDgsYWRkcmVzcykodWludDY0LHVpbnQ2NCkiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCByYmFjX3JvdGF0ZV9hcnJhbmdlciByYmFjX3NldF9vcF9kYWVtb24gcmJhY19hc3NpZ25fcm9sZSByYmFjX3Jldm9rZV9yb2xlIHJiYWNfZ292X2Fzc2V0X3N1c3BlbnNpb24gcmJhY19nZXRfYXJyYW5nZXIgcmJhY19nZXRfYWRkcmVzc19yb2xlcyByYmFjX2dldF9yb2xlX3ZhbGlkaXR5CiAgICBlcnIKCm1haW5fY29udHJhY3RfdXBkYXRlX3JvdXRlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBwdXNoaW50IDQgLy8gVXBkYXRlQXBwbGljYXRpb24KICAgID09CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydAogICAgYiBjb250cmFjdF91cGRhdGUKCm1haW5fY3JlYXRlQDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL21vY2tfbW9kdWxlX3JiYWMvY29udHJhY3QucHk6MTQKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbW9ja19tb2R1bGVfcmJhYy9jb250cmFjdC5weToxNgogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IFR4bi5zZW5kZXIKICAgIGJ5dGVjXzEgLy8gMHg1MjIzNDE3MjcyNjE2ZTY3NjU3MjIzCiAgICB0eG4gU2VuZGVyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL21vY2tfbW9kdWxlX3JiYWMvY29udHJhY3QucHk6MTQKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5jb250cmFjdF91cGRhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF91cGRhdGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTUzLTE1NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGdyYW50cyB0aGUgdXBkYXRlIHBlcm1pc3Npb25zIHRvIHRoZSBBcnJhbmdlci4KICAgIC8vICMg4pqg77iPIFdBUk5JTkc6IEFwcGxpY2F0aW9uIHVwZGF0ZXMgbXVzdCBiZSBleGVjdXRlZCBWRVJZIGNhcmVmdWxseSwgYXMgdGhleQogICAgLy8gIyBtaWdodCBpbnRyb2R1Y2UgYnJlYWtpbmcgY2hhbmdlcy4KICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfcm90YXRlX2FycmFuZ2VyW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19yb3RhdGVfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2OQogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTcwCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gbmV3X2FycmFuZ2VyCiAgICBieXRlY18xIC8vIDB4NTIyMzQxNzI3MjYxNmU2NzY1NzIyMwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzEKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE1OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19zZXRfb3BfZGFlbW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19zZXRfb3BfZGFlbW9uOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE3MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODQKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4NQogICAgLy8gc2VsZi5vcF9kYWVtb24udmFsdWUgPSBhZGRyZXNzCiAgICBieXRlYyA3IC8vIDB4NTIyMzRmNzA0NDYxNjU2ZDZmNmUyMwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODYKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE3MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19hc3NpZ25fcm9sZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfYXNzaWduX3JvbGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgcHVzaGludCAxNgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5Sb2xlVmFsaWRpdHkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTAKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTIKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCkpCiAgICBidG9pCiAgICBkdXBuIDIKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTAyCiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKToKICAgIGludGNfMyAvLyAyMAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTAzCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gcm9sZV9hZGRyZXNzCiAgICBieXRlY18xIC8vIDB4NTIyMzQxNzI3MjYxNmU2NzY1NzIyMwogICAgZGlnIDMKICAgIGFwcF9nbG9iYWxfcHV0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxNAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwNgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDQwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDcKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjXzMgLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQ0ZDYxNmU2MTY3NjU3MjIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDgKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjEzCiAgICAvLyBzZWxmLl9zZXRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIHZhbGlkaXR5KQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTAKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTEKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgNCAvLyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTIKICAgIC8vIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIGR1cAogICAgcHVzaGludCA2MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE1CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgNSAvLyAweDUyMjM1NDcyNzU3Mzc0NjU2NTIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTYKICAgIC8vIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMwogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE4CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNzAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTkKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjXzIgLy8gMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMAogICAgLy8gc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDgwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5vYnNlcnZlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyA2IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI0CiAgICAvLyBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3Jldm9rZV9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19yZXZva2Vfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzUKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzNgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzcKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCkpCiAgICBidG9pCiAgICBkdXBuIDIKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCAhPSBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksIGVyci5JTlZBTElEX1JPTEUKICAgIGR1cAogICAgaW50Y18zIC8vIDIwCiAgICAhPQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI4CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICBwdXNoaW50IDQwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjkKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWNfMyAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMAogICAgLy8gZGVsIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzkKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzMKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyA0IC8vIDB4NTIyMzUwNzI2OTZkNjE3Mjc5NDQ2NTYxNmM2NTcyMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNAogICAgLy8gZGVsIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjM4CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIGR1cAogICAgcHVzaGludCA2MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyA1IC8vIDB4NTIyMzU0NzI3NTczNzQ2NTY1MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzOAogICAgLy8gZGVsIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzgKICAgIC8vIHNlbGYuX2RlbGV0ZV9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcykKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQwCiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNzAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlY18yIC8vIDB4NTIyMzQxNzU3NDY4NmY3MjY5NzQ3OTIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDIKICAgIC8vIGRlbCBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzgKICAgIC8vIHNlbGYuX2RlbGV0ZV9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcykKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ0CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKToKICAgIGR1cAogICAgcHVzaGludCA4MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDUKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5vYnNlcnZlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyA2IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ2CiAgICAvLyBkZWwgc2VsZi5vYnNlcnZlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ292X2Fzc2V0X3N1c3BlbnNpb25bcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dvdl9hc3NldF9zdXNwZW5zaW9uOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kICAjIFRPRE86IFVwZGF0ZSBzcGVjcyBhbmQgYWRkIHRlc3QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzEgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzcKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjXzIgLy8gMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTcKICAgIC8vIHNlbGYuYXNzZXRfc3VzcGVuZGVkID0gc3VzcGVuZGVkCiAgICBieXRlYyA4IC8vICJhc3NldF9zdXNwZW5kZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1OAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QgICMgVE9ETzogVXBkYXRlIHNwZWNzIGFuZCBhZGQgdGVzdAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X2FycmFuZ2VyW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjY4CiAgICAvLyByZXR1cm4gc2VsZi5hcnJhbmdlci52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzEgLy8gMHg1MjIzNDE3MjcyNjE2ZTY3NjU3MjIzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJyYW5nZXIgZXhpc3RzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjYwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9hZGRyZXNzX3JvbGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfYWRkcmVzc19yb2xlczoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg0CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmFjY291bnRfbWFuYWdlciwgYWRkcmVzcyksCiAgICBieXRlY18zIC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0NGQ2MTZlNjE2NzY1NzIyMwogICAgZGlnIDEKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg1CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnByaW1hcnlfZGVhbGVyLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDQgLy8gMHg1MjIzNTA3MjY5NmQ2MTcyNzk0NDY1NjE2YzY1NzIyMwogICAgZGlnIDIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg2CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnRydXN0ZWUsIGFkZHJlc3MpLAogICAgYnl0ZWMgNSAvLyAweDUyMjM1NDcyNzU3Mzc0NjU2NTIzCiAgICBkaWcgMwogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODcKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYXV0aG9yaXR5LCBhZGRyZXNzKSwKICAgIGJ5dGVjXzIgLy8gMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMKICAgIGRpZyA0CiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4OAogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5vYnNlcnZlciwgYWRkcmVzcyksCiAgICBieXRlYyA2IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgdW5jb3ZlciA1CiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBwdXNoYnl0ZXMgMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgNgogICAgc2V0Yml0CiAgICBpbnRjXzAgLy8gMQogICAgdW5jb3ZlciA1CiAgICBzZXRiaXQKICAgIHB1c2hpbnQgMgogICAgdW5jb3ZlciA0CiAgICBzZXRiaXQKICAgIHB1c2hpbnQgMwogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIHB1c2hpbnQgNAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5W3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfcm9sZV92YWxpZGl0eToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDUKICAgIC8vIHJvbGUgPSByb2xlX2lkLmFzX3VpbnQ2NCgpCiAgICBidG9pCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA2CiAgICAvLyBzZWxmLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlKQogICAgZHVwCiAgICBjYWxsc3ViIF9hc3NlcnRfdmFsaWRfcm9sZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwOAogICAgLy8gY2FzZSBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUik6CiAgICBpbnRjXzMgLy8gMjAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTIKICAgIC8vIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIHB1c2hpbnRzIDQwIDUwIDYwIDcwIDgwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA3LTMzOAogICAgLy8gbWF0Y2ggcm9sZToKICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKToKICAgIC8vICAgICAgICAgcmV0dXJuIHR5cC5Sb2xlVmFsaWRpdHkoCiAgICAvLyAgICAgICAgICAgICByb2xlX3ZhbGlkaXR5X3N0YXJ0PVVJbnQ2NCgwKSwgcm9sZV92YWxpZGl0eV9lbmQ9VUludDY0KDApCiAgICAvLyAgICAgICAgICkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSk6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSk6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgXzoKICAgIC8vICAgICAgICAgb3AuZXJyKGVyci5JTlZBTElEX1JPTEUpCiAgICB1bmNvdmVyIDYKICAgIG1hdGNoIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMEAyIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMUAzIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMkA0IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfM0A1IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNEA2IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzM4CiAgICAvLyBvcC5lcnIoZXJyLklOVkFMSURfUk9MRSkKICAgIGVyciAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV81QDc6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzM0CiAgICAvLyBzZWxmLm9ic2VydmVyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDYgLy8gMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzMzLTMzNQogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMzNgogICAgLy8gcmV0dXJuIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzRANjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjkKICAgIC8vIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjXzIgLy8gMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjgtMzMwCiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5hdXRob3JpdHksIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMzMQogICAgLy8gcmV0dXJuIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfM0A1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyNAogICAgLy8gc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDUgLy8gMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMy0zMjUKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyNgogICAgLy8gcmV0dXJuIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzJANDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTkKICAgIC8vIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgNCAvLyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzE4LTMyMAogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMQogICAgLy8gcmV0dXJuIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8xQDM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzE0CiAgICAvLyBzZWxmLmFjY291bnRfbWFuYWdlciwgcm9sZV9hZGRyZXNzCiAgICBieXRlY18zIC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0NGQ2MTZlNjE2NzY1NzIyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxMy0zMTUKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLmFjY291bnRfbWFuYWdlciwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzE2CiAgICAvLyByZXR1cm4gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8wQDI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA5LTMxMQogICAgLy8gcmV0dXJuIHR5cC5Sb2xlVmFsaWRpdHkoCiAgICAvLyAgICAgcm9sZV92YWxpZGl0eV9zdGFydD1VSW50NjQoMCksIHJvbGVfdmFsaWRpdHlfZW5kPVVJbnQ2NCgwKQogICAgLy8gKQogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3JvbGVfaXNfYWN0aXZlKHJvbGVfbWFwOiBieXRlcywgcm9sZV9hZGRyZXNzOiBieXRlcykgLT4gdWludDY0Ogpfcm9sZV9pc19hY3RpdmU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTcKICAgIC8vIGRlZiBfcm9sZV9pc19hY3RpdmUoc2VsZiwgcm9sZV9tYXA6IHR5cC5SYmFjUm9sZSwgcm9sZV9hZGRyZXNzOiBBY2NvdW50KSAtPiBib29sOgogICAgcHJvdG8gMiAxCiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OC02MgogICAgLy8gcmV0dXJuIHNlbGYuX2hhc19yb2xlKHJvbGVfbWFwLCByb2xlX2FkZHJlc3MpIGFuZCAoCiAgICAvLyAgICAgcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICAvLyApCiAgICBieiBfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTkKICAgIC8vIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBCb3hNYXAgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2MAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTktNjAKICAgIC8vIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIDw9CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTktNjEKICAgIC8vIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IF9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2MQogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBCb3hNYXAgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDgKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAtNjEKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgPj0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgaW50Y18wIC8vIDEKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX21lcmdlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzEgLy8gMAogICAgYiBfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKSAtPiB2b2lkOgpfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2NQogICAgLy8gYXNzZXJ0IHNlbGYuX2lzX2FycmFuZ2VyKFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTIKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgPT0gc2VsZi5hcnJhbmdlci52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzEgLy8gMHg1MjIzNDE3MjcyNjE2ZTY3NjU3MjIzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJyYW5nZXIgZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjY1CiAgICAvLyBhc3NlcnQgc2VsZi5faXNfYXJyYW5nZXIoVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkgLT4gdm9pZDoKX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjgzCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYXNzZXRfZGVmYXVsdGVkLCBlcnIuREVGQVVMVEVECiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgOSAvLyAiYXNzZXRfZGVmYXVsdGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2RlZmF1bHRlZCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBEZWZhdWx0ZWQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkOiB1aW50NjQpIC0+IHZvaWQ6Cl9hc3NlcnRfdmFsaWRfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OAogICAgLy8gZGVmIF9hc3NlcnRfdmFsaWRfcm9sZShzZWxmLCByb2xlX2lkOiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTAKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIGludGNfMyAvLyAyMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICBwdXNoaW50IDI1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MgogICAgLy8gVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIHB1c2hpbnQgNDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkzCiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICBwdXNoaW50IDUwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NAogICAgLy8gVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICBwdXNoaW50IDYwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NQogICAgLy8gVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIHB1c2hpbnQgNzAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojk2CiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICBwdXNoaW50IDgwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBieiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9mYWxzZUA4CgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDc6CiAgICBpbnRjXzAgLy8gMQoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfbWVyZ2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICByZXRzdWIKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX2ZhbHNlQDg6CiAgICBpbnRjXzEgLy8gMAogICAgYiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9tZXJnZUA5Cg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="}, "sourceInfo": {"approval": {"pcOffsetMethod": "none", "sourceInfo": [{"pc": [980], "errorMessage": "Defaulted"}, {"pc": [405, 429, 453, 476, 500, 555, 583, 605, 626, 648, 824, 841, 856, 871, 885], "errorMessage": "Invalid account role address"}, {"pc": [540, 814, 1041], "errorMessage": "Invalid role identifier"}, {"pc": [670, 972], "errorMessage": "Not authorized"}, {"pc": [932, 947], "errorMessage": "check BoxMap entry exists"}, {"pc": [687, 970], "errorMessage": "check self.arranger exists"}, {"pc": [978], "errorMessage": "check self.asset_defaulted exists"}, {"pc": [661], "errorMessage": "invalid number of bytes for arc4.bool"}, {"pc": [290, 313, 347, 524, 701, 784], "errorMessage": "invalid number of bytes for arc4.static_array"}, {"pc": [337, 514, 774], "errorMessage": "invalid number of bytes for arc4.uint8"}, {"pc": [358], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.RoleValidity"}]}, "clear": {"pcOffsetMethod": "none", "sourceInfo": []}}, "templateVariables": {}}""" +APP_SPEC = algokit_utils.Arc56Contract.from_json(_APP_SPEC_JSON) + +def _parse_abi_args(args: object | None = None) -> list[object] | None: + """Helper to parse ABI args into the format expected by underlying client""" + if args is None: + return None + + def convert_dataclass(value: object) -> object: + if dataclasses.is_dataclass(value): + return tuple(convert_dataclass(getattr(value, field.name)) for field in dataclasses.fields(value)) + elif isinstance(value, (list, tuple)): + return type(value)(convert_dataclass(item) for item in value) + return value + + match args: + case tuple(): + method_args = list(args) + case _ if dataclasses.is_dataclass(args): + method_args = [getattr(args, field.name) for field in dataclasses.fields(args)] + case _: + raise ValueError("Invalid 'args' type. Expected 'tuple' or 'TypedDict' for respective typed arguments.") + + return [ + convert_dataclass(arg) if not isinstance(arg, algokit_utils.AppMethodCallTransactionArgument) else arg + for arg in method_args + ] if method_args else None + +def _init_dataclass(cls: type, data: dict) -> object: + """ + Recursively instantiate a dataclass of type `cls` from `data`. + + For each field on the dataclass, if the field type is also a dataclass + and the corresponding data is a dict, instantiate that field recursively. + """ + field_values = {} + for field in dataclasses.fields(cls): + field_value = data.get(field.name) + # Check if the field expects another dataclass and the value is a dict. + if dataclasses.is_dataclass(field.type) and isinstance(field_value, dict): + field_values[field.name] = _init_dataclass(typing.cast(type, field.type), field_value) + else: + field_values[field.name] = field_value + return cls(**field_values) + +@dataclasses.dataclass(frozen=True) +class RoleValidity: + """Struct for RoleValidity""" + role_validity_start: int + role_validity_end: int + + +@dataclasses.dataclass(frozen=True, kw_only=True) +class RbacRotateArrangerArgs: + """Dataclass for rbac_rotate_arranger arguments""" + new_arranger: str + + @property + def abi_method_signature(self) -> str: + return "rbac_rotate_arranger(address)uint64" + +@dataclasses.dataclass(frozen=True, kw_only=True) +class RbacSetOpDaemonArgs: + """Dataclass for rbac_set_op_daemon arguments""" + address: str + + @property + def abi_method_signature(self) -> str: + return "rbac_set_op_daemon(address)uint64" + +@dataclasses.dataclass(frozen=True, kw_only=True) +class RbacAssignRoleArgs: + """Dataclass for rbac_assign_role arguments""" + role_id: int + role_address: str + validity: RoleValidity + + @property + def abi_method_signature(self) -> str: + return "rbac_assign_role(uint8,address,(uint64,uint64))uint64" + +@dataclasses.dataclass(frozen=True, kw_only=True) +class RbacRevokeRoleArgs: + """Dataclass for rbac_revoke_role arguments""" + role_id: int + role_address: str + + @property + def abi_method_signature(self) -> str: + return "rbac_revoke_role(uint8,address)uint64" + +@dataclasses.dataclass(frozen=True, kw_only=True) +class RbacGovAssetSuspensionArgs: + """Dataclass for rbac_gov_asset_suspension arguments""" + suspended: bool + + @property + def abi_method_signature(self) -> str: + return "rbac_gov_asset_suspension(bool)uint64" + +@dataclasses.dataclass(frozen=True, kw_only=True) +class RbacGetAddressRolesArgs: + """Dataclass for rbac_get_address_roles arguments""" + address: str + + @property + def abi_method_signature(self) -> str: + return "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)" + +@dataclasses.dataclass(frozen=True, kw_only=True) +class RbacGetRoleValidityArgs: + """Dataclass for rbac_get_role_validity arguments""" + role_id: int + role_address: str + + @property + def abi_method_signature(self) -> str: + return "rbac_get_role_validity(uint8,address)(uint64,uint64)" + + +class _MockRbacModuleUpdate: + def __init__(self, app_client: algokit_utils.AppClient): + self.app_client = app_client + + def contract_update( + self, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.AppUpdateMethodCallParams: + + params = params or algokit_utils.CommonAppCallParams() + compilation_params = compilation_params or algokit_utils.AppClientCompilationParams() + return self.app_client.params.update(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "contract_update()void", + })) + + +class MockRbacModuleParams: + def __init__(self, app_client: algokit_utils.AppClient): + self.app_client = app_client + + @property + def update(self) -> "_MockRbacModuleUpdate": + return _MockRbacModuleUpdate(self.app_client) + + def rbac_rotate_arranger( + self, + args: tuple[str] | RbacRotateArrangerArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.AppCallMethodCallParams: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_rotate_arranger(address)uint64", + "args": method_args, + })) + + def rbac_set_op_daemon( + self, + args: tuple[str] | RbacSetOpDaemonArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.AppCallMethodCallParams: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_set_op_daemon(address)uint64", + "args": method_args, + })) + + def rbac_assign_role( + self, + args: tuple[int, str, RoleValidity] | RbacAssignRoleArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.AppCallMethodCallParams: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_assign_role(uint8,address,(uint64,uint64))uint64", + "args": method_args, + })) + + def rbac_revoke_role( + self, + args: tuple[int, str] | RbacRevokeRoleArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.AppCallMethodCallParams: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_revoke_role(uint8,address)uint64", + "args": method_args, + })) + + def rbac_gov_asset_suspension( + self, + args: tuple[bool] | RbacGovAssetSuspensionArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.AppCallMethodCallParams: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_gov_asset_suspension(bool)uint64", + "args": method_args, + })) + + def rbac_get_arranger( + self, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.AppCallMethodCallParams: + + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_get_arranger()address", + })) + + def rbac_get_address_roles( + self, + args: tuple[str] | RbacGetAddressRolesArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.AppCallMethodCallParams: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", + "args": method_args, + })) + + def rbac_get_role_validity( + self, + args: tuple[int, str] | RbacGetRoleValidityArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.AppCallMethodCallParams: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_get_role_validity(uint8,address)(uint64,uint64)", + "args": method_args, + })) + + def clear_state( + self, + params: algokit_utils.AppClientBareCallParams | None = None, + + ) -> algokit_utils.AppCallParams: + return self.app_client.params.bare.clear_state( + params, + + ) + + +class _MockRbacModuleUpdateTransaction: + def __init__(self, app_client: algokit_utils.AppClient): + self.app_client = app_client + + def contract_update( + self, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.BuiltTransactions: + + params = params or algokit_utils.CommonAppCallParams() + compilation_params = compilation_params or algokit_utils.AppClientCompilationParams() + return self.app_client.create_transaction.update(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "contract_update()void", + })) + + +class MockRbacModuleCreateTransactionParams: + def __init__(self, app_client: algokit_utils.AppClient): + self.app_client = app_client + + @property + def update(self) -> "_MockRbacModuleUpdateTransaction": + return _MockRbacModuleUpdateTransaction(self.app_client) + + def rbac_rotate_arranger( + self, + args: tuple[str] | RbacRotateArrangerArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.BuiltTransactions: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_rotate_arranger(address)uint64", + "args": method_args, + })) + + def rbac_set_op_daemon( + self, + args: tuple[str] | RbacSetOpDaemonArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.BuiltTransactions: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_set_op_daemon(address)uint64", + "args": method_args, + })) + + def rbac_assign_role( + self, + args: tuple[int, str, RoleValidity] | RbacAssignRoleArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.BuiltTransactions: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_assign_role(uint8,address,(uint64,uint64))uint64", + "args": method_args, + })) + + def rbac_revoke_role( + self, + args: tuple[int, str] | RbacRevokeRoleArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.BuiltTransactions: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_revoke_role(uint8,address)uint64", + "args": method_args, + })) + + def rbac_gov_asset_suspension( + self, + args: tuple[bool] | RbacGovAssetSuspensionArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.BuiltTransactions: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_gov_asset_suspension(bool)uint64", + "args": method_args, + })) + + def rbac_get_arranger( + self, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.BuiltTransactions: + + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_get_arranger()address", + })) + + def rbac_get_address_roles( + self, + args: tuple[str] | RbacGetAddressRolesArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.BuiltTransactions: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", + "args": method_args, + })) + + def rbac_get_role_validity( + self, + args: tuple[int, str] | RbacGetRoleValidityArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.BuiltTransactions: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_get_role_validity(uint8,address)(uint64,uint64)", + "args": method_args, + })) + + def clear_state( + self, + params: algokit_utils.AppClientBareCallParams | None = None, + + ) -> Transaction: + return self.app_client.create_transaction.bare.clear_state( + params, + + ) + + +class _MockRbacModuleUpdateSend: + def __init__(self, app_client: algokit_utils.AppClient): + self.app_client = app_client + + def contract_update( + self, + params: algokit_utils.CommonAppCallParams | None = None, + send_params: algokit_utils.SendParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.SendAppTransactionResult[None]: + + params = params or algokit_utils.CommonAppCallParams() + compilation_params = compilation_params or algokit_utils.AppClientCompilationParams() + response = self.app_client.send.update(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "contract_update()void", + }), send_params=send_params, compilation_params=compilation_params) + parsed_response = response + return typing.cast(algokit_utils.SendAppUpdateTransactionResult[None], parsed_response) + + +class MockRbacModuleSend: + def __init__(self, app_client: algokit_utils.AppClient): + self.app_client = app_client + + @property + def update(self) -> "_MockRbacModuleUpdateSend": + return _MockRbacModuleUpdateSend(self.app_client) + + def rbac_rotate_arranger( + self, + args: tuple[str] | RbacRotateArrangerArgs, + params: algokit_utils.CommonAppCallParams | None = None, + send_params: algokit_utils.SendParams | None = None + ) -> algokit_utils.SendAppTransactionResult[int]: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_rotate_arranger(address)uint64", + "args": method_args, + }), send_params=send_params) + parsed_response = response + return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) + + def rbac_set_op_daemon( + self, + args: tuple[str] | RbacSetOpDaemonArgs, + params: algokit_utils.CommonAppCallParams | None = None, + send_params: algokit_utils.SendParams | None = None + ) -> algokit_utils.SendAppTransactionResult[int]: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_set_op_daemon(address)uint64", + "args": method_args, + }), send_params=send_params) + parsed_response = response + return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) + + def rbac_assign_role( + self, + args: tuple[int, str, RoleValidity] | RbacAssignRoleArgs, + params: algokit_utils.CommonAppCallParams | None = None, + send_params: algokit_utils.SendParams | None = None + ) -> algokit_utils.SendAppTransactionResult[int]: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_assign_role(uint8,address,(uint64,uint64))uint64", + "args": method_args, + }), send_params=send_params) + parsed_response = response + return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) + + def rbac_revoke_role( + self, + args: tuple[int, str] | RbacRevokeRoleArgs, + params: algokit_utils.CommonAppCallParams | None = None, + send_params: algokit_utils.SendParams | None = None + ) -> algokit_utils.SendAppTransactionResult[int]: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_revoke_role(uint8,address)uint64", + "args": method_args, + }), send_params=send_params) + parsed_response = response + return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) + + def rbac_gov_asset_suspension( + self, + args: tuple[bool] | RbacGovAssetSuspensionArgs, + params: algokit_utils.CommonAppCallParams | None = None, + send_params: algokit_utils.SendParams | None = None + ) -> algokit_utils.SendAppTransactionResult[int]: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_gov_asset_suspension(bool)uint64", + "args": method_args, + }), send_params=send_params) + parsed_response = response + return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) + + def rbac_get_arranger( + self, + params: algokit_utils.CommonAppCallParams | None = None, + send_params: algokit_utils.SendParams | None = None + ) -> algokit_utils.SendAppTransactionResult[str]: + + params = params or algokit_utils.CommonAppCallParams() + response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_get_arranger()address", + }), send_params=send_params) + parsed_response = response + return typing.cast(algokit_utils.SendAppTransactionResult[str], parsed_response) + + def rbac_get_address_roles( + self, + args: tuple[str] | RbacGetAddressRolesArgs, + params: algokit_utils.CommonAppCallParams | None = None, + send_params: algokit_utils.SendParams | None = None + ) -> algokit_utils.SendAppTransactionResult[tuple[bool, bool, bool, bool, bool]]: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", + "args": method_args, + }), send_params=send_params) + parsed_response = response + return typing.cast(algokit_utils.SendAppTransactionResult[tuple[bool, bool, bool, bool, bool]], parsed_response) + + def rbac_get_role_validity( + self, + args: tuple[int, str] | RbacGetRoleValidityArgs, + params: algokit_utils.CommonAppCallParams | None = None, + send_params: algokit_utils.SendParams | None = None + ) -> algokit_utils.SendAppTransactionResult[RoleValidity]: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_get_role_validity(uint8,address)(uint64,uint64)", + "args": method_args, + }), send_params=send_params) + parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(RoleValidity, typing.cast(dict, response.abi_return))) # type: ignore + return typing.cast(algokit_utils.SendAppTransactionResult[RoleValidity], parsed_response) + + def clear_state( + self, + params: algokit_utils.AppClientBareCallParams | None = None, + send_params: algokit_utils.SendParams | None = None + ) -> algokit_utils.SendAppTransactionResult[algokit_utils.ABIReturn]: + return self.app_client.send.bare.clear_state( + params, + send_params=send_params, + ) + + +class GlobalStateValue(typing.TypedDict): + """Shape of global_state state key values""" + arranger: str + op_daemon: str + asset_suspended: int + asset_defaulted: int + +class MockRbacModuleState: + """Methods to access state for the current MockRbacModule app""" + + def __init__(self, app_client: algokit_utils.AppClient): + self.app_client = app_client + + @property + def global_state( + self + ) -> "_GlobalState": + """Methods to access global_state for the current app""" + return _GlobalState(self.app_client) + + @property + def box( + self + ) -> "_BoxState": + """Methods to access box for the current app""" + return _BoxState(self.app_client) + +class _GlobalState: + def __init__(self, app_client: algokit_utils.AppClient): + self.app_client = app_client + + # Pre-generated mapping of value types to their struct classes + self._struct_classes: dict[str, typing.Type[typing.Any]] = {} + + def get_all(self) -> GlobalStateValue: + """Get all current keyed values from global_state state""" + result = self.app_client.state.global_state.get_all() + if not result: + return typing.cast(GlobalStateValue, {}) + + converted = {} + for key, value in result.items(): + key_info = self.app_client.app_spec.state.keys.global_state.get(key) + struct_class = self._struct_classes.get(key_info.value_type) if key_info else None + converted[key] = ( + _init_dataclass(struct_class, value) if struct_class and isinstance(value, dict) + else value + ) + return typing.cast(GlobalStateValue, converted) + + @property + def arranger(self) -> str: + """Get the current value of the arranger key in global_state state""" + value = self.app_client.state.global_state.get_value("arranger") + if isinstance(value, dict) and "address" in self._struct_classes: + return _init_dataclass(self._struct_classes["address"], value) # type: ignore + return typing.cast(str, value) + + @property + def op_daemon(self) -> str: + """Get the current value of the op_daemon key in global_state state""" + value = self.app_client.state.global_state.get_value("op_daemon") + if isinstance(value, dict) and "address" in self._struct_classes: + return _init_dataclass(self._struct_classes["address"], value) # type: ignore + return typing.cast(str, value) + + @property + def asset_suspended(self) -> int: + """Get the current value of the asset_suspended key in global_state state""" + value = self.app_client.state.global_state.get_value("asset_suspended") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore + return typing.cast(int, value) + + @property + def asset_defaulted(self) -> int: + """Get the current value of the asset_defaulted key in global_state state""" + value = self.app_client.state.global_state.get_value("asset_defaulted") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore + return typing.cast(int, value) + +class _BoxState: + def __init__(self, app_client: algokit_utils.AppClient): + self.app_client = app_client + + # Pre-generated mapping of value types to their struct classes + self._struct_classes: dict[str, typing.Type[typing.Any]] = { + "RoleValidity": RoleValidity + } + + def get_all(self) -> dict[str, typing.Any]: + """Get all current keyed values from box state""" + result = self.app_client.state.box.get_all() + if not result: + return {} + + converted = {} + for key, value in result.items(): + key_info = self.app_client.app_spec.state.keys.box.get(key) + struct_class = self._struct_classes.get(key_info.value_type) if key_info else None + converted[key] = ( + _init_dataclass(struct_class, value) if struct_class and isinstance(value, dict) + else value + ) + return converted + + @property + def account_manager(self) -> "_MapState[str, RoleValidity]": + """Get values from the account_manager map in box state""" + return _MapState( + self.app_client.state.box, + "account_manager", + self._struct_classes.get("RoleValidity") + ) + + @property + def primary_dealer(self) -> "_MapState[str, RoleValidity]": + """Get values from the primary_dealer map in box state""" + return _MapState( + self.app_client.state.box, + "primary_dealer", + self._struct_classes.get("RoleValidity") + ) + + @property + def trustee(self) -> "_MapState[str, RoleValidity]": + """Get values from the trustee map in box state""" + return _MapState( + self.app_client.state.box, + "trustee", + self._struct_classes.get("RoleValidity") + ) + + @property + def authority(self) -> "_MapState[str, RoleValidity]": + """Get values from the authority map in box state""" + return _MapState( + self.app_client.state.box, + "authority", + self._struct_classes.get("RoleValidity") + ) + + @property + def observer(self) -> "_MapState[str, RoleValidity]": + """Get values from the observer map in box state""" + return _MapState( + self.app_client.state.box, + "observer", + self._struct_classes.get("RoleValidity") + ) + +_KeyType = typing.TypeVar("_KeyType") +_ValueType = typing.TypeVar("_ValueType") + +class _AppClientStateMethodsProtocol(typing.Protocol): + def get_map(self, map_name: str) -> dict[typing.Any, typing.Any]: + ... + def get_map_value(self, map_name: str, key: typing.Any) -> typing.Any | None: + ... + +class _MapState(typing.Generic[_KeyType, _ValueType]): + """Generic class for accessing state maps with strongly typed keys and values""" + + def __init__(self, state_accessor: _AppClientStateMethodsProtocol, map_name: str, + struct_class: typing.Type[_ValueType] | None = None): + self._state_accessor = state_accessor + self._map_name = map_name + self._struct_class = struct_class + + def get_map(self) -> dict[_KeyType, _ValueType]: + """Get all current values in the map""" + result = self._state_accessor.get_map(self._map_name) + if self._struct_class and result: + return {k: _init_dataclass(self._struct_class, v) if isinstance(v, dict) else v + for k, v in result.items()} # type: ignore + return typing.cast(dict[_KeyType, _ValueType], result or {}) + + def get_value(self, key: _KeyType) -> _ValueType | None: + """Get a value from the map by key""" + key_value = dataclasses.asdict(key) if dataclasses.is_dataclass(key) else key # type: ignore + value = self._state_accessor.get_map_value(self._map_name, key_value) + if value is not None and self._struct_class and isinstance(value, dict): + return _init_dataclass(self._struct_class, value) # type: ignore + return typing.cast(_ValueType | None, value) + + +class MockRbacModuleClient: + """Client for interacting with MockRbacModule smart contract""" + + @typing.overload + def __init__(self, app_client: algokit_utils.AppClient) -> None: ... + + @typing.overload + def __init__( + self, + *, + algorand: _AlgoKitAlgorandClient, + app_id: int, + app_name: str | None = None, + default_sender: str | None = None, + default_signer: TransactionSigner | None = None, + approval_source_map: SourceMap | None = None, + clear_source_map: SourceMap | None = None, + ) -> None: ... + + def __init__( + self, + app_client: algokit_utils.AppClient | None = None, + *, + algorand: _AlgoKitAlgorandClient | None = None, + app_id: int | None = None, + app_name: str | None = None, + default_sender: str | None = None, + default_signer: TransactionSigner | None = None, + approval_source_map: SourceMap | None = None, + clear_source_map: SourceMap | None = None, + ) -> None: + if app_client: + self.app_client = app_client + elif algorand and app_id: + self.app_client = algokit_utils.AppClient( + algokit_utils.AppClientParams( + algorand=algorand, + app_spec=APP_SPEC, + app_id=app_id, + app_name=app_name, + default_sender=default_sender, + default_signer=default_signer, + approval_source_map=approval_source_map, + clear_source_map=clear_source_map, + ) + ) + else: + raise ValueError("Either app_client or algorand and app_id must be provided") + + self.params = MockRbacModuleParams(self.app_client) + self.create_transaction = MockRbacModuleCreateTransactionParams(self.app_client) + self.send = MockRbacModuleSend(self.app_client) + self.state = MockRbacModuleState(self.app_client) + + @staticmethod + def from_creator_and_name( + creator_address: str, + app_name: str, + algorand: _AlgoKitAlgorandClient, + default_sender: str | None = None, + default_signer: TransactionSigner | None = None, + approval_source_map: SourceMap | None = None, + clear_source_map: SourceMap | None = None, + ignore_cache: bool | None = None, + app_lookup_cache: algokit_utils.ApplicationLookup | None = None, + ) -> "MockRbacModuleClient": + return MockRbacModuleClient( + algokit_utils.AppClient.from_creator_and_name( + creator_address=creator_address, + app_name=app_name, + app_spec=APP_SPEC, + algorand=algorand, + default_sender=default_sender, + default_signer=default_signer, + approval_source_map=approval_source_map, + clear_source_map=clear_source_map, + ignore_cache=ignore_cache, + app_lookup_cache=app_lookup_cache, + ) + ) + + @staticmethod + def from_network( + algorand: _AlgoKitAlgorandClient, + app_name: str | None = None, + default_sender: str | None = None, + default_signer: TransactionSigner | None = None, + approval_source_map: SourceMap | None = None, + clear_source_map: SourceMap | None = None, + ) -> "MockRbacModuleClient": + return MockRbacModuleClient( + algokit_utils.AppClient.from_network( + app_spec=APP_SPEC, + algorand=algorand, + app_name=app_name, + default_sender=default_sender, + default_signer=default_signer, + approval_source_map=approval_source_map, + clear_source_map=clear_source_map, + ) + ) + + @property + def app_id(self) -> int: + return self.app_client.app_id + + @property + def app_address(self) -> str: + return self.app_client.app_address + + @property + def app_name(self) -> str: + return self.app_client.app_name + + @property + def app_spec(self) -> algokit_utils.Arc56Contract: + return self.app_client.app_spec + + @property + def algorand(self) -> _AlgoKitAlgorandClient: + return self.app_client.algorand + + def clone( + self, + app_name: str | None = None, + default_sender: str | None = None, + default_signer: TransactionSigner | None = None, + approval_source_map: SourceMap | None = None, + clear_source_map: SourceMap | None = None, + ) -> "MockRbacModuleClient": + return MockRbacModuleClient( + self.app_client.clone( + app_name=app_name, + default_sender=default_sender, + default_signer=default_signer, + approval_source_map=approval_source_map, + clear_source_map=clear_source_map, + ) + ) + + def new_group(self) -> "MockRbacModuleComposer": + return MockRbacModuleComposer(self) + + @typing.overload + def decode_return_value( + self, + method: typing.Literal["rbac_rotate_arranger(address)uint64"], + return_value: algokit_utils.ABIReturn | None + ) -> int | None: ... + @typing.overload + def decode_return_value( + self, + method: typing.Literal["rbac_set_op_daemon(address)uint64"], + return_value: algokit_utils.ABIReturn | None + ) -> int | None: ... + @typing.overload + def decode_return_value( + self, + method: typing.Literal["rbac_assign_role(uint8,address,(uint64,uint64))uint64"], + return_value: algokit_utils.ABIReturn | None + ) -> int | None: ... + @typing.overload + def decode_return_value( + self, + method: typing.Literal["rbac_revoke_role(uint8,address)uint64"], + return_value: algokit_utils.ABIReturn | None + ) -> int | None: ... + @typing.overload + def decode_return_value( + self, + method: typing.Literal["rbac_gov_asset_suspension(bool)uint64"], + return_value: algokit_utils.ABIReturn | None + ) -> int | None: ... + @typing.overload + def decode_return_value( + self, + method: typing.Literal["rbac_get_arranger()address"], + return_value: algokit_utils.ABIReturn | None + ) -> str | None: ... + @typing.overload + def decode_return_value( + self, + method: typing.Literal["rbac_get_address_roles(address)(bool,bool,bool,bool,bool)"], + return_value: algokit_utils.ABIReturn | None + ) -> tuple[bool, bool, bool, bool, bool] | None: ... + @typing.overload + def decode_return_value( + self, + method: typing.Literal["rbac_get_role_validity(uint8,address)(uint64,uint64)"], + return_value: algokit_utils.ABIReturn | None + ) -> RoleValidity | None: ... + @typing.overload + def decode_return_value( + self, + method: typing.Literal["contract_update()void"], + return_value: algokit_utils.ABIReturn | None + ) -> None: ... + @typing.overload + def decode_return_value( + self, + method: str, + return_value: algokit_utils.ABIReturn | None + ) -> algokit_utils.ABIValue | algokit_utils.ABIStruct | None: ... + + def decode_return_value( + self, + method: str, + return_value: algokit_utils.ABIReturn | None + ) -> algokit_utils.ABIValue | algokit_utils.ABIStruct | None | RoleValidity | int | str | tuple[bool, bool, bool, bool, bool]: + """Decode ABI return value for the given method.""" + if return_value is None: + return None + + arc56_method = self.app_spec.get_arc56_method(method) + decoded = return_value.get_arc56_value(arc56_method, self.app_spec.structs) + + # If method returns a struct, convert the dict to appropriate dataclass + if (arc56_method and + arc56_method.returns and + arc56_method.returns.struct and + isinstance(decoded, dict)): + struct_class = globals().get(arc56_method.returns.struct) + if struct_class: + return struct_class(**typing.cast(dict, decoded)) + return decoded + + +@dataclasses.dataclass(frozen=True) +class MockRbacModuleBareCallCreateParams(algokit_utils.AppClientBareCallCreateParams): + """Parameters for creating MockRbacModule contract with bare calls""" + on_complete: typing.Literal[OnComplete.NoOpOC] | None = None + + def to_algokit_utils_params(self) -> algokit_utils.AppClientBareCallCreateParams: + return algokit_utils.AppClientBareCallCreateParams(**self.__dict__) + +@dataclasses.dataclass(frozen=True) +class MockRbacModuleMethodCallUpdateParams( + algokit_utils.BaseAppClientMethodCallParams[ + typing.Any, + str | None, + ] +): + """Parameters for calling MockRbacModule contract using ABI""" + on_complete: typing.Literal[OnComplete.UpdateApplicationOC] | None = None + method: str | None = None + + def to_algokit_utils_params(self) -> algokit_utils.AppClientMethodCallParams: + method_args = _parse_abi_args(self.args) + return algokit_utils.AppClientMethodCallParams( + **{ + **self.__dict__, + "method": self.method or getattr(self.args, "abi_method_signature", None), + "args": method_args, + } + ) + +class MockRbacModuleFactory(algokit_utils.TypedAppFactoryProtocol[MockRbacModuleBareCallCreateParams, MockRbacModuleMethodCallUpdateParams, None]): + """Factory for deploying and managing MockRbacModuleClient smart contracts""" + + def __init__( + self, + algorand: _AlgoKitAlgorandClient, + *, + app_name: str | None = None, + default_sender: str | None = None, + default_signer: TransactionSigner | None = None, + version: str | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None, + ): + self.app_factory = algokit_utils.AppFactory( + params=algokit_utils.AppFactoryParams( + algorand=algorand, + app_spec=APP_SPEC, + app_name=app_name, + default_sender=default_sender, + default_signer=default_signer, + version=version, + compilation_params=compilation_params, + ) + ) + self.params = MockRbacModuleFactoryParams(self.app_factory) + self.create_transaction = MockRbacModuleFactoryCreateTransaction(self.app_factory) + self.send = MockRbacModuleFactorySend(self.app_factory) + + @property + def app_name(self) -> str: + return self.app_factory.app_name + + @property + def app_spec(self) -> algokit_utils.Arc56Contract: + return self.app_factory.app_spec + + @property + def algorand(self) -> _AlgoKitAlgorandClient: + return self.app_factory.algorand + + def deploy( + self, + *, + on_update: algokit_utils.OnUpdate | None = None, + on_schema_break: algokit_utils.OnSchemaBreak | None = None, + create_params: MockRbacModuleBareCallCreateParams | None = None, + update_params: MockRbacModuleMethodCallUpdateParams | None = None, + delete_params: None = None, + existing_deployments: algokit_utils.ApplicationLookup | None = None, + ignore_cache: bool = False, + app_name: str | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None, + send_params: algokit_utils.SendParams | None = None, + ) -> tuple[MockRbacModuleClient, algokit_utils.AppFactoryDeployResult]: + """Deploy the application""" + deploy_response = self.app_factory.deploy( + on_update=on_update, + on_schema_break=on_schema_break, + create_params=create_params.to_algokit_utils_params() if create_params else None, + update_params=update_params.to_algokit_utils_params() if update_params else None, + delete_params=delete_params, + existing_deployments=existing_deployments, + ignore_cache=ignore_cache, + app_name=app_name, + compilation_params=compilation_params, + send_params=send_params, + ) + + return MockRbacModuleClient(deploy_response[0]), deploy_response[1] + + def get_app_client_by_creator_and_name( + self, + creator_address: str, + app_name: str, + default_sender: str | None = None, + default_signer: TransactionSigner | None = None, + ignore_cache: bool | None = None, + app_lookup_cache: algokit_utils.ApplicationLookup | None = None, + approval_source_map: SourceMap | None = None, + clear_source_map: SourceMap | None = None, + ) -> MockRbacModuleClient: + """Get an app client by creator address and name""" + return MockRbacModuleClient( + self.app_factory.get_app_client_by_creator_and_name( + creator_address, + app_name, + default_sender, + default_signer, + ignore_cache, + app_lookup_cache, + approval_source_map, + clear_source_map, + ) + ) + + def get_app_client_by_id( + self, + app_id: int, + app_name: str | None = None, + default_sender: str | None = None, + default_signer: TransactionSigner | None = None, + approval_source_map: SourceMap | None = None, + clear_source_map: SourceMap | None = None, + ) -> MockRbacModuleClient: + """Get an app client by app ID""" + return MockRbacModuleClient( + self.app_factory.get_app_client_by_id( + app_id, + app_name, + default_sender, + default_signer, + approval_source_map, + clear_source_map, + ) + ) + + +class MockRbacModuleFactoryParams: + """Parameters for creating transactions for MockRbacModule contract""" + + def __init__(self, app_factory: algokit_utils.AppFactory): + self.app_factory = app_factory + self.create = MockRbacModuleFactoryCreateParams(app_factory) + self.update = MockRbacModuleFactoryUpdateParams(app_factory) + self.delete = MockRbacModuleFactoryDeleteParams(app_factory) + +class MockRbacModuleFactoryCreateParams: + """Parameters for 'create' operations of MockRbacModule contract""" + + def __init__(self, app_factory: algokit_utils.AppFactory): + self.app_factory = app_factory + + def bare( + self, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.AppCreateParams: + """Creates an instance using a bare call""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.bare.create( + algokit_utils.AppFactoryCreateParams(**dataclasses.asdict(params)), + compilation_params=compilation_params) + + def rbac_rotate_arranger( + self, + args: tuple[str] | RbacRotateArrangerArgs, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.AppCreateMethodCallParams: + """Creates a new instance using the rbac_rotate_arranger(address)uint64 ABI method""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.create( + algokit_utils.AppFactoryCreateMethodCallParams( + **{ + **dataclasses.asdict(params), + "method": "rbac_rotate_arranger(address)uint64", + "args": _parse_abi_args(args), + } + ), + compilation_params=compilation_params + ) + + def rbac_set_op_daemon( + self, + args: tuple[str] | RbacSetOpDaemonArgs, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.AppCreateMethodCallParams: + """Creates a new instance using the rbac_set_op_daemon(address)uint64 ABI method""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.create( + algokit_utils.AppFactoryCreateMethodCallParams( + **{ + **dataclasses.asdict(params), + "method": "rbac_set_op_daemon(address)uint64", + "args": _parse_abi_args(args), + } + ), + compilation_params=compilation_params + ) + + def rbac_assign_role( + self, + args: tuple[int, str, RoleValidity] | RbacAssignRoleArgs, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.AppCreateMethodCallParams: + """Creates a new instance using the rbac_assign_role(uint8,address,(uint64,uint64))uint64 ABI method""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.create( + algokit_utils.AppFactoryCreateMethodCallParams( + **{ + **dataclasses.asdict(params), + "method": "rbac_assign_role(uint8,address,(uint64,uint64))uint64", + "args": _parse_abi_args(args), + } + ), + compilation_params=compilation_params + ) + + def rbac_revoke_role( + self, + args: tuple[int, str] | RbacRevokeRoleArgs, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.AppCreateMethodCallParams: + """Creates a new instance using the rbac_revoke_role(uint8,address)uint64 ABI method""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.create( + algokit_utils.AppFactoryCreateMethodCallParams( + **{ + **dataclasses.asdict(params), + "method": "rbac_revoke_role(uint8,address)uint64", + "args": _parse_abi_args(args), + } + ), + compilation_params=compilation_params + ) + + def rbac_gov_asset_suspension( + self, + args: tuple[bool] | RbacGovAssetSuspensionArgs, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.AppCreateMethodCallParams: + """Creates a new instance using the rbac_gov_asset_suspension(bool)uint64 ABI method""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.create( + algokit_utils.AppFactoryCreateMethodCallParams( + **{ + **dataclasses.asdict(params), + "method": "rbac_gov_asset_suspension(bool)uint64", + "args": _parse_abi_args(args), + } + ), + compilation_params=compilation_params + ) + + def rbac_get_arranger( + self, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.AppCreateMethodCallParams: + """Creates a new instance using the rbac_get_arranger()address ABI method""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.create( + algokit_utils.AppFactoryCreateMethodCallParams( + **{ + **dataclasses.asdict(params), + "method": "rbac_get_arranger()address", + "args": None, + } + ), + compilation_params=compilation_params + ) + + def rbac_get_address_roles( + self, + args: tuple[str] | RbacGetAddressRolesArgs, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.AppCreateMethodCallParams: + """Creates a new instance using the rbac_get_address_roles(address)(bool,bool,bool,bool,bool) ABI method""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.create( + algokit_utils.AppFactoryCreateMethodCallParams( + **{ + **dataclasses.asdict(params), + "method": "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", + "args": _parse_abi_args(args), + } + ), + compilation_params=compilation_params + ) + + def rbac_get_role_validity( + self, + args: tuple[int, str] | RbacGetRoleValidityArgs, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.AppCreateMethodCallParams: + """Creates a new instance using the rbac_get_role_validity(uint8,address)(uint64,uint64) ABI method""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.create( + algokit_utils.AppFactoryCreateMethodCallParams( + **{ + **dataclasses.asdict(params), + "method": "rbac_get_role_validity(uint8,address)(uint64,uint64)", + "args": _parse_abi_args(args), + } + ), + compilation_params=compilation_params + ) + + def contract_update( + self, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.AppCreateMethodCallParams: + """Creates a new instance using the contract_update()void ABI method""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.create( + algokit_utils.AppFactoryCreateMethodCallParams( + **{ + **dataclasses.asdict(params), + "method": "contract_update()void", + "args": None, + } + ), + compilation_params=compilation_params + ) + +class MockRbacModuleFactoryUpdateParams: + """Parameters for 'update' operations of MockRbacModule contract""" + + def __init__(self, app_factory: algokit_utils.AppFactory): + self.app_factory = app_factory + + def bare( + self, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + + ) -> algokit_utils.AppUpdateParams: + """Updates an instance using a bare call""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.bare.deploy_update( + algokit_utils.AppClientBareCallParams(**dataclasses.asdict(params)), + ) + +class MockRbacModuleFactoryDeleteParams: + """Parameters for 'delete' operations of MockRbacModule contract""" + + def __init__(self, app_factory: algokit_utils.AppFactory): + self.app_factory = app_factory + + def bare( + self, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + + ) -> algokit_utils.AppDeleteParams: + """Deletes an instance using a bare call""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.bare.deploy_delete( + algokit_utils.AppClientBareCallParams(**dataclasses.asdict(params)), + ) + + +class MockRbacModuleFactoryCreateTransaction: + """Create transactions for MockRbacModule contract""" + + def __init__(self, app_factory: algokit_utils.AppFactory): + self.app_factory = app_factory + self.create = MockRbacModuleFactoryCreateTransactionCreate(app_factory) + + +class MockRbacModuleFactoryCreateTransactionCreate: + """Create new instances of MockRbacModule contract""" + + def __init__(self, app_factory: algokit_utils.AppFactory): + self.app_factory = app_factory + + def bare( + self, + params: algokit_utils.CommonAppCallCreateParams | None = None, + ) -> Transaction: + """Creates a new instance using a bare call""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.create_transaction.bare.create( + algokit_utils.AppFactoryCreateParams(**dataclasses.asdict(params)), + ) + + +class MockRbacModuleFactorySend: + """Send calls to MockRbacModule contract""" + + def __init__(self, app_factory: algokit_utils.AppFactory): + self.app_factory = app_factory + self.create = MockRbacModuleFactorySendCreate(app_factory) + + +class MockRbacModuleFactorySendCreate: + """Send create calls to MockRbacModule contract""" + + def __init__(self, app_factory: algokit_utils.AppFactory): + self.app_factory = app_factory + + def bare( + self, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + send_params: algokit_utils.SendParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None, + ) -> tuple[MockRbacModuleClient, algokit_utils.SendAppCreateTransactionResult]: + """Creates a new instance using a bare call""" + params = params or algokit_utils.CommonAppCallCreateParams() + result = self.app_factory.send.bare.create( + algokit_utils.AppFactoryCreateParams(**dataclasses.asdict(params)), + send_params=send_params, + compilation_params=compilation_params + ) + return MockRbacModuleClient(result[0]), result[1] + + +class _MockRbacModuleUpdateComposer: + def __init__(self, composer: "MockRbacModuleComposer"): + self.composer = composer + def contract_update( + self, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> "MockRbacModuleComposer": + self.composer._composer.add_app_update_method_call( + self.composer.client.params.update.contract_update( + + params=params, + compilation_params=compilation_params + ) + ) + self.composer._result_mappers.append( + lambda v: self.composer.client.decode_return_value( + "contract_update()void", v + ) + ) + return self.composer + + +class MockRbacModuleComposer: + """Composer for creating transaction groups for MockRbacModule contract calls""" + + def __init__(self, client: "MockRbacModuleClient"): + self.client = client + self._composer = client.algorand.new_group() + self._result_mappers: list[typing.Callable[[algokit_utils.ABIReturn | None], object] | None] = [] + + @property + def update(self) -> "_MockRbacModuleUpdateComposer": + return _MockRbacModuleUpdateComposer(self) + + def rbac_rotate_arranger( + self, + args: tuple[str] | RbacRotateArrangerArgs, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> "MockRbacModuleComposer": + self._composer.add_app_call_method_call( + self.client.params.rbac_rotate_arranger( + args=args, + params=params, + ) + ) + self._result_mappers.append( + lambda v: self.client.decode_return_value( + "rbac_rotate_arranger(address)uint64", v + ) + ) + return self + + def rbac_set_op_daemon( + self, + args: tuple[str] | RbacSetOpDaemonArgs, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> "MockRbacModuleComposer": + self._composer.add_app_call_method_call( + self.client.params.rbac_set_op_daemon( + args=args, + params=params, + ) + ) + self._result_mappers.append( + lambda v: self.client.decode_return_value( + "rbac_set_op_daemon(address)uint64", v + ) + ) + return self + + def rbac_assign_role( + self, + args: tuple[int, str, RoleValidity] | RbacAssignRoleArgs, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> "MockRbacModuleComposer": + self._composer.add_app_call_method_call( + self.client.params.rbac_assign_role( + args=args, + params=params, + ) + ) + self._result_mappers.append( + lambda v: self.client.decode_return_value( + "rbac_assign_role(uint8,address,(uint64,uint64))uint64", v + ) + ) + return self + + def rbac_revoke_role( + self, + args: tuple[int, str] | RbacRevokeRoleArgs, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> "MockRbacModuleComposer": + self._composer.add_app_call_method_call( + self.client.params.rbac_revoke_role( + args=args, + params=params, + ) + ) + self._result_mappers.append( + lambda v: self.client.decode_return_value( + "rbac_revoke_role(uint8,address)uint64", v + ) + ) + return self + + def rbac_gov_asset_suspension( + self, + args: tuple[bool] | RbacGovAssetSuspensionArgs, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> "MockRbacModuleComposer": + self._composer.add_app_call_method_call( + self.client.params.rbac_gov_asset_suspension( + args=args, + params=params, + ) + ) + self._result_mappers.append( + lambda v: self.client.decode_return_value( + "rbac_gov_asset_suspension(bool)uint64", v + ) + ) + return self + + def rbac_get_arranger( + self, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> "MockRbacModuleComposer": + self._composer.add_app_call_method_call( + self.client.params.rbac_get_arranger( + + params=params, + ) + ) + self._result_mappers.append( + lambda v: self.client.decode_return_value( + "rbac_get_arranger()address", v + ) + ) + return self + + def rbac_get_address_roles( + self, + args: tuple[str] | RbacGetAddressRolesArgs, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> "MockRbacModuleComposer": + self._composer.add_app_call_method_call( + self.client.params.rbac_get_address_roles( + args=args, + params=params, + ) + ) + self._result_mappers.append( + lambda v: self.client.decode_return_value( + "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", v + ) + ) + return self + + def rbac_get_role_validity( + self, + args: tuple[int, str] | RbacGetRoleValidityArgs, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> "MockRbacModuleComposer": + self._composer.add_app_call_method_call( + self.client.params.rbac_get_role_validity( + args=args, + params=params, + ) + ) + self._result_mappers.append( + lambda v: self.client.decode_return_value( + "rbac_get_role_validity(uint8,address)(uint64,uint64)", v + ) + ) + return self + + def clear_state( + self, + *, + args: list[bytes] | None = None, + params: algokit_utils.CommonAppCallParams | None = None, + ) -> "MockRbacModuleComposer": + params=params or algokit_utils.CommonAppCallParams() + self._composer.add_app_call( + self.client.params.clear_state( + algokit_utils.AppClientBareCallParams( + **{ + **dataclasses.asdict(params), + "args": args + } + ) + ) + ) + return self + + def add_transaction( + self, txn: Transaction, signer: TransactionSigner | None = None + ) -> "MockRbacModuleComposer": + self._composer.add_transaction(txn, signer) + return self + + def composer(self) -> algokit_utils.TransactionComposer: + return self._composer + + def simulate( + self, + allow_more_logs: bool | None = None, + allow_empty_signatures: bool | None = None, + allow_unnamed_resources: bool | None = None, + extra_opcode_budget: int | None = None, + exec_trace_config: SimulateTraceConfig | None = None, + simulation_round: int | None = None, + skip_signatures: bool | None = None, + ) -> algokit_utils.SendAtomicTransactionComposerResults: + return self._composer.simulate( + allow_more_logs=allow_more_logs, + allow_empty_signatures=allow_empty_signatures, + allow_unnamed_resources=allow_unnamed_resources, + extra_opcode_budget=extra_opcode_budget, + exec_trace_config=exec_trace_config, + simulation_round=simulation_round, + skip_signatures=skip_signatures, + ) + + def send( + self, + send_params: algokit_utils.SendParams | None = None + ) -> algokit_utils.SendAtomicTransactionComposerResults: + return self._composer.send(send_params) From ebc90df41647a96f02098d07623deae5099cd7be Mon Sep 17 00:00:00 2001 From: cusma Date: Thu, 12 Mar 2026 20:01:00 +0100 Subject: [PATCH 118/244] chore: update test utils --- tests/utils.py | 79 ++++++++++++++++++++++++++++++-------------------- 1 file changed, 48 insertions(+), 31 deletions(-) diff --git a/tests/utils.py b/tests/utils.py index 70cb3705..db88f24b 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -1,7 +1,7 @@ import math from base64 import b64decode from dataclasses import asdict, dataclass -from typing import TypeAlias +from typing import Any, TypeAlias from algokit_utils import ( AlgoAmount, @@ -14,18 +14,9 @@ from algosdk.constants import min_txn_fee from algosdk.v2client.algod import AlgodClient -from smart_contracts import constants as sc_cst -from smart_contracts.artifacts.fixed_coupon_bond.fixed_coupon_bond_client import ( - FixedCouponBondClient, -) -from smart_contracts.artifacts.mock_module_accounting.mock_accounting_module_client import ( - AccountGetInfoArgs, -) -from smart_contracts.artifacts.perpetual_bond.perpetual_bond_client import ( - PerpetualBondClient, -) -from smart_contracts.artifacts.zero_coupon_bond.zero_coupon_bond_client import ( - ZeroCouponBondClient, +from smart_contracts import enums +from smart_contracts.artifacts.d_asa.dasa_client import ( + AccountGetPositionArgs, ) COUPON_PER_OP_UP_TXN = 10 # This parameter is empirical and depends on the complexity of `count_due_coupons` subroutine @@ -70,72 +61,68 @@ class Currency: class DAsaAccountManager(SigningAccount): @classmethod def role_id(cls) -> int: - return sc_cst.ROLE_ACCOUNT_MANAGER + return enums.ROLE_ACCOUNT_MANAGER @dataclass(kw_only=True) class DAsaPrimaryDealer(SigningAccount): @classmethod def role_id(cls) -> int: - return sc_cst.ROLE_PRIMARY_DEALER + return enums.ROLE_PRIMARY_DEALER @dataclass(kw_only=True) class DAsaTrustee(SigningAccount): @classmethod def role_id(cls) -> int: - return sc_cst.ROLE_TRUSTEE + return enums.ROLE_TRUSTEE @dataclass(kw_only=True) class DAsaAuthority(SigningAccount): @classmethod def role_id(cls) -> int: - return sc_cst.ROLE_AUTHORITY + return enums.ROLE_AUTHORITY @dataclass(kw_only=True) class DAsaInterestOracle(SigningAccount): @classmethod def role_id(cls) -> int: - return sc_cst.ROLE_INTEREST_ORACLE + return enums.ROLE_OBSERVER @dataclass(kw_only=True) class DAsaAccount(SigningAccount): holding_address: str - d_asa_client: ZeroCouponBondClient | FixedCouponBondClient | PerpetualBondClient + d_asa_client: Any @property def payment_address(self) -> str: - return self.d_asa_client.send.account_get_info( - AccountGetInfoArgs( + return self.d_asa_client.send.account_get_position( + AccountGetPositionArgs( holding_address=self.holding_address, ) ).abi_return.payment_address @property def units(self) -> int: - return self.d_asa_client.send.account_get_info( - AccountGetInfoArgs(holding_address=self.holding_address) + return self.d_asa_client.send.account_get_position( + AccountGetPositionArgs(holding_address=self.holding_address) ).abi_return.units @property def unit_value(self) -> int: - return self.d_asa_client.send.account_get_info( - AccountGetInfoArgs(holding_address=self.holding_address) - ).abi_return.unit_value + return 0 @property def paid_coupons(self) -> int: - return self.d_asa_client.send.account_get_info( - AccountGetInfoArgs(holding_address=self.holding_address) - ).abi_return.paid_coupons + return 0 @property def suspended(self) -> bool: - return self.d_asa_client.send.account_get_info( - AccountGetInfoArgs(holding_address=self.holding_address) + return self.d_asa_client.send.account_get_position( + AccountGetPositionArgs(holding_address=self.holding_address) ).abi_return.suspended @property @@ -327,3 +314,33 @@ def decode_actus_event(event_bytes: bytes) -> dict: "nominal_rate_bps": nominal_rate_bps, "nominal_accrued": nominal_accrued, } + + +def decode_actus_execution_event(event_bytes: bytes) -> dict[str, int]: + import struct + + ( + contract_id, + event_id, + event_type, + scheduled_time, + applied_at, + payoff, + payoff_sign, + settled_amount, + currency_id, + sequence, + ) = struct.unpack(">QQBQQQBQQQ", event_bytes) + + return { + "contract_id": contract_id, + "event_id": event_id, + "event_type": event_type, + "scheduled_time": scheduled_time, + "applied_at": applied_at, + "payoff": payoff, + "payoff_sign": payoff_sign, + "settled_amount": settled_amount, + "currency_id": currency_id, + "sequence": sequence, + } From b725e4bd2a08c7aac3d83e95ac212e7afded7173 Mon Sep 17 00:00:00 2001 From: cusma Date: Thu, 12 Mar 2026 20:01:13 +0100 Subject: [PATCH 119/244] chore: update conftest --- tests/mock_module_rbac/conftest.py | 28 ++++------------------------ 1 file changed, 4 insertions(+), 24 deletions(-) diff --git a/tests/mock_module_rbac/conftest.py b/tests/mock_module_rbac/conftest.py index 75070510..9bc8fce7 100644 --- a/tests/mock_module_rbac/conftest.py +++ b/tests/mock_module_rbac/conftest.py @@ -1,8 +1,5 @@ import pytest -from algokit_utils import ( - AlgorandClient, - SigningAccount, -) +from algokit_utils import AlgorandClient, SigningAccount from smart_contracts.artifacts.mock_module_rbac.mock_rbac_module_client import ( MockRbacModuleClient, @@ -11,25 +8,6 @@ ) from tests import conftest_helpers as helpers from tests import utils -from tests.shared import conftest as shared_fixtures - -contract_case = shared_fixtures.contract_case -shared_asset_metadata = shared_fixtures.shared_asset_metadata -shared_time_events = shared_fixtures.shared_time_events -shared_cfg = shared_fixtures.shared_cfg -shared_client_empty = shared_fixtures.shared_client_empty -shared_account_manager = shared_fixtures.shared_account_manager -shared_authority = shared_fixtures.shared_authority -shared_trustee = shared_fixtures.shared_trustee -shared_interest_oracle = shared_fixtures.shared_interest_oracle -shared_client_active = shared_fixtures.shared_client_active -shared_primary_dealer = shared_fixtures.shared_primary_dealer -shared_account_factory = shared_fixtures.shared_account_factory -shared_client_primary = shared_fixtures.shared_client_primary -shared_account_with_units_factory = shared_fixtures.shared_account_with_units_factory -shared_account_a = shared_fixtures.shared_account_a -shared_account_b = shared_fixtures.shared_account_b -shared_client_ongoing = shared_fixtures.shared_client_ongoing @pytest.fixture(scope="function") @@ -38,7 +16,9 @@ def rbac_client( arranger: SigningAccount, ) -> MockRbacModuleClient: return helpers.create_bare_client_and_fund( - algorand, MockRbacModuleFactory, arranger + algorand, + MockRbacModuleFactory, + arranger, ) From 0637c3006ffe61c3a4d6f4f43d2415f693e359b7 Mon Sep 17 00:00:00 2001 From: cusma Date: Thu, 12 Mar 2026 20:01:20 +0100 Subject: [PATCH 120/244] chore: update conftest --- tests/conftest.py | 23 +---------------------- 1 file changed, 1 insertion(+), 22 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index 843930db..96478095 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -9,32 +9,16 @@ ) from algokit_utils.config import config -from smart_contracts import constants as sc_cst -from smart_contracts import enums from tests import utils INITIAL_ALGO_FUNDS: Final[AlgoAmount] = AlgoAmount.from_algo(10_000) DENOMINATION_ASA_NAME: Final[str] = "Euro" -DENOMINATION_ASA_UNIT: Final[str] = "EUR" +DENOMINATION_ASA_UNIT: Final[str] = "€" DENOMINATION_ASA_DECIMALS: Final[int] = 2 DENOMINATION_ASA_SCALE: Final[int] = 10**DENOMINATION_ASA_DECIMALS DENOMINATION_ASA_TOTAL: Final[int] = 10_000_000 * DENOMINATION_ASA_SCALE # 10M Euro -PRINCIPAL: Final[int] = 1_000_000 * DENOMINATION_ASA_SCALE # 1M Euro -MINIMUM_DENOMINATION: Final[int] = 1_000 * DENOMINATION_ASA_SCALE # 1k Euro -DAY_COUNT_CONVENTION: Final[list[int]] = [255, enums.DCC_AA] - -PRIMARY_DISTRIBUTION_DELAY: Final[int] = 1 * sc_cst.DAY_2_SEC -PRIMARY_DISTRIBUTION_DURATION: Final[int] = 15 * sc_cst.DAY_2_SEC -ISSUANCE_DELAY: Final[int] = 1 * sc_cst.DAY_2_SEC -MATURITY_DELAY: Final[int] = 1 * sc_cst.DAY_2_SEC - -APR: Final[int] = 300 # BPS equal to 3% - -TOTAL_UNITS: Final[int] = PRINCIPAL // MINIMUM_DENOMINATION -INITIAL_D_ASA_UNITS: Final[int] = 100 - @pytest.fixture(scope="session") def algorand() -> AlgorandClient: @@ -99,8 +83,3 @@ def currency(algorand: AlgorandClient, bank: SigningAccount) -> utils.Currency: unit_name=DENOMINATION_ASA_UNIT, asa_to_unit=1 / 10**DENOMINATION_ASA_DECIMALS, ) - - -@pytest.fixture(scope="function", params=DAY_COUNT_CONVENTION) -def day_count_convention(request) -> int: - return request.param From 5da54b64a735829c902a7d610413f8d1464a32b4 Mon Sep 17 00:00:00 2001 From: cusma Date: Thu, 12 Mar 2026 20:01:39 +0100 Subject: [PATCH 121/244] chore: update conftes helpers --- tests/conftest_helpers.py | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/tests/conftest_helpers.py b/tests/conftest_helpers.py index 2debfbab..9ca276c2 100644 --- a/tests/conftest_helpers.py +++ b/tests/conftest_helpers.py @@ -1,3 +1,5 @@ +import dataclasses +import importlib from collections.abc import Callable from typing import Any, TypeVar @@ -108,13 +110,32 @@ def create_role_account( if role_config is None: role_config = utils.set_role_config() - client.send.rbac_assign_role( - rbac_assign_role_args_class( + field_names = { + field.name for field in dataclasses.fields(rbac_assign_role_args_class) + } + if "config" in field_names: + assign_role_args = rbac_assign_role_args_class( role_id=role_account.role_id(), role_address=role_account.address, config=role_config, ) - ) + elif "validity" in field_names: + role_module = importlib.import_module(rbac_assign_role_args_class.__module__) + role_validity_class = role_module.RoleValidity + assign_role_args = rbac_assign_role_args_class( + role_id=role_account.role_id(), + role_address=role_account.address, + validity=role_validity_class( + role_validity_start=0, + role_validity_end=2**64 - 1, + ), + ) + else: + raise TypeError( + f"Unsupported RBAC assign args shape: {rbac_assign_role_args_class.__name__}" + ) + + client.send.rbac_assign_role(assign_role_args) return role_account From ab5376415452c4d2ec5a74bf4bd4d0c38844186c Mon Sep 17 00:00:00 2001 From: cusma Date: Thu, 12 Mar 2026 20:01:49 +0100 Subject: [PATCH 122/244] chore: add deploy config --- smart_contracts/d_asa/deploy_config.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 smart_contracts/d_asa/deploy_config.py diff --git a/smart_contracts/d_asa/deploy_config.py b/smart_contracts/d_asa/deploy_config.py new file mode 100644 index 00000000..6f72c50e --- /dev/null +++ b/smart_contracts/d_asa/deploy_config.py @@ -0,0 +1,22 @@ +import logging + +import algokit_utils + +logger = logging.getLogger(__name__) + + +# define deployment behaviour based on supplied app spec +def deploy() -> None: + from smart_contracts.artifacts.d_asa.dasa_client import DasaFactory + + algorand = algokit_utils.AlgorandClient.from_environment() + deployer_ = algorand.account.from_environment("DEPLOYER") + + factory = algorand.client.get_typed_app_factory( + DasaFactory, default_sender=deployer_.address + ) + + factory.deploy( + on_update=algokit_utils.OnUpdate.AppendApp, + on_schema_break=algokit_utils.OnSchemaBreak.AppendApp, + ) From df4cd9f52b0638642b6a1451046a37c195a60117 Mon Sep 17 00:00:00 2001 From: cusma Date: Thu, 12 Mar 2026 20:02:02 +0100 Subject: [PATCH 123/244] test: rbac module --- .../mock_module_rbac/test_mock_rbac_module.py | 360 ++++++++++++++++++ 1 file changed, 360 insertions(+) create mode 100644 tests/mock_module_rbac/test_mock_rbac_module.py diff --git a/tests/mock_module_rbac/test_mock_rbac_module.py b/tests/mock_module_rbac/test_mock_rbac_module.py new file mode 100644 index 00000000..427b3a8a --- /dev/null +++ b/tests/mock_module_rbac/test_mock_rbac_module.py @@ -0,0 +1,360 @@ +import pytest +from algokit_utils import ( + AlgorandClient, + CommonAppCallParams, + LogicError, + SigningAccount, +) + +from smart_contracts import enums +from smart_contracts import errors as err +from smart_contracts.artifacts.mock_module_rbac.mock_rbac_module_client import ( + MockRbacModuleClient, + MockRbacModuleSend, + RbacAssignRoleArgs, + RbacGetAddressRolesArgs, + RbacGetRoleValidityArgs, + RbacGovAssetSuspensionArgs, + RbacRevokeRoleArgs, + RbacRotateArrangerArgs, + RbacSetOpDaemonArgs, + RoleValidity, +) +from tests import utils +from tests.utils import ( + DAsaAccountManager, + DAsaAuthority, + DAsaInterestOracle, + DAsaPrimaryDealer, + DAsaTrustee, +) + + +def assert_role_mask( + roles: tuple[bool, bool, bool, bool, bool] | list[bool], + *, + account_manager: bool = False, + primary_dealer: bool = False, + trustee: bool = False, + authority: bool = False, + observer: bool = False, +) -> None: + assert tuple(roles) == ( + account_manager, + primary_dealer, + trustee, + authority, + observer, + ) + + +def test_mock_rbac_send_surface_matches_current_abi() -> None: + assert {name for name in dir(MockRbacModuleSend) if not name.startswith("_")} == { + "clear_state", + "rbac_assign_role", + "rbac_get_address_roles", + "rbac_get_arranger", + "rbac_get_role_validity", + "rbac_gov_asset_suspension", + "rbac_revoke_role", + "rbac_rotate_arranger", + "rbac_set_op_daemon", + "update", + } + + +def test_contract_update_is_arranger_only( + no_role_account: SigningAccount, + rbac_client: MockRbacModuleClient, +) -> None: + result = rbac_client.send.update.contract_update() + assert result.confirmation + + with pytest.raises(LogicError, match=err.UNAUTHORIZED): + rbac_client.send.update.contract_update( + params=CommonAppCallParams(sender=no_role_account.address) + ) + + +def test_rbac_get_arranger_reflects_global_state( + arranger: SigningAccount, + rbac_client: MockRbacModuleClient, +) -> None: + assert rbac_client.send.rbac_get_arranger().abi_return == arranger.address + assert rbac_client.state.global_state.arranger == arranger.address + + +def test_rbac_set_op_daemon_is_arranger_only( + no_role_account: SigningAccount, + rbac_client: MockRbacModuleClient, +) -> None: + result = rbac_client.send.rbac_set_op_daemon( + RbacSetOpDaemonArgs(address=no_role_account.address) + ) + assert result.abi_return > 0 + assert rbac_client.state.global_state.op_daemon == no_role_account.address + + with pytest.raises(LogicError, match=err.UNAUTHORIZED): + rbac_client.send.rbac_set_op_daemon( + RbacSetOpDaemonArgs(address=rbac_client.app_address), + params=CommonAppCallParams(sender=no_role_account.address), + ) + + +def test_rbac_rotate_arranger_transfers_control( + no_role_account: SigningAccount, + rbac_client: MockRbacModuleClient, +) -> None: + rbac_client.send.rbac_rotate_arranger( + RbacRotateArrangerArgs(new_arranger=no_role_account.address) + ) + assert rbac_client.send.rbac_get_arranger().abi_return == no_role_account.address + + with pytest.raises(LogicError, match=err.UNAUTHORIZED): + rbac_client.send.rbac_set_op_daemon( + RbacSetOpDaemonArgs(address=rbac_client.app_address) + ) + + rbac_client.send.rbac_set_op_daemon( + RbacSetOpDaemonArgs(address=rbac_client.app_address), + params=CommonAppCallParams(sender=no_role_account.address), + ) + assert rbac_client.state.global_state.op_daemon == rbac_client.app_address + + +def test_rbac_assign_role_updates_role_validity_and_masks( + algorand: AlgorandClient, + no_role_account: SigningAccount, + rbac_client: MockRbacModuleClient, +) -> None: + current_timestamp = utils.get_latest_timestamp(algorand.client.algod) + validity = RoleValidity( + role_validity_start=current_timestamp - 1, + role_validity_end=current_timestamp + 1_000, + ) + + result = rbac_client.send.rbac_assign_role( + RbacAssignRoleArgs( + role_id=enums.ROLE_AUTHORITY, + role_address=no_role_account.address, + validity=validity, + ) + ) + assert result.abi_return > 0 + + roles = rbac_client.send.rbac_get_address_roles( + RbacGetAddressRolesArgs(address=no_role_account.address) + ).abi_return + assert_role_mask(roles, authority=True) + + stored_validity = rbac_client.send.rbac_get_role_validity( + RbacGetRoleValidityArgs( + role_id=enums.ROLE_AUTHORITY, + role_address=no_role_account.address, + ) + ).abi_return + assert stored_validity == validity + assert ( + rbac_client.state.box.authority.get_value(no_role_account.address) == validity + ) + + +def test_rbac_assign_role_rejects_invalid_calls( + authority: DAsaAuthority, + no_role_account: SigningAccount, + rbac_client: MockRbacModuleClient, +) -> None: + with pytest.raises(LogicError, match=err.UNAUTHORIZED): + rbac_client.send.rbac_assign_role( + RbacAssignRoleArgs( + role_id=enums.ROLE_AUTHORITY, + role_address=no_role_account.address, + validity=RoleValidity(0, 2**64 - 1), + ), + params=CommonAppCallParams(sender=no_role_account.address), + ) + + with pytest.raises(LogicError, match=err.INVALID_ROLE): + rbac_client.send.rbac_assign_role( + RbacAssignRoleArgs( + role_id=0, + role_address=no_role_account.address, + validity=RoleValidity(0, 2**64 - 1), + ) + ) + + with pytest.raises(LogicError, match=err.INVALID_ROLE_ADDRESS): + rbac_client.send.rbac_assign_role( + RbacAssignRoleArgs( + role_id=enums.ROLE_AUTHORITY, + role_address=authority.address, + validity=RoleValidity(0, 2**64 - 1), + ) + ) + + +def test_rbac_revoke_role_removes_assignment( + no_role_account: SigningAccount, + rbac_client: MockRbacModuleClient, +) -> None: + rbac_client.send.rbac_assign_role( + RbacAssignRoleArgs( + role_id=enums.ROLE_AUTHORITY, + role_address=no_role_account.address, + validity=RoleValidity(0, 2**64 - 1), + ) + ) + + result = rbac_client.send.rbac_revoke_role( + RbacRevokeRoleArgs( + role_id=enums.ROLE_AUTHORITY, + role_address=no_role_account.address, + ) + ) + assert result.abi_return > 0 + + roles = rbac_client.send.rbac_get_address_roles( + RbacGetAddressRolesArgs(address=no_role_account.address) + ).abi_return + assert_role_mask(roles) + with pytest.raises(LogicError, match=err.INVALID_ROLE_ADDRESS): + rbac_client.send.rbac_get_role_validity( + RbacGetRoleValidityArgs( + role_id=enums.ROLE_AUTHORITY, + role_address=no_role_account.address, + ) + ) + + +def test_rbac_revoke_role_rejects_invalid_calls( + authority: DAsaAuthority, + no_role_account: SigningAccount, + rbac_client: MockRbacModuleClient, +) -> None: + with pytest.raises(LogicError, match=err.UNAUTHORIZED): + rbac_client.send.rbac_revoke_role( + RbacRevokeRoleArgs( + role_id=enums.ROLE_AUTHORITY, + role_address=authority.address, + ), + params=CommonAppCallParams(sender=no_role_account.address), + ) + + with pytest.raises(LogicError, match=err.INVALID_ROLE): + rbac_client.send.rbac_revoke_role( + RbacRevokeRoleArgs( + role_id=0, + role_address=authority.address, + ) + ) + + with pytest.raises(LogicError, match=err.INVALID_ROLE_ADDRESS): + rbac_client.send.rbac_revoke_role( + RbacRevokeRoleArgs( + role_id=enums.ROLE_AUTHORITY, + role_address=no_role_account.address, + ) + ) + + +def test_rbac_gov_asset_suspension_is_authority_only( + authority: DAsaAuthority, + no_role_account: SigningAccount, + rbac_client: MockRbacModuleClient, +) -> None: + assert not rbac_client.state.global_state.asset_suspended + + result = rbac_client.send.rbac_gov_asset_suspension( + RbacGovAssetSuspensionArgs(suspended=True), + params=CommonAppCallParams(sender=authority.address), + ) + assert result.abi_return > 0 + assert rbac_client.state.global_state.asset_suspended + + rbac_client.send.rbac_gov_asset_suspension( + RbacGovAssetSuspensionArgs(suspended=False), + params=CommonAppCallParams(sender=authority.address), + ) + assert not rbac_client.state.global_state.asset_suspended + + with pytest.raises(LogicError, match=err.UNAUTHORIZED): + rbac_client.send.rbac_gov_asset_suspension( + RbacGovAssetSuspensionArgs(suspended=True), + params=CommonAppCallParams(sender=no_role_account.address), + ) + + +def test_rbac_get_address_roles_covers_every_role_fixture( + rbac_client: MockRbacModuleClient, + account_manager: DAsaAccountManager, + primary_dealer: DAsaPrimaryDealer, + trustee: DAsaTrustee, + authority: DAsaAuthority, + interest_oracle: DAsaInterestOracle, + no_role_account: SigningAccount, +) -> None: + assert_role_mask( + rbac_client.send.rbac_get_address_roles( + RbacGetAddressRolesArgs(address=account_manager.address) + ).abi_return, + account_manager=True, + ) + assert_role_mask( + rbac_client.send.rbac_get_address_roles( + RbacGetAddressRolesArgs(address=primary_dealer.address) + ).abi_return, + primary_dealer=True, + ) + assert_role_mask( + rbac_client.send.rbac_get_address_roles( + RbacGetAddressRolesArgs(address=trustee.address) + ).abi_return, + trustee=True, + ) + assert_role_mask( + rbac_client.send.rbac_get_address_roles( + RbacGetAddressRolesArgs(address=authority.address) + ).abi_return, + authority=True, + ) + assert_role_mask( + rbac_client.send.rbac_get_address_roles( + RbacGetAddressRolesArgs(address=interest_oracle.address) + ).abi_return, + observer=True, + ) + assert_role_mask( + rbac_client.send.rbac_get_address_roles( + RbacGetAddressRolesArgs(address=no_role_account.address) + ).abi_return + ) + + +def test_rbac_get_role_validity_reports_arranger_and_rejects_invalid_inputs( + arranger: SigningAccount, + no_role_account: SigningAccount, + rbac_client: MockRbacModuleClient, +) -> None: + arranger_validity = rbac_client.send.rbac_get_role_validity( + RbacGetRoleValidityArgs( + role_id=enums.ROLE_ARRANGER, + role_address=arranger.address, + ) + ).abi_return + assert arranger_validity == RoleValidity(0, 0) + + with pytest.raises(LogicError, match=err.INVALID_ROLE): + rbac_client.send.rbac_get_role_validity( + RbacGetRoleValidityArgs( + role_id=0, + role_address=no_role_account.address, + ) + ) + + with pytest.raises(LogicError, match=err.INVALID_ROLE_ADDRESS): + rbac_client.send.rbac_get_role_validity( + RbacGetRoleValidityArgs( + role_id=enums.ROLE_AUTHORITY, + role_address=no_role_account.address, + ) + ) From 40ad9bf35f3ae5c7a5c82057d568e85db5a1475d Mon Sep 17 00:00:00 2001 From: cusma Date: Thu, 12 Mar 2026 20:02:14 +0100 Subject: [PATCH 124/244] test: pam helpers --- tests/pam/pam_test_support.py | 290 ++++++++++++++++++++++++++++++++++ 1 file changed, 290 insertions(+) create mode 100644 tests/pam/pam_test_support.py diff --git a/tests/pam/pam_test_support.py b/tests/pam/pam_test_support.py new file mode 100644 index 00000000..333a6d44 --- /dev/null +++ b/tests/pam/pam_test_support.py @@ -0,0 +1,290 @@ +from __future__ import annotations + +from dataclasses import dataclass + +from algokit_utils import ( + AlgoAmount, + AlgorandClient, + AssetOptInParams, + AssetTransferParams, + CommonAppCallParams, + SendParams, + SigningAccount, +) + +from smart_contracts import constants as cst +from smart_contracts.artifacts.d_asa.dasa_client import ( + AccountOpenArgs, + ContractConfigArgs, + ContractCreateArgs, + ContractScheduleArgs, + DasaClient, + DasaFactory, + InitialKernelState, + NormalizedActusTerms, + PrimaryDistributionArgs, + Prospectus, + RbacAssignRoleArgs, +) +from src import NormalizationResult +from src.registry import EVENT_TYPE_IDS +from src.schedule import Cycle +from tests import conftest_helpers as role_helpers +from tests import utils + +PRINCIPAL = 10_000 +MINIMUM_DENOMINATION = 100 +ISSUANCE_DELAY_CYCLE = Cycle.parse_cycle("30D") + + +@dataclass(frozen=True) +class PamLifecycleContext: + client: DasaClient + investor: SigningAccount + receiver: SigningAccount + + +def asset_balance(algorand: AlgorandClient, *, address: str, asset_id: int) -> int: + return algorand.client.algod.account_asset_info(address, asset_id)["asset-holding"][ + "amount" + ] + + +def client_terms(result: NormalizationResult) -> NormalizedActusTerms: + return NormalizedActusTerms( + contract_type=result.terms.contract_type, + denomination_asset_id=result.terms.denomination_asset_id, + settlement_asset_id=result.terms.denomination_asset_id, + total_units=result.terms.total_units, + notional_principal=result.terms.notional_principal, + initial_exchange_amount=result.terms.initial_exchange_amount, + initial_exchange_date=result.terms.initial_exchange_date, + maturity_date=result.terms.maturity_date or 0, + day_count_convention=int(result.terms.day_count_convention), + rate_reset_spread=result.terms.rate_reset_spread, + rate_reset_multiplier=result.terms.rate_reset_multiplier, + rate_reset_floor=result.terms.rate_reset_floor, + rate_reset_cap=result.terms.rate_reset_cap, + rate_reset_next=result.terms.rate_reset_next, + has_rate_reset_floor=result.terms.has_rate_reset_floor, + has_rate_reset_cap=result.terms.has_rate_reset_cap, + dynamic_principal_redemption=result.terms.dynamic_principal_redemption, + fixed_point_scale=result.terms.fixed_point_scale, + ) + + +def client_initial_state(result: NormalizationResult) -> InitialKernelState: + return InitialKernelState( + status_date=result.initial_state.status_date, + event_cursor=result.initial_state.event_cursor, + outstanding_principal=result.initial_state.outstanding_principal, + interest_calculation_base=result.initial_state.interest_calculation_base, + nominal_interest_rate=result.initial_state.nominal_interest_rate, + accrued_interest=result.initial_state.accrued_interest, + next_principal_redemption=result.initial_state.next_principal_redemption, + cumulative_interest_index=result.initial_state.cumulative_interest_index, + cumulative_principal_index=result.initial_state.cumulative_principal_index, + ) + + +def client_schedule_page( + page: tuple, +) -> list[tuple[int, int, int, int, int, int, int, int, int]]: + return [ + ( + entry.event_id, + EVENT_TYPE_IDS[entry.event_type], + entry.scheduled_time, + entry.accrual_factor, + entry.redemption_accrual_factor, + entry.next_nominal_interest_rate, + entry.next_principal_redemption, + entry.next_outstanding_principal, + entry.flags, + ) + for entry in page + ] + + +def cycle_duration_seconds(cycle: Cycle) -> int: + if cycle.unit == "D": + return cycle.count * cst.DAY_2_SEC + if cycle.unit == "W": + return cycle.count * 7 * cst.DAY_2_SEC + raise ValueError(f"Unsupported fixed-duration ACTUS cycle for this test: {cycle}") + + +def scale_currency_amount(amount: int, currency_scale: int) -> int: + return amount * currency_scale + + +def _open_contract_account( + client: DasaClient, + *, + account_manager: SigningAccount, + holding_address: str, + payment_address: str, +) -> None: + client.send.account_open( + AccountOpenArgs( + holding_address=holding_address, + payment_address=payment_address, + ), + params=CommonAppCallParams( + sender=account_manager.address, + signer=account_manager.signer, + ), + ) + + +def setup_pam_lifecycle( + *, + algorand: AlgorandClient, + arranger: SigningAccount, + bank: SigningAccount, + currency: utils.Currency, + normalized: NormalizationResult, + bank_funding_amount: int, + investor_payment_amount: int, + prospectus_url: str, +) -> PamLifecycleContext: + factory = algorand.client.get_typed_app_factory( + DasaFactory, + default_sender=arranger.address, + default_signer=arranger.signer, + ) + client, _ = factory.send.create.contract_create( + ContractCreateArgs(arranger=arranger.address) + ) + algorand.account.ensure_funded_from_environment( + account_to_fund=client.app_address, + min_spending_balance=AlgoAmount.from_algo(10_000), + ) + + pages = normalized.schedule_pages(cst.SCHEDULE_PAGE_SIZE) + client.send.contract_config( + ContractConfigArgs( + terms=client_terms(normalized), + initial_state=client_initial_state(normalized), + prospectus=Prospectus( + hash=bytes(32), + url=prospectus_url, + ), + ), + params=CommonAppCallParams(max_fee=AlgoAmount.from_micro_algo(5_000)), + send_params=SendParams(cover_app_call_inner_transaction_fees=True), + ) + for index, page in enumerate(pages): + client.send.contract_schedule( + ContractScheduleArgs( + schedule_page_index=index, + is_last_page=index == len(pages) - 1, + schedule_page=client_schedule_page(page), + ), + params=CommonAppCallParams(max_fee=AlgoAmount.from_micro_algo(5_000)), + send_params=SendParams(cover_app_call_inner_transaction_fees=True), + ) + + if bank_funding_amount > 0: + algorand.send.asset_transfer( + AssetTransferParams( + asset_id=currency.id, + amount=bank_funding_amount, + receiver=client.app_address, + sender=bank.address, + signer=bank.signer, + ) + ) + + primary_dealer = role_helpers.create_role_account( + algorand, + utils.DAsaPrimaryDealer, + client, + rbac_assign_role_args_class=RbacAssignRoleArgs, + ) + account_manager = role_helpers.create_role_account( + algorand, + utils.DAsaAccountManager, + client, + rbac_assign_role_args_class=RbacAssignRoleArgs, + ) + + investor = algorand.account.random() + algorand.account.ensure_funded_from_environment( + account_to_fund=investor.address, + min_spending_balance=AlgoAmount.from_algo(10), + ) + algorand.send.asset_opt_in( + AssetOptInParams( + asset_id=currency.id, + sender=investor.address, + signer=investor.signer, + ) + ) + _open_contract_account( + client, + account_manager=account_manager, + holding_address=investor.address, + payment_address=investor.address, + ) + + algorand.send.asset_transfer( + AssetTransferParams( + asset_id=currency.id, + amount=investor_payment_amount, + receiver=investor.address, + sender=bank.address, + signer=bank.signer, + ) + ) + + receiver = algorand.account.random() + algorand.account.ensure_funded_from_environment( + account_to_fund=receiver.address, + min_spending_balance=AlgoAmount.from_algo(10), + ) + _open_contract_account( + client, + account_manager=account_manager, + holding_address=receiver.address, + payment_address=receiver.address, + ) + + assert ( + asset_balance(algorand, address=investor.address, asset_id=currency.id) + == investor_payment_amount + ) + + investor_purchase_txn = algorand.create_transaction.asset_transfer( + AssetTransferParams( + asset_id=currency.id, + amount=investor_payment_amount, + receiver=client.app_address, + sender=investor.address, + signer=investor.signer, + ) + ) + client.new_group().add_transaction( + investor_purchase_txn, investor.signer + ).primary_distribution( + PrimaryDistributionArgs( + holding_address=investor.address, + units=normalized.terms.total_units, + ), + params=CommonAppCallParams( + sender=primary_dealer.address, + signer=primary_dealer.signer, + ), + ).send() + + assert asset_balance(algorand, address=investor.address, asset_id=currency.id) == 0 + assert ( + asset_balance(algorand, address=client.app_address, asset_id=currency.id) + == bank_funding_amount + investor_payment_amount + ) + + return PamLifecycleContext( + client=client, + investor=investor, + receiver=receiver, + ) From 1ebaa27bf3b6edbfcb93c9a31d6cc46a53c00b6a Mon Sep 17 00:00:00 2001 From: cusma Date: Thu, 12 Mar 2026 20:02:32 +0100 Subject: [PATCH 125/244] test: pam fixed coupon bond --- tests/pam/fcb/test_pam_fixed_coupon_bond.py | 285 ++++++++++++++++++++ 1 file changed, 285 insertions(+) create mode 100644 tests/pam/fcb/test_pam_fixed_coupon_bond.py diff --git a/tests/pam/fcb/test_pam_fixed_coupon_bond.py b/tests/pam/fcb/test_pam_fixed_coupon_bond.py new file mode 100644 index 00000000..c782bc72 --- /dev/null +++ b/tests/pam/fcb/test_pam_fixed_coupon_bond.py @@ -0,0 +1,285 @@ +from __future__ import annotations + +import pytest +from algokit_utils import ( + AlgoAmount, + AlgorandClient, + CommonAppCallParams, + LogicError, + SendParams, + SigningAccount, +) + +from smart_contracts import constants as cst +from smart_contracts import enums +from smart_contracts import errors as err +from smart_contracts.artifacts.d_asa.dasa_client import ( + AccountGetPositionArgs, + ClaimDueCashflowsArgs, + FundDueCashflowsArgs, + TransferArgs, +) +from src import NormalizationResult, normalize_contract_attributes +from src.contracts import make_pam_fixed_coupon_bond_profile +from src.registry import CONTRACT_TYPE_IDS, EVENT_TYPE_IDS +from src.schedule import Cycle +from tests import utils +from tests.pam.pam_test_support import ( + ISSUANCE_DELAY_CYCLE, + MINIMUM_DENOMINATION, + PRINCIPAL, + asset_balance, + cycle_duration_seconds, + scale_currency_amount, + setup_pam_lifecycle, +) + +NOMINAL_RATE = 0.02 +INTEREST_PAYMENT_CYCLE = Cycle.parse_cycle("90D") +MATURITY_OFFSET_CYCLE = Cycle.parse_cycle("1800D") + + +def _derive_total_interest_amount(result: NormalizationResult) -> int: + outstanding_principal = result.schedule[0].next_outstanding_principal + nominal_interest_rate = ( + result.schedule[0].next_nominal_interest_rate or result.terms.rate_reset_next + ) + accrued_interest = 0 + total_interest = 0 + + for entry in result.schedule[1:]: + interest_segment = ( + outstanding_principal + * nominal_interest_rate + // result.terms.fixed_point_scale + * entry.accrual_factor + // result.terms.fixed_point_scale + ) + + if entry.event_type in {"IP", "MD"}: + total_interest += accrued_interest + interest_segment + accrued_interest = 0 + elif entry.event_type == "PR": + accrued_interest += interest_segment + + if entry.event_type in {"PR", "MD"}: + outstanding_principal = entry.next_outstanding_principal + + if entry.next_nominal_interest_rate: + nominal_interest_rate = entry.next_nominal_interest_rate + + return total_interest + + +def test_fixed_coupon_pam_full_lifecycle( + algorand: AlgorandClient, + bank: SigningAccount, + currency: utils.Currency, + arranger: SigningAccount, +) -> None: + current_ts = utils.get_latest_timestamp(algorand.client.algod) + issuance_delay = cycle_duration_seconds(ISSUANCE_DELAY_CYCLE) + coupon_period = cycle_duration_seconds(INTEREST_PAYMENT_CYCLE) + maturity_offset = cycle_duration_seconds(MATURITY_OFFSET_CYCLE) + assert maturity_offset % coupon_period == 0 + total_coupons = maturity_offset // coupon_period + + issuance_date = current_ts + issuance_delay + first_coupon_date = issuance_date + coupon_period + maturity_date = issuance_date + maturity_offset + currency_scale = 10**currency.decimals + scaled_principal = scale_currency_amount(PRINCIPAL, currency_scale) + + attrs = make_pam_fixed_coupon_bond_profile( + contract_id=1, + status_date=current_ts, + initial_exchange_date=issuance_date, + maturity_date=maturity_date, + notional_principal=PRINCIPAL, + nominal_interest_rate=NOMINAL_RATE, + interest_payment_cycle=INTEREST_PAYMENT_CYCLE, + interest_payment_anchor=first_coupon_date, + ) + normalized = normalize_contract_attributes( + attrs, + denomination_asset_id=currency.id, + denomination_asset_decimals=currency.decimals, + notional_unit_value=MINIMUM_DENOMINATION, + secondary_market_opening_date=issuance_date, + secondary_market_closure_date=maturity_date + cst.DAY_2_SEC, + ) + + expected_event_types = ["IED"] + ["IP"] * total_coupons + ["MD"] + assert [entry.event_type for entry in normalized.schedule] == expected_event_types + total_interest_amount = _derive_total_interest_amount(normalized) + + lifecycle = setup_pam_lifecycle( + algorand=algorand, + arranger=arranger, + bank=bank, + currency=currency, + normalized=normalized, + bank_funding_amount=total_interest_amount, + investor_payment_amount=normalized.terms.initial_exchange_amount, + prospectus_url="ACTUS fixed coupon PAM lifecycle", + ) + client = lifecycle.client + investor = lifecycle.investor + receiver = lifecycle.receiver + + account_position = client.send.account_get_position( + AccountGetPositionArgs(holding_address=investor.address) + ).abi_return + assert account_position.units == 0 + assert account_position.reserved_units == normalized.terms.total_units + + contract_state = client.send.get_contract_state().abi_return + assert contract_state.contract_type == CONTRACT_TYPE_IDS["PAM"] + assert contract_state.status == enums.STATUS_PENDING_IED + assert contract_state.total_units == normalized.terms.total_units + assert contract_state.initial_exchange_amount == scaled_principal + assert contract_state.reserved_units_total == normalized.terms.total_units + assert contract_state.event_cursor == 0 + assert contract_state.schedule_entry_count == len(normalized.schedule) + + with pytest.raises(LogicError, match=err.PENDING_IED): + client.send.fund_due_cashflows(FundDueCashflowsArgs(max_event_count=1)) + + with pytest.raises(LogicError, match=err.PENDING_IED): + client.send.claim_due_cashflows( + ClaimDueCashflowsArgs( + holding_address=investor.address, + payment_info=b"", + ), + params=CommonAppCallParams( + sender=investor.address, + signer=investor.signer, + ), + ) + + with pytest.raises(LogicError, match=err.PENDING_IED): + client.send.transfer( + TransferArgs( + sender_holding_address=investor.address, + receiver_holding_address=receiver.address, + units=1, + ), + params=CommonAppCallParams( + sender=investor.address, + signer=investor.signer, + ), + ) + + ied_entry = normalized.schedule[0] + utils.time_warp(ied_entry.scheduled_time + cst.DAY_2_SEC) + ied_result = client.send.execute_ied() + ied_event = utils.decode_actus_execution_event( + utils.get_event_from_call_result(ied_result) + ) + assert ied_event["event_id"] == ied_entry.event_id + assert ied_event["event_type"] == EVENT_TYPE_IDS["IED"] + assert ied_event["scheduled_time"] == ied_entry.scheduled_time + assert ied_event["applied_at"] > ied_event["scheduled_time"] + assert ied_event["payoff"] == normalized.terms.initial_exchange_amount + assert ied_event["payoff_sign"] == enums.PAYOFF_SIGN_POSITIVE + assert ied_event["settled_amount"] == 0 + + contract_state = client.send.get_contract_state().abi_return + assert contract_state.status == enums.STATUS_ACTIVE + assert contract_state.event_cursor == 1 + assert contract_state.initial_exchange_amount == scaled_principal + assert contract_state.outstanding_principal == scaled_principal + assert contract_state.interest_calculation_base == scaled_principal + assert contract_state.nominal_interest_rate == normalized.terms.rate_reset_next + assert contract_state.reserved_units_total == normalized.terms.total_units + + total_interest_claimed = 0 + total_principal_claimed = 0 + + first_coupon_expected_interest = ( + scaled_principal + * normalized.terms.rate_reset_next + // cst.FIXED_POINT_SCALE + * normalized.schedule[1].accrual_factor + // cst.FIXED_POINT_SCALE + ) + + for schedule_index, entry in enumerate(normalized.schedule[1:], start=1): + utils.time_warp(entry.scheduled_time) + + funding_result = client.send.fund_due_cashflows( + FundDueCashflowsArgs(max_event_count=1) + ) + funding = funding_result.abi_return + assert funding.processed_events == 1 + assert funding.total_funded > 0 + + event = utils.decode_actus_execution_event( + utils.get_event_from_call_result(funding_result) + ) + assert event["event_id"] == entry.event_id + assert event["event_type"] == EVENT_TYPE_IDS[entry.event_type] + assert event["scheduled_time"] == entry.scheduled_time + assert event["applied_at"] >= event["scheduled_time"] + assert event["payoff"] == funding.total_funded + assert event["payoff_sign"] == enums.PAYOFF_SIGN_NEGATIVE + assert event["settled_amount"] == funding.total_funded + assert event["sequence"] == schedule_index + 1 + + balance_before = asset_balance( + algorand, address=investor.address, asset_id=currency.id + ) + claim_result = client.send.claim_due_cashflows( + ClaimDueCashflowsArgs( + holding_address=investor.address, + payment_info=b"", + ), + params=CommonAppCallParams( + sender=investor.address, + signer=investor.signer, + max_fee=AlgoAmount.from_micro_algo(3_000), + ), + send_params=SendParams(cover_app_call_inner_transaction_fees=True), + ) + claim = claim_result.abi_return + balance_after = asset_balance( + algorand, address=investor.address, asset_id=currency.id + ) + + assert claim.total_amount == funding.total_funded + assert balance_after - balance_before == claim.total_amount + + if schedule_index == 1: + assert claim.interest_amount == first_coupon_expected_interest + + if entry.event_type == "IP": + assert claim.interest_amount == claim.total_amount + assert claim.principal_amount == 0 + else: + assert entry.event_type == "MD" + assert claim.principal_amount == scaled_principal + assert claim.total_amount == scaled_principal + + total_interest_claimed += claim.interest_amount + total_principal_claimed += claim.principal_amount + + contract_state = client.send.get_contract_state().abi_return + final_position = client.send.account_get_position( + AccountGetPositionArgs(holding_address=investor.address) + ).abi_return + + assert total_principal_claimed == scaled_principal + assert total_interest_claimed > 0 + assert contract_state.status == enums.STATUS_ENDED + assert contract_state.event_cursor == len(normalized.schedule) + assert contract_state.schedule_entry_count == len(normalized.schedule) + assert contract_state.total_units == normalized.terms.total_units + assert contract_state.reserved_units_total == 0 + assert contract_state.outstanding_principal == 0 + assert contract_state.reserved_interest == 0 + assert contract_state.reserved_principal == 0 + assert final_position.units == normalized.terms.total_units + assert final_position.reserved_units == 0 + assert final_position.claimable_interest == 0 + assert final_position.claimable_principal == 0 + assert final_position.settled_cursor == len(normalized.schedule) From a902798e6de08d315c1c05dac842ef34e38c8884 Mon Sep 17 00:00:00 2001 From: cusma Date: Thu, 12 Mar 2026 20:02:38 +0100 Subject: [PATCH 126/244] test: pam zero coupon bond --- tests/pam/zcb/test_pam_zero_coupon_bond.py | 225 +++++++++++++++++++++ 1 file changed, 225 insertions(+) create mode 100644 tests/pam/zcb/test_pam_zero_coupon_bond.py diff --git a/tests/pam/zcb/test_pam_zero_coupon_bond.py b/tests/pam/zcb/test_pam_zero_coupon_bond.py new file mode 100644 index 00000000..0a869147 --- /dev/null +++ b/tests/pam/zcb/test_pam_zero_coupon_bond.py @@ -0,0 +1,225 @@ +from __future__ import annotations + +import pytest +from algokit_utils import ( + AlgoAmount, + AlgorandClient, + CommonAppCallParams, + LogicError, + SendParams, + SigningAccount, +) + +from smart_contracts import constants as cst +from smart_contracts import enums +from smart_contracts import errors as err +from smart_contracts.artifacts.d_asa.dasa_client import ( + AccountGetPositionArgs, + ClaimDueCashflowsArgs, + FundDueCashflowsArgs, + TransferArgs, +) +from src import normalize_contract_attributes +from src.contracts import make_pam_zero_coupon_bond +from src.registry import CONTRACT_TYPE_IDS, EVENT_TYPE_IDS +from src.schedule import Cycle +from tests import utils +from tests.pam.pam_test_support import ( + ISSUANCE_DELAY_CYCLE, + MINIMUM_DENOMINATION, + PRINCIPAL, + asset_balance, + cycle_duration_seconds, + scale_currency_amount, + setup_pam_lifecycle, +) + +ZERO_COUPON_MATURITY_CYCLE = Cycle.parse_cycle("360D") +ZERO_COUPON_DISCOUNT_BPS = 200 + + +def test_zero_coupon_pam_discounted_full_lifecycle( + algorand: AlgorandClient, + bank: SigningAccount, + currency: utils.Currency, + arranger: SigningAccount, +) -> None: + current_ts = utils.get_latest_timestamp(algorand.client.algod) + issuance_delay = cycle_duration_seconds(ISSUANCE_DELAY_CYCLE) + maturity_offset = cycle_duration_seconds(ZERO_COUPON_MATURITY_CYCLE) + + issuance_date = current_ts + issuance_delay + maturity_date = issuance_date + maturity_offset + discount_amount = PRINCIPAL * ZERO_COUPON_DISCOUNT_BPS // cst.BPS + issue_price = PRINCIPAL - discount_amount + currency_scale = 10**currency.decimals + scaled_principal = scale_currency_amount(PRINCIPAL, currency_scale) + scaled_issue_price = scale_currency_amount(issue_price, currency_scale) + + attrs = make_pam_zero_coupon_bond( + contract_id=2, + status_date=current_ts, + initial_exchange_date=issuance_date, + maturity_date=maturity_date, + notional_principal=PRINCIPAL, + premium_discount_at_ied=discount_amount, + ) + normalized = normalize_contract_attributes( + attrs, + denomination_asset_id=currency.id, + denomination_asset_decimals=currency.decimals, + notional_unit_value=MINIMUM_DENOMINATION, + secondary_market_opening_date=issuance_date, + secondary_market_closure_date=maturity_date + cst.DAY_2_SEC, + ) + + assert [entry.event_type for entry in normalized.schedule] == ["IED", "MD"] + assert normalized.terms.initial_exchange_amount == scaled_issue_price + assert normalized.terms.rate_reset_next == 0 + bank_funding_amount = scaled_principal - scaled_issue_price + + lifecycle = setup_pam_lifecycle( + algorand=algorand, + arranger=arranger, + bank=bank, + currency=currency, + normalized=normalized, + bank_funding_amount=bank_funding_amount, + investor_payment_amount=normalized.terms.initial_exchange_amount, + prospectus_url="ACTUS zero coupon PAM lifecycle", + ) + client = lifecycle.client + investor = lifecycle.investor + receiver = lifecycle.receiver + + account_position = client.send.account_get_position( + AccountGetPositionArgs(holding_address=investor.address) + ).abi_return + assert account_position.units == 0 + assert account_position.reserved_units == normalized.terms.total_units + + contract_state = client.send.get_contract_state().abi_return + assert contract_state.contract_type == CONTRACT_TYPE_IDS["PAM"] + assert contract_state.status == enums.STATUS_PENDING_IED + assert contract_state.total_units == normalized.terms.total_units + assert contract_state.initial_exchange_amount == scaled_issue_price + assert contract_state.reserved_units_total == normalized.terms.total_units + assert contract_state.event_cursor == 0 + assert contract_state.schedule_entry_count == len(normalized.schedule) + + with pytest.raises(LogicError, match=err.PENDING_IED): + client.send.fund_due_cashflows(FundDueCashflowsArgs(max_event_count=1)) + + with pytest.raises(LogicError, match=err.PENDING_IED): + client.send.claim_due_cashflows( + ClaimDueCashflowsArgs( + holding_address=investor.address, + payment_info=b"", + ), + params=CommonAppCallParams( + sender=investor.address, + signer=investor.signer, + ), + ) + + with pytest.raises(LogicError, match=err.PENDING_IED): + client.send.transfer( + TransferArgs( + sender_holding_address=investor.address, + receiver_holding_address=receiver.address, + units=1, + ), + params=CommonAppCallParams( + sender=investor.address, + signer=investor.signer, + ), + ) + + ied_entry = normalized.schedule[0] + utils.time_warp(ied_entry.scheduled_time + cst.DAY_2_SEC) + ied_result = client.send.execute_ied() + ied_event = utils.decode_actus_execution_event( + utils.get_event_from_call_result(ied_result) + ) + assert ied_event["event_id"] == ied_entry.event_id + assert ied_event["event_type"] == EVENT_TYPE_IDS["IED"] + assert ied_event["scheduled_time"] == ied_entry.scheduled_time + assert ied_event["applied_at"] > ied_event["scheduled_time"] + assert ied_event["payoff"] == scaled_issue_price + assert ied_event["payoff_sign"] == enums.PAYOFF_SIGN_POSITIVE + assert ied_event["settled_amount"] == 0 + + contract_state = client.send.get_contract_state().abi_return + assert contract_state.status == enums.STATUS_ACTIVE + assert contract_state.event_cursor == 1 + assert contract_state.initial_exchange_amount == scaled_issue_price + assert contract_state.outstanding_principal == scaled_principal + assert contract_state.interest_calculation_base == scaled_principal + assert contract_state.nominal_interest_rate == 0 + assert contract_state.reserved_units_total == normalized.terms.total_units + + md_entry = normalized.schedule[1] + utils.time_warp(md_entry.scheduled_time) + + funding_result = client.send.fund_due_cashflows( + FundDueCashflowsArgs(max_event_count=1) + ) + funding = funding_result.abi_return + assert funding.processed_events == 1 + assert funding.total_funded == scaled_principal + + event = utils.decode_actus_execution_event( + utils.get_event_from_call_result(funding_result) + ) + assert event["event_id"] == md_entry.event_id + assert event["event_type"] == EVENT_TYPE_IDS["MD"] + assert event["scheduled_time"] == md_entry.scheduled_time + assert event["applied_at"] >= event["scheduled_time"] + assert event["payoff"] == scaled_principal + assert event["payoff_sign"] == enums.PAYOFF_SIGN_NEGATIVE + assert event["settled_amount"] == scaled_principal + assert event["sequence"] == 2 + + balance_before = asset_balance( + algorand, address=investor.address, asset_id=currency.id + ) + claim_result = client.send.claim_due_cashflows( + ClaimDueCashflowsArgs( + holding_address=investor.address, + payment_info=b"", + ), + params=CommonAppCallParams( + sender=investor.address, + signer=investor.signer, + max_fee=AlgoAmount.from_micro_algo(3_000), + ), + send_params=SendParams(cover_app_call_inner_transaction_fees=True), + ) + claim = claim_result.abi_return + balance_after = asset_balance( + algorand, address=investor.address, asset_id=currency.id + ) + + assert claim.total_amount == scaled_principal + assert claim.interest_amount == 0 + assert claim.principal_amount == scaled_principal + assert balance_after - balance_before == scaled_principal + + contract_state = client.send.get_contract_state().abi_return + final_position = client.send.account_get_position( + AccountGetPositionArgs(holding_address=investor.address) + ).abi_return + + assert contract_state.status == enums.STATUS_ENDED + assert contract_state.event_cursor == len(normalized.schedule) + assert contract_state.schedule_entry_count == len(normalized.schedule) + assert contract_state.total_units == normalized.terms.total_units + assert contract_state.reserved_units_total == 0 + assert contract_state.outstanding_principal == 0 + assert contract_state.reserved_interest == 0 + assert contract_state.reserved_principal == 0 + assert final_position.units == normalized.terms.total_units + assert final_position.reserved_units == 0 + assert final_position.claimable_interest == 0 + assert final_position.claimable_principal == 0 + assert final_position.settled_cursor == len(normalized.schedule) From bb1d01635fa68579705f53169811ce737e5daeb9 Mon Sep 17 00:00:00 2001 From: cusma Date: Thu, 12 Mar 2026 20:02:51 +0100 Subject: [PATCH 127/244] chore: init --- src/__init__.py | 4 ++++ tests/pam/__init__.py | 1 + 2 files changed, 5 insertions(+) create mode 100644 tests/pam/__init__.py diff --git a/src/__init__.py b/src/__init__.py index d15b9cbe..a1775a45 100644 --- a/src/__init__.py +++ b/src/__init__.py @@ -7,14 +7,18 @@ NormalizedActusTerms, ObservedEventRequest, ) +from .normalization import normalize_contract_attributes +from .schedule import Cycle __all__ = [ "AccountPosition", "ActusNormalizationError", + "Cycle", "ExecutionScheduleEntry", "InitialKernelState", "NormalizationResult", "NormalizedActusTerms", "ObservedEventRequest", "UnsupportedActusFeatureError", + "normalize_contract_attributes", ] diff --git a/tests/pam/__init__.py b/tests/pam/__init__.py new file mode 100644 index 00000000..d0e46685 --- /dev/null +++ b/tests/pam/__init__.py @@ -0,0 +1 @@ +"""PAM integration tests.""" From fd49ad858c6aa78207ce0fe6f746156de6864da2 Mon Sep 17 00:00:00 2001 From: cusma Date: Thu, 12 Mar 2026 20:02:58 +0100 Subject: [PATCH 128/244] chore: adapt ci --- .github/workflows/d-asa-ci.yaml | 76 ++++++++++++++++----------------- 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/.github/workflows/d-asa-ci.yaml b/.github/workflows/d-asa-ci.yaml index 3e150150..29fc2f13 100644 --- a/.github/workflows/d-asa-ci.yaml +++ b/.github/workflows/d-asa-ci.yaml @@ -39,20 +39,10 @@ jobs: - name: Run deployer against LocalNet run: algokit project deploy localnet - test: - name: Test ${{ matrix.module }} + test-mock-module-rbac: + name: Test mock_module_rbac if: '! github.event.pull_request.draft' runs-on: "ubuntu-latest" - strategy: - matrix: - module: - # Mocked modules - - mock_module_rbac - - mock_module_accounting - # Contracts - - zero_coupon_bond - - fixed_coupon_bond - - perpetual_bond steps: - name: Checkout source code uses: actions/checkout@v6 @@ -65,22 +55,28 @@ jobs: id: filter with: filters: | - module: - - 'smart_contracts/artifacts/${{ matrix.module }}/**' + mock_module_rbac: + - 'smart_contracts/artifacts/mock_module_rbac/**' - 'tests/conftest.py' - - 'tests/${{ matrix.module }}/**' + - 'tests/mock_module_rbac/**' - name: Run tests - if: steps.filter.outputs.module == 'true' + if: steps.filter.outputs.mock_module_rbac == 'true' shell: bash run: | set -o pipefail - algokit project run test tests/${{ matrix.module }} + algokit project run test tests/mock_module_rbac - test-shared: - name: Test shared contracts + test-pam: + name: Test PAM ${{ matrix.subfolder }} if: '! github.event.pull_request.draft' runs-on: "ubuntu-latest" + strategy: + fail-fast: false + matrix: + subfolder: + - fcb + - zcb steps: - name: Checkout source code uses: actions/checkout@v6 @@ -93,30 +89,22 @@ jobs: id: filter with: filters: | - shared: - - 'modules/**' - - 'smart_contracts/artifacts/zero_coupon_bond/**' - - 'smart_contracts/artifacts/fixed_coupon_bond/**' - - 'smart_contracts/artifacts/perpetual_bond/**' + pam: + - 'smart_contracts/artifacts/d_asa/**' - 'tests/conftest.py' - 'tests/conftest_helpers.py' - - 'tests/shared/**' - - - name: Run shared tests - if: steps.filter.outputs.shared == 'true' - shell: bash - run: | - set -o pipefail - algokit project run test tests/shared + - 'tests/pam/pam_test_support.py' + - 'tests/pam/${{ matrix.subfolder }}/**' - - name: Run helper tests + - name: Run tests + if: steps.filter.outputs.pam == 'true' shell: bash run: | set -o pipefail - algokit project run test tests/test_utils.py tests/test_mixin_composition_guards.py + algokit project run test tests/pam/${{ matrix.subfolder }} - test-events: - name: Test ACTUS events + test-sdk: + name: Test SDK and helpers if: '! github.event.pull_request.draft' runs-on: "ubuntu-latest" steps: @@ -126,8 +114,20 @@ jobs: - name: Set up AlgoKit uses: ./.github/actions/algokit-setup - - name: Run Fixed Coupon Bond ACTUS events test + - name: Detect changes + uses: dorny/paths-filter@v3 + id: filter + with: + filters: | + sdk: + - 'src/**' + - 'smart_contracts/**' + - 'tests/sdk/**' + - 'tests/test_utils.py' + + - name: Run tests + if: steps.filter.outputs.sdk == 'true' shell: bash run: | set -o pipefail - poetry run pytest -s -v tests/fixed_coupon_bond/test_actus_events.py + algokit project run test tests/sdk tests/test_utils.py From 72813b2fe8c7e03b0db045176544e542b5283753 Mon Sep 17 00:00:00 2001 From: cusma Date: Thu, 12 Mar 2026 21:17:19 +0100 Subject: [PATCH 129/244] chore: rename module --- modules/{kernel.py => actus_kernel.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename modules/{kernel.py => actus_kernel.py} (100%) diff --git a/modules/kernel.py b/modules/actus_kernel.py similarity index 100% rename from modules/kernel.py rename to modules/actus_kernel.py From 4dec488c2ba84b6f15c02ae78b3d3a8980791d2b Mon Sep 17 00:00:00 2001 From: cusma Date: Thu, 12 Mar 2026 21:17:33 +0100 Subject: [PATCH 130/244] chore: build artifacts --- .../artifacts/d_asa/DASA.approval.puya.map | 160 +-- .../artifacts/d_asa/DASA.approval.teal | 1210 ++++++++--------- .../artifacts/d_asa/DASA.arc56.json | 2 +- .../artifacts/d_asa/dasa_client.py | 2 +- 4 files changed, 687 insertions(+), 687 deletions(-) diff --git a/smart_contracts/artifacts/d_asa/DASA.approval.puya.map b/smart_contracts/artifacts/d_asa/DASA.approval.puya.map index 0d9b73dd..7ef44c3e 100644 --- a/smart_contracts/artifacts/d_asa/DASA.approval.puya.map +++ b/smart_contracts/artifacts/d_asa/DASA.approval.puya.map @@ -2,7 +2,7 @@ "version": 3, "sources": [ "../../../modules/accounting.py", - "../../../modules/kernel.py", + "../../../modules/actus_kernel.py", "../../../modules/payment_agent.py", "../../../modules/rbac.py", "../../../modules/transfer_agent.py", @@ -2192,7 +2192,7 @@ ] }, "1285": { - "callsub": "modules.kernel.ActusKernelModule._get_schedule_entry", + "callsub": "modules.actus_kernel.ActusKernelModule._get_schedule_entry", "op": "callsub _get_schedule_entry", "defined_out": [ "entry#0", @@ -3551,7 +3551,7 @@ ] }, "1370": { - "block": "fund_due_cashflows_after_inlined_modules.kernel.ActusKernelModule._entry_interest_amount@14", + "block": "fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_interest_amount@14", "stack_in": [ "entry#0", "event_type#0", @@ -3924,7 +3924,7 @@ ] }, "1394": { - "block": "fund_due_cashflows_after_inlined_modules.kernel.ActusKernelModule._entry_principal_amount@26", + "block": "fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@26", "stack_in": [ "entry#0", "event_type#0", @@ -4046,7 +4046,7 @@ ] }, "1401": { - "callsub": "modules.kernel.ActusKernelModule._is_dynamic_annuity", + "callsub": "modules.actus_kernel.ActusKernelModule._is_dynamic_annuity", "op": "callsub _is_dynamic_annuity", "defined_out": [ "entry#0", @@ -4192,7 +4192,7 @@ ] }, "1413": { - "callsub": "modules.kernel.ActusKernelModule._amount_to_index_delta", + "callsub": "modules.actus_kernel.ActusKernelModule._amount_to_index_delta", "op": "callsub _amount_to_index_delta", "defined_out": [ "interest_amount_due#0", @@ -4247,7 +4247,7 @@ ] }, "1418": { - "callsub": "modules.kernel.ActusKernelModule._amount_to_index_delta", + "callsub": "modules.actus_kernel.ActusKernelModule._amount_to_index_delta", "op": "callsub _amount_to_index_delta", "defined_out": [ "interest_amount_due#0", @@ -4308,7 +4308,7 @@ ] }, "1423": { - "callsub": "modules.kernel.ActusKernelModule._index_delta_to_amount", + "callsub": "modules.actus_kernel.ActusKernelModule._index_delta_to_amount", "op": "callsub _index_delta_to_amount", "defined_out": [ "interest_amount#1", @@ -4454,7 +4454,7 @@ ] }, "1432": { - "callsub": "modules.kernel.ActusKernelModule._index_delta_to_amount", + "callsub": "modules.actus_kernel.ActusKernelModule._index_delta_to_amount", "op": "callsub _index_delta_to_amount", "defined_out": [ "interest_amount#1", @@ -6795,7 +6795,7 @@ ] }, "1539": { - "callsub": "modules.kernel.ActusKernelModule._entry_interest_segment", + "callsub": "modules.actus_kernel.ActusKernelModule._entry_interest_segment", "op": "callsub _entry_interest_segment", "defined_out": [ "_entry_interest_segment%0#0", @@ -6980,7 +6980,7 @@ "funded_interest#0", "funded_principal#0" ], - "callsub": "modules.kernel.ActusKernelModule._is_dynamic_annuity", + "callsub": "modules.actus_kernel.ActusKernelModule._is_dynamic_annuity", "op": "callsub _is_dynamic_annuity", "defined_out": [ "tmp%23#0" @@ -8245,7 +8245,7 @@ ] }, "1625": { - "callsub": "modules.kernel.ActusKernelModule._emit_execution_event", + "callsub": "modules.actus_kernel.ActusKernelModule._emit_execution_event", "op": "callsub _emit_execution_event", "stack_out": [ "entry#0", @@ -9925,7 +9925,7 @@ "funded_interest#0", "funded_principal#0" ], - "callsub": "modules.kernel.ActusKernelModule._is_dynamic_annuity", + "callsub": "modules.actus_kernel.ActusKernelModule._is_dynamic_annuity", "op": "callsub _is_dynamic_annuity", "defined_out": [ "tmp%3#2" @@ -10205,7 +10205,7 @@ ] }, "1755": { - "op": "b fund_due_cashflows_after_inlined_modules.kernel.ActusKernelModule._entry_principal_amount@26" + "op": "b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@26" }, "1758": { "block": "fund_due_cashflows_after_if_else@20", @@ -10356,7 +10356,7 @@ ] }, "1765": { - "callsub": "modules.kernel.ActusKernelModule._entry_interest_segment", + "callsub": "modules.actus_kernel.ActusKernelModule._entry_interest_segment", "op": "callsub _entry_interest_segment", "defined_out": [ "_entry_interest_segment%0#0", @@ -10697,7 +10697,7 @@ ] }, "1786": { - "op": "b fund_due_cashflows_after_inlined_modules.kernel.ActusKernelModule._entry_principal_amount@26" + "op": "b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@26" }, "1789": { "block": "fund_due_cashflows_after_if_else@22", @@ -11206,7 +11206,7 @@ ] }, "1814": { - "op": "b fund_due_cashflows_after_inlined_modules.kernel.ActusKernelModule._entry_principal_amount@26" + "op": "b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@26" }, "1817": { "block": "fund_due_cashflows_after_if_else@24", @@ -11277,7 +11277,7 @@ ] }, "1821": { - "op": "b fund_due_cashflows_after_inlined_modules.kernel.ActusKernelModule._entry_principal_amount@26" + "op": "b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@26" }, "1824": { "block": "fund_due_cashflows_after_if_else@25", @@ -11651,7 +11651,7 @@ ] }, "1840": { - "op": "b fund_due_cashflows_after_inlined_modules.kernel.ActusKernelModule._entry_principal_amount@26" + "op": "b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@26" }, "1843": { "block": "fund_due_cashflows_after_if_else@13", @@ -11802,7 +11802,7 @@ ] }, "1850": { - "callsub": "modules.kernel.ActusKernelModule._entry_interest_segment", + "callsub": "modules.actus_kernel.ActusKernelModule._entry_interest_segment", "op": "callsub _entry_interest_segment", "defined_out": [ "_entry_interest_segment%0#0", @@ -11911,7 +11911,7 @@ ] }, "1858": { - "op": "b fund_due_cashflows_after_inlined_modules.kernel.ActusKernelModule._entry_interest_amount@14" + "op": "b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_interest_amount@14" }, "1861": { "block": "fund_due_cashflows_after_while@9", @@ -19894,7 +19894,7 @@ ] }, "2585": { - "op": "bnz transfer_after_inlined_modules.kernel.ActusKernelModule._assert_no_due_event_pending@10", + "op": "bnz transfer_after_inlined_modules.actus_kernel.ActusKernelModule._assert_no_due_event_pending@10", "stack_out": [ "box_prefixed_key%0#3", "box_prefixed_key%0#4", @@ -19965,7 +19965,7 @@ ] }, "2592": { - "callsub": "modules.kernel.ActusKernelModule._get_schedule_entry", + "callsub": "modules.actus_kernel.ActusKernelModule._get_schedule_entry", "op": "callsub _get_schedule_entry", "defined_out": [ "box_prefixed_key%0#3", @@ -20074,7 +20074,7 @@ ] }, "2602": { - "block": "transfer_after_inlined_modules.kernel.ActusKernelModule._assert_no_due_event_pending@10", + "block": "transfer_after_inlined_modules.actus_kernel.ActusKernelModule._assert_no_due_event_pending@10", "stack_in": [ "box_prefixed_key%0#3", "box_prefixed_key%0#4", @@ -22540,7 +22540,7 @@ "stack_out": [] }, "2895": { - "subroutine": "modules.kernel.ActusKernelModule.contract_create[routing]", + "subroutine": "modules.actus_kernel.ActusKernelModule.contract_create[routing]", "params": {}, "block": "contract_create", "stack_in": [], @@ -22690,7 +22690,7 @@ "stack_out": [] }, "2916": { - "subroutine": "modules.kernel.ActusKernelModule.contract_config[routing]", + "subroutine": "modules.actus_kernel.ActusKernelModule.contract_config[routing]", "params": {}, "block": "contract_config", "stack_in": [], @@ -28818,7 +28818,7 @@ "op": "b contract_config_bool_merge@9" }, "3415": { - "subroutine": "modules.kernel.ActusKernelModule.contract_schedule[routing]", + "subroutine": "modules.actus_kernel.ActusKernelModule.contract_schedule[routing]", "params": {}, "block": "contract_schedule", "stack_in": [], @@ -31330,7 +31330,7 @@ ] }, "3593": { - "callsub": "modules.kernel.ActusKernelModule._assert_event_allowed_for_contract_type", + "callsub": "modules.actus_kernel.ActusKernelModule._assert_event_allowed_for_contract_type", "op": "callsub _assert_event_allowed_for_contract_type", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -33424,7 +33424,7 @@ ] }, "3729": { - "subroutine": "modules.kernel.ActusKernelModule.execute_ied[routing]", + "subroutine": "modules.actus_kernel.ActusKernelModule.execute_ied[routing]", "params": {}, "block": "execute_ied", "stack_in": [], @@ -33586,7 +33586,7 @@ ] }, "3756": { - "callsub": "modules.kernel.ActusKernelModule._get_schedule_entry", + "callsub": "modules.actus_kernel.ActusKernelModule._get_schedule_entry", "op": "callsub _get_schedule_entry", "defined_out": [ "entry#0" @@ -34222,7 +34222,7 @@ ] }, "3837": { - "callsub": "modules.kernel.ActusKernelModule._apply_non_cash_schedule_entry", + "callsub": "modules.actus_kernel.ActusKernelModule._apply_non_cash_schedule_entry", "op": "callsub _apply_non_cash_schedule_entry", "defined_out": [ "_apply_non_cash_schedule_entry%1#0", @@ -34300,7 +34300,7 @@ "stack_out": [] }, "3851": { - "subroutine": "modules.kernel.ActusKernelModule.apply_non_cash_event[routing]", + "subroutine": "modules.actus_kernel.ActusKernelModule.apply_non_cash_event[routing]", "params": {}, "block": "apply_non_cash_event", "stack_in": [], @@ -35453,7 +35453,7 @@ ] }, "3942": { - "callsub": "modules.kernel.ActusKernelModule._assert_event_allowed_for_contract_type", + "callsub": "modules.actus_kernel.ActusKernelModule._assert_event_allowed_for_contract_type", "op": "callsub _assert_event_allowed_for_contract_type", "stack_out": [ "aggregate%extract%2#0", @@ -37680,7 +37680,7 @@ ] }, "4090": { - "callsub": "modules.kernel.ActusKernelModule._get_schedule_entry", + "callsub": "modules.actus_kernel.ActusKernelModule._get_schedule_entry", "op": "callsub _get_schedule_entry", "defined_out": [ "entry#0", @@ -38814,7 +38814,7 @@ ] }, "4193": { - "callsub": "modules.kernel.ActusKernelModule._apply_non_cash_schedule_entry", + "callsub": "modules.actus_kernel.ActusKernelModule._apply_non_cash_schedule_entry", "op": "callsub _apply_non_cash_schedule_entry" }, "4196": { @@ -39077,7 +39077,7 @@ "op": "b apply_non_cash_event_bool_merge@17" }, "4221": { - "subroutine": "modules.kernel.ActusKernelModule.get_contract_state[routing]", + "subroutine": "modules.actus_kernel.ActusKernelModule.get_contract_state[routing]", "params": {}, "block": "get_contract_state", "stack_in": [], @@ -41258,7 +41258,7 @@ "stack_out": [] }, "4368": { - "subroutine": "modules.kernel.ActusKernelModule.get_next_due_event[routing]", + "subroutine": "modules.actus_kernel.ActusKernelModule.get_next_due_event[routing]", "params": {}, "block": "get_next_due_event", "stack_in": [], @@ -41610,7 +41610,7 @@ ] }, "4417": { - "block": "get_next_due_event_after_inlined_modules.kernel.ActusKernelModule.get_next_due_event@4", + "block": "get_next_due_event_after_inlined_modules.actus_kernel.ActusKernelModule.get_next_due_event@4", "stack_in": [ "tmp%0#0" ], @@ -41701,7 +41701,7 @@ ] }, "4427": { - "callsub": "modules.kernel.ActusKernelModule._get_schedule_entry", + "callsub": "modules.actus_kernel.ActusKernelModule._get_schedule_entry", "op": "callsub _get_schedule_entry", "defined_out": [ "tmp%0#0" @@ -41711,7 +41711,7 @@ ] }, "4430": { - "op": "b get_next_due_event_after_inlined_modules.kernel.ActusKernelModule.get_next_due_event@4" + "op": "b get_next_due_event_after_inlined_modules.actus_kernel.ActusKernelModule.get_next_due_event@4" }, "4433": { "subroutine": "modules.rbac.RbacModule.contract_update[routing]", @@ -46777,7 +46777,7 @@ ] }, "5150": { - "callsub": "modules.kernel.ActusKernelModule._scaled_mul_div", + "callsub": "modules.actus_kernel.ActusKernelModule._scaled_mul_div", "op": "callsub _scaled_mul_div", "defined_out": [ "box_prefixed_key%0#1", @@ -46884,7 +46884,7 @@ ] }, "5164": { - "callsub": "modules.kernel.ActusKernelModule._scaled_mul_div", + "callsub": "modules.actus_kernel.ActusKernelModule._scaled_mul_div", "op": "callsub _scaled_mul_div", "defined_out": [ "box_prefixed_key%0#1", @@ -48151,7 +48151,7 @@ "op": "retsub" }, "5305": { - "subroutine": "modules.kernel.ActusKernelModule._scaled_mul_div", + "subroutine": "modules.actus_kernel.ActusKernelModule._scaled_mul_div", "params": { "multiplicand#0": "uint64", "multiplier#0": "uint64", @@ -48262,7 +48262,7 @@ "op": "retsub" }, "5329": { - "subroutine": "modules.kernel.ActusKernelModule._amount_to_index_delta", + "subroutine": "modules.actus_kernel.ActusKernelModule._amount_to_index_delta", "params": { "amount#0": "uint64" }, @@ -48425,7 +48425,7 @@ ] }, "5356": { - "callsub": "modules.kernel.ActusKernelModule._scaled_mul_div", + "callsub": "modules.actus_kernel.ActusKernelModule._scaled_mul_div", "op": "callsub _scaled_mul_div", "defined_out": [ "tmp%2#0" @@ -48439,7 +48439,7 @@ "op": "retsub" }, "5360": { - "subroutine": "modules.kernel.ActusKernelModule._index_delta_to_amount", + "subroutine": "modules.actus_kernel.ActusKernelModule._index_delta_to_amount", "params": { "index_delta#0": "uint64" }, @@ -48571,7 +48571,7 @@ ] }, "5383": { - "callsub": "modules.kernel.ActusKernelModule._scaled_mul_div", + "callsub": "modules.actus_kernel.ActusKernelModule._scaled_mul_div", "op": "callsub _scaled_mul_div", "defined_out": [ "tmp%1#0" @@ -48585,7 +48585,7 @@ "op": "retsub" }, "5387": { - "subroutine": "modules.kernel.ActusKernelModule._get_schedule_entry", + "subroutine": "modules.actus_kernel.ActusKernelModule._get_schedule_entry", "params": { "event_id#0": "uint64" }, @@ -48943,7 +48943,7 @@ "op": "retsub" }, "5440": { - "subroutine": "modules.kernel.ActusKernelModule._assert_event_allowed_for_contract_type", + "subroutine": "modules.actus_kernel.ActusKernelModule._assert_event_allowed_for_contract_type", "params": { "contract_type#0": "uint64", "event_type#0": "uint64" @@ -49118,7 +49118,7 @@ }, "5482": { "error": "Invalid ACTUS configuration", - "block": "_assert_event_allowed_for_contract_type_after_inlined_modules.kernel.ActusKernelModule._event_allowed_for_contract_type@34", + "block": "_assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34", "stack_in": [ "tmp%0#0" ], @@ -49155,7 +49155,7 @@ ] }, "5490": { - "op": "b _assert_event_allowed_for_contract_type_after_inlined_modules.kernel.ActusKernelModule._event_allowed_for_contract_type@34" + "op": "b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34" }, "5493": { "block": "_assert_event_allowed_for_contract_type_after_if_else@9", @@ -49299,7 +49299,7 @@ ] }, "5526": { - "op": "b _assert_event_allowed_for_contract_type_after_inlined_modules.kernel.ActusKernelModule._event_allowed_for_contract_type@34", + "op": "b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34", "defined_out": [ "tmp%0#0" ], @@ -49319,7 +49319,7 @@ ] }, "5530": { - "op": "b _assert_event_allowed_for_contract_type_after_inlined_modules.kernel.ActusKernelModule._event_allowed_for_contract_type@34", + "op": "b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34", "defined_out": [ "tmp%0#0" ], @@ -49467,7 +49467,7 @@ ] }, "5565": { - "op": "b _assert_event_allowed_for_contract_type_after_inlined_modules.kernel.ActusKernelModule._event_allowed_for_contract_type@34", + "op": "b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34", "defined_out": [ "tmp%0#0" ], @@ -49487,7 +49487,7 @@ ] }, "5569": { - "op": "b _assert_event_allowed_for_contract_type_after_inlined_modules.kernel.ActusKernelModule._event_allowed_for_contract_type@34", + "op": "b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34", "defined_out": [ "tmp%0#0" ], @@ -49661,7 +49661,7 @@ ] }, "5613": { - "op": "b _assert_event_allowed_for_contract_type_after_inlined_modules.kernel.ActusKernelModule._event_allowed_for_contract_type@34", + "op": "b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34", "defined_out": [ "tmp%0#0" ], @@ -49681,7 +49681,7 @@ ] }, "5617": { - "op": "b _assert_event_allowed_for_contract_type_after_inlined_modules.kernel.ActusKernelModule._event_allowed_for_contract_type@34", + "op": "b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34", "defined_out": [ "tmp%0#0" ], @@ -49754,7 +49754,7 @@ ] }, "5633": { - "op": "b _assert_event_allowed_for_contract_type_after_inlined_modules.kernel.ActusKernelModule._event_allowed_for_contract_type@34" + "op": "b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34" }, "5636": { "block": "_assert_event_allowed_for_contract_type_after_if_else@33", @@ -49768,10 +49768,10 @@ ] }, "5637": { - "op": "b _assert_event_allowed_for_contract_type_after_inlined_modules.kernel.ActusKernelModule._event_allowed_for_contract_type@34" + "op": "b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34" }, "5640": { - "subroutine": "modules.kernel.ActusKernelModule._is_dynamic_annuity", + "subroutine": "modules.actus_kernel.ActusKernelModule._is_dynamic_annuity", "params": {}, "block": "_is_dynamic_annuity", "stack_in": [], @@ -49904,7 +49904,7 @@ "op": "retsub" }, "5662": { - "subroutine": "modules.kernel.ActusKernelModule._entry_interest_segment", + "subroutine": "modules.actus_kernel.ActusKernelModule._entry_interest_segment", "params": { "entry#0": "bytes" }, @@ -50227,7 +50227,7 @@ ] }, "5711": { - "callsub": "modules.kernel.ActusKernelModule._scaled_mul_div", + "callsub": "modules.actus_kernel.ActusKernelModule._scaled_mul_div", "op": "callsub _scaled_mul_div", "defined_out": [ "accrued#0" @@ -50295,7 +50295,7 @@ ] }, "5722": { - "callsub": "modules.kernel.ActusKernelModule._scaled_mul_div", + "callsub": "modules.actus_kernel.ActusKernelModule._scaled_mul_div", "op": "callsub _scaled_mul_div", "defined_out": [ "tmp%4#0", @@ -50327,7 +50327,7 @@ "op": "retsub" }, "5730": { - "subroutine": "modules.kernel.ActusKernelModule._discount_annuity_factor", + "subroutine": "modules.actus_kernel.ActusKernelModule._discount_annuity_factor", "params": { "discount_factor#0": "uint64", "redemption_factor#0": "uint64" @@ -50472,7 +50472,7 @@ ] }, "5755": { - "callsub": "modules.kernel.ActusKernelModule._scaled_mul_div", + "callsub": "modules.actus_kernel.ActusKernelModule._scaled_mul_div", "op": "callsub _scaled_mul_div", "defined_out": [ "maybe_value%0#0", @@ -50576,7 +50576,7 @@ ] }, "5771": { - "callsub": "modules.kernel.ActusKernelModule._scaled_mul_div", + "callsub": "modules.actus_kernel.ActusKernelModule._scaled_mul_div", "op": "callsub _scaled_mul_div", "defined_out": [ "tmp%4#0" @@ -50590,7 +50590,7 @@ "op": "retsub" }, "5775": { - "subroutine": "modules.kernel.ActusKernelModule._apply_non_cash_schedule_entry", + "subroutine": "modules.actus_kernel.ActusKernelModule._apply_non_cash_schedule_entry", "params": { "entry#0": "bytes", "payload#0": "bytes" @@ -52393,7 +52393,7 @@ ] }, "5893": { - "callsub": "modules.kernel.ActusKernelModule._emit_execution_event", + "callsub": "modules.actus_kernel.ActusKernelModule._emit_execution_event", "op": "callsub _emit_execution_event", "defined_out": [ "entry#0", @@ -52765,7 +52765,7 @@ ] }, "5922": { - "callsub": "modules.kernel.ActusKernelModule._entry_interest_segment", + "callsub": "modules.actus_kernel.ActusKernelModule._entry_interest_segment", "op": "callsub _entry_interest_segment", "defined_out": [ "_entry_interest_segment%0#0", @@ -53225,7 +53225,7 @@ ] }, "5955": { - "callsub": "modules.kernel.ActusKernelModule._scaled_mul_div", + "callsub": "modules.actus_kernel.ActusKernelModule._scaled_mul_div", "op": "callsub _scaled_mul_div", "defined_out": [ "event_type#0", @@ -54504,7 +54504,7 @@ "event_type#0", "tmp%4#0" ], - "callsub": "modules.kernel.ActusKernelModule._is_dynamic_annuity", + "callsub": "modules.actus_kernel.ActusKernelModule._is_dynamic_annuity", "op": "callsub _is_dynamic_annuity", "defined_out": [ "tmp%18#0" @@ -55023,7 +55023,7 @@ ] }, "6089": { - "callsub": "modules.kernel.ActusKernelModule._discount_annuity_factor", + "callsub": "modules.actus_kernel.ActusKernelModule._discount_annuity_factor", "op": "callsub _discount_annuity_factor", "stack_out": [ "future_entry#0", @@ -55479,7 +55479,7 @@ ] }, "6121": { - "callsub": "modules.kernel.ActusKernelModule._get_schedule_entry", + "callsub": "modules.actus_kernel.ActusKernelModule._get_schedule_entry", "op": "callsub _get_schedule_entry", "defined_out": [ "future_entry#0", @@ -56247,7 +56247,7 @@ ] }, "6183": { - "callsub": "modules.kernel.ActusKernelModule._discount_annuity_factor", + "callsub": "modules.actus_kernel.ActusKernelModule._discount_annuity_factor", "op": "callsub _discount_annuity_factor", "stack_out": [ "future_entry#0", @@ -56942,7 +56942,7 @@ ] }, "6231": { - "callsub": "modules.kernel.ActusKernelModule._scaled_mul_div", + "callsub": "modules.actus_kernel.ActusKernelModule._scaled_mul_div", "op": "callsub _scaled_mul_div", "defined_out": [ "denominator#0", @@ -57285,7 +57285,7 @@ ] }, "6251": { - "callsub": "modules.kernel.ActusKernelModule._emit_execution_event", + "callsub": "modules.actus_kernel.ActusKernelModule._emit_execution_event", "op": "callsub _emit_execution_event", "defined_out": [ "entry#0" @@ -58376,7 +58376,7 @@ "op": "b _apply_non_cash_schedule_entry_after_if_else@18" }, "6349": { - "subroutine": "modules.kernel.ActusKernelModule._emit_execution_event", + "subroutine": "modules.actus_kernel.ActusKernelModule._emit_execution_event", "params": { "entry#0": "bytes", "payoff#0": "uint64", @@ -58561,7 +58561,7 @@ ] }, "6380": { - "block": "_emit_execution_event_after_inlined_modules.kernel.ActusKernelModule._payoff_sign@7", + "block": "_emit_execution_event_after_inlined_modules.actus_kernel.ActusKernelModule._payoff_sign@7", "stack_in": [ "tmp%0#0", "values%0#0", @@ -59682,7 +59682,7 @@ ] }, "6464": { - "op": "b _emit_execution_event_after_inlined_modules.kernel.ActusKernelModule._payoff_sign@7" + "op": "b _emit_execution_event_after_inlined_modules.actus_kernel.ActusKernelModule._payoff_sign@7" }, "6467": { "block": "_emit_execution_event_after_if_else@6", @@ -59709,7 +59709,7 @@ ] }, "6470": { - "op": "b _emit_execution_event_after_inlined_modules.kernel.ActusKernelModule._payoff_sign@7" + "op": "b _emit_execution_event_after_inlined_modules.actus_kernel.ActusKernelModule._payoff_sign@7" }, "6473": { "subroutine": "modules.rbac.RbacModule._role_is_active", diff --git a/smart_contracts/artifacts/d_asa/DASA.approval.teal b/smart_contracts/artifacts/d_asa/DASA.approval.teal index 928498ba..8eb9be18 100644 --- a/smart_contracts/artifacts/d_asa/DASA.approval.teal +++ b/smart_contracts/artifacts/d_asa/DASA.approval.teal @@ -29,183 +29,183 @@ main: bytec 41 // "asset_defaulted" intc_0 // 0 app_global_put - // modules/kernel.py:56-57 + // modules/actus_kernel.py:56-57 // # Contract // self.status = UInt64(enums.STATUS_INACTIVE) bytec_1 // "status" intc_0 // 0 app_global_put - // modules/kernel.py:58 + // modules/actus_kernel.py:58 // self.contract_type = UInt64() bytec 12 // "contract_type" intc_0 // 0 app_global_put - // modules/kernel.py:60-61 + // modules/actus_kernel.py:60-61 // # Prospectus (Informational) // self.prospectus_hash = Bytes() bytec 42 // "prospectus_hash" pushbytes 0x app_global_put - // modules/kernel.py:62 + // modules/actus_kernel.py:62 // self.prospectus_url = String() bytec 43 // "prospectus_url" pushbytes "" app_global_put - // modules/kernel.py:64-65 + // modules/actus_kernel.py:64-65 // # Denomination // self.denomination_asset_id = Asset() bytec 44 // "denomination_asset_id" intc_0 // 0 app_global_put - // modules/kernel.py:66 + // modules/actus_kernel.py:66 // self.settlement_asset_id = Asset() bytec 19 // "settlement_asset_id" intc_0 // 0 app_global_put - // modules/kernel.py:68-69 + // modules/actus_kernel.py:68-69 // # Time // self.initial_exchange_date = typ.TimeStamp() bytec 26 // "initial_exchange_date" intc_0 // 0 app_global_put - // modules/kernel.py:70 + // modules/actus_kernel.py:70 // self.maturity_date = typ.TimeStamp() bytec 45 // "maturity_date" intc_0 // 0 app_global_put - // modules/kernel.py:71 + // modules/actus_kernel.py:71 // self.transfer_opening_date = typ.TimeStamp() bytec 27 // "transfer_opening_date" intc_0 // 0 app_global_put - // modules/kernel.py:72 + // modules/actus_kernel.py:72 // self.transfer_closure_date = typ.TimeStamp() bytec 28 // "transfer_closure_date" intc_0 // 0 app_global_put - // modules/kernel.py:74-75 + // modules/actus_kernel.py:74-75 // # Day Count Convention // self.day_count_convention = UInt64() bytec 46 // "day_count_convention" intc_0 // 0 app_global_put - // modules/kernel.py:77-78 + // modules/actus_kernel.py:77-78 // # Units // self.total_units = UInt64() bytec 13 // "total_units" intc_0 // 0 app_global_put - // modules/kernel.py:79 + // modules/actus_kernel.py:79 // self.reserved_units_total = UInt64() bytec 10 // "reserved_units_total" intc_0 // 0 app_global_put - // modules/kernel.py:81-82 + // modules/actus_kernel.py:81-82 // # Principal // self.initial_exchange_amount = UInt64() bytec 20 // "initial_exchange_amount" intc_0 // 0 app_global_put - // modules/kernel.py:83 + // modules/actus_kernel.py:83 // self.outstanding_principal = UInt64() bytec_3 // "outstanding_principal" intc_0 // 0 app_global_put - // modules/kernel.py:84 + // modules/actus_kernel.py:84 // self.next_principal_redemption = UInt64() bytec 14 // "next_principal_redemption" intc_0 // 0 app_global_put - // modules/kernel.py:85 + // modules/actus_kernel.py:85 // self.dynamic_principal_redemption = False bytec 34 // "dynamic_principal_redemption" intc_0 // 0 app_global_put - // modules/kernel.py:87-88 + // modules/actus_kernel.py:87-88 // # Interest // self.interest_calculation_base = UInt64() bytec 7 // "interest_calculation_base" intc_0 // 0 app_global_put - // modules/kernel.py:89 + // modules/actus_kernel.py:89 // self.accrued_interest = UInt64() bytec 6 // "accrued_interest" intc_0 // 0 app_global_put - // modules/kernel.py:91-92 + // modules/actus_kernel.py:91-92 // # Interest Rates // self.nominal_interest_rate = UInt64() bytec 9 // "nominal_interest_rate" intc_0 // 0 app_global_put - // modules/kernel.py:93 + // modules/actus_kernel.py:93 // self.rate_reset_spread = UInt64() bytec 35 // "rate_reset_spread" intc_0 // 0 app_global_put - // modules/kernel.py:94 + // modules/actus_kernel.py:94 // self.rate_reset_multiplier = UInt64() bytec 36 // "rate_reset_multiplier" intc_0 // 0 app_global_put - // modules/kernel.py:95 + // modules/actus_kernel.py:95 // self.rate_reset_floor = UInt64() bytec 29 // "rate_reset_floor" intc_0 // 0 app_global_put - // modules/kernel.py:96 + // modules/actus_kernel.py:96 // self.rate_reset_cap = UInt64() bytec 30 // "rate_reset_cap" intc_0 // 0 app_global_put - // modules/kernel.py:97 + // modules/actus_kernel.py:97 // self.rate_reset_next = UInt64() bytec 37 // "rate_reset_next" intc_0 // 0 app_global_put - // modules/kernel.py:98 + // modules/actus_kernel.py:98 // self.has_rate_reset_floor = False bytec 38 // "has_rate_reset_floor" intc_0 // 0 app_global_put - // modules/kernel.py:99 + // modules/actus_kernel.py:99 // self.has_rate_reset_cap = False bytec 39 // "has_rate_reset_cap" intc_0 // 0 app_global_put - // modules/kernel.py:101-102 + // modules/actus_kernel.py:101-102 // # Primary Distribution // self.reserved_principal = UInt64() bytec 11 // "reserved_principal" intc_0 // 0 app_global_put - // modules/kernel.py:103 + // modules/actus_kernel.py:103 // self.reserved_interest = UInt64() bytec 15 // "reserved_interest" intc_0 // 0 app_global_put - // modules/kernel.py:105-106 + // modules/actus_kernel.py:105-106 // # Cumulative Per-Unit Fixed-Point Indexes // self.cumulative_interest_index = UInt64() bytec 16 // "cumulative_interest_index" intc_0 // 0 app_global_put - // modules/kernel.py:107 + // modules/actus_kernel.py:107 // self.cumulative_principal_index = UInt64() bytec 17 // "cumulative_principal_index" intc_0 // 0 app_global_put - // modules/kernel.py:115 + // modules/actus_kernel.py:115 // self.event_cursor = UInt64() bytec_2 // "event_cursor" intc_0 // 0 app_global_put - // modules/kernel.py:116 + // modules/actus_kernel.py:116 // self.schedule_entry_count = UInt64() bytec 4 // "schedule_entry_count" intc_0 // 0 app_global_put - // modules/kernel.py:118-119 + // modules/actus_kernel.py:118-119 // # Scaling // self.fixed_point_scale = UInt64() bytec 5 // "fixed_point_scale" @@ -318,7 +318,7 @@ fund_due_cashflows: == assert // invalid number of bytes for arc4.uint64 btoi - // modules/kernel.py:143 + // modules/actus_kernel.py:143 // assert self.status != UInt64(enums.STATUS_INACTIVE), err.NOT_CONFIGURED intc_0 // 0 bytec_1 // "status" @@ -334,7 +334,7 @@ fund_due_cashflows: // modules/payment_agent.py:52 // self._assert_is_not_asset_suspended() callsub _assert_is_not_asset_suspended - // modules/kernel.py:135 + // modules/actus_kernel.py:135 // return self.status == UInt64(enums.STATUS_PENDING_IED) intc_0 // 0 bytec_1 // "status" @@ -342,7 +342,7 @@ fund_due_cashflows: assert // check self.status exists pushint 50 == - // modules/kernel.py:147 + // modules/actus_kernel.py:147 // assert not self._status_is_pending_ied(), err.PENDING_IED ! assert // IED not yet executed @@ -404,10 +404,10 @@ fund_due_cashflows_while_top@2: getbyte dup bury 16 - // modules/kernel.py:351 + // modules/actus_kernel.py:351 // UInt64(enums.EVT_IP), intc_2 // 8 - // modules/kernel.py:350-354 + // modules/actus_kernel.py:350-354 // return event_type in ( // UInt64(enums.EVT_IP), // UInt64(enums.EVT_PR), @@ -418,10 +418,10 @@ fund_due_cashflows_while_top@2: bury 7 bnz fund_due_cashflows_bool_true@50 dig 14 - // modules/kernel.py:352 + // modules/actus_kernel.py:352 // UInt64(enums.EVT_PR), pushint 3 - // modules/kernel.py:350-354 + // modules/actus_kernel.py:350-354 // return event_type in ( // UInt64(enums.EVT_IP), // UInt64(enums.EVT_PR), @@ -430,10 +430,10 @@ fund_due_cashflows_while_top@2: == bnz fund_due_cashflows_bool_true@50 dig 14 - // modules/kernel.py:353 + // modules/actus_kernel.py:353 // UInt64(enums.EVT_MD), pushint 19 - // modules/kernel.py:350-354 + // modules/actus_kernel.py:350-354 // return event_type in ( // UInt64(enums.EVT_IP), // UInt64(enums.EVT_PR), @@ -449,7 +449,7 @@ fund_due_cashflows_bool_merge@52: // modules/payment_agent.py:66 // if not self._event_is_cash(entry.event_type.as_uint64()): bz fund_due_cashflows_after_while@9 - // modules/kernel.py:548 + // modules/actus_kernel.py:548 // assert entry.event_id == self.event_cursor, err.INVALID_EVENT_CURSOR dig 15 intc_0 // 0 @@ -460,13 +460,13 @@ fund_due_cashflows_bool_merge@52: assert // check self.event_cursor exists == assert // Invalid event cursor - // modules/kernel.py:549 + // modules/actus_kernel.py:549 // assert entry.scheduled_time <= Global.latest_timestamp, err.NO_DUE_CASHFLOW dig 4 global LatestTimestamp <= assert // No due cashflow to pay - // modules/kernel.py:413 + // modules/actus_kernel.py:413 // if event_type not in (UInt64(enums.EVT_IP), UInt64(enums.EVT_MD)): dig 5 bnz fund_due_cashflows_after_if_else@13 @@ -474,20 +474,20 @@ fund_due_cashflows_bool_merge@52: pushint 19 == bnz fund_due_cashflows_after_if_else@13 - // modules/kernel.py:414 + // modules/actus_kernel.py:414 // return UInt64(0) intc_0 // 0 bury 13 -fund_due_cashflows_after_inlined_modules.kernel.ActusKernelModule._entry_interest_amount@14: - // modules/kernel.py:426 +fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_interest_amount@14: + // modules/actus_kernel.py:426 // event_type = entry.event_type.as_uint64() dig 15 intc_2 // 8 getbyte dup bury 16 - // modules/kernel.py:427 + // modules/actus_kernel.py:427 // if event_type not in (UInt64(enums.EVT_PR), UInt64(enums.EVT_MD)): pushint 3 == @@ -496,19 +496,19 @@ fund_due_cashflows_after_inlined_modules.kernel.ActusKernelModule._entry_interes pushint 19 == bnz fund_due_cashflows_after_if_else@17 - // modules/kernel.py:428 + // modules/actus_kernel.py:428 // return UInt64(0) intc_0 // 0 bury 8 -fund_due_cashflows_after_inlined_modules.kernel.ActusKernelModule._entry_principal_amount@26: - // modules/kernel.py:553 +fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@26: + // modules/actus_kernel.py:553 // next_outstanding_principal = entry.next_outstanding_principal dig 15 pushint 49 extract_uint64 bury 10 - // modules/kernel.py:556 + // modules/actus_kernel.py:556 // if self._is_dynamic_annuity(): callsub _is_dynamic_annuity bnz fund_due_cashflows_if_body@27 @@ -516,37 +516,37 @@ fund_due_cashflows_after_inlined_modules.kernel.ActusKernelModule._entry_princip bury 11 fund_due_cashflows_after_if_else@36: - // modules/kernel.py:572-574 + // modules/actus_kernel.py:572-574 // # Funding uses per-unit cumulative indices so each holder can settle // # independently from its current unit balance. // interest_index_delta = self._amount_to_index_delta(interest_amount_due) dig 12 callsub _amount_to_index_delta - // modules/kernel.py:575 + // modules/actus_kernel.py:575 // principal_index_delta = self._amount_to_index_delta(principal_amount_due) dig 8 callsub _amount_to_index_delta - // modules/kernel.py:576 + // modules/actus_kernel.py:576 // interest_amount = self._index_delta_to_amount(interest_index_delta) dig 1 callsub _index_delta_to_amount dup cover 2 bury 17 - // modules/kernel.py:577 + // modules/actus_kernel.py:577 // principal_amount = self._index_delta_to_amount(principal_index_delta) dup callsub _index_delta_to_amount dup bury 13 - // modules/kernel.py:578 + // modules/actus_kernel.py:578 // required_amount = interest_amount + principal_amount dig 2 dig 1 + dup bury 12 - // modules/kernel.py:727 + // modules/actus_kernel.py:727 // balance = self.settlement_asset_id.balance(Global.current_application_address) global CurrentApplicationAddress intc_0 // 0 @@ -555,7 +555,7 @@ fund_due_cashflows_after_if_else@36: assert // check self.settlement_asset_id exists asset_holding_get AssetBalance assert // account opted into asset - // modules/kernel.py:456 + // modules/actus_kernel.py:456 // return self.reserved_interest + self.reserved_principal intc_0 // 0 bytec 15 // "reserved_interest" @@ -567,34 +567,34 @@ fund_due_cashflows_after_if_else@36: assert // check self.reserved_principal exists dig 1 + - // modules/kernel.py:729 + // modules/actus_kernel.py:729 // assert balance >= reserved_total, err.NOT_ENOUGH_FUNDS dig 2 dig 1 >= assert // Not enough funds for the payment - // modules/kernel.py:730 + // modules/actus_kernel.py:730 // return balance - reserved_total uncover 2 swap - - // modules/kernel.py:580 + // modules/actus_kernel.py:580 // self._available_settlement_funds() >= required_amount uncover 2 >= - // modules/kernel.py:579-581 + // modules/actus_kernel.py:579-581 // assert ( // self._available_settlement_funds() >= required_amount // ), err.NOT_ENOUGH_FUNDS assert // Not enough funds for the payment - // modules/kernel.py:583 + // modules/actus_kernel.py:583 // self.reserved_interest += interest_amount uncover 3 + bytec 15 // "reserved_interest" swap app_global_put - // modules/kernel.py:584 + // modules/actus_kernel.py:584 // self.reserved_principal += principal_amount intc_0 // 0 bytec 11 // "reserved_principal" @@ -604,7 +604,7 @@ fund_due_cashflows_after_if_else@36: bytec 11 // "reserved_principal" swap app_global_put - // modules/kernel.py:585 + // modules/actus_kernel.py:585 // self.cumulative_interest_index += interest_index_delta intc_0 // 0 bytec 16 // "cumulative_interest_index" @@ -615,7 +615,7 @@ fund_due_cashflows_after_if_else@36: bytec 16 // "cumulative_interest_index" swap app_global_put - // modules/kernel.py:586 + // modules/actus_kernel.py:586 // self.cumulative_principal_index += principal_index_delta intc_0 // 0 bytec 17 // "cumulative_principal_index" @@ -625,7 +625,7 @@ fund_due_cashflows_after_if_else@36: bytec 17 // "cumulative_principal_index" swap app_global_put - // modules/kernel.py:587 + // modules/actus_kernel.py:587 // if entry.event_type.as_uint64() == UInt64(enums.EVT_PR): dig 15 intc_2 // 8 @@ -633,7 +633,7 @@ fund_due_cashflows_after_if_else@36: pushint 3 == bz fund_due_cashflows_else_body@38 - // modules/kernel.py:588-589 + // modules/actus_kernel.py:588-589 // # For PR, the period interest stays accrued until a later IP or MD. // self.accrued_interest += self._entry_interest_segment(entry) intc_0 // 0 @@ -649,14 +649,14 @@ fund_due_cashflows_after_if_else@36: app_global_put fund_due_cashflows_after_if_else@39: - // modules/kernel.py:592 + // modules/actus_kernel.py:592 // if not self._is_dynamic_annuity() or entry.event_type.as_uint64() == UInt64( callsub _is_dynamic_annuity bz fund_due_cashflows_if_body@41 dig 15 intc_2 // 8 getbyte - // modules/kernel.py:592-594 + // modules/actus_kernel.py:592-594 // if not self._is_dynamic_annuity() or entry.event_type.as_uint64() == UInt64( // enums.EVT_MD // ): @@ -665,7 +665,7 @@ fund_due_cashflows_after_if_else@39: bz fund_due_cashflows_after_if_else@42 fund_due_cashflows_if_body@41: - // modules/kernel.py:595 + // modules/actus_kernel.py:595 // self.next_principal_redemption = entry.next_principal_redemption dig 15 pushint 41 @@ -675,17 +675,17 @@ fund_due_cashflows_if_body@41: app_global_put fund_due_cashflows_after_if_else@42: - // modules/kernel.py:596 + // modules/actus_kernel.py:596 // self.outstanding_principal = next_outstanding_principal bytec_3 // "outstanding_principal" dig 10 app_global_put - // modules/kernel.py:597 + // modules/actus_kernel.py:597 // self.interest_calculation_base = next_interest_base bytec 7 // "interest_calculation_base" dig 11 app_global_put - // modules/kernel.py:598 + // modules/actus_kernel.py:598 // self.event_cursor += UInt64(1) intc_0 // 0 bytec_2 // "event_cursor" @@ -696,41 +696,41 @@ fund_due_cashflows_after_if_else@42: bytec_2 // "event_cursor" swap app_global_put - // modules/kernel.py:600 + // modules/actus_kernel.py:600 // if entry.event_type == arc4.UInt8( dig 15 extract 8 1 - // modules/kernel.py:600-602 + // modules/actus_kernel.py:600-602 // if entry.event_type == arc4.UInt8( // enums.EVT_MD // ) and self.outstanding_principal == UInt64(0): pushbytes 0x13 b== bz fund_due_cashflows_after_if_else@45 - // modules/kernel.py:602 + // modules/actus_kernel.py:602 // ) and self.outstanding_principal == UInt64(0): intc_0 // 0 bytec_3 // "outstanding_principal" app_global_get_ex assert // check self.outstanding_principal exists - // modules/kernel.py:600-602 + // modules/actus_kernel.py:600-602 // if entry.event_type == arc4.UInt8( // enums.EVT_MD // ) and self.outstanding_principal == UInt64(0): bnz fund_due_cashflows_after_if_else@45 - // modules/kernel.py:603 + // modules/actus_kernel.py:603 // self.status = UInt64(enums.STATUS_ENDED) bytec_1 // "status" pushint 200 app_global_put - // modules/kernel.py:604 + // modules/actus_kernel.py:604 // self.interest_calculation_base = UInt64(0) bytec 7 // "interest_calculation_base" intc_0 // 0 app_global_put fund_due_cashflows_after_if_else@45: - // modules/kernel.py:606-610 + // modules/actus_kernel.py:606-610 // self._emit_execution_event( // entry=entry, // payoff=interest_amount + principal_amount, @@ -762,7 +762,7 @@ fund_due_cashflows_after_if_else@45: b fund_due_cashflows_while_top@2 fund_due_cashflows_else_body@38: - // modules/kernel.py:591 + // modules/actus_kernel.py:591 // self.accrued_interest = UInt64(0) bytec 6 // "accrued_interest" intc_0 // 0 @@ -770,21 +770,21 @@ fund_due_cashflows_else_body@38: b fund_due_cashflows_after_if_else@39 fund_due_cashflows_if_body@27: - // modules/kernel.py:557 + // modules/actus_kernel.py:557 // event_type = entry.event_type.as_uint64() dig 15 intc_2 // 8 getbyte dup bury 16 - // modules/kernel.py:558-560 + // modules/actus_kernel.py:558-560 // # Dynamic annuities derive next state from the payment decomposition, // # not only from the precomputed `next_*` fields. // if event_type == UInt64(enums.EVT_PR): pushint 3 == bz fund_due_cashflows_else_body@29 - // modules/kernel.py:562 + // modules/actus_kernel.py:562 // self.outstanding_principal - principal_amount_due intc_0 // 0 bytec_3 // "outstanding_principal" @@ -798,13 +798,13 @@ fund_due_cashflows_if_body@27: b fund_due_cashflows_after_if_else@36 fund_due_cashflows_else_body@29: - // modules/kernel.py:565 + // modules/actus_kernel.py:565 // elif event_type == UInt64(enums.EVT_IP): dig 14 intc_2 // 8 == bz fund_due_cashflows_else_body@31 - // modules/kernel.py:566 + // modules/actus_kernel.py:566 // next_outstanding_principal = self.outstanding_principal intc_0 // 0 bytec_3 // "outstanding_principal" @@ -812,7 +812,7 @@ fund_due_cashflows_else_body@29: swap bury 11 assert // check self.outstanding_principal exists - // modules/kernel.py:567 + // modules/actus_kernel.py:567 // next_interest_base = self.interest_calculation_base intc_0 // 0 bytec 7 // "interest_calculation_base" @@ -823,7 +823,7 @@ fund_due_cashflows_else_body@29: b fund_due_cashflows_after_if_else@36 fund_due_cashflows_else_body@31: - // modules/kernel.py:568 + // modules/actus_kernel.py:568 // elif event_type == UInt64(enums.EVT_MD): dig 14 pushint 19 @@ -834,40 +834,40 @@ fund_due_cashflows_else_body@31: b fund_due_cashflows_after_if_else@36 fund_due_cashflows_if_body@32: - // modules/kernel.py:569 + // modules/actus_kernel.py:569 // next_outstanding_principal = UInt64(0) intc_0 // 0 bury 10 - // modules/kernel.py:570 + // modules/actus_kernel.py:570 // next_interest_base = UInt64(0) intc_0 // 0 bury 11 b fund_due_cashflows_after_if_else@36 fund_due_cashflows_after_if_else@17: - // modules/kernel.py:429 + // modules/actus_kernel.py:429 // if self._is_dynamic_annuity(): callsub _is_dynamic_annuity bz fund_due_cashflows_after_if_else@25 - // modules/kernel.py:430 + // modules/actus_kernel.py:430 // if event_type == UInt64(enums.EVT_MD): dig 14 pushint 19 == bz fund_due_cashflows_after_if_else@20 - // modules/kernel.py:431 + // modules/actus_kernel.py:431 // return self.outstanding_principal intc_0 // 0 bytec_3 // "outstanding_principal" app_global_get_ex assert // check self.outstanding_principal exists bury 8 - // modules/kernel.py:552 + // modules/actus_kernel.py:552 // principal_amount_due = self._entry_principal_amount(entry) - b fund_due_cashflows_after_inlined_modules.kernel.ActusKernelModule._entry_principal_amount@26 + b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@26 fund_due_cashflows_after_if_else@20: - // modules/kernel.py:432 + // modules/actus_kernel.py:432 // interest_due = self.accrued_interest + self._entry_interest_segment(entry) intc_0 // 0 bytec 6 // "accrued_interest" @@ -879,7 +879,7 @@ fund_due_cashflows_after_if_else@20: + dup bury 13 - // modules/kernel.py:433 + // modules/actus_kernel.py:433 // if self.next_principal_redemption <= interest_due: intc_0 // 0 bytec 14 // "next_principal_redemption" @@ -887,16 +887,16 @@ fund_due_cashflows_after_if_else@20: assert // check self.next_principal_redemption exists >= bz fund_due_cashflows_after_if_else@22 - // modules/kernel.py:434 + // modules/actus_kernel.py:434 // return UInt64(0) intc_0 // 0 bury 8 - // modules/kernel.py:552 + // modules/actus_kernel.py:552 // principal_amount_due = self._entry_principal_amount(entry) - b fund_due_cashflows_after_inlined_modules.kernel.ActusKernelModule._entry_principal_amount@26 + b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@26 fund_due_cashflows_after_if_else@22: - // modules/kernel.py:435 + // modules/actus_kernel.py:435 // principal_amount = self.next_principal_redemption - interest_due intc_0 // 0 bytec 14 // "next_principal_redemption" @@ -906,7 +906,7 @@ fund_due_cashflows_after_if_else@22: - dup bury 10 - // modules/kernel.py:436 + // modules/actus_kernel.py:436 // if principal_amount > self.outstanding_principal: intc_0 // 0 bytec_3 // "outstanding_principal" @@ -914,26 +914,26 @@ fund_due_cashflows_after_if_else@22: assert // check self.outstanding_principal exists > bz fund_due_cashflows_after_if_else@24 - // modules/kernel.py:437 + // modules/actus_kernel.py:437 // return self.outstanding_principal intc_0 // 0 bytec_3 // "outstanding_principal" app_global_get_ex assert // check self.outstanding_principal exists bury 8 - // modules/kernel.py:552 + // modules/actus_kernel.py:552 // principal_amount_due = self._entry_principal_amount(entry) - b fund_due_cashflows_after_inlined_modules.kernel.ActusKernelModule._entry_principal_amount@26 + b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@26 fund_due_cashflows_after_if_else@24: dig 8 bury 8 - // modules/kernel.py:552 + // modules/actus_kernel.py:552 // principal_amount_due = self._entry_principal_amount(entry) - b fund_due_cashflows_after_inlined_modules.kernel.ActusKernelModule._entry_principal_amount@26 + b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@26 fund_due_cashflows_after_if_else@25: - // modules/kernel.py:440 + // modules/actus_kernel.py:440 // entry.next_outstanding_principal <= self.outstanding_principal dig 15 pushint 49 @@ -944,22 +944,22 @@ fund_due_cashflows_after_if_else@25: assert // check self.outstanding_principal exists dup2 <= - // modules/kernel.py:439-441 + // modules/actus_kernel.py:439-441 // assert ( // entry.next_outstanding_principal <= self.outstanding_principal // ), err.INVALID_ACTUS_CONFIG assert // Invalid ACTUS configuration - // modules/kernel.py:442 + // modules/actus_kernel.py:442 // return self.outstanding_principal - entry.next_outstanding_principal swap - bury 8 - // modules/kernel.py:552 + // modules/actus_kernel.py:552 // principal_amount_due = self._entry_principal_amount(entry) - b fund_due_cashflows_after_inlined_modules.kernel.ActusKernelModule._entry_principal_amount@26 + b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@26 fund_due_cashflows_after_if_else@13: - // modules/kernel.py:415 + // modules/actus_kernel.py:415 // return self.accrued_interest + self._entry_interest_segment(entry) intc_0 // 0 bytec 6 // "accrued_interest" @@ -970,9 +970,9 @@ fund_due_cashflows_after_if_else@13: bury 18 + bury 13 - // modules/kernel.py:551 + // modules/actus_kernel.py:551 // interest_amount_due = self._entry_interest_amount(entry) - b fund_due_cashflows_after_inlined_modules.kernel.ActusKernelModule._entry_interest_amount@14 + b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_interest_amount@14 fund_due_cashflows_after_while@9: // modules/payment_agent.py:74 @@ -1051,7 +1051,7 @@ claim_due_cashflows: assert // invalid number of bytes for arc4.dynamic_array extract 2 0 swap - // modules/kernel.py:143 + // modules/actus_kernel.py:143 // assert self.status != UInt64(enums.STATUS_INACTIVE), err.NOT_CONFIGURED intc_0 // 0 bytec_1 // "status" @@ -1132,7 +1132,7 @@ claim_due_cashflows_after_if_else@17: // modules/payment_agent.py:95 // self._assert_is_not_asset_suspended() callsub _assert_is_not_asset_suspended - // modules/kernel.py:135 + // modules/actus_kernel.py:135 // return self.status == UInt64(enums.STATUS_PENDING_IED) intc_0 // 0 bytec_1 // "status" @@ -1140,7 +1140,7 @@ claim_due_cashflows_after_if_else@17: assert // check self.status exists pushint 50 == - // modules/kernel.py:147 + // modules/actus_kernel.py:147 // assert not self._status_is_pending_ied(), err.PENDING_IED ! assert // IED not yet executed @@ -1482,7 +1482,7 @@ primary_distribution: btoi dup cover 2 - // modules/kernel.py:143 + // modules/actus_kernel.py:143 // assert self.status != UInt64(enums.STATUS_INACTIVE), err.NOT_CONFIGURED intc_0 // 0 bytec_1 // "status" @@ -1501,7 +1501,7 @@ primary_distribution: // modules/transfer_agent.py:44 // self._assert_is_not_asset_suspended() callsub _assert_is_not_asset_suspended - // modules/kernel.py:135 + // modules/actus_kernel.py:135 // return self.status == UInt64(enums.STATUS_PENDING_IED) intc_0 // 0 bytec_1 // "status" @@ -1638,7 +1638,7 @@ transfer: == assert // invalid number of bytes for arc4.uint64 btoi - // modules/kernel.py:143 + // modules/actus_kernel.py:143 // assert self.status != UInt64(enums.STATUS_INACTIVE), err.NOT_CONFIGURED intc_0 // 0 bytec_1 // "status" @@ -1651,7 +1651,7 @@ transfer: // modules/transfer_agent.py:76 // self._assert_is_not_asset_suspended() callsub _assert_is_not_asset_suspended - // modules/kernel.py:135 + // modules/actus_kernel.py:135 // return self.status == UInt64(enums.STATUS_PENDING_IED) intc_0 // 0 bytec_1 // "status" @@ -1659,7 +1659,7 @@ transfer: assert // check self.status exists pushint 50 == - // modules/kernel.py:147 + // modules/actus_kernel.py:147 // assert not self._status_is_pending_ied(), err.PENDING_IED ! assert // IED not yet executed @@ -1763,7 +1763,7 @@ transfer_after_if_else@5: extract_uint64 <= assert // Insufficient sender units to transfer - // modules/kernel.py:756 + // modules/actus_kernel.py:756 // if self.event_cursor >= self.schedule_entry_count: intc_0 // 0 bytec_2 // "event_cursor" @@ -1774,27 +1774,27 @@ transfer_after_if_else@5: app_global_get_ex assert // check self.schedule_entry_count exists >= - bnz transfer_after_inlined_modules.kernel.ActusKernelModule._assert_no_due_event_pending@10 - // modules/kernel.py:758 + bnz transfer_after_inlined_modules.actus_kernel.ActusKernelModule._assert_no_due_event_pending@10 + // modules/actus_kernel.py:758 // next_entry = self._get_schedule_entry(self.event_cursor) intc_0 // 0 bytec_2 // "event_cursor" app_global_get_ex assert // check self.event_cursor exists callsub _get_schedule_entry - // modules/kernel.py:760 + // modules/actus_kernel.py:760 // next_entry.scheduled_time > Global.latest_timestamp pushint 9 extract_uint64 global LatestTimestamp > - // modules/kernel.py:759-761 + // modules/actus_kernel.py:759-761 // assert ( // next_entry.scheduled_time > Global.latest_timestamp // ), err.PENDING_ACTUS_EVENT assert // ACTUS event not yet executed -transfer_after_inlined_modules.kernel.ActusKernelModule._assert_no_due_event_pending@10: +transfer_after_inlined_modules.actus_kernel.ActusKernelModule._assert_no_due_event_pending@10: // modules/transfer_agent.py:90 // self._ensure_units_activated(sender_holding_address) dig 3 @@ -1942,7 +1942,7 @@ account_open: txn Sender callsub _role_is_active assert // Not authorized - // modules/kernel.py:139 + // modules/actus_kernel.py:139 // return self.status == UInt64(enums.STATUS_ENDED) intc_0 // 0 bytec_1 // "status" @@ -2109,9 +2109,9 @@ account_get_position: return -// modules.kernel.ActusKernelModule.contract_create[routing]() -> void: +// modules.actus_kernel.ActusKernelModule.contract_create[routing]() -> void: contract_create: - // modules/kernel.py:969 + // modules/actus_kernel.py:969 // @arc4.abimethod(create="require") txna ApplicationArgs 1 dup @@ -2119,15 +2119,15 @@ contract_create: intc_3 // 32 == assert // invalid number of bytes for arc4.static_array - // modules/kernel.py:980 + // modules/actus_kernel.py:980 // self.arranger.value = arranger bytec 18 // 0x5223417272616e67657223 swap app_global_put - // modules/kernel.py:981 + // modules/actus_kernel.py:981 // return Global.latest_timestamp global LatestTimestamp - // modules/kernel.py:969 + // modules/actus_kernel.py:969 // @arc4.abimethod(create="require") itob bytec_0 // 0x151f7c75 @@ -2138,11 +2138,11 @@ contract_create: return -// modules.kernel.ActusKernelModule.contract_config[routing]() -> void: +// modules.actus_kernel.ActusKernelModule.contract_config[routing]() -> void: contract_config: pushbytes "" dup - // modules/kernel.py:983 + // modules/actus_kernel.py:983 // @arc4.abimethod txna ApplicationArgs 1 dupn 2 @@ -2181,10 +2181,10 @@ contract_config: + == assert // invalid number of bytes for smart_contracts.abi_types.Prospectus - // modules/kernel.py:1012 + // modules/actus_kernel.py:1012 // self._assert_caller_is_arranger() callsub _assert_caller_is_arranger - // modules/kernel.py:1014-1015 + // modules/actus_kernel.py:1014-1015 // # Configure Contract // self.contract_type = terms.contract_type.as_uint64() intc_0 // 0 @@ -2193,7 +2193,7 @@ contract_config: bytec 12 // "contract_type" dig 1 app_global_put - // modules/kernel.py:218-225 + // modules/actus_kernel.py:218-225 // return contract_type in ( // UInt64(enums.CT_PAM), // UInt64(enums.CT_ANN), @@ -2204,10 +2204,10 @@ contract_config: // ) bz contract_config_bool_true@7 dup - // modules/kernel.py:220 + // modules/actus_kernel.py:220 // UInt64(enums.CT_ANN), intc_1 // 1 - // modules/kernel.py:218-225 + // modules/actus_kernel.py:218-225 // return contract_type in ( // UInt64(enums.CT_PAM), // UInt64(enums.CT_ANN), @@ -2219,10 +2219,10 @@ contract_config: == bnz contract_config_bool_true@7 dup - // modules/kernel.py:221 + // modules/actus_kernel.py:221 // UInt64(enums.CT_NAM), pushint 2 - // modules/kernel.py:218-225 + // modules/actus_kernel.py:218-225 // return contract_type in ( // UInt64(enums.CT_PAM), // UInt64(enums.CT_ANN), @@ -2234,10 +2234,10 @@ contract_config: == bnz contract_config_bool_true@7 dup - // modules/kernel.py:222 + // modules/actus_kernel.py:222 // UInt64(enums.CT_LAM), pushint 3 - // modules/kernel.py:218-225 + // modules/actus_kernel.py:218-225 // return contract_type in ( // UInt64(enums.CT_PAM), // UInt64(enums.CT_ANN), @@ -2249,10 +2249,10 @@ contract_config: == bnz contract_config_bool_true@7 dup - // modules/kernel.py:223 + // modules/actus_kernel.py:223 // UInt64(enums.CT_LAX), pushint 4 - // modules/kernel.py:218-225 + // modules/actus_kernel.py:218-225 // return contract_type in ( // UInt64(enums.CT_PAM), // UInt64(enums.CT_ANN), @@ -2264,10 +2264,10 @@ contract_config: == bnz contract_config_bool_true@7 dup - // modules/kernel.py:224 + // modules/actus_kernel.py:224 // UInt64(enums.CT_CLM), pushint 5 - // modules/kernel.py:218-225 + // modules/actus_kernel.py:218-225 // return contract_type in ( // UInt64(enums.CT_PAM), // UInt64(enums.CT_ANN), @@ -2283,10 +2283,10 @@ contract_config_bool_true@7: intc_1 // 1 contract_config_bool_merge@9: - // modules/kernel.py:229 + // modules/actus_kernel.py:229 // assert self._is_supported_contract_type(contract_type), err.INVALID_ACTUS_CONFIG assert // Invalid ACTUS configuration - // modules/kernel.py:1017 + // modules/actus_kernel.py:1017 // self._store_contract_config(self.contract_type, terms, initial_state) intc_0 // 0 bytec 12 // "contract_type" @@ -2294,7 +2294,7 @@ contract_config_bool_merge@9: swap bury 2 assert // check self.contract_type exists - // modules/kernel.py:325 + // modules/actus_kernel.py:325 // assert terms.initial_exchange_amount > UInt64(0), err.INVALID_ACTUS_CONFIG dig 4 dup @@ -2303,13 +2303,13 @@ contract_config_bool_merge@9: dup bury 8 assert // Invalid ACTUS configuration - // modules/kernel.py:327 + // modules/actus_kernel.py:327 // terms.day_count_convention.as_uint64() pushint 57 getbyte dup bury 8 - // modules/kernel.py:297-303 + // modules/actus_kernel.py:297-303 // return day_count_convention in ( // UInt64(enums.DCC_AA), // UInt64(enums.DCC_A360), @@ -2319,10 +2319,10 @@ contract_config_bool_merge@9: // ) bz contract_config_bool_true@16 dig 6 - // modules/kernel.py:299 + // modules/actus_kernel.py:299 // UInt64(enums.DCC_A360), intc_1 // 1 - // modules/kernel.py:297-303 + // modules/actus_kernel.py:297-303 // return day_count_convention in ( // UInt64(enums.DCC_AA), // UInt64(enums.DCC_A360), @@ -2333,10 +2333,10 @@ contract_config_bool_merge@9: == bnz contract_config_bool_true@16 dig 6 - // modules/kernel.py:300 + // modules/actus_kernel.py:300 // UInt64(enums.DCC_A365), pushint 2 - // modules/kernel.py:297-303 + // modules/actus_kernel.py:297-303 // return day_count_convention in ( // UInt64(enums.DCC_AA), // UInt64(enums.DCC_A360), @@ -2347,10 +2347,10 @@ contract_config_bool_merge@9: == bnz contract_config_bool_true@16 dig 6 - // modules/kernel.py:301 + // modules/actus_kernel.py:301 // UInt64(enums.DCC_30E360ISDA), pushint 3 - // modules/kernel.py:297-303 + // modules/actus_kernel.py:297-303 // return day_count_convention in ( // UInt64(enums.DCC_AA), // UInt64(enums.DCC_A360), @@ -2361,10 +2361,10 @@ contract_config_bool_merge@9: == bnz contract_config_bool_true@16 dig 6 - // modules/kernel.py:302 + // modules/actus_kernel.py:302 // UInt64(enums.DCC_30E360), pushint 4 - // modules/kernel.py:297-303 + // modules/actus_kernel.py:297-303 // return day_count_convention in ( // UInt64(enums.DCC_AA), // UInt64(enums.DCC_A360), @@ -2379,18 +2379,18 @@ contract_config_bool_true@16: intc_1 // 1 contract_config_bool_merge@18: - // modules/kernel.py:309-311 + // modules/actus_kernel.py:309-311 // assert self._is_supported_day_count_convention( // day_count_convention // ), err.INVALID_DAY_COUNT_CONVENTION assert // Invalid day-count convention ID - // modules/kernel.py:329 + // modules/actus_kernel.py:329 // if contract_type != UInt64(enums.CT_ANN): dup intc_1 // 1 != bz contract_config_after_if_else@20 - // modules/kernel.py:330 + // modules/actus_kernel.py:330 // assert not terms.dynamic_principal_redemption, err.INVALID_ACTUS_CONFIG dig 4 pushint 786 @@ -2399,7 +2399,7 @@ contract_config_bool_merge@18: assert // Invalid ACTUS configuration contract_config_after_if_else@20: - // modules/kernel.py:800 + // modules/actus_kernel.py:800 // assert self.status == UInt64(enums.STATUS_INACTIVE), err.ALREADY_CONFIGURED intc_0 // 0 bytec_1 // "status" @@ -2407,7 +2407,7 @@ contract_config_after_if_else@20: assert // check self.status exists ! assert // D-ASA already configured - // modules/kernel.py:801 + // modules/actus_kernel.py:801 // assert self.initial_exchange_amount == UInt64(0), err.ALREADY_CONFIGURED intc_0 // 0 bytec 20 // "initial_exchange_amount" @@ -2415,50 +2415,50 @@ contract_config_after_if_else@20: assert // check self.initial_exchange_amount exists ! assert // D-ASA already configured - // modules/kernel.py:803-804 + // modules/actus_kernel.py:803-804 // # Set Denomination Asset // self._assert_denomination_asset(terms.denomination_asset_id) dig 4 dup intc_1 // 1 extract_uint64 - // modules/kernel.py:768-769 + // modules/actus_kernel.py:768-769 // # The reference implementation has on-chain denomination with ASA // _creator, exists = op.AssetParamsGet.asset_creator(denomination_asset_id) dup asset_params_get AssetCreator bury 1 - // modules/kernel.py:770 + // modules/actus_kernel.py:770 // assert exists, err.INVALID_DENOMINATION assert // Denomination asset is not properly set - // modules/kernel.py:773 + // modules/actus_kernel.py:773 // self.denomination_asset_id = denomination_asset_id bytec 44 // "denomination_asset_id" dig 1 app_global_put - // modules/kernel.py:807-808 + // modules/actus_kernel.py:807-808 // # Set Settlement Asset // self._assert_settlement_asset(terms.settlement_asset_id) dig 1 pushint 9 extract_uint64 - // modules/kernel.py:778 + // modules/actus_kernel.py:778 // settlement_asset_id == self.denomination_asset_id dup uncover 2 == - // modules/kernel.py:776-779 + // modules/actus_kernel.py:776-779 // # The reference implementation settlement asset is the denomination asset // assert ( // settlement_asset_id == self.denomination_asset_id // ), err.INVALID_SETTLEMENT_ASSET assert // Different settlement asset not supported, must be equal to denomination asset - // modules/kernel.py:782 + // modules/actus_kernel.py:782 // self.settlement_asset_id = settlement_asset_id bytec 19 // "settlement_asset_id" dig 1 app_global_put - // modules/kernel.py:783-789 + // modules/actus_kernel.py:783-789 // # The reference implementation has on-chain settlement with ASA // itxn.AssetTransfer( // xfer_asset=self.settlement_asset_id, @@ -2467,26 +2467,26 @@ contract_config_after_if_else@20: // fee=Global.min_txn_fee, // ).submit() itxn_begin - // modules/kernel.py:788 + // modules/actus_kernel.py:788 // fee=Global.min_txn_fee, global MinTxnFee - // modules/kernel.py:786 + // modules/actus_kernel.py:786 // asset_receiver=Global.current_application_address, global CurrentApplicationAddress - // modules/kernel.py:787 + // modules/actus_kernel.py:787 // asset_amount=0, intc_0 // 0 itxn_field AssetAmount itxn_field AssetReceiver swap itxn_field XferAsset - // modules/kernel.py:783-784 + // modules/actus_kernel.py:783-784 // # The reference implementation has on-chain settlement with ASA // itxn.AssetTransfer( pushint 4 // axfer itxn_field TypeEnum itxn_field Fee - // modules/kernel.py:783-789 + // modules/actus_kernel.py:783-789 // # The reference implementation has on-chain settlement with ASA // itxn.AssetTransfer( // xfer_asset=self.settlement_asset_id, @@ -2495,7 +2495,7 @@ contract_config_after_if_else@20: // fee=Global.min_txn_fee, // ).submit() itxn_submit - // modules/kernel.py:811-812 + // modules/actus_kernel.py:811-812 // # Units // self.total_units = terms.total_units dup @@ -2504,18 +2504,18 @@ contract_config_after_if_else@20: bytec 13 // "total_units" swap app_global_put - // modules/kernel.py:813 + // modules/actus_kernel.py:813 // self.reserved_units_total = UInt64(0) bytec 10 // "reserved_units_total" intc_0 // 0 app_global_put - // modules/kernel.py:815-816 + // modules/actus_kernel.py:815-816 // # Day-Count Conventions // self.day_count_convention = terms.day_count_convention.as_uint64() bytec 46 // "day_count_convention" dig 8 app_global_put - // modules/kernel.py:818-819 + // modules/actus_kernel.py:818-819 // # Time // self.initial_exchange_date = terms.initial_exchange_date dup @@ -2524,7 +2524,7 @@ contract_config_after_if_else@20: bytec 26 // "initial_exchange_date" dig 1 app_global_put - // modules/kernel.py:820 + // modules/actus_kernel.py:820 // self.maturity_date = terms.maturity_date dig 1 pushint 49 @@ -2532,7 +2532,7 @@ contract_config_after_if_else@20: bytec 45 // "maturity_date" dig 1 app_global_put - // modules/kernel.py:821 + // modules/actus_kernel.py:821 // self.next_principal_redemption = initial_state.next_principal_redemption dig 6 dup @@ -2542,13 +2542,13 @@ contract_config_after_if_else@20: bytec 14 // "next_principal_redemption" swap app_global_put - // modules/kernel.py:823-824 + // modules/actus_kernel.py:823-824 // # Principal // self.initial_exchange_amount = terms.initial_exchange_amount bytec 20 // "initial_exchange_amount" dig 10 app_global_put - // modules/kernel.py:825 + // modules/actus_kernel.py:825 // self.dynamic_principal_redemption = terms.dynamic_principal_redemption dig 3 pushint 786 @@ -2556,7 +2556,7 @@ contract_config_after_if_else@20: bytec 34 // "dynamic_principal_redemption" swap app_global_put - // modules/kernel.py:826 + // modules/actus_kernel.py:826 // self.outstanding_principal = initial_state.outstanding_principal dig 1 pushint 16 @@ -2564,7 +2564,7 @@ contract_config_after_if_else@20: bytec_3 // "outstanding_principal" swap app_global_put - // modules/kernel.py:828-829 + // modules/actus_kernel.py:828-829 // # Interest // self.accrued_interest = initial_state.accrued_interest dig 1 @@ -2573,7 +2573,7 @@ contract_config_after_if_else@20: bytec 6 // "accrued_interest" swap app_global_put - // modules/kernel.py:831-832 + // modules/actus_kernel.py:831-832 // # Interest Rate // self.nominal_interest_rate = initial_state.nominal_interest_rate dig 1 @@ -2582,7 +2582,7 @@ contract_config_after_if_else@20: bytec 9 // "nominal_interest_rate" swap app_global_put - // modules/kernel.py:833 + // modules/actus_kernel.py:833 // self.interest_calculation_base = initial_state.interest_calculation_base dig 1 pushint 24 @@ -2590,7 +2590,7 @@ contract_config_after_if_else@20: bytec 7 // "interest_calculation_base" swap app_global_put - // modules/kernel.py:834 + // modules/actus_kernel.py:834 // self.rate_reset_spread = terms.rate_reset_spread dig 3 pushint 58 @@ -2598,7 +2598,7 @@ contract_config_after_if_else@20: bytec 35 // "rate_reset_spread" swap app_global_put - // modules/kernel.py:835 + // modules/actus_kernel.py:835 // self.rate_reset_multiplier = terms.rate_reset_multiplier dig 3 pushint 66 @@ -2606,7 +2606,7 @@ contract_config_after_if_else@20: bytec 36 // "rate_reset_multiplier" swap app_global_put - // modules/kernel.py:836 + // modules/actus_kernel.py:836 // self.rate_reset_floor = terms.rate_reset_floor dig 3 pushint 74 @@ -2614,7 +2614,7 @@ contract_config_after_if_else@20: bytec 29 // "rate_reset_floor" swap app_global_put - // modules/kernel.py:837 + // modules/actus_kernel.py:837 // self.rate_reset_cap = terms.rate_reset_cap dig 3 pushint 82 @@ -2622,7 +2622,7 @@ contract_config_after_if_else@20: bytec 30 // "rate_reset_cap" swap app_global_put - // modules/kernel.py:838 + // modules/actus_kernel.py:838 // self.rate_reset_next = terms.rate_reset_next dig 3 pushint 90 @@ -2630,7 +2630,7 @@ contract_config_after_if_else@20: bytec 37 // "rate_reset_next" swap app_global_put - // modules/kernel.py:839 + // modules/actus_kernel.py:839 // self.has_rate_reset_floor = terms.has_rate_reset_floor dig 3 pushint 784 @@ -2638,7 +2638,7 @@ contract_config_after_if_else@20: bytec 38 // "has_rate_reset_floor" swap app_global_put - // modules/kernel.py:840 + // modules/actus_kernel.py:840 // self.has_rate_reset_cap = terms.has_rate_reset_cap dig 3 pushint 785 @@ -2646,7 +2646,7 @@ contract_config_after_if_else@20: bytec 39 // "has_rate_reset_cap" swap app_global_put - // modules/kernel.py:842-843 + // modules/actus_kernel.py:842-843 // # Scaling // self.fixed_point_scale = terms.fixed_point_scale uncover 3 @@ -2655,7 +2655,7 @@ contract_config_after_if_else@20: bytec 5 // "fixed_point_scale" swap app_global_put - // modules/kernel.py:845-846 + // modules/actus_kernel.py:845-846 // # Schedule Processing // self.event_cursor = initial_state.event_cursor dig 1 @@ -2664,7 +2664,7 @@ contract_config_after_if_else@20: bytec_2 // "event_cursor" swap app_global_put - // modules/kernel.py:848-849 + // modules/actus_kernel.py:848-849 // # Per-Unit Fixed-Point Indexes // self.cumulative_interest_index = initial_state.cumulative_interest_index dig 1 @@ -2673,7 +2673,7 @@ contract_config_after_if_else@20: bytec 16 // "cumulative_interest_index" swap app_global_put - // modules/kernel.py:850 + // modules/actus_kernel.py:850 // self.cumulative_principal_index = initial_state.cumulative_principal_index dig 1 pushint 64 @@ -2681,24 +2681,24 @@ contract_config_after_if_else@20: bytec 17 // "cumulative_principal_index" swap app_global_put - // modules/kernel.py:852-853 + // modules/actus_kernel.py:852-853 // # Reserved Amount (for executed cashflows) // self.reserved_interest = UInt64(0) bytec 15 // "reserved_interest" intc_0 // 0 app_global_put - // modules/kernel.py:854 + // modules/actus_kernel.py:854 // self.reserved_principal = UInt64(0) bytec 11 // "reserved_principal" intc_0 // 0 app_global_put - // modules/kernel.py:856 + // modules/actus_kernel.py:856 // assert terms.initial_exchange_date > Global.latest_timestamp, err.INVALID_IED dig 2 global LatestTimestamp > assert // IED must be set in the future - // modules/kernel.py:857 + // modules/actus_kernel.py:857 // assert terms.initial_exchange_date > initial_state.status_date, err.INVALID_IED swap intc_0 // 0 @@ -2706,11 +2706,11 @@ contract_config_after_if_else@20: dig 2 < assert // IED must be set in the future - // modules/kernel.py:858 + // modules/actus_kernel.py:858 // assert terms.initial_exchange_date < terms.maturity_date, err.INVALID_IED < assert // IED must be set in the future - // modules/kernel.py:1019-1020 + // modules/actus_kernel.py:1019-1020 // # Notarize prospectus (optional) // self.prospectus_hash = prospectus.hash.bytes dig 2 @@ -2718,17 +2718,17 @@ contract_config_after_if_else@20: bytec 42 // "prospectus_hash" swap app_global_put - // modules/kernel.py:1021 + // modules/actus_kernel.py:1021 // self.prospectus_url = prospectus.url dig 1 extract 2 0 bytec 43 // "prospectus_url" swap app_global_put - // modules/kernel.py:1022 + // modules/actus_kernel.py:1022 // return Global.latest_timestamp global LatestTimestamp - // modules/kernel.py:983 + // modules/actus_kernel.py:983 // @arc4.abimethod itob bytec_0 // 0x151f7c75 @@ -2747,12 +2747,12 @@ contract_config_bool_false@8: b contract_config_bool_merge@9 -// modules.kernel.ActusKernelModule.contract_schedule[routing]() -> void: +// modules.actus_kernel.ActusKernelModule.contract_schedule[routing]() -> void: contract_schedule: intc_0 // 0 pushbytes "" dupn 3 - // modules/kernel.py:1024 + // modules/actus_kernel.py:1024 // @arc4.abimethod txna ApplicationArgs 1 dup @@ -2788,10 +2788,10 @@ contract_schedule: len == assert // invalid number of bytes for arc4.dynamic_array - // modules/kernel.py:1039 + // modules/actus_kernel.py:1039 // self._assert_caller_is_arranger() callsub _assert_caller_is_arranger - // modules/kernel.py:1042 + // modules/actus_kernel.py:1042 // contract_type=self.contract_type, intc_0 // 0 bytec 12 // "contract_type" @@ -2799,7 +2799,7 @@ contract_schedule: swap cover 3 assert // check self.contract_type exists - // modules/kernel.py:874 + // modules/actus_kernel.py:874 // assert self.status == UInt64(enums.STATUS_INACTIVE), err.ALREADY_CONFIGURED intc_0 // 0 bytec_1 // "status" @@ -2807,7 +2807,7 @@ contract_schedule: assert // check self.status exists ! assert // D-ASA already configured - // modules/kernel.py:875-877 + // modules/actus_kernel.py:875-877 // assert schedule_page.length <= UInt64( // cst.SCHEDULE_PAGE_SIZE // ), err.INVALID_SCHEDULE_PAGE @@ -2815,20 +2815,20 @@ contract_schedule: pushint 16 <= assert // Invalid schedule page - // modules/kernel.py:878 + // modules/actus_kernel.py:878 // assert self.initial_exchange_amount > UInt64(0), err.TERMS_NOT_CONFIGURED intc_0 // 0 bytec 20 // "initial_exchange_amount" app_global_get_ex assert // check self.initial_exchange_amount exists assert // D-ASA terms not configured - // modules/kernel.py:880 + // modules/actus_kernel.py:880 // page_cursor = schedule_page_index * UInt64(cst.SCHEDULE_PAGE_SIZE) swap pushint 16 * swap - // modules/kernel.py:887 + // modules/actus_kernel.py:887 // + page_length * UInt64(cst.OP_UP_CONTRACT_CONFIG_PER_ENTRY_BUDGET) pushint 100 * @@ -2855,19 +2855,19 @@ contract_schedule_while_top@2: b contract_schedule_while_top@2 contract_schedule_after_while@5: - // modules/kernel.py:890 + // modules/actus_kernel.py:890 // index = UInt64(0) intc_0 // 0 bury 10 contract_schedule_while_top@6: - // modules/kernel.py:891 + // modules/actus_kernel.py:891 // while index < page_length: dig 9 dig 4 < bz contract_schedule_after_while@15 - // modules/kernel.py:892-893 + // modules/actus_kernel.py:892-893 // entry = schedule_page[index].copy() // entry_event_type = entry.event_type.as_uint64() dig 4 @@ -2881,20 +2881,20 @@ contract_schedule_while_top@6: * pushint 65 extract3 // on error: index access is out of bounds - // modules/kernel.py:893 + // modules/actus_kernel.py:893 // entry_event_type = entry.event_type.as_uint64() dup - // modules/kernel.py:892-893 + // modules/actus_kernel.py:892-893 // entry = schedule_page[index].copy() // entry_event_type = entry.event_type.as_uint64() intc_2 // 8 - // modules/kernel.py:893 + // modules/actus_kernel.py:893 // entry_event_type = entry.event_type.as_uint64() getbyte dup cover 2 bury 14 - // modules/kernel.py:894 + // modules/actus_kernel.py:894 // assert entry.event_id == page_cursor + index, err.INVALID_EVENT_ID dup intc_0 // 0 @@ -2907,14 +2907,14 @@ contract_schedule_while_top@6: dig 1 == assert // Invalid event id - // modules/kernel.py:895-897 + // modules/actus_kernel.py:895-897 // self._assert_event_allowed_for_contract_type( // contract_type, entry_event_type // ) dig 5 uncover 3 callsub _assert_event_allowed_for_contract_type - // modules/kernel.py:898 + // modules/actus_kernel.py:898 // assert entry.scheduled_time > UInt64(0), err.INVALID_ACTUS_CONFIG swap pushint 9 @@ -2922,14 +2922,14 @@ contract_schedule_while_top@6: dup bury 10 assert // Invalid ACTUS configuration - // modules/kernel.py:899 + // modules/actus_kernel.py:899 // if entry.event_id > UInt64(0): bz contract_schedule_after_if_else@12 - // modules/kernel.py:900 + // modules/actus_kernel.py:900 // if index > UInt64(0): dig 9 bz contract_schedule_else_body@10 - // modules/kernel.py:901 + // modules/actus_kernel.py:901 // previous_entry = schedule_page[index - UInt64(1)].copy() dig 9 intc_1 // 1 @@ -2942,24 +2942,24 @@ contract_schedule_while_top@6: extract3 // on error: index access is out of bounds contract_schedule_after_if_else@11: - // modules/kernel.py:916 + // modules/actus_kernel.py:916 // previous_entry.scheduled_time <= entry.scheduled_time pushint 9 extract_uint64 dig 8 <= - // modules/kernel.py:915-917 + // modules/actus_kernel.py:915-917 // assert ( // previous_entry.scheduled_time <= entry.scheduled_time // ), err.INVALID_SORTING assert // Time events must be sorted in strictly ascending order contract_schedule_after_if_else@12: - // modules/kernel.py:918 + // modules/actus_kernel.py:918 // if entry.event_id == UInt64(0): dig 8 bnz contract_schedule_after_if_else@14 - // modules/kernel.py:919-921 + // modules/actus_kernel.py:919-921 // assert entry_event_type == UInt64( // enums.EVT_IED // ), err.INVALID_ACTUS_CONFIG @@ -2969,7 +2969,7 @@ contract_schedule_after_if_else@12: assert // Invalid ACTUS configuration contract_schedule_after_if_else@14: - // modules/kernel.py:922 + // modules/actus_kernel.py:922 // index += UInt64(1) dig 9 intc_1 // 1 @@ -2978,18 +2978,18 @@ contract_schedule_after_if_else@14: b contract_schedule_while_top@6 contract_schedule_else_body@10: - // modules/kernel.py:903-905 + // modules/actus_kernel.py:903-905 // # The first entry of a page must still be ordered after the // # last entry of the previous page. // assert schedule_page_index > UInt64(0), err.INVALID_EVENT_ID dig 6 dup assert // Invalid event id - // modules/kernel.py:906 + // modules/actus_kernel.py:906 // previous_page_index = schedule_page_index - UInt64(1) intc_1 // 1 - - // modules/kernel.py:908 + // modules/actus_kernel.py:908 // previous_page_index in self.schedule_page itob bytec 31 // 0x5323 @@ -2998,12 +2998,12 @@ contract_schedule_else_body@10: dup box_len bury 1 - // modules/kernel.py:907-909 + // modules/actus_kernel.py:907-909 // assert ( // previous_page_index in self.schedule_page // ), err.INVALID_SCHEDULE_PAGE assert // Invalid schedule page - // modules/kernel.py:910-911 + // modules/actus_kernel.py:910-911 // previous_page = self.schedule_page[previous_page_index].copy() // assert previous_page.length > UInt64(0), err.INVALID_SCHEDULE_PAGE dup @@ -3011,15 +3011,15 @@ contract_schedule_else_body@10: pushint 2 box_extract btoi - // modules/kernel.py:911 + // modules/actus_kernel.py:911 // assert previous_page.length > UInt64(0), err.INVALID_SCHEDULE_PAGE dup assert // Invalid schedule page - // modules/kernel.py:913 + // modules/actus_kernel.py:913 // previous_page.length - UInt64(1) intc_1 // 1 - - // modules/kernel.py:912-914 + // modules/actus_kernel.py:912-914 // previous_entry = previous_page[ // previous_page.length - UInt64(1) // ].copy() @@ -3032,7 +3032,7 @@ contract_schedule_else_body@10: b contract_schedule_after_if_else@11 contract_schedule_after_while@15: - // modules/kernel.py:200 + // modules/actus_kernel.py:200 // self.schedule_page[page_index] = schedule_page.copy() dig 6 itob @@ -3044,35 +3044,35 @@ contract_schedule_after_while@15: pop dig 5 box_put - // modules/kernel.py:925 + // modules/actus_kernel.py:925 // if is_last_page: dig 5 bz contract_schedule_after_if_else@17 - // modules/kernel.py:927 + // modules/actus_kernel.py:927 // schedule_page_index * UInt64(cst.SCHEDULE_PAGE_SIZE) + page_length dig 1 dig 4 + - // modules/kernel.py:926 + // modules/actus_kernel.py:926 // self.schedule_entry_count = ( bytec 4 // "schedule_entry_count" - // modules/kernel.py:926-928 + // modules/actus_kernel.py:926-928 // self.schedule_entry_count = ( // schedule_page_index * UInt64(cst.SCHEDULE_PAGE_SIZE) + page_length // ) swap app_global_put - // modules/kernel.py:929 + // modules/actus_kernel.py:929 // self.status = UInt64(enums.STATUS_PENDING_IED) bytec_1 // "status" pushint 50 app_global_put contract_schedule_after_if_else@17: - // modules/kernel.py:1047 + // modules/actus_kernel.py:1047 // return Global.latest_timestamp global LatestTimestamp - // modules/kernel.py:1024 + // modules/actus_kernel.py:1024 // @arc4.abimethod itob bytec_0 // 0x151f7c75 @@ -3083,25 +3083,25 @@ contract_schedule_after_if_else@17: return -// modules.kernel.ActusKernelModule.execute_ied[routing]() -> void: +// modules.actus_kernel.ActusKernelModule.execute_ied[routing]() -> void: execute_ied: - // modules/kernel.py:143 + // modules/actus_kernel.py:143 // assert self.status != UInt64(enums.STATUS_INACTIVE), err.NOT_CONFIGURED intc_0 // 0 bytec_1 // "status" app_global_get_ex assert // check self.status exists assert // D-ASA not configured - // modules/kernel.py:1057 + // modules/actus_kernel.py:1057 // self._assert_caller_is_arranger() callsub _assert_caller_is_arranger - // modules/kernel.py:1058 + // modules/actus_kernel.py:1058 // self._assert_is_not_asset_defaulted() callsub _assert_is_not_asset_defaulted - // modules/kernel.py:1059 + // modules/actus_kernel.py:1059 // self._assert_is_not_asset_suspended() callsub _assert_is_not_asset_suspended - // modules/kernel.py:1061 + // modules/actus_kernel.py:1061 // assert self.event_cursor < self.schedule_entry_count, err.INVALID_EVENT_CURSOR intc_0 // 0 bytec_2 // "event_cursor" @@ -3114,10 +3114,10 @@ execute_ied: dig 1 > assert // Invalid event cursor - // modules/kernel.py:1062 + // modules/actus_kernel.py:1062 // entry = self._get_schedule_entry(self.event_cursor) callsub _get_schedule_entry - // modules/kernel.py:1063 + // modules/actus_kernel.py:1063 // assert entry.event_type == arc4.UInt8(enums.EVT_IED), err.INVALID_EVENT_TYPE dup extract 8 1 @@ -3125,39 +3125,39 @@ execute_ied: pushbytes 0x01 b== assert // Invalid event type - // modules/kernel.py:1067 + // modules/actus_kernel.py:1067 // event_id=entry.event_id, dig 1 extract 0 8 - // modules/kernel.py:1069 + // modules/actus_kernel.py:1069 // scheduled_time=entry.scheduled_time, dig 2 extract 9 8 - // modules/kernel.py:1070 + // modules/actus_kernel.py:1070 // accrual_factor=entry.accrual_factor, dig 3 extract 17 8 - // modules/kernel.py:1071 + // modules/actus_kernel.py:1071 // redemption_accrual_factor=entry.redemption_accrual_factor, dig 4 extract 25 8 - // modules/kernel.py:1073 + // modules/actus_kernel.py:1073 // next_nominal_interest_rate=entry.next_nominal_interest_rate, dig 5 extract 33 8 - // modules/kernel.py:1074 + // modules/actus_kernel.py:1074 // next_principal_redemption=entry.next_principal_redemption, dig 6 extract 41 8 - // modules/kernel.py:1075 + // modules/actus_kernel.py:1075 // next_outstanding_principal=entry.next_outstanding_principal, dig 7 extract 49 8 - // modules/kernel.py:1076 + // modules/actus_kernel.py:1076 // flags=entry.flags, dig 8 extract 57 8 - // modules/kernel.py:1066-1077 + // modules/actus_kernel.py:1066-1077 // typ.ObservedEventRequest( // event_id=entry.event_id, // event_type=entry.event_type, @@ -3179,10 +3179,10 @@ execute_ied: concat uncover 5 concat - // modules/kernel.py:1072 + // modules/actus_kernel.py:1072 // observed_rate=UInt64(0), intc_0 // 0 - // modules/kernel.py:1066-1077 + // modules/actus_kernel.py:1066-1077 // typ.ObservedEventRequest( // event_id=entry.event_id, // event_type=entry.event_type, @@ -3205,7 +3205,7 @@ execute_ied: concat swap concat - // modules/kernel.py:1064-1078 + // modules/actus_kernel.py:1064-1078 // self._apply_non_cash_schedule_entry( // entry, // typ.ObservedEventRequest( @@ -3223,10 +3223,10 @@ execute_ied: // ) callsub _apply_non_cash_schedule_entry popn 2 - // modules/kernel.py:1079 + // modules/actus_kernel.py:1079 // return Global.latest_timestamp global LatestTimestamp - // modules/kernel.py:1049 + // modules/actus_kernel.py:1049 // @arc4.abimethod itob bytec_0 // 0x151f7c75 @@ -3237,13 +3237,13 @@ execute_ied: return -// modules.kernel.ActusKernelModule.apply_non_cash_event[routing]() -> void: +// modules.actus_kernel.ActusKernelModule.apply_non_cash_event[routing]() -> void: apply_non_cash_event: intc_0 // 0 dupn 4 pushbytes "" dup - // modules/kernel.py:1081 + // modules/actus_kernel.py:1081 // @arc4.abimethod txna ApplicationArgs 1 dup @@ -3258,20 +3258,20 @@ apply_non_cash_event: pushint 73 == assert // invalid number of bytes for smart_contracts.abi_types.ObservedEventRequest - // modules/kernel.py:143 + // modules/actus_kernel.py:143 // assert self.status != UInt64(enums.STATUS_INACTIVE), err.NOT_CONFIGURED intc_0 // 0 bytec_1 // "status" app_global_get_ex assert // check self.status exists assert // D-ASA not configured - // modules/kernel.py:1095 + // modules/actus_kernel.py:1095 // self._assert_is_not_asset_defaulted() callsub _assert_is_not_asset_defaulted - // modules/kernel.py:1096 + // modules/actus_kernel.py:1096 // self._assert_is_not_asset_suspended() callsub _assert_is_not_asset_suspended - // modules/kernel.py:1098 + // modules/actus_kernel.py:1098 // if payload.flags & UInt64(enums.FLAG_OBSERVED_EVENT): pushint 65 extract_uint64 @@ -3279,7 +3279,7 @@ apply_non_cash_event: pushint 4 & bz apply_non_cash_event_after_if_else@3 - // modules/kernel.py:233 + // modules/actus_kernel.py:233 // return self.contract_type == UInt64(enums.CT_CLM) intc_0 // 0 bytec 12 // "contract_type" @@ -3287,13 +3287,13 @@ apply_non_cash_event: assert // check self.contract_type exists pushint 5 == - // modules/kernel.py:1099 + // modules/actus_kernel.py:1099 // assert self._supports_observed_events(), err.OBSERVED_EVENT_REQUIRED assert // Observed event required to execute this action - // modules/kernel.py:1100 + // modules/actus_kernel.py:1100 // self._assert_caller_is_arranger() callsub _assert_caller_is_arranger - // modules/kernel.py:233 + // modules/actus_kernel.py:233 // return self.contract_type == UInt64(enums.CT_CLM) intc_0 // 0 bytec 12 // "contract_type" @@ -3302,10 +3302,10 @@ apply_non_cash_event: dup pushint 5 == - // modules/kernel.py:938 + // modules/actus_kernel.py:938 // assert self._supports_observed_events(), err.OBSERVED_EVENT_REQUIRED assert // Observed event required to execute this action - // modules/kernel.py:939 + // modules/actus_kernel.py:939 // assert payload.event_id == self.schedule_entry_count, err.INVALID_EVENT_ID dig 2 dup @@ -3319,33 +3319,33 @@ apply_non_cash_event: assert // check self.schedule_entry_count exists == assert // Invalid event id - // modules/kernel.py:941 + // modules/actus_kernel.py:941 // self.contract_type, payload.event_type.as_uint64() dup extract 8 1 bury 12 intc_2 // 8 getbyte - // modules/kernel.py:940-942 + // modules/actus_kernel.py:940-942 // self._assert_event_allowed_for_contract_type( // self.contract_type, payload.event_type.as_uint64() // ) callsub _assert_event_allowed_for_contract_type - // modules/kernel.py:944 + // modules/actus_kernel.py:944 // page_index = self._schedule_page_index(self.schedule_entry_count) intc_0 // 0 bytec 4 // "schedule_entry_count" app_global_get_ex assert // check self.schedule_entry_count exists - // modules/kernel.py:190 + // modules/actus_kernel.py:190 // return event_id // UInt64(cst.SCHEDULE_PAGE_SIZE) pushint 16 / - // modules/kernel.py:945 + // modules/actus_kernel.py:945 // page = typ.ExecutionSchedulePage() pushbytes 0x0000 bury 7 - // modules/kernel.py:946 + // modules/actus_kernel.py:946 // if page_index in self.schedule_page: itob bytec 31 // 0x5323 @@ -3356,7 +3356,7 @@ apply_non_cash_event: box_len bury 1 bz apply_non_cash_event_after_if_else@27 - // modules/kernel.py:947 + // modules/actus_kernel.py:947 // page = self.schedule_page[page_index].copy() dig 7 box_get @@ -3365,7 +3365,7 @@ apply_non_cash_event: assert // check self.schedule_page entry exists apply_non_cash_event_after_if_else@27: - // modules/kernel.py:948 + // modules/actus_kernel.py:948 // assert page.length < UInt64(cst.SCHEDULE_PAGE_SIZE), err.INVALID_SCHEDULE_PAGE dig 5 dup @@ -3375,32 +3375,32 @@ apply_non_cash_event_after_if_else@27: pushint 16 < assert // Invalid schedule page - // modules/kernel.py:953 + // modules/actus_kernel.py:953 // scheduled_time=payload.scheduled_time, dig 3 dup extract 9 8 - // modules/kernel.py:954 + // modules/actus_kernel.py:954 // accrual_factor=payload.accrual_factor, dig 1 extract 17 8 - // modules/kernel.py:955 + // modules/actus_kernel.py:955 // redemption_accrual_factor=payload.redemption_accrual_factor, dig 2 extract 25 8 - // modules/kernel.py:956 + // modules/actus_kernel.py:956 // next_nominal_interest_rate=payload.next_nominal_interest_rate, dig 3 extract 41 8 - // modules/kernel.py:957 + // modules/actus_kernel.py:957 // next_principal_redemption=payload.next_principal_redemption, dig 4 extract 49 8 - // modules/kernel.py:958 + // modules/actus_kernel.py:958 // next_outstanding_principal=payload.next_outstanding_principal, uncover 5 extract 57 8 - // modules/kernel.py:950-960 + // modules/actus_kernel.py:950-960 // typ.ExecutionScheduleEntry( // event_id=payload.event_id, // event_type=payload.event_type, @@ -3431,7 +3431,7 @@ apply_non_cash_event_after_if_else@27: dig 3 itob concat - // modules/kernel.py:949-961 + // modules/actus_kernel.py:949-961 // page.append( // typ.ExecutionScheduleEntry( // event_id=payload.event_id, @@ -3454,7 +3454,7 @@ apply_non_cash_event_after_if_else@27: itob extract 6 2 replace2 0 - // modules/kernel.py:962 + // modules/actus_kernel.py:962 // self.schedule_page[page_index] = page.copy() dig 8 dup @@ -3462,7 +3462,7 @@ apply_non_cash_event_after_if_else@27: pop swap box_put - // modules/kernel.py:963 + // modules/actus_kernel.py:963 // self.schedule_entry_count += UInt64(1) intc_0 // 0 bytec 4 // "schedule_entry_count" @@ -3475,7 +3475,7 @@ apply_non_cash_event_after_if_else@27: app_global_put apply_non_cash_event_after_if_else@3: - // modules/kernel.py:1103 + // modules/actus_kernel.py:1103 // assert event_id == self.event_cursor, err.INVALID_EVENT_CURSOR intc_0 // 0 bytec_2 // "event_cursor" @@ -3486,12 +3486,12 @@ apply_non_cash_event_after_if_else@3: uncover 2 == assert // Invalid event cursor - // modules/kernel.py:1104 + // modules/actus_kernel.py:1104 // entry = self._get_schedule_entry(event_id) callsub _get_schedule_entry dup bury 8 - // modules/kernel.py:1106 + // modules/actus_kernel.py:1106 // entry.event_type.as_uint64() dup extract 8 1 @@ -3500,10 +3500,10 @@ apply_non_cash_event_after_if_else@3: getbyte dup bury 6 - // modules/kernel.py:364 + // modules/actus_kernel.py:364 // UInt64(enums.EVT_IED), intc_1 // 1 - // modules/kernel.py:363-370 + // modules/actus_kernel.py:363-370 // return event_type in ( // UInt64(enums.EVT_IED), // UInt64(enums.EVT_PI), @@ -3515,10 +3515,10 @@ apply_non_cash_event_after_if_else@3: == bnz apply_non_cash_event_bool_true@15 dig 4 - // modules/kernel.py:365 + // modules/actus_kernel.py:365 // UInt64(enums.EVT_PI), pushint 4 - // modules/kernel.py:363-370 + // modules/actus_kernel.py:363-370 // return event_type in ( // UInt64(enums.EVT_IED), // UInt64(enums.EVT_PI), @@ -3530,10 +3530,10 @@ apply_non_cash_event_after_if_else@3: == bnz apply_non_cash_event_bool_true@15 dig 4 - // modules/kernel.py:366 + // modules/actus_kernel.py:366 // UInt64(enums.EVT_RR), pushint 12 - // modules/kernel.py:363-370 + // modules/actus_kernel.py:363-370 // return event_type in ( // UInt64(enums.EVT_IED), // UInt64(enums.EVT_PI), @@ -3545,10 +3545,10 @@ apply_non_cash_event_after_if_else@3: == bnz apply_non_cash_event_bool_true@15 dig 4 - // modules/kernel.py:367 + // modules/actus_kernel.py:367 // UInt64(enums.EVT_RRF), pushint 11 - // modules/kernel.py:363-370 + // modules/actus_kernel.py:363-370 // return event_type in ( // UInt64(enums.EVT_IED), // UInt64(enums.EVT_PI), @@ -3560,10 +3560,10 @@ apply_non_cash_event_after_if_else@3: == bnz apply_non_cash_event_bool_true@15 dig 4 - // modules/kernel.py:368 + // modules/actus_kernel.py:368 // UInt64(enums.EVT_IPCB), pushint 18 - // modules/kernel.py:363-370 + // modules/actus_kernel.py:363-370 // return event_type in ( // UInt64(enums.EVT_IED), // UInt64(enums.EVT_PI), @@ -3575,10 +3575,10 @@ apply_non_cash_event_after_if_else@3: == bnz apply_non_cash_event_bool_true@15 dig 4 - // modules/kernel.py:369 + // modules/actus_kernel.py:369 // UInt64(enums.EVT_PRF), pushint 5 - // modules/kernel.py:363-370 + // modules/actus_kernel.py:363-370 // return event_type in ( // UInt64(enums.EVT_IED), // UInt64(enums.EVT_PI), @@ -3594,18 +3594,18 @@ apply_non_cash_event_bool_true@15: intc_1 // 1 apply_non_cash_event_bool_merge@17: - // modules/kernel.py:1105-1107 + // modules/actus_kernel.py:1105-1107 // assert self._event_is_non_cash( // entry.event_type.as_uint64() // ), err.INVALID_EVENT_TYPE assert // Invalid event type - // modules/kernel.py:1108 + // modules/actus_kernel.py:1108 // assert entry.event_type != arc4.UInt8(enums.EVT_IED), err.INVALID_EVENT_TYPE dig 8 pushbytes 0x01 b!= assert // Invalid event type - // modules/kernel.py:374 + // modules/actus_kernel.py:374 // return event_type in (UInt64(enums.EVT_RR), UInt64(enums.EVT_RRF)) dig 4 pushint 12 @@ -3620,7 +3620,7 @@ apply_non_cash_event_bool_true@21: intc_1 // 1 apply_non_cash_event_bool_merge@23: - // modules/kernel.py:1109 + // modules/actus_kernel.py:1109 // if self._event_is_rate_reset(entry.event_type.as_uint64()): bz apply_non_cash_event_else_body@5 // modules/rbac.py:80 @@ -3631,16 +3631,16 @@ apply_non_cash_event_bool_merge@23: assert // Not authorized apply_non_cash_event_after_if_else@6: - // modules/kernel.py:1113 + // modules/actus_kernel.py:1113 // self._apply_non_cash_schedule_entry(entry, payload) dig 6 dig 2 callsub _apply_non_cash_schedule_entry popn 2 - // modules/kernel.py:1114 + // modules/actus_kernel.py:1114 // return Global.latest_timestamp global LatestTimestamp - // modules/kernel.py:1081 + // modules/actus_kernel.py:1081 // @arc4.abimethod itob bytec_0 // 0x151f7c75 @@ -3651,7 +3651,7 @@ apply_non_cash_event_after_if_else@6: return apply_non_cash_event_else_body@5: - // modules/kernel.py:1112 + // modules/actus_kernel.py:1112 // self._assert_caller_is_arranger() callsub _assert_caller_is_arranger b apply_non_cash_event_after_if_else@6 @@ -3665,9 +3665,9 @@ apply_non_cash_event_bool_false@16: b apply_non_cash_event_bool_merge@17 -// modules.kernel.ActusKernelModule.get_contract_state[routing]() -> void: +// modules.actus_kernel.ActusKernelModule.get_contract_state[routing]() -> void: get_contract_state: - // modules/kernel.py:143 + // modules/actus_kernel.py:143 // assert self.status != UInt64(enums.STATUS_INACTIVE), err.NOT_CONFIGURED intc_0 // 0 bytec_1 // "status" @@ -3675,7 +3675,7 @@ get_contract_state: assert // check self.status exists dup assert // D-ASA not configured - // modules/kernel.py:1121 + // modules/actus_kernel.py:1121 // contract_type=arc4.UInt8(self.contract_type), intc_0 // 0 bytec 12 // "contract_type" @@ -3688,85 +3688,85 @@ get_contract_state: <= assert // overflow extract 7 1 - // modules/kernel.py:1123 + // modules/actus_kernel.py:1123 // total_units=self.total_units, intc_0 // 0 bytec 13 // "total_units" app_global_get_ex assert // check self.total_units exists - // modules/kernel.py:1124 + // modules/actus_kernel.py:1124 // reserved_units_total=self.reserved_units_total, intc_0 // 0 bytec 10 // "reserved_units_total" app_global_get_ex assert // check self.reserved_units_total exists - // modules/kernel.py:1125 + // modules/actus_kernel.py:1125 // initial_exchange_amount=self.initial_exchange_amount, intc_0 // 0 bytec 20 // "initial_exchange_amount" app_global_get_ex assert // check self.initial_exchange_amount exists - // modules/kernel.py:1126 + // modules/actus_kernel.py:1126 // event_cursor=self.event_cursor, intc_0 // 0 bytec_2 // "event_cursor" app_global_get_ex assert // check self.event_cursor exists - // modules/kernel.py:1127 + // modules/actus_kernel.py:1127 // schedule_entry_count=self.schedule_entry_count, intc_0 // 0 bytec 4 // "schedule_entry_count" app_global_get_ex assert // check self.schedule_entry_count exists - // modules/kernel.py:1128 + // modules/actus_kernel.py:1128 // outstanding_principal=self.outstanding_principal, intc_0 // 0 bytec_3 // "outstanding_principal" app_global_get_ex assert // check self.outstanding_principal exists - // modules/kernel.py:1129 + // modules/actus_kernel.py:1129 // interest_calculation_base=self.interest_calculation_base, intc_0 // 0 bytec 7 // "interest_calculation_base" app_global_get_ex assert // check self.interest_calculation_base exists - // modules/kernel.py:1130 + // modules/actus_kernel.py:1130 // nominal_interest_rate=self.nominal_interest_rate, intc_0 // 0 bytec 9 // "nominal_interest_rate" app_global_get_ex assert // check self.nominal_interest_rate exists - // modules/kernel.py:1131 + // modules/actus_kernel.py:1131 // accrued_interest=self.accrued_interest, intc_0 // 0 bytec 6 // "accrued_interest" app_global_get_ex assert // check self.accrued_interest exists - // modules/kernel.py:1132 + // modules/actus_kernel.py:1132 // cumulative_interest_index=self.cumulative_interest_index, intc_0 // 0 bytec 16 // "cumulative_interest_index" app_global_get_ex assert // check self.cumulative_interest_index exists - // modules/kernel.py:1133 + // modules/actus_kernel.py:1133 // cumulative_principal_index=self.cumulative_principal_index, intc_0 // 0 bytec 17 // "cumulative_principal_index" app_global_get_ex assert // check self.cumulative_principal_index exists - // modules/kernel.py:1134 + // modules/actus_kernel.py:1134 // reserved_interest=self.reserved_interest, intc_0 // 0 bytec 15 // "reserved_interest" app_global_get_ex assert // check self.reserved_interest exists - // modules/kernel.py:1135 + // modules/actus_kernel.py:1135 // reserved_principal=self.reserved_principal, intc_0 // 0 bytec 11 // "reserved_principal" app_global_get_ex assert // check self.reserved_principal exists - // modules/kernel.py:1120-1136 + // modules/actus_kernel.py:1120-1136 // return typ.KernelState( // contract_type=arc4.UInt8(self.contract_type), // status=self.status, @@ -3828,7 +3828,7 @@ get_contract_state: swap itob concat - // modules/kernel.py:1116 + // modules/actus_kernel.py:1116 // @arc4.abimethod(readonly=True) bytec_0 // 0x151f7c75 swap @@ -3838,16 +3838,16 @@ get_contract_state: return -// modules.kernel.ActusKernelModule.get_next_due_event[routing]() -> void: +// modules.actus_kernel.ActusKernelModule.get_next_due_event[routing]() -> void: get_next_due_event: - // modules/kernel.py:143 + // modules/actus_kernel.py:143 // assert self.status != UInt64(enums.STATUS_INACTIVE), err.NOT_CONFIGURED intc_0 // 0 bytec_1 // "status" app_global_get_ex assert // check self.status exists assert // D-ASA not configured - // modules/kernel.py:1142 + // modules/actus_kernel.py:1142 // if self.event_cursor >= self.schedule_entry_count: intc_0 // 0 bytec_2 // "event_cursor" @@ -3859,13 +3859,13 @@ get_next_due_event: assert // check self.schedule_entry_count exists >= bz get_next_due_event_after_if_else@3 - // modules/kernel.py:1144 + // modules/actus_kernel.py:1144 // event_id=self.event_cursor, intc_0 // 0 bytec_2 // "event_cursor" app_global_get_ex assert // check self.event_cursor exists - // modules/kernel.py:1143-1153 + // modules/actus_kernel.py:1143-1153 // return typ.ExecutionScheduleEntry( // event_id=self.event_cursor, // event_type=arc4.UInt8(0), @@ -3878,10 +3878,10 @@ get_next_due_event: // flags=UInt64(0), // ) itob - // modules/kernel.py:1145 + // modules/actus_kernel.py:1145 // event_type=arc4.UInt8(0), bytec 40 // 0x00 - // modules/kernel.py:1143-1153 + // modules/actus_kernel.py:1143-1153 // return typ.ExecutionScheduleEntry( // event_id=self.event_cursor, // event_type=arc4.UInt8(0), @@ -3894,10 +3894,10 @@ get_next_due_event: // flags=UInt64(0), // ) concat - // modules/kernel.py:1146 + // modules/actus_kernel.py:1146 // scheduled_time=UInt64(0), intc_0 // 0 - // modules/kernel.py:1143-1153 + // modules/actus_kernel.py:1143-1153 // return typ.ExecutionScheduleEntry( // event_id=self.event_cursor, // event_type=arc4.UInt8(0), @@ -3926,8 +3926,8 @@ get_next_due_event: swap concat -get_next_due_event_after_inlined_modules.kernel.ActusKernelModule.get_next_due_event@4: - // modules/kernel.py:1138 +get_next_due_event_after_inlined_modules.actus_kernel.ActusKernelModule.get_next_due_event@4: + // modules/actus_kernel.py:1138 // @arc4.abimethod(readonly=True) bytec_0 // 0x151f7c75 swap @@ -3937,16 +3937,16 @@ get_next_due_event_after_inlined_modules.kernel.ActusKernelModule.get_next_due_e return get_next_due_event_after_if_else@3: - // modules/kernel.py:1154 + // modules/actus_kernel.py:1154 // return self._get_schedule_entry(self.event_cursor) intc_0 // 0 bytec_2 // "event_cursor" app_global_get_ex assert // check self.event_cursor exists callsub _get_schedule_entry - // modules/kernel.py:1138 + // modules/actus_kernel.py:1138 // @arc4.abimethod(readonly=True) - b get_next_due_event_after_inlined_modules.kernel.ActusKernelModule.get_next_due_event@4 + b get_next_due_event_after_inlined_modules.actus_kernel.ActusKernelModule.get_next_due_event@4 // modules.rbac.RbacModule.contract_update[routing]() -> void: @@ -4863,7 +4863,7 @@ _ensure_units_activated: box_len bury 1 assert // Invalid account holding address - // modules/kernel.py:135 + // modules/actus_kernel.py:135 // return self.status == UInt64(enums.STATUS_PENDING_IED) intc_0 // 0 bytec_1 // "status" @@ -4942,14 +4942,14 @@ _ensure_units_activated_after_if_else@4: retsub -// modules.kernel.ActusKernelModule._scaled_mul_div(multiplicand: uint64, multiplier: uint64, divisor: uint64) -> uint64: +// modules.actus_kernel.ActusKernelModule._scaled_mul_div(multiplicand: uint64, multiplier: uint64, divisor: uint64) -> uint64: _scaled_mul_div: - // modules/kernel.py:153-155 + // modules/actus_kernel.py:153-155 // def _scaled_mul_div( // self, multiplicand: UInt64, multiplier: UInt64, divisor: UInt64 // ) -> UInt64: proto 3 1 - // modules/kernel.py:157 + // modules/actus_kernel.py:157 // if multiplicand == UInt64(0) or multiplier == UInt64(0): frame_dig -3 bz _scaled_mul_div_if_body@2 @@ -4957,40 +4957,40 @@ _scaled_mul_div: bnz _scaled_mul_div_after_if_else@3 _scaled_mul_div_if_body@2: - // modules/kernel.py:158 + // modules/actus_kernel.py:158 // return UInt64(0) intc_0 // 0 retsub _scaled_mul_div_after_if_else@3: - // modules/kernel.py:159 + // modules/actus_kernel.py:159 // high, low = op.mulw(multiplicand, multiplier) frame_dig -3 frame_dig -2 mulw - // modules/kernel.py:160 + // modules/actus_kernel.py:160 // return op.divw(high, low, divisor) frame_dig -1 divw retsub -// modules.kernel.ActusKernelModule._amount_to_index_delta(amount: uint64) -> uint64: +// modules.actus_kernel.ActusKernelModule._amount_to_index_delta(amount: uint64) -> uint64: _amount_to_index_delta: - // modules/kernel.py:162 + // modules/actus_kernel.py:162 // def _amount_to_index_delta(self, amount: UInt64) -> UInt64: proto 1 1 - // modules/kernel.py:164 + // modules/actus_kernel.py:164 // if amount == UInt64(0): frame_dig -1 bnz _amount_to_index_delta_after_if_else@2 - // modules/kernel.py:165 + // modules/actus_kernel.py:165 // return UInt64(0) intc_0 // 0 retsub _amount_to_index_delta_after_if_else@2: - // modules/kernel.py:166 + // modules/actus_kernel.py:166 // assert self.total_units > UInt64(0), err.NO_UNITS intc_0 // 0 bytec 13 // "total_units" @@ -4998,7 +4998,7 @@ _amount_to_index_delta_after_if_else@2: assert // check self.total_units exists dup assert // No D-ASA units - // modules/kernel.py:167 + // modules/actus_kernel.py:167 // return self._scaled_mul_div(amount, self.fixed_point_scale, self.total_units) intc_0 // 0 bytec 5 // "fixed_point_scale" @@ -5011,34 +5011,34 @@ _amount_to_index_delta_after_if_else@2: retsub -// modules.kernel.ActusKernelModule._index_delta_to_amount(index_delta: uint64) -> uint64: +// modules.actus_kernel.ActusKernelModule._index_delta_to_amount(index_delta: uint64) -> uint64: _index_delta_to_amount: - // modules/kernel.py:169 + // modules/actus_kernel.py:169 // def _index_delta_to_amount(self, index_delta: UInt64) -> UInt64: proto 1 1 - // modules/kernel.py:176 + // modules/actus_kernel.py:176 // if index_delta == UInt64(0): frame_dig -1 bnz _index_delta_to_amount_after_if_else@2 - // modules/kernel.py:177 + // modules/actus_kernel.py:177 // return UInt64(0) intc_0 // 0 retsub _index_delta_to_amount_after_if_else@2: - // modules/kernel.py:179 + // modules/actus_kernel.py:179 // self.total_units, intc_0 // 0 bytec 13 // "total_units" app_global_get_ex assert // check self.total_units exists - // modules/kernel.py:181 + // modules/actus_kernel.py:181 // self.fixed_point_scale, intc_0 // 0 bytec 5 // "fixed_point_scale" app_global_get_ex assert // check self.fixed_point_scale exists - // modules/kernel.py:178-182 + // modules/actus_kernel.py:178-182 // return self._scaled_mul_div( // self.total_units, // index_delta, @@ -5050,12 +5050,12 @@ _index_delta_to_amount_after_if_else@2: retsub -// modules.kernel.ActusKernelModule._get_schedule_entry(event_id: uint64) -> bytes: +// modules.actus_kernel.ActusKernelModule._get_schedule_entry(event_id: uint64) -> bytes: _get_schedule_entry: - // modules/kernel.py:202 + // modules/actus_kernel.py:202 // def _get_schedule_entry(self, event_id: UInt64) -> typ.ExecutionScheduleEntry: proto 1 1 - // modules/kernel.py:204 + // modules/actus_kernel.py:204 // assert event_id < self.schedule_entry_count, err.INVALID_EVENT_ID intc_0 // 0 bytec 4 // "schedule_entry_count" @@ -5064,12 +5064,12 @@ _get_schedule_entry: frame_dig -1 > assert // Invalid event id - // modules/kernel.py:190 + // modules/actus_kernel.py:190 // return event_id // UInt64(cst.SCHEDULE_PAGE_SIZE) frame_dig -1 pushint 16 / - // modules/kernel.py:206 + // modules/actus_kernel.py:206 // assert page_index in self.schedule_page, err.INVALID_SCHEDULE_PAGE itob bytec 31 // 0x5323 @@ -5079,12 +5079,12 @@ _get_schedule_entry: box_len bury 1 assert // Invalid schedule page - // modules/kernel.py:194 + // modules/actus_kernel.py:194 // return event_id % UInt64(cst.SCHEDULE_PAGE_SIZE) frame_dig -1 pushint 16 % - // modules/kernel.py:209 + // modules/actus_kernel.py:209 // assert offset < page.length, err.INVALID_SCHEDULE_PAGE dig 1 intc_0 // 0 @@ -5094,7 +5094,7 @@ _get_schedule_entry: dig 1 > assert // Invalid schedule page - // modules/kernel.py:210 + // modules/actus_kernel.py:210 // return page[offset].copy() pushint 65 * @@ -5105,69 +5105,69 @@ _get_schedule_entry: retsub -// modules.kernel.ActusKernelModule._assert_event_allowed_for_contract_type(contract_type: uint64, event_type: uint64) -> void: +// modules.actus_kernel.ActusKernelModule._assert_event_allowed_for_contract_type(contract_type: uint64, event_type: uint64) -> void: _assert_event_allowed_for_contract_type: - // modules/kernel.py:313-315 + // modules/actus_kernel.py:313-315 // def _assert_event_allowed_for_contract_type( // self, contract_type: UInt64, event_type: UInt64 // ) -> None: proto 2 0 - // modules/kernel.py:254-255 + // modules/actus_kernel.py:254-255 // # Check common events first // if event_type in common_events: frame_dig -1 - // modules/kernel.py:247 + // modules/actus_kernel.py:247 // UInt64(enums.EVT_IED), intc_1 // 1 - // modules/kernel.py:254-255 + // modules/actus_kernel.py:254-255 // # Check common events first // if event_type in common_events: == bnz _assert_event_allowed_for_contract_type_if_body@6 frame_dig -1 - // modules/kernel.py:248 + // modules/actus_kernel.py:248 // UInt64(enums.EVT_IP), intc_2 // 8 - // modules/kernel.py:254-255 + // modules/actus_kernel.py:254-255 // # Check common events first // if event_type in common_events: == bnz _assert_event_allowed_for_contract_type_if_body@6 frame_dig -1 - // modules/kernel.py:249 + // modules/actus_kernel.py:249 // UInt64(enums.EVT_MD), pushint 19 - // modules/kernel.py:254-255 + // modules/actus_kernel.py:254-255 // # Check common events first // if event_type in common_events: == bnz _assert_event_allowed_for_contract_type_if_body@6 frame_dig -1 - // modules/kernel.py:250 + // modules/actus_kernel.py:250 // UInt64(enums.EVT_RR), pushint 12 - // modules/kernel.py:254-255 + // modules/actus_kernel.py:254-255 // # Check common events first // if event_type in common_events: == bnz _assert_event_allowed_for_contract_type_if_body@6 frame_dig -1 - // modules/kernel.py:251 + // modules/actus_kernel.py:251 // UInt64(enums.EVT_RRF), pushint 11 - // modules/kernel.py:254-255 + // modules/actus_kernel.py:254-255 // # Check common events first // if event_type in common_events: == bz _assert_event_allowed_for_contract_type_after_if_else@7 _assert_event_allowed_for_contract_type_if_body@6: - // modules/kernel.py:256 + // modules/actus_kernel.py:256 // return True intc_1 // 1 -_assert_event_allowed_for_contract_type_after_inlined_modules.kernel.ActusKernelModule._event_allowed_for_contract_type@34: - // modules/kernel.py:317-319 +_assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34: + // modules/actus_kernel.py:317-319 // assert self._event_allowed_for_contract_type( // contract_type, event_type // ), err.INVALID_ACTUS_CONFIG @@ -5175,28 +5175,28 @@ _assert_event_allowed_for_contract_type_after_inlined_modules.kernel.ActusKernel retsub _assert_event_allowed_for_contract_type_after_if_else@7: - // modules/kernel.py:258-259 + // modules/actus_kernel.py:258-259 // # Contract-specific additional events // if contract_type == UInt64(enums.CT_PAM): frame_dig -2 bnz _assert_event_allowed_for_contract_type_after_if_else@9 - // modules/kernel.py:260-261 + // modules/actus_kernel.py:260-261 // # PAM only supports common events // return False intc_0 // 0 - // modules/kernel.py:317-319 + // modules/actus_kernel.py:317-319 // assert self._event_allowed_for_contract_type( // contract_type, event_type // ), err.INVALID_ACTUS_CONFIG - b _assert_event_allowed_for_contract_type_after_inlined_modules.kernel.ActusKernelModule._event_allowed_for_contract_type@34 + b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34 _assert_event_allowed_for_contract_type_after_if_else@9: - // modules/kernel.py:263 + // modules/actus_kernel.py:263 // if contract_type == UInt64(enums.CT_LAM) or contract_type == UInt64( frame_dig -2 pushint 3 == - // modules/kernel.py:263-265 + // modules/actus_kernel.py:263-265 // if contract_type == UInt64(enums.CT_LAM) or contract_type == UInt64( // enums.CT_NAM // ): @@ -5207,17 +5207,17 @@ _assert_event_allowed_for_contract_type_after_if_else@9: bz _assert_event_allowed_for_contract_type_after_if_else@16 _assert_event_allowed_for_contract_type_if_body@11: - // modules/kernel.py:266-270 + // modules/actus_kernel.py:266-270 // # LAM/NAM add: PR, IPCB // return event_type in ( // UInt64(enums.EVT_PR), // UInt64(enums.EVT_IPCB), // ) frame_dig -1 - // modules/kernel.py:268 + // modules/actus_kernel.py:268 // UInt64(enums.EVT_PR), pushint 3 - // modules/kernel.py:266-270 + // modules/actus_kernel.py:266-270 // # LAM/NAM add: PR, IPCB // return event_type in ( // UInt64(enums.EVT_PR), @@ -5226,10 +5226,10 @@ _assert_event_allowed_for_contract_type_if_body@11: == bnz _assert_event_allowed_for_contract_type_bool_true@13 frame_dig -1 - // modules/kernel.py:269 + // modules/actus_kernel.py:269 // UInt64(enums.EVT_IPCB), pushint 18 - // modules/kernel.py:266-270 + // modules/actus_kernel.py:266-270 // # LAM/NAM add: PR, IPCB // return event_type in ( // UInt64(enums.EVT_PR), @@ -5240,28 +5240,28 @@ _assert_event_allowed_for_contract_type_if_body@11: _assert_event_allowed_for_contract_type_bool_true@13: intc_1 // 1 - // modules/kernel.py:317-319 + // modules/actus_kernel.py:317-319 // assert self._event_allowed_for_contract_type( // contract_type, event_type // ), err.INVALID_ACTUS_CONFIG - b _assert_event_allowed_for_contract_type_after_inlined_modules.kernel.ActusKernelModule._event_allowed_for_contract_type@34 + b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34 _assert_event_allowed_for_contract_type_bool_false@14: intc_0 // 0 - // modules/kernel.py:317-319 + // modules/actus_kernel.py:317-319 // assert self._event_allowed_for_contract_type( // contract_type, event_type // ), err.INVALID_ACTUS_CONFIG - b _assert_event_allowed_for_contract_type_after_inlined_modules.kernel.ActusKernelModule._event_allowed_for_contract_type@34 + b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34 _assert_event_allowed_for_contract_type_after_if_else@16: - // modules/kernel.py:272 + // modules/actus_kernel.py:272 // if contract_type == UInt64(enums.CT_ANN): frame_dig -2 intc_1 // 1 == bz _assert_event_allowed_for_contract_type_after_if_else@23 - // modules/kernel.py:273-278 + // modules/actus_kernel.py:273-278 // # ANN adds: PR, IPCB, PRF // return event_type in ( // UInt64(enums.EVT_PR), @@ -5269,10 +5269,10 @@ _assert_event_allowed_for_contract_type_after_if_else@16: // UInt64(enums.EVT_PRF), // ) frame_dig -1 - // modules/kernel.py:275 + // modules/actus_kernel.py:275 // UInt64(enums.EVT_PR), pushint 3 - // modules/kernel.py:273-278 + // modules/actus_kernel.py:273-278 // # ANN adds: PR, IPCB, PRF // return event_type in ( // UInt64(enums.EVT_PR), @@ -5282,10 +5282,10 @@ _assert_event_allowed_for_contract_type_after_if_else@16: == bnz _assert_event_allowed_for_contract_type_bool_true@20 frame_dig -1 - // modules/kernel.py:276 + // modules/actus_kernel.py:276 // UInt64(enums.EVT_IPCB), pushint 18 - // modules/kernel.py:273-278 + // modules/actus_kernel.py:273-278 // # ANN adds: PR, IPCB, PRF // return event_type in ( // UInt64(enums.EVT_PR), @@ -5295,10 +5295,10 @@ _assert_event_allowed_for_contract_type_after_if_else@16: == bnz _assert_event_allowed_for_contract_type_bool_true@20 frame_dig -1 - // modules/kernel.py:277 + // modules/actus_kernel.py:277 // UInt64(enums.EVT_PRF), pushint 5 - // modules/kernel.py:273-278 + // modules/actus_kernel.py:273-278 // # ANN adds: PR, IPCB, PRF // return event_type in ( // UInt64(enums.EVT_PR), @@ -5310,28 +5310,28 @@ _assert_event_allowed_for_contract_type_after_if_else@16: _assert_event_allowed_for_contract_type_bool_true@20: intc_1 // 1 - // modules/kernel.py:317-319 + // modules/actus_kernel.py:317-319 // assert self._event_allowed_for_contract_type( // contract_type, event_type // ), err.INVALID_ACTUS_CONFIG - b _assert_event_allowed_for_contract_type_after_inlined_modules.kernel.ActusKernelModule._event_allowed_for_contract_type@34 + b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34 _assert_event_allowed_for_contract_type_bool_false@21: intc_0 // 0 - // modules/kernel.py:317-319 + // modules/actus_kernel.py:317-319 // assert self._event_allowed_for_contract_type( // contract_type, event_type // ), err.INVALID_ACTUS_CONFIG - b _assert_event_allowed_for_contract_type_after_inlined_modules.kernel.ActusKernelModule._event_allowed_for_contract_type@34 + b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34 _assert_event_allowed_for_contract_type_after_if_else@23: - // modules/kernel.py:280 + // modules/actus_kernel.py:280 // if contract_type == UInt64(enums.CT_LAX): frame_dig -2 pushint 4 == bz _assert_event_allowed_for_contract_type_after_if_else@31 - // modules/kernel.py:281-287 + // modules/actus_kernel.py:281-287 // # LAX adds: PR, PI, IPCB, PRF // return event_type in ( // UInt64(enums.EVT_PR), @@ -5340,10 +5340,10 @@ _assert_event_allowed_for_contract_type_after_if_else@23: // UInt64(enums.EVT_PRF), // ) frame_dig -1 - // modules/kernel.py:283 + // modules/actus_kernel.py:283 // UInt64(enums.EVT_PR), pushint 3 - // modules/kernel.py:281-287 + // modules/actus_kernel.py:281-287 // # LAX adds: PR, PI, IPCB, PRF // return event_type in ( // UInt64(enums.EVT_PR), @@ -5354,10 +5354,10 @@ _assert_event_allowed_for_contract_type_after_if_else@23: == bnz _assert_event_allowed_for_contract_type_bool_true@28 frame_dig -1 - // modules/kernel.py:284 + // modules/actus_kernel.py:284 // UInt64(enums.EVT_PI), pushint 4 - // modules/kernel.py:281-287 + // modules/actus_kernel.py:281-287 // # LAX adds: PR, PI, IPCB, PRF // return event_type in ( // UInt64(enums.EVT_PR), @@ -5368,10 +5368,10 @@ _assert_event_allowed_for_contract_type_after_if_else@23: == bnz _assert_event_allowed_for_contract_type_bool_true@28 frame_dig -1 - // modules/kernel.py:285 + // modules/actus_kernel.py:285 // UInt64(enums.EVT_IPCB), pushint 18 - // modules/kernel.py:281-287 + // modules/actus_kernel.py:281-287 // # LAX adds: PR, PI, IPCB, PRF // return event_type in ( // UInt64(enums.EVT_PR), @@ -5382,10 +5382,10 @@ _assert_event_allowed_for_contract_type_after_if_else@23: == bnz _assert_event_allowed_for_contract_type_bool_true@28 frame_dig -1 - // modules/kernel.py:286 + // modules/actus_kernel.py:286 // UInt64(enums.EVT_PRF), pushint 5 - // modules/kernel.py:281-287 + // modules/actus_kernel.py:281-287 // # LAX adds: PR, PI, IPCB, PRF // return event_type in ( // UInt64(enums.EVT_PR), @@ -5398,53 +5398,53 @@ _assert_event_allowed_for_contract_type_after_if_else@23: _assert_event_allowed_for_contract_type_bool_true@28: intc_1 // 1 - // modules/kernel.py:317-319 + // modules/actus_kernel.py:317-319 // assert self._event_allowed_for_contract_type( // contract_type, event_type // ), err.INVALID_ACTUS_CONFIG - b _assert_event_allowed_for_contract_type_after_inlined_modules.kernel.ActusKernelModule._event_allowed_for_contract_type@34 + b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34 _assert_event_allowed_for_contract_type_bool_false@29: intc_0 // 0 - // modules/kernel.py:317-319 + // modules/actus_kernel.py:317-319 // assert self._event_allowed_for_contract_type( // contract_type, event_type // ), err.INVALID_ACTUS_CONFIG - b _assert_event_allowed_for_contract_type_after_inlined_modules.kernel.ActusKernelModule._event_allowed_for_contract_type@34 + b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34 _assert_event_allowed_for_contract_type_after_if_else@31: - // modules/kernel.py:289 + // modules/actus_kernel.py:289 // if contract_type == UInt64(enums.CT_CLM): frame_dig -2 pushint 5 == bz _assert_event_allowed_for_contract_type_after_if_else@33 - // modules/kernel.py:290-291 + // modules/actus_kernel.py:290-291 // # CLM adds: PR // return event_type == UInt64(enums.EVT_PR) frame_dig -1 pushint 3 == - // modules/kernel.py:317-319 + // modules/actus_kernel.py:317-319 // assert self._event_allowed_for_contract_type( // contract_type, event_type // ), err.INVALID_ACTUS_CONFIG - b _assert_event_allowed_for_contract_type_after_inlined_modules.kernel.ActusKernelModule._event_allowed_for_contract_type@34 + b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34 _assert_event_allowed_for_contract_type_after_if_else@33: - // modules/kernel.py:293 + // modules/actus_kernel.py:293 // return False intc_0 // 0 - // modules/kernel.py:317-319 + // modules/actus_kernel.py:317-319 // assert self._event_allowed_for_contract_type( // contract_type, event_type // ), err.INVALID_ACTUS_CONFIG - b _assert_event_allowed_for_contract_type_after_inlined_modules.kernel.ActusKernelModule._event_allowed_for_contract_type@34 + b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34 -// modules.kernel.ActusKernelModule._is_dynamic_annuity() -> uint64: +// modules.actus_kernel.ActusKernelModule._is_dynamic_annuity() -> uint64: _is_dynamic_annuity: - // modules/kernel.py:335 + // modules/actus_kernel.py:335 // self.contract_type == UInt64(enums.CT_ANN) intc_0 // 0 bytec 12 // "contract_type" @@ -5452,22 +5452,22 @@ _is_dynamic_annuity: assert // check self.contract_type exists intc_1 // 1 == - // modules/kernel.py:335-336 + // modules/actus_kernel.py:335-336 // self.contract_type == UInt64(enums.CT_ANN) // and self.dynamic_principal_redemption bz _is_dynamic_annuity_bool_false@3 - // modules/kernel.py:336 + // modules/actus_kernel.py:336 // and self.dynamic_principal_redemption intc_0 // 0 bytec 34 // "dynamic_principal_redemption" app_global_get_ex assert // check self.dynamic_principal_redemption exists - // modules/kernel.py:335-336 + // modules/actus_kernel.py:335-336 // self.contract_type == UInt64(enums.CT_ANN) // and self.dynamic_principal_redemption bz _is_dynamic_annuity_bool_false@3 intc_1 // 1 - // modules/kernel.py:334-337 + // modules/actus_kernel.py:334-337 // return ( // self.contract_type == UInt64(enums.CT_ANN) // and self.dynamic_principal_redemption @@ -5476,7 +5476,7 @@ _is_dynamic_annuity: _is_dynamic_annuity_bool_false@3: intc_0 // 0 - // modules/kernel.py:334-337 + // modules/actus_kernel.py:334-337 // return ( // self.contract_type == UInt64(enums.CT_ANN) // and self.dynamic_principal_redemption @@ -5484,47 +5484,47 @@ _is_dynamic_annuity_bool_false@3: retsub -// modules.kernel.ActusKernelModule._entry_interest_segment(entry: bytes) -> uint64, bytes: +// modules.actus_kernel.ActusKernelModule._entry_interest_segment(entry: bytes) -> uint64, bytes: _entry_interest_segment: - // modules/kernel.py:380 + // modules/actus_kernel.py:380 // def _entry_interest_segment(self, entry: typ.ExecutionScheduleEntry) -> UInt64: proto 1 2 - // modules/kernel.py:389 + // modules/actus_kernel.py:389 // entry.accrual_factor == UInt64(0) frame_dig -1 pushint 17 extract_uint64 dup - // modules/kernel.py:389-391 + // modules/actus_kernel.py:389-391 // entry.accrual_factor == UInt64(0) // or self.nominal_interest_rate == UInt64(0) // or self.interest_calculation_base == UInt64(0) bz _entry_interest_segment_if_body@3 - // modules/kernel.py:390 + // modules/actus_kernel.py:390 // or self.nominal_interest_rate == UInt64(0) intc_0 // 0 bytec 9 // "nominal_interest_rate" app_global_get_ex assert // check self.nominal_interest_rate exists - // modules/kernel.py:389-391 + // modules/actus_kernel.py:389-391 // entry.accrual_factor == UInt64(0) // or self.nominal_interest_rate == UInt64(0) // or self.interest_calculation_base == UInt64(0) bz _entry_interest_segment_if_body@3 - // modules/kernel.py:391 + // modules/actus_kernel.py:391 // or self.interest_calculation_base == UInt64(0) intc_0 // 0 bytec 7 // "interest_calculation_base" app_global_get_ex assert // check self.interest_calculation_base exists - // modules/kernel.py:389-391 + // modules/actus_kernel.py:389-391 // entry.accrual_factor == UInt64(0) // or self.nominal_interest_rate == UInt64(0) // or self.interest_calculation_base == UInt64(0) bnz _entry_interest_segment_after_if_else@4 _entry_interest_segment_if_body@3: - // modules/kernel.py:393 + // modules/actus_kernel.py:393 // return UInt64(0) intc_0 // 0 frame_dig -1 @@ -5532,38 +5532,38 @@ _entry_interest_segment_if_body@3: retsub _entry_interest_segment_after_if_else@4: - // modules/kernel.py:395 + // modules/actus_kernel.py:395 // self.interest_calculation_base, intc_0 // 0 bytec 7 // "interest_calculation_base" app_global_get_ex assert // check self.interest_calculation_base exists - // modules/kernel.py:396 + // modules/actus_kernel.py:396 // self.nominal_interest_rate, intc_0 // 0 bytec 9 // "nominal_interest_rate" app_global_get_ex assert // check self.nominal_interest_rate exists - // modules/kernel.py:397 + // modules/actus_kernel.py:397 // self.fixed_point_scale, intc_0 // 0 bytec 5 // "fixed_point_scale" app_global_get_ex assert // check self.fixed_point_scale exists - // modules/kernel.py:394-398 + // modules/actus_kernel.py:394-398 // accrued = self._scaled_mul_div( // self.interest_calculation_base, // self.nominal_interest_rate, // self.fixed_point_scale, // ) callsub _scaled_mul_div - // modules/kernel.py:402 + // modules/actus_kernel.py:402 // self.fixed_point_scale, intc_0 // 0 bytec 5 // "fixed_point_scale" app_global_get_ex assert // check self.fixed_point_scale exists - // modules/kernel.py:399-403 + // modules/actus_kernel.py:399-403 // return self._scaled_mul_div( // accrued, // entry.accrual_factor, @@ -5577,38 +5577,38 @@ _entry_interest_segment_after_if_else@4: retsub -// modules.kernel.ActusKernelModule._discount_annuity_factor(discount_factor: uint64, redemption_factor: uint64) -> uint64: +// modules.actus_kernel.ActusKernelModule._discount_annuity_factor(discount_factor: uint64, redemption_factor: uint64) -> uint64: _discount_annuity_factor: - // modules/kernel.py:462-466 + // modules/actus_kernel.py:462-466 // def _discount_annuity_factor( // self, // discount_factor: UInt64, // redemption_factor: UInt64, // ) -> UInt64: proto 2 1 - // modules/kernel.py:468 + // modules/actus_kernel.py:468 // if redemption_factor == UInt64(0): frame_dig -1 bnz _discount_annuity_factor_after_if_else@2 - // modules/kernel.py:469 + // modules/actus_kernel.py:469 // return discount_factor frame_dig -2 retsub _discount_annuity_factor_after_if_else@2: - // modules/kernel.py:470 + // modules/actus_kernel.py:470 // period_rate = self.fixed_point_scale + self._scaled_mul_div( intc_0 // 0 bytec 5 // "fixed_point_scale" app_global_get_ex assert // check self.fixed_point_scale exists - // modules/kernel.py:471 + // modules/actus_kernel.py:471 // self.nominal_interest_rate, intc_0 // 0 bytec 9 // "nominal_interest_rate" app_global_get_ex assert // check self.nominal_interest_rate exists - // modules/kernel.py:470-474 + // modules/actus_kernel.py:470-474 // period_rate = self.fixed_point_scale + self._scaled_mul_div( // self.nominal_interest_rate, // redemption_factor, @@ -5618,17 +5618,17 @@ _discount_annuity_factor_after_if_else@2: dig 2 callsub _scaled_mul_div + - // modules/kernel.py:475 + // modules/actus_kernel.py:475 // assert period_rate > UInt64(0), err.INVALID_ACTUS_CONFIG dup assert // Invalid ACTUS configuration - // modules/kernel.py:478 + // modules/actus_kernel.py:478 // self.fixed_point_scale, intc_0 // 0 bytec 5 // "fixed_point_scale" app_global_get_ex assert // check self.fixed_point_scale exists - // modules/kernel.py:476-480 + // modules/actus_kernel.py:476-480 // return self._scaled_mul_div( // discount_factor, // self.fixed_point_scale, @@ -5641,9 +5641,9 @@ _discount_annuity_factor_after_if_else@2: retsub -// modules.kernel.ActusKernelModule._apply_non_cash_schedule_entry(entry: bytes, payload: bytes) -> bytes, bytes: +// modules.actus_kernel.ActusKernelModule._apply_non_cash_schedule_entry(entry: bytes, payload: bytes) -> bytes, bytes: _apply_non_cash_schedule_entry: - // modules/kernel.py:613-615 + // modules/actus_kernel.py:613-615 // def _apply_non_cash_schedule_entry( // self, entry: typ.ExecutionScheduleEntry, payload: typ.ObservedEventRequest // ) -> None: @@ -5651,7 +5651,7 @@ _apply_non_cash_schedule_entry: intc_0 // 0 pushbytes "" dupn 8 - // modules/kernel.py:623 + // modules/actus_kernel.py:623 // assert entry.event_id == self.event_cursor, err.INVALID_EVENT_CURSOR frame_dig -2 intc_0 // 0 @@ -5662,7 +5662,7 @@ _apply_non_cash_schedule_entry: assert // check self.event_cursor exists == assert // Invalid event cursor - // modules/kernel.py:624 + // modules/actus_kernel.py:624 // assert entry.scheduled_time <= Global.latest_timestamp, err.NO_DUE_CASHFLOW frame_dig -2 pushint 9 @@ -5670,19 +5670,19 @@ _apply_non_cash_schedule_entry: global LatestTimestamp <= assert // No due cashflow to pay - // modules/kernel.py:626 + // modules/actus_kernel.py:626 // event_type = entry.event_type.as_uint64() frame_dig -2 intc_2 // 8 getbyte dup - // modules/kernel.py:627 + // modules/actus_kernel.py:627 // if event_type == UInt64(enums.EVT_IED): intc_1 // 1 == dup bz _apply_non_cash_schedule_entry_after_if_else@6 - // modules/kernel.py:135 + // modules/actus_kernel.py:135 // return self.status == UInt64(enums.STATUS_PENDING_IED) intc_0 // 0 bytec_1 // "status" @@ -5690,12 +5690,12 @@ _apply_non_cash_schedule_entry: assert // check self.status exists pushint 50 == - // modules/kernel.py:628-630 + // modules/actus_kernel.py:628-630 // # IED finalizes issuance: reserved units become activatable and the // # schedule's initial contractual state becomes live. // assert self._status_is_pending_ied(), err.INVALID_ACTUS_CONFIG assert // Invalid ACTUS configuration - // modules/kernel.py:632 + // modules/actus_kernel.py:632 // self.reserved_units_total == self.total_units intc_0 // 0 bytec 10 // "reserved_units_total" @@ -5706,12 +5706,12 @@ _apply_non_cash_schedule_entry: app_global_get_ex assert // check self.total_units exists == - // modules/kernel.py:631-633 + // modules/actus_kernel.py:631-633 // assert ( // self.reserved_units_total == self.total_units // ), err.PRIMARY_DISTRIBUTION_INCOMPLETE assert // Primary distribution is not complete - // modules/kernel.py:634 + // modules/actus_kernel.py:634 // self.outstanding_principal = entry.next_outstanding_principal frame_dig -2 pushint 49 @@ -5719,12 +5719,12 @@ _apply_non_cash_schedule_entry: bytec_3 // "outstanding_principal" dig 1 app_global_put - // modules/kernel.py:635 + // modules/actus_kernel.py:635 // self.interest_calculation_base = entry.next_outstanding_principal bytec 7 // "interest_calculation_base" swap app_global_put - // modules/kernel.py:636 + // modules/actus_kernel.py:636 // self.nominal_interest_rate = entry.next_nominal_interest_rate frame_dig -2 pushint 33 @@ -5732,12 +5732,12 @@ _apply_non_cash_schedule_entry: bytec 9 // "nominal_interest_rate" swap app_global_put - // modules/kernel.py:637 + // modules/actus_kernel.py:637 // self.accrued_interest = UInt64(0) bytec 6 // "accrued_interest" intc_0 // 0 app_global_put - // modules/kernel.py:638 + // modules/actus_kernel.py:638 // self.next_principal_redemption = entry.next_principal_redemption frame_dig -2 pushint 41 @@ -5745,7 +5745,7 @@ _apply_non_cash_schedule_entry: bytec 14 // "next_principal_redemption" swap app_global_put - // modules/kernel.py:639 + // modules/actus_kernel.py:639 // self.event_cursor += UInt64(1) intc_0 // 0 bytec_2 // "event_cursor" @@ -5756,22 +5756,22 @@ _apply_non_cash_schedule_entry: bytec_2 // "event_cursor" swap app_global_put - // modules/kernel.py:640 + // modules/actus_kernel.py:640 // self.status = UInt64(enums.STATUS_ACTIVE) bytec_1 // "status" pushint 100 app_global_put - // modules/kernel.py:451 + // modules/actus_kernel.py:451 // assert entry.event_type.as_uint64() == UInt64(enums.EVT_IED), err.NOT_EVT_IED frame_dig 11 assert // Not IED event - // modules/kernel.py:452 + // modules/actus_kernel.py:452 // return self.initial_exchange_amount intc_0 // 0 bytec 20 // "initial_exchange_amount" app_global_get_ex assert // check self.initial_exchange_amount exists - // modules/kernel.py:641-645 + // modules/actus_kernel.py:641-645 // self._emit_execution_event( // entry=entry, // payoff=self._entry_ied_amount(entry), @@ -5779,10 +5779,10 @@ _apply_non_cash_schedule_entry: // ) frame_dig -2 swap - // modules/kernel.py:644 + // modules/actus_kernel.py:644 // settled_amount=UInt64(0), intc_0 // 0 - // modules/kernel.py:641-645 + // modules/actus_kernel.py:641-645 // self._emit_execution_event( // entry=entry, // payoff=self._entry_ied_amount(entry), @@ -5791,7 +5791,7 @@ _apply_non_cash_schedule_entry: callsub _emit_execution_event dup frame_bury -2 - // modules/kernel.py:646 + // modules/actus_kernel.py:646 // return frame_dig -1 frame_bury 1 @@ -5799,7 +5799,7 @@ _apply_non_cash_schedule_entry: retsub _apply_non_cash_schedule_entry_after_if_else@6: - // modules/kernel.py:135 + // modules/actus_kernel.py:135 // return self.status == UInt64(enums.STATUS_PENDING_IED) intc_0 // 0 bytec_1 // "status" @@ -5807,11 +5807,11 @@ _apply_non_cash_schedule_entry_after_if_else@6: assert // check self.status exists pushint 50 == - // modules/kernel.py:147 + // modules/actus_kernel.py:147 // assert not self._status_is_pending_ied(), err.PENDING_IED ! assert // IED not yet executed - // modules/kernel.py:649 + // modules/actus_kernel.py:649 // self.accrued_interest += self._entry_interest_segment(entry) intc_0 // 0 bytec 6 // "accrued_interest" @@ -5824,30 +5824,30 @@ _apply_non_cash_schedule_entry_after_if_else@6: bytec 6 // "accrued_interest" swap app_global_put - // modules/kernel.py:651 + // modules/actus_kernel.py:651 // if event_type == UInt64(enums.EVT_RR): frame_dig 10 pushint 12 == bz _apply_non_cash_schedule_entry_else_body@10 - // modules/kernel.py:655 + // modules/actus_kernel.py:655 // payload.observed_rate, frame_dig -1 pushint 33 extract_uint64 - // modules/kernel.py:656 + // modules/actus_kernel.py:656 // self.rate_reset_multiplier, intc_0 // 0 bytec 36 // "rate_reset_multiplier" app_global_get_ex assert // check self.rate_reset_multiplier exists - // modules/kernel.py:657 + // modules/actus_kernel.py:657 // self.fixed_point_scale, intc_0 // 0 bytec 5 // "fixed_point_scale" app_global_get_ex assert // check self.fixed_point_scale exists - // modules/kernel.py:652-658 + // modules/actus_kernel.py:652-658 // # RR derives the next rate from an observed oracle value plus the // # contract spread / multiplier terms, then enforces floor and cap. // observed_rate = self._scaled_mul_div( @@ -5856,7 +5856,7 @@ _apply_non_cash_schedule_entry_after_if_else@6: // self.fixed_point_scale, // ) callsub _scaled_mul_div - // modules/kernel.py:660 + // modules/actus_kernel.py:660 // observed_rate + self.rate_reset_spread intc_0 // 0 bytec 35 // "rate_reset_spread" @@ -5864,7 +5864,7 @@ _apply_non_cash_schedule_entry_after_if_else@6: assert // check self.rate_reset_spread exists + frame_bury 6 - // modules/kernel.py:734 + // modules/actus_kernel.py:734 // if self.has_rate_reset_floor and rate < self.rate_reset_floor: intc_0 // 0 bytec 38 // "has_rate_reset_floor" @@ -5878,7 +5878,7 @@ _apply_non_cash_schedule_entry_after_if_else@6: frame_dig 6 > bz _apply_non_cash_schedule_entry_after_if_else@55 - // modules/kernel.py:735 + // modules/actus_kernel.py:735 // rate = self.rate_reset_floor intc_0 // 0 bytec 29 // "rate_reset_floor" @@ -5888,7 +5888,7 @@ _apply_non_cash_schedule_entry_after_if_else@6: assert // check self.rate_reset_floor exists _apply_non_cash_schedule_entry_after_if_else@55: - // modules/kernel.py:736 + // modules/actus_kernel.py:736 // if self.has_rate_reset_cap and rate > self.rate_reset_cap: intc_0 // 0 bytec 39 // "has_rate_reset_cap" @@ -5902,7 +5902,7 @@ _apply_non_cash_schedule_entry_after_if_else@55: frame_dig 6 < bz _apply_non_cash_schedule_entry_after_if_else@58 - // modules/kernel.py:737 + // modules/actus_kernel.py:737 // rate = self.rate_reset_cap intc_0 // 0 bytec 30 // "rate_reset_cap" @@ -5912,10 +5912,10 @@ _apply_non_cash_schedule_entry_after_if_else@55: assert // check self.rate_reset_cap exists _apply_non_cash_schedule_entry_after_if_else@58: - // modules/kernel.py:659 + // modules/actus_kernel.py:659 // self.nominal_interest_rate = self._clamp_rate( bytec 9 // "nominal_interest_rate" - // modules/kernel.py:659-661 + // modules/actus_kernel.py:659-661 // self.nominal_interest_rate = self._clamp_rate( // observed_rate + self.rate_reset_spread // ) @@ -5923,13 +5923,13 @@ _apply_non_cash_schedule_entry_after_if_else@58: app_global_put _apply_non_cash_schedule_entry_after_if_else@18: - // modules/kernel.py:671 + // modules/actus_kernel.py:671 // if event_type == UInt64(enums.EVT_PI): frame_dig 10 pushint 4 == bz _apply_non_cash_schedule_entry_else_body@20 - // modules/kernel.py:672 + // modules/actus_kernel.py:672 // self.outstanding_principal = entry.next_outstanding_principal frame_dig -2 pushint 49 @@ -5937,24 +5937,24 @@ _apply_non_cash_schedule_entry_after_if_else@18: bytec_3 // "outstanding_principal" dig 1 app_global_put - // modules/kernel.py:673 + // modules/actus_kernel.py:673 // self.interest_calculation_base = entry.next_outstanding_principal bytec 7 // "interest_calculation_base" swap app_global_put _apply_non_cash_schedule_entry_after_if_else@23: - // modules/kernel.py:678 + // modules/actus_kernel.py:678 // if self._is_dynamic_annuity(): callsub _is_dynamic_annuity bz _apply_non_cash_schedule_entry_else_body@29 - // modules/kernel.py:679 + // modules/actus_kernel.py:679 // if event_type == UInt64(enums.EVT_PRF): frame_dig 10 pushint 5 == bz _apply_non_cash_schedule_entry_after_if_else@30 - // modules/kernel.py:490 + // modules/actus_kernel.py:490 // discount_factor = self.fixed_point_scale intc_0 // 0 bytec 5 // "fixed_point_scale" @@ -5962,15 +5962,15 @@ _apply_non_cash_schedule_entry_after_if_else@23: swap frame_bury 2 assert // check self.fixed_point_scale exists - // modules/kernel.py:491 + // modules/actus_kernel.py:491 // denominator = UInt64(0) intc_0 // 0 frame_bury 1 - // modules/kernel.py:492 + // modules/actus_kernel.py:492 // skip_first_redemption = False intc_0 // 0 frame_bury 7 - // modules/kernel.py:494 + // modules/actus_kernel.py:494 // if entry.redemption_accrual_factor > UInt64(0): frame_dig -2 pushint 25 @@ -5978,7 +5978,7 @@ _apply_non_cash_schedule_entry_after_if_else@23: dup frame_bury 8 bz _apply_non_cash_schedule_entry_after_if_else@35 - // modules/kernel.py:495-499 + // modules/actus_kernel.py:495-499 // # An initial PRF may describe the first redemption period directly. // discount_factor = self._discount_annuity_factor( // discount_factor, @@ -5989,14 +5989,14 @@ _apply_non_cash_schedule_entry_after_if_else@23: callsub _discount_annuity_factor dup frame_bury 2 - // modules/kernel.py:501 + // modules/actus_kernel.py:501 // skip_first_redemption = True intc_1 // 1 frame_bury 7 frame_bury 1 _apply_non_cash_schedule_entry_after_if_else@35: - // modules/kernel.py:503 + // modules/actus_kernel.py:503 // future_event_id = self.event_cursor + UInt64(1) intc_0 // 0 bytec_2 // "event_cursor" @@ -6007,7 +6007,7 @@ _apply_non_cash_schedule_entry_after_if_else@35: frame_bury 3 _apply_non_cash_schedule_entry_while_top@36: - // modules/kernel.py:504 + // modules/actus_kernel.py:504 // while future_event_id < self.schedule_entry_count: intc_0 // 0 bytec 4 // "schedule_entry_count" @@ -6016,45 +6016,45 @@ _apply_non_cash_schedule_entry_while_top@36: frame_dig 3 > bz _apply_non_cash_schedule_entry_after_while@48 - // modules/kernel.py:505 + // modules/actus_kernel.py:505 // future_entry = self._get_schedule_entry(future_event_id) frame_dig 3 callsub _get_schedule_entry dup frame_bury 0 - // modules/kernel.py:506 + // modules/actus_kernel.py:506 // future_event_type = future_entry.event_type.as_uint64() intc_2 // 8 getbyte dup frame_bury 4 - // modules/kernel.py:507-508 + // modules/actus_kernel.py:507-508 // # Only redemption-bearing events contribute to the annuity denominator. // is_redemption_event = future_event_type == UInt64(enums.EVT_PR) or ( pushint 3 == - // modules/kernel.py:507-511 + // modules/actus_kernel.py:507-511 // # Only redemption-bearing events contribute to the annuity denominator. // is_redemption_event = future_event_type == UInt64(enums.EVT_PR) or ( // future_event_type == UInt64(enums.EVT_MD) // and future_entry.redemption_accrual_factor > UInt64(0) // ) bnz _apply_non_cash_schedule_entry_bool_true@40 - // modules/kernel.py:509 + // modules/actus_kernel.py:509 // future_event_type == UInt64(enums.EVT_MD) frame_dig 4 pushint 19 == - // modules/kernel.py:509-510 + // modules/actus_kernel.py:509-510 // future_event_type == UInt64(enums.EVT_MD) // and future_entry.redemption_accrual_factor > UInt64(0) bz _apply_non_cash_schedule_entry_bool_false@41 - // modules/kernel.py:510 + // modules/actus_kernel.py:510 // and future_entry.redemption_accrual_factor > UInt64(0) frame_dig 0 pushint 25 extract_uint64 - // modules/kernel.py:509-510 + // modules/actus_kernel.py:509-510 // future_event_type == UInt64(enums.EVT_MD) // and future_entry.redemption_accrual_factor > UInt64(0) bz _apply_non_cash_schedule_entry_bool_false@41 @@ -6063,20 +6063,20 @@ _apply_non_cash_schedule_entry_bool_true@40: intc_1 // 1 _apply_non_cash_schedule_entry_bool_merge@42: - // modules/kernel.py:512 + // modules/actus_kernel.py:512 // if is_redemption_event: bz _apply_non_cash_schedule_entry_after_if_else@47 - // modules/kernel.py:513 + // modules/actus_kernel.py:513 // if skip_first_redemption: frame_dig 7 bz _apply_non_cash_schedule_entry_else_body@45 - // modules/kernel.py:514 + // modules/actus_kernel.py:514 // skip_first_redemption = False intc_0 // 0 frame_bury 7 _apply_non_cash_schedule_entry_after_if_else@47: - // modules/kernel.py:521 + // modules/actus_kernel.py:521 // future_event_id += UInt64(1) frame_dig 3 intc_1 // 1 @@ -6085,12 +6085,12 @@ _apply_non_cash_schedule_entry_after_if_else@47: b _apply_non_cash_schedule_entry_while_top@36 _apply_non_cash_schedule_entry_else_body@45: - // modules/kernel.py:518 + // modules/actus_kernel.py:518 // future_entry.redemption_accrual_factor, frame_dig 0 pushint 25 extract_uint64 - // modules/kernel.py:516-519 + // modules/actus_kernel.py:516-519 // discount_factor = self._discount_annuity_factor( // discount_factor, // future_entry.redemption_accrual_factor, @@ -6100,7 +6100,7 @@ _apply_non_cash_schedule_entry_else_body@45: callsub _discount_annuity_factor dup frame_bury 2 - // modules/kernel.py:520 + // modules/actus_kernel.py:520 // denominator += discount_factor frame_dig 1 + @@ -6112,17 +6112,17 @@ _apply_non_cash_schedule_entry_bool_false@41: b _apply_non_cash_schedule_entry_bool_merge@42 _apply_non_cash_schedule_entry_after_while@48: - // modules/kernel.py:523 + // modules/actus_kernel.py:523 // assert denominator > UInt64(0), err.INVALID_ACTUS_CONFIG frame_dig 1 assert // Invalid ACTUS configuration - // modules/kernel.py:524 + // modules/actus_kernel.py:524 // numerator = self.outstanding_principal intc_0 // 0 bytec_3 // "outstanding_principal" app_global_get_ex assert // check self.outstanding_principal exists - // modules/kernel.py:525 + // modules/actus_kernel.py:525 // if entry.flags & UInt64(enums.FLAG_INITIAL_PRF) == UInt64(0): frame_dig -2 pushint 57 @@ -6130,7 +6130,7 @@ _apply_non_cash_schedule_entry_after_while@48: intc_2 // 8 & bnz _apply_non_cash_schedule_entry_after_if_else@50 - // modules/kernel.py:526-527 + // modules/actus_kernel.py:526-527 // # Subsequent PRF events amortize both principal and already accrued carry. // numerator += self.accrued_interest intc_0 // 0 @@ -6140,13 +6140,13 @@ _apply_non_cash_schedule_entry_after_while@48: + _apply_non_cash_schedule_entry_after_if_else@50: - // modules/kernel.py:530 + // modules/actus_kernel.py:530 // self.fixed_point_scale, intc_0 // 0 bytec 5 // "fixed_point_scale" app_global_get_ex assert // check self.fixed_point_scale exists - // modules/kernel.py:528-532 + // modules/actus_kernel.py:528-532 // return self._scaled_mul_div( // numerator, // self.fixed_point_scale, @@ -6154,10 +6154,10 @@ _apply_non_cash_schedule_entry_after_if_else@50: // ) frame_dig 1 callsub _scaled_mul_div - // modules/kernel.py:680 + // modules/actus_kernel.py:680 // self.next_principal_redemption = self._recalculate_annuity_payment( bytec 14 // "next_principal_redemption" - // modules/kernel.py:680-682 + // modules/actus_kernel.py:680-682 // self.next_principal_redemption = self._recalculate_annuity_payment( // entry // ) @@ -6165,7 +6165,7 @@ _apply_non_cash_schedule_entry_after_if_else@50: app_global_put _apply_non_cash_schedule_entry_after_if_else@30: - // modules/kernel.py:685 + // modules/actus_kernel.py:685 // self.event_cursor += UInt64(1) intc_0 // 0 bytec_2 // "event_cursor" @@ -6176,20 +6176,20 @@ _apply_non_cash_schedule_entry_after_if_else@30: bytec_2 // "event_cursor" swap app_global_put - // modules/kernel.py:686-690 + // modules/actus_kernel.py:686-690 // self._emit_execution_event( // entry=entry, // payoff=UInt64(0), // settled_amount=UInt64(0), // ) frame_dig -2 - // modules/kernel.py:688 + // modules/actus_kernel.py:688 // payoff=UInt64(0), intc_0 // 0 - // modules/kernel.py:689 + // modules/actus_kernel.py:689 // settled_amount=UInt64(0), dup - // modules/kernel.py:686-690 + // modules/actus_kernel.py:686-690 // self._emit_execution_event( // entry=entry, // payoff=UInt64(0), @@ -6204,7 +6204,7 @@ _apply_non_cash_schedule_entry_after_if_else@30: retsub _apply_non_cash_schedule_entry_else_body@29: - // modules/kernel.py:684 + // modules/actus_kernel.py:684 // self.next_principal_redemption = entry.next_principal_redemption frame_dig -2 pushint 41 @@ -6215,13 +6215,13 @@ _apply_non_cash_schedule_entry_else_body@29: b _apply_non_cash_schedule_entry_after_if_else@30 _apply_non_cash_schedule_entry_else_body@20: - // modules/kernel.py:674 + // modules/actus_kernel.py:674 // elif event_type == UInt64(enums.EVT_IPCB): frame_dig 10 pushint 18 == bz _apply_non_cash_schedule_entry_after_if_else@23 - // modules/kernel.py:675-676 + // modules/actus_kernel.py:675-676 // # IPCB keeps principal unchanged and only resets the interest base. // self.interest_calculation_base = self.outstanding_principal intc_0 // 0 @@ -6234,23 +6234,23 @@ _apply_non_cash_schedule_entry_else_body@20: b _apply_non_cash_schedule_entry_after_if_else@23 _apply_non_cash_schedule_entry_else_body@10: - // modules/kernel.py:662 + // modules/actus_kernel.py:662 // elif event_type == UInt64(enums.EVT_RRF): frame_dig 10 pushint 11 == bz _apply_non_cash_schedule_entry_else_body@14 - // modules/kernel.py:663 + // modules/actus_kernel.py:663 // next_rate = entry.next_nominal_interest_rate frame_dig -2 pushint 33 extract_uint64 dup frame_bury 5 - // modules/kernel.py:664 + // modules/actus_kernel.py:664 // if next_rate == UInt64(0): bnz _apply_non_cash_schedule_entry_after_if_else@13 - // modules/kernel.py:665 + // modules/actus_kernel.py:665 // next_rate = self.rate_reset_next intc_0 // 0 bytec 37 // "rate_reset_next" @@ -6260,7 +6260,7 @@ _apply_non_cash_schedule_entry_else_body@10: assert // check self.rate_reset_next exists _apply_non_cash_schedule_entry_after_if_else@13: - // modules/kernel.py:666 + // modules/actus_kernel.py:666 // self.nominal_interest_rate = next_rate bytec 9 // "nominal_interest_rate" frame_dig 5 @@ -6268,7 +6268,7 @@ _apply_non_cash_schedule_entry_after_if_else@13: b _apply_non_cash_schedule_entry_after_if_else@18 _apply_non_cash_schedule_entry_else_body@14: - // modules/kernel.py:668 + // modules/actus_kernel.py:668 // if entry.next_nominal_interest_rate != UInt64(0): frame_dig -2 pushint 33 @@ -6276,7 +6276,7 @@ _apply_non_cash_schedule_entry_else_body@14: dup frame_bury 9 bz _apply_non_cash_schedule_entry_after_if_else@18 - // modules/kernel.py:669 + // modules/actus_kernel.py:669 // self.nominal_interest_rate = entry.next_nominal_interest_rate bytec 9 // "nominal_interest_rate" frame_dig 9 @@ -6284,9 +6284,9 @@ _apply_non_cash_schedule_entry_else_body@14: b _apply_non_cash_schedule_entry_after_if_else@18 -// modules.kernel.ActusKernelModule._emit_execution_event(entry: bytes, payoff: uint64, settled_amount: uint64) -> bytes: +// modules.actus_kernel.ActusKernelModule._emit_execution_event(entry: bytes, payoff: uint64, settled_amount: uint64) -> bytes: _emit_execution_event: - // modules/kernel.py:696-702 + // modules/actus_kernel.py:696-702 // def _emit_execution_event( // self, // *, @@ -6295,44 +6295,44 @@ _emit_execution_event: // settled_amount: UInt64, // ) -> None: proto 3 1 - // modules/kernel.py:706 + // modules/actus_kernel.py:706 // contract_id=Global.current_application_id.id, global CurrentApplicationID - // modules/kernel.py:707 + // modules/actus_kernel.py:707 // event_id=entry.event_id, frame_dig -3 intc_0 // 0 extract_uint64 - // modules/kernel.py:708 + // modules/actus_kernel.py:708 // event_type=entry.event_type, frame_dig -3 extract 8 1 - // modules/kernel.py:709 + // modules/actus_kernel.py:709 // scheduled_time=entry.scheduled_time, frame_dig -3 extract 9 8 - // modules/kernel.py:710 + // modules/actus_kernel.py:710 // applied_at=Global.latest_timestamp, global LatestTimestamp - // modules/kernel.py:713 + // modules/actus_kernel.py:713 // self._payoff_sign(entry.event_type.as_uint64(), payoff) frame_dig -3 - // modules/kernel.py:708 + // modules/actus_kernel.py:708 // event_type=entry.event_type, intc_2 // 8 - // modules/kernel.py:713 + // modules/actus_kernel.py:713 // self._payoff_sign(entry.event_type.as_uint64(), payoff) getbyte - // modules/kernel.py:742 + // modules/actus_kernel.py:742 // if payoff == UInt64(0): frame_dig -2 bnz _emit_execution_event_after_if_else@3 - // modules/kernel.py:743 + // modules/actus_kernel.py:743 // return UInt64(enums.PAYOFF_SIGN_POSITIVE) intc_1 // 1 -_emit_execution_event_after_inlined_modules.kernel.ActusKernelModule._payoff_sign@7: - // modules/kernel.py:712-714 +_emit_execution_event_after_inlined_modules.actus_kernel.ActusKernelModule._payoff_sign@7: + // modules/actus_kernel.py:712-714 // payoff_sign=arc4.UInt8( // self._payoff_sign(entry.event_type.as_uint64(), payoff) // ), @@ -6343,19 +6343,19 @@ _emit_execution_event_after_inlined_modules.kernel.ActusKernelModule._payoff_sig <= assert // overflow extract 7 1 - // modules/kernel.py:716 + // modules/actus_kernel.py:716 // currency_id=self.settlement_asset_id, intc_0 // 0 bytec 19 // "settlement_asset_id" app_global_get_ex assert // check self.settlement_asset_id exists - // modules/kernel.py:717 + // modules/actus_kernel.py:717 // sequence=entry.event_id + UInt64(1), frame_dig 1 dup intc_1 // 1 + - // modules/kernel.py:705-718 + // modules/actus_kernel.py:705-718 // ExecutionEvent( // contract_id=Global.current_application_id.id, // event_id=entry.event_id, @@ -6396,7 +6396,7 @@ _emit_execution_event_after_inlined_modules.kernel.ActusKernelModule._payoff_sig swap itob concat - // modules/kernel.py:704-719 + // modules/actus_kernel.py:704-719 // arc4.emit( // ExecutionEvent( // contract_id=Global.current_application_id.id, @@ -6422,7 +6422,7 @@ _emit_execution_event_after_inlined_modules.kernel.ActusKernelModule._payoff_sig retsub _emit_execution_event_after_if_else@3: - // modules/kernel.py:744 + // modules/actus_kernel.py:744 // if event_type in (UInt64(enums.EVT_IED), UInt64(enums.EVT_PI)): frame_dig 5 intc_1 // 1 @@ -6434,20 +6434,20 @@ _emit_execution_event_after_if_else@3: bz _emit_execution_event_after_if_else@6 _emit_execution_event_if_body@5: - // modules/kernel.py:745 + // modules/actus_kernel.py:745 // return UInt64(enums.PAYOFF_SIGN_POSITIVE) intc_1 // 1 - // modules/kernel.py:713 + // modules/actus_kernel.py:713 // self._payoff_sign(entry.event_type.as_uint64(), payoff) - b _emit_execution_event_after_inlined_modules.kernel.ActusKernelModule._payoff_sign@7 + b _emit_execution_event_after_inlined_modules.actus_kernel.ActusKernelModule._payoff_sign@7 _emit_execution_event_after_if_else@6: - // modules/kernel.py:746 + // modules/actus_kernel.py:746 // return UInt64(enums.PAYOFF_SIGN_NEGATIVE) pushint 255 - // modules/kernel.py:713 + // modules/actus_kernel.py:713 // self._payoff_sign(entry.event_type.as_uint64(), payoff) - b _emit_execution_event_after_inlined_modules.kernel.ActusKernelModule._payoff_sign@7 + b _emit_execution_event_after_inlined_modules.actus_kernel.ActusKernelModule._payoff_sign@7 // modules.rbac.RbacModule._role_is_active(role_map: bytes, role_address: bytes) -> uint64: diff --git a/smart_contracts/artifacts/d_asa/DASA.arc56.json b/smart_contracts/artifacts/d_asa/DASA.arc56.json index 29943434..45c17f73 100644 --- a/smart_contracts/artifacts/d_asa/DASA.arc56.json +++ b/smart_contracts/artifacts/d_asa/DASA.arc56.json @@ -2201,7 +2201,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCAzMgogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1ICJzdGF0dXMiICJldmVudF9jdXJzb3IiICJvdXRzdGFuZGluZ19wcmluY2lwYWwiICJzY2hlZHVsZV9lbnRyeV9jb3VudCIgImZpeGVkX3BvaW50X3NjYWxlIiAiYWNjcnVlZF9pbnRlcmVzdCIgImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMgIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIgInJlc2VydmVkX3VuaXRzX3RvdGFsIiAicmVzZXJ2ZWRfcHJpbmNpcGFsIiAiY29udHJhY3RfdHlwZSIgInRvdGFsX3VuaXRzIiAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIgInJlc2VydmVkX2ludGVyZXN0IiAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIgImN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IiAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMgInNldHRsZW1lbnRfYXNzZXRfaWQiICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIgMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMgMHg1MjIzNTA3MjY5NmQ2MTcyNzk0NDY1NjE2YzY1NzIyMyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMgMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzIDB4NTIyMzRmNzA0NDYxNjU2ZDZmNmUyMyAiaW5pdGlhbF9leGNoYW5nZV9kYXRlIiAidHJhbnNmZXJfb3BlbmluZ19kYXRlIiAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIiAicmF0ZV9yZXNldF9mbG9vciIgInJhdGVfcmVzZXRfY2FwIiAweDUzMjMgMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMyAiYXNzZXRfc3VzcGVuZGVkIiAiZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiIgInJhdGVfcmVzZXRfc3ByZWFkIiAicmF0ZV9yZXNldF9tdWx0aXBsaWVyIiAicmF0ZV9yZXNldF9uZXh0IiAiaGFzX3JhdGVfcmVzZXRfZmxvb3IiICJoYXNfcmF0ZV9yZXNldF9jYXAiIDB4MDAgImFzc2V0X2RlZmF1bHRlZCIgInByb3NwZWN0dXNfaGFzaCIgInByb3NwZWN0dXNfdXJsIiAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIiAibWF0dXJpdHlfZGF0ZSIgImRheV9jb3VudF9jb252ZW50aW9uIiAweDA2ODEwMQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4LTI5CiAgICAvLyAjIFJCQUMgUm9sZXMKICAgIC8vIHNlbGYuYXJyYW5nZXIgPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX0FSUkFOR0VSKQogICAgYnl0ZWMgMTggLy8gMHg1MjIzNDE3MjcyNjE2ZTY3NjU3MjIzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzAKICAgIC8vIHNlbGYub3BfZGFlbW9uID0gR2xvYmFsU3RhdGUoQWNjb3VudCgpLCBrZXk9Y3N0LlBSRUZJWF9JRF9PUF9EQUVNT04pCiAgICBieXRlYyAyNSAvLyAweDUyMjM0ZjcwNDQ2MTY1NmQ2ZjZlMjMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo0Ny00OAogICAgLy8gIyBELUFTQSBHb3Zlcm5hbmNlCiAgICAvLyBzZWxmLmFzc2V0X3N1c3BlbmRlZCA9IEZhbHNlCiAgICBieXRlYyAzMyAvLyAiYXNzZXRfc3VzcGVuZGVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NDkKICAgIC8vIHNlbGYuYXNzZXRfZGVmYXVsdGVkID0gRmFsc2UKICAgIGJ5dGVjIDQxIC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU2LTU3CiAgICAvLyAjIENvbnRyYWN0CiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU4CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMTIgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYwLTYxCiAgICAvLyAjIFByb3NwZWN0dXMgKEluZm9ybWF0aW9uYWwpCiAgICAvLyBzZWxmLnByb3NwZWN0dXNfaGFzaCA9IEJ5dGVzKCkKICAgIGJ5dGVjIDQyIC8vICJwcm9zcGVjdHVzX2hhc2giCiAgICBwdXNoYnl0ZXMgMHgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2MgogICAgLy8gc2VsZi5wcm9zcGVjdHVzX3VybCA9IFN0cmluZygpCiAgICBieXRlYyA0MyAvLyAicHJvc3BlY3R1c191cmwiCiAgICBwdXNoYnl0ZXMgIiIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2NC02NQogICAgLy8gIyBEZW5vbWluYXRpb24KICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gQXNzZXQoKQogICAgYnl0ZWMgNDQgLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjYKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCA9IEFzc2V0KCkKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2OC02OQogICAgLy8gIyBUaW1lCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgMjYgLy8gImluaXRpYWxfZXhjaGFuZ2VfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzAKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgNDUgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjcxCiAgICAvLyBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgMjcgLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzIKICAgIC8vIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlID0gdHlwLlRpbWVTdGFtcCgpCiAgICBieXRlYyAyOCAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3NC03NQogICAgLy8gIyBEYXkgQ291bnQgQ29udmVudGlvbgogICAgLy8gc2VsZi5kYXlfY291bnRfY29udmVudGlvbiA9IFVJbnQ2NCgpCiAgICBieXRlYyA0NiAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojc3LTc4CiAgICAvLyAjIFVuaXRzCiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzID0gVUludDY0KCkKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzkKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPSBVSW50NjQoKQogICAgYnl0ZWMgMTAgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MS04MgogICAgLy8gIyBQcmluY2lwYWwKICAgIC8vIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPSBVSW50NjQoKQogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MwogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBVSW50NjQoKQogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4NAogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gVUludDY0KCkKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4NQogICAgLy8gc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gRmFsc2UKICAgIGJ5dGVjIDM0IC8vICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4Ny04OAogICAgLy8gIyBJbnRlcmVzdAogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gVUludDY0KCkKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojg5CiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgPSBVSW50NjQoKQogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTEtOTIKICAgIC8vICMgSW50ZXJlc3QgUmF0ZXMKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTMKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQgPSBVSW50NjQoKQogICAgYnl0ZWMgMzUgLy8gInJhdGVfcmVzZXRfc3ByZWFkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NAogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIgPSBVSW50NjQoKQogICAgYnl0ZWMgMzYgLy8gInJhdGVfcmVzZXRfbXVsdGlwbGllciIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTUKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9mbG9vciA9IFVJbnQ2NCgpCiAgICBieXRlYyAyOSAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTYKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9jYXAgPSBVSW50NjQoKQogICAgYnl0ZWMgMzAgLy8gInJhdGVfcmVzZXRfY2FwIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NwogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X25leHQgPSBVSW50NjQoKQogICAgYnl0ZWMgMzcgLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTgKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgPSBGYWxzZQogICAgYnl0ZWMgMzggLy8gImhhc19yYXRlX3Jlc2V0X2Zsb29yIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5OQogICAgLy8gc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgPSBGYWxzZQogICAgYnl0ZWMgMzkgLy8gImhhc19yYXRlX3Jlc2V0X2NhcCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTAxLTEwMgogICAgLy8gIyBQcmltYXJ5IERpc3RyaWJ1dGlvbgogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgPSBVSW50NjQoKQogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTAzCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0ID0gVUludDY0KCkKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA1LTEwNgogICAgLy8gIyBDdW11bGF0aXZlIFBlci1Vbml0IEZpeGVkLVBvaW50IEluZGV4ZXMKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA3CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4ID0gVUludDY0KCkKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTE1CiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciA9IFVJbnQ2NCgpCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExNgogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA9IFVJbnQ2NCgpCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTE4LTExOQogICAgLy8gIyBTY2FsaW5nCiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlID0gVUludDY0KCkKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6MjMKICAgIC8vIGFzc2VydCBUeG4uZ2xvYmFsX251bV9ieXRlX3NsaWNlID09IGNmZy5HTE9CQUxfQllURVMsIGVyci5XUk9OR19HTE9CQUxfQllURVMKICAgIHR4biBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgQnl0ZXMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjI0CiAgICAvLyBhc3NlcnQgVHhuLmdsb2JhbF9udW1fdWludCA9PSBjZmcuR0xPQkFMX1VJTlRTLCBlcnIuV1JPTkdfR0xPQkFMX1VJTlRTCiAgICB0eG4gR2xvYmFsTnVtVWludAogICAgcHVzaGludCAzNwogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgVUludHMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBhc3NlcnQgVHhuLmxvY2FsX251bV9ieXRlX3NsaWNlID09IGNmZy5MT0NBTF9CWVRFUywgZXJyLldST05HX0xPQ0FMX0JZVEVTCiAgICB0eG4gTG9jYWxOdW1CeXRlU2xpY2UKICAgICEKICAgIGFzc2VydCAvLyBXcm9uZyBMb2NhbCBCeXRlcyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6MjYKICAgIC8vIGFzc2VydCBUeG4ubG9jYWxfbnVtX3VpbnQgPT0gY2ZnLkxPQ0FMX1VJTlRTLCBlcnIuV1JPTkdfTE9DQUxfVUlOVFMKICAgIHR4biBMb2NhbE51bVVpbnQKICAgICEKICAgIGFzc2VydCAvLyBXcm9uZyBMb2NhbCBVSW50cyBhbGxvY2F0aW9uCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kX2FzYS9jb250cmFjdC5weTo4LTE4CiAgICAvLyBjbGFzcyBEQVNBKAogICAgLy8gICAgIFBheW1lbnRBZ2VudCwKICAgIC8vICAgICBUcmFuc2ZlckFnZW50LAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gICAgIGF2bV92ZXJzaW9uPTEyLAogICAgLy8gKToKICAgIHB1c2hieXRlcyAweDkxNGYwNGViIC8vIG1ldGhvZCAiY29udHJhY3RfdXBkYXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9jb250cmFjdF91cGRhdGVfcm91dGVANAoKbWFpbl9zd2l0Y2hfY2FzZV9uZXh0QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6OC0xOAogICAgLy8gY2xhc3MgREFTQSgKICAgIC8vICAgICBQYXltZW50QWdlbnQsCiAgICAvLyAgICAgVHJhbnNmZXJBZ2VudCwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBhdm1fdmVyc2lvbj0xMiwKICAgIC8vICk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBieiBtYWluX2NyZWF0ZV9Ob09wQDMxCiAgICBwdXNoYnl0ZXNzIDB4YjQ0NjE4YzggMHhlNzgzMjUyOSAweDdlYTIwZTBiIDB4NmM4NWUzZWUgMHhiZGQxYTk0NCAweGRjMDYzYjM1IDB4MTRmYzEwZWYgMHg3NGE3Mjk3ZiAweDA5ZDRmZTE0IDB4OWE5YmZhODUgMHg4NWVlZDMzZCAweDkxODUxMDRhIDB4ZDlmMjI1YWMgMHg2ZTBlNWM5NSAweGZmM2ZkNGIzIDB4ODJmNzFiMmQgMHhlZjA0ZjVkMyAweGRmMzQzNTUwIDB4M2RiZTgwYmQgMHhkZjU0ZTgyYyAweDAxMGM4Mjk5IDB4NzQwNmFjZDIgMHgxYTcyYTJlZSAvLyBtZXRob2QgImZ1bmRfZHVlX2Nhc2hmbG93cyh1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJjbGFpbV9kdWVfY2FzaGZsb3dzKGFkZHJlc3MsYnl0ZVtdKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYnl0ZVtdKSIsIG1ldGhvZCAic2V0X3RyYW5zZmVyX3NjaGVkdWxlKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbihhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInRyYW5zZmVyKGFkZHJlc3MsYWRkcmVzcyx1aW50NjQpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X2dvdl9zdXNwZW5zaW9uKGFkZHJlc3MsYm9vbCl1aW50NjQiLCBtZXRob2QgImFjY291bnRfb3BlbihhZGRyZXNzLGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X3VwZGF0ZV9wYXltZW50X2FkZHJlc3MoYWRkcmVzcyxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAiYWNjb3VudF9nZXRfcG9zaXRpb24oYWRkcmVzcykoYWRkcmVzcyx1aW50NjQsdWludDY0LGJvb2wsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImNvbnRyYWN0X2NvbmZpZygodWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYm9vbCxib29sLGJvb2wsdWludDY0KSwodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpLChieXRlWzMyXSxzdHJpbmcpKXVpbnQ2NCIsIG1ldGhvZCAiY29udHJhY3Rfc2NoZWR1bGUodWludDY0LGJvb2wsKHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpW10pdWludDY0IiwgbWV0aG9kICJleGVjdXRlX2llZCgpdWludDY0IiwgbWV0aG9kICJhcHBseV9ub25fY2FzaF9ldmVudCh1aW50NjQsKHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSl1aW50NjQiLCBtZXRob2QgImdldF9jb250cmFjdF9zdGF0ZSgpKHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJnZXRfbmV4dF9kdWVfZXZlbnQoKSh1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAicmJhY19yb3RhdGVfYXJyYW5nZXIoYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgInJiYWNfc2V0X29wX2RhZW1vbihhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19hc3NpZ25fcm9sZSh1aW50OCxhZGRyZXNzLCh1aW50NjQsdWludDY0KSl1aW50NjQiLCBtZXRob2QgInJiYWNfcmV2b2tlX3JvbGUodWludDgsYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgInJiYWNfZ292X2Fzc2V0X3N1c3BlbnNpb24oYm9vbCl1aW50NjQiLCBtZXRob2QgInJiYWNfZ2V0X2FycmFuZ2VyKClhZGRyZXNzIiwgbWV0aG9kICJyYmFjX2dldF9hZGRyZXNzX3JvbGVzKGFkZHJlc3MpKGJvb2wsYm9vbCxib29sLGJvb2wsYm9vbCkiLCBtZXRob2QgInJiYWNfZ2V0X3JvbGVfdmFsaWRpdHkodWludDgsYWRkcmVzcykodWludDY0LHVpbnQ2NCkiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBmdW5kX2R1ZV9jYXNoZmxvd3MgY2xhaW1fZHVlX2Nhc2hmbG93cyBzZXRfdHJhbnNmZXJfc2NoZWR1bGUgcHJpbWFyeV9kaXN0cmlidXRpb24gdHJhbnNmZXIgYWNjb3VudF9nb3Zfc3VzcGVuc2lvbiBhY2NvdW50X29wZW4gYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzIGFjY291bnRfZ2V0X3Bvc2l0aW9uIGNvbnRyYWN0X2NvbmZpZyBjb250cmFjdF9zY2hlZHVsZSBleGVjdXRlX2llZCBhcHBseV9ub25fY2FzaF9ldmVudCBnZXRfY29udHJhY3Rfc3RhdGUgZ2V0X25leHRfZHVlX2V2ZW50IHJiYWNfcm90YXRlX2FycmFuZ2VyIHJiYWNfc2V0X29wX2RhZW1vbiByYmFjX2Fzc2lnbl9yb2xlIHJiYWNfcmV2b2tlX3JvbGUgcmJhY19nb3ZfYXNzZXRfc3VzcGVuc2lvbiByYmFjX2dldF9hcnJhbmdlciByYmFjX2dldF9hZGRyZXNzX3JvbGVzIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHkKICAgIGVycgoKbWFpbl9jcmVhdGVfTm9PcEAzMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kX2FzYS9jb250cmFjdC5weTo4LTE4CiAgICAvLyBjbGFzcyBEQVNBKAogICAgLy8gICAgIFBheW1lbnRBZ2VudCwKICAgIC8vICAgICBUcmFuc2ZlckFnZW50LAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gICAgIGF2bV92ZXJzaW9uPTEyLAogICAgLy8gKToKICAgIHB1c2hieXRlcyAweDk1NmQ3MTU2IC8vIG1ldGhvZCAiY29udHJhY3RfY3JlYXRlKGFkZHJlc3MpdWludDY0IgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggY29udHJhY3RfY3JlYXRlCiAgICBlcnIKCm1haW5fY29udHJhY3RfdXBkYXRlX3JvdXRlQDQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBwdXNoaW50IDQgLy8gVXBkYXRlQXBwbGljYXRpb24KICAgID09CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydAogICAgYiBjb250cmFjdF91cGRhdGUKCgovLyBtb2R1bGVzLnBheW1lbnRfYWdlbnQuUGF5bWVudEFnZW50LmZ1bmRfZHVlX2Nhc2hmbG93c1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmZ1bmRfZHVlX2Nhc2hmbG93czoKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gMTAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjUwCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo1MQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo1MgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNDcKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NTUKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NTYtNTcKICAgIC8vIGZ1bmRlZF9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgLy8gZnVuZGVkX3ByaW5jaXBhbCA9IFVJbnQ2NCgwKQogICAgZHVwbiAyCgpmdW5kX2R1ZV9jYXNoZmxvd3Nfd2hpbGVfdG9wQDI6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjAKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgPCBtYXhfZXZlbnRfY291bnQKICAgIGRpZyAyCiAgICBkaWcgNAogICAgPAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjYwLTYxCiAgICAvLyBwcm9jZXNzZWRfZXZlbnRzIDwgbWF4X2V2ZW50X2NvdW50CiAgICAvLyBhbmQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAOQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjYxCiAgICAvLyBhbmQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIDwKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2MC02MQogICAgLy8gcHJvY2Vzc2VkX2V2ZW50cyA8IG1heF9ldmVudF9jb3VudAogICAgLy8gYW5kIHNlbGYuZXZlbnRfY3Vyc29yIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudAogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDkKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2MwogICAgLy8gZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoc2VsZi5ldmVudF9jdXJzb3IpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgZHVwCiAgICBidXJ5IDE3CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjQKICAgIC8vIGlmIGVudHJ5LnNjaGVkdWxlZF90aW1lID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXA6CiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgNgogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPgogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl93aGlsZUA5CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjYKICAgIC8vIGlmIG5vdCBzZWxmLl9ldmVudF9pc19jYXNoKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkpOgogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBidXJ5IDE2CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozNTEKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgaW50Y18yIC8vIDgKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjM1MC0zNTQKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX01EKSwKICAgIC8vICkKICAgID09CiAgICBkdXAKICAgIGJ1cnkgNwogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX3RydWVANTAKICAgIGRpZyAxNAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzUyCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzUwLTM1NAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfTUQpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDUwCiAgICBkaWcgMTQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjM1MwogICAgLy8gVUludDY0KGVudW1zLkVWVF9NRCksCiAgICBwdXNoaW50IDE5CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozNTAtMzU0CiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9NRCksCiAgICAvLyApCiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VANTEKCmZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX3RydWVANTA6CiAgICBpbnRjXzEgLy8gMQoKZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfbWVyZ2VANTI6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjYKICAgIC8vIGlmIG5vdCBzZWxmLl9ldmVudF9pc19jYXNoKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkpOgogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDkKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU0OAogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X2lkID09IHNlbGYuZXZlbnRfY3Vyc29yLCBlcnIuSU5WQUxJRF9FVkVOVF9DVVJTT1IKICAgIGRpZyAxNQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBjdXJzb3IKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU0OQogICAgLy8gYXNzZXJ0IGVudHJ5LnNjaGVkdWxlZF90aW1lIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLCBlcnIuTk9fRFVFX0NBU0hGTE9XCiAgICBkaWcgNAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPD0KICAgIGFzc2VydCAvLyBObyBkdWUgY2FzaGZsb3cgdG8gcGF5CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0MTMKICAgIC8vIGlmIGV2ZW50X3R5cGUgbm90IGluIChVSW50NjQoZW51bXMuRVZUX0lQKSwgVUludDY0KGVudW1zLkVWVF9NRCkpOgogICAgZGlnIDUKICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxMwogICAgZGlnIDE0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDEzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0MTQKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDEzCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfaW50ZXJlc3RfYW1vdW50QDE0OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDI2CiAgICAvLyBldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBidXJ5IDE2CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0MjcKICAgIC8vIGlmIGV2ZW50X3R5cGUgbm90IGluIChVSW50NjQoZW51bXMuRVZUX1BSKSwgVUludDY0KGVudW1zLkVWVF9NRCkpOgogICAgcHVzaGludCAzCiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE3CiAgICBkaWcgMTQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTcKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQyOAogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnRAMjY6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1NTMKICAgIC8vIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGRpZyAxNQogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgMTAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU1NgogICAgLy8gaWYgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCk6CiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUAyNwogICAgZGlnIDkKICAgIGJ1cnkgMTEKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM2OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTcyLTU3NAogICAgLy8gIyBGdW5kaW5nIHVzZXMgcGVyLXVuaXQgY3VtdWxhdGl2ZSBpbmRpY2VzIHNvIGVhY2ggaG9sZGVyIGNhbiBzZXR0bGUKICAgIC8vICMgaW5kZXBlbmRlbnRseSBmcm9tIGl0cyBjdXJyZW50IHVuaXQgYmFsYW5jZS4KICAgIC8vIGludGVyZXN0X2luZGV4X2RlbHRhID0gc2VsZi5fYW1vdW50X3RvX2luZGV4X2RlbHRhKGludGVyZXN0X2Ftb3VudF9kdWUpCiAgICBkaWcgMTIKICAgIGNhbGxzdWIgX2Ftb3VudF90b19pbmRleF9kZWx0YQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTc1CiAgICAvLyBwcmluY2lwYWxfaW5kZXhfZGVsdGEgPSBzZWxmLl9hbW91bnRfdG9faW5kZXhfZGVsdGEocHJpbmNpcGFsX2Ftb3VudF9kdWUpCiAgICBkaWcgOAogICAgY2FsbHN1YiBfYW1vdW50X3RvX2luZGV4X2RlbHRhCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1NzYKICAgIC8vIGludGVyZXN0X2Ftb3VudCA9IHNlbGYuX2luZGV4X2RlbHRhX3RvX2Ftb3VudChpbnRlcmVzdF9pbmRleF9kZWx0YSkKICAgIGRpZyAxCiAgICBjYWxsc3ViIF9pbmRleF9kZWx0YV90b19hbW91bnQKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSAxNwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTc3CiAgICAvLyBwcmluY2lwYWxfYW1vdW50ID0gc2VsZi5faW5kZXhfZGVsdGFfdG9fYW1vdW50KHByaW5jaXBhbF9pbmRleF9kZWx0YSkKICAgIGR1cAogICAgY2FsbHN1YiBfaW5kZXhfZGVsdGFfdG9fYW1vdW50CiAgICBkdXAKICAgIGJ1cnkgMTMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU3OAogICAgLy8gcmVxdWlyZWRfYW1vdW50ID0gaW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudAogICAgZGlnIDIKICAgIGRpZyAxCiAgICArCiAgICBkdXAKICAgIGJ1cnkgMTIKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjcyNwogICAgLy8gYmFsYW5jZSA9IHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQ1NgogICAgLy8gcmV0dXJuIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgKyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIGRpZyAxCiAgICArCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3MjkKICAgIC8vIGFzc2VydCBiYWxhbmNlID49IHJlc2VydmVkX3RvdGFsLCBlcnIuTk9UX0VOT1VHSF9GVU5EUwogICAgZGlnIDIKICAgIGRpZyAxCiAgICA+PQogICAgYXNzZXJ0IC8vIE5vdCBlbm91Z2ggZnVuZHMgZm9yIHRoZSBwYXltZW50CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3MzAKICAgIC8vIHJldHVybiBiYWxhbmNlIC0gcmVzZXJ2ZWRfdG90YWwKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgLQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTgwCiAgICAvLyBzZWxmLl9hdmFpbGFibGVfc2V0dGxlbWVudF9mdW5kcygpID49IHJlcXVpcmVkX2Ftb3VudAogICAgdW5jb3ZlciAyCiAgICA+PQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTc5LTU4MQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLl9hdmFpbGFibGVfc2V0dGxlbWVudF9mdW5kcygpID49IHJlcXVpcmVkX2Ftb3VudAogICAgLy8gKSwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTgzCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0ICs9IGludGVyZXN0X2Ftb3VudAogICAgdW5jb3ZlciAzCiAgICArCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTg0CiAgICAvLyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCArPSBwcmluY2lwYWxfYW1vdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICArCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU4NQogICAgLy8gc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4ICs9IGludGVyZXN0X2luZGV4X2RlbHRhCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCBleGlzdHMKICAgIHVuY292ZXIgMgogICAgKwogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTg2CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4ICs9IHByaW5jaXBhbF9pbmRleF9kZWx0YQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCBleGlzdHMKICAgICsKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1ODcKICAgIC8vIGlmIGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkgPT0gVUludDY0KGVudW1zLkVWVF9QUik6CiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBwdXNoaW50IDMKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDM4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1ODgtNTg5CiAgICAvLyAjIEZvciBQUiwgdGhlIHBlcmlvZCBpbnRlcmVzdCBzdGF5cyBhY2NydWVkIHVudGlsIGEgbGF0ZXIgSVAgb3IgTUQuCiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgKz0gc2VsZi5fZW50cnlfaW50ZXJlc3Rfc2VnbWVudChlbnRyeSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBkaWcgMTYKICAgIGNhbGxzdWIgX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQKICAgIGJ1cnkgMTgKICAgICsKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzk6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1OTIKICAgIC8vIGlmIG5vdCBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKSBvciBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NCgKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlANDEKICAgIGRpZyAxNQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU5Mi01OTQKICAgIC8vIGlmIG5vdCBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKSBvciBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NCgKICAgIC8vICAgICBlbnVtcy5FVlRfTUQKICAgIC8vICk6CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDIKCmZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDQxOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTk1CiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBkaWcgMTUKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0MjoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU5NgogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgZGlnIDEwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTk3CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBuZXh0X2ludGVyZXN0X2Jhc2UKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBkaWcgMTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1OTgKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYwMAogICAgLy8gaWYgZW50cnkuZXZlbnRfdHlwZSA9PSBhcmM0LlVJbnQ4KAogICAgZGlnIDE1CiAgICBleHRyYWN0IDggMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjAwLTYwMgogICAgLy8gaWYgZW50cnkuZXZlbnRfdHlwZSA9PSBhcmM0LlVJbnQ4KAogICAgLy8gICAgIGVudW1zLkVWVF9NRAogICAgLy8gKSBhbmQgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPT0gVUludDY0KDApOgogICAgcHVzaGJ5dGVzIDB4MTMKICAgIGI9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYwMgogICAgLy8gKSBhbmQgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPT0gVUludDY0KDApOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2MDAtNjAyCiAgICAvLyBpZiBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoCiAgICAvLyAgICAgZW51bXMuRVZUX01ECiAgICAvLyApIGFuZCBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9PSBVSW50NjQoMCk6CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYwMwogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX0VOREVEKQogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgcHVzaGludCAyMDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2MDQKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDU6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2MDYtNjEwCiAgICAvLyBzZWxmLl9lbWl0X2V4ZWN1dGlvbl9ldmVudCgKICAgIC8vICAgICBlbnRyeT1lbnRyeSwKICAgIC8vICAgICBwYXlvZmY9aW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudCwKICAgIC8vICAgICBzZXR0bGVkX2Ftb3VudD1pbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50LAogICAgLy8gKQogICAgZGlnIDE1CiAgICBkaWcgNwogICAgZHVwCiAgICBjYWxsc3ViIF9lbWl0X2V4ZWN1dGlvbl9ldmVudAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzAKICAgIC8vIGZ1bmRlZF9pbnRlcmVzdCArPSBpbnRlcmVzdF9hbW91bnQKICAgIGRpZyAxCiAgICBkaWcgMTQKICAgICsKICAgIGJ1cnkgMgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjcxCiAgICAvLyBmdW5kZWRfcHJpbmNpcGFsICs9IHByaW5jaXBhbF9hbW91bnQKICAgIGR1cAogICAgZGlnIDkKICAgICsKICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjcyCiAgICAvLyBwcm9jZXNzZWRfZXZlbnRzICs9IFVJbnQ2NCgxKQogICAgZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDMKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX3doaWxlX3RvcEAyCgpmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDM4OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTkxCiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzkKCmZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDI3OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTU3CiAgICAvLyBldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBidXJ5IDE2CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1NTgtNTYwCiAgICAvLyAjIER5bmFtaWMgYW5udWl0aWVzIGRlcml2ZSBuZXh0IHN0YXRlIGZyb20gdGhlIHBheW1lbnQgZGVjb21wb3NpdGlvbiwKICAgIC8vICMgbm90IG9ubHkgZnJvbSB0aGUgcHJlY29tcHV0ZWQgYG5leHRfKmAgZmllbGRzLgogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1BSKToKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19lbHNlX2JvZHlAMjkKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU2MgogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgLSBwcmluY2lwYWxfYW1vdW50X2R1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBkaWcgOAogICAgLQogICAgZHVwCiAgICBidXJ5IDExCiAgICBidXJ5IDExCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDI5OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTY1CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9JUCk6CiAgICBkaWcgMTQKICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUAzMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTY2CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGJ1cnkgMTEKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU2NwogICAgLy8gbmV4dF9pbnRlcmVzdF9iYXNlID0gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBidXJ5IDEyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIGV4aXN0cwogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzNgoKZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUAzMToKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU2OAogICAgLy8gZWxpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfTUQpOgogICAgZGlnIDE0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDMyCiAgICBkaWcgOQogICAgYnVyeSAxMQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzNgoKZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlAMzI6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1NjkKICAgIC8vIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAxMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTcwCiAgICAvLyBuZXh0X2ludGVyZXN0X2Jhc2UgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDExCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNzoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQyOQogICAgLy8gaWYgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCk6CiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDI1CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0MzAKICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCk6CiAgICBkaWcgMTQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDMxCiAgICAvLyByZXR1cm4gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1NTIKICAgIC8vIHByaW5jaXBhbF9hbW91bnRfZHVlID0gc2VsZi5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudChlbnRyeSkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnRAMjYKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDIwOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDMyCiAgICAvLyBpbnRlcmVzdF9kdWUgPSBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgKyBzZWxmLl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KGVudHJ5KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgIGRpZyAxNgogICAgY2FsbHN1YiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudAogICAgYnVyeSAxOAogICAgKwogICAgZHVwCiAgICBidXJ5IDEzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0MzMKICAgIC8vIGlmIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA8PSBpbnRlcmVzdF9kdWU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiBleGlzdHMKICAgID49CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyMgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDM0CiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1NTIKICAgIC8vIHByaW5jaXBhbF9hbW91bnRfZHVlID0gc2VsZi5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudChlbnRyeSkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnRAMjYKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDIyOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDM1CiAgICAvLyBwcmluY2lwYWxfYW1vdW50ID0gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIC0gaW50ZXJlc3RfZHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiBleGlzdHMKICAgIGRpZyAxMgogICAgLQogICAgZHVwCiAgICBidXJ5IDEwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0MzYKICAgIC8vIGlmIHByaW5jaXBhbF9hbW91bnQgPiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgPgogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQzNwogICAgLy8gcmV0dXJuIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTUyCiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyNDoKICAgIGRpZyA4CiAgICBidXJ5IDgKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyNgoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjU6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0NDAKICAgIC8vIGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsIDw9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBkaWcgMTUKICAgIHB1c2hpbnQgNDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGR1cDIKICAgIDw9CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0MzktNDQxCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsIDw9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQ0MgogICAgLy8gcmV0dXJuIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIC0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIHN3YXAKICAgIC0KICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTUyCiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQxNQogICAgLy8gcmV0dXJuIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCArIHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZGlnIDE2CiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBidXJ5IDE4CiAgICArCiAgICBidXJ5IDEzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1NTEKICAgIC8vIGludGVyZXN0X2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9pbnRlcmVzdF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9pbnRlcmVzdF9hbW91bnRAMTQKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl93aGlsZUA5OgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojc0CiAgICAvLyBhc3NlcnQgcHJvY2Vzc2VkX2V2ZW50cyA+IFVJbnQ2NCgwKSwgZXJyLk5PX0RVRV9DQVNIRkxPVwogICAgZGlnIDIKICAgIGR1cAogICAgYXNzZXJ0IC8vIE5vIGR1ZSBjYXNoZmxvdyB0byBwYXkKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3OAogICAgLy8gdG90YWxfZnVuZGVkPWZ1bmRlZF9pbnRlcmVzdCArIGZ1bmRlZF9wcmluY2lwYWwsCiAgICBkaWcgMgogICAgZHVwCiAgICBkaWcgMwogICAgZHVwCiAgICBjb3ZlciAzCiAgICArCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODAKICAgIC8vIHRpbWVzdGFtcD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3NS04MQogICAgLy8gcmV0dXJuIHR5cC5DYXNoRnVuZGluZ1Jlc3VsdCgKICAgIC8vICAgICBmdW5kZWRfaW50ZXJlc3Q9ZnVuZGVkX2ludGVyZXN0LAogICAgLy8gICAgIGZ1bmRlZF9wcmluY2lwYWw9ZnVuZGVkX3ByaW5jaXBhbCwKICAgIC8vICAgICB0b3RhbF9mdW5kZWQ9ZnVuZGVkX2ludGVyZXN0ICsgZnVuZGVkX3ByaW5jaXBhbCwKICAgIC8vICAgICBwcm9jZXNzZWRfZXZlbnRzPXByb2Nlc3NlZF9ldmVudHMsCiAgICAvLyAgICAgdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUA1MToKICAgIGludGNfMCAvLyAwCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDUyCgoKLy8gbW9kdWxlcy5wYXltZW50X2FnZW50LlBheW1lbnRBZ2VudC5jbGFpbV9kdWVfY2FzaGZsb3dzW3JvdXRpbmddKCkgLT4gdm9pZDoKY2xhaW1fZHVlX2Nhc2hmbG93czoKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNAogICAgLy8gaWYgc2VsZi5vcF9kYWVtb24udmFsdWUgIT0gR2xvYmFsLnplcm9fYWRkcmVzczoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNSAvLyAweDUyMjM0ZjcwNDQ2MTY1NmQ2ZjZlMjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcF9kYWVtb24gZXhpc3RzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBieiBjbGFpbV9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTcKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNgogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI1IC8vIDB4NTIyMzRmNzA0NDYxNjU2ZDZmNmUyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wX2RhZW1vbiBleGlzdHMKICAgID09CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTYtMTgKICAgIC8vIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICAvLyBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgYm56IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDE0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTcKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNi0xOAogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICBibnogY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX3RydWVAMTQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxOAogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIHR4biBTZW5kZXIKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDMyCiAgICA9PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE2LTE4CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAxNQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX3RydWVAMTQ6CiAgICBpbnRjXzEgLy8gMQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDE2OgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE1LTE5CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vICAgICBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gICAgIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICAvLyApLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNzoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5NAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5NQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNDcKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6OTgKICAgIC8vIHNlbGYuX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQoaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDIKICAgIGR1cAogICAgY2FsbHN1YiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojk5CiAgICAvLyBzZWxmLl9zZXR0bGVfcG9zaXRpb24oaG9sZGluZ19hZGRyZXNzKQogICAgY2FsbHN1YiBfc2V0dGxlX3Bvc2l0aW9uCiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTcKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNsYWltYWJsZV9pbnRlcmVzdAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZHVwCiAgICBwdXNoaW50IDczCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBidXJ5IDgKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTgKICAgIC8vICsgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgZHVwCiAgICBwdXNoaW50IDgxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDgKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTctMTE4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jbGFpbWFibGVfaW50ZXJlc3QKICAgIC8vICsgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgdW5jb3ZlciAyCiAgICArCiAgICBkdXAKICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjEwMQogICAgLy8gYXNzZXJ0IHRvdGFsX2Ftb3VudCA+IFVJbnQ2NCgwKSwgZXJyLk5PX0RVRV9DQVNIRkxPVwogICAgYXNzZXJ0IC8vIE5vIGR1ZSBjYXNoZmxvdyB0byBwYXkKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLmlzX29wdGVkX2luKAogICAgZXh0cmFjdCAwIDMyCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MjUKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MjQtMjYKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5pc19vcHRlZF9pbigKICAgIC8vICAgICBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQKICAgIC8vICkKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MjQtMjcKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5pc19vcHRlZF9pbigKICAgIC8vICAgICBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQKICAgIC8vICkKICAgIC8vIGFuZCBub3Qgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkCiAgICBieiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VAMjQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNwogICAgLy8gYW5kIG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHB1c2hpbnQgMzg0CiAgICBnZXRiaXQKICAgIGJueiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VAMjQKICAgIGludGNfMSAvLyAxCgpjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfbWVyZ2VAMjU6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA2CiAgICAvLyBpZiBzZWxmLl9pc19wYXltZW50X2V4ZWN1dGFibGUoaG9sZGluZ19hZGRyZXNzKToKICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MzMKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICBzd2FwCiAgICBkaWcgMQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBvcHRlZCBpbnRvIGFzc2V0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MzMtMzQKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICAvLyA+PSBwYXltZW50X2Ftb3VudAogICAgZGlnIDUKICAgIGR1cAogICAgY292ZXIgMgogICAgPj0KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozMi0zNQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgLy8gICAgID49IHBheW1lbnRfYW1vdW50CiAgICAvLyApLCBlcnIuTk9UX0VOT1VHSF9GVU5EUwogICAgYXNzZXJ0IC8vIE5vdCBlbm91Z2ggZnVuZHMgZm9yIHRoZSBwYXltZW50CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA4CiAgICAvLyBzZWxmLl9wYXkoc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLCB0b3RhbF9hbW91bnQpCiAgICBkaWcgMgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZHVwCiAgICBleHRyYWN0IDAgMzIKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozOS00NAogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXJlY2VpdmVyLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1hbW91bnQsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0MwogICAgLy8gZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIGdsb2JhbCBNaW5UeG5GZWUKICAgIHVuY292ZXIgMwogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgc3dhcAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MzkKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozOS00NAogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXJlY2VpdmVyLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1hbW91bnQsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTI1LTEyNgogICAgLy8gIyBHZXQgdGhlIGNsYWltYWJsZSBhbW91bnRzIGJlZm9yZSByZXNldAogICAgLy8gaW50ZXJlc3RfYW1vdW50ID0gcG9zaXRpb24uY2xhaW1hYmxlX2ludGVyZXN0CiAgICBkdXAKICAgIHB1c2hpbnQgNzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgOQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEyNwogICAgLy8gcHJpbmNpcGFsX2Ftb3VudCA9IHBvc2l0aW9uLmNsYWltYWJsZV9wcmluY2lwYWwKICAgIGR1cAogICAgcHVzaGludCA4MQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMwogICAgYnVyeSA5CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTI5LTEzMAogICAgLy8gIyBSZXNldCB0aGUgcG9zaXRpb24ncyBjbGFpbWFibGUgYW1vdW50cwogICAgLy8gcG9zaXRpb24uY2xhaW1hYmxlX2ludGVyZXN0ID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgaXRvYgogICAgc3dhcAogICAgZGlnIDEKICAgIHJlcGxhY2UyIDczCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTMxCiAgICAvLyBwb3NpdGlvbi5jbGFpbWFibGVfcHJpbmNpcGFsID0gVUludDY0KDApCiAgICBzd2FwCiAgICByZXBsYWNlMiA4MQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzMgogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSBwb3NpdGlvbi5jb3B5KCkKICAgIHVuY292ZXIgMwogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzNAogICAgLy8gYXNzZXJ0IHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgPj0gaW50ZXJlc3RfYW1vdW50LCBlcnIuTk9UX0VOT1VHSF9GVU5EUwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCBleGlzdHMKICAgIGR1cAogICAgZGlnIDIKICAgID49CiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcyBmb3IgdGhlIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzUKICAgIC8vIGFzc2VydCBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCA+PSBwcmluY2lwYWxfYW1vdW50LCBlcnIuTk9UX0VOT1VHSF9GVU5EUwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIGV4aXN0cwogICAgZGlnIDMKICAgID49CiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcyBmb3IgdGhlIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzctMTM4CiAgICAvLyAjIFVwZGF0ZSB0aGUgZ2xvYmFsIHJlc2VydmVkIGludGVyZXN0IGFuZCBwcmluY2lwYWwgYW1vdW50cwogICAgLy8gc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCAtPSBpbnRlcmVzdF9hbW91bnQKICAgIHN3YXAKICAgIC0KICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTM5CiAgICAvLyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCAtPSBwcmluY2lwYWxfYW1vdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICBzd2FwCiAgICAtCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjExNAogICAgLy8gdG90YWxfYW1vdW50PWludGVyZXN0X2Ftb3VudCArIHByaW5jaXBhbF9hbW91bnQsCiAgICBkaWcgNQogICAgZHVwCiAgICBkaWcgNgogICAgZHVwCiAgICBjb3ZlciAzCiAgICArCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTE1CiAgICAvLyB0aW1lc3RhbXA9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTExLTExNwogICAgLy8gcmV0dXJuIHR5cC5DYXNoQ2xhaW1SZXN1bHQoCiAgICAvLyAgICAgaW50ZXJlc3RfYW1vdW50PWludGVyZXN0X2Ftb3VudCwKICAgIC8vICAgICBwcmluY2lwYWxfYW1vdW50PXByaW5jaXBhbF9hbW91bnQsCiAgICAvLyAgICAgdG90YWxfYW1vdW50PWludGVyZXN0X2Ftb3VudCArIHByaW5jaXBhbF9hbW91bnQsCiAgICAvLyAgICAgdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gICAgIGNvbnRleHQ9cGF5bWVudF9pbmZvLAogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZGlnIDIKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBwdXNoYnl0ZXMgMHgwMDIyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAyNDoKICAgIGludGNfMCAvLyAwCiAgICBiIGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUAyNQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX2ZhbHNlQDE1OgogICAgaW50Y18wIC8vIDAKICAgIGIgY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDE2CgoKLy8gbW9kdWxlcy50cmFuc2Zlcl9hZ2VudC5UcmFuc2ZlckFnZW50LnNldF90cmFuc2Zlcl9zY2hlZHVsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF90cmFuc2Zlcl9zY2hlZHVsZToKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToyNgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjI3CiAgICAvLyBhc3NlcnQgb3Blbl9kYXRlIDwgY2xvc3VyZV9kYXRlLCBlcnIuSU5WQUxJRF9TT1JUSU5HCiAgICBkdXAyCiAgICA8CiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbXVzdCBiZSBzb3J0ZWQgaW4gc3RyaWN0bHkgYXNjZW5kaW5nIG9yZGVyCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjI5CiAgICAvLyBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA9IG9wZW5fZGF0ZQogICAgYnl0ZWMgMjcgLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIHVuY292ZXIgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MzAKICAgIC8vIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlID0gY2xvc3VyZV9kYXRlCiAgICBieXRlYyAyOCAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MzEKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy50cmFuc2Zlcl9hZ2VudC5UcmFuc2ZlckFnZW50LnByaW1hcnlfZGlzdHJpYnV0aW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcHJpbWFyeV9kaXN0cmlidXRpb246CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjcxCiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5wcmltYXJ5X2RlYWxlciwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDIyIC8vIDB4NTIyMzUwNzI2OTZkNjE3Mjc5NDQ2NTYxNmM2NTcyMjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDMKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQ0CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDUKICAgIC8vIGFzc2VydCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBSSU1BUllfRElTVFJJQlVUSU9OX0NMT1NFRAogICAgYXNzZXJ0IC8vIFByaW1hcnkgZGlzdHJpYnV0aW9uIGlzIGNsb3NlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgY292ZXIgMwogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo0NwogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChob2xkaW5nX2FkZHJlc3MpCiAgICBzd2FwCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQ4CiAgICAvLyBhc3NlcnQgdW5pdHMgPiBVSW50NjQoMCksIGVyci5aRVJPX1VOSVRTCiAgICBkdXAKICAgIGFzc2VydCAvLyBDYW4gbm90IGRpc3RyaWJ1dGUgemVybyB1bml0cwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo1MAogICAgLy8gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCArIHVuaXRzIDw9IHNlbGYudG90YWxfdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICArCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgPD0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDktNTEKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCArIHVuaXRzIDw9IHNlbGYudG90YWxfdW5pdHMKICAgIC8vICksIGVyci5PVkVSX0RJU1RSSUJVVElPTgogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCByZW1haW5pbmcgRC1BU0EgdW5pdHMKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NTIKICAgIC8vIGlmIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI2IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlIGV4aXN0cwogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjU0CiAgICAvLyBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8PSBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI2IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlIGV4aXN0cwogICAgPD0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NTMtNTUKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPD0gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGUKICAgIC8vICksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TRUQKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBjbG9zZWQKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNDgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnJlc2VydmVkX3VuaXRzICs9IHVuaXRzCiAgICBkdXBuIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDMKICAgIGR1cAogICAgY292ZXIgMwogICAgKwogICAgaXRvYgogICAgcHVzaGludCA0MAogICAgc3dhcAogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NTgKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgKz0gdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICArCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NTkKICAgIC8vIHJldHVybiBzZWxmLnRvdGFsX3VuaXRzIC0gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIHN3YXAKICAgIC0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMudHJhbnNmZXJfYWdlbnQuVHJhbnNmZXJBZ2VudC50cmFuc2Zlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnRyYW5zZmVyOgogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo2MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NzUKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojc2CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE0NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTMKICAgIC8vIGlmIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI3IC8vICJ0cmFuc2Zlcl9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlIGV4aXN0cwogICAgYnogdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE1CiAgICAvLyBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI3IC8vICJ0cmFuc2Zlcl9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlIGV4aXN0cwogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPD0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTQtMTYKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICksIGVyci5DTE9TRURfVFJBTlNGRVIKICAgIGFzc2VydCAvLyBUcmFuc2ZlciBpcyBjbG9zZWQKCnRyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTcKICAgIC8vIGlmIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI4IC8vICJ0cmFuc2Zlcl9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgYnogdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE5CiAgICAvLyBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8IHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjggLy8gInRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICA8CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE4LTIwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDwgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGUKICAgIC8vICksIGVyci5DTE9TRURfVFJBTlNGRVIKICAgIGFzc2VydCAvLyBUcmFuc2ZlciBpcyBjbG9zZWQKCnRyYW5zZmVyX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODAKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIGRpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgOAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIGRpZyA1CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDkKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODMKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQoc2VuZGVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojg0CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGR1cAogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4NQogICAgLy8gYXNzZXJ0IHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MgIT0gcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzLCBlcnIuU0VMRl9UUkFOU0ZFUgogICAgdW5jb3ZlciAyCiAgICAhPQogICAgYXNzZXJ0IC8vIFNlbmRlciBhbmQgcmVjZWl2ZXIgbXVzdCBiZSBkaWZmZXJlbnQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODYKICAgIC8vIGFzc2VydCB1bml0cyA+IFVJbnQ2NCgwKSwgZXJyLk5VTExfVFJBTlNGRVIKICAgIGRpZyAxCiAgICBkdXAKICAgIGFzc2VydCAvLyBUcmFuc2ZlciB1bml0cyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojg3CiAgICAvLyBhc3NlcnQgdW5pdHMgPD0gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLCBlcnIuT1ZFUl9UUkFOU0ZFUgogICAgc3dhcAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIDw9CiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IHNlbmRlciB1bml0cyB0byB0cmFuc2ZlcgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzU2CiAgICAvLyBpZiBzZWxmLmV2ZW50X2N1cnNvciA+PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICA+PQogICAgYm56IHRyYW5zZmVyX2FmdGVyX2lubGluZWRfbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Fzc2VydF9ub19kdWVfZXZlbnRfcGVuZGluZ0AxMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzU4CiAgICAvLyBuZXh0X2VudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KHNlbGYuZXZlbnRfY3Vyc29yKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojc2MAogICAgLy8gbmV4dF9lbnRyeS5zY2hlZHVsZWRfdGltZSA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3NTktNzYxCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIG5leHRfZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gKSwgZXJyLlBFTkRJTkdfQUNUVVNfRVZFTlQKICAgIGFzc2VydCAvLyBBQ1RVUyBldmVudCBub3QgeWV0IGV4ZWN1dGVkCgp0cmFuc2Zlcl9hZnRlcl9pbmxpbmVkX21vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9hc3NlcnRfbm9fZHVlX2V2ZW50X3BlbmRpbmdAMTA6CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjkwCiAgICAvLyBzZWxmLl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBkaWcgMwogICAgZHVwCiAgICBjYWxsc3ViIF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjkxCiAgICAvLyBzZWxmLl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGRpZyAzCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGNhbGxzdWIgX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6OTIKICAgIC8vIHNlbGYuX3NldHRsZV9wb3NpdGlvbihzZW5kZXJfaG9sZGluZ19hZGRyZXNzKQogICAgY2FsbHN1YiBfc2V0dGxlX3Bvc2l0aW9uCiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6OTMKICAgIC8vIHNlbGYuX3NldHRsZV9wb3NpdGlvbihyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBjYWxsc3ViIF9zZXR0bGVfcG9zaXRpb24KICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE1MgogICAgLy8gYXNzZXJ0IHVuaXRzIDw9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLCBlcnIuT1ZFUl9UUkFOU0ZFUgogICAgZGlnIDUKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGRpZyAxCiAgICA8PQogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCBzZW5kZXIgdW5pdHMgdG8gdHJhbnNmZXIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNTMKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzIC09IHVuaXRzCiAgICBkaWcgMQogICAgLQogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBpbnRjXzMgLy8gMzIKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNDQKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzICs9IHVuaXRzCiAgICBkaWcgNQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgdW5jb3ZlciAyCiAgICArCiAgICBpdG9iCiAgICBpbnRjXzMgLy8gMzIKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgZGlnIDIKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF9nb3Zfc3VzcGVuc2lvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfZ292X3N1c3BlbnNpb246CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTY1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo3NwogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYXV0aG9yaXR5LCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjEgLy8gMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTg1CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGR1cAogICAgcHVzaGludCA0OAogICAgaW50Y18xIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIHB1c2hpbnQgNDgKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTg2CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfb3Blbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfb3BlbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2OAogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjMgLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQ0ZDYxNmU2MTY3NjU3MjIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMzkKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0VOREVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDIwMAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTAKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX2VuZGVkKCksIGVyci5VTkFVVEhPUklaRUQKICAgICEKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxMQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTIKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjEzCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzQKICAgIC8vIHVuaXRzPVVJbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzItNDIKICAgIC8vIHJldHVybiB0eXAuQWNjb3VudFBvc2l0aW9uKAogICAgLy8gICAgIHBheW1lbnRfYWRkcmVzcz1wYXltZW50X2FkZHJlc3MsCiAgICAvLyAgICAgdW5pdHM9VUludDY0KDApLAogICAgLy8gICAgIHJlc2VydmVkX3VuaXRzPVVJbnQ2NCgwKSwKICAgIC8vICAgICBzdXNwZW5kZWQ9RmFsc2UsCiAgICAvLyAgICAgc2V0dGxlZF9jdXJzb3I9VUludDY0KDApLAogICAgLy8gICAgIGludGVyZXN0X2NoZWNrcG9pbnQ9VUludDY0KDApLAogICAgLy8gICAgIHByaW5jaXBhbF9jaGVja3BvaW50PVVJbnQ2NCgwKSwKICAgIC8vICAgICBjbGFpbWFibGVfaW50ZXJlc3Q9VUludDY0KDApLAogICAgLy8gICAgIGNsYWltYWJsZV9wcmluY2lwYWw9VUludDY0KDApLAogICAgLy8gKQogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBieXRlYyA0MCAvLyAweDAwCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxNAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSBzZWxmLl9uZXdfYWNjb3VudF9wb3NpdGlvbihwYXltZW50X2FkZHJlc3MpCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjE1CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzczoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMzgKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcywgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgdW5jb3ZlciAzCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjM5CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0MAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDEKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcyA9IHBheW1lbnRfYWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDIKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF9nZXRfcG9zaXRpb25bcm91dGluZ10oKSAtPiB2b2lkOgphY2NvdW50X2dldF9wb3NpdGlvbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNTkKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9jcmVhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9jcmVhdGU6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5ODAKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSBhcnJhbmdlcgogICAgYnl0ZWMgMTggLy8gMHg1MjIzNDE3MjcyNjE2ZTY3NjU3MjIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTgxCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojk2OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfY29uZmlnW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfY29uZmlnOgogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojk4MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGxlbgogICAgcHVzaGludCAxMDcKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuTm9ybWFsaXplZEFjdHVzVGVybXMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDcyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLkluaXRpYWxLZXJuZWxTdGF0ZQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIGxlbgogICAgZGlnIDEKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgdHVwbGUgZW5jb2RpbmcKICAgIGR1cAogICAgcHVzaGludCAzNAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHRhaWwgcG9pbnRlciBhdCBpbmRleCAxIG9mICh1aW50OFszMl0sKGxlbit1dGY4W10pKQogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBjb3ZlciAzCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAzNgogICAgKwogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5Qcm9zcGVjdHVzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDEyCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwMTQtMTAxNQogICAgLy8gIyBDb25maWd1cmUgQ29udHJhY3QKICAgIC8vIHNlbGYuY29udHJhY3RfdHlwZSA9IHRlcm1zLmNvbnRyYWN0X3R5cGUuYXNfdWludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ5dGVjIDEyIC8vICJjb250cmFjdF90eXBlIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICBieiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjIwCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfQU5OKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMjEKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgcHVzaGludCAyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMjIKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMjMKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgcHVzaGludCA0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMjQKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYnogY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAOAoKY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUA3OgogICAgaW50Y18xIC8vIDEKCmNvbnRyYWN0X2NvbmZpZ19ib29sX21lcmdlQDk6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMjkKICAgIC8vIGFzc2VydCBzZWxmLl9pc19zdXBwb3J0ZWRfY29udHJhY3RfdHlwZShjb250cmFjdF90eXBlKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDE3CiAgICAvLyBzZWxmLl9zdG9yZV9jb250cmFjdF9jb25maWcoc2VsZi5jb250cmFjdF90eXBlLCB0ZXJtcywgaW5pdGlhbF9zdGF0ZSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBidXJ5IDIKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozMjUKICAgIC8vIGFzc2VydCB0ZXJtcy5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBkaWcgNAogICAgZHVwCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDgKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMyNwogICAgLy8gdGVybXMuZGF5X2NvdW50X2NvbnZlbnRpb24uYXNfdWludDY0KCkKICAgIHB1c2hpbnQgNTcKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyOTctMzAzCiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgIGJ6IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGRpZyA2CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyOTkKICAgIC8vIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGRpZyA2CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozMDAKICAgIC8vIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICBwdXNoaW50IDIKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI5Ny0zMDMKICAgIC8vIHJldHVybiBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzYwKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwSVNEQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjApLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDE2CiAgICBkaWcgNgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzAxCiAgICAvLyBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyOTctMzAzCiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgID09CiAgICBibnogY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUAxNgogICAgZGlnIDYKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMwMgogICAgLy8gVUludDY0KGVudW1zLkRDQ18zMEUzNjApLAogICAgcHVzaGludCA0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyOTctMzAzCiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgID09CiAgICBieiBjb250cmFjdF9jb25maWdfYm9vbF9mYWxzZUAxNwoKY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUAxNjoKICAgIGludGNfMSAvLyAxCgpjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUAxODoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMwOS0zMTEKICAgIC8vIGFzc2VydCBzZWxmLl9pc19zdXBwb3J0ZWRfZGF5X2NvdW50X2NvbnZlbnRpb24oCiAgICAvLyAgICAgZGF5X2NvdW50X2NvbnZlbnRpb24KICAgIC8vICksIGVyci5JTlZBTElEX0RBWV9DT1VOVF9DT05WRU5USU9OCiAgICBhc3NlcnQgLy8gSW52YWxpZCBkYXktY291bnQgY29udmVudGlvbiBJRAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzI5CiAgICAvLyBpZiBjb250cmFjdF90eXBlICE9IFVJbnQ2NChlbnVtcy5DVF9BTk4pOgogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgIT0KICAgIGJ6IGNvbnRyYWN0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDIwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozMzAKICAgIC8vIGFzc2VydCBub3QgdGVybXMuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBkaWcgNAogICAgcHVzaGludCA3ODYKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgoKY29udHJhY3RfY29uZmlnX2FmdGVyX2lmX2Vsc2VAMjA6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MDAKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MDEKICAgIC8vIGFzc2VydCBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID09IFVJbnQ2NCgwKSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBELUFTQSBhbHJlYWR5IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjgwMy04MDQKICAgIC8vICMgU2V0IERlbm9taW5hdGlvbiBBc3NldAogICAgLy8gc2VsZi5fYXNzZXJ0X2Rlbm9taW5hdGlvbl9hc3NldCh0ZXJtcy5kZW5vbWluYXRpb25fYXNzZXRfaWQpCiAgICBkaWcgNAogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojc2OC03NjkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gZGVub21pbmF0aW9uIHdpdGggQVNBCiAgICAvLyBfY3JlYXRvciwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfY3JlYXRvcihkZW5vbWluYXRpb25fYXNzZXRfaWQpCiAgICBkdXAKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojc3MAogICAgLy8gYXNzZXJ0IGV4aXN0cywgZXJyLklOVkFMSURfREVOT01JTkFUSU9OCiAgICBhc3NlcnQgLy8gRGVub21pbmF0aW9uIGFzc2V0IGlzIG5vdCBwcm9wZXJseSBzZXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojc3MwogICAgLy8gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgPSBkZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIGJ5dGVjIDQ0IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjgwNy04MDgKICAgIC8vICMgU2V0IFNldHRsZW1lbnQgQXNzZXQKICAgIC8vIHNlbGYuX2Fzc2VydF9zZXR0bGVtZW50X2Fzc2V0KHRlcm1zLnNldHRsZW1lbnRfYXNzZXRfaWQpCiAgICBkaWcgMQogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Nzc4CiAgICAvLyBzZXR0bGVtZW50X2Fzc2V0X2lkID09IHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgPT0KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojc3Ni03NzkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzZXR0bGVtZW50IGFzc2V0IGlzIHRoZSBkZW5vbWluYXRpb24gYXNzZXQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgLy8gKSwgZXJyLklOVkFMSURfU0VUVExFTUVOVF9BU1NFVAogICAgYXNzZXJ0IC8vIERpZmZlcmVudCBzZXR0bGVtZW50IGFzc2V0IG5vdCBzdXBwb3J0ZWQsIG11c3QgYmUgZXF1YWwgdG8gZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3ODIKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCA9IHNldHRsZW1lbnRfYXNzZXRfaWQKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3ODMtNzg5CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3ODgKICAgIC8vIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3ODYKICAgIC8vIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Nzg3CiAgICAvLyBhc3NldF9hbW91bnQ9MCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3ODMtNzg0CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojc4My03ODkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gc2V0dGxlbWVudCB3aXRoIEFTQQogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PTAsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MTEtODEyCiAgICAvLyAjIFVuaXRzCiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzID0gdGVybXMudG90YWxfdW5pdHMKICAgIGR1cAogICAgcHVzaGludCAxNwogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MTMKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDEwIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODE1LTgxNgogICAgLy8gIyBEYXktQ291bnQgQ29udmVudGlvbnMKICAgIC8vIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPSB0ZXJtcy5kYXlfY291bnRfY29udmVudGlvbi5hc191aW50NjQoKQogICAgYnl0ZWMgNDYgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgZGlnIDgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MTgtODE5CiAgICAvLyAjIFRpbWUKICAgIC8vIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlID0gdGVybXMuaW5pdGlhbF9leGNoYW5nZV9kYXRlCiAgICBkdXAKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAyNiAvLyAiaW5pdGlhbF9leGNoYW5nZV9kYXRlIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MjAKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IHRlcm1zLm1hdHVyaXR5X2RhdGUKICAgIGRpZyAxCiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNDUgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjgyMQogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gaW5pdGlhbF9zdGF0ZS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBkaWcgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBwdXNoaW50IDQ4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODIzLTgyNAogICAgLy8gIyBQcmluY2lwYWwKICAgIC8vIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPSB0ZXJtcy5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudAogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgZGlnIDEwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODI1CiAgICAvLyBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSB0ZXJtcy5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBkaWcgMwogICAgcHVzaGludCA3ODYKICAgIGdldGJpdAogICAgYnl0ZWMgMzQgLy8gImR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODI2CiAgICAvLyBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9IGluaXRpYWxfc3RhdGUub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBkaWcgMQogICAgcHVzaGludCAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjXzMgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MjgtODI5CiAgICAvLyAjIEludGVyZXN0CiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgPSBpbml0aWFsX3N0YXRlLmFjY3J1ZWRfaW50ZXJlc3QKICAgIGRpZyAxCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MzEtODMyCiAgICAvLyAjIEludGVyZXN0IFJhdGUKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gaW5pdGlhbF9zdGF0ZS5ub21pbmFsX2ludGVyZXN0X3JhdGUKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODMzCiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBpbml0aWFsX3N0YXRlLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UKICAgIGRpZyAxCiAgICBwdXNoaW50IDI0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MzQKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQgPSB0ZXJtcy5yYXRlX3Jlc2V0X3NwcmVhZAogICAgZGlnIDMKICAgIHB1c2hpbnQgNTgKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzNSAvLyAicmF0ZV9yZXNldF9zcHJlYWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODM1CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciA9IHRlcm1zLnJhdGVfcmVzZXRfbXVsdGlwbGllcgogICAgZGlnIDMKICAgIHB1c2hpbnQgNjYKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzNiAvLyAicmF0ZV9yZXNldF9tdWx0aXBsaWVyIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjgzNgogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X2Zsb29yID0gdGVybXMucmF0ZV9yZXNldF9mbG9vcgogICAgZGlnIDMKICAgIHB1c2hpbnQgNzQKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAyOSAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MzcKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9jYXAgPSB0ZXJtcy5yYXRlX3Jlc2V0X2NhcAogICAgZGlnIDMKICAgIHB1c2hpbnQgODIKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzMCAvLyAicmF0ZV9yZXNldF9jYXAiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODM4CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfbmV4dCA9IHRlcm1zLnJhdGVfcmVzZXRfbmV4dAogICAgZGlnIDMKICAgIHB1c2hpbnQgOTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzNyAvLyAicmF0ZV9yZXNldF9uZXh0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjgzOQogICAgLy8gc2VsZi5oYXNfcmF0ZV9yZXNldF9mbG9vciA9IHRlcm1zLmhhc19yYXRlX3Jlc2V0X2Zsb29yCiAgICBkaWcgMwogICAgcHVzaGludCA3ODQKICAgIGdldGJpdAogICAgYnl0ZWMgMzggLy8gImhhc19yYXRlX3Jlc2V0X2Zsb29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojg0MAogICAgLy8gc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgPSB0ZXJtcy5oYXNfcmF0ZV9yZXNldF9jYXAKICAgIGRpZyAzCiAgICBwdXNoaW50IDc4NQogICAgZ2V0Yml0CiAgICBieXRlYyAzOSAvLyAiaGFzX3JhdGVfcmVzZXRfY2FwIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojg0Mi04NDMKICAgIC8vICMgU2NhbGluZwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSA9IHRlcm1zLmZpeGVkX3BvaW50X3NjYWxlCiAgICB1bmNvdmVyIDMKICAgIHB1c2hpbnQgOTkKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4NDUtODQ2CiAgICAvLyAjIFNjaGVkdWxlIFByb2Nlc3NpbmcKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yID0gaW5pdGlhbF9zdGF0ZS5ldmVudF9jdXJzb3IKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4NDgtODQ5CiAgICAvLyAjIFBlci1Vbml0IEZpeGVkLVBvaW50IEluZGV4ZXMKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCA9IGluaXRpYWxfc3RhdGUuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleAogICAgZGlnIDEKICAgIHB1c2hpbnQgNTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4NTAKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggPSBpbml0aWFsX3N0YXRlLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4CiAgICBkaWcgMQogICAgcHVzaGludCA2NAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4NTItODUzCiAgICAvLyAjIFJlc2VydmVkIEFtb3VudCAoZm9yIGV4ZWN1dGVkIGNhc2hmbG93cykKICAgIC8vIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODU0CiAgICAvLyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODU2CiAgICAvLyBhc3NlcnQgdGVybXMuaW5pdGlhbF9leGNoYW5nZV9kYXRlID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsIGVyci5JTlZBTElEX0lFRAogICAgZGlnIDIKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgID4KICAgIGFzc2VydCAvLyBJRUQgbXVzdCBiZSBzZXQgaW4gdGhlIGZ1dHVyZQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODU3CiAgICAvLyBhc3NlcnQgdGVybXMuaW5pdGlhbF9leGNoYW5nZV9kYXRlID4gaW5pdGlhbF9zdGF0ZS5zdGF0dXNfZGF0ZSwgZXJyLklOVkFMSURfSUVECiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICA8CiAgICBhc3NlcnQgLy8gSUVEIG11c3QgYmUgc2V0IGluIHRoZSBmdXR1cmUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojg1OAogICAgLy8gYXNzZXJ0IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA8IHRlcm1zLm1hdHVyaXR5X2RhdGUsIGVyci5JTlZBTElEX0lFRAogICAgPAogICAgYXNzZXJ0IC8vIElFRCBtdXN0IGJlIHNldCBpbiB0aGUgZnV0dXJlCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDE5LTEwMjAKICAgIC8vICMgTm90YXJpemUgcHJvc3BlY3R1cyAob3B0aW9uYWwpCiAgICAvLyBzZWxmLnByb3NwZWN0dXNfaGFzaCA9IHByb3NwZWN0dXMuaGFzaC5ieXRlcwogICAgZGlnIDIKICAgIGV4dHJhY3QgMCAzMgogICAgYnl0ZWMgNDIgLy8gInByb3NwZWN0dXNfaGFzaCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDIxCiAgICAvLyBzZWxmLnByb3NwZWN0dXNfdXJsID0gcHJvc3BlY3R1cy51cmwKICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgYnl0ZWMgNDMgLy8gInByb3NwZWN0dXNfdXJsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwMjIKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNvbnRyYWN0X2NvbmZpZ19ib29sX2ZhbHNlQDE3OgogICAgaW50Y18wIC8vIDAKICAgIGIgY29udHJhY3RfY29uZmlnX2Jvb2xfbWVyZ2VAMTgKCmNvbnRyYWN0X2NvbmZpZ19ib29sX2ZhbHNlQDg6CiAgICBpbnRjXzAgLy8gMAogICAgYiBjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUA5CgoKLy8gbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3Rfc2NoZWR1bGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9zY2hlZHVsZToKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gMwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTAyNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBzd2FwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgMwogICAgZHVwCiAgICBwdXNoaW50IDY1CiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIHVuY292ZXIgMgogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8c21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5FeGVjdXRpb25TY2hlZHVsZUVudHJ5PgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTAzOQogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDQyCiAgICAvLyBjb250cmFjdF90eXBlPXNlbGYuY29udHJhY3RfdHlwZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBjb3ZlciAzCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODc0CiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIEQtQVNBIGFscmVhZHkgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODc1LTg3NwogICAgLy8gYXNzZXJ0IHNjaGVkdWxlX3BhZ2UubGVuZ3RoIDw9IFVJbnQ2NCgKICAgIC8vICAgICBjc3QuU0NIRURVTEVfUEFHRV9TSVpFCiAgICAvLyApLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBkdXAKICAgIHB1c2hpbnQgMTYKICAgIDw9CiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4NzgKICAgIC8vIGFzc2VydCBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID4gVUludDY0KDApLCBlcnIuVEVSTVNfTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMCAvLyAiaW5pdGlhbF9leGNoYW5nZV9hbW91bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0EgdGVybXMgbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojg4MAogICAgLy8gcGFnZV9jdXJzb3IgPSBzY2hlZHVsZV9wYWdlX2luZGV4ICogVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpCiAgICBzd2FwCiAgICBwdXNoaW50IDE2CiAgICAqCiAgICBzd2FwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4ODcKICAgIC8vICsgcGFnZV9sZW5ndGggKiBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19QRVJfRU5UUllfQlVER0VUKQogICAgcHVzaGludCAxMDAKICAgICoKICAgIHB1c2hpbnQgMTUxMAogICAgKwoKY29udHJhY3Rfc2NoZWR1bGVfd2hpbGVfdG9wQDI6CiAgICBkdXAKICAgIGdsb2JhbCBPcGNvZGVCdWRnZXQKICAgID4KICAgIGJ6IGNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX3doaWxlQDUKICAgIGl0eG5fYmVnaW4KICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBwdXNoaW50IDUgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICBieXRlYyA0NyAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW0KICAgIGJ5dGVjIDQ3IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBiIGNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEAyCgpjb250cmFjdF9zY2hlZHVsZV9hZnRlcl93aGlsZUA1OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODkwCiAgICAvLyBpbmRleCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTAKCmNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEA2OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODkxCiAgICAvLyB3aGlsZSBpbmRleCA8IHBhZ2VfbGVuZ3RoOgogICAgZGlnIDkKICAgIGRpZyA0CiAgICA8CiAgICBieiBjb250cmFjdF9zY2hlZHVsZV9hZnRlcl93aGlsZUAxNQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODkyLTg5MwogICAgLy8gZW50cnkgPSBzY2hlZHVsZV9wYWdlW2luZGV4XS5jb3B5KCkKICAgIC8vIGVudHJ5X2V2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBkaWcgNAogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgYnVyeSAxMwogICAgZGlnIDEwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgNjUKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODkzCiAgICAvLyBlbnRyeV9ldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4OTItODkzCiAgICAvLyBlbnRyeSA9IHNjaGVkdWxlX3BhZ2VbaW5kZXhdLmNvcHkoKQogICAgLy8gZW50cnlfZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGludGNfMiAvLyA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4OTMKICAgIC8vIGVudHJ5X2V2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBnZXRieXRlCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgMTQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojg5NAogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X2lkID09IHBhZ2VfY3Vyc29yICsgaW5kZXgsIGVyci5JTlZBTElEX0VWRU5UX0lECiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEzCiAgICBkaWcgNQogICAgdW5jb3ZlciA0CiAgICArCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4OTUtODk3CiAgICAvLyBzZWxmLl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBlbnRyeV9ldmVudF90eXBlCiAgICAvLyApCiAgICBkaWcgNQogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODk4CiAgICAvLyBhc3NlcnQgZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgc3dhcAogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4OTkKICAgIC8vIGlmIGVudHJ5LmV2ZW50X2lkID4gVUludDY0KDApOgogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxMgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTAwCiAgICAvLyBpZiBpbmRleCA+IFVJbnQ2NCgwKToKICAgIGRpZyA5CiAgICBieiBjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlAMTAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjkwMQogICAgLy8gcHJldmlvdXNfZW50cnkgPSBzY2hlZHVsZV9wYWdlW2luZGV4IC0gVUludDY0KDEpXS5jb3B5KCkKICAgIGRpZyA5CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgcHVzaGludCA2NQogICAgKgogICAgZGlnIDEyCiAgICBzd2FwCiAgICBwdXNoaW50IDY1CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTE6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5MTYKICAgIC8vIHByZXZpb3VzX2VudHJ5LnNjaGVkdWxlZF90aW1lIDw9IGVudHJ5LnNjaGVkdWxlZF90aW1lCiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgOAogICAgPD0KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjkxNS05MTcKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgcHJldmlvdXNfZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gZW50cnkuc2NoZWR1bGVkX3RpbWUKICAgIC8vICksIGVyci5JTlZBTElEX1NPUlRJTkcKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBtdXN0IGJlIHNvcnRlZCBpbiBzdHJpY3RseSBhc2NlbmRpbmcgb3JkZXIKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTI6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5MTgKICAgIC8vIGlmIGVudHJ5LmV2ZW50X2lkID09IFVJbnQ2NCgwKToKICAgIGRpZyA4CiAgICBibnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxNAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTE5LTkyMQogICAgLy8gYXNzZXJ0IGVudHJ5X2V2ZW50X3R5cGUgPT0gVUludDY0KAogICAgLy8gICAgIGVudW1zLkVWVF9JRUQKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZGlnIDEwCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTQ6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5MjIKICAgIC8vIGluZGV4ICs9IFVJbnQ2NCgxKQogICAgZGlnIDkKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEwCiAgICBiIGNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEA2Cgpjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlAMTA6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5MDMtOTA1CiAgICAvLyAjIFRoZSBmaXJzdCBlbnRyeSBvZiBhIHBhZ2UgbXVzdCBzdGlsbCBiZSBvcmRlcmVkIGFmdGVyIHRoZQogICAgLy8gIyBsYXN0IGVudHJ5IG9mIHRoZSBwcmV2aW91cyBwYWdlLgogICAgLy8gYXNzZXJ0IHNjaGVkdWxlX3BhZ2VfaW5kZXggPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0VWRU5UX0lECiAgICBkaWcgNgogICAgZHVwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBpZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTA2CiAgICAvLyBwcmV2aW91c19wYWdlX2luZGV4ID0gc2NoZWR1bGVfcGFnZV9pbmRleCAtIFVJbnQ2NCgxKQogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjkwOAogICAgLy8gcHJldmlvdXNfcGFnZV9pbmRleCBpbiBzZWxmLnNjaGVkdWxlX3BhZ2UKICAgIGl0b2IKICAgIGJ5dGVjIDMxIC8vIDB4NTMyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTA3LTkwOQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBwcmV2aW91c19wYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZQogICAgLy8gKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTEwLTkxMQogICAgLy8gcHJldmlvdXNfcGFnZSA9IHNlbGYuc2NoZWR1bGVfcGFnZVtwcmV2aW91c19wYWdlX2luZGV4XS5jb3B5KCkKICAgIC8vIGFzc2VydCBwcmV2aW91c19wYWdlLmxlbmd0aCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGludCAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTExCiAgICAvLyBhc3NlcnQgcHJldmlvdXNfcGFnZS5sZW5ndGggPiBVSW50NjQoMCksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGR1cAogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTEzCiAgICAvLyBwcmV2aW91c19wYWdlLmxlbmd0aCAtIFVJbnQ2NCgxKQogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjkxMi05MTQKICAgIC8vIHByZXZpb3VzX2VudHJ5ID0gcHJldmlvdXNfcGFnZVsKICAgIC8vICAgICBwcmV2aW91c19wYWdlLmxlbmd0aCAtIFVJbnQ2NCgxKQogICAgLy8gXS5jb3B5KCkKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgMgogICAgKwogICAgcHVzaGludCA2NQogICAgYm94X2V4dHJhY3QKICAgIGIgY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxMQoKY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfd2hpbGVAMTU6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMDAKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHNjaGVkdWxlX3BhZ2UuY29weSgpCiAgICBkaWcgNgogICAgaXRvYgogICAgYnl0ZWMgMzEgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBkaWcgNQogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTI1CiAgICAvLyBpZiBpc19sYXN0X3BhZ2U6CiAgICBkaWcgNQogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxNwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTI3CiAgICAvLyBzY2hlZHVsZV9wYWdlX2luZGV4ICogVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpICsgcGFnZV9sZW5ndGgKICAgIGRpZyAxCiAgICBkaWcgNAogICAgKwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTI2CiAgICAvLyBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50ID0gKAogICAgYnl0ZWMgNCAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5MjYtOTI4CiAgICAvLyBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50ID0gKAogICAgLy8gICAgIHNjaGVkdWxlX3BhZ2VfaW5kZXggKiBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkgKyBwYWdlX2xlbmd0aAogICAgLy8gKQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjkyOQogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgcHVzaGludCA1MAogICAgYXBwX2dsb2JhbF9wdXQKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTc6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDQ3CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwMjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmV4ZWN1dGVfaWVkW3JvdXRpbmddKCkgLT4gdm9pZDoKZXhlY3V0ZV9pZWQ6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA1NwogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDU4CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA1OQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwNjEKICAgIC8vIGFzc2VydCBzZWxmLmV2ZW50X2N1cnNvciA8IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICBkaWcgMQogICAgPgogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgY3Vyc29yCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDYyCiAgICAvLyBlbnRyeSA9IHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLmV2ZW50X2N1cnNvcikKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA2MwogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X3R5cGUgPT0gYXJjNC5VSW50OChlbnVtcy5FVlRfSUVEKSwgZXJyLklOVkFMSURfRVZFTlRfVFlQRQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgZHVwCiAgICBwdXNoYnl0ZXMgMHgwMQogICAgYj09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCB0eXBlCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDY3CiAgICAvLyBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIGRpZyAxCiAgICBleHRyYWN0IDAgOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA2OQogICAgLy8gc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICBkaWcgMgogICAgZXh0cmFjdCA5IDgKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwNzAKICAgIC8vIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgZGlnIDMKICAgIGV4dHJhY3QgMTcgOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA3MQogICAgLy8gcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZGlnIDQKICAgIGV4dHJhY3QgMjUgOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA3MwogICAgLy8gbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9ZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBkaWcgNQogICAgZXh0cmFjdCAzMyA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDc0CiAgICAvLyBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICBkaWcgNgogICAgZXh0cmFjdCA0MSA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDc1CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1lbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIGRpZyA3CiAgICBleHRyYWN0IDQ5IDgKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwNzYKICAgIC8vIGZsYWdzPWVudHJ5LmZsYWdzLAogICAgZGlnIDgKICAgIGV4dHJhY3QgNTcgOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA2Ni0xMDc3CiAgICAvLyB0eXAuT2JzZXJ2ZWRFdmVudFJlcXVlc3QoCiAgICAvLyAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBvYnNlcnZlZF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1lbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9ZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9ZW50cnkuZmxhZ3MsCiAgICAvLyApLAogICAgdW5jb3ZlciA3CiAgICB1bmNvdmVyIDgKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA3MgogICAgLy8gb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA2Ni0xMDc3CiAgICAvLyB0eXAuT2JzZXJ2ZWRFdmVudFJlcXVlc3QoCiAgICAvLyAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBvYnNlcnZlZF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1lbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9ZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9ZW50cnkuZmxhZ3MsCiAgICAvLyApLAogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwNjQtMTA3OAogICAgLy8gc2VsZi5fYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkoCiAgICAvLyAgICAgZW50cnksCiAgICAvLyAgICAgdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0KAogICAgLy8gICAgICAgICBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIC8vICAgICAgICAgZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgLy8gICAgICAgICBzY2hlZHVsZWRfdGltZT1lbnRyeS5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICAgICAgYWNjcnVhbF9mYWN0b3I9ZW50cnkuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICAgICAgb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPWVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPWVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgICAgICBmbGFncz1lbnRyeS5mbGFncywKICAgIC8vICAgICApLAogICAgLy8gKQogICAgY2FsbHN1YiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkKICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA3OQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDQ5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5hcHBseV9ub25fY2FzaF9ldmVudFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFwcGx5X25vbl9jYXNoX2V2ZW50OgogICAgaW50Y18wIC8vIDAKICAgIGR1cG4gNAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwODEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwbiAyCiAgICBsZW4KICAgIHB1c2hpbnQgNzMKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuT2JzZXJ2ZWRFdmVudFJlcXVlc3QKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDk1CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA5NgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwOTgKICAgIC8vIGlmIHBheWxvYWQuZmxhZ3MgJiBVSW50NjQoZW51bXMuRkxBR19PQlNFUlZFRF9FVkVOVCk6CiAgICBwdXNoaW50IDY1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBwdXNoaW50IDQKICAgICYKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjMzCiAgICAvLyByZXR1cm4gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9DTE0pCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIHB1c2hpbnQgNQogICAgPT0KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwOTkKICAgIC8vIGFzc2VydCBzZWxmLl9zdXBwb3J0c19vYnNlcnZlZF9ldmVudHMoKSwgZXJyLk9CU0VSVkVEX0VWRU5UX1JFUVVJUkVECiAgICBhc3NlcnQgLy8gT2JzZXJ2ZWQgZXZlbnQgcmVxdWlyZWQgdG8gZXhlY3V0ZSB0aGlzIGFjdGlvbgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEwMAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMzMKICAgIC8vIHJldHVybiBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0NMTSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgZHVwCiAgICBwdXNoaW50IDUKICAgID09CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5MzgKICAgIC8vIGFzc2VydCBzZWxmLl9zdXBwb3J0c19vYnNlcnZlZF9ldmVudHMoKSwgZXJyLk9CU0VSVkVEX0VWRU5UX1JFUVVJUkVECiAgICBhc3NlcnQgLy8gT2JzZXJ2ZWQgZXZlbnQgcmVxdWlyZWQgdG8gZXhlY3V0ZSB0aGlzIGFjdGlvbgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTM5CiAgICAvLyBhc3NlcnQgcGF5bG9hZC5ldmVudF9pZCA9PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LCBlcnIuSU5WQUxJRF9FVkVOVF9JRAogICAgZGlnIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgNwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NDEKICAgIC8vIHNlbGYuY29udHJhY3RfdHlwZSwgcGF5bG9hZC5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBkdXAKICAgIGV4dHJhY3QgOCAxCiAgICBidXJ5IDEyCiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTQwLTk0MgogICAgLy8gc2VsZi5fYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgc2VsZi5jb250cmFjdF90eXBlLCBwYXlsb2FkLmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIC8vICkKICAgIGNhbGxzdWIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NDQKICAgIC8vIHBhZ2VfaW5kZXggPSBzZWxmLl9zY2hlZHVsZV9wYWdlX2luZGV4KHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxOTAKICAgIC8vIHJldHVybiBldmVudF9pZCAvLyBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkKICAgIHB1c2hpbnQgMTYKICAgIC8KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojk0NQogICAgLy8gcGFnZSA9IHR5cC5FeGVjdXRpb25TY2hlZHVsZVBhZ2UoKQogICAgcHVzaGJ5dGVzIDB4MDAwMAogICAgYnVyeSA3CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NDYKICAgIC8vIGlmIHBhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlOgogICAgaXRvYgogICAgYnl0ZWMgMzEgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA5CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMjcKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojk0NwogICAgLy8gcGFnZSA9IHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XS5jb3B5KCkKICAgIGRpZyA3CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidXJ5IDcKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX3BhZ2UgZW50cnkgZXhpc3RzCgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDI3OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTQ4CiAgICAvLyBhc3NlcnQgcGFnZS5sZW5ndGggPCBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGRpZyA1CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgMTYKICAgIDwKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojk1MwogICAgLy8gc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIGRpZyAzCiAgICBkdXAKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NTQKICAgIC8vIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICBkaWcgMQogICAgZXh0cmFjdCAxNyA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NTUKICAgIC8vIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZGlnIDIKICAgIGV4dHJhY3QgMjUgOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTU2CiAgICAvLyBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDMKICAgIGV4dHJhY3QgNDEgOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTU3CiAgICAvLyBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIGRpZyA0CiAgICBleHRyYWN0IDQ5IDgKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojk1OAogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIHVuY292ZXIgNQogICAgZXh0cmFjdCA1NyA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NTAtOTYwCiAgICAvLyB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1wYXlsb2FkLmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9cGF5bG9hZC5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPXBheWxvYWQucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXBheWxvYWQubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICkKICAgIGRpZyAxMQogICAgaXRvYgogICAgZGlnIDE4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMwogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NDktOTYxCiAgICAvLyBwYWdlLmFwcGVuZCgKICAgIC8vICAgICB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9cGF5bG9hZC5ldmVudF9pZCwKICAgIC8vICAgICAgICAgZXZlbnRfdHlwZT1wYXlsb2FkLmV2ZW50X3R5cGUsCiAgICAvLyAgICAgICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIC8vICAgICAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICAgICApCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NjIKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHBhZ2UuY29weSgpCiAgICBkaWcgOAogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojk2MwogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTAzCiAgICAvLyBhc3NlcnQgZXZlbnRfaWQgPT0gc2VsZi5ldmVudF9jdXJzb3IsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBjdXJzb3IKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExMDQKICAgIC8vIGVudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KGV2ZW50X2lkKQogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEwNgogICAgLy8gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgYnVyeSAxMAogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozNjQKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzY1CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzYzLTM3MAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjM2NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9SUiksCiAgICBwdXNoaW50IDEyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzY3CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICBwdXNoaW50IDExCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzY4CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgcHVzaGludCAxOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzYzLTM3MAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjM2OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBieiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX2ZhbHNlQDE2CgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX3RydWVAMTU6CiAgICBpbnRjXzEgLy8gMQoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9tZXJnZUAxNzoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExMDUtMTEwNwogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2lzX25vbl9jYXNoKAogICAgLy8gICAgIGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIC8vICksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IHR5cGUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExMDgKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlICE9IGFyYzQuVUludDgoZW51bXMuRVZUX0lFRCksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGRpZyA4CiAgICBwdXNoYnl0ZXMgMHgwMQogICAgYiE9CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCB0eXBlCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozNzQKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluIChVSW50NjQoZW51bXMuRVZUX1JSKSwgVUludDY0KGVudW1zLkVWVF9SUkYpKQogICAgZGlnIDQKICAgIHB1c2hpbnQgMTIKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDIxCiAgICBkaWcgNAogICAgcHVzaGludCAxMQogICAgPT0KICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfZmFsc2VAMjIKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAyMToKICAgIGludGNfMSAvLyAxCgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX21lcmdlQDIzOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEwOQogICAgLy8gaWYgc2VsZi5fZXZlbnRfaXNfcmF0ZV9yZXNldChlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpKToKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Vsc2VfYm9keUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODAKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLm9ic2VydmVyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjQgLy8gMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTEzCiAgICAvLyBzZWxmLl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeShlbnRyeSwgcGF5bG9hZCkKICAgIGRpZyA2CiAgICBkaWcgMgogICAgY2FsbHN1YiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkKICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTExNAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDgxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Vsc2VfYm9keUA1OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTExMgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICBiIGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VANgoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9mYWxzZUAyMjoKICAgIGludGNfMCAvLyAwCiAgICBiIGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfbWVyZ2VAMjMKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfZmFsc2VAMTY6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX21lcmdlQDE3CgoKLy8gbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuZ2V0X2NvbnRyYWN0X3N0YXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2NvbnRyYWN0X3N0YXRlOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBkdXAKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEyMQogICAgLy8gY29udHJhY3RfdHlwZT1hcmM0LlVJbnQ4KHNlbGYuY29udHJhY3RfdHlwZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzIgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExMjMKICAgIC8vIHRvdGFsX3VuaXRzPXNlbGYudG90YWxfdW5pdHMsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEyNAogICAgLy8gcmVzZXJ2ZWRfdW5pdHNfdG90YWw9c2VsZi5yZXNlcnZlZF91bml0c190b3RhbCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTI1CiAgICAvLyBpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudD1zZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExMjYKICAgIC8vIGV2ZW50X2N1cnNvcj1zZWxmLmV2ZW50X2N1cnNvciwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEyNwogICAgLy8gc2NoZWR1bGVfZW50cnlfY291bnQ9c2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExMjgKICAgIC8vIG91dHN0YW5kaW5nX3ByaW5jaXBhbD1zZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEyOQogICAgLy8gaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZT1zZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEzMAogICAgLy8gbm9taW5hbF9pbnRlcmVzdF9yYXRlPXNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTMxCiAgICAvLyBhY2NydWVkX2ludGVyZXN0PXNlbGYuYWNjcnVlZF9pbnRlcmVzdCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTMyCiAgICAvLyBjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4PXNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEzMwogICAgLy8gY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXg9c2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTM0CiAgICAvLyByZXNlcnZlZF9pbnRlcmVzdD1zZWxmLnJlc2VydmVkX2ludGVyZXN0LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExMzUKICAgIC8vIHJlc2VydmVkX3ByaW5jaXBhbD1zZWxmLnJlc2VydmVkX3ByaW5jaXBhbCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExMjAtMTEzNgogICAgLy8gcmV0dXJuIHR5cC5LZXJuZWxTdGF0ZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlPWFyYzQuVUludDgoc2VsZi5jb250cmFjdF90eXBlKSwKICAgIC8vICAgICBzdGF0dXM9c2VsZi5zdGF0dXMsCiAgICAvLyAgICAgdG90YWxfdW5pdHM9c2VsZi50b3RhbF91bml0cywKICAgIC8vICAgICByZXNlcnZlZF91bml0c190b3RhbD1zZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsLAogICAgLy8gICAgIGluaXRpYWxfZXhjaGFuZ2VfYW1vdW50PXNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQsCiAgICAvLyAgICAgZXZlbnRfY3Vyc29yPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgLy8gICAgIHNjaGVkdWxlX2VudHJ5X2NvdW50PXNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQsCiAgICAvLyAgICAgb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2U9c2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlLAogICAgLy8gICAgIG5vbWluYWxfaW50ZXJlc3RfcmF0ZT1zZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBhY2NydWVkX2ludGVyZXN0PXNlbGYuYWNjcnVlZF9pbnRlcmVzdCwKICAgIC8vICAgICBjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4PXNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCwKICAgIC8vICAgICBjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleD1zZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4LAogICAgLy8gICAgIHJlc2VydmVkX2ludGVyZXN0PXNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QsCiAgICAvLyAgICAgcmVzZXJ2ZWRfcHJpbmNpcGFsPXNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsLAogICAgLy8gKQogICAgdW5jb3ZlciAxNAogICAgaXRvYgogICAgdW5jb3ZlciAxNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDEzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDEwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgOQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDgKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTE2CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5nZXRfbmV4dF9kdWVfZXZlbnRbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfbmV4dF9kdWVfZXZlbnQ6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTE0MgogICAgLy8gaWYgc2VsZi5ldmVudF9jdXJzb3IgPj0gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgPj0KICAgIGJ6IGdldF9uZXh0X2R1ZV9ldmVudF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExNDQKICAgIC8vIGV2ZW50X2lkPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTQzLTExNTMKICAgIC8vIHJldHVybiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1zZWxmLmV2ZW50X2N1cnNvciwKICAgIC8vICAgICBldmVudF90eXBlPWFyYzQuVUludDgoMCksCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9VUludDY0KDApLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9VUludDY0KDApLAogICAgLy8gICAgIGZsYWdzPVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGl0b2IKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExNDUKICAgIC8vIGV2ZW50X3R5cGU9YXJjNC5VSW50OCgwKSwKICAgIGJ5dGVjIDQwIC8vIDB4MDAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExNDMtMTE1MwogICAgLy8gcmV0dXJuIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgIGV2ZW50X2lkPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgLy8gICAgIGV2ZW50X3R5cGU9YXJjNC5VSW50OCgwKSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1VSW50NjQoMCksCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1VSW50NjQoMCksCiAgICAvLyAgICAgZmxhZ3M9VUludDY0KDApLAogICAgLy8gKQogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTQ2CiAgICAvLyBzY2hlZHVsZWRfdGltZT1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTE0My0xMTUzCiAgICAvLyByZXR1cm4gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkoCiAgICAvLyAgICAgZXZlbnRfaWQ9c2VsZi5ldmVudF9jdXJzb3IsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1hcmM0LlVJbnQ4KDApLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPVVJbnQ2NCgwKSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249VUludDY0KDApLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPVVJbnQ2NCgwKSwKICAgIC8vICAgICBmbGFncz1VSW50NjQoMCksCiAgICAvLyApCiAgICBpdG9iCiAgICBzd2FwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKCmdldF9uZXh0X2R1ZV9ldmVudF9hZnRlcl9pbmxpbmVkX21vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmdldF9uZXh0X2R1ZV9ldmVudEA0OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEzOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpnZXRfbmV4dF9kdWVfZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTE1NAogICAgLy8gcmV0dXJuIHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLmV2ZW50X2N1cnNvcikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgZ2V0X25leHRfZHVlX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuZ2V0X25leHRfZHVlX2V2ZW50QDQKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5jb250cmFjdF91cGRhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF91cGRhdGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTUzLTE1NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGdyYW50cyB0aGUgdXBkYXRlIHBlcm1pc3Npb25zIHRvIHRoZSBBcnJhbmdlci4KICAgIC8vICMg4pqg77iPIFdBUk5JTkc6IEFwcGxpY2F0aW9uIHVwZGF0ZXMgbXVzdCBiZSBleGVjdXRlZCBWRVJZIGNhcmVmdWxseSwgYXMgdGhleQogICAgLy8gIyBtaWdodCBpbnRyb2R1Y2UgYnJlYWtpbmcgY2hhbmdlcy4KICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfcm90YXRlX2FycmFuZ2VyW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19yb3RhdGVfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2OQogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTcwCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gbmV3X2FycmFuZ2VyCiAgICBieXRlYyAxOCAvLyAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTcxCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfc2V0X29wX2RhZW1vbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfc2V0X29wX2RhZW1vbjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTg0CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODUKICAgIC8vIHNlbGYub3BfZGFlbW9uLnZhbHVlID0gYWRkcmVzcwogICAgYnl0ZWMgMjUgLy8gMHg1MjIzNGY3MDQ0NjE2NTZkNmY2ZTIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4NgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTczCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2Fzc2lnbl9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19hc3NpZ25fcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDE2CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLlJvbGVWYWxpZGl0eQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjExCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMgogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgcHVzaGludCAyMAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTAzCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gcm9sZV9hZGRyZXNzCiAgICBieXRlYyAxOCAvLyAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMKICAgIGRpZyAzCiAgICBhcHBfZ2xvYmFsX3B1dAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTQKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDYKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIGR1cAogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnRfbWFuYWdlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMyAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwOAogICAgLy8gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMiAvLyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTIKICAgIC8vIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIGR1cAogICAgcHVzaGludCA2MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE1CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMzIgLy8gMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE2CiAgICAvLyBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExOAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMSAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIwCiAgICAvLyBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMwogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgODAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIzCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI0IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI0CiAgICAvLyBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3Jldm9rZV9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19yZXZva2Vfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzUKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzNgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzcKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCkpCiAgICBidG9pCiAgICBkdXBuIDIKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCAhPSBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksIGVyci5JTlZBTElEX1JPTEUKICAgIGR1cAogICAgcHVzaGludCAyMAogICAgIT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyOAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIzIC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0NGQ2MTZlNjE2NzY1NzIyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMwCiAgICAvLyBkZWwgc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzOQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjE2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIyIC8vIDB4NTIyMzUwNzI2OTZkNjE3Mjc5NDQ2NTYxNmM2NTcyMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNAogICAgLy8gZGVsIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjM4CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIGR1cAogICAgcHVzaGludCA2MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAzMiAvLyAweDUyMjM1NDcyNzU3Mzc0NjU2NTIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzgKICAgIC8vIGRlbCBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjM4CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDEKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hdXRob3JpdHksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjEgLy8gMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MgogICAgLy8gZGVsIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzOAogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDQKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDgwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI0IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ2CiAgICAvLyBkZWwgc2VsZi5vYnNlcnZlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ292X2Fzc2V0X3N1c3BlbnNpb25bcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dvdl9hc3NldF9zdXNwZW5zaW9uOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kICAjIFRPRE86IFVwZGF0ZSBzcGVjcyBhbmQgYWRkIHRlc3QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzcKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDIxIC8vIDB4NTIyMzQxNzU3NDY4NmY3MjY5NzQ3OTIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU3CiAgICAvLyBzZWxmLmFzc2V0X3N1c3BlbmRlZCA9IHN1c3BlbmRlZAogICAgYnl0ZWMgMzMgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU4CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCAgIyBUT0RPOiBVcGRhdGUgc3BlY3MgYW5kIGFkZCB0ZXN0CiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYXJyYW5nZXJbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNjgKICAgIC8vIHJldHVybiBzZWxmLmFycmFuZ2VyLnZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTggLy8gMHg1MjIzNDE3MjcyNjE2ZTY3NjU3MjIzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJyYW5nZXIgZXhpc3RzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjYwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9hZGRyZXNzX3JvbGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfYWRkcmVzc19yb2xlczoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg0CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmFjY291bnRfbWFuYWdlciwgYWRkcmVzcyksCiAgICBieXRlYyAyMyAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMKICAgIGRpZyAxCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4NQogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5wcmltYXJ5X2RlYWxlciwgYWRkcmVzcyksCiAgICBieXRlYyAyMiAvLyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzCiAgICBkaWcgMgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODYKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYudHJ1c3RlZSwgYWRkcmVzcyksCiAgICBieXRlYyAzMiAvLyAweDUyMjM1NDcyNzU3Mzc0NjU2NTIzCiAgICBkaWcgMwogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODcKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYXV0aG9yaXR5LCBhZGRyZXNzKSwKICAgIGJ5dGVjIDIxIC8vIDB4NTIyMzQxNzU3NDY4NmY3MjY5NzQ3OTIzCiAgICBkaWcgNAogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODgKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYub2JzZXJ2ZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjQgLy8gMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzCiAgICB1bmNvdmVyIDUKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjcwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjIDQwIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDYKICAgIHNldGJpdAogICAgaW50Y18xIC8vIDEKICAgIHVuY292ZXIgNQogICAgc2V0Yml0CiAgICBwdXNoaW50IDIKICAgIHVuY292ZXIgNAogICAgc2V0Yml0CiAgICBwdXNoaW50IDMKICAgIHVuY292ZXIgMwogICAgc2V0Yml0CiAgICBwdXNoaW50IDQKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA1CiAgICAvLyByb2xlID0gcm9sZV9pZC5hc191aW50NjQoKQogICAgYnRvaQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwNgogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZSkKICAgIGR1cAogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDgKICAgIC8vIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgcHVzaGludHMgMjAgNDAgNTAgNjAgNzAgODAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDctMzM4CiAgICAvLyBtYXRjaCByb2xlOgogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgLy8gICAgICAgICByZXR1cm4gdHlwLlJvbGVWYWxpZGl0eSgKICAgIC8vICAgICAgICAgICAgIHJvbGVfdmFsaWRpdHlfc3RhcnQ9VUludDY0KDApLCByb2xlX3ZhbGlkaXR5X2VuZD1VSW50NjQoMCkKICAgIC8vICAgICAgICAgKQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5hdXRob3JpdHksIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5vYnNlcnZlciwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5vYnNlcnZlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBfOgogICAgLy8gICAgICAgICBvcC5lcnIoZXJyLklOVkFMSURfUk9MRSkKICAgIHVuY292ZXIgNgogICAgbWF0Y2ggcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8wQDIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8xQDMgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8yQDQgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8zQDUgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV80QDYgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV81QDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzgKICAgIC8vIG9wLmVycihlcnIuSU5WQUxJRF9ST0xFKQogICAgZXJyIC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzVANzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzQKICAgIC8vIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMjQgLy8gMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzMzLTMzNQogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMzNgogICAgLy8gcmV0dXJuIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzRANjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjkKICAgIC8vIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDIxIC8vIDB4NTIyMzQxNzU3NDY4NmY3MjY5NzQ3OTIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI4LTMzMAogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzEKICAgIC8vIHJldHVybiBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzNANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjQKICAgIC8vIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAzMiAvLyAweDUyMjM1NDcyNzU3Mzc0NjU2NTIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzIzLTMyNQogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI2CiAgICAvLyByZXR1cm4gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMkA0OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxOQogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAyMiAvLyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzE4LTMyMAogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMQogICAgLy8gcmV0dXJuIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8xQDM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzE0CiAgICAvLyBzZWxmLmFjY291bnRfbWFuYWdlciwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAyMyAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTMtMzE1CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxNgogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMEAyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwOS0zMTEKICAgIC8vIHJldHVybiB0eXAuUm9sZVZhbGlkaXR5KAogICAgLy8gICAgIHJvbGVfdmFsaWRpdHlfc3RhcnQ9VUludDY0KDApLCByb2xlX3ZhbGlkaXR5X2VuZD1VSW50NjQoMCkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLl9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IHZvaWQ6Cl9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI2CiAgICAvLyBkZWYgX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQoc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjgKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkLCBlcnIuU1VTUEVOREVECiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCAzODQKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIFN1c3BlbmRlZCBvcGVyYXRpb25zCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5fc2V0dGxlX3Bvc2l0aW9uKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NCwgdWludDY0Ogpfc2V0dGxlX3Bvc2l0aW9uOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjQ0CiAgICAvLyBkZWYgX3NldHRsZV9wb3NpdGlvbihzZWxmLCBob2xkaW5nX2FkZHJlc3M6IEFjY291bnQpIC0+IHR1cGxlW1VJbnQ2NCwgVUludDY0XToKICAgIHByb3RvIDEgMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo2MQogICAgLy8gcG9zaXRpb24gPSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jb3B5KCkKICAgIGR1cAogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NjMtNjUKICAgIC8vICMgQ29tcHV0ZSB0aGUgaW5jcmVtZW50YWwgcGVyLXVuaXQgZml4ZWQtcG9pbnQgaW50ZXJlc3QgYW5kIHByaW5jaXBhbCBhY2NydWVkCiAgICAvLyAjIHNpbmNlIHRoaXMgYWNjb3VudCdzIGxhc3QgY2hlY2twb2ludC4KICAgIC8vIGludGVyZXN0X2RlbHRhID0gc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IC0gcG9zaXRpb24uaW50ZXJlc3RfY2hlY2twb2ludAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggZXhpc3RzCiAgICBkaWcgMQogICAgcHVzaGludCA1NwogICAgZXh0cmFjdF91aW50NjQKICAgIC0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo2NwogICAgLy8gc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCAtIHBvc2l0aW9uLnByaW5jaXBhbF9jaGVja3BvaW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTcgLy8gImN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IGV4aXN0cwogICAgZGlnIDIKICAgIHB1c2hpbnQgNjUKICAgIGV4dHJhY3RfdWludDY0CiAgICAtCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzMKICAgIC8vIGludGVyZXN0X2RlbHRhLCBwb3NpdGlvbi51bml0cywgc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgZGlnIDIKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3MC03NAogICAgLy8gIyBDb252ZXJ0IHRoZSBwZXItdW5pdCBmaXhlZC1wb2ludCBkZWx0YXMgaW50byBhYnNvbHV0ZSBjbGFpbWFibGUgYW1vdW50cwogICAgLy8gIyB1c2luZyB0aGUgYWNjb3VudCdzIGFjdGl2ZSB1bml0cy4KICAgIC8vIGNsYWltYWJsZV9pbnRlcmVzdCA9IHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIGludGVyZXN0X2RlbHRhLCBwb3NpdGlvbi51bml0cywgc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgLy8gKQogICAgdW5jb3ZlciAzCiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojc2CiAgICAvLyBwcmluY2lwYWxfZGVsdGEsIHBvc2l0aW9uLnVuaXRzLCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzUtNzcKICAgIC8vIGNsYWltYWJsZV9wcmluY2lwYWwgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBwcmluY2lwYWxfZGVsdGEsIHBvc2l0aW9uLnVuaXRzLCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICAvLyApCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojc5LTgxCiAgICAvLyAjIEFjY3J1ZSB0aGUgY2xhaW1hYmxlIGFtb3VudHMgdG8gdGhlIGFjY291bnQgcG9zaXRpb24gYW5kIG1ha2UgdGhlbSBhdmFpbGFibGUKICAgIC8vICMgZm9yIHdpdGhkcmF3YWwuCiAgICAvLyBwb3NpdGlvbi5jbGFpbWFibGVfaW50ZXJlc3QgKz0gY2xhaW1hYmxlX2ludGVyZXN0CiAgICBkaWcgMgogICAgcHVzaGludCA3MwogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICArCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIHN3YXAKICAgIHJlcGxhY2UyIDczCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6ODIKICAgIC8vIHBvc2l0aW9uLmNsYWltYWJsZV9wcmluY2lwYWwgKz0gY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgZHVwCiAgICBwdXNoaW50IDgxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDIKICAgICsKICAgIGl0b2IKICAgIHJlcGxhY2UyIDgxCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6ODQtODYKICAgIC8vICMgQWR2YW5jZSB0aGUgYWNjb3VudCdzIHBlci11bml0IGZpeGVkLXBvaW50IGNoZWNrcG9pbnRzIHRvIHRoZSBjdXJyZW50IGdsb2JhbAogICAgLy8gIyBwZXItdW5pdCBmaXhlZC1wb2ludCBnbG9iYWwgaW5kaWNlcy4KICAgIC8vIHBvc2l0aW9uLmludGVyZXN0X2NoZWNrcG9pbnQgPSBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IGV4aXN0cwogICAgaXRvYgogICAgcmVwbGFjZTIgNTcKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo4NwogICAgLy8gcG9zaXRpb24ucHJpbmNpcGFsX2NoZWNrcG9pbnQgPSBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTcgLy8gImN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IGV4aXN0cwogICAgaXRvYgogICAgcmVwbGFjZTIgNjUKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo4OS05MAogICAgLy8gIyBBZHZhbmNlIHRoZSBhY2NvdW50J3MgZXZlbnQgY3Vyc29yIHRvIHRoZSBjdXJyZW50IGdsb2JhbCBldmVudCBjdXJzb3IuCiAgICAvLyBwb3NpdGlvbi5zZXR0bGVkX2N1cnNvciA9IHNlbGYuZXZlbnRfY3Vyc29yCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGl0b2IKICAgIHJlcGxhY2UyIDQ5CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6OTItOTQKICAgIC8vICMgVXBkYXRlIHRoZSBhY2NvdW50IHBvc2l0aW9uIGFuZCByZXR1cm4gdGhlIG5ld2x5IGFjY3J1ZWQgY2xhaW1hYmxlIGFtb3VudHMKICAgIC8vICMgYWRkZWQgdG8gdGhlIHRvdGFsIHBvc2l0aW9uJ3MgY2xhaW1hYmxlIGFtb3VudHMuCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHBvc2l0aW9uLmNvcHkoKQogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6OTUKICAgIC8vIHJldHVybiBjbGFpbWFibGVfaW50ZXJlc3QsIGNsYWltYWJsZV9wcmluY2lwYWwKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IHZvaWQ6Cl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojk3CiAgICAvLyBkZWYgX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQoc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQyMwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDAKICAgIC8vIGlmIHNlbGYuX3N0YXR1c19pc19wZW5kaW5nX2llZCgpOgogICAgYnogX2Vuc3VyZV91bml0c19hY3RpdmF0ZWRfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTAxCiAgICAvLyByZXR1cm4KICAgIHJldHN1YgoKX2Vuc3VyZV91bml0c19hY3RpdmF0ZWRfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwMwogICAgLy8gcG9zaXRpb24gPSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAyCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDQKICAgIC8vIGlmIHBvc2l0aW9uLnJlc2VydmVkX3VuaXRzID09IFVJbnQ2NCgwKToKICAgIHB1c2hpbnQgNDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgYm56IF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkX2FmdGVyX2lmX2Vsc2VANAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwNQogICAgLy8gcmV0dXJuCiAgICByZXRzdWIKCl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkX2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDgKICAgIC8vIHBvc2l0aW9uLnVuaXRzICs9IGFjdGl2YXRlZF91bml0cwogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMwogICAgKwogICAgaXRvYgogICAgcmVwbGFjZTIgMzIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDkKICAgIC8vIHBvc2l0aW9uLnJlc2VydmVkX3VuaXRzID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgaXRvYgogICAgcmVwbGFjZTIgNDAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTAKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gcG9zaXRpb24uY29weSgpCiAgICBmcmFtZV9kaWcgMgogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExMQogICAgLy8gYXNzZXJ0IHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPj0gYWN0aXZhdGVkX3VuaXRzLCBlcnIuT1ZFUl9ESVNUUklCVVRJT04KICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICBkdXAKICAgIGRpZyAyCiAgICA+PQogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCByZW1haW5pbmcgRC1BU0EgdW5pdHMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTIKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgLT0gYWN0aXZhdGVkX3VuaXRzCiAgICBzd2FwCiAgICAtCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX3NjYWxlZF9tdWxfZGl2KG11bHRpcGxpY2FuZDogdWludDY0LCBtdWx0aXBsaWVyOiB1aW50NjQsIGRpdmlzb3I6IHVpbnQ2NCkgLT4gdWludDY0Ogpfc2NhbGVkX211bF9kaXY6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNTMtMTU1CiAgICAvLyBkZWYgX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIHNlbGYsIG11bHRpcGxpY2FuZDogVUludDY0LCBtdWx0aXBsaWVyOiBVSW50NjQsIGRpdmlzb3I6IFVJbnQ2NAogICAgLy8gKSAtPiBVSW50NjQ6CiAgICBwcm90byAzIDEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE1NwogICAgLy8gaWYgbXVsdGlwbGljYW5kID09IFVJbnQ2NCgwKSBvciBtdWx0aXBsaWVyID09IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMwogICAgYnogX3NjYWxlZF9tdWxfZGl2X2lmX2JvZHlAMgogICAgZnJhbWVfZGlnIC0yCiAgICBibnogX3NjYWxlZF9tdWxfZGl2X2FmdGVyX2lmX2Vsc2VAMwoKX3NjYWxlZF9tdWxfZGl2X2lmX2JvZHlAMjoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE1OAogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKX3NjYWxlZF9tdWxfZGl2X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE1OQogICAgLy8gaGlnaCwgbG93ID0gb3AubXVsdyhtdWx0aXBsaWNhbmQsIG11bHRpcGxpZXIpCiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMgogICAgbXVsdwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTYwCiAgICAvLyByZXR1cm4gb3AuZGl2dyhoaWdoLCBsb3csIGRpdmlzb3IpCiAgICBmcmFtZV9kaWcgLTEKICAgIGRpdncKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9hbW91bnRfdG9faW5kZXhfZGVsdGEoYW1vdW50OiB1aW50NjQpIC0+IHVpbnQ2NDoKX2Ftb3VudF90b19pbmRleF9kZWx0YToKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE2MgogICAgLy8gZGVmIF9hbW91bnRfdG9faW5kZXhfZGVsdGEoc2VsZiwgYW1vdW50OiBVSW50NjQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTY0CiAgICAvLyBpZiBhbW91bnQgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0xCiAgICBibnogX2Ftb3VudF90b19pbmRleF9kZWx0YV9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE2NQogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKX2Ftb3VudF90b19pbmRleF9kZWx0YV9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNjYKICAgIC8vIGFzc2VydCBzZWxmLnRvdGFsX3VuaXRzID4gVUludDY0KDApLCBlcnIuTk9fVU5JVFMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICBkdXAKICAgIGFzc2VydCAvLyBObyBELUFTQSB1bml0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTY3CiAgICAvLyByZXR1cm4gc2VsZi5fc2NhbGVkX211bF9kaXYoYW1vdW50LCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLCBzZWxmLnRvdGFsX3VuaXRzKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5faW5kZXhfZGVsdGFfdG9fYW1vdW50KGluZGV4X2RlbHRhOiB1aW50NjQpIC0+IHVpbnQ2NDoKX2luZGV4X2RlbHRhX3RvX2Ftb3VudDoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE2OQogICAgLy8gZGVmIF9pbmRleF9kZWx0YV90b19hbW91bnQoc2VsZiwgaW5kZXhfZGVsdGE6IFVJbnQ2NCkgLT4gVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNzYKICAgIC8vIGlmIGluZGV4X2RlbHRhID09IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMQogICAgYm56IF9pbmRleF9kZWx0YV90b19hbW91bnRfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNzcKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9pbmRleF9kZWx0YV90b19hbW91bnRfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTc5CiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE4MQogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE3OC0xODIKICAgIC8vIHJldHVybiBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLnRvdGFsX3VuaXRzLAogICAgLy8gICAgIGluZGV4X2RlbHRhLAogICAgLy8gICAgIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZ2V0X3NjaGVkdWxlX2VudHJ5KGV2ZW50X2lkOiB1aW50NjQpIC0+IGJ5dGVzOgpfZ2V0X3NjaGVkdWxlX2VudHJ5OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjAyCiAgICAvLyBkZWYgX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLCBldmVudF9pZDogVUludDY0KSAtPiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeToKICAgIHByb3RvIDEgMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjA0CiAgICAvLyBhc3NlcnQgZXZlbnRfaWQgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LCBlcnIuSU5WQUxJRF9FVkVOVF9JRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICA+CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBpZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTkwCiAgICAvLyByZXR1cm4gZXZlbnRfaWQgLy8gVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMTYKICAgIC8KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjIwNgogICAgLy8gYXNzZXJ0IHBhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBpdG9iCiAgICBieXRlYyAzMSAvLyAweDUzMjMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE5NAogICAgLy8gcmV0dXJuIGV2ZW50X2lkICUgVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMTYKICAgICUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjIwOQogICAgLy8gYXNzZXJ0IG9mZnNldCA8IHBhZ2UubGVuZ3RoLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIHB1c2hpbnQgMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGRpZyAxCiAgICA+CiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMTAKICAgIC8vIHJldHVybiBwYWdlW29mZnNldF0uY29weSgpCiAgICBwdXNoaW50IDY1CiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIHB1c2hpbnQgNjUKICAgIGJveF9leHRyYWN0CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoY29udHJhY3RfdHlwZTogdWludDY0LCBldmVudF90eXBlOiB1aW50NjQpIC0+IHZvaWQ6Cl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZToKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMxMy0zMTUKICAgIC8vIGRlZiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgc2VsZiwgY29udHJhY3RfdHlwZTogVUludDY0LCBldmVudF90eXBlOiBVSW50NjQKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjU0LTI1NQogICAgLy8gIyBDaGVjayBjb21tb24gZXZlbnRzIGZpcnN0CiAgICAvLyBpZiBldmVudF90eXBlIGluIGNvbW1vbl9ldmVudHM6CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI0NwogICAgLy8gVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI0OAogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUCksCiAgICBpbnRjXzIgLy8gOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjU0LTI1NQogICAgLy8gIyBDaGVjayBjb21tb24gZXZlbnRzIGZpcnN0CiAgICAvLyBpZiBldmVudF90eXBlIGluIGNvbW1vbl9ldmVudHM6CiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjQ5CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX01EKSwKICAgIHB1c2hpbnQgMTkKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI1MAogICAgLy8gVUludDY0KGVudW1zLkVWVF9SUiksCiAgICBwdXNoaW50IDEyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyNTEKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIHB1c2hpbnQgMTEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDcKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDY6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyNTYKICAgIC8vIHJldHVybiBUcnVlCiAgICBpbnRjXzEgLy8gMQoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQ6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIHJldHN1YgoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI1OC0yNTkKICAgIC8vICMgQ29udHJhY3Qtc3BlY2lmaWMgYWRkaXRpb25hbCBldmVudHMKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX1BBTSk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyNjAtMjYxCiAgICAvLyAjIFBBTSBvbmx5IHN1cHBvcnRzIGNvbW1vbiBldmVudHMKICAgIC8vIHJldHVybiBGYWxzZQogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI2MwogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfTEFNKSBvciBjb250cmFjdF90eXBlID09IFVJbnQ2NCgKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAzCiAgICA9PQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjYzLTI2NQogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfTEFNKSBvciBjb250cmFjdF90eXBlID09IFVJbnQ2NCgKICAgIC8vICAgICBlbnVtcy5DVF9OQU0KICAgIC8vICk6CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlAMTEKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAyCiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMTYKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDExOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjY2LTI3MAogICAgLy8gIyBMQU0vTkFNIGFkZDogUFIsIElQQ0IKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyNjgKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyNjYtMjcwCiAgICAvLyAjIExBTS9OQU0gYWRkOiBQUiwgSVBDQgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMTMKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjY5CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgcHVzaGludCAxOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjY2LTI3MAogICAgLy8gIyBMQU0vTkFNIGFkZDogUFIsIElQQ0IKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gKQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDE0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDEzOgogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMTQ6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAxNjoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI3MgogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKToKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAyMwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjczLTI3OAogICAgLy8gIyBBTk4gYWRkczogUFIsIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyNzUKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyNzMtMjc4CiAgICAvLyAjIEFOTiBhZGRzOiBQUiwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjAKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Mjc2CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgcHVzaGludCAxOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjczLTI3OAogICAgLy8gIyBBTk4gYWRkczogUFIsIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDIwCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI3NwogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyNzMtMjc4CiAgICAvLyAjIEFOTiBhZGRzOiBQUiwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMjEKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjA6CiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF9mYWxzZUAyMToKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDIzOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjgwCiAgICAvLyBpZiBjb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9MQVgpOgogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDQKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAzMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjgxLTI4NwogICAgLy8gIyBMQVggYWRkczogUFIsIFBJLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjgzCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjgxLTI4NwogICAgLy8gIyBMQVggYWRkczogUFIsIFBJLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyOAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyODQKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgcHVzaGludCA0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyODEtMjg3CiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDI4CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI4NQogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIHB1c2hpbnQgMTgKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI4MS0yODcKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjgKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Mjg2CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICBwdXNoaW50IDUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI4MS0yODcKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMjkKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjg6CiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF9mYWxzZUAyOToKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDMxOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Mjg5CiAgICAvLyBpZiBjb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9DTE0pOgogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDUKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAzMwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjkwLTI5MQogICAgLy8gIyBDTE0gYWRkczogUFIKICAgIC8vIHJldHVybiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMzM6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyOTMKICAgIC8vIHJldHVybiBGYWxzZQogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKCi8vIG1vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9pc19keW5hbWljX2FubnVpdHkoKSAtPiB1aW50NjQ6Cl9pc19keW5hbWljX2FubnVpdHk6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozMzUKICAgIC8vIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMzNS0zMzYKICAgIC8vIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKQogICAgLy8gYW5kIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgYnogX2lzX2R5bmFtaWNfYW5udWl0eV9ib29sX2ZhbHNlQDMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMzNgogICAgLy8gYW5kIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDM0IC8vICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24gZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozMzUtMzM2CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIC8vIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGJ6IF9pc19keW5hbWljX2FubnVpdHlfYm9vbF9mYWxzZUAzCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzM0LTMzNwogICAgLy8gcmV0dXJuICgKICAgIC8vICAgICBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIC8vICAgICBhbmQgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICAvLyApCiAgICByZXRzdWIKCl9pc19keW5hbWljX2FubnVpdHlfYm9vbF9mYWxzZUAzOgogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMzNC0zMzcKICAgIC8vIHJldHVybiAoCiAgICAvLyAgICAgc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICAvLyAgICAgYW5kIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgLy8gKQogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnk6IGJ5dGVzKSAtPiB1aW50NjQsIGJ5dGVzOgpfZW50cnlfaW50ZXJlc3Rfc2VnbWVudDoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjM4MAogICAgLy8gZGVmIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KHNlbGYsIGVudHJ5OiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSkgLT4gVUludDY0OgogICAgcHJvdG8gMSAyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozODkKICAgIC8vIGVudHJ5LmFjY3J1YWxfZmFjdG9yID09IFVJbnQ2NCgwKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDE3CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozODktMzkxCiAgICAvLyBlbnRyeS5hY2NydWFsX2ZhY3RvciA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID09IFVJbnQ2NCgwKQogICAgLy8gb3Igc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID09IFVJbnQ2NCgwKQogICAgYnogX2VudHJ5X2ludGVyZXN0X3NlZ21lbnRfaWZfYm9keUAzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozOTAKICAgIC8vIG9yIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID09IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozODktMzkxCiAgICAvLyBlbnRyeS5hY2NydWFsX2ZhY3RvciA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID09IFVJbnQ2NCgwKQogICAgLy8gb3Igc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID09IFVJbnQ2NCgwKQogICAgYnogX2VudHJ5X2ludGVyZXN0X3NlZ21lbnRfaWZfYm9keUAzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozOTEKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozODktMzkxCiAgICAvLyBlbnRyeS5hY2NydWFsX2ZhY3RvciA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID09IFVJbnQ2NCgwKQogICAgLy8gb3Igc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID09IFVJbnQ2NCgwKQogICAgYm56IF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2FmdGVyX2lmX2Vsc2VANAoKX2VudHJ5X2ludGVyZXN0X3NlZ21lbnRfaWZfYm9keUAzOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzkzCiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfZGlnIC0xCiAgICB1bmNvdmVyIDIKICAgIHJldHN1YgoKX2VudHJ5X2ludGVyZXN0X3NlZ21lbnRfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Mzk1CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Mzk2CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Mzk3CiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Mzk0LTM5OAogICAgLy8gYWNjcnVlZCA9IHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSwKICAgIC8vICAgICBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQwMgogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjM5OS00MDMKICAgIC8vIHJldHVybiBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBhY2NydWVkLAogICAgLy8gICAgIGVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMAogICAgc3dhcAogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIGZyYW1lX2RpZyAtMQogICAgdW5jb3ZlciAyCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZGlzY291bnRfYW5udWl0eV9mYWN0b3IoZGlzY291bnRfZmFjdG9yOiB1aW50NjQsIHJlZGVtcHRpb25fZmFjdG9yOiB1aW50NjQpIC0+IHVpbnQ2NDoKX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDYyLTQ2NgogICAgLy8gZGVmIF9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcigKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgIGRpc2NvdW50X2ZhY3RvcjogVUludDY0LAogICAgLy8gICAgIHJlZGVtcHRpb25fZmFjdG9yOiBVSW50NjQsCiAgICAvLyApIC0+IFVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDY4CiAgICAvLyBpZiByZWRlbXB0aW9uX2ZhY3RvciA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGJueiBfZGlzY291bnRfYW5udWl0eV9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0NjkKICAgIC8vIHJldHVybiBkaXNjb3VudF9mYWN0b3IKICAgIGZyYW1lX2RpZyAtMgogICAgcmV0c3ViCgpfZGlzY291bnRfYW5udWl0eV9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDcwCiAgICAvLyBwZXJpb2RfcmF0ZSA9IHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgKyBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQ3MQogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQ3MC00NzQKICAgIC8vIHBlcmlvZF9yYXRlID0gc2VsZi5maXhlZF9wb2ludF9zY2FsZSArIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIHJlZGVtcHRpb25fZmFjdG9yLAogICAgLy8gICAgIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgKwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDc1CiAgICAvLyBhc3NlcnQgcGVyaW9kX3JhdGUgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZHVwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0NzgKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0NzYtNDgwCiAgICAvLyByZXR1cm4gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgZGlzY291bnRfZmFjdG9yLAogICAgLy8gICAgIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICAvLyAgICAgcGVyaW9kX3JhdGUsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeShlbnRyeTogYnl0ZXMsIHBheWxvYWQ6IGJ5dGVzKSAtPiBieXRlcywgYnl0ZXM6Cl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeToKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYxMy02MTUKICAgIC8vIGRlZiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkoCiAgICAvLyAgICAgc2VsZiwgZW50cnk6IHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5LCBwYXlsb2FkOiB0eXAuT2JzZXJ2ZWRFdmVudFJlcXVlc3QKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDIgMgogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2MjMKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF9pZCA9PSBzZWxmLmV2ZW50X2N1cnNvciwgZXJyLklOVkFMSURfRVZFTlRfQ1VSU09SCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgY3Vyc29yCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2MjQKICAgIC8vIGFzc2VydCBlbnRyeS5zY2hlZHVsZWRfdGltZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwgZXJyLk5PX0RVRV9DQVNIRkxPVwogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA8PQogICAgYXNzZXJ0IC8vIE5vIGR1ZSBjYXNoZmxvdyB0byBwYXkKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYyNgogICAgLy8gZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjI3CiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfSUVEKToKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgZHVwCiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMzUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjI4LTYzMAogICAgLy8gIyBJRUQgZmluYWxpemVzIGlzc3VhbmNlOiByZXNlcnZlZCB1bml0cyBiZWNvbWUgYWN0aXZhdGFibGUgYW5kIHRoZQogICAgLy8gIyBzY2hlZHVsZSdzIGluaXRpYWwgY29udHJhY3R1YWwgc3RhdGUgYmVjb21lcyBsaXZlLgogICAgLy8gYXNzZXJ0IHNlbGYuX3N0YXR1c19pc19wZW5kaW5nX2llZCgpLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYzMgogICAgLy8gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCA9PSBzZWxmLnRvdGFsX3VuaXRzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgID09CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2MzEtNjMzCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPT0gc2VsZi50b3RhbF91bml0cwogICAgLy8gKSwgZXJyLlBSSU1BUllfRElTVFJJQlVUSU9OX0lOQ09NUExFVEUKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBub3QgY29tcGxldGUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYzNAogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2MzUKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYzNgogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPSBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZQogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYzNwogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ID0gVUludDY0KDApCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2MzgKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IGVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA0MQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYzOQogICAgLy8gc2VsZi5ldmVudF9jdXJzb3IgKz0gVUludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjQwCiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbnVtcy5TVEFUVVNfQUNUSVZFKQogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgcHVzaGludCAxMDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0NTEKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwgZXJyLk5PVF9FVlRfSUVECiAgICBmcmFtZV9kaWcgMTEKICAgIGFzc2VydCAvLyBOb3QgSUVEIGV2ZW50CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0NTIKICAgIC8vIHJldHVybiBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjQxLTY0NQogICAgLy8gc2VsZi5fZW1pdF9leGVjdXRpb25fZXZlbnQoCiAgICAvLyAgICAgZW50cnk9ZW50cnksCiAgICAvLyAgICAgcGF5b2ZmPXNlbGYuX2VudHJ5X2llZF9hbW91bnQoZW50cnkpLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjQ0CiAgICAvLyBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjQxLTY0NQogICAgLy8gc2VsZi5fZW1pdF9leGVjdXRpb25fZXZlbnQoCiAgICAvLyAgICAgZW50cnk9ZW50cnksCiAgICAvLyAgICAgcGF5b2ZmPXNlbGYuX2VudHJ5X2llZF9hbW91bnQoZW50cnkpLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGNhbGxzdWIgX2VtaXRfZXhlY3V0aW9uX2V2ZW50CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgLTIKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjY0NgogICAgLy8gcmV0dXJuCiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2J1cnkgMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMzUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTQ3CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuX3N0YXR1c19pc19wZW5kaW5nX2llZCgpLCBlcnIuUEVORElOR19JRUQKICAgICEKICAgIGFzc2VydCAvLyBJRUQgbm90IHlldCBleGVjdXRlZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjQ5CiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgKz0gc2VsZi5fZW50cnlfaW50ZXJlc3Rfc2VnbWVudChlbnRyeSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQKICAgIGZyYW1lX2J1cnkgLTIKICAgICsKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjUxCiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUlIpOgogICAgZnJhbWVfZGlnIDEwCiAgICBwdXNoaW50IDEyCiAgICA9PQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAxMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjU1CiAgICAvLyBwYXlsb2FkLm9ic2VydmVkX3JhdGUsCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2NTYKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9tdWx0aXBsaWVyLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDM2IC8vICJyYXRlX3Jlc2V0X211bHRpcGxpZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9tdWx0aXBsaWVyIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjU3CiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjUyLTY1OAogICAgLy8gIyBSUiBkZXJpdmVzIHRoZSBuZXh0IHJhdGUgZnJvbSBhbiBvYnNlcnZlZCBvcmFjbGUgdmFsdWUgcGx1cyB0aGUKICAgIC8vICMgY29udHJhY3Qgc3ByZWFkIC8gbXVsdGlwbGllciB0ZXJtcywgdGhlbiBlbmZvcmNlcyBmbG9vciBhbmQgY2FwLgogICAgLy8gb2JzZXJ2ZWRfcmF0ZSA9IHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIHBheWxvYWQub2JzZXJ2ZWRfcmF0ZSwKICAgIC8vICAgICBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjY2MAogICAgLy8gb2JzZXJ2ZWRfcmF0ZSArIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzNSAvLyAicmF0ZV9yZXNldF9zcHJlYWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQgZXhpc3RzCiAgICArCiAgICBmcmFtZV9idXJ5IDYKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjczNAogICAgLy8gaWYgc2VsZi5oYXNfcmF0ZV9yZXNldF9mbG9vciBhbmQgcmF0ZSA8IHNlbGYucmF0ZV9yZXNldF9mbG9vcjoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzOCAvLyAiaGFzX3JhdGVfcmVzZXRfZmxvb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgZXhpc3RzCiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1NQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI5IC8vICJyYXRlX3Jlc2V0X2Zsb29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfZmxvb3IgZXhpc3RzCiAgICBmcmFtZV9kaWcgNgogICAgPgogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjczNQogICAgLy8gcmF0ZSA9IHNlbGYucmF0ZV9yZXNldF9mbG9vcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI5IC8vICJyYXRlX3Jlc2V0X2Zsb29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgNgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9mbG9vciBleGlzdHMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU1OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzM2CiAgICAvLyBpZiBzZWxmLmhhc19yYXRlX3Jlc2V0X2NhcCBhbmQgcmF0ZSA+IHNlbGYucmF0ZV9yZXNldF9jYXA6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzkgLy8gImhhc19yYXRlX3Jlc2V0X2NhcCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgZXhpc3RzCiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1OAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDMwIC8vICJyYXRlX3Jlc2V0X2NhcCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X2NhcCBleGlzdHMKICAgIGZyYW1lX2RpZyA2CiAgICA8CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1OAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzM3CiAgICAvLyByYXRlID0gc2VsZi5yYXRlX3Jlc2V0X2NhcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDMwIC8vICJyYXRlX3Jlc2V0X2NhcCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDYKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfY2FwIGV4aXN0cwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTg6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2NTkKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gc2VsZi5fY2xhbXBfcmF0ZSgKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjY1OS02NjEKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gc2VsZi5fY2xhbXBfcmF0ZSgKICAgIC8vICAgICBvYnNlcnZlZF9yYXRlICsgc2VsZi5yYXRlX3Jlc2V0X3NwcmVhZAogICAgLy8gKQogICAgZnJhbWVfZGlnIDYKICAgIGFwcF9nbG9iYWxfcHV0CgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAxODoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjY3MQogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1BJKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCA0CiAgICA9PQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAyMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjcyCiAgICAvLyBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9IGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjY3MwogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMjM6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2NzgKICAgIC8vIGlmIHNlbGYuX2lzX2R5bmFtaWNfYW5udWl0eSgpOgogICAgY2FsbHN1YiBfaXNfZHluYW1pY19hbm51aXR5CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDI5CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2NzkKICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QUkYpOgogICAgZnJhbWVfZGlnIDEwCiAgICBwdXNoaW50IDUKICAgID09CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAzMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDkwCiAgICAvLyBkaXNjb3VudF9mYWN0b3IgPSBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQ5MQogICAgLy8gZGVub21pbmF0b3IgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQ5MgogICAgLy8gc2tpcF9maXJzdF9yZWRlbXB0aW9uID0gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDcKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQ5NAogICAgLy8gaWYgZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAyNQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgZnJhbWVfYnVyeSA4CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAzNQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDk1LTQ5OQogICAgLy8gIyBBbiBpbml0aWFsIFBSRiBtYXkgZGVzY3JpYmUgdGhlIGZpcnN0IHJlZGVtcHRpb24gcGVyaW9kIGRpcmVjdGx5LgogICAgLy8gZGlzY291bnRfZmFjdG9yID0gc2VsZi5fZGlzY291bnRfYW5udWl0eV9mYWN0b3IoCiAgICAvLyAgICAgZGlzY291bnRfZmFjdG9yLAogICAgLy8gICAgIGVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDgKICAgIGNhbGxzdWIgX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTAxCiAgICAvLyBza2lwX2ZpcnN0X3JlZGVtcHRpb24gPSBUcnVlCiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfYnVyeSA3CiAgICBmcmFtZV9idXJ5IDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDM1OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTAzCiAgICAvLyBmdXR1cmVfZXZlbnRfaWQgPSBzZWxmLmV2ZW50X2N1cnNvciArIFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfd2hpbGVfdG9wQDM2OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTA0CiAgICAvLyB3aGlsZSBmdXR1cmVfZXZlbnRfaWQgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgZnJhbWVfZGlnIDMKICAgID4KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl93aGlsZUA0OAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTA1CiAgICAvLyBmdXR1cmVfZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoZnV0dXJlX2V2ZW50X2lkKQogICAgZnJhbWVfZGlnIDMKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjUwNgogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPSBmdXR1cmVfZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1MDctNTA4CiAgICAvLyAjIE9ubHkgcmVkZW1wdGlvbi1iZWFyaW5nIGV2ZW50cyBjb250cmlidXRlIHRvIHRoZSBhbm51aXR5IGRlbm9taW5hdG9yLgogICAgLy8gaXNfcmVkZW1wdGlvbl9ldmVudCA9IGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpIG9yICgKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjUwNy01MTEKICAgIC8vICMgT25seSByZWRlbXB0aW9uLWJlYXJpbmcgZXZlbnRzIGNvbnRyaWJ1dGUgdG8gdGhlIGFubnVpdHkgZGVub21pbmF0b3IuCiAgICAvLyBpc19yZWRlbXB0aW9uX2V2ZW50ID0gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QUikgb3IgKAogICAgLy8gICAgIGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfTUQpCiAgICAvLyAgICAgYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICAvLyApCiAgICBibnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfdHJ1ZUA0MAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTA5CiAgICAvLyBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgZnJhbWVfZGlnIDQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1MDktNTEwCiAgICAvLyBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgLy8gYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF9mYWxzZUA0MQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTEwCiAgICAvLyBhbmQgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IgPiBVSW50NjQoMCkKICAgIGZyYW1lX2RpZyAwCiAgICBwdXNoaW50IDI1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTA5LTUxMAogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCkKICAgIC8vIGFuZCBmdXR1cmVfZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX3RydWVANDA6CiAgICBpbnRjXzEgLy8gMQoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfbWVyZ2VANDI6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1MTIKICAgIC8vIGlmIGlzX3JlZGVtcHRpb25fZXZlbnQ6CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA0NwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTEzCiAgICAvLyBpZiBza2lwX2ZpcnN0X3JlZGVtcHRpb246CiAgICBmcmFtZV9kaWcgNwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUA0NQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTE0CiAgICAvLyBza2lwX2ZpcnN0X3JlZGVtcHRpb24gPSBGYWxzZQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgNwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANDc6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1MjEKICAgIC8vIGZ1dHVyZV9ldmVudF9pZCArPSBVSW50NjQoMSkKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV93aGlsZV90b3BAMzYKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlANDU6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1MTgKICAgIC8vIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZnJhbWVfZGlnIDAKICAgIHB1c2hpbnQgMjUKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1MTYtNTE5CiAgICAvLyBkaXNjb3VudF9mYWN0b3IgPSBzZWxmLl9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcigKICAgIC8vICAgICBkaXNjb3VudF9mYWN0b3IsCiAgICAvLyAgICAgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMgogICAgc3dhcAogICAgY2FsbHN1YiBfZGlzY291bnRfYW5udWl0eV9mYWN0b3IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1MjAKICAgIC8vIGRlbm9taW5hdG9yICs9IGRpc2NvdW50X2ZhY3RvcgogICAgZnJhbWVfZGlnIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA0NwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDE6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF9tZXJnZUA0MgoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX3doaWxlQDQ4OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTIzCiAgICAvLyBhc3NlcnQgZGVub21pbmF0b3IgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZnJhbWVfZGlnIDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjUyNAogICAgLy8gbnVtZXJhdG9yID0gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTI1CiAgICAvLyBpZiBlbnRyeS5mbGFncyAmIFVJbnQ2NChlbnVtcy5GTEFHX0lOSVRJQUxfUFJGKSA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNTcKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gOAogICAgJgogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDUwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1MjYtNTI3CiAgICAvLyAjIFN1YnNlcXVlbnQgUFJGIGV2ZW50cyBhbW9ydGl6ZSBib3RoIHByaW5jaXBhbCBhbmQgYWxyZWFkeSBhY2NydWVkIGNhcnJ5LgogICAgLy8gbnVtZXJhdG9yICs9IHNlbGYuYWNjcnVlZF9pbnRlcmVzdAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgICsKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDUwOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTMwCiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTI4LTUzMgogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIG51bWVyYXRvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gICAgIGRlbm9taW5hdG9yLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDEKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2ODAKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IHNlbGYuX3JlY2FsY3VsYXRlX2FubnVpdHlfcGF5bWVudCgKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjgwLTY4MgogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gc2VsZi5fcmVjYWxjdWxhdGVfYW5udWl0eV9wYXltZW50KAogICAgLy8gICAgIGVudHJ5CiAgICAvLyApCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMzA6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2ODUKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjY4Ni02OTAKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1VSW50NjQoMCksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2ODgKICAgIC8vIHBheW9mZj1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Njg5CiAgICAvLyBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICBkdXAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjY4Ni02OTAKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1VSW50NjQoMCksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgY2FsbHN1YiBfZW1pdF9leGVjdXRpb25fZXZlbnQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDI5OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Njg0CiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDMwCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDIwOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Njc0CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9JUENCKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCAxOAogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDIzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2NzUtNjc2CiAgICAvLyAjIElQQ0Iga2VlcHMgcHJpbmNpcGFsIHVuY2hhbmdlZCBhbmQgb25seSByZXNldHMgdGhlIGludGVyZXN0IGJhc2UuCiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIGIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMjMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMTA6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2NjIKICAgIC8vIGVsaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1JSRik6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgMTEKICAgID09CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDE0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2NjMKICAgIC8vIG5leHRfcmF0ZSA9IGVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjY0CiAgICAvLyBpZiBuZXh0X3JhdGUgPT0gVUludDY0KDApOgogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDEzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2NjUKICAgIC8vIG5leHRfcmF0ZSA9IHNlbGYucmF0ZV9yZXNldF9uZXh0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzcgLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDUKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfbmV4dCBleGlzdHMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjY2CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IG5leHRfcmF0ZQogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgZnJhbWVfZGlnIDUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDE0OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjY4CiAgICAvLyBpZiBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSAhPSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgOQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMTgKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjY2OQogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPSBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZQogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgZnJhbWVfZGlnIDkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CgoKLy8gbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KGVudHJ5OiBieXRlcywgcGF5b2ZmOiB1aW50NjQsIHNldHRsZWRfYW1vdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpfZW1pdF9leGVjdXRpb25fZXZlbnQ6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2OTYtNzAyCiAgICAvLyBkZWYgX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgKiwKICAgIC8vICAgICBlbnRyeTogdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnksCiAgICAvLyAgICAgcGF5b2ZmOiBVSW50NjQsCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ6IFVJbnQ2NCwKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDMgMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzA2CiAgICAvLyBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25JRAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzA3CiAgICAvLyBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIGZyYW1lX2RpZyAtMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3MDgKICAgIC8vIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIGZyYW1lX2RpZyAtMwogICAgZXh0cmFjdCA4IDEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjcwOQogICAgLy8gc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICBmcmFtZV9kaWcgLTMKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3MTAKICAgIC8vIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3MTMKICAgIC8vIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIGZyYW1lX2RpZyAtMwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzA4CiAgICAvLyBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICBpbnRjXzIgLy8gOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzEzCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBnZXRieXRlCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3NDIKICAgIC8vIGlmIHBheW9mZiA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJueiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3NDMKICAgIC8vIHJldHVybiBVSW50NjQoZW51bXMuUEFZT0ZGX1NJR05fUE9TSVRJVkUpCiAgICBpbnRjXzEgLy8gMQoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX3BheW9mZl9zaWduQDc6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3MTItNzE0CiAgICAvLyBwYXlvZmZfc2lnbj1hcmM0LlVJbnQ4KAogICAgLy8gICAgIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIC8vICksCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgaW50Y18yIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3MTYKICAgIC8vIGN1cnJlbmN5X2lkPXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzE3CiAgICAvLyBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3MDUtNzE4CiAgICAvLyBFeGVjdXRpb25FdmVudCgKICAgIC8vICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIC8vICAgICBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYXBwbGllZF9hdD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICBwYXlvZmY9cGF5b2ZmLAogICAgLy8gICAgIHBheW9mZl9zaWduPWFyYzQuVUludDgoCiAgICAvLyAgICAgICAgIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIC8vICAgICApLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PXNldHRsZWRfYW1vdW50LAogICAgLy8gICAgIGN1cnJlbmN5X2lkPXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAwCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzA0LTcxOQogICAgLy8gYXJjNC5lbWl0KAogICAgLy8gICAgIEV4ZWN1dGlvbkV2ZW50KAogICAgLy8gICAgICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgICAgIHBheW9mZj1wYXlvZmYsCiAgICAvLyAgICAgICAgIHBheW9mZl9zaWduPWFyYzQuVUludDgoCiAgICAvLyAgICAgICAgICAgICBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICAvLyAgICAgICAgICksCiAgICAvLyAgICAgICAgIHNldHRsZWRfYW1vdW50PXNldHRsZWRfYW1vdW50LAogICAgLy8gICAgICAgICBjdXJyZW5jeV9pZD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgICAgIHNlcXVlbmNlPWVudHJ5LmV2ZW50X2lkICsgVUludDY0KDEpLAogICAgLy8gICAgICkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDlhMzMyYjk1IC8vIG1ldGhvZCAiRXhlY3V0aW9uRXZlbnQodWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojc0NAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiAoVUludDY0KGVudW1zLkVWVF9JRUQpLCBVSW50NjQoZW51bXMuRVZUX1BJKSk6CiAgICBmcmFtZV9kaWcgNQogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBibnogX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2lmX2JvZHlANQogICAgZnJhbWVfZGlnIDUKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGJ6IF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pZl9lbHNlQDYKCl9lbWl0X2V4ZWN1dGlvbl9ldmVudF9pZl9ib2R5QDU6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3NDUKICAgIC8vIHJldHVybiBVSW50NjQoZW51bXMuUEFZT0ZGX1NJR05fUE9TSVRJVkUpCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzEzCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBiIF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pbmxpbmVkX21vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9wYXlvZmZfc2lnbkA3CgpfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzQ2CiAgICAvLyByZXR1cm4gVUludDY0KGVudW1zLlBBWU9GRl9TSUdOX05FR0FUSVZFKQogICAgcHVzaGludCAyNTUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjcxMwogICAgLy8gc2VsZi5fcGF5b2ZmX3NpZ24oZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSwgcGF5b2ZmKQogICAgYiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fcGF5b2ZmX3NpZ25ANwoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9yb2xlX2lzX2FjdGl2ZShyb2xlX21hcDogYnl0ZXMsIHJvbGVfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NDoKX3JvbGVfaXNfYWN0aXZlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU3CiAgICAvLyBkZWYgX3JvbGVfaXNfYWN0aXZlKHNlbGYsIHJvbGVfbWFwOiB0eXAuUmJhY1JvbGUsIHJvbGVfYWRkcmVzczogQWNjb3VudCkgLT4gYm9vbDoKICAgIHByb3RvIDIgMQogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5CiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5LTYwCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5LTYxCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjEKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAtNjEKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgPj0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX21lcmdlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKSAtPiB2b2lkOgpfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2NQogICAgLy8gYXNzZXJ0IHNlbGYuX2lzX2FycmFuZ2VyKFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTIKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgPT0gc2VsZi5hcnJhbmdlci52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE4IC8vIDB4NTIyMzQxNzI3MjYxNmU2NzY1NzIyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgPT0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2NQogICAgLy8gYXNzZXJ0IHNlbGYuX2lzX2FycmFuZ2VyKFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpIC0+IHZvaWQ6Cl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4MwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFzc2V0X2RlZmF1bHRlZCwgZXJyLkRFRkFVTFRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQxIC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfZGVmYXVsdGVkIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIERlZmF1bHRlZAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkgLT4gdm9pZDoKX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg2CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYXNzZXRfc3VzcGVuZGVkLCBlcnIuU1VTUEVOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzMgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9zdXNwZW5kZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gU3VzcGVuZGVkIG9wZXJhdGlvbnMKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkOiB1aW50NjQpIC0+IHZvaWQ6Cl9hc3NlcnRfdmFsaWRfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OAogICAgLy8gZGVmIF9hc3NlcnRfdmFsaWRfcm9sZShzZWxmLCByb2xlX2lkOiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTAKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIHB1c2hpbnQgMjAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkxCiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgcHVzaGludCAyNQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTIKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICBwdXNoaW50IDQwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MwogICAgLy8gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgcHVzaGludCA1MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTQKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgcHVzaGludCA2MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTUKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICBwdXNoaW50IDcwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NgogICAgLy8gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgcHVzaGludCA4MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfZmFsc2VAOAoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3OgogICAgaW50Y18xIC8vIDEKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX21lcmdlQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgcmV0c3ViCgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9mYWxzZUA4OgogICAgaW50Y18wIC8vIDAKICAgIGIgX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfbWVyZ2VAOQo=", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCAzMgogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1ICJzdGF0dXMiICJldmVudF9jdXJzb3IiICJvdXRzdGFuZGluZ19wcmluY2lwYWwiICJzY2hlZHVsZV9lbnRyeV9jb3VudCIgImZpeGVkX3BvaW50X3NjYWxlIiAiYWNjcnVlZF9pbnRlcmVzdCIgImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMgIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIgInJlc2VydmVkX3VuaXRzX3RvdGFsIiAicmVzZXJ2ZWRfcHJpbmNpcGFsIiAiY29udHJhY3RfdHlwZSIgInRvdGFsX3VuaXRzIiAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIgInJlc2VydmVkX2ludGVyZXN0IiAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIgImN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IiAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMgInNldHRsZW1lbnRfYXNzZXRfaWQiICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIgMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMgMHg1MjIzNTA3MjY5NmQ2MTcyNzk0NDY1NjE2YzY1NzIyMyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMgMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzIDB4NTIyMzRmNzA0NDYxNjU2ZDZmNmUyMyAiaW5pdGlhbF9leGNoYW5nZV9kYXRlIiAidHJhbnNmZXJfb3BlbmluZ19kYXRlIiAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIiAicmF0ZV9yZXNldF9mbG9vciIgInJhdGVfcmVzZXRfY2FwIiAweDUzMjMgMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMyAiYXNzZXRfc3VzcGVuZGVkIiAiZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiIgInJhdGVfcmVzZXRfc3ByZWFkIiAicmF0ZV9yZXNldF9tdWx0aXBsaWVyIiAicmF0ZV9yZXNldF9uZXh0IiAiaGFzX3JhdGVfcmVzZXRfZmxvb3IiICJoYXNfcmF0ZV9yZXNldF9jYXAiIDB4MDAgImFzc2V0X2RlZmF1bHRlZCIgInByb3NwZWN0dXNfaGFzaCIgInByb3NwZWN0dXNfdXJsIiAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIiAibWF0dXJpdHlfZGF0ZSIgImRheV9jb3VudF9jb252ZW50aW9uIiAweDA2ODEwMQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4LTI5CiAgICAvLyAjIFJCQUMgUm9sZXMKICAgIC8vIHNlbGYuYXJyYW5nZXIgPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX0FSUkFOR0VSKQogICAgYnl0ZWMgMTggLy8gMHg1MjIzNDE3MjcyNjE2ZTY3NjU3MjIzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzAKICAgIC8vIHNlbGYub3BfZGFlbW9uID0gR2xvYmFsU3RhdGUoQWNjb3VudCgpLCBrZXk9Y3N0LlBSRUZJWF9JRF9PUF9EQUVNT04pCiAgICBieXRlYyAyNSAvLyAweDUyMjM0ZjcwNDQ2MTY1NmQ2ZjZlMjMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo0Ny00OAogICAgLy8gIyBELUFTQSBHb3Zlcm5hbmNlCiAgICAvLyBzZWxmLmFzc2V0X3N1c3BlbmRlZCA9IEZhbHNlCiAgICBieXRlYyAzMyAvLyAiYXNzZXRfc3VzcGVuZGVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NDkKICAgIC8vIHNlbGYuYXNzZXRfZGVmYXVsdGVkID0gRmFsc2UKICAgIGJ5dGVjIDQxIC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU2LTU3CiAgICAvLyAjIENvbnRyYWN0CiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMTIgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwLTYxCiAgICAvLyAjIFByb3NwZWN0dXMgKEluZm9ybWF0aW9uYWwpCiAgICAvLyBzZWxmLnByb3NwZWN0dXNfaGFzaCA9IEJ5dGVzKCkKICAgIGJ5dGVjIDQyIC8vICJwcm9zcGVjdHVzX2hhc2giCiAgICBwdXNoYnl0ZXMgMHgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MgogICAgLy8gc2VsZi5wcm9zcGVjdHVzX3VybCA9IFN0cmluZygpCiAgICBieXRlYyA0MyAvLyAicHJvc3BlY3R1c191cmwiCiAgICBwdXNoYnl0ZXMgIiIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NC02NQogICAgLy8gIyBEZW5vbWluYXRpb24KICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gQXNzZXQoKQogICAgYnl0ZWMgNDQgLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjYKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCA9IEFzc2V0KCkKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OC02OQogICAgLy8gIyBUaW1lCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgMjYgLy8gImluaXRpYWxfZXhjaGFuZ2VfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzAKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgNDUgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxCiAgICAvLyBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgMjcgLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIKICAgIC8vIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlID0gdHlwLlRpbWVTdGFtcCgpCiAgICBieXRlYyAyOCAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NC03NQogICAgLy8gIyBEYXkgQ291bnQgQ29udmVudGlvbgogICAgLy8gc2VsZi5kYXlfY291bnRfY29udmVudGlvbiA9IFVJbnQ2NCgpCiAgICBieXRlYyA0NiAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc3LTc4CiAgICAvLyAjIFVuaXRzCiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzID0gVUludDY0KCkKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPSBVSW50NjQoKQogICAgYnl0ZWMgMTAgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MS04MgogICAgLy8gIyBQcmluY2lwYWwKICAgIC8vIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPSBVSW50NjQoKQogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MwogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBVSW50NjQoKQogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NAogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gVUludDY0KCkKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NQogICAgLy8gc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gRmFsc2UKICAgIGJ5dGVjIDM0IC8vICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4Ny04OAogICAgLy8gIyBJbnRlcmVzdAogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gVUludDY0KCkKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg5CiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgPSBVSW50NjQoKQogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTEtOTIKICAgIC8vICMgSW50ZXJlc3QgUmF0ZXMKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTMKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQgPSBVSW50NjQoKQogICAgYnl0ZWMgMzUgLy8gInJhdGVfcmVzZXRfc3ByZWFkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NAogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIgPSBVSW50NjQoKQogICAgYnl0ZWMgMzYgLy8gInJhdGVfcmVzZXRfbXVsdGlwbGllciIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTUKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9mbG9vciA9IFVJbnQ2NCgpCiAgICBieXRlYyAyOSAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTYKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9jYXAgPSBVSW50NjQoKQogICAgYnl0ZWMgMzAgLy8gInJhdGVfcmVzZXRfY2FwIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NwogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X25leHQgPSBVSW50NjQoKQogICAgYnl0ZWMgMzcgLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTgKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgPSBGYWxzZQogICAgYnl0ZWMgMzggLy8gImhhc19yYXRlX3Jlc2V0X2Zsb29yIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OQogICAgLy8gc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgPSBGYWxzZQogICAgYnl0ZWMgMzkgLy8gImhhc19yYXRlX3Jlc2V0X2NhcCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAxLTEwMgogICAgLy8gIyBQcmltYXJ5IERpc3RyaWJ1dGlvbgogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgPSBVSW50NjQoKQogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAzCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0ID0gVUludDY0KCkKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA1LTEwNgogICAgLy8gIyBDdW11bGF0aXZlIFBlci1Vbml0IEZpeGVkLVBvaW50IEluZGV4ZXMKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4ID0gVUludDY0KCkKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1CiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciA9IFVJbnQ2NCgpCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNgogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA9IFVJbnQ2NCgpCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE4LTExOQogICAgLy8gIyBTY2FsaW5nCiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlID0gVUludDY0KCkKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6MjMKICAgIC8vIGFzc2VydCBUeG4uZ2xvYmFsX251bV9ieXRlX3NsaWNlID09IGNmZy5HTE9CQUxfQllURVMsIGVyci5XUk9OR19HTE9CQUxfQllURVMKICAgIHR4biBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgQnl0ZXMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjI0CiAgICAvLyBhc3NlcnQgVHhuLmdsb2JhbF9udW1fdWludCA9PSBjZmcuR0xPQkFMX1VJTlRTLCBlcnIuV1JPTkdfR0xPQkFMX1VJTlRTCiAgICB0eG4gR2xvYmFsTnVtVWludAogICAgcHVzaGludCAzNwogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgVUludHMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBhc3NlcnQgVHhuLmxvY2FsX251bV9ieXRlX3NsaWNlID09IGNmZy5MT0NBTF9CWVRFUywgZXJyLldST05HX0xPQ0FMX0JZVEVTCiAgICB0eG4gTG9jYWxOdW1CeXRlU2xpY2UKICAgICEKICAgIGFzc2VydCAvLyBXcm9uZyBMb2NhbCBCeXRlcyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6MjYKICAgIC8vIGFzc2VydCBUeG4ubG9jYWxfbnVtX3VpbnQgPT0gY2ZnLkxPQ0FMX1VJTlRTLCBlcnIuV1JPTkdfTE9DQUxfVUlOVFMKICAgIHR4biBMb2NhbE51bVVpbnQKICAgICEKICAgIGFzc2VydCAvLyBXcm9uZyBMb2NhbCBVSW50cyBhbGxvY2F0aW9uCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kX2FzYS9jb250cmFjdC5weTo4LTE4CiAgICAvLyBjbGFzcyBEQVNBKAogICAgLy8gICAgIFBheW1lbnRBZ2VudCwKICAgIC8vICAgICBUcmFuc2ZlckFnZW50LAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gICAgIGF2bV92ZXJzaW9uPTEyLAogICAgLy8gKToKICAgIHB1c2hieXRlcyAweDkxNGYwNGViIC8vIG1ldGhvZCAiY29udHJhY3RfdXBkYXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9jb250cmFjdF91cGRhdGVfcm91dGVANAoKbWFpbl9zd2l0Y2hfY2FzZV9uZXh0QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6OC0xOAogICAgLy8gY2xhc3MgREFTQSgKICAgIC8vICAgICBQYXltZW50QWdlbnQsCiAgICAvLyAgICAgVHJhbnNmZXJBZ2VudCwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBhdm1fdmVyc2lvbj0xMiwKICAgIC8vICk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBieiBtYWluX2NyZWF0ZV9Ob09wQDMxCiAgICBwdXNoYnl0ZXNzIDB4YjQ0NjE4YzggMHhlNzgzMjUyOSAweDdlYTIwZTBiIDB4NmM4NWUzZWUgMHhiZGQxYTk0NCAweGRjMDYzYjM1IDB4MTRmYzEwZWYgMHg3NGE3Mjk3ZiAweDA5ZDRmZTE0IDB4OWE5YmZhODUgMHg4NWVlZDMzZCAweDkxODUxMDRhIDB4ZDlmMjI1YWMgMHg2ZTBlNWM5NSAweGZmM2ZkNGIzIDB4ODJmNzFiMmQgMHhlZjA0ZjVkMyAweGRmMzQzNTUwIDB4M2RiZTgwYmQgMHhkZjU0ZTgyYyAweDAxMGM4Mjk5IDB4NzQwNmFjZDIgMHgxYTcyYTJlZSAvLyBtZXRob2QgImZ1bmRfZHVlX2Nhc2hmbG93cyh1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJjbGFpbV9kdWVfY2FzaGZsb3dzKGFkZHJlc3MsYnl0ZVtdKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYnl0ZVtdKSIsIG1ldGhvZCAic2V0X3RyYW5zZmVyX3NjaGVkdWxlKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbihhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInRyYW5zZmVyKGFkZHJlc3MsYWRkcmVzcyx1aW50NjQpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X2dvdl9zdXNwZW5zaW9uKGFkZHJlc3MsYm9vbCl1aW50NjQiLCBtZXRob2QgImFjY291bnRfb3BlbihhZGRyZXNzLGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X3VwZGF0ZV9wYXltZW50X2FkZHJlc3MoYWRkcmVzcyxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAiYWNjb3VudF9nZXRfcG9zaXRpb24oYWRkcmVzcykoYWRkcmVzcyx1aW50NjQsdWludDY0LGJvb2wsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImNvbnRyYWN0X2NvbmZpZygodWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYm9vbCxib29sLGJvb2wsdWludDY0KSwodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpLChieXRlWzMyXSxzdHJpbmcpKXVpbnQ2NCIsIG1ldGhvZCAiY29udHJhY3Rfc2NoZWR1bGUodWludDY0LGJvb2wsKHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpW10pdWludDY0IiwgbWV0aG9kICJleGVjdXRlX2llZCgpdWludDY0IiwgbWV0aG9kICJhcHBseV9ub25fY2FzaF9ldmVudCh1aW50NjQsKHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSl1aW50NjQiLCBtZXRob2QgImdldF9jb250cmFjdF9zdGF0ZSgpKHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJnZXRfbmV4dF9kdWVfZXZlbnQoKSh1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAicmJhY19yb3RhdGVfYXJyYW5nZXIoYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgInJiYWNfc2V0X29wX2RhZW1vbihhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19hc3NpZ25fcm9sZSh1aW50OCxhZGRyZXNzLCh1aW50NjQsdWludDY0KSl1aW50NjQiLCBtZXRob2QgInJiYWNfcmV2b2tlX3JvbGUodWludDgsYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgInJiYWNfZ292X2Fzc2V0X3N1c3BlbnNpb24oYm9vbCl1aW50NjQiLCBtZXRob2QgInJiYWNfZ2V0X2FycmFuZ2VyKClhZGRyZXNzIiwgbWV0aG9kICJyYmFjX2dldF9hZGRyZXNzX3JvbGVzKGFkZHJlc3MpKGJvb2wsYm9vbCxib29sLGJvb2wsYm9vbCkiLCBtZXRob2QgInJiYWNfZ2V0X3JvbGVfdmFsaWRpdHkodWludDgsYWRkcmVzcykodWludDY0LHVpbnQ2NCkiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBmdW5kX2R1ZV9jYXNoZmxvd3MgY2xhaW1fZHVlX2Nhc2hmbG93cyBzZXRfdHJhbnNmZXJfc2NoZWR1bGUgcHJpbWFyeV9kaXN0cmlidXRpb24gdHJhbnNmZXIgYWNjb3VudF9nb3Zfc3VzcGVuc2lvbiBhY2NvdW50X29wZW4gYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzIGFjY291bnRfZ2V0X3Bvc2l0aW9uIGNvbnRyYWN0X2NvbmZpZyBjb250cmFjdF9zY2hlZHVsZSBleGVjdXRlX2llZCBhcHBseV9ub25fY2FzaF9ldmVudCBnZXRfY29udHJhY3Rfc3RhdGUgZ2V0X25leHRfZHVlX2V2ZW50IHJiYWNfcm90YXRlX2FycmFuZ2VyIHJiYWNfc2V0X29wX2RhZW1vbiByYmFjX2Fzc2lnbl9yb2xlIHJiYWNfcmV2b2tlX3JvbGUgcmJhY19nb3ZfYXNzZXRfc3VzcGVuc2lvbiByYmFjX2dldF9hcnJhbmdlciByYmFjX2dldF9hZGRyZXNzX3JvbGVzIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHkKICAgIGVycgoKbWFpbl9jcmVhdGVfTm9PcEAzMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kX2FzYS9jb250cmFjdC5weTo4LTE4CiAgICAvLyBjbGFzcyBEQVNBKAogICAgLy8gICAgIFBheW1lbnRBZ2VudCwKICAgIC8vICAgICBUcmFuc2ZlckFnZW50LAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gICAgIGF2bV92ZXJzaW9uPTEyLAogICAgLy8gKToKICAgIHB1c2hieXRlcyAweDk1NmQ3MTU2IC8vIG1ldGhvZCAiY29udHJhY3RfY3JlYXRlKGFkZHJlc3MpdWludDY0IgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggY29udHJhY3RfY3JlYXRlCiAgICBlcnIKCm1haW5fY29udHJhY3RfdXBkYXRlX3JvdXRlQDQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBwdXNoaW50IDQgLy8gVXBkYXRlQXBwbGljYXRpb24KICAgID09CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydAogICAgYiBjb250cmFjdF91cGRhdGUKCgovLyBtb2R1bGVzLnBheW1lbnRfYWdlbnQuUGF5bWVudEFnZW50LmZ1bmRfZHVlX2Nhc2hmbG93c1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmZ1bmRfZHVlX2Nhc2hmbG93czoKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gMTAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjUwCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo1MQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo1MgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDcKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NTUKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NTYtNTcKICAgIC8vIGZ1bmRlZF9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgLy8gZnVuZGVkX3ByaW5jaXBhbCA9IFVJbnQ2NCgwKQogICAgZHVwbiAyCgpmdW5kX2R1ZV9jYXNoZmxvd3Nfd2hpbGVfdG9wQDI6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjAKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgPCBtYXhfZXZlbnRfY291bnQKICAgIGRpZyAyCiAgICBkaWcgNAogICAgPAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjYwLTYxCiAgICAvLyBwcm9jZXNzZWRfZXZlbnRzIDwgbWF4X2V2ZW50X2NvdW50CiAgICAvLyBhbmQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAOQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjYxCiAgICAvLyBhbmQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIDwKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2MC02MQogICAgLy8gcHJvY2Vzc2VkX2V2ZW50cyA8IG1heF9ldmVudF9jb3VudAogICAgLy8gYW5kIHNlbGYuZXZlbnRfY3Vyc29yIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudAogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDkKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2MwogICAgLy8gZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoc2VsZi5ldmVudF9jdXJzb3IpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgZHVwCiAgICBidXJ5IDE3CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjQKICAgIC8vIGlmIGVudHJ5LnNjaGVkdWxlZF90aW1lID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXA6CiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgNgogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPgogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl93aGlsZUA5CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjYKICAgIC8vIGlmIG5vdCBzZWxmLl9ldmVudF9pc19jYXNoKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkpOgogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBidXJ5IDE2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNTEKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgaW50Y18yIC8vIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM1MC0zNTQKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX01EKSwKICAgIC8vICkKICAgID09CiAgICBkdXAKICAgIGJ1cnkgNwogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX3RydWVANTAKICAgIGRpZyAxNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzUyCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzUwLTM1NAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfTUQpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDUwCiAgICBkaWcgMTQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM1MwogICAgLy8gVUludDY0KGVudW1zLkVWVF9NRCksCiAgICBwdXNoaW50IDE5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNTAtMzU0CiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9NRCksCiAgICAvLyApCiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VANTEKCmZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX3RydWVANTA6CiAgICBpbnRjXzEgLy8gMQoKZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfbWVyZ2VANTI6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjYKICAgIC8vIGlmIG5vdCBzZWxmLl9ldmVudF9pc19jYXNoKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkpOgogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU0OAogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X2lkID09IHNlbGYuZXZlbnRfY3Vyc29yLCBlcnIuSU5WQUxJRF9FVkVOVF9DVVJTT1IKICAgIGRpZyAxNQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBjdXJzb3IKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU0OQogICAgLy8gYXNzZXJ0IGVudHJ5LnNjaGVkdWxlZF90aW1lIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLCBlcnIuTk9fRFVFX0NBU0hGTE9XCiAgICBkaWcgNAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPD0KICAgIGFzc2VydCAvLyBObyBkdWUgY2FzaGZsb3cgdG8gcGF5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MTMKICAgIC8vIGlmIGV2ZW50X3R5cGUgbm90IGluIChVSW50NjQoZW51bXMuRVZUX0lQKSwgVUludDY0KGVudW1zLkVWVF9NRCkpOgogICAgZGlnIDUKICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxMwogICAgZGlnIDE0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDEzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MTQKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDEzCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfaW50ZXJlc3RfYW1vdW50QDE0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDI2CiAgICAvLyBldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBidXJ5IDE2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MjcKICAgIC8vIGlmIGV2ZW50X3R5cGUgbm90IGluIChVSW50NjQoZW51bXMuRVZUX1BSKSwgVUludDY0KGVudW1zLkVWVF9NRCkpOgogICAgcHVzaGludCAzCiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE3CiAgICBkaWcgMTQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQyOAogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnRAMjY6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTMKICAgIC8vIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGRpZyAxNQogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgMTAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1NgogICAgLy8gaWYgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCk6CiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUAyNwogICAgZGlnIDkKICAgIGJ1cnkgMTEKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTcyLTU3NAogICAgLy8gIyBGdW5kaW5nIHVzZXMgcGVyLXVuaXQgY3VtdWxhdGl2ZSBpbmRpY2VzIHNvIGVhY2ggaG9sZGVyIGNhbiBzZXR0bGUKICAgIC8vICMgaW5kZXBlbmRlbnRseSBmcm9tIGl0cyBjdXJyZW50IHVuaXQgYmFsYW5jZS4KICAgIC8vIGludGVyZXN0X2luZGV4X2RlbHRhID0gc2VsZi5fYW1vdW50X3RvX2luZGV4X2RlbHRhKGludGVyZXN0X2Ftb3VudF9kdWUpCiAgICBkaWcgMTIKICAgIGNhbGxzdWIgX2Ftb3VudF90b19pbmRleF9kZWx0YQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTc1CiAgICAvLyBwcmluY2lwYWxfaW5kZXhfZGVsdGEgPSBzZWxmLl9hbW91bnRfdG9faW5kZXhfZGVsdGEocHJpbmNpcGFsX2Ftb3VudF9kdWUpCiAgICBkaWcgOAogICAgY2FsbHN1YiBfYW1vdW50X3RvX2luZGV4X2RlbHRhCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzYKICAgIC8vIGludGVyZXN0X2Ftb3VudCA9IHNlbGYuX2luZGV4X2RlbHRhX3RvX2Ftb3VudChpbnRlcmVzdF9pbmRleF9kZWx0YSkKICAgIGRpZyAxCiAgICBjYWxsc3ViIF9pbmRleF9kZWx0YV90b19hbW91bnQKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSAxNwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTc3CiAgICAvLyBwcmluY2lwYWxfYW1vdW50ID0gc2VsZi5faW5kZXhfZGVsdGFfdG9fYW1vdW50KHByaW5jaXBhbF9pbmRleF9kZWx0YSkKICAgIGR1cAogICAgY2FsbHN1YiBfaW5kZXhfZGVsdGFfdG9fYW1vdW50CiAgICBkdXAKICAgIGJ1cnkgMTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU3OAogICAgLy8gcmVxdWlyZWRfYW1vdW50ID0gaW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudAogICAgZGlnIDIKICAgIGRpZyAxCiAgICArCiAgICBkdXAKICAgIGJ1cnkgMTIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcyNwogICAgLy8gYmFsYW5jZSA9IHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ1NgogICAgLy8gcmV0dXJuIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgKyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIGRpZyAxCiAgICArCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MjkKICAgIC8vIGFzc2VydCBiYWxhbmNlID49IHJlc2VydmVkX3RvdGFsLCBlcnIuTk9UX0VOT1VHSF9GVU5EUwogICAgZGlnIDIKICAgIGRpZyAxCiAgICA+PQogICAgYXNzZXJ0IC8vIE5vdCBlbm91Z2ggZnVuZHMgZm9yIHRoZSBwYXltZW50CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MzAKICAgIC8vIHJldHVybiBiYWxhbmNlIC0gcmVzZXJ2ZWRfdG90YWwKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTgwCiAgICAvLyBzZWxmLl9hdmFpbGFibGVfc2V0dGxlbWVudF9mdW5kcygpID49IHJlcXVpcmVkX2Ftb3VudAogICAgdW5jb3ZlciAyCiAgICA+PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTc5LTU4MQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLl9hdmFpbGFibGVfc2V0dGxlbWVudF9mdW5kcygpID49IHJlcXVpcmVkX2Ftb3VudAogICAgLy8gKSwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTgzCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0ICs9IGludGVyZXN0X2Ftb3VudAogICAgdW5jb3ZlciAzCiAgICArCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTg0CiAgICAvLyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCArPSBwcmluY2lwYWxfYW1vdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICArCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4NQogICAgLy8gc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4ICs9IGludGVyZXN0X2luZGV4X2RlbHRhCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCBleGlzdHMKICAgIHVuY292ZXIgMgogICAgKwogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTg2CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4ICs9IHByaW5jaXBhbF9pbmRleF9kZWx0YQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCBleGlzdHMKICAgICsKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1ODcKICAgIC8vIGlmIGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkgPT0gVUludDY0KGVudW1zLkVWVF9QUik6CiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBwdXNoaW50IDMKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDM4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1ODgtNTg5CiAgICAvLyAjIEZvciBQUiwgdGhlIHBlcmlvZCBpbnRlcmVzdCBzdGF5cyBhY2NydWVkIHVudGlsIGEgbGF0ZXIgSVAgb3IgTUQuCiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgKz0gc2VsZi5fZW50cnlfaW50ZXJlc3Rfc2VnbWVudChlbnRyeSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBkaWcgMTYKICAgIGNhbGxzdWIgX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQKICAgIGJ1cnkgMTgKICAgICsKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTIKICAgIC8vIGlmIG5vdCBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKSBvciBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NCgKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlANDEKICAgIGRpZyAxNQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5Mi01OTQKICAgIC8vIGlmIG5vdCBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKSBvciBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NCgKICAgIC8vICAgICBlbnVtcy5FVlRfTUQKICAgIC8vICk6CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDIKCmZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDQxOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTk1CiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBkaWcgMTUKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0MjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5NgogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgZGlnIDEwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTk3CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBuZXh0X2ludGVyZXN0X2Jhc2UKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBkaWcgMTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTgKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwMAogICAgLy8gaWYgZW50cnkuZXZlbnRfdHlwZSA9PSBhcmM0LlVJbnQ4KAogICAgZGlnIDE1CiAgICBleHRyYWN0IDggMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAwLTYwMgogICAgLy8gaWYgZW50cnkuZXZlbnRfdHlwZSA9PSBhcmM0LlVJbnQ4KAogICAgLy8gICAgIGVudW1zLkVWVF9NRAogICAgLy8gKSBhbmQgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPT0gVUludDY0KDApOgogICAgcHVzaGJ5dGVzIDB4MTMKICAgIGI9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwMgogICAgLy8gKSBhbmQgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPT0gVUludDY0KDApOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MDAtNjAyCiAgICAvLyBpZiBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoCiAgICAvLyAgICAgZW51bXMuRVZUX01ECiAgICAvLyApIGFuZCBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9PSBVSW50NjQoMCk6CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwMwogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX0VOREVEKQogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgcHVzaGludCAyMDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MDQKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MDYtNjEwCiAgICAvLyBzZWxmLl9lbWl0X2V4ZWN1dGlvbl9ldmVudCgKICAgIC8vICAgICBlbnRyeT1lbnRyeSwKICAgIC8vICAgICBwYXlvZmY9aW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudCwKICAgIC8vICAgICBzZXR0bGVkX2Ftb3VudD1pbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50LAogICAgLy8gKQogICAgZGlnIDE1CiAgICBkaWcgNwogICAgZHVwCiAgICBjYWxsc3ViIF9lbWl0X2V4ZWN1dGlvbl9ldmVudAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzAKICAgIC8vIGZ1bmRlZF9pbnRlcmVzdCArPSBpbnRlcmVzdF9hbW91bnQKICAgIGRpZyAxCiAgICBkaWcgMTQKICAgICsKICAgIGJ1cnkgMgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjcxCiAgICAvLyBmdW5kZWRfcHJpbmNpcGFsICs9IHByaW5jaXBhbF9hbW91bnQKICAgIGR1cAogICAgZGlnIDkKICAgICsKICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjcyCiAgICAvLyBwcm9jZXNzZWRfZXZlbnRzICs9IFVJbnQ2NCgxKQogICAgZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDMKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX3doaWxlX3RvcEAyCgpmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDM4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTkxCiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzkKCmZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDI3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTU3CiAgICAvLyBldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBidXJ5IDE2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTgtNTYwCiAgICAvLyAjIER5bmFtaWMgYW5udWl0aWVzIGRlcml2ZSBuZXh0IHN0YXRlIGZyb20gdGhlIHBheW1lbnQgZGVjb21wb3NpdGlvbiwKICAgIC8vICMgbm90IG9ubHkgZnJvbSB0aGUgcHJlY29tcHV0ZWQgYG5leHRfKmAgZmllbGRzLgogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1BSKToKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19lbHNlX2JvZHlAMjkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU2MgogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgLSBwcmluY2lwYWxfYW1vdW50X2R1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBkaWcgOAogICAgLQogICAgZHVwCiAgICBidXJ5IDExCiAgICBidXJ5IDExCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDI5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY1CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9JUCk6CiAgICBkaWcgMTQKICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUAzMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY2CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGJ1cnkgMTEKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU2NwogICAgLy8gbmV4dF9pbnRlcmVzdF9iYXNlID0gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBidXJ5IDEyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIGV4aXN0cwogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzNgoKZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUAzMToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU2OAogICAgLy8gZWxpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfTUQpOgogICAgZGlnIDE0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDMyCiAgICBkaWcgOQogICAgYnVyeSAxMQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzNgoKZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlAMzI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjkKICAgIC8vIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAxMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTcwCiAgICAvLyBuZXh0X2ludGVyZXN0X2Jhc2UgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDExCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQyOQogICAgLy8gaWYgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCk6CiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDI1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzAKICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCk6CiAgICBkaWcgMTQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDMxCiAgICAvLyByZXR1cm4gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTIKICAgIC8vIHByaW5jaXBhbF9hbW91bnRfZHVlID0gc2VsZi5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudChlbnRyeSkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnRAMjYKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDIwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDMyCiAgICAvLyBpbnRlcmVzdF9kdWUgPSBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgKyBzZWxmLl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KGVudHJ5KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgIGRpZyAxNgogICAgY2FsbHN1YiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudAogICAgYnVyeSAxOAogICAgKwogICAgZHVwCiAgICBidXJ5IDEzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzMKICAgIC8vIGlmIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA8PSBpbnRlcmVzdF9kdWU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiBleGlzdHMKICAgID49CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDM0CiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTIKICAgIC8vIHByaW5jaXBhbF9hbW91bnRfZHVlID0gc2VsZi5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudChlbnRyeSkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnRAMjYKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDIyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDM1CiAgICAvLyBwcmluY2lwYWxfYW1vdW50ID0gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIC0gaW50ZXJlc3RfZHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiBleGlzdHMKICAgIGRpZyAxMgogICAgLQogICAgZHVwCiAgICBidXJ5IDEwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzYKICAgIC8vIGlmIHByaW5jaXBhbF9hbW91bnQgPiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgPgogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzNwogICAgLy8gcmV0dXJuIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTUyCiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyNDoKICAgIGRpZyA4CiAgICBidXJ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyNgoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NDAKICAgIC8vIGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsIDw9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBkaWcgMTUKICAgIHB1c2hpbnQgNDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGR1cDIKICAgIDw9CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzktNDQxCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsIDw9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ0MgogICAgLy8gcmV0dXJuIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIC0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIHN3YXAKICAgIC0KICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTUyCiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQxNQogICAgLy8gcmV0dXJuIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCArIHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZGlnIDE2CiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBidXJ5IDE4CiAgICArCiAgICBidXJ5IDEzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTEKICAgIC8vIGludGVyZXN0X2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9pbnRlcmVzdF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9pbnRlcmVzdF9hbW91bnRAMTQKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl93aGlsZUA5OgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojc0CiAgICAvLyBhc3NlcnQgcHJvY2Vzc2VkX2V2ZW50cyA+IFVJbnQ2NCgwKSwgZXJyLk5PX0RVRV9DQVNIRkxPVwogICAgZGlnIDIKICAgIGR1cAogICAgYXNzZXJ0IC8vIE5vIGR1ZSBjYXNoZmxvdyB0byBwYXkKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3OAogICAgLy8gdG90YWxfZnVuZGVkPWZ1bmRlZF9pbnRlcmVzdCArIGZ1bmRlZF9wcmluY2lwYWwsCiAgICBkaWcgMgogICAgZHVwCiAgICBkaWcgMwogICAgZHVwCiAgICBjb3ZlciAzCiAgICArCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODAKICAgIC8vIHRpbWVzdGFtcD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3NS04MQogICAgLy8gcmV0dXJuIHR5cC5DYXNoRnVuZGluZ1Jlc3VsdCgKICAgIC8vICAgICBmdW5kZWRfaW50ZXJlc3Q9ZnVuZGVkX2ludGVyZXN0LAogICAgLy8gICAgIGZ1bmRlZF9wcmluY2lwYWw9ZnVuZGVkX3ByaW5jaXBhbCwKICAgIC8vICAgICB0b3RhbF9mdW5kZWQ9ZnVuZGVkX2ludGVyZXN0ICsgZnVuZGVkX3ByaW5jaXBhbCwKICAgIC8vICAgICBwcm9jZXNzZWRfZXZlbnRzPXByb2Nlc3NlZF9ldmVudHMsCiAgICAvLyAgICAgdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUA1MToKICAgIGludGNfMCAvLyAwCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDUyCgoKLy8gbW9kdWxlcy5wYXltZW50X2FnZW50LlBheW1lbnRBZ2VudC5jbGFpbV9kdWVfY2FzaGZsb3dzW3JvdXRpbmddKCkgLT4gdm9pZDoKY2xhaW1fZHVlX2Nhc2hmbG93czoKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNAogICAgLy8gaWYgc2VsZi5vcF9kYWVtb24udmFsdWUgIT0gR2xvYmFsLnplcm9fYWRkcmVzczoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNSAvLyAweDUyMjM0ZjcwNDQ2MTY1NmQ2ZjZlMjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcF9kYWVtb24gZXhpc3RzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBieiBjbGFpbV9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTcKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNgogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI1IC8vIDB4NTIyMzRmNzA0NDYxNjU2ZDZmNmUyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wX2RhZW1vbiBleGlzdHMKICAgID09CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTYtMTgKICAgIC8vIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICAvLyBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgYm56IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDE0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTcKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNi0xOAogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICBibnogY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX3RydWVAMTQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxOAogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIHR4biBTZW5kZXIKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDMyCiAgICA9PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE2LTE4CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAxNQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX3RydWVAMTQ6CiAgICBpbnRjXzEgLy8gMQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDE2OgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE1LTE5CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vICAgICBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gICAgIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICAvLyApLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNzoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5NAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5NQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDcKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6OTgKICAgIC8vIHNlbGYuX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQoaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDIKICAgIGR1cAogICAgY2FsbHN1YiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojk5CiAgICAvLyBzZWxmLl9zZXR0bGVfcG9zaXRpb24oaG9sZGluZ19hZGRyZXNzKQogICAgY2FsbHN1YiBfc2V0dGxlX3Bvc2l0aW9uCiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTcKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNsYWltYWJsZV9pbnRlcmVzdAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZHVwCiAgICBwdXNoaW50IDczCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBidXJ5IDgKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTgKICAgIC8vICsgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgZHVwCiAgICBwdXNoaW50IDgxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDgKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTctMTE4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jbGFpbWFibGVfaW50ZXJlc3QKICAgIC8vICsgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgdW5jb3ZlciAyCiAgICArCiAgICBkdXAKICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjEwMQogICAgLy8gYXNzZXJ0IHRvdGFsX2Ftb3VudCA+IFVJbnQ2NCgwKSwgZXJyLk5PX0RVRV9DQVNIRkxPVwogICAgYXNzZXJ0IC8vIE5vIGR1ZSBjYXNoZmxvdyB0byBwYXkKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLmlzX29wdGVkX2luKAogICAgZXh0cmFjdCAwIDMyCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MjUKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MjQtMjYKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5pc19vcHRlZF9pbigKICAgIC8vICAgICBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQKICAgIC8vICkKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MjQtMjcKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5pc19vcHRlZF9pbigKICAgIC8vICAgICBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQKICAgIC8vICkKICAgIC8vIGFuZCBub3Qgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkCiAgICBieiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VAMjQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNwogICAgLy8gYW5kIG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHB1c2hpbnQgMzg0CiAgICBnZXRiaXQKICAgIGJueiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VAMjQKICAgIGludGNfMSAvLyAxCgpjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfbWVyZ2VAMjU6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA2CiAgICAvLyBpZiBzZWxmLl9pc19wYXltZW50X2V4ZWN1dGFibGUoaG9sZGluZ19hZGRyZXNzKToKICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MzMKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICBzd2FwCiAgICBkaWcgMQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBvcHRlZCBpbnRvIGFzc2V0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MzMtMzQKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICAvLyA+PSBwYXltZW50X2Ftb3VudAogICAgZGlnIDUKICAgIGR1cAogICAgY292ZXIgMgogICAgPj0KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozMi0zNQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgLy8gICAgID49IHBheW1lbnRfYW1vdW50CiAgICAvLyApLCBlcnIuTk9UX0VOT1VHSF9GVU5EUwogICAgYXNzZXJ0IC8vIE5vdCBlbm91Z2ggZnVuZHMgZm9yIHRoZSBwYXltZW50CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA4CiAgICAvLyBzZWxmLl9wYXkoc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLCB0b3RhbF9hbW91bnQpCiAgICBkaWcgMgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZHVwCiAgICBleHRyYWN0IDAgMzIKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozOS00NAogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXJlY2VpdmVyLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1hbW91bnQsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0MwogICAgLy8gZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIGdsb2JhbCBNaW5UeG5GZWUKICAgIHVuY292ZXIgMwogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgc3dhcAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MzkKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozOS00NAogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXJlY2VpdmVyLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1hbW91bnQsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTI1LTEyNgogICAgLy8gIyBHZXQgdGhlIGNsYWltYWJsZSBhbW91bnRzIGJlZm9yZSByZXNldAogICAgLy8gaW50ZXJlc3RfYW1vdW50ID0gcG9zaXRpb24uY2xhaW1hYmxlX2ludGVyZXN0CiAgICBkdXAKICAgIHB1c2hpbnQgNzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgOQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEyNwogICAgLy8gcHJpbmNpcGFsX2Ftb3VudCA9IHBvc2l0aW9uLmNsYWltYWJsZV9wcmluY2lwYWwKICAgIGR1cAogICAgcHVzaGludCA4MQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMwogICAgYnVyeSA5CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTI5LTEzMAogICAgLy8gIyBSZXNldCB0aGUgcG9zaXRpb24ncyBjbGFpbWFibGUgYW1vdW50cwogICAgLy8gcG9zaXRpb24uY2xhaW1hYmxlX2ludGVyZXN0ID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgaXRvYgogICAgc3dhcAogICAgZGlnIDEKICAgIHJlcGxhY2UyIDczCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTMxCiAgICAvLyBwb3NpdGlvbi5jbGFpbWFibGVfcHJpbmNpcGFsID0gVUludDY0KDApCiAgICBzd2FwCiAgICByZXBsYWNlMiA4MQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzMgogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSBwb3NpdGlvbi5jb3B5KCkKICAgIHVuY292ZXIgMwogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzNAogICAgLy8gYXNzZXJ0IHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgPj0gaW50ZXJlc3RfYW1vdW50LCBlcnIuTk9UX0VOT1VHSF9GVU5EUwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCBleGlzdHMKICAgIGR1cAogICAgZGlnIDIKICAgID49CiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcyBmb3IgdGhlIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzUKICAgIC8vIGFzc2VydCBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCA+PSBwcmluY2lwYWxfYW1vdW50LCBlcnIuTk9UX0VOT1VHSF9GVU5EUwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIGV4aXN0cwogICAgZGlnIDMKICAgID49CiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcyBmb3IgdGhlIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzctMTM4CiAgICAvLyAjIFVwZGF0ZSB0aGUgZ2xvYmFsIHJlc2VydmVkIGludGVyZXN0IGFuZCBwcmluY2lwYWwgYW1vdW50cwogICAgLy8gc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCAtPSBpbnRlcmVzdF9hbW91bnQKICAgIHN3YXAKICAgIC0KICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTM5CiAgICAvLyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCAtPSBwcmluY2lwYWxfYW1vdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICBzd2FwCiAgICAtCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjExNAogICAgLy8gdG90YWxfYW1vdW50PWludGVyZXN0X2Ftb3VudCArIHByaW5jaXBhbF9hbW91bnQsCiAgICBkaWcgNQogICAgZHVwCiAgICBkaWcgNgogICAgZHVwCiAgICBjb3ZlciAzCiAgICArCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTE1CiAgICAvLyB0aW1lc3RhbXA9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTExLTExNwogICAgLy8gcmV0dXJuIHR5cC5DYXNoQ2xhaW1SZXN1bHQoCiAgICAvLyAgICAgaW50ZXJlc3RfYW1vdW50PWludGVyZXN0X2Ftb3VudCwKICAgIC8vICAgICBwcmluY2lwYWxfYW1vdW50PXByaW5jaXBhbF9hbW91bnQsCiAgICAvLyAgICAgdG90YWxfYW1vdW50PWludGVyZXN0X2Ftb3VudCArIHByaW5jaXBhbF9hbW91bnQsCiAgICAvLyAgICAgdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gICAgIGNvbnRleHQ9cGF5bWVudF9pbmZvLAogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZGlnIDIKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBwdXNoYnl0ZXMgMHgwMDIyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAyNDoKICAgIGludGNfMCAvLyAwCiAgICBiIGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUAyNQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX2ZhbHNlQDE1OgogICAgaW50Y18wIC8vIDAKICAgIGIgY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDE2CgoKLy8gbW9kdWxlcy50cmFuc2Zlcl9hZ2VudC5UcmFuc2ZlckFnZW50LnNldF90cmFuc2Zlcl9zY2hlZHVsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF90cmFuc2Zlcl9zY2hlZHVsZToKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToyNgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjI3CiAgICAvLyBhc3NlcnQgb3Blbl9kYXRlIDwgY2xvc3VyZV9kYXRlLCBlcnIuSU5WQUxJRF9TT1JUSU5HCiAgICBkdXAyCiAgICA8CiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbXVzdCBiZSBzb3J0ZWQgaW4gc3RyaWN0bHkgYXNjZW5kaW5nIG9yZGVyCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjI5CiAgICAvLyBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA9IG9wZW5fZGF0ZQogICAgYnl0ZWMgMjcgLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIHVuY292ZXIgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MzAKICAgIC8vIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlID0gY2xvc3VyZV9kYXRlCiAgICBieXRlYyAyOCAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MzEKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy50cmFuc2Zlcl9hZ2VudC5UcmFuc2ZlckFnZW50LnByaW1hcnlfZGlzdHJpYnV0aW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcHJpbWFyeV9kaXN0cmlidXRpb246CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjcxCiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5wcmltYXJ5X2RlYWxlciwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDIyIC8vIDB4NTIyMzUwNzI2OTZkNjE3Mjc5NDQ2NTYxNmM2NTcyMjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDMKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQ0CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDUKICAgIC8vIGFzc2VydCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBSSU1BUllfRElTVFJJQlVUSU9OX0NMT1NFRAogICAgYXNzZXJ0IC8vIFByaW1hcnkgZGlzdHJpYnV0aW9uIGlzIGNsb3NlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgY292ZXIgMwogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo0NwogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChob2xkaW5nX2FkZHJlc3MpCiAgICBzd2FwCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQ4CiAgICAvLyBhc3NlcnQgdW5pdHMgPiBVSW50NjQoMCksIGVyci5aRVJPX1VOSVRTCiAgICBkdXAKICAgIGFzc2VydCAvLyBDYW4gbm90IGRpc3RyaWJ1dGUgemVybyB1bml0cwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo1MAogICAgLy8gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCArIHVuaXRzIDw9IHNlbGYudG90YWxfdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICArCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgPD0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDktNTEKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCArIHVuaXRzIDw9IHNlbGYudG90YWxfdW5pdHMKICAgIC8vICksIGVyci5PVkVSX0RJU1RSSUJVVElPTgogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCByZW1haW5pbmcgRC1BU0EgdW5pdHMKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NTIKICAgIC8vIGlmIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI2IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlIGV4aXN0cwogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjU0CiAgICAvLyBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8PSBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI2IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlIGV4aXN0cwogICAgPD0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NTMtNTUKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPD0gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGUKICAgIC8vICksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TRUQKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBjbG9zZWQKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNDgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnJlc2VydmVkX3VuaXRzICs9IHVuaXRzCiAgICBkdXBuIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDMKICAgIGR1cAogICAgY292ZXIgMwogICAgKwogICAgaXRvYgogICAgcHVzaGludCA0MAogICAgc3dhcAogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NTgKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgKz0gdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICArCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NTkKICAgIC8vIHJldHVybiBzZWxmLnRvdGFsX3VuaXRzIC0gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIHN3YXAKICAgIC0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMudHJhbnNmZXJfYWdlbnQuVHJhbnNmZXJBZ2VudC50cmFuc2Zlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnRyYW5zZmVyOgogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo2MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NzUKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojc2CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTMKICAgIC8vIGlmIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI3IC8vICJ0cmFuc2Zlcl9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlIGV4aXN0cwogICAgYnogdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE1CiAgICAvLyBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI3IC8vICJ0cmFuc2Zlcl9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlIGV4aXN0cwogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPD0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTQtMTYKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICksIGVyci5DTE9TRURfVFJBTlNGRVIKICAgIGFzc2VydCAvLyBUcmFuc2ZlciBpcyBjbG9zZWQKCnRyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTcKICAgIC8vIGlmIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI4IC8vICJ0cmFuc2Zlcl9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgYnogdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE5CiAgICAvLyBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8IHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjggLy8gInRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICA8CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE4LTIwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDwgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGUKICAgIC8vICksIGVyci5DTE9TRURfVFJBTlNGRVIKICAgIGFzc2VydCAvLyBUcmFuc2ZlciBpcyBjbG9zZWQKCnRyYW5zZmVyX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODAKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIGRpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgOAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIGRpZyA1CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDkKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODMKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQoc2VuZGVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojg0CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGR1cAogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4NQogICAgLy8gYXNzZXJ0IHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MgIT0gcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzLCBlcnIuU0VMRl9UUkFOU0ZFUgogICAgdW5jb3ZlciAyCiAgICAhPQogICAgYXNzZXJ0IC8vIFNlbmRlciBhbmQgcmVjZWl2ZXIgbXVzdCBiZSBkaWZmZXJlbnQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODYKICAgIC8vIGFzc2VydCB1bml0cyA+IFVJbnQ2NCgwKSwgZXJyLk5VTExfVFJBTlNGRVIKICAgIGRpZyAxCiAgICBkdXAKICAgIGFzc2VydCAvLyBUcmFuc2ZlciB1bml0cyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojg3CiAgICAvLyBhc3NlcnQgdW5pdHMgPD0gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLCBlcnIuT1ZFUl9UUkFOU0ZFUgogICAgc3dhcAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIDw9CiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IHNlbmRlciB1bml0cyB0byB0cmFuc2ZlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzU2CiAgICAvLyBpZiBzZWxmLmV2ZW50X2N1cnNvciA+PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICA+PQogICAgYm56IHRyYW5zZmVyX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Fzc2VydF9ub19kdWVfZXZlbnRfcGVuZGluZ0AxMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzU4CiAgICAvLyBuZXh0X2VudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KHNlbGYuZXZlbnRfY3Vyc29yKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc2MAogICAgLy8gbmV4dF9lbnRyeS5zY2hlZHVsZWRfdGltZSA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NTktNzYxCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIG5leHRfZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gKSwgZXJyLlBFTkRJTkdfQUNUVVNfRVZFTlQKICAgIGFzc2VydCAvLyBBQ1RVUyBldmVudCBub3QgeWV0IGV4ZWN1dGVkCgp0cmFuc2Zlcl9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9hc3NlcnRfbm9fZHVlX2V2ZW50X3BlbmRpbmdAMTA6CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjkwCiAgICAvLyBzZWxmLl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBkaWcgMwogICAgZHVwCiAgICBjYWxsc3ViIF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjkxCiAgICAvLyBzZWxmLl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGRpZyAzCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGNhbGxzdWIgX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6OTIKICAgIC8vIHNlbGYuX3NldHRsZV9wb3NpdGlvbihzZW5kZXJfaG9sZGluZ19hZGRyZXNzKQogICAgY2FsbHN1YiBfc2V0dGxlX3Bvc2l0aW9uCiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6OTMKICAgIC8vIHNlbGYuX3NldHRsZV9wb3NpdGlvbihyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBjYWxsc3ViIF9zZXR0bGVfcG9zaXRpb24KICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE1MgogICAgLy8gYXNzZXJ0IHVuaXRzIDw9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLCBlcnIuT1ZFUl9UUkFOU0ZFUgogICAgZGlnIDUKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGRpZyAxCiAgICA8PQogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCBzZW5kZXIgdW5pdHMgdG8gdHJhbnNmZXIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNTMKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzIC09IHVuaXRzCiAgICBkaWcgMQogICAgLQogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBpbnRjXzMgLy8gMzIKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNDQKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzICs9IHVuaXRzCiAgICBkaWcgNQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgdW5jb3ZlciAyCiAgICArCiAgICBpdG9iCiAgICBpbnRjXzMgLy8gMzIKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgZGlnIDIKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF9nb3Zfc3VzcGVuc2lvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfZ292X3N1c3BlbnNpb246CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTY1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo3NwogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYXV0aG9yaXR5LCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjEgLy8gMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTg1CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGR1cAogICAgcHVzaGludCA0OAogICAgaW50Y18xIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIHB1c2hpbnQgNDgKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTg2CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfb3Blbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfb3BlbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2OAogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjMgLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQ0ZDYxNmU2MTY3NjU3MjIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzkKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0VOREVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDIwMAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTAKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX2VuZGVkKCksIGVyci5VTkFVVEhPUklaRUQKICAgICEKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxMQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTIKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjEzCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzQKICAgIC8vIHVuaXRzPVVJbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzItNDIKICAgIC8vIHJldHVybiB0eXAuQWNjb3VudFBvc2l0aW9uKAogICAgLy8gICAgIHBheW1lbnRfYWRkcmVzcz1wYXltZW50X2FkZHJlc3MsCiAgICAvLyAgICAgdW5pdHM9VUludDY0KDApLAogICAgLy8gICAgIHJlc2VydmVkX3VuaXRzPVVJbnQ2NCgwKSwKICAgIC8vICAgICBzdXNwZW5kZWQ9RmFsc2UsCiAgICAvLyAgICAgc2V0dGxlZF9jdXJzb3I9VUludDY0KDApLAogICAgLy8gICAgIGludGVyZXN0X2NoZWNrcG9pbnQ9VUludDY0KDApLAogICAgLy8gICAgIHByaW5jaXBhbF9jaGVja3BvaW50PVVJbnQ2NCgwKSwKICAgIC8vICAgICBjbGFpbWFibGVfaW50ZXJlc3Q9VUludDY0KDApLAogICAgLy8gICAgIGNsYWltYWJsZV9wcmluY2lwYWw9VUludDY0KDApLAogICAgLy8gKQogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBieXRlYyA0MCAvLyAweDAwCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxNAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSBzZWxmLl9uZXdfYWNjb3VudF9wb3NpdGlvbihwYXltZW50X2FkZHJlc3MpCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjE1CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzczoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMzgKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcywgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgdW5jb3ZlciAzCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjM5CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0MAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDEKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcyA9IHBheW1lbnRfYWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDIKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF9nZXRfcG9zaXRpb25bcm91dGluZ10oKSAtPiB2b2lkOgphY2NvdW50X2dldF9wb3NpdGlvbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNTkKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9jcmVhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9jcmVhdGU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5ODAKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSBhcnJhbmdlcgogICAgYnl0ZWMgMTggLy8gMHg1MjIzNDE3MjcyNjE2ZTY3NjU3MjIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTgxCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfY29uZmlnW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfY29uZmlnOgogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGxlbgogICAgcHVzaGludCAxMDcKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuTm9ybWFsaXplZEFjdHVzVGVybXMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDcyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLkluaXRpYWxLZXJuZWxTdGF0ZQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIGxlbgogICAgZGlnIDEKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgdHVwbGUgZW5jb2RpbmcKICAgIGR1cAogICAgcHVzaGludCAzNAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHRhaWwgcG9pbnRlciBhdCBpbmRleCAxIG9mICh1aW50OFszMl0sKGxlbit1dGY4W10pKQogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBjb3ZlciAzCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAzNgogICAgKwogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5Qcm9zcGVjdHVzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDEyCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMTQtMTAxNQogICAgLy8gIyBDb25maWd1cmUgQ29udHJhY3QKICAgIC8vIHNlbGYuY29udHJhY3RfdHlwZSA9IHRlcm1zLmNvbnRyYWN0X3R5cGUuYXNfdWludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ5dGVjIDEyIC8vICJjb250cmFjdF90eXBlIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICBieiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIwCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfQU5OKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjEKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgcHVzaGludCAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjIKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjMKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgcHVzaGludCA0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjQKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYnogY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAOAoKY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUA3OgogICAgaW50Y18xIC8vIDEKCmNvbnRyYWN0X2NvbmZpZ19ib29sX21lcmdlQDk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjkKICAgIC8vIGFzc2VydCBzZWxmLl9pc19zdXBwb3J0ZWRfY29udHJhY3RfdHlwZShjb250cmFjdF90eXBlKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDE3CiAgICAvLyBzZWxmLl9zdG9yZV9jb250cmFjdF9jb25maWcoc2VsZi5jb250cmFjdF90eXBlLCB0ZXJtcywgaW5pdGlhbF9zdGF0ZSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBidXJ5IDIKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMjUKICAgIC8vIGFzc2VydCB0ZXJtcy5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBkaWcgNAogICAgZHVwCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDgKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMyNwogICAgLy8gdGVybXMuZGF5X2NvdW50X2NvbnZlbnRpb24uYXNfdWludDY0KCkKICAgIHB1c2hpbnQgNTcKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyOTctMzAzCiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgIGJ6IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGRpZyA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyOTkKICAgIC8vIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGRpZyA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDAKICAgIC8vIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICBwdXNoaW50IDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI5Ny0zMDMKICAgIC8vIHJldHVybiBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzYwKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwSVNEQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjApLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDE2CiAgICBkaWcgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzAxCiAgICAvLyBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyOTctMzAzCiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgID09CiAgICBibnogY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUAxNgogICAgZGlnIDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMwMgogICAgLy8gVUludDY0KGVudW1zLkRDQ18zMEUzNjApLAogICAgcHVzaGludCA0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyOTctMzAzCiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgID09CiAgICBieiBjb250cmFjdF9jb25maWdfYm9vbF9mYWxzZUAxNwoKY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUAxNjoKICAgIGludGNfMSAvLyAxCgpjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUAxODoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMwOS0zMTEKICAgIC8vIGFzc2VydCBzZWxmLl9pc19zdXBwb3J0ZWRfZGF5X2NvdW50X2NvbnZlbnRpb24oCiAgICAvLyAgICAgZGF5X2NvdW50X2NvbnZlbnRpb24KICAgIC8vICksIGVyci5JTlZBTElEX0RBWV9DT1VOVF9DT05WRU5USU9OCiAgICBhc3NlcnQgLy8gSW52YWxpZCBkYXktY291bnQgY29udmVudGlvbiBJRAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzI5CiAgICAvLyBpZiBjb250cmFjdF90eXBlICE9IFVJbnQ2NChlbnVtcy5DVF9BTk4pOgogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgIT0KICAgIGJ6IGNvbnRyYWN0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDIwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzAKICAgIC8vIGFzc2VydCBub3QgdGVybXMuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBkaWcgNAogICAgcHVzaGludCA3ODYKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgoKY29udHJhY3RfY29uZmlnX2FmdGVyX2lmX2Vsc2VAMjA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MDAKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MDEKICAgIC8vIGFzc2VydCBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID09IFVJbnQ2NCgwKSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBELUFTQSBhbHJlYWR5IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgwMy04MDQKICAgIC8vICMgU2V0IERlbm9taW5hdGlvbiBBc3NldAogICAgLy8gc2VsZi5fYXNzZXJ0X2Rlbm9taW5hdGlvbl9hc3NldCh0ZXJtcy5kZW5vbWluYXRpb25fYXNzZXRfaWQpCiAgICBkaWcgNAogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc2OC03NjkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gZGVub21pbmF0aW9uIHdpdGggQVNBCiAgICAvLyBfY3JlYXRvciwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfY3JlYXRvcihkZW5vbWluYXRpb25fYXNzZXRfaWQpCiAgICBkdXAKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc3MAogICAgLy8gYXNzZXJ0IGV4aXN0cywgZXJyLklOVkFMSURfREVOT01JTkFUSU9OCiAgICBhc3NlcnQgLy8gRGVub21pbmF0aW9uIGFzc2V0IGlzIG5vdCBwcm9wZXJseSBzZXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc3MwogICAgLy8gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgPSBkZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIGJ5dGVjIDQ0IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgwNy04MDgKICAgIC8vICMgU2V0IFNldHRsZW1lbnQgQXNzZXQKICAgIC8vIHNlbGYuX2Fzc2VydF9zZXR0bGVtZW50X2Fzc2V0KHRlcm1zLnNldHRsZW1lbnRfYXNzZXRfaWQpCiAgICBkaWcgMQogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Nzc4CiAgICAvLyBzZXR0bGVtZW50X2Fzc2V0X2lkID09IHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc3Ni03NzkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzZXR0bGVtZW50IGFzc2V0IGlzIHRoZSBkZW5vbWluYXRpb24gYXNzZXQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgLy8gKSwgZXJyLklOVkFMSURfU0VUVExFTUVOVF9BU1NFVAogICAgYXNzZXJ0IC8vIERpZmZlcmVudCBzZXR0bGVtZW50IGFzc2V0IG5vdCBzdXBwb3J0ZWQsIG11c3QgYmUgZXF1YWwgdG8gZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODIKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCA9IHNldHRsZW1lbnRfYXNzZXRfaWQKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODMtNzg5CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODgKICAgIC8vIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODYKICAgIC8vIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Nzg3CiAgICAvLyBhc3NldF9hbW91bnQ9MCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODMtNzg0CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc4My03ODkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gc2V0dGxlbWVudCB3aXRoIEFTQQogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PTAsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTEtODEyCiAgICAvLyAjIFVuaXRzCiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzID0gdGVybXMudG90YWxfdW5pdHMKICAgIGR1cAogICAgcHVzaGludCAxNwogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTMKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDEwIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODE1LTgxNgogICAgLy8gIyBEYXktQ291bnQgQ29udmVudGlvbnMKICAgIC8vIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPSB0ZXJtcy5kYXlfY291bnRfY29udmVudGlvbi5hc191aW50NjQoKQogICAgYnl0ZWMgNDYgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgZGlnIDgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTgtODE5CiAgICAvLyAjIFRpbWUKICAgIC8vIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlID0gdGVybXMuaW5pdGlhbF9leGNoYW5nZV9kYXRlCiAgICBkdXAKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAyNiAvLyAiaW5pdGlhbF9leGNoYW5nZV9kYXRlIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MjAKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IHRlcm1zLm1hdHVyaXR5X2RhdGUKICAgIGRpZyAxCiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNDUgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgyMQogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gaW5pdGlhbF9zdGF0ZS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBkaWcgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBwdXNoaW50IDQ4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODIzLTgyNAogICAgLy8gIyBQcmluY2lwYWwKICAgIC8vIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPSB0ZXJtcy5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudAogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgZGlnIDEwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODI1CiAgICAvLyBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSB0ZXJtcy5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBkaWcgMwogICAgcHVzaGludCA3ODYKICAgIGdldGJpdAogICAgYnl0ZWMgMzQgLy8gImR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODI2CiAgICAvLyBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9IGluaXRpYWxfc3RhdGUub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBkaWcgMQogICAgcHVzaGludCAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjXzMgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MjgtODI5CiAgICAvLyAjIEludGVyZXN0CiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgPSBpbml0aWFsX3N0YXRlLmFjY3J1ZWRfaW50ZXJlc3QKICAgIGRpZyAxCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MzEtODMyCiAgICAvLyAjIEludGVyZXN0IFJhdGUKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gaW5pdGlhbF9zdGF0ZS5ub21pbmFsX2ludGVyZXN0X3JhdGUKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODMzCiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBpbml0aWFsX3N0YXRlLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UKICAgIGRpZyAxCiAgICBwdXNoaW50IDI0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MzQKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQgPSB0ZXJtcy5yYXRlX3Jlc2V0X3NwcmVhZAogICAgZGlnIDMKICAgIHB1c2hpbnQgNTgKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzNSAvLyAicmF0ZV9yZXNldF9zcHJlYWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODM1CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciA9IHRlcm1zLnJhdGVfcmVzZXRfbXVsdGlwbGllcgogICAgZGlnIDMKICAgIHB1c2hpbnQgNjYKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzNiAvLyAicmF0ZV9yZXNldF9tdWx0aXBsaWVyIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzNgogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X2Zsb29yID0gdGVybXMucmF0ZV9yZXNldF9mbG9vcgogICAgZGlnIDMKICAgIHB1c2hpbnQgNzQKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAyOSAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MzcKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9jYXAgPSB0ZXJtcy5yYXRlX3Jlc2V0X2NhcAogICAgZGlnIDMKICAgIHB1c2hpbnQgODIKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzMCAvLyAicmF0ZV9yZXNldF9jYXAiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODM4CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfbmV4dCA9IHRlcm1zLnJhdGVfcmVzZXRfbmV4dAogICAgZGlnIDMKICAgIHB1c2hpbnQgOTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzNyAvLyAicmF0ZV9yZXNldF9uZXh0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzOQogICAgLy8gc2VsZi5oYXNfcmF0ZV9yZXNldF9mbG9vciA9IHRlcm1zLmhhc19yYXRlX3Jlc2V0X2Zsb29yCiAgICBkaWcgMwogICAgcHVzaGludCA3ODQKICAgIGdldGJpdAogICAgYnl0ZWMgMzggLy8gImhhc19yYXRlX3Jlc2V0X2Zsb29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0MAogICAgLy8gc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgPSB0ZXJtcy5oYXNfcmF0ZV9yZXNldF9jYXAKICAgIGRpZyAzCiAgICBwdXNoaW50IDc4NQogICAgZ2V0Yml0CiAgICBieXRlYyAzOSAvLyAiaGFzX3JhdGVfcmVzZXRfY2FwIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0Mi04NDMKICAgIC8vICMgU2NhbGluZwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSA9IHRlcm1zLmZpeGVkX3BvaW50X3NjYWxlCiAgICB1bmNvdmVyIDMKICAgIHB1c2hpbnQgOTkKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDUtODQ2CiAgICAvLyAjIFNjaGVkdWxlIFByb2Nlc3NpbmcKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yID0gaW5pdGlhbF9zdGF0ZS5ldmVudF9jdXJzb3IKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDgtODQ5CiAgICAvLyAjIFBlci1Vbml0IEZpeGVkLVBvaW50IEluZGV4ZXMKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCA9IGluaXRpYWxfc3RhdGUuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleAogICAgZGlnIDEKICAgIHB1c2hpbnQgNTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NTAKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggPSBpbml0aWFsX3N0YXRlLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4CiAgICBkaWcgMQogICAgcHVzaGludCA2NAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NTItODUzCiAgICAvLyAjIFJlc2VydmVkIEFtb3VudCAoZm9yIGV4ZWN1dGVkIGNhc2hmbG93cykKICAgIC8vIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU0CiAgICAvLyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU2CiAgICAvLyBhc3NlcnQgdGVybXMuaW5pdGlhbF9leGNoYW5nZV9kYXRlID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsIGVyci5JTlZBTElEX0lFRAogICAgZGlnIDIKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgID4KICAgIGFzc2VydCAvLyBJRUQgbXVzdCBiZSBzZXQgaW4gdGhlIGZ1dHVyZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU3CiAgICAvLyBhc3NlcnQgdGVybXMuaW5pdGlhbF9leGNoYW5nZV9kYXRlID4gaW5pdGlhbF9zdGF0ZS5zdGF0dXNfZGF0ZSwgZXJyLklOVkFMSURfSUVECiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICA8CiAgICBhc3NlcnQgLy8gSUVEIG11c3QgYmUgc2V0IGluIHRoZSBmdXR1cmUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg1OAogICAgLy8gYXNzZXJ0IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA8IHRlcm1zLm1hdHVyaXR5X2RhdGUsIGVyci5JTlZBTElEX0lFRAogICAgPAogICAgYXNzZXJ0IC8vIElFRCBtdXN0IGJlIHNldCBpbiB0aGUgZnV0dXJlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDE5LTEwMjAKICAgIC8vICMgTm90YXJpemUgcHJvc3BlY3R1cyAob3B0aW9uYWwpCiAgICAvLyBzZWxmLnByb3NwZWN0dXNfaGFzaCA9IHByb3NwZWN0dXMuaGFzaC5ieXRlcwogICAgZGlnIDIKICAgIGV4dHJhY3QgMCAzMgogICAgYnl0ZWMgNDIgLy8gInByb3NwZWN0dXNfaGFzaCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDIxCiAgICAvLyBzZWxmLnByb3NwZWN0dXNfdXJsID0gcHJvc3BlY3R1cy51cmwKICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgYnl0ZWMgNDMgLy8gInByb3NwZWN0dXNfdXJsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMjIKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNvbnRyYWN0X2NvbmZpZ19ib29sX2ZhbHNlQDE3OgogICAgaW50Y18wIC8vIDAKICAgIGIgY29udHJhY3RfY29uZmlnX2Jvb2xfbWVyZ2VAMTgKCmNvbnRyYWN0X2NvbmZpZ19ib29sX2ZhbHNlQDg6CiAgICBpbnRjXzAgLy8gMAogICAgYiBjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUA5CgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3Rfc2NoZWR1bGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9zY2hlZHVsZToKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAyNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBzd2FwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgMwogICAgZHVwCiAgICBwdXNoaW50IDY1CiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIHVuY292ZXIgMgogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8c21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5FeGVjdXRpb25TY2hlZHVsZUVudHJ5PgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAzOQogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDQyCiAgICAvLyBjb250cmFjdF90eXBlPXNlbGYuY29udHJhY3RfdHlwZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBjb3ZlciAzCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODc0CiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIEQtQVNBIGFscmVhZHkgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODc1LTg3NwogICAgLy8gYXNzZXJ0IHNjaGVkdWxlX3BhZ2UubGVuZ3RoIDw9IFVJbnQ2NCgKICAgIC8vICAgICBjc3QuU0NIRURVTEVfUEFHRV9TSVpFCiAgICAvLyApLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBkdXAKICAgIHB1c2hpbnQgMTYKICAgIDw9CiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NzgKICAgIC8vIGFzc2VydCBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID4gVUludDY0KDApLCBlcnIuVEVSTVNfTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMCAvLyAiaW5pdGlhbF9leGNoYW5nZV9hbW91bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0EgdGVybXMgbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg4MAogICAgLy8gcGFnZV9jdXJzb3IgPSBzY2hlZHVsZV9wYWdlX2luZGV4ICogVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpCiAgICBzd2FwCiAgICBwdXNoaW50IDE2CiAgICAqCiAgICBzd2FwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4ODcKICAgIC8vICsgcGFnZV9sZW5ndGggKiBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19QRVJfRU5UUllfQlVER0VUKQogICAgcHVzaGludCAxMDAKICAgICoKICAgIHB1c2hpbnQgMTUxMAogICAgKwoKY29udHJhY3Rfc2NoZWR1bGVfd2hpbGVfdG9wQDI6CiAgICBkdXAKICAgIGdsb2JhbCBPcGNvZGVCdWRnZXQKICAgID4KICAgIGJ6IGNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX3doaWxlQDUKICAgIGl0eG5fYmVnaW4KICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBwdXNoaW50IDUgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICBieXRlYyA0NyAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW0KICAgIGJ5dGVjIDQ3IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBiIGNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEAyCgpjb250cmFjdF9zY2hlZHVsZV9hZnRlcl93aGlsZUA1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODkwCiAgICAvLyBpbmRleCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTAKCmNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODkxCiAgICAvLyB3aGlsZSBpbmRleCA8IHBhZ2VfbGVuZ3RoOgogICAgZGlnIDkKICAgIGRpZyA0CiAgICA8CiAgICBieiBjb250cmFjdF9zY2hlZHVsZV9hZnRlcl93aGlsZUAxNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODkyLTg5MwogICAgLy8gZW50cnkgPSBzY2hlZHVsZV9wYWdlW2luZGV4XS5jb3B5KCkKICAgIC8vIGVudHJ5X2V2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBkaWcgNAogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgYnVyeSAxMwogICAgZGlnIDEwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgNjUKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODkzCiAgICAvLyBlbnRyeV9ldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTItODkzCiAgICAvLyBlbnRyeSA9IHNjaGVkdWxlX3BhZ2VbaW5kZXhdLmNvcHkoKQogICAgLy8gZW50cnlfZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGludGNfMiAvLyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTMKICAgIC8vIGVudHJ5X2V2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBnZXRieXRlCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgMTQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg5NAogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X2lkID09IHBhZ2VfY3Vyc29yICsgaW5kZXgsIGVyci5JTlZBTElEX0VWRU5UX0lECiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEzCiAgICBkaWcgNQogICAgdW5jb3ZlciA0CiAgICArCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTUtODk3CiAgICAvLyBzZWxmLl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBlbnRyeV9ldmVudF90eXBlCiAgICAvLyApCiAgICBkaWcgNQogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODk4CiAgICAvLyBhc3NlcnQgZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgc3dhcAogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTkKICAgIC8vIGlmIGVudHJ5LmV2ZW50X2lkID4gVUludDY0KDApOgogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTAwCiAgICAvLyBpZiBpbmRleCA+IFVJbnQ2NCgwKToKICAgIGRpZyA5CiAgICBieiBjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlAMTAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkwMQogICAgLy8gcHJldmlvdXNfZW50cnkgPSBzY2hlZHVsZV9wYWdlW2luZGV4IC0gVUludDY0KDEpXS5jb3B5KCkKICAgIGRpZyA5CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgcHVzaGludCA2NQogICAgKgogICAgZGlnIDEyCiAgICBzd2FwCiAgICBwdXNoaW50IDY1CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTYKICAgIC8vIHByZXZpb3VzX2VudHJ5LnNjaGVkdWxlZF90aW1lIDw9IGVudHJ5LnNjaGVkdWxlZF90aW1lCiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgOAogICAgPD0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkxNS05MTcKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgcHJldmlvdXNfZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gZW50cnkuc2NoZWR1bGVkX3RpbWUKICAgIC8vICksIGVyci5JTlZBTElEX1NPUlRJTkcKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBtdXN0IGJlIHNvcnRlZCBpbiBzdHJpY3RseSBhc2NlbmRpbmcgb3JkZXIKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTgKICAgIC8vIGlmIGVudHJ5LmV2ZW50X2lkID09IFVJbnQ2NCgwKToKICAgIGRpZyA4CiAgICBibnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTE5LTkyMQogICAgLy8gYXNzZXJ0IGVudHJ5X2V2ZW50X3R5cGUgPT0gVUludDY0KAogICAgLy8gICAgIGVudW1zLkVWVF9JRUQKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZGlnIDEwCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjIKICAgIC8vIGluZGV4ICs9IFVJbnQ2NCgxKQogICAgZGlnIDkKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEwCiAgICBiIGNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEA2Cgpjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlAMTA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDMtOTA1CiAgICAvLyAjIFRoZSBmaXJzdCBlbnRyeSBvZiBhIHBhZ2UgbXVzdCBzdGlsbCBiZSBvcmRlcmVkIGFmdGVyIHRoZQogICAgLy8gIyBsYXN0IGVudHJ5IG9mIHRoZSBwcmV2aW91cyBwYWdlLgogICAgLy8gYXNzZXJ0IHNjaGVkdWxlX3BhZ2VfaW5kZXggPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0VWRU5UX0lECiAgICBkaWcgNgogICAgZHVwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBpZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTA2CiAgICAvLyBwcmV2aW91c19wYWdlX2luZGV4ID0gc2NoZWR1bGVfcGFnZV9pbmRleCAtIFVJbnQ2NCgxKQogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkwOAogICAgLy8gcHJldmlvdXNfcGFnZV9pbmRleCBpbiBzZWxmLnNjaGVkdWxlX3BhZ2UKICAgIGl0b2IKICAgIGJ5dGVjIDMxIC8vIDB4NTMyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTA3LTkwOQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBwcmV2aW91c19wYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZQogICAgLy8gKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTEwLTkxMQogICAgLy8gcHJldmlvdXNfcGFnZSA9IHNlbGYuc2NoZWR1bGVfcGFnZVtwcmV2aW91c19wYWdlX2luZGV4XS5jb3B5KCkKICAgIC8vIGFzc2VydCBwcmV2aW91c19wYWdlLmxlbmd0aCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGludCAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTExCiAgICAvLyBhc3NlcnQgcHJldmlvdXNfcGFnZS5sZW5ndGggPiBVSW50NjQoMCksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGR1cAogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTEzCiAgICAvLyBwcmV2aW91c19wYWdlLmxlbmd0aCAtIFVJbnQ2NCgxKQogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkxMi05MTQKICAgIC8vIHByZXZpb3VzX2VudHJ5ID0gcHJldmlvdXNfcGFnZVsKICAgIC8vICAgICBwcmV2aW91c19wYWdlLmxlbmd0aCAtIFVJbnQ2NCgxKQogICAgLy8gXS5jb3B5KCkKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgMgogICAgKwogICAgcHVzaGludCA2NQogICAgYm94X2V4dHJhY3QKICAgIGIgY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxMQoKY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfd2hpbGVAMTU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMDAKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHNjaGVkdWxlX3BhZ2UuY29weSgpCiAgICBkaWcgNgogICAgaXRvYgogICAgYnl0ZWMgMzEgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBkaWcgNQogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTI1CiAgICAvLyBpZiBpc19sYXN0X3BhZ2U6CiAgICBkaWcgNQogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxNwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTI3CiAgICAvLyBzY2hlZHVsZV9wYWdlX2luZGV4ICogVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpICsgcGFnZV9sZW5ndGgKICAgIGRpZyAxCiAgICBkaWcgNAogICAgKwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTI2CiAgICAvLyBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50ID0gKAogICAgYnl0ZWMgNCAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjYtOTI4CiAgICAvLyBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50ID0gKAogICAgLy8gICAgIHNjaGVkdWxlX3BhZ2VfaW5kZXggKiBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkgKyBwYWdlX2xlbmd0aAogICAgLy8gKQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkyOQogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgcHVzaGludCA1MAogICAgYXBwX2dsb2JhbF9wdXQKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDQ3CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmV4ZWN1dGVfaWVkW3JvdXRpbmddKCkgLT4gdm9pZDoKZXhlY3V0ZV9pZWQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA1NwogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDU4CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA1OQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNjEKICAgIC8vIGFzc2VydCBzZWxmLmV2ZW50X2N1cnNvciA8IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICBkaWcgMQogICAgPgogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgY3Vyc29yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDYyCiAgICAvLyBlbnRyeSA9IHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLmV2ZW50X2N1cnNvcikKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2MwogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X3R5cGUgPT0gYXJjNC5VSW50OChlbnVtcy5FVlRfSUVEKSwgZXJyLklOVkFMSURfRVZFTlRfVFlQRQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgZHVwCiAgICBwdXNoYnl0ZXMgMHgwMQogICAgYj09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCB0eXBlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDY3CiAgICAvLyBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIGRpZyAxCiAgICBleHRyYWN0IDAgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2OQogICAgLy8gc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICBkaWcgMgogICAgZXh0cmFjdCA5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNzAKICAgIC8vIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgZGlnIDMKICAgIGV4dHJhY3QgMTcgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3MQogICAgLy8gcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZGlnIDQKICAgIGV4dHJhY3QgMjUgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3MwogICAgLy8gbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9ZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBkaWcgNQogICAgZXh0cmFjdCAzMyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc0CiAgICAvLyBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICBkaWcgNgogICAgZXh0cmFjdCA0MSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc1CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1lbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIGRpZyA3CiAgICBleHRyYWN0IDQ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNzYKICAgIC8vIGZsYWdzPWVudHJ5LmZsYWdzLAogICAgZGlnIDgKICAgIGV4dHJhY3QgNTcgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2Ni0xMDc3CiAgICAvLyB0eXAuT2JzZXJ2ZWRFdmVudFJlcXVlc3QoCiAgICAvLyAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBvYnNlcnZlZF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1lbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9ZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9ZW50cnkuZmxhZ3MsCiAgICAvLyApLAogICAgdW5jb3ZlciA3CiAgICB1bmNvdmVyIDgKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3MgogICAgLy8gb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2Ni0xMDc3CiAgICAvLyB0eXAuT2JzZXJ2ZWRFdmVudFJlcXVlc3QoCiAgICAvLyAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBvYnNlcnZlZF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1lbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9ZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9ZW50cnkuZmxhZ3MsCiAgICAvLyApLAogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNjQtMTA3OAogICAgLy8gc2VsZi5fYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkoCiAgICAvLyAgICAgZW50cnksCiAgICAvLyAgICAgdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0KAogICAgLy8gICAgICAgICBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIC8vICAgICAgICAgZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgLy8gICAgICAgICBzY2hlZHVsZWRfdGltZT1lbnRyeS5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICAgICAgYWNjcnVhbF9mYWN0b3I9ZW50cnkuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICAgICAgb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPWVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPWVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgICAgICBmbGFncz1lbnRyeS5mbGFncywKICAgIC8vICAgICApLAogICAgLy8gKQogICAgY2FsbHN1YiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkKICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3OQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDQ5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5hcHBseV9ub25fY2FzaF9ldmVudFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFwcGx5X25vbl9jYXNoX2V2ZW50OgogICAgaW50Y18wIC8vIDAKICAgIGR1cG4gNAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwODEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwbiAyCiAgICBsZW4KICAgIHB1c2hpbnQgNzMKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuT2JzZXJ2ZWRFdmVudFJlcXVlc3QKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDk1CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA5NgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwOTgKICAgIC8vIGlmIHBheWxvYWQuZmxhZ3MgJiBVSW50NjQoZW51bXMuRkxBR19PQlNFUlZFRF9FVkVOVCk6CiAgICBwdXNoaW50IDY1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBwdXNoaW50IDQKICAgICYKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjMzCiAgICAvLyByZXR1cm4gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9DTE0pCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIHB1c2hpbnQgNQogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwOTkKICAgIC8vIGFzc2VydCBzZWxmLl9zdXBwb3J0c19vYnNlcnZlZF9ldmVudHMoKSwgZXJyLk9CU0VSVkVEX0VWRU5UX1JFUVVJUkVECiAgICBhc3NlcnQgLy8gT2JzZXJ2ZWQgZXZlbnQgcmVxdWlyZWQgdG8gZXhlY3V0ZSB0aGlzIGFjdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEwMAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMzMKICAgIC8vIHJldHVybiBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0NMTSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgZHVwCiAgICBwdXNoaW50IDUKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MzgKICAgIC8vIGFzc2VydCBzZWxmLl9zdXBwb3J0c19vYnNlcnZlZF9ldmVudHMoKSwgZXJyLk9CU0VSVkVEX0VWRU5UX1JFUVVJUkVECiAgICBhc3NlcnQgLy8gT2JzZXJ2ZWQgZXZlbnQgcmVxdWlyZWQgdG8gZXhlY3V0ZSB0aGlzIGFjdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTM5CiAgICAvLyBhc3NlcnQgcGF5bG9hZC5ldmVudF9pZCA9PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LCBlcnIuSU5WQUxJRF9FVkVOVF9JRAogICAgZGlnIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgNwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NDEKICAgIC8vIHNlbGYuY29udHJhY3RfdHlwZSwgcGF5bG9hZC5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBkdXAKICAgIGV4dHJhY3QgOCAxCiAgICBidXJ5IDEyCiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQwLTk0MgogICAgLy8gc2VsZi5fYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgc2VsZi5jb250cmFjdF90eXBlLCBwYXlsb2FkLmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIC8vICkKICAgIGNhbGxzdWIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NDQKICAgIC8vIHBhZ2VfaW5kZXggPSBzZWxmLl9zY2hlZHVsZV9wYWdlX2luZGV4KHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxOTAKICAgIC8vIHJldHVybiBldmVudF9pZCAvLyBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkKICAgIHB1c2hpbnQgMTYKICAgIC8KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk0NQogICAgLy8gcGFnZSA9IHR5cC5FeGVjdXRpb25TY2hlZHVsZVBhZ2UoKQogICAgcHVzaGJ5dGVzIDB4MDAwMAogICAgYnVyeSA3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NDYKICAgIC8vIGlmIHBhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlOgogICAgaXRvYgogICAgYnl0ZWMgMzEgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA5CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMjcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk0NwogICAgLy8gcGFnZSA9IHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XS5jb3B5KCkKICAgIGRpZyA3CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidXJ5IDcKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX3BhZ2UgZW50cnkgZXhpc3RzCgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDI3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQ4CiAgICAvLyBhc3NlcnQgcGFnZS5sZW5ndGggPCBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGRpZyA1CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgMTYKICAgIDwKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1MwogICAgLy8gc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIGRpZyAzCiAgICBkdXAKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTQKICAgIC8vIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICBkaWcgMQogICAgZXh0cmFjdCAxNyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTUKICAgIC8vIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZGlnIDIKICAgIGV4dHJhY3QgMjUgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTU2CiAgICAvLyBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDMKICAgIGV4dHJhY3QgNDEgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTU3CiAgICAvLyBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIGRpZyA0CiAgICBleHRyYWN0IDQ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1OAogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIHVuY292ZXIgNQogICAgZXh0cmFjdCA1NyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTAtOTYwCiAgICAvLyB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1wYXlsb2FkLmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9cGF5bG9hZC5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPXBheWxvYWQucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXBheWxvYWQubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICkKICAgIGRpZyAxMQogICAgaXRvYgogICAgZGlnIDE4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMwogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NDktOTYxCiAgICAvLyBwYWdlLmFwcGVuZCgKICAgIC8vICAgICB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9cGF5bG9hZC5ldmVudF9pZCwKICAgIC8vICAgICAgICAgZXZlbnRfdHlwZT1wYXlsb2FkLmV2ZW50X3R5cGUsCiAgICAvLyAgICAgICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIC8vICAgICAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICAgICApCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjIKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHBhZ2UuY29weSgpCiAgICBkaWcgOAogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2MwogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTAzCiAgICAvLyBhc3NlcnQgZXZlbnRfaWQgPT0gc2VsZi5ldmVudF9jdXJzb3IsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBjdXJzb3IKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMDQKICAgIC8vIGVudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KGV2ZW50X2lkKQogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEwNgogICAgLy8gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgYnVyeSAxMAogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjQKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY1CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzYzLTM3MAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9SUiksCiAgICBwdXNoaW50IDEyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY3CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICBwdXNoaW50IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY4CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgcHVzaGludCAxOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzYzLTM3MAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBieiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX2ZhbHNlQDE2CgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX3RydWVAMTU6CiAgICBpbnRjXzEgLy8gMQoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9tZXJnZUAxNzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMDUtMTEwNwogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2lzX25vbl9jYXNoKAogICAgLy8gICAgIGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIC8vICksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IHR5cGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMDgKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlICE9IGFyYzQuVUludDgoZW51bXMuRVZUX0lFRCksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGRpZyA4CiAgICBwdXNoYnl0ZXMgMHgwMQogICAgYiE9CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCB0eXBlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNzQKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluIChVSW50NjQoZW51bXMuRVZUX1JSKSwgVUludDY0KGVudW1zLkVWVF9SUkYpKQogICAgZGlnIDQKICAgIHB1c2hpbnQgMTIKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDIxCiAgICBkaWcgNAogICAgcHVzaGludCAxMQogICAgPT0KICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfZmFsc2VAMjIKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAyMToKICAgIGludGNfMSAvLyAxCgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX21lcmdlQDIzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEwOQogICAgLy8gaWYgc2VsZi5fZXZlbnRfaXNfcmF0ZV9yZXNldChlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpKToKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Vsc2VfYm9keUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODAKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLm9ic2VydmVyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjQgLy8gMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTEzCiAgICAvLyBzZWxmLl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeShlbnRyeSwgcGF5bG9hZCkKICAgIGRpZyA2CiAgICBkaWcgMgogICAgY2FsbHN1YiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkKICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTExNAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDgxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Vsc2VfYm9keUA1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTExMgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICBiIGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VANgoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9mYWxzZUAyMjoKICAgIGludGNfMCAvLyAwCiAgICBiIGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfbWVyZ2VAMjMKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfZmFsc2VAMTY6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX21lcmdlQDE3CgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuZ2V0X2NvbnRyYWN0X3N0YXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2NvbnRyYWN0X3N0YXRlOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBkdXAKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEyMQogICAgLy8gY29udHJhY3RfdHlwZT1hcmM0LlVJbnQ4KHNlbGYuY29udHJhY3RfdHlwZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzIgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMjMKICAgIC8vIHRvdGFsX3VuaXRzPXNlbGYudG90YWxfdW5pdHMsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEyNAogICAgLy8gcmVzZXJ2ZWRfdW5pdHNfdG90YWw9c2VsZi5yZXNlcnZlZF91bml0c190b3RhbCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTI1CiAgICAvLyBpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudD1zZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMjYKICAgIC8vIGV2ZW50X2N1cnNvcj1zZWxmLmV2ZW50X2N1cnNvciwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEyNwogICAgLy8gc2NoZWR1bGVfZW50cnlfY291bnQ9c2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMjgKICAgIC8vIG91dHN0YW5kaW5nX3ByaW5jaXBhbD1zZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEyOQogICAgLy8gaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZT1zZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEzMAogICAgLy8gbm9taW5hbF9pbnRlcmVzdF9yYXRlPXNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTMxCiAgICAvLyBhY2NydWVkX2ludGVyZXN0PXNlbGYuYWNjcnVlZF9pbnRlcmVzdCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTMyCiAgICAvLyBjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4PXNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEzMwogICAgLy8gY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXg9c2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTM0CiAgICAvLyByZXNlcnZlZF9pbnRlcmVzdD1zZWxmLnJlc2VydmVkX2ludGVyZXN0LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMzUKICAgIC8vIHJlc2VydmVkX3ByaW5jaXBhbD1zZWxmLnJlc2VydmVkX3ByaW5jaXBhbCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMjAtMTEzNgogICAgLy8gcmV0dXJuIHR5cC5LZXJuZWxTdGF0ZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlPWFyYzQuVUludDgoc2VsZi5jb250cmFjdF90eXBlKSwKICAgIC8vICAgICBzdGF0dXM9c2VsZi5zdGF0dXMsCiAgICAvLyAgICAgdG90YWxfdW5pdHM9c2VsZi50b3RhbF91bml0cywKICAgIC8vICAgICByZXNlcnZlZF91bml0c190b3RhbD1zZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsLAogICAgLy8gICAgIGluaXRpYWxfZXhjaGFuZ2VfYW1vdW50PXNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQsCiAgICAvLyAgICAgZXZlbnRfY3Vyc29yPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgLy8gICAgIHNjaGVkdWxlX2VudHJ5X2NvdW50PXNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQsCiAgICAvLyAgICAgb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2U9c2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlLAogICAgLy8gICAgIG5vbWluYWxfaW50ZXJlc3RfcmF0ZT1zZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBhY2NydWVkX2ludGVyZXN0PXNlbGYuYWNjcnVlZF9pbnRlcmVzdCwKICAgIC8vICAgICBjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4PXNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCwKICAgIC8vICAgICBjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleD1zZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4LAogICAgLy8gICAgIHJlc2VydmVkX2ludGVyZXN0PXNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QsCiAgICAvLyAgICAgcmVzZXJ2ZWRfcHJpbmNpcGFsPXNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsLAogICAgLy8gKQogICAgdW5jb3ZlciAxNAogICAgaXRvYgogICAgdW5jb3ZlciAxNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDEzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDEwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgOQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDgKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTE2CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5nZXRfbmV4dF9kdWVfZXZlbnRbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfbmV4dF9kdWVfZXZlbnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE0MgogICAgLy8gaWYgc2VsZi5ldmVudF9jdXJzb3IgPj0gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgPj0KICAgIGJ6IGdldF9uZXh0X2R1ZV9ldmVudF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDQKICAgIC8vIGV2ZW50X2lkPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTQzLTExNTMKICAgIC8vIHJldHVybiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1zZWxmLmV2ZW50X2N1cnNvciwKICAgIC8vICAgICBldmVudF90eXBlPWFyYzQuVUludDgoMCksCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9VUludDY0KDApLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9VUludDY0KDApLAogICAgLy8gICAgIGZsYWdzPVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGl0b2IKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDUKICAgIC8vIGV2ZW50X3R5cGU9YXJjNC5VSW50OCgwKSwKICAgIGJ5dGVjIDQwIC8vIDB4MDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDMtMTE1MwogICAgLy8gcmV0dXJuIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgIGV2ZW50X2lkPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgLy8gICAgIGV2ZW50X3R5cGU9YXJjNC5VSW50OCgwKSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1VSW50NjQoMCksCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1VSW50NjQoMCksCiAgICAvLyAgICAgZmxhZ3M9VUludDY0KDApLAogICAgLy8gKQogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTQ2CiAgICAvLyBzY2hlZHVsZWRfdGltZT1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE0My0xMTUzCiAgICAvLyByZXR1cm4gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkoCiAgICAvLyAgICAgZXZlbnRfaWQ9c2VsZi5ldmVudF9jdXJzb3IsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1hcmM0LlVJbnQ4KDApLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPVVJbnQ2NCgwKSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249VUludDY0KDApLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPVVJbnQ2NCgwKSwKICAgIC8vICAgICBmbGFncz1VSW50NjQoMCksCiAgICAvLyApCiAgICBpdG9iCiAgICBzd2FwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKCmdldF9uZXh0X2R1ZV9ldmVudF9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmdldF9uZXh0X2R1ZV9ldmVudEA0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEzOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpnZXRfbmV4dF9kdWVfZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1NAogICAgLy8gcmV0dXJuIHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLmV2ZW50X2N1cnNvcikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgZ2V0X25leHRfZHVlX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuZ2V0X25leHRfZHVlX2V2ZW50QDQKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5jb250cmFjdF91cGRhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF91cGRhdGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTUzLTE1NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGdyYW50cyB0aGUgdXBkYXRlIHBlcm1pc3Npb25zIHRvIHRoZSBBcnJhbmdlci4KICAgIC8vICMg4pqg77iPIFdBUk5JTkc6IEFwcGxpY2F0aW9uIHVwZGF0ZXMgbXVzdCBiZSBleGVjdXRlZCBWRVJZIGNhcmVmdWxseSwgYXMgdGhleQogICAgLy8gIyBtaWdodCBpbnRyb2R1Y2UgYnJlYWtpbmcgY2hhbmdlcy4KICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfcm90YXRlX2FycmFuZ2VyW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19yb3RhdGVfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2OQogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTcwCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gbmV3X2FycmFuZ2VyCiAgICBieXRlYyAxOCAvLyAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTcxCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfc2V0X29wX2RhZW1vbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfc2V0X29wX2RhZW1vbjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTg0CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODUKICAgIC8vIHNlbGYub3BfZGFlbW9uLnZhbHVlID0gYWRkcmVzcwogICAgYnl0ZWMgMjUgLy8gMHg1MjIzNGY3MDQ0NjE2NTZkNmY2ZTIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4NgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTczCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2Fzc2lnbl9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19hc3NpZ25fcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDE2CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLlJvbGVWYWxpZGl0eQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjExCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMgogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgcHVzaGludCAyMAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTAzCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gcm9sZV9hZGRyZXNzCiAgICBieXRlYyAxOCAvLyAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMKICAgIGRpZyAzCiAgICBhcHBfZ2xvYmFsX3B1dAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTQKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDYKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIGR1cAogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnRfbWFuYWdlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMyAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwOAogICAgLy8gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMiAvLyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTIKICAgIC8vIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIGR1cAogICAgcHVzaGludCA2MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE1CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMzIgLy8gMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE2CiAgICAvLyBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExOAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMSAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIwCiAgICAvLyBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMwogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgODAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIzCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI0IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI0CiAgICAvLyBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3Jldm9rZV9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19yZXZva2Vfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzUKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzNgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzcKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCkpCiAgICBidG9pCiAgICBkdXBuIDIKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCAhPSBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksIGVyci5JTlZBTElEX1JPTEUKICAgIGR1cAogICAgcHVzaGludCAyMAogICAgIT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyOAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIzIC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0NGQ2MTZlNjE2NzY1NzIyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMwCiAgICAvLyBkZWwgc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzOQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjE2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIyIC8vIDB4NTIyMzUwNzI2OTZkNjE3Mjc5NDQ2NTYxNmM2NTcyMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNAogICAgLy8gZGVsIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjM4CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIGR1cAogICAgcHVzaGludCA2MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAzMiAvLyAweDUyMjM1NDcyNzU3Mzc0NjU2NTIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzgKICAgIC8vIGRlbCBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjM4CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDEKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hdXRob3JpdHksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjEgLy8gMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MgogICAgLy8gZGVsIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzOAogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDQKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDgwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI0IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ2CiAgICAvLyBkZWwgc2VsZi5vYnNlcnZlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ292X2Fzc2V0X3N1c3BlbnNpb25bcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dvdl9hc3NldF9zdXNwZW5zaW9uOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kICAjIFRPRE86IFVwZGF0ZSBzcGVjcyBhbmQgYWRkIHRlc3QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzcKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDIxIC8vIDB4NTIyMzQxNzU3NDY4NmY3MjY5NzQ3OTIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU3CiAgICAvLyBzZWxmLmFzc2V0X3N1c3BlbmRlZCA9IHN1c3BlbmRlZAogICAgYnl0ZWMgMzMgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU4CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCAgIyBUT0RPOiBVcGRhdGUgc3BlY3MgYW5kIGFkZCB0ZXN0CiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYXJyYW5nZXJbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNjgKICAgIC8vIHJldHVybiBzZWxmLmFycmFuZ2VyLnZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTggLy8gMHg1MjIzNDE3MjcyNjE2ZTY3NjU3MjIzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJyYW5nZXIgZXhpc3RzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjYwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9hZGRyZXNzX3JvbGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfYWRkcmVzc19yb2xlczoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg0CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmFjY291bnRfbWFuYWdlciwgYWRkcmVzcyksCiAgICBieXRlYyAyMyAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMKICAgIGRpZyAxCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4NQogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5wcmltYXJ5X2RlYWxlciwgYWRkcmVzcyksCiAgICBieXRlYyAyMiAvLyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzCiAgICBkaWcgMgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODYKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYudHJ1c3RlZSwgYWRkcmVzcyksCiAgICBieXRlYyAzMiAvLyAweDUyMjM1NDcyNzU3Mzc0NjU2NTIzCiAgICBkaWcgMwogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODcKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYXV0aG9yaXR5LCBhZGRyZXNzKSwKICAgIGJ5dGVjIDIxIC8vIDB4NTIyMzQxNzU3NDY4NmY3MjY5NzQ3OTIzCiAgICBkaWcgNAogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODgKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYub2JzZXJ2ZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjQgLy8gMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzCiAgICB1bmNvdmVyIDUKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjcwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjIDQwIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDYKICAgIHNldGJpdAogICAgaW50Y18xIC8vIDEKICAgIHVuY292ZXIgNQogICAgc2V0Yml0CiAgICBwdXNoaW50IDIKICAgIHVuY292ZXIgNAogICAgc2V0Yml0CiAgICBwdXNoaW50IDMKICAgIHVuY292ZXIgMwogICAgc2V0Yml0CiAgICBwdXNoaW50IDQKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA1CiAgICAvLyByb2xlID0gcm9sZV9pZC5hc191aW50NjQoKQogICAgYnRvaQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwNgogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZSkKICAgIGR1cAogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDgKICAgIC8vIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgcHVzaGludHMgMjAgNDAgNTAgNjAgNzAgODAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDctMzM4CiAgICAvLyBtYXRjaCByb2xlOgogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgLy8gICAgICAgICByZXR1cm4gdHlwLlJvbGVWYWxpZGl0eSgKICAgIC8vICAgICAgICAgICAgIHJvbGVfdmFsaWRpdHlfc3RhcnQ9VUludDY0KDApLCByb2xlX3ZhbGlkaXR5X2VuZD1VSW50NjQoMCkKICAgIC8vICAgICAgICAgKQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5hdXRob3JpdHksIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5vYnNlcnZlciwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5vYnNlcnZlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBfOgogICAgLy8gICAgICAgICBvcC5lcnIoZXJyLklOVkFMSURfUk9MRSkKICAgIHVuY292ZXIgNgogICAgbWF0Y2ggcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8wQDIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8xQDMgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8yQDQgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8zQDUgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV80QDYgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV81QDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzgKICAgIC8vIG9wLmVycihlcnIuSU5WQUxJRF9ST0xFKQogICAgZXJyIC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzVANzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzQKICAgIC8vIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMjQgLy8gMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzMzLTMzNQogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMzNgogICAgLy8gcmV0dXJuIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzRANjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjkKICAgIC8vIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDIxIC8vIDB4NTIyMzQxNzU3NDY4NmY3MjY5NzQ3OTIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI4LTMzMAogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzEKICAgIC8vIHJldHVybiBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzNANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjQKICAgIC8vIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAzMiAvLyAweDUyMjM1NDcyNzU3Mzc0NjU2NTIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzIzLTMyNQogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI2CiAgICAvLyByZXR1cm4gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMkA0OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxOQogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAyMiAvLyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzE4LTMyMAogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMQogICAgLy8gcmV0dXJuIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8xQDM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzE0CiAgICAvLyBzZWxmLmFjY291bnRfbWFuYWdlciwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAyMyAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTMtMzE1CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxNgogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMEAyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwOS0zMTEKICAgIC8vIHJldHVybiB0eXAuUm9sZVZhbGlkaXR5KAogICAgLy8gICAgIHJvbGVfdmFsaWRpdHlfc3RhcnQ9VUludDY0KDApLCByb2xlX3ZhbGlkaXR5X2VuZD1VSW50NjQoMCkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLl9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IHZvaWQ6Cl9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI2CiAgICAvLyBkZWYgX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQoc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjgKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkLCBlcnIuU1VTUEVOREVECiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCAzODQKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIFN1c3BlbmRlZCBvcGVyYXRpb25zCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5fc2V0dGxlX3Bvc2l0aW9uKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NCwgdWludDY0Ogpfc2V0dGxlX3Bvc2l0aW9uOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjQ0CiAgICAvLyBkZWYgX3NldHRsZV9wb3NpdGlvbihzZWxmLCBob2xkaW5nX2FkZHJlc3M6IEFjY291bnQpIC0+IHR1cGxlW1VJbnQ2NCwgVUludDY0XToKICAgIHByb3RvIDEgMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo2MQogICAgLy8gcG9zaXRpb24gPSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jb3B5KCkKICAgIGR1cAogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NjMtNjUKICAgIC8vICMgQ29tcHV0ZSB0aGUgaW5jcmVtZW50YWwgcGVyLXVuaXQgZml4ZWQtcG9pbnQgaW50ZXJlc3QgYW5kIHByaW5jaXBhbCBhY2NydWVkCiAgICAvLyAjIHNpbmNlIHRoaXMgYWNjb3VudCdzIGxhc3QgY2hlY2twb2ludC4KICAgIC8vIGludGVyZXN0X2RlbHRhID0gc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IC0gcG9zaXRpb24uaW50ZXJlc3RfY2hlY2twb2ludAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggZXhpc3RzCiAgICBkaWcgMQogICAgcHVzaGludCA1NwogICAgZXh0cmFjdF91aW50NjQKICAgIC0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo2NwogICAgLy8gc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCAtIHBvc2l0aW9uLnByaW5jaXBhbF9jaGVja3BvaW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTcgLy8gImN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IGV4aXN0cwogICAgZGlnIDIKICAgIHB1c2hpbnQgNjUKICAgIGV4dHJhY3RfdWludDY0CiAgICAtCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzMKICAgIC8vIGludGVyZXN0X2RlbHRhLCBwb3NpdGlvbi51bml0cywgc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgZGlnIDIKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3MC03NAogICAgLy8gIyBDb252ZXJ0IHRoZSBwZXItdW5pdCBmaXhlZC1wb2ludCBkZWx0YXMgaW50byBhYnNvbHV0ZSBjbGFpbWFibGUgYW1vdW50cwogICAgLy8gIyB1c2luZyB0aGUgYWNjb3VudCdzIGFjdGl2ZSB1bml0cy4KICAgIC8vIGNsYWltYWJsZV9pbnRlcmVzdCA9IHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIGludGVyZXN0X2RlbHRhLCBwb3NpdGlvbi51bml0cywgc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgLy8gKQogICAgdW5jb3ZlciAzCiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojc2CiAgICAvLyBwcmluY2lwYWxfZGVsdGEsIHBvc2l0aW9uLnVuaXRzLCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzUtNzcKICAgIC8vIGNsYWltYWJsZV9wcmluY2lwYWwgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBwcmluY2lwYWxfZGVsdGEsIHBvc2l0aW9uLnVuaXRzLCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICAvLyApCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojc5LTgxCiAgICAvLyAjIEFjY3J1ZSB0aGUgY2xhaW1hYmxlIGFtb3VudHMgdG8gdGhlIGFjY291bnQgcG9zaXRpb24gYW5kIG1ha2UgdGhlbSBhdmFpbGFibGUKICAgIC8vICMgZm9yIHdpdGhkcmF3YWwuCiAgICAvLyBwb3NpdGlvbi5jbGFpbWFibGVfaW50ZXJlc3QgKz0gY2xhaW1hYmxlX2ludGVyZXN0CiAgICBkaWcgMgogICAgcHVzaGludCA3MwogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICArCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIHN3YXAKICAgIHJlcGxhY2UyIDczCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6ODIKICAgIC8vIHBvc2l0aW9uLmNsYWltYWJsZV9wcmluY2lwYWwgKz0gY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgZHVwCiAgICBwdXNoaW50IDgxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDIKICAgICsKICAgIGl0b2IKICAgIHJlcGxhY2UyIDgxCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6ODQtODYKICAgIC8vICMgQWR2YW5jZSB0aGUgYWNjb3VudCdzIHBlci11bml0IGZpeGVkLXBvaW50IGNoZWNrcG9pbnRzIHRvIHRoZSBjdXJyZW50IGdsb2JhbAogICAgLy8gIyBwZXItdW5pdCBmaXhlZC1wb2ludCBnbG9iYWwgaW5kaWNlcy4KICAgIC8vIHBvc2l0aW9uLmludGVyZXN0X2NoZWNrcG9pbnQgPSBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IGV4aXN0cwogICAgaXRvYgogICAgcmVwbGFjZTIgNTcKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo4NwogICAgLy8gcG9zaXRpb24ucHJpbmNpcGFsX2NoZWNrcG9pbnQgPSBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTcgLy8gImN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IGV4aXN0cwogICAgaXRvYgogICAgcmVwbGFjZTIgNjUKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo4OS05MAogICAgLy8gIyBBZHZhbmNlIHRoZSBhY2NvdW50J3MgZXZlbnQgY3Vyc29yIHRvIHRoZSBjdXJyZW50IGdsb2JhbCBldmVudCBjdXJzb3IuCiAgICAvLyBwb3NpdGlvbi5zZXR0bGVkX2N1cnNvciA9IHNlbGYuZXZlbnRfY3Vyc29yCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGl0b2IKICAgIHJlcGxhY2UyIDQ5CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6OTItOTQKICAgIC8vICMgVXBkYXRlIHRoZSBhY2NvdW50IHBvc2l0aW9uIGFuZCByZXR1cm4gdGhlIG5ld2x5IGFjY3J1ZWQgY2xhaW1hYmxlIGFtb3VudHMKICAgIC8vICMgYWRkZWQgdG8gdGhlIHRvdGFsIHBvc2l0aW9uJ3MgY2xhaW1hYmxlIGFtb3VudHMuCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHBvc2l0aW9uLmNvcHkoKQogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6OTUKICAgIC8vIHJldHVybiBjbGFpbWFibGVfaW50ZXJlc3QsIGNsYWltYWJsZV9wcmluY2lwYWwKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IHZvaWQ6Cl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojk3CiAgICAvLyBkZWYgX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQoc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQyMwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDAKICAgIC8vIGlmIHNlbGYuX3N0YXR1c19pc19wZW5kaW5nX2llZCgpOgogICAgYnogX2Vuc3VyZV91bml0c19hY3RpdmF0ZWRfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTAxCiAgICAvLyByZXR1cm4KICAgIHJldHN1YgoKX2Vuc3VyZV91bml0c19hY3RpdmF0ZWRfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwMwogICAgLy8gcG9zaXRpb24gPSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAyCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDQKICAgIC8vIGlmIHBvc2l0aW9uLnJlc2VydmVkX3VuaXRzID09IFVJbnQ2NCgwKToKICAgIHB1c2hpbnQgNDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgYm56IF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkX2FmdGVyX2lmX2Vsc2VANAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwNQogICAgLy8gcmV0dXJuCiAgICByZXRzdWIKCl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkX2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDgKICAgIC8vIHBvc2l0aW9uLnVuaXRzICs9IGFjdGl2YXRlZF91bml0cwogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMwogICAgKwogICAgaXRvYgogICAgcmVwbGFjZTIgMzIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDkKICAgIC8vIHBvc2l0aW9uLnJlc2VydmVkX3VuaXRzID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgaXRvYgogICAgcmVwbGFjZTIgNDAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTAKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gcG9zaXRpb24uY29weSgpCiAgICBmcmFtZV9kaWcgMgogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExMQogICAgLy8gYXNzZXJ0IHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPj0gYWN0aXZhdGVkX3VuaXRzLCBlcnIuT1ZFUl9ESVNUUklCVVRJT04KICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICBkdXAKICAgIGRpZyAyCiAgICA+PQogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCByZW1haW5pbmcgRC1BU0EgdW5pdHMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTIKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgLT0gYWN0aXZhdGVkX3VuaXRzCiAgICBzd2FwCiAgICAtCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX3NjYWxlZF9tdWxfZGl2KG11bHRpcGxpY2FuZDogdWludDY0LCBtdWx0aXBsaWVyOiB1aW50NjQsIGRpdmlzb3I6IHVpbnQ2NCkgLT4gdWludDY0Ogpfc2NhbGVkX211bF9kaXY6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTMtMTU1CiAgICAvLyBkZWYgX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIHNlbGYsIG11bHRpcGxpY2FuZDogVUludDY0LCBtdWx0aXBsaWVyOiBVSW50NjQsIGRpdmlzb3I6IFVJbnQ2NAogICAgLy8gKSAtPiBVSW50NjQ6CiAgICBwcm90byAzIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE1NwogICAgLy8gaWYgbXVsdGlwbGljYW5kID09IFVJbnQ2NCgwKSBvciBtdWx0aXBsaWVyID09IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMwogICAgYnogX3NjYWxlZF9tdWxfZGl2X2lmX2JvZHlAMgogICAgZnJhbWVfZGlnIC0yCiAgICBibnogX3NjYWxlZF9tdWxfZGl2X2FmdGVyX2lmX2Vsc2VAMwoKX3NjYWxlZF9tdWxfZGl2X2lmX2JvZHlAMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE1OAogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKX3NjYWxlZF9tdWxfZGl2X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE1OQogICAgLy8gaGlnaCwgbG93ID0gb3AubXVsdyhtdWx0aXBsaWNhbmQsIG11bHRpcGxpZXIpCiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMgogICAgbXVsdwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTYwCiAgICAvLyByZXR1cm4gb3AuZGl2dyhoaWdoLCBsb3csIGRpdmlzb3IpCiAgICBmcmFtZV9kaWcgLTEKICAgIGRpdncKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9hbW91bnRfdG9faW5kZXhfZGVsdGEoYW1vdW50OiB1aW50NjQpIC0+IHVpbnQ2NDoKX2Ftb3VudF90b19pbmRleF9kZWx0YToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2MgogICAgLy8gZGVmIF9hbW91bnRfdG9faW5kZXhfZGVsdGEoc2VsZiwgYW1vdW50OiBVSW50NjQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTY0CiAgICAvLyBpZiBhbW91bnQgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0xCiAgICBibnogX2Ftb3VudF90b19pbmRleF9kZWx0YV9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2NQogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKX2Ftb3VudF90b19pbmRleF9kZWx0YV9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjYKICAgIC8vIGFzc2VydCBzZWxmLnRvdGFsX3VuaXRzID4gVUludDY0KDApLCBlcnIuTk9fVU5JVFMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICBkdXAKICAgIGFzc2VydCAvLyBObyBELUFTQSB1bml0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTY3CiAgICAvLyByZXR1cm4gc2VsZi5fc2NhbGVkX211bF9kaXYoYW1vdW50LCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLCBzZWxmLnRvdGFsX3VuaXRzKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5faW5kZXhfZGVsdGFfdG9fYW1vdW50KGluZGV4X2RlbHRhOiB1aW50NjQpIC0+IHVpbnQ2NDoKX2luZGV4X2RlbHRhX3RvX2Ftb3VudDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2OQogICAgLy8gZGVmIF9pbmRleF9kZWx0YV90b19hbW91bnQoc2VsZiwgaW5kZXhfZGVsdGE6IFVJbnQ2NCkgLT4gVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNzYKICAgIC8vIGlmIGluZGV4X2RlbHRhID09IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMQogICAgYm56IF9pbmRleF9kZWx0YV90b19hbW91bnRfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNzcKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9pbmRleF9kZWx0YV90b19hbW91bnRfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTc5CiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE4MQogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE3OC0xODIKICAgIC8vIHJldHVybiBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLnRvdGFsX3VuaXRzLAogICAgLy8gICAgIGluZGV4X2RlbHRhLAogICAgLy8gICAgIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZ2V0X3NjaGVkdWxlX2VudHJ5KGV2ZW50X2lkOiB1aW50NjQpIC0+IGJ5dGVzOgpfZ2V0X3NjaGVkdWxlX2VudHJ5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjAyCiAgICAvLyBkZWYgX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLCBldmVudF9pZDogVUludDY0KSAtPiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeToKICAgIHByb3RvIDEgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjA0CiAgICAvLyBhc3NlcnQgZXZlbnRfaWQgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LCBlcnIuSU5WQUxJRF9FVkVOVF9JRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICA+CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBpZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTkwCiAgICAvLyByZXR1cm4gZXZlbnRfaWQgLy8gVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMTYKICAgIC8KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIwNgogICAgLy8gYXNzZXJ0IHBhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBpdG9iCiAgICBieXRlYyAzMSAvLyAweDUzMjMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE5NAogICAgLy8gcmV0dXJuIGV2ZW50X2lkICUgVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMTYKICAgICUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIwOQogICAgLy8gYXNzZXJ0IG9mZnNldCA8IHBhZ2UubGVuZ3RoLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIHB1c2hpbnQgMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGRpZyAxCiAgICA+CiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMTAKICAgIC8vIHJldHVybiBwYWdlW29mZnNldF0uY29weSgpCiAgICBwdXNoaW50IDY1CiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIHB1c2hpbnQgNjUKICAgIGJveF9leHRyYWN0CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoY29udHJhY3RfdHlwZTogdWludDY0LCBldmVudF90eXBlOiB1aW50NjQpIC0+IHZvaWQ6Cl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxMy0zMTUKICAgIC8vIGRlZiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgc2VsZiwgY29udHJhY3RfdHlwZTogVUludDY0LCBldmVudF90eXBlOiBVSW50NjQKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU0LTI1NQogICAgLy8gIyBDaGVjayBjb21tb24gZXZlbnRzIGZpcnN0CiAgICAvLyBpZiBldmVudF90eXBlIGluIGNvbW1vbl9ldmVudHM6CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI0NwogICAgLy8gVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI0OAogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUCksCiAgICBpbnRjXzIgLy8gOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU0LTI1NQogICAgLy8gIyBDaGVjayBjb21tb24gZXZlbnRzIGZpcnN0CiAgICAvLyBpZiBldmVudF90eXBlIGluIGNvbW1vbl9ldmVudHM6CiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjQ5CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX01EKSwKICAgIHB1c2hpbnQgMTkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1MAogICAgLy8gVUludDY0KGVudW1zLkVWVF9SUiksCiAgICBwdXNoaW50IDEyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTEKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIHB1c2hpbnQgMTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDcKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDY6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTYKICAgIC8vIHJldHVybiBUcnVlCiAgICBpbnRjXzEgLy8gMQoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIHJldHN1YgoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1OC0yNTkKICAgIC8vICMgQ29udHJhY3Qtc3BlY2lmaWMgYWRkaXRpb25hbCBldmVudHMKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX1BBTSk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNjAtMjYxCiAgICAvLyAjIFBBTSBvbmx5IHN1cHBvcnRzIGNvbW1vbiBldmVudHMKICAgIC8vIHJldHVybiBGYWxzZQogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2MwogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfTEFNKSBvciBjb250cmFjdF90eXBlID09IFVJbnQ2NCgKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAzCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjYzLTI2NQogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfTEFNKSBvciBjb250cmFjdF90eXBlID09IFVJbnQ2NCgKICAgIC8vICAgICBlbnVtcy5DVF9OQU0KICAgIC8vICk6CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlAMTEKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAyCiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMTYKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDExOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjY2LTI3MAogICAgLy8gIyBMQU0vTkFNIGFkZDogUFIsIElQQ0IKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNjgKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNjYtMjcwCiAgICAvLyAjIExBTS9OQU0gYWRkOiBQUiwgSVBDQgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMTMKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjY5CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgcHVzaGludCAxOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjY2LTI3MAogICAgLy8gIyBMQU0vTkFNIGFkZDogUFIsIElQQ0IKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gKQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDE0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDEzOgogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMTQ6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAxNjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3MgogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKToKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAyMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjczLTI3OAogICAgLy8gIyBBTk4gYWRkczogUFIsIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzUKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzMtMjc4CiAgICAvLyAjIEFOTiBhZGRzOiBQUiwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjAKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjc2CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgcHVzaGludCAxOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjczLTI3OAogICAgLy8gIyBBTk4gYWRkczogUFIsIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDIwCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3NwogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzMtMjc4CiAgICAvLyAjIEFOTiBhZGRzOiBQUiwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMjEKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjA6CiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF9mYWxzZUAyMToKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDIzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjgwCiAgICAvLyBpZiBjb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9MQVgpOgogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDQKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAzMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjgxLTI4NwogICAgLy8gIyBMQVggYWRkczogUFIsIFBJLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjgzCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjgxLTI4NwogICAgLy8gIyBMQVggYWRkczogUFIsIFBJLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyOAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODQKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgcHVzaGludCA0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODEtMjg3CiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDI4CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4NQogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIHB1c2hpbnQgMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MS0yODcKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjgKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjg2CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICBwdXNoaW50IDUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MS0yODcKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMjkKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjg6CiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF9mYWxzZUAyOToKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDMxOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjg5CiAgICAvLyBpZiBjb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9DTE0pOgogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDUKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAzMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjkwLTI5MQogICAgLy8gIyBDTE0gYWRkczogUFIKICAgIC8vIHJldHVybiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMzM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyOTMKICAgIC8vIHJldHVybiBGYWxzZQogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9pc19keW5hbWljX2FubnVpdHkoKSAtPiB1aW50NjQ6Cl9pc19keW5hbWljX2FubnVpdHk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzUKICAgIC8vIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMzNS0zMzYKICAgIC8vIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKQogICAgLy8gYW5kIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgYnogX2lzX2R5bmFtaWNfYW5udWl0eV9ib29sX2ZhbHNlQDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMzNgogICAgLy8gYW5kIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDM0IC8vICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24gZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzUtMzM2CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIC8vIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGJ6IF9pc19keW5hbWljX2FubnVpdHlfYm9vbF9mYWxzZUAzCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM0LTMzNwogICAgLy8gcmV0dXJuICgKICAgIC8vICAgICBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIC8vICAgICBhbmQgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICAvLyApCiAgICByZXRzdWIKCl9pc19keW5hbWljX2FubnVpdHlfYm9vbF9mYWxzZUAzOgogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMzNC0zMzcKICAgIC8vIHJldHVybiAoCiAgICAvLyAgICAgc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICAvLyAgICAgYW5kIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgLy8gKQogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnk6IGJ5dGVzKSAtPiB1aW50NjQsIGJ5dGVzOgpfZW50cnlfaW50ZXJlc3Rfc2VnbWVudDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM4MAogICAgLy8gZGVmIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KHNlbGYsIGVudHJ5OiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSkgLT4gVUludDY0OgogICAgcHJvdG8gMSAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozODkKICAgIC8vIGVudHJ5LmFjY3J1YWxfZmFjdG9yID09IFVJbnQ2NCgwKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDE3CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozODktMzkxCiAgICAvLyBlbnRyeS5hY2NydWFsX2ZhY3RvciA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID09IFVJbnQ2NCgwKQogICAgLy8gb3Igc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID09IFVJbnQ2NCgwKQogICAgYnogX2VudHJ5X2ludGVyZXN0X3NlZ21lbnRfaWZfYm9keUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozOTAKICAgIC8vIG9yIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID09IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozODktMzkxCiAgICAvLyBlbnRyeS5hY2NydWFsX2ZhY3RvciA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID09IFVJbnQ2NCgwKQogICAgLy8gb3Igc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID09IFVJbnQ2NCgwKQogICAgYnogX2VudHJ5X2ludGVyZXN0X3NlZ21lbnRfaWZfYm9keUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozOTEKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozODktMzkxCiAgICAvLyBlbnRyeS5hY2NydWFsX2ZhY3RvciA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID09IFVJbnQ2NCgwKQogICAgLy8gb3Igc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID09IFVJbnQ2NCgwKQogICAgYm56IF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2FmdGVyX2lmX2Vsc2VANAoKX2VudHJ5X2ludGVyZXN0X3NlZ21lbnRfaWZfYm9keUAzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzkzCiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfZGlnIC0xCiAgICB1bmNvdmVyIDIKICAgIHJldHN1YgoKX2VudHJ5X2ludGVyZXN0X3NlZ21lbnRfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzk1CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzk2CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzk3CiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzk0LTM5OAogICAgLy8gYWNjcnVlZCA9IHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSwKICAgIC8vICAgICBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQwMgogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5OS00MDMKICAgIC8vIHJldHVybiBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBhY2NydWVkLAogICAgLy8gICAgIGVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMAogICAgc3dhcAogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIGZyYW1lX2RpZyAtMQogICAgdW5jb3ZlciAyCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZGlzY291bnRfYW5udWl0eV9mYWN0b3IoZGlzY291bnRfZmFjdG9yOiB1aW50NjQsIHJlZGVtcHRpb25fZmFjdG9yOiB1aW50NjQpIC0+IHVpbnQ2NDoKX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDYyLTQ2NgogICAgLy8gZGVmIF9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcigKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgIGRpc2NvdW50X2ZhY3RvcjogVUludDY0LAogICAgLy8gICAgIHJlZGVtcHRpb25fZmFjdG9yOiBVSW50NjQsCiAgICAvLyApIC0+IFVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDY4CiAgICAvLyBpZiByZWRlbXB0aW9uX2ZhY3RvciA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGJueiBfZGlzY291bnRfYW5udWl0eV9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NjkKICAgIC8vIHJldHVybiBkaXNjb3VudF9mYWN0b3IKICAgIGZyYW1lX2RpZyAtMgogICAgcmV0c3ViCgpfZGlzY291bnRfYW5udWl0eV9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDcwCiAgICAvLyBwZXJpb2RfcmF0ZSA9IHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgKyBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3MQogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3MC00NzQKICAgIC8vIHBlcmlvZF9yYXRlID0gc2VsZi5maXhlZF9wb2ludF9zY2FsZSArIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIHJlZGVtcHRpb25fZmFjdG9yLAogICAgLy8gICAgIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgKwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDc1CiAgICAvLyBhc3NlcnQgcGVyaW9kX3JhdGUgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZHVwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzgKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzYtNDgwCiAgICAvLyByZXR1cm4gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgZGlzY291bnRfZmFjdG9yLAogICAgLy8gICAgIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICAvLyAgICAgcGVyaW9kX3JhdGUsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeShlbnRyeTogYnl0ZXMsIHBheWxvYWQ6IGJ5dGVzKSAtPiBieXRlcywgYnl0ZXM6Cl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYxMy02MTUKICAgIC8vIGRlZiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkoCiAgICAvLyAgICAgc2VsZiwgZW50cnk6IHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5LCBwYXlsb2FkOiB0eXAuT2JzZXJ2ZWRFdmVudFJlcXVlc3QKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDIgMgogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MjMKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF9pZCA9PSBzZWxmLmV2ZW50X2N1cnNvciwgZXJyLklOVkFMSURfRVZFTlRfQ1VSU09SCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgY3Vyc29yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MjQKICAgIC8vIGFzc2VydCBlbnRyeS5zY2hlZHVsZWRfdGltZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwgZXJyLk5PX0RVRV9DQVNIRkxPVwogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA8PQogICAgYXNzZXJ0IC8vIE5vIGR1ZSBjYXNoZmxvdyB0byBwYXkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYyNgogICAgLy8gZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjI3CiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfSUVEKToKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgZHVwCiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjI4LTYzMAogICAgLy8gIyBJRUQgZmluYWxpemVzIGlzc3VhbmNlOiByZXNlcnZlZCB1bml0cyBiZWNvbWUgYWN0aXZhdGFibGUgYW5kIHRoZQogICAgLy8gIyBzY2hlZHVsZSdzIGluaXRpYWwgY29udHJhY3R1YWwgc3RhdGUgYmVjb21lcyBsaXZlLgogICAgLy8gYXNzZXJ0IHNlbGYuX3N0YXR1c19pc19wZW5kaW5nX2llZCgpLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYzMgogICAgLy8gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCA9PSBzZWxmLnRvdGFsX3VuaXRzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzEtNjMzCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPT0gc2VsZi50b3RhbF91bml0cwogICAgLy8gKSwgZXJyLlBSSU1BUllfRElTVFJJQlVUSU9OX0lOQ09NUExFVEUKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBub3QgY29tcGxldGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYzNAogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzUKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYzNgogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPSBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZQogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYzNwogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ID0gVUludDY0KDApCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzgKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IGVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA0MQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYzOQogICAgLy8gc2VsZi5ldmVudF9jdXJzb3IgKz0gVUludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjQwCiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbnVtcy5TVEFUVVNfQUNUSVZFKQogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgcHVzaGludCAxMDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NTEKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwgZXJyLk5PVF9FVlRfSUVECiAgICBmcmFtZV9kaWcgMTEKICAgIGFzc2VydCAvLyBOb3QgSUVEIGV2ZW50CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NTIKICAgIC8vIHJldHVybiBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjQxLTY0NQogICAgLy8gc2VsZi5fZW1pdF9leGVjdXRpb25fZXZlbnQoCiAgICAvLyAgICAgZW50cnk9ZW50cnksCiAgICAvLyAgICAgcGF5b2ZmPXNlbGYuX2VudHJ5X2llZF9hbW91bnQoZW50cnkpLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjQ0CiAgICAvLyBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjQxLTY0NQogICAgLy8gc2VsZi5fZW1pdF9leGVjdXRpb25fZXZlbnQoCiAgICAvLyAgICAgZW50cnk9ZW50cnksCiAgICAvLyAgICAgcGF5b2ZmPXNlbGYuX2VudHJ5X2llZF9hbW91bnQoZW50cnkpLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGNhbGxzdWIgX2VtaXRfZXhlY3V0aW9uX2V2ZW50CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgLTIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0NgogICAgLy8gcmV0dXJuCiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2J1cnkgMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQ3CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuX3N0YXR1c19pc19wZW5kaW5nX2llZCgpLCBlcnIuUEVORElOR19JRUQKICAgICEKICAgIGFzc2VydCAvLyBJRUQgbm90IHlldCBleGVjdXRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjQ5CiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgKz0gc2VsZi5fZW50cnlfaW50ZXJlc3Rfc2VnbWVudChlbnRyeSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQKICAgIGZyYW1lX2J1cnkgLTIKICAgICsKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjUxCiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUlIpOgogICAgZnJhbWVfZGlnIDEwCiAgICBwdXNoaW50IDEyCiAgICA9PQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAxMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjU1CiAgICAvLyBwYXlsb2FkLm9ic2VydmVkX3JhdGUsCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NTYKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9tdWx0aXBsaWVyLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDM2IC8vICJyYXRlX3Jlc2V0X211bHRpcGxpZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9tdWx0aXBsaWVyIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjU3CiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjUyLTY1OAogICAgLy8gIyBSUiBkZXJpdmVzIHRoZSBuZXh0IHJhdGUgZnJvbSBhbiBvYnNlcnZlZCBvcmFjbGUgdmFsdWUgcGx1cyB0aGUKICAgIC8vICMgY29udHJhY3Qgc3ByZWFkIC8gbXVsdGlwbGllciB0ZXJtcywgdGhlbiBlbmZvcmNlcyBmbG9vciBhbmQgY2FwLgogICAgLy8gb2JzZXJ2ZWRfcmF0ZSA9IHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIHBheWxvYWQub2JzZXJ2ZWRfcmF0ZSwKICAgIC8vICAgICBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2MAogICAgLy8gb2JzZXJ2ZWRfcmF0ZSArIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzNSAvLyAicmF0ZV9yZXNldF9zcHJlYWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQgZXhpc3RzCiAgICArCiAgICBmcmFtZV9idXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjczNAogICAgLy8gaWYgc2VsZi5oYXNfcmF0ZV9yZXNldF9mbG9vciBhbmQgcmF0ZSA8IHNlbGYucmF0ZV9yZXNldF9mbG9vcjoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzOCAvLyAiaGFzX3JhdGVfcmVzZXRfZmxvb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgZXhpc3RzCiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1NQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI5IC8vICJyYXRlX3Jlc2V0X2Zsb29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfZmxvb3IgZXhpc3RzCiAgICBmcmFtZV9kaWcgNgogICAgPgogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjczNQogICAgLy8gcmF0ZSA9IHNlbGYucmF0ZV9yZXNldF9mbG9vcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI5IC8vICJyYXRlX3Jlc2V0X2Zsb29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgNgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9mbG9vciBleGlzdHMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzM2CiAgICAvLyBpZiBzZWxmLmhhc19yYXRlX3Jlc2V0X2NhcCBhbmQgcmF0ZSA+IHNlbGYucmF0ZV9yZXNldF9jYXA6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzkgLy8gImhhc19yYXRlX3Jlc2V0X2NhcCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgZXhpc3RzCiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1OAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDMwIC8vICJyYXRlX3Jlc2V0X2NhcCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X2NhcCBleGlzdHMKICAgIGZyYW1lX2RpZyA2CiAgICA8CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1OAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzM3CiAgICAvLyByYXRlID0gc2VsZi5yYXRlX3Jlc2V0X2NhcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDMwIC8vICJyYXRlX3Jlc2V0X2NhcCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDYKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfY2FwIGV4aXN0cwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NTkKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gc2VsZi5fY2xhbXBfcmF0ZSgKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1OS02NjEKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gc2VsZi5fY2xhbXBfcmF0ZSgKICAgIC8vICAgICBvYnNlcnZlZF9yYXRlICsgc2VsZi5yYXRlX3Jlc2V0X3NwcmVhZAogICAgLy8gKQogICAgZnJhbWVfZGlnIDYKICAgIGFwcF9nbG9iYWxfcHV0CgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAxODoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY3MQogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1BJKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCA0CiAgICA9PQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAyMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjcyCiAgICAvLyBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9IGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY3MwogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMjM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzgKICAgIC8vIGlmIHNlbGYuX2lzX2R5bmFtaWNfYW5udWl0eSgpOgogICAgY2FsbHN1YiBfaXNfZHluYW1pY19hbm51aXR5CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDI5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzkKICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QUkYpOgogICAgZnJhbWVfZGlnIDEwCiAgICBwdXNoaW50IDUKICAgID09CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAzMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDkwCiAgICAvLyBkaXNjb3VudF9mYWN0b3IgPSBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5MQogICAgLy8gZGVub21pbmF0b3IgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5MgogICAgLy8gc2tpcF9maXJzdF9yZWRlbXB0aW9uID0gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5NAogICAgLy8gaWYgZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAyNQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgZnJhbWVfYnVyeSA4CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAzNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDk1LTQ5OQogICAgLy8gIyBBbiBpbml0aWFsIFBSRiBtYXkgZGVzY3JpYmUgdGhlIGZpcnN0IHJlZGVtcHRpb24gcGVyaW9kIGRpcmVjdGx5LgogICAgLy8gZGlzY291bnRfZmFjdG9yID0gc2VsZi5fZGlzY291bnRfYW5udWl0eV9mYWN0b3IoCiAgICAvLyAgICAgZGlzY291bnRfZmFjdG9yLAogICAgLy8gICAgIGVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDgKICAgIGNhbGxzdWIgX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTAxCiAgICAvLyBza2lwX2ZpcnN0X3JlZGVtcHRpb24gPSBUcnVlCiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfYnVyeSA3CiAgICBmcmFtZV9idXJ5IDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDM1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTAzCiAgICAvLyBmdXR1cmVfZXZlbnRfaWQgPSBzZWxmLmV2ZW50X2N1cnNvciArIFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfd2hpbGVfdG9wQDM2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA0CiAgICAvLyB3aGlsZSBmdXR1cmVfZXZlbnRfaWQgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgZnJhbWVfZGlnIDMKICAgID4KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl93aGlsZUA0OAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA1CiAgICAvLyBmdXR1cmVfZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoZnV0dXJlX2V2ZW50X2lkKQogICAgZnJhbWVfZGlnIDMKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwNgogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPSBmdXR1cmVfZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MDctNTA4CiAgICAvLyAjIE9ubHkgcmVkZW1wdGlvbi1iZWFyaW5nIGV2ZW50cyBjb250cmlidXRlIHRvIHRoZSBhbm51aXR5IGRlbm9taW5hdG9yLgogICAgLy8gaXNfcmVkZW1wdGlvbl9ldmVudCA9IGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpIG9yICgKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwNy01MTEKICAgIC8vICMgT25seSByZWRlbXB0aW9uLWJlYXJpbmcgZXZlbnRzIGNvbnRyaWJ1dGUgdG8gdGhlIGFubnVpdHkgZGVub21pbmF0b3IuCiAgICAvLyBpc19yZWRlbXB0aW9uX2V2ZW50ID0gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QUikgb3IgKAogICAgLy8gICAgIGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfTUQpCiAgICAvLyAgICAgYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICAvLyApCiAgICBibnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfdHJ1ZUA0MAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA5CiAgICAvLyBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgZnJhbWVfZGlnIDQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MDktNTEwCiAgICAvLyBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgLy8gYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF9mYWxzZUA0MQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTEwCiAgICAvLyBhbmQgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IgPiBVSW50NjQoMCkKICAgIGZyYW1lX2RpZyAwCiAgICBwdXNoaW50IDI1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA5LTUxMAogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCkKICAgIC8vIGFuZCBmdXR1cmVfZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX3RydWVANDA6CiAgICBpbnRjXzEgLy8gMQoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfbWVyZ2VANDI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTIKICAgIC8vIGlmIGlzX3JlZGVtcHRpb25fZXZlbnQ6CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA0NwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTEzCiAgICAvLyBpZiBza2lwX2ZpcnN0X3JlZGVtcHRpb246CiAgICBmcmFtZV9kaWcgNwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUA0NQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTE0CiAgICAvLyBza2lwX2ZpcnN0X3JlZGVtcHRpb24gPSBGYWxzZQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgNwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANDc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjEKICAgIC8vIGZ1dHVyZV9ldmVudF9pZCArPSBVSW50NjQoMSkKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV93aGlsZV90b3BAMzYKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlANDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTgKICAgIC8vIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZnJhbWVfZGlnIDAKICAgIHB1c2hpbnQgMjUKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTYtNTE5CiAgICAvLyBkaXNjb3VudF9mYWN0b3IgPSBzZWxmLl9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcigKICAgIC8vICAgICBkaXNjb3VudF9mYWN0b3IsCiAgICAvLyAgICAgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMgogICAgc3dhcAogICAgY2FsbHN1YiBfZGlzY291bnRfYW5udWl0eV9mYWN0b3IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjAKICAgIC8vIGRlbm9taW5hdG9yICs9IGRpc2NvdW50X2ZhY3RvcgogICAgZnJhbWVfZGlnIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA0NwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDE6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF9tZXJnZUA0MgoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX3doaWxlQDQ4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTIzCiAgICAvLyBhc3NlcnQgZGVub21pbmF0b3IgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZnJhbWVfZGlnIDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUyNAogICAgLy8gbnVtZXJhdG9yID0gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTI1CiAgICAvLyBpZiBlbnRyeS5mbGFncyAmIFVJbnQ2NChlbnVtcy5GTEFHX0lOSVRJQUxfUFJGKSA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNTcKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gOAogICAgJgogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDUwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjYtNTI3CiAgICAvLyAjIFN1YnNlcXVlbnQgUFJGIGV2ZW50cyBhbW9ydGl6ZSBib3RoIHByaW5jaXBhbCBhbmQgYWxyZWFkeSBhY2NydWVkIGNhcnJ5LgogICAgLy8gbnVtZXJhdG9yICs9IHNlbGYuYWNjcnVlZF9pbnRlcmVzdAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgICsKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDUwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTMwCiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTI4LTUzMgogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIG51bWVyYXRvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gICAgIGRlbm9taW5hdG9yLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDEKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODAKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IHNlbGYuX3JlY2FsY3VsYXRlX2FubnVpdHlfcGF5bWVudCgKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjgwLTY4MgogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gc2VsZi5fcmVjYWxjdWxhdGVfYW5udWl0eV9wYXltZW50KAogICAgLy8gICAgIGVudHJ5CiAgICAvLyApCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMzA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODUKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4Ni02OTAKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1VSW50NjQoMCksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODgKICAgIC8vIHBheW9mZj1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njg5CiAgICAvLyBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4Ni02OTAKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1VSW50NjQoMCksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgY2FsbHN1YiBfZW1pdF9leGVjdXRpb25fZXZlbnQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDI5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njg0CiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDMwCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDIwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc0CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9JUENCKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCAxOAogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDIzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzUtNjc2CiAgICAvLyAjIElQQ0Iga2VlcHMgcHJpbmNpcGFsIHVuY2hhbmdlZCBhbmQgb25seSByZXNldHMgdGhlIGludGVyZXN0IGJhc2UuCiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIGIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMjMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMTA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjIKICAgIC8vIGVsaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1JSRik6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgMTEKICAgID09CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDE0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjMKICAgIC8vIG5leHRfcmF0ZSA9IGVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY0CiAgICAvLyBpZiBuZXh0X3JhdGUgPT0gVUludDY0KDApOgogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDEzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjUKICAgIC8vIG5leHRfcmF0ZSA9IHNlbGYucmF0ZV9yZXNldF9uZXh0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzcgLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDUKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfbmV4dCBleGlzdHMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY2CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IG5leHRfcmF0ZQogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgZnJhbWVfZGlnIDUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDE0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY4CiAgICAvLyBpZiBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSAhPSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgOQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2OQogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPSBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZQogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgZnJhbWVfZGlnIDkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KGVudHJ5OiBieXRlcywgcGF5b2ZmOiB1aW50NjQsIHNldHRsZWRfYW1vdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpfZW1pdF9leGVjdXRpb25fZXZlbnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OTYtNzAyCiAgICAvLyBkZWYgX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgKiwKICAgIC8vICAgICBlbnRyeTogdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnksCiAgICAvLyAgICAgcGF5b2ZmOiBVSW50NjQsCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ6IFVJbnQ2NCwKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDMgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzA2CiAgICAvLyBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25JRAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzA3CiAgICAvLyBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIGZyYW1lX2RpZyAtMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MDgKICAgIC8vIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIGZyYW1lX2RpZyAtMwogICAgZXh0cmFjdCA4IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcwOQogICAgLy8gc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICBmcmFtZV9kaWcgLTMKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTAKICAgIC8vIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTMKICAgIC8vIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIGZyYW1lX2RpZyAtMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzA4CiAgICAvLyBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICBpbnRjXzIgLy8gOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzEzCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBnZXRieXRlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDIKICAgIC8vIGlmIHBheW9mZiA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJueiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDMKICAgIC8vIHJldHVybiBVSW50NjQoZW51bXMuUEFZT0ZGX1NJR05fUE9TSVRJVkUpCiAgICBpbnRjXzEgLy8gMQoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX3BheW9mZl9zaWduQDc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTItNzE0CiAgICAvLyBwYXlvZmZfc2lnbj1hcmM0LlVJbnQ4KAogICAgLy8gICAgIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIC8vICksCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgaW50Y18yIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTYKICAgIC8vIGN1cnJlbmN5X2lkPXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE3CiAgICAvLyBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MDUtNzE4CiAgICAvLyBFeGVjdXRpb25FdmVudCgKICAgIC8vICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIC8vICAgICBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYXBwbGllZF9hdD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICBwYXlvZmY9cGF5b2ZmLAogICAgLy8gICAgIHBheW9mZl9zaWduPWFyYzQuVUludDgoCiAgICAvLyAgICAgICAgIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIC8vICAgICApLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PXNldHRsZWRfYW1vdW50LAogICAgLy8gICAgIGN1cnJlbmN5X2lkPXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAwCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzA0LTcxOQogICAgLy8gYXJjNC5lbWl0KAogICAgLy8gICAgIEV4ZWN1dGlvbkV2ZW50KAogICAgLy8gICAgICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgICAgIHBheW9mZj1wYXlvZmYsCiAgICAvLyAgICAgICAgIHBheW9mZl9zaWduPWFyYzQuVUludDgoCiAgICAvLyAgICAgICAgICAgICBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICAvLyAgICAgICAgICksCiAgICAvLyAgICAgICAgIHNldHRsZWRfYW1vdW50PXNldHRsZWRfYW1vdW50LAogICAgLy8gICAgICAgICBjdXJyZW5jeV9pZD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgICAgIHNlcXVlbmNlPWVudHJ5LmV2ZW50X2lkICsgVUludDY0KDEpLAogICAgLy8gICAgICkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDlhMzMyYjk1IC8vIG1ldGhvZCAiRXhlY3V0aW9uRXZlbnQodWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc0NAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiAoVUludDY0KGVudW1zLkVWVF9JRUQpLCBVSW50NjQoZW51bXMuRVZUX1BJKSk6CiAgICBmcmFtZV9kaWcgNQogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBibnogX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2lmX2JvZHlANQogICAgZnJhbWVfZGlnIDUKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGJ6IF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pZl9lbHNlQDYKCl9lbWl0X2V4ZWN1dGlvbl9ldmVudF9pZl9ib2R5QDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDUKICAgIC8vIHJldHVybiBVSW50NjQoZW51bXMuUEFZT0ZGX1NJR05fUE9TSVRJVkUpCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzEzCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBiIF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9wYXlvZmZfc2lnbkA3CgpfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzQ2CiAgICAvLyByZXR1cm4gVUludDY0KGVudW1zLlBBWU9GRl9TSUdOX05FR0FUSVZFKQogICAgcHVzaGludCAyNTUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxMwogICAgLy8gc2VsZi5fcGF5b2ZmX3NpZ24oZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSwgcGF5b2ZmKQogICAgYiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fcGF5b2ZmX3NpZ25ANwoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9yb2xlX2lzX2FjdGl2ZShyb2xlX21hcDogYnl0ZXMsIHJvbGVfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NDoKX3JvbGVfaXNfYWN0aXZlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU3CiAgICAvLyBkZWYgX3JvbGVfaXNfYWN0aXZlKHNlbGYsIHJvbGVfbWFwOiB0eXAuUmJhY1JvbGUsIHJvbGVfYWRkcmVzczogQWNjb3VudCkgLT4gYm9vbDoKICAgIHByb3RvIDIgMQogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5CiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5LTYwCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5LTYxCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjEKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAtNjEKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgPj0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX21lcmdlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKSAtPiB2b2lkOgpfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2NQogICAgLy8gYXNzZXJ0IHNlbGYuX2lzX2FycmFuZ2VyKFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTIKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgPT0gc2VsZi5hcnJhbmdlci52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE4IC8vIDB4NTIyMzQxNzI3MjYxNmU2NzY1NzIyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgPT0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2NQogICAgLy8gYXNzZXJ0IHNlbGYuX2lzX2FycmFuZ2VyKFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpIC0+IHZvaWQ6Cl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4MwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFzc2V0X2RlZmF1bHRlZCwgZXJyLkRFRkFVTFRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQxIC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfZGVmYXVsdGVkIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIERlZmF1bHRlZAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkgLT4gdm9pZDoKX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg2CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYXNzZXRfc3VzcGVuZGVkLCBlcnIuU1VTUEVOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzMgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9zdXNwZW5kZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gU3VzcGVuZGVkIG9wZXJhdGlvbnMKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkOiB1aW50NjQpIC0+IHZvaWQ6Cl9hc3NlcnRfdmFsaWRfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OAogICAgLy8gZGVmIF9hc3NlcnRfdmFsaWRfcm9sZShzZWxmLCByb2xlX2lkOiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTAKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIHB1c2hpbnQgMjAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkxCiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgcHVzaGludCAyNQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTIKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICBwdXNoaW50IDQwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MwogICAgLy8gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgcHVzaGludCA1MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTQKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgcHVzaGludCA2MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTUKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICBwdXNoaW50IDcwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NgogICAgLy8gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgcHVzaGludCA4MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfZmFsc2VAOAoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3OgogICAgaW50Y18xIC8vIDEKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX21lcmdlQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgcmV0c3ViCgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9mYWxzZUA4OgogICAgaW50Y18wIC8vIDAKICAgIGIgX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfbWVyZ2VAOQo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" }, "byteCode": { diff --git a/smart_contracts/artifacts/d_asa/dasa_client.py b/smart_contracts/artifacts/d_asa/dasa_client.py index eef67f7e..10de2199 100644 --- a/smart_contracts/artifacts/d_asa/dasa_client.py +++ b/smart_contracts/artifacts/d_asa/dasa_client.py @@ -19,7 +19,7 @@ import algokit_utils from algokit_utils import AlgorandClient as _AlgoKitAlgorandClient -_APP_SPEC_JSON = r"""{"arcs": [22, 28], "bareActions": {"call": [], "create": []}, "methods": [{"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "name": "max_event_count"}], "name": "fund_due_cashflows", "returns": {"type": "(uint64,uint64,uint64,uint64,uint64)", "struct": "CashFundingResult"}, "desc": "Reserve due ACTUS cash events into the escrow-style claim ledger.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "name": "holding_address"}, {"type": "byte[]", "name": "payment_info"}], "name": "claim_due_cashflows", "returns": {"type": "(uint64,uint64,uint64,uint64,byte[])", "struct": "CashClaimResult"}, "desc": "Withdraw the holder's already funded ACTUS cash entitlements.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "name": "open_date"}, {"type": "uint64", "name": "closure_date"}], "name": "set_transfer_schedule", "returns": {"type": "uint64"}, "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "name": "holding_address"}, {"type": "uint64", "name": "units"}], "name": "primary_distribution", "returns": {"type": "uint64"}, "desc": "Reserve units for a holder before IED finalizes issuance.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "name": "sender_holding_address"}, {"type": "address", "name": "receiver_holding_address"}, {"type": "uint64", "name": "units"}], "name": "transfer", "returns": {"type": "uint64"}, "desc": "Transfer active units after settling both counterparties to the current cursor.\nReturns the number of units moved. The ACTUS kernel no longer persists a nominal per-unit value on-chain, so transfer results are unit-based.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "bool", "desc": "Suspension status", "name": "suspended"}], "name": "account_gov_suspension", "returns": {"type": "uint64", "desc": "Timestamp of the set account suspension status"}, "desc": "Set account suspension status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "address", "desc": "Account Payment Address", "name": "payment_address"}], "name": "account_open", "returns": {"type": "uint64", "desc": "Timestamp of the account opening"}, "desc": "Open a contract account with a new position and register its payment address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "address", "desc": "Account Payment Address", "name": "payment_address"}], "name": "account_update_payment_address", "returns": {"type": "uint64", "desc": "Timestamp of the account update"}, "desc": "Update the Payment Address of an account", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}], "name": "account_get_position", "returns": {"type": "(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64)", "desc": "Account position", "struct": "AccountPosition"}, "desc": "Get account position", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": [], "create": ["NoOp"]}, "args": [{"type": "address", "desc": "D-ASA Arranger Address", "name": "arranger"}], "name": "contract_create", "returns": {"type": "uint64", "desc": "UNIX timestamp of contract creation"}, "desc": "Create a new D-ASA contract and set the Arranger role", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64)", "desc": "Normalized ACTUS terms", "name": "terms", "struct": "NormalizedActusTerms"}, {"type": "(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "desc": "Initial kernel state (pre-IED)", "name": "initial_state", "struct": "InitialKernelState"}, {"type": "(byte[32],string)", "desc": "Prospectus (informational only)", "name": "prospectus", "struct": "Prospectus"}], "name": "contract_config", "returns": {"type": "uint64", "desc": "UNIX timestamp of contract configuration"}, "desc": "Partial contract configuration with: normalized ACTUS terms, initial kernel\nstate (pre-IED), prospectus (informational only). The contract stays inactive until all schedule pages are configured next.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "name": "schedule_page_index"}, {"type": "bool", "name": "is_last_page"}, {"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[]", "name": "schedule_page"}], "name": "contract_schedule", "returns": {"type": "uint64"}, "desc": "Upload one normalized schedule page.\nThe configuration operation is considered complete only when the last page is stored. At that point `schedule_entry_count` is finalized and the contract moves to `STATUS_PENDING_IED`.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "execute_ied", "returns": {"type": "uint64"}, "desc": "Execute the first due `IED` entry and activate the contract.\n`IED` is the one non-cash event that moves the app from `STATUS_PENDING_IED` to `STATUS_ACTIVE`.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "name": "event_id"}, {"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "name": "payload", "struct": "ObservedEventRequest"}], "name": "apply_non_cash_event", "returns": {"type": "uint64"}, "desc": "Apply the next due non-cash event, optionally appending one first.\nObserved payloads are appended before execution when flagged. Rate reset events require the interest oracle because they can change the running nominal rate; other non-cash events stay arranger-controlled.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_contract_state", "returns": {"type": "(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "struct": "KernelState"}, "desc": "Return a readonly snapshot of the generic ACTUS kernel state.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_next_due_event", "returns": {"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "struct": "ExecutionScheduleEntry"}, "desc": "Return the next boxed schedule entry, or a zeroed sentinel if ended.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["UpdateApplication"], "create": []}, "args": [], "name": "contract_update", "returns": {"type": "void"}, "desc": "Update D-ASA application.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "New Arranger address", "name": "new_arranger"}], "name": "rbac_rotate_arranger", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Rotate the Arranger address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Operation Daemon address", "name": "address"}], "name": "rbac_set_op_daemon", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Non-Normative: Set the Operation Daemon address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}, {"type": "(uint64,uint64)", "desc": "Role time validity", "name": "validity", "struct": "RoleValidity"}], "name": "rbac_assign_role", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Assign a role to an address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}], "name": "rbac_revoke_role", "returns": {"type": "uint64", "desc": "Timestamp of the role revocation"}, "desc": "Revoke a role from an address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Suspension status", "name": "suspended"}], "name": "rbac_gov_asset_suspension", "returns": {"type": "uint64", "desc": "Timestamp of the set asset suspension status"}, "desc": "Set asset suspension status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "rbac_get_arranger", "returns": {"type": "address", "desc": "Arranger address"}, "desc": "Get Arranger address", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Address to get roles for", "name": "address"}], "name": "rbac_get_address_roles", "returns": {"type": "(bool,bool,bool,bool,bool)", "desc": "Roles mask: (Account Manager, Primary Dealer, Trustee, Authority, Observer)"}, "desc": "Non-normative - Get roles assigned to an address", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}], "name": "rbac_get_role_validity", "returns": {"type": "(uint64,uint64)", "desc": "Role validity", "struct": "RoleValidity"}, "desc": "Get role validity", "events": [], "readonly": true, "recommendations": {}}], "name": "DASA", "state": {"keys": {"box": {}, "global": {"arranger": {"key": "UiNBcnJhbmdlciM=", "keyType": "AVMBytes", "valueType": "address"}, "op_daemon": {"key": "UiNPcERhZW1vbiM=", "keyType": "AVMBytes", "valueType": "address"}, "asset_suspended": {"key": "YXNzZXRfc3VzcGVuZGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "asset_defaulted": {"key": "YXNzZXRfZGVmYXVsdGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "status": {"key": "c3RhdHVz", "keyType": "AVMString", "valueType": "AVMUint64"}, "contract_type": {"key": "Y29udHJhY3RfdHlwZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "prospectus_hash": {"key": "cHJvc3BlY3R1c19oYXNo", "keyType": "AVMString", "valueType": "AVMBytes"}, "prospectus_url": {"key": "cHJvc3BlY3R1c191cmw=", "keyType": "AVMString", "valueType": "AVMString"}, "denomination_asset_id": {"key": "ZGVub21pbmF0aW9uX2Fzc2V0X2lk", "keyType": "AVMString", "valueType": "AVMUint64"}, "settlement_asset_id": {"key": "c2V0dGxlbWVudF9hc3NldF9pZA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "initial_exchange_date": {"key": "aW5pdGlhbF9leGNoYW5nZV9kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "maturity_date": {"key": "bWF0dXJpdHlfZGF0ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "transfer_opening_date": {"key": "dHJhbnNmZXJfb3BlbmluZ19kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "transfer_closure_date": {"key": "dHJhbnNmZXJfY2xvc3VyZV9kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "day_count_convention": {"key": "ZGF5X2NvdW50X2NvbnZlbnRpb24=", "keyType": "AVMString", "valueType": "AVMUint64"}, "total_units": {"key": "dG90YWxfdW5pdHM=", "keyType": "AVMString", "valueType": "AVMUint64"}, "reserved_units_total": {"key": "cmVzZXJ2ZWRfdW5pdHNfdG90YWw=", "keyType": "AVMString", "valueType": "AVMUint64"}, "initial_exchange_amount": {"key": "aW5pdGlhbF9leGNoYW5nZV9hbW91bnQ=", "keyType": "AVMString", "valueType": "AVMUint64"}, "outstanding_principal": {"key": "b3V0c3RhbmRpbmdfcHJpbmNpcGFs", "keyType": "AVMString", "valueType": "AVMUint64"}, "next_principal_redemption": {"key": "bmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbg==", "keyType": "AVMString", "valueType": "AVMUint64"}, "dynamic_principal_redemption": {"key": "ZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbg==", "keyType": "AVMString", "valueType": "AVMUint64"}, "interest_calculation_base": {"key": "aW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "accrued_interest": {"key": "YWNjcnVlZF9pbnRlcmVzdA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "nominal_interest_rate": {"key": "bm9taW5hbF9pbnRlcmVzdF9yYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_spread": {"key": "cmF0ZV9yZXNldF9zcHJlYWQ=", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_multiplier": {"key": "cmF0ZV9yZXNldF9tdWx0aXBsaWVy", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_floor": {"key": "cmF0ZV9yZXNldF9mbG9vcg==", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_cap": {"key": "cmF0ZV9yZXNldF9jYXA=", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_next": {"key": "cmF0ZV9yZXNldF9uZXh0", "keyType": "AVMString", "valueType": "AVMUint64"}, "has_rate_reset_floor": {"key": "aGFzX3JhdGVfcmVzZXRfZmxvb3I=", "keyType": "AVMString", "valueType": "AVMUint64"}, "has_rate_reset_cap": {"key": "aGFzX3JhdGVfcmVzZXRfY2Fw", "keyType": "AVMString", "valueType": "AVMUint64"}, "reserved_principal": {"key": "cmVzZXJ2ZWRfcHJpbmNpcGFs", "keyType": "AVMString", "valueType": "AVMUint64"}, "reserved_interest": {"key": "cmVzZXJ2ZWRfaW50ZXJlc3Q=", "keyType": "AVMString", "valueType": "AVMUint64"}, "cumulative_interest_index": {"key": "Y3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "cumulative_principal_index": {"key": "Y3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXg=", "keyType": "AVMString", "valueType": "AVMUint64"}, "event_cursor": {"key": "ZXZlbnRfY3Vyc29y", "keyType": "AVMString", "valueType": "AVMUint64"}, "schedule_entry_count": {"key": "c2NoZWR1bGVfZW50cnlfY291bnQ=", "keyType": "AVMString", "valueType": "AVMUint64"}, "fixed_point_scale": {"key": "Zml4ZWRfcG9pbnRfc2NhbGU=", "keyType": "AVMString", "valueType": "AVMUint64"}}, "local": {}}, "maps": {"box": {"account_manager": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNBY2NvdW50TWFuYWdlciM="}, "primary_dealer": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNQcmltYXJ5RGVhbGVyIw=="}, "trustee": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNUcnVzdGVlIw=="}, "authority": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNBdXRob3JpdHkj"}, "observer": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNPYnNlcnZlciM="}, "schedule_page": {"keyType": "uint64", "valueType": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[]", "prefix": "UyM="}, "account": {"keyType": "address", "valueType": "AccountPosition", "prefix": "UiNBY2NvdW50Iw=="}}, "global": {}, "local": {}}, "schema": {"global": {"bytes": 4, "ints": 37}, "local": {"bytes": 0, "ints": 0}}}, "structs": {"AccountPosition": [{"name": "payment_address", "type": "address"}, {"name": "units", "type": "uint64"}, {"name": "reserved_units", "type": "uint64"}, {"name": "suspended", "type": "bool"}, {"name": "settled_cursor", "type": "uint64"}, {"name": "interest_checkpoint", "type": "uint64"}, {"name": "principal_checkpoint", "type": "uint64"}, {"name": "claimable_interest", "type": "uint64"}, {"name": "claimable_principal", "type": "uint64"}], "CashClaimResult": [{"name": "interest_amount", "type": "uint64"}, {"name": "principal_amount", "type": "uint64"}, {"name": "total_amount", "type": "uint64"}, {"name": "timestamp", "type": "uint64"}, {"name": "context", "type": "byte[]"}], "CashFundingResult": [{"name": "funded_interest", "type": "uint64"}, {"name": "funded_principal", "type": "uint64"}, {"name": "total_funded", "type": "uint64"}, {"name": "processed_events", "type": "uint64"}, {"name": "timestamp", "type": "uint64"}], "ExecutionScheduleEntry": [{"name": "event_id", "type": "uint64"}, {"name": "event_type", "type": "uint8"}, {"name": "scheduled_time", "type": "uint64"}, {"name": "accrual_factor", "type": "uint64"}, {"name": "redemption_accrual_factor", "type": "uint64"}, {"name": "next_nominal_interest_rate", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "next_outstanding_principal", "type": "uint64"}, {"name": "flags", "type": "uint64"}], "InitialKernelState": [{"name": "status_date", "type": "uint64"}, {"name": "event_cursor", "type": "uint64"}, {"name": "outstanding_principal", "type": "uint64"}, {"name": "interest_calculation_base", "type": "uint64"}, {"name": "nominal_interest_rate", "type": "uint64"}, {"name": "accrued_interest", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "cumulative_interest_index", "type": "uint64"}, {"name": "cumulative_principal_index", "type": "uint64"}], "KernelState": [{"name": "contract_type", "type": "uint8"}, {"name": "status", "type": "uint64"}, {"name": "total_units", "type": "uint64"}, {"name": "reserved_units_total", "type": "uint64"}, {"name": "initial_exchange_amount", "type": "uint64"}, {"name": "event_cursor", "type": "uint64"}, {"name": "schedule_entry_count", "type": "uint64"}, {"name": "outstanding_principal", "type": "uint64"}, {"name": "interest_calculation_base", "type": "uint64"}, {"name": "nominal_interest_rate", "type": "uint64"}, {"name": "accrued_interest", "type": "uint64"}, {"name": "cumulative_interest_index", "type": "uint64"}, {"name": "cumulative_principal_index", "type": "uint64"}, {"name": "reserved_interest", "type": "uint64"}, {"name": "reserved_principal", "type": "uint64"}], "NormalizedActusTerms": [{"name": "contract_type", "type": "uint8"}, {"name": "denomination_asset_id", "type": "uint64"}, {"name": "settlement_asset_id", "type": "uint64"}, {"name": "total_units", "type": "uint64"}, {"name": "notional_principal", "type": "uint64"}, {"name": "initial_exchange_amount", "type": "uint64"}, {"name": "initial_exchange_date", "type": "uint64"}, {"name": "maturity_date", "type": "uint64"}, {"name": "day_count_convention", "type": "uint8"}, {"name": "rate_reset_spread", "type": "uint64"}, {"name": "rate_reset_multiplier", "type": "uint64"}, {"name": "rate_reset_floor", "type": "uint64"}, {"name": "rate_reset_cap", "type": "uint64"}, {"name": "rate_reset_next", "type": "uint64"}, {"name": "has_rate_reset_floor", "type": "bool"}, {"name": "has_rate_reset_cap", "type": "bool"}, {"name": "dynamic_principal_redemption", "type": "bool"}, {"name": "fixed_point_scale", "type": "uint64"}], "ObservedEventRequest": [{"name": "event_id", "type": "uint64"}, {"name": "event_type", "type": "uint8"}, {"name": "scheduled_time", "type": "uint64"}, {"name": "accrual_factor", "type": "uint64"}, {"name": "redemption_accrual_factor", "type": "uint64"}, {"name": "observed_rate", "type": "uint64"}, {"name": "next_nominal_interest_rate", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "next_outstanding_principal", "type": "uint64"}, {"name": "flags", "type": "uint64"}], "Prospectus": [{"name": "hash", "type": "byte[32]"}, {"name": "url", "type": "string"}], "RoleValidity": [{"name": "role_validity_start", "type": "uint64"}, {"name": "role_validity_end", "type": "uint64"}]}, "byteCode": {"approval": "DCAEAAEIICYwBBUffHUGc3RhdHVzDGV2ZW50X2N1cnNvchVvdXRzdGFuZGluZ19wcmluY2lwYWwUc2NoZWR1bGVfZW50cnlfY291bnQRZml4ZWRfcG9pbnRfc2NhbGUQYWNjcnVlZF9pbnRlcmVzdBlpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlClIjQWNjb3VudCMVbm9taW5hbF9pbnRlcmVzdF9yYXRlFHJlc2VydmVkX3VuaXRzX3RvdGFsEnJlc2VydmVkX3ByaW5jaXBhbA1jb250cmFjdF90eXBlC3RvdGFsX3VuaXRzGW5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24RcmVzZXJ2ZWRfaW50ZXJlc3QZY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleBpjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleAtSI0FycmFuZ2VyIxNzZXR0bGVtZW50X2Fzc2V0X2lkF2luaXRpYWxfZXhjaGFuZ2VfYW1vdW50DFIjQXV0aG9yaXR5IxBSI1ByaW1hcnlEZWFsZXIjEVIjQWNjb3VudE1hbmFnZXIjC1IjT2JzZXJ2ZXIjC1IjT3BEYWVtb24jFWluaXRpYWxfZXhjaGFuZ2VfZGF0ZRV0cmFuc2Zlcl9vcGVuaW5nX2RhdGUVdHJhbnNmZXJfY2xvc3VyZV9kYXRlEHJhdGVfcmVzZXRfZmxvb3IOcmF0ZV9yZXNldF9jYXACUyMKUiNUcnVzdGVlIw9hc3NldF9zdXNwZW5kZWQcZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbhFyYXRlX3Jlc2V0X3NwcmVhZBVyYXRlX3Jlc2V0X211bHRpcGxpZXIPcmF0ZV9yZXNldF9uZXh0FGhhc19yYXRlX3Jlc2V0X2Zsb29yEmhhc19yYXRlX3Jlc2V0X2NhcAEAD2Fzc2V0X2RlZmF1bHRlZA9wcm9zcGVjdHVzX2hhc2gOcHJvc3BlY3R1c191cmwVZGVub21pbmF0aW9uX2Fzc2V0X2lkDW1hdHVyaXR5X2RhdGUUZGF5X2NvdW50X2NvbnZlbnRpb24DBoEBMRhAAK0nEjIDZycZMgNnJyEiZycpImcpImcnDCJnJyqAAGcnK4AAZycsImcnEyJnJxoiZyctImcnGyJnJxwiZycuImcnDSJnJwoiZycUImcrImcnDiJnJyIiZycHImcnBiJnJwkiZycjImcnJCJnJx0iZyceImcnJSJnJyYiZycnImcnCyJnJw8iZycQImcnESJnKiJnJwQiZycFImcxNYEEEkQxNIElEkQxNxREMTYURIAEkU8E6zYaAI4BAMAxGRREMRhBAKmCFwS0RhjIBOeDJSkEfqIOCwRshePuBL3RqUQE3AY7NQQU/BDvBHSnKX8ECdT+FASam/qFBIXu0z0EkYUQSgTZ8iWsBG4OXJUE/z/UswSC9xstBO8E9dME3zQ1UAQ9voC9BN9U6CwEAQyCmQR0BqzSBBpyou42GgCOFwAbAscEIwRNBNcFyAYCBloGjQa7CK4J6ApiC9QMZwytDMUM3Q2SDigORw5SDpwAgASVbXFWNhoAjgEGmAAxGYEEEjEYEERCDI0igABHCjYaAUkVJBJEFyIpZUREiBSjiBSqiBSvIillRIEyEhREIkcCSwJLBAxBAlEiKmVEIicEZUQMQQJEIiplRIgQA0lFEYEJW0lFBjIHDUACLksPJFVJRRAkEklFB0AAEEsOgQMSQAAISw6BExJBAjYjQQILSw8iWyIqZUQSREsEMgcOREsFQAHkSw6BExJAAdwiRQ1LDyRVSUUQgQMSQAFgSw6BExJAAVgiRQhLD4ExW0UKiBCMQAD7SwlFC0sMiA9JSwiID0RLAYgPXklOAkURSYgPVUlFDUsCSwEISUUMMgoiJxNlRHAARCInD2VEIicLZURLAQhLAksBD0RPAkwJTwIPRE8DCCcPTGciJwtlRAgnC0xnIicQZURPAggnEExnIicRZUQIJxFMZ0sPJFWBAxJBAHciJwZlREsQiBAYRRIIJwZMZ4gP+EEACksPJFWBExJBAAlLD4EpWycOTGcrSwpnJwdLC2ciKmVEIwgqTGdLD1cIAYABE6hBABAiK2VEQAAJKYHIAWcnByJnSw9LB0mIEnFISwFLDghFAklLCQhFAUsCIwhFA0L+eScGImdC/5NLDyRVSUUQgQMSQQAPIitlREsICUlFC0ULQv7tSw4kEkEAEiIrZUxFC0QiJwdlTEUMREL+1EsOgRMSQAAHSwlFC0L+xSJFCiJFC0L+vIgPPkEAU0sOgRMSQQAJIitlREUIQv6UIicGZURLEIgPNkUSCElFDSInDmVED0EABiJFCEL+dSInDmVESwwJSUUKIitlRA1BAAkiK2VERQhC/llLCEUIQv5SSw+BMVsiK2VESg5ETAlFCEL+PyInBmVESxCIDuFFEghFDUL+FUsCSURLAklLA0lOAwgyB08CFk8DFlBPAhZQTwIWUEwWUChMULAjQyJC/ceAAEcCNhoBRwIVJRJENhoCSSJZgQIISwEVEkRXAgBMIillREQnCExQSb1FAUQiJxllRDIDE0EAIjEAIicZZUQSQAAVMQBLAxJAAA0xAEsBvkRXACASQQEAI0SIEbqIEb8iKWVEgTISFERLAkmIDISIDAdGAkm+REmBSVtJTgJFCEmBUVtJRQhPAghJRQZEVwAgIicTZURwAEUBQQC3Sb5EgYADU0AArSNBAHgyCiInE2VETEsBcABESwVJTgIPREsCSU4DvkRJVwAgsTIATwOyEkyyFE8CshGBBLIQsgGzSYFJW0lOAkUJSYFRW0lOA0UJIhZMSwFcSUxcUU8DTL8iJw9lRElLAg9EIicLZURLAw9ETAknD0xnIicLZURMCScLTGdLBUlLBklOAwgyB08CFk8DFlBPAhZQTBZQSwJJFRZXBgJMUEyAAgAiUExQKExQsCNDIkL/UCJC/v02GgFJFSQSRBc2GgJJFSQSRBeIEJxKDEQnG08CZyccTGcyBxYoTFCwI0M2GgFJFSUSRDYaAkkVJBJEF0lOAiIpZUREJxYxAIgQM0SIEG2IEHIiKWVEgTISRCcISwJQSU4DvUUBREyICqNJRCInCmVECCInDWVEDkQiJxplREEACTIHIicaZUQOREcCvkSBKFtLA0lOAwgWgShMuyInCmVECCcKSwFnIicNZURMCRYoTFCwI0MiSTYaAUkVJRJENhoCSRUlEkQ2GgNHAhUkEkQXIillRESID+OID+giKWVEgTISFEQiJxtlREEACSInG2VEMgcORCInHGVEQQAJMgciJxxlRAxEMQBLBElOAhJEJwhLAVBJRQhJvUUBRCcISwVJTgJQSUUJvUUBREsCiAncSYgJ2E8CE0RLAUlETL5EJVsORCIqZUQiJwRlRA9AAA4iKmVEiArogQlbMgcNREsDSYgKM0sDSU4CiAoriAmuRgKICalGAksFSb5EJVtLAklOAksBDkRLAQkWTwIlTwK7SwVJvkQlW08CCBYlTLsoSwJQsCNDNhoBSRUlEkQ2GgJJFSMSRCJTJxUxAIgOv0QnCE8CUEm9RQFESYEwI7oiTwNUgTBMuzIHFihMULAjQzYaAUkVJRJENhoCSRUlEkQnFzEAiA6HRCIpZUSByAESFESIDreIDrwnCE8CUEm9RQEURCIWTwJLAVBLAVAnKFBLAVBLAVBLAVBLAVBMUL8yBxYoTFCwI0M2GgFJFSUSRDYaAkkVJRJEJwhLAlBJvUUBRDEATwMSRIgOYYgOZiJPArsyBxYoTFCwI0M2GgFJFSUSRCcITFBJvUUBRL5IKExQsCNDNhoBSRUlEkQnEkxnMgcWKExQsCNDgABJNhoBRwIVgWsSRDYaAklOAhWBSBJENhoDSU4CSRVLASVZSYEiEkRPAkxLAlJJTgMiWYEkCBJEiA3dIlVJJwxLAWdBACJJIxJAABxJgQISQAAVSYEDEkAADkmBBBJAAAdJgQUSQQGGI0QiJwxlTEUCREsESYEhW0lFCESBOVVJRQhBAB9LBiMSQAAYSwaBAhJAABBLBoEDEkAACEsGgQQSQQFGI0RJIxNBAAhLBIGSBlMURCIpZUQURCInFGVEFERLBEkjW0lxC0UBRCcsSwFnSwGBCVtJTwISRCcTSwFnsTIAMgoishKyFEyyEYEEshCyAbNJgRFbJw1MZycKImcnLksIZ0mBKVsnGksBZ0sBgTFbJy1LAWdLBklOAoEwWycOTGcnFEsKZ0sDgZIGUyciTGdLAYEQWytMZ0sBgShbJwZMZ0sBJVsnCUxnSwGBGFsnB0xnSwOBOlsnI0xnSwOBQlsnJExnSwOBSlsnHUxnSwOBUlsnHkxnSwOBWlsnJUxnSwOBkAZTJyZMZ0sDgZEGUycnTGdPA4FjWycFTGdLASRbKkxnSwGBOFsnEExnSwGBQFsnEUxnJw8iZycLImdLAjIHDURMIltLAgxEDERLAlcAICcqTGdLAVcCACcrTGcyBxYoTFCwI0MiQv63IkL+dyKAAEcDNhoBSRUkEkQXSTYaAkkVIxJEIlNMNhoDSU4CSSJZSU4DSYFBC4ECCE8CFRJEiAvxIicMZUxOA0QiKWVEFERJgRAORCInFGVEREyBEAtMgWQLgeYLCEkyDA1BABixgQayEIEFshknL7IeJy+yHyKyAbNC/+EiRQpLCUsEDEEAjksEVwIASUUNSwpJTgKBQQuBQVhJJFVJTgJFDkkiW0lFDUsFTwQISwESREsFTwOIBzRMgQlbSUUKREEAGUsJQQAnSwkjCYFBC0sMTIFBWIEJW0sIDkRLCEAABUsKIxJESwkjCEUKQv+QSwZJRCMJFicfTFBJvUUBREkigQK6F0lEIwmBQQuBAgiBQbpC/8BLBhYnH0xQSbxISwW/SwVBAA1LAUsECCcETGcpgTJnMgcWKExQsCNDIillRESICuSICuuICvAiKmVEIicEZURLAQ1EiAZcSVcIAUmAAQGoREsBVwAISwJXCQhLA1cRCEsEVxkISwVXIQhLBlcpCEsHVzEISwhXOQhPB08IUE8HUE8GUE8FUCIWUE8EUE8DUE8CUExQiAePRgIyBxYoTFCwI0MiRwSAAEk2GgFJFSQSRBc2GgJHAhWBSRJEIillRESICluICmCBQVtJgQQaQQC2IicMZUSBBRJEiAo4IicMZURJgQUSREsCSSJbSUUHIicEZUQSRElXCAFFDCRViAXXIicEZUSBEAqAAgAARQcWJx9MUElFCb1FAUEAB0sHvkxFB0RLBUkiWUmBEAxESwNJVwkISwFXEQhLAlcZCEsDVykISwRXMQhPBVc5CEsLFksSUE8GUE8FUE8EUE8DUE8CUExQSwMWUE8CTFBMIwgWVwYCXABLCEm8SEy/IicEZUQjCCcETGciKmVESwNJTwISRIgFDklFCElXCAFFCiRVSUUGIxJAAChLBIEEEkAAIEsEgQwSQAAYSwSBCxJAABBLBIESEkAACEsEgQUSQQBBI0RLCIABAalESwSBDBJAAAhLBIELEkEAJCNBABonGDEAiAjtREsGSwKIBitGAjIHFihMULAjQ4gJC0L/6CJC/9kiQv+8IillRElEIicMZUQWSZMkDkRXBwEiJw1lRCInCmVEIicUZUQiKmVEIicEZUQiK2VEIicHZUQiJwllRCInBmVEIicQZUQiJxFlRCInD2VEIicLZURPDhZPDkxQTw0WUE8MFlBPCxZQTwoWUE8JFlBPCBZQTwcWUE8GFlBPBRZQTwQWUE8DFlBPAhZQTBZQKExQsCNDIillREQiKmVEIicEZUQPQQAlIiplRBYnKFAiFkxLAVBLAVBLAVBLAVBLAVBLAVBMUChMULAjQyIqZUSIA71C//CICCkjQzYaAUkVJRJEiAgcJxJMZzIHFihMULAjQzYaAUkVJRJEiAgEJxlMZzIHFihMULAjQzYaAUkVIxJENhoCSU4CFSUSRDYaA0lOAhWBEBJEiAfXiAfeF0cCiAfogRQSQQAOJxJLA2cyBxYoTFCwI0NJgSgSQQARJxdLA1BJvUUBFERLAr9C/99JgTISQQARJxZLA1BJvUUBFERLAr9C/8dJgTwSQQARJyBLA1BJvUUBFERLAr9C/69JgUYSQQARJxVLA1BJvUUBFERLAr9C/5dJgVASQf+QJxhLA1BJvUUBFERLAr9C/382GgFJFSMSRDYaAklOAhUlEkSIBy2IBzQXRwKIBz5JgRQTRIEoEkEAFScXSwJQSb1FAUS8SDIHFihMULAjQ0mBMhJBAA8nFksCUEm9RQFEvEhC/+FJgTwSQQAPJyBLAlBJvUUBRLxIQv/LSYFGEkEADycVSwJQSb1FAUS8SEL/tUmBUBJB/64nGEsCUEm9RQFEvEhC/582GgFJFSMSRCJTJxUxAIgGZ0QnIUxnMgcWKExQsCNDIicSZUQoTFCwI0M2GgFJFSUSRCcXSwGIBj8nFksCiAY4JyBLA4gGMScVSwSIBionGE8FiAYjJygiTwZUI08FVIECTwRUgQNPA1SBBE8CVChMULAjQzYaAUkVIxJENhoCSU4CFSUSRBdJiAY7gwYUKDI8RlBPBo4GAE8AQAAxACIAEwABACcYSwFQSb1FAUS+SChMULAjQycVSwFQSb1FAUS+SEL/6ycgSwFQSb1FAUS+SEL/3CcWSwFQSb1FAUS+SEL/zScXSwFQSb1FAUS+SEL/voAQAAAAAAAAAAAAAAAAAAAAAEL/qYoBACcIi/9QvkSBgANTFESJigECJwiL/1BJvUUBREm+SCInEGVESwGBOVsJIicRZURLAoFBWwlLAiVbIicFZURPA0sCTwKIAJgiJwVlRE8DTwNPAogAiksCgUlbSwIIFk8DTFxJSYFRW0sCCBZcUSInEGVEFlw5IicRZUQWXEEiKmVEFlwxTwNMv4mKAQAigAAnCIv/UEm9RQFEIillRIEyEkEAAYmLAr5MSU4CjABEgShbSYwBQAABiYsASSVbiwFJTgMIFlwgIhZcKIsCTL8iJwplRElLAg9ETAknCkxniYoDAYv9QQAFi/5AAAIiiYv9i/4di/+XiYoBAYv/QAACIokiJw1lRElEIicFZUSL/0xPAoj/yomKAQGL/0AAAiKJIicNZUQiJwVlRIv/TIj/r4mKAQEiJwRlRIv/DUSL/4EQChYnH0xQSb1FAUSL/4EQGEsBIoECuhdLAQ1EgUELgQIIgUG6iYoCAIv/IxJAAB+L/yQSQAAYi/+BExJAABCL/4EMEkAACIv/gQsSQQADI0SJi/5AAAQiQv/1i/6BAxJAAAiL/oECEkEAGIv/gQMSQAAIi/+BEhJBAAQjQv/RIkL/zYv+IxJBACCL/4EDEkAAEIv/gRISQAAIi/+BBRJBAAQjQv+qIkL/pov+gQQSQQAoi/+BAxJAABiL/4EEEkAAEIv/gRISQAAIi/+BBRJBAAQjQv96IkL/dov+gQUSQQAIi/+BAxJC/2YiQv9iIicMZUQjEkEACiInImVEQQACI4kiiYoBAov/gRFbSUEAECInCWVEQQAIIicHZURAAAYii/9PAokiJwdlRCInCWVEIicFZUSI/mciJwVlRIsATIj+XIv/TwKJigIBi/9AAAOL/okiJwVlRCInCWVEi/9LAoj+OwhJRCInBWVEi/5MTwKI/iuJigICIoAARwiL/iJbIiplRBJEi/6BCVsyBw5Ei/4kVUkjEklBAF0iKWVEgTISRCInCmVEIicNZUQSRIv+gTFbK0sBZycHTGeL/oEhWycJTGcnBiJni/6BKVsnDkxnIiplRCMIKkxnKYFkZ4sLRCInFGVEi/5MIogBxUmM/ov/jAGMAIkiKWVEgTISFEQiJwZlRIv+iP75jP4IJwZMZ4sKgQwSQQFji/+BIVsiJyRlRCInBWVEiP1zIicjZUQIjAYiJyZlREEAEyInHWVEiwYNQQAIIicdZUyMBkQiJydlREEAEyInHmVEiwYMQQAIIiceZUyMBkQnCYsGZ4sKgQQSQQDzi/6BMVsrSwFnJwdMZ4j+Z0EA1IsKgQUSQQCyIicFZUyMAkQijAEijAeL/oEZW0mMCEEAD4sCiwiI/pZJjAIjjAeMASIqZUQjCIwDIicEZUSLAw1BAFKLA4j9H0mMACRVSYwEgQMSQAAQiwSBExJBADOLAIEZW0EAKyNBAAiLB0EADCKMB4sDIwiMA0L/vYsAgRlbiwJMiP44SYwCiwEIjAFC/+EiQv/SiwFEIitlRIv+gTlbJBpAAAYiJwZlRAgiJwVlRIsBiPxfJw5MZyIqZUQjCCpMZ4v+IkmIAF9JjP6L/4wBjACJi/6BKVsnDkxnQv/aiwqBEhJB/xIiK2VEJwdMZ0L/B4sKgQsSQQAbi/6BIVtJjAVAAAgiJyVlTIwFRCcJiwVnQv7Pi/6BIVtJjAlB/sQnCYsJZ0L+vIoDATIIi/0iW4v9VwgBi/1XCQgyB4v9JFWL/kAARSMWSZMkDkRXBwEiJxNlRIsBSSMIiwAWTwIWUIsCUIsDUIsEFlCL/hZQTwNQi/8WUE8CFlBMFlCABJozK5VMULCL/YwAiYsFIxJAAAiLBYEEEkEABCNC/6mB/wFC/6OKAgGAAIv+i/9QSb1FAUEAH4sBvkQiWzIHSYwADkEAEIsBvkQkW4sAD0EABCOMAIkiQv/5MQAiJxJlRBJEiSInKWVEFESJIichZUQURImKAQCL/4EUEkAAMIv/gRkSQAAoi/+BKBJAACCL/4EyEkAAGIv/gTwSQAAQi/+BRhJAAAiL/4FQEkEAAyNEiSJC//o=", "clear": "DIEBQw=="}, "desc": "Debt Algorand Standard Application.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "networks": {}, "source": {"approval": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCAzMgogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1ICJzdGF0dXMiICJldmVudF9jdXJzb3IiICJvdXRzdGFuZGluZ19wcmluY2lwYWwiICJzY2hlZHVsZV9lbnRyeV9jb3VudCIgImZpeGVkX3BvaW50X3NjYWxlIiAiYWNjcnVlZF9pbnRlcmVzdCIgImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMgIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIgInJlc2VydmVkX3VuaXRzX3RvdGFsIiAicmVzZXJ2ZWRfcHJpbmNpcGFsIiAiY29udHJhY3RfdHlwZSIgInRvdGFsX3VuaXRzIiAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIgInJlc2VydmVkX2ludGVyZXN0IiAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIgImN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IiAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMgInNldHRsZW1lbnRfYXNzZXRfaWQiICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIgMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMgMHg1MjIzNTA3MjY5NmQ2MTcyNzk0NDY1NjE2YzY1NzIyMyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMgMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzIDB4NTIyMzRmNzA0NDYxNjU2ZDZmNmUyMyAiaW5pdGlhbF9leGNoYW5nZV9kYXRlIiAidHJhbnNmZXJfb3BlbmluZ19kYXRlIiAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIiAicmF0ZV9yZXNldF9mbG9vciIgInJhdGVfcmVzZXRfY2FwIiAweDUzMjMgMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMyAiYXNzZXRfc3VzcGVuZGVkIiAiZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiIgInJhdGVfcmVzZXRfc3ByZWFkIiAicmF0ZV9yZXNldF9tdWx0aXBsaWVyIiAicmF0ZV9yZXNldF9uZXh0IiAiaGFzX3JhdGVfcmVzZXRfZmxvb3IiICJoYXNfcmF0ZV9yZXNldF9jYXAiIDB4MDAgImFzc2V0X2RlZmF1bHRlZCIgInByb3NwZWN0dXNfaGFzaCIgInByb3NwZWN0dXNfdXJsIiAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIiAibWF0dXJpdHlfZGF0ZSIgImRheV9jb3VudF9jb252ZW50aW9uIiAweDA2ODEwMQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4LTI5CiAgICAvLyAjIFJCQUMgUm9sZXMKICAgIC8vIHNlbGYuYXJyYW5nZXIgPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX0FSUkFOR0VSKQogICAgYnl0ZWMgMTggLy8gMHg1MjIzNDE3MjcyNjE2ZTY3NjU3MjIzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzAKICAgIC8vIHNlbGYub3BfZGFlbW9uID0gR2xvYmFsU3RhdGUoQWNjb3VudCgpLCBrZXk9Y3N0LlBSRUZJWF9JRF9PUF9EQUVNT04pCiAgICBieXRlYyAyNSAvLyAweDUyMjM0ZjcwNDQ2MTY1NmQ2ZjZlMjMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo0Ny00OAogICAgLy8gIyBELUFTQSBHb3Zlcm5hbmNlCiAgICAvLyBzZWxmLmFzc2V0X3N1c3BlbmRlZCA9IEZhbHNlCiAgICBieXRlYyAzMyAvLyAiYXNzZXRfc3VzcGVuZGVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NDkKICAgIC8vIHNlbGYuYXNzZXRfZGVmYXVsdGVkID0gRmFsc2UKICAgIGJ5dGVjIDQxIC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU2LTU3CiAgICAvLyAjIENvbnRyYWN0CiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU4CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMTIgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYwLTYxCiAgICAvLyAjIFByb3NwZWN0dXMgKEluZm9ybWF0aW9uYWwpCiAgICAvLyBzZWxmLnByb3NwZWN0dXNfaGFzaCA9IEJ5dGVzKCkKICAgIGJ5dGVjIDQyIC8vICJwcm9zcGVjdHVzX2hhc2giCiAgICBwdXNoYnl0ZXMgMHgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2MgogICAgLy8gc2VsZi5wcm9zcGVjdHVzX3VybCA9IFN0cmluZygpCiAgICBieXRlYyA0MyAvLyAicHJvc3BlY3R1c191cmwiCiAgICBwdXNoYnl0ZXMgIiIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2NC02NQogICAgLy8gIyBEZW5vbWluYXRpb24KICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gQXNzZXQoKQogICAgYnl0ZWMgNDQgLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjYKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCA9IEFzc2V0KCkKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2OC02OQogICAgLy8gIyBUaW1lCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgMjYgLy8gImluaXRpYWxfZXhjaGFuZ2VfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzAKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgNDUgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjcxCiAgICAvLyBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgMjcgLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzIKICAgIC8vIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlID0gdHlwLlRpbWVTdGFtcCgpCiAgICBieXRlYyAyOCAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3NC03NQogICAgLy8gIyBEYXkgQ291bnQgQ29udmVudGlvbgogICAgLy8gc2VsZi5kYXlfY291bnRfY29udmVudGlvbiA9IFVJbnQ2NCgpCiAgICBieXRlYyA0NiAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojc3LTc4CiAgICAvLyAjIFVuaXRzCiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzID0gVUludDY0KCkKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzkKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPSBVSW50NjQoKQogICAgYnl0ZWMgMTAgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MS04MgogICAgLy8gIyBQcmluY2lwYWwKICAgIC8vIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPSBVSW50NjQoKQogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MwogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBVSW50NjQoKQogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4NAogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gVUludDY0KCkKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4NQogICAgLy8gc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gRmFsc2UKICAgIGJ5dGVjIDM0IC8vICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4Ny04OAogICAgLy8gIyBJbnRlcmVzdAogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gVUludDY0KCkKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojg5CiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgPSBVSW50NjQoKQogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTEtOTIKICAgIC8vICMgSW50ZXJlc3QgUmF0ZXMKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTMKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQgPSBVSW50NjQoKQogICAgYnl0ZWMgMzUgLy8gInJhdGVfcmVzZXRfc3ByZWFkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NAogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIgPSBVSW50NjQoKQogICAgYnl0ZWMgMzYgLy8gInJhdGVfcmVzZXRfbXVsdGlwbGllciIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTUKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9mbG9vciA9IFVJbnQ2NCgpCiAgICBieXRlYyAyOSAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTYKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9jYXAgPSBVSW50NjQoKQogICAgYnl0ZWMgMzAgLy8gInJhdGVfcmVzZXRfY2FwIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NwogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X25leHQgPSBVSW50NjQoKQogICAgYnl0ZWMgMzcgLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTgKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgPSBGYWxzZQogICAgYnl0ZWMgMzggLy8gImhhc19yYXRlX3Jlc2V0X2Zsb29yIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5OQogICAgLy8gc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgPSBGYWxzZQogICAgYnl0ZWMgMzkgLy8gImhhc19yYXRlX3Jlc2V0X2NhcCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTAxLTEwMgogICAgLy8gIyBQcmltYXJ5IERpc3RyaWJ1dGlvbgogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgPSBVSW50NjQoKQogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTAzCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0ID0gVUludDY0KCkKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA1LTEwNgogICAgLy8gIyBDdW11bGF0aXZlIFBlci1Vbml0IEZpeGVkLVBvaW50IEluZGV4ZXMKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA3CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4ID0gVUludDY0KCkKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTE1CiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciA9IFVJbnQ2NCgpCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExNgogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA9IFVJbnQ2NCgpCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTE4LTExOQogICAgLy8gIyBTY2FsaW5nCiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlID0gVUludDY0KCkKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6MjMKICAgIC8vIGFzc2VydCBUeG4uZ2xvYmFsX251bV9ieXRlX3NsaWNlID09IGNmZy5HTE9CQUxfQllURVMsIGVyci5XUk9OR19HTE9CQUxfQllURVMKICAgIHR4biBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgQnl0ZXMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjI0CiAgICAvLyBhc3NlcnQgVHhuLmdsb2JhbF9udW1fdWludCA9PSBjZmcuR0xPQkFMX1VJTlRTLCBlcnIuV1JPTkdfR0xPQkFMX1VJTlRTCiAgICB0eG4gR2xvYmFsTnVtVWludAogICAgcHVzaGludCAzNwogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgVUludHMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBhc3NlcnQgVHhuLmxvY2FsX251bV9ieXRlX3NsaWNlID09IGNmZy5MT0NBTF9CWVRFUywgZXJyLldST05HX0xPQ0FMX0JZVEVTCiAgICB0eG4gTG9jYWxOdW1CeXRlU2xpY2UKICAgICEKICAgIGFzc2VydCAvLyBXcm9uZyBMb2NhbCBCeXRlcyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6MjYKICAgIC8vIGFzc2VydCBUeG4ubG9jYWxfbnVtX3VpbnQgPT0gY2ZnLkxPQ0FMX1VJTlRTLCBlcnIuV1JPTkdfTE9DQUxfVUlOVFMKICAgIHR4biBMb2NhbE51bVVpbnQKICAgICEKICAgIGFzc2VydCAvLyBXcm9uZyBMb2NhbCBVSW50cyBhbGxvY2F0aW9uCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kX2FzYS9jb250cmFjdC5weTo4LTE4CiAgICAvLyBjbGFzcyBEQVNBKAogICAgLy8gICAgIFBheW1lbnRBZ2VudCwKICAgIC8vICAgICBUcmFuc2ZlckFnZW50LAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gICAgIGF2bV92ZXJzaW9uPTEyLAogICAgLy8gKToKICAgIHB1c2hieXRlcyAweDkxNGYwNGViIC8vIG1ldGhvZCAiY29udHJhY3RfdXBkYXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9jb250cmFjdF91cGRhdGVfcm91dGVANAoKbWFpbl9zd2l0Y2hfY2FzZV9uZXh0QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6OC0xOAogICAgLy8gY2xhc3MgREFTQSgKICAgIC8vICAgICBQYXltZW50QWdlbnQsCiAgICAvLyAgICAgVHJhbnNmZXJBZ2VudCwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBhdm1fdmVyc2lvbj0xMiwKICAgIC8vICk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBieiBtYWluX2NyZWF0ZV9Ob09wQDMxCiAgICBwdXNoYnl0ZXNzIDB4YjQ0NjE4YzggMHhlNzgzMjUyOSAweDdlYTIwZTBiIDB4NmM4NWUzZWUgMHhiZGQxYTk0NCAweGRjMDYzYjM1IDB4MTRmYzEwZWYgMHg3NGE3Mjk3ZiAweDA5ZDRmZTE0IDB4OWE5YmZhODUgMHg4NWVlZDMzZCAweDkxODUxMDRhIDB4ZDlmMjI1YWMgMHg2ZTBlNWM5NSAweGZmM2ZkNGIzIDB4ODJmNzFiMmQgMHhlZjA0ZjVkMyAweGRmMzQzNTUwIDB4M2RiZTgwYmQgMHhkZjU0ZTgyYyAweDAxMGM4Mjk5IDB4NzQwNmFjZDIgMHgxYTcyYTJlZSAvLyBtZXRob2QgImZ1bmRfZHVlX2Nhc2hmbG93cyh1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJjbGFpbV9kdWVfY2FzaGZsb3dzKGFkZHJlc3MsYnl0ZVtdKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYnl0ZVtdKSIsIG1ldGhvZCAic2V0X3RyYW5zZmVyX3NjaGVkdWxlKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbihhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInRyYW5zZmVyKGFkZHJlc3MsYWRkcmVzcyx1aW50NjQpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X2dvdl9zdXNwZW5zaW9uKGFkZHJlc3MsYm9vbCl1aW50NjQiLCBtZXRob2QgImFjY291bnRfb3BlbihhZGRyZXNzLGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X3VwZGF0ZV9wYXltZW50X2FkZHJlc3MoYWRkcmVzcyxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAiYWNjb3VudF9nZXRfcG9zaXRpb24oYWRkcmVzcykoYWRkcmVzcyx1aW50NjQsdWludDY0LGJvb2wsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImNvbnRyYWN0X2NvbmZpZygodWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYm9vbCxib29sLGJvb2wsdWludDY0KSwodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpLChieXRlWzMyXSxzdHJpbmcpKXVpbnQ2NCIsIG1ldGhvZCAiY29udHJhY3Rfc2NoZWR1bGUodWludDY0LGJvb2wsKHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpW10pdWludDY0IiwgbWV0aG9kICJleGVjdXRlX2llZCgpdWludDY0IiwgbWV0aG9kICJhcHBseV9ub25fY2FzaF9ldmVudCh1aW50NjQsKHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSl1aW50NjQiLCBtZXRob2QgImdldF9jb250cmFjdF9zdGF0ZSgpKHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJnZXRfbmV4dF9kdWVfZXZlbnQoKSh1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAicmJhY19yb3RhdGVfYXJyYW5nZXIoYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgInJiYWNfc2V0X29wX2RhZW1vbihhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19hc3NpZ25fcm9sZSh1aW50OCxhZGRyZXNzLCh1aW50NjQsdWludDY0KSl1aW50NjQiLCBtZXRob2QgInJiYWNfcmV2b2tlX3JvbGUodWludDgsYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgInJiYWNfZ292X2Fzc2V0X3N1c3BlbnNpb24oYm9vbCl1aW50NjQiLCBtZXRob2QgInJiYWNfZ2V0X2FycmFuZ2VyKClhZGRyZXNzIiwgbWV0aG9kICJyYmFjX2dldF9hZGRyZXNzX3JvbGVzKGFkZHJlc3MpKGJvb2wsYm9vbCxib29sLGJvb2wsYm9vbCkiLCBtZXRob2QgInJiYWNfZ2V0X3JvbGVfdmFsaWRpdHkodWludDgsYWRkcmVzcykodWludDY0LHVpbnQ2NCkiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBmdW5kX2R1ZV9jYXNoZmxvd3MgY2xhaW1fZHVlX2Nhc2hmbG93cyBzZXRfdHJhbnNmZXJfc2NoZWR1bGUgcHJpbWFyeV9kaXN0cmlidXRpb24gdHJhbnNmZXIgYWNjb3VudF9nb3Zfc3VzcGVuc2lvbiBhY2NvdW50X29wZW4gYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzIGFjY291bnRfZ2V0X3Bvc2l0aW9uIGNvbnRyYWN0X2NvbmZpZyBjb250cmFjdF9zY2hlZHVsZSBleGVjdXRlX2llZCBhcHBseV9ub25fY2FzaF9ldmVudCBnZXRfY29udHJhY3Rfc3RhdGUgZ2V0X25leHRfZHVlX2V2ZW50IHJiYWNfcm90YXRlX2FycmFuZ2VyIHJiYWNfc2V0X29wX2RhZW1vbiByYmFjX2Fzc2lnbl9yb2xlIHJiYWNfcmV2b2tlX3JvbGUgcmJhY19nb3ZfYXNzZXRfc3VzcGVuc2lvbiByYmFjX2dldF9hcnJhbmdlciByYmFjX2dldF9hZGRyZXNzX3JvbGVzIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHkKICAgIGVycgoKbWFpbl9jcmVhdGVfTm9PcEAzMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kX2FzYS9jb250cmFjdC5weTo4LTE4CiAgICAvLyBjbGFzcyBEQVNBKAogICAgLy8gICAgIFBheW1lbnRBZ2VudCwKICAgIC8vICAgICBUcmFuc2ZlckFnZW50LAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gICAgIGF2bV92ZXJzaW9uPTEyLAogICAgLy8gKToKICAgIHB1c2hieXRlcyAweDk1NmQ3MTU2IC8vIG1ldGhvZCAiY29udHJhY3RfY3JlYXRlKGFkZHJlc3MpdWludDY0IgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggY29udHJhY3RfY3JlYXRlCiAgICBlcnIKCm1haW5fY29udHJhY3RfdXBkYXRlX3JvdXRlQDQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBwdXNoaW50IDQgLy8gVXBkYXRlQXBwbGljYXRpb24KICAgID09CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydAogICAgYiBjb250cmFjdF91cGRhdGUKCgovLyBtb2R1bGVzLnBheW1lbnRfYWdlbnQuUGF5bWVudEFnZW50LmZ1bmRfZHVlX2Nhc2hmbG93c1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmZ1bmRfZHVlX2Nhc2hmbG93czoKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gMTAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjUwCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo1MQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo1MgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNDcKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NTUKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NTYtNTcKICAgIC8vIGZ1bmRlZF9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgLy8gZnVuZGVkX3ByaW5jaXBhbCA9IFVJbnQ2NCgwKQogICAgZHVwbiAyCgpmdW5kX2R1ZV9jYXNoZmxvd3Nfd2hpbGVfdG9wQDI6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjAKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgPCBtYXhfZXZlbnRfY291bnQKICAgIGRpZyAyCiAgICBkaWcgNAogICAgPAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjYwLTYxCiAgICAvLyBwcm9jZXNzZWRfZXZlbnRzIDwgbWF4X2V2ZW50X2NvdW50CiAgICAvLyBhbmQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAOQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjYxCiAgICAvLyBhbmQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIDwKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2MC02MQogICAgLy8gcHJvY2Vzc2VkX2V2ZW50cyA8IG1heF9ldmVudF9jb3VudAogICAgLy8gYW5kIHNlbGYuZXZlbnRfY3Vyc29yIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudAogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDkKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2MwogICAgLy8gZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoc2VsZi5ldmVudF9jdXJzb3IpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgZHVwCiAgICBidXJ5IDE3CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjQKICAgIC8vIGlmIGVudHJ5LnNjaGVkdWxlZF90aW1lID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXA6CiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgNgogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPgogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl93aGlsZUA5CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjYKICAgIC8vIGlmIG5vdCBzZWxmLl9ldmVudF9pc19jYXNoKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkpOgogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBidXJ5IDE2CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozNTEKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgaW50Y18yIC8vIDgKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjM1MC0zNTQKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX01EKSwKICAgIC8vICkKICAgID09CiAgICBkdXAKICAgIGJ1cnkgNwogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX3RydWVANTAKICAgIGRpZyAxNAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzUyCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzUwLTM1NAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfTUQpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDUwCiAgICBkaWcgMTQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjM1MwogICAgLy8gVUludDY0KGVudW1zLkVWVF9NRCksCiAgICBwdXNoaW50IDE5CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozNTAtMzU0CiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9NRCksCiAgICAvLyApCiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VANTEKCmZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX3RydWVANTA6CiAgICBpbnRjXzEgLy8gMQoKZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfbWVyZ2VANTI6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjYKICAgIC8vIGlmIG5vdCBzZWxmLl9ldmVudF9pc19jYXNoKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkpOgogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDkKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU0OAogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X2lkID09IHNlbGYuZXZlbnRfY3Vyc29yLCBlcnIuSU5WQUxJRF9FVkVOVF9DVVJTT1IKICAgIGRpZyAxNQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBjdXJzb3IKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU0OQogICAgLy8gYXNzZXJ0IGVudHJ5LnNjaGVkdWxlZF90aW1lIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLCBlcnIuTk9fRFVFX0NBU0hGTE9XCiAgICBkaWcgNAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPD0KICAgIGFzc2VydCAvLyBObyBkdWUgY2FzaGZsb3cgdG8gcGF5CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0MTMKICAgIC8vIGlmIGV2ZW50X3R5cGUgbm90IGluIChVSW50NjQoZW51bXMuRVZUX0lQKSwgVUludDY0KGVudW1zLkVWVF9NRCkpOgogICAgZGlnIDUKICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxMwogICAgZGlnIDE0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDEzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0MTQKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDEzCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfaW50ZXJlc3RfYW1vdW50QDE0OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDI2CiAgICAvLyBldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBidXJ5IDE2CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0MjcKICAgIC8vIGlmIGV2ZW50X3R5cGUgbm90IGluIChVSW50NjQoZW51bXMuRVZUX1BSKSwgVUludDY0KGVudW1zLkVWVF9NRCkpOgogICAgcHVzaGludCAzCiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE3CiAgICBkaWcgMTQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTcKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQyOAogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnRAMjY6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1NTMKICAgIC8vIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGRpZyAxNQogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgMTAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU1NgogICAgLy8gaWYgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCk6CiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUAyNwogICAgZGlnIDkKICAgIGJ1cnkgMTEKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM2OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTcyLTU3NAogICAgLy8gIyBGdW5kaW5nIHVzZXMgcGVyLXVuaXQgY3VtdWxhdGl2ZSBpbmRpY2VzIHNvIGVhY2ggaG9sZGVyIGNhbiBzZXR0bGUKICAgIC8vICMgaW5kZXBlbmRlbnRseSBmcm9tIGl0cyBjdXJyZW50IHVuaXQgYmFsYW5jZS4KICAgIC8vIGludGVyZXN0X2luZGV4X2RlbHRhID0gc2VsZi5fYW1vdW50X3RvX2luZGV4X2RlbHRhKGludGVyZXN0X2Ftb3VudF9kdWUpCiAgICBkaWcgMTIKICAgIGNhbGxzdWIgX2Ftb3VudF90b19pbmRleF9kZWx0YQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTc1CiAgICAvLyBwcmluY2lwYWxfaW5kZXhfZGVsdGEgPSBzZWxmLl9hbW91bnRfdG9faW5kZXhfZGVsdGEocHJpbmNpcGFsX2Ftb3VudF9kdWUpCiAgICBkaWcgOAogICAgY2FsbHN1YiBfYW1vdW50X3RvX2luZGV4X2RlbHRhCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1NzYKICAgIC8vIGludGVyZXN0X2Ftb3VudCA9IHNlbGYuX2luZGV4X2RlbHRhX3RvX2Ftb3VudChpbnRlcmVzdF9pbmRleF9kZWx0YSkKICAgIGRpZyAxCiAgICBjYWxsc3ViIF9pbmRleF9kZWx0YV90b19hbW91bnQKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSAxNwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTc3CiAgICAvLyBwcmluY2lwYWxfYW1vdW50ID0gc2VsZi5faW5kZXhfZGVsdGFfdG9fYW1vdW50KHByaW5jaXBhbF9pbmRleF9kZWx0YSkKICAgIGR1cAogICAgY2FsbHN1YiBfaW5kZXhfZGVsdGFfdG9fYW1vdW50CiAgICBkdXAKICAgIGJ1cnkgMTMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU3OAogICAgLy8gcmVxdWlyZWRfYW1vdW50ID0gaW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudAogICAgZGlnIDIKICAgIGRpZyAxCiAgICArCiAgICBkdXAKICAgIGJ1cnkgMTIKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjcyNwogICAgLy8gYmFsYW5jZSA9IHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQ1NgogICAgLy8gcmV0dXJuIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgKyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIGRpZyAxCiAgICArCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3MjkKICAgIC8vIGFzc2VydCBiYWxhbmNlID49IHJlc2VydmVkX3RvdGFsLCBlcnIuTk9UX0VOT1VHSF9GVU5EUwogICAgZGlnIDIKICAgIGRpZyAxCiAgICA+PQogICAgYXNzZXJ0IC8vIE5vdCBlbm91Z2ggZnVuZHMgZm9yIHRoZSBwYXltZW50CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3MzAKICAgIC8vIHJldHVybiBiYWxhbmNlIC0gcmVzZXJ2ZWRfdG90YWwKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgLQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTgwCiAgICAvLyBzZWxmLl9hdmFpbGFibGVfc2V0dGxlbWVudF9mdW5kcygpID49IHJlcXVpcmVkX2Ftb3VudAogICAgdW5jb3ZlciAyCiAgICA+PQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTc5LTU4MQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLl9hdmFpbGFibGVfc2V0dGxlbWVudF9mdW5kcygpID49IHJlcXVpcmVkX2Ftb3VudAogICAgLy8gKSwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTgzCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0ICs9IGludGVyZXN0X2Ftb3VudAogICAgdW5jb3ZlciAzCiAgICArCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTg0CiAgICAvLyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCArPSBwcmluY2lwYWxfYW1vdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICArCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU4NQogICAgLy8gc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4ICs9IGludGVyZXN0X2luZGV4X2RlbHRhCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCBleGlzdHMKICAgIHVuY292ZXIgMgogICAgKwogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTg2CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4ICs9IHByaW5jaXBhbF9pbmRleF9kZWx0YQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCBleGlzdHMKICAgICsKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1ODcKICAgIC8vIGlmIGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkgPT0gVUludDY0KGVudW1zLkVWVF9QUik6CiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBwdXNoaW50IDMKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDM4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1ODgtNTg5CiAgICAvLyAjIEZvciBQUiwgdGhlIHBlcmlvZCBpbnRlcmVzdCBzdGF5cyBhY2NydWVkIHVudGlsIGEgbGF0ZXIgSVAgb3IgTUQuCiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgKz0gc2VsZi5fZW50cnlfaW50ZXJlc3Rfc2VnbWVudChlbnRyeSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBkaWcgMTYKICAgIGNhbGxzdWIgX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQKICAgIGJ1cnkgMTgKICAgICsKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzk6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1OTIKICAgIC8vIGlmIG5vdCBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKSBvciBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NCgKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlANDEKICAgIGRpZyAxNQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU5Mi01OTQKICAgIC8vIGlmIG5vdCBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKSBvciBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NCgKICAgIC8vICAgICBlbnVtcy5FVlRfTUQKICAgIC8vICk6CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDIKCmZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDQxOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTk1CiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBkaWcgMTUKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0MjoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU5NgogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgZGlnIDEwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTk3CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBuZXh0X2ludGVyZXN0X2Jhc2UKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBkaWcgMTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1OTgKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYwMAogICAgLy8gaWYgZW50cnkuZXZlbnRfdHlwZSA9PSBhcmM0LlVJbnQ4KAogICAgZGlnIDE1CiAgICBleHRyYWN0IDggMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjAwLTYwMgogICAgLy8gaWYgZW50cnkuZXZlbnRfdHlwZSA9PSBhcmM0LlVJbnQ4KAogICAgLy8gICAgIGVudW1zLkVWVF9NRAogICAgLy8gKSBhbmQgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPT0gVUludDY0KDApOgogICAgcHVzaGJ5dGVzIDB4MTMKICAgIGI9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYwMgogICAgLy8gKSBhbmQgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPT0gVUludDY0KDApOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2MDAtNjAyCiAgICAvLyBpZiBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoCiAgICAvLyAgICAgZW51bXMuRVZUX01ECiAgICAvLyApIGFuZCBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9PSBVSW50NjQoMCk6CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYwMwogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX0VOREVEKQogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgcHVzaGludCAyMDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2MDQKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDU6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2MDYtNjEwCiAgICAvLyBzZWxmLl9lbWl0X2V4ZWN1dGlvbl9ldmVudCgKICAgIC8vICAgICBlbnRyeT1lbnRyeSwKICAgIC8vICAgICBwYXlvZmY9aW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudCwKICAgIC8vICAgICBzZXR0bGVkX2Ftb3VudD1pbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50LAogICAgLy8gKQogICAgZGlnIDE1CiAgICBkaWcgNwogICAgZHVwCiAgICBjYWxsc3ViIF9lbWl0X2V4ZWN1dGlvbl9ldmVudAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzAKICAgIC8vIGZ1bmRlZF9pbnRlcmVzdCArPSBpbnRlcmVzdF9hbW91bnQKICAgIGRpZyAxCiAgICBkaWcgMTQKICAgICsKICAgIGJ1cnkgMgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjcxCiAgICAvLyBmdW5kZWRfcHJpbmNpcGFsICs9IHByaW5jaXBhbF9hbW91bnQKICAgIGR1cAogICAgZGlnIDkKICAgICsKICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjcyCiAgICAvLyBwcm9jZXNzZWRfZXZlbnRzICs9IFVJbnQ2NCgxKQogICAgZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDMKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX3doaWxlX3RvcEAyCgpmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDM4OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTkxCiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzkKCmZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDI3OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTU3CiAgICAvLyBldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBidXJ5IDE2CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1NTgtNTYwCiAgICAvLyAjIER5bmFtaWMgYW5udWl0aWVzIGRlcml2ZSBuZXh0IHN0YXRlIGZyb20gdGhlIHBheW1lbnQgZGVjb21wb3NpdGlvbiwKICAgIC8vICMgbm90IG9ubHkgZnJvbSB0aGUgcHJlY29tcHV0ZWQgYG5leHRfKmAgZmllbGRzLgogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1BSKToKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19lbHNlX2JvZHlAMjkKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU2MgogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgLSBwcmluY2lwYWxfYW1vdW50X2R1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBkaWcgOAogICAgLQogICAgZHVwCiAgICBidXJ5IDExCiAgICBidXJ5IDExCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDI5OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTY1CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9JUCk6CiAgICBkaWcgMTQKICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUAzMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTY2CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGJ1cnkgMTEKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU2NwogICAgLy8gbmV4dF9pbnRlcmVzdF9iYXNlID0gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBidXJ5IDEyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIGV4aXN0cwogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzNgoKZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUAzMToKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU2OAogICAgLy8gZWxpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfTUQpOgogICAgZGlnIDE0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDMyCiAgICBkaWcgOQogICAgYnVyeSAxMQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzNgoKZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlAMzI6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1NjkKICAgIC8vIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAxMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTcwCiAgICAvLyBuZXh0X2ludGVyZXN0X2Jhc2UgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDExCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNzoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQyOQogICAgLy8gaWYgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCk6CiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDI1CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0MzAKICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCk6CiAgICBkaWcgMTQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDMxCiAgICAvLyByZXR1cm4gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1NTIKICAgIC8vIHByaW5jaXBhbF9hbW91bnRfZHVlID0gc2VsZi5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudChlbnRyeSkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnRAMjYKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDIwOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDMyCiAgICAvLyBpbnRlcmVzdF9kdWUgPSBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgKyBzZWxmLl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KGVudHJ5KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgIGRpZyAxNgogICAgY2FsbHN1YiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudAogICAgYnVyeSAxOAogICAgKwogICAgZHVwCiAgICBidXJ5IDEzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0MzMKICAgIC8vIGlmIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA8PSBpbnRlcmVzdF9kdWU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiBleGlzdHMKICAgID49CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyMgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDM0CiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1NTIKICAgIC8vIHByaW5jaXBhbF9hbW91bnRfZHVlID0gc2VsZi5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudChlbnRyeSkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnRAMjYKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDIyOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDM1CiAgICAvLyBwcmluY2lwYWxfYW1vdW50ID0gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIC0gaW50ZXJlc3RfZHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiBleGlzdHMKICAgIGRpZyAxMgogICAgLQogICAgZHVwCiAgICBidXJ5IDEwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0MzYKICAgIC8vIGlmIHByaW5jaXBhbF9hbW91bnQgPiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgPgogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQzNwogICAgLy8gcmV0dXJuIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTUyCiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyNDoKICAgIGRpZyA4CiAgICBidXJ5IDgKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyNgoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjU6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0NDAKICAgIC8vIGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsIDw9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBkaWcgMTUKICAgIHB1c2hpbnQgNDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGR1cDIKICAgIDw9CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0MzktNDQxCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsIDw9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQ0MgogICAgLy8gcmV0dXJuIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIC0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIHN3YXAKICAgIC0KICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTUyCiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQxNQogICAgLy8gcmV0dXJuIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCArIHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZGlnIDE2CiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBidXJ5IDE4CiAgICArCiAgICBidXJ5IDEzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1NTEKICAgIC8vIGludGVyZXN0X2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9pbnRlcmVzdF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9pbnRlcmVzdF9hbW91bnRAMTQKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl93aGlsZUA5OgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojc0CiAgICAvLyBhc3NlcnQgcHJvY2Vzc2VkX2V2ZW50cyA+IFVJbnQ2NCgwKSwgZXJyLk5PX0RVRV9DQVNIRkxPVwogICAgZGlnIDIKICAgIGR1cAogICAgYXNzZXJ0IC8vIE5vIGR1ZSBjYXNoZmxvdyB0byBwYXkKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3OAogICAgLy8gdG90YWxfZnVuZGVkPWZ1bmRlZF9pbnRlcmVzdCArIGZ1bmRlZF9wcmluY2lwYWwsCiAgICBkaWcgMgogICAgZHVwCiAgICBkaWcgMwogICAgZHVwCiAgICBjb3ZlciAzCiAgICArCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODAKICAgIC8vIHRpbWVzdGFtcD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3NS04MQogICAgLy8gcmV0dXJuIHR5cC5DYXNoRnVuZGluZ1Jlc3VsdCgKICAgIC8vICAgICBmdW5kZWRfaW50ZXJlc3Q9ZnVuZGVkX2ludGVyZXN0LAogICAgLy8gICAgIGZ1bmRlZF9wcmluY2lwYWw9ZnVuZGVkX3ByaW5jaXBhbCwKICAgIC8vICAgICB0b3RhbF9mdW5kZWQ9ZnVuZGVkX2ludGVyZXN0ICsgZnVuZGVkX3ByaW5jaXBhbCwKICAgIC8vICAgICBwcm9jZXNzZWRfZXZlbnRzPXByb2Nlc3NlZF9ldmVudHMsCiAgICAvLyAgICAgdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUA1MToKICAgIGludGNfMCAvLyAwCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDUyCgoKLy8gbW9kdWxlcy5wYXltZW50X2FnZW50LlBheW1lbnRBZ2VudC5jbGFpbV9kdWVfY2FzaGZsb3dzW3JvdXRpbmddKCkgLT4gdm9pZDoKY2xhaW1fZHVlX2Nhc2hmbG93czoKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNAogICAgLy8gaWYgc2VsZi5vcF9kYWVtb24udmFsdWUgIT0gR2xvYmFsLnplcm9fYWRkcmVzczoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNSAvLyAweDUyMjM0ZjcwNDQ2MTY1NmQ2ZjZlMjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcF9kYWVtb24gZXhpc3RzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBieiBjbGFpbV9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTcKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNgogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI1IC8vIDB4NTIyMzRmNzA0NDYxNjU2ZDZmNmUyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wX2RhZW1vbiBleGlzdHMKICAgID09CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTYtMTgKICAgIC8vIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICAvLyBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgYm56IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDE0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTcKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNi0xOAogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICBibnogY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX3RydWVAMTQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxOAogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIHR4biBTZW5kZXIKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDMyCiAgICA9PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE2LTE4CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAxNQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX3RydWVAMTQ6CiAgICBpbnRjXzEgLy8gMQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDE2OgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE1LTE5CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vICAgICBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gICAgIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICAvLyApLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNzoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5NAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5NQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNDcKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6OTgKICAgIC8vIHNlbGYuX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQoaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDIKICAgIGR1cAogICAgY2FsbHN1YiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojk5CiAgICAvLyBzZWxmLl9zZXR0bGVfcG9zaXRpb24oaG9sZGluZ19hZGRyZXNzKQogICAgY2FsbHN1YiBfc2V0dGxlX3Bvc2l0aW9uCiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTcKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNsYWltYWJsZV9pbnRlcmVzdAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZHVwCiAgICBwdXNoaW50IDczCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBidXJ5IDgKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTgKICAgIC8vICsgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgZHVwCiAgICBwdXNoaW50IDgxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDgKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTctMTE4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jbGFpbWFibGVfaW50ZXJlc3QKICAgIC8vICsgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgdW5jb3ZlciAyCiAgICArCiAgICBkdXAKICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjEwMQogICAgLy8gYXNzZXJ0IHRvdGFsX2Ftb3VudCA+IFVJbnQ2NCgwKSwgZXJyLk5PX0RVRV9DQVNIRkxPVwogICAgYXNzZXJ0IC8vIE5vIGR1ZSBjYXNoZmxvdyB0byBwYXkKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLmlzX29wdGVkX2luKAogICAgZXh0cmFjdCAwIDMyCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MjUKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MjQtMjYKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5pc19vcHRlZF9pbigKICAgIC8vICAgICBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQKICAgIC8vICkKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MjQtMjcKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5pc19vcHRlZF9pbigKICAgIC8vICAgICBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQKICAgIC8vICkKICAgIC8vIGFuZCBub3Qgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkCiAgICBieiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VAMjQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNwogICAgLy8gYW5kIG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHB1c2hpbnQgMzg0CiAgICBnZXRiaXQKICAgIGJueiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VAMjQKICAgIGludGNfMSAvLyAxCgpjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfbWVyZ2VAMjU6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA2CiAgICAvLyBpZiBzZWxmLl9pc19wYXltZW50X2V4ZWN1dGFibGUoaG9sZGluZ19hZGRyZXNzKToKICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MzMKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICBzd2FwCiAgICBkaWcgMQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBvcHRlZCBpbnRvIGFzc2V0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MzMtMzQKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICAvLyA+PSBwYXltZW50X2Ftb3VudAogICAgZGlnIDUKICAgIGR1cAogICAgY292ZXIgMgogICAgPj0KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozMi0zNQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgLy8gICAgID49IHBheW1lbnRfYW1vdW50CiAgICAvLyApLCBlcnIuTk9UX0VOT1VHSF9GVU5EUwogICAgYXNzZXJ0IC8vIE5vdCBlbm91Z2ggZnVuZHMgZm9yIHRoZSBwYXltZW50CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA4CiAgICAvLyBzZWxmLl9wYXkoc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLCB0b3RhbF9hbW91bnQpCiAgICBkaWcgMgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZHVwCiAgICBleHRyYWN0IDAgMzIKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozOS00NAogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXJlY2VpdmVyLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1hbW91bnQsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0MwogICAgLy8gZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIGdsb2JhbCBNaW5UeG5GZWUKICAgIHVuY292ZXIgMwogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgc3dhcAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MzkKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozOS00NAogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXJlY2VpdmVyLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1hbW91bnQsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTI1LTEyNgogICAgLy8gIyBHZXQgdGhlIGNsYWltYWJsZSBhbW91bnRzIGJlZm9yZSByZXNldAogICAgLy8gaW50ZXJlc3RfYW1vdW50ID0gcG9zaXRpb24uY2xhaW1hYmxlX2ludGVyZXN0CiAgICBkdXAKICAgIHB1c2hpbnQgNzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgOQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEyNwogICAgLy8gcHJpbmNpcGFsX2Ftb3VudCA9IHBvc2l0aW9uLmNsYWltYWJsZV9wcmluY2lwYWwKICAgIGR1cAogICAgcHVzaGludCA4MQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMwogICAgYnVyeSA5CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTI5LTEzMAogICAgLy8gIyBSZXNldCB0aGUgcG9zaXRpb24ncyBjbGFpbWFibGUgYW1vdW50cwogICAgLy8gcG9zaXRpb24uY2xhaW1hYmxlX2ludGVyZXN0ID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgaXRvYgogICAgc3dhcAogICAgZGlnIDEKICAgIHJlcGxhY2UyIDczCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTMxCiAgICAvLyBwb3NpdGlvbi5jbGFpbWFibGVfcHJpbmNpcGFsID0gVUludDY0KDApCiAgICBzd2FwCiAgICByZXBsYWNlMiA4MQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzMgogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSBwb3NpdGlvbi5jb3B5KCkKICAgIHVuY292ZXIgMwogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzNAogICAgLy8gYXNzZXJ0IHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgPj0gaW50ZXJlc3RfYW1vdW50LCBlcnIuTk9UX0VOT1VHSF9GVU5EUwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCBleGlzdHMKICAgIGR1cAogICAgZGlnIDIKICAgID49CiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcyBmb3IgdGhlIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzUKICAgIC8vIGFzc2VydCBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCA+PSBwcmluY2lwYWxfYW1vdW50LCBlcnIuTk9UX0VOT1VHSF9GVU5EUwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIGV4aXN0cwogICAgZGlnIDMKICAgID49CiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcyBmb3IgdGhlIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzctMTM4CiAgICAvLyAjIFVwZGF0ZSB0aGUgZ2xvYmFsIHJlc2VydmVkIGludGVyZXN0IGFuZCBwcmluY2lwYWwgYW1vdW50cwogICAgLy8gc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCAtPSBpbnRlcmVzdF9hbW91bnQKICAgIHN3YXAKICAgIC0KICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTM5CiAgICAvLyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCAtPSBwcmluY2lwYWxfYW1vdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICBzd2FwCiAgICAtCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjExNAogICAgLy8gdG90YWxfYW1vdW50PWludGVyZXN0X2Ftb3VudCArIHByaW5jaXBhbF9hbW91bnQsCiAgICBkaWcgNQogICAgZHVwCiAgICBkaWcgNgogICAgZHVwCiAgICBjb3ZlciAzCiAgICArCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTE1CiAgICAvLyB0aW1lc3RhbXA9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTExLTExNwogICAgLy8gcmV0dXJuIHR5cC5DYXNoQ2xhaW1SZXN1bHQoCiAgICAvLyAgICAgaW50ZXJlc3RfYW1vdW50PWludGVyZXN0X2Ftb3VudCwKICAgIC8vICAgICBwcmluY2lwYWxfYW1vdW50PXByaW5jaXBhbF9hbW91bnQsCiAgICAvLyAgICAgdG90YWxfYW1vdW50PWludGVyZXN0X2Ftb3VudCArIHByaW5jaXBhbF9hbW91bnQsCiAgICAvLyAgICAgdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gICAgIGNvbnRleHQ9cGF5bWVudF9pbmZvLAogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZGlnIDIKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBwdXNoYnl0ZXMgMHgwMDIyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAyNDoKICAgIGludGNfMCAvLyAwCiAgICBiIGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUAyNQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX2ZhbHNlQDE1OgogICAgaW50Y18wIC8vIDAKICAgIGIgY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDE2CgoKLy8gbW9kdWxlcy50cmFuc2Zlcl9hZ2VudC5UcmFuc2ZlckFnZW50LnNldF90cmFuc2Zlcl9zY2hlZHVsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF90cmFuc2Zlcl9zY2hlZHVsZToKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToyNgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjI3CiAgICAvLyBhc3NlcnQgb3Blbl9kYXRlIDwgY2xvc3VyZV9kYXRlLCBlcnIuSU5WQUxJRF9TT1JUSU5HCiAgICBkdXAyCiAgICA8CiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbXVzdCBiZSBzb3J0ZWQgaW4gc3RyaWN0bHkgYXNjZW5kaW5nIG9yZGVyCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjI5CiAgICAvLyBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA9IG9wZW5fZGF0ZQogICAgYnl0ZWMgMjcgLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIHVuY292ZXIgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MzAKICAgIC8vIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlID0gY2xvc3VyZV9kYXRlCiAgICBieXRlYyAyOCAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MzEKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy50cmFuc2Zlcl9hZ2VudC5UcmFuc2ZlckFnZW50LnByaW1hcnlfZGlzdHJpYnV0aW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcHJpbWFyeV9kaXN0cmlidXRpb246CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjcxCiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5wcmltYXJ5X2RlYWxlciwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDIyIC8vIDB4NTIyMzUwNzI2OTZkNjE3Mjc5NDQ2NTYxNmM2NTcyMjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDMKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQ0CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDUKICAgIC8vIGFzc2VydCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBSSU1BUllfRElTVFJJQlVUSU9OX0NMT1NFRAogICAgYXNzZXJ0IC8vIFByaW1hcnkgZGlzdHJpYnV0aW9uIGlzIGNsb3NlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgY292ZXIgMwogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo0NwogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChob2xkaW5nX2FkZHJlc3MpCiAgICBzd2FwCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQ4CiAgICAvLyBhc3NlcnQgdW5pdHMgPiBVSW50NjQoMCksIGVyci5aRVJPX1VOSVRTCiAgICBkdXAKICAgIGFzc2VydCAvLyBDYW4gbm90IGRpc3RyaWJ1dGUgemVybyB1bml0cwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo1MAogICAgLy8gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCArIHVuaXRzIDw9IHNlbGYudG90YWxfdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICArCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgPD0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDktNTEKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCArIHVuaXRzIDw9IHNlbGYudG90YWxfdW5pdHMKICAgIC8vICksIGVyci5PVkVSX0RJU1RSSUJVVElPTgogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCByZW1haW5pbmcgRC1BU0EgdW5pdHMKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NTIKICAgIC8vIGlmIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI2IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlIGV4aXN0cwogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjU0CiAgICAvLyBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8PSBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI2IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlIGV4aXN0cwogICAgPD0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NTMtNTUKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPD0gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGUKICAgIC8vICksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TRUQKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBjbG9zZWQKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNDgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnJlc2VydmVkX3VuaXRzICs9IHVuaXRzCiAgICBkdXBuIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDMKICAgIGR1cAogICAgY292ZXIgMwogICAgKwogICAgaXRvYgogICAgcHVzaGludCA0MAogICAgc3dhcAogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NTgKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgKz0gdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICArCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NTkKICAgIC8vIHJldHVybiBzZWxmLnRvdGFsX3VuaXRzIC0gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIHN3YXAKICAgIC0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMudHJhbnNmZXJfYWdlbnQuVHJhbnNmZXJBZ2VudC50cmFuc2Zlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnRyYW5zZmVyOgogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo2MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NzUKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojc2CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE0NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTMKICAgIC8vIGlmIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI3IC8vICJ0cmFuc2Zlcl9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlIGV4aXN0cwogICAgYnogdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE1CiAgICAvLyBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI3IC8vICJ0cmFuc2Zlcl9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlIGV4aXN0cwogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPD0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTQtMTYKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICksIGVyci5DTE9TRURfVFJBTlNGRVIKICAgIGFzc2VydCAvLyBUcmFuc2ZlciBpcyBjbG9zZWQKCnRyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTcKICAgIC8vIGlmIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI4IC8vICJ0cmFuc2Zlcl9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgYnogdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE5CiAgICAvLyBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8IHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjggLy8gInRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICA8CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE4LTIwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDwgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGUKICAgIC8vICksIGVyci5DTE9TRURfVFJBTlNGRVIKICAgIGFzc2VydCAvLyBUcmFuc2ZlciBpcyBjbG9zZWQKCnRyYW5zZmVyX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODAKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIGRpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgOAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIGRpZyA1CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDkKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODMKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQoc2VuZGVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojg0CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGR1cAogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4NQogICAgLy8gYXNzZXJ0IHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MgIT0gcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzLCBlcnIuU0VMRl9UUkFOU0ZFUgogICAgdW5jb3ZlciAyCiAgICAhPQogICAgYXNzZXJ0IC8vIFNlbmRlciBhbmQgcmVjZWl2ZXIgbXVzdCBiZSBkaWZmZXJlbnQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODYKICAgIC8vIGFzc2VydCB1bml0cyA+IFVJbnQ2NCgwKSwgZXJyLk5VTExfVFJBTlNGRVIKICAgIGRpZyAxCiAgICBkdXAKICAgIGFzc2VydCAvLyBUcmFuc2ZlciB1bml0cyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojg3CiAgICAvLyBhc3NlcnQgdW5pdHMgPD0gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLCBlcnIuT1ZFUl9UUkFOU0ZFUgogICAgc3dhcAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIDw9CiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IHNlbmRlciB1bml0cyB0byB0cmFuc2ZlcgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzU2CiAgICAvLyBpZiBzZWxmLmV2ZW50X2N1cnNvciA+PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICA+PQogICAgYm56IHRyYW5zZmVyX2FmdGVyX2lubGluZWRfbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Fzc2VydF9ub19kdWVfZXZlbnRfcGVuZGluZ0AxMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzU4CiAgICAvLyBuZXh0X2VudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KHNlbGYuZXZlbnRfY3Vyc29yKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojc2MAogICAgLy8gbmV4dF9lbnRyeS5zY2hlZHVsZWRfdGltZSA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3NTktNzYxCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIG5leHRfZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gKSwgZXJyLlBFTkRJTkdfQUNUVVNfRVZFTlQKICAgIGFzc2VydCAvLyBBQ1RVUyBldmVudCBub3QgeWV0IGV4ZWN1dGVkCgp0cmFuc2Zlcl9hZnRlcl9pbmxpbmVkX21vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9hc3NlcnRfbm9fZHVlX2V2ZW50X3BlbmRpbmdAMTA6CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjkwCiAgICAvLyBzZWxmLl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBkaWcgMwogICAgZHVwCiAgICBjYWxsc3ViIF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjkxCiAgICAvLyBzZWxmLl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGRpZyAzCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGNhbGxzdWIgX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6OTIKICAgIC8vIHNlbGYuX3NldHRsZV9wb3NpdGlvbihzZW5kZXJfaG9sZGluZ19hZGRyZXNzKQogICAgY2FsbHN1YiBfc2V0dGxlX3Bvc2l0aW9uCiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6OTMKICAgIC8vIHNlbGYuX3NldHRsZV9wb3NpdGlvbihyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBjYWxsc3ViIF9zZXR0bGVfcG9zaXRpb24KICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE1MgogICAgLy8gYXNzZXJ0IHVuaXRzIDw9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLCBlcnIuT1ZFUl9UUkFOU0ZFUgogICAgZGlnIDUKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGRpZyAxCiAgICA8PQogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCBzZW5kZXIgdW5pdHMgdG8gdHJhbnNmZXIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNTMKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzIC09IHVuaXRzCiAgICBkaWcgMQogICAgLQogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBpbnRjXzMgLy8gMzIKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNDQKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzICs9IHVuaXRzCiAgICBkaWcgNQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgdW5jb3ZlciAyCiAgICArCiAgICBpdG9iCiAgICBpbnRjXzMgLy8gMzIKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgZGlnIDIKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF9nb3Zfc3VzcGVuc2lvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfZ292X3N1c3BlbnNpb246CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTY1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo3NwogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYXV0aG9yaXR5LCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjEgLy8gMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTg1CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGR1cAogICAgcHVzaGludCA0OAogICAgaW50Y18xIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIHB1c2hpbnQgNDgKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTg2CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfb3Blbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfb3BlbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2OAogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjMgLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQ0ZDYxNmU2MTY3NjU3MjIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMzkKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0VOREVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDIwMAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTAKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX2VuZGVkKCksIGVyci5VTkFVVEhPUklaRUQKICAgICEKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxMQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTIKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjEzCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzQKICAgIC8vIHVuaXRzPVVJbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzItNDIKICAgIC8vIHJldHVybiB0eXAuQWNjb3VudFBvc2l0aW9uKAogICAgLy8gICAgIHBheW1lbnRfYWRkcmVzcz1wYXltZW50X2FkZHJlc3MsCiAgICAvLyAgICAgdW5pdHM9VUludDY0KDApLAogICAgLy8gICAgIHJlc2VydmVkX3VuaXRzPVVJbnQ2NCgwKSwKICAgIC8vICAgICBzdXNwZW5kZWQ9RmFsc2UsCiAgICAvLyAgICAgc2V0dGxlZF9jdXJzb3I9VUludDY0KDApLAogICAgLy8gICAgIGludGVyZXN0X2NoZWNrcG9pbnQ9VUludDY0KDApLAogICAgLy8gICAgIHByaW5jaXBhbF9jaGVja3BvaW50PVVJbnQ2NCgwKSwKICAgIC8vICAgICBjbGFpbWFibGVfaW50ZXJlc3Q9VUludDY0KDApLAogICAgLy8gICAgIGNsYWltYWJsZV9wcmluY2lwYWw9VUludDY0KDApLAogICAgLy8gKQogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBieXRlYyA0MCAvLyAweDAwCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxNAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSBzZWxmLl9uZXdfYWNjb3VudF9wb3NpdGlvbihwYXltZW50X2FkZHJlc3MpCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjE1CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzczoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMzgKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcywgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgdW5jb3ZlciAzCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjM5CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0MAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDEKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcyA9IHBheW1lbnRfYWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDIKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF9nZXRfcG9zaXRpb25bcm91dGluZ10oKSAtPiB2b2lkOgphY2NvdW50X2dldF9wb3NpdGlvbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNTkKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9jcmVhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9jcmVhdGU6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5ODAKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSBhcnJhbmdlcgogICAgYnl0ZWMgMTggLy8gMHg1MjIzNDE3MjcyNjE2ZTY3NjU3MjIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTgxCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojk2OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfY29uZmlnW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfY29uZmlnOgogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojk4MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGxlbgogICAgcHVzaGludCAxMDcKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuTm9ybWFsaXplZEFjdHVzVGVybXMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDcyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLkluaXRpYWxLZXJuZWxTdGF0ZQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIGxlbgogICAgZGlnIDEKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgdHVwbGUgZW5jb2RpbmcKICAgIGR1cAogICAgcHVzaGludCAzNAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHRhaWwgcG9pbnRlciBhdCBpbmRleCAxIG9mICh1aW50OFszMl0sKGxlbit1dGY4W10pKQogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBjb3ZlciAzCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAzNgogICAgKwogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5Qcm9zcGVjdHVzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDEyCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwMTQtMTAxNQogICAgLy8gIyBDb25maWd1cmUgQ29udHJhY3QKICAgIC8vIHNlbGYuY29udHJhY3RfdHlwZSA9IHRlcm1zLmNvbnRyYWN0X3R5cGUuYXNfdWludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ5dGVjIDEyIC8vICJjb250cmFjdF90eXBlIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICBieiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjIwCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfQU5OKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMjEKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgcHVzaGludCAyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMjIKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMjMKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgcHVzaGludCA0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMjQKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYnogY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAOAoKY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUA3OgogICAgaW50Y18xIC8vIDEKCmNvbnRyYWN0X2NvbmZpZ19ib29sX21lcmdlQDk6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMjkKICAgIC8vIGFzc2VydCBzZWxmLl9pc19zdXBwb3J0ZWRfY29udHJhY3RfdHlwZShjb250cmFjdF90eXBlKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDE3CiAgICAvLyBzZWxmLl9zdG9yZV9jb250cmFjdF9jb25maWcoc2VsZi5jb250cmFjdF90eXBlLCB0ZXJtcywgaW5pdGlhbF9zdGF0ZSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBidXJ5IDIKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozMjUKICAgIC8vIGFzc2VydCB0ZXJtcy5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBkaWcgNAogICAgZHVwCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDgKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMyNwogICAgLy8gdGVybXMuZGF5X2NvdW50X2NvbnZlbnRpb24uYXNfdWludDY0KCkKICAgIHB1c2hpbnQgNTcKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyOTctMzAzCiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgIGJ6IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGRpZyA2CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyOTkKICAgIC8vIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGRpZyA2CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozMDAKICAgIC8vIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICBwdXNoaW50IDIKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI5Ny0zMDMKICAgIC8vIHJldHVybiBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzYwKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwSVNEQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjApLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDE2CiAgICBkaWcgNgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzAxCiAgICAvLyBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyOTctMzAzCiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgID09CiAgICBibnogY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUAxNgogICAgZGlnIDYKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMwMgogICAgLy8gVUludDY0KGVudW1zLkRDQ18zMEUzNjApLAogICAgcHVzaGludCA0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyOTctMzAzCiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgID09CiAgICBieiBjb250cmFjdF9jb25maWdfYm9vbF9mYWxzZUAxNwoKY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUAxNjoKICAgIGludGNfMSAvLyAxCgpjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUAxODoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMwOS0zMTEKICAgIC8vIGFzc2VydCBzZWxmLl9pc19zdXBwb3J0ZWRfZGF5X2NvdW50X2NvbnZlbnRpb24oCiAgICAvLyAgICAgZGF5X2NvdW50X2NvbnZlbnRpb24KICAgIC8vICksIGVyci5JTlZBTElEX0RBWV9DT1VOVF9DT05WRU5USU9OCiAgICBhc3NlcnQgLy8gSW52YWxpZCBkYXktY291bnQgY29udmVudGlvbiBJRAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzI5CiAgICAvLyBpZiBjb250cmFjdF90eXBlICE9IFVJbnQ2NChlbnVtcy5DVF9BTk4pOgogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgIT0KICAgIGJ6IGNvbnRyYWN0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDIwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozMzAKICAgIC8vIGFzc2VydCBub3QgdGVybXMuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBkaWcgNAogICAgcHVzaGludCA3ODYKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgoKY29udHJhY3RfY29uZmlnX2FmdGVyX2lmX2Vsc2VAMjA6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MDAKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MDEKICAgIC8vIGFzc2VydCBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID09IFVJbnQ2NCgwKSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBELUFTQSBhbHJlYWR5IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjgwMy04MDQKICAgIC8vICMgU2V0IERlbm9taW5hdGlvbiBBc3NldAogICAgLy8gc2VsZi5fYXNzZXJ0X2Rlbm9taW5hdGlvbl9hc3NldCh0ZXJtcy5kZW5vbWluYXRpb25fYXNzZXRfaWQpCiAgICBkaWcgNAogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojc2OC03NjkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gZGVub21pbmF0aW9uIHdpdGggQVNBCiAgICAvLyBfY3JlYXRvciwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfY3JlYXRvcihkZW5vbWluYXRpb25fYXNzZXRfaWQpCiAgICBkdXAKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojc3MAogICAgLy8gYXNzZXJ0IGV4aXN0cywgZXJyLklOVkFMSURfREVOT01JTkFUSU9OCiAgICBhc3NlcnQgLy8gRGVub21pbmF0aW9uIGFzc2V0IGlzIG5vdCBwcm9wZXJseSBzZXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojc3MwogICAgLy8gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgPSBkZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIGJ5dGVjIDQ0IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjgwNy04MDgKICAgIC8vICMgU2V0IFNldHRsZW1lbnQgQXNzZXQKICAgIC8vIHNlbGYuX2Fzc2VydF9zZXR0bGVtZW50X2Fzc2V0KHRlcm1zLnNldHRsZW1lbnRfYXNzZXRfaWQpCiAgICBkaWcgMQogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Nzc4CiAgICAvLyBzZXR0bGVtZW50X2Fzc2V0X2lkID09IHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgPT0KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojc3Ni03NzkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzZXR0bGVtZW50IGFzc2V0IGlzIHRoZSBkZW5vbWluYXRpb24gYXNzZXQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgLy8gKSwgZXJyLklOVkFMSURfU0VUVExFTUVOVF9BU1NFVAogICAgYXNzZXJ0IC8vIERpZmZlcmVudCBzZXR0bGVtZW50IGFzc2V0IG5vdCBzdXBwb3J0ZWQsIG11c3QgYmUgZXF1YWwgdG8gZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3ODIKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCA9IHNldHRsZW1lbnRfYXNzZXRfaWQKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3ODMtNzg5CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3ODgKICAgIC8vIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3ODYKICAgIC8vIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Nzg3CiAgICAvLyBhc3NldF9hbW91bnQ9MCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3ODMtNzg0CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojc4My03ODkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gc2V0dGxlbWVudCB3aXRoIEFTQQogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PTAsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MTEtODEyCiAgICAvLyAjIFVuaXRzCiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzID0gdGVybXMudG90YWxfdW5pdHMKICAgIGR1cAogICAgcHVzaGludCAxNwogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MTMKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDEwIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODE1LTgxNgogICAgLy8gIyBEYXktQ291bnQgQ29udmVudGlvbnMKICAgIC8vIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPSB0ZXJtcy5kYXlfY291bnRfY29udmVudGlvbi5hc191aW50NjQoKQogICAgYnl0ZWMgNDYgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgZGlnIDgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MTgtODE5CiAgICAvLyAjIFRpbWUKICAgIC8vIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlID0gdGVybXMuaW5pdGlhbF9leGNoYW5nZV9kYXRlCiAgICBkdXAKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAyNiAvLyAiaW5pdGlhbF9leGNoYW5nZV9kYXRlIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MjAKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IHRlcm1zLm1hdHVyaXR5X2RhdGUKICAgIGRpZyAxCiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNDUgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjgyMQogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gaW5pdGlhbF9zdGF0ZS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBkaWcgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBwdXNoaW50IDQ4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODIzLTgyNAogICAgLy8gIyBQcmluY2lwYWwKICAgIC8vIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPSB0ZXJtcy5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudAogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgZGlnIDEwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODI1CiAgICAvLyBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSB0ZXJtcy5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBkaWcgMwogICAgcHVzaGludCA3ODYKICAgIGdldGJpdAogICAgYnl0ZWMgMzQgLy8gImR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODI2CiAgICAvLyBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9IGluaXRpYWxfc3RhdGUub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBkaWcgMQogICAgcHVzaGludCAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjXzMgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MjgtODI5CiAgICAvLyAjIEludGVyZXN0CiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgPSBpbml0aWFsX3N0YXRlLmFjY3J1ZWRfaW50ZXJlc3QKICAgIGRpZyAxCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MzEtODMyCiAgICAvLyAjIEludGVyZXN0IFJhdGUKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gaW5pdGlhbF9zdGF0ZS5ub21pbmFsX2ludGVyZXN0X3JhdGUKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODMzCiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBpbml0aWFsX3N0YXRlLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UKICAgIGRpZyAxCiAgICBwdXNoaW50IDI0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MzQKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQgPSB0ZXJtcy5yYXRlX3Jlc2V0X3NwcmVhZAogICAgZGlnIDMKICAgIHB1c2hpbnQgNTgKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzNSAvLyAicmF0ZV9yZXNldF9zcHJlYWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODM1CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciA9IHRlcm1zLnJhdGVfcmVzZXRfbXVsdGlwbGllcgogICAgZGlnIDMKICAgIHB1c2hpbnQgNjYKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzNiAvLyAicmF0ZV9yZXNldF9tdWx0aXBsaWVyIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjgzNgogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X2Zsb29yID0gdGVybXMucmF0ZV9yZXNldF9mbG9vcgogICAgZGlnIDMKICAgIHB1c2hpbnQgNzQKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAyOSAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4MzcKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9jYXAgPSB0ZXJtcy5yYXRlX3Jlc2V0X2NhcAogICAgZGlnIDMKICAgIHB1c2hpbnQgODIKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzMCAvLyAicmF0ZV9yZXNldF9jYXAiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODM4CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfbmV4dCA9IHRlcm1zLnJhdGVfcmVzZXRfbmV4dAogICAgZGlnIDMKICAgIHB1c2hpbnQgOTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzNyAvLyAicmF0ZV9yZXNldF9uZXh0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjgzOQogICAgLy8gc2VsZi5oYXNfcmF0ZV9yZXNldF9mbG9vciA9IHRlcm1zLmhhc19yYXRlX3Jlc2V0X2Zsb29yCiAgICBkaWcgMwogICAgcHVzaGludCA3ODQKICAgIGdldGJpdAogICAgYnl0ZWMgMzggLy8gImhhc19yYXRlX3Jlc2V0X2Zsb29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojg0MAogICAgLy8gc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgPSB0ZXJtcy5oYXNfcmF0ZV9yZXNldF9jYXAKICAgIGRpZyAzCiAgICBwdXNoaW50IDc4NQogICAgZ2V0Yml0CiAgICBieXRlYyAzOSAvLyAiaGFzX3JhdGVfcmVzZXRfY2FwIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojg0Mi04NDMKICAgIC8vICMgU2NhbGluZwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSA9IHRlcm1zLmZpeGVkX3BvaW50X3NjYWxlCiAgICB1bmNvdmVyIDMKICAgIHB1c2hpbnQgOTkKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4NDUtODQ2CiAgICAvLyAjIFNjaGVkdWxlIFByb2Nlc3NpbmcKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yID0gaW5pdGlhbF9zdGF0ZS5ldmVudF9jdXJzb3IKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4NDgtODQ5CiAgICAvLyAjIFBlci1Vbml0IEZpeGVkLVBvaW50IEluZGV4ZXMKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCA9IGluaXRpYWxfc3RhdGUuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleAogICAgZGlnIDEKICAgIHB1c2hpbnQgNTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4NTAKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggPSBpbml0aWFsX3N0YXRlLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4CiAgICBkaWcgMQogICAgcHVzaGludCA2NAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4NTItODUzCiAgICAvLyAjIFJlc2VydmVkIEFtb3VudCAoZm9yIGV4ZWN1dGVkIGNhc2hmbG93cykKICAgIC8vIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODU0CiAgICAvLyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODU2CiAgICAvLyBhc3NlcnQgdGVybXMuaW5pdGlhbF9leGNoYW5nZV9kYXRlID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsIGVyci5JTlZBTElEX0lFRAogICAgZGlnIDIKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgID4KICAgIGFzc2VydCAvLyBJRUQgbXVzdCBiZSBzZXQgaW4gdGhlIGZ1dHVyZQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODU3CiAgICAvLyBhc3NlcnQgdGVybXMuaW5pdGlhbF9leGNoYW5nZV9kYXRlID4gaW5pdGlhbF9zdGF0ZS5zdGF0dXNfZGF0ZSwgZXJyLklOVkFMSURfSUVECiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICA8CiAgICBhc3NlcnQgLy8gSUVEIG11c3QgYmUgc2V0IGluIHRoZSBmdXR1cmUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojg1OAogICAgLy8gYXNzZXJ0IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA8IHRlcm1zLm1hdHVyaXR5X2RhdGUsIGVyci5JTlZBTElEX0lFRAogICAgPAogICAgYXNzZXJ0IC8vIElFRCBtdXN0IGJlIHNldCBpbiB0aGUgZnV0dXJlCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDE5LTEwMjAKICAgIC8vICMgTm90YXJpemUgcHJvc3BlY3R1cyAob3B0aW9uYWwpCiAgICAvLyBzZWxmLnByb3NwZWN0dXNfaGFzaCA9IHByb3NwZWN0dXMuaGFzaC5ieXRlcwogICAgZGlnIDIKICAgIGV4dHJhY3QgMCAzMgogICAgYnl0ZWMgNDIgLy8gInByb3NwZWN0dXNfaGFzaCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDIxCiAgICAvLyBzZWxmLnByb3NwZWN0dXNfdXJsID0gcHJvc3BlY3R1cy51cmwKICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgYnl0ZWMgNDMgLy8gInByb3NwZWN0dXNfdXJsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwMjIKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNvbnRyYWN0X2NvbmZpZ19ib29sX2ZhbHNlQDE3OgogICAgaW50Y18wIC8vIDAKICAgIGIgY29udHJhY3RfY29uZmlnX2Jvb2xfbWVyZ2VAMTgKCmNvbnRyYWN0X2NvbmZpZ19ib29sX2ZhbHNlQDg6CiAgICBpbnRjXzAgLy8gMAogICAgYiBjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUA5CgoKLy8gbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3Rfc2NoZWR1bGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9zY2hlZHVsZToKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gMwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTAyNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBzd2FwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgMwogICAgZHVwCiAgICBwdXNoaW50IDY1CiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIHVuY292ZXIgMgogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8c21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5FeGVjdXRpb25TY2hlZHVsZUVudHJ5PgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTAzOQogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDQyCiAgICAvLyBjb250cmFjdF90eXBlPXNlbGYuY29udHJhY3RfdHlwZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBjb3ZlciAzCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODc0CiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIEQtQVNBIGFscmVhZHkgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODc1LTg3NwogICAgLy8gYXNzZXJ0IHNjaGVkdWxlX3BhZ2UubGVuZ3RoIDw9IFVJbnQ2NCgKICAgIC8vICAgICBjc3QuU0NIRURVTEVfUEFHRV9TSVpFCiAgICAvLyApLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBkdXAKICAgIHB1c2hpbnQgMTYKICAgIDw9CiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4NzgKICAgIC8vIGFzc2VydCBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID4gVUludDY0KDApLCBlcnIuVEVSTVNfTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMCAvLyAiaW5pdGlhbF9leGNoYW5nZV9hbW91bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0EgdGVybXMgbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojg4MAogICAgLy8gcGFnZV9jdXJzb3IgPSBzY2hlZHVsZV9wYWdlX2luZGV4ICogVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpCiAgICBzd2FwCiAgICBwdXNoaW50IDE2CiAgICAqCiAgICBzd2FwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4ODcKICAgIC8vICsgcGFnZV9sZW5ndGggKiBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19QRVJfRU5UUllfQlVER0VUKQogICAgcHVzaGludCAxMDAKICAgICoKICAgIHB1c2hpbnQgMTUxMAogICAgKwoKY29udHJhY3Rfc2NoZWR1bGVfd2hpbGVfdG9wQDI6CiAgICBkdXAKICAgIGdsb2JhbCBPcGNvZGVCdWRnZXQKICAgID4KICAgIGJ6IGNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX3doaWxlQDUKICAgIGl0eG5fYmVnaW4KICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBwdXNoaW50IDUgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICBieXRlYyA0NyAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW0KICAgIGJ5dGVjIDQ3IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBiIGNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEAyCgpjb250cmFjdF9zY2hlZHVsZV9hZnRlcl93aGlsZUA1OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODkwCiAgICAvLyBpbmRleCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTAKCmNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEA2OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODkxCiAgICAvLyB3aGlsZSBpbmRleCA8IHBhZ2VfbGVuZ3RoOgogICAgZGlnIDkKICAgIGRpZyA0CiAgICA8CiAgICBieiBjb250cmFjdF9zY2hlZHVsZV9hZnRlcl93aGlsZUAxNQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODkyLTg5MwogICAgLy8gZW50cnkgPSBzY2hlZHVsZV9wYWdlW2luZGV4XS5jb3B5KCkKICAgIC8vIGVudHJ5X2V2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBkaWcgNAogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgYnVyeSAxMwogICAgZGlnIDEwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgNjUKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODkzCiAgICAvLyBlbnRyeV9ldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4OTItODkzCiAgICAvLyBlbnRyeSA9IHNjaGVkdWxlX3BhZ2VbaW5kZXhdLmNvcHkoKQogICAgLy8gZW50cnlfZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGludGNfMiAvLyA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4OTMKICAgIC8vIGVudHJ5X2V2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBnZXRieXRlCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgMTQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojg5NAogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X2lkID09IHBhZ2VfY3Vyc29yICsgaW5kZXgsIGVyci5JTlZBTElEX0VWRU5UX0lECiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEzCiAgICBkaWcgNQogICAgdW5jb3ZlciA0CiAgICArCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4OTUtODk3CiAgICAvLyBzZWxmLl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBlbnRyeV9ldmVudF90eXBlCiAgICAvLyApCiAgICBkaWcgNQogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6ODk4CiAgICAvLyBhc3NlcnQgZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgc3dhcAogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo4OTkKICAgIC8vIGlmIGVudHJ5LmV2ZW50X2lkID4gVUludDY0KDApOgogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxMgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTAwCiAgICAvLyBpZiBpbmRleCA+IFVJbnQ2NCgwKToKICAgIGRpZyA5CiAgICBieiBjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlAMTAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjkwMQogICAgLy8gcHJldmlvdXNfZW50cnkgPSBzY2hlZHVsZV9wYWdlW2luZGV4IC0gVUludDY0KDEpXS5jb3B5KCkKICAgIGRpZyA5CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgcHVzaGludCA2NQogICAgKgogICAgZGlnIDEyCiAgICBzd2FwCiAgICBwdXNoaW50IDY1CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTE6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5MTYKICAgIC8vIHByZXZpb3VzX2VudHJ5LnNjaGVkdWxlZF90aW1lIDw9IGVudHJ5LnNjaGVkdWxlZF90aW1lCiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgOAogICAgPD0KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjkxNS05MTcKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgcHJldmlvdXNfZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gZW50cnkuc2NoZWR1bGVkX3RpbWUKICAgIC8vICksIGVyci5JTlZBTElEX1NPUlRJTkcKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBtdXN0IGJlIHNvcnRlZCBpbiBzdHJpY3RseSBhc2NlbmRpbmcgb3JkZXIKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTI6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5MTgKICAgIC8vIGlmIGVudHJ5LmV2ZW50X2lkID09IFVJbnQ2NCgwKToKICAgIGRpZyA4CiAgICBibnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxNAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTE5LTkyMQogICAgLy8gYXNzZXJ0IGVudHJ5X2V2ZW50X3R5cGUgPT0gVUludDY0KAogICAgLy8gICAgIGVudW1zLkVWVF9JRUQKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZGlnIDEwCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTQ6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5MjIKICAgIC8vIGluZGV4ICs9IFVJbnQ2NCgxKQogICAgZGlnIDkKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEwCiAgICBiIGNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEA2Cgpjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlAMTA6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5MDMtOTA1CiAgICAvLyAjIFRoZSBmaXJzdCBlbnRyeSBvZiBhIHBhZ2UgbXVzdCBzdGlsbCBiZSBvcmRlcmVkIGFmdGVyIHRoZQogICAgLy8gIyBsYXN0IGVudHJ5IG9mIHRoZSBwcmV2aW91cyBwYWdlLgogICAgLy8gYXNzZXJ0IHNjaGVkdWxlX3BhZ2VfaW5kZXggPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0VWRU5UX0lECiAgICBkaWcgNgogICAgZHVwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBpZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTA2CiAgICAvLyBwcmV2aW91c19wYWdlX2luZGV4ID0gc2NoZWR1bGVfcGFnZV9pbmRleCAtIFVJbnQ2NCgxKQogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjkwOAogICAgLy8gcHJldmlvdXNfcGFnZV9pbmRleCBpbiBzZWxmLnNjaGVkdWxlX3BhZ2UKICAgIGl0b2IKICAgIGJ5dGVjIDMxIC8vIDB4NTMyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTA3LTkwOQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBwcmV2aW91c19wYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZQogICAgLy8gKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTEwLTkxMQogICAgLy8gcHJldmlvdXNfcGFnZSA9IHNlbGYuc2NoZWR1bGVfcGFnZVtwcmV2aW91c19wYWdlX2luZGV4XS5jb3B5KCkKICAgIC8vIGFzc2VydCBwcmV2aW91c19wYWdlLmxlbmd0aCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGludCAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTExCiAgICAvLyBhc3NlcnQgcHJldmlvdXNfcGFnZS5sZW5ndGggPiBVSW50NjQoMCksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGR1cAogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTEzCiAgICAvLyBwcmV2aW91c19wYWdlLmxlbmd0aCAtIFVJbnQ2NCgxKQogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjkxMi05MTQKICAgIC8vIHByZXZpb3VzX2VudHJ5ID0gcHJldmlvdXNfcGFnZVsKICAgIC8vICAgICBwcmV2aW91c19wYWdlLmxlbmd0aCAtIFVJbnQ2NCgxKQogICAgLy8gXS5jb3B5KCkKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgMgogICAgKwogICAgcHVzaGludCA2NQogICAgYm94X2V4dHJhY3QKICAgIGIgY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxMQoKY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfd2hpbGVAMTU6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMDAKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHNjaGVkdWxlX3BhZ2UuY29weSgpCiAgICBkaWcgNgogICAgaXRvYgogICAgYnl0ZWMgMzEgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBkaWcgNQogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTI1CiAgICAvLyBpZiBpc19sYXN0X3BhZ2U6CiAgICBkaWcgNQogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxNwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTI3CiAgICAvLyBzY2hlZHVsZV9wYWdlX2luZGV4ICogVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpICsgcGFnZV9sZW5ndGgKICAgIGRpZyAxCiAgICBkaWcgNAogICAgKwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTI2CiAgICAvLyBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50ID0gKAogICAgYnl0ZWMgNCAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5MjYtOTI4CiAgICAvLyBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50ID0gKAogICAgLy8gICAgIHNjaGVkdWxlX3BhZ2VfaW5kZXggKiBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkgKyBwYWdlX2xlbmd0aAogICAgLy8gKQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjkyOQogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgcHVzaGludCA1MAogICAgYXBwX2dsb2JhbF9wdXQKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTc6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDQ3CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwMjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmV4ZWN1dGVfaWVkW3JvdXRpbmddKCkgLT4gdm9pZDoKZXhlY3V0ZV9pZWQ6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA1NwogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDU4CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA1OQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwNjEKICAgIC8vIGFzc2VydCBzZWxmLmV2ZW50X2N1cnNvciA8IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICBkaWcgMQogICAgPgogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgY3Vyc29yCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDYyCiAgICAvLyBlbnRyeSA9IHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLmV2ZW50X2N1cnNvcikKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA2MwogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X3R5cGUgPT0gYXJjNC5VSW50OChlbnVtcy5FVlRfSUVEKSwgZXJyLklOVkFMSURfRVZFTlRfVFlQRQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgZHVwCiAgICBwdXNoYnl0ZXMgMHgwMQogICAgYj09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCB0eXBlCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDY3CiAgICAvLyBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIGRpZyAxCiAgICBleHRyYWN0IDAgOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA2OQogICAgLy8gc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICBkaWcgMgogICAgZXh0cmFjdCA5IDgKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwNzAKICAgIC8vIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgZGlnIDMKICAgIGV4dHJhY3QgMTcgOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA3MQogICAgLy8gcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZGlnIDQKICAgIGV4dHJhY3QgMjUgOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA3MwogICAgLy8gbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9ZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBkaWcgNQogICAgZXh0cmFjdCAzMyA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDc0CiAgICAvLyBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICBkaWcgNgogICAgZXh0cmFjdCA0MSA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDc1CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1lbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIGRpZyA3CiAgICBleHRyYWN0IDQ5IDgKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwNzYKICAgIC8vIGZsYWdzPWVudHJ5LmZsYWdzLAogICAgZGlnIDgKICAgIGV4dHJhY3QgNTcgOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA2Ni0xMDc3CiAgICAvLyB0eXAuT2JzZXJ2ZWRFdmVudFJlcXVlc3QoCiAgICAvLyAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBvYnNlcnZlZF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1lbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9ZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9ZW50cnkuZmxhZ3MsCiAgICAvLyApLAogICAgdW5jb3ZlciA3CiAgICB1bmNvdmVyIDgKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA3MgogICAgLy8gb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA2Ni0xMDc3CiAgICAvLyB0eXAuT2JzZXJ2ZWRFdmVudFJlcXVlc3QoCiAgICAvLyAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBvYnNlcnZlZF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1lbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9ZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9ZW50cnkuZmxhZ3MsCiAgICAvLyApLAogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwNjQtMTA3OAogICAgLy8gc2VsZi5fYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkoCiAgICAvLyAgICAgZW50cnksCiAgICAvLyAgICAgdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0KAogICAgLy8gICAgICAgICBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIC8vICAgICAgICAgZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgLy8gICAgICAgICBzY2hlZHVsZWRfdGltZT1lbnRyeS5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICAgICAgYWNjcnVhbF9mYWN0b3I9ZW50cnkuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICAgICAgb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPWVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPWVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgICAgICBmbGFncz1lbnRyeS5mbGFncywKICAgIC8vICAgICApLAogICAgLy8gKQogICAgY2FsbHN1YiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkKICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA3OQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDQ5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5hcHBseV9ub25fY2FzaF9ldmVudFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFwcGx5X25vbl9jYXNoX2V2ZW50OgogICAgaW50Y18wIC8vIDAKICAgIGR1cG4gNAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwODEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwbiAyCiAgICBsZW4KICAgIHB1c2hpbnQgNzMKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuT2JzZXJ2ZWRFdmVudFJlcXVlc3QKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDk1CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTA5NgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwOTgKICAgIC8vIGlmIHBheWxvYWQuZmxhZ3MgJiBVSW50NjQoZW51bXMuRkxBR19PQlNFUlZFRF9FVkVOVCk6CiAgICBwdXNoaW50IDY1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBwdXNoaW50IDQKICAgICYKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjMzCiAgICAvLyByZXR1cm4gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9DTE0pCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIHB1c2hpbnQgNQogICAgPT0KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjEwOTkKICAgIC8vIGFzc2VydCBzZWxmLl9zdXBwb3J0c19vYnNlcnZlZF9ldmVudHMoKSwgZXJyLk9CU0VSVkVEX0VWRU5UX1JFUVVJUkVECiAgICBhc3NlcnQgLy8gT2JzZXJ2ZWQgZXZlbnQgcmVxdWlyZWQgdG8gZXhlY3V0ZSB0aGlzIGFjdGlvbgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEwMAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMzMKICAgIC8vIHJldHVybiBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0NMTSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgZHVwCiAgICBwdXNoaW50IDUKICAgID09CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5MzgKICAgIC8vIGFzc2VydCBzZWxmLl9zdXBwb3J0c19vYnNlcnZlZF9ldmVudHMoKSwgZXJyLk9CU0VSVkVEX0VWRU5UX1JFUVVJUkVECiAgICBhc3NlcnQgLy8gT2JzZXJ2ZWQgZXZlbnQgcmVxdWlyZWQgdG8gZXhlY3V0ZSB0aGlzIGFjdGlvbgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTM5CiAgICAvLyBhc3NlcnQgcGF5bG9hZC5ldmVudF9pZCA9PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LCBlcnIuSU5WQUxJRF9FVkVOVF9JRAogICAgZGlnIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgNwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NDEKICAgIC8vIHNlbGYuY29udHJhY3RfdHlwZSwgcGF5bG9hZC5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBkdXAKICAgIGV4dHJhY3QgOCAxCiAgICBidXJ5IDEyCiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTQwLTk0MgogICAgLy8gc2VsZi5fYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgc2VsZi5jb250cmFjdF90eXBlLCBwYXlsb2FkLmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIC8vICkKICAgIGNhbGxzdWIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NDQKICAgIC8vIHBhZ2VfaW5kZXggPSBzZWxmLl9zY2hlZHVsZV9wYWdlX2luZGV4KHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxOTAKICAgIC8vIHJldHVybiBldmVudF9pZCAvLyBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkKICAgIHB1c2hpbnQgMTYKICAgIC8KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojk0NQogICAgLy8gcGFnZSA9IHR5cC5FeGVjdXRpb25TY2hlZHVsZVBhZ2UoKQogICAgcHVzaGJ5dGVzIDB4MDAwMAogICAgYnVyeSA3CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NDYKICAgIC8vIGlmIHBhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlOgogICAgaXRvYgogICAgYnl0ZWMgMzEgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA5CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMjcKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojk0NwogICAgLy8gcGFnZSA9IHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XS5jb3B5KCkKICAgIGRpZyA3CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidXJ5IDcKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX3BhZ2UgZW50cnkgZXhpc3RzCgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDI3OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTQ4CiAgICAvLyBhc3NlcnQgcGFnZS5sZW5ndGggPCBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGRpZyA1CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgMTYKICAgIDwKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojk1MwogICAgLy8gc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIGRpZyAzCiAgICBkdXAKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NTQKICAgIC8vIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICBkaWcgMQogICAgZXh0cmFjdCAxNyA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NTUKICAgIC8vIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZGlnIDIKICAgIGV4dHJhY3QgMjUgOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTU2CiAgICAvLyBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDMKICAgIGV4dHJhY3QgNDEgOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6OTU3CiAgICAvLyBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIGRpZyA0CiAgICBleHRyYWN0IDQ5IDgKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojk1OAogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIHVuY292ZXIgNQogICAgZXh0cmFjdCA1NyA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NTAtOTYwCiAgICAvLyB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1wYXlsb2FkLmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9cGF5bG9hZC5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPXBheWxvYWQucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXBheWxvYWQubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICkKICAgIGRpZyAxMQogICAgaXRvYgogICAgZGlnIDE4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMwogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NDktOTYxCiAgICAvLyBwYWdlLmFwcGVuZCgKICAgIC8vICAgICB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9cGF5bG9hZC5ldmVudF9pZCwKICAgIC8vICAgICAgICAgZXZlbnRfdHlwZT1wYXlsb2FkLmV2ZW50X3R5cGUsCiAgICAvLyAgICAgICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIC8vICAgICAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICAgICApCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo5NjIKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHBhZ2UuY29weSgpCiAgICBkaWcgOAogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojk2MwogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTAzCiAgICAvLyBhc3NlcnQgZXZlbnRfaWQgPT0gc2VsZi5ldmVudF9jdXJzb3IsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBjdXJzb3IKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExMDQKICAgIC8vIGVudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KGV2ZW50X2lkKQogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEwNgogICAgLy8gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgYnVyeSAxMAogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozNjQKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzY1CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzYzLTM3MAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjM2NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9SUiksCiAgICBwdXNoaW50IDEyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzY3CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICBwdXNoaW50IDExCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzY4CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgcHVzaGludCAxOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzYzLTM3MAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjM2OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBieiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX2ZhbHNlQDE2CgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX3RydWVAMTU6CiAgICBpbnRjXzEgLy8gMQoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9tZXJnZUAxNzoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExMDUtMTEwNwogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2lzX25vbl9jYXNoKAogICAgLy8gICAgIGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIC8vICksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IHR5cGUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExMDgKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlICE9IGFyYzQuVUludDgoZW51bXMuRVZUX0lFRCksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGRpZyA4CiAgICBwdXNoYnl0ZXMgMHgwMQogICAgYiE9CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCB0eXBlCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozNzQKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluIChVSW50NjQoZW51bXMuRVZUX1JSKSwgVUludDY0KGVudW1zLkVWVF9SUkYpKQogICAgZGlnIDQKICAgIHB1c2hpbnQgMTIKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDIxCiAgICBkaWcgNAogICAgcHVzaGludCAxMQogICAgPT0KICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfZmFsc2VAMjIKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAyMToKICAgIGludGNfMSAvLyAxCgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX21lcmdlQDIzOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEwOQogICAgLy8gaWYgc2VsZi5fZXZlbnRfaXNfcmF0ZV9yZXNldChlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpKToKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Vsc2VfYm9keUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODAKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLm9ic2VydmVyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjQgLy8gMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTEzCiAgICAvLyBzZWxmLl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeShlbnRyeSwgcGF5bG9hZCkKICAgIGRpZyA2CiAgICBkaWcgMgogICAgY2FsbHN1YiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkKICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTExNAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMDgxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Vsc2VfYm9keUA1OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTExMgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICBiIGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VANgoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9mYWxzZUAyMjoKICAgIGludGNfMCAvLyAwCiAgICBiIGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfbWVyZ2VAMjMKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfZmFsc2VAMTY6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX21lcmdlQDE3CgoKLy8gbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuZ2V0X2NvbnRyYWN0X3N0YXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2NvbnRyYWN0X3N0YXRlOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBkdXAKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEyMQogICAgLy8gY29udHJhY3RfdHlwZT1hcmM0LlVJbnQ4KHNlbGYuY29udHJhY3RfdHlwZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzIgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExMjMKICAgIC8vIHRvdGFsX3VuaXRzPXNlbGYudG90YWxfdW5pdHMsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEyNAogICAgLy8gcmVzZXJ2ZWRfdW5pdHNfdG90YWw9c2VsZi5yZXNlcnZlZF91bml0c190b3RhbCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTI1CiAgICAvLyBpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudD1zZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExMjYKICAgIC8vIGV2ZW50X2N1cnNvcj1zZWxmLmV2ZW50X2N1cnNvciwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEyNwogICAgLy8gc2NoZWR1bGVfZW50cnlfY291bnQ9c2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExMjgKICAgIC8vIG91dHN0YW5kaW5nX3ByaW5jaXBhbD1zZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEyOQogICAgLy8gaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZT1zZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEzMAogICAgLy8gbm9taW5hbF9pbnRlcmVzdF9yYXRlPXNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTMxCiAgICAvLyBhY2NydWVkX2ludGVyZXN0PXNlbGYuYWNjcnVlZF9pbnRlcmVzdCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTMyCiAgICAvLyBjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4PXNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEzMwogICAgLy8gY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXg9c2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTM0CiAgICAvLyByZXNlcnZlZF9pbnRlcmVzdD1zZWxmLnJlc2VydmVkX2ludGVyZXN0LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExMzUKICAgIC8vIHJlc2VydmVkX3ByaW5jaXBhbD1zZWxmLnJlc2VydmVkX3ByaW5jaXBhbCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExMjAtMTEzNgogICAgLy8gcmV0dXJuIHR5cC5LZXJuZWxTdGF0ZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlPWFyYzQuVUludDgoc2VsZi5jb250cmFjdF90eXBlKSwKICAgIC8vICAgICBzdGF0dXM9c2VsZi5zdGF0dXMsCiAgICAvLyAgICAgdG90YWxfdW5pdHM9c2VsZi50b3RhbF91bml0cywKICAgIC8vICAgICByZXNlcnZlZF91bml0c190b3RhbD1zZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsLAogICAgLy8gICAgIGluaXRpYWxfZXhjaGFuZ2VfYW1vdW50PXNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQsCiAgICAvLyAgICAgZXZlbnRfY3Vyc29yPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgLy8gICAgIHNjaGVkdWxlX2VudHJ5X2NvdW50PXNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQsCiAgICAvLyAgICAgb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2U9c2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlLAogICAgLy8gICAgIG5vbWluYWxfaW50ZXJlc3RfcmF0ZT1zZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBhY2NydWVkX2ludGVyZXN0PXNlbGYuYWNjcnVlZF9pbnRlcmVzdCwKICAgIC8vICAgICBjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4PXNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCwKICAgIC8vICAgICBjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleD1zZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4LAogICAgLy8gICAgIHJlc2VydmVkX2ludGVyZXN0PXNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QsCiAgICAvLyAgICAgcmVzZXJ2ZWRfcHJpbmNpcGFsPXNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsLAogICAgLy8gKQogICAgdW5jb3ZlciAxNAogICAgaXRvYgogICAgdW5jb3ZlciAxNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDEzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDEwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgOQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDgKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTE2CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5nZXRfbmV4dF9kdWVfZXZlbnRbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfbmV4dF9kdWVfZXZlbnQ6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTE0MgogICAgLy8gaWYgc2VsZi5ldmVudF9jdXJzb3IgPj0gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgPj0KICAgIGJ6IGdldF9uZXh0X2R1ZV9ldmVudF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExNDQKICAgIC8vIGV2ZW50X2lkPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTQzLTExNTMKICAgIC8vIHJldHVybiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1zZWxmLmV2ZW50X2N1cnNvciwKICAgIC8vICAgICBldmVudF90eXBlPWFyYzQuVUludDgoMCksCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9VUludDY0KDApLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9VUludDY0KDApLAogICAgLy8gICAgIGZsYWdzPVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGl0b2IKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExNDUKICAgIC8vIGV2ZW50X3R5cGU9YXJjNC5VSW50OCgwKSwKICAgIGJ5dGVjIDQwIC8vIDB4MDAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjExNDMtMTE1MwogICAgLy8gcmV0dXJuIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgIGV2ZW50X2lkPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgLy8gICAgIGV2ZW50X3R5cGU9YXJjNC5VSW50OCgwKSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1VSW50NjQoMCksCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1VSW50NjQoMCksCiAgICAvLyAgICAgZmxhZ3M9VUludDY0KDApLAogICAgLy8gKQogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTQ2CiAgICAvLyBzY2hlZHVsZWRfdGltZT1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTE0My0xMTUzCiAgICAvLyByZXR1cm4gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkoCiAgICAvLyAgICAgZXZlbnRfaWQ9c2VsZi5ldmVudF9jdXJzb3IsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1hcmM0LlVJbnQ4KDApLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPVVJbnQ2NCgwKSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249VUludDY0KDApLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPVVJbnQ2NCgwKSwKICAgIC8vICAgICBmbGFncz1VSW50NjQoMCksCiAgICAvLyApCiAgICBpdG9iCiAgICBzd2FwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKCmdldF9uZXh0X2R1ZV9ldmVudF9hZnRlcl9pbmxpbmVkX21vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmdldF9uZXh0X2R1ZV9ldmVudEA0OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTEzOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpnZXRfbmV4dF9kdWVfZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTE1NAogICAgLy8gcmV0dXJuIHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLmV2ZW50X2N1cnNvcikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMTM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgZ2V0X25leHRfZHVlX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuZ2V0X25leHRfZHVlX2V2ZW50QDQKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5jb250cmFjdF91cGRhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF91cGRhdGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTUzLTE1NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGdyYW50cyB0aGUgdXBkYXRlIHBlcm1pc3Npb25zIHRvIHRoZSBBcnJhbmdlci4KICAgIC8vICMg4pqg77iPIFdBUk5JTkc6IEFwcGxpY2F0aW9uIHVwZGF0ZXMgbXVzdCBiZSBleGVjdXRlZCBWRVJZIGNhcmVmdWxseSwgYXMgdGhleQogICAgLy8gIyBtaWdodCBpbnRyb2R1Y2UgYnJlYWtpbmcgY2hhbmdlcy4KICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfcm90YXRlX2FycmFuZ2VyW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19yb3RhdGVfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2OQogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTcwCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gbmV3X2FycmFuZ2VyCiAgICBieXRlYyAxOCAvLyAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTcxCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfc2V0X29wX2RhZW1vbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfc2V0X29wX2RhZW1vbjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTg0CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODUKICAgIC8vIHNlbGYub3BfZGFlbW9uLnZhbHVlID0gYWRkcmVzcwogICAgYnl0ZWMgMjUgLy8gMHg1MjIzNGY3MDQ0NjE2NTZkNmY2ZTIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4NgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTczCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2Fzc2lnbl9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19hc3NpZ25fcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDE2CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLlJvbGVWYWxpZGl0eQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjExCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMgogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgcHVzaGludCAyMAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTAzCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gcm9sZV9hZGRyZXNzCiAgICBieXRlYyAxOCAvLyAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMKICAgIGRpZyAzCiAgICBhcHBfZ2xvYmFsX3B1dAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTQKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDYKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIGR1cAogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnRfbWFuYWdlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMyAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwOAogICAgLy8gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMiAvLyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTIKICAgIC8vIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIGR1cAogICAgcHVzaGludCA2MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE1CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMzIgLy8gMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE2CiAgICAvLyBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExOAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMSAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIwCiAgICAvLyBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMwogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgODAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIzCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI0IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI0CiAgICAvLyBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3Jldm9rZV9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19yZXZva2Vfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzUKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzNgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzcKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCkpCiAgICBidG9pCiAgICBkdXBuIDIKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCAhPSBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksIGVyci5JTlZBTElEX1JPTEUKICAgIGR1cAogICAgcHVzaGludCAyMAogICAgIT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyOAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIzIC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0NGQ2MTZlNjE2NzY1NzIyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMwCiAgICAvLyBkZWwgc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzOQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjE2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIyIC8vIDB4NTIyMzUwNzI2OTZkNjE3Mjc5NDQ2NTYxNmM2NTcyMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNAogICAgLy8gZGVsIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjM4CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIGR1cAogICAgcHVzaGludCA2MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAzMiAvLyAweDUyMjM1NDcyNzU3Mzc0NjU2NTIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzgKICAgIC8vIGRlbCBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjM4CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDEKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hdXRob3JpdHksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjEgLy8gMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MgogICAgLy8gZGVsIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzOAogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDQKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDgwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI0IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ2CiAgICAvLyBkZWwgc2VsZi5vYnNlcnZlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ292X2Fzc2V0X3N1c3BlbnNpb25bcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dvdl9hc3NldF9zdXNwZW5zaW9uOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kICAjIFRPRE86IFVwZGF0ZSBzcGVjcyBhbmQgYWRkIHRlc3QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzcKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDIxIC8vIDB4NTIyMzQxNzU3NDY4NmY3MjY5NzQ3OTIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU3CiAgICAvLyBzZWxmLmFzc2V0X3N1c3BlbmRlZCA9IHN1c3BlbmRlZAogICAgYnl0ZWMgMzMgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU4CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCAgIyBUT0RPOiBVcGRhdGUgc3BlY3MgYW5kIGFkZCB0ZXN0CiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYXJyYW5nZXJbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNjgKICAgIC8vIHJldHVybiBzZWxmLmFycmFuZ2VyLnZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTggLy8gMHg1MjIzNDE3MjcyNjE2ZTY3NjU3MjIzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJyYW5nZXIgZXhpc3RzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjYwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9hZGRyZXNzX3JvbGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfYWRkcmVzc19yb2xlczoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg0CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmFjY291bnRfbWFuYWdlciwgYWRkcmVzcyksCiAgICBieXRlYyAyMyAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMKICAgIGRpZyAxCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4NQogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5wcmltYXJ5X2RlYWxlciwgYWRkcmVzcyksCiAgICBieXRlYyAyMiAvLyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzCiAgICBkaWcgMgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODYKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYudHJ1c3RlZSwgYWRkcmVzcyksCiAgICBieXRlYyAzMiAvLyAweDUyMjM1NDcyNzU3Mzc0NjU2NTIzCiAgICBkaWcgMwogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODcKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYXV0aG9yaXR5LCBhZGRyZXNzKSwKICAgIGJ5dGVjIDIxIC8vIDB4NTIyMzQxNzU3NDY4NmY3MjY5NzQ3OTIzCiAgICBkaWcgNAogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODgKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYub2JzZXJ2ZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjQgLy8gMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzCiAgICB1bmNvdmVyIDUKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjcwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjIDQwIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDYKICAgIHNldGJpdAogICAgaW50Y18xIC8vIDEKICAgIHVuY292ZXIgNQogICAgc2V0Yml0CiAgICBwdXNoaW50IDIKICAgIHVuY292ZXIgNAogICAgc2V0Yml0CiAgICBwdXNoaW50IDMKICAgIHVuY292ZXIgMwogICAgc2V0Yml0CiAgICBwdXNoaW50IDQKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA1CiAgICAvLyByb2xlID0gcm9sZV9pZC5hc191aW50NjQoKQogICAgYnRvaQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwNgogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZSkKICAgIGR1cAogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDgKICAgIC8vIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgcHVzaGludHMgMjAgNDAgNTAgNjAgNzAgODAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDctMzM4CiAgICAvLyBtYXRjaCByb2xlOgogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgLy8gICAgICAgICByZXR1cm4gdHlwLlJvbGVWYWxpZGl0eSgKICAgIC8vICAgICAgICAgICAgIHJvbGVfdmFsaWRpdHlfc3RhcnQ9VUludDY0KDApLCByb2xlX3ZhbGlkaXR5X2VuZD1VSW50NjQoMCkKICAgIC8vICAgICAgICAgKQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5hdXRob3JpdHksIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5vYnNlcnZlciwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5vYnNlcnZlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBfOgogICAgLy8gICAgICAgICBvcC5lcnIoZXJyLklOVkFMSURfUk9MRSkKICAgIHVuY292ZXIgNgogICAgbWF0Y2ggcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8wQDIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8xQDMgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8yQDQgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8zQDUgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV80QDYgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV81QDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzgKICAgIC8vIG9wLmVycihlcnIuSU5WQUxJRF9ST0xFKQogICAgZXJyIC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzVANzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzQKICAgIC8vIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMjQgLy8gMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzMzLTMzNQogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMzNgogICAgLy8gcmV0dXJuIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzRANjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjkKICAgIC8vIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDIxIC8vIDB4NTIyMzQxNzU3NDY4NmY3MjY5NzQ3OTIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI4LTMzMAogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzEKICAgIC8vIHJldHVybiBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzNANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjQKICAgIC8vIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAzMiAvLyAweDUyMjM1NDcyNzU3Mzc0NjU2NTIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzIzLTMyNQogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI2CiAgICAvLyByZXR1cm4gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMkA0OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxOQogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAyMiAvLyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzE4LTMyMAogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMQogICAgLy8gcmV0dXJuIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8xQDM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzE0CiAgICAvLyBzZWxmLmFjY291bnRfbWFuYWdlciwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAyMyAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTMtMzE1CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxNgogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMEAyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwOS0zMTEKICAgIC8vIHJldHVybiB0eXAuUm9sZVZhbGlkaXR5KAogICAgLy8gICAgIHJvbGVfdmFsaWRpdHlfc3RhcnQ9VUludDY0KDApLCByb2xlX3ZhbGlkaXR5X2VuZD1VSW50NjQoMCkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLl9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IHZvaWQ6Cl9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI2CiAgICAvLyBkZWYgX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQoc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjgKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkLCBlcnIuU1VTUEVOREVECiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCAzODQKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIFN1c3BlbmRlZCBvcGVyYXRpb25zCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5fc2V0dGxlX3Bvc2l0aW9uKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NCwgdWludDY0Ogpfc2V0dGxlX3Bvc2l0aW9uOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjQ0CiAgICAvLyBkZWYgX3NldHRsZV9wb3NpdGlvbihzZWxmLCBob2xkaW5nX2FkZHJlc3M6IEFjY291bnQpIC0+IHR1cGxlW1VJbnQ2NCwgVUludDY0XToKICAgIHByb3RvIDEgMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo2MQogICAgLy8gcG9zaXRpb24gPSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jb3B5KCkKICAgIGR1cAogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NjMtNjUKICAgIC8vICMgQ29tcHV0ZSB0aGUgaW5jcmVtZW50YWwgcGVyLXVuaXQgZml4ZWQtcG9pbnQgaW50ZXJlc3QgYW5kIHByaW5jaXBhbCBhY2NydWVkCiAgICAvLyAjIHNpbmNlIHRoaXMgYWNjb3VudCdzIGxhc3QgY2hlY2twb2ludC4KICAgIC8vIGludGVyZXN0X2RlbHRhID0gc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IC0gcG9zaXRpb24uaW50ZXJlc3RfY2hlY2twb2ludAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggZXhpc3RzCiAgICBkaWcgMQogICAgcHVzaGludCA1NwogICAgZXh0cmFjdF91aW50NjQKICAgIC0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo2NwogICAgLy8gc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCAtIHBvc2l0aW9uLnByaW5jaXBhbF9jaGVja3BvaW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTcgLy8gImN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IGV4aXN0cwogICAgZGlnIDIKICAgIHB1c2hpbnQgNjUKICAgIGV4dHJhY3RfdWludDY0CiAgICAtCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzMKICAgIC8vIGludGVyZXN0X2RlbHRhLCBwb3NpdGlvbi51bml0cywgc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgZGlnIDIKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3MC03NAogICAgLy8gIyBDb252ZXJ0IHRoZSBwZXItdW5pdCBmaXhlZC1wb2ludCBkZWx0YXMgaW50byBhYnNvbHV0ZSBjbGFpbWFibGUgYW1vdW50cwogICAgLy8gIyB1c2luZyB0aGUgYWNjb3VudCdzIGFjdGl2ZSB1bml0cy4KICAgIC8vIGNsYWltYWJsZV9pbnRlcmVzdCA9IHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIGludGVyZXN0X2RlbHRhLCBwb3NpdGlvbi51bml0cywgc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgLy8gKQogICAgdW5jb3ZlciAzCiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojc2CiAgICAvLyBwcmluY2lwYWxfZGVsdGEsIHBvc2l0aW9uLnVuaXRzLCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzUtNzcKICAgIC8vIGNsYWltYWJsZV9wcmluY2lwYWwgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBwcmluY2lwYWxfZGVsdGEsIHBvc2l0aW9uLnVuaXRzLCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICAvLyApCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojc5LTgxCiAgICAvLyAjIEFjY3J1ZSB0aGUgY2xhaW1hYmxlIGFtb3VudHMgdG8gdGhlIGFjY291bnQgcG9zaXRpb24gYW5kIG1ha2UgdGhlbSBhdmFpbGFibGUKICAgIC8vICMgZm9yIHdpdGhkcmF3YWwuCiAgICAvLyBwb3NpdGlvbi5jbGFpbWFibGVfaW50ZXJlc3QgKz0gY2xhaW1hYmxlX2ludGVyZXN0CiAgICBkaWcgMgogICAgcHVzaGludCA3MwogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICArCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIHN3YXAKICAgIHJlcGxhY2UyIDczCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6ODIKICAgIC8vIHBvc2l0aW9uLmNsYWltYWJsZV9wcmluY2lwYWwgKz0gY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgZHVwCiAgICBwdXNoaW50IDgxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDIKICAgICsKICAgIGl0b2IKICAgIHJlcGxhY2UyIDgxCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6ODQtODYKICAgIC8vICMgQWR2YW5jZSB0aGUgYWNjb3VudCdzIHBlci11bml0IGZpeGVkLXBvaW50IGNoZWNrcG9pbnRzIHRvIHRoZSBjdXJyZW50IGdsb2JhbAogICAgLy8gIyBwZXItdW5pdCBmaXhlZC1wb2ludCBnbG9iYWwgaW5kaWNlcy4KICAgIC8vIHBvc2l0aW9uLmludGVyZXN0X2NoZWNrcG9pbnQgPSBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IGV4aXN0cwogICAgaXRvYgogICAgcmVwbGFjZTIgNTcKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo4NwogICAgLy8gcG9zaXRpb24ucHJpbmNpcGFsX2NoZWNrcG9pbnQgPSBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTcgLy8gImN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IGV4aXN0cwogICAgaXRvYgogICAgcmVwbGFjZTIgNjUKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo4OS05MAogICAgLy8gIyBBZHZhbmNlIHRoZSBhY2NvdW50J3MgZXZlbnQgY3Vyc29yIHRvIHRoZSBjdXJyZW50IGdsb2JhbCBldmVudCBjdXJzb3IuCiAgICAvLyBwb3NpdGlvbi5zZXR0bGVkX2N1cnNvciA9IHNlbGYuZXZlbnRfY3Vyc29yCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGl0b2IKICAgIHJlcGxhY2UyIDQ5CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6OTItOTQKICAgIC8vICMgVXBkYXRlIHRoZSBhY2NvdW50IHBvc2l0aW9uIGFuZCByZXR1cm4gdGhlIG5ld2x5IGFjY3J1ZWQgY2xhaW1hYmxlIGFtb3VudHMKICAgIC8vICMgYWRkZWQgdG8gdGhlIHRvdGFsIHBvc2l0aW9uJ3MgY2xhaW1hYmxlIGFtb3VudHMuCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHBvc2l0aW9uLmNvcHkoKQogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6OTUKICAgIC8vIHJldHVybiBjbGFpbWFibGVfaW50ZXJlc3QsIGNsYWltYWJsZV9wcmluY2lwYWwKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IHZvaWQ6Cl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojk3CiAgICAvLyBkZWYgX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQoc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQyMwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDAKICAgIC8vIGlmIHNlbGYuX3N0YXR1c19pc19wZW5kaW5nX2llZCgpOgogICAgYnogX2Vuc3VyZV91bml0c19hY3RpdmF0ZWRfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTAxCiAgICAvLyByZXR1cm4KICAgIHJldHN1YgoKX2Vuc3VyZV91bml0c19hY3RpdmF0ZWRfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwMwogICAgLy8gcG9zaXRpb24gPSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAyCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDQKICAgIC8vIGlmIHBvc2l0aW9uLnJlc2VydmVkX3VuaXRzID09IFVJbnQ2NCgwKToKICAgIHB1c2hpbnQgNDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgYm56IF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkX2FmdGVyX2lmX2Vsc2VANAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwNQogICAgLy8gcmV0dXJuCiAgICByZXRzdWIKCl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkX2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDgKICAgIC8vIHBvc2l0aW9uLnVuaXRzICs9IGFjdGl2YXRlZF91bml0cwogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMwogICAgKwogICAgaXRvYgogICAgcmVwbGFjZTIgMzIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDkKICAgIC8vIHBvc2l0aW9uLnJlc2VydmVkX3VuaXRzID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgaXRvYgogICAgcmVwbGFjZTIgNDAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTAKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gcG9zaXRpb24uY29weSgpCiAgICBmcmFtZV9kaWcgMgogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExMQogICAgLy8gYXNzZXJ0IHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPj0gYWN0aXZhdGVkX3VuaXRzLCBlcnIuT1ZFUl9ESVNUUklCVVRJT04KICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICBkdXAKICAgIGRpZyAyCiAgICA+PQogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCByZW1haW5pbmcgRC1BU0EgdW5pdHMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTIKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgLT0gYWN0aXZhdGVkX3VuaXRzCiAgICBzd2FwCiAgICAtCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX3NjYWxlZF9tdWxfZGl2KG11bHRpcGxpY2FuZDogdWludDY0LCBtdWx0aXBsaWVyOiB1aW50NjQsIGRpdmlzb3I6IHVpbnQ2NCkgLT4gdWludDY0Ogpfc2NhbGVkX211bF9kaXY6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNTMtMTU1CiAgICAvLyBkZWYgX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIHNlbGYsIG11bHRpcGxpY2FuZDogVUludDY0LCBtdWx0aXBsaWVyOiBVSW50NjQsIGRpdmlzb3I6IFVJbnQ2NAogICAgLy8gKSAtPiBVSW50NjQ6CiAgICBwcm90byAzIDEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE1NwogICAgLy8gaWYgbXVsdGlwbGljYW5kID09IFVJbnQ2NCgwKSBvciBtdWx0aXBsaWVyID09IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMwogICAgYnogX3NjYWxlZF9tdWxfZGl2X2lmX2JvZHlAMgogICAgZnJhbWVfZGlnIC0yCiAgICBibnogX3NjYWxlZF9tdWxfZGl2X2FmdGVyX2lmX2Vsc2VAMwoKX3NjYWxlZF9tdWxfZGl2X2lmX2JvZHlAMjoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE1OAogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKX3NjYWxlZF9tdWxfZGl2X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE1OQogICAgLy8gaGlnaCwgbG93ID0gb3AubXVsdyhtdWx0aXBsaWNhbmQsIG11bHRpcGxpZXIpCiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMgogICAgbXVsdwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTYwCiAgICAvLyByZXR1cm4gb3AuZGl2dyhoaWdoLCBsb3csIGRpdmlzb3IpCiAgICBmcmFtZV9kaWcgLTEKICAgIGRpdncKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9hbW91bnRfdG9faW5kZXhfZGVsdGEoYW1vdW50OiB1aW50NjQpIC0+IHVpbnQ2NDoKX2Ftb3VudF90b19pbmRleF9kZWx0YToKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE2MgogICAgLy8gZGVmIF9hbW91bnRfdG9faW5kZXhfZGVsdGEoc2VsZiwgYW1vdW50OiBVSW50NjQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTY0CiAgICAvLyBpZiBhbW91bnQgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0xCiAgICBibnogX2Ftb3VudF90b19pbmRleF9kZWx0YV9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE2NQogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKX2Ftb3VudF90b19pbmRleF9kZWx0YV9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNjYKICAgIC8vIGFzc2VydCBzZWxmLnRvdGFsX3VuaXRzID4gVUludDY0KDApLCBlcnIuTk9fVU5JVFMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICBkdXAKICAgIGFzc2VydCAvLyBObyBELUFTQSB1bml0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTY3CiAgICAvLyByZXR1cm4gc2VsZi5fc2NhbGVkX211bF9kaXYoYW1vdW50LCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLCBzZWxmLnRvdGFsX3VuaXRzKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5faW5kZXhfZGVsdGFfdG9fYW1vdW50KGluZGV4X2RlbHRhOiB1aW50NjQpIC0+IHVpbnQ2NDoKX2luZGV4X2RlbHRhX3RvX2Ftb3VudDoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE2OQogICAgLy8gZGVmIF9pbmRleF9kZWx0YV90b19hbW91bnQoc2VsZiwgaW5kZXhfZGVsdGE6IFVJbnQ2NCkgLT4gVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNzYKICAgIC8vIGlmIGluZGV4X2RlbHRhID09IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMQogICAgYm56IF9pbmRleF9kZWx0YV90b19hbW91bnRfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxNzcKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9pbmRleF9kZWx0YV90b19hbW91bnRfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTc5CiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE4MQogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE3OC0xODIKICAgIC8vIHJldHVybiBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLnRvdGFsX3VuaXRzLAogICAgLy8gICAgIGluZGV4X2RlbHRhLAogICAgLy8gICAgIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZ2V0X3NjaGVkdWxlX2VudHJ5KGV2ZW50X2lkOiB1aW50NjQpIC0+IGJ5dGVzOgpfZ2V0X3NjaGVkdWxlX2VudHJ5OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjAyCiAgICAvLyBkZWYgX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLCBldmVudF9pZDogVUludDY0KSAtPiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeToKICAgIHByb3RvIDEgMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjA0CiAgICAvLyBhc3NlcnQgZXZlbnRfaWQgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LCBlcnIuSU5WQUxJRF9FVkVOVF9JRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICA+CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBpZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTkwCiAgICAvLyByZXR1cm4gZXZlbnRfaWQgLy8gVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMTYKICAgIC8KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjIwNgogICAgLy8gYXNzZXJ0IHBhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBpdG9iCiAgICBieXRlYyAzMSAvLyAweDUzMjMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjE5NAogICAgLy8gcmV0dXJuIGV2ZW50X2lkICUgVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMTYKICAgICUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjIwOQogICAgLy8gYXNzZXJ0IG9mZnNldCA8IHBhZ2UubGVuZ3RoLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIHB1c2hpbnQgMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGRpZyAxCiAgICA+CiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyMTAKICAgIC8vIHJldHVybiBwYWdlW29mZnNldF0uY29weSgpCiAgICBwdXNoaW50IDY1CiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIHB1c2hpbnQgNjUKICAgIGJveF9leHRyYWN0CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoY29udHJhY3RfdHlwZTogdWludDY0LCBldmVudF90eXBlOiB1aW50NjQpIC0+IHZvaWQ6Cl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZToKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMxMy0zMTUKICAgIC8vIGRlZiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgc2VsZiwgY29udHJhY3RfdHlwZTogVUludDY0LCBldmVudF90eXBlOiBVSW50NjQKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjU0LTI1NQogICAgLy8gIyBDaGVjayBjb21tb24gZXZlbnRzIGZpcnN0CiAgICAvLyBpZiBldmVudF90eXBlIGluIGNvbW1vbl9ldmVudHM6CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI0NwogICAgLy8gVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI0OAogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUCksCiAgICBpbnRjXzIgLy8gOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjU0LTI1NQogICAgLy8gIyBDaGVjayBjb21tb24gZXZlbnRzIGZpcnN0CiAgICAvLyBpZiBldmVudF90eXBlIGluIGNvbW1vbl9ldmVudHM6CiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjQ5CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX01EKSwKICAgIHB1c2hpbnQgMTkKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI1MAogICAgLy8gVUludDY0KGVudW1zLkVWVF9SUiksCiAgICBwdXNoaW50IDEyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyNTEKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIHB1c2hpbnQgMTEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDcKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDY6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyNTYKICAgIC8vIHJldHVybiBUcnVlCiAgICBpbnRjXzEgLy8gMQoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQ6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIHJldHN1YgoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI1OC0yNTkKICAgIC8vICMgQ29udHJhY3Qtc3BlY2lmaWMgYWRkaXRpb25hbCBldmVudHMKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX1BBTSk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyNjAtMjYxCiAgICAvLyAjIFBBTSBvbmx5IHN1cHBvcnRzIGNvbW1vbiBldmVudHMKICAgIC8vIHJldHVybiBGYWxzZQogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI2MwogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfTEFNKSBvciBjb250cmFjdF90eXBlID09IFVJbnQ2NCgKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAzCiAgICA9PQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjYzLTI2NQogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfTEFNKSBvciBjb250cmFjdF90eXBlID09IFVJbnQ2NCgKICAgIC8vICAgICBlbnVtcy5DVF9OQU0KICAgIC8vICk6CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlAMTEKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAyCiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMTYKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDExOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjY2LTI3MAogICAgLy8gIyBMQU0vTkFNIGFkZDogUFIsIElQQ0IKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyNjgKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyNjYtMjcwCiAgICAvLyAjIExBTS9OQU0gYWRkOiBQUiwgSVBDQgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMTMKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjY5CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgcHVzaGludCAxOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjY2LTI3MAogICAgLy8gIyBMQU0vTkFNIGFkZDogUFIsIElQQ0IKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gKQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDE0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDEzOgogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMTQ6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAxNjoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI3MgogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKToKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAyMwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjczLTI3OAogICAgLy8gIyBBTk4gYWRkczogUFIsIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyNzUKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyNzMtMjc4CiAgICAvLyAjIEFOTiBhZGRzOiBQUiwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjAKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Mjc2CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgcHVzaGludCAxOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjczLTI3OAogICAgLy8gIyBBTk4gYWRkczogUFIsIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDIwCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI3NwogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyNzMtMjc4CiAgICAvLyAjIEFOTiBhZGRzOiBQUiwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMjEKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjA6CiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF9mYWxzZUAyMToKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDIzOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjgwCiAgICAvLyBpZiBjb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9MQVgpOgogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDQKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAzMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjgxLTI4NwogICAgLy8gIyBMQVggYWRkczogUFIsIFBJLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjgzCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjgxLTI4NwogICAgLy8gIyBMQVggYWRkczogUFIsIFBJLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyOAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyODQKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgcHVzaGludCA0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyODEtMjg3CiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDI4CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI4NQogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIHB1c2hpbnQgMTgKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI4MS0yODcKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjgKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Mjg2CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICBwdXNoaW50IDUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjI4MS0yODcKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMjkKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjg6CiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF9mYWxzZUAyOToKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDMxOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Mjg5CiAgICAvLyBpZiBjb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9DTE0pOgogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDUKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAzMwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MjkwLTI5MQogICAgLy8gIyBDTE0gYWRkczogUFIKICAgIC8vIHJldHVybiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMzM6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToyOTMKICAgIC8vIHJldHVybiBGYWxzZQogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKCi8vIG1vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9pc19keW5hbWljX2FubnVpdHkoKSAtPiB1aW50NjQ6Cl9pc19keW5hbWljX2FubnVpdHk6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozMzUKICAgIC8vIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMzNS0zMzYKICAgIC8vIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKQogICAgLy8gYW5kIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgYnogX2lzX2R5bmFtaWNfYW5udWl0eV9ib29sX2ZhbHNlQDMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMzNgogICAgLy8gYW5kIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDM0IC8vICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24gZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozMzUtMzM2CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIC8vIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGJ6IF9pc19keW5hbWljX2FubnVpdHlfYm9vbF9mYWxzZUAzCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzM0LTMzNwogICAgLy8gcmV0dXJuICgKICAgIC8vICAgICBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIC8vICAgICBhbmQgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICAvLyApCiAgICByZXRzdWIKCl9pc19keW5hbWljX2FubnVpdHlfYm9vbF9mYWxzZUAzOgogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjMzNC0zMzcKICAgIC8vIHJldHVybiAoCiAgICAvLyAgICAgc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICAvLyAgICAgYW5kIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgLy8gKQogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnk6IGJ5dGVzKSAtPiB1aW50NjQsIGJ5dGVzOgpfZW50cnlfaW50ZXJlc3Rfc2VnbWVudDoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjM4MAogICAgLy8gZGVmIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KHNlbGYsIGVudHJ5OiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSkgLT4gVUludDY0OgogICAgcHJvdG8gMSAyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozODkKICAgIC8vIGVudHJ5LmFjY3J1YWxfZmFjdG9yID09IFVJbnQ2NCgwKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDE3CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozODktMzkxCiAgICAvLyBlbnRyeS5hY2NydWFsX2ZhY3RvciA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID09IFVJbnQ2NCgwKQogICAgLy8gb3Igc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID09IFVJbnQ2NCgwKQogICAgYnogX2VudHJ5X2ludGVyZXN0X3NlZ21lbnRfaWZfYm9keUAzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozOTAKICAgIC8vIG9yIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID09IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozODktMzkxCiAgICAvLyBlbnRyeS5hY2NydWFsX2ZhY3RvciA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID09IFVJbnQ2NCgwKQogICAgLy8gb3Igc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID09IFVJbnQ2NCgwKQogICAgYnogX2VudHJ5X2ludGVyZXN0X3NlZ21lbnRfaWZfYm9keUAzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozOTEKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTozODktMzkxCiAgICAvLyBlbnRyeS5hY2NydWFsX2ZhY3RvciA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID09IFVJbnQ2NCgwKQogICAgLy8gb3Igc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID09IFVJbnQ2NCgwKQogICAgYm56IF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2FmdGVyX2lmX2Vsc2VANAoKX2VudHJ5X2ludGVyZXN0X3NlZ21lbnRfaWZfYm9keUAzOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MzkzCiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfZGlnIC0xCiAgICB1bmNvdmVyIDIKICAgIHJldHN1YgoKX2VudHJ5X2ludGVyZXN0X3NlZ21lbnRfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Mzk1CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Mzk2CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Mzk3CiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Mzk0LTM5OAogICAgLy8gYWNjcnVlZCA9IHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSwKICAgIC8vICAgICBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQwMgogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjM5OS00MDMKICAgIC8vIHJldHVybiBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBhY2NydWVkLAogICAgLy8gICAgIGVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMAogICAgc3dhcAogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIGZyYW1lX2RpZyAtMQogICAgdW5jb3ZlciAyCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZGlzY291bnRfYW5udWl0eV9mYWN0b3IoZGlzY291bnRfZmFjdG9yOiB1aW50NjQsIHJlZGVtcHRpb25fZmFjdG9yOiB1aW50NjQpIC0+IHVpbnQ2NDoKX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDYyLTQ2NgogICAgLy8gZGVmIF9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcigKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgIGRpc2NvdW50X2ZhY3RvcjogVUludDY0LAogICAgLy8gICAgIHJlZGVtcHRpb25fZmFjdG9yOiBVSW50NjQsCiAgICAvLyApIC0+IFVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDY4CiAgICAvLyBpZiByZWRlbXB0aW9uX2ZhY3RvciA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGJueiBfZGlzY291bnRfYW5udWl0eV9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0NjkKICAgIC8vIHJldHVybiBkaXNjb3VudF9mYWN0b3IKICAgIGZyYW1lX2RpZyAtMgogICAgcmV0c3ViCgpfZGlzY291bnRfYW5udWl0eV9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDcwCiAgICAvLyBwZXJpb2RfcmF0ZSA9IHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgKyBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQ3MQogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQ3MC00NzQKICAgIC8vIHBlcmlvZF9yYXRlID0gc2VsZi5maXhlZF9wb2ludF9zY2FsZSArIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIHJlZGVtcHRpb25fZmFjdG9yLAogICAgLy8gICAgIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgKwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDc1CiAgICAvLyBhc3NlcnQgcGVyaW9kX3JhdGUgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZHVwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0NzgKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0NzYtNDgwCiAgICAvLyByZXR1cm4gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgZGlzY291bnRfZmFjdG9yLAogICAgLy8gICAgIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICAvLyAgICAgcGVyaW9kX3JhdGUsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeShlbnRyeTogYnl0ZXMsIHBheWxvYWQ6IGJ5dGVzKSAtPiBieXRlcywgYnl0ZXM6Cl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeToKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYxMy02MTUKICAgIC8vIGRlZiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkoCiAgICAvLyAgICAgc2VsZiwgZW50cnk6IHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5LCBwYXlsb2FkOiB0eXAuT2JzZXJ2ZWRFdmVudFJlcXVlc3QKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDIgMgogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2MjMKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF9pZCA9PSBzZWxmLmV2ZW50X2N1cnNvciwgZXJyLklOVkFMSURfRVZFTlRfQ1VSU09SCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgY3Vyc29yCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2MjQKICAgIC8vIGFzc2VydCBlbnRyeS5zY2hlZHVsZWRfdGltZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwgZXJyLk5PX0RVRV9DQVNIRkxPVwogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA8PQogICAgYXNzZXJ0IC8vIE5vIGR1ZSBjYXNoZmxvdyB0byBwYXkKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYyNgogICAgLy8gZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjI3CiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfSUVEKToKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgZHVwCiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMzUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjI4LTYzMAogICAgLy8gIyBJRUQgZmluYWxpemVzIGlzc3VhbmNlOiByZXNlcnZlZCB1bml0cyBiZWNvbWUgYWN0aXZhdGFibGUgYW5kIHRoZQogICAgLy8gIyBzY2hlZHVsZSdzIGluaXRpYWwgY29udHJhY3R1YWwgc3RhdGUgYmVjb21lcyBsaXZlLgogICAgLy8gYXNzZXJ0IHNlbGYuX3N0YXR1c19pc19wZW5kaW5nX2llZCgpLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYzMgogICAgLy8gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCA9PSBzZWxmLnRvdGFsX3VuaXRzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgID09CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2MzEtNjMzCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPT0gc2VsZi50b3RhbF91bml0cwogICAgLy8gKSwgZXJyLlBSSU1BUllfRElTVFJJQlVUSU9OX0lOQ09NUExFVEUKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBub3QgY29tcGxldGUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYzNAogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2MzUKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYzNgogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPSBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZQogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYzNwogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ID0gVUludDY0KDApCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2MzgKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IGVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA0MQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjYzOQogICAgLy8gc2VsZi5ldmVudF9jdXJzb3IgKz0gVUludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjQwCiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbnVtcy5TVEFUVVNfQUNUSVZFKQogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgcHVzaGludCAxMDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0NTEKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwgZXJyLk5PVF9FVlRfSUVECiAgICBmcmFtZV9kaWcgMTEKICAgIGFzc2VydCAvLyBOb3QgSUVEIGV2ZW50CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo0NTIKICAgIC8vIHJldHVybiBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjQxLTY0NQogICAgLy8gc2VsZi5fZW1pdF9leGVjdXRpb25fZXZlbnQoCiAgICAvLyAgICAgZW50cnk9ZW50cnksCiAgICAvLyAgICAgcGF5b2ZmPXNlbGYuX2VudHJ5X2llZF9hbW91bnQoZW50cnkpLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjQ0CiAgICAvLyBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjQxLTY0NQogICAgLy8gc2VsZi5fZW1pdF9leGVjdXRpb25fZXZlbnQoCiAgICAvLyAgICAgZW50cnk9ZW50cnksCiAgICAvLyAgICAgcGF5b2ZmPXNlbGYuX2VudHJ5X2llZF9hbW91bnQoZW50cnkpLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGNhbGxzdWIgX2VtaXRfZXhlY3V0aW9uX2V2ZW50CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgLTIKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjY0NgogICAgLy8gcmV0dXJuCiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2J1cnkgMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weToxMzUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6MTQ3CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuX3N0YXR1c19pc19wZW5kaW5nX2llZCgpLCBlcnIuUEVORElOR19JRUQKICAgICEKICAgIGFzc2VydCAvLyBJRUQgbm90IHlldCBleGVjdXRlZAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjQ5CiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgKz0gc2VsZi5fZW50cnlfaW50ZXJlc3Rfc2VnbWVudChlbnRyeSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQKICAgIGZyYW1lX2J1cnkgLTIKICAgICsKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjUxCiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUlIpOgogICAgZnJhbWVfZGlnIDEwCiAgICBwdXNoaW50IDEyCiAgICA9PQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAxMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjU1CiAgICAvLyBwYXlsb2FkLm9ic2VydmVkX3JhdGUsCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2NTYKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9tdWx0aXBsaWVyLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDM2IC8vICJyYXRlX3Jlc2V0X211bHRpcGxpZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9tdWx0aXBsaWVyIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjU3CiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjUyLTY1OAogICAgLy8gIyBSUiBkZXJpdmVzIHRoZSBuZXh0IHJhdGUgZnJvbSBhbiBvYnNlcnZlZCBvcmFjbGUgdmFsdWUgcGx1cyB0aGUKICAgIC8vICMgY29udHJhY3Qgc3ByZWFkIC8gbXVsdGlwbGllciB0ZXJtcywgdGhlbiBlbmZvcmNlcyBmbG9vciBhbmQgY2FwLgogICAgLy8gb2JzZXJ2ZWRfcmF0ZSA9IHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIHBheWxvYWQub2JzZXJ2ZWRfcmF0ZSwKICAgIC8vICAgICBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjY2MAogICAgLy8gb2JzZXJ2ZWRfcmF0ZSArIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzNSAvLyAicmF0ZV9yZXNldF9zcHJlYWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQgZXhpc3RzCiAgICArCiAgICBmcmFtZV9idXJ5IDYKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjczNAogICAgLy8gaWYgc2VsZi5oYXNfcmF0ZV9yZXNldF9mbG9vciBhbmQgcmF0ZSA8IHNlbGYucmF0ZV9yZXNldF9mbG9vcjoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzOCAvLyAiaGFzX3JhdGVfcmVzZXRfZmxvb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgZXhpc3RzCiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1NQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI5IC8vICJyYXRlX3Jlc2V0X2Zsb29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfZmxvb3IgZXhpc3RzCiAgICBmcmFtZV9kaWcgNgogICAgPgogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjczNQogICAgLy8gcmF0ZSA9IHNlbGYucmF0ZV9yZXNldF9mbG9vcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI5IC8vICJyYXRlX3Jlc2V0X2Zsb29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgNgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9mbG9vciBleGlzdHMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU1OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzM2CiAgICAvLyBpZiBzZWxmLmhhc19yYXRlX3Jlc2V0X2NhcCBhbmQgcmF0ZSA+IHNlbGYucmF0ZV9yZXNldF9jYXA6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzkgLy8gImhhc19yYXRlX3Jlc2V0X2NhcCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgZXhpc3RzCiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1OAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDMwIC8vICJyYXRlX3Jlc2V0X2NhcCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X2NhcCBleGlzdHMKICAgIGZyYW1lX2RpZyA2CiAgICA8CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1OAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzM3CiAgICAvLyByYXRlID0gc2VsZi5yYXRlX3Jlc2V0X2NhcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDMwIC8vICJyYXRlX3Jlc2V0X2NhcCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDYKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfY2FwIGV4aXN0cwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTg6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2NTkKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gc2VsZi5fY2xhbXBfcmF0ZSgKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjY1OS02NjEKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gc2VsZi5fY2xhbXBfcmF0ZSgKICAgIC8vICAgICBvYnNlcnZlZF9yYXRlICsgc2VsZi5yYXRlX3Jlc2V0X3NwcmVhZAogICAgLy8gKQogICAgZnJhbWVfZGlnIDYKICAgIGFwcF9nbG9iYWxfcHV0CgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAxODoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjY3MQogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1BJKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCA0CiAgICA9PQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAyMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjcyCiAgICAvLyBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9IGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjY3MwogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMjM6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2NzgKICAgIC8vIGlmIHNlbGYuX2lzX2R5bmFtaWNfYW5udWl0eSgpOgogICAgY2FsbHN1YiBfaXNfZHluYW1pY19hbm51aXR5CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDI5CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2NzkKICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QUkYpOgogICAgZnJhbWVfZGlnIDEwCiAgICBwdXNoaW50IDUKICAgID09CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAzMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDkwCiAgICAvLyBkaXNjb3VudF9mYWN0b3IgPSBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQ5MQogICAgLy8gZGVub21pbmF0b3IgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQ5MgogICAgLy8gc2tpcF9maXJzdF9yZWRlbXB0aW9uID0gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDcKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjQ5NAogICAgLy8gaWYgZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAyNQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgZnJhbWVfYnVyeSA4CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAzNQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NDk1LTQ5OQogICAgLy8gIyBBbiBpbml0aWFsIFBSRiBtYXkgZGVzY3JpYmUgdGhlIGZpcnN0IHJlZGVtcHRpb24gcGVyaW9kIGRpcmVjdGx5LgogICAgLy8gZGlzY291bnRfZmFjdG9yID0gc2VsZi5fZGlzY291bnRfYW5udWl0eV9mYWN0b3IoCiAgICAvLyAgICAgZGlzY291bnRfZmFjdG9yLAogICAgLy8gICAgIGVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDgKICAgIGNhbGxzdWIgX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTAxCiAgICAvLyBza2lwX2ZpcnN0X3JlZGVtcHRpb24gPSBUcnVlCiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfYnVyeSA3CiAgICBmcmFtZV9idXJ5IDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDM1OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTAzCiAgICAvLyBmdXR1cmVfZXZlbnRfaWQgPSBzZWxmLmV2ZW50X2N1cnNvciArIFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfd2hpbGVfdG9wQDM2OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTA0CiAgICAvLyB3aGlsZSBmdXR1cmVfZXZlbnRfaWQgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgZnJhbWVfZGlnIDMKICAgID4KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl93aGlsZUA0OAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTA1CiAgICAvLyBmdXR1cmVfZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoZnV0dXJlX2V2ZW50X2lkKQogICAgZnJhbWVfZGlnIDMKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjUwNgogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPSBmdXR1cmVfZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1MDctNTA4CiAgICAvLyAjIE9ubHkgcmVkZW1wdGlvbi1iZWFyaW5nIGV2ZW50cyBjb250cmlidXRlIHRvIHRoZSBhbm51aXR5IGRlbm9taW5hdG9yLgogICAgLy8gaXNfcmVkZW1wdGlvbl9ldmVudCA9IGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpIG9yICgKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjUwNy01MTEKICAgIC8vICMgT25seSByZWRlbXB0aW9uLWJlYXJpbmcgZXZlbnRzIGNvbnRyaWJ1dGUgdG8gdGhlIGFubnVpdHkgZGVub21pbmF0b3IuCiAgICAvLyBpc19yZWRlbXB0aW9uX2V2ZW50ID0gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QUikgb3IgKAogICAgLy8gICAgIGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfTUQpCiAgICAvLyAgICAgYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICAvLyApCiAgICBibnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfdHJ1ZUA0MAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTA5CiAgICAvLyBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgZnJhbWVfZGlnIDQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1MDktNTEwCiAgICAvLyBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgLy8gYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF9mYWxzZUA0MQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTEwCiAgICAvLyBhbmQgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IgPiBVSW50NjQoMCkKICAgIGZyYW1lX2RpZyAwCiAgICBwdXNoaW50IDI1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTA5LTUxMAogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCkKICAgIC8vIGFuZCBmdXR1cmVfZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX3RydWVANDA6CiAgICBpbnRjXzEgLy8gMQoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfbWVyZ2VANDI6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1MTIKICAgIC8vIGlmIGlzX3JlZGVtcHRpb25fZXZlbnQ6CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA0NwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTEzCiAgICAvLyBpZiBza2lwX2ZpcnN0X3JlZGVtcHRpb246CiAgICBmcmFtZV9kaWcgNwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUA0NQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTE0CiAgICAvLyBza2lwX2ZpcnN0X3JlZGVtcHRpb24gPSBGYWxzZQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgNwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANDc6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1MjEKICAgIC8vIGZ1dHVyZV9ldmVudF9pZCArPSBVSW50NjQoMSkKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV93aGlsZV90b3BAMzYKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlANDU6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1MTgKICAgIC8vIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZnJhbWVfZGlnIDAKICAgIHB1c2hpbnQgMjUKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1MTYtNTE5CiAgICAvLyBkaXNjb3VudF9mYWN0b3IgPSBzZWxmLl9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcigKICAgIC8vICAgICBkaXNjb3VudF9mYWN0b3IsCiAgICAvLyAgICAgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMgogICAgc3dhcAogICAgY2FsbHN1YiBfZGlzY291bnRfYW5udWl0eV9mYWN0b3IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1MjAKICAgIC8vIGRlbm9taW5hdG9yICs9IGRpc2NvdW50X2ZhY3RvcgogICAgZnJhbWVfZGlnIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA0NwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDE6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF9tZXJnZUA0MgoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX3doaWxlQDQ4OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTIzCiAgICAvLyBhc3NlcnQgZGVub21pbmF0b3IgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZnJhbWVfZGlnIDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjUyNAogICAgLy8gbnVtZXJhdG9yID0gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTI1CiAgICAvLyBpZiBlbnRyeS5mbGFncyAmIFVJbnQ2NChlbnVtcy5GTEFHX0lOSVRJQUxfUFJGKSA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNTcKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gOAogICAgJgogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDUwCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo1MjYtNTI3CiAgICAvLyAjIFN1YnNlcXVlbnQgUFJGIGV2ZW50cyBhbW9ydGl6ZSBib3RoIHByaW5jaXBhbCBhbmQgYWxyZWFkeSBhY2NydWVkIGNhcnJ5LgogICAgLy8gbnVtZXJhdG9yICs9IHNlbGYuYWNjcnVlZF9pbnRlcmVzdAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgICsKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDUwOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTMwCiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NTI4LTUzMgogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIG51bWVyYXRvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gICAgIGRlbm9taW5hdG9yLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDEKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2ODAKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IHNlbGYuX3JlY2FsY3VsYXRlX2FubnVpdHlfcGF5bWVudCgKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjgwLTY4MgogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gc2VsZi5fcmVjYWxjdWxhdGVfYW5udWl0eV9wYXltZW50KAogICAgLy8gICAgIGVudHJ5CiAgICAvLyApCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMzA6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2ODUKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjY4Ni02OTAKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1VSW50NjQoMCksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2ODgKICAgIC8vIHBheW9mZj1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Njg5CiAgICAvLyBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICBkdXAKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjY4Ni02OTAKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1VSW50NjQoMCksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgY2FsbHN1YiBfZW1pdF9leGVjdXRpb25fZXZlbnQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDI5OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Njg0CiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDMwCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDIwOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6Njc0CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9JUENCKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCAxOAogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDIzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2NzUtNjc2CiAgICAvLyAjIElQQ0Iga2VlcHMgcHJpbmNpcGFsIHVuY2hhbmdlZCBhbmQgb25seSByZXNldHMgdGhlIGludGVyZXN0IGJhc2UuCiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIGIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMjMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMTA6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2NjIKICAgIC8vIGVsaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1JSRik6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgMTEKICAgID09CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDE0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2NjMKICAgIC8vIG5leHRfcmF0ZSA9IGVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjY0CiAgICAvLyBpZiBuZXh0X3JhdGUgPT0gVUludDY0KDApOgogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDEzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2NjUKICAgIC8vIG5leHRfcmF0ZSA9IHNlbGYucmF0ZV9yZXNldF9uZXh0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzcgLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDUKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfbmV4dCBleGlzdHMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjY2CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IG5leHRfcmF0ZQogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgZnJhbWVfZGlnIDUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDE0OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NjY4CiAgICAvLyBpZiBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSAhPSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgOQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMTgKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjY2OQogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPSBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZQogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgZnJhbWVfZGlnIDkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CgoKLy8gbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KGVudHJ5OiBieXRlcywgcGF5b2ZmOiB1aW50NjQsIHNldHRsZWRfYW1vdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpfZW1pdF9leGVjdXRpb25fZXZlbnQ6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo2OTYtNzAyCiAgICAvLyBkZWYgX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgKiwKICAgIC8vICAgICBlbnRyeTogdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnksCiAgICAvLyAgICAgcGF5b2ZmOiBVSW50NjQsCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ6IFVJbnQ2NCwKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDMgMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzA2CiAgICAvLyBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25JRAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzA3CiAgICAvLyBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIGZyYW1lX2RpZyAtMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3MDgKICAgIC8vIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIGZyYW1lX2RpZyAtMwogICAgZXh0cmFjdCA4IDEKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjcwOQogICAgLy8gc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICBmcmFtZV9kaWcgLTMKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3MTAKICAgIC8vIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3MTMKICAgIC8vIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIGZyYW1lX2RpZyAtMwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzA4CiAgICAvLyBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICBpbnRjXzIgLy8gOAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzEzCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBnZXRieXRlCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3NDIKICAgIC8vIGlmIHBheW9mZiA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJueiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3NDMKICAgIC8vIHJldHVybiBVSW50NjQoZW51bXMuUEFZT0ZGX1NJR05fUE9TSVRJVkUpCiAgICBpbnRjXzEgLy8gMQoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX3BheW9mZl9zaWduQDc6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3MTItNzE0CiAgICAvLyBwYXlvZmZfc2lnbj1hcmM0LlVJbnQ4KAogICAgLy8gICAgIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIC8vICksCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgaW50Y18yIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3MTYKICAgIC8vIGN1cnJlbmN5X2lkPXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzE3CiAgICAvLyBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3MDUtNzE4CiAgICAvLyBFeGVjdXRpb25FdmVudCgKICAgIC8vICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIC8vICAgICBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYXBwbGllZF9hdD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICBwYXlvZmY9cGF5b2ZmLAogICAgLy8gICAgIHBheW9mZl9zaWduPWFyYzQuVUludDgoCiAgICAvLyAgICAgICAgIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIC8vICAgICApLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PXNldHRsZWRfYW1vdW50LAogICAgLy8gICAgIGN1cnJlbmN5X2lkPXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAwCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzA0LTcxOQogICAgLy8gYXJjNC5lbWl0KAogICAgLy8gICAgIEV4ZWN1dGlvbkV2ZW50KAogICAgLy8gICAgICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgICAgIHBheW9mZj1wYXlvZmYsCiAgICAvLyAgICAgICAgIHBheW9mZl9zaWduPWFyYzQuVUludDgoCiAgICAvLyAgICAgICAgICAgICBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICAvLyAgICAgICAgICksCiAgICAvLyAgICAgICAgIHNldHRsZWRfYW1vdW50PXNldHRsZWRfYW1vdW50LAogICAgLy8gICAgICAgICBjdXJyZW5jeV9pZD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgICAgIHNlcXVlbmNlPWVudHJ5LmV2ZW50X2lkICsgVUludDY0KDEpLAogICAgLy8gICAgICkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDlhMzMyYjk1IC8vIG1ldGhvZCAiRXhlY3V0aW9uRXZlbnQodWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5Ojc0NAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiAoVUludDY0KGVudW1zLkVWVF9JRUQpLCBVSW50NjQoZW51bXMuRVZUX1BJKSk6CiAgICBmcmFtZV9kaWcgNQogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBibnogX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2lmX2JvZHlANQogICAgZnJhbWVfZGlnIDUKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGJ6IF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pZl9lbHNlQDYKCl9lbWl0X2V4ZWN1dGlvbl9ldmVudF9pZl9ib2R5QDU6CiAgICAvLyBtb2R1bGVzL2tlcm5lbC5weTo3NDUKICAgIC8vIHJldHVybiBVSW50NjQoZW51bXMuUEFZT0ZGX1NJR05fUE9TSVRJVkUpCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzEzCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBiIF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pbmxpbmVkX21vZHVsZXMua2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9wYXlvZmZfc2lnbkA3CgpfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gbW9kdWxlcy9rZXJuZWwucHk6NzQ2CiAgICAvLyByZXR1cm4gVUludDY0KGVudW1zLlBBWU9GRl9TSUdOX05FR0FUSVZFKQogICAgcHVzaGludCAyNTUKICAgIC8vIG1vZHVsZXMva2VybmVsLnB5OjcxMwogICAgLy8gc2VsZi5fcGF5b2ZmX3NpZ24oZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSwgcGF5b2ZmKQogICAgYiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmtlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fcGF5b2ZmX3NpZ25ANwoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9yb2xlX2lzX2FjdGl2ZShyb2xlX21hcDogYnl0ZXMsIHJvbGVfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NDoKX3JvbGVfaXNfYWN0aXZlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU3CiAgICAvLyBkZWYgX3JvbGVfaXNfYWN0aXZlKHNlbGYsIHJvbGVfbWFwOiB0eXAuUmJhY1JvbGUsIHJvbGVfYWRkcmVzczogQWNjb3VudCkgLT4gYm9vbDoKICAgIHByb3RvIDIgMQogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5CiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5LTYwCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5LTYxCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjEKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAtNjEKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgPj0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX21lcmdlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKSAtPiB2b2lkOgpfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2NQogICAgLy8gYXNzZXJ0IHNlbGYuX2lzX2FycmFuZ2VyKFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTIKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgPT0gc2VsZi5hcnJhbmdlci52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE4IC8vIDB4NTIyMzQxNzI3MjYxNmU2NzY1NzIyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgPT0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2NQogICAgLy8gYXNzZXJ0IHNlbGYuX2lzX2FycmFuZ2VyKFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpIC0+IHZvaWQ6Cl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4MwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFzc2V0X2RlZmF1bHRlZCwgZXJyLkRFRkFVTFRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQxIC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfZGVmYXVsdGVkIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIERlZmF1bHRlZAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkgLT4gdm9pZDoKX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg2CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYXNzZXRfc3VzcGVuZGVkLCBlcnIuU1VTUEVOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzMgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9zdXNwZW5kZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gU3VzcGVuZGVkIG9wZXJhdGlvbnMKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkOiB1aW50NjQpIC0+IHZvaWQ6Cl9hc3NlcnRfdmFsaWRfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OAogICAgLy8gZGVmIF9hc3NlcnRfdmFsaWRfcm9sZShzZWxmLCByb2xlX2lkOiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTAKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIHB1c2hpbnQgMjAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkxCiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgcHVzaGludCAyNQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTIKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICBwdXNoaW50IDQwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MwogICAgLy8gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgcHVzaGludCA1MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTQKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgcHVzaGludCA2MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTUKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICBwdXNoaW50IDcwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NgogICAgLy8gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgcHVzaGludCA4MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfZmFsc2VAOAoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3OgogICAgaW50Y18xIC8vIDEKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX21lcmdlQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgcmV0c3ViCgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9mYWxzZUA4OgogICAgaW50Y18wIC8vIDAKICAgIGIgX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfbWVyZ2VAOQo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="}, "sourceInfo": {"approval": {"pcOffsetMethod": "none", "sourceInfo": [{"pc": [2601], "errorMessage": "ACTUS event not yet executed"}, {"pc": [2358], "errorMessage": "Can not distribute zero units"}, {"pc": [3102, 3109, 3481], "errorMessage": "D-ASA already configured"}, {"pc": [1238, 1939, 2318, 2464, 3733, 3880, 4226, 4372], "errorMessage": "D-ASA not configured"}, {"pc": [3492], "errorMessage": "D-ASA terms not configured"}, {"pc": [6541], "errorMessage": "Defaulted"}, {"pc": [3120], "errorMessage": "Denomination asset is not properly set"}, {"pc": [3135], "errorMessage": "Different settlement asset not supported, must be equal to denomination asset"}, {"pc": [3370, 3377, 3379], "errorMessage": "IED must be set in the future"}, {"pc": [1256, 2008, 2479, 5914], "errorMessage": "IED not yet executed"}, {"pc": [2371, 5297], "errorMessage": "Insufficient remaining D-ASA units"}, {"pc": [2574, 2641], "errorMessage": "Insufficient sender units to transfer"}, {"pc": [1835, 3022, 3040, 3096, 3603, 3641, 5482, 5760, 5820, 6203], "errorMessage": "Invalid ACTUS configuration"}, {"pc": [1948, 2352, 2535, 2550, 2708, 2781, 2844, 2886, 5109, 5234], "errorMessage": "Invalid account holding address"}, {"pc": [4564, 4588, 4612, 4636, 4660, 4717, 4745, 4767, 4789, 4811, 4990, 5008, 5023, 5038, 5053], "errorMessage": "Invalid account role address"}, {"pc": [3082], "errorMessage": "Invalid day-count convention ID"}, {"pc": [1347, 3755, 4089, 5792], "errorMessage": "Invalid event cursor"}, {"pc": [3588, 3654, 3933, 5398], "errorMessage": "Invalid event id"}, {"pc": [3768, 4153, 4160], "errorMessage": "Invalid event type"}, {"pc": [4701, 4980, 6611], "errorMessage": "Invalid role identifier"}, {"pc": [3486, 3666, 3674, 3989, 5413, 5429], "errorMessage": "Invalid schedule page"}, {"pc": [5345], "errorMessage": "No D-ASA units"}, {"pc": [1353, 1864, 2045, 5801], "errorMessage": "No due cashflow to pay"}, {"pc": [5883], "errorMessage": "Not IED event"}, {"pc": [1993, 2326, 2522, 2698, 2754, 2764, 2850, 4188, 4834, 6533], "errorMessage": "Not authorized"}, {"pc": [1474, 1482, 2094, 2168, 2177], "errorMessage": "Not enough funds for the payment"}, {"pc": [3905, 3918], "errorMessage": "Observed event required to execute this action"}, {"pc": [2340, 2388], "errorMessage": "Primary distribution is closed"}, {"pc": [5832], "errorMessage": "Primary distribution is not complete"}, {"pc": [2563], "errorMessage": "Sender and receiver must be different"}, {"pc": [5095, 6549], "errorMessage": "Suspended operations"}, {"pc": [2275, 3631], "errorMessage": "Time events must be sorted in strictly ascending order"}, {"pc": [2496, 2513], "errorMessage": "Transfer is closed"}, {"pc": [2567], "errorMessage": "Transfer units must be greater than zero"}, {"pc": [988], "errorMessage": "Wrong Global Bytes allocation"}, {"pc": [994], "errorMessage": "Wrong Global UInts allocation"}, {"pc": [998], "errorMessage": "Wrong Local Bytes allocation"}, {"pc": [1002], "errorMessage": "Wrong Local UInts allocation"}, {"pc": [1455, 2087], "errorMessage": "account opted into asset"}, {"pc": [6493, 6508], "errorMessage": "check BoxMap entry exists"}, {"pc": [1984, 2022, 2063, 2101, 2392, 2570, 2630, 2656, 5089, 5255], "errorMessage": "check self.account entry exists"}, {"pc": [1536, 1762, 1847, 4283, 5919, 6222], "errorMessage": "check self.accrued_interest exists"}, {"pc": [4852, 6531], "errorMessage": "check self.arranger exists"}, {"pc": [6539], "errorMessage": "check self.asset_defaulted exists"}, {"pc": [6547], "errorMessage": "check self.asset_suspended exists"}, {"pc": [3030, 3475, 3901, 3913, 4231, 5644], "errorMessage": "check self.contract_type exists"}, {"pc": [1504, 4288, 5117, 5195], "errorMessage": "check self.cumulative_interest_index exists"}, {"pc": [1516, 4293, 5128, 5203], "errorMessage": "check self.cumulative_principal_index exists"}, {"pc": [5654], "errorMessage": "check self.dynamic_principal_redemption exists"}, {"pc": [1271, 1284, 1345, 1586, 2578, 2591, 3746, 4082, 4259, 4376, 4389, 4426, 5210, 5790, 5871, 6103, 6241], "errorMessage": "check self.event_cursor exists"}, {"pc": [5143, 5157, 5350, 5379, 5710, 5718, 5745, 5765, 5954, 6067, 6228], "errorMessage": "check self.fixed_point_scale exists"}, {"pc": [5997], "errorMessage": "check self.has_rate_reset_cap exists"}, {"pc": [5970], "errorMessage": "check self.has_rate_reset_floor exists"}, {"pc": [3107, 3491, 4255, 5888], "errorMessage": "check self.initial_exchange_amount exists"}, {"pc": [2376, 2386], "errorMessage": "check self.initial_exchange_date exists"}, {"pc": [1707, 4273, 5686, 5700], "errorMessage": "check self.interest_calculation_base exists"}, {"pc": [1778, 1793], "errorMessage": "check self.next_principal_redemption exists"}, {"pc": [4278, 5678, 5705, 5750], "errorMessage": "check self.nominal_interest_rate exists"}, {"pc": [1953, 1966], "errorMessage": "check self.op_daemon exists"}, {"pc": [1607, 1674, 1699, 1752, 1803, 1811, 1832, 4268, 6207, 6287], "errorMessage": "check self.outstanding_principal exists"}, {"pc": [6005, 6019], "errorMessage": "check self.rate_reset_cap exists"}, {"pc": [5978, 5992], "errorMessage": "check self.rate_reset_floor exists"}, {"pc": [5949], "errorMessage": "check self.rate_reset_multiplier exists"}, {"pc": [6321], "errorMessage": "check self.rate_reset_next exists"}, {"pc": [5962], "errorMessage": "check self.rate_reset_spread exists"}, {"pc": [1460, 2163, 4298], "errorMessage": "check self.reserved_interest exists"}, {"pc": [1465, 1494, 2173, 2188, 4303], "errorMessage": "check self.reserved_principal exists"}, {"pc": [2363, 2411, 4250, 5292, 5825], "errorMessage": "check self.reserved_units_total exists"}, {"pc": [1276, 2583, 3751, 3931, 3949, 4072, 4264, 4381, 5394, 6112], "errorMessage": "check self.schedule_entry_count exists"}, {"pc": [3979], "errorMessage": "check self.schedule_page entry exists"}, {"pc": [1452, 2053, 2081, 6393], "errorMessage": "check self.settlement_asset_id exists"}, {"pc": [1237, 1251, 1938, 2003, 2317, 2336, 2463, 2474, 2758, 3100, 3479, 3732, 3879, 4224, 4371, 5238, 5816, 5909], "errorMessage": "check self.status exists"}, {"pc": [2369, 2422, 4245, 5343, 5374, 5830], "errorMessage": "check self.total_units exists"}, {"pc": [2501, 2511], "errorMessage": "check self.transfer_closure_date exists"}, {"pc": [2484, 2492], "errorMessage": "check self.transfer_opening_date exists"}, {"pc": [3565, 3624], "errorMessage": "index access is out of bounds"}, {"pc": [1922, 2967, 3449, 3984], "errorMessage": "invalid array length header"}, {"pc": [2688, 3437, 4824], "errorMessage": "invalid number of bytes for arc4.bool"}, {"pc": [1930], "errorMessage": "invalid number of bytes for arc4.dynamic_array"}, {"pc": [3464], "errorMessage": "invalid number of bytes for arc4.dynamic_array"}, {"pc": [1916, 2301, 2441, 2449, 2680, 2738, 2746, 2826, 2834, 2877, 2902, 4445, 4469, 4503, 4684, 4866, 4950], "errorMessage": "invalid number of bytes for arc4.static_array"}, {"pc": [1232, 2259, 2268, 2309, 2458, 3427, 3864], "errorMessage": "invalid number of bytes for arc4.uint64"}, {"pc": [4493, 4674, 4940], "errorMessage": "invalid number of bytes for arc4.uint8"}, {"pc": [2939], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.InitialKernelState"}, {"pc": [2928], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.NormalizedActusTerms"}, {"pc": [3875], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.ObservedEventRequest"}, {"pc": [2972], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.Prospectus"}, {"pc": [4514], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.RoleValidity"}, {"pc": [2956], "errorMessage": "invalid tail pointer at index 1 of (uint8[32],(len+utf8[]))"}, {"pc": [2951], "errorMessage": "invalid tuple encoding"}, {"pc": [4051], "errorMessage": "max array length exceeded"}, {"pc": [4237, 6385], "errorMessage": "overflow"}]}, "clear": {"pcOffsetMethod": "none", "sourceInfo": []}}, "templateVariables": {}}""" +_APP_SPEC_JSON = r"""{"arcs": [22, 28], "bareActions": {"call": [], "create": []}, "methods": [{"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "name": "max_event_count"}], "name": "fund_due_cashflows", "returns": {"type": "(uint64,uint64,uint64,uint64,uint64)", "struct": "CashFundingResult"}, "desc": "Reserve due ACTUS cash events into the escrow-style claim ledger.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "name": "holding_address"}, {"type": "byte[]", "name": "payment_info"}], "name": "claim_due_cashflows", "returns": {"type": "(uint64,uint64,uint64,uint64,byte[])", "struct": "CashClaimResult"}, "desc": "Withdraw the holder's already funded ACTUS cash entitlements.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "name": "open_date"}, {"type": "uint64", "name": "closure_date"}], "name": "set_transfer_schedule", "returns": {"type": "uint64"}, "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "name": "holding_address"}, {"type": "uint64", "name": "units"}], "name": "primary_distribution", "returns": {"type": "uint64"}, "desc": "Reserve units for a holder before IED finalizes issuance.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "name": "sender_holding_address"}, {"type": "address", "name": "receiver_holding_address"}, {"type": "uint64", "name": "units"}], "name": "transfer", "returns": {"type": "uint64"}, "desc": "Transfer active units after settling both counterparties to the current cursor.\nReturns the number of units moved. The ACTUS kernel no longer persists a nominal per-unit value on-chain, so transfer results are unit-based.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "bool", "desc": "Suspension status", "name": "suspended"}], "name": "account_gov_suspension", "returns": {"type": "uint64", "desc": "Timestamp of the set account suspension status"}, "desc": "Set account suspension status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "address", "desc": "Account Payment Address", "name": "payment_address"}], "name": "account_open", "returns": {"type": "uint64", "desc": "Timestamp of the account opening"}, "desc": "Open a contract account with a new position and register its payment address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "address", "desc": "Account Payment Address", "name": "payment_address"}], "name": "account_update_payment_address", "returns": {"type": "uint64", "desc": "Timestamp of the account update"}, "desc": "Update the Payment Address of an account", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}], "name": "account_get_position", "returns": {"type": "(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64)", "desc": "Account position", "struct": "AccountPosition"}, "desc": "Get account position", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": [], "create": ["NoOp"]}, "args": [{"type": "address", "desc": "D-ASA Arranger Address", "name": "arranger"}], "name": "contract_create", "returns": {"type": "uint64", "desc": "UNIX timestamp of contract creation"}, "desc": "Create a new D-ASA contract and set the Arranger role", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64)", "desc": "Normalized ACTUS terms", "name": "terms", "struct": "NormalizedActusTerms"}, {"type": "(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "desc": "Initial kernel state (pre-IED)", "name": "initial_state", "struct": "InitialKernelState"}, {"type": "(byte[32],string)", "desc": "Prospectus (informational only)", "name": "prospectus", "struct": "Prospectus"}], "name": "contract_config", "returns": {"type": "uint64", "desc": "UNIX timestamp of contract configuration"}, "desc": "Partial contract configuration with: normalized ACTUS terms, initial kernel\nstate (pre-IED), prospectus (informational only). The contract stays inactive until all schedule pages are configured next.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "name": "schedule_page_index"}, {"type": "bool", "name": "is_last_page"}, {"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[]", "name": "schedule_page"}], "name": "contract_schedule", "returns": {"type": "uint64"}, "desc": "Upload one normalized schedule page.\nThe configuration operation is considered complete only when the last page is stored. At that point `schedule_entry_count` is finalized and the contract moves to `STATUS_PENDING_IED`.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "execute_ied", "returns": {"type": "uint64"}, "desc": "Execute the first due `IED` entry and activate the contract.\n`IED` is the one non-cash event that moves the app from `STATUS_PENDING_IED` to `STATUS_ACTIVE`.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "name": "event_id"}, {"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "name": "payload", "struct": "ObservedEventRequest"}], "name": "apply_non_cash_event", "returns": {"type": "uint64"}, "desc": "Apply the next due non-cash event, optionally appending one first.\nObserved payloads are appended before execution when flagged. Rate reset events require the interest oracle because they can change the running nominal rate; other non-cash events stay arranger-controlled.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_contract_state", "returns": {"type": "(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "struct": "KernelState"}, "desc": "Return a readonly snapshot of the generic ACTUS kernel state.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_next_due_event", "returns": {"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "struct": "ExecutionScheduleEntry"}, "desc": "Return the next boxed schedule entry, or a zeroed sentinel if ended.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["UpdateApplication"], "create": []}, "args": [], "name": "contract_update", "returns": {"type": "void"}, "desc": "Update D-ASA application.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "New Arranger address", "name": "new_arranger"}], "name": "rbac_rotate_arranger", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Rotate the Arranger address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Operation Daemon address", "name": "address"}], "name": "rbac_set_op_daemon", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Non-Normative: Set the Operation Daemon address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}, {"type": "(uint64,uint64)", "desc": "Role time validity", "name": "validity", "struct": "RoleValidity"}], "name": "rbac_assign_role", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Assign a role to an address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}], "name": "rbac_revoke_role", "returns": {"type": "uint64", "desc": "Timestamp of the role revocation"}, "desc": "Revoke a role from an address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Suspension status", "name": "suspended"}], "name": "rbac_gov_asset_suspension", "returns": {"type": "uint64", "desc": "Timestamp of the set asset suspension status"}, "desc": "Set asset suspension status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "rbac_get_arranger", "returns": {"type": "address", "desc": "Arranger address"}, "desc": "Get Arranger address", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Address to get roles for", "name": "address"}], "name": "rbac_get_address_roles", "returns": {"type": "(bool,bool,bool,bool,bool)", "desc": "Roles mask: (Account Manager, Primary Dealer, Trustee, Authority, Observer)"}, "desc": "Non-normative - Get roles assigned to an address", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}], "name": "rbac_get_role_validity", "returns": {"type": "(uint64,uint64)", "desc": "Role validity", "struct": "RoleValidity"}, "desc": "Get role validity", "events": [], "readonly": true, "recommendations": {}}], "name": "DASA", "state": {"keys": {"box": {}, "global": {"arranger": {"key": "UiNBcnJhbmdlciM=", "keyType": "AVMBytes", "valueType": "address"}, "op_daemon": {"key": "UiNPcERhZW1vbiM=", "keyType": "AVMBytes", "valueType": "address"}, "asset_suspended": {"key": "YXNzZXRfc3VzcGVuZGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "asset_defaulted": {"key": "YXNzZXRfZGVmYXVsdGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "status": {"key": "c3RhdHVz", "keyType": "AVMString", "valueType": "AVMUint64"}, "contract_type": {"key": "Y29udHJhY3RfdHlwZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "prospectus_hash": {"key": "cHJvc3BlY3R1c19oYXNo", "keyType": "AVMString", "valueType": "AVMBytes"}, "prospectus_url": {"key": "cHJvc3BlY3R1c191cmw=", "keyType": "AVMString", "valueType": "AVMString"}, "denomination_asset_id": {"key": "ZGVub21pbmF0aW9uX2Fzc2V0X2lk", "keyType": "AVMString", "valueType": "AVMUint64"}, "settlement_asset_id": {"key": "c2V0dGxlbWVudF9hc3NldF9pZA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "initial_exchange_date": {"key": "aW5pdGlhbF9leGNoYW5nZV9kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "maturity_date": {"key": "bWF0dXJpdHlfZGF0ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "transfer_opening_date": {"key": "dHJhbnNmZXJfb3BlbmluZ19kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "transfer_closure_date": {"key": "dHJhbnNmZXJfY2xvc3VyZV9kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "day_count_convention": {"key": "ZGF5X2NvdW50X2NvbnZlbnRpb24=", "keyType": "AVMString", "valueType": "AVMUint64"}, "total_units": {"key": "dG90YWxfdW5pdHM=", "keyType": "AVMString", "valueType": "AVMUint64"}, "reserved_units_total": {"key": "cmVzZXJ2ZWRfdW5pdHNfdG90YWw=", "keyType": "AVMString", "valueType": "AVMUint64"}, "initial_exchange_amount": {"key": "aW5pdGlhbF9leGNoYW5nZV9hbW91bnQ=", "keyType": "AVMString", "valueType": "AVMUint64"}, "outstanding_principal": {"key": "b3V0c3RhbmRpbmdfcHJpbmNpcGFs", "keyType": "AVMString", "valueType": "AVMUint64"}, "next_principal_redemption": {"key": "bmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbg==", "keyType": "AVMString", "valueType": "AVMUint64"}, "dynamic_principal_redemption": {"key": "ZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbg==", "keyType": "AVMString", "valueType": "AVMUint64"}, "interest_calculation_base": {"key": "aW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "accrued_interest": {"key": "YWNjcnVlZF9pbnRlcmVzdA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "nominal_interest_rate": {"key": "bm9taW5hbF9pbnRlcmVzdF9yYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_spread": {"key": "cmF0ZV9yZXNldF9zcHJlYWQ=", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_multiplier": {"key": "cmF0ZV9yZXNldF9tdWx0aXBsaWVy", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_floor": {"key": "cmF0ZV9yZXNldF9mbG9vcg==", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_cap": {"key": "cmF0ZV9yZXNldF9jYXA=", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_next": {"key": "cmF0ZV9yZXNldF9uZXh0", "keyType": "AVMString", "valueType": "AVMUint64"}, "has_rate_reset_floor": {"key": "aGFzX3JhdGVfcmVzZXRfZmxvb3I=", "keyType": "AVMString", "valueType": "AVMUint64"}, "has_rate_reset_cap": {"key": "aGFzX3JhdGVfcmVzZXRfY2Fw", "keyType": "AVMString", "valueType": "AVMUint64"}, "reserved_principal": {"key": "cmVzZXJ2ZWRfcHJpbmNpcGFs", "keyType": "AVMString", "valueType": "AVMUint64"}, "reserved_interest": {"key": "cmVzZXJ2ZWRfaW50ZXJlc3Q=", "keyType": "AVMString", "valueType": "AVMUint64"}, "cumulative_interest_index": {"key": "Y3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "cumulative_principal_index": {"key": "Y3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXg=", "keyType": "AVMString", "valueType": "AVMUint64"}, "event_cursor": {"key": "ZXZlbnRfY3Vyc29y", "keyType": "AVMString", "valueType": "AVMUint64"}, "schedule_entry_count": {"key": "c2NoZWR1bGVfZW50cnlfY291bnQ=", "keyType": "AVMString", "valueType": "AVMUint64"}, "fixed_point_scale": {"key": "Zml4ZWRfcG9pbnRfc2NhbGU=", "keyType": "AVMString", "valueType": "AVMUint64"}}, "local": {}}, "maps": {"box": {"account_manager": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNBY2NvdW50TWFuYWdlciM="}, "primary_dealer": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNQcmltYXJ5RGVhbGVyIw=="}, "trustee": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNUcnVzdGVlIw=="}, "authority": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNBdXRob3JpdHkj"}, "observer": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNPYnNlcnZlciM="}, "schedule_page": {"keyType": "uint64", "valueType": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[]", "prefix": "UyM="}, "account": {"keyType": "address", "valueType": "AccountPosition", "prefix": "UiNBY2NvdW50Iw=="}}, "global": {}, "local": {}}, "schema": {"global": {"bytes": 4, "ints": 37}, "local": {"bytes": 0, "ints": 0}}}, "structs": {"AccountPosition": [{"name": "payment_address", "type": "address"}, {"name": "units", "type": "uint64"}, {"name": "reserved_units", "type": "uint64"}, {"name": "suspended", "type": "bool"}, {"name": "settled_cursor", "type": "uint64"}, {"name": "interest_checkpoint", "type": "uint64"}, {"name": "principal_checkpoint", "type": "uint64"}, {"name": "claimable_interest", "type": "uint64"}, {"name": "claimable_principal", "type": "uint64"}], "CashClaimResult": [{"name": "interest_amount", "type": "uint64"}, {"name": "principal_amount", "type": "uint64"}, {"name": "total_amount", "type": "uint64"}, {"name": "timestamp", "type": "uint64"}, {"name": "context", "type": "byte[]"}], "CashFundingResult": [{"name": "funded_interest", "type": "uint64"}, {"name": "funded_principal", "type": "uint64"}, {"name": "total_funded", "type": "uint64"}, {"name": "processed_events", "type": "uint64"}, {"name": "timestamp", "type": "uint64"}], "ExecutionScheduleEntry": [{"name": "event_id", "type": "uint64"}, {"name": "event_type", "type": "uint8"}, {"name": "scheduled_time", "type": "uint64"}, {"name": "accrual_factor", "type": "uint64"}, {"name": "redemption_accrual_factor", "type": "uint64"}, {"name": "next_nominal_interest_rate", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "next_outstanding_principal", "type": "uint64"}, {"name": "flags", "type": "uint64"}], "InitialKernelState": [{"name": "status_date", "type": "uint64"}, {"name": "event_cursor", "type": "uint64"}, {"name": "outstanding_principal", "type": "uint64"}, {"name": "interest_calculation_base", "type": "uint64"}, {"name": "nominal_interest_rate", "type": "uint64"}, {"name": "accrued_interest", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "cumulative_interest_index", "type": "uint64"}, {"name": "cumulative_principal_index", "type": "uint64"}], "KernelState": [{"name": "contract_type", "type": "uint8"}, {"name": "status", "type": "uint64"}, {"name": "total_units", "type": "uint64"}, {"name": "reserved_units_total", "type": "uint64"}, {"name": "initial_exchange_amount", "type": "uint64"}, {"name": "event_cursor", "type": "uint64"}, {"name": "schedule_entry_count", "type": "uint64"}, {"name": "outstanding_principal", "type": "uint64"}, {"name": "interest_calculation_base", "type": "uint64"}, {"name": "nominal_interest_rate", "type": "uint64"}, {"name": "accrued_interest", "type": "uint64"}, {"name": "cumulative_interest_index", "type": "uint64"}, {"name": "cumulative_principal_index", "type": "uint64"}, {"name": "reserved_interest", "type": "uint64"}, {"name": "reserved_principal", "type": "uint64"}], "NormalizedActusTerms": [{"name": "contract_type", "type": "uint8"}, {"name": "denomination_asset_id", "type": "uint64"}, {"name": "settlement_asset_id", "type": "uint64"}, {"name": "total_units", "type": "uint64"}, {"name": "notional_principal", "type": "uint64"}, {"name": "initial_exchange_amount", "type": "uint64"}, {"name": "initial_exchange_date", "type": "uint64"}, {"name": "maturity_date", "type": "uint64"}, {"name": "day_count_convention", "type": "uint8"}, {"name": "rate_reset_spread", "type": "uint64"}, {"name": "rate_reset_multiplier", "type": "uint64"}, {"name": "rate_reset_floor", "type": "uint64"}, {"name": "rate_reset_cap", "type": "uint64"}, {"name": "rate_reset_next", "type": "uint64"}, {"name": "has_rate_reset_floor", "type": "bool"}, {"name": "has_rate_reset_cap", "type": "bool"}, {"name": "dynamic_principal_redemption", "type": "bool"}, {"name": "fixed_point_scale", "type": "uint64"}], "ObservedEventRequest": [{"name": "event_id", "type": "uint64"}, {"name": "event_type", "type": "uint8"}, {"name": "scheduled_time", "type": "uint64"}, {"name": "accrual_factor", "type": "uint64"}, {"name": "redemption_accrual_factor", "type": "uint64"}, {"name": "observed_rate", "type": "uint64"}, {"name": "next_nominal_interest_rate", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "next_outstanding_principal", "type": "uint64"}, {"name": "flags", "type": "uint64"}], "Prospectus": [{"name": "hash", "type": "byte[32]"}, {"name": "url", "type": "string"}], "RoleValidity": [{"name": "role_validity_start", "type": "uint64"}, {"name": "role_validity_end", "type": "uint64"}]}, "byteCode": {"approval": "DCAEAAEIICYwBBUffHUGc3RhdHVzDGV2ZW50X2N1cnNvchVvdXRzdGFuZGluZ19wcmluY2lwYWwUc2NoZWR1bGVfZW50cnlfY291bnQRZml4ZWRfcG9pbnRfc2NhbGUQYWNjcnVlZF9pbnRlcmVzdBlpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlClIjQWNjb3VudCMVbm9taW5hbF9pbnRlcmVzdF9yYXRlFHJlc2VydmVkX3VuaXRzX3RvdGFsEnJlc2VydmVkX3ByaW5jaXBhbA1jb250cmFjdF90eXBlC3RvdGFsX3VuaXRzGW5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24RcmVzZXJ2ZWRfaW50ZXJlc3QZY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleBpjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleAtSI0FycmFuZ2VyIxNzZXR0bGVtZW50X2Fzc2V0X2lkF2luaXRpYWxfZXhjaGFuZ2VfYW1vdW50DFIjQXV0aG9yaXR5IxBSI1ByaW1hcnlEZWFsZXIjEVIjQWNjb3VudE1hbmFnZXIjC1IjT2JzZXJ2ZXIjC1IjT3BEYWVtb24jFWluaXRpYWxfZXhjaGFuZ2VfZGF0ZRV0cmFuc2Zlcl9vcGVuaW5nX2RhdGUVdHJhbnNmZXJfY2xvc3VyZV9kYXRlEHJhdGVfcmVzZXRfZmxvb3IOcmF0ZV9yZXNldF9jYXACUyMKUiNUcnVzdGVlIw9hc3NldF9zdXNwZW5kZWQcZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbhFyYXRlX3Jlc2V0X3NwcmVhZBVyYXRlX3Jlc2V0X211bHRpcGxpZXIPcmF0ZV9yZXNldF9uZXh0FGhhc19yYXRlX3Jlc2V0X2Zsb29yEmhhc19yYXRlX3Jlc2V0X2NhcAEAD2Fzc2V0X2RlZmF1bHRlZA9wcm9zcGVjdHVzX2hhc2gOcHJvc3BlY3R1c191cmwVZGVub21pbmF0aW9uX2Fzc2V0X2lkDW1hdHVyaXR5X2RhdGUUZGF5X2NvdW50X2NvbnZlbnRpb24DBoEBMRhAAK0nEjIDZycZMgNnJyEiZycpImcpImcnDCJnJyqAAGcnK4AAZycsImcnEyJnJxoiZyctImcnGyJnJxwiZycuImcnDSJnJwoiZycUImcrImcnDiJnJyIiZycHImcnBiJnJwkiZycjImcnJCJnJx0iZyceImcnJSJnJyYiZycnImcnCyJnJw8iZycQImcnESJnKiJnJwQiZycFImcxNYEEEkQxNIElEkQxNxREMTYURIAEkU8E6zYaAI4BAMAxGRREMRhBAKmCFwS0RhjIBOeDJSkEfqIOCwRshePuBL3RqUQE3AY7NQQU/BDvBHSnKX8ECdT+FASam/qFBIXu0z0EkYUQSgTZ8iWsBG4OXJUE/z/UswSC9xstBO8E9dME3zQ1UAQ9voC9BN9U6CwEAQyCmQR0BqzSBBpyou42GgCOFwAbAscEIwRNBNcFyAYCBloGjQa7CK4J6ApiC9QMZwytDMUM3Q2SDigORw5SDpwAgASVbXFWNhoAjgEGmAAxGYEEEjEYEERCDI0igABHCjYaAUkVJBJEFyIpZUREiBSjiBSqiBSvIillRIEyEhREIkcCSwJLBAxBAlEiKmVEIicEZUQMQQJEIiplRIgQA0lFEYEJW0lFBjIHDUACLksPJFVJRRAkEklFB0AAEEsOgQMSQAAISw6BExJBAjYjQQILSw8iWyIqZUQSREsEMgcOREsFQAHkSw6BExJAAdwiRQ1LDyRVSUUQgQMSQAFgSw6BExJAAVgiRQhLD4ExW0UKiBCMQAD7SwlFC0sMiA9JSwiID0RLAYgPXklOAkURSYgPVUlFDUsCSwEISUUMMgoiJxNlRHAARCInD2VEIicLZURLAQhLAksBD0RPAkwJTwIPRE8DCCcPTGciJwtlRAgnC0xnIicQZURPAggnEExnIicRZUQIJxFMZ0sPJFWBAxJBAHciJwZlREsQiBAYRRIIJwZMZ4gP+EEACksPJFWBExJBAAlLD4EpWycOTGcrSwpnJwdLC2ciKmVEIwgqTGdLD1cIAYABE6hBABAiK2VEQAAJKYHIAWcnByJnSw9LB0mIEnFISwFLDghFAklLCQhFAUsCIwhFA0L+eScGImdC/5NLDyRVSUUQgQMSQQAPIitlREsICUlFC0ULQv7tSw4kEkEAEiIrZUxFC0QiJwdlTEUMREL+1EsOgRMSQAAHSwlFC0L+xSJFCiJFC0L+vIgPPkEAU0sOgRMSQQAJIitlREUIQv6UIicGZURLEIgPNkUSCElFDSInDmVED0EABiJFCEL+dSInDmVESwwJSUUKIitlRA1BAAkiK2VERQhC/llLCEUIQv5SSw+BMVsiK2VESg5ETAlFCEL+PyInBmVESxCIDuFFEghFDUL+FUsCSURLAklLA0lOAwgyB08CFk8DFlBPAhZQTwIWUEwWUChMULAjQyJC/ceAAEcCNhoBRwIVJRJENhoCSSJZgQIISwEVEkRXAgBMIillREQnCExQSb1FAUQiJxllRDIDE0EAIjEAIicZZUQSQAAVMQBLAxJAAA0xAEsBvkRXACASQQEAI0SIEbqIEb8iKWVEgTISFERLAkmIDISIDAdGAkm+REmBSVtJTgJFCEmBUVtJRQhPAghJRQZEVwAgIicTZURwAEUBQQC3Sb5EgYADU0AArSNBAHgyCiInE2VETEsBcABESwVJTgIPREsCSU4DvkRJVwAgsTIATwOyEkyyFE8CshGBBLIQsgGzSYFJW0lOAkUJSYFRW0lOA0UJIhZMSwFcSUxcUU8DTL8iJw9lRElLAg9EIicLZURLAw9ETAknD0xnIicLZURMCScLTGdLBUlLBklOAwgyB08CFk8DFlBPAhZQTBZQSwJJFRZXBgJMUEyAAgAiUExQKExQsCNDIkL/UCJC/v02GgFJFSQSRBc2GgJJFSQSRBeIEJxKDEQnG08CZyccTGcyBxYoTFCwI0M2GgFJFSUSRDYaAkkVJBJEF0lOAiIpZUREJxYxAIgQM0SIEG2IEHIiKWVEgTISRCcISwJQSU4DvUUBREyICqNJRCInCmVECCInDWVEDkQiJxplREEACTIHIicaZUQOREcCvkSBKFtLA0lOAwgWgShMuyInCmVECCcKSwFnIicNZURMCRYoTFCwI0MiSTYaAUkVJRJENhoCSRUlEkQ2GgNHAhUkEkQXIillRESID+OID+giKWVEgTISFEQiJxtlREEACSInG2VEMgcORCInHGVEQQAJMgciJxxlRAxEMQBLBElOAhJEJwhLAVBJRQhJvUUBRCcISwVJTgJQSUUJvUUBREsCiAncSYgJ2E8CE0RLAUlETL5EJVsORCIqZUQiJwRlRA9AAA4iKmVEiArogQlbMgcNREsDSYgKM0sDSU4CiAoriAmuRgKICalGAksFSb5EJVtLAklOAksBDkRLAQkWTwIlTwK7SwVJvkQlW08CCBYlTLsoSwJQsCNDNhoBSRUlEkQ2GgJJFSMSRCJTJxUxAIgOv0QnCE8CUEm9RQFESYEwI7oiTwNUgTBMuzIHFihMULAjQzYaAUkVJRJENhoCSRUlEkQnFzEAiA6HRCIpZUSByAESFESIDreIDrwnCE8CUEm9RQEURCIWTwJLAVBLAVAnKFBLAVBLAVBLAVBLAVBMUL8yBxYoTFCwI0M2GgFJFSUSRDYaAkkVJRJEJwhLAlBJvUUBRDEATwMSRIgOYYgOZiJPArsyBxYoTFCwI0M2GgFJFSUSRCcITFBJvUUBRL5IKExQsCNDNhoBSRUlEkQnEkxnMgcWKExQsCNDgABJNhoBRwIVgWsSRDYaAklOAhWBSBJENhoDSU4CSRVLASVZSYEiEkRPAkxLAlJJTgMiWYEkCBJEiA3dIlVJJwxLAWdBACJJIxJAABxJgQISQAAVSYEDEkAADkmBBBJAAAdJgQUSQQGGI0QiJwxlTEUCREsESYEhW0lFCESBOVVJRQhBAB9LBiMSQAAYSwaBAhJAABBLBoEDEkAACEsGgQQSQQFGI0RJIxNBAAhLBIGSBlMURCIpZUQURCInFGVEFERLBEkjW0lxC0UBRCcsSwFnSwGBCVtJTwISRCcTSwFnsTIAMgoishKyFEyyEYEEshCyAbNJgRFbJw1MZycKImcnLksIZ0mBKVsnGksBZ0sBgTFbJy1LAWdLBklOAoEwWycOTGcnFEsKZ0sDgZIGUyciTGdLAYEQWytMZ0sBgShbJwZMZ0sBJVsnCUxnSwGBGFsnB0xnSwOBOlsnI0xnSwOBQlsnJExnSwOBSlsnHUxnSwOBUlsnHkxnSwOBWlsnJUxnSwOBkAZTJyZMZ0sDgZEGUycnTGdPA4FjWycFTGdLASRbKkxnSwGBOFsnEExnSwGBQFsnEUxnJw8iZycLImdLAjIHDURMIltLAgxEDERLAlcAICcqTGdLAVcCACcrTGcyBxYoTFCwI0MiQv63IkL+dyKAAEcDNhoBSRUkEkQXSTYaAkkVIxJEIlNMNhoDSU4CSSJZSU4DSYFBC4ECCE8CFRJEiAvxIicMZUxOA0QiKWVEFERJgRAORCInFGVEREyBEAtMgWQLgeYLCEkyDA1BABixgQayEIEFshknL7IeJy+yHyKyAbNC/+EiRQpLCUsEDEEAjksEVwIASUUNSwpJTgKBQQuBQVhJJFVJTgJFDkkiW0lFDUsFTwQISwESREsFTwOIBzRMgQlbSUUKREEAGUsJQQAnSwkjCYFBC0sMTIFBWIEJW0sIDkRLCEAABUsKIxJESwkjCEUKQv+QSwZJRCMJFicfTFBJvUUBREkigQK6F0lEIwmBQQuBAgiBQbpC/8BLBhYnH0xQSbxISwW/SwVBAA1LAUsECCcETGcpgTJnMgcWKExQsCNDIillRESICuSICuuICvAiKmVEIicEZURLAQ1EiAZcSVcIAUmAAQGoREsBVwAISwJXCQhLA1cRCEsEVxkISwVXIQhLBlcpCEsHVzEISwhXOQhPB08IUE8HUE8GUE8FUCIWUE8EUE8DUE8CUExQiAePRgIyBxYoTFCwI0MiRwSAAEk2GgFJFSQSRBc2GgJHAhWBSRJEIillRESICluICmCBQVtJgQQaQQC2IicMZUSBBRJEiAo4IicMZURJgQUSREsCSSJbSUUHIicEZUQSRElXCAFFDCRViAXXIicEZUSBEAqAAgAARQcWJx9MUElFCb1FAUEAB0sHvkxFB0RLBUkiWUmBEAxESwNJVwkISwFXEQhLAlcZCEsDVykISwRXMQhPBVc5CEsLFksSUE8GUE8FUE8EUE8DUE8CUExQSwMWUE8CTFBMIwgWVwYCXABLCEm8SEy/IicEZUQjCCcETGciKmVESwNJTwISRIgFDklFCElXCAFFCiRVSUUGIxJAAChLBIEEEkAAIEsEgQwSQAAYSwSBCxJAABBLBIESEkAACEsEgQUSQQBBI0RLCIABAalESwSBDBJAAAhLBIELEkEAJCNBABonGDEAiAjtREsGSwKIBitGAjIHFihMULAjQ4gJC0L/6CJC/9kiQv+8IillRElEIicMZUQWSZMkDkRXBwEiJw1lRCInCmVEIicUZUQiKmVEIicEZUQiK2VEIicHZUQiJwllRCInBmVEIicQZUQiJxFlRCInD2VEIicLZURPDhZPDkxQTw0WUE8MFlBPCxZQTwoWUE8JFlBPCBZQTwcWUE8GFlBPBRZQTwQWUE8DFlBPAhZQTBZQKExQsCNDIillREQiKmVEIicEZUQPQQAlIiplRBYnKFAiFkxLAVBLAVBLAVBLAVBLAVBLAVBMUChMULAjQyIqZUSIA71C//CICCkjQzYaAUkVJRJEiAgcJxJMZzIHFihMULAjQzYaAUkVJRJEiAgEJxlMZzIHFihMULAjQzYaAUkVIxJENhoCSU4CFSUSRDYaA0lOAhWBEBJEiAfXiAfeF0cCiAfogRQSQQAOJxJLA2cyBxYoTFCwI0NJgSgSQQARJxdLA1BJvUUBFERLAr9C/99JgTISQQARJxZLA1BJvUUBFERLAr9C/8dJgTwSQQARJyBLA1BJvUUBFERLAr9C/69JgUYSQQARJxVLA1BJvUUBFERLAr9C/5dJgVASQf+QJxhLA1BJvUUBFERLAr9C/382GgFJFSMSRDYaAklOAhUlEkSIBy2IBzQXRwKIBz5JgRQTRIEoEkEAFScXSwJQSb1FAUS8SDIHFihMULAjQ0mBMhJBAA8nFksCUEm9RQFEvEhC/+FJgTwSQQAPJyBLAlBJvUUBRLxIQv/LSYFGEkEADycVSwJQSb1FAUS8SEL/tUmBUBJB/64nGEsCUEm9RQFEvEhC/582GgFJFSMSRCJTJxUxAIgGZ0QnIUxnMgcWKExQsCNDIicSZUQoTFCwI0M2GgFJFSUSRCcXSwGIBj8nFksCiAY4JyBLA4gGMScVSwSIBionGE8FiAYjJygiTwZUI08FVIECTwRUgQNPA1SBBE8CVChMULAjQzYaAUkVIxJENhoCSU4CFSUSRBdJiAY7gwYUKDI8RlBPBo4GAE8AQAAxACIAEwABACcYSwFQSb1FAUS+SChMULAjQycVSwFQSb1FAUS+SEL/6ycgSwFQSb1FAUS+SEL/3CcWSwFQSb1FAUS+SEL/zScXSwFQSb1FAUS+SEL/voAQAAAAAAAAAAAAAAAAAAAAAEL/qYoBACcIi/9QvkSBgANTFESJigECJwiL/1BJvUUBREm+SCInEGVESwGBOVsJIicRZURLAoFBWwlLAiVbIicFZURPA0sCTwKIAJgiJwVlRE8DTwNPAogAiksCgUlbSwIIFk8DTFxJSYFRW0sCCBZcUSInEGVEFlw5IicRZUQWXEEiKmVEFlwxTwNMv4mKAQAigAAnCIv/UEm9RQFEIillRIEyEkEAAYmLAr5MSU4CjABEgShbSYwBQAABiYsASSVbiwFJTgMIFlwgIhZcKIsCTL8iJwplRElLAg9ETAknCkxniYoDAYv9QQAFi/5AAAIiiYv9i/4di/+XiYoBAYv/QAACIokiJw1lRElEIicFZUSL/0xPAoj/yomKAQGL/0AAAiKJIicNZUQiJwVlRIv/TIj/r4mKAQEiJwRlRIv/DUSL/4EQChYnH0xQSb1FAUSL/4EQGEsBIoECuhdLAQ1EgUELgQIIgUG6iYoCAIv/IxJAAB+L/yQSQAAYi/+BExJAABCL/4EMEkAACIv/gQsSQQADI0SJi/5AAAQiQv/1i/6BAxJAAAiL/oECEkEAGIv/gQMSQAAIi/+BEhJBAAQjQv/RIkL/zYv+IxJBACCL/4EDEkAAEIv/gRISQAAIi/+BBRJBAAQjQv+qIkL/pov+gQQSQQAoi/+BAxJAABiL/4EEEkAAEIv/gRISQAAIi/+BBRJBAAQjQv96IkL/dov+gQUSQQAIi/+BAxJC/2YiQv9iIicMZUQjEkEACiInImVEQQACI4kiiYoBAov/gRFbSUEAECInCWVEQQAIIicHZURAAAYii/9PAokiJwdlRCInCWVEIicFZUSI/mciJwVlRIsATIj+XIv/TwKJigIBi/9AAAOL/okiJwVlRCInCWVEi/9LAoj+OwhJRCInBWVEi/5MTwKI/iuJigICIoAARwiL/iJbIiplRBJEi/6BCVsyBw5Ei/4kVUkjEklBAF0iKWVEgTISRCInCmVEIicNZUQSRIv+gTFbK0sBZycHTGeL/oEhWycJTGcnBiJni/6BKVsnDkxnIiplRCMIKkxnKYFkZ4sLRCInFGVEi/5MIogBxUmM/ov/jAGMAIkiKWVEgTISFEQiJwZlRIv+iP75jP4IJwZMZ4sKgQwSQQFji/+BIVsiJyRlRCInBWVEiP1zIicjZUQIjAYiJyZlREEAEyInHWVEiwYNQQAIIicdZUyMBkQiJydlREEAEyInHmVEiwYMQQAIIiceZUyMBkQnCYsGZ4sKgQQSQQDzi/6BMVsrSwFnJwdMZ4j+Z0EA1IsKgQUSQQCyIicFZUyMAkQijAEijAeL/oEZW0mMCEEAD4sCiwiI/pZJjAIjjAeMASIqZUQjCIwDIicEZUSLAw1BAFKLA4j9H0mMACRVSYwEgQMSQAAQiwSBExJBADOLAIEZW0EAKyNBAAiLB0EADCKMB4sDIwiMA0L/vYsAgRlbiwJMiP44SYwCiwEIjAFC/+EiQv/SiwFEIitlRIv+gTlbJBpAAAYiJwZlRAgiJwVlRIsBiPxfJw5MZyIqZUQjCCpMZ4v+IkmIAF9JjP6L/4wBjACJi/6BKVsnDkxnQv/aiwqBEhJB/xIiK2VEJwdMZ0L/B4sKgQsSQQAbi/6BIVtJjAVAAAgiJyVlTIwFRCcJiwVnQv7Pi/6BIVtJjAlB/sQnCYsJZ0L+vIoDATIIi/0iW4v9VwgBi/1XCQgyB4v9JFWL/kAARSMWSZMkDkRXBwEiJxNlRIsBSSMIiwAWTwIWUIsCUIsDUIsEFlCL/hZQTwNQi/8WUE8CFlBMFlCABJozK5VMULCL/YwAiYsFIxJAAAiLBYEEEkEABCNC/6mB/wFC/6OKAgGAAIv+i/9QSb1FAUEAH4sBvkQiWzIHSYwADkEAEIsBvkQkW4sAD0EABCOMAIkiQv/5MQAiJxJlRBJEiSInKWVEFESJIichZUQURImKAQCL/4EUEkAAMIv/gRkSQAAoi/+BKBJAACCL/4EyEkAAGIv/gTwSQAAQi/+BRhJAAAiL/4FQEkEAAyNEiSJC//o=", "clear": "DIEBQw=="}, "desc": "Debt Algorand Standard Application.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "networks": {}, "source": {"approval": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCAzMgogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1ICJzdGF0dXMiICJldmVudF9jdXJzb3IiICJvdXRzdGFuZGluZ19wcmluY2lwYWwiICJzY2hlZHVsZV9lbnRyeV9jb3VudCIgImZpeGVkX3BvaW50X3NjYWxlIiAiYWNjcnVlZF9pbnRlcmVzdCIgImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMgIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIgInJlc2VydmVkX3VuaXRzX3RvdGFsIiAicmVzZXJ2ZWRfcHJpbmNpcGFsIiAiY29udHJhY3RfdHlwZSIgInRvdGFsX3VuaXRzIiAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIgInJlc2VydmVkX2ludGVyZXN0IiAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIgImN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IiAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMgInNldHRsZW1lbnRfYXNzZXRfaWQiICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIgMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMgMHg1MjIzNTA3MjY5NmQ2MTcyNzk0NDY1NjE2YzY1NzIyMyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMgMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzIDB4NTIyMzRmNzA0NDYxNjU2ZDZmNmUyMyAiaW5pdGlhbF9leGNoYW5nZV9kYXRlIiAidHJhbnNmZXJfb3BlbmluZ19kYXRlIiAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIiAicmF0ZV9yZXNldF9mbG9vciIgInJhdGVfcmVzZXRfY2FwIiAweDUzMjMgMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMyAiYXNzZXRfc3VzcGVuZGVkIiAiZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiIgInJhdGVfcmVzZXRfc3ByZWFkIiAicmF0ZV9yZXNldF9tdWx0aXBsaWVyIiAicmF0ZV9yZXNldF9uZXh0IiAiaGFzX3JhdGVfcmVzZXRfZmxvb3IiICJoYXNfcmF0ZV9yZXNldF9jYXAiIDB4MDAgImFzc2V0X2RlZmF1bHRlZCIgInByb3NwZWN0dXNfaGFzaCIgInByb3NwZWN0dXNfdXJsIiAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIiAibWF0dXJpdHlfZGF0ZSIgImRheV9jb3VudF9jb252ZW50aW9uIiAweDA2ODEwMQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4LTI5CiAgICAvLyAjIFJCQUMgUm9sZXMKICAgIC8vIHNlbGYuYXJyYW5nZXIgPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX0FSUkFOR0VSKQogICAgYnl0ZWMgMTggLy8gMHg1MjIzNDE3MjcyNjE2ZTY3NjU3MjIzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzAKICAgIC8vIHNlbGYub3BfZGFlbW9uID0gR2xvYmFsU3RhdGUoQWNjb3VudCgpLCBrZXk9Y3N0LlBSRUZJWF9JRF9PUF9EQUVNT04pCiAgICBieXRlYyAyNSAvLyAweDUyMjM0ZjcwNDQ2MTY1NmQ2ZjZlMjMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo0Ny00OAogICAgLy8gIyBELUFTQSBHb3Zlcm5hbmNlCiAgICAvLyBzZWxmLmFzc2V0X3N1c3BlbmRlZCA9IEZhbHNlCiAgICBieXRlYyAzMyAvLyAiYXNzZXRfc3VzcGVuZGVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NDkKICAgIC8vIHNlbGYuYXNzZXRfZGVmYXVsdGVkID0gRmFsc2UKICAgIGJ5dGVjIDQxIC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU2LTU3CiAgICAvLyAjIENvbnRyYWN0CiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMTIgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwLTYxCiAgICAvLyAjIFByb3NwZWN0dXMgKEluZm9ybWF0aW9uYWwpCiAgICAvLyBzZWxmLnByb3NwZWN0dXNfaGFzaCA9IEJ5dGVzKCkKICAgIGJ5dGVjIDQyIC8vICJwcm9zcGVjdHVzX2hhc2giCiAgICBwdXNoYnl0ZXMgMHgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MgogICAgLy8gc2VsZi5wcm9zcGVjdHVzX3VybCA9IFN0cmluZygpCiAgICBieXRlYyA0MyAvLyAicHJvc3BlY3R1c191cmwiCiAgICBwdXNoYnl0ZXMgIiIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NC02NQogICAgLy8gIyBEZW5vbWluYXRpb24KICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gQXNzZXQoKQogICAgYnl0ZWMgNDQgLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjYKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCA9IEFzc2V0KCkKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OC02OQogICAgLy8gIyBUaW1lCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgMjYgLy8gImluaXRpYWxfZXhjaGFuZ2VfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzAKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgNDUgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxCiAgICAvLyBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgMjcgLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIKICAgIC8vIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlID0gdHlwLlRpbWVTdGFtcCgpCiAgICBieXRlYyAyOCAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NC03NQogICAgLy8gIyBEYXkgQ291bnQgQ29udmVudGlvbgogICAgLy8gc2VsZi5kYXlfY291bnRfY29udmVudGlvbiA9IFVJbnQ2NCgpCiAgICBieXRlYyA0NiAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc3LTc4CiAgICAvLyAjIFVuaXRzCiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzID0gVUludDY0KCkKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPSBVSW50NjQoKQogICAgYnl0ZWMgMTAgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MS04MgogICAgLy8gIyBQcmluY2lwYWwKICAgIC8vIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPSBVSW50NjQoKQogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MwogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBVSW50NjQoKQogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NAogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gVUludDY0KCkKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NQogICAgLy8gc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gRmFsc2UKICAgIGJ5dGVjIDM0IC8vICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4Ny04OAogICAgLy8gIyBJbnRlcmVzdAogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gVUludDY0KCkKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg5CiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgPSBVSW50NjQoKQogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTEtOTIKICAgIC8vICMgSW50ZXJlc3QgUmF0ZXMKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTMKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQgPSBVSW50NjQoKQogICAgYnl0ZWMgMzUgLy8gInJhdGVfcmVzZXRfc3ByZWFkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NAogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIgPSBVSW50NjQoKQogICAgYnl0ZWMgMzYgLy8gInJhdGVfcmVzZXRfbXVsdGlwbGllciIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTUKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9mbG9vciA9IFVJbnQ2NCgpCiAgICBieXRlYyAyOSAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTYKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9jYXAgPSBVSW50NjQoKQogICAgYnl0ZWMgMzAgLy8gInJhdGVfcmVzZXRfY2FwIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NwogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X25leHQgPSBVSW50NjQoKQogICAgYnl0ZWMgMzcgLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTgKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgPSBGYWxzZQogICAgYnl0ZWMgMzggLy8gImhhc19yYXRlX3Jlc2V0X2Zsb29yIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OQogICAgLy8gc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgPSBGYWxzZQogICAgYnl0ZWMgMzkgLy8gImhhc19yYXRlX3Jlc2V0X2NhcCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAxLTEwMgogICAgLy8gIyBQcmltYXJ5IERpc3RyaWJ1dGlvbgogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgPSBVSW50NjQoKQogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAzCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0ID0gVUludDY0KCkKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA1LTEwNgogICAgLy8gIyBDdW11bGF0aXZlIFBlci1Vbml0IEZpeGVkLVBvaW50IEluZGV4ZXMKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4ID0gVUludDY0KCkKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1CiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciA9IFVJbnQ2NCgpCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNgogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA9IFVJbnQ2NCgpCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE4LTExOQogICAgLy8gIyBTY2FsaW5nCiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlID0gVUludDY0KCkKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6MjMKICAgIC8vIGFzc2VydCBUeG4uZ2xvYmFsX251bV9ieXRlX3NsaWNlID09IGNmZy5HTE9CQUxfQllURVMsIGVyci5XUk9OR19HTE9CQUxfQllURVMKICAgIHR4biBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgQnl0ZXMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjI0CiAgICAvLyBhc3NlcnQgVHhuLmdsb2JhbF9udW1fdWludCA9PSBjZmcuR0xPQkFMX1VJTlRTLCBlcnIuV1JPTkdfR0xPQkFMX1VJTlRTCiAgICB0eG4gR2xvYmFsTnVtVWludAogICAgcHVzaGludCAzNwogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgVUludHMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBhc3NlcnQgVHhuLmxvY2FsX251bV9ieXRlX3NsaWNlID09IGNmZy5MT0NBTF9CWVRFUywgZXJyLldST05HX0xPQ0FMX0JZVEVTCiAgICB0eG4gTG9jYWxOdW1CeXRlU2xpY2UKICAgICEKICAgIGFzc2VydCAvLyBXcm9uZyBMb2NhbCBCeXRlcyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6MjYKICAgIC8vIGFzc2VydCBUeG4ubG9jYWxfbnVtX3VpbnQgPT0gY2ZnLkxPQ0FMX1VJTlRTLCBlcnIuV1JPTkdfTE9DQUxfVUlOVFMKICAgIHR4biBMb2NhbE51bVVpbnQKICAgICEKICAgIGFzc2VydCAvLyBXcm9uZyBMb2NhbCBVSW50cyBhbGxvY2F0aW9uCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kX2FzYS9jb250cmFjdC5weTo4LTE4CiAgICAvLyBjbGFzcyBEQVNBKAogICAgLy8gICAgIFBheW1lbnRBZ2VudCwKICAgIC8vICAgICBUcmFuc2ZlckFnZW50LAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gICAgIGF2bV92ZXJzaW9uPTEyLAogICAgLy8gKToKICAgIHB1c2hieXRlcyAweDkxNGYwNGViIC8vIG1ldGhvZCAiY29udHJhY3RfdXBkYXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9jb250cmFjdF91cGRhdGVfcm91dGVANAoKbWFpbl9zd2l0Y2hfY2FzZV9uZXh0QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6OC0xOAogICAgLy8gY2xhc3MgREFTQSgKICAgIC8vICAgICBQYXltZW50QWdlbnQsCiAgICAvLyAgICAgVHJhbnNmZXJBZ2VudCwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBhdm1fdmVyc2lvbj0xMiwKICAgIC8vICk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBieiBtYWluX2NyZWF0ZV9Ob09wQDMxCiAgICBwdXNoYnl0ZXNzIDB4YjQ0NjE4YzggMHhlNzgzMjUyOSAweDdlYTIwZTBiIDB4NmM4NWUzZWUgMHhiZGQxYTk0NCAweGRjMDYzYjM1IDB4MTRmYzEwZWYgMHg3NGE3Mjk3ZiAweDA5ZDRmZTE0IDB4OWE5YmZhODUgMHg4NWVlZDMzZCAweDkxODUxMDRhIDB4ZDlmMjI1YWMgMHg2ZTBlNWM5NSAweGZmM2ZkNGIzIDB4ODJmNzFiMmQgMHhlZjA0ZjVkMyAweGRmMzQzNTUwIDB4M2RiZTgwYmQgMHhkZjU0ZTgyYyAweDAxMGM4Mjk5IDB4NzQwNmFjZDIgMHgxYTcyYTJlZSAvLyBtZXRob2QgImZ1bmRfZHVlX2Nhc2hmbG93cyh1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJjbGFpbV9kdWVfY2FzaGZsb3dzKGFkZHJlc3MsYnl0ZVtdKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYnl0ZVtdKSIsIG1ldGhvZCAic2V0X3RyYW5zZmVyX3NjaGVkdWxlKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbihhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInRyYW5zZmVyKGFkZHJlc3MsYWRkcmVzcyx1aW50NjQpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X2dvdl9zdXNwZW5zaW9uKGFkZHJlc3MsYm9vbCl1aW50NjQiLCBtZXRob2QgImFjY291bnRfb3BlbihhZGRyZXNzLGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X3VwZGF0ZV9wYXltZW50X2FkZHJlc3MoYWRkcmVzcyxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAiYWNjb3VudF9nZXRfcG9zaXRpb24oYWRkcmVzcykoYWRkcmVzcyx1aW50NjQsdWludDY0LGJvb2wsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImNvbnRyYWN0X2NvbmZpZygodWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYm9vbCxib29sLGJvb2wsdWludDY0KSwodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpLChieXRlWzMyXSxzdHJpbmcpKXVpbnQ2NCIsIG1ldGhvZCAiY29udHJhY3Rfc2NoZWR1bGUodWludDY0LGJvb2wsKHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpW10pdWludDY0IiwgbWV0aG9kICJleGVjdXRlX2llZCgpdWludDY0IiwgbWV0aG9kICJhcHBseV9ub25fY2FzaF9ldmVudCh1aW50NjQsKHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSl1aW50NjQiLCBtZXRob2QgImdldF9jb250cmFjdF9zdGF0ZSgpKHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJnZXRfbmV4dF9kdWVfZXZlbnQoKSh1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAicmJhY19yb3RhdGVfYXJyYW5nZXIoYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgInJiYWNfc2V0X29wX2RhZW1vbihhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19hc3NpZ25fcm9sZSh1aW50OCxhZGRyZXNzLCh1aW50NjQsdWludDY0KSl1aW50NjQiLCBtZXRob2QgInJiYWNfcmV2b2tlX3JvbGUodWludDgsYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgInJiYWNfZ292X2Fzc2V0X3N1c3BlbnNpb24oYm9vbCl1aW50NjQiLCBtZXRob2QgInJiYWNfZ2V0X2FycmFuZ2VyKClhZGRyZXNzIiwgbWV0aG9kICJyYmFjX2dldF9hZGRyZXNzX3JvbGVzKGFkZHJlc3MpKGJvb2wsYm9vbCxib29sLGJvb2wsYm9vbCkiLCBtZXRob2QgInJiYWNfZ2V0X3JvbGVfdmFsaWRpdHkodWludDgsYWRkcmVzcykodWludDY0LHVpbnQ2NCkiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBmdW5kX2R1ZV9jYXNoZmxvd3MgY2xhaW1fZHVlX2Nhc2hmbG93cyBzZXRfdHJhbnNmZXJfc2NoZWR1bGUgcHJpbWFyeV9kaXN0cmlidXRpb24gdHJhbnNmZXIgYWNjb3VudF9nb3Zfc3VzcGVuc2lvbiBhY2NvdW50X29wZW4gYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzIGFjY291bnRfZ2V0X3Bvc2l0aW9uIGNvbnRyYWN0X2NvbmZpZyBjb250cmFjdF9zY2hlZHVsZSBleGVjdXRlX2llZCBhcHBseV9ub25fY2FzaF9ldmVudCBnZXRfY29udHJhY3Rfc3RhdGUgZ2V0X25leHRfZHVlX2V2ZW50IHJiYWNfcm90YXRlX2FycmFuZ2VyIHJiYWNfc2V0X29wX2RhZW1vbiByYmFjX2Fzc2lnbl9yb2xlIHJiYWNfcmV2b2tlX3JvbGUgcmJhY19nb3ZfYXNzZXRfc3VzcGVuc2lvbiByYmFjX2dldF9hcnJhbmdlciByYmFjX2dldF9hZGRyZXNzX3JvbGVzIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHkKICAgIGVycgoKbWFpbl9jcmVhdGVfTm9PcEAzMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kX2FzYS9jb250cmFjdC5weTo4LTE4CiAgICAvLyBjbGFzcyBEQVNBKAogICAgLy8gICAgIFBheW1lbnRBZ2VudCwKICAgIC8vICAgICBUcmFuc2ZlckFnZW50LAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gICAgIGF2bV92ZXJzaW9uPTEyLAogICAgLy8gKToKICAgIHB1c2hieXRlcyAweDk1NmQ3MTU2IC8vIG1ldGhvZCAiY29udHJhY3RfY3JlYXRlKGFkZHJlc3MpdWludDY0IgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggY29udHJhY3RfY3JlYXRlCiAgICBlcnIKCm1haW5fY29udHJhY3RfdXBkYXRlX3JvdXRlQDQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBwdXNoaW50IDQgLy8gVXBkYXRlQXBwbGljYXRpb24KICAgID09CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydAogICAgYiBjb250cmFjdF91cGRhdGUKCgovLyBtb2R1bGVzLnBheW1lbnRfYWdlbnQuUGF5bWVudEFnZW50LmZ1bmRfZHVlX2Nhc2hmbG93c1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmZ1bmRfZHVlX2Nhc2hmbG93czoKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gMTAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjUwCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo1MQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo1MgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDcKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NTUKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NTYtNTcKICAgIC8vIGZ1bmRlZF9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgLy8gZnVuZGVkX3ByaW5jaXBhbCA9IFVJbnQ2NCgwKQogICAgZHVwbiAyCgpmdW5kX2R1ZV9jYXNoZmxvd3Nfd2hpbGVfdG9wQDI6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjAKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgPCBtYXhfZXZlbnRfY291bnQKICAgIGRpZyAyCiAgICBkaWcgNAogICAgPAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjYwLTYxCiAgICAvLyBwcm9jZXNzZWRfZXZlbnRzIDwgbWF4X2V2ZW50X2NvdW50CiAgICAvLyBhbmQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAOQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjYxCiAgICAvLyBhbmQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIDwKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2MC02MQogICAgLy8gcHJvY2Vzc2VkX2V2ZW50cyA8IG1heF9ldmVudF9jb3VudAogICAgLy8gYW5kIHNlbGYuZXZlbnRfY3Vyc29yIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudAogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDkKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2MwogICAgLy8gZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoc2VsZi5ldmVudF9jdXJzb3IpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgZHVwCiAgICBidXJ5IDE3CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjQKICAgIC8vIGlmIGVudHJ5LnNjaGVkdWxlZF90aW1lID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXA6CiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgNgogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPgogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl93aGlsZUA5CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjYKICAgIC8vIGlmIG5vdCBzZWxmLl9ldmVudF9pc19jYXNoKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkpOgogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBidXJ5IDE2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNTEKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgaW50Y18yIC8vIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM1MC0zNTQKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX01EKSwKICAgIC8vICkKICAgID09CiAgICBkdXAKICAgIGJ1cnkgNwogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX3RydWVANTAKICAgIGRpZyAxNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzUyCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzUwLTM1NAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfTUQpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDUwCiAgICBkaWcgMTQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM1MwogICAgLy8gVUludDY0KGVudW1zLkVWVF9NRCksCiAgICBwdXNoaW50IDE5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNTAtMzU0CiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9NRCksCiAgICAvLyApCiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VANTEKCmZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX3RydWVANTA6CiAgICBpbnRjXzEgLy8gMQoKZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfbWVyZ2VANTI6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjYKICAgIC8vIGlmIG5vdCBzZWxmLl9ldmVudF9pc19jYXNoKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkpOgogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU0OAogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X2lkID09IHNlbGYuZXZlbnRfY3Vyc29yLCBlcnIuSU5WQUxJRF9FVkVOVF9DVVJTT1IKICAgIGRpZyAxNQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBjdXJzb3IKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU0OQogICAgLy8gYXNzZXJ0IGVudHJ5LnNjaGVkdWxlZF90aW1lIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLCBlcnIuTk9fRFVFX0NBU0hGTE9XCiAgICBkaWcgNAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPD0KICAgIGFzc2VydCAvLyBObyBkdWUgY2FzaGZsb3cgdG8gcGF5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MTMKICAgIC8vIGlmIGV2ZW50X3R5cGUgbm90IGluIChVSW50NjQoZW51bXMuRVZUX0lQKSwgVUludDY0KGVudW1zLkVWVF9NRCkpOgogICAgZGlnIDUKICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxMwogICAgZGlnIDE0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDEzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MTQKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDEzCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfaW50ZXJlc3RfYW1vdW50QDE0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDI2CiAgICAvLyBldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBidXJ5IDE2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MjcKICAgIC8vIGlmIGV2ZW50X3R5cGUgbm90IGluIChVSW50NjQoZW51bXMuRVZUX1BSKSwgVUludDY0KGVudW1zLkVWVF9NRCkpOgogICAgcHVzaGludCAzCiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE3CiAgICBkaWcgMTQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQyOAogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnRAMjY6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTMKICAgIC8vIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGRpZyAxNQogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgMTAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1NgogICAgLy8gaWYgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCk6CiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUAyNwogICAgZGlnIDkKICAgIGJ1cnkgMTEKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTcyLTU3NAogICAgLy8gIyBGdW5kaW5nIHVzZXMgcGVyLXVuaXQgY3VtdWxhdGl2ZSBpbmRpY2VzIHNvIGVhY2ggaG9sZGVyIGNhbiBzZXR0bGUKICAgIC8vICMgaW5kZXBlbmRlbnRseSBmcm9tIGl0cyBjdXJyZW50IHVuaXQgYmFsYW5jZS4KICAgIC8vIGludGVyZXN0X2luZGV4X2RlbHRhID0gc2VsZi5fYW1vdW50X3RvX2luZGV4X2RlbHRhKGludGVyZXN0X2Ftb3VudF9kdWUpCiAgICBkaWcgMTIKICAgIGNhbGxzdWIgX2Ftb3VudF90b19pbmRleF9kZWx0YQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTc1CiAgICAvLyBwcmluY2lwYWxfaW5kZXhfZGVsdGEgPSBzZWxmLl9hbW91bnRfdG9faW5kZXhfZGVsdGEocHJpbmNpcGFsX2Ftb3VudF9kdWUpCiAgICBkaWcgOAogICAgY2FsbHN1YiBfYW1vdW50X3RvX2luZGV4X2RlbHRhCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzYKICAgIC8vIGludGVyZXN0X2Ftb3VudCA9IHNlbGYuX2luZGV4X2RlbHRhX3RvX2Ftb3VudChpbnRlcmVzdF9pbmRleF9kZWx0YSkKICAgIGRpZyAxCiAgICBjYWxsc3ViIF9pbmRleF9kZWx0YV90b19hbW91bnQKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSAxNwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTc3CiAgICAvLyBwcmluY2lwYWxfYW1vdW50ID0gc2VsZi5faW5kZXhfZGVsdGFfdG9fYW1vdW50KHByaW5jaXBhbF9pbmRleF9kZWx0YSkKICAgIGR1cAogICAgY2FsbHN1YiBfaW5kZXhfZGVsdGFfdG9fYW1vdW50CiAgICBkdXAKICAgIGJ1cnkgMTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU3OAogICAgLy8gcmVxdWlyZWRfYW1vdW50ID0gaW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudAogICAgZGlnIDIKICAgIGRpZyAxCiAgICArCiAgICBkdXAKICAgIGJ1cnkgMTIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcyNwogICAgLy8gYmFsYW5jZSA9IHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ1NgogICAgLy8gcmV0dXJuIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgKyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIGRpZyAxCiAgICArCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MjkKICAgIC8vIGFzc2VydCBiYWxhbmNlID49IHJlc2VydmVkX3RvdGFsLCBlcnIuTk9UX0VOT1VHSF9GVU5EUwogICAgZGlnIDIKICAgIGRpZyAxCiAgICA+PQogICAgYXNzZXJ0IC8vIE5vdCBlbm91Z2ggZnVuZHMgZm9yIHRoZSBwYXltZW50CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MzAKICAgIC8vIHJldHVybiBiYWxhbmNlIC0gcmVzZXJ2ZWRfdG90YWwKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTgwCiAgICAvLyBzZWxmLl9hdmFpbGFibGVfc2V0dGxlbWVudF9mdW5kcygpID49IHJlcXVpcmVkX2Ftb3VudAogICAgdW5jb3ZlciAyCiAgICA+PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTc5LTU4MQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLl9hdmFpbGFibGVfc2V0dGxlbWVudF9mdW5kcygpID49IHJlcXVpcmVkX2Ftb3VudAogICAgLy8gKSwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTgzCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0ICs9IGludGVyZXN0X2Ftb3VudAogICAgdW5jb3ZlciAzCiAgICArCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTg0CiAgICAvLyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCArPSBwcmluY2lwYWxfYW1vdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICArCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4NQogICAgLy8gc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4ICs9IGludGVyZXN0X2luZGV4X2RlbHRhCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCBleGlzdHMKICAgIHVuY292ZXIgMgogICAgKwogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTg2CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4ICs9IHByaW5jaXBhbF9pbmRleF9kZWx0YQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCBleGlzdHMKICAgICsKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1ODcKICAgIC8vIGlmIGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkgPT0gVUludDY0KGVudW1zLkVWVF9QUik6CiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBwdXNoaW50IDMKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDM4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1ODgtNTg5CiAgICAvLyAjIEZvciBQUiwgdGhlIHBlcmlvZCBpbnRlcmVzdCBzdGF5cyBhY2NydWVkIHVudGlsIGEgbGF0ZXIgSVAgb3IgTUQuCiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgKz0gc2VsZi5fZW50cnlfaW50ZXJlc3Rfc2VnbWVudChlbnRyeSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBkaWcgMTYKICAgIGNhbGxzdWIgX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQKICAgIGJ1cnkgMTgKICAgICsKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTIKICAgIC8vIGlmIG5vdCBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKSBvciBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NCgKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlANDEKICAgIGRpZyAxNQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5Mi01OTQKICAgIC8vIGlmIG5vdCBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKSBvciBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NCgKICAgIC8vICAgICBlbnVtcy5FVlRfTUQKICAgIC8vICk6CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDIKCmZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDQxOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTk1CiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBkaWcgMTUKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0MjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5NgogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgZGlnIDEwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTk3CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBuZXh0X2ludGVyZXN0X2Jhc2UKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBkaWcgMTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTgKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwMAogICAgLy8gaWYgZW50cnkuZXZlbnRfdHlwZSA9PSBhcmM0LlVJbnQ4KAogICAgZGlnIDE1CiAgICBleHRyYWN0IDggMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAwLTYwMgogICAgLy8gaWYgZW50cnkuZXZlbnRfdHlwZSA9PSBhcmM0LlVJbnQ4KAogICAgLy8gICAgIGVudW1zLkVWVF9NRAogICAgLy8gKSBhbmQgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPT0gVUludDY0KDApOgogICAgcHVzaGJ5dGVzIDB4MTMKICAgIGI9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwMgogICAgLy8gKSBhbmQgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPT0gVUludDY0KDApOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MDAtNjAyCiAgICAvLyBpZiBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoCiAgICAvLyAgICAgZW51bXMuRVZUX01ECiAgICAvLyApIGFuZCBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9PSBVSW50NjQoMCk6CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwMwogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX0VOREVEKQogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgcHVzaGludCAyMDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MDQKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MDYtNjEwCiAgICAvLyBzZWxmLl9lbWl0X2V4ZWN1dGlvbl9ldmVudCgKICAgIC8vICAgICBlbnRyeT1lbnRyeSwKICAgIC8vICAgICBwYXlvZmY9aW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudCwKICAgIC8vICAgICBzZXR0bGVkX2Ftb3VudD1pbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50LAogICAgLy8gKQogICAgZGlnIDE1CiAgICBkaWcgNwogICAgZHVwCiAgICBjYWxsc3ViIF9lbWl0X2V4ZWN1dGlvbl9ldmVudAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzAKICAgIC8vIGZ1bmRlZF9pbnRlcmVzdCArPSBpbnRlcmVzdF9hbW91bnQKICAgIGRpZyAxCiAgICBkaWcgMTQKICAgICsKICAgIGJ1cnkgMgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjcxCiAgICAvLyBmdW5kZWRfcHJpbmNpcGFsICs9IHByaW5jaXBhbF9hbW91bnQKICAgIGR1cAogICAgZGlnIDkKICAgICsKICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjcyCiAgICAvLyBwcm9jZXNzZWRfZXZlbnRzICs9IFVJbnQ2NCgxKQogICAgZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDMKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX3doaWxlX3RvcEAyCgpmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDM4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTkxCiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzkKCmZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDI3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTU3CiAgICAvLyBldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBidXJ5IDE2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTgtNTYwCiAgICAvLyAjIER5bmFtaWMgYW5udWl0aWVzIGRlcml2ZSBuZXh0IHN0YXRlIGZyb20gdGhlIHBheW1lbnQgZGVjb21wb3NpdGlvbiwKICAgIC8vICMgbm90IG9ubHkgZnJvbSB0aGUgcHJlY29tcHV0ZWQgYG5leHRfKmAgZmllbGRzLgogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1BSKToKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19lbHNlX2JvZHlAMjkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU2MgogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgLSBwcmluY2lwYWxfYW1vdW50X2R1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBkaWcgOAogICAgLQogICAgZHVwCiAgICBidXJ5IDExCiAgICBidXJ5IDExCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDI5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY1CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9JUCk6CiAgICBkaWcgMTQKICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUAzMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY2CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGJ1cnkgMTEKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU2NwogICAgLy8gbmV4dF9pbnRlcmVzdF9iYXNlID0gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBidXJ5IDEyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIGV4aXN0cwogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzNgoKZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUAzMToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU2OAogICAgLy8gZWxpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfTUQpOgogICAgZGlnIDE0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDMyCiAgICBkaWcgOQogICAgYnVyeSAxMQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzNgoKZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlAMzI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjkKICAgIC8vIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAxMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTcwCiAgICAvLyBuZXh0X2ludGVyZXN0X2Jhc2UgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDExCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQyOQogICAgLy8gaWYgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCk6CiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDI1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzAKICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCk6CiAgICBkaWcgMTQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDMxCiAgICAvLyByZXR1cm4gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTIKICAgIC8vIHByaW5jaXBhbF9hbW91bnRfZHVlID0gc2VsZi5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudChlbnRyeSkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnRAMjYKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDIwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDMyCiAgICAvLyBpbnRlcmVzdF9kdWUgPSBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgKyBzZWxmLl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KGVudHJ5KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgIGRpZyAxNgogICAgY2FsbHN1YiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudAogICAgYnVyeSAxOAogICAgKwogICAgZHVwCiAgICBidXJ5IDEzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzMKICAgIC8vIGlmIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA8PSBpbnRlcmVzdF9kdWU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiBleGlzdHMKICAgID49CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDM0CiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTIKICAgIC8vIHByaW5jaXBhbF9hbW91bnRfZHVlID0gc2VsZi5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudChlbnRyeSkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnRAMjYKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDIyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDM1CiAgICAvLyBwcmluY2lwYWxfYW1vdW50ID0gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIC0gaW50ZXJlc3RfZHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiBleGlzdHMKICAgIGRpZyAxMgogICAgLQogICAgZHVwCiAgICBidXJ5IDEwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzYKICAgIC8vIGlmIHByaW5jaXBhbF9hbW91bnQgPiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgPgogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzNwogICAgLy8gcmV0dXJuIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTUyCiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyNDoKICAgIGRpZyA4CiAgICBidXJ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyNgoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NDAKICAgIC8vIGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsIDw9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBkaWcgMTUKICAgIHB1c2hpbnQgNDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGR1cDIKICAgIDw9CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzktNDQxCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsIDw9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ0MgogICAgLy8gcmV0dXJuIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIC0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIHN3YXAKICAgIC0KICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTUyCiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQxNQogICAgLy8gcmV0dXJuIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCArIHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZGlnIDE2CiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBidXJ5IDE4CiAgICArCiAgICBidXJ5IDEzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTEKICAgIC8vIGludGVyZXN0X2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9pbnRlcmVzdF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9pbnRlcmVzdF9hbW91bnRAMTQKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl93aGlsZUA5OgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojc0CiAgICAvLyBhc3NlcnQgcHJvY2Vzc2VkX2V2ZW50cyA+IFVJbnQ2NCgwKSwgZXJyLk5PX0RVRV9DQVNIRkxPVwogICAgZGlnIDIKICAgIGR1cAogICAgYXNzZXJ0IC8vIE5vIGR1ZSBjYXNoZmxvdyB0byBwYXkKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3OAogICAgLy8gdG90YWxfZnVuZGVkPWZ1bmRlZF9pbnRlcmVzdCArIGZ1bmRlZF9wcmluY2lwYWwsCiAgICBkaWcgMgogICAgZHVwCiAgICBkaWcgMwogICAgZHVwCiAgICBjb3ZlciAzCiAgICArCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODAKICAgIC8vIHRpbWVzdGFtcD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3NS04MQogICAgLy8gcmV0dXJuIHR5cC5DYXNoRnVuZGluZ1Jlc3VsdCgKICAgIC8vICAgICBmdW5kZWRfaW50ZXJlc3Q9ZnVuZGVkX2ludGVyZXN0LAogICAgLy8gICAgIGZ1bmRlZF9wcmluY2lwYWw9ZnVuZGVkX3ByaW5jaXBhbCwKICAgIC8vICAgICB0b3RhbF9mdW5kZWQ9ZnVuZGVkX2ludGVyZXN0ICsgZnVuZGVkX3ByaW5jaXBhbCwKICAgIC8vICAgICBwcm9jZXNzZWRfZXZlbnRzPXByb2Nlc3NlZF9ldmVudHMsCiAgICAvLyAgICAgdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUA1MToKICAgIGludGNfMCAvLyAwCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDUyCgoKLy8gbW9kdWxlcy5wYXltZW50X2FnZW50LlBheW1lbnRBZ2VudC5jbGFpbV9kdWVfY2FzaGZsb3dzW3JvdXRpbmddKCkgLT4gdm9pZDoKY2xhaW1fZHVlX2Nhc2hmbG93czoKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNAogICAgLy8gaWYgc2VsZi5vcF9kYWVtb24udmFsdWUgIT0gR2xvYmFsLnplcm9fYWRkcmVzczoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNSAvLyAweDUyMjM0ZjcwNDQ2MTY1NmQ2ZjZlMjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcF9kYWVtb24gZXhpc3RzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBieiBjbGFpbV9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTcKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNgogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI1IC8vIDB4NTIyMzRmNzA0NDYxNjU2ZDZmNmUyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wX2RhZW1vbiBleGlzdHMKICAgID09CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTYtMTgKICAgIC8vIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICAvLyBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgYm56IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDE0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTcKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNi0xOAogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICBibnogY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX3RydWVAMTQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxOAogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIHR4biBTZW5kZXIKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDMyCiAgICA9PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE2LTE4CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAxNQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX3RydWVAMTQ6CiAgICBpbnRjXzEgLy8gMQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDE2OgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE1LTE5CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vICAgICBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gICAgIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICAvLyApLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNzoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5NAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5NQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDcKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6OTgKICAgIC8vIHNlbGYuX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQoaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDIKICAgIGR1cAogICAgY2FsbHN1YiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojk5CiAgICAvLyBzZWxmLl9zZXR0bGVfcG9zaXRpb24oaG9sZGluZ19hZGRyZXNzKQogICAgY2FsbHN1YiBfc2V0dGxlX3Bvc2l0aW9uCiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTcKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNsYWltYWJsZV9pbnRlcmVzdAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZHVwCiAgICBwdXNoaW50IDczCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBidXJ5IDgKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTgKICAgIC8vICsgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgZHVwCiAgICBwdXNoaW50IDgxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDgKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTctMTE4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jbGFpbWFibGVfaW50ZXJlc3QKICAgIC8vICsgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgdW5jb3ZlciAyCiAgICArCiAgICBkdXAKICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjEwMQogICAgLy8gYXNzZXJ0IHRvdGFsX2Ftb3VudCA+IFVJbnQ2NCgwKSwgZXJyLk5PX0RVRV9DQVNIRkxPVwogICAgYXNzZXJ0IC8vIE5vIGR1ZSBjYXNoZmxvdyB0byBwYXkKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLmlzX29wdGVkX2luKAogICAgZXh0cmFjdCAwIDMyCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MjUKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MjQtMjYKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5pc19vcHRlZF9pbigKICAgIC8vICAgICBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQKICAgIC8vICkKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MjQtMjcKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5pc19vcHRlZF9pbigKICAgIC8vICAgICBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQKICAgIC8vICkKICAgIC8vIGFuZCBub3Qgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkCiAgICBieiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VAMjQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNwogICAgLy8gYW5kIG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHB1c2hpbnQgMzg0CiAgICBnZXRiaXQKICAgIGJueiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VAMjQKICAgIGludGNfMSAvLyAxCgpjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfbWVyZ2VAMjU6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA2CiAgICAvLyBpZiBzZWxmLl9pc19wYXltZW50X2V4ZWN1dGFibGUoaG9sZGluZ19hZGRyZXNzKToKICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MzMKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICBzd2FwCiAgICBkaWcgMQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBvcHRlZCBpbnRvIGFzc2V0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MzMtMzQKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICAvLyA+PSBwYXltZW50X2Ftb3VudAogICAgZGlnIDUKICAgIGR1cAogICAgY292ZXIgMgogICAgPj0KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozMi0zNQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgLy8gICAgID49IHBheW1lbnRfYW1vdW50CiAgICAvLyApLCBlcnIuTk9UX0VOT1VHSF9GVU5EUwogICAgYXNzZXJ0IC8vIE5vdCBlbm91Z2ggZnVuZHMgZm9yIHRoZSBwYXltZW50CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA4CiAgICAvLyBzZWxmLl9wYXkoc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLCB0b3RhbF9hbW91bnQpCiAgICBkaWcgMgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZHVwCiAgICBleHRyYWN0IDAgMzIKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozOS00NAogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXJlY2VpdmVyLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1hbW91bnQsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0MwogICAgLy8gZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIGdsb2JhbCBNaW5UeG5GZWUKICAgIHVuY292ZXIgMwogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgc3dhcAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MzkKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozOS00NAogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXJlY2VpdmVyLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1hbW91bnQsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTI1LTEyNgogICAgLy8gIyBHZXQgdGhlIGNsYWltYWJsZSBhbW91bnRzIGJlZm9yZSByZXNldAogICAgLy8gaW50ZXJlc3RfYW1vdW50ID0gcG9zaXRpb24uY2xhaW1hYmxlX2ludGVyZXN0CiAgICBkdXAKICAgIHB1c2hpbnQgNzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgOQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEyNwogICAgLy8gcHJpbmNpcGFsX2Ftb3VudCA9IHBvc2l0aW9uLmNsYWltYWJsZV9wcmluY2lwYWwKICAgIGR1cAogICAgcHVzaGludCA4MQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMwogICAgYnVyeSA5CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTI5LTEzMAogICAgLy8gIyBSZXNldCB0aGUgcG9zaXRpb24ncyBjbGFpbWFibGUgYW1vdW50cwogICAgLy8gcG9zaXRpb24uY2xhaW1hYmxlX2ludGVyZXN0ID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgaXRvYgogICAgc3dhcAogICAgZGlnIDEKICAgIHJlcGxhY2UyIDczCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTMxCiAgICAvLyBwb3NpdGlvbi5jbGFpbWFibGVfcHJpbmNpcGFsID0gVUludDY0KDApCiAgICBzd2FwCiAgICByZXBsYWNlMiA4MQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzMgogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSBwb3NpdGlvbi5jb3B5KCkKICAgIHVuY292ZXIgMwogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzNAogICAgLy8gYXNzZXJ0IHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgPj0gaW50ZXJlc3RfYW1vdW50LCBlcnIuTk9UX0VOT1VHSF9GVU5EUwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCBleGlzdHMKICAgIGR1cAogICAgZGlnIDIKICAgID49CiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcyBmb3IgdGhlIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzUKICAgIC8vIGFzc2VydCBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCA+PSBwcmluY2lwYWxfYW1vdW50LCBlcnIuTk9UX0VOT1VHSF9GVU5EUwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIGV4aXN0cwogICAgZGlnIDMKICAgID49CiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcyBmb3IgdGhlIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzctMTM4CiAgICAvLyAjIFVwZGF0ZSB0aGUgZ2xvYmFsIHJlc2VydmVkIGludGVyZXN0IGFuZCBwcmluY2lwYWwgYW1vdW50cwogICAgLy8gc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCAtPSBpbnRlcmVzdF9hbW91bnQKICAgIHN3YXAKICAgIC0KICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTM5CiAgICAvLyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCAtPSBwcmluY2lwYWxfYW1vdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICBzd2FwCiAgICAtCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjExNAogICAgLy8gdG90YWxfYW1vdW50PWludGVyZXN0X2Ftb3VudCArIHByaW5jaXBhbF9hbW91bnQsCiAgICBkaWcgNQogICAgZHVwCiAgICBkaWcgNgogICAgZHVwCiAgICBjb3ZlciAzCiAgICArCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTE1CiAgICAvLyB0aW1lc3RhbXA9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTExLTExNwogICAgLy8gcmV0dXJuIHR5cC5DYXNoQ2xhaW1SZXN1bHQoCiAgICAvLyAgICAgaW50ZXJlc3RfYW1vdW50PWludGVyZXN0X2Ftb3VudCwKICAgIC8vICAgICBwcmluY2lwYWxfYW1vdW50PXByaW5jaXBhbF9hbW91bnQsCiAgICAvLyAgICAgdG90YWxfYW1vdW50PWludGVyZXN0X2Ftb3VudCArIHByaW5jaXBhbF9hbW91bnQsCiAgICAvLyAgICAgdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gICAgIGNvbnRleHQ9cGF5bWVudF9pbmZvLAogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZGlnIDIKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBwdXNoYnl0ZXMgMHgwMDIyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAyNDoKICAgIGludGNfMCAvLyAwCiAgICBiIGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUAyNQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX2ZhbHNlQDE1OgogICAgaW50Y18wIC8vIDAKICAgIGIgY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDE2CgoKLy8gbW9kdWxlcy50cmFuc2Zlcl9hZ2VudC5UcmFuc2ZlckFnZW50LnNldF90cmFuc2Zlcl9zY2hlZHVsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF90cmFuc2Zlcl9zY2hlZHVsZToKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToyNgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjI3CiAgICAvLyBhc3NlcnQgb3Blbl9kYXRlIDwgY2xvc3VyZV9kYXRlLCBlcnIuSU5WQUxJRF9TT1JUSU5HCiAgICBkdXAyCiAgICA8CiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbXVzdCBiZSBzb3J0ZWQgaW4gc3RyaWN0bHkgYXNjZW5kaW5nIG9yZGVyCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjI5CiAgICAvLyBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA9IG9wZW5fZGF0ZQogICAgYnl0ZWMgMjcgLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIHVuY292ZXIgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MzAKICAgIC8vIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlID0gY2xvc3VyZV9kYXRlCiAgICBieXRlYyAyOCAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MzEKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy50cmFuc2Zlcl9hZ2VudC5UcmFuc2ZlckFnZW50LnByaW1hcnlfZGlzdHJpYnV0aW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcHJpbWFyeV9kaXN0cmlidXRpb246CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjcxCiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5wcmltYXJ5X2RlYWxlciwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDIyIC8vIDB4NTIyMzUwNzI2OTZkNjE3Mjc5NDQ2NTYxNmM2NTcyMjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDMKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQ0CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDUKICAgIC8vIGFzc2VydCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBSSU1BUllfRElTVFJJQlVUSU9OX0NMT1NFRAogICAgYXNzZXJ0IC8vIFByaW1hcnkgZGlzdHJpYnV0aW9uIGlzIGNsb3NlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgY292ZXIgMwogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo0NwogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChob2xkaW5nX2FkZHJlc3MpCiAgICBzd2FwCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQ4CiAgICAvLyBhc3NlcnQgdW5pdHMgPiBVSW50NjQoMCksIGVyci5aRVJPX1VOSVRTCiAgICBkdXAKICAgIGFzc2VydCAvLyBDYW4gbm90IGRpc3RyaWJ1dGUgemVybyB1bml0cwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo1MAogICAgLy8gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCArIHVuaXRzIDw9IHNlbGYudG90YWxfdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICArCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgPD0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDktNTEKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCArIHVuaXRzIDw9IHNlbGYudG90YWxfdW5pdHMKICAgIC8vICksIGVyci5PVkVSX0RJU1RSSUJVVElPTgogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCByZW1haW5pbmcgRC1BU0EgdW5pdHMKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NTIKICAgIC8vIGlmIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI2IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlIGV4aXN0cwogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjU0CiAgICAvLyBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8PSBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI2IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlIGV4aXN0cwogICAgPD0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NTMtNTUKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPD0gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGUKICAgIC8vICksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TRUQKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBjbG9zZWQKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNDgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnJlc2VydmVkX3VuaXRzICs9IHVuaXRzCiAgICBkdXBuIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDMKICAgIGR1cAogICAgY292ZXIgMwogICAgKwogICAgaXRvYgogICAgcHVzaGludCA0MAogICAgc3dhcAogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NTgKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgKz0gdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICArCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NTkKICAgIC8vIHJldHVybiBzZWxmLnRvdGFsX3VuaXRzIC0gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIHN3YXAKICAgIC0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMudHJhbnNmZXJfYWdlbnQuVHJhbnNmZXJBZ2VudC50cmFuc2Zlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnRyYW5zZmVyOgogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo2MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NzUKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojc2CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTMKICAgIC8vIGlmIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI3IC8vICJ0cmFuc2Zlcl9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlIGV4aXN0cwogICAgYnogdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE1CiAgICAvLyBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI3IC8vICJ0cmFuc2Zlcl9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlIGV4aXN0cwogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPD0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTQtMTYKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICksIGVyci5DTE9TRURfVFJBTlNGRVIKICAgIGFzc2VydCAvLyBUcmFuc2ZlciBpcyBjbG9zZWQKCnRyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTcKICAgIC8vIGlmIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI4IC8vICJ0cmFuc2Zlcl9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgYnogdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE5CiAgICAvLyBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8IHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjggLy8gInRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICA8CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE4LTIwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDwgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGUKICAgIC8vICksIGVyci5DTE9TRURfVFJBTlNGRVIKICAgIGFzc2VydCAvLyBUcmFuc2ZlciBpcyBjbG9zZWQKCnRyYW5zZmVyX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODAKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIGRpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgOAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIGRpZyA1CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDkKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODMKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQoc2VuZGVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojg0CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGR1cAogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4NQogICAgLy8gYXNzZXJ0IHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MgIT0gcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzLCBlcnIuU0VMRl9UUkFOU0ZFUgogICAgdW5jb3ZlciAyCiAgICAhPQogICAgYXNzZXJ0IC8vIFNlbmRlciBhbmQgcmVjZWl2ZXIgbXVzdCBiZSBkaWZmZXJlbnQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODYKICAgIC8vIGFzc2VydCB1bml0cyA+IFVJbnQ2NCgwKSwgZXJyLk5VTExfVFJBTlNGRVIKICAgIGRpZyAxCiAgICBkdXAKICAgIGFzc2VydCAvLyBUcmFuc2ZlciB1bml0cyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojg3CiAgICAvLyBhc3NlcnQgdW5pdHMgPD0gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLCBlcnIuT1ZFUl9UUkFOU0ZFUgogICAgc3dhcAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIDw9CiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IHNlbmRlciB1bml0cyB0byB0cmFuc2ZlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzU2CiAgICAvLyBpZiBzZWxmLmV2ZW50X2N1cnNvciA+PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICA+PQogICAgYm56IHRyYW5zZmVyX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Fzc2VydF9ub19kdWVfZXZlbnRfcGVuZGluZ0AxMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzU4CiAgICAvLyBuZXh0X2VudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KHNlbGYuZXZlbnRfY3Vyc29yKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc2MAogICAgLy8gbmV4dF9lbnRyeS5zY2hlZHVsZWRfdGltZSA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NTktNzYxCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIG5leHRfZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gKSwgZXJyLlBFTkRJTkdfQUNUVVNfRVZFTlQKICAgIGFzc2VydCAvLyBBQ1RVUyBldmVudCBub3QgeWV0IGV4ZWN1dGVkCgp0cmFuc2Zlcl9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9hc3NlcnRfbm9fZHVlX2V2ZW50X3BlbmRpbmdAMTA6CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjkwCiAgICAvLyBzZWxmLl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBkaWcgMwogICAgZHVwCiAgICBjYWxsc3ViIF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjkxCiAgICAvLyBzZWxmLl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGRpZyAzCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGNhbGxzdWIgX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6OTIKICAgIC8vIHNlbGYuX3NldHRsZV9wb3NpdGlvbihzZW5kZXJfaG9sZGluZ19hZGRyZXNzKQogICAgY2FsbHN1YiBfc2V0dGxlX3Bvc2l0aW9uCiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6OTMKICAgIC8vIHNlbGYuX3NldHRsZV9wb3NpdGlvbihyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBjYWxsc3ViIF9zZXR0bGVfcG9zaXRpb24KICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE1MgogICAgLy8gYXNzZXJ0IHVuaXRzIDw9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLCBlcnIuT1ZFUl9UUkFOU0ZFUgogICAgZGlnIDUKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGRpZyAxCiAgICA8PQogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCBzZW5kZXIgdW5pdHMgdG8gdHJhbnNmZXIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNTMKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzIC09IHVuaXRzCiAgICBkaWcgMQogICAgLQogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBpbnRjXzMgLy8gMzIKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNDQKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzICs9IHVuaXRzCiAgICBkaWcgNQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgdW5jb3ZlciAyCiAgICArCiAgICBpdG9iCiAgICBpbnRjXzMgLy8gMzIKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgZGlnIDIKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF9nb3Zfc3VzcGVuc2lvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfZ292X3N1c3BlbnNpb246CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTY1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo3NwogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYXV0aG9yaXR5LCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjEgLy8gMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTg1CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGR1cAogICAgcHVzaGludCA0OAogICAgaW50Y18xIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIHB1c2hpbnQgNDgKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTg2CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfb3Blbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfb3BlbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2OAogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjMgLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQ0ZDYxNmU2MTY3NjU3MjIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzkKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0VOREVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDIwMAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTAKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX2VuZGVkKCksIGVyci5VTkFVVEhPUklaRUQKICAgICEKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxMQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTIKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjEzCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzQKICAgIC8vIHVuaXRzPVVJbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzItNDIKICAgIC8vIHJldHVybiB0eXAuQWNjb3VudFBvc2l0aW9uKAogICAgLy8gICAgIHBheW1lbnRfYWRkcmVzcz1wYXltZW50X2FkZHJlc3MsCiAgICAvLyAgICAgdW5pdHM9VUludDY0KDApLAogICAgLy8gICAgIHJlc2VydmVkX3VuaXRzPVVJbnQ2NCgwKSwKICAgIC8vICAgICBzdXNwZW5kZWQ9RmFsc2UsCiAgICAvLyAgICAgc2V0dGxlZF9jdXJzb3I9VUludDY0KDApLAogICAgLy8gICAgIGludGVyZXN0X2NoZWNrcG9pbnQ9VUludDY0KDApLAogICAgLy8gICAgIHByaW5jaXBhbF9jaGVja3BvaW50PVVJbnQ2NCgwKSwKICAgIC8vICAgICBjbGFpbWFibGVfaW50ZXJlc3Q9VUludDY0KDApLAogICAgLy8gICAgIGNsYWltYWJsZV9wcmluY2lwYWw9VUludDY0KDApLAogICAgLy8gKQogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBieXRlYyA0MCAvLyAweDAwCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxNAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSBzZWxmLl9uZXdfYWNjb3VudF9wb3NpdGlvbihwYXltZW50X2FkZHJlc3MpCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjE1CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzczoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMzgKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcywgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgdW5jb3ZlciAzCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjM5CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0MAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDEKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcyA9IHBheW1lbnRfYWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDIKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF9nZXRfcG9zaXRpb25bcm91dGluZ10oKSAtPiB2b2lkOgphY2NvdW50X2dldF9wb3NpdGlvbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNTkKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9jcmVhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9jcmVhdGU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5ODAKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSBhcnJhbmdlcgogICAgYnl0ZWMgMTggLy8gMHg1MjIzNDE3MjcyNjE2ZTY3NjU3MjIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTgxCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfY29uZmlnW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfY29uZmlnOgogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGxlbgogICAgcHVzaGludCAxMDcKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuTm9ybWFsaXplZEFjdHVzVGVybXMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDcyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLkluaXRpYWxLZXJuZWxTdGF0ZQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIGxlbgogICAgZGlnIDEKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgdHVwbGUgZW5jb2RpbmcKICAgIGR1cAogICAgcHVzaGludCAzNAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHRhaWwgcG9pbnRlciBhdCBpbmRleCAxIG9mICh1aW50OFszMl0sKGxlbit1dGY4W10pKQogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBjb3ZlciAzCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAzNgogICAgKwogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5Qcm9zcGVjdHVzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDEyCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMTQtMTAxNQogICAgLy8gIyBDb25maWd1cmUgQ29udHJhY3QKICAgIC8vIHNlbGYuY29udHJhY3RfdHlwZSA9IHRlcm1zLmNvbnRyYWN0X3R5cGUuYXNfdWludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ5dGVjIDEyIC8vICJjb250cmFjdF90eXBlIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICBieiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIwCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfQU5OKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjEKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgcHVzaGludCAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjIKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjMKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgcHVzaGludCA0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjQKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYnogY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAOAoKY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUA3OgogICAgaW50Y18xIC8vIDEKCmNvbnRyYWN0X2NvbmZpZ19ib29sX21lcmdlQDk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjkKICAgIC8vIGFzc2VydCBzZWxmLl9pc19zdXBwb3J0ZWRfY29udHJhY3RfdHlwZShjb250cmFjdF90eXBlKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDE3CiAgICAvLyBzZWxmLl9zdG9yZV9jb250cmFjdF9jb25maWcoc2VsZi5jb250cmFjdF90eXBlLCB0ZXJtcywgaW5pdGlhbF9zdGF0ZSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBidXJ5IDIKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMjUKICAgIC8vIGFzc2VydCB0ZXJtcy5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBkaWcgNAogICAgZHVwCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDgKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMyNwogICAgLy8gdGVybXMuZGF5X2NvdW50X2NvbnZlbnRpb24uYXNfdWludDY0KCkKICAgIHB1c2hpbnQgNTcKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyOTctMzAzCiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgIGJ6IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGRpZyA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyOTkKICAgIC8vIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGRpZyA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDAKICAgIC8vIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICBwdXNoaW50IDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI5Ny0zMDMKICAgIC8vIHJldHVybiBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzYwKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwSVNEQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjApLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDE2CiAgICBkaWcgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzAxCiAgICAvLyBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyOTctMzAzCiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgID09CiAgICBibnogY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUAxNgogICAgZGlnIDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMwMgogICAgLy8gVUludDY0KGVudW1zLkRDQ18zMEUzNjApLAogICAgcHVzaGludCA0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyOTctMzAzCiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgID09CiAgICBieiBjb250cmFjdF9jb25maWdfYm9vbF9mYWxzZUAxNwoKY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUAxNjoKICAgIGludGNfMSAvLyAxCgpjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUAxODoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMwOS0zMTEKICAgIC8vIGFzc2VydCBzZWxmLl9pc19zdXBwb3J0ZWRfZGF5X2NvdW50X2NvbnZlbnRpb24oCiAgICAvLyAgICAgZGF5X2NvdW50X2NvbnZlbnRpb24KICAgIC8vICksIGVyci5JTlZBTElEX0RBWV9DT1VOVF9DT05WRU5USU9OCiAgICBhc3NlcnQgLy8gSW52YWxpZCBkYXktY291bnQgY29udmVudGlvbiBJRAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzI5CiAgICAvLyBpZiBjb250cmFjdF90eXBlICE9IFVJbnQ2NChlbnVtcy5DVF9BTk4pOgogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgIT0KICAgIGJ6IGNvbnRyYWN0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDIwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzAKICAgIC8vIGFzc2VydCBub3QgdGVybXMuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBkaWcgNAogICAgcHVzaGludCA3ODYKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgoKY29udHJhY3RfY29uZmlnX2FmdGVyX2lmX2Vsc2VAMjA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MDAKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MDEKICAgIC8vIGFzc2VydCBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID09IFVJbnQ2NCgwKSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBELUFTQSBhbHJlYWR5IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgwMy04MDQKICAgIC8vICMgU2V0IERlbm9taW5hdGlvbiBBc3NldAogICAgLy8gc2VsZi5fYXNzZXJ0X2Rlbm9taW5hdGlvbl9hc3NldCh0ZXJtcy5kZW5vbWluYXRpb25fYXNzZXRfaWQpCiAgICBkaWcgNAogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc2OC03NjkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gZGVub21pbmF0aW9uIHdpdGggQVNBCiAgICAvLyBfY3JlYXRvciwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfY3JlYXRvcihkZW5vbWluYXRpb25fYXNzZXRfaWQpCiAgICBkdXAKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc3MAogICAgLy8gYXNzZXJ0IGV4aXN0cywgZXJyLklOVkFMSURfREVOT01JTkFUSU9OCiAgICBhc3NlcnQgLy8gRGVub21pbmF0aW9uIGFzc2V0IGlzIG5vdCBwcm9wZXJseSBzZXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc3MwogICAgLy8gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgPSBkZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIGJ5dGVjIDQ0IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgwNy04MDgKICAgIC8vICMgU2V0IFNldHRsZW1lbnQgQXNzZXQKICAgIC8vIHNlbGYuX2Fzc2VydF9zZXR0bGVtZW50X2Fzc2V0KHRlcm1zLnNldHRsZW1lbnRfYXNzZXRfaWQpCiAgICBkaWcgMQogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Nzc4CiAgICAvLyBzZXR0bGVtZW50X2Fzc2V0X2lkID09IHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc3Ni03NzkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzZXR0bGVtZW50IGFzc2V0IGlzIHRoZSBkZW5vbWluYXRpb24gYXNzZXQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgLy8gKSwgZXJyLklOVkFMSURfU0VUVExFTUVOVF9BU1NFVAogICAgYXNzZXJ0IC8vIERpZmZlcmVudCBzZXR0bGVtZW50IGFzc2V0IG5vdCBzdXBwb3J0ZWQsIG11c3QgYmUgZXF1YWwgdG8gZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODIKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCA9IHNldHRsZW1lbnRfYXNzZXRfaWQKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODMtNzg5CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODgKICAgIC8vIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODYKICAgIC8vIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Nzg3CiAgICAvLyBhc3NldF9hbW91bnQ9MCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODMtNzg0CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc4My03ODkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gc2V0dGxlbWVudCB3aXRoIEFTQQogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PTAsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTEtODEyCiAgICAvLyAjIFVuaXRzCiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzID0gdGVybXMudG90YWxfdW5pdHMKICAgIGR1cAogICAgcHVzaGludCAxNwogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTMKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDEwIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODE1LTgxNgogICAgLy8gIyBEYXktQ291bnQgQ29udmVudGlvbnMKICAgIC8vIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPSB0ZXJtcy5kYXlfY291bnRfY29udmVudGlvbi5hc191aW50NjQoKQogICAgYnl0ZWMgNDYgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgZGlnIDgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTgtODE5CiAgICAvLyAjIFRpbWUKICAgIC8vIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlID0gdGVybXMuaW5pdGlhbF9leGNoYW5nZV9kYXRlCiAgICBkdXAKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAyNiAvLyAiaW5pdGlhbF9leGNoYW5nZV9kYXRlIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MjAKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IHRlcm1zLm1hdHVyaXR5X2RhdGUKICAgIGRpZyAxCiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNDUgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgyMQogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gaW5pdGlhbF9zdGF0ZS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBkaWcgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBwdXNoaW50IDQ4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODIzLTgyNAogICAgLy8gIyBQcmluY2lwYWwKICAgIC8vIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPSB0ZXJtcy5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudAogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgZGlnIDEwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODI1CiAgICAvLyBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSB0ZXJtcy5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBkaWcgMwogICAgcHVzaGludCA3ODYKICAgIGdldGJpdAogICAgYnl0ZWMgMzQgLy8gImR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODI2CiAgICAvLyBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9IGluaXRpYWxfc3RhdGUub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBkaWcgMQogICAgcHVzaGludCAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjXzMgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MjgtODI5CiAgICAvLyAjIEludGVyZXN0CiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgPSBpbml0aWFsX3N0YXRlLmFjY3J1ZWRfaW50ZXJlc3QKICAgIGRpZyAxCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MzEtODMyCiAgICAvLyAjIEludGVyZXN0IFJhdGUKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gaW5pdGlhbF9zdGF0ZS5ub21pbmFsX2ludGVyZXN0X3JhdGUKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODMzCiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBpbml0aWFsX3N0YXRlLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UKICAgIGRpZyAxCiAgICBwdXNoaW50IDI0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MzQKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQgPSB0ZXJtcy5yYXRlX3Jlc2V0X3NwcmVhZAogICAgZGlnIDMKICAgIHB1c2hpbnQgNTgKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzNSAvLyAicmF0ZV9yZXNldF9zcHJlYWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODM1CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciA9IHRlcm1zLnJhdGVfcmVzZXRfbXVsdGlwbGllcgogICAgZGlnIDMKICAgIHB1c2hpbnQgNjYKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzNiAvLyAicmF0ZV9yZXNldF9tdWx0aXBsaWVyIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzNgogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X2Zsb29yID0gdGVybXMucmF0ZV9yZXNldF9mbG9vcgogICAgZGlnIDMKICAgIHB1c2hpbnQgNzQKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAyOSAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MzcKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9jYXAgPSB0ZXJtcy5yYXRlX3Jlc2V0X2NhcAogICAgZGlnIDMKICAgIHB1c2hpbnQgODIKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzMCAvLyAicmF0ZV9yZXNldF9jYXAiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODM4CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfbmV4dCA9IHRlcm1zLnJhdGVfcmVzZXRfbmV4dAogICAgZGlnIDMKICAgIHB1c2hpbnQgOTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzNyAvLyAicmF0ZV9yZXNldF9uZXh0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzOQogICAgLy8gc2VsZi5oYXNfcmF0ZV9yZXNldF9mbG9vciA9IHRlcm1zLmhhc19yYXRlX3Jlc2V0X2Zsb29yCiAgICBkaWcgMwogICAgcHVzaGludCA3ODQKICAgIGdldGJpdAogICAgYnl0ZWMgMzggLy8gImhhc19yYXRlX3Jlc2V0X2Zsb29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0MAogICAgLy8gc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgPSB0ZXJtcy5oYXNfcmF0ZV9yZXNldF9jYXAKICAgIGRpZyAzCiAgICBwdXNoaW50IDc4NQogICAgZ2V0Yml0CiAgICBieXRlYyAzOSAvLyAiaGFzX3JhdGVfcmVzZXRfY2FwIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0Mi04NDMKICAgIC8vICMgU2NhbGluZwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSA9IHRlcm1zLmZpeGVkX3BvaW50X3NjYWxlCiAgICB1bmNvdmVyIDMKICAgIHB1c2hpbnQgOTkKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDUtODQ2CiAgICAvLyAjIFNjaGVkdWxlIFByb2Nlc3NpbmcKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yID0gaW5pdGlhbF9zdGF0ZS5ldmVudF9jdXJzb3IKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDgtODQ5CiAgICAvLyAjIFBlci1Vbml0IEZpeGVkLVBvaW50IEluZGV4ZXMKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCA9IGluaXRpYWxfc3RhdGUuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleAogICAgZGlnIDEKICAgIHB1c2hpbnQgNTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NTAKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggPSBpbml0aWFsX3N0YXRlLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4CiAgICBkaWcgMQogICAgcHVzaGludCA2NAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NTItODUzCiAgICAvLyAjIFJlc2VydmVkIEFtb3VudCAoZm9yIGV4ZWN1dGVkIGNhc2hmbG93cykKICAgIC8vIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU0CiAgICAvLyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU2CiAgICAvLyBhc3NlcnQgdGVybXMuaW5pdGlhbF9leGNoYW5nZV9kYXRlID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsIGVyci5JTlZBTElEX0lFRAogICAgZGlnIDIKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgID4KICAgIGFzc2VydCAvLyBJRUQgbXVzdCBiZSBzZXQgaW4gdGhlIGZ1dHVyZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU3CiAgICAvLyBhc3NlcnQgdGVybXMuaW5pdGlhbF9leGNoYW5nZV9kYXRlID4gaW5pdGlhbF9zdGF0ZS5zdGF0dXNfZGF0ZSwgZXJyLklOVkFMSURfSUVECiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICA8CiAgICBhc3NlcnQgLy8gSUVEIG11c3QgYmUgc2V0IGluIHRoZSBmdXR1cmUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg1OAogICAgLy8gYXNzZXJ0IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA8IHRlcm1zLm1hdHVyaXR5X2RhdGUsIGVyci5JTlZBTElEX0lFRAogICAgPAogICAgYXNzZXJ0IC8vIElFRCBtdXN0IGJlIHNldCBpbiB0aGUgZnV0dXJlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDE5LTEwMjAKICAgIC8vICMgTm90YXJpemUgcHJvc3BlY3R1cyAob3B0aW9uYWwpCiAgICAvLyBzZWxmLnByb3NwZWN0dXNfaGFzaCA9IHByb3NwZWN0dXMuaGFzaC5ieXRlcwogICAgZGlnIDIKICAgIGV4dHJhY3QgMCAzMgogICAgYnl0ZWMgNDIgLy8gInByb3NwZWN0dXNfaGFzaCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDIxCiAgICAvLyBzZWxmLnByb3NwZWN0dXNfdXJsID0gcHJvc3BlY3R1cy51cmwKICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgYnl0ZWMgNDMgLy8gInByb3NwZWN0dXNfdXJsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMjIKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNvbnRyYWN0X2NvbmZpZ19ib29sX2ZhbHNlQDE3OgogICAgaW50Y18wIC8vIDAKICAgIGIgY29udHJhY3RfY29uZmlnX2Jvb2xfbWVyZ2VAMTgKCmNvbnRyYWN0X2NvbmZpZ19ib29sX2ZhbHNlQDg6CiAgICBpbnRjXzAgLy8gMAogICAgYiBjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUA5CgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3Rfc2NoZWR1bGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9zY2hlZHVsZToKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAyNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBzd2FwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgMwogICAgZHVwCiAgICBwdXNoaW50IDY1CiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIHVuY292ZXIgMgogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8c21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5FeGVjdXRpb25TY2hlZHVsZUVudHJ5PgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAzOQogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDQyCiAgICAvLyBjb250cmFjdF90eXBlPXNlbGYuY29udHJhY3RfdHlwZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBjb3ZlciAzCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODc0CiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIEQtQVNBIGFscmVhZHkgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODc1LTg3NwogICAgLy8gYXNzZXJ0IHNjaGVkdWxlX3BhZ2UubGVuZ3RoIDw9IFVJbnQ2NCgKICAgIC8vICAgICBjc3QuU0NIRURVTEVfUEFHRV9TSVpFCiAgICAvLyApLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBkdXAKICAgIHB1c2hpbnQgMTYKICAgIDw9CiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NzgKICAgIC8vIGFzc2VydCBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID4gVUludDY0KDApLCBlcnIuVEVSTVNfTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMCAvLyAiaW5pdGlhbF9leGNoYW5nZV9hbW91bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0EgdGVybXMgbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg4MAogICAgLy8gcGFnZV9jdXJzb3IgPSBzY2hlZHVsZV9wYWdlX2luZGV4ICogVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpCiAgICBzd2FwCiAgICBwdXNoaW50IDE2CiAgICAqCiAgICBzd2FwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4ODcKICAgIC8vICsgcGFnZV9sZW5ndGggKiBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19QRVJfRU5UUllfQlVER0VUKQogICAgcHVzaGludCAxMDAKICAgICoKICAgIHB1c2hpbnQgMTUxMAogICAgKwoKY29udHJhY3Rfc2NoZWR1bGVfd2hpbGVfdG9wQDI6CiAgICBkdXAKICAgIGdsb2JhbCBPcGNvZGVCdWRnZXQKICAgID4KICAgIGJ6IGNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX3doaWxlQDUKICAgIGl0eG5fYmVnaW4KICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBwdXNoaW50IDUgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICBieXRlYyA0NyAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW0KICAgIGJ5dGVjIDQ3IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBiIGNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEAyCgpjb250cmFjdF9zY2hlZHVsZV9hZnRlcl93aGlsZUA1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODkwCiAgICAvLyBpbmRleCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTAKCmNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODkxCiAgICAvLyB3aGlsZSBpbmRleCA8IHBhZ2VfbGVuZ3RoOgogICAgZGlnIDkKICAgIGRpZyA0CiAgICA8CiAgICBieiBjb250cmFjdF9zY2hlZHVsZV9hZnRlcl93aGlsZUAxNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODkyLTg5MwogICAgLy8gZW50cnkgPSBzY2hlZHVsZV9wYWdlW2luZGV4XS5jb3B5KCkKICAgIC8vIGVudHJ5X2V2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBkaWcgNAogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgYnVyeSAxMwogICAgZGlnIDEwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgNjUKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODkzCiAgICAvLyBlbnRyeV9ldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTItODkzCiAgICAvLyBlbnRyeSA9IHNjaGVkdWxlX3BhZ2VbaW5kZXhdLmNvcHkoKQogICAgLy8gZW50cnlfZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGludGNfMiAvLyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTMKICAgIC8vIGVudHJ5X2V2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBnZXRieXRlCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgMTQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg5NAogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X2lkID09IHBhZ2VfY3Vyc29yICsgaW5kZXgsIGVyci5JTlZBTElEX0VWRU5UX0lECiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEzCiAgICBkaWcgNQogICAgdW5jb3ZlciA0CiAgICArCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTUtODk3CiAgICAvLyBzZWxmLl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBlbnRyeV9ldmVudF90eXBlCiAgICAvLyApCiAgICBkaWcgNQogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODk4CiAgICAvLyBhc3NlcnQgZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgc3dhcAogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTkKICAgIC8vIGlmIGVudHJ5LmV2ZW50X2lkID4gVUludDY0KDApOgogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTAwCiAgICAvLyBpZiBpbmRleCA+IFVJbnQ2NCgwKToKICAgIGRpZyA5CiAgICBieiBjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlAMTAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkwMQogICAgLy8gcHJldmlvdXNfZW50cnkgPSBzY2hlZHVsZV9wYWdlW2luZGV4IC0gVUludDY0KDEpXS5jb3B5KCkKICAgIGRpZyA5CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgcHVzaGludCA2NQogICAgKgogICAgZGlnIDEyCiAgICBzd2FwCiAgICBwdXNoaW50IDY1CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTYKICAgIC8vIHByZXZpb3VzX2VudHJ5LnNjaGVkdWxlZF90aW1lIDw9IGVudHJ5LnNjaGVkdWxlZF90aW1lCiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgOAogICAgPD0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkxNS05MTcKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgcHJldmlvdXNfZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gZW50cnkuc2NoZWR1bGVkX3RpbWUKICAgIC8vICksIGVyci5JTlZBTElEX1NPUlRJTkcKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBtdXN0IGJlIHNvcnRlZCBpbiBzdHJpY3RseSBhc2NlbmRpbmcgb3JkZXIKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTgKICAgIC8vIGlmIGVudHJ5LmV2ZW50X2lkID09IFVJbnQ2NCgwKToKICAgIGRpZyA4CiAgICBibnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTE5LTkyMQogICAgLy8gYXNzZXJ0IGVudHJ5X2V2ZW50X3R5cGUgPT0gVUludDY0KAogICAgLy8gICAgIGVudW1zLkVWVF9JRUQKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZGlnIDEwCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjIKICAgIC8vIGluZGV4ICs9IFVJbnQ2NCgxKQogICAgZGlnIDkKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEwCiAgICBiIGNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEA2Cgpjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlAMTA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDMtOTA1CiAgICAvLyAjIFRoZSBmaXJzdCBlbnRyeSBvZiBhIHBhZ2UgbXVzdCBzdGlsbCBiZSBvcmRlcmVkIGFmdGVyIHRoZQogICAgLy8gIyBsYXN0IGVudHJ5IG9mIHRoZSBwcmV2aW91cyBwYWdlLgogICAgLy8gYXNzZXJ0IHNjaGVkdWxlX3BhZ2VfaW5kZXggPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0VWRU5UX0lECiAgICBkaWcgNgogICAgZHVwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBpZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTA2CiAgICAvLyBwcmV2aW91c19wYWdlX2luZGV4ID0gc2NoZWR1bGVfcGFnZV9pbmRleCAtIFVJbnQ2NCgxKQogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkwOAogICAgLy8gcHJldmlvdXNfcGFnZV9pbmRleCBpbiBzZWxmLnNjaGVkdWxlX3BhZ2UKICAgIGl0b2IKICAgIGJ5dGVjIDMxIC8vIDB4NTMyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTA3LTkwOQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBwcmV2aW91c19wYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZQogICAgLy8gKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTEwLTkxMQogICAgLy8gcHJldmlvdXNfcGFnZSA9IHNlbGYuc2NoZWR1bGVfcGFnZVtwcmV2aW91c19wYWdlX2luZGV4XS5jb3B5KCkKICAgIC8vIGFzc2VydCBwcmV2aW91c19wYWdlLmxlbmd0aCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGludCAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTExCiAgICAvLyBhc3NlcnQgcHJldmlvdXNfcGFnZS5sZW5ndGggPiBVSW50NjQoMCksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGR1cAogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTEzCiAgICAvLyBwcmV2aW91c19wYWdlLmxlbmd0aCAtIFVJbnQ2NCgxKQogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkxMi05MTQKICAgIC8vIHByZXZpb3VzX2VudHJ5ID0gcHJldmlvdXNfcGFnZVsKICAgIC8vICAgICBwcmV2aW91c19wYWdlLmxlbmd0aCAtIFVJbnQ2NCgxKQogICAgLy8gXS5jb3B5KCkKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgMgogICAgKwogICAgcHVzaGludCA2NQogICAgYm94X2V4dHJhY3QKICAgIGIgY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxMQoKY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfd2hpbGVAMTU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMDAKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHNjaGVkdWxlX3BhZ2UuY29weSgpCiAgICBkaWcgNgogICAgaXRvYgogICAgYnl0ZWMgMzEgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBkaWcgNQogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTI1CiAgICAvLyBpZiBpc19sYXN0X3BhZ2U6CiAgICBkaWcgNQogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxNwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTI3CiAgICAvLyBzY2hlZHVsZV9wYWdlX2luZGV4ICogVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpICsgcGFnZV9sZW5ndGgKICAgIGRpZyAxCiAgICBkaWcgNAogICAgKwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTI2CiAgICAvLyBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50ID0gKAogICAgYnl0ZWMgNCAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjYtOTI4CiAgICAvLyBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50ID0gKAogICAgLy8gICAgIHNjaGVkdWxlX3BhZ2VfaW5kZXggKiBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkgKyBwYWdlX2xlbmd0aAogICAgLy8gKQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkyOQogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgcHVzaGludCA1MAogICAgYXBwX2dsb2JhbF9wdXQKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDQ3CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmV4ZWN1dGVfaWVkW3JvdXRpbmddKCkgLT4gdm9pZDoKZXhlY3V0ZV9pZWQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA1NwogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDU4CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA1OQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNjEKICAgIC8vIGFzc2VydCBzZWxmLmV2ZW50X2N1cnNvciA8IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICBkaWcgMQogICAgPgogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgY3Vyc29yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDYyCiAgICAvLyBlbnRyeSA9IHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLmV2ZW50X2N1cnNvcikKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2MwogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X3R5cGUgPT0gYXJjNC5VSW50OChlbnVtcy5FVlRfSUVEKSwgZXJyLklOVkFMSURfRVZFTlRfVFlQRQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgZHVwCiAgICBwdXNoYnl0ZXMgMHgwMQogICAgYj09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCB0eXBlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDY3CiAgICAvLyBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIGRpZyAxCiAgICBleHRyYWN0IDAgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2OQogICAgLy8gc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICBkaWcgMgogICAgZXh0cmFjdCA5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNzAKICAgIC8vIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgZGlnIDMKICAgIGV4dHJhY3QgMTcgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3MQogICAgLy8gcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZGlnIDQKICAgIGV4dHJhY3QgMjUgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3MwogICAgLy8gbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9ZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBkaWcgNQogICAgZXh0cmFjdCAzMyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc0CiAgICAvLyBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICBkaWcgNgogICAgZXh0cmFjdCA0MSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc1CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1lbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIGRpZyA3CiAgICBleHRyYWN0IDQ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNzYKICAgIC8vIGZsYWdzPWVudHJ5LmZsYWdzLAogICAgZGlnIDgKICAgIGV4dHJhY3QgNTcgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2Ni0xMDc3CiAgICAvLyB0eXAuT2JzZXJ2ZWRFdmVudFJlcXVlc3QoCiAgICAvLyAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBvYnNlcnZlZF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1lbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9ZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9ZW50cnkuZmxhZ3MsCiAgICAvLyApLAogICAgdW5jb3ZlciA3CiAgICB1bmNvdmVyIDgKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3MgogICAgLy8gb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2Ni0xMDc3CiAgICAvLyB0eXAuT2JzZXJ2ZWRFdmVudFJlcXVlc3QoCiAgICAvLyAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBvYnNlcnZlZF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1lbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9ZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9ZW50cnkuZmxhZ3MsCiAgICAvLyApLAogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNjQtMTA3OAogICAgLy8gc2VsZi5fYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkoCiAgICAvLyAgICAgZW50cnksCiAgICAvLyAgICAgdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0KAogICAgLy8gICAgICAgICBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIC8vICAgICAgICAgZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgLy8gICAgICAgICBzY2hlZHVsZWRfdGltZT1lbnRyeS5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICAgICAgYWNjcnVhbF9mYWN0b3I9ZW50cnkuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICAgICAgb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPWVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPWVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgICAgICBmbGFncz1lbnRyeS5mbGFncywKICAgIC8vICAgICApLAogICAgLy8gKQogICAgY2FsbHN1YiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkKICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3OQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDQ5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5hcHBseV9ub25fY2FzaF9ldmVudFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFwcGx5X25vbl9jYXNoX2V2ZW50OgogICAgaW50Y18wIC8vIDAKICAgIGR1cG4gNAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwODEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwbiAyCiAgICBsZW4KICAgIHB1c2hpbnQgNzMKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuT2JzZXJ2ZWRFdmVudFJlcXVlc3QKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDk1CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA5NgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwOTgKICAgIC8vIGlmIHBheWxvYWQuZmxhZ3MgJiBVSW50NjQoZW51bXMuRkxBR19PQlNFUlZFRF9FVkVOVCk6CiAgICBwdXNoaW50IDY1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBwdXNoaW50IDQKICAgICYKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjMzCiAgICAvLyByZXR1cm4gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9DTE0pCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIHB1c2hpbnQgNQogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwOTkKICAgIC8vIGFzc2VydCBzZWxmLl9zdXBwb3J0c19vYnNlcnZlZF9ldmVudHMoKSwgZXJyLk9CU0VSVkVEX0VWRU5UX1JFUVVJUkVECiAgICBhc3NlcnQgLy8gT2JzZXJ2ZWQgZXZlbnQgcmVxdWlyZWQgdG8gZXhlY3V0ZSB0aGlzIGFjdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEwMAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMzMKICAgIC8vIHJldHVybiBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0NMTSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgZHVwCiAgICBwdXNoaW50IDUKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MzgKICAgIC8vIGFzc2VydCBzZWxmLl9zdXBwb3J0c19vYnNlcnZlZF9ldmVudHMoKSwgZXJyLk9CU0VSVkVEX0VWRU5UX1JFUVVJUkVECiAgICBhc3NlcnQgLy8gT2JzZXJ2ZWQgZXZlbnQgcmVxdWlyZWQgdG8gZXhlY3V0ZSB0aGlzIGFjdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTM5CiAgICAvLyBhc3NlcnQgcGF5bG9hZC5ldmVudF9pZCA9PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LCBlcnIuSU5WQUxJRF9FVkVOVF9JRAogICAgZGlnIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgNwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NDEKICAgIC8vIHNlbGYuY29udHJhY3RfdHlwZSwgcGF5bG9hZC5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBkdXAKICAgIGV4dHJhY3QgOCAxCiAgICBidXJ5IDEyCiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQwLTk0MgogICAgLy8gc2VsZi5fYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgc2VsZi5jb250cmFjdF90eXBlLCBwYXlsb2FkLmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIC8vICkKICAgIGNhbGxzdWIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NDQKICAgIC8vIHBhZ2VfaW5kZXggPSBzZWxmLl9zY2hlZHVsZV9wYWdlX2luZGV4KHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxOTAKICAgIC8vIHJldHVybiBldmVudF9pZCAvLyBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkKICAgIHB1c2hpbnQgMTYKICAgIC8KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk0NQogICAgLy8gcGFnZSA9IHR5cC5FeGVjdXRpb25TY2hlZHVsZVBhZ2UoKQogICAgcHVzaGJ5dGVzIDB4MDAwMAogICAgYnVyeSA3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NDYKICAgIC8vIGlmIHBhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlOgogICAgaXRvYgogICAgYnl0ZWMgMzEgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA5CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMjcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk0NwogICAgLy8gcGFnZSA9IHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XS5jb3B5KCkKICAgIGRpZyA3CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidXJ5IDcKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX3BhZ2UgZW50cnkgZXhpc3RzCgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDI3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQ4CiAgICAvLyBhc3NlcnQgcGFnZS5sZW5ndGggPCBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGRpZyA1CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgMTYKICAgIDwKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1MwogICAgLy8gc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIGRpZyAzCiAgICBkdXAKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTQKICAgIC8vIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICBkaWcgMQogICAgZXh0cmFjdCAxNyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTUKICAgIC8vIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZGlnIDIKICAgIGV4dHJhY3QgMjUgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTU2CiAgICAvLyBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDMKICAgIGV4dHJhY3QgNDEgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTU3CiAgICAvLyBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIGRpZyA0CiAgICBleHRyYWN0IDQ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1OAogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIHVuY292ZXIgNQogICAgZXh0cmFjdCA1NyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTAtOTYwCiAgICAvLyB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1wYXlsb2FkLmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9cGF5bG9hZC5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPXBheWxvYWQucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXBheWxvYWQubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICkKICAgIGRpZyAxMQogICAgaXRvYgogICAgZGlnIDE4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMwogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NDktOTYxCiAgICAvLyBwYWdlLmFwcGVuZCgKICAgIC8vICAgICB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9cGF5bG9hZC5ldmVudF9pZCwKICAgIC8vICAgICAgICAgZXZlbnRfdHlwZT1wYXlsb2FkLmV2ZW50X3R5cGUsCiAgICAvLyAgICAgICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIC8vICAgICAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICAgICApCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjIKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHBhZ2UuY29weSgpCiAgICBkaWcgOAogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2MwogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTAzCiAgICAvLyBhc3NlcnQgZXZlbnRfaWQgPT0gc2VsZi5ldmVudF9jdXJzb3IsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBjdXJzb3IKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMDQKICAgIC8vIGVudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KGV2ZW50X2lkKQogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEwNgogICAgLy8gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgYnVyeSAxMAogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjQKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY1CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzYzLTM3MAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9SUiksCiAgICBwdXNoaW50IDEyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY3CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICBwdXNoaW50IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY4CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgcHVzaGludCAxOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzYzLTM3MAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBieiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX2ZhbHNlQDE2CgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX3RydWVAMTU6CiAgICBpbnRjXzEgLy8gMQoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9tZXJnZUAxNzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMDUtMTEwNwogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2lzX25vbl9jYXNoKAogICAgLy8gICAgIGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIC8vICksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IHR5cGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMDgKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlICE9IGFyYzQuVUludDgoZW51bXMuRVZUX0lFRCksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGRpZyA4CiAgICBwdXNoYnl0ZXMgMHgwMQogICAgYiE9CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCB0eXBlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNzQKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluIChVSW50NjQoZW51bXMuRVZUX1JSKSwgVUludDY0KGVudW1zLkVWVF9SUkYpKQogICAgZGlnIDQKICAgIHB1c2hpbnQgMTIKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDIxCiAgICBkaWcgNAogICAgcHVzaGludCAxMQogICAgPT0KICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfZmFsc2VAMjIKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAyMToKICAgIGludGNfMSAvLyAxCgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX21lcmdlQDIzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEwOQogICAgLy8gaWYgc2VsZi5fZXZlbnRfaXNfcmF0ZV9yZXNldChlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpKToKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Vsc2VfYm9keUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODAKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLm9ic2VydmVyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjQgLy8gMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTEzCiAgICAvLyBzZWxmLl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeShlbnRyeSwgcGF5bG9hZCkKICAgIGRpZyA2CiAgICBkaWcgMgogICAgY2FsbHN1YiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkKICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTExNAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDgxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Vsc2VfYm9keUA1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTExMgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICBiIGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VANgoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9mYWxzZUAyMjoKICAgIGludGNfMCAvLyAwCiAgICBiIGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfbWVyZ2VAMjMKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfZmFsc2VAMTY6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX21lcmdlQDE3CgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuZ2V0X2NvbnRyYWN0X3N0YXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2NvbnRyYWN0X3N0YXRlOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBkdXAKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEyMQogICAgLy8gY29udHJhY3RfdHlwZT1hcmM0LlVJbnQ4KHNlbGYuY29udHJhY3RfdHlwZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzIgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMjMKICAgIC8vIHRvdGFsX3VuaXRzPXNlbGYudG90YWxfdW5pdHMsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEyNAogICAgLy8gcmVzZXJ2ZWRfdW5pdHNfdG90YWw9c2VsZi5yZXNlcnZlZF91bml0c190b3RhbCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTI1CiAgICAvLyBpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudD1zZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMjYKICAgIC8vIGV2ZW50X2N1cnNvcj1zZWxmLmV2ZW50X2N1cnNvciwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEyNwogICAgLy8gc2NoZWR1bGVfZW50cnlfY291bnQ9c2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMjgKICAgIC8vIG91dHN0YW5kaW5nX3ByaW5jaXBhbD1zZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEyOQogICAgLy8gaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZT1zZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEzMAogICAgLy8gbm9taW5hbF9pbnRlcmVzdF9yYXRlPXNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTMxCiAgICAvLyBhY2NydWVkX2ludGVyZXN0PXNlbGYuYWNjcnVlZF9pbnRlcmVzdCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTMyCiAgICAvLyBjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4PXNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEzMwogICAgLy8gY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXg9c2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTM0CiAgICAvLyByZXNlcnZlZF9pbnRlcmVzdD1zZWxmLnJlc2VydmVkX2ludGVyZXN0LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMzUKICAgIC8vIHJlc2VydmVkX3ByaW5jaXBhbD1zZWxmLnJlc2VydmVkX3ByaW5jaXBhbCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMjAtMTEzNgogICAgLy8gcmV0dXJuIHR5cC5LZXJuZWxTdGF0ZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlPWFyYzQuVUludDgoc2VsZi5jb250cmFjdF90eXBlKSwKICAgIC8vICAgICBzdGF0dXM9c2VsZi5zdGF0dXMsCiAgICAvLyAgICAgdG90YWxfdW5pdHM9c2VsZi50b3RhbF91bml0cywKICAgIC8vICAgICByZXNlcnZlZF91bml0c190b3RhbD1zZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsLAogICAgLy8gICAgIGluaXRpYWxfZXhjaGFuZ2VfYW1vdW50PXNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQsCiAgICAvLyAgICAgZXZlbnRfY3Vyc29yPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgLy8gICAgIHNjaGVkdWxlX2VudHJ5X2NvdW50PXNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQsCiAgICAvLyAgICAgb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2U9c2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlLAogICAgLy8gICAgIG5vbWluYWxfaW50ZXJlc3RfcmF0ZT1zZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBhY2NydWVkX2ludGVyZXN0PXNlbGYuYWNjcnVlZF9pbnRlcmVzdCwKICAgIC8vICAgICBjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4PXNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCwKICAgIC8vICAgICBjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleD1zZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4LAogICAgLy8gICAgIHJlc2VydmVkX2ludGVyZXN0PXNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QsCiAgICAvLyAgICAgcmVzZXJ2ZWRfcHJpbmNpcGFsPXNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsLAogICAgLy8gKQogICAgdW5jb3ZlciAxNAogICAgaXRvYgogICAgdW5jb3ZlciAxNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDEzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDEwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgOQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDgKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTE2CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5nZXRfbmV4dF9kdWVfZXZlbnRbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfbmV4dF9kdWVfZXZlbnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE0MgogICAgLy8gaWYgc2VsZi5ldmVudF9jdXJzb3IgPj0gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgPj0KICAgIGJ6IGdldF9uZXh0X2R1ZV9ldmVudF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDQKICAgIC8vIGV2ZW50X2lkPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTQzLTExNTMKICAgIC8vIHJldHVybiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1zZWxmLmV2ZW50X2N1cnNvciwKICAgIC8vICAgICBldmVudF90eXBlPWFyYzQuVUludDgoMCksCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9VUludDY0KDApLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9VUludDY0KDApLAogICAgLy8gICAgIGZsYWdzPVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGl0b2IKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDUKICAgIC8vIGV2ZW50X3R5cGU9YXJjNC5VSW50OCgwKSwKICAgIGJ5dGVjIDQwIC8vIDB4MDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDMtMTE1MwogICAgLy8gcmV0dXJuIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgIGV2ZW50X2lkPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgLy8gICAgIGV2ZW50X3R5cGU9YXJjNC5VSW50OCgwKSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1VSW50NjQoMCksCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1VSW50NjQoMCksCiAgICAvLyAgICAgZmxhZ3M9VUludDY0KDApLAogICAgLy8gKQogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTQ2CiAgICAvLyBzY2hlZHVsZWRfdGltZT1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE0My0xMTUzCiAgICAvLyByZXR1cm4gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkoCiAgICAvLyAgICAgZXZlbnRfaWQ9c2VsZi5ldmVudF9jdXJzb3IsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1hcmM0LlVJbnQ4KDApLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPVVJbnQ2NCgwKSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249VUludDY0KDApLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPVVJbnQ2NCgwKSwKICAgIC8vICAgICBmbGFncz1VSW50NjQoMCksCiAgICAvLyApCiAgICBpdG9iCiAgICBzd2FwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKCmdldF9uZXh0X2R1ZV9ldmVudF9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmdldF9uZXh0X2R1ZV9ldmVudEA0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEzOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpnZXRfbmV4dF9kdWVfZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1NAogICAgLy8gcmV0dXJuIHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLmV2ZW50X2N1cnNvcikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgZ2V0X25leHRfZHVlX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuZ2V0X25leHRfZHVlX2V2ZW50QDQKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5jb250cmFjdF91cGRhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF91cGRhdGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTUzLTE1NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGdyYW50cyB0aGUgdXBkYXRlIHBlcm1pc3Npb25zIHRvIHRoZSBBcnJhbmdlci4KICAgIC8vICMg4pqg77iPIFdBUk5JTkc6IEFwcGxpY2F0aW9uIHVwZGF0ZXMgbXVzdCBiZSBleGVjdXRlZCBWRVJZIGNhcmVmdWxseSwgYXMgdGhleQogICAgLy8gIyBtaWdodCBpbnRyb2R1Y2UgYnJlYWtpbmcgY2hhbmdlcy4KICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfcm90YXRlX2FycmFuZ2VyW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19yb3RhdGVfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2OQogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTcwCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gbmV3X2FycmFuZ2VyCiAgICBieXRlYyAxOCAvLyAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTcxCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfc2V0X29wX2RhZW1vbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfc2V0X29wX2RhZW1vbjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTg0CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODUKICAgIC8vIHNlbGYub3BfZGFlbW9uLnZhbHVlID0gYWRkcmVzcwogICAgYnl0ZWMgMjUgLy8gMHg1MjIzNGY3MDQ0NjE2NTZkNmY2ZTIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4NgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTczCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2Fzc2lnbl9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19hc3NpZ25fcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDE2CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLlJvbGVWYWxpZGl0eQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjExCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMgogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgcHVzaGludCAyMAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTAzCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gcm9sZV9hZGRyZXNzCiAgICBieXRlYyAxOCAvLyAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMKICAgIGRpZyAzCiAgICBhcHBfZ2xvYmFsX3B1dAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTQKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDYKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIGR1cAogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnRfbWFuYWdlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMyAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwOAogICAgLy8gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMiAvLyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTIKICAgIC8vIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIGR1cAogICAgcHVzaGludCA2MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE1CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMzIgLy8gMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE2CiAgICAvLyBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExOAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMSAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIwCiAgICAvLyBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMwogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgODAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIzCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI0IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI0CiAgICAvLyBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3Jldm9rZV9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19yZXZva2Vfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzUKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzNgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzcKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCkpCiAgICBidG9pCiAgICBkdXBuIDIKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCAhPSBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksIGVyci5JTlZBTElEX1JPTEUKICAgIGR1cAogICAgcHVzaGludCAyMAogICAgIT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyOAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIzIC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0NGQ2MTZlNjE2NzY1NzIyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMwCiAgICAvLyBkZWwgc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzOQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjE2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIyIC8vIDB4NTIyMzUwNzI2OTZkNjE3Mjc5NDQ2NTYxNmM2NTcyMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNAogICAgLy8gZGVsIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjM4CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIGR1cAogICAgcHVzaGludCA2MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAzMiAvLyAweDUyMjM1NDcyNzU3Mzc0NjU2NTIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzgKICAgIC8vIGRlbCBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjM4CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDEKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hdXRob3JpdHksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjEgLy8gMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MgogICAgLy8gZGVsIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzOAogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDQKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDgwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI0IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ2CiAgICAvLyBkZWwgc2VsZi5vYnNlcnZlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ292X2Fzc2V0X3N1c3BlbnNpb25bcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dvdl9hc3NldF9zdXNwZW5zaW9uOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kICAjIFRPRE86IFVwZGF0ZSBzcGVjcyBhbmQgYWRkIHRlc3QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzcKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDIxIC8vIDB4NTIyMzQxNzU3NDY4NmY3MjY5NzQ3OTIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU3CiAgICAvLyBzZWxmLmFzc2V0X3N1c3BlbmRlZCA9IHN1c3BlbmRlZAogICAgYnl0ZWMgMzMgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU4CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCAgIyBUT0RPOiBVcGRhdGUgc3BlY3MgYW5kIGFkZCB0ZXN0CiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYXJyYW5nZXJbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNjgKICAgIC8vIHJldHVybiBzZWxmLmFycmFuZ2VyLnZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTggLy8gMHg1MjIzNDE3MjcyNjE2ZTY3NjU3MjIzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJyYW5nZXIgZXhpc3RzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjYwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9hZGRyZXNzX3JvbGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfYWRkcmVzc19yb2xlczoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg0CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmFjY291bnRfbWFuYWdlciwgYWRkcmVzcyksCiAgICBieXRlYyAyMyAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMKICAgIGRpZyAxCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4NQogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5wcmltYXJ5X2RlYWxlciwgYWRkcmVzcyksCiAgICBieXRlYyAyMiAvLyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzCiAgICBkaWcgMgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODYKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYudHJ1c3RlZSwgYWRkcmVzcyksCiAgICBieXRlYyAzMiAvLyAweDUyMjM1NDcyNzU3Mzc0NjU2NTIzCiAgICBkaWcgMwogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODcKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYXV0aG9yaXR5LCBhZGRyZXNzKSwKICAgIGJ5dGVjIDIxIC8vIDB4NTIyMzQxNzU3NDY4NmY3MjY5NzQ3OTIzCiAgICBkaWcgNAogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODgKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYub2JzZXJ2ZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjQgLy8gMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzCiAgICB1bmNvdmVyIDUKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjcwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjIDQwIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDYKICAgIHNldGJpdAogICAgaW50Y18xIC8vIDEKICAgIHVuY292ZXIgNQogICAgc2V0Yml0CiAgICBwdXNoaW50IDIKICAgIHVuY292ZXIgNAogICAgc2V0Yml0CiAgICBwdXNoaW50IDMKICAgIHVuY292ZXIgMwogICAgc2V0Yml0CiAgICBwdXNoaW50IDQKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA1CiAgICAvLyByb2xlID0gcm9sZV9pZC5hc191aW50NjQoKQogICAgYnRvaQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwNgogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZSkKICAgIGR1cAogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDgKICAgIC8vIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgcHVzaGludHMgMjAgNDAgNTAgNjAgNzAgODAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDctMzM4CiAgICAvLyBtYXRjaCByb2xlOgogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgLy8gICAgICAgICByZXR1cm4gdHlwLlJvbGVWYWxpZGl0eSgKICAgIC8vICAgICAgICAgICAgIHJvbGVfdmFsaWRpdHlfc3RhcnQ9VUludDY0KDApLCByb2xlX3ZhbGlkaXR5X2VuZD1VSW50NjQoMCkKICAgIC8vICAgICAgICAgKQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5hdXRob3JpdHksIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5vYnNlcnZlciwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5vYnNlcnZlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBfOgogICAgLy8gICAgICAgICBvcC5lcnIoZXJyLklOVkFMSURfUk9MRSkKICAgIHVuY292ZXIgNgogICAgbWF0Y2ggcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8wQDIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8xQDMgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8yQDQgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8zQDUgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV80QDYgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV81QDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzgKICAgIC8vIG9wLmVycihlcnIuSU5WQUxJRF9ST0xFKQogICAgZXJyIC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzVANzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzQKICAgIC8vIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMjQgLy8gMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzMzLTMzNQogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMzNgogICAgLy8gcmV0dXJuIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzRANjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjkKICAgIC8vIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDIxIC8vIDB4NTIyMzQxNzU3NDY4NmY3MjY5NzQ3OTIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI4LTMzMAogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzEKICAgIC8vIHJldHVybiBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzNANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjQKICAgIC8vIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAzMiAvLyAweDUyMjM1NDcyNzU3Mzc0NjU2NTIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzIzLTMyNQogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI2CiAgICAvLyByZXR1cm4gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMkA0OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxOQogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAyMiAvLyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzE4LTMyMAogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMQogICAgLy8gcmV0dXJuIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8xQDM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzE0CiAgICAvLyBzZWxmLmFjY291bnRfbWFuYWdlciwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAyMyAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTMtMzE1CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxNgogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMEAyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwOS0zMTEKICAgIC8vIHJldHVybiB0eXAuUm9sZVZhbGlkaXR5KAogICAgLy8gICAgIHJvbGVfdmFsaWRpdHlfc3RhcnQ9VUludDY0KDApLCByb2xlX3ZhbGlkaXR5X2VuZD1VSW50NjQoMCkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLl9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IHZvaWQ6Cl9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI2CiAgICAvLyBkZWYgX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQoc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjgKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkLCBlcnIuU1VTUEVOREVECiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCAzODQKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIFN1c3BlbmRlZCBvcGVyYXRpb25zCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5fc2V0dGxlX3Bvc2l0aW9uKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NCwgdWludDY0Ogpfc2V0dGxlX3Bvc2l0aW9uOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjQ0CiAgICAvLyBkZWYgX3NldHRsZV9wb3NpdGlvbihzZWxmLCBob2xkaW5nX2FkZHJlc3M6IEFjY291bnQpIC0+IHR1cGxlW1VJbnQ2NCwgVUludDY0XToKICAgIHByb3RvIDEgMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo2MQogICAgLy8gcG9zaXRpb24gPSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jb3B5KCkKICAgIGR1cAogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NjMtNjUKICAgIC8vICMgQ29tcHV0ZSB0aGUgaW5jcmVtZW50YWwgcGVyLXVuaXQgZml4ZWQtcG9pbnQgaW50ZXJlc3QgYW5kIHByaW5jaXBhbCBhY2NydWVkCiAgICAvLyAjIHNpbmNlIHRoaXMgYWNjb3VudCdzIGxhc3QgY2hlY2twb2ludC4KICAgIC8vIGludGVyZXN0X2RlbHRhID0gc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IC0gcG9zaXRpb24uaW50ZXJlc3RfY2hlY2twb2ludAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggZXhpc3RzCiAgICBkaWcgMQogICAgcHVzaGludCA1NwogICAgZXh0cmFjdF91aW50NjQKICAgIC0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo2NwogICAgLy8gc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCAtIHBvc2l0aW9uLnByaW5jaXBhbF9jaGVja3BvaW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTcgLy8gImN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IGV4aXN0cwogICAgZGlnIDIKICAgIHB1c2hpbnQgNjUKICAgIGV4dHJhY3RfdWludDY0CiAgICAtCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzMKICAgIC8vIGludGVyZXN0X2RlbHRhLCBwb3NpdGlvbi51bml0cywgc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgZGlnIDIKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3MC03NAogICAgLy8gIyBDb252ZXJ0IHRoZSBwZXItdW5pdCBmaXhlZC1wb2ludCBkZWx0YXMgaW50byBhYnNvbHV0ZSBjbGFpbWFibGUgYW1vdW50cwogICAgLy8gIyB1c2luZyB0aGUgYWNjb3VudCdzIGFjdGl2ZSB1bml0cy4KICAgIC8vIGNsYWltYWJsZV9pbnRlcmVzdCA9IHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIGludGVyZXN0X2RlbHRhLCBwb3NpdGlvbi51bml0cywgc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgLy8gKQogICAgdW5jb3ZlciAzCiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojc2CiAgICAvLyBwcmluY2lwYWxfZGVsdGEsIHBvc2l0aW9uLnVuaXRzLCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzUtNzcKICAgIC8vIGNsYWltYWJsZV9wcmluY2lwYWwgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBwcmluY2lwYWxfZGVsdGEsIHBvc2l0aW9uLnVuaXRzLCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICAvLyApCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojc5LTgxCiAgICAvLyAjIEFjY3J1ZSB0aGUgY2xhaW1hYmxlIGFtb3VudHMgdG8gdGhlIGFjY291bnQgcG9zaXRpb24gYW5kIG1ha2UgdGhlbSBhdmFpbGFibGUKICAgIC8vICMgZm9yIHdpdGhkcmF3YWwuCiAgICAvLyBwb3NpdGlvbi5jbGFpbWFibGVfaW50ZXJlc3QgKz0gY2xhaW1hYmxlX2ludGVyZXN0CiAgICBkaWcgMgogICAgcHVzaGludCA3MwogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICArCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIHN3YXAKICAgIHJlcGxhY2UyIDczCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6ODIKICAgIC8vIHBvc2l0aW9uLmNsYWltYWJsZV9wcmluY2lwYWwgKz0gY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgZHVwCiAgICBwdXNoaW50IDgxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDIKICAgICsKICAgIGl0b2IKICAgIHJlcGxhY2UyIDgxCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6ODQtODYKICAgIC8vICMgQWR2YW5jZSB0aGUgYWNjb3VudCdzIHBlci11bml0IGZpeGVkLXBvaW50IGNoZWNrcG9pbnRzIHRvIHRoZSBjdXJyZW50IGdsb2JhbAogICAgLy8gIyBwZXItdW5pdCBmaXhlZC1wb2ludCBnbG9iYWwgaW5kaWNlcy4KICAgIC8vIHBvc2l0aW9uLmludGVyZXN0X2NoZWNrcG9pbnQgPSBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IGV4aXN0cwogICAgaXRvYgogICAgcmVwbGFjZTIgNTcKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo4NwogICAgLy8gcG9zaXRpb24ucHJpbmNpcGFsX2NoZWNrcG9pbnQgPSBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTcgLy8gImN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IGV4aXN0cwogICAgaXRvYgogICAgcmVwbGFjZTIgNjUKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo4OS05MAogICAgLy8gIyBBZHZhbmNlIHRoZSBhY2NvdW50J3MgZXZlbnQgY3Vyc29yIHRvIHRoZSBjdXJyZW50IGdsb2JhbCBldmVudCBjdXJzb3IuCiAgICAvLyBwb3NpdGlvbi5zZXR0bGVkX2N1cnNvciA9IHNlbGYuZXZlbnRfY3Vyc29yCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGl0b2IKICAgIHJlcGxhY2UyIDQ5CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6OTItOTQKICAgIC8vICMgVXBkYXRlIHRoZSBhY2NvdW50IHBvc2l0aW9uIGFuZCByZXR1cm4gdGhlIG5ld2x5IGFjY3J1ZWQgY2xhaW1hYmxlIGFtb3VudHMKICAgIC8vICMgYWRkZWQgdG8gdGhlIHRvdGFsIHBvc2l0aW9uJ3MgY2xhaW1hYmxlIGFtb3VudHMuCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHBvc2l0aW9uLmNvcHkoKQogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6OTUKICAgIC8vIHJldHVybiBjbGFpbWFibGVfaW50ZXJlc3QsIGNsYWltYWJsZV9wcmluY2lwYWwKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IHZvaWQ6Cl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojk3CiAgICAvLyBkZWYgX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQoc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQyMwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDAKICAgIC8vIGlmIHNlbGYuX3N0YXR1c19pc19wZW5kaW5nX2llZCgpOgogICAgYnogX2Vuc3VyZV91bml0c19hY3RpdmF0ZWRfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTAxCiAgICAvLyByZXR1cm4KICAgIHJldHN1YgoKX2Vuc3VyZV91bml0c19hY3RpdmF0ZWRfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwMwogICAgLy8gcG9zaXRpb24gPSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAyCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDQKICAgIC8vIGlmIHBvc2l0aW9uLnJlc2VydmVkX3VuaXRzID09IFVJbnQ2NCgwKToKICAgIHB1c2hpbnQgNDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgYm56IF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkX2FmdGVyX2lmX2Vsc2VANAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwNQogICAgLy8gcmV0dXJuCiAgICByZXRzdWIKCl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkX2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDgKICAgIC8vIHBvc2l0aW9uLnVuaXRzICs9IGFjdGl2YXRlZF91bml0cwogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMwogICAgKwogICAgaXRvYgogICAgcmVwbGFjZTIgMzIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDkKICAgIC8vIHBvc2l0aW9uLnJlc2VydmVkX3VuaXRzID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgaXRvYgogICAgcmVwbGFjZTIgNDAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTAKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gcG9zaXRpb24uY29weSgpCiAgICBmcmFtZV9kaWcgMgogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExMQogICAgLy8gYXNzZXJ0IHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPj0gYWN0aXZhdGVkX3VuaXRzLCBlcnIuT1ZFUl9ESVNUUklCVVRJT04KICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICBkdXAKICAgIGRpZyAyCiAgICA+PQogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCByZW1haW5pbmcgRC1BU0EgdW5pdHMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTIKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgLT0gYWN0aXZhdGVkX3VuaXRzCiAgICBzd2FwCiAgICAtCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX3NjYWxlZF9tdWxfZGl2KG11bHRpcGxpY2FuZDogdWludDY0LCBtdWx0aXBsaWVyOiB1aW50NjQsIGRpdmlzb3I6IHVpbnQ2NCkgLT4gdWludDY0Ogpfc2NhbGVkX211bF9kaXY6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTMtMTU1CiAgICAvLyBkZWYgX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIHNlbGYsIG11bHRpcGxpY2FuZDogVUludDY0LCBtdWx0aXBsaWVyOiBVSW50NjQsIGRpdmlzb3I6IFVJbnQ2NAogICAgLy8gKSAtPiBVSW50NjQ6CiAgICBwcm90byAzIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE1NwogICAgLy8gaWYgbXVsdGlwbGljYW5kID09IFVJbnQ2NCgwKSBvciBtdWx0aXBsaWVyID09IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMwogICAgYnogX3NjYWxlZF9tdWxfZGl2X2lmX2JvZHlAMgogICAgZnJhbWVfZGlnIC0yCiAgICBibnogX3NjYWxlZF9tdWxfZGl2X2FmdGVyX2lmX2Vsc2VAMwoKX3NjYWxlZF9tdWxfZGl2X2lmX2JvZHlAMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE1OAogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKX3NjYWxlZF9tdWxfZGl2X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE1OQogICAgLy8gaGlnaCwgbG93ID0gb3AubXVsdyhtdWx0aXBsaWNhbmQsIG11bHRpcGxpZXIpCiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMgogICAgbXVsdwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTYwCiAgICAvLyByZXR1cm4gb3AuZGl2dyhoaWdoLCBsb3csIGRpdmlzb3IpCiAgICBmcmFtZV9kaWcgLTEKICAgIGRpdncKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9hbW91bnRfdG9faW5kZXhfZGVsdGEoYW1vdW50OiB1aW50NjQpIC0+IHVpbnQ2NDoKX2Ftb3VudF90b19pbmRleF9kZWx0YToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2MgogICAgLy8gZGVmIF9hbW91bnRfdG9faW5kZXhfZGVsdGEoc2VsZiwgYW1vdW50OiBVSW50NjQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTY0CiAgICAvLyBpZiBhbW91bnQgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0xCiAgICBibnogX2Ftb3VudF90b19pbmRleF9kZWx0YV9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2NQogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKX2Ftb3VudF90b19pbmRleF9kZWx0YV9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjYKICAgIC8vIGFzc2VydCBzZWxmLnRvdGFsX3VuaXRzID4gVUludDY0KDApLCBlcnIuTk9fVU5JVFMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICBkdXAKICAgIGFzc2VydCAvLyBObyBELUFTQSB1bml0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTY3CiAgICAvLyByZXR1cm4gc2VsZi5fc2NhbGVkX211bF9kaXYoYW1vdW50LCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLCBzZWxmLnRvdGFsX3VuaXRzKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5faW5kZXhfZGVsdGFfdG9fYW1vdW50KGluZGV4X2RlbHRhOiB1aW50NjQpIC0+IHVpbnQ2NDoKX2luZGV4X2RlbHRhX3RvX2Ftb3VudDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2OQogICAgLy8gZGVmIF9pbmRleF9kZWx0YV90b19hbW91bnQoc2VsZiwgaW5kZXhfZGVsdGE6IFVJbnQ2NCkgLT4gVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNzYKICAgIC8vIGlmIGluZGV4X2RlbHRhID09IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMQogICAgYm56IF9pbmRleF9kZWx0YV90b19hbW91bnRfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNzcKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9pbmRleF9kZWx0YV90b19hbW91bnRfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTc5CiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE4MQogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE3OC0xODIKICAgIC8vIHJldHVybiBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLnRvdGFsX3VuaXRzLAogICAgLy8gICAgIGluZGV4X2RlbHRhLAogICAgLy8gICAgIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZ2V0X3NjaGVkdWxlX2VudHJ5KGV2ZW50X2lkOiB1aW50NjQpIC0+IGJ5dGVzOgpfZ2V0X3NjaGVkdWxlX2VudHJ5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjAyCiAgICAvLyBkZWYgX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLCBldmVudF9pZDogVUludDY0KSAtPiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeToKICAgIHByb3RvIDEgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjA0CiAgICAvLyBhc3NlcnQgZXZlbnRfaWQgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LCBlcnIuSU5WQUxJRF9FVkVOVF9JRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICA+CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBpZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTkwCiAgICAvLyByZXR1cm4gZXZlbnRfaWQgLy8gVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMTYKICAgIC8KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIwNgogICAgLy8gYXNzZXJ0IHBhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBpdG9iCiAgICBieXRlYyAzMSAvLyAweDUzMjMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE5NAogICAgLy8gcmV0dXJuIGV2ZW50X2lkICUgVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMTYKICAgICUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIwOQogICAgLy8gYXNzZXJ0IG9mZnNldCA8IHBhZ2UubGVuZ3RoLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIHB1c2hpbnQgMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGRpZyAxCiAgICA+CiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMTAKICAgIC8vIHJldHVybiBwYWdlW29mZnNldF0uY29weSgpCiAgICBwdXNoaW50IDY1CiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIHB1c2hpbnQgNjUKICAgIGJveF9leHRyYWN0CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoY29udHJhY3RfdHlwZTogdWludDY0LCBldmVudF90eXBlOiB1aW50NjQpIC0+IHZvaWQ6Cl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxMy0zMTUKICAgIC8vIGRlZiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgc2VsZiwgY29udHJhY3RfdHlwZTogVUludDY0LCBldmVudF90eXBlOiBVSW50NjQKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU0LTI1NQogICAgLy8gIyBDaGVjayBjb21tb24gZXZlbnRzIGZpcnN0CiAgICAvLyBpZiBldmVudF90eXBlIGluIGNvbW1vbl9ldmVudHM6CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI0NwogICAgLy8gVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI0OAogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUCksCiAgICBpbnRjXzIgLy8gOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU0LTI1NQogICAgLy8gIyBDaGVjayBjb21tb24gZXZlbnRzIGZpcnN0CiAgICAvLyBpZiBldmVudF90eXBlIGluIGNvbW1vbl9ldmVudHM6CiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjQ5CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX01EKSwKICAgIHB1c2hpbnQgMTkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1MAogICAgLy8gVUludDY0KGVudW1zLkVWVF9SUiksCiAgICBwdXNoaW50IDEyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTEKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIHB1c2hpbnQgMTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDcKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDY6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTYKICAgIC8vIHJldHVybiBUcnVlCiAgICBpbnRjXzEgLy8gMQoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIHJldHN1YgoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1OC0yNTkKICAgIC8vICMgQ29udHJhY3Qtc3BlY2lmaWMgYWRkaXRpb25hbCBldmVudHMKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX1BBTSk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNjAtMjYxCiAgICAvLyAjIFBBTSBvbmx5IHN1cHBvcnRzIGNvbW1vbiBldmVudHMKICAgIC8vIHJldHVybiBGYWxzZQogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2MwogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfTEFNKSBvciBjb250cmFjdF90eXBlID09IFVJbnQ2NCgKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAzCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjYzLTI2NQogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfTEFNKSBvciBjb250cmFjdF90eXBlID09IFVJbnQ2NCgKICAgIC8vICAgICBlbnVtcy5DVF9OQU0KICAgIC8vICk6CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlAMTEKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAyCiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMTYKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDExOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjY2LTI3MAogICAgLy8gIyBMQU0vTkFNIGFkZDogUFIsIElQQ0IKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNjgKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNjYtMjcwCiAgICAvLyAjIExBTS9OQU0gYWRkOiBQUiwgSVBDQgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMTMKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjY5CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgcHVzaGludCAxOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjY2LTI3MAogICAgLy8gIyBMQU0vTkFNIGFkZDogUFIsIElQQ0IKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gKQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDE0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDEzOgogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMTQ6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAxNjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3MgogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKToKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAyMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjczLTI3OAogICAgLy8gIyBBTk4gYWRkczogUFIsIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzUKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzMtMjc4CiAgICAvLyAjIEFOTiBhZGRzOiBQUiwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjAKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjc2CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgcHVzaGludCAxOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjczLTI3OAogICAgLy8gIyBBTk4gYWRkczogUFIsIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDIwCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3NwogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzMtMjc4CiAgICAvLyAjIEFOTiBhZGRzOiBQUiwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMjEKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjA6CiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF9mYWxzZUAyMToKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDIzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjgwCiAgICAvLyBpZiBjb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9MQVgpOgogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDQKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAzMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjgxLTI4NwogICAgLy8gIyBMQVggYWRkczogUFIsIFBJLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjgzCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjgxLTI4NwogICAgLy8gIyBMQVggYWRkczogUFIsIFBJLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyOAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODQKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgcHVzaGludCA0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODEtMjg3CiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDI4CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4NQogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIHB1c2hpbnQgMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MS0yODcKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjgKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjg2CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICBwdXNoaW50IDUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MS0yODcKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMjkKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjg6CiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF9mYWxzZUAyOToKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDMxOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjg5CiAgICAvLyBpZiBjb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9DTE0pOgogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDUKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAzMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjkwLTI5MQogICAgLy8gIyBDTE0gYWRkczogUFIKICAgIC8vIHJldHVybiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMzM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyOTMKICAgIC8vIHJldHVybiBGYWxzZQogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9pc19keW5hbWljX2FubnVpdHkoKSAtPiB1aW50NjQ6Cl9pc19keW5hbWljX2FubnVpdHk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzUKICAgIC8vIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMzNS0zMzYKICAgIC8vIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKQogICAgLy8gYW5kIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgYnogX2lzX2R5bmFtaWNfYW5udWl0eV9ib29sX2ZhbHNlQDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMzNgogICAgLy8gYW5kIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDM0IC8vICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24gZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzUtMzM2CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIC8vIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGJ6IF9pc19keW5hbWljX2FubnVpdHlfYm9vbF9mYWxzZUAzCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM0LTMzNwogICAgLy8gcmV0dXJuICgKICAgIC8vICAgICBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIC8vICAgICBhbmQgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICAvLyApCiAgICByZXRzdWIKCl9pc19keW5hbWljX2FubnVpdHlfYm9vbF9mYWxzZUAzOgogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMzNC0zMzcKICAgIC8vIHJldHVybiAoCiAgICAvLyAgICAgc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICAvLyAgICAgYW5kIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgLy8gKQogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnk6IGJ5dGVzKSAtPiB1aW50NjQsIGJ5dGVzOgpfZW50cnlfaW50ZXJlc3Rfc2VnbWVudDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM4MAogICAgLy8gZGVmIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KHNlbGYsIGVudHJ5OiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSkgLT4gVUludDY0OgogICAgcHJvdG8gMSAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozODkKICAgIC8vIGVudHJ5LmFjY3J1YWxfZmFjdG9yID09IFVJbnQ2NCgwKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDE3CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozODktMzkxCiAgICAvLyBlbnRyeS5hY2NydWFsX2ZhY3RvciA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID09IFVJbnQ2NCgwKQogICAgLy8gb3Igc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID09IFVJbnQ2NCgwKQogICAgYnogX2VudHJ5X2ludGVyZXN0X3NlZ21lbnRfaWZfYm9keUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozOTAKICAgIC8vIG9yIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID09IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozODktMzkxCiAgICAvLyBlbnRyeS5hY2NydWFsX2ZhY3RvciA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID09IFVJbnQ2NCgwKQogICAgLy8gb3Igc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID09IFVJbnQ2NCgwKQogICAgYnogX2VudHJ5X2ludGVyZXN0X3NlZ21lbnRfaWZfYm9keUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozOTEKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozODktMzkxCiAgICAvLyBlbnRyeS5hY2NydWFsX2ZhY3RvciA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID09IFVJbnQ2NCgwKQogICAgLy8gb3Igc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID09IFVJbnQ2NCgwKQogICAgYm56IF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2FmdGVyX2lmX2Vsc2VANAoKX2VudHJ5X2ludGVyZXN0X3NlZ21lbnRfaWZfYm9keUAzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzkzCiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfZGlnIC0xCiAgICB1bmNvdmVyIDIKICAgIHJldHN1YgoKX2VudHJ5X2ludGVyZXN0X3NlZ21lbnRfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzk1CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzk2CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzk3CiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzk0LTM5OAogICAgLy8gYWNjcnVlZCA9IHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSwKICAgIC8vICAgICBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQwMgogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5OS00MDMKICAgIC8vIHJldHVybiBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBhY2NydWVkLAogICAgLy8gICAgIGVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMAogICAgc3dhcAogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIGZyYW1lX2RpZyAtMQogICAgdW5jb3ZlciAyCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZGlzY291bnRfYW5udWl0eV9mYWN0b3IoZGlzY291bnRfZmFjdG9yOiB1aW50NjQsIHJlZGVtcHRpb25fZmFjdG9yOiB1aW50NjQpIC0+IHVpbnQ2NDoKX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDYyLTQ2NgogICAgLy8gZGVmIF9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcigKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgIGRpc2NvdW50X2ZhY3RvcjogVUludDY0LAogICAgLy8gICAgIHJlZGVtcHRpb25fZmFjdG9yOiBVSW50NjQsCiAgICAvLyApIC0+IFVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDY4CiAgICAvLyBpZiByZWRlbXB0aW9uX2ZhY3RvciA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGJueiBfZGlzY291bnRfYW5udWl0eV9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NjkKICAgIC8vIHJldHVybiBkaXNjb3VudF9mYWN0b3IKICAgIGZyYW1lX2RpZyAtMgogICAgcmV0c3ViCgpfZGlzY291bnRfYW5udWl0eV9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDcwCiAgICAvLyBwZXJpb2RfcmF0ZSA9IHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgKyBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3MQogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3MC00NzQKICAgIC8vIHBlcmlvZF9yYXRlID0gc2VsZi5maXhlZF9wb2ludF9zY2FsZSArIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIHJlZGVtcHRpb25fZmFjdG9yLAogICAgLy8gICAgIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgKwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDc1CiAgICAvLyBhc3NlcnQgcGVyaW9kX3JhdGUgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZHVwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzgKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzYtNDgwCiAgICAvLyByZXR1cm4gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgZGlzY291bnRfZmFjdG9yLAogICAgLy8gICAgIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICAvLyAgICAgcGVyaW9kX3JhdGUsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeShlbnRyeTogYnl0ZXMsIHBheWxvYWQ6IGJ5dGVzKSAtPiBieXRlcywgYnl0ZXM6Cl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYxMy02MTUKICAgIC8vIGRlZiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkoCiAgICAvLyAgICAgc2VsZiwgZW50cnk6IHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5LCBwYXlsb2FkOiB0eXAuT2JzZXJ2ZWRFdmVudFJlcXVlc3QKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDIgMgogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MjMKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF9pZCA9PSBzZWxmLmV2ZW50X2N1cnNvciwgZXJyLklOVkFMSURfRVZFTlRfQ1VSU09SCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgY3Vyc29yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MjQKICAgIC8vIGFzc2VydCBlbnRyeS5zY2hlZHVsZWRfdGltZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwgZXJyLk5PX0RVRV9DQVNIRkxPVwogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA8PQogICAgYXNzZXJ0IC8vIE5vIGR1ZSBjYXNoZmxvdyB0byBwYXkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYyNgogICAgLy8gZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjI3CiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfSUVEKToKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgZHVwCiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjI4LTYzMAogICAgLy8gIyBJRUQgZmluYWxpemVzIGlzc3VhbmNlOiByZXNlcnZlZCB1bml0cyBiZWNvbWUgYWN0aXZhdGFibGUgYW5kIHRoZQogICAgLy8gIyBzY2hlZHVsZSdzIGluaXRpYWwgY29udHJhY3R1YWwgc3RhdGUgYmVjb21lcyBsaXZlLgogICAgLy8gYXNzZXJ0IHNlbGYuX3N0YXR1c19pc19wZW5kaW5nX2llZCgpLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYzMgogICAgLy8gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCA9PSBzZWxmLnRvdGFsX3VuaXRzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzEtNjMzCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPT0gc2VsZi50b3RhbF91bml0cwogICAgLy8gKSwgZXJyLlBSSU1BUllfRElTVFJJQlVUSU9OX0lOQ09NUExFVEUKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBub3QgY29tcGxldGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYzNAogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzUKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYzNgogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPSBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZQogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYzNwogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ID0gVUludDY0KDApCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzgKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IGVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA0MQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYzOQogICAgLy8gc2VsZi5ldmVudF9jdXJzb3IgKz0gVUludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjQwCiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbnVtcy5TVEFUVVNfQUNUSVZFKQogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgcHVzaGludCAxMDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NTEKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwgZXJyLk5PVF9FVlRfSUVECiAgICBmcmFtZV9kaWcgMTEKICAgIGFzc2VydCAvLyBOb3QgSUVEIGV2ZW50CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NTIKICAgIC8vIHJldHVybiBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjQxLTY0NQogICAgLy8gc2VsZi5fZW1pdF9leGVjdXRpb25fZXZlbnQoCiAgICAvLyAgICAgZW50cnk9ZW50cnksCiAgICAvLyAgICAgcGF5b2ZmPXNlbGYuX2VudHJ5X2llZF9hbW91bnQoZW50cnkpLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjQ0CiAgICAvLyBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjQxLTY0NQogICAgLy8gc2VsZi5fZW1pdF9leGVjdXRpb25fZXZlbnQoCiAgICAvLyAgICAgZW50cnk9ZW50cnksCiAgICAvLyAgICAgcGF5b2ZmPXNlbGYuX2VudHJ5X2llZF9hbW91bnQoZW50cnkpLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGNhbGxzdWIgX2VtaXRfZXhlY3V0aW9uX2V2ZW50CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgLTIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0NgogICAgLy8gcmV0dXJuCiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2J1cnkgMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQ3CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuX3N0YXR1c19pc19wZW5kaW5nX2llZCgpLCBlcnIuUEVORElOR19JRUQKICAgICEKICAgIGFzc2VydCAvLyBJRUQgbm90IHlldCBleGVjdXRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjQ5CiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgKz0gc2VsZi5fZW50cnlfaW50ZXJlc3Rfc2VnbWVudChlbnRyeSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQKICAgIGZyYW1lX2J1cnkgLTIKICAgICsKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjUxCiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUlIpOgogICAgZnJhbWVfZGlnIDEwCiAgICBwdXNoaW50IDEyCiAgICA9PQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAxMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjU1CiAgICAvLyBwYXlsb2FkLm9ic2VydmVkX3JhdGUsCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NTYKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9tdWx0aXBsaWVyLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDM2IC8vICJyYXRlX3Jlc2V0X211bHRpcGxpZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9tdWx0aXBsaWVyIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjU3CiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjUyLTY1OAogICAgLy8gIyBSUiBkZXJpdmVzIHRoZSBuZXh0IHJhdGUgZnJvbSBhbiBvYnNlcnZlZCBvcmFjbGUgdmFsdWUgcGx1cyB0aGUKICAgIC8vICMgY29udHJhY3Qgc3ByZWFkIC8gbXVsdGlwbGllciB0ZXJtcywgdGhlbiBlbmZvcmNlcyBmbG9vciBhbmQgY2FwLgogICAgLy8gb2JzZXJ2ZWRfcmF0ZSA9IHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIHBheWxvYWQub2JzZXJ2ZWRfcmF0ZSwKICAgIC8vICAgICBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2MAogICAgLy8gb2JzZXJ2ZWRfcmF0ZSArIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzNSAvLyAicmF0ZV9yZXNldF9zcHJlYWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQgZXhpc3RzCiAgICArCiAgICBmcmFtZV9idXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjczNAogICAgLy8gaWYgc2VsZi5oYXNfcmF0ZV9yZXNldF9mbG9vciBhbmQgcmF0ZSA8IHNlbGYucmF0ZV9yZXNldF9mbG9vcjoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzOCAvLyAiaGFzX3JhdGVfcmVzZXRfZmxvb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgZXhpc3RzCiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1NQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI5IC8vICJyYXRlX3Jlc2V0X2Zsb29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfZmxvb3IgZXhpc3RzCiAgICBmcmFtZV9kaWcgNgogICAgPgogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjczNQogICAgLy8gcmF0ZSA9IHNlbGYucmF0ZV9yZXNldF9mbG9vcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI5IC8vICJyYXRlX3Jlc2V0X2Zsb29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgNgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9mbG9vciBleGlzdHMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzM2CiAgICAvLyBpZiBzZWxmLmhhc19yYXRlX3Jlc2V0X2NhcCBhbmQgcmF0ZSA+IHNlbGYucmF0ZV9yZXNldF9jYXA6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzkgLy8gImhhc19yYXRlX3Jlc2V0X2NhcCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgZXhpc3RzCiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1OAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDMwIC8vICJyYXRlX3Jlc2V0X2NhcCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X2NhcCBleGlzdHMKICAgIGZyYW1lX2RpZyA2CiAgICA8CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1OAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzM3CiAgICAvLyByYXRlID0gc2VsZi5yYXRlX3Jlc2V0X2NhcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDMwIC8vICJyYXRlX3Jlc2V0X2NhcCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDYKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfY2FwIGV4aXN0cwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NTkKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gc2VsZi5fY2xhbXBfcmF0ZSgKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1OS02NjEKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gc2VsZi5fY2xhbXBfcmF0ZSgKICAgIC8vICAgICBvYnNlcnZlZF9yYXRlICsgc2VsZi5yYXRlX3Jlc2V0X3NwcmVhZAogICAgLy8gKQogICAgZnJhbWVfZGlnIDYKICAgIGFwcF9nbG9iYWxfcHV0CgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAxODoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY3MQogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1BJKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCA0CiAgICA9PQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAyMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjcyCiAgICAvLyBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9IGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY3MwogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMjM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzgKICAgIC8vIGlmIHNlbGYuX2lzX2R5bmFtaWNfYW5udWl0eSgpOgogICAgY2FsbHN1YiBfaXNfZHluYW1pY19hbm51aXR5CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDI5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzkKICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QUkYpOgogICAgZnJhbWVfZGlnIDEwCiAgICBwdXNoaW50IDUKICAgID09CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAzMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDkwCiAgICAvLyBkaXNjb3VudF9mYWN0b3IgPSBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5MQogICAgLy8gZGVub21pbmF0b3IgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5MgogICAgLy8gc2tpcF9maXJzdF9yZWRlbXB0aW9uID0gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5NAogICAgLy8gaWYgZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAyNQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgZnJhbWVfYnVyeSA4CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAzNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDk1LTQ5OQogICAgLy8gIyBBbiBpbml0aWFsIFBSRiBtYXkgZGVzY3JpYmUgdGhlIGZpcnN0IHJlZGVtcHRpb24gcGVyaW9kIGRpcmVjdGx5LgogICAgLy8gZGlzY291bnRfZmFjdG9yID0gc2VsZi5fZGlzY291bnRfYW5udWl0eV9mYWN0b3IoCiAgICAvLyAgICAgZGlzY291bnRfZmFjdG9yLAogICAgLy8gICAgIGVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDgKICAgIGNhbGxzdWIgX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTAxCiAgICAvLyBza2lwX2ZpcnN0X3JlZGVtcHRpb24gPSBUcnVlCiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfYnVyeSA3CiAgICBmcmFtZV9idXJ5IDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDM1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTAzCiAgICAvLyBmdXR1cmVfZXZlbnRfaWQgPSBzZWxmLmV2ZW50X2N1cnNvciArIFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfd2hpbGVfdG9wQDM2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA0CiAgICAvLyB3aGlsZSBmdXR1cmVfZXZlbnRfaWQgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgZnJhbWVfZGlnIDMKICAgID4KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl93aGlsZUA0OAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA1CiAgICAvLyBmdXR1cmVfZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoZnV0dXJlX2V2ZW50X2lkKQogICAgZnJhbWVfZGlnIDMKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwNgogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPSBmdXR1cmVfZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MDctNTA4CiAgICAvLyAjIE9ubHkgcmVkZW1wdGlvbi1iZWFyaW5nIGV2ZW50cyBjb250cmlidXRlIHRvIHRoZSBhbm51aXR5IGRlbm9taW5hdG9yLgogICAgLy8gaXNfcmVkZW1wdGlvbl9ldmVudCA9IGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpIG9yICgKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwNy01MTEKICAgIC8vICMgT25seSByZWRlbXB0aW9uLWJlYXJpbmcgZXZlbnRzIGNvbnRyaWJ1dGUgdG8gdGhlIGFubnVpdHkgZGVub21pbmF0b3IuCiAgICAvLyBpc19yZWRlbXB0aW9uX2V2ZW50ID0gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QUikgb3IgKAogICAgLy8gICAgIGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfTUQpCiAgICAvLyAgICAgYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICAvLyApCiAgICBibnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfdHJ1ZUA0MAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA5CiAgICAvLyBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgZnJhbWVfZGlnIDQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MDktNTEwCiAgICAvLyBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgLy8gYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF9mYWxzZUA0MQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTEwCiAgICAvLyBhbmQgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IgPiBVSW50NjQoMCkKICAgIGZyYW1lX2RpZyAwCiAgICBwdXNoaW50IDI1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA5LTUxMAogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCkKICAgIC8vIGFuZCBmdXR1cmVfZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX3RydWVANDA6CiAgICBpbnRjXzEgLy8gMQoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfbWVyZ2VANDI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTIKICAgIC8vIGlmIGlzX3JlZGVtcHRpb25fZXZlbnQ6CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA0NwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTEzCiAgICAvLyBpZiBza2lwX2ZpcnN0X3JlZGVtcHRpb246CiAgICBmcmFtZV9kaWcgNwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUA0NQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTE0CiAgICAvLyBza2lwX2ZpcnN0X3JlZGVtcHRpb24gPSBGYWxzZQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgNwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANDc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjEKICAgIC8vIGZ1dHVyZV9ldmVudF9pZCArPSBVSW50NjQoMSkKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV93aGlsZV90b3BAMzYKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlANDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTgKICAgIC8vIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZnJhbWVfZGlnIDAKICAgIHB1c2hpbnQgMjUKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTYtNTE5CiAgICAvLyBkaXNjb3VudF9mYWN0b3IgPSBzZWxmLl9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcigKICAgIC8vICAgICBkaXNjb3VudF9mYWN0b3IsCiAgICAvLyAgICAgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMgogICAgc3dhcAogICAgY2FsbHN1YiBfZGlzY291bnRfYW5udWl0eV9mYWN0b3IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjAKICAgIC8vIGRlbm9taW5hdG9yICs9IGRpc2NvdW50X2ZhY3RvcgogICAgZnJhbWVfZGlnIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA0NwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDE6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF9tZXJnZUA0MgoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX3doaWxlQDQ4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTIzCiAgICAvLyBhc3NlcnQgZGVub21pbmF0b3IgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZnJhbWVfZGlnIDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUyNAogICAgLy8gbnVtZXJhdG9yID0gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTI1CiAgICAvLyBpZiBlbnRyeS5mbGFncyAmIFVJbnQ2NChlbnVtcy5GTEFHX0lOSVRJQUxfUFJGKSA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNTcKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gOAogICAgJgogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDUwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjYtNTI3CiAgICAvLyAjIFN1YnNlcXVlbnQgUFJGIGV2ZW50cyBhbW9ydGl6ZSBib3RoIHByaW5jaXBhbCBhbmQgYWxyZWFkeSBhY2NydWVkIGNhcnJ5LgogICAgLy8gbnVtZXJhdG9yICs9IHNlbGYuYWNjcnVlZF9pbnRlcmVzdAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgICsKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDUwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTMwCiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTI4LTUzMgogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIG51bWVyYXRvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gICAgIGRlbm9taW5hdG9yLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDEKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODAKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IHNlbGYuX3JlY2FsY3VsYXRlX2FubnVpdHlfcGF5bWVudCgKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjgwLTY4MgogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gc2VsZi5fcmVjYWxjdWxhdGVfYW5udWl0eV9wYXltZW50KAogICAgLy8gICAgIGVudHJ5CiAgICAvLyApCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMzA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODUKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4Ni02OTAKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1VSW50NjQoMCksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODgKICAgIC8vIHBheW9mZj1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njg5CiAgICAvLyBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4Ni02OTAKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1VSW50NjQoMCksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgY2FsbHN1YiBfZW1pdF9leGVjdXRpb25fZXZlbnQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDI5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njg0CiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDMwCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDIwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc0CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9JUENCKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCAxOAogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDIzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzUtNjc2CiAgICAvLyAjIElQQ0Iga2VlcHMgcHJpbmNpcGFsIHVuY2hhbmdlZCBhbmQgb25seSByZXNldHMgdGhlIGludGVyZXN0IGJhc2UuCiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIGIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMjMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMTA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjIKICAgIC8vIGVsaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1JSRik6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgMTEKICAgID09CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDE0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjMKICAgIC8vIG5leHRfcmF0ZSA9IGVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY0CiAgICAvLyBpZiBuZXh0X3JhdGUgPT0gVUludDY0KDApOgogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDEzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjUKICAgIC8vIG5leHRfcmF0ZSA9IHNlbGYucmF0ZV9yZXNldF9uZXh0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzcgLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDUKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfbmV4dCBleGlzdHMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY2CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IG5leHRfcmF0ZQogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgZnJhbWVfZGlnIDUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDE0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY4CiAgICAvLyBpZiBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSAhPSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgOQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2OQogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPSBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZQogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgZnJhbWVfZGlnIDkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KGVudHJ5OiBieXRlcywgcGF5b2ZmOiB1aW50NjQsIHNldHRsZWRfYW1vdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpfZW1pdF9leGVjdXRpb25fZXZlbnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OTYtNzAyCiAgICAvLyBkZWYgX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgKiwKICAgIC8vICAgICBlbnRyeTogdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnksCiAgICAvLyAgICAgcGF5b2ZmOiBVSW50NjQsCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ6IFVJbnQ2NCwKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDMgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzA2CiAgICAvLyBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25JRAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzA3CiAgICAvLyBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIGZyYW1lX2RpZyAtMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MDgKICAgIC8vIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIGZyYW1lX2RpZyAtMwogICAgZXh0cmFjdCA4IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcwOQogICAgLy8gc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICBmcmFtZV9kaWcgLTMKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTAKICAgIC8vIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTMKICAgIC8vIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIGZyYW1lX2RpZyAtMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzA4CiAgICAvLyBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICBpbnRjXzIgLy8gOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzEzCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBnZXRieXRlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDIKICAgIC8vIGlmIHBheW9mZiA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJueiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDMKICAgIC8vIHJldHVybiBVSW50NjQoZW51bXMuUEFZT0ZGX1NJR05fUE9TSVRJVkUpCiAgICBpbnRjXzEgLy8gMQoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX3BheW9mZl9zaWduQDc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTItNzE0CiAgICAvLyBwYXlvZmZfc2lnbj1hcmM0LlVJbnQ4KAogICAgLy8gICAgIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIC8vICksCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgaW50Y18yIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTYKICAgIC8vIGN1cnJlbmN5X2lkPXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE3CiAgICAvLyBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MDUtNzE4CiAgICAvLyBFeGVjdXRpb25FdmVudCgKICAgIC8vICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIC8vICAgICBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYXBwbGllZF9hdD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICBwYXlvZmY9cGF5b2ZmLAogICAgLy8gICAgIHBheW9mZl9zaWduPWFyYzQuVUludDgoCiAgICAvLyAgICAgICAgIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIC8vICAgICApLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PXNldHRsZWRfYW1vdW50LAogICAgLy8gICAgIGN1cnJlbmN5X2lkPXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAwCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzA0LTcxOQogICAgLy8gYXJjNC5lbWl0KAogICAgLy8gICAgIEV4ZWN1dGlvbkV2ZW50KAogICAgLy8gICAgICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgICAgIHBheW9mZj1wYXlvZmYsCiAgICAvLyAgICAgICAgIHBheW9mZl9zaWduPWFyYzQuVUludDgoCiAgICAvLyAgICAgICAgICAgICBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICAvLyAgICAgICAgICksCiAgICAvLyAgICAgICAgIHNldHRsZWRfYW1vdW50PXNldHRsZWRfYW1vdW50LAogICAgLy8gICAgICAgICBjdXJyZW5jeV9pZD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgICAgIHNlcXVlbmNlPWVudHJ5LmV2ZW50X2lkICsgVUludDY0KDEpLAogICAgLy8gICAgICkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDlhMzMyYjk1IC8vIG1ldGhvZCAiRXhlY3V0aW9uRXZlbnQodWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc0NAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiAoVUludDY0KGVudW1zLkVWVF9JRUQpLCBVSW50NjQoZW51bXMuRVZUX1BJKSk6CiAgICBmcmFtZV9kaWcgNQogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBibnogX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2lmX2JvZHlANQogICAgZnJhbWVfZGlnIDUKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGJ6IF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pZl9lbHNlQDYKCl9lbWl0X2V4ZWN1dGlvbl9ldmVudF9pZl9ib2R5QDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDUKICAgIC8vIHJldHVybiBVSW50NjQoZW51bXMuUEFZT0ZGX1NJR05fUE9TSVRJVkUpCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzEzCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBiIF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9wYXlvZmZfc2lnbkA3CgpfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzQ2CiAgICAvLyByZXR1cm4gVUludDY0KGVudW1zLlBBWU9GRl9TSUdOX05FR0FUSVZFKQogICAgcHVzaGludCAyNTUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxMwogICAgLy8gc2VsZi5fcGF5b2ZmX3NpZ24oZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSwgcGF5b2ZmKQogICAgYiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fcGF5b2ZmX3NpZ25ANwoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9yb2xlX2lzX2FjdGl2ZShyb2xlX21hcDogYnl0ZXMsIHJvbGVfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NDoKX3JvbGVfaXNfYWN0aXZlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU3CiAgICAvLyBkZWYgX3JvbGVfaXNfYWN0aXZlKHNlbGYsIHJvbGVfbWFwOiB0eXAuUmJhY1JvbGUsIHJvbGVfYWRkcmVzczogQWNjb3VudCkgLT4gYm9vbDoKICAgIHByb3RvIDIgMQogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5CiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5LTYwCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5LTYxCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjEKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAtNjEKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgPj0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX21lcmdlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKSAtPiB2b2lkOgpfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2NQogICAgLy8gYXNzZXJ0IHNlbGYuX2lzX2FycmFuZ2VyKFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTIKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgPT0gc2VsZi5hcnJhbmdlci52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE4IC8vIDB4NTIyMzQxNzI3MjYxNmU2NzY1NzIyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgPT0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2NQogICAgLy8gYXNzZXJ0IHNlbGYuX2lzX2FycmFuZ2VyKFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpIC0+IHZvaWQ6Cl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4MwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFzc2V0X2RlZmF1bHRlZCwgZXJyLkRFRkFVTFRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQxIC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfZGVmYXVsdGVkIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIERlZmF1bHRlZAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkgLT4gdm9pZDoKX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg2CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYXNzZXRfc3VzcGVuZGVkLCBlcnIuU1VTUEVOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzMgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9zdXNwZW5kZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gU3VzcGVuZGVkIG9wZXJhdGlvbnMKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkOiB1aW50NjQpIC0+IHZvaWQ6Cl9hc3NlcnRfdmFsaWRfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OAogICAgLy8gZGVmIF9hc3NlcnRfdmFsaWRfcm9sZShzZWxmLCByb2xlX2lkOiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTAKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIHB1c2hpbnQgMjAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkxCiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgcHVzaGludCAyNQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTIKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICBwdXNoaW50IDQwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MwogICAgLy8gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgcHVzaGludCA1MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTQKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgcHVzaGludCA2MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTUKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICBwdXNoaW50IDcwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NgogICAgLy8gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgcHVzaGludCA4MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfZmFsc2VAOAoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3OgogICAgaW50Y18xIC8vIDEKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX21lcmdlQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgcmV0c3ViCgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9mYWxzZUA4OgogICAgaW50Y18wIC8vIDAKICAgIGIgX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfbWVyZ2VAOQo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="}, "sourceInfo": {"approval": {"pcOffsetMethod": "none", "sourceInfo": [{"pc": [2601], "errorMessage": "ACTUS event not yet executed"}, {"pc": [2358], "errorMessage": "Can not distribute zero units"}, {"pc": [3102, 3109, 3481], "errorMessage": "D-ASA already configured"}, {"pc": [1238, 1939, 2318, 2464, 3733, 3880, 4226, 4372], "errorMessage": "D-ASA not configured"}, {"pc": [3492], "errorMessage": "D-ASA terms not configured"}, {"pc": [6541], "errorMessage": "Defaulted"}, {"pc": [3120], "errorMessage": "Denomination asset is not properly set"}, {"pc": [3135], "errorMessage": "Different settlement asset not supported, must be equal to denomination asset"}, {"pc": [3370, 3377, 3379], "errorMessage": "IED must be set in the future"}, {"pc": [1256, 2008, 2479, 5914], "errorMessage": "IED not yet executed"}, {"pc": [2371, 5297], "errorMessage": "Insufficient remaining D-ASA units"}, {"pc": [2574, 2641], "errorMessage": "Insufficient sender units to transfer"}, {"pc": [1835, 3022, 3040, 3096, 3603, 3641, 5482, 5760, 5820, 6203], "errorMessage": "Invalid ACTUS configuration"}, {"pc": [1948, 2352, 2535, 2550, 2708, 2781, 2844, 2886, 5109, 5234], "errorMessage": "Invalid account holding address"}, {"pc": [4564, 4588, 4612, 4636, 4660, 4717, 4745, 4767, 4789, 4811, 4990, 5008, 5023, 5038, 5053], "errorMessage": "Invalid account role address"}, {"pc": [3082], "errorMessage": "Invalid day-count convention ID"}, {"pc": [1347, 3755, 4089, 5792], "errorMessage": "Invalid event cursor"}, {"pc": [3588, 3654, 3933, 5398], "errorMessage": "Invalid event id"}, {"pc": [3768, 4153, 4160], "errorMessage": "Invalid event type"}, {"pc": [4701, 4980, 6611], "errorMessage": "Invalid role identifier"}, {"pc": [3486, 3666, 3674, 3989, 5413, 5429], "errorMessage": "Invalid schedule page"}, {"pc": [5345], "errorMessage": "No D-ASA units"}, {"pc": [1353, 1864, 2045, 5801], "errorMessage": "No due cashflow to pay"}, {"pc": [5883], "errorMessage": "Not IED event"}, {"pc": [1993, 2326, 2522, 2698, 2754, 2764, 2850, 4188, 4834, 6533], "errorMessage": "Not authorized"}, {"pc": [1474, 1482, 2094, 2168, 2177], "errorMessage": "Not enough funds for the payment"}, {"pc": [3905, 3918], "errorMessage": "Observed event required to execute this action"}, {"pc": [2340, 2388], "errorMessage": "Primary distribution is closed"}, {"pc": [5832], "errorMessage": "Primary distribution is not complete"}, {"pc": [2563], "errorMessage": "Sender and receiver must be different"}, {"pc": [5095, 6549], "errorMessage": "Suspended operations"}, {"pc": [2275, 3631], "errorMessage": "Time events must be sorted in strictly ascending order"}, {"pc": [2496, 2513], "errorMessage": "Transfer is closed"}, {"pc": [2567], "errorMessage": "Transfer units must be greater than zero"}, {"pc": [988], "errorMessage": "Wrong Global Bytes allocation"}, {"pc": [994], "errorMessage": "Wrong Global UInts allocation"}, {"pc": [998], "errorMessage": "Wrong Local Bytes allocation"}, {"pc": [1002], "errorMessage": "Wrong Local UInts allocation"}, {"pc": [1455, 2087], "errorMessage": "account opted into asset"}, {"pc": [6493, 6508], "errorMessage": "check BoxMap entry exists"}, {"pc": [1984, 2022, 2063, 2101, 2392, 2570, 2630, 2656, 5089, 5255], "errorMessage": "check self.account entry exists"}, {"pc": [1536, 1762, 1847, 4283, 5919, 6222], "errorMessage": "check self.accrued_interest exists"}, {"pc": [4852, 6531], "errorMessage": "check self.arranger exists"}, {"pc": [6539], "errorMessage": "check self.asset_defaulted exists"}, {"pc": [6547], "errorMessage": "check self.asset_suspended exists"}, {"pc": [3030, 3475, 3901, 3913, 4231, 5644], "errorMessage": "check self.contract_type exists"}, {"pc": [1504, 4288, 5117, 5195], "errorMessage": "check self.cumulative_interest_index exists"}, {"pc": [1516, 4293, 5128, 5203], "errorMessage": "check self.cumulative_principal_index exists"}, {"pc": [5654], "errorMessage": "check self.dynamic_principal_redemption exists"}, {"pc": [1271, 1284, 1345, 1586, 2578, 2591, 3746, 4082, 4259, 4376, 4389, 4426, 5210, 5790, 5871, 6103, 6241], "errorMessage": "check self.event_cursor exists"}, {"pc": [5143, 5157, 5350, 5379, 5710, 5718, 5745, 5765, 5954, 6067, 6228], "errorMessage": "check self.fixed_point_scale exists"}, {"pc": [5997], "errorMessage": "check self.has_rate_reset_cap exists"}, {"pc": [5970], "errorMessage": "check self.has_rate_reset_floor exists"}, {"pc": [3107, 3491, 4255, 5888], "errorMessage": "check self.initial_exchange_amount exists"}, {"pc": [2376, 2386], "errorMessage": "check self.initial_exchange_date exists"}, {"pc": [1707, 4273, 5686, 5700], "errorMessage": "check self.interest_calculation_base exists"}, {"pc": [1778, 1793], "errorMessage": "check self.next_principal_redemption exists"}, {"pc": [4278, 5678, 5705, 5750], "errorMessage": "check self.nominal_interest_rate exists"}, {"pc": [1953, 1966], "errorMessage": "check self.op_daemon exists"}, {"pc": [1607, 1674, 1699, 1752, 1803, 1811, 1832, 4268, 6207, 6287], "errorMessage": "check self.outstanding_principal exists"}, {"pc": [6005, 6019], "errorMessage": "check self.rate_reset_cap exists"}, {"pc": [5978, 5992], "errorMessage": "check self.rate_reset_floor exists"}, {"pc": [5949], "errorMessage": "check self.rate_reset_multiplier exists"}, {"pc": [6321], "errorMessage": "check self.rate_reset_next exists"}, {"pc": [5962], "errorMessage": "check self.rate_reset_spread exists"}, {"pc": [1460, 2163, 4298], "errorMessage": "check self.reserved_interest exists"}, {"pc": [1465, 1494, 2173, 2188, 4303], "errorMessage": "check self.reserved_principal exists"}, {"pc": [2363, 2411, 4250, 5292, 5825], "errorMessage": "check self.reserved_units_total exists"}, {"pc": [1276, 2583, 3751, 3931, 3949, 4072, 4264, 4381, 5394, 6112], "errorMessage": "check self.schedule_entry_count exists"}, {"pc": [3979], "errorMessage": "check self.schedule_page entry exists"}, {"pc": [1452, 2053, 2081, 6393], "errorMessage": "check self.settlement_asset_id exists"}, {"pc": [1237, 1251, 1938, 2003, 2317, 2336, 2463, 2474, 2758, 3100, 3479, 3732, 3879, 4224, 4371, 5238, 5816, 5909], "errorMessage": "check self.status exists"}, {"pc": [2369, 2422, 4245, 5343, 5374, 5830], "errorMessage": "check self.total_units exists"}, {"pc": [2501, 2511], "errorMessage": "check self.transfer_closure_date exists"}, {"pc": [2484, 2492], "errorMessage": "check self.transfer_opening_date exists"}, {"pc": [3565, 3624], "errorMessage": "index access is out of bounds"}, {"pc": [1922, 2967, 3449, 3984], "errorMessage": "invalid array length header"}, {"pc": [2688, 3437, 4824], "errorMessage": "invalid number of bytes for arc4.bool"}, {"pc": [1930], "errorMessage": "invalid number of bytes for arc4.dynamic_array"}, {"pc": [3464], "errorMessage": "invalid number of bytes for arc4.dynamic_array"}, {"pc": [1916, 2301, 2441, 2449, 2680, 2738, 2746, 2826, 2834, 2877, 2902, 4445, 4469, 4503, 4684, 4866, 4950], "errorMessage": "invalid number of bytes for arc4.static_array"}, {"pc": [1232, 2259, 2268, 2309, 2458, 3427, 3864], "errorMessage": "invalid number of bytes for arc4.uint64"}, {"pc": [4493, 4674, 4940], "errorMessage": "invalid number of bytes for arc4.uint8"}, {"pc": [2939], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.InitialKernelState"}, {"pc": [2928], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.NormalizedActusTerms"}, {"pc": [3875], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.ObservedEventRequest"}, {"pc": [2972], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.Prospectus"}, {"pc": [4514], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.RoleValidity"}, {"pc": [2956], "errorMessage": "invalid tail pointer at index 1 of (uint8[32],(len+utf8[]))"}, {"pc": [2951], "errorMessage": "invalid tuple encoding"}, {"pc": [4051], "errorMessage": "max array length exceeded"}, {"pc": [4237, 6385], "errorMessage": "overflow"}]}, "clear": {"pcOffsetMethod": "none", "sourceInfo": []}}, "templateVariables": {}}""" APP_SPEC = algokit_utils.Arc56Contract.from_json(_APP_SPEC_JSON) def _parse_abi_args(args: object | None = None) -> list[object] | None: From bcb40d98b30a2bb61aa033ec867c53594f12b1af Mon Sep 17 00:00:00 2001 From: cusma Date: Thu, 12 Mar 2026 21:17:44 +0100 Subject: [PATCH 131/244] chore: rename module --- modules/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/__init__.py b/modules/__init__.py index 8bff0f3b..00f07cbd 100644 --- a/modules/__init__.py +++ b/modules/__init__.py @@ -1,5 +1,5 @@ from .accounting import AccountingModule -from .kernel import ActusKernelModule +from .actus_kernel import ActusKernelModule from .payment_agent import PaymentAgent from .rbac import RbacModule from .transfer_agent import TransferAgent From c3e821b2373f39c45b8e79f26ec29d86693dd0a3 Mon Sep 17 00:00:00 2001 From: cusma Date: Thu, 12 Mar 2026 21:18:16 +0100 Subject: [PATCH 132/244] chore: update conftest helpers --- tests/conftest_helpers.py | 49 ++++++++++++++------------------------- 1 file changed, 18 insertions(+), 31 deletions(-) diff --git a/tests/conftest_helpers.py b/tests/conftest_helpers.py index 9ca276c2..3ba9b6df 100644 --- a/tests/conftest_helpers.py +++ b/tests/conftest_helpers.py @@ -1,4 +1,3 @@ -import dataclasses import importlib from collections.abc import Callable from typing import Any, TypeVar @@ -83,7 +82,6 @@ def create_role_account( algorand: AlgorandClient, role_account_class: type[RoleAccountType], client: Any, - role_config: bytes | None = None, rbac_assign_role_args_class: Any = None, ) -> RoleAccountType: """ @@ -93,8 +91,7 @@ def create_role_account( algorand: AlgorandClient instance role_account_class: The role account class (DAsaAccountManager, DAsaAuthority, etc.) client: The client to assign the role on - role_config: Optional role configuration bytes (defaults to basic config if None) - rbac_assign_role_args_class: The RbacAssignRoleArgs class for the specific client + rbac_assign_role_args_class: Optional generated ABI args class override Returns: Configured role account @@ -107,33 +104,23 @@ def create_role_account( min_spending_balance=INITIAL_ALGO_FUNDS, ) - if role_config is None: - role_config = utils.set_role_config() - - field_names = { - field.name for field in dataclasses.fields(rbac_assign_role_args_class) - } - if "config" in field_names: - assign_role_args = rbac_assign_role_args_class( - role_id=role_account.role_id(), - role_address=role_account.address, - config=role_config, - ) - elif "validity" in field_names: - role_module = importlib.import_module(rbac_assign_role_args_class.__module__) - role_validity_class = role_module.RoleValidity - assign_role_args = rbac_assign_role_args_class( - role_id=role_account.role_id(), - role_address=role_account.address, - validity=role_validity_class( - role_validity_start=0, - role_validity_end=2**64 - 1, - ), - ) - else: - raise TypeError( - f"Unsupported RBAC assign args shape: {rbac_assign_role_args_class.__name__}" - ) + role_module = importlib.import_module( + rbac_assign_role_args_class.__module__ + if rbac_assign_role_args_class is not None + else client.__class__.__module__ + ) + assign_role_args_class = ( + rbac_assign_role_args_class or role_module.RbacAssignRoleArgs + ) + role_validity_class = role_module.RoleValidity + assign_role_args = assign_role_args_class( + role_id=role_account.role_id(), + role_address=role_account.address, + validity=role_validity_class( + role_validity_start=0, + role_validity_end=2**64 - 1, + ), + ) client.send.rbac_assign_role(assign_role_args) return role_account From 9641deb30acd22a6da0ca21d58446c21b947eba5 Mon Sep 17 00:00:00 2001 From: cusma Date: Thu, 12 Mar 2026 21:18:26 +0100 Subject: [PATCH 133/244] chore: update conftest helpers --- tests/pam/pam_test_support.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/pam/pam_test_support.py b/tests/pam/pam_test_support.py index 333a6d44..d16542da 100644 --- a/tests/pam/pam_test_support.py +++ b/tests/pam/pam_test_support.py @@ -200,7 +200,6 @@ def setup_pam_lifecycle( algorand, utils.DAsaPrimaryDealer, client, - rbac_assign_role_args_class=RbacAssignRoleArgs, ) account_manager = role_helpers.create_role_account( algorand, From d6fe6c82aa80b201318df81290905859ded522c3 Mon Sep 17 00:00:00 2001 From: cusma Date: Thu, 12 Mar 2026 21:18:46 +0100 Subject: [PATCH 134/244] chore: update utils --- tests/utils.py | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/tests/utils.py b/tests/utils.py index db88f24b..de937bba 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -10,7 +10,6 @@ SendAppTransactionResult, SigningAccount, ) -from algosdk.abi import TupleType, UintType from algosdk.constants import min_txn_fee from algosdk.v2client.algod import AlgodClient @@ -111,24 +110,12 @@ def units(self) -> int: AccountGetPositionArgs(holding_address=self.holding_address) ).abi_return.units - @property - def unit_value(self) -> int: - return 0 - - @property - def paid_coupons(self) -> int: - return 0 - @property def suspended(self) -> bool: return self.d_asa_client.send.account_get_position( AccountGetPositionArgs(holding_address=self.holding_address) ).abi_return.suspended - @property - def principal(self) -> int: - return self.units * self.unit_value - def get_last_round(algod_client: AlgodClient) -> int: return algod_client.status()["last-round"] # type: ignore @@ -196,12 +183,6 @@ def max_fee_per_coupon(coupon_idx: int) -> AlgoAmount: ) -def set_role_config(validity_start: int = 0, validity_end: int = 2**64 - 1) -> bytes: - return TupleType([UintType(64), UintType(64)]).encode( - [validity_start, validity_end] - ) - - def get_event_from_call_result(call_result: SendAppTransactionResult) -> bytes: # Contract emits ACTUS events right before the ARC-4 (which is the last log) event = call_result.returns[0].tx_info["logs"][-2] From 9ae5a775b4b3734fd6cdd0ec5041476848713e8e Mon Sep 17 00:00:00 2001 From: cusma Date: Thu, 12 Mar 2026 21:18:55 +0100 Subject: [PATCH 135/244] ci: update matrix tests --- .github/workflows/d-asa-ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/d-asa-ci.yaml b/.github/workflows/d-asa-ci.yaml index 29fc2f13..af99b581 100644 --- a/.github/workflows/d-asa-ci.yaml +++ b/.github/workflows/d-asa-ci.yaml @@ -40,7 +40,7 @@ jobs: run: algokit project deploy localnet test-mock-module-rbac: - name: Test mock_module_rbac + name: Test RBAC Module if: '! github.event.pull_request.draft' runs-on: "ubuntu-latest" steps: From 7f72215363e7eea7e9955fb49cacf014d6fbc165 Mon Sep 17 00:00:00 2001 From: cusma Date: Thu, 12 Mar 2026 21:20:06 +0100 Subject: [PATCH 136/244] fix: deployment --- smart_contracts/d_asa/deploy_config.py | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/smart_contracts/d_asa/deploy_config.py b/smart_contracts/d_asa/deploy_config.py index 6f72c50e..417d33ab 100644 --- a/smart_contracts/d_asa/deploy_config.py +++ b/smart_contracts/d_asa/deploy_config.py @@ -1,22 +1,42 @@ import logging +import os import algokit_utils +from algosdk.constants import ZERO_ADDRESS logger = logging.getLogger(__name__) +def _get_arranger_address(*, deployer_address: str) -> str: + arranger_address = os.getenv("ARRANGER_ADDRESS") + if not arranger_address or arranger_address == ZERO_ADDRESS: + logger.info( + "ARRANGER_ADDRESS is unset or zero; defaulting arranger to DEPLOYER" + ) + return deployer_address + return arranger_address + + # define deployment behaviour based on supplied app spec def deploy() -> None: - from smart_contracts.artifacts.d_asa.dasa_client import DasaFactory + from smart_contracts.artifacts.d_asa.dasa_client import ( + ContractCreateArgs, + DasaFactory, + DasaMethodCallCreateParams, + ) algorand = algokit_utils.AlgorandClient.from_environment() deployer_ = algorand.account.from_environment("DEPLOYER") + arranger_address = _get_arranger_address(deployer_address=deployer_.address) factory = algorand.client.get_typed_app_factory( DasaFactory, default_sender=deployer_.address ) factory.deploy( + create_params=DasaMethodCallCreateParams( + args=ContractCreateArgs(arranger=arranger_address) + ), on_update=algokit_utils.OnUpdate.AppendApp, on_schema_break=algokit_utils.OnSchemaBreak.AppendApp, ) From d729373ec285389fa560e9d5dd58264ebd190511 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 12 Mar 2026 20:23:35 +0000 Subject: [PATCH 137/244] chore(deps-dev): bump black from 26.1.0 to 26.3.1 Bumps [black](https://github.com/psf/black) from 26.1.0 to 26.3.1. - [Release notes](https://github.com/psf/black/releases) - [Changelog](https://github.com/psf/black/blob/main/CHANGES.md) - [Commits](https://github.com/psf/black/compare/26.1.0...26.3.1) --- updated-dependencies: - dependency-name: black dependency-version: 26.3.1 dependency-type: direct:development ... Signed-off-by: dependabot[bot] --- poetry.lock | 62 +++++++++++++++++++++++++------------------------- pyproject.toml | 2 +- 2 files changed, 32 insertions(+), 32 deletions(-) diff --git a/poetry.lock b/poetry.lock index 97f2ea4f..eb715d6b 100644 --- a/poetry.lock +++ b/poetry.lock @@ -242,39 +242,39 @@ files = [ [[package]] name = "black" -version = "26.1.0" +version = "26.3.1" description = "The uncompromising code formatter." optional = false python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "black-26.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ca699710dece84e3ebf6e92ee15f5b8f72870ef984bf944a57a777a48357c168"}, - {file = "black-26.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5e8e75dabb6eb83d064b0db46392b25cabb6e784ea624219736e8985a6b3675d"}, - {file = "black-26.1.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eb07665d9a907a1a645ee41a0df8a25ffac8ad9c26cdb557b7b88eeeeec934e0"}, - {file = "black-26.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:7ed300200918147c963c87700ccf9966dceaefbbb7277450a8d646fc5646bf24"}, - {file = "black-26.1.0-cp310-cp310-win_arm64.whl", hash = "sha256:c5b7713daea9bf943f79f8c3b46f361cc5229e0e604dcef6a8bb6d1c37d9df89"}, - {file = "black-26.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3cee1487a9e4c640dc7467aaa543d6c0097c391dc8ac74eb313f2fbf9d7a7cb5"}, - {file = "black-26.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d62d14ca31c92adf561ebb2e5f2741bf8dea28aef6deb400d49cca011d186c68"}, - {file = "black-26.1.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fb1dafbbaa3b1ee8b4550a84425aac8874e5f390200f5502cf3aee4a2acb2f14"}, - {file = "black-26.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:101540cb2a77c680f4f80e628ae98bd2bd8812fb9d72ade4f8995c5ff019e82c"}, - {file = "black-26.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:6f3977a16e347f1b115662be07daa93137259c711e526402aa444d7a88fdc9d4"}, - {file = "black-26.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6eeca41e70b5f5c84f2f913af857cf2ce17410847e1d54642e658e078da6544f"}, - {file = "black-26.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:dd39eef053e58e60204f2cdf059e2442e2eb08f15989eefe259870f89614c8b6"}, - {file = "black-26.1.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9459ad0d6cd483eacad4c6566b0f8e42af5e8b583cee917d90ffaa3778420a0a"}, - {file = "black-26.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:a19915ec61f3a8746e8b10adbac4a577c6ba9851fa4a9e9fbfbcf319887a5791"}, - {file = "black-26.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:643d27fb5facc167c0b1b59d0315f2674a6e950341aed0fc05cf307d22bf4954"}, - {file = "black-26.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ba1d768fbfb6930fc93b0ecc32a43d8861ded16f47a40f14afa9bb04ab93d304"}, - {file = "black-26.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2b807c240b64609cb0e80d2200a35b23c7df82259f80bef1b2c96eb422b4aac9"}, - {file = "black-26.1.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1de0f7d01cc894066a1153b738145b194414cc6eeaad8ef4397ac9abacf40f6b"}, - {file = "black-26.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:91a68ae46bf07868963671e4d05611b179c2313301bd756a89ad4e3b3db2325b"}, - {file = "black-26.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:be5e2fe860b9bd9edbf676d5b60a9282994c03fbbd40fe8f5e75d194f96064ca"}, - {file = "black-26.1.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:9dc8c71656a79ca49b8d3e2ce8103210c9481c57798b48deeb3a8bb02db5f115"}, - {file = "black-26.1.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:b22b3810451abe359a964cc88121d57f7bce482b53a066de0f1584988ca36e79"}, - {file = "black-26.1.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:53c62883b3f999f14e5d30b5a79bd437236658ad45b2f853906c7cbe79de00af"}, - {file = "black-26.1.0-cp314-cp314-win_amd64.whl", hash = "sha256:f016baaadc423dc960cdddf9acae679e71ee02c4c341f78f3179d7e4819c095f"}, - {file = "black-26.1.0-cp314-cp314-win_arm64.whl", hash = "sha256:66912475200b67ef5a0ab665011964bf924745103f51977a78b4fb92a9fc1bf0"}, - {file = "black-26.1.0-py3-none-any.whl", hash = "sha256:1054e8e47ebd686e078c0bb0eaf31e6ce69c966058d122f2c0c950311f9f3ede"}, - {file = "black-26.1.0.tar.gz", hash = "sha256:d294ac3340eef9c9eb5d29288e96dc719ff269a88e27b396340459dd85da4c58"}, + {file = "black-26.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:86a8b5035fce64f5dcd1b794cf8ec4d31fe458cf6ce3986a30deb434df82a1d2"}, + {file = "black-26.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5602bdb96d52d2d0672f24f6ffe5218795736dd34807fd0fd55ccd6bf206168b"}, + {file = "black-26.3.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6c54a4a82e291a1fee5137371ab488866b7c86a3305af4026bdd4dc78642e1ac"}, + {file = "black-26.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:6e131579c243c98f35bce64a7e08e87fb2d610544754675d4a0e73a070a5aa3a"}, + {file = "black-26.3.1-cp310-cp310-win_arm64.whl", hash = "sha256:5ed0ca58586c8d9a487352a96b15272b7fa55d139fc8496b519e78023a8dab0a"}, + {file = "black-26.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:28ef38aee69e4b12fda8dba75e21f9b4f979b490c8ac0baa7cb505369ac9e1ff"}, + {file = "black-26.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bf9bf162ed91a26f1adba8efda0b573bc6924ec1408a52cc6f82cb73ec2b142c"}, + {file = "black-26.3.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:474c27574d6d7037c1bc875a81d9be0a9a4f9ee95e62800dab3cfaadbf75acd5"}, + {file = "black-26.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:5e9d0d86df21f2e1677cc4bd090cd0e446278bcbbe49bf3659c308c3e402843e"}, + {file = "black-26.3.1-cp311-cp311-win_arm64.whl", hash = "sha256:9a5e9f45e5d5e1c5b5c29b3bd4265dcc90e8b92cf4534520896ed77f791f4da5"}, + {file = "black-26.3.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b5e6f89631eb88a7302d416594a32faeee9fb8fb848290da9d0a5f2903519fc1"}, + {file = "black-26.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:41cd2012d35b47d589cb8a16faf8a32ef7a336f56356babd9fcf70939ad1897f"}, + {file = "black-26.3.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f76ff19ec5297dd8e66eb64deda23631e642c9393ab592826fd4bdc97a4bce7"}, + {file = "black-26.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:ddb113db38838eb9f043623ba274cfaf7d51d5b0c22ecb30afe58b1bb8322983"}, + {file = "black-26.3.1-cp312-cp312-win_arm64.whl", hash = "sha256:dfdd51fc3e64ea4f35873d1b3fb25326773d55d2329ff8449139ebaad7357efb"}, + {file = "black-26.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:855822d90f884905362f602880ed8b5df1b7e3ee7d0db2502d4388a954cc8c54"}, + {file = "black-26.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8a33d657f3276328ce00e4d37fe70361e1ec7614da5d7b6e78de5426cb56332f"}, + {file = "black-26.3.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f1cd08e99d2f9317292a311dfe578fd2a24b15dbce97792f9c4d752275c1fa56"}, + {file = "black-26.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:c7e72339f841b5a237ff14f7d3880ddd0fc7f98a1199e8c4327f9a4f478c1839"}, + {file = "black-26.3.1-cp313-cp313-win_arm64.whl", hash = "sha256:afc622538b430aa4c8c853f7f63bc582b3b8030fd8c80b70fb5fa5b834e575c2"}, + {file = "black-26.3.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:2d6bfaf7fd0993b420bed691f20f9492d53ce9a2bcccea4b797d34e947318a78"}, + {file = "black-26.3.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:f89f2ab047c76a9c03f78d0d66ca519e389519902fa27e7a91117ef7611c0568"}, + {file = "black-26.3.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b07fc0dab849d24a80a29cfab8d8a19187d1c4685d8a5e6385a5ce323c1f015f"}, + {file = "black-26.3.1-cp314-cp314-win_amd64.whl", hash = "sha256:0126ae5b7c09957da2bdbd91a9ba1207453feada9e9fe51992848658c6c8e01c"}, + {file = "black-26.3.1-cp314-cp314-win_arm64.whl", hash = "sha256:92c0ec1f2cc149551a2b7b47efc32c866406b6891b0ee4625e95967c8f4acfb1"}, + {file = "black-26.3.1-py3-none-any.whl", hash = "sha256:2bd5aa94fc267d38bb21a70d7410a89f1a1d318841855f698746f8e7f51acd1b"}, + {file = "black-26.3.1.tar.gz", hash = "sha256:2c50f5063a9641c7eed7795014ba37b0f5fa227f3d408b968936e24bc0566b07"}, ] [package.dependencies] @@ -284,13 +284,13 @@ mypy-extensions = ">=0.4.3" packaging = ">=22.0" pathspec = ">=1.0.0" platformdirs = ">=2" -pytokens = ">=0.3.0" +pytokens = ">=0.4.0,<0.5.0" [package.extras] colorama = ["colorama (>=0.4.3)"] d = ["aiohttp (>=3.10)"] jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] -uvloop = ["uvloop (>=0.15.2)"] +uvloop = ["uvloop (>=0.15.2) ; sys_platform != \"win32\"", "winloop (>=0.5.0) ; sys_platform == \"win32\""] [[package]] name = "boolean-py" @@ -2753,4 +2753,4 @@ propcache = ">=0.2.1" [metadata] lock-version = "2.1" python-versions = "^3.13" -content-hash = "f000f425f54e910b120aebd9fbcbbb8a10841657f38653781d08f74c31194f87" +content-hash = "e77943c5410f86313d583383625073016904d844bfccec84db49db6b55d19f04" diff --git a/pyproject.toml b/pyproject.toml index c6a82cf0..66f3fa4b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -26,7 +26,7 @@ algorand-python = "^3.4.0" [tool.poetry.group.dev.dependencies] algokit-client-generator = "^2.2.0" -black = { extras = ["d"], version = "^26.1.0" } +black = { extras = ["d"], version = "^26.3.1" } ruff = "^0.15.4" mypy = "^1.19.1" pytest = "^9.0.2" From c6d0560ee4f5a6b7acefd7db5e5b93e316b51ecf Mon Sep 17 00:00:00 2001 From: cusma Date: Thu, 12 Mar 2026 21:47:13 +0100 Subject: [PATCH 138/244] chore: update conftest helpers --- tests/conftest.py | 19 ++ tests/conftest_helpers.py | 294 +------------------- tests/mock_module_rbac/conftest.py | 19 +- tests/pam/fcb/test_pam_fixed_coupon_bond.py | 13 +- tests/pam/pam_test_support.py | 17 +- tests/pam/zcb/test_pam_zero_coupon_bond.py | 13 +- 6 files changed, 59 insertions(+), 316 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index 96478095..d2f2e41c 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -9,6 +9,7 @@ ) from algokit_utils.config import config +from smart_contracts.artifacts.d_asa.dasa_client import DasaClient, DasaFactory from tests import utils INITIAL_ALGO_FUNDS: Final[AlgoAmount] = AlgoAmount.from_algo(10_000) @@ -83,3 +84,21 @@ def currency(algorand: AlgorandClient, bank: SigningAccount) -> utils.Currency: unit_name=DENOMINATION_ASA_UNIT, asa_to_unit=1 / 10**DENOMINATION_ASA_DECIMALS, ) + + +@pytest.fixture(scope="function") +def d_asa_client( + algorand: AlgorandClient, + arranger: SigningAccount, +) -> DasaClient: + factory = algorand.client.get_typed_app_factory( + DasaFactory, + default_sender=arranger.address, + default_signer=arranger.signer, + ) + client, _ = factory.send.create.bare() + algorand.account.ensure_funded_from_environment( + account_to_fund=client.app_address, + min_spending_balance=INITIAL_ALGO_FUNDS, + ) + return client diff --git a/tests/conftest_helpers.py b/tests/conftest_helpers.py index 3ba9b6df..962945cc 100644 --- a/tests/conftest_helpers.py +++ b/tests/conftest_helpers.py @@ -1,88 +1,23 @@ -import importlib -from collections.abc import Callable from typing import Any, TypeVar from algokit_utils import ( AlgorandClient, - AssetOptInParams, - AssetTransferParams, - CommonAppCallParams, SigningAccount, ) -from tests import utils +from smart_contracts.artifacts.d_asa.dasa_client import ( + RbacAssignRoleArgs, + RoleValidity, +) from tests.conftest import INITIAL_ALGO_FUNDS -# Type variable for client types -ClientType = TypeVar("ClientType") RoleAccountType = TypeVar("RoleAccountType", bound=SigningAccount) -def create_and_fund_client( - algorand: AlgorandClient, - factory_class: Any, - arranger: SigningAccount, - create_method_args: Any, -) -> Any: - """ - Creates a typed app client using a factory and funds it. - - Args: - algorand: AlgorandClient instance - factory_class: Factory class for the client - arranger: Account that will create the app - create_method_args: Arguments to pass to the create method - - Returns: - Created and funded client - """ - factory = algorand.client.get_typed_app_factory( - factory_class, - default_sender=arranger.address, - default_signer=arranger.signer, - ) - client, _ = factory.send.create.asset_create(create_method_args) - algorand.account.ensure_funded_from_environment( - account_to_fund=client.app_address, - min_spending_balance=INITIAL_ALGO_FUNDS, - ) - return client - - -def create_bare_client_and_fund( - algorand: AlgorandClient, - factory_class: Any, - arranger: SigningAccount, -) -> Any: - """ - Creates a bare typed app client using a factory and funds it. - - Args: - algorand: AlgorandClient instance - factory_class: Factory class for the client - arranger: Account that will create the app - - Returns: - Created and funded client - """ - factory = algorand.client.get_typed_app_factory( - factory_class, - default_sender=arranger.address, - default_signer=arranger.signer, - ) - client, _ = factory.send.create.bare() - algorand.account.ensure_funded_from_environment( - account_to_fund=client.app_address, - min_spending_balance=INITIAL_ALGO_FUNDS, - ) - return client - - def create_role_account( algorand: AlgorandClient, role_account_class: type[RoleAccountType], client: Any, - rbac_assign_role_args_class: Any = None, ) -> RoleAccountType: """ Creates and configures a role account (account_manager, authority, trustee, etc.). @@ -91,7 +26,6 @@ def create_role_account( algorand: AlgorandClient instance role_account_class: The role account class (DAsaAccountManager, DAsaAuthority, etc.) client: The client to assign the role on - rbac_assign_role_args_class: Optional generated ABI args class override Returns: Configured role account @@ -104,218 +38,14 @@ def create_role_account( min_spending_balance=INITIAL_ALGO_FUNDS, ) - role_module = importlib.import_module( - rbac_assign_role_args_class.__module__ - if rbac_assign_role_args_class is not None - else client.__class__.__module__ - ) - assign_role_args_class = ( - rbac_assign_role_args_class or role_module.RbacAssignRoleArgs - ) - role_validity_class = role_module.RoleValidity - assign_role_args = assign_role_args_class( - role_id=role_account.role_id(), - role_address=role_account.address, - validity=role_validity_class( - role_validity_start=0, - role_validity_end=2**64 - 1, - ), - ) - - client.send.rbac_assign_role(assign_role_args) - return role_account - - -def activate_client_with_config_and_funding( - algorand: AlgorandClient, - client: Any, - bank: SigningAccount, - d_asa_config: utils.DAsaConfig, - total_asa_funds: int, - asset_config_args_class: Any, -) -> Any: - """ - Activates a client by configuring it and transferring denomination assets. - - Args: - algorand: AlgorandClient instance - client: The client to activate - bank: Account that will transfer assets - d_asa_config: D-ASA configuration - total_asa_funds: Total amount of assets to transfer - asset_config_args_class: The AssetConfigArgs class for the specific client - - Returns: - The activated client - """ - client.send.asset_config(asset_config_args_class(**d_asa_config.dictify())) - - algorand.send.asset_transfer( - AssetTransferParams( - asset_id=d_asa_config.denomination_asset_id, - amount=total_asa_funds, - receiver=client.app_address, - sender=bank.address, - signer=bank.signer, - ) - ) - - return client - - -def build_account_factory( - algorand: AlgorandClient, - currency: utils.Currency, - account_manager: utils.DAsaAccountManager, - account_open_args_class: Any, -) -> Callable[[Any], utils.DAsaAccount]: - """ - Builds a factory function for creating D-ASA accounts. - - Args: - algorand: AlgorandClient instance - currency: Currency configuration - account_manager: Account manager for opening accounts - account_open_args_class: The AccountOpenArgs class for the specific client - - Returns: - Factory function that creates D-ASA accounts - """ - - def _factory(client: Any) -> utils.DAsaAccount: - account = algorand.account.random() - - algorand.account.ensure_funded_from_environment( - account_to_fund=account.address, - min_spending_balance=INITIAL_ALGO_FUNDS, - ) - - algorand.send.asset_opt_in( - AssetOptInParams( - asset_id=currency.id, - sender=account.address, - signer=account.signer, - ) - ) - - client.send.account_open( - account_open_args_class( - holding_address=account.address, - payment_address=account.address, - ), - params=CommonAppCallParams(sender=account_manager.address), - ) - return utils.DAsaAccount( - d_asa_client=client, - holding_address=account.address, - private_key=account.private_key, - ) - - return _factory - - -def build_account_with_units_factory( - account_factory: Callable[[Any], utils.DAsaAccount], - primary_dealer: utils.DAsaPrimaryDealer, - client: Any, - primary_distribution_args_class: Any, - initial_units: int, -) -> Callable[..., utils.DAsaAccount]: - """ - Builds a factory function for creating D-ASA accounts with units. - - Args: - account_factory: Factory for creating basic accounts - primary_dealer: Primary dealer for distributing units - client: The client to use for distribution - primary_distribution_args_class: The PrimaryDistributionArgs class - initial_units: Default number of units to distribute - - Returns: - Factory function that creates accounts with units - """ - - def _factory(*, units: int = initial_units) -> utils.DAsaAccount: - account = account_factory(client) - client.send.primary_distribution( - primary_distribution_args_class( - holding_address=account.holding_address, - units=units, + client.send.rbac_assign_role( + RbacAssignRoleArgs( + role_id=role_account.role_id(), + role_address=role_account.address, + validity=RoleValidity( + role_validity_start=0, + role_validity_end=2**64 - 1, ), - params=CommonAppCallParams(sender=primary_dealer.address), - ) - return account - - return _factory - - -def set_client_to_primary_phase( - client: Any, - set_secondary_time_events_args_class: Any, - secondary_market_time_events: list[int], -) -> Any: - """ - Sets a client to primary distribution phase. - - Args: - client: The client to update - set_secondary_time_events_args_class: The SetSecondaryTimeEventsArgs class - secondary_market_time_events: List of secondary market time events - - Returns: - The updated client - """ - client.send.set_secondary_time_events( - set_secondary_time_events_args_class( - secondary_market_time_events=secondary_market_time_events ) ) - state = client.state.global_state - utils.time_warp(state.primary_distribution_opening_date) - return client - - -def suspend_client( - client: Any, - authority: utils.DAsaAuthority, - rbac_gov_asset_suspension_args_class: Any, -) -> Any: - """ - Suspends a client. - - Args: - client: The client to suspend - authority: Authority account - rbac_gov_asset_suspension_args_class: The RbacGovAssetSuspensionArgs class - - Returns: - The suspended client - """ - client.send.rbac_gov_asset_suspension( - rbac_gov_asset_suspension_args_class(suspended=True), - params=CommonAppCallParams(sender=authority.address), - ) - return client - - -def set_client_to_default( - client: Any, - trustee: utils.DAsaTrustee, - set_default_status_args_class: Any, -) -> Any: - """ - Sets a client to defaulted status. - - Args: - client: The client to default - trustee: Trustee account - set_default_status_args_class: The SetDefaultStatusArgs class - - Returns: - The defaulted client - """ - client.send.set_default_status( - set_default_status_args_class(defaulted=True), - params=CommonAppCallParams(sender=trustee.address), - ) - return client + return role_account diff --git a/tests/mock_module_rbac/conftest.py b/tests/mock_module_rbac/conftest.py index 9bc8fce7..ed32e766 100644 --- a/tests/mock_module_rbac/conftest.py +++ b/tests/mock_module_rbac/conftest.py @@ -4,10 +4,10 @@ from smart_contracts.artifacts.mock_module_rbac.mock_rbac_module_client import ( MockRbacModuleClient, MockRbacModuleFactory, - RbacAssignRoleArgs, ) from tests import conftest_helpers as helpers from tests import utils +from tests.conftest import INITIAL_ALGO_FUNDS @pytest.fixture(scope="function") @@ -15,11 +15,17 @@ def rbac_client( algorand: AlgorandClient, arranger: SigningAccount, ) -> MockRbacModuleClient: - return helpers.create_bare_client_and_fund( - algorand, + factory = algorand.client.get_typed_app_factory( MockRbacModuleFactory, - arranger, + default_sender=arranger.address, + default_signer=arranger.signer, + ) + client, _ = factory.send.create.bare() + algorand.account.ensure_funded_from_environment( + account_to_fund=client.app_address, + min_spending_balance=INITIAL_ALGO_FUNDS, ) + return client @pytest.fixture(scope="function") @@ -31,7 +37,6 @@ def authority( algorand, utils.DAsaAuthority, rbac_client, - rbac_assign_role_args_class=RbacAssignRoleArgs, ) @@ -44,7 +49,6 @@ def trustee( algorand, utils.DAsaTrustee, rbac_client, - rbac_assign_role_args_class=RbacAssignRoleArgs, ) @@ -57,7 +61,6 @@ def account_manager( algorand, utils.DAsaAccountManager, rbac_client, - rbac_assign_role_args_class=RbacAssignRoleArgs, ) @@ -70,7 +73,6 @@ def primary_dealer( algorand, utils.DAsaPrimaryDealer, rbac_client, - rbac_assign_role_args_class=RbacAssignRoleArgs, ) @@ -83,5 +85,4 @@ def interest_oracle( algorand, utils.DAsaInterestOracle, rbac_client, - rbac_assign_role_args_class=RbacAssignRoleArgs, ) diff --git a/tests/pam/fcb/test_pam_fixed_coupon_bond.py b/tests/pam/fcb/test_pam_fixed_coupon_bond.py index c782bc72..592ea6e4 100644 --- a/tests/pam/fcb/test_pam_fixed_coupon_bond.py +++ b/tests/pam/fcb/test_pam_fixed_coupon_bond.py @@ -28,7 +28,6 @@ ISSUANCE_DELAY_CYCLE, MINIMUM_DENOMINATION, PRINCIPAL, - asset_balance, cycle_duration_seconds, scale_currency_amount, setup_pam_lifecycle, @@ -226,9 +225,9 @@ def test_fixed_coupon_pam_full_lifecycle( assert event["settled_amount"] == funding.total_funded assert event["sequence"] == schedule_index + 1 - balance_before = asset_balance( - algorand, address=investor.address, asset_id=currency.id - ) + balance_before = algorand.asset.get_account_information( + investor.address, currency.id + ).balance claim_result = client.send.claim_due_cashflows( ClaimDueCashflowsArgs( holding_address=investor.address, @@ -242,9 +241,9 @@ def test_fixed_coupon_pam_full_lifecycle( send_params=SendParams(cover_app_call_inner_transaction_fees=True), ) claim = claim_result.abi_return - balance_after = asset_balance( - algorand, address=investor.address, asset_id=currency.id - ) + balance_after = algorand.asset.get_account_information( + investor.address, currency.id + ).balance assert claim.total_amount == funding.total_funded assert balance_after - balance_before == claim.total_amount diff --git a/tests/pam/pam_test_support.py b/tests/pam/pam_test_support.py index d16542da..5e2c055a 100644 --- a/tests/pam/pam_test_support.py +++ b/tests/pam/pam_test_support.py @@ -24,7 +24,6 @@ NormalizedActusTerms, PrimaryDistributionArgs, Prospectus, - RbacAssignRoleArgs, ) from src import NormalizationResult from src.registry import EVENT_TYPE_IDS @@ -44,12 +43,6 @@ class PamLifecycleContext: receiver: SigningAccount -def asset_balance(algorand: AlgorandClient, *, address: str, asset_id: int) -> int: - return algorand.client.algod.account_asset_info(address, asset_id)["asset-holding"][ - "amount" - ] - - def client_terms(result: NormalizationResult) -> NormalizedActusTerms: return NormalizedActusTerms( contract_type=result.terms.contract_type, @@ -205,7 +198,6 @@ def setup_pam_lifecycle( algorand, utils.DAsaAccountManager, client, - rbac_assign_role_args_class=RbacAssignRoleArgs, ) investor = algorand.account.random() @@ -250,7 +242,7 @@ def setup_pam_lifecycle( ) assert ( - asset_balance(algorand, address=investor.address, asset_id=currency.id) + algorand.asset.get_account_information(investor.address, currency.id).balance == investor_payment_amount ) @@ -276,9 +268,12 @@ def setup_pam_lifecycle( ), ).send() - assert asset_balance(algorand, address=investor.address, asset_id=currency.id) == 0 assert ( - asset_balance(algorand, address=client.app_address, asset_id=currency.id) + algorand.asset.get_account_information(investor.address, currency.id).balance + == 0 + ) + assert ( + algorand.asset.get_account_information(client.app_address, currency.id).balance == bank_funding_amount + investor_payment_amount ) diff --git a/tests/pam/zcb/test_pam_zero_coupon_bond.py b/tests/pam/zcb/test_pam_zero_coupon_bond.py index 0a869147..1bcc7c0c 100644 --- a/tests/pam/zcb/test_pam_zero_coupon_bond.py +++ b/tests/pam/zcb/test_pam_zero_coupon_bond.py @@ -28,7 +28,6 @@ ISSUANCE_DELAY_CYCLE, MINIMUM_DENOMINATION, PRINCIPAL, - asset_balance, cycle_duration_seconds, scale_currency_amount, setup_pam_lifecycle, @@ -180,9 +179,9 @@ def test_zero_coupon_pam_discounted_full_lifecycle( assert event["settled_amount"] == scaled_principal assert event["sequence"] == 2 - balance_before = asset_balance( - algorand, address=investor.address, asset_id=currency.id - ) + balance_before = algorand.asset.get_account_information( + investor.address, currency.id + ).balance claim_result = client.send.claim_due_cashflows( ClaimDueCashflowsArgs( holding_address=investor.address, @@ -196,9 +195,9 @@ def test_zero_coupon_pam_discounted_full_lifecycle( send_params=SendParams(cover_app_call_inner_transaction_fees=True), ) claim = claim_result.abi_return - balance_after = asset_balance( - algorand, address=investor.address, asset_id=currency.id - ) + balance_after = algorand.asset.get_account_information( + investor.address, currency.id + ).balance assert claim.total_amount == scaled_principal assert claim.interest_amount == 0 From 29cb5b146ab8f32857bc1b51285f2e1e73488072 Mon Sep 17 00:00:00 2001 From: cusma Date: Thu, 12 Mar 2026 21:52:36 +0100 Subject: [PATCH 139/244] chore: bump dependencies --- poetry.lock | 601 +++++++++++++++++++++++++------------------------ pyproject.toml | 2 +- 2 files changed, 309 insertions(+), 294 deletions(-) diff --git a/poetry.lock b/poetry.lock index eb715d6b..96b9cd75 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 2.2.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.3.2 and should not be changed by hand. [[package]] name = "aiohappyeyeballs" @@ -360,14 +360,14 @@ ujson = ["ujson (>=5.10.0)"] [[package]] name = "certifi" -version = "2026.1.4" +version = "2026.2.25" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.7" groups = ["main", "dev"] files = [ - {file = "certifi-2026.1.4-py3-none-any.whl", hash = "sha256:9943707519e4add1115f44c2bc244f782c0249876bf51b6599fee1ffbedd685c"}, - {file = "certifi-2026.1.4.tar.gz", hash = "sha256:ac726dd470482006e014ad384921ed6438c457018f4b3d204aea4281258b2120"}, + {file = "certifi-2026.2.25-py3-none-any.whl", hash = "sha256:027692e4402ad994f1c42e52a4997a9763c646b73e4096e4d5d6db8af1d6f0fa"}, + {file = "certifi-2026.2.25.tar.gz", hash = "sha256:e887ab5cee78ea814d3472169153c2d12cd43b14bd03329a39a9c6e2e80bfba7"}, ] [[package]] @@ -482,125 +482,125 @@ files = [ [[package]] name = "charset-normalizer" -version = "3.4.4" +version = "3.4.5" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7" groups = ["dev"] files = [ - {file = "charset_normalizer-3.4.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e824f1492727fa856dd6eda4f7cee25f8518a12f3c4a56a74e8095695089cf6d"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4bd5d4137d500351a30687c2d3971758aac9a19208fc110ccb9d7188fbe709e8"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:027f6de494925c0ab2a55eab46ae5129951638a49a34d87f4c3eda90f696b4ad"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f820802628d2694cb7e56db99213f930856014862f3fd943d290ea8438d07ca8"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:798d75d81754988d2565bff1b97ba5a44411867c0cf32b77a7e8f8d84796b10d"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d1bb833febdff5c8927f922386db610b49db6e0d4f4ee29601d71e7c2694313"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9cd98cdc06614a2f768d2b7286d66805f94c48cde050acdbbb7db2600ab3197e"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:077fbb858e903c73f6c9db43374fd213b0b6a778106bc7032446a8e8b5b38b93"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:244bfb999c71b35de57821b8ea746b24e863398194a4014e4c76adc2bbdfeff0"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:64b55f9dce520635f018f907ff1b0df1fdc31f2795a922fb49dd14fbcdf48c84"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:faa3a41b2b66b6e50f84ae4a68c64fcd0c44355741c6374813a800cd6695db9e"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:6515f3182dbe4ea06ced2d9e8666d97b46ef4c75e326b79bb624110f122551db"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cc00f04ed596e9dc0da42ed17ac5e596c6ccba999ba6bd92b0e0aef2f170f2d6"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-win32.whl", hash = "sha256:f34be2938726fc13801220747472850852fe6b1ea75869a048d6f896838c896f"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:a61900df84c667873b292c3de315a786dd8dac506704dea57bc957bd31e22c7d"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-win_arm64.whl", hash = "sha256:cead0978fc57397645f12578bfd2d5ea9138ea0fac82b2f63f7f7c6877986a69"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6e1fcf0720908f200cd21aa4e6750a48ff6ce4afe7ff5a79a90d5ed8a08296f8"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f819d5fe9234f9f82d75bdfa9aef3a3d72c4d24a6e57aeaebba32a704553aa0"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a59cb51917aa591b1c4e6a43c132f0cdc3c76dbad6155df4e28ee626cc77a0a3"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8ef3c867360f88ac904fd3f5e1f902f13307af9052646963ee08ff4f131adafc"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d9e45d7faa48ee908174d8fe84854479ef838fc6a705c9315372eacbc2f02897"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:840c25fb618a231545cbab0564a799f101b63b9901f2569faecd6b222ac72381"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ca5862d5b3928c4940729dacc329aa9102900382fea192fc5e52eb69d6093815"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d9c7f57c3d666a53421049053eaacdd14bbd0a528e2186fcb2e672effd053bb0"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:277e970e750505ed74c832b4bf75dac7476262ee2a013f5574dd49075879e161"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:31fd66405eaf47bb62e8cd575dc621c56c668f27d46a61d975a249930dd5e2a4"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:0d3d8f15c07f86e9ff82319b3d9ef6f4bf907608f53fe9d92b28ea9ae3d1fd89"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:9f7fcd74d410a36883701fafa2482a6af2ff5ba96b9a620e9e0721e28ead5569"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ebf3e58c7ec8a8bed6d66a75d7fb37b55e5015b03ceae72a8e7c74495551e224"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-win32.whl", hash = "sha256:eecbc200c7fd5ddb9a7f16c7decb07b566c29fa2161a16cf67b8d068bd21690a"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:5ae497466c7901d54b639cf42d5b8c1b6a4fead55215500d2f486d34db48d016"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-win_arm64.whl", hash = "sha256:65e2befcd84bc6f37095f5961e68a6f077bf44946771354a28ad434c2cce0ae1"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0a98e6759f854bd25a58a73fa88833fba3b7c491169f86ce1180c948ab3fd394"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b5b290ccc2a263e8d185130284f8501e3e36c5e02750fc6b6bdeb2e9e96f1e25"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74bb723680f9f7a6234dcf67aea57e708ec1fbdf5699fb91dfd6f511b0a320ef"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f1e34719c6ed0b92f418c7c780480b26b5d9c50349e9a9af7d76bf757530350d"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2437418e20515acec67d86e12bf70056a33abdacb5cb1655042f6538d6b085a8"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11d694519d7f29d6cd09f6ac70028dba10f92f6cdd059096db198c283794ac86"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ac1c4a689edcc530fc9d9aa11f5774b9e2f33f9a0c6a57864e90908f5208d30a"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:21d142cc6c0ec30d2efee5068ca36c128a30b0f2c53c1c07bd78cb6bc1d3be5f"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:5dbe56a36425d26d6cfb40ce79c314a2e4dd6211d51d6d2191c00bed34f354cc"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5bfbb1b9acf3334612667b61bd3002196fe2a1eb4dd74d247e0f2a4d50ec9bbf"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:d055ec1e26e441f6187acf818b73564e6e6282709e9bcb5b63f5b23068356a15"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:af2d8c67d8e573d6de5bc30cdb27e9b95e49115cd9baad5ddbd1a6207aaa82a9"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:780236ac706e66881f3b7f2f32dfe90507a09e67d1d454c762cf642e6e1586e0"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-win32.whl", hash = "sha256:5833d2c39d8896e4e19b689ffc198f08ea58116bee26dea51e362ecc7cd3ed26"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:a79cfe37875f822425b89a82333404539ae63dbdddf97f84dcbc3d339aae9525"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-win_arm64.whl", hash = "sha256:376bec83a63b8021bb5c8ea75e21c4ccb86e7e45ca4eb81146091b56599b80c3"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e1f185f86a6f3403aa2420e815904c67b2f9ebc443f045edd0de921108345794"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b39f987ae8ccdf0d2642338faf2abb1862340facc796048b604ef14919e55ed"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3162d5d8ce1bb98dd51af660f2121c55d0fa541b46dff7bb9b9f86ea1d87de72"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:81d5eb2a312700f4ecaa977a8235b634ce853200e828fbadf3a9c50bab278328"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5bd2293095d766545ec1a8f612559f6b40abc0eb18bb2f5d1171872d34036ede"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8a8b89589086a25749f471e6a900d3f662d1d3b6e2e59dcecf787b1cc3a1894"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc7637e2f80d8530ee4a78e878bce464f70087ce73cf7c1caf142416923b98f1"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f8bf04158c6b607d747e93949aa60618b61312fe647a6369f88ce2ff16043490"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:554af85e960429cf30784dd47447d5125aaa3b99a6f0683589dbd27e2f45da44"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:74018750915ee7ad843a774364e13a3db91682f26142baddf775342c3f5b1133"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c0463276121fdee9c49b98908b3a89c39be45d86d1dbaa22957e38f6321d4ce3"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:362d61fd13843997c1c446760ef36f240cf81d3ebf74ac62652aebaf7838561e"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a26f18905b8dd5d685d6d07b0cdf98a79f3c7a918906af7cc143ea2e164c8bc"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-win32.whl", hash = "sha256:9b35f4c90079ff2e2edc5b26c0c77925e5d2d255c42c74fdb70fb49b172726ac"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-win_amd64.whl", hash = "sha256:b435cba5f4f750aa6c0a0d92c541fb79f69a387c91e61f1795227e4ed9cece14"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-win_arm64.whl", hash = "sha256:542d2cee80be6f80247095cc36c418f7bddd14f4a6de45af91dfad36d817bba2"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:da3326d9e65ef63a817ecbcc0df6e94463713b754fe293eaa03da99befb9a5bd"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8af65f14dc14a79b924524b1e7fffe304517b2bff5a58bf64f30b98bbc5079eb"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74664978bb272435107de04e36db5a9735e78232b85b77d45cfb38f758efd33e"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:752944c7ffbfdd10c074dc58ec2d5a8a4cd9493b314d367c14d24c17684ddd14"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d1f13550535ad8cff21b8d757a3257963e951d96e20ec82ab44bc64aeb62a191"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ecaae4149d99b1c9e7b88bb03e3221956f68fd6d50be2ef061b2381b61d20838"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cb6254dc36b47a990e59e1068afacdcd02958bdcce30bb50cc1700a8b9d624a6"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c8ae8a0f02f57a6e61203a31428fa1d677cbe50c93622b4149d5c0f319c1d19e"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:47cc91b2f4dd2833fddaedd2893006b0106129d4b94fdb6af1f4ce5a9965577c"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:82004af6c302b5d3ab2cfc4cc5f29db16123b1a8417f2e25f9066f91d4411090"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:2b7d8f6c26245217bd2ad053761201e9f9680f8ce52f0fcd8d0755aeae5b2152"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:799a7a5e4fb2d5898c60b640fd4981d6a25f1c11790935a44ce38c54e985f828"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:99ae2cffebb06e6c22bdc25801d7b30f503cc87dbd283479e7b606f70aff57ec"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-win32.whl", hash = "sha256:f9d332f8c2a2fcbffe1378594431458ddbef721c1769d78e2cbc06280d8155f9"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-win_amd64.whl", hash = "sha256:8a6562c3700cce886c5be75ade4a5db4214fda19fede41d9792d100288d8f94c"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-win_arm64.whl", hash = "sha256:de00632ca48df9daf77a2c65a484531649261ec9f25489917f09e455cb09ddb2"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ce8a0633f41a967713a59c4139d29110c07e826d131a316b50ce11b1d79b4f84"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eaabd426fe94daf8fd157c32e571c85cb12e66692f15516a83a03264b08d06c3"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c4ef880e27901b6cc782f1b95f82da9313c0eb95c3af699103088fa0ac3ce9ac"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2aaba3b0819274cc41757a1da876f810a3e4d7b6eb25699253a4effef9e8e4af"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:778d2e08eda00f4256d7f672ca9fef386071c9202f5e4607920b86d7803387f2"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f155a433c2ec037d4e8df17d18922c3a0d9b3232a396690f17175d2946f0218d"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a8bf8d0f749c5757af2142fe7903a9df1d2e8aa3841559b2bad34b08d0e2bcf3"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:194f08cbb32dc406d6e1aea671a68be0823673db2832b38405deba2fb0d88f63"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:6aee717dcfead04c6eb1ce3bd29ac1e22663cdea57f943c87d1eab9a025438d7"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:cd4b7ca9984e5e7985c12bc60a6f173f3c958eae74f3ef6624bb6b26e2abbae4"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_riscv64.whl", hash = "sha256:b7cf1017d601aa35e6bb650b6ad28652c9cd78ee6caff19f3c28d03e1c80acbf"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:e912091979546adf63357d7e2ccff9b44f026c075aeaf25a52d0e95ad2281074"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:5cb4d72eea50c8868f5288b7f7f33ed276118325c1dfd3957089f6b519e1382a"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-win32.whl", hash = "sha256:837c2ce8c5a65a2035be9b3569c684358dfbf109fd3b6969630a87535495ceaa"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:44c2a8734b333e0578090c4cd6b16f275e07aa6614ca8715e6c038e865e70576"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a9768c477b9d7bd54bc0c86dbaebdec6f03306675526c9927c0e8a04e8f94af9"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1bee1e43c28aa63cb16e5c14e582580546b08e535299b8b6158a7c9c768a1f3d"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:fd44c878ea55ba351104cb93cc85e74916eb8fa440ca7903e57575e97394f608"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0f04b14ffe5fdc8c4933862d8306109a2c51e0704acfa35d51598eb45a1e89fc"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:cd09d08005f958f370f539f186d10aec3377d55b9eeb0d796025d4886119d76e"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4fe7859a4e3e8457458e2ff592f15ccb02f3da787fcd31e0183879c3ad4692a1"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fa09f53c465e532f4d3db095e0c55b615f010ad81803d383195b6b5ca6cbf5f3"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:7fa17817dc5625de8a027cb8b26d9fefa3ea28c8253929b8d6649e705d2835b6"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:5947809c8a2417be3267efc979c47d76a079758166f7d43ef5ae8e9f92751f88"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:4902828217069c3c5c71094537a8e623f5d097858ac6ca8252f7b4d10b7560f1"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:7c308f7e26e4363d79df40ca5b2be1c6ba9f02bdbccfed5abddb7859a6ce72cf"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:2c9d3c380143a1fedbff95a312aa798578371eb29da42106a29019368a475318"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:cb01158d8b88ee68f15949894ccc6712278243d95f344770fa7593fa2d94410c"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-win32.whl", hash = "sha256:2677acec1a2f8ef614c6888b5b4ae4060cc184174a938ed4e8ef690e15d3e505"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:f8e160feb2aed042cd657a72acc0b481212ed28b1b9a95c0cee1621b524e1966"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-win_arm64.whl", hash = "sha256:b5d84d37db046c5ca74ee7bb47dd6cbc13f80665fdde3e8040bdd3fb015ecb50"}, - {file = "charset_normalizer-3.4.4-py3-none-any.whl", hash = "sha256:7a32c560861a02ff789ad905a2fe94e3f840803362c84fecf1851cb4cf3dc37f"}, - {file = "charset_normalizer-3.4.4.tar.gz", hash = "sha256:94537985111c35f28720e43603b8e7b43a6ecfb2ce1d3058bbe955b73404e21a"}, + {file = "charset_normalizer-3.4.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4167a621a9a1a986c73777dbc15d4b5eac8ac5c10393374109a343d4013ec765"}, + {file = "charset_normalizer-3.4.5-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3f64c6bf8f32f9133b668c7f7a7cbdbc453412bc95ecdbd157f3b1e377a92990"}, + {file = "charset_normalizer-3.4.5-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:568e3c34b58422075a1b49575a6abc616d9751b4d61b23f712e12ebb78fe47b2"}, + {file = "charset_normalizer-3.4.5-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:036c079aa08a6a592b82487f97c60b439428320ed1b2ea0b3912e99d30c77765"}, + {file = "charset_normalizer-3.4.5-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:340810d34ef83af92148e96e3e44cb2d3f910d2bf95e5618a5c467d9f102231d"}, + {file = "charset_normalizer-3.4.5-cp310-cp310-manylinux_2_31_armv7l.whl", hash = "sha256:cd2d0f0ec9aa977a27731a3209ebbcacebebaf41f902bd453a928bfd281cf7f8"}, + {file = "charset_normalizer-3.4.5-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0b362bcd27819f9c07cbf23db4e0e8cd4b44c5ecd900c2ff907b2b92274a7412"}, + {file = "charset_normalizer-3.4.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:77be992288f720306ab4108fe5c74797de327f3248368dfc7e1a916d6ed9e5a2"}, + {file = "charset_normalizer-3.4.5-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:8b78d8a609a4b82c273257ee9d631ded7fac0d875bdcdccc109f3ee8328cfcb1"}, + {file = "charset_normalizer-3.4.5-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ba20bdf69bd127f66d0174d6f2a93e69045e0b4036dc1ca78e091bcc765830c4"}, + {file = "charset_normalizer-3.4.5-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:76a9d0de4d0eab387822e7b35d8f89367dd237c72e82ab42b9f7bf5e15ada00f"}, + {file = "charset_normalizer-3.4.5-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8fff79bf5978c693c9b1a4d71e4a94fddfb5fe744eb062a318e15f4a2f63a550"}, + {file = "charset_normalizer-3.4.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c7e84e0c0005e3bdc1a9211cd4e62c78ba80bc37b2365ef4410cd2007a9047f2"}, + {file = "charset_normalizer-3.4.5-cp310-cp310-win32.whl", hash = "sha256:58ad8270cfa5d4bef1bc85bd387217e14ff154d6630e976c6f56f9a040757475"}, + {file = "charset_normalizer-3.4.5-cp310-cp310-win_amd64.whl", hash = "sha256:02a9d1b01c1e12c27883b0c9349e0bcd9ae92e727ff1a277207e1a262b1cbf05"}, + {file = "charset_normalizer-3.4.5-cp310-cp310-win_arm64.whl", hash = "sha256:039215608ac7b358c4da0191d10fc76868567fbf276d54c14721bdedeb6de064"}, + {file = "charset_normalizer-3.4.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:610f72c0ee565dfb8ae1241b666119582fdbfe7c0975c175be719f940e110694"}, + {file = "charset_normalizer-3.4.5-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:60d68e820af339df4ae8358c7a2e7596badeb61e544438e489035f9fbf3246a5"}, + {file = "charset_normalizer-3.4.5-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:10b473fc8dca1c3ad8559985794815f06ca3fc71942c969129070f2c3cdf7281"}, + {file = "charset_normalizer-3.4.5-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d4eb8ac7469b2a5d64b5b8c04f84d8bf3ad340f4514b98523805cbf46e3b3923"}, + {file = "charset_normalizer-3.4.5-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5bcb3227c3d9aaf73eaaab1db7ccd80a8995c509ee9941e2aae060ca6e4e5d81"}, + {file = "charset_normalizer-3.4.5-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:75ee9c1cce2911581a70a3c0919d8bccf5b1cbc9b0e5171400ec736b4b569497"}, + {file = "charset_normalizer-3.4.5-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1d1401945cb77787dbd3af2446ff2d75912327c4c3a1526ab7955ecf8600687c"}, + {file = "charset_normalizer-3.4.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0a45e504f5e1be0bd385935a8e1507c442349ca36f511a47057a71c9d1d6ea9e"}, + {file = "charset_normalizer-3.4.5-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:e09f671a54ce70b79a1fc1dc6da3072b7ef7251fadb894ed92d9aa8218465a5f"}, + {file = "charset_normalizer-3.4.5-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:d01de5e768328646e6a3fa9e562706f8f6641708c115c62588aef2b941a4f88e"}, + {file = "charset_normalizer-3.4.5-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:131716d6786ad5e3dc542f5cc6f397ba3339dc0fb87f87ac30e550e8987756af"}, + {file = "charset_normalizer-3.4.5-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:1a374cc0b88aa710e8865dc1bd6edb3743c59f27830f0293ab101e4cf3ce9f85"}, + {file = "charset_normalizer-3.4.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d31f0d1671e1534e395f9eb84a68e0fb670e1edb1fe819a9d7f564ae3bc4e53f"}, + {file = "charset_normalizer-3.4.5-cp311-cp311-win32.whl", hash = "sha256:cace89841c0599d736d3d74a27bc5821288bb47c5441923277afc6059d7fbcb4"}, + {file = "charset_normalizer-3.4.5-cp311-cp311-win_amd64.whl", hash = "sha256:f8102ae93c0bc863b1d41ea0f4499c20a83229f52ed870850892df555187154a"}, + {file = "charset_normalizer-3.4.5-cp311-cp311-win_arm64.whl", hash = "sha256:ed98364e1c262cf5f9363c3eca8c2df37024f52a8fa1180a3610014f26eac51c"}, + {file = "charset_normalizer-3.4.5-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ed97c282ee4f994ef814042423a529df9497e3c666dca19be1d4cd1129dc7ade"}, + {file = "charset_normalizer-3.4.5-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0294916d6ccf2d069727d65973c3a1ca477d68708db25fd758dd28b0827cff54"}, + {file = "charset_normalizer-3.4.5-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:dc57a0baa3eeedd99fafaef7511b5a6ef4581494e8168ee086031744e2679467"}, + {file = "charset_normalizer-3.4.5-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ed1a9a204f317ef879b32f9af507d47e49cd5e7f8e8d5d96358c98373314fc60"}, + {file = "charset_normalizer-3.4.5-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7ad83b8f9379176c841f8865884f3514d905bcd2a9a3b210eaa446e7d2223e4d"}, + {file = "charset_normalizer-3.4.5-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:a118e2e0b5ae6b0120d5efa5f866e58f2bb826067a646431da4d6a2bdae7950e"}, + {file = "charset_normalizer-3.4.5-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:754f96058e61a5e22e91483f823e07df16416ce76afa4ebf306f8e1d1296d43f"}, + {file = "charset_normalizer-3.4.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0c300cefd9b0970381a46394902cd18eaf2aa00163f999590ace991989dcd0fc"}, + {file = "charset_normalizer-3.4.5-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:c108f8619e504140569ee7de3f97d234f0fbae338a7f9f360455071ef9855a95"}, + {file = "charset_normalizer-3.4.5-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:d1028de43596a315e2720a9849ee79007ab742c06ad8b45a50db8cdb7ed4a82a"}, + {file = "charset_normalizer-3.4.5-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:19092dde50335accf365cce21998a1c6dd8eafd42c7b226eb54b2747cdce2fac"}, + {file = "charset_normalizer-3.4.5-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4354e401eb6dab9aed3c7b4030514328a6c748d05e1c3e19175008ca7de84fb1"}, + {file = "charset_normalizer-3.4.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a68766a3c58fde7f9aaa22b3786276f62ab2f594efb02d0a1421b6282e852e98"}, + {file = "charset_normalizer-3.4.5-cp312-cp312-win32.whl", hash = "sha256:1827734a5b308b65ac54e86a618de66f935a4f63a8a462ff1e19a6788d6c2262"}, + {file = "charset_normalizer-3.4.5-cp312-cp312-win_amd64.whl", hash = "sha256:728c6a963dfab66ef865f49286e45239384249672cd598576765acc2a640a636"}, + {file = "charset_normalizer-3.4.5-cp312-cp312-win_arm64.whl", hash = "sha256:75dfd1afe0b1647449e852f4fb428195a7ed0588947218f7ba929f6538487f02"}, + {file = "charset_normalizer-3.4.5-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ac59c15e3f1465f722607800c68713f9fbc2f672b9eb649fe831da4019ae9b23"}, + {file = "charset_normalizer-3.4.5-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:165c7b21d19365464e8f70e5ce5e12524c58b48c78c1f5a57524603c1ab003f8"}, + {file = "charset_normalizer-3.4.5-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:28269983f25a4da0425743d0d257a2d6921ea7d9b83599d4039486ec5b9f911d"}, + {file = "charset_normalizer-3.4.5-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d27ce22ec453564770d29d03a9506d449efbb9fa13c00842262b2f6801c48cce"}, + {file = "charset_normalizer-3.4.5-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0625665e4ebdddb553ab185de5db7054393af8879fb0c87bd5690d14379d6819"}, + {file = "charset_normalizer-3.4.5-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:c23eb3263356d94858655b3e63f85ac5d50970c6e8febcdde7830209139cc37d"}, + {file = "charset_normalizer-3.4.5-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e6302ca4ae283deb0af68d2fbf467474b8b6aedcd3dab4db187e07f94c109763"}, + {file = "charset_normalizer-3.4.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e51ae7d81c825761d941962450f50d041db028b7278e7b08930b4541b3e45cb9"}, + {file = "charset_normalizer-3.4.5-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:597d10dec876923e5c59e48dbd366e852eacb2b806029491d307daea6b917d7c"}, + {file = "charset_normalizer-3.4.5-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:5cffde4032a197bd3b42fd0b9509ec60fb70918d6970e4cc773f20fc9180ca67"}, + {file = "charset_normalizer-3.4.5-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:2da4eedcb6338e2321e831a0165759c0c620e37f8cd044a263ff67493be8ffb3"}, + {file = "charset_normalizer-3.4.5-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:65a126fb4b070d05340a84fc709dd9e7c75d9b063b610ece8a60197a291d0adf"}, + {file = "charset_normalizer-3.4.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c7a80a9242963416bd81f99349d5f3fce1843c303bd404f204918b6d75a75fd6"}, + {file = "charset_normalizer-3.4.5-cp313-cp313-win32.whl", hash = "sha256:f1d725b754e967e648046f00c4facc42d414840f5ccc670c5670f59f83693e4f"}, + {file = "charset_normalizer-3.4.5-cp313-cp313-win_amd64.whl", hash = "sha256:e37bd100d2c5d3ba35db9c7c5ba5a9228cbcffe5c4778dc824b164e5257813d7"}, + {file = "charset_normalizer-3.4.5-cp313-cp313-win_arm64.whl", hash = "sha256:93b3b2cc5cf1b8743660ce77a4f45f3f6d1172068207c1defc779a36eea6bb36"}, + {file = "charset_normalizer-3.4.5-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:8197abe5ca1ffb7d91e78360f915eef5addff270f8a71c1fc5be24a56f3e4873"}, + {file = "charset_normalizer-3.4.5-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a2aecdb364b8a1802afdc7f9327d55dad5366bc97d8502d0f5854e50712dbc5f"}, + {file = "charset_normalizer-3.4.5-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a66aa5022bf81ab4b1bebfb009db4fd68e0c6d4307a1ce5ef6a26e5878dfc9e4"}, + {file = "charset_normalizer-3.4.5-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d77f97e515688bd615c1d1f795d540f32542d514242067adcb8ef532504cb9ee"}, + {file = "charset_normalizer-3.4.5-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01a1ed54b953303ca7e310fafe0fe347aab348bd81834a0bcd602eb538f89d66"}, + {file = "charset_normalizer-3.4.5-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:b2d37d78297b39a9eb9eb92c0f6df98c706467282055419df141389b23f93362"}, + {file = "charset_normalizer-3.4.5-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e71bbb595973622b817c042bd943c3f3667e9c9983ce3d205f973f486fec98a7"}, + {file = "charset_normalizer-3.4.5-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:4cd966c2559f501c6fd69294d082c2934c8dd4719deb32c22961a5ac6db0df1d"}, + {file = "charset_normalizer-3.4.5-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:d5e52d127045d6ae01a1e821acfad2f3a1866c54d0e837828538fabe8d9d1bd6"}, + {file = "charset_normalizer-3.4.5-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:30a2b1a48478c3428d047ed9690d57c23038dac838a87ad624c85c0a78ebeb39"}, + {file = "charset_normalizer-3.4.5-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:d8ed79b8f6372ca4254955005830fd61c1ccdd8c0fac6603e2c145c61dd95db6"}, + {file = "charset_normalizer-3.4.5-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:c5af897b45fa606b12464ccbe0014bbf8c09191e0a66aab6aa9d5cf6e77e0c94"}, + {file = "charset_normalizer-3.4.5-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:1088345bcc93c58d8d8f3d783eca4a6e7a7752bbff26c3eee7e73c597c191c2e"}, + {file = "charset_normalizer-3.4.5-cp314-cp314-win32.whl", hash = "sha256:ee57b926940ba00bca7ba7041e665cc956e55ef482f851b9b65acb20d867e7a2"}, + {file = "charset_normalizer-3.4.5-cp314-cp314-win_amd64.whl", hash = "sha256:4481e6da1830c8a1cc0b746b47f603b653dadb690bcd851d039ffaefe70533aa"}, + {file = "charset_normalizer-3.4.5-cp314-cp314-win_arm64.whl", hash = "sha256:97ab7787092eb9b50fb47fa04f24c75b768a606af1bcba1957f07f128a7219e4"}, + {file = "charset_normalizer-3.4.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e22d1059b951e7ae7c20ef6b06afd10fb95e3c41bf3c4fbc874dba113321c193"}, + {file = "charset_normalizer-3.4.5-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:afca7f78067dd27c2b848f1b234623d26b87529296c6c5652168cc1954f2f3b2"}, + {file = "charset_normalizer-3.4.5-cp38-cp38-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ec56a2266f32bc06ed3c3e2a8f58417ce02f7e0356edc89786e52db13c593c98"}, + {file = "charset_normalizer-3.4.5-cp38-cp38-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2b970382e4a36bed897c19f310f31d7d13489c11b4f468ddfba42d41cddfb918"}, + {file = "charset_normalizer-3.4.5-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:573ef5814c4b7c0d59a7710aa920eaaaef383bd71626aa420fba27b5cab92e8d"}, + {file = "charset_normalizer-3.4.5-cp38-cp38-manylinux_2_31_armv7l.whl", hash = "sha256:50bcbca6603c06a1dcc7b056ed45c37715fb5d2768feb3bcd37d2313c587a5b9"}, + {file = "charset_normalizer-3.4.5-cp38-cp38-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1f2da5cbb9becfcd607757a169e38fb82aa5fd86fae6653dea716e7b613fe2cf"}, + {file = "charset_normalizer-3.4.5-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:fc1c64934b8faf7584924143eb9db4770bbdb16659626e1a1a4d9efbcb68d947"}, + {file = "charset_normalizer-3.4.5-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:ae8b03427410731469c4033934cf473426faff3e04b69d2dfb64a4281a3719f8"}, + {file = "charset_normalizer-3.4.5-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:b3e71afc578b98512bfe7bdb822dd6bc57d4b0093b4b6e5487c1e96ad4ace242"}, + {file = "charset_normalizer-3.4.5-cp38-cp38-musllinux_1_2_riscv64.whl", hash = "sha256:4b8551b6e6531e156db71193771c93bda78ffc4d1e6372517fe58ad3b91e4659"}, + {file = "charset_normalizer-3.4.5-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:65b3c403a5b6b8034b655e7385de4f72b7b244869a22b32d4030b99a60593eca"}, + {file = "charset_normalizer-3.4.5-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:8ce11cd4d62d11166f2b441e30ace226c19a3899a7cf0796f668fba49a9fb123"}, + {file = "charset_normalizer-3.4.5-cp38-cp38-win32.whl", hash = "sha256:66dee73039277eb35380d1b82cccc69cc82b13a66f9f4a18da32d573acf02b7c"}, + {file = "charset_normalizer-3.4.5-cp38-cp38-win_amd64.whl", hash = "sha256:d29dd9c016f2078b43d0c357511e87eee5b05108f3dd603423cb389b89813969"}, + {file = "charset_normalizer-3.4.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:259cd1ca995ad525f638e131dbcc2353a586564c038fc548a3fe450a91882139"}, + {file = "charset_normalizer-3.4.5-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8a28afb04baa55abf26df544e3e5c6534245d3daa5178bc4a8eeb48202060d0e"}, + {file = "charset_normalizer-3.4.5-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ff95a9283de8a457e6b12989de3f9f5193430f375d64297d323a615ea52cbdb3"}, + {file = "charset_normalizer-3.4.5-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:708c7acde173eedd4bfa4028484426ba689d2103b28588c513b9db2cd5ecde9c"}, + {file = "charset_normalizer-3.4.5-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:aa92ec1102eaff840ccd1021478af176a831f1bccb08e526ce844b7ddda85c22"}, + {file = "charset_normalizer-3.4.5-cp39-cp39-manylinux_2_31_armv7l.whl", hash = "sha256:5fea359734b140d0d6741189fea5478c6091b54ffc69d7ce119e0a05637d8c99"}, + {file = "charset_normalizer-3.4.5-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e545b51da9f9af5c67815ca0eb40676c0f016d0b0381c86f20451e35696c5f95"}, + {file = "charset_normalizer-3.4.5-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:30987f4a8ed169983f93e1be8ffeea5214a779e27ed0b059835c7afe96550ad7"}, + {file = "charset_normalizer-3.4.5-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:149ec69866c3d6c2fb6f758dbc014ecb09f30b35a5ca90b6a8a2d4e54e18fdfe"}, + {file = "charset_normalizer-3.4.5-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:530beedcec9b6e027e7a4b6ce26eed36678aa39e17da85e6e03d7bd9e8e9d7c9"}, + {file = "charset_normalizer-3.4.5-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:14498a429321de554b140013142abe7608f9d8ccc04d7baf2ad60498374aefa2"}, + {file = "charset_normalizer-3.4.5-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:2820a98460c83663dd8ec015d9ddfd1e4879f12e06bb7d0500f044fb477d2770"}, + {file = "charset_normalizer-3.4.5-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:aa2f963b4da26daf46231d9b9e0e2c9408a751f8f0d0f44d2de56d3caf51d294"}, + {file = "charset_normalizer-3.4.5-cp39-cp39-win32.whl", hash = "sha256:82cc7c2ad42faec8b574351f8bc2a0c049043893853317bd9bb309f5aba6cb5a"}, + {file = "charset_normalizer-3.4.5-cp39-cp39-win_amd64.whl", hash = "sha256:92263f7eca2f4af326cd20de8d16728d2602f7cfea02e790dcde9d83c365d7cc"}, + {file = "charset_normalizer-3.4.5-cp39-cp39-win_arm64.whl", hash = "sha256:014837af6fabf57121b6254fa8ade10dceabc3528b27b721a64bbc7b8b1d4eb4"}, + {file = "charset_normalizer-3.4.5-py3-none-any.whl", hash = "sha256:9db5e3fcdcee89a78c04dffb3fe33c79f77bd741a624946db2591c81b2fc85b0"}, + {file = "charset_normalizer-3.4.5.tar.gz", hash = "sha256:95adae7b6c42a6c5b5b559b1a99149f090a57128155daeea91732c8d970d8644"}, ] [[package]] @@ -625,7 +625,7 @@ description = "Cross-platform colored terminal text." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" groups = ["dev"] -markers = "sys_platform == \"win32\" or platform_system == \"Windows\"" +markers = "platform_system == \"Windows\" or sys_platform == \"win32\"" files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, @@ -775,14 +775,14 @@ xml-validation = ["lxml (>=4,<7)"] [[package]] name = "cyclopts" -version = "4.5.3" +version = "4.8.0" description = "Intuitive, easy CLIs based on type hints." optional = false python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "cyclopts-4.5.3-py3-none-any.whl", hash = "sha256:50af3085bb15d4a6f2582dd383dad5e4ba6a0d4d4c64ee63326d881a752a6919"}, - {file = "cyclopts-4.5.3.tar.gz", hash = "sha256:35fa70971204c450d9668646a6ca372eb5fa3070fbe8dd51c5b4b31e65198f2d"}, + {file = "cyclopts-4.8.0-py3-none-any.whl", hash = "sha256:ef353da05fec36587d4ebce7a6e4b27515d775d184a23bab4b01426f93ddc8d4"}, + {file = "cyclopts-4.8.0.tar.gz", hash = "sha256:92cc292d18d8be372e58d8bce1aa966d30f819a5fb3fee02bd2ad4a6bb403f29"}, ] [package.dependencies] @@ -855,14 +855,14 @@ files = [ [[package]] name = "filelock" -version = "3.24.3" +version = "3.25.2" description = "A platform independent file lock." optional = false python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "filelock-3.24.3-py3-none-any.whl", hash = "sha256:426e9a4660391f7f8a810d71b0555bce9008b0a1cc342ab1f6947d37639e002d"}, - {file = "filelock-3.24.3.tar.gz", hash = "sha256:011a5644dc937c22699943ebbfc46e969cdde3e171470a6e40b9533e5a72affa"}, + {file = "filelock-3.25.2-py3-none-any.whl", hash = "sha256:ca8afb0da15f229774c9ad1b455ed96e85a81373065fb10446672f64444ddf70"}, + {file = "filelock-3.25.2.tar.gz", hash = "sha256:b64ece2b38f4ca29dd3e810287aa8c48182bbecd1ae6e9ae126c9b35f1382694"}, ] [[package]] @@ -1066,14 +1066,14 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "identify" -version = "2.6.16" +version = "2.6.17" description = "File identification library for Python" optional = false python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "identify-2.6.16-py2.py3-none-any.whl", hash = "sha256:391ee4d77741d994189522896270b787aed8670389bfd60f326d677d64a6dfb0"}, - {file = "identify-2.6.16.tar.gz", hash = "sha256:846857203b5511bbe94d5a352a48ef2359532bc8f6727b5544077a0dcfb24980"}, + {file = "identify-2.6.17-py2.py3-none-any.whl", hash = "sha256:be5f8412d5ed4b20f2bd41a65f920990bdccaa6a4a18a08f1eefdcd0bdd885f0"}, + {file = "identify-2.6.17.tar.gz", hash = "sha256:f816b0b596b204c9fdf076ded172322f2723cf958d02f9c3587504834c8ff04d"}, ] [package.extras] @@ -1753,14 +1753,14 @@ testing = ["aboutcode-toolkit (>=6.0.0)", "black", "pytest (>=6,!=7.0.0)", "pyte [[package]] name = "platformdirs" -version = "4.9.2" +version = "4.9.4" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "platformdirs-4.9.2-py3-none-any.whl", hash = "sha256:9170634f126f8efdae22fb58ae8a0eaa86f38365bc57897a6c4f781d1f5875bd"}, - {file = "platformdirs-4.9.2.tar.gz", hash = "sha256:9a33809944b9db043ad67ca0db94b14bf452cc6aeaac46a88ea55b26e2e9d291"}, + {file = "platformdirs-4.9.4-py3-none-any.whl", hash = "sha256:68a9a4619a666ea6439f2ff250c12a853cd1cbd5158d258bd824a7df6be2f868"}, + {file = "platformdirs-4.9.4.tar.gz", hash = "sha256:1ec356301b7dc906d83f371c8f487070e99d3ccf9e501686456394622a01a934"}, ] [[package]] @@ -2205,6 +2205,26 @@ termcolor = ">=2.1.0" [package.extras] dev = ["black", "flake8", "pre-commit"] +[[package]] +name = "python-discovery" +version = "1.1.3" +description = "Python interpreter discovery" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "python_discovery-1.1.3-py3-none-any.whl", hash = "sha256:90e795f0121bc84572e737c9aa9966311b9fde44ffb88a5953b3ec9b31c6945e"}, + {file = "python_discovery-1.1.3.tar.gz", hash = "sha256:7acca36e818cd88e9b2ba03e045ad7e93e1713e29c6bbfba5d90202310b7baa5"}, +] + +[package.dependencies] +filelock = ">=3.15.4" +platformdirs = ">=4.3.6,<5" + +[package.extras] +docs = ["furo (>=2025.12.19)", "sphinx (>=9.1)", "sphinx-autodoc-typehints (>=3.6.3)", "sphinxcontrib-mermaid (>=2)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.5.4)", "pytest (>=8.3.5)", "pytest-mock (>=3.14)", "setuptools (>=75.1)"] + [[package]] name = "python-dotenv" version = "1.2.2" @@ -2382,14 +2402,14 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "rich" -version = "14.3.2" +version = "14.3.3" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" optional = false python-versions = ">=3.8.0" groups = ["dev"] files = [ - {file = "rich-14.3.2-py3-none-any.whl", hash = "sha256:08e67c3e90884651da3239ea668222d19bea7b589149d8014a21c633420dbb69"}, - {file = "rich-14.3.2.tar.gz", hash = "sha256:e712f11c1a562a11843306f5ed999475f09ac31ffb64281f73ab29ffdda8b3b8"}, + {file = "rich-14.3.3-py3-none-any.whl", hash = "sha256:793431c1f8619afa7d3b52b2cdec859562b950ea0d4b6b505397612db8d5362d"}, + {file = "rich-14.3.3.tar.gz", hash = "sha256:b8daa0b9e4eef54dd8cf7c86c03713f53241884e814f4e2f5fb342fe520f639b"}, ] [package.dependencies] @@ -2420,30 +2440,30 @@ docs = ["sphinx"] [[package]] name = "ruff" -version = "0.15.4" +version = "0.15.5" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" groups = ["dev"] files = [ - {file = "ruff-0.15.4-py3-none-linux_armv6l.whl", hash = "sha256:a1810931c41606c686bae8b5b9a8072adac2f611bb433c0ba476acba17a332e0"}, - {file = "ruff-0.15.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:5a1632c66672b8b4d3e1d1782859e98d6e0b4e70829530666644286600a33992"}, - {file = "ruff-0.15.4-py3-none-macosx_11_0_arm64.whl", hash = "sha256:a4386ba2cd6c0f4ff75252845906acc7c7c8e1ac567b7bc3d373686ac8c222ba"}, - {file = "ruff-0.15.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2496488bdfd3732747558b6f95ae427ff066d1fcd054daf75f5a50674411e75"}, - {file = "ruff-0.15.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3f1c4893841ff2d54cbda1b2860fa3260173df5ddd7b95d370186f8a5e66a4ac"}, - {file = "ruff-0.15.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:820b8766bd65503b6c30aaa6331e8ef3a6e564f7999c844e9a547c40179e440a"}, - {file = "ruff-0.15.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c9fb74bab47139c1751f900f857fa503987253c3ef89129b24ed375e72873e85"}, - {file = "ruff-0.15.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f80c98765949c518142b3a50a5db89343aa90f2c2bf7799de9986498ae6176db"}, - {file = "ruff-0.15.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:451a2e224151729b3b6c9ffb36aed9091b2996fe4bdbd11f47e27d8f2e8888ec"}, - {file = "ruff-0.15.4-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:a8f157f2e583c513c4f5f896163a93198297371f34c04220daf40d133fdd4f7f"}, - {file = "ruff-0.15.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:917cc68503357021f541e69b35361c99387cdbbf99bd0ea4aa6f28ca99ff5338"}, - {file = "ruff-0.15.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:e9737c8161da79fd7cfec19f1e35620375bd8b2a50c3e77fa3d2c16f574105cc"}, - {file = "ruff-0.15.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:291258c917539e18f6ba40482fe31d6f5ac023994ee11d7bdafd716f2aab8a68"}, - {file = "ruff-0.15.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:3f83c45911da6f2cd5936c436cf86b9f09f09165f033a99dcf7477e34041cbc3"}, - {file = "ruff-0.15.4-py3-none-win32.whl", hash = "sha256:65594a2d557d4ee9f02834fcdf0a28daa8b3b9f6cb2cb93846025a36db47ef22"}, - {file = "ruff-0.15.4-py3-none-win_amd64.whl", hash = "sha256:04196ad44f0df220c2ece5b0e959c2f37c777375ec744397d21d15b50a75264f"}, - {file = "ruff-0.15.4-py3-none-win_arm64.whl", hash = "sha256:60d5177e8cfc70e51b9c5fad936c634872a74209f934c1e79107d11787ad5453"}, - {file = "ruff-0.15.4.tar.gz", hash = "sha256:3412195319e42d634470cc97aa9803d07e9d5c9223b99bcb1518f0c725f26ae1"}, + {file = "ruff-0.15.5-py3-none-linux_armv6l.whl", hash = "sha256:4ae44c42281f42e3b06b988e442d344a5b9b72450ff3c892e30d11b29a96a57c"}, + {file = "ruff-0.15.5-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6edd3792d408ebcf61adabc01822da687579a1a023f297618ac27a5b51ef0080"}, + {file = "ruff-0.15.5-py3-none-macosx_11_0_arm64.whl", hash = "sha256:89f463f7c8205a9f8dea9d658d59eff49db05f88f89cc3047fb1a02d9f344010"}, + {file = "ruff-0.15.5-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba786a8295c6574c1116704cf0b9e6563de3432ac888d8f83685654fe528fd65"}, + {file = "ruff-0.15.5-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fd4b801e57955fe9f02b31d20375ab3a5c4415f2e5105b79fb94cf2642c91440"}, + {file = "ruff-0.15.5-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:391f7c73388f3d8c11b794dbbc2959a5b5afe66642c142a6effa90b45f6f5204"}, + {file = "ruff-0.15.5-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8dc18f30302e379fe1e998548b0f5e9f4dff907f52f73ad6da419ea9c19d66c8"}, + {file = "ruff-0.15.5-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1cc6e7f90087e2d27f98dc34ed1b3ab7c8f0d273cc5431415454e22c0bd2a681"}, + {file = "ruff-0.15.5-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1cb7169f53c1ddb06e71a9aebd7e98fc0fea936b39afb36d8e86d36ecc2636a"}, + {file = "ruff-0.15.5-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:9b037924500a31ee17389b5c8c4d88874cc6ea8e42f12e9c61a3d754ff72f1ca"}, + {file = "ruff-0.15.5-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:65bb414e5b4eadd95a8c1e4804f6772bbe8995889f203a01f77ddf2d790929dd"}, + {file = "ruff-0.15.5-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:d20aa469ae3b57033519c559e9bc9cd9e782842e39be05b50e852c7c981fa01d"}, + {file = "ruff-0.15.5-py3-none-musllinux_1_2_i686.whl", hash = "sha256:15388dd28c9161cdb8eda68993533acc870aa4e646a0a277aa166de9ad5a8752"}, + {file = "ruff-0.15.5-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:b30da330cbd03bed0c21420b6b953158f60c74c54c5f4c1dabbdf3a57bf355d2"}, + {file = "ruff-0.15.5-py3-none-win32.whl", hash = "sha256:732e5ee1f98ba5b3679029989a06ca39a950cced52143a0ea82a2102cb592b74"}, + {file = "ruff-0.15.5-py3-none-win_amd64.whl", hash = "sha256:821d41c5fa9e19117616c35eaa3f4b75046ec76c65e7ae20a333e9a8696bc7fe"}, + {file = "ruff-0.15.5-py3-none-win_arm64.whl", hash = "sha256:b498d1c60d2fe5c10c45ec3f698901065772730b411f164ae270bb6bfcc4740b"}, + {file = "ruff-0.15.5.tar.gz", hash = "sha256:7c3601d3b6d76dce18c5c824fc8d06f4eef33d6df0c21ec7799510cde0f159a2"}, ] [[package]] @@ -2586,163 +2606,158 @@ zstd = ["backports-zstd (>=1.0.0) ; python_version < \"3.14\""] [[package]] name = "virtualenv" -version = "20.38.0" +version = "21.2.0" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.8" groups = ["dev"] files = [ - {file = "virtualenv-20.38.0-py3-none-any.whl", hash = "sha256:d6e78e5889de3a4742df2d3d44e779366325a90cf356f15621fddace82431794"}, - {file = "virtualenv-20.38.0.tar.gz", hash = "sha256:94f39b1abaea5185bf7ea5a46702b56f1d0c9aa2f41a6c2b8b0af4ddc74c10a7"}, + {file = "virtualenv-21.2.0-py3-none-any.whl", hash = "sha256:1bd755b504931164a5a496d217c014d098426cddc79363ad66ac78125f9d908f"}, + {file = "virtualenv-21.2.0.tar.gz", hash = "sha256:1720dc3a62ef5b443092e3f499228599045d7fea4c79199770499df8becf9098"}, ] [package.dependencies] distlib = ">=0.3.7,<1" filelock = {version = ">=3.24.2,<4", markers = "python_version >= \"3.10\""} platformdirs = ">=3.9.1,<5" - -[package.extras] -docs = ["furo (>=2023.7.26)", "pre-commit-uv (>=4.1.4)", "proselint (>=0.13)", "sphinx (>=7.1.2,!=7.3)", "sphinx-argparse (>=0.4)", "sphinx-autodoc-typehints (>=3.6.2)", "sphinx-copybutton (>=0.5.2)", "sphinx-inline-tabs (>=2025.12.21.14)", "sphinxcontrib-mermaid (>=2)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] -test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8) ; platform_python_implementation == \"PyPy\" or platform_python_implementation == \"GraalVM\" or platform_python_implementation == \"CPython\" and sys_platform == \"win32\" and python_version >= \"3.13\"", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "pytest-xdist (>=3.5)", "setuptools (>=68)", "time-machine (>=2.10) ; platform_python_implementation == \"CPython\""] +python-discovery = ">=1" [[package]] name = "yarl" -version = "1.22.0" +version = "1.23.0" description = "Yet another URL library" optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "yarl-1.22.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c7bd6683587567e5a49ee6e336e0612bec8329be1b7d4c8af5687dcdeb67ee1e"}, - {file = "yarl-1.22.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5cdac20da754f3a723cceea5b3448e1a2074866406adeb4ef35b469d089adb8f"}, - {file = "yarl-1.22.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:07a524d84df0c10f41e3ee918846e1974aba4ec017f990dc735aad487a0bdfdf"}, - {file = "yarl-1.22.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e1b329cb8146d7b736677a2440e422eadd775d1806a81db2d4cded80a48efc1a"}, - {file = "yarl-1.22.0-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:75976c6945d85dbb9ee6308cd7ff7b1fb9409380c82d6119bd778d8fcfe2931c"}, - {file = "yarl-1.22.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:80ddf7a5f8c86cb3eb4bc9028b07bbbf1f08a96c5c0bc1244be5e8fefcb94147"}, - {file = "yarl-1.22.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d332fc2e3c94dad927f2112395772a4e4fedbcf8f80efc21ed7cdfae4d574fdb"}, - {file = "yarl-1.22.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0cf71bf877efeac18b38d3930594c0948c82b64547c1cf420ba48722fe5509f6"}, - {file = "yarl-1.22.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:663e1cadaddae26be034a6ab6072449a8426ddb03d500f43daf952b74553bba0"}, - {file = "yarl-1.22.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:6dcbb0829c671f305be48a7227918cfcd11276c2d637a8033a99a02b67bf9eda"}, - {file = "yarl-1.22.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:f0d97c18dfd9a9af4490631905a3f131a8e4c9e80a39353919e2cfed8f00aedc"}, - {file = "yarl-1.22.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:437840083abe022c978470b942ff832c3940b2ad3734d424b7eaffcd07f76737"}, - {file = "yarl-1.22.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:a899cbd98dce6f5d8de1aad31cb712ec0a530abc0a86bd6edaa47c1090138467"}, - {file = "yarl-1.22.0-cp310-cp310-win32.whl", hash = "sha256:595697f68bd1f0c1c159fcb97b661fc9c3f5db46498043555d04805430e79bea"}, - {file = "yarl-1.22.0-cp310-cp310-win_amd64.whl", hash = "sha256:cb95a9b1adaa48e41815a55ae740cfda005758104049a640a398120bf02515ca"}, - {file = "yarl-1.22.0-cp310-cp310-win_arm64.whl", hash = "sha256:b85b982afde6df99ecc996990d4ad7ccbdbb70e2a4ba4de0aecde5922ba98a0b"}, - {file = "yarl-1.22.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1ab72135b1f2db3fed3997d7e7dc1b80573c67138023852b6efb336a5eae6511"}, - {file = "yarl-1.22.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:669930400e375570189492dc8d8341301578e8493aec04aebc20d4717f899dd6"}, - {file = "yarl-1.22.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:792a2af6d58177ef7c19cbf0097aba92ca1b9cb3ffdd9c7470e156c8f9b5e028"}, - {file = "yarl-1.22.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3ea66b1c11c9150f1372f69afb6b8116f2dd7286f38e14ea71a44eee9ec51b9d"}, - {file = "yarl-1.22.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3e2daa88dc91870215961e96a039ec73e4937da13cf77ce17f9cad0c18df3503"}, - {file = "yarl-1.22.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ba440ae430c00eee41509353628600212112cd5018d5def7e9b05ea7ac34eb65"}, - {file = "yarl-1.22.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e6438cc8f23a9c1478633d216b16104a586b9761db62bfacb6425bac0a36679e"}, - {file = "yarl-1.22.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4c52a6e78aef5cf47a98ef8e934755abf53953379b7d53e68b15ff4420e6683d"}, - {file = "yarl-1.22.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3b06bcadaac49c70f4c88af4ffcfbe3dc155aab3163e75777818092478bcbbe7"}, - {file = "yarl-1.22.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:6944b2dc72c4d7f7052683487e3677456050ff77fcf5e6204e98caf785ad1967"}, - {file = "yarl-1.22.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:d5372ca1df0f91a86b047d1277c2aaf1edb32d78bbcefffc81b40ffd18f027ed"}, - {file = "yarl-1.22.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:51af598701f5299012b8416486b40fceef8c26fc87dc6d7d1f6fc30609ea0aa6"}, - {file = "yarl-1.22.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b266bd01fedeffeeac01a79ae181719ff848a5a13ce10075adbefc8f1daee70e"}, - {file = "yarl-1.22.0-cp311-cp311-win32.whl", hash = "sha256:a9b1ba5610a4e20f655258d5a1fdc7ebe3d837bb0e45b581398b99eb98b1f5ca"}, - {file = "yarl-1.22.0-cp311-cp311-win_amd64.whl", hash = "sha256:078278b9b0b11568937d9509b589ee83ef98ed6d561dfe2020e24a9fd08eaa2b"}, - {file = "yarl-1.22.0-cp311-cp311-win_arm64.whl", hash = "sha256:b6a6f620cfe13ccec221fa312139135166e47ae169f8253f72a0abc0dae94376"}, - {file = "yarl-1.22.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e340382d1afa5d32b892b3ff062436d592ec3d692aeea3bef3a5cfe11bbf8c6f"}, - {file = "yarl-1.22.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f1e09112a2c31ffe8d80be1b0988fa6a18c5d5cad92a9ffbb1c04c91bfe52ad2"}, - {file = "yarl-1.22.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:939fe60db294c786f6b7c2d2e121576628468f65453d86b0fe36cb52f987bd74"}, - {file = "yarl-1.22.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e1651bf8e0398574646744c1885a41198eba53dc8a9312b954073f845c90a8df"}, - {file = "yarl-1.22.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:b8a0588521a26bf92a57a1705b77b8b59044cdceccac7151bd8d229e66b8dedb"}, - {file = "yarl-1.22.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:42188e6a615c1a75bcaa6e150c3fe8f3e8680471a6b10150c5f7e83f47cc34d2"}, - {file = "yarl-1.22.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f6d2cb59377d99718913ad9a151030d6f83ef420a2b8f521d94609ecc106ee82"}, - {file = "yarl-1.22.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50678a3b71c751d58d7908edc96d332af328839eea883bb554a43f539101277a"}, - {file = "yarl-1.22.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1e8fbaa7cec507aa24ea27a01456e8dd4b6fab829059b69844bd348f2d467124"}, - {file = "yarl-1.22.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:433885ab5431bc3d3d4f2f9bd15bfa1614c522b0f1405d62c4f926ccd69d04fa"}, - {file = "yarl-1.22.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:b790b39c7e9a4192dc2e201a282109ed2985a1ddbd5ac08dc56d0e121400a8f7"}, - {file = "yarl-1.22.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:31f0b53913220599446872d757257be5898019c85e7971599065bc55065dc99d"}, - {file = "yarl-1.22.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a49370e8f711daec68d09b821a34e1167792ee2d24d405cbc2387be4f158b520"}, - {file = "yarl-1.22.0-cp312-cp312-win32.whl", hash = "sha256:70dfd4f241c04bd9239d53b17f11e6ab672b9f1420364af63e8531198e3f5fe8"}, - {file = "yarl-1.22.0-cp312-cp312-win_amd64.whl", hash = "sha256:8884d8b332a5e9b88e23f60bb166890009429391864c685e17bd73a9eda9105c"}, - {file = "yarl-1.22.0-cp312-cp312-win_arm64.whl", hash = "sha256:ea70f61a47f3cc93bdf8b2f368ed359ef02a01ca6393916bc8ff877427181e74"}, - {file = "yarl-1.22.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8dee9c25c74997f6a750cd317b8ca63545169c098faee42c84aa5e506c819b53"}, - {file = "yarl-1.22.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:01e73b85a5434f89fc4fe27dcda2aff08ddf35e4d47bbbea3bdcd25321af538a"}, - {file = "yarl-1.22.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:22965c2af250d20c873cdbee8ff958fb809940aeb2e74ba5f20aaf6b7ac8c70c"}, - {file = "yarl-1.22.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b4f15793aa49793ec8d1c708ab7f9eded1aa72edc5174cae703651555ed1b601"}, - {file = "yarl-1.22.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e5542339dcf2747135c5c85f68680353d5cb9ffd741c0f2e8d832d054d41f35a"}, - {file = "yarl-1.22.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5c401e05ad47a75869c3ab3e35137f8468b846770587e70d71e11de797d113df"}, - {file = "yarl-1.22.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:243dda95d901c733f5b59214d28b0120893d91777cb8aa043e6ef059d3cddfe2"}, - {file = "yarl-1.22.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bec03d0d388060058f5d291a813f21c011041938a441c593374da6077fe21b1b"}, - {file = "yarl-1.22.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b0748275abb8c1e1e09301ee3cf90c8a99678a4e92e4373705f2a2570d581273"}, - {file = "yarl-1.22.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:47fdb18187e2a4e18fda2c25c05d8251a9e4a521edaed757fef033e7d8498d9a"}, - {file = "yarl-1.22.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c7044802eec4524fde550afc28edda0dd5784c4c45f0be151a2d3ba017daca7d"}, - {file = "yarl-1.22.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:139718f35149ff544caba20fce6e8a2f71f1e39b92c700d8438a0b1d2a631a02"}, - {file = "yarl-1.22.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e1b51bebd221006d3d2f95fbe124b22b247136647ae5dcc8c7acafba66e5ee67"}, - {file = "yarl-1.22.0-cp313-cp313-win32.whl", hash = "sha256:d3e32536234a95f513bd374e93d717cf6b2231a791758de6c509e3653f234c95"}, - {file = "yarl-1.22.0-cp313-cp313-win_amd64.whl", hash = "sha256:47743b82b76d89a1d20b83e60d5c20314cbd5ba2befc9cda8f28300c4a08ed4d"}, - {file = "yarl-1.22.0-cp313-cp313-win_arm64.whl", hash = "sha256:5d0fcda9608875f7d052eff120c7a5da474a6796fe4d83e152e0e4d42f6d1a9b"}, - {file = "yarl-1.22.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:719ae08b6972befcba4310e49edb1161a88cdd331e3a694b84466bd938a6ab10"}, - {file = "yarl-1.22.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:47d8a5c446df1c4db9d21b49619ffdba90e77c89ec6e283f453856c74b50b9e3"}, - {file = "yarl-1.22.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:cfebc0ac8333520d2d0423cbbe43ae43c8838862ddb898f5ca68565e395516e9"}, - {file = "yarl-1.22.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4398557cbf484207df000309235979c79c4356518fd5c99158c7d38203c4da4f"}, - {file = "yarl-1.22.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2ca6fd72a8cd803be290d42f2dec5cdcd5299eeb93c2d929bf060ad9efaf5de0"}, - {file = "yarl-1.22.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ca1f59c4e1ab6e72f0a23c13fca5430f889634166be85dbf1013683e49e3278e"}, - {file = "yarl-1.22.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6c5010a52015e7c70f86eb967db0f37f3c8bd503a695a49f8d45700144667708"}, - {file = "yarl-1.22.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d7672ecf7557476642c88497c2f8d8542f8e36596e928e9bcba0e42e1e7d71f"}, - {file = "yarl-1.22.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:3b7c88eeef021579d600e50363e0b6ee4f7f6f728cd3486b9d0f3ee7b946398d"}, - {file = "yarl-1.22.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:f4afb5c34f2c6fecdcc182dfcfc6af6cccf1aa923eed4d6a12e9d96904e1a0d8"}, - {file = "yarl-1.22.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:59c189e3e99a59cf8d83cbb31d4db02d66cda5a1a4374e8a012b51255341abf5"}, - {file = "yarl-1.22.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:5a3bf7f62a289fa90f1990422dc8dff5a458469ea71d1624585ec3a4c8d6960f"}, - {file = "yarl-1.22.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:de6b9a04c606978fdfe72666fa216ffcf2d1a9f6a381058d4378f8d7b1e5de62"}, - {file = "yarl-1.22.0-cp313-cp313t-win32.whl", hash = "sha256:1834bb90991cc2999f10f97f5f01317f99b143284766d197e43cd5b45eb18d03"}, - {file = "yarl-1.22.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ff86011bd159a9d2dfc89c34cfd8aff12875980e3bd6a39ff097887520e60249"}, - {file = "yarl-1.22.0-cp313-cp313t-win_arm64.whl", hash = "sha256:7861058d0582b847bc4e3a4a4c46828a410bca738673f35a29ba3ca5db0b473b"}, - {file = "yarl-1.22.0-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:34b36c2c57124530884d89d50ed2c1478697ad7473efd59cfd479945c95650e4"}, - {file = "yarl-1.22.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:0dd9a702591ca2e543631c2a017e4a547e38a5c0f29eece37d9097e04a7ac683"}, - {file = "yarl-1.22.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:594fcab1032e2d2cc3321bb2e51271e7cd2b516c7d9aee780ece81b07ff8244b"}, - {file = "yarl-1.22.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f3d7a87a78d46a2e3d5b72587ac14b4c16952dd0887dbb051451eceac774411e"}, - {file = "yarl-1.22.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:852863707010316c973162e703bddabec35e8757e67fcb8ad58829de1ebc8590"}, - {file = "yarl-1.22.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:131a085a53bfe839a477c0845acf21efc77457ba2bcf5899618136d64f3303a2"}, - {file = "yarl-1.22.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:078a8aefd263f4d4f923a9677b942b445a2be970ca24548a8102689a3a8ab8da"}, - {file = "yarl-1.22.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bca03b91c323036913993ff5c738d0842fc9c60c4648e5c8d98331526df89784"}, - {file = "yarl-1.22.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:68986a61557d37bb90d3051a45b91fa3d5c516d177dfc6dd6f2f436a07ff2b6b"}, - {file = "yarl-1.22.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:4792b262d585ff0dff6bcb787f8492e40698443ec982a3568c2096433660c694"}, - {file = "yarl-1.22.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:ebd4549b108d732dba1d4ace67614b9545b21ece30937a63a65dd34efa19732d"}, - {file = "yarl-1.22.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:f87ac53513d22240c7d59203f25cc3beac1e574c6cd681bbfd321987b69f95fd"}, - {file = "yarl-1.22.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:22b029f2881599e2f1b06f8f1db2ee63bd309e2293ba2d566e008ba12778b8da"}, - {file = "yarl-1.22.0-cp314-cp314-win32.whl", hash = "sha256:6a635ea45ba4ea8238463b4f7d0e721bad669f80878b7bfd1f89266e2ae63da2"}, - {file = "yarl-1.22.0-cp314-cp314-win_amd64.whl", hash = "sha256:0d6e6885777af0f110b0e5d7e5dda8b704efed3894da26220b7f3d887b839a79"}, - {file = "yarl-1.22.0-cp314-cp314-win_arm64.whl", hash = "sha256:8218f4e98d3c10d683584cb40f0424f4b9fd6e95610232dd75e13743b070ee33"}, - {file = "yarl-1.22.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:45c2842ff0e0d1b35a6bf1cd6c690939dacb617a70827f715232b2e0494d55d1"}, - {file = "yarl-1.22.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:d947071e6ebcf2e2bee8fce76e10faca8f7a14808ca36a910263acaacef08eca"}, - {file = "yarl-1.22.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:334b8721303e61b00019474cc103bdac3d7b1f65e91f0bfedeec2d56dfe74b53"}, - {file = "yarl-1.22.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1e7ce67c34138a058fd092f67d07a72b8e31ff0c9236e751957465a24b28910c"}, - {file = "yarl-1.22.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d77e1b2c6d04711478cb1c4ab90db07f1609ccf06a287d5607fcd90dc9863acf"}, - {file = "yarl-1.22.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c4647674b6150d2cae088fc07de2738a84b8bcedebef29802cf0b0a82ab6face"}, - {file = "yarl-1.22.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:efb07073be061c8f79d03d04139a80ba33cbd390ca8f0297aae9cce6411e4c6b"}, - {file = "yarl-1.22.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e51ac5435758ba97ad69617e13233da53908beccc6cfcd6c34bbed8dcbede486"}, - {file = "yarl-1.22.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:33e32a0dd0c8205efa8e83d04fc9f19313772b78522d1bdc7d9aed706bfd6138"}, - {file = "yarl-1.22.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:bf4a21e58b9cde0e401e683ebd00f6ed30a06d14e93f7c8fd059f8b6e8f87b6a"}, - {file = "yarl-1.22.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:e4b582bab49ac33c8deb97e058cd67c2c50dac0dd134874106d9c774fd272529"}, - {file = "yarl-1.22.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:0b5bcc1a9c4839e7e30b7b30dd47fe5e7e44fb7054ec29b5bb8d526aa1041093"}, - {file = "yarl-1.22.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c0232bce2170103ec23c454e54a57008a9a72b5d1c3105dc2496750da8cfa47c"}, - {file = "yarl-1.22.0-cp314-cp314t-win32.whl", hash = "sha256:8009b3173bcd637be650922ac455946197d858b3630b6d8787aa9e5c4564533e"}, - {file = "yarl-1.22.0-cp314-cp314t-win_amd64.whl", hash = "sha256:9fb17ea16e972c63d25d4a97f016d235c78dd2344820eb35bc034bc32012ee27"}, - {file = "yarl-1.22.0-cp314-cp314t-win_arm64.whl", hash = "sha256:9f6d73c1436b934e3f01df1e1b21ff765cd1d28c77dfb9ace207f746d4610ee1"}, - {file = "yarl-1.22.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3aa27acb6de7a23785d81557577491f6c38a5209a254d1191519d07d8fe51748"}, - {file = "yarl-1.22.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:af74f05666a5e531289cb1cc9c883d1de2088b8e5b4de48004e5ca8a830ac859"}, - {file = "yarl-1.22.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:62441e55958977b8167b2709c164c91a6363e25da322d87ae6dd9c6019ceecf9"}, - {file = "yarl-1.22.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b580e71cac3f8113d3135888770903eaf2f507e9421e5697d6ee6d8cd1c7f054"}, - {file = "yarl-1.22.0-cp39-cp39-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e81fda2fb4a07eda1a2252b216aa0df23ebcd4d584894e9612e80999a78fd95b"}, - {file = "yarl-1.22.0-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:99b6fc1d55782461b78221e95fc357b47ad98b041e8e20f47c1411d0aacddc60"}, - {file = "yarl-1.22.0-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:088e4e08f033db4be2ccd1f34cf29fe994772fb54cfe004bbf54db320af56890"}, - {file = "yarl-1.22.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2e4e1f6f0b4da23e61188676e3ed027ef0baa833a2e633c29ff8530800edccba"}, - {file = "yarl-1.22.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:84fc3ec96fce86ce5aa305eb4aa9358279d1aa644b71fab7b8ed33fe3ba1a7ca"}, - {file = "yarl-1.22.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:5dbeefd6ca588b33576a01b0ad58aa934bc1b41ef89dee505bf2932b22ddffba"}, - {file = "yarl-1.22.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:14291620375b1060613f4aab9ebf21850058b6b1b438f386cc814813d901c60b"}, - {file = "yarl-1.22.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:a4fcfc8eb2c34148c118dfa02e6427ca278bfd0f3df7c5f99e33d2c0e81eae3e"}, - {file = "yarl-1.22.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:029866bde8d7b0878b9c160e72305bbf0a7342bcd20b9999381704ae03308dc8"}, - {file = "yarl-1.22.0-cp39-cp39-win32.whl", hash = "sha256:4dcc74149ccc8bba31ce1944acee24813e93cfdee2acda3c172df844948ddf7b"}, - {file = "yarl-1.22.0-cp39-cp39-win_amd64.whl", hash = "sha256:10619d9fdee46d20edc49d3479e2f8269d0779f1b031e6f7c2aa1c76be04b7ed"}, - {file = "yarl-1.22.0-cp39-cp39-win_arm64.whl", hash = "sha256:dd7afd3f8b0bfb4e0d9fc3c31bfe8a4ec7debe124cfd90619305def3c8ca8cd2"}, - {file = "yarl-1.22.0-py3-none-any.whl", hash = "sha256:1380560bdba02b6b6c90de54133c81c9f2a453dee9912fe58c1dcced1edb7cff"}, - {file = "yarl-1.22.0.tar.gz", hash = "sha256:bebf8557577d4401ba8bd9ff33906f1376c877aa78d1fe216ad01b4d6745af71"}, + {file = "yarl-1.23.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cff6d44cb13d39db2663a22b22305d10855efa0fa8015ddeacc40bc59b9d8107"}, + {file = "yarl-1.23.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e4c53f8347cd4200f0d70a48ad059cabaf24f5adc6ba08622a23423bc7efa10d"}, + {file = "yarl-1.23.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2a6940a074fb3c48356ed0158a3ca5699c955ee4185b4d7d619be3c327143e05"}, + {file = "yarl-1.23.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ed5f69ce7be7902e5c70ea19eb72d20abf7d725ab5d49777d696e32d4fc1811d"}, + {file = "yarl-1.23.0-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:389871e65468400d6283c0308e791a640b5ab5c83bcee02a2f51295f95e09748"}, + {file = "yarl-1.23.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:dda608c88cf709b1d406bdfcd84d8d63cff7c9e577a403c6108ce8ce9dcc8764"}, + {file = "yarl-1.23.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8c4fe09e0780c6c3bf2b7d4af02ee2394439d11a523bbcf095cf4747c2932007"}, + {file = "yarl-1.23.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:31c9921eb8bd12633b41ad27686bbb0b1a2a9b8452bfdf221e34f311e9942ed4"}, + {file = "yarl-1.23.0-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:5f10fd85e4b75967468af655228fbfd212bdf66db1c0d135065ce288982eda26"}, + {file = "yarl-1.23.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:dbf507e9ef5688bada447a24d68b4b58dd389ba93b7afc065a2ba892bea54769"}, + {file = "yarl-1.23.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:85e9beda1f591bc73e77ea1c51965c68e98dafd0fec72cdd745f77d727466716"}, + {file = "yarl-1.23.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:0e1fdaa14ef51366d7757b45bde294e95f6c8c049194e793eedb8387c86d5993"}, + {file = "yarl-1.23.0-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:75e3026ab649bf48f9a10c0134512638725b521340293f202a69b567518d94e0"}, + {file = "yarl-1.23.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:80e6d33a3d42a7549b409f199857b4fb54e2103fc44fb87605b6663b7a7ff750"}, + {file = "yarl-1.23.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5ec2f42d41ccbd5df0270d7df31618a8ee267bfa50997f5d720ddba86c4a83a6"}, + {file = "yarl-1.23.0-cp310-cp310-win32.whl", hash = "sha256:debe9c4f41c32990771be5c22b56f810659f9ddf3d63f67abfdcaa2c6c9c5c1d"}, + {file = "yarl-1.23.0-cp310-cp310-win_amd64.whl", hash = "sha256:ab5f043cb8a2d71c981c09c510da013bc79fd661f5c60139f00dd3c3cc4f2ffb"}, + {file = "yarl-1.23.0-cp310-cp310-win_arm64.whl", hash = "sha256:263cd4f47159c09b8b685890af949195b51d1aa82ba451c5847ca9bc6413c220"}, + {file = "yarl-1.23.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b35d13d549077713e4414f927cdc388d62e543987c572baee613bf82f11a4b99"}, + {file = "yarl-1.23.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cbb0fef01f0c6b38cb0f39b1f78fc90b807e0e3c86a7ff3ce74ad77ce5c7880c"}, + {file = "yarl-1.23.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dc52310451fc7c629e13c4e061cbe2dd01684d91f2f8ee2821b083c58bd72432"}, + {file = "yarl-1.23.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b2c6b50c7b0464165472b56b42d4c76a7b864597007d9c085e8b63e185cf4a7a"}, + {file = "yarl-1.23.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:aafe5dcfda86c8af00386d7781d4c2181b5011b7be3f2add5e99899ea925df05"}, + {file = "yarl-1.23.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9ee33b875f0b390564c1fb7bc528abf18c8ee6073b201c6ae8524aca778e2d83"}, + {file = "yarl-1.23.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4c41e021bc6d7affb3364dc1e1e5fa9582b470f283748784bd6ea0558f87f42c"}, + {file = "yarl-1.23.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:99c8a9ed30f4164bc4c14b37a90208836cbf50d4ce2a57c71d0f52c7fb4f7598"}, + {file = "yarl-1.23.0-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f2af5c81a1f124609d5f33507082fc3f739959d4719b56877ab1ee7e7b3d602b"}, + {file = "yarl-1.23.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6b41389c19b07c760c7e427a3462e8ab83c4bb087d127f0e854c706ce1b9215c"}, + {file = "yarl-1.23.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:1dc702e42d0684f42d6519c8d581e49c96cefaaab16691f03566d30658ee8788"}, + {file = "yarl-1.23.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:0e40111274f340d32ebcc0a5668d54d2b552a6cca84c9475859d364b380e3222"}, + {file = "yarl-1.23.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:4764a6a7588561a9aef92f65bda2c4fb58fe7c675c0883862e6df97559de0bfb"}, + {file = "yarl-1.23.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:03214408cfa590df47728b84c679ae4ef00be2428e11630277be0727eba2d7cc"}, + {file = "yarl-1.23.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:170e26584b060879e29fac213e4228ef063f39128723807a312e5c7fec28eff2"}, + {file = "yarl-1.23.0-cp311-cp311-win32.whl", hash = "sha256:51430653db848d258336cfa0244427b17d12db63d42603a55f0d4546f50f25b5"}, + {file = "yarl-1.23.0-cp311-cp311-win_amd64.whl", hash = "sha256:bf49a3ae946a87083ef3a34c8f677ae4243f5b824bfc4c69672e72b3d6719d46"}, + {file = "yarl-1.23.0-cp311-cp311-win_arm64.whl", hash = "sha256:b39cb32a6582750b6cc77bfb3c49c0f8760dc18dc96ec9fb55fbb0f04e08b928"}, + {file = "yarl-1.23.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1932b6b8bba8d0160a9d1078aae5838a66039e8832d41d2992daa9a3a08f7860"}, + {file = "yarl-1.23.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:411225bae281f114067578891bc75534cfb3d92a3b4dfef7a6ca78ba354e6069"}, + {file = "yarl-1.23.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:13a563739ae600a631c36ce096615fe307f131344588b0bc0daec108cdb47b25"}, + {file = "yarl-1.23.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9cbf44c5cb4a7633d078788e1b56387e3d3cf2b8139a3be38040b22d6c3221c8"}, + {file = "yarl-1.23.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:53ad387048f6f09a8969631e4de3f1bf70c50e93545d64af4f751b2498755072"}, + {file = "yarl-1.23.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4a59ba56f340334766f3a4442e0efd0af895fae9e2b204741ef885c446b3a1a8"}, + {file = "yarl-1.23.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:803a3c3ce4acc62eaf01eaca1208dcf0783025ef27572c3336502b9c232005e7"}, + {file = "yarl-1.23.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a3d2bff8f37f8d0f96c7ec554d16945050d54462d6e95414babaa18bfafc7f51"}, + {file = "yarl-1.23.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c75eb09e8d55bceb4367e83496ff8ef2bc7ea6960efb38e978e8073ea59ecb67"}, + {file = "yarl-1.23.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:877b0738624280e34c55680d6054a307aa94f7d52fa0e3034a9cc6e790871da7"}, + {file = "yarl-1.23.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:b5405bb8f0e783a988172993cfc627e4d9d00432d6bbac65a923041edacf997d"}, + {file = "yarl-1.23.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:1c3a3598a832590c5a3ce56ab5576361b5688c12cb1d39429cf5dba30b510760"}, + {file = "yarl-1.23.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:8419ebd326430d1cbb7efb5292330a2cf39114e82df5cc3d83c9a0d5ebeaf2f2"}, + {file = "yarl-1.23.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:be61f6fff406ca40e3b1d84716fde398fc08bc63dd96d15f3a14230a0973ed86"}, + {file = "yarl-1.23.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3ceb13c5c858d01321b5d9bb65e4cf37a92169ea470b70fec6f236b2c9dd7e34"}, + {file = "yarl-1.23.0-cp312-cp312-win32.whl", hash = "sha256:fffc45637bcd6538de8b85f51e3df3223e4ad89bccbfca0481c08c7fc8b7ed7d"}, + {file = "yarl-1.23.0-cp312-cp312-win_amd64.whl", hash = "sha256:f69f57305656a4852f2a7203efc661d8c042e6cc67f7acd97d8667fb448a426e"}, + {file = "yarl-1.23.0-cp312-cp312-win_arm64.whl", hash = "sha256:6e87a6e8735b44816e7db0b2fbc9686932df473c826b0d9743148432e10bb9b9"}, + {file = "yarl-1.23.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:16c6994ac35c3e74fb0ae93323bf8b9c2a9088d55946109489667c510a7d010e"}, + {file = "yarl-1.23.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4a42e651629dafb64fd5b0286a3580613702b5809ad3f24934ea87595804f2c5"}, + {file = "yarl-1.23.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7c6b9461a2a8b47c65eef63bb1c76a4f1c119618ffa99ea79bc5bb1e46c5821b"}, + {file = "yarl-1.23.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2569b67d616eab450d262ca7cb9f9e19d2f718c70a8b88712859359d0ab17035"}, + {file = "yarl-1.23.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e9d9a4d06d3481eab79803beb4d9bd6f6a8e781ec078ac70d7ef2dcc29d1bea5"}, + {file = "yarl-1.23.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f514f6474e04179d3d33175ed3f3e31434d3130d42ec153540d5b157deefd735"}, + {file = "yarl-1.23.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fda207c815b253e34f7e1909840fd14299567b1c0eb4908f8c2ce01a41265401"}, + {file = "yarl-1.23.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:34b6cf500e61c90f305094911f9acc9c86da1a05a7a3f5be9f68817043f486e4"}, + {file = "yarl-1.23.0-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d7504f2b476d21653e4d143f44a175f7f751cd41233525312696c76aa3dbb23f"}, + {file = "yarl-1.23.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:578110dd426f0d209d1509244e6d4a3f1a3e9077655d98c5f22583d63252a08a"}, + {file = "yarl-1.23.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:609d3614d78d74ebe35f54953c5bbd2ac647a7ddb9c30a5d877580f5e86b22f2"}, + {file = "yarl-1.23.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4966242ec68afc74c122f8459abd597afd7d8a60dc93d695c1334c5fd25f762f"}, + {file = "yarl-1.23.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:e0fd068364a6759bc794459f0a735ab151d11304346332489c7972bacbe9e72b"}, + {file = "yarl-1.23.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:39004f0ad156da43e86aa71f44e033de68a44e5a31fc53507b36dd253970054a"}, + {file = "yarl-1.23.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e5723c01a56c5028c807c701aa66722916d2747ad737a046853f6c46f4875543"}, + {file = "yarl-1.23.0-cp313-cp313-win32.whl", hash = "sha256:1b6b572edd95b4fa8df75de10b04bc81acc87c1c7d16bcdd2035b09d30acc957"}, + {file = "yarl-1.23.0-cp313-cp313-win_amd64.whl", hash = "sha256:baaf55442359053c7d62f6f8413a62adba3205119bcb6f49594894d8be47e5e3"}, + {file = "yarl-1.23.0-cp313-cp313-win_arm64.whl", hash = "sha256:fb4948814a2a98e3912505f09c9e7493b1506226afb1f881825368d6fb776ee3"}, + {file = "yarl-1.23.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:aecfed0b41aa72b7881712c65cf764e39ce2ec352324f5e0837c7048d9e6daaa"}, + {file = "yarl-1.23.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a41bcf68efd19073376eb8cf948b8d9be0af26256403e512bb18f3966f1f9120"}, + {file = "yarl-1.23.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:cde9a2ecd91668bcb7f077c4966d8ceddb60af01b52e6e3e2680e4cf00ad1a59"}, + {file = "yarl-1.23.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5023346c4ee7992febc0068e7593de5fa2bf611848c08404b35ebbb76b1b0512"}, + {file = "yarl-1.23.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d1009abedb49ae95b136a8904a3f71b342f849ffeced2d3747bf29caeda218c4"}, + {file = "yarl-1.23.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a8d00f29b42f534cc8aa3931cfe773b13b23e561e10d2b26f27a8d309b0e82a1"}, + {file = "yarl-1.23.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:95451e6ce06c3e104556d73b559f5da6c34a069b6b62946d3ad66afcd51642ea"}, + {file = "yarl-1.23.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:531ef597132086b6cf96faa7c6c1dcd0361dd5f1694e5cc30375907b9b7d3ea9"}, + {file = "yarl-1.23.0-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:88f9fb0116fbfcefcab70f85cf4b74a2b6ce5d199c41345296f49d974ddb4123"}, + {file = "yarl-1.23.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e7b0460976dc75cb87ad9cc1f9899a4b97751e7d4e77ab840fc9b6d377b8fd24"}, + {file = "yarl-1.23.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:115136c4a426f9da976187d238e84139ff6b51a20839aa6e3720cd1026d768de"}, + {file = "yarl-1.23.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:ead11956716a940c1abc816b7df3fa2b84d06eaed8832ca32f5c5e058c65506b"}, + {file = "yarl-1.23.0-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:fe8f8f5e70e6dbdfca9882cd9deaac058729bcf323cf7a58660901e55c9c94f6"}, + {file = "yarl-1.23.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:a0e317df055958a0c1e79e5d2aa5a5eaa4a6d05a20d4b0c9c3f48918139c9fc6"}, + {file = "yarl-1.23.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6f0fd84de0c957b2d280143522c4f91a73aada1923caee763e24a2b3fda9f8a5"}, + {file = "yarl-1.23.0-cp313-cp313t-win32.whl", hash = "sha256:93a784271881035ab4406a172edb0faecb6e7d00f4b53dc2f55919d6c9688595"}, + {file = "yarl-1.23.0-cp313-cp313t-win_amd64.whl", hash = "sha256:dd00607bffbf30250fe108065f07453ec124dbf223420f57f5e749b04295e090"}, + {file = "yarl-1.23.0-cp313-cp313t-win_arm64.whl", hash = "sha256:ac09d42f48f80c9ee1635b2fcaa819496a44502737660d3c0f2ade7526d29144"}, + {file = "yarl-1.23.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:21d1b7305a71a15b4794b5ff22e8eef96ff4a6d7f9657155e5aa419444b28912"}, + {file = "yarl-1.23.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:85610b4f27f69984932a7abbe52703688de3724d9f72bceb1cca667deff27474"}, + {file = "yarl-1.23.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:23f371bd662cf44a7630d4d113101eafc0cfa7518a2760d20760b26021454719"}, + {file = "yarl-1.23.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c4a80f77dc1acaaa61f0934176fccca7096d9b1ff08c8ba9cddf5ae034a24319"}, + {file = "yarl-1.23.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:bd654fad46d8d9e823afbb4f87c79160b5a374ed1ff5bde24e542e6ba8f41434"}, + {file = "yarl-1.23.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:682bae25f0a0dd23a056739f23a134db9f52a63e2afd6bfb37ddc76292bbd723"}, + {file = "yarl-1.23.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a82836cab5f197a0514235aaf7ffccdc886ccdaa2324bc0aafdd4ae898103039"}, + {file = "yarl-1.23.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1c57676bdedc94cd3bc37724cf6f8cd2779f02f6aba48de45feca073e714fe52"}, + {file = "yarl-1.23.0-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c7f8dc16c498ff06497c015642333219871effba93e4a2e8604a06264aca5c5c"}, + {file = "yarl-1.23.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:5ee586fb17ff8f90c91cf73c6108a434b02d69925f44f5f8e0d7f2f260607eae"}, + {file = "yarl-1.23.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:17235362f580149742739cc3828b80e24029d08cbb9c4bda0242c7b5bc610a8e"}, + {file = "yarl-1.23.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:0793e2bd0cf14234983bbb371591e6bea9e876ddf6896cdcc93450996b0b5c85"}, + {file = "yarl-1.23.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:3650dc2480f94f7116c364096bc84b1d602f44224ef7d5c7208425915c0475dd"}, + {file = "yarl-1.23.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:f40e782d49630ad384db66d4d8b73ff4f1b8955dc12e26b09a3e3af064b3b9d6"}, + {file = "yarl-1.23.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:94f8575fbdf81749008d980c17796097e645574a3b8c28ee313931068dad14fe"}, + {file = "yarl-1.23.0-cp314-cp314-win32.whl", hash = "sha256:c8aa34a5c864db1087d911a0b902d60d203ea3607d91f615acd3f3108ac32169"}, + {file = "yarl-1.23.0-cp314-cp314-win_amd64.whl", hash = "sha256:63e92247f383c85ab00dd0091e8c3fa331a96e865459f5ee80353c70a4a42d70"}, + {file = "yarl-1.23.0-cp314-cp314-win_arm64.whl", hash = "sha256:70efd20be968c76ece7baa8dafe04c5be06abc57f754d6f36f3741f7aa7a208e"}, + {file = "yarl-1.23.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:9a18d6f9359e45722c064c97464ec883eb0e0366d33eda61cb19a244bf222679"}, + {file = "yarl-1.23.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:2803ed8b21ca47a43da80a6fd1ed3019d30061f7061daa35ac54f63933409412"}, + {file = "yarl-1.23.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:394906945aa8b19fc14a61cf69743a868bb8c465efe85eee687109cc540b98f4"}, + {file = "yarl-1.23.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:71d006bee8397a4a89f469b8deb22469fe7508132d3c17fa6ed871e79832691c"}, + {file = "yarl-1.23.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:62694e275c93d54f7ccedcfef57d42761b2aad5234b6be1f3e3026cae4001cd4"}, + {file = "yarl-1.23.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a31de1613658308efdb21ada98cbc86a97c181aa050ba22a808120bb5be3ab94"}, + {file = "yarl-1.23.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fb1e8b8d66c278b21d13b0a7ca22c41dd757a7c209c6b12c313e445c31dd3b28"}, + {file = "yarl-1.23.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50f9d8d531dfb767c565f348f33dd5139a6c43f5cbdf3f67da40d54241df93f6"}, + {file = "yarl-1.23.0-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:575aa4405a656e61a540f4a80eaa5260f2a38fff7bfdc4b5f611840d76e9e277"}, + {file = "yarl-1.23.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:041b1a4cefacf65840b4e295c6985f334ba83c30607441ae3cf206a0eed1a2e4"}, + {file = "yarl-1.23.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:d38c1e8231722c4ce40d7593f28d92b5fc72f3e9774fe73d7e800ec32299f63a"}, + {file = "yarl-1.23.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:d53834e23c015ee83a99377db6e5e37d8484f333edb03bd15b4bc312cc7254fb"}, + {file = "yarl-1.23.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:2e27c8841126e017dd2a054a95771569e6070b9ee1b133366d8b31beb5018a41"}, + {file = "yarl-1.23.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:76855800ac56f878847a09ce6dba727c93ca2d89c9e9d63002d26b916810b0a2"}, + {file = "yarl-1.23.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e09fd068c2e169a7070d83d3bde728a4d48de0549f975290be3c108c02e499b4"}, + {file = "yarl-1.23.0-cp314-cp314t-win32.whl", hash = "sha256:73309162a6a571d4cbd3b6a1dcc703c7311843ae0d1578df6f09be4e98df38d4"}, + {file = "yarl-1.23.0-cp314-cp314t-win_amd64.whl", hash = "sha256:4503053d296bc6e4cbd1fad61cf3b6e33b939886c4f249ba7c78b602214fabe2"}, + {file = "yarl-1.23.0-cp314-cp314t-win_arm64.whl", hash = "sha256:44bb7bef4ea409384e3f8bc36c063d77ea1b8d4a5b2706956c0d6695f07dcc25"}, + {file = "yarl-1.23.0-py3-none-any.whl", hash = "sha256:a2df6afe50dea8ae15fa34c9f824a3ee958d785fd5d089063d960bae1daa0a3f"}, + {file = "yarl-1.23.0.tar.gz", hash = "sha256:53b1ea6ca88ebd4420379c330aea57e258408dd0df9af0992e5de2078dc9f5d5"}, ] [package.dependencies] @@ -2753,4 +2768,4 @@ propcache = ">=0.2.1" [metadata] lock-version = "2.1" python-versions = "^3.13" -content-hash = "e77943c5410f86313d583383625073016904d844bfccec84db49db6b55d19f04" +content-hash = "d51f3d0769b70ac871bc51f05f8c6a44671d3daf26a5b30957df2822cfa7f50a" diff --git a/pyproject.toml b/pyproject.toml index 66f3fa4b..a7950741 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -27,7 +27,7 @@ algorand-python = "^3.4.0" [tool.poetry.group.dev.dependencies] algokit-client-generator = "^2.2.0" black = { extras = ["d"], version = "^26.3.1" } -ruff = "^0.15.4" +ruff = "^0.15.5" mypy = "^1.19.1" pytest = "^9.0.2" pytest-cov = "^7.0.0" From b906a8a15bde8fe623107c4b0f10345deeb6853c Mon Sep 17 00:00:00 2001 From: cusma Date: Thu, 12 Mar 2026 22:06:47 +0100 Subject: [PATCH 140/244] chore: deployments --- smart_contracts/d_asa/deploy_config.py | 436 ++++++++++++++++++++++++- 1 file changed, 419 insertions(+), 17 deletions(-) diff --git a/smart_contracts/d_asa/deploy_config.py b/smart_contracts/d_asa/deploy_config.py index 417d33ab..6238da55 100644 --- a/smart_contracts/d_asa/deploy_config.py +++ b/smart_contracts/d_asa/deploy_config.py @@ -1,42 +1,444 @@ +from __future__ import annotations + import logging import os +from collections.abc import Callable +from dataclasses import dataclass import algokit_utils +from algokit_utils import ( + AlgoAmount, + AssetCreateParams, + CommonAppCallParams, + PaymentParams, + SendParams, + SigningAccount, +) from algosdk.constants import ZERO_ADDRESS +from smart_contracts import constants as cst +from smart_contracts import enums +from src import ( + ExecutionScheduleEntry, + NormalizationResult, + normalize_contract_attributes, +) +from src.contracts import ( + make_pam_fixed_coupon_bond_profile, + make_pam_zero_coupon_bond, +) +from src.schedule import Cycle + logger = logging.getLogger(__name__) +DEMO_APP_FUNDING_ALGO = 2 +DEMO_ASSET_DECIMALS = 2 +DEMO_ASSET_NAME = "D-ASA Demo Euro" +DEMO_ASSET_TOTAL = 10_000_000 +DEMO_ASSET_UNIT_NAME = "€" +DEMO_FCB_APP_NAME = "dasa-demo-fcb" +DEMO_FCB_NOMINAL_RATE = 0.02 +DEMO_FCB_PROSPECTUS_URL = "D-ASA demo fixed coupon bond" +DEMO_FIXED_COUPON_MATURITY_CYCLE = Cycle.parse_cycle("1800D") +DEMO_FIXED_COUPON_PAYMENT_CYCLE = Cycle.parse_cycle("90D") +DEMO_ISSUANCE_DELAY_CYCLE = Cycle.parse_cycle("30D") +DEMO_NOTIONAL_PRINCIPAL = 10_000 +DEMO_NOTIONAL_UNIT_VALUE = 100 +DEMO_ZCB_APP_NAME = "dasa-demo-zcb" +DEMO_ZCB_DISCOUNT_BPS = 200 +DEMO_ZCB_MATURITY_CYCLE = Cycle.parse_cycle("360D") +DEMO_ZCB_PROSPECTUS_URL = "D-ASA demo zero coupon bond" + + +@dataclass(frozen=True, slots=True) +class DenominationAsset: + asset_id: int + decimals: int + + +@dataclass(frozen=True, slots=True) +class DemoDeploymentContext: + current_ts: int + denomination_asset: DenominationAsset -def _get_arranger_address(*, deployer_address: str) -> str: + +@dataclass(frozen=True, slots=True) +class DemoInstrumentSpec: + label: str + prospectus_url: str + normalized: NormalizationResult + + +def _get_arranger_account( + *, + algorand: algokit_utils.AlgorandClient, + deployer: SigningAccount, +) -> SigningAccount: arranger_address = os.getenv("ARRANGER_ADDRESS") - if not arranger_address or arranger_address == ZERO_ADDRESS: + arranger: SigningAccount | None = None + + try: + arranger = algorand.account.from_environment("ARRANGER") + except Exception: # pragma: no cover - environment-driven branch + arranger = None + + if arranger_address and arranger_address != ZERO_ADDRESS: + if arranger is not None: + if arranger.address != arranger_address: + raise ValueError( + "ARRANGER account signer does not match ARRANGER_ADDRESS" + ) + return arranger + if arranger_address == deployer.address: + logger.info("ARRANGER_ADDRESS matches DEPLOYER; using deployer signer") + return deployer + raise ValueError( + "ARRANGER_ADDRESS is set but no ARRANGER signer is configured. " + "Set ARRANGER credentials or unset ARRANGER_ADDRESS to use DEPLOYER." + ) + + if arranger is not None: + logger.info("Using ARRANGER signer from environment") + return arranger + + logger.info("ARRANGER is unset; defaulting arranger to DEPLOYER") + return deployer + + +def _cycle_duration_seconds(cycle: Cycle) -> int: + if cycle.unit == "D": + return cycle.count * cst.DAY_2_SEC + if cycle.unit == "W": + return cycle.count * 7 * cst.DAY_2_SEC + raise ValueError(f"Unsupported fixed-duration ACTUS cycle: {cycle}") + + +def _get_latest_timestamp(algorand: algokit_utils.AlgorandClient) -> int: + algod_client = algorand.client.algod + last_round = algod_client.status()["last-round"] + return int(algod_client.block_info(last_round)["block"]["ts"]) + + +def _resolve_denomination_asset( + *, + algorand: algokit_utils.AlgorandClient, + issuer: SigningAccount, +) -> DenominationAsset: + denomination_asset_id = os.getenv("DENOMINATION_ASSET_ID") + if denomination_asset_id: + asset = algorand.asset.get_by_id(int(denomination_asset_id)) logger.info( - "ARRANGER_ADDRESS is unset or zero; defaulting arranger to DEPLOYER" + "Using existing denomination asset %s (%s)", + asset.asset_id, + asset.unit_name or "unknown unit", ) - return deployer_address - return arranger_address + return DenominationAsset(asset_id=asset.asset_id, decimals=asset.decimals) + decimals = int(os.getenv("DENOMINATION_ASSET_DECIMALS", str(DEMO_ASSET_DECIMALS))) + total = int(os.getenv("DENOMINATION_ASSET_TOTAL", str(DEMO_ASSET_TOTAL))) * ( + 10**decimals + ) + asset_name = os.getenv("DENOMINATION_ASSET_NAME", DEMO_ASSET_NAME) + unit_name = os.getenv("DENOMINATION_ASSET_UNIT_NAME", DEMO_ASSET_UNIT_NAME) -# define deployment behaviour based on supplied app spec -def deploy() -> None: + asset_id = algorand.send.asset_create( + AssetCreateParams( + sender=issuer.address, + signer=issuer.signer, + total=total, + decimals=decimals, + asset_name=asset_name, + unit_name=unit_name, + ) + ).asset_id + logger.info("Created denomination asset %s (%s)", asset_id, unit_name) + return DenominationAsset(asset_id=asset_id, decimals=decimals) + + +def _get_demo_context( + *, + algorand: algokit_utils.AlgorandClient, + deployer: SigningAccount, +) -> DemoDeploymentContext: + return DemoDeploymentContext( + current_ts=_get_latest_timestamp(algorand), + denomination_asset=_resolve_denomination_asset( + algorand=algorand, + issuer=deployer, + ), + ) + + +def build_fixed_coupon_bond_demo(context: DemoDeploymentContext) -> DemoInstrumentSpec: + issuance_delay = _cycle_duration_seconds(DEMO_ISSUANCE_DELAY_CYCLE) + coupon_period = _cycle_duration_seconds(DEMO_FIXED_COUPON_PAYMENT_CYCLE) + issuance_date = context.current_ts + issuance_delay + maturity_date = issuance_date + _cycle_duration_seconds( + DEMO_FIXED_COUPON_MATURITY_CYCLE + ) + first_coupon_date = issuance_date + coupon_period + + attrs = make_pam_fixed_coupon_bond_profile( + contract_id=1, + status_date=context.current_ts, + initial_exchange_date=issuance_date, + maturity_date=maturity_date, + notional_principal=DEMO_NOTIONAL_PRINCIPAL, + nominal_interest_rate=DEMO_FCB_NOMINAL_RATE, + interest_payment_cycle=DEMO_FIXED_COUPON_PAYMENT_CYCLE, + interest_payment_anchor=first_coupon_date, + ) + normalized = normalize_contract_attributes( + attrs, + denomination_asset_id=context.denomination_asset.asset_id, + denomination_asset_decimals=context.denomination_asset.decimals, + notional_unit_value=DEMO_NOTIONAL_UNIT_VALUE, + secondary_market_opening_date=issuance_date, + secondary_market_closure_date=maturity_date + cst.DAY_2_SEC, + ) + return DemoInstrumentSpec( + label="FCB", + prospectus_url=DEMO_FCB_PROSPECTUS_URL, + normalized=normalized, + ) + + +def build_zero_coupon_bond_demo(context: DemoDeploymentContext) -> DemoInstrumentSpec: + issuance_date = context.current_ts + _cycle_duration_seconds( + DEMO_ISSUANCE_DELAY_CYCLE + ) + maturity_date = issuance_date + _cycle_duration_seconds(DEMO_ZCB_MATURITY_CYCLE) + discount_amount = DEMO_NOTIONAL_PRINCIPAL * DEMO_ZCB_DISCOUNT_BPS // cst.BPS + + attrs = make_pam_zero_coupon_bond( + contract_id=2, + status_date=context.current_ts, + initial_exchange_date=issuance_date, + maturity_date=maturity_date, + notional_principal=DEMO_NOTIONAL_PRINCIPAL, + premium_discount_at_ied=discount_amount, + ) + normalized = normalize_contract_attributes( + attrs, + denomination_asset_id=context.denomination_asset.asset_id, + denomination_asset_decimals=context.denomination_asset.decimals, + notional_unit_value=DEMO_NOTIONAL_UNIT_VALUE, + secondary_market_opening_date=issuance_date, + secondary_market_closure_date=maturity_date + cst.DAY_2_SEC, + ) + return DemoInstrumentSpec( + label="ZCB", + prospectus_url=DEMO_ZCB_PROSPECTUS_URL, + normalized=normalized, + ) + + +def _client_terms(result: NormalizationResult) -> object: + from smart_contracts.artifacts.d_asa.dasa_client import NormalizedActusTerms + + return NormalizedActusTerms( + contract_type=result.terms.contract_type, + denomination_asset_id=result.terms.denomination_asset_id, + settlement_asset_id=result.terms.denomination_asset_id, + total_units=result.terms.total_units, + notional_principal=result.terms.notional_principal, + initial_exchange_amount=result.terms.initial_exchange_amount, + initial_exchange_date=result.terms.initial_exchange_date, + maturity_date=result.terms.maturity_date or 0, + day_count_convention=int(result.terms.day_count_convention), + rate_reset_spread=result.terms.rate_reset_spread, + rate_reset_multiplier=result.terms.rate_reset_multiplier, + rate_reset_floor=result.terms.rate_reset_floor, + rate_reset_cap=result.terms.rate_reset_cap, + rate_reset_next=result.terms.rate_reset_next, + has_rate_reset_floor=result.terms.has_rate_reset_floor, + has_rate_reset_cap=result.terms.has_rate_reset_cap, + dynamic_principal_redemption=result.terms.dynamic_principal_redemption, + fixed_point_scale=result.terms.fixed_point_scale, + ) + + +def _client_initial_state(result: NormalizationResult) -> object: + from smart_contracts.artifacts.d_asa.dasa_client import InitialKernelState + + return InitialKernelState( + status_date=result.initial_state.status_date, + event_cursor=result.initial_state.event_cursor, + outstanding_principal=result.initial_state.outstanding_principal, + interest_calculation_base=result.initial_state.interest_calculation_base, + nominal_interest_rate=result.initial_state.nominal_interest_rate, + accrued_interest=result.initial_state.accrued_interest, + next_principal_redemption=result.initial_state.next_principal_redemption, + cumulative_interest_index=result.initial_state.cumulative_interest_index, + cumulative_principal_index=result.initial_state.cumulative_principal_index, + ) + + +def _client_schedule_page( + page: tuple[ExecutionScheduleEntry, ...], +) -> list[tuple[int, int, int, int, int, int, int, int, int]]: + from src.registry import EVENT_TYPE_IDS + + return [ + ( + entry.event_id, + EVENT_TYPE_IDS[entry.event_type], + entry.scheduled_time, + entry.accrual_factor, + entry.redemption_accrual_factor, + entry.next_nominal_interest_rate, + entry.next_principal_redemption, + entry.next_outstanding_principal, + entry.flags, + ) + for entry in page + ] + + +def _fund_app_account( + *, + algorand: algokit_utils.AlgorandClient, + payer: SigningAccount, + app_address: str, +) -> None: + funding_amount = int( + os.getenv("APP_ACCOUNT_FUNDING_ALGO", str(DEMO_APP_FUNDING_ALGO)) + ) + algorand.send.payment( + PaymentParams( + sender=payer.address, + signer=payer.signer, + receiver=app_address, + amount=AlgoAmount.from_algo(funding_amount), + ) + ) + + +def _configure_demo_app( + *, + client: object, + spec: DemoInstrumentSpec, +) -> None: from smart_contracts.artifacts.d_asa.dasa_client import ( - ContractCreateArgs, - DasaFactory, - DasaMethodCallCreateParams, + ContractConfigArgs, + ContractScheduleArgs, + Prospectus, ) - algorand = algokit_utils.AlgorandClient.from_environment() - deployer_ = algorand.account.from_environment("DEPLOYER") - arranger_address = _get_arranger_address(deployer_address=deployer_.address) + client.send.contract_config( + ContractConfigArgs( + terms=_client_terms(spec.normalized), + initial_state=_client_initial_state(spec.normalized), + prospectus=Prospectus(hash=bytes(32), url=spec.prospectus_url), + ), + params=CommonAppCallParams(max_fee=AlgoAmount.from_micro_algo(5_000)), + send_params=SendParams(cover_app_call_inner_transaction_fees=True), + ) - factory = algorand.client.get_typed_app_factory( - DasaFactory, default_sender=deployer_.address + pages = spec.normalized.schedule_pages(cst.SCHEDULE_PAGE_SIZE) + for index, page in enumerate(pages): + client.send.contract_schedule( + ContractScheduleArgs( + schedule_page_index=index, + is_last_page=index == len(pages) - 1, + schedule_page=_client_schedule_page(page), + ), + params=CommonAppCallParams(max_fee=AlgoAmount.from_micro_algo(5_000)), + send_params=SendParams(cover_app_call_inner_transaction_fees=True), + ) + + +def _needs_configuration( + *, + client: object, + operation: algokit_utils.OperationPerformed, +) -> bool: + if operation in ( + algokit_utils.OperationPerformed.Create, + algokit_utils.OperationPerformed.Replace, + ): + return True + assert hasattr(client, "state") + return client.state.global_state.status == enums.STATUS_INACTIVE + + +def _deploy_instrument( + *, + app_name: str, + factory: object, + arranger: SigningAccount, + deployer: SigningAccount, + algorand: algokit_utils.AlgorandClient, + build_spec: Callable[[DemoDeploymentContext], DemoInstrumentSpec], + demo_context: DemoDeploymentContext | None, +) -> DemoDeploymentContext | None: + from smart_contracts.artifacts.d_asa.dasa_client import ( + ContractCreateArgs, + DasaMethodCallCreateParams, ) - factory.deploy( + client, result = factory.deploy( + app_name=app_name, create_params=DasaMethodCallCreateParams( - args=ContractCreateArgs(arranger=arranger_address) + args=ContractCreateArgs(arranger=arranger.address) ), on_update=algokit_utils.OnUpdate.AppendApp, on_schema_break=algokit_utils.OnSchemaBreak.AppendApp, ) + + if not _needs_configuration(client=client, operation=result.operation_performed): + logger.info( + "%s app %s already configured at app id %s; skipped configuration", + app_name, + result.operation_performed.name, + client.app_id, + ) + return demo_context + + if demo_context is None: + demo_context = _get_demo_context(algorand=algorand, deployer=deployer) + spec = build_spec(demo_context) + + _fund_app_account( + algorand=algorand, + payer=deployer, + app_address=client.app_address, + ) + _configure_demo_app(client=client, spec=spec) + logger.info( + "Configured %s demo app at app id %s (%s)", + spec.label, + client.app_id, + result.operation_performed.name, + ) + return demo_context + + +# define deployment behaviour based on supplied app spec +def deploy() -> None: + from smart_contracts.artifacts.d_asa.dasa_client import DasaFactory + + algorand = algokit_utils.AlgorandClient.from_environment() + deployer = algorand.account.from_environment("DEPLOYER") + arranger = _get_arranger_account(algorand=algorand, deployer=deployer) + + factory = algorand.client.get_typed_app_factory( + DasaFactory, + default_sender=arranger.address, + default_signer=arranger.signer, + ) + + demo_context: DemoDeploymentContext | None = None + for app_name, build_spec in ( + (DEMO_FCB_APP_NAME, build_fixed_coupon_bond_demo), + (DEMO_ZCB_APP_NAME, build_zero_coupon_bond_demo), + ): + demo_context = _deploy_instrument( + app_name=app_name, + factory=factory, + arranger=arranger, + deployer=deployer, + algorand=algorand, + build_spec=build_spec, + demo_context=demo_context, + ) From f98629707d944442a4f9f2fe4ead6a610ebac020 Mon Sep 17 00:00:00 2001 From: cusma Date: Thu, 12 Mar 2026 22:19:15 +0100 Subject: [PATCH 141/244] chore: update conftest --- tests/conftest.py | 10 ++- tests/pam/conftest.py | 32 ++++++++ tests/pam/fcb/test_pam_fixed_coupon_bond.py | 54 ++++--------- tests/pam/pam_test_support.py | 80 +++++++++++-------- tests/pam/zcb/test_pam_zero_coupon_bond.py | 54 ++++--------- tests/sdk/test_deploy_config.py | 86 +++++++++++++++++++++ 6 files changed, 207 insertions(+), 109 deletions(-) create mode 100644 tests/pam/conftest.py create mode 100644 tests/sdk/test_deploy_config.py diff --git a/tests/conftest.py b/tests/conftest.py index d2f2e41c..a6ffde67 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -9,7 +9,11 @@ ) from algokit_utils.config import config -from smart_contracts.artifacts.d_asa.dasa_client import DasaClient, DasaFactory +from smart_contracts.artifacts.d_asa.dasa_client import ( + ContractCreateArgs, + DasaClient, + DasaFactory, +) from tests import utils INITIAL_ALGO_FUNDS: Final[AlgoAmount] = AlgoAmount.from_algo(10_000) @@ -96,7 +100,9 @@ def d_asa_client( default_sender=arranger.address, default_signer=arranger.signer, ) - client, _ = factory.send.create.bare() + client, _ = factory.send.create.contract_create( + ContractCreateArgs(arranger=arranger.address) + ) algorand.account.ensure_funded_from_environment( account_to_fund=client.app_address, min_spending_balance=INITIAL_ALGO_FUNDS, diff --git a/tests/pam/conftest.py b/tests/pam/conftest.py new file mode 100644 index 00000000..df7f5b4e --- /dev/null +++ b/tests/pam/conftest.py @@ -0,0 +1,32 @@ +import pytest +from algokit_utils import AlgorandClient + +from smart_contracts.artifacts.d_asa.dasa_client import ( + DasaClient, +) +from tests import conftest_helpers as helpers +from tests import utils + + +@pytest.fixture(scope="function") +def pam_primary_dealer( + algorand: AlgorandClient, + d_asa_client: DasaClient, +) -> utils.DAsaPrimaryDealer: + return helpers.create_role_account( + algorand, + utils.DAsaPrimaryDealer, + d_asa_client, + ) + + +@pytest.fixture(scope="function") +def pam_account_manager( + algorand: AlgorandClient, + d_asa_client: DasaClient, +) -> utils.DAsaAccountManager: + return helpers.create_role_account( + algorand, + utils.DAsaAccountManager, + d_asa_client, + ) diff --git a/tests/pam/fcb/test_pam_fixed_coupon_bond.py b/tests/pam/fcb/test_pam_fixed_coupon_bond.py index 592ea6e4..6d706bd6 100644 --- a/tests/pam/fcb/test_pam_fixed_coupon_bond.py +++ b/tests/pam/fcb/test_pam_fixed_coupon_bond.py @@ -1,23 +1,20 @@ from __future__ import annotations -import pytest from algokit_utils import ( AlgoAmount, AlgorandClient, CommonAppCallParams, - LogicError, SendParams, SigningAccount, ) from smart_contracts import constants as cst from smart_contracts import enums -from smart_contracts import errors as err from smart_contracts.artifacts.d_asa.dasa_client import ( AccountGetPositionArgs, ClaimDueCashflowsArgs, + DasaClient, FundDueCashflowsArgs, - TransferArgs, ) from src import NormalizationResult, normalize_contract_attributes from src.contracts import make_pam_fixed_coupon_bond_profile @@ -28,6 +25,7 @@ ISSUANCE_DELAY_CYCLE, MINIMUM_DENOMINATION, PRINCIPAL, + assert_pending_ied_guards, cycle_duration_seconds, scale_currency_amount, setup_pam_lifecycle, @@ -74,7 +72,9 @@ def test_fixed_coupon_pam_full_lifecycle( algorand: AlgorandClient, bank: SigningAccount, currency: utils.Currency, - arranger: SigningAccount, + d_asa_client: DasaClient, + pam_primary_dealer: utils.DAsaPrimaryDealer, + pam_account_manager: utils.DAsaAccountManager, ) -> None: current_ts = utils.get_latest_timestamp(algorand.client.algod) issuance_delay = cycle_duration_seconds(ISSUANCE_DELAY_CYCLE) @@ -112,9 +112,11 @@ def test_fixed_coupon_pam_full_lifecycle( assert [entry.event_type for entry in normalized.schedule] == expected_event_types total_interest_amount = _derive_total_interest_amount(normalized) - lifecycle = setup_pam_lifecycle( + participants = setup_pam_lifecycle( + client=d_asa_client, + primary_dealer=pam_primary_dealer, + account_manager=pam_account_manager, algorand=algorand, - arranger=arranger, bank=bank, currency=currency, normalized=normalized, @@ -122,9 +124,9 @@ def test_fixed_coupon_pam_full_lifecycle( investor_payment_amount=normalized.terms.initial_exchange_amount, prospectus_url="ACTUS fixed coupon PAM lifecycle", ) - client = lifecycle.client - investor = lifecycle.investor - receiver = lifecycle.receiver + client = d_asa_client + investor = participants.investor + receiver = participants.receiver account_position = client.send.account_get_position( AccountGetPositionArgs(holding_address=investor.address) @@ -141,33 +143,11 @@ def test_fixed_coupon_pam_full_lifecycle( assert contract_state.event_cursor == 0 assert contract_state.schedule_entry_count == len(normalized.schedule) - with pytest.raises(LogicError, match=err.PENDING_IED): - client.send.fund_due_cashflows(FundDueCashflowsArgs(max_event_count=1)) - - with pytest.raises(LogicError, match=err.PENDING_IED): - client.send.claim_due_cashflows( - ClaimDueCashflowsArgs( - holding_address=investor.address, - payment_info=b"", - ), - params=CommonAppCallParams( - sender=investor.address, - signer=investor.signer, - ), - ) - - with pytest.raises(LogicError, match=err.PENDING_IED): - client.send.transfer( - TransferArgs( - sender_holding_address=investor.address, - receiver_holding_address=receiver.address, - units=1, - ), - params=CommonAppCallParams( - sender=investor.address, - signer=investor.signer, - ), - ) + assert_pending_ied_guards( + client=client, + investor=investor, + receiver=receiver, + ) ied_entry = normalized.schedule[0] utils.time_warp(ied_entry.scheduled_time + cst.DAY_2_SEC) diff --git a/tests/pam/pam_test_support.py b/tests/pam/pam_test_support.py index 5e2c055a..e07844f2 100644 --- a/tests/pam/pam_test_support.py +++ b/tests/pam/pam_test_support.py @@ -2,33 +2,36 @@ from dataclasses import dataclass +import pytest from algokit_utils import ( AlgoAmount, AlgorandClient, AssetOptInParams, AssetTransferParams, CommonAppCallParams, + LogicError, SendParams, SigningAccount, ) from smart_contracts import constants as cst +from smart_contracts import errors as err from smart_contracts.artifacts.d_asa.dasa_client import ( AccountOpenArgs, + ClaimDueCashflowsArgs, ContractConfigArgs, - ContractCreateArgs, ContractScheduleArgs, DasaClient, - DasaFactory, + FundDueCashflowsArgs, InitialKernelState, NormalizedActusTerms, PrimaryDistributionArgs, Prospectus, + TransferArgs, ) from src import NormalizationResult from src.registry import EVENT_TYPE_IDS from src.schedule import Cycle -from tests import conftest_helpers as role_helpers from tests import utils PRINCIPAL = 10_000 @@ -37,8 +40,7 @@ @dataclass(frozen=True) -class PamLifecycleContext: - client: DasaClient +class PamLifecycleParticipants: investor: SigningAccount receiver: SigningAccount @@ -132,28 +134,17 @@ def _open_contract_account( def setup_pam_lifecycle( *, + client: DasaClient, + primary_dealer: utils.DAsaPrimaryDealer, + account_manager: utils.DAsaAccountManager, algorand: AlgorandClient, - arranger: SigningAccount, bank: SigningAccount, currency: utils.Currency, normalized: NormalizationResult, bank_funding_amount: int, investor_payment_amount: int, prospectus_url: str, -) -> PamLifecycleContext: - factory = algorand.client.get_typed_app_factory( - DasaFactory, - default_sender=arranger.address, - default_signer=arranger.signer, - ) - client, _ = factory.send.create.contract_create( - ContractCreateArgs(arranger=arranger.address) - ) - algorand.account.ensure_funded_from_environment( - account_to_fund=client.app_address, - min_spending_balance=AlgoAmount.from_algo(10_000), - ) - +) -> PamLifecycleParticipants: pages = normalized.schedule_pages(cst.SCHEDULE_PAGE_SIZE) client.send.contract_config( ContractConfigArgs( @@ -189,17 +180,6 @@ def setup_pam_lifecycle( ) ) - primary_dealer = role_helpers.create_role_account( - algorand, - utils.DAsaPrimaryDealer, - client, - ) - account_manager = role_helpers.create_role_account( - algorand, - utils.DAsaAccountManager, - client, - ) - investor = algorand.account.random() algorand.account.ensure_funded_from_environment( account_to_fund=investor.address, @@ -277,8 +257,42 @@ def setup_pam_lifecycle( == bank_funding_amount + investor_payment_amount ) - return PamLifecycleContext( - client=client, + return PamLifecycleParticipants( investor=investor, receiver=receiver, ) + + +def assert_pending_ied_guards( + *, + client: DasaClient, + investor: SigningAccount, + receiver: SigningAccount, +) -> None: + with pytest.raises(LogicError, match=err.PENDING_IED): + client.send.fund_due_cashflows(FundDueCashflowsArgs(max_event_count=1)) + + with pytest.raises(LogicError, match=err.PENDING_IED): + client.send.claim_due_cashflows( + ClaimDueCashflowsArgs( + holding_address=investor.address, + payment_info=b"", + ), + params=CommonAppCallParams( + sender=investor.address, + signer=investor.signer, + ), + ) + + with pytest.raises(LogicError, match=err.PENDING_IED): + client.send.transfer( + TransferArgs( + sender_holding_address=investor.address, + receiver_holding_address=receiver.address, + units=1, + ), + params=CommonAppCallParams( + sender=investor.address, + signer=investor.signer, + ), + ) diff --git a/tests/pam/zcb/test_pam_zero_coupon_bond.py b/tests/pam/zcb/test_pam_zero_coupon_bond.py index 1bcc7c0c..b13f48ad 100644 --- a/tests/pam/zcb/test_pam_zero_coupon_bond.py +++ b/tests/pam/zcb/test_pam_zero_coupon_bond.py @@ -1,23 +1,20 @@ from __future__ import annotations -import pytest from algokit_utils import ( AlgoAmount, AlgorandClient, CommonAppCallParams, - LogicError, SendParams, SigningAccount, ) from smart_contracts import constants as cst from smart_contracts import enums -from smart_contracts import errors as err from smart_contracts.artifacts.d_asa.dasa_client import ( AccountGetPositionArgs, ClaimDueCashflowsArgs, + DasaClient, FundDueCashflowsArgs, - TransferArgs, ) from src import normalize_contract_attributes from src.contracts import make_pam_zero_coupon_bond @@ -28,6 +25,7 @@ ISSUANCE_DELAY_CYCLE, MINIMUM_DENOMINATION, PRINCIPAL, + assert_pending_ied_guards, cycle_duration_seconds, scale_currency_amount, setup_pam_lifecycle, @@ -41,7 +39,9 @@ def test_zero_coupon_pam_discounted_full_lifecycle( algorand: AlgorandClient, bank: SigningAccount, currency: utils.Currency, - arranger: SigningAccount, + d_asa_client: DasaClient, + pam_primary_dealer: utils.DAsaPrimaryDealer, + pam_account_manager: utils.DAsaAccountManager, ) -> None: current_ts = utils.get_latest_timestamp(algorand.client.algod) issuance_delay = cycle_duration_seconds(ISSUANCE_DELAY_CYCLE) @@ -77,9 +77,11 @@ def test_zero_coupon_pam_discounted_full_lifecycle( assert normalized.terms.rate_reset_next == 0 bank_funding_amount = scaled_principal - scaled_issue_price - lifecycle = setup_pam_lifecycle( + participants = setup_pam_lifecycle( + client=d_asa_client, + primary_dealer=pam_primary_dealer, + account_manager=pam_account_manager, algorand=algorand, - arranger=arranger, bank=bank, currency=currency, normalized=normalized, @@ -87,9 +89,9 @@ def test_zero_coupon_pam_discounted_full_lifecycle( investor_payment_amount=normalized.terms.initial_exchange_amount, prospectus_url="ACTUS zero coupon PAM lifecycle", ) - client = lifecycle.client - investor = lifecycle.investor - receiver = lifecycle.receiver + client = d_asa_client + investor = participants.investor + receiver = participants.receiver account_position = client.send.account_get_position( AccountGetPositionArgs(holding_address=investor.address) @@ -106,33 +108,11 @@ def test_zero_coupon_pam_discounted_full_lifecycle( assert contract_state.event_cursor == 0 assert contract_state.schedule_entry_count == len(normalized.schedule) - with pytest.raises(LogicError, match=err.PENDING_IED): - client.send.fund_due_cashflows(FundDueCashflowsArgs(max_event_count=1)) - - with pytest.raises(LogicError, match=err.PENDING_IED): - client.send.claim_due_cashflows( - ClaimDueCashflowsArgs( - holding_address=investor.address, - payment_info=b"", - ), - params=CommonAppCallParams( - sender=investor.address, - signer=investor.signer, - ), - ) - - with pytest.raises(LogicError, match=err.PENDING_IED): - client.send.transfer( - TransferArgs( - sender_holding_address=investor.address, - receiver_holding_address=receiver.address, - units=1, - ), - params=CommonAppCallParams( - sender=investor.address, - signer=investor.signer, - ), - ) + assert_pending_ied_guards( + client=client, + investor=investor, + receiver=receiver, + ) ied_entry = normalized.schedule[0] utils.time_warp(ied_entry.scheduled_time + cst.DAY_2_SEC) diff --git a/tests/sdk/test_deploy_config.py b/tests/sdk/test_deploy_config.py new file mode 100644 index 00000000..7485c8b0 --- /dev/null +++ b/tests/sdk/test_deploy_config.py @@ -0,0 +1,86 @@ +from smart_contracts import constants as cst +from smart_contracts.d_asa.deploy_config import ( + DEMO_FCB_NOMINAL_RATE, + DEMO_NOTIONAL_PRINCIPAL, + DEMO_NOTIONAL_UNIT_VALUE, + DEMO_ZCB_DISCOUNT_BPS, + DemoDeploymentContext, + DenominationAsset, + build_fixed_coupon_bond_demo, + build_zero_coupon_bond_demo, +) + +CURRENT_TS = 1_700_000_000 +DENOMINATION_ASSET_ID = 12345 +DENOMINATION_ASSET_DECIMALS = 2 +ISSUANCE_DELAY_SECONDS = 30 * cst.DAY_2_SEC +FIXED_COUPON_PERIOD_SECONDS = 90 * cst.DAY_2_SEC +FIXED_COUPON_MATURITY_SECONDS = 1800 * cst.DAY_2_SEC +ZERO_COUPON_MATURITY_SECONDS = 360 * cst.DAY_2_SEC + + +def _context() -> DemoDeploymentContext: + return DemoDeploymentContext( + current_ts=CURRENT_TS, + denomination_asset=DenominationAsset( + asset_id=DENOMINATION_ASSET_ID, + decimals=DENOMINATION_ASSET_DECIMALS, + ), + ) + + +def test_fixed_coupon_bond_demo_builds_expected_schedule() -> None: + spec = build_fixed_coupon_bond_demo(_context()) + normalized = spec.normalized + + issuance_date = CURRENT_TS + ISSUANCE_DELAY_SECONDS + maturity_date = issuance_date + FIXED_COUPON_MATURITY_SECONDS + expected_event_types = ["IED"] + ["IP"] * 20 + ["MD"] + + assert spec.label == "FCB" + assert normalized.terms.denomination_asset_id == DENOMINATION_ASSET_ID + assert normalized.terms.initial_exchange_date == issuance_date + assert normalized.terms.maturity_date == maturity_date + assert normalized.terms.notional_principal == 1_000_000 + assert normalized.terms.initial_exchange_amount == 1_000_000 + assert ( + normalized.terms.total_units + == DEMO_NOTIONAL_PRINCIPAL // DEMO_NOTIONAL_UNIT_VALUE + ) + assert normalized.terms.rate_reset_next == int( + DEMO_FCB_NOMINAL_RATE * cst.FIXED_POINT_SCALE + ) + assert [entry.event_type for entry in normalized.schedule] == expected_event_types + assert normalized.schedule[0].scheduled_time == issuance_date + assert ( + normalized.schedule[1].scheduled_time + == issuance_date + FIXED_COUPON_PERIOD_SECONDS + ) + assert normalized.schedule[-1].scheduled_time == maturity_date + + +def test_zero_coupon_bond_demo_builds_expected_schedule() -> None: + spec = build_zero_coupon_bond_demo(_context()) + normalized = spec.normalized + + issuance_date = CURRENT_TS + ISSUANCE_DELAY_SECONDS + maturity_date = issuance_date + ZERO_COUPON_MATURITY_SECONDS + discount_amount = DEMO_NOTIONAL_PRINCIPAL * DEMO_ZCB_DISCOUNT_BPS // cst.BPS + issue_price = ( + DEMO_NOTIONAL_PRINCIPAL - discount_amount + ) * 10**DENOMINATION_ASSET_DECIMALS + + assert spec.label == "ZCB" + assert normalized.terms.denomination_asset_id == DENOMINATION_ASSET_ID + assert normalized.terms.initial_exchange_date == issuance_date + assert normalized.terms.maturity_date == maturity_date + assert normalized.terms.notional_principal == 1_000_000 + assert normalized.terms.initial_exchange_amount == issue_price + assert ( + normalized.terms.total_units + == DEMO_NOTIONAL_PRINCIPAL // DEMO_NOTIONAL_UNIT_VALUE + ) + assert normalized.terms.rate_reset_next == 0 + assert [entry.event_type for entry in normalized.schedule] == ["IED", "MD"] + assert normalized.schedule[0].scheduled_time == issuance_date + assert normalized.schedule[1].scheduled_time == maturity_date From 30d3f68fd24b81205a61a39880ea1057fc551882 Mon Sep 17 00:00:00 2001 From: cusma Date: Thu, 12 Mar 2026 22:30:49 +0100 Subject: [PATCH 142/244] chore: please mypy --- smart_contracts/d_asa/deploy_config.py | 73 ++++++++++++++------------ src/normalization/conversions.py | 17 ++++-- src/normalization/core.py | 44 +++++++++------- src/normalization/event_seeds.py | 9 +++- src/normalization/schedules.py | 2 + src/schedule.py | 8 +-- 6 files changed, 92 insertions(+), 61 deletions(-) diff --git a/smart_contracts/d_asa/deploy_config.py b/smart_contracts/d_asa/deploy_config.py index 6238da55..cfc97545 100644 --- a/smart_contracts/d_asa/deploy_config.py +++ b/smart_contracts/d_asa/deploy_config.py @@ -2,8 +2,9 @@ import logging import os -from collections.abc import Callable +from collections.abc import Callable, Mapping from dataclasses import dataclass +from typing import cast import algokit_utils from algokit_utils import ( @@ -18,6 +19,21 @@ from smart_contracts import constants as cst from smart_contracts import enums +from smart_contracts.artifacts.d_asa.dasa_client import ( + ContractConfigArgs, + ContractCreateArgs, + ContractScheduleArgs, + DasaClient, + DasaFactory, + DasaMethodCallCreateParams, + Prospectus, +) +from smart_contracts.artifacts.d_asa.dasa_client import ( + InitialKernelState as ClientInitialKernelState, +) +from smart_contracts.artifacts.d_asa.dasa_client import ( + NormalizedActusTerms as ClientNormalizedActusTerms, +) from src import ( ExecutionScheduleEntry, NormalizationResult, @@ -31,6 +47,10 @@ logger = logging.getLogger(__name__) +AlgodStatus = Mapping[str, int] +AlgodBlock = Mapping[str, int] +AlgodBlockInfo = Mapping[str, object] + DEMO_APP_FUNDING_ALGO = 2 DEMO_ASSET_DECIMALS = 2 DEMO_ASSET_NAME = "D-ASA Demo Euro" @@ -115,8 +135,11 @@ def _cycle_duration_seconds(cycle: Cycle) -> int: def _get_latest_timestamp(algorand: algokit_utils.AlgorandClient) -> int: algod_client = algorand.client.algod - last_round = algod_client.status()["last-round"] - return int(algod_client.block_info(last_round)["block"]["ts"]) + status = cast(AlgodStatus, algod_client.status()) + last_round = status["last-round"] + block_info = cast(AlgodBlockInfo, algod_client.block_info(last_round)) + block = cast(AlgodBlock, block_info["block"]) + return block["ts"] def _resolve_denomination_asset( @@ -134,12 +157,14 @@ def _resolve_denomination_asset( ) return DenominationAsset(asset_id=asset.asset_id, decimals=asset.decimals) - decimals = int(os.getenv("DENOMINATION_ASSET_DECIMALS", str(DEMO_ASSET_DECIMALS))) - total = int(os.getenv("DENOMINATION_ASSET_TOTAL", str(DEMO_ASSET_TOTAL))) * ( - 10**decimals + decimals: int = int( + os.getenv("DENOMINATION_ASSET_DECIMALS", str(DEMO_ASSET_DECIMALS)) ) - asset_name = os.getenv("DENOMINATION_ASSET_NAME", DEMO_ASSET_NAME) - unit_name = os.getenv("DENOMINATION_ASSET_UNIT_NAME", DEMO_ASSET_UNIT_NAME) + asset_total: int = int(os.getenv("DENOMINATION_ASSET_TOTAL", str(DEMO_ASSET_TOTAL))) + scale: int = 10**decimals + total: int = asset_total * scale + asset_name: str = os.getenv("DENOMINATION_ASSET_NAME", DEMO_ASSET_NAME) + unit_name: str = os.getenv("DENOMINATION_ASSET_UNIT_NAME", DEMO_ASSET_UNIT_NAME) asset_id = algorand.send.asset_create( AssetCreateParams( @@ -233,10 +258,8 @@ def build_zero_coupon_bond_demo(context: DemoDeploymentContext) -> DemoInstrumen ) -def _client_terms(result: NormalizationResult) -> object: - from smart_contracts.artifacts.d_asa.dasa_client import NormalizedActusTerms - - return NormalizedActusTerms( +def _client_terms(result: NormalizationResult) -> ClientNormalizedActusTerms: + return ClientNormalizedActusTerms( contract_type=result.terms.contract_type, denomination_asset_id=result.terms.denomination_asset_id, settlement_asset_id=result.terms.denomination_asset_id, @@ -258,10 +281,8 @@ def _client_terms(result: NormalizationResult) -> object: ) -def _client_initial_state(result: NormalizationResult) -> object: - from smart_contracts.artifacts.d_asa.dasa_client import InitialKernelState - - return InitialKernelState( +def _client_initial_state(result: NormalizationResult) -> ClientInitialKernelState: + return ClientInitialKernelState( status_date=result.initial_state.status_date, event_cursor=result.initial_state.event_cursor, outstanding_principal=result.initial_state.outstanding_principal, @@ -316,15 +337,9 @@ def _fund_app_account( def _configure_demo_app( *, - client: object, + client: DasaClient, spec: DemoInstrumentSpec, ) -> None: - from smart_contracts.artifacts.d_asa.dasa_client import ( - ContractConfigArgs, - ContractScheduleArgs, - Prospectus, - ) - client.send.contract_config( ContractConfigArgs( terms=_client_terms(spec.normalized), @@ -350,7 +365,7 @@ def _configure_demo_app( def _needs_configuration( *, - client: object, + client: DasaClient, operation: algokit_utils.OperationPerformed, ) -> bool: if operation in ( @@ -358,25 +373,19 @@ def _needs_configuration( algokit_utils.OperationPerformed.Replace, ): return True - assert hasattr(client, "state") return client.state.global_state.status == enums.STATUS_INACTIVE def _deploy_instrument( *, app_name: str, - factory: object, + factory: DasaFactory, arranger: SigningAccount, deployer: SigningAccount, algorand: algokit_utils.AlgorandClient, build_spec: Callable[[DemoDeploymentContext], DemoInstrumentSpec], demo_context: DemoDeploymentContext | None, ) -> DemoDeploymentContext | None: - from smart_contracts.artifacts.d_asa.dasa_client import ( - ContractCreateArgs, - DasaMethodCallCreateParams, - ) - client, result = factory.deploy( app_name=app_name, create_params=DasaMethodCallCreateParams( @@ -416,8 +425,6 @@ def _deploy_instrument( # define deployment behaviour based on supplied app spec def deploy() -> None: - from smart_contracts.artifacts.d_asa.dasa_client import DasaFactory - algorand = algokit_utils.AlgorandClient.from_environment() deployer = algorand.account.from_environment("DEPLOYER") arranger = _get_arranger_account(algorand=algorand, deployer=deployer) diff --git a/src/normalization/conversions.py b/src/normalization/conversions.py index 7e8ac4a4..e0b3a118 100644 --- a/src/normalization/conversions.py +++ b/src/normalization/conversions.py @@ -3,6 +3,7 @@ from __future__ import annotations from decimal import Decimal +from typing import cast from smart_contracts import constants as cst @@ -33,8 +34,10 @@ def to_asa_units(amount: int | float | Decimal, asa_decimals: int) -> int: ActusNormalizationError: If result exceeds uint64 bounds. """ if isinstance(amount, (int, float, Decimal)): - scale = 10**asa_decimals - result = int(Decimal(str(amount)) * scale) + scale = cast(int, 10**asa_decimals) + amount_decimal = Decimal(str(amount)) + scale_decimal = Decimal(scale) + result = int(amount_decimal * scale_decimal) else: raise TypeError(f"Unsupported value type: {type(amount)}") @@ -67,7 +70,9 @@ def rate_to_fp(value: int | float | Decimal) -> int: ActusNormalizationError: If result exceeds uint64 bounds. """ if isinstance(value, (int, float, Decimal)): - result = int(Decimal(str(value)) * cst.FIXED_POINT_SCALE) + value_decimal = Decimal(str(value)) + scale_decimal = Decimal(cst.FIXED_POINT_SCALE) + result = int(value_decimal * scale_decimal) else: raise TypeError(f"Unsupported value type: {type(value)}") @@ -107,13 +112,15 @@ def compute_initial_exchange_amount( # Handle premium (negative) and discount (positive) separately # to avoid to_asa_units rejecting negative values + scale = cast(int, 10**asa_decimals) + notional_display = notional / scale if premium_discount_at_ied >= 0: pdied = to_asa_units(premium_discount_at_ied, asa_decimals) # Validate that discount doesn't exceed notional (would result in negative amount) if pdied > notional: raise ActusNormalizationError( f"Premium/discount at IED ({premium_discount_at_ied}) exceeds notional " - f"({notional / (10 ** asa_decimals)}), which would result in a negative " + f"({notional_display}), which would result in a negative " f"initial exchange amount. This is invalid for uint64 encoding." ) result = notional - pdied @@ -126,7 +133,7 @@ def compute_initial_exchange_amount( if result > cst.MAX_UINT64: raise ActusNormalizationError( f"Initial exchange amount {result} exceeds uint64 maximum ({cst.MAX_UINT64}). " - f"Notional={notional / (10 ** asa_decimals)}, " + f"Notional={notional_display}, " f"premium_discount_at_ied={premium_discount_at_ied}" ) diff --git a/src/normalization/core.py b/src/normalization/core.py index dd6ee62f..b2d9e728 100644 --- a/src/normalization/core.py +++ b/src/normalization/core.py @@ -32,6 +32,11 @@ from .event_seeds import EventSeed, get_seed_sort_key, seed_from_preprocessed +def _coerce_schedule_int(value: int | float | Decimal) -> int: + """Coerce pre-normalized schedule payload values to concrete ints.""" + return int(value) + + def extract_base_contract_type(contract_type: str) -> str: """ Extract the base contract type from a potentially subtyped contract type string. @@ -306,9 +311,13 @@ def build_schedule( event_id=event_id, event_type=seed.event_type, scheduled_time=seed.scheduled_time, - accrual_factor=accrual_factor, - redemption_accrual_factor=redemption_accrual_factor, - next_nominal_interest_rate=seed.next_nominal_interest_rate, + accrual_factor=_coerce_schedule_int(accrual_factor), + redemption_accrual_factor=_coerce_schedule_int( + redemption_accrual_factor + ), + next_nominal_interest_rate=_coerce_schedule_int( + seed.next_nominal_interest_rate + ), next_principal_redemption=seed.next_principal_redemption, next_outstanding_principal=seed.next_outstanding_principal, flags=seed.flags, @@ -340,19 +349,16 @@ def build_schedule_seeds( Returns: Tuple of event seeds for the contract's execution schedule. """ - # PAM and CLM don't require asa_decimals - if contract_type in ("PAM", "CLM"): - dispatch = { - "PAM": build_pam_schedule, - "CLM": build_clm_schedule, - } - return dispatch[contract_type](contract, terms) - - # Other contract types require asa_decimals - dispatch = { - "LAM": build_lam_schedule, - "NAM": build_nam_schedule, - "ANN": build_ann_schedule, - "LAX": build_lax_schedule, - } - return dispatch[contract_type](contract, terms, asa_decimals) + if contract_type == "PAM": + return build_pam_schedule(contract, terms) + if contract_type == "CLM": + return build_clm_schedule(contract, terms) + if contract_type == "LAM": + return build_lam_schedule(contract, terms, asa_decimals) + if contract_type == "NAM": + return build_nam_schedule(contract, terms, asa_decimals) + if contract_type == "ANN": + return build_ann_schedule(contract, terms, asa_decimals) + if contract_type == "LAX": + return build_lax_schedule(contract, terms, asa_decimals) + raise ActusNormalizationError(f"Unsupported ACTUS contract type: {contract_type}") diff --git a/src/normalization/event_seeds.py b/src/normalization/event_seeds.py index 6725f855..f9dc625b 100644 --- a/src/normalization/event_seeds.py +++ b/src/normalization/event_seeds.py @@ -136,4 +136,11 @@ def get_seed_sort_key(seed: EventSeed) -> tuple[int, int, str]: def deduplicate_timestamps(ts: Sequence[UTCTimeStamp]) -> tuple[UTCTimeStamp, ...]: """Remove duplicate timestamps while preserving sorted schedule order.""" - return tuple(dict.fromkeys(sorted(ts))) + seen: set[UTCTimeStamp] = set() + ordered_unique: list[UTCTimeStamp] = [] + for timestamp in sorted(ts): + if timestamp in seen: + continue + seen.add(timestamp) + ordered_unique.append(timestamp) + return tuple(ordered_unique) diff --git a/src/normalization/schedules.py b/src/normalization/schedules.py index 05620f51..145bb778 100644 --- a/src/normalization/schedules.py +++ b/src/normalization/schedules.py @@ -62,6 +62,8 @@ def resolve_principal_schedule( # Use provided end_date or fall back to terms.maturity_date effective_end = end_date if end_date is not None else terms.maturity_date + if effective_end is None: + return () if cycles: timestamps = resolve_array_schedule( diff --git a/src/schedule.py b/src/schedule.py index 2e2561e5..601a8d15 100644 --- a/src/schedule.py +++ b/src/schedule.py @@ -3,7 +3,7 @@ from calendar import monthrange from collections.abc import Sequence from dataclasses import dataclass -from typing import Literal +from typing import Literal, cast from smart_contracts.constants import DAY_2_SEC @@ -16,6 +16,8 @@ from .errors import UnsupportedActusFeatureError from .unix_time import UTCTimeStamp, datetime_to_timestamp, timestamp_to_datetime +CycleUnit = Literal["D", "W", "M", "Q", "H", "Y"] + @dataclass(frozen=True, slots=True) class Cycle: @@ -40,7 +42,7 @@ class Cycle: """ count: int - unit: Literal["D", "W", "M", "Q", "H", "Y"] + unit: CycleUnit stub: str = "" @classmethod @@ -102,7 +104,7 @@ def parse_cycle(cls, raw_cycle: str | Cycle) -> Cycle: if count <= 0: raise ValueError(f"Cycle count must be positive, got: {count}") - return Cycle(count=count, unit=unit, stub=stub) + return Cycle(count=count, unit=cast(CycleUnit, unit), stub=stub) def _add_month_cycle_from_anchor( From a5595b041f3b7e2db9d251aa6ca54bec62c152cb Mon Sep 17 00:00:00 2001 From: cusma Date: Thu, 12 Mar 2026 22:39:16 +0100 Subject: [PATCH 143/244] chore: rename methods --- modules/accounting.py | 2 +- modules/actus_kernel.py | 6 +++--- modules/rbac.py | 2 +- modules/transfer_agent.py | 2 +- tests/mock_module_rbac/test_mock_rbac_module.py | 16 ++++++++-------- tests/pam/fcb/test_pam_fixed_coupon_bond.py | 8 ++++---- tests/pam/zcb/test_pam_zero_coupon_bond.py | 8 ++++---- 7 files changed, 22 insertions(+), 22 deletions(-) diff --git a/modules/accounting.py b/modules/accounting.py index 6e01f3c6..206ed5a4 100644 --- a/modules/accounting.py +++ b/modules/accounting.py @@ -163,7 +163,7 @@ def _apply_transfer( self._credit_units(receiver_holding_address, units) @arc4.abimethod - def account_gov_suspension( + def account_suspension( self, *, holding_address: Account, suspended: bool ) -> UInt64: """ diff --git a/modules/actus_kernel.py b/modules/actus_kernel.py index 7027b290..2d529788 100644 --- a/modules/actus_kernel.py +++ b/modules/actus_kernel.py @@ -1047,7 +1047,7 @@ def contract_schedule( return Global.latest_timestamp @arc4.abimethod - def execute_ied(self) -> UInt64: + def contract_execute_ied(self) -> UInt64: """Execute the first due `IED` entry and activate the contract. `IED` is the one non-cash event that moves the app from @@ -1114,7 +1114,7 @@ def apply_non_cash_event( return Global.latest_timestamp @arc4.abimethod(readonly=True) - def get_contract_state(self) -> typ.KernelState: + def contract_get_state(self) -> typ.KernelState: """Return a readonly snapshot of the generic ACTUS kernel state.""" self._assert_configured() return typ.KernelState( @@ -1136,7 +1136,7 @@ def get_contract_state(self) -> typ.KernelState: ) @arc4.abimethod(readonly=True) - def get_next_due_event(self) -> typ.ExecutionScheduleEntry: + def contract_get_next_due_event(self) -> typ.ExecutionScheduleEntry: """Return the next boxed schedule entry, or a zeroed sentinel if ended.""" self._assert_configured() if self.event_cursor >= self.schedule_entry_count: diff --git a/modules/rbac.py b/modules/rbac.py index 81a1f005..a9a71237 100644 --- a/modules/rbac.py +++ b/modules/rbac.py @@ -239,7 +239,7 @@ def rbac_revoke_role(self, *, role_id: arc4.UInt8, role_address: Account) -> UIn return Global.latest_timestamp @arc4.abimethod # TODO: Update specs and add test - def rbac_gov_asset_suspension(self, *, suspended: bool) -> UInt64: + def rbac_contract_suspension(self, *, suspended: bool) -> UInt64: """ Set asset suspension status diff --git a/modules/transfer_agent.py b/modules/transfer_agent.py index 0f604a20..73afbd74 100644 --- a/modules/transfer_agent.py +++ b/modules/transfer_agent.py @@ -20,7 +20,7 @@ def _assert_transfer_is_open(self) -> None: ), err.CLOSED_TRANSFER @arc4.abimethod - def set_transfer_schedule( + def transfer_set_schedule( self, *, open_date: UInt64, closure_date: UInt64 ) -> UInt64: self._assert_caller_is_arranger() diff --git a/tests/mock_module_rbac/test_mock_rbac_module.py b/tests/mock_module_rbac/test_mock_rbac_module.py index 427b3a8a..c9587689 100644 --- a/tests/mock_module_rbac/test_mock_rbac_module.py +++ b/tests/mock_module_rbac/test_mock_rbac_module.py @@ -12,9 +12,9 @@ MockRbacModuleClient, MockRbacModuleSend, RbacAssignRoleArgs, + RbacContractSuspensionArgs, RbacGetAddressRolesArgs, RbacGetRoleValidityArgs, - RbacGovAssetSuspensionArgs, RbacRevokeRoleArgs, RbacRotateArrangerArgs, RbacSetOpDaemonArgs, @@ -55,7 +55,7 @@ def test_mock_rbac_send_surface_matches_current_abi() -> None: "rbac_get_address_roles", "rbac_get_arranger", "rbac_get_role_validity", - "rbac_gov_asset_suspension", + "rbac_contract_suspension", "rbac_revoke_role", "rbac_rotate_arranger", "rbac_set_op_daemon", @@ -264,22 +264,22 @@ def test_rbac_gov_asset_suspension_is_authority_only( ) -> None: assert not rbac_client.state.global_state.asset_suspended - result = rbac_client.send.rbac_gov_asset_suspension( - RbacGovAssetSuspensionArgs(suspended=True), + result = rbac_client.send.rbac_contract_suspension( + RbacContractSuspensionArgs(suspended=True), params=CommonAppCallParams(sender=authority.address), ) assert result.abi_return > 0 assert rbac_client.state.global_state.asset_suspended - rbac_client.send.rbac_gov_asset_suspension( - RbacGovAssetSuspensionArgs(suspended=False), + rbac_client.send.rbac_contract_suspension( + RbacContractSuspensionArgs(suspended=False), params=CommonAppCallParams(sender=authority.address), ) assert not rbac_client.state.global_state.asset_suspended with pytest.raises(LogicError, match=err.UNAUTHORIZED): - rbac_client.send.rbac_gov_asset_suspension( - RbacGovAssetSuspensionArgs(suspended=True), + rbac_client.send.rbac_contract_suspension( + RbacContractSuspensionArgs(suspended=True), params=CommonAppCallParams(sender=no_role_account.address), ) diff --git a/tests/pam/fcb/test_pam_fixed_coupon_bond.py b/tests/pam/fcb/test_pam_fixed_coupon_bond.py index 6d706bd6..de1ae480 100644 --- a/tests/pam/fcb/test_pam_fixed_coupon_bond.py +++ b/tests/pam/fcb/test_pam_fixed_coupon_bond.py @@ -134,7 +134,7 @@ def test_fixed_coupon_pam_full_lifecycle( assert account_position.units == 0 assert account_position.reserved_units == normalized.terms.total_units - contract_state = client.send.get_contract_state().abi_return + contract_state = client.send.contract_get_state().abi_return assert contract_state.contract_type == CONTRACT_TYPE_IDS["PAM"] assert contract_state.status == enums.STATUS_PENDING_IED assert contract_state.total_units == normalized.terms.total_units @@ -151,7 +151,7 @@ def test_fixed_coupon_pam_full_lifecycle( ied_entry = normalized.schedule[0] utils.time_warp(ied_entry.scheduled_time + cst.DAY_2_SEC) - ied_result = client.send.execute_ied() + ied_result = client.send.contract_execute_ied() ied_event = utils.decode_actus_execution_event( utils.get_event_from_call_result(ied_result) ) @@ -163,7 +163,7 @@ def test_fixed_coupon_pam_full_lifecycle( assert ied_event["payoff_sign"] == enums.PAYOFF_SIGN_POSITIVE assert ied_event["settled_amount"] == 0 - contract_state = client.send.get_contract_state().abi_return + contract_state = client.send.contract_get_state().abi_return assert contract_state.status == enums.STATUS_ACTIVE assert contract_state.event_cursor == 1 assert contract_state.initial_exchange_amount == scaled_principal @@ -242,7 +242,7 @@ def test_fixed_coupon_pam_full_lifecycle( total_interest_claimed += claim.interest_amount total_principal_claimed += claim.principal_amount - contract_state = client.send.get_contract_state().abi_return + contract_state = client.send.contract_get_state().abi_return final_position = client.send.account_get_position( AccountGetPositionArgs(holding_address=investor.address) ).abi_return diff --git a/tests/pam/zcb/test_pam_zero_coupon_bond.py b/tests/pam/zcb/test_pam_zero_coupon_bond.py index b13f48ad..0bea6f1c 100644 --- a/tests/pam/zcb/test_pam_zero_coupon_bond.py +++ b/tests/pam/zcb/test_pam_zero_coupon_bond.py @@ -99,7 +99,7 @@ def test_zero_coupon_pam_discounted_full_lifecycle( assert account_position.units == 0 assert account_position.reserved_units == normalized.terms.total_units - contract_state = client.send.get_contract_state().abi_return + contract_state = client.send.contract_get_state().abi_return assert contract_state.contract_type == CONTRACT_TYPE_IDS["PAM"] assert contract_state.status == enums.STATUS_PENDING_IED assert contract_state.total_units == normalized.terms.total_units @@ -116,7 +116,7 @@ def test_zero_coupon_pam_discounted_full_lifecycle( ied_entry = normalized.schedule[0] utils.time_warp(ied_entry.scheduled_time + cst.DAY_2_SEC) - ied_result = client.send.execute_ied() + ied_result = client.send.contract_execute_ied() ied_event = utils.decode_actus_execution_event( utils.get_event_from_call_result(ied_result) ) @@ -128,7 +128,7 @@ def test_zero_coupon_pam_discounted_full_lifecycle( assert ied_event["payoff_sign"] == enums.PAYOFF_SIGN_POSITIVE assert ied_event["settled_amount"] == 0 - contract_state = client.send.get_contract_state().abi_return + contract_state = client.send.contract_get_state().abi_return assert contract_state.status == enums.STATUS_ACTIVE assert contract_state.event_cursor == 1 assert contract_state.initial_exchange_amount == scaled_issue_price @@ -184,7 +184,7 @@ def test_zero_coupon_pam_discounted_full_lifecycle( assert claim.principal_amount == scaled_principal assert balance_after - balance_before == scaled_principal - contract_state = client.send.get_contract_state().abi_return + contract_state = client.send.contract_get_state().abi_return final_position = client.send.account_get_position( AccountGetPositionArgs(holding_address=investor.address) ).abi_return From 36667bba9ac015af72b81ae79b9338b135d3b3c9 Mon Sep 17 00:00:00 2001 From: cusma Date: Thu, 12 Mar 2026 22:39:27 +0100 Subject: [PATCH 144/244] chore: build artifacts --- .../artifacts/d_asa/DASA.approval.puya.map | 86 ++++---- .../artifacts/d_asa/DASA.approval.teal | 36 +-- .../artifacts/d_asa/DASA.arc56.json | 16 +- .../artifacts/d_asa/dasa_client.py | 206 +++++++++--------- .../MockRbacModule.approval.puya.map | 16 +- .../MockRbacModule.approval.teal | 8 +- .../MockRbacModule.arc56.json | 6 +- .../mock_rbac_module_client.py | 44 ++-- 8 files changed, 209 insertions(+), 209 deletions(-) diff --git a/smart_contracts/artifacts/d_asa/DASA.approval.puya.map b/smart_contracts/artifacts/d_asa/DASA.approval.puya.map index 7ef44c3e..856b0992 100644 --- a/smart_contracts/artifacts/d_asa/DASA.approval.puya.map +++ b/smart_contracts/artifacts/d_asa/DASA.approval.puya.map @@ -992,53 +992,53 @@ "stack_out": [] }, "1025": { - "op": "pushbytess 0xb44618c8 0xe7832529 0x7ea20e0b 0x6c85e3ee 0xbdd1a944 0xdc063b35 0x14fc10ef 0x74a7297f 0x09d4fe14 0x9a9bfa85 0x85eed33d 0x9185104a 0xd9f225ac 0x6e0e5c95 0xff3fd4b3 0x82f71b2d 0xef04f5d3 0xdf343550 0x3dbe80bd 0xdf54e82c 0x010c8299 0x7406acd2 0x1a72a2ee // method \"fund_due_cashflows(uint64)(uint64,uint64,uint64,uint64,uint64)\", method \"claim_due_cashflows(address,byte[])(uint64,uint64,uint64,uint64,byte[])\", method \"set_transfer_schedule(uint64,uint64)uint64\", method \"primary_distribution(address,uint64)uint64\", method \"transfer(address,address,uint64)uint64\", method \"account_gov_suspension(address,bool)uint64\", method \"account_open(address,address)uint64\", method \"account_update_payment_address(address,address)uint64\", method \"account_get_position(address)(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64)\", method \"contract_config((uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64),(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64),(byte[32],string))uint64\", method \"contract_schedule(uint64,bool,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[])uint64\", method \"execute_ied()uint64\", method \"apply_non_cash_event(uint64,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64\", method \"get_contract_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)\", method \"get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)\", method \"rbac_rotate_arranger(address)uint64\", method \"rbac_set_op_daemon(address)uint64\", method \"rbac_assign_role(uint8,address,(uint64,uint64))uint64\", method \"rbac_revoke_role(uint8,address)uint64\", method \"rbac_gov_asset_suspension(bool)uint64\", method \"rbac_get_arranger()address\", method \"rbac_get_address_roles(address)(bool,bool,bool,bool,bool)\", method \"rbac_get_role_validity(uint8,address)(uint64,uint64)\"", + "op": "pushbytess 0xb44618c8 0xe7832529 0x94388723 0x6c85e3ee 0xbdd1a944 0x7c0f1812 0x14fc10ef 0x74a7297f 0x09d4fe14 0x9a9bfa85 0x85eed33d 0xab2c0fc4 0xd9f225ac 0x8ea6e74c 0x02af557a 0x82f71b2d 0xef04f5d3 0xdf343550 0x3dbe80bd 0x1e3e48e7 0x010c8299 0x7406acd2 0x1a72a2ee // method \"fund_due_cashflows(uint64)(uint64,uint64,uint64,uint64,uint64)\", method \"claim_due_cashflows(address,byte[])(uint64,uint64,uint64,uint64,byte[])\", method \"transfer_set_schedule(uint64,uint64)uint64\", method \"primary_distribution(address,uint64)uint64\", method \"transfer(address,address,uint64)uint64\", method \"account_suspension(address,bool)uint64\", method \"account_open(address,address)uint64\", method \"account_update_payment_address(address,address)uint64\", method \"account_get_position(address)(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64)\", method \"contract_config((uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64),(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64),(byte[32],string))uint64\", method \"contract_schedule(uint64,bool,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[])uint64\", method \"contract_execute_ied()uint64\", method \"apply_non_cash_event(uint64,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64\", method \"contract_get_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)\", method \"contract_get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)\", method \"rbac_rotate_arranger(address)uint64\", method \"rbac_set_op_daemon(address)uint64\", method \"rbac_assign_role(uint8,address,(uint64,uint64))uint64\", method \"rbac_revoke_role(uint8,address)uint64\", method \"rbac_contract_suspension(bool)uint64\", method \"rbac_get_arranger()address\", method \"rbac_get_address_roles(address)(bool,bool,bool,bool,bool)\", method \"rbac_get_role_validity(uint8,address)(uint64,uint64)\"", "defined_out": [ "Method(account_get_position(address)(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64))", - "Method(account_gov_suspension(address,bool)uint64)", "Method(account_open(address,address)uint64)", + "Method(account_suspension(address,bool)uint64)", "Method(account_update_payment_address(address,address)uint64)", "Method(apply_non_cash_event(uint64,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64)", "Method(claim_due_cashflows(address,byte[])(uint64,uint64,uint64,uint64,byte[]))", "Method(contract_config((uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64),(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64),(byte[32],string))uint64)", + "Method(contract_execute_ied()uint64)", + "Method(contract_get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64))", + "Method(contract_get_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))", "Method(contract_schedule(uint64,bool,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[])uint64)", - "Method(execute_ied()uint64)", "Method(fund_due_cashflows(uint64)(uint64,uint64,uint64,uint64,uint64))", - "Method(get_contract_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))", - "Method(get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64))", "Method(primary_distribution(address,uint64)uint64)", "Method(rbac_assign_role(uint8,address,(uint64,uint64))uint64)", + "Method(rbac_contract_suspension(bool)uint64)", "Method(rbac_get_address_roles(address)(bool,bool,bool,bool,bool))", "Method(rbac_get_arranger()address)", "Method(rbac_get_role_validity(uint8,address)(uint64,uint64))", - "Method(rbac_gov_asset_suspension(bool)uint64)", "Method(rbac_revoke_role(uint8,address)uint64)", "Method(rbac_rotate_arranger(address)uint64)", "Method(rbac_set_op_daemon(address)uint64)", - "Method(set_transfer_schedule(uint64,uint64)uint64)", - "Method(transfer(address,address,uint64)uint64)" + "Method(transfer(address,address,uint64)uint64)", + "Method(transfer_set_schedule(uint64,uint64)uint64)" ], "stack_out": [ "Method(fund_due_cashflows(uint64)(uint64,uint64,uint64,uint64,uint64))", "Method(claim_due_cashflows(address,byte[])(uint64,uint64,uint64,uint64,byte[]))", - "Method(set_transfer_schedule(uint64,uint64)uint64)", + "Method(transfer_set_schedule(uint64,uint64)uint64)", "Method(primary_distribution(address,uint64)uint64)", "Method(transfer(address,address,uint64)uint64)", - "Method(account_gov_suspension(address,bool)uint64)", + "Method(account_suspension(address,bool)uint64)", "Method(account_open(address,address)uint64)", "Method(account_update_payment_address(address,address)uint64)", "Method(account_get_position(address)(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64))", "Method(contract_config((uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64),(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64),(byte[32],string))uint64)", "Method(contract_schedule(uint64,bool,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[])uint64)", - "Method(execute_ied()uint64)", + "Method(contract_execute_ied()uint64)", "Method(apply_non_cash_event(uint64,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64)", - "Method(get_contract_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))", - "Method(get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64))", + "Method(contract_get_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))", + "Method(contract_get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64))", "Method(rbac_rotate_arranger(address)uint64)", "Method(rbac_set_op_daemon(address)uint64)", "Method(rbac_assign_role(uint8,address,(uint64,uint64))uint64)", "Method(rbac_revoke_role(uint8,address)uint64)", - "Method(rbac_gov_asset_suspension(bool)uint64)", + "Method(rbac_contract_suspension(bool)uint64)", "Method(rbac_get_arranger()address)", "Method(rbac_get_address_roles(address)(bool,bool,bool,bool,bool))", "Method(rbac_get_role_validity(uint8,address)(uint64,uint64))" @@ -1048,51 +1048,51 @@ "op": "txna ApplicationArgs 0", "defined_out": [ "Method(account_get_position(address)(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64))", - "Method(account_gov_suspension(address,bool)uint64)", "Method(account_open(address,address)uint64)", + "Method(account_suspension(address,bool)uint64)", "Method(account_update_payment_address(address,address)uint64)", "Method(apply_non_cash_event(uint64,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64)", "Method(claim_due_cashflows(address,byte[])(uint64,uint64,uint64,uint64,byte[]))", "Method(contract_config((uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64),(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64),(byte[32],string))uint64)", + "Method(contract_execute_ied()uint64)", + "Method(contract_get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64))", + "Method(contract_get_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))", "Method(contract_schedule(uint64,bool,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[])uint64)", - "Method(execute_ied()uint64)", "Method(fund_due_cashflows(uint64)(uint64,uint64,uint64,uint64,uint64))", - "Method(get_contract_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))", - "Method(get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64))", "Method(primary_distribution(address,uint64)uint64)", "Method(rbac_assign_role(uint8,address,(uint64,uint64))uint64)", + "Method(rbac_contract_suspension(bool)uint64)", "Method(rbac_get_address_roles(address)(bool,bool,bool,bool,bool))", "Method(rbac_get_arranger()address)", "Method(rbac_get_role_validity(uint8,address)(uint64,uint64))", - "Method(rbac_gov_asset_suspension(bool)uint64)", "Method(rbac_revoke_role(uint8,address)uint64)", "Method(rbac_rotate_arranger(address)uint64)", "Method(rbac_set_op_daemon(address)uint64)", - "Method(set_transfer_schedule(uint64,uint64)uint64)", "Method(transfer(address,address,uint64)uint64)", + "Method(transfer_set_schedule(uint64,uint64)uint64)", "tmp%10#0" ], "stack_out": [ "Method(fund_due_cashflows(uint64)(uint64,uint64,uint64,uint64,uint64))", "Method(claim_due_cashflows(address,byte[])(uint64,uint64,uint64,uint64,byte[]))", - "Method(set_transfer_schedule(uint64,uint64)uint64)", + "Method(transfer_set_schedule(uint64,uint64)uint64)", "Method(primary_distribution(address,uint64)uint64)", "Method(transfer(address,address,uint64)uint64)", - "Method(account_gov_suspension(address,bool)uint64)", + "Method(account_suspension(address,bool)uint64)", "Method(account_open(address,address)uint64)", "Method(account_update_payment_address(address,address)uint64)", "Method(account_get_position(address)(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64))", "Method(contract_config((uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64),(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64),(byte[32],string))uint64)", "Method(contract_schedule(uint64,bool,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[])uint64)", - "Method(execute_ied()uint64)", + "Method(contract_execute_ied()uint64)", "Method(apply_non_cash_event(uint64,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64)", - "Method(get_contract_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))", - "Method(get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64))", + "Method(contract_get_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))", + "Method(contract_get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64))", "Method(rbac_rotate_arranger(address)uint64)", "Method(rbac_set_op_daemon(address)uint64)", "Method(rbac_assign_role(uint8,address,(uint64,uint64))uint64)", "Method(rbac_revoke_role(uint8,address)uint64)", - "Method(rbac_gov_asset_suspension(bool)uint64)", + "Method(rbac_contract_suspension(bool)uint64)", "Method(rbac_get_arranger()address)", "Method(rbac_get_address_roles(address)(bool,bool,bool,bool,bool))", "Method(rbac_get_role_validity(uint8,address)(uint64,uint64))", @@ -1100,7 +1100,7 @@ ] }, "1145": { - "op": "match fund_due_cashflows claim_due_cashflows set_transfer_schedule primary_distribution transfer account_gov_suspension account_open account_update_payment_address account_get_position contract_config contract_schedule execute_ied apply_non_cash_event get_contract_state get_next_due_event rbac_rotate_arranger rbac_set_op_daemon rbac_assign_role rbac_revoke_role rbac_gov_asset_suspension rbac_get_arranger rbac_get_address_roles rbac_get_role_validity", + "op": "match fund_due_cashflows claim_due_cashflows transfer_set_schedule primary_distribution transfer account_suspension account_open account_update_payment_address account_get_position contract_config contract_schedule contract_execute_ied apply_non_cash_event contract_get_state contract_get_next_due_event rbac_rotate_arranger rbac_set_op_daemon rbac_assign_role rbac_revoke_role rbac_contract_suspension rbac_get_arranger rbac_get_address_roles rbac_get_role_validity", "stack_out": [] }, "1193": { @@ -16679,9 +16679,9 @@ "op": "b claim_due_cashflows_bool_merge@16" }, "2252": { - "subroutine": "modules.transfer_agent.TransferAgent.set_transfer_schedule[routing]", + "subroutine": "modules.transfer_agent.TransferAgent.transfer_set_schedule[routing]", "params": {}, - "block": "set_transfer_schedule", + "block": "transfer_set_schedule", "stack_in": [], "op": "txna ApplicationArgs 1", "defined_out": [ @@ -20896,9 +20896,9 @@ ] }, "2673": { - "subroutine": "modules.accounting.AccountingModule.account_gov_suspension[routing]", + "subroutine": "modules.accounting.AccountingModule.account_suspension[routing]", "params": {}, - "block": "account_gov_suspension", + "block": "account_suspension", "stack_in": [], "op": "txna ApplicationArgs 1", "defined_out": [ @@ -33424,9 +33424,9 @@ ] }, "3729": { - "subroutine": "modules.actus_kernel.ActusKernelModule.execute_ied[routing]", + "subroutine": "modules.actus_kernel.ActusKernelModule.contract_execute_ied[routing]", "params": {}, - "block": "execute_ied", + "block": "contract_execute_ied", "stack_in": [], "op": "intc_0 // 0", "defined_out": [ @@ -39077,9 +39077,9 @@ "op": "b apply_non_cash_event_bool_merge@17" }, "4221": { - "subroutine": "modules.actus_kernel.ActusKernelModule.get_contract_state[routing]", + "subroutine": "modules.actus_kernel.ActusKernelModule.contract_get_state[routing]", "params": {}, - "block": "get_contract_state", + "block": "contract_get_state", "stack_in": [], "op": "intc_0 // 0", "defined_out": [ @@ -41258,9 +41258,9 @@ "stack_out": [] }, "4368": { - "subroutine": "modules.actus_kernel.ActusKernelModule.get_next_due_event[routing]", + "subroutine": "modules.actus_kernel.ActusKernelModule.contract_get_next_due_event[routing]", "params": {}, - "block": "get_next_due_event", + "block": "contract_get_next_due_event", "stack_in": [], "op": "intc_0 // 0", "defined_out": [ @@ -41386,7 +41386,7 @@ ] }, "4383": { - "op": "bz get_next_due_event_after_if_else@3", + "op": "bz contract_get_next_due_event_after_if_else@3", "stack_out": [] }, "4386": { @@ -41610,7 +41610,7 @@ ] }, "4417": { - "block": "get_next_due_event_after_inlined_modules.actus_kernel.ActusKernelModule.get_next_due_event@4", + "block": "contract_get_next_due_event_after_inlined_modules.actus_kernel.ActusKernelModule.contract_get_next_due_event@4", "stack_in": [ "tmp%0#0" ], @@ -41661,7 +41661,7 @@ "stack_out": [] }, "4423": { - "block": "get_next_due_event_after_if_else@3", + "block": "contract_get_next_due_event_after_if_else@3", "stack_in": [], "op": "intc_0 // 0", "defined_out": [ @@ -41711,7 +41711,7 @@ ] }, "4430": { - "op": "b get_next_due_event_after_inlined_modules.actus_kernel.ActusKernelModule.get_next_due_event@4" + "op": "b contract_get_next_due_event_after_inlined_modules.actus_kernel.ActusKernelModule.contract_get_next_due_event@4" }, "4433": { "subroutine": "modules.rbac.RbacModule.contract_update[routing]", @@ -44541,9 +44541,9 @@ "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" }, "4817": { - "subroutine": "modules.rbac.RbacModule.rbac_gov_asset_suspension[routing]", + "subroutine": "modules.rbac.RbacModule.rbac_contract_suspension[routing]", "params": {}, - "block": "rbac_gov_asset_suspension", + "block": "rbac_contract_suspension", "stack_in": [], "op": "txna ApplicationArgs 1", "defined_out": [ diff --git a/smart_contracts/artifacts/d_asa/DASA.approval.teal b/smart_contracts/artifacts/d_asa/DASA.approval.teal index 8eb9be18..8eb4a805 100644 --- a/smart_contracts/artifacts/d_asa/DASA.approval.teal +++ b/smart_contracts/artifacts/d_asa/DASA.approval.teal @@ -269,9 +269,9 @@ main_switch_case_next@5: assert txn ApplicationID bz main_create_NoOp@31 - pushbytess 0xb44618c8 0xe7832529 0x7ea20e0b 0x6c85e3ee 0xbdd1a944 0xdc063b35 0x14fc10ef 0x74a7297f 0x09d4fe14 0x9a9bfa85 0x85eed33d 0x9185104a 0xd9f225ac 0x6e0e5c95 0xff3fd4b3 0x82f71b2d 0xef04f5d3 0xdf343550 0x3dbe80bd 0xdf54e82c 0x010c8299 0x7406acd2 0x1a72a2ee // method "fund_due_cashflows(uint64)(uint64,uint64,uint64,uint64,uint64)", method "claim_due_cashflows(address,byte[])(uint64,uint64,uint64,uint64,byte[])", method "set_transfer_schedule(uint64,uint64)uint64", method "primary_distribution(address,uint64)uint64", method "transfer(address,address,uint64)uint64", method "account_gov_suspension(address,bool)uint64", method "account_open(address,address)uint64", method "account_update_payment_address(address,address)uint64", method "account_get_position(address)(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64)", method "contract_config((uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64),(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64),(byte[32],string))uint64", method "contract_schedule(uint64,bool,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[])uint64", method "execute_ied()uint64", method "apply_non_cash_event(uint64,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64", method "get_contract_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", method "get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", method "rbac_rotate_arranger(address)uint64", method "rbac_set_op_daemon(address)uint64", method "rbac_assign_role(uint8,address,(uint64,uint64))uint64", method "rbac_revoke_role(uint8,address)uint64", method "rbac_gov_asset_suspension(bool)uint64", method "rbac_get_arranger()address", method "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", method "rbac_get_role_validity(uint8,address)(uint64,uint64)" + pushbytess 0xb44618c8 0xe7832529 0x94388723 0x6c85e3ee 0xbdd1a944 0x7c0f1812 0x14fc10ef 0x74a7297f 0x09d4fe14 0x9a9bfa85 0x85eed33d 0xab2c0fc4 0xd9f225ac 0x8ea6e74c 0x02af557a 0x82f71b2d 0xef04f5d3 0xdf343550 0x3dbe80bd 0x1e3e48e7 0x010c8299 0x7406acd2 0x1a72a2ee // method "fund_due_cashflows(uint64)(uint64,uint64,uint64,uint64,uint64)", method "claim_due_cashflows(address,byte[])(uint64,uint64,uint64,uint64,byte[])", method "transfer_set_schedule(uint64,uint64)uint64", method "primary_distribution(address,uint64)uint64", method "transfer(address,address,uint64)uint64", method "account_suspension(address,bool)uint64", method "account_open(address,address)uint64", method "account_update_payment_address(address,address)uint64", method "account_get_position(address)(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64)", method "contract_config((uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64),(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64),(byte[32],string))uint64", method "contract_schedule(uint64,bool,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[])uint64", method "contract_execute_ied()uint64", method "apply_non_cash_event(uint64,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64", method "contract_get_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", method "contract_get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", method "rbac_rotate_arranger(address)uint64", method "rbac_set_op_daemon(address)uint64", method "rbac_assign_role(uint8,address,(uint64,uint64))uint64", method "rbac_revoke_role(uint8,address)uint64", method "rbac_contract_suspension(bool)uint64", method "rbac_get_arranger()address", method "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", method "rbac_get_role_validity(uint8,address)(uint64,uint64)" txna ApplicationArgs 0 - match fund_due_cashflows claim_due_cashflows set_transfer_schedule primary_distribution transfer account_gov_suspension account_open account_update_payment_address account_get_position contract_config contract_schedule execute_ied apply_non_cash_event get_contract_state get_next_due_event rbac_rotate_arranger rbac_set_op_daemon rbac_assign_role rbac_revoke_role rbac_gov_asset_suspension rbac_get_arranger rbac_get_address_roles rbac_get_role_validity + match fund_due_cashflows claim_due_cashflows transfer_set_schedule primary_distribution transfer account_suspension account_open account_update_payment_address account_get_position contract_config contract_schedule contract_execute_ied apply_non_cash_event contract_get_state contract_get_next_due_event rbac_rotate_arranger rbac_set_op_daemon rbac_assign_role rbac_revoke_role rbac_contract_suspension rbac_get_arranger rbac_get_address_roles rbac_get_role_validity err main_create_NoOp@31: @@ -1413,8 +1413,8 @@ claim_due_cashflows_bool_false@15: b claim_due_cashflows_bool_merge@16 -// modules.transfer_agent.TransferAgent.set_transfer_schedule[routing]() -> void: -set_transfer_schedule: +// modules.transfer_agent.TransferAgent.transfer_set_schedule[routing]() -> void: +transfer_set_schedule: // modules/transfer_agent.py:22 // @arc4.abimethod txna ApplicationArgs 1 @@ -1861,8 +1861,8 @@ transfer_after_inlined_modules.actus_kernel.ActusKernelModule._assert_no_due_eve return -// modules.accounting.AccountingModule.account_gov_suspension[routing]() -> void: -account_gov_suspension: +// modules.accounting.AccountingModule.account_suspension[routing]() -> void: +account_suspension: // modules/accounting.py:165 // @arc4.abimethod txna ApplicationArgs 1 @@ -3083,8 +3083,8 @@ contract_schedule_after_if_else@17: return -// modules.actus_kernel.ActusKernelModule.execute_ied[routing]() -> void: -execute_ied: +// modules.actus_kernel.ActusKernelModule.contract_execute_ied[routing]() -> void: +contract_execute_ied: // modules/actus_kernel.py:143 // assert self.status != UInt64(enums.STATUS_INACTIVE), err.NOT_CONFIGURED intc_0 // 0 @@ -3665,8 +3665,8 @@ apply_non_cash_event_bool_false@16: b apply_non_cash_event_bool_merge@17 -// modules.actus_kernel.ActusKernelModule.get_contract_state[routing]() -> void: -get_contract_state: +// modules.actus_kernel.ActusKernelModule.contract_get_state[routing]() -> void: +contract_get_state: // modules/actus_kernel.py:143 // assert self.status != UInt64(enums.STATUS_INACTIVE), err.NOT_CONFIGURED intc_0 // 0 @@ -3838,8 +3838,8 @@ get_contract_state: return -// modules.actus_kernel.ActusKernelModule.get_next_due_event[routing]() -> void: -get_next_due_event: +// modules.actus_kernel.ActusKernelModule.contract_get_next_due_event[routing]() -> void: +contract_get_next_due_event: // modules/actus_kernel.py:143 // assert self.status != UInt64(enums.STATUS_INACTIVE), err.NOT_CONFIGURED intc_0 // 0 @@ -3858,7 +3858,7 @@ get_next_due_event: app_global_get_ex assert // check self.schedule_entry_count exists >= - bz get_next_due_event_after_if_else@3 + bz contract_get_next_due_event_after_if_else@3 // modules/actus_kernel.py:1144 // event_id=self.event_cursor, intc_0 // 0 @@ -3926,7 +3926,7 @@ get_next_due_event: swap concat -get_next_due_event_after_inlined_modules.actus_kernel.ActusKernelModule.get_next_due_event@4: +contract_get_next_due_event_after_inlined_modules.actus_kernel.ActusKernelModule.contract_get_next_due_event@4: // modules/actus_kernel.py:1138 // @arc4.abimethod(readonly=True) bytec_0 // 0x151f7c75 @@ -3936,7 +3936,7 @@ get_next_due_event_after_inlined_modules.actus_kernel.ActusKernelModule.get_next intc_1 // 1 return -get_next_due_event_after_if_else@3: +contract_get_next_due_event_after_if_else@3: // modules/actus_kernel.py:1154 // return self._get_schedule_entry(self.event_cursor) intc_0 // 0 @@ -3946,7 +3946,7 @@ get_next_due_event_after_if_else@3: callsub _get_schedule_entry // modules/actus_kernel.py:1138 // @arc4.abimethod(readonly=True) - b get_next_due_event_after_inlined_modules.actus_kernel.ActusKernelModule.get_next_due_event@4 + b contract_get_next_due_event_after_inlined_modules.actus_kernel.ActusKernelModule.contract_get_next_due_event@4 // modules.rbac.RbacModule.contract_update[routing]() -> void: @@ -4373,8 +4373,8 @@ rbac_revoke_role_after_if_else@9: b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 -// modules.rbac.RbacModule.rbac_gov_asset_suspension[routing]() -> void: -rbac_gov_asset_suspension: +// modules.rbac.RbacModule.rbac_contract_suspension[routing]() -> void: +rbac_contract_suspension: // modules/rbac.py:241 // @arc4.abimethod # TODO: Update specs and add test txna ApplicationArgs 1 diff --git a/smart_contracts/artifacts/d_asa/DASA.arc56.json b/smart_contracts/artifacts/d_asa/DASA.arc56.json index 45c17f73..e0226b38 100644 --- a/smart_contracts/artifacts/d_asa/DASA.arc56.json +++ b/smart_contracts/artifacts/d_asa/DASA.arc56.json @@ -457,7 +457,7 @@ "recommendations": {} }, { - "name": "set_transfer_schedule", + "name": "transfer_set_schedule", "args": [ { "type": "uint64", @@ -538,7 +538,7 @@ "recommendations": {} }, { - "name": "account_gov_suspension", + "name": "account_suspension", "args": [ { "type": "address", @@ -741,7 +741,7 @@ "recommendations": {} }, { - "name": "execute_ied", + "name": "contract_execute_ied", "args": [], "returns": { "type": "uint64" @@ -879,7 +879,7 @@ "recommendations": {} }, { - "name": "get_contract_state", + "name": "contract_get_state", "args": [], "returns": { "type": "(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", @@ -897,7 +897,7 @@ "recommendations": {} }, { - "name": "get_next_due_event", + "name": "contract_get_next_due_event", "args": [], "returns": { "type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", @@ -1044,7 +1044,7 @@ "recommendations": {} }, { - "name": "rbac_gov_asset_suspension", + "name": "rbac_contract_suspension", "args": [ { "type": "bool", @@ -2201,11 +2201,11 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCAzMgogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1ICJzdGF0dXMiICJldmVudF9jdXJzb3IiICJvdXRzdGFuZGluZ19wcmluY2lwYWwiICJzY2hlZHVsZV9lbnRyeV9jb3VudCIgImZpeGVkX3BvaW50X3NjYWxlIiAiYWNjcnVlZF9pbnRlcmVzdCIgImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMgIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIgInJlc2VydmVkX3VuaXRzX3RvdGFsIiAicmVzZXJ2ZWRfcHJpbmNpcGFsIiAiY29udHJhY3RfdHlwZSIgInRvdGFsX3VuaXRzIiAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIgInJlc2VydmVkX2ludGVyZXN0IiAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIgImN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IiAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMgInNldHRsZW1lbnRfYXNzZXRfaWQiICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIgMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMgMHg1MjIzNTA3MjY5NmQ2MTcyNzk0NDY1NjE2YzY1NzIyMyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMgMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzIDB4NTIyMzRmNzA0NDYxNjU2ZDZmNmUyMyAiaW5pdGlhbF9leGNoYW5nZV9kYXRlIiAidHJhbnNmZXJfb3BlbmluZ19kYXRlIiAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIiAicmF0ZV9yZXNldF9mbG9vciIgInJhdGVfcmVzZXRfY2FwIiAweDUzMjMgMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMyAiYXNzZXRfc3VzcGVuZGVkIiAiZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiIgInJhdGVfcmVzZXRfc3ByZWFkIiAicmF0ZV9yZXNldF9tdWx0aXBsaWVyIiAicmF0ZV9yZXNldF9uZXh0IiAiaGFzX3JhdGVfcmVzZXRfZmxvb3IiICJoYXNfcmF0ZV9yZXNldF9jYXAiIDB4MDAgImFzc2V0X2RlZmF1bHRlZCIgInByb3NwZWN0dXNfaGFzaCIgInByb3NwZWN0dXNfdXJsIiAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIiAibWF0dXJpdHlfZGF0ZSIgImRheV9jb3VudF9jb252ZW50aW9uIiAweDA2ODEwMQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4LTI5CiAgICAvLyAjIFJCQUMgUm9sZXMKICAgIC8vIHNlbGYuYXJyYW5nZXIgPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX0FSUkFOR0VSKQogICAgYnl0ZWMgMTggLy8gMHg1MjIzNDE3MjcyNjE2ZTY3NjU3MjIzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzAKICAgIC8vIHNlbGYub3BfZGFlbW9uID0gR2xvYmFsU3RhdGUoQWNjb3VudCgpLCBrZXk9Y3N0LlBSRUZJWF9JRF9PUF9EQUVNT04pCiAgICBieXRlYyAyNSAvLyAweDUyMjM0ZjcwNDQ2MTY1NmQ2ZjZlMjMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo0Ny00OAogICAgLy8gIyBELUFTQSBHb3Zlcm5hbmNlCiAgICAvLyBzZWxmLmFzc2V0X3N1c3BlbmRlZCA9IEZhbHNlCiAgICBieXRlYyAzMyAvLyAiYXNzZXRfc3VzcGVuZGVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NDkKICAgIC8vIHNlbGYuYXNzZXRfZGVmYXVsdGVkID0gRmFsc2UKICAgIGJ5dGVjIDQxIC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU2LTU3CiAgICAvLyAjIENvbnRyYWN0CiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMTIgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwLTYxCiAgICAvLyAjIFByb3NwZWN0dXMgKEluZm9ybWF0aW9uYWwpCiAgICAvLyBzZWxmLnByb3NwZWN0dXNfaGFzaCA9IEJ5dGVzKCkKICAgIGJ5dGVjIDQyIC8vICJwcm9zcGVjdHVzX2hhc2giCiAgICBwdXNoYnl0ZXMgMHgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MgogICAgLy8gc2VsZi5wcm9zcGVjdHVzX3VybCA9IFN0cmluZygpCiAgICBieXRlYyA0MyAvLyAicHJvc3BlY3R1c191cmwiCiAgICBwdXNoYnl0ZXMgIiIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NC02NQogICAgLy8gIyBEZW5vbWluYXRpb24KICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gQXNzZXQoKQogICAgYnl0ZWMgNDQgLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjYKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCA9IEFzc2V0KCkKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OC02OQogICAgLy8gIyBUaW1lCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgMjYgLy8gImluaXRpYWxfZXhjaGFuZ2VfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzAKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgNDUgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxCiAgICAvLyBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgMjcgLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIKICAgIC8vIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlID0gdHlwLlRpbWVTdGFtcCgpCiAgICBieXRlYyAyOCAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NC03NQogICAgLy8gIyBEYXkgQ291bnQgQ29udmVudGlvbgogICAgLy8gc2VsZi5kYXlfY291bnRfY29udmVudGlvbiA9IFVJbnQ2NCgpCiAgICBieXRlYyA0NiAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc3LTc4CiAgICAvLyAjIFVuaXRzCiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzID0gVUludDY0KCkKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPSBVSW50NjQoKQogICAgYnl0ZWMgMTAgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MS04MgogICAgLy8gIyBQcmluY2lwYWwKICAgIC8vIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPSBVSW50NjQoKQogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MwogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBVSW50NjQoKQogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NAogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gVUludDY0KCkKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NQogICAgLy8gc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gRmFsc2UKICAgIGJ5dGVjIDM0IC8vICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4Ny04OAogICAgLy8gIyBJbnRlcmVzdAogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gVUludDY0KCkKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg5CiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgPSBVSW50NjQoKQogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTEtOTIKICAgIC8vICMgSW50ZXJlc3QgUmF0ZXMKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTMKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQgPSBVSW50NjQoKQogICAgYnl0ZWMgMzUgLy8gInJhdGVfcmVzZXRfc3ByZWFkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NAogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIgPSBVSW50NjQoKQogICAgYnl0ZWMgMzYgLy8gInJhdGVfcmVzZXRfbXVsdGlwbGllciIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTUKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9mbG9vciA9IFVJbnQ2NCgpCiAgICBieXRlYyAyOSAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTYKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9jYXAgPSBVSW50NjQoKQogICAgYnl0ZWMgMzAgLy8gInJhdGVfcmVzZXRfY2FwIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NwogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X25leHQgPSBVSW50NjQoKQogICAgYnl0ZWMgMzcgLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTgKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgPSBGYWxzZQogICAgYnl0ZWMgMzggLy8gImhhc19yYXRlX3Jlc2V0X2Zsb29yIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OQogICAgLy8gc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgPSBGYWxzZQogICAgYnl0ZWMgMzkgLy8gImhhc19yYXRlX3Jlc2V0X2NhcCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAxLTEwMgogICAgLy8gIyBQcmltYXJ5IERpc3RyaWJ1dGlvbgogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgPSBVSW50NjQoKQogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAzCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0ID0gVUludDY0KCkKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA1LTEwNgogICAgLy8gIyBDdW11bGF0aXZlIFBlci1Vbml0IEZpeGVkLVBvaW50IEluZGV4ZXMKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4ID0gVUludDY0KCkKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1CiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciA9IFVJbnQ2NCgpCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNgogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA9IFVJbnQ2NCgpCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE4LTExOQogICAgLy8gIyBTY2FsaW5nCiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlID0gVUludDY0KCkKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6MjMKICAgIC8vIGFzc2VydCBUeG4uZ2xvYmFsX251bV9ieXRlX3NsaWNlID09IGNmZy5HTE9CQUxfQllURVMsIGVyci5XUk9OR19HTE9CQUxfQllURVMKICAgIHR4biBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgQnl0ZXMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjI0CiAgICAvLyBhc3NlcnQgVHhuLmdsb2JhbF9udW1fdWludCA9PSBjZmcuR0xPQkFMX1VJTlRTLCBlcnIuV1JPTkdfR0xPQkFMX1VJTlRTCiAgICB0eG4gR2xvYmFsTnVtVWludAogICAgcHVzaGludCAzNwogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgVUludHMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBhc3NlcnQgVHhuLmxvY2FsX251bV9ieXRlX3NsaWNlID09IGNmZy5MT0NBTF9CWVRFUywgZXJyLldST05HX0xPQ0FMX0JZVEVTCiAgICB0eG4gTG9jYWxOdW1CeXRlU2xpY2UKICAgICEKICAgIGFzc2VydCAvLyBXcm9uZyBMb2NhbCBCeXRlcyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6MjYKICAgIC8vIGFzc2VydCBUeG4ubG9jYWxfbnVtX3VpbnQgPT0gY2ZnLkxPQ0FMX1VJTlRTLCBlcnIuV1JPTkdfTE9DQUxfVUlOVFMKICAgIHR4biBMb2NhbE51bVVpbnQKICAgICEKICAgIGFzc2VydCAvLyBXcm9uZyBMb2NhbCBVSW50cyBhbGxvY2F0aW9uCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kX2FzYS9jb250cmFjdC5weTo4LTE4CiAgICAvLyBjbGFzcyBEQVNBKAogICAgLy8gICAgIFBheW1lbnRBZ2VudCwKICAgIC8vICAgICBUcmFuc2ZlckFnZW50LAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gICAgIGF2bV92ZXJzaW9uPTEyLAogICAgLy8gKToKICAgIHB1c2hieXRlcyAweDkxNGYwNGViIC8vIG1ldGhvZCAiY29udHJhY3RfdXBkYXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9jb250cmFjdF91cGRhdGVfcm91dGVANAoKbWFpbl9zd2l0Y2hfY2FzZV9uZXh0QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6OC0xOAogICAgLy8gY2xhc3MgREFTQSgKICAgIC8vICAgICBQYXltZW50QWdlbnQsCiAgICAvLyAgICAgVHJhbnNmZXJBZ2VudCwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBhdm1fdmVyc2lvbj0xMiwKICAgIC8vICk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBieiBtYWluX2NyZWF0ZV9Ob09wQDMxCiAgICBwdXNoYnl0ZXNzIDB4YjQ0NjE4YzggMHhlNzgzMjUyOSAweDdlYTIwZTBiIDB4NmM4NWUzZWUgMHhiZGQxYTk0NCAweGRjMDYzYjM1IDB4MTRmYzEwZWYgMHg3NGE3Mjk3ZiAweDA5ZDRmZTE0IDB4OWE5YmZhODUgMHg4NWVlZDMzZCAweDkxODUxMDRhIDB4ZDlmMjI1YWMgMHg2ZTBlNWM5NSAweGZmM2ZkNGIzIDB4ODJmNzFiMmQgMHhlZjA0ZjVkMyAweGRmMzQzNTUwIDB4M2RiZTgwYmQgMHhkZjU0ZTgyYyAweDAxMGM4Mjk5IDB4NzQwNmFjZDIgMHgxYTcyYTJlZSAvLyBtZXRob2QgImZ1bmRfZHVlX2Nhc2hmbG93cyh1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJjbGFpbV9kdWVfY2FzaGZsb3dzKGFkZHJlc3MsYnl0ZVtdKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYnl0ZVtdKSIsIG1ldGhvZCAic2V0X3RyYW5zZmVyX3NjaGVkdWxlKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbihhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInRyYW5zZmVyKGFkZHJlc3MsYWRkcmVzcyx1aW50NjQpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X2dvdl9zdXNwZW5zaW9uKGFkZHJlc3MsYm9vbCl1aW50NjQiLCBtZXRob2QgImFjY291bnRfb3BlbihhZGRyZXNzLGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X3VwZGF0ZV9wYXltZW50X2FkZHJlc3MoYWRkcmVzcyxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAiYWNjb3VudF9nZXRfcG9zaXRpb24oYWRkcmVzcykoYWRkcmVzcyx1aW50NjQsdWludDY0LGJvb2wsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImNvbnRyYWN0X2NvbmZpZygodWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYm9vbCxib29sLGJvb2wsdWludDY0KSwodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpLChieXRlWzMyXSxzdHJpbmcpKXVpbnQ2NCIsIG1ldGhvZCAiY29udHJhY3Rfc2NoZWR1bGUodWludDY0LGJvb2wsKHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpW10pdWludDY0IiwgbWV0aG9kICJleGVjdXRlX2llZCgpdWludDY0IiwgbWV0aG9kICJhcHBseV9ub25fY2FzaF9ldmVudCh1aW50NjQsKHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSl1aW50NjQiLCBtZXRob2QgImdldF9jb250cmFjdF9zdGF0ZSgpKHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJnZXRfbmV4dF9kdWVfZXZlbnQoKSh1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAicmJhY19yb3RhdGVfYXJyYW5nZXIoYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgInJiYWNfc2V0X29wX2RhZW1vbihhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19hc3NpZ25fcm9sZSh1aW50OCxhZGRyZXNzLCh1aW50NjQsdWludDY0KSl1aW50NjQiLCBtZXRob2QgInJiYWNfcmV2b2tlX3JvbGUodWludDgsYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgInJiYWNfZ292X2Fzc2V0X3N1c3BlbnNpb24oYm9vbCl1aW50NjQiLCBtZXRob2QgInJiYWNfZ2V0X2FycmFuZ2VyKClhZGRyZXNzIiwgbWV0aG9kICJyYmFjX2dldF9hZGRyZXNzX3JvbGVzKGFkZHJlc3MpKGJvb2wsYm9vbCxib29sLGJvb2wsYm9vbCkiLCBtZXRob2QgInJiYWNfZ2V0X3JvbGVfdmFsaWRpdHkodWludDgsYWRkcmVzcykodWludDY0LHVpbnQ2NCkiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBmdW5kX2R1ZV9jYXNoZmxvd3MgY2xhaW1fZHVlX2Nhc2hmbG93cyBzZXRfdHJhbnNmZXJfc2NoZWR1bGUgcHJpbWFyeV9kaXN0cmlidXRpb24gdHJhbnNmZXIgYWNjb3VudF9nb3Zfc3VzcGVuc2lvbiBhY2NvdW50X29wZW4gYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzIGFjY291bnRfZ2V0X3Bvc2l0aW9uIGNvbnRyYWN0X2NvbmZpZyBjb250cmFjdF9zY2hlZHVsZSBleGVjdXRlX2llZCBhcHBseV9ub25fY2FzaF9ldmVudCBnZXRfY29udHJhY3Rfc3RhdGUgZ2V0X25leHRfZHVlX2V2ZW50IHJiYWNfcm90YXRlX2FycmFuZ2VyIHJiYWNfc2V0X29wX2RhZW1vbiByYmFjX2Fzc2lnbl9yb2xlIHJiYWNfcmV2b2tlX3JvbGUgcmJhY19nb3ZfYXNzZXRfc3VzcGVuc2lvbiByYmFjX2dldF9hcnJhbmdlciByYmFjX2dldF9hZGRyZXNzX3JvbGVzIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHkKICAgIGVycgoKbWFpbl9jcmVhdGVfTm9PcEAzMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kX2FzYS9jb250cmFjdC5weTo4LTE4CiAgICAvLyBjbGFzcyBEQVNBKAogICAgLy8gICAgIFBheW1lbnRBZ2VudCwKICAgIC8vICAgICBUcmFuc2ZlckFnZW50LAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gICAgIGF2bV92ZXJzaW9uPTEyLAogICAgLy8gKToKICAgIHB1c2hieXRlcyAweDk1NmQ3MTU2IC8vIG1ldGhvZCAiY29udHJhY3RfY3JlYXRlKGFkZHJlc3MpdWludDY0IgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggY29udHJhY3RfY3JlYXRlCiAgICBlcnIKCm1haW5fY29udHJhY3RfdXBkYXRlX3JvdXRlQDQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBwdXNoaW50IDQgLy8gVXBkYXRlQXBwbGljYXRpb24KICAgID09CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydAogICAgYiBjb250cmFjdF91cGRhdGUKCgovLyBtb2R1bGVzLnBheW1lbnRfYWdlbnQuUGF5bWVudEFnZW50LmZ1bmRfZHVlX2Nhc2hmbG93c1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmZ1bmRfZHVlX2Nhc2hmbG93czoKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gMTAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjUwCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo1MQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo1MgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDcKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NTUKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NTYtNTcKICAgIC8vIGZ1bmRlZF9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgLy8gZnVuZGVkX3ByaW5jaXBhbCA9IFVJbnQ2NCgwKQogICAgZHVwbiAyCgpmdW5kX2R1ZV9jYXNoZmxvd3Nfd2hpbGVfdG9wQDI6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjAKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgPCBtYXhfZXZlbnRfY291bnQKICAgIGRpZyAyCiAgICBkaWcgNAogICAgPAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjYwLTYxCiAgICAvLyBwcm9jZXNzZWRfZXZlbnRzIDwgbWF4X2V2ZW50X2NvdW50CiAgICAvLyBhbmQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAOQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjYxCiAgICAvLyBhbmQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIDwKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2MC02MQogICAgLy8gcHJvY2Vzc2VkX2V2ZW50cyA8IG1heF9ldmVudF9jb3VudAogICAgLy8gYW5kIHNlbGYuZXZlbnRfY3Vyc29yIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudAogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDkKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2MwogICAgLy8gZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoc2VsZi5ldmVudF9jdXJzb3IpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgZHVwCiAgICBidXJ5IDE3CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjQKICAgIC8vIGlmIGVudHJ5LnNjaGVkdWxlZF90aW1lID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXA6CiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgNgogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPgogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl93aGlsZUA5CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjYKICAgIC8vIGlmIG5vdCBzZWxmLl9ldmVudF9pc19jYXNoKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkpOgogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBidXJ5IDE2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNTEKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgaW50Y18yIC8vIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM1MC0zNTQKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX01EKSwKICAgIC8vICkKICAgID09CiAgICBkdXAKICAgIGJ1cnkgNwogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX3RydWVANTAKICAgIGRpZyAxNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzUyCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzUwLTM1NAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfTUQpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDUwCiAgICBkaWcgMTQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM1MwogICAgLy8gVUludDY0KGVudW1zLkVWVF9NRCksCiAgICBwdXNoaW50IDE5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNTAtMzU0CiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9NRCksCiAgICAvLyApCiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VANTEKCmZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX3RydWVANTA6CiAgICBpbnRjXzEgLy8gMQoKZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfbWVyZ2VANTI6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjYKICAgIC8vIGlmIG5vdCBzZWxmLl9ldmVudF9pc19jYXNoKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkpOgogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU0OAogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X2lkID09IHNlbGYuZXZlbnRfY3Vyc29yLCBlcnIuSU5WQUxJRF9FVkVOVF9DVVJTT1IKICAgIGRpZyAxNQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBjdXJzb3IKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU0OQogICAgLy8gYXNzZXJ0IGVudHJ5LnNjaGVkdWxlZF90aW1lIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLCBlcnIuTk9fRFVFX0NBU0hGTE9XCiAgICBkaWcgNAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPD0KICAgIGFzc2VydCAvLyBObyBkdWUgY2FzaGZsb3cgdG8gcGF5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MTMKICAgIC8vIGlmIGV2ZW50X3R5cGUgbm90IGluIChVSW50NjQoZW51bXMuRVZUX0lQKSwgVUludDY0KGVudW1zLkVWVF9NRCkpOgogICAgZGlnIDUKICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxMwogICAgZGlnIDE0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDEzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MTQKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDEzCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfaW50ZXJlc3RfYW1vdW50QDE0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDI2CiAgICAvLyBldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBidXJ5IDE2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MjcKICAgIC8vIGlmIGV2ZW50X3R5cGUgbm90IGluIChVSW50NjQoZW51bXMuRVZUX1BSKSwgVUludDY0KGVudW1zLkVWVF9NRCkpOgogICAgcHVzaGludCAzCiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE3CiAgICBkaWcgMTQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQyOAogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnRAMjY6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTMKICAgIC8vIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGRpZyAxNQogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgMTAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1NgogICAgLy8gaWYgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCk6CiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUAyNwogICAgZGlnIDkKICAgIGJ1cnkgMTEKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTcyLTU3NAogICAgLy8gIyBGdW5kaW5nIHVzZXMgcGVyLXVuaXQgY3VtdWxhdGl2ZSBpbmRpY2VzIHNvIGVhY2ggaG9sZGVyIGNhbiBzZXR0bGUKICAgIC8vICMgaW5kZXBlbmRlbnRseSBmcm9tIGl0cyBjdXJyZW50IHVuaXQgYmFsYW5jZS4KICAgIC8vIGludGVyZXN0X2luZGV4X2RlbHRhID0gc2VsZi5fYW1vdW50X3RvX2luZGV4X2RlbHRhKGludGVyZXN0X2Ftb3VudF9kdWUpCiAgICBkaWcgMTIKICAgIGNhbGxzdWIgX2Ftb3VudF90b19pbmRleF9kZWx0YQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTc1CiAgICAvLyBwcmluY2lwYWxfaW5kZXhfZGVsdGEgPSBzZWxmLl9hbW91bnRfdG9faW5kZXhfZGVsdGEocHJpbmNpcGFsX2Ftb3VudF9kdWUpCiAgICBkaWcgOAogICAgY2FsbHN1YiBfYW1vdW50X3RvX2luZGV4X2RlbHRhCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzYKICAgIC8vIGludGVyZXN0X2Ftb3VudCA9IHNlbGYuX2luZGV4X2RlbHRhX3RvX2Ftb3VudChpbnRlcmVzdF9pbmRleF9kZWx0YSkKICAgIGRpZyAxCiAgICBjYWxsc3ViIF9pbmRleF9kZWx0YV90b19hbW91bnQKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSAxNwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTc3CiAgICAvLyBwcmluY2lwYWxfYW1vdW50ID0gc2VsZi5faW5kZXhfZGVsdGFfdG9fYW1vdW50KHByaW5jaXBhbF9pbmRleF9kZWx0YSkKICAgIGR1cAogICAgY2FsbHN1YiBfaW5kZXhfZGVsdGFfdG9fYW1vdW50CiAgICBkdXAKICAgIGJ1cnkgMTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU3OAogICAgLy8gcmVxdWlyZWRfYW1vdW50ID0gaW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudAogICAgZGlnIDIKICAgIGRpZyAxCiAgICArCiAgICBkdXAKICAgIGJ1cnkgMTIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcyNwogICAgLy8gYmFsYW5jZSA9IHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ1NgogICAgLy8gcmV0dXJuIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgKyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIGRpZyAxCiAgICArCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MjkKICAgIC8vIGFzc2VydCBiYWxhbmNlID49IHJlc2VydmVkX3RvdGFsLCBlcnIuTk9UX0VOT1VHSF9GVU5EUwogICAgZGlnIDIKICAgIGRpZyAxCiAgICA+PQogICAgYXNzZXJ0IC8vIE5vdCBlbm91Z2ggZnVuZHMgZm9yIHRoZSBwYXltZW50CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MzAKICAgIC8vIHJldHVybiBiYWxhbmNlIC0gcmVzZXJ2ZWRfdG90YWwKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTgwCiAgICAvLyBzZWxmLl9hdmFpbGFibGVfc2V0dGxlbWVudF9mdW5kcygpID49IHJlcXVpcmVkX2Ftb3VudAogICAgdW5jb3ZlciAyCiAgICA+PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTc5LTU4MQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLl9hdmFpbGFibGVfc2V0dGxlbWVudF9mdW5kcygpID49IHJlcXVpcmVkX2Ftb3VudAogICAgLy8gKSwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTgzCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0ICs9IGludGVyZXN0X2Ftb3VudAogICAgdW5jb3ZlciAzCiAgICArCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTg0CiAgICAvLyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCArPSBwcmluY2lwYWxfYW1vdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICArCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4NQogICAgLy8gc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4ICs9IGludGVyZXN0X2luZGV4X2RlbHRhCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCBleGlzdHMKICAgIHVuY292ZXIgMgogICAgKwogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTg2CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4ICs9IHByaW5jaXBhbF9pbmRleF9kZWx0YQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCBleGlzdHMKICAgICsKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1ODcKICAgIC8vIGlmIGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkgPT0gVUludDY0KGVudW1zLkVWVF9QUik6CiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBwdXNoaW50IDMKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDM4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1ODgtNTg5CiAgICAvLyAjIEZvciBQUiwgdGhlIHBlcmlvZCBpbnRlcmVzdCBzdGF5cyBhY2NydWVkIHVudGlsIGEgbGF0ZXIgSVAgb3IgTUQuCiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgKz0gc2VsZi5fZW50cnlfaW50ZXJlc3Rfc2VnbWVudChlbnRyeSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBkaWcgMTYKICAgIGNhbGxzdWIgX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQKICAgIGJ1cnkgMTgKICAgICsKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTIKICAgIC8vIGlmIG5vdCBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKSBvciBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NCgKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlANDEKICAgIGRpZyAxNQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5Mi01OTQKICAgIC8vIGlmIG5vdCBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKSBvciBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NCgKICAgIC8vICAgICBlbnVtcy5FVlRfTUQKICAgIC8vICk6CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDIKCmZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDQxOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTk1CiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBkaWcgMTUKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0MjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5NgogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgZGlnIDEwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTk3CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBuZXh0X2ludGVyZXN0X2Jhc2UKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBkaWcgMTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTgKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwMAogICAgLy8gaWYgZW50cnkuZXZlbnRfdHlwZSA9PSBhcmM0LlVJbnQ4KAogICAgZGlnIDE1CiAgICBleHRyYWN0IDggMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAwLTYwMgogICAgLy8gaWYgZW50cnkuZXZlbnRfdHlwZSA9PSBhcmM0LlVJbnQ4KAogICAgLy8gICAgIGVudW1zLkVWVF9NRAogICAgLy8gKSBhbmQgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPT0gVUludDY0KDApOgogICAgcHVzaGJ5dGVzIDB4MTMKICAgIGI9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwMgogICAgLy8gKSBhbmQgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPT0gVUludDY0KDApOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MDAtNjAyCiAgICAvLyBpZiBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoCiAgICAvLyAgICAgZW51bXMuRVZUX01ECiAgICAvLyApIGFuZCBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9PSBVSW50NjQoMCk6CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwMwogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX0VOREVEKQogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgcHVzaGludCAyMDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MDQKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MDYtNjEwCiAgICAvLyBzZWxmLl9lbWl0X2V4ZWN1dGlvbl9ldmVudCgKICAgIC8vICAgICBlbnRyeT1lbnRyeSwKICAgIC8vICAgICBwYXlvZmY9aW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudCwKICAgIC8vICAgICBzZXR0bGVkX2Ftb3VudD1pbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50LAogICAgLy8gKQogICAgZGlnIDE1CiAgICBkaWcgNwogICAgZHVwCiAgICBjYWxsc3ViIF9lbWl0X2V4ZWN1dGlvbl9ldmVudAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzAKICAgIC8vIGZ1bmRlZF9pbnRlcmVzdCArPSBpbnRlcmVzdF9hbW91bnQKICAgIGRpZyAxCiAgICBkaWcgMTQKICAgICsKICAgIGJ1cnkgMgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjcxCiAgICAvLyBmdW5kZWRfcHJpbmNpcGFsICs9IHByaW5jaXBhbF9hbW91bnQKICAgIGR1cAogICAgZGlnIDkKICAgICsKICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjcyCiAgICAvLyBwcm9jZXNzZWRfZXZlbnRzICs9IFVJbnQ2NCgxKQogICAgZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDMKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX3doaWxlX3RvcEAyCgpmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDM4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTkxCiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzkKCmZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDI3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTU3CiAgICAvLyBldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBidXJ5IDE2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTgtNTYwCiAgICAvLyAjIER5bmFtaWMgYW5udWl0aWVzIGRlcml2ZSBuZXh0IHN0YXRlIGZyb20gdGhlIHBheW1lbnQgZGVjb21wb3NpdGlvbiwKICAgIC8vICMgbm90IG9ubHkgZnJvbSB0aGUgcHJlY29tcHV0ZWQgYG5leHRfKmAgZmllbGRzLgogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1BSKToKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19lbHNlX2JvZHlAMjkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU2MgogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgLSBwcmluY2lwYWxfYW1vdW50X2R1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBkaWcgOAogICAgLQogICAgZHVwCiAgICBidXJ5IDExCiAgICBidXJ5IDExCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDI5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY1CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9JUCk6CiAgICBkaWcgMTQKICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUAzMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY2CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGJ1cnkgMTEKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU2NwogICAgLy8gbmV4dF9pbnRlcmVzdF9iYXNlID0gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBidXJ5IDEyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIGV4aXN0cwogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzNgoKZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUAzMToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU2OAogICAgLy8gZWxpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfTUQpOgogICAgZGlnIDE0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDMyCiAgICBkaWcgOQogICAgYnVyeSAxMQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzNgoKZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlAMzI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjkKICAgIC8vIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAxMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTcwCiAgICAvLyBuZXh0X2ludGVyZXN0X2Jhc2UgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDExCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQyOQogICAgLy8gaWYgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCk6CiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDI1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzAKICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCk6CiAgICBkaWcgMTQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDMxCiAgICAvLyByZXR1cm4gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTIKICAgIC8vIHByaW5jaXBhbF9hbW91bnRfZHVlID0gc2VsZi5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudChlbnRyeSkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnRAMjYKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDIwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDMyCiAgICAvLyBpbnRlcmVzdF9kdWUgPSBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgKyBzZWxmLl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KGVudHJ5KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgIGRpZyAxNgogICAgY2FsbHN1YiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudAogICAgYnVyeSAxOAogICAgKwogICAgZHVwCiAgICBidXJ5IDEzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzMKICAgIC8vIGlmIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA8PSBpbnRlcmVzdF9kdWU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiBleGlzdHMKICAgID49CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDM0CiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTIKICAgIC8vIHByaW5jaXBhbF9hbW91bnRfZHVlID0gc2VsZi5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudChlbnRyeSkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnRAMjYKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDIyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDM1CiAgICAvLyBwcmluY2lwYWxfYW1vdW50ID0gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIC0gaW50ZXJlc3RfZHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiBleGlzdHMKICAgIGRpZyAxMgogICAgLQogICAgZHVwCiAgICBidXJ5IDEwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzYKICAgIC8vIGlmIHByaW5jaXBhbF9hbW91bnQgPiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgPgogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzNwogICAgLy8gcmV0dXJuIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTUyCiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyNDoKICAgIGRpZyA4CiAgICBidXJ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyNgoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NDAKICAgIC8vIGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsIDw9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBkaWcgMTUKICAgIHB1c2hpbnQgNDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGR1cDIKICAgIDw9CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzktNDQxCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsIDw9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ0MgogICAgLy8gcmV0dXJuIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIC0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIHN3YXAKICAgIC0KICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTUyCiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQxNQogICAgLy8gcmV0dXJuIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCArIHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZGlnIDE2CiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBidXJ5IDE4CiAgICArCiAgICBidXJ5IDEzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTEKICAgIC8vIGludGVyZXN0X2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9pbnRlcmVzdF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9pbnRlcmVzdF9hbW91bnRAMTQKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl93aGlsZUA5OgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojc0CiAgICAvLyBhc3NlcnQgcHJvY2Vzc2VkX2V2ZW50cyA+IFVJbnQ2NCgwKSwgZXJyLk5PX0RVRV9DQVNIRkxPVwogICAgZGlnIDIKICAgIGR1cAogICAgYXNzZXJ0IC8vIE5vIGR1ZSBjYXNoZmxvdyB0byBwYXkKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3OAogICAgLy8gdG90YWxfZnVuZGVkPWZ1bmRlZF9pbnRlcmVzdCArIGZ1bmRlZF9wcmluY2lwYWwsCiAgICBkaWcgMgogICAgZHVwCiAgICBkaWcgMwogICAgZHVwCiAgICBjb3ZlciAzCiAgICArCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODAKICAgIC8vIHRpbWVzdGFtcD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3NS04MQogICAgLy8gcmV0dXJuIHR5cC5DYXNoRnVuZGluZ1Jlc3VsdCgKICAgIC8vICAgICBmdW5kZWRfaW50ZXJlc3Q9ZnVuZGVkX2ludGVyZXN0LAogICAgLy8gICAgIGZ1bmRlZF9wcmluY2lwYWw9ZnVuZGVkX3ByaW5jaXBhbCwKICAgIC8vICAgICB0b3RhbF9mdW5kZWQ9ZnVuZGVkX2ludGVyZXN0ICsgZnVuZGVkX3ByaW5jaXBhbCwKICAgIC8vICAgICBwcm9jZXNzZWRfZXZlbnRzPXByb2Nlc3NlZF9ldmVudHMsCiAgICAvLyAgICAgdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUA1MToKICAgIGludGNfMCAvLyAwCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDUyCgoKLy8gbW9kdWxlcy5wYXltZW50X2FnZW50LlBheW1lbnRBZ2VudC5jbGFpbV9kdWVfY2FzaGZsb3dzW3JvdXRpbmddKCkgLT4gdm9pZDoKY2xhaW1fZHVlX2Nhc2hmbG93czoKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNAogICAgLy8gaWYgc2VsZi5vcF9kYWVtb24udmFsdWUgIT0gR2xvYmFsLnplcm9fYWRkcmVzczoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNSAvLyAweDUyMjM0ZjcwNDQ2MTY1NmQ2ZjZlMjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcF9kYWVtb24gZXhpc3RzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBieiBjbGFpbV9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTcKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNgogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI1IC8vIDB4NTIyMzRmNzA0NDYxNjU2ZDZmNmUyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wX2RhZW1vbiBleGlzdHMKICAgID09CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTYtMTgKICAgIC8vIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICAvLyBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgYm56IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDE0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTcKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNi0xOAogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICBibnogY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX3RydWVAMTQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxOAogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIHR4biBTZW5kZXIKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDMyCiAgICA9PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE2LTE4CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAxNQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX3RydWVAMTQ6CiAgICBpbnRjXzEgLy8gMQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDE2OgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE1LTE5CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vICAgICBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gICAgIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICAvLyApLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNzoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5NAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5NQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDcKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6OTgKICAgIC8vIHNlbGYuX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQoaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDIKICAgIGR1cAogICAgY2FsbHN1YiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojk5CiAgICAvLyBzZWxmLl9zZXR0bGVfcG9zaXRpb24oaG9sZGluZ19hZGRyZXNzKQogICAgY2FsbHN1YiBfc2V0dGxlX3Bvc2l0aW9uCiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTcKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNsYWltYWJsZV9pbnRlcmVzdAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZHVwCiAgICBwdXNoaW50IDczCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBidXJ5IDgKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTgKICAgIC8vICsgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgZHVwCiAgICBwdXNoaW50IDgxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDgKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTctMTE4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jbGFpbWFibGVfaW50ZXJlc3QKICAgIC8vICsgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgdW5jb3ZlciAyCiAgICArCiAgICBkdXAKICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjEwMQogICAgLy8gYXNzZXJ0IHRvdGFsX2Ftb3VudCA+IFVJbnQ2NCgwKSwgZXJyLk5PX0RVRV9DQVNIRkxPVwogICAgYXNzZXJ0IC8vIE5vIGR1ZSBjYXNoZmxvdyB0byBwYXkKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLmlzX29wdGVkX2luKAogICAgZXh0cmFjdCAwIDMyCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MjUKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MjQtMjYKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5pc19vcHRlZF9pbigKICAgIC8vICAgICBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQKICAgIC8vICkKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MjQtMjcKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5pc19vcHRlZF9pbigKICAgIC8vICAgICBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQKICAgIC8vICkKICAgIC8vIGFuZCBub3Qgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkCiAgICBieiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VAMjQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNwogICAgLy8gYW5kIG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHB1c2hpbnQgMzg0CiAgICBnZXRiaXQKICAgIGJueiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VAMjQKICAgIGludGNfMSAvLyAxCgpjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfbWVyZ2VAMjU6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA2CiAgICAvLyBpZiBzZWxmLl9pc19wYXltZW50X2V4ZWN1dGFibGUoaG9sZGluZ19hZGRyZXNzKToKICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MzMKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICBzd2FwCiAgICBkaWcgMQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBvcHRlZCBpbnRvIGFzc2V0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MzMtMzQKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICAvLyA+PSBwYXltZW50X2Ftb3VudAogICAgZGlnIDUKICAgIGR1cAogICAgY292ZXIgMgogICAgPj0KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozMi0zNQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgLy8gICAgID49IHBheW1lbnRfYW1vdW50CiAgICAvLyApLCBlcnIuTk9UX0VOT1VHSF9GVU5EUwogICAgYXNzZXJ0IC8vIE5vdCBlbm91Z2ggZnVuZHMgZm9yIHRoZSBwYXltZW50CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA4CiAgICAvLyBzZWxmLl9wYXkoc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLCB0b3RhbF9hbW91bnQpCiAgICBkaWcgMgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZHVwCiAgICBleHRyYWN0IDAgMzIKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozOS00NAogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXJlY2VpdmVyLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1hbW91bnQsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0MwogICAgLy8gZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIGdsb2JhbCBNaW5UeG5GZWUKICAgIHVuY292ZXIgMwogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgc3dhcAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MzkKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozOS00NAogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXJlY2VpdmVyLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1hbW91bnQsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTI1LTEyNgogICAgLy8gIyBHZXQgdGhlIGNsYWltYWJsZSBhbW91bnRzIGJlZm9yZSByZXNldAogICAgLy8gaW50ZXJlc3RfYW1vdW50ID0gcG9zaXRpb24uY2xhaW1hYmxlX2ludGVyZXN0CiAgICBkdXAKICAgIHB1c2hpbnQgNzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgOQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEyNwogICAgLy8gcHJpbmNpcGFsX2Ftb3VudCA9IHBvc2l0aW9uLmNsYWltYWJsZV9wcmluY2lwYWwKICAgIGR1cAogICAgcHVzaGludCA4MQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMwogICAgYnVyeSA5CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTI5LTEzMAogICAgLy8gIyBSZXNldCB0aGUgcG9zaXRpb24ncyBjbGFpbWFibGUgYW1vdW50cwogICAgLy8gcG9zaXRpb24uY2xhaW1hYmxlX2ludGVyZXN0ID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgaXRvYgogICAgc3dhcAogICAgZGlnIDEKICAgIHJlcGxhY2UyIDczCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTMxCiAgICAvLyBwb3NpdGlvbi5jbGFpbWFibGVfcHJpbmNpcGFsID0gVUludDY0KDApCiAgICBzd2FwCiAgICByZXBsYWNlMiA4MQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzMgogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSBwb3NpdGlvbi5jb3B5KCkKICAgIHVuY292ZXIgMwogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzNAogICAgLy8gYXNzZXJ0IHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgPj0gaW50ZXJlc3RfYW1vdW50LCBlcnIuTk9UX0VOT1VHSF9GVU5EUwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCBleGlzdHMKICAgIGR1cAogICAgZGlnIDIKICAgID49CiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcyBmb3IgdGhlIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzUKICAgIC8vIGFzc2VydCBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCA+PSBwcmluY2lwYWxfYW1vdW50LCBlcnIuTk9UX0VOT1VHSF9GVU5EUwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIGV4aXN0cwogICAgZGlnIDMKICAgID49CiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcyBmb3IgdGhlIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzctMTM4CiAgICAvLyAjIFVwZGF0ZSB0aGUgZ2xvYmFsIHJlc2VydmVkIGludGVyZXN0IGFuZCBwcmluY2lwYWwgYW1vdW50cwogICAgLy8gc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCAtPSBpbnRlcmVzdF9hbW91bnQKICAgIHN3YXAKICAgIC0KICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTM5CiAgICAvLyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCAtPSBwcmluY2lwYWxfYW1vdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICBzd2FwCiAgICAtCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjExNAogICAgLy8gdG90YWxfYW1vdW50PWludGVyZXN0X2Ftb3VudCArIHByaW5jaXBhbF9hbW91bnQsCiAgICBkaWcgNQogICAgZHVwCiAgICBkaWcgNgogICAgZHVwCiAgICBjb3ZlciAzCiAgICArCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTE1CiAgICAvLyB0aW1lc3RhbXA9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTExLTExNwogICAgLy8gcmV0dXJuIHR5cC5DYXNoQ2xhaW1SZXN1bHQoCiAgICAvLyAgICAgaW50ZXJlc3RfYW1vdW50PWludGVyZXN0X2Ftb3VudCwKICAgIC8vICAgICBwcmluY2lwYWxfYW1vdW50PXByaW5jaXBhbF9hbW91bnQsCiAgICAvLyAgICAgdG90YWxfYW1vdW50PWludGVyZXN0X2Ftb3VudCArIHByaW5jaXBhbF9hbW91bnQsCiAgICAvLyAgICAgdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gICAgIGNvbnRleHQ9cGF5bWVudF9pbmZvLAogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZGlnIDIKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBwdXNoYnl0ZXMgMHgwMDIyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAyNDoKICAgIGludGNfMCAvLyAwCiAgICBiIGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUAyNQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX2ZhbHNlQDE1OgogICAgaW50Y18wIC8vIDAKICAgIGIgY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDE2CgoKLy8gbW9kdWxlcy50cmFuc2Zlcl9hZ2VudC5UcmFuc2ZlckFnZW50LnNldF90cmFuc2Zlcl9zY2hlZHVsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF90cmFuc2Zlcl9zY2hlZHVsZToKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToyNgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjI3CiAgICAvLyBhc3NlcnQgb3Blbl9kYXRlIDwgY2xvc3VyZV9kYXRlLCBlcnIuSU5WQUxJRF9TT1JUSU5HCiAgICBkdXAyCiAgICA8CiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbXVzdCBiZSBzb3J0ZWQgaW4gc3RyaWN0bHkgYXNjZW5kaW5nIG9yZGVyCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjI5CiAgICAvLyBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA9IG9wZW5fZGF0ZQogICAgYnl0ZWMgMjcgLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIHVuY292ZXIgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MzAKICAgIC8vIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlID0gY2xvc3VyZV9kYXRlCiAgICBieXRlYyAyOCAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MzEKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy50cmFuc2Zlcl9hZ2VudC5UcmFuc2ZlckFnZW50LnByaW1hcnlfZGlzdHJpYnV0aW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcHJpbWFyeV9kaXN0cmlidXRpb246CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjcxCiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5wcmltYXJ5X2RlYWxlciwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDIyIC8vIDB4NTIyMzUwNzI2OTZkNjE3Mjc5NDQ2NTYxNmM2NTcyMjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDMKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQ0CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDUKICAgIC8vIGFzc2VydCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBSSU1BUllfRElTVFJJQlVUSU9OX0NMT1NFRAogICAgYXNzZXJ0IC8vIFByaW1hcnkgZGlzdHJpYnV0aW9uIGlzIGNsb3NlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgY292ZXIgMwogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo0NwogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChob2xkaW5nX2FkZHJlc3MpCiAgICBzd2FwCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQ4CiAgICAvLyBhc3NlcnQgdW5pdHMgPiBVSW50NjQoMCksIGVyci5aRVJPX1VOSVRTCiAgICBkdXAKICAgIGFzc2VydCAvLyBDYW4gbm90IGRpc3RyaWJ1dGUgemVybyB1bml0cwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo1MAogICAgLy8gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCArIHVuaXRzIDw9IHNlbGYudG90YWxfdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICArCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgPD0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDktNTEKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCArIHVuaXRzIDw9IHNlbGYudG90YWxfdW5pdHMKICAgIC8vICksIGVyci5PVkVSX0RJU1RSSUJVVElPTgogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCByZW1haW5pbmcgRC1BU0EgdW5pdHMKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NTIKICAgIC8vIGlmIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI2IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlIGV4aXN0cwogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjU0CiAgICAvLyBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8PSBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI2IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlIGV4aXN0cwogICAgPD0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NTMtNTUKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPD0gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGUKICAgIC8vICksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TRUQKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBjbG9zZWQKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNDgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnJlc2VydmVkX3VuaXRzICs9IHVuaXRzCiAgICBkdXBuIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDMKICAgIGR1cAogICAgY292ZXIgMwogICAgKwogICAgaXRvYgogICAgcHVzaGludCA0MAogICAgc3dhcAogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NTgKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgKz0gdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICArCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NTkKICAgIC8vIHJldHVybiBzZWxmLnRvdGFsX3VuaXRzIC0gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIHN3YXAKICAgIC0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMudHJhbnNmZXJfYWdlbnQuVHJhbnNmZXJBZ2VudC50cmFuc2Zlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnRyYW5zZmVyOgogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo2MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NzUKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojc2CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTMKICAgIC8vIGlmIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI3IC8vICJ0cmFuc2Zlcl9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlIGV4aXN0cwogICAgYnogdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE1CiAgICAvLyBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI3IC8vICJ0cmFuc2Zlcl9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlIGV4aXN0cwogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPD0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTQtMTYKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICksIGVyci5DTE9TRURfVFJBTlNGRVIKICAgIGFzc2VydCAvLyBUcmFuc2ZlciBpcyBjbG9zZWQKCnRyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTcKICAgIC8vIGlmIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI4IC8vICJ0cmFuc2Zlcl9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgYnogdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE5CiAgICAvLyBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8IHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjggLy8gInRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICA8CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE4LTIwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDwgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGUKICAgIC8vICksIGVyci5DTE9TRURfVFJBTlNGRVIKICAgIGFzc2VydCAvLyBUcmFuc2ZlciBpcyBjbG9zZWQKCnRyYW5zZmVyX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODAKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIGRpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgOAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIGRpZyA1CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDkKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODMKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQoc2VuZGVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojg0CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGR1cAogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4NQogICAgLy8gYXNzZXJ0IHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MgIT0gcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzLCBlcnIuU0VMRl9UUkFOU0ZFUgogICAgdW5jb3ZlciAyCiAgICAhPQogICAgYXNzZXJ0IC8vIFNlbmRlciBhbmQgcmVjZWl2ZXIgbXVzdCBiZSBkaWZmZXJlbnQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODYKICAgIC8vIGFzc2VydCB1bml0cyA+IFVJbnQ2NCgwKSwgZXJyLk5VTExfVFJBTlNGRVIKICAgIGRpZyAxCiAgICBkdXAKICAgIGFzc2VydCAvLyBUcmFuc2ZlciB1bml0cyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojg3CiAgICAvLyBhc3NlcnQgdW5pdHMgPD0gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLCBlcnIuT1ZFUl9UUkFOU0ZFUgogICAgc3dhcAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIDw9CiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IHNlbmRlciB1bml0cyB0byB0cmFuc2ZlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzU2CiAgICAvLyBpZiBzZWxmLmV2ZW50X2N1cnNvciA+PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICA+PQogICAgYm56IHRyYW5zZmVyX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Fzc2VydF9ub19kdWVfZXZlbnRfcGVuZGluZ0AxMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzU4CiAgICAvLyBuZXh0X2VudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KHNlbGYuZXZlbnRfY3Vyc29yKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc2MAogICAgLy8gbmV4dF9lbnRyeS5zY2hlZHVsZWRfdGltZSA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NTktNzYxCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIG5leHRfZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gKSwgZXJyLlBFTkRJTkdfQUNUVVNfRVZFTlQKICAgIGFzc2VydCAvLyBBQ1RVUyBldmVudCBub3QgeWV0IGV4ZWN1dGVkCgp0cmFuc2Zlcl9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9hc3NlcnRfbm9fZHVlX2V2ZW50X3BlbmRpbmdAMTA6CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjkwCiAgICAvLyBzZWxmLl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBkaWcgMwogICAgZHVwCiAgICBjYWxsc3ViIF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjkxCiAgICAvLyBzZWxmLl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGRpZyAzCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGNhbGxzdWIgX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6OTIKICAgIC8vIHNlbGYuX3NldHRsZV9wb3NpdGlvbihzZW5kZXJfaG9sZGluZ19hZGRyZXNzKQogICAgY2FsbHN1YiBfc2V0dGxlX3Bvc2l0aW9uCiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6OTMKICAgIC8vIHNlbGYuX3NldHRsZV9wb3NpdGlvbihyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBjYWxsc3ViIF9zZXR0bGVfcG9zaXRpb24KICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE1MgogICAgLy8gYXNzZXJ0IHVuaXRzIDw9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLCBlcnIuT1ZFUl9UUkFOU0ZFUgogICAgZGlnIDUKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGRpZyAxCiAgICA8PQogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCBzZW5kZXIgdW5pdHMgdG8gdHJhbnNmZXIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNTMKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzIC09IHVuaXRzCiAgICBkaWcgMQogICAgLQogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBpbnRjXzMgLy8gMzIKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNDQKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzICs9IHVuaXRzCiAgICBkaWcgNQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgdW5jb3ZlciAyCiAgICArCiAgICBpdG9iCiAgICBpbnRjXzMgLy8gMzIKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgZGlnIDIKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF9nb3Zfc3VzcGVuc2lvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfZ292X3N1c3BlbnNpb246CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTY1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo3NwogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYXV0aG9yaXR5LCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjEgLy8gMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTg1CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGR1cAogICAgcHVzaGludCA0OAogICAgaW50Y18xIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIHB1c2hpbnQgNDgKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTg2CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfb3Blbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfb3BlbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2OAogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjMgLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQ0ZDYxNmU2MTY3NjU3MjIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzkKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0VOREVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDIwMAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTAKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX2VuZGVkKCksIGVyci5VTkFVVEhPUklaRUQKICAgICEKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxMQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTIKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjEzCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzQKICAgIC8vIHVuaXRzPVVJbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzItNDIKICAgIC8vIHJldHVybiB0eXAuQWNjb3VudFBvc2l0aW9uKAogICAgLy8gICAgIHBheW1lbnRfYWRkcmVzcz1wYXltZW50X2FkZHJlc3MsCiAgICAvLyAgICAgdW5pdHM9VUludDY0KDApLAogICAgLy8gICAgIHJlc2VydmVkX3VuaXRzPVVJbnQ2NCgwKSwKICAgIC8vICAgICBzdXNwZW5kZWQ9RmFsc2UsCiAgICAvLyAgICAgc2V0dGxlZF9jdXJzb3I9VUludDY0KDApLAogICAgLy8gICAgIGludGVyZXN0X2NoZWNrcG9pbnQ9VUludDY0KDApLAogICAgLy8gICAgIHByaW5jaXBhbF9jaGVja3BvaW50PVVJbnQ2NCgwKSwKICAgIC8vICAgICBjbGFpbWFibGVfaW50ZXJlc3Q9VUludDY0KDApLAogICAgLy8gICAgIGNsYWltYWJsZV9wcmluY2lwYWw9VUludDY0KDApLAogICAgLy8gKQogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBieXRlYyA0MCAvLyAweDAwCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxNAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSBzZWxmLl9uZXdfYWNjb3VudF9wb3NpdGlvbihwYXltZW50X2FkZHJlc3MpCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjE1CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzczoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMzgKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcywgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgdW5jb3ZlciAzCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjM5CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0MAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDEKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcyA9IHBheW1lbnRfYWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDIKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF9nZXRfcG9zaXRpb25bcm91dGluZ10oKSAtPiB2b2lkOgphY2NvdW50X2dldF9wb3NpdGlvbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNTkKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9jcmVhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9jcmVhdGU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5ODAKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSBhcnJhbmdlcgogICAgYnl0ZWMgMTggLy8gMHg1MjIzNDE3MjcyNjE2ZTY3NjU3MjIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTgxCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfY29uZmlnW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfY29uZmlnOgogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGxlbgogICAgcHVzaGludCAxMDcKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuTm9ybWFsaXplZEFjdHVzVGVybXMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDcyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLkluaXRpYWxLZXJuZWxTdGF0ZQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIGxlbgogICAgZGlnIDEKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgdHVwbGUgZW5jb2RpbmcKICAgIGR1cAogICAgcHVzaGludCAzNAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHRhaWwgcG9pbnRlciBhdCBpbmRleCAxIG9mICh1aW50OFszMl0sKGxlbit1dGY4W10pKQogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBjb3ZlciAzCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAzNgogICAgKwogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5Qcm9zcGVjdHVzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDEyCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMTQtMTAxNQogICAgLy8gIyBDb25maWd1cmUgQ29udHJhY3QKICAgIC8vIHNlbGYuY29udHJhY3RfdHlwZSA9IHRlcm1zLmNvbnRyYWN0X3R5cGUuYXNfdWludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ5dGVjIDEyIC8vICJjb250cmFjdF90eXBlIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICBieiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIwCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfQU5OKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjEKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgcHVzaGludCAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjIKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjMKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgcHVzaGludCA0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjQKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYnogY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAOAoKY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUA3OgogICAgaW50Y18xIC8vIDEKCmNvbnRyYWN0X2NvbmZpZ19ib29sX21lcmdlQDk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjkKICAgIC8vIGFzc2VydCBzZWxmLl9pc19zdXBwb3J0ZWRfY29udHJhY3RfdHlwZShjb250cmFjdF90eXBlKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDE3CiAgICAvLyBzZWxmLl9zdG9yZV9jb250cmFjdF9jb25maWcoc2VsZi5jb250cmFjdF90eXBlLCB0ZXJtcywgaW5pdGlhbF9zdGF0ZSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBidXJ5IDIKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMjUKICAgIC8vIGFzc2VydCB0ZXJtcy5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBkaWcgNAogICAgZHVwCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDgKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMyNwogICAgLy8gdGVybXMuZGF5X2NvdW50X2NvbnZlbnRpb24uYXNfdWludDY0KCkKICAgIHB1c2hpbnQgNTcKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyOTctMzAzCiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgIGJ6IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGRpZyA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyOTkKICAgIC8vIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGRpZyA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDAKICAgIC8vIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICBwdXNoaW50IDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI5Ny0zMDMKICAgIC8vIHJldHVybiBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzYwKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwSVNEQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjApLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDE2CiAgICBkaWcgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzAxCiAgICAvLyBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyOTctMzAzCiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgID09CiAgICBibnogY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUAxNgogICAgZGlnIDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMwMgogICAgLy8gVUludDY0KGVudW1zLkRDQ18zMEUzNjApLAogICAgcHVzaGludCA0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyOTctMzAzCiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgID09CiAgICBieiBjb250cmFjdF9jb25maWdfYm9vbF9mYWxzZUAxNwoKY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUAxNjoKICAgIGludGNfMSAvLyAxCgpjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUAxODoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMwOS0zMTEKICAgIC8vIGFzc2VydCBzZWxmLl9pc19zdXBwb3J0ZWRfZGF5X2NvdW50X2NvbnZlbnRpb24oCiAgICAvLyAgICAgZGF5X2NvdW50X2NvbnZlbnRpb24KICAgIC8vICksIGVyci5JTlZBTElEX0RBWV9DT1VOVF9DT05WRU5USU9OCiAgICBhc3NlcnQgLy8gSW52YWxpZCBkYXktY291bnQgY29udmVudGlvbiBJRAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzI5CiAgICAvLyBpZiBjb250cmFjdF90eXBlICE9IFVJbnQ2NChlbnVtcy5DVF9BTk4pOgogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgIT0KICAgIGJ6IGNvbnRyYWN0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDIwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzAKICAgIC8vIGFzc2VydCBub3QgdGVybXMuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBkaWcgNAogICAgcHVzaGludCA3ODYKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgoKY29udHJhY3RfY29uZmlnX2FmdGVyX2lmX2Vsc2VAMjA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MDAKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MDEKICAgIC8vIGFzc2VydCBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID09IFVJbnQ2NCgwKSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBELUFTQSBhbHJlYWR5IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgwMy04MDQKICAgIC8vICMgU2V0IERlbm9taW5hdGlvbiBBc3NldAogICAgLy8gc2VsZi5fYXNzZXJ0X2Rlbm9taW5hdGlvbl9hc3NldCh0ZXJtcy5kZW5vbWluYXRpb25fYXNzZXRfaWQpCiAgICBkaWcgNAogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc2OC03NjkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gZGVub21pbmF0aW9uIHdpdGggQVNBCiAgICAvLyBfY3JlYXRvciwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfY3JlYXRvcihkZW5vbWluYXRpb25fYXNzZXRfaWQpCiAgICBkdXAKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc3MAogICAgLy8gYXNzZXJ0IGV4aXN0cywgZXJyLklOVkFMSURfREVOT01JTkFUSU9OCiAgICBhc3NlcnQgLy8gRGVub21pbmF0aW9uIGFzc2V0IGlzIG5vdCBwcm9wZXJseSBzZXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc3MwogICAgLy8gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgPSBkZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIGJ5dGVjIDQ0IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgwNy04MDgKICAgIC8vICMgU2V0IFNldHRsZW1lbnQgQXNzZXQKICAgIC8vIHNlbGYuX2Fzc2VydF9zZXR0bGVtZW50X2Fzc2V0KHRlcm1zLnNldHRsZW1lbnRfYXNzZXRfaWQpCiAgICBkaWcgMQogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Nzc4CiAgICAvLyBzZXR0bGVtZW50X2Fzc2V0X2lkID09IHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc3Ni03NzkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzZXR0bGVtZW50IGFzc2V0IGlzIHRoZSBkZW5vbWluYXRpb24gYXNzZXQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgLy8gKSwgZXJyLklOVkFMSURfU0VUVExFTUVOVF9BU1NFVAogICAgYXNzZXJ0IC8vIERpZmZlcmVudCBzZXR0bGVtZW50IGFzc2V0IG5vdCBzdXBwb3J0ZWQsIG11c3QgYmUgZXF1YWwgdG8gZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODIKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCA9IHNldHRsZW1lbnRfYXNzZXRfaWQKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODMtNzg5CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODgKICAgIC8vIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODYKICAgIC8vIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Nzg3CiAgICAvLyBhc3NldF9hbW91bnQ9MCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODMtNzg0CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc4My03ODkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gc2V0dGxlbWVudCB3aXRoIEFTQQogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PTAsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTEtODEyCiAgICAvLyAjIFVuaXRzCiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzID0gdGVybXMudG90YWxfdW5pdHMKICAgIGR1cAogICAgcHVzaGludCAxNwogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTMKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDEwIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODE1LTgxNgogICAgLy8gIyBEYXktQ291bnQgQ29udmVudGlvbnMKICAgIC8vIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPSB0ZXJtcy5kYXlfY291bnRfY29udmVudGlvbi5hc191aW50NjQoKQogICAgYnl0ZWMgNDYgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgZGlnIDgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTgtODE5CiAgICAvLyAjIFRpbWUKICAgIC8vIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlID0gdGVybXMuaW5pdGlhbF9leGNoYW5nZV9kYXRlCiAgICBkdXAKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAyNiAvLyAiaW5pdGlhbF9leGNoYW5nZV9kYXRlIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MjAKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IHRlcm1zLm1hdHVyaXR5X2RhdGUKICAgIGRpZyAxCiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNDUgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgyMQogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gaW5pdGlhbF9zdGF0ZS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBkaWcgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBwdXNoaW50IDQ4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODIzLTgyNAogICAgLy8gIyBQcmluY2lwYWwKICAgIC8vIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPSB0ZXJtcy5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudAogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgZGlnIDEwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODI1CiAgICAvLyBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSB0ZXJtcy5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBkaWcgMwogICAgcHVzaGludCA3ODYKICAgIGdldGJpdAogICAgYnl0ZWMgMzQgLy8gImR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODI2CiAgICAvLyBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9IGluaXRpYWxfc3RhdGUub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBkaWcgMQogICAgcHVzaGludCAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjXzMgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MjgtODI5CiAgICAvLyAjIEludGVyZXN0CiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgPSBpbml0aWFsX3N0YXRlLmFjY3J1ZWRfaW50ZXJlc3QKICAgIGRpZyAxCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MzEtODMyCiAgICAvLyAjIEludGVyZXN0IFJhdGUKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gaW5pdGlhbF9zdGF0ZS5ub21pbmFsX2ludGVyZXN0X3JhdGUKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODMzCiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBpbml0aWFsX3N0YXRlLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UKICAgIGRpZyAxCiAgICBwdXNoaW50IDI0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MzQKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQgPSB0ZXJtcy5yYXRlX3Jlc2V0X3NwcmVhZAogICAgZGlnIDMKICAgIHB1c2hpbnQgNTgKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzNSAvLyAicmF0ZV9yZXNldF9zcHJlYWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODM1CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciA9IHRlcm1zLnJhdGVfcmVzZXRfbXVsdGlwbGllcgogICAgZGlnIDMKICAgIHB1c2hpbnQgNjYKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzNiAvLyAicmF0ZV9yZXNldF9tdWx0aXBsaWVyIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzNgogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X2Zsb29yID0gdGVybXMucmF0ZV9yZXNldF9mbG9vcgogICAgZGlnIDMKICAgIHB1c2hpbnQgNzQKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAyOSAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MzcKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9jYXAgPSB0ZXJtcy5yYXRlX3Jlc2V0X2NhcAogICAgZGlnIDMKICAgIHB1c2hpbnQgODIKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzMCAvLyAicmF0ZV9yZXNldF9jYXAiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODM4CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfbmV4dCA9IHRlcm1zLnJhdGVfcmVzZXRfbmV4dAogICAgZGlnIDMKICAgIHB1c2hpbnQgOTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzNyAvLyAicmF0ZV9yZXNldF9uZXh0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzOQogICAgLy8gc2VsZi5oYXNfcmF0ZV9yZXNldF9mbG9vciA9IHRlcm1zLmhhc19yYXRlX3Jlc2V0X2Zsb29yCiAgICBkaWcgMwogICAgcHVzaGludCA3ODQKICAgIGdldGJpdAogICAgYnl0ZWMgMzggLy8gImhhc19yYXRlX3Jlc2V0X2Zsb29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0MAogICAgLy8gc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgPSB0ZXJtcy5oYXNfcmF0ZV9yZXNldF9jYXAKICAgIGRpZyAzCiAgICBwdXNoaW50IDc4NQogICAgZ2V0Yml0CiAgICBieXRlYyAzOSAvLyAiaGFzX3JhdGVfcmVzZXRfY2FwIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0Mi04NDMKICAgIC8vICMgU2NhbGluZwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSA9IHRlcm1zLmZpeGVkX3BvaW50X3NjYWxlCiAgICB1bmNvdmVyIDMKICAgIHB1c2hpbnQgOTkKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDUtODQ2CiAgICAvLyAjIFNjaGVkdWxlIFByb2Nlc3NpbmcKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yID0gaW5pdGlhbF9zdGF0ZS5ldmVudF9jdXJzb3IKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDgtODQ5CiAgICAvLyAjIFBlci1Vbml0IEZpeGVkLVBvaW50IEluZGV4ZXMKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCA9IGluaXRpYWxfc3RhdGUuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleAogICAgZGlnIDEKICAgIHB1c2hpbnQgNTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NTAKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggPSBpbml0aWFsX3N0YXRlLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4CiAgICBkaWcgMQogICAgcHVzaGludCA2NAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NTItODUzCiAgICAvLyAjIFJlc2VydmVkIEFtb3VudCAoZm9yIGV4ZWN1dGVkIGNhc2hmbG93cykKICAgIC8vIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU0CiAgICAvLyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU2CiAgICAvLyBhc3NlcnQgdGVybXMuaW5pdGlhbF9leGNoYW5nZV9kYXRlID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsIGVyci5JTlZBTElEX0lFRAogICAgZGlnIDIKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgID4KICAgIGFzc2VydCAvLyBJRUQgbXVzdCBiZSBzZXQgaW4gdGhlIGZ1dHVyZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU3CiAgICAvLyBhc3NlcnQgdGVybXMuaW5pdGlhbF9leGNoYW5nZV9kYXRlID4gaW5pdGlhbF9zdGF0ZS5zdGF0dXNfZGF0ZSwgZXJyLklOVkFMSURfSUVECiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICA8CiAgICBhc3NlcnQgLy8gSUVEIG11c3QgYmUgc2V0IGluIHRoZSBmdXR1cmUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg1OAogICAgLy8gYXNzZXJ0IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA8IHRlcm1zLm1hdHVyaXR5X2RhdGUsIGVyci5JTlZBTElEX0lFRAogICAgPAogICAgYXNzZXJ0IC8vIElFRCBtdXN0IGJlIHNldCBpbiB0aGUgZnV0dXJlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDE5LTEwMjAKICAgIC8vICMgTm90YXJpemUgcHJvc3BlY3R1cyAob3B0aW9uYWwpCiAgICAvLyBzZWxmLnByb3NwZWN0dXNfaGFzaCA9IHByb3NwZWN0dXMuaGFzaC5ieXRlcwogICAgZGlnIDIKICAgIGV4dHJhY3QgMCAzMgogICAgYnl0ZWMgNDIgLy8gInByb3NwZWN0dXNfaGFzaCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDIxCiAgICAvLyBzZWxmLnByb3NwZWN0dXNfdXJsID0gcHJvc3BlY3R1cy51cmwKICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgYnl0ZWMgNDMgLy8gInByb3NwZWN0dXNfdXJsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMjIKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNvbnRyYWN0X2NvbmZpZ19ib29sX2ZhbHNlQDE3OgogICAgaW50Y18wIC8vIDAKICAgIGIgY29udHJhY3RfY29uZmlnX2Jvb2xfbWVyZ2VAMTgKCmNvbnRyYWN0X2NvbmZpZ19ib29sX2ZhbHNlQDg6CiAgICBpbnRjXzAgLy8gMAogICAgYiBjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUA5CgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3Rfc2NoZWR1bGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9zY2hlZHVsZToKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAyNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBzd2FwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgMwogICAgZHVwCiAgICBwdXNoaW50IDY1CiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIHVuY292ZXIgMgogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8c21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5FeGVjdXRpb25TY2hlZHVsZUVudHJ5PgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAzOQogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDQyCiAgICAvLyBjb250cmFjdF90eXBlPXNlbGYuY29udHJhY3RfdHlwZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBjb3ZlciAzCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODc0CiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIEQtQVNBIGFscmVhZHkgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODc1LTg3NwogICAgLy8gYXNzZXJ0IHNjaGVkdWxlX3BhZ2UubGVuZ3RoIDw9IFVJbnQ2NCgKICAgIC8vICAgICBjc3QuU0NIRURVTEVfUEFHRV9TSVpFCiAgICAvLyApLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBkdXAKICAgIHB1c2hpbnQgMTYKICAgIDw9CiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NzgKICAgIC8vIGFzc2VydCBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID4gVUludDY0KDApLCBlcnIuVEVSTVNfTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMCAvLyAiaW5pdGlhbF9leGNoYW5nZV9hbW91bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0EgdGVybXMgbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg4MAogICAgLy8gcGFnZV9jdXJzb3IgPSBzY2hlZHVsZV9wYWdlX2luZGV4ICogVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpCiAgICBzd2FwCiAgICBwdXNoaW50IDE2CiAgICAqCiAgICBzd2FwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4ODcKICAgIC8vICsgcGFnZV9sZW5ndGggKiBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19QRVJfRU5UUllfQlVER0VUKQogICAgcHVzaGludCAxMDAKICAgICoKICAgIHB1c2hpbnQgMTUxMAogICAgKwoKY29udHJhY3Rfc2NoZWR1bGVfd2hpbGVfdG9wQDI6CiAgICBkdXAKICAgIGdsb2JhbCBPcGNvZGVCdWRnZXQKICAgID4KICAgIGJ6IGNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX3doaWxlQDUKICAgIGl0eG5fYmVnaW4KICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBwdXNoaW50IDUgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICBieXRlYyA0NyAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW0KICAgIGJ5dGVjIDQ3IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBiIGNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEAyCgpjb250cmFjdF9zY2hlZHVsZV9hZnRlcl93aGlsZUA1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODkwCiAgICAvLyBpbmRleCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTAKCmNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODkxCiAgICAvLyB3aGlsZSBpbmRleCA8IHBhZ2VfbGVuZ3RoOgogICAgZGlnIDkKICAgIGRpZyA0CiAgICA8CiAgICBieiBjb250cmFjdF9zY2hlZHVsZV9hZnRlcl93aGlsZUAxNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODkyLTg5MwogICAgLy8gZW50cnkgPSBzY2hlZHVsZV9wYWdlW2luZGV4XS5jb3B5KCkKICAgIC8vIGVudHJ5X2V2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBkaWcgNAogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgYnVyeSAxMwogICAgZGlnIDEwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgNjUKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODkzCiAgICAvLyBlbnRyeV9ldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTItODkzCiAgICAvLyBlbnRyeSA9IHNjaGVkdWxlX3BhZ2VbaW5kZXhdLmNvcHkoKQogICAgLy8gZW50cnlfZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGludGNfMiAvLyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTMKICAgIC8vIGVudHJ5X2V2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBnZXRieXRlCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgMTQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg5NAogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X2lkID09IHBhZ2VfY3Vyc29yICsgaW5kZXgsIGVyci5JTlZBTElEX0VWRU5UX0lECiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEzCiAgICBkaWcgNQogICAgdW5jb3ZlciA0CiAgICArCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTUtODk3CiAgICAvLyBzZWxmLl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBlbnRyeV9ldmVudF90eXBlCiAgICAvLyApCiAgICBkaWcgNQogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODk4CiAgICAvLyBhc3NlcnQgZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgc3dhcAogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTkKICAgIC8vIGlmIGVudHJ5LmV2ZW50X2lkID4gVUludDY0KDApOgogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTAwCiAgICAvLyBpZiBpbmRleCA+IFVJbnQ2NCgwKToKICAgIGRpZyA5CiAgICBieiBjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlAMTAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkwMQogICAgLy8gcHJldmlvdXNfZW50cnkgPSBzY2hlZHVsZV9wYWdlW2luZGV4IC0gVUludDY0KDEpXS5jb3B5KCkKICAgIGRpZyA5CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgcHVzaGludCA2NQogICAgKgogICAgZGlnIDEyCiAgICBzd2FwCiAgICBwdXNoaW50IDY1CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTYKICAgIC8vIHByZXZpb3VzX2VudHJ5LnNjaGVkdWxlZF90aW1lIDw9IGVudHJ5LnNjaGVkdWxlZF90aW1lCiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgOAogICAgPD0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkxNS05MTcKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgcHJldmlvdXNfZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gZW50cnkuc2NoZWR1bGVkX3RpbWUKICAgIC8vICksIGVyci5JTlZBTElEX1NPUlRJTkcKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBtdXN0IGJlIHNvcnRlZCBpbiBzdHJpY3RseSBhc2NlbmRpbmcgb3JkZXIKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTgKICAgIC8vIGlmIGVudHJ5LmV2ZW50X2lkID09IFVJbnQ2NCgwKToKICAgIGRpZyA4CiAgICBibnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTE5LTkyMQogICAgLy8gYXNzZXJ0IGVudHJ5X2V2ZW50X3R5cGUgPT0gVUludDY0KAogICAgLy8gICAgIGVudW1zLkVWVF9JRUQKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZGlnIDEwCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjIKICAgIC8vIGluZGV4ICs9IFVJbnQ2NCgxKQogICAgZGlnIDkKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEwCiAgICBiIGNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEA2Cgpjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlAMTA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDMtOTA1CiAgICAvLyAjIFRoZSBmaXJzdCBlbnRyeSBvZiBhIHBhZ2UgbXVzdCBzdGlsbCBiZSBvcmRlcmVkIGFmdGVyIHRoZQogICAgLy8gIyBsYXN0IGVudHJ5IG9mIHRoZSBwcmV2aW91cyBwYWdlLgogICAgLy8gYXNzZXJ0IHNjaGVkdWxlX3BhZ2VfaW5kZXggPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0VWRU5UX0lECiAgICBkaWcgNgogICAgZHVwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBpZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTA2CiAgICAvLyBwcmV2aW91c19wYWdlX2luZGV4ID0gc2NoZWR1bGVfcGFnZV9pbmRleCAtIFVJbnQ2NCgxKQogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkwOAogICAgLy8gcHJldmlvdXNfcGFnZV9pbmRleCBpbiBzZWxmLnNjaGVkdWxlX3BhZ2UKICAgIGl0b2IKICAgIGJ5dGVjIDMxIC8vIDB4NTMyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTA3LTkwOQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBwcmV2aW91c19wYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZQogICAgLy8gKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTEwLTkxMQogICAgLy8gcHJldmlvdXNfcGFnZSA9IHNlbGYuc2NoZWR1bGVfcGFnZVtwcmV2aW91c19wYWdlX2luZGV4XS5jb3B5KCkKICAgIC8vIGFzc2VydCBwcmV2aW91c19wYWdlLmxlbmd0aCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGludCAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTExCiAgICAvLyBhc3NlcnQgcHJldmlvdXNfcGFnZS5sZW5ndGggPiBVSW50NjQoMCksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGR1cAogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTEzCiAgICAvLyBwcmV2aW91c19wYWdlLmxlbmd0aCAtIFVJbnQ2NCgxKQogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkxMi05MTQKICAgIC8vIHByZXZpb3VzX2VudHJ5ID0gcHJldmlvdXNfcGFnZVsKICAgIC8vICAgICBwcmV2aW91c19wYWdlLmxlbmd0aCAtIFVJbnQ2NCgxKQogICAgLy8gXS5jb3B5KCkKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgMgogICAgKwogICAgcHVzaGludCA2NQogICAgYm94X2V4dHJhY3QKICAgIGIgY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxMQoKY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfd2hpbGVAMTU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMDAKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHNjaGVkdWxlX3BhZ2UuY29weSgpCiAgICBkaWcgNgogICAgaXRvYgogICAgYnl0ZWMgMzEgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBkaWcgNQogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTI1CiAgICAvLyBpZiBpc19sYXN0X3BhZ2U6CiAgICBkaWcgNQogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxNwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTI3CiAgICAvLyBzY2hlZHVsZV9wYWdlX2luZGV4ICogVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpICsgcGFnZV9sZW5ndGgKICAgIGRpZyAxCiAgICBkaWcgNAogICAgKwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTI2CiAgICAvLyBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50ID0gKAogICAgYnl0ZWMgNCAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjYtOTI4CiAgICAvLyBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50ID0gKAogICAgLy8gICAgIHNjaGVkdWxlX3BhZ2VfaW5kZXggKiBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkgKyBwYWdlX2xlbmd0aAogICAgLy8gKQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkyOQogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgcHVzaGludCA1MAogICAgYXBwX2dsb2JhbF9wdXQKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDQ3CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmV4ZWN1dGVfaWVkW3JvdXRpbmddKCkgLT4gdm9pZDoKZXhlY3V0ZV9pZWQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA1NwogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDU4CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA1OQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNjEKICAgIC8vIGFzc2VydCBzZWxmLmV2ZW50X2N1cnNvciA8IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICBkaWcgMQogICAgPgogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgY3Vyc29yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDYyCiAgICAvLyBlbnRyeSA9IHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLmV2ZW50X2N1cnNvcikKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2MwogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X3R5cGUgPT0gYXJjNC5VSW50OChlbnVtcy5FVlRfSUVEKSwgZXJyLklOVkFMSURfRVZFTlRfVFlQRQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgZHVwCiAgICBwdXNoYnl0ZXMgMHgwMQogICAgYj09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCB0eXBlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDY3CiAgICAvLyBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIGRpZyAxCiAgICBleHRyYWN0IDAgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2OQogICAgLy8gc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICBkaWcgMgogICAgZXh0cmFjdCA5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNzAKICAgIC8vIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgZGlnIDMKICAgIGV4dHJhY3QgMTcgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3MQogICAgLy8gcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZGlnIDQKICAgIGV4dHJhY3QgMjUgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3MwogICAgLy8gbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9ZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBkaWcgNQogICAgZXh0cmFjdCAzMyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc0CiAgICAvLyBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICBkaWcgNgogICAgZXh0cmFjdCA0MSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc1CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1lbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIGRpZyA3CiAgICBleHRyYWN0IDQ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNzYKICAgIC8vIGZsYWdzPWVudHJ5LmZsYWdzLAogICAgZGlnIDgKICAgIGV4dHJhY3QgNTcgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2Ni0xMDc3CiAgICAvLyB0eXAuT2JzZXJ2ZWRFdmVudFJlcXVlc3QoCiAgICAvLyAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBvYnNlcnZlZF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1lbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9ZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9ZW50cnkuZmxhZ3MsCiAgICAvLyApLAogICAgdW5jb3ZlciA3CiAgICB1bmNvdmVyIDgKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3MgogICAgLy8gb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2Ni0xMDc3CiAgICAvLyB0eXAuT2JzZXJ2ZWRFdmVudFJlcXVlc3QoCiAgICAvLyAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBvYnNlcnZlZF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1lbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9ZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9ZW50cnkuZmxhZ3MsCiAgICAvLyApLAogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNjQtMTA3OAogICAgLy8gc2VsZi5fYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkoCiAgICAvLyAgICAgZW50cnksCiAgICAvLyAgICAgdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0KAogICAgLy8gICAgICAgICBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIC8vICAgICAgICAgZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgLy8gICAgICAgICBzY2hlZHVsZWRfdGltZT1lbnRyeS5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICAgICAgYWNjcnVhbF9mYWN0b3I9ZW50cnkuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICAgICAgb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPWVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPWVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgICAgICBmbGFncz1lbnRyeS5mbGFncywKICAgIC8vICAgICApLAogICAgLy8gKQogICAgY2FsbHN1YiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkKICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3OQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDQ5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5hcHBseV9ub25fY2FzaF9ldmVudFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFwcGx5X25vbl9jYXNoX2V2ZW50OgogICAgaW50Y18wIC8vIDAKICAgIGR1cG4gNAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwODEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwbiAyCiAgICBsZW4KICAgIHB1c2hpbnQgNzMKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuT2JzZXJ2ZWRFdmVudFJlcXVlc3QKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDk1CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA5NgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwOTgKICAgIC8vIGlmIHBheWxvYWQuZmxhZ3MgJiBVSW50NjQoZW51bXMuRkxBR19PQlNFUlZFRF9FVkVOVCk6CiAgICBwdXNoaW50IDY1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBwdXNoaW50IDQKICAgICYKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjMzCiAgICAvLyByZXR1cm4gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9DTE0pCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIHB1c2hpbnQgNQogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwOTkKICAgIC8vIGFzc2VydCBzZWxmLl9zdXBwb3J0c19vYnNlcnZlZF9ldmVudHMoKSwgZXJyLk9CU0VSVkVEX0VWRU5UX1JFUVVJUkVECiAgICBhc3NlcnQgLy8gT2JzZXJ2ZWQgZXZlbnQgcmVxdWlyZWQgdG8gZXhlY3V0ZSB0aGlzIGFjdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEwMAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMzMKICAgIC8vIHJldHVybiBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0NMTSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgZHVwCiAgICBwdXNoaW50IDUKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MzgKICAgIC8vIGFzc2VydCBzZWxmLl9zdXBwb3J0c19vYnNlcnZlZF9ldmVudHMoKSwgZXJyLk9CU0VSVkVEX0VWRU5UX1JFUVVJUkVECiAgICBhc3NlcnQgLy8gT2JzZXJ2ZWQgZXZlbnQgcmVxdWlyZWQgdG8gZXhlY3V0ZSB0aGlzIGFjdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTM5CiAgICAvLyBhc3NlcnQgcGF5bG9hZC5ldmVudF9pZCA9PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LCBlcnIuSU5WQUxJRF9FVkVOVF9JRAogICAgZGlnIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgNwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NDEKICAgIC8vIHNlbGYuY29udHJhY3RfdHlwZSwgcGF5bG9hZC5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBkdXAKICAgIGV4dHJhY3QgOCAxCiAgICBidXJ5IDEyCiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQwLTk0MgogICAgLy8gc2VsZi5fYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgc2VsZi5jb250cmFjdF90eXBlLCBwYXlsb2FkLmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIC8vICkKICAgIGNhbGxzdWIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NDQKICAgIC8vIHBhZ2VfaW5kZXggPSBzZWxmLl9zY2hlZHVsZV9wYWdlX2luZGV4KHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxOTAKICAgIC8vIHJldHVybiBldmVudF9pZCAvLyBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkKICAgIHB1c2hpbnQgMTYKICAgIC8KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk0NQogICAgLy8gcGFnZSA9IHR5cC5FeGVjdXRpb25TY2hlZHVsZVBhZ2UoKQogICAgcHVzaGJ5dGVzIDB4MDAwMAogICAgYnVyeSA3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NDYKICAgIC8vIGlmIHBhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlOgogICAgaXRvYgogICAgYnl0ZWMgMzEgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA5CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMjcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk0NwogICAgLy8gcGFnZSA9IHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XS5jb3B5KCkKICAgIGRpZyA3CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidXJ5IDcKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX3BhZ2UgZW50cnkgZXhpc3RzCgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDI3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQ4CiAgICAvLyBhc3NlcnQgcGFnZS5sZW5ndGggPCBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGRpZyA1CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgMTYKICAgIDwKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1MwogICAgLy8gc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIGRpZyAzCiAgICBkdXAKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTQKICAgIC8vIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICBkaWcgMQogICAgZXh0cmFjdCAxNyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTUKICAgIC8vIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZGlnIDIKICAgIGV4dHJhY3QgMjUgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTU2CiAgICAvLyBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDMKICAgIGV4dHJhY3QgNDEgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTU3CiAgICAvLyBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIGRpZyA0CiAgICBleHRyYWN0IDQ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1OAogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIHVuY292ZXIgNQogICAgZXh0cmFjdCA1NyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTAtOTYwCiAgICAvLyB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1wYXlsb2FkLmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9cGF5bG9hZC5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPXBheWxvYWQucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXBheWxvYWQubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICkKICAgIGRpZyAxMQogICAgaXRvYgogICAgZGlnIDE4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMwogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NDktOTYxCiAgICAvLyBwYWdlLmFwcGVuZCgKICAgIC8vICAgICB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9cGF5bG9hZC5ldmVudF9pZCwKICAgIC8vICAgICAgICAgZXZlbnRfdHlwZT1wYXlsb2FkLmV2ZW50X3R5cGUsCiAgICAvLyAgICAgICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIC8vICAgICAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICAgICApCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjIKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHBhZ2UuY29weSgpCiAgICBkaWcgOAogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2MwogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTAzCiAgICAvLyBhc3NlcnQgZXZlbnRfaWQgPT0gc2VsZi5ldmVudF9jdXJzb3IsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBjdXJzb3IKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMDQKICAgIC8vIGVudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KGV2ZW50X2lkKQogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEwNgogICAgLy8gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgYnVyeSAxMAogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjQKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY1CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzYzLTM3MAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9SUiksCiAgICBwdXNoaW50IDEyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY3CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICBwdXNoaW50IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY4CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgcHVzaGludCAxOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzYzLTM3MAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBieiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX2ZhbHNlQDE2CgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX3RydWVAMTU6CiAgICBpbnRjXzEgLy8gMQoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9tZXJnZUAxNzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMDUtMTEwNwogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2lzX25vbl9jYXNoKAogICAgLy8gICAgIGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIC8vICksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IHR5cGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMDgKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlICE9IGFyYzQuVUludDgoZW51bXMuRVZUX0lFRCksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGRpZyA4CiAgICBwdXNoYnl0ZXMgMHgwMQogICAgYiE9CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCB0eXBlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNzQKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluIChVSW50NjQoZW51bXMuRVZUX1JSKSwgVUludDY0KGVudW1zLkVWVF9SUkYpKQogICAgZGlnIDQKICAgIHB1c2hpbnQgMTIKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDIxCiAgICBkaWcgNAogICAgcHVzaGludCAxMQogICAgPT0KICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfZmFsc2VAMjIKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAyMToKICAgIGludGNfMSAvLyAxCgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX21lcmdlQDIzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEwOQogICAgLy8gaWYgc2VsZi5fZXZlbnRfaXNfcmF0ZV9yZXNldChlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpKToKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Vsc2VfYm9keUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODAKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLm9ic2VydmVyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjQgLy8gMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTEzCiAgICAvLyBzZWxmLl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeShlbnRyeSwgcGF5bG9hZCkKICAgIGRpZyA2CiAgICBkaWcgMgogICAgY2FsbHN1YiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkKICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTExNAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDgxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Vsc2VfYm9keUA1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTExMgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICBiIGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VANgoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9mYWxzZUAyMjoKICAgIGludGNfMCAvLyAwCiAgICBiIGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfbWVyZ2VAMjMKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfZmFsc2VAMTY6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX21lcmdlQDE3CgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuZ2V0X2NvbnRyYWN0X3N0YXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2NvbnRyYWN0X3N0YXRlOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBkdXAKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEyMQogICAgLy8gY29udHJhY3RfdHlwZT1hcmM0LlVJbnQ4KHNlbGYuY29udHJhY3RfdHlwZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzIgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMjMKICAgIC8vIHRvdGFsX3VuaXRzPXNlbGYudG90YWxfdW5pdHMsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEyNAogICAgLy8gcmVzZXJ2ZWRfdW5pdHNfdG90YWw9c2VsZi5yZXNlcnZlZF91bml0c190b3RhbCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTI1CiAgICAvLyBpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudD1zZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMjYKICAgIC8vIGV2ZW50X2N1cnNvcj1zZWxmLmV2ZW50X2N1cnNvciwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEyNwogICAgLy8gc2NoZWR1bGVfZW50cnlfY291bnQ9c2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMjgKICAgIC8vIG91dHN0YW5kaW5nX3ByaW5jaXBhbD1zZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEyOQogICAgLy8gaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZT1zZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEzMAogICAgLy8gbm9taW5hbF9pbnRlcmVzdF9yYXRlPXNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTMxCiAgICAvLyBhY2NydWVkX2ludGVyZXN0PXNlbGYuYWNjcnVlZF9pbnRlcmVzdCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTMyCiAgICAvLyBjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4PXNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEzMwogICAgLy8gY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXg9c2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTM0CiAgICAvLyByZXNlcnZlZF9pbnRlcmVzdD1zZWxmLnJlc2VydmVkX2ludGVyZXN0LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMzUKICAgIC8vIHJlc2VydmVkX3ByaW5jaXBhbD1zZWxmLnJlc2VydmVkX3ByaW5jaXBhbCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMjAtMTEzNgogICAgLy8gcmV0dXJuIHR5cC5LZXJuZWxTdGF0ZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlPWFyYzQuVUludDgoc2VsZi5jb250cmFjdF90eXBlKSwKICAgIC8vICAgICBzdGF0dXM9c2VsZi5zdGF0dXMsCiAgICAvLyAgICAgdG90YWxfdW5pdHM9c2VsZi50b3RhbF91bml0cywKICAgIC8vICAgICByZXNlcnZlZF91bml0c190b3RhbD1zZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsLAogICAgLy8gICAgIGluaXRpYWxfZXhjaGFuZ2VfYW1vdW50PXNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQsCiAgICAvLyAgICAgZXZlbnRfY3Vyc29yPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgLy8gICAgIHNjaGVkdWxlX2VudHJ5X2NvdW50PXNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQsCiAgICAvLyAgICAgb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2U9c2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlLAogICAgLy8gICAgIG5vbWluYWxfaW50ZXJlc3RfcmF0ZT1zZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBhY2NydWVkX2ludGVyZXN0PXNlbGYuYWNjcnVlZF9pbnRlcmVzdCwKICAgIC8vICAgICBjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4PXNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCwKICAgIC8vICAgICBjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleD1zZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4LAogICAgLy8gICAgIHJlc2VydmVkX2ludGVyZXN0PXNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QsCiAgICAvLyAgICAgcmVzZXJ2ZWRfcHJpbmNpcGFsPXNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsLAogICAgLy8gKQogICAgdW5jb3ZlciAxNAogICAgaXRvYgogICAgdW5jb3ZlciAxNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDEzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDEwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgOQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDgKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTE2CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5nZXRfbmV4dF9kdWVfZXZlbnRbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfbmV4dF9kdWVfZXZlbnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE0MgogICAgLy8gaWYgc2VsZi5ldmVudF9jdXJzb3IgPj0gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgPj0KICAgIGJ6IGdldF9uZXh0X2R1ZV9ldmVudF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDQKICAgIC8vIGV2ZW50X2lkPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTQzLTExNTMKICAgIC8vIHJldHVybiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1zZWxmLmV2ZW50X2N1cnNvciwKICAgIC8vICAgICBldmVudF90eXBlPWFyYzQuVUludDgoMCksCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9VUludDY0KDApLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9VUludDY0KDApLAogICAgLy8gICAgIGZsYWdzPVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGl0b2IKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDUKICAgIC8vIGV2ZW50X3R5cGU9YXJjNC5VSW50OCgwKSwKICAgIGJ5dGVjIDQwIC8vIDB4MDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDMtMTE1MwogICAgLy8gcmV0dXJuIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgIGV2ZW50X2lkPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgLy8gICAgIGV2ZW50X3R5cGU9YXJjNC5VSW50OCgwKSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1VSW50NjQoMCksCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1VSW50NjQoMCksCiAgICAvLyAgICAgZmxhZ3M9VUludDY0KDApLAogICAgLy8gKQogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTQ2CiAgICAvLyBzY2hlZHVsZWRfdGltZT1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE0My0xMTUzCiAgICAvLyByZXR1cm4gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkoCiAgICAvLyAgICAgZXZlbnRfaWQ9c2VsZi5ldmVudF9jdXJzb3IsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1hcmM0LlVJbnQ4KDApLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPVVJbnQ2NCgwKSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249VUludDY0KDApLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPVVJbnQ2NCgwKSwKICAgIC8vICAgICBmbGFncz1VSW50NjQoMCksCiAgICAvLyApCiAgICBpdG9iCiAgICBzd2FwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKCmdldF9uZXh0X2R1ZV9ldmVudF9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmdldF9uZXh0X2R1ZV9ldmVudEA0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEzOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpnZXRfbmV4dF9kdWVfZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1NAogICAgLy8gcmV0dXJuIHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLmV2ZW50X2N1cnNvcikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgZ2V0X25leHRfZHVlX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuZ2V0X25leHRfZHVlX2V2ZW50QDQKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5jb250cmFjdF91cGRhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF91cGRhdGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTUzLTE1NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGdyYW50cyB0aGUgdXBkYXRlIHBlcm1pc3Npb25zIHRvIHRoZSBBcnJhbmdlci4KICAgIC8vICMg4pqg77iPIFdBUk5JTkc6IEFwcGxpY2F0aW9uIHVwZGF0ZXMgbXVzdCBiZSBleGVjdXRlZCBWRVJZIGNhcmVmdWxseSwgYXMgdGhleQogICAgLy8gIyBtaWdodCBpbnRyb2R1Y2UgYnJlYWtpbmcgY2hhbmdlcy4KICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfcm90YXRlX2FycmFuZ2VyW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19yb3RhdGVfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2OQogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTcwCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gbmV3X2FycmFuZ2VyCiAgICBieXRlYyAxOCAvLyAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTcxCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfc2V0X29wX2RhZW1vbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfc2V0X29wX2RhZW1vbjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTg0CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODUKICAgIC8vIHNlbGYub3BfZGFlbW9uLnZhbHVlID0gYWRkcmVzcwogICAgYnl0ZWMgMjUgLy8gMHg1MjIzNGY3MDQ0NjE2NTZkNmY2ZTIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4NgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTczCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2Fzc2lnbl9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19hc3NpZ25fcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDE2CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLlJvbGVWYWxpZGl0eQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjExCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMgogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgcHVzaGludCAyMAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTAzCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gcm9sZV9hZGRyZXNzCiAgICBieXRlYyAxOCAvLyAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMKICAgIGRpZyAzCiAgICBhcHBfZ2xvYmFsX3B1dAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTQKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDYKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIGR1cAogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnRfbWFuYWdlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMyAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwOAogICAgLy8gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMiAvLyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTIKICAgIC8vIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIGR1cAogICAgcHVzaGludCA2MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE1CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMzIgLy8gMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE2CiAgICAvLyBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExOAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMSAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIwCiAgICAvLyBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMwogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgODAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIzCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI0IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI0CiAgICAvLyBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3Jldm9rZV9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19yZXZva2Vfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzUKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzNgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzcKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCkpCiAgICBidG9pCiAgICBkdXBuIDIKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCAhPSBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksIGVyci5JTlZBTElEX1JPTEUKICAgIGR1cAogICAgcHVzaGludCAyMAogICAgIT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyOAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIzIC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0NGQ2MTZlNjE2NzY1NzIyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMwCiAgICAvLyBkZWwgc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzOQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjE2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIyIC8vIDB4NTIyMzUwNzI2OTZkNjE3Mjc5NDQ2NTYxNmM2NTcyMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNAogICAgLy8gZGVsIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjM4CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIGR1cAogICAgcHVzaGludCA2MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAzMiAvLyAweDUyMjM1NDcyNzU3Mzc0NjU2NTIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzgKICAgIC8vIGRlbCBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjM4CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDEKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hdXRob3JpdHksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjEgLy8gMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MgogICAgLy8gZGVsIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzOAogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDQKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDgwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI0IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ2CiAgICAvLyBkZWwgc2VsZi5vYnNlcnZlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ292X2Fzc2V0X3N1c3BlbnNpb25bcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dvdl9hc3NldF9zdXNwZW5zaW9uOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kICAjIFRPRE86IFVwZGF0ZSBzcGVjcyBhbmQgYWRkIHRlc3QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzcKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDIxIC8vIDB4NTIyMzQxNzU3NDY4NmY3MjY5NzQ3OTIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU3CiAgICAvLyBzZWxmLmFzc2V0X3N1c3BlbmRlZCA9IHN1c3BlbmRlZAogICAgYnl0ZWMgMzMgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU4CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCAgIyBUT0RPOiBVcGRhdGUgc3BlY3MgYW5kIGFkZCB0ZXN0CiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYXJyYW5nZXJbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNjgKICAgIC8vIHJldHVybiBzZWxmLmFycmFuZ2VyLnZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTggLy8gMHg1MjIzNDE3MjcyNjE2ZTY3NjU3MjIzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJyYW5nZXIgZXhpc3RzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjYwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9hZGRyZXNzX3JvbGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfYWRkcmVzc19yb2xlczoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg0CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmFjY291bnRfbWFuYWdlciwgYWRkcmVzcyksCiAgICBieXRlYyAyMyAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMKICAgIGRpZyAxCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4NQogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5wcmltYXJ5X2RlYWxlciwgYWRkcmVzcyksCiAgICBieXRlYyAyMiAvLyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzCiAgICBkaWcgMgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODYKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYudHJ1c3RlZSwgYWRkcmVzcyksCiAgICBieXRlYyAzMiAvLyAweDUyMjM1NDcyNzU3Mzc0NjU2NTIzCiAgICBkaWcgMwogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODcKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYXV0aG9yaXR5LCBhZGRyZXNzKSwKICAgIGJ5dGVjIDIxIC8vIDB4NTIyMzQxNzU3NDY4NmY3MjY5NzQ3OTIzCiAgICBkaWcgNAogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODgKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYub2JzZXJ2ZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjQgLy8gMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzCiAgICB1bmNvdmVyIDUKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjcwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjIDQwIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDYKICAgIHNldGJpdAogICAgaW50Y18xIC8vIDEKICAgIHVuY292ZXIgNQogICAgc2V0Yml0CiAgICBwdXNoaW50IDIKICAgIHVuY292ZXIgNAogICAgc2V0Yml0CiAgICBwdXNoaW50IDMKICAgIHVuY292ZXIgMwogICAgc2V0Yml0CiAgICBwdXNoaW50IDQKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA1CiAgICAvLyByb2xlID0gcm9sZV9pZC5hc191aW50NjQoKQogICAgYnRvaQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwNgogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZSkKICAgIGR1cAogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDgKICAgIC8vIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgcHVzaGludHMgMjAgNDAgNTAgNjAgNzAgODAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDctMzM4CiAgICAvLyBtYXRjaCByb2xlOgogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgLy8gICAgICAgICByZXR1cm4gdHlwLlJvbGVWYWxpZGl0eSgKICAgIC8vICAgICAgICAgICAgIHJvbGVfdmFsaWRpdHlfc3RhcnQ9VUludDY0KDApLCByb2xlX3ZhbGlkaXR5X2VuZD1VSW50NjQoMCkKICAgIC8vICAgICAgICAgKQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5hdXRob3JpdHksIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5vYnNlcnZlciwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5vYnNlcnZlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBfOgogICAgLy8gICAgICAgICBvcC5lcnIoZXJyLklOVkFMSURfUk9MRSkKICAgIHVuY292ZXIgNgogICAgbWF0Y2ggcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8wQDIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8xQDMgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8yQDQgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8zQDUgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV80QDYgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV81QDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzgKICAgIC8vIG9wLmVycihlcnIuSU5WQUxJRF9ST0xFKQogICAgZXJyIC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzVANzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzQKICAgIC8vIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMjQgLy8gMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzMzLTMzNQogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMzNgogICAgLy8gcmV0dXJuIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzRANjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjkKICAgIC8vIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDIxIC8vIDB4NTIyMzQxNzU3NDY4NmY3MjY5NzQ3OTIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI4LTMzMAogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzEKICAgIC8vIHJldHVybiBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzNANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjQKICAgIC8vIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAzMiAvLyAweDUyMjM1NDcyNzU3Mzc0NjU2NTIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzIzLTMyNQogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI2CiAgICAvLyByZXR1cm4gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMkA0OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxOQogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAyMiAvLyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzE4LTMyMAogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMQogICAgLy8gcmV0dXJuIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8xQDM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzE0CiAgICAvLyBzZWxmLmFjY291bnRfbWFuYWdlciwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAyMyAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTMtMzE1CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxNgogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMEAyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwOS0zMTEKICAgIC8vIHJldHVybiB0eXAuUm9sZVZhbGlkaXR5KAogICAgLy8gICAgIHJvbGVfdmFsaWRpdHlfc3RhcnQ9VUludDY0KDApLCByb2xlX3ZhbGlkaXR5X2VuZD1VSW50NjQoMCkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLl9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IHZvaWQ6Cl9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI2CiAgICAvLyBkZWYgX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQoc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjgKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkLCBlcnIuU1VTUEVOREVECiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCAzODQKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIFN1c3BlbmRlZCBvcGVyYXRpb25zCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5fc2V0dGxlX3Bvc2l0aW9uKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NCwgdWludDY0Ogpfc2V0dGxlX3Bvc2l0aW9uOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjQ0CiAgICAvLyBkZWYgX3NldHRsZV9wb3NpdGlvbihzZWxmLCBob2xkaW5nX2FkZHJlc3M6IEFjY291bnQpIC0+IHR1cGxlW1VJbnQ2NCwgVUludDY0XToKICAgIHByb3RvIDEgMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo2MQogICAgLy8gcG9zaXRpb24gPSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jb3B5KCkKICAgIGR1cAogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NjMtNjUKICAgIC8vICMgQ29tcHV0ZSB0aGUgaW5jcmVtZW50YWwgcGVyLXVuaXQgZml4ZWQtcG9pbnQgaW50ZXJlc3QgYW5kIHByaW5jaXBhbCBhY2NydWVkCiAgICAvLyAjIHNpbmNlIHRoaXMgYWNjb3VudCdzIGxhc3QgY2hlY2twb2ludC4KICAgIC8vIGludGVyZXN0X2RlbHRhID0gc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IC0gcG9zaXRpb24uaW50ZXJlc3RfY2hlY2twb2ludAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggZXhpc3RzCiAgICBkaWcgMQogICAgcHVzaGludCA1NwogICAgZXh0cmFjdF91aW50NjQKICAgIC0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo2NwogICAgLy8gc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCAtIHBvc2l0aW9uLnByaW5jaXBhbF9jaGVja3BvaW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTcgLy8gImN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IGV4aXN0cwogICAgZGlnIDIKICAgIHB1c2hpbnQgNjUKICAgIGV4dHJhY3RfdWludDY0CiAgICAtCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzMKICAgIC8vIGludGVyZXN0X2RlbHRhLCBwb3NpdGlvbi51bml0cywgc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgZGlnIDIKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3MC03NAogICAgLy8gIyBDb252ZXJ0IHRoZSBwZXItdW5pdCBmaXhlZC1wb2ludCBkZWx0YXMgaW50byBhYnNvbHV0ZSBjbGFpbWFibGUgYW1vdW50cwogICAgLy8gIyB1c2luZyB0aGUgYWNjb3VudCdzIGFjdGl2ZSB1bml0cy4KICAgIC8vIGNsYWltYWJsZV9pbnRlcmVzdCA9IHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIGludGVyZXN0X2RlbHRhLCBwb3NpdGlvbi51bml0cywgc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgLy8gKQogICAgdW5jb3ZlciAzCiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojc2CiAgICAvLyBwcmluY2lwYWxfZGVsdGEsIHBvc2l0aW9uLnVuaXRzLCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzUtNzcKICAgIC8vIGNsYWltYWJsZV9wcmluY2lwYWwgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBwcmluY2lwYWxfZGVsdGEsIHBvc2l0aW9uLnVuaXRzLCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICAvLyApCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojc5LTgxCiAgICAvLyAjIEFjY3J1ZSB0aGUgY2xhaW1hYmxlIGFtb3VudHMgdG8gdGhlIGFjY291bnQgcG9zaXRpb24gYW5kIG1ha2UgdGhlbSBhdmFpbGFibGUKICAgIC8vICMgZm9yIHdpdGhkcmF3YWwuCiAgICAvLyBwb3NpdGlvbi5jbGFpbWFibGVfaW50ZXJlc3QgKz0gY2xhaW1hYmxlX2ludGVyZXN0CiAgICBkaWcgMgogICAgcHVzaGludCA3MwogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICArCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIHN3YXAKICAgIHJlcGxhY2UyIDczCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6ODIKICAgIC8vIHBvc2l0aW9uLmNsYWltYWJsZV9wcmluY2lwYWwgKz0gY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgZHVwCiAgICBwdXNoaW50IDgxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDIKICAgICsKICAgIGl0b2IKICAgIHJlcGxhY2UyIDgxCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6ODQtODYKICAgIC8vICMgQWR2YW5jZSB0aGUgYWNjb3VudCdzIHBlci11bml0IGZpeGVkLXBvaW50IGNoZWNrcG9pbnRzIHRvIHRoZSBjdXJyZW50IGdsb2JhbAogICAgLy8gIyBwZXItdW5pdCBmaXhlZC1wb2ludCBnbG9iYWwgaW5kaWNlcy4KICAgIC8vIHBvc2l0aW9uLmludGVyZXN0X2NoZWNrcG9pbnQgPSBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IGV4aXN0cwogICAgaXRvYgogICAgcmVwbGFjZTIgNTcKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo4NwogICAgLy8gcG9zaXRpb24ucHJpbmNpcGFsX2NoZWNrcG9pbnQgPSBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTcgLy8gImN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IGV4aXN0cwogICAgaXRvYgogICAgcmVwbGFjZTIgNjUKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo4OS05MAogICAgLy8gIyBBZHZhbmNlIHRoZSBhY2NvdW50J3MgZXZlbnQgY3Vyc29yIHRvIHRoZSBjdXJyZW50IGdsb2JhbCBldmVudCBjdXJzb3IuCiAgICAvLyBwb3NpdGlvbi5zZXR0bGVkX2N1cnNvciA9IHNlbGYuZXZlbnRfY3Vyc29yCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGl0b2IKICAgIHJlcGxhY2UyIDQ5CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6OTItOTQKICAgIC8vICMgVXBkYXRlIHRoZSBhY2NvdW50IHBvc2l0aW9uIGFuZCByZXR1cm4gdGhlIG5ld2x5IGFjY3J1ZWQgY2xhaW1hYmxlIGFtb3VudHMKICAgIC8vICMgYWRkZWQgdG8gdGhlIHRvdGFsIHBvc2l0aW9uJ3MgY2xhaW1hYmxlIGFtb3VudHMuCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHBvc2l0aW9uLmNvcHkoKQogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6OTUKICAgIC8vIHJldHVybiBjbGFpbWFibGVfaW50ZXJlc3QsIGNsYWltYWJsZV9wcmluY2lwYWwKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IHZvaWQ6Cl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojk3CiAgICAvLyBkZWYgX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQoc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQyMwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDAKICAgIC8vIGlmIHNlbGYuX3N0YXR1c19pc19wZW5kaW5nX2llZCgpOgogICAgYnogX2Vuc3VyZV91bml0c19hY3RpdmF0ZWRfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTAxCiAgICAvLyByZXR1cm4KICAgIHJldHN1YgoKX2Vuc3VyZV91bml0c19hY3RpdmF0ZWRfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwMwogICAgLy8gcG9zaXRpb24gPSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAyCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDQKICAgIC8vIGlmIHBvc2l0aW9uLnJlc2VydmVkX3VuaXRzID09IFVJbnQ2NCgwKToKICAgIHB1c2hpbnQgNDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgYm56IF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkX2FmdGVyX2lmX2Vsc2VANAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwNQogICAgLy8gcmV0dXJuCiAgICByZXRzdWIKCl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkX2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDgKICAgIC8vIHBvc2l0aW9uLnVuaXRzICs9IGFjdGl2YXRlZF91bml0cwogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMwogICAgKwogICAgaXRvYgogICAgcmVwbGFjZTIgMzIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDkKICAgIC8vIHBvc2l0aW9uLnJlc2VydmVkX3VuaXRzID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgaXRvYgogICAgcmVwbGFjZTIgNDAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTAKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gcG9zaXRpb24uY29weSgpCiAgICBmcmFtZV9kaWcgMgogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExMQogICAgLy8gYXNzZXJ0IHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPj0gYWN0aXZhdGVkX3VuaXRzLCBlcnIuT1ZFUl9ESVNUUklCVVRJT04KICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICBkdXAKICAgIGRpZyAyCiAgICA+PQogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCByZW1haW5pbmcgRC1BU0EgdW5pdHMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTIKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgLT0gYWN0aXZhdGVkX3VuaXRzCiAgICBzd2FwCiAgICAtCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX3NjYWxlZF9tdWxfZGl2KG11bHRpcGxpY2FuZDogdWludDY0LCBtdWx0aXBsaWVyOiB1aW50NjQsIGRpdmlzb3I6IHVpbnQ2NCkgLT4gdWludDY0Ogpfc2NhbGVkX211bF9kaXY6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTMtMTU1CiAgICAvLyBkZWYgX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIHNlbGYsIG11bHRpcGxpY2FuZDogVUludDY0LCBtdWx0aXBsaWVyOiBVSW50NjQsIGRpdmlzb3I6IFVJbnQ2NAogICAgLy8gKSAtPiBVSW50NjQ6CiAgICBwcm90byAzIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE1NwogICAgLy8gaWYgbXVsdGlwbGljYW5kID09IFVJbnQ2NCgwKSBvciBtdWx0aXBsaWVyID09IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMwogICAgYnogX3NjYWxlZF9tdWxfZGl2X2lmX2JvZHlAMgogICAgZnJhbWVfZGlnIC0yCiAgICBibnogX3NjYWxlZF9tdWxfZGl2X2FmdGVyX2lmX2Vsc2VAMwoKX3NjYWxlZF9tdWxfZGl2X2lmX2JvZHlAMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE1OAogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKX3NjYWxlZF9tdWxfZGl2X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE1OQogICAgLy8gaGlnaCwgbG93ID0gb3AubXVsdyhtdWx0aXBsaWNhbmQsIG11bHRpcGxpZXIpCiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMgogICAgbXVsdwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTYwCiAgICAvLyByZXR1cm4gb3AuZGl2dyhoaWdoLCBsb3csIGRpdmlzb3IpCiAgICBmcmFtZV9kaWcgLTEKICAgIGRpdncKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9hbW91bnRfdG9faW5kZXhfZGVsdGEoYW1vdW50OiB1aW50NjQpIC0+IHVpbnQ2NDoKX2Ftb3VudF90b19pbmRleF9kZWx0YToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2MgogICAgLy8gZGVmIF9hbW91bnRfdG9faW5kZXhfZGVsdGEoc2VsZiwgYW1vdW50OiBVSW50NjQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTY0CiAgICAvLyBpZiBhbW91bnQgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0xCiAgICBibnogX2Ftb3VudF90b19pbmRleF9kZWx0YV9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2NQogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKX2Ftb3VudF90b19pbmRleF9kZWx0YV9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjYKICAgIC8vIGFzc2VydCBzZWxmLnRvdGFsX3VuaXRzID4gVUludDY0KDApLCBlcnIuTk9fVU5JVFMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICBkdXAKICAgIGFzc2VydCAvLyBObyBELUFTQSB1bml0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTY3CiAgICAvLyByZXR1cm4gc2VsZi5fc2NhbGVkX211bF9kaXYoYW1vdW50LCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLCBzZWxmLnRvdGFsX3VuaXRzKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5faW5kZXhfZGVsdGFfdG9fYW1vdW50KGluZGV4X2RlbHRhOiB1aW50NjQpIC0+IHVpbnQ2NDoKX2luZGV4X2RlbHRhX3RvX2Ftb3VudDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2OQogICAgLy8gZGVmIF9pbmRleF9kZWx0YV90b19hbW91bnQoc2VsZiwgaW5kZXhfZGVsdGE6IFVJbnQ2NCkgLT4gVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNzYKICAgIC8vIGlmIGluZGV4X2RlbHRhID09IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMQogICAgYm56IF9pbmRleF9kZWx0YV90b19hbW91bnRfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNzcKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9pbmRleF9kZWx0YV90b19hbW91bnRfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTc5CiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE4MQogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE3OC0xODIKICAgIC8vIHJldHVybiBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLnRvdGFsX3VuaXRzLAogICAgLy8gICAgIGluZGV4X2RlbHRhLAogICAgLy8gICAgIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZ2V0X3NjaGVkdWxlX2VudHJ5KGV2ZW50X2lkOiB1aW50NjQpIC0+IGJ5dGVzOgpfZ2V0X3NjaGVkdWxlX2VudHJ5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjAyCiAgICAvLyBkZWYgX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLCBldmVudF9pZDogVUludDY0KSAtPiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeToKICAgIHByb3RvIDEgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjA0CiAgICAvLyBhc3NlcnQgZXZlbnRfaWQgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LCBlcnIuSU5WQUxJRF9FVkVOVF9JRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICA+CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBpZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTkwCiAgICAvLyByZXR1cm4gZXZlbnRfaWQgLy8gVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMTYKICAgIC8KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIwNgogICAgLy8gYXNzZXJ0IHBhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBpdG9iCiAgICBieXRlYyAzMSAvLyAweDUzMjMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE5NAogICAgLy8gcmV0dXJuIGV2ZW50X2lkICUgVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMTYKICAgICUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIwOQogICAgLy8gYXNzZXJ0IG9mZnNldCA8IHBhZ2UubGVuZ3RoLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIHB1c2hpbnQgMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGRpZyAxCiAgICA+CiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMTAKICAgIC8vIHJldHVybiBwYWdlW29mZnNldF0uY29weSgpCiAgICBwdXNoaW50IDY1CiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIHB1c2hpbnQgNjUKICAgIGJveF9leHRyYWN0CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoY29udHJhY3RfdHlwZTogdWludDY0LCBldmVudF90eXBlOiB1aW50NjQpIC0+IHZvaWQ6Cl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxMy0zMTUKICAgIC8vIGRlZiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgc2VsZiwgY29udHJhY3RfdHlwZTogVUludDY0LCBldmVudF90eXBlOiBVSW50NjQKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU0LTI1NQogICAgLy8gIyBDaGVjayBjb21tb24gZXZlbnRzIGZpcnN0CiAgICAvLyBpZiBldmVudF90eXBlIGluIGNvbW1vbl9ldmVudHM6CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI0NwogICAgLy8gVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI0OAogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUCksCiAgICBpbnRjXzIgLy8gOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU0LTI1NQogICAgLy8gIyBDaGVjayBjb21tb24gZXZlbnRzIGZpcnN0CiAgICAvLyBpZiBldmVudF90eXBlIGluIGNvbW1vbl9ldmVudHM6CiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjQ5CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX01EKSwKICAgIHB1c2hpbnQgMTkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1MAogICAgLy8gVUludDY0KGVudW1zLkVWVF9SUiksCiAgICBwdXNoaW50IDEyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTEKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIHB1c2hpbnQgMTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDcKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDY6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTYKICAgIC8vIHJldHVybiBUcnVlCiAgICBpbnRjXzEgLy8gMQoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIHJldHN1YgoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1OC0yNTkKICAgIC8vICMgQ29udHJhY3Qtc3BlY2lmaWMgYWRkaXRpb25hbCBldmVudHMKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX1BBTSk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNjAtMjYxCiAgICAvLyAjIFBBTSBvbmx5IHN1cHBvcnRzIGNvbW1vbiBldmVudHMKICAgIC8vIHJldHVybiBGYWxzZQogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2MwogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfTEFNKSBvciBjb250cmFjdF90eXBlID09IFVJbnQ2NCgKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAzCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjYzLTI2NQogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfTEFNKSBvciBjb250cmFjdF90eXBlID09IFVJbnQ2NCgKICAgIC8vICAgICBlbnVtcy5DVF9OQU0KICAgIC8vICk6CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlAMTEKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAyCiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMTYKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDExOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjY2LTI3MAogICAgLy8gIyBMQU0vTkFNIGFkZDogUFIsIElQQ0IKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNjgKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNjYtMjcwCiAgICAvLyAjIExBTS9OQU0gYWRkOiBQUiwgSVBDQgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMTMKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjY5CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgcHVzaGludCAxOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjY2LTI3MAogICAgLy8gIyBMQU0vTkFNIGFkZDogUFIsIElQQ0IKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gKQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDE0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDEzOgogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMTQ6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAxNjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3MgogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKToKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAyMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjczLTI3OAogICAgLy8gIyBBTk4gYWRkczogUFIsIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzUKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzMtMjc4CiAgICAvLyAjIEFOTiBhZGRzOiBQUiwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjAKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjc2CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgcHVzaGludCAxOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjczLTI3OAogICAgLy8gIyBBTk4gYWRkczogUFIsIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDIwCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3NwogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzMtMjc4CiAgICAvLyAjIEFOTiBhZGRzOiBQUiwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMjEKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjA6CiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF9mYWxzZUAyMToKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDIzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjgwCiAgICAvLyBpZiBjb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9MQVgpOgogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDQKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAzMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjgxLTI4NwogICAgLy8gIyBMQVggYWRkczogUFIsIFBJLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjgzCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjgxLTI4NwogICAgLy8gIyBMQVggYWRkczogUFIsIFBJLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyOAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODQKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgcHVzaGludCA0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODEtMjg3CiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDI4CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4NQogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIHB1c2hpbnQgMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MS0yODcKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjgKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjg2CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICBwdXNoaW50IDUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MS0yODcKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMjkKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjg6CiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF9mYWxzZUAyOToKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDMxOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjg5CiAgICAvLyBpZiBjb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9DTE0pOgogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDUKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAzMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjkwLTI5MQogICAgLy8gIyBDTE0gYWRkczogUFIKICAgIC8vIHJldHVybiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMzM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyOTMKICAgIC8vIHJldHVybiBGYWxzZQogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9pc19keW5hbWljX2FubnVpdHkoKSAtPiB1aW50NjQ6Cl9pc19keW5hbWljX2FubnVpdHk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzUKICAgIC8vIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMzNS0zMzYKICAgIC8vIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKQogICAgLy8gYW5kIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgYnogX2lzX2R5bmFtaWNfYW5udWl0eV9ib29sX2ZhbHNlQDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMzNgogICAgLy8gYW5kIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDM0IC8vICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24gZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzUtMzM2CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIC8vIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGJ6IF9pc19keW5hbWljX2FubnVpdHlfYm9vbF9mYWxzZUAzCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM0LTMzNwogICAgLy8gcmV0dXJuICgKICAgIC8vICAgICBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIC8vICAgICBhbmQgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICAvLyApCiAgICByZXRzdWIKCl9pc19keW5hbWljX2FubnVpdHlfYm9vbF9mYWxzZUAzOgogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMzNC0zMzcKICAgIC8vIHJldHVybiAoCiAgICAvLyAgICAgc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICAvLyAgICAgYW5kIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgLy8gKQogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnk6IGJ5dGVzKSAtPiB1aW50NjQsIGJ5dGVzOgpfZW50cnlfaW50ZXJlc3Rfc2VnbWVudDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM4MAogICAgLy8gZGVmIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KHNlbGYsIGVudHJ5OiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSkgLT4gVUludDY0OgogICAgcHJvdG8gMSAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozODkKICAgIC8vIGVudHJ5LmFjY3J1YWxfZmFjdG9yID09IFVJbnQ2NCgwKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDE3CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozODktMzkxCiAgICAvLyBlbnRyeS5hY2NydWFsX2ZhY3RvciA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID09IFVJbnQ2NCgwKQogICAgLy8gb3Igc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID09IFVJbnQ2NCgwKQogICAgYnogX2VudHJ5X2ludGVyZXN0X3NlZ21lbnRfaWZfYm9keUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozOTAKICAgIC8vIG9yIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID09IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozODktMzkxCiAgICAvLyBlbnRyeS5hY2NydWFsX2ZhY3RvciA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID09IFVJbnQ2NCgwKQogICAgLy8gb3Igc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID09IFVJbnQ2NCgwKQogICAgYnogX2VudHJ5X2ludGVyZXN0X3NlZ21lbnRfaWZfYm9keUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozOTEKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozODktMzkxCiAgICAvLyBlbnRyeS5hY2NydWFsX2ZhY3RvciA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID09IFVJbnQ2NCgwKQogICAgLy8gb3Igc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID09IFVJbnQ2NCgwKQogICAgYm56IF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2FmdGVyX2lmX2Vsc2VANAoKX2VudHJ5X2ludGVyZXN0X3NlZ21lbnRfaWZfYm9keUAzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzkzCiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfZGlnIC0xCiAgICB1bmNvdmVyIDIKICAgIHJldHN1YgoKX2VudHJ5X2ludGVyZXN0X3NlZ21lbnRfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzk1CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzk2CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzk3CiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzk0LTM5OAogICAgLy8gYWNjcnVlZCA9IHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSwKICAgIC8vICAgICBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQwMgogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5OS00MDMKICAgIC8vIHJldHVybiBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBhY2NydWVkLAogICAgLy8gICAgIGVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMAogICAgc3dhcAogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIGZyYW1lX2RpZyAtMQogICAgdW5jb3ZlciAyCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZGlzY291bnRfYW5udWl0eV9mYWN0b3IoZGlzY291bnRfZmFjdG9yOiB1aW50NjQsIHJlZGVtcHRpb25fZmFjdG9yOiB1aW50NjQpIC0+IHVpbnQ2NDoKX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDYyLTQ2NgogICAgLy8gZGVmIF9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcigKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgIGRpc2NvdW50X2ZhY3RvcjogVUludDY0LAogICAgLy8gICAgIHJlZGVtcHRpb25fZmFjdG9yOiBVSW50NjQsCiAgICAvLyApIC0+IFVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDY4CiAgICAvLyBpZiByZWRlbXB0aW9uX2ZhY3RvciA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGJueiBfZGlzY291bnRfYW5udWl0eV9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NjkKICAgIC8vIHJldHVybiBkaXNjb3VudF9mYWN0b3IKICAgIGZyYW1lX2RpZyAtMgogICAgcmV0c3ViCgpfZGlzY291bnRfYW5udWl0eV9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDcwCiAgICAvLyBwZXJpb2RfcmF0ZSA9IHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgKyBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3MQogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3MC00NzQKICAgIC8vIHBlcmlvZF9yYXRlID0gc2VsZi5maXhlZF9wb2ludF9zY2FsZSArIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIHJlZGVtcHRpb25fZmFjdG9yLAogICAgLy8gICAgIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgKwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDc1CiAgICAvLyBhc3NlcnQgcGVyaW9kX3JhdGUgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZHVwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzgKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzYtNDgwCiAgICAvLyByZXR1cm4gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgZGlzY291bnRfZmFjdG9yLAogICAgLy8gICAgIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICAvLyAgICAgcGVyaW9kX3JhdGUsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeShlbnRyeTogYnl0ZXMsIHBheWxvYWQ6IGJ5dGVzKSAtPiBieXRlcywgYnl0ZXM6Cl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYxMy02MTUKICAgIC8vIGRlZiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkoCiAgICAvLyAgICAgc2VsZiwgZW50cnk6IHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5LCBwYXlsb2FkOiB0eXAuT2JzZXJ2ZWRFdmVudFJlcXVlc3QKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDIgMgogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MjMKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF9pZCA9PSBzZWxmLmV2ZW50X2N1cnNvciwgZXJyLklOVkFMSURfRVZFTlRfQ1VSU09SCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgY3Vyc29yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MjQKICAgIC8vIGFzc2VydCBlbnRyeS5zY2hlZHVsZWRfdGltZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwgZXJyLk5PX0RVRV9DQVNIRkxPVwogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA8PQogICAgYXNzZXJ0IC8vIE5vIGR1ZSBjYXNoZmxvdyB0byBwYXkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYyNgogICAgLy8gZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjI3CiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfSUVEKToKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgZHVwCiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjI4LTYzMAogICAgLy8gIyBJRUQgZmluYWxpemVzIGlzc3VhbmNlOiByZXNlcnZlZCB1bml0cyBiZWNvbWUgYWN0aXZhdGFibGUgYW5kIHRoZQogICAgLy8gIyBzY2hlZHVsZSdzIGluaXRpYWwgY29udHJhY3R1YWwgc3RhdGUgYmVjb21lcyBsaXZlLgogICAgLy8gYXNzZXJ0IHNlbGYuX3N0YXR1c19pc19wZW5kaW5nX2llZCgpLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYzMgogICAgLy8gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCA9PSBzZWxmLnRvdGFsX3VuaXRzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzEtNjMzCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPT0gc2VsZi50b3RhbF91bml0cwogICAgLy8gKSwgZXJyLlBSSU1BUllfRElTVFJJQlVUSU9OX0lOQ09NUExFVEUKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBub3QgY29tcGxldGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYzNAogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzUKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYzNgogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPSBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZQogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYzNwogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ID0gVUludDY0KDApCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzgKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IGVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA0MQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYzOQogICAgLy8gc2VsZi5ldmVudF9jdXJzb3IgKz0gVUludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjQwCiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbnVtcy5TVEFUVVNfQUNUSVZFKQogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgcHVzaGludCAxMDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NTEKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwgZXJyLk5PVF9FVlRfSUVECiAgICBmcmFtZV9kaWcgMTEKICAgIGFzc2VydCAvLyBOb3QgSUVEIGV2ZW50CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NTIKICAgIC8vIHJldHVybiBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjQxLTY0NQogICAgLy8gc2VsZi5fZW1pdF9leGVjdXRpb25fZXZlbnQoCiAgICAvLyAgICAgZW50cnk9ZW50cnksCiAgICAvLyAgICAgcGF5b2ZmPXNlbGYuX2VudHJ5X2llZF9hbW91bnQoZW50cnkpLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjQ0CiAgICAvLyBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjQxLTY0NQogICAgLy8gc2VsZi5fZW1pdF9leGVjdXRpb25fZXZlbnQoCiAgICAvLyAgICAgZW50cnk9ZW50cnksCiAgICAvLyAgICAgcGF5b2ZmPXNlbGYuX2VudHJ5X2llZF9hbW91bnQoZW50cnkpLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGNhbGxzdWIgX2VtaXRfZXhlY3V0aW9uX2V2ZW50CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgLTIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0NgogICAgLy8gcmV0dXJuCiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2J1cnkgMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQ3CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuX3N0YXR1c19pc19wZW5kaW5nX2llZCgpLCBlcnIuUEVORElOR19JRUQKICAgICEKICAgIGFzc2VydCAvLyBJRUQgbm90IHlldCBleGVjdXRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjQ5CiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgKz0gc2VsZi5fZW50cnlfaW50ZXJlc3Rfc2VnbWVudChlbnRyeSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQKICAgIGZyYW1lX2J1cnkgLTIKICAgICsKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjUxCiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUlIpOgogICAgZnJhbWVfZGlnIDEwCiAgICBwdXNoaW50IDEyCiAgICA9PQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAxMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjU1CiAgICAvLyBwYXlsb2FkLm9ic2VydmVkX3JhdGUsCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NTYKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9tdWx0aXBsaWVyLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDM2IC8vICJyYXRlX3Jlc2V0X211bHRpcGxpZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9tdWx0aXBsaWVyIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjU3CiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjUyLTY1OAogICAgLy8gIyBSUiBkZXJpdmVzIHRoZSBuZXh0IHJhdGUgZnJvbSBhbiBvYnNlcnZlZCBvcmFjbGUgdmFsdWUgcGx1cyB0aGUKICAgIC8vICMgY29udHJhY3Qgc3ByZWFkIC8gbXVsdGlwbGllciB0ZXJtcywgdGhlbiBlbmZvcmNlcyBmbG9vciBhbmQgY2FwLgogICAgLy8gb2JzZXJ2ZWRfcmF0ZSA9IHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIHBheWxvYWQub2JzZXJ2ZWRfcmF0ZSwKICAgIC8vICAgICBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2MAogICAgLy8gb2JzZXJ2ZWRfcmF0ZSArIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzNSAvLyAicmF0ZV9yZXNldF9zcHJlYWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQgZXhpc3RzCiAgICArCiAgICBmcmFtZV9idXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjczNAogICAgLy8gaWYgc2VsZi5oYXNfcmF0ZV9yZXNldF9mbG9vciBhbmQgcmF0ZSA8IHNlbGYucmF0ZV9yZXNldF9mbG9vcjoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzOCAvLyAiaGFzX3JhdGVfcmVzZXRfZmxvb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgZXhpc3RzCiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1NQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI5IC8vICJyYXRlX3Jlc2V0X2Zsb29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfZmxvb3IgZXhpc3RzCiAgICBmcmFtZV9kaWcgNgogICAgPgogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjczNQogICAgLy8gcmF0ZSA9IHNlbGYucmF0ZV9yZXNldF9mbG9vcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI5IC8vICJyYXRlX3Jlc2V0X2Zsb29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgNgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9mbG9vciBleGlzdHMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzM2CiAgICAvLyBpZiBzZWxmLmhhc19yYXRlX3Jlc2V0X2NhcCBhbmQgcmF0ZSA+IHNlbGYucmF0ZV9yZXNldF9jYXA6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzkgLy8gImhhc19yYXRlX3Jlc2V0X2NhcCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgZXhpc3RzCiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1OAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDMwIC8vICJyYXRlX3Jlc2V0X2NhcCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X2NhcCBleGlzdHMKICAgIGZyYW1lX2RpZyA2CiAgICA8CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1OAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzM3CiAgICAvLyByYXRlID0gc2VsZi5yYXRlX3Jlc2V0X2NhcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDMwIC8vICJyYXRlX3Jlc2V0X2NhcCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDYKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfY2FwIGV4aXN0cwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NTkKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gc2VsZi5fY2xhbXBfcmF0ZSgKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1OS02NjEKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gc2VsZi5fY2xhbXBfcmF0ZSgKICAgIC8vICAgICBvYnNlcnZlZF9yYXRlICsgc2VsZi5yYXRlX3Jlc2V0X3NwcmVhZAogICAgLy8gKQogICAgZnJhbWVfZGlnIDYKICAgIGFwcF9nbG9iYWxfcHV0CgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAxODoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY3MQogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1BJKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCA0CiAgICA9PQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAyMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjcyCiAgICAvLyBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9IGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY3MwogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMjM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzgKICAgIC8vIGlmIHNlbGYuX2lzX2R5bmFtaWNfYW5udWl0eSgpOgogICAgY2FsbHN1YiBfaXNfZHluYW1pY19hbm51aXR5CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDI5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzkKICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QUkYpOgogICAgZnJhbWVfZGlnIDEwCiAgICBwdXNoaW50IDUKICAgID09CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAzMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDkwCiAgICAvLyBkaXNjb3VudF9mYWN0b3IgPSBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5MQogICAgLy8gZGVub21pbmF0b3IgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5MgogICAgLy8gc2tpcF9maXJzdF9yZWRlbXB0aW9uID0gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5NAogICAgLy8gaWYgZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAyNQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgZnJhbWVfYnVyeSA4CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAzNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDk1LTQ5OQogICAgLy8gIyBBbiBpbml0aWFsIFBSRiBtYXkgZGVzY3JpYmUgdGhlIGZpcnN0IHJlZGVtcHRpb24gcGVyaW9kIGRpcmVjdGx5LgogICAgLy8gZGlzY291bnRfZmFjdG9yID0gc2VsZi5fZGlzY291bnRfYW5udWl0eV9mYWN0b3IoCiAgICAvLyAgICAgZGlzY291bnRfZmFjdG9yLAogICAgLy8gICAgIGVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDgKICAgIGNhbGxzdWIgX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTAxCiAgICAvLyBza2lwX2ZpcnN0X3JlZGVtcHRpb24gPSBUcnVlCiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfYnVyeSA3CiAgICBmcmFtZV9idXJ5IDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDM1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTAzCiAgICAvLyBmdXR1cmVfZXZlbnRfaWQgPSBzZWxmLmV2ZW50X2N1cnNvciArIFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfd2hpbGVfdG9wQDM2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA0CiAgICAvLyB3aGlsZSBmdXR1cmVfZXZlbnRfaWQgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgZnJhbWVfZGlnIDMKICAgID4KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl93aGlsZUA0OAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA1CiAgICAvLyBmdXR1cmVfZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoZnV0dXJlX2V2ZW50X2lkKQogICAgZnJhbWVfZGlnIDMKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwNgogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPSBmdXR1cmVfZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MDctNTA4CiAgICAvLyAjIE9ubHkgcmVkZW1wdGlvbi1iZWFyaW5nIGV2ZW50cyBjb250cmlidXRlIHRvIHRoZSBhbm51aXR5IGRlbm9taW5hdG9yLgogICAgLy8gaXNfcmVkZW1wdGlvbl9ldmVudCA9IGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpIG9yICgKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwNy01MTEKICAgIC8vICMgT25seSByZWRlbXB0aW9uLWJlYXJpbmcgZXZlbnRzIGNvbnRyaWJ1dGUgdG8gdGhlIGFubnVpdHkgZGVub21pbmF0b3IuCiAgICAvLyBpc19yZWRlbXB0aW9uX2V2ZW50ID0gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QUikgb3IgKAogICAgLy8gICAgIGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfTUQpCiAgICAvLyAgICAgYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICAvLyApCiAgICBibnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfdHJ1ZUA0MAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA5CiAgICAvLyBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgZnJhbWVfZGlnIDQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MDktNTEwCiAgICAvLyBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgLy8gYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF9mYWxzZUA0MQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTEwCiAgICAvLyBhbmQgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IgPiBVSW50NjQoMCkKICAgIGZyYW1lX2RpZyAwCiAgICBwdXNoaW50IDI1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA5LTUxMAogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCkKICAgIC8vIGFuZCBmdXR1cmVfZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX3RydWVANDA6CiAgICBpbnRjXzEgLy8gMQoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfbWVyZ2VANDI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTIKICAgIC8vIGlmIGlzX3JlZGVtcHRpb25fZXZlbnQ6CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA0NwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTEzCiAgICAvLyBpZiBza2lwX2ZpcnN0X3JlZGVtcHRpb246CiAgICBmcmFtZV9kaWcgNwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUA0NQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTE0CiAgICAvLyBza2lwX2ZpcnN0X3JlZGVtcHRpb24gPSBGYWxzZQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgNwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANDc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjEKICAgIC8vIGZ1dHVyZV9ldmVudF9pZCArPSBVSW50NjQoMSkKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV93aGlsZV90b3BAMzYKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlANDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTgKICAgIC8vIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZnJhbWVfZGlnIDAKICAgIHB1c2hpbnQgMjUKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTYtNTE5CiAgICAvLyBkaXNjb3VudF9mYWN0b3IgPSBzZWxmLl9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcigKICAgIC8vICAgICBkaXNjb3VudF9mYWN0b3IsCiAgICAvLyAgICAgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMgogICAgc3dhcAogICAgY2FsbHN1YiBfZGlzY291bnRfYW5udWl0eV9mYWN0b3IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjAKICAgIC8vIGRlbm9taW5hdG9yICs9IGRpc2NvdW50X2ZhY3RvcgogICAgZnJhbWVfZGlnIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA0NwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDE6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF9tZXJnZUA0MgoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX3doaWxlQDQ4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTIzCiAgICAvLyBhc3NlcnQgZGVub21pbmF0b3IgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZnJhbWVfZGlnIDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUyNAogICAgLy8gbnVtZXJhdG9yID0gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTI1CiAgICAvLyBpZiBlbnRyeS5mbGFncyAmIFVJbnQ2NChlbnVtcy5GTEFHX0lOSVRJQUxfUFJGKSA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNTcKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gOAogICAgJgogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDUwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjYtNTI3CiAgICAvLyAjIFN1YnNlcXVlbnQgUFJGIGV2ZW50cyBhbW9ydGl6ZSBib3RoIHByaW5jaXBhbCBhbmQgYWxyZWFkeSBhY2NydWVkIGNhcnJ5LgogICAgLy8gbnVtZXJhdG9yICs9IHNlbGYuYWNjcnVlZF9pbnRlcmVzdAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgICsKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDUwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTMwCiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTI4LTUzMgogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIG51bWVyYXRvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gICAgIGRlbm9taW5hdG9yLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDEKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODAKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IHNlbGYuX3JlY2FsY3VsYXRlX2FubnVpdHlfcGF5bWVudCgKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjgwLTY4MgogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gc2VsZi5fcmVjYWxjdWxhdGVfYW5udWl0eV9wYXltZW50KAogICAgLy8gICAgIGVudHJ5CiAgICAvLyApCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMzA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODUKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4Ni02OTAKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1VSW50NjQoMCksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODgKICAgIC8vIHBheW9mZj1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njg5CiAgICAvLyBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4Ni02OTAKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1VSW50NjQoMCksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgY2FsbHN1YiBfZW1pdF9leGVjdXRpb25fZXZlbnQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDI5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njg0CiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDMwCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDIwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc0CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9JUENCKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCAxOAogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDIzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzUtNjc2CiAgICAvLyAjIElQQ0Iga2VlcHMgcHJpbmNpcGFsIHVuY2hhbmdlZCBhbmQgb25seSByZXNldHMgdGhlIGludGVyZXN0IGJhc2UuCiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIGIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMjMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMTA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjIKICAgIC8vIGVsaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1JSRik6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgMTEKICAgID09CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDE0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjMKICAgIC8vIG5leHRfcmF0ZSA9IGVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY0CiAgICAvLyBpZiBuZXh0X3JhdGUgPT0gVUludDY0KDApOgogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDEzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjUKICAgIC8vIG5leHRfcmF0ZSA9IHNlbGYucmF0ZV9yZXNldF9uZXh0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzcgLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDUKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfbmV4dCBleGlzdHMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY2CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IG5leHRfcmF0ZQogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgZnJhbWVfZGlnIDUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDE0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY4CiAgICAvLyBpZiBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSAhPSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgOQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2OQogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPSBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZQogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgZnJhbWVfZGlnIDkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KGVudHJ5OiBieXRlcywgcGF5b2ZmOiB1aW50NjQsIHNldHRsZWRfYW1vdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpfZW1pdF9leGVjdXRpb25fZXZlbnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OTYtNzAyCiAgICAvLyBkZWYgX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgKiwKICAgIC8vICAgICBlbnRyeTogdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnksCiAgICAvLyAgICAgcGF5b2ZmOiBVSW50NjQsCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ6IFVJbnQ2NCwKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDMgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzA2CiAgICAvLyBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25JRAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzA3CiAgICAvLyBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIGZyYW1lX2RpZyAtMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MDgKICAgIC8vIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIGZyYW1lX2RpZyAtMwogICAgZXh0cmFjdCA4IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcwOQogICAgLy8gc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICBmcmFtZV9kaWcgLTMKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTAKICAgIC8vIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTMKICAgIC8vIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIGZyYW1lX2RpZyAtMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzA4CiAgICAvLyBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICBpbnRjXzIgLy8gOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzEzCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBnZXRieXRlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDIKICAgIC8vIGlmIHBheW9mZiA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJueiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDMKICAgIC8vIHJldHVybiBVSW50NjQoZW51bXMuUEFZT0ZGX1NJR05fUE9TSVRJVkUpCiAgICBpbnRjXzEgLy8gMQoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX3BheW9mZl9zaWduQDc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTItNzE0CiAgICAvLyBwYXlvZmZfc2lnbj1hcmM0LlVJbnQ4KAogICAgLy8gICAgIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIC8vICksCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgaW50Y18yIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTYKICAgIC8vIGN1cnJlbmN5X2lkPXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE3CiAgICAvLyBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MDUtNzE4CiAgICAvLyBFeGVjdXRpb25FdmVudCgKICAgIC8vICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIC8vICAgICBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYXBwbGllZF9hdD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICBwYXlvZmY9cGF5b2ZmLAogICAgLy8gICAgIHBheW9mZl9zaWduPWFyYzQuVUludDgoCiAgICAvLyAgICAgICAgIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIC8vICAgICApLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PXNldHRsZWRfYW1vdW50LAogICAgLy8gICAgIGN1cnJlbmN5X2lkPXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAwCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzA0LTcxOQogICAgLy8gYXJjNC5lbWl0KAogICAgLy8gICAgIEV4ZWN1dGlvbkV2ZW50KAogICAgLy8gICAgICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgICAgIHBheW9mZj1wYXlvZmYsCiAgICAvLyAgICAgICAgIHBheW9mZl9zaWduPWFyYzQuVUludDgoCiAgICAvLyAgICAgICAgICAgICBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICAvLyAgICAgICAgICksCiAgICAvLyAgICAgICAgIHNldHRsZWRfYW1vdW50PXNldHRsZWRfYW1vdW50LAogICAgLy8gICAgICAgICBjdXJyZW5jeV9pZD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgICAgIHNlcXVlbmNlPWVudHJ5LmV2ZW50X2lkICsgVUludDY0KDEpLAogICAgLy8gICAgICkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDlhMzMyYjk1IC8vIG1ldGhvZCAiRXhlY3V0aW9uRXZlbnQodWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc0NAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiAoVUludDY0KGVudW1zLkVWVF9JRUQpLCBVSW50NjQoZW51bXMuRVZUX1BJKSk6CiAgICBmcmFtZV9kaWcgNQogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBibnogX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2lmX2JvZHlANQogICAgZnJhbWVfZGlnIDUKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGJ6IF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pZl9lbHNlQDYKCl9lbWl0X2V4ZWN1dGlvbl9ldmVudF9pZl9ib2R5QDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDUKICAgIC8vIHJldHVybiBVSW50NjQoZW51bXMuUEFZT0ZGX1NJR05fUE9TSVRJVkUpCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzEzCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBiIF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9wYXlvZmZfc2lnbkA3CgpfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzQ2CiAgICAvLyByZXR1cm4gVUludDY0KGVudW1zLlBBWU9GRl9TSUdOX05FR0FUSVZFKQogICAgcHVzaGludCAyNTUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxMwogICAgLy8gc2VsZi5fcGF5b2ZmX3NpZ24oZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSwgcGF5b2ZmKQogICAgYiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fcGF5b2ZmX3NpZ25ANwoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9yb2xlX2lzX2FjdGl2ZShyb2xlX21hcDogYnl0ZXMsIHJvbGVfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NDoKX3JvbGVfaXNfYWN0aXZlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU3CiAgICAvLyBkZWYgX3JvbGVfaXNfYWN0aXZlKHNlbGYsIHJvbGVfbWFwOiB0eXAuUmJhY1JvbGUsIHJvbGVfYWRkcmVzczogQWNjb3VudCkgLT4gYm9vbDoKICAgIHByb3RvIDIgMQogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5CiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5LTYwCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5LTYxCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjEKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAtNjEKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgPj0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX21lcmdlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKSAtPiB2b2lkOgpfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2NQogICAgLy8gYXNzZXJ0IHNlbGYuX2lzX2FycmFuZ2VyKFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTIKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgPT0gc2VsZi5hcnJhbmdlci52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE4IC8vIDB4NTIyMzQxNzI3MjYxNmU2NzY1NzIyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgPT0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2NQogICAgLy8gYXNzZXJ0IHNlbGYuX2lzX2FycmFuZ2VyKFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpIC0+IHZvaWQ6Cl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4MwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFzc2V0X2RlZmF1bHRlZCwgZXJyLkRFRkFVTFRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQxIC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfZGVmYXVsdGVkIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIERlZmF1bHRlZAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkgLT4gdm9pZDoKX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg2CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYXNzZXRfc3VzcGVuZGVkLCBlcnIuU1VTUEVOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzMgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9zdXNwZW5kZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gU3VzcGVuZGVkIG9wZXJhdGlvbnMKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkOiB1aW50NjQpIC0+IHZvaWQ6Cl9hc3NlcnRfdmFsaWRfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OAogICAgLy8gZGVmIF9hc3NlcnRfdmFsaWRfcm9sZShzZWxmLCByb2xlX2lkOiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTAKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIHB1c2hpbnQgMjAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkxCiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgcHVzaGludCAyNQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTIKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICBwdXNoaW50IDQwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MwogICAgLy8gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgcHVzaGludCA1MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTQKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgcHVzaGludCA2MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTUKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICBwdXNoaW50IDcwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NgogICAgLy8gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgcHVzaGludCA4MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfZmFsc2VAOAoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3OgogICAgaW50Y18xIC8vIDEKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX21lcmdlQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgcmV0c3ViCgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9mYWxzZUA4OgogICAgaW50Y18wIC8vIDAKICAgIGIgX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfbWVyZ2VAOQo=", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCAzMgogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1ICJzdGF0dXMiICJldmVudF9jdXJzb3IiICJvdXRzdGFuZGluZ19wcmluY2lwYWwiICJzY2hlZHVsZV9lbnRyeV9jb3VudCIgImZpeGVkX3BvaW50X3NjYWxlIiAiYWNjcnVlZF9pbnRlcmVzdCIgImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMgIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIgInJlc2VydmVkX3VuaXRzX3RvdGFsIiAicmVzZXJ2ZWRfcHJpbmNpcGFsIiAiY29udHJhY3RfdHlwZSIgInRvdGFsX3VuaXRzIiAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIgInJlc2VydmVkX2ludGVyZXN0IiAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIgImN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IiAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMgInNldHRsZW1lbnRfYXNzZXRfaWQiICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIgMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMgMHg1MjIzNTA3MjY5NmQ2MTcyNzk0NDY1NjE2YzY1NzIyMyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMgMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzIDB4NTIyMzRmNzA0NDYxNjU2ZDZmNmUyMyAiaW5pdGlhbF9leGNoYW5nZV9kYXRlIiAidHJhbnNmZXJfb3BlbmluZ19kYXRlIiAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIiAicmF0ZV9yZXNldF9mbG9vciIgInJhdGVfcmVzZXRfY2FwIiAweDUzMjMgMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMyAiYXNzZXRfc3VzcGVuZGVkIiAiZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiIgInJhdGVfcmVzZXRfc3ByZWFkIiAicmF0ZV9yZXNldF9tdWx0aXBsaWVyIiAicmF0ZV9yZXNldF9uZXh0IiAiaGFzX3JhdGVfcmVzZXRfZmxvb3IiICJoYXNfcmF0ZV9yZXNldF9jYXAiIDB4MDAgImFzc2V0X2RlZmF1bHRlZCIgInByb3NwZWN0dXNfaGFzaCIgInByb3NwZWN0dXNfdXJsIiAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIiAibWF0dXJpdHlfZGF0ZSIgImRheV9jb3VudF9jb252ZW50aW9uIiAweDA2ODEwMQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4LTI5CiAgICAvLyAjIFJCQUMgUm9sZXMKICAgIC8vIHNlbGYuYXJyYW5nZXIgPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX0FSUkFOR0VSKQogICAgYnl0ZWMgMTggLy8gMHg1MjIzNDE3MjcyNjE2ZTY3NjU3MjIzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzAKICAgIC8vIHNlbGYub3BfZGFlbW9uID0gR2xvYmFsU3RhdGUoQWNjb3VudCgpLCBrZXk9Y3N0LlBSRUZJWF9JRF9PUF9EQUVNT04pCiAgICBieXRlYyAyNSAvLyAweDUyMjM0ZjcwNDQ2MTY1NmQ2ZjZlMjMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo0Ny00OAogICAgLy8gIyBELUFTQSBHb3Zlcm5hbmNlCiAgICAvLyBzZWxmLmFzc2V0X3N1c3BlbmRlZCA9IEZhbHNlCiAgICBieXRlYyAzMyAvLyAiYXNzZXRfc3VzcGVuZGVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NDkKICAgIC8vIHNlbGYuYXNzZXRfZGVmYXVsdGVkID0gRmFsc2UKICAgIGJ5dGVjIDQxIC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU2LTU3CiAgICAvLyAjIENvbnRyYWN0CiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMTIgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwLTYxCiAgICAvLyAjIFByb3NwZWN0dXMgKEluZm9ybWF0aW9uYWwpCiAgICAvLyBzZWxmLnByb3NwZWN0dXNfaGFzaCA9IEJ5dGVzKCkKICAgIGJ5dGVjIDQyIC8vICJwcm9zcGVjdHVzX2hhc2giCiAgICBwdXNoYnl0ZXMgMHgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MgogICAgLy8gc2VsZi5wcm9zcGVjdHVzX3VybCA9IFN0cmluZygpCiAgICBieXRlYyA0MyAvLyAicHJvc3BlY3R1c191cmwiCiAgICBwdXNoYnl0ZXMgIiIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NC02NQogICAgLy8gIyBEZW5vbWluYXRpb24KICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gQXNzZXQoKQogICAgYnl0ZWMgNDQgLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjYKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCA9IEFzc2V0KCkKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OC02OQogICAgLy8gIyBUaW1lCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgMjYgLy8gImluaXRpYWxfZXhjaGFuZ2VfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzAKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgNDUgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxCiAgICAvLyBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgMjcgLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIKICAgIC8vIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlID0gdHlwLlRpbWVTdGFtcCgpCiAgICBieXRlYyAyOCAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NC03NQogICAgLy8gIyBEYXkgQ291bnQgQ29udmVudGlvbgogICAgLy8gc2VsZi5kYXlfY291bnRfY29udmVudGlvbiA9IFVJbnQ2NCgpCiAgICBieXRlYyA0NiAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc3LTc4CiAgICAvLyAjIFVuaXRzCiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzID0gVUludDY0KCkKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPSBVSW50NjQoKQogICAgYnl0ZWMgMTAgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MS04MgogICAgLy8gIyBQcmluY2lwYWwKICAgIC8vIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPSBVSW50NjQoKQogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MwogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBVSW50NjQoKQogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NAogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gVUludDY0KCkKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NQogICAgLy8gc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gRmFsc2UKICAgIGJ5dGVjIDM0IC8vICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4Ny04OAogICAgLy8gIyBJbnRlcmVzdAogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gVUludDY0KCkKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg5CiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgPSBVSW50NjQoKQogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTEtOTIKICAgIC8vICMgSW50ZXJlc3QgUmF0ZXMKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTMKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQgPSBVSW50NjQoKQogICAgYnl0ZWMgMzUgLy8gInJhdGVfcmVzZXRfc3ByZWFkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NAogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIgPSBVSW50NjQoKQogICAgYnl0ZWMgMzYgLy8gInJhdGVfcmVzZXRfbXVsdGlwbGllciIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTUKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9mbG9vciA9IFVJbnQ2NCgpCiAgICBieXRlYyAyOSAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTYKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9jYXAgPSBVSW50NjQoKQogICAgYnl0ZWMgMzAgLy8gInJhdGVfcmVzZXRfY2FwIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NwogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X25leHQgPSBVSW50NjQoKQogICAgYnl0ZWMgMzcgLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTgKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgPSBGYWxzZQogICAgYnl0ZWMgMzggLy8gImhhc19yYXRlX3Jlc2V0X2Zsb29yIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OQogICAgLy8gc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgPSBGYWxzZQogICAgYnl0ZWMgMzkgLy8gImhhc19yYXRlX3Jlc2V0X2NhcCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAxLTEwMgogICAgLy8gIyBQcmltYXJ5IERpc3RyaWJ1dGlvbgogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgPSBVSW50NjQoKQogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAzCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0ID0gVUludDY0KCkKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA1LTEwNgogICAgLy8gIyBDdW11bGF0aXZlIFBlci1Vbml0IEZpeGVkLVBvaW50IEluZGV4ZXMKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4ID0gVUludDY0KCkKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1CiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciA9IFVJbnQ2NCgpCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNgogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA9IFVJbnQ2NCgpCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE4LTExOQogICAgLy8gIyBTY2FsaW5nCiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlID0gVUludDY0KCkKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6MjMKICAgIC8vIGFzc2VydCBUeG4uZ2xvYmFsX251bV9ieXRlX3NsaWNlID09IGNmZy5HTE9CQUxfQllURVMsIGVyci5XUk9OR19HTE9CQUxfQllURVMKICAgIHR4biBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgQnl0ZXMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjI0CiAgICAvLyBhc3NlcnQgVHhuLmdsb2JhbF9udW1fdWludCA9PSBjZmcuR0xPQkFMX1VJTlRTLCBlcnIuV1JPTkdfR0xPQkFMX1VJTlRTCiAgICB0eG4gR2xvYmFsTnVtVWludAogICAgcHVzaGludCAzNwogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgVUludHMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBhc3NlcnQgVHhuLmxvY2FsX251bV9ieXRlX3NsaWNlID09IGNmZy5MT0NBTF9CWVRFUywgZXJyLldST05HX0xPQ0FMX0JZVEVTCiAgICB0eG4gTG9jYWxOdW1CeXRlU2xpY2UKICAgICEKICAgIGFzc2VydCAvLyBXcm9uZyBMb2NhbCBCeXRlcyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6MjYKICAgIC8vIGFzc2VydCBUeG4ubG9jYWxfbnVtX3VpbnQgPT0gY2ZnLkxPQ0FMX1VJTlRTLCBlcnIuV1JPTkdfTE9DQUxfVUlOVFMKICAgIHR4biBMb2NhbE51bVVpbnQKICAgICEKICAgIGFzc2VydCAvLyBXcm9uZyBMb2NhbCBVSW50cyBhbGxvY2F0aW9uCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kX2FzYS9jb250cmFjdC5weTo4LTE4CiAgICAvLyBjbGFzcyBEQVNBKAogICAgLy8gICAgIFBheW1lbnRBZ2VudCwKICAgIC8vICAgICBUcmFuc2ZlckFnZW50LAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gICAgIGF2bV92ZXJzaW9uPTEyLAogICAgLy8gKToKICAgIHB1c2hieXRlcyAweDkxNGYwNGViIC8vIG1ldGhvZCAiY29udHJhY3RfdXBkYXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9jb250cmFjdF91cGRhdGVfcm91dGVANAoKbWFpbl9zd2l0Y2hfY2FzZV9uZXh0QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6OC0xOAogICAgLy8gY2xhc3MgREFTQSgKICAgIC8vICAgICBQYXltZW50QWdlbnQsCiAgICAvLyAgICAgVHJhbnNmZXJBZ2VudCwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBhdm1fdmVyc2lvbj0xMiwKICAgIC8vICk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBieiBtYWluX2NyZWF0ZV9Ob09wQDMxCiAgICBwdXNoYnl0ZXNzIDB4YjQ0NjE4YzggMHhlNzgzMjUyOSAweDk0Mzg4NzIzIDB4NmM4NWUzZWUgMHhiZGQxYTk0NCAweDdjMGYxODEyIDB4MTRmYzEwZWYgMHg3NGE3Mjk3ZiAweDA5ZDRmZTE0IDB4OWE5YmZhODUgMHg4NWVlZDMzZCAweGFiMmMwZmM0IDB4ZDlmMjI1YWMgMHg4ZWE2ZTc0YyAweDAyYWY1NTdhIDB4ODJmNzFiMmQgMHhlZjA0ZjVkMyAweGRmMzQzNTUwIDB4M2RiZTgwYmQgMHgxZTNlNDhlNyAweDAxMGM4Mjk5IDB4NzQwNmFjZDIgMHgxYTcyYTJlZSAvLyBtZXRob2QgImZ1bmRfZHVlX2Nhc2hmbG93cyh1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJjbGFpbV9kdWVfY2FzaGZsb3dzKGFkZHJlc3MsYnl0ZVtdKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYnl0ZVtdKSIsIG1ldGhvZCAidHJhbnNmZXJfc2V0X3NjaGVkdWxlKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbihhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInRyYW5zZmVyKGFkZHJlc3MsYWRkcmVzcyx1aW50NjQpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X3N1c3BlbnNpb24oYWRkcmVzcyxib29sKXVpbnQ2NCIsIG1ldGhvZCAiYWNjb3VudF9vcGVuKGFkZHJlc3MsYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgImFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzcyhhZGRyZXNzLGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X2dldF9wb3NpdGlvbihhZGRyZXNzKShhZGRyZXNzLHVpbnQ2NCx1aW50NjQsYm9vbCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAiY29udHJhY3RfY29uZmlnKCh1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxib29sLGJvb2wsYm9vbCx1aW50NjQpLCh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCksKGJ5dGVbMzJdLHN0cmluZykpdWludDY0IiwgbWV0aG9kICJjb250cmFjdF9zY2hlZHVsZSh1aW50NjQsYm9vbCwodWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NClbXSl1aW50NjQiLCBtZXRob2QgImNvbnRyYWN0X2V4ZWN1dGVfaWVkKCl1aW50NjQiLCBtZXRob2QgImFwcGx5X25vbl9jYXNoX2V2ZW50KHVpbnQ2NCwodWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIsIG1ldGhvZCAiY29udHJhY3RfZ2V0X3N0YXRlKCkodWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudCgpKHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJyYmFjX3JvdGF0ZV9hcnJhbmdlcihhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19zZXRfb3BfZGFlbW9uKGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX2Fzc2lnbl9yb2xlKHVpbnQ4LGFkZHJlc3MsKHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19yZXZva2Vfcm9sZSh1aW50OCxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19jb250cmFjdF9zdXNwZW5zaW9uKGJvb2wpdWludDY0IiwgbWV0aG9kICJyYmFjX2dldF9hcnJhbmdlcigpYWRkcmVzcyIsIG1ldGhvZCAicmJhY19nZXRfYWRkcmVzc19yb2xlcyhhZGRyZXNzKShib29sLGJvb2wsYm9vbCxib29sLGJvb2wpIiwgbWV0aG9kICJyYmFjX2dldF9yb2xlX3ZhbGlkaXR5KHVpbnQ4LGFkZHJlc3MpKHVpbnQ2NCx1aW50NjQpIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggZnVuZF9kdWVfY2FzaGZsb3dzIGNsYWltX2R1ZV9jYXNoZmxvd3MgdHJhbnNmZXJfc2V0X3NjaGVkdWxlIHByaW1hcnlfZGlzdHJpYnV0aW9uIHRyYW5zZmVyIGFjY291bnRfc3VzcGVuc2lvbiBhY2NvdW50X29wZW4gYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzIGFjY291bnRfZ2V0X3Bvc2l0aW9uIGNvbnRyYWN0X2NvbmZpZyBjb250cmFjdF9zY2hlZHVsZSBjb250cmFjdF9leGVjdXRlX2llZCBhcHBseV9ub25fY2FzaF9ldmVudCBjb250cmFjdF9nZXRfc3RhdGUgY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50IHJiYWNfcm90YXRlX2FycmFuZ2VyIHJiYWNfc2V0X29wX2RhZW1vbiByYmFjX2Fzc2lnbl9yb2xlIHJiYWNfcmV2b2tlX3JvbGUgcmJhY19jb250cmFjdF9zdXNwZW5zaW9uIHJiYWNfZ2V0X2FycmFuZ2VyIHJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXMgcmJhY19nZXRfcm9sZV92YWxpZGl0eQogICAgZXJyCgptYWluX2NyZWF0ZV9Ob09wQDMxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjgtMTgKICAgIC8vIGNsYXNzIERBU0EoCiAgICAvLyAgICAgUGF5bWVudEFnZW50LAogICAgLy8gICAgIFRyYW5zZmVyQWdlbnQsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyAgICAgYXZtX3ZlcnNpb249MTIsCiAgICAvLyApOgogICAgcHVzaGJ5dGVzIDB4OTU2ZDcxNTYgLy8gbWV0aG9kICJjb250cmFjdF9jcmVhdGUoYWRkcmVzcyl1aW50NjQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBjb250cmFjdF9jcmVhdGUKICAgIGVycgoKbWFpbl9jb250cmFjdF91cGRhdGVfcm91dGVANDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgNCAvLyBVcGRhdGVBcHBsaWNhdGlvbgogICAgPT0KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0CiAgICBiIGNvbnRyYWN0X3VwZGF0ZQoKCi8vIG1vZHVsZXMucGF5bWVudF9hZ2VudC5QYXltZW50QWdlbnQuZnVuZF9kdWVfY2FzaGZsb3dzW3JvdXRpbmddKCkgLT4gdm9pZDoKZnVuZF9kdWVfY2FzaGZsb3dzOgogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAxMAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQ2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NTAKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjUxCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjUyCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo1NQogICAgLy8gcHJvY2Vzc2VkX2V2ZW50cyA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo1Ni01NwogICAgLy8gZnVuZGVkX2ludGVyZXN0ID0gVUludDY0KDApCiAgICAvLyBmdW5kZWRfcHJpbmNpcGFsID0gVUludDY0KDApCiAgICBkdXBuIDIKCmZ1bmRfZHVlX2Nhc2hmbG93c193aGlsZV90b3BAMjoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2MAogICAgLy8gcHJvY2Vzc2VkX2V2ZW50cyA8IG1heF9ldmVudF9jb3VudAogICAgZGlnIDIKICAgIGRpZyA0CiAgICA8CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjAtNjEKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgPCBtYXhfZXZlbnRfY291bnQKICAgIC8vIGFuZCBzZWxmLmV2ZW50X2N1cnNvciA8IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQKICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl93aGlsZUA5CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjEKICAgIC8vIGFuZCBzZWxmLmV2ZW50X2N1cnNvciA8IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgPAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjYwLTYxCiAgICAvLyBwcm9jZXNzZWRfZXZlbnRzIDwgbWF4X2V2ZW50X2NvdW50CiAgICAvLyBhbmQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAOQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjYzCiAgICAvLyBlbnRyeSA9IHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLmV2ZW50X2N1cnNvcikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICBkdXAKICAgIGJ1cnkgMTcKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2NAogICAgLy8gaWYgZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcDoKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSA2CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDkKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2NgogICAgLy8gaWYgbm90IHNlbGYuX2V2ZW50X2lzX2Nhc2goZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSk6CiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ1cnkgMTYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM1MQogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUCksCiAgICBpbnRjXzIgLy8gOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzUwLTM1NAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfTUQpLAogICAgLy8gKQogICAgPT0KICAgIGR1cAogICAgYnVyeSA3CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfdHJ1ZUA1MAogICAgZGlnIDE0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNTIKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNTAtMzU0CiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9NRCksCiAgICAvLyApCiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX3RydWVANTAKICAgIGRpZyAxNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzUzCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX01EKSwKICAgIHB1c2hpbnQgMTkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM1MC0zNTQKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX01EKSwKICAgIC8vICkKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUA1MQoKZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfdHJ1ZUA1MDoKICAgIGludGNfMSAvLyAxCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUA1MjoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2NgogICAgLy8gaWYgbm90IHNlbGYuX2V2ZW50X2lzX2Nhc2goZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSk6CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAOQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTQ4CiAgICAvLyBhc3NlcnQgZW50cnkuZXZlbnRfaWQgPT0gc2VsZi5ldmVudF9jdXJzb3IsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgZGlnIDE1CiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGN1cnNvcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTQ5CiAgICAvLyBhc3NlcnQgZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsIGVyci5OT19EVUVfQ0FTSEZMT1cKICAgIGRpZyA0CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA8PQogICAgYXNzZXJ0IC8vIE5vIGR1ZSBjYXNoZmxvdyB0byBwYXkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQxMwogICAgLy8gaWYgZXZlbnRfdHlwZSBub3QgaW4gKFVJbnQ2NChlbnVtcy5FVlRfSVApLCBVSW50NjQoZW51bXMuRVZUX01EKSk6CiAgICBkaWcgNQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDEzCiAgICBkaWcgMTQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQxNAogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTMKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9pbnRlcmVzdF9hbW91bnRAMTQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MjYKICAgIC8vIGV2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ1cnkgMTYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQyNwogICAgLy8gaWYgZXZlbnRfdHlwZSBub3QgaW4gKFVJbnQ2NChlbnVtcy5FVlRfUFIpLCBVSW50NjQoZW51bXMuRVZUX01EKSk6CiAgICBwdXNoaW50IDMKICAgID09CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTcKICAgIGRpZyAxNAogICAgcHVzaGludCAxOQogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDI4CiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyNjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MwogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZGlnIDE1CiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnVyeSAxMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTU2CiAgICAvLyBpZiBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKToKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDI3CiAgICBkaWcgOQogICAgYnVyeSAxMQoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzY6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzItNTc0CiAgICAvLyAjIEZ1bmRpbmcgdXNlcyBwZXItdW5pdCBjdW11bGF0aXZlIGluZGljZXMgc28gZWFjaCBob2xkZXIgY2FuIHNldHRsZQogICAgLy8gIyBpbmRlcGVuZGVudGx5IGZyb20gaXRzIGN1cnJlbnQgdW5pdCBiYWxhbmNlLgogICAgLy8gaW50ZXJlc3RfaW5kZXhfZGVsdGEgPSBzZWxmLl9hbW91bnRfdG9faW5kZXhfZGVsdGEoaW50ZXJlc3RfYW1vdW50X2R1ZSkKICAgIGRpZyAxMgogICAgY2FsbHN1YiBfYW1vdW50X3RvX2luZGV4X2RlbHRhCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzUKICAgIC8vIHByaW5jaXBhbF9pbmRleF9kZWx0YSA9IHNlbGYuX2Ftb3VudF90b19pbmRleF9kZWx0YShwcmluY2lwYWxfYW1vdW50X2R1ZSkKICAgIGRpZyA4CiAgICBjYWxsc3ViIF9hbW91bnRfdG9faW5kZXhfZGVsdGEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU3NgogICAgLy8gaW50ZXJlc3RfYW1vdW50ID0gc2VsZi5faW5kZXhfZGVsdGFfdG9fYW1vdW50KGludGVyZXN0X2luZGV4X2RlbHRhKQogICAgZGlnIDEKICAgIGNhbGxzdWIgX2luZGV4X2RlbHRhX3RvX2Ftb3VudAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBidXJ5IDE3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzcKICAgIC8vIHByaW5jaXBhbF9hbW91bnQgPSBzZWxmLl9pbmRleF9kZWx0YV90b19hbW91bnQocHJpbmNpcGFsX2luZGV4X2RlbHRhKQogICAgZHVwCiAgICBjYWxsc3ViIF9pbmRleF9kZWx0YV90b19hbW91bnQKICAgIGR1cAogICAgYnVyeSAxMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTc4CiAgICAvLyByZXF1aXJlZF9hbW91bnQgPSBpbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50CiAgICBkaWcgMgogICAgZGlnIDEKICAgICsKICAgIGR1cAogICAgYnVyeSAxMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzI3CiAgICAvLyBiYWxhbmNlID0gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYXNzZXJ0IC8vIGFjY291bnQgb3B0ZWQgaW50byBhc3NldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDU2CiAgICAvLyByZXR1cm4gc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCArIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX2ludGVyZXN0IGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIGV4aXN0cwogICAgZGlnIDEKICAgICsKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcyOQogICAgLy8gYXNzZXJ0IGJhbGFuY2UgPj0gcmVzZXJ2ZWRfdG90YWwsIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBkaWcgMgogICAgZGlnIDEKICAgID49CiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcyBmb3IgdGhlIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjczMAogICAgLy8gcmV0dXJuIGJhbGFuY2UgLSByZXNlcnZlZF90b3RhbAogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICAtCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1ODAKICAgIC8vIHNlbGYuX2F2YWlsYWJsZV9zZXR0bGVtZW50X2Z1bmRzKCkgPj0gcmVxdWlyZWRfYW1vdW50CiAgICB1bmNvdmVyIDIKICAgID49CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzktNTgxCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuX2F2YWlsYWJsZV9zZXR0bGVtZW50X2Z1bmRzKCkgPj0gcmVxdWlyZWRfYW1vdW50CiAgICAvLyApLCBlcnIuTk9UX0VOT1VHSF9GVU5EUwogICAgYXNzZXJ0IC8vIE5vdCBlbm91Z2ggZnVuZHMgZm9yIHRoZSBwYXltZW50CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1ODMKICAgIC8vIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgKz0gaW50ZXJlc3RfYW1vdW50CiAgICB1bmNvdmVyIDMKICAgICsKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1ODQKICAgIC8vIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsICs9IHByaW5jaXBhbF9hbW91bnQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgICsKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTg1CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggKz0gaW50ZXJlc3RfaW5kZXhfZGVsdGEKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IGV4aXN0cwogICAgdW5jb3ZlciAyCiAgICArCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1ODYKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggKz0gcHJpbmNpcGFsX2luZGV4X2RlbHRhCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTcgLy8gImN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IGV4aXN0cwogICAgKwogICAgYnl0ZWMgMTcgLy8gImN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4NwogICAgLy8gaWYgZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSA9PSBVSW50NjQoZW51bXMuRVZUX1BSKToKICAgIGRpZyAxNQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19lbHNlX2JvZHlAMzgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4OC01ODkKICAgIC8vICMgRm9yIFBSLCB0aGUgcGVyaW9kIGludGVyZXN0IHN0YXlzIGFjY3J1ZWQgdW50aWwgYSBsYXRlciBJUCBvciBNRC4KICAgIC8vIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCArPSBzZWxmLl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KGVudHJ5KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgIGRpZyAxNgogICAgY2FsbHN1YiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudAogICAgYnVyeSAxOAogICAgKwogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzOToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5MgogICAgLy8gaWYgbm90IHNlbGYuX2lzX2R5bmFtaWNfYW5udWl0eSgpIG9yIGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkgPT0gVUludDY0KAogICAgY2FsbHN1YiBfaXNfZHluYW1pY19hbm51aXR5CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUA0MQogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTkyLTU5NAogICAgLy8gaWYgbm90IHNlbGYuX2lzX2R5bmFtaWNfYW5udWl0eSgpIG9yIGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkgPT0gVUludDY0KAogICAgLy8gICAgIGVudW1zLkVWVF9NRAogICAgLy8gKToKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0MgoKZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlANDE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTUKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IGVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGRpZyAxNQogICAgcHVzaGludCA0MQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTk2CiAgICAvLyBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9IG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBkaWcgMTAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTcKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IG5leHRfaW50ZXJlc3RfYmFzZQogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGRpZyAxMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5OAogICAgLy8gc2VsZi5ldmVudF9jdXJzb3IgKz0gVUludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAwCiAgICAvLyBpZiBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoCiAgICBkaWcgMTUKICAgIGV4dHJhY3QgOCAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MDAtNjAyCiAgICAvLyBpZiBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoCiAgICAvLyAgICAgZW51bXMuRVZUX01ECiAgICAvLyApIGFuZCBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9PSBVSW50NjQoMCk6CiAgICBwdXNoYnl0ZXMgMHgxMwogICAgYj09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0NQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAyCiAgICAvLyApIGFuZCBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9PSBVSW50NjQoMCk6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwMC02MDIKICAgIC8vIGlmIGVudHJ5LmV2ZW50X3R5cGUgPT0gYXJjNC5VSW50OCgKICAgIC8vICAgICBlbnVtcy5FVlRfTUQKICAgIC8vICkgYW5kIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID09IFVJbnQ2NCgwKToKICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0NQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAzCiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbnVtcy5TVEFUVVNfRU5ERUQpCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBwdXNoaW50IDIwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwNAogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gVUludDY0KDApCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0NToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwNi02MTAKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1pbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50LAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PWludGVyZXN0X2Ftb3VudCArIHByaW5jaXBhbF9hbW91bnQsCiAgICAvLyApCiAgICBkaWcgMTUKICAgIGRpZyA3CiAgICBkdXAKICAgIGNhbGxzdWIgX2VtaXRfZXhlY3V0aW9uX2V2ZW50CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3MAogICAgLy8gZnVuZGVkX2ludGVyZXN0ICs9IGludGVyZXN0X2Ftb3VudAogICAgZGlnIDEKICAgIGRpZyAxNAogICAgKwogICAgYnVyeSAyCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzEKICAgIC8vIGZ1bmRlZF9wcmluY2lwYWwgKz0gcHJpbmNpcGFsX2Ftb3VudAogICAgZHVwCiAgICBkaWcgOQogICAgKwogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzIKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgKz0gVUludDY0KDEpCiAgICBkaWcgMgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMwogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3Nfd2hpbGVfdG9wQDIKCmZ1bmRfZHVlX2Nhc2hmbG93c19lbHNlX2JvZHlAMzg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTEKICAgIC8vIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzOQoKZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlAMjc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTcKICAgIC8vIGV2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ1cnkgMTYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1OC01NjAKICAgIC8vICMgRHluYW1pYyBhbm51aXRpZXMgZGVyaXZlIG5leHQgc3RhdGUgZnJvbSB0aGUgcGF5bWVudCBkZWNvbXBvc2l0aW9uLAogICAgLy8gIyBub3Qgb25seSBmcm9tIHRoZSBwcmVjb21wdXRlZCBgbmV4dF8qYCBmaWVsZHMuCiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpOgogICAgcHVzaGludCAzCiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUAyOQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTYyCiAgICAvLyBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCAtIHByaW5jaXBhbF9hbW91bnRfZHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGRpZyA4CiAgICAtCiAgICBkdXAKICAgIGJ1cnkgMTEKICAgIGJ1cnkgMTEKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzYKCmZ1bmRfZHVlX2Nhc2hmbG93c19lbHNlX2JvZHlAMjk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjUKICAgIC8vIGVsaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX0lQKToKICAgIGRpZyAxNAogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDMxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjYKICAgIC8vIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgYnVyeSAxMQogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY3CiAgICAvLyBuZXh0X2ludGVyZXN0X2Jhc2UgPSBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGJ1cnkgMTIKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgZXhpc3RzCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDMxOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY4CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCk6CiAgICBkaWcgMTQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlAMzIKICAgIGRpZyA5CiAgICBidXJ5IDExCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUAzMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU2OQogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDEwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzAKICAgIC8vIG5leHRfaW50ZXJlc3RfYmFzZSA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTEKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzYKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDI5CiAgICAvLyBpZiBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKToKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzMAogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKToKICAgIGRpZyAxNAogICAgcHVzaGludCAxOQogICAgPT0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDIwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzEKICAgIC8vIHJldHVybiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBidXJ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyNgoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzIKICAgIC8vIGludGVyZXN0X2R1ZSA9IHNlbGYuYWNjcnVlZF9pbnRlcmVzdCArIHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZGlnIDE2CiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBidXJ5IDE4CiAgICArCiAgICBkdXAKICAgIGJ1cnkgMTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzMwogICAgLy8gaWYgc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIDw9IGludGVyZXN0X2R1ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIGV4aXN0cwogICAgPj0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDIyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzQKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyNgoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzUKICAgIC8vIHByaW5jaXBhbF9hbW91bnQgPSBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gLSBpbnRlcmVzdF9kdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIGV4aXN0cwogICAgZGlnIDEyCiAgICAtCiAgICBkdXAKICAgIGJ1cnkgMTAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzNgogICAgLy8gaWYgcHJpbmNpcGFsX2Ftb3VudCA+IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICA+CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDM3CiAgICAvLyByZXR1cm4gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTIKICAgIC8vIHByaW5jaXBhbF9hbW91bnRfZHVlID0gc2VsZi5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudChlbnRyeSkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnRAMjYKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDI0OgogICAgZGlnIDgKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTUyCiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyNToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ0MAogICAgLy8gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwgPD0gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGRpZyAxNQogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgZHVwMgogICAgPD0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzOS00NDEKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwgPD0gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDQyCiAgICAvLyByZXR1cm4gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgLSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgc3dhcAogICAgLQogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTIKICAgIC8vIHByaW5jaXBhbF9hbW91bnRfZHVlID0gc2VsZi5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudChlbnRyeSkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnRAMjYKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDE1CiAgICAvLyByZXR1cm4gc2VsZi5hY2NydWVkX2ludGVyZXN0ICsgc2VsZi5fZW50cnlfaW50ZXJlc3Rfc2VnbWVudChlbnRyeSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBkaWcgMTYKICAgIGNhbGxzdWIgX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQKICAgIGJ1cnkgMTgKICAgICsKICAgIGJ1cnkgMTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MQogICAgLy8gaW50ZXJlc3RfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X2ludGVyZXN0X2Ftb3VudChlbnRyeSkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X2ludGVyZXN0X2Ftb3VudEAxNAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDk6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzQKICAgIC8vIGFzc2VydCBwcm9jZXNzZWRfZXZlbnRzID4gVUludDY0KDApLCBlcnIuTk9fRFVFX0NBU0hGTE9XCiAgICBkaWcgMgogICAgZHVwCiAgICBhc3NlcnQgLy8gTm8gZHVlIGNhc2hmbG93IHRvIHBheQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojc4CiAgICAvLyB0b3RhbF9mdW5kZWQ9ZnVuZGVkX2ludGVyZXN0ICsgZnVuZGVkX3ByaW5jaXBhbCwKICAgIGRpZyAyCiAgICBkdXAKICAgIGRpZyAzCiAgICBkdXAKICAgIGNvdmVyIDMKICAgICsKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4MAogICAgLy8gdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojc1LTgxCiAgICAvLyByZXR1cm4gdHlwLkNhc2hGdW5kaW5nUmVzdWx0KAogICAgLy8gICAgIGZ1bmRlZF9pbnRlcmVzdD1mdW5kZWRfaW50ZXJlc3QsCiAgICAvLyAgICAgZnVuZGVkX3ByaW5jaXBhbD1mdW5kZWRfcHJpbmNpcGFsLAogICAgLy8gICAgIHRvdGFsX2Z1bmRlZD1mdW5kZWRfaW50ZXJlc3QgKyBmdW5kZWRfcHJpbmNpcGFsLAogICAgLy8gICAgIHByb2Nlc3NlZF9ldmVudHM9cHJvY2Vzc2VkX2V2ZW50cywKICAgIC8vICAgICB0aW1lc3RhbXA9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQ2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX2ZhbHNlQDUxOgogICAgaW50Y18wIC8vIDAKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfbWVyZ2VANTIKCgovLyBtb2R1bGVzLnBheW1lbnRfYWdlbnQuUGF5bWVudEFnZW50LmNsYWltX2R1ZV9jYXNoZmxvd3Nbcm91dGluZ10oKSAtPiB2b2lkOgpjbGFpbV9kdWVfY2FzaGZsb3dzOgogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDIKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE0CiAgICAvLyBpZiBzZWxmLm9wX2RhZW1vbi52YWx1ZSAhPSBHbG9iYWwuemVyb19hZGRyZXNzOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI1IC8vIDB4NTIyMzRmNzA0NDYxNjU2ZDZmNmUyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wX2RhZW1vbiBleGlzdHMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE2CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjUgLy8gMHg1MjIzNGY3MDQ0NjE2NTZkNmY2ZTIzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BfZGFlbW9uIGV4aXN0cwogICAgPT0KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNi0xOAogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICBibnogY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX3RydWVAMTQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNwogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIHR4biBTZW5kZXIKICAgIGRpZyAzCiAgICA9PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE2LTE4CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIGJueiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfdHJ1ZUAxNAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE4CiAgICAvLyBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgdHhuIFNlbmRlcgogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgMzIKICAgID09CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTYtMTgKICAgIC8vIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICAvLyBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgYnogY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX2ZhbHNlQDE1CgpjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfdHJ1ZUAxNDoKICAgIGludGNfMSAvLyAxCgpjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfbWVyZ2VAMTY6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTUtMTkKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgLy8gICAgIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICAvLyAgICAgb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIC8vICksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAoKY2xhaW1fZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE3OgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojk0CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojk1CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5OAogICAgLy8gc2VsZi5fZW5zdXJlX3VuaXRzX2FjdGl2YXRlZChob2xkaW5nX2FkZHJlc3MpCiAgICBkaWcgMgogICAgZHVwCiAgICBjYWxsc3ViIF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6OTkKICAgIC8vIHNlbGYuX3NldHRsZV9wb3NpdGlvbihob2xkaW5nX2FkZHJlc3MpCiAgICBjYWxsc3ViIF9zZXR0bGVfcG9zaXRpb24KICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExNwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY2xhaW1hYmxlX2ludGVyZXN0CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBkdXAKICAgIHB1c2hpbnQgNzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExOAogICAgLy8gKyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jbGFpbWFibGVfcHJpbmNpcGFsCiAgICBkdXAKICAgIHB1c2hpbnQgODEKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExNy0xMTgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNsYWltYWJsZV9pbnRlcmVzdAogICAgLy8gKyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jbGFpbWFibGVfcHJpbmNpcGFsCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTAxCiAgICAvLyBhc3NlcnQgdG90YWxfYW1vdW50ID4gVUludDY0KDApLCBlcnIuTk9fRFVFX0NBU0hGTE9XCiAgICBhc3NlcnQgLy8gTm8gZHVlIGNhc2hmbG93IHRvIHBheQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MuaXNfb3B0ZWRfaW4oCiAgICBleHRyYWN0IDAgMzIKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNQogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNC0yNgogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLmlzX29wdGVkX2luKAogICAgLy8gICAgIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZAogICAgLy8gKQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNC0yNwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLmlzX29wdGVkX2luKAogICAgLy8gICAgIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZAogICAgLy8gKQogICAgLy8gYW5kIG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQKICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAyNAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI3CiAgICAvLyBhbmQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCAzODQKICAgIGdldGJpdAogICAgYm56IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAyNAogICAgaW50Y18xIC8vIDEKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUAyNToKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMDYKICAgIC8vIGlmIHNlbGYuX2lzX3BheW1lbnRfZXhlY3V0YWJsZShob2xkaW5nX2FkZHJlc3MpOgogICAgYnogY2xhaW1fZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozMwogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIHN3YXAKICAgIGRpZyAxCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozMy0zNAogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIC8vID49IHBheW1lbnRfYW1vdW50CiAgICBkaWcgNQogICAgZHVwCiAgICBjb3ZlciAyCiAgICA+PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjMyLTM1CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICAvLyAgICAgPj0gcGF5bWVudF9hbW91bnQKICAgIC8vICksIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcyBmb3IgdGhlIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMDgKICAgIC8vIHNlbGYuX3BheShzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MsIHRvdGFsX2Ftb3VudCkKICAgIGRpZyAyCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBkdXAKICAgIGV4dHJhY3QgMCAzMgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjM5LTQ0CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9cmVjZWl2ZXIsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWFtb3VudCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQzCiAgICAvLyBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgdW5jb3ZlciAzCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIHVuY292ZXIgMgogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozOQogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgcHVzaGludCA0IC8vIGF4ZmVyCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjM5LTQ0CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9cmVjZWl2ZXIsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWFtb3VudCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMjUtMTI2CiAgICAvLyAjIEdldCB0aGUgY2xhaW1hYmxlIGFtb3VudHMgYmVmb3JlIHJlc2V0CiAgICAvLyBpbnRlcmVzdF9hbW91bnQgPSBwb3NpdGlvbi5jbGFpbWFibGVfaW50ZXJlc3QKICAgIGR1cAogICAgcHVzaGludCA3MwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSA5CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTI3CiAgICAvLyBwcmluY2lwYWxfYW1vdW50ID0gcG9zaXRpb24uY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgZHVwCiAgICBwdXNoaW50IDgxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAzCiAgICBidXJ5IDkKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMjktMTMwCiAgICAvLyAjIFJlc2V0IHRoZSBwb3NpdGlvbidzIGNsYWltYWJsZSBhbW91bnRzCiAgICAvLyBwb3NpdGlvbi5jbGFpbWFibGVfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBpdG9iCiAgICBzd2FwCiAgICBkaWcgMQogICAgcmVwbGFjZTIgNzMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzEKICAgIC8vIHBvc2l0aW9uLmNsYWltYWJsZV9wcmluY2lwYWwgPSBVSW50NjQoMCkKICAgIHN3YXAKICAgIHJlcGxhY2UyIDgxCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTMyCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHBvc2l0aW9uLmNvcHkoKQogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTM0CiAgICAvLyBhc3NlcnQgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCA+PSBpbnRlcmVzdF9hbW91bnQsIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX2ludGVyZXN0IGV4aXN0cwogICAgZHVwCiAgICBkaWcgMgogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzNQogICAgLy8gYXNzZXJ0IHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsID49IHByaW5jaXBhbF9hbW91bnQsIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICBkaWcgMwogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzNy0xMzgKICAgIC8vICMgVXBkYXRlIHRoZSBnbG9iYWwgcmVzZXJ2ZWQgaW50ZXJlc3QgYW5kIHByaW5jaXBhbCBhbW91bnRzCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0IC09IGludGVyZXN0X2Ftb3VudAogICAgc3dhcAogICAgLQogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzkKICAgIC8vIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIC09IHByaW5jaXBhbF9hbW91bnQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIHN3YXAKICAgIC0KICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKY2xhaW1fZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTE0CiAgICAvLyB0b3RhbF9hbW91bnQ9aW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudCwKICAgIGRpZyA1CiAgICBkdXAKICAgIGRpZyA2CiAgICBkdXAKICAgIGNvdmVyIDMKICAgICsKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMTUKICAgIC8vIHRpbWVzdGFtcD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMTEtMTE3CiAgICAvLyByZXR1cm4gdHlwLkNhc2hDbGFpbVJlc3VsdCgKICAgIC8vICAgICBpbnRlcmVzdF9hbW91bnQ9aW50ZXJlc3RfYW1vdW50LAogICAgLy8gICAgIHByaW5jaXBhbF9hbW91bnQ9cHJpbmNpcGFsX2Ftb3VudCwKICAgIC8vICAgICB0b3RhbF9hbW91bnQ9aW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudCwKICAgIC8vICAgICB0aW1lc3RhbXA9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgY29udGV4dD1wYXltZW50X2luZm8sCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgMgogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIHB1c2hieXRlcyAweDAwMjIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX2ZhbHNlQDI0OgogICAgaW50Y18wIC8vIDAKICAgIGIgY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDI1CgpjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VAMTU6CiAgICBpbnRjXzAgLy8gMAogICAgYiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfbWVyZ2VAMTYKCgovLyBtb2R1bGVzLnRyYW5zZmVyX2FnZW50LlRyYW5zZmVyQWdlbnQudHJhbnNmZXJfc2V0X3NjaGVkdWxlW3JvdXRpbmddKCkgLT4gdm9pZDoKdHJhbnNmZXJfc2V0X3NjaGVkdWxlOgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjI2CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MjcKICAgIC8vIGFzc2VydCBvcGVuX2RhdGUgPCBjbG9zdXJlX2RhdGUsIGVyci5JTlZBTElEX1NPUlRJTkcKICAgIGR1cDIKICAgIDwKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBtdXN0IGJlIHNvcnRlZCBpbiBzdHJpY3RseSBhc2NlbmRpbmcgb3JkZXIKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MjkKICAgIC8vIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlID0gb3Blbl9kYXRlCiAgICBieXRlYyAyNyAvLyAidHJhbnNmZXJfb3BlbmluZ19kYXRlIgogICAgdW5jb3ZlciAyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTozMAogICAgLy8gc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGUgPSBjbG9zdXJlX2RhdGUKICAgIGJ5dGVjIDI4IC8vICJ0cmFuc2Zlcl9jbG9zdXJlX2RhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTozMQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnRyYW5zZmVyX2FnZW50LlRyYW5zZmVyQWdlbnQucHJpbWFyeV9kaXN0cmlidXRpb25bcm91dGluZ10oKSAtPiB2b2lkOgpwcmltYXJ5X2Rpc3RyaWJ1dGlvbjoKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzEKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnByaW1hcnlfZGVhbGVyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjIgLy8gMHg1MjIzNTA3MjY5NmQ2MTcyNzk0NDY1NjE2YzY1NzIyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo0MwogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDQKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo0NQogICAgLy8gYXNzZXJ0IHNlbGYuX3N0YXR1c19pc19wZW5kaW5nX2llZCgpLCBlcnIuUFJJTUFSWV9ESVNUUklCVVRJT05fQ0xPU0VECiAgICBhc3NlcnQgLy8gUHJpbWFyeSBkaXN0cmlidXRpb24gaXMgY2xvc2VkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBjb3ZlciAzCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQ3CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKGhvbGRpbmdfYWRkcmVzcykKICAgIHN3YXAKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDgKICAgIC8vIGFzc2VydCB1bml0cyA+IFVJbnQ2NCgwKSwgZXJyLlpFUk9fVU5JVFMKICAgIGR1cAogICAgYXNzZXJ0IC8vIENhbiBub3QgZGlzdHJpYnV0ZSB6ZXJvIHVuaXRzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjUwCiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsICsgdW5pdHMgPD0gc2VsZi50b3RhbF91bml0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCBleGlzdHMKICAgICsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICA8PQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo0OS01MQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsICsgdW5pdHMgPD0gc2VsZi50b3RhbF91bml0cwogICAgLy8gKSwgZXJyLk9WRVJfRElTVFJJQlVUSU9OCiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IHJlbWFpbmluZyBELUFTQSB1bml0cwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo1MgogICAgLy8gaWYgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjYgLy8gImluaXRpYWxfZXhjaGFuZ2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGUgZXhpc3RzCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NTQKICAgIC8vIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDw9IHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjYgLy8gImluaXRpYWxfZXhjaGFuZ2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGUgZXhpc3RzCiAgICA8PQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo1My01NQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8PSBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZQogICAgLy8gKSwgZXJyLlBSSU1BUllfRElTVFJJQlVUSU9OX0NMT1NFRAogICAgYXNzZXJ0IC8vIFByaW1hcnkgZGlzdHJpYnV0aW9uIGlzIGNsb3NlZAoKcHJpbWFyeV9kaXN0cmlidXRpb25fYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE0OAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucmVzZXJ2ZWRfdW5pdHMgKz0gdW5pdHMKICAgIGR1cG4gMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHB1c2hpbnQgNDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMwogICAgZHVwCiAgICBjb3ZlciAzCiAgICArCiAgICBpdG9iCiAgICBwdXNoaW50IDQwCiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo1OAogICAgLy8gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCArPSB1bml0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCBleGlzdHMKICAgICsKICAgIGJ5dGVjIDEwIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo1OQogICAgLy8gcmV0dXJuIHNlbGYudG90YWxfdW5pdHMgLSBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgc3dhcAogICAgLQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTozMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy50cmFuc2Zlcl9hZ2VudC5UcmFuc2ZlckFnZW50LnRyYW5zZmVyW3JvdXRpbmddKCkgLT4gdm9pZDoKdHJhbnNmZXI6CiAgICBpbnRjXzAgLy8gMAogICAgZHVwCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXBuIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo3NQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NzYKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQ3CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuX3N0YXR1c19pc19wZW5kaW5nX2llZCgpLCBlcnIuUEVORElOR19JRUQKICAgICEKICAgIGFzc2VydCAvLyBJRUQgbm90IHlldCBleGVjdXRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxMwogICAgLy8gaWYgc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjcgLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICBieiB0cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTUKICAgIC8vIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjcgLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNC0xNgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gKSwgZXJyLkNMT1NFRF9UUkFOU0ZFUgogICAgYXNzZXJ0IC8vIFRyYW5zZmVyIGlzIGNsb3NlZAoKdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNwogICAgLy8gaWYgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjggLy8gInRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICBieiB0cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTkKICAgIC8vIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDwgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGUKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyOCAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIDwKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTgtMjAKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZQogICAgLy8gKSwgZXJyLkNMT1NFRF9UUkFOU0ZFUgogICAgYXNzZXJ0IC8vIFRyYW5zZmVyIGlzIGNsb3NlZAoKdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4MAogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gc2VuZGVyX2hvbGRpbmdfYWRkcmVzcywgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA4CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIGJ5dGVjIDggLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQyMwogICAgZGlnIDUKICAgIGR1cAogICAgY292ZXIgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgOQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4MwogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChzZW5kZXJfaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDIKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODQKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQocmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzKQogICAgZHVwCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojg1CiAgICAvLyBhc3NlcnQgc2VuZGVyX2hvbGRpbmdfYWRkcmVzcyAhPSByZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3MsIGVyci5TRUxGX1RSQU5TRkVSCiAgICB1bmNvdmVyIDIKICAgICE9CiAgICBhc3NlcnQgLy8gU2VuZGVyIGFuZCByZWNlaXZlciBtdXN0IGJlIGRpZmZlcmVudAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4NgogICAgLy8gYXNzZXJ0IHVuaXRzID4gVUludDY0KDApLCBlcnIuTlVMTF9UUkFOU0ZFUgogICAgZGlnIDEKICAgIGR1cAogICAgYXNzZXJ0IC8vIFRyYW5zZmVyIHVuaXRzIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODcKICAgIC8vIGFzc2VydCB1bml0cyA8PSBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMsIGVyci5PVkVSX1RSQU5TRkVSCiAgICBzd2FwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgPD0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgc2VuZGVyIHVuaXRzIHRvIHRyYW5zZmVyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NTYKICAgIC8vIGlmIHNlbGYuZXZlbnRfY3Vyc29yID49IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQ6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgID49CiAgICBibnogdHJhbnNmZXJfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYXNzZXJ0X25vX2R1ZV9ldmVudF9wZW5kaW5nQDEwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NTgKICAgIC8vIG5leHRfZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoc2VsZi5ldmVudF9jdXJzb3IpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzYwCiAgICAvLyBuZXh0X2VudHJ5LnNjaGVkdWxlZF90aW1lID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgID4KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc1OS03NjEKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgbmV4dF9lbnRyeS5zY2hlZHVsZWRfdGltZSA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyApLCBlcnIuUEVORElOR19BQ1RVU19FVkVOVAogICAgYXNzZXJ0IC8vIEFDVFVTIGV2ZW50IG5vdCB5ZXQgZXhlY3V0ZWQKCnRyYW5zZmVyX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Fzc2VydF9ub19kdWVfZXZlbnRfcGVuZGluZ0AxMDoKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6OTAKICAgIC8vIHNlbGYuX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQoc2VuZGVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGRpZyAzCiAgICBkdXAKICAgIGNhbGxzdWIgX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6OTEKICAgIC8vIHNlbGYuX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQocmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgY2FsbHN1YiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo5MgogICAgLy8gc2VsZi5fc2V0dGxlX3Bvc2l0aW9uKHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBjYWxsc3ViIF9zZXR0bGVfcG9zaXRpb24KICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo5MwogICAgLy8gc2VsZi5fc2V0dGxlX3Bvc2l0aW9uKHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGNhbGxzdWIgX3NldHRsZV9wb3NpdGlvbgogICAgcG9wbiAyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTUyCiAgICAvLyBhc3NlcnQgdW5pdHMgPD0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMsIGVyci5PVkVSX1RSQU5TRkVSCiAgICBkaWcgNQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgZGlnIDEKICAgIDw9CiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IHNlbmRlciB1bml0cyB0byB0cmFuc2ZlcgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE1MwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMgLT0gdW5pdHMKICAgIGRpZyAxCiAgICAtCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGludGNfMyAvLyAzMgogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE0NAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMgKz0gdW5pdHMKICAgIGRpZyA1CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICB1bmNvdmVyIDIKICAgICsKICAgIGl0b2IKICAgIGludGNfMyAvLyAzMgogICAgc3dhcAogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBkaWcgMgogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5hY2NvdW50X3N1c3BlbnNpb25bcm91dGluZ10oKSAtPiB2b2lkOgphY2NvdW50X3N1c3BlbnNpb246CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTY1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo3NwogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYXV0aG9yaXR5LCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjEgLy8gMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTg1CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGR1cAogICAgcHVzaGludCA0OAogICAgaW50Y18xIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIHB1c2hpbnQgNDgKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTg2CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfb3Blbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfb3BlbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2OAogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjMgLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQ0ZDYxNmU2MTY3NjU3MjIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzkKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0VOREVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDIwMAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTAKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX2VuZGVkKCksIGVyci5VTkFVVEhPUklaRUQKICAgICEKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxMQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTIKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjEzCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzQKICAgIC8vIHVuaXRzPVVJbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzItNDIKICAgIC8vIHJldHVybiB0eXAuQWNjb3VudFBvc2l0aW9uKAogICAgLy8gICAgIHBheW1lbnRfYWRkcmVzcz1wYXltZW50X2FkZHJlc3MsCiAgICAvLyAgICAgdW5pdHM9VUludDY0KDApLAogICAgLy8gICAgIHJlc2VydmVkX3VuaXRzPVVJbnQ2NCgwKSwKICAgIC8vICAgICBzdXNwZW5kZWQ9RmFsc2UsCiAgICAvLyAgICAgc2V0dGxlZF9jdXJzb3I9VUludDY0KDApLAogICAgLy8gICAgIGludGVyZXN0X2NoZWNrcG9pbnQ9VUludDY0KDApLAogICAgLy8gICAgIHByaW5jaXBhbF9jaGVja3BvaW50PVVJbnQ2NCgwKSwKICAgIC8vICAgICBjbGFpbWFibGVfaW50ZXJlc3Q9VUludDY0KDApLAogICAgLy8gICAgIGNsYWltYWJsZV9wcmluY2lwYWw9VUludDY0KDApLAogICAgLy8gKQogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBieXRlYyA0MCAvLyAweDAwCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxNAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSBzZWxmLl9uZXdfYWNjb3VudF9wb3NpdGlvbihwYXltZW50X2FkZHJlc3MpCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjE1CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzczoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMzgKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcywgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgdW5jb3ZlciAzCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjM5CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0MAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDEKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcyA9IHBheW1lbnRfYWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDIKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF9nZXRfcG9zaXRpb25bcm91dGluZ10oKSAtPiB2b2lkOgphY2NvdW50X2dldF9wb3NpdGlvbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNTkKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9jcmVhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9jcmVhdGU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5ODAKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSBhcnJhbmdlcgogICAgYnl0ZWMgMTggLy8gMHg1MjIzNDE3MjcyNjE2ZTY3NjU3MjIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTgxCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfY29uZmlnW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfY29uZmlnOgogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGxlbgogICAgcHVzaGludCAxMDcKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuTm9ybWFsaXplZEFjdHVzVGVybXMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDcyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLkluaXRpYWxLZXJuZWxTdGF0ZQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIGxlbgogICAgZGlnIDEKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgdHVwbGUgZW5jb2RpbmcKICAgIGR1cAogICAgcHVzaGludCAzNAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHRhaWwgcG9pbnRlciBhdCBpbmRleCAxIG9mICh1aW50OFszMl0sKGxlbit1dGY4W10pKQogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBjb3ZlciAzCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAzNgogICAgKwogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5Qcm9zcGVjdHVzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDEyCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMTQtMTAxNQogICAgLy8gIyBDb25maWd1cmUgQ29udHJhY3QKICAgIC8vIHNlbGYuY29udHJhY3RfdHlwZSA9IHRlcm1zLmNvbnRyYWN0X3R5cGUuYXNfdWludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ5dGVjIDEyIC8vICJjb250cmFjdF90eXBlIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICBieiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIwCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfQU5OKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjEKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgcHVzaGludCAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjIKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjMKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgcHVzaGludCA0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjQKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYnogY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAOAoKY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUA3OgogICAgaW50Y18xIC8vIDEKCmNvbnRyYWN0X2NvbmZpZ19ib29sX21lcmdlQDk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjkKICAgIC8vIGFzc2VydCBzZWxmLl9pc19zdXBwb3J0ZWRfY29udHJhY3RfdHlwZShjb250cmFjdF90eXBlKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDE3CiAgICAvLyBzZWxmLl9zdG9yZV9jb250cmFjdF9jb25maWcoc2VsZi5jb250cmFjdF90eXBlLCB0ZXJtcywgaW5pdGlhbF9zdGF0ZSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBidXJ5IDIKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMjUKICAgIC8vIGFzc2VydCB0ZXJtcy5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBkaWcgNAogICAgZHVwCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDgKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMyNwogICAgLy8gdGVybXMuZGF5X2NvdW50X2NvbnZlbnRpb24uYXNfdWludDY0KCkKICAgIHB1c2hpbnQgNTcKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyOTctMzAzCiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgIGJ6IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGRpZyA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyOTkKICAgIC8vIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGRpZyA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDAKICAgIC8vIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICBwdXNoaW50IDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI5Ny0zMDMKICAgIC8vIHJldHVybiBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzYwKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwSVNEQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjApLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDE2CiAgICBkaWcgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzAxCiAgICAvLyBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyOTctMzAzCiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgID09CiAgICBibnogY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUAxNgogICAgZGlnIDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMwMgogICAgLy8gVUludDY0KGVudW1zLkRDQ18zMEUzNjApLAogICAgcHVzaGludCA0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyOTctMzAzCiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgID09CiAgICBieiBjb250cmFjdF9jb25maWdfYm9vbF9mYWxzZUAxNwoKY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUAxNjoKICAgIGludGNfMSAvLyAxCgpjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUAxODoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMwOS0zMTEKICAgIC8vIGFzc2VydCBzZWxmLl9pc19zdXBwb3J0ZWRfZGF5X2NvdW50X2NvbnZlbnRpb24oCiAgICAvLyAgICAgZGF5X2NvdW50X2NvbnZlbnRpb24KICAgIC8vICksIGVyci5JTlZBTElEX0RBWV9DT1VOVF9DT05WRU5USU9OCiAgICBhc3NlcnQgLy8gSW52YWxpZCBkYXktY291bnQgY29udmVudGlvbiBJRAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzI5CiAgICAvLyBpZiBjb250cmFjdF90eXBlICE9IFVJbnQ2NChlbnVtcy5DVF9BTk4pOgogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgIT0KICAgIGJ6IGNvbnRyYWN0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDIwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzAKICAgIC8vIGFzc2VydCBub3QgdGVybXMuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBkaWcgNAogICAgcHVzaGludCA3ODYKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgoKY29udHJhY3RfY29uZmlnX2FmdGVyX2lmX2Vsc2VAMjA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MDAKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MDEKICAgIC8vIGFzc2VydCBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID09IFVJbnQ2NCgwKSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBELUFTQSBhbHJlYWR5IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgwMy04MDQKICAgIC8vICMgU2V0IERlbm9taW5hdGlvbiBBc3NldAogICAgLy8gc2VsZi5fYXNzZXJ0X2Rlbm9taW5hdGlvbl9hc3NldCh0ZXJtcy5kZW5vbWluYXRpb25fYXNzZXRfaWQpCiAgICBkaWcgNAogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc2OC03NjkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gZGVub21pbmF0aW9uIHdpdGggQVNBCiAgICAvLyBfY3JlYXRvciwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfY3JlYXRvcihkZW5vbWluYXRpb25fYXNzZXRfaWQpCiAgICBkdXAKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc3MAogICAgLy8gYXNzZXJ0IGV4aXN0cywgZXJyLklOVkFMSURfREVOT01JTkFUSU9OCiAgICBhc3NlcnQgLy8gRGVub21pbmF0aW9uIGFzc2V0IGlzIG5vdCBwcm9wZXJseSBzZXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc3MwogICAgLy8gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgPSBkZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIGJ5dGVjIDQ0IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgwNy04MDgKICAgIC8vICMgU2V0IFNldHRsZW1lbnQgQXNzZXQKICAgIC8vIHNlbGYuX2Fzc2VydF9zZXR0bGVtZW50X2Fzc2V0KHRlcm1zLnNldHRsZW1lbnRfYXNzZXRfaWQpCiAgICBkaWcgMQogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Nzc4CiAgICAvLyBzZXR0bGVtZW50X2Fzc2V0X2lkID09IHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc3Ni03NzkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzZXR0bGVtZW50IGFzc2V0IGlzIHRoZSBkZW5vbWluYXRpb24gYXNzZXQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgLy8gKSwgZXJyLklOVkFMSURfU0VUVExFTUVOVF9BU1NFVAogICAgYXNzZXJ0IC8vIERpZmZlcmVudCBzZXR0bGVtZW50IGFzc2V0IG5vdCBzdXBwb3J0ZWQsIG11c3QgYmUgZXF1YWwgdG8gZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODIKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCA9IHNldHRsZW1lbnRfYXNzZXRfaWQKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODMtNzg5CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODgKICAgIC8vIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODYKICAgIC8vIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Nzg3CiAgICAvLyBhc3NldF9hbW91bnQ9MCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODMtNzg0CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc4My03ODkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gc2V0dGxlbWVudCB3aXRoIEFTQQogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PTAsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTEtODEyCiAgICAvLyAjIFVuaXRzCiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzID0gdGVybXMudG90YWxfdW5pdHMKICAgIGR1cAogICAgcHVzaGludCAxNwogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTMKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDEwIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODE1LTgxNgogICAgLy8gIyBEYXktQ291bnQgQ29udmVudGlvbnMKICAgIC8vIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPSB0ZXJtcy5kYXlfY291bnRfY29udmVudGlvbi5hc191aW50NjQoKQogICAgYnl0ZWMgNDYgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgZGlnIDgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTgtODE5CiAgICAvLyAjIFRpbWUKICAgIC8vIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlID0gdGVybXMuaW5pdGlhbF9leGNoYW5nZV9kYXRlCiAgICBkdXAKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAyNiAvLyAiaW5pdGlhbF9leGNoYW5nZV9kYXRlIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MjAKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IHRlcm1zLm1hdHVyaXR5X2RhdGUKICAgIGRpZyAxCiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNDUgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgyMQogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gaW5pdGlhbF9zdGF0ZS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBkaWcgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBwdXNoaW50IDQ4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODIzLTgyNAogICAgLy8gIyBQcmluY2lwYWwKICAgIC8vIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPSB0ZXJtcy5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudAogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgZGlnIDEwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODI1CiAgICAvLyBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSB0ZXJtcy5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBkaWcgMwogICAgcHVzaGludCA3ODYKICAgIGdldGJpdAogICAgYnl0ZWMgMzQgLy8gImR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODI2CiAgICAvLyBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9IGluaXRpYWxfc3RhdGUub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBkaWcgMQogICAgcHVzaGludCAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjXzMgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MjgtODI5CiAgICAvLyAjIEludGVyZXN0CiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgPSBpbml0aWFsX3N0YXRlLmFjY3J1ZWRfaW50ZXJlc3QKICAgIGRpZyAxCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MzEtODMyCiAgICAvLyAjIEludGVyZXN0IFJhdGUKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gaW5pdGlhbF9zdGF0ZS5ub21pbmFsX2ludGVyZXN0X3JhdGUKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODMzCiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBpbml0aWFsX3N0YXRlLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UKICAgIGRpZyAxCiAgICBwdXNoaW50IDI0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MzQKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQgPSB0ZXJtcy5yYXRlX3Jlc2V0X3NwcmVhZAogICAgZGlnIDMKICAgIHB1c2hpbnQgNTgKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzNSAvLyAicmF0ZV9yZXNldF9zcHJlYWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODM1CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciA9IHRlcm1zLnJhdGVfcmVzZXRfbXVsdGlwbGllcgogICAgZGlnIDMKICAgIHB1c2hpbnQgNjYKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzNiAvLyAicmF0ZV9yZXNldF9tdWx0aXBsaWVyIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzNgogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X2Zsb29yID0gdGVybXMucmF0ZV9yZXNldF9mbG9vcgogICAgZGlnIDMKICAgIHB1c2hpbnQgNzQKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAyOSAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MzcKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9jYXAgPSB0ZXJtcy5yYXRlX3Jlc2V0X2NhcAogICAgZGlnIDMKICAgIHB1c2hpbnQgODIKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzMCAvLyAicmF0ZV9yZXNldF9jYXAiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODM4CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfbmV4dCA9IHRlcm1zLnJhdGVfcmVzZXRfbmV4dAogICAgZGlnIDMKICAgIHB1c2hpbnQgOTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzNyAvLyAicmF0ZV9yZXNldF9uZXh0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzOQogICAgLy8gc2VsZi5oYXNfcmF0ZV9yZXNldF9mbG9vciA9IHRlcm1zLmhhc19yYXRlX3Jlc2V0X2Zsb29yCiAgICBkaWcgMwogICAgcHVzaGludCA3ODQKICAgIGdldGJpdAogICAgYnl0ZWMgMzggLy8gImhhc19yYXRlX3Jlc2V0X2Zsb29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0MAogICAgLy8gc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgPSB0ZXJtcy5oYXNfcmF0ZV9yZXNldF9jYXAKICAgIGRpZyAzCiAgICBwdXNoaW50IDc4NQogICAgZ2V0Yml0CiAgICBieXRlYyAzOSAvLyAiaGFzX3JhdGVfcmVzZXRfY2FwIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0Mi04NDMKICAgIC8vICMgU2NhbGluZwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSA9IHRlcm1zLmZpeGVkX3BvaW50X3NjYWxlCiAgICB1bmNvdmVyIDMKICAgIHB1c2hpbnQgOTkKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDUtODQ2CiAgICAvLyAjIFNjaGVkdWxlIFByb2Nlc3NpbmcKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yID0gaW5pdGlhbF9zdGF0ZS5ldmVudF9jdXJzb3IKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDgtODQ5CiAgICAvLyAjIFBlci1Vbml0IEZpeGVkLVBvaW50IEluZGV4ZXMKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCA9IGluaXRpYWxfc3RhdGUuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleAogICAgZGlnIDEKICAgIHB1c2hpbnQgNTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NTAKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggPSBpbml0aWFsX3N0YXRlLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4CiAgICBkaWcgMQogICAgcHVzaGludCA2NAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NTItODUzCiAgICAvLyAjIFJlc2VydmVkIEFtb3VudCAoZm9yIGV4ZWN1dGVkIGNhc2hmbG93cykKICAgIC8vIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU0CiAgICAvLyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU2CiAgICAvLyBhc3NlcnQgdGVybXMuaW5pdGlhbF9leGNoYW5nZV9kYXRlID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsIGVyci5JTlZBTElEX0lFRAogICAgZGlnIDIKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgID4KICAgIGFzc2VydCAvLyBJRUQgbXVzdCBiZSBzZXQgaW4gdGhlIGZ1dHVyZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU3CiAgICAvLyBhc3NlcnQgdGVybXMuaW5pdGlhbF9leGNoYW5nZV9kYXRlID4gaW5pdGlhbF9zdGF0ZS5zdGF0dXNfZGF0ZSwgZXJyLklOVkFMSURfSUVECiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICA8CiAgICBhc3NlcnQgLy8gSUVEIG11c3QgYmUgc2V0IGluIHRoZSBmdXR1cmUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg1OAogICAgLy8gYXNzZXJ0IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA8IHRlcm1zLm1hdHVyaXR5X2RhdGUsIGVyci5JTlZBTElEX0lFRAogICAgPAogICAgYXNzZXJ0IC8vIElFRCBtdXN0IGJlIHNldCBpbiB0aGUgZnV0dXJlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDE5LTEwMjAKICAgIC8vICMgTm90YXJpemUgcHJvc3BlY3R1cyAob3B0aW9uYWwpCiAgICAvLyBzZWxmLnByb3NwZWN0dXNfaGFzaCA9IHByb3NwZWN0dXMuaGFzaC5ieXRlcwogICAgZGlnIDIKICAgIGV4dHJhY3QgMCAzMgogICAgYnl0ZWMgNDIgLy8gInByb3NwZWN0dXNfaGFzaCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDIxCiAgICAvLyBzZWxmLnByb3NwZWN0dXNfdXJsID0gcHJvc3BlY3R1cy51cmwKICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgYnl0ZWMgNDMgLy8gInByb3NwZWN0dXNfdXJsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMjIKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNvbnRyYWN0X2NvbmZpZ19ib29sX2ZhbHNlQDE3OgogICAgaW50Y18wIC8vIDAKICAgIGIgY29udHJhY3RfY29uZmlnX2Jvb2xfbWVyZ2VAMTgKCmNvbnRyYWN0X2NvbmZpZ19ib29sX2ZhbHNlQDg6CiAgICBpbnRjXzAgLy8gMAogICAgYiBjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUA5CgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3Rfc2NoZWR1bGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9zY2hlZHVsZToKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAyNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBzd2FwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgMwogICAgZHVwCiAgICBwdXNoaW50IDY1CiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIHVuY292ZXIgMgogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8c21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5FeGVjdXRpb25TY2hlZHVsZUVudHJ5PgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAzOQogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDQyCiAgICAvLyBjb250cmFjdF90eXBlPXNlbGYuY29udHJhY3RfdHlwZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBjb3ZlciAzCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODc0CiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIEQtQVNBIGFscmVhZHkgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODc1LTg3NwogICAgLy8gYXNzZXJ0IHNjaGVkdWxlX3BhZ2UubGVuZ3RoIDw9IFVJbnQ2NCgKICAgIC8vICAgICBjc3QuU0NIRURVTEVfUEFHRV9TSVpFCiAgICAvLyApLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBkdXAKICAgIHB1c2hpbnQgMTYKICAgIDw9CiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NzgKICAgIC8vIGFzc2VydCBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID4gVUludDY0KDApLCBlcnIuVEVSTVNfTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMCAvLyAiaW5pdGlhbF9leGNoYW5nZV9hbW91bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0EgdGVybXMgbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg4MAogICAgLy8gcGFnZV9jdXJzb3IgPSBzY2hlZHVsZV9wYWdlX2luZGV4ICogVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpCiAgICBzd2FwCiAgICBwdXNoaW50IDE2CiAgICAqCiAgICBzd2FwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4ODcKICAgIC8vICsgcGFnZV9sZW5ndGggKiBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19QRVJfRU5UUllfQlVER0VUKQogICAgcHVzaGludCAxMDAKICAgICoKICAgIHB1c2hpbnQgMTUxMAogICAgKwoKY29udHJhY3Rfc2NoZWR1bGVfd2hpbGVfdG9wQDI6CiAgICBkdXAKICAgIGdsb2JhbCBPcGNvZGVCdWRnZXQKICAgID4KICAgIGJ6IGNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX3doaWxlQDUKICAgIGl0eG5fYmVnaW4KICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBwdXNoaW50IDUgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICBieXRlYyA0NyAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW0KICAgIGJ5dGVjIDQ3IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBiIGNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEAyCgpjb250cmFjdF9zY2hlZHVsZV9hZnRlcl93aGlsZUA1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODkwCiAgICAvLyBpbmRleCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTAKCmNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODkxCiAgICAvLyB3aGlsZSBpbmRleCA8IHBhZ2VfbGVuZ3RoOgogICAgZGlnIDkKICAgIGRpZyA0CiAgICA8CiAgICBieiBjb250cmFjdF9zY2hlZHVsZV9hZnRlcl93aGlsZUAxNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODkyLTg5MwogICAgLy8gZW50cnkgPSBzY2hlZHVsZV9wYWdlW2luZGV4XS5jb3B5KCkKICAgIC8vIGVudHJ5X2V2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBkaWcgNAogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgYnVyeSAxMwogICAgZGlnIDEwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgNjUKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODkzCiAgICAvLyBlbnRyeV9ldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTItODkzCiAgICAvLyBlbnRyeSA9IHNjaGVkdWxlX3BhZ2VbaW5kZXhdLmNvcHkoKQogICAgLy8gZW50cnlfZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGludGNfMiAvLyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTMKICAgIC8vIGVudHJ5X2V2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBnZXRieXRlCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgMTQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg5NAogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X2lkID09IHBhZ2VfY3Vyc29yICsgaW5kZXgsIGVyci5JTlZBTElEX0VWRU5UX0lECiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEzCiAgICBkaWcgNQogICAgdW5jb3ZlciA0CiAgICArCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTUtODk3CiAgICAvLyBzZWxmLl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBlbnRyeV9ldmVudF90eXBlCiAgICAvLyApCiAgICBkaWcgNQogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODk4CiAgICAvLyBhc3NlcnQgZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgc3dhcAogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTkKICAgIC8vIGlmIGVudHJ5LmV2ZW50X2lkID4gVUludDY0KDApOgogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTAwCiAgICAvLyBpZiBpbmRleCA+IFVJbnQ2NCgwKToKICAgIGRpZyA5CiAgICBieiBjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlAMTAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkwMQogICAgLy8gcHJldmlvdXNfZW50cnkgPSBzY2hlZHVsZV9wYWdlW2luZGV4IC0gVUludDY0KDEpXS5jb3B5KCkKICAgIGRpZyA5CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgcHVzaGludCA2NQogICAgKgogICAgZGlnIDEyCiAgICBzd2FwCiAgICBwdXNoaW50IDY1CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTYKICAgIC8vIHByZXZpb3VzX2VudHJ5LnNjaGVkdWxlZF90aW1lIDw9IGVudHJ5LnNjaGVkdWxlZF90aW1lCiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgOAogICAgPD0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkxNS05MTcKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgcHJldmlvdXNfZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gZW50cnkuc2NoZWR1bGVkX3RpbWUKICAgIC8vICksIGVyci5JTlZBTElEX1NPUlRJTkcKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBtdXN0IGJlIHNvcnRlZCBpbiBzdHJpY3RseSBhc2NlbmRpbmcgb3JkZXIKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTgKICAgIC8vIGlmIGVudHJ5LmV2ZW50X2lkID09IFVJbnQ2NCgwKToKICAgIGRpZyA4CiAgICBibnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTE5LTkyMQogICAgLy8gYXNzZXJ0IGVudHJ5X2V2ZW50X3R5cGUgPT0gVUludDY0KAogICAgLy8gICAgIGVudW1zLkVWVF9JRUQKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZGlnIDEwCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjIKICAgIC8vIGluZGV4ICs9IFVJbnQ2NCgxKQogICAgZGlnIDkKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEwCiAgICBiIGNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEA2Cgpjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlAMTA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDMtOTA1CiAgICAvLyAjIFRoZSBmaXJzdCBlbnRyeSBvZiBhIHBhZ2UgbXVzdCBzdGlsbCBiZSBvcmRlcmVkIGFmdGVyIHRoZQogICAgLy8gIyBsYXN0IGVudHJ5IG9mIHRoZSBwcmV2aW91cyBwYWdlLgogICAgLy8gYXNzZXJ0IHNjaGVkdWxlX3BhZ2VfaW5kZXggPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0VWRU5UX0lECiAgICBkaWcgNgogICAgZHVwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBpZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTA2CiAgICAvLyBwcmV2aW91c19wYWdlX2luZGV4ID0gc2NoZWR1bGVfcGFnZV9pbmRleCAtIFVJbnQ2NCgxKQogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkwOAogICAgLy8gcHJldmlvdXNfcGFnZV9pbmRleCBpbiBzZWxmLnNjaGVkdWxlX3BhZ2UKICAgIGl0b2IKICAgIGJ5dGVjIDMxIC8vIDB4NTMyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTA3LTkwOQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBwcmV2aW91c19wYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZQogICAgLy8gKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTEwLTkxMQogICAgLy8gcHJldmlvdXNfcGFnZSA9IHNlbGYuc2NoZWR1bGVfcGFnZVtwcmV2aW91c19wYWdlX2luZGV4XS5jb3B5KCkKICAgIC8vIGFzc2VydCBwcmV2aW91c19wYWdlLmxlbmd0aCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGludCAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTExCiAgICAvLyBhc3NlcnQgcHJldmlvdXNfcGFnZS5sZW5ndGggPiBVSW50NjQoMCksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGR1cAogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTEzCiAgICAvLyBwcmV2aW91c19wYWdlLmxlbmd0aCAtIFVJbnQ2NCgxKQogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkxMi05MTQKICAgIC8vIHByZXZpb3VzX2VudHJ5ID0gcHJldmlvdXNfcGFnZVsKICAgIC8vICAgICBwcmV2aW91c19wYWdlLmxlbmd0aCAtIFVJbnQ2NCgxKQogICAgLy8gXS5jb3B5KCkKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgMgogICAgKwogICAgcHVzaGludCA2NQogICAgYm94X2V4dHJhY3QKICAgIGIgY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxMQoKY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfd2hpbGVAMTU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMDAKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHNjaGVkdWxlX3BhZ2UuY29weSgpCiAgICBkaWcgNgogICAgaXRvYgogICAgYnl0ZWMgMzEgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBkaWcgNQogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTI1CiAgICAvLyBpZiBpc19sYXN0X3BhZ2U6CiAgICBkaWcgNQogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxNwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTI3CiAgICAvLyBzY2hlZHVsZV9wYWdlX2luZGV4ICogVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpICsgcGFnZV9sZW5ndGgKICAgIGRpZyAxCiAgICBkaWcgNAogICAgKwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTI2CiAgICAvLyBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50ID0gKAogICAgYnl0ZWMgNCAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjYtOTI4CiAgICAvLyBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50ID0gKAogICAgLy8gICAgIHNjaGVkdWxlX3BhZ2VfaW5kZXggKiBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkgKyBwYWdlX2xlbmd0aAogICAgLy8gKQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkyOQogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgcHVzaGludCA1MAogICAgYXBwX2dsb2JhbF9wdXQKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDQ3CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmNvbnRyYWN0X2V4ZWN1dGVfaWVkW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfZXhlY3V0ZV9pZWQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA1NwogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDU4CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA1OQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNjEKICAgIC8vIGFzc2VydCBzZWxmLmV2ZW50X2N1cnNvciA8IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICBkaWcgMQogICAgPgogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgY3Vyc29yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDYyCiAgICAvLyBlbnRyeSA9IHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLmV2ZW50X2N1cnNvcikKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2MwogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X3R5cGUgPT0gYXJjNC5VSW50OChlbnVtcy5FVlRfSUVEKSwgZXJyLklOVkFMSURfRVZFTlRfVFlQRQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgZHVwCiAgICBwdXNoYnl0ZXMgMHgwMQogICAgYj09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCB0eXBlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDY3CiAgICAvLyBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIGRpZyAxCiAgICBleHRyYWN0IDAgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2OQogICAgLy8gc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICBkaWcgMgogICAgZXh0cmFjdCA5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNzAKICAgIC8vIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgZGlnIDMKICAgIGV4dHJhY3QgMTcgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3MQogICAgLy8gcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZGlnIDQKICAgIGV4dHJhY3QgMjUgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3MwogICAgLy8gbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9ZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBkaWcgNQogICAgZXh0cmFjdCAzMyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc0CiAgICAvLyBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICBkaWcgNgogICAgZXh0cmFjdCA0MSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc1CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1lbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIGRpZyA3CiAgICBleHRyYWN0IDQ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNzYKICAgIC8vIGZsYWdzPWVudHJ5LmZsYWdzLAogICAgZGlnIDgKICAgIGV4dHJhY3QgNTcgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2Ni0xMDc3CiAgICAvLyB0eXAuT2JzZXJ2ZWRFdmVudFJlcXVlc3QoCiAgICAvLyAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBvYnNlcnZlZF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1lbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9ZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9ZW50cnkuZmxhZ3MsCiAgICAvLyApLAogICAgdW5jb3ZlciA3CiAgICB1bmNvdmVyIDgKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3MgogICAgLy8gb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2Ni0xMDc3CiAgICAvLyB0eXAuT2JzZXJ2ZWRFdmVudFJlcXVlc3QoCiAgICAvLyAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBvYnNlcnZlZF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1lbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9ZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9ZW50cnkuZmxhZ3MsCiAgICAvLyApLAogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNjQtMTA3OAogICAgLy8gc2VsZi5fYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkoCiAgICAvLyAgICAgZW50cnksCiAgICAvLyAgICAgdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0KAogICAgLy8gICAgICAgICBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIC8vICAgICAgICAgZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgLy8gICAgICAgICBzY2hlZHVsZWRfdGltZT1lbnRyeS5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICAgICAgYWNjcnVhbF9mYWN0b3I9ZW50cnkuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICAgICAgb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPWVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPWVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgICAgICBmbGFncz1lbnRyeS5mbGFncywKICAgIC8vICAgICApLAogICAgLy8gKQogICAgY2FsbHN1YiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkKICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3OQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDQ5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5hcHBseV9ub25fY2FzaF9ldmVudFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFwcGx5X25vbl9jYXNoX2V2ZW50OgogICAgaW50Y18wIC8vIDAKICAgIGR1cG4gNAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwODEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwbiAyCiAgICBsZW4KICAgIHB1c2hpbnQgNzMKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuT2JzZXJ2ZWRFdmVudFJlcXVlc3QKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDk1CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA5NgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwOTgKICAgIC8vIGlmIHBheWxvYWQuZmxhZ3MgJiBVSW50NjQoZW51bXMuRkxBR19PQlNFUlZFRF9FVkVOVCk6CiAgICBwdXNoaW50IDY1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBwdXNoaW50IDQKICAgICYKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjMzCiAgICAvLyByZXR1cm4gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9DTE0pCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIHB1c2hpbnQgNQogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwOTkKICAgIC8vIGFzc2VydCBzZWxmLl9zdXBwb3J0c19vYnNlcnZlZF9ldmVudHMoKSwgZXJyLk9CU0VSVkVEX0VWRU5UX1JFUVVJUkVECiAgICBhc3NlcnQgLy8gT2JzZXJ2ZWQgZXZlbnQgcmVxdWlyZWQgdG8gZXhlY3V0ZSB0aGlzIGFjdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEwMAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMzMKICAgIC8vIHJldHVybiBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0NMTSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgZHVwCiAgICBwdXNoaW50IDUKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MzgKICAgIC8vIGFzc2VydCBzZWxmLl9zdXBwb3J0c19vYnNlcnZlZF9ldmVudHMoKSwgZXJyLk9CU0VSVkVEX0VWRU5UX1JFUVVJUkVECiAgICBhc3NlcnQgLy8gT2JzZXJ2ZWQgZXZlbnQgcmVxdWlyZWQgdG8gZXhlY3V0ZSB0aGlzIGFjdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTM5CiAgICAvLyBhc3NlcnQgcGF5bG9hZC5ldmVudF9pZCA9PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LCBlcnIuSU5WQUxJRF9FVkVOVF9JRAogICAgZGlnIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgNwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NDEKICAgIC8vIHNlbGYuY29udHJhY3RfdHlwZSwgcGF5bG9hZC5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBkdXAKICAgIGV4dHJhY3QgOCAxCiAgICBidXJ5IDEyCiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQwLTk0MgogICAgLy8gc2VsZi5fYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgc2VsZi5jb250cmFjdF90eXBlLCBwYXlsb2FkLmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIC8vICkKICAgIGNhbGxzdWIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NDQKICAgIC8vIHBhZ2VfaW5kZXggPSBzZWxmLl9zY2hlZHVsZV9wYWdlX2luZGV4KHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxOTAKICAgIC8vIHJldHVybiBldmVudF9pZCAvLyBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkKICAgIHB1c2hpbnQgMTYKICAgIC8KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk0NQogICAgLy8gcGFnZSA9IHR5cC5FeGVjdXRpb25TY2hlZHVsZVBhZ2UoKQogICAgcHVzaGJ5dGVzIDB4MDAwMAogICAgYnVyeSA3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NDYKICAgIC8vIGlmIHBhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlOgogICAgaXRvYgogICAgYnl0ZWMgMzEgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA5CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMjcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk0NwogICAgLy8gcGFnZSA9IHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XS5jb3B5KCkKICAgIGRpZyA3CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidXJ5IDcKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX3BhZ2UgZW50cnkgZXhpc3RzCgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDI3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQ4CiAgICAvLyBhc3NlcnQgcGFnZS5sZW5ndGggPCBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGRpZyA1CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgMTYKICAgIDwKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1MwogICAgLy8gc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIGRpZyAzCiAgICBkdXAKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTQKICAgIC8vIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICBkaWcgMQogICAgZXh0cmFjdCAxNyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTUKICAgIC8vIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZGlnIDIKICAgIGV4dHJhY3QgMjUgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTU2CiAgICAvLyBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDMKICAgIGV4dHJhY3QgNDEgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTU3CiAgICAvLyBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIGRpZyA0CiAgICBleHRyYWN0IDQ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1OAogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIHVuY292ZXIgNQogICAgZXh0cmFjdCA1NyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTAtOTYwCiAgICAvLyB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1wYXlsb2FkLmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9cGF5bG9hZC5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPXBheWxvYWQucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXBheWxvYWQubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICkKICAgIGRpZyAxMQogICAgaXRvYgogICAgZGlnIDE4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMwogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NDktOTYxCiAgICAvLyBwYWdlLmFwcGVuZCgKICAgIC8vICAgICB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9cGF5bG9hZC5ldmVudF9pZCwKICAgIC8vICAgICAgICAgZXZlbnRfdHlwZT1wYXlsb2FkLmV2ZW50X3R5cGUsCiAgICAvLyAgICAgICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIC8vICAgICAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICAgICApCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjIKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHBhZ2UuY29weSgpCiAgICBkaWcgOAogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2MwogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTAzCiAgICAvLyBhc3NlcnQgZXZlbnRfaWQgPT0gc2VsZi5ldmVudF9jdXJzb3IsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBjdXJzb3IKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMDQKICAgIC8vIGVudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KGV2ZW50X2lkKQogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEwNgogICAgLy8gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgYnVyeSAxMAogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjQKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY1CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzYzLTM3MAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9SUiksCiAgICBwdXNoaW50IDEyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY3CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICBwdXNoaW50IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY4CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgcHVzaGludCAxOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzYzLTM3MAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBieiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX2ZhbHNlQDE2CgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX3RydWVAMTU6CiAgICBpbnRjXzEgLy8gMQoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9tZXJnZUAxNzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMDUtMTEwNwogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2lzX25vbl9jYXNoKAogICAgLy8gICAgIGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIC8vICksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IHR5cGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMDgKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlICE9IGFyYzQuVUludDgoZW51bXMuRVZUX0lFRCksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGRpZyA4CiAgICBwdXNoYnl0ZXMgMHgwMQogICAgYiE9CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCB0eXBlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNzQKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluIChVSW50NjQoZW51bXMuRVZUX1JSKSwgVUludDY0KGVudW1zLkVWVF9SUkYpKQogICAgZGlnIDQKICAgIHB1c2hpbnQgMTIKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDIxCiAgICBkaWcgNAogICAgcHVzaGludCAxMQogICAgPT0KICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfZmFsc2VAMjIKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAyMToKICAgIGludGNfMSAvLyAxCgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX21lcmdlQDIzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEwOQogICAgLy8gaWYgc2VsZi5fZXZlbnRfaXNfcmF0ZV9yZXNldChlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpKToKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Vsc2VfYm9keUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODAKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLm9ic2VydmVyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjQgLy8gMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTEzCiAgICAvLyBzZWxmLl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeShlbnRyeSwgcGF5bG9hZCkKICAgIGRpZyA2CiAgICBkaWcgMgogICAgY2FsbHN1YiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkKICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTExNAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDgxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Vsc2VfYm9keUA1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTExMgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICBiIGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VANgoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9mYWxzZUAyMjoKICAgIGludGNfMCAvLyAwCiAgICBiIGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfbWVyZ2VAMjMKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfZmFsc2VAMTY6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX21lcmdlQDE3CgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfZ2V0X3N0YXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfZ2V0X3N0YXRlOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBkdXAKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEyMQogICAgLy8gY29udHJhY3RfdHlwZT1hcmM0LlVJbnQ4KHNlbGYuY29udHJhY3RfdHlwZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzIgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMjMKICAgIC8vIHRvdGFsX3VuaXRzPXNlbGYudG90YWxfdW5pdHMsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEyNAogICAgLy8gcmVzZXJ2ZWRfdW5pdHNfdG90YWw9c2VsZi5yZXNlcnZlZF91bml0c190b3RhbCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTI1CiAgICAvLyBpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudD1zZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMjYKICAgIC8vIGV2ZW50X2N1cnNvcj1zZWxmLmV2ZW50X2N1cnNvciwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEyNwogICAgLy8gc2NoZWR1bGVfZW50cnlfY291bnQ9c2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMjgKICAgIC8vIG91dHN0YW5kaW5nX3ByaW5jaXBhbD1zZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEyOQogICAgLy8gaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZT1zZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEzMAogICAgLy8gbm9taW5hbF9pbnRlcmVzdF9yYXRlPXNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTMxCiAgICAvLyBhY2NydWVkX2ludGVyZXN0PXNlbGYuYWNjcnVlZF9pbnRlcmVzdCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTMyCiAgICAvLyBjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4PXNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEzMwogICAgLy8gY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXg9c2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTM0CiAgICAvLyByZXNlcnZlZF9pbnRlcmVzdD1zZWxmLnJlc2VydmVkX2ludGVyZXN0LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMzUKICAgIC8vIHJlc2VydmVkX3ByaW5jaXBhbD1zZWxmLnJlc2VydmVkX3ByaW5jaXBhbCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMjAtMTEzNgogICAgLy8gcmV0dXJuIHR5cC5LZXJuZWxTdGF0ZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlPWFyYzQuVUludDgoc2VsZi5jb250cmFjdF90eXBlKSwKICAgIC8vICAgICBzdGF0dXM9c2VsZi5zdGF0dXMsCiAgICAvLyAgICAgdG90YWxfdW5pdHM9c2VsZi50b3RhbF91bml0cywKICAgIC8vICAgICByZXNlcnZlZF91bml0c190b3RhbD1zZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsLAogICAgLy8gICAgIGluaXRpYWxfZXhjaGFuZ2VfYW1vdW50PXNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQsCiAgICAvLyAgICAgZXZlbnRfY3Vyc29yPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgLy8gICAgIHNjaGVkdWxlX2VudHJ5X2NvdW50PXNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQsCiAgICAvLyAgICAgb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2U9c2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlLAogICAgLy8gICAgIG5vbWluYWxfaW50ZXJlc3RfcmF0ZT1zZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBhY2NydWVkX2ludGVyZXN0PXNlbGYuYWNjcnVlZF9pbnRlcmVzdCwKICAgIC8vICAgICBjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4PXNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCwKICAgIC8vICAgICBjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleD1zZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4LAogICAgLy8gICAgIHJlc2VydmVkX2ludGVyZXN0PXNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QsCiAgICAvLyAgICAgcmVzZXJ2ZWRfcHJpbmNpcGFsPXNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsLAogICAgLy8gKQogICAgdW5jb3ZlciAxNAogICAgaXRvYgogICAgdW5jb3ZlciAxNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDEzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDEwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgOQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDgKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTE2CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnRbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE0MgogICAgLy8gaWYgc2VsZi5ldmVudF9jdXJzb3IgPj0gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgPj0KICAgIGJ6IGNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDQKICAgIC8vIGV2ZW50X2lkPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTQzLTExNTMKICAgIC8vIHJldHVybiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1zZWxmLmV2ZW50X2N1cnNvciwKICAgIC8vICAgICBldmVudF90eXBlPWFyYzQuVUludDgoMCksCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9VUludDY0KDApLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9VUludDY0KDApLAogICAgLy8gICAgIGZsYWdzPVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGl0b2IKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDUKICAgIC8vIGV2ZW50X3R5cGU9YXJjNC5VSW50OCgwKSwKICAgIGJ5dGVjIDQwIC8vIDB4MDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDMtMTE1MwogICAgLy8gcmV0dXJuIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgIGV2ZW50X2lkPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgLy8gICAgIGV2ZW50X3R5cGU9YXJjNC5VSW50OCgwKSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1VSW50NjQoMCksCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1VSW50NjQoMCksCiAgICAvLyAgICAgZmxhZ3M9VUludDY0KDApLAogICAgLy8gKQogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTQ2CiAgICAvLyBzY2hlZHVsZWRfdGltZT1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE0My0xMTUzCiAgICAvLyByZXR1cm4gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkoCiAgICAvLyAgICAgZXZlbnRfaWQ9c2VsZi5ldmVudF9jdXJzb3IsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1hcmM0LlVJbnQ4KDApLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPVVJbnQ2NCgwKSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249VUludDY0KDApLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPVVJbnQ2NCgwKSwKICAgIC8vICAgICBmbGFncz1VSW50NjQoMCksCiAgICAvLyApCiAgICBpdG9iCiAgICBzd2FwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKCmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudF9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudEA0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEzOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpjb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1NAogICAgLy8gcmV0dXJuIHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLmV2ZW50X2N1cnNvcikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50QDQKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5jb250cmFjdF91cGRhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF91cGRhdGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTUzLTE1NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGdyYW50cyB0aGUgdXBkYXRlIHBlcm1pc3Npb25zIHRvIHRoZSBBcnJhbmdlci4KICAgIC8vICMg4pqg77iPIFdBUk5JTkc6IEFwcGxpY2F0aW9uIHVwZGF0ZXMgbXVzdCBiZSBleGVjdXRlZCBWRVJZIGNhcmVmdWxseSwgYXMgdGhleQogICAgLy8gIyBtaWdodCBpbnRyb2R1Y2UgYnJlYWtpbmcgY2hhbmdlcy4KICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfcm90YXRlX2FycmFuZ2VyW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19yb3RhdGVfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2OQogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTcwCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gbmV3X2FycmFuZ2VyCiAgICBieXRlYyAxOCAvLyAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTcxCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfc2V0X29wX2RhZW1vbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfc2V0X29wX2RhZW1vbjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTg0CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODUKICAgIC8vIHNlbGYub3BfZGFlbW9uLnZhbHVlID0gYWRkcmVzcwogICAgYnl0ZWMgMjUgLy8gMHg1MjIzNGY3MDQ0NjE2NTZkNmY2ZTIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4NgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTczCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2Fzc2lnbl9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19hc3NpZ25fcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDE2CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLlJvbGVWYWxpZGl0eQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjExCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMgogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgcHVzaGludCAyMAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTAzCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gcm9sZV9hZGRyZXNzCiAgICBieXRlYyAxOCAvLyAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMKICAgIGRpZyAzCiAgICBhcHBfZ2xvYmFsX3B1dAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTQKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDYKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIGR1cAogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnRfbWFuYWdlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMyAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwOAogICAgLy8gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMiAvLyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTIKICAgIC8vIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIGR1cAogICAgcHVzaGludCA2MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE1CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMzIgLy8gMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE2CiAgICAvLyBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExOAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMSAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIwCiAgICAvLyBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMwogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgODAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIzCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI0IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI0CiAgICAvLyBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3Jldm9rZV9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19yZXZva2Vfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzUKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzNgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzcKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCkpCiAgICBidG9pCiAgICBkdXBuIDIKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCAhPSBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksIGVyci5JTlZBTElEX1JPTEUKICAgIGR1cAogICAgcHVzaGludCAyMAogICAgIT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyOAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIzIC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0NGQ2MTZlNjE2NzY1NzIyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMwCiAgICAvLyBkZWwgc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzOQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjE2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIyIC8vIDB4NTIyMzUwNzI2OTZkNjE3Mjc5NDQ2NTYxNmM2NTcyMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNAogICAgLy8gZGVsIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjM4CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIGR1cAogICAgcHVzaGludCA2MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAzMiAvLyAweDUyMjM1NDcyNzU3Mzc0NjU2NTIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzgKICAgIC8vIGRlbCBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjM4CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDEKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hdXRob3JpdHksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjEgLy8gMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MgogICAgLy8gZGVsIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzOAogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDQKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDgwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI0IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ2CiAgICAvLyBkZWwgc2VsZi5vYnNlcnZlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfY29udHJhY3Rfc3VzcGVuc2lvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfY29udHJhY3Rfc3VzcGVuc2lvbjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCAgIyBUT0RPOiBVcGRhdGUgc3BlY3MgYW5kIGFkZCB0ZXN0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojc3CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyMSAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1NwogICAgLy8gc2VsZi5hc3NldF9zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGJ5dGVjIDMzIC8vICJhc3NldF9zdXNwZW5kZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1OAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QgICMgVE9ETzogVXBkYXRlIHNwZWNzIGFuZCBhZGQgdGVzdAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X2FycmFuZ2VyW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjY4CiAgICAvLyByZXR1cm4gc2VsZi5hcnJhbmdlci52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE4IC8vIDB4NTIyMzQxNzI3MjYxNmU2NzY1NzIyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI2MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYWRkcmVzc19yb2xlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjcwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4NAogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hY2NvdW50X21hbmFnZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjMgLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQ0ZDYxNmU2MTY3NjU3MjIzCiAgICBkaWcgMQogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODUKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYucHJpbWFyeV9kZWFsZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjIgLy8gMHg1MjIzNTA3MjY5NmQ2MTcyNzk0NDY1NjE2YzY1NzIyMwogICAgZGlnIDIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg2CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnRydXN0ZWUsIGFkZHJlc3MpLAogICAgYnl0ZWMgMzIgLy8gMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMwogICAgZGlnIDMKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg3CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgYWRkcmVzcyksCiAgICBieXRlYyAyMSAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgZGlnIDQKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg4CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLm9ic2VydmVyLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDI0IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgdW5jb3ZlciA1CiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlYyA0MCAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciA2CiAgICBzZXRiaXQKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDUKICAgIHNldGJpdAogICAgcHVzaGludCAyCiAgICB1bmNvdmVyIDQKICAgIHNldGJpdAogICAgcHVzaGludCAzCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgcHVzaGludCA0CiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwNQogICAgLy8gcm9sZSA9IHJvbGVfaWQuYXNfdWludDY0KCkKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDYKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGUpCiAgICBkdXAKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA4CiAgICAvLyBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKToKICAgIHB1c2hpbnRzIDIwIDQwIDUwIDYwIDcwIDgwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA3LTMzOAogICAgLy8gbWF0Y2ggcm9sZToKICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKToKICAgIC8vICAgICAgICAgcmV0dXJuIHR5cC5Sb2xlVmFsaWRpdHkoCiAgICAvLyAgICAgICAgICAgICByb2xlX3ZhbGlkaXR5X3N0YXJ0PVVJbnQ2NCgwKSwgcm9sZV92YWxpZGl0eV9lbmQ9VUludDY0KDApCiAgICAvLyAgICAgICAgICkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSk6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSk6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgXzoKICAgIC8vICAgICAgICAgb3AuZXJyKGVyci5JTlZBTElEX1JPTEUpCiAgICB1bmNvdmVyIDYKICAgIG1hdGNoIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMEAyIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMUAzIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMkA0IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfM0A1IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNEA2IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzM4CiAgICAvLyBvcC5lcnIoZXJyLklOVkFMSURfUk9MRSkKICAgIGVyciAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV81QDc6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzM0CiAgICAvLyBzZWxmLm9ic2VydmVyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDI0IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMzMy0zMzUKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLm9ic2VydmVyLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzYKICAgIC8vIHJldHVybiBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV80QDY6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI5CiAgICAvLyBzZWxmLmF1dGhvcml0eSwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAyMSAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOC0zMzAKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLmF1dGhvcml0eSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzMxCiAgICAvLyByZXR1cm4gc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8zQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI0CiAgICAvLyBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMzIgLy8gMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMy0zMjUKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyNgogICAgLy8gcmV0dXJuIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzJANDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTkKICAgIC8vIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMjIgLy8gMHg1MjIzNTA3MjY5NmQ2MTcyNzk0NDY1NjE2YzY1NzIyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxOC0zMjAKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLnByaW1hcnlfZGVhbGVyLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjEKICAgIC8vIHJldHVybiBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMUAzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxNAogICAgLy8gc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMjMgLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQ0ZDYxNmU2MTY3NjU3MjIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEzLTMxNQogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTYKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzBAMjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDktMzExCiAgICAvLyByZXR1cm4gdHlwLlJvbGVWYWxpZGl0eSgKICAgIC8vICAgICByb2xlX3ZhbGlkaXR5X3N0YXJ0PVVJbnQ2NCgwKSwgcm9sZV92YWxpZGl0eV9lbmQ9VUludDY0KDApCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB2b2lkOgpfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZDoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNgogICAgLy8gZGVmIF9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHNlbGYsIGhvbGRpbmdfYWRkcmVzczogQWNjb3VudCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI4CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZCwgZXJyLlNVU1BFTkRFRAogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHB1c2hpbnQgMzg0CiAgICBnZXRiaXQKICAgICEKICAgIGFzc2VydCAvLyBTdXNwZW5kZWQgb3BlcmF0aW9ucwogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuX3NldHRsZV9wb3NpdGlvbihob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB1aW50NjQsIHVpbnQ2NDoKX3NldHRsZV9wb3NpdGlvbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo0NAogICAgLy8gZGVmIF9zZXR0bGVfcG9zaXRpb24oc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50KSAtPiB0dXBsZVtVSW50NjQsIFVJbnQ2NF06CiAgICBwcm90byAxIDIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NjEKICAgIC8vIHBvc2l0aW9uID0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY29weSgpCiAgICBkdXAKICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjYzLTY1CiAgICAvLyAjIENvbXB1dGUgdGhlIGluY3JlbWVudGFsIHBlci11bml0IGZpeGVkLXBvaW50IGludGVyZXN0IGFuZCBwcmluY2lwYWwgYWNjcnVlZAogICAgLy8gIyBzaW5jZSB0aGlzIGFjY291bnQncyBsYXN0IGNoZWNrcG9pbnQuCiAgICAvLyBpbnRlcmVzdF9kZWx0YSA9IHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCAtIHBvc2l0aW9uLmludGVyZXN0X2NoZWNrcG9pbnQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IGV4aXN0cwogICAgZGlnIDEKICAgIHB1c2hpbnQgNTcKICAgIGV4dHJhY3RfdWludDY0CiAgICAtCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NjcKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggLSBwb3NpdGlvbi5wcmluY2lwYWxfY2hlY2twb2ludAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCBleGlzdHMKICAgIGRpZyAyCiAgICBwdXNoaW50IDY1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjczCiAgICAvLyBpbnRlcmVzdF9kZWx0YSwgcG9zaXRpb24udW5pdHMsIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUKICAgIGRpZyAyCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzAtNzQKICAgIC8vICMgQ29udmVydCB0aGUgcGVyLXVuaXQgZml4ZWQtcG9pbnQgZGVsdGFzIGludG8gYWJzb2x1dGUgY2xhaW1hYmxlIGFtb3VudHMKICAgIC8vICMgdXNpbmcgdGhlIGFjY291bnQncyBhY3RpdmUgdW5pdHMuCiAgICAvLyBjbGFpbWFibGVfaW50ZXJlc3QgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBpbnRlcmVzdF9kZWx0YSwgcG9zaXRpb24udW5pdHMsIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUKICAgIC8vICkKICAgIHVuY292ZXIgMwogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3NgogICAgLy8gcHJpbmNpcGFsX2RlbHRhLCBwb3NpdGlvbi51bml0cywgc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojc1LTc3CiAgICAvLyBjbGFpbWFibGVfcHJpbmNpcGFsID0gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgcHJpbmNpcGFsX2RlbHRhLCBwb3NpdGlvbi51bml0cywgc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgLy8gKQogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3OS04MQogICAgLy8gIyBBY2NydWUgdGhlIGNsYWltYWJsZSBhbW91bnRzIHRvIHRoZSBhY2NvdW50IHBvc2l0aW9uIGFuZCBtYWtlIHRoZW0gYXZhaWxhYmxlCiAgICAvLyAjIGZvciB3aXRoZHJhd2FsLgogICAgLy8gcG9zaXRpb24uY2xhaW1hYmxlX2ludGVyZXN0ICs9IGNsYWltYWJsZV9pbnRlcmVzdAogICAgZGlnIDIKICAgIHB1c2hpbnQgNzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgKwogICAgaXRvYgogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICByZXBsYWNlMiA3MwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjgyCiAgICAvLyBwb3NpdGlvbi5jbGFpbWFibGVfcHJpbmNpcGFsICs9IGNsYWltYWJsZV9wcmluY2lwYWwKICAgIGR1cAogICAgcHVzaGludCA4MQogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICArCiAgICBpdG9iCiAgICByZXBsYWNlMiA4MQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojg0LTg2CiAgICAvLyAjIEFkdmFuY2UgdGhlIGFjY291bnQncyBwZXItdW5pdCBmaXhlZC1wb2ludCBjaGVja3BvaW50cyB0byB0aGUgY3VycmVudCBnbG9iYWwKICAgIC8vICMgcGVyLXVuaXQgZml4ZWQtcG9pbnQgZ2xvYmFsIGluZGljZXMuCiAgICAvLyBwb3NpdGlvbi5pbnRlcmVzdF9jaGVja3BvaW50ID0gc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCBleGlzdHMKICAgIGl0b2IKICAgIHJlcGxhY2UyIDU3CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6ODcKICAgIC8vIHBvc2l0aW9uLnByaW5jaXBhbF9jaGVja3BvaW50ID0gc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCBleGlzdHMKICAgIGl0b2IKICAgIHJlcGxhY2UyIDY1CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6ODktOTAKICAgIC8vICMgQWR2YW5jZSB0aGUgYWNjb3VudCdzIGV2ZW50IGN1cnNvciB0byB0aGUgY3VycmVudCBnbG9iYWwgZXZlbnQgY3Vyc29yLgogICAgLy8gcG9zaXRpb24uc2V0dGxlZF9jdXJzb3IgPSBzZWxmLmV2ZW50X2N1cnNvcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpdG9iCiAgICByZXBsYWNlMiA0OQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjkyLTk0CiAgICAvLyAjIFVwZGF0ZSB0aGUgYWNjb3VudCBwb3NpdGlvbiBhbmQgcmV0dXJuIHRoZSBuZXdseSBhY2NydWVkIGNsYWltYWJsZSBhbW91bnRzCiAgICAvLyAjIGFkZGVkIHRvIHRoZSB0b3RhbCBwb3NpdGlvbidzIGNsYWltYWJsZSBhbW91bnRzLgogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSBwb3NpdGlvbi5jb3B5KCkKICAgIHVuY292ZXIgMwogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojk1CiAgICAvLyByZXR1cm4gY2xhaW1hYmxlX2ludGVyZXN0LCBjbGFpbWFibGVfcHJpbmNpcGFsCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5fZW5zdXJlX3VuaXRzX2FjdGl2YXRlZChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB2b2lkOgpfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZDoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo5NwogICAgLy8gZGVmIF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKHNlbGYsIGhvbGRpbmdfYWRkcmVzczogQWNjb3VudCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTAwCiAgICAvLyBpZiBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKToKICAgIGJ6IF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwMQogICAgLy8gcmV0dXJuCiAgICByZXRzdWIKCl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDMKICAgIC8vIHBvc2l0aW9uID0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY29weSgpCiAgICBmcmFtZV9kaWcgMgogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA0CiAgICAvLyBpZiBwb3NpdGlvbi5yZXNlcnZlZF91bml0cyA9PSBVSW50NjQoMCk6CiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIGJueiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZF9hZnRlcl9pZl9lbHNlQDQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDUKICAgIC8vIHJldHVybgogICAgcmV0c3ViCgpfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZF9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA4CiAgICAvLyBwb3NpdGlvbi51bml0cyArPSBhY3RpdmF0ZWRfdW5pdHMKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDMKICAgICsKICAgIGl0b2IKICAgIHJlcGxhY2UyIDMyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA5CiAgICAvLyBwb3NpdGlvbi5yZXNlcnZlZF91bml0cyA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGl0b2IKICAgIHJlcGxhY2UyIDQwCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTEwCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHBvc2l0aW9uLmNvcHkoKQogICAgZnJhbWVfZGlnIDIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTEKICAgIC8vIGFzc2VydCBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID49IGFjdGl2YXRlZF91bml0cywgZXJyLk9WRVJfRElTVFJJQlVUSU9OCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIGV4aXN0cwogICAgZHVwCiAgICBkaWcgMgogICAgPj0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgcmVtYWluaW5nIEQtQVNBIHVuaXRzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTEyCiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIC09IGFjdGl2YXRlZF91bml0cwogICAgc3dhcAogICAgLQogICAgYnl0ZWMgMTAgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9zY2FsZWRfbXVsX2RpdihtdWx0aXBsaWNhbmQ6IHVpbnQ2NCwgbXVsdGlwbGllcjogdWludDY0LCBkaXZpc29yOiB1aW50NjQpIC0+IHVpbnQ2NDoKX3NjYWxlZF9tdWxfZGl2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTUzLTE1NQogICAgLy8gZGVmIF9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLCBtdWx0aXBsaWNhbmQ6IFVJbnQ2NCwgbXVsdGlwbGllcjogVUludDY0LCBkaXZpc29yOiBVSW50NjQKICAgIC8vICkgLT4gVUludDY0OgogICAgcHJvdG8gMyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTcKICAgIC8vIGlmIG11bHRpcGxpY2FuZCA9PSBVSW50NjQoMCkgb3IgbXVsdGlwbGllciA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTMKICAgIGJ6IF9zY2FsZWRfbXVsX2Rpdl9pZl9ib2R5QDIKICAgIGZyYW1lX2RpZyAtMgogICAgYm56IF9zY2FsZWRfbXVsX2Rpdl9hZnRlcl9pZl9lbHNlQDMKCl9zY2FsZWRfbXVsX2Rpdl9pZl9ib2R5QDI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTgKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9zY2FsZWRfbXVsX2Rpdl9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTkKICAgIC8vIGhpZ2gsIGxvdyA9IG9wLm11bHcobXVsdGlwbGljYW5kLCBtdWx0aXBsaWVyKQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIG11bHcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2MAogICAgLy8gcmV0dXJuIG9wLmRpdncoaGlnaCwgbG93LCBkaXZpc29yKQogICAgZnJhbWVfZGlnIC0xCiAgICBkaXZ3CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYW1vdW50X3RvX2luZGV4X2RlbHRhKGFtb3VudDogdWludDY0KSAtPiB1aW50NjQ6Cl9hbW91bnRfdG9faW5kZXhfZGVsdGE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjIKICAgIC8vIGRlZiBfYW1vdW50X3RvX2luZGV4X2RlbHRhKHNlbGYsIGFtb3VudDogVUludDY0KSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2NAogICAgLy8gaWYgYW1vdW50ID09IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMQogICAgYm56IF9hbW91bnRfdG9faW5kZXhfZGVsdGFfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjUKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9hbW91bnRfdG9faW5kZXhfZGVsdGFfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTY2CiAgICAvLyBhc3NlcnQgc2VsZi50b3RhbF91bml0cyA+IFVJbnQ2NCgwKSwgZXJyLk5PX1VOSVRTCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgZHVwCiAgICBhc3NlcnQgLy8gTm8gRC1BU0EgdW5pdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2NwogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KGFtb3VudCwgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwgc2VsZi50b3RhbF91bml0cykKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2luZGV4X2RlbHRhX3RvX2Ftb3VudChpbmRleF9kZWx0YTogdWludDY0KSAtPiB1aW50NjQ6Cl9pbmRleF9kZWx0YV90b19hbW91bnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjkKICAgIC8vIGRlZiBfaW5kZXhfZGVsdGFfdG9fYW1vdW50KHNlbGYsIGluZGV4X2RlbHRhOiBVSW50NjQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTc2CiAgICAvLyBpZiBpbmRleF9kZWx0YSA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGJueiBfaW5kZXhfZGVsdGFfdG9fYW1vdW50X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTc3CiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfaW5kZXhfZGVsdGFfdG9fYW1vdW50X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE3OQogICAgLy8gc2VsZi50b3RhbF91bml0cywKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxODEKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNzgtMTgyCiAgICAvLyByZXR1cm4gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgc2VsZi50b3RhbF91bml0cywKICAgIC8vICAgICBpbmRleF9kZWx0YSwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2dldF9zY2hlZHVsZV9lbnRyeShldmVudF9pZDogdWludDY0KSAtPiBieXRlczoKX2dldF9zY2hlZHVsZV9lbnRyeToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIwMgogICAgLy8gZGVmIF9nZXRfc2NoZWR1bGVfZW50cnkoc2VsZiwgZXZlbnRfaWQ6IFVJbnQ2NCkgLT4gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnk6CiAgICBwcm90byAxIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIwNAogICAgLy8gYXNzZXJ0IGV2ZW50X2lkIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgPgogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgaWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE5MAogICAgLy8gcmV0dXJuIGV2ZW50X2lkIC8vIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDE2CiAgICAvCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMDYKICAgIC8vIGFzc2VydCBwYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgaXRvYgogICAgYnl0ZWMgMzEgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxOTQKICAgIC8vIHJldHVybiBldmVudF9pZCAlIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDE2CiAgICAlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMDkKICAgIC8vIGFzc2VydCBvZmZzZXQgPCBwYWdlLmxlbmd0aCwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBwdXNoaW50IDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgMQogICAgPgogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjEwCiAgICAvLyByZXR1cm4gcGFnZVtvZmZzZXRdLmNvcHkoKQogICAgcHVzaGludCA2NQogICAgKgogICAgcHVzaGludCAyCiAgICArCiAgICBwdXNoaW50IDY1CiAgICBib3hfZXh0cmFjdAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKGNvbnRyYWN0X3R5cGU6IHVpbnQ2NCwgZXZlbnRfdHlwZTogdWludDY0KSAtPiB2b2lkOgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTMtMzE1CiAgICAvLyBkZWYgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIHNlbGYsIGNvbnRyYWN0X3R5cGU6IFVJbnQ2NCwgZXZlbnRfdHlwZTogVUludDY0CiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNDcKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNDgKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgaW50Y18yIC8vIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI0OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9NRCksCiAgICBwdXNoaW50IDE5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTAKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgcHVzaGludCAxMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU0LTI1NQogICAgLy8gIyBDaGVjayBjb21tb24gZXZlbnRzIGZpcnN0CiAgICAvLyBpZiBldmVudF90eXBlIGluIGNvbW1vbl9ldmVudHM6CiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjUxCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICBwdXNoaW50IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUA3CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU2CiAgICAvLyByZXR1cm4gVHJ1ZQogICAgaW50Y18xIC8vIDEKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICByZXRzdWIKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTgtMjU5CiAgICAvLyAjIENvbnRyYWN0LXNwZWNpZmljIGFkZGl0aW9uYWwgZXZlbnRzCiAgICAvLyBpZiBjb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9QQU0pOgogICAgZnJhbWVfZGlnIC0yCiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjYwLTI2MQogICAgLy8gIyBQQU0gb25seSBzdXBwb3J0cyBjb21tb24gZXZlbnRzCiAgICAvLyByZXR1cm4gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNjMKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0xBTSkgb3IgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2My0yNjUKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0xBTSkgb3IgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoCiAgICAvLyAgICAgZW51bXMuQ1RfTkFNCiAgICAvLyApOgogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDExCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMgogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDE2CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUAxMToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2Ni0yNzAKICAgIC8vICMgTEFNL05BTSBhZGQ6IFBSLCBJUENCCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjY4CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjY2LTI3MAogICAgLy8gIyBMQU0vTkFNIGFkZDogUFIsIElQQ0IKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDEzCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIHB1c2hpbnQgMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2Ni0yNzAKICAgIC8vICMgTEFNL05BTSBhZGQ6IFBSLCBJUENCCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICkKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF9mYWxzZUAxNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAxMzoKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDE0OgogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMTY6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzIKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTik6CiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMjMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3My0yNzgKICAgIC8vICMgQU5OIGFkZHM6IFBSLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjc1CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjczLTI3OAogICAgLy8gIyBBTk4gYWRkczogUFIsIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDIwCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIHB1c2hpbnQgMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3My0yNzgKICAgIC8vICMgQU5OIGFkZHM6IFBSLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyMAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzcKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIHB1c2hpbnQgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjczLTI3OAogICAgLy8gIyBBTk4gYWRkczogUFIsIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDIxCgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDIwOgogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMjE6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAyMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MAogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfTEFYKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA0CiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMzEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MS0yODcKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MwogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUiksCiAgICBwdXNoaW50IDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MS0yODcKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjgKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjg0CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjgxLTI4NwogICAgLy8gIyBMQVggYWRkczogUFIsIFBJLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyOAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODUKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICBwdXNoaW50IDE4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODEtMjg3CiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDI4CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODEtMjg3CiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDI5CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDI4OgogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMjk6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAzMToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4OQogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQ0xNKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA1CiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMzMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI5MC0yOTEKICAgIC8vICMgQ0xNIGFkZHM6IFBSCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1BSKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDMKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDMzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjkzCiAgICAvLyByZXR1cm4gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5faXNfZHluYW1pY19hbm51aXR5KCkgLT4gdWludDY0OgpfaXNfZHluYW1pY19hbm51aXR5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM1CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzUtMzM2CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIC8vIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGJ6IF9pc19keW5hbWljX2FubnVpdHlfYm9vbF9mYWxzZUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzYKICAgIC8vIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzNCAvLyAiZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM1LTMzNgogICAgLy8gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICAvLyBhbmQgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBieiBfaXNfZHluYW1pY19hbm51aXR5X2Jvb2xfZmFsc2VAMwogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMzNC0zMzcKICAgIC8vIHJldHVybiAoCiAgICAvLyAgICAgc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICAvLyAgICAgYW5kIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgLy8gKQogICAgcmV0c3ViCgpfaXNfZHluYW1pY19hbm51aXR5X2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzQtMzM3CiAgICAvLyByZXR1cm4gKAogICAgLy8gICAgIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKQogICAgLy8gICAgIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIC8vICkKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KGVudHJ5OiBieXRlcykgLT4gdWludDY0LCBieXRlczoKX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozODAKICAgIC8vIGRlZiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudChzZWxmLCBlbnRyeTogdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5CiAgICAvLyBlbnRyeS5hY2NydWFsX2ZhY3RvciA9PSBVSW50NjQoMCkKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAxNwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5LTM5MQogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGJ6IF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2lmX2JvZHlAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzkwCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5LTM5MQogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGJ6IF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2lmX2JvZHlAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzkxCiAgICAvLyBvciBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPT0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5LTM5MQogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGJueiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudF9hZnRlcl9pZl9lbHNlQDQKCl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2lmX2JvZHlAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5MwogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2RpZyAtMQogICAgdW5jb3ZlciAyCiAgICByZXRzdWIKCl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NQogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NgogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NC0zOTgKICAgIC8vIGFjY3J1ZWQgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICAvLyAgICAgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICkKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MDIKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozOTktNDAzCiAgICAvLyByZXR1cm4gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgYWNjcnVlZCwKICAgIC8vICAgICBlbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICBmcmFtZV9kaWcgLTEKICAgIHVuY292ZXIgMgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yKGRpc2NvdW50X2ZhY3RvcjogdWludDY0LCByZWRlbXB0aW9uX2ZhY3RvcjogdWludDY0KSAtPiB1aW50NjQ6Cl9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ2Mi00NjYKICAgIC8vIGRlZiBfZGlzY291bnRfYW5udWl0eV9mYWN0b3IoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBkaXNjb3VudF9mYWN0b3I6IFVJbnQ2NCwKICAgIC8vICAgICByZWRlbXB0aW9uX2ZhY3RvcjogVUludDY0LAogICAgLy8gKSAtPiBVSW50NjQ6CiAgICBwcm90byAyIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ2OAogICAgLy8gaWYgcmVkZW1wdGlvbl9mYWN0b3IgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0xCiAgICBibnogX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDY5CiAgICAvLyByZXR1cm4gZGlzY291bnRfZmFjdG9yCiAgICBmcmFtZV9kaWcgLTIKICAgIHJldHN1YgoKX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3MAogICAgLy8gcGVyaW9kX3JhdGUgPSBzZWxmLmZpeGVkX3BvaW50X3NjYWxlICsgc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzEKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzAtNDc0CiAgICAvLyBwZXJpb2RfcmF0ZSA9IHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgKyBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICByZWRlbXB0aW9uX2ZhY3RvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICBkaWcgMgogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgICsKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3NQogICAgLy8gYXNzZXJ0IHBlcmlvZF9yYXRlID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGR1cAogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDc4CiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDc2LTQ4MAogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIGRpc2NvdW50X2ZhY3RvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gICAgIHBlcmlvZF9yYXRlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkoZW50cnk6IGJ5dGVzLCBwYXlsb2FkOiBieXRlcykgLT4gYnl0ZXMsIGJ5dGVzOgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MTMtNjE1CiAgICAvLyBkZWYgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5KAogICAgLy8gICAgIHNlbGYsIGVudHJ5OiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSwgcGF5bG9hZDogdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0CiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAyIDIKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjIzCiAgICAvLyBhc3NlcnQgZW50cnkuZXZlbnRfaWQgPT0gc2VsZi5ldmVudF9jdXJzb3IsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGN1cnNvcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjI0CiAgICAvLyBhc3NlcnQgZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsIGVyci5OT19EVUVfQ0FTSEZMT1cKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPD0KICAgIGFzc2VydCAvLyBObyBkdWUgY2FzaGZsb3cgdG8gcGF5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MjYKICAgIC8vIGV2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYyNwogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX0lFRCk6CiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGR1cAogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYyOC02MzAKICAgIC8vICMgSUVEIGZpbmFsaXplcyBpc3N1YW5jZTogcmVzZXJ2ZWQgdW5pdHMgYmVjb21lIGFjdGl2YXRhYmxlIGFuZCB0aGUKICAgIC8vICMgc2NoZWR1bGUncyBpbml0aWFsIGNvbnRyYWN0dWFsIHN0YXRlIGJlY29tZXMgbGl2ZS4KICAgIC8vIGFzc2VydCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzIKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPT0gc2VsZi50b3RhbF91bml0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjMxLTYzMwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID09IHNlbGYudG90YWxfdW5pdHMKICAgIC8vICksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9JTkNPTVBMRVRFCiAgICBhc3NlcnQgLy8gUHJpbWFyeSBkaXN0cmlidXRpb24gaXMgbm90IGNvbXBsZXRlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzQKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjXzMgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM1CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzYKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAzMwogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzcKICAgIC8vIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM4CiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzkKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0MAogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX0FDVElWRSkKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgMTAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDUxCiAgICAvLyBhc3NlcnQgZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSA9PSBVSW50NjQoZW51bXMuRVZUX0lFRCksIGVyci5OT1RfRVZUX0lFRAogICAgZnJhbWVfZGlnIDExCiAgICBhc3NlcnQgLy8gTm90IElFRCBldmVudAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDUyCiAgICAvLyByZXR1cm4gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0MS02NDUKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1zZWxmLl9lbnRyeV9pZWRfYW1vdW50KGVudHJ5KSwKICAgIC8vICAgICBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0NAogICAgLy8gc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0MS02NDUKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1zZWxmLl9lbnRyeV9pZWRfYW1vdW50KGVudHJ5KSwKICAgIC8vICAgICBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICAvLyApCiAgICBjYWxsc3ViIF9lbWl0X2V4ZWN1dGlvbl9ldmVudAogICAgZHVwCiAgICBmcmFtZV9idXJ5IC0yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NDYKICAgIC8vIHJldHVybgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0OQogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ICs9IHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBmcmFtZV9idXJ5IC0yCiAgICArCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1MQogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1JSKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCAxMgogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMTAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1NQogICAgLy8gcGF5bG9hZC5vYnNlcnZlZF9yYXRlLAogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjU2CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzNiAvLyAicmF0ZV9yZXNldF9tdWx0aXBsaWVyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1NwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1Mi02NTgKICAgIC8vICMgUlIgZGVyaXZlcyB0aGUgbmV4dCByYXRlIGZyb20gYW4gb2JzZXJ2ZWQgb3JhY2xlIHZhbHVlIHBsdXMgdGhlCiAgICAvLyAjIGNvbnRyYWN0IHNwcmVhZCAvIG11bHRpcGxpZXIgdGVybXMsIHRoZW4gZW5mb3JjZXMgZmxvb3IgYW5kIGNhcC4KICAgIC8vIG9ic2VydmVkX3JhdGUgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBwYXlsb2FkLm9ic2VydmVkX3JhdGUsCiAgICAvLyAgICAgc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICkKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjAKICAgIC8vIG9ic2VydmVkX3JhdGUgKyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzUgLy8gInJhdGVfcmVzZXRfc3ByZWFkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkIGV4aXN0cwogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MzQKICAgIC8vIGlmIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgYW5kIHJhdGUgPCBzZWxmLnJhdGVfcmVzZXRfZmxvb3I6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzggLy8gImhhc19yYXRlX3Jlc2V0X2Zsb29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmhhc19yYXRlX3Jlc2V0X2Zsb29yIGV4aXN0cwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyOSAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X2Zsb29yIGV4aXN0cwogICAgZnJhbWVfZGlnIDYKICAgID4KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MzUKICAgIC8vIHJhdGUgPSBzZWxmLnJhdGVfcmVzZXRfZmxvb3IKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyOSAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDYKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfZmxvb3IgZXhpc3RzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1NToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjczNgogICAgLy8gaWYgc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgYW5kIHJhdGUgPiBzZWxmLnJhdGVfcmVzZXRfY2FwOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDM5IC8vICJoYXNfcmF0ZV9yZXNldF9jYXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwIGV4aXN0cwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTgKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMCAvLyAicmF0ZV9yZXNldF9jYXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9jYXAgZXhpc3RzCiAgICBmcmFtZV9kaWcgNgogICAgPAogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjczNwogICAgLy8gcmF0ZSA9IHNlbGYucmF0ZV9yZXNldF9jYXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMCAvLyAicmF0ZV9yZXNldF9jYXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSA2CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X2NhcCBleGlzdHMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjU5CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IHNlbGYuX2NsYW1wX3JhdGUoCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NTktNjYxCiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IHNlbGYuX2NsYW1wX3JhdGUoCiAgICAvLyAgICAgb2JzZXJ2ZWRfcmF0ZSArIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQKICAgIC8vICkKICAgIGZyYW1lX2RpZyA2CiAgICBhcHBfZ2xvYmFsX3B1dAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMTg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzEKICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QSSk6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMjAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY3MgogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzMKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDIzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc4CiAgICAvLyBpZiBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKToKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAyOQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc5CiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFJGKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCA1CiAgICA9PQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMzAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5MAogICAgLy8gZGlzY291bnRfZmFjdG9yID0gc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0OTEKICAgIC8vIGRlbm9taW5hdG9yID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0OTIKICAgIC8vIHNraXBfZmlyc3RfcmVkZW1wdGlvbiA9IEZhbHNlCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSA3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0OTQKICAgIC8vIGlmIGVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IgPiBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMjUKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgOAogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMzUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5NS00OTkKICAgIC8vICMgQW4gaW5pdGlhbCBQUkYgbWF5IGRlc2NyaWJlIHRoZSBmaXJzdCByZWRlbXB0aW9uIHBlcmlvZCBkaXJlY3RseS4KICAgIC8vIGRpc2NvdW50X2ZhY3RvciA9IHNlbGYuX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yKAogICAgLy8gICAgIGRpc2NvdW50X2ZhY3RvciwKICAgIC8vICAgICBlbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyA4CiAgICBjYWxsc3ViIF9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwMQogICAgLy8gc2tpcF9maXJzdF9yZWRlbXB0aW9uID0gVHJ1ZQogICAgaW50Y18xIC8vIDEKICAgIGZyYW1lX2J1cnkgNwogICAgZnJhbWVfYnVyeSAxCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAzNToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwMwogICAgLy8gZnV0dXJlX2V2ZW50X2lkID0gc2VsZi5ldmVudF9jdXJzb3IgKyBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X3doaWxlX3RvcEAzNjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwNAogICAgLy8gd2hpbGUgZnV0dXJlX2V2ZW50X2lkIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGZyYW1lX2RpZyAzCiAgICA+CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfd2hpbGVANDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwNQogICAgLy8gZnV0dXJlX2VudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KGZ1dHVyZV9ldmVudF9pZCkKICAgIGZyYW1lX2RpZyAzCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MDYKICAgIC8vIGZ1dHVyZV9ldmVudF90eXBlID0gZnV0dXJlX2VudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA3LTUwOAogICAgLy8gIyBPbmx5IHJlZGVtcHRpb24tYmVhcmluZyBldmVudHMgY29udHJpYnV0ZSB0byB0aGUgYW5udWl0eSBkZW5vbWluYXRvci4KICAgIC8vIGlzX3JlZGVtcHRpb25fZXZlbnQgPSBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1BSKSBvciAoCiAgICBwdXNoaW50IDMKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MDctNTExCiAgICAvLyAjIE9ubHkgcmVkZW1wdGlvbi1iZWFyaW5nIGV2ZW50cyBjb250cmlidXRlIHRvIHRoZSBhbm51aXR5IGRlbm9taW5hdG9yLgogICAgLy8gaXNfcmVkZW1wdGlvbl9ldmVudCA9IGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpIG9yICgKICAgIC8vICAgICBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgLy8gICAgIGFuZCBmdXR1cmVfZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKQogICAgLy8gKQogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX3RydWVANDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwOQogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCkKICAgIGZyYW1lX2RpZyA0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA5LTUxMAogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCkKICAgIC8vIGFuZCBmdXR1cmVfZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUxMAogICAgLy8gYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICBmcmFtZV9kaWcgMAogICAgcHVzaGludCAyNQogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwOS01MTAKICAgIC8vIGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfTUQpCiAgICAvLyBhbmQgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IgPiBVSW50NjQoMCkKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX2ZhbHNlQDQxCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF90cnVlQDQwOgogICAgaW50Y18xIC8vIDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX21lcmdlQDQyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTEyCiAgICAvLyBpZiBpc19yZWRlbXB0aW9uX2V2ZW50OgogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANDcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUxMwogICAgLy8gaWYgc2tpcF9maXJzdF9yZWRlbXB0aW9uOgogICAgZnJhbWVfZGlnIDcKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlANDUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUxNAogICAgLy8gc2tpcF9maXJzdF9yZWRlbXB0aW9uID0gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDcKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDQ3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTIxCiAgICAvLyBmdXR1cmVfZXZlbnRfaWQgKz0gVUludDY0KDEpCiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMwogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfd2hpbGVfdG9wQDM2CgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDQ1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTE4CiAgICAvLyBmdXR1cmVfZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIGZyYW1lX2RpZyAwCiAgICBwdXNoaW50IDI1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTE2LTUxOQogICAgLy8gZGlzY291bnRfZmFjdG9yID0gc2VsZi5fZGlzY291bnRfYW5udWl0eV9mYWN0b3IoCiAgICAvLyAgICAgZGlzY291bnRfZmFjdG9yLAogICAgLy8gICAgIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDIKICAgIHN3YXAKICAgIGNhbGxzdWIgX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTIwCiAgICAvLyBkZW5vbWluYXRvciArPSBkaXNjb3VudF9mYWN0b3IKICAgIGZyYW1lX2RpZyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANDcKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX2ZhbHNlQDQxOgogICAgaW50Y18wIC8vIDAKICAgIGIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfbWVyZ2VANDIKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl93aGlsZUA0ODoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUyMwogICAgLy8gYXNzZXJ0IGRlbm9taW5hdG9yID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGZyYW1lX2RpZyAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjQKICAgIC8vIG51bWVyYXRvciA9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUyNQogICAgLy8gaWYgZW50cnkuZmxhZ3MgJiBVSW50NjQoZW51bXMuRkxBR19JTklUSUFMX1BSRikgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDU3CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18yIC8vIDgKICAgICYKICAgIGJueiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1MAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTI2LTUyNwogICAgLy8gIyBTdWJzZXF1ZW50IFBSRiBldmVudHMgYW1vcnRpemUgYm90aCBwcmluY2lwYWwgYW5kIGFscmVhZHkgYWNjcnVlZCBjYXJyeS4KICAgIC8vIG51bWVyYXRvciArPSBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICArCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1MDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUzMAogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUyOC01MzIKICAgIC8vIHJldHVybiBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBudW1lcmF0b3IsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICAgICBkZW5vbWluYXRvciwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAxCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjgwCiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBzZWxmLl9yZWNhbGN1bGF0ZV9hbm51aXR5X3BheW1lbnQoCiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4MC02ODIKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IHNlbGYuX3JlY2FsY3VsYXRlX2FubnVpdHlfcGF5bWVudCgKICAgIC8vICAgICBlbnRyeQogICAgLy8gKQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDMwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njg1CiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODYtNjkwCiAgICAvLyBzZWxmLl9lbWl0X2V4ZWN1dGlvbl9ldmVudCgKICAgIC8vICAgICBlbnRyeT1lbnRyeSwKICAgIC8vICAgICBwYXlvZmY9VUludDY0KDApLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njg4CiAgICAvLyBwYXlvZmY9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4OQogICAgLy8gc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODYtNjkwCiAgICAvLyBzZWxmLl9lbWl0X2V4ZWN1dGlvbl9ldmVudCgKICAgIC8vICAgICBlbnRyeT1lbnRyeSwKICAgIC8vICAgICBwYXlvZmY9VUludDY0KDApLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGNhbGxzdWIgX2VtaXRfZXhlY3V0aW9uX2V2ZW50CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfYnVyeSAxCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAyOToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4NAogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gZW50cnkubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDQxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAzMAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAyMDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY3NAogICAgLy8gZWxpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfSVBDQik6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgMTgKICAgID09CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAyMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc1LTY3NgogICAgLy8gIyBJUENCIGtlZXBzIHByaW5jaXBhbCB1bmNoYW5nZWQgYW5kIG9ubHkgcmVzZXRzIHRoZSBpbnRlcmVzdCBiYXNlLgogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDIzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDEwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjYyCiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9SUkYpOgogICAgZnJhbWVfZGlnIDEwCiAgICBwdXNoaW50IDExCiAgICA9PQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAxNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjYzCiAgICAvLyBuZXh0X3JhdGUgPSBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZQogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2NAogICAgLy8gaWYgbmV4dF9yYXRlID09IFVJbnQ2NCgwKToKICAgIGJueiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAxMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY1CiAgICAvLyBuZXh0X3JhdGUgPSBzZWxmLnJhdGVfcmVzZXRfbmV4dAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDM3IC8vICJyYXRlX3Jlc2V0X25leHQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSA1CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X25leHQgZXhpc3RzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2NgogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPSBuZXh0X3JhdGUKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGZyYW1lX2RpZyA1CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAxOAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAxNDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2OAogICAgLy8gaWYgZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUgIT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDkKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjkKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGZyYW1lX2RpZyA5CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAxOAoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbWl0X2V4ZWN1dGlvbl9ldmVudChlbnRyeTogYnl0ZXMsIHBheW9mZjogdWludDY0LCBzZXR0bGVkX2Ftb3VudDogdWludDY0KSAtPiBieXRlczoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njk2LTcwMgogICAgLy8gZGVmIF9lbWl0X2V4ZWN1dGlvbl9ldmVudCgKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgICosCiAgICAvLyAgICAgZW50cnk6IHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5LAogICAgLy8gICAgIHBheW9mZjogVUludDY0LAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50OiBVSW50NjQsCiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAzIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcwNgogICAgLy8gY29udHJhY3RfaWQ9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25faWQuaWQsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uSUQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcwNwogICAgLy8gZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzA4CiAgICAvLyBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICBmcmFtZV9kaWcgLTMKICAgIGV4dHJhY3QgOCAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MDkKICAgIC8vIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgZnJhbWVfZGlnIC0zCiAgICBleHRyYWN0IDkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzEwCiAgICAvLyBhcHBsaWVkX2F0PUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzEzCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBmcmFtZV9kaWcgLTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcwOAogICAgLy8gZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgaW50Y18yIC8vIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxMwogICAgLy8gc2VsZi5fcGF5b2ZmX3NpZ24oZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSwgcGF5b2ZmKQogICAgZ2V0Ynl0ZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzQyCiAgICAvLyBpZiBwYXlvZmYgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0yCiAgICBibnogX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzQzCiAgICAvLyByZXR1cm4gVUludDY0KGVudW1zLlBBWU9GRl9TSUdOX1BPU0lUSVZFKQogICAgaW50Y18xIC8vIDEKCl9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9wYXlvZmZfc2lnbkA3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzEyLTcxNAogICAgLy8gcGF5b2ZmX3NpZ249YXJjNC5VSW50OCgKICAgIC8vICAgICBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICAvLyApLAogICAgaXRvYgogICAgZHVwCiAgICBiaXRsZW4KICAgIGludGNfMiAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBleHRyYWN0IDcgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE2CiAgICAvLyBjdXJyZW5jeV9pZD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxNwogICAgLy8gc2VxdWVuY2U9ZW50cnkuZXZlbnRfaWQgKyBVSW50NjQoMSksCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzA1LTcxOAogICAgLy8gRXhlY3V0aW9uRXZlbnQoCiAgICAvLyAgICAgY29udHJhY3RfaWQ9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25faWQuaWQsCiAgICAvLyAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgcGF5b2ZmPXBheW9mZiwKICAgIC8vICAgICBwYXlvZmZfc2lnbj1hcmM0LlVJbnQ4KAogICAgLy8gICAgICAgICBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBzZXR0bGVkX2Ftb3VudD1zZXR0bGVkX2Ftb3VudCwKICAgIC8vICAgICBjdXJyZW5jeV9pZD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgc2VxdWVuY2U9ZW50cnkuZXZlbnRfaWQgKyBVSW50NjQoMSksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMAogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAyCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAzCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyA0CiAgICBpdG9iCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMgogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcwNC03MTkKICAgIC8vIGFyYzQuZW1pdCgKICAgIC8vICAgICBFeGVjdXRpb25FdmVudCgKICAgIC8vICAgICAgICAgY29udHJhY3RfaWQ9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25faWQuaWQsCiAgICAvLyAgICAgICAgIGV2ZW50X2lkPWVudHJ5LmV2ZW50X2lkLAogICAgLy8gICAgICAgICBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICAvLyAgICAgICAgIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgICAgICBhcHBsaWVkX2F0PUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gICAgICAgICBwYXlvZmY9cGF5b2ZmLAogICAgLy8gICAgICAgICBwYXlvZmZfc2lnbj1hcmM0LlVJbnQ4KAogICAgLy8gICAgICAgICAgICAgc2VsZi5fcGF5b2ZmX3NpZ24oZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSwgcGF5b2ZmKQogICAgLy8gICAgICAgICApLAogICAgLy8gICAgICAgICBzZXR0bGVkX2Ftb3VudD1zZXR0bGVkX2Ftb3VudCwKICAgIC8vICAgICAgICAgY3VycmVuY3lfaWQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgICAgICBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIC8vICAgICApCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHg5YTMzMmI5NSAvLyBtZXRob2QgIkV4ZWN1dGlvbkV2ZW50KHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDQKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gKFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwgVUludDY0KGVudW1zLkVWVF9QSSkpOgogICAgZnJhbWVfZGlnIDUKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYm56IF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9pZl9ib2R5QDUKICAgIGZyYW1lX2RpZyA1CiAgICBwdXNoaW50IDQKICAgID09CiAgICBieiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUA2CgpfZW1pdF9leGVjdXRpb25fZXZlbnRfaWZfYm9keUA1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzQ1CiAgICAvLyByZXR1cm4gVUludDY0KGVudW1zLlBBWU9GRl9TSUdOX1BPU0lUSVZFKQogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxMwogICAgLy8gc2VsZi5fcGF5b2ZmX3NpZ24oZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSwgcGF5b2ZmKQogICAgYiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fcGF5b2ZmX3NpZ25ANwoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc0NgogICAgLy8gcmV0dXJuIFVJbnQ2NChlbnVtcy5QQVlPRkZfU0lHTl9ORUdBVElWRSkKICAgIHB1c2hpbnQgMjU1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTMKICAgIC8vIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIGIgX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX3BheW9mZl9zaWduQDcKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fcm9sZV9pc19hY3RpdmUocm9sZV9tYXA6IGJ5dGVzLCByb2xlX2FkZHJlc3M6IGJ5dGVzKSAtPiB1aW50NjQ6Cl9yb2xlX2lzX2FjdGl2ZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NwogICAgLy8gZGVmIF9yb2xlX2lzX2FjdGl2ZShzZWxmLCByb2xlX21hcDogdHlwLlJiYWNSb2xlLCByb2xlX2FkZHJlc3M6IEFjY291bnQpIC0+IGJvb2w6CiAgICBwcm90byAyIDEKICAgIHB1c2hieXRlcyAiIgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU4LTYyCiAgICAvLyByZXR1cm4gc2VsZi5faGFzX3JvbGUocm9sZV9tYXAsIHJvbGVfYWRkcmVzcykgYW5kICgKICAgIC8vICAgICByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICkKICAgIGJ6IF9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIEJveE1hcCBlbnRyeSBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYwCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MAogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgPD0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYxCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIEJveE1hcCBlbnRyeSBleGlzdHMKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYwLTYxCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDAKICAgID49CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTktNjEKICAgIC8vIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IF9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQKICAgIGludGNfMSAvLyAxCgpfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU4LTYyCiAgICAvLyByZXR1cm4gc2VsZi5faGFzX3JvbGUocm9sZV9tYXAsIHJvbGVfYWRkcmVzcykgYW5kICgKICAgIC8vICAgICByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICkKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgX3JvbGVfaXNfYWN0aXZlX2Jvb2xfbWVyZ2VANQoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkgLT4gdm9pZDoKX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjUKICAgIC8vIGFzc2VydCBzZWxmLl9pc19hcnJhbmdlcihUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjUyCiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzID09IHNlbGYuYXJyYW5nZXIudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOCAvLyAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcnJhbmdlciBleGlzdHMKICAgID09CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjUKICAgIC8vIGFzc2VydCBzZWxmLl9pc19hcnJhbmdlcihUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKSAtPiB2b2lkOgpfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODMKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5hc3NldF9kZWZhdWx0ZWQsIGVyci5ERUZBVUxURUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0MSAvLyAiYXNzZXRfZGVmYXVsdGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2RlZmF1bHRlZCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBEZWZhdWx0ZWQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpIC0+IHZvaWQ6Cl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4NgogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFzc2V0X3N1c3BlbmRlZCwgZXJyLlNVU1BFTkRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDMzIC8vICJhc3NldF9zdXNwZW5kZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfc3VzcGVuZGVkIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIFN1c3BlbmRlZCBvcGVyYXRpb25zCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZDogdWludDY0KSAtPiB2b2lkOgpfYXNzZXJ0X3ZhbGlkX3JvbGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODgKICAgIC8vIGRlZiBfYXNzZXJ0X3ZhbGlkX3JvbGUoc2VsZiwgcm9sZV9pZDogVUludDY0KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkwCiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICBwdXNoaW50IDIwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MQogICAgLy8gVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIHB1c2hpbnQgMjUKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkyCiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgcHVzaGludCA0MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTMKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIHB1c2hpbnQgNTAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojk0CiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIHB1c2hpbnQgNjAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojk1CiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgcHVzaGludCA3MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTYKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIHB1c2hpbnQgODAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJ6IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX2ZhbHNlQDgKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANzoKICAgIGludGNfMSAvLyAxCgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9tZXJnZUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBhc3NlcnQgLy8gSW52YWxpZCByb2xlIGlkZW50aWZpZXIKICAgIHJldHN1YgoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfZmFsc2VAODoKICAgIGludGNfMCAvLyAwCiAgICBiIF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX21lcmdlQDkK", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" }, "byteCode": { - "approval": "DCAEAAEIICYwBBUffHUGc3RhdHVzDGV2ZW50X2N1cnNvchVvdXRzdGFuZGluZ19wcmluY2lwYWwUc2NoZWR1bGVfZW50cnlfY291bnQRZml4ZWRfcG9pbnRfc2NhbGUQYWNjcnVlZF9pbnRlcmVzdBlpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlClIjQWNjb3VudCMVbm9taW5hbF9pbnRlcmVzdF9yYXRlFHJlc2VydmVkX3VuaXRzX3RvdGFsEnJlc2VydmVkX3ByaW5jaXBhbA1jb250cmFjdF90eXBlC3RvdGFsX3VuaXRzGW5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24RcmVzZXJ2ZWRfaW50ZXJlc3QZY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleBpjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleAtSI0FycmFuZ2VyIxNzZXR0bGVtZW50X2Fzc2V0X2lkF2luaXRpYWxfZXhjaGFuZ2VfYW1vdW50DFIjQXV0aG9yaXR5IxBSI1ByaW1hcnlEZWFsZXIjEVIjQWNjb3VudE1hbmFnZXIjC1IjT2JzZXJ2ZXIjC1IjT3BEYWVtb24jFWluaXRpYWxfZXhjaGFuZ2VfZGF0ZRV0cmFuc2Zlcl9vcGVuaW5nX2RhdGUVdHJhbnNmZXJfY2xvc3VyZV9kYXRlEHJhdGVfcmVzZXRfZmxvb3IOcmF0ZV9yZXNldF9jYXACUyMKUiNUcnVzdGVlIw9hc3NldF9zdXNwZW5kZWQcZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbhFyYXRlX3Jlc2V0X3NwcmVhZBVyYXRlX3Jlc2V0X211bHRpcGxpZXIPcmF0ZV9yZXNldF9uZXh0FGhhc19yYXRlX3Jlc2V0X2Zsb29yEmhhc19yYXRlX3Jlc2V0X2NhcAEAD2Fzc2V0X2RlZmF1bHRlZA9wcm9zcGVjdHVzX2hhc2gOcHJvc3BlY3R1c191cmwVZGVub21pbmF0aW9uX2Fzc2V0X2lkDW1hdHVyaXR5X2RhdGUUZGF5X2NvdW50X2NvbnZlbnRpb24DBoEBMRhAAK0nEjIDZycZMgNnJyEiZycpImcpImcnDCJnJyqAAGcnK4AAZycsImcnEyJnJxoiZyctImcnGyJnJxwiZycuImcnDSJnJwoiZycUImcrImcnDiJnJyIiZycHImcnBiJnJwkiZycjImcnJCJnJx0iZyceImcnJSJnJyYiZycnImcnCyJnJw8iZycQImcnESJnKiJnJwQiZycFImcxNYEEEkQxNIElEkQxNxREMTYURIAEkU8E6zYaAI4BAMAxGRREMRhBAKmCFwS0RhjIBOeDJSkEfqIOCwRshePuBL3RqUQE3AY7NQQU/BDvBHSnKX8ECdT+FASam/qFBIXu0z0EkYUQSgTZ8iWsBG4OXJUE/z/UswSC9xstBO8E9dME3zQ1UAQ9voC9BN9U6CwEAQyCmQR0BqzSBBpyou42GgCOFwAbAscEIwRNBNcFyAYCBloGjQa7CK4J6ApiC9QMZwytDMUM3Q2SDigORw5SDpwAgASVbXFWNhoAjgEGmAAxGYEEEjEYEERCDI0igABHCjYaAUkVJBJEFyIpZUREiBSjiBSqiBSvIillRIEyEhREIkcCSwJLBAxBAlEiKmVEIicEZUQMQQJEIiplRIgQA0lFEYEJW0lFBjIHDUACLksPJFVJRRAkEklFB0AAEEsOgQMSQAAISw6BExJBAjYjQQILSw8iWyIqZUQSREsEMgcOREsFQAHkSw6BExJAAdwiRQ1LDyRVSUUQgQMSQAFgSw6BExJAAVgiRQhLD4ExW0UKiBCMQAD7SwlFC0sMiA9JSwiID0RLAYgPXklOAkURSYgPVUlFDUsCSwEISUUMMgoiJxNlRHAARCInD2VEIicLZURLAQhLAksBD0RPAkwJTwIPRE8DCCcPTGciJwtlRAgnC0xnIicQZURPAggnEExnIicRZUQIJxFMZ0sPJFWBAxJBAHciJwZlREsQiBAYRRIIJwZMZ4gP+EEACksPJFWBExJBAAlLD4EpWycOTGcrSwpnJwdLC2ciKmVEIwgqTGdLD1cIAYABE6hBABAiK2VEQAAJKYHIAWcnByJnSw9LB0mIEnFISwFLDghFAklLCQhFAUsCIwhFA0L+eScGImdC/5NLDyRVSUUQgQMSQQAPIitlREsICUlFC0ULQv7tSw4kEkEAEiIrZUxFC0QiJwdlTEUMREL+1EsOgRMSQAAHSwlFC0L+xSJFCiJFC0L+vIgPPkEAU0sOgRMSQQAJIitlREUIQv6UIicGZURLEIgPNkUSCElFDSInDmVED0EABiJFCEL+dSInDmVESwwJSUUKIitlRA1BAAkiK2VERQhC/llLCEUIQv5SSw+BMVsiK2VESg5ETAlFCEL+PyInBmVESxCIDuFFEghFDUL+FUsCSURLAklLA0lOAwgyB08CFk8DFlBPAhZQTwIWUEwWUChMULAjQyJC/ceAAEcCNhoBRwIVJRJENhoCSSJZgQIISwEVEkRXAgBMIillREQnCExQSb1FAUQiJxllRDIDE0EAIjEAIicZZUQSQAAVMQBLAxJAAA0xAEsBvkRXACASQQEAI0SIEbqIEb8iKWVEgTISFERLAkmIDISIDAdGAkm+REmBSVtJTgJFCEmBUVtJRQhPAghJRQZEVwAgIicTZURwAEUBQQC3Sb5EgYADU0AArSNBAHgyCiInE2VETEsBcABESwVJTgIPREsCSU4DvkRJVwAgsTIATwOyEkyyFE8CshGBBLIQsgGzSYFJW0lOAkUJSYFRW0lOA0UJIhZMSwFcSUxcUU8DTL8iJw9lRElLAg9EIicLZURLAw9ETAknD0xnIicLZURMCScLTGdLBUlLBklOAwgyB08CFk8DFlBPAhZQTBZQSwJJFRZXBgJMUEyAAgAiUExQKExQsCNDIkL/UCJC/v02GgFJFSQSRBc2GgJJFSQSRBeIEJxKDEQnG08CZyccTGcyBxYoTFCwI0M2GgFJFSUSRDYaAkkVJBJEF0lOAiIpZUREJxYxAIgQM0SIEG2IEHIiKWVEgTISRCcISwJQSU4DvUUBREyICqNJRCInCmVECCInDWVEDkQiJxplREEACTIHIicaZUQOREcCvkSBKFtLA0lOAwgWgShMuyInCmVECCcKSwFnIicNZURMCRYoTFCwI0MiSTYaAUkVJRJENhoCSRUlEkQ2GgNHAhUkEkQXIillRESID+OID+giKWVEgTISFEQiJxtlREEACSInG2VEMgcORCInHGVEQQAJMgciJxxlRAxEMQBLBElOAhJEJwhLAVBJRQhJvUUBRCcISwVJTgJQSUUJvUUBREsCiAncSYgJ2E8CE0RLAUlETL5EJVsORCIqZUQiJwRlRA9AAA4iKmVEiArogQlbMgcNREsDSYgKM0sDSU4CiAoriAmuRgKICalGAksFSb5EJVtLAklOAksBDkRLAQkWTwIlTwK7SwVJvkQlW08CCBYlTLsoSwJQsCNDNhoBSRUlEkQ2GgJJFSMSRCJTJxUxAIgOv0QnCE8CUEm9RQFESYEwI7oiTwNUgTBMuzIHFihMULAjQzYaAUkVJRJENhoCSRUlEkQnFzEAiA6HRCIpZUSByAESFESIDreIDrwnCE8CUEm9RQEURCIWTwJLAVBLAVAnKFBLAVBLAVBLAVBLAVBMUL8yBxYoTFCwI0M2GgFJFSUSRDYaAkkVJRJEJwhLAlBJvUUBRDEATwMSRIgOYYgOZiJPArsyBxYoTFCwI0M2GgFJFSUSRCcITFBJvUUBRL5IKExQsCNDNhoBSRUlEkQnEkxnMgcWKExQsCNDgABJNhoBRwIVgWsSRDYaAklOAhWBSBJENhoDSU4CSRVLASVZSYEiEkRPAkxLAlJJTgMiWYEkCBJEiA3dIlVJJwxLAWdBACJJIxJAABxJgQISQAAVSYEDEkAADkmBBBJAAAdJgQUSQQGGI0QiJwxlTEUCREsESYEhW0lFCESBOVVJRQhBAB9LBiMSQAAYSwaBAhJAABBLBoEDEkAACEsGgQQSQQFGI0RJIxNBAAhLBIGSBlMURCIpZUQURCInFGVEFERLBEkjW0lxC0UBRCcsSwFnSwGBCVtJTwISRCcTSwFnsTIAMgoishKyFEyyEYEEshCyAbNJgRFbJw1MZycKImcnLksIZ0mBKVsnGksBZ0sBgTFbJy1LAWdLBklOAoEwWycOTGcnFEsKZ0sDgZIGUyciTGdLAYEQWytMZ0sBgShbJwZMZ0sBJVsnCUxnSwGBGFsnB0xnSwOBOlsnI0xnSwOBQlsnJExnSwOBSlsnHUxnSwOBUlsnHkxnSwOBWlsnJUxnSwOBkAZTJyZMZ0sDgZEGUycnTGdPA4FjWycFTGdLASRbKkxnSwGBOFsnEExnSwGBQFsnEUxnJw8iZycLImdLAjIHDURMIltLAgxEDERLAlcAICcqTGdLAVcCACcrTGcyBxYoTFCwI0MiQv63IkL+dyKAAEcDNhoBSRUkEkQXSTYaAkkVIxJEIlNMNhoDSU4CSSJZSU4DSYFBC4ECCE8CFRJEiAvxIicMZUxOA0QiKWVEFERJgRAORCInFGVEREyBEAtMgWQLgeYLCEkyDA1BABixgQayEIEFshknL7IeJy+yHyKyAbNC/+EiRQpLCUsEDEEAjksEVwIASUUNSwpJTgKBQQuBQVhJJFVJTgJFDkkiW0lFDUsFTwQISwESREsFTwOIBzRMgQlbSUUKREEAGUsJQQAnSwkjCYFBC0sMTIFBWIEJW0sIDkRLCEAABUsKIxJESwkjCEUKQv+QSwZJRCMJFicfTFBJvUUBREkigQK6F0lEIwmBQQuBAgiBQbpC/8BLBhYnH0xQSbxISwW/SwVBAA1LAUsECCcETGcpgTJnMgcWKExQsCNDIillRESICuSICuuICvAiKmVEIicEZURLAQ1EiAZcSVcIAUmAAQGoREsBVwAISwJXCQhLA1cRCEsEVxkISwVXIQhLBlcpCEsHVzEISwhXOQhPB08IUE8HUE8GUE8FUCIWUE8EUE8DUE8CUExQiAePRgIyBxYoTFCwI0MiRwSAAEk2GgFJFSQSRBc2GgJHAhWBSRJEIillRESICluICmCBQVtJgQQaQQC2IicMZUSBBRJEiAo4IicMZURJgQUSREsCSSJbSUUHIicEZUQSRElXCAFFDCRViAXXIicEZUSBEAqAAgAARQcWJx9MUElFCb1FAUEAB0sHvkxFB0RLBUkiWUmBEAxESwNJVwkISwFXEQhLAlcZCEsDVykISwRXMQhPBVc5CEsLFksSUE8GUE8FUE8EUE8DUE8CUExQSwMWUE8CTFBMIwgWVwYCXABLCEm8SEy/IicEZUQjCCcETGciKmVESwNJTwISRIgFDklFCElXCAFFCiRVSUUGIxJAAChLBIEEEkAAIEsEgQwSQAAYSwSBCxJAABBLBIESEkAACEsEgQUSQQBBI0RLCIABAalESwSBDBJAAAhLBIELEkEAJCNBABonGDEAiAjtREsGSwKIBitGAjIHFihMULAjQ4gJC0L/6CJC/9kiQv+8IillRElEIicMZUQWSZMkDkRXBwEiJw1lRCInCmVEIicUZUQiKmVEIicEZUQiK2VEIicHZUQiJwllRCInBmVEIicQZUQiJxFlRCInD2VEIicLZURPDhZPDkxQTw0WUE8MFlBPCxZQTwoWUE8JFlBPCBZQTwcWUE8GFlBPBRZQTwQWUE8DFlBPAhZQTBZQKExQsCNDIillREQiKmVEIicEZUQPQQAlIiplRBYnKFAiFkxLAVBLAVBLAVBLAVBLAVBLAVBMUChMULAjQyIqZUSIA71C//CICCkjQzYaAUkVJRJEiAgcJxJMZzIHFihMULAjQzYaAUkVJRJEiAgEJxlMZzIHFihMULAjQzYaAUkVIxJENhoCSU4CFSUSRDYaA0lOAhWBEBJEiAfXiAfeF0cCiAfogRQSQQAOJxJLA2cyBxYoTFCwI0NJgSgSQQARJxdLA1BJvUUBFERLAr9C/99JgTISQQARJxZLA1BJvUUBFERLAr9C/8dJgTwSQQARJyBLA1BJvUUBFERLAr9C/69JgUYSQQARJxVLA1BJvUUBFERLAr9C/5dJgVASQf+QJxhLA1BJvUUBFERLAr9C/382GgFJFSMSRDYaAklOAhUlEkSIBy2IBzQXRwKIBz5JgRQTRIEoEkEAFScXSwJQSb1FAUS8SDIHFihMULAjQ0mBMhJBAA8nFksCUEm9RQFEvEhC/+FJgTwSQQAPJyBLAlBJvUUBRLxIQv/LSYFGEkEADycVSwJQSb1FAUS8SEL/tUmBUBJB/64nGEsCUEm9RQFEvEhC/582GgFJFSMSRCJTJxUxAIgGZ0QnIUxnMgcWKExQsCNDIicSZUQoTFCwI0M2GgFJFSUSRCcXSwGIBj8nFksCiAY4JyBLA4gGMScVSwSIBionGE8FiAYjJygiTwZUI08FVIECTwRUgQNPA1SBBE8CVChMULAjQzYaAUkVIxJENhoCSU4CFSUSRBdJiAY7gwYUKDI8RlBPBo4GAE8AQAAxACIAEwABACcYSwFQSb1FAUS+SChMULAjQycVSwFQSb1FAUS+SEL/6ycgSwFQSb1FAUS+SEL/3CcWSwFQSb1FAUS+SEL/zScXSwFQSb1FAUS+SEL/voAQAAAAAAAAAAAAAAAAAAAAAEL/qYoBACcIi/9QvkSBgANTFESJigECJwiL/1BJvUUBREm+SCInEGVESwGBOVsJIicRZURLAoFBWwlLAiVbIicFZURPA0sCTwKIAJgiJwVlRE8DTwNPAogAiksCgUlbSwIIFk8DTFxJSYFRW0sCCBZcUSInEGVEFlw5IicRZUQWXEEiKmVEFlwxTwNMv4mKAQAigAAnCIv/UEm9RQFEIillRIEyEkEAAYmLAr5MSU4CjABEgShbSYwBQAABiYsASSVbiwFJTgMIFlwgIhZcKIsCTL8iJwplRElLAg9ETAknCkxniYoDAYv9QQAFi/5AAAIiiYv9i/4di/+XiYoBAYv/QAACIokiJw1lRElEIicFZUSL/0xPAoj/yomKAQGL/0AAAiKJIicNZUQiJwVlRIv/TIj/r4mKAQEiJwRlRIv/DUSL/4EQChYnH0xQSb1FAUSL/4EQGEsBIoECuhdLAQ1EgUELgQIIgUG6iYoCAIv/IxJAAB+L/yQSQAAYi/+BExJAABCL/4EMEkAACIv/gQsSQQADI0SJi/5AAAQiQv/1i/6BAxJAAAiL/oECEkEAGIv/gQMSQAAIi/+BEhJBAAQjQv/RIkL/zYv+IxJBACCL/4EDEkAAEIv/gRISQAAIi/+BBRJBAAQjQv+qIkL/pov+gQQSQQAoi/+BAxJAABiL/4EEEkAAEIv/gRISQAAIi/+BBRJBAAQjQv96IkL/dov+gQUSQQAIi/+BAxJC/2YiQv9iIicMZUQjEkEACiInImVEQQACI4kiiYoBAov/gRFbSUEAECInCWVEQQAIIicHZURAAAYii/9PAokiJwdlRCInCWVEIicFZUSI/mciJwVlRIsATIj+XIv/TwKJigIBi/9AAAOL/okiJwVlRCInCWVEi/9LAoj+OwhJRCInBWVEi/5MTwKI/iuJigICIoAARwiL/iJbIiplRBJEi/6BCVsyBw5Ei/4kVUkjEklBAF0iKWVEgTISRCInCmVEIicNZUQSRIv+gTFbK0sBZycHTGeL/oEhWycJTGcnBiJni/6BKVsnDkxnIiplRCMIKkxnKYFkZ4sLRCInFGVEi/5MIogBxUmM/ov/jAGMAIkiKWVEgTISFEQiJwZlRIv+iP75jP4IJwZMZ4sKgQwSQQFji/+BIVsiJyRlRCInBWVEiP1zIicjZUQIjAYiJyZlREEAEyInHWVEiwYNQQAIIicdZUyMBkQiJydlREEAEyInHmVEiwYMQQAIIiceZUyMBkQnCYsGZ4sKgQQSQQDzi/6BMVsrSwFnJwdMZ4j+Z0EA1IsKgQUSQQCyIicFZUyMAkQijAEijAeL/oEZW0mMCEEAD4sCiwiI/pZJjAIjjAeMASIqZUQjCIwDIicEZUSLAw1BAFKLA4j9H0mMACRVSYwEgQMSQAAQiwSBExJBADOLAIEZW0EAKyNBAAiLB0EADCKMB4sDIwiMA0L/vYsAgRlbiwJMiP44SYwCiwEIjAFC/+EiQv/SiwFEIitlRIv+gTlbJBpAAAYiJwZlRAgiJwVlRIsBiPxfJw5MZyIqZUQjCCpMZ4v+IkmIAF9JjP6L/4wBjACJi/6BKVsnDkxnQv/aiwqBEhJB/xIiK2VEJwdMZ0L/B4sKgQsSQQAbi/6BIVtJjAVAAAgiJyVlTIwFRCcJiwVnQv7Pi/6BIVtJjAlB/sQnCYsJZ0L+vIoDATIIi/0iW4v9VwgBi/1XCQgyB4v9JFWL/kAARSMWSZMkDkRXBwEiJxNlRIsBSSMIiwAWTwIWUIsCUIsDUIsEFlCL/hZQTwNQi/8WUE8CFlBMFlCABJozK5VMULCL/YwAiYsFIxJAAAiLBYEEEkEABCNC/6mB/wFC/6OKAgGAAIv+i/9QSb1FAUEAH4sBvkQiWzIHSYwADkEAEIsBvkQkW4sAD0EABCOMAIkiQv/5MQAiJxJlRBJEiSInKWVEFESJIichZUQURImKAQCL/4EUEkAAMIv/gRkSQAAoi/+BKBJAACCL/4EyEkAAGIv/gTwSQAAQi/+BRhJAAAiL/4FQEkEAAyNEiSJC//o=", + "approval": "DCAEAAEIICYwBBUffHUGc3RhdHVzDGV2ZW50X2N1cnNvchVvdXRzdGFuZGluZ19wcmluY2lwYWwUc2NoZWR1bGVfZW50cnlfY291bnQRZml4ZWRfcG9pbnRfc2NhbGUQYWNjcnVlZF9pbnRlcmVzdBlpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlClIjQWNjb3VudCMVbm9taW5hbF9pbnRlcmVzdF9yYXRlFHJlc2VydmVkX3VuaXRzX3RvdGFsEnJlc2VydmVkX3ByaW5jaXBhbA1jb250cmFjdF90eXBlC3RvdGFsX3VuaXRzGW5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24RcmVzZXJ2ZWRfaW50ZXJlc3QZY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleBpjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleAtSI0FycmFuZ2VyIxNzZXR0bGVtZW50X2Fzc2V0X2lkF2luaXRpYWxfZXhjaGFuZ2VfYW1vdW50DFIjQXV0aG9yaXR5IxBSI1ByaW1hcnlEZWFsZXIjEVIjQWNjb3VudE1hbmFnZXIjC1IjT2JzZXJ2ZXIjC1IjT3BEYWVtb24jFWluaXRpYWxfZXhjaGFuZ2VfZGF0ZRV0cmFuc2Zlcl9vcGVuaW5nX2RhdGUVdHJhbnNmZXJfY2xvc3VyZV9kYXRlEHJhdGVfcmVzZXRfZmxvb3IOcmF0ZV9yZXNldF9jYXACUyMKUiNUcnVzdGVlIw9hc3NldF9zdXNwZW5kZWQcZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbhFyYXRlX3Jlc2V0X3NwcmVhZBVyYXRlX3Jlc2V0X211bHRpcGxpZXIPcmF0ZV9yZXNldF9uZXh0FGhhc19yYXRlX3Jlc2V0X2Zsb29yEmhhc19yYXRlX3Jlc2V0X2NhcAEAD2Fzc2V0X2RlZmF1bHRlZA9wcm9zcGVjdHVzX2hhc2gOcHJvc3BlY3R1c191cmwVZGVub21pbmF0aW9uX2Fzc2V0X2lkDW1hdHVyaXR5X2RhdGUUZGF5X2NvdW50X2NvbnZlbnRpb24DBoEBMRhAAK0nEjIDZycZMgNnJyEiZycpImcpImcnDCJnJyqAAGcnK4AAZycsImcnEyJnJxoiZyctImcnGyJnJxwiZycuImcnDSJnJwoiZycUImcrImcnDiJnJyIiZycHImcnBiJnJwkiZycjImcnJCJnJx0iZyceImcnJSJnJyYiZycnImcnCyJnJw8iZycQImcnESJnKiJnJwQiZycFImcxNYEEEkQxNIElEkQxNxREMTYURIAEkU8E6zYaAI4BAMAxGRREMRhBAKmCFwS0RhjIBOeDJSkElDiHIwRshePuBL3RqUQEfA8YEgQU/BDvBHSnKX8ECdT+FASam/qFBIXu0z0EqywPxATZ8iWsBI6m50wEAq9VegSC9xstBO8E9dME3zQ1UAQ9voC9BB4+SOcEAQyCmQR0BqzSBBpyou42GgCOFwAbAscEIwRNBNcFyAYCBloGjQa7CK4J6ApiC9QMZwytDMUM3Q2SDigORw5SDpwAgASVbXFWNhoAjgEGmAAxGYEEEjEYEERCDI0igABHCjYaAUkVJBJEFyIpZUREiBSjiBSqiBSvIillRIEyEhREIkcCSwJLBAxBAlEiKmVEIicEZUQMQQJEIiplRIgQA0lFEYEJW0lFBjIHDUACLksPJFVJRRAkEklFB0AAEEsOgQMSQAAISw6BExJBAjYjQQILSw8iWyIqZUQSREsEMgcOREsFQAHkSw6BExJAAdwiRQ1LDyRVSUUQgQMSQAFgSw6BExJAAVgiRQhLD4ExW0UKiBCMQAD7SwlFC0sMiA9JSwiID0RLAYgPXklOAkURSYgPVUlFDUsCSwEISUUMMgoiJxNlRHAARCInD2VEIicLZURLAQhLAksBD0RPAkwJTwIPRE8DCCcPTGciJwtlRAgnC0xnIicQZURPAggnEExnIicRZUQIJxFMZ0sPJFWBAxJBAHciJwZlREsQiBAYRRIIJwZMZ4gP+EEACksPJFWBExJBAAlLD4EpWycOTGcrSwpnJwdLC2ciKmVEIwgqTGdLD1cIAYABE6hBABAiK2VEQAAJKYHIAWcnByJnSw9LB0mIEnFISwFLDghFAklLCQhFAUsCIwhFA0L+eScGImdC/5NLDyRVSUUQgQMSQQAPIitlREsICUlFC0ULQv7tSw4kEkEAEiIrZUxFC0QiJwdlTEUMREL+1EsOgRMSQAAHSwlFC0L+xSJFCiJFC0L+vIgPPkEAU0sOgRMSQQAJIitlREUIQv6UIicGZURLEIgPNkUSCElFDSInDmVED0EABiJFCEL+dSInDmVESwwJSUUKIitlRA1BAAkiK2VERQhC/llLCEUIQv5SSw+BMVsiK2VESg5ETAlFCEL+PyInBmVESxCIDuFFEghFDUL+FUsCSURLAklLA0lOAwgyB08CFk8DFlBPAhZQTwIWUEwWUChMULAjQyJC/ceAAEcCNhoBRwIVJRJENhoCSSJZgQIISwEVEkRXAgBMIillREQnCExQSb1FAUQiJxllRDIDE0EAIjEAIicZZUQSQAAVMQBLAxJAAA0xAEsBvkRXACASQQEAI0SIEbqIEb8iKWVEgTISFERLAkmIDISIDAdGAkm+REmBSVtJTgJFCEmBUVtJRQhPAghJRQZEVwAgIicTZURwAEUBQQC3Sb5EgYADU0AArSNBAHgyCiInE2VETEsBcABESwVJTgIPREsCSU4DvkRJVwAgsTIATwOyEkyyFE8CshGBBLIQsgGzSYFJW0lOAkUJSYFRW0lOA0UJIhZMSwFcSUxcUU8DTL8iJw9lRElLAg9EIicLZURLAw9ETAknD0xnIicLZURMCScLTGdLBUlLBklOAwgyB08CFk8DFlBPAhZQTBZQSwJJFRZXBgJMUEyAAgAiUExQKExQsCNDIkL/UCJC/v02GgFJFSQSRBc2GgJJFSQSRBeIEJxKDEQnG08CZyccTGcyBxYoTFCwI0M2GgFJFSUSRDYaAkkVJBJEF0lOAiIpZUREJxYxAIgQM0SIEG2IEHIiKWVEgTISRCcISwJQSU4DvUUBREyICqNJRCInCmVECCInDWVEDkQiJxplREEACTIHIicaZUQOREcCvkSBKFtLA0lOAwgWgShMuyInCmVECCcKSwFnIicNZURMCRYoTFCwI0MiSTYaAUkVJRJENhoCSRUlEkQ2GgNHAhUkEkQXIillRESID+OID+giKWVEgTISFEQiJxtlREEACSInG2VEMgcORCInHGVEQQAJMgciJxxlRAxEMQBLBElOAhJEJwhLAVBJRQhJvUUBRCcISwVJTgJQSUUJvUUBREsCiAncSYgJ2E8CE0RLAUlETL5EJVsORCIqZUQiJwRlRA9AAA4iKmVEiArogQlbMgcNREsDSYgKM0sDSU4CiAoriAmuRgKICalGAksFSb5EJVtLAklOAksBDkRLAQkWTwIlTwK7SwVJvkQlW08CCBYlTLsoSwJQsCNDNhoBSRUlEkQ2GgJJFSMSRCJTJxUxAIgOv0QnCE8CUEm9RQFESYEwI7oiTwNUgTBMuzIHFihMULAjQzYaAUkVJRJENhoCSRUlEkQnFzEAiA6HRCIpZUSByAESFESIDreIDrwnCE8CUEm9RQEURCIWTwJLAVBLAVAnKFBLAVBLAVBLAVBLAVBMUL8yBxYoTFCwI0M2GgFJFSUSRDYaAkkVJRJEJwhLAlBJvUUBRDEATwMSRIgOYYgOZiJPArsyBxYoTFCwI0M2GgFJFSUSRCcITFBJvUUBRL5IKExQsCNDNhoBSRUlEkQnEkxnMgcWKExQsCNDgABJNhoBRwIVgWsSRDYaAklOAhWBSBJENhoDSU4CSRVLASVZSYEiEkRPAkxLAlJJTgMiWYEkCBJEiA3dIlVJJwxLAWdBACJJIxJAABxJgQISQAAVSYEDEkAADkmBBBJAAAdJgQUSQQGGI0QiJwxlTEUCREsESYEhW0lFCESBOVVJRQhBAB9LBiMSQAAYSwaBAhJAABBLBoEDEkAACEsGgQQSQQFGI0RJIxNBAAhLBIGSBlMURCIpZUQURCInFGVEFERLBEkjW0lxC0UBRCcsSwFnSwGBCVtJTwISRCcTSwFnsTIAMgoishKyFEyyEYEEshCyAbNJgRFbJw1MZycKImcnLksIZ0mBKVsnGksBZ0sBgTFbJy1LAWdLBklOAoEwWycOTGcnFEsKZ0sDgZIGUyciTGdLAYEQWytMZ0sBgShbJwZMZ0sBJVsnCUxnSwGBGFsnB0xnSwOBOlsnI0xnSwOBQlsnJExnSwOBSlsnHUxnSwOBUlsnHkxnSwOBWlsnJUxnSwOBkAZTJyZMZ0sDgZEGUycnTGdPA4FjWycFTGdLASRbKkxnSwGBOFsnEExnSwGBQFsnEUxnJw8iZycLImdLAjIHDURMIltLAgxEDERLAlcAICcqTGdLAVcCACcrTGcyBxYoTFCwI0MiQv63IkL+dyKAAEcDNhoBSRUkEkQXSTYaAkkVIxJEIlNMNhoDSU4CSSJZSU4DSYFBC4ECCE8CFRJEiAvxIicMZUxOA0QiKWVEFERJgRAORCInFGVEREyBEAtMgWQLgeYLCEkyDA1BABixgQayEIEFshknL7IeJy+yHyKyAbNC/+EiRQpLCUsEDEEAjksEVwIASUUNSwpJTgKBQQuBQVhJJFVJTgJFDkkiW0lFDUsFTwQISwESREsFTwOIBzRMgQlbSUUKREEAGUsJQQAnSwkjCYFBC0sMTIFBWIEJW0sIDkRLCEAABUsKIxJESwkjCEUKQv+QSwZJRCMJFicfTFBJvUUBREkigQK6F0lEIwmBQQuBAgiBQbpC/8BLBhYnH0xQSbxISwW/SwVBAA1LAUsECCcETGcpgTJnMgcWKExQsCNDIillRESICuSICuuICvAiKmVEIicEZURLAQ1EiAZcSVcIAUmAAQGoREsBVwAISwJXCQhLA1cRCEsEVxkISwVXIQhLBlcpCEsHVzEISwhXOQhPB08IUE8HUE8GUE8FUCIWUE8EUE8DUE8CUExQiAePRgIyBxYoTFCwI0MiRwSAAEk2GgFJFSQSRBc2GgJHAhWBSRJEIillRESICluICmCBQVtJgQQaQQC2IicMZUSBBRJEiAo4IicMZURJgQUSREsCSSJbSUUHIicEZUQSRElXCAFFDCRViAXXIicEZUSBEAqAAgAARQcWJx9MUElFCb1FAUEAB0sHvkxFB0RLBUkiWUmBEAxESwNJVwkISwFXEQhLAlcZCEsDVykISwRXMQhPBVc5CEsLFksSUE8GUE8FUE8EUE8DUE8CUExQSwMWUE8CTFBMIwgWVwYCXABLCEm8SEy/IicEZUQjCCcETGciKmVESwNJTwISRIgFDklFCElXCAFFCiRVSUUGIxJAAChLBIEEEkAAIEsEgQwSQAAYSwSBCxJAABBLBIESEkAACEsEgQUSQQBBI0RLCIABAalESwSBDBJAAAhLBIELEkEAJCNBABonGDEAiAjtREsGSwKIBitGAjIHFihMULAjQ4gJC0L/6CJC/9kiQv+8IillRElEIicMZUQWSZMkDkRXBwEiJw1lRCInCmVEIicUZUQiKmVEIicEZUQiK2VEIicHZUQiJwllRCInBmVEIicQZUQiJxFlRCInD2VEIicLZURPDhZPDkxQTw0WUE8MFlBPCxZQTwoWUE8JFlBPCBZQTwcWUE8GFlBPBRZQTwQWUE8DFlBPAhZQTBZQKExQsCNDIillREQiKmVEIicEZUQPQQAlIiplRBYnKFAiFkxLAVBLAVBLAVBLAVBLAVBLAVBMUChMULAjQyIqZUSIA71C//CICCkjQzYaAUkVJRJEiAgcJxJMZzIHFihMULAjQzYaAUkVJRJEiAgEJxlMZzIHFihMULAjQzYaAUkVIxJENhoCSU4CFSUSRDYaA0lOAhWBEBJEiAfXiAfeF0cCiAfogRQSQQAOJxJLA2cyBxYoTFCwI0NJgSgSQQARJxdLA1BJvUUBFERLAr9C/99JgTISQQARJxZLA1BJvUUBFERLAr9C/8dJgTwSQQARJyBLA1BJvUUBFERLAr9C/69JgUYSQQARJxVLA1BJvUUBFERLAr9C/5dJgVASQf+QJxhLA1BJvUUBFERLAr9C/382GgFJFSMSRDYaAklOAhUlEkSIBy2IBzQXRwKIBz5JgRQTRIEoEkEAFScXSwJQSb1FAUS8SDIHFihMULAjQ0mBMhJBAA8nFksCUEm9RQFEvEhC/+FJgTwSQQAPJyBLAlBJvUUBRLxIQv/LSYFGEkEADycVSwJQSb1FAUS8SEL/tUmBUBJB/64nGEsCUEm9RQFEvEhC/582GgFJFSMSRCJTJxUxAIgGZ0QnIUxnMgcWKExQsCNDIicSZUQoTFCwI0M2GgFJFSUSRCcXSwGIBj8nFksCiAY4JyBLA4gGMScVSwSIBionGE8FiAYjJygiTwZUI08FVIECTwRUgQNPA1SBBE8CVChMULAjQzYaAUkVIxJENhoCSU4CFSUSRBdJiAY7gwYUKDI8RlBPBo4GAE8AQAAxACIAEwABACcYSwFQSb1FAUS+SChMULAjQycVSwFQSb1FAUS+SEL/6ycgSwFQSb1FAUS+SEL/3CcWSwFQSb1FAUS+SEL/zScXSwFQSb1FAUS+SEL/voAQAAAAAAAAAAAAAAAAAAAAAEL/qYoBACcIi/9QvkSBgANTFESJigECJwiL/1BJvUUBREm+SCInEGVESwGBOVsJIicRZURLAoFBWwlLAiVbIicFZURPA0sCTwKIAJgiJwVlRE8DTwNPAogAiksCgUlbSwIIFk8DTFxJSYFRW0sCCBZcUSInEGVEFlw5IicRZUQWXEEiKmVEFlwxTwNMv4mKAQAigAAnCIv/UEm9RQFEIillRIEyEkEAAYmLAr5MSU4CjABEgShbSYwBQAABiYsASSVbiwFJTgMIFlwgIhZcKIsCTL8iJwplRElLAg9ETAknCkxniYoDAYv9QQAFi/5AAAIiiYv9i/4di/+XiYoBAYv/QAACIokiJw1lRElEIicFZUSL/0xPAoj/yomKAQGL/0AAAiKJIicNZUQiJwVlRIv/TIj/r4mKAQEiJwRlRIv/DUSL/4EQChYnH0xQSb1FAUSL/4EQGEsBIoECuhdLAQ1EgUELgQIIgUG6iYoCAIv/IxJAAB+L/yQSQAAYi/+BExJAABCL/4EMEkAACIv/gQsSQQADI0SJi/5AAAQiQv/1i/6BAxJAAAiL/oECEkEAGIv/gQMSQAAIi/+BEhJBAAQjQv/RIkL/zYv+IxJBACCL/4EDEkAAEIv/gRISQAAIi/+BBRJBAAQjQv+qIkL/pov+gQQSQQAoi/+BAxJAABiL/4EEEkAAEIv/gRISQAAIi/+BBRJBAAQjQv96IkL/dov+gQUSQQAIi/+BAxJC/2YiQv9iIicMZUQjEkEACiInImVEQQACI4kiiYoBAov/gRFbSUEAECInCWVEQQAIIicHZURAAAYii/9PAokiJwdlRCInCWVEIicFZUSI/mciJwVlRIsATIj+XIv/TwKJigIBi/9AAAOL/okiJwVlRCInCWVEi/9LAoj+OwhJRCInBWVEi/5MTwKI/iuJigICIoAARwiL/iJbIiplRBJEi/6BCVsyBw5Ei/4kVUkjEklBAF0iKWVEgTISRCInCmVEIicNZUQSRIv+gTFbK0sBZycHTGeL/oEhWycJTGcnBiJni/6BKVsnDkxnIiplRCMIKkxnKYFkZ4sLRCInFGVEi/5MIogBxUmM/ov/jAGMAIkiKWVEgTISFEQiJwZlRIv+iP75jP4IJwZMZ4sKgQwSQQFji/+BIVsiJyRlRCInBWVEiP1zIicjZUQIjAYiJyZlREEAEyInHWVEiwYNQQAIIicdZUyMBkQiJydlREEAEyInHmVEiwYMQQAIIiceZUyMBkQnCYsGZ4sKgQQSQQDzi/6BMVsrSwFnJwdMZ4j+Z0EA1IsKgQUSQQCyIicFZUyMAkQijAEijAeL/oEZW0mMCEEAD4sCiwiI/pZJjAIjjAeMASIqZUQjCIwDIicEZUSLAw1BAFKLA4j9H0mMACRVSYwEgQMSQAAQiwSBExJBADOLAIEZW0EAKyNBAAiLB0EADCKMB4sDIwiMA0L/vYsAgRlbiwJMiP44SYwCiwEIjAFC/+EiQv/SiwFEIitlRIv+gTlbJBpAAAYiJwZlRAgiJwVlRIsBiPxfJw5MZyIqZUQjCCpMZ4v+IkmIAF9JjP6L/4wBjACJi/6BKVsnDkxnQv/aiwqBEhJB/xIiK2VEJwdMZ0L/B4sKgQsSQQAbi/6BIVtJjAVAAAgiJyVlTIwFRCcJiwVnQv7Pi/6BIVtJjAlB/sQnCYsJZ0L+vIoDATIIi/0iW4v9VwgBi/1XCQgyB4v9JFWL/kAARSMWSZMkDkRXBwEiJxNlRIsBSSMIiwAWTwIWUIsCUIsDUIsEFlCL/hZQTwNQi/8WUE8CFlBMFlCABJozK5VMULCL/YwAiYsFIxJAAAiLBYEEEkEABCNC/6mB/wFC/6OKAgGAAIv+i/9QSb1FAUEAH4sBvkQiWzIHSYwADkEAEIsBvkQkW4sAD0EABCOMAIkiQv/5MQAiJxJlRBJEiSInKWVEFESJIichZUQURImKAQCL/4EUEkAAMIv/gRkSQAAoi/+BKBJAACCL/4EyEkAAGIv/gTwSQAAQi/+BRhJAAAiL/4FQEkEAAyNEiSJC//o=", "clear": "DIEBQw==" }, "compilerInfo": { diff --git a/smart_contracts/artifacts/d_asa/dasa_client.py b/smart_contracts/artifacts/d_asa/dasa_client.py index 10de2199..29060a19 100644 --- a/smart_contracts/artifacts/d_asa/dasa_client.py +++ b/smart_contracts/artifacts/d_asa/dasa_client.py @@ -19,7 +19,7 @@ import algokit_utils from algokit_utils import AlgorandClient as _AlgoKitAlgorandClient -_APP_SPEC_JSON = r"""{"arcs": [22, 28], "bareActions": {"call": [], "create": []}, "methods": [{"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "name": "max_event_count"}], "name": "fund_due_cashflows", "returns": {"type": "(uint64,uint64,uint64,uint64,uint64)", "struct": "CashFundingResult"}, "desc": "Reserve due ACTUS cash events into the escrow-style claim ledger.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "name": "holding_address"}, {"type": "byte[]", "name": "payment_info"}], "name": "claim_due_cashflows", "returns": {"type": "(uint64,uint64,uint64,uint64,byte[])", "struct": "CashClaimResult"}, "desc": "Withdraw the holder's already funded ACTUS cash entitlements.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "name": "open_date"}, {"type": "uint64", "name": "closure_date"}], "name": "set_transfer_schedule", "returns": {"type": "uint64"}, "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "name": "holding_address"}, {"type": "uint64", "name": "units"}], "name": "primary_distribution", "returns": {"type": "uint64"}, "desc": "Reserve units for a holder before IED finalizes issuance.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "name": "sender_holding_address"}, {"type": "address", "name": "receiver_holding_address"}, {"type": "uint64", "name": "units"}], "name": "transfer", "returns": {"type": "uint64"}, "desc": "Transfer active units after settling both counterparties to the current cursor.\nReturns the number of units moved. The ACTUS kernel no longer persists a nominal per-unit value on-chain, so transfer results are unit-based.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "bool", "desc": "Suspension status", "name": "suspended"}], "name": "account_gov_suspension", "returns": {"type": "uint64", "desc": "Timestamp of the set account suspension status"}, "desc": "Set account suspension status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "address", "desc": "Account Payment Address", "name": "payment_address"}], "name": "account_open", "returns": {"type": "uint64", "desc": "Timestamp of the account opening"}, "desc": "Open a contract account with a new position and register its payment address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "address", "desc": "Account Payment Address", "name": "payment_address"}], "name": "account_update_payment_address", "returns": {"type": "uint64", "desc": "Timestamp of the account update"}, "desc": "Update the Payment Address of an account", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}], "name": "account_get_position", "returns": {"type": "(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64)", "desc": "Account position", "struct": "AccountPosition"}, "desc": "Get account position", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": [], "create": ["NoOp"]}, "args": [{"type": "address", "desc": "D-ASA Arranger Address", "name": "arranger"}], "name": "contract_create", "returns": {"type": "uint64", "desc": "UNIX timestamp of contract creation"}, "desc": "Create a new D-ASA contract and set the Arranger role", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64)", "desc": "Normalized ACTUS terms", "name": "terms", "struct": "NormalizedActusTerms"}, {"type": "(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "desc": "Initial kernel state (pre-IED)", "name": "initial_state", "struct": "InitialKernelState"}, {"type": "(byte[32],string)", "desc": "Prospectus (informational only)", "name": "prospectus", "struct": "Prospectus"}], "name": "contract_config", "returns": {"type": "uint64", "desc": "UNIX timestamp of contract configuration"}, "desc": "Partial contract configuration with: normalized ACTUS terms, initial kernel\nstate (pre-IED), prospectus (informational only). The contract stays inactive until all schedule pages are configured next.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "name": "schedule_page_index"}, {"type": "bool", "name": "is_last_page"}, {"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[]", "name": "schedule_page"}], "name": "contract_schedule", "returns": {"type": "uint64"}, "desc": "Upload one normalized schedule page.\nThe configuration operation is considered complete only when the last page is stored. At that point `schedule_entry_count` is finalized and the contract moves to `STATUS_PENDING_IED`.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "execute_ied", "returns": {"type": "uint64"}, "desc": "Execute the first due `IED` entry and activate the contract.\n`IED` is the one non-cash event that moves the app from `STATUS_PENDING_IED` to `STATUS_ACTIVE`.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "name": "event_id"}, {"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "name": "payload", "struct": "ObservedEventRequest"}], "name": "apply_non_cash_event", "returns": {"type": "uint64"}, "desc": "Apply the next due non-cash event, optionally appending one first.\nObserved payloads are appended before execution when flagged. Rate reset events require the interest oracle because they can change the running nominal rate; other non-cash events stay arranger-controlled.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_contract_state", "returns": {"type": "(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "struct": "KernelState"}, "desc": "Return a readonly snapshot of the generic ACTUS kernel state.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_next_due_event", "returns": {"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "struct": "ExecutionScheduleEntry"}, "desc": "Return the next boxed schedule entry, or a zeroed sentinel if ended.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["UpdateApplication"], "create": []}, "args": [], "name": "contract_update", "returns": {"type": "void"}, "desc": "Update D-ASA application.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "New Arranger address", "name": "new_arranger"}], "name": "rbac_rotate_arranger", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Rotate the Arranger address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Operation Daemon address", "name": "address"}], "name": "rbac_set_op_daemon", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Non-Normative: Set the Operation Daemon address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}, {"type": "(uint64,uint64)", "desc": "Role time validity", "name": "validity", "struct": "RoleValidity"}], "name": "rbac_assign_role", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Assign a role to an address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}], "name": "rbac_revoke_role", "returns": {"type": "uint64", "desc": "Timestamp of the role revocation"}, "desc": "Revoke a role from an address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Suspension status", "name": "suspended"}], "name": "rbac_gov_asset_suspension", "returns": {"type": "uint64", "desc": "Timestamp of the set asset suspension status"}, "desc": "Set asset suspension status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "rbac_get_arranger", "returns": {"type": "address", "desc": "Arranger address"}, "desc": "Get Arranger address", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Address to get roles for", "name": "address"}], "name": "rbac_get_address_roles", "returns": {"type": "(bool,bool,bool,bool,bool)", "desc": "Roles mask: (Account Manager, Primary Dealer, Trustee, Authority, Observer)"}, "desc": "Non-normative - Get roles assigned to an address", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}], "name": "rbac_get_role_validity", "returns": {"type": "(uint64,uint64)", "desc": "Role validity", "struct": "RoleValidity"}, "desc": "Get role validity", "events": [], "readonly": true, "recommendations": {}}], "name": "DASA", "state": {"keys": {"box": {}, "global": {"arranger": {"key": "UiNBcnJhbmdlciM=", "keyType": "AVMBytes", "valueType": "address"}, "op_daemon": {"key": "UiNPcERhZW1vbiM=", "keyType": "AVMBytes", "valueType": "address"}, "asset_suspended": {"key": "YXNzZXRfc3VzcGVuZGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "asset_defaulted": {"key": "YXNzZXRfZGVmYXVsdGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "status": {"key": "c3RhdHVz", "keyType": "AVMString", "valueType": "AVMUint64"}, "contract_type": {"key": "Y29udHJhY3RfdHlwZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "prospectus_hash": {"key": "cHJvc3BlY3R1c19oYXNo", "keyType": "AVMString", "valueType": "AVMBytes"}, "prospectus_url": {"key": "cHJvc3BlY3R1c191cmw=", "keyType": "AVMString", "valueType": "AVMString"}, "denomination_asset_id": {"key": "ZGVub21pbmF0aW9uX2Fzc2V0X2lk", "keyType": "AVMString", "valueType": "AVMUint64"}, "settlement_asset_id": {"key": "c2V0dGxlbWVudF9hc3NldF9pZA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "initial_exchange_date": {"key": "aW5pdGlhbF9leGNoYW5nZV9kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "maturity_date": {"key": "bWF0dXJpdHlfZGF0ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "transfer_opening_date": {"key": "dHJhbnNmZXJfb3BlbmluZ19kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "transfer_closure_date": {"key": "dHJhbnNmZXJfY2xvc3VyZV9kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "day_count_convention": {"key": "ZGF5X2NvdW50X2NvbnZlbnRpb24=", "keyType": "AVMString", "valueType": "AVMUint64"}, "total_units": {"key": "dG90YWxfdW5pdHM=", "keyType": "AVMString", "valueType": "AVMUint64"}, "reserved_units_total": {"key": "cmVzZXJ2ZWRfdW5pdHNfdG90YWw=", "keyType": "AVMString", "valueType": "AVMUint64"}, "initial_exchange_amount": {"key": "aW5pdGlhbF9leGNoYW5nZV9hbW91bnQ=", "keyType": "AVMString", "valueType": "AVMUint64"}, "outstanding_principal": {"key": "b3V0c3RhbmRpbmdfcHJpbmNpcGFs", "keyType": "AVMString", "valueType": "AVMUint64"}, "next_principal_redemption": {"key": "bmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbg==", "keyType": "AVMString", "valueType": "AVMUint64"}, "dynamic_principal_redemption": {"key": "ZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbg==", "keyType": "AVMString", "valueType": "AVMUint64"}, "interest_calculation_base": {"key": "aW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "accrued_interest": {"key": "YWNjcnVlZF9pbnRlcmVzdA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "nominal_interest_rate": {"key": "bm9taW5hbF9pbnRlcmVzdF9yYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_spread": {"key": "cmF0ZV9yZXNldF9zcHJlYWQ=", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_multiplier": {"key": "cmF0ZV9yZXNldF9tdWx0aXBsaWVy", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_floor": {"key": "cmF0ZV9yZXNldF9mbG9vcg==", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_cap": {"key": "cmF0ZV9yZXNldF9jYXA=", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_next": {"key": "cmF0ZV9yZXNldF9uZXh0", "keyType": "AVMString", "valueType": "AVMUint64"}, "has_rate_reset_floor": {"key": "aGFzX3JhdGVfcmVzZXRfZmxvb3I=", "keyType": "AVMString", "valueType": "AVMUint64"}, "has_rate_reset_cap": {"key": "aGFzX3JhdGVfcmVzZXRfY2Fw", "keyType": "AVMString", "valueType": "AVMUint64"}, "reserved_principal": {"key": "cmVzZXJ2ZWRfcHJpbmNpcGFs", "keyType": "AVMString", "valueType": "AVMUint64"}, "reserved_interest": {"key": "cmVzZXJ2ZWRfaW50ZXJlc3Q=", "keyType": "AVMString", "valueType": "AVMUint64"}, "cumulative_interest_index": {"key": "Y3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "cumulative_principal_index": {"key": "Y3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXg=", "keyType": "AVMString", "valueType": "AVMUint64"}, "event_cursor": {"key": "ZXZlbnRfY3Vyc29y", "keyType": "AVMString", "valueType": "AVMUint64"}, "schedule_entry_count": {"key": "c2NoZWR1bGVfZW50cnlfY291bnQ=", "keyType": "AVMString", "valueType": "AVMUint64"}, "fixed_point_scale": {"key": "Zml4ZWRfcG9pbnRfc2NhbGU=", "keyType": "AVMString", "valueType": "AVMUint64"}}, "local": {}}, "maps": {"box": {"account_manager": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNBY2NvdW50TWFuYWdlciM="}, "primary_dealer": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNQcmltYXJ5RGVhbGVyIw=="}, "trustee": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNUcnVzdGVlIw=="}, "authority": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNBdXRob3JpdHkj"}, "observer": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNPYnNlcnZlciM="}, "schedule_page": {"keyType": "uint64", "valueType": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[]", "prefix": "UyM="}, "account": {"keyType": "address", "valueType": "AccountPosition", "prefix": "UiNBY2NvdW50Iw=="}}, "global": {}, "local": {}}, "schema": {"global": {"bytes": 4, "ints": 37}, "local": {"bytes": 0, "ints": 0}}}, "structs": {"AccountPosition": [{"name": "payment_address", "type": "address"}, {"name": "units", "type": "uint64"}, {"name": "reserved_units", "type": "uint64"}, {"name": "suspended", "type": "bool"}, {"name": "settled_cursor", "type": "uint64"}, {"name": "interest_checkpoint", "type": "uint64"}, {"name": "principal_checkpoint", "type": "uint64"}, {"name": "claimable_interest", "type": "uint64"}, {"name": "claimable_principal", "type": "uint64"}], "CashClaimResult": [{"name": "interest_amount", "type": "uint64"}, {"name": "principal_amount", "type": "uint64"}, {"name": "total_amount", "type": "uint64"}, {"name": "timestamp", "type": "uint64"}, {"name": "context", "type": "byte[]"}], "CashFundingResult": [{"name": "funded_interest", "type": "uint64"}, {"name": "funded_principal", "type": "uint64"}, {"name": "total_funded", "type": "uint64"}, {"name": "processed_events", "type": "uint64"}, {"name": "timestamp", "type": "uint64"}], "ExecutionScheduleEntry": [{"name": "event_id", "type": "uint64"}, {"name": "event_type", "type": "uint8"}, {"name": "scheduled_time", "type": "uint64"}, {"name": "accrual_factor", "type": "uint64"}, {"name": "redemption_accrual_factor", "type": "uint64"}, {"name": "next_nominal_interest_rate", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "next_outstanding_principal", "type": "uint64"}, {"name": "flags", "type": "uint64"}], "InitialKernelState": [{"name": "status_date", "type": "uint64"}, {"name": "event_cursor", "type": "uint64"}, {"name": "outstanding_principal", "type": "uint64"}, {"name": "interest_calculation_base", "type": "uint64"}, {"name": "nominal_interest_rate", "type": "uint64"}, {"name": "accrued_interest", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "cumulative_interest_index", "type": "uint64"}, {"name": "cumulative_principal_index", "type": "uint64"}], "KernelState": [{"name": "contract_type", "type": "uint8"}, {"name": "status", "type": "uint64"}, {"name": "total_units", "type": "uint64"}, {"name": "reserved_units_total", "type": "uint64"}, {"name": "initial_exchange_amount", "type": "uint64"}, {"name": "event_cursor", "type": "uint64"}, {"name": "schedule_entry_count", "type": "uint64"}, {"name": "outstanding_principal", "type": "uint64"}, {"name": "interest_calculation_base", "type": "uint64"}, {"name": "nominal_interest_rate", "type": "uint64"}, {"name": "accrued_interest", "type": "uint64"}, {"name": "cumulative_interest_index", "type": "uint64"}, {"name": "cumulative_principal_index", "type": "uint64"}, {"name": "reserved_interest", "type": "uint64"}, {"name": "reserved_principal", "type": "uint64"}], "NormalizedActusTerms": [{"name": "contract_type", "type": "uint8"}, {"name": "denomination_asset_id", "type": "uint64"}, {"name": "settlement_asset_id", "type": "uint64"}, {"name": "total_units", "type": "uint64"}, {"name": "notional_principal", "type": "uint64"}, {"name": "initial_exchange_amount", "type": "uint64"}, {"name": "initial_exchange_date", "type": "uint64"}, {"name": "maturity_date", "type": "uint64"}, {"name": "day_count_convention", "type": "uint8"}, {"name": "rate_reset_spread", "type": "uint64"}, {"name": "rate_reset_multiplier", "type": "uint64"}, {"name": "rate_reset_floor", "type": "uint64"}, {"name": "rate_reset_cap", "type": "uint64"}, {"name": "rate_reset_next", "type": "uint64"}, {"name": "has_rate_reset_floor", "type": "bool"}, {"name": "has_rate_reset_cap", "type": "bool"}, {"name": "dynamic_principal_redemption", "type": "bool"}, {"name": "fixed_point_scale", "type": "uint64"}], "ObservedEventRequest": [{"name": "event_id", "type": "uint64"}, {"name": "event_type", "type": "uint8"}, {"name": "scheduled_time", "type": "uint64"}, {"name": "accrual_factor", "type": "uint64"}, {"name": "redemption_accrual_factor", "type": "uint64"}, {"name": "observed_rate", "type": "uint64"}, {"name": "next_nominal_interest_rate", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "next_outstanding_principal", "type": "uint64"}, {"name": "flags", "type": "uint64"}], "Prospectus": [{"name": "hash", "type": "byte[32]"}, {"name": "url", "type": "string"}], "RoleValidity": [{"name": "role_validity_start", "type": "uint64"}, {"name": "role_validity_end", "type": "uint64"}]}, "byteCode": {"approval": "DCAEAAEIICYwBBUffHUGc3RhdHVzDGV2ZW50X2N1cnNvchVvdXRzdGFuZGluZ19wcmluY2lwYWwUc2NoZWR1bGVfZW50cnlfY291bnQRZml4ZWRfcG9pbnRfc2NhbGUQYWNjcnVlZF9pbnRlcmVzdBlpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlClIjQWNjb3VudCMVbm9taW5hbF9pbnRlcmVzdF9yYXRlFHJlc2VydmVkX3VuaXRzX3RvdGFsEnJlc2VydmVkX3ByaW5jaXBhbA1jb250cmFjdF90eXBlC3RvdGFsX3VuaXRzGW5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24RcmVzZXJ2ZWRfaW50ZXJlc3QZY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleBpjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleAtSI0FycmFuZ2VyIxNzZXR0bGVtZW50X2Fzc2V0X2lkF2luaXRpYWxfZXhjaGFuZ2VfYW1vdW50DFIjQXV0aG9yaXR5IxBSI1ByaW1hcnlEZWFsZXIjEVIjQWNjb3VudE1hbmFnZXIjC1IjT2JzZXJ2ZXIjC1IjT3BEYWVtb24jFWluaXRpYWxfZXhjaGFuZ2VfZGF0ZRV0cmFuc2Zlcl9vcGVuaW5nX2RhdGUVdHJhbnNmZXJfY2xvc3VyZV9kYXRlEHJhdGVfcmVzZXRfZmxvb3IOcmF0ZV9yZXNldF9jYXACUyMKUiNUcnVzdGVlIw9hc3NldF9zdXNwZW5kZWQcZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbhFyYXRlX3Jlc2V0X3NwcmVhZBVyYXRlX3Jlc2V0X211bHRpcGxpZXIPcmF0ZV9yZXNldF9uZXh0FGhhc19yYXRlX3Jlc2V0X2Zsb29yEmhhc19yYXRlX3Jlc2V0X2NhcAEAD2Fzc2V0X2RlZmF1bHRlZA9wcm9zcGVjdHVzX2hhc2gOcHJvc3BlY3R1c191cmwVZGVub21pbmF0aW9uX2Fzc2V0X2lkDW1hdHVyaXR5X2RhdGUUZGF5X2NvdW50X2NvbnZlbnRpb24DBoEBMRhAAK0nEjIDZycZMgNnJyEiZycpImcpImcnDCJnJyqAAGcnK4AAZycsImcnEyJnJxoiZyctImcnGyJnJxwiZycuImcnDSJnJwoiZycUImcrImcnDiJnJyIiZycHImcnBiJnJwkiZycjImcnJCJnJx0iZyceImcnJSJnJyYiZycnImcnCyJnJw8iZycQImcnESJnKiJnJwQiZycFImcxNYEEEkQxNIElEkQxNxREMTYURIAEkU8E6zYaAI4BAMAxGRREMRhBAKmCFwS0RhjIBOeDJSkEfqIOCwRshePuBL3RqUQE3AY7NQQU/BDvBHSnKX8ECdT+FASam/qFBIXu0z0EkYUQSgTZ8iWsBG4OXJUE/z/UswSC9xstBO8E9dME3zQ1UAQ9voC9BN9U6CwEAQyCmQR0BqzSBBpyou42GgCOFwAbAscEIwRNBNcFyAYCBloGjQa7CK4J6ApiC9QMZwytDMUM3Q2SDigORw5SDpwAgASVbXFWNhoAjgEGmAAxGYEEEjEYEERCDI0igABHCjYaAUkVJBJEFyIpZUREiBSjiBSqiBSvIillRIEyEhREIkcCSwJLBAxBAlEiKmVEIicEZUQMQQJEIiplRIgQA0lFEYEJW0lFBjIHDUACLksPJFVJRRAkEklFB0AAEEsOgQMSQAAISw6BExJBAjYjQQILSw8iWyIqZUQSREsEMgcOREsFQAHkSw6BExJAAdwiRQ1LDyRVSUUQgQMSQAFgSw6BExJAAVgiRQhLD4ExW0UKiBCMQAD7SwlFC0sMiA9JSwiID0RLAYgPXklOAkURSYgPVUlFDUsCSwEISUUMMgoiJxNlRHAARCInD2VEIicLZURLAQhLAksBD0RPAkwJTwIPRE8DCCcPTGciJwtlRAgnC0xnIicQZURPAggnEExnIicRZUQIJxFMZ0sPJFWBAxJBAHciJwZlREsQiBAYRRIIJwZMZ4gP+EEACksPJFWBExJBAAlLD4EpWycOTGcrSwpnJwdLC2ciKmVEIwgqTGdLD1cIAYABE6hBABAiK2VEQAAJKYHIAWcnByJnSw9LB0mIEnFISwFLDghFAklLCQhFAUsCIwhFA0L+eScGImdC/5NLDyRVSUUQgQMSQQAPIitlREsICUlFC0ULQv7tSw4kEkEAEiIrZUxFC0QiJwdlTEUMREL+1EsOgRMSQAAHSwlFC0L+xSJFCiJFC0L+vIgPPkEAU0sOgRMSQQAJIitlREUIQv6UIicGZURLEIgPNkUSCElFDSInDmVED0EABiJFCEL+dSInDmVESwwJSUUKIitlRA1BAAkiK2VERQhC/llLCEUIQv5SSw+BMVsiK2VESg5ETAlFCEL+PyInBmVESxCIDuFFEghFDUL+FUsCSURLAklLA0lOAwgyB08CFk8DFlBPAhZQTwIWUEwWUChMULAjQyJC/ceAAEcCNhoBRwIVJRJENhoCSSJZgQIISwEVEkRXAgBMIillREQnCExQSb1FAUQiJxllRDIDE0EAIjEAIicZZUQSQAAVMQBLAxJAAA0xAEsBvkRXACASQQEAI0SIEbqIEb8iKWVEgTISFERLAkmIDISIDAdGAkm+REmBSVtJTgJFCEmBUVtJRQhPAghJRQZEVwAgIicTZURwAEUBQQC3Sb5EgYADU0AArSNBAHgyCiInE2VETEsBcABESwVJTgIPREsCSU4DvkRJVwAgsTIATwOyEkyyFE8CshGBBLIQsgGzSYFJW0lOAkUJSYFRW0lOA0UJIhZMSwFcSUxcUU8DTL8iJw9lRElLAg9EIicLZURLAw9ETAknD0xnIicLZURMCScLTGdLBUlLBklOAwgyB08CFk8DFlBPAhZQTBZQSwJJFRZXBgJMUEyAAgAiUExQKExQsCNDIkL/UCJC/v02GgFJFSQSRBc2GgJJFSQSRBeIEJxKDEQnG08CZyccTGcyBxYoTFCwI0M2GgFJFSUSRDYaAkkVJBJEF0lOAiIpZUREJxYxAIgQM0SIEG2IEHIiKWVEgTISRCcISwJQSU4DvUUBREyICqNJRCInCmVECCInDWVEDkQiJxplREEACTIHIicaZUQOREcCvkSBKFtLA0lOAwgWgShMuyInCmVECCcKSwFnIicNZURMCRYoTFCwI0MiSTYaAUkVJRJENhoCSRUlEkQ2GgNHAhUkEkQXIillRESID+OID+giKWVEgTISFEQiJxtlREEACSInG2VEMgcORCInHGVEQQAJMgciJxxlRAxEMQBLBElOAhJEJwhLAVBJRQhJvUUBRCcISwVJTgJQSUUJvUUBREsCiAncSYgJ2E8CE0RLAUlETL5EJVsORCIqZUQiJwRlRA9AAA4iKmVEiArogQlbMgcNREsDSYgKM0sDSU4CiAoriAmuRgKICalGAksFSb5EJVtLAklOAksBDkRLAQkWTwIlTwK7SwVJvkQlW08CCBYlTLsoSwJQsCNDNhoBSRUlEkQ2GgJJFSMSRCJTJxUxAIgOv0QnCE8CUEm9RQFESYEwI7oiTwNUgTBMuzIHFihMULAjQzYaAUkVJRJENhoCSRUlEkQnFzEAiA6HRCIpZUSByAESFESIDreIDrwnCE8CUEm9RQEURCIWTwJLAVBLAVAnKFBLAVBLAVBLAVBLAVBMUL8yBxYoTFCwI0M2GgFJFSUSRDYaAkkVJRJEJwhLAlBJvUUBRDEATwMSRIgOYYgOZiJPArsyBxYoTFCwI0M2GgFJFSUSRCcITFBJvUUBRL5IKExQsCNDNhoBSRUlEkQnEkxnMgcWKExQsCNDgABJNhoBRwIVgWsSRDYaAklOAhWBSBJENhoDSU4CSRVLASVZSYEiEkRPAkxLAlJJTgMiWYEkCBJEiA3dIlVJJwxLAWdBACJJIxJAABxJgQISQAAVSYEDEkAADkmBBBJAAAdJgQUSQQGGI0QiJwxlTEUCREsESYEhW0lFCESBOVVJRQhBAB9LBiMSQAAYSwaBAhJAABBLBoEDEkAACEsGgQQSQQFGI0RJIxNBAAhLBIGSBlMURCIpZUQURCInFGVEFERLBEkjW0lxC0UBRCcsSwFnSwGBCVtJTwISRCcTSwFnsTIAMgoishKyFEyyEYEEshCyAbNJgRFbJw1MZycKImcnLksIZ0mBKVsnGksBZ0sBgTFbJy1LAWdLBklOAoEwWycOTGcnFEsKZ0sDgZIGUyciTGdLAYEQWytMZ0sBgShbJwZMZ0sBJVsnCUxnSwGBGFsnB0xnSwOBOlsnI0xnSwOBQlsnJExnSwOBSlsnHUxnSwOBUlsnHkxnSwOBWlsnJUxnSwOBkAZTJyZMZ0sDgZEGUycnTGdPA4FjWycFTGdLASRbKkxnSwGBOFsnEExnSwGBQFsnEUxnJw8iZycLImdLAjIHDURMIltLAgxEDERLAlcAICcqTGdLAVcCACcrTGcyBxYoTFCwI0MiQv63IkL+dyKAAEcDNhoBSRUkEkQXSTYaAkkVIxJEIlNMNhoDSU4CSSJZSU4DSYFBC4ECCE8CFRJEiAvxIicMZUxOA0QiKWVEFERJgRAORCInFGVEREyBEAtMgWQLgeYLCEkyDA1BABixgQayEIEFshknL7IeJy+yHyKyAbNC/+EiRQpLCUsEDEEAjksEVwIASUUNSwpJTgKBQQuBQVhJJFVJTgJFDkkiW0lFDUsFTwQISwESREsFTwOIBzRMgQlbSUUKREEAGUsJQQAnSwkjCYFBC0sMTIFBWIEJW0sIDkRLCEAABUsKIxJESwkjCEUKQv+QSwZJRCMJFicfTFBJvUUBREkigQK6F0lEIwmBQQuBAgiBQbpC/8BLBhYnH0xQSbxISwW/SwVBAA1LAUsECCcETGcpgTJnMgcWKExQsCNDIillRESICuSICuuICvAiKmVEIicEZURLAQ1EiAZcSVcIAUmAAQGoREsBVwAISwJXCQhLA1cRCEsEVxkISwVXIQhLBlcpCEsHVzEISwhXOQhPB08IUE8HUE8GUE8FUCIWUE8EUE8DUE8CUExQiAePRgIyBxYoTFCwI0MiRwSAAEk2GgFJFSQSRBc2GgJHAhWBSRJEIillRESICluICmCBQVtJgQQaQQC2IicMZUSBBRJEiAo4IicMZURJgQUSREsCSSJbSUUHIicEZUQSRElXCAFFDCRViAXXIicEZUSBEAqAAgAARQcWJx9MUElFCb1FAUEAB0sHvkxFB0RLBUkiWUmBEAxESwNJVwkISwFXEQhLAlcZCEsDVykISwRXMQhPBVc5CEsLFksSUE8GUE8FUE8EUE8DUE8CUExQSwMWUE8CTFBMIwgWVwYCXABLCEm8SEy/IicEZUQjCCcETGciKmVESwNJTwISRIgFDklFCElXCAFFCiRVSUUGIxJAAChLBIEEEkAAIEsEgQwSQAAYSwSBCxJAABBLBIESEkAACEsEgQUSQQBBI0RLCIABAalESwSBDBJAAAhLBIELEkEAJCNBABonGDEAiAjtREsGSwKIBitGAjIHFihMULAjQ4gJC0L/6CJC/9kiQv+8IillRElEIicMZUQWSZMkDkRXBwEiJw1lRCInCmVEIicUZUQiKmVEIicEZUQiK2VEIicHZUQiJwllRCInBmVEIicQZUQiJxFlRCInD2VEIicLZURPDhZPDkxQTw0WUE8MFlBPCxZQTwoWUE8JFlBPCBZQTwcWUE8GFlBPBRZQTwQWUE8DFlBPAhZQTBZQKExQsCNDIillREQiKmVEIicEZUQPQQAlIiplRBYnKFAiFkxLAVBLAVBLAVBLAVBLAVBLAVBMUChMULAjQyIqZUSIA71C//CICCkjQzYaAUkVJRJEiAgcJxJMZzIHFihMULAjQzYaAUkVJRJEiAgEJxlMZzIHFihMULAjQzYaAUkVIxJENhoCSU4CFSUSRDYaA0lOAhWBEBJEiAfXiAfeF0cCiAfogRQSQQAOJxJLA2cyBxYoTFCwI0NJgSgSQQARJxdLA1BJvUUBFERLAr9C/99JgTISQQARJxZLA1BJvUUBFERLAr9C/8dJgTwSQQARJyBLA1BJvUUBFERLAr9C/69JgUYSQQARJxVLA1BJvUUBFERLAr9C/5dJgVASQf+QJxhLA1BJvUUBFERLAr9C/382GgFJFSMSRDYaAklOAhUlEkSIBy2IBzQXRwKIBz5JgRQTRIEoEkEAFScXSwJQSb1FAUS8SDIHFihMULAjQ0mBMhJBAA8nFksCUEm9RQFEvEhC/+FJgTwSQQAPJyBLAlBJvUUBRLxIQv/LSYFGEkEADycVSwJQSb1FAUS8SEL/tUmBUBJB/64nGEsCUEm9RQFEvEhC/582GgFJFSMSRCJTJxUxAIgGZ0QnIUxnMgcWKExQsCNDIicSZUQoTFCwI0M2GgFJFSUSRCcXSwGIBj8nFksCiAY4JyBLA4gGMScVSwSIBionGE8FiAYjJygiTwZUI08FVIECTwRUgQNPA1SBBE8CVChMULAjQzYaAUkVIxJENhoCSU4CFSUSRBdJiAY7gwYUKDI8RlBPBo4GAE8AQAAxACIAEwABACcYSwFQSb1FAUS+SChMULAjQycVSwFQSb1FAUS+SEL/6ycgSwFQSb1FAUS+SEL/3CcWSwFQSb1FAUS+SEL/zScXSwFQSb1FAUS+SEL/voAQAAAAAAAAAAAAAAAAAAAAAEL/qYoBACcIi/9QvkSBgANTFESJigECJwiL/1BJvUUBREm+SCInEGVESwGBOVsJIicRZURLAoFBWwlLAiVbIicFZURPA0sCTwKIAJgiJwVlRE8DTwNPAogAiksCgUlbSwIIFk8DTFxJSYFRW0sCCBZcUSInEGVEFlw5IicRZUQWXEEiKmVEFlwxTwNMv4mKAQAigAAnCIv/UEm9RQFEIillRIEyEkEAAYmLAr5MSU4CjABEgShbSYwBQAABiYsASSVbiwFJTgMIFlwgIhZcKIsCTL8iJwplRElLAg9ETAknCkxniYoDAYv9QQAFi/5AAAIiiYv9i/4di/+XiYoBAYv/QAACIokiJw1lRElEIicFZUSL/0xPAoj/yomKAQGL/0AAAiKJIicNZUQiJwVlRIv/TIj/r4mKAQEiJwRlRIv/DUSL/4EQChYnH0xQSb1FAUSL/4EQGEsBIoECuhdLAQ1EgUELgQIIgUG6iYoCAIv/IxJAAB+L/yQSQAAYi/+BExJAABCL/4EMEkAACIv/gQsSQQADI0SJi/5AAAQiQv/1i/6BAxJAAAiL/oECEkEAGIv/gQMSQAAIi/+BEhJBAAQjQv/RIkL/zYv+IxJBACCL/4EDEkAAEIv/gRISQAAIi/+BBRJBAAQjQv+qIkL/pov+gQQSQQAoi/+BAxJAABiL/4EEEkAAEIv/gRISQAAIi/+BBRJBAAQjQv96IkL/dov+gQUSQQAIi/+BAxJC/2YiQv9iIicMZUQjEkEACiInImVEQQACI4kiiYoBAov/gRFbSUEAECInCWVEQQAIIicHZURAAAYii/9PAokiJwdlRCInCWVEIicFZUSI/mciJwVlRIsATIj+XIv/TwKJigIBi/9AAAOL/okiJwVlRCInCWVEi/9LAoj+OwhJRCInBWVEi/5MTwKI/iuJigICIoAARwiL/iJbIiplRBJEi/6BCVsyBw5Ei/4kVUkjEklBAF0iKWVEgTISRCInCmVEIicNZUQSRIv+gTFbK0sBZycHTGeL/oEhWycJTGcnBiJni/6BKVsnDkxnIiplRCMIKkxnKYFkZ4sLRCInFGVEi/5MIogBxUmM/ov/jAGMAIkiKWVEgTISFEQiJwZlRIv+iP75jP4IJwZMZ4sKgQwSQQFji/+BIVsiJyRlRCInBWVEiP1zIicjZUQIjAYiJyZlREEAEyInHWVEiwYNQQAIIicdZUyMBkQiJydlREEAEyInHmVEiwYMQQAIIiceZUyMBkQnCYsGZ4sKgQQSQQDzi/6BMVsrSwFnJwdMZ4j+Z0EA1IsKgQUSQQCyIicFZUyMAkQijAEijAeL/oEZW0mMCEEAD4sCiwiI/pZJjAIjjAeMASIqZUQjCIwDIicEZUSLAw1BAFKLA4j9H0mMACRVSYwEgQMSQAAQiwSBExJBADOLAIEZW0EAKyNBAAiLB0EADCKMB4sDIwiMA0L/vYsAgRlbiwJMiP44SYwCiwEIjAFC/+EiQv/SiwFEIitlRIv+gTlbJBpAAAYiJwZlRAgiJwVlRIsBiPxfJw5MZyIqZUQjCCpMZ4v+IkmIAF9JjP6L/4wBjACJi/6BKVsnDkxnQv/aiwqBEhJB/xIiK2VEJwdMZ0L/B4sKgQsSQQAbi/6BIVtJjAVAAAgiJyVlTIwFRCcJiwVnQv7Pi/6BIVtJjAlB/sQnCYsJZ0L+vIoDATIIi/0iW4v9VwgBi/1XCQgyB4v9JFWL/kAARSMWSZMkDkRXBwEiJxNlRIsBSSMIiwAWTwIWUIsCUIsDUIsEFlCL/hZQTwNQi/8WUE8CFlBMFlCABJozK5VMULCL/YwAiYsFIxJAAAiLBYEEEkEABCNC/6mB/wFC/6OKAgGAAIv+i/9QSb1FAUEAH4sBvkQiWzIHSYwADkEAEIsBvkQkW4sAD0EABCOMAIkiQv/5MQAiJxJlRBJEiSInKWVEFESJIichZUQURImKAQCL/4EUEkAAMIv/gRkSQAAoi/+BKBJAACCL/4EyEkAAGIv/gTwSQAAQi/+BRhJAAAiL/4FQEkEAAyNEiSJC//o=", "clear": "DIEBQw=="}, "desc": "Debt Algorand Standard Application.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "networks": {}, "source": {"approval": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCAzMgogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1ICJzdGF0dXMiICJldmVudF9jdXJzb3IiICJvdXRzdGFuZGluZ19wcmluY2lwYWwiICJzY2hlZHVsZV9lbnRyeV9jb3VudCIgImZpeGVkX3BvaW50X3NjYWxlIiAiYWNjcnVlZF9pbnRlcmVzdCIgImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMgIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIgInJlc2VydmVkX3VuaXRzX3RvdGFsIiAicmVzZXJ2ZWRfcHJpbmNpcGFsIiAiY29udHJhY3RfdHlwZSIgInRvdGFsX3VuaXRzIiAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIgInJlc2VydmVkX2ludGVyZXN0IiAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIgImN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IiAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMgInNldHRsZW1lbnRfYXNzZXRfaWQiICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIgMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMgMHg1MjIzNTA3MjY5NmQ2MTcyNzk0NDY1NjE2YzY1NzIyMyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMgMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzIDB4NTIyMzRmNzA0NDYxNjU2ZDZmNmUyMyAiaW5pdGlhbF9leGNoYW5nZV9kYXRlIiAidHJhbnNmZXJfb3BlbmluZ19kYXRlIiAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIiAicmF0ZV9yZXNldF9mbG9vciIgInJhdGVfcmVzZXRfY2FwIiAweDUzMjMgMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMyAiYXNzZXRfc3VzcGVuZGVkIiAiZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiIgInJhdGVfcmVzZXRfc3ByZWFkIiAicmF0ZV9yZXNldF9tdWx0aXBsaWVyIiAicmF0ZV9yZXNldF9uZXh0IiAiaGFzX3JhdGVfcmVzZXRfZmxvb3IiICJoYXNfcmF0ZV9yZXNldF9jYXAiIDB4MDAgImFzc2V0X2RlZmF1bHRlZCIgInByb3NwZWN0dXNfaGFzaCIgInByb3NwZWN0dXNfdXJsIiAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIiAibWF0dXJpdHlfZGF0ZSIgImRheV9jb3VudF9jb252ZW50aW9uIiAweDA2ODEwMQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4LTI5CiAgICAvLyAjIFJCQUMgUm9sZXMKICAgIC8vIHNlbGYuYXJyYW5nZXIgPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX0FSUkFOR0VSKQogICAgYnl0ZWMgMTggLy8gMHg1MjIzNDE3MjcyNjE2ZTY3NjU3MjIzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzAKICAgIC8vIHNlbGYub3BfZGFlbW9uID0gR2xvYmFsU3RhdGUoQWNjb3VudCgpLCBrZXk9Y3N0LlBSRUZJWF9JRF9PUF9EQUVNT04pCiAgICBieXRlYyAyNSAvLyAweDUyMjM0ZjcwNDQ2MTY1NmQ2ZjZlMjMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo0Ny00OAogICAgLy8gIyBELUFTQSBHb3Zlcm5hbmNlCiAgICAvLyBzZWxmLmFzc2V0X3N1c3BlbmRlZCA9IEZhbHNlCiAgICBieXRlYyAzMyAvLyAiYXNzZXRfc3VzcGVuZGVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NDkKICAgIC8vIHNlbGYuYXNzZXRfZGVmYXVsdGVkID0gRmFsc2UKICAgIGJ5dGVjIDQxIC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU2LTU3CiAgICAvLyAjIENvbnRyYWN0CiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMTIgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwLTYxCiAgICAvLyAjIFByb3NwZWN0dXMgKEluZm9ybWF0aW9uYWwpCiAgICAvLyBzZWxmLnByb3NwZWN0dXNfaGFzaCA9IEJ5dGVzKCkKICAgIGJ5dGVjIDQyIC8vICJwcm9zcGVjdHVzX2hhc2giCiAgICBwdXNoYnl0ZXMgMHgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MgogICAgLy8gc2VsZi5wcm9zcGVjdHVzX3VybCA9IFN0cmluZygpCiAgICBieXRlYyA0MyAvLyAicHJvc3BlY3R1c191cmwiCiAgICBwdXNoYnl0ZXMgIiIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NC02NQogICAgLy8gIyBEZW5vbWluYXRpb24KICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gQXNzZXQoKQogICAgYnl0ZWMgNDQgLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjYKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCA9IEFzc2V0KCkKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OC02OQogICAgLy8gIyBUaW1lCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgMjYgLy8gImluaXRpYWxfZXhjaGFuZ2VfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzAKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgNDUgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxCiAgICAvLyBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgMjcgLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIKICAgIC8vIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlID0gdHlwLlRpbWVTdGFtcCgpCiAgICBieXRlYyAyOCAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NC03NQogICAgLy8gIyBEYXkgQ291bnQgQ29udmVudGlvbgogICAgLy8gc2VsZi5kYXlfY291bnRfY29udmVudGlvbiA9IFVJbnQ2NCgpCiAgICBieXRlYyA0NiAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc3LTc4CiAgICAvLyAjIFVuaXRzCiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzID0gVUludDY0KCkKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPSBVSW50NjQoKQogICAgYnl0ZWMgMTAgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MS04MgogICAgLy8gIyBQcmluY2lwYWwKICAgIC8vIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPSBVSW50NjQoKQogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MwogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBVSW50NjQoKQogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NAogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gVUludDY0KCkKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NQogICAgLy8gc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gRmFsc2UKICAgIGJ5dGVjIDM0IC8vICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4Ny04OAogICAgLy8gIyBJbnRlcmVzdAogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gVUludDY0KCkKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg5CiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgPSBVSW50NjQoKQogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTEtOTIKICAgIC8vICMgSW50ZXJlc3QgUmF0ZXMKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTMKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQgPSBVSW50NjQoKQogICAgYnl0ZWMgMzUgLy8gInJhdGVfcmVzZXRfc3ByZWFkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NAogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIgPSBVSW50NjQoKQogICAgYnl0ZWMgMzYgLy8gInJhdGVfcmVzZXRfbXVsdGlwbGllciIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTUKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9mbG9vciA9IFVJbnQ2NCgpCiAgICBieXRlYyAyOSAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTYKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9jYXAgPSBVSW50NjQoKQogICAgYnl0ZWMgMzAgLy8gInJhdGVfcmVzZXRfY2FwIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NwogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X25leHQgPSBVSW50NjQoKQogICAgYnl0ZWMgMzcgLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTgKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgPSBGYWxzZQogICAgYnl0ZWMgMzggLy8gImhhc19yYXRlX3Jlc2V0X2Zsb29yIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OQogICAgLy8gc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgPSBGYWxzZQogICAgYnl0ZWMgMzkgLy8gImhhc19yYXRlX3Jlc2V0X2NhcCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAxLTEwMgogICAgLy8gIyBQcmltYXJ5IERpc3RyaWJ1dGlvbgogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgPSBVSW50NjQoKQogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAzCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0ID0gVUludDY0KCkKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA1LTEwNgogICAgLy8gIyBDdW11bGF0aXZlIFBlci1Vbml0IEZpeGVkLVBvaW50IEluZGV4ZXMKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4ID0gVUludDY0KCkKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1CiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciA9IFVJbnQ2NCgpCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNgogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA9IFVJbnQ2NCgpCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE4LTExOQogICAgLy8gIyBTY2FsaW5nCiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlID0gVUludDY0KCkKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6MjMKICAgIC8vIGFzc2VydCBUeG4uZ2xvYmFsX251bV9ieXRlX3NsaWNlID09IGNmZy5HTE9CQUxfQllURVMsIGVyci5XUk9OR19HTE9CQUxfQllURVMKICAgIHR4biBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgQnl0ZXMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjI0CiAgICAvLyBhc3NlcnQgVHhuLmdsb2JhbF9udW1fdWludCA9PSBjZmcuR0xPQkFMX1VJTlRTLCBlcnIuV1JPTkdfR0xPQkFMX1VJTlRTCiAgICB0eG4gR2xvYmFsTnVtVWludAogICAgcHVzaGludCAzNwogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgVUludHMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBhc3NlcnQgVHhuLmxvY2FsX251bV9ieXRlX3NsaWNlID09IGNmZy5MT0NBTF9CWVRFUywgZXJyLldST05HX0xPQ0FMX0JZVEVTCiAgICB0eG4gTG9jYWxOdW1CeXRlU2xpY2UKICAgICEKICAgIGFzc2VydCAvLyBXcm9uZyBMb2NhbCBCeXRlcyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6MjYKICAgIC8vIGFzc2VydCBUeG4ubG9jYWxfbnVtX3VpbnQgPT0gY2ZnLkxPQ0FMX1VJTlRTLCBlcnIuV1JPTkdfTE9DQUxfVUlOVFMKICAgIHR4biBMb2NhbE51bVVpbnQKICAgICEKICAgIGFzc2VydCAvLyBXcm9uZyBMb2NhbCBVSW50cyBhbGxvY2F0aW9uCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kX2FzYS9jb250cmFjdC5weTo4LTE4CiAgICAvLyBjbGFzcyBEQVNBKAogICAgLy8gICAgIFBheW1lbnRBZ2VudCwKICAgIC8vICAgICBUcmFuc2ZlckFnZW50LAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gICAgIGF2bV92ZXJzaW9uPTEyLAogICAgLy8gKToKICAgIHB1c2hieXRlcyAweDkxNGYwNGViIC8vIG1ldGhvZCAiY29udHJhY3RfdXBkYXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9jb250cmFjdF91cGRhdGVfcm91dGVANAoKbWFpbl9zd2l0Y2hfY2FzZV9uZXh0QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6OC0xOAogICAgLy8gY2xhc3MgREFTQSgKICAgIC8vICAgICBQYXltZW50QWdlbnQsCiAgICAvLyAgICAgVHJhbnNmZXJBZ2VudCwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBhdm1fdmVyc2lvbj0xMiwKICAgIC8vICk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBieiBtYWluX2NyZWF0ZV9Ob09wQDMxCiAgICBwdXNoYnl0ZXNzIDB4YjQ0NjE4YzggMHhlNzgzMjUyOSAweDdlYTIwZTBiIDB4NmM4NWUzZWUgMHhiZGQxYTk0NCAweGRjMDYzYjM1IDB4MTRmYzEwZWYgMHg3NGE3Mjk3ZiAweDA5ZDRmZTE0IDB4OWE5YmZhODUgMHg4NWVlZDMzZCAweDkxODUxMDRhIDB4ZDlmMjI1YWMgMHg2ZTBlNWM5NSAweGZmM2ZkNGIzIDB4ODJmNzFiMmQgMHhlZjA0ZjVkMyAweGRmMzQzNTUwIDB4M2RiZTgwYmQgMHhkZjU0ZTgyYyAweDAxMGM4Mjk5IDB4NzQwNmFjZDIgMHgxYTcyYTJlZSAvLyBtZXRob2QgImZ1bmRfZHVlX2Nhc2hmbG93cyh1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJjbGFpbV9kdWVfY2FzaGZsb3dzKGFkZHJlc3MsYnl0ZVtdKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYnl0ZVtdKSIsIG1ldGhvZCAic2V0X3RyYW5zZmVyX3NjaGVkdWxlKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbihhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInRyYW5zZmVyKGFkZHJlc3MsYWRkcmVzcyx1aW50NjQpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X2dvdl9zdXNwZW5zaW9uKGFkZHJlc3MsYm9vbCl1aW50NjQiLCBtZXRob2QgImFjY291bnRfb3BlbihhZGRyZXNzLGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X3VwZGF0ZV9wYXltZW50X2FkZHJlc3MoYWRkcmVzcyxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAiYWNjb3VudF9nZXRfcG9zaXRpb24oYWRkcmVzcykoYWRkcmVzcyx1aW50NjQsdWludDY0LGJvb2wsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImNvbnRyYWN0X2NvbmZpZygodWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYm9vbCxib29sLGJvb2wsdWludDY0KSwodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpLChieXRlWzMyXSxzdHJpbmcpKXVpbnQ2NCIsIG1ldGhvZCAiY29udHJhY3Rfc2NoZWR1bGUodWludDY0LGJvb2wsKHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpW10pdWludDY0IiwgbWV0aG9kICJleGVjdXRlX2llZCgpdWludDY0IiwgbWV0aG9kICJhcHBseV9ub25fY2FzaF9ldmVudCh1aW50NjQsKHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSl1aW50NjQiLCBtZXRob2QgImdldF9jb250cmFjdF9zdGF0ZSgpKHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJnZXRfbmV4dF9kdWVfZXZlbnQoKSh1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAicmJhY19yb3RhdGVfYXJyYW5nZXIoYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgInJiYWNfc2V0X29wX2RhZW1vbihhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19hc3NpZ25fcm9sZSh1aW50OCxhZGRyZXNzLCh1aW50NjQsdWludDY0KSl1aW50NjQiLCBtZXRob2QgInJiYWNfcmV2b2tlX3JvbGUodWludDgsYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgInJiYWNfZ292X2Fzc2V0X3N1c3BlbnNpb24oYm9vbCl1aW50NjQiLCBtZXRob2QgInJiYWNfZ2V0X2FycmFuZ2VyKClhZGRyZXNzIiwgbWV0aG9kICJyYmFjX2dldF9hZGRyZXNzX3JvbGVzKGFkZHJlc3MpKGJvb2wsYm9vbCxib29sLGJvb2wsYm9vbCkiLCBtZXRob2QgInJiYWNfZ2V0X3JvbGVfdmFsaWRpdHkodWludDgsYWRkcmVzcykodWludDY0LHVpbnQ2NCkiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBmdW5kX2R1ZV9jYXNoZmxvd3MgY2xhaW1fZHVlX2Nhc2hmbG93cyBzZXRfdHJhbnNmZXJfc2NoZWR1bGUgcHJpbWFyeV9kaXN0cmlidXRpb24gdHJhbnNmZXIgYWNjb3VudF9nb3Zfc3VzcGVuc2lvbiBhY2NvdW50X29wZW4gYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzIGFjY291bnRfZ2V0X3Bvc2l0aW9uIGNvbnRyYWN0X2NvbmZpZyBjb250cmFjdF9zY2hlZHVsZSBleGVjdXRlX2llZCBhcHBseV9ub25fY2FzaF9ldmVudCBnZXRfY29udHJhY3Rfc3RhdGUgZ2V0X25leHRfZHVlX2V2ZW50IHJiYWNfcm90YXRlX2FycmFuZ2VyIHJiYWNfc2V0X29wX2RhZW1vbiByYmFjX2Fzc2lnbl9yb2xlIHJiYWNfcmV2b2tlX3JvbGUgcmJhY19nb3ZfYXNzZXRfc3VzcGVuc2lvbiByYmFjX2dldF9hcnJhbmdlciByYmFjX2dldF9hZGRyZXNzX3JvbGVzIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHkKICAgIGVycgoKbWFpbl9jcmVhdGVfTm9PcEAzMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kX2FzYS9jb250cmFjdC5weTo4LTE4CiAgICAvLyBjbGFzcyBEQVNBKAogICAgLy8gICAgIFBheW1lbnRBZ2VudCwKICAgIC8vICAgICBUcmFuc2ZlckFnZW50LAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gICAgIGF2bV92ZXJzaW9uPTEyLAogICAgLy8gKToKICAgIHB1c2hieXRlcyAweDk1NmQ3MTU2IC8vIG1ldGhvZCAiY29udHJhY3RfY3JlYXRlKGFkZHJlc3MpdWludDY0IgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggY29udHJhY3RfY3JlYXRlCiAgICBlcnIKCm1haW5fY29udHJhY3RfdXBkYXRlX3JvdXRlQDQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBwdXNoaW50IDQgLy8gVXBkYXRlQXBwbGljYXRpb24KICAgID09CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydAogICAgYiBjb250cmFjdF91cGRhdGUKCgovLyBtb2R1bGVzLnBheW1lbnRfYWdlbnQuUGF5bWVudEFnZW50LmZ1bmRfZHVlX2Nhc2hmbG93c1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmZ1bmRfZHVlX2Nhc2hmbG93czoKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gMTAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjUwCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo1MQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo1MgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDcKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NTUKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NTYtNTcKICAgIC8vIGZ1bmRlZF9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgLy8gZnVuZGVkX3ByaW5jaXBhbCA9IFVJbnQ2NCgwKQogICAgZHVwbiAyCgpmdW5kX2R1ZV9jYXNoZmxvd3Nfd2hpbGVfdG9wQDI6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjAKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgPCBtYXhfZXZlbnRfY291bnQKICAgIGRpZyAyCiAgICBkaWcgNAogICAgPAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjYwLTYxCiAgICAvLyBwcm9jZXNzZWRfZXZlbnRzIDwgbWF4X2V2ZW50X2NvdW50CiAgICAvLyBhbmQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAOQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjYxCiAgICAvLyBhbmQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIDwKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2MC02MQogICAgLy8gcHJvY2Vzc2VkX2V2ZW50cyA8IG1heF9ldmVudF9jb3VudAogICAgLy8gYW5kIHNlbGYuZXZlbnRfY3Vyc29yIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudAogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDkKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2MwogICAgLy8gZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoc2VsZi5ldmVudF9jdXJzb3IpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgZHVwCiAgICBidXJ5IDE3CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjQKICAgIC8vIGlmIGVudHJ5LnNjaGVkdWxlZF90aW1lID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXA6CiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgNgogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPgogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl93aGlsZUA5CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjYKICAgIC8vIGlmIG5vdCBzZWxmLl9ldmVudF9pc19jYXNoKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkpOgogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBidXJ5IDE2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNTEKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgaW50Y18yIC8vIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM1MC0zNTQKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX01EKSwKICAgIC8vICkKICAgID09CiAgICBkdXAKICAgIGJ1cnkgNwogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX3RydWVANTAKICAgIGRpZyAxNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzUyCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzUwLTM1NAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfTUQpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDUwCiAgICBkaWcgMTQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM1MwogICAgLy8gVUludDY0KGVudW1zLkVWVF9NRCksCiAgICBwdXNoaW50IDE5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNTAtMzU0CiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9NRCksCiAgICAvLyApCiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VANTEKCmZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX3RydWVANTA6CiAgICBpbnRjXzEgLy8gMQoKZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfbWVyZ2VANTI6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjYKICAgIC8vIGlmIG5vdCBzZWxmLl9ldmVudF9pc19jYXNoKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkpOgogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU0OAogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X2lkID09IHNlbGYuZXZlbnRfY3Vyc29yLCBlcnIuSU5WQUxJRF9FVkVOVF9DVVJTT1IKICAgIGRpZyAxNQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBjdXJzb3IKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU0OQogICAgLy8gYXNzZXJ0IGVudHJ5LnNjaGVkdWxlZF90aW1lIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLCBlcnIuTk9fRFVFX0NBU0hGTE9XCiAgICBkaWcgNAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPD0KICAgIGFzc2VydCAvLyBObyBkdWUgY2FzaGZsb3cgdG8gcGF5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MTMKICAgIC8vIGlmIGV2ZW50X3R5cGUgbm90IGluIChVSW50NjQoZW51bXMuRVZUX0lQKSwgVUludDY0KGVudW1zLkVWVF9NRCkpOgogICAgZGlnIDUKICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxMwogICAgZGlnIDE0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDEzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MTQKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDEzCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfaW50ZXJlc3RfYW1vdW50QDE0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDI2CiAgICAvLyBldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBidXJ5IDE2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MjcKICAgIC8vIGlmIGV2ZW50X3R5cGUgbm90IGluIChVSW50NjQoZW51bXMuRVZUX1BSKSwgVUludDY0KGVudW1zLkVWVF9NRCkpOgogICAgcHVzaGludCAzCiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE3CiAgICBkaWcgMTQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQyOAogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnRAMjY6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTMKICAgIC8vIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGRpZyAxNQogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgMTAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1NgogICAgLy8gaWYgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCk6CiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUAyNwogICAgZGlnIDkKICAgIGJ1cnkgMTEKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTcyLTU3NAogICAgLy8gIyBGdW5kaW5nIHVzZXMgcGVyLXVuaXQgY3VtdWxhdGl2ZSBpbmRpY2VzIHNvIGVhY2ggaG9sZGVyIGNhbiBzZXR0bGUKICAgIC8vICMgaW5kZXBlbmRlbnRseSBmcm9tIGl0cyBjdXJyZW50IHVuaXQgYmFsYW5jZS4KICAgIC8vIGludGVyZXN0X2luZGV4X2RlbHRhID0gc2VsZi5fYW1vdW50X3RvX2luZGV4X2RlbHRhKGludGVyZXN0X2Ftb3VudF9kdWUpCiAgICBkaWcgMTIKICAgIGNhbGxzdWIgX2Ftb3VudF90b19pbmRleF9kZWx0YQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTc1CiAgICAvLyBwcmluY2lwYWxfaW5kZXhfZGVsdGEgPSBzZWxmLl9hbW91bnRfdG9faW5kZXhfZGVsdGEocHJpbmNpcGFsX2Ftb3VudF9kdWUpCiAgICBkaWcgOAogICAgY2FsbHN1YiBfYW1vdW50X3RvX2luZGV4X2RlbHRhCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzYKICAgIC8vIGludGVyZXN0X2Ftb3VudCA9IHNlbGYuX2luZGV4X2RlbHRhX3RvX2Ftb3VudChpbnRlcmVzdF9pbmRleF9kZWx0YSkKICAgIGRpZyAxCiAgICBjYWxsc3ViIF9pbmRleF9kZWx0YV90b19hbW91bnQKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSAxNwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTc3CiAgICAvLyBwcmluY2lwYWxfYW1vdW50ID0gc2VsZi5faW5kZXhfZGVsdGFfdG9fYW1vdW50KHByaW5jaXBhbF9pbmRleF9kZWx0YSkKICAgIGR1cAogICAgY2FsbHN1YiBfaW5kZXhfZGVsdGFfdG9fYW1vdW50CiAgICBkdXAKICAgIGJ1cnkgMTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU3OAogICAgLy8gcmVxdWlyZWRfYW1vdW50ID0gaW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudAogICAgZGlnIDIKICAgIGRpZyAxCiAgICArCiAgICBkdXAKICAgIGJ1cnkgMTIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcyNwogICAgLy8gYmFsYW5jZSA9IHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ1NgogICAgLy8gcmV0dXJuIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgKyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIGRpZyAxCiAgICArCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MjkKICAgIC8vIGFzc2VydCBiYWxhbmNlID49IHJlc2VydmVkX3RvdGFsLCBlcnIuTk9UX0VOT1VHSF9GVU5EUwogICAgZGlnIDIKICAgIGRpZyAxCiAgICA+PQogICAgYXNzZXJ0IC8vIE5vdCBlbm91Z2ggZnVuZHMgZm9yIHRoZSBwYXltZW50CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MzAKICAgIC8vIHJldHVybiBiYWxhbmNlIC0gcmVzZXJ2ZWRfdG90YWwKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTgwCiAgICAvLyBzZWxmLl9hdmFpbGFibGVfc2V0dGxlbWVudF9mdW5kcygpID49IHJlcXVpcmVkX2Ftb3VudAogICAgdW5jb3ZlciAyCiAgICA+PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTc5LTU4MQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLl9hdmFpbGFibGVfc2V0dGxlbWVudF9mdW5kcygpID49IHJlcXVpcmVkX2Ftb3VudAogICAgLy8gKSwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTgzCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0ICs9IGludGVyZXN0X2Ftb3VudAogICAgdW5jb3ZlciAzCiAgICArCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTg0CiAgICAvLyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCArPSBwcmluY2lwYWxfYW1vdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICArCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4NQogICAgLy8gc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4ICs9IGludGVyZXN0X2luZGV4X2RlbHRhCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCBleGlzdHMKICAgIHVuY292ZXIgMgogICAgKwogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTg2CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4ICs9IHByaW5jaXBhbF9pbmRleF9kZWx0YQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCBleGlzdHMKICAgICsKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1ODcKICAgIC8vIGlmIGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkgPT0gVUludDY0KGVudW1zLkVWVF9QUik6CiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBwdXNoaW50IDMKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDM4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1ODgtNTg5CiAgICAvLyAjIEZvciBQUiwgdGhlIHBlcmlvZCBpbnRlcmVzdCBzdGF5cyBhY2NydWVkIHVudGlsIGEgbGF0ZXIgSVAgb3IgTUQuCiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgKz0gc2VsZi5fZW50cnlfaW50ZXJlc3Rfc2VnbWVudChlbnRyeSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBkaWcgMTYKICAgIGNhbGxzdWIgX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQKICAgIGJ1cnkgMTgKICAgICsKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTIKICAgIC8vIGlmIG5vdCBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKSBvciBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NCgKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlANDEKICAgIGRpZyAxNQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5Mi01OTQKICAgIC8vIGlmIG5vdCBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKSBvciBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NCgKICAgIC8vICAgICBlbnVtcy5FVlRfTUQKICAgIC8vICk6CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDIKCmZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDQxOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTk1CiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBkaWcgMTUKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0MjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5NgogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgZGlnIDEwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTk3CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBuZXh0X2ludGVyZXN0X2Jhc2UKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBkaWcgMTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTgKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwMAogICAgLy8gaWYgZW50cnkuZXZlbnRfdHlwZSA9PSBhcmM0LlVJbnQ4KAogICAgZGlnIDE1CiAgICBleHRyYWN0IDggMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAwLTYwMgogICAgLy8gaWYgZW50cnkuZXZlbnRfdHlwZSA9PSBhcmM0LlVJbnQ4KAogICAgLy8gICAgIGVudW1zLkVWVF9NRAogICAgLy8gKSBhbmQgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPT0gVUludDY0KDApOgogICAgcHVzaGJ5dGVzIDB4MTMKICAgIGI9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwMgogICAgLy8gKSBhbmQgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPT0gVUludDY0KDApOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MDAtNjAyCiAgICAvLyBpZiBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoCiAgICAvLyAgICAgZW51bXMuRVZUX01ECiAgICAvLyApIGFuZCBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9PSBVSW50NjQoMCk6CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwMwogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX0VOREVEKQogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgcHVzaGludCAyMDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MDQKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MDYtNjEwCiAgICAvLyBzZWxmLl9lbWl0X2V4ZWN1dGlvbl9ldmVudCgKICAgIC8vICAgICBlbnRyeT1lbnRyeSwKICAgIC8vICAgICBwYXlvZmY9aW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudCwKICAgIC8vICAgICBzZXR0bGVkX2Ftb3VudD1pbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50LAogICAgLy8gKQogICAgZGlnIDE1CiAgICBkaWcgNwogICAgZHVwCiAgICBjYWxsc3ViIF9lbWl0X2V4ZWN1dGlvbl9ldmVudAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzAKICAgIC8vIGZ1bmRlZF9pbnRlcmVzdCArPSBpbnRlcmVzdF9hbW91bnQKICAgIGRpZyAxCiAgICBkaWcgMTQKICAgICsKICAgIGJ1cnkgMgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjcxCiAgICAvLyBmdW5kZWRfcHJpbmNpcGFsICs9IHByaW5jaXBhbF9hbW91bnQKICAgIGR1cAogICAgZGlnIDkKICAgICsKICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjcyCiAgICAvLyBwcm9jZXNzZWRfZXZlbnRzICs9IFVJbnQ2NCgxKQogICAgZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDMKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX3doaWxlX3RvcEAyCgpmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDM4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTkxCiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzkKCmZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDI3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTU3CiAgICAvLyBldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBidXJ5IDE2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTgtNTYwCiAgICAvLyAjIER5bmFtaWMgYW5udWl0aWVzIGRlcml2ZSBuZXh0IHN0YXRlIGZyb20gdGhlIHBheW1lbnQgZGVjb21wb3NpdGlvbiwKICAgIC8vICMgbm90IG9ubHkgZnJvbSB0aGUgcHJlY29tcHV0ZWQgYG5leHRfKmAgZmllbGRzLgogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1BSKToKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19lbHNlX2JvZHlAMjkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU2MgogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgLSBwcmluY2lwYWxfYW1vdW50X2R1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBkaWcgOAogICAgLQogICAgZHVwCiAgICBidXJ5IDExCiAgICBidXJ5IDExCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDI5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY1CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9JUCk6CiAgICBkaWcgMTQKICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUAzMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY2CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGJ1cnkgMTEKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU2NwogICAgLy8gbmV4dF9pbnRlcmVzdF9iYXNlID0gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBidXJ5IDEyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIGV4aXN0cwogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzNgoKZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUAzMToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU2OAogICAgLy8gZWxpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfTUQpOgogICAgZGlnIDE0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDMyCiAgICBkaWcgOQogICAgYnVyeSAxMQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzNgoKZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlAMzI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjkKICAgIC8vIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAxMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTcwCiAgICAvLyBuZXh0X2ludGVyZXN0X2Jhc2UgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDExCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQyOQogICAgLy8gaWYgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCk6CiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDI1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzAKICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCk6CiAgICBkaWcgMTQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDMxCiAgICAvLyByZXR1cm4gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTIKICAgIC8vIHByaW5jaXBhbF9hbW91bnRfZHVlID0gc2VsZi5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudChlbnRyeSkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnRAMjYKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDIwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDMyCiAgICAvLyBpbnRlcmVzdF9kdWUgPSBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgKyBzZWxmLl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KGVudHJ5KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgIGRpZyAxNgogICAgY2FsbHN1YiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudAogICAgYnVyeSAxOAogICAgKwogICAgZHVwCiAgICBidXJ5IDEzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzMKICAgIC8vIGlmIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA8PSBpbnRlcmVzdF9kdWU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiBleGlzdHMKICAgID49CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDM0CiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTIKICAgIC8vIHByaW5jaXBhbF9hbW91bnRfZHVlID0gc2VsZi5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudChlbnRyeSkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnRAMjYKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDIyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDM1CiAgICAvLyBwcmluY2lwYWxfYW1vdW50ID0gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIC0gaW50ZXJlc3RfZHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiBleGlzdHMKICAgIGRpZyAxMgogICAgLQogICAgZHVwCiAgICBidXJ5IDEwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzYKICAgIC8vIGlmIHByaW5jaXBhbF9hbW91bnQgPiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgPgogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzNwogICAgLy8gcmV0dXJuIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTUyCiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyNDoKICAgIGRpZyA4CiAgICBidXJ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyNgoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NDAKICAgIC8vIGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsIDw9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBkaWcgMTUKICAgIHB1c2hpbnQgNDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGR1cDIKICAgIDw9CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzktNDQxCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsIDw9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ0MgogICAgLy8gcmV0dXJuIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIC0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIHN3YXAKICAgIC0KICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTUyCiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQxNQogICAgLy8gcmV0dXJuIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCArIHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZGlnIDE2CiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBidXJ5IDE4CiAgICArCiAgICBidXJ5IDEzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTEKICAgIC8vIGludGVyZXN0X2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9pbnRlcmVzdF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9pbnRlcmVzdF9hbW91bnRAMTQKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl93aGlsZUA5OgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojc0CiAgICAvLyBhc3NlcnQgcHJvY2Vzc2VkX2V2ZW50cyA+IFVJbnQ2NCgwKSwgZXJyLk5PX0RVRV9DQVNIRkxPVwogICAgZGlnIDIKICAgIGR1cAogICAgYXNzZXJ0IC8vIE5vIGR1ZSBjYXNoZmxvdyB0byBwYXkKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3OAogICAgLy8gdG90YWxfZnVuZGVkPWZ1bmRlZF9pbnRlcmVzdCArIGZ1bmRlZF9wcmluY2lwYWwsCiAgICBkaWcgMgogICAgZHVwCiAgICBkaWcgMwogICAgZHVwCiAgICBjb3ZlciAzCiAgICArCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODAKICAgIC8vIHRpbWVzdGFtcD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3NS04MQogICAgLy8gcmV0dXJuIHR5cC5DYXNoRnVuZGluZ1Jlc3VsdCgKICAgIC8vICAgICBmdW5kZWRfaW50ZXJlc3Q9ZnVuZGVkX2ludGVyZXN0LAogICAgLy8gICAgIGZ1bmRlZF9wcmluY2lwYWw9ZnVuZGVkX3ByaW5jaXBhbCwKICAgIC8vICAgICB0b3RhbF9mdW5kZWQ9ZnVuZGVkX2ludGVyZXN0ICsgZnVuZGVkX3ByaW5jaXBhbCwKICAgIC8vICAgICBwcm9jZXNzZWRfZXZlbnRzPXByb2Nlc3NlZF9ldmVudHMsCiAgICAvLyAgICAgdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUA1MToKICAgIGludGNfMCAvLyAwCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDUyCgoKLy8gbW9kdWxlcy5wYXltZW50X2FnZW50LlBheW1lbnRBZ2VudC5jbGFpbV9kdWVfY2FzaGZsb3dzW3JvdXRpbmddKCkgLT4gdm9pZDoKY2xhaW1fZHVlX2Nhc2hmbG93czoKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNAogICAgLy8gaWYgc2VsZi5vcF9kYWVtb24udmFsdWUgIT0gR2xvYmFsLnplcm9fYWRkcmVzczoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNSAvLyAweDUyMjM0ZjcwNDQ2MTY1NmQ2ZjZlMjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcF9kYWVtb24gZXhpc3RzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBieiBjbGFpbV9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTcKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNgogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI1IC8vIDB4NTIyMzRmNzA0NDYxNjU2ZDZmNmUyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wX2RhZW1vbiBleGlzdHMKICAgID09CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTYtMTgKICAgIC8vIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICAvLyBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgYm56IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDE0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTcKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNi0xOAogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICBibnogY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX3RydWVAMTQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxOAogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIHR4biBTZW5kZXIKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDMyCiAgICA9PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE2LTE4CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAxNQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX3RydWVAMTQ6CiAgICBpbnRjXzEgLy8gMQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDE2OgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE1LTE5CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vICAgICBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gICAgIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICAvLyApLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNzoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5NAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5NQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDcKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6OTgKICAgIC8vIHNlbGYuX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQoaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDIKICAgIGR1cAogICAgY2FsbHN1YiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojk5CiAgICAvLyBzZWxmLl9zZXR0bGVfcG9zaXRpb24oaG9sZGluZ19hZGRyZXNzKQogICAgY2FsbHN1YiBfc2V0dGxlX3Bvc2l0aW9uCiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTcKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNsYWltYWJsZV9pbnRlcmVzdAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZHVwCiAgICBwdXNoaW50IDczCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBidXJ5IDgKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTgKICAgIC8vICsgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgZHVwCiAgICBwdXNoaW50IDgxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDgKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTctMTE4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jbGFpbWFibGVfaW50ZXJlc3QKICAgIC8vICsgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgdW5jb3ZlciAyCiAgICArCiAgICBkdXAKICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjEwMQogICAgLy8gYXNzZXJ0IHRvdGFsX2Ftb3VudCA+IFVJbnQ2NCgwKSwgZXJyLk5PX0RVRV9DQVNIRkxPVwogICAgYXNzZXJ0IC8vIE5vIGR1ZSBjYXNoZmxvdyB0byBwYXkKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLmlzX29wdGVkX2luKAogICAgZXh0cmFjdCAwIDMyCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MjUKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MjQtMjYKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5pc19vcHRlZF9pbigKICAgIC8vICAgICBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQKICAgIC8vICkKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MjQtMjcKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5pc19vcHRlZF9pbigKICAgIC8vICAgICBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQKICAgIC8vICkKICAgIC8vIGFuZCBub3Qgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkCiAgICBieiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VAMjQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNwogICAgLy8gYW5kIG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHB1c2hpbnQgMzg0CiAgICBnZXRiaXQKICAgIGJueiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VAMjQKICAgIGludGNfMSAvLyAxCgpjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfbWVyZ2VAMjU6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA2CiAgICAvLyBpZiBzZWxmLl9pc19wYXltZW50X2V4ZWN1dGFibGUoaG9sZGluZ19hZGRyZXNzKToKICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MzMKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICBzd2FwCiAgICBkaWcgMQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBvcHRlZCBpbnRvIGFzc2V0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MzMtMzQKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICAvLyA+PSBwYXltZW50X2Ftb3VudAogICAgZGlnIDUKICAgIGR1cAogICAgY292ZXIgMgogICAgPj0KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozMi0zNQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgLy8gICAgID49IHBheW1lbnRfYW1vdW50CiAgICAvLyApLCBlcnIuTk9UX0VOT1VHSF9GVU5EUwogICAgYXNzZXJ0IC8vIE5vdCBlbm91Z2ggZnVuZHMgZm9yIHRoZSBwYXltZW50CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA4CiAgICAvLyBzZWxmLl9wYXkoc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLCB0b3RhbF9hbW91bnQpCiAgICBkaWcgMgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZHVwCiAgICBleHRyYWN0IDAgMzIKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozOS00NAogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXJlY2VpdmVyLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1hbW91bnQsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0MwogICAgLy8gZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIGdsb2JhbCBNaW5UeG5GZWUKICAgIHVuY292ZXIgMwogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgc3dhcAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MzkKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozOS00NAogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXJlY2VpdmVyLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1hbW91bnQsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTI1LTEyNgogICAgLy8gIyBHZXQgdGhlIGNsYWltYWJsZSBhbW91bnRzIGJlZm9yZSByZXNldAogICAgLy8gaW50ZXJlc3RfYW1vdW50ID0gcG9zaXRpb24uY2xhaW1hYmxlX2ludGVyZXN0CiAgICBkdXAKICAgIHB1c2hpbnQgNzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgOQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEyNwogICAgLy8gcHJpbmNpcGFsX2Ftb3VudCA9IHBvc2l0aW9uLmNsYWltYWJsZV9wcmluY2lwYWwKICAgIGR1cAogICAgcHVzaGludCA4MQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMwogICAgYnVyeSA5CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTI5LTEzMAogICAgLy8gIyBSZXNldCB0aGUgcG9zaXRpb24ncyBjbGFpbWFibGUgYW1vdW50cwogICAgLy8gcG9zaXRpb24uY2xhaW1hYmxlX2ludGVyZXN0ID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgaXRvYgogICAgc3dhcAogICAgZGlnIDEKICAgIHJlcGxhY2UyIDczCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTMxCiAgICAvLyBwb3NpdGlvbi5jbGFpbWFibGVfcHJpbmNpcGFsID0gVUludDY0KDApCiAgICBzd2FwCiAgICByZXBsYWNlMiA4MQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzMgogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSBwb3NpdGlvbi5jb3B5KCkKICAgIHVuY292ZXIgMwogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzNAogICAgLy8gYXNzZXJ0IHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgPj0gaW50ZXJlc3RfYW1vdW50LCBlcnIuTk9UX0VOT1VHSF9GVU5EUwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCBleGlzdHMKICAgIGR1cAogICAgZGlnIDIKICAgID49CiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcyBmb3IgdGhlIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzUKICAgIC8vIGFzc2VydCBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCA+PSBwcmluY2lwYWxfYW1vdW50LCBlcnIuTk9UX0VOT1VHSF9GVU5EUwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIGV4aXN0cwogICAgZGlnIDMKICAgID49CiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcyBmb3IgdGhlIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzctMTM4CiAgICAvLyAjIFVwZGF0ZSB0aGUgZ2xvYmFsIHJlc2VydmVkIGludGVyZXN0IGFuZCBwcmluY2lwYWwgYW1vdW50cwogICAgLy8gc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCAtPSBpbnRlcmVzdF9hbW91bnQKICAgIHN3YXAKICAgIC0KICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTM5CiAgICAvLyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCAtPSBwcmluY2lwYWxfYW1vdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICBzd2FwCiAgICAtCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjExNAogICAgLy8gdG90YWxfYW1vdW50PWludGVyZXN0X2Ftb3VudCArIHByaW5jaXBhbF9hbW91bnQsCiAgICBkaWcgNQogICAgZHVwCiAgICBkaWcgNgogICAgZHVwCiAgICBjb3ZlciAzCiAgICArCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTE1CiAgICAvLyB0aW1lc3RhbXA9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTExLTExNwogICAgLy8gcmV0dXJuIHR5cC5DYXNoQ2xhaW1SZXN1bHQoCiAgICAvLyAgICAgaW50ZXJlc3RfYW1vdW50PWludGVyZXN0X2Ftb3VudCwKICAgIC8vICAgICBwcmluY2lwYWxfYW1vdW50PXByaW5jaXBhbF9hbW91bnQsCiAgICAvLyAgICAgdG90YWxfYW1vdW50PWludGVyZXN0X2Ftb3VudCArIHByaW5jaXBhbF9hbW91bnQsCiAgICAvLyAgICAgdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gICAgIGNvbnRleHQ9cGF5bWVudF9pbmZvLAogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZGlnIDIKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBwdXNoYnl0ZXMgMHgwMDIyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAyNDoKICAgIGludGNfMCAvLyAwCiAgICBiIGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUAyNQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX2ZhbHNlQDE1OgogICAgaW50Y18wIC8vIDAKICAgIGIgY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDE2CgoKLy8gbW9kdWxlcy50cmFuc2Zlcl9hZ2VudC5UcmFuc2ZlckFnZW50LnNldF90cmFuc2Zlcl9zY2hlZHVsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF90cmFuc2Zlcl9zY2hlZHVsZToKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToyNgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjI3CiAgICAvLyBhc3NlcnQgb3Blbl9kYXRlIDwgY2xvc3VyZV9kYXRlLCBlcnIuSU5WQUxJRF9TT1JUSU5HCiAgICBkdXAyCiAgICA8CiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbXVzdCBiZSBzb3J0ZWQgaW4gc3RyaWN0bHkgYXNjZW5kaW5nIG9yZGVyCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjI5CiAgICAvLyBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA9IG9wZW5fZGF0ZQogICAgYnl0ZWMgMjcgLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIHVuY292ZXIgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MzAKICAgIC8vIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlID0gY2xvc3VyZV9kYXRlCiAgICBieXRlYyAyOCAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MzEKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy50cmFuc2Zlcl9hZ2VudC5UcmFuc2ZlckFnZW50LnByaW1hcnlfZGlzdHJpYnV0aW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcHJpbWFyeV9kaXN0cmlidXRpb246CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjcxCiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5wcmltYXJ5X2RlYWxlciwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDIyIC8vIDB4NTIyMzUwNzI2OTZkNjE3Mjc5NDQ2NTYxNmM2NTcyMjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDMKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQ0CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDUKICAgIC8vIGFzc2VydCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBSSU1BUllfRElTVFJJQlVUSU9OX0NMT1NFRAogICAgYXNzZXJ0IC8vIFByaW1hcnkgZGlzdHJpYnV0aW9uIGlzIGNsb3NlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgY292ZXIgMwogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo0NwogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChob2xkaW5nX2FkZHJlc3MpCiAgICBzd2FwCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQ4CiAgICAvLyBhc3NlcnQgdW5pdHMgPiBVSW50NjQoMCksIGVyci5aRVJPX1VOSVRTCiAgICBkdXAKICAgIGFzc2VydCAvLyBDYW4gbm90IGRpc3RyaWJ1dGUgemVybyB1bml0cwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo1MAogICAgLy8gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCArIHVuaXRzIDw9IHNlbGYudG90YWxfdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICArCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgPD0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDktNTEKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCArIHVuaXRzIDw9IHNlbGYudG90YWxfdW5pdHMKICAgIC8vICksIGVyci5PVkVSX0RJU1RSSUJVVElPTgogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCByZW1haW5pbmcgRC1BU0EgdW5pdHMKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NTIKICAgIC8vIGlmIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI2IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlIGV4aXN0cwogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjU0CiAgICAvLyBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8PSBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI2IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlIGV4aXN0cwogICAgPD0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NTMtNTUKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPD0gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGUKICAgIC8vICksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TRUQKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBjbG9zZWQKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNDgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnJlc2VydmVkX3VuaXRzICs9IHVuaXRzCiAgICBkdXBuIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDMKICAgIGR1cAogICAgY292ZXIgMwogICAgKwogICAgaXRvYgogICAgcHVzaGludCA0MAogICAgc3dhcAogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NTgKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgKz0gdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICArCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NTkKICAgIC8vIHJldHVybiBzZWxmLnRvdGFsX3VuaXRzIC0gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIHN3YXAKICAgIC0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMudHJhbnNmZXJfYWdlbnQuVHJhbnNmZXJBZ2VudC50cmFuc2Zlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnRyYW5zZmVyOgogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo2MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NzUKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojc2CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTMKICAgIC8vIGlmIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI3IC8vICJ0cmFuc2Zlcl9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlIGV4aXN0cwogICAgYnogdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE1CiAgICAvLyBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI3IC8vICJ0cmFuc2Zlcl9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlIGV4aXN0cwogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPD0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTQtMTYKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICksIGVyci5DTE9TRURfVFJBTlNGRVIKICAgIGFzc2VydCAvLyBUcmFuc2ZlciBpcyBjbG9zZWQKCnRyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTcKICAgIC8vIGlmIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI4IC8vICJ0cmFuc2Zlcl9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgYnogdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE5CiAgICAvLyBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8IHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjggLy8gInRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICA8CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE4LTIwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDwgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGUKICAgIC8vICksIGVyci5DTE9TRURfVFJBTlNGRVIKICAgIGFzc2VydCAvLyBUcmFuc2ZlciBpcyBjbG9zZWQKCnRyYW5zZmVyX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODAKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIGRpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgOAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIGRpZyA1CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDkKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODMKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQoc2VuZGVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojg0CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGR1cAogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4NQogICAgLy8gYXNzZXJ0IHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MgIT0gcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzLCBlcnIuU0VMRl9UUkFOU0ZFUgogICAgdW5jb3ZlciAyCiAgICAhPQogICAgYXNzZXJ0IC8vIFNlbmRlciBhbmQgcmVjZWl2ZXIgbXVzdCBiZSBkaWZmZXJlbnQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODYKICAgIC8vIGFzc2VydCB1bml0cyA+IFVJbnQ2NCgwKSwgZXJyLk5VTExfVFJBTlNGRVIKICAgIGRpZyAxCiAgICBkdXAKICAgIGFzc2VydCAvLyBUcmFuc2ZlciB1bml0cyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojg3CiAgICAvLyBhc3NlcnQgdW5pdHMgPD0gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLCBlcnIuT1ZFUl9UUkFOU0ZFUgogICAgc3dhcAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIDw9CiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IHNlbmRlciB1bml0cyB0byB0cmFuc2ZlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzU2CiAgICAvLyBpZiBzZWxmLmV2ZW50X2N1cnNvciA+PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICA+PQogICAgYm56IHRyYW5zZmVyX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Fzc2VydF9ub19kdWVfZXZlbnRfcGVuZGluZ0AxMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzU4CiAgICAvLyBuZXh0X2VudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KHNlbGYuZXZlbnRfY3Vyc29yKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc2MAogICAgLy8gbmV4dF9lbnRyeS5zY2hlZHVsZWRfdGltZSA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NTktNzYxCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIG5leHRfZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gKSwgZXJyLlBFTkRJTkdfQUNUVVNfRVZFTlQKICAgIGFzc2VydCAvLyBBQ1RVUyBldmVudCBub3QgeWV0IGV4ZWN1dGVkCgp0cmFuc2Zlcl9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9hc3NlcnRfbm9fZHVlX2V2ZW50X3BlbmRpbmdAMTA6CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjkwCiAgICAvLyBzZWxmLl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBkaWcgMwogICAgZHVwCiAgICBjYWxsc3ViIF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjkxCiAgICAvLyBzZWxmLl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGRpZyAzCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGNhbGxzdWIgX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6OTIKICAgIC8vIHNlbGYuX3NldHRsZV9wb3NpdGlvbihzZW5kZXJfaG9sZGluZ19hZGRyZXNzKQogICAgY2FsbHN1YiBfc2V0dGxlX3Bvc2l0aW9uCiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6OTMKICAgIC8vIHNlbGYuX3NldHRsZV9wb3NpdGlvbihyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBjYWxsc3ViIF9zZXR0bGVfcG9zaXRpb24KICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE1MgogICAgLy8gYXNzZXJ0IHVuaXRzIDw9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLCBlcnIuT1ZFUl9UUkFOU0ZFUgogICAgZGlnIDUKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGRpZyAxCiAgICA8PQogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCBzZW5kZXIgdW5pdHMgdG8gdHJhbnNmZXIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNTMKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzIC09IHVuaXRzCiAgICBkaWcgMQogICAgLQogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBpbnRjXzMgLy8gMzIKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNDQKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzICs9IHVuaXRzCiAgICBkaWcgNQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgdW5jb3ZlciAyCiAgICArCiAgICBpdG9iCiAgICBpbnRjXzMgLy8gMzIKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgZGlnIDIKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF9nb3Zfc3VzcGVuc2lvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfZ292X3N1c3BlbnNpb246CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTY1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo3NwogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYXV0aG9yaXR5LCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjEgLy8gMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTg1CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGR1cAogICAgcHVzaGludCA0OAogICAgaW50Y18xIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIHB1c2hpbnQgNDgKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTg2CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfb3Blbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfb3BlbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2OAogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjMgLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQ0ZDYxNmU2MTY3NjU3MjIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzkKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0VOREVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDIwMAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTAKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX2VuZGVkKCksIGVyci5VTkFVVEhPUklaRUQKICAgICEKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxMQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTIKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjEzCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzQKICAgIC8vIHVuaXRzPVVJbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzItNDIKICAgIC8vIHJldHVybiB0eXAuQWNjb3VudFBvc2l0aW9uKAogICAgLy8gICAgIHBheW1lbnRfYWRkcmVzcz1wYXltZW50X2FkZHJlc3MsCiAgICAvLyAgICAgdW5pdHM9VUludDY0KDApLAogICAgLy8gICAgIHJlc2VydmVkX3VuaXRzPVVJbnQ2NCgwKSwKICAgIC8vICAgICBzdXNwZW5kZWQ9RmFsc2UsCiAgICAvLyAgICAgc2V0dGxlZF9jdXJzb3I9VUludDY0KDApLAogICAgLy8gICAgIGludGVyZXN0X2NoZWNrcG9pbnQ9VUludDY0KDApLAogICAgLy8gICAgIHByaW5jaXBhbF9jaGVja3BvaW50PVVJbnQ2NCgwKSwKICAgIC8vICAgICBjbGFpbWFibGVfaW50ZXJlc3Q9VUludDY0KDApLAogICAgLy8gICAgIGNsYWltYWJsZV9wcmluY2lwYWw9VUludDY0KDApLAogICAgLy8gKQogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBieXRlYyA0MCAvLyAweDAwCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxNAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSBzZWxmLl9uZXdfYWNjb3VudF9wb3NpdGlvbihwYXltZW50X2FkZHJlc3MpCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjE1CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzczoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMzgKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcywgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgdW5jb3ZlciAzCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjM5CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0MAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDEKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcyA9IHBheW1lbnRfYWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDIKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF9nZXRfcG9zaXRpb25bcm91dGluZ10oKSAtPiB2b2lkOgphY2NvdW50X2dldF9wb3NpdGlvbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNTkKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9jcmVhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9jcmVhdGU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5ODAKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSBhcnJhbmdlcgogICAgYnl0ZWMgMTggLy8gMHg1MjIzNDE3MjcyNjE2ZTY3NjU3MjIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTgxCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfY29uZmlnW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfY29uZmlnOgogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGxlbgogICAgcHVzaGludCAxMDcKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuTm9ybWFsaXplZEFjdHVzVGVybXMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDcyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLkluaXRpYWxLZXJuZWxTdGF0ZQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIGxlbgogICAgZGlnIDEKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgdHVwbGUgZW5jb2RpbmcKICAgIGR1cAogICAgcHVzaGludCAzNAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHRhaWwgcG9pbnRlciBhdCBpbmRleCAxIG9mICh1aW50OFszMl0sKGxlbit1dGY4W10pKQogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBjb3ZlciAzCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAzNgogICAgKwogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5Qcm9zcGVjdHVzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDEyCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMTQtMTAxNQogICAgLy8gIyBDb25maWd1cmUgQ29udHJhY3QKICAgIC8vIHNlbGYuY29udHJhY3RfdHlwZSA9IHRlcm1zLmNvbnRyYWN0X3R5cGUuYXNfdWludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ5dGVjIDEyIC8vICJjb250cmFjdF90eXBlIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICBieiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIwCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfQU5OKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjEKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgcHVzaGludCAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjIKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjMKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgcHVzaGludCA0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjQKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYnogY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAOAoKY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUA3OgogICAgaW50Y18xIC8vIDEKCmNvbnRyYWN0X2NvbmZpZ19ib29sX21lcmdlQDk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjkKICAgIC8vIGFzc2VydCBzZWxmLl9pc19zdXBwb3J0ZWRfY29udHJhY3RfdHlwZShjb250cmFjdF90eXBlKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDE3CiAgICAvLyBzZWxmLl9zdG9yZV9jb250cmFjdF9jb25maWcoc2VsZi5jb250cmFjdF90eXBlLCB0ZXJtcywgaW5pdGlhbF9zdGF0ZSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBidXJ5IDIKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMjUKICAgIC8vIGFzc2VydCB0ZXJtcy5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBkaWcgNAogICAgZHVwCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDgKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMyNwogICAgLy8gdGVybXMuZGF5X2NvdW50X2NvbnZlbnRpb24uYXNfdWludDY0KCkKICAgIHB1c2hpbnQgNTcKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyOTctMzAzCiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgIGJ6IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGRpZyA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyOTkKICAgIC8vIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGRpZyA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDAKICAgIC8vIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICBwdXNoaW50IDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI5Ny0zMDMKICAgIC8vIHJldHVybiBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzYwKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwSVNEQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjApLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDE2CiAgICBkaWcgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzAxCiAgICAvLyBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyOTctMzAzCiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgID09CiAgICBibnogY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUAxNgogICAgZGlnIDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMwMgogICAgLy8gVUludDY0KGVudW1zLkRDQ18zMEUzNjApLAogICAgcHVzaGludCA0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyOTctMzAzCiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgID09CiAgICBieiBjb250cmFjdF9jb25maWdfYm9vbF9mYWxzZUAxNwoKY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUAxNjoKICAgIGludGNfMSAvLyAxCgpjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUAxODoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMwOS0zMTEKICAgIC8vIGFzc2VydCBzZWxmLl9pc19zdXBwb3J0ZWRfZGF5X2NvdW50X2NvbnZlbnRpb24oCiAgICAvLyAgICAgZGF5X2NvdW50X2NvbnZlbnRpb24KICAgIC8vICksIGVyci5JTlZBTElEX0RBWV9DT1VOVF9DT05WRU5USU9OCiAgICBhc3NlcnQgLy8gSW52YWxpZCBkYXktY291bnQgY29udmVudGlvbiBJRAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzI5CiAgICAvLyBpZiBjb250cmFjdF90eXBlICE9IFVJbnQ2NChlbnVtcy5DVF9BTk4pOgogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgIT0KICAgIGJ6IGNvbnRyYWN0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDIwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzAKICAgIC8vIGFzc2VydCBub3QgdGVybXMuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBkaWcgNAogICAgcHVzaGludCA3ODYKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgoKY29udHJhY3RfY29uZmlnX2FmdGVyX2lmX2Vsc2VAMjA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MDAKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MDEKICAgIC8vIGFzc2VydCBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID09IFVJbnQ2NCgwKSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBELUFTQSBhbHJlYWR5IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgwMy04MDQKICAgIC8vICMgU2V0IERlbm9taW5hdGlvbiBBc3NldAogICAgLy8gc2VsZi5fYXNzZXJ0X2Rlbm9taW5hdGlvbl9hc3NldCh0ZXJtcy5kZW5vbWluYXRpb25fYXNzZXRfaWQpCiAgICBkaWcgNAogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc2OC03NjkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gZGVub21pbmF0aW9uIHdpdGggQVNBCiAgICAvLyBfY3JlYXRvciwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfY3JlYXRvcihkZW5vbWluYXRpb25fYXNzZXRfaWQpCiAgICBkdXAKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc3MAogICAgLy8gYXNzZXJ0IGV4aXN0cywgZXJyLklOVkFMSURfREVOT01JTkFUSU9OCiAgICBhc3NlcnQgLy8gRGVub21pbmF0aW9uIGFzc2V0IGlzIG5vdCBwcm9wZXJseSBzZXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc3MwogICAgLy8gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgPSBkZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIGJ5dGVjIDQ0IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgwNy04MDgKICAgIC8vICMgU2V0IFNldHRsZW1lbnQgQXNzZXQKICAgIC8vIHNlbGYuX2Fzc2VydF9zZXR0bGVtZW50X2Fzc2V0KHRlcm1zLnNldHRsZW1lbnRfYXNzZXRfaWQpCiAgICBkaWcgMQogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Nzc4CiAgICAvLyBzZXR0bGVtZW50X2Fzc2V0X2lkID09IHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc3Ni03NzkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzZXR0bGVtZW50IGFzc2V0IGlzIHRoZSBkZW5vbWluYXRpb24gYXNzZXQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgLy8gKSwgZXJyLklOVkFMSURfU0VUVExFTUVOVF9BU1NFVAogICAgYXNzZXJ0IC8vIERpZmZlcmVudCBzZXR0bGVtZW50IGFzc2V0IG5vdCBzdXBwb3J0ZWQsIG11c3QgYmUgZXF1YWwgdG8gZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODIKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCA9IHNldHRsZW1lbnRfYXNzZXRfaWQKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODMtNzg5CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODgKICAgIC8vIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODYKICAgIC8vIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Nzg3CiAgICAvLyBhc3NldF9hbW91bnQ9MCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODMtNzg0CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc4My03ODkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gc2V0dGxlbWVudCB3aXRoIEFTQQogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PTAsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTEtODEyCiAgICAvLyAjIFVuaXRzCiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzID0gdGVybXMudG90YWxfdW5pdHMKICAgIGR1cAogICAgcHVzaGludCAxNwogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTMKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDEwIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODE1LTgxNgogICAgLy8gIyBEYXktQ291bnQgQ29udmVudGlvbnMKICAgIC8vIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPSB0ZXJtcy5kYXlfY291bnRfY29udmVudGlvbi5hc191aW50NjQoKQogICAgYnl0ZWMgNDYgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgZGlnIDgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTgtODE5CiAgICAvLyAjIFRpbWUKICAgIC8vIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlID0gdGVybXMuaW5pdGlhbF9leGNoYW5nZV9kYXRlCiAgICBkdXAKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAyNiAvLyAiaW5pdGlhbF9leGNoYW5nZV9kYXRlIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MjAKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IHRlcm1zLm1hdHVyaXR5X2RhdGUKICAgIGRpZyAxCiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNDUgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgyMQogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gaW5pdGlhbF9zdGF0ZS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBkaWcgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBwdXNoaW50IDQ4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODIzLTgyNAogICAgLy8gIyBQcmluY2lwYWwKICAgIC8vIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPSB0ZXJtcy5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudAogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgZGlnIDEwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODI1CiAgICAvLyBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSB0ZXJtcy5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBkaWcgMwogICAgcHVzaGludCA3ODYKICAgIGdldGJpdAogICAgYnl0ZWMgMzQgLy8gImR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODI2CiAgICAvLyBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9IGluaXRpYWxfc3RhdGUub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBkaWcgMQogICAgcHVzaGludCAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjXzMgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MjgtODI5CiAgICAvLyAjIEludGVyZXN0CiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgPSBpbml0aWFsX3N0YXRlLmFjY3J1ZWRfaW50ZXJlc3QKICAgIGRpZyAxCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MzEtODMyCiAgICAvLyAjIEludGVyZXN0IFJhdGUKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gaW5pdGlhbF9zdGF0ZS5ub21pbmFsX2ludGVyZXN0X3JhdGUKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODMzCiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBpbml0aWFsX3N0YXRlLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UKICAgIGRpZyAxCiAgICBwdXNoaW50IDI0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MzQKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQgPSB0ZXJtcy5yYXRlX3Jlc2V0X3NwcmVhZAogICAgZGlnIDMKICAgIHB1c2hpbnQgNTgKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzNSAvLyAicmF0ZV9yZXNldF9zcHJlYWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODM1CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciA9IHRlcm1zLnJhdGVfcmVzZXRfbXVsdGlwbGllcgogICAgZGlnIDMKICAgIHB1c2hpbnQgNjYKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzNiAvLyAicmF0ZV9yZXNldF9tdWx0aXBsaWVyIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzNgogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X2Zsb29yID0gdGVybXMucmF0ZV9yZXNldF9mbG9vcgogICAgZGlnIDMKICAgIHB1c2hpbnQgNzQKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAyOSAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MzcKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9jYXAgPSB0ZXJtcy5yYXRlX3Jlc2V0X2NhcAogICAgZGlnIDMKICAgIHB1c2hpbnQgODIKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzMCAvLyAicmF0ZV9yZXNldF9jYXAiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODM4CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfbmV4dCA9IHRlcm1zLnJhdGVfcmVzZXRfbmV4dAogICAgZGlnIDMKICAgIHB1c2hpbnQgOTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzNyAvLyAicmF0ZV9yZXNldF9uZXh0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzOQogICAgLy8gc2VsZi5oYXNfcmF0ZV9yZXNldF9mbG9vciA9IHRlcm1zLmhhc19yYXRlX3Jlc2V0X2Zsb29yCiAgICBkaWcgMwogICAgcHVzaGludCA3ODQKICAgIGdldGJpdAogICAgYnl0ZWMgMzggLy8gImhhc19yYXRlX3Jlc2V0X2Zsb29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0MAogICAgLy8gc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgPSB0ZXJtcy5oYXNfcmF0ZV9yZXNldF9jYXAKICAgIGRpZyAzCiAgICBwdXNoaW50IDc4NQogICAgZ2V0Yml0CiAgICBieXRlYyAzOSAvLyAiaGFzX3JhdGVfcmVzZXRfY2FwIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0Mi04NDMKICAgIC8vICMgU2NhbGluZwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSA9IHRlcm1zLmZpeGVkX3BvaW50X3NjYWxlCiAgICB1bmNvdmVyIDMKICAgIHB1c2hpbnQgOTkKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDUtODQ2CiAgICAvLyAjIFNjaGVkdWxlIFByb2Nlc3NpbmcKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yID0gaW5pdGlhbF9zdGF0ZS5ldmVudF9jdXJzb3IKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDgtODQ5CiAgICAvLyAjIFBlci1Vbml0IEZpeGVkLVBvaW50IEluZGV4ZXMKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCA9IGluaXRpYWxfc3RhdGUuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleAogICAgZGlnIDEKICAgIHB1c2hpbnQgNTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NTAKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggPSBpbml0aWFsX3N0YXRlLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4CiAgICBkaWcgMQogICAgcHVzaGludCA2NAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NTItODUzCiAgICAvLyAjIFJlc2VydmVkIEFtb3VudCAoZm9yIGV4ZWN1dGVkIGNhc2hmbG93cykKICAgIC8vIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU0CiAgICAvLyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU2CiAgICAvLyBhc3NlcnQgdGVybXMuaW5pdGlhbF9leGNoYW5nZV9kYXRlID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsIGVyci5JTlZBTElEX0lFRAogICAgZGlnIDIKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgID4KICAgIGFzc2VydCAvLyBJRUQgbXVzdCBiZSBzZXQgaW4gdGhlIGZ1dHVyZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU3CiAgICAvLyBhc3NlcnQgdGVybXMuaW5pdGlhbF9leGNoYW5nZV9kYXRlID4gaW5pdGlhbF9zdGF0ZS5zdGF0dXNfZGF0ZSwgZXJyLklOVkFMSURfSUVECiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICA8CiAgICBhc3NlcnQgLy8gSUVEIG11c3QgYmUgc2V0IGluIHRoZSBmdXR1cmUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg1OAogICAgLy8gYXNzZXJ0IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA8IHRlcm1zLm1hdHVyaXR5X2RhdGUsIGVyci5JTlZBTElEX0lFRAogICAgPAogICAgYXNzZXJ0IC8vIElFRCBtdXN0IGJlIHNldCBpbiB0aGUgZnV0dXJlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDE5LTEwMjAKICAgIC8vICMgTm90YXJpemUgcHJvc3BlY3R1cyAob3B0aW9uYWwpCiAgICAvLyBzZWxmLnByb3NwZWN0dXNfaGFzaCA9IHByb3NwZWN0dXMuaGFzaC5ieXRlcwogICAgZGlnIDIKICAgIGV4dHJhY3QgMCAzMgogICAgYnl0ZWMgNDIgLy8gInByb3NwZWN0dXNfaGFzaCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDIxCiAgICAvLyBzZWxmLnByb3NwZWN0dXNfdXJsID0gcHJvc3BlY3R1cy51cmwKICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgYnl0ZWMgNDMgLy8gInByb3NwZWN0dXNfdXJsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMjIKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNvbnRyYWN0X2NvbmZpZ19ib29sX2ZhbHNlQDE3OgogICAgaW50Y18wIC8vIDAKICAgIGIgY29udHJhY3RfY29uZmlnX2Jvb2xfbWVyZ2VAMTgKCmNvbnRyYWN0X2NvbmZpZ19ib29sX2ZhbHNlQDg6CiAgICBpbnRjXzAgLy8gMAogICAgYiBjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUA5CgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3Rfc2NoZWR1bGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9zY2hlZHVsZToKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAyNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBzd2FwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgMwogICAgZHVwCiAgICBwdXNoaW50IDY1CiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIHVuY292ZXIgMgogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8c21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5FeGVjdXRpb25TY2hlZHVsZUVudHJ5PgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAzOQogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDQyCiAgICAvLyBjb250cmFjdF90eXBlPXNlbGYuY29udHJhY3RfdHlwZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBjb3ZlciAzCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODc0CiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIEQtQVNBIGFscmVhZHkgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODc1LTg3NwogICAgLy8gYXNzZXJ0IHNjaGVkdWxlX3BhZ2UubGVuZ3RoIDw9IFVJbnQ2NCgKICAgIC8vICAgICBjc3QuU0NIRURVTEVfUEFHRV9TSVpFCiAgICAvLyApLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBkdXAKICAgIHB1c2hpbnQgMTYKICAgIDw9CiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NzgKICAgIC8vIGFzc2VydCBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID4gVUludDY0KDApLCBlcnIuVEVSTVNfTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMCAvLyAiaW5pdGlhbF9leGNoYW5nZV9hbW91bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0EgdGVybXMgbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg4MAogICAgLy8gcGFnZV9jdXJzb3IgPSBzY2hlZHVsZV9wYWdlX2luZGV4ICogVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpCiAgICBzd2FwCiAgICBwdXNoaW50IDE2CiAgICAqCiAgICBzd2FwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4ODcKICAgIC8vICsgcGFnZV9sZW5ndGggKiBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19QRVJfRU5UUllfQlVER0VUKQogICAgcHVzaGludCAxMDAKICAgICoKICAgIHB1c2hpbnQgMTUxMAogICAgKwoKY29udHJhY3Rfc2NoZWR1bGVfd2hpbGVfdG9wQDI6CiAgICBkdXAKICAgIGdsb2JhbCBPcGNvZGVCdWRnZXQKICAgID4KICAgIGJ6IGNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX3doaWxlQDUKICAgIGl0eG5fYmVnaW4KICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBwdXNoaW50IDUgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICBieXRlYyA0NyAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW0KICAgIGJ5dGVjIDQ3IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBiIGNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEAyCgpjb250cmFjdF9zY2hlZHVsZV9hZnRlcl93aGlsZUA1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODkwCiAgICAvLyBpbmRleCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTAKCmNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODkxCiAgICAvLyB3aGlsZSBpbmRleCA8IHBhZ2VfbGVuZ3RoOgogICAgZGlnIDkKICAgIGRpZyA0CiAgICA8CiAgICBieiBjb250cmFjdF9zY2hlZHVsZV9hZnRlcl93aGlsZUAxNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODkyLTg5MwogICAgLy8gZW50cnkgPSBzY2hlZHVsZV9wYWdlW2luZGV4XS5jb3B5KCkKICAgIC8vIGVudHJ5X2V2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBkaWcgNAogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgYnVyeSAxMwogICAgZGlnIDEwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgNjUKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODkzCiAgICAvLyBlbnRyeV9ldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTItODkzCiAgICAvLyBlbnRyeSA9IHNjaGVkdWxlX3BhZ2VbaW5kZXhdLmNvcHkoKQogICAgLy8gZW50cnlfZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGludGNfMiAvLyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTMKICAgIC8vIGVudHJ5X2V2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBnZXRieXRlCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgMTQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg5NAogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X2lkID09IHBhZ2VfY3Vyc29yICsgaW5kZXgsIGVyci5JTlZBTElEX0VWRU5UX0lECiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEzCiAgICBkaWcgNQogICAgdW5jb3ZlciA0CiAgICArCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTUtODk3CiAgICAvLyBzZWxmLl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBlbnRyeV9ldmVudF90eXBlCiAgICAvLyApCiAgICBkaWcgNQogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODk4CiAgICAvLyBhc3NlcnQgZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgc3dhcAogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTkKICAgIC8vIGlmIGVudHJ5LmV2ZW50X2lkID4gVUludDY0KDApOgogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTAwCiAgICAvLyBpZiBpbmRleCA+IFVJbnQ2NCgwKToKICAgIGRpZyA5CiAgICBieiBjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlAMTAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkwMQogICAgLy8gcHJldmlvdXNfZW50cnkgPSBzY2hlZHVsZV9wYWdlW2luZGV4IC0gVUludDY0KDEpXS5jb3B5KCkKICAgIGRpZyA5CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgcHVzaGludCA2NQogICAgKgogICAgZGlnIDEyCiAgICBzd2FwCiAgICBwdXNoaW50IDY1CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTYKICAgIC8vIHByZXZpb3VzX2VudHJ5LnNjaGVkdWxlZF90aW1lIDw9IGVudHJ5LnNjaGVkdWxlZF90aW1lCiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgOAogICAgPD0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkxNS05MTcKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgcHJldmlvdXNfZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gZW50cnkuc2NoZWR1bGVkX3RpbWUKICAgIC8vICksIGVyci5JTlZBTElEX1NPUlRJTkcKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBtdXN0IGJlIHNvcnRlZCBpbiBzdHJpY3RseSBhc2NlbmRpbmcgb3JkZXIKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTgKICAgIC8vIGlmIGVudHJ5LmV2ZW50X2lkID09IFVJbnQ2NCgwKToKICAgIGRpZyA4CiAgICBibnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTE5LTkyMQogICAgLy8gYXNzZXJ0IGVudHJ5X2V2ZW50X3R5cGUgPT0gVUludDY0KAogICAgLy8gICAgIGVudW1zLkVWVF9JRUQKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZGlnIDEwCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjIKICAgIC8vIGluZGV4ICs9IFVJbnQ2NCgxKQogICAgZGlnIDkKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEwCiAgICBiIGNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEA2Cgpjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlAMTA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDMtOTA1CiAgICAvLyAjIFRoZSBmaXJzdCBlbnRyeSBvZiBhIHBhZ2UgbXVzdCBzdGlsbCBiZSBvcmRlcmVkIGFmdGVyIHRoZQogICAgLy8gIyBsYXN0IGVudHJ5IG9mIHRoZSBwcmV2aW91cyBwYWdlLgogICAgLy8gYXNzZXJ0IHNjaGVkdWxlX3BhZ2VfaW5kZXggPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0VWRU5UX0lECiAgICBkaWcgNgogICAgZHVwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBpZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTA2CiAgICAvLyBwcmV2aW91c19wYWdlX2luZGV4ID0gc2NoZWR1bGVfcGFnZV9pbmRleCAtIFVJbnQ2NCgxKQogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkwOAogICAgLy8gcHJldmlvdXNfcGFnZV9pbmRleCBpbiBzZWxmLnNjaGVkdWxlX3BhZ2UKICAgIGl0b2IKICAgIGJ5dGVjIDMxIC8vIDB4NTMyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTA3LTkwOQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBwcmV2aW91c19wYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZQogICAgLy8gKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTEwLTkxMQogICAgLy8gcHJldmlvdXNfcGFnZSA9IHNlbGYuc2NoZWR1bGVfcGFnZVtwcmV2aW91c19wYWdlX2luZGV4XS5jb3B5KCkKICAgIC8vIGFzc2VydCBwcmV2aW91c19wYWdlLmxlbmd0aCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGludCAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTExCiAgICAvLyBhc3NlcnQgcHJldmlvdXNfcGFnZS5sZW5ndGggPiBVSW50NjQoMCksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGR1cAogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTEzCiAgICAvLyBwcmV2aW91c19wYWdlLmxlbmd0aCAtIFVJbnQ2NCgxKQogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkxMi05MTQKICAgIC8vIHByZXZpb3VzX2VudHJ5ID0gcHJldmlvdXNfcGFnZVsKICAgIC8vICAgICBwcmV2aW91c19wYWdlLmxlbmd0aCAtIFVJbnQ2NCgxKQogICAgLy8gXS5jb3B5KCkKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgMgogICAgKwogICAgcHVzaGludCA2NQogICAgYm94X2V4dHJhY3QKICAgIGIgY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxMQoKY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfd2hpbGVAMTU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMDAKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHNjaGVkdWxlX3BhZ2UuY29weSgpCiAgICBkaWcgNgogICAgaXRvYgogICAgYnl0ZWMgMzEgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBkaWcgNQogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTI1CiAgICAvLyBpZiBpc19sYXN0X3BhZ2U6CiAgICBkaWcgNQogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxNwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTI3CiAgICAvLyBzY2hlZHVsZV9wYWdlX2luZGV4ICogVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpICsgcGFnZV9sZW5ndGgKICAgIGRpZyAxCiAgICBkaWcgNAogICAgKwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTI2CiAgICAvLyBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50ID0gKAogICAgYnl0ZWMgNCAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjYtOTI4CiAgICAvLyBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50ID0gKAogICAgLy8gICAgIHNjaGVkdWxlX3BhZ2VfaW5kZXggKiBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkgKyBwYWdlX2xlbmd0aAogICAgLy8gKQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkyOQogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgcHVzaGludCA1MAogICAgYXBwX2dsb2JhbF9wdXQKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDQ3CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmV4ZWN1dGVfaWVkW3JvdXRpbmddKCkgLT4gdm9pZDoKZXhlY3V0ZV9pZWQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA1NwogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDU4CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA1OQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNjEKICAgIC8vIGFzc2VydCBzZWxmLmV2ZW50X2N1cnNvciA8IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICBkaWcgMQogICAgPgogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgY3Vyc29yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDYyCiAgICAvLyBlbnRyeSA9IHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLmV2ZW50X2N1cnNvcikKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2MwogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X3R5cGUgPT0gYXJjNC5VSW50OChlbnVtcy5FVlRfSUVEKSwgZXJyLklOVkFMSURfRVZFTlRfVFlQRQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgZHVwCiAgICBwdXNoYnl0ZXMgMHgwMQogICAgYj09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCB0eXBlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDY3CiAgICAvLyBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIGRpZyAxCiAgICBleHRyYWN0IDAgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2OQogICAgLy8gc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICBkaWcgMgogICAgZXh0cmFjdCA5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNzAKICAgIC8vIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgZGlnIDMKICAgIGV4dHJhY3QgMTcgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3MQogICAgLy8gcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZGlnIDQKICAgIGV4dHJhY3QgMjUgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3MwogICAgLy8gbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9ZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBkaWcgNQogICAgZXh0cmFjdCAzMyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc0CiAgICAvLyBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICBkaWcgNgogICAgZXh0cmFjdCA0MSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc1CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1lbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIGRpZyA3CiAgICBleHRyYWN0IDQ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNzYKICAgIC8vIGZsYWdzPWVudHJ5LmZsYWdzLAogICAgZGlnIDgKICAgIGV4dHJhY3QgNTcgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2Ni0xMDc3CiAgICAvLyB0eXAuT2JzZXJ2ZWRFdmVudFJlcXVlc3QoCiAgICAvLyAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBvYnNlcnZlZF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1lbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9ZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9ZW50cnkuZmxhZ3MsCiAgICAvLyApLAogICAgdW5jb3ZlciA3CiAgICB1bmNvdmVyIDgKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3MgogICAgLy8gb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2Ni0xMDc3CiAgICAvLyB0eXAuT2JzZXJ2ZWRFdmVudFJlcXVlc3QoCiAgICAvLyAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBvYnNlcnZlZF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1lbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9ZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9ZW50cnkuZmxhZ3MsCiAgICAvLyApLAogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNjQtMTA3OAogICAgLy8gc2VsZi5fYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkoCiAgICAvLyAgICAgZW50cnksCiAgICAvLyAgICAgdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0KAogICAgLy8gICAgICAgICBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIC8vICAgICAgICAgZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgLy8gICAgICAgICBzY2hlZHVsZWRfdGltZT1lbnRyeS5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICAgICAgYWNjcnVhbF9mYWN0b3I9ZW50cnkuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICAgICAgb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPWVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPWVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgICAgICBmbGFncz1lbnRyeS5mbGFncywKICAgIC8vICAgICApLAogICAgLy8gKQogICAgY2FsbHN1YiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkKICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3OQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDQ5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5hcHBseV9ub25fY2FzaF9ldmVudFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFwcGx5X25vbl9jYXNoX2V2ZW50OgogICAgaW50Y18wIC8vIDAKICAgIGR1cG4gNAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwODEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwbiAyCiAgICBsZW4KICAgIHB1c2hpbnQgNzMKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuT2JzZXJ2ZWRFdmVudFJlcXVlc3QKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDk1CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA5NgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwOTgKICAgIC8vIGlmIHBheWxvYWQuZmxhZ3MgJiBVSW50NjQoZW51bXMuRkxBR19PQlNFUlZFRF9FVkVOVCk6CiAgICBwdXNoaW50IDY1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBwdXNoaW50IDQKICAgICYKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjMzCiAgICAvLyByZXR1cm4gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9DTE0pCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIHB1c2hpbnQgNQogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwOTkKICAgIC8vIGFzc2VydCBzZWxmLl9zdXBwb3J0c19vYnNlcnZlZF9ldmVudHMoKSwgZXJyLk9CU0VSVkVEX0VWRU5UX1JFUVVJUkVECiAgICBhc3NlcnQgLy8gT2JzZXJ2ZWQgZXZlbnQgcmVxdWlyZWQgdG8gZXhlY3V0ZSB0aGlzIGFjdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEwMAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMzMKICAgIC8vIHJldHVybiBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0NMTSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgZHVwCiAgICBwdXNoaW50IDUKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MzgKICAgIC8vIGFzc2VydCBzZWxmLl9zdXBwb3J0c19vYnNlcnZlZF9ldmVudHMoKSwgZXJyLk9CU0VSVkVEX0VWRU5UX1JFUVVJUkVECiAgICBhc3NlcnQgLy8gT2JzZXJ2ZWQgZXZlbnQgcmVxdWlyZWQgdG8gZXhlY3V0ZSB0aGlzIGFjdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTM5CiAgICAvLyBhc3NlcnQgcGF5bG9hZC5ldmVudF9pZCA9PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LCBlcnIuSU5WQUxJRF9FVkVOVF9JRAogICAgZGlnIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgNwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NDEKICAgIC8vIHNlbGYuY29udHJhY3RfdHlwZSwgcGF5bG9hZC5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBkdXAKICAgIGV4dHJhY3QgOCAxCiAgICBidXJ5IDEyCiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQwLTk0MgogICAgLy8gc2VsZi5fYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgc2VsZi5jb250cmFjdF90eXBlLCBwYXlsb2FkLmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIC8vICkKICAgIGNhbGxzdWIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NDQKICAgIC8vIHBhZ2VfaW5kZXggPSBzZWxmLl9zY2hlZHVsZV9wYWdlX2luZGV4KHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxOTAKICAgIC8vIHJldHVybiBldmVudF9pZCAvLyBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkKICAgIHB1c2hpbnQgMTYKICAgIC8KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk0NQogICAgLy8gcGFnZSA9IHR5cC5FeGVjdXRpb25TY2hlZHVsZVBhZ2UoKQogICAgcHVzaGJ5dGVzIDB4MDAwMAogICAgYnVyeSA3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NDYKICAgIC8vIGlmIHBhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlOgogICAgaXRvYgogICAgYnl0ZWMgMzEgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA5CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMjcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk0NwogICAgLy8gcGFnZSA9IHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XS5jb3B5KCkKICAgIGRpZyA3CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidXJ5IDcKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX3BhZ2UgZW50cnkgZXhpc3RzCgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDI3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQ4CiAgICAvLyBhc3NlcnQgcGFnZS5sZW5ndGggPCBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGRpZyA1CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgMTYKICAgIDwKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1MwogICAgLy8gc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIGRpZyAzCiAgICBkdXAKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTQKICAgIC8vIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICBkaWcgMQogICAgZXh0cmFjdCAxNyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTUKICAgIC8vIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZGlnIDIKICAgIGV4dHJhY3QgMjUgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTU2CiAgICAvLyBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDMKICAgIGV4dHJhY3QgNDEgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTU3CiAgICAvLyBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIGRpZyA0CiAgICBleHRyYWN0IDQ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1OAogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIHVuY292ZXIgNQogICAgZXh0cmFjdCA1NyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTAtOTYwCiAgICAvLyB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1wYXlsb2FkLmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9cGF5bG9hZC5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPXBheWxvYWQucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXBheWxvYWQubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICkKICAgIGRpZyAxMQogICAgaXRvYgogICAgZGlnIDE4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMwogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NDktOTYxCiAgICAvLyBwYWdlLmFwcGVuZCgKICAgIC8vICAgICB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9cGF5bG9hZC5ldmVudF9pZCwKICAgIC8vICAgICAgICAgZXZlbnRfdHlwZT1wYXlsb2FkLmV2ZW50X3R5cGUsCiAgICAvLyAgICAgICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIC8vICAgICAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICAgICApCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjIKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHBhZ2UuY29weSgpCiAgICBkaWcgOAogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2MwogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTAzCiAgICAvLyBhc3NlcnQgZXZlbnRfaWQgPT0gc2VsZi5ldmVudF9jdXJzb3IsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBjdXJzb3IKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMDQKICAgIC8vIGVudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KGV2ZW50X2lkKQogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEwNgogICAgLy8gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgYnVyeSAxMAogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjQKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY1CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzYzLTM3MAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9SUiksCiAgICBwdXNoaW50IDEyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY3CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICBwdXNoaW50IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY4CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgcHVzaGludCAxOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzYzLTM3MAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBieiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX2ZhbHNlQDE2CgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX3RydWVAMTU6CiAgICBpbnRjXzEgLy8gMQoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9tZXJnZUAxNzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMDUtMTEwNwogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2lzX25vbl9jYXNoKAogICAgLy8gICAgIGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIC8vICksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IHR5cGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMDgKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlICE9IGFyYzQuVUludDgoZW51bXMuRVZUX0lFRCksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGRpZyA4CiAgICBwdXNoYnl0ZXMgMHgwMQogICAgYiE9CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCB0eXBlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNzQKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluIChVSW50NjQoZW51bXMuRVZUX1JSKSwgVUludDY0KGVudW1zLkVWVF9SUkYpKQogICAgZGlnIDQKICAgIHB1c2hpbnQgMTIKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDIxCiAgICBkaWcgNAogICAgcHVzaGludCAxMQogICAgPT0KICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfZmFsc2VAMjIKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAyMToKICAgIGludGNfMSAvLyAxCgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX21lcmdlQDIzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEwOQogICAgLy8gaWYgc2VsZi5fZXZlbnRfaXNfcmF0ZV9yZXNldChlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpKToKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Vsc2VfYm9keUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODAKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLm9ic2VydmVyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjQgLy8gMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTEzCiAgICAvLyBzZWxmLl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeShlbnRyeSwgcGF5bG9hZCkKICAgIGRpZyA2CiAgICBkaWcgMgogICAgY2FsbHN1YiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkKICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTExNAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDgxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Vsc2VfYm9keUA1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTExMgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICBiIGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VANgoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9mYWxzZUAyMjoKICAgIGludGNfMCAvLyAwCiAgICBiIGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfbWVyZ2VAMjMKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfZmFsc2VAMTY6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX21lcmdlQDE3CgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuZ2V0X2NvbnRyYWN0X3N0YXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2NvbnRyYWN0X3N0YXRlOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBkdXAKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEyMQogICAgLy8gY29udHJhY3RfdHlwZT1hcmM0LlVJbnQ4KHNlbGYuY29udHJhY3RfdHlwZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzIgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMjMKICAgIC8vIHRvdGFsX3VuaXRzPXNlbGYudG90YWxfdW5pdHMsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEyNAogICAgLy8gcmVzZXJ2ZWRfdW5pdHNfdG90YWw9c2VsZi5yZXNlcnZlZF91bml0c190b3RhbCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTI1CiAgICAvLyBpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudD1zZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMjYKICAgIC8vIGV2ZW50X2N1cnNvcj1zZWxmLmV2ZW50X2N1cnNvciwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEyNwogICAgLy8gc2NoZWR1bGVfZW50cnlfY291bnQ9c2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMjgKICAgIC8vIG91dHN0YW5kaW5nX3ByaW5jaXBhbD1zZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEyOQogICAgLy8gaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZT1zZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEzMAogICAgLy8gbm9taW5hbF9pbnRlcmVzdF9yYXRlPXNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTMxCiAgICAvLyBhY2NydWVkX2ludGVyZXN0PXNlbGYuYWNjcnVlZF9pbnRlcmVzdCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTMyCiAgICAvLyBjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4PXNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEzMwogICAgLy8gY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXg9c2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTM0CiAgICAvLyByZXNlcnZlZF9pbnRlcmVzdD1zZWxmLnJlc2VydmVkX2ludGVyZXN0LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMzUKICAgIC8vIHJlc2VydmVkX3ByaW5jaXBhbD1zZWxmLnJlc2VydmVkX3ByaW5jaXBhbCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMjAtMTEzNgogICAgLy8gcmV0dXJuIHR5cC5LZXJuZWxTdGF0ZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlPWFyYzQuVUludDgoc2VsZi5jb250cmFjdF90eXBlKSwKICAgIC8vICAgICBzdGF0dXM9c2VsZi5zdGF0dXMsCiAgICAvLyAgICAgdG90YWxfdW5pdHM9c2VsZi50b3RhbF91bml0cywKICAgIC8vICAgICByZXNlcnZlZF91bml0c190b3RhbD1zZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsLAogICAgLy8gICAgIGluaXRpYWxfZXhjaGFuZ2VfYW1vdW50PXNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQsCiAgICAvLyAgICAgZXZlbnRfY3Vyc29yPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgLy8gICAgIHNjaGVkdWxlX2VudHJ5X2NvdW50PXNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQsCiAgICAvLyAgICAgb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2U9c2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlLAogICAgLy8gICAgIG5vbWluYWxfaW50ZXJlc3RfcmF0ZT1zZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBhY2NydWVkX2ludGVyZXN0PXNlbGYuYWNjcnVlZF9pbnRlcmVzdCwKICAgIC8vICAgICBjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4PXNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCwKICAgIC8vICAgICBjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleD1zZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4LAogICAgLy8gICAgIHJlc2VydmVkX2ludGVyZXN0PXNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QsCiAgICAvLyAgICAgcmVzZXJ2ZWRfcHJpbmNpcGFsPXNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsLAogICAgLy8gKQogICAgdW5jb3ZlciAxNAogICAgaXRvYgogICAgdW5jb3ZlciAxNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDEzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDEwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgOQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDgKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTE2CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5nZXRfbmV4dF9kdWVfZXZlbnRbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfbmV4dF9kdWVfZXZlbnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE0MgogICAgLy8gaWYgc2VsZi5ldmVudF9jdXJzb3IgPj0gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgPj0KICAgIGJ6IGdldF9uZXh0X2R1ZV9ldmVudF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDQKICAgIC8vIGV2ZW50X2lkPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTQzLTExNTMKICAgIC8vIHJldHVybiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1zZWxmLmV2ZW50X2N1cnNvciwKICAgIC8vICAgICBldmVudF90eXBlPWFyYzQuVUludDgoMCksCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9VUludDY0KDApLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9VUludDY0KDApLAogICAgLy8gICAgIGZsYWdzPVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGl0b2IKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDUKICAgIC8vIGV2ZW50X3R5cGU9YXJjNC5VSW50OCgwKSwKICAgIGJ5dGVjIDQwIC8vIDB4MDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDMtMTE1MwogICAgLy8gcmV0dXJuIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgIGV2ZW50X2lkPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgLy8gICAgIGV2ZW50X3R5cGU9YXJjNC5VSW50OCgwKSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1VSW50NjQoMCksCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1VSW50NjQoMCksCiAgICAvLyAgICAgZmxhZ3M9VUludDY0KDApLAogICAgLy8gKQogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTQ2CiAgICAvLyBzY2hlZHVsZWRfdGltZT1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE0My0xMTUzCiAgICAvLyByZXR1cm4gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkoCiAgICAvLyAgICAgZXZlbnRfaWQ9c2VsZi5ldmVudF9jdXJzb3IsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1hcmM0LlVJbnQ4KDApLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPVVJbnQ2NCgwKSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249VUludDY0KDApLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPVVJbnQ2NCgwKSwKICAgIC8vICAgICBmbGFncz1VSW50NjQoMCksCiAgICAvLyApCiAgICBpdG9iCiAgICBzd2FwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKCmdldF9uZXh0X2R1ZV9ldmVudF9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmdldF9uZXh0X2R1ZV9ldmVudEA0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEzOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpnZXRfbmV4dF9kdWVfZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1NAogICAgLy8gcmV0dXJuIHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLmV2ZW50X2N1cnNvcikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgZ2V0X25leHRfZHVlX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuZ2V0X25leHRfZHVlX2V2ZW50QDQKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5jb250cmFjdF91cGRhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF91cGRhdGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTUzLTE1NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGdyYW50cyB0aGUgdXBkYXRlIHBlcm1pc3Npb25zIHRvIHRoZSBBcnJhbmdlci4KICAgIC8vICMg4pqg77iPIFdBUk5JTkc6IEFwcGxpY2F0aW9uIHVwZGF0ZXMgbXVzdCBiZSBleGVjdXRlZCBWRVJZIGNhcmVmdWxseSwgYXMgdGhleQogICAgLy8gIyBtaWdodCBpbnRyb2R1Y2UgYnJlYWtpbmcgY2hhbmdlcy4KICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfcm90YXRlX2FycmFuZ2VyW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19yb3RhdGVfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2OQogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTcwCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gbmV3X2FycmFuZ2VyCiAgICBieXRlYyAxOCAvLyAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTcxCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfc2V0X29wX2RhZW1vbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfc2V0X29wX2RhZW1vbjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTg0CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODUKICAgIC8vIHNlbGYub3BfZGFlbW9uLnZhbHVlID0gYWRkcmVzcwogICAgYnl0ZWMgMjUgLy8gMHg1MjIzNGY3MDQ0NjE2NTZkNmY2ZTIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4NgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTczCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2Fzc2lnbl9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19hc3NpZ25fcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDE2CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLlJvbGVWYWxpZGl0eQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjExCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMgogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgcHVzaGludCAyMAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTAzCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gcm9sZV9hZGRyZXNzCiAgICBieXRlYyAxOCAvLyAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMKICAgIGRpZyAzCiAgICBhcHBfZ2xvYmFsX3B1dAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTQKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDYKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIGR1cAogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnRfbWFuYWdlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMyAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwOAogICAgLy8gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMiAvLyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTIKICAgIC8vIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIGR1cAogICAgcHVzaGludCA2MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE1CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMzIgLy8gMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE2CiAgICAvLyBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExOAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMSAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIwCiAgICAvLyBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMwogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgODAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIzCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI0IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI0CiAgICAvLyBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3Jldm9rZV9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19yZXZva2Vfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzUKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzNgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzcKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCkpCiAgICBidG9pCiAgICBkdXBuIDIKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCAhPSBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksIGVyci5JTlZBTElEX1JPTEUKICAgIGR1cAogICAgcHVzaGludCAyMAogICAgIT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyOAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIzIC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0NGQ2MTZlNjE2NzY1NzIyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMwCiAgICAvLyBkZWwgc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzOQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjE2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIyIC8vIDB4NTIyMzUwNzI2OTZkNjE3Mjc5NDQ2NTYxNmM2NTcyMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNAogICAgLy8gZGVsIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjM4CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIGR1cAogICAgcHVzaGludCA2MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAzMiAvLyAweDUyMjM1NDcyNzU3Mzc0NjU2NTIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzgKICAgIC8vIGRlbCBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjM4CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDEKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hdXRob3JpdHksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjEgLy8gMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MgogICAgLy8gZGVsIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzOAogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDQKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDgwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI0IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ2CiAgICAvLyBkZWwgc2VsZi5vYnNlcnZlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ292X2Fzc2V0X3N1c3BlbnNpb25bcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dvdl9hc3NldF9zdXNwZW5zaW9uOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kICAjIFRPRE86IFVwZGF0ZSBzcGVjcyBhbmQgYWRkIHRlc3QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzcKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDIxIC8vIDB4NTIyMzQxNzU3NDY4NmY3MjY5NzQ3OTIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU3CiAgICAvLyBzZWxmLmFzc2V0X3N1c3BlbmRlZCA9IHN1c3BlbmRlZAogICAgYnl0ZWMgMzMgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU4CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCAgIyBUT0RPOiBVcGRhdGUgc3BlY3MgYW5kIGFkZCB0ZXN0CiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYXJyYW5nZXJbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNjgKICAgIC8vIHJldHVybiBzZWxmLmFycmFuZ2VyLnZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTggLy8gMHg1MjIzNDE3MjcyNjE2ZTY3NjU3MjIzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJyYW5nZXIgZXhpc3RzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjYwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9hZGRyZXNzX3JvbGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfYWRkcmVzc19yb2xlczoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg0CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmFjY291bnRfbWFuYWdlciwgYWRkcmVzcyksCiAgICBieXRlYyAyMyAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMKICAgIGRpZyAxCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4NQogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5wcmltYXJ5X2RlYWxlciwgYWRkcmVzcyksCiAgICBieXRlYyAyMiAvLyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzCiAgICBkaWcgMgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODYKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYudHJ1c3RlZSwgYWRkcmVzcyksCiAgICBieXRlYyAzMiAvLyAweDUyMjM1NDcyNzU3Mzc0NjU2NTIzCiAgICBkaWcgMwogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODcKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYXV0aG9yaXR5LCBhZGRyZXNzKSwKICAgIGJ5dGVjIDIxIC8vIDB4NTIyMzQxNzU3NDY4NmY3MjY5NzQ3OTIzCiAgICBkaWcgNAogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODgKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYub2JzZXJ2ZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjQgLy8gMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzCiAgICB1bmNvdmVyIDUKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjcwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjIDQwIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDYKICAgIHNldGJpdAogICAgaW50Y18xIC8vIDEKICAgIHVuY292ZXIgNQogICAgc2V0Yml0CiAgICBwdXNoaW50IDIKICAgIHVuY292ZXIgNAogICAgc2V0Yml0CiAgICBwdXNoaW50IDMKICAgIHVuY292ZXIgMwogICAgc2V0Yml0CiAgICBwdXNoaW50IDQKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA1CiAgICAvLyByb2xlID0gcm9sZV9pZC5hc191aW50NjQoKQogICAgYnRvaQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwNgogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZSkKICAgIGR1cAogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDgKICAgIC8vIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgcHVzaGludHMgMjAgNDAgNTAgNjAgNzAgODAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDctMzM4CiAgICAvLyBtYXRjaCByb2xlOgogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgLy8gICAgICAgICByZXR1cm4gdHlwLlJvbGVWYWxpZGl0eSgKICAgIC8vICAgICAgICAgICAgIHJvbGVfdmFsaWRpdHlfc3RhcnQ9VUludDY0KDApLCByb2xlX3ZhbGlkaXR5X2VuZD1VSW50NjQoMCkKICAgIC8vICAgICAgICAgKQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5hdXRob3JpdHksIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5vYnNlcnZlciwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5vYnNlcnZlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBfOgogICAgLy8gICAgICAgICBvcC5lcnIoZXJyLklOVkFMSURfUk9MRSkKICAgIHVuY292ZXIgNgogICAgbWF0Y2ggcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8wQDIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8xQDMgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8yQDQgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8zQDUgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV80QDYgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV81QDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzgKICAgIC8vIG9wLmVycihlcnIuSU5WQUxJRF9ST0xFKQogICAgZXJyIC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzVANzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzQKICAgIC8vIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMjQgLy8gMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzMzLTMzNQogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMzNgogICAgLy8gcmV0dXJuIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzRANjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjkKICAgIC8vIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDIxIC8vIDB4NTIyMzQxNzU3NDY4NmY3MjY5NzQ3OTIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI4LTMzMAogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzEKICAgIC8vIHJldHVybiBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzNANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjQKICAgIC8vIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAzMiAvLyAweDUyMjM1NDcyNzU3Mzc0NjU2NTIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzIzLTMyNQogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI2CiAgICAvLyByZXR1cm4gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMkA0OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxOQogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAyMiAvLyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzE4LTMyMAogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMQogICAgLy8gcmV0dXJuIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8xQDM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzE0CiAgICAvLyBzZWxmLmFjY291bnRfbWFuYWdlciwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAyMyAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTMtMzE1CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxNgogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMEAyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwOS0zMTEKICAgIC8vIHJldHVybiB0eXAuUm9sZVZhbGlkaXR5KAogICAgLy8gICAgIHJvbGVfdmFsaWRpdHlfc3RhcnQ9VUludDY0KDApLCByb2xlX3ZhbGlkaXR5X2VuZD1VSW50NjQoMCkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLl9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IHZvaWQ6Cl9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI2CiAgICAvLyBkZWYgX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQoc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjgKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkLCBlcnIuU1VTUEVOREVECiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCAzODQKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIFN1c3BlbmRlZCBvcGVyYXRpb25zCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5fc2V0dGxlX3Bvc2l0aW9uKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NCwgdWludDY0Ogpfc2V0dGxlX3Bvc2l0aW9uOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjQ0CiAgICAvLyBkZWYgX3NldHRsZV9wb3NpdGlvbihzZWxmLCBob2xkaW5nX2FkZHJlc3M6IEFjY291bnQpIC0+IHR1cGxlW1VJbnQ2NCwgVUludDY0XToKICAgIHByb3RvIDEgMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo2MQogICAgLy8gcG9zaXRpb24gPSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jb3B5KCkKICAgIGR1cAogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NjMtNjUKICAgIC8vICMgQ29tcHV0ZSB0aGUgaW5jcmVtZW50YWwgcGVyLXVuaXQgZml4ZWQtcG9pbnQgaW50ZXJlc3QgYW5kIHByaW5jaXBhbCBhY2NydWVkCiAgICAvLyAjIHNpbmNlIHRoaXMgYWNjb3VudCdzIGxhc3QgY2hlY2twb2ludC4KICAgIC8vIGludGVyZXN0X2RlbHRhID0gc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IC0gcG9zaXRpb24uaW50ZXJlc3RfY2hlY2twb2ludAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggZXhpc3RzCiAgICBkaWcgMQogICAgcHVzaGludCA1NwogICAgZXh0cmFjdF91aW50NjQKICAgIC0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo2NwogICAgLy8gc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCAtIHBvc2l0aW9uLnByaW5jaXBhbF9jaGVja3BvaW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTcgLy8gImN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IGV4aXN0cwogICAgZGlnIDIKICAgIHB1c2hpbnQgNjUKICAgIGV4dHJhY3RfdWludDY0CiAgICAtCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzMKICAgIC8vIGludGVyZXN0X2RlbHRhLCBwb3NpdGlvbi51bml0cywgc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgZGlnIDIKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3MC03NAogICAgLy8gIyBDb252ZXJ0IHRoZSBwZXItdW5pdCBmaXhlZC1wb2ludCBkZWx0YXMgaW50byBhYnNvbHV0ZSBjbGFpbWFibGUgYW1vdW50cwogICAgLy8gIyB1c2luZyB0aGUgYWNjb3VudCdzIGFjdGl2ZSB1bml0cy4KICAgIC8vIGNsYWltYWJsZV9pbnRlcmVzdCA9IHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIGludGVyZXN0X2RlbHRhLCBwb3NpdGlvbi51bml0cywgc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgLy8gKQogICAgdW5jb3ZlciAzCiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojc2CiAgICAvLyBwcmluY2lwYWxfZGVsdGEsIHBvc2l0aW9uLnVuaXRzLCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzUtNzcKICAgIC8vIGNsYWltYWJsZV9wcmluY2lwYWwgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBwcmluY2lwYWxfZGVsdGEsIHBvc2l0aW9uLnVuaXRzLCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICAvLyApCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojc5LTgxCiAgICAvLyAjIEFjY3J1ZSB0aGUgY2xhaW1hYmxlIGFtb3VudHMgdG8gdGhlIGFjY291bnQgcG9zaXRpb24gYW5kIG1ha2UgdGhlbSBhdmFpbGFibGUKICAgIC8vICMgZm9yIHdpdGhkcmF3YWwuCiAgICAvLyBwb3NpdGlvbi5jbGFpbWFibGVfaW50ZXJlc3QgKz0gY2xhaW1hYmxlX2ludGVyZXN0CiAgICBkaWcgMgogICAgcHVzaGludCA3MwogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICArCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIHN3YXAKICAgIHJlcGxhY2UyIDczCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6ODIKICAgIC8vIHBvc2l0aW9uLmNsYWltYWJsZV9wcmluY2lwYWwgKz0gY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgZHVwCiAgICBwdXNoaW50IDgxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDIKICAgICsKICAgIGl0b2IKICAgIHJlcGxhY2UyIDgxCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6ODQtODYKICAgIC8vICMgQWR2YW5jZSB0aGUgYWNjb3VudCdzIHBlci11bml0IGZpeGVkLXBvaW50IGNoZWNrcG9pbnRzIHRvIHRoZSBjdXJyZW50IGdsb2JhbAogICAgLy8gIyBwZXItdW5pdCBmaXhlZC1wb2ludCBnbG9iYWwgaW5kaWNlcy4KICAgIC8vIHBvc2l0aW9uLmludGVyZXN0X2NoZWNrcG9pbnQgPSBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IGV4aXN0cwogICAgaXRvYgogICAgcmVwbGFjZTIgNTcKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo4NwogICAgLy8gcG9zaXRpb24ucHJpbmNpcGFsX2NoZWNrcG9pbnQgPSBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTcgLy8gImN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IGV4aXN0cwogICAgaXRvYgogICAgcmVwbGFjZTIgNjUKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo4OS05MAogICAgLy8gIyBBZHZhbmNlIHRoZSBhY2NvdW50J3MgZXZlbnQgY3Vyc29yIHRvIHRoZSBjdXJyZW50IGdsb2JhbCBldmVudCBjdXJzb3IuCiAgICAvLyBwb3NpdGlvbi5zZXR0bGVkX2N1cnNvciA9IHNlbGYuZXZlbnRfY3Vyc29yCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGl0b2IKICAgIHJlcGxhY2UyIDQ5CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6OTItOTQKICAgIC8vICMgVXBkYXRlIHRoZSBhY2NvdW50IHBvc2l0aW9uIGFuZCByZXR1cm4gdGhlIG5ld2x5IGFjY3J1ZWQgY2xhaW1hYmxlIGFtb3VudHMKICAgIC8vICMgYWRkZWQgdG8gdGhlIHRvdGFsIHBvc2l0aW9uJ3MgY2xhaW1hYmxlIGFtb3VudHMuCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHBvc2l0aW9uLmNvcHkoKQogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6OTUKICAgIC8vIHJldHVybiBjbGFpbWFibGVfaW50ZXJlc3QsIGNsYWltYWJsZV9wcmluY2lwYWwKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IHZvaWQ6Cl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojk3CiAgICAvLyBkZWYgX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQoc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQyMwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDAKICAgIC8vIGlmIHNlbGYuX3N0YXR1c19pc19wZW5kaW5nX2llZCgpOgogICAgYnogX2Vuc3VyZV91bml0c19hY3RpdmF0ZWRfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTAxCiAgICAvLyByZXR1cm4KICAgIHJldHN1YgoKX2Vuc3VyZV91bml0c19hY3RpdmF0ZWRfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwMwogICAgLy8gcG9zaXRpb24gPSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAyCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDQKICAgIC8vIGlmIHBvc2l0aW9uLnJlc2VydmVkX3VuaXRzID09IFVJbnQ2NCgwKToKICAgIHB1c2hpbnQgNDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgYm56IF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkX2FmdGVyX2lmX2Vsc2VANAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwNQogICAgLy8gcmV0dXJuCiAgICByZXRzdWIKCl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkX2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDgKICAgIC8vIHBvc2l0aW9uLnVuaXRzICs9IGFjdGl2YXRlZF91bml0cwogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMwogICAgKwogICAgaXRvYgogICAgcmVwbGFjZTIgMzIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDkKICAgIC8vIHBvc2l0aW9uLnJlc2VydmVkX3VuaXRzID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgaXRvYgogICAgcmVwbGFjZTIgNDAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTAKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gcG9zaXRpb24uY29weSgpCiAgICBmcmFtZV9kaWcgMgogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExMQogICAgLy8gYXNzZXJ0IHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPj0gYWN0aXZhdGVkX3VuaXRzLCBlcnIuT1ZFUl9ESVNUUklCVVRJT04KICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICBkdXAKICAgIGRpZyAyCiAgICA+PQogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCByZW1haW5pbmcgRC1BU0EgdW5pdHMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTIKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgLT0gYWN0aXZhdGVkX3VuaXRzCiAgICBzd2FwCiAgICAtCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX3NjYWxlZF9tdWxfZGl2KG11bHRpcGxpY2FuZDogdWludDY0LCBtdWx0aXBsaWVyOiB1aW50NjQsIGRpdmlzb3I6IHVpbnQ2NCkgLT4gdWludDY0Ogpfc2NhbGVkX211bF9kaXY6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTMtMTU1CiAgICAvLyBkZWYgX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIHNlbGYsIG11bHRpcGxpY2FuZDogVUludDY0LCBtdWx0aXBsaWVyOiBVSW50NjQsIGRpdmlzb3I6IFVJbnQ2NAogICAgLy8gKSAtPiBVSW50NjQ6CiAgICBwcm90byAzIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE1NwogICAgLy8gaWYgbXVsdGlwbGljYW5kID09IFVJbnQ2NCgwKSBvciBtdWx0aXBsaWVyID09IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMwogICAgYnogX3NjYWxlZF9tdWxfZGl2X2lmX2JvZHlAMgogICAgZnJhbWVfZGlnIC0yCiAgICBibnogX3NjYWxlZF9tdWxfZGl2X2FmdGVyX2lmX2Vsc2VAMwoKX3NjYWxlZF9tdWxfZGl2X2lmX2JvZHlAMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE1OAogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKX3NjYWxlZF9tdWxfZGl2X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE1OQogICAgLy8gaGlnaCwgbG93ID0gb3AubXVsdyhtdWx0aXBsaWNhbmQsIG11bHRpcGxpZXIpCiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMgogICAgbXVsdwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTYwCiAgICAvLyByZXR1cm4gb3AuZGl2dyhoaWdoLCBsb3csIGRpdmlzb3IpCiAgICBmcmFtZV9kaWcgLTEKICAgIGRpdncKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9hbW91bnRfdG9faW5kZXhfZGVsdGEoYW1vdW50OiB1aW50NjQpIC0+IHVpbnQ2NDoKX2Ftb3VudF90b19pbmRleF9kZWx0YToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2MgogICAgLy8gZGVmIF9hbW91bnRfdG9faW5kZXhfZGVsdGEoc2VsZiwgYW1vdW50OiBVSW50NjQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTY0CiAgICAvLyBpZiBhbW91bnQgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0xCiAgICBibnogX2Ftb3VudF90b19pbmRleF9kZWx0YV9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2NQogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKX2Ftb3VudF90b19pbmRleF9kZWx0YV9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjYKICAgIC8vIGFzc2VydCBzZWxmLnRvdGFsX3VuaXRzID4gVUludDY0KDApLCBlcnIuTk9fVU5JVFMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICBkdXAKICAgIGFzc2VydCAvLyBObyBELUFTQSB1bml0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTY3CiAgICAvLyByZXR1cm4gc2VsZi5fc2NhbGVkX211bF9kaXYoYW1vdW50LCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLCBzZWxmLnRvdGFsX3VuaXRzKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5faW5kZXhfZGVsdGFfdG9fYW1vdW50KGluZGV4X2RlbHRhOiB1aW50NjQpIC0+IHVpbnQ2NDoKX2luZGV4X2RlbHRhX3RvX2Ftb3VudDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2OQogICAgLy8gZGVmIF9pbmRleF9kZWx0YV90b19hbW91bnQoc2VsZiwgaW5kZXhfZGVsdGE6IFVJbnQ2NCkgLT4gVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNzYKICAgIC8vIGlmIGluZGV4X2RlbHRhID09IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMQogICAgYm56IF9pbmRleF9kZWx0YV90b19hbW91bnRfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNzcKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9pbmRleF9kZWx0YV90b19hbW91bnRfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTc5CiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE4MQogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE3OC0xODIKICAgIC8vIHJldHVybiBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLnRvdGFsX3VuaXRzLAogICAgLy8gICAgIGluZGV4X2RlbHRhLAogICAgLy8gICAgIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZ2V0X3NjaGVkdWxlX2VudHJ5KGV2ZW50X2lkOiB1aW50NjQpIC0+IGJ5dGVzOgpfZ2V0X3NjaGVkdWxlX2VudHJ5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjAyCiAgICAvLyBkZWYgX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLCBldmVudF9pZDogVUludDY0KSAtPiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeToKICAgIHByb3RvIDEgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjA0CiAgICAvLyBhc3NlcnQgZXZlbnRfaWQgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LCBlcnIuSU5WQUxJRF9FVkVOVF9JRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICA+CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBpZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTkwCiAgICAvLyByZXR1cm4gZXZlbnRfaWQgLy8gVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMTYKICAgIC8KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIwNgogICAgLy8gYXNzZXJ0IHBhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBpdG9iCiAgICBieXRlYyAzMSAvLyAweDUzMjMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE5NAogICAgLy8gcmV0dXJuIGV2ZW50X2lkICUgVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMTYKICAgICUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIwOQogICAgLy8gYXNzZXJ0IG9mZnNldCA8IHBhZ2UubGVuZ3RoLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIHB1c2hpbnQgMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGRpZyAxCiAgICA+CiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMTAKICAgIC8vIHJldHVybiBwYWdlW29mZnNldF0uY29weSgpCiAgICBwdXNoaW50IDY1CiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIHB1c2hpbnQgNjUKICAgIGJveF9leHRyYWN0CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoY29udHJhY3RfdHlwZTogdWludDY0LCBldmVudF90eXBlOiB1aW50NjQpIC0+IHZvaWQ6Cl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxMy0zMTUKICAgIC8vIGRlZiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgc2VsZiwgY29udHJhY3RfdHlwZTogVUludDY0LCBldmVudF90eXBlOiBVSW50NjQKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU0LTI1NQogICAgLy8gIyBDaGVjayBjb21tb24gZXZlbnRzIGZpcnN0CiAgICAvLyBpZiBldmVudF90eXBlIGluIGNvbW1vbl9ldmVudHM6CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI0NwogICAgLy8gVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI0OAogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUCksCiAgICBpbnRjXzIgLy8gOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU0LTI1NQogICAgLy8gIyBDaGVjayBjb21tb24gZXZlbnRzIGZpcnN0CiAgICAvLyBpZiBldmVudF90eXBlIGluIGNvbW1vbl9ldmVudHM6CiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjQ5CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX01EKSwKICAgIHB1c2hpbnQgMTkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1MAogICAgLy8gVUludDY0KGVudW1zLkVWVF9SUiksCiAgICBwdXNoaW50IDEyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTEKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIHB1c2hpbnQgMTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDcKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDY6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTYKICAgIC8vIHJldHVybiBUcnVlCiAgICBpbnRjXzEgLy8gMQoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIHJldHN1YgoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1OC0yNTkKICAgIC8vICMgQ29udHJhY3Qtc3BlY2lmaWMgYWRkaXRpb25hbCBldmVudHMKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX1BBTSk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNjAtMjYxCiAgICAvLyAjIFBBTSBvbmx5IHN1cHBvcnRzIGNvbW1vbiBldmVudHMKICAgIC8vIHJldHVybiBGYWxzZQogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2MwogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfTEFNKSBvciBjb250cmFjdF90eXBlID09IFVJbnQ2NCgKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAzCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjYzLTI2NQogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfTEFNKSBvciBjb250cmFjdF90eXBlID09IFVJbnQ2NCgKICAgIC8vICAgICBlbnVtcy5DVF9OQU0KICAgIC8vICk6CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlAMTEKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAyCiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMTYKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDExOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjY2LTI3MAogICAgLy8gIyBMQU0vTkFNIGFkZDogUFIsIElQQ0IKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNjgKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNjYtMjcwCiAgICAvLyAjIExBTS9OQU0gYWRkOiBQUiwgSVBDQgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMTMKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjY5CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgcHVzaGludCAxOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjY2LTI3MAogICAgLy8gIyBMQU0vTkFNIGFkZDogUFIsIElQQ0IKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gKQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDE0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDEzOgogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMTQ6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAxNjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3MgogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKToKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAyMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjczLTI3OAogICAgLy8gIyBBTk4gYWRkczogUFIsIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzUKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzMtMjc4CiAgICAvLyAjIEFOTiBhZGRzOiBQUiwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjAKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjc2CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgcHVzaGludCAxOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjczLTI3OAogICAgLy8gIyBBTk4gYWRkczogUFIsIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDIwCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3NwogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzMtMjc4CiAgICAvLyAjIEFOTiBhZGRzOiBQUiwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMjEKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjA6CiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF9mYWxzZUAyMToKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDIzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjgwCiAgICAvLyBpZiBjb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9MQVgpOgogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDQKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAzMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjgxLTI4NwogICAgLy8gIyBMQVggYWRkczogUFIsIFBJLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjgzCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjgxLTI4NwogICAgLy8gIyBMQVggYWRkczogUFIsIFBJLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyOAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODQKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgcHVzaGludCA0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODEtMjg3CiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDI4CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4NQogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIHB1c2hpbnQgMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MS0yODcKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjgKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjg2CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICBwdXNoaW50IDUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MS0yODcKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMjkKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjg6CiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF9mYWxzZUAyOToKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDMxOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjg5CiAgICAvLyBpZiBjb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9DTE0pOgogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDUKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAzMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjkwLTI5MQogICAgLy8gIyBDTE0gYWRkczogUFIKICAgIC8vIHJldHVybiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMzM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyOTMKICAgIC8vIHJldHVybiBGYWxzZQogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9pc19keW5hbWljX2FubnVpdHkoKSAtPiB1aW50NjQ6Cl9pc19keW5hbWljX2FubnVpdHk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzUKICAgIC8vIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMzNS0zMzYKICAgIC8vIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKQogICAgLy8gYW5kIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgYnogX2lzX2R5bmFtaWNfYW5udWl0eV9ib29sX2ZhbHNlQDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMzNgogICAgLy8gYW5kIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDM0IC8vICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24gZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzUtMzM2CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIC8vIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGJ6IF9pc19keW5hbWljX2FubnVpdHlfYm9vbF9mYWxzZUAzCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM0LTMzNwogICAgLy8gcmV0dXJuICgKICAgIC8vICAgICBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIC8vICAgICBhbmQgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICAvLyApCiAgICByZXRzdWIKCl9pc19keW5hbWljX2FubnVpdHlfYm9vbF9mYWxzZUAzOgogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMzNC0zMzcKICAgIC8vIHJldHVybiAoCiAgICAvLyAgICAgc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICAvLyAgICAgYW5kIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgLy8gKQogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnk6IGJ5dGVzKSAtPiB1aW50NjQsIGJ5dGVzOgpfZW50cnlfaW50ZXJlc3Rfc2VnbWVudDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM4MAogICAgLy8gZGVmIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KHNlbGYsIGVudHJ5OiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSkgLT4gVUludDY0OgogICAgcHJvdG8gMSAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozODkKICAgIC8vIGVudHJ5LmFjY3J1YWxfZmFjdG9yID09IFVJbnQ2NCgwKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDE3CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozODktMzkxCiAgICAvLyBlbnRyeS5hY2NydWFsX2ZhY3RvciA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID09IFVJbnQ2NCgwKQogICAgLy8gb3Igc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID09IFVJbnQ2NCgwKQogICAgYnogX2VudHJ5X2ludGVyZXN0X3NlZ21lbnRfaWZfYm9keUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozOTAKICAgIC8vIG9yIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID09IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozODktMzkxCiAgICAvLyBlbnRyeS5hY2NydWFsX2ZhY3RvciA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID09IFVJbnQ2NCgwKQogICAgLy8gb3Igc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID09IFVJbnQ2NCgwKQogICAgYnogX2VudHJ5X2ludGVyZXN0X3NlZ21lbnRfaWZfYm9keUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozOTEKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozODktMzkxCiAgICAvLyBlbnRyeS5hY2NydWFsX2ZhY3RvciA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID09IFVJbnQ2NCgwKQogICAgLy8gb3Igc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID09IFVJbnQ2NCgwKQogICAgYm56IF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2FmdGVyX2lmX2Vsc2VANAoKX2VudHJ5X2ludGVyZXN0X3NlZ21lbnRfaWZfYm9keUAzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzkzCiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfZGlnIC0xCiAgICB1bmNvdmVyIDIKICAgIHJldHN1YgoKX2VudHJ5X2ludGVyZXN0X3NlZ21lbnRfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzk1CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzk2CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzk3CiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzk0LTM5OAogICAgLy8gYWNjcnVlZCA9IHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSwKICAgIC8vICAgICBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQwMgogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5OS00MDMKICAgIC8vIHJldHVybiBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBhY2NydWVkLAogICAgLy8gICAgIGVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMAogICAgc3dhcAogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIGZyYW1lX2RpZyAtMQogICAgdW5jb3ZlciAyCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZGlzY291bnRfYW5udWl0eV9mYWN0b3IoZGlzY291bnRfZmFjdG9yOiB1aW50NjQsIHJlZGVtcHRpb25fZmFjdG9yOiB1aW50NjQpIC0+IHVpbnQ2NDoKX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDYyLTQ2NgogICAgLy8gZGVmIF9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcigKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgIGRpc2NvdW50X2ZhY3RvcjogVUludDY0LAogICAgLy8gICAgIHJlZGVtcHRpb25fZmFjdG9yOiBVSW50NjQsCiAgICAvLyApIC0+IFVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDY4CiAgICAvLyBpZiByZWRlbXB0aW9uX2ZhY3RvciA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGJueiBfZGlzY291bnRfYW5udWl0eV9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NjkKICAgIC8vIHJldHVybiBkaXNjb3VudF9mYWN0b3IKICAgIGZyYW1lX2RpZyAtMgogICAgcmV0c3ViCgpfZGlzY291bnRfYW5udWl0eV9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDcwCiAgICAvLyBwZXJpb2RfcmF0ZSA9IHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgKyBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3MQogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3MC00NzQKICAgIC8vIHBlcmlvZF9yYXRlID0gc2VsZi5maXhlZF9wb2ludF9zY2FsZSArIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIHJlZGVtcHRpb25fZmFjdG9yLAogICAgLy8gICAgIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgKwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDc1CiAgICAvLyBhc3NlcnQgcGVyaW9kX3JhdGUgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZHVwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzgKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzYtNDgwCiAgICAvLyByZXR1cm4gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgZGlzY291bnRfZmFjdG9yLAogICAgLy8gICAgIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICAvLyAgICAgcGVyaW9kX3JhdGUsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeShlbnRyeTogYnl0ZXMsIHBheWxvYWQ6IGJ5dGVzKSAtPiBieXRlcywgYnl0ZXM6Cl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYxMy02MTUKICAgIC8vIGRlZiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkoCiAgICAvLyAgICAgc2VsZiwgZW50cnk6IHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5LCBwYXlsb2FkOiB0eXAuT2JzZXJ2ZWRFdmVudFJlcXVlc3QKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDIgMgogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MjMKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF9pZCA9PSBzZWxmLmV2ZW50X2N1cnNvciwgZXJyLklOVkFMSURfRVZFTlRfQ1VSU09SCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgY3Vyc29yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MjQKICAgIC8vIGFzc2VydCBlbnRyeS5zY2hlZHVsZWRfdGltZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwgZXJyLk5PX0RVRV9DQVNIRkxPVwogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA8PQogICAgYXNzZXJ0IC8vIE5vIGR1ZSBjYXNoZmxvdyB0byBwYXkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYyNgogICAgLy8gZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjI3CiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfSUVEKToKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgZHVwCiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjI4LTYzMAogICAgLy8gIyBJRUQgZmluYWxpemVzIGlzc3VhbmNlOiByZXNlcnZlZCB1bml0cyBiZWNvbWUgYWN0aXZhdGFibGUgYW5kIHRoZQogICAgLy8gIyBzY2hlZHVsZSdzIGluaXRpYWwgY29udHJhY3R1YWwgc3RhdGUgYmVjb21lcyBsaXZlLgogICAgLy8gYXNzZXJ0IHNlbGYuX3N0YXR1c19pc19wZW5kaW5nX2llZCgpLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYzMgogICAgLy8gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCA9PSBzZWxmLnRvdGFsX3VuaXRzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzEtNjMzCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPT0gc2VsZi50b3RhbF91bml0cwogICAgLy8gKSwgZXJyLlBSSU1BUllfRElTVFJJQlVUSU9OX0lOQ09NUExFVEUKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBub3QgY29tcGxldGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYzNAogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzUKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYzNgogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPSBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZQogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYzNwogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ID0gVUludDY0KDApCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzgKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IGVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA0MQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYzOQogICAgLy8gc2VsZi5ldmVudF9jdXJzb3IgKz0gVUludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjQwCiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbnVtcy5TVEFUVVNfQUNUSVZFKQogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgcHVzaGludCAxMDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NTEKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwgZXJyLk5PVF9FVlRfSUVECiAgICBmcmFtZV9kaWcgMTEKICAgIGFzc2VydCAvLyBOb3QgSUVEIGV2ZW50CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NTIKICAgIC8vIHJldHVybiBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjQxLTY0NQogICAgLy8gc2VsZi5fZW1pdF9leGVjdXRpb25fZXZlbnQoCiAgICAvLyAgICAgZW50cnk9ZW50cnksCiAgICAvLyAgICAgcGF5b2ZmPXNlbGYuX2VudHJ5X2llZF9hbW91bnQoZW50cnkpLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjQ0CiAgICAvLyBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjQxLTY0NQogICAgLy8gc2VsZi5fZW1pdF9leGVjdXRpb25fZXZlbnQoCiAgICAvLyAgICAgZW50cnk9ZW50cnksCiAgICAvLyAgICAgcGF5b2ZmPXNlbGYuX2VudHJ5X2llZF9hbW91bnQoZW50cnkpLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGNhbGxzdWIgX2VtaXRfZXhlY3V0aW9uX2V2ZW50CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgLTIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0NgogICAgLy8gcmV0dXJuCiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2J1cnkgMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQ3CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuX3N0YXR1c19pc19wZW5kaW5nX2llZCgpLCBlcnIuUEVORElOR19JRUQKICAgICEKICAgIGFzc2VydCAvLyBJRUQgbm90IHlldCBleGVjdXRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjQ5CiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgKz0gc2VsZi5fZW50cnlfaW50ZXJlc3Rfc2VnbWVudChlbnRyeSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQKICAgIGZyYW1lX2J1cnkgLTIKICAgICsKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjUxCiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUlIpOgogICAgZnJhbWVfZGlnIDEwCiAgICBwdXNoaW50IDEyCiAgICA9PQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAxMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjU1CiAgICAvLyBwYXlsb2FkLm9ic2VydmVkX3JhdGUsCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NTYKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9tdWx0aXBsaWVyLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDM2IC8vICJyYXRlX3Jlc2V0X211bHRpcGxpZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9tdWx0aXBsaWVyIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjU3CiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjUyLTY1OAogICAgLy8gIyBSUiBkZXJpdmVzIHRoZSBuZXh0IHJhdGUgZnJvbSBhbiBvYnNlcnZlZCBvcmFjbGUgdmFsdWUgcGx1cyB0aGUKICAgIC8vICMgY29udHJhY3Qgc3ByZWFkIC8gbXVsdGlwbGllciB0ZXJtcywgdGhlbiBlbmZvcmNlcyBmbG9vciBhbmQgY2FwLgogICAgLy8gb2JzZXJ2ZWRfcmF0ZSA9IHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIHBheWxvYWQub2JzZXJ2ZWRfcmF0ZSwKICAgIC8vICAgICBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2MAogICAgLy8gb2JzZXJ2ZWRfcmF0ZSArIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzNSAvLyAicmF0ZV9yZXNldF9zcHJlYWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQgZXhpc3RzCiAgICArCiAgICBmcmFtZV9idXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjczNAogICAgLy8gaWYgc2VsZi5oYXNfcmF0ZV9yZXNldF9mbG9vciBhbmQgcmF0ZSA8IHNlbGYucmF0ZV9yZXNldF9mbG9vcjoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzOCAvLyAiaGFzX3JhdGVfcmVzZXRfZmxvb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgZXhpc3RzCiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1NQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI5IC8vICJyYXRlX3Jlc2V0X2Zsb29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfZmxvb3IgZXhpc3RzCiAgICBmcmFtZV9kaWcgNgogICAgPgogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjczNQogICAgLy8gcmF0ZSA9IHNlbGYucmF0ZV9yZXNldF9mbG9vcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI5IC8vICJyYXRlX3Jlc2V0X2Zsb29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgNgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9mbG9vciBleGlzdHMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzM2CiAgICAvLyBpZiBzZWxmLmhhc19yYXRlX3Jlc2V0X2NhcCBhbmQgcmF0ZSA+IHNlbGYucmF0ZV9yZXNldF9jYXA6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzkgLy8gImhhc19yYXRlX3Jlc2V0X2NhcCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgZXhpc3RzCiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1OAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDMwIC8vICJyYXRlX3Jlc2V0X2NhcCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X2NhcCBleGlzdHMKICAgIGZyYW1lX2RpZyA2CiAgICA8CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1OAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzM3CiAgICAvLyByYXRlID0gc2VsZi5yYXRlX3Jlc2V0X2NhcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDMwIC8vICJyYXRlX3Jlc2V0X2NhcCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDYKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfY2FwIGV4aXN0cwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NTkKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gc2VsZi5fY2xhbXBfcmF0ZSgKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1OS02NjEKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gc2VsZi5fY2xhbXBfcmF0ZSgKICAgIC8vICAgICBvYnNlcnZlZF9yYXRlICsgc2VsZi5yYXRlX3Jlc2V0X3NwcmVhZAogICAgLy8gKQogICAgZnJhbWVfZGlnIDYKICAgIGFwcF9nbG9iYWxfcHV0CgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAxODoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY3MQogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1BJKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCA0CiAgICA9PQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAyMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjcyCiAgICAvLyBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9IGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY3MwogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMjM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzgKICAgIC8vIGlmIHNlbGYuX2lzX2R5bmFtaWNfYW5udWl0eSgpOgogICAgY2FsbHN1YiBfaXNfZHluYW1pY19hbm51aXR5CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDI5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzkKICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QUkYpOgogICAgZnJhbWVfZGlnIDEwCiAgICBwdXNoaW50IDUKICAgID09CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAzMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDkwCiAgICAvLyBkaXNjb3VudF9mYWN0b3IgPSBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5MQogICAgLy8gZGVub21pbmF0b3IgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5MgogICAgLy8gc2tpcF9maXJzdF9yZWRlbXB0aW9uID0gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5NAogICAgLy8gaWYgZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAyNQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgZnJhbWVfYnVyeSA4CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAzNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDk1LTQ5OQogICAgLy8gIyBBbiBpbml0aWFsIFBSRiBtYXkgZGVzY3JpYmUgdGhlIGZpcnN0IHJlZGVtcHRpb24gcGVyaW9kIGRpcmVjdGx5LgogICAgLy8gZGlzY291bnRfZmFjdG9yID0gc2VsZi5fZGlzY291bnRfYW5udWl0eV9mYWN0b3IoCiAgICAvLyAgICAgZGlzY291bnRfZmFjdG9yLAogICAgLy8gICAgIGVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDgKICAgIGNhbGxzdWIgX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTAxCiAgICAvLyBza2lwX2ZpcnN0X3JlZGVtcHRpb24gPSBUcnVlCiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfYnVyeSA3CiAgICBmcmFtZV9idXJ5IDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDM1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTAzCiAgICAvLyBmdXR1cmVfZXZlbnRfaWQgPSBzZWxmLmV2ZW50X2N1cnNvciArIFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfd2hpbGVfdG9wQDM2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA0CiAgICAvLyB3aGlsZSBmdXR1cmVfZXZlbnRfaWQgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgZnJhbWVfZGlnIDMKICAgID4KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl93aGlsZUA0OAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA1CiAgICAvLyBmdXR1cmVfZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoZnV0dXJlX2V2ZW50X2lkKQogICAgZnJhbWVfZGlnIDMKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwNgogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPSBmdXR1cmVfZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MDctNTA4CiAgICAvLyAjIE9ubHkgcmVkZW1wdGlvbi1iZWFyaW5nIGV2ZW50cyBjb250cmlidXRlIHRvIHRoZSBhbm51aXR5IGRlbm9taW5hdG9yLgogICAgLy8gaXNfcmVkZW1wdGlvbl9ldmVudCA9IGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpIG9yICgKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwNy01MTEKICAgIC8vICMgT25seSByZWRlbXB0aW9uLWJlYXJpbmcgZXZlbnRzIGNvbnRyaWJ1dGUgdG8gdGhlIGFubnVpdHkgZGVub21pbmF0b3IuCiAgICAvLyBpc19yZWRlbXB0aW9uX2V2ZW50ID0gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QUikgb3IgKAogICAgLy8gICAgIGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfTUQpCiAgICAvLyAgICAgYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICAvLyApCiAgICBibnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfdHJ1ZUA0MAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA5CiAgICAvLyBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgZnJhbWVfZGlnIDQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MDktNTEwCiAgICAvLyBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgLy8gYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF9mYWxzZUA0MQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTEwCiAgICAvLyBhbmQgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IgPiBVSW50NjQoMCkKICAgIGZyYW1lX2RpZyAwCiAgICBwdXNoaW50IDI1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA5LTUxMAogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCkKICAgIC8vIGFuZCBmdXR1cmVfZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX3RydWVANDA6CiAgICBpbnRjXzEgLy8gMQoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfbWVyZ2VANDI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTIKICAgIC8vIGlmIGlzX3JlZGVtcHRpb25fZXZlbnQ6CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA0NwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTEzCiAgICAvLyBpZiBza2lwX2ZpcnN0X3JlZGVtcHRpb246CiAgICBmcmFtZV9kaWcgNwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUA0NQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTE0CiAgICAvLyBza2lwX2ZpcnN0X3JlZGVtcHRpb24gPSBGYWxzZQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgNwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANDc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjEKICAgIC8vIGZ1dHVyZV9ldmVudF9pZCArPSBVSW50NjQoMSkKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV93aGlsZV90b3BAMzYKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlANDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTgKICAgIC8vIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZnJhbWVfZGlnIDAKICAgIHB1c2hpbnQgMjUKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTYtNTE5CiAgICAvLyBkaXNjb3VudF9mYWN0b3IgPSBzZWxmLl9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcigKICAgIC8vICAgICBkaXNjb3VudF9mYWN0b3IsCiAgICAvLyAgICAgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMgogICAgc3dhcAogICAgY2FsbHN1YiBfZGlzY291bnRfYW5udWl0eV9mYWN0b3IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjAKICAgIC8vIGRlbm9taW5hdG9yICs9IGRpc2NvdW50X2ZhY3RvcgogICAgZnJhbWVfZGlnIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA0NwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDE6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF9tZXJnZUA0MgoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX3doaWxlQDQ4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTIzCiAgICAvLyBhc3NlcnQgZGVub21pbmF0b3IgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZnJhbWVfZGlnIDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUyNAogICAgLy8gbnVtZXJhdG9yID0gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTI1CiAgICAvLyBpZiBlbnRyeS5mbGFncyAmIFVJbnQ2NChlbnVtcy5GTEFHX0lOSVRJQUxfUFJGKSA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNTcKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gOAogICAgJgogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDUwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjYtNTI3CiAgICAvLyAjIFN1YnNlcXVlbnQgUFJGIGV2ZW50cyBhbW9ydGl6ZSBib3RoIHByaW5jaXBhbCBhbmQgYWxyZWFkeSBhY2NydWVkIGNhcnJ5LgogICAgLy8gbnVtZXJhdG9yICs9IHNlbGYuYWNjcnVlZF9pbnRlcmVzdAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgICsKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDUwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTMwCiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTI4LTUzMgogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIG51bWVyYXRvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gICAgIGRlbm9taW5hdG9yLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDEKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODAKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IHNlbGYuX3JlY2FsY3VsYXRlX2FubnVpdHlfcGF5bWVudCgKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjgwLTY4MgogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gc2VsZi5fcmVjYWxjdWxhdGVfYW5udWl0eV9wYXltZW50KAogICAgLy8gICAgIGVudHJ5CiAgICAvLyApCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMzA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODUKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4Ni02OTAKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1VSW50NjQoMCksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODgKICAgIC8vIHBheW9mZj1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njg5CiAgICAvLyBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4Ni02OTAKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1VSW50NjQoMCksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgY2FsbHN1YiBfZW1pdF9leGVjdXRpb25fZXZlbnQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDI5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njg0CiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDMwCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDIwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc0CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9JUENCKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCAxOAogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDIzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzUtNjc2CiAgICAvLyAjIElQQ0Iga2VlcHMgcHJpbmNpcGFsIHVuY2hhbmdlZCBhbmQgb25seSByZXNldHMgdGhlIGludGVyZXN0IGJhc2UuCiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIGIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMjMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMTA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjIKICAgIC8vIGVsaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1JSRik6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgMTEKICAgID09CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDE0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjMKICAgIC8vIG5leHRfcmF0ZSA9IGVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY0CiAgICAvLyBpZiBuZXh0X3JhdGUgPT0gVUludDY0KDApOgogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDEzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjUKICAgIC8vIG5leHRfcmF0ZSA9IHNlbGYucmF0ZV9yZXNldF9uZXh0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzcgLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDUKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfbmV4dCBleGlzdHMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY2CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IG5leHRfcmF0ZQogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgZnJhbWVfZGlnIDUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDE0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY4CiAgICAvLyBpZiBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSAhPSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgOQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2OQogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPSBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZQogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgZnJhbWVfZGlnIDkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KGVudHJ5OiBieXRlcywgcGF5b2ZmOiB1aW50NjQsIHNldHRsZWRfYW1vdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpfZW1pdF9leGVjdXRpb25fZXZlbnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OTYtNzAyCiAgICAvLyBkZWYgX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgKiwKICAgIC8vICAgICBlbnRyeTogdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnksCiAgICAvLyAgICAgcGF5b2ZmOiBVSW50NjQsCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ6IFVJbnQ2NCwKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDMgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzA2CiAgICAvLyBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25JRAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzA3CiAgICAvLyBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIGZyYW1lX2RpZyAtMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MDgKICAgIC8vIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIGZyYW1lX2RpZyAtMwogICAgZXh0cmFjdCA4IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcwOQogICAgLy8gc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICBmcmFtZV9kaWcgLTMKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTAKICAgIC8vIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTMKICAgIC8vIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIGZyYW1lX2RpZyAtMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzA4CiAgICAvLyBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICBpbnRjXzIgLy8gOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzEzCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBnZXRieXRlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDIKICAgIC8vIGlmIHBheW9mZiA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJueiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDMKICAgIC8vIHJldHVybiBVSW50NjQoZW51bXMuUEFZT0ZGX1NJR05fUE9TSVRJVkUpCiAgICBpbnRjXzEgLy8gMQoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX3BheW9mZl9zaWduQDc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTItNzE0CiAgICAvLyBwYXlvZmZfc2lnbj1hcmM0LlVJbnQ4KAogICAgLy8gICAgIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIC8vICksCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgaW50Y18yIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTYKICAgIC8vIGN1cnJlbmN5X2lkPXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE3CiAgICAvLyBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MDUtNzE4CiAgICAvLyBFeGVjdXRpb25FdmVudCgKICAgIC8vICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIC8vICAgICBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYXBwbGllZF9hdD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICBwYXlvZmY9cGF5b2ZmLAogICAgLy8gICAgIHBheW9mZl9zaWduPWFyYzQuVUludDgoCiAgICAvLyAgICAgICAgIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIC8vICAgICApLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PXNldHRsZWRfYW1vdW50LAogICAgLy8gICAgIGN1cnJlbmN5X2lkPXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAwCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzA0LTcxOQogICAgLy8gYXJjNC5lbWl0KAogICAgLy8gICAgIEV4ZWN1dGlvbkV2ZW50KAogICAgLy8gICAgICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgICAgIHBheW9mZj1wYXlvZmYsCiAgICAvLyAgICAgICAgIHBheW9mZl9zaWduPWFyYzQuVUludDgoCiAgICAvLyAgICAgICAgICAgICBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICAvLyAgICAgICAgICksCiAgICAvLyAgICAgICAgIHNldHRsZWRfYW1vdW50PXNldHRsZWRfYW1vdW50LAogICAgLy8gICAgICAgICBjdXJyZW5jeV9pZD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgICAgIHNlcXVlbmNlPWVudHJ5LmV2ZW50X2lkICsgVUludDY0KDEpLAogICAgLy8gICAgICkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDlhMzMyYjk1IC8vIG1ldGhvZCAiRXhlY3V0aW9uRXZlbnQodWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc0NAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiAoVUludDY0KGVudW1zLkVWVF9JRUQpLCBVSW50NjQoZW51bXMuRVZUX1BJKSk6CiAgICBmcmFtZV9kaWcgNQogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBibnogX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2lmX2JvZHlANQogICAgZnJhbWVfZGlnIDUKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGJ6IF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pZl9lbHNlQDYKCl9lbWl0X2V4ZWN1dGlvbl9ldmVudF9pZl9ib2R5QDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDUKICAgIC8vIHJldHVybiBVSW50NjQoZW51bXMuUEFZT0ZGX1NJR05fUE9TSVRJVkUpCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzEzCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBiIF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9wYXlvZmZfc2lnbkA3CgpfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzQ2CiAgICAvLyByZXR1cm4gVUludDY0KGVudW1zLlBBWU9GRl9TSUdOX05FR0FUSVZFKQogICAgcHVzaGludCAyNTUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxMwogICAgLy8gc2VsZi5fcGF5b2ZmX3NpZ24oZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSwgcGF5b2ZmKQogICAgYiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fcGF5b2ZmX3NpZ25ANwoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9yb2xlX2lzX2FjdGl2ZShyb2xlX21hcDogYnl0ZXMsIHJvbGVfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NDoKX3JvbGVfaXNfYWN0aXZlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU3CiAgICAvLyBkZWYgX3JvbGVfaXNfYWN0aXZlKHNlbGYsIHJvbGVfbWFwOiB0eXAuUmJhY1JvbGUsIHJvbGVfYWRkcmVzczogQWNjb3VudCkgLT4gYm9vbDoKICAgIHByb3RvIDIgMQogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5CiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5LTYwCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5LTYxCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjEKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAtNjEKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgPj0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX21lcmdlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKSAtPiB2b2lkOgpfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2NQogICAgLy8gYXNzZXJ0IHNlbGYuX2lzX2FycmFuZ2VyKFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTIKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgPT0gc2VsZi5hcnJhbmdlci52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE4IC8vIDB4NTIyMzQxNzI3MjYxNmU2NzY1NzIyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgPT0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2NQogICAgLy8gYXNzZXJ0IHNlbGYuX2lzX2FycmFuZ2VyKFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpIC0+IHZvaWQ6Cl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4MwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFzc2V0X2RlZmF1bHRlZCwgZXJyLkRFRkFVTFRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQxIC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfZGVmYXVsdGVkIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIERlZmF1bHRlZAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkgLT4gdm9pZDoKX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg2CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYXNzZXRfc3VzcGVuZGVkLCBlcnIuU1VTUEVOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzMgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9zdXNwZW5kZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gU3VzcGVuZGVkIG9wZXJhdGlvbnMKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkOiB1aW50NjQpIC0+IHZvaWQ6Cl9hc3NlcnRfdmFsaWRfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OAogICAgLy8gZGVmIF9hc3NlcnRfdmFsaWRfcm9sZShzZWxmLCByb2xlX2lkOiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTAKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIHB1c2hpbnQgMjAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkxCiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgcHVzaGludCAyNQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTIKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICBwdXNoaW50IDQwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MwogICAgLy8gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgcHVzaGludCA1MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTQKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgcHVzaGludCA2MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTUKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICBwdXNoaW50IDcwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NgogICAgLy8gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgcHVzaGludCA4MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfZmFsc2VAOAoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3OgogICAgaW50Y18xIC8vIDEKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX21lcmdlQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgcmV0c3ViCgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9mYWxzZUA4OgogICAgaW50Y18wIC8vIDAKICAgIGIgX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfbWVyZ2VAOQo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="}, "sourceInfo": {"approval": {"pcOffsetMethod": "none", "sourceInfo": [{"pc": [2601], "errorMessage": "ACTUS event not yet executed"}, {"pc": [2358], "errorMessage": "Can not distribute zero units"}, {"pc": [3102, 3109, 3481], "errorMessage": "D-ASA already configured"}, {"pc": [1238, 1939, 2318, 2464, 3733, 3880, 4226, 4372], "errorMessage": "D-ASA not configured"}, {"pc": [3492], "errorMessage": "D-ASA terms not configured"}, {"pc": [6541], "errorMessage": "Defaulted"}, {"pc": [3120], "errorMessage": "Denomination asset is not properly set"}, {"pc": [3135], "errorMessage": "Different settlement asset not supported, must be equal to denomination asset"}, {"pc": [3370, 3377, 3379], "errorMessage": "IED must be set in the future"}, {"pc": [1256, 2008, 2479, 5914], "errorMessage": "IED not yet executed"}, {"pc": [2371, 5297], "errorMessage": "Insufficient remaining D-ASA units"}, {"pc": [2574, 2641], "errorMessage": "Insufficient sender units to transfer"}, {"pc": [1835, 3022, 3040, 3096, 3603, 3641, 5482, 5760, 5820, 6203], "errorMessage": "Invalid ACTUS configuration"}, {"pc": [1948, 2352, 2535, 2550, 2708, 2781, 2844, 2886, 5109, 5234], "errorMessage": "Invalid account holding address"}, {"pc": [4564, 4588, 4612, 4636, 4660, 4717, 4745, 4767, 4789, 4811, 4990, 5008, 5023, 5038, 5053], "errorMessage": "Invalid account role address"}, {"pc": [3082], "errorMessage": "Invalid day-count convention ID"}, {"pc": [1347, 3755, 4089, 5792], "errorMessage": "Invalid event cursor"}, {"pc": [3588, 3654, 3933, 5398], "errorMessage": "Invalid event id"}, {"pc": [3768, 4153, 4160], "errorMessage": "Invalid event type"}, {"pc": [4701, 4980, 6611], "errorMessage": "Invalid role identifier"}, {"pc": [3486, 3666, 3674, 3989, 5413, 5429], "errorMessage": "Invalid schedule page"}, {"pc": [5345], "errorMessage": "No D-ASA units"}, {"pc": [1353, 1864, 2045, 5801], "errorMessage": "No due cashflow to pay"}, {"pc": [5883], "errorMessage": "Not IED event"}, {"pc": [1993, 2326, 2522, 2698, 2754, 2764, 2850, 4188, 4834, 6533], "errorMessage": "Not authorized"}, {"pc": [1474, 1482, 2094, 2168, 2177], "errorMessage": "Not enough funds for the payment"}, {"pc": [3905, 3918], "errorMessage": "Observed event required to execute this action"}, {"pc": [2340, 2388], "errorMessage": "Primary distribution is closed"}, {"pc": [5832], "errorMessage": "Primary distribution is not complete"}, {"pc": [2563], "errorMessage": "Sender and receiver must be different"}, {"pc": [5095, 6549], "errorMessage": "Suspended operations"}, {"pc": [2275, 3631], "errorMessage": "Time events must be sorted in strictly ascending order"}, {"pc": [2496, 2513], "errorMessage": "Transfer is closed"}, {"pc": [2567], "errorMessage": "Transfer units must be greater than zero"}, {"pc": [988], "errorMessage": "Wrong Global Bytes allocation"}, {"pc": [994], "errorMessage": "Wrong Global UInts allocation"}, {"pc": [998], "errorMessage": "Wrong Local Bytes allocation"}, {"pc": [1002], "errorMessage": "Wrong Local UInts allocation"}, {"pc": [1455, 2087], "errorMessage": "account opted into asset"}, {"pc": [6493, 6508], "errorMessage": "check BoxMap entry exists"}, {"pc": [1984, 2022, 2063, 2101, 2392, 2570, 2630, 2656, 5089, 5255], "errorMessage": "check self.account entry exists"}, {"pc": [1536, 1762, 1847, 4283, 5919, 6222], "errorMessage": "check self.accrued_interest exists"}, {"pc": [4852, 6531], "errorMessage": "check self.arranger exists"}, {"pc": [6539], "errorMessage": "check self.asset_defaulted exists"}, {"pc": [6547], "errorMessage": "check self.asset_suspended exists"}, {"pc": [3030, 3475, 3901, 3913, 4231, 5644], "errorMessage": "check self.contract_type exists"}, {"pc": [1504, 4288, 5117, 5195], "errorMessage": "check self.cumulative_interest_index exists"}, {"pc": [1516, 4293, 5128, 5203], "errorMessage": "check self.cumulative_principal_index exists"}, {"pc": [5654], "errorMessage": "check self.dynamic_principal_redemption exists"}, {"pc": [1271, 1284, 1345, 1586, 2578, 2591, 3746, 4082, 4259, 4376, 4389, 4426, 5210, 5790, 5871, 6103, 6241], "errorMessage": "check self.event_cursor exists"}, {"pc": [5143, 5157, 5350, 5379, 5710, 5718, 5745, 5765, 5954, 6067, 6228], "errorMessage": "check self.fixed_point_scale exists"}, {"pc": [5997], "errorMessage": "check self.has_rate_reset_cap exists"}, {"pc": [5970], "errorMessage": "check self.has_rate_reset_floor exists"}, {"pc": [3107, 3491, 4255, 5888], "errorMessage": "check self.initial_exchange_amount exists"}, {"pc": [2376, 2386], "errorMessage": "check self.initial_exchange_date exists"}, {"pc": [1707, 4273, 5686, 5700], "errorMessage": "check self.interest_calculation_base exists"}, {"pc": [1778, 1793], "errorMessage": "check self.next_principal_redemption exists"}, {"pc": [4278, 5678, 5705, 5750], "errorMessage": "check self.nominal_interest_rate exists"}, {"pc": [1953, 1966], "errorMessage": "check self.op_daemon exists"}, {"pc": [1607, 1674, 1699, 1752, 1803, 1811, 1832, 4268, 6207, 6287], "errorMessage": "check self.outstanding_principal exists"}, {"pc": [6005, 6019], "errorMessage": "check self.rate_reset_cap exists"}, {"pc": [5978, 5992], "errorMessage": "check self.rate_reset_floor exists"}, {"pc": [5949], "errorMessage": "check self.rate_reset_multiplier exists"}, {"pc": [6321], "errorMessage": "check self.rate_reset_next exists"}, {"pc": [5962], "errorMessage": "check self.rate_reset_spread exists"}, {"pc": [1460, 2163, 4298], "errorMessage": "check self.reserved_interest exists"}, {"pc": [1465, 1494, 2173, 2188, 4303], "errorMessage": "check self.reserved_principal exists"}, {"pc": [2363, 2411, 4250, 5292, 5825], "errorMessage": "check self.reserved_units_total exists"}, {"pc": [1276, 2583, 3751, 3931, 3949, 4072, 4264, 4381, 5394, 6112], "errorMessage": "check self.schedule_entry_count exists"}, {"pc": [3979], "errorMessage": "check self.schedule_page entry exists"}, {"pc": [1452, 2053, 2081, 6393], "errorMessage": "check self.settlement_asset_id exists"}, {"pc": [1237, 1251, 1938, 2003, 2317, 2336, 2463, 2474, 2758, 3100, 3479, 3732, 3879, 4224, 4371, 5238, 5816, 5909], "errorMessage": "check self.status exists"}, {"pc": [2369, 2422, 4245, 5343, 5374, 5830], "errorMessage": "check self.total_units exists"}, {"pc": [2501, 2511], "errorMessage": "check self.transfer_closure_date exists"}, {"pc": [2484, 2492], "errorMessage": "check self.transfer_opening_date exists"}, {"pc": [3565, 3624], "errorMessage": "index access is out of bounds"}, {"pc": [1922, 2967, 3449, 3984], "errorMessage": "invalid array length header"}, {"pc": [2688, 3437, 4824], "errorMessage": "invalid number of bytes for arc4.bool"}, {"pc": [1930], "errorMessage": "invalid number of bytes for arc4.dynamic_array"}, {"pc": [3464], "errorMessage": "invalid number of bytes for arc4.dynamic_array"}, {"pc": [1916, 2301, 2441, 2449, 2680, 2738, 2746, 2826, 2834, 2877, 2902, 4445, 4469, 4503, 4684, 4866, 4950], "errorMessage": "invalid number of bytes for arc4.static_array"}, {"pc": [1232, 2259, 2268, 2309, 2458, 3427, 3864], "errorMessage": "invalid number of bytes for arc4.uint64"}, {"pc": [4493, 4674, 4940], "errorMessage": "invalid number of bytes for arc4.uint8"}, {"pc": [2939], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.InitialKernelState"}, {"pc": [2928], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.NormalizedActusTerms"}, {"pc": [3875], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.ObservedEventRequest"}, {"pc": [2972], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.Prospectus"}, {"pc": [4514], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.RoleValidity"}, {"pc": [2956], "errorMessage": "invalid tail pointer at index 1 of (uint8[32],(len+utf8[]))"}, {"pc": [2951], "errorMessage": "invalid tuple encoding"}, {"pc": [4051], "errorMessage": "max array length exceeded"}, {"pc": [4237, 6385], "errorMessage": "overflow"}]}, "clear": {"pcOffsetMethod": "none", "sourceInfo": []}}, "templateVariables": {}}""" +_APP_SPEC_JSON = r"""{"arcs": [22, 28], "bareActions": {"call": [], "create": []}, "methods": [{"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "name": "max_event_count"}], "name": "fund_due_cashflows", "returns": {"type": "(uint64,uint64,uint64,uint64,uint64)", "struct": "CashFundingResult"}, "desc": "Reserve due ACTUS cash events into the escrow-style claim ledger.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "name": "holding_address"}, {"type": "byte[]", "name": "payment_info"}], "name": "claim_due_cashflows", "returns": {"type": "(uint64,uint64,uint64,uint64,byte[])", "struct": "CashClaimResult"}, "desc": "Withdraw the holder's already funded ACTUS cash entitlements.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "name": "open_date"}, {"type": "uint64", "name": "closure_date"}], "name": "transfer_set_schedule", "returns": {"type": "uint64"}, "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "name": "holding_address"}, {"type": "uint64", "name": "units"}], "name": "primary_distribution", "returns": {"type": "uint64"}, "desc": "Reserve units for a holder before IED finalizes issuance.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "name": "sender_holding_address"}, {"type": "address", "name": "receiver_holding_address"}, {"type": "uint64", "name": "units"}], "name": "transfer", "returns": {"type": "uint64"}, "desc": "Transfer active units after settling both counterparties to the current cursor.\nReturns the number of units moved. The ACTUS kernel no longer persists a nominal per-unit value on-chain, so transfer results are unit-based.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "bool", "desc": "Suspension status", "name": "suspended"}], "name": "account_suspension", "returns": {"type": "uint64", "desc": "Timestamp of the set account suspension status"}, "desc": "Set account suspension status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "address", "desc": "Account Payment Address", "name": "payment_address"}], "name": "account_open", "returns": {"type": "uint64", "desc": "Timestamp of the account opening"}, "desc": "Open a contract account with a new position and register its payment address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "address", "desc": "Account Payment Address", "name": "payment_address"}], "name": "account_update_payment_address", "returns": {"type": "uint64", "desc": "Timestamp of the account update"}, "desc": "Update the Payment Address of an account", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}], "name": "account_get_position", "returns": {"type": "(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64)", "desc": "Account position", "struct": "AccountPosition"}, "desc": "Get account position", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": [], "create": ["NoOp"]}, "args": [{"type": "address", "desc": "D-ASA Arranger Address", "name": "arranger"}], "name": "contract_create", "returns": {"type": "uint64", "desc": "UNIX timestamp of contract creation"}, "desc": "Create a new D-ASA contract and set the Arranger role", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64)", "desc": "Normalized ACTUS terms", "name": "terms", "struct": "NormalizedActusTerms"}, {"type": "(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "desc": "Initial kernel state (pre-IED)", "name": "initial_state", "struct": "InitialKernelState"}, {"type": "(byte[32],string)", "desc": "Prospectus (informational only)", "name": "prospectus", "struct": "Prospectus"}], "name": "contract_config", "returns": {"type": "uint64", "desc": "UNIX timestamp of contract configuration"}, "desc": "Partial contract configuration with: normalized ACTUS terms, initial kernel\nstate (pre-IED), prospectus (informational only). The contract stays inactive until all schedule pages are configured next.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "name": "schedule_page_index"}, {"type": "bool", "name": "is_last_page"}, {"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[]", "name": "schedule_page"}], "name": "contract_schedule", "returns": {"type": "uint64"}, "desc": "Upload one normalized schedule page.\nThe configuration operation is considered complete only when the last page is stored. At that point `schedule_entry_count` is finalized and the contract moves to `STATUS_PENDING_IED`.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "contract_execute_ied", "returns": {"type": "uint64"}, "desc": "Execute the first due `IED` entry and activate the contract.\n`IED` is the one non-cash event that moves the app from `STATUS_PENDING_IED` to `STATUS_ACTIVE`.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "name": "event_id"}, {"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "name": "payload", "struct": "ObservedEventRequest"}], "name": "apply_non_cash_event", "returns": {"type": "uint64"}, "desc": "Apply the next due non-cash event, optionally appending one first.\nObserved payloads are appended before execution when flagged. Rate reset events require the interest oracle because they can change the running nominal rate; other non-cash events stay arranger-controlled.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "contract_get_state", "returns": {"type": "(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "struct": "KernelState"}, "desc": "Return a readonly snapshot of the generic ACTUS kernel state.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "contract_get_next_due_event", "returns": {"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "struct": "ExecutionScheduleEntry"}, "desc": "Return the next boxed schedule entry, or a zeroed sentinel if ended.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["UpdateApplication"], "create": []}, "args": [], "name": "contract_update", "returns": {"type": "void"}, "desc": "Update D-ASA application.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "New Arranger address", "name": "new_arranger"}], "name": "rbac_rotate_arranger", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Rotate the Arranger address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Operation Daemon address", "name": "address"}], "name": "rbac_set_op_daemon", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Non-Normative: Set the Operation Daemon address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}, {"type": "(uint64,uint64)", "desc": "Role time validity", "name": "validity", "struct": "RoleValidity"}], "name": "rbac_assign_role", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Assign a role to an address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}], "name": "rbac_revoke_role", "returns": {"type": "uint64", "desc": "Timestamp of the role revocation"}, "desc": "Revoke a role from an address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Suspension status", "name": "suspended"}], "name": "rbac_contract_suspension", "returns": {"type": "uint64", "desc": "Timestamp of the set asset suspension status"}, "desc": "Set asset suspension status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "rbac_get_arranger", "returns": {"type": "address", "desc": "Arranger address"}, "desc": "Get Arranger address", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Address to get roles for", "name": "address"}], "name": "rbac_get_address_roles", "returns": {"type": "(bool,bool,bool,bool,bool)", "desc": "Roles mask: (Account Manager, Primary Dealer, Trustee, Authority, Observer)"}, "desc": "Non-normative - Get roles assigned to an address", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}], "name": "rbac_get_role_validity", "returns": {"type": "(uint64,uint64)", "desc": "Role validity", "struct": "RoleValidity"}, "desc": "Get role validity", "events": [], "readonly": true, "recommendations": {}}], "name": "DASA", "state": {"keys": {"box": {}, "global": {"arranger": {"key": "UiNBcnJhbmdlciM=", "keyType": "AVMBytes", "valueType": "address"}, "op_daemon": {"key": "UiNPcERhZW1vbiM=", "keyType": "AVMBytes", "valueType": "address"}, "asset_suspended": {"key": "YXNzZXRfc3VzcGVuZGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "asset_defaulted": {"key": "YXNzZXRfZGVmYXVsdGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "status": {"key": "c3RhdHVz", "keyType": "AVMString", "valueType": "AVMUint64"}, "contract_type": {"key": "Y29udHJhY3RfdHlwZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "prospectus_hash": {"key": "cHJvc3BlY3R1c19oYXNo", "keyType": "AVMString", "valueType": "AVMBytes"}, "prospectus_url": {"key": "cHJvc3BlY3R1c191cmw=", "keyType": "AVMString", "valueType": "AVMString"}, "denomination_asset_id": {"key": "ZGVub21pbmF0aW9uX2Fzc2V0X2lk", "keyType": "AVMString", "valueType": "AVMUint64"}, "settlement_asset_id": {"key": "c2V0dGxlbWVudF9hc3NldF9pZA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "initial_exchange_date": {"key": "aW5pdGlhbF9leGNoYW5nZV9kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "maturity_date": {"key": "bWF0dXJpdHlfZGF0ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "transfer_opening_date": {"key": "dHJhbnNmZXJfb3BlbmluZ19kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "transfer_closure_date": {"key": "dHJhbnNmZXJfY2xvc3VyZV9kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "day_count_convention": {"key": "ZGF5X2NvdW50X2NvbnZlbnRpb24=", "keyType": "AVMString", "valueType": "AVMUint64"}, "total_units": {"key": "dG90YWxfdW5pdHM=", "keyType": "AVMString", "valueType": "AVMUint64"}, "reserved_units_total": {"key": "cmVzZXJ2ZWRfdW5pdHNfdG90YWw=", "keyType": "AVMString", "valueType": "AVMUint64"}, "initial_exchange_amount": {"key": "aW5pdGlhbF9leGNoYW5nZV9hbW91bnQ=", "keyType": "AVMString", "valueType": "AVMUint64"}, "outstanding_principal": {"key": "b3V0c3RhbmRpbmdfcHJpbmNpcGFs", "keyType": "AVMString", "valueType": "AVMUint64"}, "next_principal_redemption": {"key": "bmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbg==", "keyType": "AVMString", "valueType": "AVMUint64"}, "dynamic_principal_redemption": {"key": "ZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbg==", "keyType": "AVMString", "valueType": "AVMUint64"}, "interest_calculation_base": {"key": "aW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "accrued_interest": {"key": "YWNjcnVlZF9pbnRlcmVzdA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "nominal_interest_rate": {"key": "bm9taW5hbF9pbnRlcmVzdF9yYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_spread": {"key": "cmF0ZV9yZXNldF9zcHJlYWQ=", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_multiplier": {"key": "cmF0ZV9yZXNldF9tdWx0aXBsaWVy", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_floor": {"key": "cmF0ZV9yZXNldF9mbG9vcg==", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_cap": {"key": "cmF0ZV9yZXNldF9jYXA=", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_next": {"key": "cmF0ZV9yZXNldF9uZXh0", "keyType": "AVMString", "valueType": "AVMUint64"}, "has_rate_reset_floor": {"key": "aGFzX3JhdGVfcmVzZXRfZmxvb3I=", "keyType": "AVMString", "valueType": "AVMUint64"}, "has_rate_reset_cap": {"key": "aGFzX3JhdGVfcmVzZXRfY2Fw", "keyType": "AVMString", "valueType": "AVMUint64"}, "reserved_principal": {"key": "cmVzZXJ2ZWRfcHJpbmNpcGFs", "keyType": "AVMString", "valueType": "AVMUint64"}, "reserved_interest": {"key": "cmVzZXJ2ZWRfaW50ZXJlc3Q=", "keyType": "AVMString", "valueType": "AVMUint64"}, "cumulative_interest_index": {"key": "Y3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "cumulative_principal_index": {"key": "Y3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXg=", "keyType": "AVMString", "valueType": "AVMUint64"}, "event_cursor": {"key": "ZXZlbnRfY3Vyc29y", "keyType": "AVMString", "valueType": "AVMUint64"}, "schedule_entry_count": {"key": "c2NoZWR1bGVfZW50cnlfY291bnQ=", "keyType": "AVMString", "valueType": "AVMUint64"}, "fixed_point_scale": {"key": "Zml4ZWRfcG9pbnRfc2NhbGU=", "keyType": "AVMString", "valueType": "AVMUint64"}}, "local": {}}, "maps": {"box": {"account_manager": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNBY2NvdW50TWFuYWdlciM="}, "primary_dealer": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNQcmltYXJ5RGVhbGVyIw=="}, "trustee": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNUcnVzdGVlIw=="}, "authority": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNBdXRob3JpdHkj"}, "observer": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNPYnNlcnZlciM="}, "schedule_page": {"keyType": "uint64", "valueType": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[]", "prefix": "UyM="}, "account": {"keyType": "address", "valueType": "AccountPosition", "prefix": "UiNBY2NvdW50Iw=="}}, "global": {}, "local": {}}, "schema": {"global": {"bytes": 4, "ints": 37}, "local": {"bytes": 0, "ints": 0}}}, "structs": {"AccountPosition": [{"name": "payment_address", "type": "address"}, {"name": "units", "type": "uint64"}, {"name": "reserved_units", "type": "uint64"}, {"name": "suspended", "type": "bool"}, {"name": "settled_cursor", "type": "uint64"}, {"name": "interest_checkpoint", "type": "uint64"}, {"name": "principal_checkpoint", "type": "uint64"}, {"name": "claimable_interest", "type": "uint64"}, {"name": "claimable_principal", "type": "uint64"}], "CashClaimResult": [{"name": "interest_amount", "type": "uint64"}, {"name": "principal_amount", "type": "uint64"}, {"name": "total_amount", "type": "uint64"}, {"name": "timestamp", "type": "uint64"}, {"name": "context", "type": "byte[]"}], "CashFundingResult": [{"name": "funded_interest", "type": "uint64"}, {"name": "funded_principal", "type": "uint64"}, {"name": "total_funded", "type": "uint64"}, {"name": "processed_events", "type": "uint64"}, {"name": "timestamp", "type": "uint64"}], "ExecutionScheduleEntry": [{"name": "event_id", "type": "uint64"}, {"name": "event_type", "type": "uint8"}, {"name": "scheduled_time", "type": "uint64"}, {"name": "accrual_factor", "type": "uint64"}, {"name": "redemption_accrual_factor", "type": "uint64"}, {"name": "next_nominal_interest_rate", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "next_outstanding_principal", "type": "uint64"}, {"name": "flags", "type": "uint64"}], "InitialKernelState": [{"name": "status_date", "type": "uint64"}, {"name": "event_cursor", "type": "uint64"}, {"name": "outstanding_principal", "type": "uint64"}, {"name": "interest_calculation_base", "type": "uint64"}, {"name": "nominal_interest_rate", "type": "uint64"}, {"name": "accrued_interest", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "cumulative_interest_index", "type": "uint64"}, {"name": "cumulative_principal_index", "type": "uint64"}], "KernelState": [{"name": "contract_type", "type": "uint8"}, {"name": "status", "type": "uint64"}, {"name": "total_units", "type": "uint64"}, {"name": "reserved_units_total", "type": "uint64"}, {"name": "initial_exchange_amount", "type": "uint64"}, {"name": "event_cursor", "type": "uint64"}, {"name": "schedule_entry_count", "type": "uint64"}, {"name": "outstanding_principal", "type": "uint64"}, {"name": "interest_calculation_base", "type": "uint64"}, {"name": "nominal_interest_rate", "type": "uint64"}, {"name": "accrued_interest", "type": "uint64"}, {"name": "cumulative_interest_index", "type": "uint64"}, {"name": "cumulative_principal_index", "type": "uint64"}, {"name": "reserved_interest", "type": "uint64"}, {"name": "reserved_principal", "type": "uint64"}], "NormalizedActusTerms": [{"name": "contract_type", "type": "uint8"}, {"name": "denomination_asset_id", "type": "uint64"}, {"name": "settlement_asset_id", "type": "uint64"}, {"name": "total_units", "type": "uint64"}, {"name": "notional_principal", "type": "uint64"}, {"name": "initial_exchange_amount", "type": "uint64"}, {"name": "initial_exchange_date", "type": "uint64"}, {"name": "maturity_date", "type": "uint64"}, {"name": "day_count_convention", "type": "uint8"}, {"name": "rate_reset_spread", "type": "uint64"}, {"name": "rate_reset_multiplier", "type": "uint64"}, {"name": "rate_reset_floor", "type": "uint64"}, {"name": "rate_reset_cap", "type": "uint64"}, {"name": "rate_reset_next", "type": "uint64"}, {"name": "has_rate_reset_floor", "type": "bool"}, {"name": "has_rate_reset_cap", "type": "bool"}, {"name": "dynamic_principal_redemption", "type": "bool"}, {"name": "fixed_point_scale", "type": "uint64"}], "ObservedEventRequest": [{"name": "event_id", "type": "uint64"}, {"name": "event_type", "type": "uint8"}, {"name": "scheduled_time", "type": "uint64"}, {"name": "accrual_factor", "type": "uint64"}, {"name": "redemption_accrual_factor", "type": "uint64"}, {"name": "observed_rate", "type": "uint64"}, {"name": "next_nominal_interest_rate", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "next_outstanding_principal", "type": "uint64"}, {"name": "flags", "type": "uint64"}], "Prospectus": [{"name": "hash", "type": "byte[32]"}, {"name": "url", "type": "string"}], "RoleValidity": [{"name": "role_validity_start", "type": "uint64"}, {"name": "role_validity_end", "type": "uint64"}]}, "byteCode": {"approval": "DCAEAAEIICYwBBUffHUGc3RhdHVzDGV2ZW50X2N1cnNvchVvdXRzdGFuZGluZ19wcmluY2lwYWwUc2NoZWR1bGVfZW50cnlfY291bnQRZml4ZWRfcG9pbnRfc2NhbGUQYWNjcnVlZF9pbnRlcmVzdBlpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlClIjQWNjb3VudCMVbm9taW5hbF9pbnRlcmVzdF9yYXRlFHJlc2VydmVkX3VuaXRzX3RvdGFsEnJlc2VydmVkX3ByaW5jaXBhbA1jb250cmFjdF90eXBlC3RvdGFsX3VuaXRzGW5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24RcmVzZXJ2ZWRfaW50ZXJlc3QZY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleBpjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleAtSI0FycmFuZ2VyIxNzZXR0bGVtZW50X2Fzc2V0X2lkF2luaXRpYWxfZXhjaGFuZ2VfYW1vdW50DFIjQXV0aG9yaXR5IxBSI1ByaW1hcnlEZWFsZXIjEVIjQWNjb3VudE1hbmFnZXIjC1IjT2JzZXJ2ZXIjC1IjT3BEYWVtb24jFWluaXRpYWxfZXhjaGFuZ2VfZGF0ZRV0cmFuc2Zlcl9vcGVuaW5nX2RhdGUVdHJhbnNmZXJfY2xvc3VyZV9kYXRlEHJhdGVfcmVzZXRfZmxvb3IOcmF0ZV9yZXNldF9jYXACUyMKUiNUcnVzdGVlIw9hc3NldF9zdXNwZW5kZWQcZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbhFyYXRlX3Jlc2V0X3NwcmVhZBVyYXRlX3Jlc2V0X211bHRpcGxpZXIPcmF0ZV9yZXNldF9uZXh0FGhhc19yYXRlX3Jlc2V0X2Zsb29yEmhhc19yYXRlX3Jlc2V0X2NhcAEAD2Fzc2V0X2RlZmF1bHRlZA9wcm9zcGVjdHVzX2hhc2gOcHJvc3BlY3R1c191cmwVZGVub21pbmF0aW9uX2Fzc2V0X2lkDW1hdHVyaXR5X2RhdGUUZGF5X2NvdW50X2NvbnZlbnRpb24DBoEBMRhAAK0nEjIDZycZMgNnJyEiZycpImcpImcnDCJnJyqAAGcnK4AAZycsImcnEyJnJxoiZyctImcnGyJnJxwiZycuImcnDSJnJwoiZycUImcrImcnDiJnJyIiZycHImcnBiJnJwkiZycjImcnJCJnJx0iZyceImcnJSJnJyYiZycnImcnCyJnJw8iZycQImcnESJnKiJnJwQiZycFImcxNYEEEkQxNIElEkQxNxREMTYURIAEkU8E6zYaAI4BAMAxGRREMRhBAKmCFwS0RhjIBOeDJSkElDiHIwRshePuBL3RqUQEfA8YEgQU/BDvBHSnKX8ECdT+FASam/qFBIXu0z0EqywPxATZ8iWsBI6m50wEAq9VegSC9xstBO8E9dME3zQ1UAQ9voC9BB4+SOcEAQyCmQR0BqzSBBpyou42GgCOFwAbAscEIwRNBNcFyAYCBloGjQa7CK4J6ApiC9QMZwytDMUM3Q2SDigORw5SDpwAgASVbXFWNhoAjgEGmAAxGYEEEjEYEERCDI0igABHCjYaAUkVJBJEFyIpZUREiBSjiBSqiBSvIillRIEyEhREIkcCSwJLBAxBAlEiKmVEIicEZUQMQQJEIiplRIgQA0lFEYEJW0lFBjIHDUACLksPJFVJRRAkEklFB0AAEEsOgQMSQAAISw6BExJBAjYjQQILSw8iWyIqZUQSREsEMgcOREsFQAHkSw6BExJAAdwiRQ1LDyRVSUUQgQMSQAFgSw6BExJAAVgiRQhLD4ExW0UKiBCMQAD7SwlFC0sMiA9JSwiID0RLAYgPXklOAkURSYgPVUlFDUsCSwEISUUMMgoiJxNlRHAARCInD2VEIicLZURLAQhLAksBD0RPAkwJTwIPRE8DCCcPTGciJwtlRAgnC0xnIicQZURPAggnEExnIicRZUQIJxFMZ0sPJFWBAxJBAHciJwZlREsQiBAYRRIIJwZMZ4gP+EEACksPJFWBExJBAAlLD4EpWycOTGcrSwpnJwdLC2ciKmVEIwgqTGdLD1cIAYABE6hBABAiK2VEQAAJKYHIAWcnByJnSw9LB0mIEnFISwFLDghFAklLCQhFAUsCIwhFA0L+eScGImdC/5NLDyRVSUUQgQMSQQAPIitlREsICUlFC0ULQv7tSw4kEkEAEiIrZUxFC0QiJwdlTEUMREL+1EsOgRMSQAAHSwlFC0L+xSJFCiJFC0L+vIgPPkEAU0sOgRMSQQAJIitlREUIQv6UIicGZURLEIgPNkUSCElFDSInDmVED0EABiJFCEL+dSInDmVESwwJSUUKIitlRA1BAAkiK2VERQhC/llLCEUIQv5SSw+BMVsiK2VESg5ETAlFCEL+PyInBmVESxCIDuFFEghFDUL+FUsCSURLAklLA0lOAwgyB08CFk8DFlBPAhZQTwIWUEwWUChMULAjQyJC/ceAAEcCNhoBRwIVJRJENhoCSSJZgQIISwEVEkRXAgBMIillREQnCExQSb1FAUQiJxllRDIDE0EAIjEAIicZZUQSQAAVMQBLAxJAAA0xAEsBvkRXACASQQEAI0SIEbqIEb8iKWVEgTISFERLAkmIDISIDAdGAkm+REmBSVtJTgJFCEmBUVtJRQhPAghJRQZEVwAgIicTZURwAEUBQQC3Sb5EgYADU0AArSNBAHgyCiInE2VETEsBcABESwVJTgIPREsCSU4DvkRJVwAgsTIATwOyEkyyFE8CshGBBLIQsgGzSYFJW0lOAkUJSYFRW0lOA0UJIhZMSwFcSUxcUU8DTL8iJw9lRElLAg9EIicLZURLAw9ETAknD0xnIicLZURMCScLTGdLBUlLBklOAwgyB08CFk8DFlBPAhZQTBZQSwJJFRZXBgJMUEyAAgAiUExQKExQsCNDIkL/UCJC/v02GgFJFSQSRBc2GgJJFSQSRBeIEJxKDEQnG08CZyccTGcyBxYoTFCwI0M2GgFJFSUSRDYaAkkVJBJEF0lOAiIpZUREJxYxAIgQM0SIEG2IEHIiKWVEgTISRCcISwJQSU4DvUUBREyICqNJRCInCmVECCInDWVEDkQiJxplREEACTIHIicaZUQOREcCvkSBKFtLA0lOAwgWgShMuyInCmVECCcKSwFnIicNZURMCRYoTFCwI0MiSTYaAUkVJRJENhoCSRUlEkQ2GgNHAhUkEkQXIillRESID+OID+giKWVEgTISFEQiJxtlREEACSInG2VEMgcORCInHGVEQQAJMgciJxxlRAxEMQBLBElOAhJEJwhLAVBJRQhJvUUBRCcISwVJTgJQSUUJvUUBREsCiAncSYgJ2E8CE0RLAUlETL5EJVsORCIqZUQiJwRlRA9AAA4iKmVEiArogQlbMgcNREsDSYgKM0sDSU4CiAoriAmuRgKICalGAksFSb5EJVtLAklOAksBDkRLAQkWTwIlTwK7SwVJvkQlW08CCBYlTLsoSwJQsCNDNhoBSRUlEkQ2GgJJFSMSRCJTJxUxAIgOv0QnCE8CUEm9RQFESYEwI7oiTwNUgTBMuzIHFihMULAjQzYaAUkVJRJENhoCSRUlEkQnFzEAiA6HRCIpZUSByAESFESIDreIDrwnCE8CUEm9RQEURCIWTwJLAVBLAVAnKFBLAVBLAVBLAVBLAVBMUL8yBxYoTFCwI0M2GgFJFSUSRDYaAkkVJRJEJwhLAlBJvUUBRDEATwMSRIgOYYgOZiJPArsyBxYoTFCwI0M2GgFJFSUSRCcITFBJvUUBRL5IKExQsCNDNhoBSRUlEkQnEkxnMgcWKExQsCNDgABJNhoBRwIVgWsSRDYaAklOAhWBSBJENhoDSU4CSRVLASVZSYEiEkRPAkxLAlJJTgMiWYEkCBJEiA3dIlVJJwxLAWdBACJJIxJAABxJgQISQAAVSYEDEkAADkmBBBJAAAdJgQUSQQGGI0QiJwxlTEUCREsESYEhW0lFCESBOVVJRQhBAB9LBiMSQAAYSwaBAhJAABBLBoEDEkAACEsGgQQSQQFGI0RJIxNBAAhLBIGSBlMURCIpZUQURCInFGVEFERLBEkjW0lxC0UBRCcsSwFnSwGBCVtJTwISRCcTSwFnsTIAMgoishKyFEyyEYEEshCyAbNJgRFbJw1MZycKImcnLksIZ0mBKVsnGksBZ0sBgTFbJy1LAWdLBklOAoEwWycOTGcnFEsKZ0sDgZIGUyciTGdLAYEQWytMZ0sBgShbJwZMZ0sBJVsnCUxnSwGBGFsnB0xnSwOBOlsnI0xnSwOBQlsnJExnSwOBSlsnHUxnSwOBUlsnHkxnSwOBWlsnJUxnSwOBkAZTJyZMZ0sDgZEGUycnTGdPA4FjWycFTGdLASRbKkxnSwGBOFsnEExnSwGBQFsnEUxnJw8iZycLImdLAjIHDURMIltLAgxEDERLAlcAICcqTGdLAVcCACcrTGcyBxYoTFCwI0MiQv63IkL+dyKAAEcDNhoBSRUkEkQXSTYaAkkVIxJEIlNMNhoDSU4CSSJZSU4DSYFBC4ECCE8CFRJEiAvxIicMZUxOA0QiKWVEFERJgRAORCInFGVEREyBEAtMgWQLgeYLCEkyDA1BABixgQayEIEFshknL7IeJy+yHyKyAbNC/+EiRQpLCUsEDEEAjksEVwIASUUNSwpJTgKBQQuBQVhJJFVJTgJFDkkiW0lFDUsFTwQISwESREsFTwOIBzRMgQlbSUUKREEAGUsJQQAnSwkjCYFBC0sMTIFBWIEJW0sIDkRLCEAABUsKIxJESwkjCEUKQv+QSwZJRCMJFicfTFBJvUUBREkigQK6F0lEIwmBQQuBAgiBQbpC/8BLBhYnH0xQSbxISwW/SwVBAA1LAUsECCcETGcpgTJnMgcWKExQsCNDIillRESICuSICuuICvAiKmVEIicEZURLAQ1EiAZcSVcIAUmAAQGoREsBVwAISwJXCQhLA1cRCEsEVxkISwVXIQhLBlcpCEsHVzEISwhXOQhPB08IUE8HUE8GUE8FUCIWUE8EUE8DUE8CUExQiAePRgIyBxYoTFCwI0MiRwSAAEk2GgFJFSQSRBc2GgJHAhWBSRJEIillRESICluICmCBQVtJgQQaQQC2IicMZUSBBRJEiAo4IicMZURJgQUSREsCSSJbSUUHIicEZUQSRElXCAFFDCRViAXXIicEZUSBEAqAAgAARQcWJx9MUElFCb1FAUEAB0sHvkxFB0RLBUkiWUmBEAxESwNJVwkISwFXEQhLAlcZCEsDVykISwRXMQhPBVc5CEsLFksSUE8GUE8FUE8EUE8DUE8CUExQSwMWUE8CTFBMIwgWVwYCXABLCEm8SEy/IicEZUQjCCcETGciKmVESwNJTwISRIgFDklFCElXCAFFCiRVSUUGIxJAAChLBIEEEkAAIEsEgQwSQAAYSwSBCxJAABBLBIESEkAACEsEgQUSQQBBI0RLCIABAalESwSBDBJAAAhLBIELEkEAJCNBABonGDEAiAjtREsGSwKIBitGAjIHFihMULAjQ4gJC0L/6CJC/9kiQv+8IillRElEIicMZUQWSZMkDkRXBwEiJw1lRCInCmVEIicUZUQiKmVEIicEZUQiK2VEIicHZUQiJwllRCInBmVEIicQZUQiJxFlRCInD2VEIicLZURPDhZPDkxQTw0WUE8MFlBPCxZQTwoWUE8JFlBPCBZQTwcWUE8GFlBPBRZQTwQWUE8DFlBPAhZQTBZQKExQsCNDIillREQiKmVEIicEZUQPQQAlIiplRBYnKFAiFkxLAVBLAVBLAVBLAVBLAVBLAVBMUChMULAjQyIqZUSIA71C//CICCkjQzYaAUkVJRJEiAgcJxJMZzIHFihMULAjQzYaAUkVJRJEiAgEJxlMZzIHFihMULAjQzYaAUkVIxJENhoCSU4CFSUSRDYaA0lOAhWBEBJEiAfXiAfeF0cCiAfogRQSQQAOJxJLA2cyBxYoTFCwI0NJgSgSQQARJxdLA1BJvUUBFERLAr9C/99JgTISQQARJxZLA1BJvUUBFERLAr9C/8dJgTwSQQARJyBLA1BJvUUBFERLAr9C/69JgUYSQQARJxVLA1BJvUUBFERLAr9C/5dJgVASQf+QJxhLA1BJvUUBFERLAr9C/382GgFJFSMSRDYaAklOAhUlEkSIBy2IBzQXRwKIBz5JgRQTRIEoEkEAFScXSwJQSb1FAUS8SDIHFihMULAjQ0mBMhJBAA8nFksCUEm9RQFEvEhC/+FJgTwSQQAPJyBLAlBJvUUBRLxIQv/LSYFGEkEADycVSwJQSb1FAUS8SEL/tUmBUBJB/64nGEsCUEm9RQFEvEhC/582GgFJFSMSRCJTJxUxAIgGZ0QnIUxnMgcWKExQsCNDIicSZUQoTFCwI0M2GgFJFSUSRCcXSwGIBj8nFksCiAY4JyBLA4gGMScVSwSIBionGE8FiAYjJygiTwZUI08FVIECTwRUgQNPA1SBBE8CVChMULAjQzYaAUkVIxJENhoCSU4CFSUSRBdJiAY7gwYUKDI8RlBPBo4GAE8AQAAxACIAEwABACcYSwFQSb1FAUS+SChMULAjQycVSwFQSb1FAUS+SEL/6ycgSwFQSb1FAUS+SEL/3CcWSwFQSb1FAUS+SEL/zScXSwFQSb1FAUS+SEL/voAQAAAAAAAAAAAAAAAAAAAAAEL/qYoBACcIi/9QvkSBgANTFESJigECJwiL/1BJvUUBREm+SCInEGVESwGBOVsJIicRZURLAoFBWwlLAiVbIicFZURPA0sCTwKIAJgiJwVlRE8DTwNPAogAiksCgUlbSwIIFk8DTFxJSYFRW0sCCBZcUSInEGVEFlw5IicRZUQWXEEiKmVEFlwxTwNMv4mKAQAigAAnCIv/UEm9RQFEIillRIEyEkEAAYmLAr5MSU4CjABEgShbSYwBQAABiYsASSVbiwFJTgMIFlwgIhZcKIsCTL8iJwplRElLAg9ETAknCkxniYoDAYv9QQAFi/5AAAIiiYv9i/4di/+XiYoBAYv/QAACIokiJw1lRElEIicFZUSL/0xPAoj/yomKAQGL/0AAAiKJIicNZUQiJwVlRIv/TIj/r4mKAQEiJwRlRIv/DUSL/4EQChYnH0xQSb1FAUSL/4EQGEsBIoECuhdLAQ1EgUELgQIIgUG6iYoCAIv/IxJAAB+L/yQSQAAYi/+BExJAABCL/4EMEkAACIv/gQsSQQADI0SJi/5AAAQiQv/1i/6BAxJAAAiL/oECEkEAGIv/gQMSQAAIi/+BEhJBAAQjQv/RIkL/zYv+IxJBACCL/4EDEkAAEIv/gRISQAAIi/+BBRJBAAQjQv+qIkL/pov+gQQSQQAoi/+BAxJAABiL/4EEEkAAEIv/gRISQAAIi/+BBRJBAAQjQv96IkL/dov+gQUSQQAIi/+BAxJC/2YiQv9iIicMZUQjEkEACiInImVEQQACI4kiiYoBAov/gRFbSUEAECInCWVEQQAIIicHZURAAAYii/9PAokiJwdlRCInCWVEIicFZUSI/mciJwVlRIsATIj+XIv/TwKJigIBi/9AAAOL/okiJwVlRCInCWVEi/9LAoj+OwhJRCInBWVEi/5MTwKI/iuJigICIoAARwiL/iJbIiplRBJEi/6BCVsyBw5Ei/4kVUkjEklBAF0iKWVEgTISRCInCmVEIicNZUQSRIv+gTFbK0sBZycHTGeL/oEhWycJTGcnBiJni/6BKVsnDkxnIiplRCMIKkxnKYFkZ4sLRCInFGVEi/5MIogBxUmM/ov/jAGMAIkiKWVEgTISFEQiJwZlRIv+iP75jP4IJwZMZ4sKgQwSQQFji/+BIVsiJyRlRCInBWVEiP1zIicjZUQIjAYiJyZlREEAEyInHWVEiwYNQQAIIicdZUyMBkQiJydlREEAEyInHmVEiwYMQQAIIiceZUyMBkQnCYsGZ4sKgQQSQQDzi/6BMVsrSwFnJwdMZ4j+Z0EA1IsKgQUSQQCyIicFZUyMAkQijAEijAeL/oEZW0mMCEEAD4sCiwiI/pZJjAIjjAeMASIqZUQjCIwDIicEZUSLAw1BAFKLA4j9H0mMACRVSYwEgQMSQAAQiwSBExJBADOLAIEZW0EAKyNBAAiLB0EADCKMB4sDIwiMA0L/vYsAgRlbiwJMiP44SYwCiwEIjAFC/+EiQv/SiwFEIitlRIv+gTlbJBpAAAYiJwZlRAgiJwVlRIsBiPxfJw5MZyIqZUQjCCpMZ4v+IkmIAF9JjP6L/4wBjACJi/6BKVsnDkxnQv/aiwqBEhJB/xIiK2VEJwdMZ0L/B4sKgQsSQQAbi/6BIVtJjAVAAAgiJyVlTIwFRCcJiwVnQv7Pi/6BIVtJjAlB/sQnCYsJZ0L+vIoDATIIi/0iW4v9VwgBi/1XCQgyB4v9JFWL/kAARSMWSZMkDkRXBwEiJxNlRIsBSSMIiwAWTwIWUIsCUIsDUIsEFlCL/hZQTwNQi/8WUE8CFlBMFlCABJozK5VMULCL/YwAiYsFIxJAAAiLBYEEEkEABCNC/6mB/wFC/6OKAgGAAIv+i/9QSb1FAUEAH4sBvkQiWzIHSYwADkEAEIsBvkQkW4sAD0EABCOMAIkiQv/5MQAiJxJlRBJEiSInKWVEFESJIichZUQURImKAQCL/4EUEkAAMIv/gRkSQAAoi/+BKBJAACCL/4EyEkAAGIv/gTwSQAAQi/+BRhJAAAiL/4FQEkEAAyNEiSJC//o=", "clear": "DIEBQw=="}, "desc": "Debt Algorand Standard Application.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "networks": {}, "source": {"approval": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCAzMgogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1ICJzdGF0dXMiICJldmVudF9jdXJzb3IiICJvdXRzdGFuZGluZ19wcmluY2lwYWwiICJzY2hlZHVsZV9lbnRyeV9jb3VudCIgImZpeGVkX3BvaW50X3NjYWxlIiAiYWNjcnVlZF9pbnRlcmVzdCIgImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMgIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIgInJlc2VydmVkX3VuaXRzX3RvdGFsIiAicmVzZXJ2ZWRfcHJpbmNpcGFsIiAiY29udHJhY3RfdHlwZSIgInRvdGFsX3VuaXRzIiAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIgInJlc2VydmVkX2ludGVyZXN0IiAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIgImN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IiAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMgInNldHRsZW1lbnRfYXNzZXRfaWQiICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIgMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMgMHg1MjIzNTA3MjY5NmQ2MTcyNzk0NDY1NjE2YzY1NzIyMyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMgMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzIDB4NTIyMzRmNzA0NDYxNjU2ZDZmNmUyMyAiaW5pdGlhbF9leGNoYW5nZV9kYXRlIiAidHJhbnNmZXJfb3BlbmluZ19kYXRlIiAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIiAicmF0ZV9yZXNldF9mbG9vciIgInJhdGVfcmVzZXRfY2FwIiAweDUzMjMgMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMyAiYXNzZXRfc3VzcGVuZGVkIiAiZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiIgInJhdGVfcmVzZXRfc3ByZWFkIiAicmF0ZV9yZXNldF9tdWx0aXBsaWVyIiAicmF0ZV9yZXNldF9uZXh0IiAiaGFzX3JhdGVfcmVzZXRfZmxvb3IiICJoYXNfcmF0ZV9yZXNldF9jYXAiIDB4MDAgImFzc2V0X2RlZmF1bHRlZCIgInByb3NwZWN0dXNfaGFzaCIgInByb3NwZWN0dXNfdXJsIiAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIiAibWF0dXJpdHlfZGF0ZSIgImRheV9jb3VudF9jb252ZW50aW9uIiAweDA2ODEwMQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4LTI5CiAgICAvLyAjIFJCQUMgUm9sZXMKICAgIC8vIHNlbGYuYXJyYW5nZXIgPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX0FSUkFOR0VSKQogICAgYnl0ZWMgMTggLy8gMHg1MjIzNDE3MjcyNjE2ZTY3NjU3MjIzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzAKICAgIC8vIHNlbGYub3BfZGFlbW9uID0gR2xvYmFsU3RhdGUoQWNjb3VudCgpLCBrZXk9Y3N0LlBSRUZJWF9JRF9PUF9EQUVNT04pCiAgICBieXRlYyAyNSAvLyAweDUyMjM0ZjcwNDQ2MTY1NmQ2ZjZlMjMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo0Ny00OAogICAgLy8gIyBELUFTQSBHb3Zlcm5hbmNlCiAgICAvLyBzZWxmLmFzc2V0X3N1c3BlbmRlZCA9IEZhbHNlCiAgICBieXRlYyAzMyAvLyAiYXNzZXRfc3VzcGVuZGVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NDkKICAgIC8vIHNlbGYuYXNzZXRfZGVmYXVsdGVkID0gRmFsc2UKICAgIGJ5dGVjIDQxIC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU2LTU3CiAgICAvLyAjIENvbnRyYWN0CiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMTIgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwLTYxCiAgICAvLyAjIFByb3NwZWN0dXMgKEluZm9ybWF0aW9uYWwpCiAgICAvLyBzZWxmLnByb3NwZWN0dXNfaGFzaCA9IEJ5dGVzKCkKICAgIGJ5dGVjIDQyIC8vICJwcm9zcGVjdHVzX2hhc2giCiAgICBwdXNoYnl0ZXMgMHgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MgogICAgLy8gc2VsZi5wcm9zcGVjdHVzX3VybCA9IFN0cmluZygpCiAgICBieXRlYyA0MyAvLyAicHJvc3BlY3R1c191cmwiCiAgICBwdXNoYnl0ZXMgIiIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NC02NQogICAgLy8gIyBEZW5vbWluYXRpb24KICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gQXNzZXQoKQogICAgYnl0ZWMgNDQgLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjYKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCA9IEFzc2V0KCkKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OC02OQogICAgLy8gIyBUaW1lCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgMjYgLy8gImluaXRpYWxfZXhjaGFuZ2VfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzAKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgNDUgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxCiAgICAvLyBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgMjcgLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIKICAgIC8vIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlID0gdHlwLlRpbWVTdGFtcCgpCiAgICBieXRlYyAyOCAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NC03NQogICAgLy8gIyBEYXkgQ291bnQgQ29udmVudGlvbgogICAgLy8gc2VsZi5kYXlfY291bnRfY29udmVudGlvbiA9IFVJbnQ2NCgpCiAgICBieXRlYyA0NiAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc3LTc4CiAgICAvLyAjIFVuaXRzCiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzID0gVUludDY0KCkKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPSBVSW50NjQoKQogICAgYnl0ZWMgMTAgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MS04MgogICAgLy8gIyBQcmluY2lwYWwKICAgIC8vIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPSBVSW50NjQoKQogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MwogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBVSW50NjQoKQogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NAogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gVUludDY0KCkKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NQogICAgLy8gc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gRmFsc2UKICAgIGJ5dGVjIDM0IC8vICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4Ny04OAogICAgLy8gIyBJbnRlcmVzdAogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gVUludDY0KCkKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg5CiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgPSBVSW50NjQoKQogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTEtOTIKICAgIC8vICMgSW50ZXJlc3QgUmF0ZXMKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTMKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQgPSBVSW50NjQoKQogICAgYnl0ZWMgMzUgLy8gInJhdGVfcmVzZXRfc3ByZWFkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NAogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIgPSBVSW50NjQoKQogICAgYnl0ZWMgMzYgLy8gInJhdGVfcmVzZXRfbXVsdGlwbGllciIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTUKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9mbG9vciA9IFVJbnQ2NCgpCiAgICBieXRlYyAyOSAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTYKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9jYXAgPSBVSW50NjQoKQogICAgYnl0ZWMgMzAgLy8gInJhdGVfcmVzZXRfY2FwIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NwogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X25leHQgPSBVSW50NjQoKQogICAgYnl0ZWMgMzcgLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTgKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgPSBGYWxzZQogICAgYnl0ZWMgMzggLy8gImhhc19yYXRlX3Jlc2V0X2Zsb29yIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OQogICAgLy8gc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgPSBGYWxzZQogICAgYnl0ZWMgMzkgLy8gImhhc19yYXRlX3Jlc2V0X2NhcCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAxLTEwMgogICAgLy8gIyBQcmltYXJ5IERpc3RyaWJ1dGlvbgogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgPSBVSW50NjQoKQogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAzCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0ID0gVUludDY0KCkKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA1LTEwNgogICAgLy8gIyBDdW11bGF0aXZlIFBlci1Vbml0IEZpeGVkLVBvaW50IEluZGV4ZXMKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4ID0gVUludDY0KCkKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1CiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciA9IFVJbnQ2NCgpCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNgogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA9IFVJbnQ2NCgpCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE4LTExOQogICAgLy8gIyBTY2FsaW5nCiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlID0gVUludDY0KCkKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6MjMKICAgIC8vIGFzc2VydCBUeG4uZ2xvYmFsX251bV9ieXRlX3NsaWNlID09IGNmZy5HTE9CQUxfQllURVMsIGVyci5XUk9OR19HTE9CQUxfQllURVMKICAgIHR4biBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgQnl0ZXMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjI0CiAgICAvLyBhc3NlcnQgVHhuLmdsb2JhbF9udW1fdWludCA9PSBjZmcuR0xPQkFMX1VJTlRTLCBlcnIuV1JPTkdfR0xPQkFMX1VJTlRTCiAgICB0eG4gR2xvYmFsTnVtVWludAogICAgcHVzaGludCAzNwogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgVUludHMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBhc3NlcnQgVHhuLmxvY2FsX251bV9ieXRlX3NsaWNlID09IGNmZy5MT0NBTF9CWVRFUywgZXJyLldST05HX0xPQ0FMX0JZVEVTCiAgICB0eG4gTG9jYWxOdW1CeXRlU2xpY2UKICAgICEKICAgIGFzc2VydCAvLyBXcm9uZyBMb2NhbCBCeXRlcyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6MjYKICAgIC8vIGFzc2VydCBUeG4ubG9jYWxfbnVtX3VpbnQgPT0gY2ZnLkxPQ0FMX1VJTlRTLCBlcnIuV1JPTkdfTE9DQUxfVUlOVFMKICAgIHR4biBMb2NhbE51bVVpbnQKICAgICEKICAgIGFzc2VydCAvLyBXcm9uZyBMb2NhbCBVSW50cyBhbGxvY2F0aW9uCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kX2FzYS9jb250cmFjdC5weTo4LTE4CiAgICAvLyBjbGFzcyBEQVNBKAogICAgLy8gICAgIFBheW1lbnRBZ2VudCwKICAgIC8vICAgICBUcmFuc2ZlckFnZW50LAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gICAgIGF2bV92ZXJzaW9uPTEyLAogICAgLy8gKToKICAgIHB1c2hieXRlcyAweDkxNGYwNGViIC8vIG1ldGhvZCAiY29udHJhY3RfdXBkYXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9jb250cmFjdF91cGRhdGVfcm91dGVANAoKbWFpbl9zd2l0Y2hfY2FzZV9uZXh0QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6OC0xOAogICAgLy8gY2xhc3MgREFTQSgKICAgIC8vICAgICBQYXltZW50QWdlbnQsCiAgICAvLyAgICAgVHJhbnNmZXJBZ2VudCwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBhdm1fdmVyc2lvbj0xMiwKICAgIC8vICk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBieiBtYWluX2NyZWF0ZV9Ob09wQDMxCiAgICBwdXNoYnl0ZXNzIDB4YjQ0NjE4YzggMHhlNzgzMjUyOSAweDk0Mzg4NzIzIDB4NmM4NWUzZWUgMHhiZGQxYTk0NCAweDdjMGYxODEyIDB4MTRmYzEwZWYgMHg3NGE3Mjk3ZiAweDA5ZDRmZTE0IDB4OWE5YmZhODUgMHg4NWVlZDMzZCAweGFiMmMwZmM0IDB4ZDlmMjI1YWMgMHg4ZWE2ZTc0YyAweDAyYWY1NTdhIDB4ODJmNzFiMmQgMHhlZjA0ZjVkMyAweGRmMzQzNTUwIDB4M2RiZTgwYmQgMHgxZTNlNDhlNyAweDAxMGM4Mjk5IDB4NzQwNmFjZDIgMHgxYTcyYTJlZSAvLyBtZXRob2QgImZ1bmRfZHVlX2Nhc2hmbG93cyh1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJjbGFpbV9kdWVfY2FzaGZsb3dzKGFkZHJlc3MsYnl0ZVtdKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYnl0ZVtdKSIsIG1ldGhvZCAidHJhbnNmZXJfc2V0X3NjaGVkdWxlKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbihhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInRyYW5zZmVyKGFkZHJlc3MsYWRkcmVzcyx1aW50NjQpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X3N1c3BlbnNpb24oYWRkcmVzcyxib29sKXVpbnQ2NCIsIG1ldGhvZCAiYWNjb3VudF9vcGVuKGFkZHJlc3MsYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgImFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzcyhhZGRyZXNzLGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X2dldF9wb3NpdGlvbihhZGRyZXNzKShhZGRyZXNzLHVpbnQ2NCx1aW50NjQsYm9vbCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAiY29udHJhY3RfY29uZmlnKCh1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxib29sLGJvb2wsYm9vbCx1aW50NjQpLCh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCksKGJ5dGVbMzJdLHN0cmluZykpdWludDY0IiwgbWV0aG9kICJjb250cmFjdF9zY2hlZHVsZSh1aW50NjQsYm9vbCwodWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NClbXSl1aW50NjQiLCBtZXRob2QgImNvbnRyYWN0X2V4ZWN1dGVfaWVkKCl1aW50NjQiLCBtZXRob2QgImFwcGx5X25vbl9jYXNoX2V2ZW50KHVpbnQ2NCwodWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIsIG1ldGhvZCAiY29udHJhY3RfZ2V0X3N0YXRlKCkodWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudCgpKHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJyYmFjX3JvdGF0ZV9hcnJhbmdlcihhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19zZXRfb3BfZGFlbW9uKGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX2Fzc2lnbl9yb2xlKHVpbnQ4LGFkZHJlc3MsKHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19yZXZva2Vfcm9sZSh1aW50OCxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19jb250cmFjdF9zdXNwZW5zaW9uKGJvb2wpdWludDY0IiwgbWV0aG9kICJyYmFjX2dldF9hcnJhbmdlcigpYWRkcmVzcyIsIG1ldGhvZCAicmJhY19nZXRfYWRkcmVzc19yb2xlcyhhZGRyZXNzKShib29sLGJvb2wsYm9vbCxib29sLGJvb2wpIiwgbWV0aG9kICJyYmFjX2dldF9yb2xlX3ZhbGlkaXR5KHVpbnQ4LGFkZHJlc3MpKHVpbnQ2NCx1aW50NjQpIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggZnVuZF9kdWVfY2FzaGZsb3dzIGNsYWltX2R1ZV9jYXNoZmxvd3MgdHJhbnNmZXJfc2V0X3NjaGVkdWxlIHByaW1hcnlfZGlzdHJpYnV0aW9uIHRyYW5zZmVyIGFjY291bnRfc3VzcGVuc2lvbiBhY2NvdW50X29wZW4gYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzIGFjY291bnRfZ2V0X3Bvc2l0aW9uIGNvbnRyYWN0X2NvbmZpZyBjb250cmFjdF9zY2hlZHVsZSBjb250cmFjdF9leGVjdXRlX2llZCBhcHBseV9ub25fY2FzaF9ldmVudCBjb250cmFjdF9nZXRfc3RhdGUgY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50IHJiYWNfcm90YXRlX2FycmFuZ2VyIHJiYWNfc2V0X29wX2RhZW1vbiByYmFjX2Fzc2lnbl9yb2xlIHJiYWNfcmV2b2tlX3JvbGUgcmJhY19jb250cmFjdF9zdXNwZW5zaW9uIHJiYWNfZ2V0X2FycmFuZ2VyIHJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXMgcmJhY19nZXRfcm9sZV92YWxpZGl0eQogICAgZXJyCgptYWluX2NyZWF0ZV9Ob09wQDMxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjgtMTgKICAgIC8vIGNsYXNzIERBU0EoCiAgICAvLyAgICAgUGF5bWVudEFnZW50LAogICAgLy8gICAgIFRyYW5zZmVyQWdlbnQsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyAgICAgYXZtX3ZlcnNpb249MTIsCiAgICAvLyApOgogICAgcHVzaGJ5dGVzIDB4OTU2ZDcxNTYgLy8gbWV0aG9kICJjb250cmFjdF9jcmVhdGUoYWRkcmVzcyl1aW50NjQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBjb250cmFjdF9jcmVhdGUKICAgIGVycgoKbWFpbl9jb250cmFjdF91cGRhdGVfcm91dGVANDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgNCAvLyBVcGRhdGVBcHBsaWNhdGlvbgogICAgPT0KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0CiAgICBiIGNvbnRyYWN0X3VwZGF0ZQoKCi8vIG1vZHVsZXMucGF5bWVudF9hZ2VudC5QYXltZW50QWdlbnQuZnVuZF9kdWVfY2FzaGZsb3dzW3JvdXRpbmddKCkgLT4gdm9pZDoKZnVuZF9kdWVfY2FzaGZsb3dzOgogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAxMAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQ2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NTAKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjUxCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjUyCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo1NQogICAgLy8gcHJvY2Vzc2VkX2V2ZW50cyA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo1Ni01NwogICAgLy8gZnVuZGVkX2ludGVyZXN0ID0gVUludDY0KDApCiAgICAvLyBmdW5kZWRfcHJpbmNpcGFsID0gVUludDY0KDApCiAgICBkdXBuIDIKCmZ1bmRfZHVlX2Nhc2hmbG93c193aGlsZV90b3BAMjoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2MAogICAgLy8gcHJvY2Vzc2VkX2V2ZW50cyA8IG1heF9ldmVudF9jb3VudAogICAgZGlnIDIKICAgIGRpZyA0CiAgICA8CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjAtNjEKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgPCBtYXhfZXZlbnRfY291bnQKICAgIC8vIGFuZCBzZWxmLmV2ZW50X2N1cnNvciA8IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQKICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl93aGlsZUA5CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjEKICAgIC8vIGFuZCBzZWxmLmV2ZW50X2N1cnNvciA8IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgPAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjYwLTYxCiAgICAvLyBwcm9jZXNzZWRfZXZlbnRzIDwgbWF4X2V2ZW50X2NvdW50CiAgICAvLyBhbmQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAOQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjYzCiAgICAvLyBlbnRyeSA9IHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLmV2ZW50X2N1cnNvcikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICBkdXAKICAgIGJ1cnkgMTcKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2NAogICAgLy8gaWYgZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcDoKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSA2CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDkKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2NgogICAgLy8gaWYgbm90IHNlbGYuX2V2ZW50X2lzX2Nhc2goZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSk6CiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ1cnkgMTYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM1MQogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUCksCiAgICBpbnRjXzIgLy8gOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzUwLTM1NAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfTUQpLAogICAgLy8gKQogICAgPT0KICAgIGR1cAogICAgYnVyeSA3CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfdHJ1ZUA1MAogICAgZGlnIDE0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNTIKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNTAtMzU0CiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9NRCksCiAgICAvLyApCiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX3RydWVANTAKICAgIGRpZyAxNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzUzCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX01EKSwKICAgIHB1c2hpbnQgMTkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM1MC0zNTQKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX01EKSwKICAgIC8vICkKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUA1MQoKZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfdHJ1ZUA1MDoKICAgIGludGNfMSAvLyAxCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUA1MjoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2NgogICAgLy8gaWYgbm90IHNlbGYuX2V2ZW50X2lzX2Nhc2goZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSk6CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAOQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTQ4CiAgICAvLyBhc3NlcnQgZW50cnkuZXZlbnRfaWQgPT0gc2VsZi5ldmVudF9jdXJzb3IsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgZGlnIDE1CiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGN1cnNvcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTQ5CiAgICAvLyBhc3NlcnQgZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsIGVyci5OT19EVUVfQ0FTSEZMT1cKICAgIGRpZyA0CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA8PQogICAgYXNzZXJ0IC8vIE5vIGR1ZSBjYXNoZmxvdyB0byBwYXkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQxMwogICAgLy8gaWYgZXZlbnRfdHlwZSBub3QgaW4gKFVJbnQ2NChlbnVtcy5FVlRfSVApLCBVSW50NjQoZW51bXMuRVZUX01EKSk6CiAgICBkaWcgNQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDEzCiAgICBkaWcgMTQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQxNAogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTMKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9pbnRlcmVzdF9hbW91bnRAMTQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MjYKICAgIC8vIGV2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ1cnkgMTYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQyNwogICAgLy8gaWYgZXZlbnRfdHlwZSBub3QgaW4gKFVJbnQ2NChlbnVtcy5FVlRfUFIpLCBVSW50NjQoZW51bXMuRVZUX01EKSk6CiAgICBwdXNoaW50IDMKICAgID09CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTcKICAgIGRpZyAxNAogICAgcHVzaGludCAxOQogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDI4CiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyNjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MwogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZGlnIDE1CiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnVyeSAxMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTU2CiAgICAvLyBpZiBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKToKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDI3CiAgICBkaWcgOQogICAgYnVyeSAxMQoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzY6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzItNTc0CiAgICAvLyAjIEZ1bmRpbmcgdXNlcyBwZXItdW5pdCBjdW11bGF0aXZlIGluZGljZXMgc28gZWFjaCBob2xkZXIgY2FuIHNldHRsZQogICAgLy8gIyBpbmRlcGVuZGVudGx5IGZyb20gaXRzIGN1cnJlbnQgdW5pdCBiYWxhbmNlLgogICAgLy8gaW50ZXJlc3RfaW5kZXhfZGVsdGEgPSBzZWxmLl9hbW91bnRfdG9faW5kZXhfZGVsdGEoaW50ZXJlc3RfYW1vdW50X2R1ZSkKICAgIGRpZyAxMgogICAgY2FsbHN1YiBfYW1vdW50X3RvX2luZGV4X2RlbHRhCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzUKICAgIC8vIHByaW5jaXBhbF9pbmRleF9kZWx0YSA9IHNlbGYuX2Ftb3VudF90b19pbmRleF9kZWx0YShwcmluY2lwYWxfYW1vdW50X2R1ZSkKICAgIGRpZyA4CiAgICBjYWxsc3ViIF9hbW91bnRfdG9faW5kZXhfZGVsdGEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU3NgogICAgLy8gaW50ZXJlc3RfYW1vdW50ID0gc2VsZi5faW5kZXhfZGVsdGFfdG9fYW1vdW50KGludGVyZXN0X2luZGV4X2RlbHRhKQogICAgZGlnIDEKICAgIGNhbGxzdWIgX2luZGV4X2RlbHRhX3RvX2Ftb3VudAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBidXJ5IDE3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzcKICAgIC8vIHByaW5jaXBhbF9hbW91bnQgPSBzZWxmLl9pbmRleF9kZWx0YV90b19hbW91bnQocHJpbmNpcGFsX2luZGV4X2RlbHRhKQogICAgZHVwCiAgICBjYWxsc3ViIF9pbmRleF9kZWx0YV90b19hbW91bnQKICAgIGR1cAogICAgYnVyeSAxMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTc4CiAgICAvLyByZXF1aXJlZF9hbW91bnQgPSBpbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50CiAgICBkaWcgMgogICAgZGlnIDEKICAgICsKICAgIGR1cAogICAgYnVyeSAxMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzI3CiAgICAvLyBiYWxhbmNlID0gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYXNzZXJ0IC8vIGFjY291bnQgb3B0ZWQgaW50byBhc3NldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDU2CiAgICAvLyByZXR1cm4gc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCArIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX2ludGVyZXN0IGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIGV4aXN0cwogICAgZGlnIDEKICAgICsKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcyOQogICAgLy8gYXNzZXJ0IGJhbGFuY2UgPj0gcmVzZXJ2ZWRfdG90YWwsIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBkaWcgMgogICAgZGlnIDEKICAgID49CiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcyBmb3IgdGhlIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjczMAogICAgLy8gcmV0dXJuIGJhbGFuY2UgLSByZXNlcnZlZF90b3RhbAogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICAtCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1ODAKICAgIC8vIHNlbGYuX2F2YWlsYWJsZV9zZXR0bGVtZW50X2Z1bmRzKCkgPj0gcmVxdWlyZWRfYW1vdW50CiAgICB1bmNvdmVyIDIKICAgID49CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzktNTgxCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuX2F2YWlsYWJsZV9zZXR0bGVtZW50X2Z1bmRzKCkgPj0gcmVxdWlyZWRfYW1vdW50CiAgICAvLyApLCBlcnIuTk9UX0VOT1VHSF9GVU5EUwogICAgYXNzZXJ0IC8vIE5vdCBlbm91Z2ggZnVuZHMgZm9yIHRoZSBwYXltZW50CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1ODMKICAgIC8vIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgKz0gaW50ZXJlc3RfYW1vdW50CiAgICB1bmNvdmVyIDMKICAgICsKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1ODQKICAgIC8vIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsICs9IHByaW5jaXBhbF9hbW91bnQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgICsKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTg1CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggKz0gaW50ZXJlc3RfaW5kZXhfZGVsdGEKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IGV4aXN0cwogICAgdW5jb3ZlciAyCiAgICArCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1ODYKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggKz0gcHJpbmNpcGFsX2luZGV4X2RlbHRhCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTcgLy8gImN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IGV4aXN0cwogICAgKwogICAgYnl0ZWMgMTcgLy8gImN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4NwogICAgLy8gaWYgZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSA9PSBVSW50NjQoZW51bXMuRVZUX1BSKToKICAgIGRpZyAxNQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19lbHNlX2JvZHlAMzgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4OC01ODkKICAgIC8vICMgRm9yIFBSLCB0aGUgcGVyaW9kIGludGVyZXN0IHN0YXlzIGFjY3J1ZWQgdW50aWwgYSBsYXRlciBJUCBvciBNRC4KICAgIC8vIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCArPSBzZWxmLl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KGVudHJ5KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgIGRpZyAxNgogICAgY2FsbHN1YiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudAogICAgYnVyeSAxOAogICAgKwogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzOToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5MgogICAgLy8gaWYgbm90IHNlbGYuX2lzX2R5bmFtaWNfYW5udWl0eSgpIG9yIGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkgPT0gVUludDY0KAogICAgY2FsbHN1YiBfaXNfZHluYW1pY19hbm51aXR5CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUA0MQogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTkyLTU5NAogICAgLy8gaWYgbm90IHNlbGYuX2lzX2R5bmFtaWNfYW5udWl0eSgpIG9yIGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkgPT0gVUludDY0KAogICAgLy8gICAgIGVudW1zLkVWVF9NRAogICAgLy8gKToKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0MgoKZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlANDE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTUKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IGVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGRpZyAxNQogICAgcHVzaGludCA0MQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTk2CiAgICAvLyBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9IG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBkaWcgMTAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTcKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IG5leHRfaW50ZXJlc3RfYmFzZQogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGRpZyAxMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5OAogICAgLy8gc2VsZi5ldmVudF9jdXJzb3IgKz0gVUludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAwCiAgICAvLyBpZiBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoCiAgICBkaWcgMTUKICAgIGV4dHJhY3QgOCAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MDAtNjAyCiAgICAvLyBpZiBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoCiAgICAvLyAgICAgZW51bXMuRVZUX01ECiAgICAvLyApIGFuZCBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9PSBVSW50NjQoMCk6CiAgICBwdXNoYnl0ZXMgMHgxMwogICAgYj09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0NQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAyCiAgICAvLyApIGFuZCBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9PSBVSW50NjQoMCk6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwMC02MDIKICAgIC8vIGlmIGVudHJ5LmV2ZW50X3R5cGUgPT0gYXJjNC5VSW50OCgKICAgIC8vICAgICBlbnVtcy5FVlRfTUQKICAgIC8vICkgYW5kIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID09IFVJbnQ2NCgwKToKICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0NQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAzCiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbnVtcy5TVEFUVVNfRU5ERUQpCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBwdXNoaW50IDIwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwNAogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gVUludDY0KDApCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0NToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwNi02MTAKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1pbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50LAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PWludGVyZXN0X2Ftb3VudCArIHByaW5jaXBhbF9hbW91bnQsCiAgICAvLyApCiAgICBkaWcgMTUKICAgIGRpZyA3CiAgICBkdXAKICAgIGNhbGxzdWIgX2VtaXRfZXhlY3V0aW9uX2V2ZW50CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3MAogICAgLy8gZnVuZGVkX2ludGVyZXN0ICs9IGludGVyZXN0X2Ftb3VudAogICAgZGlnIDEKICAgIGRpZyAxNAogICAgKwogICAgYnVyeSAyCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzEKICAgIC8vIGZ1bmRlZF9wcmluY2lwYWwgKz0gcHJpbmNpcGFsX2Ftb3VudAogICAgZHVwCiAgICBkaWcgOQogICAgKwogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzIKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgKz0gVUludDY0KDEpCiAgICBkaWcgMgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMwogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3Nfd2hpbGVfdG9wQDIKCmZ1bmRfZHVlX2Nhc2hmbG93c19lbHNlX2JvZHlAMzg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTEKICAgIC8vIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzOQoKZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlAMjc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTcKICAgIC8vIGV2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ1cnkgMTYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1OC01NjAKICAgIC8vICMgRHluYW1pYyBhbm51aXRpZXMgZGVyaXZlIG5leHQgc3RhdGUgZnJvbSB0aGUgcGF5bWVudCBkZWNvbXBvc2l0aW9uLAogICAgLy8gIyBub3Qgb25seSBmcm9tIHRoZSBwcmVjb21wdXRlZCBgbmV4dF8qYCBmaWVsZHMuCiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpOgogICAgcHVzaGludCAzCiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUAyOQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTYyCiAgICAvLyBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCAtIHByaW5jaXBhbF9hbW91bnRfZHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGRpZyA4CiAgICAtCiAgICBkdXAKICAgIGJ1cnkgMTEKICAgIGJ1cnkgMTEKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzYKCmZ1bmRfZHVlX2Nhc2hmbG93c19lbHNlX2JvZHlAMjk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjUKICAgIC8vIGVsaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX0lQKToKICAgIGRpZyAxNAogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDMxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjYKICAgIC8vIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgYnVyeSAxMQogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY3CiAgICAvLyBuZXh0X2ludGVyZXN0X2Jhc2UgPSBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGJ1cnkgMTIKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgZXhpc3RzCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDMxOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY4CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCk6CiAgICBkaWcgMTQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlAMzIKICAgIGRpZyA5CiAgICBidXJ5IDExCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUAzMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU2OQogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDEwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzAKICAgIC8vIG5leHRfaW50ZXJlc3RfYmFzZSA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTEKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzYKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDI5CiAgICAvLyBpZiBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKToKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzMAogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKToKICAgIGRpZyAxNAogICAgcHVzaGludCAxOQogICAgPT0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDIwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzEKICAgIC8vIHJldHVybiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBidXJ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyNgoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzIKICAgIC8vIGludGVyZXN0X2R1ZSA9IHNlbGYuYWNjcnVlZF9pbnRlcmVzdCArIHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZGlnIDE2CiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBidXJ5IDE4CiAgICArCiAgICBkdXAKICAgIGJ1cnkgMTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzMwogICAgLy8gaWYgc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIDw9IGludGVyZXN0X2R1ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIGV4aXN0cwogICAgPj0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDIyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzQKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyNgoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzUKICAgIC8vIHByaW5jaXBhbF9hbW91bnQgPSBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gLSBpbnRlcmVzdF9kdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIGV4aXN0cwogICAgZGlnIDEyCiAgICAtCiAgICBkdXAKICAgIGJ1cnkgMTAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzNgogICAgLy8gaWYgcHJpbmNpcGFsX2Ftb3VudCA+IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICA+CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDM3CiAgICAvLyByZXR1cm4gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTIKICAgIC8vIHByaW5jaXBhbF9hbW91bnRfZHVlID0gc2VsZi5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudChlbnRyeSkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnRAMjYKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDI0OgogICAgZGlnIDgKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTUyCiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyNToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ0MAogICAgLy8gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwgPD0gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGRpZyAxNQogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgZHVwMgogICAgPD0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzOS00NDEKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwgPD0gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDQyCiAgICAvLyByZXR1cm4gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgLSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgc3dhcAogICAgLQogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTIKICAgIC8vIHByaW5jaXBhbF9hbW91bnRfZHVlID0gc2VsZi5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudChlbnRyeSkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnRAMjYKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDE1CiAgICAvLyByZXR1cm4gc2VsZi5hY2NydWVkX2ludGVyZXN0ICsgc2VsZi5fZW50cnlfaW50ZXJlc3Rfc2VnbWVudChlbnRyeSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBkaWcgMTYKICAgIGNhbGxzdWIgX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQKICAgIGJ1cnkgMTgKICAgICsKICAgIGJ1cnkgMTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MQogICAgLy8gaW50ZXJlc3RfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X2ludGVyZXN0X2Ftb3VudChlbnRyeSkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X2ludGVyZXN0X2Ftb3VudEAxNAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDk6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzQKICAgIC8vIGFzc2VydCBwcm9jZXNzZWRfZXZlbnRzID4gVUludDY0KDApLCBlcnIuTk9fRFVFX0NBU0hGTE9XCiAgICBkaWcgMgogICAgZHVwCiAgICBhc3NlcnQgLy8gTm8gZHVlIGNhc2hmbG93IHRvIHBheQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojc4CiAgICAvLyB0b3RhbF9mdW5kZWQ9ZnVuZGVkX2ludGVyZXN0ICsgZnVuZGVkX3ByaW5jaXBhbCwKICAgIGRpZyAyCiAgICBkdXAKICAgIGRpZyAzCiAgICBkdXAKICAgIGNvdmVyIDMKICAgICsKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4MAogICAgLy8gdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojc1LTgxCiAgICAvLyByZXR1cm4gdHlwLkNhc2hGdW5kaW5nUmVzdWx0KAogICAgLy8gICAgIGZ1bmRlZF9pbnRlcmVzdD1mdW5kZWRfaW50ZXJlc3QsCiAgICAvLyAgICAgZnVuZGVkX3ByaW5jaXBhbD1mdW5kZWRfcHJpbmNpcGFsLAogICAgLy8gICAgIHRvdGFsX2Z1bmRlZD1mdW5kZWRfaW50ZXJlc3QgKyBmdW5kZWRfcHJpbmNpcGFsLAogICAgLy8gICAgIHByb2Nlc3NlZF9ldmVudHM9cHJvY2Vzc2VkX2V2ZW50cywKICAgIC8vICAgICB0aW1lc3RhbXA9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQ2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX2ZhbHNlQDUxOgogICAgaW50Y18wIC8vIDAKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfbWVyZ2VANTIKCgovLyBtb2R1bGVzLnBheW1lbnRfYWdlbnQuUGF5bWVudEFnZW50LmNsYWltX2R1ZV9jYXNoZmxvd3Nbcm91dGluZ10oKSAtPiB2b2lkOgpjbGFpbV9kdWVfY2FzaGZsb3dzOgogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDIKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE0CiAgICAvLyBpZiBzZWxmLm9wX2RhZW1vbi52YWx1ZSAhPSBHbG9iYWwuemVyb19hZGRyZXNzOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI1IC8vIDB4NTIyMzRmNzA0NDYxNjU2ZDZmNmUyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wX2RhZW1vbiBleGlzdHMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE2CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjUgLy8gMHg1MjIzNGY3MDQ0NjE2NTZkNmY2ZTIzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BfZGFlbW9uIGV4aXN0cwogICAgPT0KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNi0xOAogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICBibnogY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX3RydWVAMTQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNwogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIHR4biBTZW5kZXIKICAgIGRpZyAzCiAgICA9PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE2LTE4CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIGJueiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfdHJ1ZUAxNAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE4CiAgICAvLyBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgdHhuIFNlbmRlcgogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgMzIKICAgID09CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTYtMTgKICAgIC8vIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICAvLyBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgYnogY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX2ZhbHNlQDE1CgpjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfdHJ1ZUAxNDoKICAgIGludGNfMSAvLyAxCgpjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfbWVyZ2VAMTY6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTUtMTkKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgLy8gICAgIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICAvLyAgICAgb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIC8vICksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAoKY2xhaW1fZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE3OgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojk0CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojk1CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5OAogICAgLy8gc2VsZi5fZW5zdXJlX3VuaXRzX2FjdGl2YXRlZChob2xkaW5nX2FkZHJlc3MpCiAgICBkaWcgMgogICAgZHVwCiAgICBjYWxsc3ViIF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6OTkKICAgIC8vIHNlbGYuX3NldHRsZV9wb3NpdGlvbihob2xkaW5nX2FkZHJlc3MpCiAgICBjYWxsc3ViIF9zZXR0bGVfcG9zaXRpb24KICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExNwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY2xhaW1hYmxlX2ludGVyZXN0CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBkdXAKICAgIHB1c2hpbnQgNzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExOAogICAgLy8gKyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jbGFpbWFibGVfcHJpbmNpcGFsCiAgICBkdXAKICAgIHB1c2hpbnQgODEKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExNy0xMTgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNsYWltYWJsZV9pbnRlcmVzdAogICAgLy8gKyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jbGFpbWFibGVfcHJpbmNpcGFsCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTAxCiAgICAvLyBhc3NlcnQgdG90YWxfYW1vdW50ID4gVUludDY0KDApLCBlcnIuTk9fRFVFX0NBU0hGTE9XCiAgICBhc3NlcnQgLy8gTm8gZHVlIGNhc2hmbG93IHRvIHBheQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MuaXNfb3B0ZWRfaW4oCiAgICBleHRyYWN0IDAgMzIKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNQogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNC0yNgogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLmlzX29wdGVkX2luKAogICAgLy8gICAgIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZAogICAgLy8gKQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNC0yNwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLmlzX29wdGVkX2luKAogICAgLy8gICAgIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZAogICAgLy8gKQogICAgLy8gYW5kIG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQKICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAyNAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI3CiAgICAvLyBhbmQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCAzODQKICAgIGdldGJpdAogICAgYm56IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAyNAogICAgaW50Y18xIC8vIDEKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUAyNToKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMDYKICAgIC8vIGlmIHNlbGYuX2lzX3BheW1lbnRfZXhlY3V0YWJsZShob2xkaW5nX2FkZHJlc3MpOgogICAgYnogY2xhaW1fZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozMwogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIHN3YXAKICAgIGRpZyAxCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozMy0zNAogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIC8vID49IHBheW1lbnRfYW1vdW50CiAgICBkaWcgNQogICAgZHVwCiAgICBjb3ZlciAyCiAgICA+PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjMyLTM1CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICAvLyAgICAgPj0gcGF5bWVudF9hbW91bnQKICAgIC8vICksIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcyBmb3IgdGhlIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMDgKICAgIC8vIHNlbGYuX3BheShzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MsIHRvdGFsX2Ftb3VudCkKICAgIGRpZyAyCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBkdXAKICAgIGV4dHJhY3QgMCAzMgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjM5LTQ0CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9cmVjZWl2ZXIsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWFtb3VudCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQzCiAgICAvLyBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgdW5jb3ZlciAzCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIHVuY292ZXIgMgogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozOQogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgcHVzaGludCA0IC8vIGF4ZmVyCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjM5LTQ0CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9cmVjZWl2ZXIsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWFtb3VudCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMjUtMTI2CiAgICAvLyAjIEdldCB0aGUgY2xhaW1hYmxlIGFtb3VudHMgYmVmb3JlIHJlc2V0CiAgICAvLyBpbnRlcmVzdF9hbW91bnQgPSBwb3NpdGlvbi5jbGFpbWFibGVfaW50ZXJlc3QKICAgIGR1cAogICAgcHVzaGludCA3MwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSA5CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTI3CiAgICAvLyBwcmluY2lwYWxfYW1vdW50ID0gcG9zaXRpb24uY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgZHVwCiAgICBwdXNoaW50IDgxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAzCiAgICBidXJ5IDkKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMjktMTMwCiAgICAvLyAjIFJlc2V0IHRoZSBwb3NpdGlvbidzIGNsYWltYWJsZSBhbW91bnRzCiAgICAvLyBwb3NpdGlvbi5jbGFpbWFibGVfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBpdG9iCiAgICBzd2FwCiAgICBkaWcgMQogICAgcmVwbGFjZTIgNzMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzEKICAgIC8vIHBvc2l0aW9uLmNsYWltYWJsZV9wcmluY2lwYWwgPSBVSW50NjQoMCkKICAgIHN3YXAKICAgIHJlcGxhY2UyIDgxCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTMyCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHBvc2l0aW9uLmNvcHkoKQogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTM0CiAgICAvLyBhc3NlcnQgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCA+PSBpbnRlcmVzdF9hbW91bnQsIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX2ludGVyZXN0IGV4aXN0cwogICAgZHVwCiAgICBkaWcgMgogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzNQogICAgLy8gYXNzZXJ0IHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsID49IHByaW5jaXBhbF9hbW91bnQsIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICBkaWcgMwogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzNy0xMzgKICAgIC8vICMgVXBkYXRlIHRoZSBnbG9iYWwgcmVzZXJ2ZWQgaW50ZXJlc3QgYW5kIHByaW5jaXBhbCBhbW91bnRzCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0IC09IGludGVyZXN0X2Ftb3VudAogICAgc3dhcAogICAgLQogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzkKICAgIC8vIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIC09IHByaW5jaXBhbF9hbW91bnQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIHN3YXAKICAgIC0KICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKY2xhaW1fZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTE0CiAgICAvLyB0b3RhbF9hbW91bnQ9aW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudCwKICAgIGRpZyA1CiAgICBkdXAKICAgIGRpZyA2CiAgICBkdXAKICAgIGNvdmVyIDMKICAgICsKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMTUKICAgIC8vIHRpbWVzdGFtcD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMTEtMTE3CiAgICAvLyByZXR1cm4gdHlwLkNhc2hDbGFpbVJlc3VsdCgKICAgIC8vICAgICBpbnRlcmVzdF9hbW91bnQ9aW50ZXJlc3RfYW1vdW50LAogICAgLy8gICAgIHByaW5jaXBhbF9hbW91bnQ9cHJpbmNpcGFsX2Ftb3VudCwKICAgIC8vICAgICB0b3RhbF9hbW91bnQ9aW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudCwKICAgIC8vICAgICB0aW1lc3RhbXA9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgY29udGV4dD1wYXltZW50X2luZm8sCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgMgogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIHB1c2hieXRlcyAweDAwMjIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX2ZhbHNlQDI0OgogICAgaW50Y18wIC8vIDAKICAgIGIgY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDI1CgpjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VAMTU6CiAgICBpbnRjXzAgLy8gMAogICAgYiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfbWVyZ2VAMTYKCgovLyBtb2R1bGVzLnRyYW5zZmVyX2FnZW50LlRyYW5zZmVyQWdlbnQudHJhbnNmZXJfc2V0X3NjaGVkdWxlW3JvdXRpbmddKCkgLT4gdm9pZDoKdHJhbnNmZXJfc2V0X3NjaGVkdWxlOgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjI2CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MjcKICAgIC8vIGFzc2VydCBvcGVuX2RhdGUgPCBjbG9zdXJlX2RhdGUsIGVyci5JTlZBTElEX1NPUlRJTkcKICAgIGR1cDIKICAgIDwKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBtdXN0IGJlIHNvcnRlZCBpbiBzdHJpY3RseSBhc2NlbmRpbmcgb3JkZXIKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MjkKICAgIC8vIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlID0gb3Blbl9kYXRlCiAgICBieXRlYyAyNyAvLyAidHJhbnNmZXJfb3BlbmluZ19kYXRlIgogICAgdW5jb3ZlciAyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTozMAogICAgLy8gc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGUgPSBjbG9zdXJlX2RhdGUKICAgIGJ5dGVjIDI4IC8vICJ0cmFuc2Zlcl9jbG9zdXJlX2RhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTozMQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnRyYW5zZmVyX2FnZW50LlRyYW5zZmVyQWdlbnQucHJpbWFyeV9kaXN0cmlidXRpb25bcm91dGluZ10oKSAtPiB2b2lkOgpwcmltYXJ5X2Rpc3RyaWJ1dGlvbjoKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzEKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnByaW1hcnlfZGVhbGVyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjIgLy8gMHg1MjIzNTA3MjY5NmQ2MTcyNzk0NDY1NjE2YzY1NzIyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo0MwogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDQKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo0NQogICAgLy8gYXNzZXJ0IHNlbGYuX3N0YXR1c19pc19wZW5kaW5nX2llZCgpLCBlcnIuUFJJTUFSWV9ESVNUUklCVVRJT05fQ0xPU0VECiAgICBhc3NlcnQgLy8gUHJpbWFyeSBkaXN0cmlidXRpb24gaXMgY2xvc2VkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBjb3ZlciAzCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQ3CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKGhvbGRpbmdfYWRkcmVzcykKICAgIHN3YXAKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDgKICAgIC8vIGFzc2VydCB1bml0cyA+IFVJbnQ2NCgwKSwgZXJyLlpFUk9fVU5JVFMKICAgIGR1cAogICAgYXNzZXJ0IC8vIENhbiBub3QgZGlzdHJpYnV0ZSB6ZXJvIHVuaXRzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjUwCiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsICsgdW5pdHMgPD0gc2VsZi50b3RhbF91bml0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCBleGlzdHMKICAgICsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICA8PQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo0OS01MQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsICsgdW5pdHMgPD0gc2VsZi50b3RhbF91bml0cwogICAgLy8gKSwgZXJyLk9WRVJfRElTVFJJQlVUSU9OCiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IHJlbWFpbmluZyBELUFTQSB1bml0cwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo1MgogICAgLy8gaWYgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjYgLy8gImluaXRpYWxfZXhjaGFuZ2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGUgZXhpc3RzCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NTQKICAgIC8vIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDw9IHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjYgLy8gImluaXRpYWxfZXhjaGFuZ2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGUgZXhpc3RzCiAgICA8PQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo1My01NQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8PSBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZQogICAgLy8gKSwgZXJyLlBSSU1BUllfRElTVFJJQlVUSU9OX0NMT1NFRAogICAgYXNzZXJ0IC8vIFByaW1hcnkgZGlzdHJpYnV0aW9uIGlzIGNsb3NlZAoKcHJpbWFyeV9kaXN0cmlidXRpb25fYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE0OAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucmVzZXJ2ZWRfdW5pdHMgKz0gdW5pdHMKICAgIGR1cG4gMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHB1c2hpbnQgNDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMwogICAgZHVwCiAgICBjb3ZlciAzCiAgICArCiAgICBpdG9iCiAgICBwdXNoaW50IDQwCiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo1OAogICAgLy8gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCArPSB1bml0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCBleGlzdHMKICAgICsKICAgIGJ5dGVjIDEwIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo1OQogICAgLy8gcmV0dXJuIHNlbGYudG90YWxfdW5pdHMgLSBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgc3dhcAogICAgLQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTozMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy50cmFuc2Zlcl9hZ2VudC5UcmFuc2ZlckFnZW50LnRyYW5zZmVyW3JvdXRpbmddKCkgLT4gdm9pZDoKdHJhbnNmZXI6CiAgICBpbnRjXzAgLy8gMAogICAgZHVwCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXBuIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo3NQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NzYKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQ3CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuX3N0YXR1c19pc19wZW5kaW5nX2llZCgpLCBlcnIuUEVORElOR19JRUQKICAgICEKICAgIGFzc2VydCAvLyBJRUQgbm90IHlldCBleGVjdXRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxMwogICAgLy8gaWYgc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjcgLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICBieiB0cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTUKICAgIC8vIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjcgLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNC0xNgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gKSwgZXJyLkNMT1NFRF9UUkFOU0ZFUgogICAgYXNzZXJ0IC8vIFRyYW5zZmVyIGlzIGNsb3NlZAoKdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNwogICAgLy8gaWYgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjggLy8gInRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICBieiB0cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTkKICAgIC8vIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDwgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGUKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyOCAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIDwKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTgtMjAKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZQogICAgLy8gKSwgZXJyLkNMT1NFRF9UUkFOU0ZFUgogICAgYXNzZXJ0IC8vIFRyYW5zZmVyIGlzIGNsb3NlZAoKdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4MAogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gc2VuZGVyX2hvbGRpbmdfYWRkcmVzcywgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA4CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIGJ5dGVjIDggLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQyMwogICAgZGlnIDUKICAgIGR1cAogICAgY292ZXIgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgOQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4MwogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChzZW5kZXJfaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDIKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODQKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQocmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzKQogICAgZHVwCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojg1CiAgICAvLyBhc3NlcnQgc2VuZGVyX2hvbGRpbmdfYWRkcmVzcyAhPSByZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3MsIGVyci5TRUxGX1RSQU5TRkVSCiAgICB1bmNvdmVyIDIKICAgICE9CiAgICBhc3NlcnQgLy8gU2VuZGVyIGFuZCByZWNlaXZlciBtdXN0IGJlIGRpZmZlcmVudAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4NgogICAgLy8gYXNzZXJ0IHVuaXRzID4gVUludDY0KDApLCBlcnIuTlVMTF9UUkFOU0ZFUgogICAgZGlnIDEKICAgIGR1cAogICAgYXNzZXJ0IC8vIFRyYW5zZmVyIHVuaXRzIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODcKICAgIC8vIGFzc2VydCB1bml0cyA8PSBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMsIGVyci5PVkVSX1RSQU5TRkVSCiAgICBzd2FwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgPD0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgc2VuZGVyIHVuaXRzIHRvIHRyYW5zZmVyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NTYKICAgIC8vIGlmIHNlbGYuZXZlbnRfY3Vyc29yID49IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQ6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgID49CiAgICBibnogdHJhbnNmZXJfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYXNzZXJ0X25vX2R1ZV9ldmVudF9wZW5kaW5nQDEwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NTgKICAgIC8vIG5leHRfZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoc2VsZi5ldmVudF9jdXJzb3IpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzYwCiAgICAvLyBuZXh0X2VudHJ5LnNjaGVkdWxlZF90aW1lID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgID4KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc1OS03NjEKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgbmV4dF9lbnRyeS5zY2hlZHVsZWRfdGltZSA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyApLCBlcnIuUEVORElOR19BQ1RVU19FVkVOVAogICAgYXNzZXJ0IC8vIEFDVFVTIGV2ZW50IG5vdCB5ZXQgZXhlY3V0ZWQKCnRyYW5zZmVyX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Fzc2VydF9ub19kdWVfZXZlbnRfcGVuZGluZ0AxMDoKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6OTAKICAgIC8vIHNlbGYuX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQoc2VuZGVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGRpZyAzCiAgICBkdXAKICAgIGNhbGxzdWIgX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6OTEKICAgIC8vIHNlbGYuX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQocmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgY2FsbHN1YiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo5MgogICAgLy8gc2VsZi5fc2V0dGxlX3Bvc2l0aW9uKHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBjYWxsc3ViIF9zZXR0bGVfcG9zaXRpb24KICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo5MwogICAgLy8gc2VsZi5fc2V0dGxlX3Bvc2l0aW9uKHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGNhbGxzdWIgX3NldHRsZV9wb3NpdGlvbgogICAgcG9wbiAyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTUyCiAgICAvLyBhc3NlcnQgdW5pdHMgPD0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMsIGVyci5PVkVSX1RSQU5TRkVSCiAgICBkaWcgNQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgZGlnIDEKICAgIDw9CiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IHNlbmRlciB1bml0cyB0byB0cmFuc2ZlcgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE1MwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMgLT0gdW5pdHMKICAgIGRpZyAxCiAgICAtCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGludGNfMyAvLyAzMgogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE0NAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMgKz0gdW5pdHMKICAgIGRpZyA1CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICB1bmNvdmVyIDIKICAgICsKICAgIGl0b2IKICAgIGludGNfMyAvLyAzMgogICAgc3dhcAogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBkaWcgMgogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5hY2NvdW50X3N1c3BlbnNpb25bcm91dGluZ10oKSAtPiB2b2lkOgphY2NvdW50X3N1c3BlbnNpb246CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTY1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo3NwogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYXV0aG9yaXR5LCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjEgLy8gMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTg1CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGR1cAogICAgcHVzaGludCA0OAogICAgaW50Y18xIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIHB1c2hpbnQgNDgKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTg2CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfb3Blbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfb3BlbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2OAogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjMgLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQ0ZDYxNmU2MTY3NjU3MjIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzkKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0VOREVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDIwMAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTAKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX2VuZGVkKCksIGVyci5VTkFVVEhPUklaRUQKICAgICEKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxMQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTIKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjEzCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzQKICAgIC8vIHVuaXRzPVVJbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzItNDIKICAgIC8vIHJldHVybiB0eXAuQWNjb3VudFBvc2l0aW9uKAogICAgLy8gICAgIHBheW1lbnRfYWRkcmVzcz1wYXltZW50X2FkZHJlc3MsCiAgICAvLyAgICAgdW5pdHM9VUludDY0KDApLAogICAgLy8gICAgIHJlc2VydmVkX3VuaXRzPVVJbnQ2NCgwKSwKICAgIC8vICAgICBzdXNwZW5kZWQ9RmFsc2UsCiAgICAvLyAgICAgc2V0dGxlZF9jdXJzb3I9VUludDY0KDApLAogICAgLy8gICAgIGludGVyZXN0X2NoZWNrcG9pbnQ9VUludDY0KDApLAogICAgLy8gICAgIHByaW5jaXBhbF9jaGVja3BvaW50PVVJbnQ2NCgwKSwKICAgIC8vICAgICBjbGFpbWFibGVfaW50ZXJlc3Q9VUludDY0KDApLAogICAgLy8gICAgIGNsYWltYWJsZV9wcmluY2lwYWw9VUludDY0KDApLAogICAgLy8gKQogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBieXRlYyA0MCAvLyAweDAwCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxNAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSBzZWxmLl9uZXdfYWNjb3VudF9wb3NpdGlvbihwYXltZW50X2FkZHJlc3MpCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjE1CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzczoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMzgKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcywgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgdW5jb3ZlciAzCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjM5CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0MAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDEKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcyA9IHBheW1lbnRfYWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDIKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF9nZXRfcG9zaXRpb25bcm91dGluZ10oKSAtPiB2b2lkOgphY2NvdW50X2dldF9wb3NpdGlvbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNTkKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9jcmVhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9jcmVhdGU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5ODAKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSBhcnJhbmdlcgogICAgYnl0ZWMgMTggLy8gMHg1MjIzNDE3MjcyNjE2ZTY3NjU3MjIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTgxCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfY29uZmlnW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfY29uZmlnOgogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGxlbgogICAgcHVzaGludCAxMDcKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuTm9ybWFsaXplZEFjdHVzVGVybXMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDcyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLkluaXRpYWxLZXJuZWxTdGF0ZQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIGxlbgogICAgZGlnIDEKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgdHVwbGUgZW5jb2RpbmcKICAgIGR1cAogICAgcHVzaGludCAzNAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHRhaWwgcG9pbnRlciBhdCBpbmRleCAxIG9mICh1aW50OFszMl0sKGxlbit1dGY4W10pKQogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBjb3ZlciAzCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAzNgogICAgKwogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5Qcm9zcGVjdHVzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDEyCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMTQtMTAxNQogICAgLy8gIyBDb25maWd1cmUgQ29udHJhY3QKICAgIC8vIHNlbGYuY29udHJhY3RfdHlwZSA9IHRlcm1zLmNvbnRyYWN0X3R5cGUuYXNfdWludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ5dGVjIDEyIC8vICJjb250cmFjdF90eXBlIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICBieiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIwCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfQU5OKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjEKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgcHVzaGludCAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjIKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjMKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgcHVzaGludCA0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjQKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYnogY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAOAoKY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUA3OgogICAgaW50Y18xIC8vIDEKCmNvbnRyYWN0X2NvbmZpZ19ib29sX21lcmdlQDk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjkKICAgIC8vIGFzc2VydCBzZWxmLl9pc19zdXBwb3J0ZWRfY29udHJhY3RfdHlwZShjb250cmFjdF90eXBlKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDE3CiAgICAvLyBzZWxmLl9zdG9yZV9jb250cmFjdF9jb25maWcoc2VsZi5jb250cmFjdF90eXBlLCB0ZXJtcywgaW5pdGlhbF9zdGF0ZSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBidXJ5IDIKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMjUKICAgIC8vIGFzc2VydCB0ZXJtcy5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBkaWcgNAogICAgZHVwCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDgKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMyNwogICAgLy8gdGVybXMuZGF5X2NvdW50X2NvbnZlbnRpb24uYXNfdWludDY0KCkKICAgIHB1c2hpbnQgNTcKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyOTctMzAzCiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgIGJ6IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGRpZyA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyOTkKICAgIC8vIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGRpZyA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDAKICAgIC8vIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICBwdXNoaW50IDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI5Ny0zMDMKICAgIC8vIHJldHVybiBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzYwKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwSVNEQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjApLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDE2CiAgICBkaWcgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzAxCiAgICAvLyBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyOTctMzAzCiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgID09CiAgICBibnogY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUAxNgogICAgZGlnIDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMwMgogICAgLy8gVUludDY0KGVudW1zLkRDQ18zMEUzNjApLAogICAgcHVzaGludCA0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyOTctMzAzCiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgID09CiAgICBieiBjb250cmFjdF9jb25maWdfYm9vbF9mYWxzZUAxNwoKY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUAxNjoKICAgIGludGNfMSAvLyAxCgpjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUAxODoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMwOS0zMTEKICAgIC8vIGFzc2VydCBzZWxmLl9pc19zdXBwb3J0ZWRfZGF5X2NvdW50X2NvbnZlbnRpb24oCiAgICAvLyAgICAgZGF5X2NvdW50X2NvbnZlbnRpb24KICAgIC8vICksIGVyci5JTlZBTElEX0RBWV9DT1VOVF9DT05WRU5USU9OCiAgICBhc3NlcnQgLy8gSW52YWxpZCBkYXktY291bnQgY29udmVudGlvbiBJRAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzI5CiAgICAvLyBpZiBjb250cmFjdF90eXBlICE9IFVJbnQ2NChlbnVtcy5DVF9BTk4pOgogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgIT0KICAgIGJ6IGNvbnRyYWN0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDIwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzAKICAgIC8vIGFzc2VydCBub3QgdGVybXMuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBkaWcgNAogICAgcHVzaGludCA3ODYKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgoKY29udHJhY3RfY29uZmlnX2FmdGVyX2lmX2Vsc2VAMjA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MDAKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MDEKICAgIC8vIGFzc2VydCBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID09IFVJbnQ2NCgwKSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBELUFTQSBhbHJlYWR5IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgwMy04MDQKICAgIC8vICMgU2V0IERlbm9taW5hdGlvbiBBc3NldAogICAgLy8gc2VsZi5fYXNzZXJ0X2Rlbm9taW5hdGlvbl9hc3NldCh0ZXJtcy5kZW5vbWluYXRpb25fYXNzZXRfaWQpCiAgICBkaWcgNAogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc2OC03NjkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gZGVub21pbmF0aW9uIHdpdGggQVNBCiAgICAvLyBfY3JlYXRvciwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfY3JlYXRvcihkZW5vbWluYXRpb25fYXNzZXRfaWQpCiAgICBkdXAKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc3MAogICAgLy8gYXNzZXJ0IGV4aXN0cywgZXJyLklOVkFMSURfREVOT01JTkFUSU9OCiAgICBhc3NlcnQgLy8gRGVub21pbmF0aW9uIGFzc2V0IGlzIG5vdCBwcm9wZXJseSBzZXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc3MwogICAgLy8gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgPSBkZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIGJ5dGVjIDQ0IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgwNy04MDgKICAgIC8vICMgU2V0IFNldHRsZW1lbnQgQXNzZXQKICAgIC8vIHNlbGYuX2Fzc2VydF9zZXR0bGVtZW50X2Fzc2V0KHRlcm1zLnNldHRsZW1lbnRfYXNzZXRfaWQpCiAgICBkaWcgMQogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Nzc4CiAgICAvLyBzZXR0bGVtZW50X2Fzc2V0X2lkID09IHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc3Ni03NzkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzZXR0bGVtZW50IGFzc2V0IGlzIHRoZSBkZW5vbWluYXRpb24gYXNzZXQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgLy8gKSwgZXJyLklOVkFMSURfU0VUVExFTUVOVF9BU1NFVAogICAgYXNzZXJ0IC8vIERpZmZlcmVudCBzZXR0bGVtZW50IGFzc2V0IG5vdCBzdXBwb3J0ZWQsIG11c3QgYmUgZXF1YWwgdG8gZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODIKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCA9IHNldHRsZW1lbnRfYXNzZXRfaWQKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODMtNzg5CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODgKICAgIC8vIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODYKICAgIC8vIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Nzg3CiAgICAvLyBhc3NldF9hbW91bnQ9MCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODMtNzg0CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc4My03ODkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gc2V0dGxlbWVudCB3aXRoIEFTQQogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PTAsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTEtODEyCiAgICAvLyAjIFVuaXRzCiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzID0gdGVybXMudG90YWxfdW5pdHMKICAgIGR1cAogICAgcHVzaGludCAxNwogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTMKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDEwIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODE1LTgxNgogICAgLy8gIyBEYXktQ291bnQgQ29udmVudGlvbnMKICAgIC8vIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPSB0ZXJtcy5kYXlfY291bnRfY29udmVudGlvbi5hc191aW50NjQoKQogICAgYnl0ZWMgNDYgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgZGlnIDgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTgtODE5CiAgICAvLyAjIFRpbWUKICAgIC8vIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlID0gdGVybXMuaW5pdGlhbF9leGNoYW5nZV9kYXRlCiAgICBkdXAKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAyNiAvLyAiaW5pdGlhbF9leGNoYW5nZV9kYXRlIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MjAKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IHRlcm1zLm1hdHVyaXR5X2RhdGUKICAgIGRpZyAxCiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNDUgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgyMQogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gaW5pdGlhbF9zdGF0ZS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBkaWcgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBwdXNoaW50IDQ4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODIzLTgyNAogICAgLy8gIyBQcmluY2lwYWwKICAgIC8vIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPSB0ZXJtcy5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudAogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgZGlnIDEwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODI1CiAgICAvLyBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSB0ZXJtcy5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBkaWcgMwogICAgcHVzaGludCA3ODYKICAgIGdldGJpdAogICAgYnl0ZWMgMzQgLy8gImR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODI2CiAgICAvLyBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9IGluaXRpYWxfc3RhdGUub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBkaWcgMQogICAgcHVzaGludCAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjXzMgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MjgtODI5CiAgICAvLyAjIEludGVyZXN0CiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgPSBpbml0aWFsX3N0YXRlLmFjY3J1ZWRfaW50ZXJlc3QKICAgIGRpZyAxCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MzEtODMyCiAgICAvLyAjIEludGVyZXN0IFJhdGUKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gaW5pdGlhbF9zdGF0ZS5ub21pbmFsX2ludGVyZXN0X3JhdGUKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODMzCiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBpbml0aWFsX3N0YXRlLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UKICAgIGRpZyAxCiAgICBwdXNoaW50IDI0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MzQKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQgPSB0ZXJtcy5yYXRlX3Jlc2V0X3NwcmVhZAogICAgZGlnIDMKICAgIHB1c2hpbnQgNTgKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzNSAvLyAicmF0ZV9yZXNldF9zcHJlYWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODM1CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciA9IHRlcm1zLnJhdGVfcmVzZXRfbXVsdGlwbGllcgogICAgZGlnIDMKICAgIHB1c2hpbnQgNjYKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzNiAvLyAicmF0ZV9yZXNldF9tdWx0aXBsaWVyIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzNgogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X2Zsb29yID0gdGVybXMucmF0ZV9yZXNldF9mbG9vcgogICAgZGlnIDMKICAgIHB1c2hpbnQgNzQKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAyOSAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MzcKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9jYXAgPSB0ZXJtcy5yYXRlX3Jlc2V0X2NhcAogICAgZGlnIDMKICAgIHB1c2hpbnQgODIKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzMCAvLyAicmF0ZV9yZXNldF9jYXAiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODM4CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfbmV4dCA9IHRlcm1zLnJhdGVfcmVzZXRfbmV4dAogICAgZGlnIDMKICAgIHB1c2hpbnQgOTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzNyAvLyAicmF0ZV9yZXNldF9uZXh0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzOQogICAgLy8gc2VsZi5oYXNfcmF0ZV9yZXNldF9mbG9vciA9IHRlcm1zLmhhc19yYXRlX3Jlc2V0X2Zsb29yCiAgICBkaWcgMwogICAgcHVzaGludCA3ODQKICAgIGdldGJpdAogICAgYnl0ZWMgMzggLy8gImhhc19yYXRlX3Jlc2V0X2Zsb29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0MAogICAgLy8gc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgPSB0ZXJtcy5oYXNfcmF0ZV9yZXNldF9jYXAKICAgIGRpZyAzCiAgICBwdXNoaW50IDc4NQogICAgZ2V0Yml0CiAgICBieXRlYyAzOSAvLyAiaGFzX3JhdGVfcmVzZXRfY2FwIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0Mi04NDMKICAgIC8vICMgU2NhbGluZwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSA9IHRlcm1zLmZpeGVkX3BvaW50X3NjYWxlCiAgICB1bmNvdmVyIDMKICAgIHB1c2hpbnQgOTkKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDUtODQ2CiAgICAvLyAjIFNjaGVkdWxlIFByb2Nlc3NpbmcKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yID0gaW5pdGlhbF9zdGF0ZS5ldmVudF9jdXJzb3IKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDgtODQ5CiAgICAvLyAjIFBlci1Vbml0IEZpeGVkLVBvaW50IEluZGV4ZXMKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCA9IGluaXRpYWxfc3RhdGUuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleAogICAgZGlnIDEKICAgIHB1c2hpbnQgNTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NTAKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggPSBpbml0aWFsX3N0YXRlLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4CiAgICBkaWcgMQogICAgcHVzaGludCA2NAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NTItODUzCiAgICAvLyAjIFJlc2VydmVkIEFtb3VudCAoZm9yIGV4ZWN1dGVkIGNhc2hmbG93cykKICAgIC8vIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU0CiAgICAvLyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU2CiAgICAvLyBhc3NlcnQgdGVybXMuaW5pdGlhbF9leGNoYW5nZV9kYXRlID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsIGVyci5JTlZBTElEX0lFRAogICAgZGlnIDIKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgID4KICAgIGFzc2VydCAvLyBJRUQgbXVzdCBiZSBzZXQgaW4gdGhlIGZ1dHVyZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU3CiAgICAvLyBhc3NlcnQgdGVybXMuaW5pdGlhbF9leGNoYW5nZV9kYXRlID4gaW5pdGlhbF9zdGF0ZS5zdGF0dXNfZGF0ZSwgZXJyLklOVkFMSURfSUVECiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICA8CiAgICBhc3NlcnQgLy8gSUVEIG11c3QgYmUgc2V0IGluIHRoZSBmdXR1cmUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg1OAogICAgLy8gYXNzZXJ0IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA8IHRlcm1zLm1hdHVyaXR5X2RhdGUsIGVyci5JTlZBTElEX0lFRAogICAgPAogICAgYXNzZXJ0IC8vIElFRCBtdXN0IGJlIHNldCBpbiB0aGUgZnV0dXJlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDE5LTEwMjAKICAgIC8vICMgTm90YXJpemUgcHJvc3BlY3R1cyAob3B0aW9uYWwpCiAgICAvLyBzZWxmLnByb3NwZWN0dXNfaGFzaCA9IHByb3NwZWN0dXMuaGFzaC5ieXRlcwogICAgZGlnIDIKICAgIGV4dHJhY3QgMCAzMgogICAgYnl0ZWMgNDIgLy8gInByb3NwZWN0dXNfaGFzaCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDIxCiAgICAvLyBzZWxmLnByb3NwZWN0dXNfdXJsID0gcHJvc3BlY3R1cy51cmwKICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgYnl0ZWMgNDMgLy8gInByb3NwZWN0dXNfdXJsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMjIKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNvbnRyYWN0X2NvbmZpZ19ib29sX2ZhbHNlQDE3OgogICAgaW50Y18wIC8vIDAKICAgIGIgY29udHJhY3RfY29uZmlnX2Jvb2xfbWVyZ2VAMTgKCmNvbnRyYWN0X2NvbmZpZ19ib29sX2ZhbHNlQDg6CiAgICBpbnRjXzAgLy8gMAogICAgYiBjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUA5CgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3Rfc2NoZWR1bGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9zY2hlZHVsZToKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAyNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBzd2FwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgMwogICAgZHVwCiAgICBwdXNoaW50IDY1CiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIHVuY292ZXIgMgogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8c21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5FeGVjdXRpb25TY2hlZHVsZUVudHJ5PgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAzOQogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDQyCiAgICAvLyBjb250cmFjdF90eXBlPXNlbGYuY29udHJhY3RfdHlwZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBjb3ZlciAzCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODc0CiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIEQtQVNBIGFscmVhZHkgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODc1LTg3NwogICAgLy8gYXNzZXJ0IHNjaGVkdWxlX3BhZ2UubGVuZ3RoIDw9IFVJbnQ2NCgKICAgIC8vICAgICBjc3QuU0NIRURVTEVfUEFHRV9TSVpFCiAgICAvLyApLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBkdXAKICAgIHB1c2hpbnQgMTYKICAgIDw9CiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NzgKICAgIC8vIGFzc2VydCBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID4gVUludDY0KDApLCBlcnIuVEVSTVNfTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMCAvLyAiaW5pdGlhbF9leGNoYW5nZV9hbW91bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0EgdGVybXMgbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg4MAogICAgLy8gcGFnZV9jdXJzb3IgPSBzY2hlZHVsZV9wYWdlX2luZGV4ICogVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpCiAgICBzd2FwCiAgICBwdXNoaW50IDE2CiAgICAqCiAgICBzd2FwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4ODcKICAgIC8vICsgcGFnZV9sZW5ndGggKiBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19QRVJfRU5UUllfQlVER0VUKQogICAgcHVzaGludCAxMDAKICAgICoKICAgIHB1c2hpbnQgMTUxMAogICAgKwoKY29udHJhY3Rfc2NoZWR1bGVfd2hpbGVfdG9wQDI6CiAgICBkdXAKICAgIGdsb2JhbCBPcGNvZGVCdWRnZXQKICAgID4KICAgIGJ6IGNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX3doaWxlQDUKICAgIGl0eG5fYmVnaW4KICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBwdXNoaW50IDUgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICBieXRlYyA0NyAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW0KICAgIGJ5dGVjIDQ3IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBiIGNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEAyCgpjb250cmFjdF9zY2hlZHVsZV9hZnRlcl93aGlsZUA1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODkwCiAgICAvLyBpbmRleCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTAKCmNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODkxCiAgICAvLyB3aGlsZSBpbmRleCA8IHBhZ2VfbGVuZ3RoOgogICAgZGlnIDkKICAgIGRpZyA0CiAgICA8CiAgICBieiBjb250cmFjdF9zY2hlZHVsZV9hZnRlcl93aGlsZUAxNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODkyLTg5MwogICAgLy8gZW50cnkgPSBzY2hlZHVsZV9wYWdlW2luZGV4XS5jb3B5KCkKICAgIC8vIGVudHJ5X2V2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBkaWcgNAogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgYnVyeSAxMwogICAgZGlnIDEwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgNjUKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODkzCiAgICAvLyBlbnRyeV9ldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTItODkzCiAgICAvLyBlbnRyeSA9IHNjaGVkdWxlX3BhZ2VbaW5kZXhdLmNvcHkoKQogICAgLy8gZW50cnlfZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGludGNfMiAvLyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTMKICAgIC8vIGVudHJ5X2V2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBnZXRieXRlCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgMTQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg5NAogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X2lkID09IHBhZ2VfY3Vyc29yICsgaW5kZXgsIGVyci5JTlZBTElEX0VWRU5UX0lECiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEzCiAgICBkaWcgNQogICAgdW5jb3ZlciA0CiAgICArCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTUtODk3CiAgICAvLyBzZWxmLl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBlbnRyeV9ldmVudF90eXBlCiAgICAvLyApCiAgICBkaWcgNQogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODk4CiAgICAvLyBhc3NlcnQgZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgc3dhcAogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTkKICAgIC8vIGlmIGVudHJ5LmV2ZW50X2lkID4gVUludDY0KDApOgogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTAwCiAgICAvLyBpZiBpbmRleCA+IFVJbnQ2NCgwKToKICAgIGRpZyA5CiAgICBieiBjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlAMTAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkwMQogICAgLy8gcHJldmlvdXNfZW50cnkgPSBzY2hlZHVsZV9wYWdlW2luZGV4IC0gVUludDY0KDEpXS5jb3B5KCkKICAgIGRpZyA5CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgcHVzaGludCA2NQogICAgKgogICAgZGlnIDEyCiAgICBzd2FwCiAgICBwdXNoaW50IDY1CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTYKICAgIC8vIHByZXZpb3VzX2VudHJ5LnNjaGVkdWxlZF90aW1lIDw9IGVudHJ5LnNjaGVkdWxlZF90aW1lCiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgOAogICAgPD0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkxNS05MTcKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgcHJldmlvdXNfZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gZW50cnkuc2NoZWR1bGVkX3RpbWUKICAgIC8vICksIGVyci5JTlZBTElEX1NPUlRJTkcKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBtdXN0IGJlIHNvcnRlZCBpbiBzdHJpY3RseSBhc2NlbmRpbmcgb3JkZXIKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTgKICAgIC8vIGlmIGVudHJ5LmV2ZW50X2lkID09IFVJbnQ2NCgwKToKICAgIGRpZyA4CiAgICBibnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTE5LTkyMQogICAgLy8gYXNzZXJ0IGVudHJ5X2V2ZW50X3R5cGUgPT0gVUludDY0KAogICAgLy8gICAgIGVudW1zLkVWVF9JRUQKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZGlnIDEwCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjIKICAgIC8vIGluZGV4ICs9IFVJbnQ2NCgxKQogICAgZGlnIDkKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEwCiAgICBiIGNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEA2Cgpjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlAMTA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDMtOTA1CiAgICAvLyAjIFRoZSBmaXJzdCBlbnRyeSBvZiBhIHBhZ2UgbXVzdCBzdGlsbCBiZSBvcmRlcmVkIGFmdGVyIHRoZQogICAgLy8gIyBsYXN0IGVudHJ5IG9mIHRoZSBwcmV2aW91cyBwYWdlLgogICAgLy8gYXNzZXJ0IHNjaGVkdWxlX3BhZ2VfaW5kZXggPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0VWRU5UX0lECiAgICBkaWcgNgogICAgZHVwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBpZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTA2CiAgICAvLyBwcmV2aW91c19wYWdlX2luZGV4ID0gc2NoZWR1bGVfcGFnZV9pbmRleCAtIFVJbnQ2NCgxKQogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkwOAogICAgLy8gcHJldmlvdXNfcGFnZV9pbmRleCBpbiBzZWxmLnNjaGVkdWxlX3BhZ2UKICAgIGl0b2IKICAgIGJ5dGVjIDMxIC8vIDB4NTMyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTA3LTkwOQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBwcmV2aW91c19wYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZQogICAgLy8gKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTEwLTkxMQogICAgLy8gcHJldmlvdXNfcGFnZSA9IHNlbGYuc2NoZWR1bGVfcGFnZVtwcmV2aW91c19wYWdlX2luZGV4XS5jb3B5KCkKICAgIC8vIGFzc2VydCBwcmV2aW91c19wYWdlLmxlbmd0aCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGludCAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTExCiAgICAvLyBhc3NlcnQgcHJldmlvdXNfcGFnZS5sZW5ndGggPiBVSW50NjQoMCksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGR1cAogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTEzCiAgICAvLyBwcmV2aW91c19wYWdlLmxlbmd0aCAtIFVJbnQ2NCgxKQogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkxMi05MTQKICAgIC8vIHByZXZpb3VzX2VudHJ5ID0gcHJldmlvdXNfcGFnZVsKICAgIC8vICAgICBwcmV2aW91c19wYWdlLmxlbmd0aCAtIFVJbnQ2NCgxKQogICAgLy8gXS5jb3B5KCkKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgMgogICAgKwogICAgcHVzaGludCA2NQogICAgYm94X2V4dHJhY3QKICAgIGIgY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxMQoKY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfd2hpbGVAMTU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMDAKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHNjaGVkdWxlX3BhZ2UuY29weSgpCiAgICBkaWcgNgogICAgaXRvYgogICAgYnl0ZWMgMzEgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBkaWcgNQogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTI1CiAgICAvLyBpZiBpc19sYXN0X3BhZ2U6CiAgICBkaWcgNQogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxNwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTI3CiAgICAvLyBzY2hlZHVsZV9wYWdlX2luZGV4ICogVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpICsgcGFnZV9sZW5ndGgKICAgIGRpZyAxCiAgICBkaWcgNAogICAgKwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTI2CiAgICAvLyBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50ID0gKAogICAgYnl0ZWMgNCAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjYtOTI4CiAgICAvLyBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50ID0gKAogICAgLy8gICAgIHNjaGVkdWxlX3BhZ2VfaW5kZXggKiBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkgKyBwYWdlX2xlbmd0aAogICAgLy8gKQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkyOQogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgcHVzaGludCA1MAogICAgYXBwX2dsb2JhbF9wdXQKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDQ3CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmNvbnRyYWN0X2V4ZWN1dGVfaWVkW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfZXhlY3V0ZV9pZWQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA1NwogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDU4CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA1OQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNjEKICAgIC8vIGFzc2VydCBzZWxmLmV2ZW50X2N1cnNvciA8IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICBkaWcgMQogICAgPgogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgY3Vyc29yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDYyCiAgICAvLyBlbnRyeSA9IHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLmV2ZW50X2N1cnNvcikKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2MwogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X3R5cGUgPT0gYXJjNC5VSW50OChlbnVtcy5FVlRfSUVEKSwgZXJyLklOVkFMSURfRVZFTlRfVFlQRQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgZHVwCiAgICBwdXNoYnl0ZXMgMHgwMQogICAgYj09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCB0eXBlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDY3CiAgICAvLyBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIGRpZyAxCiAgICBleHRyYWN0IDAgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2OQogICAgLy8gc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICBkaWcgMgogICAgZXh0cmFjdCA5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNzAKICAgIC8vIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgZGlnIDMKICAgIGV4dHJhY3QgMTcgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3MQogICAgLy8gcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZGlnIDQKICAgIGV4dHJhY3QgMjUgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3MwogICAgLy8gbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9ZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBkaWcgNQogICAgZXh0cmFjdCAzMyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc0CiAgICAvLyBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICBkaWcgNgogICAgZXh0cmFjdCA0MSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc1CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1lbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIGRpZyA3CiAgICBleHRyYWN0IDQ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNzYKICAgIC8vIGZsYWdzPWVudHJ5LmZsYWdzLAogICAgZGlnIDgKICAgIGV4dHJhY3QgNTcgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2Ni0xMDc3CiAgICAvLyB0eXAuT2JzZXJ2ZWRFdmVudFJlcXVlc3QoCiAgICAvLyAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBvYnNlcnZlZF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1lbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9ZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9ZW50cnkuZmxhZ3MsCiAgICAvLyApLAogICAgdW5jb3ZlciA3CiAgICB1bmNvdmVyIDgKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3MgogICAgLy8gb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2Ni0xMDc3CiAgICAvLyB0eXAuT2JzZXJ2ZWRFdmVudFJlcXVlc3QoCiAgICAvLyAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBvYnNlcnZlZF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1lbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9ZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9ZW50cnkuZmxhZ3MsCiAgICAvLyApLAogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNjQtMTA3OAogICAgLy8gc2VsZi5fYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkoCiAgICAvLyAgICAgZW50cnksCiAgICAvLyAgICAgdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0KAogICAgLy8gICAgICAgICBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIC8vICAgICAgICAgZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgLy8gICAgICAgICBzY2hlZHVsZWRfdGltZT1lbnRyeS5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICAgICAgYWNjcnVhbF9mYWN0b3I9ZW50cnkuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICAgICAgb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPWVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPWVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgICAgICBmbGFncz1lbnRyeS5mbGFncywKICAgIC8vICAgICApLAogICAgLy8gKQogICAgY2FsbHN1YiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkKICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3OQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDQ5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5hcHBseV9ub25fY2FzaF9ldmVudFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFwcGx5X25vbl9jYXNoX2V2ZW50OgogICAgaW50Y18wIC8vIDAKICAgIGR1cG4gNAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwODEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwbiAyCiAgICBsZW4KICAgIHB1c2hpbnQgNzMKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuT2JzZXJ2ZWRFdmVudFJlcXVlc3QKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDk1CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA5NgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwOTgKICAgIC8vIGlmIHBheWxvYWQuZmxhZ3MgJiBVSW50NjQoZW51bXMuRkxBR19PQlNFUlZFRF9FVkVOVCk6CiAgICBwdXNoaW50IDY1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBwdXNoaW50IDQKICAgICYKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjMzCiAgICAvLyByZXR1cm4gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9DTE0pCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIHB1c2hpbnQgNQogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwOTkKICAgIC8vIGFzc2VydCBzZWxmLl9zdXBwb3J0c19vYnNlcnZlZF9ldmVudHMoKSwgZXJyLk9CU0VSVkVEX0VWRU5UX1JFUVVJUkVECiAgICBhc3NlcnQgLy8gT2JzZXJ2ZWQgZXZlbnQgcmVxdWlyZWQgdG8gZXhlY3V0ZSB0aGlzIGFjdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEwMAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMzMKICAgIC8vIHJldHVybiBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0NMTSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgZHVwCiAgICBwdXNoaW50IDUKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MzgKICAgIC8vIGFzc2VydCBzZWxmLl9zdXBwb3J0c19vYnNlcnZlZF9ldmVudHMoKSwgZXJyLk9CU0VSVkVEX0VWRU5UX1JFUVVJUkVECiAgICBhc3NlcnQgLy8gT2JzZXJ2ZWQgZXZlbnQgcmVxdWlyZWQgdG8gZXhlY3V0ZSB0aGlzIGFjdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTM5CiAgICAvLyBhc3NlcnQgcGF5bG9hZC5ldmVudF9pZCA9PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LCBlcnIuSU5WQUxJRF9FVkVOVF9JRAogICAgZGlnIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgNwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NDEKICAgIC8vIHNlbGYuY29udHJhY3RfdHlwZSwgcGF5bG9hZC5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBkdXAKICAgIGV4dHJhY3QgOCAxCiAgICBidXJ5IDEyCiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQwLTk0MgogICAgLy8gc2VsZi5fYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgc2VsZi5jb250cmFjdF90eXBlLCBwYXlsb2FkLmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIC8vICkKICAgIGNhbGxzdWIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NDQKICAgIC8vIHBhZ2VfaW5kZXggPSBzZWxmLl9zY2hlZHVsZV9wYWdlX2luZGV4KHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxOTAKICAgIC8vIHJldHVybiBldmVudF9pZCAvLyBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkKICAgIHB1c2hpbnQgMTYKICAgIC8KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk0NQogICAgLy8gcGFnZSA9IHR5cC5FeGVjdXRpb25TY2hlZHVsZVBhZ2UoKQogICAgcHVzaGJ5dGVzIDB4MDAwMAogICAgYnVyeSA3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NDYKICAgIC8vIGlmIHBhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlOgogICAgaXRvYgogICAgYnl0ZWMgMzEgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA5CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMjcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk0NwogICAgLy8gcGFnZSA9IHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XS5jb3B5KCkKICAgIGRpZyA3CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidXJ5IDcKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX3BhZ2UgZW50cnkgZXhpc3RzCgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDI3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQ4CiAgICAvLyBhc3NlcnQgcGFnZS5sZW5ndGggPCBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGRpZyA1CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgMTYKICAgIDwKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1MwogICAgLy8gc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIGRpZyAzCiAgICBkdXAKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTQKICAgIC8vIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICBkaWcgMQogICAgZXh0cmFjdCAxNyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTUKICAgIC8vIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZGlnIDIKICAgIGV4dHJhY3QgMjUgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTU2CiAgICAvLyBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDMKICAgIGV4dHJhY3QgNDEgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTU3CiAgICAvLyBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIGRpZyA0CiAgICBleHRyYWN0IDQ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1OAogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIHVuY292ZXIgNQogICAgZXh0cmFjdCA1NyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTAtOTYwCiAgICAvLyB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1wYXlsb2FkLmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9cGF5bG9hZC5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPXBheWxvYWQucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXBheWxvYWQubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICkKICAgIGRpZyAxMQogICAgaXRvYgogICAgZGlnIDE4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMwogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NDktOTYxCiAgICAvLyBwYWdlLmFwcGVuZCgKICAgIC8vICAgICB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9cGF5bG9hZC5ldmVudF9pZCwKICAgIC8vICAgICAgICAgZXZlbnRfdHlwZT1wYXlsb2FkLmV2ZW50X3R5cGUsCiAgICAvLyAgICAgICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIC8vICAgICAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICAgICApCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjIKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHBhZ2UuY29weSgpCiAgICBkaWcgOAogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2MwogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTAzCiAgICAvLyBhc3NlcnQgZXZlbnRfaWQgPT0gc2VsZi5ldmVudF9jdXJzb3IsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBjdXJzb3IKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMDQKICAgIC8vIGVudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KGV2ZW50X2lkKQogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEwNgogICAgLy8gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgYnVyeSAxMAogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjQKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY1CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzYzLTM3MAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9SUiksCiAgICBwdXNoaW50IDEyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY3CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICBwdXNoaW50IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY4CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgcHVzaGludCAxOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzYzLTM3MAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBieiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX2ZhbHNlQDE2CgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX3RydWVAMTU6CiAgICBpbnRjXzEgLy8gMQoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9tZXJnZUAxNzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMDUtMTEwNwogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2lzX25vbl9jYXNoKAogICAgLy8gICAgIGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIC8vICksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IHR5cGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMDgKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlICE9IGFyYzQuVUludDgoZW51bXMuRVZUX0lFRCksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGRpZyA4CiAgICBwdXNoYnl0ZXMgMHgwMQogICAgYiE9CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCB0eXBlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNzQKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluIChVSW50NjQoZW51bXMuRVZUX1JSKSwgVUludDY0KGVudW1zLkVWVF9SUkYpKQogICAgZGlnIDQKICAgIHB1c2hpbnQgMTIKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDIxCiAgICBkaWcgNAogICAgcHVzaGludCAxMQogICAgPT0KICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfZmFsc2VAMjIKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAyMToKICAgIGludGNfMSAvLyAxCgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX21lcmdlQDIzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEwOQogICAgLy8gaWYgc2VsZi5fZXZlbnRfaXNfcmF0ZV9yZXNldChlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpKToKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Vsc2VfYm9keUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODAKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLm9ic2VydmVyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjQgLy8gMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTEzCiAgICAvLyBzZWxmLl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeShlbnRyeSwgcGF5bG9hZCkKICAgIGRpZyA2CiAgICBkaWcgMgogICAgY2FsbHN1YiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkKICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTExNAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDgxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Vsc2VfYm9keUA1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTExMgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICBiIGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VANgoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9mYWxzZUAyMjoKICAgIGludGNfMCAvLyAwCiAgICBiIGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfbWVyZ2VAMjMKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfZmFsc2VAMTY6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX21lcmdlQDE3CgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfZ2V0X3N0YXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfZ2V0X3N0YXRlOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBkdXAKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEyMQogICAgLy8gY29udHJhY3RfdHlwZT1hcmM0LlVJbnQ4KHNlbGYuY29udHJhY3RfdHlwZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzIgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMjMKICAgIC8vIHRvdGFsX3VuaXRzPXNlbGYudG90YWxfdW5pdHMsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEyNAogICAgLy8gcmVzZXJ2ZWRfdW5pdHNfdG90YWw9c2VsZi5yZXNlcnZlZF91bml0c190b3RhbCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTI1CiAgICAvLyBpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudD1zZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMjYKICAgIC8vIGV2ZW50X2N1cnNvcj1zZWxmLmV2ZW50X2N1cnNvciwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEyNwogICAgLy8gc2NoZWR1bGVfZW50cnlfY291bnQ9c2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMjgKICAgIC8vIG91dHN0YW5kaW5nX3ByaW5jaXBhbD1zZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEyOQogICAgLy8gaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZT1zZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEzMAogICAgLy8gbm9taW5hbF9pbnRlcmVzdF9yYXRlPXNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTMxCiAgICAvLyBhY2NydWVkX2ludGVyZXN0PXNlbGYuYWNjcnVlZF9pbnRlcmVzdCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTMyCiAgICAvLyBjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4PXNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEzMwogICAgLy8gY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXg9c2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTM0CiAgICAvLyByZXNlcnZlZF9pbnRlcmVzdD1zZWxmLnJlc2VydmVkX2ludGVyZXN0LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMzUKICAgIC8vIHJlc2VydmVkX3ByaW5jaXBhbD1zZWxmLnJlc2VydmVkX3ByaW5jaXBhbCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMjAtMTEzNgogICAgLy8gcmV0dXJuIHR5cC5LZXJuZWxTdGF0ZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlPWFyYzQuVUludDgoc2VsZi5jb250cmFjdF90eXBlKSwKICAgIC8vICAgICBzdGF0dXM9c2VsZi5zdGF0dXMsCiAgICAvLyAgICAgdG90YWxfdW5pdHM9c2VsZi50b3RhbF91bml0cywKICAgIC8vICAgICByZXNlcnZlZF91bml0c190b3RhbD1zZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsLAogICAgLy8gICAgIGluaXRpYWxfZXhjaGFuZ2VfYW1vdW50PXNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQsCiAgICAvLyAgICAgZXZlbnRfY3Vyc29yPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgLy8gICAgIHNjaGVkdWxlX2VudHJ5X2NvdW50PXNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQsCiAgICAvLyAgICAgb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2U9c2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlLAogICAgLy8gICAgIG5vbWluYWxfaW50ZXJlc3RfcmF0ZT1zZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBhY2NydWVkX2ludGVyZXN0PXNlbGYuYWNjcnVlZF9pbnRlcmVzdCwKICAgIC8vICAgICBjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4PXNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCwKICAgIC8vICAgICBjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleD1zZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4LAogICAgLy8gICAgIHJlc2VydmVkX2ludGVyZXN0PXNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QsCiAgICAvLyAgICAgcmVzZXJ2ZWRfcHJpbmNpcGFsPXNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsLAogICAgLy8gKQogICAgdW5jb3ZlciAxNAogICAgaXRvYgogICAgdW5jb3ZlciAxNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDEzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDEwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgOQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDgKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTE2CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnRbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE0MgogICAgLy8gaWYgc2VsZi5ldmVudF9jdXJzb3IgPj0gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgPj0KICAgIGJ6IGNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDQKICAgIC8vIGV2ZW50X2lkPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTQzLTExNTMKICAgIC8vIHJldHVybiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1zZWxmLmV2ZW50X2N1cnNvciwKICAgIC8vICAgICBldmVudF90eXBlPWFyYzQuVUludDgoMCksCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9VUludDY0KDApLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9VUludDY0KDApLAogICAgLy8gICAgIGZsYWdzPVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGl0b2IKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDUKICAgIC8vIGV2ZW50X3R5cGU9YXJjNC5VSW50OCgwKSwKICAgIGJ5dGVjIDQwIC8vIDB4MDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDMtMTE1MwogICAgLy8gcmV0dXJuIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgIGV2ZW50X2lkPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgLy8gICAgIGV2ZW50X3R5cGU9YXJjNC5VSW50OCgwKSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1VSW50NjQoMCksCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1VSW50NjQoMCksCiAgICAvLyAgICAgZmxhZ3M9VUludDY0KDApLAogICAgLy8gKQogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTQ2CiAgICAvLyBzY2hlZHVsZWRfdGltZT1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE0My0xMTUzCiAgICAvLyByZXR1cm4gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkoCiAgICAvLyAgICAgZXZlbnRfaWQ9c2VsZi5ldmVudF9jdXJzb3IsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1hcmM0LlVJbnQ4KDApLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPVVJbnQ2NCgwKSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249VUludDY0KDApLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPVVJbnQ2NCgwKSwKICAgIC8vICAgICBmbGFncz1VSW50NjQoMCksCiAgICAvLyApCiAgICBpdG9iCiAgICBzd2FwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKCmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudF9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudEA0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEzOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpjb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1NAogICAgLy8gcmV0dXJuIHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLmV2ZW50X2N1cnNvcikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50QDQKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5jb250cmFjdF91cGRhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF91cGRhdGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTUzLTE1NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGdyYW50cyB0aGUgdXBkYXRlIHBlcm1pc3Npb25zIHRvIHRoZSBBcnJhbmdlci4KICAgIC8vICMg4pqg77iPIFdBUk5JTkc6IEFwcGxpY2F0aW9uIHVwZGF0ZXMgbXVzdCBiZSBleGVjdXRlZCBWRVJZIGNhcmVmdWxseSwgYXMgdGhleQogICAgLy8gIyBtaWdodCBpbnRyb2R1Y2UgYnJlYWtpbmcgY2hhbmdlcy4KICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfcm90YXRlX2FycmFuZ2VyW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19yb3RhdGVfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2OQogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTcwCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gbmV3X2FycmFuZ2VyCiAgICBieXRlYyAxOCAvLyAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTcxCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfc2V0X29wX2RhZW1vbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfc2V0X29wX2RhZW1vbjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTg0CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODUKICAgIC8vIHNlbGYub3BfZGFlbW9uLnZhbHVlID0gYWRkcmVzcwogICAgYnl0ZWMgMjUgLy8gMHg1MjIzNGY3MDQ0NjE2NTZkNmY2ZTIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4NgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTczCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2Fzc2lnbl9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19hc3NpZ25fcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDE2CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLlJvbGVWYWxpZGl0eQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjExCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMgogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgcHVzaGludCAyMAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTAzCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gcm9sZV9hZGRyZXNzCiAgICBieXRlYyAxOCAvLyAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMKICAgIGRpZyAzCiAgICBhcHBfZ2xvYmFsX3B1dAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTQKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDYKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIGR1cAogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnRfbWFuYWdlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMyAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwOAogICAgLy8gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMiAvLyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTIKICAgIC8vIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIGR1cAogICAgcHVzaGludCA2MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE1CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMzIgLy8gMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE2CiAgICAvLyBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExOAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMSAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIwCiAgICAvLyBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMwogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgODAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIzCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI0IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI0CiAgICAvLyBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3Jldm9rZV9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19yZXZva2Vfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzUKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzNgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzcKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCkpCiAgICBidG9pCiAgICBkdXBuIDIKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCAhPSBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksIGVyci5JTlZBTElEX1JPTEUKICAgIGR1cAogICAgcHVzaGludCAyMAogICAgIT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyOAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIzIC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0NGQ2MTZlNjE2NzY1NzIyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMwCiAgICAvLyBkZWwgc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzOQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjE2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIyIC8vIDB4NTIyMzUwNzI2OTZkNjE3Mjc5NDQ2NTYxNmM2NTcyMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNAogICAgLy8gZGVsIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjM4CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIGR1cAogICAgcHVzaGludCA2MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAzMiAvLyAweDUyMjM1NDcyNzU3Mzc0NjU2NTIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzgKICAgIC8vIGRlbCBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjM4CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDEKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hdXRob3JpdHksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjEgLy8gMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MgogICAgLy8gZGVsIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzOAogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDQKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDgwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI0IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ2CiAgICAvLyBkZWwgc2VsZi5vYnNlcnZlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfY29udHJhY3Rfc3VzcGVuc2lvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfY29udHJhY3Rfc3VzcGVuc2lvbjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCAgIyBUT0RPOiBVcGRhdGUgc3BlY3MgYW5kIGFkZCB0ZXN0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojc3CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyMSAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1NwogICAgLy8gc2VsZi5hc3NldF9zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGJ5dGVjIDMzIC8vICJhc3NldF9zdXNwZW5kZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1OAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QgICMgVE9ETzogVXBkYXRlIHNwZWNzIGFuZCBhZGQgdGVzdAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X2FycmFuZ2VyW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjY4CiAgICAvLyByZXR1cm4gc2VsZi5hcnJhbmdlci52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE4IC8vIDB4NTIyMzQxNzI3MjYxNmU2NzY1NzIyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI2MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYWRkcmVzc19yb2xlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjcwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4NAogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hY2NvdW50X21hbmFnZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjMgLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQ0ZDYxNmU2MTY3NjU3MjIzCiAgICBkaWcgMQogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODUKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYucHJpbWFyeV9kZWFsZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjIgLy8gMHg1MjIzNTA3MjY5NmQ2MTcyNzk0NDY1NjE2YzY1NzIyMwogICAgZGlnIDIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg2CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnRydXN0ZWUsIGFkZHJlc3MpLAogICAgYnl0ZWMgMzIgLy8gMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMwogICAgZGlnIDMKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg3CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgYWRkcmVzcyksCiAgICBieXRlYyAyMSAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgZGlnIDQKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg4CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLm9ic2VydmVyLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDI0IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgdW5jb3ZlciA1CiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlYyA0MCAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciA2CiAgICBzZXRiaXQKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDUKICAgIHNldGJpdAogICAgcHVzaGludCAyCiAgICB1bmNvdmVyIDQKICAgIHNldGJpdAogICAgcHVzaGludCAzCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgcHVzaGludCA0CiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwNQogICAgLy8gcm9sZSA9IHJvbGVfaWQuYXNfdWludDY0KCkKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDYKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGUpCiAgICBkdXAKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA4CiAgICAvLyBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKToKICAgIHB1c2hpbnRzIDIwIDQwIDUwIDYwIDcwIDgwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA3LTMzOAogICAgLy8gbWF0Y2ggcm9sZToKICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKToKICAgIC8vICAgICAgICAgcmV0dXJuIHR5cC5Sb2xlVmFsaWRpdHkoCiAgICAvLyAgICAgICAgICAgICByb2xlX3ZhbGlkaXR5X3N0YXJ0PVVJbnQ2NCgwKSwgcm9sZV92YWxpZGl0eV9lbmQ9VUludDY0KDApCiAgICAvLyAgICAgICAgICkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSk6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSk6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgXzoKICAgIC8vICAgICAgICAgb3AuZXJyKGVyci5JTlZBTElEX1JPTEUpCiAgICB1bmNvdmVyIDYKICAgIG1hdGNoIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMEAyIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMUAzIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMkA0IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfM0A1IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNEA2IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzM4CiAgICAvLyBvcC5lcnIoZXJyLklOVkFMSURfUk9MRSkKICAgIGVyciAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV81QDc6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzM0CiAgICAvLyBzZWxmLm9ic2VydmVyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDI0IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMzMy0zMzUKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLm9ic2VydmVyLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzYKICAgIC8vIHJldHVybiBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV80QDY6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI5CiAgICAvLyBzZWxmLmF1dGhvcml0eSwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAyMSAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOC0zMzAKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLmF1dGhvcml0eSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzMxCiAgICAvLyByZXR1cm4gc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8zQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI0CiAgICAvLyBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMzIgLy8gMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMy0zMjUKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyNgogICAgLy8gcmV0dXJuIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzJANDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTkKICAgIC8vIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMjIgLy8gMHg1MjIzNTA3MjY5NmQ2MTcyNzk0NDY1NjE2YzY1NzIyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxOC0zMjAKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLnByaW1hcnlfZGVhbGVyLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjEKICAgIC8vIHJldHVybiBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMUAzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxNAogICAgLy8gc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMjMgLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQ0ZDYxNmU2MTY3NjU3MjIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEzLTMxNQogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTYKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzBAMjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDktMzExCiAgICAvLyByZXR1cm4gdHlwLlJvbGVWYWxpZGl0eSgKICAgIC8vICAgICByb2xlX3ZhbGlkaXR5X3N0YXJ0PVVJbnQ2NCgwKSwgcm9sZV92YWxpZGl0eV9lbmQ9VUludDY0KDApCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB2b2lkOgpfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZDoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNgogICAgLy8gZGVmIF9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHNlbGYsIGhvbGRpbmdfYWRkcmVzczogQWNjb3VudCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI4CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZCwgZXJyLlNVU1BFTkRFRAogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHB1c2hpbnQgMzg0CiAgICBnZXRiaXQKICAgICEKICAgIGFzc2VydCAvLyBTdXNwZW5kZWQgb3BlcmF0aW9ucwogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuX3NldHRsZV9wb3NpdGlvbihob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB1aW50NjQsIHVpbnQ2NDoKX3NldHRsZV9wb3NpdGlvbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo0NAogICAgLy8gZGVmIF9zZXR0bGVfcG9zaXRpb24oc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50KSAtPiB0dXBsZVtVSW50NjQsIFVJbnQ2NF06CiAgICBwcm90byAxIDIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NjEKICAgIC8vIHBvc2l0aW9uID0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY29weSgpCiAgICBkdXAKICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjYzLTY1CiAgICAvLyAjIENvbXB1dGUgdGhlIGluY3JlbWVudGFsIHBlci11bml0IGZpeGVkLXBvaW50IGludGVyZXN0IGFuZCBwcmluY2lwYWwgYWNjcnVlZAogICAgLy8gIyBzaW5jZSB0aGlzIGFjY291bnQncyBsYXN0IGNoZWNrcG9pbnQuCiAgICAvLyBpbnRlcmVzdF9kZWx0YSA9IHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCAtIHBvc2l0aW9uLmludGVyZXN0X2NoZWNrcG9pbnQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IGV4aXN0cwogICAgZGlnIDEKICAgIHB1c2hpbnQgNTcKICAgIGV4dHJhY3RfdWludDY0CiAgICAtCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NjcKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggLSBwb3NpdGlvbi5wcmluY2lwYWxfY2hlY2twb2ludAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCBleGlzdHMKICAgIGRpZyAyCiAgICBwdXNoaW50IDY1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjczCiAgICAvLyBpbnRlcmVzdF9kZWx0YSwgcG9zaXRpb24udW5pdHMsIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUKICAgIGRpZyAyCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzAtNzQKICAgIC8vICMgQ29udmVydCB0aGUgcGVyLXVuaXQgZml4ZWQtcG9pbnQgZGVsdGFzIGludG8gYWJzb2x1dGUgY2xhaW1hYmxlIGFtb3VudHMKICAgIC8vICMgdXNpbmcgdGhlIGFjY291bnQncyBhY3RpdmUgdW5pdHMuCiAgICAvLyBjbGFpbWFibGVfaW50ZXJlc3QgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBpbnRlcmVzdF9kZWx0YSwgcG9zaXRpb24udW5pdHMsIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUKICAgIC8vICkKICAgIHVuY292ZXIgMwogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3NgogICAgLy8gcHJpbmNpcGFsX2RlbHRhLCBwb3NpdGlvbi51bml0cywgc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojc1LTc3CiAgICAvLyBjbGFpbWFibGVfcHJpbmNpcGFsID0gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgcHJpbmNpcGFsX2RlbHRhLCBwb3NpdGlvbi51bml0cywgc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgLy8gKQogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3OS04MQogICAgLy8gIyBBY2NydWUgdGhlIGNsYWltYWJsZSBhbW91bnRzIHRvIHRoZSBhY2NvdW50IHBvc2l0aW9uIGFuZCBtYWtlIHRoZW0gYXZhaWxhYmxlCiAgICAvLyAjIGZvciB3aXRoZHJhd2FsLgogICAgLy8gcG9zaXRpb24uY2xhaW1hYmxlX2ludGVyZXN0ICs9IGNsYWltYWJsZV9pbnRlcmVzdAogICAgZGlnIDIKICAgIHB1c2hpbnQgNzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgKwogICAgaXRvYgogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICByZXBsYWNlMiA3MwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjgyCiAgICAvLyBwb3NpdGlvbi5jbGFpbWFibGVfcHJpbmNpcGFsICs9IGNsYWltYWJsZV9wcmluY2lwYWwKICAgIGR1cAogICAgcHVzaGludCA4MQogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICArCiAgICBpdG9iCiAgICByZXBsYWNlMiA4MQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojg0LTg2CiAgICAvLyAjIEFkdmFuY2UgdGhlIGFjY291bnQncyBwZXItdW5pdCBmaXhlZC1wb2ludCBjaGVja3BvaW50cyB0byB0aGUgY3VycmVudCBnbG9iYWwKICAgIC8vICMgcGVyLXVuaXQgZml4ZWQtcG9pbnQgZ2xvYmFsIGluZGljZXMuCiAgICAvLyBwb3NpdGlvbi5pbnRlcmVzdF9jaGVja3BvaW50ID0gc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCBleGlzdHMKICAgIGl0b2IKICAgIHJlcGxhY2UyIDU3CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6ODcKICAgIC8vIHBvc2l0aW9uLnByaW5jaXBhbF9jaGVja3BvaW50ID0gc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCBleGlzdHMKICAgIGl0b2IKICAgIHJlcGxhY2UyIDY1CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6ODktOTAKICAgIC8vICMgQWR2YW5jZSB0aGUgYWNjb3VudCdzIGV2ZW50IGN1cnNvciB0byB0aGUgY3VycmVudCBnbG9iYWwgZXZlbnQgY3Vyc29yLgogICAgLy8gcG9zaXRpb24uc2V0dGxlZF9jdXJzb3IgPSBzZWxmLmV2ZW50X2N1cnNvcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpdG9iCiAgICByZXBsYWNlMiA0OQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjkyLTk0CiAgICAvLyAjIFVwZGF0ZSB0aGUgYWNjb3VudCBwb3NpdGlvbiBhbmQgcmV0dXJuIHRoZSBuZXdseSBhY2NydWVkIGNsYWltYWJsZSBhbW91bnRzCiAgICAvLyAjIGFkZGVkIHRvIHRoZSB0b3RhbCBwb3NpdGlvbidzIGNsYWltYWJsZSBhbW91bnRzLgogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSBwb3NpdGlvbi5jb3B5KCkKICAgIHVuY292ZXIgMwogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojk1CiAgICAvLyByZXR1cm4gY2xhaW1hYmxlX2ludGVyZXN0LCBjbGFpbWFibGVfcHJpbmNpcGFsCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5fZW5zdXJlX3VuaXRzX2FjdGl2YXRlZChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB2b2lkOgpfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZDoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo5NwogICAgLy8gZGVmIF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKHNlbGYsIGhvbGRpbmdfYWRkcmVzczogQWNjb3VudCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTAwCiAgICAvLyBpZiBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKToKICAgIGJ6IF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwMQogICAgLy8gcmV0dXJuCiAgICByZXRzdWIKCl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDMKICAgIC8vIHBvc2l0aW9uID0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY29weSgpCiAgICBmcmFtZV9kaWcgMgogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA0CiAgICAvLyBpZiBwb3NpdGlvbi5yZXNlcnZlZF91bml0cyA9PSBVSW50NjQoMCk6CiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIGJueiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZF9hZnRlcl9pZl9lbHNlQDQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDUKICAgIC8vIHJldHVybgogICAgcmV0c3ViCgpfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZF9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA4CiAgICAvLyBwb3NpdGlvbi51bml0cyArPSBhY3RpdmF0ZWRfdW5pdHMKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDMKICAgICsKICAgIGl0b2IKICAgIHJlcGxhY2UyIDMyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA5CiAgICAvLyBwb3NpdGlvbi5yZXNlcnZlZF91bml0cyA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGl0b2IKICAgIHJlcGxhY2UyIDQwCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTEwCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHBvc2l0aW9uLmNvcHkoKQogICAgZnJhbWVfZGlnIDIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTEKICAgIC8vIGFzc2VydCBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID49IGFjdGl2YXRlZF91bml0cywgZXJyLk9WRVJfRElTVFJJQlVUSU9OCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIGV4aXN0cwogICAgZHVwCiAgICBkaWcgMgogICAgPj0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgcmVtYWluaW5nIEQtQVNBIHVuaXRzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTEyCiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIC09IGFjdGl2YXRlZF91bml0cwogICAgc3dhcAogICAgLQogICAgYnl0ZWMgMTAgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9zY2FsZWRfbXVsX2RpdihtdWx0aXBsaWNhbmQ6IHVpbnQ2NCwgbXVsdGlwbGllcjogdWludDY0LCBkaXZpc29yOiB1aW50NjQpIC0+IHVpbnQ2NDoKX3NjYWxlZF9tdWxfZGl2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTUzLTE1NQogICAgLy8gZGVmIF9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLCBtdWx0aXBsaWNhbmQ6IFVJbnQ2NCwgbXVsdGlwbGllcjogVUludDY0LCBkaXZpc29yOiBVSW50NjQKICAgIC8vICkgLT4gVUludDY0OgogICAgcHJvdG8gMyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTcKICAgIC8vIGlmIG11bHRpcGxpY2FuZCA9PSBVSW50NjQoMCkgb3IgbXVsdGlwbGllciA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTMKICAgIGJ6IF9zY2FsZWRfbXVsX2Rpdl9pZl9ib2R5QDIKICAgIGZyYW1lX2RpZyAtMgogICAgYm56IF9zY2FsZWRfbXVsX2Rpdl9hZnRlcl9pZl9lbHNlQDMKCl9zY2FsZWRfbXVsX2Rpdl9pZl9ib2R5QDI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTgKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9zY2FsZWRfbXVsX2Rpdl9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTkKICAgIC8vIGhpZ2gsIGxvdyA9IG9wLm11bHcobXVsdGlwbGljYW5kLCBtdWx0aXBsaWVyKQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIG11bHcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2MAogICAgLy8gcmV0dXJuIG9wLmRpdncoaGlnaCwgbG93LCBkaXZpc29yKQogICAgZnJhbWVfZGlnIC0xCiAgICBkaXZ3CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYW1vdW50X3RvX2luZGV4X2RlbHRhKGFtb3VudDogdWludDY0KSAtPiB1aW50NjQ6Cl9hbW91bnRfdG9faW5kZXhfZGVsdGE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjIKICAgIC8vIGRlZiBfYW1vdW50X3RvX2luZGV4X2RlbHRhKHNlbGYsIGFtb3VudDogVUludDY0KSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2NAogICAgLy8gaWYgYW1vdW50ID09IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMQogICAgYm56IF9hbW91bnRfdG9faW5kZXhfZGVsdGFfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjUKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9hbW91bnRfdG9faW5kZXhfZGVsdGFfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTY2CiAgICAvLyBhc3NlcnQgc2VsZi50b3RhbF91bml0cyA+IFVJbnQ2NCgwKSwgZXJyLk5PX1VOSVRTCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgZHVwCiAgICBhc3NlcnQgLy8gTm8gRC1BU0EgdW5pdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2NwogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KGFtb3VudCwgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwgc2VsZi50b3RhbF91bml0cykKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2luZGV4X2RlbHRhX3RvX2Ftb3VudChpbmRleF9kZWx0YTogdWludDY0KSAtPiB1aW50NjQ6Cl9pbmRleF9kZWx0YV90b19hbW91bnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjkKICAgIC8vIGRlZiBfaW5kZXhfZGVsdGFfdG9fYW1vdW50KHNlbGYsIGluZGV4X2RlbHRhOiBVSW50NjQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTc2CiAgICAvLyBpZiBpbmRleF9kZWx0YSA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGJueiBfaW5kZXhfZGVsdGFfdG9fYW1vdW50X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTc3CiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfaW5kZXhfZGVsdGFfdG9fYW1vdW50X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE3OQogICAgLy8gc2VsZi50b3RhbF91bml0cywKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxODEKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNzgtMTgyCiAgICAvLyByZXR1cm4gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgc2VsZi50b3RhbF91bml0cywKICAgIC8vICAgICBpbmRleF9kZWx0YSwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2dldF9zY2hlZHVsZV9lbnRyeShldmVudF9pZDogdWludDY0KSAtPiBieXRlczoKX2dldF9zY2hlZHVsZV9lbnRyeToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIwMgogICAgLy8gZGVmIF9nZXRfc2NoZWR1bGVfZW50cnkoc2VsZiwgZXZlbnRfaWQ6IFVJbnQ2NCkgLT4gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnk6CiAgICBwcm90byAxIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIwNAogICAgLy8gYXNzZXJ0IGV2ZW50X2lkIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgPgogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgaWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE5MAogICAgLy8gcmV0dXJuIGV2ZW50X2lkIC8vIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDE2CiAgICAvCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMDYKICAgIC8vIGFzc2VydCBwYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgaXRvYgogICAgYnl0ZWMgMzEgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxOTQKICAgIC8vIHJldHVybiBldmVudF9pZCAlIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDE2CiAgICAlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMDkKICAgIC8vIGFzc2VydCBvZmZzZXQgPCBwYWdlLmxlbmd0aCwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBwdXNoaW50IDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgMQogICAgPgogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjEwCiAgICAvLyByZXR1cm4gcGFnZVtvZmZzZXRdLmNvcHkoKQogICAgcHVzaGludCA2NQogICAgKgogICAgcHVzaGludCAyCiAgICArCiAgICBwdXNoaW50IDY1CiAgICBib3hfZXh0cmFjdAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKGNvbnRyYWN0X3R5cGU6IHVpbnQ2NCwgZXZlbnRfdHlwZTogdWludDY0KSAtPiB2b2lkOgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTMtMzE1CiAgICAvLyBkZWYgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIHNlbGYsIGNvbnRyYWN0X3R5cGU6IFVJbnQ2NCwgZXZlbnRfdHlwZTogVUludDY0CiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNDcKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNDgKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgaW50Y18yIC8vIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI0OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9NRCksCiAgICBwdXNoaW50IDE5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTAKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgcHVzaGludCAxMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU0LTI1NQogICAgLy8gIyBDaGVjayBjb21tb24gZXZlbnRzIGZpcnN0CiAgICAvLyBpZiBldmVudF90eXBlIGluIGNvbW1vbl9ldmVudHM6CiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjUxCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICBwdXNoaW50IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUA3CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU2CiAgICAvLyByZXR1cm4gVHJ1ZQogICAgaW50Y18xIC8vIDEKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICByZXRzdWIKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTgtMjU5CiAgICAvLyAjIENvbnRyYWN0LXNwZWNpZmljIGFkZGl0aW9uYWwgZXZlbnRzCiAgICAvLyBpZiBjb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9QQU0pOgogICAgZnJhbWVfZGlnIC0yCiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjYwLTI2MQogICAgLy8gIyBQQU0gb25seSBzdXBwb3J0cyBjb21tb24gZXZlbnRzCiAgICAvLyByZXR1cm4gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNjMKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0xBTSkgb3IgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2My0yNjUKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0xBTSkgb3IgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoCiAgICAvLyAgICAgZW51bXMuQ1RfTkFNCiAgICAvLyApOgogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDExCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMgogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDE2CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUAxMToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2Ni0yNzAKICAgIC8vICMgTEFNL05BTSBhZGQ6IFBSLCBJUENCCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjY4CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjY2LTI3MAogICAgLy8gIyBMQU0vTkFNIGFkZDogUFIsIElQQ0IKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDEzCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIHB1c2hpbnQgMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2Ni0yNzAKICAgIC8vICMgTEFNL05BTSBhZGQ6IFBSLCBJUENCCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICkKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF9mYWxzZUAxNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAxMzoKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDE0OgogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMTY6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzIKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTik6CiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMjMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3My0yNzgKICAgIC8vICMgQU5OIGFkZHM6IFBSLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjc1CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjczLTI3OAogICAgLy8gIyBBTk4gYWRkczogUFIsIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDIwCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIHB1c2hpbnQgMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3My0yNzgKICAgIC8vICMgQU5OIGFkZHM6IFBSLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyMAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzcKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIHB1c2hpbnQgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjczLTI3OAogICAgLy8gIyBBTk4gYWRkczogUFIsIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDIxCgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDIwOgogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMjE6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAyMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MAogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfTEFYKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA0CiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMzEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MS0yODcKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MwogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUiksCiAgICBwdXNoaW50IDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MS0yODcKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjgKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjg0CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjgxLTI4NwogICAgLy8gIyBMQVggYWRkczogUFIsIFBJLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyOAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODUKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICBwdXNoaW50IDE4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODEtMjg3CiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDI4CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODEtMjg3CiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDI5CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDI4OgogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMjk6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAzMToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4OQogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQ0xNKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA1CiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMzMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI5MC0yOTEKICAgIC8vICMgQ0xNIGFkZHM6IFBSCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1BSKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDMKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDMzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjkzCiAgICAvLyByZXR1cm4gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5faXNfZHluYW1pY19hbm51aXR5KCkgLT4gdWludDY0OgpfaXNfZHluYW1pY19hbm51aXR5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM1CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzUtMzM2CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIC8vIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGJ6IF9pc19keW5hbWljX2FubnVpdHlfYm9vbF9mYWxzZUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzYKICAgIC8vIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzNCAvLyAiZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM1LTMzNgogICAgLy8gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICAvLyBhbmQgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBieiBfaXNfZHluYW1pY19hbm51aXR5X2Jvb2xfZmFsc2VAMwogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMzNC0zMzcKICAgIC8vIHJldHVybiAoCiAgICAvLyAgICAgc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICAvLyAgICAgYW5kIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgLy8gKQogICAgcmV0c3ViCgpfaXNfZHluYW1pY19hbm51aXR5X2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzQtMzM3CiAgICAvLyByZXR1cm4gKAogICAgLy8gICAgIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKQogICAgLy8gICAgIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIC8vICkKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KGVudHJ5OiBieXRlcykgLT4gdWludDY0LCBieXRlczoKX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozODAKICAgIC8vIGRlZiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudChzZWxmLCBlbnRyeTogdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5CiAgICAvLyBlbnRyeS5hY2NydWFsX2ZhY3RvciA9PSBVSW50NjQoMCkKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAxNwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5LTM5MQogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGJ6IF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2lmX2JvZHlAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzkwCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5LTM5MQogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGJ6IF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2lmX2JvZHlAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzkxCiAgICAvLyBvciBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPT0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5LTM5MQogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGJueiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudF9hZnRlcl9pZl9lbHNlQDQKCl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2lmX2JvZHlAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5MwogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2RpZyAtMQogICAgdW5jb3ZlciAyCiAgICByZXRzdWIKCl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NQogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NgogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NC0zOTgKICAgIC8vIGFjY3J1ZWQgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICAvLyAgICAgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICkKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MDIKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozOTktNDAzCiAgICAvLyByZXR1cm4gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgYWNjcnVlZCwKICAgIC8vICAgICBlbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICBmcmFtZV9kaWcgLTEKICAgIHVuY292ZXIgMgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yKGRpc2NvdW50X2ZhY3RvcjogdWludDY0LCByZWRlbXB0aW9uX2ZhY3RvcjogdWludDY0KSAtPiB1aW50NjQ6Cl9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ2Mi00NjYKICAgIC8vIGRlZiBfZGlzY291bnRfYW5udWl0eV9mYWN0b3IoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBkaXNjb3VudF9mYWN0b3I6IFVJbnQ2NCwKICAgIC8vICAgICByZWRlbXB0aW9uX2ZhY3RvcjogVUludDY0LAogICAgLy8gKSAtPiBVSW50NjQ6CiAgICBwcm90byAyIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ2OAogICAgLy8gaWYgcmVkZW1wdGlvbl9mYWN0b3IgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0xCiAgICBibnogX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDY5CiAgICAvLyByZXR1cm4gZGlzY291bnRfZmFjdG9yCiAgICBmcmFtZV9kaWcgLTIKICAgIHJldHN1YgoKX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3MAogICAgLy8gcGVyaW9kX3JhdGUgPSBzZWxmLmZpeGVkX3BvaW50X3NjYWxlICsgc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzEKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzAtNDc0CiAgICAvLyBwZXJpb2RfcmF0ZSA9IHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgKyBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICByZWRlbXB0aW9uX2ZhY3RvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICBkaWcgMgogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgICsKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3NQogICAgLy8gYXNzZXJ0IHBlcmlvZF9yYXRlID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGR1cAogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDc4CiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDc2LTQ4MAogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIGRpc2NvdW50X2ZhY3RvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gICAgIHBlcmlvZF9yYXRlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkoZW50cnk6IGJ5dGVzLCBwYXlsb2FkOiBieXRlcykgLT4gYnl0ZXMsIGJ5dGVzOgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MTMtNjE1CiAgICAvLyBkZWYgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5KAogICAgLy8gICAgIHNlbGYsIGVudHJ5OiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSwgcGF5bG9hZDogdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0CiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAyIDIKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjIzCiAgICAvLyBhc3NlcnQgZW50cnkuZXZlbnRfaWQgPT0gc2VsZi5ldmVudF9jdXJzb3IsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGN1cnNvcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjI0CiAgICAvLyBhc3NlcnQgZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsIGVyci5OT19EVUVfQ0FTSEZMT1cKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPD0KICAgIGFzc2VydCAvLyBObyBkdWUgY2FzaGZsb3cgdG8gcGF5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MjYKICAgIC8vIGV2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYyNwogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX0lFRCk6CiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGR1cAogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYyOC02MzAKICAgIC8vICMgSUVEIGZpbmFsaXplcyBpc3N1YW5jZTogcmVzZXJ2ZWQgdW5pdHMgYmVjb21lIGFjdGl2YXRhYmxlIGFuZCB0aGUKICAgIC8vICMgc2NoZWR1bGUncyBpbml0aWFsIGNvbnRyYWN0dWFsIHN0YXRlIGJlY29tZXMgbGl2ZS4KICAgIC8vIGFzc2VydCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzIKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPT0gc2VsZi50b3RhbF91bml0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjMxLTYzMwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID09IHNlbGYudG90YWxfdW5pdHMKICAgIC8vICksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9JTkNPTVBMRVRFCiAgICBhc3NlcnQgLy8gUHJpbWFyeSBkaXN0cmlidXRpb24gaXMgbm90IGNvbXBsZXRlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzQKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjXzMgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM1CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzYKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAzMwogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzcKICAgIC8vIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM4CiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzkKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0MAogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX0FDVElWRSkKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgMTAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDUxCiAgICAvLyBhc3NlcnQgZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSA9PSBVSW50NjQoZW51bXMuRVZUX0lFRCksIGVyci5OT1RfRVZUX0lFRAogICAgZnJhbWVfZGlnIDExCiAgICBhc3NlcnQgLy8gTm90IElFRCBldmVudAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDUyCiAgICAvLyByZXR1cm4gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0MS02NDUKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1zZWxmLl9lbnRyeV9pZWRfYW1vdW50KGVudHJ5KSwKICAgIC8vICAgICBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0NAogICAgLy8gc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0MS02NDUKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1zZWxmLl9lbnRyeV9pZWRfYW1vdW50KGVudHJ5KSwKICAgIC8vICAgICBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICAvLyApCiAgICBjYWxsc3ViIF9lbWl0X2V4ZWN1dGlvbl9ldmVudAogICAgZHVwCiAgICBmcmFtZV9idXJ5IC0yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NDYKICAgIC8vIHJldHVybgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0OQogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ICs9IHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBmcmFtZV9idXJ5IC0yCiAgICArCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1MQogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1JSKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCAxMgogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMTAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1NQogICAgLy8gcGF5bG9hZC5vYnNlcnZlZF9yYXRlLAogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjU2CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzNiAvLyAicmF0ZV9yZXNldF9tdWx0aXBsaWVyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1NwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1Mi02NTgKICAgIC8vICMgUlIgZGVyaXZlcyB0aGUgbmV4dCByYXRlIGZyb20gYW4gb2JzZXJ2ZWQgb3JhY2xlIHZhbHVlIHBsdXMgdGhlCiAgICAvLyAjIGNvbnRyYWN0IHNwcmVhZCAvIG11bHRpcGxpZXIgdGVybXMsIHRoZW4gZW5mb3JjZXMgZmxvb3IgYW5kIGNhcC4KICAgIC8vIG9ic2VydmVkX3JhdGUgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBwYXlsb2FkLm9ic2VydmVkX3JhdGUsCiAgICAvLyAgICAgc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICkKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjAKICAgIC8vIG9ic2VydmVkX3JhdGUgKyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzUgLy8gInJhdGVfcmVzZXRfc3ByZWFkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkIGV4aXN0cwogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MzQKICAgIC8vIGlmIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgYW5kIHJhdGUgPCBzZWxmLnJhdGVfcmVzZXRfZmxvb3I6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzggLy8gImhhc19yYXRlX3Jlc2V0X2Zsb29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmhhc19yYXRlX3Jlc2V0X2Zsb29yIGV4aXN0cwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyOSAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X2Zsb29yIGV4aXN0cwogICAgZnJhbWVfZGlnIDYKICAgID4KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MzUKICAgIC8vIHJhdGUgPSBzZWxmLnJhdGVfcmVzZXRfZmxvb3IKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyOSAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDYKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfZmxvb3IgZXhpc3RzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1NToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjczNgogICAgLy8gaWYgc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgYW5kIHJhdGUgPiBzZWxmLnJhdGVfcmVzZXRfY2FwOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDM5IC8vICJoYXNfcmF0ZV9yZXNldF9jYXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwIGV4aXN0cwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTgKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMCAvLyAicmF0ZV9yZXNldF9jYXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9jYXAgZXhpc3RzCiAgICBmcmFtZV9kaWcgNgogICAgPAogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjczNwogICAgLy8gcmF0ZSA9IHNlbGYucmF0ZV9yZXNldF9jYXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMCAvLyAicmF0ZV9yZXNldF9jYXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSA2CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X2NhcCBleGlzdHMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjU5CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IHNlbGYuX2NsYW1wX3JhdGUoCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NTktNjYxCiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IHNlbGYuX2NsYW1wX3JhdGUoCiAgICAvLyAgICAgb2JzZXJ2ZWRfcmF0ZSArIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQKICAgIC8vICkKICAgIGZyYW1lX2RpZyA2CiAgICBhcHBfZ2xvYmFsX3B1dAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMTg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzEKICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QSSk6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMjAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY3MgogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzMKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDIzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc4CiAgICAvLyBpZiBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKToKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAyOQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc5CiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFJGKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCA1CiAgICA9PQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMzAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5MAogICAgLy8gZGlzY291bnRfZmFjdG9yID0gc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0OTEKICAgIC8vIGRlbm9taW5hdG9yID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0OTIKICAgIC8vIHNraXBfZmlyc3RfcmVkZW1wdGlvbiA9IEZhbHNlCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSA3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0OTQKICAgIC8vIGlmIGVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IgPiBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMjUKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgOAogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMzUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5NS00OTkKICAgIC8vICMgQW4gaW5pdGlhbCBQUkYgbWF5IGRlc2NyaWJlIHRoZSBmaXJzdCByZWRlbXB0aW9uIHBlcmlvZCBkaXJlY3RseS4KICAgIC8vIGRpc2NvdW50X2ZhY3RvciA9IHNlbGYuX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yKAogICAgLy8gICAgIGRpc2NvdW50X2ZhY3RvciwKICAgIC8vICAgICBlbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyA4CiAgICBjYWxsc3ViIF9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwMQogICAgLy8gc2tpcF9maXJzdF9yZWRlbXB0aW9uID0gVHJ1ZQogICAgaW50Y18xIC8vIDEKICAgIGZyYW1lX2J1cnkgNwogICAgZnJhbWVfYnVyeSAxCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAzNToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwMwogICAgLy8gZnV0dXJlX2V2ZW50X2lkID0gc2VsZi5ldmVudF9jdXJzb3IgKyBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X3doaWxlX3RvcEAzNjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwNAogICAgLy8gd2hpbGUgZnV0dXJlX2V2ZW50X2lkIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGZyYW1lX2RpZyAzCiAgICA+CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfd2hpbGVANDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwNQogICAgLy8gZnV0dXJlX2VudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KGZ1dHVyZV9ldmVudF9pZCkKICAgIGZyYW1lX2RpZyAzCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MDYKICAgIC8vIGZ1dHVyZV9ldmVudF90eXBlID0gZnV0dXJlX2VudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA3LTUwOAogICAgLy8gIyBPbmx5IHJlZGVtcHRpb24tYmVhcmluZyBldmVudHMgY29udHJpYnV0ZSB0byB0aGUgYW5udWl0eSBkZW5vbWluYXRvci4KICAgIC8vIGlzX3JlZGVtcHRpb25fZXZlbnQgPSBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1BSKSBvciAoCiAgICBwdXNoaW50IDMKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MDctNTExCiAgICAvLyAjIE9ubHkgcmVkZW1wdGlvbi1iZWFyaW5nIGV2ZW50cyBjb250cmlidXRlIHRvIHRoZSBhbm51aXR5IGRlbm9taW5hdG9yLgogICAgLy8gaXNfcmVkZW1wdGlvbl9ldmVudCA9IGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpIG9yICgKICAgIC8vICAgICBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgLy8gICAgIGFuZCBmdXR1cmVfZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKQogICAgLy8gKQogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX3RydWVANDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwOQogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCkKICAgIGZyYW1lX2RpZyA0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA5LTUxMAogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCkKICAgIC8vIGFuZCBmdXR1cmVfZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUxMAogICAgLy8gYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICBmcmFtZV9kaWcgMAogICAgcHVzaGludCAyNQogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwOS01MTAKICAgIC8vIGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfTUQpCiAgICAvLyBhbmQgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IgPiBVSW50NjQoMCkKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX2ZhbHNlQDQxCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF90cnVlQDQwOgogICAgaW50Y18xIC8vIDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX21lcmdlQDQyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTEyCiAgICAvLyBpZiBpc19yZWRlbXB0aW9uX2V2ZW50OgogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANDcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUxMwogICAgLy8gaWYgc2tpcF9maXJzdF9yZWRlbXB0aW9uOgogICAgZnJhbWVfZGlnIDcKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlANDUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUxNAogICAgLy8gc2tpcF9maXJzdF9yZWRlbXB0aW9uID0gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDcKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDQ3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTIxCiAgICAvLyBmdXR1cmVfZXZlbnRfaWQgKz0gVUludDY0KDEpCiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMwogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfd2hpbGVfdG9wQDM2CgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDQ1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTE4CiAgICAvLyBmdXR1cmVfZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIGZyYW1lX2RpZyAwCiAgICBwdXNoaW50IDI1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTE2LTUxOQogICAgLy8gZGlzY291bnRfZmFjdG9yID0gc2VsZi5fZGlzY291bnRfYW5udWl0eV9mYWN0b3IoCiAgICAvLyAgICAgZGlzY291bnRfZmFjdG9yLAogICAgLy8gICAgIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDIKICAgIHN3YXAKICAgIGNhbGxzdWIgX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTIwCiAgICAvLyBkZW5vbWluYXRvciArPSBkaXNjb3VudF9mYWN0b3IKICAgIGZyYW1lX2RpZyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANDcKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX2ZhbHNlQDQxOgogICAgaW50Y18wIC8vIDAKICAgIGIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfbWVyZ2VANDIKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl93aGlsZUA0ODoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUyMwogICAgLy8gYXNzZXJ0IGRlbm9taW5hdG9yID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGZyYW1lX2RpZyAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjQKICAgIC8vIG51bWVyYXRvciA9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUyNQogICAgLy8gaWYgZW50cnkuZmxhZ3MgJiBVSW50NjQoZW51bXMuRkxBR19JTklUSUFMX1BSRikgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDU3CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18yIC8vIDgKICAgICYKICAgIGJueiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1MAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTI2LTUyNwogICAgLy8gIyBTdWJzZXF1ZW50IFBSRiBldmVudHMgYW1vcnRpemUgYm90aCBwcmluY2lwYWwgYW5kIGFscmVhZHkgYWNjcnVlZCBjYXJyeS4KICAgIC8vIG51bWVyYXRvciArPSBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICArCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1MDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUzMAogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUyOC01MzIKICAgIC8vIHJldHVybiBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBudW1lcmF0b3IsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICAgICBkZW5vbWluYXRvciwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAxCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjgwCiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBzZWxmLl9yZWNhbGN1bGF0ZV9hbm51aXR5X3BheW1lbnQoCiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4MC02ODIKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IHNlbGYuX3JlY2FsY3VsYXRlX2FubnVpdHlfcGF5bWVudCgKICAgIC8vICAgICBlbnRyeQogICAgLy8gKQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDMwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njg1CiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODYtNjkwCiAgICAvLyBzZWxmLl9lbWl0X2V4ZWN1dGlvbl9ldmVudCgKICAgIC8vICAgICBlbnRyeT1lbnRyeSwKICAgIC8vICAgICBwYXlvZmY9VUludDY0KDApLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njg4CiAgICAvLyBwYXlvZmY9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4OQogICAgLy8gc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODYtNjkwCiAgICAvLyBzZWxmLl9lbWl0X2V4ZWN1dGlvbl9ldmVudCgKICAgIC8vICAgICBlbnRyeT1lbnRyeSwKICAgIC8vICAgICBwYXlvZmY9VUludDY0KDApLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGNhbGxzdWIgX2VtaXRfZXhlY3V0aW9uX2V2ZW50CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfYnVyeSAxCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAyOToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4NAogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gZW50cnkubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDQxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAzMAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAyMDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY3NAogICAgLy8gZWxpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfSVBDQik6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgMTgKICAgID09CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAyMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc1LTY3NgogICAgLy8gIyBJUENCIGtlZXBzIHByaW5jaXBhbCB1bmNoYW5nZWQgYW5kIG9ubHkgcmVzZXRzIHRoZSBpbnRlcmVzdCBiYXNlLgogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDIzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDEwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjYyCiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9SUkYpOgogICAgZnJhbWVfZGlnIDEwCiAgICBwdXNoaW50IDExCiAgICA9PQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAxNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjYzCiAgICAvLyBuZXh0X3JhdGUgPSBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZQogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2NAogICAgLy8gaWYgbmV4dF9yYXRlID09IFVJbnQ2NCgwKToKICAgIGJueiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAxMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY1CiAgICAvLyBuZXh0X3JhdGUgPSBzZWxmLnJhdGVfcmVzZXRfbmV4dAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDM3IC8vICJyYXRlX3Jlc2V0X25leHQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSA1CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X25leHQgZXhpc3RzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2NgogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPSBuZXh0X3JhdGUKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGZyYW1lX2RpZyA1CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAxOAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAxNDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2OAogICAgLy8gaWYgZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUgIT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDkKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjkKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGZyYW1lX2RpZyA5CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAxOAoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbWl0X2V4ZWN1dGlvbl9ldmVudChlbnRyeTogYnl0ZXMsIHBheW9mZjogdWludDY0LCBzZXR0bGVkX2Ftb3VudDogdWludDY0KSAtPiBieXRlczoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njk2LTcwMgogICAgLy8gZGVmIF9lbWl0X2V4ZWN1dGlvbl9ldmVudCgKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgICosCiAgICAvLyAgICAgZW50cnk6IHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5LAogICAgLy8gICAgIHBheW9mZjogVUludDY0LAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50OiBVSW50NjQsCiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAzIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcwNgogICAgLy8gY29udHJhY3RfaWQ9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25faWQuaWQsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uSUQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcwNwogICAgLy8gZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzA4CiAgICAvLyBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICBmcmFtZV9kaWcgLTMKICAgIGV4dHJhY3QgOCAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MDkKICAgIC8vIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgZnJhbWVfZGlnIC0zCiAgICBleHRyYWN0IDkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzEwCiAgICAvLyBhcHBsaWVkX2F0PUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzEzCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBmcmFtZV9kaWcgLTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcwOAogICAgLy8gZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgaW50Y18yIC8vIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxMwogICAgLy8gc2VsZi5fcGF5b2ZmX3NpZ24oZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSwgcGF5b2ZmKQogICAgZ2V0Ynl0ZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzQyCiAgICAvLyBpZiBwYXlvZmYgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0yCiAgICBibnogX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzQzCiAgICAvLyByZXR1cm4gVUludDY0KGVudW1zLlBBWU9GRl9TSUdOX1BPU0lUSVZFKQogICAgaW50Y18xIC8vIDEKCl9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9wYXlvZmZfc2lnbkA3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzEyLTcxNAogICAgLy8gcGF5b2ZmX3NpZ249YXJjNC5VSW50OCgKICAgIC8vICAgICBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICAvLyApLAogICAgaXRvYgogICAgZHVwCiAgICBiaXRsZW4KICAgIGludGNfMiAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBleHRyYWN0IDcgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE2CiAgICAvLyBjdXJyZW5jeV9pZD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxNwogICAgLy8gc2VxdWVuY2U9ZW50cnkuZXZlbnRfaWQgKyBVSW50NjQoMSksCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzA1LTcxOAogICAgLy8gRXhlY3V0aW9uRXZlbnQoCiAgICAvLyAgICAgY29udHJhY3RfaWQ9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25faWQuaWQsCiAgICAvLyAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgcGF5b2ZmPXBheW9mZiwKICAgIC8vICAgICBwYXlvZmZfc2lnbj1hcmM0LlVJbnQ4KAogICAgLy8gICAgICAgICBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBzZXR0bGVkX2Ftb3VudD1zZXR0bGVkX2Ftb3VudCwKICAgIC8vICAgICBjdXJyZW5jeV9pZD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgc2VxdWVuY2U9ZW50cnkuZXZlbnRfaWQgKyBVSW50NjQoMSksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMAogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAyCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAzCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyA0CiAgICBpdG9iCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMgogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcwNC03MTkKICAgIC8vIGFyYzQuZW1pdCgKICAgIC8vICAgICBFeGVjdXRpb25FdmVudCgKICAgIC8vICAgICAgICAgY29udHJhY3RfaWQ9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25faWQuaWQsCiAgICAvLyAgICAgICAgIGV2ZW50X2lkPWVudHJ5LmV2ZW50X2lkLAogICAgLy8gICAgICAgICBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICAvLyAgICAgICAgIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgICAgICBhcHBsaWVkX2F0PUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gICAgICAgICBwYXlvZmY9cGF5b2ZmLAogICAgLy8gICAgICAgICBwYXlvZmZfc2lnbj1hcmM0LlVJbnQ4KAogICAgLy8gICAgICAgICAgICAgc2VsZi5fcGF5b2ZmX3NpZ24oZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSwgcGF5b2ZmKQogICAgLy8gICAgICAgICApLAogICAgLy8gICAgICAgICBzZXR0bGVkX2Ftb3VudD1zZXR0bGVkX2Ftb3VudCwKICAgIC8vICAgICAgICAgY3VycmVuY3lfaWQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgICAgICBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIC8vICAgICApCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHg5YTMzMmI5NSAvLyBtZXRob2QgIkV4ZWN1dGlvbkV2ZW50KHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDQKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gKFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwgVUludDY0KGVudW1zLkVWVF9QSSkpOgogICAgZnJhbWVfZGlnIDUKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYm56IF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9pZl9ib2R5QDUKICAgIGZyYW1lX2RpZyA1CiAgICBwdXNoaW50IDQKICAgID09CiAgICBieiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUA2CgpfZW1pdF9leGVjdXRpb25fZXZlbnRfaWZfYm9keUA1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzQ1CiAgICAvLyByZXR1cm4gVUludDY0KGVudW1zLlBBWU9GRl9TSUdOX1BPU0lUSVZFKQogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxMwogICAgLy8gc2VsZi5fcGF5b2ZmX3NpZ24oZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSwgcGF5b2ZmKQogICAgYiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fcGF5b2ZmX3NpZ25ANwoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc0NgogICAgLy8gcmV0dXJuIFVJbnQ2NChlbnVtcy5QQVlPRkZfU0lHTl9ORUdBVElWRSkKICAgIHB1c2hpbnQgMjU1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTMKICAgIC8vIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIGIgX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX3BheW9mZl9zaWduQDcKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fcm9sZV9pc19hY3RpdmUocm9sZV9tYXA6IGJ5dGVzLCByb2xlX2FkZHJlc3M6IGJ5dGVzKSAtPiB1aW50NjQ6Cl9yb2xlX2lzX2FjdGl2ZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NwogICAgLy8gZGVmIF9yb2xlX2lzX2FjdGl2ZShzZWxmLCByb2xlX21hcDogdHlwLlJiYWNSb2xlLCByb2xlX2FkZHJlc3M6IEFjY291bnQpIC0+IGJvb2w6CiAgICBwcm90byAyIDEKICAgIHB1c2hieXRlcyAiIgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU4LTYyCiAgICAvLyByZXR1cm4gc2VsZi5faGFzX3JvbGUocm9sZV9tYXAsIHJvbGVfYWRkcmVzcykgYW5kICgKICAgIC8vICAgICByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICkKICAgIGJ6IF9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIEJveE1hcCBlbnRyeSBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYwCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MAogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgPD0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYxCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIEJveE1hcCBlbnRyeSBleGlzdHMKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYwLTYxCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDAKICAgID49CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTktNjEKICAgIC8vIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IF9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQKICAgIGludGNfMSAvLyAxCgpfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU4LTYyCiAgICAvLyByZXR1cm4gc2VsZi5faGFzX3JvbGUocm9sZV9tYXAsIHJvbGVfYWRkcmVzcykgYW5kICgKICAgIC8vICAgICByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICkKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgX3JvbGVfaXNfYWN0aXZlX2Jvb2xfbWVyZ2VANQoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkgLT4gdm9pZDoKX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjUKICAgIC8vIGFzc2VydCBzZWxmLl9pc19hcnJhbmdlcihUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjUyCiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzID09IHNlbGYuYXJyYW5nZXIudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOCAvLyAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcnJhbmdlciBleGlzdHMKICAgID09CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjUKICAgIC8vIGFzc2VydCBzZWxmLl9pc19hcnJhbmdlcihUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKSAtPiB2b2lkOgpfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODMKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5hc3NldF9kZWZhdWx0ZWQsIGVyci5ERUZBVUxURUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0MSAvLyAiYXNzZXRfZGVmYXVsdGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2RlZmF1bHRlZCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBEZWZhdWx0ZWQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpIC0+IHZvaWQ6Cl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4NgogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFzc2V0X3N1c3BlbmRlZCwgZXJyLlNVU1BFTkRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDMzIC8vICJhc3NldF9zdXNwZW5kZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfc3VzcGVuZGVkIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIFN1c3BlbmRlZCBvcGVyYXRpb25zCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZDogdWludDY0KSAtPiB2b2lkOgpfYXNzZXJ0X3ZhbGlkX3JvbGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODgKICAgIC8vIGRlZiBfYXNzZXJ0X3ZhbGlkX3JvbGUoc2VsZiwgcm9sZV9pZDogVUludDY0KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkwCiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICBwdXNoaW50IDIwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MQogICAgLy8gVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIHB1c2hpbnQgMjUKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkyCiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgcHVzaGludCA0MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTMKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIHB1c2hpbnQgNTAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojk0CiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIHB1c2hpbnQgNjAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojk1CiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgcHVzaGludCA3MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTYKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIHB1c2hpbnQgODAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJ6IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX2ZhbHNlQDgKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANzoKICAgIGludGNfMSAvLyAxCgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9tZXJnZUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBhc3NlcnQgLy8gSW52YWxpZCByb2xlIGlkZW50aWZpZXIKICAgIHJldHN1YgoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfZmFsc2VAODoKICAgIGludGNfMCAvLyAwCiAgICBiIF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX21lcmdlQDkK", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="}, "sourceInfo": {"approval": {"pcOffsetMethod": "none", "sourceInfo": [{"pc": [2601], "errorMessage": "ACTUS event not yet executed"}, {"pc": [2358], "errorMessage": "Can not distribute zero units"}, {"pc": [3102, 3109, 3481], "errorMessage": "D-ASA already configured"}, {"pc": [1238, 1939, 2318, 2464, 3733, 3880, 4226, 4372], "errorMessage": "D-ASA not configured"}, {"pc": [3492], "errorMessage": "D-ASA terms not configured"}, {"pc": [6541], "errorMessage": "Defaulted"}, {"pc": [3120], "errorMessage": "Denomination asset is not properly set"}, {"pc": [3135], "errorMessage": "Different settlement asset not supported, must be equal to denomination asset"}, {"pc": [3370, 3377, 3379], "errorMessage": "IED must be set in the future"}, {"pc": [1256, 2008, 2479, 5914], "errorMessage": "IED not yet executed"}, {"pc": [2371, 5297], "errorMessage": "Insufficient remaining D-ASA units"}, {"pc": [2574, 2641], "errorMessage": "Insufficient sender units to transfer"}, {"pc": [1835, 3022, 3040, 3096, 3603, 3641, 5482, 5760, 5820, 6203], "errorMessage": "Invalid ACTUS configuration"}, {"pc": [1948, 2352, 2535, 2550, 2708, 2781, 2844, 2886, 5109, 5234], "errorMessage": "Invalid account holding address"}, {"pc": [4564, 4588, 4612, 4636, 4660, 4717, 4745, 4767, 4789, 4811, 4990, 5008, 5023, 5038, 5053], "errorMessage": "Invalid account role address"}, {"pc": [3082], "errorMessage": "Invalid day-count convention ID"}, {"pc": [1347, 3755, 4089, 5792], "errorMessage": "Invalid event cursor"}, {"pc": [3588, 3654, 3933, 5398], "errorMessage": "Invalid event id"}, {"pc": [3768, 4153, 4160], "errorMessage": "Invalid event type"}, {"pc": [4701, 4980, 6611], "errorMessage": "Invalid role identifier"}, {"pc": [3486, 3666, 3674, 3989, 5413, 5429], "errorMessage": "Invalid schedule page"}, {"pc": [5345], "errorMessage": "No D-ASA units"}, {"pc": [1353, 1864, 2045, 5801], "errorMessage": "No due cashflow to pay"}, {"pc": [5883], "errorMessage": "Not IED event"}, {"pc": [1993, 2326, 2522, 2698, 2754, 2764, 2850, 4188, 4834, 6533], "errorMessage": "Not authorized"}, {"pc": [1474, 1482, 2094, 2168, 2177], "errorMessage": "Not enough funds for the payment"}, {"pc": [3905, 3918], "errorMessage": "Observed event required to execute this action"}, {"pc": [2340, 2388], "errorMessage": "Primary distribution is closed"}, {"pc": [5832], "errorMessage": "Primary distribution is not complete"}, {"pc": [2563], "errorMessage": "Sender and receiver must be different"}, {"pc": [5095, 6549], "errorMessage": "Suspended operations"}, {"pc": [2275, 3631], "errorMessage": "Time events must be sorted in strictly ascending order"}, {"pc": [2496, 2513], "errorMessage": "Transfer is closed"}, {"pc": [2567], "errorMessage": "Transfer units must be greater than zero"}, {"pc": [988], "errorMessage": "Wrong Global Bytes allocation"}, {"pc": [994], "errorMessage": "Wrong Global UInts allocation"}, {"pc": [998], "errorMessage": "Wrong Local Bytes allocation"}, {"pc": [1002], "errorMessage": "Wrong Local UInts allocation"}, {"pc": [1455, 2087], "errorMessage": "account opted into asset"}, {"pc": [6493, 6508], "errorMessage": "check BoxMap entry exists"}, {"pc": [1984, 2022, 2063, 2101, 2392, 2570, 2630, 2656, 5089, 5255], "errorMessage": "check self.account entry exists"}, {"pc": [1536, 1762, 1847, 4283, 5919, 6222], "errorMessage": "check self.accrued_interest exists"}, {"pc": [4852, 6531], "errorMessage": "check self.arranger exists"}, {"pc": [6539], "errorMessage": "check self.asset_defaulted exists"}, {"pc": [6547], "errorMessage": "check self.asset_suspended exists"}, {"pc": [3030, 3475, 3901, 3913, 4231, 5644], "errorMessage": "check self.contract_type exists"}, {"pc": [1504, 4288, 5117, 5195], "errorMessage": "check self.cumulative_interest_index exists"}, {"pc": [1516, 4293, 5128, 5203], "errorMessage": "check self.cumulative_principal_index exists"}, {"pc": [5654], "errorMessage": "check self.dynamic_principal_redemption exists"}, {"pc": [1271, 1284, 1345, 1586, 2578, 2591, 3746, 4082, 4259, 4376, 4389, 4426, 5210, 5790, 5871, 6103, 6241], "errorMessage": "check self.event_cursor exists"}, {"pc": [5143, 5157, 5350, 5379, 5710, 5718, 5745, 5765, 5954, 6067, 6228], "errorMessage": "check self.fixed_point_scale exists"}, {"pc": [5997], "errorMessage": "check self.has_rate_reset_cap exists"}, {"pc": [5970], "errorMessage": "check self.has_rate_reset_floor exists"}, {"pc": [3107, 3491, 4255, 5888], "errorMessage": "check self.initial_exchange_amount exists"}, {"pc": [2376, 2386], "errorMessage": "check self.initial_exchange_date exists"}, {"pc": [1707, 4273, 5686, 5700], "errorMessage": "check self.interest_calculation_base exists"}, {"pc": [1778, 1793], "errorMessage": "check self.next_principal_redemption exists"}, {"pc": [4278, 5678, 5705, 5750], "errorMessage": "check self.nominal_interest_rate exists"}, {"pc": [1953, 1966], "errorMessage": "check self.op_daemon exists"}, {"pc": [1607, 1674, 1699, 1752, 1803, 1811, 1832, 4268, 6207, 6287], "errorMessage": "check self.outstanding_principal exists"}, {"pc": [6005, 6019], "errorMessage": "check self.rate_reset_cap exists"}, {"pc": [5978, 5992], "errorMessage": "check self.rate_reset_floor exists"}, {"pc": [5949], "errorMessage": "check self.rate_reset_multiplier exists"}, {"pc": [6321], "errorMessage": "check self.rate_reset_next exists"}, {"pc": [5962], "errorMessage": "check self.rate_reset_spread exists"}, {"pc": [1460, 2163, 4298], "errorMessage": "check self.reserved_interest exists"}, {"pc": [1465, 1494, 2173, 2188, 4303], "errorMessage": "check self.reserved_principal exists"}, {"pc": [2363, 2411, 4250, 5292, 5825], "errorMessage": "check self.reserved_units_total exists"}, {"pc": [1276, 2583, 3751, 3931, 3949, 4072, 4264, 4381, 5394, 6112], "errorMessage": "check self.schedule_entry_count exists"}, {"pc": [3979], "errorMessage": "check self.schedule_page entry exists"}, {"pc": [1452, 2053, 2081, 6393], "errorMessage": "check self.settlement_asset_id exists"}, {"pc": [1237, 1251, 1938, 2003, 2317, 2336, 2463, 2474, 2758, 3100, 3479, 3732, 3879, 4224, 4371, 5238, 5816, 5909], "errorMessage": "check self.status exists"}, {"pc": [2369, 2422, 4245, 5343, 5374, 5830], "errorMessage": "check self.total_units exists"}, {"pc": [2501, 2511], "errorMessage": "check self.transfer_closure_date exists"}, {"pc": [2484, 2492], "errorMessage": "check self.transfer_opening_date exists"}, {"pc": [3565, 3624], "errorMessage": "index access is out of bounds"}, {"pc": [1922, 2967, 3449, 3984], "errorMessage": "invalid array length header"}, {"pc": [2688, 3437, 4824], "errorMessage": "invalid number of bytes for arc4.bool"}, {"pc": [1930], "errorMessage": "invalid number of bytes for arc4.dynamic_array"}, {"pc": [3464], "errorMessage": "invalid number of bytes for arc4.dynamic_array"}, {"pc": [1916, 2301, 2441, 2449, 2680, 2738, 2746, 2826, 2834, 2877, 2902, 4445, 4469, 4503, 4684, 4866, 4950], "errorMessage": "invalid number of bytes for arc4.static_array"}, {"pc": [1232, 2259, 2268, 2309, 2458, 3427, 3864], "errorMessage": "invalid number of bytes for arc4.uint64"}, {"pc": [4493, 4674, 4940], "errorMessage": "invalid number of bytes for arc4.uint8"}, {"pc": [2939], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.InitialKernelState"}, {"pc": [2928], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.NormalizedActusTerms"}, {"pc": [3875], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.ObservedEventRequest"}, {"pc": [2972], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.Prospectus"}, {"pc": [4514], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.RoleValidity"}, {"pc": [2956], "errorMessage": "invalid tail pointer at index 1 of (uint8[32],(len+utf8[]))"}, {"pc": [2951], "errorMessage": "invalid tuple encoding"}, {"pc": [4051], "errorMessage": "max array length exceeded"}, {"pc": [4237, 6385], "errorMessage": "overflow"}]}, "clear": {"pcOffsetMethod": "none", "sourceInfo": []}}, "templateVariables": {}}""" APP_SPEC = algokit_utils.Arc56Contract.from_json(_APP_SPEC_JSON) def _parse_abi_args(args: object | None = None) -> list[object] | None: @@ -209,14 +209,14 @@ def abi_method_signature(self) -> str: return "claim_due_cashflows(address,byte[])(uint64,uint64,uint64,uint64,byte[])" @dataclasses.dataclass(frozen=True, kw_only=True) -class SetTransferScheduleArgs: - """Dataclass for set_transfer_schedule arguments""" +class TransferSetScheduleArgs: + """Dataclass for transfer_set_schedule arguments""" open_date: int closure_date: int @property def abi_method_signature(self) -> str: - return "set_transfer_schedule(uint64,uint64)uint64" + return "transfer_set_schedule(uint64,uint64)uint64" @dataclasses.dataclass(frozen=True, kw_only=True) class PrimaryDistributionArgs: @@ -240,14 +240,14 @@ def abi_method_signature(self) -> str: return "transfer(address,address,uint64)uint64" @dataclasses.dataclass(frozen=True, kw_only=True) -class AccountGovSuspensionArgs: - """Dataclass for account_gov_suspension arguments""" +class AccountSuspensionArgs: + """Dataclass for account_suspension arguments""" holding_address: str suspended: bool @property def abi_method_signature(self) -> str: - return "account_gov_suspension(address,bool)uint64" + return "account_suspension(address,bool)uint64" @dataclasses.dataclass(frozen=True, kw_only=True) class AccountOpenArgs: @@ -350,13 +350,13 @@ def abi_method_signature(self) -> str: return "rbac_revoke_role(uint8,address)uint64" @dataclasses.dataclass(frozen=True, kw_only=True) -class RbacGovAssetSuspensionArgs: - """Dataclass for rbac_gov_asset_suspension arguments""" +class RbacContractSuspensionArgs: + """Dataclass for rbac_contract_suspension arguments""" suspended: bool @property def abi_method_signature(self) -> str: - return "rbac_gov_asset_suspension(bool)uint64" + return "rbac_contract_suspension(bool)uint64" @dataclasses.dataclass(frozen=True, kw_only=True) class RbacGetAddressRolesArgs: @@ -439,16 +439,16 @@ def claim_due_cashflows( "args": method_args, })) - def set_transfer_schedule( + def transfer_set_schedule( self, - args: tuple[int, int] | SetTransferScheduleArgs, + args: tuple[int, int] | TransferSetScheduleArgs, params: algokit_utils.CommonAppCallParams | None = None ) -> algokit_utils.AppCallMethodCallParams: method_args = _parse_abi_args(args) params = params or algokit_utils.CommonAppCallParams() return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ **dataclasses.asdict(params), - "method": "set_transfer_schedule(uint64,uint64)uint64", + "method": "transfer_set_schedule(uint64,uint64)uint64", "args": method_args, })) @@ -478,16 +478,16 @@ def transfer( "args": method_args, })) - def account_gov_suspension( + def account_suspension( self, - args: tuple[str, bool] | AccountGovSuspensionArgs, + args: tuple[str, bool] | AccountSuspensionArgs, params: algokit_utils.CommonAppCallParams | None = None ) -> algokit_utils.AppCallMethodCallParams: method_args = _parse_abi_args(args) params = params or algokit_utils.CommonAppCallParams() return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ **dataclasses.asdict(params), - "method": "account_gov_suspension(address,bool)uint64", + "method": "account_suspension(address,bool)uint64", "args": method_args, })) @@ -556,7 +556,7 @@ def contract_schedule( "args": method_args, })) - def execute_ied( + def contract_execute_ied( self, params: algokit_utils.CommonAppCallParams | None = None ) -> algokit_utils.AppCallMethodCallParams: @@ -564,7 +564,7 @@ def execute_ied( params = params or algokit_utils.CommonAppCallParams() return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ **dataclasses.asdict(params), - "method": "execute_ied()uint64", + "method": "contract_execute_ied()uint64", })) def apply_non_cash_event( @@ -580,7 +580,7 @@ def apply_non_cash_event( "args": method_args, })) - def get_contract_state( + def contract_get_state( self, params: algokit_utils.CommonAppCallParams | None = None ) -> algokit_utils.AppCallMethodCallParams: @@ -588,10 +588,10 @@ def get_contract_state( params = params or algokit_utils.CommonAppCallParams() return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ **dataclasses.asdict(params), - "method": "get_contract_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", + "method": "contract_get_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", })) - def get_next_due_event( + def contract_get_next_due_event( self, params: algokit_utils.CommonAppCallParams | None = None ) -> algokit_utils.AppCallMethodCallParams: @@ -599,7 +599,7 @@ def get_next_due_event( params = params or algokit_utils.CommonAppCallParams() return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ **dataclasses.asdict(params), - "method": "get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", + "method": "contract_get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", })) def rbac_rotate_arranger( @@ -654,16 +654,16 @@ def rbac_revoke_role( "args": method_args, })) - def rbac_gov_asset_suspension( + def rbac_contract_suspension( self, - args: tuple[bool] | RbacGovAssetSuspensionArgs, + args: tuple[bool] | RbacContractSuspensionArgs, params: algokit_utils.CommonAppCallParams | None = None ) -> algokit_utils.AppCallMethodCallParams: method_args = _parse_abi_args(args) params = params or algokit_utils.CommonAppCallParams() return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ **dataclasses.asdict(params), - "method": "rbac_gov_asset_suspension(bool)uint64", + "method": "rbac_contract_suspension(bool)uint64", "args": method_args, })) @@ -780,16 +780,16 @@ def claim_due_cashflows( "args": method_args, })) - def set_transfer_schedule( + def transfer_set_schedule( self, - args: tuple[int, int] | SetTransferScheduleArgs, + args: tuple[int, int] | TransferSetScheduleArgs, params: algokit_utils.CommonAppCallParams | None = None ) -> algokit_utils.BuiltTransactions: method_args = _parse_abi_args(args) params = params or algokit_utils.CommonAppCallParams() return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ **dataclasses.asdict(params), - "method": "set_transfer_schedule(uint64,uint64)uint64", + "method": "transfer_set_schedule(uint64,uint64)uint64", "args": method_args, })) @@ -819,16 +819,16 @@ def transfer( "args": method_args, })) - def account_gov_suspension( + def account_suspension( self, - args: tuple[str, bool] | AccountGovSuspensionArgs, + args: tuple[str, bool] | AccountSuspensionArgs, params: algokit_utils.CommonAppCallParams | None = None ) -> algokit_utils.BuiltTransactions: method_args = _parse_abi_args(args) params = params or algokit_utils.CommonAppCallParams() return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ **dataclasses.asdict(params), - "method": "account_gov_suspension(address,bool)uint64", + "method": "account_suspension(address,bool)uint64", "args": method_args, })) @@ -897,7 +897,7 @@ def contract_schedule( "args": method_args, })) - def execute_ied( + def contract_execute_ied( self, params: algokit_utils.CommonAppCallParams | None = None ) -> algokit_utils.BuiltTransactions: @@ -905,7 +905,7 @@ def execute_ied( params = params or algokit_utils.CommonAppCallParams() return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ **dataclasses.asdict(params), - "method": "execute_ied()uint64", + "method": "contract_execute_ied()uint64", })) def apply_non_cash_event( @@ -921,7 +921,7 @@ def apply_non_cash_event( "args": method_args, })) - def get_contract_state( + def contract_get_state( self, params: algokit_utils.CommonAppCallParams | None = None ) -> algokit_utils.BuiltTransactions: @@ -929,10 +929,10 @@ def get_contract_state( params = params or algokit_utils.CommonAppCallParams() return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ **dataclasses.asdict(params), - "method": "get_contract_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", + "method": "contract_get_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", })) - def get_next_due_event( + def contract_get_next_due_event( self, params: algokit_utils.CommonAppCallParams | None = None ) -> algokit_utils.BuiltTransactions: @@ -940,7 +940,7 @@ def get_next_due_event( params = params or algokit_utils.CommonAppCallParams() return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ **dataclasses.asdict(params), - "method": "get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", + "method": "contract_get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", })) def rbac_rotate_arranger( @@ -995,16 +995,16 @@ def rbac_revoke_role( "args": method_args, })) - def rbac_gov_asset_suspension( + def rbac_contract_suspension( self, - args: tuple[bool] | RbacGovAssetSuspensionArgs, + args: tuple[bool] | RbacContractSuspensionArgs, params: algokit_utils.CommonAppCallParams | None = None ) -> algokit_utils.BuiltTransactions: method_args = _parse_abi_args(args) params = params or algokit_utils.CommonAppCallParams() return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ **dataclasses.asdict(params), - "method": "rbac_gov_asset_suspension(bool)uint64", + "method": "rbac_contract_suspension(bool)uint64", "args": method_args, })) @@ -1130,9 +1130,9 @@ def claim_due_cashflows( parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(CashClaimResult, typing.cast(dict, response.abi_return))) # type: ignore return typing.cast(algokit_utils.SendAppTransactionResult[CashClaimResult], parsed_response) - def set_transfer_schedule( + def transfer_set_schedule( self, - args: tuple[int, int] | SetTransferScheduleArgs, + args: tuple[int, int] | TransferSetScheduleArgs, params: algokit_utils.CommonAppCallParams | None = None, send_params: algokit_utils.SendParams | None = None ) -> algokit_utils.SendAppTransactionResult[int]: @@ -1140,7 +1140,7 @@ def set_transfer_schedule( params = params or algokit_utils.CommonAppCallParams() response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ **dataclasses.asdict(params), - "method": "set_transfer_schedule(uint64,uint64)uint64", + "method": "transfer_set_schedule(uint64,uint64)uint64", "args": method_args, }), send_params=send_params) parsed_response = response @@ -1178,9 +1178,9 @@ def transfer( parsed_response = response return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - def account_gov_suspension( + def account_suspension( self, - args: tuple[str, bool] | AccountGovSuspensionArgs, + args: tuple[str, bool] | AccountSuspensionArgs, params: algokit_utils.CommonAppCallParams | None = None, send_params: algokit_utils.SendParams | None = None ) -> algokit_utils.SendAppTransactionResult[int]: @@ -1188,7 +1188,7 @@ def account_gov_suspension( params = params or algokit_utils.CommonAppCallParams() response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ **dataclasses.asdict(params), - "method": "account_gov_suspension(address,bool)uint64", + "method": "account_suspension(address,bool)uint64", "args": method_args, }), send_params=send_params) parsed_response = response @@ -1274,7 +1274,7 @@ def contract_schedule( parsed_response = response return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - def execute_ied( + def contract_execute_ied( self, params: algokit_utils.CommonAppCallParams | None = None, send_params: algokit_utils.SendParams | None = None @@ -1283,7 +1283,7 @@ def execute_ied( params = params or algokit_utils.CommonAppCallParams() response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ **dataclasses.asdict(params), - "method": "execute_ied()uint64", + "method": "contract_execute_ied()uint64", }), send_params=send_params) parsed_response = response return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) @@ -1304,7 +1304,7 @@ def apply_non_cash_event( parsed_response = response return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - def get_contract_state( + def contract_get_state( self, params: algokit_utils.CommonAppCallParams | None = None, send_params: algokit_utils.SendParams | None = None @@ -1313,12 +1313,12 @@ def get_contract_state( params = params or algokit_utils.CommonAppCallParams() response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ **dataclasses.asdict(params), - "method": "get_contract_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", + "method": "contract_get_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", }), send_params=send_params) parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(KernelState, typing.cast(dict, response.abi_return))) # type: ignore return typing.cast(algokit_utils.SendAppTransactionResult[KernelState], parsed_response) - def get_next_due_event( + def contract_get_next_due_event( self, params: algokit_utils.CommonAppCallParams | None = None, send_params: algokit_utils.SendParams | None = None @@ -1327,7 +1327,7 @@ def get_next_due_event( params = params or algokit_utils.CommonAppCallParams() response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ **dataclasses.asdict(params), - "method": "get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", + "method": "contract_get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", }), send_params=send_params) parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(ExecutionScheduleEntry, typing.cast(dict, response.abi_return))) # type: ignore return typing.cast(algokit_utils.SendAppTransactionResult[ExecutionScheduleEntry], parsed_response) @@ -1396,9 +1396,9 @@ def rbac_revoke_role( parsed_response = response return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - def rbac_gov_asset_suspension( + def rbac_contract_suspension( self, - args: tuple[bool] | RbacGovAssetSuspensionArgs, + args: tuple[bool] | RbacContractSuspensionArgs, params: algokit_utils.CommonAppCallParams | None = None, send_params: algokit_utils.SendParams | None = None ) -> algokit_utils.SendAppTransactionResult[int]: @@ -1406,7 +1406,7 @@ def rbac_gov_asset_suspension( params = params or algokit_utils.CommonAppCallParams() response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ **dataclasses.asdict(params), - "method": "rbac_gov_asset_suspension(bool)uint64", + "method": "rbac_contract_suspension(bool)uint64", "args": method_args, }), send_params=send_params) parsed_response = response @@ -2155,7 +2155,7 @@ def decode_return_value( @typing.overload def decode_return_value( self, - method: typing.Literal["set_transfer_schedule(uint64,uint64)uint64"], + method: typing.Literal["transfer_set_schedule(uint64,uint64)uint64"], return_value: algokit_utils.ABIReturn | None ) -> int | None: ... @typing.overload @@ -2173,7 +2173,7 @@ def decode_return_value( @typing.overload def decode_return_value( self, - method: typing.Literal["account_gov_suspension(address,bool)uint64"], + method: typing.Literal["account_suspension(address,bool)uint64"], return_value: algokit_utils.ABIReturn | None ) -> int | None: ... @typing.overload @@ -2209,7 +2209,7 @@ def decode_return_value( @typing.overload def decode_return_value( self, - method: typing.Literal["execute_ied()uint64"], + method: typing.Literal["contract_execute_ied()uint64"], return_value: algokit_utils.ABIReturn | None ) -> int | None: ... @typing.overload @@ -2221,13 +2221,13 @@ def decode_return_value( @typing.overload def decode_return_value( self, - method: typing.Literal["get_contract_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)"], + method: typing.Literal["contract_get_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)"], return_value: algokit_utils.ABIReturn | None ) -> KernelState | None: ... @typing.overload def decode_return_value( self, - method: typing.Literal["get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)"], + method: typing.Literal["contract_get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)"], return_value: algokit_utils.ABIReturn | None ) -> ExecutionScheduleEntry | None: ... @typing.overload @@ -2257,7 +2257,7 @@ def decode_return_value( @typing.overload def decode_return_value( self, - method: typing.Literal["rbac_gov_asset_suspension(bool)uint64"], + method: typing.Literal["rbac_contract_suspension(bool)uint64"], return_value: algokit_utils.ABIReturn | None ) -> int | None: ... @typing.overload @@ -2546,20 +2546,20 @@ def claim_due_cashflows( compilation_params=compilation_params ) - def set_transfer_schedule( + def transfer_set_schedule( self, - args: tuple[int, int] | SetTransferScheduleArgs, + args: tuple[int, int] | TransferSetScheduleArgs, *, params: algokit_utils.CommonAppCallCreateParams | None = None, compilation_params: algokit_utils.AppClientCompilationParams | None = None ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the set_transfer_schedule(uint64,uint64)uint64 ABI method""" + """Creates a new instance using the transfer_set_schedule(uint64,uint64)uint64 ABI method""" params = params or algokit_utils.CommonAppCallCreateParams() return self.app_factory.params.create( algokit_utils.AppFactoryCreateMethodCallParams( **{ **dataclasses.asdict(params), - "method": "set_transfer_schedule(uint64,uint64)uint64", + "method": "transfer_set_schedule(uint64,uint64)uint64", "args": _parse_abi_args(args), } ), @@ -2606,20 +2606,20 @@ def transfer( compilation_params=compilation_params ) - def account_gov_suspension( + def account_suspension( self, - args: tuple[str, bool] | AccountGovSuspensionArgs, + args: tuple[str, bool] | AccountSuspensionArgs, *, params: algokit_utils.CommonAppCallCreateParams | None = None, compilation_params: algokit_utils.AppClientCompilationParams | None = None ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the account_gov_suspension(address,bool)uint64 ABI method""" + """Creates a new instance using the account_suspension(address,bool)uint64 ABI method""" params = params or algokit_utils.CommonAppCallCreateParams() return self.app_factory.params.create( algokit_utils.AppFactoryCreateMethodCallParams( **{ **dataclasses.asdict(params), - "method": "account_gov_suspension(address,bool)uint64", + "method": "account_suspension(address,bool)uint64", "args": _parse_abi_args(args), } ), @@ -2726,19 +2726,19 @@ def contract_schedule( compilation_params=compilation_params ) - def execute_ied( + def contract_execute_ied( self, *, params: algokit_utils.CommonAppCallCreateParams | None = None, compilation_params: algokit_utils.AppClientCompilationParams | None = None ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the execute_ied()uint64 ABI method""" + """Creates a new instance using the contract_execute_ied()uint64 ABI method""" params = params or algokit_utils.CommonAppCallCreateParams() return self.app_factory.params.create( algokit_utils.AppFactoryCreateMethodCallParams( **{ **dataclasses.asdict(params), - "method": "execute_ied()uint64", + "method": "contract_execute_ied()uint64", "args": None, } ), @@ -2765,38 +2765,38 @@ def apply_non_cash_event( compilation_params=compilation_params ) - def get_contract_state( + def contract_get_state( self, *, params: algokit_utils.CommonAppCallCreateParams | None = None, compilation_params: algokit_utils.AppClientCompilationParams | None = None ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the get_contract_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64) ABI method""" + """Creates a new instance using the contract_get_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64) ABI method""" params = params or algokit_utils.CommonAppCallCreateParams() return self.app_factory.params.create( algokit_utils.AppFactoryCreateMethodCallParams( **{ **dataclasses.asdict(params), - "method": "get_contract_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", + "method": "contract_get_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "args": None, } ), compilation_params=compilation_params ) - def get_next_due_event( + def contract_get_next_due_event( self, *, params: algokit_utils.CommonAppCallCreateParams | None = None, compilation_params: algokit_utils.AppClientCompilationParams | None = None ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64) ABI method""" + """Creates a new instance using the contract_get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64) ABI method""" params = params or algokit_utils.CommonAppCallCreateParams() return self.app_factory.params.create( algokit_utils.AppFactoryCreateMethodCallParams( **{ **dataclasses.asdict(params), - "method": "get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", + "method": "contract_get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "args": None, } ), @@ -2883,20 +2883,20 @@ def rbac_revoke_role( compilation_params=compilation_params ) - def rbac_gov_asset_suspension( + def rbac_contract_suspension( self, - args: tuple[bool] | RbacGovAssetSuspensionArgs, + args: tuple[bool] | RbacContractSuspensionArgs, *, params: algokit_utils.CommonAppCallCreateParams | None = None, compilation_params: algokit_utils.AppClientCompilationParams | None = None ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_gov_asset_suspension(bool)uint64 ABI method""" + """Creates a new instance using the rbac_contract_suspension(bool)uint64 ABI method""" params = params or algokit_utils.CommonAppCallCreateParams() return self.app_factory.params.create( algokit_utils.AppFactoryCreateMethodCallParams( **{ **dataclasses.asdict(params), - "method": "rbac_gov_asset_suspension(bool)uint64", + "method": "rbac_contract_suspension(bool)uint64", "args": _parse_abi_args(args), } ), @@ -3205,21 +3205,21 @@ def claim_due_cashflows( ) return self - def set_transfer_schedule( + def transfer_set_schedule( self, - args: tuple[int, int] | SetTransferScheduleArgs, + args: tuple[int, int] | TransferSetScheduleArgs, params: algokit_utils.CommonAppCallParams | None = None, compilation_params: algokit_utils.AppClientCompilationParams | None = None ) -> "DasaComposer": self._composer.add_app_call_method_call( - self.client.params.set_transfer_schedule( + self.client.params.transfer_set_schedule( args=args, params=params, ) ) self._result_mappers.append( lambda v: self.client.decode_return_value( - "set_transfer_schedule(uint64,uint64)uint64", v + "transfer_set_schedule(uint64,uint64)uint64", v ) ) return self @@ -3262,21 +3262,21 @@ def transfer( ) return self - def account_gov_suspension( + def account_suspension( self, - args: tuple[str, bool] | AccountGovSuspensionArgs, + args: tuple[str, bool] | AccountSuspensionArgs, params: algokit_utils.CommonAppCallParams | None = None, compilation_params: algokit_utils.AppClientCompilationParams | None = None ) -> "DasaComposer": self._composer.add_app_call_method_call( - self.client.params.account_gov_suspension( + self.client.params.account_suspension( args=args, params=params, ) ) self._result_mappers.append( lambda v: self.client.decode_return_value( - "account_gov_suspension(address,bool)uint64", v + "account_suspension(address,bool)uint64", v ) ) return self @@ -3376,20 +3376,20 @@ def contract_schedule( ) return self - def execute_ied( + def contract_execute_ied( self, params: algokit_utils.CommonAppCallParams | None = None, compilation_params: algokit_utils.AppClientCompilationParams | None = None ) -> "DasaComposer": self._composer.add_app_call_method_call( - self.client.params.execute_ied( + self.client.params.contract_execute_ied( params=params, ) ) self._result_mappers.append( lambda v: self.client.decode_return_value( - "execute_ied()uint64", v + "contract_execute_ied()uint64", v ) ) return self @@ -3413,38 +3413,38 @@ def apply_non_cash_event( ) return self - def get_contract_state( + def contract_get_state( self, params: algokit_utils.CommonAppCallParams | None = None, compilation_params: algokit_utils.AppClientCompilationParams | None = None ) -> "DasaComposer": self._composer.add_app_call_method_call( - self.client.params.get_contract_state( + self.client.params.contract_get_state( params=params, ) ) self._result_mappers.append( lambda v: self.client.decode_return_value( - "get_contract_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", v + "contract_get_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", v ) ) return self - def get_next_due_event( + def contract_get_next_due_event( self, params: algokit_utils.CommonAppCallParams | None = None, compilation_params: algokit_utils.AppClientCompilationParams | None = None ) -> "DasaComposer": self._composer.add_app_call_method_call( - self.client.params.get_next_due_event( + self.client.params.contract_get_next_due_event( params=params, ) ) self._result_mappers.append( lambda v: self.client.decode_return_value( - "get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", v + "contract_get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", v ) ) return self @@ -3525,21 +3525,21 @@ def rbac_revoke_role( ) return self - def rbac_gov_asset_suspension( + def rbac_contract_suspension( self, - args: tuple[bool] | RbacGovAssetSuspensionArgs, + args: tuple[bool] | RbacContractSuspensionArgs, params: algokit_utils.CommonAppCallParams | None = None, compilation_params: algokit_utils.AppClientCompilationParams | None = None ) -> "DasaComposer": self._composer.add_app_call_method_call( - self.client.params.rbac_gov_asset_suspension( + self.client.params.rbac_contract_suspension( args=args, params=params, ) ) self._result_mappers.append( lambda v: self.client.decode_return_value( - "rbac_gov_asset_suspension(bool)uint64", v + "rbac_contract_suspension(bool)uint64", v ) ) return self diff --git a/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.approval.puya.map b/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.approval.puya.map index 3ec1f3b0..4ccae3dc 100644 --- a/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.approval.puya.map +++ b/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.approval.puya.map @@ -199,13 +199,13 @@ "stack_out": [] }, "188": { - "op": "pushbytess 0x82f71b2d 0xef04f5d3 0xdf343550 0x3dbe80bd 0xdf54e82c 0x010c8299 0x7406acd2 0x1a72a2ee // method \"rbac_rotate_arranger(address)uint64\", method \"rbac_set_op_daemon(address)uint64\", method \"rbac_assign_role(uint8,address,(uint64,uint64))uint64\", method \"rbac_revoke_role(uint8,address)uint64\", method \"rbac_gov_asset_suspension(bool)uint64\", method \"rbac_get_arranger()address\", method \"rbac_get_address_roles(address)(bool,bool,bool,bool,bool)\", method \"rbac_get_role_validity(uint8,address)(uint64,uint64)\"", + "op": "pushbytess 0x82f71b2d 0xef04f5d3 0xdf343550 0x3dbe80bd 0x1e3e48e7 0x010c8299 0x7406acd2 0x1a72a2ee // method \"rbac_rotate_arranger(address)uint64\", method \"rbac_set_op_daemon(address)uint64\", method \"rbac_assign_role(uint8,address,(uint64,uint64))uint64\", method \"rbac_revoke_role(uint8,address)uint64\", method \"rbac_contract_suspension(bool)uint64\", method \"rbac_get_arranger()address\", method \"rbac_get_address_roles(address)(bool,bool,bool,bool,bool)\", method \"rbac_get_role_validity(uint8,address)(uint64,uint64)\"", "defined_out": [ "Method(rbac_assign_role(uint8,address,(uint64,uint64))uint64)", + "Method(rbac_contract_suspension(bool)uint64)", "Method(rbac_get_address_roles(address)(bool,bool,bool,bool,bool))", "Method(rbac_get_arranger()address)", "Method(rbac_get_role_validity(uint8,address)(uint64,uint64))", - "Method(rbac_gov_asset_suspension(bool)uint64)", "Method(rbac_revoke_role(uint8,address)uint64)", "Method(rbac_rotate_arranger(address)uint64)", "Method(rbac_set_op_daemon(address)uint64)" @@ -215,7 +215,7 @@ "Method(rbac_set_op_daemon(address)uint64)", "Method(rbac_assign_role(uint8,address,(uint64,uint64))uint64)", "Method(rbac_revoke_role(uint8,address)uint64)", - "Method(rbac_gov_asset_suspension(bool)uint64)", + "Method(rbac_contract_suspension(bool)uint64)", "Method(rbac_get_arranger()address)", "Method(rbac_get_address_roles(address)(bool,bool,bool,bool,bool))", "Method(rbac_get_role_validity(uint8,address)(uint64,uint64))" @@ -225,10 +225,10 @@ "op": "txna ApplicationArgs 0", "defined_out": [ "Method(rbac_assign_role(uint8,address,(uint64,uint64))uint64)", + "Method(rbac_contract_suspension(bool)uint64)", "Method(rbac_get_address_roles(address)(bool,bool,bool,bool,bool))", "Method(rbac_get_arranger()address)", "Method(rbac_get_role_validity(uint8,address)(uint64,uint64))", - "Method(rbac_gov_asset_suspension(bool)uint64)", "Method(rbac_revoke_role(uint8,address)uint64)", "Method(rbac_rotate_arranger(address)uint64)", "Method(rbac_set_op_daemon(address)uint64)", @@ -239,7 +239,7 @@ "Method(rbac_set_op_daemon(address)uint64)", "Method(rbac_assign_role(uint8,address,(uint64,uint64))uint64)", "Method(rbac_revoke_role(uint8,address)uint64)", - "Method(rbac_gov_asset_suspension(bool)uint64)", + "Method(rbac_contract_suspension(bool)uint64)", "Method(rbac_get_arranger()address)", "Method(rbac_get_address_roles(address)(bool,bool,bool,bool,bool))", "Method(rbac_get_role_validity(uint8,address)(uint64,uint64))", @@ -247,7 +247,7 @@ ] }, "233": { - "op": "match rbac_rotate_arranger rbac_set_op_daemon rbac_assign_role rbac_revoke_role rbac_gov_asset_suspension rbac_get_arranger rbac_get_address_roles rbac_get_role_validity", + "op": "match rbac_rotate_arranger rbac_set_op_daemon rbac_assign_role rbac_revoke_role rbac_contract_suspension rbac_get_arranger rbac_get_address_roles rbac_get_role_validity", "stack_out": [] }, "251": { @@ -3231,9 +3231,9 @@ "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" }, "654": { - "subroutine": "modules.rbac.RbacModule.rbac_gov_asset_suspension[routing]", + "subroutine": "modules.rbac.RbacModule.rbac_contract_suspension[routing]", "params": {}, - "block": "rbac_gov_asset_suspension", + "block": "rbac_contract_suspension", "stack_in": [], "op": "txna ApplicationArgs 1", "defined_out": [ diff --git a/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.approval.teal b/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.approval.teal index e0bc52d3..a2db463b 100644 --- a/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.approval.teal +++ b/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.approval.teal @@ -47,9 +47,9 @@ main_switch_case_next@6: assert txn ApplicationID assert - pushbytess 0x82f71b2d 0xef04f5d3 0xdf343550 0x3dbe80bd 0xdf54e82c 0x010c8299 0x7406acd2 0x1a72a2ee // method "rbac_rotate_arranger(address)uint64", method "rbac_set_op_daemon(address)uint64", method "rbac_assign_role(uint8,address,(uint64,uint64))uint64", method "rbac_revoke_role(uint8,address)uint64", method "rbac_gov_asset_suspension(bool)uint64", method "rbac_get_arranger()address", method "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", method "rbac_get_role_validity(uint8,address)(uint64,uint64)" + pushbytess 0x82f71b2d 0xef04f5d3 0xdf343550 0x3dbe80bd 0x1e3e48e7 0x010c8299 0x7406acd2 0x1a72a2ee // method "rbac_rotate_arranger(address)uint64", method "rbac_set_op_daemon(address)uint64", method "rbac_assign_role(uint8,address,(uint64,uint64))uint64", method "rbac_revoke_role(uint8,address)uint64", method "rbac_contract_suspension(bool)uint64", method "rbac_get_arranger()address", method "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", method "rbac_get_role_validity(uint8,address)(uint64,uint64)" txna ApplicationArgs 0 - match rbac_rotate_arranger rbac_set_op_daemon rbac_assign_role rbac_revoke_role rbac_gov_asset_suspension rbac_get_arranger rbac_get_address_roles rbac_get_role_validity + match rbac_rotate_arranger rbac_set_op_daemon rbac_assign_role rbac_revoke_role rbac_contract_suspension rbac_get_arranger rbac_get_address_roles rbac_get_role_validity err main_contract_update_route@5: @@ -507,8 +507,8 @@ rbac_revoke_role_after_if_else@9: b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 -// modules.rbac.RbacModule.rbac_gov_asset_suspension[routing]() -> void: -rbac_gov_asset_suspension: +// modules.rbac.RbacModule.rbac_contract_suspension[routing]() -> void: +rbac_contract_suspension: // modules/rbac.py:241 // @arc4.abimethod # TODO: Update specs and add test txna ApplicationArgs 1 diff --git a/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.arc56.json b/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.arc56.json index 0668643b..31cc74da 100644 --- a/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.arc56.json +++ b/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.arc56.json @@ -143,7 +143,7 @@ "recommendations": {} }, { - "name": "rbac_gov_asset_suspension", + "name": "rbac_contract_suspension", "args": [ { "type": "bool", @@ -424,11 +424,11 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMzIgMjAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMgMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMgMHg1MjIzNDE2MzYzNmY3NTZlNzQ0ZDYxNmU2MTY3NjU3MjIzIDB4NTIyMzUwNzI2OTZkNjE3Mjc5NDQ2NTYxNmM2NTcyMjMgMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMyAweDUyMjM0ZjYyNzM2NTcyNzY2NTcyMjMgMHg1MjIzNGY3MDQ0NjE2NTZkNmY2ZTIzICJhc3NldF9zdXNwZW5kZWQiICJhc3NldF9kZWZhdWx0ZWQiCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgtMjkKICAgIC8vICMgUkJBQyBSb2xlcwogICAgLy8gc2VsZi5hcnJhbmdlciA9IEdsb2JhbFN0YXRlKEFjY291bnQoKSwga2V5PWNzdC5QUkVGSVhfSURfQVJSQU5HRVIpCiAgICBieXRlY18xIC8vIDB4NTIyMzQxNzI3MjYxNmU2NzY1NzIyMwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwCiAgICAvLyBzZWxmLm9wX2RhZW1vbiA9IEdsb2JhbFN0YXRlKEFjY291bnQoKSwga2V5PWNzdC5QUkVGSVhfSURfT1BfREFFTU9OKQogICAgYnl0ZWMgNyAvLyAweDUyMjM0ZjcwNDQ2MTY1NmQ2ZjZlMjMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo0Ny00OAogICAgLy8gIyBELUFTQSBHb3Zlcm5hbmNlCiAgICAvLyBzZWxmLmFzc2V0X3N1c3BlbmRlZCA9IEZhbHNlCiAgICBieXRlYyA4IC8vICJhc3NldF9zdXNwZW5kZWQiCiAgICBpbnRjXzEgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo0OQogICAgLy8gc2VsZi5hc3NldF9kZWZhdWx0ZWQgPSBGYWxzZQogICAgYnl0ZWMgOSAvLyAiYXNzZXRfZGVmYXVsdGVkIgogICAgaW50Y18xIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tb2NrX21vZHVsZV9yYmFjL2NvbnRyYWN0LnB5OjYKICAgIC8vIGNsYXNzIE1vY2tSYmFjTW9kdWxlKFJiYWNNb2R1bGUpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fY3JlYXRlQDE5CiAgICBwdXNoYnl0ZXMgMHg5MTRmMDRlYiAvLyBtZXRob2QgImNvbnRyYWN0X3VwZGF0ZSgpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fY29udHJhY3RfdXBkYXRlX3JvdXRlQDUKCm1haW5fc3dpdGNoX2Nhc2VfbmV4dEA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL21vY2tfbW9kdWxlX3JiYWMvY29udHJhY3QucHk6NgogICAgLy8gY2xhc3MgTW9ja1JiYWNNb2R1bGUoUmJhY01vZHVsZSk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHg4MmY3MWIyZCAweGVmMDRmNWQzIDB4ZGYzNDM1NTAgMHgzZGJlODBiZCAweGRmNTRlODJjIDB4MDEwYzgyOTkgMHg3NDA2YWNkMiAweDFhNzJhMmVlIC8vIG1ldGhvZCAicmJhY19yb3RhdGVfYXJyYW5nZXIoYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgInJiYWNfc2V0X29wX2RhZW1vbihhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19hc3NpZ25fcm9sZSh1aW50OCxhZGRyZXNzLCh1aW50NjQsdWludDY0KSl1aW50NjQiLCBtZXRob2QgInJiYWNfcmV2b2tlX3JvbGUodWludDgsYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgInJiYWNfZ292X2Fzc2V0X3N1c3BlbnNpb24oYm9vbCl1aW50NjQiLCBtZXRob2QgInJiYWNfZ2V0X2FycmFuZ2VyKClhZGRyZXNzIiwgbWV0aG9kICJyYmFjX2dldF9hZGRyZXNzX3JvbGVzKGFkZHJlc3MpKGJvb2wsYm9vbCxib29sLGJvb2wsYm9vbCkiLCBtZXRob2QgInJiYWNfZ2V0X3JvbGVfdmFsaWRpdHkodWludDgsYWRkcmVzcykodWludDY0LHVpbnQ2NCkiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCByYmFjX3JvdGF0ZV9hcnJhbmdlciByYmFjX3NldF9vcF9kYWVtb24gcmJhY19hc3NpZ25fcm9sZSByYmFjX3Jldm9rZV9yb2xlIHJiYWNfZ292X2Fzc2V0X3N1c3BlbnNpb24gcmJhY19nZXRfYXJyYW5nZXIgcmJhY19nZXRfYWRkcmVzc19yb2xlcyByYmFjX2dldF9yb2xlX3ZhbGlkaXR5CiAgICBlcnIKCm1haW5fY29udHJhY3RfdXBkYXRlX3JvdXRlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBwdXNoaW50IDQgLy8gVXBkYXRlQXBwbGljYXRpb24KICAgID09CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydAogICAgYiBjb250cmFjdF91cGRhdGUKCm1haW5fY3JlYXRlQDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL21vY2tfbW9kdWxlX3JiYWMvY29udHJhY3QucHk6MTQKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbW9ja19tb2R1bGVfcmJhYy9jb250cmFjdC5weToxNgogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IFR4bi5zZW5kZXIKICAgIGJ5dGVjXzEgLy8gMHg1MjIzNDE3MjcyNjE2ZTY3NjU3MjIzCiAgICB0eG4gU2VuZGVyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL21vY2tfbW9kdWxlX3JiYWMvY29udHJhY3QucHk6MTQKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5jb250cmFjdF91cGRhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF91cGRhdGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTUzLTE1NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGdyYW50cyB0aGUgdXBkYXRlIHBlcm1pc3Npb25zIHRvIHRoZSBBcnJhbmdlci4KICAgIC8vICMg4pqg77iPIFdBUk5JTkc6IEFwcGxpY2F0aW9uIHVwZGF0ZXMgbXVzdCBiZSBleGVjdXRlZCBWRVJZIGNhcmVmdWxseSwgYXMgdGhleQogICAgLy8gIyBtaWdodCBpbnRyb2R1Y2UgYnJlYWtpbmcgY2hhbmdlcy4KICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfcm90YXRlX2FycmFuZ2VyW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19yb3RhdGVfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2OQogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTcwCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gbmV3X2FycmFuZ2VyCiAgICBieXRlY18xIC8vIDB4NTIyMzQxNzI3MjYxNmU2NzY1NzIyMwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzEKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE1OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19zZXRfb3BfZGFlbW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19zZXRfb3BfZGFlbW9uOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE3MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODQKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4NQogICAgLy8gc2VsZi5vcF9kYWVtb24udmFsdWUgPSBhZGRyZXNzCiAgICBieXRlYyA3IC8vIDB4NTIyMzRmNzA0NDYxNjU2ZDZmNmUyMwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODYKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE3MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19hc3NpZ25fcm9sZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfYXNzaWduX3JvbGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgcHVzaGludCAxNgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5Sb2xlVmFsaWRpdHkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTAKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTIKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCkpCiAgICBidG9pCiAgICBkdXBuIDIKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTAyCiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKToKICAgIGludGNfMyAvLyAyMAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTAzCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gcm9sZV9hZGRyZXNzCiAgICBieXRlY18xIC8vIDB4NTIyMzQxNzI3MjYxNmU2NzY1NzIyMwogICAgZGlnIDMKICAgIGFwcF9nbG9iYWxfcHV0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxNAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwNgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDQwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDcKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjXzMgLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQ0ZDYxNmU2MTY3NjU3MjIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDgKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjEzCiAgICAvLyBzZWxmLl9zZXRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIHZhbGlkaXR5KQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTAKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTEKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgNCAvLyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTIKICAgIC8vIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIGR1cAogICAgcHVzaGludCA2MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE1CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgNSAvLyAweDUyMjM1NDcyNzU3Mzc0NjU2NTIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTYKICAgIC8vIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMwogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE4CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNzAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTkKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjXzIgLy8gMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMAogICAgLy8gc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDgwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5vYnNlcnZlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyA2IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI0CiAgICAvLyBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3Jldm9rZV9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19yZXZva2Vfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzUKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzNgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzcKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCkpCiAgICBidG9pCiAgICBkdXBuIDIKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCAhPSBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksIGVyci5JTlZBTElEX1JPTEUKICAgIGR1cAogICAgaW50Y18zIC8vIDIwCiAgICAhPQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI4CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICBwdXNoaW50IDQwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjkKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWNfMyAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMAogICAgLy8gZGVsIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzkKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzMKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyA0IC8vIDB4NTIyMzUwNzI2OTZkNjE3Mjc5NDQ2NTYxNmM2NTcyMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNAogICAgLy8gZGVsIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjM4CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIGR1cAogICAgcHVzaGludCA2MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyA1IC8vIDB4NTIyMzU0NzI3NTczNzQ2NTY1MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzOAogICAgLy8gZGVsIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzgKICAgIC8vIHNlbGYuX2RlbGV0ZV9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcykKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQwCiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNzAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlY18yIC8vIDB4NTIyMzQxNzU3NDY4NmY3MjY5NzQ3OTIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDIKICAgIC8vIGRlbCBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzgKICAgIC8vIHNlbGYuX2RlbGV0ZV9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcykKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ0CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKToKICAgIGR1cAogICAgcHVzaGludCA4MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDUKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5vYnNlcnZlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyA2IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ2CiAgICAvLyBkZWwgc2VsZi5vYnNlcnZlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ292X2Fzc2V0X3N1c3BlbnNpb25bcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dvdl9hc3NldF9zdXNwZW5zaW9uOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kICAjIFRPRE86IFVwZGF0ZSBzcGVjcyBhbmQgYWRkIHRlc3QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzEgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzcKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjXzIgLy8gMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTcKICAgIC8vIHNlbGYuYXNzZXRfc3VzcGVuZGVkID0gc3VzcGVuZGVkCiAgICBieXRlYyA4IC8vICJhc3NldF9zdXNwZW5kZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1OAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QgICMgVE9ETzogVXBkYXRlIHNwZWNzIGFuZCBhZGQgdGVzdAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X2FycmFuZ2VyW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjY4CiAgICAvLyByZXR1cm4gc2VsZi5hcnJhbmdlci52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzEgLy8gMHg1MjIzNDE3MjcyNjE2ZTY3NjU3MjIzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJyYW5nZXIgZXhpc3RzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjYwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9hZGRyZXNzX3JvbGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfYWRkcmVzc19yb2xlczoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg0CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmFjY291bnRfbWFuYWdlciwgYWRkcmVzcyksCiAgICBieXRlY18zIC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0NGQ2MTZlNjE2NzY1NzIyMwogICAgZGlnIDEKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg1CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnByaW1hcnlfZGVhbGVyLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDQgLy8gMHg1MjIzNTA3MjY5NmQ2MTcyNzk0NDY1NjE2YzY1NzIyMwogICAgZGlnIDIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg2CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnRydXN0ZWUsIGFkZHJlc3MpLAogICAgYnl0ZWMgNSAvLyAweDUyMjM1NDcyNzU3Mzc0NjU2NTIzCiAgICBkaWcgMwogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODcKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYXV0aG9yaXR5LCBhZGRyZXNzKSwKICAgIGJ5dGVjXzIgLy8gMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMKICAgIGRpZyA0CiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4OAogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5vYnNlcnZlciwgYWRkcmVzcyksCiAgICBieXRlYyA2IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgdW5jb3ZlciA1CiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBwdXNoYnl0ZXMgMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgNgogICAgc2V0Yml0CiAgICBpbnRjXzAgLy8gMQogICAgdW5jb3ZlciA1CiAgICBzZXRiaXQKICAgIHB1c2hpbnQgMgogICAgdW5jb3ZlciA0CiAgICBzZXRiaXQKICAgIHB1c2hpbnQgMwogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIHB1c2hpbnQgNAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5W3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfcm9sZV92YWxpZGl0eToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDUKICAgIC8vIHJvbGUgPSByb2xlX2lkLmFzX3VpbnQ2NCgpCiAgICBidG9pCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA2CiAgICAvLyBzZWxmLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlKQogICAgZHVwCiAgICBjYWxsc3ViIF9hc3NlcnRfdmFsaWRfcm9sZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwOAogICAgLy8gY2FzZSBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUik6CiAgICBpbnRjXzMgLy8gMjAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTIKICAgIC8vIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIHB1c2hpbnRzIDQwIDUwIDYwIDcwIDgwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA3LTMzOAogICAgLy8gbWF0Y2ggcm9sZToKICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKToKICAgIC8vICAgICAgICAgcmV0dXJuIHR5cC5Sb2xlVmFsaWRpdHkoCiAgICAvLyAgICAgICAgICAgICByb2xlX3ZhbGlkaXR5X3N0YXJ0PVVJbnQ2NCgwKSwgcm9sZV92YWxpZGl0eV9lbmQ9VUludDY0KDApCiAgICAvLyAgICAgICAgICkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSk6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSk6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgXzoKICAgIC8vICAgICAgICAgb3AuZXJyKGVyci5JTlZBTElEX1JPTEUpCiAgICB1bmNvdmVyIDYKICAgIG1hdGNoIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMEAyIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMUAzIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMkA0IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfM0A1IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNEA2IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzM4CiAgICAvLyBvcC5lcnIoZXJyLklOVkFMSURfUk9MRSkKICAgIGVyciAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV81QDc6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzM0CiAgICAvLyBzZWxmLm9ic2VydmVyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDYgLy8gMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzMzLTMzNQogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMzNgogICAgLy8gcmV0dXJuIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzRANjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjkKICAgIC8vIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjXzIgLy8gMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjgtMzMwCiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5hdXRob3JpdHksIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMzMQogICAgLy8gcmV0dXJuIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfM0A1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyNAogICAgLy8gc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDUgLy8gMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMy0zMjUKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyNgogICAgLy8gcmV0dXJuIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzJANDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTkKICAgIC8vIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgNCAvLyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzE4LTMyMAogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMQogICAgLy8gcmV0dXJuIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8xQDM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzE0CiAgICAvLyBzZWxmLmFjY291bnRfbWFuYWdlciwgcm9sZV9hZGRyZXNzCiAgICBieXRlY18zIC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0NGQ2MTZlNjE2NzY1NzIyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxMy0zMTUKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLmFjY291bnRfbWFuYWdlciwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzE2CiAgICAvLyByZXR1cm4gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8wQDI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA5LTMxMQogICAgLy8gcmV0dXJuIHR5cC5Sb2xlVmFsaWRpdHkoCiAgICAvLyAgICAgcm9sZV92YWxpZGl0eV9zdGFydD1VSW50NjQoMCksIHJvbGVfdmFsaWRpdHlfZW5kPVVJbnQ2NCgwKQogICAgLy8gKQogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3JvbGVfaXNfYWN0aXZlKHJvbGVfbWFwOiBieXRlcywgcm9sZV9hZGRyZXNzOiBieXRlcykgLT4gdWludDY0Ogpfcm9sZV9pc19hY3RpdmU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTcKICAgIC8vIGRlZiBfcm9sZV9pc19hY3RpdmUoc2VsZiwgcm9sZV9tYXA6IHR5cC5SYmFjUm9sZSwgcm9sZV9hZGRyZXNzOiBBY2NvdW50KSAtPiBib29sOgogICAgcHJvdG8gMiAxCiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OC02MgogICAgLy8gcmV0dXJuIHNlbGYuX2hhc19yb2xlKHJvbGVfbWFwLCByb2xlX2FkZHJlc3MpIGFuZCAoCiAgICAvLyAgICAgcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICAvLyApCiAgICBieiBfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTkKICAgIC8vIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBCb3hNYXAgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2MAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTktNjAKICAgIC8vIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIDw9CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTktNjEKICAgIC8vIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IF9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2MQogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBCb3hNYXAgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDgKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAtNjEKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgPj0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgaW50Y18wIC8vIDEKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX21lcmdlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzEgLy8gMAogICAgYiBfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKSAtPiB2b2lkOgpfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2NQogICAgLy8gYXNzZXJ0IHNlbGYuX2lzX2FycmFuZ2VyKFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTIKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgPT0gc2VsZi5hcnJhbmdlci52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzEgLy8gMHg1MjIzNDE3MjcyNjE2ZTY3NjU3MjIzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJyYW5nZXIgZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjY1CiAgICAvLyBhc3NlcnQgc2VsZi5faXNfYXJyYW5nZXIoVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkgLT4gdm9pZDoKX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjgzCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYXNzZXRfZGVmYXVsdGVkLCBlcnIuREVGQVVMVEVECiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgOSAvLyAiYXNzZXRfZGVmYXVsdGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2RlZmF1bHRlZCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBEZWZhdWx0ZWQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkOiB1aW50NjQpIC0+IHZvaWQ6Cl9hc3NlcnRfdmFsaWRfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OAogICAgLy8gZGVmIF9hc3NlcnRfdmFsaWRfcm9sZShzZWxmLCByb2xlX2lkOiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTAKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIGludGNfMyAvLyAyMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICBwdXNoaW50IDI1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MgogICAgLy8gVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIHB1c2hpbnQgNDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkzCiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICBwdXNoaW50IDUwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NAogICAgLy8gVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICBwdXNoaW50IDYwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NQogICAgLy8gVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIHB1c2hpbnQgNzAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojk2CiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICBwdXNoaW50IDgwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBieiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9mYWxzZUA4CgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDc6CiAgICBpbnRjXzAgLy8gMQoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfbWVyZ2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICByZXRzdWIKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX2ZhbHNlQDg6CiAgICBpbnRjXzEgLy8gMAogICAgYiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9tZXJnZUA5Cg==", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMzIgMjAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMgMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMgMHg1MjIzNDE2MzYzNmY3NTZlNzQ0ZDYxNmU2MTY3NjU3MjIzIDB4NTIyMzUwNzI2OTZkNjE3Mjc5NDQ2NTYxNmM2NTcyMjMgMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMyAweDUyMjM0ZjYyNzM2NTcyNzY2NTcyMjMgMHg1MjIzNGY3MDQ0NjE2NTZkNmY2ZTIzICJhc3NldF9zdXNwZW5kZWQiICJhc3NldF9kZWZhdWx0ZWQiCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgtMjkKICAgIC8vICMgUkJBQyBSb2xlcwogICAgLy8gc2VsZi5hcnJhbmdlciA9IEdsb2JhbFN0YXRlKEFjY291bnQoKSwga2V5PWNzdC5QUkVGSVhfSURfQVJSQU5HRVIpCiAgICBieXRlY18xIC8vIDB4NTIyMzQxNzI3MjYxNmU2NzY1NzIyMwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwCiAgICAvLyBzZWxmLm9wX2RhZW1vbiA9IEdsb2JhbFN0YXRlKEFjY291bnQoKSwga2V5PWNzdC5QUkVGSVhfSURfT1BfREFFTU9OKQogICAgYnl0ZWMgNyAvLyAweDUyMjM0ZjcwNDQ2MTY1NmQ2ZjZlMjMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo0Ny00OAogICAgLy8gIyBELUFTQSBHb3Zlcm5hbmNlCiAgICAvLyBzZWxmLmFzc2V0X3N1c3BlbmRlZCA9IEZhbHNlCiAgICBieXRlYyA4IC8vICJhc3NldF9zdXNwZW5kZWQiCiAgICBpbnRjXzEgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo0OQogICAgLy8gc2VsZi5hc3NldF9kZWZhdWx0ZWQgPSBGYWxzZQogICAgYnl0ZWMgOSAvLyAiYXNzZXRfZGVmYXVsdGVkIgogICAgaW50Y18xIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tb2NrX21vZHVsZV9yYmFjL2NvbnRyYWN0LnB5OjYKICAgIC8vIGNsYXNzIE1vY2tSYmFjTW9kdWxlKFJiYWNNb2R1bGUpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fY3JlYXRlQDE5CiAgICBwdXNoYnl0ZXMgMHg5MTRmMDRlYiAvLyBtZXRob2QgImNvbnRyYWN0X3VwZGF0ZSgpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fY29udHJhY3RfdXBkYXRlX3JvdXRlQDUKCm1haW5fc3dpdGNoX2Nhc2VfbmV4dEA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL21vY2tfbW9kdWxlX3JiYWMvY29udHJhY3QucHk6NgogICAgLy8gY2xhc3MgTW9ja1JiYWNNb2R1bGUoUmJhY01vZHVsZSk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHg4MmY3MWIyZCAweGVmMDRmNWQzIDB4ZGYzNDM1NTAgMHgzZGJlODBiZCAweDFlM2U0OGU3IDB4MDEwYzgyOTkgMHg3NDA2YWNkMiAweDFhNzJhMmVlIC8vIG1ldGhvZCAicmJhY19yb3RhdGVfYXJyYW5nZXIoYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgInJiYWNfc2V0X29wX2RhZW1vbihhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19hc3NpZ25fcm9sZSh1aW50OCxhZGRyZXNzLCh1aW50NjQsdWludDY0KSl1aW50NjQiLCBtZXRob2QgInJiYWNfcmV2b2tlX3JvbGUodWludDgsYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgInJiYWNfY29udHJhY3Rfc3VzcGVuc2lvbihib29sKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19nZXRfYXJyYW5nZXIoKWFkZHJlc3MiLCBtZXRob2QgInJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXMoYWRkcmVzcykoYm9vbCxib29sLGJvb2wsYm9vbCxib29sKSIsIG1ldGhvZCAicmJhY19nZXRfcm9sZV92YWxpZGl0eSh1aW50OCxhZGRyZXNzKSh1aW50NjQsdWludDY0KSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIHJiYWNfcm90YXRlX2FycmFuZ2VyIHJiYWNfc2V0X29wX2RhZW1vbiByYmFjX2Fzc2lnbl9yb2xlIHJiYWNfcmV2b2tlX3JvbGUgcmJhY19jb250cmFjdF9zdXNwZW5zaW9uIHJiYWNfZ2V0X2FycmFuZ2VyIHJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXMgcmJhY19nZXRfcm9sZV92YWxpZGl0eQogICAgZXJyCgptYWluX2NvbnRyYWN0X3VwZGF0ZV9yb3V0ZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgcHVzaGludCA0IC8vIFVwZGF0ZUFwcGxpY2F0aW9uCiAgICA9PQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICYmCiAgICBhc3NlcnQKICAgIGIgY29udHJhY3RfdXBkYXRlCgptYWluX2NyZWF0ZUAxOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tb2NrX21vZHVsZV9yYmFjL2NvbnRyYWN0LnB5OjE0CiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIGFzc2VydAogICAgLy8gc21hcnRfY29udHJhY3RzL21vY2tfbW9kdWxlX3JiYWMvY29udHJhY3QucHk6MTYKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSBUeG4uc2VuZGVyCiAgICBieXRlY18xIC8vIDB4NTIyMzQxNzI3MjYxNmU2NzY1NzIyMwogICAgdHhuIFNlbmRlcgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tb2NrX21vZHVsZV9yYmFjL2NvbnRyYWN0LnB5OjE0CiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuY29udHJhY3RfdXBkYXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfdXBkYXRlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE1My0xNTYKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBncmFudHMgdGhlIHVwZGF0ZSBwZXJtaXNzaW9ucyB0byB0aGUgQXJyYW5nZXIuCiAgICAvLyAjIOKaoO+4jyBXQVJOSU5HOiBBcHBsaWNhdGlvbiB1cGRhdGVzIG11c3QgYmUgZXhlY3V0ZWQgVkVSWSBjYXJlZnVsbHksIGFzIHRoZXkKICAgIC8vICMgbWlnaHQgaW50cm9kdWNlIGJyZWFraW5nIGNoYW5nZXMuCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3JvdGF0ZV9hcnJhbmdlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfcm90YXRlX2FycmFuZ2VyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE1OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNjkKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE3MAogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IG5ld19hcnJhbmdlcgogICAgYnl0ZWNfMSAvLyAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTcxCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfc2V0X29wX2RhZW1vbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfc2V0X29wX2RhZW1vbjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTg0CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODUKICAgIC8vIHNlbGYub3BfZGFlbW9uLnZhbHVlID0gYWRkcmVzcwogICAgYnl0ZWMgNyAvLyAweDUyMjM0ZjcwNDQ2MTY1NmQ2ZjZlMjMKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTg2CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfYXNzaWduX3JvbGVbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2Fzc2lnbl9yb2xlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIHB1c2hpbnQgMTYKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuUm9sZVZhbGlkaXR5CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjEwCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTEKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjEyCiAgICAvLyBzZWxmLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpKQogICAgYnRvaQogICAgZHVwbiAyCiAgICBjYWxsc3ViIF9hc3NlcnRfdmFsaWRfcm9sZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwMgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUik6CiAgICBpbnRjXzMgLy8gMjAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwMwogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IHJvbGVfYWRkcmVzcwogICAgYnl0ZWNfMSAvLyAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMKICAgIGRpZyAzCiAgICBhcHBfZ2xvYmFsX3B1dAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTQKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDYKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIGR1cAogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnRfbWFuYWdlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlY18zIC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0NGQ2MTZlNjE2NzY1NzIyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA4CiAgICAvLyBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMwogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTEwCiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKToKICAgIGR1cAogICAgcHVzaGludCA1MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTExCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDQgLy8gMHg1MjIzNTA3MjY5NmQ2MTcyNzk0NDY1NjE2YzY1NzIyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTEyCiAgICAvLyBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjEzCiAgICAvLyBzZWxmLl9zZXRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIHZhbGlkaXR5KQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTQKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNjAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDUgLy8gMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE2CiAgICAvLyBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExOAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlY18yIC8vIDB4NTIyMzQxNzU3NDY4NmY3MjY5NzQ3OTIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjAKICAgIC8vIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjEzCiAgICAvLyBzZWxmLl9zZXRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIHZhbGlkaXR5KQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMTE6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIyCiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKToKICAgIGR1cAogICAgcHVzaGludCA4MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjMKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYub2JzZXJ2ZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgNiAvLyAweDUyMjM0ZjYyNzM2NTcyNzY2NTcyMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyNAogICAgLy8gc2VsZi5vYnNlcnZlcltyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19yZXZva2Vfcm9sZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfcmV2b2tlX3JvbGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjE2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjM1CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzYKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjM3CiAgICAvLyBzZWxmLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpKQogICAgYnRvaQogICAgZHVwbiAyCiAgICBjYWxsc3ViIF9hc3NlcnRfdmFsaWRfcm9sZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyNwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgIT0gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBkdXAKICAgIGludGNfMyAvLyAyMAogICAgIT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyOAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjXzMgLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQ0ZDYxNmU2MTY3NjU3MjIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzAKICAgIC8vIGRlbCBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjM5CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMyCiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKToKICAgIGR1cAogICAgcHVzaGludCA1MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMzCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgNCAvLyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzQKICAgIC8vIGRlbCBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzOAogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzYKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNjAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgNSAvLyAweDUyMjM1NDcyNzU3Mzc0NjU2NTIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzgKICAgIC8vIGRlbCBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjM4CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDEKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hdXRob3JpdHksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWNfMiAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQyCiAgICAvLyBkZWwgc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjM4CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgODAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ1CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYub2JzZXJ2ZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgNiAvLyAweDUyMjM0ZjYyNzM2NTcyNzY2NTcyMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NgogICAgLy8gZGVsIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2NvbnRyYWN0X3N1c3BlbnNpb25bcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2NvbnRyYWN0X3N1c3BlbnNpb246CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QgICMgVE9ETzogVXBkYXRlIHNwZWNzIGFuZCBhZGQgdGVzdAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMSAvLyAwCiAgICBnZXRiaXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo3NwogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYXV0aG9yaXR5LCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWNfMiAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1NwogICAgLy8gc2VsZi5hc3NldF9zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGJ5dGVjIDggLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU4CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCAgIyBUT0RPOiBVcGRhdGUgc3BlY3MgYW5kIGFkZCB0ZXN0CiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYXJyYW5nZXJbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNjgKICAgIC8vIHJldHVybiBzZWxmLmFycmFuZ2VyLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMSAvLyAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcnJhbmdlciBleGlzdHMKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNjAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXNbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9hZGRyZXNzX3JvbGVzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODQKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBhZGRyZXNzKSwKICAgIGJ5dGVjXzMgLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQ0ZDYxNmU2MTY3NjU3MjIzCiAgICBkaWcgMQogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODUKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYucHJpbWFyeV9kZWFsZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgNCAvLyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzCiAgICBkaWcgMgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODYKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYudHJ1c3RlZSwgYWRkcmVzcyksCiAgICBieXRlYyA1IC8vIDB4NTIyMzU0NzI3NTczNzQ2NTY1MjMKICAgIGRpZyAzCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4NwogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIGFkZHJlc3MpLAogICAgYnl0ZWNfMiAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgZGlnIDQKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg4CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLm9ic2VydmVyLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDYgLy8gMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzCiAgICB1bmNvdmVyIDUKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjcwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHB1c2hieXRlcyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciA2CiAgICBzZXRiaXQKICAgIGludGNfMCAvLyAxCiAgICB1bmNvdmVyIDUKICAgIHNldGJpdAogICAgcHVzaGludCAyCiAgICB1bmNvdmVyIDQKICAgIHNldGJpdAogICAgcHVzaGludCAzCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgcHVzaGludCA0CiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwNQogICAgLy8gcm9sZSA9IHJvbGVfaWQuYXNfdWludDY0KCkKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDYKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGUpCiAgICBkdXAKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA4CiAgICAvLyBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKToKICAgIGludGNfMyAvLyAyMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxMgogICAgLy8gY2FzZSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludHMgNDAgNTAgNjAgNzAgODAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDctMzM4CiAgICAvLyBtYXRjaCByb2xlOgogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgLy8gICAgICAgICByZXR1cm4gdHlwLlJvbGVWYWxpZGl0eSgKICAgIC8vICAgICAgICAgICAgIHJvbGVfdmFsaWRpdHlfc3RhcnQ9VUludDY0KDApLCByb2xlX3ZhbGlkaXR5X2VuZD1VSW50NjQoMCkKICAgIC8vICAgICAgICAgKQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5hdXRob3JpdHksIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5vYnNlcnZlciwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5vYnNlcnZlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBfOgogICAgLy8gICAgICAgICBvcC5lcnIoZXJyLklOVkFMSURfUk9MRSkKICAgIHVuY292ZXIgNgogICAgbWF0Y2ggcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8wQDIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8xQDMgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8yQDQgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8zQDUgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV80QDYgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV81QDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzgKICAgIC8vIG9wLmVycihlcnIuSU5WQUxJRF9ST0xFKQogICAgZXJyIC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzVANzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzQKICAgIC8vIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgNiAvLyAweDUyMjM0ZjYyNzM2NTcyNzY2NTcyMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzMtMzM1CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5vYnNlcnZlciwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzM2CiAgICAvLyByZXR1cm4gc2VsZi5vYnNlcnZlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNEA2OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOQogICAgLy8gc2VsZi5hdXRob3JpdHksIHJvbGVfYWRkcmVzcwogICAgYnl0ZWNfMiAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOC0zMzAKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLmF1dGhvcml0eSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzMxCiAgICAvLyByZXR1cm4gc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8zQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI0CiAgICAvLyBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgNSAvLyAweDUyMjM1NDcyNzU3Mzc0NjU2NTIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzIzLTMyNQogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI2CiAgICAvLyByZXR1cm4gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMkA0OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxOQogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyA0IC8vIDB4NTIyMzUwNzI2OTZkNjE3Mjc5NDQ2NTYxNmM2NTcyMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTgtMzIwCiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzIxCiAgICAvLyByZXR1cm4gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzFAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTQKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjXzMgLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQ0ZDYxNmU2MTY3NjU3MjIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEzLTMxNQogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTYKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzBAMjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDktMzExCiAgICAvLyByZXR1cm4gdHlwLlJvbGVWYWxpZGl0eSgKICAgIC8vICAgICByb2xlX3ZhbGlkaXR5X3N0YXJ0PVVJbnQ2NCgwKSwgcm9sZV92YWxpZGl0eV9lbmQ9VUludDY0KDApCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fcm9sZV9pc19hY3RpdmUocm9sZV9tYXA6IGJ5dGVzLCByb2xlX2FkZHJlc3M6IGJ5dGVzKSAtPiB1aW50NjQ6Cl9yb2xlX2lzX2FjdGl2ZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NwogICAgLy8gZGVmIF9yb2xlX2lzX2FjdGl2ZShzZWxmLCByb2xlX21hcDogdHlwLlJiYWNSb2xlLCByb2xlX2FkZHJlc3M6IEFjY291bnQpIC0+IGJvb2w6CiAgICBwcm90byAyIDEKICAgIHB1c2hieXRlcyAiIgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU4LTYyCiAgICAvLyByZXR1cm4gc2VsZi5faGFzX3JvbGUocm9sZV9tYXAsIHJvbGVfYWRkcmVzcykgYW5kICgKICAgIC8vICAgICByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICkKICAgIGJ6IF9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIEJveE1hcCBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYwCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MAogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgPD0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYxCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIEJveE1hcCBlbnRyeSBleGlzdHMKICAgIHB1c2hpbnQgOAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2MC02MQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAwCiAgICA+PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5LTYxCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0CiAgICBpbnRjXzAgLy8gMQoKX3JvbGVfaXNfYWN0aXZlX2Jvb2xfbWVyZ2VANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OC02MgogICAgLy8gcmV0dXJuIHNlbGYuX2hhc19yb2xlKHJvbGVfbWFwLCByb2xlX2FkZHJlc3MpIGFuZCAoCiAgICAvLyAgICAgcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICAvLyApCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANDoKICAgIGludGNfMSAvLyAwCiAgICBiIF9yb2xlX2lzX2FjdGl2ZV9ib29sX21lcmdlQDUKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpIC0+IHZvaWQ6Cl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjY1CiAgICAvLyBhc3NlcnQgc2VsZi5faXNfYXJyYW5nZXIoVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1MgogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyA9PSBzZWxmLmFycmFuZ2VyLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMSAvLyAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcnJhbmdlciBleGlzdHMKICAgID09CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjUKICAgIC8vIGFzc2VydCBzZWxmLl9pc19hcnJhbmdlcihUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKSAtPiB2b2lkOgpfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODMKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5hc3NldF9kZWZhdWx0ZWQsIGVyci5ERUZBVUxURUQKICAgIGludGNfMSAvLyAwCiAgICBieXRlYyA5IC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfZGVmYXVsdGVkIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIERlZmF1bHRlZAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGVfaWQ6IHVpbnQ2NCkgLT4gdm9pZDoKX2Fzc2VydF92YWxpZF9yb2xlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg4CiAgICAvLyBkZWYgX2Fzc2VydF92YWxpZF9yb2xlKHNlbGYsIHJvbGVfaWQ6IFVJbnQ2NCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MAogICAgLy8gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgaW50Y18zIC8vIDIwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MQogICAgLy8gVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIHB1c2hpbnQgMjUKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkyCiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgcHVzaGludCA0MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTMKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIHB1c2hpbnQgNTAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojk0CiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIHB1c2hpbnQgNjAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojk1CiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgcHVzaGludCA3MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTYKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIHB1c2hpbnQgODAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJ6IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX2ZhbHNlQDgKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANzoKICAgIGludGNfMCAvLyAxCgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9tZXJnZUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBhc3NlcnQgLy8gSW52YWxpZCByb2xlIGlkZW50aWZpZXIKICAgIHJldHN1YgoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfZmFsc2VAODoKICAgIGludGNfMSAvLyAwCiAgICBiIF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX21lcmdlQDkK", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" }, "byteCode": { - "approval": "CyAEAQAgFCYKBBUffHULUiNBcnJhbmdlciMMUiNBdXRob3JpdHkjEVIjQWNjb3VudE1hbmFnZXIjEFIjUHJpbWFyeURlYWxlciMKUiNUcnVzdGVlIwtSI09ic2VydmVyIwtSI09wRGFlbW9uIw9hc3NldF9zdXNwZW5kZWQPYXNzZXRfZGVmYXVsdGVkMRhAABEpMgNnJwcyA2cnCCNnJwkjZzEbQQBggASRTwTrNhoAjgEARzEZFEQxGESCCASC9xstBO8E9dME3zQ1UAQ9voC9BN9U6CwEAQyCmQR0BqzSBBpyou42GgCOCAAgADcATwEAAZMBsQG7AgQAMRmBBBIxGBBEQgAOMRkUMRgUEEQpMQBnIkOIAqwiQzYaAUkVJBJEiAKfKUxnMgcWKExQsCJDNhoBSRUkEkSIAognB0xnMgcWKExQsCJDNhoBSRUiEkQ2GgJJTgIVJBJENhoDSU4CFYEQEkSIAluIAmEXRwKIAmMlEkEADSlLA2cyBxYoTFCwIkNJgSgSQQAQK0sDUEm9RQEUREsCv0L/4EmBMhJBABEnBEsDUEm9RQEUREsCv0L/yEmBPBJBABEnBUsDUEm9RQEUREsCv0L/sEmBRhJBABAqSwNQSb1FARRESwK/Qv+ZSYFQEkH/kicGSwNQSb1FARRESwK/Qv+BNhoBSRUiEkQ2GgJJTgIVJBJEiAG1iAG7F0cCiAG9SSUTRIEoEkEAFCtLAlBJvUUBRLxIMgcWKExQsCJDSYEyEkEADycESwJQSb1FAUS8SEL/4UmBPBJBAA8nBUsCUEm9RQFEvEhC/8tJgUYSQQAOKksCUEm9RQFEvEhC/7ZJgVASQf+vJwZLAlBJvUUBRLxIQv+gNhoBSRUiEkQjUyoxAIgA8kQnCExnMgcWKExQsCJDIyllRChMULAiQzYaAUkVJBJEK0sBiADMJwRLAogAxScFSwOIAL4qSwSIALgnBk8FiACxgAEAI08GVCJPBVSBAk8EVIEDTwNUgQRPAlQoTFCwIkM2GgFJFSISRDYaAklOAhUkEkQXSYgAwCWDBSgyPEZQTwaOBgBNAD8AMAAhABMAAQAnBksBUEm9RQFEvkgoTFCwIkMqSwFQSb1FAUS+SEL/7CcFSwFQSb1FAUS+SEL/3ScESwFQSb1FAUS+SEL/zitLAVBJvUUBRL5IQv/AgBAAAAAAAAAAAAAAAAAAAAAAQv+rigIBgACL/ov/UEm9RQFBACCLAb5EI1syB0mMAA5BABGLAb5EgQhbiwAPQQAEIowAiSNC//kxACMpZUQSRIkjJwllRBREiYoBAIv/JRJAADCL/4EZEkAAKIv/gSgSQAAgi/+BMhJAABiL/4E8EkAAEIv/gUYSQAAIi/+BUBJBAAMiRIkjQv/6", + "approval": "CyAEAQAgFCYKBBUffHULUiNBcnJhbmdlciMMUiNBdXRob3JpdHkjEVIjQWNjb3VudE1hbmFnZXIjEFIjUHJpbWFyeURlYWxlciMKUiNUcnVzdGVlIwtSI09ic2VydmVyIwtSI09wRGFlbW9uIw9hc3NldF9zdXNwZW5kZWQPYXNzZXRfZGVmYXVsdGVkMRhAABEpMgNnJwcyA2cnCCNnJwkjZzEbQQBggASRTwTrNhoAjgEARzEZFEQxGESCCASC9xstBO8E9dME3zQ1UAQ9voC9BB4+SOcEAQyCmQR0BqzSBBpyou42GgCOCAAgADcATwEAAZMBsQG7AgQAMRmBBBIxGBBEQgAOMRkUMRgUEEQpMQBnIkOIAqwiQzYaAUkVJBJEiAKfKUxnMgcWKExQsCJDNhoBSRUkEkSIAognB0xnMgcWKExQsCJDNhoBSRUiEkQ2GgJJTgIVJBJENhoDSU4CFYEQEkSIAluIAmEXRwKIAmMlEkEADSlLA2cyBxYoTFCwIkNJgSgSQQAQK0sDUEm9RQEUREsCv0L/4EmBMhJBABEnBEsDUEm9RQEUREsCv0L/yEmBPBJBABEnBUsDUEm9RQEUREsCv0L/sEmBRhJBABAqSwNQSb1FARRESwK/Qv+ZSYFQEkH/kicGSwNQSb1FARRESwK/Qv+BNhoBSRUiEkQ2GgJJTgIVJBJEiAG1iAG7F0cCiAG9SSUTRIEoEkEAFCtLAlBJvUUBRLxIMgcWKExQsCJDSYEyEkEADycESwJQSb1FAUS8SEL/4UmBPBJBAA8nBUsCUEm9RQFEvEhC/8tJgUYSQQAOKksCUEm9RQFEvEhC/7ZJgVASQf+vJwZLAlBJvUUBRLxIQv+gNhoBSRUiEkQjUyoxAIgA8kQnCExnMgcWKExQsCJDIyllRChMULAiQzYaAUkVJBJEK0sBiADMJwRLAogAxScFSwOIAL4qSwSIALgnBk8FiACxgAEAI08GVCJPBVSBAk8EVIEDTwNUgQRPAlQoTFCwIkM2GgFJFSISRDYaAklOAhUkEkQXSYgAwCWDBSgyPEZQTwaOBgBNAD8AMAAhABMAAQAnBksBUEm9RQFEvkgoTFCwIkMqSwFQSb1FAUS+SEL/7CcFSwFQSb1FAUS+SEL/3ScESwFQSb1FAUS+SEL/zitLAVBJvUUBRL5IQv/AgBAAAAAAAAAAAAAAAAAAAAAAQv+rigIBgACL/ov/UEm9RQFBACCLAb5EI1syB0mMAA5BABGLAb5EgQhbiwAPQQAEIowAiSNC//kxACMpZUQSRIkjJwllRBREiYoBAIv/JRJAADCL/4EZEkAAKIv/gSgSQAAgi/+BMhJAABiL/4E8EkAAEIv/gUYSQAAIi/+BUBJBAAMiRIkjQv/6", "clear": "C4EBQw==" }, "compilerInfo": { diff --git a/smart_contracts/artifacts/mock_module_rbac/mock_rbac_module_client.py b/smart_contracts/artifacts/mock_module_rbac/mock_rbac_module_client.py index 43b8fda4..a938d1b1 100644 --- a/smart_contracts/artifacts/mock_module_rbac/mock_rbac_module_client.py +++ b/smart_contracts/artifacts/mock_module_rbac/mock_rbac_module_client.py @@ -19,7 +19,7 @@ import algokit_utils from algokit_utils import AlgorandClient as _AlgoKitAlgorandClient -_APP_SPEC_JSON = r"""{"arcs": [22, 28], "bareActions": {"call": [], "create": ["NoOp"]}, "methods": [{"actions": {"call": ["UpdateApplication"], "create": []}, "args": [], "name": "contract_update", "returns": {"type": "void"}, "desc": "Update D-ASA application.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "New Arranger address", "name": "new_arranger"}], "name": "rbac_rotate_arranger", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Rotate the Arranger address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Operation Daemon address", "name": "address"}], "name": "rbac_set_op_daemon", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Non-Normative: Set the Operation Daemon address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}, {"type": "(uint64,uint64)", "desc": "Role time validity", "name": "validity", "struct": "RoleValidity"}], "name": "rbac_assign_role", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Assign a role to an address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}], "name": "rbac_revoke_role", "returns": {"type": "uint64", "desc": "Timestamp of the role revocation"}, "desc": "Revoke a role from an address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Suspension status", "name": "suspended"}], "name": "rbac_gov_asset_suspension", "returns": {"type": "uint64", "desc": "Timestamp of the set asset suspension status"}, "desc": "Set asset suspension status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "rbac_get_arranger", "returns": {"type": "address", "desc": "Arranger address"}, "desc": "Get Arranger address", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Address to get roles for", "name": "address"}], "name": "rbac_get_address_roles", "returns": {"type": "(bool,bool,bool,bool,bool)", "desc": "Roles mask: (Account Manager, Primary Dealer, Trustee, Authority, Observer)"}, "desc": "Non-normative - Get roles assigned to an address", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}], "name": "rbac_get_role_validity", "returns": {"type": "(uint64,uint64)", "desc": "Role validity", "struct": "RoleValidity"}, "desc": "Get role validity", "events": [], "readonly": true, "recommendations": {}}], "name": "MockRbacModule", "state": {"keys": {"box": {}, "global": {"arranger": {"key": "UiNBcnJhbmdlciM=", "keyType": "AVMBytes", "valueType": "address"}, "op_daemon": {"key": "UiNPcERhZW1vbiM=", "keyType": "AVMBytes", "valueType": "address"}, "asset_suspended": {"key": "YXNzZXRfc3VzcGVuZGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "asset_defaulted": {"key": "YXNzZXRfZGVmYXVsdGVk", "keyType": "AVMString", "valueType": "AVMUint64"}}, "local": {}}, "maps": {"box": {"account_manager": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNBY2NvdW50TWFuYWdlciM="}, "primary_dealer": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNQcmltYXJ5RGVhbGVyIw=="}, "trustee": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNUcnVzdGVlIw=="}, "authority": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNBdXRob3JpdHkj"}, "observer": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNPYnNlcnZlciM="}}, "global": {}, "local": {}}, "schema": {"global": {"bytes": 2, "ints": 2}, "local": {"bytes": 0, "ints": 0}}}, "structs": {"RoleValidity": [{"name": "role_validity_start", "type": "uint64"}, {"name": "role_validity_end", "type": "uint64"}]}, "byteCode": {"approval": "CyAEAQAgFCYKBBUffHULUiNBcnJhbmdlciMMUiNBdXRob3JpdHkjEVIjQWNjb3VudE1hbmFnZXIjEFIjUHJpbWFyeURlYWxlciMKUiNUcnVzdGVlIwtSI09ic2VydmVyIwtSI09wRGFlbW9uIw9hc3NldF9zdXNwZW5kZWQPYXNzZXRfZGVmYXVsdGVkMRhAABEpMgNnJwcyA2cnCCNnJwkjZzEbQQBggASRTwTrNhoAjgEARzEZFEQxGESCCASC9xstBO8E9dME3zQ1UAQ9voC9BN9U6CwEAQyCmQR0BqzSBBpyou42GgCOCAAgADcATwEAAZMBsQG7AgQAMRmBBBIxGBBEQgAOMRkUMRgUEEQpMQBnIkOIAqwiQzYaAUkVJBJEiAKfKUxnMgcWKExQsCJDNhoBSRUkEkSIAognB0xnMgcWKExQsCJDNhoBSRUiEkQ2GgJJTgIVJBJENhoDSU4CFYEQEkSIAluIAmEXRwKIAmMlEkEADSlLA2cyBxYoTFCwIkNJgSgSQQAQK0sDUEm9RQEUREsCv0L/4EmBMhJBABEnBEsDUEm9RQEUREsCv0L/yEmBPBJBABEnBUsDUEm9RQEUREsCv0L/sEmBRhJBABAqSwNQSb1FARRESwK/Qv+ZSYFQEkH/kicGSwNQSb1FARRESwK/Qv+BNhoBSRUiEkQ2GgJJTgIVJBJEiAG1iAG7F0cCiAG9SSUTRIEoEkEAFCtLAlBJvUUBRLxIMgcWKExQsCJDSYEyEkEADycESwJQSb1FAUS8SEL/4UmBPBJBAA8nBUsCUEm9RQFEvEhC/8tJgUYSQQAOKksCUEm9RQFEvEhC/7ZJgVASQf+vJwZLAlBJvUUBRLxIQv+gNhoBSRUiEkQjUyoxAIgA8kQnCExnMgcWKExQsCJDIyllRChMULAiQzYaAUkVJBJEK0sBiADMJwRLAogAxScFSwOIAL4qSwSIALgnBk8FiACxgAEAI08GVCJPBVSBAk8EVIEDTwNUgQRPAlQoTFCwIkM2GgFJFSISRDYaAklOAhUkEkQXSYgAwCWDBSgyPEZQTwaOBgBNAD8AMAAhABMAAQAnBksBUEm9RQFEvkgoTFCwIkMqSwFQSb1FAUS+SEL/7CcFSwFQSb1FAUS+SEL/3ScESwFQSb1FAUS+SEL/zitLAVBJvUUBRL5IQv/AgBAAAAAAAAAAAAAAAAAAAAAAQv+rigIBgACL/ov/UEm9RQFBACCLAb5EI1syB0mMAA5BABGLAb5EgQhbiwAPQQAEIowAiSNC//kxACMpZUQSRIkjJwllRBREiYoBAIv/JRJAADCL/4EZEkAAKIv/gSgSQAAgi/+BMhJAABiL/4E8EkAAEIv/gUYSQAAIi/+BUBJBAAMiRIkjQv/6", "clear": "C4EBQw=="}, "desc": "\n RBAC Module for testing\n ", "events": [], "networks": {}, "source": {"approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMzIgMjAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMgMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMgMHg1MjIzNDE2MzYzNmY3NTZlNzQ0ZDYxNmU2MTY3NjU3MjIzIDB4NTIyMzUwNzI2OTZkNjE3Mjc5NDQ2NTYxNmM2NTcyMjMgMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMyAweDUyMjM0ZjYyNzM2NTcyNzY2NTcyMjMgMHg1MjIzNGY3MDQ0NjE2NTZkNmY2ZTIzICJhc3NldF9zdXNwZW5kZWQiICJhc3NldF9kZWZhdWx0ZWQiCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgtMjkKICAgIC8vICMgUkJBQyBSb2xlcwogICAgLy8gc2VsZi5hcnJhbmdlciA9IEdsb2JhbFN0YXRlKEFjY291bnQoKSwga2V5PWNzdC5QUkVGSVhfSURfQVJSQU5HRVIpCiAgICBieXRlY18xIC8vIDB4NTIyMzQxNzI3MjYxNmU2NzY1NzIyMwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwCiAgICAvLyBzZWxmLm9wX2RhZW1vbiA9IEdsb2JhbFN0YXRlKEFjY291bnQoKSwga2V5PWNzdC5QUkVGSVhfSURfT1BfREFFTU9OKQogICAgYnl0ZWMgNyAvLyAweDUyMjM0ZjcwNDQ2MTY1NmQ2ZjZlMjMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo0Ny00OAogICAgLy8gIyBELUFTQSBHb3Zlcm5hbmNlCiAgICAvLyBzZWxmLmFzc2V0X3N1c3BlbmRlZCA9IEZhbHNlCiAgICBieXRlYyA4IC8vICJhc3NldF9zdXNwZW5kZWQiCiAgICBpbnRjXzEgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo0OQogICAgLy8gc2VsZi5hc3NldF9kZWZhdWx0ZWQgPSBGYWxzZQogICAgYnl0ZWMgOSAvLyAiYXNzZXRfZGVmYXVsdGVkIgogICAgaW50Y18xIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tb2NrX21vZHVsZV9yYmFjL2NvbnRyYWN0LnB5OjYKICAgIC8vIGNsYXNzIE1vY2tSYmFjTW9kdWxlKFJiYWNNb2R1bGUpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fY3JlYXRlQDE5CiAgICBwdXNoYnl0ZXMgMHg5MTRmMDRlYiAvLyBtZXRob2QgImNvbnRyYWN0X3VwZGF0ZSgpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fY29udHJhY3RfdXBkYXRlX3JvdXRlQDUKCm1haW5fc3dpdGNoX2Nhc2VfbmV4dEA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL21vY2tfbW9kdWxlX3JiYWMvY29udHJhY3QucHk6NgogICAgLy8gY2xhc3MgTW9ja1JiYWNNb2R1bGUoUmJhY01vZHVsZSk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHg4MmY3MWIyZCAweGVmMDRmNWQzIDB4ZGYzNDM1NTAgMHgzZGJlODBiZCAweGRmNTRlODJjIDB4MDEwYzgyOTkgMHg3NDA2YWNkMiAweDFhNzJhMmVlIC8vIG1ldGhvZCAicmJhY19yb3RhdGVfYXJyYW5nZXIoYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgInJiYWNfc2V0X29wX2RhZW1vbihhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19hc3NpZ25fcm9sZSh1aW50OCxhZGRyZXNzLCh1aW50NjQsdWludDY0KSl1aW50NjQiLCBtZXRob2QgInJiYWNfcmV2b2tlX3JvbGUodWludDgsYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgInJiYWNfZ292X2Fzc2V0X3N1c3BlbnNpb24oYm9vbCl1aW50NjQiLCBtZXRob2QgInJiYWNfZ2V0X2FycmFuZ2VyKClhZGRyZXNzIiwgbWV0aG9kICJyYmFjX2dldF9hZGRyZXNzX3JvbGVzKGFkZHJlc3MpKGJvb2wsYm9vbCxib29sLGJvb2wsYm9vbCkiLCBtZXRob2QgInJiYWNfZ2V0X3JvbGVfdmFsaWRpdHkodWludDgsYWRkcmVzcykodWludDY0LHVpbnQ2NCkiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCByYmFjX3JvdGF0ZV9hcnJhbmdlciByYmFjX3NldF9vcF9kYWVtb24gcmJhY19hc3NpZ25fcm9sZSByYmFjX3Jldm9rZV9yb2xlIHJiYWNfZ292X2Fzc2V0X3N1c3BlbnNpb24gcmJhY19nZXRfYXJyYW5nZXIgcmJhY19nZXRfYWRkcmVzc19yb2xlcyByYmFjX2dldF9yb2xlX3ZhbGlkaXR5CiAgICBlcnIKCm1haW5fY29udHJhY3RfdXBkYXRlX3JvdXRlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBwdXNoaW50IDQgLy8gVXBkYXRlQXBwbGljYXRpb24KICAgID09CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydAogICAgYiBjb250cmFjdF91cGRhdGUKCm1haW5fY3JlYXRlQDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL21vY2tfbW9kdWxlX3JiYWMvY29udHJhY3QucHk6MTQKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbW9ja19tb2R1bGVfcmJhYy9jb250cmFjdC5weToxNgogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IFR4bi5zZW5kZXIKICAgIGJ5dGVjXzEgLy8gMHg1MjIzNDE3MjcyNjE2ZTY3NjU3MjIzCiAgICB0eG4gU2VuZGVyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL21vY2tfbW9kdWxlX3JiYWMvY29udHJhY3QucHk6MTQKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5jb250cmFjdF91cGRhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF91cGRhdGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTUzLTE1NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGdyYW50cyB0aGUgdXBkYXRlIHBlcm1pc3Npb25zIHRvIHRoZSBBcnJhbmdlci4KICAgIC8vICMg4pqg77iPIFdBUk5JTkc6IEFwcGxpY2F0aW9uIHVwZGF0ZXMgbXVzdCBiZSBleGVjdXRlZCBWRVJZIGNhcmVmdWxseSwgYXMgdGhleQogICAgLy8gIyBtaWdodCBpbnRyb2R1Y2UgYnJlYWtpbmcgY2hhbmdlcy4KICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfcm90YXRlX2FycmFuZ2VyW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19yb3RhdGVfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2OQogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTcwCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gbmV3X2FycmFuZ2VyCiAgICBieXRlY18xIC8vIDB4NTIyMzQxNzI3MjYxNmU2NzY1NzIyMwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzEKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE1OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19zZXRfb3BfZGFlbW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19zZXRfb3BfZGFlbW9uOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE3MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODQKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4NQogICAgLy8gc2VsZi5vcF9kYWVtb24udmFsdWUgPSBhZGRyZXNzCiAgICBieXRlYyA3IC8vIDB4NTIyMzRmNzA0NDYxNjU2ZDZmNmUyMwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODYKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE3MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19hc3NpZ25fcm9sZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfYXNzaWduX3JvbGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgcHVzaGludCAxNgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5Sb2xlVmFsaWRpdHkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTAKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTIKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCkpCiAgICBidG9pCiAgICBkdXBuIDIKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTAyCiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKToKICAgIGludGNfMyAvLyAyMAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTAzCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gcm9sZV9hZGRyZXNzCiAgICBieXRlY18xIC8vIDB4NTIyMzQxNzI3MjYxNmU2NzY1NzIyMwogICAgZGlnIDMKICAgIGFwcF9nbG9iYWxfcHV0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxNAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwNgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDQwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDcKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjXzMgLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQ0ZDYxNmU2MTY3NjU3MjIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDgKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjEzCiAgICAvLyBzZWxmLl9zZXRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIHZhbGlkaXR5KQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTAKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTEKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgNCAvLyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTIKICAgIC8vIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIGR1cAogICAgcHVzaGludCA2MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE1CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgNSAvLyAweDUyMjM1NDcyNzU3Mzc0NjU2NTIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTYKICAgIC8vIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMwogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE4CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNzAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTkKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjXzIgLy8gMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMAogICAgLy8gc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDgwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5vYnNlcnZlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyA2IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI0CiAgICAvLyBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3Jldm9rZV9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19yZXZva2Vfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzUKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzNgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzcKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCkpCiAgICBidG9pCiAgICBkdXBuIDIKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCAhPSBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksIGVyci5JTlZBTElEX1JPTEUKICAgIGR1cAogICAgaW50Y18zIC8vIDIwCiAgICAhPQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI4CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICBwdXNoaW50IDQwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjkKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWNfMyAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMAogICAgLy8gZGVsIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzkKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzMKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyA0IC8vIDB4NTIyMzUwNzI2OTZkNjE3Mjc5NDQ2NTYxNmM2NTcyMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNAogICAgLy8gZGVsIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjM4CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIGR1cAogICAgcHVzaGludCA2MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyA1IC8vIDB4NTIyMzU0NzI3NTczNzQ2NTY1MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzOAogICAgLy8gZGVsIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzgKICAgIC8vIHNlbGYuX2RlbGV0ZV9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcykKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQwCiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNzAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlY18yIC8vIDB4NTIyMzQxNzU3NDY4NmY3MjY5NzQ3OTIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDIKICAgIC8vIGRlbCBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzgKICAgIC8vIHNlbGYuX2RlbGV0ZV9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcykKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ0CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKToKICAgIGR1cAogICAgcHVzaGludCA4MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDUKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5vYnNlcnZlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyA2IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ2CiAgICAvLyBkZWwgc2VsZi5vYnNlcnZlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ292X2Fzc2V0X3N1c3BlbnNpb25bcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dvdl9hc3NldF9zdXNwZW5zaW9uOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kICAjIFRPRE86IFVwZGF0ZSBzcGVjcyBhbmQgYWRkIHRlc3QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzEgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzcKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjXzIgLy8gMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTcKICAgIC8vIHNlbGYuYXNzZXRfc3VzcGVuZGVkID0gc3VzcGVuZGVkCiAgICBieXRlYyA4IC8vICJhc3NldF9zdXNwZW5kZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1OAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QgICMgVE9ETzogVXBkYXRlIHNwZWNzIGFuZCBhZGQgdGVzdAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X2FycmFuZ2VyW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjY4CiAgICAvLyByZXR1cm4gc2VsZi5hcnJhbmdlci52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzEgLy8gMHg1MjIzNDE3MjcyNjE2ZTY3NjU3MjIzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJyYW5nZXIgZXhpc3RzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjYwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9hZGRyZXNzX3JvbGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfYWRkcmVzc19yb2xlczoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg0CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmFjY291bnRfbWFuYWdlciwgYWRkcmVzcyksCiAgICBieXRlY18zIC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0NGQ2MTZlNjE2NzY1NzIyMwogICAgZGlnIDEKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg1CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnByaW1hcnlfZGVhbGVyLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDQgLy8gMHg1MjIzNTA3MjY5NmQ2MTcyNzk0NDY1NjE2YzY1NzIyMwogICAgZGlnIDIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg2CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnRydXN0ZWUsIGFkZHJlc3MpLAogICAgYnl0ZWMgNSAvLyAweDUyMjM1NDcyNzU3Mzc0NjU2NTIzCiAgICBkaWcgMwogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODcKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYXV0aG9yaXR5LCBhZGRyZXNzKSwKICAgIGJ5dGVjXzIgLy8gMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMKICAgIGRpZyA0CiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4OAogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5vYnNlcnZlciwgYWRkcmVzcyksCiAgICBieXRlYyA2IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgdW5jb3ZlciA1CiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBwdXNoYnl0ZXMgMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgNgogICAgc2V0Yml0CiAgICBpbnRjXzAgLy8gMQogICAgdW5jb3ZlciA1CiAgICBzZXRiaXQKICAgIHB1c2hpbnQgMgogICAgdW5jb3ZlciA0CiAgICBzZXRiaXQKICAgIHB1c2hpbnQgMwogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIHB1c2hpbnQgNAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5W3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfcm9sZV92YWxpZGl0eToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDUKICAgIC8vIHJvbGUgPSByb2xlX2lkLmFzX3VpbnQ2NCgpCiAgICBidG9pCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA2CiAgICAvLyBzZWxmLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlKQogICAgZHVwCiAgICBjYWxsc3ViIF9hc3NlcnRfdmFsaWRfcm9sZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwOAogICAgLy8gY2FzZSBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUik6CiAgICBpbnRjXzMgLy8gMjAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTIKICAgIC8vIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIHB1c2hpbnRzIDQwIDUwIDYwIDcwIDgwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA3LTMzOAogICAgLy8gbWF0Y2ggcm9sZToKICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKToKICAgIC8vICAgICAgICAgcmV0dXJuIHR5cC5Sb2xlVmFsaWRpdHkoCiAgICAvLyAgICAgICAgICAgICByb2xlX3ZhbGlkaXR5X3N0YXJ0PVVJbnQ2NCgwKSwgcm9sZV92YWxpZGl0eV9lbmQ9VUludDY0KDApCiAgICAvLyAgICAgICAgICkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSk6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSk6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgXzoKICAgIC8vICAgICAgICAgb3AuZXJyKGVyci5JTlZBTElEX1JPTEUpCiAgICB1bmNvdmVyIDYKICAgIG1hdGNoIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMEAyIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMUAzIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMkA0IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfM0A1IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNEA2IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzM4CiAgICAvLyBvcC5lcnIoZXJyLklOVkFMSURfUk9MRSkKICAgIGVyciAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV81QDc6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzM0CiAgICAvLyBzZWxmLm9ic2VydmVyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDYgLy8gMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzMzLTMzNQogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMzNgogICAgLy8gcmV0dXJuIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzRANjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjkKICAgIC8vIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjXzIgLy8gMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjgtMzMwCiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5hdXRob3JpdHksIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMzMQogICAgLy8gcmV0dXJuIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfM0A1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyNAogICAgLy8gc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDUgLy8gMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMy0zMjUKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyNgogICAgLy8gcmV0dXJuIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzJANDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTkKICAgIC8vIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgNCAvLyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzE4LTMyMAogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMQogICAgLy8gcmV0dXJuIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8xQDM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzE0CiAgICAvLyBzZWxmLmFjY291bnRfbWFuYWdlciwgcm9sZV9hZGRyZXNzCiAgICBieXRlY18zIC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0NGQ2MTZlNjE2NzY1NzIyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxMy0zMTUKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLmFjY291bnRfbWFuYWdlciwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzE2CiAgICAvLyByZXR1cm4gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8wQDI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA5LTMxMQogICAgLy8gcmV0dXJuIHR5cC5Sb2xlVmFsaWRpdHkoCiAgICAvLyAgICAgcm9sZV92YWxpZGl0eV9zdGFydD1VSW50NjQoMCksIHJvbGVfdmFsaWRpdHlfZW5kPVVJbnQ2NCgwKQogICAgLy8gKQogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3JvbGVfaXNfYWN0aXZlKHJvbGVfbWFwOiBieXRlcywgcm9sZV9hZGRyZXNzOiBieXRlcykgLT4gdWludDY0Ogpfcm9sZV9pc19hY3RpdmU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTcKICAgIC8vIGRlZiBfcm9sZV9pc19hY3RpdmUoc2VsZiwgcm9sZV9tYXA6IHR5cC5SYmFjUm9sZSwgcm9sZV9hZGRyZXNzOiBBY2NvdW50KSAtPiBib29sOgogICAgcHJvdG8gMiAxCiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OC02MgogICAgLy8gcmV0dXJuIHNlbGYuX2hhc19yb2xlKHJvbGVfbWFwLCByb2xlX2FkZHJlc3MpIGFuZCAoCiAgICAvLyAgICAgcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICAvLyApCiAgICBieiBfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTkKICAgIC8vIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBCb3hNYXAgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2MAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTktNjAKICAgIC8vIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIDw9CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTktNjEKICAgIC8vIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IF9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2MQogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBCb3hNYXAgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDgKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAtNjEKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgPj0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgaW50Y18wIC8vIDEKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX21lcmdlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzEgLy8gMAogICAgYiBfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKSAtPiB2b2lkOgpfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2NQogICAgLy8gYXNzZXJ0IHNlbGYuX2lzX2FycmFuZ2VyKFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTIKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgPT0gc2VsZi5hcnJhbmdlci52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzEgLy8gMHg1MjIzNDE3MjcyNjE2ZTY3NjU3MjIzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJyYW5nZXIgZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjY1CiAgICAvLyBhc3NlcnQgc2VsZi5faXNfYXJyYW5nZXIoVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkgLT4gdm9pZDoKX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjgzCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYXNzZXRfZGVmYXVsdGVkLCBlcnIuREVGQVVMVEVECiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgOSAvLyAiYXNzZXRfZGVmYXVsdGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2RlZmF1bHRlZCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBEZWZhdWx0ZWQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkOiB1aW50NjQpIC0+IHZvaWQ6Cl9hc3NlcnRfdmFsaWRfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OAogICAgLy8gZGVmIF9hc3NlcnRfdmFsaWRfcm9sZShzZWxmLCByb2xlX2lkOiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTAKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIGludGNfMyAvLyAyMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICBwdXNoaW50IDI1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MgogICAgLy8gVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIHB1c2hpbnQgNDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkzCiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICBwdXNoaW50IDUwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NAogICAgLy8gVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICBwdXNoaW50IDYwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NQogICAgLy8gVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIHB1c2hpbnQgNzAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojk2CiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICBwdXNoaW50IDgwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBieiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9mYWxzZUA4CgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDc6CiAgICBpbnRjXzAgLy8gMQoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfbWVyZ2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICByZXRzdWIKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX2ZhbHNlQDg6CiAgICBpbnRjXzEgLy8gMAogICAgYiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9tZXJnZUA5Cg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="}, "sourceInfo": {"approval": {"pcOffsetMethod": "none", "sourceInfo": [{"pc": [980], "errorMessage": "Defaulted"}, {"pc": [405, 429, 453, 476, 500, 555, 583, 605, 626, 648, 824, 841, 856, 871, 885], "errorMessage": "Invalid account role address"}, {"pc": [540, 814, 1041], "errorMessage": "Invalid role identifier"}, {"pc": [670, 972], "errorMessage": "Not authorized"}, {"pc": [932, 947], "errorMessage": "check BoxMap entry exists"}, {"pc": [687, 970], "errorMessage": "check self.arranger exists"}, {"pc": [978], "errorMessage": "check self.asset_defaulted exists"}, {"pc": [661], "errorMessage": "invalid number of bytes for arc4.bool"}, {"pc": [290, 313, 347, 524, 701, 784], "errorMessage": "invalid number of bytes for arc4.static_array"}, {"pc": [337, 514, 774], "errorMessage": "invalid number of bytes for arc4.uint8"}, {"pc": [358], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.RoleValidity"}]}, "clear": {"pcOffsetMethod": "none", "sourceInfo": []}}, "templateVariables": {}}""" +_APP_SPEC_JSON = r"""{"arcs": [22, 28], "bareActions": {"call": [], "create": ["NoOp"]}, "methods": [{"actions": {"call": ["UpdateApplication"], "create": []}, "args": [], "name": "contract_update", "returns": {"type": "void"}, "desc": "Update D-ASA application.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "New Arranger address", "name": "new_arranger"}], "name": "rbac_rotate_arranger", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Rotate the Arranger address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Operation Daemon address", "name": "address"}], "name": "rbac_set_op_daemon", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Non-Normative: Set the Operation Daemon address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}, {"type": "(uint64,uint64)", "desc": "Role time validity", "name": "validity", "struct": "RoleValidity"}], "name": "rbac_assign_role", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Assign a role to an address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}], "name": "rbac_revoke_role", "returns": {"type": "uint64", "desc": "Timestamp of the role revocation"}, "desc": "Revoke a role from an address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Suspension status", "name": "suspended"}], "name": "rbac_contract_suspension", "returns": {"type": "uint64", "desc": "Timestamp of the set asset suspension status"}, "desc": "Set asset suspension status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "rbac_get_arranger", "returns": {"type": "address", "desc": "Arranger address"}, "desc": "Get Arranger address", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Address to get roles for", "name": "address"}], "name": "rbac_get_address_roles", "returns": {"type": "(bool,bool,bool,bool,bool)", "desc": "Roles mask: (Account Manager, Primary Dealer, Trustee, Authority, Observer)"}, "desc": "Non-normative - Get roles assigned to an address", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}], "name": "rbac_get_role_validity", "returns": {"type": "(uint64,uint64)", "desc": "Role validity", "struct": "RoleValidity"}, "desc": "Get role validity", "events": [], "readonly": true, "recommendations": {}}], "name": "MockRbacModule", "state": {"keys": {"box": {}, "global": {"arranger": {"key": "UiNBcnJhbmdlciM=", "keyType": "AVMBytes", "valueType": "address"}, "op_daemon": {"key": "UiNPcERhZW1vbiM=", "keyType": "AVMBytes", "valueType": "address"}, "asset_suspended": {"key": "YXNzZXRfc3VzcGVuZGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "asset_defaulted": {"key": "YXNzZXRfZGVmYXVsdGVk", "keyType": "AVMString", "valueType": "AVMUint64"}}, "local": {}}, "maps": {"box": {"account_manager": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNBY2NvdW50TWFuYWdlciM="}, "primary_dealer": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNQcmltYXJ5RGVhbGVyIw=="}, "trustee": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNUcnVzdGVlIw=="}, "authority": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNBdXRob3JpdHkj"}, "observer": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNPYnNlcnZlciM="}}, "global": {}, "local": {}}, "schema": {"global": {"bytes": 2, "ints": 2}, "local": {"bytes": 0, "ints": 0}}}, "structs": {"RoleValidity": [{"name": "role_validity_start", "type": "uint64"}, {"name": "role_validity_end", "type": "uint64"}]}, "byteCode": {"approval": "CyAEAQAgFCYKBBUffHULUiNBcnJhbmdlciMMUiNBdXRob3JpdHkjEVIjQWNjb3VudE1hbmFnZXIjEFIjUHJpbWFyeURlYWxlciMKUiNUcnVzdGVlIwtSI09ic2VydmVyIwtSI09wRGFlbW9uIw9hc3NldF9zdXNwZW5kZWQPYXNzZXRfZGVmYXVsdGVkMRhAABEpMgNnJwcyA2cnCCNnJwkjZzEbQQBggASRTwTrNhoAjgEARzEZFEQxGESCCASC9xstBO8E9dME3zQ1UAQ9voC9BB4+SOcEAQyCmQR0BqzSBBpyou42GgCOCAAgADcATwEAAZMBsQG7AgQAMRmBBBIxGBBEQgAOMRkUMRgUEEQpMQBnIkOIAqwiQzYaAUkVJBJEiAKfKUxnMgcWKExQsCJDNhoBSRUkEkSIAognB0xnMgcWKExQsCJDNhoBSRUiEkQ2GgJJTgIVJBJENhoDSU4CFYEQEkSIAluIAmEXRwKIAmMlEkEADSlLA2cyBxYoTFCwIkNJgSgSQQAQK0sDUEm9RQEUREsCv0L/4EmBMhJBABEnBEsDUEm9RQEUREsCv0L/yEmBPBJBABEnBUsDUEm9RQEUREsCv0L/sEmBRhJBABAqSwNQSb1FARRESwK/Qv+ZSYFQEkH/kicGSwNQSb1FARRESwK/Qv+BNhoBSRUiEkQ2GgJJTgIVJBJEiAG1iAG7F0cCiAG9SSUTRIEoEkEAFCtLAlBJvUUBRLxIMgcWKExQsCJDSYEyEkEADycESwJQSb1FAUS8SEL/4UmBPBJBAA8nBUsCUEm9RQFEvEhC/8tJgUYSQQAOKksCUEm9RQFEvEhC/7ZJgVASQf+vJwZLAlBJvUUBRLxIQv+gNhoBSRUiEkQjUyoxAIgA8kQnCExnMgcWKExQsCJDIyllRChMULAiQzYaAUkVJBJEK0sBiADMJwRLAogAxScFSwOIAL4qSwSIALgnBk8FiACxgAEAI08GVCJPBVSBAk8EVIEDTwNUgQRPAlQoTFCwIkM2GgFJFSISRDYaAklOAhUkEkQXSYgAwCWDBSgyPEZQTwaOBgBNAD8AMAAhABMAAQAnBksBUEm9RQFEvkgoTFCwIkMqSwFQSb1FAUS+SEL/7CcFSwFQSb1FAUS+SEL/3ScESwFQSb1FAUS+SEL/zitLAVBJvUUBRL5IQv/AgBAAAAAAAAAAAAAAAAAAAAAAQv+rigIBgACL/ov/UEm9RQFBACCLAb5EI1syB0mMAA5BABGLAb5EgQhbiwAPQQAEIowAiSNC//kxACMpZUQSRIkjJwllRBREiYoBAIv/JRJAADCL/4EZEkAAKIv/gSgSQAAgi/+BMhJAABiL/4E8EkAAEIv/gUYSQAAIi/+BUBJBAAMiRIkjQv/6", "clear": "C4EBQw=="}, "desc": "\n RBAC Module for testing\n ", "events": [], "networks": {}, "source": {"approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMzIgMjAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMgMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMgMHg1MjIzNDE2MzYzNmY3NTZlNzQ0ZDYxNmU2MTY3NjU3MjIzIDB4NTIyMzUwNzI2OTZkNjE3Mjc5NDQ2NTYxNmM2NTcyMjMgMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMyAweDUyMjM0ZjYyNzM2NTcyNzY2NTcyMjMgMHg1MjIzNGY3MDQ0NjE2NTZkNmY2ZTIzICJhc3NldF9zdXNwZW5kZWQiICJhc3NldF9kZWZhdWx0ZWQiCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgtMjkKICAgIC8vICMgUkJBQyBSb2xlcwogICAgLy8gc2VsZi5hcnJhbmdlciA9IEdsb2JhbFN0YXRlKEFjY291bnQoKSwga2V5PWNzdC5QUkVGSVhfSURfQVJSQU5HRVIpCiAgICBieXRlY18xIC8vIDB4NTIyMzQxNzI3MjYxNmU2NzY1NzIyMwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwCiAgICAvLyBzZWxmLm9wX2RhZW1vbiA9IEdsb2JhbFN0YXRlKEFjY291bnQoKSwga2V5PWNzdC5QUkVGSVhfSURfT1BfREFFTU9OKQogICAgYnl0ZWMgNyAvLyAweDUyMjM0ZjcwNDQ2MTY1NmQ2ZjZlMjMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo0Ny00OAogICAgLy8gIyBELUFTQSBHb3Zlcm5hbmNlCiAgICAvLyBzZWxmLmFzc2V0X3N1c3BlbmRlZCA9IEZhbHNlCiAgICBieXRlYyA4IC8vICJhc3NldF9zdXNwZW5kZWQiCiAgICBpbnRjXzEgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo0OQogICAgLy8gc2VsZi5hc3NldF9kZWZhdWx0ZWQgPSBGYWxzZQogICAgYnl0ZWMgOSAvLyAiYXNzZXRfZGVmYXVsdGVkIgogICAgaW50Y18xIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tb2NrX21vZHVsZV9yYmFjL2NvbnRyYWN0LnB5OjYKICAgIC8vIGNsYXNzIE1vY2tSYmFjTW9kdWxlKFJiYWNNb2R1bGUpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fY3JlYXRlQDE5CiAgICBwdXNoYnl0ZXMgMHg5MTRmMDRlYiAvLyBtZXRob2QgImNvbnRyYWN0X3VwZGF0ZSgpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fY29udHJhY3RfdXBkYXRlX3JvdXRlQDUKCm1haW5fc3dpdGNoX2Nhc2VfbmV4dEA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL21vY2tfbW9kdWxlX3JiYWMvY29udHJhY3QucHk6NgogICAgLy8gY2xhc3MgTW9ja1JiYWNNb2R1bGUoUmJhY01vZHVsZSk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHg4MmY3MWIyZCAweGVmMDRmNWQzIDB4ZGYzNDM1NTAgMHgzZGJlODBiZCAweDFlM2U0OGU3IDB4MDEwYzgyOTkgMHg3NDA2YWNkMiAweDFhNzJhMmVlIC8vIG1ldGhvZCAicmJhY19yb3RhdGVfYXJyYW5nZXIoYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgInJiYWNfc2V0X29wX2RhZW1vbihhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19hc3NpZ25fcm9sZSh1aW50OCxhZGRyZXNzLCh1aW50NjQsdWludDY0KSl1aW50NjQiLCBtZXRob2QgInJiYWNfcmV2b2tlX3JvbGUodWludDgsYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgInJiYWNfY29udHJhY3Rfc3VzcGVuc2lvbihib29sKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19nZXRfYXJyYW5nZXIoKWFkZHJlc3MiLCBtZXRob2QgInJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXMoYWRkcmVzcykoYm9vbCxib29sLGJvb2wsYm9vbCxib29sKSIsIG1ldGhvZCAicmJhY19nZXRfcm9sZV92YWxpZGl0eSh1aW50OCxhZGRyZXNzKSh1aW50NjQsdWludDY0KSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIHJiYWNfcm90YXRlX2FycmFuZ2VyIHJiYWNfc2V0X29wX2RhZW1vbiByYmFjX2Fzc2lnbl9yb2xlIHJiYWNfcmV2b2tlX3JvbGUgcmJhY19jb250cmFjdF9zdXNwZW5zaW9uIHJiYWNfZ2V0X2FycmFuZ2VyIHJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXMgcmJhY19nZXRfcm9sZV92YWxpZGl0eQogICAgZXJyCgptYWluX2NvbnRyYWN0X3VwZGF0ZV9yb3V0ZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgcHVzaGludCA0IC8vIFVwZGF0ZUFwcGxpY2F0aW9uCiAgICA9PQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICYmCiAgICBhc3NlcnQKICAgIGIgY29udHJhY3RfdXBkYXRlCgptYWluX2NyZWF0ZUAxOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tb2NrX21vZHVsZV9yYmFjL2NvbnRyYWN0LnB5OjE0CiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIGFzc2VydAogICAgLy8gc21hcnRfY29udHJhY3RzL21vY2tfbW9kdWxlX3JiYWMvY29udHJhY3QucHk6MTYKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSBUeG4uc2VuZGVyCiAgICBieXRlY18xIC8vIDB4NTIyMzQxNzI3MjYxNmU2NzY1NzIyMwogICAgdHhuIFNlbmRlcgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tb2NrX21vZHVsZV9yYmFjL2NvbnRyYWN0LnB5OjE0CiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuY29udHJhY3RfdXBkYXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfdXBkYXRlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE1My0xNTYKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBncmFudHMgdGhlIHVwZGF0ZSBwZXJtaXNzaW9ucyB0byB0aGUgQXJyYW5nZXIuCiAgICAvLyAjIOKaoO+4jyBXQVJOSU5HOiBBcHBsaWNhdGlvbiB1cGRhdGVzIG11c3QgYmUgZXhlY3V0ZWQgVkVSWSBjYXJlZnVsbHksIGFzIHRoZXkKICAgIC8vICMgbWlnaHQgaW50cm9kdWNlIGJyZWFraW5nIGNoYW5nZXMuCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3JvdGF0ZV9hcnJhbmdlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfcm90YXRlX2FycmFuZ2VyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE1OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNjkKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE3MAogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IG5ld19hcnJhbmdlcgogICAgYnl0ZWNfMSAvLyAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTcxCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfc2V0X29wX2RhZW1vbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfc2V0X29wX2RhZW1vbjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTg0CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODUKICAgIC8vIHNlbGYub3BfZGFlbW9uLnZhbHVlID0gYWRkcmVzcwogICAgYnl0ZWMgNyAvLyAweDUyMjM0ZjcwNDQ2MTY1NmQ2ZjZlMjMKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTg2CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfYXNzaWduX3JvbGVbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2Fzc2lnbl9yb2xlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIHB1c2hpbnQgMTYKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuUm9sZVZhbGlkaXR5CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjEwCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTEKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjEyCiAgICAvLyBzZWxmLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpKQogICAgYnRvaQogICAgZHVwbiAyCiAgICBjYWxsc3ViIF9hc3NlcnRfdmFsaWRfcm9sZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwMgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUik6CiAgICBpbnRjXzMgLy8gMjAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwMwogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IHJvbGVfYWRkcmVzcwogICAgYnl0ZWNfMSAvLyAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMKICAgIGRpZyAzCiAgICBhcHBfZ2xvYmFsX3B1dAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTQKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDYKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIGR1cAogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnRfbWFuYWdlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlY18zIC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0NGQ2MTZlNjE2NzY1NzIyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA4CiAgICAvLyBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMwogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTEwCiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKToKICAgIGR1cAogICAgcHVzaGludCA1MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTExCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDQgLy8gMHg1MjIzNTA3MjY5NmQ2MTcyNzk0NDY1NjE2YzY1NzIyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTEyCiAgICAvLyBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjEzCiAgICAvLyBzZWxmLl9zZXRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIHZhbGlkaXR5KQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTQKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNjAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDUgLy8gMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE2CiAgICAvLyBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExOAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlY18yIC8vIDB4NTIyMzQxNzU3NDY4NmY3MjY5NzQ3OTIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjAKICAgIC8vIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjEzCiAgICAvLyBzZWxmLl9zZXRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIHZhbGlkaXR5KQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMTE6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIyCiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKToKICAgIGR1cAogICAgcHVzaGludCA4MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjMKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYub2JzZXJ2ZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgNiAvLyAweDUyMjM0ZjYyNzM2NTcyNzY2NTcyMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyNAogICAgLy8gc2VsZi5vYnNlcnZlcltyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19yZXZva2Vfcm9sZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfcmV2b2tlX3JvbGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjE2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjM1CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzYKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjM3CiAgICAvLyBzZWxmLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpKQogICAgYnRvaQogICAgZHVwbiAyCiAgICBjYWxsc3ViIF9hc3NlcnRfdmFsaWRfcm9sZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyNwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgIT0gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBkdXAKICAgIGludGNfMyAvLyAyMAogICAgIT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyOAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjXzMgLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQ0ZDYxNmU2MTY3NjU3MjIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzAKICAgIC8vIGRlbCBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjM5CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMyCiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKToKICAgIGR1cAogICAgcHVzaGludCA1MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMzCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgNCAvLyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzQKICAgIC8vIGRlbCBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzOAogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzYKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNjAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgNSAvLyAweDUyMjM1NDcyNzU3Mzc0NjU2NTIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzgKICAgIC8vIGRlbCBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjM4CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDEKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hdXRob3JpdHksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWNfMiAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQyCiAgICAvLyBkZWwgc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjM4CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgODAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ1CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYub2JzZXJ2ZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgNiAvLyAweDUyMjM0ZjYyNzM2NTcyNzY2NTcyMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NgogICAgLy8gZGVsIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2NvbnRyYWN0X3N1c3BlbnNpb25bcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2NvbnRyYWN0X3N1c3BlbnNpb246CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QgICMgVE9ETzogVXBkYXRlIHNwZWNzIGFuZCBhZGQgdGVzdAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMSAvLyAwCiAgICBnZXRiaXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo3NwogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYXV0aG9yaXR5LCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWNfMiAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1NwogICAgLy8gc2VsZi5hc3NldF9zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGJ5dGVjIDggLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU4CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCAgIyBUT0RPOiBVcGRhdGUgc3BlY3MgYW5kIGFkZCB0ZXN0CiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYXJyYW5nZXJbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNjgKICAgIC8vIHJldHVybiBzZWxmLmFycmFuZ2VyLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMSAvLyAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcnJhbmdlciBleGlzdHMKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNjAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXNbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9hZGRyZXNzX3JvbGVzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODQKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBhZGRyZXNzKSwKICAgIGJ5dGVjXzMgLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQ0ZDYxNmU2MTY3NjU3MjIzCiAgICBkaWcgMQogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODUKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYucHJpbWFyeV9kZWFsZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgNCAvLyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzCiAgICBkaWcgMgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODYKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYudHJ1c3RlZSwgYWRkcmVzcyksCiAgICBieXRlYyA1IC8vIDB4NTIyMzU0NzI3NTczNzQ2NTY1MjMKICAgIGRpZyAzCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4NwogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIGFkZHJlc3MpLAogICAgYnl0ZWNfMiAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgZGlnIDQKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg4CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLm9ic2VydmVyLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDYgLy8gMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzCiAgICB1bmNvdmVyIDUKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjcwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHB1c2hieXRlcyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciA2CiAgICBzZXRiaXQKICAgIGludGNfMCAvLyAxCiAgICB1bmNvdmVyIDUKICAgIHNldGJpdAogICAgcHVzaGludCAyCiAgICB1bmNvdmVyIDQKICAgIHNldGJpdAogICAgcHVzaGludCAzCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgcHVzaGludCA0CiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwNQogICAgLy8gcm9sZSA9IHJvbGVfaWQuYXNfdWludDY0KCkKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDYKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGUpCiAgICBkdXAKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA4CiAgICAvLyBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKToKICAgIGludGNfMyAvLyAyMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxMgogICAgLy8gY2FzZSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludHMgNDAgNTAgNjAgNzAgODAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDctMzM4CiAgICAvLyBtYXRjaCByb2xlOgogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgLy8gICAgICAgICByZXR1cm4gdHlwLlJvbGVWYWxpZGl0eSgKICAgIC8vICAgICAgICAgICAgIHJvbGVfdmFsaWRpdHlfc3RhcnQ9VUludDY0KDApLCByb2xlX3ZhbGlkaXR5X2VuZD1VSW50NjQoMCkKICAgIC8vICAgICAgICAgKQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5hdXRob3JpdHksIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5vYnNlcnZlciwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5vYnNlcnZlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBfOgogICAgLy8gICAgICAgICBvcC5lcnIoZXJyLklOVkFMSURfUk9MRSkKICAgIHVuY292ZXIgNgogICAgbWF0Y2ggcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8wQDIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8xQDMgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8yQDQgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8zQDUgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV80QDYgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV81QDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzgKICAgIC8vIG9wLmVycihlcnIuSU5WQUxJRF9ST0xFKQogICAgZXJyIC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzVANzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzQKICAgIC8vIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgNiAvLyAweDUyMjM0ZjYyNzM2NTcyNzY2NTcyMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzMtMzM1CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5vYnNlcnZlciwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzM2CiAgICAvLyByZXR1cm4gc2VsZi5vYnNlcnZlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNEA2OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOQogICAgLy8gc2VsZi5hdXRob3JpdHksIHJvbGVfYWRkcmVzcwogICAgYnl0ZWNfMiAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOC0zMzAKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLmF1dGhvcml0eSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzMxCiAgICAvLyByZXR1cm4gc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8zQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI0CiAgICAvLyBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgNSAvLyAweDUyMjM1NDcyNzU3Mzc0NjU2NTIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzIzLTMyNQogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI2CiAgICAvLyByZXR1cm4gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMkA0OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxOQogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyA0IC8vIDB4NTIyMzUwNzI2OTZkNjE3Mjc5NDQ2NTYxNmM2NTcyMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTgtMzIwCiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzIxCiAgICAvLyByZXR1cm4gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzFAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTQKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjXzMgLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQ0ZDYxNmU2MTY3NjU3MjIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEzLTMxNQogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTYKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzBAMjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDktMzExCiAgICAvLyByZXR1cm4gdHlwLlJvbGVWYWxpZGl0eSgKICAgIC8vICAgICByb2xlX3ZhbGlkaXR5X3N0YXJ0PVVJbnQ2NCgwKSwgcm9sZV92YWxpZGl0eV9lbmQ9VUludDY0KDApCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fcm9sZV9pc19hY3RpdmUocm9sZV9tYXA6IGJ5dGVzLCByb2xlX2FkZHJlc3M6IGJ5dGVzKSAtPiB1aW50NjQ6Cl9yb2xlX2lzX2FjdGl2ZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NwogICAgLy8gZGVmIF9yb2xlX2lzX2FjdGl2ZShzZWxmLCByb2xlX21hcDogdHlwLlJiYWNSb2xlLCByb2xlX2FkZHJlc3M6IEFjY291bnQpIC0+IGJvb2w6CiAgICBwcm90byAyIDEKICAgIHB1c2hieXRlcyAiIgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU4LTYyCiAgICAvLyByZXR1cm4gc2VsZi5faGFzX3JvbGUocm9sZV9tYXAsIHJvbGVfYWRkcmVzcykgYW5kICgKICAgIC8vICAgICByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICkKICAgIGJ6IF9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIEJveE1hcCBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYwCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MAogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgPD0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYxCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIEJveE1hcCBlbnRyeSBleGlzdHMKICAgIHB1c2hpbnQgOAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2MC02MQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAwCiAgICA+PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5LTYxCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0CiAgICBpbnRjXzAgLy8gMQoKX3JvbGVfaXNfYWN0aXZlX2Jvb2xfbWVyZ2VANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OC02MgogICAgLy8gcmV0dXJuIHNlbGYuX2hhc19yb2xlKHJvbGVfbWFwLCByb2xlX2FkZHJlc3MpIGFuZCAoCiAgICAvLyAgICAgcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICAvLyApCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANDoKICAgIGludGNfMSAvLyAwCiAgICBiIF9yb2xlX2lzX2FjdGl2ZV9ib29sX21lcmdlQDUKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpIC0+IHZvaWQ6Cl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjY1CiAgICAvLyBhc3NlcnQgc2VsZi5faXNfYXJyYW5nZXIoVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1MgogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyA9PSBzZWxmLmFycmFuZ2VyLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMSAvLyAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcnJhbmdlciBleGlzdHMKICAgID09CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjUKICAgIC8vIGFzc2VydCBzZWxmLl9pc19hcnJhbmdlcihUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKSAtPiB2b2lkOgpfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODMKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5hc3NldF9kZWZhdWx0ZWQsIGVyci5ERUZBVUxURUQKICAgIGludGNfMSAvLyAwCiAgICBieXRlYyA5IC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfZGVmYXVsdGVkIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIERlZmF1bHRlZAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGVfaWQ6IHVpbnQ2NCkgLT4gdm9pZDoKX2Fzc2VydF92YWxpZF9yb2xlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg4CiAgICAvLyBkZWYgX2Fzc2VydF92YWxpZF9yb2xlKHNlbGYsIHJvbGVfaWQ6IFVJbnQ2NCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MAogICAgLy8gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgaW50Y18zIC8vIDIwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MQogICAgLy8gVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIHB1c2hpbnQgMjUKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkyCiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgcHVzaGludCA0MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTMKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIHB1c2hpbnQgNTAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojk0CiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIHB1c2hpbnQgNjAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojk1CiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgcHVzaGludCA3MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTYKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIHB1c2hpbnQgODAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJ6IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX2ZhbHNlQDgKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANzoKICAgIGludGNfMCAvLyAxCgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9tZXJnZUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBhc3NlcnQgLy8gSW52YWxpZCByb2xlIGlkZW50aWZpZXIKICAgIHJldHN1YgoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfZmFsc2VAODoKICAgIGludGNfMSAvLyAwCiAgICBiIF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX21lcmdlQDkK", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="}, "sourceInfo": {"approval": {"pcOffsetMethod": "none", "sourceInfo": [{"pc": [980], "errorMessage": "Defaulted"}, {"pc": [405, 429, 453, 476, 500, 555, 583, 605, 626, 648, 824, 841, 856, 871, 885], "errorMessage": "Invalid account role address"}, {"pc": [540, 814, 1041], "errorMessage": "Invalid role identifier"}, {"pc": [670, 972], "errorMessage": "Not authorized"}, {"pc": [932, 947], "errorMessage": "check BoxMap entry exists"}, {"pc": [687, 970], "errorMessage": "check self.arranger exists"}, {"pc": [978], "errorMessage": "check self.asset_defaulted exists"}, {"pc": [661], "errorMessage": "invalid number of bytes for arc4.bool"}, {"pc": [290, 313, 347, 524, 701, 784], "errorMessage": "invalid number of bytes for arc4.static_array"}, {"pc": [337, 514, 774], "errorMessage": "invalid number of bytes for arc4.uint8"}, {"pc": [358], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.RoleValidity"}]}, "clear": {"pcOffsetMethod": "none", "sourceInfo": []}}, "templateVariables": {}}""" APP_SPEC = algokit_utils.Arc56Contract.from_json(_APP_SPEC_JSON) def _parse_abi_args(args: object | None = None) -> list[object] | None: @@ -111,13 +111,13 @@ def abi_method_signature(self) -> str: return "rbac_revoke_role(uint8,address)uint64" @dataclasses.dataclass(frozen=True, kw_only=True) -class RbacGovAssetSuspensionArgs: - """Dataclass for rbac_gov_asset_suspension arguments""" +class RbacContractSuspensionArgs: + """Dataclass for rbac_contract_suspension arguments""" suspended: bool @property def abi_method_signature(self) -> str: - return "rbac_gov_asset_suspension(bool)uint64" + return "rbac_contract_suspension(bool)uint64" @dataclasses.dataclass(frozen=True, kw_only=True) class RbacGetAddressRolesArgs: @@ -217,16 +217,16 @@ def rbac_revoke_role( "args": method_args, })) - def rbac_gov_asset_suspension( + def rbac_contract_suspension( self, - args: tuple[bool] | RbacGovAssetSuspensionArgs, + args: tuple[bool] | RbacContractSuspensionArgs, params: algokit_utils.CommonAppCallParams | None = None ) -> algokit_utils.AppCallMethodCallParams: method_args = _parse_abi_args(args) params = params or algokit_utils.CommonAppCallParams() return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ **dataclasses.asdict(params), - "method": "rbac_gov_asset_suspension(bool)uint64", + "method": "rbac_contract_suspension(bool)uint64", "args": method_args, })) @@ -356,16 +356,16 @@ def rbac_revoke_role( "args": method_args, })) - def rbac_gov_asset_suspension( + def rbac_contract_suspension( self, - args: tuple[bool] | RbacGovAssetSuspensionArgs, + args: tuple[bool] | RbacContractSuspensionArgs, params: algokit_utils.CommonAppCallParams | None = None ) -> algokit_utils.BuiltTransactions: method_args = _parse_abi_args(args) params = params or algokit_utils.CommonAppCallParams() return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ **dataclasses.asdict(params), - "method": "rbac_gov_asset_suspension(bool)uint64", + "method": "rbac_contract_suspension(bool)uint64", "args": method_args, })) @@ -510,9 +510,9 @@ def rbac_revoke_role( parsed_response = response return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - def rbac_gov_asset_suspension( + def rbac_contract_suspension( self, - args: tuple[bool] | RbacGovAssetSuspensionArgs, + args: tuple[bool] | RbacContractSuspensionArgs, params: algokit_utils.CommonAppCallParams | None = None, send_params: algokit_utils.SendParams | None = None ) -> algokit_utils.SendAppTransactionResult[int]: @@ -520,7 +520,7 @@ def rbac_gov_asset_suspension( params = params or algokit_utils.CommonAppCallParams() response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ **dataclasses.asdict(params), - "method": "rbac_gov_asset_suspension(bool)uint64", + "method": "rbac_contract_suspension(bool)uint64", "args": method_args, }), send_params=send_params) parsed_response = response @@ -940,7 +940,7 @@ def decode_return_value( @typing.overload def decode_return_value( self, - method: typing.Literal["rbac_gov_asset_suspension(bool)uint64"], + method: typing.Literal["rbac_contract_suspension(bool)uint64"], return_value: algokit_utils.ABIReturn | None ) -> int | None: ... @typing.overload @@ -1250,20 +1250,20 @@ def rbac_revoke_role( compilation_params=compilation_params ) - def rbac_gov_asset_suspension( + def rbac_contract_suspension( self, - args: tuple[bool] | RbacGovAssetSuspensionArgs, + args: tuple[bool] | RbacContractSuspensionArgs, *, params: algokit_utils.CommonAppCallCreateParams | None = None, compilation_params: algokit_utils.AppClientCompilationParams | None = None ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_gov_asset_suspension(bool)uint64 ABI method""" + """Creates a new instance using the rbac_contract_suspension(bool)uint64 ABI method""" params = params or algokit_utils.CommonAppCallCreateParams() return self.app_factory.params.create( algokit_utils.AppFactoryCreateMethodCallParams( **{ **dataclasses.asdict(params), - "method": "rbac_gov_asset_suspension(bool)uint64", + "method": "rbac_contract_suspension(bool)uint64", "args": _parse_abi_args(args), } ), @@ -1552,21 +1552,21 @@ def rbac_revoke_role( ) return self - def rbac_gov_asset_suspension( + def rbac_contract_suspension( self, - args: tuple[bool] | RbacGovAssetSuspensionArgs, + args: tuple[bool] | RbacContractSuspensionArgs, params: algokit_utils.CommonAppCallParams | None = None, compilation_params: algokit_utils.AppClientCompilationParams | None = None ) -> "MockRbacModuleComposer": self._composer.add_app_call_method_call( - self.client.params.rbac_gov_asset_suspension( + self.client.params.rbac_contract_suspension( args=args, params=params, ) ) self._result_mappers.append( lambda v: self.client.decode_return_value( - "rbac_gov_asset_suspension(bool)uint64", v + "rbac_contract_suspension(bool)uint64", v ) ) return self From e70924a4ae2c618ae93d8d7d56c134945d6ac30b Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 00:04:22 +0100 Subject: [PATCH 145/244] feat: observed cash event request --- smart_contracts/abi_types.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/smart_contracts/abi_types.py b/smart_contracts/abi_types.py index 6bc7d9a3..05dde824 100644 --- a/smart_contracts/abi_types.py +++ b/smart_contracts/abi_types.py @@ -105,6 +105,20 @@ class ObservedEventRequest(Struct, kw_only=True): flags: UInt64 +class ObservedCashEventRequest(Struct, kw_only=True): + """Authorized payload for appending observed ACTUS cash events.""" + + event_id: UInt64 + event_type: EventTypeId + scheduled_time: TimeStamp + accrual_factor: UInt64 + redemption_accrual_factor: UInt64 + next_nominal_interest_rate: UInt64 + next_principal_redemption: UInt64 + next_outstanding_principal: UInt64 + flags: UInt64 + + class KernelState(Struct, kw_only=True): """Typed Global State.""" From 85a798cb0b4976c696cbc7d54e14b7f746993ce2 Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 00:04:55 +0100 Subject: [PATCH 146/244] chore: op up constants --- smart_contracts/constants.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/smart_contracts/constants.py b/smart_contracts/constants.py index 1259f684..2359e388 100644 --- a/smart_contracts/constants.py +++ b/smart_contracts/constants.py @@ -7,6 +7,10 @@ MAX_ARGS_SIZE: Final[int] = 2048 OP_UP_CONTRACT_CONFIG_BASE_BUDGET: Final[int] = 1_500 OP_UP_CONTRACT_CONFIG_PER_ENTRY_BUDGET: Final[int] = 100 +OP_UP_FUND_DUE_CASHFLOWS_BASE_BUDGET: Final[int] = 1_500 +OP_UP_FUND_DUE_CASHFLOWS_PER_EVENT_BUDGET: Final[int] = 100 +OP_UP_NON_CASH_BASE_BUDGET: Final[int] = 1_500 +OP_UP_NON_CASH_PER_ENTRY_BUDGET: Final[int] = 100 SCHEDULE_PAGE_SIZE: Final[int] = 16 ################################################################################ From 95bad9789e88a5857e16e2be1f8565a2ece63fc0 Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 00:06:27 +0100 Subject: [PATCH 147/244] chore: restrict D-ASA compliance profile --- src/normalization/core.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/normalization/core.py b/src/normalization/core.py index b2d9e728..6237cf27 100644 --- a/src/normalization/core.py +++ b/src/normalization/core.py @@ -8,6 +8,7 @@ from smart_contracts import constants as cst from ..contracts import ContractAttributes +from ..day_count import BusinessDayConvention, Calendar from ..day_count import year_fraction_fixed from ..errors import ActusNormalizationError, UnsupportedActusFeatureError from ..models import ( @@ -143,6 +144,16 @@ def normalize_contract_attributes( "D-ASA requires status_date to be strictly before initial_exchange_date" ) + if contract.business_day_convention != BusinessDayConvention.NOS: + raise UnsupportedActusFeatureError( + "D-ASA compliance profile only supports business_day_convention=NOS" + ) + + if contract.calendar != Calendar.NC: + raise UnsupportedActusFeatureError( + "D-ASA compliance profile only supports calendar=NC" + ) + # Extract base contract type (e.g., "PAM" from "PAM:ZCB") base_contract_type = extract_base_contract_type(contract.contract_type) From 2c2a8b0b0d5796265657a54196f3f8e934e368b7 Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 00:07:30 +0100 Subject: [PATCH 148/244] chore: obs cash event request --- src/models.py | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/models.py b/src/models.py index 6578ef45..614bef0c 100644 --- a/src/models.py +++ b/src/models.py @@ -149,6 +149,34 @@ def to_schedule_entry(self, event_id: int) -> ExecutionScheduleEntry: ) +@dataclass(frozen=True, slots=True) +class ObservedCashEventRequest: + """SDK-side representation of an observed ACTUS cash-event payload.""" + + event_type: str + scheduled_time: UTCTimeStamp + accrual_factor: int + redemption_accrual_factor: int + next_nominal_interest_rate: int + next_principal_redemption: int + next_outstanding_principal: int + flags: int = 0 + + def to_schedule_entry(self, event_id: int) -> ExecutionScheduleEntry: + """Convert an observed cash payload into the Execution Schedule Entry shape.""" + return ExecutionScheduleEntry( + event_id=event_id, + event_type=self.event_type, + scheduled_time=self.scheduled_time, + accrual_factor=self.accrual_factor, + redemption_accrual_factor=self.redemption_accrual_factor, + next_nominal_interest_rate=self.next_nominal_interest_rate, + next_principal_redemption=self.next_principal_redemption, + next_outstanding_principal=self.next_outstanding_principal, + flags=self.flags, + ) + + @dataclass(frozen=True, slots=True) class AccountPosition: """SDK-side D-ASA Contract holder position.""" From ca4919be005cfaf7f4fa3d701068fc3f9e5400a9 Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 00:07:50 +0100 Subject: [PATCH 149/244] chore: op up --- modules/payment_agent.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/modules/payment_agent.py b/modules/payment_agent.py index b1f51758..fae119bc 100644 --- a/modules/payment_agent.py +++ b/modules/payment_agent.py @@ -1,6 +1,7 @@ -from algopy import Account, Bytes, Global, Txn, UInt64, arc4, itxn +from algopy import Account, Bytes, Global, Txn, UInt64, arc4, ensure_budget, itxn from smart_contracts import abi_types as typ +from smart_contracts import constants as cst from smart_contracts import errors as err from .accounting import AccountingModule @@ -51,6 +52,14 @@ def fund_due_cashflows(self, *, max_event_count: UInt64) -> typ.CashFundingResul self._assert_is_not_asset_defaulted() self._assert_is_not_asset_suspended() self._assert_initial_exchange_executed() + if self._is_dynamic_annuity(): + ensure_budget( + required_budget=( + UInt64(cst.OP_UP_FUND_DUE_CASHFLOWS_BASE_BUDGET) + + max_event_count + * UInt64(cst.OP_UP_FUND_DUE_CASHFLOWS_PER_EVENT_BUDGET) + ), + ) processed_events = UInt64(0) funded_interest = UInt64(0) From d930c2c77105ed07603282c95c4e27b77c31581f Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 00:08:04 +0100 Subject: [PATCH 150/244] chore: allow pi event --- src/registry.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/registry.py b/src/registry.py index e3bb14b8..6cb64b92 100644 --- a/src/registry.py +++ b/src/registry.py @@ -47,6 +47,7 @@ EVENT_TYPE_IDS: dict[str, int] = { "IED": enums.EVT_IED, + "PI": enums.EVT_PI, "PR": enums.EVT_PR, "PRF": enums.EVT_PRF, "IP": enums.EVT_IP, From c947c026e24666726c641e9b205d6b1b8ed4fb3b Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 00:08:43 +0100 Subject: [PATCH 151/244] fix: principal schedule --- src/normalization/schedules.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/normalization/schedules.py b/src/normalization/schedules.py index 145bb778..fb5a52b3 100644 --- a/src/normalization/schedules.py +++ b/src/normalization/schedules.py @@ -79,7 +79,7 @@ def resolve_principal_schedule( return tuple( ts for ts in deduplicate_timestamps(timestamps) - if terms.initial_exchange_date < ts <= effective_end + if terms.initial_exchange_date < ts < effective_end ) anchor = contract.principal_redemption_anchor From cbf2a93c8177bb519d7535fc9c9e076d4f3b7382 Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 00:09:36 +0100 Subject: [PATCH 152/244] feat: observed cash event --- modules/actus_kernel.py | 64 +++++++++++++++++++++++++++++++++++++++++ src/__init__.py | 2 ++ 2 files changed, 66 insertions(+) diff --git a/modules/actus_kernel.py b/modules/actus_kernel.py index 2d529788..362ab425 100644 --- a/modules/actus_kernel.py +++ b/modules/actus_kernel.py @@ -677,6 +677,15 @@ def _apply_non_cash_schedule_entry( if self._is_dynamic_annuity(): if event_type == UInt64(enums.EVT_PRF): + ensure_budget( + required_budget=( + UInt64(cst.OP_UP_NON_CASH_BASE_BUDGET) + + ( + self.schedule_entry_count - self.event_cursor + ) + * UInt64(cst.OP_UP_NON_CASH_PER_ENTRY_BUDGET) + ), + ) self.next_principal_redemption = self._recalculate_annuity_payment( entry ) @@ -962,6 +971,45 @@ def _append_observed_event(self, payload: typ.ObservedEventRequest) -> None: self.schedule_page[page_index] = page.copy() self.schedule_entry_count += UInt64(1) + def _append_observed_cash_event(self, payload: typ.ObservedCashEventRequest) -> None: + """ + Append an authorized observed cash event to the schedule tail. + + This v1 path is intentionally narrow: only CLM observed `PR` events may + be appended, and they must preserve the append-only schedule ordering. + """ + assert self._supports_observed_events(), err.OBSERVED_EVENT_REQUIRED + assert payload.event_id == self.schedule_entry_count, err.INVALID_EVENT_ID + assert payload.event_type == arc4.UInt8(enums.EVT_PR), err.INVALID_EVENT_TYPE + assert payload.flags & UInt64(enums.FLAG_CASH_EVENT), err.INVALID_ACTUS_CONFIG + + if self.schedule_entry_count > UInt64(0): + previous_entry = self._get_schedule_entry(self.schedule_entry_count - UInt64(1)) + assert ( + previous_entry.scheduled_time <= payload.scheduled_time + ), err.INVALID_SORTING + + page_index = self._schedule_page_index(self.schedule_entry_count) + page = typ.ExecutionSchedulePage() + if page_index in self.schedule_page: + page = self.schedule_page[page_index].copy() + assert page.length < UInt64(cst.SCHEDULE_PAGE_SIZE), err.INVALID_SCHEDULE_PAGE + page.append( + typ.ExecutionScheduleEntry( + event_id=payload.event_id, + event_type=payload.event_type, + scheduled_time=payload.scheduled_time, + accrual_factor=payload.accrual_factor, + redemption_accrual_factor=payload.redemption_accrual_factor, + next_nominal_interest_rate=payload.next_nominal_interest_rate, + next_principal_redemption=payload.next_principal_redemption, + next_outstanding_principal=payload.next_outstanding_principal, + flags=payload.flags, + ) + ) + self.schedule_page[page_index] = page.copy() + self.schedule_entry_count += UInt64(1) + ############################################################################ # Public ABI ############################################################################ @@ -1113,6 +1161,22 @@ def apply_non_cash_event( self._apply_non_cash_schedule_entry(entry, payload) return Global.latest_timestamp + @arc4.abimethod + def append_observed_cash_event( + self, + *, + payload: typ.ObservedCashEventRequest, + ) -> UInt64: + """Append an arranger-authorized observed cash event to the schedule tail.""" + self._assert_configured() + self._assert_caller_is_arranger() + self._assert_is_not_asset_defaulted() + self._assert_is_not_asset_suspended() + self._assert_initial_exchange_executed() + + self._append_observed_cash_event(payload) + return Global.latest_timestamp + @arc4.abimethod(readonly=True) def contract_get_state(self) -> typ.KernelState: """Return a readonly snapshot of the generic ACTUS kernel state.""" diff --git a/src/__init__.py b/src/__init__.py index a1775a45..665ed20d 100644 --- a/src/__init__.py +++ b/src/__init__.py @@ -5,6 +5,7 @@ InitialKernelState, NormalizationResult, NormalizedActusTerms, + ObservedCashEventRequest, ObservedEventRequest, ) from .normalization import normalize_contract_attributes @@ -18,6 +19,7 @@ "InitialKernelState", "NormalizationResult", "NormalizedActusTerms", + "ObservedCashEventRequest", "ObservedEventRequest", "UnsupportedActusFeatureError", "normalize_contract_attributes", From 9690ef18b78d391a35e3d95be988423503fcf363 Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 00:09:56 +0100 Subject: [PATCH 153/244] chore: build artifacts --- .../artifacts/d_asa/DASA.approval.puya.map | 16343 ++++++++++------ .../artifacts/d_asa/DASA.approval.teal | 1794 +- .../artifacts/d_asa/DASA.arc56.json | 751 +- .../artifacts/d_asa/dasa_client.py | 111 +- 4 files changed, 11442 insertions(+), 7557 deletions(-) diff --git a/smart_contracts/artifacts/d_asa/DASA.approval.puya.map b/smart_contracts/artifacts/d_asa/DASA.approval.puya.map index 856b0992..dc64620b 100644 --- a/smart_contracts/artifacts/d_asa/DASA.approval.puya.map +++ b/smart_contracts/artifacts/d_asa/DASA.approval.puya.map @@ -8,7 +8,7 @@ "../../../modules/transfer_agent.py", "../../d_asa/contract.py" ], - "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AG4BmD;;AAAf;;AAA5B;AAC4C;;AAAf;;AAA7B;AAkBA;;AAAuB;AAAvB;AACA;;AAAuB;AAAvB;AFQA;AAAc;AAAd;AACA;;AAAqB;AAArB;AAGA;;AAAuB;;AAAvB;AACA;;AAAsB;;AAAtB;AAGA;;AAA6B;AAA7B;AACA;;AAA2B;AAA3B;AAGA;;AAA6B;AAA7B;AACA;;AAAqB;AAArB;AACA;;AAA6B;AAA7B;AACA;;AAA6B;AAA7B;AAGA;;AAA4B;AAA5B;AAGA;;AAAmB;AAAnB;AACA;;AAA4B;AAA5B;AAGA;;AAA+B;AAA/B;AACA;AAA6B;AAA7B;AACA;;AAAiC;AAAjC;AACA;;AAAoC;AAApC;AAGA;;AAAiC;AAAjC;AACA;;AAAwB;AAAxB;AAGA;;AAA6B;AAA7B;AACA;;AAAyB;AAAzB;AACA;;AAA6B;AAA7B;AACA;;AAAwB;AAAxB;AACA;;AAAsB;AAAtB;AACA;;AAAuB;AAAvB;AACA;;AAA4B;AAA5B;AACA;;AAA0B;AAA1B;AAGA;;AAA0B;AAA1B;AACA;;AAAyB;AAAzB;AAGA;;AAAiC;AAAjC;AACA;;AAAkC;AAAlC;AAQA;AAAoB;AAApB;AACA;;AAA4B;AAA5B;AAGA;;AAAyB;AAAzB;AIhGO;;AAA6B;;AAA7B;AAAP;AACO;;AAAuB;;AAAvB;AAAP;AACO;;AAAA;AAAP;AACO;;AAAA;AAAP;AAlBR;;;;;;AAAA;;;AAAA;;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;;;;;;AAAA;;;AAAA;;;;AAAA;AF4IK;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;;;;;;;ADtGA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ADiGU;AAAA;AAAA;AAAA;AAAP;AC7FA;;;AACA;;;AACA;;;ADmFO;AAAA;AAAA;AAAA;AAAe;;AAAf;AAYA;AAAP;AC5FmB;AACD;;AAId;;AAAA;;AAAA;AAAA;;;AACI;AAAA;AAAA;AAAA;AAAoB;AAAA;;AAAA;AAAA;AAApB;AADJ;;;AAGiC;AAAA;AAAA;AAAA;AAAzB;;;AAAA;AAAA;;AACL;;AAAA;AAAA;AAAA;;AAAuB;;AAAvB;AAAf;;;AAEuC;;AAAA;AAAA;AAAA;AAAA;;AD6R3B;AADG;AAAA;AAAA;;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;;AC5RA;;;ADkeA;;AAAA;AAAA;AAAkB;AAAA;AAAA;AAAA;AAAlB;AAAP;AACO;;AAAwB;;AAAxB;AAAP;AAxIG;;AAAA;;;AAAA;;AAAyC;;AAAzC;AAAA;;;AACQ;;;AAYE;;AAAA;AAAA;AAAA;AAAA;;AACS;;AAAnB;AAAA;;;AAAA;;AAAyC;;AAAzC;AAAA;;;AACQ;;;AA6HkB;;AAAA;;AAAA;AAAA;;AAG1B;;;AAAX;;;;;;;AAkB+B;;AAAA;;;AACC;;AAAA;;;AACN;;AAAA;;;AAAA;AAAA;;AAAA;;AACC;AAAA;;;AAAA;AAAA;;AACD;;AAAA;;AAAA;AAAA;AAAA;;AAqJyB;;AAAjC;AAAA;;AAAA;AAAA;AAAA;;AAAA;AA/QH;AAAA;;AAAA;AAAA;AAAyB;AAAA;;AAAA;AAAA;AAAzB;;AAAA;AAiRA;;AAAA;;AAAA;AAAP;AACO;;AAAA;AAAA;AAtJH;;AAAA;AADJ;AAIA;;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AACG;;AAAA;AAAA;AAAgC;;AAAhC;AAAX;;;AAEY;AAAA;;AAAA;AAAA;AAAyB;;AAAA;;;AAAA;;AAAzB;AAAA;;AAAA;AAAA;AAGG;;;AAAJ;;;AAAkC;;AAAA;AAAA;AAAgC;;AAAhC;AAAlC;;;AAGkC;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;AACJ;AAAA;;AAAA;AACA;;AAAA;;AAAA;AACA;AAAA;AAAA;AAAA;AAAqB;AAArB;AAAA;AAAA;AAAA;AAEG;;AAAA;;;AAAoB;;;AAApB;AAAA;;;AAEG;AAAA;AAAA;AAAA;AAFH;;;AAGC;AAAc;;;AAAd;AACA;;AAAiC;AAAjC;AAEJ;;AAAA;;AAAA;AAAA;;;AAAA;ACxhBI;;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;;AACA;;AAAoB;AAApB;AAAA;;;;;ADugBA;;AAAwB;AAAxB;;;;AAlCa;;AAAA;AAAA;AAAA;AAAA;;AAGI;;AAAd;AAAf;;;AAEoB;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;;;;;;AAGH;;AAAc;AAAd;AAAjB;;;AAC6C;AAAA;AAAA;AAAA;AAAA;;AAAA;AACR;AAAA;;AAAA;AAAA;AAAA;;AAAA;;;;AACpB;;AAAc;;AAAd;AAAjB;;;;;;;AAAA;;;AAC6C;AAA7B;;AACqB;AAArB;;;;;AA7IL;;;AAAX;;;AACe;;AAAc;;AAAd;AAAf;;;AACuB;AAAA;AAAA;AAAA;;;AAyHQ;;;AAxHJ;AAAA;;AAAA;AAAA;AAAwB;;AAAA;;;AAAA;;AAAxB;AAAA;AAAA;;AACZ;AAAA;;AAAA;AAAA;AAAA;AAAf;;;AACuB;;;AAsHQ;;;AArHA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AACG;AAAA;AAAA;AAAA;AAAnB;AAAf;;;AACuB;AAAA;AAAA;AAAA;;;AAmHQ;;;;;;;AAAA;;;AAhHnB;;AAAA;;AAAA;AAAoC;AAAA;AAAA;AAAA;AAApC;AAAA;AADJ;AAGO;AAAA;;;AA8GgB;;;AAzIhB;AAAA;;AAAA;AAAA;AAAwB;;AAAA;;;AAAA;;AAAxB;;;AAwIe;;;AC7dtB;;AAAA;AAAA;AAIiB;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAEH;;AALP;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AA7BV;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;;;AAqCA;;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AD4DU;AAAA;AAAA;AAAA;AAAP;ADvH0B;;AAAnB;AAAA;AAAA;AAAA;AAAA;;AAAP;AEVG;AAAA;;AAAA;AAAA;AAAwB;;AAAxB;AAAX;;;AAEgB;;AAAc;AAAA;;AAAA;AAAA;AAAd;AAAA;;;AACG;;AAAA;;AAAA;AADH;;;AAEG;;AAAc;;AAAA;AAAA;AAAA;;;AAAd;AAFH;;;;AADJ;AA+EJ;;;AACA;;;ADwCO;AAAA;AAAA;AAAA;AAAe;;AAAf;AAYA;AAAP;ACjDA;;AAAA;AAAA;;;AACA;;;;;AFkBI;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AACE;AAAA;;AAAA;AAAA;AAAA;;AADF;;AAAA;AAAA;AAAA;;AEhBJ;AA7EI;;;AACI;AAAA;;AAAA;AAAA;AADJ;;AAAA;;AAAA;;;AAGQ;AAAA;AAAA;AAAA;;;AAAA;AAAJ;;;;AA+EhB;;;AAzE6C;;AAAjC;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AADJ;AA4Ec;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AArEd;AAIQ;;;;;;;;;;;;;AAJR;;;;;;AAAA;AFuFkB;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AACC;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAGW;AAA9B;AAAA;AAAA;;AAAA;;AACA;AAAA;;AACA;;AAAA;AAAA;AAEO;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACO;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAP;AAGA;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AEzBiB;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AACH;;AAJP;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;;;;AAAA;AAAA;AAAA;AA5BV;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;;;AE7DA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIG;;;AACO;AAAA;AAAP;AAEA;;AAAA;;AAAA;AACA;;AAAA;AAAA;AACO;;AATV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AH8GU;AAAA;AAAA;AAAA;AAAP;AExE4B;;AAAqB;;AAA1C;;;AAAP;AC5BA;;;AACA;;;AH2FO;AAAA;AAAA;AAAA;AAAe;;AAAf;AG1FP;AJrB0B;;AAAnB;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAP;AIuBA;AAAA;;;AACA;AAAA;AAEI;AAAA;;AAAA;AAAA;AAAA;AAAqC;AAAA;;AAAA;AAAA;AAArC;AADJ;AAGG;AAAA;;AAAA;AAAA;AAAX;;;AAEgB;;AAA2B;AAAA;;AAAA;AAAA;AAA3B;AADJ;AJ+FJ;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AI1FA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AACO;AAAA;;AAAA;AAAA;AAAA;AAAA;AA1BV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AA4BA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AHkFU;AAAA;AAAA;AAAA;AAAP;AGpEA;;;AACA;;;AH2DO;AAAA;AAAA;AAAA;AAAe;;AAAf;AAYA;AAAP;AGtIG;AAAA;;AAAA;AAAA;AAAX;;;AAEgB;AAAA;;AAAA;AAAA;AAA8B;;AAA9B;AADJ;AAGD;AAAA;;AAAA;AAAA;AAAX;;;AAEgB;;AAA0B;AAAA;;AAAA;AAAA;AAA1B;AADJ;AA8DG;;AAAA;;AAAA;AAAA;;AAAA;AAAP;AJxD0B;;AAAnB;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAP;AAA0B;;AAAnB;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAP;AI2DA;;AAAA;;;AACA;AAAA;;;AACO;;AAAA;AAAP;AACA;;AAAA;AAAA;AACgB;AAAA;AAAA;AAAA;AAAA;AAAT;AAAP;AH6pBG;AAAA;AAAA;AAAA;AAAqB;AAAA;;AAAA;AAAA;AAArB;AAAX;;;AAE8C;AAAA;AAAA;AAAA;AAAzB;;;AAET;;AAAA;AAA4B;;AAA5B;AADJ;AG7pBA;;AAAA;AAAA;;;AACA;;AAAA;AAAA;;AAAA;;;AACA;;;;;AACA;;;;;AJ2DgB;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAT;;AAAA;AAAA;;AAAA;;AAAA;AAAP;AACA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AATA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AInFH;AAAA;;AAAA;AAAA;AAAA;AAAA;AJwGA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AGxF+B;;AAAgB;;AAArC;;;AAAP;AHrD0B;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAiKA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AACO;;AArBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AGxH+B;;AAAsB;;AAA3C;;;AAAP;AFuEO;AAAA;AAAA;AAAA;AAAe;;;AAAf;ADuEA;AAAP;AACA;;;AACA;;;AAC8B;;AAAvB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AAnLU;AAFH;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAsLP;AACO;;AA3BV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA6BA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAjM6B;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAsNO;;AAAA;;AAAA;AAAP;AACA;;;AACA;;;AACA;AAAA;;AAAA;AACO;;AAzBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA5N6B;;AAAnB;AAAA;AAAA;AAAA;AAAA;;AAAP;AA2OO;AAAA;AAfV;AAAA;AAAA;AAAA;AAAA;AAAA;ACqtBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAWG;;AAAA;AAAA;AACO;;AAZV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;AAcA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AA6BG;;;AAGqB;AAAA;AAAA;AAArB;;AAAA;;AAAA;AA7xBO;;;AAAA;AAEH;AAFG;AAAA;;;AAAA;AAGH;;AAHG;AAAA;;;AAAA;AAIH;;AAJG;AAAA;;;AAAA;AAKH;;AALG;AAAA;;;AAAA;AAMH;;AANG;AAAA;;;;AAWP;AAoxB4B;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAprBrB;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAP;AAEI;;AAAA;AAAA;AAAA;;AA9BG;;;AAAA;;AAEH;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;;AAYP;AAoBG;AAAiB;AAAjB;AAAX;;;AACuB;;AAAA;;;AAAA;AAAJ;AAAP;AAsdG;AAAA;AAAA;AAAA;AAAA;AAAP;AACO;AAAA;;AAAA;AAAA;AAAA;AAAP;AAGgC;;AAAA;AAAA;AAAA;AAnCb;AAAA;;AAAA;;AACnB;AAGA;;AAAA;;AAAA;AAmC8B;;AAAA;;AAAA;AA9B1B;AAAA;;AAAA;AADJ;AAKA;;AAAA;;AAAA;AAEA;AAIQ;;AAFW;;AACF;;;;;;;;AAHjB;;;;;;AAAA;AA4BmB;AAAA;;AAAA;AAAnB;;AAAA;AAAA;AACA;;AAA4B;AAA5B;AAGA;;AAAA;;AAAA;AAG6B;AAAA;;AAAA;AAA7B;;AAAA;;AAAA;AACqB;;AAAA;;AAAA;AAArB;;AAAA;;AAAA;AACiC;;AAAA;AAAA;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;AAGA;;AAAA;;AAAA;AACoC;;AAAA;;;AAAA;AAApC;;AAAA;AAAA;AAC6B;;AAAA;;AAAA;AAA7B;AAAA;AAAA;AAGwB;;AAAA;;AAAA;AAAxB;;AAAA;AAAA;AAG6B;;AAAA;AAAA;AAA7B;;AAAA;AAAA;AACiC;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;AACyB;;AAAA;;AAAA;AAAzB;;AAAA;AAAA;AAC6B;;AAAA;;AAAA;AAA7B;;AAAA;AAAA;AACwB;;AAAA;;AAAA;AAAxB;;AAAA;AAAA;AACsB;;AAAA;;AAAA;AAAtB;;AAAA;AAAA;AACuB;;AAAA;;AAAA;AAAvB;;AAAA;AAAA;AAC4B;;AAAA;;;AAAA;AAA5B;;AAAA;AAAA;AAC0B;;AAAA;;;AAAA;AAA1B;;AAAA;AAAA;AAGyB;;AAAA;;AAAA;AAAzB;;AAAA;AAAA;AAGoB;;AAAA;AAAA;AAApB;AAAA;AAAA;AAGiC;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;AACkC;;AAAA;;AAAA;AAAlC;;AAAA;AAAA;AAGA;;AAAyB;AAAzB;AACA;;AAA0B;AAA1B;AAEO;;AAA8B;;AAA9B;AAAP;AACqC;AAAA;AAAA;AAA9B;;AAAA;AAAP;AACO;AAAP;AAkKuB;;AAAA;;;AAAvB;;AAAA;AAAA;AACsB;;AAAA;;;AAAtB;;AAAA;AAAA;AACO;;AAvCV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;;;;;;;;AAyCA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAeG;;;AAGkB;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAxKX;AAAA;AAAA;AAAA;AAAA;AAAP;AACO;AAAwB;;AAAxB;AAAP;AAGO;AAAA;;AAAA;AAAA;AAAP;AAEc;AAAsB;;AAAtB;AAAA;AAOU;;AAAd;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGF;AAAR;;AACM;;AAAA;;AAAA;AAAd;;;AACoB;;AAAA;;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AACW;AADX;AACW;AAAA;AAAA;;AAAA;;AACZ;AAAA;AAAA;AAAA;AAAA;;AAAkB;;AAAA;;AAAA;AAAlB;;AAAA;AAAP;AACA;;AAAA;;AAAA;;;AAGO;AAAA;;AAAA;AAAA;AAAA;;AAAP;AACZ;;;AACA;;AAAA;;;AACmD;;AAAQ;AAAR;AAAd;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAejB;;AAAA;AAAA;;AAAA;AADJ;AAGhB;;AAAA;;;AACuB;;AAAoB;AAApB;AAAP;AAGJ;;AAAS;AAAT;AAAA;;;;;AAjBQ;;AAAA;AAAA;AAC4C;AAAtB;AAElB;AAAuB;;AAAvB;AAAA;AAAA;AAAA;AAAA;;AADJ;AAGgB;AAAA;AAAA;;AAAA;AAAA;AAChB;AAAA;AAE2B;AAAvB;AADa;;AAAA;AAAA;;AAAA;AAAA;;AAAA;;;;AAxsBV;;AAAA;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAqtBR;;AAAA;;;AAEgB;;AAAA;;AAAA;AADJ;;AAAA;AAAA;AAGA;AAAc;;AAAd;AAsHG;;AAvBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAj3BU;AAAA;AAAA;AAAA;AAAP;AAk5BA;;;AACA;;;AACA;;;AAEO;AAAA;AAAA;AAAA;AAAoB;AAAA;;AAAA;AAAA;AAApB;;AAAA;AAAP;AACQ;;;AACD;AAAA;;;AAAA;AAAoB;;;AAApB;AAAP;AAIiB;;AAAA;;;AAEM;;AAAA;;;AACA;;AAAA;;;AACW;;AAAA;;;AAEC;;AAAA;;;AACD;;AAAA;;;AACC;;AAAA;;;AACrB;;AAAA;;;AAVV;;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAMkB;AANlB;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAFJ;;;AAAA;;AAeO;;AA9BV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;AAgCA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AA16BU;AAAA;AAAA;AAAA;AAAP;AAw7BA;;;AACA;;;AAEG;;AAAA;AAAA;AAAgB;;AAAhB;AAAX;;;AAj2Be;AAAA;;AAAA;AAAA;AAAsB;;AAAtB;AAk2BH;AACA;;;AAn2BG;AAAA;;AAAA;AAAA;AAAA;AAAsB;;AAAtB;AAisBP;AACO;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAoB;AAAA;;AAAA;AAAA;AAApB;AAAP;AAEwB;AAAA;;;AAAA;;AAAA;AAAA;AADxB;;;AAIuC;AAAA;;AAAA;AAAA;AAlvBpB;;AAAZ;AAmvBA;;;;AAAA;;AACJ;AAAc;;AAAd;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAX;;;AACmB;;AAAA;AAAA;AAAA;;AAAA;AACJ;;AAAA;AAAA;AAAA;AAAA;AAAc;;AAAd;AAAP;AAKuB;;AAAA;AAAA;;;AACA;;AAAA;;;AACW;;AAAA;;;AACC;;AAAA;;;AACD;;AAAA;;;AACC;;AAAA;;;AAR/B;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AADJ;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAaA;;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAA6B;AAA7B;AAAA;;AAAA;AAAA;AA4ImB;AAAA;AAAA;AAAA;AAAZ;;AAAA;AAAA;;AAAA;AAAP;AACQ;;;AAAA;AAAA;;AAEJ;AAAA;;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAtuBA;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;AAAA;;AAMH;;AANG;AAAA;;;;AAsuBP;AAGO;;AAAoB;;;AAApB;AAAP;AA9tBO;;AAAe;;AAAf;AAAA;;;AAAA;;AAAqC;;AAArC;AAAA;;;;AA+tBf;;;AErgCoC;;AAAe;;AAApC;;;AAAP;AFygCA;;AAAA;;AAAA;;;AAAA;;AACO;;AAjCV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA+BO;;;;;;;;;;;;;;AAz8BG;AAAA;AAAA;AAAA;AAAP;AAAA;AAk9B6B;AAAA;;AAAA;AAAA;AAAX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAEF;AAAA;;AAAA;AAAA;AACS;AAAA;;AAAA;AAAA;AACG;AAAA;;AAAA;AAAA;AACX;AAAA;AAAA;AAAA;AACQ;AAAA;;AAAA;AAAA;AACC;AAAA;AAAA;AAAA;AACI;AAAA;;AAAA;AAAA;AACJ;AAAA;;AAAA;AAAA;AACL;AAAA;;AAAA;AAAA;AACS;AAAA;;AAAA;AAAA;AACC;AAAA;;AAAA;AAAA;AACT;AAAA;;AAAA;AAAA;AACC;AAAA;;AAAA;AAAA;AAfhB;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAJV;AAAA;AAAA;AAAA;AAAA;AAAA;AA78BU;AAAA;AAAA;AAAA;AAAP;AAu+BG;AAAA;AAAA;AAAA;AAAqB;AAAA;;AAAA;AAAA;AAArB;AAAX;;;AAEyB;AAAA;AAAA;AAAA;AADN;AAEQ;;AAFR;AAGY;AAHZ;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AALd;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBmC;AAAA;AAAA;AAAA;AAAzB;;;AAhBV;;;AEt9BG;;;AARH;AAAA;AAUA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAWG;;;AACA;;AAAA;AAAA;AACO;;AAbV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAeA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAWG;;;AACA;;AAAA;AAAA;AACO;;AAbV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAeA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAsBG;;;AACA;;;AACwB;AAAA;;AAAxB;;;AA9Gc;;AAAX;AAAX;;;AACY;;AAAA;;AAAA;AA+GG;;AA1BV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAlFM;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAyGJ;;;AAvGG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAqGJ;;;AAnGG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAiGJ;;;AA/FG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AA6FJ;;;AA3FG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;;;;AA4FP;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAmBG;;;AACA;;;AACwB;AAAA;;AAAxB;;;AA9GO;AAAW;;AAAX;AAAP;AACc;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AA6GG;;AAvBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AApFM;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAwGJ;;;AAtGG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAoGJ;;;AAlGG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAgGJ;;;AA9FG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;;;;AA+FP;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AApK+B;;AAAgB;;AAArC;;;AAAP;AAoLA;;AAAA;AAAA;AACO;;AAjBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BU;AAAA;;AAAA;AAAA;AARV;AAAA;AAAA;AAAA;AAAA;AAAA;AAUA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAc4B;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AAlBP;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAcU;AACP;AAAA;;;AAES;;;;;;;;AADT;;AAAA;;;;;;;;;;;;;;AA+BQ;AAJI;;AAvRL;;AAAA;AAAA;AAAA;AAAA;;AAsRC;AAGO;AAAA;AA7ClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAsCe;;AAlRL;;AAAA;AAAA;AAAA;AAAA;;AAiRC;AAGO;AAAA;AAxClB;;;AAiCe;;AA7QL;;AAAA;AAAA;AAAA;AAAA;;AA4QC;AAGO;AAAA;AAnClB;;;AA4Be;;AAxQL;;AAAA;AAAA;AAAA;AAAA;;AAuQC;AAGO;AAAA;AA9BlB;;;AAuBe;;AAnQL;;AAAA;AAAA;AAAA;AAAA;;AAkQC;AAGO;AAAA;AAzBlB;;;AAkBkB;;;;;;;;;;;;;;;;;;AAlBlB;;;AHzQD;;;AAEe;;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAJ;AAAP;;AAgBJ;;;AApB8B;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAqCW;AAAA;AAAA;AAIM;AAAA;;AAAA;AAAA;AAAiC;;AAAA;;AAAA;AAAjC;AAEb;AAAA;;AAAA;AAAA;AAAkC;;AAAA;;AAAA;AAAlC;AAMgB;;AAAA;AAAA;AAAgB;AAAA;;AAAA;AAAA;AADf;;AAAA;;AAAA;;AAAA;;;AAIgB;AAAA;;AAAA;AAAA;AADf;;AAAA;;AAAA;;AAAA;;;AAMtB;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAI+B;AAAA;;AAAA;AAAA;AAA/B;AAAA;;AACgC;AAAA;;AAAA;AAAA;AAAhC;AAAA;;AAG0B;AAAA;AAAA;AAAA;AAA1B;AAAA;;AAIA;;AAAA;AAAA;AACA;AAEJ;;;;;;AAzE8B;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AC+GO;AAAA;AAAA;AAAA;AAAe;;AAAf;ADnCf;;;AACY;AAEO;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AACR;;AAAA;AAAA;AAAA;;AAAX;;;AACY;AAGJ;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAC0B;AAA1B;AAAA;;AACA;;AAAA;AAAA;AACO;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;AAAA;AAAA;;AAAA;AAAA;;ACyCJ;;;AAIO;;AAAA;;;AAAA;;AAAA;;;AACQ;AAAP;AACQ;;AAAA;;AAAA;AACL;;AAAA;AAAP;AAEJ;;;AAEJ;;AAAA;;;AACmB;AAAP;AACG;AAAA;;AAAA;AAAA;AAAP;AAAA;AACoC;AAAA;;AAAA;AAAA;AAA7B;;AAAA;AAAA;;AAAA;;;AAAP;AAEJ;;;AAOJ;;AAAA;;;AACmB;AAAP;AAEA;AAAA;;AAAA;AAAA;AAEA;AAAA;;AAAA;AAAA;AAHG;;AAAA;AAAA;;;AAAP;AAwBJ;;;AAEsB;AAAA;;AAAA;AAAA;AAAX;;AAAA;AAAP;AAdO;;AAAY;;AAAZ;AAgBA;AAAc;;AAAd;AAAA;AAAA;AAAA;AAAA;;AAAP;AAZO;;AAAW;;AAAX;AAeS;;AAAA;AAAA;;AAAA;AAAA;AAAT;;AAAA;AAAP;AACO;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAP;AAuGJ;;;AA1DO;;AARC;AAQD;AAAA;;;AAAA;;AAPC;AAOD;AAAA;;;AAAA;;AANC;;AAMD;AAAA;;;AAAA;;AALC;;AAKD;AAAA;;;AAAA;;AAJC;;AAID;AAAA;;;AACQ;AA6DX;;AA1DR;;AAAA;;;AAEmB;AAwDJ;;;AAtDJ;;AAAiB;;AAAjB;AAAA;;;AAAyC;;AAAiB;;AAAjB;AAAzC;;;AAIQ;;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;;AAkDJ;;;;AAAA;;;AA7CJ;;AAAiB;AAAjB;AAAX;;;AAEmB;;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;;AA2CJ;;;;AAAA;;;AArCJ;;AAAiB;;AAAjB;AAAX;;;AAEmB;;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;;AAmCJ;;;;AAAA;;;AA5BJ;;AAAiB;;AAAjB;AAAX;;;AAEmB;;AAAc;;AAAd;AA0BJ;;;AAxBA;AAwBA;;;AAkBH;AAAA;;AAAA;AAAA;AAAsB;AAAtB;AAAA;;;AACI;AAAA;;AAAA;AAAA;AADJ;;;;AADJ;;AAAA;AA8CJ;;;AASQ;;AAAA;;AAAA;AAAA;AAAA;;;AACG;AAAA;;AAAA;AAAA;AADH;;;AAEG;AAAA;;AAAA;AAAA;AAFH;;;AAIO;AAAP;;AAAA;;AAAA;AAEA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAHM;;;AAQN;AAAA;;AAAA;AAAA;AAHG;;AAAA;AAAA;;;AAAP;;AAAA;;AAAA;AA+DJ;;;AAMJ;;AAAA;;;AACY;;AAAA;AACU;AAAA;;AAAA;AAAA;AACV;AAAA;;AAAA;AAAA;AADmC;;AAAA;;AAAA;;;AAAzB;AAKd;AAAA;AAGI;AAAA;;AAAA;AAAA;AAFG;;AAAA;AAAA;;AAAA;;;AAAP;AAyIJ;;;;;;;;AAUW;;AAAA;AAAA;AAAkB;AAAA;AAAA;AAAA;AAAlB;AAAP;AACO;;AAAA;;AAAA;AAAwB;;AAAxB;AAAP;AAEa;;AAAA;AAAA;AAAA;AACI;AAAd;AAAA;AAAX;;;AA5ee;AAAA;AAAA;AAAA;AAAe;;AAAf;AA+eH;AAEI;AAAA;;AAAA;AAAA;AAA6B;AAAA;;AAAA;AAAA;AAA7B;AADJ;AAG6B;;AAAA;;AAAA;AAA7B;AAAA;;AAAA;AACA;;AAAA;AAAA;AAC6B;;AAAA;;AAAA;AAA7B;;AAAA;AAAA;AACA;;AAAwB;AAAxB;AACiC;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAqB;AAArB;AAAA;AAAA;AAAA;AACA;AAAc;;AAAd;AA7LJ;;AAAA;AACO;AAAA;;AAAA;AAAA;AA6LH;;AAAA;AAGmB;AAHnB;;;;AAAA;;AAKA;;AAAA;;AAAA;;AAAA;AA/fG;AAAA;AAAA;AAAA;AAAe;;AAAf;AAYA;AAAP;AAsfA;AAAA;;AAAA;AAAA;AAAyB;;AAAA;;;AAAA;;AAAzB;AAAA;;AAAA;AAAA;AAEG;;AAAc;;AAAd;AAAX;;;AAIgB;;AAAA;;AAAA;AACA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAHY;;;AAMI;AAAA;;AAAA;AAAA;AAAhB;AAAA;;AA0EL;AAAA;;AAAA;AAAA;AAAA;;;AAAqC;AAAA;;AAAA;AAAA;AAAP;;AAAA;AAA9B;;;AACQ;AAAA;;AAAA;AAAA;AAAA;;AAAA;AACR;AAAA;;AAAA;AAAA;AAAA;;;AAAmC;AAAA;;AAAA;AAAA;AAAP;;AAAA;AAA5B;;;AACQ;AAAA;;AAAA;AAAA;AAAA;;AAAA;AA9EP;;AAAA;;AAAA;AAYD;;AAAc;;AAAd;AAAX;;;AACyC;;AAAA;;AAAA;AAA7B;AAAA;;AAAA;AACA;;AAAA;AAAA;AAKD;;;AAAX;;;AACe;;AAAc;;AAAd;AAAf;;;AA7L0B;AAAA;;AAAA;AAAA;AAAA;;AAAA;AACJ;AAAd;;AACwB;AAAxB;;AAEG;;AAAA;;AAAA;AAAA;AAAA;;AAAX;;;AAE8B;;AAAA;;AAAA;;;AAAA;AAAA;;AAKM;AAAxB;;;;AAEc;AAAA;AAAA;AAAA;AAAoB;AAApB;AAAA;;AACM;AAAA;;AAAA;AAAA;AAAlB;;AAAA;AAAd;;;AAC2B;;AAAA;;;AAAA;AAAA;;AACK;AAAA;AAAA;AAAA;;AAEuB;;AAArB;AAAA;;;AAClB;;AAAqB;;AAArB;AAAA;;;AACI;;AAAA;;AAAA;AADJ;;;;AAGhB;;;AACA;;AAAA;;;AAC4C;AAAxB;;AAOR;;AAAmB;AAAnB;AAAA;;;;;AAHY;;AAAA;;AAAA;AAFc;;AAAA;AAAA;;;AAAA;AAAA;;AAIlB;;AAAA;AAAA;;;;;;;;;AAGZ;;AAAA;AACY;AAAA;AAAA;AAAA;AACT;;AAAA;;AAAA;AAAc;AAAd;AAAX;;;AAEyB;AAAA;;AAAA;AAAA;AAAb;AAGA;AAAA;;AAAA;AAAA;AAFG;;AAAA;;;AAwJC;;AAAA;AAAA;AAKR;AAAA;AAAA;AAAA;AAAqB;AAArB;AAAA;AAAA;AAAA;AACA;;AAEW;AACQ;AAHnB;;;;AAAA;;;;;;;;;AAFqC;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;;;;AAVC;;AAAc;;AAAd;AAAb;;;AAE6C;AAAA;AAAA;AAAA;AAAjC;;AAAA;AAAA;;;;AAdC;;AAAc;;AAAd;AAAb;;;AACwB;;AAAA;;AAAA;AAAA;AAAA;;AACxB;;;AAC4B;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAChB;;AAAA;;AAAA;;;;AAEG;;AAAA;;AAAA;AAAA;AAAA;;AAAf;;;AACgB;;AAAA;;AAAA;;;;AA2BZ;;;AAUwB;;AACH;;AAAA;AAAA;AACE;;AAAA;;;AACI;;AAAA;;;AACJ;;AAGW;;AALX;AAKW;AA6BtC;;AAAA;;;AACmB;AA/BS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAIA;AAAA;;AAAA;AAAA;AACH;;AAAA;AAAiB;AAAjB;AAZb;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AADJ;;;;;;AAAA;AAAA;AAAA;;;;;;AAwCG;;AAAe;AAAf;AAAA;;;AAAA;;AAAsC;;AAAtC;AAAA;;;AACQ;AAhCC;;;AAiCL;;;AAjCK;;;AEhpBhB;;;;;AAFW;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAGA;;;AACH;;AAAA;AAAA;AAAA;AAAA;AACG;;AAAA;AAAA;;AADH;AAAA;;;AAEG;;AAAA;AAAA;AAAA;AAAA;AADA;;AAAA;AADH;;;;AADJ;;AAAA;;;;;AAOyB;;AAbF;AAAA;;AAAA;AAAA;AAAhB;AAaP;;AAkBW;AAAA;;AAAA;AAAA;AAAJ;AAAP;;AAGW;AAAA;;AAAA;AAAA;AAAJ;AAAP;;AAEJ;;;AACW;;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;AAAA;;AAMH;;AANG;AAAA;;;AAAA;;AAOH;;AAPG;AAAA;;;;AAAP;;;", + "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AG4BmD;;AAAf;;AAA5B;AAC4C;;AAAf;;AAA7B;AAkBA;;AAAuB;AAAvB;AACA;;AAAuB;AAAvB;AFQA;AAAc;AAAd;AACA;;AAAqB;AAArB;AAGA;;AAAuB;;AAAvB;AACA;;AAAsB;;AAAtB;AAGA;;AAA6B;AAA7B;AACA;;AAA2B;AAA3B;AAGA;;AAA6B;AAA7B;AACA;;AAAqB;AAArB;AACA;;AAA6B;AAA7B;AACA;;AAA6B;AAA7B;AAGA;;AAA4B;AAA5B;AAGA;;AAAmB;AAAnB;AACA;;AAA4B;AAA5B;AAGA;;AAA+B;AAA/B;AACA;;AAA6B;AAA7B;AACA;;AAAiC;AAAjC;AACA;;AAAoC;AAApC;AAGA;;AAAiC;AAAjC;AACA;;AAAwB;AAAxB;AAGA;;AAA6B;AAA7B;AACA;;AAAyB;AAAzB;AACA;;AAA6B;AAA7B;AACA;;AAAwB;AAAxB;AACA;;AAAsB;AAAtB;AACA;;AAAuB;AAAvB;AACA;;AAA4B;AAA5B;AACA;;AAA0B;AAA1B;AAGA;;AAA0B;AAA1B;AACA;;AAAyB;AAAzB;AAGA;;AAAiC;AAAjC;AACA;;AAAkC;AAAlC;AAQA;AAAoB;AAApB;AACA;AAA4B;AAA5B;AAGA;;AAAyB;AAAzB;AIhGO;;AAA6B;;AAA7B;AAAP;AACO;;AAAuB;;AAAvB;AAAP;AACO;;AAAA;AAAP;AACO;;AAAA;AAAP;AAlBR;;;;;;AAAA;;;AAAA;;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;;;;;;AAAA;;;AAAA;;;;AAAA;AF4IK;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ADrGA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ADgGU;AAAA;AAAA;AAAA;AAAP;AC5FA;;;AACA;;;AACA;;;ADkFO;AAAA;AAAA;AAAA;AAAe;;AAAf;AAYA;AAAP;AC5FG;;;AAAX;;;AAIsB;AACA;;AADA;AADF;;AAAA;AAFR;AAAA;;;AAQe;AAAnB;;AACkB;AAAlB;;AACmB;AAAnB;;AAGI;;AAAA;;AAAA;AAAA;;;AACI;AAAA;AAAA;AAAA;AAAoB;AAAA;AAAA;AAAA;AAApB;AADJ;;;AAGiC;AAAA;AAAA;AAAA;AAAzB;;;AAAA;AAAA;;AACL;;AAAA;AAAA;AAAA;;AAAuB;;AAAvB;AAAf;;;AAEuC;;AAAA;AAAA;AAAA;AAAA;;ADoR3B;AADG;AAAA;AAAA;;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;;ACnRA;;;ADydA;;AAAA;AAAA;AAAkB;AAAA;AAAA;AAAA;AAAlB;AAAP;AACO;;AAAwB;;AAAxB;AAAP;AAxIG;;AAAA;;;AAAA;;AAAyC;;AAAzC;AAAA;;;AACQ;;;AAYE;;AAAA;AAAA;AAAA;AAAA;;AACS;;AAAnB;AAAA;;;AAAA;;AAAyC;;AAAzC;AAAA;;;AACQ;;;AA6HkB;;AAAA;;AAAA;AAAA;;AAG1B;;;AAAX;;;;;;;AAkB+B;;AAAA;;;AACC;;AAAA;;;AACN;;AAAA;;;AAAA;AAAA;;AAAA;;AACC;AAAA;;;AAAA;AAAA;;AACD;;AAAA;;AAAA;AAAA;AAAA;;AA8JyB;;AAAjC;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAxRH;AAAA;;AAAA;AAAA;AAAyB;AAAA;;AAAA;AAAA;AAAzB;;AAAA;AA0RA;;AAAA;;AAAA;AAAP;AACO;;AAAA;AAAA;AA/JH;;AAAA;AADJ;AAIA;;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AACG;;AAAA;AAAA;AAAgC;;AAAhC;AAAX;;;AAEY;AAAA;;AAAA;AAAA;AAAyB;;AAAA;;;AAAA;;AAAzB;AAAA;;AAAA;AAAA;AAGG;;;AAAJ;;;AAAkC;;AAAA;AAAA;AAAgC;;AAAhC;AAAlC;;;AAGkC;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;AACJ;;AAAA;;AAAA;AACA;;AAAA;;AAAA;AACA;AAAA;AAAA;AAAA;AAAqB;AAArB;AAAA;AAAA;AAAA;AAEG;;AAAA;;;AAAoB;;;AAApB;AAAA;;;AAEG;AAAA;;AAAA;AAAA;AAFH;;;AAGC;AAAc;;;AAAd;AACA;;AAAiC;AAAjC;AAEJ;;AAAA;;AAAA;AAAA;;;AAAA;AC/gBI;;AAAA;;AAAA;AAAA;;AACA;;AAAA;;AAAA;AAAA;;AACA;;AAAoB;AAApB;AAAA;;;;;AD8fA;;AAAwB;AAAxB;;;;AAlCa;;AAAA;AAAA;AAAA;AAAA;;AAGI;;AAAd;AAAf;;;AAEoB;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;;;;;;AAGH;;AAAc;AAAd;AAAjB;;;AAC6C;AAAA;;AAAA;AAAA;AAAA;;AAAA;AACR;AAAA;;AAAA;AAAA;AAAA;;AAAA;;;;AACpB;;AAAc;;AAAd;AAAjB;;;;;;;AAAA;;;AAC6C;AAA7B;;AACqB;AAArB;;;;;AA7IL;;;AAAX;;;AACe;;AAAc;;AAAd;AAAf;;;AACuB;AAAA;;AAAA;AAAA;;;AAyHQ;;;AAxHJ;AAAA;;AAAA;AAAA;AAAwB;;AAAA;;;AAAA;;AAAxB;AAAA;AAAA;;AACZ;AAAA;;AAAA;AAAA;AAAA;AAAf;;;AACuB;;;AAsHQ;;;AArHA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AACG;AAAA;;AAAA;AAAA;AAAnB;AAAf;;;AACuB;AAAA;;AAAA;AAAA;;;AAmHQ;;;;;;;AAAA;;;AAhHnB;;AAAA;;AAAA;AAAoC;AAAA;;AAAA;AAAA;AAApC;AAAA;AADJ;AAGO;AAAA;;;AA8GgB;;;AAzIhB;AAAA;;AAAA;AAAA;AAAwB;;AAAA;;;AAAA;;AAAxB;;;AAwIe;;;ACpdtB;;AAAA;AAAA;AAIiB;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAEH;;AALP;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AArCV;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;;;AA6CA;;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;ADmDU;AAAA;AAAA;AAAA;AAAP;ADvH0B;;AAAnB;AAAA;AAAA;AAAA;AAAA;;AAAP;AETG;AAAA;;AAAA;AAAA;AAAwB;;AAAxB;AAAX;;;AAEgB;;AAAc;AAAA;;AAAA;AAAA;AAAd;AAAA;;;AACG;;AAAA;;AAAA;AADH;;;AAEG;;AAAc;;AAAA;AAAA;AAAA;;;AAAd;AAFH;;;;AADJ;AAuFJ;;;AACA;;;AD+BO;AAAA;AAAA;AAAA;AAAe;;AAAf;AAYA;AAAP;ACxCA;;AAAA;AAAA;;;AACA;;;;;AFSI;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AACE;AAAA;;AAAA;AAAA;AAAA;;AADF;;AAAA;AAAA;AAAA;;AEPJ;AArFI;;;AACI;AAAA;;AAAA;AAAA;AADJ;;AAAA;;AAAA;;;AAGQ;AAAA;AAAA;AAAA;;;AAAA;AAAJ;;;;AAuFhB;;;AAjF6C;;AAAjC;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AADJ;AAoFc;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AA7Ed;AAIQ;;;;;;;;;;;;;AAJR;;;;;;AAAA;AFsFkB;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AACC;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAGW;AAA9B;AAAA;AAAA;;AAAA;;AACA;AAAA;;AACA;;AAAA;AAAA;AAEO;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACO;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAP;AAGA;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AEhBiB;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AACH;;AAJP;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;;;;AAAA;AAAA;AAAA;AA5BV;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;;;AEtEA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIG;;;AACO;AAAA;AAAP;AAEA;;AAAA;;AAAA;AACA;;AAAA;AAAA;AACO;;AATV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AH8GU;AAAA;AAAA;AAAA;AAAP;AExE4B;;AAAqB;;AAA1C;;;AAAP;AC5BA;;;AACA;;;AH2FO;AAAA;AAAA;AAAA;AAAe;;AAAf;AG1FP;AJrB0B;;AAAnB;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAP;AIuBA;AAAA;;;AACA;AAAA;AAEI;AAAA;;AAAA;AAAA;AAAA;AAAqC;AAAA;;AAAA;AAAA;AAArC;AADJ;AAGG;AAAA;;AAAA;AAAA;AAAX;;;AAEgB;;AAA2B;AAAA;;AAAA;AAAA;AAA3B;AADJ;AJ+FJ;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AI1FA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AACO;AAAA;;AAAA;AAAA;AAAA;AAAA;AA1BV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AA4BA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AHkFU;AAAA;AAAA;AAAA;AAAP;AGpEA;;;AACA;;;AH2DO;AAAA;AAAA;AAAA;AAAe;;AAAf;AAYA;AAAP;AGtIG;AAAA;;AAAA;AAAA;AAAX;;;AAEgB;AAAA;;AAAA;AAAA;AAA8B;;AAA9B;AADJ;AAGD;AAAA;;AAAA;AAAA;AAAX;;;AAEgB;;AAA0B;AAAA;;AAAA;AAAA;AAA1B;AADJ;AA8DG;;AAAA;;AAAA;AAAA;;AAAA;AAAP;AJxD0B;;AAAnB;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAP;AAA0B;;AAAnB;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAP;AI2DA;;AAAA;;;AACA;AAAA;;;AACO;;AAAA;AAAP;AACA;;AAAA;AAAA;AACgB;AAAA;AAAA;AAAA;AAAA;AAAT;AAAP;AHsqBG;AAAA;AAAA;AAAA;AAAqB;AAAA;AAAA;AAAA;AAArB;AAAX;;;AAE8C;AAAA;AAAA;AAAA;AAAzB;;;AAET;;AAAA;AAA4B;;AAA5B;AADJ;AGtqBA;;AAAA;AAAA;;;AACA;;AAAA;AAAA;;AAAA;;;AACA;;;;;AACA;;;;;AJ2DgB;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAT;;AAAA;AAAA;;AAAA;;AAAA;AAAP;AACA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AATA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AInFH;AAAA;;AAAA;AAAA;AAAA;AAAA;AJwGA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AGxF+B;;AAAgB;;AAArC;;;AAAP;AHrD0B;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAiKA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AACO;;AArBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AGxH+B;;AAAsB;;AAA3C;;;AAAP;AFuEO;AAAA;AAAA;AAAA;AAAe;;;AAAf;ADuEA;AAAP;AACA;;;AACA;;;AAC8B;;AAAvB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AAnLU;AAFH;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAsLP;AACO;;AA3BV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA6BA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAjM6B;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAsNO;;AAAA;;AAAA;AAAP;AACA;;;AACA;;;AACA;AAAA;;AAAA;AACO;;AAzBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA5N6B;;AAAnB;AAAA;AAAA;AAAA;AAAA;;AAAP;AA2OO;AAAA;AAfV;AAAA;AAAA;AAAA;AAAA;AAAA;ACqwBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAWG;;AAAA;AAAA;AACO;;AAZV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;AAcA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AA6BG;;;AAGqB;AAAA;AAAA;AAArB;;AAAA;;AAAA;AA70BO;;;AAAA;AAEH;AAFG;AAAA;;;AAAA;AAGH;;AAHG;AAAA;;;AAAA;AAIH;;AAJG;AAAA;;;AAAA;AAKH;;AALG;AAAA;;;AAAA;AAMH;;AANG;AAAA;;;;AAWP;AAo0B4B;AAAA;;AAAA;AAAA;AAAA;;AAAA;AApuBrB;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAP;AAEI;;AAAA;AAAA;AAAA;;AA9BG;;;AAAA;;AAEH;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;;AAYP;AAoBG;AAAiB;AAAjB;AAAX;;;AACuB;;AAAA;;;AAAA;AAAJ;AAAP;AA+dG;AAAA;AAAA;AAAA;AAAA;AAAP;AACO;AAAA;;AAAA;AAAA;AAAA;AAAP;AAGgC;;AAAA;AAAA;AAAA;AAnCb;AAAA;;AAAA;;AACnB;AAGA;;AAAA;;AAAA;AAmC8B;;AAAA;;AAAA;AA9B1B;AAAA;;AAAA;AADJ;AAKA;;AAAA;;AAAA;AAEA;AAIQ;;AAFW;;AACF;;;;;;;;AAHjB;;;;;;AAAA;AA4BmB;AAAA;;AAAA;AAAnB;;AAAA;AAAA;AACA;;AAA4B;AAA5B;AAGA;;AAAA;;AAAA;AAG6B;AAAA;;AAAA;AAA7B;;AAAA;;AAAA;AACqB;;AAAA;;AAAA;AAArB;;AAAA;;AAAA;AACiC;;AAAA;AAAA;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;AAGA;;AAAA;;AAAA;AACoC;;AAAA;;;AAAA;AAApC;;AAAA;AAAA;AAC6B;;AAAA;;AAAA;AAA7B;;AAAA;AAAA;AAGwB;;AAAA;;AAAA;AAAxB;;AAAA;AAAA;AAG6B;;AAAA;AAAA;AAA7B;;AAAA;AAAA;AACiC;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;AACyB;;AAAA;;AAAA;AAAzB;;AAAA;AAAA;AAC6B;;AAAA;;AAAA;AAA7B;;AAAA;AAAA;AACwB;;AAAA;;AAAA;AAAxB;;AAAA;AAAA;AACsB;;AAAA;;AAAA;AAAtB;;AAAA;AAAA;AACuB;;AAAA;;AAAA;AAAvB;;AAAA;AAAA;AAC4B;;AAAA;;;AAAA;AAA5B;;AAAA;AAAA;AAC0B;;AAAA;;;AAAA;AAA1B;;AAAA;AAAA;AAGyB;;AAAA;;AAAA;AAAzB;;AAAA;AAAA;AAGoB;;AAAA;AAAA;AAApB;AAAA;AAAA;AAGiC;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;AACkC;;AAAA;;AAAA;AAAlC;;AAAA;AAAA;AAGA;;AAAyB;AAAzB;AACA;;AAA0B;AAA1B;AAEO;;AAA8B;;AAA9B;AAAP;AACqC;AAAA;AAAA;AAA9B;;AAAA;AAAP;AACO;AAAP;AAyMuB;;AAAA;;;AAAvB;;AAAA;AAAA;AACsB;;AAAA;;;AAAtB;;AAAA;AAAA;AACO;;AAvCV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;;;;;;;;AAyCA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAeG;;;AAGkB;AAAA;;AAAA;AAAA;AAAA;;AAAA;AA/MX;AAAA;AAAA;AAAA;AAAA;AAAP;AACO;AAAwB;;AAAxB;AAAP;AAGO;AAAA;;AAAA;AAAA;AAAP;AAEc;AAAsB;;AAAtB;AAAA;AAOU;;AAAd;AADF;;AAAA;AAFR;AAAA;;;AAMQ;AACF;AAAA;;AAAA;AAAd;;;AACoB;;AAAA;;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AACW;AADX;AACW;AAAA;AAAA;;AAAA;;AACZ;AAAA;AAAA;AAAA;AAAA;;AAAkB;;AAAA;;AAAA;AAAlB;;AAAA;AAAP;AACA;;AAAA;;AAAA;;;AAGO;AAAA;;AAAA;AAAA;AAAA;;AAAP;AACZ;;;AACA;AAAA;;;AACmD;AAAQ;AAAR;AAAd;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAejB;;AAAA;AAAA;;AAAA;AADJ;AAGhB;;AAAA;;;AACuB;;AAAoB;AAApB;AAAP;AAGJ;AAAS;AAAT;AAAA;;;;;AAjBQ;;AAAA;AAAA;AAC4C;AAAtB;AAElB;AAAuB;;AAAvB;AAAA;AAAA;AAAA;AAAA;;AADJ;AAGgB;AAAA;AAAA;;AAAA;AAAA;AAChB;AAAA;AAE2B;AAAvB;AADa;;AAAA;AAAA;;AAAA;AAAA;;AAAA;;;;AAjtBV;;AAAA;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AA8tBR;;AAAA;;;AAEgB;;AAAA;;AAAA;AADJ;AAAA;AAAA;AAGA;AAAc;;AAAd;AA6JG;;AAvBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAj6BU;AAAA;AAAA;AAAA;AAAP;AAk8BA;;;AACA;;;AACA;;;AAEO;AAAA;AAAA;AAAA;AAAoB;AAAA;AAAA;AAAA;AAApB;;AAAA;AAAP;AACQ;;;AACD;AAAA;;;AAAA;AAAoB;;;AAApB;AAAP;AAIiB;;AAAA;;;AAEM;;AAAA;;;AACA;;AAAA;;;AACW;;AAAA;;;AAEC;;AAAA;;;AACD;;AAAA;;;AACC;;AAAA;;;AACrB;;AAAA;;;AAVV;;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAMkB;AANlB;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAFJ;;;AAAA;;AAeO;;AA9BV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;AAgCA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AA19BU;AAAA;AAAA;AAAA;AAAP;AAw+BA;;;AACA;;;AAEG;;AAAA;AAAA;AAAgB;;AAAhB;AAAX;;;AAj5Be;AAAA;;AAAA;AAAA;AAAsB;;AAAtB;AAk5BH;AACA;;;AAn5BG;AAAA;;AAAA;AAAA;AAAA;AAAsB;;AAAtB;AA0sBP;AACO;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAoB;AAAA;AAAA;AAAA;AAApB;AAAP;AAEwB;AAAA;;;AAAA;;AAAA;AAAA;AADxB;;;AAIuC;AAAA;AAAA;AAAA;AA3vBpB;;AAAZ;AA4vBA;;AAAA;;AACJ;AAAc;;AAAd;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAX;;;AACmB;;AAAA;AAAA;AAAA;;AAAA;AACJ;;AAAA;AAAA;AAAA;AAAA;AAAc;;AAAd;AAAP;AAKuB;;AAAA;AAAA;;;AACA;;AAAA;;;AACW;;AAAA;;;AACC;;AAAA;;;AACD;;AAAA;;;AACC;;AAAA;;;AAR/B;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AADJ;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAaA;;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAA6B;AAA7B;AAAA;AAAA;AAAA;AAmLmB;AAAA;AAAA;AAAA;AAAZ;;AAAA;AAAA;;AAAA;AAAP;AACQ;;;AAAA;AAAA;;AAEJ;AAAA;;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAtxBA;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;AAAA;;AAMH;;AANG;AAAA;;;;AAsxBP;AAGO;;AAAoB;;;AAApB;AAAP;AA9wBO;;AAAe;;AAAf;AAAA;;;AAAA;;AAAqC;;AAArC;AAAA;;;;AA+wBf;;;AErjCoC;;AAAe;;AAApC;;;AAAP;AFyjCA;;AAAA;;AAAA;;;AAAA;;AACO;;AAjCV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA+BO;;;;;;;;;;;;;;;;AAIP;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AA7/BU;AAAA;AAAA;AAAA;AAAP;AAqgCA;;;AACA;;;AACA;;;AA/gCO;AAAA;AAAA;AAAA;AAAe;;AAAf;AAYA;AAAP;AAsFO;AAAA;;AAAA;AAAA;AAAsB;;AAAtB;AA4uBP;AACO;AAAA;AAAA;AAAA;AAAA;;AAAoB;AAAA;AAAA;AAAA;AAApB;AAAA;;AAAA;AAAP;AACO;;AAAA;;;AAAA;AAAA;;AAAsB;;;AAAtB;AAAP;AACO;AAAA;;AAAA;AAAA;AAAA;;AAAgB;AAAhB;AAAP;AAER;;;AACsD;AAAA;AAAA;AAAA;AAA4B;AAA5B;AAAzB;;;AAEb;;AAAA;AAAiC;;AAAA;;AAAA;AAAjC;AADJ;AAImC;AAAA;AAAA;AAAA;AAlyBpB;;AAAZ;AAmyBA;;AAAA;;AACJ;AAAc;;AAAd;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAX;;;AACmB;;AAAA;AAAA;AAAA;;AAAA;AACJ;;AAAA;AAAA;AAAA;AAAA;AAAc;;AAAd;AAAP;AAKuB;;AAAA;AAAA;;;AACA;;AAAA;;;AACW;;AAAA;;;AACC;;AAAA;;;AACD;;AAAA;;;AACC;;AAAA;;;AAR/B;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AADJ;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAaA;;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAA6B;AAA7B;AAAA;AAAA;AAAA;AAuKO;;AAdV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA7/BU;AAAA;AAAA;AAAA;AAAP;AAAA;AAkhC6B;AAAA;;AAAA;AAAA;AAAX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAEF;AAAA;;AAAA;AAAA;AACS;AAAA;;AAAA;AAAA;AACG;AAAA;;AAAA;AAAA;AACX;AAAA;AAAA;AAAA;AACQ;AAAA;AAAA;AAAA;AACC;AAAA;;AAAA;AAAA;AACI;AAAA;;AAAA;AAAA;AACJ;AAAA;;AAAA;AAAA;AACL;AAAA;;AAAA;AAAA;AACS;AAAA;;AAAA;AAAA;AACC;AAAA;;AAAA;AAAA;AACT;AAAA;;AAAA;AAAA;AACC;AAAA;;AAAA;AAAA;AAfhB;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAJV;AAAA;AAAA;AAAA;AAAA;AAAA;AA7gCU;AAAA;AAAA;AAAA;AAAP;AAuiCG;AAAA;AAAA;AAAA;AAAqB;AAAA;AAAA;AAAA;AAArB;AAAX;;;AAEyB;AAAA;AAAA;AAAA;AADN;AAEQ;;AAFR;AAGY;AAHZ;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AALd;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBmC;AAAA;AAAA;AAAA;AAAzB;;;AAhBV;;;AEthCG;;;AARH;AAAA;AAUA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAWG;;;AACA;;AAAA;AAAA;AACO;;AAbV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAeA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAWG;;;AACA;;AAAA;AAAA;AACO;;AAbV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAeA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAsBG;;;AACA;;;AACwB;AAAA;;AAAxB;;;AA9Gc;;AAAX;AAAX;;;AACY;;AAAA;;AAAA;AA+GG;;AA1BV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAlFM;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAyGJ;;;AAvGG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAqGJ;;;AAnGG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAiGJ;;;AA/FG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AA6FJ;;;AA3FG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;;;;AA4FP;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAmBG;;;AACA;;;AACwB;AAAA;;AAAxB;;;AA9GO;AAAW;;AAAX;AAAP;AACc;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AA6GG;;AAvBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AApFM;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAwGJ;;;AAtGG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAoGJ;;;AAlGG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAgGJ;;;AA9FG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;;;;AA+FP;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AApK+B;;AAAgB;;AAArC;;;AAAP;AAoLA;;AAAA;AAAA;AACO;;AAjBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BU;AAAA;;AAAA;AAAA;AARV;AAAA;AAAA;AAAA;AAAA;AAAA;AAUA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAc4B;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AAlBP;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAcU;AACP;AAAA;;;AAES;;;;;;;;AADT;;AAAA;;;;;;;;;;;;;;AA+BQ;AAJI;;AAvRL;;AAAA;AAAA;AAAA;AAAA;;AAsRC;AAGO;AAAA;AA7ClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAsCe;;AAlRL;;AAAA;AAAA;AAAA;AAAA;;AAiRC;AAGO;AAAA;AAxClB;;;AAiCe;;AA7QL;;AAAA;AAAA;AAAA;AAAA;;AA4QC;AAGO;AAAA;AAnClB;;;AA4Be;;AAxQL;;AAAA;AAAA;AAAA;AAAA;;AAuQC;AAGO;AAAA;AA9BlB;;;AAuBe;;AAnQL;;AAAA;AAAA;AAAA;AAAA;;AAkQC;AAGO;AAAA;AAzBlB;;;AAkBkB;;;;;;;;;;;;;;;;;;AAlBlB;;;AHzQD;;;AAEe;;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAJ;AAAP;;AAgBJ;;;AApB8B;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAqCW;AAAA;AAAA;AAIM;AAAA;;AAAA;AAAA;AAAiC;;AAAA;;AAAA;AAAjC;AAEb;AAAA;;AAAA;AAAA;AAAkC;;AAAA;;AAAA;AAAlC;AAMgB;;AAAA;AAAA;AAAgB;AAAA;;AAAA;AAAA;AADf;;AAAA;;AAAA;;AAAA;;;AAIgB;AAAA;;AAAA;AAAA;AADf;;AAAA;;AAAA;;AAAA;;;AAMtB;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAI+B;AAAA;;AAAA;AAAA;AAA/B;AAAA;;AACgC;AAAA;;AAAA;AAAA;AAAhC;AAAA;;AAG0B;AAAA;AAAA;AAAA;AAA1B;AAAA;;AAIA;;AAAA;AAAA;AACA;AAEJ;;;;;;AAzE8B;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AC+GO;AAAA;AAAA;AAAA;AAAe;;AAAf;ADnCf;;;AACY;AAEO;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AACR;;AAAA;AAAA;AAAA;;AAAX;;;AACY;AAGJ;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAC0B;AAA1B;AAAA;;AACA;;AAAA;AAAA;AACO;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;AAAA;AAAA;;AAAA;AAAA;;ACyCJ;;;AAIO;;AAAA;;;AAAA;;AAAA;;;AACQ;AAAP;AACQ;;AAAA;;AAAA;AACL;;AAAA;AAAP;AAEJ;;;AAEJ;;AAAA;;;AACmB;AAAP;AACG;AAAA;;AAAA;AAAA;AAAP;AAAA;AACoC;AAAA;;AAAA;AAAA;AAA7B;;AAAA;AAAA;;AAAA;;;AAAP;AAEJ;;;AAOJ;;AAAA;;;AACmB;AAAP;AAEA;AAAA;;AAAA;AAAA;AAEA;AAAA;;AAAA;AAAA;AAHG;;AAAA;AAAA;;;AAAP;AAwBJ;;;AAEsB;AAAA;AAAA;AAAA;AAAX;;AAAA;AAAP;AAdO;;AAAY;;AAAZ;AAgBA;AAAc;;AAAd;AAAA;AAAA;AAAA;AAAA;;AAAP;AAZO;;AAAW;;AAAX;AAeS;;AAAA;AAAA;;AAAA;AAAA;AAAT;;AAAA;AAAP;AACO;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAP;AAuGJ;;;AA1DO;;AARC;AAQD;AAAA;;;AAAA;;AAPC;AAOD;AAAA;;;AAAA;;AANC;;AAMD;AAAA;;;AAAA;;AALC;;AAKD;AAAA;;;AAAA;;AAJC;;AAID;AAAA;;;AACQ;AA6DX;;AA1DR;;AAAA;;;AAEmB;AAwDJ;;;AAtDJ;;AAAiB;;AAAjB;AAAA;;;AAAyC;;AAAiB;;AAAjB;AAAzC;;;AAIQ;;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;;AAkDJ;;;;AAAA;;;AA7CJ;;AAAiB;AAAjB;AAAX;;;AAEmB;;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;;AA2CJ;;;;AAAA;;;AArCJ;;AAAiB;;AAAjB;AAAX;;;AAEmB;;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;;AAmCJ;;;;AAAA;;;AA5BJ;;AAAiB;;AAAjB;AAAX;;;AAEmB;;AAAc;;AAAd;AA0BJ;;;AAxBA;AAwBA;;;AAkBH;AAAA;;AAAA;AAAA;AAAsB;AAAtB;AAAA;;;AACI;AAAA;;AAAA;AAAA;AADJ;;;;AADJ;;AAAA;AA8CJ;;;AASQ;;AAAA;;AAAA;AAAA;AAAA;;;AACG;AAAA;;AAAA;AAAA;AADH;;;AAEG;AAAA;;AAAA;AAAA;AAFH;;;AAIO;AAAP;;AAAA;;AAAA;AAEA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAHM;;;AAQN;AAAA;;AAAA;AAAA;AAHG;;AAAA;AAAA;;;AAAP;;AAAA;;AAAA;AA+DJ;;;AAMJ;;AAAA;;;AACY;;AAAA;AACU;AAAA;;AAAA;AAAA;AACV;AAAA;;AAAA;AAAA;AADmC;;AAAA;;AAAA;;;AAAzB;AAKd;AAAA;AAGI;AAAA;;AAAA;AAAA;AAFG;;AAAA;AAAA;;AAAA;;;AAAP;AAyIJ;;;;;;;;AAUW;;AAAA;AAAA;AAAkB;AAAA;AAAA;AAAA;AAAlB;AAAP;AACO;;AAAA;;AAAA;AAAwB;;AAAxB;AAAP;AAEa;;AAAA;AAAA;AAAA;AACI;AAAd;AAAA;AAAX;;;AA5ee;AAAA;AAAA;AAAA;AAAe;;AAAf;AA+eH;AAEI;AAAA;;AAAA;AAAA;AAA6B;AAAA;;AAAA;AAAA;AAA7B;AADJ;AAG6B;;AAAA;;AAAA;AAA7B;;AAAA;;AAAA;AACA;;AAAA;AAAA;AAC6B;;AAAA;;AAAA;AAA7B;;AAAA;AAAA;AACA;;AAAwB;AAAxB;AACiC;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAqB;AAArB;AAAA;AAAA;AAAA;AACA;AAAc;;AAAd;AA7LJ;;AAAA;AACO;AAAA;;AAAA;AAAA;AA6LH;;AAAA;AAGmB;AAHnB;;;;AAAA;;AAKA;;AAAA;;AAAA;;AAAA;AA/fG;AAAA;AAAA;AAAA;AAAe;;AAAf;AAYA;AAAP;AAsfA;AAAA;;AAAA;AAAA;AAAyB;;AAAA;;;AAAA;;AAAzB;AAAA;;AAAA;AAAA;AAEG;;AAAc;;AAAd;AAAX;;;AAIgB;;AAAA;;AAAA;AACA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAHY;;;AAMI;AAAA;;AAAA;AAAA;AAAhB;AAAA;;AAmFL;AAAA;;AAAA;AAAA;AAAA;;;AAAqC;AAAA;;AAAA;AAAA;AAAP;;AAAA;AAA9B;;;AACQ;AAAA;;AAAA;AAAA;AAAA;;AAAA;AACR;AAAA;;AAAA;AAAA;AAAA;;;AAAmC;AAAA;;AAAA;AAAA;AAAP;;AAAA;AAA5B;;;AACQ;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAvFP;;AAAA;;AAAA;AAYD;;AAAc;;AAAd;AAAX;;;AACyC;;AAAA;;AAAA;AAA7B;;AAAA;;AAAA;AACA;;AAAA;AAAA;AAKD;;;AAAX;;;AACe;;AAAc;;AAAd;AAAf;;;AAK4B;AAAA;AAAA;AAAA;AAA4B;AAAA;AAAA;AAAA;AAA5B;AAEF;;AAHA;AADF;;AAAA;AAFR;AAAA;;;AA9LU;AAAA;;AAAA;AAAA;AAAA;;AAAA;AACJ;AAAd;;AACwB;AAAxB;;AAEG;;AAAA;;AAAA;AAAA;AAAA;;AAAX;;;AAE8B;;AAAA;;AAAA;;;AAAA;AAAA;;AAKM;AAAxB;;;;AAEc;AAAA;AAAA;AAAA;AAAoB;AAApB;AAAA;;AACM;AAAA;AAAA;AAAA;AAAlB;;AAAA;AAAd;;;AAC2B;;AAAA;;;AAAA;AAAA;;AACK;AAAA;AAAA;AAAA;;AAEuB;;AAArB;AAAA;;;AAClB;;AAAqB;;AAArB;AAAA;;;AACI;;AAAA;;AAAA;AADJ;;;;AAGhB;;;AACA;;AAAA;;;AAC4C;AAAxB;;AAOR;;AAAmB;AAAnB;AAAA;;;;;AAHY;;AAAA;;AAAA;AAFc;;AAAA;AAAA;;;AAAA;AAAA;;AAIlB;;AAAA;AAAA;;;;;;;;;AAGZ;;AAAA;AACY;AAAA;;AAAA;AAAA;AACT;;AAAA;;AAAA;AAAc;AAAd;AAAX;;;AAEyB;AAAA;;AAAA;AAAA;AAAb;AAGA;AAAA;;AAAA;AAAA;AAFG;;AAAA;;;AAiKC;;AAAA;AAAA;AAKR;AAAA;AAAA;AAAA;AAAqB;AAArB;AAAA;AAAA;AAAA;AACA;;AAEW;AACQ;AAHnB;;;;AAAA;;;;;;;;;AAFqC;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;;;;AAnBC;;AAAc;;AAAd;AAAb;;;AAE6C;AAAA;;AAAA;AAAA;AAAjC;;AAAA;AAAA;;;;AAdC;;AAAc;;AAAd;AAAb;;;AACwB;;AAAA;;AAAA;AAAA;AAAA;;AACxB;;;AAC4B;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAChB;;AAAA;;AAAA;;;;AAEG;;AAAA;;AAAA;AAAA;AAAA;;AAAf;;;AACgB;;AAAA;;AAAA;;;;AAoCZ;;;AAUwB;;AACH;;AAAA;AAAA;AACE;;AAAA;;;AACI;;AAAA;;;AACJ;;AAGW;;AALX;AAKW;AA6BtC;;AAAA;;;AACmB;AA/BS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAIA;AAAA;;AAAA;AAAA;AACH;;AAAA;AAAiB;AAAjB;AAZb;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AADJ;;;;;;AAAA;AAAA;AAAA;;;;;;AAwCG;;AAAe;AAAf;AAAA;;;AAAA;;AAAsC;;AAAtC;AAAA;;;AACQ;AAhCC;;;AAiCL;;;AAjCK;;;AEzpBhB;;;;;AAFW;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAGA;;;AACH;;AAAA;AAAA;AAAA;AAAA;AACG;;AAAA;AAAA;;AADH;AAAA;;;AAEG;;AAAA;AAAA;AAAA;AAAA;AADA;;AAAA;AADH;;;;AADJ;;AAAA;;;;;AAOyB;;AAbF;AAAA;;AAAA;AAAA;AAAhB;AAaP;;AAkBW;AAAA;;AAAA;AAAA;AAAJ;AAAP;;AAGW;AAAA;;AAAA;AAAA;AAAJ;AAAP;;AAEJ;;;AACW;;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;AAAA;;AAMH;;AANG;AAAA;;;AAAA;;AAOH;;AAPG;AAAA;;;;AAAP;;;", "op_pc_offset": 0, "pc_events": { "1": { @@ -16,12 +16,12 @@ "params": {}, "block": "main", "stack_in": [], - "op": "intcblock 0 1 8 32" + "op": "intcblock 0 1 8 32 1500" }, - "7": { - "op": "bytecblock 0x151f7c75 \"status\" \"event_cursor\" \"outstanding_principal\" \"schedule_entry_count\" \"fixed_point_scale\" \"accrued_interest\" \"interest_calculation_base\" 0x52234163636f756e7423 \"nominal_interest_rate\" \"reserved_units_total\" \"reserved_principal\" \"contract_type\" \"total_units\" \"next_principal_redemption\" \"reserved_interest\" \"cumulative_interest_index\" \"cumulative_principal_index\" 0x5223417272616e67657223 \"settlement_asset_id\" \"initial_exchange_amount\" 0x5223417574686f7269747923 0x52235072696d6172794465616c657223 0x52234163636f756e744d616e6167657223 0x52234f6273657276657223 0x52234f704461656d6f6e23 \"initial_exchange_date\" \"transfer_opening_date\" \"transfer_closure_date\" \"rate_reset_floor\" \"rate_reset_cap\" 0x5323 0x52235472757374656523 \"asset_suspended\" \"dynamic_principal_redemption\" \"rate_reset_spread\" \"rate_reset_multiplier\" \"rate_reset_next\" \"has_rate_reset_floor\" \"has_rate_reset_cap\" 0x00 \"asset_defaulted\" \"prospectus_hash\" \"prospectus_url\" \"denomination_asset_id\" \"maturity_date\" \"day_count_convention\" 0x068101" + "9": { + "op": "bytecblock 0x151f7c75 \"status\" \"event_cursor\" \"schedule_entry_count\" \"outstanding_principal\" \"fixed_point_scale\" \"accrued_interest\" \"interest_calculation_base\" 0x52234163636f756e7423 \"nominal_interest_rate\" \"contract_type\" \"reserved_units_total\" \"reserved_principal\" \"total_units\" \"next_principal_redemption\" \"reserved_interest\" \"cumulative_interest_index\" \"cumulative_principal_index\" 0x5223417272616e67657223 \"settlement_asset_id\" \"initial_exchange_amount\" 0x5223417574686f7269747923 0x52235072696d6172794465616c657223 0x52234163636f756e744d616e6167657223 0x5323 0x52234f6273657276657223 0x52234f704461656d6f6e23 \"initial_exchange_date\" \"transfer_opening_date\" \"transfer_closure_date\" \"rate_reset_floor\" \"rate_reset_cap\" 0x52235472757374656523 \"asset_suspended\" \"dynamic_principal_redemption\" \"rate_reset_spread\" \"rate_reset_multiplier\" \"rate_reset_next\" \"has_rate_reset_floor\" \"has_rate_reset_cap\" 0x00 \"asset_defaulted\" \"prospectus_hash\" \"prospectus_url\" \"denomination_asset_id\" \"maturity_date\" \"day_count_convention\" 0x068101 0x0000" }, - "825": { + "830": { "op": "txn ApplicationID", "defined_out": [ "tmp%0#0" @@ -30,11 +30,11 @@ "tmp%0#0" ] }, - "827": { + "832": { "op": "bnz main_after_if_else@2", "stack_out": [] }, - "830": { + "835": { "op": "bytec 18 // 0x5223417272616e67657223", "defined_out": [ "0x5223417272616e67657223" @@ -43,7 +43,7 @@ "0x5223417272616e67657223" ] }, - "832": { + "837": { "op": "global ZeroAddress", "defined_out": [ "0x5223417272616e67657223", @@ -54,12 +54,12 @@ "tmp%0#3" ] }, - "834": { + "839": { "op": "app_global_put", "stack_out": [] }, - "835": { - "op": "bytec 25 // 0x52234f704461656d6f6e23", + "840": { + "op": "bytec 26 // 0x52234f704461656d6f6e23", "defined_out": [ "0x52234f704461656d6f6e23" ], @@ -67,7 +67,7 @@ "0x52234f704461656d6f6e23" ] }, - "837": { + "842": { "op": "global ZeroAddress", "defined_out": [ "0x52234f704461656d6f6e23", @@ -78,11 +78,11 @@ "tmp%1#3" ] }, - "839": { + "844": { "op": "app_global_put", "stack_out": [] }, - "840": { + "845": { "op": "bytec 33 // \"asset_suspended\"", "defined_out": [ "\"asset_suspended\"" @@ -91,7 +91,7 @@ "\"asset_suspended\"" ] }, - "842": { + "847": { "op": "intc_0 // 0", "defined_out": [ "\"asset_suspended\"", @@ -102,11 +102,11 @@ "0" ] }, - "843": { + "848": { "op": "app_global_put", "stack_out": [] }, - "844": { + "849": { "op": "bytec 41 // \"asset_defaulted\"", "defined_out": [ "\"asset_defaulted\"" @@ -115,18 +115,18 @@ "\"asset_defaulted\"" ] }, - "846": { + "851": { "op": "intc_0 // 0", "stack_out": [ "\"asset_defaulted\"", "0" ] }, - "847": { + "852": { "op": "app_global_put", "stack_out": [] }, - "848": { + "853": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"" @@ -135,19 +135,19 @@ "\"status\"" ] }, - "849": { + "854": { "op": "intc_0 // 0", "stack_out": [ "\"status\"", "0" ] }, - "850": { + "855": { "op": "app_global_put", "stack_out": [] }, - "851": { - "op": "bytec 12 // \"contract_type\"", + "856": { + "op": "bytec 10 // \"contract_type\"", "defined_out": [ "\"contract_type\"" ], @@ -155,18 +155,18 @@ "\"contract_type\"" ] }, - "853": { + "858": { "op": "intc_0 // 0", "stack_out": [ "\"contract_type\"", "0" ] }, - "854": { + "859": { "op": "app_global_put", "stack_out": [] }, - "855": { + "860": { "op": "bytec 42 // \"prospectus_hash\"", "defined_out": [ "\"prospectus_hash\"" @@ -175,7 +175,7 @@ "\"prospectus_hash\"" ] }, - "857": { + "862": { "op": "pushbytes 0x", "defined_out": [ "\"prospectus_hash\"", @@ -186,11 +186,11 @@ "0x" ] }, - "859": { + "864": { "op": "app_global_put", "stack_out": [] }, - "860": { + "865": { "op": "bytec 43 // \"prospectus_url\"", "defined_out": [ "\"prospectus_url\"" @@ -199,7 +199,7 @@ "\"prospectus_url\"" ] }, - "862": { + "867": { "op": "pushbytes \"\"", "defined_out": [ "\"\"", @@ -210,11 +210,11 @@ "\"\"" ] }, - "864": { + "869": { "op": "app_global_put", "stack_out": [] }, - "865": { + "870": { "op": "bytec 44 // \"denomination_asset_id\"", "defined_out": [ "\"denomination_asset_id\"" @@ -223,18 +223,18 @@ "\"denomination_asset_id\"" ] }, - "867": { + "872": { "op": "intc_0 // 0", "stack_out": [ "\"denomination_asset_id\"", "0" ] }, - "868": { + "873": { "op": "app_global_put", "stack_out": [] }, - "869": { + "874": { "op": "bytec 19 // \"settlement_asset_id\"", "defined_out": [ "\"settlement_asset_id\"" @@ -243,19 +243,19 @@ "\"settlement_asset_id\"" ] }, - "871": { + "876": { "op": "intc_0 // 0", "stack_out": [ "\"settlement_asset_id\"", "0" ] }, - "872": { + "877": { "op": "app_global_put", "stack_out": [] }, - "873": { - "op": "bytec 26 // \"initial_exchange_date\"", + "878": { + "op": "bytec 27 // \"initial_exchange_date\"", "defined_out": [ "\"initial_exchange_date\"" ], @@ -263,18 +263,18 @@ "\"initial_exchange_date\"" ] }, - "875": { + "880": { "op": "intc_0 // 0", "stack_out": [ "\"initial_exchange_date\"", "0" ] }, - "876": { + "881": { "op": "app_global_put", "stack_out": [] }, - "877": { + "882": { "op": "bytec 45 // \"maturity_date\"", "defined_out": [ "\"maturity_date\"" @@ -283,19 +283,19 @@ "\"maturity_date\"" ] }, - "879": { + "884": { "op": "intc_0 // 0", "stack_out": [ "\"maturity_date\"", "0" ] }, - "880": { + "885": { "op": "app_global_put", "stack_out": [] }, - "881": { - "op": "bytec 27 // \"transfer_opening_date\"", + "886": { + "op": "bytec 28 // \"transfer_opening_date\"", "defined_out": [ "\"transfer_opening_date\"" ], @@ -303,19 +303,19 @@ "\"transfer_opening_date\"" ] }, - "883": { + "888": { "op": "intc_0 // 0", "stack_out": [ "\"transfer_opening_date\"", "0" ] }, - "884": { + "889": { "op": "app_global_put", "stack_out": [] }, - "885": { - "op": "bytec 28 // \"transfer_closure_date\"", + "890": { + "op": "bytec 29 // \"transfer_closure_date\"", "defined_out": [ "\"transfer_closure_date\"" ], @@ -323,18 +323,18 @@ "\"transfer_closure_date\"" ] }, - "887": { + "892": { "op": "intc_0 // 0", "stack_out": [ "\"transfer_closure_date\"", "0" ] }, - "888": { + "893": { "op": "app_global_put", "stack_out": [] }, - "889": { + "894": { "op": "bytec 46 // \"day_count_convention\"", "defined_out": [ "\"day_count_convention\"" @@ -343,18 +343,18 @@ "\"day_count_convention\"" ] }, - "891": { + "896": { "op": "intc_0 // 0", "stack_out": [ "\"day_count_convention\"", "0" ] }, - "892": { + "897": { "op": "app_global_put", "stack_out": [] }, - "893": { + "898": { "op": "bytec 13 // \"total_units\"", "defined_out": [ "\"total_units\"" @@ -363,19 +363,19 @@ "\"total_units\"" ] }, - "895": { + "900": { "op": "intc_0 // 0", "stack_out": [ "\"total_units\"", "0" ] }, - "896": { + "901": { "op": "app_global_put", "stack_out": [] }, - "897": { - "op": "bytec 10 // \"reserved_units_total\"", + "902": { + "op": "bytec 11 // \"reserved_units_total\"", "defined_out": [ "\"reserved_units_total\"" ], @@ -383,18 +383,18 @@ "\"reserved_units_total\"" ] }, - "899": { + "904": { "op": "intc_0 // 0", "stack_out": [ "\"reserved_units_total\"", "0" ] }, - "900": { + "905": { "op": "app_global_put", "stack_out": [] }, - "901": { + "906": { "op": "bytec 20 // \"initial_exchange_amount\"", "defined_out": [ "\"initial_exchange_amount\"" @@ -403,19 +403,19 @@ "\"initial_exchange_amount\"" ] }, - "903": { + "908": { "op": "intc_0 // 0", "stack_out": [ "\"initial_exchange_amount\"", "0" ] }, - "904": { + "909": { "op": "app_global_put", "stack_out": [] }, - "905": { - "op": "bytec_3 // \"outstanding_principal\"", + "910": { + "op": "bytec 4 // \"outstanding_principal\"", "defined_out": [ "\"outstanding_principal\"" ], @@ -423,18 +423,18 @@ "\"outstanding_principal\"" ] }, - "906": { + "912": { "op": "intc_0 // 0", "stack_out": [ "\"outstanding_principal\"", "0" ] }, - "907": { + "913": { "op": "app_global_put", "stack_out": [] }, - "908": { + "914": { "op": "bytec 14 // \"next_principal_redemption\"", "defined_out": [ "\"next_principal_redemption\"" @@ -443,18 +443,18 @@ "\"next_principal_redemption\"" ] }, - "910": { + "916": { "op": "intc_0 // 0", "stack_out": [ "\"next_principal_redemption\"", "0" ] }, - "911": { + "917": { "op": "app_global_put", "stack_out": [] }, - "912": { + "918": { "op": "bytec 34 // \"dynamic_principal_redemption\"", "defined_out": [ "\"dynamic_principal_redemption\"" @@ -463,18 +463,18 @@ "\"dynamic_principal_redemption\"" ] }, - "914": { + "920": { "op": "intc_0 // 0", "stack_out": [ "\"dynamic_principal_redemption\"", "0" ] }, - "915": { + "921": { "op": "app_global_put", "stack_out": [] }, - "916": { + "922": { "op": "bytec 7 // \"interest_calculation_base\"", "defined_out": [ "\"interest_calculation_base\"" @@ -483,18 +483,18 @@ "\"interest_calculation_base\"" ] }, - "918": { + "924": { "op": "intc_0 // 0", "stack_out": [ "\"interest_calculation_base\"", "0" ] }, - "919": { + "925": { "op": "app_global_put", "stack_out": [] }, - "920": { + "926": { "op": "bytec 6 // \"accrued_interest\"", "defined_out": [ "\"accrued_interest\"" @@ -503,18 +503,18 @@ "\"accrued_interest\"" ] }, - "922": { + "928": { "op": "intc_0 // 0", "stack_out": [ "\"accrued_interest\"", "0" ] }, - "923": { + "929": { "op": "app_global_put", "stack_out": [] }, - "924": { + "930": { "op": "bytec 9 // \"nominal_interest_rate\"", "defined_out": [ "\"nominal_interest_rate\"" @@ -523,18 +523,18 @@ "\"nominal_interest_rate\"" ] }, - "926": { + "932": { "op": "intc_0 // 0", "stack_out": [ "\"nominal_interest_rate\"", "0" ] }, - "927": { + "933": { "op": "app_global_put", "stack_out": [] }, - "928": { + "934": { "op": "bytec 35 // \"rate_reset_spread\"", "defined_out": [ "\"rate_reset_spread\"" @@ -543,18 +543,18 @@ "\"rate_reset_spread\"" ] }, - "930": { + "936": { "op": "intc_0 // 0", "stack_out": [ "\"rate_reset_spread\"", "0" ] }, - "931": { + "937": { "op": "app_global_put", "stack_out": [] }, - "932": { + "938": { "op": "bytec 36 // \"rate_reset_multiplier\"", "defined_out": [ "\"rate_reset_multiplier\"" @@ -563,19 +563,19 @@ "\"rate_reset_multiplier\"" ] }, - "934": { + "940": { "op": "intc_0 // 0", "stack_out": [ "\"rate_reset_multiplier\"", "0" ] }, - "935": { + "941": { "op": "app_global_put", "stack_out": [] }, - "936": { - "op": "bytec 29 // \"rate_reset_floor\"", + "942": { + "op": "bytec 30 // \"rate_reset_floor\"", "defined_out": [ "\"rate_reset_floor\"" ], @@ -583,19 +583,19 @@ "\"rate_reset_floor\"" ] }, - "938": { + "944": { "op": "intc_0 // 0", "stack_out": [ "\"rate_reset_floor\"", "0" ] }, - "939": { + "945": { "op": "app_global_put", "stack_out": [] }, - "940": { - "op": "bytec 30 // \"rate_reset_cap\"", + "946": { + "op": "bytec 31 // \"rate_reset_cap\"", "defined_out": [ "\"rate_reset_cap\"" ], @@ -603,18 +603,18 @@ "\"rate_reset_cap\"" ] }, - "942": { + "948": { "op": "intc_0 // 0", "stack_out": [ "\"rate_reset_cap\"", "0" ] }, - "943": { + "949": { "op": "app_global_put", "stack_out": [] }, - "944": { + "950": { "op": "bytec 37 // \"rate_reset_next\"", "defined_out": [ "\"rate_reset_next\"" @@ -623,18 +623,18 @@ "\"rate_reset_next\"" ] }, - "946": { + "952": { "op": "intc_0 // 0", "stack_out": [ "\"rate_reset_next\"", "0" ] }, - "947": { + "953": { "op": "app_global_put", "stack_out": [] }, - "948": { + "954": { "op": "bytec 38 // \"has_rate_reset_floor\"", "defined_out": [ "\"has_rate_reset_floor\"" @@ -643,18 +643,18 @@ "\"has_rate_reset_floor\"" ] }, - "950": { + "956": { "op": "intc_0 // 0", "stack_out": [ "\"has_rate_reset_floor\"", "0" ] }, - "951": { + "957": { "op": "app_global_put", "stack_out": [] }, - "952": { + "958": { "op": "bytec 39 // \"has_rate_reset_cap\"", "defined_out": [ "\"has_rate_reset_cap\"" @@ -663,19 +663,19 @@ "\"has_rate_reset_cap\"" ] }, - "954": { + "960": { "op": "intc_0 // 0", "stack_out": [ "\"has_rate_reset_cap\"", "0" ] }, - "955": { + "961": { "op": "app_global_put", "stack_out": [] }, - "956": { - "op": "bytec 11 // \"reserved_principal\"", + "962": { + "op": "bytec 12 // \"reserved_principal\"", "defined_out": [ "\"reserved_principal\"" ], @@ -683,18 +683,18 @@ "\"reserved_principal\"" ] }, - "958": { + "964": { "op": "intc_0 // 0", "stack_out": [ "\"reserved_principal\"", "0" ] }, - "959": { + "965": { "op": "app_global_put", "stack_out": [] }, - "960": { + "966": { "op": "bytec 15 // \"reserved_interest\"", "defined_out": [ "\"reserved_interest\"" @@ -703,18 +703,18 @@ "\"reserved_interest\"" ] }, - "962": { + "968": { "op": "intc_0 // 0", "stack_out": [ "\"reserved_interest\"", "0" ] }, - "963": { + "969": { "op": "app_global_put", "stack_out": [] }, - "964": { + "970": { "op": "bytec 16 // \"cumulative_interest_index\"", "defined_out": [ "\"cumulative_interest_index\"" @@ -723,18 +723,18 @@ "\"cumulative_interest_index\"" ] }, - "966": { + "972": { "op": "intc_0 // 0", "stack_out": [ "\"cumulative_interest_index\"", "0" ] }, - "967": { + "973": { "op": "app_global_put", "stack_out": [] }, - "968": { + "974": { "op": "bytec 17 // \"cumulative_principal_index\"", "defined_out": [ "\"cumulative_principal_index\"" @@ -743,18 +743,18 @@ "\"cumulative_principal_index\"" ] }, - "970": { + "976": { "op": "intc_0 // 0", "stack_out": [ "\"cumulative_principal_index\"", "0" ] }, - "971": { + "977": { "op": "app_global_put", "stack_out": [] }, - "972": { + "978": { "op": "bytec_2 // \"event_cursor\"", "defined_out": [ "\"event_cursor\"" @@ -763,19 +763,19 @@ "\"event_cursor\"" ] }, - "973": { + "979": { "op": "intc_0 // 0", "stack_out": [ "\"event_cursor\"", "0" ] }, - "974": { + "980": { "op": "app_global_put", "stack_out": [] }, - "975": { - "op": "bytec 4 // \"schedule_entry_count\"", + "981": { + "op": "bytec_3 // \"schedule_entry_count\"", "defined_out": [ "\"schedule_entry_count\"" ], @@ -783,18 +783,18 @@ "\"schedule_entry_count\"" ] }, - "977": { + "982": { "op": "intc_0 // 0", "stack_out": [ "\"schedule_entry_count\"", "0" ] }, - "978": { + "983": { "op": "app_global_put", "stack_out": [] }, - "979": { + "984": { "op": "bytec 5 // \"fixed_point_scale\"", "defined_out": [ "\"fixed_point_scale\"" @@ -803,18 +803,18 @@ "\"fixed_point_scale\"" ] }, - "981": { + "986": { "op": "intc_0 // 0", "stack_out": [ "\"fixed_point_scale\"", "0" ] }, - "982": { + "987": { "op": "app_global_put", "stack_out": [] }, - "983": { + "988": { "op": "txn GlobalNumByteSlice", "defined_out": [ "tmp%0#2" @@ -823,7 +823,7 @@ "tmp%0#2" ] }, - "985": { + "990": { "op": "pushint 4", "defined_out": [ "4", @@ -834,7 +834,7 @@ "4" ] }, - "987": { + "992": { "op": "==", "defined_out": [ "tmp%1#2" @@ -843,12 +843,12 @@ "tmp%1#2" ] }, - "988": { + "993": { "error": "Wrong Global Bytes allocation", "op": "assert // Wrong Global Bytes allocation", "stack_out": [] }, - "989": { + "994": { "op": "txn GlobalNumUint", "defined_out": [ "tmp%2#1" @@ -857,7 +857,7 @@ "tmp%2#1" ] }, - "991": { + "996": { "op": "pushint 37", "defined_out": [ "37", @@ -868,7 +868,7 @@ "37" ] }, - "993": { + "998": { "op": "==", "defined_out": [ "tmp%3#1" @@ -877,12 +877,12 @@ "tmp%3#1" ] }, - "994": { + "999": { "error": "Wrong Global UInts allocation", "op": "assert // Wrong Global UInts allocation", "stack_out": [] }, - "995": { + "1000": { "op": "txn LocalNumByteSlice", "defined_out": [ "tmp%4#1" @@ -891,7 +891,7 @@ "tmp%4#1" ] }, - "997": { + "1002": { "op": "!", "defined_out": [ "tmp%5#0" @@ -900,12 +900,12 @@ "tmp%5#0" ] }, - "998": { + "1003": { "error": "Wrong Local Bytes allocation", "op": "assert // Wrong Local Bytes allocation", "stack_out": [] }, - "999": { + "1004": { "op": "txn LocalNumUint", "defined_out": [ "tmp%6#0" @@ -914,7 +914,7 @@ "tmp%6#0" ] }, - "1001": { + "1006": { "op": "!", "defined_out": [ "tmp%7#0" @@ -923,12 +923,12 @@ "tmp%7#0" ] }, - "1002": { + "1007": { "error": "Wrong Local UInts allocation", "op": "assert // Wrong Local UInts allocation", "stack_out": [] }, - "1003": { + "1008": { "block": "main_after_if_else@2", "stack_in": [], "op": "pushbytes 0x914f04eb // method \"contract_update()void\"", @@ -939,7 +939,7 @@ "Method(contract_update()void)" ] }, - "1009": { + "1014": { "op": "txna ApplicationArgs 0", "defined_out": [ "Method(contract_update()void)", @@ -950,11 +950,11 @@ "tmp%0#1" ] }, - "1012": { + "1017": { "op": "match main_contract_update_route@4", "stack_out": [] }, - "1016": { + "1021": { "block": "main_switch_case_next@5", "stack_in": [], "op": "txn OnCompletion", @@ -965,7 +965,7 @@ "tmp%6#0" ] }, - "1018": { + "1023": { "op": "!", "defined_out": [ "tmp%7#0" @@ -974,11 +974,11 @@ "tmp%7#0" ] }, - "1019": { + "1024": { "op": "assert", "stack_out": [] }, - "1020": { + "1025": { "op": "txn ApplicationID", "defined_out": [ "tmp%8#0" @@ -987,17 +987,18 @@ "tmp%8#0" ] }, - "1022": { - "op": "bz main_create_NoOp@31", + "1027": { + "op": "bz main_create_NoOp@32", "stack_out": [] }, - "1025": { - "op": "pushbytess 0xb44618c8 0xe7832529 0x94388723 0x6c85e3ee 0xbdd1a944 0x7c0f1812 0x14fc10ef 0x74a7297f 0x09d4fe14 0x9a9bfa85 0x85eed33d 0xab2c0fc4 0xd9f225ac 0x8ea6e74c 0x02af557a 0x82f71b2d 0xef04f5d3 0xdf343550 0x3dbe80bd 0x1e3e48e7 0x010c8299 0x7406acd2 0x1a72a2ee // method \"fund_due_cashflows(uint64)(uint64,uint64,uint64,uint64,uint64)\", method \"claim_due_cashflows(address,byte[])(uint64,uint64,uint64,uint64,byte[])\", method \"transfer_set_schedule(uint64,uint64)uint64\", method \"primary_distribution(address,uint64)uint64\", method \"transfer(address,address,uint64)uint64\", method \"account_suspension(address,bool)uint64\", method \"account_open(address,address)uint64\", method \"account_update_payment_address(address,address)uint64\", method \"account_get_position(address)(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64)\", method \"contract_config((uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64),(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64),(byte[32],string))uint64\", method \"contract_schedule(uint64,bool,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[])uint64\", method \"contract_execute_ied()uint64\", method \"apply_non_cash_event(uint64,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64\", method \"contract_get_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)\", method \"contract_get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)\", method \"rbac_rotate_arranger(address)uint64\", method \"rbac_set_op_daemon(address)uint64\", method \"rbac_assign_role(uint8,address,(uint64,uint64))uint64\", method \"rbac_revoke_role(uint8,address)uint64\", method \"rbac_contract_suspension(bool)uint64\", method \"rbac_get_arranger()address\", method \"rbac_get_address_roles(address)(bool,bool,bool,bool,bool)\", method \"rbac_get_role_validity(uint8,address)(uint64,uint64)\"", + "1030": { + "op": "pushbytess 0xb44618c8 0xe7832529 0x94388723 0x6c85e3ee 0xbdd1a944 0x7c0f1812 0x14fc10ef 0x74a7297f 0x09d4fe14 0x9a9bfa85 0x85eed33d 0xab2c0fc4 0xd9f225ac 0x9883505a 0x8ea6e74c 0x02af557a 0x82f71b2d 0xef04f5d3 0xdf343550 0x3dbe80bd 0x1e3e48e7 0x010c8299 0x7406acd2 0x1a72a2ee // method \"fund_due_cashflows(uint64)(uint64,uint64,uint64,uint64,uint64)\", method \"claim_due_cashflows(address,byte[])(uint64,uint64,uint64,uint64,byte[])\", method \"transfer_set_schedule(uint64,uint64)uint64\", method \"primary_distribution(address,uint64)uint64\", method \"transfer(address,address,uint64)uint64\", method \"account_suspension(address,bool)uint64\", method \"account_open(address,address)uint64\", method \"account_update_payment_address(address,address)uint64\", method \"account_get_position(address)(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64)\", method \"contract_config((uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64),(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64),(byte[32],string))uint64\", method \"contract_schedule(uint64,bool,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[])uint64\", method \"contract_execute_ied()uint64\", method \"apply_non_cash_event(uint64,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64\", method \"append_observed_cash_event((uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64\", method \"contract_get_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)\", method \"contract_get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)\", method \"rbac_rotate_arranger(address)uint64\", method \"rbac_set_op_daemon(address)uint64\", method \"rbac_assign_role(uint8,address,(uint64,uint64))uint64\", method \"rbac_revoke_role(uint8,address)uint64\", method \"rbac_contract_suspension(bool)uint64\", method \"rbac_get_arranger()address\", method \"rbac_get_address_roles(address)(bool,bool,bool,bool,bool)\", method \"rbac_get_role_validity(uint8,address)(uint64,uint64)\"", "defined_out": [ "Method(account_get_position(address)(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64))", "Method(account_open(address,address)uint64)", "Method(account_suspension(address,bool)uint64)", "Method(account_update_payment_address(address,address)uint64)", + "Method(append_observed_cash_event((uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64)", "Method(apply_non_cash_event(uint64,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64)", "Method(claim_due_cashflows(address,byte[])(uint64,uint64,uint64,uint64,byte[]))", "Method(contract_config((uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64),(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64),(byte[32],string))uint64)", @@ -1032,6 +1033,7 @@ "Method(contract_schedule(uint64,bool,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[])uint64)", "Method(contract_execute_ied()uint64)", "Method(apply_non_cash_event(uint64,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64)", + "Method(append_observed_cash_event((uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64)", "Method(contract_get_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))", "Method(contract_get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64))", "Method(rbac_rotate_arranger(address)uint64)", @@ -1044,13 +1046,14 @@ "Method(rbac_get_role_validity(uint8,address)(uint64,uint64))" ] }, - "1142": { + "1152": { "op": "txna ApplicationArgs 0", "defined_out": [ "Method(account_get_position(address)(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64))", "Method(account_open(address,address)uint64)", "Method(account_suspension(address,bool)uint64)", "Method(account_update_payment_address(address,address)uint64)", + "Method(append_observed_cash_event((uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64)", "Method(apply_non_cash_event(uint64,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64)", "Method(claim_due_cashflows(address,byte[])(uint64,uint64,uint64,uint64,byte[]))", "Method(contract_config((uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64),(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64),(byte[32],string))uint64)", @@ -1086,6 +1089,7 @@ "Method(contract_schedule(uint64,bool,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[])uint64)", "Method(contract_execute_ied()uint64)", "Method(apply_non_cash_event(uint64,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64)", + "Method(append_observed_cash_event((uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64)", "Method(contract_get_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))", "Method(contract_get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64))", "Method(rbac_rotate_arranger(address)uint64)", @@ -1099,15 +1103,15 @@ "tmp%10#0" ] }, - "1145": { - "op": "match fund_due_cashflows claim_due_cashflows transfer_set_schedule primary_distribution transfer account_suspension account_open account_update_payment_address account_get_position contract_config contract_schedule contract_execute_ied apply_non_cash_event contract_get_state contract_get_next_due_event rbac_rotate_arranger rbac_set_op_daemon rbac_assign_role rbac_revoke_role rbac_contract_suspension rbac_get_arranger rbac_get_address_roles rbac_get_role_validity", + "1155": { + "op": "match fund_due_cashflows claim_due_cashflows transfer_set_schedule primary_distribution transfer account_suspension account_open account_update_payment_address account_get_position contract_config contract_schedule contract_execute_ied apply_non_cash_event append_observed_cash_event contract_get_state contract_get_next_due_event rbac_rotate_arranger rbac_set_op_daemon rbac_assign_role rbac_revoke_role rbac_contract_suspension rbac_get_arranger rbac_get_address_roles rbac_get_role_validity", "stack_out": [] }, - "1193": { + "1205": { "op": "err" }, - "1194": { - "block": "main_create_NoOp@31", + "1206": { + "block": "main_create_NoOp@32", "stack_in": [], "op": "pushbytes 0x956d7156 // method \"contract_create(address)uint64\"", "defined_out": [ @@ -1117,7 +1121,7 @@ "Method(contract_create(address)uint64)" ] }, - "1200": { + "1212": { "op": "txna ApplicationArgs 0", "defined_out": [ "Method(contract_create(address)uint64)", @@ -1128,14 +1132,14 @@ "tmp%11#0" ] }, - "1203": { + "1215": { "op": "match contract_create", "stack_out": [] }, - "1207": { + "1219": { "op": "err" }, - "1208": { + "1220": { "block": "main_contract_update_route@4", "stack_in": [], "op": "txn OnCompletion", @@ -1146,7 +1150,7 @@ "tmp%1#1" ] }, - "1210": { + "1222": { "op": "pushint 4 // UpdateApplication", "defined_out": [ "UpdateApplication", @@ -1157,7 +1161,7 @@ "UpdateApplication" ] }, - "1212": { + "1224": { "op": "==", "defined_out": [ "tmp%2#0" @@ -1166,7 +1170,7 @@ "tmp%2#0" ] }, - "1213": { + "1225": { "op": "txn ApplicationID", "defined_out": [ "tmp%2#0", @@ -1177,7 +1181,7 @@ "tmp%3#0" ] }, - "1215": { + "1227": { "op": "&&", "defined_out": [ "tmp%5#0" @@ -1186,14 +1190,244 @@ "tmp%5#0" ] }, - "1216": { + "1228": { "op": "assert", "stack_out": [] }, - "1217": { + "1229": { "op": "b contract_update" }, - "1220": { + "1232": { + "subroutine": "_puya_lib.util.ensure_budget", + "params": { + "required_budget#0": "uint64", + "fee_source#0": "uint64" + }, + "block": "ensure_budget", + "stack_in": [], + "op": "proto 2 0" + }, + "1235": { + "op": "frame_dig -2", + "defined_out": [ + "required_budget#0 (copy)" + ], + "stack_out": [ + "required_budget#0 (copy)" + ] + }, + "1237": { + "op": "pushint 10", + "defined_out": [ + "10", + "required_budget#0 (copy)" + ], + "stack_out": [ + "required_budget#0 (copy)", + "10" + ] + }, + "1239": { + "op": "+", + "defined_out": [ + "required_budget_with_buffer#0" + ], + "stack_out": [ + "required_budget_with_buffer#0" + ] + }, + "1240": { + "block": "ensure_budget_while_top@1", + "stack_in": [ + "required_budget_with_buffer#0" + ], + "op": "frame_dig 0", + "defined_out": [ + "required_budget_with_buffer#0" + ], + "stack_out": [ + "required_budget_with_buffer#0", + "required_budget_with_buffer#0" + ] + }, + "1242": { + "op": "global OpcodeBudget", + "defined_out": [ + "required_budget_with_buffer#0", + "tmp%1#0" + ], + "stack_out": [ + "required_budget_with_buffer#0", + "required_budget_with_buffer#0", + "tmp%1#0" + ] + }, + "1244": { + "op": ">", + "defined_out": [ + "required_budget_with_buffer#0", + "tmp%2#0" + ], + "stack_out": [ + "required_budget_with_buffer#0", + "tmp%2#0" + ] + }, + "1245": { + "op": "bz ensure_budget_after_while@6", + "stack_out": [ + "required_budget_with_buffer#0" + ] + }, + "1248": { + "op": "itxn_begin" + }, + "1249": { + "op": "pushint 6 // appl", + "defined_out": [ + "appl", + "required_budget_with_buffer#0" + ], + "stack_out": [ + "required_budget_with_buffer#0", + "appl" + ] + }, + "1251": { + "op": "itxn_field TypeEnum", + "stack_out": [ + "required_budget_with_buffer#0" + ] + }, + "1253": { + "op": "pushint 5 // DeleteApplication", + "defined_out": [ + "DeleteApplication", + "required_budget_with_buffer#0" + ], + "stack_out": [ + "required_budget_with_buffer#0", + "DeleteApplication" + ] + }, + "1255": { + "op": "itxn_field OnCompletion", + "stack_out": [ + "required_budget_with_buffer#0" + ] + }, + "1257": { + "op": "bytec 47 // 0x068101", + "defined_out": [ + "0x068101", + "required_budget_with_buffer#0" + ], + "stack_out": [ + "required_budget_with_buffer#0", + "0x068101" + ] + }, + "1259": { + "op": "itxn_field ApprovalProgram", + "stack_out": [ + "required_budget_with_buffer#0" + ] + }, + "1261": { + "op": "bytec 47 // 0x068101", + "stack_out": [ + "required_budget_with_buffer#0", + "0x068101" + ] + }, + "1263": { + "op": "itxn_field ClearStateProgram", + "stack_out": [ + "required_budget_with_buffer#0" + ] + }, + "1265": { + "op": "frame_dig -1", + "defined_out": [ + "fee_source#0 (copy)", + "required_budget_with_buffer#0" + ], + "stack_out": [ + "required_budget_with_buffer#0", + "fee_source#0 (copy)" + ] + }, + "1267": { + "op": "switch ensure_budget_switch_case_0@3 ensure_budget_switch_case_1@4", + "stack_out": [ + "required_budget_with_buffer#0" + ] + }, + "1273": { + "block": "ensure_budget_switch_case_next@5", + "stack_in": [ + "required_budget_with_buffer#0" + ], + "op": "itxn_submit" + }, + "1274": { + "op": "b ensure_budget_while_top@1" + }, + "1277": { + "block": "ensure_budget_switch_case_1@4", + "stack_in": [ + "required_budget_with_buffer#0" + ], + "op": "global MinTxnFee", + "defined_out": [ + "tmp%3#0" + ], + "stack_out": [ + "required_budget_with_buffer#0", + "tmp%3#0" + ] + }, + "1279": { + "op": "itxn_field Fee", + "stack_out": [ + "required_budget_with_buffer#0" + ] + }, + "1281": { + "op": "b ensure_budget_switch_case_next@5" + }, + "1284": { + "block": "ensure_budget_switch_case_0@3", + "stack_in": [ + "required_budget_with_buffer#0" + ], + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "required_budget_with_buffer#0", + "0" + ] + }, + "1285": { + "op": "itxn_field Fee", + "stack_out": [ + "required_budget_with_buffer#0" + ] + }, + "1287": { + "op": "b ensure_budget_switch_case_next@5" + }, + "1290": { + "block": "ensure_budget_after_while@6", + "stack_in": [ + "required_budget_with_buffer#0" + ], + "retsub": true, + "op": "retsub" + }, + "1291": { "subroutine": "modules.payment_agent.PaymentAgent.fund_due_cashflows[routing]", "params": {}, "block": "fund_due_cashflows", @@ -1203,18 +1437,20 @@ "entry#0" ] }, - "1221": { + "1292": { "op": "pushbytes \"\"", "stack_out": [ "entry#0", "event_type#0" ] }, - "1223": { - "op": "dupn 10", + "1294": { + "op": "dupn 13", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -1222,12 +1458,13 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0" ] }, - "1225": { + "1296": { "op": "txna ApplicationArgs 1", "defined_out": [ "tmp%0#0" @@ -1235,6 +1472,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -1242,13 +1481,14 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "tmp%0#0" ] }, - "1228": { + "1299": { "op": "dup", "defined_out": [ "tmp%0#0", @@ -1257,6 +1497,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -1264,6 +1506,7 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", @@ -1271,7 +1514,7 @@ "tmp%0#0 (copy)" ] }, - "1229": { + "1300": { "op": "len", "defined_out": [ "len%0#0", @@ -1280,6 +1523,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -1287,6 +1532,7 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", @@ -1294,7 +1540,7 @@ "len%0#0" ] }, - "1230": { + "1301": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -1304,6 +1550,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -1311,6 +1559,7 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", @@ -1319,7 +1568,7 @@ "8" ] }, - "1231": { + "1302": { "op": "==", "defined_out": [ "eq%0#0", @@ -1328,6 +1577,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -1335,6 +1586,7 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", @@ -1342,12 +1594,14 @@ "eq%0#0" ] }, - "1232": { + "1303": { "error": "invalid number of bytes for arc4.uint64", "op": "assert // invalid number of bytes for arc4.uint64", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -1355,13 +1609,14 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "tmp%0#0" ] }, - "1233": { + "1304": { "op": "btoi", "defined_out": [ "max_event_count#0" @@ -1369,6 +1624,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -1376,17 +1633,20 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0" ] }, - "1234": { + "1305": { "op": "intc_0 // 0", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -1394,6 +1654,7 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", @@ -1401,7 +1662,7 @@ "0" ] }, - "1235": { + "1306": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"", @@ -1411,6 +1672,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -1418,6 +1681,7 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", @@ -1426,7 +1690,7 @@ "\"status\"" ] }, - "1236": { + "1307": { "op": "app_global_get_ex", "defined_out": [ "max_event_count#0", @@ -1436,6 +1700,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -1443,6 +1709,7 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", @@ -1451,12 +1718,14 @@ "maybe_exists%0#0" ] }, - "1237": { + "1308": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -1464,6 +1733,7 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", @@ -1471,12 +1741,14 @@ "maybe_value%0#0" ] }, - "1238": { + "1309": { "error": "D-ASA not configured", "op": "assert // D-ASA not configured", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -1484,29 +1756,32 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0" ] }, - "1239": { + "1310": { "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", "op": "callsub _assert_caller_is_arranger" }, - "1242": { + "1313": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", "op": "callsub _assert_is_not_asset_defaulted" }, - "1245": { + "1316": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_suspended", "op": "callsub _assert_is_not_asset_suspended" }, - "1248": { + "1319": { "op": "intc_0 // 0", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -1514,6 +1789,7 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", @@ -1521,11 +1797,13 @@ "0" ] }, - "1249": { + "1320": { "op": "bytec_1 // \"status\"", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -1533,6 +1811,7 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", @@ -1541,11 +1820,13 @@ "\"status\"" ] }, - "1250": { + "1321": { "op": "app_global_get_ex", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -1553,6 +1834,7 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", @@ -1561,12 +1843,14 @@ "maybe_exists%0#0" ] }, - "1251": { + "1322": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -1574,6 +1858,7 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", @@ -1581,7 +1866,7 @@ "maybe_value%0#0" ] }, - "1252": { + "1323": { "op": "pushint 50", "defined_out": [ "50", @@ -1591,6 +1876,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -1598,6 +1885,7 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", @@ -1606,7 +1894,7 @@ "50" ] }, - "1254": { + "1325": { "op": "==", "defined_out": [ "max_event_count#0", @@ -1615,6 +1903,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -1622,6 +1912,7 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", @@ -1629,16 +1920,18 @@ "tmp%0#1" ] }, - "1255": { + "1326": { "op": "!", "defined_out": [ "max_event_count#0", "tmp%0#1", - "tmp%1#1" + "tmp%1#4" ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -1646,19 +1939,22 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "tmp%1#1" + "tmp%1#4" ] }, - "1256": { + "1327": { "error": "IED not yet executed", "op": "assert // IED not yet executed", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -1666,27 +1962,21 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0" ] }, - "1257": { - "op": "intc_0 // 0" - }, - "1258": { - "op": "dupn 2", - "defined_out": [ - "funded_interest#0", - "funded_principal#0", - "max_event_count#0", - "processed_events#0", - "tmp%0#1" - ], + "1328": { + "callsub": "modules.actus_kernel.ActusKernelModule._is_dynamic_annuity", + "op": "callsub _is_dynamic_annuity", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -1694,20 +1984,21 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" + "tmp%0#1" ] }, - "1260": { - "block": "fund_due_cashflows_while_top@2", - "stack_in": [ + "1331": { + "op": "bz fund_due_cashflows_after_if_else@3", + "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -1715,21 +2006,20 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" - ], - "op": "dig 2", - "defined_out": [ - "processed_events#0" - ], + "max_event_count#0" + ] + }, + "1334": { + "op": "dup", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -1737,25 +2027,26 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "processed_events#0" + "max_event_count#0" ] }, - "1262": { - "op": "dig 4", + "1335": { + "op": "pushint 100", "defined_out": [ + "100", "max_event_count#0", - "processed_events#0" + "tmp%0#1" ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -1763,27 +2054,27 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "processed_events#0", - "max_event_count#0" + "max_event_count#0", + "100" ] }, - "1264": { - "op": "<", + "1337": { + "op": "*", "defined_out": [ "max_event_count#0", - "processed_events#0", - "tmp%0#1" + "tmp%0#1", + "tmp%1#1" ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -1791,21 +2082,27 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "tmp%0#1" + "tmp%1#1" ] }, - "1265": { - "op": "bz fund_due_cashflows_after_while@9", + "1338": { + "op": "intc 4 // 1500", + "defined_out": [ + "1500", + "max_event_count#0", + "tmp%0#1", + "tmp%1#1" + ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -1813,26 +2110,27 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" + "tmp%1#1", + "1500" ] }, - "1268": { - "op": "intc_0 // 0", + "1340": { + "op": "+", "defined_out": [ - "0", "max_event_count#0", - "processed_events#0", - "tmp%0#1" + "tmp%0#1", + "tmp%2#1" ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -1840,28 +2138,21 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "0" + "tmp%2#1" ] }, - "1269": { - "op": "bytec_2 // \"event_cursor\"", - "defined_out": [ - "\"event_cursor\"", - "0", - "max_event_count#0", - "processed_events#0", - "tmp%0#1" - ], + "1341": { + "op": "intc_0 // 0", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -1869,29 +2160,23 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "0", - "\"event_cursor\"" + "tmp%2#1", + "0" ] }, - "1270": { - "op": "app_global_get_ex", - "defined_out": [ - "max_event_count#0", - "maybe_exists%0#0", - "maybe_value%0#0", - "processed_events#0", - "tmp%0#1" - ], + "1342": { + "callsub": "_puya_lib.util.ensure_budget", + "op": "callsub ensure_budget", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -1899,23 +2184,20 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "maybe_value%0#0", - "maybe_exists%0#0" + "max_event_count#0" ] }, - "1271": { - "error": "check self.event_cursor exists", - "op": "assert // check self.event_cursor exists", - "stack_out": [ + "1345": { + "block": "fund_due_cashflows_after_if_else@3", + "stack_in": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -1923,21 +2205,21 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "maybe_value%0#0" - ] - }, - "1272": { + "max_event_count#0" + ], "op": "intc_0 // 0", + "defined_out": [ + "processed_events#0" + ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -1945,30 +2227,24 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "maybe_value%0#0", - "0" + "processed_events#0" ] }, - "1273": { - "op": "bytec 4 // \"schedule_entry_count\"", + "1346": { + "op": "bury 5", "defined_out": [ - "\"schedule_entry_count\"", - "0", - "max_event_count#0", - "maybe_value%0#0", - "processed_events#0", - "tmp%0#1" + "processed_events#0" ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -1976,31 +2252,24 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "maybe_value%0#0", - "0", - "\"schedule_entry_count\"" + "max_event_count#0" ] }, - "1275": { - "op": "app_global_get_ex", + "1348": { + "op": "intc_0 // 0", "defined_out": [ - "max_event_count#0", - "maybe_exists%1#0", - "maybe_value%0#0", - "maybe_value%1#0", - "processed_events#0", - "tmp%0#1" + "funded_interest#0", + "processed_events#0" ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -2008,24 +2277,25 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_exists%1#0" + "funded_interest#0" ] }, - "1276": { - "error": "check self.schedule_entry_count exists", - "op": "assert // check self.schedule_entry_count exists", + "1349": { + "op": "bury 14", + "defined_out": [ + "funded_interest#0", + "processed_events#0" + ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -2033,28 +2303,25 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "maybe_value%0#0", - "maybe_value%1#0" + "max_event_count#0" ] }, - "1277": { - "op": "<", + "1351": { + "op": "intc_0 // 0", "defined_out": [ - "max_event_count#0", - "processed_events#0", - "tmp%0#1", - "tmp%1#1" + "funded_interest#0", + "funded_principal#0", + "processed_events#0" ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -2062,21 +2329,26 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "tmp%1#1" + "funded_principal#0" ] }, - "1278": { - "op": "bz fund_due_cashflows_after_while@9", + "1352": { + "op": "bury 13", + "defined_out": [ + "funded_interest#0", + "funded_principal#0", + "processed_events#0" + ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -2084,20 +2356,20 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" + "max_event_count#0" ] }, - "1281": { - "op": "intc_0 // 0", - "stack_out": [ + "1354": { + "block": "fund_due_cashflows_while_top@4", + "stack_in": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -2105,21 +2377,21 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "0" - ] - }, - "1282": { - "op": "bytec_2 // \"event_cursor\"", + "max_event_count#0" + ], + "op": "dig 4", + "defined_out": [ + "processed_events#0" + ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -2127,29 +2399,25 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "0", - "\"event_cursor\"" + "processed_events#0" ] }, - "1283": { - "op": "app_global_get_ex", + "1356": { + "op": "dig 1", "defined_out": [ "max_event_count#0", - "maybe_exists%2#0", - "maybe_value%2#0", - "processed_events#0", - "tmp%0#1" + "processed_events#0" ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -2157,23 +2425,27 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "maybe_value%2#0", - "maybe_exists%2#0" + "max_event_count#0" ] }, - "1284": { - "error": "check self.event_cursor exists", - "op": "assert // check self.event_cursor exists", + "1358": { + "op": "<", + "defined_out": [ + "max_event_count#0", + "processed_events#0", + "tmp%3#1" + ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -2181,28 +2453,21 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "maybe_value%2#0" + "tmp%3#1" ] }, - "1285": { - "callsub": "modules.actus_kernel.ActusKernelModule._get_schedule_entry", - "op": "callsub _get_schedule_entry", - "defined_out": [ - "entry#0", - "max_event_count#0", - "processed_events#0", - "tmp%0#1" - ], + "1359": { + "op": "bz fund_due_cashflows_after_while@11", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -2210,21 +2475,25 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "entry#0" + "max_event_count#0" ] }, - "1288": { - "op": "dup", + "1362": { + "op": "intc_0 // 0", + "defined_out": [ + "0", + "max_event_count#0", + "processed_events#0" + ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -2232,28 +2501,27 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "entry#0", - "entry#0" + "0" ] }, - "1289": { - "op": "bury 17", + "1363": { + "op": "bytec_2 // \"event_cursor\"", "defined_out": [ - "entry#0", + "\"event_cursor\"", + "0", "max_event_count#0", - "processed_events#0", - "tmp%0#1" + "processed_events#0" ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -2261,28 +2529,28 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "entry#0" + "0", + "\"event_cursor\"" ] }, - "1291": { - "op": "pushint 9", + "1364": { + "op": "app_global_get_ex", "defined_out": [ - "9", - "entry#0", "max_event_count#0", - "processed_events#0", - "tmp%0#1" + "maybe_exists%0#0", + "maybe_value%0#0", + "processed_events#0" ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -2290,29 +2558,23 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "entry#0", - "9" + "maybe_value%0#0", + "maybe_exists%0#0" ] }, - "1293": { - "op": "extract_uint64", - "defined_out": [ - "entry#0", - "max_event_count#0", - "processed_events#0", - "tmp%0#1", - "values%0#0" - ], + "1365": { + "error": "check self.event_cursor exists", + "op": "assert // check self.event_cursor exists", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -2320,21 +2582,21 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "values%0#0" + "maybe_value%0#0" ] }, - "1294": { - "op": "dup", + "1366": { + "op": "intc_0 // 0", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -2342,29 +2604,29 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "values%0#0", - "values%0#0" + "maybe_value%0#0", + "0" ] }, - "1295": { - "op": "bury 6", + "1367": { + "op": "bytec_3 // \"schedule_entry_count\"", "defined_out": [ - "entry#0", + "\"schedule_entry_count\"", + "0", "max_event_count#0", - "processed_events#0", - "tmp%0#1", - "values%0#0" + "maybe_value%0#0", + "processed_events#0" ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -2372,29 +2634,30 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "values%0#0" + "maybe_value%0#0", + "0", + "\"schedule_entry_count\"" ] }, - "1297": { - "op": "global LatestTimestamp", + "1368": { + "op": "app_global_get_ex", "defined_out": [ - "entry#0", "max_event_count#0", - "processed_events#0", - "tmp%0#1", - "tmp%3#1", - "values%0#0" + "maybe_exists%1#0", + "maybe_value%0#0", + "maybe_value%1#0", + "processed_events#0" ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -2402,30 +2665,24 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "values%0#0", - "tmp%3#1" + "maybe_value%0#0", + "maybe_value%1#0", + "maybe_exists%1#0" ] }, - "1299": { - "op": ">", - "defined_out": [ - "entry#0", - "max_event_count#0", - "processed_events#0", - "tmp%0#1", - "tmp%4#0", - "values%0#0" - ], + "1369": { + "error": "check self.schedule_entry_count exists", + "op": "assert // check self.schedule_entry_count exists", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -2433,21 +2690,27 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "tmp%4#0" + "maybe_value%0#0", + "maybe_value%1#0" ] }, - "1300": { - "op": "bnz fund_due_cashflows_after_while@9", + "1370": { + "op": "<", + "defined_out": [ + "max_event_count#0", + "processed_events#0", + "tmp%4#0" + ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -2455,20 +2718,21 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" + "tmp%4#0" ] }, - "1303": { - "op": "dig 15", + "1371": { + "op": "bz fund_due_cashflows_after_while@11", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -2476,29 +2740,20 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "entry#0" + "max_event_count#0" ] }, - "1305": { - "op": "intc_2 // 8", - "defined_out": [ - "8", - "entry#0", - "max_event_count#0", - "processed_events#0", - "tmp%0#1", - "values%0#0" - ], + "1374": { + "op": "intc_0 // 0", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -2506,30 +2761,50 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "entry#0", - "8" + "0" ] }, - "1306": { - "op": "getbyte", - "defined_out": [ + "1375": { + "op": "bytec_2 // \"event_cursor\"", + "stack_out": [ "entry#0", "event_type#0", - "max_event_count#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", "processed_events#0", + "required_amount#0", "tmp%0#1", - "values%0#0" + "values%0#0", + "max_event_count#0", + "0", + "\"event_cursor\"" + ] + }, + "1376": { + "op": "app_global_get_ex", + "defined_out": [ + "max_event_count#0", + "maybe_exists%2#0", + "maybe_value%2#0", + "processed_events#0" ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -2537,21 +2812,23 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "event_type#0" + "maybe_value%2#0", + "maybe_exists%2#0" ] }, - "1307": { - "op": "dup", + "1377": { + "error": "check self.event_cursor exists", + "op": "assert // check self.event_cursor exists", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -2559,30 +2836,27 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "event_type#0", - "event_type#0" + "maybe_value%2#0" ] }, - "1308": { - "op": "bury 16", + "1378": { + "callsub": "modules.actus_kernel.ActusKernelModule._get_schedule_entry", + "op": "callsub _get_schedule_entry", "defined_out": [ "entry#0", - "event_type#0", "max_event_count#0", - "processed_events#0", - "tmp%0#1", - "values%0#0" + "processed_events#0" ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -2590,21 +2864,21 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "event_type#0" + "entry#0" ] }, - "1310": { - "op": "intc_2 // 8", + "1381": { + "op": "dup", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -2612,22 +2886,27 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "event_type#0", - "8" + "entry#0", + "entry#0" ] }, - "1311": { - "op": "==", + "1382": { + "op": "bury 17", + "defined_out": [ + "entry#0", + "max_event_count#0", + "processed_events#0" + ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -2635,21 +2914,27 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "tmp%0#1" + "entry#0" ] }, - "1312": { - "op": "dup", + "1384": { + "op": "pushint 9", + "defined_out": [ + "9", + "entry#0", + "max_event_count#0", + "processed_events#0" + ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -2657,30 +2942,28 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "tmp%0#1", - "tmp%0#1" + "entry#0", + "9" ] }, - "1313": { - "op": "bury 7", + "1386": { + "op": "extract_uint64", "defined_out": [ "entry#0", - "event_type#0", "max_event_count#0", "processed_events#0", - "tmp%0#1", "values%0#0" ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -2688,21 +2971,21 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "tmp%0#1" + "values%0#0" ] }, - "1315": { - "op": "bnz fund_due_cashflows_bool_true@50", + "1387": { + "op": "dup", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -2710,20 +2993,28 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" + "values%0#0", + "values%0#0" ] }, - "1318": { - "op": "dig 14", + "1388": { + "op": "bury 3", + "defined_out": [ + "entry#0", + "max_event_count#0", + "processed_events#0", + "values%0#0" + ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -2731,30 +3022,28 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "event_type#0" + "values%0#0" ] }, - "1320": { - "op": "pushint 3", + "1390": { + "op": "global LatestTimestamp", "defined_out": [ - "3", "entry#0", - "event_type#0", "max_event_count#0", "processed_events#0", - "tmp%0#1", + "tmp%6#0", "values%0#0" ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -2762,22 +3051,29 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "event_type#0", - "3" + "values%0#0", + "tmp%6#0" ] }, - "1322": { - "op": "==", + "1392": { + "op": ">", + "defined_out": [ + "entry#0", + "max_event_count#0", + "processed_events#0", + "tmp%7#0", + "values%0#0" + ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -2785,21 +3081,21 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "tmp%1#1" + "tmp%7#0" ] }, - "1323": { - "op": "bnz fund_due_cashflows_bool_true@50", + "1393": { + "op": "bnz fund_due_cashflows_after_while@11", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -2807,20 +3103,20 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" + "max_event_count#0" ] }, - "1326": { - "op": "dig 14", + "1396": { + "op": "dig 15", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -2828,30 +3124,28 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "event_type#0" + "entry#0" ] }, - "1328": { - "op": "pushint 19", + "1398": { + "op": "intc_2 // 8", "defined_out": [ - "19", + "8", "entry#0", - "event_type#0", "max_event_count#0", "processed_events#0", - "tmp%0#1", "values%0#0" ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -2859,31 +3153,29 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "event_type#0", - "19" + "entry#0", + "8" ] }, - "1330": { - "op": "==", + "1399": { + "op": "getbyte", "defined_out": [ "entry#0", "event_type#0", "max_event_count#0", "processed_events#0", - "tmp%0#1", - "tmp%2#0", "values%0#0" ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -2891,21 +3183,21 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "tmp%2#0" + "event_type#0" ] }, - "1331": { - "op": "bz fund_due_cashflows_bool_false@51", + "1400": { + "op": "dup", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -2913,42 +3205,29 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" + "event_type#0", + "event_type#0" ] }, - "1334": { - "block": "fund_due_cashflows_bool_true@50", - "stack_in": [ + "1401": { + "op": "bury 16", + "defined_out": [ "entry#0", "event_type#0", - "interest_amount#1", - "interest_amount_due#0", - "interest_due#0", - "next_interest_base#2", - "next_outstanding_principal#0", - "principal_amount#1", - "principal_amount_due#0", - "required_amount#0", - "tmp%0#1", - "values%0#0", "max_event_count#0", "processed_events#0", - "funded_interest#0", - "funded_principal#0" - ], - "op": "intc_1 // 1", - "defined_out": [ - "or_result%0#0" + "values%0#0" ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -2956,42 +3235,21 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "or_result%0#0" + "event_type#0" ] }, - "1335": { - "block": "fund_due_cashflows_bool_merge@52", - "stack_in": [ + "1403": { + "op": "intc_2 // 8", + "stack_out": [ "entry#0", "event_type#0", - "interest_amount#1", - "interest_amount_due#0", - "interest_due#0", - "next_interest_base#2", - "next_outstanding_principal#0", - "principal_amount#1", - "principal_amount_due#0", - "required_amount#0", - "tmp%0#1", - "values%0#0", - "max_event_count#0", - "processed_events#0", "funded_interest#0", "funded_principal#0", - "or_result%0#0" - ], - "op": "bz fund_due_cashflows_after_while@9", - "defined_out": [], - "stack_out": [ - "entry#0", - "event_type#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -2999,23 +3257,30 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" + "event_type#0", + "8" ] }, - "1338": { - "op": "dig 15", + "1404": { + "op": "==", "defined_out": [ - "entry#0" + "entry#0", + "event_type#0", + "max_event_count#0", + "processed_events#0", + "tmp%0#1", + "values%0#0" ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -3023,25 +3288,21 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "entry#0" + "tmp%0#1" ] }, - "1340": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "entry#0" - ], + "1405": { + "op": "dup", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -3049,26 +3310,30 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "entry#0", - "0" + "tmp%0#1", + "tmp%0#1" ] }, - "1341": { - "op": "extract_uint64", + "1406": { + "op": "bury 4", "defined_out": [ "entry#0", - "values%0#1" + "event_type#0", + "max_event_count#0", + "processed_events#0", + "tmp%0#1", + "values%0#0" ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -3076,21 +3341,21 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "values%0#1" + "tmp%0#1" ] }, - "1342": { - "op": "intc_0 // 0", + "1408": { + "op": "bnz fund_due_cashflows_bool_true@52", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -3098,28 +3363,20 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "values%0#1", - "0" + "max_event_count#0" ] }, - "1343": { - "op": "bytec_2 // \"event_cursor\"", - "defined_out": [ - "\"event_cursor\"", - "0", - "entry#0", - "values%0#1" - ], + "1411": { + "op": "dig 14", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -3127,29 +3384,30 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "values%0#1", - "0", - "\"event_cursor\"" + "event_type#0" ] }, - "1344": { - "op": "app_global_get_ex", + "1413": { + "op": "pushint 3", "defined_out": [ + "3", "entry#0", - "maybe_exists%0#0", - "maybe_value%0#0", - "values%0#1" + "event_type#0", + "max_event_count#0", + "processed_events#0", + "tmp%0#1", + "values%0#0" ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -3157,24 +3415,31 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "values%0#1", - "maybe_value%0#0", - "maybe_exists%0#0" + "event_type#0", + "3" ] }, - "1345": { - "error": "check self.event_cursor exists", - "op": "assert // check self.event_cursor exists", + "1415": { + "op": "==", + "defined_out": [ + "entry#0", + "event_type#0", + "max_event_count#0", + "processed_events#0", + "tmp%0#1", + "tmp%1#4", + "values%0#0" + ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -3182,26 +3447,21 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "values%0#1", - "maybe_value%0#0" + "tmp%1#4" ] }, - "1346": { - "op": "==", - "defined_out": [ - "entry#0", - "tmp%0#2" - ], + "1416": { + "op": "bnz fund_due_cashflows_bool_true@52", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -3209,22 +3469,20 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "tmp%0#2" + "max_event_count#0" ] }, - "1347": { - "error": "Invalid event cursor", - "op": "assert // Invalid event cursor", + "1419": { + "op": "dig 14", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -3232,24 +3490,30 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" + "event_type#0" ] }, - "1348": { - "op": "dig 4", + "1421": { + "op": "pushint 19", "defined_out": [ + "19", "entry#0", + "event_type#0", + "max_event_count#0", + "processed_events#0", + "tmp%0#1", "values%0#0" ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -3257,26 +3521,31 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "values%0#0" + "event_type#0", + "19" ] }, - "1350": { - "op": "global LatestTimestamp", + "1423": { + "op": "==", "defined_out": [ "entry#0", - "tmp%1#2", + "event_type#0", + "max_event_count#0", + "processed_events#0", + "tmp%0#1", + "tmp%2#2", "values%0#0" ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -3284,27 +3553,21 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "values%0#0", - "tmp%1#2" + "tmp%2#2" ] }, - "1352": { - "op": "<=", - "defined_out": [ - "entry#0", - "tmp%2#0", - "values%0#0" - ], + "1424": { + "op": "bz fund_due_cashflows_bool_false@53", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -3312,22 +3575,20 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "tmp%2#0" + "max_event_count#0" ] }, - "1353": { - "error": "No due cashflow to pay", - "op": "assert // No due cashflow to pay", - "stack_out": [ + "1427": { + "block": "fund_due_cashflows_bool_true@52", + "stack_in": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -3335,25 +3596,21 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" - ] - }, - "1354": { - "op": "dig 5", + "max_event_count#0" + ], + "op": "intc_1 // 1", "defined_out": [ - "entry#0", - "tmp%0#1", - "values%0#0" + "or_result%0#0" ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -3361,21 +3618,21 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "tmp%0#1" + "or_result%0#0" ] }, - "1356": { - "op": "bnz fund_due_cashflows_after_if_else@13", - "stack_out": [ + "1428": { + "block": "fund_due_cashflows_bool_merge@54", + "stack_in": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -3383,26 +3640,44 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", + "or_result%0#0" + ], + "op": "bz fund_due_cashflows_after_while@11", + "defined_out": [], + "stack_out": [ + "entry#0", + "event_type#0", "funded_interest#0", - "funded_principal#0" + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" ] }, - "1359": { - "op": "dig 14", + "1431": { + "op": "dig 15", "defined_out": [ - "entry#0", - "event_type#0", - "tmp%0#1", - "values%0#0" + "entry#0" ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -3410,28 +3685,25 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "event_type#0" + "entry#0" ] }, - "1361": { - "op": "pushint 19", + "1433": { + "op": "intc_0 // 0", "defined_out": [ - "19", - "entry#0", - "event_type#0", - "tmp%0#1", - "values%0#0" + "0", + "entry#0" ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -3439,22 +3711,26 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "event_type#0", - "19" + "entry#0", + "0" ] }, - "1363": { - "op": "==", + "1434": { + "op": "extract_uint64", + "defined_out": [ + "entry#0", + "values%0#1" + ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -3462,21 +3738,21 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "tmp%2#0" + "values%0#1" ] }, - "1364": { - "op": "bnz fund_due_cashflows_after_if_else@13", + "1435": { + "op": "intc_0 // 0", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -3484,27 +3760,28 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" + "values%0#1", + "0" ] }, - "1367": { - "op": "intc_0 // 0", + "1436": { + "op": "bytec_2 // \"event_cursor\"", "defined_out": [ + "\"event_cursor\"", + "0", "entry#0", - "event_type#0", - "interest_amount_due#0", - "tmp%0#1", - "values%0#0" + "values%0#1" ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -3512,28 +3789,29 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "interest_amount_due#0" + "values%0#1", + "0", + "\"event_cursor\"" ] }, - "1368": { - "op": "bury 13", + "1437": { + "op": "app_global_get_ex", "defined_out": [ "entry#0", - "event_type#0", - "interest_amount_due#0", - "tmp%0#1", - "values%0#0" + "maybe_exists%0#0", + "maybe_value%0#0", + "values%0#1" ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -3541,20 +3819,24 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" + "values%0#1", + "maybe_value%0#0", + "maybe_exists%0#0" ] }, - "1370": { - "block": "fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_interest_amount@14", - "stack_in": [ + "1438": { + "error": "check self.event_cursor exists", + "op": "assert // check self.event_cursor exists", + "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -3562,21 +3844,26 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" - ], - "op": "dig 15", + "values%0#1", + "maybe_value%0#0" + ] + }, + "1439": { + "op": "==", "defined_out": [ - "entry#0" + "entry#0", + "tmp%0#2" ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -3584,25 +3871,22 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "entry#0" + "tmp%0#2" ] }, - "1372": { - "op": "intc_2 // 8", - "defined_out": [ - "8", - "entry#0" - ], + "1440": { + "error": "Invalid event cursor", + "op": "assert // Invalid event cursor", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -3610,26 +3894,24 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "entry#0", - "8" + "max_event_count#0" ] }, - "1373": { - "op": "getbyte", + "1441": { + "op": "dig 1", "defined_out": [ "entry#0", - "event_type#0" + "values%0#0" ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -3637,21 +3919,26 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "event_type#0" + "values%0#0" ] }, - "1374": { - "op": "dup", + "1443": { + "op": "global LatestTimestamp", + "defined_out": [ + "entry#0", + "tmp%1#1", + "values%0#0" + ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -3659,26 +3946,27 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "event_type#0", - "event_type#0" + "values%0#0", + "tmp%1#1" ] }, - "1375": { - "op": "bury 16", + "1445": { + "op": "<=", "defined_out": [ "entry#0", - "event_type#0" + "tmp%2#2", + "values%0#0" ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -3686,26 +3974,22 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "event_type#0" + "tmp%2#2" ] }, - "1377": { - "op": "pushint 3", - "defined_out": [ - "3", - "entry#0", - "event_type#0" - ], + "1446": { + "error": "No due cashflow to pay", + "op": "assert // No due cashflow to pay", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -3713,27 +3997,25 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "event_type#0", - "3" + "max_event_count#0" ] }, - "1379": { - "op": "==", + "1447": { + "op": "dig 2", "defined_out": [ "entry#0", - "event_type#0", - "tmp%1#1" + "tmp%0#1", + "values%0#0" ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -3741,21 +4023,21 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "tmp%1#1" + "tmp%0#1" ] }, - "1380": { - "op": "bnz fund_due_cashflows_after_if_else@17", + "1449": { + "op": "bnz fund_due_cashflows_after_if_else@15", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -3763,20 +4045,26 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" + "max_event_count#0" ] }, - "1383": { + "1452": { "op": "dig 14", + "defined_out": [ + "entry#0", + "event_type#0", + "tmp%0#1", + "values%0#0" + ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -3784,26 +4072,28 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "event_type#0" ] }, - "1385": { + "1454": { "op": "pushint 19", "defined_out": [ "19", "entry#0", - "event_type#0" + "event_type#0", + "tmp%0#1", + "values%0#0" ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -3811,27 +4101,22 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "event_type#0", "19" ] }, - "1387": { + "1456": { "op": "==", - "defined_out": [ - "entry#0", - "event_type#0", - "tmp%2#0" - ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -3839,21 +4124,21 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "tmp%2#0" + "tmp%2#2" ] }, - "1388": { - "op": "bnz fund_due_cashflows_after_if_else@17", + "1457": { + "op": "bnz fund_due_cashflows_after_if_else@15", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -3861,25 +4146,27 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" + "max_event_count#0" ] }, - "1391": { + "1460": { "op": "intc_0 // 0", "defined_out": [ "entry#0", "event_type#0", - "principal_amount_due#0" + "interest_amount_due#0", + "tmp%0#1", + "values%0#0" ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -3887,26 +4174,28 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "principal_amount_due#0" + "interest_amount_due#0" ] }, - "1392": { - "op": "bury 8", + "1461": { + "op": "bury 11", "defined_out": [ "entry#0", "event_type#0", - "principal_amount_due#0" + "interest_amount_due#0", + "tmp%0#1", + "values%0#0" ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -3914,20 +4203,20 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" + "max_event_count#0" ] }, - "1394": { - "block": "fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@26", + "1463": { + "block": "fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_interest_amount@16", "stack_in": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -3935,13 +4224,11 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" + "max_event_count#0" ], "op": "dig 15", "defined_out": [ @@ -3950,6 +4237,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -3957,25 +4246,25 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "entry#0" ] }, - "1396": { - "op": "pushint 49", + "1465": { + "op": "intc_2 // 8", "defined_out": [ - "49", + "8", "entry#0" ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -3983,26 +4272,26 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "entry#0", - "49" + "8" ] }, - "1398": { - "op": "extract_uint64", + "1466": { + "op": "getbyte", "defined_out": [ "entry#0", - "next_outstanding_principal#0" + "event_type#0" ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -4010,25 +4299,21 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "next_outstanding_principal#0" + "event_type#0" ] }, - "1399": { - "op": "bury 10", - "defined_out": [ - "entry#0", - "next_outstanding_principal#0" - ], + "1467": { + "op": "dup", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -4036,26 +4321,26 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" + "event_type#0", + "event_type#0" ] }, - "1401": { - "callsub": "modules.actus_kernel.ActusKernelModule._is_dynamic_annuity", - "op": "callsub _is_dynamic_annuity", + "1468": { + "op": "bury 16", "defined_out": [ "entry#0", - "next_outstanding_principal#0", - "tmp%3#2" + "event_type#0" ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -4063,21 +4348,26 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "tmp%3#2" + "event_type#0" ] }, - "1404": { - "op": "bnz fund_due_cashflows_if_body@27", + "1470": { + "op": "pushint 3", + "defined_out": [ + "3", + "entry#0", + "event_type#0" + ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -4085,25 +4375,27 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" + "event_type#0", + "3" ] }, - "1407": { - "op": "dig 9", + "1472": { + "op": "==", "defined_out": [ "entry#0", - "next_interest_base#2", - "next_outstanding_principal#0" + "event_type#0", + "tmp%1#4" ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -4111,26 +4403,21 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "next_interest_base#2" + "tmp%1#4" ] }, - "1409": { - "op": "bury 11", - "defined_out": [ - "entry#0", - "next_interest_base#2", - "next_outstanding_principal#0" - ], + "1473": { + "op": "bnz fund_due_cashflows_after_if_else@19", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -4138,20 +4425,20 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" + "max_event_count#0" ] }, - "1411": { - "block": "fund_due_cashflows_after_if_else@36", - "stack_in": [ + "1476": { + "op": "dig 14", + "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -4159,21 +4446,326 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" - ], - "op": "dig 12", + "event_type#0" + ] + }, + "1478": { + "op": "pushint 19", "defined_out": [ - "interest_amount_due#0" - ], + "19", + "entry#0", + "event_type#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "event_type#0", + "19" + ] + }, + "1480": { + "op": "==", + "defined_out": [ + "entry#0", + "event_type#0", + "tmp%2#2" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "tmp%2#2" + ] + }, + "1481": { + "op": "bnz fund_due_cashflows_after_if_else@19", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ] + }, + "1484": { + "op": "intc_0 // 0", + "defined_out": [ + "entry#0", + "event_type#0", + "principal_amount_due#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "principal_amount_due#0" + ] + }, + "1485": { + "op": "bury 6", + "defined_out": [ + "entry#0", + "event_type#0", + "principal_amount_due#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ] + }, + "1487": { + "block": "fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@28", + "stack_in": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ], + "op": "dig 15", + "defined_out": [ + "entry#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "entry#0" + ] + }, + "1489": { + "op": "pushint 49", + "defined_out": [ + "49", + "entry#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "entry#0", + "49" + ] + }, + "1491": { + "op": "extract_uint64", + "defined_out": [ + "entry#0", + "next_outstanding_principal#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "next_outstanding_principal#0" + ] + }, + "1492": { + "op": "bury 8", + "defined_out": [ + "entry#0", + "next_outstanding_principal#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ] + }, + "1494": { + "callsub": "modules.actus_kernel.ActusKernelModule._is_dynamic_annuity", + "op": "callsub _is_dynamic_annuity", + "defined_out": [ + "entry#0", + "next_outstanding_principal#0", + "tmp%3#1" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "tmp%3#1" + ] + }, + "1497": { + "op": "bnz fund_due_cashflows_if_body@29", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ] + }, + "1500": { + "op": "dig 7", + "defined_out": [ + "entry#0", + "next_interest_base#2", + "next_outstanding_principal#0" + ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -4181,17 +4773,85 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", + "next_interest_base#2" + ] + }, + "1502": { + "op": "bury 9", + "defined_out": [ + "entry#0", + "next_interest_base#2", + "next_outstanding_principal#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ] + }, + "1504": { + "block": "fund_due_cashflows_after_if_else@38", + "stack_in": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ], + "op": "dig 10", + "defined_out": [ + "interest_amount_due#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", "funded_interest#0", "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", "interest_amount_due#0" ] }, - "1413": { + "1506": { "callsub": "modules.actus_kernel.ActusKernelModule._amount_to_index_delta", "op": "callsub _amount_to_index_delta", "defined_out": [ @@ -4201,6 +4861,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -4208,18 +4870,16 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "interest_index_delta#0" ] }, - "1416": { - "op": "dig 8", + "1509": { + "op": "dig 6", "defined_out": [ "interest_amount_due#0", "interest_index_delta#0", @@ -4228,6 +4888,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -4235,18 +4897,16 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "interest_index_delta#0", "principal_amount_due#0" ] }, - "1418": { + "1511": { "callsub": "modules.actus_kernel.ActusKernelModule._amount_to_index_delta", "op": "callsub _amount_to_index_delta", "defined_out": [ @@ -4258,6 +4918,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -4265,18 +4927,16 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "interest_index_delta#0", "principal_index_delta#0" ] }, - "1421": { + "1514": { "op": "dig 1", "defined_out": [ "interest_amount_due#0", @@ -4288,6 +4948,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -4295,19 +4957,17 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "interest_index_delta#0", "principal_index_delta#0", "interest_index_delta#0 (copy)" ] }, - "1423": { + "1516": { "callsub": "modules.actus_kernel.ActusKernelModule._index_delta_to_amount", "op": "callsub _index_delta_to_amount", "defined_out": [ @@ -4320,6 +4980,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -4327,23 +4989,23 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "interest_index_delta#0", "principal_index_delta#0", "interest_amount#1" ] }, - "1426": { + "1519": { "op": "dup", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -4351,24 +5013,24 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "interest_index_delta#0", "principal_index_delta#0", "interest_amount#1", "interest_amount#1 (copy)" ] }, - "1427": { + "1520": { "op": "cover 2", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -4376,21 +5038,19 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "interest_index_delta#0", "interest_amount#1", "principal_index_delta#0", "interest_amount#1" ] }, - "1429": { - "op": "bury 17", + "1522": { + "op": "bury 15", "defined_out": [ "interest_amount#1", "interest_amount_due#0", @@ -4401,6 +5061,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -4408,19 +5070,17 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "interest_index_delta#0", "interest_amount#1", "principal_index_delta#0" ] }, - "1431": { + "1524": { "op": "dup", "defined_out": [ "interest_amount#1", @@ -4433,6 +5093,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -4440,20 +5102,18 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "interest_index_delta#0", "interest_amount#1", "principal_index_delta#0", "principal_index_delta#0 (copy)" ] }, - "1432": { + "1525": { "callsub": "modules.actus_kernel.ActusKernelModule._index_delta_to_amount", "op": "callsub _index_delta_to_amount", "defined_out": [ @@ -4467,6 +5127,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -4474,24 +5136,24 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "interest_index_delta#0", "interest_amount#1", "principal_index_delta#0", "principal_amount#1" ] }, - "1435": { + "1528": { "op": "dup", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -4499,13 +5161,11 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "interest_index_delta#0", "interest_amount#1", "principal_index_delta#0", @@ -4513,8 +5173,8 @@ "principal_amount#1" ] }, - "1436": { - "op": "bury 13", + "1529": { + "op": "bury 11", "defined_out": [ "interest_amount#1", "interest_amount_due#0", @@ -4526,6 +5186,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -4533,20 +5195,18 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "interest_index_delta#0", "interest_amount#1", "principal_index_delta#0", "principal_amount#1" ] }, - "1438": { + "1531": { "op": "dig 2", "defined_out": [ "interest_amount#1", @@ -4560,6 +5220,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -4567,13 +5229,11 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "interest_index_delta#0", "interest_amount#1", "principal_index_delta#0", @@ -4581,7 +5241,7 @@ "interest_amount#1 (copy)" ] }, - "1440": { + "1533": { "op": "dig 1", "defined_out": [ "interest_amount#1", @@ -4596,6 +5256,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -4603,13 +5265,11 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "interest_index_delta#0", "interest_amount#1", "principal_index_delta#0", @@ -4618,7 +5278,7 @@ "principal_amount#1 (copy)" ] }, - "1442": { + "1535": { "op": "+", "defined_out": [ "interest_amount#1", @@ -4632,6 +5292,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -4639,13 +5301,11 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "interest_index_delta#0", "interest_amount#1", "principal_index_delta#0", @@ -4653,11 +5313,13 @@ "required_amount#0" ] }, - "1443": { + "1536": { "op": "dup", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -4665,13 +5327,11 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "interest_index_delta#0", "interest_amount#1", "principal_index_delta#0", @@ -4680,8 +5340,8 @@ "required_amount#0" ] }, - "1444": { - "op": "bury 12", + "1537": { + "op": "bury 9", "defined_out": [ "interest_amount#1", "interest_amount_due#0", @@ -4694,6 +5354,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -4701,13 +5363,11 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "interest_index_delta#0", "interest_amount#1", "principal_index_delta#0", @@ -4715,7 +5375,7 @@ "required_amount#0" ] }, - "1446": { + "1539": { "op": "global CurrentApplicationAddress", "defined_out": [ "interest_amount#1", @@ -4730,6 +5390,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -4737,13 +5399,11 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "interest_index_delta#0", "interest_amount#1", "principal_index_delta#0", @@ -4752,11 +5412,13 @@ "tmp%0#3" ] }, - "1448": { + "1541": { "op": "intc_0 // 0", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -4764,13 +5426,11 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "interest_index_delta#0", "interest_amount#1", "principal_index_delta#0", @@ -4780,7 +5440,7 @@ "0" ] }, - "1449": { + "1542": { "op": "bytec 19 // \"settlement_asset_id\"", "defined_out": [ "\"settlement_asset_id\"", @@ -4797,6 +5457,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -4804,13 +5466,11 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "interest_index_delta#0", "interest_amount#1", "principal_index_delta#0", @@ -4821,7 +5481,7 @@ "\"settlement_asset_id\"" ] }, - "1451": { + "1544": { "op": "app_global_get_ex", "defined_out": [ "interest_amount#1", @@ -4838,6 +5498,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -4845,13 +5507,11 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "interest_index_delta#0", "interest_amount#1", "principal_index_delta#0", @@ -4862,12 +5522,14 @@ "maybe_exists%0#0" ] }, - "1452": { + "1545": { "error": "check self.settlement_asset_id exists", "op": "assert // check self.settlement_asset_id exists", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -4875,13 +5537,11 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "interest_index_delta#0", "interest_amount#1", "principal_index_delta#0", @@ -4891,7 +5551,7 @@ "maybe_value%0#0" ] }, - "1453": { + "1546": { "op": "asset_holding_get AssetBalance", "defined_out": [ "balance#0", @@ -4907,6 +5567,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -4914,13 +5576,11 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "interest_index_delta#0", "interest_amount#1", "principal_index_delta#0", @@ -4930,12 +5590,14 @@ "check%0#0" ] }, - "1455": { + "1548": { "error": "account opted into asset", "op": "assert // account opted into asset", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -4943,13 +5605,11 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "interest_index_delta#0", "interest_amount#1", "principal_index_delta#0", @@ -4958,11 +5618,13 @@ "balance#0" ] }, - "1456": { + "1549": { "op": "intc_0 // 0", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -4970,13 +5632,11 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "interest_index_delta#0", "interest_amount#1", "principal_index_delta#0", @@ -4986,7 +5646,7 @@ "0" ] }, - "1457": { + "1550": { "op": "bytec 15 // \"reserved_interest\"", "defined_out": [ "\"reserved_interest\"", @@ -5003,6 +5663,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -5010,13 +5672,11 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "interest_index_delta#0", "interest_amount#1", "principal_index_delta#0", @@ -5027,11 +5687,13 @@ "\"reserved_interest\"" ] }, - "1459": { + "1552": { "op": "app_global_get_ex", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -5039,13 +5701,11 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "interest_index_delta#0", "interest_amount#1", "principal_index_delta#0", @@ -5056,12 +5716,14 @@ "maybe_exists%0#0" ] }, - "1460": { + "1553": { "error": "check self.reserved_interest exists", "op": "assert // check self.reserved_interest exists", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -5069,13 +5731,11 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "interest_index_delta#0", "interest_amount#1", "principal_index_delta#0", @@ -5085,11 +5745,13 @@ "maybe_value%0#0" ] }, - "1461": { + "1554": { "op": "intc_0 // 0", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -5097,13 +5759,11 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "interest_index_delta#0", "interest_amount#1", "principal_index_delta#0", @@ -5114,8 +5774,8 @@ "0" ] }, - "1462": { - "op": "bytec 11 // \"reserved_principal\"", + "1555": { + "op": "bytec 12 // \"reserved_principal\"", "defined_out": [ "\"reserved_principal\"", "0", @@ -5132,6 +5792,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -5139,13 +5801,11 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "interest_index_delta#0", "interest_amount#1", "principal_index_delta#0", @@ -5157,7 +5817,7 @@ "\"reserved_principal\"" ] }, - "1464": { + "1557": { "op": "app_global_get_ex", "defined_out": [ "balance#0", @@ -5175,6 +5835,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -5182,13 +5844,11 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "interest_index_delta#0", "interest_amount#1", "principal_index_delta#0", @@ -5200,12 +5860,14 @@ "maybe_exists%1#0" ] }, - "1465": { + "1558": { "error": "check self.reserved_principal exists", "op": "assert // check self.reserved_principal exists", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -5213,13 +5875,11 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "interest_index_delta#0", "interest_amount#1", "principal_index_delta#0", @@ -5230,7 +5890,7 @@ "maybe_value%1#0" ] }, - "1466": { + "1559": { "op": "dig 1", "defined_out": [ "balance#0", @@ -5248,6 +5908,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -5255,13 +5917,11 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "interest_index_delta#0", "interest_amount#1", "principal_index_delta#0", @@ -5273,7 +5933,7 @@ "maybe_value%0#0 (copy)" ] }, - "1468": { + "1561": { "op": "+", "defined_out": [ "balance#0", @@ -5290,6 +5950,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -5297,13 +5959,11 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "interest_index_delta#0", "interest_amount#1", "principal_index_delta#0", @@ -5314,7 +5974,7 @@ "reserved_total#0" ] }, - "1469": { + "1562": { "op": "dig 2", "defined_out": [ "balance#0", @@ -5332,6 +5992,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -5339,13 +6001,11 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "interest_index_delta#0", "interest_amount#1", "principal_index_delta#0", @@ -5357,7 +6017,7 @@ "balance#0 (copy)" ] }, - "1471": { + "1564": { "op": "dig 1", "defined_out": [ "balance#0", @@ -5376,6 +6036,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -5383,13 +6045,11 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "interest_index_delta#0", "interest_amount#1", "principal_index_delta#0", @@ -5402,7 +6062,7 @@ "reserved_total#0 (copy)" ] }, - "1473": { + "1566": { "op": ">=", "defined_out": [ "balance#0", @@ -5415,11 +6075,13 @@ "principal_index_delta#0", "required_amount#0", "reserved_total#0", - "tmp%2#0" + "tmp%2#2" ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -5427,13 +6089,11 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "interest_index_delta#0", "interest_amount#1", "principal_index_delta#0", @@ -5442,15 +6102,17 @@ "balance#0", "maybe_value%0#0", "reserved_total#0", - "tmp%2#0" + "tmp%2#2" ] }, - "1474": { + "1567": { "error": "Not enough funds for the payment", "op": "assert // Not enough funds for the payment", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -5458,13 +6120,11 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "interest_index_delta#0", "interest_amount#1", "principal_index_delta#0", @@ -5475,11 +6135,13 @@ "reserved_total#0" ] }, - "1475": { + "1568": { "op": "uncover 2", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -5487,13 +6149,11 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "interest_index_delta#0", "interest_amount#1", "principal_index_delta#0", @@ -5504,11 +6164,13 @@ "balance#0" ] }, - "1477": { + "1570": { "op": "swap", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -5516,13 +6178,11 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "interest_index_delta#0", "interest_amount#1", "principal_index_delta#0", @@ -5533,7 +6193,7 @@ "reserved_total#0" ] }, - "1478": { + "1571": { "op": "-", "defined_out": [ "interest_amount#1", @@ -5544,11 +6204,13 @@ "principal_amount_due#0", "principal_index_delta#0", "required_amount#0", - "tmp%3#1" + "tmp%3#3" ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -5556,27 +6218,27 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "interest_index_delta#0", "interest_amount#1", "principal_index_delta#0", "principal_amount#1", "required_amount#0", "maybe_value%0#0", - "tmp%3#1" + "tmp%3#3" ] }, - "1479": { + "1572": { "op": "uncover 2", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -5584,23 +6246,21 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "interest_index_delta#0", "interest_amount#1", "principal_index_delta#0", "principal_amount#1", "maybe_value%0#0", - "tmp%3#1", + "tmp%3#3", "required_amount#0" ] }, - "1481": { + "1574": { "op": ">=", "defined_out": [ "interest_amount#1", @@ -5611,11 +6271,13 @@ "principal_amount_due#0", "principal_index_delta#0", "required_amount#0", - "tmp%15#0" + "tmp%15#1" ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -5623,27 +6285,27 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "interest_index_delta#0", "interest_amount#1", "principal_index_delta#0", "principal_amount#1", "maybe_value%0#0", - "tmp%15#0" + "tmp%15#1" ] }, - "1482": { + "1575": { "error": "Not enough funds for the payment", "op": "assert // Not enough funds for the payment", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -5651,13 +6313,11 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "interest_index_delta#0", "interest_amount#1", "principal_index_delta#0", @@ -5665,11 +6325,13 @@ "maybe_value%0#0" ] }, - "1483": { + "1576": { "op": "uncover 3", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -5677,13 +6339,11 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "interest_index_delta#0", "principal_index_delta#0", "principal_amount#1", @@ -5691,7 +6351,7 @@ "interest_amount#1" ] }, - "1485": { + "1578": { "op": "+", "defined_out": [ "interest_amount#1", @@ -5701,11 +6361,13 @@ "principal_amount_due#0", "principal_index_delta#0", "required_amount#0", - "tmp%16#0" + "tmp%16#1" ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -5713,24 +6375,24 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "interest_index_delta#0", "principal_index_delta#0", "principal_amount#1", - "tmp%16#0" + "tmp%16#1" ] }, - "1486": { + "1579": { "op": "bytec 15 // \"reserved_interest\"", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -5738,25 +6400,25 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "interest_index_delta#0", "principal_index_delta#0", "principal_amount#1", - "tmp%16#0", + "tmp%16#1", "\"reserved_interest\"" ] }, - "1488": { + "1581": { "op": "swap", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -5764,25 +6426,25 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "interest_index_delta#0", "principal_index_delta#0", "principal_amount#1", "\"reserved_interest\"", - "tmp%16#0" + "tmp%16#1" ] }, - "1489": { + "1582": { "op": "app_global_put", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -5790,23 +6452,23 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "interest_index_delta#0", "principal_index_delta#0", "principal_amount#1" ] }, - "1490": { + "1583": { "op": "intc_0 // 0", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -5814,24 +6476,24 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "interest_index_delta#0", "principal_index_delta#0", "principal_amount#1", "0" ] }, - "1491": { - "op": "bytec 11 // \"reserved_principal\"", + "1584": { + "op": "bytec 12 // \"reserved_principal\"", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -5839,13 +6501,11 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "interest_index_delta#0", "principal_index_delta#0", "principal_amount#1", @@ -5853,7 +6513,7 @@ "\"reserved_principal\"" ] }, - "1493": { + "1586": { "op": "app_global_get_ex", "defined_out": [ "interest_amount#1", @@ -5869,6 +6529,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -5876,13 +6538,11 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "interest_index_delta#0", "principal_index_delta#0", "principal_amount#1", @@ -5890,12 +6550,14 @@ "maybe_exists%5#0" ] }, - "1494": { + "1587": { "error": "check self.reserved_principal exists", "op": "assert // check self.reserved_principal exists", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -5903,20 +6565,18 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "interest_index_delta#0", "principal_index_delta#0", "principal_amount#1", "maybe_value%5#0" ] }, - "1495": { + "1588": { "op": "+", "defined_out": [ "interest_amount#1", @@ -5931,6 +6591,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -5938,23 +6600,23 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "interest_index_delta#0", "principal_index_delta#0", "tmp%17#0" ] }, - "1496": { - "op": "bytec 11 // \"reserved_principal\"", + "1589": { + "op": "bytec 12 // \"reserved_principal\"", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -5962,24 +6624,24 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "interest_index_delta#0", "principal_index_delta#0", "tmp%17#0", "\"reserved_principal\"" ] }, - "1498": { + "1591": { "op": "swap", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -5987,24 +6649,24 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "interest_index_delta#0", "principal_index_delta#0", "\"reserved_principal\"", "tmp%17#0" ] }, - "1499": { + "1592": { "op": "app_global_put", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -6012,22 +6674,22 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "interest_index_delta#0", "principal_index_delta#0" ] }, - "1500": { + "1593": { "op": "intc_0 // 0", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -6035,19 +6697,17 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "interest_index_delta#0", "principal_index_delta#0", "0" ] }, - "1501": { + "1594": { "op": "bytec 16 // \"cumulative_interest_index\"", "defined_out": [ "\"cumulative_interest_index\"", @@ -6063,6 +6723,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -6070,20 +6732,18 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "interest_index_delta#0", "principal_index_delta#0", "0", "\"cumulative_interest_index\"" ] }, - "1503": { + "1596": { "op": "app_global_get_ex", "defined_out": [ "interest_amount#1", @@ -6099,6 +6759,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -6106,25 +6768,25 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "interest_index_delta#0", "principal_index_delta#0", "maybe_value%6#0", "maybe_exists%6#0" ] }, - "1504": { + "1597": { "error": "check self.cumulative_interest_index exists", "op": "assert // check self.cumulative_interest_index exists", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -6132,23 +6794,23 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "interest_index_delta#0", "principal_index_delta#0", "maybe_value%6#0" ] }, - "1505": { + "1598": { "op": "uncover 2", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -6156,19 +6818,17 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "principal_index_delta#0", "maybe_value%6#0", "interest_index_delta#0" ] }, - "1507": { + "1600": { "op": "+", "defined_out": [ "interest_amount#1", @@ -6182,6 +6842,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -6189,22 +6851,22 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "principal_index_delta#0", "tmp%18#0" ] }, - "1508": { + "1601": { "op": "bytec 16 // \"cumulative_interest_index\"", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -6212,23 +6874,23 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "principal_index_delta#0", "tmp%18#0", "\"cumulative_interest_index\"" ] }, - "1510": { + "1603": { "op": "swap", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -6236,23 +6898,23 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "principal_index_delta#0", "\"cumulative_interest_index\"", "tmp%18#0" ] }, - "1511": { + "1604": { "op": "app_global_put", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -6260,21 +6922,21 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "principal_index_delta#0" ] }, - "1512": { + "1605": { "op": "intc_0 // 0", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -6282,18 +6944,16 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "principal_index_delta#0", "0" ] }, - "1513": { + "1606": { "op": "bytec 17 // \"cumulative_principal_index\"", "defined_out": [ "\"cumulative_principal_index\"", @@ -6308,6 +6968,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -6315,19 +6977,17 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "principal_index_delta#0", "0", "\"cumulative_principal_index\"" ] }, - "1515": { + "1608": { "op": "app_global_get_ex", "defined_out": [ "interest_amount#1", @@ -6342,6 +7002,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -6349,24 +7011,24 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "principal_index_delta#0", "maybe_value%7#0", "maybe_exists%7#0" ] }, - "1516": { + "1609": { "error": "check self.cumulative_principal_index exists", "op": "assert // check self.cumulative_principal_index exists", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -6374,18 +7036,16 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "principal_index_delta#0", "maybe_value%7#0" ] }, - "1517": { + "1610": { "op": "+", "defined_out": [ "interest_amount#1", @@ -6398,6 +7058,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -6405,21 +7067,21 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "tmp%19#0" ] }, - "1518": { + "1611": { "op": "bytec 17 // \"cumulative_principal_index\"", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -6427,22 +7089,22 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "tmp%19#0", "\"cumulative_principal_index\"" ] }, - "1520": { + "1613": { "op": "swap", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -6450,22 +7112,22 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "\"cumulative_principal_index\"", "tmp%19#0" ] }, - "1521": { + "1614": { "op": "app_global_put", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -6473,16 +7135,14 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" + "max_event_count#0" ] }, - "1522": { + "1615": { "op": "dig 15", "defined_out": [ "entry#0", @@ -6495,6 +7155,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -6502,17 +7164,15 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "entry#0" ] }, - "1524": { + "1617": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -6526,6 +7186,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -6533,18 +7195,16 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "entry#0", "8" ] }, - "1525": { + "1618": { "op": "getbyte", "defined_out": [ "entry#0", @@ -6558,6 +7218,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -6565,17 +7227,15 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "tmp%20#0" ] }, - "1526": { + "1619": { "op": "pushint 3", "defined_out": [ "3", @@ -6590,6 +7250,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -6597,18 +7259,16 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "tmp%20#0", "3" ] }, - "1528": { + "1621": { "op": "==", "defined_out": [ "entry#0", @@ -6622,6 +7282,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -6629,21 +7291,21 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "tmp%21#0" ] }, - "1529": { - "op": "bz fund_due_cashflows_else_body@38", + "1622": { + "op": "bz fund_due_cashflows_else_body@40", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -6651,20 +7313,20 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" + "max_event_count#0" ] }, - "1532": { + "1625": { "op": "intc_0 // 0", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -6672,17 +7334,15 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "0" ] }, - "1533": { + "1626": { "op": "bytec 6 // \"accrued_interest\"", "defined_out": [ "\"accrued_interest\"", @@ -6697,6 +7357,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -6704,18 +7366,16 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "0", "\"accrued_interest\"" ] }, - "1535": { + "1628": { "op": "app_global_get_ex", "defined_out": [ "entry#0", @@ -6730,6 +7390,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -6737,23 +7399,23 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "maybe_value%8#0", "maybe_exists%8#0" ] }, - "1536": { + "1629": { "error": "check self.accrued_interest exists", "op": "assert // check self.accrued_interest exists", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -6761,21 +7423,21 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "maybe_value%8#0" ] }, - "1537": { + "1630": { "op": "dig 16", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -6783,18 +7445,16 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "maybe_value%8#0", "entry#0" ] }, - "1539": { + "1632": { "callsub": "modules.actus_kernel.ActusKernelModule._entry_interest_segment", "op": "callsub _entry_interest_segment", "defined_out": [ @@ -6810,6 +7470,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -6817,19 +7479,17 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "maybe_value%8#0", "_entry_interest_segment%0#0", "entry#0" ] }, - "1542": { + "1635": { "op": "bury 18", "defined_out": [ "_entry_interest_segment%0#0", @@ -6844,6 +7504,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -6851,18 +7513,16 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "maybe_value%8#0", "_entry_interest_segment%0#0" ] }, - "1544": { + "1637": { "op": "+", "defined_out": [ "entry#0", @@ -6876,6 +7536,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -6883,21 +7545,21 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "tmp%22#0" ] }, - "1545": { + "1638": { "op": "bytec 6 // \"accrued_interest\"", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -6905,22 +7567,22 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "tmp%22#0", "\"accrued_interest\"" ] }, - "1547": { + "1640": { "op": "swap", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -6928,22 +7590,22 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "\"accrued_interest\"", "tmp%22#0" ] }, - "1548": { + "1641": { "op": "app_global_put", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -6951,20 +7613,20 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" + "max_event_count#0" ] }, - "1549": { - "block": "fund_due_cashflows_after_if_else@39", + "1642": { + "block": "fund_due_cashflows_after_if_else@41", "stack_in": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -6972,13 +7634,11 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" + "max_event_count#0" ], "callsub": "modules.actus_kernel.ActusKernelModule._is_dynamic_annuity", "op": "callsub _is_dynamic_annuity", @@ -6988,6 +7648,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -6995,21 +7657,21 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "tmp%23#0" ] }, - "1552": { - "op": "bz fund_due_cashflows_if_body@41", + "1645": { + "op": "bz fund_due_cashflows_if_body@43", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -7017,16 +7679,14 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" + "max_event_count#0" ] }, - "1555": { + "1648": { "op": "dig 15", "defined_out": [ "entry#0" @@ -7034,6 +7694,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -7041,17 +7703,15 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "entry#0" ] }, - "1557": { + "1650": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -7060,6 +7720,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -7067,18 +7729,16 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "entry#0", "8" ] }, - "1558": { + "1651": { "op": "getbyte", "defined_out": [ "entry#0", @@ -7087,6 +7747,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -7094,17 +7756,15 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "tmp%24#0" ] }, - "1559": { + "1652": { "op": "pushint 19", "defined_out": [ "19", @@ -7114,6 +7774,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -7121,18 +7783,16 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "tmp%24#0", "19" ] }, - "1561": { + "1654": { "op": "==", "defined_out": [ "entry#0", @@ -7141,6 +7801,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -7148,21 +7810,21 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "tmp%25#0" ] }, - "1562": { - "op": "bz fund_due_cashflows_after_if_else@42", + "1655": { + "op": "bz fund_due_cashflows_after_if_else@44", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -7170,20 +7832,20 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" + "max_event_count#0" ] }, - "1565": { - "block": "fund_due_cashflows_if_body@41", + "1658": { + "block": "fund_due_cashflows_if_body@43", "stack_in": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -7191,13 +7853,11 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" + "max_event_count#0" ], "op": "dig 15", "defined_out": [ @@ -7206,6 +7866,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -7213,17 +7875,15 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "entry#0" ] }, - "1567": { + "1660": { "op": "pushint 41", "defined_out": [ "41", @@ -7232,6 +7892,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -7239,18 +7901,16 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "entry#0", "41" ] }, - "1569": { + "1662": { "op": "extract_uint64", "defined_out": [ "entry#0", @@ -7259,6 +7919,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -7266,17 +7928,15 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "values%4#0" ] }, - "1570": { + "1663": { "op": "bytec 14 // \"next_principal_redemption\"", "defined_out": [ "\"next_principal_redemption\"", @@ -7286,6 +7946,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -7293,22 +7955,22 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "values%4#0", "\"next_principal_redemption\"" ] }, - "1572": { + "1665": { "op": "swap", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -7316,22 +7978,22 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "\"next_principal_redemption\"", "values%4#0" ] }, - "1573": { + "1666": { "op": "app_global_put", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -7339,20 +8001,20 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" + "max_event_count#0" ] }, - "1574": { - "block": "fund_due_cashflows_after_if_else@42", + "1667": { + "block": "fund_due_cashflows_after_if_else@44", "stack_in": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -7360,21 +8022,21 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" + "max_event_count#0" ], - "op": "bytec_3 // \"outstanding_principal\"", + "op": "bytec 4 // \"outstanding_principal\"", "defined_out": [ "\"outstanding_principal\"" ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -7382,18 +8044,16 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "\"outstanding_principal\"" ] }, - "1575": { - "op": "dig 10", + "1669": { + "op": "dig 8", "defined_out": [ "\"outstanding_principal\"", "next_outstanding_principal#0" @@ -7401,6 +8061,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -7408,22 +8070,22 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "\"outstanding_principal\"", "next_outstanding_principal#0" ] }, - "1577": { + "1671": { "op": "app_global_put", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -7431,16 +8093,14 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" + "max_event_count#0" ] }, - "1578": { + "1672": { "op": "bytec 7 // \"interest_calculation_base\"", "defined_out": [ "\"interest_calculation_base\"", @@ -7449,6 +8109,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -7456,18 +8118,16 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "\"interest_calculation_base\"" ] }, - "1580": { - "op": "dig 11", + "1674": { + "op": "dig 9", "defined_out": [ "\"interest_calculation_base\"", "next_interest_base#2", @@ -7476,6 +8136,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -7483,22 +8145,22 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "\"interest_calculation_base\"", "next_interest_base#2" ] }, - "1582": { + "1676": { "op": "app_global_put", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -7506,16 +8168,14 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" + "max_event_count#0" ] }, - "1583": { + "1677": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -7525,6 +8185,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -7532,17 +8194,15 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "0" ] }, - "1584": { + "1678": { "op": "bytec_2 // \"event_cursor\"", "defined_out": [ "\"event_cursor\"", @@ -7553,6 +8213,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -7560,18 +8222,16 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "0", "\"event_cursor\"" ] }, - "1585": { + "1679": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%9#0", @@ -7582,6 +8242,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -7589,23 +8251,23 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "maybe_value%9#0", "maybe_exists%9#0" ] }, - "1586": { + "1680": { "error": "check self.event_cursor exists", "op": "assert // check self.event_cursor exists", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -7613,17 +8275,15 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "maybe_value%9#0" ] }, - "1587": { + "1681": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -7634,6 +8294,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -7641,18 +8303,16 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "maybe_value%9#0", "1" ] }, - "1588": { + "1682": { "op": "+", "defined_out": [ "next_interest_base#2", @@ -7662,6 +8322,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -7669,21 +8331,21 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "tmp%26#0" ] }, - "1589": { + "1683": { "op": "bytec_2 // \"event_cursor\"", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -7691,22 +8353,22 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "tmp%26#0", "\"event_cursor\"" ] }, - "1590": { + "1684": { "op": "swap", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -7714,22 +8376,22 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "\"event_cursor\"", "tmp%26#0" ] }, - "1591": { + "1685": { "op": "app_global_put", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -7737,16 +8399,14 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" + "max_event_count#0" ] }, - "1592": { + "1686": { "op": "dig 15", "defined_out": [ "entry#0", @@ -7756,6 +8416,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -7763,17 +8425,15 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "entry#0" ] }, - "1594": { + "1688": { "op": "extract 8 1", "defined_out": [ "aggregate%extract%10#0", @@ -7784,6 +8444,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -7791,17 +8453,15 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "aggregate%extract%10#0" ] }, - "1597": { + "1691": { "op": "pushbytes 0x13", "defined_out": [ "0x13", @@ -7813,6 +8473,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -7820,18 +8482,16 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "aggregate%extract%10#0", "0x13" ] }, - "1600": { + "1694": { "op": "b==", "defined_out": [ "entry#0", @@ -7842,6 +8502,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -7849,21 +8511,21 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "tmp%27#0" ] }, - "1601": { - "op": "bz fund_due_cashflows_after_if_else@45", + "1695": { + "op": "bz fund_due_cashflows_after_if_else@47", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -7871,20 +8533,20 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" + "max_event_count#0" ] }, - "1604": { + "1698": { "op": "intc_0 // 0", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -7892,21 +8554,21 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "0" ] }, - "1605": { - "op": "bytec_3 // \"outstanding_principal\"", + "1699": { + "op": "bytec 4 // \"outstanding_principal\"", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -7914,18 +8576,16 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "0", "\"outstanding_principal\"" ] }, - "1606": { + "1701": { "op": "app_global_get_ex", "defined_out": [ "entry#0", @@ -7937,6 +8597,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -7944,23 +8606,23 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "maybe_value%10#0", "maybe_exists%10#0" ] }, - "1607": { + "1702": { "error": "check self.outstanding_principal exists", "op": "assert // check self.outstanding_principal exists", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -7968,21 +8630,21 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "maybe_value%10#0" ] }, - "1608": { - "op": "bnz fund_due_cashflows_after_if_else@45", + "1703": { + "op": "bnz fund_due_cashflows_after_if_else@47", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -7990,16 +8652,14 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" + "max_event_count#0" ] }, - "1611": { + "1706": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"", @@ -8010,6 +8670,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -8017,17 +8679,15 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "\"status\"" ] }, - "1612": { + "1707": { "op": "pushint 200", "defined_out": [ "\"status\"", @@ -8039,6 +8699,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -8046,22 +8708,22 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "\"status\"", "200" ] }, - "1615": { + "1710": { "op": "app_global_put", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -8069,20 +8731,20 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" + "max_event_count#0" ] }, - "1616": { + "1711": { "op": "bytec 7 // \"interest_calculation_base\"", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -8090,21 +8752,21 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "\"interest_calculation_base\"" ] }, - "1618": { + "1713": { "op": "intc_0 // 0", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -8112,22 +8774,22 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "\"interest_calculation_base\"", "0" ] }, - "1619": { + "1714": { "op": "app_global_put", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -8135,20 +8797,20 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" + "max_event_count#0" ] }, - "1620": { - "block": "fund_due_cashflows_after_if_else@45", + "1715": { + "block": "fund_due_cashflows_after_if_else@47", "stack_in": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -8156,13 +8818,11 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" + "max_event_count#0" ], "op": "dig 15", "defined_out": [ @@ -8171,6 +8831,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -8178,18 +8840,16 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "entry#0" ] }, - "1622": { - "op": "dig 7", + "1717": { + "op": "dig 4", "defined_out": [ "entry#0", "required_amount#0" @@ -8197,6 +8857,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -8204,18 +8866,16 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "entry#0", "required_amount#0" ] }, - "1624": { + "1719": { "op": "dup", "defined_out": [ "entry#0", @@ -8225,6 +8885,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -8232,24 +8894,24 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "entry#0", "required_amount#0 (copy)", "required_amount#0" ] }, - "1625": { + "1720": { "callsub": "modules.actus_kernel.ActusKernelModule._emit_execution_event", "op": "callsub _emit_execution_event", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -8257,21 +8919,21 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "entry#0" ] }, - "1628": { + "1723": { "op": "pop", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -8279,17 +8941,15 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" + "max_event_count#0" ] }, - "1629": { - "op": "dig 1", + "1724": { + "op": "dig 13", "defined_out": [ "entry#0", "funded_interest#0", @@ -8298,6 +8958,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -8305,18 +8967,16 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "funded_interest#0" ] }, - "1631": { - "op": "dig 14", + "1726": { + "op": "dig 12", "defined_out": [ "entry#0", "funded_interest#0", @@ -8326,6 +8986,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -8333,22 +8995,22 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "funded_interest#0", "interest_amount#1" ] }, - "1633": { + "1728": { "op": "+", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -8356,18 +9018,16 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "funded_interest#0" ] }, - "1634": { - "op": "bury 2", + "1729": { + "op": "bury 14", "defined_out": [ "entry#0", "funded_interest#0", @@ -8377,6 +9037,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -8384,17 +9046,15 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" + "max_event_count#0" ] }, - "1636": { - "op": "dup", + "1731": { + "op": "dig 12", "defined_out": [ "entry#0", "funded_interest#0", @@ -8405,6 +9065,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -8412,18 +9074,16 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "funded_principal#0" ] }, - "1637": { - "op": "dig 9", + "1733": { + "op": "dig 7", "defined_out": [ "entry#0", "funded_interest#0", @@ -8435,6 +9095,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -8442,22 +9104,22 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "funded_principal#0", "principal_amount#1" ] }, - "1639": { + "1735": { "op": "+", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -8465,18 +9127,16 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "funded_principal#0" ] }, - "1640": { - "op": "bury 1", + "1736": { + "op": "bury 13", "defined_out": [ "entry#0", "funded_interest#0", @@ -8488,6 +9148,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -8495,17 +9157,15 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" + "max_event_count#0" ] }, - "1642": { - "op": "dig 2", + "1738": { + "op": "dig 4", "defined_out": [ "entry#0", "funded_interest#0", @@ -8518,6 +9178,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -8525,17 +9187,15 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "processed_events#0" ] }, - "1644": { + "1740": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -8550,6 +9210,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -8557,22 +9219,22 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "processed_events#0", "1" ] }, - "1645": { + "1741": { "op": "+", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -8580,18 +9242,16 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "processed_events#0" ] }, - "1646": { - "op": "bury 3", + "1742": { + "op": "bury 5", "defined_out": [ "entry#0", "funded_interest#0", @@ -8604,6 +9264,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -8611,23 +9273,23 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" + "max_event_count#0" ] }, - "1648": { - "op": "b fund_due_cashflows_while_top@2" + "1744": { + "op": "b fund_due_cashflows_while_top@4" }, - "1651": { - "block": "fund_due_cashflows_else_body@38", + "1747": { + "block": "fund_due_cashflows_else_body@40", "stack_in": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -8635,13 +9297,11 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" + "max_event_count#0" ], "op": "bytec 6 // \"accrued_interest\"", "defined_out": [ @@ -8650,6 +9310,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -8657,17 +9319,15 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "\"accrued_interest\"" ] }, - "1653": { + "1749": { "op": "intc_0 // 0", "defined_out": [ "\"accrued_interest\"", @@ -8676,6 +9336,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -8683,22 +9345,22 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "\"accrued_interest\"", "0" ] }, - "1654": { + "1750": { "op": "app_global_put", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -8706,23 +9368,23 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" + "max_event_count#0" ] }, - "1655": { - "op": "b fund_due_cashflows_after_if_else@39" + "1751": { + "op": "b fund_due_cashflows_after_if_else@41" }, - "1658": { - "block": "fund_due_cashflows_if_body@27", + "1754": { + "block": "fund_due_cashflows_if_body@29", "stack_in": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -8730,13 +9392,11 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" + "max_event_count#0" ], "op": "dig 15", "defined_out": [ @@ -8745,6 +9405,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -8752,17 +9414,15 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "entry#0" ] }, - "1660": { + "1756": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -8771,6 +9431,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -8778,18 +9440,16 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "entry#0", "8" ] }, - "1661": { + "1757": { "op": "getbyte", "defined_out": [ "entry#0", @@ -8798,6 +9458,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -8805,21 +9467,21 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "event_type#0" ] }, - "1662": { + "1758": { "op": "dup", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -8827,18 +9489,16 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "event_type#0", "event_type#0" ] }, - "1663": { + "1759": { "op": "bury 16", "defined_out": [ "entry#0", @@ -8847,6 +9507,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -8854,17 +9516,15 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "event_type#0" ] }, - "1665": { + "1761": { "op": "pushint 3", "defined_out": [ "3", @@ -8874,6 +9534,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -8881,27 +9543,27 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "event_type#0", "3" ] }, - "1667": { + "1763": { "op": "==", "defined_out": [ "entry#0", "event_type#0", - "tmp%5#1" + "tmp%5#0" ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -8909,21 +9571,21 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "tmp%5#1" + "tmp%5#0" ] }, - "1668": { - "op": "bz fund_due_cashflows_else_body@29", + "1764": { + "op": "bz fund_due_cashflows_else_body@31", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -8931,20 +9593,20 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" + "max_event_count#0" ] }, - "1671": { + "1767": { "op": "intc_0 // 0", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -8952,18 +9614,16 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "0" ] }, - "1672": { - "op": "bytec_3 // \"outstanding_principal\"", + "1768": { + "op": "bytec 4 // \"outstanding_principal\"", "defined_out": [ "\"outstanding_principal\"", "0", @@ -8973,6 +9633,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -8980,18 +9642,16 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "0", "\"outstanding_principal\"" ] }, - "1673": { + "1770": { "op": "app_global_get_ex", "defined_out": [ "entry#0", @@ -9002,6 +9662,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -9009,23 +9671,23 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "maybe_value%1#0", "maybe_exists%1#0" ] }, - "1674": { + "1771": { "error": "check self.outstanding_principal exists", "op": "assert // check self.outstanding_principal exists", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -9033,18 +9695,16 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "maybe_value%1#0" ] }, - "1675": { - "op": "dig 8", + "1772": { + "op": "dig 6", "defined_out": [ "entry#0", "event_type#0", @@ -9054,6 +9714,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -9061,18 +9723,16 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "maybe_value%1#0", "principal_amount_due#0" ] }, - "1677": { + "1774": { "op": "-", "defined_out": [ "entry#0", @@ -9083,6 +9743,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -9090,21 +9752,21 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "next_outstanding_principal#0" ] }, - "1678": { + "1775": { "op": "dup", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -9112,19 +9774,17 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "next_outstanding_principal#0", "next_outstanding_principal#0" ] }, - "1679": { - "op": "bury 11", + "1776": { + "op": "bury 9", "defined_out": [ "entry#0", "event_type#0", @@ -9135,6 +9795,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -9142,18 +9804,16 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "next_interest_base#2" ] }, - "1681": { - "op": "bury 11", + "1778": { + "op": "bury 9", "defined_out": [ "entry#0", "event_type#0", @@ -9164,6 +9824,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -9171,23 +9833,23 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" + "max_event_count#0" ] }, - "1683": { - "op": "b fund_due_cashflows_after_if_else@36" + "1780": { + "op": "b fund_due_cashflows_after_if_else@38" }, - "1686": { - "block": "fund_due_cashflows_else_body@29", + "1783": { + "block": "fund_due_cashflows_else_body@31", "stack_in": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -9195,13 +9857,11 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" + "max_event_count#0" ], "op": "dig 14", "defined_out": [ @@ -9210,6 +9870,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -9217,17 +9879,15 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "event_type#0" ] }, - "1688": { + "1785": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -9236,6 +9896,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -9243,18 +9905,16 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "event_type#0", "8" ] }, - "1689": { + "1786": { "op": "==", "defined_out": [ "event_type#0", @@ -9263,6 +9923,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -9270,21 +9932,21 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "tmp%7#0" ] }, - "1690": { - "op": "bz fund_due_cashflows_else_body@31", + "1787": { + "op": "bz fund_due_cashflows_else_body@33", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -9292,16 +9954,14 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" + "max_event_count#0" ] }, - "1693": { + "1790": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -9310,6 +9970,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -9317,18 +9979,16 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "0" ] }, - "1694": { - "op": "bytec_3 // \"outstanding_principal\"", + "1791": { + "op": "bytec 4 // \"outstanding_principal\"", "defined_out": [ "\"outstanding_principal\"", "0", @@ -9337,6 +9997,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -9344,18 +10006,16 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "0", "\"outstanding_principal\"" ] }, - "1695": { + "1793": { "op": "app_global_get_ex", "defined_out": [ "event_type#0", @@ -9365,6 +10025,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -9372,22 +10034,22 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "next_outstanding_principal#0", "maybe_exists%2#0" ] }, - "1696": { + "1794": { "op": "swap", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -9395,19 +10057,17 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "maybe_exists%2#0", "next_outstanding_principal#0" ] }, - "1697": { - "op": "bury 11", + "1795": { + "op": "bury 9", "defined_out": [ "event_type#0", "maybe_exists%2#0", @@ -9416,29 +10076,31 @@ "stack_out": [ "entry#0", "event_type#0", - "interest_amount#1", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", "interest_amount_due#0", "interest_due#0", "next_interest_base#2", "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "maybe_exists%2#0" ] }, - "1699": { + "1797": { "error": "check self.outstanding_principal exists", "op": "assert // check self.outstanding_principal exists", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -9446,20 +10108,20 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" + "max_event_count#0" ] }, - "1700": { + "1798": { "op": "intc_0 // 0", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -9467,17 +10129,15 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "0" ] }, - "1701": { + "1799": { "op": "bytec 7 // \"interest_calculation_base\"", "defined_out": [ "\"interest_calculation_base\"", @@ -9488,6 +10148,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -9495,18 +10157,16 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "0", "\"interest_calculation_base\"" ] }, - "1703": { + "1801": { "op": "app_global_get_ex", "defined_out": [ "event_type#0", @@ -9517,6 +10177,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -9524,22 +10186,22 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "next_interest_base#2", "maybe_exists%3#0" ] }, - "1704": { + "1802": { "op": "swap", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -9547,19 +10209,17 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "maybe_exists%3#0", "next_interest_base#2" ] }, - "1705": { - "op": "bury 12", + "1803": { + "op": "bury 10", "defined_out": [ "event_type#0", "maybe_exists%3#0", @@ -9569,6 +10229,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -9576,22 +10238,22 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "maybe_exists%3#0" ] }, - "1707": { + "1805": { "error": "check self.interest_calculation_base exists", "op": "assert // check self.interest_calculation_base exists", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -9599,23 +10261,23 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" + "max_event_count#0" ] }, - "1708": { - "op": "b fund_due_cashflows_after_if_else@36" + "1806": { + "op": "b fund_due_cashflows_after_if_else@38" }, - "1711": { - "block": "fund_due_cashflows_else_body@31", + "1809": { + "block": "fund_due_cashflows_else_body@33", "stack_in": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -9623,13 +10285,11 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" + "max_event_count#0" ], "op": "dig 14", "defined_out": [ @@ -9638,6 +10298,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -9645,17 +10307,15 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "event_type#0" ] }, - "1713": { + "1811": { "op": "pushint 19", "defined_out": [ "19", @@ -9664,6 +10324,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -9671,26 +10333,26 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "event_type#0", "19" ] }, - "1715": { + "1813": { "op": "==", "defined_out": [ "event_type#0", - "tmp%8#0" + "tmp%8#1" ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -9698,21 +10360,21 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "tmp%8#0" + "tmp%8#1" ] }, - "1716": { - "op": "bnz fund_due_cashflows_if_body@32", + "1814": { + "op": "bnz fund_due_cashflows_if_body@34", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -9720,17 +10382,15 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" + "max_event_count#0" ] }, - "1719": { - "op": "dig 9", + "1817": { + "op": "dig 7", "defined_out": [ "event_type#0", "next_interest_base#2" @@ -9738,6 +10398,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -9745,18 +10407,16 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "next_interest_base#2" ] }, - "1721": { - "op": "bury 11", + "1819": { + "op": "bury 9", "defined_out": [ "event_type#0", "next_interest_base#2" @@ -9764,6 +10424,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -9771,23 +10433,23 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" + "max_event_count#0" ] }, - "1723": { - "op": "b fund_due_cashflows_after_if_else@36" + "1821": { + "op": "b fund_due_cashflows_after_if_else@38" }, - "1726": { - "block": "fund_due_cashflows_if_body@32", + "1824": { + "block": "fund_due_cashflows_if_body@34", "stack_in": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -9795,13 +10457,11 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" + "max_event_count#0" ], "op": "intc_0 // 0", "defined_out": [ @@ -9810,6 +10470,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -9817,24 +10479,24 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "next_outstanding_principal#0" ] }, - "1727": { - "op": "bury 10", + "1825": { + "op": "bury 8", "defined_out": [ "next_outstanding_principal#0" ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -9842,16 +10504,14 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" + "max_event_count#0" ] }, - "1729": { + "1827": { "op": "intc_0 // 0", "defined_out": [ "next_interest_base#2", @@ -9860,6 +10520,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -9867,18 +10529,16 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "next_interest_base#2" ] }, - "1730": { - "op": "bury 11", + "1828": { + "op": "bury 9", "defined_out": [ "next_interest_base#2", "next_outstanding_principal#0" @@ -9886,6 +10546,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -9893,23 +10555,23 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" + "max_event_count#0" ] }, - "1732": { - "op": "b fund_due_cashflows_after_if_else@36" + "1830": { + "op": "b fund_due_cashflows_after_if_else@38" }, - "1735": { - "block": "fund_due_cashflows_after_if_else@17", + "1833": { + "block": "fund_due_cashflows_after_if_else@19", "stack_in": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -9917,22 +10579,22 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" + "max_event_count#0" ], "callsub": "modules.actus_kernel.ActusKernelModule._is_dynamic_annuity", "op": "callsub _is_dynamic_annuity", "defined_out": [ - "tmp%3#2" + "tmp%3#1" ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -9940,21 +10602,21 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "tmp%3#2" + "tmp%3#1" ] }, - "1738": { - "op": "bz fund_due_cashflows_after_if_else@25", + "1836": { + "op": "bz fund_due_cashflows_after_if_else@27", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -9962,16 +10624,14 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" + "max_event_count#0" ] }, - "1741": { + "1839": { "op": "dig 14", "defined_out": [ "event_type#0" @@ -9979,6 +10639,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -9986,17 +10648,15 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "event_type#0" ] }, - "1743": { + "1841": { "op": "pushint 19", "defined_out": [ "19", @@ -10005,6 +10665,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -10012,18 +10674,16 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "event_type#0", "19" ] }, - "1745": { + "1843": { "op": "==", "defined_out": [ "event_type#0", @@ -10032,6 +10692,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -10039,21 +10701,21 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "tmp%4#0" ] }, - "1746": { - "op": "bz fund_due_cashflows_after_if_else@20", + "1844": { + "op": "bz fund_due_cashflows_after_if_else@22", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -10061,16 +10723,14 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" + "max_event_count#0" ] }, - "1749": { + "1847": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -10079,6 +10739,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -10086,18 +10748,16 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "0" ] }, - "1750": { - "op": "bytec_3 // \"outstanding_principal\"", + "1848": { + "op": "bytec 4 // \"outstanding_principal\"", "defined_out": [ "\"outstanding_principal\"", "0", @@ -10106,6 +10766,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -10113,18 +10775,16 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "0", "\"outstanding_principal\"" ] }, - "1751": { + "1850": { "op": "app_global_get_ex", "defined_out": [ "event_type#0", @@ -10134,6 +10794,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -10141,18 +10803,16 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "maybe_value%0#0", "maybe_exists%0#0" ] }, - "1752": { + "1851": { "error": "check self.outstanding_principal exists", "op": "assert // check self.outstanding_principal exists", "defined_out": [ @@ -10162,6 +10822,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -10169,18 +10831,16 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "principal_amount_due#0" ] }, - "1753": { - "op": "bury 8", + "1852": { + "op": "bury 6", "defined_out": [ "event_type#0", "principal_amount_due#0" @@ -10188,6 +10848,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -10195,23 +10857,23 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" + "max_event_count#0" ] }, - "1755": { - "op": "b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@26" + "1854": { + "op": "b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@28" }, - "1758": { - "block": "fund_due_cashflows_after_if_else@20", + "1857": { + "block": "fund_due_cashflows_after_if_else@22", "stack_in": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -10219,13 +10881,11 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" + "max_event_count#0" ], "op": "intc_0 // 0", "defined_out": [ @@ -10234,6 +10894,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -10241,17 +10903,15 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "0" ] }, - "1759": { + "1858": { "op": "bytec 6 // \"accrued_interest\"", "defined_out": [ "\"accrued_interest\"", @@ -10260,6 +10920,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -10267,18 +10929,16 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "0", "\"accrued_interest\"" ] }, - "1761": { + "1860": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%1#0", @@ -10287,6 +10947,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -10294,23 +10956,23 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "maybe_value%1#0", "maybe_exists%1#0" ] }, - "1762": { + "1861": { "error": "check self.accrued_interest exists", "op": "assert // check self.accrued_interest exists", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -10318,17 +10980,15 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "maybe_value%1#0" ] }, - "1763": { + "1862": { "op": "dig 16", "defined_out": [ "entry#0", @@ -10337,6 +10997,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -10344,18 +11006,16 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "maybe_value%1#0", "entry#0" ] }, - "1765": { + "1864": { "callsub": "modules.actus_kernel.ActusKernelModule._entry_interest_segment", "op": "callsub _entry_interest_segment", "defined_out": [ @@ -10366,6 +11026,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -10373,19 +11035,17 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "maybe_value%1#0", "_entry_interest_segment%0#0", "entry#0" ] }, - "1768": { + "1867": { "op": "bury 18", "defined_out": [ "_entry_interest_segment%0#0", @@ -10395,6 +11055,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -10402,18 +11064,16 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "maybe_value%1#0", "_entry_interest_segment%0#0" ] }, - "1770": { + "1869": { "op": "+", "defined_out": [ "entry#0", @@ -10422,6 +11082,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -10429,21 +11091,21 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "interest_due#0" ] }, - "1771": { + "1870": { "op": "dup", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -10451,19 +11113,17 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "interest_due#0", "interest_due#0" ] }, - "1772": { - "op": "bury 13", + "1871": { + "op": "bury 11", "defined_out": [ "entry#0", "interest_due#0" @@ -10471,6 +11131,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -10478,21 +11140,21 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "interest_due#0" ] }, - "1774": { + "1873": { "op": "intc_0 // 0", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -10500,18 +11162,16 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "interest_due#0", "0" ] }, - "1775": { + "1874": { "op": "bytec 14 // \"next_principal_redemption\"", "defined_out": [ "\"next_principal_redemption\"", @@ -10522,6 +11182,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -10529,19 +11191,17 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "interest_due#0", "0", "\"next_principal_redemption\"" ] }, - "1777": { + "1876": { "op": "app_global_get_ex", "defined_out": [ "entry#0", @@ -10552,6 +11212,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -10559,24 +11221,24 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "interest_due#0", "maybe_value%2#0", "maybe_exists%2#0" ] }, - "1778": { + "1877": { "error": "check self.next_principal_redemption exists", "op": "assert // check self.next_principal_redemption exists", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -10584,18 +11246,16 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "interest_due#0", "maybe_value%2#0" ] }, - "1779": { + "1878": { "op": ">=", "defined_out": [ "entry#0", @@ -10605,6 +11265,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -10612,21 +11274,21 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "tmp%6#2" ] }, - "1780": { - "op": "bz fund_due_cashflows_after_if_else@22", + "1879": { + "op": "bz fund_due_cashflows_after_if_else@24", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -10634,16 +11296,14 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" + "max_event_count#0" ] }, - "1783": { + "1882": { "op": "intc_0 // 0", "defined_out": [ "entry#0", @@ -10653,6 +11313,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -10660,18 +11322,16 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "principal_amount_due#0" ] }, - "1784": { - "op": "bury 8", + "1883": { + "op": "bury 6", "defined_out": [ "entry#0", "interest_due#0", @@ -10680,6 +11340,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -10687,23 +11349,23 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" + "max_event_count#0" ] }, - "1786": { - "op": "b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@26" + "1885": { + "op": "b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@28" }, - "1789": { - "block": "fund_due_cashflows_after_if_else@22", + "1888": { + "block": "fund_due_cashflows_after_if_else@24", "stack_in": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -10711,13 +11373,11 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" + "max_event_count#0" ], "op": "intc_0 // 0", "defined_out": [ @@ -10726,6 +11386,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -10733,17 +11395,15 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "0" ] }, - "1790": { + "1889": { "op": "bytec 14 // \"next_principal_redemption\"", "defined_out": [ "\"next_principal_redemption\"", @@ -10752,6 +11412,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -10759,18 +11421,16 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "0", "\"next_principal_redemption\"" ] }, - "1792": { + "1891": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%3#0", @@ -10779,6 +11439,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -10786,23 +11448,23 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "maybe_value%3#1", "maybe_exists%3#0" ] }, - "1793": { + "1892": { "error": "check self.next_principal_redemption exists", "op": "assert // check self.next_principal_redemption exists", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -10810,18 +11472,16 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "maybe_value%3#1" ] }, - "1794": { - "op": "dig 12", + "1893": { + "op": "dig 10", "defined_out": [ "interest_due#0", "maybe_value%3#1" @@ -10829,6 +11489,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -10836,18 +11498,16 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "maybe_value%3#1", "interest_due#0" ] }, - "1796": { + "1895": { "op": "-", "defined_out": [ "interest_due#0", @@ -10856,6 +11516,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -10863,21 +11525,21 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "principal_amount#1" ] }, - "1797": { + "1896": { "op": "dup", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -10885,19 +11547,17 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "principal_amount#1", "principal_amount#1" ] }, - "1798": { - "op": "bury 10", + "1897": { + "op": "bury 8", "defined_out": [ "interest_due#0", "principal_amount#1" @@ -10905,6 +11565,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -10912,21 +11574,21 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "principal_amount#1" ] }, - "1800": { + "1899": { "op": "intc_0 // 0", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -10934,19 +11596,17 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "principal_amount#1", "0" ] }, - "1801": { - "op": "bytec_3 // \"outstanding_principal\"", + "1900": { + "op": "bytec 4 // \"outstanding_principal\"", "defined_out": [ "\"outstanding_principal\"", "0", @@ -10956,6 +11616,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -10963,19 +11625,17 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "principal_amount#1", "0", "\"outstanding_principal\"" ] }, - "1802": { + "1902": { "op": "app_global_get_ex", "defined_out": [ "interest_due#0", @@ -10986,6 +11646,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -10993,24 +11655,24 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "principal_amount#1", "maybe_value%4#1", "maybe_exists%4#1" ] }, - "1803": { + "1903": { "error": "check self.outstanding_principal exists", "op": "assert // check self.outstanding_principal exists", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -11018,27 +11680,27 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "principal_amount#1", "maybe_value%4#1" ] }, - "1804": { + "1904": { "op": ">", "defined_out": [ "interest_due#0", "principal_amount#1", - "tmp%8#0" + "tmp%8#1" ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -11046,21 +11708,21 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "tmp%8#0" + "tmp%8#1" ] }, - "1805": { - "op": "bz fund_due_cashflows_after_if_else@24", + "1905": { + "op": "bz fund_due_cashflows_after_if_else@26", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -11068,20 +11730,20 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" + "max_event_count#0" ] }, - "1808": { + "1908": { "op": "intc_0 // 0", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -11089,21 +11751,21 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "0" ] }, - "1809": { - "op": "bytec_3 // \"outstanding_principal\"", + "1909": { + "op": "bytec 4 // \"outstanding_principal\"", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -11111,18 +11773,16 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "0", "\"outstanding_principal\"" ] }, - "1810": { + "1911": { "op": "app_global_get_ex", "defined_out": [ "interest_due#0", @@ -11133,6 +11793,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -11140,18 +11802,16 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "maybe_value%5#0", "maybe_exists%5#0" ] }, - "1811": { + "1912": { "error": "check self.outstanding_principal exists", "op": "assert // check self.outstanding_principal exists", "defined_out": [ @@ -11162,6 +11822,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -11169,18 +11831,16 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "principal_amount_due#0" ] }, - "1812": { - "op": "bury 8", + "1913": { + "op": "bury 6", "defined_out": [ "interest_due#0", "principal_amount#1", @@ -11189,6 +11849,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -11196,23 +11858,23 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" + "max_event_count#0" ] }, - "1814": { - "op": "b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@26" + "1915": { + "op": "b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@28" }, - "1817": { - "block": "fund_due_cashflows_after_if_else@24", + "1918": { + "block": "fund_due_cashflows_after_if_else@26", "stack_in": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -11220,21 +11882,21 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" + "max_event_count#0" ], - "op": "dig 8", + "op": "dig 6", "defined_out": [ "principal_amount_due#0" ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -11242,24 +11904,24 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "principal_amount_due#0" ] }, - "1819": { - "op": "bury 8", + "1920": { + "op": "bury 6", "defined_out": [ "principal_amount_due#0" ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -11267,23 +11929,23 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" + "max_event_count#0" ] }, - "1821": { - "op": "b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@26" + "1922": { + "op": "b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@28" }, - "1824": { - "block": "fund_due_cashflows_after_if_else@25", + "1925": { + "block": "fund_due_cashflows_after_if_else@27", "stack_in": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -11291,13 +11953,11 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" + "max_event_count#0" ], "op": "dig 15", "defined_out": [ @@ -11306,6 +11966,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -11313,17 +11975,15 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "entry#0" ] }, - "1826": { + "1927": { "op": "pushint 49", "defined_out": [ "49", @@ -11332,6 +11992,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -11339,18 +12001,16 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "entry#0", "49" ] }, - "1828": { + "1929": { "op": "extract_uint64", "defined_out": [ "entry#0", @@ -11359,6 +12019,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -11366,17 +12028,15 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "values%0#0" ] }, - "1829": { + "1930": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -11386,6 +12046,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -11393,19 +12055,17 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "values%0#0", "0" ] }, - "1830": { - "op": "bytec_3 // \"outstanding_principal\"", + "1931": { + "op": "bytec 4 // \"outstanding_principal\"", "defined_out": [ "\"outstanding_principal\"", "0", @@ -11415,6 +12075,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -11422,19 +12084,17 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "values%0#0", "0", "\"outstanding_principal\"" ] }, - "1831": { + "1933": { "op": "app_global_get_ex", "defined_out": [ "entry#0", @@ -11445,6 +12105,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -11452,24 +12114,24 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "values%0#0", "maybe_value%6#0", "maybe_exists%6#0" ] }, - "1832": { + "1934": { "error": "check self.outstanding_principal exists", "op": "assert // check self.outstanding_principal exists", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -11477,18 +12139,16 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "values%0#0", "maybe_value%6#0" ] }, - "1833": { + "1935": { "op": "dup2", "defined_out": [ "entry#0", @@ -11500,6 +12160,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -11507,30 +12169,30 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "values%0#0", "maybe_value%6#0", "values%0#0 (copy)", "maybe_value%6#0 (copy)" ] }, - "1834": { + "1936": { "op": "<=", "defined_out": [ "entry#0", "maybe_value%6#0", - "tmp%9#1", + "tmp%9#2", "values%0#0" ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -11538,24 +12200,24 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "values%0#0", "maybe_value%6#0", - "tmp%9#1" + "tmp%9#2" ] }, - "1835": { + "1937": { "error": "Invalid ACTUS configuration", "op": "assert // Invalid ACTUS configuration", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -11563,22 +12225,22 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "values%0#0", "maybe_value%6#0" ] }, - "1836": { + "1938": { "op": "swap", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -11586,18 +12248,16 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "maybe_value%6#0", "values%0#0" ] }, - "1837": { + "1939": { "op": "-", "defined_out": [ "entry#0", @@ -11607,6 +12267,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -11614,18 +12276,16 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "principal_amount_due#0" ] }, - "1838": { - "op": "bury 8", + "1940": { + "op": "bury 6", "defined_out": [ "entry#0", "principal_amount_due#0", @@ -11634,6 +12294,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -11641,23 +12303,23 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" + "max_event_count#0" ] }, - "1840": { - "op": "b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@26" + "1942": { + "op": "b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@28" }, - "1843": { - "block": "fund_due_cashflows_after_if_else@13", + "1945": { + "block": "fund_due_cashflows_after_if_else@15", "stack_in": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -11665,13 +12327,11 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" + "max_event_count#0" ], "op": "intc_0 // 0", "defined_out": [ @@ -11680,6 +12340,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -11687,17 +12349,15 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "0" ] }, - "1844": { + "1946": { "op": "bytec 6 // \"accrued_interest\"", "defined_out": [ "\"accrued_interest\"", @@ -11706,6 +12366,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -11713,18 +12375,16 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "0", "\"accrued_interest\"" ] }, - "1846": { + "1948": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -11733,6 +12393,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -11740,23 +12402,23 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "maybe_value%0#0", "maybe_exists%0#0" ] }, - "1847": { + "1949": { "error": "check self.accrued_interest exists", "op": "assert // check self.accrued_interest exists", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -11764,17 +12426,15 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "maybe_value%0#0" ] }, - "1848": { + "1950": { "op": "dig 16", "defined_out": [ "entry#0", @@ -11783,6 +12443,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -11790,18 +12452,16 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "maybe_value%0#0", "entry#0" ] }, - "1850": { + "1952": { "callsub": "modules.actus_kernel.ActusKernelModule._entry_interest_segment", "op": "callsub _entry_interest_segment", "defined_out": [ @@ -11812,6 +12472,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -11819,19 +12481,17 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "maybe_value%0#0", "_entry_interest_segment%0#0", "entry#0" ] }, - "1853": { + "1955": { "op": "bury 18", "defined_out": [ "_entry_interest_segment%0#0", @@ -11841,6 +12501,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -11848,18 +12510,16 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "maybe_value%0#0", "_entry_interest_segment%0#0" ] }, - "1855": { + "1957": { "op": "+", "defined_out": [ "entry#0", @@ -11868,6 +12528,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -11875,18 +12537,16 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "interest_amount_due#0" ] }, - "1856": { - "op": "bury 13", + "1958": { + "op": "bury 11", "defined_out": [ "entry#0", "interest_amount_due#0" @@ -11894,6 +12554,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -11901,23 +12563,23 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" + "max_event_count#0" ] }, - "1858": { - "op": "b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_interest_amount@14" + "1960": { + "op": "b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_interest_amount@16" }, - "1861": { - "block": "fund_due_cashflows_after_while@9", + "1963": { + "block": "fund_due_cashflows_after_while@11", "stack_in": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -11925,21 +12587,21 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" + "max_event_count#0" ], - "op": "dig 2", + "op": "dig 4", "defined_out": [ "processed_events#0" ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -11947,17 +12609,15 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "processed_events#0" ] }, - "1863": { + "1965": { "op": "dup", "defined_out": [ "processed_events#0", @@ -11966,6 +12626,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -11973,23 +12635,23 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "processed_events#0", "processed_events#0 (copy)" ] }, - "1864": { + "1966": { "error": "No due cashflow to pay", "op": "assert // No due cashflow to pay", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -11997,18 +12659,16 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "processed_events#0" ] }, - "1865": { - "op": "dig 2", + "1967": { + "op": "dig 14", "defined_out": [ "funded_interest#0", "processed_events#0" @@ -12016,6 +12676,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -12023,18 +12685,16 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "processed_events#0", "funded_interest#0" ] }, - "1867": { + "1969": { "op": "dup", "defined_out": [ "funded_interest#0", @@ -12044,6 +12704,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -12051,20 +12713,18 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", "processed_events#0", "funded_interest#0", - "funded_principal#0", - "processed_events#0", - "funded_interest#0", "funded_interest#0 (copy)" ] }, - "1868": { - "op": "dig 3", + "1970": { + "op": "dig 15", "defined_out": [ "funded_interest#0", "funded_interest#0 (copy)", @@ -12074,6 +12734,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -12081,20 +12743,18 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", "processed_events#0", "funded_interest#0", - "funded_principal#0", - "processed_events#0", - "funded_interest#0", "funded_interest#0 (copy)", "funded_principal#0" ] }, - "1870": { + "1972": { "op": "dup", "defined_out": [ "funded_interest#0", @@ -12106,6 +12766,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -12113,25 +12775,25 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", "processed_events#0", "funded_interest#0", - "funded_principal#0", - "processed_events#0", - "funded_interest#0", "funded_interest#0 (copy)", "funded_principal#0 (copy)", "funded_principal#0 (copy)" ] }, - "1871": { + "1973": { "op": "cover 3", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -12139,31 +12801,31 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "processed_events#0", "funded_principal#0", "funded_interest#0", "funded_interest#0 (copy)", "funded_principal#0 (copy)" ] }, - "1873": { + "1975": { "op": "+", "defined_out": [ "funded_interest#0", "funded_principal#0", "processed_events#0", - "tmp%11#0" + "tmp%14#0" ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -12171,31 +12833,31 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "processed_events#0", "funded_principal#0", "funded_interest#0", - "tmp%11#0" + "tmp%14#0" ] }, - "1874": { + "1976": { "op": "global LatestTimestamp", "defined_out": [ "funded_interest#0", "funded_principal#0", "processed_events#0", - "tmp%11#0", - "tmp%12#0" + "tmp%14#0", + "tmp%15#0" ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -12203,25 +12865,25 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "processed_events#0", "funded_principal#0", "funded_interest#0", - "tmp%11#0", - "tmp%12#0" + "tmp%14#0", + "tmp%15#0" ] }, - "1876": { + "1978": { "op": "uncover 2", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -12229,33 +12891,33 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "processed_events#0", "funded_principal#0", - "tmp%11#0", - "tmp%12#0", + "tmp%14#0", + "tmp%15#0", "funded_interest#0" ] }, - "1878": { + "1980": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0", "funded_interest#0", "funded_principal#0", "processed_events#0", - "tmp%11#0", - "tmp%12#0" + "tmp%14#0", + "tmp%15#0" ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -12263,25 +12925,25 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "processed_events#0", "funded_principal#0", - "tmp%11#0", - "tmp%12#0", + "tmp%14#0", + "tmp%15#0", "aggregate%val_as_bytes%0#0" ] }, - "1879": { + "1981": { "op": "uncover 3", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -12289,21 +12951,19 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "processed_events#0", - "tmp%11#0", - "tmp%12#0", + "tmp%14#0", + "tmp%15#0", "aggregate%val_as_bytes%0#0", "funded_principal#0" ] }, - "1881": { + "1983": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0", @@ -12311,12 +12971,14 @@ "funded_interest#0", "funded_principal#0", "processed_events#0", - "tmp%11#0", - "tmp%12#0" + "tmp%14#0", + "tmp%15#0" ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -12324,33 +12986,33 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "processed_events#0", - "tmp%11#0", - "tmp%12#0", + "tmp%14#0", + "tmp%15#0", "aggregate%val_as_bytes%0#0", "aggregate%val_as_bytes%1#0" ] }, - "1882": { + "1984": { "op": "concat", "defined_out": [ "aggregate%head%1#0", "funded_interest#0", "funded_principal#0", "processed_events#0", - "tmp%11#0", - "tmp%12#0" + "tmp%14#0", + "tmp%15#0" ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -12358,24 +13020,24 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "processed_events#0", - "tmp%11#0", - "tmp%12#0", + "tmp%14#0", + "tmp%15#0", "aggregate%head%1#0" ] }, - "1883": { + "1985": { "op": "uncover 2", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -12383,20 +13045,18 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "processed_events#0", - "tmp%12#0", + "tmp%15#0", "aggregate%head%1#0", - "tmp%11#0" + "tmp%14#0" ] }, - "1885": { + "1987": { "op": "itob", "defined_out": [ "aggregate%head%1#0", @@ -12404,11 +13064,13 @@ "funded_interest#0", "funded_principal#0", "processed_events#0", - "tmp%12#0" + "tmp%15#0" ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -12416,31 +13078,31 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "processed_events#0", - "tmp%12#0", + "tmp%15#0", "aggregate%head%1#0", "aggregate%val_as_bytes%2#0" ] }, - "1886": { + "1988": { "op": "concat", "defined_out": [ "aggregate%head%2#0", "funded_interest#0", "funded_principal#0", "processed_events#0", - "tmp%12#0" + "tmp%15#0" ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -12448,23 +13110,23 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "processed_events#0", - "tmp%12#0", + "tmp%15#0", "aggregate%head%2#0" ] }, - "1887": { + "1989": { "op": "uncover 2", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -12472,19 +13134,17 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "tmp%12#0", + "tmp%15#0", "aggregate%head%2#0", "processed_events#0" ] }, - "1889": { + "1991": { "op": "itob", "defined_out": [ "aggregate%head%2#0", @@ -12492,11 +13152,13 @@ "funded_interest#0", "funded_principal#0", "processed_events#0", - "tmp%12#0" + "tmp%15#0" ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -12504,30 +13166,30 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "tmp%12#0", + "tmp%15#0", "aggregate%head%2#0", "aggregate%val_as_bytes%3#0" ] }, - "1890": { + "1992": { "op": "concat", "defined_out": [ "aggregate%head%3#0", "funded_interest#0", "funded_principal#0", "processed_events#0", - "tmp%12#0" + "tmp%15#0" ], "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -12535,22 +13197,22 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", - "tmp%12#0", + "tmp%15#0", "aggregate%head%3#0" ] }, - "1891": { + "1993": { "op": "swap", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -12558,18 +13220,16 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "aggregate%head%3#0", - "tmp%12#0" + "tmp%15#0" ] }, - "1892": { + "1994": { "op": "itob", "defined_out": [ "aggregate%head%3#0", @@ -12581,6 +13241,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -12588,18 +13250,16 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "aggregate%head%3#0", "aggregate%val_as_bytes%4#0" ] }, - "1893": { + "1995": { "op": "concat", "defined_out": [ "aggregate%head%4#0", @@ -12610,6 +13270,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -12617,17 +13279,15 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "aggregate%head%4#0" ] }, - "1894": { + "1996": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -12639,6 +13299,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -12646,22 +13308,22 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "aggregate%head%4#0", "0x151f7c75" ] }, - "1895": { + "1997": { "op": "swap", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -12669,18 +13331,16 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "0x151f7c75", "aggregate%head%4#0" ] }, - "1896": { + "1998": { "op": "concat", "defined_out": [ "funded_interest#0", @@ -12691,6 +13351,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -12698,21 +13360,21 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "tmp%3#0" ] }, - "1897": { + "1999": { "op": "log", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -12720,16 +13382,14 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" + "max_event_count#0" ] }, - "1898": { + "2000": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -12740,6 +13400,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -12747,21 +13409,21 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "1" ] }, - "1899": { + "2001": { "op": "return", "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -12769,20 +13431,20 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" + "max_event_count#0" ] }, - "1900": { - "block": "fund_due_cashflows_bool_false@51", + "2002": { + "block": "fund_due_cashflows_bool_false@53", "stack_in": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -12790,13 +13452,11 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", - "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0" + "max_event_count#0" ], "op": "intc_0 // 0", "defined_out": [ @@ -12805,6 +13465,8 @@ "stack_out": [ "entry#0", "event_type#0", + "funded_interest#0", + "funded_principal#0", "interest_amount#1", "interest_amount_due#0", "interest_due#0", @@ -12812,20 +13474,18 @@ "next_outstanding_principal#0", "principal_amount#1", "principal_amount_due#0", + "processed_events#0", "required_amount#0", "tmp%0#1", "values%0#0", "max_event_count#0", - "processed_events#0", - "funded_interest#0", - "funded_principal#0", "or_result%0#0" ] }, - "1901": { - "op": "b fund_due_cashflows_bool_merge@52" + "2003": { + "op": "b fund_due_cashflows_bool_merge@54" }, - "1904": { + "2006": { "subroutine": "modules.payment_agent.PaymentAgent.claim_due_cashflows[routing]", "params": {}, "block": "claim_due_cashflows", @@ -12835,7 +13495,7 @@ "interest_amount#0" ] }, - "1906": { + "2008": { "op": "dupn 2", "stack_out": [ "interest_amount#0", @@ -12843,10 +13503,10 @@ "total_amount#0" ] }, - "1908": { + "2010": { "op": "txna ApplicationArgs 1" }, - "1911": { + "2013": { "op": "dupn 2", "defined_out": [ "holding_address#0", @@ -12861,7 +13521,7 @@ "holding_address#0 (copy)" ] }, - "1913": { + "2015": { "op": "len", "defined_out": [ "holding_address#0", @@ -12876,7 +13536,7 @@ "len%0#0" ] }, - "1914": { + "2016": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -12893,7 +13553,7 @@ "32" ] }, - "1915": { + "2017": { "op": "==", "defined_out": [ "eq%0#0", @@ -12908,7 +13568,7 @@ "eq%0#0" ] }, - "1916": { + "2018": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ @@ -12919,7 +13579,7 @@ "holding_address#0" ] }, - "1917": { + "2019": { "op": "txna ApplicationArgs 2", "defined_out": [ "holding_address#0", @@ -12934,7 +13594,7 @@ "tmp%2#0" ] }, - "1920": { + "2022": { "op": "dup", "defined_out": [ "holding_address#0", @@ -12951,7 +13611,7 @@ "tmp%2#0 (copy)" ] }, - "1921": { + "2023": { "op": "intc_0 // 0", "stack_out": [ "interest_amount#0", @@ -12964,7 +13624,7 @@ "0" ] }, - "1922": { + "2024": { "error": "invalid array length header", "op": "extract_uint16 // on error: invalid array length header", "defined_out": [ @@ -12982,7 +13642,7 @@ "aggregate%array_length%0#0" ] }, - "1923": { + "2025": { "op": "pushint 2", "defined_out": [ "2", @@ -13001,7 +13661,7 @@ "2" ] }, - "1925": { + "2027": { "op": "+", "defined_out": [ "add%0#0", @@ -13018,7 +13678,7 @@ "add%0#0" ] }, - "1926": { + "2028": { "op": "dig 1", "stack_out": [ "interest_amount#0", @@ -13031,7 +13691,7 @@ "tmp%2#0 (copy)" ] }, - "1928": { + "2030": { "op": "len", "defined_out": [ "add%0#0", @@ -13050,7 +13710,7 @@ "len%1#0" ] }, - "1929": { + "2031": { "op": "==", "defined_out": [ "eq%1#0", @@ -13067,7 +13727,7 @@ "eq%1#0" ] }, - "1930": { + "2032": { "error": "invalid number of bytes for arc4.dynamic_array", "op": "assert // invalid number of bytes for arc4.dynamic_array", "stack_out": [ @@ -13079,7 +13739,7 @@ "tmp%2#0" ] }, - "1931": { + "2033": { "op": "extract 2 0", "defined_out": [ "holding_address#0", @@ -13094,7 +13754,7 @@ "payment_info#0" ] }, - "1934": { + "2036": { "op": "swap", "defined_out": [ "holding_address#0", @@ -13109,7 +13769,7 @@ "holding_address#0" ] }, - "1935": { + "2037": { "op": "intc_0 // 0", "stack_out": [ "interest_amount#0", @@ -13121,7 +13781,7 @@ "0" ] }, - "1936": { + "2038": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"", @@ -13140,7 +13800,7 @@ "\"status\"" ] }, - "1937": { + "2039": { "op": "app_global_get_ex", "defined_out": [ "holding_address#0", @@ -13159,7 +13819,7 @@ "maybe_exists%0#0" ] }, - "1938": { + "2040": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ @@ -13172,7 +13832,7 @@ "maybe_value%0#0" ] }, - "1939": { + "2041": { "error": "D-ASA not configured", "op": "assert // D-ASA not configured", "stack_out": [ @@ -13184,7 +13844,7 @@ "holding_address#0" ] }, - "1940": { + "2042": { "op": "bytec 8 // 0x52234163636f756e7423", "defined_out": [ "0x52234163636f756e7423", @@ -13201,7 +13861,7 @@ "0x52234163636f756e7423" ] }, - "1942": { + "2044": { "op": "swap", "stack_out": [ "interest_amount#0", @@ -13213,7 +13873,7 @@ "holding_address#0" ] }, - "1943": { + "2045": { "op": "concat", "defined_out": [ "box_prefixed_key%0#4", @@ -13229,7 +13889,7 @@ "box_prefixed_key%0#4" ] }, - "1944": { + "2046": { "op": "dup", "defined_out": [ "box_prefixed_key%0#4", @@ -13246,7 +13906,7 @@ "box_prefixed_key%0#4" ] }, - "1945": { + "2047": { "op": "box_len", "defined_out": [ "_%0#0", @@ -13266,7 +13926,7 @@ "maybe_exists%0#0" ] }, - "1946": { + "2048": { "op": "bury 1", "stack_out": [ "interest_amount#0", @@ -13278,7 +13938,7 @@ "maybe_exists%0#0" ] }, - "1948": { + "2050": { "error": "Invalid account holding address", "op": "assert // Invalid account holding address", "stack_out": [ @@ -13290,7 +13950,7 @@ "box_prefixed_key%0#4" ] }, - "1949": { + "2051": { "op": "intc_0 // 0", "stack_out": [ "interest_amount#0", @@ -13302,8 +13962,8 @@ "0" ] }, - "1950": { - "op": "bytec 25 // 0x52234f704461656d6f6e23", + "2052": { + "op": "bytec 26 // 0x52234f704461656d6f6e23", "defined_out": [ "0", "0x52234f704461656d6f6e23", @@ -13322,7 +13982,7 @@ "0x52234f704461656d6f6e23" ] }, - "1952": { + "2054": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#4", @@ -13342,7 +14002,7 @@ "maybe_exists%0#0" ] }, - "1953": { + "2055": { "error": "check self.op_daemon exists", "op": "assert // check self.op_daemon exists", "stack_out": [ @@ -13355,7 +14015,7 @@ "maybe_value%0#3" ] }, - "1954": { + "2056": { "op": "global ZeroAddress", "defined_out": [ "box_prefixed_key%0#4", @@ -13375,7 +14035,7 @@ "tmp%0#1" ] }, - "1956": { + "2058": { "op": "!=", "defined_out": [ "box_prefixed_key%0#4", @@ -13393,7 +14053,7 @@ "tmp%1#2" ] }, - "1957": { + "2059": { "op": "bz claim_due_cashflows_after_if_else@17", "stack_out": [ "interest_amount#0", @@ -13404,7 +14064,7 @@ "box_prefixed_key%0#4" ] }, - "1960": { + "2062": { "op": "txn Sender", "defined_out": [ "box_prefixed_key%0#4", @@ -13422,7 +14082,7 @@ "tmp%2#3" ] }, - "1962": { + "2064": { "op": "intc_0 // 0", "stack_out": [ "interest_amount#0", @@ -13435,8 +14095,8 @@ "0" ] }, - "1963": { - "op": "bytec 25 // 0x52234f704461656d6f6e23", + "2065": { + "op": "bytec 26 // 0x52234f704461656d6f6e23", "stack_out": [ "interest_amount#0", "principal_amount#0", @@ -13449,7 +14109,7 @@ "0x52234f704461656d6f6e23" ] }, - "1965": { + "2067": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#4", @@ -13471,7 +14131,7 @@ "maybe_exists%1#0" ] }, - "1966": { + "2068": { "error": "check self.op_daemon exists", "op": "assert // check self.op_daemon exists", "stack_out": [ @@ -13485,7 +14145,7 @@ "maybe_value%1#1" ] }, - "1967": { + "2069": { "op": "==", "defined_out": [ "box_prefixed_key%0#4", @@ -13503,7 +14163,7 @@ "tmp%3#1" ] }, - "1968": { + "2070": { "op": "bnz claim_due_cashflows_bool_true@14", "stack_out": [ "interest_amount#0", @@ -13514,7 +14174,7 @@ "box_prefixed_key%0#4" ] }, - "1971": { + "2073": { "op": "txn Sender", "defined_out": [ "box_prefixed_key%0#4", @@ -13532,7 +14192,7 @@ "tmp%4#0" ] }, - "1973": { + "2075": { "op": "dig 3", "stack_out": [ "interest_amount#0", @@ -13545,7 +14205,7 @@ "holding_address#0" ] }, - "1975": { + "2077": { "op": "==", "defined_out": [ "box_prefixed_key%0#4", @@ -13563,7 +14223,7 @@ "tmp%5#2" ] }, - "1976": { + "2078": { "op": "bnz claim_due_cashflows_bool_true@14", "stack_out": [ "interest_amount#0", @@ -13574,7 +14234,7 @@ "box_prefixed_key%0#4" ] }, - "1979": { + "2081": { "op": "txn Sender", "defined_out": [ "box_prefixed_key%0#4", @@ -13592,7 +14252,7 @@ "tmp%6#1" ] }, - "1981": { + "2083": { "op": "dig 1", "stack_out": [ "interest_amount#0", @@ -13605,7 +14265,7 @@ "box_prefixed_key%0#4" ] }, - "1983": { + "2085": { "op": "box_get", "defined_out": [ "aggregate%box_get%0#0", @@ -13627,7 +14287,7 @@ "aggregate%box_get%1#0" ] }, - "1984": { + "2086": { "error": "check self.account entry exists", "op": "assert // check self.account entry exists", "stack_out": [ @@ -13641,7 +14301,7 @@ "aggregate%box_get%0#0" ] }, - "1985": { + "2087": { "op": "extract 0 32", "defined_out": [ "aggregate%extract%0#0", @@ -13661,7 +14321,7 @@ "aggregate%extract%0#0" ] }, - "1988": { + "2090": { "op": "==", "defined_out": [ "box_prefixed_key%0#4", @@ -13679,7 +14339,7 @@ "tmp%7#1" ] }, - "1989": { + "2091": { "op": "bz claim_due_cashflows_bool_false@15", "stack_out": [ "interest_amount#0", @@ -13690,7 +14350,7 @@ "box_prefixed_key%0#4" ] }, - "1992": { + "2094": { "block": "claim_due_cashflows_bool_true@14", "stack_in": [ "interest_amount#0", @@ -13714,7 +14374,7 @@ "or_result%0#0" ] }, - "1993": { + "2095": { "error": "Not authorized", "block": "claim_due_cashflows_bool_merge@16", "stack_in": [ @@ -13737,7 +14397,7 @@ "box_prefixed_key%0#4" ] }, - "1994": { + "2096": { "block": "claim_due_cashflows_after_if_else@17", "stack_in": [ "interest_amount#0", @@ -13750,11 +14410,11 @@ "callsub": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", "op": "callsub _assert_is_not_asset_defaulted" }, - "1997": { + "2099": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_suspended", "op": "callsub _assert_is_not_asset_suspended" }, - "2000": { + "2102": { "op": "intc_0 // 0", "defined_out": [ "0" @@ -13769,7 +14429,7 @@ "0" ] }, - "2001": { + "2103": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"", @@ -13786,7 +14446,7 @@ "\"status\"" ] }, - "2002": { + "2104": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -13803,7 +14463,7 @@ "maybe_exists%0#0" ] }, - "2003": { + "2105": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ @@ -13816,7 +14476,7 @@ "maybe_value%0#0" ] }, - "2004": { + "2106": { "op": "pushint 50", "defined_out": [ "50", @@ -13833,7 +14493,7 @@ "50" ] }, - "2006": { + "2108": { "op": "==", "defined_out": [ "tmp%0#2" @@ -13848,7 +14508,7 @@ "tmp%0#2" ] }, - "2007": { + "2109": { "op": "!", "defined_out": [ "tmp%1#2" @@ -13863,7 +14523,7 @@ "tmp%1#2" ] }, - "2008": { + "2110": { "error": "IED not yet executed", "op": "assert // IED not yet executed", "stack_out": [ @@ -13875,7 +14535,7 @@ "box_prefixed_key%0#4" ] }, - "2009": { + "2111": { "op": "dig 2", "defined_out": [ "holding_address#0" @@ -13890,7 +14550,7 @@ "holding_address#0" ] }, - "2011": { + "2113": { "op": "dup", "defined_out": [ "holding_address#0", @@ -13907,7 +14567,7 @@ "holding_address#0 (copy)" ] }, - "2012": { + "2114": { "callsub": "modules.accounting.AccountingModule._ensure_units_activated", "op": "callsub _ensure_units_activated", "stack_out": [ @@ -13920,7 +14580,7 @@ "holding_address#0" ] }, - "2015": { + "2117": { "callsub": "modules.accounting.AccountingModule._settle_position", "op": "callsub _settle_position", "defined_out": [ @@ -13939,7 +14599,7 @@ "{_settle_position}.1" ] }, - "2018": { + "2120": { "op": "popn 2", "stack_out": [ "interest_amount#0", @@ -13950,7 +14610,7 @@ "box_prefixed_key%0#4" ] }, - "2020": { + "2122": { "op": "dup", "defined_out": [ "box_prefixed_key%0#4", @@ -13966,7 +14626,7 @@ "box_prefixed_key%0#4" ] }, - "2021": { + "2123": { "op": "box_get", "defined_out": [ "aggregate%box_get%2#0", @@ -13985,7 +14645,7 @@ "aggregate%box_get%3#0" ] }, - "2022": { + "2124": { "error": "check self.account entry exists", "op": "assert // check self.account entry exists", "stack_out": [ @@ -13998,7 +14658,7 @@ "aggregate%box_get%2#0" ] }, - "2023": { + "2125": { "op": "dup", "defined_out": [ "aggregate%box_get%2#0", @@ -14017,7 +14677,7 @@ "aggregate%box_get%2#0 (copy)" ] }, - "2024": { + "2126": { "op": "pushint 73", "defined_out": [ "73", @@ -14038,7 +14698,7 @@ "73" ] }, - "2026": { + "2128": { "op": "extract_uint64", "defined_out": [ "aggregate%box_get%2#0", @@ -14057,7 +14717,7 @@ "interest_amount#0" ] }, - "2027": { + "2129": { "op": "dup", "stack_out": [ "interest_amount#0", @@ -14071,7 +14731,7 @@ "interest_amount#0 (copy)" ] }, - "2028": { + "2130": { "op": "cover 2", "stack_out": [ "interest_amount#0", @@ -14085,7 +14745,7 @@ "interest_amount#0" ] }, - "2030": { + "2132": { "op": "bury 8", "defined_out": [ "aggregate%box_get%2#0", @@ -14104,7 +14764,7 @@ "aggregate%box_get%2#0" ] }, - "2032": { + "2134": { "op": "dup", "stack_out": [ "interest_amount#0", @@ -14118,7 +14778,7 @@ "aggregate%box_get%2#0 (copy)" ] }, - "2033": { + "2135": { "op": "pushint 81", "defined_out": [ "81", @@ -14141,7 +14801,7 @@ "81" ] }, - "2035": { + "2137": { "op": "extract_uint64", "defined_out": [ "aggregate%box_get%2#0", @@ -14162,7 +14822,7 @@ "principal_amount#0" ] }, - "2036": { + "2138": { "op": "dup", "stack_out": [ "interest_amount#0", @@ -14177,7 +14837,7 @@ "principal_amount#0" ] }, - "2037": { + "2139": { "op": "bury 8", "defined_out": [ "aggregate%box_get%2#0", @@ -14198,7 +14858,7 @@ "principal_amount#0" ] }, - "2039": { + "2141": { "op": "uncover 2", "stack_out": [ "interest_amount#0", @@ -14212,7 +14872,7 @@ "interest_amount#0" ] }, - "2041": { + "2143": { "op": "+", "defined_out": [ "aggregate%box_get%2#0", @@ -14233,7 +14893,7 @@ "total_amount#0" ] }, - "2042": { + "2144": { "op": "dup", "stack_out": [ "interest_amount#0", @@ -14247,7 +14907,7 @@ "total_amount#0" ] }, - "2043": { + "2145": { "op": "bury 6", "stack_out": [ "interest_amount#0", @@ -14260,7 +14920,7 @@ "total_amount#0" ] }, - "2045": { + "2147": { "error": "No due cashflow to pay", "op": "assert // No due cashflow to pay", "stack_out": [ @@ -14273,7 +14933,7 @@ "aggregate%box_get%2#0" ] }, - "2046": { + "2148": { "op": "extract 0 32", "defined_out": [ "aggregate%extract%5#0", @@ -14293,7 +14953,7 @@ "aggregate%extract%5#0" ] }, - "2049": { + "2151": { "op": "intc_0 // 0", "stack_out": [ "interest_amount#0", @@ -14306,7 +14966,7 @@ "0" ] }, - "2050": { + "2152": { "op": "bytec 19 // \"settlement_asset_id\"", "defined_out": [ "\"settlement_asset_id\"", @@ -14330,7 +14990,7 @@ "\"settlement_asset_id\"" ] }, - "2052": { + "2154": { "op": "app_global_get_ex", "stack_out": [ "interest_amount#0", @@ -14344,7 +15004,7 @@ "maybe_exists%0#0" ] }, - "2053": { + "2155": { "error": "check self.settlement_asset_id exists", "op": "assert // check self.settlement_asset_id exists", "stack_out": [ @@ -14358,7 +15018,7 @@ "maybe_value%0#0" ] }, - "2054": { + "2156": { "op": "asset_holding_get AssetBalance", "defined_out": [ "box_prefixed_key%0#4", @@ -14380,7 +15040,7 @@ "tmp%1#2" ] }, - "2056": { + "2158": { "op": "bury 1", "stack_out": [ "interest_amount#0", @@ -14392,7 +15052,7 @@ "tmp%1#2" ] }, - "2058": { + "2160": { "op": "bz claim_due_cashflows_bool_false@24", "stack_out": [ "interest_amount#0", @@ -14403,7 +15063,7 @@ "box_prefixed_key%0#4" ] }, - "2061": { + "2163": { "op": "dup", "stack_out": [ "interest_amount#0", @@ -14415,7 +15075,7 @@ "box_prefixed_key%0#4" ] }, - "2062": { + "2164": { "op": "box_get", "defined_out": [ "aggregate%box_get%12#0", @@ -14437,7 +15097,7 @@ "aggregate%box_get%13#0" ] }, - "2063": { + "2165": { "error": "check self.account entry exists", "op": "assert // check self.account entry exists", "stack_out": [ @@ -14450,7 +15110,7 @@ "aggregate%box_get%12#0" ] }, - "2064": { + "2166": { "op": "pushint 384", "defined_out": [ "384", @@ -14472,7 +15132,7 @@ "384" ] }, - "2067": { + "2169": { "op": "getbit", "defined_out": [ "aggregate%get_bit%0#0", @@ -14492,7 +15152,7 @@ "aggregate%get_bit%0#0" ] }, - "2068": { + "2170": { "op": "bnz claim_due_cashflows_bool_false@24", "stack_out": [ "interest_amount#0", @@ -14503,7 +15163,7 @@ "box_prefixed_key%0#4" ] }, - "2071": { + "2173": { "op": "intc_1 // 1", "defined_out": [ "and_result%0#0", @@ -14523,7 +15183,7 @@ "and_result%0#0" ] }, - "2072": { + "2174": { "block": "claim_due_cashflows_bool_merge@25", "stack_in": [ "interest_amount#0", @@ -14545,7 +15205,7 @@ "box_prefixed_key%0#4" ] }, - "2075": { + "2177": { "op": "global CurrentApplicationAddress", "defined_out": [ "tmp%0#1" @@ -14560,7 +15220,7 @@ "tmp%0#1" ] }, - "2077": { + "2179": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -14577,7 +15237,7 @@ "0" ] }, - "2078": { + "2180": { "op": "bytec 19 // \"settlement_asset_id\"", "defined_out": [ "\"settlement_asset_id\"", @@ -14596,7 +15256,7 @@ "\"settlement_asset_id\"" ] }, - "2080": { + "2182": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -14615,7 +15275,7 @@ "maybe_exists%0#0" ] }, - "2081": { + "2183": { "error": "check self.settlement_asset_id exists", "op": "assert // check self.settlement_asset_id exists", "stack_out": [ @@ -14629,7 +15289,7 @@ "maybe_value%0#0" ] }, - "2082": { + "2184": { "op": "swap", "stack_out": [ "interest_amount#0", @@ -14642,7 +15302,7 @@ "tmp%0#1" ] }, - "2083": { + "2185": { "op": "dig 1", "defined_out": [ "maybe_value%0#0", @@ -14661,7 +15321,7 @@ "maybe_value%0#0 (copy)" ] }, - "2085": { + "2187": { "op": "asset_holding_get AssetBalance", "defined_out": [ "check%0#0", @@ -14680,7 +15340,7 @@ "check%0#0" ] }, - "2087": { + "2189": { "error": "account opted into asset", "op": "assert // account opted into asset", "stack_out": [ @@ -14694,7 +15354,7 @@ "value%0#0" ] }, - "2088": { + "2190": { "op": "dig 5", "defined_out": [ "maybe_value%0#0", @@ -14713,7 +15373,7 @@ "total_amount#0" ] }, - "2090": { + "2192": { "op": "dup", "defined_out": [ "maybe_value%0#0", @@ -14734,7 +15394,7 @@ "total_amount#0 (copy)" ] }, - "2091": { + "2193": { "op": "cover 2", "stack_out": [ "interest_amount#0", @@ -14749,7 +15409,7 @@ "total_amount#0 (copy)" ] }, - "2093": { + "2195": { "op": ">=", "defined_out": [ "maybe_value%0#0", @@ -14768,7 +15428,7 @@ "tmp%1#2" ] }, - "2094": { + "2196": { "error": "Not enough funds for the payment", "op": "assert // Not enough funds for the payment", "stack_out": [ @@ -14782,7 +15442,7 @@ "total_amount#0" ] }, - "2095": { + "2197": { "op": "dig 2", "defined_out": [ "box_prefixed_key%0#4", @@ -14801,7 +15461,7 @@ "box_prefixed_key%0#4" ] }, - "2097": { + "2199": { "op": "dup", "defined_out": [ "box_prefixed_key%0#4", @@ -14822,7 +15482,7 @@ "box_prefixed_key%0#4 (copy)" ] }, - "2098": { + "2200": { "op": "cover 3", "stack_out": [ "interest_amount#0", @@ -14837,7 +15497,7 @@ "box_prefixed_key%0#4 (copy)" ] }, - "2100": { + "2202": { "op": "box_get", "defined_out": [ "aggregate%box_get%15#0", @@ -14860,7 +15520,7 @@ "aggregate%box_get%15#0" ] }, - "2101": { + "2203": { "error": "check self.account entry exists", "op": "assert // check self.account entry exists", "stack_out": [ @@ -14876,7 +15536,7 @@ "position#0" ] }, - "2102": { + "2204": { "op": "dup", "defined_out": [ "box_prefixed_key%0#4", @@ -14899,7 +15559,7 @@ "position#0 (copy)" ] }, - "2103": { + "2205": { "op": "extract 0 32", "defined_out": [ "box_prefixed_key%0#4", @@ -14922,10 +15582,10 @@ "receiver#0" ] }, - "2106": { + "2208": { "op": "itxn_begin" }, - "2107": { + "2209": { "op": "global MinTxnFee", "defined_out": [ "box_prefixed_key%0#4", @@ -14950,7 +15610,7 @@ "inner_txn_params%0%%param_Fee_idx_0#0" ] }, - "2109": { + "2211": { "op": "uncover 3", "stack_out": [ "interest_amount#0", @@ -14967,7 +15627,7 @@ "total_amount#0" ] }, - "2111": { + "2213": { "op": "itxn_field AssetAmount", "stack_out": [ "interest_amount#0", @@ -14983,7 +15643,7 @@ "inner_txn_params%0%%param_Fee_idx_0#0" ] }, - "2113": { + "2215": { "op": "swap", "stack_out": [ "interest_amount#0", @@ -14999,7 +15659,7 @@ "receiver#0" ] }, - "2114": { + "2216": { "op": "itxn_field AssetReceiver", "stack_out": [ "interest_amount#0", @@ -15014,7 +15674,7 @@ "inner_txn_params%0%%param_Fee_idx_0#0" ] }, - "2116": { + "2218": { "op": "uncover 2", "stack_out": [ "interest_amount#0", @@ -15029,7 +15689,7 @@ "maybe_value%0#0" ] }, - "2118": { + "2220": { "op": "itxn_field XferAsset", "stack_out": [ "interest_amount#0", @@ -15043,7 +15703,7 @@ "inner_txn_params%0%%param_Fee_idx_0#0" ] }, - "2120": { + "2222": { "op": "pushint 4 // axfer", "defined_out": [ "axfer", @@ -15065,7 +15725,7 @@ "axfer" ] }, - "2122": { + "2224": { "op": "itxn_field TypeEnum", "stack_out": [ "interest_amount#0", @@ -15079,7 +15739,7 @@ "inner_txn_params%0%%param_Fee_idx_0#0" ] }, - "2124": { + "2226": { "op": "itxn_field Fee", "stack_out": [ "interest_amount#0", @@ -15092,10 +15752,10 @@ "position#0" ] }, - "2126": { + "2228": { "op": "itxn_submit" }, - "2127": { + "2229": { "op": "dup", "stack_out": [ "interest_amount#0", @@ -15109,7 +15769,7 @@ "position#0 (copy)" ] }, - "2128": { + "2230": { "op": "pushint 73", "defined_out": [ "73", @@ -15131,7 +15791,7 @@ "73" ] }, - "2130": { + "2232": { "op": "extract_uint64", "defined_out": [ "box_prefixed_key%0#4", @@ -15151,7 +15811,7 @@ "interest_amount#0" ] }, - "2131": { + "2233": { "op": "dup", "stack_out": [ "interest_amount#0", @@ -15166,7 +15826,7 @@ "interest_amount#0 (copy)" ] }, - "2132": { + "2234": { "op": "cover 2", "stack_out": [ "interest_amount#0", @@ -15181,7 +15841,7 @@ "interest_amount#0" ] }, - "2134": { + "2236": { "op": "bury 9", "defined_out": [ "box_prefixed_key%0#4", @@ -15201,7 +15861,7 @@ "position#0" ] }, - "2136": { + "2238": { "op": "dup", "stack_out": [ "interest_amount#0", @@ -15216,7 +15876,7 @@ "position#0 (copy)" ] }, - "2137": { + "2239": { "op": "pushint 81", "defined_out": [ "81", @@ -15240,7 +15900,7 @@ "81" ] }, - "2139": { + "2241": { "op": "extract_uint64", "defined_out": [ "box_prefixed_key%0#4", @@ -15262,7 +15922,7 @@ "principal_amount#0" ] }, - "2140": { + "2242": { "op": "dup", "stack_out": [ "interest_amount#0", @@ -15278,7 +15938,7 @@ "principal_amount#0 (copy)" ] }, - "2141": { + "2243": { "op": "cover 3", "stack_out": [ "interest_amount#0", @@ -15294,7 +15954,7 @@ "principal_amount#0" ] }, - "2143": { + "2245": { "op": "bury 9", "defined_out": [ "box_prefixed_key%0#4", @@ -15316,7 +15976,7 @@ "position#0" ] }, - "2145": { + "2247": { "op": "intc_0 // 0", "stack_out": [ "interest_amount#0", @@ -15332,7 +15992,7 @@ "0" ] }, - "2146": { + "2248": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0", @@ -15356,7 +16016,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "2147": { + "2249": { "op": "swap", "stack_out": [ "interest_amount#0", @@ -15372,7 +16032,7 @@ "position#0" ] }, - "2148": { + "2250": { "op": "dig 1", "defined_out": [ "aggregate%val_as_bytes%0#0", @@ -15398,7 +16058,7 @@ "aggregate%val_as_bytes%0#0 (copy)" ] }, - "2150": { + "2252": { "op": "replace2 73", "stack_out": [ "interest_amount#0", @@ -15414,7 +16074,7 @@ "position#0" ] }, - "2152": { + "2254": { "op": "swap", "stack_out": [ "interest_amount#0", @@ -15430,7 +16090,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "2153": { + "2255": { "op": "replace2 81", "stack_out": [ "interest_amount#0", @@ -15445,7 +16105,7 @@ "position#0" ] }, - "2155": { + "2257": { "op": "uncover 3", "stack_out": [ "interest_amount#0", @@ -15460,7 +16120,7 @@ "box_prefixed_key%0#4" ] }, - "2157": { + "2259": { "op": "swap", "stack_out": [ "interest_amount#0", @@ -15475,7 +16135,7 @@ "position#0" ] }, - "2158": { + "2260": { "op": "box_put", "stack_out": [ "interest_amount#0", @@ -15488,7 +16148,7 @@ "interest_amount#0" ] }, - "2159": { + "2261": { "op": "intc_0 // 0", "stack_out": [ "interest_amount#0", @@ -15502,7 +16162,7 @@ "0" ] }, - "2160": { + "2262": { "op": "bytec 15 // \"reserved_interest\"", "defined_out": [ "\"reserved_interest\"", @@ -15525,7 +16185,7 @@ "\"reserved_interest\"" ] }, - "2162": { + "2264": { "op": "app_global_get_ex", "stack_out": [ "interest_amount#0", @@ -15540,7 +16200,7 @@ "maybe_exists%0#0" ] }, - "2163": { + "2265": { "error": "check self.reserved_interest exists", "op": "assert // check self.reserved_interest exists", "stack_out": [ @@ -15555,7 +16215,7 @@ "maybe_value%0#0" ] }, - "2164": { + "2266": { "op": "dup", "stack_out": [ "interest_amount#0", @@ -15570,7 +16230,7 @@ "maybe_value%0#0 (copy)" ] }, - "2165": { + "2267": { "op": "dig 2", "defined_out": [ "box_prefixed_key%0#4", @@ -15595,7 +16255,7 @@ "interest_amount#0 (copy)" ] }, - "2167": { + "2269": { "op": ">=", "defined_out": [ "box_prefixed_key%0#4", @@ -15618,7 +16278,7 @@ "tmp%0#2" ] }, - "2168": { + "2270": { "error": "Not enough funds for the payment", "op": "assert // Not enough funds for the payment", "stack_out": [ @@ -15633,7 +16293,7 @@ "maybe_value%0#0" ] }, - "2169": { + "2271": { "op": "intc_0 // 0", "stack_out": [ "interest_amount#0", @@ -15648,8 +16308,8 @@ "0" ] }, - "2170": { - "op": "bytec 11 // \"reserved_principal\"", + "2272": { + "op": "bytec 12 // \"reserved_principal\"", "defined_out": [ "\"reserved_principal\"", "0", @@ -15673,7 +16333,7 @@ "\"reserved_principal\"" ] }, - "2172": { + "2274": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#4", @@ -15698,7 +16358,7 @@ "maybe_exists%1#0" ] }, - "2173": { + "2275": { "error": "check self.reserved_principal exists", "op": "assert // check self.reserved_principal exists", "stack_out": [ @@ -15714,7 +16374,7 @@ "maybe_value%1#0" ] }, - "2174": { + "2276": { "op": "dig 3", "defined_out": [ "box_prefixed_key%0#4", @@ -15739,7 +16399,7 @@ "principal_amount#0 (copy)" ] }, - "2176": { + "2278": { "op": ">=", "stack_out": [ "interest_amount#0", @@ -15754,7 +16414,7 @@ "tmp%1#2" ] }, - "2177": { + "2279": { "error": "Not enough funds for the payment", "op": "assert // Not enough funds for the payment", "stack_out": [ @@ -15769,7 +16429,7 @@ "maybe_value%0#0" ] }, - "2178": { + "2280": { "op": "swap", "stack_out": [ "interest_amount#0", @@ -15783,7 +16443,7 @@ "interest_amount#0" ] }, - "2179": { + "2281": { "op": "-", "defined_out": [ "box_prefixed_key%0#4", @@ -15803,7 +16463,7 @@ "tmp%2#2" ] }, - "2180": { + "2282": { "op": "bytec 15 // \"reserved_interest\"", "stack_out": [ "interest_amount#0", @@ -15817,7 +16477,7 @@ "\"reserved_interest\"" ] }, - "2182": { + "2284": { "op": "swap", "stack_out": [ "interest_amount#0", @@ -15831,7 +16491,7 @@ "tmp%2#2" ] }, - "2183": { + "2285": { "op": "app_global_put", "stack_out": [ "interest_amount#0", @@ -15843,7 +16503,7 @@ "principal_amount#0" ] }, - "2184": { + "2286": { "op": "intc_0 // 0", "stack_out": [ "interest_amount#0", @@ -15856,8 +16516,8 @@ "0" ] }, - "2185": { - "op": "bytec 11 // \"reserved_principal\"", + "2287": { + "op": "bytec 12 // \"reserved_principal\"", "stack_out": [ "interest_amount#0", "principal_amount#0", @@ -15870,7 +16530,7 @@ "\"reserved_principal\"" ] }, - "2187": { + "2289": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#4", @@ -15892,7 +16552,7 @@ "maybe_exists%3#0" ] }, - "2188": { + "2290": { "error": "check self.reserved_principal exists", "op": "assert // check self.reserved_principal exists", "stack_out": [ @@ -15906,7 +16566,7 @@ "maybe_value%3#0" ] }, - "2189": { + "2291": { "op": "swap", "stack_out": [ "interest_amount#0", @@ -15919,7 +16579,7 @@ "principal_amount#0" ] }, - "2190": { + "2292": { "op": "-", "defined_out": [ "box_prefixed_key%0#4", @@ -15938,8 +16598,8 @@ "tmp%3#0" ] }, - "2191": { - "op": "bytec 11 // \"reserved_principal\"", + "2293": { + "op": "bytec 12 // \"reserved_principal\"", "stack_out": [ "interest_amount#0", "principal_amount#0", @@ -15951,7 +16611,7 @@ "\"reserved_principal\"" ] }, - "2193": { + "2295": { "op": "swap", "stack_out": [ "interest_amount#0", @@ -15964,7 +16624,7 @@ "tmp%3#0" ] }, - "2194": { + "2296": { "op": "app_global_put", "stack_out": [ "interest_amount#0", @@ -15975,7 +16635,7 @@ "box_prefixed_key%0#4" ] }, - "2195": { + "2297": { "block": "claim_due_cashflows_after_if_else@3", "stack_in": [ "interest_amount#0", @@ -15999,7 +16659,7 @@ "interest_amount#0" ] }, - "2197": { + "2299": { "op": "dup", "defined_out": [ "interest_amount#0", @@ -16016,7 +16676,7 @@ "interest_amount#0 (copy)" ] }, - "2198": { + "2300": { "op": "dig 6", "defined_out": [ "interest_amount#0", @@ -16035,7 +16695,7 @@ "principal_amount#0" ] }, - "2200": { + "2302": { "op": "dup", "defined_out": [ "interest_amount#0", @@ -16056,7 +16716,7 @@ "principal_amount#0 (copy)" ] }, - "2201": { + "2303": { "op": "cover 3", "stack_out": [ "interest_amount#0", @@ -16071,7 +16731,7 @@ "principal_amount#0 (copy)" ] }, - "2203": { + "2305": { "op": "+", "defined_out": [ "interest_amount#0", @@ -16090,7 +16750,7 @@ "tmp%5#1" ] }, - "2204": { + "2306": { "op": "global LatestTimestamp", "defined_out": [ "interest_amount#0", @@ -16111,7 +16771,7 @@ "tmp%6#0" ] }, - "2206": { + "2308": { "op": "uncover 2", "stack_out": [ "interest_amount#0", @@ -16126,7 +16786,7 @@ "interest_amount#0" ] }, - "2208": { + "2310": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%1#0", @@ -16148,7 +16808,7 @@ "aggregate%val_as_bytes%1#0" ] }, - "2209": { + "2311": { "op": "uncover 3", "stack_out": [ "interest_amount#0", @@ -16163,7 +16823,7 @@ "principal_amount#0" ] }, - "2211": { + "2313": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%1#0", @@ -16186,7 +16846,7 @@ "aggregate%val_as_bytes%2#0" ] }, - "2212": { + "2314": { "op": "concat", "defined_out": [ "aggregate%head%1#0", @@ -16207,7 +16867,7 @@ "aggregate%head%1#0" ] }, - "2213": { + "2315": { "op": "uncover 2", "stack_out": [ "interest_amount#0", @@ -16221,7 +16881,7 @@ "tmp%5#1" ] }, - "2215": { + "2317": { "op": "itob", "defined_out": [ "aggregate%head%1#0", @@ -16242,7 +16902,7 @@ "aggregate%val_as_bytes%3#0" ] }, - "2216": { + "2318": { "op": "concat", "defined_out": [ "aggregate%head%2#0", @@ -16261,7 +16921,7 @@ "aggregate%head%2#0" ] }, - "2217": { + "2319": { "op": "swap", "stack_out": [ "interest_amount#0", @@ -16274,7 +16934,7 @@ "tmp%6#0" ] }, - "2218": { + "2320": { "op": "itob", "defined_out": [ "aggregate%head%2#0", @@ -16293,7 +16953,7 @@ "aggregate%val_as_bytes%4#0" ] }, - "2219": { + "2321": { "op": "concat", "defined_out": [ "aggregate%head%3#0", @@ -16310,7 +16970,7 @@ "aggregate%head%3#0" ] }, - "2220": { + "2322": { "op": "dig 2", "defined_out": [ "aggregate%head%3#0", @@ -16329,7 +16989,7 @@ "payment_info#0" ] }, - "2222": { + "2324": { "op": "dup", "defined_out": [ "aggregate%head%3#0", @@ -16350,7 +17010,7 @@ "payment_info#0 (copy)" ] }, - "2223": { + "2325": { "op": "len", "defined_out": [ "aggregate%head%3#0", @@ -16371,7 +17031,7 @@ "aggregate%length%0#0" ] }, - "2224": { + "2326": { "op": "itob", "defined_out": [ "aggregate%as_bytes%0#0", @@ -16392,7 +17052,7 @@ "aggregate%as_bytes%0#0" ] }, - "2225": { + "2327": { "op": "extract 6 2", "defined_out": [ "aggregate%head%3#0", @@ -16413,7 +17073,7 @@ "aggregate%length_uint16%0#0" ] }, - "2228": { + "2330": { "op": "swap", "stack_out": [ "interest_amount#0", @@ -16427,7 +17087,7 @@ "payment_info#0" ] }, - "2229": { + "2331": { "op": "concat", "defined_out": [ "aggregate%encoded_value%0#0", @@ -16447,7 +17107,7 @@ "aggregate%encoded_value%0#0" ] }, - "2230": { + "2332": { "op": "swap", "stack_out": [ "interest_amount#0", @@ -16460,7 +17120,7 @@ "aggregate%head%3#0" ] }, - "2231": { + "2333": { "op": "pushbytes 0x0022", "defined_out": [ "0x0022", @@ -16482,7 +17142,7 @@ "0x0022" ] }, - "2235": { + "2337": { "op": "concat", "defined_out": [ "aggregate%encoded_value%0#0", @@ -16502,7 +17162,7 @@ "aggregate%head%4#0" ] }, - "2236": { + "2338": { "op": "swap", "stack_out": [ "interest_amount#0", @@ -16515,7 +17175,7 @@ "aggregate%encoded_value%0#0" ] }, - "2237": { + "2339": { "op": "concat", "defined_out": [ "aggregate%concat%0#0", @@ -16533,7 +17193,7 @@ "aggregate%concat%0#0" ] }, - "2238": { + "2340": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -16553,7 +17213,7 @@ "0x151f7c75" ] }, - "2239": { + "2341": { "op": "swap", "stack_out": [ "interest_amount#0", @@ -16566,7 +17226,7 @@ "aggregate%concat%0#0" ] }, - "2240": { + "2342": { "op": "concat", "defined_out": [ "interest_amount#0", @@ -16584,7 +17244,7 @@ "tmp%5#0" ] }, - "2241": { + "2343": { "op": "log", "stack_out": [ "interest_amount#0", @@ -16595,7 +17255,7 @@ "box_prefixed_key%0#4" ] }, - "2242": { + "2344": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -16613,7 +17273,7 @@ "1" ] }, - "2243": { + "2345": { "op": "return", "stack_out": [ "interest_amount#0", @@ -16624,7 +17284,7 @@ "box_prefixed_key%0#4" ] }, - "2244": { + "2346": { "block": "claim_due_cashflows_bool_false@24", "stack_in": [ "interest_amount#0", @@ -16648,10 +17308,10 @@ "and_result%0#0" ] }, - "2245": { + "2347": { "op": "b claim_due_cashflows_bool_merge@25" }, - "2248": { + "2350": { "block": "claim_due_cashflows_bool_false@15", "stack_in": [ "interest_amount#0", @@ -16675,10 +17335,10 @@ "or_result%0#0" ] }, - "2249": { + "2351": { "op": "b claim_due_cashflows_bool_merge@16" }, - "2252": { + "2354": { "subroutine": "modules.transfer_agent.TransferAgent.transfer_set_schedule[routing]", "params": {}, "block": "transfer_set_schedule", @@ -16691,7 +17351,7 @@ "tmp%0#0" ] }, - "2255": { + "2357": { "op": "dup", "defined_out": [ "tmp%0#0", @@ -16702,7 +17362,7 @@ "tmp%0#0 (copy)" ] }, - "2256": { + "2358": { "op": "len", "defined_out": [ "len%0#0", @@ -16713,7 +17373,7 @@ "len%0#0" ] }, - "2257": { + "2359": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -16726,7 +17386,7 @@ "8" ] }, - "2258": { + "2360": { "op": "==", "defined_out": [ "eq%0#0", @@ -16737,14 +17397,14 @@ "eq%0#0" ] }, - "2259": { + "2361": { "error": "invalid number of bytes for arc4.uint64", "op": "assert // invalid number of bytes for arc4.uint64", "stack_out": [ "tmp%0#0" ] }, - "2260": { + "2362": { "op": "btoi", "defined_out": [ "open_date#0" @@ -16753,7 +17413,7 @@ "open_date#0" ] }, - "2261": { + "2363": { "op": "txna ApplicationArgs 2", "defined_out": [ "open_date#0", @@ -16764,7 +17424,7 @@ "tmp%2#0" ] }, - "2264": { + "2366": { "op": "dup", "defined_out": [ "open_date#0", @@ -16777,7 +17437,7 @@ "tmp%2#0 (copy)" ] }, - "2265": { + "2367": { "op": "len", "defined_out": [ "len%1#0", @@ -16790,7 +17450,7 @@ "len%1#0" ] }, - "2266": { + "2368": { "op": "intc_2 // 8", "stack_out": [ "open_date#0", @@ -16799,7 +17459,7 @@ "8" ] }, - "2267": { + "2369": { "op": "==", "defined_out": [ "eq%1#0", @@ -16812,7 +17472,7 @@ "eq%1#0" ] }, - "2268": { + "2370": { "error": "invalid number of bytes for arc4.uint64", "op": "assert // invalid number of bytes for arc4.uint64", "stack_out": [ @@ -16820,7 +17480,7 @@ "tmp%2#0" ] }, - "2269": { + "2371": { "op": "btoi", "defined_out": [ "closure_date#0", @@ -16831,11 +17491,11 @@ "closure_date#0" ] }, - "2270": { + "2372": { "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", "op": "callsub _assert_caller_is_arranger" }, - "2273": { + "2375": { "op": "dup2", "defined_out": [ "closure_date#0", @@ -16850,7 +17510,7 @@ "closure_date#0 (copy)" ] }, - "2274": { + "2376": { "op": "<", "defined_out": [ "closure_date#0", @@ -16863,7 +17523,7 @@ "tmp%0#1" ] }, - "2275": { + "2377": { "error": "Time events must be sorted in strictly ascending order", "op": "assert // Time events must be sorted in strictly ascending order", "stack_out": [ @@ -16871,8 +17531,8 @@ "closure_date#0" ] }, - "2276": { - "op": "bytec 27 // \"transfer_opening_date\"", + "2378": { + "op": "bytec 28 // \"transfer_opening_date\"", "defined_out": [ "\"transfer_opening_date\"", "closure_date#0", @@ -16884,7 +17544,7 @@ "\"transfer_opening_date\"" ] }, - "2278": { + "2380": { "op": "uncover 2", "stack_out": [ "closure_date#0", @@ -16892,14 +17552,14 @@ "open_date#0" ] }, - "2280": { + "2382": { "op": "app_global_put", "stack_out": [ "closure_date#0" ] }, - "2281": { - "op": "bytec 28 // \"transfer_closure_date\"", + "2383": { + "op": "bytec 29 // \"transfer_closure_date\"", "defined_out": [ "\"transfer_closure_date\"", "closure_date#0" @@ -16909,18 +17569,18 @@ "\"transfer_closure_date\"" ] }, - "2283": { + "2385": { "op": "swap", "stack_out": [ "\"transfer_closure_date\"", "closure_date#0" ] }, - "2284": { + "2386": { "op": "app_global_put", "stack_out": [] }, - "2285": { + "2387": { "op": "global LatestTimestamp", "defined_out": [ "tmp%1#1" @@ -16929,7 +17589,7 @@ "tmp%1#1" ] }, - "2287": { + "2389": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0" @@ -16938,7 +17598,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "2288": { + "2390": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -16949,14 +17609,14 @@ "0x151f7c75" ] }, - "2289": { + "2391": { "op": "swap", "stack_out": [ "0x151f7c75", "aggregate%val_as_bytes%0#0" ] }, - "2290": { + "2392": { "op": "concat", "defined_out": [ "tmp%6#0" @@ -16965,11 +17625,11 @@ "tmp%6#0" ] }, - "2291": { + "2393": { "op": "log", "stack_out": [] }, - "2292": { + "2394": { "op": "intc_1 // 1", "defined_out": [ "1" @@ -16978,11 +17638,11 @@ "1" ] }, - "2293": { + "2395": { "op": "return", "stack_out": [] }, - "2294": { + "2396": { "subroutine": "modules.transfer_agent.TransferAgent.primary_distribution[routing]", "params": {}, "block": "primary_distribution", @@ -16995,7 +17655,7 @@ "holding_address#0" ] }, - "2297": { + "2399": { "op": "dup", "defined_out": [ "holding_address#0", @@ -17006,7 +17666,7 @@ "holding_address#0 (copy)" ] }, - "2298": { + "2400": { "op": "len", "defined_out": [ "holding_address#0", @@ -17017,7 +17677,7 @@ "len%0#0" ] }, - "2299": { + "2401": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -17030,7 +17690,7 @@ "32" ] }, - "2300": { + "2402": { "op": "==", "defined_out": [ "eq%0#0", @@ -17041,14 +17701,14 @@ "eq%0#0" ] }, - "2301": { + "2403": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ "holding_address#0" ] }, - "2302": { + "2404": { "op": "txna ApplicationArgs 2", "defined_out": [ "holding_address#0", @@ -17059,7 +17719,7 @@ "tmp%2#0" ] }, - "2305": { + "2407": { "op": "dup", "defined_out": [ "holding_address#0", @@ -17072,7 +17732,7 @@ "tmp%2#0 (copy)" ] }, - "2306": { + "2408": { "op": "len", "defined_out": [ "holding_address#0", @@ -17085,7 +17745,7 @@ "len%1#0" ] }, - "2307": { + "2409": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -17100,7 +17760,7 @@ "8" ] }, - "2308": { + "2410": { "op": "==", "defined_out": [ "eq%1#0", @@ -17113,7 +17773,7 @@ "eq%1#0" ] }, - "2309": { + "2411": { "error": "invalid number of bytes for arc4.uint64", "op": "assert // invalid number of bytes for arc4.uint64", "stack_out": [ @@ -17121,7 +17781,7 @@ "tmp%2#0" ] }, - "2310": { + "2412": { "op": "btoi", "defined_out": [ "holding_address#0", @@ -17132,7 +17792,7 @@ "units#0" ] }, - "2311": { + "2413": { "op": "dup", "stack_out": [ "holding_address#0", @@ -17140,7 +17800,7 @@ "units#0" ] }, - "2312": { + "2414": { "op": "cover 2", "defined_out": [ "holding_address#0", @@ -17152,7 +17812,7 @@ "units#0" ] }, - "2314": { + "2416": { "op": "intc_0 // 0", "stack_out": [ "units#0", @@ -17161,7 +17821,7 @@ "0" ] }, - "2315": { + "2417": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"", @@ -17177,7 +17837,7 @@ "\"status\"" ] }, - "2316": { + "2418": { "op": "app_global_get_ex", "defined_out": [ "holding_address#0", @@ -17193,7 +17853,7 @@ "maybe_exists%0#0" ] }, - "2317": { + "2419": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ @@ -17203,7 +17863,7 @@ "maybe_value%0#0" ] }, - "2318": { + "2420": { "error": "D-ASA not configured", "op": "assert // D-ASA not configured", "stack_out": [ @@ -17212,7 +17872,7 @@ "units#0" ] }, - "2319": { + "2421": { "op": "bytec 22 // 0x52235072696d6172794465616c657223", "defined_out": [ "0x52235072696d6172794465616c657223", @@ -17226,7 +17886,7 @@ "0x52235072696d6172794465616c657223" ] }, - "2321": { + "2423": { "op": "txn Sender", "defined_out": [ "0x52235072696d6172794465616c657223", @@ -17242,7 +17902,7 @@ "tmp%0#3" ] }, - "2323": { + "2425": { "callsub": "modules.rbac.RbacModule._role_is_active", "op": "callsub _role_is_active", "defined_out": [ @@ -17257,7 +17917,7 @@ "tmp%1#2" ] }, - "2326": { + "2428": { "error": "Not authorized", "op": "assert // Not authorized", "stack_out": [ @@ -17266,15 +17926,15 @@ "units#0" ] }, - "2327": { + "2429": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", "op": "callsub _assert_is_not_asset_defaulted" }, - "2330": { + "2432": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_suspended", "op": "callsub _assert_is_not_asset_suspended" }, - "2333": { + "2435": { "op": "intc_0 // 0", "stack_out": [ "units#0", @@ -17283,7 +17943,7 @@ "0" ] }, - "2334": { + "2436": { "op": "bytec_1 // \"status\"", "stack_out": [ "units#0", @@ -17293,7 +17953,7 @@ "\"status\"" ] }, - "2335": { + "2437": { "op": "app_global_get_ex", "stack_out": [ "units#0", @@ -17303,7 +17963,7 @@ "maybe_exists%0#0" ] }, - "2336": { + "2438": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ @@ -17313,7 +17973,7 @@ "maybe_value%0#0" ] }, - "2337": { + "2439": { "op": "pushint 50", "defined_out": [ "50", @@ -17329,7 +17989,7 @@ "50" ] }, - "2339": { + "2441": { "op": "==", "defined_out": [ "holding_address#0", @@ -17343,7 +18003,7 @@ "tmp%0#4" ] }, - "2340": { + "2442": { "error": "Primary distribution is closed", "op": "assert // Primary distribution is closed", "stack_out": [ @@ -17352,7 +18012,7 @@ "units#0" ] }, - "2341": { + "2443": { "op": "bytec 8 // 0x52234163636f756e7423", "defined_out": [ "0x52234163636f756e7423", @@ -17366,7 +18026,7 @@ "0x52234163636f756e7423" ] }, - "2343": { + "2445": { "op": "dig 2", "stack_out": [ "units#0", @@ -17376,7 +18036,7 @@ "holding_address#0 (copy)" ] }, - "2345": { + "2447": { "op": "concat", "defined_out": [ "box_prefixed_key%0#1", @@ -17390,7 +18050,7 @@ "box_prefixed_key%0#1" ] }, - "2346": { + "2448": { "op": "dup", "stack_out": [ "units#0", @@ -17400,7 +18060,7 @@ "box_prefixed_key%0#1" ] }, - "2347": { + "2449": { "op": "cover 3", "defined_out": [ "box_prefixed_key%0#1", @@ -17415,7 +18075,7 @@ "box_prefixed_key%0#1" ] }, - "2349": { + "2451": { "op": "box_len", "defined_out": [ "_%0#0", @@ -17433,7 +18093,7 @@ "maybe_exists%0#0" ] }, - "2350": { + "2452": { "op": "bury 1", "stack_out": [ "units#0", @@ -17443,7 +18103,7 @@ "maybe_exists%0#0" ] }, - "2352": { + "2454": { "error": "Invalid account holding address", "op": "assert // Invalid account holding address", "stack_out": [ @@ -17453,7 +18113,7 @@ "units#0" ] }, - "2353": { + "2455": { "op": "swap", "stack_out": [ "units#0", @@ -17462,7 +18122,7 @@ "holding_address#0" ] }, - "2354": { + "2456": { "callsub": "modules.accounting.AccountingModule._assert_is_not_account_suspended", "op": "callsub _assert_is_not_account_suspended", "stack_out": [ @@ -17471,7 +18131,7 @@ "units#0" ] }, - "2357": { + "2459": { "op": "dup", "defined_out": [ "box_prefixed_key%0#1", @@ -17485,7 +18145,7 @@ "units#0 (copy)" ] }, - "2358": { + "2460": { "error": "Can not distribute zero units", "op": "assert // Can not distribute zero units", "stack_out": [ @@ -17494,7 +18154,7 @@ "units#0" ] }, - "2359": { + "2461": { "op": "intc_0 // 0", "stack_out": [ "units#0", @@ -17503,8 +18163,8 @@ "0" ] }, - "2360": { - "op": "bytec 10 // \"reserved_units_total\"", + "2462": { + "op": "bytec 11 // \"reserved_units_total\"", "defined_out": [ "\"reserved_units_total\"", "0", @@ -17519,7 +18179,7 @@ "\"reserved_units_total\"" ] }, - "2362": { + "2464": { "op": "app_global_get_ex", "stack_out": [ "units#0", @@ -17529,7 +18189,7 @@ "maybe_exists%0#0" ] }, - "2363": { + "2465": { "error": "check self.reserved_units_total exists", "op": "assert // check self.reserved_units_total exists", "stack_out": [ @@ -17539,7 +18199,7 @@ "maybe_value%0#0" ] }, - "2364": { + "2466": { "op": "+", "defined_out": [ "box_prefixed_key%0#1", @@ -17552,7 +18212,7 @@ "tmp%2#1" ] }, - "2365": { + "2467": { "op": "intc_0 // 0", "stack_out": [ "units#0", @@ -17561,7 +18221,7 @@ "0" ] }, - "2366": { + "2468": { "op": "bytec 13 // \"total_units\"", "defined_out": [ "\"total_units\"", @@ -17578,7 +18238,7 @@ "\"total_units\"" ] }, - "2368": { + "2470": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#1", @@ -17595,7 +18255,7 @@ "maybe_exists%1#0" ] }, - "2369": { + "2471": { "error": "check self.total_units exists", "op": "assert // check self.total_units exists", "stack_out": [ @@ -17605,7 +18265,7 @@ "maybe_value%1#0" ] }, - "2370": { + "2472": { "op": "<=", "defined_out": [ "box_prefixed_key%0#1", @@ -17618,7 +18278,7 @@ "tmp%3#1" ] }, - "2371": { + "2473": { "error": "Insufficient remaining D-ASA units", "op": "assert // Insufficient remaining D-ASA units", "stack_out": [ @@ -17626,7 +18286,7 @@ "box_prefixed_key%0#1" ] }, - "2372": { + "2474": { "op": "intc_0 // 0", "stack_out": [ "units#0", @@ -17634,8 +18294,8 @@ "0" ] }, - "2373": { - "op": "bytec 26 // \"initial_exchange_date\"", + "2475": { + "op": "bytec 27 // \"initial_exchange_date\"", "defined_out": [ "\"initial_exchange_date\"", "0", @@ -17649,7 +18309,7 @@ "\"initial_exchange_date\"" ] }, - "2375": { + "2477": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#1", @@ -17664,7 +18324,7 @@ "maybe_exists%2#0" ] }, - "2376": { + "2478": { "error": "check self.initial_exchange_date exists", "op": "assert // check self.initial_exchange_date exists", "stack_out": [ @@ -17673,14 +18333,14 @@ "maybe_value%2#0" ] }, - "2377": { + "2479": { "op": "bz primary_distribution_after_if_else@3", "stack_out": [ "units#0", "box_prefixed_key%0#1" ] }, - "2380": { + "2482": { "op": "global LatestTimestamp", "defined_out": [ "box_prefixed_key%0#1", @@ -17693,7 +18353,7 @@ "tmp%5#1" ] }, - "2382": { + "2484": { "op": "intc_0 // 0", "stack_out": [ "units#0", @@ -17702,8 +18362,8 @@ "0" ] }, - "2383": { - "op": "bytec 26 // \"initial_exchange_date\"", + "2485": { + "op": "bytec 27 // \"initial_exchange_date\"", "stack_out": [ "units#0", "box_prefixed_key%0#1", @@ -17712,7 +18372,7 @@ "\"initial_exchange_date\"" ] }, - "2385": { + "2487": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#1", @@ -17729,7 +18389,7 @@ "maybe_exists%3#0" ] }, - "2386": { + "2488": { "error": "check self.initial_exchange_date exists", "op": "assert // check self.initial_exchange_date exists", "stack_out": [ @@ -17739,7 +18399,7 @@ "maybe_value%3#0" ] }, - "2387": { + "2489": { "op": "<=", "defined_out": [ "box_prefixed_key%0#1", @@ -17752,7 +18412,7 @@ "tmp%6#1" ] }, - "2388": { + "2490": { "error": "Primary distribution is closed", "op": "assert // Primary distribution is closed", "stack_out": [ @@ -17760,7 +18420,7 @@ "box_prefixed_key%0#1" ] }, - "2389": { + "2491": { "block": "primary_distribution_after_if_else@3", "stack_in": [ "units#0", @@ -17778,7 +18438,7 @@ "box_prefixed_key%0#1 (copy)" ] }, - "2391": { + "2493": { "op": "box_get", "defined_out": [ "aggregate%box_get%0#0", @@ -17793,7 +18453,7 @@ "aggregate%box_get%1#0" ] }, - "2392": { + "2494": { "error": "check self.account entry exists", "op": "assert // check self.account entry exists", "stack_out": [ @@ -17803,7 +18463,7 @@ "aggregate%box_get%0#0" ] }, - "2393": { + "2495": { "op": "pushint 40", "defined_out": [ "40", @@ -17818,7 +18478,7 @@ "40" ] }, - "2395": { + "2497": { "op": "extract_uint64", "defined_out": [ "box_prefixed_key%0#1", @@ -17831,7 +18491,7 @@ "values%0#0" ] }, - "2396": { + "2498": { "op": "dig 3", "defined_out": [ "box_prefixed_key%0#1", @@ -17846,7 +18506,7 @@ "units#0" ] }, - "2398": { + "2500": { "op": "dup", "defined_out": [ "box_prefixed_key%0#1", @@ -17863,7 +18523,7 @@ "units#0 (copy)" ] }, - "2399": { + "2501": { "op": "cover 3", "stack_out": [ "units#0", @@ -17874,7 +18534,7 @@ "units#0 (copy)" ] }, - "2401": { + "2503": { "op": "+", "defined_out": [ "box_prefixed_key%0#1", @@ -17889,7 +18549,7 @@ "tmp%0#2" ] }, - "2402": { + "2504": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0", @@ -17904,10 +18564,10 @@ "aggregate%val_as_bytes%0#0" ] }, - "2403": { + "2505": { "op": "pushint 40" }, - "2405": { + "2507": { "op": "swap", "stack_out": [ "units#0", @@ -17918,7 +18578,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "2406": { + "2508": { "op": "box_replace", "stack_out": [ "units#0", @@ -17926,7 +18586,7 @@ "units#0" ] }, - "2407": { + "2509": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -17940,8 +18600,8 @@ "0" ] }, - "2408": { - "op": "bytec 10 // \"reserved_units_total\"", + "2510": { + "op": "bytec 11 // \"reserved_units_total\"", "defined_out": [ "\"reserved_units_total\"", "0", @@ -17956,7 +18616,7 @@ "\"reserved_units_total\"" ] }, - "2410": { + "2512": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#1", @@ -17972,7 +18632,7 @@ "maybe_exists%4#0" ] }, - "2411": { + "2513": { "error": "check self.reserved_units_total exists", "op": "assert // check self.reserved_units_total exists", "stack_out": [ @@ -17982,7 +18642,7 @@ "maybe_value%4#0" ] }, - "2412": { + "2514": { "op": "+", "defined_out": [ "box_prefixed_key%0#1", @@ -17995,8 +18655,8 @@ "tmp%7#0" ] }, - "2413": { - "op": "bytec 10 // \"reserved_units_total\"", + "2515": { + "op": "bytec 11 // \"reserved_units_total\"", "stack_out": [ "units#0", "box_prefixed_key%0#1", @@ -18004,7 +18664,7 @@ "\"reserved_units_total\"" ] }, - "2415": { + "2517": { "op": "dig 1", "defined_out": [ "\"reserved_units_total\"", @@ -18021,7 +18681,7 @@ "tmp%7#0 (copy)" ] }, - "2417": { + "2519": { "op": "app_global_put", "stack_out": [ "units#0", @@ -18029,7 +18689,7 @@ "tmp%7#0" ] }, - "2418": { + "2520": { "op": "intc_0 // 0", "stack_out": [ "units#0", @@ -18038,7 +18698,7 @@ "0" ] }, - "2419": { + "2521": { "op": "bytec 13 // \"total_units\"", "defined_out": [ "\"total_units\"", @@ -18055,7 +18715,7 @@ "\"total_units\"" ] }, - "2421": { + "2523": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#1", @@ -18072,7 +18732,7 @@ "maybe_exists%5#0" ] }, - "2422": { + "2524": { "error": "check self.total_units exists", "op": "assert // check self.total_units exists", "stack_out": [ @@ -18082,7 +18742,7 @@ "maybe_value%5#0" ] }, - "2423": { + "2525": { "op": "swap", "stack_out": [ "units#0", @@ -18091,7 +18751,7 @@ "tmp%7#0" ] }, - "2424": { + "2526": { "op": "-", "defined_out": [ "box_prefixed_key%0#1", @@ -18104,7 +18764,7 @@ "tmp%8#0" ] }, - "2425": { + "2527": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%1#0", @@ -18117,7 +18777,7 @@ "aggregate%val_as_bytes%1#0" ] }, - "2426": { + "2528": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -18132,7 +18792,7 @@ "0x151f7c75" ] }, - "2427": { + "2529": { "op": "swap", "stack_out": [ "units#0", @@ -18141,7 +18801,7 @@ "aggregate%val_as_bytes%1#0" ] }, - "2428": { + "2530": { "op": "concat", "defined_out": [ "box_prefixed_key%0#1", @@ -18154,14 +18814,14 @@ "tmp%6#0" ] }, - "2429": { + "2531": { "op": "log", "stack_out": [ "units#0", "box_prefixed_key%0#1" ] }, - "2430": { + "2532": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -18174,14 +18834,14 @@ "1" ] }, - "2431": { + "2533": { "op": "return", "stack_out": [ "units#0", "box_prefixed_key%0#1" ] }, - "2432": { + "2534": { "subroutine": "modules.transfer_agent.TransferAgent.transfer[routing]", "params": {}, "block": "transfer", @@ -18191,17 +18851,17 @@ "box_prefixed_key%0#3" ] }, - "2433": { + "2535": { "op": "dup", "stack_out": [ "box_prefixed_key%0#3", "box_prefixed_key%0#4" ] }, - "2434": { + "2536": { "op": "txna ApplicationArgs 1" }, - "2437": { + "2539": { "op": "dup", "defined_out": [ "sender_holding_address#0" @@ -18213,7 +18873,7 @@ "sender_holding_address#0" ] }, - "2438": { + "2540": { "op": "len", "defined_out": [ "len%0#0", @@ -18226,7 +18886,7 @@ "len%0#0" ] }, - "2439": { + "2541": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -18241,7 +18901,7 @@ "32" ] }, - "2440": { + "2542": { "op": "==", "defined_out": [ "eq%0#0", @@ -18254,7 +18914,7 @@ "eq%0#0" ] }, - "2441": { + "2543": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ @@ -18263,10 +18923,10 @@ "sender_holding_address#0" ] }, - "2442": { + "2544": { "op": "txna ApplicationArgs 2" }, - "2445": { + "2547": { "op": "dup", "defined_out": [ "receiver_holding_address#0", @@ -18280,7 +18940,7 @@ "receiver_holding_address#0" ] }, - "2446": { + "2548": { "op": "len", "defined_out": [ "len%1#0", @@ -18295,7 +18955,7 @@ "len%1#0" ] }, - "2447": { + "2549": { "op": "intc_3 // 32", "stack_out": [ "box_prefixed_key%0#3", @@ -18306,7 +18966,7 @@ "32" ] }, - "2448": { + "2550": { "op": "==", "defined_out": [ "eq%1#0", @@ -18321,7 +18981,7 @@ "eq%1#0" ] }, - "2449": { + "2551": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ @@ -18331,10 +18991,10 @@ "receiver_holding_address#0" ] }, - "2450": { + "2552": { "op": "txna ApplicationArgs 3" }, - "2453": { + "2555": { "op": "dupn 2", "defined_out": [ "receiver_holding_address#0", @@ -18352,7 +19012,7 @@ "tmp%4#0 (copy)" ] }, - "2455": { + "2557": { "op": "len", "defined_out": [ "len%2#0", @@ -18370,7 +19030,7 @@ "len%2#0" ] }, - "2456": { + "2558": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -18390,7 +19050,7 @@ "8" ] }, - "2457": { + "2559": { "op": "==", "defined_out": [ "eq%2#0", @@ -18408,7 +19068,7 @@ "eq%2#0" ] }, - "2458": { + "2560": { "error": "invalid number of bytes for arc4.uint64", "op": "assert // invalid number of bytes for arc4.uint64", "stack_out": [ @@ -18420,7 +19080,7 @@ "tmp%4#0" ] }, - "2459": { + "2561": { "op": "btoi", "defined_out": [ "receiver_holding_address#0", @@ -18437,7 +19097,7 @@ "units#0" ] }, - "2460": { + "2562": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#3", @@ -18449,7 +19109,7 @@ "0" ] }, - "2461": { + "2563": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"", @@ -18470,7 +19130,7 @@ "\"status\"" ] }, - "2462": { + "2564": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -18491,7 +19151,7 @@ "maybe_exists%0#0" ] }, - "2463": { + "2565": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ @@ -18504,7 +19164,7 @@ "maybe_value%0#0" ] }, - "2464": { + "2566": { "error": "D-ASA not configured", "op": "assert // D-ASA not configured", "stack_out": [ @@ -18516,15 +19176,15 @@ "units#0" ] }, - "2465": { + "2567": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", "op": "callsub _assert_is_not_asset_defaulted" }, - "2468": { + "2570": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_suspended", "op": "callsub _assert_is_not_asset_suspended" }, - "2471": { + "2573": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#3", @@ -18536,7 +19196,7 @@ "0" ] }, - "2472": { + "2574": { "op": "bytec_1 // \"status\"", "stack_out": [ "box_prefixed_key%0#3", @@ -18549,7 +19209,7 @@ "\"status\"" ] }, - "2473": { + "2575": { "op": "app_global_get_ex", "stack_out": [ "box_prefixed_key%0#3", @@ -18562,7 +19222,7 @@ "maybe_exists%0#0" ] }, - "2474": { + "2576": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ @@ -18575,7 +19235,7 @@ "maybe_value%0#0" ] }, - "2475": { + "2577": { "op": "pushint 50", "defined_out": [ "50", @@ -18596,7 +19256,7 @@ "50" ] }, - "2477": { + "2579": { "op": "==", "defined_out": [ "receiver_holding_address#0", @@ -18615,7 +19275,7 @@ "tmp%0#3" ] }, - "2478": { + "2580": { "op": "!", "defined_out": [ "receiver_holding_address#0", @@ -18634,7 +19294,7 @@ "tmp%1#1" ] }, - "2479": { + "2581": { "error": "IED not yet executed", "op": "assert // IED not yet executed", "stack_out": [ @@ -18646,7 +19306,7 @@ "units#0" ] }, - "2480": { + "2582": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#3", @@ -18658,8 +19318,8 @@ "0" ] }, - "2481": { - "op": "bytec 27 // \"transfer_opening_date\"", + "2583": { + "op": "bytec 28 // \"transfer_opening_date\"", "defined_out": [ "\"transfer_opening_date\"", "0", @@ -18679,7 +19339,7 @@ "\"transfer_opening_date\"" ] }, - "2483": { + "2585": { "op": "app_global_get_ex", "stack_out": [ "box_prefixed_key%0#3", @@ -18692,7 +19352,7 @@ "maybe_exists%0#0" ] }, - "2484": { + "2586": { "error": "check self.transfer_opening_date exists", "op": "assert // check self.transfer_opening_date exists", "stack_out": [ @@ -18705,7 +19365,7 @@ "maybe_value%0#0" ] }, - "2485": { + "2587": { "op": "bz transfer_after_if_else@3", "stack_out": [ "box_prefixed_key%0#3", @@ -18716,7 +19376,7 @@ "units#0" ] }, - "2488": { + "2590": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#3", @@ -18728,8 +19388,8 @@ "0" ] }, - "2489": { - "op": "bytec 27 // \"transfer_opening_date\"", + "2591": { + "op": "bytec 28 // \"transfer_opening_date\"", "stack_out": [ "box_prefixed_key%0#3", "box_prefixed_key%0#4", @@ -18741,7 +19401,7 @@ "\"transfer_opening_date\"" ] }, - "2491": { + "2593": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%1#0", @@ -18762,7 +19422,7 @@ "maybe_exists%1#0" ] }, - "2492": { + "2594": { "error": "check self.transfer_opening_date exists", "op": "assert // check self.transfer_opening_date exists", "stack_out": [ @@ -18775,7 +19435,7 @@ "maybe_value%1#0" ] }, - "2493": { + "2595": { "op": "global LatestTimestamp", "defined_out": [ "maybe_value%1#0", @@ -18796,7 +19456,7 @@ "tmp%1#2" ] }, - "2495": { + "2597": { "op": "<=", "defined_out": [ "receiver_holding_address#0", @@ -18815,7 +19475,7 @@ "tmp%2#1" ] }, - "2496": { + "2598": { "error": "Transfer is closed", "op": "assert // Transfer is closed", "stack_out": [ @@ -18827,7 +19487,7 @@ "units#0" ] }, - "2497": { + "2599": { "block": "transfer_after_if_else@3", "stack_in": [ "box_prefixed_key%0#3", @@ -18851,8 +19511,8 @@ "0" ] }, - "2498": { - "op": "bytec 28 // \"transfer_closure_date\"", + "2600": { + "op": "bytec 29 // \"transfer_closure_date\"", "defined_out": [ "\"transfer_closure_date\"", "0" @@ -18868,7 +19528,7 @@ "\"transfer_closure_date\"" ] }, - "2500": { + "2602": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%2#0", @@ -18885,7 +19545,7 @@ "maybe_exists%2#0" ] }, - "2501": { + "2603": { "error": "check self.transfer_closure_date exists", "op": "assert // check self.transfer_closure_date exists", "stack_out": [ @@ -18898,7 +19558,7 @@ "maybe_value%2#0" ] }, - "2502": { + "2604": { "op": "bz transfer_after_if_else@5", "stack_out": [ "box_prefixed_key%0#3", @@ -18909,7 +19569,7 @@ "units#0" ] }, - "2505": { + "2607": { "op": "global LatestTimestamp", "defined_out": [ "tmp%4#2" @@ -18924,7 +19584,7 @@ "tmp%4#2" ] }, - "2507": { + "2609": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#3", @@ -18937,8 +19597,8 @@ "0" ] }, - "2508": { - "op": "bytec 28 // \"transfer_closure_date\"", + "2610": { + "op": "bytec 29 // \"transfer_closure_date\"", "stack_out": [ "box_prefixed_key%0#3", "box_prefixed_key%0#4", @@ -18951,7 +19611,7 @@ "\"transfer_closure_date\"" ] }, - "2510": { + "2612": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%3#0", @@ -18970,7 +19630,7 @@ "maybe_exists%3#0" ] }, - "2511": { + "2613": { "error": "check self.transfer_closure_date exists", "op": "assert // check self.transfer_closure_date exists", "stack_out": [ @@ -18984,7 +19644,7 @@ "maybe_value%3#0" ] }, - "2512": { + "2614": { "op": "<", "defined_out": [ "tmp%5#0" @@ -18999,7 +19659,7 @@ "tmp%5#0" ] }, - "2513": { + "2615": { "error": "Transfer is closed", "op": "assert // Transfer is closed", "stack_out": [ @@ -19011,7 +19671,7 @@ "units#0" ] }, - "2514": { + "2616": { "block": "transfer_after_if_else@5", "stack_in": [ "box_prefixed_key%0#3", @@ -19035,7 +19695,7 @@ "tmp%0#1" ] }, - "2516": { + "2618": { "op": "dig 4", "defined_out": [ "sender_holding_address#0", @@ -19052,7 +19712,7 @@ "sender_holding_address#0" ] }, - "2518": { + "2620": { "op": "dup", "defined_out": [ "sender_holding_address#0", @@ -19071,7 +19731,7 @@ "sender_holding_address#0 (copy)" ] }, - "2519": { + "2621": { "op": "cover 2", "stack_out": [ "box_prefixed_key%0#3", @@ -19085,7 +19745,7 @@ "sender_holding_address#0 (copy)" ] }, - "2521": { + "2623": { "op": "==", "defined_out": [ "sender_holding_address#0", @@ -19102,7 +19762,7 @@ "tmp%1#1" ] }, - "2522": { + "2624": { "error": "Not authorized", "op": "assert // Not authorized", "stack_out": [ @@ -19115,7 +19775,7 @@ "sender_holding_address#0" ] }, - "2523": { + "2625": { "op": "bytec 8 // 0x52234163636f756e7423", "defined_out": [ "0x52234163636f756e7423", @@ -19132,7 +19792,7 @@ "0x52234163636f756e7423" ] }, - "2525": { + "2627": { "op": "dig 1", "stack_out": [ "box_prefixed_key%0#3", @@ -19146,7 +19806,7 @@ "sender_holding_address#0 (copy)" ] }, - "2527": { + "2629": { "op": "concat", "defined_out": [ "box_prefixed_key%0#3", @@ -19163,7 +19823,7 @@ "box_prefixed_key%0#3" ] }, - "2528": { + "2630": { "op": "dup", "stack_out": [ "box_prefixed_key%0#3", @@ -19177,7 +19837,7 @@ "box_prefixed_key%0#3" ] }, - "2529": { + "2631": { "op": "bury 8", "defined_out": [ "box_prefixed_key%0#3", @@ -19194,7 +19854,7 @@ "box_prefixed_key%0#3" ] }, - "2531": { + "2633": { "op": "dup", "defined_out": [ "box_prefixed_key%0#3", @@ -19213,7 +19873,7 @@ "box_prefixed_key%0#3 (copy)" ] }, - "2532": { + "2634": { "op": "box_len", "defined_out": [ "_%0#0", @@ -19234,7 +19894,7 @@ "maybe_exists%0#0" ] }, - "2533": { + "2635": { "op": "bury 1", "stack_out": [ "box_prefixed_key%0#3", @@ -19248,7 +19908,7 @@ "maybe_exists%0#0" ] }, - "2535": { + "2637": { "error": "Invalid account holding address", "op": "assert // Invalid account holding address", "stack_out": [ @@ -19262,7 +19922,7 @@ "box_prefixed_key%0#3" ] }, - "2536": { + "2638": { "op": "bytec 8 // 0x52234163636f756e7423", "stack_out": [ "box_prefixed_key%0#3", @@ -19276,7 +19936,7 @@ "0x52234163636f756e7423" ] }, - "2538": { + "2640": { "op": "dig 5", "defined_out": [ "0x52234163636f756e7423", @@ -19297,7 +19957,7 @@ "receiver_holding_address#0" ] }, - "2540": { + "2642": { "op": "dup", "defined_out": [ "0x52234163636f756e7423", @@ -19320,7 +19980,7 @@ "receiver_holding_address#0 (copy)" ] }, - "2541": { + "2643": { "op": "cover 2", "stack_out": [ "box_prefixed_key%0#3", @@ -19336,7 +19996,7 @@ "receiver_holding_address#0 (copy)" ] }, - "2543": { + "2645": { "op": "concat", "defined_out": [ "box_prefixed_key%0#3", @@ -19357,7 +20017,7 @@ "box_prefixed_key%0#4" ] }, - "2544": { + "2646": { "op": "dup", "stack_out": [ "box_prefixed_key%0#3", @@ -19373,7 +20033,7 @@ "box_prefixed_key%0#4" ] }, - "2545": { + "2647": { "op": "bury 9", "defined_out": [ "box_prefixed_key%0#3", @@ -19394,7 +20054,7 @@ "box_prefixed_key%0#4" ] }, - "2547": { + "2649": { "op": "box_len", "stack_out": [ "box_prefixed_key%0#3", @@ -19410,7 +20070,7 @@ "maybe_exists%0#0" ] }, - "2548": { + "2650": { "op": "bury 1", "stack_out": [ "box_prefixed_key%0#3", @@ -19425,7 +20085,7 @@ "maybe_exists%0#0" ] }, - "2550": { + "2652": { "error": "Invalid account holding address", "op": "assert // Invalid account holding address", "stack_out": [ @@ -19440,7 +20100,7 @@ "receiver_holding_address#0" ] }, - "2551": { + "2653": { "op": "dig 2", "stack_out": [ "box_prefixed_key%0#3", @@ -19455,7 +20115,7 @@ "sender_holding_address#0 (copy)" ] }, - "2553": { + "2655": { "callsub": "modules.accounting.AccountingModule._assert_is_not_account_suspended", "op": "callsub _assert_is_not_account_suspended", "stack_out": [ @@ -19470,7 +20130,7 @@ "receiver_holding_address#0" ] }, - "2556": { + "2658": { "op": "dup", "stack_out": [ "box_prefixed_key%0#3", @@ -19485,7 +20145,7 @@ "receiver_holding_address#0 (copy)" ] }, - "2557": { + "2659": { "callsub": "modules.accounting.AccountingModule._assert_is_not_account_suspended", "op": "callsub _assert_is_not_account_suspended", "stack_out": [ @@ -19500,7 +20160,7 @@ "receiver_holding_address#0" ] }, - "2560": { + "2662": { "op": "uncover 2", "stack_out": [ "box_prefixed_key%0#3", @@ -19514,7 +20174,7 @@ "sender_holding_address#0" ] }, - "2562": { + "2664": { "op": "!=", "defined_out": [ "box_prefixed_key%0#3", @@ -19534,7 +20194,7 @@ "tmp%2#1" ] }, - "2563": { + "2665": { "error": "Sender and receiver must be different", "op": "assert // Sender and receiver must be different", "stack_out": [ @@ -19547,7 +20207,7 @@ "box_prefixed_key%0#3" ] }, - "2564": { + "2666": { "op": "dig 1", "defined_out": [ "box_prefixed_key%0#3", @@ -19567,7 +20227,7 @@ "units#0" ] }, - "2566": { + "2668": { "op": "dup", "defined_out": [ "box_prefixed_key%0#3", @@ -19589,7 +20249,7 @@ "units#0 (copy)" ] }, - "2567": { + "2669": { "error": "Transfer units must be greater than zero", "op": "assert // Transfer units must be greater than zero", "stack_out": [ @@ -19603,7 +20263,7 @@ "units#0" ] }, - "2568": { + "2670": { "op": "swap", "stack_out": [ "box_prefixed_key%0#3", @@ -19616,7 +20276,7 @@ "box_prefixed_key%0#3" ] }, - "2569": { + "2671": { "op": "box_get", "defined_out": [ "aggregate%box_get%0#0", @@ -19639,7 +20299,7 @@ "aggregate%box_get%1#0" ] }, - "2570": { + "2672": { "error": "check self.account entry exists", "op": "assert // check self.account entry exists", "stack_out": [ @@ -19653,7 +20313,7 @@ "aggregate%box_get%0#0" ] }, - "2571": { + "2673": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -19676,7 +20336,7 @@ "32" ] }, - "2572": { + "2674": { "op": "extract_uint64", "defined_out": [ "box_prefixed_key%0#3", @@ -19697,7 +20357,7 @@ "values%0#0" ] }, - "2573": { + "2675": { "op": "<=", "defined_out": [ "box_prefixed_key%0#3", @@ -19717,7 +20377,7 @@ "tmp%4#1" ] }, - "2574": { + "2676": { "error": "Insufficient sender units to transfer", "op": "assert // Insufficient sender units to transfer", "stack_out": [ @@ -19729,7 +20389,7 @@ "units#0" ] }, - "2575": { + "2677": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#3", @@ -19741,7 +20401,7 @@ "0" ] }, - "2576": { + "2678": { "op": "bytec_2 // \"event_cursor\"", "defined_out": [ "\"event_cursor\"", @@ -19763,7 +20423,7 @@ "\"event_cursor\"" ] }, - "2577": { + "2679": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#3", @@ -19785,7 +20445,7 @@ "maybe_exists%0#0" ] }, - "2578": { + "2680": { "error": "check self.event_cursor exists", "op": "assert // check self.event_cursor exists", "stack_out": [ @@ -19798,7 +20458,7 @@ "maybe_value%0#0" ] }, - "2579": { + "2681": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#3", @@ -19811,8 +20471,8 @@ "0" ] }, - "2580": { - "op": "bytec 4 // \"schedule_entry_count\"", + "2682": { + "op": "bytec_3 // \"schedule_entry_count\"", "defined_out": [ "\"schedule_entry_count\"", "0", @@ -19835,7 +20495,7 @@ "\"schedule_entry_count\"" ] }, - "2582": { + "2683": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#3", @@ -19859,7 +20519,7 @@ "maybe_exists%1#0" ] }, - "2583": { + "2684": { "error": "check self.schedule_entry_count exists", "op": "assert // check self.schedule_entry_count exists", "stack_out": [ @@ -19873,7 +20533,7 @@ "maybe_value%1#0" ] }, - "2584": { + "2685": { "op": ">=", "defined_out": [ "box_prefixed_key%0#3", @@ -19893,7 +20553,7 @@ "tmp%0#3" ] }, - "2585": { + "2686": { "op": "bnz transfer_after_inlined_modules.actus_kernel.ActusKernelModule._assert_no_due_event_pending@10", "stack_out": [ "box_prefixed_key%0#3", @@ -19904,7 +20564,7 @@ "units#0" ] }, - "2588": { + "2689": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#3", @@ -19916,7 +20576,7 @@ "0" ] }, - "2589": { + "2690": { "op": "bytec_2 // \"event_cursor\"", "stack_out": [ "box_prefixed_key%0#3", @@ -19929,7 +20589,7 @@ "\"event_cursor\"" ] }, - "2590": { + "2691": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#3", @@ -19951,7 +20611,7 @@ "maybe_exists%2#0" ] }, - "2591": { + "2692": { "error": "check self.event_cursor exists", "op": "assert // check self.event_cursor exists", "stack_out": [ @@ -19964,7 +20624,7 @@ "maybe_value%2#0" ] }, - "2592": { + "2693": { "callsub": "modules.actus_kernel.ActusKernelModule._get_schedule_entry", "op": "callsub _get_schedule_entry", "defined_out": [ @@ -19985,7 +20645,7 @@ "next_entry#0" ] }, - "2595": { + "2696": { "op": "pushint 9", "defined_out": [ "9", @@ -20007,7 +20667,7 @@ "9" ] }, - "2597": { + "2698": { "op": "extract_uint64", "stack_out": [ "box_prefixed_key%0#3", @@ -20019,7 +20679,7 @@ "values%0#0" ] }, - "2598": { + "2699": { "op": "global LatestTimestamp", "defined_out": [ "box_prefixed_key%0#3", @@ -20041,7 +20701,7 @@ "tmp%2#3" ] }, - "2600": { + "2701": { "op": ">", "defined_out": [ "box_prefixed_key%0#3", @@ -20061,7 +20721,7 @@ "tmp%3#3" ] }, - "2601": { + "2702": { "error": "ACTUS event not yet executed", "op": "assert // ACTUS event not yet executed", "stack_out": [ @@ -20073,7 +20733,7 @@ "units#0" ] }, - "2602": { + "2703": { "block": "transfer_after_inlined_modules.actus_kernel.ActusKernelModule._assert_no_due_event_pending@10", "stack_in": [ "box_prefixed_key%0#3", @@ -20097,7 +20757,7 @@ "sender_holding_address#0" ] }, - "2604": { + "2705": { "op": "dup", "defined_out": [ "sender_holding_address#0", @@ -20114,7 +20774,7 @@ "sender_holding_address#0 (copy)" ] }, - "2605": { + "2706": { "callsub": "modules.accounting.AccountingModule._ensure_units_activated", "op": "callsub _ensure_units_activated", "stack_out": [ @@ -20127,7 +20787,7 @@ "sender_holding_address#0" ] }, - "2608": { + "2709": { "op": "dig 3", "defined_out": [ "receiver_holding_address#0", @@ -20144,7 +20804,7 @@ "receiver_holding_address#0" ] }, - "2610": { + "2711": { "op": "dup", "defined_out": [ "receiver_holding_address#0", @@ -20163,7 +20823,7 @@ "receiver_holding_address#0 (copy)" ] }, - "2611": { + "2712": { "op": "cover 2", "stack_out": [ "box_prefixed_key%0#3", @@ -20177,7 +20837,7 @@ "receiver_holding_address#0 (copy)" ] }, - "2613": { + "2714": { "callsub": "modules.accounting.AccountingModule._ensure_units_activated", "op": "callsub _ensure_units_activated", "stack_out": [ @@ -20191,7 +20851,7 @@ "sender_holding_address#0" ] }, - "2616": { + "2717": { "callsub": "modules.accounting.AccountingModule._settle_position", "op": "callsub _settle_position", "defined_out": [ @@ -20212,7 +20872,7 @@ "{_settle_position}.1" ] }, - "2619": { + "2720": { "op": "popn 2", "stack_out": [ "box_prefixed_key%0#3", @@ -20224,7 +20884,7 @@ "receiver_holding_address#0" ] }, - "2621": { + "2722": { "callsub": "modules.accounting.AccountingModule._settle_position", "op": "callsub _settle_position", "stack_out": [ @@ -20238,7 +20898,7 @@ "{_settle_position}.1" ] }, - "2624": { + "2725": { "op": "popn 2", "stack_out": [ "box_prefixed_key%0#3", @@ -20249,7 +20909,7 @@ "units#0" ] }, - "2626": { + "2727": { "op": "dig 5", "defined_out": [ "box_prefixed_key%0#3", @@ -20266,7 +20926,7 @@ "box_prefixed_key%0#3" ] }, - "2628": { + "2729": { "op": "dup", "defined_out": [ "box_prefixed_key%0#3", @@ -20285,7 +20945,7 @@ "box_prefixed_key%0#3 (copy)" ] }, - "2629": { + "2730": { "op": "box_get", "defined_out": [ "aggregate%box_get%2#0", @@ -20306,7 +20966,7 @@ "aggregate%box_get%3#0" ] }, - "2630": { + "2731": { "error": "check self.account entry exists", "op": "assert // check self.account entry exists", "stack_out": [ @@ -20320,7 +20980,7 @@ "aggregate%box_get%2#0" ] }, - "2631": { + "2732": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -20341,7 +21001,7 @@ "32" ] }, - "2632": { + "2733": { "op": "extract_uint64", "defined_out": [ "box_prefixed_key%0#3", @@ -20360,7 +21020,7 @@ "values%0#0" ] }, - "2633": { + "2734": { "op": "dig 2", "defined_out": [ "box_prefixed_key%0#3", @@ -20381,7 +21041,7 @@ "units#0" ] }, - "2635": { + "2736": { "op": "dup", "defined_out": [ "box_prefixed_key%0#3", @@ -20404,7 +21064,7 @@ "units#0 (copy)" ] }, - "2636": { + "2737": { "op": "cover 2", "stack_out": [ "box_prefixed_key%0#3", @@ -20419,7 +21079,7 @@ "units#0 (copy)" ] }, - "2638": { + "2739": { "op": "dig 1", "defined_out": [ "box_prefixed_key%0#3", @@ -20444,7 +21104,7 @@ "values%0#0 (copy)" ] }, - "2640": { + "2741": { "op": "<=", "defined_out": [ "box_prefixed_key%0#3", @@ -20467,7 +21127,7 @@ "tmp%0#3" ] }, - "2641": { + "2742": { "error": "Insufficient sender units to transfer", "op": "assert // Insufficient sender units to transfer", "stack_out": [ @@ -20482,7 +21142,7 @@ "values%0#0" ] }, - "2642": { + "2743": { "op": "dig 1", "stack_out": [ "box_prefixed_key%0#3", @@ -20497,7 +21157,7 @@ "units#0 (copy)" ] }, - "2644": { + "2745": { "op": "-", "defined_out": [ "box_prefixed_key%0#3", @@ -20518,7 +21178,7 @@ "tmp%1#2" ] }, - "2645": { + "2746": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0", @@ -20539,7 +21199,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "2646": { + "2747": { "op": "uncover 2", "stack_out": [ "box_prefixed_key%0#3", @@ -20553,7 +21213,7 @@ "box_prefixed_key%0#3" ] }, - "2648": { + "2749": { "op": "intc_3 // 32", "stack_out": [ "box_prefixed_key%0#3", @@ -20568,7 +21228,7 @@ "32" ] }, - "2649": { + "2750": { "op": "uncover 2", "stack_out": [ "box_prefixed_key%0#3", @@ -20583,7 +21243,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "2651": { + "2752": { "op": "box_replace", "stack_out": [ "box_prefixed_key%0#3", @@ -20595,7 +21255,7 @@ "units#0" ] }, - "2652": { + "2753": { "op": "dig 5", "defined_out": [ "box_prefixed_key%0#3", @@ -20615,7 +21275,7 @@ "box_prefixed_key%0#4" ] }, - "2654": { + "2755": { "op": "dup", "defined_out": [ "box_prefixed_key%0#3", @@ -20637,7 +21297,7 @@ "box_prefixed_key%0#4 (copy)" ] }, - "2655": { + "2756": { "op": "box_get", "defined_out": [ "aggregate%box_get%6#0", @@ -20661,7 +21321,7 @@ "aggregate%box_get%7#0" ] }, - "2656": { + "2757": { "error": "check self.account entry exists", "op": "assert // check self.account entry exists", "stack_out": [ @@ -20676,7 +21336,7 @@ "aggregate%box_get%6#0" ] }, - "2657": { + "2758": { "op": "intc_3 // 32", "stack_out": [ "box_prefixed_key%0#3", @@ -20691,7 +21351,7 @@ "32" ] }, - "2658": { + "2759": { "op": "extract_uint64", "stack_out": [ "box_prefixed_key%0#3", @@ -20705,7 +21365,7 @@ "values%0#0" ] }, - "2659": { + "2760": { "op": "uncover 2", "stack_out": [ "box_prefixed_key%0#3", @@ -20719,7 +21379,7 @@ "units#0" ] }, - "2661": { + "2762": { "op": "+", "defined_out": [ "box_prefixed_key%0#3", @@ -20740,7 +21400,7 @@ "tmp%0#5" ] }, - "2662": { + "2763": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%1#0", @@ -20761,10 +21421,10 @@ "aggregate%val_as_bytes%1#0" ] }, - "2663": { + "2764": { "op": "intc_3 // 32" }, - "2664": { + "2765": { "op": "swap", "stack_out": [ "box_prefixed_key%0#3", @@ -20778,7 +21438,7 @@ "aggregate%val_as_bytes%1#0" ] }, - "2665": { + "2766": { "op": "box_replace", "stack_out": [ "box_prefixed_key%0#3", @@ -20789,7 +21449,7 @@ "units#0" ] }, - "2666": { + "2767": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -20809,7 +21469,7 @@ "0x151f7c75" ] }, - "2667": { + "2768": { "op": "dig 2", "defined_out": [ "0x151f7c75", @@ -20831,7 +21491,7 @@ "tmp%4#0" ] }, - "2669": { + "2770": { "op": "concat", "defined_out": [ "box_prefixed_key%0#3", @@ -20852,7 +21512,7 @@ "tmp%8#0" ] }, - "2670": { + "2771": { "op": "log", "stack_out": [ "box_prefixed_key%0#3", @@ -20863,7 +21523,7 @@ "units#0" ] }, - "2671": { + "2772": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -20884,7 +21544,7 @@ "1" ] }, - "2672": { + "2773": { "op": "return", "stack_out": [ "box_prefixed_key%0#3", @@ -20895,7 +21555,7 @@ "units#0" ] }, - "2673": { + "2774": { "subroutine": "modules.accounting.AccountingModule.account_suspension[routing]", "params": {}, "block": "account_suspension", @@ -20908,7 +21568,7 @@ "holding_address#0" ] }, - "2676": { + "2777": { "op": "dup", "defined_out": [ "holding_address#0", @@ -20919,7 +21579,7 @@ "holding_address#0 (copy)" ] }, - "2677": { + "2778": { "op": "len", "defined_out": [ "holding_address#0", @@ -20930,7 +21590,7 @@ "len%0#0" ] }, - "2678": { + "2779": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -20943,7 +21603,7 @@ "32" ] }, - "2679": { + "2780": { "op": "==", "defined_out": [ "eq%0#0", @@ -20954,14 +21614,14 @@ "eq%0#0" ] }, - "2680": { + "2781": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ "holding_address#0" ] }, - "2681": { + "2782": { "op": "txna ApplicationArgs 2", "defined_out": [ "holding_address#0", @@ -20972,7 +21632,7 @@ "tmp%2#0" ] }, - "2684": { + "2785": { "op": "dup", "defined_out": [ "holding_address#0", @@ -20985,7 +21645,7 @@ "tmp%2#0 (copy)" ] }, - "2685": { + "2786": { "op": "len", "defined_out": [ "holding_address#0", @@ -20998,7 +21658,7 @@ "len%1#0" ] }, - "2686": { + "2787": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -21013,7 +21673,7 @@ "1" ] }, - "2687": { + "2788": { "op": "==", "defined_out": [ "eq%1#0", @@ -21026,7 +21686,7 @@ "eq%1#0" ] }, - "2688": { + "2789": { "error": "invalid number of bytes for arc4.bool", "op": "assert // invalid number of bytes for arc4.bool", "stack_out": [ @@ -21034,7 +21694,7 @@ "tmp%2#0" ] }, - "2689": { + "2790": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -21047,7 +21707,7 @@ "0" ] }, - "2690": { + "2791": { "op": "getbit", "defined_out": [ "holding_address#0", @@ -21058,7 +21718,7 @@ "suspended#0" ] }, - "2691": { + "2792": { "op": "bytec 21 // 0x5223417574686f7269747923", "defined_out": [ "0x5223417574686f7269747923", @@ -21071,7 +21731,7 @@ "0x5223417574686f7269747923" ] }, - "2693": { + "2794": { "op": "txn Sender", "defined_out": [ "0x5223417574686f7269747923", @@ -21086,7 +21746,7 @@ "tmp%0#2" ] }, - "2695": { + "2796": { "callsub": "modules.rbac.RbacModule._role_is_active", "op": "callsub _role_is_active", "defined_out": [ @@ -21100,7 +21760,7 @@ "tmp%1#0" ] }, - "2698": { + "2799": { "error": "Not authorized", "op": "assert // Not authorized", "stack_out": [ @@ -21108,7 +21768,7 @@ "suspended#0" ] }, - "2699": { + "2800": { "op": "bytec 8 // 0x52234163636f756e7423", "defined_out": [ "0x52234163636f756e7423", @@ -21121,7 +21781,7 @@ "0x52234163636f756e7423" ] }, - "2701": { + "2802": { "op": "uncover 2", "stack_out": [ "suspended#0", @@ -21129,7 +21789,7 @@ "holding_address#0" ] }, - "2703": { + "2804": { "op": "concat", "defined_out": [ "box_prefixed_key%0#1", @@ -21140,7 +21800,7 @@ "box_prefixed_key%0#1" ] }, - "2704": { + "2805": { "op": "dup", "defined_out": [ "box_prefixed_key%0#1", @@ -21153,7 +21813,7 @@ "box_prefixed_key%0#1 (copy)" ] }, - "2705": { + "2806": { "op": "box_len", "defined_out": [ "_%0#0", @@ -21168,7 +21828,7 @@ "maybe_exists%0#0" ] }, - "2706": { + "2807": { "op": "bury 1", "stack_out": [ "suspended#0", @@ -21176,7 +21836,7 @@ "maybe_exists%0#0" ] }, - "2708": { + "2809": { "error": "Invalid account holding address", "op": "assert // Invalid account holding address", "stack_out": [ @@ -21184,7 +21844,7 @@ "box_prefixed_key%0#1" ] }, - "2709": { + "2810": { "op": "dup", "stack_out": [ "suspended#0", @@ -21192,7 +21852,7 @@ "box_prefixed_key%0#1 (copy)" ] }, - "2710": { + "2811": { "op": "pushint 48", "defined_out": [ "48", @@ -21207,7 +21867,7 @@ "48" ] }, - "2712": { + "2813": { "op": "intc_1 // 1", "stack_out": [ "suspended#0", @@ -21217,7 +21877,7 @@ "1" ] }, - "2713": { + "2814": { "op": "box_extract", "defined_out": [ "box%box_extract%0#0", @@ -21230,7 +21890,7 @@ "box%box_extract%0#0" ] }, - "2714": { + "2815": { "op": "intc_0 // 0", "stack_out": [ "suspended#0", @@ -21239,7 +21899,7 @@ "0" ] }, - "2715": { + "2816": { "op": "uncover 3", "stack_out": [ "box_prefixed_key%0#1", @@ -21248,7 +21908,7 @@ "suspended#0" ] }, - "2717": { + "2818": { "op": "setbit", "defined_out": [ "aggregate%updated_target%0#0", @@ -21259,10 +21919,10 @@ "aggregate%updated_target%0#0" ] }, - "2718": { + "2819": { "op": "pushint 48" }, - "2720": { + "2821": { "op": "swap", "stack_out": [ "box_prefixed_key%0#1", @@ -21270,11 +21930,11 @@ "aggregate%updated_target%0#0" ] }, - "2721": { + "2822": { "op": "box_replace", "stack_out": [] }, - "2722": { + "2823": { "op": "global LatestTimestamp", "defined_out": [ "tmp%0#1" @@ -21283,7 +21943,7 @@ "tmp%0#1" ] }, - "2724": { + "2825": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0" @@ -21292,7 +21952,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "2725": { + "2826": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -21303,14 +21963,14 @@ "0x151f7c75" ] }, - "2726": { + "2827": { "op": "swap", "stack_out": [ "0x151f7c75", "aggregate%val_as_bytes%0#0" ] }, - "2727": { + "2828": { "op": "concat", "defined_out": [ "tmp%6#0" @@ -21319,21 +21979,21 @@ "tmp%6#0" ] }, - "2728": { + "2829": { "op": "log", "stack_out": [] }, - "2729": { + "2830": { "op": "intc_1 // 1", "stack_out": [ "1" ] }, - "2730": { + "2831": { "op": "return", "stack_out": [] }, - "2731": { + "2832": { "subroutine": "modules.accounting.AccountingModule.account_open[routing]", "params": {}, "block": "account_open", @@ -21346,7 +22006,7 @@ "holding_address#0" ] }, - "2734": { + "2835": { "op": "dup", "defined_out": [ "holding_address#0", @@ -21357,7 +22017,7 @@ "holding_address#0 (copy)" ] }, - "2735": { + "2836": { "op": "len", "defined_out": [ "holding_address#0", @@ -21368,7 +22028,7 @@ "len%0#0" ] }, - "2736": { + "2837": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -21381,7 +22041,7 @@ "32" ] }, - "2737": { + "2838": { "op": "==", "defined_out": [ "eq%0#0", @@ -21392,14 +22052,14 @@ "eq%0#0" ] }, - "2738": { + "2839": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ "holding_address#0" ] }, - "2739": { + "2840": { "op": "txna ApplicationArgs 2", "defined_out": [ "holding_address#0", @@ -21410,7 +22070,7 @@ "payment_address#0" ] }, - "2742": { + "2843": { "op": "dup", "defined_out": [ "holding_address#0", @@ -21423,7 +22083,7 @@ "payment_address#0 (copy)" ] }, - "2743": { + "2844": { "op": "len", "defined_out": [ "holding_address#0", @@ -21436,7 +22096,7 @@ "len%1#0" ] }, - "2744": { + "2845": { "op": "intc_3 // 32", "stack_out": [ "holding_address#0", @@ -21445,7 +22105,7 @@ "32" ] }, - "2745": { + "2846": { "op": "==", "defined_out": [ "eq%1#0", @@ -21458,7 +22118,7 @@ "eq%1#0" ] }, - "2746": { + "2847": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ @@ -21466,7 +22126,7 @@ "payment_address#0" ] }, - "2747": { + "2848": { "op": "bytec 23 // 0x52234163636f756e744d616e6167657223", "defined_out": [ "0x52234163636f756e744d616e6167657223", @@ -21479,7 +22139,7 @@ "0x52234163636f756e744d616e6167657223" ] }, - "2749": { + "2850": { "op": "txn Sender", "defined_out": [ "0x52234163636f756e744d616e6167657223", @@ -21494,7 +22154,7 @@ "tmp%0#2" ] }, - "2751": { + "2852": { "callsub": "modules.rbac.RbacModule._role_is_active", "op": "callsub _role_is_active", "defined_out": [ @@ -21508,7 +22168,7 @@ "tmp%1#1" ] }, - "2754": { + "2855": { "error": "Not authorized", "op": "assert // Not authorized", "stack_out": [ @@ -21516,7 +22176,7 @@ "payment_address#0" ] }, - "2755": { + "2856": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -21529,7 +22189,7 @@ "0" ] }, - "2756": { + "2857": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"", @@ -21544,7 +22204,7 @@ "\"status\"" ] }, - "2757": { + "2858": { "op": "app_global_get_ex", "defined_out": [ "holding_address#0", @@ -21559,7 +22219,7 @@ "maybe_exists%0#0" ] }, - "2758": { + "2859": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ @@ -21568,7 +22228,7 @@ "maybe_value%0#0" ] }, - "2759": { + "2860": { "op": "pushint 200", "defined_out": [ "200", @@ -21583,7 +22243,7 @@ "200" ] }, - "2762": { + "2863": { "op": "==", "defined_out": [ "holding_address#0", @@ -21596,7 +22256,7 @@ "tmp%0#3" ] }, - "2763": { + "2864": { "op": "!", "stack_out": [ "holding_address#0", @@ -21604,7 +22264,7 @@ "tmp%1#1" ] }, - "2764": { + "2865": { "error": "Not authorized", "op": "assert // Not authorized", "stack_out": [ @@ -21612,15 +22272,15 @@ "payment_address#0" ] }, - "2765": { + "2866": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", "op": "callsub _assert_is_not_asset_defaulted" }, - "2768": { + "2869": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_suspended", "op": "callsub _assert_is_not_asset_suspended" }, - "2771": { + "2872": { "op": "bytec 8 // 0x52234163636f756e7423", "defined_out": [ "0x52234163636f756e7423", @@ -21633,7 +22293,7 @@ "0x52234163636f756e7423" ] }, - "2773": { + "2874": { "op": "uncover 2", "stack_out": [ "payment_address#0", @@ -21641,7 +22301,7 @@ "holding_address#0" ] }, - "2775": { + "2876": { "op": "concat", "defined_out": [ "box_prefixed_key%0#0", @@ -21652,7 +22312,7 @@ "box_prefixed_key%0#0" ] }, - "2776": { + "2877": { "op": "dup", "defined_out": [ "box_prefixed_key%0#0", @@ -21665,7 +22325,7 @@ "box_prefixed_key%0#0 (copy)" ] }, - "2777": { + "2878": { "op": "box_len", "defined_out": [ "_%0#0", @@ -21680,7 +22340,7 @@ "maybe_exists%0#0" ] }, - "2778": { + "2879": { "op": "bury 1", "stack_out": [ "payment_address#0", @@ -21688,7 +22348,7 @@ "maybe_exists%0#0" ] }, - "2780": { + "2881": { "op": "!", "defined_out": [ "box_prefixed_key%0#0", @@ -21701,7 +22361,7 @@ "tmp%2#1" ] }, - "2781": { + "2882": { "error": "Invalid account holding address", "op": "assert // Invalid account holding address", "stack_out": [ @@ -21709,7 +22369,7 @@ "box_prefixed_key%0#0" ] }, - "2782": { + "2883": { "op": "intc_0 // 0", "stack_out": [ "payment_address#0", @@ -21717,7 +22377,7 @@ "0" ] }, - "2783": { + "2884": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0", @@ -21730,7 +22390,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "2784": { + "2885": { "op": "uncover 2", "stack_out": [ "box_prefixed_key%0#0", @@ -21738,7 +22398,7 @@ "payment_address#0" ] }, - "2786": { + "2887": { "op": "dig 1", "defined_out": [ "aggregate%val_as_bytes%0#0", @@ -21753,7 +22413,7 @@ "aggregate%val_as_bytes%0#0 (copy)" ] }, - "2788": { + "2889": { "op": "concat", "defined_out": [ "aggregate%head%1#0", @@ -21766,7 +22426,7 @@ "aggregate%head%1#0" ] }, - "2789": { + "2890": { "op": "dig 1", "stack_out": [ "box_prefixed_key%0#0", @@ -21775,7 +22435,7 @@ "aggregate%val_as_bytes%0#0 (copy)" ] }, - "2791": { + "2892": { "op": "concat", "defined_out": [ "aggregate%head%2#0", @@ -21788,7 +22448,7 @@ "aggregate%head%2#0" ] }, - "2792": { + "2893": { "op": "bytec 40 // 0x00", "defined_out": [ "0x00", @@ -21803,7 +22463,7 @@ "0x00" ] }, - "2794": { + "2895": { "op": "concat", "defined_out": [ "aggregate%head%3#0", @@ -21816,7 +22476,7 @@ "aggregate%head%3#0" ] }, - "2795": { + "2896": { "op": "dig 1", "stack_out": [ "box_prefixed_key%0#0", @@ -21825,7 +22485,7 @@ "aggregate%val_as_bytes%0#0 (copy)" ] }, - "2797": { + "2898": { "op": "concat", "defined_out": [ "aggregate%head%4#0", @@ -21838,7 +22498,7 @@ "aggregate%head%4#0" ] }, - "2798": { + "2899": { "op": "dig 1", "stack_out": [ "box_prefixed_key%0#0", @@ -21847,7 +22507,7 @@ "aggregate%val_as_bytes%0#0 (copy)" ] }, - "2800": { + "2901": { "op": "concat", "defined_out": [ "aggregate%head%5#0", @@ -21860,7 +22520,7 @@ "aggregate%head%5#0" ] }, - "2801": { + "2902": { "op": "dig 1", "stack_out": [ "box_prefixed_key%0#0", @@ -21869,7 +22529,7 @@ "aggregate%val_as_bytes%0#0 (copy)" ] }, - "2803": { + "2904": { "op": "concat", "defined_out": [ "aggregate%head%6#0", @@ -21882,7 +22542,7 @@ "aggregate%head%6#0" ] }, - "2804": { + "2905": { "op": "dig 1", "stack_out": [ "box_prefixed_key%0#0", @@ -21891,7 +22551,7 @@ "aggregate%val_as_bytes%0#0 (copy)" ] }, - "2806": { + "2907": { "op": "concat", "defined_out": [ "aggregate%head%7#0", @@ -21904,7 +22564,7 @@ "aggregate%head%7#0" ] }, - "2807": { + "2908": { "op": "swap", "stack_out": [ "box_prefixed_key%0#0", @@ -21912,7 +22572,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "2808": { + "2909": { "op": "concat", "defined_out": [ "aggregate%head%8#0", @@ -21923,11 +22583,11 @@ "aggregate%head%8#0" ] }, - "2809": { + "2910": { "op": "box_put", "stack_out": [] }, - "2810": { + "2911": { "op": "global LatestTimestamp", "defined_out": [ "tmp%4#1" @@ -21936,7 +22596,7 @@ "tmp%4#1" ] }, - "2812": { + "2913": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%7#0" @@ -21945,7 +22605,7 @@ "aggregate%val_as_bytes%7#0" ] }, - "2813": { + "2914": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -21956,14 +22616,14 @@ "0x151f7c75" ] }, - "2814": { + "2915": { "op": "swap", "stack_out": [ "0x151f7c75", "aggregate%val_as_bytes%7#0" ] }, - "2815": { + "2916": { "op": "concat", "defined_out": [ "tmp%6#0" @@ -21972,11 +22632,11 @@ "tmp%6#0" ] }, - "2816": { + "2917": { "op": "log", "stack_out": [] }, - "2817": { + "2918": { "op": "intc_1 // 1", "defined_out": [ "1" @@ -21985,11 +22645,11 @@ "1" ] }, - "2818": { + "2919": { "op": "return", "stack_out": [] }, - "2819": { + "2920": { "subroutine": "modules.accounting.AccountingModule.account_update_payment_address[routing]", "params": {}, "block": "account_update_payment_address", @@ -22002,7 +22662,7 @@ "holding_address#0" ] }, - "2822": { + "2923": { "op": "dup", "defined_out": [ "holding_address#0", @@ -22013,7 +22673,7 @@ "holding_address#0 (copy)" ] }, - "2823": { + "2924": { "op": "len", "defined_out": [ "holding_address#0", @@ -22024,7 +22684,7 @@ "len%0#0" ] }, - "2824": { + "2925": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -22037,7 +22697,7 @@ "32" ] }, - "2825": { + "2926": { "op": "==", "defined_out": [ "eq%0#0", @@ -22048,14 +22708,14 @@ "eq%0#0" ] }, - "2826": { + "2927": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ "holding_address#0" ] }, - "2827": { + "2928": { "op": "txna ApplicationArgs 2", "defined_out": [ "holding_address#0", @@ -22066,7 +22726,7 @@ "tmp%2#0" ] }, - "2830": { + "2931": { "op": "dup", "defined_out": [ "holding_address#0", @@ -22079,7 +22739,7 @@ "tmp%2#0 (copy)" ] }, - "2831": { + "2932": { "op": "len", "defined_out": [ "holding_address#0", @@ -22092,7 +22752,7 @@ "len%1#0" ] }, - "2832": { + "2933": { "op": "intc_3 // 32", "stack_out": [ "holding_address#0", @@ -22101,7 +22761,7 @@ "32" ] }, - "2833": { + "2934": { "op": "==", "defined_out": [ "eq%1#0", @@ -22114,7 +22774,7 @@ "eq%1#0" ] }, - "2834": { + "2935": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ @@ -22122,7 +22782,7 @@ "tmp%2#0" ] }, - "2835": { + "2936": { "op": "bytec 8 // 0x52234163636f756e7423", "defined_out": [ "0x52234163636f756e7423", @@ -22135,7 +22795,7 @@ "0x52234163636f756e7423" ] }, - "2837": { + "2938": { "op": "dig 2", "stack_out": [ "holding_address#0", @@ -22144,7 +22804,7 @@ "holding_address#0 (copy)" ] }, - "2839": { + "2940": { "op": "concat", "defined_out": [ "box_prefixed_key%0#1", @@ -22157,7 +22817,7 @@ "box_prefixed_key%0#1" ] }, - "2840": { + "2941": { "op": "dup", "defined_out": [ "box_prefixed_key%0#1", @@ -22172,7 +22832,7 @@ "box_prefixed_key%0#1 (copy)" ] }, - "2841": { + "2942": { "op": "box_len", "defined_out": [ "_%0#0", @@ -22189,7 +22849,7 @@ "maybe_exists%0#0" ] }, - "2842": { + "2943": { "op": "bury 1", "stack_out": [ "holding_address#0", @@ -22198,7 +22858,7 @@ "maybe_exists%0#0" ] }, - "2844": { + "2945": { "error": "Invalid account holding address", "op": "assert // Invalid account holding address", "stack_out": [ @@ -22207,7 +22867,7 @@ "box_prefixed_key%0#1" ] }, - "2845": { + "2946": { "op": "txn Sender", "defined_out": [ "box_prefixed_key%0#1", @@ -22222,7 +22882,7 @@ "tmp%0#1" ] }, - "2847": { + "2948": { "op": "uncover 3", "stack_out": [ "tmp%2#0", @@ -22231,7 +22891,7 @@ "holding_address#0" ] }, - "2849": { + "2950": { "op": "==", "defined_out": [ "box_prefixed_key%0#1", @@ -22244,7 +22904,7 @@ "tmp%1#1" ] }, - "2850": { + "2951": { "error": "Not authorized", "op": "assert // Not authorized", "stack_out": [ @@ -22252,15 +22912,15 @@ "box_prefixed_key%0#1" ] }, - "2851": { + "2952": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", "op": "callsub _assert_is_not_asset_defaulted" }, - "2854": { + "2955": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_suspended", "op": "callsub _assert_is_not_asset_suspended" }, - "2857": { + "2958": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -22273,7 +22933,7 @@ "0" ] }, - "2858": { + "2959": { "op": "uncover 2", "stack_out": [ "box_prefixed_key%0#1", @@ -22281,11 +22941,11 @@ "tmp%2#0" ] }, - "2860": { + "2961": { "op": "box_replace", "stack_out": [] }, - "2861": { + "2962": { "op": "global LatestTimestamp", "defined_out": [ "tmp%2#1" @@ -22294,7 +22954,7 @@ "tmp%2#1" ] }, - "2863": { + "2964": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0" @@ -22303,7 +22963,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "2864": { + "2965": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -22314,14 +22974,14 @@ "0x151f7c75" ] }, - "2865": { + "2966": { "op": "swap", "stack_out": [ "0x151f7c75", "aggregate%val_as_bytes%0#0" ] }, - "2866": { + "2967": { "op": "concat", "defined_out": [ "tmp%6#0" @@ -22330,11 +22990,11 @@ "tmp%6#0" ] }, - "2867": { + "2968": { "op": "log", "stack_out": [] }, - "2868": { + "2969": { "op": "intc_1 // 1", "defined_out": [ "1" @@ -22343,11 +23003,11 @@ "1" ] }, - "2869": { + "2970": { "op": "return", "stack_out": [] }, - "2870": { + "2971": { "subroutine": "modules.accounting.AccountingModule.account_get_position[routing]", "params": {}, "block": "account_get_position", @@ -22360,7 +23020,7 @@ "holding_address#0" ] }, - "2873": { + "2974": { "op": "dup", "defined_out": [ "holding_address#0", @@ -22371,7 +23031,7 @@ "holding_address#0 (copy)" ] }, - "2874": { + "2975": { "op": "len", "defined_out": [ "holding_address#0", @@ -22382,7 +23042,7 @@ "len%0#0" ] }, - "2875": { + "2976": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -22395,7 +23055,7 @@ "32" ] }, - "2876": { + "2977": { "op": "==", "defined_out": [ "eq%0#0", @@ -22406,14 +23066,14 @@ "eq%0#0" ] }, - "2877": { + "2978": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ "holding_address#0" ] }, - "2878": { + "2979": { "op": "bytec 8 // 0x52234163636f756e7423", "defined_out": [ "0x52234163636f756e7423", @@ -22424,14 +23084,14 @@ "0x52234163636f756e7423" ] }, - "2880": { + "2981": { "op": "swap", "stack_out": [ "0x52234163636f756e7423", "holding_address#0" ] }, - "2881": { + "2982": { "op": "concat", "defined_out": [ "box_prefixed_key%0#1" @@ -22440,7 +23100,7 @@ "box_prefixed_key%0#1" ] }, - "2882": { + "2983": { "op": "dup", "defined_out": [ "box_prefixed_key%0#1", @@ -22451,7 +23111,7 @@ "box_prefixed_key%0#1 (copy)" ] }, - "2883": { + "2984": { "op": "box_len", "defined_out": [ "_%0#0", @@ -22464,21 +23124,21 @@ "maybe_exists%0#0" ] }, - "2884": { + "2985": { "op": "bury 1", "stack_out": [ "box_prefixed_key%0#1", "maybe_exists%0#0" ] }, - "2886": { + "2987": { "error": "Invalid account holding address", "op": "assert // Invalid account holding address", "stack_out": [ "box_prefixed_key%0#1" ] }, - "2887": { + "2988": { "op": "box_get", "defined_out": [ "aggregate%box_get%0#0", @@ -22489,13 +23149,13 @@ "aggregate%box_get%1#0" ] }, - "2888": { + "2989": { "op": "pop", "stack_out": [ "aggregate%box_get%0#0" ] }, - "2889": { + "2990": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -22506,14 +23166,14 @@ "0x151f7c75" ] }, - "2890": { + "2991": { "op": "swap", "stack_out": [ "0x151f7c75", "aggregate%box_get%0#0" ] }, - "2891": { + "2992": { "op": "concat", "defined_out": [ "tmp%3#0" @@ -22522,11 +23182,11 @@ "tmp%3#0" ] }, - "2892": { + "2993": { "op": "log", "stack_out": [] }, - "2893": { + "2994": { "op": "intc_1 // 1", "defined_out": [ "1" @@ -22535,11 +23195,11 @@ "1" ] }, - "2894": { + "2995": { "op": "return", "stack_out": [] }, - "2895": { + "2996": { "subroutine": "modules.actus_kernel.ActusKernelModule.contract_create[routing]", "params": {}, "block": "contract_create", @@ -22552,7 +23212,7 @@ "arranger#0" ] }, - "2898": { + "2999": { "op": "dup", "defined_out": [ "arranger#0", @@ -22563,7 +23223,7 @@ "arranger#0 (copy)" ] }, - "2899": { + "3000": { "op": "len", "defined_out": [ "arranger#0", @@ -22574,7 +23234,7 @@ "len%0#0" ] }, - "2900": { + "3001": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -22587,7 +23247,7 @@ "32" ] }, - "2901": { + "3002": { "op": "==", "defined_out": [ "arranger#0", @@ -22598,14 +23258,14 @@ "eq%0#0" ] }, - "2902": { + "3003": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ "arranger#0" ] }, - "2903": { + "3004": { "op": "bytec 18 // 0x5223417272616e67657223", "defined_out": [ "0x5223417272616e67657223", @@ -22616,18 +23276,18 @@ "0x5223417272616e67657223" ] }, - "2905": { + "3006": { "op": "swap", "stack_out": [ "0x5223417272616e67657223", "arranger#0" ] }, - "2906": { + "3007": { "op": "app_global_put", "stack_out": [] }, - "2907": { + "3008": { "op": "global LatestTimestamp", "defined_out": [ "tmp%0#1" @@ -22636,7 +23296,7 @@ "tmp%0#1" ] }, - "2909": { + "3010": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0" @@ -22645,7 +23305,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "2910": { + "3011": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -22656,14 +23316,14 @@ "0x151f7c75" ] }, - "2911": { + "3012": { "op": "swap", "stack_out": [ "0x151f7c75", "aggregate%val_as_bytes%0#0" ] }, - "2912": { + "3013": { "op": "concat", "defined_out": [ "tmp%4#0" @@ -22672,11 +23332,11 @@ "tmp%4#0" ] }, - "2913": { + "3014": { "op": "log", "stack_out": [] }, - "2914": { + "3015": { "op": "intc_1 // 1", "defined_out": [ "1" @@ -22685,11 +23345,11 @@ "1" ] }, - "2915": { + "3016": { "op": "return", "stack_out": [] }, - "2916": { + "3017": { "subroutine": "modules.actus_kernel.ActusKernelModule.contract_config[routing]", "params": {}, "block": "contract_config", @@ -22699,17 +23359,17 @@ "day_count_convention#0" ] }, - "2918": { + "3019": { "op": "dup", "stack_out": [ "day_count_convention#0", "values%0#2" ] }, - "2919": { + "3020": { "op": "txna ApplicationArgs 1" }, - "2922": { + "3023": { "op": "dupn 2", "defined_out": [ "terms#0", @@ -22723,7 +23383,7 @@ "terms#0 (copy)" ] }, - "2924": { + "3025": { "op": "len", "defined_out": [ "len%0#0", @@ -22737,7 +23397,7 @@ "len%0#0" ] }, - "2925": { + "3026": { "op": "pushint 107", "defined_out": [ "107", @@ -22753,7 +23413,7 @@ "107" ] }, - "2927": { + "3028": { "op": "==", "defined_out": [ "eq%0#0", @@ -22767,7 +23427,7 @@ "eq%0#0" ] }, - "2928": { + "3029": { "error": "invalid number of bytes for smart_contracts.abi_types.NormalizedActusTerms", "op": "assert // invalid number of bytes for smart_contracts.abi_types.NormalizedActusTerms", "stack_out": [ @@ -22777,10 +23437,10 @@ "terms#0" ] }, - "2929": { + "3030": { "op": "txna ApplicationArgs 2" }, - "2932": { + "3033": { "op": "dup", "defined_out": [ "initial_state#0", @@ -22795,7 +23455,7 @@ "initial_state#0" ] }, - "2933": { + "3034": { "op": "cover 2", "defined_out": [ "initial_state#0", @@ -22810,7 +23470,7 @@ "initial_state#0" ] }, - "2935": { + "3036": { "op": "len", "defined_out": [ "initial_state#0", @@ -22826,7 +23486,7 @@ "len%1#0" ] }, - "2936": { + "3037": { "op": "pushint 72", "defined_out": [ "72", @@ -22844,7 +23504,7 @@ "72" ] }, - "2938": { + "3039": { "op": "==", "defined_out": [ "eq%1#0", @@ -22860,7 +23520,7 @@ "eq%1#0" ] }, - "2939": { + "3040": { "error": "invalid number of bytes for smart_contracts.abi_types.InitialKernelState", "op": "assert // invalid number of bytes for smart_contracts.abi_types.InitialKernelState", "stack_out": [ @@ -22871,10 +23531,10 @@ "terms#0" ] }, - "2940": { + "3041": { "op": "txna ApplicationArgs 3" }, - "2943": { + "3044": { "op": "dup", "defined_out": [ "initial_state#0", @@ -22891,7 +23551,7 @@ "prospectus#0" ] }, - "2944": { + "3045": { "op": "cover 2", "defined_out": [ "initial_state#0", @@ -22908,7 +23568,7 @@ "prospectus#0" ] }, - "2946": { + "3047": { "op": "dup", "defined_out": [ "initial_state#0", @@ -22927,7 +23587,7 @@ "prospectus#0 (copy)" ] }, - "2947": { + "3048": { "op": "len", "defined_out": [ "initial_state#0", @@ -22946,7 +23606,7 @@ "tuple_len%0#0" ] }, - "2948": { + "3049": { "op": "dig 1", "stack_out": [ "day_count_convention#0", @@ -22960,7 +23620,7 @@ "prospectus#0 (copy)" ] }, - "2950": { + "3051": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -22983,7 +23643,7 @@ "32" ] }, - "2951": { + "3052": { "error": "invalid tuple encoding", "op": "extract_uint16 // on error: invalid tuple encoding", "defined_out": [ @@ -23005,7 +23665,7 @@ "extract_uint16%0#0" ] }, - "2952": { + "3053": { "op": "dup", "defined_out": [ "extract_uint16%0#0", @@ -23028,7 +23688,7 @@ "extract_uint16%0#0 (copy)" ] }, - "2953": { + "3054": { "op": "pushint 34", "defined_out": [ "34", @@ -23053,7 +23713,7 @@ "34" ] }, - "2955": { + "3056": { "op": "==", "defined_out": [ "eq%2#0", @@ -23076,7 +23736,7 @@ "eq%2#0" ] }, - "2956": { + "3057": { "error": "invalid tail pointer at index 1 of (uint8[32],(len+utf8[]))", "op": "assert // invalid tail pointer at index 1 of (uint8[32],(len+utf8[]))", "stack_out": [ @@ -23091,7 +23751,7 @@ "extract_uint16%0#0" ] }, - "2957": { + "3058": { "op": "uncover 2", "stack_out": [ "day_count_convention#0", @@ -23105,7 +23765,7 @@ "prospectus#0" ] }, - "2959": { + "3060": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -23119,7 +23779,7 @@ "extract_uint16%0#0" ] }, - "2960": { + "3061": { "op": "dig 2", "defined_out": [ "extract_uint16%0#0", @@ -23142,7 +23802,7 @@ "tuple_len%0#0 (copy)" ] }, - "2962": { + "3063": { "op": "substring3", "defined_out": [ "initial_state#0", @@ -23162,7 +23822,7 @@ "substring3%0#0" ] }, - "2963": { + "3064": { "op": "dup", "stack_out": [ "day_count_convention#0", @@ -23176,7 +23836,7 @@ "substring3%0#0" ] }, - "2964": { + "3065": { "op": "cover 3", "defined_out": [ "initial_state#0", @@ -23197,7 +23857,7 @@ "substring3%0#0" ] }, - "2966": { + "3067": { "op": "intc_0 // 0", "stack_out": [ "day_count_convention#0", @@ -23212,7 +23872,7 @@ "0" ] }, - "2967": { + "3068": { "error": "invalid array length header", "op": "extract_uint16 // on error: invalid array length header", "defined_out": [ @@ -23235,7 +23895,7 @@ "aggregate%array_length%0#0" ] }, - "2968": { + "3069": { "op": "pushint 36", "defined_out": [ "36", @@ -23259,7 +23919,7 @@ "36" ] }, - "2970": { + "3071": { "op": "+", "defined_out": [ "add%1#0", @@ -23281,7 +23941,7 @@ "add%1#0" ] }, - "2971": { + "3072": { "op": "==", "defined_out": [ "eq%3#0", @@ -23301,7 +23961,7 @@ "eq%3#0" ] }, - "2972": { + "3073": { "error": "invalid number of bytes for smart_contracts.abi_types.Prospectus", "op": "assert // invalid number of bytes for smart_contracts.abi_types.Prospectus", "stack_out": [ @@ -23314,11 +23974,11 @@ "terms#0" ] }, - "2973": { + "3074": { "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", "op": "callsub _assert_caller_is_arranger" }, - "2976": { + "3077": { "op": "intc_0 // 0", "stack_out": [ "day_count_convention#0", @@ -23331,7 +23991,7 @@ "0" ] }, - "2977": { + "3078": { "op": "getbyte", "defined_out": [ "contract_type#0", @@ -23350,7 +24010,7 @@ "contract_type#0" ] }, - "2978": { + "3079": { "op": "dup", "defined_out": [ "contract_type#0", @@ -23370,8 +24030,8 @@ "contract_type#0" ] }, - "2979": { - "op": "bytec 12 // \"contract_type\"", + "3080": { + "op": "bytec 10 // \"contract_type\"", "defined_out": [ "\"contract_type\"", "contract_type#0", @@ -23392,7 +24052,7 @@ "\"contract_type\"" ] }, - "2981": { + "3082": { "op": "dig 1", "defined_out": [ "\"contract_type\"", @@ -23416,7 +24076,7 @@ "contract_type#0 (copy)" ] }, - "2983": { + "3084": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -23429,7 +24089,7 @@ "contract_type#0" ] }, - "2984": { + "3085": { "op": "bz contract_config_bool_true@7", "stack_out": [ "day_count_convention#0", @@ -23441,7 +24101,7 @@ "contract_type#0" ] }, - "2987": { + "3088": { "op": "dup", "stack_out": [ "day_count_convention#0", @@ -23454,7 +24114,7 @@ "contract_type#0" ] }, - "2988": { + "3089": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -23476,7 +24136,7 @@ "1" ] }, - "2989": { + "3090": { "op": "==", "defined_out": [ "contract_type#0", @@ -23497,7 +24157,7 @@ "tmp%1#2" ] }, - "2990": { + "3091": { "op": "bnz contract_config_bool_true@7", "stack_out": [ "day_count_convention#0", @@ -23509,7 +24169,7 @@ "contract_type#0" ] }, - "2993": { + "3094": { "op": "dup", "stack_out": [ "day_count_convention#0", @@ -23522,7 +24182,7 @@ "contract_type#0" ] }, - "2994": { + "3095": { "op": "pushint 2", "defined_out": [ "2", @@ -23544,7 +24204,7 @@ "2" ] }, - "2996": { + "3097": { "op": "==", "defined_out": [ "contract_type#0", @@ -23565,7 +24225,7 @@ "tmp%2#0" ] }, - "2997": { + "3098": { "op": "bnz contract_config_bool_true@7", "stack_out": [ "day_count_convention#0", @@ -23577,7 +24237,7 @@ "contract_type#0" ] }, - "3000": { + "3101": { "op": "dup", "stack_out": [ "day_count_convention#0", @@ -23590,7 +24250,7 @@ "contract_type#0" ] }, - "3001": { + "3102": { "op": "pushint 3", "stack_out": [ "day_count_convention#0", @@ -23604,7 +24264,7 @@ "3" ] }, - "3003": { + "3104": { "op": "==", "defined_out": [ "contract_type#0", @@ -23625,7 +24285,7 @@ "tmp%3#0" ] }, - "3004": { + "3105": { "op": "bnz contract_config_bool_true@7", "stack_out": [ "day_count_convention#0", @@ -23637,7 +24297,7 @@ "contract_type#0" ] }, - "3007": { + "3108": { "op": "dup", "stack_out": [ "day_count_convention#0", @@ -23650,7 +24310,7 @@ "contract_type#0" ] }, - "3008": { + "3109": { "op": "pushint 4", "defined_out": [ "4", @@ -23672,7 +24332,7 @@ "4" ] }, - "3010": { + "3111": { "op": "==", "defined_out": [ "contract_type#0", @@ -23693,7 +24353,7 @@ "tmp%4#1" ] }, - "3011": { + "3112": { "op": "bnz contract_config_bool_true@7", "stack_out": [ "day_count_convention#0", @@ -23705,7 +24365,7 @@ "contract_type#0" ] }, - "3014": { + "3115": { "op": "dup", "stack_out": [ "day_count_convention#0", @@ -23718,7 +24378,7 @@ "contract_type#0" ] }, - "3015": { + "3116": { "op": "pushint 5", "defined_out": [ "5", @@ -23740,7 +24400,7 @@ "5" ] }, - "3017": { + "3118": { "op": "==", "defined_out": [ "contract_type#0", @@ -23761,7 +24421,7 @@ "tmp%5#1" ] }, - "3018": { + "3119": { "op": "bz contract_config_bool_false@8", "stack_out": [ "day_count_convention#0", @@ -23773,7 +24433,7 @@ "contract_type#0" ] }, - "3021": { + "3122": { "block": "contract_config_bool_true@7", "stack_in": [ "day_count_convention#0", @@ -23799,7 +24459,7 @@ "or_result%0#0" ] }, - "3022": { + "3123": { "error": "Invalid ACTUS configuration", "block": "contract_config_bool_merge@9", "stack_in": [ @@ -23824,7 +24484,7 @@ "contract_type#0" ] }, - "3023": { + "3124": { "op": "intc_0 // 0", "defined_out": [ "0" @@ -23840,8 +24500,8 @@ "0" ] }, - "3024": { - "op": "bytec 12 // \"contract_type\"", + "3125": { + "op": "bytec 10 // \"contract_type\"", "defined_out": [ "\"contract_type\"", "0" @@ -23858,7 +24518,7 @@ "\"contract_type\"" ] }, - "3026": { + "3127": { "op": "app_global_get_ex", "defined_out": [ "contract_type#0", @@ -23876,7 +24536,7 @@ "maybe_exists%1#0" ] }, - "3027": { + "3128": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -23890,7 +24550,7 @@ "contract_type#0" ] }, - "3028": { + "3129": { "op": "bury 2", "defined_out": [ "contract_type#0", @@ -23907,7 +24567,7 @@ "maybe_exists%1#0" ] }, - "3030": { + "3131": { "error": "check self.contract_type exists", "op": "assert // check self.contract_type exists", "stack_out": [ @@ -23920,7 +24580,7 @@ "contract_type#0" ] }, - "3031": { + "3132": { "op": "dig 4", "defined_out": [ "contract_type#0", @@ -23937,7 +24597,7 @@ "terms#0" ] }, - "3033": { + "3134": { "op": "dup", "defined_out": [ "contract_type#0", @@ -23956,7 +24616,7 @@ "terms#0 (copy)" ] }, - "3034": { + "3135": { "op": "pushint 33", "defined_out": [ "33", @@ -23977,7 +24637,7 @@ "33" ] }, - "3036": { + "3137": { "op": "extract_uint64", "defined_out": [ "contract_type#0", @@ -23996,7 +24656,7 @@ "values%0#2" ] }, - "3037": { + "3138": { "op": "dup", "stack_out": [ "day_count_convention#0", @@ -24011,7 +24671,7 @@ "values%0#2" ] }, - "3038": { + "3139": { "op": "bury 8", "defined_out": [ "contract_type#0", @@ -24030,7 +24690,7 @@ "values%0#2" ] }, - "3040": { + "3141": { "error": "Invalid ACTUS configuration", "op": "assert // Invalid ACTUS configuration", "stack_out": [ @@ -24044,7 +24704,7 @@ "terms#0" ] }, - "3041": { + "3142": { "op": "pushint 57", "defined_out": [ "57", @@ -24064,7 +24724,7 @@ "57" ] }, - "3043": { + "3144": { "op": "getbyte", "defined_out": [ "contract_type#0", @@ -24083,7 +24743,7 @@ "day_count_convention#0" ] }, - "3044": { + "3145": { "op": "dup", "stack_out": [ "day_count_convention#0", @@ -24097,7 +24757,7 @@ "day_count_convention#0" ] }, - "3045": { + "3146": { "op": "bury 8", "defined_out": [ "contract_type#0", @@ -24116,7 +24776,7 @@ "day_count_convention#0" ] }, - "3047": { + "3148": { "op": "bz contract_config_bool_true@16", "stack_out": [ "day_count_convention#0", @@ -24128,7 +24788,7 @@ "contract_type#0" ] }, - "3050": { + "3151": { "op": "dig 6", "stack_out": [ "day_count_convention#0", @@ -24141,7 +24801,7 @@ "day_count_convention#0" ] }, - "3052": { + "3153": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -24162,7 +24822,7 @@ "1" ] }, - "3053": { + "3154": { "op": "==", "defined_out": [ "contract_type#0", @@ -24182,7 +24842,7 @@ "tmp%1#2" ] }, - "3054": { + "3155": { "op": "bnz contract_config_bool_true@16", "stack_out": [ "day_count_convention#0", @@ -24194,7 +24854,7 @@ "contract_type#0" ] }, - "3057": { + "3158": { "op": "dig 6", "stack_out": [ "day_count_convention#0", @@ -24207,7 +24867,7 @@ "day_count_convention#0" ] }, - "3059": { + "3160": { "op": "pushint 2", "stack_out": [ "day_count_convention#0", @@ -24221,7 +24881,7 @@ "2" ] }, - "3061": { + "3162": { "op": "==", "defined_out": [ "contract_type#0", @@ -24241,7 +24901,7 @@ "tmp%2#0" ] }, - "3062": { + "3163": { "op": "bnz contract_config_bool_true@16", "stack_out": [ "day_count_convention#0", @@ -24253,7 +24913,7 @@ "contract_type#0" ] }, - "3065": { + "3166": { "op": "dig 6", "stack_out": [ "day_count_convention#0", @@ -24266,7 +24926,7 @@ "day_count_convention#0" ] }, - "3067": { + "3168": { "op": "pushint 3", "defined_out": [ "3", @@ -24287,7 +24947,7 @@ "3" ] }, - "3069": { + "3170": { "op": "==", "defined_out": [ "contract_type#0", @@ -24307,7 +24967,7 @@ "tmp%3#0" ] }, - "3070": { + "3171": { "op": "bnz contract_config_bool_true@16", "stack_out": [ "day_count_convention#0", @@ -24319,7 +24979,7 @@ "contract_type#0" ] }, - "3073": { + "3174": { "op": "dig 6", "stack_out": [ "day_count_convention#0", @@ -24332,7 +24992,7 @@ "day_count_convention#0" ] }, - "3075": { + "3176": { "op": "pushint 4", "defined_out": [ "4", @@ -24353,7 +25013,7 @@ "4" ] }, - "3077": { + "3178": { "op": "==", "defined_out": [ "contract_type#0", @@ -24373,7 +25033,7 @@ "tmp%4#1" ] }, - "3078": { + "3179": { "op": "bz contract_config_bool_false@17", "stack_out": [ "day_count_convention#0", @@ -24385,7 +25045,7 @@ "contract_type#0" ] }, - "3081": { + "3182": { "block": "contract_config_bool_true@16", "stack_in": [ "day_count_convention#0", @@ -24411,7 +25071,7 @@ "or_result%0#0" ] }, - "3082": { + "3183": { "error": "Invalid day-count convention ID", "block": "contract_config_bool_merge@18", "stack_in": [ @@ -24436,7 +25096,7 @@ "contract_type#0" ] }, - "3083": { + "3184": { "op": "dup", "defined_out": [ "contract_type#0" @@ -24452,7 +25112,7 @@ "contract_type#0" ] }, - "3084": { + "3185": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -24470,7 +25130,7 @@ "1" ] }, - "3085": { + "3186": { "op": "!=", "defined_out": [ "contract_type#0", @@ -24487,7 +25147,7 @@ "tmp%2#0" ] }, - "3086": { + "3187": { "op": "bz contract_config_after_if_else@20", "stack_out": [ "day_count_convention#0", @@ -24499,7 +25159,7 @@ "contract_type#0" ] }, - "3089": { + "3190": { "op": "dig 4", "defined_out": [ "contract_type#0", @@ -24516,7 +25176,7 @@ "terms#0" ] }, - "3091": { + "3192": { "op": "pushint 786", "defined_out": [ "786", @@ -24535,7 +25195,7 @@ "786" ] }, - "3094": { + "3195": { "op": "getbit", "defined_out": [ "aggregate%get_bit%0#0", @@ -24553,7 +25213,7 @@ "aggregate%get_bit%0#0" ] }, - "3095": { + "3196": { "op": "!", "defined_out": [ "contract_type#0", @@ -24571,7 +25231,7 @@ "tmp%3#0" ] }, - "3096": { + "3197": { "error": "Invalid ACTUS configuration", "op": "assert // Invalid ACTUS configuration", "stack_out": [ @@ -24584,7 +25244,7 @@ "contract_type#0" ] }, - "3097": { + "3198": { "block": "contract_config_after_if_else@20", "stack_in": [ "day_count_convention#0", @@ -24610,7 +25270,7 @@ "0" ] }, - "3098": { + "3199": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"", @@ -24628,7 +25288,7 @@ "\"status\"" ] }, - "3099": { + "3200": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#1", @@ -24646,7 +25306,7 @@ "maybe_exists%0#1" ] }, - "3100": { + "3201": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ @@ -24660,7 +25320,7 @@ "maybe_value%0#1" ] }, - "3101": { + "3202": { "op": "!", "defined_out": [ "tmp%0#2" @@ -24676,7 +25336,7 @@ "tmp%0#2" ] }, - "3102": { + "3203": { "error": "D-ASA already configured", "op": "assert // D-ASA already configured", "stack_out": [ @@ -24689,7 +25349,7 @@ "contract_type#0" ] }, - "3103": { + "3204": { "op": "intc_0 // 0", "stack_out": [ "day_count_convention#0", @@ -24702,7 +25362,7 @@ "0" ] }, - "3104": { + "3205": { "op": "bytec 20 // \"initial_exchange_amount\"", "defined_out": [ "\"initial_exchange_amount\"", @@ -24720,7 +25380,7 @@ "\"initial_exchange_amount\"" ] }, - "3106": { + "3207": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%1#0", @@ -24738,7 +25398,7 @@ "maybe_exists%1#0" ] }, - "3107": { + "3208": { "error": "check self.initial_exchange_amount exists", "op": "assert // check self.initial_exchange_amount exists", "stack_out": [ @@ -24752,7 +25412,7 @@ "maybe_value%1#1" ] }, - "3108": { + "3209": { "op": "!", "defined_out": [ "tmp%1#2" @@ -24768,7 +25428,7 @@ "tmp%1#2" ] }, - "3109": { + "3210": { "error": "D-ASA already configured", "op": "assert // D-ASA already configured", "stack_out": [ @@ -24781,7 +25441,7 @@ "contract_type#0" ] }, - "3110": { + "3211": { "op": "dig 4", "defined_out": [ "terms#0" @@ -24797,7 +25457,7 @@ "terms#0" ] }, - "3112": { + "3213": { "op": "dup", "defined_out": [ "terms#0", @@ -24815,7 +25475,7 @@ "terms#0 (copy)" ] }, - "3113": { + "3214": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -24835,7 +25495,7 @@ "1" ] }, - "3114": { + "3215": { "op": "extract_uint64", "defined_out": [ "denomination_asset_id#0", @@ -24853,7 +25513,7 @@ "denomination_asset_id#0" ] }, - "3115": { + "3216": { "op": "dup", "defined_out": [ "denomination_asset_id#0", @@ -24873,7 +25533,7 @@ "denomination_asset_id#0 (copy)" ] }, - "3116": { + "3217": { "op": "asset_params_get AssetCreator", "defined_out": [ "_creator#0", @@ -24895,7 +25555,7 @@ "exists#0" ] }, - "3118": { + "3219": { "op": "bury 1", "stack_out": [ "day_count_convention#0", @@ -24910,7 +25570,7 @@ "exists#0" ] }, - "3120": { + "3221": { "error": "Denomination asset is not properly set", "op": "assert // Denomination asset is not properly set", "stack_out": [ @@ -24925,7 +25585,7 @@ "denomination_asset_id#0" ] }, - "3121": { + "3222": { "op": "bytec 44 // \"denomination_asset_id\"", "defined_out": [ "\"denomination_asset_id\"", @@ -24945,7 +25605,7 @@ "\"denomination_asset_id\"" ] }, - "3123": { + "3224": { "op": "dig 1", "stack_out": [ "day_count_convention#0", @@ -24961,7 +25621,7 @@ "denomination_asset_id#0 (copy)" ] }, - "3125": { + "3226": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -24975,7 +25635,7 @@ "denomination_asset_id#0" ] }, - "3126": { + "3227": { "op": "dig 1", "stack_out": [ "day_count_convention#0", @@ -24990,7 +25650,7 @@ "terms#0 (copy)" ] }, - "3128": { + "3229": { "op": "pushint 9", "defined_out": [ "9", @@ -25012,7 +25672,7 @@ "9" ] }, - "3130": { + "3231": { "op": "extract_uint64", "defined_out": [ "denomination_asset_id#0", @@ -25032,7 +25692,7 @@ "settlement_asset_id#0" ] }, - "3131": { + "3232": { "op": "dup", "defined_out": [ "denomination_asset_id#0", @@ -25054,7 +25714,7 @@ "settlement_asset_id#0 (copy)" ] }, - "3132": { + "3233": { "op": "uncover 2", "stack_out": [ "day_count_convention#0", @@ -25070,7 +25730,7 @@ "denomination_asset_id#0" ] }, - "3134": { + "3235": { "op": "==", "stack_out": [ "day_count_convention#0", @@ -25085,7 +25745,7 @@ "tmp%0#2" ] }, - "3135": { + "3236": { "error": "Different settlement asset not supported, must be equal to denomination asset", "op": "assert // Different settlement asset not supported, must be equal to denomination asset", "stack_out": [ @@ -25100,7 +25760,7 @@ "settlement_asset_id#0" ] }, - "3136": { + "3237": { "op": "bytec 19 // \"settlement_asset_id\"", "defined_out": [ "\"settlement_asset_id\"", @@ -25120,7 +25780,7 @@ "\"settlement_asset_id\"" ] }, - "3138": { + "3239": { "op": "dig 1", "stack_out": [ "day_count_convention#0", @@ -25136,7 +25796,7 @@ "settlement_asset_id#0 (copy)" ] }, - "3140": { + "3241": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -25150,10 +25810,10 @@ "settlement_asset_id#0" ] }, - "3141": { + "3242": { "op": "itxn_begin" }, - "3142": { + "3243": { "op": "global MinTxnFee", "defined_out": [ "inner_txn_params%0%%param_Fee_idx_0#0", @@ -25173,7 +25833,7 @@ "inner_txn_params%0%%param_Fee_idx_0#0" ] }, - "3144": { + "3245": { "op": "global CurrentApplicationAddress", "defined_out": [ "inner_txn_params%0%%param_AssetReceiver_idx_0#0", @@ -25195,7 +25855,7 @@ "inner_txn_params%0%%param_AssetReceiver_idx_0#0" ] }, - "3146": { + "3247": { "op": "intc_0 // 0", "stack_out": [ "day_count_convention#0", @@ -25212,7 +25872,7 @@ "0" ] }, - "3147": { + "3248": { "op": "itxn_field AssetAmount", "stack_out": [ "day_count_convention#0", @@ -25228,7 +25888,7 @@ "inner_txn_params%0%%param_AssetReceiver_idx_0#0" ] }, - "3149": { + "3250": { "op": "itxn_field AssetReceiver", "stack_out": [ "day_count_convention#0", @@ -25243,7 +25903,7 @@ "inner_txn_params%0%%param_Fee_idx_0#0" ] }, - "3151": { + "3252": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -25258,7 +25918,7 @@ "settlement_asset_id#0" ] }, - "3152": { + "3253": { "op": "itxn_field XferAsset", "stack_out": [ "day_count_convention#0", @@ -25272,7 +25932,7 @@ "inner_txn_params%0%%param_Fee_idx_0#0" ] }, - "3154": { + "3255": { "op": "pushint 4 // axfer", "defined_out": [ "axfer", @@ -25292,7 +25952,7 @@ "axfer" ] }, - "3156": { + "3257": { "op": "itxn_field TypeEnum", "stack_out": [ "day_count_convention#0", @@ -25306,7 +25966,7 @@ "inner_txn_params%0%%param_Fee_idx_0#0" ] }, - "3158": { + "3259": { "op": "itxn_field Fee", "stack_out": [ "day_count_convention#0", @@ -25319,10 +25979,10 @@ "terms#0" ] }, - "3160": { + "3261": { "op": "itxn_submit" }, - "3161": { + "3262": { "op": "dup", "stack_out": [ "day_count_convention#0", @@ -25336,7 +25996,7 @@ "terms#0 (copy)" ] }, - "3162": { + "3263": { "op": "pushint 17", "defined_out": [ "17", @@ -25356,7 +26016,7 @@ "17" ] }, - "3164": { + "3265": { "op": "extract_uint64", "defined_out": [ "terms#0", @@ -25374,7 +26034,7 @@ "values%4#0" ] }, - "3165": { + "3266": { "op": "bytec 13 // \"total_units\"", "defined_out": [ "\"total_units\"", @@ -25394,7 +26054,7 @@ "\"total_units\"" ] }, - "3167": { + "3268": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -25409,7 +26069,7 @@ "values%4#0" ] }, - "3168": { + "3269": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -25422,8 +26082,8 @@ "terms#0" ] }, - "3169": { - "op": "bytec 10 // \"reserved_units_total\"", + "3270": { + "op": "bytec 11 // \"reserved_units_total\"", "defined_out": [ "\"reserved_units_total\"", "terms#0" @@ -25440,7 +26100,7 @@ "\"reserved_units_total\"" ] }, - "3171": { + "3272": { "op": "intc_0 // 0", "stack_out": [ "day_count_convention#0", @@ -25455,7 +26115,7 @@ "0" ] }, - "3172": { + "3273": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -25468,7 +26128,7 @@ "terms#0" ] }, - "3173": { + "3274": { "op": "bytec 46 // \"day_count_convention\"", "defined_out": [ "\"day_count_convention\"", @@ -25486,7 +26146,7 @@ "\"day_count_convention\"" ] }, - "3175": { + "3276": { "op": "dig 8", "defined_out": [ "\"day_count_convention\"", @@ -25506,7 +26166,7 @@ "day_count_convention#0" ] }, - "3177": { + "3278": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -25519,7 +26179,7 @@ "terms#0" ] }, - "3178": { + "3279": { "op": "dup", "stack_out": [ "day_count_convention#0", @@ -25533,7 +26193,7 @@ "terms#0 (copy)" ] }, - "3179": { + "3280": { "op": "pushint 41", "defined_out": [ "41", @@ -25554,7 +26214,7 @@ "41" ] }, - "3181": { + "3282": { "op": "extract_uint64", "defined_out": [ "day_count_convention#0", @@ -25573,8 +26233,8 @@ "values%5#0" ] }, - "3182": { - "op": "bytec 26 // \"initial_exchange_date\"", + "3283": { + "op": "bytec 27 // \"initial_exchange_date\"", "defined_out": [ "\"initial_exchange_date\"", "day_count_convention#0", @@ -25594,7 +26254,7 @@ "\"initial_exchange_date\"" ] }, - "3184": { + "3285": { "op": "dig 1", "defined_out": [ "\"initial_exchange_date\"", @@ -25617,7 +26277,7 @@ "values%5#0 (copy)" ] }, - "3186": { + "3287": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -25631,7 +26291,7 @@ "values%5#0" ] }, - "3187": { + "3288": { "op": "dig 1", "stack_out": [ "day_count_convention#0", @@ -25646,7 +26306,7 @@ "terms#0 (copy)" ] }, - "3189": { + "3290": { "op": "pushint 49", "defined_out": [ "49", @@ -25669,7 +26329,7 @@ "49" ] }, - "3191": { + "3292": { "op": "extract_uint64", "defined_out": [ "day_count_convention#0", @@ -25690,7 +26350,7 @@ "values%6#0" ] }, - "3192": { + "3293": { "op": "bytec 45 // \"maturity_date\"", "defined_out": [ "\"maturity_date\"", @@ -25713,7 +26373,7 @@ "\"maturity_date\"" ] }, - "3194": { + "3295": { "op": "dig 1", "defined_out": [ "\"maturity_date\"", @@ -25738,7 +26398,7 @@ "values%6#0 (copy)" ] }, - "3196": { + "3297": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -25753,7 +26413,7 @@ "values%6#0" ] }, - "3197": { + "3298": { "op": "dig 6", "defined_out": [ "day_count_convention#0", @@ -25776,7 +26436,7 @@ "initial_state#0" ] }, - "3199": { + "3300": { "op": "dup", "defined_out": [ "day_count_convention#0", @@ -25801,7 +26461,7 @@ "initial_state#0 (copy)" ] }, - "3200": { + "3301": { "op": "cover 2", "stack_out": [ "day_count_convention#0", @@ -25818,7 +26478,7 @@ "initial_state#0 (copy)" ] }, - "3202": { + "3303": { "op": "pushint 48", "defined_out": [ "48", @@ -25845,7 +26505,7 @@ "48" ] }, - "3204": { + "3305": { "op": "extract_uint64", "defined_out": [ "day_count_convention#0", @@ -25870,7 +26530,7 @@ "values%7#0" ] }, - "3205": { + "3306": { "op": "bytec 14 // \"next_principal_redemption\"", "defined_out": [ "\"next_principal_redemption\"", @@ -25897,7 +26557,7 @@ "\"next_principal_redemption\"" ] }, - "3207": { + "3308": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -25915,7 +26575,7 @@ "values%7#0" ] }, - "3208": { + "3309": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -25931,7 +26591,7 @@ "values%6#0" ] }, - "3209": { + "3310": { "op": "bytec 20 // \"initial_exchange_amount\"", "stack_out": [ "day_count_convention#0", @@ -25948,7 +26608,7 @@ "\"initial_exchange_amount\"" ] }, - "3211": { + "3312": { "op": "dig 10", "defined_out": [ "\"initial_exchange_amount\"", @@ -25975,7 +26635,7 @@ "values%0#2" ] }, - "3213": { + "3314": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -25991,7 +26651,7 @@ "values%6#0" ] }, - "3214": { + "3315": { "op": "dig 3", "stack_out": [ "day_count_convention#0", @@ -26008,7 +26668,7 @@ "terms#0 (copy)" ] }, - "3216": { + "3317": { "op": "pushint 786", "defined_out": [ "786", @@ -26036,7 +26696,7 @@ "786" ] }, - "3219": { + "3320": { "op": "getbit", "defined_out": [ "aggregate%get_bit%1#0", @@ -26062,7 +26722,7 @@ "aggregate%get_bit%1#0" ] }, - "3220": { + "3321": { "op": "bytec 34 // \"dynamic_principal_redemption\"", "defined_out": [ "\"dynamic_principal_redemption\"", @@ -26090,7 +26750,7 @@ "\"dynamic_principal_redemption\"" ] }, - "3222": { + "3323": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -26108,7 +26768,7 @@ "aggregate%get_bit%1#0" ] }, - "3223": { + "3324": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -26124,7 +26784,7 @@ "values%6#0" ] }, - "3224": { + "3325": { "op": "dig 1", "stack_out": [ "day_count_convention#0", @@ -26141,7 +26801,7 @@ "initial_state#0 (copy)" ] }, - "3226": { + "3327": { "op": "pushint 16", "defined_out": [ "16", @@ -26169,7 +26829,7 @@ "16" ] }, - "3228": { + "3329": { "op": "extract_uint64", "defined_out": [ "day_count_convention#0", @@ -26195,8 +26855,8 @@ "values%10#0" ] }, - "3229": { - "op": "bytec_3 // \"outstanding_principal\"", + "3330": { + "op": "bytec 4 // \"outstanding_principal\"", "defined_out": [ "\"outstanding_principal\"", "day_count_convention#0", @@ -26223,7 +26883,7 @@ "\"outstanding_principal\"" ] }, - "3230": { + "3332": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -26241,7 +26901,7 @@ "values%10#0" ] }, - "3231": { + "3333": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -26257,7 +26917,7 @@ "values%6#0" ] }, - "3232": { + "3334": { "op": "dig 1", "stack_out": [ "day_count_convention#0", @@ -26274,7 +26934,7 @@ "initial_state#0 (copy)" ] }, - "3234": { + "3336": { "op": "pushint 40", "defined_out": [ "40", @@ -26302,7 +26962,7 @@ "40" ] }, - "3236": { + "3338": { "op": "extract_uint64", "defined_out": [ "day_count_convention#0", @@ -26328,7 +26988,7 @@ "values%11#0" ] }, - "3237": { + "3339": { "op": "bytec 6 // \"accrued_interest\"", "defined_out": [ "\"accrued_interest\"", @@ -26356,7 +27016,7 @@ "\"accrued_interest\"" ] }, - "3239": { + "3341": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -26374,7 +27034,7 @@ "values%11#0" ] }, - "3240": { + "3342": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -26390,7 +27050,7 @@ "values%6#0" ] }, - "3241": { + "3343": { "op": "dig 1", "stack_out": [ "day_count_convention#0", @@ -26407,7 +27067,7 @@ "initial_state#0 (copy)" ] }, - "3243": { + "3345": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -26435,7 +27095,7 @@ "32" ] }, - "3244": { + "3346": { "op": "extract_uint64", "defined_out": [ "day_count_convention#0", @@ -26461,7 +27121,7 @@ "values%12#0" ] }, - "3245": { + "3347": { "op": "bytec 9 // \"nominal_interest_rate\"", "defined_out": [ "\"nominal_interest_rate\"", @@ -26489,7 +27149,7 @@ "\"nominal_interest_rate\"" ] }, - "3247": { + "3349": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -26507,7 +27167,7 @@ "values%12#0" ] }, - "3248": { + "3350": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -26523,7 +27183,7 @@ "values%6#0" ] }, - "3249": { + "3351": { "op": "dig 1", "stack_out": [ "day_count_convention#0", @@ -26540,7 +27200,7 @@ "initial_state#0 (copy)" ] }, - "3251": { + "3353": { "op": "pushint 24", "defined_out": [ "24", @@ -26568,7 +27228,7 @@ "24" ] }, - "3253": { + "3355": { "op": "extract_uint64", "defined_out": [ "day_count_convention#0", @@ -26594,7 +27254,7 @@ "values%13#0" ] }, - "3254": { + "3356": { "op": "bytec 7 // \"interest_calculation_base\"", "defined_out": [ "\"interest_calculation_base\"", @@ -26622,7 +27282,7 @@ "\"interest_calculation_base\"" ] }, - "3256": { + "3358": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -26640,7 +27300,7 @@ "values%13#0" ] }, - "3257": { + "3359": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -26656,7 +27316,7 @@ "values%6#0" ] }, - "3258": { + "3360": { "op": "dig 3", "stack_out": [ "day_count_convention#0", @@ -26673,7 +27333,7 @@ "terms#0 (copy)" ] }, - "3260": { + "3362": { "op": "pushint 58", "defined_out": [ "58", @@ -26701,7 +27361,7 @@ "58" ] }, - "3262": { + "3364": { "op": "extract_uint64", "defined_out": [ "day_count_convention#0", @@ -26727,7 +27387,7 @@ "values%14#0" ] }, - "3263": { + "3365": { "op": "bytec 35 // \"rate_reset_spread\"", "defined_out": [ "\"rate_reset_spread\"", @@ -26755,7 +27415,7 @@ "\"rate_reset_spread\"" ] }, - "3265": { + "3367": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -26773,7 +27433,7 @@ "values%14#0" ] }, - "3266": { + "3368": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -26789,7 +27449,7 @@ "values%6#0" ] }, - "3267": { + "3369": { "op": "dig 3", "stack_out": [ "day_count_convention#0", @@ -26806,7 +27466,7 @@ "terms#0 (copy)" ] }, - "3269": { + "3371": { "op": "pushint 66", "defined_out": [ "66", @@ -26834,7 +27494,7 @@ "66" ] }, - "3271": { + "3373": { "op": "extract_uint64", "defined_out": [ "day_count_convention#0", @@ -26860,7 +27520,7 @@ "values%15#0" ] }, - "3272": { + "3374": { "op": "bytec 36 // \"rate_reset_multiplier\"", "defined_out": [ "\"rate_reset_multiplier\"", @@ -26888,7 +27548,7 @@ "\"rate_reset_multiplier\"" ] }, - "3274": { + "3376": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -26906,7 +27566,7 @@ "values%15#0" ] }, - "3275": { + "3377": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -26922,7 +27582,7 @@ "values%6#0" ] }, - "3276": { + "3378": { "op": "dig 3", "stack_out": [ "day_count_convention#0", @@ -26939,7 +27599,7 @@ "terms#0 (copy)" ] }, - "3278": { + "3380": { "op": "pushint 74", "defined_out": [ "74", @@ -26967,7 +27627,7 @@ "74" ] }, - "3280": { + "3382": { "op": "extract_uint64", "defined_out": [ "day_count_convention#0", @@ -26993,8 +27653,8 @@ "values%16#0" ] }, - "3281": { - "op": "bytec 29 // \"rate_reset_floor\"", + "3383": { + "op": "bytec 30 // \"rate_reset_floor\"", "defined_out": [ "\"rate_reset_floor\"", "day_count_convention#0", @@ -27021,7 +27681,7 @@ "\"rate_reset_floor\"" ] }, - "3283": { + "3385": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -27039,7 +27699,7 @@ "values%16#0" ] }, - "3284": { + "3386": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -27055,7 +27715,7 @@ "values%6#0" ] }, - "3285": { + "3387": { "op": "dig 3", "stack_out": [ "day_count_convention#0", @@ -27072,7 +27732,7 @@ "terms#0 (copy)" ] }, - "3287": { + "3389": { "op": "pushint 82", "defined_out": [ "82", @@ -27100,7 +27760,7 @@ "82" ] }, - "3289": { + "3391": { "op": "extract_uint64", "defined_out": [ "day_count_convention#0", @@ -27126,8 +27786,8 @@ "values%17#0" ] }, - "3290": { - "op": "bytec 30 // \"rate_reset_cap\"", + "3392": { + "op": "bytec 31 // \"rate_reset_cap\"", "defined_out": [ "\"rate_reset_cap\"", "day_count_convention#0", @@ -27154,7 +27814,7 @@ "\"rate_reset_cap\"" ] }, - "3292": { + "3394": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -27172,7 +27832,7 @@ "values%17#0" ] }, - "3293": { + "3395": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -27188,7 +27848,7 @@ "values%6#0" ] }, - "3294": { + "3396": { "op": "dig 3", "stack_out": [ "day_count_convention#0", @@ -27205,7 +27865,7 @@ "terms#0 (copy)" ] }, - "3296": { + "3398": { "op": "pushint 90", "defined_out": [ "90", @@ -27233,7 +27893,7 @@ "90" ] }, - "3298": { + "3400": { "op": "extract_uint64", "defined_out": [ "day_count_convention#0", @@ -27259,7 +27919,7 @@ "values%18#0" ] }, - "3299": { + "3401": { "op": "bytec 37 // \"rate_reset_next\"", "defined_out": [ "\"rate_reset_next\"", @@ -27287,7 +27947,7 @@ "\"rate_reset_next\"" ] }, - "3301": { + "3403": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -27305,7 +27965,7 @@ "values%18#0" ] }, - "3302": { + "3404": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -27321,7 +27981,7 @@ "values%6#0" ] }, - "3303": { + "3405": { "op": "dig 3", "stack_out": [ "day_count_convention#0", @@ -27338,7 +27998,7 @@ "terms#0 (copy)" ] }, - "3305": { + "3407": { "op": "pushint 784", "defined_out": [ "784", @@ -27366,7 +28026,7 @@ "784" ] }, - "3308": { + "3410": { "op": "getbit", "defined_out": [ "aggregate%get_bit%2#0", @@ -27392,7 +28052,7 @@ "aggregate%get_bit%2#0" ] }, - "3309": { + "3411": { "op": "bytec 38 // \"has_rate_reset_floor\"", "defined_out": [ "\"has_rate_reset_floor\"", @@ -27420,7 +28080,7 @@ "\"has_rate_reset_floor\"" ] }, - "3311": { + "3413": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -27438,7 +28098,7 @@ "aggregate%get_bit%2#0" ] }, - "3312": { + "3414": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -27454,7 +28114,7 @@ "values%6#0" ] }, - "3313": { + "3415": { "op": "dig 3", "stack_out": [ "day_count_convention#0", @@ -27471,7 +28131,7 @@ "terms#0 (copy)" ] }, - "3315": { + "3417": { "op": "pushint 785", "defined_out": [ "785", @@ -27499,7 +28159,7 @@ "785" ] }, - "3318": { + "3420": { "op": "getbit", "defined_out": [ "aggregate%get_bit%3#0", @@ -27525,7 +28185,7 @@ "aggregate%get_bit%3#0" ] }, - "3319": { + "3421": { "op": "bytec 39 // \"has_rate_reset_cap\"", "defined_out": [ "\"has_rate_reset_cap\"", @@ -27553,7 +28213,7 @@ "\"has_rate_reset_cap\"" ] }, - "3321": { + "3423": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -27571,7 +28231,7 @@ "aggregate%get_bit%3#0" ] }, - "3322": { + "3424": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -27587,7 +28247,7 @@ "values%6#0" ] }, - "3323": { + "3425": { "op": "uncover 3", "stack_out": [ "day_count_convention#0", @@ -27603,7 +28263,7 @@ "terms#0" ] }, - "3325": { + "3427": { "op": "pushint 99", "defined_out": [ "99", @@ -27629,7 +28289,7 @@ "99" ] }, - "3327": { + "3429": { "op": "extract_uint64", "defined_out": [ "day_count_convention#0", @@ -27654,7 +28314,7 @@ "values%21#0" ] }, - "3328": { + "3430": { "op": "bytec 5 // \"fixed_point_scale\"", "defined_out": [ "\"fixed_point_scale\"", @@ -27681,7 +28341,7 @@ "\"fixed_point_scale\"" ] }, - "3330": { + "3432": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -27698,7 +28358,7 @@ "values%21#0" ] }, - "3331": { + "3433": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -27713,7 +28373,7 @@ "values%6#0" ] }, - "3332": { + "3434": { "op": "dig 1", "stack_out": [ "day_count_convention#0", @@ -27729,7 +28389,7 @@ "initial_state#0 (copy)" ] }, - "3334": { + "3436": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -27756,7 +28416,7 @@ "8" ] }, - "3335": { + "3437": { "op": "extract_uint64", "defined_out": [ "day_count_convention#0", @@ -27781,7 +28441,7 @@ "values%22#0" ] }, - "3336": { + "3438": { "op": "bytec_2 // \"event_cursor\"", "defined_out": [ "\"event_cursor\"", @@ -27808,7 +28468,7 @@ "\"event_cursor\"" ] }, - "3337": { + "3439": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -27825,7 +28485,7 @@ "values%22#0" ] }, - "3338": { + "3440": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -27840,7 +28500,7 @@ "values%6#0" ] }, - "3339": { + "3441": { "op": "dig 1", "stack_out": [ "day_count_convention#0", @@ -27856,7 +28516,7 @@ "initial_state#0 (copy)" ] }, - "3341": { + "3443": { "op": "pushint 56", "defined_out": [ "56", @@ -27883,7 +28543,7 @@ "56" ] }, - "3343": { + "3445": { "op": "extract_uint64", "defined_out": [ "day_count_convention#0", @@ -27908,7 +28568,7 @@ "values%23#0" ] }, - "3344": { + "3446": { "op": "bytec 16 // \"cumulative_interest_index\"", "defined_out": [ "\"cumulative_interest_index\"", @@ -27935,7 +28595,7 @@ "\"cumulative_interest_index\"" ] }, - "3346": { + "3448": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -27952,7 +28612,7 @@ "values%23#0" ] }, - "3347": { + "3449": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -27967,7 +28627,7 @@ "values%6#0" ] }, - "3348": { + "3450": { "op": "dig 1", "stack_out": [ "day_count_convention#0", @@ -27983,7 +28643,7 @@ "initial_state#0 (copy)" ] }, - "3350": { + "3452": { "op": "pushint 64", "defined_out": [ "64", @@ -28010,7 +28670,7 @@ "64" ] }, - "3352": { + "3454": { "op": "extract_uint64", "defined_out": [ "day_count_convention#0", @@ -28035,7 +28695,7 @@ "values%24#0" ] }, - "3353": { + "3455": { "op": "bytec 17 // \"cumulative_principal_index\"", "defined_out": [ "\"cumulative_principal_index\"", @@ -28062,7 +28722,7 @@ "\"cumulative_principal_index\"" ] }, - "3355": { + "3457": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -28079,7 +28739,7 @@ "values%24#0" ] }, - "3356": { + "3458": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -28094,7 +28754,7 @@ "values%6#0" ] }, - "3357": { + "3459": { "op": "bytec 15 // \"reserved_interest\"", "defined_out": [ "\"reserved_interest\"", @@ -28119,7 +28779,7 @@ "\"reserved_interest\"" ] }, - "3359": { + "3461": { "op": "intc_0 // 0", "stack_out": [ "day_count_convention#0", @@ -28136,7 +28796,7 @@ "0" ] }, - "3360": { + "3462": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -28151,8 +28811,8 @@ "values%6#0" ] }, - "3361": { - "op": "bytec 11 // \"reserved_principal\"", + "3463": { + "op": "bytec 12 // \"reserved_principal\"", "defined_out": [ "\"reserved_principal\"", "day_count_convention#0", @@ -28176,7 +28836,7 @@ "\"reserved_principal\"" ] }, - "3363": { + "3465": { "op": "intc_0 // 0", "stack_out": [ "day_count_convention#0", @@ -28193,7 +28853,7 @@ "0" ] }, - "3364": { + "3466": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -28208,7 +28868,7 @@ "values%6#0" ] }, - "3365": { + "3467": { "op": "dig 2", "stack_out": [ "day_count_convention#0", @@ -28224,7 +28884,7 @@ "values%5#0 (copy)" ] }, - "3367": { + "3469": { "op": "global LatestTimestamp", "defined_out": [ "day_count_convention#0", @@ -28251,7 +28911,7 @@ "tmp%3#1" ] }, - "3369": { + "3471": { "op": ">", "defined_out": [ "day_count_convention#0", @@ -28276,7 +28936,7 @@ "tmp%4#1" ] }, - "3370": { + "3472": { "error": "IED must be set in the future", "op": "assert // IED must be set in the future", "stack_out": [ @@ -28292,7 +28952,7 @@ "values%6#0" ] }, - "3371": { + "3473": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -28307,7 +28967,7 @@ "initial_state#0" ] }, - "3372": { + "3474": { "op": "intc_0 // 0", "stack_out": [ "day_count_convention#0", @@ -28323,7 +28983,7 @@ "0" ] }, - "3373": { + "3475": { "op": "extract_uint64", "defined_out": [ "day_count_convention#0", @@ -28347,7 +29007,7 @@ "values%27#0" ] }, - "3374": { + "3476": { "op": "dig 2", "stack_out": [ "day_count_convention#0", @@ -28363,7 +29023,7 @@ "values%5#0 (copy)" ] }, - "3376": { + "3478": { "op": "<", "defined_out": [ "day_count_convention#0", @@ -28387,7 +29047,7 @@ "tmp%5#1" ] }, - "3377": { + "3479": { "error": "IED must be set in the future", "op": "assert // IED must be set in the future", "stack_out": [ @@ -28402,7 +29062,7 @@ "values%6#0" ] }, - "3378": { + "3480": { "op": "<", "defined_out": [ "day_count_convention#0", @@ -28422,7 +29082,7 @@ "tmp%6#0" ] }, - "3379": { + "3481": { "error": "IED must be set in the future", "op": "assert // IED must be set in the future", "stack_out": [ @@ -28435,7 +29095,7 @@ "contract_type#0" ] }, - "3380": { + "3482": { "op": "dig 2", "defined_out": [ "day_count_convention#0", @@ -28455,7 +29115,7 @@ "prospectus#0" ] }, - "3382": { + "3484": { "op": "extract 0 32", "defined_out": [ "aggregate%extract%23#0", @@ -28476,7 +29136,7 @@ "aggregate%extract%23#0" ] }, - "3385": { + "3487": { "op": "bytec 42 // \"prospectus_hash\"", "defined_out": [ "\"prospectus_hash\"", @@ -28499,7 +29159,7 @@ "\"prospectus_hash\"" ] }, - "3387": { + "3489": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -28513,7 +29173,7 @@ "aggregate%extract%23#0" ] }, - "3388": { + "3490": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -28525,7 +29185,7 @@ "contract_type#0" ] }, - "3389": { + "3491": { "op": "dig 1", "defined_out": [ "day_count_convention#0", @@ -28546,7 +29206,7 @@ "substring3%0#0" ] }, - "3391": { + "3493": { "op": "extract 2 0", "defined_out": [ "day_count_convention#0", @@ -28568,7 +29228,7 @@ "values%1#0" ] }, - "3394": { + "3496": { "op": "bytec 43 // \"prospectus_url\"", "defined_out": [ "\"prospectus_url\"", @@ -28592,7 +29252,7 @@ "\"prospectus_url\"" ] }, - "3396": { + "3498": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -28606,7 +29266,7 @@ "values%1#0" ] }, - "3397": { + "3499": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -28618,7 +29278,7 @@ "contract_type#0" ] }, - "3398": { + "3500": { "op": "global LatestTimestamp", "defined_out": [ "day_count_convention#0", @@ -28640,7 +29300,7 @@ "tmp%1#1" ] }, - "3400": { + "3502": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0", @@ -28662,7 +29322,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "3401": { + "3503": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -28686,7 +29346,7 @@ "0x151f7c75" ] }, - "3402": { + "3504": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -28700,7 +29360,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "3403": { + "3505": { "op": "concat", "defined_out": [ "day_count_convention#0", @@ -28722,7 +29382,7 @@ "tmp%5#0" ] }, - "3404": { + "3506": { "op": "log", "stack_out": [ "day_count_convention#0", @@ -28734,7 +29394,7 @@ "contract_type#0" ] }, - "3405": { + "3507": { "op": "intc_1 // 1", "stack_out": [ "day_count_convention#0", @@ -28747,7 +29407,7 @@ "1" ] }, - "3406": { + "3508": { "op": "return", "stack_out": [ "day_count_convention#0", @@ -28759,7 +29419,7 @@ "contract_type#0" ] }, - "3407": { + "3509": { "block": "contract_config_bool_false@17", "stack_in": [ "day_count_convention#0", @@ -28785,10 +29445,10 @@ "or_result%0#0" ] }, - "3408": { + "3510": { "op": "b contract_config_bool_merge@18" }, - "3411": { + "3513": { "block": "contract_config_bool_false@8", "stack_in": [ "day_count_convention#0", @@ -28814,10 +29474,10 @@ "or_result%0#0" ] }, - "3412": { + "3514": { "op": "b contract_config_bool_merge@9" }, - "3415": { + "3517": { "subroutine": "modules.actus_kernel.ActusKernelModule.contract_schedule[routing]", "params": {}, "block": "contract_schedule", @@ -28827,24 +29487,23 @@ "aggregate%array_trimmed%0#0" ] }, - "3416": { + "3518": { "op": "pushbytes \"\"", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0" ] }, - "3418": { - "op": "dupn 3", + "3520": { + "op": "dupn 2", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0" ] }, - "3420": { + "3522": { "op": "txna ApplicationArgs 1", "defined_out": [ "tmp%0#0" @@ -28852,13 +29511,12 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "tmp%0#0" ] }, - "3423": { + "3525": { "op": "dup", "defined_out": [ "tmp%0#0", @@ -28867,14 +29525,13 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "tmp%0#0", "tmp%0#0 (copy)" ] }, - "3424": { + "3526": { "op": "len", "defined_out": [ "len%0#0", @@ -28883,14 +29540,13 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "tmp%0#0", "len%0#0" ] }, - "3425": { + "3527": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -28900,7 +29556,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "tmp%0#0", @@ -28908,7 +29563,7 @@ "8" ] }, - "3426": { + "3528": { "op": "==", "defined_out": [ "eq%0#0", @@ -28917,26 +29572,24 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "tmp%0#0", "eq%0#0" ] }, - "3427": { + "3529": { "error": "invalid number of bytes for arc4.uint64", "op": "assert // invalid number of bytes for arc4.uint64", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "tmp%0#0" ] }, - "3428": { + "3530": { "op": "btoi", "defined_out": [ "schedule_page_index#0" @@ -28944,13 +29597,12 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0" ] }, - "3429": { + "3531": { "op": "dup", "defined_out": [ "schedule_page_index#0" @@ -28958,14 +29610,13 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", "schedule_page_index#0" ] }, - "3430": { + "3532": { "op": "txna ApplicationArgs 2", "defined_out": [ "schedule_page_index#0", @@ -28974,7 +29625,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -28982,7 +29632,7 @@ "tmp%2#0" ] }, - "3433": { + "3535": { "op": "dup", "defined_out": [ "schedule_page_index#0", @@ -28992,7 +29642,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -29001,7 +29650,7 @@ "tmp%2#0 (copy)" ] }, - "3434": { + "3536": { "op": "len", "defined_out": [ "len%1#0", @@ -29011,7 +29660,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -29020,7 +29668,7 @@ "len%1#0" ] }, - "3435": { + "3537": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -29031,7 +29679,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -29041,7 +29688,7 @@ "1" ] }, - "3436": { + "3538": { "op": "==", "defined_out": [ "eq%1#0", @@ -29051,7 +29698,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -29060,13 +29706,12 @@ "eq%1#0" ] }, - "3437": { + "3539": { "error": "invalid number of bytes for arc4.bool", "op": "assert // invalid number of bytes for arc4.bool", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -29074,12 +29719,11 @@ "tmp%2#0" ] }, - "3438": { + "3540": { "op": "intc_0 // 0", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -29088,7 +29732,7 @@ "0" ] }, - "3439": { + "3541": { "op": "getbit", "defined_out": [ "is_last_page#0", @@ -29097,7 +29741,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -29105,7 +29748,7 @@ "is_last_page#0" ] }, - "3440": { + "3542": { "op": "swap", "defined_out": [ "is_last_page#0", @@ -29114,7 +29757,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -29122,10 +29764,10 @@ "schedule_page_index#0" ] }, - "3441": { + "3543": { "op": "txna ApplicationArgs 3" }, - "3444": { + "3546": { "op": "dup", "defined_out": [ "is_last_page#0", @@ -29135,7 +29777,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -29145,12 +29786,11 @@ "schedule_page#0" ] }, - "3445": { + "3547": { "op": "cover 2", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -29160,7 +29800,7 @@ "schedule_page#0" ] }, - "3447": { + "3549": { "op": "dup", "defined_out": [ "is_last_page#0", @@ -29171,7 +29811,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -29182,12 +29821,11 @@ "schedule_page#0 (copy)" ] }, - "3448": { + "3550": { "op": "intc_0 // 0", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -29199,7 +29837,7 @@ "0" ] }, - "3449": { + "3551": { "error": "invalid array length header", "op": "extract_uint16 // on error: invalid array length header", "defined_out": [ @@ -29211,7 +29849,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -29222,12 +29859,11 @@ "page_length#0" ] }, - "3450": { + "3552": { "op": "dup", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -29239,12 +29875,11 @@ "page_length#0" ] }, - "3451": { + "3553": { "op": "cover 3", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -29256,7 +29891,7 @@ "page_length#0" ] }, - "3453": { + "3555": { "op": "dup", "defined_out": [ "is_last_page#0", @@ -29268,7 +29903,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -29281,7 +29915,7 @@ "page_length#0 (copy)" ] }, - "3454": { + "3556": { "op": "pushint 65", "defined_out": [ "65", @@ -29294,7 +29928,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -29308,7 +29941,7 @@ "65" ] }, - "3456": { + "3558": { "op": "*", "defined_out": [ "is_last_page#0", @@ -29320,7 +29953,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -29333,7 +29965,7 @@ "mul%0#0" ] }, - "3457": { + "3559": { "op": "pushint 2", "defined_out": [ "2", @@ -29346,7 +29978,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -29360,7 +29991,7 @@ "2" ] }, - "3459": { + "3561": { "op": "+", "defined_out": [ "add%0#0", @@ -29372,7 +30003,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -29385,12 +30015,11 @@ "add%0#0" ] }, - "3460": { + "3562": { "op": "uncover 2", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -29403,7 +30032,7 @@ "schedule_page#0" ] }, - "3462": { + "3564": { "op": "len", "defined_out": [ "add%0#0", @@ -29416,7 +30045,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -29429,7 +30057,7 @@ "len%2#0" ] }, - "3463": { + "3565": { "op": "==", "defined_out": [ "eq%2#0", @@ -29441,7 +30069,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -29453,13 +30080,12 @@ "eq%2#0" ] }, - "3464": { + "3566": { "error": "invalid number of bytes for arc4.dynamic_array", "op": "assert // invalid number of bytes for arc4.dynamic_array", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -29470,16 +30096,15 @@ "page_length#0" ] }, - "3465": { + "3567": { "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", "op": "callsub _assert_caller_is_arranger" }, - "3468": { + "3570": { "op": "intc_0 // 0", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -29491,8 +30116,8 @@ "0" ] }, - "3469": { - "op": "bytec 12 // \"contract_type\"", + "3571": { + "op": "bytec 10 // \"contract_type\"", "defined_out": [ "\"contract_type\"", "0", @@ -29504,7 +30129,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -29517,7 +30141,7 @@ "\"contract_type\"" ] }, - "3471": { + "3573": { "op": "app_global_get_ex", "defined_out": [ "contract_type#0", @@ -29530,7 +30154,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -29543,12 +30166,11 @@ "maybe_exists%0#0" ] }, - "3472": { + "3574": { "op": "swap", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -29561,7 +30183,7 @@ "contract_type#0" ] }, - "3473": { + "3575": { "op": "cover 3", "defined_out": [ "contract_type#0", @@ -29574,7 +30196,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -29587,13 +30208,12 @@ "maybe_exists%0#0" ] }, - "3475": { + "3577": { "error": "check self.contract_type exists", "op": "assert // check self.contract_type exists", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -29605,12 +30225,11 @@ "page_length#0" ] }, - "3476": { + "3578": { "op": "intc_0 // 0", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -29623,7 +30242,7 @@ "0" ] }, - "3477": { + "3579": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"", @@ -29637,7 +30256,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -29651,7 +30269,7 @@ "\"status\"" ] }, - "3478": { + "3580": { "op": "app_global_get_ex", "defined_out": [ "contract_type#0", @@ -29665,7 +30283,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -29679,13 +30296,12 @@ "maybe_exists%0#0" ] }, - "3479": { + "3581": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -29698,7 +30314,7 @@ "maybe_value%0#1" ] }, - "3480": { + "3582": { "op": "!", "defined_out": [ "contract_type#0", @@ -29711,7 +30327,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -29724,13 +30339,12 @@ "tmp%0#2" ] }, - "3481": { + "3583": { "error": "D-ASA already configured", "op": "assert // D-ASA already configured", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -29742,12 +30356,11 @@ "page_length#0" ] }, - "3482": { + "3584": { "op": "dup", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -29760,7 +30373,7 @@ "page_length#0 (copy)" ] }, - "3483": { + "3585": { "op": "pushint 16", "defined_out": [ "16", @@ -29774,7 +30387,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -29788,7 +30400,7 @@ "16" ] }, - "3485": { + "3587": { "op": "<=", "defined_out": [ "contract_type#0", @@ -29801,7 +30413,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -29814,13 +30425,12 @@ "tmp%2#1" ] }, - "3486": { + "3588": { "error": "Invalid schedule page", "op": "assert // Invalid schedule page", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -29832,12 +30442,11 @@ "page_length#0" ] }, - "3487": { + "3589": { "op": "intc_0 // 0", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -29850,7 +30459,7 @@ "0" ] }, - "3488": { + "3590": { "op": "bytec 20 // \"initial_exchange_amount\"", "defined_out": [ "\"initial_exchange_amount\"", @@ -29864,7 +30473,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -29878,7 +30486,7 @@ "\"initial_exchange_amount\"" ] }, - "3490": { + "3592": { "op": "app_global_get_ex", "defined_out": [ "contract_type#0", @@ -29892,7 +30500,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -29906,13 +30513,12 @@ "maybe_exists%1#0" ] }, - "3491": { + "3593": { "error": "check self.initial_exchange_amount exists", "op": "assert // check self.initial_exchange_amount exists", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -29925,13 +30531,12 @@ "maybe_value%1#0" ] }, - "3492": { + "3594": { "error": "D-ASA terms not configured", "op": "assert // D-ASA terms not configured", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -29943,12 +30548,11 @@ "page_length#0" ] }, - "3493": { + "3595": { "op": "swap", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -29960,12 +30564,11 @@ "schedule_page_index#0" ] }, - "3494": { + "3596": { "op": "pushint 16", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -29978,7 +30581,7 @@ "16" ] }, - "3496": { + "3598": { "op": "*", "defined_out": [ "contract_type#0", @@ -29991,7 +30594,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -30003,12 +30605,11 @@ "page_cursor#0" ] }, - "3497": { + "3599": { "op": "swap", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -30020,7 +30621,7 @@ "page_length#0" ] }, - "3498": { + "3600": { "op": "pushint 100", "defined_out": [ "100", @@ -30034,7 +30635,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -30047,7 +30647,7 @@ "100" ] }, - "3500": { + "3602": { "op": "*", "defined_out": [ "contract_type#0", @@ -30061,7 +30661,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -30073,10 +30672,10 @@ "tmp%6#1" ] }, - "3501": { - "op": "pushint 1510", + "3603": { + "op": "intc 4 // 1500", "defined_out": [ - "1510", + "1500", "contract_type#0", "is_last_page#0", "page_cursor#0", @@ -30088,7 +30687,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -30098,146 +30696,23 @@ "contract_type#0", "page_cursor#0", "tmp%6#1", - "1510" + "1500" ] }, - "3504": { + "3605": { "op": "+", "defined_out": [ "contract_type#0", "is_last_page#0", "page_cursor#0", "page_length#0", - "required_budget_with_buffer#0", - "schedule_page#0", - "schedule_page_index#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "entry_event_type#0", - "index#0", - "values%0#0", - "values%1#0", - "schedule_page_index#0", - "is_last_page#0", - "schedule_page#0", - "page_length#0", - "contract_type#0", - "page_cursor#0", - "required_budget_with_buffer#0" - ] - }, - "3505": { - "block": "contract_schedule_while_top@2", - "stack_in": [ - "aggregate%array_trimmed%0#0", - "entry_event_type#0", - "index#0", - "values%0#0", - "values%1#0", - "schedule_page_index#0", - "is_last_page#0", - "schedule_page#0", - "page_length#0", - "contract_type#0", - "page_cursor#0", - "required_budget_with_buffer#0" - ], - "op": "dup" - }, - "3506": { - "op": "global OpcodeBudget", - "defined_out": [ - "required_budget_with_buffer#0", - "tmp%1#1" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "entry_event_type#0", - "index#0", - "values%0#0", - "values%1#0", - "schedule_page_index#0", - "is_last_page#0", - "schedule_page#0", - "page_length#0", - "contract_type#0", - "page_cursor#0", - "required_budget_with_buffer#0", - "required_budget_with_buffer#0", - "tmp%1#1" - ] - }, - "3508": { - "op": ">", - "defined_out": [ - "required_budget_with_buffer#0", - "tmp%2#1" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "entry_event_type#0", - "index#0", - "values%0#0", - "values%1#0", - "schedule_page_index#0", - "is_last_page#0", "schedule_page#0", - "page_length#0", - "contract_type#0", - "page_cursor#0", - "required_budget_with_buffer#0", - "tmp%2#1" - ] - }, - "3509": { - "op": "bz contract_schedule_after_while@5", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "entry_event_type#0", - "index#0", - "values%0#0", - "values%1#0", "schedule_page_index#0", - "is_last_page#0", - "schedule_page#0", - "page_length#0", - "contract_type#0", - "page_cursor#0", - "required_budget_with_buffer#0" - ] - }, - "3512": { - "op": "itxn_begin" - }, - "3513": { - "op": "pushint 6 // appl", - "defined_out": [ - "appl", - "required_budget_with_buffer#0" + "tmp%7#1" ], "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", - "values%0#0", - "values%1#0", - "schedule_page_index#0", - "is_last_page#0", - "schedule_page#0", - "page_length#0", - "contract_type#0", - "page_cursor#0", - "required_budget_with_buffer#0", - "appl" - ] - }, - "3515": { - "op": "itxn_field TypeEnum", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -30246,19 +30721,14 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0" + "tmp%7#1" ] }, - "3517": { - "op": "pushint 5 // DeleteApplication", - "defined_out": [ - "DeleteApplication", - "required_budget_with_buffer#0" - ], + "3606": { + "op": "intc_0 // 0", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -30267,16 +30737,16 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", - "DeleteApplication" + "tmp%7#1", + "0" ] }, - "3519": { - "op": "itxn_field OnCompletion", + "3607": { + "callsub": "_puya_lib.util.ensure_budget", + "op": "callsub ensure_budget", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -30284,112 +30754,23 @@ "schedule_page#0", "page_length#0", "contract_type#0", - "page_cursor#0", - "required_budget_with_buffer#0" + "page_cursor#0" ] }, - "3521": { - "op": "bytec 47 // 0x068101", + "3610": { + "op": "intc_0 // 0", "defined_out": [ - "0x068101", - "required_budget_with_buffer#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "entry_event_type#0", - "index#0", - "values%0#0", - "values%1#0", - "schedule_page_index#0", - "is_last_page#0", - "schedule_page#0", - "page_length#0", "contract_type#0", - "page_cursor#0", - "required_budget_with_buffer#0", - "0x068101" - ] - }, - "3523": { - "op": "itxn_field ApprovalProgram", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "entry_event_type#0", "index#0", - "values%0#0", - "values%1#0", - "schedule_page_index#0", "is_last_page#0", - "schedule_page#0", - "page_length#0", - "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0" - ] - }, - "3525": { - "op": "bytec 47 // 0x068101", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "entry_event_type#0", - "index#0", - "values%0#0", - "values%1#0", - "schedule_page_index#0", - "is_last_page#0", - "schedule_page#0", "page_length#0", - "contract_type#0", - "page_cursor#0", - "required_budget_with_buffer#0", - "0x068101" - ] - }, - "3527": { - "op": "itxn_field ClearStateProgram", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "entry_event_type#0", - "index#0", - "values%0#0", - "values%1#0", - "schedule_page_index#0", - "is_last_page#0", "schedule_page#0", - "page_length#0", - "contract_type#0", - "page_cursor#0", - "required_budget_with_buffer#0" - ] - }, - "3529": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "required_budget_with_buffer#0" + "schedule_page_index#0" ], "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", - "values%0#0", - "values%1#0", - "schedule_page_index#0", - "is_last_page#0", - "schedule_page#0", - "page_length#0", - "contract_type#0", - "page_cursor#0", - "required_budget_with_buffer#0", - "0" - ] - }, - "3530": { - "op": "itxn_field Fee", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -30398,21 +30779,14 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0" + "index#0" ] }, - "3532": { - "op": "itxn_submit" - }, - "3533": { - "op": "b contract_schedule_while_top@2" - }, - "3536": { - "block": "contract_schedule_after_while@5", + "3611": { + "block": "contract_schedule_while_top@2", "stack_in": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -30421,54 +30795,15 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0" - ], - "op": "intc_0 // 0", - "defined_out": [ "index#0" ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "entry_event_type#0", - "index#0", - "values%0#0", - "values%1#0", - "schedule_page_index#0", - "is_last_page#0", - "schedule_page#0", - "page_length#0", - "contract_type#0", - "page_cursor#0", - "required_budget_with_buffer#0", - "index#0" - ] - }, - "3537": { - "op": "bury 10", + "op": "dup", "defined_out": [ "index#0" ], "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", - "values%0#0", - "values%1#0", - "schedule_page_index#0", - "is_last_page#0", - "schedule_page#0", - "page_length#0", - "contract_type#0", - "page_cursor#0", - "required_budget_with_buffer#0" - ] - }, - "3539": { - "block": "contract_schedule_while_top@6", - "stack_in": [ - "aggregate%array_trimmed%0#0", - "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -30477,29 +30812,11 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0" - ], - "op": "dig 9", - "defined_out": [ - "index#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "entry_event_type#0", "index#0", - "values%0#0", - "values%1#0", - "schedule_page_index#0", - "is_last_page#0", - "schedule_page#0", - "page_length#0", - "contract_type#0", - "page_cursor#0", - "required_budget_with_buffer#0", "index#0" ] }, - "3541": { + "3612": { "op": "dig 4", "defined_out": [ "index#0", @@ -30508,7 +30825,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -30517,12 +30833,12 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "index#0", "page_length#0" ] }, - "3543": { + "3614": { "op": "<", "defined_out": [ "index#0", @@ -30532,7 +30848,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -30541,16 +30856,15 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "tmp%8#0" ] }, - "3544": { - "op": "bz contract_schedule_after_while@15", + "3615": { + "op": "bz contract_schedule_after_while@11", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -30559,10 +30873,10 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0" + "index#0" ] }, - "3547": { + "3618": { "op": "dig 4", "defined_out": [ "index#0", @@ -30572,7 +30886,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -30581,11 +30894,11 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "schedule_page#0" ] }, - "3549": { + "3620": { "op": "extract 2 0", "defined_out": [ "aggregate%array_trimmed%0#0", @@ -30596,7 +30909,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -30605,16 +30917,15 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "aggregate%array_trimmed%0#0" ] }, - "3552": { + "3623": { "op": "dup", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -30623,13 +30934,13 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "aggregate%array_trimmed%0#0", "aggregate%array_trimmed%0#0" ] }, - "3553": { - "op": "bury 13", + "3624": { + "op": "bury 12", "defined_out": [ "aggregate%array_trimmed%0#0", "index#0", @@ -30639,7 +30950,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -30648,16 +30958,15 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "aggregate%array_trimmed%0#0" ] }, - "3555": { - "op": "dig 10", + "3626": { + "op": "dig 1", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -30666,12 +30975,12 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "aggregate%array_trimmed%0#0", "index#0" ] }, - "3557": { + "3628": { "op": "dup", "defined_out": [ "aggregate%array_trimmed%0#0", @@ -30683,7 +30992,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -30692,18 +31000,17 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "aggregate%array_trimmed%0#0", "index#0 (copy)", "index#0 (copy)" ] }, - "3558": { + "3629": { "op": "cover 2", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -30712,13 +31019,13 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "index#0", "aggregate%array_trimmed%0#0", "index#0 (copy)" ] }, - "3560": { + "3631": { "op": "pushint 65", "defined_out": [ "65", @@ -30731,7 +31038,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -30740,14 +31046,14 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "index#0", "aggregate%array_trimmed%0#0", "index#0 (copy)", "65" ] }, - "3562": { + "3633": { "op": "*", "defined_out": [ "aggregate%array_trimmed%0#0", @@ -30759,7 +31065,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -30768,18 +31073,17 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "index#0", "aggregate%array_trimmed%0#0", "aggregate%bytes_offset%0#0" ] }, - "3563": { + "3634": { "op": "pushint 65", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -30788,14 +31092,14 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "index#0", "aggregate%array_trimmed%0#0", "aggregate%bytes_offset%0#0", "65" ] }, - "3565": { + "3636": { "error": "index access is out of bounds", "op": "extract3 // on error: index access is out of bounds", "defined_out": [ @@ -30808,7 +31112,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -30817,12 +31120,12 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "index#0", "aggregate%encoded_element%0#0" ] }, - "3566": { + "3637": { "op": "dup", "defined_out": [ "aggregate%array_trimmed%0#0", @@ -30835,7 +31138,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -30844,13 +31146,13 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "index#0", "aggregate%encoded_element%0#0", "aggregate%encoded_element%0#0 (copy)" ] }, - "3567": { + "3638": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -30864,7 +31166,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -30873,14 +31174,14 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "index#0", "aggregate%encoded_element%0#0", "aggregate%encoded_element%0#0 (copy)", "8" ] }, - "3568": { + "3639": { "op": "getbyte", "defined_out": [ "aggregate%array_trimmed%0#0", @@ -30893,7 +31194,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -30902,18 +31202,17 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "index#0", "aggregate%encoded_element%0#0", "entry_event_type#0" ] }, - "3569": { + "3640": { "op": "dup", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -30922,19 +31221,18 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "index#0", "aggregate%encoded_element%0#0", "entry_event_type#0", "entry_event_type#0 (copy)" ] }, - "3570": { + "3641": { "op": "cover 2", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -30943,15 +31241,15 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "index#0", "entry_event_type#0", "aggregate%encoded_element%0#0", "entry_event_type#0" ] }, - "3572": { - "op": "bury 14", + "3643": { + "op": "bury 13", "defined_out": [ "aggregate%array_trimmed%0#0", "aggregate%encoded_element%0#0", @@ -30963,7 +31261,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -30972,18 +31269,17 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "index#0", "entry_event_type#0", "aggregate%encoded_element%0#0" ] }, - "3574": { + "3645": { "op": "dup", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -30992,19 +31288,18 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "index#0", "entry_event_type#0", "aggregate%encoded_element%0#0", "aggregate%encoded_element%0#0 (copy)" ] }, - "3575": { + "3646": { "op": "intc_0 // 0", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -31013,7 +31308,7 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "index#0", "entry_event_type#0", "aggregate%encoded_element%0#0", @@ -31021,7 +31316,7 @@ "0" ] }, - "3576": { + "3647": { "op": "extract_uint64", "defined_out": [ "aggregate%array_trimmed%0#0", @@ -31035,7 +31330,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -31044,19 +31338,18 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "index#0", "entry_event_type#0", "aggregate%encoded_element%0#0", "values%0#0" ] }, - "3577": { + "3648": { "op": "dup", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -31065,7 +31358,7 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "index#0", "entry_event_type#0", "aggregate%encoded_element%0#0", @@ -31073,7 +31366,7 @@ "values%0#0" ] }, - "3578": { + "3649": { "op": "bury 13", "defined_out": [ "aggregate%array_trimmed%0#0", @@ -31087,7 +31380,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -31096,14 +31388,14 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "index#0", "entry_event_type#0", "aggregate%encoded_element%0#0", "values%0#0" ] }, - "3580": { + "3651": { "op": "dig 5", "defined_out": [ "aggregate%array_trimmed%0#0", @@ -31118,7 +31410,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -31127,7 +31418,7 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "index#0", "entry_event_type#0", "aggregate%encoded_element%0#0", @@ -31135,12 +31426,11 @@ "page_cursor#0" ] }, - "3582": { + "3653": { "op": "uncover 4", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -31149,7 +31439,7 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "entry_event_type#0", "aggregate%encoded_element%0#0", "values%0#0", @@ -31157,7 +31447,7 @@ "index#0" ] }, - "3584": { + "3655": { "op": "+", "defined_out": [ "aggregate%array_trimmed%0#0", @@ -31173,7 +31463,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -31182,14 +31471,14 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "entry_event_type#0", "aggregate%encoded_element%0#0", "values%0#0", "tmp%10#0" ] }, - "3585": { + "3656": { "op": "dig 1", "defined_out": [ "aggregate%array_trimmed%0#0", @@ -31206,7 +31495,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -31215,7 +31503,7 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "entry_event_type#0", "aggregate%encoded_element%0#0", "values%0#0", @@ -31223,7 +31511,7 @@ "values%0#0 (copy)" ] }, - "3587": { + "3658": { "op": "==", "defined_out": [ "aggregate%array_trimmed%0#0", @@ -31239,7 +31527,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -31248,20 +31535,19 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "entry_event_type#0", "aggregate%encoded_element%0#0", "values%0#0", "tmp%11#0" ] }, - "3588": { + "3659": { "error": "Invalid event id", "op": "assert // Invalid event id", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -31270,13 +31556,13 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "entry_event_type#0", "aggregate%encoded_element%0#0", "values%0#0" ] }, - "3589": { + "3660": { "op": "dig 5", "defined_out": [ "aggregate%array_trimmed%0#0", @@ -31292,7 +31578,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -31301,19 +31586,18 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "entry_event_type#0", "aggregate%encoded_element%0#0", "values%0#0", "contract_type#0" ] }, - "3591": { + "3662": { "op": "uncover 3", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -31322,20 +31606,19 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "aggregate%encoded_element%0#0", "values%0#0", "contract_type#0", "entry_event_type#0" ] }, - "3593": { + "3664": { "callsub": "modules.actus_kernel.ActusKernelModule._assert_event_allowed_for_contract_type", "op": "callsub _assert_event_allowed_for_contract_type", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -31344,17 +31627,16 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "aggregate%encoded_element%0#0", "values%0#0" ] }, - "3596": { + "3667": { "op": "swap", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -31363,12 +31645,12 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "values%0#0", "aggregate%encoded_element%0#0" ] }, - "3597": { + "3668": { "op": "pushint 9", "defined_out": [ "9", @@ -31385,7 +31667,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -31394,13 +31675,13 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "values%0#0", "aggregate%encoded_element%0#0", "9" ] }, - "3599": { + "3670": { "op": "extract_uint64", "defined_out": [ "aggregate%array_trimmed%0#0", @@ -31416,7 +31697,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -31425,17 +31705,16 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "values%0#0", "values%1#0" ] }, - "3600": { + "3671": { "op": "dup", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -31444,13 +31723,13 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "values%0#0", "values%1#0", "values%1#0" ] }, - "3601": { + "3672": { "op": "bury 10", "defined_out": [ "aggregate%array_trimmed%0#0", @@ -31466,7 +31745,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -31475,18 +31753,17 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "values%0#0", "values%1#0" ] }, - "3603": { + "3674": { "error": "Invalid ACTUS configuration", "op": "assert // Invalid ACTUS configuration", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -31495,16 +31772,15 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "values%0#0" ] }, - "3604": { - "op": "bz contract_schedule_after_if_else@12", + "3675": { + "op": "bz contract_schedule_after_if_else@8", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -31513,15 +31789,14 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0" + "index#0" ] }, - "3607": { - "op": "dig 9", + "3678": { + "op": "dup", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -31530,16 +31805,15 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "index#0" ] }, - "3609": { - "op": "bz contract_schedule_else_body@10", + "3679": { + "op": "bz contract_schedule_else_body@6", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -31548,15 +31822,14 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0" + "index#0" ] }, - "3612": { - "op": "dig 9", + "3682": { + "op": "dup", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -31565,16 +31838,15 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "index#0" ] }, - "3614": { + "3683": { "op": "intc_1 // 1", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -31583,12 +31855,12 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "index#0", "1" ] }, - "3615": { + "3684": { "op": "-", "defined_out": [ "aggregate%array_trimmed%0#0", @@ -31605,7 +31877,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -31614,16 +31885,15 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "tmp%15#0" ] }, - "3616": { + "3685": { "op": "pushint 65", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -31632,12 +31902,12 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "tmp%15#0", "65" ] }, - "3618": { + "3687": { "op": "*", "defined_out": [ "aggregate%array_trimmed%0#0", @@ -31654,7 +31924,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -31663,16 +31932,15 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "aggregate%bytes_offset%3#0" ] }, - "3619": { - "op": "dig 12", + "3688": { + "op": "dig 11", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -31681,17 +31949,16 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "aggregate%bytes_offset%3#0", "aggregate%array_trimmed%0#0" ] }, - "3621": { + "3690": { "op": "swap", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -31700,17 +31967,16 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "aggregate%array_trimmed%0#0", "aggregate%bytes_offset%3#0" ] }, - "3622": { + "3691": { "op": "pushint 65", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -31719,13 +31985,13 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "aggregate%array_trimmed%0#0", "aggregate%bytes_offset%3#0", "65" ] }, - "3624": { + "3693": { "error": "index access is out of bounds", "op": "extract3 // on error: index access is out of bounds", "defined_out": [ @@ -31743,7 +32009,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -31752,16 +32017,15 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "previous_entry#0" ] }, - "3625": { - "block": "contract_schedule_after_if_else@11", + "3694": { + "block": "contract_schedule_after_if_else@7", "stack_in": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -31770,7 +32034,7 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "previous_entry#0" ], "op": "pushint 9", @@ -31781,7 +32045,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -31790,12 +32053,12 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "previous_entry#0", "9" ] }, - "3627": { + "3696": { "op": "extract_uint64", "defined_out": [ "values%3#0" @@ -31803,7 +32066,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -31812,11 +32074,11 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "values%3#0" ] }, - "3628": { + "3697": { "op": "dig 8", "defined_out": [ "values%1#0", @@ -31825,7 +32087,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -31834,12 +32095,12 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "values%3#0", "values%1#0" ] }, - "3630": { + "3699": { "op": "<=", "defined_out": [ "tmp%22#0", @@ -31848,7 +32109,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -31857,17 +32117,16 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "tmp%22#0" ] }, - "3631": { + "3700": { "error": "Time events must be sorted in strictly ascending order", "op": "assert // Time events must be sorted in strictly ascending order", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -31876,15 +32135,14 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0" + "index#0" ] }, - "3632": { - "block": "contract_schedule_after_if_else@12", + "3701": { + "block": "contract_schedule_after_if_else@8", "stack_in": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -31893,7 +32151,7 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0" + "index#0" ], "op": "dig 8", "defined_out": [ @@ -31902,7 +32160,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -31911,16 +32168,15 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "values%0#0" ] }, - "3634": { - "op": "bnz contract_schedule_after_if_else@14", + "3703": { + "op": "bnz contract_schedule_after_if_else@10", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -31929,11 +32185,11 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0" + "index#0" ] }, - "3637": { - "op": "dig 10", + "3706": { + "op": "dig 9", "defined_out": [ "entry_event_type#0", "values%0#0" @@ -31941,7 +32197,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -31950,11 +32205,11 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "entry_event_type#0" ] }, - "3639": { + "3708": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -31964,7 +32219,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -31973,12 +32227,12 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "entry_event_type#0", "1" ] }, - "3640": { + "3709": { "op": "==", "defined_out": [ "entry_event_type#0", @@ -31988,7 +32242,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -31997,17 +32250,16 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "tmp%24#0" ] }, - "3641": { + "3710": { "error": "Invalid ACTUS configuration", "op": "assert // Invalid ACTUS configuration", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -32016,15 +32268,14 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0" + "index#0" ] }, - "3642": { - "block": "contract_schedule_after_if_else@14", + "3711": { + "block": "contract_schedule_after_if_else@10", "stack_in": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -32033,16 +32284,15 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0" + "index#0" ], - "op": "dig 9", + "op": "dup", "defined_out": [ "index#0" ], "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -32051,11 +32301,11 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "index#0" ] }, - "3644": { + "3712": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -32064,7 +32314,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -32073,17 +32322,16 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "index#0", "1" ] }, - "3645": { + "3713": { "op": "+", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -32092,19 +32340,18 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "index#0" ] }, - "3646": { - "op": "bury 10", + "3714": { + "op": "bury 1", "defined_out": [ "index#0" ], "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -32113,18 +32360,17 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0" + "index#0" ] }, - "3648": { - "op": "b contract_schedule_while_top@6" + "3716": { + "op": "b contract_schedule_while_top@2" }, - "3651": { - "block": "contract_schedule_else_body@10", + "3719": { + "block": "contract_schedule_else_body@6", "stack_in": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -32133,7 +32379,7 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0" + "index#0" ], "op": "dig 6", "defined_out": [ @@ -32142,7 +32388,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -32151,11 +32396,11 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "schedule_page_index#0" ] }, - "3653": { + "3721": { "op": "dup", "defined_out": [ "schedule_page_index#0", @@ -32164,7 +32409,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -32173,18 +32417,17 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "schedule_page_index#0", "schedule_page_index#0 (copy)" ] }, - "3654": { + "3722": { "error": "Invalid event id", "op": "assert // Invalid event id", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -32193,11 +32436,11 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "schedule_page_index#0" ] }, - "3655": { + "3723": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -32206,7 +32449,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -32215,12 +32457,12 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "schedule_page_index#0", "1" ] }, - "3656": { + "3724": { "op": "-", "defined_out": [ "previous_page_index#0", @@ -32229,7 +32471,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -32238,11 +32479,11 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "previous_page_index#0" ] }, - "3657": { + "3725": { "op": "itob", "defined_out": [ "encoded_value%0#0", @@ -32251,7 +32492,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -32260,12 +32500,12 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "encoded_value%0#0" ] }, - "3658": { - "op": "bytec 31 // 0x5323", + "3726": { + "op": "bytec 24 // 0x5323", "defined_out": [ "0x5323", "encoded_value%0#0", @@ -32274,7 +32514,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -32283,17 +32522,16 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "encoded_value%0#0", "0x5323" ] }, - "3660": { + "3728": { "op": "swap", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -32302,12 +32540,12 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "0x5323", "encoded_value%0#0" ] }, - "3661": { + "3729": { "op": "concat", "defined_out": [ "box_prefixed_key%0#0", @@ -32316,7 +32554,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -32325,11 +32562,11 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "box_prefixed_key%0#0" ] }, - "3662": { + "3730": { "op": "dup", "defined_out": [ "box_prefixed_key%0#0", @@ -32339,7 +32576,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -32348,12 +32584,12 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "box_prefixed_key%0#0", "box_prefixed_key%0#0 (copy)" ] }, - "3663": { + "3731": { "op": "box_len", "defined_out": [ "_%0#0", @@ -32364,7 +32600,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -32373,18 +32608,17 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "box_prefixed_key%0#0", "_%0#0", "maybe_exists%2#0" ] }, - "3664": { + "3732": { "op": "bury 1", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -32393,18 +32627,17 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "box_prefixed_key%0#0", "maybe_exists%2#0" ] }, - "3666": { + "3734": { "error": "Invalid schedule page", "op": "assert // Invalid schedule page", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -32413,16 +32646,15 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "box_prefixed_key%0#0" ] }, - "3667": { + "3735": { "op": "dup", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -32431,12 +32663,12 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "box_prefixed_key%0#0", "box_prefixed_key%0#0 (copy)" ] }, - "3668": { + "3736": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -32447,7 +32679,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -32456,13 +32687,13 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "box_prefixed_key%0#0", "box_prefixed_key%0#0 (copy)", "0" ] }, - "3669": { + "3737": { "op": "pushint 2", "defined_out": [ "0", @@ -32474,7 +32705,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -32483,14 +32713,14 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "box_prefixed_key%0#0", "box_prefixed_key%0#0 (copy)", "0", "2" ] }, - "3671": { + "3739": { "op": "box_extract", "defined_out": [ "box%box_extract%0#0", @@ -32500,7 +32730,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -32509,12 +32738,12 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "box_prefixed_key%0#0", "box%box_extract%0#0" ] }, - "3672": { + "3740": { "op": "btoi", "defined_out": [ "box%array_length%0#0", @@ -32524,7 +32753,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -32533,12 +32761,12 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "box_prefixed_key%0#0", "box%array_length%0#0" ] }, - "3673": { + "3741": { "op": "dup", "defined_out": [ "box%array_length%0#0", @@ -32549,7 +32777,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -32558,19 +32785,18 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "box_prefixed_key%0#0", "box%array_length%0#0", "box%array_length%0#0 (copy)" ] }, - "3674": { + "3742": { "error": "Invalid schedule page", "op": "assert // Invalid schedule page", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -32579,17 +32805,16 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "box_prefixed_key%0#0", "box%array_length%0#0" ] }, - "3675": { + "3743": { "op": "intc_1 // 1", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -32598,13 +32823,13 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "box_prefixed_key%0#0", "box%array_length%0#0", "1" ] }, - "3676": { + "3744": { "op": "-", "defined_out": [ "box_prefixed_key%0#0", @@ -32614,7 +32839,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -32623,12 +32847,12 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "box_prefixed_key%0#0", "tmp%21#0" ] }, - "3677": { + "3745": { "op": "pushint 65", "defined_out": [ "65", @@ -32639,7 +32863,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -32648,13 +32871,13 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "box_prefixed_key%0#0", "tmp%21#0", "65" ] }, - "3679": { + "3747": { "op": "*", "defined_out": [ "box%element_offset%0#0", @@ -32664,7 +32887,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -32673,17 +32895,16 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "box_prefixed_key%0#0", "box%element_offset%0#0" ] }, - "3680": { + "3748": { "op": "pushint 2", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -32692,13 +32913,13 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "box_prefixed_key%0#0", "box%element_offset%0#0", "2" ] }, - "3682": { + "3750": { "op": "+", "defined_out": [ "box%offset%0#0", @@ -32708,7 +32929,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -32717,17 +32937,16 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "box_prefixed_key%0#0", "box%offset%0#0" ] }, - "3683": { + "3751": { "op": "pushint 65", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -32736,13 +32955,13 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "box_prefixed_key%0#0", "box%offset%0#0", "65" ] }, - "3685": { + "3753": { "op": "box_extract", "defined_out": [ "previous_entry#0", @@ -32751,7 +32970,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -32760,19 +32978,18 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "previous_entry#0" ] }, - "3686": { - "op": "b contract_schedule_after_if_else@11" + "3754": { + "op": "b contract_schedule_after_if_else@7" }, - "3689": { - "block": "contract_schedule_after_while@15", + "3757": { + "block": "contract_schedule_after_while@11", "stack_in": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -32781,7 +32998,7 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0" + "index#0" ], "op": "dig 6", "defined_out": [ @@ -32790,7 +33007,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -32799,11 +33015,11 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "schedule_page_index#0" ] }, - "3691": { + "3759": { "op": "itob", "defined_out": [ "encoded_value%0#0", @@ -32812,7 +33028,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -32821,12 +33036,12 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "encoded_value%0#0" ] }, - "3692": { - "op": "bytec 31 // 0x5323", + "3760": { + "op": "bytec 24 // 0x5323", "defined_out": [ "0x5323", "encoded_value%0#0", @@ -32835,7 +33050,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -32844,17 +33058,16 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "encoded_value%0#0", "0x5323" ] }, - "3694": { + "3762": { "op": "swap", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -32863,12 +33076,12 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "0x5323", "encoded_value%0#0" ] }, - "3695": { + "3763": { "op": "concat", "defined_out": [ "box_prefixed_key%0#0", @@ -32877,7 +33090,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -32886,11 +33098,11 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "box_prefixed_key%0#0" ] }, - "3696": { + "3764": { "op": "dup", "defined_out": [ "box_prefixed_key%0#0", @@ -32900,7 +33112,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -32909,12 +33120,12 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "box_prefixed_key%0#0", "box_prefixed_key%0#0 (copy)" ] }, - "3697": { + "3765": { "op": "box_del", "defined_out": [ "box_prefixed_key%0#0", @@ -32924,7 +33135,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -32933,17 +33143,16 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "box_prefixed_key%0#0", "{box_del}" ] }, - "3698": { + "3766": { "op": "pop", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -32952,11 +33161,11 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "box_prefixed_key%0#0" ] }, - "3699": { + "3767": { "op": "dig 5", "defined_out": [ "box_prefixed_key%0#0", @@ -32966,7 +33175,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -32975,17 +33183,16 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "box_prefixed_key%0#0", "schedule_page#0" ] }, - "3701": { + "3769": { "op": "box_put", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -32994,10 +33201,10 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0" + "index#0" ] }, - "3702": { + "3770": { "op": "dig 5", "defined_out": [ "is_last_page#0", @@ -33007,7 +33214,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -33016,16 +33222,15 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "is_last_page#0" ] }, - "3704": { - "op": "bz contract_schedule_after_if_else@17", + "3772": { + "op": "bz contract_schedule_after_if_else@13", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -33034,10 +33239,10 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0" + "index#0" ] }, - "3707": { + "3775": { "op": "dig 1", "defined_out": [ "is_last_page#0", @@ -33048,7 +33253,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -33057,11 +33261,11 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "page_cursor#0" ] }, - "3709": { + "3777": { "op": "dig 4", "defined_out": [ "is_last_page#0", @@ -33073,7 +33277,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -33082,12 +33285,12 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "page_cursor#0", "page_length#0" ] }, - "3711": { + "3779": { "op": "+", "defined_out": [ "is_last_page#0", @@ -33100,7 +33303,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -33109,12 +33311,12 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "tmp%27#0" ] }, - "3712": { - "op": "bytec 4 // \"schedule_entry_count\"", + "3780": { + "op": "bytec_3 // \"schedule_entry_count\"", "defined_out": [ "\"schedule_entry_count\"", "is_last_page#0", @@ -33127,7 +33329,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -33136,17 +33337,16 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "tmp%27#0", "\"schedule_entry_count\"" ] }, - "3714": { + "3781": { "op": "swap", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -33155,17 +33355,16 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "\"schedule_entry_count\"", "tmp%27#0" ] }, - "3715": { + "3782": { "op": "app_global_put", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -33174,10 +33373,10 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0" + "index#0" ] }, - "3716": { + "3783": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"", @@ -33190,7 +33389,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -33199,11 +33397,11 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "\"status\"" ] }, - "3717": { + "3784": { "op": "pushint 50", "defined_out": [ "\"status\"", @@ -33217,7 +33415,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -33226,17 +33423,16 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "\"status\"", "50" ] }, - "3719": { + "3786": { "op": "app_global_put", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -33245,15 +33441,14 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0" + "index#0" ] }, - "3720": { - "block": "contract_schedule_after_if_else@17", + "3787": { + "block": "contract_schedule_after_if_else@13", "stack_in": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -33262,7 +33457,7 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0" + "index#0" ], "op": "global LatestTimestamp", "defined_out": [ @@ -33271,7 +33466,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -33280,11 +33474,11 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "tmp%0#1" ] }, - "3722": { + "3789": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0" @@ -33292,7 +33486,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -33301,11 +33494,11 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "aggregate%val_as_bytes%0#0" ] }, - "3723": { + "3790": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -33314,7 +33507,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -33323,17 +33515,16 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "aggregate%val_as_bytes%0#0", "0x151f7c75" ] }, - "3724": { + "3791": { "op": "swap", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -33342,12 +33533,12 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "0x151f7c75", "aggregate%val_as_bytes%0#0" ] }, - "3725": { + "3792": { "op": "concat", "defined_out": [ "tmp%7#0" @@ -33355,7 +33546,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -33364,16 +33554,15 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "tmp%7#0" ] }, - "3726": { + "3793": { "op": "log", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -33382,10 +33571,10 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0" + "index#0" ] }, - "3727": { + "3794": { "op": "intc_1 // 1", "defined_out": [ "1" @@ -33393,7 +33582,6 @@ "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -33402,16 +33590,15 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0", + "index#0", "1" ] }, - "3728": { + "3795": { "op": "return", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0", - "index#0", "values%0#0", "values%1#0", "schedule_page_index#0", @@ -33420,10 +33607,10 @@ "page_length#0", "contract_type#0", "page_cursor#0", - "required_budget_with_buffer#0" + "index#0" ] }, - "3729": { + "3796": { "subroutine": "modules.actus_kernel.ActusKernelModule.contract_execute_ied[routing]", "params": {}, "block": "contract_execute_ied", @@ -33436,7 +33623,7 @@ "0" ] }, - "3730": { + "3797": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"", @@ -33447,7 +33634,7 @@ "\"status\"" ] }, - "3731": { + "3798": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -33458,37 +33645,37 @@ "maybe_exists%0#0" ] }, - "3732": { + "3799": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ "maybe_value%0#0" ] }, - "3733": { + "3800": { "error": "D-ASA not configured", "op": "assert // D-ASA not configured", "stack_out": [] }, - "3734": { + "3801": { "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", "op": "callsub _assert_caller_is_arranger" }, - "3737": { + "3804": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", "op": "callsub _assert_is_not_asset_defaulted" }, - "3740": { + "3807": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_suspended", "op": "callsub _assert_is_not_asset_suspended" }, - "3743": { + "3810": { "op": "intc_0 // 0", "stack_out": [ "0" ] }, - "3744": { + "3811": { "op": "bytec_2 // \"event_cursor\"", "defined_out": [ "\"event_cursor\"", @@ -33499,29 +33686,29 @@ "\"event_cursor\"" ] }, - "3745": { + "3812": { "op": "app_global_get_ex", "stack_out": [ "maybe_value%0#0", "maybe_exists%0#0" ] }, - "3746": { + "3813": { "error": "check self.event_cursor exists", "op": "assert // check self.event_cursor exists", "stack_out": [ "maybe_value%0#0" ] }, - "3747": { + "3814": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#0", "0" ] }, - "3748": { - "op": "bytec 4 // \"schedule_entry_count\"", + "3815": { + "op": "bytec_3 // \"schedule_entry_count\"", "defined_out": [ "\"schedule_entry_count\"", "0", @@ -33533,7 +33720,7 @@ "\"schedule_entry_count\"" ] }, - "3750": { + "3816": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%1#0", @@ -33546,7 +33733,7 @@ "maybe_exists%1#0" ] }, - "3751": { + "3817": { "error": "check self.schedule_entry_count exists", "op": "assert // check self.schedule_entry_count exists", "stack_out": [ @@ -33554,7 +33741,7 @@ "maybe_value%1#0" ] }, - "3752": { + "3818": { "op": "dig 1", "defined_out": [ "maybe_value%0#0", @@ -33567,7 +33754,7 @@ "maybe_value%0#0 (copy)" ] }, - "3754": { + "3820": { "op": ">", "defined_out": [ "maybe_value%0#0", @@ -33578,14 +33765,14 @@ "tmp%0#1" ] }, - "3755": { + "3821": { "error": "Invalid event cursor", "op": "assert // Invalid event cursor", "stack_out": [ "maybe_value%0#0" ] }, - "3756": { + "3822": { "callsub": "modules.actus_kernel.ActusKernelModule._get_schedule_entry", "op": "callsub _get_schedule_entry", "defined_out": [ @@ -33595,7 +33782,7 @@ "entry#0" ] }, - "3759": { + "3825": { "op": "dup", "defined_out": [ "entry#0", @@ -33606,7 +33793,7 @@ "entry#0 (copy)" ] }, - "3760": { + "3826": { "op": "extract 8 1", "defined_out": [ "aggregate%extract%0#0", @@ -33617,7 +33804,7 @@ "aggregate%extract%0#0" ] }, - "3763": { + "3829": { "op": "dup", "defined_out": [ "aggregate%extract%0#0", @@ -33630,7 +33817,7 @@ "aggregate%extract%0#0 (copy)" ] }, - "3764": { + "3830": { "op": "pushbytes 0x01", "defined_out": [ "0x01", @@ -33645,7 +33832,7 @@ "0x01" ] }, - "3767": { + "3833": { "op": "b==", "defined_out": [ "aggregate%extract%0#0", @@ -33658,7 +33845,7 @@ "tmp%2#1" ] }, - "3768": { + "3834": { "error": "Invalid event type", "op": "assert // Invalid event type", "stack_out": [ @@ -33666,7 +33853,7 @@ "aggregate%extract%0#0" ] }, - "3769": { + "3835": { "op": "dig 1", "stack_out": [ "entry#0", @@ -33674,7 +33861,7 @@ "entry#0 (copy)" ] }, - "3771": { + "3837": { "op": "extract 0 8", "defined_out": [ "aggregate%extract%0#0", @@ -33687,7 +33874,7 @@ "aggregate%extract%1#0" ] }, - "3774": { + "3840": { "op": "dig 2", "stack_out": [ "entry#0", @@ -33696,7 +33883,7 @@ "entry#0 (copy)" ] }, - "3776": { + "3842": { "op": "extract 9 8", "defined_out": [ "aggregate%extract%0#0", @@ -33711,7 +33898,7 @@ "aggregate%extract%2#0" ] }, - "3779": { + "3845": { "op": "dig 3", "stack_out": [ "entry#0", @@ -33721,7 +33908,7 @@ "entry#0 (copy)" ] }, - "3781": { + "3847": { "op": "extract 17 8", "defined_out": [ "aggregate%extract%0#0", @@ -33738,7 +33925,7 @@ "aggregate%extract%3#0" ] }, - "3784": { + "3850": { "op": "dig 4", "stack_out": [ "entry#0", @@ -33749,7 +33936,7 @@ "entry#0 (copy)" ] }, - "3786": { + "3852": { "op": "extract 25 8", "defined_out": [ "aggregate%extract%0#0", @@ -33768,7 +33955,7 @@ "aggregate%extract%4#0" ] }, - "3789": { + "3855": { "op": "dig 5", "stack_out": [ "entry#0", @@ -33780,7 +33967,7 @@ "entry#0 (copy)" ] }, - "3791": { + "3857": { "op": "extract 33 8", "defined_out": [ "aggregate%extract%0#0", @@ -33801,7 +33988,7 @@ "aggregate%extract%5#0" ] }, - "3794": { + "3860": { "op": "dig 6", "stack_out": [ "entry#0", @@ -33814,7 +34001,7 @@ "entry#0 (copy)" ] }, - "3796": { + "3862": { "op": "extract 41 8", "defined_out": [ "aggregate%extract%0#0", @@ -33837,7 +34024,7 @@ "aggregate%extract%6#0" ] }, - "3799": { + "3865": { "op": "dig 7", "stack_out": [ "entry#0", @@ -33851,7 +34038,7 @@ "entry#0 (copy)" ] }, - "3801": { + "3867": { "op": "extract 49 8", "defined_out": [ "aggregate%extract%0#0", @@ -33876,7 +34063,7 @@ "aggregate%extract%7#0" ] }, - "3804": { + "3870": { "op": "dig 8", "stack_out": [ "entry#0", @@ -33891,7 +34078,7 @@ "entry#0 (copy)" ] }, - "3806": { + "3872": { "op": "extract 57 8", "defined_out": [ "aggregate%extract%0#0", @@ -33918,7 +34105,7 @@ "aggregate%extract%8#0" ] }, - "3809": { + "3875": { "op": "uncover 7", "stack_out": [ "entry#0", @@ -33933,7 +34120,7 @@ "aggregate%extract%1#0" ] }, - "3811": { + "3877": { "op": "uncover 8", "stack_out": [ "entry#0", @@ -33948,7 +34135,7 @@ "aggregate%extract%0#0" ] }, - "3813": { + "3879": { "op": "concat", "defined_out": [ "aggregate%extract%2#0", @@ -33973,7 +34160,7 @@ "aggregate%head%1#0" ] }, - "3814": { + "3880": { "op": "uncover 7", "stack_out": [ "entry#0", @@ -33987,7 +34174,7 @@ "aggregate%extract%2#0" ] }, - "3816": { + "3882": { "op": "concat", "defined_out": [ "aggregate%extract%3#0", @@ -34010,7 +34197,7 @@ "aggregate%head%2#0" ] }, - "3817": { + "3883": { "op": "uncover 6", "stack_out": [ "entry#0", @@ -34023,7 +34210,7 @@ "aggregate%extract%3#0" ] }, - "3819": { + "3885": { "op": "concat", "defined_out": [ "aggregate%extract%4#0", @@ -34044,7 +34231,7 @@ "aggregate%head%3#0" ] }, - "3820": { + "3886": { "op": "uncover 5", "stack_out": [ "entry#0", @@ -34056,7 +34243,7 @@ "aggregate%extract%4#0" ] }, - "3822": { + "3888": { "op": "concat", "defined_out": [ "aggregate%extract%5#0", @@ -34075,7 +34262,7 @@ "aggregate%head%4#0" ] }, - "3823": { + "3889": { "op": "intc_0 // 0", "stack_out": [ "entry#0", @@ -34087,7 +34274,7 @@ "0" ] }, - "3824": { + "3890": { "op": "itob", "defined_out": [ "aggregate%extract%5#0", @@ -34108,7 +34295,7 @@ "aggregate%val_as_bytes%4#0" ] }, - "3825": { + "3891": { "op": "concat", "defined_out": [ "aggregate%extract%5#0", @@ -34127,7 +34314,7 @@ "aggregate%head%5#0" ] }, - "3826": { + "3892": { "op": "uncover 4", "stack_out": [ "entry#0", @@ -34138,7 +34325,7 @@ "aggregate%extract%5#0" ] }, - "3828": { + "3894": { "op": "concat", "defined_out": [ "aggregate%extract%6#0", @@ -34155,7 +34342,7 @@ "aggregate%head%6#0" ] }, - "3829": { + "3895": { "op": "uncover 3", "stack_out": [ "entry#0", @@ -34165,7 +34352,7 @@ "aggregate%extract%6#0" ] }, - "3831": { + "3897": { "op": "concat", "defined_out": [ "aggregate%extract%7#0", @@ -34180,7 +34367,7 @@ "aggregate%head%7#0" ] }, - "3832": { + "3898": { "op": "uncover 2", "stack_out": [ "entry#0", @@ -34189,7 +34376,7 @@ "aggregate%extract%7#0" ] }, - "3834": { + "3900": { "op": "concat", "defined_out": [ "aggregate%extract%8#0", @@ -34202,7 +34389,7 @@ "aggregate%head%8#0" ] }, - "3835": { + "3901": { "op": "swap", "stack_out": [ "entry#0", @@ -34210,7 +34397,7 @@ "aggregate%extract%8#0" ] }, - "3836": { + "3902": { "op": "concat", "defined_out": [ "aggregate%head%9#0", @@ -34221,7 +34408,7 @@ "aggregate%head%9#0" ] }, - "3837": { + "3903": { "callsub": "modules.actus_kernel.ActusKernelModule._apply_non_cash_schedule_entry", "op": "callsub _apply_non_cash_schedule_entry", "defined_out": [ @@ -34233,11 +34420,11 @@ "_apply_non_cash_schedule_entry%1#0" ] }, - "3840": { + "3906": { "op": "popn 2", "stack_out": [] }, - "3842": { + "3908": { "op": "global LatestTimestamp", "defined_out": [ "tmp%4#0" @@ -34246,7 +34433,7 @@ "tmp%4#0" ] }, - "3844": { + "3910": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%9#0" @@ -34255,7 +34442,7 @@ "aggregate%val_as_bytes%9#0" ] }, - "3845": { + "3911": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -34266,14 +34453,14 @@ "0x151f7c75" ] }, - "3846": { + "3912": { "op": "swap", "stack_out": [ "0x151f7c75", "aggregate%val_as_bytes%9#0" ] }, - "3847": { + "3913": { "op": "concat", "defined_out": [ "tmp%2#0" @@ -34282,11 +34469,11 @@ "tmp%2#0" ] }, - "3848": { + "3914": { "op": "log", "stack_out": [] }, - "3849": { + "3915": { "op": "intc_1 // 1", "defined_out": [ "1" @@ -34295,11 +34482,11 @@ "1" ] }, - "3850": { + "3916": { "op": "return", "stack_out": [] }, - "3851": { + "3917": { "subroutine": "modules.actus_kernel.ActusKernelModule.apply_non_cash_event[routing]", "params": {}, "block": "apply_non_cash_event", @@ -34309,7 +34496,7 @@ "aggregate%extract%2#0" ] }, - "3852": { + "3918": { "op": "dupn 4", "stack_out": [ "aggregate%extract%2#0", @@ -34319,7 +34506,7 @@ "page#0" ] }, - "3854": { + "3920": { "op": "pushbytes \"\"", "stack_out": [ "aggregate%extract%2#0", @@ -34330,7 +34517,7 @@ "event_type#0" ] }, - "3856": { + "3922": { "op": "dup", "stack_out": [ "aggregate%extract%2#0", @@ -34342,7 +34529,7 @@ "values%0#1" ] }, - "3857": { + "3923": { "op": "txna ApplicationArgs 1", "defined_out": [ "tmp%0#0" @@ -34358,7 +34545,7 @@ "tmp%0#0" ] }, - "3860": { + "3926": { "op": "dup", "defined_out": [ "tmp%0#0", @@ -34376,7 +34563,7 @@ "tmp%0#0 (copy)" ] }, - "3861": { + "3927": { "op": "len", "defined_out": [ "len%0#0", @@ -34394,7 +34581,7 @@ "len%0#0" ] }, - "3862": { + "3928": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -34414,7 +34601,7 @@ "8" ] }, - "3863": { + "3929": { "op": "==", "defined_out": [ "eq%0#0", @@ -34432,7 +34619,7 @@ "eq%0#0" ] }, - "3864": { + "3930": { "error": "invalid number of bytes for arc4.uint64", "op": "assert // invalid number of bytes for arc4.uint64", "stack_out": [ @@ -34446,7 +34633,7 @@ "tmp%0#0" ] }, - "3865": { + "3931": { "op": "btoi", "defined_out": [ "event_id#0" @@ -34462,10 +34649,10 @@ "event_id#0" ] }, - "3866": { + "3932": { "op": "txna ApplicationArgs 2" }, - "3869": { + "3935": { "op": "dupn 2", "defined_out": [ "event_id#0", @@ -34486,7 +34673,7 @@ "payload#0 (copy)" ] }, - "3871": { + "3937": { "op": "len", "defined_out": [ "event_id#0", @@ -34507,7 +34694,7 @@ "len%1#0" ] }, - "3872": { + "3938": { "op": "pushint 73", "defined_out": [ "73", @@ -34530,7 +34717,7 @@ "73" ] }, - "3874": { + "3940": { "op": "==", "defined_out": [ "eq%1#0", @@ -34551,7 +34738,7 @@ "eq%1#0" ] }, - "3875": { + "3941": { "error": "invalid number of bytes for smart_contracts.abi_types.ObservedEventRequest", "op": "assert // invalid number of bytes for smart_contracts.abi_types.ObservedEventRequest", "stack_out": [ @@ -34567,7 +34754,7 @@ "payload#0" ] }, - "3876": { + "3942": { "op": "intc_0 // 0", "stack_out": [ "aggregate%extract%2#0", @@ -34583,7 +34770,7 @@ "0" ] }, - "3877": { + "3943": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"", @@ -34606,7 +34793,7 @@ "\"status\"" ] }, - "3878": { + "3944": { "op": "app_global_get_ex", "defined_out": [ "event_id#0", @@ -34629,7 +34816,7 @@ "maybe_exists%0#0" ] }, - "3879": { + "3945": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ @@ -34646,7 +34833,7 @@ "maybe_value%0#0" ] }, - "3880": { + "3946": { "error": "D-ASA not configured", "op": "assert // D-ASA not configured", "stack_out": [ @@ -34662,15 +34849,15 @@ "payload#0" ] }, - "3881": { + "3947": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", "op": "callsub _assert_is_not_asset_defaulted" }, - "3884": { + "3950": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_suspended", "op": "callsub _assert_is_not_asset_suspended" }, - "3887": { + "3953": { "op": "pushint 65", "defined_out": [ "65", @@ -34691,7 +34878,7 @@ "65" ] }, - "3889": { + "3955": { "op": "extract_uint64", "defined_out": [ "event_id#0", @@ -34711,7 +34898,7 @@ "values%0#0" ] }, - "3890": { + "3956": { "op": "dup", "defined_out": [ "event_id#0", @@ -34732,7 +34919,7 @@ "values%0#0" ] }, - "3891": { + "3957": { "op": "pushint 4", "defined_out": [ "4", @@ -34755,7 +34942,7 @@ "4" ] }, - "3893": { + "3959": { "op": "&", "defined_out": [ "event_id#0", @@ -34777,7 +34964,7 @@ "tmp%0#1" ] }, - "3894": { + "3960": { "op": "bz apply_non_cash_event_after_if_else@3", "stack_out": [ "aggregate%extract%2#0", @@ -34792,7 +34979,7 @@ "values%0#0" ] }, - "3897": { + "3963": { "op": "intc_0 // 0", "stack_out": [ "aggregate%extract%2#0", @@ -34808,8 +34995,8 @@ "0" ] }, - "3898": { - "op": "bytec 12 // \"contract_type\"", + "3964": { + "op": "bytec 10 // \"contract_type\"", "defined_out": [ "\"contract_type\"", "0", @@ -34832,7 +35019,7 @@ "\"contract_type\"" ] }, - "3900": { + "3966": { "op": "app_global_get_ex", "stack_out": [ "aggregate%extract%2#0", @@ -34849,7 +35036,7 @@ "maybe_exists%0#0" ] }, - "3901": { + "3967": { "error": "check self.contract_type exists", "op": "assert // check self.contract_type exists", "stack_out": [ @@ -34866,7 +35053,7 @@ "maybe_value%0#0" ] }, - "3902": { + "3968": { "op": "pushint 5", "defined_out": [ "5", @@ -34890,7 +35077,7 @@ "5" ] }, - "3904": { + "3970": { "op": "==", "defined_out": [ "event_id#0", @@ -34912,7 +35099,7 @@ "tmp%0#3" ] }, - "3905": { + "3971": { "error": "Observed event required to execute this action", "op": "assert // Observed event required to execute this action", "stack_out": [ @@ -34928,11 +35115,11 @@ "values%0#0" ] }, - "3906": { + "3972": { "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", "op": "callsub _assert_caller_is_arranger" }, - "3909": { + "3975": { "op": "intc_0 // 0", "stack_out": [ "aggregate%extract%2#0", @@ -34948,8 +35135,8 @@ "0" ] }, - "3910": { - "op": "bytec 12 // \"contract_type\"", + "3976": { + "op": "bytec 10 // \"contract_type\"", "stack_out": [ "aggregate%extract%2#0", "aggregate%extract%9#0", @@ -34965,7 +35152,7 @@ "\"contract_type\"" ] }, - "3912": { + "3978": { "op": "app_global_get_ex", "stack_out": [ "aggregate%extract%2#0", @@ -34982,7 +35169,7 @@ "maybe_exists%0#0" ] }, - "3913": { + "3979": { "error": "check self.contract_type exists", "op": "assert // check self.contract_type exists", "stack_out": [ @@ -34999,7 +35186,7 @@ "maybe_value%0#0" ] }, - "3914": { + "3980": { "op": "dup", "defined_out": [ "event_id#0", @@ -35023,7 +35210,7 @@ "maybe_value%0#0 (copy)" ] }, - "3915": { + "3981": { "op": "pushint 5", "stack_out": [ "aggregate%extract%2#0", @@ -35041,7 +35228,7 @@ "5" ] }, - "3917": { + "3983": { "op": "==", "stack_out": [ "aggregate%extract%2#0", @@ -35058,7 +35245,7 @@ "tmp%0#3" ] }, - "3918": { + "3984": { "error": "Observed event required to execute this action", "op": "assert // Observed event required to execute this action", "stack_out": [ @@ -35075,7 +35262,7 @@ "maybe_value%0#0" ] }, - "3919": { + "3985": { "op": "dig 2", "stack_out": [ "aggregate%extract%2#0", @@ -35092,7 +35279,7 @@ "payload#0" ] }, - "3921": { + "3987": { "op": "dup", "stack_out": [ "aggregate%extract%2#0", @@ -35110,7 +35297,7 @@ "payload#0 (copy)" ] }, - "3922": { + "3988": { "op": "intc_0 // 0", "stack_out": [ "aggregate%extract%2#0", @@ -35129,7 +35316,7 @@ "0" ] }, - "3923": { + "3989": { "op": "extract_uint64", "defined_out": [ "event_id#0", @@ -35154,7 +35341,7 @@ "values%0#1" ] }, - "3924": { + "3990": { "op": "dup", "stack_out": [ "aggregate%extract%2#0", @@ -35173,7 +35360,7 @@ "values%0#1" ] }, - "3925": { + "3991": { "op": "bury 7", "defined_out": [ "event_id#0", @@ -35198,7 +35385,7 @@ "values%0#1" ] }, - "3927": { + "3993": { "op": "intc_0 // 0", "stack_out": [ "aggregate%extract%2#0", @@ -35217,8 +35404,8 @@ "0" ] }, - "3928": { - "op": "bytec 4 // \"schedule_entry_count\"", + "3994": { + "op": "bytec_3 // \"schedule_entry_count\"", "defined_out": [ "\"schedule_entry_count\"", "0", @@ -35246,7 +35433,7 @@ "\"schedule_entry_count\"" ] }, - "3930": { + "3995": { "op": "app_global_get_ex", "defined_out": [ "event_id#0", @@ -35275,7 +35462,7 @@ "maybe_exists%0#0" ] }, - "3931": { + "3996": { "error": "check self.schedule_entry_count exists", "op": "assert // check self.schedule_entry_count exists", "stack_out": [ @@ -35295,7 +35482,7 @@ "maybe_value%0#1" ] }, - "3932": { + "3997": { "op": "==", "defined_out": [ "event_id#0", @@ -35321,7 +35508,7 @@ "tmp%1#2" ] }, - "3933": { + "3998": { "error": "Invalid event id", "op": "assert // Invalid event id", "stack_out": [ @@ -35339,7 +35526,7 @@ "payload#0" ] }, - "3934": { + "3999": { "op": "dup", "stack_out": [ "aggregate%extract%2#0", @@ -35357,7 +35544,7 @@ "payload#0 (copy)" ] }, - "3935": { + "4000": { "op": "extract 8 1", "defined_out": [ "aggregate%extract%2#0", @@ -35383,7 +35570,7 @@ "aggregate%extract%2#0" ] }, - "3938": { + "4003": { "op": "bury 12", "defined_out": [ "aggregate%extract%2#0", @@ -35408,7 +35595,7 @@ "payload#0" ] }, - "3940": { + "4005": { "op": "intc_2 // 8", "stack_out": [ "aggregate%extract%2#0", @@ -35426,7 +35613,7 @@ "8" ] }, - "3941": { + "4006": { "op": "getbyte", "defined_out": [ "aggregate%extract%2#0", @@ -35452,7 +35639,7 @@ "tmp%2#3" ] }, - "3942": { + "4007": { "callsub": "modules.actus_kernel.ActusKernelModule._assert_event_allowed_for_contract_type", "op": "callsub _assert_event_allowed_for_contract_type", "stack_out": [ @@ -35468,7 +35655,7 @@ "values%0#0" ] }, - "3945": { + "4010": { "op": "intc_0 // 0", "stack_out": [ "aggregate%extract%2#0", @@ -35484,8 +35671,8 @@ "0" ] }, - "3946": { - "op": "bytec 4 // \"schedule_entry_count\"", + "4011": { + "op": "bytec_3 // \"schedule_entry_count\"", "stack_out": [ "aggregate%extract%2#0", "aggregate%extract%9#0", @@ -35501,7 +35688,7 @@ "\"schedule_entry_count\"" ] }, - "3948": { + "4012": { "op": "app_global_get_ex", "defined_out": [ "aggregate%extract%2#0", @@ -35527,7 +35714,7 @@ "maybe_exists%2#0" ] }, - "3949": { + "4013": { "error": "check self.schedule_entry_count exists", "op": "assert // check self.schedule_entry_count exists", "stack_out": [ @@ -35544,7 +35731,7 @@ "event_id#1" ] }, - "3950": { + "4014": { "op": "pushint 16", "defined_out": [ "16", @@ -35570,7 +35757,7 @@ "16" ] }, - "3952": { + "4016": { "op": "/", "defined_out": [ "aggregate%extract%2#0", @@ -35594,8 +35781,8 @@ "page_index#0" ] }, - "3953": { - "op": "pushbytes 0x0000", + "4017": { + "op": "bytec 48 // 0x0000", "defined_out": [ "aggregate%extract%2#0", "event_id#0", @@ -35620,7 +35807,7 @@ "page#0" ] }, - "3957": { + "4019": { "op": "bury 7", "stack_out": [ "aggregate%extract%2#0", @@ -35636,7 +35823,7 @@ "page_index#0" ] }, - "3959": { + "4021": { "op": "itob", "defined_out": [ "aggregate%extract%2#0", @@ -35661,8 +35848,8 @@ "encoded_value%0#0" ] }, - "3960": { - "op": "bytec 31 // 0x5323", + "4022": { + "op": "bytec 24 // 0x5323", "defined_out": [ "0x5323", "aggregate%extract%2#0", @@ -35688,7 +35875,7 @@ "0x5323" ] }, - "3962": { + "4024": { "op": "swap", "stack_out": [ "aggregate%extract%2#0", @@ -35705,7 +35892,7 @@ "encoded_value%0#0" ] }, - "3963": { + "4025": { "op": "concat", "defined_out": [ "aggregate%extract%2#0", @@ -35730,7 +35917,7 @@ "box_prefixed_key%0#0" ] }, - "3964": { + "4026": { "op": "dup", "stack_out": [ "aggregate%extract%2#0", @@ -35747,7 +35934,7 @@ "box_prefixed_key%0#0" ] }, - "3965": { + "4027": { "op": "bury 9", "defined_out": [ "aggregate%extract%2#0", @@ -35772,7 +35959,7 @@ "box_prefixed_key%0#0" ] }, - "3967": { + "4029": { "op": "box_len", "defined_out": [ "_%0#0", @@ -35800,7 +35987,7 @@ "maybe_exists%3#0" ] }, - "3968": { + "4030": { "op": "bury 1", "stack_out": [ "aggregate%extract%2#0", @@ -35816,7 +36003,7 @@ "maybe_exists%3#0" ] }, - "3970": { + "4032": { "op": "bz apply_non_cash_event_after_if_else@27", "stack_out": [ "aggregate%extract%2#0", @@ -35831,7 +36018,7 @@ "values%0#0" ] }, - "3973": { + "4035": { "op": "dig 7", "stack_out": [ "aggregate%extract%2#0", @@ -35847,7 +36034,7 @@ "box_prefixed_key%0#0" ] }, - "3975": { + "4037": { "op": "box_get", "defined_out": [ "aggregate%box_get%1#0", @@ -35874,7 +36061,7 @@ "aggregate%box_get%1#0" ] }, - "3976": { + "4038": { "op": "swap", "stack_out": [ "aggregate%extract%2#0", @@ -35891,7 +36078,7 @@ "page#0" ] }, - "3977": { + "4039": { "op": "bury 7", "stack_out": [ "aggregate%extract%2#0", @@ -35907,7 +36094,7 @@ "aggregate%box_get%1#0" ] }, - "3979": { + "4041": { "error": "check self.schedule_page entry exists", "op": "assert // check self.schedule_page entry exists", "stack_out": [ @@ -35923,7 +36110,7 @@ "values%0#0" ] }, - "3980": { + "4042": { "block": "apply_non_cash_event_after_if_else@27", "stack_in": [ "aggregate%extract%2#0", @@ -35955,7 +36142,7 @@ "page#0" ] }, - "3982": { + "4044": { "op": "dup", "defined_out": [ "page#0", @@ -35976,7 +36163,7 @@ "page#0 (copy)" ] }, - "3983": { + "4045": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -35999,7 +36186,7 @@ "0" ] }, - "3984": { + "4046": { "error": "invalid array length header", "op": "extract_uint16 // on error: invalid array length header", "defined_out": [ @@ -36021,7 +36208,7 @@ "aggregate%array_length%0#0" ] }, - "3985": { + "4047": { "op": "dup", "defined_out": [ "aggregate%array_length%0#0", @@ -36044,7 +36231,7 @@ "aggregate%array_length%0#0 (copy)" ] }, - "3986": { + "4048": { "op": "pushint 16", "defined_out": [ "16", @@ -36069,7 +36256,7 @@ "16" ] }, - "3988": { + "4050": { "op": "<", "defined_out": [ "aggregate%array_length%0#0", @@ -36092,7 +36279,7 @@ "tmp%5#2" ] }, - "3989": { + "4051": { "error": "Invalid schedule page", "op": "assert // Invalid schedule page", "stack_out": [ @@ -36110,7 +36297,7 @@ "aggregate%array_length%0#0" ] }, - "3990": { + "4052": { "op": "dig 3", "defined_out": [ "aggregate%array_length%0#0", @@ -36133,7 +36320,7 @@ "payload#0" ] }, - "3992": { + "4054": { "op": "dup", "defined_out": [ "aggregate%array_length%0#0", @@ -36158,7 +36345,7 @@ "payload#0 (copy)" ] }, - "3993": { + "4055": { "op": "extract 9 8", "defined_out": [ "aggregate%array_length%0#0", @@ -36183,7 +36370,7 @@ "aggregate%extract%3#0" ] }, - "3996": { + "4058": { "op": "dig 1", "stack_out": [ "aggregate%extract%2#0", @@ -36203,7 +36390,7 @@ "payload#0 (copy)" ] }, - "3998": { + "4060": { "op": "extract 17 8", "defined_out": [ "aggregate%array_length%0#0", @@ -36230,7 +36417,7 @@ "aggregate%extract%4#0" ] }, - "4001": { + "4063": { "op": "dig 2", "stack_out": [ "aggregate%extract%2#0", @@ -36251,7 +36438,7 @@ "payload#0 (copy)" ] }, - "4003": { + "4065": { "op": "extract 25 8", "defined_out": [ "aggregate%array_length%0#0", @@ -36280,7 +36467,7 @@ "aggregate%extract%5#0" ] }, - "4006": { + "4068": { "op": "dig 3", "stack_out": [ "aggregate%extract%2#0", @@ -36302,7 +36489,7 @@ "payload#0 (copy)" ] }, - "4008": { + "4070": { "op": "extract 41 8", "defined_out": [ "aggregate%array_length%0#0", @@ -36333,7 +36520,7 @@ "aggregate%extract%6#0" ] }, - "4011": { + "4073": { "op": "dig 4", "stack_out": [ "aggregate%extract%2#0", @@ -36356,7 +36543,7 @@ "payload#0 (copy)" ] }, - "4013": { + "4075": { "op": "extract 49 8", "defined_out": [ "aggregate%array_length%0#0", @@ -36389,7 +36576,7 @@ "aggregate%extract%7#0" ] }, - "4016": { + "4078": { "op": "uncover 5", "stack_out": [ "aggregate%extract%2#0", @@ -36412,7 +36599,7 @@ "payload#0" ] }, - "4018": { + "4080": { "op": "extract 57 8", "defined_out": [ "aggregate%array_length%0#0", @@ -36446,7 +36633,7 @@ "aggregate%extract%8#0" ] }, - "4021": { + "4083": { "op": "dig 11", "defined_out": [ "aggregate%array_length%0#0", @@ -36482,7 +36669,7 @@ "values%0#1" ] }, - "4023": { + "4085": { "op": "itob", "defined_out": [ "aggregate%array_length%0#0", @@ -36519,7 +36706,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "4024": { + "4086": { "op": "dig 18", "defined_out": [ "aggregate%array_length%0#0", @@ -36558,7 +36745,7 @@ "aggregate%extract%2#0" ] }, - "4026": { + "4088": { "op": "concat", "defined_out": [ "aggregate%array_length%0#0", @@ -36596,7 +36783,7 @@ "aggregate%head%1#0" ] }, - "4027": { + "4089": { "op": "uncover 6", "stack_out": [ "aggregate%extract%2#0", @@ -36620,7 +36807,7 @@ "aggregate%extract%3#0" ] }, - "4029": { + "4091": { "op": "concat", "defined_out": [ "aggregate%array_length%0#0", @@ -36656,7 +36843,7 @@ "aggregate%head%2#0" ] }, - "4030": { + "4092": { "op": "uncover 5", "stack_out": [ "aggregate%extract%2#0", @@ -36679,7 +36866,7 @@ "aggregate%extract%4#0" ] }, - "4032": { + "4094": { "op": "concat", "defined_out": [ "aggregate%array_length%0#0", @@ -36713,7 +36900,7 @@ "aggregate%head%3#0" ] }, - "4033": { + "4095": { "op": "uncover 4", "stack_out": [ "aggregate%extract%2#0", @@ -36735,7 +36922,7 @@ "aggregate%extract%5#0" ] }, - "4035": { + "4097": { "op": "concat", "defined_out": [ "aggregate%array_length%0#0", @@ -36767,7 +36954,7 @@ "aggregate%head%4#0" ] }, - "4036": { + "4098": { "op": "uncover 3", "stack_out": [ "aggregate%extract%2#0", @@ -36788,7 +36975,7 @@ "aggregate%extract%6#0" ] }, - "4038": { + "4100": { "op": "concat", "defined_out": [ "aggregate%array_length%0#0", @@ -36818,7 +37005,7 @@ "aggregate%head%5#0" ] }, - "4039": { + "4101": { "op": "uncover 2", "stack_out": [ "aggregate%extract%2#0", @@ -36838,7 +37025,7 @@ "aggregate%extract%7#0" ] }, - "4041": { + "4103": { "op": "concat", "defined_out": [ "aggregate%array_length%0#0", @@ -36866,7 +37053,7 @@ "aggregate%head%6#0" ] }, - "4042": { + "4104": { "op": "swap", "stack_out": [ "aggregate%extract%2#0", @@ -36885,7 +37072,7 @@ "aggregate%extract%8#0" ] }, - "4043": { + "4105": { "op": "concat", "defined_out": [ "aggregate%array_length%0#0", @@ -36911,7 +37098,7 @@ "aggregate%head%7#0" ] }, - "4044": { + "4106": { "op": "dig 3", "defined_out": [ "aggregate%array_length%0#0", @@ -36939,7 +37126,7 @@ "values%0#0" ] }, - "4046": { + "4108": { "op": "itob", "defined_out": [ "aggregate%array_length%0#0", @@ -36968,7 +37155,7 @@ "aggregate%val_as_bytes%7#0" ] }, - "4047": { + "4109": { "op": "concat", "defined_out": [ "aggregate%array_length%0#0", @@ -36995,7 +37182,7 @@ "aggregate%head%8#0" ] }, - "4048": { + "4110": { "op": "uncover 2", "stack_out": [ "aggregate%extract%2#0", @@ -37013,7 +37200,7 @@ "page#0" ] }, - "4050": { + "4112": { "op": "swap", "stack_out": [ "aggregate%extract%2#0", @@ -37031,7 +37218,7 @@ "aggregate%head%8#0" ] }, - "4051": { + "4113": { "error": "max array length exceeded", "op": "concat // on error: max array length exceeded", "defined_out": [ @@ -37058,7 +37245,7 @@ "concat%0#0" ] }, - "4052": { + "4114": { "op": "swap", "stack_out": [ "aggregate%extract%2#0", @@ -37075,7 +37262,7 @@ "aggregate%array_length%0#0" ] }, - "4053": { + "4115": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -37103,7 +37290,7 @@ "1" ] }, - "4054": { + "4116": { "op": "+", "defined_out": [ "add%0#0", @@ -37129,7 +37316,7 @@ "add%0#0" ] }, - "4055": { + "4117": { "op": "itob", "defined_out": [ "aggregate%extract%2#0", @@ -37155,7 +37342,7 @@ "as_bytes%0#0" ] }, - "4056": { + "4118": { "op": "extract 6 2", "defined_out": [ "aggregate%extract%2#0", @@ -37181,7 +37368,7 @@ "as_u16_bytes%0#0" ] }, - "4059": { + "4121": { "op": "replace2 0", "stack_out": [ "aggregate%extract%2#0", @@ -37197,7 +37384,7 @@ "page#0" ] }, - "4061": { + "4123": { "op": "dig 8", "defined_out": [ "aggregate%extract%2#0", @@ -37222,7 +37409,7 @@ "box_prefixed_key%0#0" ] }, - "4063": { + "4125": { "op": "dup", "defined_out": [ "aggregate%extract%2#0", @@ -37249,7 +37436,7 @@ "box_prefixed_key%0#0 (copy)" ] }, - "4064": { + "4126": { "op": "box_del", "defined_out": [ "aggregate%extract%2#0", @@ -37276,7 +37463,7 @@ "{box_del}" ] }, - "4065": { + "4127": { "op": "pop", "stack_out": [ "aggregate%extract%2#0", @@ -37293,7 +37480,7 @@ "box_prefixed_key%0#0" ] }, - "4066": { + "4128": { "op": "swap", "stack_out": [ "aggregate%extract%2#0", @@ -37310,7 +37497,7 @@ "page#0" ] }, - "4067": { + "4129": { "op": "box_put", "stack_out": [ "aggregate%extract%2#0", @@ -37325,7 +37512,7 @@ "values%0#0" ] }, - "4068": { + "4130": { "op": "intc_0 // 0", "stack_out": [ "aggregate%extract%2#0", @@ -37341,8 +37528,8 @@ "0" ] }, - "4069": { - "op": "bytec 4 // \"schedule_entry_count\"", + "4131": { + "op": "bytec_3 // \"schedule_entry_count\"", "defined_out": [ "\"schedule_entry_count\"", "0", @@ -37368,7 +37555,7 @@ "\"schedule_entry_count\"" ] }, - "4071": { + "4132": { "op": "app_global_get_ex", "defined_out": [ "aggregate%extract%2#0", @@ -37395,7 +37582,7 @@ "maybe_exists%4#0" ] }, - "4072": { + "4133": { "error": "check self.schedule_entry_count exists", "op": "assert // check self.schedule_entry_count exists", "stack_out": [ @@ -37412,7 +37599,7 @@ "maybe_value%3#0" ] }, - "4073": { + "4134": { "op": "intc_1 // 1", "stack_out": [ "aggregate%extract%2#0", @@ -37429,7 +37616,7 @@ "1" ] }, - "4074": { + "4135": { "op": "+", "defined_out": [ "aggregate%extract%2#0", @@ -37454,8 +37641,8 @@ "tmp%8#0" ] }, - "4075": { - "op": "bytec 4 // \"schedule_entry_count\"", + "4136": { + "op": "bytec_3 // \"schedule_entry_count\"", "stack_out": [ "aggregate%extract%2#0", "aggregate%extract%9#0", @@ -37471,7 +37658,7 @@ "\"schedule_entry_count\"" ] }, - "4077": { + "4137": { "op": "swap", "stack_out": [ "aggregate%extract%2#0", @@ -37488,7 +37675,7 @@ "tmp%8#0" ] }, - "4078": { + "4138": { "op": "app_global_put", "stack_out": [ "aggregate%extract%2#0", @@ -37503,7 +37690,7 @@ "values%0#0" ] }, - "4079": { + "4139": { "block": "apply_non_cash_event_after_if_else@3", "stack_in": [ "aggregate%extract%2#0", @@ -37535,7 +37722,7 @@ "0" ] }, - "4080": { + "4140": { "op": "bytec_2 // \"event_cursor\"", "defined_out": [ "\"event_cursor\"", @@ -37556,7 +37743,7 @@ "\"event_cursor\"" ] }, - "4081": { + "4141": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -37577,7 +37764,7 @@ "maybe_exists%0#0" ] }, - "4082": { + "4142": { "error": "check self.event_cursor exists", "op": "assert // check self.event_cursor exists", "stack_out": [ @@ -37594,7 +37781,7 @@ "maybe_value%0#0" ] }, - "4083": { + "4143": { "op": "dig 3", "defined_out": [ "event_id#0", @@ -37615,10 +37802,10 @@ "event_id#0" ] }, - "4085": { + "4145": { "op": "dup" }, - "4086": { + "4146": { "op": "uncover 2", "defined_out": [ "event_id#0", @@ -37641,7 +37828,7 @@ "maybe_value%0#0" ] }, - "4088": { + "4148": { "op": "==", "defined_out": [ "event_id#0", @@ -37662,7 +37849,7 @@ "tmp%3#1" ] }, - "4089": { + "4149": { "error": "Invalid event cursor", "op": "assert // Invalid event cursor", "stack_out": [ @@ -37679,7 +37866,7 @@ "event_id#0" ] }, - "4090": { + "4150": { "callsub": "modules.actus_kernel.ActusKernelModule._get_schedule_entry", "op": "callsub _get_schedule_entry", "defined_out": [ @@ -37700,7 +37887,7 @@ "entry#0" ] }, - "4093": { + "4153": { "op": "dup", "stack_out": [ "aggregate%extract%2#0", @@ -37717,7 +37904,7 @@ "entry#0" ] }, - "4094": { + "4154": { "op": "bury 8", "defined_out": [ "entry#0", @@ -37737,7 +37924,7 @@ "entry#0" ] }, - "4096": { + "4156": { "op": "dup", "defined_out": [ "entry#0", @@ -37759,7 +37946,7 @@ "entry#0 (copy)" ] }, - "4097": { + "4157": { "op": "extract 8 1", "defined_out": [ "aggregate%extract%9#0", @@ -37781,7 +37968,7 @@ "aggregate%extract%9#0" ] }, - "4100": { + "4160": { "op": "bury 10", "defined_out": [ "aggregate%extract%9#0", @@ -37802,7 +37989,7 @@ "entry#0" ] }, - "4102": { + "4162": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -37825,7 +38012,7 @@ "8" ] }, - "4103": { + "4163": { "op": "getbyte", "defined_out": [ "aggregate%extract%9#0", @@ -37847,7 +38034,7 @@ "event_type#0" ] }, - "4104": { + "4164": { "op": "dup", "stack_out": [ "aggregate%extract%2#0", @@ -37864,7 +38051,7 @@ "event_type#0" ] }, - "4105": { + "4165": { "op": "bury 6", "defined_out": [ "aggregate%extract%9#0", @@ -37886,7 +38073,7 @@ "event_type#0" ] }, - "4107": { + "4167": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -37910,7 +38097,7 @@ "1" ] }, - "4108": { + "4168": { "op": "==", "defined_out": [ "aggregate%extract%9#0", @@ -37933,7 +38120,7 @@ "tmp%0#3" ] }, - "4109": { + "4169": { "op": "bnz apply_non_cash_event_bool_true@15", "stack_out": [ "aggregate%extract%2#0", @@ -37948,7 +38135,7 @@ "values%0#0" ] }, - "4112": { + "4172": { "op": "dig 4", "stack_out": [ "aggregate%extract%2#0", @@ -37964,7 +38151,7 @@ "event_type#0" ] }, - "4114": { + "4174": { "op": "pushint 4", "defined_out": [ "4", @@ -37988,7 +38175,7 @@ "4" ] }, - "4116": { + "4176": { "op": "==", "defined_out": [ "aggregate%extract%9#0", @@ -38011,7 +38198,7 @@ "tmp%1#2" ] }, - "4117": { + "4177": { "op": "bnz apply_non_cash_event_bool_true@15", "stack_out": [ "aggregate%extract%2#0", @@ -38026,7 +38213,7 @@ "values%0#0" ] }, - "4120": { + "4180": { "op": "dig 4", "stack_out": [ "aggregate%extract%2#0", @@ -38042,7 +38229,7 @@ "event_type#0" ] }, - "4122": { + "4182": { "op": "pushint 12", "defined_out": [ "12", @@ -38066,7 +38253,7 @@ "12" ] }, - "4124": { + "4184": { "op": "==", "defined_out": [ "aggregate%extract%9#0", @@ -38089,7 +38276,7 @@ "tmp%2#2" ] }, - "4125": { + "4185": { "op": "bnz apply_non_cash_event_bool_true@15", "stack_out": [ "aggregate%extract%2#0", @@ -38104,7 +38291,7 @@ "values%0#0" ] }, - "4128": { + "4188": { "op": "dig 4", "stack_out": [ "aggregate%extract%2#0", @@ -38120,7 +38307,7 @@ "event_type#0" ] }, - "4130": { + "4190": { "op": "pushint 11", "defined_out": [ "11", @@ -38144,7 +38331,7 @@ "11" ] }, - "4132": { + "4192": { "op": "==", "stack_out": [ "aggregate%extract%2#0", @@ -38160,7 +38347,7 @@ "tmp%3#1" ] }, - "4133": { + "4193": { "op": "bnz apply_non_cash_event_bool_true@15", "stack_out": [ "aggregate%extract%2#0", @@ -38175,7 +38362,7 @@ "values%0#0" ] }, - "4136": { + "4196": { "op": "dig 4", "stack_out": [ "aggregate%extract%2#0", @@ -38191,7 +38378,7 @@ "event_type#0" ] }, - "4138": { + "4198": { "op": "pushint 18", "defined_out": [ "18", @@ -38215,7 +38402,7 @@ "18" ] }, - "4140": { + "4200": { "op": "==", "defined_out": [ "aggregate%extract%9#0", @@ -38238,7 +38425,7 @@ "tmp%4#1" ] }, - "4141": { + "4201": { "op": "bnz apply_non_cash_event_bool_true@15", "stack_out": [ "aggregate%extract%2#0", @@ -38253,7 +38440,7 @@ "values%0#0" ] }, - "4144": { + "4204": { "op": "dig 4", "stack_out": [ "aggregate%extract%2#0", @@ -38269,7 +38456,7 @@ "event_type#0" ] }, - "4146": { + "4206": { "op": "pushint 5", "defined_out": [ "5", @@ -38293,7 +38480,7 @@ "5" ] }, - "4148": { + "4208": { "op": "==", "defined_out": [ "aggregate%extract%9#0", @@ -38316,7 +38503,7 @@ "tmp%5#2" ] }, - "4149": { + "4209": { "op": "bz apply_non_cash_event_bool_false@16", "stack_out": [ "aggregate%extract%2#0", @@ -38331,7 +38518,7 @@ "values%0#0" ] }, - "4152": { + "4212": { "block": "apply_non_cash_event_bool_true@15", "stack_in": [ "aggregate%extract%2#0", @@ -38363,7 +38550,7 @@ "or_result%0#0" ] }, - "4153": { + "4213": { "error": "Invalid event type", "block": "apply_non_cash_event_bool_merge@17", "stack_in": [ @@ -38394,7 +38581,7 @@ "values%0#0" ] }, - "4154": { + "4214": { "op": "dig 8", "defined_out": [ "aggregate%extract%9#0" @@ -38413,7 +38600,7 @@ "aggregate%extract%9#0" ] }, - "4156": { + "4216": { "op": "pushbytes 0x01", "defined_out": [ "0x01", @@ -38434,7 +38621,7 @@ "0x01" ] }, - "4159": { + "4219": { "op": "b!=", "defined_out": [ "aggregate%extract%9#0", @@ -38454,7 +38641,7 @@ "tmp%7#0" ] }, - "4160": { + "4220": { "error": "Invalid event type", "op": "assert // Invalid event type", "stack_out": [ @@ -38470,7 +38657,7 @@ "values%0#0" ] }, - "4161": { + "4221": { "op": "dig 4", "defined_out": [ "aggregate%extract%9#0", @@ -38490,7 +38677,7 @@ "event_type#0" ] }, - "4163": { + "4223": { "op": "pushint 12", "defined_out": [ "12", @@ -38512,7 +38699,7 @@ "12" ] }, - "4165": { + "4225": { "op": "==", "defined_out": [ "aggregate%extract%9#0", @@ -38533,7 +38720,7 @@ "tmp%0#3" ] }, - "4166": { + "4226": { "op": "bnz apply_non_cash_event_bool_true@21", "stack_out": [ "aggregate%extract%2#0", @@ -38548,7 +38735,7 @@ "values%0#0" ] }, - "4169": { + "4229": { "op": "dig 4", "stack_out": [ "aggregate%extract%2#0", @@ -38564,7 +38751,7 @@ "event_type#0" ] }, - "4171": { + "4231": { "op": "pushint 11", "defined_out": [ "11", @@ -38586,7 +38773,7 @@ "11" ] }, - "4173": { + "4233": { "op": "==", "defined_out": [ "aggregate%extract%9#0", @@ -38607,7 +38794,7 @@ "tmp%1#2" ] }, - "4174": { + "4234": { "op": "bz apply_non_cash_event_bool_false@22", "stack_out": [ "aggregate%extract%2#0", @@ -38622,7 +38809,7 @@ "values%0#0" ] }, - "4177": { + "4237": { "block": "apply_non_cash_event_bool_true@21", "stack_in": [ "aggregate%extract%2#0", @@ -38654,7 +38841,7 @@ "or_result%0#0" ] }, - "4178": { + "4238": { "block": "apply_non_cash_event_bool_merge@23", "stack_in": [ "aggregate%extract%2#0", @@ -38684,8 +38871,8 @@ "values%0#0" ] }, - "4181": { - "op": "bytec 24 // 0x52234f6273657276657223", + "4241": { + "op": "bytec 25 // 0x52234f6273657276657223", "defined_out": [ "0x52234f6273657276657223" ], @@ -38703,7 +38890,7 @@ "0x52234f6273657276657223" ] }, - "4183": { + "4243": { "op": "txn Sender", "defined_out": [ "0x52234f6273657276657223", @@ -38724,7 +38911,7 @@ "tmp%0#2" ] }, - "4185": { + "4245": { "callsub": "modules.rbac.RbacModule._role_is_active", "op": "callsub _role_is_active", "defined_out": [ @@ -38744,7 +38931,7 @@ "tmp%1#2" ] }, - "4188": { + "4248": { "error": "Not authorized", "op": "assert // Not authorized", "stack_out": [ @@ -38760,323 +38947,3112 @@ "values%0#0" ] }, - "4189": { + "4249": { "block": "apply_non_cash_event_after_if_else@6", "stack_in": [ "aggregate%extract%2#0", "aggregate%extract%9#0", "box_prefixed_key%0#0", - "entry#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0" + ], + "op": "dig 6", + "defined_out": [ + "entry#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "entry#0" + ] + }, + "4251": { + "op": "dig 2", + "defined_out": [ + "entry#0", + "payload#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "entry#0", + "payload#0" + ] + }, + "4253": { + "callsub": "modules.actus_kernel.ActusKernelModule._apply_non_cash_schedule_entry", + "op": "callsub _apply_non_cash_schedule_entry" + }, + "4256": { + "op": "popn 2", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0" + ] + }, + "4258": { + "op": "global LatestTimestamp", + "defined_out": [ + "entry#0", + "payload#0", + "tmp%10#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "tmp%10#0" + ] + }, + "4260": { + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%8#0", + "entry#0", + "payload#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "aggregate%val_as_bytes%8#0" + ] + }, + "4261": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "aggregate%val_as_bytes%8#0", + "entry#0", + "payload#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "aggregate%val_as_bytes%8#0", + "0x151f7c75" + ] + }, + "4262": { + "op": "swap", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "0x151f7c75", + "aggregate%val_as_bytes%8#0" + ] + }, + "4263": { + "op": "concat", + "defined_out": [ + "entry#0", + "payload#0", + "tmp%5#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "tmp%5#0" + ] + }, + "4264": { + "op": "log", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0" + ] + }, + "4265": { + "op": "intc_1 // 1", + "defined_out": [ + "1", + "entry#0", + "payload#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "1" + ] + }, + "4266": { + "op": "return", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0" + ] + }, + "4267": { + "block": "apply_non_cash_event_else_body@5", + "stack_in": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0" + ], + "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", + "op": "callsub _assert_caller_is_arranger" + }, + "4270": { + "op": "b apply_non_cash_event_after_if_else@6" + }, + "4273": { + "block": "apply_non_cash_event_bool_false@22", + "stack_in": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0" + ], + "op": "intc_0 // 0", + "defined_out": [ + "or_result%0#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "or_result%0#0" + ] + }, + "4274": { + "op": "b apply_non_cash_event_bool_merge@23" + }, + "4277": { + "block": "apply_non_cash_event_bool_false@16", + "stack_in": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0" + ], + "op": "intc_0 // 0", + "defined_out": [ + "or_result%0#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "or_result%0#0" + ] + }, + "4278": { + "op": "b apply_non_cash_event_bool_merge@17" + }, + "4281": { + "subroutine": "modules.actus_kernel.ActusKernelModule.append_observed_cash_event[routing]", + "params": {}, + "block": "append_observed_cash_event", + "stack_in": [], + "op": "intc_0 // 0", + "stack_out": [ + "box_prefixed_key%0#0" + ] + }, + "4282": { + "op": "dup", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0" + ] + }, + "4283": { + "op": "txna ApplicationArgs 1" + }, + "4286": { + "op": "dupn 2", + "defined_out": [ + "payload#0", + "payload#0 (copy)" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "payload#0", + "payload#0 (copy)" + ] + }, + "4288": { + "op": "len", + "defined_out": [ + "len%0#0", + "payload#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "payload#0", + "len%0#0" + ] + }, + "4289": { + "op": "pushint 65", + "defined_out": [ + "65", + "len%0#0", + "payload#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "payload#0", + "len%0#0", + "65" + ] + }, + "4291": { + "op": "==", + "defined_out": [ + "eq%0#0", + "payload#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "payload#0", + "eq%0#0" + ] + }, + "4292": { + "error": "invalid number of bytes for smart_contracts.abi_types.ObservedCashEventRequest", + "op": "assert // invalid number of bytes for smart_contracts.abi_types.ObservedCashEventRequest", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "payload#0" + ] + }, + "4293": { + "op": "intc_0 // 0", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "payload#0", + "0" + ] + }, + "4294": { + "op": "bytec_1 // \"status\"", + "defined_out": [ + "\"status\"", + "0", + "payload#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "payload#0", + "0", + "\"status\"" + ] + }, + "4295": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0", + "payload#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "payload#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "4296": { + "error": "check self.status exists", + "op": "assert // check self.status exists", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "payload#0", + "maybe_value%0#0" + ] + }, + "4297": { + "error": "D-ASA not configured", + "op": "assert // D-ASA not configured", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "payload#0" + ] + }, + "4298": { + "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", + "op": "callsub _assert_caller_is_arranger" + }, + "4301": { + "callsub": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", + "op": "callsub _assert_is_not_asset_defaulted" + }, + "4304": { + "callsub": "modules.rbac.RbacModule._assert_is_not_asset_suspended", + "op": "callsub _assert_is_not_asset_suspended" + }, + "4307": { + "op": "intc_0 // 0", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "payload#0", + "0" + ] + }, + "4308": { + "op": "bytec_1 // \"status\"", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "payload#0", + "0", + "\"status\"" + ] + }, + "4309": { + "op": "app_global_get_ex", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "payload#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "4310": { + "error": "check self.status exists", + "op": "assert // check self.status exists", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "payload#0", + "maybe_value%0#0" + ] + }, + "4311": { + "op": "pushint 50", + "defined_out": [ + "50", + "maybe_value%0#0", + "payload#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "payload#0", + "maybe_value%0#0", + "50" + ] + }, + "4313": { + "op": "==", + "defined_out": [ + "payload#0", + "tmp%0#5" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "payload#0", + "tmp%0#5" + ] + }, + "4314": { + "op": "!", + "defined_out": [ + "payload#0", + "tmp%1#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "payload#0", + "tmp%1#0" + ] + }, + "4315": { + "error": "IED not yet executed", + "op": "assert // IED not yet executed", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "payload#0" + ] + }, + "4316": { + "op": "intc_0 // 0", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "payload#0", + "0" + ] + }, + "4317": { + "op": "bytec 10 // \"contract_type\"", + "defined_out": [ + "\"contract_type\"", + "0", + "payload#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "payload#0", + "0", + "\"contract_type\"" + ] + }, + "4319": { + "op": "app_global_get_ex", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "payload#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "4320": { + "error": "check self.contract_type exists", + "op": "assert // check self.contract_type exists", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "payload#0", + "maybe_value%0#0" + ] + }, + "4321": { + "op": "pushint 5", + "defined_out": [ + "5", + "maybe_value%0#0", + "payload#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "payload#0", + "maybe_value%0#0", + "5" + ] + }, + "4323": { + "op": "==", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "payload#0", + "tmp%0#5" + ] + }, + "4324": { + "error": "Observed event required to execute this action", + "op": "assert // Observed event required to execute this action", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "payload#0" + ] + }, + "4325": { + "op": "dup", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "payload#0", + "payload#0 (copy)" + ] + }, + "4326": { + "op": "intc_0 // 0", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "payload#0", + "payload#0 (copy)", + "0" + ] + }, + "4327": { + "op": "extract_uint64", + "defined_out": [ + "payload#0", + "values%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "payload#0", + "values%0#0" + ] + }, + "4328": { + "op": "dup", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "payload#0", + "values%0#0", + "values%0#0" + ] + }, + "4329": { + "op": "cover 2", + "defined_out": [ + "payload#0", + "values%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "payload#0", + "values%0#0" + ] + }, + "4331": { + "op": "intc_0 // 0", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "payload#0", + "values%0#0", + "0" + ] + }, + "4332": { + "op": "bytec_3 // \"schedule_entry_count\"", + "defined_out": [ + "\"schedule_entry_count\"", + "0", + "payload#0", + "values%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "payload#0", + "values%0#0", + "0", + "\"schedule_entry_count\"" + ] + }, + "4333": { + "op": "app_global_get_ex", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "payload#0", + "values%0#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "4334": { + "error": "check self.schedule_entry_count exists", + "op": "assert // check self.schedule_entry_count exists", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "payload#0", + "values%0#0", + "maybe_value%0#0" + ] + }, + "4335": { + "op": "swap", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "payload#0", + "maybe_value%0#0", + "values%0#0" + ] + }, + "4336": { + "op": "dig 1", + "defined_out": [ + "maybe_value%0#0", + "maybe_value%0#0 (copy)", + "payload#0", + "values%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "payload#0", + "maybe_value%0#0", + "values%0#0", + "maybe_value%0#0 (copy)" + ] + }, + "4338": { + "op": "==", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "payload#0", + "maybe_value%0#0", + "tmp%1#0" + ] + }, + "4339": { + "error": "Invalid event id", + "op": "assert // Invalid event id", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "payload#0", + "maybe_value%0#0" + ] + }, + "4340": { + "op": "dig 1", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "payload#0", + "maybe_value%0#0", + "payload#0 (copy)" + ] + }, + "4342": { + "op": "extract 8 1", + "defined_out": [ + "aggregate%extract%1#0", + "maybe_value%0#0", + "payload#0", + "values%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "payload#0", + "maybe_value%0#0", + "aggregate%extract%1#0" + ] + }, + "4345": { + "op": "dup", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "payload#0", + "maybe_value%0#0", + "aggregate%extract%1#0", + "aggregate%extract%1#0" + ] + }, + "4346": { + "op": "cover 3", + "defined_out": [ + "aggregate%extract%1#0", + "maybe_value%0#0", + "payload#0", + "values%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "payload#0", + "maybe_value%0#0", + "aggregate%extract%1#0" + ] + }, + "4348": { + "op": "pushbytes 0x03", + "defined_out": [ + "0x03", + "aggregate%extract%1#0", + "maybe_value%0#0", + "payload#0", + "values%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "payload#0", + "maybe_value%0#0", + "aggregate%extract%1#0", + "0x03" + ] + }, + "4351": { + "op": "b==", + "defined_out": [ + "aggregate%extract%1#0", + "maybe_value%0#0", + "payload#0", + "tmp%2#1", + "values%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "payload#0", + "maybe_value%0#0", + "tmp%2#1" + ] + }, + "4352": { + "error": "Invalid event type", + "op": "assert // Invalid event type", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "payload#0", + "maybe_value%0#0" + ] + }, + "4353": { + "op": "swap", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "maybe_value%0#0", + "payload#0" + ] + }, + "4354": { + "op": "pushint 57", + "defined_out": [ + "57", + "aggregate%extract%1#0", + "maybe_value%0#0", + "payload#0", + "values%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "maybe_value%0#0", + "payload#0", + "57" + ] + }, + "4356": { + "op": "extract_uint64", + "defined_out": [ + "aggregate%extract%1#0", + "maybe_value%0#0", + "payload#0", + "values%0#0", + "values%1#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "maybe_value%0#0", + "values%1#0" + ] + }, + "4357": { + "op": "dup", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "maybe_value%0#0", + "values%1#0", + "values%1#0" + ] + }, + "4358": { + "op": "cover 2", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "maybe_value%0#0", + "values%1#0" + ] + }, + "4360": { + "op": "intc_1 // 1", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "maybe_value%0#0", + "values%1#0", + "1" + ] + }, + "4361": { + "op": "&", + "defined_out": [ + "aggregate%extract%1#0", + "maybe_value%0#0", + "payload#0", + "tmp%3#1", + "values%0#0", + "values%1#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "maybe_value%0#0", + "tmp%3#1" + ] + }, + "4362": { + "error": "Invalid ACTUS configuration", + "op": "assert // Invalid ACTUS configuration", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "maybe_value%0#0" + ] + }, + "4363": { + "op": "bz append_observed_cash_event_after_if_else@3", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0" + ] + }, + "4366": { + "op": "intc_0 // 0", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "0" + ] + }, + "4367": { + "op": "bytec_3 // \"schedule_entry_count\"", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "0", + "\"schedule_entry_count\"" + ] + }, + "4368": { + "op": "app_global_get_ex", + "defined_out": [ + "aggregate%extract%1#0", + "maybe_exists%2#0", + "maybe_value%2#0", + "payload#0", + "values%0#0", + "values%1#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "maybe_value%2#0", + "maybe_exists%2#0" + ] + }, + "4369": { + "error": "check self.schedule_entry_count exists", + "op": "assert // check self.schedule_entry_count exists", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "maybe_value%2#0" + ] + }, + "4370": { + "op": "intc_1 // 1", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "maybe_value%2#0", + "1" + ] + }, + "4371": { + "op": "-", + "defined_out": [ + "aggregate%extract%1#0", + "payload#0", + "tmp%6#0", + "values%0#0", + "values%1#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "tmp%6#0" + ] + }, + "4372": { + "callsub": "modules.actus_kernel.ActusKernelModule._get_schedule_entry", + "op": "callsub _get_schedule_entry", + "defined_out": [ + "aggregate%extract%1#0", + "payload#0", + "previous_entry#0", + "values%0#0", + "values%1#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "previous_entry#0" + ] + }, + "4375": { + "op": "pushint 9", + "defined_out": [ + "9", + "aggregate%extract%1#0", + "payload#0", + "previous_entry#0", + "values%0#0", + "values%1#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "previous_entry#0", + "9" + ] + }, + "4377": { + "op": "extract_uint64", + "defined_out": [ + "aggregate%extract%1#0", + "payload#0", + "values%0#0", + "values%1#0", + "values%2#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "values%2#0" + ] + }, + "4378": { + "op": "dig 4", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "values%2#0", + "payload#0" + ] + }, + "4380": { + "op": "pushint 9", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "values%2#0", + "payload#0", + "9" + ] + }, + "4382": { + "op": "extract_uint64", + "defined_out": [ + "aggregate%extract%1#0", + "payload#0", + "values%0#0", + "values%1#0", + "values%2#0", + "values%3#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "values%2#0", + "values%3#0" + ] + }, + "4383": { + "op": "<=", + "defined_out": [ + "aggregate%extract%1#0", + "payload#0", + "tmp%8#0", + "values%0#0", + "values%1#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "tmp%8#0" + ] + }, + "4384": { + "error": "Time events must be sorted in strictly ascending order", + "op": "assert // Time events must be sorted in strictly ascending order", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0" + ] + }, + "4385": { + "block": "append_observed_cash_event_after_if_else@3", + "stack_in": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0" + ], + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "0" + ] + }, + "4386": { + "op": "bytec_3 // \"schedule_entry_count\"", + "defined_out": [ + "\"schedule_entry_count\"", + "0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "0", + "\"schedule_entry_count\"" + ] + }, + "4387": { + "op": "app_global_get_ex", + "defined_out": [ + "event_id#0", + "maybe_exists%3#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "event_id#0", + "maybe_exists%3#0" + ] + }, + "4388": { + "error": "check self.schedule_entry_count exists", + "op": "assert // check self.schedule_entry_count exists", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "event_id#0" + ] + }, + "4389": { + "op": "pushint 16", + "defined_out": [ + "16", + "event_id#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "event_id#0", + "16" + ] + }, + "4391": { + "op": "/", + "defined_out": [ + "page_index#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page_index#0" + ] + }, + "4392": { + "op": "bytec 48 // 0x0000", + "defined_out": [ + "page#0", + "page_index#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page_index#0", + "page#0" + ] + }, + "4394": { + "op": "bury 6", + "defined_out": [ + "page#0", + "page_index#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page_index#0" + ] + }, + "4396": { + "op": "itob", + "defined_out": [ + "encoded_value%0#0", + "page#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "encoded_value%0#0" + ] + }, + "4397": { + "op": "bytec 24 // 0x5323", + "defined_out": [ + "0x5323", + "encoded_value%0#0", + "page#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "encoded_value%0#0", + "0x5323" + ] + }, + "4399": { + "op": "swap", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "0x5323", + "encoded_value%0#0" + ] + }, + "4400": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%0#0", + "page#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "box_prefixed_key%0#0" + ] + }, + "4401": { + "op": "dup", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "box_prefixed_key%0#0", + "box_prefixed_key%0#0" + ] + }, + "4402": { + "op": "bury 7", + "defined_out": [ + "box_prefixed_key%0#0", + "page#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "box_prefixed_key%0#0" + ] + }, + "4404": { + "op": "box_len", + "defined_out": [ + "_%0#0", + "box_prefixed_key%0#0", + "maybe_exists%4#0", + "page#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "_%0#0", + "maybe_exists%4#0" + ] + }, + "4405": { + "op": "bury 1", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "maybe_exists%4#0" + ] + }, + "4407": { + "op": "bz append_observed_cash_event_after_if_else@5", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0" + ] + }, + "4410": { + "op": "dig 5", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "box_prefixed_key%0#0" + ] + }, + "4412": { + "op": "box_get", + "defined_out": [ + "aggregate%box_get%1#0", + "box_prefixed_key%0#0", + "page#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%box_get%1#0" + ] + }, + "4413": { + "op": "swap", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "aggregate%box_get%1#0", + "page#0" + ] + }, + "4414": { + "op": "bury 6", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "aggregate%box_get%1#0" + ] + }, + "4416": { + "error": "check self.schedule_page entry exists", + "op": "assert // check self.schedule_page entry exists", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0" + ] + }, + "4417": { + "block": "append_observed_cash_event_after_if_else@5", + "stack_in": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0" + ], + "op": "dig 4", + "defined_out": [ + "page#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0" + ] + }, + "4419": { + "op": "dup", + "defined_out": [ + "page#0", + "page#0 (copy)" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "page#0 (copy)" + ] + }, + "4420": { + "op": "intc_0 // 0", + "defined_out": [ + "0", + "page#0", + "page#0 (copy)" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "page#0 (copy)", + "0" + ] + }, + "4421": { + "error": "invalid array length header", + "op": "extract_uint16 // on error: invalid array length header", + "defined_out": [ + "aggregate%array_length%0#0", + "page#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%array_length%0#0" + ] + }, + "4422": { + "op": "dup", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%array_length%0#0 (copy)", + "page#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%array_length%0#0 (copy)" + ] + }, + "4423": { + "op": "pushint 16", + "defined_out": [ + "16", + "aggregate%array_length%0#0", + "aggregate%array_length%0#0 (copy)", + "page#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%array_length%0#0 (copy)", + "16" + ] + }, + "4425": { + "op": "<", + "defined_out": [ + "aggregate%array_length%0#0", + "page#0", + "tmp%11#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%array_length%0#0", + "tmp%11#0" + ] + }, + "4426": { + "error": "Invalid schedule page", + "op": "assert // Invalid schedule page", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%array_length%0#0" + ] + }, + "4427": { + "op": "dig 5", + "defined_out": [ + "aggregate%array_length%0#0", + "page#0", + "payload#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%array_length%0#0", + "payload#0" + ] + }, + "4429": { + "op": "dup", + "defined_out": [ + "aggregate%array_length%0#0", + "page#0", + "payload#0", + "payload#0 (copy)" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%array_length%0#0", + "payload#0", + "payload#0 (copy)" + ] + }, + "4430": { + "op": "extract 9 8", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%5#0", + "page#0", + "payload#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%array_length%0#0", + "payload#0", + "aggregate%extract%5#0" + ] + }, + "4433": { + "op": "dig 1", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%array_length%0#0", + "payload#0", + "aggregate%extract%5#0", + "payload#0 (copy)" + ] + }, + "4435": { + "op": "extract 17 8", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "page#0", + "payload#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%array_length%0#0", + "payload#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0" + ] + }, + "4438": { + "op": "dig 2", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%array_length%0#0", + "payload#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "payload#0 (copy)" + ] + }, + "4440": { + "op": "extract 25 8", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "page#0", + "payload#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%array_length%0#0", + "payload#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0" + ] + }, + "4443": { + "op": "dig 3", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%array_length%0#0", + "payload#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "payload#0 (copy)" + ] + }, + "4445": { + "op": "extract 33 8", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "page#0", + "payload#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%array_length%0#0", + "payload#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0" + ] + }, + "4448": { + "op": "dig 4", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%array_length%0#0", + "payload#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "payload#0 (copy)" + ] + }, + "4450": { + "op": "extract 41 8", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%extract%9#0", + "page#0", + "payload#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%array_length%0#0", + "payload#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%extract%9#0" + ] + }, + "4453": { + "op": "uncover 5", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%extract%9#0", + "payload#0" + ] + }, + "4455": { + "op": "extract 49 8", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%10#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%extract%9#0", + "page#0", + "payload#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%extract%9#0", + "aggregate%extract%10#0" + ] + }, + "4458": { + "op": "dig 10", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%10#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%extract%9#0", + "page#0", + "payload#0", + "values%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%extract%9#0", + "aggregate%extract%10#0", + "values%0#0" + ] + }, + "4460": { + "op": "itob", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%10#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%extract%9#0", + "aggregate%val_as_bytes%0#0", + "page#0", + "payload#0", + "values%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%extract%9#0", + "aggregate%extract%10#0", + "aggregate%val_as_bytes%0#0" + ] + }, + "4461": { + "op": "dig 10", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%1#0", + "aggregate%extract%10#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%extract%9#0", + "aggregate%val_as_bytes%0#0", + "page#0", + "payload#0", + "values%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%extract%9#0", + "aggregate%extract%10#0", + "aggregate%val_as_bytes%0#0", + "aggregate%extract%1#0" + ] + }, + "4463": { + "op": "concat", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%1#0", + "aggregate%extract%10#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%extract%9#0", + "aggregate%head%1#0", + "page#0", + "payload#0", + "values%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%extract%9#0", + "aggregate%extract%10#0", + "aggregate%head%1#0" + ] + }, + "4464": { + "op": "uncover 6", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%extract%9#0", + "aggregate%extract%10#0", + "aggregate%head%1#0", + "aggregate%extract%5#0" + ] + }, + "4466": { + "op": "concat", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%1#0", + "aggregate%extract%10#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%extract%9#0", + "aggregate%head%2#0", + "page#0", + "payload#0", + "values%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%extract%9#0", + "aggregate%extract%10#0", + "aggregate%head%2#0" + ] + }, + "4467": { + "op": "uncover 5", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%extract%9#0", + "aggregate%extract%10#0", + "aggregate%head%2#0", + "aggregate%extract%6#0" + ] + }, + "4469": { + "op": "concat", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%1#0", + "aggregate%extract%10#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%extract%9#0", + "aggregate%head%3#0", + "page#0", + "payload#0", + "values%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%extract%9#0", + "aggregate%extract%10#0", + "aggregate%head%3#0" + ] + }, + "4470": { + "op": "uncover 4", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%extract%8#0", + "aggregate%extract%9#0", + "aggregate%extract%10#0", + "aggregate%head%3#0", + "aggregate%extract%7#0" + ] + }, + "4472": { + "op": "concat", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%1#0", + "aggregate%extract%10#0", + "aggregate%extract%8#0", + "aggregate%extract%9#0", + "aggregate%head%4#0", + "page#0", + "payload#0", + "values%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%extract%8#0", + "aggregate%extract%9#0", + "aggregate%extract%10#0", + "aggregate%head%4#0" + ] + }, + "4473": { + "op": "uncover 3", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%extract%9#0", + "aggregate%extract%10#0", + "aggregate%head%4#0", + "aggregate%extract%8#0" + ] + }, + "4475": { + "op": "concat", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%1#0", + "aggregate%extract%10#0", + "aggregate%extract%9#0", + "aggregate%head%5#0", + "page#0", + "payload#0", + "values%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%extract%9#0", + "aggregate%extract%10#0", + "aggregate%head%5#0" + ] + }, + "4476": { + "op": "uncover 2", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%extract%10#0", + "aggregate%head%5#0", + "aggregate%extract%9#0" + ] + }, + "4478": { + "op": "concat", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%1#0", + "aggregate%extract%10#0", + "aggregate%head%6#0", + "page#0", + "payload#0", + "values%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%extract%10#0", + "aggregate%head%6#0" + ] + }, + "4479": { + "op": "swap", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%head%6#0", + "aggregate%extract%10#0" + ] + }, + "4480": { + "op": "concat", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%1#0", + "aggregate%head%7#0", + "page#0", + "payload#0", + "values%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%head%7#0" + ] + }, + "4481": { + "op": "dig 3", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%1#0", + "aggregate%head%7#0", + "page#0", + "payload#0", + "values%0#0", + "values%1#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%head%7#0", + "values%1#0" + ] + }, + "4483": { + "op": "itob", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%1#0", + "aggregate%head%7#0", + "aggregate%val_as_bytes%7#0", + "page#0", + "payload#0", + "values%0#0", + "values%1#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%head%7#0", + "aggregate%val_as_bytes%7#0" + ] + }, + "4484": { + "op": "concat", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%1#0", + "aggregate%head%8#0", + "page#0", + "payload#0", + "values%0#0", + "values%1#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%head%8#0" + ] + }, + "4485": { + "op": "uncover 2", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "aggregate%array_length%0#0", + "aggregate%head%8#0", + "page#0" + ] + }, + "4487": { + "op": "swap", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "aggregate%array_length%0#0", + "page#0", + "aggregate%head%8#0" + ] + }, + "4488": { + "error": "max array length exceeded", + "op": "concat // on error: max array length exceeded", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%1#0", + "concat%0#0", + "page#0", + "payload#0", + "values%0#0", + "values%1#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "aggregate%array_length%0#0", + "concat%0#0" + ] + }, + "4489": { + "op": "swap", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "concat%0#0", + "aggregate%array_length%0#0" + ] + }, + "4490": { + "op": "intc_1 // 1", + "defined_out": [ + "1", + "aggregate%array_length%0#0", + "aggregate%extract%1#0", + "concat%0#0", + "page#0", + "payload#0", + "values%0#0", + "values%1#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "concat%0#0", + "aggregate%array_length%0#0", + "1" + ] + }, + "4491": { + "op": "+", + "defined_out": [ + "add%0#0", + "aggregate%extract%1#0", + "concat%0#0", + "page#0", + "payload#0", + "values%0#0", + "values%1#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "concat%0#0", + "add%0#0" + ] + }, + "4492": { + "op": "itob", + "defined_out": [ + "aggregate%extract%1#0", + "as_bytes%0#0", + "concat%0#0", + "page#0", + "payload#0", + "values%0#0", + "values%1#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "concat%0#0", + "as_bytes%0#0" + ] + }, + "4493": { + "op": "extract 6 2", + "defined_out": [ + "aggregate%extract%1#0", + "as_u16_bytes%0#0", + "concat%0#0", + "page#0", + "payload#0", + "values%0#0", + "values%1#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "concat%0#0", + "as_u16_bytes%0#0" + ] + }, + "4496": { + "op": "replace2 0", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0" + ] + }, + "4498": { + "op": "dig 6", + "defined_out": [ + "aggregate%extract%1#0", + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "values%1#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "box_prefixed_key%0#0" + ] + }, + "4500": { + "op": "dup", + "defined_out": [ + "aggregate%extract%1#0", + "box_prefixed_key%0#0", + "box_prefixed_key%0#0 (copy)", + "page#0", + "payload#0", + "values%0#0", + "values%1#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "box_prefixed_key%0#0", + "box_prefixed_key%0#0 (copy)" + ] + }, + "4501": { + "op": "box_del", + "defined_out": [ + "aggregate%extract%1#0", + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "values%1#0", + "{box_del}" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "box_prefixed_key%0#0", + "{box_del}" + ] + }, + "4502": { + "op": "pop", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "box_prefixed_key%0#0" + ] + }, + "4503": { + "op": "swap", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "box_prefixed_key%0#0", + "page#0" + ] + }, + "4504": { + "op": "box_put", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0" + ] + }, + "4505": { + "op": "intc_0 // 0", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "0" + ] + }, + "4506": { + "op": "bytec_3 // \"schedule_entry_count\"", + "defined_out": [ + "\"schedule_entry_count\"", + "0", + "aggregate%extract%1#0", + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "values%1#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "0", + "\"schedule_entry_count\"" + ] + }, + "4507": { + "op": "app_global_get_ex", + "defined_out": [ + "aggregate%extract%1#0", + "box_prefixed_key%0#0", + "maybe_exists%5#0", + "maybe_value%4#0", + "page#0", + "payload#0", + "values%0#0", + "values%1#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "maybe_value%4#0", + "maybe_exists%5#0" + ] + }, + "4508": { + "error": "check self.schedule_entry_count exists", + "op": "assert // check self.schedule_entry_count exists", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "maybe_value%4#0" + ] + }, + "4509": { + "op": "intc_1 // 1", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "maybe_value%4#0", + "1" + ] + }, + "4510": { + "op": "+", + "defined_out": [ + "aggregate%extract%1#0", + "box_prefixed_key%0#0", "page#0", - "event_type#0", - "values%0#1", - "event_id#0", "payload#0", - "values%0#0" - ], - "op": "dig 6", - "defined_out": [ - "entry#0" + "tmp%14#0", + "values%0#0", + "values%1#0" ], "stack_out": [ - "aggregate%extract%2#0", - "aggregate%extract%9#0", "box_prefixed_key%0#0", - "entry#0", "page#0", - "event_type#0", - "values%0#1", - "event_id#0", "payload#0", "values%0#0", - "entry#0" + "aggregate%extract%1#0", + "values%1#0", + "tmp%14#0" ] }, - "4191": { - "op": "dig 2", - "defined_out": [ - "entry#0", - "payload#0" - ], + "4511": { + "op": "bytec_3 // \"schedule_entry_count\"", "stack_out": [ - "aggregate%extract%2#0", - "aggregate%extract%9#0", "box_prefixed_key%0#0", - "entry#0", "page#0", - "event_type#0", - "values%0#1", - "event_id#0", "payload#0", "values%0#0", - "entry#0", - "payload#0" + "aggregate%extract%1#0", + "values%1#0", + "tmp%14#0", + "\"schedule_entry_count\"" ] }, - "4193": { - "callsub": "modules.actus_kernel.ActusKernelModule._apply_non_cash_schedule_entry", - "op": "callsub _apply_non_cash_schedule_entry" + "4512": { + "op": "swap", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "\"schedule_entry_count\"", + "tmp%14#0" + ] }, - "4196": { - "op": "popn 2", + "4513": { + "op": "app_global_put", "stack_out": [ - "aggregate%extract%2#0", - "aggregate%extract%9#0", "box_prefixed_key%0#0", - "entry#0", "page#0", - "event_type#0", - "values%0#1", - "event_id#0", "payload#0", - "values%0#0" + "values%0#0", + "aggregate%extract%1#0", + "values%1#0" ] }, - "4198": { + "4514": { "op": "global LatestTimestamp", "defined_out": [ - "entry#0", + "aggregate%extract%1#0", + "box_prefixed_key%0#0", + "page#0", "payload#0", - "tmp%10#0" + "tmp%0#1", + "values%0#0", + "values%1#0" ], "stack_out": [ - "aggregate%extract%2#0", - "aggregate%extract%9#0", "box_prefixed_key%0#0", - "entry#0", "page#0", - "event_type#0", - "values%0#1", - "event_id#0", "payload#0", "values%0#0", - "tmp%10#0" + "aggregate%extract%1#0", + "values%1#0", + "tmp%0#1" ] }, - "4200": { + "4516": { "op": "itob", "defined_out": [ + "aggregate%extract%1#0", "aggregate%val_as_bytes%8#0", - "entry#0", - "payload#0" + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "values%1#0" ], "stack_out": [ - "aggregate%extract%2#0", - "aggregate%extract%9#0", "box_prefixed_key%0#0", - "entry#0", "page#0", - "event_type#0", - "values%0#1", - "event_id#0", "payload#0", "values%0#0", + "aggregate%extract%1#0", + "values%1#0", "aggregate%val_as_bytes%8#0" ] }, - "4201": { + "4517": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", + "aggregate%extract%1#0", "aggregate%val_as_bytes%8#0", - "entry#0", - "payload#0" + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "values%1#0" ], "stack_out": [ - "aggregate%extract%2#0", - "aggregate%extract%9#0", "box_prefixed_key%0#0", - "entry#0", "page#0", - "event_type#0", - "values%0#1", - "event_id#0", "payload#0", "values%0#0", + "aggregate%extract%1#0", + "values%1#0", "aggregate%val_as_bytes%8#0", "0x151f7c75" ] }, - "4202": { + "4518": { "op": "swap", "stack_out": [ - "aggregate%extract%2#0", - "aggregate%extract%9#0", "box_prefixed_key%0#0", - "entry#0", "page#0", - "event_type#0", - "values%0#1", - "event_id#0", "payload#0", "values%0#0", + "aggregate%extract%1#0", + "values%1#0", "0x151f7c75", "aggregate%val_as_bytes%8#0" ] }, - "4203": { + "4519": { "op": "concat", "defined_out": [ - "entry#0", + "aggregate%extract%1#0", + "box_prefixed_key%0#0", + "page#0", "payload#0", - "tmp%5#0" + "tmp%3#0", + "values%0#0", + "values%1#0" ], "stack_out": [ - "aggregate%extract%2#0", - "aggregate%extract%9#0", "box_prefixed_key%0#0", - "entry#0", "page#0", - "event_type#0", - "values%0#1", - "event_id#0", "payload#0", "values%0#0", - "tmp%5#0" + "aggregate%extract%1#0", + "values%1#0", + "tmp%3#0" ] }, - "4204": { + "4520": { "op": "log", "stack_out": [ - "aggregate%extract%2#0", - "aggregate%extract%9#0", "box_prefixed_key%0#0", - "entry#0", "page#0", - "event_type#0", - "values%0#1", - "event_id#0", "payload#0", - "values%0#0" + "values%0#0", + "aggregate%extract%1#0", + "values%1#0" ] }, - "4205": { + "4521": { "op": "intc_1 // 1", - "defined_out": [ - "1", - "entry#0", - "payload#0" - ], "stack_out": [ - "aggregate%extract%2#0", - "aggregate%extract%9#0", "box_prefixed_key%0#0", - "entry#0", "page#0", - "event_type#0", - "values%0#1", - "event_id#0", "payload#0", "values%0#0", + "aggregate%extract%1#0", + "values%1#0", "1" ] }, - "4206": { + "4522": { "op": "return", "stack_out": [ - "aggregate%extract%2#0", - "aggregate%extract%9#0", - "box_prefixed_key%0#0", - "entry#0", - "page#0", - "event_type#0", - "values%0#1", - "event_id#0", - "payload#0", - "values%0#0" - ] - }, - "4207": { - "block": "apply_non_cash_event_else_body@5", - "stack_in": [ - "aggregate%extract%2#0", - "aggregate%extract%9#0", - "box_prefixed_key%0#0", - "entry#0", - "page#0", - "event_type#0", - "values%0#1", - "event_id#0", - "payload#0", - "values%0#0" - ], - "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", - "op": "callsub _assert_caller_is_arranger" - }, - "4210": { - "op": "b apply_non_cash_event_after_if_else@6" - }, - "4213": { - "block": "apply_non_cash_event_bool_false@22", - "stack_in": [ - "aggregate%extract%2#0", - "aggregate%extract%9#0", - "box_prefixed_key%0#0", - "entry#0", - "page#0", - "event_type#0", - "values%0#1", - "event_id#0", - "payload#0", - "values%0#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "or_result%0#0" - ], - "stack_out": [ - "aggregate%extract%2#0", - "aggregate%extract%9#0", - "box_prefixed_key%0#0", - "entry#0", - "page#0", - "event_type#0", - "values%0#1", - "event_id#0", - "payload#0", - "values%0#0", - "or_result%0#0" - ] - }, - "4214": { - "op": "b apply_non_cash_event_bool_merge@23" - }, - "4217": { - "block": "apply_non_cash_event_bool_false@16", - "stack_in": [ - "aggregate%extract%2#0", - "aggregate%extract%9#0", - "box_prefixed_key%0#0", - "entry#0", - "page#0", - "event_type#0", - "values%0#1", - "event_id#0", - "payload#0", - "values%0#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "or_result%0#0" - ], - "stack_out": [ - "aggregate%extract%2#0", - "aggregate%extract%9#0", "box_prefixed_key%0#0", - "entry#0", "page#0", - "event_type#0", - "values%0#1", - "event_id#0", "payload#0", "values%0#0", - "or_result%0#0" + "aggregate%extract%1#0", + "values%1#0" ] }, - "4218": { - "op": "b apply_non_cash_event_bool_merge@17" - }, - "4221": { + "4523": { "subroutine": "modules.actus_kernel.ActusKernelModule.contract_get_state[routing]", "params": {}, "block": "contract_get_state", @@ -39089,7 +42065,7 @@ "0" ] }, - "4222": { + "4524": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"", @@ -39100,7 +42076,7 @@ "\"status\"" ] }, - "4223": { + "4525": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -39111,14 +42087,14 @@ "maybe_exists%0#0" ] }, - "4224": { + "4526": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ "maybe_value%0#1" ] }, - "4225": { + "4527": { "op": "dup", "defined_out": [ "maybe_value%0#1", @@ -39129,22 +42105,22 @@ "maybe_value%0#1 (copy)" ] }, - "4226": { + "4528": { "error": "D-ASA not configured", "op": "assert // D-ASA not configured", "stack_out": [ "maybe_value%0#1" ] }, - "4227": { + "4529": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#1", "0" ] }, - "4228": { - "op": "bytec 12 // \"contract_type\"", + "4530": { + "op": "bytec 10 // \"contract_type\"", "defined_out": [ "\"contract_type\"", "0", @@ -39156,7 +42132,7 @@ "\"contract_type\"" ] }, - "4230": { + "4532": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -39169,7 +42145,7 @@ "maybe_exists%0#0" ] }, - "4231": { + "4533": { "error": "check self.contract_type exists", "op": "assert // check self.contract_type exists", "stack_out": [ @@ -39177,7 +42153,7 @@ "maybe_value%0#0" ] }, - "4232": { + "4534": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0", @@ -39188,7 +42164,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "4233": { + "4535": { "op": "dup", "defined_out": [ "aggregate%val_as_bytes%0#0", @@ -39201,7 +42177,7 @@ "aggregate%val_as_bytes%0#0 (copy)" ] }, - "4234": { + "4536": { "op": "bitlen", "defined_out": [ "aggregate%bitlen%0#0", @@ -39214,7 +42190,7 @@ "aggregate%bitlen%0#0" ] }, - "4235": { + "4537": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -39229,7 +42205,7 @@ "8" ] }, - "4236": { + "4538": { "op": "<=", "defined_out": [ "aggregate%no_overflow%0#0", @@ -39242,7 +42218,7 @@ "aggregate%no_overflow%0#0" ] }, - "4237": { + "4539": { "error": "overflow", "op": "assert // overflow", "stack_out": [ @@ -39250,7 +42226,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "4238": { + "4540": { "op": "extract 7 1", "defined_out": [ "aggregate%uint8%0#0", @@ -39261,7 +42237,7 @@ "aggregate%uint8%0#0" ] }, - "4241": { + "4543": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#1", @@ -39269,7 +42245,7 @@ "0" ] }, - "4242": { + "4544": { "op": "bytec 13 // \"total_units\"", "defined_out": [ "\"total_units\"", @@ -39284,7 +42260,7 @@ "\"total_units\"" ] }, - "4244": { + "4546": { "op": "app_global_get_ex", "defined_out": [ "aggregate%uint8%0#0", @@ -39299,7 +42275,7 @@ "maybe_exists%2#0" ] }, - "4245": { + "4547": { "error": "check self.total_units exists", "op": "assert // check self.total_units exists", "stack_out": [ @@ -39308,7 +42284,7 @@ "maybe_value%2#0" ] }, - "4246": { + "4548": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#1", @@ -39317,8 +42293,8 @@ "0" ] }, - "4247": { - "op": "bytec 10 // \"reserved_units_total\"", + "4549": { + "op": "bytec 11 // \"reserved_units_total\"", "defined_out": [ "\"reserved_units_total\"", "0", @@ -39334,7 +42310,7 @@ "\"reserved_units_total\"" ] }, - "4249": { + "4551": { "op": "app_global_get_ex", "defined_out": [ "aggregate%uint8%0#0", @@ -39351,7 +42327,7 @@ "maybe_exists%3#0" ] }, - "4250": { + "4552": { "error": "check self.reserved_units_total exists", "op": "assert // check self.reserved_units_total exists", "stack_out": [ @@ -39361,7 +42337,7 @@ "maybe_value%3#0" ] }, - "4251": { + "4553": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#1", @@ -39371,7 +42347,7 @@ "0" ] }, - "4252": { + "4554": { "op": "bytec 20 // \"initial_exchange_amount\"", "defined_out": [ "\"initial_exchange_amount\"", @@ -39390,7 +42366,7 @@ "\"initial_exchange_amount\"" ] }, - "4254": { + "4556": { "op": "app_global_get_ex", "defined_out": [ "aggregate%uint8%0#0", @@ -39409,7 +42385,7 @@ "maybe_exists%4#0" ] }, - "4255": { + "4557": { "error": "check self.initial_exchange_amount exists", "op": "assert // check self.initial_exchange_amount exists", "stack_out": [ @@ -39420,7 +42396,7 @@ "maybe_value%4#0" ] }, - "4256": { + "4558": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#1", @@ -39431,7 +42407,7 @@ "0" ] }, - "4257": { + "4559": { "op": "bytec_2 // \"event_cursor\"", "defined_out": [ "\"event_cursor\"", @@ -39452,7 +42428,7 @@ "\"event_cursor\"" ] }, - "4258": { + "4560": { "op": "app_global_get_ex", "defined_out": [ "aggregate%uint8%0#0", @@ -39473,7 +42449,7 @@ "maybe_exists%5#0" ] }, - "4259": { + "4561": { "error": "check self.event_cursor exists", "op": "assert // check self.event_cursor exists", "stack_out": [ @@ -39485,7 +42461,7 @@ "maybe_value%5#0" ] }, - "4260": { + "4562": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#1", @@ -39497,8 +42473,8 @@ "0" ] }, - "4261": { - "op": "bytec 4 // \"schedule_entry_count\"", + "4563": { + "op": "bytec_3 // \"schedule_entry_count\"", "defined_out": [ "\"schedule_entry_count\"", "0", @@ -39520,7 +42496,7 @@ "\"schedule_entry_count\"" ] }, - "4263": { + "4564": { "op": "app_global_get_ex", "defined_out": [ "aggregate%uint8%0#0", @@ -39543,7 +42519,7 @@ "maybe_exists%6#0" ] }, - "4264": { + "4565": { "error": "check self.schedule_entry_count exists", "op": "assert // check self.schedule_entry_count exists", "stack_out": [ @@ -39556,7 +42532,7 @@ "maybe_value%6#0" ] }, - "4265": { + "4566": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#1", @@ -39569,8 +42545,8 @@ "0" ] }, - "4266": { - "op": "bytec_3 // \"outstanding_principal\"", + "4567": { + "op": "bytec 4 // \"outstanding_principal\"", "defined_out": [ "\"outstanding_principal\"", "0", @@ -39594,7 +42570,7 @@ "\"outstanding_principal\"" ] }, - "4267": { + "4569": { "op": "app_global_get_ex", "defined_out": [ "aggregate%uint8%0#0", @@ -39619,7 +42595,7 @@ "maybe_exists%7#0" ] }, - "4268": { + "4570": { "error": "check self.outstanding_principal exists", "op": "assert // check self.outstanding_principal exists", "stack_out": [ @@ -39633,7 +42609,7 @@ "maybe_value%7#0" ] }, - "4269": { + "4571": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#1", @@ -39647,7 +42623,7 @@ "0" ] }, - "4270": { + "4572": { "op": "bytec 7 // \"interest_calculation_base\"", "defined_out": [ "\"interest_calculation_base\"", @@ -39674,7 +42650,7 @@ "\"interest_calculation_base\"" ] }, - "4272": { + "4574": { "op": "app_global_get_ex", "defined_out": [ "aggregate%uint8%0#0", @@ -39701,7 +42677,7 @@ "maybe_exists%8#0" ] }, - "4273": { + "4575": { "error": "check self.interest_calculation_base exists", "op": "assert // check self.interest_calculation_base exists", "stack_out": [ @@ -39716,7 +42692,7 @@ "maybe_value%8#0" ] }, - "4274": { + "4576": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#1", @@ -39731,7 +42707,7 @@ "0" ] }, - "4275": { + "4577": { "op": "bytec 9 // \"nominal_interest_rate\"", "defined_out": [ "\"nominal_interest_rate\"", @@ -39760,7 +42736,7 @@ "\"nominal_interest_rate\"" ] }, - "4277": { + "4579": { "op": "app_global_get_ex", "defined_out": [ "aggregate%uint8%0#0", @@ -39789,7 +42765,7 @@ "maybe_exists%9#0" ] }, - "4278": { + "4580": { "error": "check self.nominal_interest_rate exists", "op": "assert // check self.nominal_interest_rate exists", "stack_out": [ @@ -39805,7 +42781,7 @@ "maybe_value%9#0" ] }, - "4279": { + "4581": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#1", @@ -39821,7 +42797,7 @@ "0" ] }, - "4280": { + "4582": { "op": "bytec 6 // \"accrued_interest\"", "defined_out": [ "\"accrued_interest\"", @@ -39852,7 +42828,7 @@ "\"accrued_interest\"" ] }, - "4282": { + "4584": { "op": "app_global_get_ex", "defined_out": [ "aggregate%uint8%0#0", @@ -39883,7 +42859,7 @@ "maybe_exists%10#0" ] }, - "4283": { + "4585": { "error": "check self.accrued_interest exists", "op": "assert // check self.accrued_interest exists", "stack_out": [ @@ -39900,7 +42876,7 @@ "maybe_value%10#0" ] }, - "4284": { + "4586": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#1", @@ -39917,7 +42893,7 @@ "0" ] }, - "4285": { + "4587": { "op": "bytec 16 // \"cumulative_interest_index\"", "defined_out": [ "\"cumulative_interest_index\"", @@ -39950,7 +42926,7 @@ "\"cumulative_interest_index\"" ] }, - "4287": { + "4589": { "op": "app_global_get_ex", "defined_out": [ "aggregate%uint8%0#0", @@ -39983,7 +42959,7 @@ "maybe_exists%11#0" ] }, - "4288": { + "4590": { "error": "check self.cumulative_interest_index exists", "op": "assert // check self.cumulative_interest_index exists", "stack_out": [ @@ -40001,7 +42977,7 @@ "maybe_value%11#0" ] }, - "4289": { + "4591": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#1", @@ -40019,7 +42995,7 @@ "0" ] }, - "4290": { + "4592": { "op": "bytec 17 // \"cumulative_principal_index\"", "defined_out": [ "\"cumulative_principal_index\"", @@ -40054,7 +43030,7 @@ "\"cumulative_principal_index\"" ] }, - "4292": { + "4594": { "op": "app_global_get_ex", "defined_out": [ "aggregate%uint8%0#0", @@ -40089,7 +43065,7 @@ "maybe_exists%12#0" ] }, - "4293": { + "4595": { "error": "check self.cumulative_principal_index exists", "op": "assert // check self.cumulative_principal_index exists", "stack_out": [ @@ -40108,7 +43084,7 @@ "maybe_value%12#0" ] }, - "4294": { + "4596": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#1", @@ -40127,7 +43103,7 @@ "0" ] }, - "4295": { + "4597": { "op": "bytec 15 // \"reserved_interest\"", "defined_out": [ "\"reserved_interest\"", @@ -40164,7 +43140,7 @@ "\"reserved_interest\"" ] }, - "4297": { + "4599": { "op": "app_global_get_ex", "defined_out": [ "aggregate%uint8%0#0", @@ -40201,7 +43177,7 @@ "maybe_exists%13#0" ] }, - "4298": { + "4600": { "error": "check self.reserved_interest exists", "op": "assert // check self.reserved_interest exists", "stack_out": [ @@ -40221,7 +43197,7 @@ "maybe_value%13#0" ] }, - "4299": { + "4601": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#1", @@ -40241,8 +43217,8 @@ "0" ] }, - "4300": { - "op": "bytec 11 // \"reserved_principal\"", + "4602": { + "op": "bytec 12 // \"reserved_principal\"", "defined_out": [ "\"reserved_principal\"", "0", @@ -40280,7 +43256,7 @@ "\"reserved_principal\"" ] }, - "4302": { + "4604": { "op": "app_global_get_ex", "defined_out": [ "aggregate%uint8%0#0", @@ -40319,7 +43295,7 @@ "maybe_exists%14#0" ] }, - "4303": { + "4605": { "error": "check self.reserved_principal exists", "op": "assert // check self.reserved_principal exists", "stack_out": [ @@ -40340,7 +43316,7 @@ "maybe_value%14#0" ] }, - "4304": { + "4606": { "op": "uncover 14", "stack_out": [ "aggregate%uint8%0#0", @@ -40360,7 +43336,7 @@ "maybe_value%0#1" ] }, - "4306": { + "4608": { "op": "itob", "defined_out": [ "aggregate%uint8%0#0", @@ -40397,7 +43373,7 @@ "aggregate%val_as_bytes%1#0" ] }, - "4307": { + "4609": { "op": "uncover 14", "stack_out": [ "maybe_value%2#0", @@ -40417,7 +43393,7 @@ "aggregate%uint8%0#0" ] }, - "4309": { + "4611": { "op": "swap", "stack_out": [ "maybe_value%2#0", @@ -40437,7 +43413,7 @@ "aggregate%val_as_bytes%1#0" ] }, - "4310": { + "4612": { "op": "concat", "defined_out": [ "aggregate%head%1#0", @@ -40472,7 +43448,7 @@ "aggregate%head%1#0" ] }, - "4311": { + "4613": { "op": "uncover 13", "stack_out": [ "maybe_value%3#0", @@ -40491,7 +43467,7 @@ "maybe_value%2#0" ] }, - "4313": { + "4615": { "op": "itob", "defined_out": [ "aggregate%head%1#0", @@ -40526,7 +43502,7 @@ "aggregate%val_as_bytes%2#0" ] }, - "4314": { + "4616": { "op": "concat", "defined_out": [ "aggregate%head%2#0", @@ -40559,7 +43535,7 @@ "aggregate%head%2#0" ] }, - "4315": { + "4617": { "op": "uncover 12", "stack_out": [ "maybe_value%4#0", @@ -40577,7 +43553,7 @@ "maybe_value%3#0" ] }, - "4317": { + "4619": { "op": "itob", "defined_out": [ "aggregate%head%2#0", @@ -40610,7 +43586,7 @@ "aggregate%val_as_bytes%3#0" ] }, - "4318": { + "4620": { "op": "concat", "defined_out": [ "aggregate%head%3#0", @@ -40641,7 +43617,7 @@ "aggregate%head%3#0" ] }, - "4319": { + "4621": { "op": "uncover 11", "stack_out": [ "maybe_value%5#0", @@ -40658,7 +43634,7 @@ "maybe_value%4#0" ] }, - "4321": { + "4623": { "op": "itob", "defined_out": [ "aggregate%head%3#0", @@ -40689,7 +43665,7 @@ "aggregate%val_as_bytes%4#0" ] }, - "4322": { + "4624": { "op": "concat", "defined_out": [ "aggregate%head%4#0", @@ -40718,7 +43694,7 @@ "aggregate%head%4#0" ] }, - "4323": { + "4625": { "op": "uncover 10", "stack_out": [ "maybe_value%6#0", @@ -40734,7 +43710,7 @@ "maybe_value%5#0" ] }, - "4325": { + "4627": { "op": "itob", "defined_out": [ "aggregate%head%4#0", @@ -40763,7 +43739,7 @@ "aggregate%val_as_bytes%5#0" ] }, - "4326": { + "4628": { "op": "concat", "defined_out": [ "aggregate%head%5#0", @@ -40790,7 +43766,7 @@ "aggregate%head%5#0" ] }, - "4327": { + "4629": { "op": "uncover 9", "stack_out": [ "maybe_value%7#0", @@ -40805,7 +43781,7 @@ "maybe_value%6#0" ] }, - "4329": { + "4631": { "op": "itob", "defined_out": [ "aggregate%head%5#0", @@ -40832,7 +43808,7 @@ "aggregate%val_as_bytes%6#0" ] }, - "4330": { + "4632": { "op": "concat", "defined_out": [ "aggregate%head%6#0", @@ -40857,7 +43833,7 @@ "aggregate%head%6#0" ] }, - "4331": { + "4633": { "op": "uncover 8", "stack_out": [ "maybe_value%8#0", @@ -40871,7 +43847,7 @@ "maybe_value%7#0" ] }, - "4333": { + "4635": { "op": "itob", "defined_out": [ "aggregate%head%6#0", @@ -40896,7 +43872,7 @@ "aggregate%val_as_bytes%7#0" ] }, - "4334": { + "4636": { "op": "concat", "defined_out": [ "aggregate%head%7#0", @@ -40919,7 +43895,7 @@ "aggregate%head%7#0" ] }, - "4335": { + "4637": { "op": "uncover 7", "stack_out": [ "maybe_value%9#0", @@ -40932,7 +43908,7 @@ "maybe_value%8#0" ] }, - "4337": { + "4639": { "op": "itob", "defined_out": [ "aggregate%head%7#0", @@ -40955,7 +43931,7 @@ "aggregate%val_as_bytes%8#0" ] }, - "4338": { + "4640": { "op": "concat", "defined_out": [ "aggregate%head%8#0", @@ -40976,7 +43952,7 @@ "aggregate%head%8#0" ] }, - "4339": { + "4641": { "op": "uncover 6", "stack_out": [ "maybe_value%10#0", @@ -40988,7 +43964,7 @@ "maybe_value%9#0" ] }, - "4341": { + "4643": { "op": "itob", "defined_out": [ "aggregate%head%8#0", @@ -41009,7 +43985,7 @@ "aggregate%val_as_bytes%9#0" ] }, - "4342": { + "4644": { "op": "concat", "defined_out": [ "aggregate%head%9#0", @@ -41028,7 +44004,7 @@ "aggregate%head%9#0" ] }, - "4343": { + "4645": { "op": "uncover 5", "stack_out": [ "maybe_value%11#0", @@ -41039,7 +44015,7 @@ "maybe_value%10#0" ] }, - "4345": { + "4647": { "op": "itob", "defined_out": [ "aggregate%head%9#0", @@ -41058,7 +44034,7 @@ "aggregate%val_as_bytes%10#0" ] }, - "4346": { + "4648": { "op": "concat", "defined_out": [ "aggregate%head%10#0", @@ -41075,7 +44051,7 @@ "aggregate%head%10#0" ] }, - "4347": { + "4649": { "op": "uncover 4", "stack_out": [ "maybe_value%12#0", @@ -41085,7 +44061,7 @@ "maybe_value%11#0" ] }, - "4349": { + "4651": { "op": "itob", "defined_out": [ "aggregate%head%10#0", @@ -41102,7 +44078,7 @@ "aggregate%val_as_bytes%11#0" ] }, - "4350": { + "4652": { "op": "concat", "defined_out": [ "aggregate%head%11#0", @@ -41117,7 +44093,7 @@ "aggregate%head%11#0" ] }, - "4351": { + "4653": { "op": "uncover 3", "stack_out": [ "maybe_value%13#0", @@ -41126,7 +44102,7 @@ "maybe_value%12#0" ] }, - "4353": { + "4655": { "op": "itob", "defined_out": [ "aggregate%head%11#0", @@ -41141,7 +44117,7 @@ "aggregate%val_as_bytes%12#0" ] }, - "4354": { + "4656": { "op": "concat", "defined_out": [ "aggregate%head%12#0", @@ -41154,7 +44130,7 @@ "aggregate%head%12#0" ] }, - "4355": { + "4657": { "op": "uncover 2", "stack_out": [ "maybe_value%14#0", @@ -41162,7 +44138,7 @@ "maybe_value%13#0" ] }, - "4357": { + "4659": { "op": "itob", "defined_out": [ "aggregate%head%12#0", @@ -41175,7 +44151,7 @@ "aggregate%val_as_bytes%13#0" ] }, - "4358": { + "4660": { "op": "concat", "defined_out": [ "aggregate%head%13#0", @@ -41186,14 +44162,14 @@ "aggregate%head%13#0" ] }, - "4359": { + "4661": { "op": "swap", "stack_out": [ "aggregate%head%13#0", "maybe_value%14#0" ] }, - "4360": { + "4662": { "op": "itob", "defined_out": [ "aggregate%head%13#0", @@ -41204,7 +44180,7 @@ "aggregate%val_as_bytes%14#0" ] }, - "4361": { + "4663": { "op": "concat", "defined_out": [ "aggregate%head%14#0" @@ -41213,7 +44189,7 @@ "aggregate%head%14#0" ] }, - "4362": { + "4664": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -41224,14 +44200,14 @@ "0x151f7c75" ] }, - "4363": { + "4665": { "op": "swap", "stack_out": [ "0x151f7c75", "aggregate%head%14#0" ] }, - "4364": { + "4666": { "op": "concat", "defined_out": [ "tmp%1#0" @@ -41240,11 +44216,11 @@ "tmp%1#0" ] }, - "4365": { + "4667": { "op": "log", "stack_out": [] }, - "4366": { + "4668": { "op": "intc_1 // 1", "defined_out": [ "1" @@ -41253,11 +44229,11 @@ "1" ] }, - "4367": { + "4669": { "op": "return", "stack_out": [] }, - "4368": { + "4670": { "subroutine": "modules.actus_kernel.ActusKernelModule.contract_get_next_due_event[routing]", "params": {}, "block": "contract_get_next_due_event", @@ -41270,7 +44246,7 @@ "0" ] }, - "4369": { + "4671": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"", @@ -41281,7 +44257,7 @@ "\"status\"" ] }, - "4370": { + "4672": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -41292,25 +44268,25 @@ "maybe_exists%0#0" ] }, - "4371": { + "4673": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ "maybe_value%0#0" ] }, - "4372": { + "4674": { "error": "D-ASA not configured", "op": "assert // D-ASA not configured", "stack_out": [] }, - "4373": { + "4675": { "op": "intc_0 // 0", "stack_out": [ "0" ] }, - "4374": { + "4676": { "op": "bytec_2 // \"event_cursor\"", "defined_out": [ "\"event_cursor\"", @@ -41321,29 +44297,29 @@ "\"event_cursor\"" ] }, - "4375": { + "4677": { "op": "app_global_get_ex", "stack_out": [ "maybe_value%0#0", "maybe_exists%0#0" ] }, - "4376": { + "4678": { "error": "check self.event_cursor exists", "op": "assert // check self.event_cursor exists", "stack_out": [ "maybe_value%0#0" ] }, - "4377": { + "4679": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#0", "0" ] }, - "4378": { - "op": "bytec 4 // \"schedule_entry_count\"", + "4680": { + "op": "bytec_3 // \"schedule_entry_count\"", "defined_out": [ "\"schedule_entry_count\"", "0", @@ -41355,7 +44331,7 @@ "\"schedule_entry_count\"" ] }, - "4380": { + "4681": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%1#0", @@ -41368,7 +44344,7 @@ "maybe_exists%1#0" ] }, - "4381": { + "4682": { "error": "check self.schedule_entry_count exists", "op": "assert // check self.schedule_entry_count exists", "stack_out": [ @@ -41376,7 +44352,7 @@ "maybe_value%1#0" ] }, - "4382": { + "4683": { "op": ">=", "defined_out": [ "tmp%0#1" @@ -41385,24 +44361,24 @@ "tmp%0#1" ] }, - "4383": { + "4684": { "op": "bz contract_get_next_due_event_after_if_else@3", "stack_out": [] }, - "4386": { + "4687": { "op": "intc_0 // 0", "stack_out": [ "0" ] }, - "4387": { + "4688": { "op": "bytec_2 // \"event_cursor\"", "stack_out": [ "0", "\"event_cursor\"" ] }, - "4388": { + "4689": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%2#0", @@ -41413,14 +44389,14 @@ "maybe_exists%2#0" ] }, - "4389": { + "4690": { "error": "check self.event_cursor exists", "op": "assert // check self.event_cursor exists", "stack_out": [ "maybe_value%2#0" ] }, - "4390": { + "4691": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0" @@ -41429,7 +44405,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "4391": { + "4692": { "op": "bytec 40 // 0x00", "defined_out": [ "0x00", @@ -41440,7 +44416,7 @@ "0x00" ] }, - "4393": { + "4694": { "op": "concat", "defined_out": [ "aggregate%head%1#0" @@ -41449,14 +44425,14 @@ "aggregate%head%1#0" ] }, - "4394": { + "4695": { "op": "intc_0 // 0", "stack_out": [ "aggregate%head%1#0", "0" ] }, - "4395": { + "4696": { "op": "itob", "defined_out": [ "aggregate%head%1#0", @@ -41467,14 +44443,14 @@ "aggregate%val_as_bytes%1#0" ] }, - "4396": { + "4697": { "op": "swap", "stack_out": [ "aggregate%val_as_bytes%1#0", "aggregate%head%1#0" ] }, - "4397": { + "4698": { "op": "dig 1", "defined_out": [ "aggregate%head%1#0", @@ -41487,7 +44463,7 @@ "aggregate%val_as_bytes%1#0 (copy)" ] }, - "4399": { + "4700": { "op": "concat", "defined_out": [ "aggregate%head%2#0", @@ -41498,7 +44474,7 @@ "aggregate%head%2#0" ] }, - "4400": { + "4701": { "op": "dig 1", "stack_out": [ "aggregate%val_as_bytes%1#0", @@ -41506,7 +44482,7 @@ "aggregate%val_as_bytes%1#0 (copy)" ] }, - "4402": { + "4703": { "op": "concat", "defined_out": [ "aggregate%head%3#0", @@ -41517,7 +44493,7 @@ "aggregate%head%3#0" ] }, - "4403": { + "4704": { "op": "dig 1", "stack_out": [ "aggregate%val_as_bytes%1#0", @@ -41525,7 +44501,7 @@ "aggregate%val_as_bytes%1#0 (copy)" ] }, - "4405": { + "4706": { "op": "concat", "defined_out": [ "aggregate%head%4#0", @@ -41536,7 +44512,7 @@ "aggregate%head%4#0" ] }, - "4406": { + "4707": { "op": "dig 1", "stack_out": [ "aggregate%val_as_bytes%1#0", @@ -41544,7 +44520,7 @@ "aggregate%val_as_bytes%1#0 (copy)" ] }, - "4408": { + "4709": { "op": "concat", "defined_out": [ "aggregate%head%5#0", @@ -41555,7 +44531,7 @@ "aggregate%head%5#0" ] }, - "4409": { + "4710": { "op": "dig 1", "stack_out": [ "aggregate%val_as_bytes%1#0", @@ -41563,7 +44539,7 @@ "aggregate%val_as_bytes%1#0 (copy)" ] }, - "4411": { + "4712": { "op": "concat", "defined_out": [ "aggregate%head%6#0", @@ -41574,7 +44550,7 @@ "aggregate%head%6#0" ] }, - "4412": { + "4713": { "op": "dig 1", "stack_out": [ "aggregate%val_as_bytes%1#0", @@ -41582,7 +44558,7 @@ "aggregate%val_as_bytes%1#0 (copy)" ] }, - "4414": { + "4715": { "op": "concat", "defined_out": [ "aggregate%head%7#0", @@ -41593,14 +44569,14 @@ "aggregate%head%7#0" ] }, - "4415": { + "4716": { "op": "swap", "stack_out": [ "aggregate%head%7#0", "aggregate%val_as_bytes%1#0" ] }, - "4416": { + "4717": { "op": "concat", "defined_out": [ "tmp%0#0" @@ -41609,7 +44585,7 @@ "tmp%0#0" ] }, - "4417": { + "4718": { "block": "contract_get_next_due_event_after_inlined_modules.actus_kernel.ActusKernelModule.contract_get_next_due_event@4", "stack_in": [ "tmp%0#0" @@ -41623,7 +44599,7 @@ "0x151f7c75" ] }, - "4418": { + "4719": { "op": "swap", "defined_out": [ "0x151f7c75", @@ -41634,7 +44610,7 @@ "tmp%0#0" ] }, - "4419": { + "4720": { "op": "concat", "defined_out": [ "tmp%1#0" @@ -41643,11 +44619,11 @@ "tmp%1#0" ] }, - "4420": { + "4721": { "op": "log", "stack_out": [] }, - "4421": { + "4722": { "op": "intc_1 // 1", "defined_out": [ "1" @@ -41656,11 +44632,11 @@ "1" ] }, - "4422": { + "4723": { "op": "return", "stack_out": [] }, - "4423": { + "4724": { "block": "contract_get_next_due_event_after_if_else@3", "stack_in": [], "op": "intc_0 // 0", @@ -41671,7 +44647,7 @@ "0" ] }, - "4424": { + "4725": { "op": "bytec_2 // \"event_cursor\"", "defined_out": [ "\"event_cursor\"", @@ -41682,7 +44658,7 @@ "\"event_cursor\"" ] }, - "4425": { + "4726": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%3#0", @@ -41693,14 +44669,14 @@ "maybe_exists%3#0" ] }, - "4426": { + "4727": { "error": "check self.event_cursor exists", "op": "assert // check self.event_cursor exists", "stack_out": [ "maybe_value%3#0" ] }, - "4427": { + "4728": { "callsub": "modules.actus_kernel.ActusKernelModule._get_schedule_entry", "op": "callsub _get_schedule_entry", "defined_out": [ @@ -41710,10 +44686,10 @@ "tmp%0#0" ] }, - "4430": { + "4731": { "op": "b contract_get_next_due_event_after_inlined_modules.actus_kernel.ActusKernelModule.contract_get_next_due_event@4" }, - "4433": { + "4734": { "subroutine": "modules.rbac.RbacModule.contract_update[routing]", "params": {}, "block": "contract_update", @@ -41721,7 +44697,7 @@ "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", "op": "callsub _assert_caller_is_arranger" }, - "4436": { + "4737": { "op": "intc_1 // 1", "defined_out": [ "1" @@ -41730,11 +44706,11 @@ "1" ] }, - "4437": { + "4738": { "op": "return", "stack_out": [] }, - "4438": { + "4739": { "subroutine": "modules.rbac.RbacModule.rbac_rotate_arranger[routing]", "params": {}, "block": "rbac_rotate_arranger", @@ -41747,7 +44723,7 @@ "new_arranger#0" ] }, - "4441": { + "4742": { "op": "dup", "defined_out": [ "new_arranger#0", @@ -41758,7 +44734,7 @@ "new_arranger#0 (copy)" ] }, - "4442": { + "4743": { "op": "len", "defined_out": [ "len%0#0", @@ -41769,7 +44745,7 @@ "len%0#0" ] }, - "4443": { + "4744": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -41782,7 +44758,7 @@ "32" ] }, - "4444": { + "4745": { "op": "==", "defined_out": [ "eq%0#0", @@ -41793,18 +44769,18 @@ "eq%0#0" ] }, - "4445": { + "4746": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ "new_arranger#0" ] }, - "4446": { + "4747": { "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", "op": "callsub _assert_caller_is_arranger" }, - "4449": { + "4750": { "op": "bytec 18 // 0x5223417272616e67657223", "defined_out": [ "0x5223417272616e67657223", @@ -41815,18 +44791,18 @@ "0x5223417272616e67657223" ] }, - "4451": { + "4752": { "op": "swap", "stack_out": [ "0x5223417272616e67657223", "new_arranger#0" ] }, - "4452": { + "4753": { "op": "app_global_put", "stack_out": [] }, - "4453": { + "4754": { "op": "global LatestTimestamp", "defined_out": [ "tmp%0#1" @@ -41835,7 +44811,7 @@ "tmp%0#1" ] }, - "4455": { + "4756": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0" @@ -41844,7 +44820,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "4456": { + "4757": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -41855,14 +44831,14 @@ "0x151f7c75" ] }, - "4457": { + "4758": { "op": "swap", "stack_out": [ "0x151f7c75", "aggregate%val_as_bytes%0#0" ] }, - "4458": { + "4759": { "op": "concat", "defined_out": [ "tmp%4#0" @@ -41871,11 +44847,11 @@ "tmp%4#0" ] }, - "4459": { + "4760": { "op": "log", "stack_out": [] }, - "4460": { + "4761": { "op": "intc_1 // 1", "defined_out": [ "1" @@ -41884,11 +44860,11 @@ "1" ] }, - "4461": { + "4762": { "op": "return", "stack_out": [] }, - "4462": { + "4763": { "subroutine": "modules.rbac.RbacModule.rbac_set_op_daemon[routing]", "params": {}, "block": "rbac_set_op_daemon", @@ -41901,7 +44877,7 @@ "address#0" ] }, - "4465": { + "4766": { "op": "dup", "defined_out": [ "address#0", @@ -41912,7 +44888,7 @@ "address#0 (copy)" ] }, - "4466": { + "4767": { "op": "len", "defined_out": [ "address#0", @@ -41923,7 +44899,7 @@ "len%0#0" ] }, - "4467": { + "4768": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -41936,7 +44912,7 @@ "32" ] }, - "4468": { + "4769": { "op": "==", "defined_out": [ "address#0", @@ -41947,19 +44923,19 @@ "eq%0#0" ] }, - "4469": { + "4770": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ "address#0" ] }, - "4470": { + "4771": { "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", "op": "callsub _assert_caller_is_arranger" }, - "4473": { - "op": "bytec 25 // 0x52234f704461656d6f6e23", + "4774": { + "op": "bytec 26 // 0x52234f704461656d6f6e23", "defined_out": [ "0x52234f704461656d6f6e23", "address#0" @@ -41969,18 +44945,18 @@ "0x52234f704461656d6f6e23" ] }, - "4475": { + "4776": { "op": "swap", "stack_out": [ "0x52234f704461656d6f6e23", "address#0" ] }, - "4476": { + "4777": { "op": "app_global_put", "stack_out": [] }, - "4477": { + "4778": { "op": "global LatestTimestamp", "defined_out": [ "tmp%0#1" @@ -41989,7 +44965,7 @@ "tmp%0#1" ] }, - "4479": { + "4780": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0" @@ -41998,7 +44974,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "4480": { + "4781": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -42009,14 +44985,14 @@ "0x151f7c75" ] }, - "4481": { + "4782": { "op": "swap", "stack_out": [ "0x151f7c75", "aggregate%val_as_bytes%0#0" ] }, - "4482": { + "4783": { "op": "concat", "defined_out": [ "tmp%4#0" @@ -42025,11 +45001,11 @@ "tmp%4#0" ] }, - "4483": { + "4784": { "op": "log", "stack_out": [] }, - "4484": { + "4785": { "op": "intc_1 // 1", "defined_out": [ "1" @@ -42038,11 +45014,11 @@ "1" ] }, - "4485": { + "4786": { "op": "return", "stack_out": [] }, - "4486": { + "4787": { "subroutine": "modules.rbac.RbacModule.rbac_assign_role[routing]", "params": {}, "block": "rbac_assign_role", @@ -42055,7 +45031,7 @@ "role_id#0" ] }, - "4489": { + "4790": { "op": "dup", "defined_out": [ "role_id#0", @@ -42066,7 +45042,7 @@ "role_id#0 (copy)" ] }, - "4490": { + "4791": { "op": "len", "defined_out": [ "len%0#0", @@ -42077,7 +45053,7 @@ "len%0#0" ] }, - "4491": { + "4792": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -42090,7 +45066,7 @@ "1" ] }, - "4492": { + "4793": { "op": "==", "defined_out": [ "eq%0#0", @@ -42101,17 +45077,17 @@ "eq%0#0" ] }, - "4493": { + "4794": { "error": "invalid number of bytes for arc4.uint8", "op": "assert // invalid number of bytes for arc4.uint8", "stack_out": [ "role_id#0" ] }, - "4494": { + "4795": { "op": "txna ApplicationArgs 2" }, - "4497": { + "4798": { "op": "dup", "defined_out": [ "role_address#0", @@ -42123,7 +45099,7 @@ "role_address#0" ] }, - "4498": { + "4799": { "op": "cover 2", "defined_out": [ "role_address#0", @@ -42135,7 +45111,7 @@ "role_address#0" ] }, - "4500": { + "4801": { "op": "len", "defined_out": [ "len%1#0", @@ -42148,7 +45124,7 @@ "len%1#0" ] }, - "4501": { + "4802": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -42163,7 +45139,7 @@ "32" ] }, - "4502": { + "4803": { "op": "==", "defined_out": [ "eq%1#0", @@ -42176,7 +45152,7 @@ "eq%1#0" ] }, - "4503": { + "4804": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ @@ -42184,10 +45160,10 @@ "role_id#0" ] }, - "4504": { + "4805": { "op": "txna ApplicationArgs 3" }, - "4507": { + "4808": { "op": "dup", "defined_out": [ "role_address#0", @@ -42201,7 +45177,7 @@ "validity#0" ] }, - "4508": { + "4809": { "op": "cover 2", "defined_out": [ "role_address#0", @@ -42215,7 +45191,7 @@ "validity#0" ] }, - "4510": { + "4811": { "op": "len", "defined_out": [ "len%2#0", @@ -42230,7 +45206,7 @@ "len%2#0" ] }, - "4511": { + "4812": { "op": "pushint 16", "defined_out": [ "16", @@ -42247,7 +45223,7 @@ "16" ] }, - "4513": { + "4814": { "op": "==", "defined_out": [ "eq%2#0", @@ -42262,7 +45238,7 @@ "eq%2#0" ] }, - "4514": { + "4815": { "error": "invalid number of bytes for smart_contracts.abi_types.RoleValidity", "op": "assert // invalid number of bytes for smart_contracts.abi_types.RoleValidity", "stack_out": [ @@ -42271,15 +45247,15 @@ "role_id#0" ] }, - "4515": { + "4816": { "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", "op": "callsub _assert_caller_is_arranger" }, - "4518": { + "4819": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", "op": "callsub _assert_is_not_asset_defaulted" }, - "4521": { + "4822": { "op": "btoi", "defined_out": [ "role_address#0", @@ -42292,7 +45268,7 @@ "role_id#1" ] }, - "4522": { + "4823": { "op": "dupn 2", "defined_out": [ "role_address#0", @@ -42308,7 +45284,7 @@ "role_id#1 (copy)" ] }, - "4524": { + "4825": { "callsub": "modules.rbac.RbacModule._assert_valid_role", "op": "callsub _assert_valid_role", "stack_out": [ @@ -42318,7 +45294,7 @@ "role_id#1" ] }, - "4527": { + "4828": { "op": "pushint 20", "defined_out": [ "20", @@ -42334,7 +45310,7 @@ "20" ] }, - "4529": { + "4830": { "op": "==", "defined_out": [ "role_address#0", @@ -42349,7 +45325,7 @@ "tmp%0#2" ] }, - "4530": { + "4831": { "op": "bz rbac_assign_role_after_if_else@3", "stack_out": [ "role_address#0", @@ -42357,7 +45333,7 @@ "role_id#1" ] }, - "4533": { + "4834": { "op": "bytec 18 // 0x5223417272616e67657223", "defined_out": [ "0x5223417272616e67657223", @@ -42372,7 +45348,7 @@ "0x5223417272616e67657223" ] }, - "4535": { + "4836": { "op": "dig 3", "stack_out": [ "role_address#0", @@ -42382,7 +45358,7 @@ "role_address#0" ] }, - "4537": { + "4838": { "op": "app_global_put", "stack_out": [ "role_address#0", @@ -42390,7 +45366,7 @@ "role_id#1" ] }, - "4538": { + "4839": { "block": "rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14", "stack_in": [ "role_address#0", @@ -42408,7 +45384,7 @@ "tmp%2#1" ] }, - "4540": { + "4841": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0" @@ -42420,7 +45396,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "4541": { + "4842": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -42434,7 +45410,7 @@ "0x151f7c75" ] }, - "4542": { + "4843": { "op": "swap", "stack_out": [ "role_address#0", @@ -42444,7 +45420,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "4543": { + "4844": { "op": "concat", "defined_out": [ "tmp%6#0" @@ -42456,7 +45432,7 @@ "tmp%6#0" ] }, - "4544": { + "4845": { "op": "log", "stack_out": [ "role_address#0", @@ -42464,7 +45440,7 @@ "role_id#1" ] }, - "4545": { + "4846": { "op": "intc_1 // 1", "defined_out": [ "1" @@ -42476,7 +45452,7 @@ "1" ] }, - "4546": { + "4847": { "op": "return", "stack_out": [ "role_address#0", @@ -42484,7 +45460,7 @@ "role_id#1" ] }, - "4547": { + "4848": { "block": "rbac_assign_role_after_if_else@3", "stack_in": [ "role_address#0", @@ -42502,7 +45478,7 @@ "role_id#1" ] }, - "4548": { + "4849": { "op": "pushint 40", "defined_out": [ "40", @@ -42516,7 +45492,7 @@ "40" ] }, - "4550": { + "4851": { "op": "==", "defined_out": [ "role_id#1", @@ -42529,7 +45505,7 @@ "tmp%1#1" ] }, - "4551": { + "4852": { "op": "bz rbac_assign_role_after_if_else@5", "stack_out": [ "role_address#0", @@ -42537,7 +45513,7 @@ "role_id#1" ] }, - "4554": { + "4855": { "op": "bytec 23 // 0x52234163636f756e744d616e6167657223", "defined_out": [ "0x52234163636f756e744d616e6167657223", @@ -42550,7 +45526,7 @@ "0x52234163636f756e744d616e6167657223" ] }, - "4556": { + "4857": { "op": "dig 3", "defined_out": [ "0x52234163636f756e744d616e6167657223", @@ -42565,7 +45541,7 @@ "role_address#0" ] }, - "4558": { + "4859": { "op": "concat", "defined_out": [ "box_prefixed_key%0#0", @@ -42579,7 +45555,7 @@ "box_prefixed_key%0#0" ] }, - "4559": { + "4860": { "op": "dup", "defined_out": [ "box_prefixed_key%0#0", @@ -42595,7 +45571,7 @@ "box_prefixed_key%0#0 (copy)" ] }, - "4560": { + "4861": { "op": "box_len", "defined_out": [ "_%0#0", @@ -42613,7 +45589,7 @@ "maybe_exists%0#0" ] }, - "4561": { + "4862": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -42623,7 +45599,7 @@ "maybe_exists%0#0" ] }, - "4563": { + "4864": { "op": "!", "defined_out": [ "box_prefixed_key%0#0", @@ -42639,7 +45615,7 @@ "tmp%2#2" ] }, - "4564": { + "4865": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -42649,7 +45625,7 @@ "box_prefixed_key%0#0" ] }, - "4565": { + "4866": { "op": "dig 2", "defined_out": [ "box_prefixed_key%0#0", @@ -42665,7 +45641,7 @@ "validity#0" ] }, - "4567": { + "4868": { "op": "box_put", "stack_out": [ "role_address#0", @@ -42673,10 +45649,10 @@ "role_id#1" ] }, - "4568": { + "4869": { "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14" }, - "4571": { + "4872": { "block": "rbac_assign_role_after_if_else@5", "stack_in": [ "role_address#0", @@ -42694,7 +45670,7 @@ "role_id#1" ] }, - "4572": { + "4873": { "op": "pushint 50", "defined_out": [ "50", @@ -42708,7 +45684,7 @@ "50" ] }, - "4574": { + "4875": { "op": "==", "defined_out": [ "role_id#1", @@ -42721,7 +45697,7 @@ "tmp%3#0" ] }, - "4575": { + "4876": { "op": "bz rbac_assign_role_after_if_else@7", "stack_out": [ "role_address#0", @@ -42729,7 +45705,7 @@ "role_id#1" ] }, - "4578": { + "4879": { "op": "bytec 22 // 0x52235072696d6172794465616c657223", "defined_out": [ "0x52235072696d6172794465616c657223", @@ -42742,7 +45718,7 @@ "0x52235072696d6172794465616c657223" ] }, - "4580": { + "4881": { "op": "dig 3", "defined_out": [ "0x52235072696d6172794465616c657223", @@ -42757,7 +45733,7 @@ "role_address#0" ] }, - "4582": { + "4883": { "op": "concat", "defined_out": [ "box_prefixed_key%2#0", @@ -42771,7 +45747,7 @@ "box_prefixed_key%2#0" ] }, - "4583": { + "4884": { "op": "dup", "defined_out": [ "box_prefixed_key%2#0", @@ -42787,7 +45763,7 @@ "box_prefixed_key%2#0 (copy)" ] }, - "4584": { + "4885": { "op": "box_len", "defined_out": [ "_%1#0", @@ -42805,7 +45781,7 @@ "maybe_exists%1#0" ] }, - "4585": { + "4886": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -42815,7 +45791,7 @@ "maybe_exists%1#0" ] }, - "4587": { + "4888": { "op": "!", "defined_out": [ "box_prefixed_key%2#0", @@ -42831,7 +45807,7 @@ "tmp%4#0" ] }, - "4588": { + "4889": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -42841,7 +45817,7 @@ "box_prefixed_key%2#0" ] }, - "4589": { + "4890": { "op": "dig 2", "defined_out": [ "box_prefixed_key%2#0", @@ -42857,7 +45833,7 @@ "validity#0" ] }, - "4591": { + "4892": { "op": "box_put", "stack_out": [ "role_address#0", @@ -42865,10 +45841,10 @@ "role_id#1" ] }, - "4592": { + "4893": { "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14" }, - "4595": { + "4896": { "block": "rbac_assign_role_after_if_else@7", "stack_in": [ "role_address#0", @@ -42886,7 +45862,7 @@ "role_id#1" ] }, - "4596": { + "4897": { "op": "pushint 60", "defined_out": [ "60", @@ -42900,7 +45876,7 @@ "60" ] }, - "4598": { + "4899": { "op": "==", "defined_out": [ "role_id#1", @@ -42913,7 +45889,7 @@ "tmp%5#1" ] }, - "4599": { + "4900": { "op": "bz rbac_assign_role_after_if_else@9", "stack_out": [ "role_address#0", @@ -42921,7 +45897,7 @@ "role_id#1" ] }, - "4602": { + "4903": { "op": "bytec 32 // 0x52235472757374656523", "defined_out": [ "0x52235472757374656523", @@ -42934,7 +45910,7 @@ "0x52235472757374656523" ] }, - "4604": { + "4905": { "op": "dig 3", "defined_out": [ "0x52235472757374656523", @@ -42949,7 +45925,7 @@ "role_address#0" ] }, - "4606": { + "4907": { "op": "concat", "defined_out": [ "box_prefixed_key%4#0", @@ -42963,7 +45939,7 @@ "box_prefixed_key%4#0" ] }, - "4607": { + "4908": { "op": "dup", "defined_out": [ "box_prefixed_key%4#0", @@ -42979,7 +45955,7 @@ "box_prefixed_key%4#0 (copy)" ] }, - "4608": { + "4909": { "op": "box_len", "defined_out": [ "_%2#0", @@ -42997,7 +45973,7 @@ "maybe_exists%2#0" ] }, - "4609": { + "4910": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -43007,7 +45983,7 @@ "maybe_exists%2#0" ] }, - "4611": { + "4912": { "op": "!", "defined_out": [ "box_prefixed_key%4#0", @@ -43023,7 +45999,7 @@ "tmp%6#1" ] }, - "4612": { + "4913": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -43033,7 +46009,7 @@ "box_prefixed_key%4#0" ] }, - "4613": { + "4914": { "op": "dig 2", "defined_out": [ "box_prefixed_key%4#0", @@ -43049,7 +46025,7 @@ "validity#0" ] }, - "4615": { + "4916": { "op": "box_put", "stack_out": [ "role_address#0", @@ -43057,10 +46033,10 @@ "role_id#1" ] }, - "4616": { + "4917": { "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14" }, - "4619": { + "4920": { "block": "rbac_assign_role_after_if_else@9", "stack_in": [ "role_address#0", @@ -43078,7 +46054,7 @@ "role_id#1" ] }, - "4620": { + "4921": { "op": "pushint 70", "defined_out": [ "70", @@ -43092,7 +46068,7 @@ "70" ] }, - "4622": { + "4923": { "op": "==", "defined_out": [ "role_id#1", @@ -43105,7 +46081,7 @@ "tmp%7#0" ] }, - "4623": { + "4924": { "op": "bz rbac_assign_role_after_if_else@11", "stack_out": [ "role_address#0", @@ -43113,7 +46089,7 @@ "role_id#1" ] }, - "4626": { + "4927": { "op": "bytec 21 // 0x5223417574686f7269747923", "defined_out": [ "0x5223417574686f7269747923", @@ -43126,7 +46102,7 @@ "0x5223417574686f7269747923" ] }, - "4628": { + "4929": { "op": "dig 3", "defined_out": [ "0x5223417574686f7269747923", @@ -43141,7 +46117,7 @@ "role_address#0" ] }, - "4630": { + "4931": { "op": "concat", "defined_out": [ "box_prefixed_key%6#0", @@ -43155,7 +46131,7 @@ "box_prefixed_key%6#0" ] }, - "4631": { + "4932": { "op": "dup", "defined_out": [ "box_prefixed_key%6#0", @@ -43171,7 +46147,7 @@ "box_prefixed_key%6#0 (copy)" ] }, - "4632": { + "4933": { "op": "box_len", "defined_out": [ "_%3#0", @@ -43189,7 +46165,7 @@ "maybe_exists%3#0" ] }, - "4633": { + "4934": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -43199,7 +46175,7 @@ "maybe_exists%3#0" ] }, - "4635": { + "4936": { "op": "!", "defined_out": [ "box_prefixed_key%6#0", @@ -43215,7 +46191,7 @@ "tmp%8#0" ] }, - "4636": { + "4937": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -43225,7 +46201,7 @@ "box_prefixed_key%6#0" ] }, - "4637": { + "4938": { "op": "dig 2", "defined_out": [ "box_prefixed_key%6#0", @@ -43241,7 +46217,7 @@ "validity#0" ] }, - "4639": { + "4940": { "op": "box_put", "stack_out": [ "role_address#0", @@ -43249,10 +46225,10 @@ "role_id#1" ] }, - "4640": { + "4941": { "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14" }, - "4643": { + "4944": { "block": "rbac_assign_role_after_if_else@11", "stack_in": [ "role_address#0", @@ -43270,7 +46246,7 @@ "role_id#1" ] }, - "4644": { + "4945": { "op": "pushint 80", "defined_out": [ "80", @@ -43284,7 +46260,7 @@ "80" ] }, - "4646": { + "4947": { "op": "==", "defined_out": [ "role_id#1", @@ -43297,7 +46273,7 @@ "tmp%9#0" ] }, - "4647": { + "4948": { "op": "bz rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14", "stack_out": [ "role_address#0", @@ -43305,8 +46281,8 @@ "role_id#1" ] }, - "4650": { - "op": "bytec 24 // 0x52234f6273657276657223", + "4951": { + "op": "bytec 25 // 0x52234f6273657276657223", "defined_out": [ "0x52234f6273657276657223", "role_id#1" @@ -43318,7 +46294,7 @@ "0x52234f6273657276657223" ] }, - "4652": { + "4953": { "op": "dig 3", "defined_out": [ "0x52234f6273657276657223", @@ -43333,7 +46309,7 @@ "role_address#0" ] }, - "4654": { + "4955": { "op": "concat", "defined_out": [ "box_prefixed_key%8#0", @@ -43347,7 +46323,7 @@ "box_prefixed_key%8#0" ] }, - "4655": { + "4956": { "op": "dup", "defined_out": [ "box_prefixed_key%8#0", @@ -43363,7 +46339,7 @@ "box_prefixed_key%8#0 (copy)" ] }, - "4656": { + "4957": { "op": "box_len", "defined_out": [ "_%4#0", @@ -43381,7 +46357,7 @@ "maybe_exists%4#0" ] }, - "4657": { + "4958": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -43391,7 +46367,7 @@ "maybe_exists%4#0" ] }, - "4659": { + "4960": { "op": "!", "defined_out": [ "box_prefixed_key%8#0", @@ -43407,7 +46383,7 @@ "tmp%10#0" ] }, - "4660": { + "4961": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -43417,7 +46393,7 @@ "box_prefixed_key%8#0" ] }, - "4661": { + "4962": { "op": "dig 2", "defined_out": [ "box_prefixed_key%8#0", @@ -43433,7 +46409,7 @@ "validity#0" ] }, - "4663": { + "4964": { "op": "box_put", "stack_out": [ "role_address#0", @@ -43441,10 +46417,10 @@ "role_id#1" ] }, - "4664": { + "4965": { "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14" }, - "4667": { + "4968": { "subroutine": "modules.rbac.RbacModule.rbac_revoke_role[routing]", "params": {}, "block": "rbac_revoke_role", @@ -43457,7 +46433,7 @@ "role_id#0" ] }, - "4670": { + "4971": { "op": "dup", "defined_out": [ "role_id#0", @@ -43468,7 +46444,7 @@ "role_id#0 (copy)" ] }, - "4671": { + "4972": { "op": "len", "defined_out": [ "len%0#0", @@ -43479,7 +46455,7 @@ "len%0#0" ] }, - "4672": { + "4973": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -43492,7 +46468,7 @@ "1" ] }, - "4673": { + "4974": { "op": "==", "defined_out": [ "eq%0#0", @@ -43503,17 +46479,17 @@ "eq%0#0" ] }, - "4674": { + "4975": { "error": "invalid number of bytes for arc4.uint8", "op": "assert // invalid number of bytes for arc4.uint8", "stack_out": [ "role_id#0" ] }, - "4675": { + "4976": { "op": "txna ApplicationArgs 2" }, - "4678": { + "4979": { "op": "dup", "defined_out": [ "role_address#0", @@ -43525,7 +46501,7 @@ "role_address#0" ] }, - "4679": { + "4980": { "op": "cover 2", "defined_out": [ "role_address#0", @@ -43537,7 +46513,7 @@ "role_address#0" ] }, - "4681": { + "4982": { "op": "len", "defined_out": [ "len%1#0", @@ -43550,7 +46526,7 @@ "len%1#0" ] }, - "4682": { + "4983": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -43565,7 +46541,7 @@ "32" ] }, - "4683": { + "4984": { "op": "==", "defined_out": [ "eq%1#0", @@ -43578,7 +46554,7 @@ "eq%1#0" ] }, - "4684": { + "4985": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ @@ -43586,15 +46562,15 @@ "role_id#0" ] }, - "4685": { + "4986": { "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", "op": "callsub _assert_caller_is_arranger" }, - "4688": { + "4989": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", "op": "callsub _assert_is_not_asset_defaulted" }, - "4691": { + "4992": { "op": "btoi", "defined_out": [ "role_address#0", @@ -43605,7 +46581,7 @@ "role_id#1" ] }, - "4692": { + "4993": { "op": "dupn 2", "defined_out": [ "role_address#0", @@ -43619,7 +46595,7 @@ "role_id#1 (copy)" ] }, - "4694": { + "4995": { "callsub": "modules.rbac.RbacModule._assert_valid_role", "op": "callsub _assert_valid_role", "stack_out": [ @@ -43628,7 +46604,7 @@ "role_id#1" ] }, - "4697": { + "4998": { "op": "dup", "stack_out": [ "role_address#0", @@ -43637,7 +46613,7 @@ "role_id#1 (copy)" ] }, - "4698": { + "4999": { "op": "pushint 20", "defined_out": [ "20", @@ -43653,7 +46629,7 @@ "20" ] }, - "4700": { + "5001": { "op": "!=", "defined_out": [ "role_address#0", @@ -43667,7 +46643,7 @@ "tmp%0#2" ] }, - "4701": { + "5002": { "error": "Invalid role identifier", "op": "assert // Invalid role identifier", "stack_out": [ @@ -43676,7 +46652,7 @@ "role_id#1" ] }, - "4702": { + "5003": { "op": "pushint 40", "defined_out": [ "40", @@ -43690,7 +46666,7 @@ "40" ] }, - "4704": { + "5005": { "op": "==", "defined_out": [ "role_address#0", @@ -43703,14 +46679,14 @@ "tmp%1#1" ] }, - "4705": { + "5006": { "op": "bz rbac_revoke_role_after_if_else@3", "stack_out": [ "role_address#0", "role_id#1" ] }, - "4708": { + "5009": { "op": "bytec 23 // 0x52234163636f756e744d616e6167657223", "defined_out": [ "0x52234163636f756e744d616e6167657223", @@ -43723,7 +46699,7 @@ "0x52234163636f756e744d616e6167657223" ] }, - "4710": { + "5011": { "op": "dig 2", "stack_out": [ "role_address#0", @@ -43732,7 +46708,7 @@ "role_address#0" ] }, - "4712": { + "5013": { "op": "concat", "defined_out": [ "box_prefixed_key%0#0", @@ -43745,7 +46721,7 @@ "box_prefixed_key%0#0" ] }, - "4713": { + "5014": { "op": "dup", "defined_out": [ "box_prefixed_key%0#0", @@ -43760,7 +46736,7 @@ "box_prefixed_key%0#0 (copy)" ] }, - "4714": { + "5015": { "op": "box_len", "defined_out": [ "_%0#0", @@ -43777,7 +46753,7 @@ "maybe_exists%0#0" ] }, - "4715": { + "5016": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -43786,7 +46762,7 @@ "maybe_exists%0#0" ] }, - "4717": { + "5018": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -43795,7 +46771,7 @@ "box_prefixed_key%0#0" ] }, - "4718": { + "5019": { "op": "box_del", "defined_out": [ "role_address#0", @@ -43808,14 +46784,14 @@ "{box_del}" ] }, - "4719": { + "5020": { "op": "pop", "stack_out": [ "role_address#0", "role_id#1" ] }, - "4720": { + "5021": { "block": "rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12", "stack_in": [ "role_address#0", @@ -43831,7 +46807,7 @@ "tmp%2#1" ] }, - "4722": { + "5023": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0" @@ -43842,7 +46818,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "4723": { + "5024": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -43855,7 +46831,7 @@ "0x151f7c75" ] }, - "4724": { + "5025": { "op": "swap", "stack_out": [ "role_address#0", @@ -43864,7 +46840,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "4725": { + "5026": { "op": "concat", "defined_out": [ "tmp%5#0" @@ -43875,14 +46851,14 @@ "tmp%5#0" ] }, - "4726": { + "5027": { "op": "log", "stack_out": [ "role_address#0", "role_id#1" ] }, - "4727": { + "5028": { "op": "intc_1 // 1", "defined_out": [ "1" @@ -43893,14 +46869,14 @@ "1" ] }, - "4728": { + "5029": { "op": "return", "stack_out": [ "role_address#0", "role_id#1" ] }, - "4729": { + "5030": { "block": "rbac_revoke_role_after_if_else@3", "stack_in": [ "role_address#0", @@ -43916,7 +46892,7 @@ "role_id#1" ] }, - "4730": { + "5031": { "op": "pushint 50", "defined_out": [ "50", @@ -43929,7 +46905,7 @@ "50" ] }, - "4732": { + "5033": { "op": "==", "defined_out": [ "role_id#1", @@ -43941,14 +46917,14 @@ "tmp%2#2" ] }, - "4733": { + "5034": { "op": "bz rbac_revoke_role_after_if_else@5", "stack_out": [ "role_address#0", "role_id#1" ] }, - "4736": { + "5037": { "op": "bytec 22 // 0x52235072696d6172794465616c657223", "defined_out": [ "0x52235072696d6172794465616c657223", @@ -43960,7 +46936,7 @@ "0x52235072696d6172794465616c657223" ] }, - "4738": { + "5039": { "op": "dig 2", "defined_out": [ "0x52235072696d6172794465616c657223", @@ -43974,7 +46950,7 @@ "role_address#0" ] }, - "4740": { + "5041": { "op": "concat", "defined_out": [ "box_prefixed_key%2#0", @@ -43987,7 +46963,7 @@ "box_prefixed_key%2#0" ] }, - "4741": { + "5042": { "op": "dup", "defined_out": [ "box_prefixed_key%2#0", @@ -44002,7 +46978,7 @@ "box_prefixed_key%2#0 (copy)" ] }, - "4742": { + "5043": { "op": "box_len", "defined_out": [ "_%1#0", @@ -44019,7 +46995,7 @@ "maybe_exists%1#0" ] }, - "4743": { + "5044": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -44028,7 +47004,7 @@ "maybe_exists%1#0" ] }, - "4745": { + "5046": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -44037,7 +47013,7 @@ "box_prefixed_key%2#0" ] }, - "4746": { + "5047": { "op": "box_del", "defined_out": [ "role_address#0", @@ -44050,17 +47026,17 @@ "{box_del}" ] }, - "4747": { + "5048": { "op": "pop", "stack_out": [ "role_address#0", "role_id#1" ] }, - "4748": { + "5049": { "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" }, - "4751": { + "5052": { "block": "rbac_revoke_role_after_if_else@5", "stack_in": [ "role_address#0", @@ -44076,7 +47052,7 @@ "role_id#1" ] }, - "4752": { + "5053": { "op": "pushint 60", "defined_out": [ "60", @@ -44089,7 +47065,7 @@ "60" ] }, - "4754": { + "5055": { "op": "==", "defined_out": [ "role_id#1", @@ -44101,14 +47077,14 @@ "tmp%3#0" ] }, - "4755": { + "5056": { "op": "bz rbac_revoke_role_after_if_else@7", "stack_out": [ "role_address#0", "role_id#1" ] }, - "4758": { + "5059": { "op": "bytec 32 // 0x52235472757374656523", "defined_out": [ "0x52235472757374656523", @@ -44120,7 +47096,7 @@ "0x52235472757374656523" ] }, - "4760": { + "5061": { "op": "dig 2", "defined_out": [ "0x52235472757374656523", @@ -44134,7 +47110,7 @@ "role_address#0" ] }, - "4762": { + "5063": { "op": "concat", "defined_out": [ "box_prefixed_key%4#0", @@ -44147,7 +47123,7 @@ "box_prefixed_key%4#0" ] }, - "4763": { + "5064": { "op": "dup", "defined_out": [ "box_prefixed_key%4#0", @@ -44162,7 +47138,7 @@ "box_prefixed_key%4#0 (copy)" ] }, - "4764": { + "5065": { "op": "box_len", "defined_out": [ "_%2#0", @@ -44179,7 +47155,7 @@ "maybe_exists%2#0" ] }, - "4765": { + "5066": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -44188,7 +47164,7 @@ "maybe_exists%2#0" ] }, - "4767": { + "5068": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -44197,7 +47173,7 @@ "box_prefixed_key%4#0" ] }, - "4768": { + "5069": { "op": "box_del", "defined_out": [ "role_address#0", @@ -44210,17 +47186,17 @@ "{box_del}" ] }, - "4769": { + "5070": { "op": "pop", "stack_out": [ "role_address#0", "role_id#1" ] }, - "4770": { + "5071": { "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" }, - "4773": { + "5074": { "block": "rbac_revoke_role_after_if_else@7", "stack_in": [ "role_address#0", @@ -44236,7 +47212,7 @@ "role_id#1" ] }, - "4774": { + "5075": { "op": "pushint 70", "defined_out": [ "70", @@ -44249,7 +47225,7 @@ "70" ] }, - "4776": { + "5077": { "op": "==", "defined_out": [ "role_id#1", @@ -44261,14 +47237,14 @@ "tmp%4#1" ] }, - "4777": { + "5078": { "op": "bz rbac_revoke_role_after_if_else@9", "stack_out": [ "role_address#0", "role_id#1" ] }, - "4780": { + "5081": { "op": "bytec 21 // 0x5223417574686f7269747923", "defined_out": [ "0x5223417574686f7269747923", @@ -44280,7 +47256,7 @@ "0x5223417574686f7269747923" ] }, - "4782": { + "5083": { "op": "dig 2", "defined_out": [ "0x5223417574686f7269747923", @@ -44294,7 +47270,7 @@ "role_address#0" ] }, - "4784": { + "5085": { "op": "concat", "defined_out": [ "box_prefixed_key%6#0", @@ -44307,7 +47283,7 @@ "box_prefixed_key%6#0" ] }, - "4785": { + "5086": { "op": "dup", "defined_out": [ "box_prefixed_key%6#0", @@ -44322,7 +47298,7 @@ "box_prefixed_key%6#0 (copy)" ] }, - "4786": { + "5087": { "op": "box_len", "defined_out": [ "_%3#0", @@ -44339,7 +47315,7 @@ "maybe_exists%3#0" ] }, - "4787": { + "5088": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -44348,7 +47324,7 @@ "maybe_exists%3#0" ] }, - "4789": { + "5090": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -44357,7 +47333,7 @@ "box_prefixed_key%6#0" ] }, - "4790": { + "5091": { "op": "box_del", "defined_out": [ "role_address#0", @@ -44370,17 +47346,17 @@ "{box_del}" ] }, - "4791": { + "5092": { "op": "pop", "stack_out": [ "role_address#0", "role_id#1" ] }, - "4792": { + "5093": { "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" }, - "4795": { + "5096": { "block": "rbac_revoke_role_after_if_else@9", "stack_in": [ "role_address#0", @@ -44396,7 +47372,7 @@ "role_id#1" ] }, - "4796": { + "5097": { "op": "pushint 80", "defined_out": [ "80", @@ -44409,7 +47385,7 @@ "80" ] }, - "4798": { + "5099": { "op": "==", "defined_out": [ "role_id#1", @@ -44421,15 +47397,15 @@ "tmp%5#1" ] }, - "4799": { + "5100": { "op": "bz rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12", "stack_out": [ "role_address#0", "role_id#1" ] }, - "4802": { - "op": "bytec 24 // 0x52234f6273657276657223", + "5103": { + "op": "bytec 25 // 0x52234f6273657276657223", "defined_out": [ "0x52234f6273657276657223", "role_id#1" @@ -44440,7 +47416,7 @@ "0x52234f6273657276657223" ] }, - "4804": { + "5105": { "op": "dig 2", "defined_out": [ "0x52234f6273657276657223", @@ -44454,7 +47430,7 @@ "role_address#0" ] }, - "4806": { + "5107": { "op": "concat", "defined_out": [ "box_prefixed_key%8#0", @@ -44467,7 +47443,7 @@ "box_prefixed_key%8#0" ] }, - "4807": { + "5108": { "op": "dup", "defined_out": [ "box_prefixed_key%8#0", @@ -44482,7 +47458,7 @@ "box_prefixed_key%8#0 (copy)" ] }, - "4808": { + "5109": { "op": "box_len", "defined_out": [ "_%4#0", @@ -44499,7 +47475,7 @@ "maybe_exists%4#0" ] }, - "4809": { + "5110": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -44508,7 +47484,7 @@ "maybe_exists%4#0" ] }, - "4811": { + "5112": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -44517,7 +47493,7 @@ "box_prefixed_key%8#0" ] }, - "4812": { + "5113": { "op": "box_del", "defined_out": [ "role_address#0", @@ -44530,17 +47506,17 @@ "{box_del}" ] }, - "4813": { + "5114": { "op": "pop", "stack_out": [ "role_address#0", "role_id#1" ] }, - "4814": { + "5115": { "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" }, - "4817": { + "5118": { "subroutine": "modules.rbac.RbacModule.rbac_contract_suspension[routing]", "params": {}, "block": "rbac_contract_suspension", @@ -44553,7 +47529,7 @@ "tmp%0#0" ] }, - "4820": { + "5121": { "op": "dup", "defined_out": [ "tmp%0#0", @@ -44564,7 +47540,7 @@ "tmp%0#0 (copy)" ] }, - "4821": { + "5122": { "op": "len", "defined_out": [ "len%0#0", @@ -44575,7 +47551,7 @@ "len%0#0" ] }, - "4822": { + "5123": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -44588,7 +47564,7 @@ "1" ] }, - "4823": { + "5124": { "op": "==", "defined_out": [ "eq%0#0", @@ -44599,14 +47575,14 @@ "eq%0#0" ] }, - "4824": { + "5125": { "error": "invalid number of bytes for arc4.bool", "op": "assert // invalid number of bytes for arc4.bool", "stack_out": [ "tmp%0#0" ] }, - "4825": { + "5126": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -44617,7 +47593,7 @@ "0" ] }, - "4826": { + "5127": { "op": "getbit", "defined_out": [ "suspended#0" @@ -44626,7 +47602,7 @@ "suspended#0" ] }, - "4827": { + "5128": { "op": "bytec 21 // 0x5223417574686f7269747923", "defined_out": [ "0x5223417574686f7269747923", @@ -44637,7 +47613,7 @@ "0x5223417574686f7269747923" ] }, - "4829": { + "5130": { "op": "txn Sender", "defined_out": [ "0x5223417574686f7269747923", @@ -44650,7 +47626,7 @@ "tmp%0#2" ] }, - "4831": { + "5132": { "callsub": "modules.rbac.RbacModule._role_is_active", "op": "callsub _role_is_active", "defined_out": [ @@ -44662,14 +47638,14 @@ "tmp%1#0" ] }, - "4834": { + "5135": { "error": "Not authorized", "op": "assert // Not authorized", "stack_out": [ "suspended#0" ] }, - "4835": { + "5136": { "op": "bytec 33 // \"asset_suspended\"", "defined_out": [ "\"asset_suspended\"", @@ -44680,18 +47656,18 @@ "\"asset_suspended\"" ] }, - "4837": { + "5138": { "op": "swap", "stack_out": [ "\"asset_suspended\"", "suspended#0" ] }, - "4838": { + "5139": { "op": "app_global_put", "stack_out": [] }, - "4839": { + "5140": { "op": "global LatestTimestamp", "defined_out": [ "tmp%0#1" @@ -44700,7 +47676,7 @@ "tmp%0#1" ] }, - "4841": { + "5142": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0" @@ -44709,7 +47685,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "4842": { + "5143": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -44720,14 +47696,14 @@ "0x151f7c75" ] }, - "4843": { + "5144": { "op": "swap", "stack_out": [ "0x151f7c75", "aggregate%val_as_bytes%0#0" ] }, - "4844": { + "5145": { "op": "concat", "defined_out": [ "tmp%4#0" @@ -44736,21 +47712,21 @@ "tmp%4#0" ] }, - "4845": { + "5146": { "op": "log", "stack_out": [] }, - "4846": { + "5147": { "op": "intc_1 // 1", "stack_out": [ "1" ] }, - "4847": { + "5148": { "op": "return", "stack_out": [] }, - "4848": { + "5149": { "subroutine": "modules.rbac.RbacModule.rbac_get_arranger[routing]", "params": {}, "block": "rbac_get_arranger", @@ -44763,7 +47739,7 @@ "0" ] }, - "4849": { + "5150": { "op": "bytec 18 // 0x5223417272616e67657223", "defined_out": [ "0", @@ -44774,7 +47750,7 @@ "0x5223417272616e67657223" ] }, - "4851": { + "5152": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -44785,14 +47761,14 @@ "maybe_exists%0#0" ] }, - "4852": { + "5153": { "error": "check self.arranger exists", "op": "assert // check self.arranger exists", "stack_out": [ "maybe_value%0#0" ] }, - "4853": { + "5154": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -44803,14 +47779,14 @@ "0x151f7c75" ] }, - "4854": { + "5155": { "op": "swap", "stack_out": [ "0x151f7c75", "maybe_value%0#0" ] }, - "4855": { + "5156": { "op": "concat", "defined_out": [ "tmp%2#0" @@ -44819,11 +47795,11 @@ "tmp%2#0" ] }, - "4856": { + "5157": { "op": "log", "stack_out": [] }, - "4857": { + "5158": { "op": "intc_1 // 1", "defined_out": [ "1" @@ -44832,11 +47808,11 @@ "1" ] }, - "4858": { + "5159": { "op": "return", "stack_out": [] }, - "4859": { + "5160": { "subroutine": "modules.rbac.RbacModule.rbac_get_address_roles[routing]", "params": {}, "block": "rbac_get_address_roles", @@ -44849,7 +47825,7 @@ "address#0" ] }, - "4862": { + "5163": { "op": "dup", "defined_out": [ "address#0", @@ -44860,7 +47836,7 @@ "address#0 (copy)" ] }, - "4863": { + "5164": { "op": "len", "defined_out": [ "address#0", @@ -44871,7 +47847,7 @@ "len%0#0" ] }, - "4864": { + "5165": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -44884,7 +47860,7 @@ "32" ] }, - "4865": { + "5166": { "op": "==", "defined_out": [ "address#0", @@ -44895,14 +47871,14 @@ "eq%0#0" ] }, - "4866": { + "5167": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ "address#0" ] }, - "4867": { + "5168": { "op": "bytec 23 // 0x52234163636f756e744d616e6167657223", "defined_out": [ "0x52234163636f756e744d616e6167657223", @@ -44913,7 +47889,7 @@ "0x52234163636f756e744d616e6167657223" ] }, - "4869": { + "5170": { "op": "dig 1", "stack_out": [ "address#0", @@ -44921,7 +47897,7 @@ "address#0 (copy)" ] }, - "4871": { + "5172": { "callsub": "modules.rbac.RbacModule._role_is_active", "op": "callsub _role_is_active", "defined_out": [ @@ -44933,7 +47909,7 @@ "tmp%0#1" ] }, - "4874": { + "5175": { "op": "bytec 22 // 0x52235072696d6172794465616c657223", "defined_out": [ "0x52235072696d6172794465616c657223", @@ -44946,7 +47922,7 @@ "0x52235072696d6172794465616c657223" ] }, - "4876": { + "5177": { "op": "dig 2", "stack_out": [ "address#0", @@ -44955,7 +47931,7 @@ "address#0 (copy)" ] }, - "4878": { + "5179": { "callsub": "modules.rbac.RbacModule._role_is_active", "op": "callsub _role_is_active", "defined_out": [ @@ -44969,7 +47945,7 @@ "tmp%1#1" ] }, - "4881": { + "5182": { "op": "bytec 32 // 0x52235472757374656523", "defined_out": [ "0x52235472757374656523", @@ -44984,7 +47960,7 @@ "0x52235472757374656523" ] }, - "4883": { + "5184": { "op": "dig 3", "stack_out": [ "address#0", @@ -44994,7 +47970,7 @@ "address#0 (copy)" ] }, - "4885": { + "5186": { "callsub": "modules.rbac.RbacModule._role_is_active", "op": "callsub _role_is_active", "defined_out": [ @@ -45010,7 +47986,7 @@ "tmp%2#1" ] }, - "4888": { + "5189": { "op": "bytec 21 // 0x5223417574686f7269747923", "defined_out": [ "0x5223417574686f7269747923", @@ -45027,7 +48003,7 @@ "0x5223417574686f7269747923" ] }, - "4890": { + "5191": { "op": "dig 4", "stack_out": [ "address#0", @@ -45038,7 +48014,7 @@ "address#0 (copy)" ] }, - "4892": { + "5193": { "callsub": "modules.rbac.RbacModule._role_is_active", "op": "callsub _role_is_active", "defined_out": [ @@ -45056,8 +48032,8 @@ "tmp%3#1" ] }, - "4895": { - "op": "bytec 24 // 0x52234f6273657276657223", + "5196": { + "op": "bytec 25 // 0x52234f6273657276657223", "defined_out": [ "0x52234f6273657276657223", "address#0", @@ -45075,7 +48051,7 @@ "0x52234f6273657276657223" ] }, - "4897": { + "5198": { "op": "uncover 5", "stack_out": [ "tmp%0#1", @@ -45086,7 +48062,7 @@ "address#0" ] }, - "4899": { + "5200": { "callsub": "modules.rbac.RbacModule._role_is_active", "op": "callsub _role_is_active", "defined_out": [ @@ -45104,7 +48080,7 @@ "tmp%4#1" ] }, - "4902": { + "5203": { "op": "bytec 40 // 0x00", "defined_out": [ "0x00", @@ -45123,7 +48099,7 @@ "0x00" ] }, - "4904": { + "5205": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -45144,7 +48120,7 @@ "0" ] }, - "4905": { + "5206": { "op": "uncover 6", "stack_out": [ "tmp%1#1", @@ -45156,7 +48132,7 @@ "tmp%0#1" ] }, - "4907": { + "5208": { "op": "setbit", "defined_out": [ "aggregate%encoded_bool%0#0", @@ -45173,7 +48149,7 @@ "aggregate%encoded_bool%0#0" ] }, - "4908": { + "5209": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -45192,7 +48168,7 @@ "1" ] }, - "4909": { + "5210": { "op": "uncover 5", "stack_out": [ "tmp%2#1", @@ -45203,7 +48179,7 @@ "tmp%1#1" ] }, - "4911": { + "5212": { "op": "setbit", "defined_out": [ "aggregate%set_bit%0#0", @@ -45218,7 +48194,7 @@ "aggregate%set_bit%0#0" ] }, - "4912": { + "5213": { "op": "pushint 2", "defined_out": [ "2", @@ -45235,7 +48211,7 @@ "2" ] }, - "4914": { + "5215": { "op": "uncover 4", "stack_out": [ "tmp%3#1", @@ -45245,7 +48221,7 @@ "tmp%2#1" ] }, - "4916": { + "5217": { "op": "setbit", "defined_out": [ "aggregate%set_bit%1#0", @@ -45258,7 +48234,7 @@ "aggregate%set_bit%1#0" ] }, - "4917": { + "5218": { "op": "pushint 3", "defined_out": [ "3", @@ -45273,7 +48249,7 @@ "3" ] }, - "4919": { + "5220": { "op": "uncover 3", "stack_out": [ "tmp%4#1", @@ -45282,7 +48258,7 @@ "tmp%3#1" ] }, - "4921": { + "5222": { "op": "setbit", "defined_out": [ "aggregate%set_bit%2#0", @@ -45293,7 +48269,7 @@ "aggregate%set_bit%2#0" ] }, - "4922": { + "5223": { "op": "pushint 4", "defined_out": [ "4", @@ -45306,7 +48282,7 @@ "4" ] }, - "4924": { + "5225": { "op": "uncover 2", "stack_out": [ "aggregate%set_bit%2#0", @@ -45314,7 +48290,7 @@ "tmp%4#1" ] }, - "4926": { + "5227": { "op": "setbit", "defined_out": [ "aggregate%set_bit%3#0" @@ -45323,7 +48299,7 @@ "aggregate%set_bit%3#0" ] }, - "4927": { + "5228": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -45334,14 +48310,14 @@ "0x151f7c75" ] }, - "4928": { + "5229": { "op": "swap", "stack_out": [ "0x151f7c75", "aggregate%set_bit%3#0" ] }, - "4929": { + "5230": { "op": "concat", "defined_out": [ "tmp%8#0" @@ -45350,21 +48326,21 @@ "tmp%8#0" ] }, - "4930": { + "5231": { "op": "log", "stack_out": [] }, - "4931": { + "5232": { "op": "intc_1 // 1", "stack_out": [ "1" ] }, - "4932": { + "5233": { "op": "return", "stack_out": [] }, - "4933": { + "5234": { "subroutine": "modules.rbac.RbacModule.rbac_get_role_validity[routing]", "params": {}, "block": "rbac_get_role_validity", @@ -45377,7 +48353,7 @@ "role_id#0" ] }, - "4936": { + "5237": { "op": "dup", "defined_out": [ "role_id#0", @@ -45388,7 +48364,7 @@ "role_id#0 (copy)" ] }, - "4937": { + "5238": { "op": "len", "defined_out": [ "len%0#0", @@ -45399,7 +48375,7 @@ "len%0#0" ] }, - "4938": { + "5239": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -45412,7 +48388,7 @@ "1" ] }, - "4939": { + "5240": { "op": "==", "defined_out": [ "eq%0#0", @@ -45423,17 +48399,17 @@ "eq%0#0" ] }, - "4940": { + "5241": { "error": "invalid number of bytes for arc4.uint8", "op": "assert // invalid number of bytes for arc4.uint8", "stack_out": [ "role_id#0" ] }, - "4941": { + "5242": { "op": "txna ApplicationArgs 2" }, - "4944": { + "5245": { "op": "dup", "defined_out": [ "role_address#0", @@ -45445,7 +48421,7 @@ "role_address#0" ] }, - "4945": { + "5246": { "op": "cover 2", "defined_out": [ "role_address#0", @@ -45457,7 +48433,7 @@ "role_address#0" ] }, - "4947": { + "5248": { "op": "len", "defined_out": [ "len%1#0", @@ -45470,7 +48446,7 @@ "len%1#0" ] }, - "4948": { + "5249": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -45485,7 +48461,7 @@ "32" ] }, - "4949": { + "5250": { "op": "==", "defined_out": [ "eq%1#0", @@ -45498,7 +48474,7 @@ "eq%1#0" ] }, - "4950": { + "5251": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ @@ -45506,7 +48482,7 @@ "role_id#0" ] }, - "4951": { + "5252": { "op": "btoi", "defined_out": [ "role#0", @@ -45517,7 +48493,7 @@ "role#0" ] }, - "4952": { + "5253": { "op": "dup", "defined_out": [ "role#0", @@ -45530,7 +48506,7 @@ "role#0 (copy)" ] }, - "4953": { + "5254": { "callsub": "modules.rbac.RbacModule._assert_valid_role", "op": "callsub _assert_valid_role", "stack_out": [ @@ -45538,7 +48514,7 @@ "role#0" ] }, - "4956": { + "5257": { "op": "pushints 20 40 50 60 70 80", "defined_out": [ "20", @@ -45561,7 +48537,7 @@ "80" ] }, - "4964": { + "5265": { "op": "uncover 6", "stack_out": [ "role_address#0", @@ -45574,22 +48550,22 @@ "role#0" ] }, - "4966": { + "5267": { "op": "match rbac_get_role_validity_switch_case_0@2 rbac_get_role_validity_switch_case_1@3 rbac_get_role_validity_switch_case_2@4 rbac_get_role_validity_switch_case_3@5 rbac_get_role_validity_switch_case_4@6 rbac_get_role_validity_switch_case_5@7", "stack_out": [ "role_address#0" ] }, - "4980": { + "5281": { "error": "Invalid role identifier", "op": "err // Invalid role identifier" }, - "4981": { + "5282": { "block": "rbac_get_role_validity_switch_case_5@7", "stack_in": [ "role_address#0" ], - "op": "bytec 24 // 0x52234f6273657276657223", + "op": "bytec 25 // 0x52234f6273657276657223", "defined_out": [ "0x52234f6273657276657223" ], @@ -45598,7 +48574,7 @@ "0x52234f6273657276657223" ] }, - "4983": { + "5284": { "op": "dig 1", "defined_out": [ "0x52234f6273657276657223", @@ -45610,7 +48586,7 @@ "role_address#0" ] }, - "4985": { + "5286": { "op": "concat", "defined_out": [ "box_prefixed_key%0#1", @@ -45621,7 +48597,7 @@ "box_prefixed_key%0#1" ] }, - "4986": { + "5287": { "op": "dup", "defined_out": [ "box_prefixed_key%0#1", @@ -45634,7 +48610,7 @@ "box_prefixed_key%0#1 (copy)" ] }, - "4987": { + "5288": { "op": "box_len", "defined_out": [ "_%0#0", @@ -45649,7 +48625,7 @@ "maybe_exists%0#0" ] }, - "4988": { + "5289": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -45657,7 +48633,7 @@ "maybe_exists%0#0" ] }, - "4990": { + "5291": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -45665,7 +48641,7 @@ "box_prefixed_key%0#1" ] }, - "4991": { + "5292": { "op": "box_get", "defined_out": [ "aggregate%box_get%8#0", @@ -45678,7 +48654,7 @@ "aggregate%box_get%9#0" ] }, - "4992": { + "5293": { "op": "pop", "defined_out": [ "role_address#0", @@ -45689,7 +48665,7 @@ "tmp%3#0" ] }, - "4993": { + "5294": { "block": "rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9", "stack_in": [ "role_address#0", @@ -45705,7 +48681,7 @@ "0x151f7c75" ] }, - "4994": { + "5295": { "op": "swap", "defined_out": [ "0x151f7c75", @@ -45717,7 +48693,7 @@ "tmp%3#0" ] }, - "4995": { + "5296": { "op": "concat", "defined_out": [ "tmp%4#0" @@ -45727,13 +48703,13 @@ "tmp%4#0" ] }, - "4996": { + "5297": { "op": "log", "stack_out": [ "role_address#0" ] }, - "4997": { + "5298": { "op": "intc_1 // 1", "defined_out": [ "1" @@ -45743,13 +48719,13 @@ "1" ] }, - "4998": { + "5299": { "op": "return", "stack_out": [ "role_address#0" ] }, - "4999": { + "5300": { "block": "rbac_get_role_validity_switch_case_4@6", "stack_in": [ "role_address#0" @@ -45763,7 +48739,7 @@ "0x5223417574686f7269747923" ] }, - "5001": { + "5302": { "op": "dig 1", "defined_out": [ "0x5223417574686f7269747923", @@ -45775,7 +48751,7 @@ "role_address#0" ] }, - "5003": { + "5304": { "op": "concat", "defined_out": [ "box_prefixed_key%0#1", @@ -45786,7 +48762,7 @@ "box_prefixed_key%0#1" ] }, - "5004": { + "5305": { "op": "dup", "defined_out": [ "box_prefixed_key%0#1", @@ -45799,7 +48775,7 @@ "box_prefixed_key%0#1 (copy)" ] }, - "5005": { + "5306": { "op": "box_len", "defined_out": [ "_%0#0", @@ -45814,7 +48790,7 @@ "maybe_exists%0#0" ] }, - "5006": { + "5307": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -45822,7 +48798,7 @@ "maybe_exists%0#0" ] }, - "5008": { + "5309": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -45830,7 +48806,7 @@ "box_prefixed_key%0#1" ] }, - "5009": { + "5310": { "op": "box_get", "defined_out": [ "aggregate%box_get%6#0", @@ -45843,7 +48819,7 @@ "aggregate%box_get%7#0" ] }, - "5010": { + "5311": { "op": "pop", "defined_out": [ "role_address#0", @@ -45854,10 +48830,10 @@ "tmp%3#0" ] }, - "5011": { + "5312": { "op": "b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9" }, - "5014": { + "5315": { "block": "rbac_get_role_validity_switch_case_3@5", "stack_in": [ "role_address#0" @@ -45871,7 +48847,7 @@ "0x52235472757374656523" ] }, - "5016": { + "5317": { "op": "dig 1", "defined_out": [ "0x52235472757374656523", @@ -45883,7 +48859,7 @@ "role_address#0" ] }, - "5018": { + "5319": { "op": "concat", "defined_out": [ "box_prefixed_key%0#1", @@ -45894,7 +48870,7 @@ "box_prefixed_key%0#1" ] }, - "5019": { + "5320": { "op": "dup", "defined_out": [ "box_prefixed_key%0#1", @@ -45907,7 +48883,7 @@ "box_prefixed_key%0#1 (copy)" ] }, - "5020": { + "5321": { "op": "box_len", "defined_out": [ "_%0#0", @@ -45922,7 +48898,7 @@ "maybe_exists%0#0" ] }, - "5021": { + "5322": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -45930,7 +48906,7 @@ "maybe_exists%0#0" ] }, - "5023": { + "5324": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -45938,7 +48914,7 @@ "box_prefixed_key%0#1" ] }, - "5024": { + "5325": { "op": "box_get", "defined_out": [ "aggregate%box_get%4#0", @@ -45951,7 +48927,7 @@ "aggregate%box_get%5#0" ] }, - "5025": { + "5326": { "op": "pop", "defined_out": [ "role_address#0", @@ -45962,10 +48938,10 @@ "tmp%3#0" ] }, - "5026": { + "5327": { "op": "b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9" }, - "5029": { + "5330": { "block": "rbac_get_role_validity_switch_case_2@4", "stack_in": [ "role_address#0" @@ -45979,7 +48955,7 @@ "0x52235072696d6172794465616c657223" ] }, - "5031": { + "5332": { "op": "dig 1", "defined_out": [ "0x52235072696d6172794465616c657223", @@ -45991,7 +48967,7 @@ "role_address#0" ] }, - "5033": { + "5334": { "op": "concat", "defined_out": [ "box_prefixed_key%0#1", @@ -46002,7 +48978,7 @@ "box_prefixed_key%0#1" ] }, - "5034": { + "5335": { "op": "dup", "defined_out": [ "box_prefixed_key%0#1", @@ -46015,7 +48991,7 @@ "box_prefixed_key%0#1 (copy)" ] }, - "5035": { + "5336": { "op": "box_len", "defined_out": [ "_%0#0", @@ -46030,7 +49006,7 @@ "maybe_exists%0#0" ] }, - "5036": { + "5337": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -46038,7 +49014,7 @@ "maybe_exists%0#0" ] }, - "5038": { + "5339": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -46046,7 +49022,7 @@ "box_prefixed_key%0#1" ] }, - "5039": { + "5340": { "op": "box_get", "defined_out": [ "aggregate%box_get%2#0", @@ -46059,7 +49035,7 @@ "aggregate%box_get%3#0" ] }, - "5040": { + "5341": { "op": "pop", "defined_out": [ "role_address#0", @@ -46070,10 +49046,10 @@ "tmp%3#0" ] }, - "5041": { + "5342": { "op": "b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9" }, - "5044": { + "5345": { "block": "rbac_get_role_validity_switch_case_1@3", "stack_in": [ "role_address#0" @@ -46087,7 +49063,7 @@ "0x52234163636f756e744d616e6167657223" ] }, - "5046": { + "5347": { "op": "dig 1", "defined_out": [ "0x52234163636f756e744d616e6167657223", @@ -46099,7 +49075,7 @@ "role_address#0" ] }, - "5048": { + "5349": { "op": "concat", "defined_out": [ "box_prefixed_key%0#1", @@ -46110,7 +49086,7 @@ "box_prefixed_key%0#1" ] }, - "5049": { + "5350": { "op": "dup", "defined_out": [ "box_prefixed_key%0#1", @@ -46123,7 +49099,7 @@ "box_prefixed_key%0#1 (copy)" ] }, - "5050": { + "5351": { "op": "box_len", "defined_out": [ "_%0#0", @@ -46138,7 +49114,7 @@ "maybe_exists%0#0" ] }, - "5051": { + "5352": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -46146,7 +49122,7 @@ "maybe_exists%0#0" ] }, - "5053": { + "5354": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -46154,7 +49130,7 @@ "box_prefixed_key%0#1" ] }, - "5054": { + "5355": { "op": "box_get", "defined_out": [ "aggregate%box_get%0#0", @@ -46167,7 +49143,7 @@ "aggregate%box_get%1#0" ] }, - "5055": { + "5356": { "op": "pop", "defined_out": [ "role_address#0", @@ -46178,10 +49154,10 @@ "tmp%3#0" ] }, - "5056": { + "5357": { "op": "b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9" }, - "5059": { + "5360": { "block": "rbac_get_role_validity_switch_case_0@2", "stack_in": [ "role_address#0" @@ -46195,10 +49171,10 @@ "tmp%3#0" ] }, - "5077": { + "5378": { "op": "b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9" }, - "5080": { + "5381": { "subroutine": "modules.accounting.AccountingModule._assert_is_not_account_suspended", "params": { "holding_address#0": "bytes" @@ -46207,7 +49183,7 @@ "stack_in": [], "op": "proto 1 0" }, - "5083": { + "5384": { "op": "bytec 8 // 0x52234163636f756e7423", "defined_out": [ "0x52234163636f756e7423" @@ -46216,7 +49192,7 @@ "0x52234163636f756e7423" ] }, - "5085": { + "5386": { "op": "frame_dig -1", "defined_out": [ "0x52234163636f756e7423", @@ -46227,7 +49203,7 @@ "holding_address#0 (copy)" ] }, - "5087": { + "5388": { "op": "concat", "defined_out": [ "box_prefixed_key%0#0" @@ -46236,7 +49212,7 @@ "box_prefixed_key%0#0" ] }, - "5088": { + "5389": { "op": "box_get", "defined_out": [ "aggregate%box_get%0#0", @@ -46247,14 +49223,14 @@ "aggregate%box_get%1#0" ] }, - "5089": { + "5390": { "error": "check self.account entry exists", "op": "assert // check self.account entry exists", "stack_out": [ "aggregate%box_get%0#0" ] }, - "5090": { + "5391": { "op": "pushint 384", "defined_out": [ "384", @@ -46265,7 +49241,7 @@ "384" ] }, - "5093": { + "5394": { "op": "getbit", "defined_out": [ "aggregate%get_bit%0#0" @@ -46274,7 +49250,7 @@ "aggregate%get_bit%0#0" ] }, - "5094": { + "5395": { "op": "!", "defined_out": [ "tmp%0#0" @@ -46283,16 +49259,16 @@ "tmp%0#0" ] }, - "5095": { + "5396": { "error": "Suspended operations", "op": "assert // Suspended operations", "stack_out": [] }, - "5096": { + "5397": { "retsub": true, "op": "retsub" }, - "5097": { + "5398": { "subroutine": "modules.accounting.AccountingModule._settle_position", "params": { "holding_address#0": "bytes" @@ -46301,7 +49277,7 @@ "stack_in": [], "op": "proto 1 2" }, - "5100": { + "5401": { "op": "bytec 8 // 0x52234163636f756e7423", "defined_out": [ "0x52234163636f756e7423" @@ -46310,7 +49286,7 @@ "0x52234163636f756e7423" ] }, - "5102": { + "5403": { "op": "frame_dig -1", "defined_out": [ "0x52234163636f756e7423", @@ -46321,7 +49297,7 @@ "holding_address#0 (copy)" ] }, - "5104": { + "5405": { "op": "concat", "defined_out": [ "box_prefixed_key%0#1" @@ -46330,7 +49306,7 @@ "box_prefixed_key%0#1" ] }, - "5105": { + "5406": { "op": "dup", "defined_out": [ "box_prefixed_key%0#1", @@ -46341,7 +49317,7 @@ "box_prefixed_key%0#1 (copy)" ] }, - "5106": { + "5407": { "op": "box_len", "defined_out": [ "_%0#0", @@ -46354,28 +49330,28 @@ "maybe_exists%0#0" ] }, - "5107": { + "5408": { "op": "bury 1", "stack_out": [ "box_prefixed_key%0#1", "maybe_exists%0#0" ] }, - "5109": { + "5410": { "error": "Invalid account holding address", "op": "assert // Invalid account holding address", "stack_out": [ "box_prefixed_key%0#1" ] }, - "5110": { + "5411": { "op": "dup", "stack_out": [ "box_prefixed_key%0#1", "box_prefixed_key%0#1 (copy)" ] }, - "5111": { + "5412": { "op": "box_get", "defined_out": [ "aggregate%box_get%1#0", @@ -46388,14 +49364,14 @@ "aggregate%box_get%1#0" ] }, - "5112": { + "5413": { "op": "pop", "stack_out": [ "box_prefixed_key%0#1", "position#0" ] }, - "5113": { + "5414": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -46408,7 +49384,7 @@ "0" ] }, - "5114": { + "5415": { "op": "bytec 16 // \"cumulative_interest_index\"", "defined_out": [ "\"cumulative_interest_index\"", @@ -46423,7 +49399,7 @@ "\"cumulative_interest_index\"" ] }, - "5116": { + "5417": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#1", @@ -46438,7 +49414,7 @@ "maybe_exists%0#0" ] }, - "5117": { + "5418": { "error": "check self.cumulative_interest_index exists", "op": "assert // check self.cumulative_interest_index exists", "stack_out": [ @@ -46447,7 +49423,7 @@ "maybe_value%0#0" ] }, - "5118": { + "5419": { "op": "dig 1", "defined_out": [ "box_prefixed_key%0#1", @@ -46462,7 +49438,7 @@ "position#0 (copy)" ] }, - "5120": { + "5421": { "op": "pushint 57", "defined_out": [ "57", @@ -46479,7 +49455,7 @@ "57" ] }, - "5122": { + "5423": { "op": "extract_uint64", "defined_out": [ "box_prefixed_key%0#1", @@ -46494,7 +49470,7 @@ "values%0#0" ] }, - "5123": { + "5424": { "op": "-", "defined_out": [ "box_prefixed_key%0#1", @@ -46507,7 +49483,7 @@ "interest_delta#0" ] }, - "5124": { + "5425": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#1", @@ -46516,7 +49492,7 @@ "0" ] }, - "5125": { + "5426": { "op": "bytec 17 // \"cumulative_principal_index\"", "defined_out": [ "\"cumulative_principal_index\"", @@ -46533,7 +49509,7 @@ "\"cumulative_principal_index\"" ] }, - "5127": { + "5428": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#1", @@ -46550,7 +49526,7 @@ "maybe_exists%1#0" ] }, - "5128": { + "5429": { "error": "check self.cumulative_principal_index exists", "op": "assert // check self.cumulative_principal_index exists", "stack_out": [ @@ -46560,7 +49536,7 @@ "maybe_value%1#0" ] }, - "5129": { + "5430": { "op": "dig 2", "stack_out": [ "box_prefixed_key%0#1", @@ -46570,7 +49546,7 @@ "position#0 (copy)" ] }, - "5131": { + "5432": { "op": "pushint 65", "defined_out": [ "65", @@ -46589,7 +49565,7 @@ "65" ] }, - "5133": { + "5434": { "op": "extract_uint64", "defined_out": [ "box_prefixed_key%0#1", @@ -46606,7 +49582,7 @@ "values%1#0" ] }, - "5134": { + "5435": { "op": "-", "defined_out": [ "box_prefixed_key%0#1", @@ -46621,7 +49597,7 @@ "principal_delta#0" ] }, - "5135": { + "5436": { "op": "dig 2", "stack_out": [ "box_prefixed_key%0#1", @@ -46631,7 +49607,7 @@ "position#0 (copy)" ] }, - "5137": { + "5438": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -46650,7 +49626,7 @@ "32" ] }, - "5138": { + "5439": { "op": "extract_uint64", "defined_out": [ "box_prefixed_key%0#1", @@ -46667,7 +49643,7 @@ "values%2#0" ] }, - "5139": { + "5440": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#1", @@ -46678,7 +49654,7 @@ "0" ] }, - "5140": { + "5441": { "op": "bytec 5 // \"fixed_point_scale\"", "defined_out": [ "\"fixed_point_scale\"", @@ -46699,7 +49675,7 @@ "\"fixed_point_scale\"" ] }, - "5142": { + "5443": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#1", @@ -46720,7 +49696,7 @@ "maybe_exists%2#0" ] }, - "5143": { + "5444": { "error": "check self.fixed_point_scale exists", "op": "assert // check self.fixed_point_scale exists", "stack_out": [ @@ -46732,7 +49708,7 @@ "maybe_value%2#0" ] }, - "5144": { + "5445": { "op": "uncover 3", "stack_out": [ "box_prefixed_key%0#1", @@ -46743,7 +49719,7 @@ "interest_delta#0" ] }, - "5146": { + "5447": { "op": "dig 2", "defined_out": [ "box_prefixed_key%0#1", @@ -46764,7 +49740,7 @@ "values%2#0 (copy)" ] }, - "5148": { + "5449": { "op": "uncover 2", "stack_out": [ "box_prefixed_key%0#1", @@ -46776,7 +49752,7 @@ "maybe_value%2#0" ] }, - "5150": { + "5451": { "callsub": "modules.actus_kernel.ActusKernelModule._scaled_mul_div", "op": "callsub _scaled_mul_div", "defined_out": [ @@ -46794,7 +49770,7 @@ "claimable_interest#0" ] }, - "5153": { + "5454": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#1", @@ -46805,7 +49781,7 @@ "0" ] }, - "5154": { + "5455": { "op": "bytec 5 // \"fixed_point_scale\"", "stack_out": [ "box_prefixed_key%0#1", @@ -46817,7 +49793,7 @@ "\"fixed_point_scale\"" ] }, - "5156": { + "5457": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#1", @@ -46838,7 +49814,7 @@ "maybe_exists%3#0" ] }, - "5157": { + "5458": { "error": "check self.fixed_point_scale exists", "op": "assert // check self.fixed_point_scale exists", "stack_out": [ @@ -46850,7 +49826,7 @@ "maybe_value%3#0" ] }, - "5158": { + "5459": { "op": "uncover 3", "stack_out": [ "box_prefixed_key%0#1", @@ -46861,7 +49837,7 @@ "principal_delta#0" ] }, - "5160": { + "5461": { "op": "uncover 3", "stack_out": [ "box_prefixed_key%0#1", @@ -46872,7 +49848,7 @@ "values%2#0" ] }, - "5162": { + "5463": { "op": "uncover 2", "stack_out": [ "box_prefixed_key%0#1", @@ -46883,7 +49859,7 @@ "maybe_value%3#0" ] }, - "5164": { + "5465": { "callsub": "modules.actus_kernel.ActusKernelModule._scaled_mul_div", "op": "callsub _scaled_mul_div", "defined_out": [ @@ -46899,7 +49875,7 @@ "claimable_principal#0" ] }, - "5167": { + "5468": { "op": "dig 2", "stack_out": [ "box_prefixed_key%0#1", @@ -46909,7 +49885,7 @@ "position#0 (copy)" ] }, - "5169": { + "5470": { "op": "pushint 73", "defined_out": [ "73", @@ -46928,7 +49904,7 @@ "73" ] }, - "5171": { + "5472": { "op": "extract_uint64", "defined_out": [ "box_prefixed_key%0#1", @@ -46945,7 +49921,7 @@ "values%4#0" ] }, - "5172": { + "5473": { "op": "dig 2", "defined_out": [ "box_prefixed_key%0#1", @@ -46964,7 +49940,7 @@ "claimable_interest#0 (copy)" ] }, - "5174": { + "5475": { "op": "+", "defined_out": [ "box_prefixed_key%0#1", @@ -46981,7 +49957,7 @@ "tmp%4#0" ] }, - "5175": { + "5476": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0", @@ -46998,7 +49974,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "5176": { + "5477": { "op": "uncover 3", "stack_out": [ "box_prefixed_key%0#1", @@ -47008,7 +49984,7 @@ "position#0" ] }, - "5178": { + "5479": { "op": "swap", "stack_out": [ "box_prefixed_key%0#1", @@ -47018,7 +49994,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "5179": { + "5480": { "op": "replace2 73", "stack_out": [ "box_prefixed_key%0#1", @@ -47027,7 +50003,7 @@ "position#0" ] }, - "5181": { + "5482": { "op": "dup", "stack_out": [ "box_prefixed_key%0#1", @@ -47037,7 +50013,7 @@ "position#0 (copy)" ] }, - "5182": { + "5483": { "op": "pushint 81", "defined_out": [ "81", @@ -47056,7 +50032,7 @@ "81" ] }, - "5184": { + "5485": { "op": "extract_uint64", "defined_out": [ "box_prefixed_key%0#1", @@ -47073,7 +50049,7 @@ "values%5#0" ] }, - "5185": { + "5486": { "op": "dig 2", "defined_out": [ "box_prefixed_key%0#1", @@ -47092,7 +50068,7 @@ "claimable_principal#0 (copy)" ] }, - "5187": { + "5488": { "op": "+", "defined_out": [ "box_prefixed_key%0#1", @@ -47109,7 +50085,7 @@ "tmp%5#0" ] }, - "5188": { + "5489": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%1#0", @@ -47126,7 +50102,7 @@ "aggregate%val_as_bytes%1#0" ] }, - "5189": { + "5490": { "op": "replace2 81", "stack_out": [ "box_prefixed_key%0#1", @@ -47135,7 +50111,7 @@ "position#0" ] }, - "5191": { + "5492": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#1", @@ -47145,7 +50121,7 @@ "0" ] }, - "5192": { + "5493": { "op": "bytec 16 // \"cumulative_interest_index\"", "stack_out": [ "box_prefixed_key%0#1", @@ -47156,7 +50132,7 @@ "\"cumulative_interest_index\"" ] }, - "5194": { + "5495": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#1", @@ -47175,7 +50151,7 @@ "maybe_exists%4#0" ] }, - "5195": { + "5496": { "error": "check self.cumulative_interest_index exists", "op": "assert // check self.cumulative_interest_index exists", "stack_out": [ @@ -47186,7 +50162,7 @@ "maybe_value%4#0" ] }, - "5196": { + "5497": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%2#0", @@ -47203,7 +50179,7 @@ "aggregate%val_as_bytes%2#0" ] }, - "5197": { + "5498": { "op": "replace2 57", "stack_out": [ "box_prefixed_key%0#1", @@ -47212,7 +50188,7 @@ "position#0" ] }, - "5199": { + "5500": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#1", @@ -47222,7 +50198,7 @@ "0" ] }, - "5200": { + "5501": { "op": "bytec 17 // \"cumulative_principal_index\"", "stack_out": [ "box_prefixed_key%0#1", @@ -47233,7 +50209,7 @@ "\"cumulative_principal_index\"" ] }, - "5202": { + "5503": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#1", @@ -47252,7 +50228,7 @@ "maybe_exists%5#0" ] }, - "5203": { + "5504": { "error": "check self.cumulative_principal_index exists", "op": "assert // check self.cumulative_principal_index exists", "stack_out": [ @@ -47263,7 +50239,7 @@ "maybe_value%5#0" ] }, - "5204": { + "5505": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%3#0", @@ -47280,7 +50256,7 @@ "aggregate%val_as_bytes%3#0" ] }, - "5205": { + "5506": { "op": "replace2 65", "stack_out": [ "box_prefixed_key%0#1", @@ -47289,7 +50265,7 @@ "position#0" ] }, - "5207": { + "5508": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#1", @@ -47299,7 +50275,7 @@ "0" ] }, - "5208": { + "5509": { "op": "bytec_2 // \"event_cursor\"", "defined_out": [ "\"event_cursor\"", @@ -47318,7 +50294,7 @@ "\"event_cursor\"" ] }, - "5209": { + "5510": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#1", @@ -47337,7 +50313,7 @@ "maybe_exists%6#0" ] }, - "5210": { + "5511": { "error": "check self.event_cursor exists", "op": "assert // check self.event_cursor exists", "stack_out": [ @@ -47348,7 +50324,7 @@ "maybe_value%6#0" ] }, - "5211": { + "5512": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%4#0", @@ -47365,7 +50341,7 @@ "aggregate%val_as_bytes%4#0" ] }, - "5212": { + "5513": { "op": "replace2 49", "stack_out": [ "box_prefixed_key%0#1", @@ -47374,7 +50350,7 @@ "position#0" ] }, - "5214": { + "5515": { "op": "uncover 3", "stack_out": [ "claimable_interest#0", @@ -47383,7 +50359,7 @@ "box_prefixed_key%0#1" ] }, - "5216": { + "5517": { "op": "swap", "stack_out": [ "claimable_interest#0", @@ -47392,18 +50368,18 @@ "position#0" ] }, - "5217": { + "5518": { "op": "box_put", "stack_out": [ "claimable_interest#0", "claimable_principal#0" ] }, - "5218": { + "5519": { "retsub": true, "op": "retsub" }, - "5219": { + "5520": { "subroutine": "modules.accounting.AccountingModule._ensure_units_activated", "params": { "holding_address#0": "bytes" @@ -47412,20 +50388,20 @@ "stack_in": [], "op": "proto 1 0" }, - "5222": { + "5523": { "op": "intc_0 // 0", "stack_out": [ "position#0" ] }, - "5223": { + "5524": { "op": "pushbytes \"\"", "stack_out": [ "position#0", "activated_units#0" ] }, - "5225": { + "5526": { "op": "bytec 8 // 0x52234163636f756e7423", "defined_out": [ "0x52234163636f756e7423" @@ -47436,7 +50412,7 @@ "0x52234163636f756e7423" ] }, - "5227": { + "5528": { "op": "frame_dig -1", "defined_out": [ "0x52234163636f756e7423", @@ -47449,7 +50425,7 @@ "holding_address#0 (copy)" ] }, - "5229": { + "5530": { "op": "concat", "defined_out": [ "box_prefixed_key%0#1" @@ -47460,7 +50436,7 @@ "box_prefixed_key%0#1" ] }, - "5230": { + "5531": { "op": "dup", "defined_out": [ "box_prefixed_key%0#1" @@ -47472,7 +50448,7 @@ "box_prefixed_key%0#1" ] }, - "5231": { + "5532": { "op": "box_len", "defined_out": [ "_%0#0", @@ -47487,7 +50463,7 @@ "maybe_exists%0#0" ] }, - "5232": { + "5533": { "op": "bury 1", "stack_out": [ "position#0", @@ -47496,7 +50472,7 @@ "maybe_exists%0#0" ] }, - "5234": { + "5535": { "error": "Invalid account holding address", "op": "assert // Invalid account holding address", "stack_out": [ @@ -47505,7 +50481,7 @@ "box_prefixed_key%0#1" ] }, - "5235": { + "5536": { "op": "intc_0 // 0", "stack_out": [ "position#0", @@ -47514,7 +50490,7 @@ "0" ] }, - "5236": { + "5537": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"", @@ -47529,7 +50505,7 @@ "\"status\"" ] }, - "5237": { + "5538": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#1", @@ -47544,7 +50520,7 @@ "maybe_exists%0#0" ] }, - "5238": { + "5539": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ @@ -47554,7 +50530,7 @@ "maybe_value%0#0" ] }, - "5239": { + "5540": { "op": "pushint 50", "defined_out": [ "50", @@ -47569,7 +50545,7 @@ "50" ] }, - "5241": { + "5542": { "op": "==", "defined_out": [ "box_prefixed_key%0#1", @@ -47582,7 +50558,7 @@ "tmp%0#1" ] }, - "5242": { + "5543": { "op": "bz _ensure_units_activated_after_if_else@2", "stack_out": [ "position#0", @@ -47590,11 +50566,11 @@ "box_prefixed_key%0#1" ] }, - "5245": { + "5546": { "retsub": true, "op": "retsub" }, - "5246": { + "5547": { "block": "_ensure_units_activated_after_if_else@2", "stack_in": [ "position#0", @@ -47612,7 +50588,7 @@ "box_prefixed_key%0#1" ] }, - "5248": { + "5549": { "op": "box_get", "defined_out": [ "aggregate%box_get%1#0", @@ -47627,7 +50603,7 @@ "aggregate%box_get%1#0" ] }, - "5249": { + "5550": { "op": "swap", "stack_out": [ "position#0", @@ -47637,7 +50613,7 @@ "position#0" ] }, - "5250": { + "5551": { "op": "dup", "stack_out": [ "position#0", @@ -47648,7 +50624,7 @@ "position#0 (copy)" ] }, - "5251": { + "5552": { "op": "cover 2", "stack_out": [ "position#0", @@ -47659,7 +50635,7 @@ "position#0" ] }, - "5253": { + "5554": { "op": "frame_bury 0", "defined_out": [ "aggregate%box_get%1#0", @@ -47674,7 +50650,7 @@ "aggregate%box_get%1#0" ] }, - "5255": { + "5556": { "error": "check self.account entry exists", "op": "assert // check self.account entry exists", "stack_out": [ @@ -47684,7 +50660,7 @@ "position#0" ] }, - "5256": { + "5557": { "op": "pushint 40", "defined_out": [ "40", @@ -47699,7 +50675,7 @@ "40" ] }, - "5258": { + "5559": { "op": "extract_uint64", "defined_out": [ "activated_units#0", @@ -47713,7 +50689,7 @@ "activated_units#0" ] }, - "5259": { + "5560": { "op": "dup", "stack_out": [ "position#0", @@ -47723,7 +50699,7 @@ "activated_units#0" ] }, - "5260": { + "5561": { "op": "frame_bury 1", "defined_out": [ "activated_units#0", @@ -47737,7 +50713,7 @@ "activated_units#0" ] }, - "5262": { + "5563": { "op": "bnz _ensure_units_activated_after_if_else@4", "stack_out": [ "position#0", @@ -47745,11 +50721,11 @@ "box_prefixed_key%0#1" ] }, - "5265": { + "5566": { "retsub": true, "op": "retsub" }, - "5266": { + "5567": { "block": "_ensure_units_activated_after_if_else@4", "stack_in": [ "position#0", @@ -47767,7 +50743,7 @@ "position#0" ] }, - "5268": { + "5569": { "op": "dup", "defined_out": [ "position#0", @@ -47781,7 +50757,7 @@ "position#0 (copy)" ] }, - "5269": { + "5570": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -47797,7 +50773,7 @@ "32" ] }, - "5270": { + "5571": { "op": "extract_uint64", "defined_out": [ "position#0", @@ -47811,7 +50787,7 @@ "values%2#0" ] }, - "5271": { + "5572": { "op": "frame_dig 1", "defined_out": [ "activated_units#0", @@ -47827,7 +50803,7 @@ "activated_units#0" ] }, - "5273": { + "5574": { "op": "dup", "defined_out": [ "activated_units#0", @@ -47845,7 +50821,7 @@ "activated_units#0 (copy)" ] }, - "5274": { + "5575": { "op": "cover 3", "stack_out": [ "position#0", @@ -47857,7 +50833,7 @@ "activated_units#0 (copy)" ] }, - "5276": { + "5577": { "op": "+", "defined_out": [ "activated_units#0", @@ -47873,7 +50849,7 @@ "tmp%2#0" ] }, - "5277": { + "5578": { "op": "itob", "defined_out": [ "activated_units#0", @@ -47889,7 +50865,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "5278": { + "5579": { "op": "replace2 32", "stack_out": [ "position#0", @@ -47899,7 +50875,7 @@ "position#0" ] }, - "5280": { + "5581": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -47915,7 +50891,7 @@ "0" ] }, - "5281": { + "5582": { "op": "itob", "defined_out": [ "activated_units#0", @@ -47931,7 +50907,7 @@ "aggregate%val_as_bytes%1#0" ] }, - "5282": { + "5583": { "op": "replace2 40", "stack_out": [ "position#0", @@ -47941,7 +50917,7 @@ "position#0" ] }, - "5284": { + "5585": { "op": "frame_dig 2", "defined_out": [ "activated_units#0", @@ -47957,7 +50933,7 @@ "box_prefixed_key%0#1" ] }, - "5286": { + "5587": { "op": "swap", "stack_out": [ "position#0", @@ -47968,7 +50944,7 @@ "position#0" ] }, - "5287": { + "5588": { "op": "box_put", "stack_out": [ "position#0", @@ -47977,7 +50953,7 @@ "activated_units#0" ] }, - "5288": { + "5589": { "op": "intc_0 // 0", "stack_out": [ "position#0", @@ -47987,8 +50963,8 @@ "0" ] }, - "5289": { - "op": "bytec 10 // \"reserved_units_total\"", + "5590": { + "op": "bytec 11 // \"reserved_units_total\"", "defined_out": [ "\"reserved_units_total\"", "0", @@ -48005,7 +50981,7 @@ "\"reserved_units_total\"" ] }, - "5291": { + "5592": { "op": "app_global_get_ex", "defined_out": [ "activated_units#0", @@ -48023,7 +50999,7 @@ "maybe_exists%0#0" ] }, - "5292": { + "5593": { "error": "check self.reserved_units_total exists", "op": "assert // check self.reserved_units_total exists", "stack_out": [ @@ -48034,7 +51010,7 @@ "maybe_value%0#0" ] }, - "5293": { + "5594": { "op": "dup", "defined_out": [ "activated_units#0", @@ -48052,7 +51028,7 @@ "maybe_value%0#0 (copy)" ] }, - "5294": { + "5595": { "op": "dig 2", "stack_out": [ "position#0", @@ -48064,7 +51040,7 @@ "activated_units#0 (copy)" ] }, - "5296": { + "5597": { "op": ">=", "defined_out": [ "activated_units#0", @@ -48082,7 +51058,7 @@ "tmp%3#0" ] }, - "5297": { + "5598": { "error": "Insufficient remaining D-ASA units", "op": "assert // Insufficient remaining D-ASA units", "stack_out": [ @@ -48093,7 +51069,7 @@ "maybe_value%0#0" ] }, - "5298": { + "5599": { "op": "swap", "stack_out": [ "position#0", @@ -48103,7 +51079,7 @@ "activated_units#0" ] }, - "5299": { + "5600": { "op": "-", "defined_out": [ "activated_units#0", @@ -48118,8 +51094,8 @@ "tmp%4#0" ] }, - "5300": { - "op": "bytec 10 // \"reserved_units_total\"", + "5601": { + "op": "bytec 11 // \"reserved_units_total\"", "stack_out": [ "position#0", "activated_units#0", @@ -48128,7 +51104,7 @@ "\"reserved_units_total\"" ] }, - "5302": { + "5603": { "op": "swap", "stack_out": [ "position#0", @@ -48138,7 +51114,7 @@ "tmp%4#0" ] }, - "5303": { + "5604": { "op": "app_global_put", "stack_out": [ "position#0", @@ -48146,11 +51122,11 @@ "box_prefixed_key%0#1" ] }, - "5304": { + "5605": { "retsub": true, "op": "retsub" }, - "5305": { + "5606": { "subroutine": "modules.actus_kernel.ActusKernelModule._scaled_mul_div", "params": { "multiplicand#0": "uint64", @@ -48161,7 +51137,7 @@ "stack_in": [], "op": "proto 3 1" }, - "5308": { + "5609": { "op": "frame_dig -3", "defined_out": [ "multiplicand#0 (copy)" @@ -48170,11 +51146,11 @@ "multiplicand#0 (copy)" ] }, - "5310": { + "5611": { "op": "bz _scaled_mul_div_if_body@2", "stack_out": [] }, - "5313": { + "5614": { "op": "frame_dig -2", "defined_out": [ "multiplier#0 (copy)" @@ -48183,11 +51159,11 @@ "multiplier#0 (copy)" ] }, - "5315": { + "5616": { "op": "bnz _scaled_mul_div_after_if_else@3", "stack_out": [] }, - "5318": { + "5619": { "block": "_scaled_mul_div_if_body@2", "stack_in": [], "op": "intc_0 // 0", @@ -48198,11 +51174,11 @@ "0" ] }, - "5319": { + "5620": { "retsub": true, "op": "retsub" }, - "5320": { + "5621": { "block": "_scaled_mul_div_after_if_else@3", "stack_in": [], "op": "frame_dig -3", @@ -48213,7 +51189,7 @@ "multiplicand#0 (copy)" ] }, - "5322": { + "5623": { "op": "frame_dig -2", "defined_out": [ "multiplicand#0 (copy)", @@ -48224,7 +51200,7 @@ "multiplier#0 (copy)" ] }, - "5324": { + "5625": { "op": "mulw", "defined_out": [ "high#0", @@ -48235,7 +51211,7 @@ "low#0" ] }, - "5325": { + "5626": { "op": "frame_dig -1", "defined_out": [ "divisor#0 (copy)", @@ -48248,7 +51224,7 @@ "divisor#0 (copy)" ] }, - "5327": { + "5628": { "op": "divw", "defined_out": [ "tmp%4#0" @@ -48257,11 +51233,11 @@ "tmp%4#0" ] }, - "5328": { + "5629": { "retsub": true, "op": "retsub" }, - "5329": { + "5630": { "subroutine": "modules.actus_kernel.ActusKernelModule._amount_to_index_delta", "params": { "amount#0": "uint64" @@ -48270,7 +51246,7 @@ "stack_in": [], "op": "proto 1 1" }, - "5332": { + "5633": { "op": "frame_dig -1", "defined_out": [ "amount#0 (copy)" @@ -48279,11 +51255,11 @@ "amount#0 (copy)" ] }, - "5334": { + "5635": { "op": "bnz _amount_to_index_delta_after_if_else@2", "stack_out": [] }, - "5337": { + "5638": { "op": "intc_0 // 0", "defined_out": [ "0" @@ -48292,11 +51268,11 @@ "0" ] }, - "5338": { + "5639": { "retsub": true, "op": "retsub" }, - "5339": { + "5640": { "block": "_amount_to_index_delta_after_if_else@2", "stack_in": [], "op": "intc_0 // 0", @@ -48307,7 +51283,7 @@ "0" ] }, - "5340": { + "5641": { "op": "bytec 13 // \"total_units\"", "defined_out": [ "\"total_units\"", @@ -48318,7 +51294,7 @@ "\"total_units\"" ] }, - "5342": { + "5643": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -48329,14 +51305,14 @@ "maybe_exists%0#0" ] }, - "5343": { + "5644": { "error": "check self.total_units exists", "op": "assert // check self.total_units exists", "stack_out": [ "maybe_value%0#0" ] }, - "5344": { + "5645": { "op": "dup", "defined_out": [ "maybe_value%0#0", @@ -48347,21 +51323,21 @@ "maybe_value%0#0 (copy)" ] }, - "5345": { + "5646": { "error": "No D-ASA units", "op": "assert // No D-ASA units", "stack_out": [ "maybe_value%0#0" ] }, - "5346": { + "5647": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#0", "0" ] }, - "5347": { + "5648": { "op": "bytec 5 // \"fixed_point_scale\"", "defined_out": [ "\"fixed_point_scale\"", @@ -48374,7 +51350,7 @@ "\"fixed_point_scale\"" ] }, - "5349": { + "5650": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%1#0", @@ -48387,7 +51363,7 @@ "maybe_exists%1#0" ] }, - "5350": { + "5651": { "error": "check self.fixed_point_scale exists", "op": "assert // check self.fixed_point_scale exists", "stack_out": [ @@ -48395,7 +51371,7 @@ "maybe_value%1#0" ] }, - "5351": { + "5652": { "op": "frame_dig -1", "defined_out": [ "amount#0 (copy)", @@ -48408,7 +51384,7 @@ "amount#0 (copy)" ] }, - "5353": { + "5654": { "op": "swap", "stack_out": [ "maybe_value%0#0", @@ -48416,7 +51392,7 @@ "maybe_value%1#0" ] }, - "5354": { + "5655": { "op": "uncover 2", "stack_out": [ "amount#0 (copy)", @@ -48424,7 +51400,7 @@ "maybe_value%0#0" ] }, - "5356": { + "5657": { "callsub": "modules.actus_kernel.ActusKernelModule._scaled_mul_div", "op": "callsub _scaled_mul_div", "defined_out": [ @@ -48434,11 +51410,11 @@ "tmp%2#0" ] }, - "5359": { + "5660": { "retsub": true, "op": "retsub" }, - "5360": { + "5661": { "subroutine": "modules.actus_kernel.ActusKernelModule._index_delta_to_amount", "params": { "index_delta#0": "uint64" @@ -48447,7 +51423,7 @@ "stack_in": [], "op": "proto 1 1" }, - "5363": { + "5664": { "op": "frame_dig -1", "defined_out": [ "index_delta#0 (copy)" @@ -48456,11 +51432,11 @@ "index_delta#0 (copy)" ] }, - "5365": { + "5666": { "op": "bnz _index_delta_to_amount_after_if_else@2", "stack_out": [] }, - "5368": { + "5669": { "op": "intc_0 // 0", "defined_out": [ "0" @@ -48469,11 +51445,11 @@ "0" ] }, - "5369": { + "5670": { "retsub": true, "op": "retsub" }, - "5370": { + "5671": { "block": "_index_delta_to_amount_after_if_else@2", "stack_in": [], "op": "intc_0 // 0", @@ -48484,7 +51460,7 @@ "0" ] }, - "5371": { + "5672": { "op": "bytec 13 // \"total_units\"", "defined_out": [ "\"total_units\"", @@ -48495,7 +51471,7 @@ "\"total_units\"" ] }, - "5373": { + "5674": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -48506,21 +51482,21 @@ "maybe_exists%0#0" ] }, - "5374": { + "5675": { "error": "check self.total_units exists", "op": "assert // check self.total_units exists", "stack_out": [ "maybe_value%0#0" ] }, - "5375": { + "5676": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#0", "0" ] }, - "5376": { + "5677": { "op": "bytec 5 // \"fixed_point_scale\"", "defined_out": [ "\"fixed_point_scale\"", @@ -48533,7 +51509,7 @@ "\"fixed_point_scale\"" ] }, - "5378": { + "5679": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%1#0", @@ -48546,7 +51522,7 @@ "maybe_exists%1#0" ] }, - "5379": { + "5680": { "error": "check self.fixed_point_scale exists", "op": "assert // check self.fixed_point_scale exists", "stack_out": [ @@ -48554,10 +51530,10 @@ "maybe_value%1#0" ] }, - "5380": { + "5681": { "op": "frame_dig -1" }, - "5382": { + "5683": { "op": "swap", "defined_out": [ "index_delta#0 (copy)", @@ -48570,7 +51546,7 @@ "maybe_value%1#0" ] }, - "5383": { + "5684": { "callsub": "modules.actus_kernel.ActusKernelModule._scaled_mul_div", "op": "callsub _scaled_mul_div", "defined_out": [ @@ -48580,11 +51556,11 @@ "tmp%1#0" ] }, - "5386": { + "5687": { "retsub": true, "op": "retsub" }, - "5387": { + "5688": { "subroutine": "modules.actus_kernel.ActusKernelModule._get_schedule_entry", "params": { "event_id#0": "uint64" @@ -48593,7 +51569,7 @@ "stack_in": [], "op": "proto 1 1" }, - "5390": { + "5691": { "op": "intc_0 // 0", "defined_out": [ "0" @@ -48602,8 +51578,8 @@ "0" ] }, - "5391": { - "op": "bytec 4 // \"schedule_entry_count\"", + "5692": { + "op": "bytec_3 // \"schedule_entry_count\"", "defined_out": [ "\"schedule_entry_count\"", "0" @@ -48613,7 +51589,7 @@ "\"schedule_entry_count\"" ] }, - "5393": { + "5693": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -48624,14 +51600,14 @@ "maybe_exists%0#0" ] }, - "5394": { + "5694": { "error": "check self.schedule_entry_count exists", "op": "assert // check self.schedule_entry_count exists", "stack_out": [ "maybe_value%0#0" ] }, - "5395": { + "5695": { "op": "frame_dig -1", "defined_out": [ "event_id#0 (copy)", @@ -48642,7 +51618,7 @@ "event_id#0 (copy)" ] }, - "5397": { + "5697": { "op": ">", "defined_out": [ "tmp%0#0" @@ -48651,18 +51627,18 @@ "tmp%0#0" ] }, - "5398": { + "5698": { "error": "Invalid event id", "op": "assert // Invalid event id", "stack_out": [] }, - "5399": { + "5699": { "op": "frame_dig -1", "stack_out": [ "event_id#0 (copy)" ] }, - "5401": { + "5701": { "op": "pushint 16", "defined_out": [ "16", @@ -48673,7 +51649,7 @@ "16" ] }, - "5403": { + "5703": { "op": "/", "defined_out": [ "page_index#0" @@ -48682,7 +51658,7 @@ "page_index#0" ] }, - "5404": { + "5704": { "op": "itob", "defined_out": [ "encoded_value%0#0" @@ -48691,8 +51667,8 @@ "encoded_value%0#0" ] }, - "5405": { - "op": "bytec 31 // 0x5323", + "5705": { + "op": "bytec 24 // 0x5323", "defined_out": [ "0x5323", "encoded_value%0#0" @@ -48702,14 +51678,14 @@ "0x5323" ] }, - "5407": { + "5707": { "op": "swap", "stack_out": [ "0x5323", "encoded_value%0#0" ] }, - "5408": { + "5708": { "op": "concat", "defined_out": [ "box_prefixed_key%0#0" @@ -48718,7 +51694,7 @@ "box_prefixed_key%0#0" ] }, - "5409": { + "5709": { "op": "dup", "defined_out": [ "box_prefixed_key%0#0", @@ -48729,7 +51705,7 @@ "box_prefixed_key%0#0 (copy)" ] }, - "5410": { + "5710": { "op": "box_len", "defined_out": [ "_%0#0", @@ -48742,28 +51718,28 @@ "maybe_exists%1#0" ] }, - "5411": { + "5711": { "op": "bury 1", "stack_out": [ "box_prefixed_key%0#0", "maybe_exists%1#0" ] }, - "5413": { + "5713": { "error": "Invalid schedule page", "op": "assert // Invalid schedule page", "stack_out": [ "box_prefixed_key%0#0" ] }, - "5414": { + "5714": { "op": "frame_dig -1", "stack_out": [ "box_prefixed_key%0#0", "event_id#0 (copy)" ] }, - "5416": { + "5716": { "op": "pushint 16", "stack_out": [ "box_prefixed_key%0#0", @@ -48771,7 +51747,7 @@ "16" ] }, - "5418": { + "5718": { "op": "%", "defined_out": [ "box_prefixed_key%0#0", @@ -48782,7 +51758,7 @@ "offset#0" ] }, - "5419": { + "5719": { "op": "dig 1", "stack_out": [ "box_prefixed_key%0#0", @@ -48790,7 +51766,7 @@ "box_prefixed_key%0#0 (copy)" ] }, - "5421": { + "5721": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#0", @@ -48799,7 +51775,7 @@ "0" ] }, - "5422": { + "5722": { "op": "pushint 2", "defined_out": [ "0", @@ -48816,7 +51792,7 @@ "2" ] }, - "5424": { + "5724": { "op": "box_extract", "defined_out": [ "box%box_extract%0#0", @@ -48829,7 +51805,7 @@ "box%box_extract%0#0" ] }, - "5425": { + "5725": { "op": "btoi", "defined_out": [ "box%array_length%0#0", @@ -48842,7 +51818,7 @@ "box%array_length%0#0" ] }, - "5426": { + "5726": { "op": "dig 1", "defined_out": [ "box%array_length%0#0", @@ -48857,7 +51833,7 @@ "offset#0 (copy)" ] }, - "5428": { + "5728": { "op": ">", "defined_out": [ "box_prefixed_key%0#0", @@ -48870,7 +51846,7 @@ "tmp%4#0" ] }, - "5429": { + "5729": { "error": "Invalid schedule page", "op": "assert // Invalid schedule page", "stack_out": [ @@ -48878,7 +51854,7 @@ "offset#0" ] }, - "5430": { + "5730": { "op": "pushint 65", "defined_out": [ "65", @@ -48891,7 +51867,7 @@ "65" ] }, - "5432": { + "5732": { "op": "*", "defined_out": [ "box%element_offset%0#0", @@ -48902,7 +51878,7 @@ "box%element_offset%0#0" ] }, - "5433": { + "5733": { "op": "pushint 2", "stack_out": [ "box_prefixed_key%0#0", @@ -48910,7 +51886,7 @@ "2" ] }, - "5435": { + "5735": { "op": "+", "defined_out": [ "box%offset%0#0", @@ -48921,7 +51897,7 @@ "box%offset%0#0" ] }, - "5436": { + "5736": { "op": "pushint 65", "stack_out": [ "box_prefixed_key%0#0", @@ -48929,7 +51905,7 @@ "65" ] }, - "5438": { + "5738": { "op": "box_extract", "defined_out": [ "box%box_extract%1#0" @@ -48938,11 +51914,11 @@ "box%box_extract%1#0" ] }, - "5439": { + "5739": { "retsub": true, "op": "retsub" }, - "5440": { + "5740": { "subroutine": "modules.actus_kernel.ActusKernelModule._assert_event_allowed_for_contract_type", "params": { "contract_type#0": "uint64", @@ -48952,7 +51928,7 @@ "stack_in": [], "op": "proto 2 0" }, - "5443": { + "5743": { "op": "frame_dig -1", "defined_out": [ "event_type#0 (copy)" @@ -48961,7 +51937,7 @@ "event_type#0 (copy)" ] }, - "5445": { + "5745": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -48972,7 +51948,7 @@ "1" ] }, - "5446": { + "5746": { "op": "==", "defined_out": [ "tmp%0#0" @@ -48981,17 +51957,17 @@ "tmp%0#0" ] }, - "5447": { + "5747": { "op": "bnz _assert_event_allowed_for_contract_type_if_body@6", "stack_out": [] }, - "5450": { + "5750": { "op": "frame_dig -1", "stack_out": [ "event_type#0 (copy)" ] }, - "5452": { + "5752": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -49002,7 +51978,7 @@ "8" ] }, - "5453": { + "5753": { "op": "==", "defined_out": [ "tmp%1#0" @@ -49011,17 +51987,17 @@ "tmp%1#0" ] }, - "5454": { + "5754": { "op": "bnz _assert_event_allowed_for_contract_type_if_body@6", "stack_out": [] }, - "5457": { + "5757": { "op": "frame_dig -1", "stack_out": [ "event_type#0 (copy)" ] }, - "5459": { + "5759": { "op": "pushint 19", "defined_out": [ "19", @@ -49032,7 +52008,7 @@ "19" ] }, - "5461": { + "5761": { "op": "==", "defined_out": [ "tmp%2#0" @@ -49041,17 +52017,17 @@ "tmp%2#0" ] }, - "5462": { + "5762": { "op": "bnz _assert_event_allowed_for_contract_type_if_body@6", "stack_out": [] }, - "5465": { + "5765": { "op": "frame_dig -1", "stack_out": [ "event_type#0 (copy)" ] }, - "5467": { + "5767": { "op": "pushint 12", "defined_out": [ "12", @@ -49062,7 +52038,7 @@ "12" ] }, - "5469": { + "5769": { "op": "==", "defined_out": [ "tmp%3#0" @@ -49071,17 +52047,17 @@ "tmp%3#0" ] }, - "5470": { + "5770": { "op": "bnz _assert_event_allowed_for_contract_type_if_body@6", "stack_out": [] }, - "5473": { + "5773": { "op": "frame_dig -1", "stack_out": [ "event_type#0 (copy)" ] }, - "5475": { + "5775": { "op": "pushint 11", "defined_out": [ "11", @@ -49092,7 +52068,7 @@ "11" ] }, - "5477": { + "5777": { "op": "==", "defined_out": [ "tmp%4#0" @@ -49101,11 +52077,11 @@ "tmp%4#0" ] }, - "5478": { + "5778": { "op": "bz _assert_event_allowed_for_contract_type_after_if_else@7", "stack_out": [] }, - "5481": { + "5781": { "block": "_assert_event_allowed_for_contract_type_if_body@6", "stack_in": [], "op": "intc_1 // 1", @@ -49116,7 +52092,7 @@ "tmp%0#0" ] }, - "5482": { + "5782": { "error": "Invalid ACTUS configuration", "block": "_assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34", "stack_in": [ @@ -49126,11 +52102,11 @@ "defined_out": [], "stack_out": [] }, - "5483": { + "5783": { "retsub": true, "op": "retsub" }, - "5484": { + "5784": { "block": "_assert_event_allowed_for_contract_type_after_if_else@7", "stack_in": [], "op": "frame_dig -2", @@ -49141,11 +52117,11 @@ "contract_type#0 (copy)" ] }, - "5486": { + "5786": { "op": "bnz _assert_event_allowed_for_contract_type_after_if_else@9", "stack_out": [] }, - "5489": { + "5789": { "op": "intc_0 // 0", "defined_out": [ "tmp%0#0" @@ -49154,10 +52130,10 @@ "tmp%0#0" ] }, - "5490": { + "5790": { "op": "b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34" }, - "5493": { + "5793": { "block": "_assert_event_allowed_for_contract_type_after_if_else@9", "stack_in": [], "op": "frame_dig -2", @@ -49168,7 +52144,7 @@ "contract_type#0 (copy)" ] }, - "5495": { + "5795": { "op": "pushint 3", "defined_out": [ "3", @@ -49179,7 +52155,7 @@ "3" ] }, - "5497": { + "5797": { "op": "==", "defined_out": [ "tmp%6#0" @@ -49188,17 +52164,17 @@ "tmp%6#0" ] }, - "5498": { + "5798": { "op": "bnz _assert_event_allowed_for_contract_type_if_body@11", "stack_out": [] }, - "5501": { + "5801": { "op": "frame_dig -2", "stack_out": [ "contract_type#0 (copy)" ] }, - "5503": { + "5803": { "op": "pushint 2", "defined_out": [ "2", @@ -49209,7 +52185,7 @@ "2" ] }, - "5505": { + "5805": { "op": "==", "defined_out": [ "tmp%7#0" @@ -49218,11 +52194,11 @@ "tmp%7#0" ] }, - "5506": { + "5806": { "op": "bz _assert_event_allowed_for_contract_type_after_if_else@16", "stack_out": [] }, - "5509": { + "5809": { "block": "_assert_event_allowed_for_contract_type_if_body@11", "stack_in": [], "op": "frame_dig -1", @@ -49233,7 +52209,7 @@ "event_type#0 (copy)" ] }, - "5511": { + "5811": { "op": "pushint 3", "defined_out": [ "3", @@ -49244,7 +52220,7 @@ "3" ] }, - "5513": { + "5813": { "op": "==", "defined_out": [ "tmp%8#0" @@ -49253,17 +52229,17 @@ "tmp%8#0" ] }, - "5514": { + "5814": { "op": "bnz _assert_event_allowed_for_contract_type_bool_true@13", "stack_out": [] }, - "5517": { + "5817": { "op": "frame_dig -1", "stack_out": [ "event_type#0 (copy)" ] }, - "5519": { + "5819": { "op": "pushint 18", "defined_out": [ "18", @@ -49274,7 +52250,7 @@ "18" ] }, - "5521": { + "5821": { "op": "==", "defined_out": [ "tmp%9#0" @@ -49283,11 +52259,11 @@ "tmp%9#0" ] }, - "5522": { + "5822": { "op": "bz _assert_event_allowed_for_contract_type_bool_false@14", "stack_out": [] }, - "5525": { + "5825": { "block": "_assert_event_allowed_for_contract_type_bool_true@13", "stack_in": [], "op": "intc_1 // 1", @@ -49298,7 +52274,7 @@ "or_result%0#0" ] }, - "5526": { + "5826": { "op": "b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34", "defined_out": [ "tmp%0#0" @@ -49307,7 +52283,7 @@ "tmp%0#0" ] }, - "5529": { + "5829": { "block": "_assert_event_allowed_for_contract_type_bool_false@14", "stack_in": [], "op": "intc_0 // 0", @@ -49318,7 +52294,7 @@ "or_result%0#0" ] }, - "5530": { + "5830": { "op": "b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34", "defined_out": [ "tmp%0#0" @@ -49327,7 +52303,7 @@ "tmp%0#0" ] }, - "5533": { + "5833": { "block": "_assert_event_allowed_for_contract_type_after_if_else@16", "stack_in": [], "op": "frame_dig -2", @@ -49338,7 +52314,7 @@ "contract_type#0 (copy)" ] }, - "5535": { + "5835": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -49349,7 +52325,7 @@ "1" ] }, - "5536": { + "5836": { "op": "==", "defined_out": [ "tmp%10#0" @@ -49358,11 +52334,11 @@ "tmp%10#0" ] }, - "5537": { + "5837": { "op": "bz _assert_event_allowed_for_contract_type_after_if_else@23", "stack_out": [] }, - "5540": { + "5840": { "op": "frame_dig -1", "defined_out": [ "event_type#0 (copy)" @@ -49371,7 +52347,7 @@ "event_type#0 (copy)" ] }, - "5542": { + "5842": { "op": "pushint 3", "defined_out": [ "3", @@ -49382,7 +52358,7 @@ "3" ] }, - "5544": { + "5844": { "op": "==", "defined_out": [ "tmp%11#0" @@ -49391,17 +52367,17 @@ "tmp%11#0" ] }, - "5545": { + "5845": { "op": "bnz _assert_event_allowed_for_contract_type_bool_true@20", "stack_out": [] }, - "5548": { + "5848": { "op": "frame_dig -1", "stack_out": [ "event_type#0 (copy)" ] }, - "5550": { + "5850": { "op": "pushint 18", "defined_out": [ "18", @@ -49412,7 +52388,7 @@ "18" ] }, - "5552": { + "5852": { "op": "==", "defined_out": [ "tmp%12#0" @@ -49421,17 +52397,17 @@ "tmp%12#0" ] }, - "5553": { + "5853": { "op": "bnz _assert_event_allowed_for_contract_type_bool_true@20", "stack_out": [] }, - "5556": { + "5856": { "op": "frame_dig -1", "stack_out": [ "event_type#0 (copy)" ] }, - "5558": { + "5858": { "op": "pushint 5", "defined_out": [ "5", @@ -49442,7 +52418,7 @@ "5" ] }, - "5560": { + "5860": { "op": "==", "defined_out": [ "tmp%13#0" @@ -49451,11 +52427,11 @@ "tmp%13#0" ] }, - "5561": { + "5861": { "op": "bz _assert_event_allowed_for_contract_type_bool_false@21", "stack_out": [] }, - "5564": { + "5864": { "block": "_assert_event_allowed_for_contract_type_bool_true@20", "stack_in": [], "op": "intc_1 // 1", @@ -49466,7 +52442,7 @@ "or_result%1#0" ] }, - "5565": { + "5865": { "op": "b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34", "defined_out": [ "tmp%0#0" @@ -49475,7 +52451,7 @@ "tmp%0#0" ] }, - "5568": { + "5868": { "block": "_assert_event_allowed_for_contract_type_bool_false@21", "stack_in": [], "op": "intc_0 // 0", @@ -49486,7 +52462,7 @@ "or_result%1#0" ] }, - "5569": { + "5869": { "op": "b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34", "defined_out": [ "tmp%0#0" @@ -49495,7 +52471,7 @@ "tmp%0#0" ] }, - "5572": { + "5872": { "block": "_assert_event_allowed_for_contract_type_after_if_else@23", "stack_in": [], "op": "frame_dig -2", @@ -49506,7 +52482,7 @@ "contract_type#0 (copy)" ] }, - "5574": { + "5874": { "op": "pushint 4", "defined_out": [ "4", @@ -49517,7 +52493,7 @@ "4" ] }, - "5576": { + "5876": { "op": "==", "defined_out": [ "tmp%14#0" @@ -49526,11 +52502,11 @@ "tmp%14#0" ] }, - "5577": { + "5877": { "op": "bz _assert_event_allowed_for_contract_type_after_if_else@31", "stack_out": [] }, - "5580": { + "5880": { "op": "frame_dig -1", "defined_out": [ "event_type#0 (copy)" @@ -49539,7 +52515,7 @@ "event_type#0 (copy)" ] }, - "5582": { + "5882": { "op": "pushint 3", "defined_out": [ "3", @@ -49550,7 +52526,7 @@ "3" ] }, - "5584": { + "5884": { "op": "==", "defined_out": [ "tmp%15#0" @@ -49559,24 +52535,24 @@ "tmp%15#0" ] }, - "5585": { + "5885": { "op": "bnz _assert_event_allowed_for_contract_type_bool_true@28", "stack_out": [] }, - "5588": { + "5888": { "op": "frame_dig -1", "stack_out": [ "event_type#0 (copy)" ] }, - "5590": { + "5890": { "op": "pushint 4", "stack_out": [ "event_type#0 (copy)", "4" ] }, - "5592": { + "5892": { "op": "==", "defined_out": [ "tmp%16#0" @@ -49585,17 +52561,17 @@ "tmp%16#0" ] }, - "5593": { + "5893": { "op": "bnz _assert_event_allowed_for_contract_type_bool_true@28", "stack_out": [] }, - "5596": { + "5896": { "op": "frame_dig -1", "stack_out": [ "event_type#0 (copy)" ] }, - "5598": { + "5898": { "op": "pushint 18", "defined_out": [ "18", @@ -49606,7 +52582,7 @@ "18" ] }, - "5600": { + "5900": { "op": "==", "defined_out": [ "tmp%17#0" @@ -49615,17 +52591,17 @@ "tmp%17#0" ] }, - "5601": { + "5901": { "op": "bnz _assert_event_allowed_for_contract_type_bool_true@28", "stack_out": [] }, - "5604": { + "5904": { "op": "frame_dig -1", "stack_out": [ "event_type#0 (copy)" ] }, - "5606": { + "5906": { "op": "pushint 5", "defined_out": [ "5", @@ -49636,7 +52612,7 @@ "5" ] }, - "5608": { + "5908": { "op": "==", "defined_out": [ "tmp%18#0" @@ -49645,11 +52621,11 @@ "tmp%18#0" ] }, - "5609": { + "5909": { "op": "bz _assert_event_allowed_for_contract_type_bool_false@29", "stack_out": [] }, - "5612": { + "5912": { "block": "_assert_event_allowed_for_contract_type_bool_true@28", "stack_in": [], "op": "intc_1 // 1", @@ -49660,7 +52636,7 @@ "or_result%2#0" ] }, - "5613": { + "5913": { "op": "b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34", "defined_out": [ "tmp%0#0" @@ -49669,7 +52645,7 @@ "tmp%0#0" ] }, - "5616": { + "5916": { "block": "_assert_event_allowed_for_contract_type_bool_false@29", "stack_in": [], "op": "intc_0 // 0", @@ -49680,7 +52656,7 @@ "or_result%2#0" ] }, - "5617": { + "5917": { "op": "b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34", "defined_out": [ "tmp%0#0" @@ -49689,7 +52665,7 @@ "tmp%0#0" ] }, - "5620": { + "5920": { "block": "_assert_event_allowed_for_contract_type_after_if_else@31", "stack_in": [], "op": "frame_dig -2", @@ -49700,7 +52676,7 @@ "contract_type#0 (copy)" ] }, - "5622": { + "5922": { "op": "pushint 5", "defined_out": [ "5", @@ -49711,7 +52687,7 @@ "5" ] }, - "5624": { + "5924": { "op": "==", "defined_out": [ "tmp%19#0" @@ -49720,11 +52696,11 @@ "tmp%19#0" ] }, - "5625": { + "5925": { "op": "bz _assert_event_allowed_for_contract_type_after_if_else@33", "stack_out": [] }, - "5628": { + "5928": { "op": "frame_dig -1", "defined_out": [ "event_type#0 (copy)" @@ -49733,7 +52709,7 @@ "event_type#0 (copy)" ] }, - "5630": { + "5930": { "op": "pushint 3", "defined_out": [ "3", @@ -49744,7 +52720,7 @@ "3" ] }, - "5632": { + "5932": { "op": "==", "defined_out": [ "tmp%0#0" @@ -49753,10 +52729,10 @@ "tmp%0#0" ] }, - "5633": { + "5933": { "op": "b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34" }, - "5636": { + "5936": { "block": "_assert_event_allowed_for_contract_type_after_if_else@33", "stack_in": [], "op": "intc_0 // 0", @@ -49767,10 +52743,10 @@ "tmp%0#0" ] }, - "5637": { + "5937": { "op": "b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34" }, - "5640": { + "5940": { "subroutine": "modules.actus_kernel.ActusKernelModule._is_dynamic_annuity", "params": {}, "block": "_is_dynamic_annuity", @@ -49783,8 +52759,8 @@ "0" ] }, - "5641": { - "op": "bytec 12 // \"contract_type\"", + "5941": { + "op": "bytec 10 // \"contract_type\"", "defined_out": [ "\"contract_type\"", "0" @@ -49794,7 +52770,7 @@ "\"contract_type\"" ] }, - "5643": { + "5943": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -49805,14 +52781,14 @@ "maybe_exists%0#0" ] }, - "5644": { + "5944": { "error": "check self.contract_type exists", "op": "assert // check self.contract_type exists", "stack_out": [ "maybe_value%0#0" ] }, - "5645": { + "5945": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -49823,7 +52799,7 @@ "1" ] }, - "5646": { + "5946": { "op": "==", "defined_out": [ "tmp%0#0" @@ -49832,17 +52808,17 @@ "tmp%0#0" ] }, - "5647": { + "5947": { "op": "bz _is_dynamic_annuity_bool_false@3", "stack_out": [] }, - "5650": { + "5950": { "op": "intc_0 // 0", "stack_out": [ "0" ] }, - "5651": { + "5951": { "op": "bytec 34 // \"dynamic_principal_redemption\"", "defined_out": [ "\"dynamic_principal_redemption\"", @@ -49853,7 +52829,7 @@ "\"dynamic_principal_redemption\"" ] }, - "5653": { + "5953": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%1#0", @@ -49864,18 +52840,18 @@ "maybe_exists%1#0" ] }, - "5654": { + "5954": { "error": "check self.dynamic_principal_redemption exists", "op": "assert // check self.dynamic_principal_redemption exists", "stack_out": [ "maybe_value%1#0" ] }, - "5655": { + "5955": { "op": "bz _is_dynamic_annuity_bool_false@3", "stack_out": [] }, - "5658": { + "5958": { "op": "intc_1 // 1", "defined_out": [ "and_result%0#0" @@ -49884,11 +52860,11 @@ "and_result%0#0" ] }, - "5659": { + "5959": { "retsub": true, "op": "retsub" }, - "5660": { + "5960": { "block": "_is_dynamic_annuity_bool_false@3", "stack_in": [], "op": "intc_0 // 0", @@ -49899,11 +52875,11 @@ "and_result%0#0" ] }, - "5661": { + "5961": { "retsub": true, "op": "retsub" }, - "5662": { + "5962": { "subroutine": "modules.actus_kernel.ActusKernelModule._entry_interest_segment", "params": { "entry#0": "bytes" @@ -49912,7 +52888,7 @@ "stack_in": [], "op": "proto 1 2" }, - "5665": { + "5965": { "op": "frame_dig -1", "defined_out": [ "entry#0 (copy)" @@ -49921,7 +52897,7 @@ "entry#0 (copy)" ] }, - "5667": { + "5967": { "op": "pushint 17", "defined_out": [ "17", @@ -49932,7 +52908,7 @@ "17" ] }, - "5669": { + "5969": { "op": "extract_uint64", "defined_out": [ "values%0#0" @@ -49941,7 +52917,7 @@ "values%0#0" ] }, - "5670": { + "5970": { "op": "dup", "defined_out": [ "values%0#0" @@ -49951,20 +52927,20 @@ "values%0#0" ] }, - "5671": { + "5971": { "op": "bz _entry_interest_segment_if_body@3", "stack_out": [ "values%0#0" ] }, - "5674": { + "5974": { "op": "intc_0 // 0", "stack_out": [ "values%0#0", "0" ] }, - "5675": { + "5975": { "op": "bytec 9 // \"nominal_interest_rate\"", "defined_out": [ "\"nominal_interest_rate\"", @@ -49977,7 +52953,7 @@ "\"nominal_interest_rate\"" ] }, - "5677": { + "5977": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -49990,7 +52966,7 @@ "maybe_exists%0#0" ] }, - "5678": { + "5978": { "error": "check self.nominal_interest_rate exists", "op": "assert // check self.nominal_interest_rate exists", "stack_out": [ @@ -49998,20 +52974,20 @@ "maybe_value%0#0" ] }, - "5679": { + "5979": { "op": "bz _entry_interest_segment_if_body@3", "stack_out": [ "values%0#0" ] }, - "5682": { + "5982": { "op": "intc_0 // 0", "stack_out": [ "values%0#0", "0" ] }, - "5683": { + "5983": { "op": "bytec 7 // \"interest_calculation_base\"", "defined_out": [ "\"interest_calculation_base\"", @@ -50024,7 +53000,7 @@ "\"interest_calculation_base\"" ] }, - "5685": { + "5985": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%1#0", @@ -50037,7 +53013,7 @@ "maybe_exists%1#0" ] }, - "5686": { + "5986": { "error": "check self.interest_calculation_base exists", "op": "assert // check self.interest_calculation_base exists", "stack_out": [ @@ -50045,13 +53021,13 @@ "maybe_value%1#0" ] }, - "5687": { + "5987": { "op": "bnz _entry_interest_segment_after_if_else@4", "stack_out": [ "values%0#0" ] }, - "5690": { + "5990": { "block": "_entry_interest_segment_if_body@3", "stack_in": [ "values%0#0" @@ -50065,7 +53041,7 @@ "0" ] }, - "5691": { + "5991": { "op": "frame_dig -1", "defined_out": [ "0", @@ -50077,14 +53053,14 @@ "entry#0 (copy)" ] }, - "5693": { + "5993": { "op": "uncover 2" }, - "5695": { + "5995": { "retsub": true, "op": "retsub" }, - "5696": { + "5996": { "block": "_entry_interest_segment_after_if_else@4", "stack_in": [ "values%0#0" @@ -50098,7 +53074,7 @@ "0" ] }, - "5697": { + "5997": { "op": "bytec 7 // \"interest_calculation_base\"", "defined_out": [ "\"interest_calculation_base\"", @@ -50110,7 +53086,7 @@ "\"interest_calculation_base\"" ] }, - "5699": { + "5999": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%2#0", @@ -50122,7 +53098,7 @@ "maybe_exists%2#0" ] }, - "5700": { + "6000": { "error": "check self.interest_calculation_base exists", "op": "assert // check self.interest_calculation_base exists", "stack_out": [ @@ -50130,7 +53106,7 @@ "maybe_value%2#0" ] }, - "5701": { + "6001": { "op": "intc_0 // 0", "stack_out": [ "values%0#0", @@ -50138,7 +53114,7 @@ "0" ] }, - "5702": { + "6002": { "op": "bytec 9 // \"nominal_interest_rate\"", "defined_out": [ "\"nominal_interest_rate\"", @@ -50152,7 +53128,7 @@ "\"nominal_interest_rate\"" ] }, - "5704": { + "6004": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%3#0", @@ -50166,7 +53142,7 @@ "maybe_exists%3#0" ] }, - "5705": { + "6005": { "error": "check self.nominal_interest_rate exists", "op": "assert // check self.nominal_interest_rate exists", "stack_out": [ @@ -50175,7 +53151,7 @@ "maybe_value%3#0" ] }, - "5706": { + "6006": { "op": "intc_0 // 0", "stack_out": [ "values%0#0", @@ -50184,7 +53160,7 @@ "0" ] }, - "5707": { + "6007": { "op": "bytec 5 // \"fixed_point_scale\"", "defined_out": [ "\"fixed_point_scale\"", @@ -50200,7 +53176,7 @@ "\"fixed_point_scale\"" ] }, - "5709": { + "6009": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%4#0", @@ -50216,7 +53192,7 @@ "maybe_exists%4#0" ] }, - "5710": { + "6010": { "error": "check self.fixed_point_scale exists", "op": "assert // check self.fixed_point_scale exists", "stack_out": [ @@ -50226,7 +53202,7 @@ "maybe_value%4#0" ] }, - "5711": { + "6011": { "callsub": "modules.actus_kernel.ActusKernelModule._scaled_mul_div", "op": "callsub _scaled_mul_div", "defined_out": [ @@ -50237,7 +53213,7 @@ "accrued#0" ] }, - "5714": { + "6014": { "op": "intc_0 // 0", "stack_out": [ "values%0#0", @@ -50245,7 +53221,7 @@ "0" ] }, - "5715": { + "6015": { "op": "bytec 5 // \"fixed_point_scale\"", "stack_out": [ "values%0#0", @@ -50254,7 +53230,7 @@ "\"fixed_point_scale\"" ] }, - "5717": { + "6017": { "op": "app_global_get_ex", "defined_out": [ "accrued#0", @@ -50268,7 +53244,7 @@ "maybe_exists%5#0" ] }, - "5718": { + "6018": { "error": "check self.fixed_point_scale exists", "op": "assert // check self.fixed_point_scale exists", "stack_out": [ @@ -50277,10 +53253,10 @@ "maybe_value%5#0" ] }, - "5719": { + "6019": { "op": "frame_dig 0" }, - "5721": { + "6021": { "op": "swap", "defined_out": [ "accrued#0", @@ -50294,7 +53270,7 @@ "maybe_value%5#0" ] }, - "5722": { + "6022": { "callsub": "modules.actus_kernel.ActusKernelModule._scaled_mul_div", "op": "callsub _scaled_mul_div", "defined_out": [ @@ -50306,7 +53282,7 @@ "tmp%4#0" ] }, - "5725": { + "6025": { "op": "frame_dig -1", "defined_out": [ "entry#0 (copy)", @@ -50319,14 +53295,14 @@ "entry#0 (copy)" ] }, - "5727": { + "6027": { "op": "uncover 2" }, - "5729": { + "6029": { "retsub": true, "op": "retsub" }, - "5730": { + "6030": { "subroutine": "modules.actus_kernel.ActusKernelModule._discount_annuity_factor", "params": { "discount_factor#0": "uint64", @@ -50336,7 +53312,7 @@ "stack_in": [], "op": "proto 2 1" }, - "5733": { + "6033": { "op": "frame_dig -1", "defined_out": [ "redemption_factor#0 (copy)" @@ -50345,11 +53321,11 @@ "redemption_factor#0 (copy)" ] }, - "5735": { + "6035": { "op": "bnz _discount_annuity_factor_after_if_else@2", "stack_out": [] }, - "5738": { + "6038": { "op": "frame_dig -2", "defined_out": [ "discount_factor#0 (copy)" @@ -50358,11 +53334,11 @@ "discount_factor#0 (copy)" ] }, - "5740": { + "6040": { "retsub": true, "op": "retsub" }, - "5741": { + "6041": { "block": "_discount_annuity_factor_after_if_else@2", "stack_in": [], "op": "intc_0 // 0", @@ -50373,7 +53349,7 @@ "0" ] }, - "5742": { + "6042": { "op": "bytec 5 // \"fixed_point_scale\"", "defined_out": [ "\"fixed_point_scale\"", @@ -50384,7 +53360,7 @@ "\"fixed_point_scale\"" ] }, - "5744": { + "6044": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -50395,21 +53371,21 @@ "maybe_exists%0#0" ] }, - "5745": { + "6045": { "error": "check self.fixed_point_scale exists", "op": "assert // check self.fixed_point_scale exists", "stack_out": [ "maybe_value%0#0" ] }, - "5746": { + "6046": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#0", "0" ] }, - "5747": { + "6047": { "op": "bytec 9 // \"nominal_interest_rate\"", "defined_out": [ "\"nominal_interest_rate\"", @@ -50422,7 +53398,7 @@ "\"nominal_interest_rate\"" ] }, - "5749": { + "6049": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%1#0", @@ -50435,7 +53411,7 @@ "maybe_exists%1#0" ] }, - "5750": { + "6050": { "error": "check self.nominal_interest_rate exists", "op": "assert // check self.nominal_interest_rate exists", "stack_out": [ @@ -50443,7 +53419,7 @@ "maybe_value%1#0" ] }, - "5751": { + "6051": { "op": "frame_dig -1", "defined_out": [ "maybe_value%0#0", @@ -50456,7 +53432,7 @@ "redemption_factor#0 (copy)" ] }, - "5753": { + "6053": { "op": "dig 2", "defined_out": [ "maybe_value%0#0", @@ -50471,7 +53447,7 @@ "maybe_value%0#0 (copy)" ] }, - "5755": { + "6055": { "callsub": "modules.actus_kernel.ActusKernelModule._scaled_mul_div", "op": "callsub _scaled_mul_div", "defined_out": [ @@ -50483,7 +53459,7 @@ "tmp%1#0" ] }, - "5758": { + "6058": { "op": "+", "defined_out": [ "period_rate#0" @@ -50492,7 +53468,7 @@ "period_rate#0" ] }, - "5759": { + "6059": { "op": "dup", "defined_out": [ "period_rate#0", @@ -50503,21 +53479,21 @@ "period_rate#0 (copy)" ] }, - "5760": { + "6060": { "error": "Invalid ACTUS configuration", "op": "assert // Invalid ACTUS configuration", "stack_out": [ "period_rate#0" ] }, - "5761": { + "6061": { "op": "intc_0 // 0", "stack_out": [ "period_rate#0", "0" ] }, - "5762": { + "6062": { "op": "bytec 5 // \"fixed_point_scale\"", "stack_out": [ "period_rate#0", @@ -50525,7 +53501,7 @@ "\"fixed_point_scale\"" ] }, - "5764": { + "6064": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%3#0", @@ -50538,7 +53514,7 @@ "maybe_exists%3#0" ] }, - "5765": { + "6065": { "error": "check self.fixed_point_scale exists", "op": "assert // check self.fixed_point_scale exists", "stack_out": [ @@ -50546,7 +53522,7 @@ "maybe_value%3#0" ] }, - "5766": { + "6066": { "op": "frame_dig -2", "defined_out": [ "discount_factor#0 (copy)", @@ -50559,7 +53535,7 @@ "discount_factor#0 (copy)" ] }, - "5768": { + "6068": { "op": "swap", "stack_out": [ "period_rate#0", @@ -50567,7 +53543,7 @@ "maybe_value%3#0" ] }, - "5769": { + "6069": { "op": "uncover 2", "stack_out": [ "discount_factor#0 (copy)", @@ -50575,7 +53551,7 @@ "period_rate#0" ] }, - "5771": { + "6071": { "callsub": "modules.actus_kernel.ActusKernelModule._scaled_mul_div", "op": "callsub _scaled_mul_div", "defined_out": [ @@ -50585,11 +53561,11 @@ "tmp%4#0" ] }, - "5774": { + "6074": { "retsub": true, "op": "retsub" }, - "5775": { + "6075": { "subroutine": "modules.actus_kernel.ActusKernelModule._apply_non_cash_schedule_entry", "params": { "entry#0": "bytes", @@ -50599,20 +53575,20 @@ "stack_in": [], "op": "proto 2 2" }, - "5778": { + "6078": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0" ] }, - "5779": { + "6079": { "op": "pushbytes \"\"", "stack_out": [ "future_entry#0", "denominator#0" ] }, - "5781": { + "6081": { "op": "dupn 8", "stack_out": [ "future_entry#0", @@ -50627,7 +53603,7 @@ "values%8#0" ] }, - "5783": { + "6083": { "op": "frame_dig -2", "defined_out": [ "entry#0 (copy)" @@ -50646,7 +53622,7 @@ "entry#0 (copy)" ] }, - "5785": { + "6085": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -50667,7 +53643,7 @@ "0" ] }, - "5786": { + "6086": { "op": "extract_uint64", "defined_out": [ "values%0#0" @@ -50686,7 +53662,7 @@ "values%0#0" ] }, - "5787": { + "6087": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -50703,7 +53679,7 @@ "0" ] }, - "5788": { + "6088": { "op": "bytec_2 // \"event_cursor\"", "defined_out": [ "\"event_cursor\"", @@ -50726,7 +53702,7 @@ "\"event_cursor\"" ] }, - "5789": { + "6089": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -50749,7 +53725,7 @@ "maybe_exists%0#0" ] }, - "5790": { + "6090": { "error": "check self.event_cursor exists", "op": "assert // check self.event_cursor exists", "stack_out": [ @@ -50767,7 +53743,7 @@ "maybe_value%0#0" ] }, - "5791": { + "6091": { "op": "==", "defined_out": [ "tmp%0#0", @@ -50787,7 +53763,7 @@ "tmp%0#0" ] }, - "5792": { + "6092": { "error": "Invalid event cursor", "op": "assert // Invalid event cursor", "stack_out": [ @@ -50803,7 +53779,7 @@ "values%8#0" ] }, - "5793": { + "6093": { "op": "frame_dig -2", "stack_out": [ "future_entry#0", @@ -50819,7 +53795,7 @@ "entry#0 (copy)" ] }, - "5795": { + "6095": { "op": "pushint 9", "defined_out": [ "9", @@ -50841,7 +53817,7 @@ "9" ] }, - "5797": { + "6097": { "op": "extract_uint64", "defined_out": [ "values%0#0", @@ -50861,7 +53837,7 @@ "values%1#0" ] }, - "5798": { + "6098": { "op": "global LatestTimestamp", "defined_out": [ "tmp%1#0", @@ -50883,7 +53859,7 @@ "tmp%1#0" ] }, - "5800": { + "6100": { "op": "<=", "defined_out": [ "tmp%2#0", @@ -50903,7 +53879,7 @@ "tmp%2#0" ] }, - "5801": { + "6101": { "error": "No due cashflow to pay", "op": "assert // No due cashflow to pay", "stack_out": [ @@ -50919,7 +53895,7 @@ "values%8#0" ] }, - "5802": { + "6102": { "op": "frame_dig -2", "stack_out": [ "future_entry#0", @@ -50935,7 +53911,7 @@ "entry#0 (copy)" ] }, - "5804": { + "6104": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -50957,7 +53933,7 @@ "8" ] }, - "5805": { + "6105": { "op": "getbyte", "defined_out": [ "event_type#0", @@ -50977,7 +53953,7 @@ "event_type#0" ] }, - "5806": { + "6106": { "op": "dup", "defined_out": [ "event_type#0", @@ -50998,7 +53974,7 @@ "event_type#0" ] }, - "5807": { + "6107": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -51021,7 +53997,7 @@ "1" ] }, - "5808": { + "6108": { "op": "==", "defined_out": [ "event_type#0", @@ -51043,7 +54019,7 @@ "tmp%4#0" ] }, - "5809": { + "6109": { "op": "dup", "defined_out": [ "event_type#0", @@ -51066,7 +54042,7 @@ "tmp%4#0" ] }, - "5810": { + "6110": { "op": "bz _apply_non_cash_schedule_entry_after_if_else@6", "stack_out": [ "future_entry#0", @@ -51083,7 +54059,7 @@ "tmp%4#0" ] }, - "5813": { + "6113": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -51101,7 +54077,7 @@ "0" ] }, - "5814": { + "6114": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"", @@ -51127,7 +54103,7 @@ "\"status\"" ] }, - "5815": { + "6115": { "op": "app_global_get_ex", "stack_out": [ "future_entry#0", @@ -51146,7 +54122,7 @@ "maybe_exists%0#0" ] }, - "5816": { + "6116": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ @@ -51165,7 +54141,7 @@ "maybe_value%0#0" ] }, - "5817": { + "6117": { "op": "pushint 50", "defined_out": [ "50", @@ -51191,7 +54167,7 @@ "50" ] }, - "5819": { + "6119": { "op": "==", "stack_out": [ "future_entry#0", @@ -51209,7 +54185,7 @@ "tmp%0#0" ] }, - "5820": { + "6120": { "error": "Invalid ACTUS configuration", "op": "assert // Invalid ACTUS configuration", "stack_out": [ @@ -51227,7 +54203,7 @@ "tmp%4#0" ] }, - "5821": { + "6121": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -51245,8 +54221,8 @@ "0" ] }, - "5822": { - "op": "bytec 10 // \"reserved_units_total\"", + "6122": { + "op": "bytec 11 // \"reserved_units_total\"", "defined_out": [ "\"reserved_units_total\"", "0", @@ -51271,7 +54247,7 @@ "\"reserved_units_total\"" ] }, - "5824": { + "6124": { "op": "app_global_get_ex", "defined_out": [ "event_type#0", @@ -51297,7 +54273,7 @@ "maybe_exists%1#0" ] }, - "5825": { + "6125": { "error": "check self.reserved_units_total exists", "op": "assert // check self.reserved_units_total exists", "stack_out": [ @@ -51316,7 +54292,7 @@ "maybe_value%1#0" ] }, - "5826": { + "6126": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -51335,7 +54311,7 @@ "0" ] }, - "5827": { + "6127": { "op": "bytec 13 // \"total_units\"", "defined_out": [ "\"total_units\"", @@ -51363,7 +54339,7 @@ "\"total_units\"" ] }, - "5829": { + "6129": { "op": "app_global_get_ex", "defined_out": [ "event_type#0", @@ -51391,7 +54367,7 @@ "maybe_exists%2#0" ] }, - "5830": { + "6130": { "error": "check self.total_units exists", "op": "assert // check self.total_units exists", "stack_out": [ @@ -51411,7 +54387,7 @@ "maybe_value%2#0" ] }, - "5831": { + "6131": { "op": "==", "defined_out": [ "event_type#0", @@ -51435,7 +54411,7 @@ "tmp%6#0" ] }, - "5832": { + "6132": { "error": "Primary distribution is not complete", "op": "assert // Primary distribution is not complete", "stack_out": [ @@ -51453,7 +54429,7 @@ "tmp%4#0" ] }, - "5833": { + "6133": { "op": "frame_dig -2", "stack_out": [ "future_entry#0", @@ -51471,7 +54447,7 @@ "entry#0 (copy)" ] }, - "5835": { + "6135": { "op": "pushint 49", "defined_out": [ "49", @@ -51497,7 +54473,7 @@ "49" ] }, - "5837": { + "6137": { "op": "extract_uint64", "defined_out": [ "event_type#0", @@ -51521,8 +54497,8 @@ "values%2#0" ] }, - "5838": { - "op": "bytec_3 // \"outstanding_principal\"", + "6138": { + "op": "bytec 4 // \"outstanding_principal\"", "defined_out": [ "\"outstanding_principal\"", "event_type#0", @@ -51547,7 +54523,7 @@ "\"outstanding_principal\"" ] }, - "5839": { + "6140": { "op": "dig 1", "defined_out": [ "\"outstanding_principal\"", @@ -51575,7 +54551,7 @@ "values%2#0 (copy)" ] }, - "5841": { + "6142": { "op": "app_global_put", "stack_out": [ "future_entry#0", @@ -51593,7 +54569,7 @@ "values%2#0" ] }, - "5842": { + "6143": { "op": "bytec 7 // \"interest_calculation_base\"", "defined_out": [ "\"interest_calculation_base\"", @@ -51619,7 +54595,7 @@ "\"interest_calculation_base\"" ] }, - "5844": { + "6145": { "op": "swap", "stack_out": [ "future_entry#0", @@ -51638,7 +54614,7 @@ "values%2#0" ] }, - "5845": { + "6146": { "op": "app_global_put", "stack_out": [ "future_entry#0", @@ -51655,7 +54631,7 @@ "tmp%4#0" ] }, - "5846": { + "6147": { "op": "frame_dig -2", "stack_out": [ "future_entry#0", @@ -51673,7 +54649,7 @@ "entry#0 (copy)" ] }, - "5848": { + "6149": { "op": "pushint 33", "defined_out": [ "33", @@ -51699,7 +54675,7 @@ "33" ] }, - "5850": { + "6151": { "op": "extract_uint64", "defined_out": [ "event_type#0", @@ -51723,7 +54699,7 @@ "values%4#0" ] }, - "5851": { + "6152": { "op": "bytec 9 // \"nominal_interest_rate\"", "defined_out": [ "\"nominal_interest_rate\"", @@ -51749,7 +54725,7 @@ "\"nominal_interest_rate\"" ] }, - "5853": { + "6154": { "op": "swap", "stack_out": [ "future_entry#0", @@ -51768,7 +54744,7 @@ "values%4#0" ] }, - "5854": { + "6155": { "op": "app_global_put", "stack_out": [ "future_entry#0", @@ -51785,7 +54761,7 @@ "tmp%4#0" ] }, - "5855": { + "6156": { "op": "bytec 6 // \"accrued_interest\"", "defined_out": [ "\"accrued_interest\"", @@ -51809,7 +54785,7 @@ "\"accrued_interest\"" ] }, - "5857": { + "6158": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -51828,7 +54804,7 @@ "0" ] }, - "5858": { + "6159": { "op": "app_global_put", "stack_out": [ "future_entry#0", @@ -51845,7 +54821,7 @@ "tmp%4#0" ] }, - "5859": { + "6160": { "op": "frame_dig -2", "stack_out": [ "future_entry#0", @@ -51863,7 +54839,7 @@ "entry#0 (copy)" ] }, - "5861": { + "6162": { "op": "pushint 41", "defined_out": [ "41", @@ -51889,7 +54865,7 @@ "41" ] }, - "5863": { + "6164": { "op": "extract_uint64", "defined_out": [ "event_type#0", @@ -51913,7 +54889,7 @@ "values%5#0" ] }, - "5864": { + "6165": { "op": "bytec 14 // \"next_principal_redemption\"", "defined_out": [ "\"next_principal_redemption\"", @@ -51939,7 +54915,7 @@ "\"next_principal_redemption\"" ] }, - "5866": { + "6167": { "op": "swap", "stack_out": [ "future_entry#0", @@ -51958,7 +54934,7 @@ "values%5#0" ] }, - "5867": { + "6168": { "op": "app_global_put", "stack_out": [ "future_entry#0", @@ -51975,7 +54951,7 @@ "tmp%4#0" ] }, - "5868": { + "6169": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -51993,7 +54969,7 @@ "0" ] }, - "5869": { + "6170": { "op": "bytec_2 // \"event_cursor\"", "stack_out": [ "future_entry#0", @@ -52012,7 +54988,7 @@ "\"event_cursor\"" ] }, - "5870": { + "6171": { "op": "app_global_get_ex", "defined_out": [ "event_type#0", @@ -52038,7 +55014,7 @@ "maybe_exists%3#0" ] }, - "5871": { + "6172": { "error": "check self.event_cursor exists", "op": "assert // check self.event_cursor exists", "stack_out": [ @@ -52057,7 +55033,7 @@ "maybe_value%3#0" ] }, - "5872": { + "6173": { "op": "intc_1 // 1", "stack_out": [ "future_entry#0", @@ -52076,7 +55052,7 @@ "1" ] }, - "5873": { + "6174": { "op": "+", "defined_out": [ "event_type#0", @@ -52100,7 +55076,7 @@ "tmp%7#0" ] }, - "5874": { + "6175": { "op": "bytec_2 // \"event_cursor\"", "stack_out": [ "future_entry#0", @@ -52119,7 +55095,7 @@ "\"event_cursor\"" ] }, - "5875": { + "6176": { "op": "swap", "stack_out": [ "future_entry#0", @@ -52138,7 +55114,7 @@ "tmp%7#0" ] }, - "5876": { + "6177": { "op": "app_global_put", "stack_out": [ "future_entry#0", @@ -52155,7 +55131,7 @@ "tmp%4#0" ] }, - "5877": { + "6178": { "op": "bytec_1 // \"status\"", "stack_out": [ "future_entry#0", @@ -52173,7 +55149,7 @@ "\"status\"" ] }, - "5878": { + "6179": { "op": "pushint 100", "defined_out": [ "\"status\"", @@ -52199,7 +55175,7 @@ "100" ] }, - "5880": { + "6181": { "op": "app_global_put", "stack_out": [ "future_entry#0", @@ -52216,7 +55192,7 @@ "tmp%4#0" ] }, - "5881": { + "6182": { "op": "frame_dig 11", "stack_out": [ "future_entry#0", @@ -52234,7 +55210,7 @@ "tmp%4#0" ] }, - "5883": { + "6184": { "error": "Not IED event", "op": "assert // Not IED event", "stack_out": [ @@ -52252,7 +55228,7 @@ "tmp%4#0" ] }, - "5884": { + "6185": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -52270,7 +55246,7 @@ "0" ] }, - "5885": { + "6186": { "op": "bytec 20 // \"initial_exchange_amount\"", "defined_out": [ "\"initial_exchange_amount\"", @@ -52296,7 +55272,7 @@ "\"initial_exchange_amount\"" ] }, - "5887": { + "6188": { "op": "app_global_get_ex", "stack_out": [ "future_entry#0", @@ -52315,7 +55291,7 @@ "maybe_exists%0#0" ] }, - "5888": { + "6189": { "error": "check self.initial_exchange_amount exists", "op": "assert // check self.initial_exchange_amount exists", "stack_out": [ @@ -52334,7 +55310,7 @@ "maybe_value%0#0" ] }, - "5889": { + "6190": { "op": "frame_dig -2", "stack_out": [ "future_entry#0", @@ -52353,7 +55329,7 @@ "entry#0 (copy)" ] }, - "5891": { + "6192": { "op": "swap", "stack_out": [ "future_entry#0", @@ -52372,7 +55348,7 @@ "maybe_value%0#0" ] }, - "5892": { + "6193": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -52392,7 +55368,7 @@ "0" ] }, - "5893": { + "6194": { "callsub": "modules.actus_kernel.ActusKernelModule._emit_execution_event", "op": "callsub _emit_execution_event", "defined_out": [ @@ -52417,10 +55393,10 @@ "entry#0" ] }, - "5896": { + "6197": { "op": "dup" }, - "5897": { + "6198": { "op": "frame_bury -2", "stack_out": [ "future_entry#0", @@ -52438,7 +55414,7 @@ "entry#0 (copy)" ] }, - "5899": { + "6200": { "op": "frame_dig -1", "defined_out": [ "entry#0 (copy)", @@ -52464,17 +55440,17 @@ "payload#0 (copy)" ] }, - "5901": { + "6202": { "op": "frame_bury 1" }, - "5903": { + "6204": { "op": "frame_bury 0" }, - "5905": { + "6206": { "retsub": true, "op": "retsub" }, - "5906": { + "6207": { "block": "_apply_non_cash_schedule_entry_after_if_else@6", "stack_in": [ "future_entry#0", @@ -52510,7 +55486,7 @@ "0" ] }, - "5907": { + "6208": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"", @@ -52533,7 +55509,7 @@ "\"status\"" ] }, - "5908": { + "6209": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -52556,7 +55532,7 @@ "maybe_exists%0#0" ] }, - "5909": { + "6210": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ @@ -52575,7 +55551,7 @@ "maybe_value%0#0" ] }, - "5910": { + "6211": { "op": "pushint 50", "defined_out": [ "50", @@ -52598,7 +55574,7 @@ "50" ] }, - "5912": { + "6213": { "op": "==", "defined_out": [ "tmp%0#0" @@ -52619,7 +55595,7 @@ "tmp%0#0" ] }, - "5913": { + "6214": { "op": "!", "defined_out": [ "tmp%1#1" @@ -52640,7 +55616,7 @@ "tmp%1#1" ] }, - "5914": { + "6215": { "error": "IED not yet executed", "op": "assert // IED not yet executed", "stack_out": [ @@ -52658,7 +55634,7 @@ "tmp%4#0" ] }, - "5915": { + "6216": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -52676,7 +55652,7 @@ "0" ] }, - "5916": { + "6217": { "op": "bytec 6 // \"accrued_interest\"", "defined_out": [ "\"accrued_interest\"", @@ -52699,7 +55675,7 @@ "\"accrued_interest\"" ] }, - "5918": { + "6219": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%4#0", @@ -52722,7 +55698,7 @@ "maybe_exists%4#0" ] }, - "5919": { + "6220": { "error": "check self.accrued_interest exists", "op": "assert // check self.accrued_interest exists", "stack_out": [ @@ -52741,7 +55717,7 @@ "maybe_value%4#0" ] }, - "5920": { + "6221": { "op": "frame_dig -2", "defined_out": [ "entry#0 (copy)", @@ -52764,7 +55740,7 @@ "entry#0 (copy)" ] }, - "5922": { + "6223": { "callsub": "modules.actus_kernel.ActusKernelModule._entry_interest_segment", "op": "callsub _entry_interest_segment", "defined_out": [ @@ -52790,7 +55766,7 @@ "entry#0" ] }, - "5925": { + "6226": { "op": "frame_bury -2", "stack_out": [ "future_entry#0", @@ -52809,7 +55785,7 @@ "_entry_interest_segment%0#0" ] }, - "5927": { + "6228": { "op": "+", "defined_out": [ "tmp%8#0" @@ -52830,7 +55806,7 @@ "tmp%8#0" ] }, - "5928": { + "6229": { "op": "bytec 6 // \"accrued_interest\"", "stack_out": [ "future_entry#0", @@ -52849,7 +55825,7 @@ "\"accrued_interest\"" ] }, - "5930": { + "6231": { "op": "swap", "stack_out": [ "future_entry#0", @@ -52868,7 +55844,7 @@ "tmp%8#0" ] }, - "5931": { + "6232": { "op": "app_global_put", "stack_out": [ "future_entry#0", @@ -52885,7 +55861,7 @@ "tmp%4#0" ] }, - "5932": { + "6233": { "op": "frame_dig 10", "defined_out": [ "event_type#0" @@ -52906,7 +55882,7 @@ "event_type#0" ] }, - "5934": { + "6235": { "op": "pushint 12", "defined_out": [ "12", @@ -52929,7 +55905,7 @@ "12" ] }, - "5936": { + "6237": { "op": "==", "defined_out": [ "event_type#0", @@ -52951,7 +55927,7 @@ "tmp%9#0" ] }, - "5937": { + "6238": { "op": "bz _apply_non_cash_schedule_entry_else_body@10", "stack_out": [ "future_entry#0", @@ -52968,7 +55944,7 @@ "tmp%4#0" ] }, - "5940": { + "6241": { "op": "frame_dig -1", "defined_out": [ "event_type#0", @@ -52990,7 +55966,7 @@ "payload#0 (copy)" ] }, - "5942": { + "6243": { "op": "pushint 33", "defined_out": [ "33", @@ -53014,7 +55990,7 @@ "33" ] }, - "5944": { + "6245": { "op": "extract_uint64", "defined_out": [ "event_type#0", @@ -53036,7 +56012,7 @@ "values%6#0" ] }, - "5945": { + "6246": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -53055,7 +56031,7 @@ "0" ] }, - "5946": { + "6247": { "op": "bytec 36 // \"rate_reset_multiplier\"", "defined_out": [ "\"rate_reset_multiplier\"", @@ -53081,7 +56057,7 @@ "\"rate_reset_multiplier\"" ] }, - "5948": { + "6249": { "op": "app_global_get_ex", "defined_out": [ "event_type#0", @@ -53107,7 +56083,7 @@ "maybe_exists%5#0" ] }, - "5949": { + "6250": { "error": "check self.rate_reset_multiplier exists", "op": "assert // check self.rate_reset_multiplier exists", "stack_out": [ @@ -53127,7 +56103,7 @@ "maybe_value%5#0" ] }, - "5950": { + "6251": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -53147,7 +56123,7 @@ "0" ] }, - "5951": { + "6252": { "op": "bytec 5 // \"fixed_point_scale\"", "defined_out": [ "\"fixed_point_scale\"", @@ -53175,7 +56151,7 @@ "\"fixed_point_scale\"" ] }, - "5953": { + "6254": { "op": "app_global_get_ex", "defined_out": [ "event_type#0", @@ -53203,7 +56179,7 @@ "maybe_exists%6#0" ] }, - "5954": { + "6255": { "error": "check self.fixed_point_scale exists", "op": "assert // check self.fixed_point_scale exists", "stack_out": [ @@ -53224,7 +56200,7 @@ "maybe_value%6#0" ] }, - "5955": { + "6256": { "callsub": "modules.actus_kernel.ActusKernelModule._scaled_mul_div", "op": "callsub _scaled_mul_div", "defined_out": [ @@ -53247,7 +56223,7 @@ "observed_rate#0" ] }, - "5958": { + "6259": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -53266,7 +56242,7 @@ "0" ] }, - "5959": { + "6260": { "op": "bytec 35 // \"rate_reset_spread\"", "defined_out": [ "\"rate_reset_spread\"", @@ -53292,7 +56268,7 @@ "\"rate_reset_spread\"" ] }, - "5961": { + "6262": { "op": "app_global_get_ex", "defined_out": [ "event_type#0", @@ -53318,7 +56294,7 @@ "maybe_exists%7#0" ] }, - "5962": { + "6263": { "error": "check self.rate_reset_spread exists", "op": "assert // check self.rate_reset_spread exists", "stack_out": [ @@ -53338,7 +56314,7 @@ "maybe_value%7#0" ] }, - "5963": { + "6264": { "op": "+", "defined_out": [ "event_type#0", @@ -53360,7 +56336,7 @@ "rate#0" ] }, - "5964": { + "6265": { "op": "frame_bury 6", "defined_out": [ "event_type#0", @@ -53381,7 +56357,7 @@ "tmp%4#0" ] }, - "5966": { + "6267": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -53399,7 +56375,7 @@ "0" ] }, - "5967": { + "6268": { "op": "bytec 38 // \"has_rate_reset_floor\"", "defined_out": [ "\"has_rate_reset_floor\"", @@ -53424,7 +56400,7 @@ "\"has_rate_reset_floor\"" ] }, - "5969": { + "6270": { "op": "app_global_get_ex", "stack_out": [ "future_entry#0", @@ -53443,7 +56419,7 @@ "maybe_exists%0#0" ] }, - "5970": { + "6271": { "error": "check self.has_rate_reset_floor exists", "op": "assert // check self.has_rate_reset_floor exists", "stack_out": [ @@ -53462,7 +56438,7 @@ "maybe_value%0#0" ] }, - "5971": { + "6272": { "op": "bz _apply_non_cash_schedule_entry_after_if_else@55", "stack_out": [ "future_entry#0", @@ -53479,7 +56455,7 @@ "tmp%4#0" ] }, - "5974": { + "6275": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -53497,8 +56473,8 @@ "0" ] }, - "5975": { - "op": "bytec 29 // \"rate_reset_floor\"", + "6276": { + "op": "bytec 30 // \"rate_reset_floor\"", "defined_out": [ "\"rate_reset_floor\"", "0", @@ -53522,7 +56498,7 @@ "\"rate_reset_floor\"" ] }, - "5977": { + "6278": { "op": "app_global_get_ex", "defined_out": [ "event_type#0", @@ -53547,7 +56523,7 @@ "maybe_exists%1#0" ] }, - "5978": { + "6279": { "error": "check self.rate_reset_floor exists", "op": "assert // check self.rate_reset_floor exists", "stack_out": [ @@ -53566,7 +56542,7 @@ "maybe_value%1#0" ] }, - "5979": { + "6280": { "op": "frame_dig 6", "stack_out": [ "future_entry#0", @@ -53585,7 +56561,7 @@ "rate#0" ] }, - "5981": { + "6282": { "op": ">", "stack_out": [ "future_entry#0", @@ -53603,7 +56579,7 @@ "tmp%0#0" ] }, - "5982": { + "6283": { "op": "bz _apply_non_cash_schedule_entry_after_if_else@55", "stack_out": [ "future_entry#0", @@ -53620,7 +56596,7 @@ "tmp%4#0" ] }, - "5985": { + "6286": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -53638,8 +56614,8 @@ "0" ] }, - "5986": { - "op": "bytec 29 // \"rate_reset_floor\"", + "6287": { + "op": "bytec 30 // \"rate_reset_floor\"", "stack_out": [ "future_entry#0", "denominator#0", @@ -53657,7 +56633,7 @@ "\"rate_reset_floor\"" ] }, - "5988": { + "6289": { "op": "app_global_get_ex", "defined_out": [ "event_type#0", @@ -53681,7 +56657,7 @@ "maybe_exists%2#0" ] }, - "5989": { + "6290": { "op": "swap", "stack_out": [ "future_entry#0", @@ -53700,7 +56676,7 @@ "rate#0" ] }, - "5990": { + "6291": { "op": "frame_bury 6", "stack_out": [ "future_entry#0", @@ -53718,7 +56694,7 @@ "maybe_exists%2#0" ] }, - "5992": { + "6293": { "error": "check self.rate_reset_floor exists", "op": "assert // check self.rate_reset_floor exists", "stack_out": [ @@ -53736,7 +56712,7 @@ "tmp%4#0" ] }, - "5993": { + "6294": { "block": "_apply_non_cash_schedule_entry_after_if_else@55", "stack_in": [ "future_entry#0", @@ -53772,7 +56748,7 @@ "0" ] }, - "5994": { + "6295": { "op": "bytec 39 // \"has_rate_reset_cap\"", "defined_out": [ "\"has_rate_reset_cap\"", @@ -53795,7 +56771,7 @@ "\"has_rate_reset_cap\"" ] }, - "5996": { + "6297": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%3#0", @@ -53818,7 +56794,7 @@ "maybe_exists%3#0" ] }, - "5997": { + "6298": { "error": "check self.has_rate_reset_cap exists", "op": "assert // check self.has_rate_reset_cap exists", "stack_out": [ @@ -53837,7 +56813,7 @@ "maybe_value%3#0" ] }, - "5998": { + "6299": { "op": "bz _apply_non_cash_schedule_entry_after_if_else@58", "stack_out": [ "future_entry#0", @@ -53854,7 +56830,7 @@ "tmp%4#0" ] }, - "6001": { + "6302": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -53872,8 +56848,8 @@ "0" ] }, - "6002": { - "op": "bytec 30 // \"rate_reset_cap\"", + "6303": { + "op": "bytec 31 // \"rate_reset_cap\"", "defined_out": [ "\"rate_reset_cap\"", "0" @@ -53895,7 +56871,7 @@ "\"rate_reset_cap\"" ] }, - "6004": { + "6305": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%4#0", @@ -53918,7 +56894,7 @@ "maybe_exists%4#0" ] }, - "6005": { + "6306": { "error": "check self.rate_reset_cap exists", "op": "assert // check self.rate_reset_cap exists", "stack_out": [ @@ -53937,7 +56913,7 @@ "maybe_value%4#0" ] }, - "6006": { + "6307": { "op": "frame_dig 6", "defined_out": [ "maybe_value%4#0", @@ -53960,7 +56936,7 @@ "rate#0" ] }, - "6008": { + "6309": { "op": "<", "defined_out": [ "rate#0", @@ -53982,7 +56958,7 @@ "tmp%1#1" ] }, - "6009": { + "6310": { "op": "bz _apply_non_cash_schedule_entry_after_if_else@58", "stack_out": [ "future_entry#0", @@ -53999,7 +56975,7 @@ "tmp%4#0" ] }, - "6012": { + "6313": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -54017,8 +56993,8 @@ "0" ] }, - "6013": { - "op": "bytec 30 // \"rate_reset_cap\"", + "6314": { + "op": "bytec 31 // \"rate_reset_cap\"", "stack_out": [ "future_entry#0", "denominator#0", @@ -54036,7 +57012,7 @@ "\"rate_reset_cap\"" ] }, - "6015": { + "6316": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%5#0", @@ -54059,7 +57035,7 @@ "maybe_exists%5#0" ] }, - "6016": { + "6317": { "op": "swap", "stack_out": [ "future_entry#0", @@ -54078,7 +57054,7 @@ "rate#0" ] }, - "6017": { + "6318": { "op": "frame_bury 6", "defined_out": [ "maybe_exists%5#0", @@ -54100,7 +57076,7 @@ "maybe_exists%5#0" ] }, - "6019": { + "6320": { "error": "check self.rate_reset_cap exists", "op": "assert // check self.rate_reset_cap exists", "stack_out": [ @@ -54118,7 +57094,7 @@ "tmp%4#0" ] }, - "6020": { + "6321": { "block": "_apply_non_cash_schedule_entry_after_if_else@58", "stack_in": [ "future_entry#0", @@ -54154,7 +57130,7 @@ "\"nominal_interest_rate\"" ] }, - "6022": { + "6323": { "op": "frame_dig 6", "defined_out": [ "\"nominal_interest_rate\"", @@ -54177,7 +57153,7 @@ "rate#0" ] }, - "6024": { + "6325": { "op": "app_global_put", "stack_out": [ "future_entry#0", @@ -54194,7 +57170,7 @@ "tmp%4#0" ] }, - "6025": { + "6326": { "block": "_apply_non_cash_schedule_entry_after_if_else@18", "stack_in": [ "future_entry#0", @@ -54230,7 +57206,7 @@ "event_type#0" ] }, - "6027": { + "6328": { "op": "pushint 4", "defined_out": [ "4", @@ -54253,7 +57229,7 @@ "4" ] }, - "6029": { + "6330": { "op": "==", "defined_out": [ "event_type#0", @@ -54275,7 +57251,7 @@ "tmp%16#0" ] }, - "6030": { + "6331": { "op": "bz _apply_non_cash_schedule_entry_else_body@20", "stack_out": [ "future_entry#0", @@ -54292,7 +57268,7 @@ "tmp%4#0" ] }, - "6033": { + "6334": { "op": "frame_dig -2", "defined_out": [ "entry#0 (copy)", @@ -54314,7 +57290,7 @@ "entry#0 (copy)" ] }, - "6035": { + "6336": { "op": "pushint 49", "defined_out": [ "49", @@ -54338,7 +57314,7 @@ "49" ] }, - "6037": { + "6338": { "op": "extract_uint64", "defined_out": [ "event_type#0", @@ -54360,8 +57336,8 @@ "values%10#0" ] }, - "6038": { - "op": "bytec_3 // \"outstanding_principal\"", + "6339": { + "op": "bytec 4 // \"outstanding_principal\"", "defined_out": [ "\"outstanding_principal\"", "event_type#0", @@ -54384,7 +57360,7 @@ "\"outstanding_principal\"" ] }, - "6039": { + "6341": { "op": "dig 1", "defined_out": [ "\"outstanding_principal\"", @@ -54410,7 +57386,7 @@ "values%10#0 (copy)" ] }, - "6041": { + "6343": { "op": "app_global_put", "stack_out": [ "future_entry#0", @@ -54428,7 +57404,7 @@ "values%10#0" ] }, - "6042": { + "6344": { "op": "bytec 7 // \"interest_calculation_base\"", "defined_out": [ "\"interest_calculation_base\"", @@ -54452,7 +57428,7 @@ "\"interest_calculation_base\"" ] }, - "6044": { + "6346": { "op": "swap", "stack_out": [ "future_entry#0", @@ -54471,7 +57447,7 @@ "values%10#0" ] }, - "6045": { + "6347": { "op": "app_global_put", "stack_out": [ "future_entry#0", @@ -54488,7 +57464,7 @@ "tmp%4#0" ] }, - "6046": { + "6348": { "block": "_apply_non_cash_schedule_entry_after_if_else@23", "stack_in": [ "future_entry#0", @@ -54525,7 +57501,7 @@ "tmp%18#0" ] }, - "6049": { + "6351": { "op": "bz _apply_non_cash_schedule_entry_else_body@29", "stack_out": [ "future_entry#0", @@ -54542,7 +57518,7 @@ "tmp%4#0" ] }, - "6052": { + "6354": { "op": "frame_dig 10", "defined_out": [ "event_type#0" @@ -54563,7 +57539,7 @@ "event_type#0" ] }, - "6054": { + "6356": { "op": "pushint 5", "defined_out": [ "5", @@ -54586,7 +57562,7 @@ "5" ] }, - "6056": { + "6358": { "op": "==", "defined_out": [ "event_type#0", @@ -54608,7 +57584,7 @@ "tmp%19#0" ] }, - "6057": { + "6359": { "op": "bz _apply_non_cash_schedule_entry_after_if_else@30", "stack_out": [ "future_entry#0", @@ -54625,7 +57601,7 @@ "tmp%4#0" ] }, - "6060": { + "6362": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -54647,7 +57623,334 @@ "0" ] }, - "6061": { + "6363": { + "op": "bytec_3 // \"schedule_entry_count\"", + "defined_out": [ + "\"schedule_entry_count\"", + "0", + "event_type#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0", + "\"schedule_entry_count\"" + ] + }, + "6364": { + "op": "app_global_get_ex", + "defined_out": [ + "event_type#0", + "maybe_exists%10#0", + "maybe_value%10#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%10#0", + "maybe_exists%10#0" + ] + }, + "6365": { + "error": "check self.schedule_entry_count exists", + "op": "assert // check self.schedule_entry_count exists", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%10#0" + ] + }, + "6366": { + "op": "intc_0 // 0", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%10#0", + "0" + ] + }, + "6367": { + "op": "bytec_2 // \"event_cursor\"", + "defined_out": [ + "\"event_cursor\"", + "0", + "event_type#0", + "maybe_value%10#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%10#0", + "0", + "\"event_cursor\"" + ] + }, + "6368": { + "op": "app_global_get_ex", + "defined_out": [ + "event_type#0", + "maybe_exists%11#0", + "maybe_value%10#0", + "maybe_value%11#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_exists%11#0" + ] + }, + "6369": { + "error": "check self.event_cursor exists", + "op": "assert // check self.event_cursor exists", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%10#0", + "maybe_value%11#0" + ] + }, + "6370": { + "op": "-", + "defined_out": [ + "event_type#0", + "tmp%20#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "tmp%20#0" + ] + }, + "6371": { + "op": "pushint 100", + "defined_out": [ + "100", + "event_type#0", + "tmp%20#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "tmp%20#0", + "100" + ] + }, + "6373": { + "op": "*", + "defined_out": [ + "event_type#0", + "tmp%21#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "tmp%21#0" + ] + }, + "6374": { + "op": "intc 4 // 1500", + "defined_out": [ + "1500", + "event_type#0", + "tmp%21#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "tmp%21#0", + "1500" + ] + }, + "6376": { + "op": "+", + "defined_out": [ + "event_type#0", + "tmp%22#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "tmp%22#0" + ] + }, + "6377": { + "op": "intc_0 // 0", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "tmp%22#0", + "0" + ] + }, + "6378": { + "callsub": "_puya_lib.util.ensure_budget", + "op": "callsub ensure_budget", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6381": { + "op": "intc_0 // 0", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0" + ] + }, + "6382": { "op": "bytec 5 // \"fixed_point_scale\"", "defined_out": [ "\"fixed_point_scale\"", @@ -54671,7 +57974,7 @@ "\"fixed_point_scale\"" ] }, - "6063": { + "6384": { "op": "app_global_get_ex", "defined_out": [ "discount_factor#0", @@ -54695,7 +57998,7 @@ "maybe_exists%0#0" ] }, - "6064": { + "6385": { "op": "swap", "stack_out": [ "future_entry#0", @@ -54714,7 +58017,7 @@ "discount_factor#0" ] }, - "6065": { + "6386": { "op": "frame_bury 2", "defined_out": [ "discount_factor#0", @@ -54737,7 +58040,7 @@ "maybe_exists%0#0" ] }, - "6067": { + "6388": { "error": "check self.fixed_point_scale exists", "op": "assert // check self.fixed_point_scale exists", "stack_out": [ @@ -54755,7 +58058,7 @@ "tmp%4#0" ] }, - "6068": { + "6389": { "op": "intc_0 // 0", "defined_out": [ "denominator#0", @@ -54778,7 +58081,7 @@ "denominator#0" ] }, - "6069": { + "6390": { "op": "frame_bury 1", "defined_out": [ "denominator#0", @@ -54800,7 +58103,7 @@ "tmp%4#0" ] }, - "6071": { + "6392": { "op": "intc_0 // 0", "defined_out": [ "denominator#0", @@ -54824,7 +58127,7 @@ "skip_first_redemption#0" ] }, - "6072": { + "6393": { "op": "frame_bury 7", "defined_out": [ "denominator#0", @@ -54847,7 +58150,7 @@ "tmp%4#0" ] }, - "6074": { + "6395": { "op": "frame_dig -2", "defined_out": [ "denominator#0", @@ -54872,7 +58175,7 @@ "entry#0 (copy)" ] }, - "6076": { + "6397": { "op": "pushint 25", "defined_out": [ "25", @@ -54899,7 +58202,7 @@ "25" ] }, - "6078": { + "6399": { "op": "extract_uint64", "defined_out": [ "denominator#0", @@ -54924,7 +58227,7 @@ "values%0#0" ] }, - "6079": { + "6400": { "op": "dup", "stack_out": [ "future_entry#0", @@ -54943,7 +58246,7 @@ "values%0#0" ] }, - "6080": { + "6401": { "op": "frame_bury 8", "defined_out": [ "denominator#0", @@ -54968,7 +58271,7 @@ "values%0#0" ] }, - "6082": { + "6403": { "op": "bz _apply_non_cash_schedule_entry_after_if_else@35", "stack_out": [ "future_entry#0", @@ -54985,7 +58288,7 @@ "tmp%4#0" ] }, - "6085": { + "6406": { "op": "frame_dig 2", "stack_out": [ "future_entry#0", @@ -55003,7 +58306,7 @@ "discount_factor#0" ] }, - "6087": { + "6408": { "op": "frame_dig 8", "stack_out": [ "future_entry#0", @@ -55022,7 +58325,7 @@ "values%0#0" ] }, - "6089": { + "6410": { "callsub": "modules.actus_kernel.ActusKernelModule._discount_annuity_factor", "op": "callsub _discount_annuity_factor", "stack_out": [ @@ -55041,7 +58344,7 @@ "discount_factor#0" ] }, - "6092": { + "6413": { "op": "dup", "stack_out": [ "future_entry#0", @@ -55060,7 +58363,7 @@ "discount_factor#0" ] }, - "6093": { + "6414": { "op": "frame_bury 2", "stack_out": [ "future_entry#0", @@ -55078,7 +58381,7 @@ "discount_factor#0" ] }, - "6095": { + "6416": { "op": "intc_1 // 1", "stack_out": [ "future_entry#0", @@ -55097,7 +58400,7 @@ "skip_first_redemption#0" ] }, - "6096": { + "6417": { "op": "frame_bury 7", "stack_out": [ "future_entry#0", @@ -55115,7 +58418,7 @@ "denominator#0" ] }, - "6098": { + "6419": { "op": "frame_bury 1", "stack_out": [ "future_entry#0", @@ -55132,7 +58435,7 @@ "tmp%4#0" ] }, - "6100": { + "6421": { "block": "_apply_non_cash_schedule_entry_after_if_else@35", "stack_in": [ "future_entry#0", @@ -55168,7 +58471,7 @@ "0" ] }, - "6101": { + "6422": { "op": "bytec_2 // \"event_cursor\"", "defined_out": [ "\"event_cursor\"", @@ -55191,7 +58494,7 @@ "\"event_cursor\"" ] }, - "6102": { + "6423": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%1#0", @@ -55214,7 +58517,7 @@ "maybe_exists%1#0" ] }, - "6103": { + "6424": { "error": "check self.event_cursor exists", "op": "assert // check self.event_cursor exists", "stack_out": [ @@ -55233,7 +58536,7 @@ "maybe_value%1#0" ] }, - "6104": { + "6425": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -55256,7 +58559,7 @@ "1" ] }, - "6105": { + "6426": { "op": "+", "defined_out": [ "future_event_id#0" @@ -55277,7 +58580,7 @@ "future_event_id#0" ] }, - "6106": { + "6427": { "op": "frame_bury 3", "defined_out": [ "future_event_id#0" @@ -55297,7 +58600,7 @@ "tmp%4#0" ] }, - "6108": { + "6429": { "block": "_apply_non_cash_schedule_entry_while_top@36", "stack_in": [ "future_entry#0", @@ -55333,8 +58636,8 @@ "0" ] }, - "6109": { - "op": "bytec 4 // \"schedule_entry_count\"", + "6430": { + "op": "bytec_3 // \"schedule_entry_count\"", "defined_out": [ "\"schedule_entry_count\"", "0" @@ -55356,7 +58659,7 @@ "\"schedule_entry_count\"" ] }, - "6111": { + "6431": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%2#0", @@ -55379,7 +58682,7 @@ "maybe_exists%2#0" ] }, - "6112": { + "6432": { "error": "check self.schedule_entry_count exists", "op": "assert // check self.schedule_entry_count exists", "stack_out": [ @@ -55398,7 +58701,7 @@ "maybe_value%2#0" ] }, - "6113": { + "6433": { "op": "frame_dig 3", "defined_out": [ "future_event_id#0", @@ -55421,7 +58724,7 @@ "future_event_id#0" ] }, - "6115": { + "6435": { "op": ">", "defined_out": [ "future_event_id#0", @@ -55443,7 +58746,7 @@ "tmp%4#0" ] }, - "6116": { + "6436": { "op": "bz _apply_non_cash_schedule_entry_after_while@48", "stack_out": [ "future_entry#0", @@ -55460,7 +58763,7 @@ "tmp%4#0" ] }, - "6119": { + "6439": { "op": "frame_dig 3", "stack_out": [ "future_entry#0", @@ -55478,7 +58781,7 @@ "future_event_id#0" ] }, - "6121": { + "6441": { "callsub": "modules.actus_kernel.ActusKernelModule._get_schedule_entry", "op": "callsub _get_schedule_entry", "defined_out": [ @@ -55502,7 +58805,7 @@ "future_entry#0" ] }, - "6124": { + "6444": { "op": "dup", "stack_out": [ "future_entry#0", @@ -55521,7 +58824,7 @@ "future_entry#0" ] }, - "6125": { + "6445": { "op": "frame_bury 0", "defined_out": [ "future_entry#0", @@ -55544,7 +58847,7 @@ "future_entry#0" ] }, - "6127": { + "6447": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -55569,7 +58872,7 @@ "8" ] }, - "6128": { + "6448": { "op": "getbyte", "defined_out": [ "future_entry#0", @@ -55593,7 +58896,7 @@ "future_event_type#0" ] }, - "6129": { + "6449": { "op": "dup", "stack_out": [ "future_entry#0", @@ -55612,7 +58915,7 @@ "future_event_type#0" ] }, - "6130": { + "6450": { "op": "frame_bury 4", "defined_out": [ "future_entry#0", @@ -55636,7 +58939,7 @@ "future_event_type#0" ] }, - "6132": { + "6452": { "op": "pushint 3", "defined_out": [ "3", @@ -55662,7 +58965,7 @@ "3" ] }, - "6134": { + "6454": { "op": "==", "defined_out": [ "future_entry#0", @@ -55687,7 +58990,7 @@ "tmp%7#1" ] }, - "6135": { + "6455": { "op": "bnz _apply_non_cash_schedule_entry_bool_true@40", "stack_out": [ "future_entry#0", @@ -55704,7 +59007,7 @@ "tmp%4#0" ] }, - "6138": { + "6458": { "op": "frame_dig 4", "stack_out": [ "future_entry#0", @@ -55722,7 +59025,7 @@ "future_event_type#0" ] }, - "6140": { + "6460": { "op": "pushint 19", "defined_out": [ "19", @@ -55748,7 +59051,7 @@ "19" ] }, - "6142": { + "6462": { "op": "==", "defined_out": [ "future_entry#0", @@ -55773,7 +59076,7 @@ "tmp%8#1" ] }, - "6143": { + "6463": { "op": "bz _apply_non_cash_schedule_entry_bool_false@41", "stack_out": [ "future_entry#0", @@ -55790,7 +59093,7 @@ "tmp%4#0" ] }, - "6146": { + "6466": { "op": "frame_dig 0", "stack_out": [ "future_entry#0", @@ -55808,7 +59111,7 @@ "future_entry#0" ] }, - "6148": { + "6468": { "op": "pushint 25", "defined_out": [ "25", @@ -55834,7 +59137,7 @@ "25" ] }, - "6150": { + "6470": { "op": "extract_uint64", "defined_out": [ "future_entry#0", @@ -55859,7 +59162,7 @@ "values%2#0" ] }, - "6151": { + "6471": { "op": "bz _apply_non_cash_schedule_entry_bool_false@41", "stack_out": [ "future_entry#0", @@ -55876,7 +59179,7 @@ "tmp%4#0" ] }, - "6154": { + "6474": { "block": "_apply_non_cash_schedule_entry_bool_true@40", "stack_in": [ "future_entry#0", @@ -55912,7 +59215,7 @@ "is_redemption_event#0" ] }, - "6155": { + "6475": { "block": "_apply_non_cash_schedule_entry_bool_merge@42", "stack_in": [ "future_entry#0", @@ -55946,7 +59249,7 @@ "tmp%4#0" ] }, - "6158": { + "6478": { "op": "frame_dig 7", "defined_out": [ "skip_first_redemption#0" @@ -55967,7 +59270,7 @@ "skip_first_redemption#0" ] }, - "6160": { + "6480": { "op": "bz _apply_non_cash_schedule_entry_else_body@45", "stack_out": [ "future_entry#0", @@ -55984,7 +59287,7 @@ "tmp%4#0" ] }, - "6163": { + "6483": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -56002,7 +59305,7 @@ "skip_first_redemption#0" ] }, - "6164": { + "6484": { "op": "frame_bury 7", "defined_out": [ "skip_first_redemption#0" @@ -56022,7 +59325,7 @@ "tmp%4#0" ] }, - "6166": { + "6486": { "block": "_apply_non_cash_schedule_entry_after_if_else@47", "stack_in": [ "future_entry#0", @@ -56058,7 +59361,7 @@ "future_event_id#0" ] }, - "6168": { + "6488": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -56081,7 +59384,7 @@ "1" ] }, - "6169": { + "6489": { "op": "+", "stack_out": [ "future_entry#0", @@ -56099,7 +59402,7 @@ "future_event_id#0" ] }, - "6170": { + "6490": { "op": "frame_bury 3", "defined_out": [ "future_event_id#0" @@ -56119,10 +59422,10 @@ "tmp%4#0" ] }, - "6172": { + "6492": { "op": "b _apply_non_cash_schedule_entry_while_top@36" }, - "6175": { + "6495": { "block": "_apply_non_cash_schedule_entry_else_body@45", "stack_in": [ "future_entry#0", @@ -56158,7 +59461,7 @@ "future_entry#0" ] }, - "6177": { + "6497": { "op": "pushint 25", "defined_out": [ "25", @@ -56181,7 +59484,7 @@ "25" ] }, - "6179": { + "6499": { "op": "extract_uint64", "defined_out": [ "future_entry#0", @@ -56203,7 +59506,7 @@ "values%3#1" ] }, - "6180": { + "6500": { "op": "frame_dig 2", "defined_out": [ "discount_factor#0", @@ -56227,7 +59530,7 @@ "discount_factor#0" ] }, - "6182": { + "6502": { "op": "swap", "stack_out": [ "future_entry#0", @@ -56246,7 +59549,7 @@ "values%3#1" ] }, - "6183": { + "6503": { "callsub": "modules.actus_kernel.ActusKernelModule._discount_annuity_factor", "op": "callsub _discount_annuity_factor", "stack_out": [ @@ -56265,7 +59568,7 @@ "discount_factor#0" ] }, - "6186": { + "6506": { "op": "dup", "stack_out": [ "future_entry#0", @@ -56284,7 +59587,7 @@ "discount_factor#0" ] }, - "6187": { + "6507": { "op": "frame_bury 2", "defined_out": [ "discount_factor#0", @@ -56306,7 +59609,7 @@ "discount_factor#0" ] }, - "6189": { + "6509": { "op": "frame_dig 1", "defined_out": [ "denominator#0", @@ -56330,7 +59633,7 @@ "denominator#0" ] }, - "6191": { + "6511": { "op": "+", "stack_out": [ "future_entry#0", @@ -56348,7 +59651,7 @@ "denominator#0" ] }, - "6192": { + "6512": { "op": "frame_bury 1", "defined_out": [ "denominator#0", @@ -56370,10 +59673,10 @@ "tmp%4#0" ] }, - "6194": { + "6514": { "op": "b _apply_non_cash_schedule_entry_after_if_else@47" }, - "6197": { + "6517": { "block": "_apply_non_cash_schedule_entry_bool_false@41", "stack_in": [ "future_entry#0", @@ -56409,10 +59712,10 @@ "is_redemption_event#0" ] }, - "6198": { + "6518": { "op": "b _apply_non_cash_schedule_entry_bool_merge@42" }, - "6201": { + "6521": { "block": "_apply_non_cash_schedule_entry_after_while@48", "stack_in": [ "future_entry#0", @@ -56448,7 +59751,7 @@ "denominator#0" ] }, - "6203": { + "6523": { "error": "Invalid ACTUS configuration", "op": "assert // Invalid ACTUS configuration", "stack_out": [ @@ -56466,7 +59769,7 @@ "tmp%4#0" ] }, - "6204": { + "6524": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -56488,8 +59791,8 @@ "0" ] }, - "6205": { - "op": "bytec_3 // \"outstanding_principal\"", + "6525": { + "op": "bytec 4 // \"outstanding_principal\"", "defined_out": [ "\"outstanding_principal\"", "0", @@ -56512,7 +59815,7 @@ "\"outstanding_principal\"" ] }, - "6206": { + "6527": { "op": "app_global_get_ex", "defined_out": [ "denominator#0", @@ -56536,7 +59839,7 @@ "maybe_exists%3#0" ] }, - "6207": { + "6528": { "error": "check self.outstanding_principal exists", "op": "assert // check self.outstanding_principal exists", "stack_out": [ @@ -56555,7 +59858,7 @@ "numerator#0" ] }, - "6208": { + "6529": { "op": "frame_dig -2", "defined_out": [ "denominator#0", @@ -56579,7 +59882,7 @@ "entry#0 (copy)" ] }, - "6210": { + "6531": { "op": "pushint 57", "defined_out": [ "57", @@ -56605,7 +59908,7 @@ "57" ] }, - "6212": { + "6533": { "op": "extract_uint64", "defined_out": [ "denominator#0", @@ -56629,7 +59932,7 @@ "values%4#0" ] }, - "6213": { + "6534": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -56655,7 +59958,7 @@ "8" ] }, - "6214": { + "6535": { "op": "&", "defined_out": [ "denominator#0", @@ -56679,7 +59982,7 @@ "tmp%14#1" ] }, - "6215": { + "6536": { "op": "bnz _apply_non_cash_schedule_entry_after_if_else@50", "stack_out": [ "future_entry#0", @@ -56697,7 +60000,7 @@ "numerator#0" ] }, - "6218": { + "6539": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -56716,7 +60019,7 @@ "0" ] }, - "6219": { + "6540": { "op": "bytec 6 // \"accrued_interest\"", "defined_out": [ "\"accrued_interest\"", @@ -56742,7 +60045,7 @@ "\"accrued_interest\"" ] }, - "6221": { + "6542": { "op": "app_global_get_ex", "defined_out": [ "denominator#0", @@ -56768,7 +60071,7 @@ "maybe_exists%4#0" ] }, - "6222": { + "6543": { "error": "check self.accrued_interest exists", "op": "assert // check self.accrued_interest exists", "stack_out": [ @@ -56788,7 +60091,7 @@ "maybe_value%4#0" ] }, - "6223": { + "6544": { "op": "+", "stack_out": [ "future_entry#0", @@ -56806,7 +60109,7 @@ "numerator#0" ] }, - "6224": { + "6545": { "block": "_apply_non_cash_schedule_entry_after_if_else@50", "stack_in": [ "future_entry#0", @@ -56844,7 +60147,7 @@ "0" ] }, - "6225": { + "6546": { "op": "bytec 5 // \"fixed_point_scale\"", "defined_out": [ "\"fixed_point_scale\"", @@ -56868,7 +60171,7 @@ "\"fixed_point_scale\"" ] }, - "6227": { + "6548": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%5#0", @@ -56892,7 +60195,7 @@ "maybe_exists%5#0" ] }, - "6228": { + "6549": { "error": "check self.fixed_point_scale exists", "op": "assert // check self.fixed_point_scale exists", "defined_out": [ @@ -56916,7 +60219,7 @@ "maybe_value%5#0" ] }, - "6229": { + "6550": { "op": "frame_dig 1", "defined_out": [ "denominator#0", @@ -56941,7 +60244,7 @@ "denominator#0" ] }, - "6231": { + "6552": { "callsub": "modules.actus_kernel.ActusKernelModule._scaled_mul_div", "op": "callsub _scaled_mul_div", "defined_out": [ @@ -56964,7 +60267,7 @@ "tmp%17#1" ] }, - "6234": { + "6555": { "op": "bytec 14 // \"next_principal_redemption\"", "defined_out": [ "\"next_principal_redemption\"", @@ -56988,7 +60291,7 @@ "\"next_principal_redemption\"" ] }, - "6236": { + "6557": { "op": "swap", "stack_out": [ "future_entry#0", @@ -57007,7 +60310,7 @@ "tmp%17#1" ] }, - "6237": { + "6558": { "op": "app_global_put", "stack_out": [ "future_entry#0", @@ -57024,7 +60327,7 @@ "tmp%4#0" ] }, - "6238": { + "6559": { "block": "_apply_non_cash_schedule_entry_after_if_else@30", "stack_in": [ "future_entry#0", @@ -57060,7 +60363,7 @@ "0" ] }, - "6239": { + "6560": { "op": "bytec_2 // \"event_cursor\"", "defined_out": [ "\"event_cursor\"", @@ -57083,11 +60386,11 @@ "\"event_cursor\"" ] }, - "6240": { + "6561": { "op": "app_global_get_ex", "defined_out": [ - "maybe_exists%10#0", - "maybe_value%10#0" + "maybe_exists%12#0", + "maybe_value%12#0" ], "stack_out": [ "future_entry#0", @@ -57102,11 +60405,11 @@ "values%8#0", "event_type#0", "tmp%4#0", - "maybe_value%10#0", - "maybe_exists%10#0" + "maybe_value%12#0", + "maybe_exists%12#0" ] }, - "6241": { + "6562": { "error": "check self.event_cursor exists", "op": "assert // check self.event_cursor exists", "stack_out": [ @@ -57122,14 +60425,14 @@ "values%8#0", "event_type#0", "tmp%4#0", - "maybe_value%10#0" + "maybe_value%12#0" ] }, - "6242": { + "6563": { "op": "intc_1 // 1", "defined_out": [ "1", - "maybe_value%10#0" + "maybe_value%12#0" ], "stack_out": [ "future_entry#0", @@ -57144,14 +60447,14 @@ "values%8#0", "event_type#0", "tmp%4#0", - "maybe_value%10#0", + "maybe_value%12#0", "1" ] }, - "6243": { + "6564": { "op": "+", "defined_out": [ - "tmp%20#0" + "tmp%23#0" ], "stack_out": [ "future_entry#0", @@ -57166,10 +60469,10 @@ "values%8#0", "event_type#0", "tmp%4#0", - "tmp%20#0" + "tmp%23#0" ] }, - "6244": { + "6565": { "op": "bytec_2 // \"event_cursor\"", "stack_out": [ "future_entry#0", @@ -57184,11 +60487,11 @@ "values%8#0", "event_type#0", "tmp%4#0", - "tmp%20#0", + "tmp%23#0", "\"event_cursor\"" ] }, - "6245": { + "6566": { "op": "swap", "stack_out": [ "future_entry#0", @@ -57204,10 +60507,10 @@ "event_type#0", "tmp%4#0", "\"event_cursor\"", - "tmp%20#0" + "tmp%23#0" ] }, - "6246": { + "6567": { "op": "app_global_put", "stack_out": [ "future_entry#0", @@ -57224,7 +60527,7 @@ "tmp%4#0" ] }, - "6247": { + "6568": { "op": "frame_dig -2", "defined_out": [ "entry#0 (copy)" @@ -57245,7 +60548,7 @@ "entry#0 (copy)" ] }, - "6249": { + "6570": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -57264,7 +60567,7 @@ "0" ] }, - "6250": { + "6571": { "op": "dup", "stack_out": [ "future_entry#0", @@ -57284,7 +60587,7 @@ "0" ] }, - "6251": { + "6572": { "callsub": "modules.actus_kernel.ActusKernelModule._emit_execution_event", "op": "callsub _emit_execution_event", "defined_out": [ @@ -57306,10 +60609,10 @@ "entry#0" ] }, - "6254": { + "6575": { "op": "dup" }, - "6255": { + "6576": { "op": "frame_bury -2", "stack_out": [ "future_entry#0", @@ -57327,7 +60630,7 @@ "entry#0 (copy)" ] }, - "6257": { + "6578": { "op": "frame_dig -1", "defined_out": [ "entry#0 (copy)", @@ -57350,17 +60653,17 @@ "payload#0 (copy)" ] }, - "6259": { + "6580": { "op": "frame_bury 1" }, - "6261": { + "6582": { "op": "frame_bury 0" }, - "6263": { + "6584": { "retsub": true, "op": "retsub" }, - "6264": { + "6585": { "block": "_apply_non_cash_schedule_entry_else_body@29", "stack_in": [ "future_entry#0", @@ -57396,7 +60699,7 @@ "entry#0 (copy)" ] }, - "6266": { + "6587": { "op": "pushint 41", "defined_out": [ "41", @@ -57419,7 +60722,7 @@ "41" ] }, - "6268": { + "6589": { "op": "extract_uint64", "defined_out": [ "values%12#0" @@ -57440,7 +60743,7 @@ "values%12#0" ] }, - "6269": { + "6590": { "op": "bytec 14 // \"next_principal_redemption\"", "defined_out": [ "\"next_principal_redemption\"", @@ -57463,7 +60766,7 @@ "\"next_principal_redemption\"" ] }, - "6271": { + "6592": { "op": "swap", "stack_out": [ "future_entry#0", @@ -57482,7 +60785,7 @@ "values%12#0" ] }, - "6272": { + "6593": { "op": "app_global_put", "stack_out": [ "future_entry#0", @@ -57499,10 +60802,10 @@ "tmp%4#0" ] }, - "6273": { + "6594": { "op": "b _apply_non_cash_schedule_entry_after_if_else@30" }, - "6276": { + "6597": { "block": "_apply_non_cash_schedule_entry_else_body@20", "stack_in": [ "future_entry#0", @@ -57538,7 +60841,7 @@ "event_type#0" ] }, - "6278": { + "6599": { "op": "pushint 18", "defined_out": [ "18", @@ -57561,7 +60864,7 @@ "18" ] }, - "6280": { + "6601": { "op": "==", "defined_out": [ "event_type#0", @@ -57583,7 +60886,7 @@ "tmp%17#0" ] }, - "6281": { + "6602": { "op": "bz _apply_non_cash_schedule_entry_after_if_else@23", "stack_out": [ "future_entry#0", @@ -57600,7 +60903,7 @@ "tmp%4#0" ] }, - "6284": { + "6605": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -57622,8 +60925,8 @@ "0" ] }, - "6285": { - "op": "bytec_3 // \"outstanding_principal\"", + "6606": { + "op": "bytec 4 // \"outstanding_principal\"", "defined_out": [ "\"outstanding_principal\"", "0", @@ -57646,7 +60949,7 @@ "\"outstanding_principal\"" ] }, - "6286": { + "6608": { "op": "app_global_get_ex", "defined_out": [ "event_type#0", @@ -57670,7 +60973,7 @@ "maybe_exists%9#0" ] }, - "6287": { + "6609": { "error": "check self.outstanding_principal exists", "op": "assert // check self.outstanding_principal exists", "stack_out": [ @@ -57689,7 +60992,7 @@ "maybe_value%9#0" ] }, - "6288": { + "6610": { "op": "bytec 7 // \"interest_calculation_base\"", "defined_out": [ "\"interest_calculation_base\"", @@ -57713,7 +61016,7 @@ "\"interest_calculation_base\"" ] }, - "6290": { + "6612": { "op": "swap", "stack_out": [ "future_entry#0", @@ -57732,7 +61035,7 @@ "maybe_value%9#0" ] }, - "6291": { + "6613": { "op": "app_global_put", "stack_out": [ "future_entry#0", @@ -57749,10 +61052,10 @@ "tmp%4#0" ] }, - "6292": { + "6614": { "op": "b _apply_non_cash_schedule_entry_after_if_else@23" }, - "6295": { + "6617": { "block": "_apply_non_cash_schedule_entry_else_body@10", "stack_in": [ "future_entry#0", @@ -57788,7 +61091,7 @@ "event_type#0" ] }, - "6297": { + "6619": { "op": "pushint 11", "defined_out": [ "11", @@ -57811,7 +61114,7 @@ "11" ] }, - "6299": { + "6621": { "op": "==", "defined_out": [ "event_type#0", @@ -57833,7 +61136,7 @@ "tmp%13#0" ] }, - "6300": { + "6622": { "op": "bz _apply_non_cash_schedule_entry_else_body@14", "stack_out": [ "future_entry#0", @@ -57850,7 +61153,7 @@ "tmp%4#0" ] }, - "6303": { + "6625": { "op": "frame_dig -2", "defined_out": [ "entry#0 (copy)", @@ -57872,7 +61175,7 @@ "entry#0 (copy)" ] }, - "6305": { + "6627": { "op": "pushint 33", "defined_out": [ "33", @@ -57896,7 +61199,7 @@ "33" ] }, - "6307": { + "6629": { "op": "extract_uint64", "defined_out": [ "event_type#0", @@ -57918,7 +61221,7 @@ "next_rate#0" ] }, - "6308": { + "6630": { "op": "dup", "stack_out": [ "future_entry#0", @@ -57937,7 +61240,7 @@ "next_rate#0" ] }, - "6309": { + "6631": { "op": "frame_bury 5", "defined_out": [ "event_type#0", @@ -57959,7 +61262,7 @@ "next_rate#0" ] }, - "6311": { + "6633": { "op": "bnz _apply_non_cash_schedule_entry_after_if_else@13", "stack_out": [ "future_entry#0", @@ -57976,7 +61279,7 @@ "tmp%4#0" ] }, - "6314": { + "6636": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -57994,7 +61297,7 @@ "0" ] }, - "6315": { + "6637": { "op": "bytec 37 // \"rate_reset_next\"", "defined_out": [ "\"rate_reset_next\"", @@ -58019,7 +61322,7 @@ "\"rate_reset_next\"" ] }, - "6317": { + "6639": { "op": "app_global_get_ex", "defined_out": [ "event_type#0", @@ -58043,7 +61346,7 @@ "maybe_exists%8#0" ] }, - "6318": { + "6640": { "op": "swap", "stack_out": [ "future_entry#0", @@ -58062,7 +61365,7 @@ "next_rate#0" ] }, - "6319": { + "6641": { "op": "frame_bury 5", "stack_out": [ "future_entry#0", @@ -58080,7 +61383,7 @@ "maybe_exists%8#0" ] }, - "6321": { + "6643": { "error": "check self.rate_reset_next exists", "op": "assert // check self.rate_reset_next exists", "stack_out": [ @@ -58098,7 +61401,7 @@ "tmp%4#0" ] }, - "6322": { + "6644": { "block": "_apply_non_cash_schedule_entry_after_if_else@13", "stack_in": [ "future_entry#0", @@ -58134,7 +61437,7 @@ "\"nominal_interest_rate\"" ] }, - "6324": { + "6646": { "op": "frame_dig 5", "defined_out": [ "\"nominal_interest_rate\"", @@ -58157,7 +61460,7 @@ "next_rate#0" ] }, - "6326": { + "6648": { "op": "app_global_put", "stack_out": [ "future_entry#0", @@ -58174,10 +61477,10 @@ "tmp%4#0" ] }, - "6327": { + "6649": { "op": "b _apply_non_cash_schedule_entry_after_if_else@18" }, - "6330": { + "6652": { "block": "_apply_non_cash_schedule_entry_else_body@14", "stack_in": [ "future_entry#0", @@ -58213,7 +61516,7 @@ "entry#0 (copy)" ] }, - "6332": { + "6654": { "op": "pushint 33", "defined_out": [ "33", @@ -58236,7 +61539,7 @@ "33" ] }, - "6334": { + "6656": { "op": "extract_uint64", "defined_out": [ "values%8#0" @@ -58257,7 +61560,7 @@ "values%8#0" ] }, - "6335": { + "6657": { "op": "dup", "stack_out": [ "future_entry#0", @@ -58276,7 +61579,7 @@ "values%8#0" ] }, - "6336": { + "6658": { "op": "frame_bury 9", "defined_out": [ "values%8#0" @@ -58297,7 +61600,7 @@ "values%8#0" ] }, - "6338": { + "6660": { "op": "bz _apply_non_cash_schedule_entry_after_if_else@18", "stack_out": [ "future_entry#0", @@ -58314,7 +61617,7 @@ "tmp%4#0" ] }, - "6341": { + "6663": { "op": "bytec 9 // \"nominal_interest_rate\"", "defined_out": [ "\"nominal_interest_rate\"", @@ -58336,7 +61639,7 @@ "\"nominal_interest_rate\"" ] }, - "6343": { + "6665": { "op": "frame_dig 9", "stack_out": [ "future_entry#0", @@ -58355,7 +61658,7 @@ "values%8#0" ] }, - "6345": { + "6667": { "op": "app_global_put", "stack_out": [ "future_entry#0", @@ -58372,10 +61675,10 @@ "tmp%4#0" ] }, - "6346": { + "6668": { "op": "b _apply_non_cash_schedule_entry_after_if_else@18" }, - "6349": { + "6671": { "subroutine": "modules.actus_kernel.ActusKernelModule._emit_execution_event", "params": { "entry#0": "bytes", @@ -58386,13 +61689,13 @@ "stack_in": [], "op": "proto 3 1" }, - "6352": { + "6674": { "op": "global CurrentApplicationID" }, - "6354": { + "6676": { "op": "frame_dig -3" }, - "6356": { + "6678": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -58405,7 +61708,7 @@ "0" ] }, - "6357": { + "6679": { "op": "extract_uint64", "defined_out": [ "tmp%0#0", @@ -58416,7 +61719,7 @@ "values%0#0" ] }, - "6358": { + "6680": { "op": "frame_dig -3", "stack_out": [ "tmp%0#0", @@ -58424,7 +61727,7 @@ "entry#0 (copy)" ] }, - "6360": { + "6682": { "op": "extract 8 1", "defined_out": [ "aggregate%extract%1#0", @@ -58437,7 +61740,7 @@ "aggregate%extract%1#0" ] }, - "6363": { + "6685": { "op": "frame_dig -3", "stack_out": [ "tmp%0#0", @@ -58446,7 +61749,7 @@ "entry#0 (copy)" ] }, - "6365": { + "6687": { "op": "extract 9 8", "defined_out": [ "aggregate%extract%1#0", @@ -58461,13 +61764,13 @@ "aggregate%extract%2#0" ] }, - "6368": { + "6690": { "op": "global LatestTimestamp" }, - "6370": { + "6692": { "op": "frame_dig -3" }, - "6372": { + "6694": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -58488,7 +61791,7 @@ "8" ] }, - "6373": { + "6695": { "op": "getbyte", "defined_out": [ "aggregate%extract%1#0", @@ -58507,7 +61810,7 @@ "event_type#0" ] }, - "6374": { + "6696": { "op": "frame_dig -2", "defined_out": [ "aggregate%extract%1#0", @@ -58528,7 +61831,7 @@ "payoff#0 (copy)" ] }, - "6376": { + "6698": { "op": "bnz _emit_execution_event_after_if_else@3", "stack_out": [ "tmp%0#0", @@ -58539,7 +61842,7 @@ "event_type#0" ] }, - "6379": { + "6701": { "op": "intc_1 // 1", "defined_out": [ "aggregate%extract%1#0", @@ -58560,7 +61863,7 @@ "tmp%3#0" ] }, - "6380": { + "6702": { "block": "_emit_execution_event_after_inlined_modules.actus_kernel.ActusKernelModule._payoff_sign@7", "stack_in": [ "tmp%0#0", @@ -58585,7 +61888,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "6381": { + "6703": { "op": "dup", "defined_out": [ "aggregate%val_as_bytes%0#0", @@ -58602,7 +61905,7 @@ "aggregate%val_as_bytes%0#0 (copy)" ] }, - "6382": { + "6704": { "op": "bitlen", "defined_out": [ "aggregate%bitlen%0#0", @@ -58619,7 +61922,7 @@ "aggregate%bitlen%0#0" ] }, - "6383": { + "6705": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -58638,7 +61941,7 @@ "8" ] }, - "6384": { + "6706": { "op": "<=", "defined_out": [ "aggregate%no_overflow%0#0", @@ -58655,7 +61958,7 @@ "aggregate%no_overflow%0#0" ] }, - "6385": { + "6707": { "error": "overflow", "op": "assert // overflow", "stack_out": [ @@ -58668,7 +61971,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "6386": { + "6708": { "op": "extract 7 1", "defined_out": [ "aggregate%uint8%0#0" @@ -58683,7 +61986,7 @@ "aggregate%uint8%0#0" ] }, - "6389": { + "6711": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -58700,7 +62003,7 @@ "0" ] }, - "6390": { + "6712": { "op": "bytec 19 // \"settlement_asset_id\"", "defined_out": [ "\"settlement_asset_id\"", @@ -58719,7 +62022,7 @@ "\"settlement_asset_id\"" ] }, - "6392": { + "6714": { "op": "app_global_get_ex", "defined_out": [ "aggregate%uint8%0#0", @@ -58738,7 +62041,7 @@ "maybe_exists%0#0" ] }, - "6393": { + "6715": { "error": "check self.settlement_asset_id exists", "op": "assert // check self.settlement_asset_id exists", "stack_out": [ @@ -58752,7 +62055,7 @@ "maybe_value%0#0" ] }, - "6394": { + "6716": { "op": "frame_dig 1", "defined_out": [ "aggregate%uint8%0#0", @@ -58771,7 +62074,7 @@ "values%0#0" ] }, - "6396": { + "6718": { "op": "dup", "defined_out": [ "aggregate%uint8%0#0", @@ -58792,7 +62095,7 @@ "values%0#0 (copy)" ] }, - "6397": { + "6719": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -58815,7 +62118,7 @@ "1" ] }, - "6398": { + "6720": { "op": "+", "defined_out": [ "aggregate%uint8%0#0", @@ -58836,7 +62139,7 @@ "tmp%5#0" ] }, - "6399": { + "6721": { "op": "frame_dig 0", "defined_out": [ "aggregate%uint8%0#0", @@ -58859,7 +62162,7 @@ "tmp%0#0" ] }, - "6401": { + "6723": { "op": "itob", "defined_out": [ "aggregate%uint8%0#0", @@ -58883,7 +62186,7 @@ "aggregate%val_as_bytes%1#0" ] }, - "6402": { + "6724": { "op": "uncover 2", "stack_out": [ "tmp%0#0", @@ -58899,7 +62202,7 @@ "values%0#0" ] }, - "6404": { + "6726": { "op": "itob", "defined_out": [ "aggregate%uint8%0#0", @@ -58924,7 +62227,7 @@ "aggregate%val_as_bytes%2#0" ] }, - "6405": { + "6727": { "op": "concat", "defined_out": [ "aggregate%head%1#0", @@ -58947,7 +62250,7 @@ "aggregate%head%1#0" ] }, - "6406": { + "6728": { "op": "frame_dig 2", "defined_out": [ "aggregate%extract%1#0", @@ -58972,7 +62275,7 @@ "aggregate%extract%1#0" ] }, - "6408": { + "6730": { "op": "concat", "defined_out": [ "aggregate%extract%1#0", @@ -58996,7 +62299,7 @@ "aggregate%head%2#0" ] }, - "6409": { + "6731": { "op": "frame_dig 3", "defined_out": [ "aggregate%extract%1#0", @@ -59022,7 +62325,7 @@ "aggregate%extract%2#0" ] }, - "6411": { + "6733": { "op": "concat", "defined_out": [ "aggregate%extract%1#0", @@ -59047,7 +62350,7 @@ "aggregate%head%3#0" ] }, - "6412": { + "6734": { "op": "frame_dig 4", "defined_out": [ "aggregate%extract%1#0", @@ -59074,7 +62377,7 @@ "tmp%1#0" ] }, - "6414": { + "6736": { "op": "itob", "defined_out": [ "aggregate%extract%1#0", @@ -59102,7 +62405,7 @@ "aggregate%val_as_bytes%4#0" ] }, - "6415": { + "6737": { "op": "concat", "defined_out": [ "aggregate%extract%1#0", @@ -59128,7 +62431,7 @@ "aggregate%head%4#0" ] }, - "6416": { + "6738": { "op": "frame_dig -2", "defined_out": [ "aggregate%extract%1#0", @@ -59156,7 +62459,7 @@ "payoff#0 (copy)" ] }, - "6418": { + "6740": { "op": "itob", "defined_out": [ "aggregate%extract%1#0", @@ -59184,7 +62487,7 @@ "aggregate%val_as_bytes%5#0" ] }, - "6419": { + "6741": { "op": "concat", "defined_out": [ "aggregate%extract%1#0", @@ -59210,7 +62513,7 @@ "aggregate%head%5#0" ] }, - "6420": { + "6742": { "op": "uncover 3", "stack_out": [ "tmp%0#0", @@ -59225,7 +62528,7 @@ "aggregate%uint8%0#0" ] }, - "6422": { + "6744": { "op": "concat", "defined_out": [ "aggregate%extract%1#0", @@ -59249,7 +62552,7 @@ "aggregate%head%6#0" ] }, - "6423": { + "6745": { "op": "frame_dig -1", "defined_out": [ "aggregate%extract%1#0", @@ -59275,7 +62578,7 @@ "settled_amount#0 (copy)" ] }, - "6425": { + "6747": { "op": "itob", "defined_out": [ "aggregate%extract%1#0", @@ -59301,7 +62604,7 @@ "aggregate%val_as_bytes%6#0" ] }, - "6426": { + "6748": { "op": "concat", "defined_out": [ "aggregate%extract%1#0", @@ -59325,7 +62628,7 @@ "aggregate%head%7#0" ] }, - "6427": { + "6749": { "op": "uncover 2", "stack_out": [ "tmp%0#0", @@ -59339,7 +62642,7 @@ "maybe_value%0#0" ] }, - "6429": { + "6751": { "op": "itob", "defined_out": [ "aggregate%extract%1#0", @@ -59363,7 +62666,7 @@ "aggregate%val_as_bytes%7#0" ] }, - "6430": { + "6752": { "op": "concat", "defined_out": [ "aggregate%extract%1#0", @@ -59385,7 +62688,7 @@ "aggregate%head%8#0" ] }, - "6431": { + "6753": { "op": "swap", "stack_out": [ "tmp%0#0", @@ -59398,7 +62701,7 @@ "tmp%5#0" ] }, - "6432": { + "6754": { "op": "itob", "defined_out": [ "aggregate%extract%1#0", @@ -59420,7 +62723,7 @@ "aggregate%val_as_bytes%8#0" ] }, - "6433": { + "6755": { "op": "concat", "defined_out": [ "aggregate%extract%1#0", @@ -59440,7 +62743,7 @@ "aggregate%head%9#0" ] }, - "6434": { + "6756": { "op": "pushbytes 0x9a332b95 // method \"ExecutionEvent(uint64,uint64,uint8,uint64,uint64,uint64,uint8,uint64,uint64,uint64)\"", "defined_out": [ "Method(ExecutionEvent(uint64,uint64,uint8,uint64,uint64,uint64,uint8,uint64,uint64,uint64))", @@ -59462,7 +62765,7 @@ "Method(ExecutionEvent(uint64,uint64,uint8,uint64,uint64,uint64,uint8,uint64,uint64,uint64))" ] }, - "6440": { + "6762": { "op": "swap", "stack_out": [ "tmp%0#0", @@ -59475,7 +62778,7 @@ "aggregate%head%9#0" ] }, - "6441": { + "6763": { "op": "concat", "defined_out": [ "aggregate%extract%1#0", @@ -59495,7 +62798,7 @@ "event%0#0" ] }, - "6442": { + "6764": { "op": "log", "stack_out": [ "tmp%0#0", @@ -59506,7 +62809,7 @@ "event_type#0" ] }, - "6443": { + "6765": { "op": "frame_dig -3", "defined_out": [ "aggregate%extract%1#0", @@ -59526,14 +62829,14 @@ "entry#0 (copy)" ] }, - "6445": { + "6767": { "op": "frame_bury 0" }, - "6447": { + "6769": { "retsub": true, "op": "retsub" }, - "6448": { + "6770": { "block": "_emit_execution_event_after_if_else@3", "stack_in": [ "tmp%0#0", @@ -59557,7 +62860,7 @@ "event_type#0" ] }, - "6450": { + "6772": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -59574,7 +62877,7 @@ "1" ] }, - "6451": { + "6773": { "op": "==", "defined_out": [ "event_type#0", @@ -59590,7 +62893,7 @@ "tmp%1#1" ] }, - "6452": { + "6774": { "op": "bnz _emit_execution_event_if_body@5", "stack_out": [ "tmp%0#0", @@ -59601,7 +62904,7 @@ "event_type#0" ] }, - "6455": { + "6777": { "op": "frame_dig 5", "stack_out": [ "tmp%0#0", @@ -59613,7 +62916,7 @@ "event_type#0" ] }, - "6457": { + "6779": { "op": "pushint 4", "defined_out": [ "4", @@ -59630,7 +62933,7 @@ "4" ] }, - "6459": { + "6781": { "op": "==", "defined_out": [ "event_type#0", @@ -59646,7 +62949,7 @@ "tmp%2#1" ] }, - "6460": { + "6782": { "op": "bz _emit_execution_event_after_if_else@6", "stack_out": [ "tmp%0#0", @@ -59657,7 +62960,7 @@ "event_type#0" ] }, - "6463": { + "6785": { "block": "_emit_execution_event_if_body@5", "stack_in": [ "tmp%0#0", @@ -59681,10 +62984,10 @@ "tmp%3#0" ] }, - "6464": { + "6786": { "op": "b _emit_execution_event_after_inlined_modules.actus_kernel.ActusKernelModule._payoff_sign@7" }, - "6467": { + "6789": { "block": "_emit_execution_event_after_if_else@6", "stack_in": [ "tmp%0#0", @@ -59708,10 +63011,10 @@ "tmp%3#0" ] }, - "6470": { + "6792": { "op": "b _emit_execution_event_after_inlined_modules.actus_kernel.ActusKernelModule._payoff_sign@7" }, - "6473": { + "6795": { "subroutine": "modules.rbac.RbacModule._role_is_active", "params": { "role_map#0": "bytes", @@ -59721,13 +63024,13 @@ "stack_in": [], "op": "proto 2 1" }, - "6476": { + "6798": { "op": "pushbytes \"\"", "stack_out": [ "awst_tmp%0#0" ] }, - "6478": { + "6800": { "op": "frame_dig -2", "defined_out": [ "role_map#0 (copy)" @@ -59737,7 +63040,7 @@ "role_map#0 (copy)" ] }, - "6480": { + "6802": { "op": "frame_dig -1", "defined_out": [ "role_address#0 (copy)", @@ -59749,7 +63052,7 @@ "role_address#0 (copy)" ] }, - "6482": { + "6804": { "op": "concat", "defined_out": [ "box_prefixed_key%0#1" @@ -59759,7 +63062,7 @@ "box_prefixed_key%0#1" ] }, - "6483": { + "6805": { "op": "dup", "defined_out": [ "box_prefixed_key%0#1" @@ -59770,7 +63073,7 @@ "box_prefixed_key%0#1" ] }, - "6484": { + "6806": { "op": "box_len", "defined_out": [ "_%0#0", @@ -59784,7 +63087,7 @@ "maybe_exists%0#0" ] }, - "6485": { + "6807": { "op": "bury 1", "stack_out": [ "awst_tmp%0#0", @@ -59792,14 +63095,14 @@ "maybe_exists%0#0" ] }, - "6487": { + "6809": { "op": "bz _role_is_active_bool_false@4", "stack_out": [ "awst_tmp%0#0", "box_prefixed_key%0#1" ] }, - "6490": { + "6812": { "op": "frame_dig 1", "stack_out": [ "awst_tmp%0#0", @@ -59807,7 +63110,7 @@ "box_prefixed_key%0#1" ] }, - "6492": { + "6814": { "op": "box_get", "defined_out": [ "aggregate%box_get%0#0", @@ -59821,7 +63124,7 @@ "aggregate%box_get%1#0" ] }, - "6493": { + "6815": { "error": "check BoxMap entry exists", "op": "assert // check BoxMap entry exists", "stack_out": [ @@ -59830,7 +63133,7 @@ "aggregate%box_get%0#0" ] }, - "6494": { + "6816": { "op": "intc_0 // 0", "stack_out": [ "awst_tmp%0#0", @@ -59839,7 +63142,7 @@ "0" ] }, - "6495": { + "6817": { "op": "extract_uint64", "defined_out": [ "box_prefixed_key%0#1", @@ -59851,10 +63154,10 @@ "values%0#0" ] }, - "6496": { + "6818": { "op": "global LatestTimestamp" }, - "6498": { + "6820": { "op": "dup", "defined_out": [ "awst_tmp%0#0", @@ -59869,7 +63172,7 @@ "awst_tmp%0#0" ] }, - "6499": { + "6821": { "op": "frame_bury 0", "defined_out": [ "awst_tmp%0#0", @@ -59883,7 +63186,7 @@ "awst_tmp%0#0" ] }, - "6501": { + "6823": { "op": "<=", "defined_out": [ "awst_tmp%0#0", @@ -59896,14 +63199,14 @@ "tmp%1#0" ] }, - "6502": { + "6824": { "op": "bz _role_is_active_bool_false@4", "stack_out": [ "awst_tmp%0#0", "box_prefixed_key%0#1" ] }, - "6505": { + "6827": { "op": "frame_dig 1", "stack_out": [ "awst_tmp%0#0", @@ -59911,7 +63214,7 @@ "box_prefixed_key%0#1" ] }, - "6507": { + "6829": { "op": "box_get", "defined_out": [ "aggregate%box_get%2#0", @@ -59926,7 +63229,7 @@ "aggregate%box_get%3#0" ] }, - "6508": { + "6830": { "error": "check BoxMap entry exists", "op": "assert // check BoxMap entry exists", "stack_out": [ @@ -59935,7 +63238,7 @@ "aggregate%box_get%2#0" ] }, - "6509": { + "6831": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -59950,7 +63253,7 @@ "8" ] }, - "6510": { + "6832": { "op": "extract_uint64", "defined_out": [ "awst_tmp%0#0", @@ -59963,7 +63266,7 @@ "values%1#0" ] }, - "6511": { + "6833": { "op": "frame_dig 0", "stack_out": [ "awst_tmp%0#0", @@ -59972,7 +63275,7 @@ "awst_tmp%0#0" ] }, - "6513": { + "6835": { "op": ">=", "defined_out": [ "awst_tmp%0#0", @@ -59985,14 +63288,14 @@ "tmp%2#0" ] }, - "6514": { + "6836": { "op": "bz _role_is_active_bool_false@4", "stack_out": [ "awst_tmp%0#0", "box_prefixed_key%0#1" ] }, - "6517": { + "6839": { "op": "intc_1 // 1", "defined_out": [ "and_result%0#0", @@ -60005,7 +63308,7 @@ "and_result%0#0" ] }, - "6518": { + "6840": { "block": "_role_is_active_bool_merge@5", "stack_in": [ "awst_tmp%0#0", @@ -60017,11 +63320,11 @@ "and_result%0#0" ] }, - "6520": { + "6842": { "retsub": true, "op": "retsub" }, - "6521": { + "6843": { "block": "_role_is_active_bool_false@4", "stack_in": [ "awst_tmp%0#0", @@ -60037,10 +63340,10 @@ "and_result%0#0" ] }, - "6522": { + "6844": { "op": "b _role_is_active_bool_merge@5" }, - "6525": { + "6847": { "subroutine": "modules.rbac.RbacModule._assert_caller_is_arranger", "params": {}, "block": "_assert_caller_is_arranger", @@ -60053,7 +63356,7 @@ "role_address#0" ] }, - "6527": { + "6849": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -60064,7 +63367,7 @@ "0" ] }, - "6528": { + "6850": { "op": "bytec 18 // 0x5223417272616e67657223", "defined_out": [ "0", @@ -60077,7 +63380,7 @@ "0x5223417272616e67657223" ] }, - "6530": { + "6852": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -60090,7 +63393,7 @@ "maybe_exists%0#0" ] }, - "6531": { + "6853": { "error": "check self.arranger exists", "op": "assert // check self.arranger exists", "stack_out": [ @@ -60098,7 +63401,7 @@ "maybe_value%0#0" ] }, - "6532": { + "6854": { "op": "==", "defined_out": [ "tmp%0#1" @@ -60107,16 +63410,16 @@ "tmp%0#1" ] }, - "6533": { + "6855": { "error": "Not authorized", "op": "assert // Not authorized", "stack_out": [] }, - "6534": { + "6856": { "retsub": true, "op": "retsub" }, - "6535": { + "6857": { "subroutine": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", "params": {}, "block": "_assert_is_not_asset_defaulted", @@ -60129,7 +63432,7 @@ "0" ] }, - "6536": { + "6858": { "op": "bytec 41 // \"asset_defaulted\"", "defined_out": [ "\"asset_defaulted\"", @@ -60140,7 +63443,7 @@ "\"asset_defaulted\"" ] }, - "6538": { + "6860": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -60151,14 +63454,14 @@ "maybe_exists%0#0" ] }, - "6539": { + "6861": { "error": "check self.asset_defaulted exists", "op": "assert // check self.asset_defaulted exists", "stack_out": [ "maybe_value%0#0" ] }, - "6540": { + "6862": { "op": "!", "defined_out": [ "tmp%0#0" @@ -60167,16 +63470,16 @@ "tmp%0#0" ] }, - "6541": { + "6863": { "error": "Defaulted", "op": "assert // Defaulted", "stack_out": [] }, - "6542": { + "6864": { "retsub": true, "op": "retsub" }, - "6543": { + "6865": { "subroutine": "modules.rbac.RbacModule._assert_is_not_asset_suspended", "params": {}, "block": "_assert_is_not_asset_suspended", @@ -60189,7 +63492,7 @@ "0" ] }, - "6544": { + "6866": { "op": "bytec 33 // \"asset_suspended\"", "defined_out": [ "\"asset_suspended\"", @@ -60200,7 +63503,7 @@ "\"asset_suspended\"" ] }, - "6546": { + "6868": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -60211,14 +63514,14 @@ "maybe_exists%0#0" ] }, - "6547": { + "6869": { "error": "check self.asset_suspended exists", "op": "assert // check self.asset_suspended exists", "stack_out": [ "maybe_value%0#0" ] }, - "6548": { + "6870": { "op": "!", "defined_out": [ "tmp%0#0" @@ -60227,16 +63530,16 @@ "tmp%0#0" ] }, - "6549": { + "6871": { "error": "Suspended operations", "op": "assert // Suspended operations", "stack_out": [] }, - "6550": { + "6872": { "retsub": true, "op": "retsub" }, - "6551": { + "6873": { "subroutine": "modules.rbac.RbacModule._assert_valid_role", "params": { "role_id#0": "uint64" @@ -60245,7 +63548,7 @@ "stack_in": [], "op": "proto 1 0" }, - "6554": { + "6876": { "op": "frame_dig -1", "defined_out": [ "role_id#0 (copy)" @@ -60254,7 +63557,7 @@ "role_id#0 (copy)" ] }, - "6556": { + "6878": { "op": "pushint 20", "defined_out": [ "20", @@ -60265,7 +63568,7 @@ "20" ] }, - "6558": { + "6880": { "op": "==", "defined_out": [ "tmp%0#0" @@ -60274,17 +63577,17 @@ "tmp%0#0" ] }, - "6559": { + "6881": { "op": "bnz _assert_valid_role_bool_true@7", "stack_out": [] }, - "6562": { + "6884": { "op": "frame_dig -1", "stack_out": [ "role_id#0 (copy)" ] }, - "6564": { + "6886": { "op": "pushint 25", "defined_out": [ "25", @@ -60295,7 +63598,7 @@ "25" ] }, - "6566": { + "6888": { "op": "==", "defined_out": [ "tmp%1#0" @@ -60304,17 +63607,17 @@ "tmp%1#0" ] }, - "6567": { + "6889": { "op": "bnz _assert_valid_role_bool_true@7", "stack_out": [] }, - "6570": { + "6892": { "op": "frame_dig -1", "stack_out": [ "role_id#0 (copy)" ] }, - "6572": { + "6894": { "op": "pushint 40", "defined_out": [ "40", @@ -60325,7 +63628,7 @@ "40" ] }, - "6574": { + "6896": { "op": "==", "defined_out": [ "tmp%2#0" @@ -60334,17 +63637,17 @@ "tmp%2#0" ] }, - "6575": { + "6897": { "op": "bnz _assert_valid_role_bool_true@7", "stack_out": [] }, - "6578": { + "6900": { "op": "frame_dig -1", "stack_out": [ "role_id#0 (copy)" ] }, - "6580": { + "6902": { "op": "pushint 50", "defined_out": [ "50", @@ -60355,7 +63658,7 @@ "50" ] }, - "6582": { + "6904": { "op": "==", "defined_out": [ "tmp%3#0" @@ -60364,17 +63667,17 @@ "tmp%3#0" ] }, - "6583": { + "6905": { "op": "bnz _assert_valid_role_bool_true@7", "stack_out": [] }, - "6586": { + "6908": { "op": "frame_dig -1", "stack_out": [ "role_id#0 (copy)" ] }, - "6588": { + "6910": { "op": "pushint 60", "defined_out": [ "60", @@ -60385,7 +63688,7 @@ "60" ] }, - "6590": { + "6912": { "op": "==", "defined_out": [ "tmp%4#0" @@ -60394,17 +63697,17 @@ "tmp%4#0" ] }, - "6591": { + "6913": { "op": "bnz _assert_valid_role_bool_true@7", "stack_out": [] }, - "6594": { + "6916": { "op": "frame_dig -1", "stack_out": [ "role_id#0 (copy)" ] }, - "6596": { + "6918": { "op": "pushint 70", "defined_out": [ "70", @@ -60415,7 +63718,7 @@ "70" ] }, - "6598": { + "6920": { "op": "==", "defined_out": [ "tmp%5#0" @@ -60424,17 +63727,17 @@ "tmp%5#0" ] }, - "6599": { + "6921": { "op": "bnz _assert_valid_role_bool_true@7", "stack_out": [] }, - "6602": { + "6924": { "op": "frame_dig -1", "stack_out": [ "role_id#0 (copy)" ] }, - "6604": { + "6926": { "op": "pushint 80", "defined_out": [ "80", @@ -60445,7 +63748,7 @@ "80" ] }, - "6606": { + "6928": { "op": "==", "defined_out": [ "tmp%6#0" @@ -60454,11 +63757,11 @@ "tmp%6#0" ] }, - "6607": { + "6929": { "op": "bz _assert_valid_role_bool_false@8", "stack_out": [] }, - "6610": { + "6932": { "block": "_assert_valid_role_bool_true@7", "stack_in": [], "op": "intc_1 // 1", @@ -60469,7 +63772,7 @@ "or_result%0#0" ] }, - "6611": { + "6933": { "error": "Invalid role identifier", "block": "_assert_valid_role_bool_merge@9", "stack_in": [ @@ -60479,11 +63782,11 @@ "defined_out": [], "stack_out": [] }, - "6612": { + "6934": { "retsub": true, "op": "retsub" }, - "6613": { + "6935": { "block": "_assert_valid_role_bool_false@8", "stack_in": [], "op": "intc_0 // 0", @@ -60494,7 +63797,7 @@ "or_result%0#0" ] }, - "6614": { + "6936": { "op": "b _assert_valid_role_bool_merge@9" } } diff --git a/smart_contracts/artifacts/d_asa/DASA.approval.teal b/smart_contracts/artifacts/d_asa/DASA.approval.teal index 8eb4a805..d6e2cd7a 100644 --- a/smart_contracts/artifacts/d_asa/DASA.approval.teal +++ b/smart_contracts/artifacts/d_asa/DASA.approval.teal @@ -3,8 +3,8 @@ // algopy.arc4.ARC4Contract.approval_program() -> uint64: main: - intcblock 0 1 8 32 - bytecblock 0x151f7c75 "status" "event_cursor" "outstanding_principal" "schedule_entry_count" "fixed_point_scale" "accrued_interest" "interest_calculation_base" 0x52234163636f756e7423 "nominal_interest_rate" "reserved_units_total" "reserved_principal" "contract_type" "total_units" "next_principal_redemption" "reserved_interest" "cumulative_interest_index" "cumulative_principal_index" 0x5223417272616e67657223 "settlement_asset_id" "initial_exchange_amount" 0x5223417574686f7269747923 0x52235072696d6172794465616c657223 0x52234163636f756e744d616e6167657223 0x52234f6273657276657223 0x52234f704461656d6f6e23 "initial_exchange_date" "transfer_opening_date" "transfer_closure_date" "rate_reset_floor" "rate_reset_cap" 0x5323 0x52235472757374656523 "asset_suspended" "dynamic_principal_redemption" "rate_reset_spread" "rate_reset_multiplier" "rate_reset_next" "has_rate_reset_floor" "has_rate_reset_cap" 0x00 "asset_defaulted" "prospectus_hash" "prospectus_url" "denomination_asset_id" "maturity_date" "day_count_convention" 0x068101 + intcblock 0 1 8 32 1500 + bytecblock 0x151f7c75 "status" "event_cursor" "schedule_entry_count" "outstanding_principal" "fixed_point_scale" "accrued_interest" "interest_calculation_base" 0x52234163636f756e7423 "nominal_interest_rate" "contract_type" "reserved_units_total" "reserved_principal" "total_units" "next_principal_redemption" "reserved_interest" "cumulative_interest_index" "cumulative_principal_index" 0x5223417272616e67657223 "settlement_asset_id" "initial_exchange_amount" 0x5223417574686f7269747923 0x52235072696d6172794465616c657223 0x52234163636f756e744d616e6167657223 0x5323 0x52234f6273657276657223 0x52234f704461656d6f6e23 "initial_exchange_date" "transfer_opening_date" "transfer_closure_date" "rate_reset_floor" "rate_reset_cap" 0x52235472757374656523 "asset_suspended" "dynamic_principal_redemption" "rate_reset_spread" "rate_reset_multiplier" "rate_reset_next" "has_rate_reset_floor" "has_rate_reset_cap" 0x00 "asset_defaulted" "prospectus_hash" "prospectus_url" "denomination_asset_id" "maturity_date" "day_count_convention" 0x068101 0x0000 txn ApplicationID bnz main_after_if_else@2 // modules/rbac.py:28-29 @@ -15,7 +15,7 @@ main: app_global_put // modules/rbac.py:30 // self.op_daemon = GlobalState(Account(), key=cst.PREFIX_ID_OP_DAEMON) - bytec 25 // 0x52234f704461656d6f6e23 + bytec 26 // 0x52234f704461656d6f6e23 global ZeroAddress app_global_put // modules/rbac.py:47-48 @@ -37,7 +37,7 @@ main: app_global_put // modules/actus_kernel.py:58 // self.contract_type = UInt64() - bytec 12 // "contract_type" + bytec 10 // "contract_type" intc_0 // 0 app_global_put // modules/actus_kernel.py:60-61 @@ -65,7 +65,7 @@ main: // modules/actus_kernel.py:68-69 // # Time // self.initial_exchange_date = typ.TimeStamp() - bytec 26 // "initial_exchange_date" + bytec 27 // "initial_exchange_date" intc_0 // 0 app_global_put // modules/actus_kernel.py:70 @@ -75,12 +75,12 @@ main: app_global_put // modules/actus_kernel.py:71 // self.transfer_opening_date = typ.TimeStamp() - bytec 27 // "transfer_opening_date" + bytec 28 // "transfer_opening_date" intc_0 // 0 app_global_put // modules/actus_kernel.py:72 // self.transfer_closure_date = typ.TimeStamp() - bytec 28 // "transfer_closure_date" + bytec 29 // "transfer_closure_date" intc_0 // 0 app_global_put // modules/actus_kernel.py:74-75 @@ -97,7 +97,7 @@ main: app_global_put // modules/actus_kernel.py:79 // self.reserved_units_total = UInt64() - bytec 10 // "reserved_units_total" + bytec 11 // "reserved_units_total" intc_0 // 0 app_global_put // modules/actus_kernel.py:81-82 @@ -108,7 +108,7 @@ main: app_global_put // modules/actus_kernel.py:83 // self.outstanding_principal = UInt64() - bytec_3 // "outstanding_principal" + bytec 4 // "outstanding_principal" intc_0 // 0 app_global_put // modules/actus_kernel.py:84 @@ -150,12 +150,12 @@ main: app_global_put // modules/actus_kernel.py:95 // self.rate_reset_floor = UInt64() - bytec 29 // "rate_reset_floor" + bytec 30 // "rate_reset_floor" intc_0 // 0 app_global_put // modules/actus_kernel.py:96 // self.rate_reset_cap = UInt64() - bytec 30 // "rate_reset_cap" + bytec 31 // "rate_reset_cap" intc_0 // 0 app_global_put // modules/actus_kernel.py:97 @@ -176,7 +176,7 @@ main: // modules/actus_kernel.py:101-102 // # Primary Distribution // self.reserved_principal = UInt64() - bytec 11 // "reserved_principal" + bytec 12 // "reserved_principal" intc_0 // 0 app_global_put // modules/actus_kernel.py:103 @@ -202,7 +202,7 @@ main: app_global_put // modules/actus_kernel.py:116 // self.schedule_entry_count = UInt64() - bytec 4 // "schedule_entry_count" + bytec_3 // "schedule_entry_count" intc_0 // 0 app_global_put // modules/actus_kernel.py:118-119 @@ -268,13 +268,13 @@ main_switch_case_next@5: ! assert txn ApplicationID - bz main_create_NoOp@31 - pushbytess 0xb44618c8 0xe7832529 0x94388723 0x6c85e3ee 0xbdd1a944 0x7c0f1812 0x14fc10ef 0x74a7297f 0x09d4fe14 0x9a9bfa85 0x85eed33d 0xab2c0fc4 0xd9f225ac 0x8ea6e74c 0x02af557a 0x82f71b2d 0xef04f5d3 0xdf343550 0x3dbe80bd 0x1e3e48e7 0x010c8299 0x7406acd2 0x1a72a2ee // method "fund_due_cashflows(uint64)(uint64,uint64,uint64,uint64,uint64)", method "claim_due_cashflows(address,byte[])(uint64,uint64,uint64,uint64,byte[])", method "transfer_set_schedule(uint64,uint64)uint64", method "primary_distribution(address,uint64)uint64", method "transfer(address,address,uint64)uint64", method "account_suspension(address,bool)uint64", method "account_open(address,address)uint64", method "account_update_payment_address(address,address)uint64", method "account_get_position(address)(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64)", method "contract_config((uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64),(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64),(byte[32],string))uint64", method "contract_schedule(uint64,bool,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[])uint64", method "contract_execute_ied()uint64", method "apply_non_cash_event(uint64,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64", method "contract_get_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", method "contract_get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", method "rbac_rotate_arranger(address)uint64", method "rbac_set_op_daemon(address)uint64", method "rbac_assign_role(uint8,address,(uint64,uint64))uint64", method "rbac_revoke_role(uint8,address)uint64", method "rbac_contract_suspension(bool)uint64", method "rbac_get_arranger()address", method "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", method "rbac_get_role_validity(uint8,address)(uint64,uint64)" + bz main_create_NoOp@32 + pushbytess 0xb44618c8 0xe7832529 0x94388723 0x6c85e3ee 0xbdd1a944 0x7c0f1812 0x14fc10ef 0x74a7297f 0x09d4fe14 0x9a9bfa85 0x85eed33d 0xab2c0fc4 0xd9f225ac 0x9883505a 0x8ea6e74c 0x02af557a 0x82f71b2d 0xef04f5d3 0xdf343550 0x3dbe80bd 0x1e3e48e7 0x010c8299 0x7406acd2 0x1a72a2ee // method "fund_due_cashflows(uint64)(uint64,uint64,uint64,uint64,uint64)", method "claim_due_cashflows(address,byte[])(uint64,uint64,uint64,uint64,byte[])", method "transfer_set_schedule(uint64,uint64)uint64", method "primary_distribution(address,uint64)uint64", method "transfer(address,address,uint64)uint64", method "account_suspension(address,bool)uint64", method "account_open(address,address)uint64", method "account_update_payment_address(address,address)uint64", method "account_get_position(address)(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64)", method "contract_config((uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64),(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64),(byte[32],string))uint64", method "contract_schedule(uint64,bool,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[])uint64", method "contract_execute_ied()uint64", method "apply_non_cash_event(uint64,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64", method "append_observed_cash_event((uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64", method "contract_get_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", method "contract_get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", method "rbac_rotate_arranger(address)uint64", method "rbac_set_op_daemon(address)uint64", method "rbac_assign_role(uint8,address,(uint64,uint64))uint64", method "rbac_revoke_role(uint8,address)uint64", method "rbac_contract_suspension(bool)uint64", method "rbac_get_arranger()address", method "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", method "rbac_get_role_validity(uint8,address)(uint64,uint64)" txna ApplicationArgs 0 - match fund_due_cashflows claim_due_cashflows transfer_set_schedule primary_distribution transfer account_suspension account_open account_update_payment_address account_get_position contract_config contract_schedule contract_execute_ied apply_non_cash_event contract_get_state contract_get_next_due_event rbac_rotate_arranger rbac_set_op_daemon rbac_assign_role rbac_revoke_role rbac_contract_suspension rbac_get_arranger rbac_get_address_roles rbac_get_role_validity + match fund_due_cashflows claim_due_cashflows transfer_set_schedule primary_distribution transfer account_suspension account_open account_update_payment_address account_get_position contract_config contract_schedule contract_execute_ied apply_non_cash_event append_observed_cash_event contract_get_state contract_get_next_due_event rbac_rotate_arranger rbac_set_op_daemon rbac_assign_role rbac_revoke_role rbac_contract_suspension rbac_get_arranger rbac_get_address_roles rbac_get_role_validity err -main_create_NoOp@31: +main_create_NoOp@32: // smart_contracts/d_asa/contract.py:8-18 // class DASA( // PaymentAgent, @@ -304,12 +304,54 @@ main_contract_update_route@4: b contract_update +// _puya_lib.util.ensure_budget(required_budget: uint64, fee_source: uint64) -> void: +ensure_budget: + proto 2 0 + frame_dig -2 + pushint 10 + + + +ensure_budget_while_top@1: + frame_dig 0 + global OpcodeBudget + > + bz ensure_budget_after_while@6 + itxn_begin + pushint 6 // appl + itxn_field TypeEnum + pushint 5 // DeleteApplication + itxn_field OnCompletion + bytec 47 // 0x068101 + itxn_field ApprovalProgram + bytec 47 // 0x068101 + itxn_field ClearStateProgram + frame_dig -1 + switch ensure_budget_switch_case_0@3 ensure_budget_switch_case_1@4 + +ensure_budget_switch_case_next@5: + itxn_submit + b ensure_budget_while_top@1 + +ensure_budget_switch_case_1@4: + global MinTxnFee + itxn_field Fee + b ensure_budget_switch_case_next@5 + +ensure_budget_switch_case_0@3: + intc_0 // 0 + itxn_field Fee + b ensure_budget_switch_case_next@5 + +ensure_budget_after_while@6: + retsub + + // modules.payment_agent.PaymentAgent.fund_due_cashflows[routing]() -> void: fund_due_cashflows: intc_0 // 0 pushbytes "" - dupn 10 - // modules/payment_agent.py:46 + dupn 13 + // modules/payment_agent.py:47 // @arc4.abimethod txna ApplicationArgs 1 dup @@ -325,13 +367,13 @@ fund_due_cashflows: app_global_get_ex assert // check self.status exists assert // D-ASA not configured - // modules/payment_agent.py:50 + // modules/payment_agent.py:51 // self._assert_caller_is_arranger() callsub _assert_caller_is_arranger - // modules/payment_agent.py:51 + // modules/payment_agent.py:52 // self._assert_is_not_asset_defaulted() callsub _assert_is_not_asset_defaulted - // modules/payment_agent.py:52 + // modules/payment_agent.py:53 // self._assert_is_not_asset_suspended() callsub _assert_is_not_asset_suspended // modules/actus_kernel.py:135 @@ -347,39 +389,79 @@ fund_due_cashflows: ! assert // IED not yet executed // modules/payment_agent.py:55 + // if self._is_dynamic_annuity(): + callsub _is_dynamic_annuity + bz fund_due_cashflows_after_if_else@3 + // modules/payment_agent.py:59-60 + // + max_event_count + // * UInt64(cst.OP_UP_FUND_DUE_CASHFLOWS_PER_EVENT_BUDGET) + dup + // modules/payment_agent.py:60 + // * UInt64(cst.OP_UP_FUND_DUE_CASHFLOWS_PER_EVENT_BUDGET) + pushint 100 + // modules/payment_agent.py:59-60 + // + max_event_count + // * UInt64(cst.OP_UP_FUND_DUE_CASHFLOWS_PER_EVENT_BUDGET) + * + // modules/payment_agent.py:58 + // UInt64(cst.OP_UP_FUND_DUE_CASHFLOWS_BASE_BUDGET) + intc 4 // 1500 + // modules/payment_agent.py:58-60 + // UInt64(cst.OP_UP_FUND_DUE_CASHFLOWS_BASE_BUDGET) + // + max_event_count + // * UInt64(cst.OP_UP_FUND_DUE_CASHFLOWS_PER_EVENT_BUDGET) + + + // modules/payment_agent.py:56-62 + // ensure_budget( + // required_budget=( + // UInt64(cst.OP_UP_FUND_DUE_CASHFLOWS_BASE_BUDGET) + // + max_event_count + // * UInt64(cst.OP_UP_FUND_DUE_CASHFLOWS_PER_EVENT_BUDGET) + // ), + // ) + intc_0 // 0 + callsub ensure_budget + +fund_due_cashflows_after_if_else@3: + // modules/payment_agent.py:64 // processed_events = UInt64(0) intc_0 // 0 - // modules/payment_agent.py:56-57 + bury 5 + // modules/payment_agent.py:65 // funded_interest = UInt64(0) + intc_0 // 0 + bury 14 + // modules/payment_agent.py:66 // funded_principal = UInt64(0) - dupn 2 + intc_0 // 0 + bury 13 -fund_due_cashflows_while_top@2: - // modules/payment_agent.py:60 +fund_due_cashflows_while_top@4: + // modules/payment_agent.py:69 // processed_events < max_event_count - dig 2 dig 4 + dig 1 < - // modules/payment_agent.py:60-61 + // modules/payment_agent.py:69-70 // processed_events < max_event_count // and self.event_cursor < self.schedule_entry_count - bz fund_due_cashflows_after_while@9 - // modules/payment_agent.py:61 + bz fund_due_cashflows_after_while@11 + // modules/payment_agent.py:70 // and self.event_cursor < self.schedule_entry_count intc_0 // 0 bytec_2 // "event_cursor" app_global_get_ex assert // check self.event_cursor exists intc_0 // 0 - bytec 4 // "schedule_entry_count" + bytec_3 // "schedule_entry_count" app_global_get_ex assert // check self.schedule_entry_count exists < - // modules/payment_agent.py:60-61 + // modules/payment_agent.py:69-70 // processed_events < max_event_count // and self.event_cursor < self.schedule_entry_count - bz fund_due_cashflows_after_while@9 - // modules/payment_agent.py:63 + bz fund_due_cashflows_after_while@11 + // modules/payment_agent.py:72 // entry = self._get_schedule_entry(self.event_cursor) intc_0 // 0 bytec_2 // "event_cursor" @@ -388,16 +470,16 @@ fund_due_cashflows_while_top@2: callsub _get_schedule_entry dup bury 17 - // modules/payment_agent.py:64 + // modules/payment_agent.py:73 // if entry.scheduled_time > Global.latest_timestamp: pushint 9 extract_uint64 dup - bury 6 + bury 3 global LatestTimestamp > - bnz fund_due_cashflows_after_while@9 - // modules/payment_agent.py:66 + bnz fund_due_cashflows_after_while@11 + // modules/payment_agent.py:75 // if not self._event_is_cash(entry.event_type.as_uint64()): dig 15 intc_2 // 8 @@ -415,8 +497,8 @@ fund_due_cashflows_while_top@2: // ) == dup - bury 7 - bnz fund_due_cashflows_bool_true@50 + bury 4 + bnz fund_due_cashflows_bool_true@52 dig 14 // modules/actus_kernel.py:352 // UInt64(enums.EVT_PR), @@ -428,7 +510,7 @@ fund_due_cashflows_while_top@2: // UInt64(enums.EVT_MD), // ) == - bnz fund_due_cashflows_bool_true@50 + bnz fund_due_cashflows_bool_true@52 dig 14 // modules/actus_kernel.py:353 // UInt64(enums.EVT_MD), @@ -440,15 +522,15 @@ fund_due_cashflows_while_top@2: // UInt64(enums.EVT_MD), // ) == - bz fund_due_cashflows_bool_false@51 + bz fund_due_cashflows_bool_false@53 -fund_due_cashflows_bool_true@50: +fund_due_cashflows_bool_true@52: intc_1 // 1 -fund_due_cashflows_bool_merge@52: - // modules/payment_agent.py:66 +fund_due_cashflows_bool_merge@54: + // modules/payment_agent.py:75 // if not self._event_is_cash(entry.event_type.as_uint64()): - bz fund_due_cashflows_after_while@9 + bz fund_due_cashflows_after_while@11 // modules/actus_kernel.py:548 // assert entry.event_id == self.event_cursor, err.INVALID_EVENT_CURSOR dig 15 @@ -462,24 +544,24 @@ fund_due_cashflows_bool_merge@52: assert // Invalid event cursor // modules/actus_kernel.py:549 // assert entry.scheduled_time <= Global.latest_timestamp, err.NO_DUE_CASHFLOW - dig 4 + dig 1 global LatestTimestamp <= assert // No due cashflow to pay // modules/actus_kernel.py:413 // if event_type not in (UInt64(enums.EVT_IP), UInt64(enums.EVT_MD)): - dig 5 - bnz fund_due_cashflows_after_if_else@13 + dig 2 + bnz fund_due_cashflows_after_if_else@15 dig 14 pushint 19 == - bnz fund_due_cashflows_after_if_else@13 + bnz fund_due_cashflows_after_if_else@15 // modules/actus_kernel.py:414 // return UInt64(0) intc_0 // 0 - bury 13 + bury 11 -fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_interest_amount@14: +fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_interest_amount@16: // modules/actus_kernel.py:426 // event_type = entry.event_type.as_uint64() dig 15 @@ -491,40 +573,40 @@ fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_i // if event_type not in (UInt64(enums.EVT_PR), UInt64(enums.EVT_MD)): pushint 3 == - bnz fund_due_cashflows_after_if_else@17 + bnz fund_due_cashflows_after_if_else@19 dig 14 pushint 19 == - bnz fund_due_cashflows_after_if_else@17 + bnz fund_due_cashflows_after_if_else@19 // modules/actus_kernel.py:428 // return UInt64(0) intc_0 // 0 - bury 8 + bury 6 -fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@26: +fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@28: // modules/actus_kernel.py:553 // next_outstanding_principal = entry.next_outstanding_principal dig 15 pushint 49 extract_uint64 - bury 10 + bury 8 // modules/actus_kernel.py:556 // if self._is_dynamic_annuity(): callsub _is_dynamic_annuity - bnz fund_due_cashflows_if_body@27 - dig 9 - bury 11 + bnz fund_due_cashflows_if_body@29 + dig 7 + bury 9 -fund_due_cashflows_after_if_else@36: +fund_due_cashflows_after_if_else@38: // modules/actus_kernel.py:572-574 // # Funding uses per-unit cumulative indices so each holder can settle // # independently from its current unit balance. // interest_index_delta = self._amount_to_index_delta(interest_amount_due) - dig 12 + dig 10 callsub _amount_to_index_delta // modules/actus_kernel.py:575 // principal_index_delta = self._amount_to_index_delta(principal_amount_due) - dig 8 + dig 6 callsub _amount_to_index_delta // modules/actus_kernel.py:576 // interest_amount = self._index_delta_to_amount(interest_index_delta) @@ -532,21 +614,21 @@ fund_due_cashflows_after_if_else@36: callsub _index_delta_to_amount dup cover 2 - bury 17 + bury 15 // modules/actus_kernel.py:577 // principal_amount = self._index_delta_to_amount(principal_index_delta) dup callsub _index_delta_to_amount dup - bury 13 + bury 11 // modules/actus_kernel.py:578 // required_amount = interest_amount + principal_amount dig 2 dig 1 + dup - bury 12 - // modules/actus_kernel.py:727 + bury 9 + // modules/actus_kernel.py:736 // balance = self.settlement_asset_id.balance(Global.current_application_address) global CurrentApplicationAddress intc_0 // 0 @@ -562,18 +644,18 @@ fund_due_cashflows_after_if_else@36: app_global_get_ex assert // check self.reserved_interest exists intc_0 // 0 - bytec 11 // "reserved_principal" + bytec 12 // "reserved_principal" app_global_get_ex assert // check self.reserved_principal exists dig 1 + - // modules/actus_kernel.py:729 + // modules/actus_kernel.py:738 // assert balance >= reserved_total, err.NOT_ENOUGH_FUNDS dig 2 dig 1 >= assert // Not enough funds for the payment - // modules/actus_kernel.py:730 + // modules/actus_kernel.py:739 // return balance - reserved_total uncover 2 swap @@ -597,11 +679,11 @@ fund_due_cashflows_after_if_else@36: // modules/actus_kernel.py:584 // self.reserved_principal += principal_amount intc_0 // 0 - bytec 11 // "reserved_principal" + bytec 12 // "reserved_principal" app_global_get_ex assert // check self.reserved_principal exists + - bytec 11 // "reserved_principal" + bytec 12 // "reserved_principal" swap app_global_put // modules/actus_kernel.py:585 @@ -632,7 +714,7 @@ fund_due_cashflows_after_if_else@36: getbyte pushint 3 == - bz fund_due_cashflows_else_body@38 + bz fund_due_cashflows_else_body@40 // modules/actus_kernel.py:588-589 // # For PR, the period interest stays accrued until a later IP or MD. // self.accrued_interest += self._entry_interest_segment(entry) @@ -648,11 +730,11 @@ fund_due_cashflows_after_if_else@36: swap app_global_put -fund_due_cashflows_after_if_else@39: +fund_due_cashflows_after_if_else@41: // modules/actus_kernel.py:592 // if not self._is_dynamic_annuity() or entry.event_type.as_uint64() == UInt64( callsub _is_dynamic_annuity - bz fund_due_cashflows_if_body@41 + bz fund_due_cashflows_if_body@43 dig 15 intc_2 // 8 getbyte @@ -662,9 +744,9 @@ fund_due_cashflows_after_if_else@39: // ): pushint 19 == - bz fund_due_cashflows_after_if_else@42 + bz fund_due_cashflows_after_if_else@44 -fund_due_cashflows_if_body@41: +fund_due_cashflows_if_body@43: // modules/actus_kernel.py:595 // self.next_principal_redemption = entry.next_principal_redemption dig 15 @@ -674,16 +756,16 @@ fund_due_cashflows_if_body@41: swap app_global_put -fund_due_cashflows_after_if_else@42: +fund_due_cashflows_after_if_else@44: // modules/actus_kernel.py:596 // self.outstanding_principal = next_outstanding_principal - bytec_3 // "outstanding_principal" - dig 10 + bytec 4 // "outstanding_principal" + dig 8 app_global_put // modules/actus_kernel.py:597 // self.interest_calculation_base = next_interest_base bytec 7 // "interest_calculation_base" - dig 11 + dig 9 app_global_put // modules/actus_kernel.py:598 // self.event_cursor += UInt64(1) @@ -706,18 +788,18 @@ fund_due_cashflows_after_if_else@42: // ) and self.outstanding_principal == UInt64(0): pushbytes 0x13 b== - bz fund_due_cashflows_after_if_else@45 + bz fund_due_cashflows_after_if_else@47 // modules/actus_kernel.py:602 // ) and self.outstanding_principal == UInt64(0): intc_0 // 0 - bytec_3 // "outstanding_principal" + bytec 4 // "outstanding_principal" app_global_get_ex assert // check self.outstanding_principal exists // modules/actus_kernel.py:600-602 // if entry.event_type == arc4.UInt8( // enums.EVT_MD // ) and self.outstanding_principal == UInt64(0): - bnz fund_due_cashflows_after_if_else@45 + bnz fund_due_cashflows_after_if_else@47 // modules/actus_kernel.py:603 // self.status = UInt64(enums.STATUS_ENDED) bytec_1 // "status" @@ -729,7 +811,7 @@ fund_due_cashflows_after_if_else@42: intc_0 // 0 app_global_put -fund_due_cashflows_after_if_else@45: +fund_due_cashflows_after_if_else@47: // modules/actus_kernel.py:606-610 // self._emit_execution_event( // entry=entry, @@ -737,39 +819,39 @@ fund_due_cashflows_after_if_else@45: // settled_amount=interest_amount + principal_amount, // ) dig 15 - dig 7 + dig 4 dup callsub _emit_execution_event pop - // modules/payment_agent.py:70 + // modules/payment_agent.py:79 // funded_interest += interest_amount - dig 1 - dig 14 + dig 13 + dig 12 + - bury 2 - // modules/payment_agent.py:71 + bury 14 + // modules/payment_agent.py:80 // funded_principal += principal_amount - dup - dig 9 + dig 12 + dig 7 + - bury 1 - // modules/payment_agent.py:72 + bury 13 + // modules/payment_agent.py:81 // processed_events += UInt64(1) - dig 2 + dig 4 intc_1 // 1 + - bury 3 - b fund_due_cashflows_while_top@2 + bury 5 + b fund_due_cashflows_while_top@4 -fund_due_cashflows_else_body@38: +fund_due_cashflows_else_body@40: // modules/actus_kernel.py:591 // self.accrued_interest = UInt64(0) bytec 6 // "accrued_interest" intc_0 // 0 app_global_put - b fund_due_cashflows_after_if_else@39 + b fund_due_cashflows_after_if_else@41 -fund_due_cashflows_if_body@27: +fund_due_cashflows_if_body@29: // modules/actus_kernel.py:557 // event_type = entry.event_type.as_uint64() dig 15 @@ -783,34 +865,34 @@ fund_due_cashflows_if_body@27: // if event_type == UInt64(enums.EVT_PR): pushint 3 == - bz fund_due_cashflows_else_body@29 + bz fund_due_cashflows_else_body@31 // modules/actus_kernel.py:562 // self.outstanding_principal - principal_amount_due intc_0 // 0 - bytec_3 // "outstanding_principal" + bytec 4 // "outstanding_principal" app_global_get_ex assert // check self.outstanding_principal exists - dig 8 + dig 6 - dup - bury 11 - bury 11 - b fund_due_cashflows_after_if_else@36 + bury 9 + bury 9 + b fund_due_cashflows_after_if_else@38 -fund_due_cashflows_else_body@29: +fund_due_cashflows_else_body@31: // modules/actus_kernel.py:565 // elif event_type == UInt64(enums.EVT_IP): dig 14 intc_2 // 8 == - bz fund_due_cashflows_else_body@31 + bz fund_due_cashflows_else_body@33 // modules/actus_kernel.py:566 // next_outstanding_principal = self.outstanding_principal intc_0 // 0 - bytec_3 // "outstanding_principal" + bytec 4 // "outstanding_principal" app_global_get_ex swap - bury 11 + bury 9 assert // check self.outstanding_principal exists // modules/actus_kernel.py:567 // next_interest_base = self.interest_calculation_base @@ -818,55 +900,55 @@ fund_due_cashflows_else_body@29: bytec 7 // "interest_calculation_base" app_global_get_ex swap - bury 12 + bury 10 assert // check self.interest_calculation_base exists - b fund_due_cashflows_after_if_else@36 + b fund_due_cashflows_after_if_else@38 -fund_due_cashflows_else_body@31: +fund_due_cashflows_else_body@33: // modules/actus_kernel.py:568 // elif event_type == UInt64(enums.EVT_MD): dig 14 pushint 19 == - bnz fund_due_cashflows_if_body@32 - dig 9 - bury 11 - b fund_due_cashflows_after_if_else@36 + bnz fund_due_cashflows_if_body@34 + dig 7 + bury 9 + b fund_due_cashflows_after_if_else@38 -fund_due_cashflows_if_body@32: +fund_due_cashflows_if_body@34: // modules/actus_kernel.py:569 // next_outstanding_principal = UInt64(0) intc_0 // 0 - bury 10 + bury 8 // modules/actus_kernel.py:570 // next_interest_base = UInt64(0) intc_0 // 0 - bury 11 - b fund_due_cashflows_after_if_else@36 + bury 9 + b fund_due_cashflows_after_if_else@38 -fund_due_cashflows_after_if_else@17: +fund_due_cashflows_after_if_else@19: // modules/actus_kernel.py:429 // if self._is_dynamic_annuity(): callsub _is_dynamic_annuity - bz fund_due_cashflows_after_if_else@25 + bz fund_due_cashflows_after_if_else@27 // modules/actus_kernel.py:430 // if event_type == UInt64(enums.EVT_MD): dig 14 pushint 19 == - bz fund_due_cashflows_after_if_else@20 + bz fund_due_cashflows_after_if_else@22 // modules/actus_kernel.py:431 // return self.outstanding_principal intc_0 // 0 - bytec_3 // "outstanding_principal" + bytec 4 // "outstanding_principal" app_global_get_ex assert // check self.outstanding_principal exists - bury 8 + bury 6 // modules/actus_kernel.py:552 // principal_amount_due = self._entry_principal_amount(entry) - b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@26 + b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@28 -fund_due_cashflows_after_if_else@20: +fund_due_cashflows_after_if_else@22: // modules/actus_kernel.py:432 // interest_due = self.accrued_interest + self._entry_interest_segment(entry) intc_0 // 0 @@ -878,7 +960,7 @@ fund_due_cashflows_after_if_else@20: bury 18 + dup - bury 13 + bury 11 // modules/actus_kernel.py:433 // if self.next_principal_redemption <= interest_due: intc_0 // 0 @@ -886,60 +968,60 @@ fund_due_cashflows_after_if_else@20: app_global_get_ex assert // check self.next_principal_redemption exists >= - bz fund_due_cashflows_after_if_else@22 + bz fund_due_cashflows_after_if_else@24 // modules/actus_kernel.py:434 // return UInt64(0) intc_0 // 0 - bury 8 + bury 6 // modules/actus_kernel.py:552 // principal_amount_due = self._entry_principal_amount(entry) - b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@26 + b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@28 -fund_due_cashflows_after_if_else@22: +fund_due_cashflows_after_if_else@24: // modules/actus_kernel.py:435 // principal_amount = self.next_principal_redemption - interest_due intc_0 // 0 bytec 14 // "next_principal_redemption" app_global_get_ex assert // check self.next_principal_redemption exists - dig 12 + dig 10 - dup - bury 10 + bury 8 // modules/actus_kernel.py:436 // if principal_amount > self.outstanding_principal: intc_0 // 0 - bytec_3 // "outstanding_principal" + bytec 4 // "outstanding_principal" app_global_get_ex assert // check self.outstanding_principal exists > - bz fund_due_cashflows_after_if_else@24 + bz fund_due_cashflows_after_if_else@26 // modules/actus_kernel.py:437 // return self.outstanding_principal intc_0 // 0 - bytec_3 // "outstanding_principal" + bytec 4 // "outstanding_principal" app_global_get_ex assert // check self.outstanding_principal exists - bury 8 + bury 6 // modules/actus_kernel.py:552 // principal_amount_due = self._entry_principal_amount(entry) - b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@26 + b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@28 -fund_due_cashflows_after_if_else@24: - dig 8 - bury 8 +fund_due_cashflows_after_if_else@26: + dig 6 + bury 6 // modules/actus_kernel.py:552 // principal_amount_due = self._entry_principal_amount(entry) - b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@26 + b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@28 -fund_due_cashflows_after_if_else@25: +fund_due_cashflows_after_if_else@27: // modules/actus_kernel.py:440 // entry.next_outstanding_principal <= self.outstanding_principal dig 15 pushint 49 extract_uint64 intc_0 // 0 - bytec_3 // "outstanding_principal" + bytec 4 // "outstanding_principal" app_global_get_ex assert // check self.outstanding_principal exists dup2 @@ -953,12 +1035,12 @@ fund_due_cashflows_after_if_else@25: // return self.outstanding_principal - entry.next_outstanding_principal swap - - bury 8 + bury 6 // modules/actus_kernel.py:552 // principal_amount_due = self._entry_principal_amount(entry) - b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@26 + b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@28 -fund_due_cashflows_after_if_else@13: +fund_due_cashflows_after_if_else@15: // modules/actus_kernel.py:415 // return self.accrued_interest + self._entry_interest_segment(entry) intc_0 // 0 @@ -969,29 +1051,29 @@ fund_due_cashflows_after_if_else@13: callsub _entry_interest_segment bury 18 + - bury 13 + bury 11 // modules/actus_kernel.py:551 // interest_amount_due = self._entry_interest_amount(entry) - b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_interest_amount@14 + b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_interest_amount@16 -fund_due_cashflows_after_while@9: - // modules/payment_agent.py:74 +fund_due_cashflows_after_while@11: + // modules/payment_agent.py:83 // assert processed_events > UInt64(0), err.NO_DUE_CASHFLOW - dig 2 + dig 4 dup assert // No due cashflow to pay - // modules/payment_agent.py:78 + // modules/payment_agent.py:87 // total_funded=funded_interest + funded_principal, - dig 2 + dig 14 dup - dig 3 + dig 15 dup cover 3 + - // modules/payment_agent.py:80 + // modules/payment_agent.py:89 // timestamp=Global.latest_timestamp, global LatestTimestamp - // modules/payment_agent.py:75-81 + // modules/payment_agent.py:84-90 // return typ.CashFundingResult( // funded_interest=funded_interest, // funded_principal=funded_principal, @@ -1013,7 +1095,7 @@ fund_due_cashflows_after_while@9: swap itob concat - // modules/payment_agent.py:46 + // modules/payment_agent.py:47 // @arc4.abimethod bytec_0 // 0x151f7c75 swap @@ -1022,16 +1104,16 @@ fund_due_cashflows_after_while@9: intc_1 // 1 return -fund_due_cashflows_bool_false@51: +fund_due_cashflows_bool_false@53: intc_0 // 0 - b fund_due_cashflows_bool_merge@52 + b fund_due_cashflows_bool_merge@54 // modules.payment_agent.PaymentAgent.claim_due_cashflows[routing]() -> void: claim_due_cashflows: pushbytes "" dupn 2 - // modules/payment_agent.py:83 + // modules/payment_agent.py:92 // @arc4.abimethod txna ApplicationArgs 1 dupn 2 @@ -1067,39 +1149,39 @@ claim_due_cashflows: box_len bury 1 assert // Invalid account holding address - // modules/payment_agent.py:14 + // modules/payment_agent.py:15 // if self.op_daemon.value != Global.zero_address: intc_0 // 0 - bytec 25 // 0x52234f704461656d6f6e23 + bytec 26 // 0x52234f704461656d6f6e23 app_global_get_ex assert // check self.op_daemon exists global ZeroAddress != bz claim_due_cashflows_after_if_else@17 - // modules/payment_agent.py:16 + // modules/payment_agent.py:17 // Txn.sender == self.op_daemon.value txn Sender intc_0 // 0 - bytec 25 // 0x52234f704461656d6f6e23 + bytec 26 // 0x52234f704461656d6f6e23 app_global_get_ex assert // check self.op_daemon exists == - // modules/payment_agent.py:16-18 + // modules/payment_agent.py:17-19 // Txn.sender == self.op_daemon.value // or Txn.sender == holding_address // or Txn.sender == self.account[holding_address].payment_address bnz claim_due_cashflows_bool_true@14 - // modules/payment_agent.py:17 + // modules/payment_agent.py:18 // or Txn.sender == holding_address txn Sender dig 3 == - // modules/payment_agent.py:16-18 + // modules/payment_agent.py:17-19 // Txn.sender == self.op_daemon.value // or Txn.sender == holding_address // or Txn.sender == self.account[holding_address].payment_address bnz claim_due_cashflows_bool_true@14 - // modules/payment_agent.py:18 + // modules/payment_agent.py:19 // or Txn.sender == self.account[holding_address].payment_address txn Sender dig 1 @@ -1107,7 +1189,7 @@ claim_due_cashflows: assert // check self.account entry exists extract 0 32 == - // modules/payment_agent.py:16-18 + // modules/payment_agent.py:17-19 // Txn.sender == self.op_daemon.value // or Txn.sender == holding_address // or Txn.sender == self.account[holding_address].payment_address @@ -1117,7 +1199,7 @@ claim_due_cashflows_bool_true@14: intc_1 // 1 claim_due_cashflows_bool_merge@16: - // modules/payment_agent.py:15-19 + // modules/payment_agent.py:16-20 // assert ( // Txn.sender == self.op_daemon.value // or Txn.sender == holding_address @@ -1126,10 +1208,10 @@ claim_due_cashflows_bool_merge@16: assert // Not authorized claim_due_cashflows_after_if_else@17: - // modules/payment_agent.py:94 + // modules/payment_agent.py:103 // self._assert_is_not_asset_defaulted() callsub _assert_is_not_asset_defaulted - // modules/payment_agent.py:95 + // modules/payment_agent.py:104 // self._assert_is_not_asset_suspended() callsub _assert_is_not_asset_suspended // modules/actus_kernel.py:135 @@ -1144,12 +1226,12 @@ claim_due_cashflows_after_if_else@17: // assert not self._status_is_pending_ied(), err.PENDING_IED ! assert // IED not yet executed - // modules/payment_agent.py:98 + // modules/payment_agent.py:107 // self._ensure_units_activated(holding_address) dig 2 dup callsub _ensure_units_activated - // modules/payment_agent.py:99 + // modules/payment_agent.py:108 // self._settle_position(holding_address) callsub _settle_position popn 2 @@ -1178,31 +1260,31 @@ claim_due_cashflows_after_if_else@17: + dup bury 6 - // modules/payment_agent.py:101 + // modules/payment_agent.py:110 // assert total_amount > UInt64(0), err.NO_DUE_CASHFLOW assert // No due cashflow to pay - // modules/payment_agent.py:24 + // modules/payment_agent.py:25 // self.account[holding_address].payment_address.is_opted_in( extract 0 32 - // modules/payment_agent.py:25 + // modules/payment_agent.py:26 // self.settlement_asset_id intc_0 // 0 bytec 19 // "settlement_asset_id" app_global_get_ex assert // check self.settlement_asset_id exists - // modules/payment_agent.py:24-26 + // modules/payment_agent.py:25-27 // self.account[holding_address].payment_address.is_opted_in( // self.settlement_asset_id // ) asset_holding_get AssetBalance bury 1 - // modules/payment_agent.py:24-27 + // modules/payment_agent.py:25-28 // self.account[holding_address].payment_address.is_opted_in( // self.settlement_asset_id // ) // and not self.account[holding_address].suspended bz claim_due_cashflows_bool_false@24 - // modules/payment_agent.py:27 + // modules/payment_agent.py:28 // and not self.account[holding_address].suspended dup box_get @@ -1213,10 +1295,10 @@ claim_due_cashflows_after_if_else@17: intc_1 // 1 claim_due_cashflows_bool_merge@25: - // modules/payment_agent.py:106 + // modules/payment_agent.py:115 // if self._is_payment_executable(holding_address): bz claim_due_cashflows_after_if_else@3 - // modules/payment_agent.py:33 + // modules/payment_agent.py:34 // self.settlement_asset_id.balance(Global.current_application_address) global CurrentApplicationAddress intc_0 // 0 @@ -1227,20 +1309,20 @@ claim_due_cashflows_bool_merge@25: dig 1 asset_holding_get AssetBalance assert // account opted into asset - // modules/payment_agent.py:33-34 + // modules/payment_agent.py:34-35 // self.settlement_asset_id.balance(Global.current_application_address) // >= payment_amount dig 5 dup cover 2 >= - // modules/payment_agent.py:32-35 + // modules/payment_agent.py:33-36 // assert ( // self.settlement_asset_id.balance(Global.current_application_address) // >= payment_amount // ), err.NOT_ENOUGH_FUNDS assert // Not enough funds for the payment - // modules/payment_agent.py:108 + // modules/payment_agent.py:117 // self._pay(self.account[holding_address].payment_address, total_amount) dig 2 dup @@ -1249,7 +1331,7 @@ claim_due_cashflows_bool_merge@25: assert // check self.account entry exists dup extract 0 32 - // modules/payment_agent.py:39-44 + // modules/payment_agent.py:40-45 // itxn.AssetTransfer( // xfer_asset=self.settlement_asset_id, // asset_receiver=receiver, @@ -1257,7 +1339,7 @@ claim_due_cashflows_bool_merge@25: // fee=Global.min_txn_fee, // ).submit() itxn_begin - // modules/payment_agent.py:43 + // modules/payment_agent.py:44 // fee=Global.min_txn_fee, global MinTxnFee uncover 3 @@ -1266,12 +1348,12 @@ claim_due_cashflows_bool_merge@25: itxn_field AssetReceiver uncover 2 itxn_field XferAsset - // modules/payment_agent.py:39 + // modules/payment_agent.py:40 // itxn.AssetTransfer( pushint 4 // axfer itxn_field TypeEnum itxn_field Fee - // modules/payment_agent.py:39-44 + // modules/payment_agent.py:40-45 // itxn.AssetTransfer( // xfer_asset=self.settlement_asset_id, // asset_receiver=receiver, @@ -1326,7 +1408,7 @@ claim_due_cashflows_bool_merge@25: // modules/accounting.py:135 // assert self.reserved_principal >= principal_amount, err.NOT_ENOUGH_FUNDS intc_0 // 0 - bytec 11 // "reserved_principal" + bytec 12 // "reserved_principal" app_global_get_ex assert // check self.reserved_principal exists dig 3 @@ -1343,17 +1425,17 @@ claim_due_cashflows_bool_merge@25: // modules/accounting.py:139 // self.reserved_principal -= principal_amount intc_0 // 0 - bytec 11 // "reserved_principal" + bytec 12 // "reserved_principal" app_global_get_ex assert // check self.reserved_principal exists swap - - bytec 11 // "reserved_principal" + bytec 12 // "reserved_principal" swap app_global_put claim_due_cashflows_after_if_else@3: - // modules/payment_agent.py:114 + // modules/payment_agent.py:123 // total_amount=interest_amount + principal_amount, dig 5 dup @@ -1361,10 +1443,10 @@ claim_due_cashflows_after_if_else@3: dup cover 3 + - // modules/payment_agent.py:115 + // modules/payment_agent.py:124 // timestamp=Global.latest_timestamp, global LatestTimestamp - // modules/payment_agent.py:111-117 + // modules/payment_agent.py:120-126 // return typ.CashClaimResult( // interest_amount=interest_amount, // principal_amount=principal_amount, @@ -1395,7 +1477,7 @@ claim_due_cashflows_after_if_else@3: concat swap concat - // modules/payment_agent.py:83 + // modules/payment_agent.py:92 // @arc4.abimethod bytec_0 // 0x151f7c75 swap @@ -1441,12 +1523,12 @@ transfer_set_schedule: assert // Time events must be sorted in strictly ascending order // modules/transfer_agent.py:29 // self.transfer_opening_date = open_date - bytec 27 // "transfer_opening_date" + bytec 28 // "transfer_opening_date" uncover 2 app_global_put // modules/transfer_agent.py:30 // self.transfer_closure_date = closure_date - bytec 28 // "transfer_closure_date" + bytec 29 // "transfer_closure_date" swap app_global_put // modules/transfer_agent.py:31 @@ -1533,7 +1615,7 @@ primary_distribution: // modules/transfer_agent.py:50 // self.reserved_units_total + units <= self.total_units intc_0 // 0 - bytec 10 // "reserved_units_total" + bytec 11 // "reserved_units_total" app_global_get_ex assert // check self.reserved_units_total exists + @@ -1550,7 +1632,7 @@ primary_distribution: // modules/transfer_agent.py:52 // if self.initial_exchange_date: intc_0 // 0 - bytec 26 // "initial_exchange_date" + bytec 27 // "initial_exchange_date" app_global_get_ex assert // check self.initial_exchange_date exists bz primary_distribution_after_if_else@3 @@ -1558,7 +1640,7 @@ primary_distribution: // Global.latest_timestamp <= self.initial_exchange_date global LatestTimestamp intc_0 // 0 - bytec 26 // "initial_exchange_date" + bytec 27 // "initial_exchange_date" app_global_get_ex assert // check self.initial_exchange_date exists <= @@ -1587,11 +1669,11 @@ primary_distribution_after_if_else@3: // modules/transfer_agent.py:58 // self.reserved_units_total += units intc_0 // 0 - bytec 10 // "reserved_units_total" + bytec 11 // "reserved_units_total" app_global_get_ex assert // check self.reserved_units_total exists + - bytec 10 // "reserved_units_total" + bytec 11 // "reserved_units_total" dig 1 app_global_put // modules/transfer_agent.py:59 @@ -1666,14 +1748,14 @@ transfer: // modules/transfer_agent.py:13 // if self.transfer_opening_date: intc_0 // 0 - bytec 27 // "transfer_opening_date" + bytec 28 // "transfer_opening_date" app_global_get_ex assert // check self.transfer_opening_date exists bz transfer_after_if_else@3 // modules/transfer_agent.py:15 // self.transfer_opening_date <= Global.latest_timestamp intc_0 // 0 - bytec 27 // "transfer_opening_date" + bytec 28 // "transfer_opening_date" app_global_get_ex assert // check self.transfer_opening_date exists global LatestTimestamp @@ -1688,7 +1770,7 @@ transfer_after_if_else@3: // modules/transfer_agent.py:17 // if self.transfer_closure_date: intc_0 // 0 - bytec 28 // "transfer_closure_date" + bytec 29 // "transfer_closure_date" app_global_get_ex assert // check self.transfer_closure_date exists bz transfer_after_if_else@5 @@ -1696,7 +1778,7 @@ transfer_after_if_else@3: // Global.latest_timestamp < self.transfer_closure_date global LatestTimestamp intc_0 // 0 - bytec 28 // "transfer_closure_date" + bytec 29 // "transfer_closure_date" app_global_get_ex assert // check self.transfer_closure_date exists < @@ -1763,32 +1845,32 @@ transfer_after_if_else@5: extract_uint64 <= assert // Insufficient sender units to transfer - // modules/actus_kernel.py:756 + // modules/actus_kernel.py:765 // if self.event_cursor >= self.schedule_entry_count: intc_0 // 0 bytec_2 // "event_cursor" app_global_get_ex assert // check self.event_cursor exists intc_0 // 0 - bytec 4 // "schedule_entry_count" + bytec_3 // "schedule_entry_count" app_global_get_ex assert // check self.schedule_entry_count exists >= bnz transfer_after_inlined_modules.actus_kernel.ActusKernelModule._assert_no_due_event_pending@10 - // modules/actus_kernel.py:758 + // modules/actus_kernel.py:767 // next_entry = self._get_schedule_entry(self.event_cursor) intc_0 // 0 bytec_2 // "event_cursor" app_global_get_ex assert // check self.event_cursor exists callsub _get_schedule_entry - // modules/actus_kernel.py:760 + // modules/actus_kernel.py:769 // next_entry.scheduled_time > Global.latest_timestamp pushint 9 extract_uint64 global LatestTimestamp > - // modules/actus_kernel.py:759-761 + // modules/actus_kernel.py:768-770 // assert ( // next_entry.scheduled_time > Global.latest_timestamp // ), err.PENDING_ACTUS_EVENT @@ -2111,7 +2193,7 @@ account_get_position: // modules.actus_kernel.ActusKernelModule.contract_create[routing]() -> void: contract_create: - // modules/actus_kernel.py:969 + // modules/actus_kernel.py:1017 // @arc4.abimethod(create="require") txna ApplicationArgs 1 dup @@ -2119,15 +2201,15 @@ contract_create: intc_3 // 32 == assert // invalid number of bytes for arc4.static_array - // modules/actus_kernel.py:980 + // modules/actus_kernel.py:1028 // self.arranger.value = arranger bytec 18 // 0x5223417272616e67657223 swap app_global_put - // modules/actus_kernel.py:981 + // modules/actus_kernel.py:1029 // return Global.latest_timestamp global LatestTimestamp - // modules/actus_kernel.py:969 + // modules/actus_kernel.py:1017 // @arc4.abimethod(create="require") itob bytec_0 // 0x151f7c75 @@ -2142,7 +2224,7 @@ contract_create: contract_config: pushbytes "" dup - // modules/actus_kernel.py:983 + // modules/actus_kernel.py:1031 // @arc4.abimethod txna ApplicationArgs 1 dupn 2 @@ -2181,16 +2263,16 @@ contract_config: + == assert // invalid number of bytes for smart_contracts.abi_types.Prospectus - // modules/actus_kernel.py:1012 + // modules/actus_kernel.py:1060 // self._assert_caller_is_arranger() callsub _assert_caller_is_arranger - // modules/actus_kernel.py:1014-1015 + // modules/actus_kernel.py:1062-1063 // # Configure Contract // self.contract_type = terms.contract_type.as_uint64() intc_0 // 0 getbyte dup - bytec 12 // "contract_type" + bytec 10 // "contract_type" dig 1 app_global_put // modules/actus_kernel.py:218-225 @@ -2286,10 +2368,10 @@ contract_config_bool_merge@9: // modules/actus_kernel.py:229 // assert self._is_supported_contract_type(contract_type), err.INVALID_ACTUS_CONFIG assert // Invalid ACTUS configuration - // modules/actus_kernel.py:1017 + // modules/actus_kernel.py:1065 // self._store_contract_config(self.contract_type, terms, initial_state) intc_0 // 0 - bytec 12 // "contract_type" + bytec 10 // "contract_type" app_global_get_ex swap bury 2 @@ -2399,7 +2481,7 @@ contract_config_bool_merge@18: assert // Invalid ACTUS configuration contract_config_after_if_else@20: - // modules/actus_kernel.py:800 + // modules/actus_kernel.py:809 // assert self.status == UInt64(enums.STATUS_INACTIVE), err.ALREADY_CONFIGURED intc_0 // 0 bytec_1 // "status" @@ -2407,7 +2489,7 @@ contract_config_after_if_else@20: assert // check self.status exists ! assert // D-ASA already configured - // modules/actus_kernel.py:801 + // modules/actus_kernel.py:810 // assert self.initial_exchange_amount == UInt64(0), err.ALREADY_CONFIGURED intc_0 // 0 bytec 20 // "initial_exchange_amount" @@ -2415,50 +2497,50 @@ contract_config_after_if_else@20: assert // check self.initial_exchange_amount exists ! assert // D-ASA already configured - // modules/actus_kernel.py:803-804 + // modules/actus_kernel.py:812-813 // # Set Denomination Asset // self._assert_denomination_asset(terms.denomination_asset_id) dig 4 dup intc_1 // 1 extract_uint64 - // modules/actus_kernel.py:768-769 + // modules/actus_kernel.py:777-778 // # The reference implementation has on-chain denomination with ASA // _creator, exists = op.AssetParamsGet.asset_creator(denomination_asset_id) dup asset_params_get AssetCreator bury 1 - // modules/actus_kernel.py:770 + // modules/actus_kernel.py:779 // assert exists, err.INVALID_DENOMINATION assert // Denomination asset is not properly set - // modules/actus_kernel.py:773 + // modules/actus_kernel.py:782 // self.denomination_asset_id = denomination_asset_id bytec 44 // "denomination_asset_id" dig 1 app_global_put - // modules/actus_kernel.py:807-808 + // modules/actus_kernel.py:816-817 // # Set Settlement Asset // self._assert_settlement_asset(terms.settlement_asset_id) dig 1 pushint 9 extract_uint64 - // modules/actus_kernel.py:778 + // modules/actus_kernel.py:787 // settlement_asset_id == self.denomination_asset_id dup uncover 2 == - // modules/actus_kernel.py:776-779 + // modules/actus_kernel.py:785-788 // # The reference implementation settlement asset is the denomination asset // assert ( // settlement_asset_id == self.denomination_asset_id // ), err.INVALID_SETTLEMENT_ASSET assert // Different settlement asset not supported, must be equal to denomination asset - // modules/actus_kernel.py:782 + // modules/actus_kernel.py:791 // self.settlement_asset_id = settlement_asset_id bytec 19 // "settlement_asset_id" dig 1 app_global_put - // modules/actus_kernel.py:783-789 + // modules/actus_kernel.py:792-798 // # The reference implementation has on-chain settlement with ASA // itxn.AssetTransfer( // xfer_asset=self.settlement_asset_id, @@ -2467,26 +2549,26 @@ contract_config_after_if_else@20: // fee=Global.min_txn_fee, // ).submit() itxn_begin - // modules/actus_kernel.py:788 + // modules/actus_kernel.py:797 // fee=Global.min_txn_fee, global MinTxnFee - // modules/actus_kernel.py:786 + // modules/actus_kernel.py:795 // asset_receiver=Global.current_application_address, global CurrentApplicationAddress - // modules/actus_kernel.py:787 + // modules/actus_kernel.py:796 // asset_amount=0, intc_0 // 0 itxn_field AssetAmount itxn_field AssetReceiver swap itxn_field XferAsset - // modules/actus_kernel.py:783-784 + // modules/actus_kernel.py:792-793 // # The reference implementation has on-chain settlement with ASA // itxn.AssetTransfer( pushint 4 // axfer itxn_field TypeEnum itxn_field Fee - // modules/actus_kernel.py:783-789 + // modules/actus_kernel.py:792-798 // # The reference implementation has on-chain settlement with ASA // itxn.AssetTransfer( // xfer_asset=self.settlement_asset_id, @@ -2495,7 +2577,7 @@ contract_config_after_if_else@20: // fee=Global.min_txn_fee, // ).submit() itxn_submit - // modules/actus_kernel.py:811-812 + // modules/actus_kernel.py:820-821 // # Units // self.total_units = terms.total_units dup @@ -2504,27 +2586,27 @@ contract_config_after_if_else@20: bytec 13 // "total_units" swap app_global_put - // modules/actus_kernel.py:813 + // modules/actus_kernel.py:822 // self.reserved_units_total = UInt64(0) - bytec 10 // "reserved_units_total" + bytec 11 // "reserved_units_total" intc_0 // 0 app_global_put - // modules/actus_kernel.py:815-816 + // modules/actus_kernel.py:824-825 // # Day-Count Conventions // self.day_count_convention = terms.day_count_convention.as_uint64() bytec 46 // "day_count_convention" dig 8 app_global_put - // modules/actus_kernel.py:818-819 + // modules/actus_kernel.py:827-828 // # Time // self.initial_exchange_date = terms.initial_exchange_date dup pushint 41 extract_uint64 - bytec 26 // "initial_exchange_date" + bytec 27 // "initial_exchange_date" dig 1 app_global_put - // modules/actus_kernel.py:820 + // modules/actus_kernel.py:829 // self.maturity_date = terms.maturity_date dig 1 pushint 49 @@ -2532,7 +2614,7 @@ contract_config_after_if_else@20: bytec 45 // "maturity_date" dig 1 app_global_put - // modules/actus_kernel.py:821 + // modules/actus_kernel.py:830 // self.next_principal_redemption = initial_state.next_principal_redemption dig 6 dup @@ -2542,13 +2624,13 @@ contract_config_after_if_else@20: bytec 14 // "next_principal_redemption" swap app_global_put - // modules/actus_kernel.py:823-824 + // modules/actus_kernel.py:832-833 // # Principal // self.initial_exchange_amount = terms.initial_exchange_amount bytec 20 // "initial_exchange_amount" dig 10 app_global_put - // modules/actus_kernel.py:825 + // modules/actus_kernel.py:834 // self.dynamic_principal_redemption = terms.dynamic_principal_redemption dig 3 pushint 786 @@ -2556,15 +2638,15 @@ contract_config_after_if_else@20: bytec 34 // "dynamic_principal_redemption" swap app_global_put - // modules/actus_kernel.py:826 + // modules/actus_kernel.py:835 // self.outstanding_principal = initial_state.outstanding_principal dig 1 pushint 16 extract_uint64 - bytec_3 // "outstanding_principal" + bytec 4 // "outstanding_principal" swap app_global_put - // modules/actus_kernel.py:828-829 + // modules/actus_kernel.py:837-838 // # Interest // self.accrued_interest = initial_state.accrued_interest dig 1 @@ -2573,7 +2655,7 @@ contract_config_after_if_else@20: bytec 6 // "accrued_interest" swap app_global_put - // modules/actus_kernel.py:831-832 + // modules/actus_kernel.py:840-841 // # Interest Rate // self.nominal_interest_rate = initial_state.nominal_interest_rate dig 1 @@ -2582,7 +2664,7 @@ contract_config_after_if_else@20: bytec 9 // "nominal_interest_rate" swap app_global_put - // modules/actus_kernel.py:833 + // modules/actus_kernel.py:842 // self.interest_calculation_base = initial_state.interest_calculation_base dig 1 pushint 24 @@ -2590,7 +2672,7 @@ contract_config_after_if_else@20: bytec 7 // "interest_calculation_base" swap app_global_put - // modules/actus_kernel.py:834 + // modules/actus_kernel.py:843 // self.rate_reset_spread = terms.rate_reset_spread dig 3 pushint 58 @@ -2598,7 +2680,7 @@ contract_config_after_if_else@20: bytec 35 // "rate_reset_spread" swap app_global_put - // modules/actus_kernel.py:835 + // modules/actus_kernel.py:844 // self.rate_reset_multiplier = terms.rate_reset_multiplier dig 3 pushint 66 @@ -2606,23 +2688,23 @@ contract_config_after_if_else@20: bytec 36 // "rate_reset_multiplier" swap app_global_put - // modules/actus_kernel.py:836 + // modules/actus_kernel.py:845 // self.rate_reset_floor = terms.rate_reset_floor dig 3 pushint 74 extract_uint64 - bytec 29 // "rate_reset_floor" + bytec 30 // "rate_reset_floor" swap app_global_put - // modules/actus_kernel.py:837 + // modules/actus_kernel.py:846 // self.rate_reset_cap = terms.rate_reset_cap dig 3 pushint 82 extract_uint64 - bytec 30 // "rate_reset_cap" + bytec 31 // "rate_reset_cap" swap app_global_put - // modules/actus_kernel.py:838 + // modules/actus_kernel.py:847 // self.rate_reset_next = terms.rate_reset_next dig 3 pushint 90 @@ -2630,7 +2712,7 @@ contract_config_after_if_else@20: bytec 37 // "rate_reset_next" swap app_global_put - // modules/actus_kernel.py:839 + // modules/actus_kernel.py:848 // self.has_rate_reset_floor = terms.has_rate_reset_floor dig 3 pushint 784 @@ -2638,7 +2720,7 @@ contract_config_after_if_else@20: bytec 38 // "has_rate_reset_floor" swap app_global_put - // modules/actus_kernel.py:840 + // modules/actus_kernel.py:849 // self.has_rate_reset_cap = terms.has_rate_reset_cap dig 3 pushint 785 @@ -2646,7 +2728,7 @@ contract_config_after_if_else@20: bytec 39 // "has_rate_reset_cap" swap app_global_put - // modules/actus_kernel.py:842-843 + // modules/actus_kernel.py:851-852 // # Scaling // self.fixed_point_scale = terms.fixed_point_scale uncover 3 @@ -2655,7 +2737,7 @@ contract_config_after_if_else@20: bytec 5 // "fixed_point_scale" swap app_global_put - // modules/actus_kernel.py:845-846 + // modules/actus_kernel.py:854-855 // # Schedule Processing // self.event_cursor = initial_state.event_cursor dig 1 @@ -2664,7 +2746,7 @@ contract_config_after_if_else@20: bytec_2 // "event_cursor" swap app_global_put - // modules/actus_kernel.py:848-849 + // modules/actus_kernel.py:857-858 // # Per-Unit Fixed-Point Indexes // self.cumulative_interest_index = initial_state.cumulative_interest_index dig 1 @@ -2673,7 +2755,7 @@ contract_config_after_if_else@20: bytec 16 // "cumulative_interest_index" swap app_global_put - // modules/actus_kernel.py:850 + // modules/actus_kernel.py:859 // self.cumulative_principal_index = initial_state.cumulative_principal_index dig 1 pushint 64 @@ -2681,24 +2763,24 @@ contract_config_after_if_else@20: bytec 17 // "cumulative_principal_index" swap app_global_put - // modules/actus_kernel.py:852-853 + // modules/actus_kernel.py:861-862 // # Reserved Amount (for executed cashflows) // self.reserved_interest = UInt64(0) bytec 15 // "reserved_interest" intc_0 // 0 app_global_put - // modules/actus_kernel.py:854 + // modules/actus_kernel.py:863 // self.reserved_principal = UInt64(0) - bytec 11 // "reserved_principal" + bytec 12 // "reserved_principal" intc_0 // 0 app_global_put - // modules/actus_kernel.py:856 + // modules/actus_kernel.py:865 // assert terms.initial_exchange_date > Global.latest_timestamp, err.INVALID_IED dig 2 global LatestTimestamp > assert // IED must be set in the future - // modules/actus_kernel.py:857 + // modules/actus_kernel.py:866 // assert terms.initial_exchange_date > initial_state.status_date, err.INVALID_IED swap intc_0 // 0 @@ -2706,11 +2788,11 @@ contract_config_after_if_else@20: dig 2 < assert // IED must be set in the future - // modules/actus_kernel.py:858 + // modules/actus_kernel.py:867 // assert terms.initial_exchange_date < terms.maturity_date, err.INVALID_IED < assert // IED must be set in the future - // modules/actus_kernel.py:1019-1020 + // modules/actus_kernel.py:1067-1068 // # Notarize prospectus (optional) // self.prospectus_hash = prospectus.hash.bytes dig 2 @@ -2718,17 +2800,17 @@ contract_config_after_if_else@20: bytec 42 // "prospectus_hash" swap app_global_put - // modules/actus_kernel.py:1021 + // modules/actus_kernel.py:1069 // self.prospectus_url = prospectus.url dig 1 extract 2 0 bytec 43 // "prospectus_url" swap app_global_put - // modules/actus_kernel.py:1022 + // modules/actus_kernel.py:1070 // return Global.latest_timestamp global LatestTimestamp - // modules/actus_kernel.py:983 + // modules/actus_kernel.py:1031 // @arc4.abimethod itob bytec_0 // 0x151f7c75 @@ -2751,8 +2833,8 @@ contract_config_bool_false@8: contract_schedule: intc_0 // 0 pushbytes "" - dupn 3 - // modules/actus_kernel.py:1024 + dupn 2 + // modules/actus_kernel.py:1072 // @arc4.abimethod txna ApplicationArgs 1 dup @@ -2788,18 +2870,18 @@ contract_schedule: len == assert // invalid number of bytes for arc4.dynamic_array - // modules/actus_kernel.py:1039 + // modules/actus_kernel.py:1087 // self._assert_caller_is_arranger() callsub _assert_caller_is_arranger - // modules/actus_kernel.py:1042 + // modules/actus_kernel.py:1090 // contract_type=self.contract_type, intc_0 // 0 - bytec 12 // "contract_type" + bytec 10 // "contract_type" app_global_get_ex swap cover 3 assert // check self.contract_type exists - // modules/actus_kernel.py:874 + // modules/actus_kernel.py:883 // assert self.status == UInt64(enums.STATUS_INACTIVE), err.ALREADY_CONFIGURED intc_0 // 0 bytec_1 // "status" @@ -2807,7 +2889,7 @@ contract_schedule: assert // check self.status exists ! assert // D-ASA already configured - // modules/actus_kernel.py:875-877 + // modules/actus_kernel.py:884-886 // assert schedule_page.length <= UInt64( // cst.SCHEDULE_PAGE_SIZE // ), err.INVALID_SCHEDULE_PAGE @@ -2815,86 +2897,80 @@ contract_schedule: pushint 16 <= assert // Invalid schedule page - // modules/actus_kernel.py:878 + // modules/actus_kernel.py:887 // assert self.initial_exchange_amount > UInt64(0), err.TERMS_NOT_CONFIGURED intc_0 // 0 bytec 20 // "initial_exchange_amount" app_global_get_ex assert // check self.initial_exchange_amount exists assert // D-ASA terms not configured - // modules/actus_kernel.py:880 + // modules/actus_kernel.py:889 // page_cursor = schedule_page_index * UInt64(cst.SCHEDULE_PAGE_SIZE) swap pushint 16 * swap - // modules/actus_kernel.py:887 + // modules/actus_kernel.py:896 // + page_length * UInt64(cst.OP_UP_CONTRACT_CONFIG_PER_ENTRY_BUDGET) pushint 100 * - pushint 1510 + // modules/actus_kernel.py:895 + // UInt64(cst.OP_UP_CONTRACT_CONFIG_BASE_BUDGET) + intc 4 // 1500 + // modules/actus_kernel.py:895-896 + // UInt64(cst.OP_UP_CONTRACT_CONFIG_BASE_BUDGET) + // + page_length * UInt64(cst.OP_UP_CONTRACT_CONFIG_PER_ENTRY_BUDGET) + - -contract_schedule_while_top@2: - dup - global OpcodeBudget - > - bz contract_schedule_after_while@5 - itxn_begin - pushint 6 // appl - itxn_field TypeEnum - pushint 5 // DeleteApplication - itxn_field OnCompletion - bytec 47 // 0x068101 - itxn_field ApprovalProgram - bytec 47 // 0x068101 - itxn_field ClearStateProgram + // modules/actus_kernel.py:891-898 + // # Validation cost grows with page length, so configuration explicitly + // # buys extra opcode budget for larger uploads. + // ensure_budget( + // required_budget=( + // UInt64(cst.OP_UP_CONTRACT_CONFIG_BASE_BUDGET) + // + page_length * UInt64(cst.OP_UP_CONTRACT_CONFIG_PER_ENTRY_BUDGET) + // ), + // ) intc_0 // 0 - itxn_field Fee - itxn_submit - b contract_schedule_while_top@2 - -contract_schedule_after_while@5: - // modules/actus_kernel.py:890 + callsub ensure_budget + // modules/actus_kernel.py:899 // index = UInt64(0) intc_0 // 0 - bury 10 -contract_schedule_while_top@6: - // modules/actus_kernel.py:891 +contract_schedule_while_top@2: + // modules/actus_kernel.py:900 // while index < page_length: - dig 9 + dup dig 4 < - bz contract_schedule_after_while@15 - // modules/actus_kernel.py:892-893 + bz contract_schedule_after_while@11 + // modules/actus_kernel.py:901-902 // entry = schedule_page[index].copy() // entry_event_type = entry.event_type.as_uint64() dig 4 extract 2 0 dup - bury 13 - dig 10 + bury 12 + dig 1 dup cover 2 pushint 65 * pushint 65 extract3 // on error: index access is out of bounds - // modules/actus_kernel.py:893 + // modules/actus_kernel.py:902 // entry_event_type = entry.event_type.as_uint64() dup - // modules/actus_kernel.py:892-893 + // modules/actus_kernel.py:901-902 // entry = schedule_page[index].copy() // entry_event_type = entry.event_type.as_uint64() intc_2 // 8 - // modules/actus_kernel.py:893 + // modules/actus_kernel.py:902 // entry_event_type = entry.event_type.as_uint64() getbyte dup cover 2 - bury 14 - // modules/actus_kernel.py:894 + bury 13 + // modules/actus_kernel.py:903 // assert entry.event_id == page_cursor + index, err.INVALID_EVENT_ID dup intc_0 // 0 @@ -2907,14 +2983,14 @@ contract_schedule_while_top@6: dig 1 == assert // Invalid event id - // modules/actus_kernel.py:895-897 + // modules/actus_kernel.py:904-906 // self._assert_event_allowed_for_contract_type( // contract_type, entry_event_type // ) dig 5 uncover 3 callsub _assert_event_allowed_for_contract_type - // modules/actus_kernel.py:898 + // modules/actus_kernel.py:907 // assert entry.scheduled_time > UInt64(0), err.INVALID_ACTUS_CONFIG swap pushint 9 @@ -2922,88 +2998,88 @@ contract_schedule_while_top@6: dup bury 10 assert // Invalid ACTUS configuration - // modules/actus_kernel.py:899 + // modules/actus_kernel.py:908 // if entry.event_id > UInt64(0): - bz contract_schedule_after_if_else@12 - // modules/actus_kernel.py:900 + bz contract_schedule_after_if_else@8 + // modules/actus_kernel.py:909 // if index > UInt64(0): - dig 9 - bz contract_schedule_else_body@10 - // modules/actus_kernel.py:901 + dup + bz contract_schedule_else_body@6 + // modules/actus_kernel.py:910 // previous_entry = schedule_page[index - UInt64(1)].copy() - dig 9 + dup intc_1 // 1 - pushint 65 * - dig 12 + dig 11 swap pushint 65 extract3 // on error: index access is out of bounds -contract_schedule_after_if_else@11: - // modules/actus_kernel.py:916 +contract_schedule_after_if_else@7: + // modules/actus_kernel.py:925 // previous_entry.scheduled_time <= entry.scheduled_time pushint 9 extract_uint64 dig 8 <= - // modules/actus_kernel.py:915-917 + // modules/actus_kernel.py:924-926 // assert ( // previous_entry.scheduled_time <= entry.scheduled_time // ), err.INVALID_SORTING assert // Time events must be sorted in strictly ascending order -contract_schedule_after_if_else@12: - // modules/actus_kernel.py:918 +contract_schedule_after_if_else@8: + // modules/actus_kernel.py:927 // if entry.event_id == UInt64(0): dig 8 - bnz contract_schedule_after_if_else@14 - // modules/actus_kernel.py:919-921 + bnz contract_schedule_after_if_else@10 + // modules/actus_kernel.py:928-930 // assert entry_event_type == UInt64( // enums.EVT_IED // ), err.INVALID_ACTUS_CONFIG - dig 10 + dig 9 intc_1 // 1 == assert // Invalid ACTUS configuration -contract_schedule_after_if_else@14: - // modules/actus_kernel.py:922 +contract_schedule_after_if_else@10: + // modules/actus_kernel.py:931 // index += UInt64(1) - dig 9 + dup intc_1 // 1 + - bury 10 - b contract_schedule_while_top@6 + bury 1 + b contract_schedule_while_top@2 -contract_schedule_else_body@10: - // modules/actus_kernel.py:903-905 +contract_schedule_else_body@6: + // modules/actus_kernel.py:912-914 // # The first entry of a page must still be ordered after the // # last entry of the previous page. // assert schedule_page_index > UInt64(0), err.INVALID_EVENT_ID dig 6 dup assert // Invalid event id - // modules/actus_kernel.py:906 + // modules/actus_kernel.py:915 // previous_page_index = schedule_page_index - UInt64(1) intc_1 // 1 - - // modules/actus_kernel.py:908 + // modules/actus_kernel.py:917 // previous_page_index in self.schedule_page itob - bytec 31 // 0x5323 + bytec 24 // 0x5323 swap concat dup box_len bury 1 - // modules/actus_kernel.py:907-909 + // modules/actus_kernel.py:916-918 // assert ( // previous_page_index in self.schedule_page // ), err.INVALID_SCHEDULE_PAGE assert // Invalid schedule page - // modules/actus_kernel.py:910-911 + // modules/actus_kernel.py:919-920 // previous_page = self.schedule_page[previous_page_index].copy() // assert previous_page.length > UInt64(0), err.INVALID_SCHEDULE_PAGE dup @@ -3011,15 +3087,15 @@ contract_schedule_else_body@10: pushint 2 box_extract btoi - // modules/actus_kernel.py:911 + // modules/actus_kernel.py:920 // assert previous_page.length > UInt64(0), err.INVALID_SCHEDULE_PAGE dup assert // Invalid schedule page - // modules/actus_kernel.py:913 + // modules/actus_kernel.py:922 // previous_page.length - UInt64(1) intc_1 // 1 - - // modules/actus_kernel.py:912-914 + // modules/actus_kernel.py:921-923 // previous_entry = previous_page[ // previous_page.length - UInt64(1) // ].copy() @@ -3029,14 +3105,14 @@ contract_schedule_else_body@10: + pushint 65 box_extract - b contract_schedule_after_if_else@11 + b contract_schedule_after_if_else@7 -contract_schedule_after_while@15: +contract_schedule_after_while@11: // modules/actus_kernel.py:200 // self.schedule_page[page_index] = schedule_page.copy() dig 6 itob - bytec 31 // 0x5323 + bytec 24 // 0x5323 swap concat dup @@ -3044,35 +3120,35 @@ contract_schedule_after_while@15: pop dig 5 box_put - // modules/actus_kernel.py:925 + // modules/actus_kernel.py:934 // if is_last_page: dig 5 - bz contract_schedule_after_if_else@17 - // modules/actus_kernel.py:927 + bz contract_schedule_after_if_else@13 + // modules/actus_kernel.py:936 // schedule_page_index * UInt64(cst.SCHEDULE_PAGE_SIZE) + page_length dig 1 dig 4 + - // modules/actus_kernel.py:926 + // modules/actus_kernel.py:935 // self.schedule_entry_count = ( - bytec 4 // "schedule_entry_count" - // modules/actus_kernel.py:926-928 + bytec_3 // "schedule_entry_count" + // modules/actus_kernel.py:935-937 // self.schedule_entry_count = ( // schedule_page_index * UInt64(cst.SCHEDULE_PAGE_SIZE) + page_length // ) swap app_global_put - // modules/actus_kernel.py:929 + // modules/actus_kernel.py:938 // self.status = UInt64(enums.STATUS_PENDING_IED) bytec_1 // "status" pushint 50 app_global_put -contract_schedule_after_if_else@17: - // modules/actus_kernel.py:1047 +contract_schedule_after_if_else@13: + // modules/actus_kernel.py:1095 // return Global.latest_timestamp global LatestTimestamp - // modules/actus_kernel.py:1024 + // modules/actus_kernel.py:1072 // @arc4.abimethod itob bytec_0 // 0x151f7c75 @@ -3092,32 +3168,32 @@ contract_execute_ied: app_global_get_ex assert // check self.status exists assert // D-ASA not configured - // modules/actus_kernel.py:1057 + // modules/actus_kernel.py:1105 // self._assert_caller_is_arranger() callsub _assert_caller_is_arranger - // modules/actus_kernel.py:1058 + // modules/actus_kernel.py:1106 // self._assert_is_not_asset_defaulted() callsub _assert_is_not_asset_defaulted - // modules/actus_kernel.py:1059 + // modules/actus_kernel.py:1107 // self._assert_is_not_asset_suspended() callsub _assert_is_not_asset_suspended - // modules/actus_kernel.py:1061 + // modules/actus_kernel.py:1109 // assert self.event_cursor < self.schedule_entry_count, err.INVALID_EVENT_CURSOR intc_0 // 0 bytec_2 // "event_cursor" app_global_get_ex assert // check self.event_cursor exists intc_0 // 0 - bytec 4 // "schedule_entry_count" + bytec_3 // "schedule_entry_count" app_global_get_ex assert // check self.schedule_entry_count exists dig 1 > assert // Invalid event cursor - // modules/actus_kernel.py:1062 + // modules/actus_kernel.py:1110 // entry = self._get_schedule_entry(self.event_cursor) callsub _get_schedule_entry - // modules/actus_kernel.py:1063 + // modules/actus_kernel.py:1111 // assert entry.event_type == arc4.UInt8(enums.EVT_IED), err.INVALID_EVENT_TYPE dup extract 8 1 @@ -3125,39 +3201,39 @@ contract_execute_ied: pushbytes 0x01 b== assert // Invalid event type - // modules/actus_kernel.py:1067 + // modules/actus_kernel.py:1115 // event_id=entry.event_id, dig 1 extract 0 8 - // modules/actus_kernel.py:1069 + // modules/actus_kernel.py:1117 // scheduled_time=entry.scheduled_time, dig 2 extract 9 8 - // modules/actus_kernel.py:1070 + // modules/actus_kernel.py:1118 // accrual_factor=entry.accrual_factor, dig 3 extract 17 8 - // modules/actus_kernel.py:1071 + // modules/actus_kernel.py:1119 // redemption_accrual_factor=entry.redemption_accrual_factor, dig 4 extract 25 8 - // modules/actus_kernel.py:1073 + // modules/actus_kernel.py:1121 // next_nominal_interest_rate=entry.next_nominal_interest_rate, dig 5 extract 33 8 - // modules/actus_kernel.py:1074 + // modules/actus_kernel.py:1122 // next_principal_redemption=entry.next_principal_redemption, dig 6 extract 41 8 - // modules/actus_kernel.py:1075 + // modules/actus_kernel.py:1123 // next_outstanding_principal=entry.next_outstanding_principal, dig 7 extract 49 8 - // modules/actus_kernel.py:1076 + // modules/actus_kernel.py:1124 // flags=entry.flags, dig 8 extract 57 8 - // modules/actus_kernel.py:1066-1077 + // modules/actus_kernel.py:1114-1125 // typ.ObservedEventRequest( // event_id=entry.event_id, // event_type=entry.event_type, @@ -3179,10 +3255,10 @@ contract_execute_ied: concat uncover 5 concat - // modules/actus_kernel.py:1072 + // modules/actus_kernel.py:1120 // observed_rate=UInt64(0), intc_0 // 0 - // modules/actus_kernel.py:1066-1077 + // modules/actus_kernel.py:1114-1125 // typ.ObservedEventRequest( // event_id=entry.event_id, // event_type=entry.event_type, @@ -3205,7 +3281,7 @@ contract_execute_ied: concat swap concat - // modules/actus_kernel.py:1064-1078 + // modules/actus_kernel.py:1112-1126 // self._apply_non_cash_schedule_entry( // entry, // typ.ObservedEventRequest( @@ -3223,10 +3299,10 @@ contract_execute_ied: // ) callsub _apply_non_cash_schedule_entry popn 2 - // modules/actus_kernel.py:1079 + // modules/actus_kernel.py:1127 // return Global.latest_timestamp global LatestTimestamp - // modules/actus_kernel.py:1049 + // modules/actus_kernel.py:1097 // @arc4.abimethod itob bytec_0 // 0x151f7c75 @@ -3243,7 +3319,7 @@ apply_non_cash_event: dupn 4 pushbytes "" dup - // modules/actus_kernel.py:1081 + // modules/actus_kernel.py:1129 // @arc4.abimethod txna ApplicationArgs 1 dup @@ -3265,13 +3341,13 @@ apply_non_cash_event: app_global_get_ex assert // check self.status exists assert // D-ASA not configured - // modules/actus_kernel.py:1095 + // modules/actus_kernel.py:1143 // self._assert_is_not_asset_defaulted() callsub _assert_is_not_asset_defaulted - // modules/actus_kernel.py:1096 + // modules/actus_kernel.py:1144 // self._assert_is_not_asset_suspended() callsub _assert_is_not_asset_suspended - // modules/actus_kernel.py:1098 + // modules/actus_kernel.py:1146 // if payload.flags & UInt64(enums.FLAG_OBSERVED_EVENT): pushint 65 extract_uint64 @@ -3282,30 +3358,30 @@ apply_non_cash_event: // modules/actus_kernel.py:233 // return self.contract_type == UInt64(enums.CT_CLM) intc_0 // 0 - bytec 12 // "contract_type" + bytec 10 // "contract_type" app_global_get_ex assert // check self.contract_type exists pushint 5 == - // modules/actus_kernel.py:1099 + // modules/actus_kernel.py:1147 // assert self._supports_observed_events(), err.OBSERVED_EVENT_REQUIRED assert // Observed event required to execute this action - // modules/actus_kernel.py:1100 + // modules/actus_kernel.py:1148 // self._assert_caller_is_arranger() callsub _assert_caller_is_arranger // modules/actus_kernel.py:233 // return self.contract_type == UInt64(enums.CT_CLM) intc_0 // 0 - bytec 12 // "contract_type" + bytec 10 // "contract_type" app_global_get_ex assert // check self.contract_type exists dup pushint 5 == - // modules/actus_kernel.py:938 + // modules/actus_kernel.py:947 // assert self._supports_observed_events(), err.OBSERVED_EVENT_REQUIRED assert // Observed event required to execute this action - // modules/actus_kernel.py:939 + // modules/actus_kernel.py:948 // assert payload.event_id == self.schedule_entry_count, err.INVALID_EVENT_ID dig 2 dup @@ -3314,60 +3390,506 @@ apply_non_cash_event: dup bury 7 intc_0 // 0 - bytec 4 // "schedule_entry_count" + bytec_3 // "schedule_entry_count" app_global_get_ex assert // check self.schedule_entry_count exists == assert // Invalid event id - // modules/actus_kernel.py:941 + // modules/actus_kernel.py:950 // self.contract_type, payload.event_type.as_uint64() dup extract 8 1 bury 12 intc_2 // 8 getbyte - // modules/actus_kernel.py:940-942 + // modules/actus_kernel.py:949-951 // self._assert_event_allowed_for_contract_type( // self.contract_type, payload.event_type.as_uint64() // ) callsub _assert_event_allowed_for_contract_type - // modules/actus_kernel.py:944 + // modules/actus_kernel.py:953 + // page_index = self._schedule_page_index(self.schedule_entry_count) + intc_0 // 0 + bytec_3 // "schedule_entry_count" + app_global_get_ex + assert // check self.schedule_entry_count exists + // modules/actus_kernel.py:190 + // return event_id // UInt64(cst.SCHEDULE_PAGE_SIZE) + pushint 16 + / + // modules/actus_kernel.py:954 + // page = typ.ExecutionSchedulePage() + bytec 48 // 0x0000 + bury 7 + // modules/actus_kernel.py:955 + // if page_index in self.schedule_page: + itob + bytec 24 // 0x5323 + swap + concat + dup + bury 9 + box_len + bury 1 + bz apply_non_cash_event_after_if_else@27 + // modules/actus_kernel.py:956 + // page = self.schedule_page[page_index].copy() + dig 7 + box_get + swap + bury 7 + assert // check self.schedule_page entry exists + +apply_non_cash_event_after_if_else@27: + // modules/actus_kernel.py:957 + // assert page.length < UInt64(cst.SCHEDULE_PAGE_SIZE), err.INVALID_SCHEDULE_PAGE + dig 5 + dup + intc_0 // 0 + extract_uint16 // on error: invalid array length header + dup + pushint 16 + < + assert // Invalid schedule page + // modules/actus_kernel.py:962 + // scheduled_time=payload.scheduled_time, + dig 3 + dup + extract 9 8 + // modules/actus_kernel.py:963 + // accrual_factor=payload.accrual_factor, + dig 1 + extract 17 8 + // modules/actus_kernel.py:964 + // redemption_accrual_factor=payload.redemption_accrual_factor, + dig 2 + extract 25 8 + // modules/actus_kernel.py:965 + // next_nominal_interest_rate=payload.next_nominal_interest_rate, + dig 3 + extract 41 8 + // modules/actus_kernel.py:966 + // next_principal_redemption=payload.next_principal_redemption, + dig 4 + extract 49 8 + // modules/actus_kernel.py:967 + // next_outstanding_principal=payload.next_outstanding_principal, + uncover 5 + extract 57 8 + // modules/actus_kernel.py:959-969 + // typ.ExecutionScheduleEntry( + // event_id=payload.event_id, + // event_type=payload.event_type, + // scheduled_time=payload.scheduled_time, + // accrual_factor=payload.accrual_factor, + // redemption_accrual_factor=payload.redemption_accrual_factor, + // next_nominal_interest_rate=payload.next_nominal_interest_rate, + // next_principal_redemption=payload.next_principal_redemption, + // next_outstanding_principal=payload.next_outstanding_principal, + // flags=payload.flags, + // ) + dig 11 + itob + dig 18 + concat + uncover 6 + concat + uncover 5 + concat + uncover 4 + concat + uncover 3 + concat + uncover 2 + concat + swap + concat + dig 3 + itob + concat + // modules/actus_kernel.py:958-970 + // page.append( + // typ.ExecutionScheduleEntry( + // event_id=payload.event_id, + // event_type=payload.event_type, + // scheduled_time=payload.scheduled_time, + // accrual_factor=payload.accrual_factor, + // redemption_accrual_factor=payload.redemption_accrual_factor, + // next_nominal_interest_rate=payload.next_nominal_interest_rate, + // next_principal_redemption=payload.next_principal_redemption, + // next_outstanding_principal=payload.next_outstanding_principal, + // flags=payload.flags, + // ) + // ) + uncover 2 + swap + concat // on error: max array length exceeded + swap + intc_1 // 1 + + + itob + extract 6 2 + replace2 0 + // modules/actus_kernel.py:971 + // self.schedule_page[page_index] = page.copy() + dig 8 + dup + box_del + pop + swap + box_put + // modules/actus_kernel.py:972 + // self.schedule_entry_count += UInt64(1) + intc_0 // 0 + bytec_3 // "schedule_entry_count" + app_global_get_ex + assert // check self.schedule_entry_count exists + intc_1 // 1 + + + bytec_3 // "schedule_entry_count" + swap + app_global_put + +apply_non_cash_event_after_if_else@3: + // modules/actus_kernel.py:1151 + // assert event_id == self.event_cursor, err.INVALID_EVENT_CURSOR + intc_0 // 0 + bytec_2 // "event_cursor" + app_global_get_ex + assert // check self.event_cursor exists + dig 3 + dup + uncover 2 + == + assert // Invalid event cursor + // modules/actus_kernel.py:1152 + // entry = self._get_schedule_entry(event_id) + callsub _get_schedule_entry + dup + bury 8 + // modules/actus_kernel.py:1154 + // entry.event_type.as_uint64() + dup + extract 8 1 + bury 10 + intc_2 // 8 + getbyte + dup + bury 6 + // modules/actus_kernel.py:364 + // UInt64(enums.EVT_IED), + intc_1 // 1 + // modules/actus_kernel.py:363-370 + // return event_type in ( + // UInt64(enums.EVT_IED), + // UInt64(enums.EVT_PI), + // UInt64(enums.EVT_RR), + // UInt64(enums.EVT_RRF), + // UInt64(enums.EVT_IPCB), + // UInt64(enums.EVT_PRF), + // ) + == + bnz apply_non_cash_event_bool_true@15 + dig 4 + // modules/actus_kernel.py:365 + // UInt64(enums.EVT_PI), + pushint 4 + // modules/actus_kernel.py:363-370 + // return event_type in ( + // UInt64(enums.EVT_IED), + // UInt64(enums.EVT_PI), + // UInt64(enums.EVT_RR), + // UInt64(enums.EVT_RRF), + // UInt64(enums.EVT_IPCB), + // UInt64(enums.EVT_PRF), + // ) + == + bnz apply_non_cash_event_bool_true@15 + dig 4 + // modules/actus_kernel.py:366 + // UInt64(enums.EVT_RR), + pushint 12 + // modules/actus_kernel.py:363-370 + // return event_type in ( + // UInt64(enums.EVT_IED), + // UInt64(enums.EVT_PI), + // UInt64(enums.EVT_RR), + // UInt64(enums.EVT_RRF), + // UInt64(enums.EVT_IPCB), + // UInt64(enums.EVT_PRF), + // ) + == + bnz apply_non_cash_event_bool_true@15 + dig 4 + // modules/actus_kernel.py:367 + // UInt64(enums.EVT_RRF), + pushint 11 + // modules/actus_kernel.py:363-370 + // return event_type in ( + // UInt64(enums.EVT_IED), + // UInt64(enums.EVT_PI), + // UInt64(enums.EVT_RR), + // UInt64(enums.EVT_RRF), + // UInt64(enums.EVT_IPCB), + // UInt64(enums.EVT_PRF), + // ) + == + bnz apply_non_cash_event_bool_true@15 + dig 4 + // modules/actus_kernel.py:368 + // UInt64(enums.EVT_IPCB), + pushint 18 + // modules/actus_kernel.py:363-370 + // return event_type in ( + // UInt64(enums.EVT_IED), + // UInt64(enums.EVT_PI), + // UInt64(enums.EVT_RR), + // UInt64(enums.EVT_RRF), + // UInt64(enums.EVT_IPCB), + // UInt64(enums.EVT_PRF), + // ) + == + bnz apply_non_cash_event_bool_true@15 + dig 4 + // modules/actus_kernel.py:369 + // UInt64(enums.EVT_PRF), + pushint 5 + // modules/actus_kernel.py:363-370 + // return event_type in ( + // UInt64(enums.EVT_IED), + // UInt64(enums.EVT_PI), + // UInt64(enums.EVT_RR), + // UInt64(enums.EVT_RRF), + // UInt64(enums.EVT_IPCB), + // UInt64(enums.EVT_PRF), + // ) + == + bz apply_non_cash_event_bool_false@16 + +apply_non_cash_event_bool_true@15: + intc_1 // 1 + +apply_non_cash_event_bool_merge@17: + // modules/actus_kernel.py:1153-1155 + // assert self._event_is_non_cash( + // entry.event_type.as_uint64() + // ), err.INVALID_EVENT_TYPE + assert // Invalid event type + // modules/actus_kernel.py:1156 + // assert entry.event_type != arc4.UInt8(enums.EVT_IED), err.INVALID_EVENT_TYPE + dig 8 + pushbytes 0x01 + b!= + assert // Invalid event type + // modules/actus_kernel.py:374 + // return event_type in (UInt64(enums.EVT_RR), UInt64(enums.EVT_RRF)) + dig 4 + pushint 12 + == + bnz apply_non_cash_event_bool_true@21 + dig 4 + pushint 11 + == + bz apply_non_cash_event_bool_false@22 + +apply_non_cash_event_bool_true@21: + intc_1 // 1 + +apply_non_cash_event_bool_merge@23: + // modules/actus_kernel.py:1157 + // if self._event_is_rate_reset(entry.event_type.as_uint64()): + bz apply_non_cash_event_else_body@5 + // modules/rbac.py:80 + // assert self._role_is_active(self.observer, Txn.sender), err.UNAUTHORIZED + bytec 25 // 0x52234f6273657276657223 + txn Sender + callsub _role_is_active + assert // Not authorized + +apply_non_cash_event_after_if_else@6: + // modules/actus_kernel.py:1161 + // self._apply_non_cash_schedule_entry(entry, payload) + dig 6 + dig 2 + callsub _apply_non_cash_schedule_entry + popn 2 + // modules/actus_kernel.py:1162 + // return Global.latest_timestamp + global LatestTimestamp + // modules/actus_kernel.py:1129 + // @arc4.abimethod + itob + bytec_0 // 0x151f7c75 + swap + concat + log + intc_1 // 1 + return + +apply_non_cash_event_else_body@5: + // modules/actus_kernel.py:1160 + // self._assert_caller_is_arranger() + callsub _assert_caller_is_arranger + b apply_non_cash_event_after_if_else@6 + +apply_non_cash_event_bool_false@22: + intc_0 // 0 + b apply_non_cash_event_bool_merge@23 + +apply_non_cash_event_bool_false@16: + intc_0 // 0 + b apply_non_cash_event_bool_merge@17 + + +// modules.actus_kernel.ActusKernelModule.append_observed_cash_event[routing]() -> void: +append_observed_cash_event: + intc_0 // 0 + dup + // modules/actus_kernel.py:1164 + // @arc4.abimethod + txna ApplicationArgs 1 + dupn 2 + len + pushint 65 + == + assert // invalid number of bytes for smart_contracts.abi_types.ObservedCashEventRequest + // modules/actus_kernel.py:143 + // assert self.status != UInt64(enums.STATUS_INACTIVE), err.NOT_CONFIGURED + intc_0 // 0 + bytec_1 // "status" + app_global_get_ex + assert // check self.status exists + assert // D-ASA not configured + // modules/actus_kernel.py:1172 + // self._assert_caller_is_arranger() + callsub _assert_caller_is_arranger + // modules/actus_kernel.py:1173 + // self._assert_is_not_asset_defaulted() + callsub _assert_is_not_asset_defaulted + // modules/actus_kernel.py:1174 + // self._assert_is_not_asset_suspended() + callsub _assert_is_not_asset_suspended + // modules/actus_kernel.py:135 + // return self.status == UInt64(enums.STATUS_PENDING_IED) + intc_0 // 0 + bytec_1 // "status" + app_global_get_ex + assert // check self.status exists + pushint 50 + == + // modules/actus_kernel.py:147 + // assert not self._status_is_pending_ied(), err.PENDING_IED + ! + assert // IED not yet executed + // modules/actus_kernel.py:233 + // return self.contract_type == UInt64(enums.CT_CLM) + intc_0 // 0 + bytec 10 // "contract_type" + app_global_get_ex + assert // check self.contract_type exists + pushint 5 + == + // modules/actus_kernel.py:981 + // assert self._supports_observed_events(), err.OBSERVED_EVENT_REQUIRED + assert // Observed event required to execute this action + // modules/actus_kernel.py:982 + // assert payload.event_id == self.schedule_entry_count, err.INVALID_EVENT_ID + dup + intc_0 // 0 + extract_uint64 + dup + cover 2 + intc_0 // 0 + bytec_3 // "schedule_entry_count" + app_global_get_ex + assert // check self.schedule_entry_count exists + swap + dig 1 + == + assert // Invalid event id + // modules/actus_kernel.py:983 + // assert payload.event_type == arc4.UInt8(enums.EVT_PR), err.INVALID_EVENT_TYPE + dig 1 + extract 8 1 + dup + cover 3 + pushbytes 0x03 + b== + assert // Invalid event type + // modules/actus_kernel.py:984 + // assert payload.flags & UInt64(enums.FLAG_CASH_EVENT), err.INVALID_ACTUS_CONFIG + swap + pushint 57 + extract_uint64 + dup + cover 2 + intc_1 // 1 + & + assert // Invalid ACTUS configuration + // modules/actus_kernel.py:986 + // if self.schedule_entry_count > UInt64(0): + bz append_observed_cash_event_after_if_else@3 + // modules/actus_kernel.py:987 + // previous_entry = self._get_schedule_entry(self.schedule_entry_count - UInt64(1)) + intc_0 // 0 + bytec_3 // "schedule_entry_count" + app_global_get_ex + assert // check self.schedule_entry_count exists + intc_1 // 1 + - + callsub _get_schedule_entry + // modules/actus_kernel.py:989 + // previous_entry.scheduled_time <= payload.scheduled_time + pushint 9 + extract_uint64 + dig 4 + pushint 9 + extract_uint64 + <= + // modules/actus_kernel.py:988-990 + // assert ( + // previous_entry.scheduled_time <= payload.scheduled_time + // ), err.INVALID_SORTING + assert // Time events must be sorted in strictly ascending order + +append_observed_cash_event_after_if_else@3: + // modules/actus_kernel.py:992 // page_index = self._schedule_page_index(self.schedule_entry_count) intc_0 // 0 - bytec 4 // "schedule_entry_count" + bytec_3 // "schedule_entry_count" app_global_get_ex assert // check self.schedule_entry_count exists // modules/actus_kernel.py:190 // return event_id // UInt64(cst.SCHEDULE_PAGE_SIZE) pushint 16 / - // modules/actus_kernel.py:945 + // modules/actus_kernel.py:993 // page = typ.ExecutionSchedulePage() - pushbytes 0x0000 - bury 7 - // modules/actus_kernel.py:946 + bytec 48 // 0x0000 + bury 6 + // modules/actus_kernel.py:994 // if page_index in self.schedule_page: itob - bytec 31 // 0x5323 + bytec 24 // 0x5323 swap concat dup - bury 9 + bury 7 box_len bury 1 - bz apply_non_cash_event_after_if_else@27 - // modules/actus_kernel.py:947 + bz append_observed_cash_event_after_if_else@5 + // modules/actus_kernel.py:995 // page = self.schedule_page[page_index].copy() - dig 7 + dig 5 box_get swap - bury 7 + bury 6 assert // check self.schedule_page entry exists -apply_non_cash_event_after_if_else@27: - // modules/actus_kernel.py:948 +append_observed_cash_event_after_if_else@5: + // modules/actus_kernel.py:996 // assert page.length < UInt64(cst.SCHEDULE_PAGE_SIZE), err.INVALID_SCHEDULE_PAGE - dig 5 + dig 4 dup intc_0 // 0 extract_uint16 // on error: invalid array length header @@ -3375,32 +3897,32 @@ apply_non_cash_event_after_if_else@27: pushint 16 < assert // Invalid schedule page - // modules/actus_kernel.py:953 + // modules/actus_kernel.py:1001 // scheduled_time=payload.scheduled_time, - dig 3 + dig 5 dup extract 9 8 - // modules/actus_kernel.py:954 + // modules/actus_kernel.py:1002 // accrual_factor=payload.accrual_factor, dig 1 extract 17 8 - // modules/actus_kernel.py:955 + // modules/actus_kernel.py:1003 // redemption_accrual_factor=payload.redemption_accrual_factor, dig 2 extract 25 8 - // modules/actus_kernel.py:956 + // modules/actus_kernel.py:1004 // next_nominal_interest_rate=payload.next_nominal_interest_rate, dig 3 - extract 41 8 - // modules/actus_kernel.py:957 + extract 33 8 + // modules/actus_kernel.py:1005 // next_principal_redemption=payload.next_principal_redemption, dig 4 - extract 49 8 - // modules/actus_kernel.py:958 + extract 41 8 + // modules/actus_kernel.py:1006 // next_outstanding_principal=payload.next_outstanding_principal, uncover 5 - extract 57 8 - // modules/actus_kernel.py:950-960 + extract 49 8 + // modules/actus_kernel.py:998-1008 // typ.ExecutionScheduleEntry( // event_id=payload.event_id, // event_type=payload.event_type, @@ -3412,9 +3934,9 @@ apply_non_cash_event_after_if_else@27: // next_outstanding_principal=payload.next_outstanding_principal, // flags=payload.flags, // ) - dig 11 + dig 10 itob - dig 18 + dig 10 concat uncover 6 concat @@ -3431,7 +3953,7 @@ apply_non_cash_event_after_if_else@27: dig 3 itob concat - // modules/actus_kernel.py:949-961 + // modules/actus_kernel.py:997-1009 // page.append( // typ.ExecutionScheduleEntry( // event_id=payload.event_id, @@ -3454,193 +3976,29 @@ apply_non_cash_event_after_if_else@27: itob extract 6 2 replace2 0 - // modules/actus_kernel.py:962 + // modules/actus_kernel.py:1010 // self.schedule_page[page_index] = page.copy() - dig 8 + dig 6 dup box_del pop swap box_put - // modules/actus_kernel.py:963 + // modules/actus_kernel.py:1011 // self.schedule_entry_count += UInt64(1) intc_0 // 0 - bytec 4 // "schedule_entry_count" + bytec_3 // "schedule_entry_count" app_global_get_ex assert // check self.schedule_entry_count exists intc_1 // 1 + - bytec 4 // "schedule_entry_count" + bytec_3 // "schedule_entry_count" swap app_global_put - -apply_non_cash_event_after_if_else@3: - // modules/actus_kernel.py:1103 - // assert event_id == self.event_cursor, err.INVALID_EVENT_CURSOR - intc_0 // 0 - bytec_2 // "event_cursor" - app_global_get_ex - assert // check self.event_cursor exists - dig 3 - dup - uncover 2 - == - assert // Invalid event cursor - // modules/actus_kernel.py:1104 - // entry = self._get_schedule_entry(event_id) - callsub _get_schedule_entry - dup - bury 8 - // modules/actus_kernel.py:1106 - // entry.event_type.as_uint64() - dup - extract 8 1 - bury 10 - intc_2 // 8 - getbyte - dup - bury 6 - // modules/actus_kernel.py:364 - // UInt64(enums.EVT_IED), - intc_1 // 1 - // modules/actus_kernel.py:363-370 - // return event_type in ( - // UInt64(enums.EVT_IED), - // UInt64(enums.EVT_PI), - // UInt64(enums.EVT_RR), - // UInt64(enums.EVT_RRF), - // UInt64(enums.EVT_IPCB), - // UInt64(enums.EVT_PRF), - // ) - == - bnz apply_non_cash_event_bool_true@15 - dig 4 - // modules/actus_kernel.py:365 - // UInt64(enums.EVT_PI), - pushint 4 - // modules/actus_kernel.py:363-370 - // return event_type in ( - // UInt64(enums.EVT_IED), - // UInt64(enums.EVT_PI), - // UInt64(enums.EVT_RR), - // UInt64(enums.EVT_RRF), - // UInt64(enums.EVT_IPCB), - // UInt64(enums.EVT_PRF), - // ) - == - bnz apply_non_cash_event_bool_true@15 - dig 4 - // modules/actus_kernel.py:366 - // UInt64(enums.EVT_RR), - pushint 12 - // modules/actus_kernel.py:363-370 - // return event_type in ( - // UInt64(enums.EVT_IED), - // UInt64(enums.EVT_PI), - // UInt64(enums.EVT_RR), - // UInt64(enums.EVT_RRF), - // UInt64(enums.EVT_IPCB), - // UInt64(enums.EVT_PRF), - // ) - == - bnz apply_non_cash_event_bool_true@15 - dig 4 - // modules/actus_kernel.py:367 - // UInt64(enums.EVT_RRF), - pushint 11 - // modules/actus_kernel.py:363-370 - // return event_type in ( - // UInt64(enums.EVT_IED), - // UInt64(enums.EVT_PI), - // UInt64(enums.EVT_RR), - // UInt64(enums.EVT_RRF), - // UInt64(enums.EVT_IPCB), - // UInt64(enums.EVT_PRF), - // ) - == - bnz apply_non_cash_event_bool_true@15 - dig 4 - // modules/actus_kernel.py:368 - // UInt64(enums.EVT_IPCB), - pushint 18 - // modules/actus_kernel.py:363-370 - // return event_type in ( - // UInt64(enums.EVT_IED), - // UInt64(enums.EVT_PI), - // UInt64(enums.EVT_RR), - // UInt64(enums.EVT_RRF), - // UInt64(enums.EVT_IPCB), - // UInt64(enums.EVT_PRF), - // ) - == - bnz apply_non_cash_event_bool_true@15 - dig 4 - // modules/actus_kernel.py:369 - // UInt64(enums.EVT_PRF), - pushint 5 - // modules/actus_kernel.py:363-370 - // return event_type in ( - // UInt64(enums.EVT_IED), - // UInt64(enums.EVT_PI), - // UInt64(enums.EVT_RR), - // UInt64(enums.EVT_RRF), - // UInt64(enums.EVT_IPCB), - // UInt64(enums.EVT_PRF), - // ) - == - bz apply_non_cash_event_bool_false@16 - -apply_non_cash_event_bool_true@15: - intc_1 // 1 - -apply_non_cash_event_bool_merge@17: - // modules/actus_kernel.py:1105-1107 - // assert self._event_is_non_cash( - // entry.event_type.as_uint64() - // ), err.INVALID_EVENT_TYPE - assert // Invalid event type - // modules/actus_kernel.py:1108 - // assert entry.event_type != arc4.UInt8(enums.EVT_IED), err.INVALID_EVENT_TYPE - dig 8 - pushbytes 0x01 - b!= - assert // Invalid event type - // modules/actus_kernel.py:374 - // return event_type in (UInt64(enums.EVT_RR), UInt64(enums.EVT_RRF)) - dig 4 - pushint 12 - == - bnz apply_non_cash_event_bool_true@21 - dig 4 - pushint 11 - == - bz apply_non_cash_event_bool_false@22 - -apply_non_cash_event_bool_true@21: - intc_1 // 1 - -apply_non_cash_event_bool_merge@23: - // modules/actus_kernel.py:1109 - // if self._event_is_rate_reset(entry.event_type.as_uint64()): - bz apply_non_cash_event_else_body@5 - // modules/rbac.py:80 - // assert self._role_is_active(self.observer, Txn.sender), err.UNAUTHORIZED - bytec 24 // 0x52234f6273657276657223 - txn Sender - callsub _role_is_active - assert // Not authorized - -apply_non_cash_event_after_if_else@6: - // modules/actus_kernel.py:1113 - // self._apply_non_cash_schedule_entry(entry, payload) - dig 6 - dig 2 - callsub _apply_non_cash_schedule_entry - popn 2 - // modules/actus_kernel.py:1114 + // modules/actus_kernel.py:1178 // return Global.latest_timestamp global LatestTimestamp - // modules/actus_kernel.py:1081 + // modules/actus_kernel.py:1164 // @arc4.abimethod itob bytec_0 // 0x151f7c75 @@ -3650,20 +4008,6 @@ apply_non_cash_event_after_if_else@6: intc_1 // 1 return -apply_non_cash_event_else_body@5: - // modules/actus_kernel.py:1112 - // self._assert_caller_is_arranger() - callsub _assert_caller_is_arranger - b apply_non_cash_event_after_if_else@6 - -apply_non_cash_event_bool_false@22: - intc_0 // 0 - b apply_non_cash_event_bool_merge@23 - -apply_non_cash_event_bool_false@16: - intc_0 // 0 - b apply_non_cash_event_bool_merge@17 - // modules.actus_kernel.ActusKernelModule.contract_get_state[routing]() -> void: contract_get_state: @@ -3675,10 +4019,10 @@ contract_get_state: assert // check self.status exists dup assert // D-ASA not configured - // modules/actus_kernel.py:1121 + // modules/actus_kernel.py:1185 // contract_type=arc4.UInt8(self.contract_type), intc_0 // 0 - bytec 12 // "contract_type" + bytec 10 // "contract_type" app_global_get_ex assert // check self.contract_type exists itob @@ -3688,85 +4032,85 @@ contract_get_state: <= assert // overflow extract 7 1 - // modules/actus_kernel.py:1123 + // modules/actus_kernel.py:1187 // total_units=self.total_units, intc_0 // 0 bytec 13 // "total_units" app_global_get_ex assert // check self.total_units exists - // modules/actus_kernel.py:1124 + // modules/actus_kernel.py:1188 // reserved_units_total=self.reserved_units_total, intc_0 // 0 - bytec 10 // "reserved_units_total" + bytec 11 // "reserved_units_total" app_global_get_ex assert // check self.reserved_units_total exists - // modules/actus_kernel.py:1125 + // modules/actus_kernel.py:1189 // initial_exchange_amount=self.initial_exchange_amount, intc_0 // 0 bytec 20 // "initial_exchange_amount" app_global_get_ex assert // check self.initial_exchange_amount exists - // modules/actus_kernel.py:1126 + // modules/actus_kernel.py:1190 // event_cursor=self.event_cursor, intc_0 // 0 bytec_2 // "event_cursor" app_global_get_ex assert // check self.event_cursor exists - // modules/actus_kernel.py:1127 + // modules/actus_kernel.py:1191 // schedule_entry_count=self.schedule_entry_count, intc_0 // 0 - bytec 4 // "schedule_entry_count" + bytec_3 // "schedule_entry_count" app_global_get_ex assert // check self.schedule_entry_count exists - // modules/actus_kernel.py:1128 + // modules/actus_kernel.py:1192 // outstanding_principal=self.outstanding_principal, intc_0 // 0 - bytec_3 // "outstanding_principal" + bytec 4 // "outstanding_principal" app_global_get_ex assert // check self.outstanding_principal exists - // modules/actus_kernel.py:1129 + // modules/actus_kernel.py:1193 // interest_calculation_base=self.interest_calculation_base, intc_0 // 0 bytec 7 // "interest_calculation_base" app_global_get_ex assert // check self.interest_calculation_base exists - // modules/actus_kernel.py:1130 + // modules/actus_kernel.py:1194 // nominal_interest_rate=self.nominal_interest_rate, intc_0 // 0 bytec 9 // "nominal_interest_rate" app_global_get_ex assert // check self.nominal_interest_rate exists - // modules/actus_kernel.py:1131 + // modules/actus_kernel.py:1195 // accrued_interest=self.accrued_interest, intc_0 // 0 bytec 6 // "accrued_interest" app_global_get_ex assert // check self.accrued_interest exists - // modules/actus_kernel.py:1132 + // modules/actus_kernel.py:1196 // cumulative_interest_index=self.cumulative_interest_index, intc_0 // 0 bytec 16 // "cumulative_interest_index" app_global_get_ex assert // check self.cumulative_interest_index exists - // modules/actus_kernel.py:1133 + // modules/actus_kernel.py:1197 // cumulative_principal_index=self.cumulative_principal_index, intc_0 // 0 bytec 17 // "cumulative_principal_index" app_global_get_ex assert // check self.cumulative_principal_index exists - // modules/actus_kernel.py:1134 + // modules/actus_kernel.py:1198 // reserved_interest=self.reserved_interest, intc_0 // 0 bytec 15 // "reserved_interest" app_global_get_ex assert // check self.reserved_interest exists - // modules/actus_kernel.py:1135 + // modules/actus_kernel.py:1199 // reserved_principal=self.reserved_principal, intc_0 // 0 - bytec 11 // "reserved_principal" + bytec 12 // "reserved_principal" app_global_get_ex assert // check self.reserved_principal exists - // modules/actus_kernel.py:1120-1136 + // modules/actus_kernel.py:1184-1200 // return typ.KernelState( // contract_type=arc4.UInt8(self.contract_type), // status=self.status, @@ -3828,7 +4172,7 @@ contract_get_state: swap itob concat - // modules/actus_kernel.py:1116 + // modules/actus_kernel.py:1180 // @arc4.abimethod(readonly=True) bytec_0 // 0x151f7c75 swap @@ -3847,25 +4191,25 @@ contract_get_next_due_event: app_global_get_ex assert // check self.status exists assert // D-ASA not configured - // modules/actus_kernel.py:1142 + // modules/actus_kernel.py:1206 // if self.event_cursor >= self.schedule_entry_count: intc_0 // 0 bytec_2 // "event_cursor" app_global_get_ex assert // check self.event_cursor exists intc_0 // 0 - bytec 4 // "schedule_entry_count" + bytec_3 // "schedule_entry_count" app_global_get_ex assert // check self.schedule_entry_count exists >= bz contract_get_next_due_event_after_if_else@3 - // modules/actus_kernel.py:1144 + // modules/actus_kernel.py:1208 // event_id=self.event_cursor, intc_0 // 0 bytec_2 // "event_cursor" app_global_get_ex assert // check self.event_cursor exists - // modules/actus_kernel.py:1143-1153 + // modules/actus_kernel.py:1207-1217 // return typ.ExecutionScheduleEntry( // event_id=self.event_cursor, // event_type=arc4.UInt8(0), @@ -3878,10 +4222,10 @@ contract_get_next_due_event: // flags=UInt64(0), // ) itob - // modules/actus_kernel.py:1145 + // modules/actus_kernel.py:1209 // event_type=arc4.UInt8(0), bytec 40 // 0x00 - // modules/actus_kernel.py:1143-1153 + // modules/actus_kernel.py:1207-1217 // return typ.ExecutionScheduleEntry( // event_id=self.event_cursor, // event_type=arc4.UInt8(0), @@ -3894,10 +4238,10 @@ contract_get_next_due_event: // flags=UInt64(0), // ) concat - // modules/actus_kernel.py:1146 + // modules/actus_kernel.py:1210 // scheduled_time=UInt64(0), intc_0 // 0 - // modules/actus_kernel.py:1143-1153 + // modules/actus_kernel.py:1207-1217 // return typ.ExecutionScheduleEntry( // event_id=self.event_cursor, // event_type=arc4.UInt8(0), @@ -3927,7 +4271,7 @@ contract_get_next_due_event: concat contract_get_next_due_event_after_inlined_modules.actus_kernel.ActusKernelModule.contract_get_next_due_event@4: - // modules/actus_kernel.py:1138 + // modules/actus_kernel.py:1202 // @arc4.abimethod(readonly=True) bytec_0 // 0x151f7c75 swap @@ -3937,14 +4281,14 @@ contract_get_next_due_event_after_inlined_modules.actus_kernel.ActusKernelModule return contract_get_next_due_event_after_if_else@3: - // modules/actus_kernel.py:1154 + // modules/actus_kernel.py:1218 // return self._get_schedule_entry(self.event_cursor) intc_0 // 0 bytec_2 // "event_cursor" app_global_get_ex assert // check self.event_cursor exists callsub _get_schedule_entry - // modules/actus_kernel.py:1138 + // modules/actus_kernel.py:1202 // @arc4.abimethod(readonly=True) b contract_get_next_due_event_after_inlined_modules.actus_kernel.ActusKernelModule.contract_get_next_due_event@4 @@ -4010,7 +4354,7 @@ rbac_set_op_daemon: callsub _assert_caller_is_arranger // modules/rbac.py:185 // self.op_daemon.value = address - bytec 25 // 0x52234f704461656d6f6e23 + bytec 26 // 0x52234f704461656d6f6e23 swap app_global_put // modules/rbac.py:186 @@ -4196,7 +4540,7 @@ rbac_assign_role_after_if_else@11: bz rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14 // modules/rbac.py:123 // assert role_address not in self.observer, err.INVALID_ROLE_ADDRESS - bytec 24 // 0x52234f6273657276657223 + bytec 25 // 0x52234f6273657276657223 dig 3 concat dup @@ -4359,7 +4703,7 @@ rbac_revoke_role_after_if_else@9: bz rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 // modules/rbac.py:145 // assert role_address in self.observer, err.INVALID_ROLE_ADDRESS - bytec 24 // 0x52234f6273657276657223 + bytec 25 // 0x52234f6273657276657223 dig 2 concat dup @@ -4460,7 +4804,7 @@ rbac_get_address_roles: callsub _role_is_active // modules/rbac.py:288 // self._role_is_active(self.observer, address), - bytec 24 // 0x52234f6273657276657223 + bytec 25 // 0x52234f6273657276657223 uncover 5 callsub _role_is_active // modules/rbac.py:270 @@ -4558,7 +4902,7 @@ rbac_get_role_validity: rbac_get_role_validity_switch_case_5@7: // modules/rbac.py:334 // self.observer, role_address - bytec 24 // 0x52234f6273657276657223 + bytec 25 // 0x52234f6273657276657223 // modules/rbac.py:55 // return role_address in role_map dig 1 @@ -4925,7 +5269,7 @@ _ensure_units_activated_after_if_else@4: // modules/accounting.py:111 // assert self.reserved_units_total >= activated_units, err.OVER_DISTRIBUTION intc_0 // 0 - bytec 10 // "reserved_units_total" + bytec 11 // "reserved_units_total" app_global_get_ex assert // check self.reserved_units_total exists dup @@ -4936,7 +5280,7 @@ _ensure_units_activated_after_if_else@4: // self.reserved_units_total -= activated_units swap - - bytec 10 // "reserved_units_total" + bytec 11 // "reserved_units_total" swap app_global_put retsub @@ -5058,7 +5402,7 @@ _get_schedule_entry: // modules/actus_kernel.py:204 // assert event_id < self.schedule_entry_count, err.INVALID_EVENT_ID intc_0 // 0 - bytec 4 // "schedule_entry_count" + bytec_3 // "schedule_entry_count" app_global_get_ex assert // check self.schedule_entry_count exists frame_dig -1 @@ -5072,7 +5416,7 @@ _get_schedule_entry: // modules/actus_kernel.py:206 // assert page_index in self.schedule_page, err.INVALID_SCHEDULE_PAGE itob - bytec 31 // 0x5323 + bytec 24 // 0x5323 swap concat dup @@ -5447,7 +5791,7 @@ _is_dynamic_annuity: // modules/actus_kernel.py:335 // self.contract_type == UInt64(enums.CT_ANN) intc_0 // 0 - bytec 12 // "contract_type" + bytec 10 // "contract_type" app_global_get_ex assert // check self.contract_type exists intc_1 // 1 @@ -5698,7 +6042,7 @@ _apply_non_cash_schedule_entry: // modules/actus_kernel.py:632 // self.reserved_units_total == self.total_units intc_0 // 0 - bytec 10 // "reserved_units_total" + bytec 11 // "reserved_units_total" app_global_get_ex assert // check self.reserved_units_total exists intc_0 // 0 @@ -5716,7 +6060,7 @@ _apply_non_cash_schedule_entry: frame_dig -2 pushint 49 extract_uint64 - bytec_3 // "outstanding_principal" + bytec 4 // "outstanding_principal" dig 1 app_global_put // modules/actus_kernel.py:635 @@ -5864,7 +6208,7 @@ _apply_non_cash_schedule_entry_after_if_else@6: assert // check self.rate_reset_spread exists + frame_bury 6 - // modules/actus_kernel.py:734 + // modules/actus_kernel.py:743 // if self.has_rate_reset_floor and rate < self.rate_reset_floor: intc_0 // 0 bytec 38 // "has_rate_reset_floor" @@ -5872,23 +6216,23 @@ _apply_non_cash_schedule_entry_after_if_else@6: assert // check self.has_rate_reset_floor exists bz _apply_non_cash_schedule_entry_after_if_else@55 intc_0 // 0 - bytec 29 // "rate_reset_floor" + bytec 30 // "rate_reset_floor" app_global_get_ex assert // check self.rate_reset_floor exists frame_dig 6 > bz _apply_non_cash_schedule_entry_after_if_else@55 - // modules/actus_kernel.py:735 + // modules/actus_kernel.py:744 // rate = self.rate_reset_floor intc_0 // 0 - bytec 29 // "rate_reset_floor" + bytec 30 // "rate_reset_floor" app_global_get_ex swap frame_bury 6 assert // check self.rate_reset_floor exists _apply_non_cash_schedule_entry_after_if_else@55: - // modules/actus_kernel.py:736 + // modules/actus_kernel.py:745 // if self.has_rate_reset_cap and rate > self.rate_reset_cap: intc_0 // 0 bytec 39 // "has_rate_reset_cap" @@ -5896,16 +6240,16 @@ _apply_non_cash_schedule_entry_after_if_else@55: assert // check self.has_rate_reset_cap exists bz _apply_non_cash_schedule_entry_after_if_else@58 intc_0 // 0 - bytec 30 // "rate_reset_cap" + bytec 31 // "rate_reset_cap" app_global_get_ex assert // check self.rate_reset_cap exists frame_dig 6 < bz _apply_non_cash_schedule_entry_after_if_else@58 - // modules/actus_kernel.py:737 + // modules/actus_kernel.py:746 // rate = self.rate_reset_cap intc_0 // 0 - bytec 30 // "rate_reset_cap" + bytec 31 // "rate_reset_cap" app_global_get_ex swap frame_bury 6 @@ -5934,7 +6278,7 @@ _apply_non_cash_schedule_entry_after_if_else@18: frame_dig -2 pushint 49 extract_uint64 - bytec_3 // "outstanding_principal" + bytec 4 // "outstanding_principal" dig 1 app_global_put // modules/actus_kernel.py:673 @@ -5954,6 +6298,48 @@ _apply_non_cash_schedule_entry_after_if_else@23: pushint 5 == bz _apply_non_cash_schedule_entry_after_if_else@30 + // modules/actus_kernel.py:684 + // self.schedule_entry_count - self.event_cursor + intc_0 // 0 + bytec_3 // "schedule_entry_count" + app_global_get_ex + assert // check self.schedule_entry_count exists + intc_0 // 0 + bytec_2 // "event_cursor" + app_global_get_ex + assert // check self.event_cursor exists + - + // modules/actus_kernel.py:686 + // * UInt64(cst.OP_UP_NON_CASH_PER_ENTRY_BUDGET) + pushint 100 + // modules/actus_kernel.py:683-686 + // + ( + // self.schedule_entry_count - self.event_cursor + // ) + // * UInt64(cst.OP_UP_NON_CASH_PER_ENTRY_BUDGET) + * + // modules/actus_kernel.py:682 + // UInt64(cst.OP_UP_NON_CASH_BASE_BUDGET) + intc 4 // 1500 + // modules/actus_kernel.py:682-686 + // UInt64(cst.OP_UP_NON_CASH_BASE_BUDGET) + // + ( + // self.schedule_entry_count - self.event_cursor + // ) + // * UInt64(cst.OP_UP_NON_CASH_PER_ENTRY_BUDGET) + + + // modules/actus_kernel.py:680-688 + // ensure_budget( + // required_budget=( + // UInt64(cst.OP_UP_NON_CASH_BASE_BUDGET) + // + ( + // self.schedule_entry_count - self.event_cursor + // ) + // * UInt64(cst.OP_UP_NON_CASH_PER_ENTRY_BUDGET) + // ), + // ) + intc_0 // 0 + callsub ensure_budget // modules/actus_kernel.py:490 // discount_factor = self.fixed_point_scale intc_0 // 0 @@ -6010,7 +6396,7 @@ _apply_non_cash_schedule_entry_while_top@36: // modules/actus_kernel.py:504 // while future_event_id < self.schedule_entry_count: intc_0 // 0 - bytec 4 // "schedule_entry_count" + bytec_3 // "schedule_entry_count" app_global_get_ex assert // check self.schedule_entry_count exists frame_dig 3 @@ -6119,7 +6505,7 @@ _apply_non_cash_schedule_entry_after_while@48: // modules/actus_kernel.py:524 // numerator = self.outstanding_principal intc_0 // 0 - bytec_3 // "outstanding_principal" + bytec 4 // "outstanding_principal" app_global_get_ex assert // check self.outstanding_principal exists // modules/actus_kernel.py:525 @@ -6154,10 +6540,10 @@ _apply_non_cash_schedule_entry_after_if_else@50: // ) frame_dig 1 callsub _scaled_mul_div - // modules/actus_kernel.py:680 + // modules/actus_kernel.py:689 // self.next_principal_redemption = self._recalculate_annuity_payment( bytec 14 // "next_principal_redemption" - // modules/actus_kernel.py:680-682 + // modules/actus_kernel.py:689-691 // self.next_principal_redemption = self._recalculate_annuity_payment( // entry // ) @@ -6165,7 +6551,7 @@ _apply_non_cash_schedule_entry_after_if_else@50: app_global_put _apply_non_cash_schedule_entry_after_if_else@30: - // modules/actus_kernel.py:685 + // modules/actus_kernel.py:694 // self.event_cursor += UInt64(1) intc_0 // 0 bytec_2 // "event_cursor" @@ -6176,20 +6562,20 @@ _apply_non_cash_schedule_entry_after_if_else@30: bytec_2 // "event_cursor" swap app_global_put - // modules/actus_kernel.py:686-690 + // modules/actus_kernel.py:695-699 // self._emit_execution_event( // entry=entry, // payoff=UInt64(0), // settled_amount=UInt64(0), // ) frame_dig -2 - // modules/actus_kernel.py:688 + // modules/actus_kernel.py:697 // payoff=UInt64(0), intc_0 // 0 - // modules/actus_kernel.py:689 + // modules/actus_kernel.py:698 // settled_amount=UInt64(0), dup - // modules/actus_kernel.py:686-690 + // modules/actus_kernel.py:695-699 // self._emit_execution_event( // entry=entry, // payoff=UInt64(0), @@ -6204,7 +6590,7 @@ _apply_non_cash_schedule_entry_after_if_else@30: retsub _apply_non_cash_schedule_entry_else_body@29: - // modules/actus_kernel.py:684 + // modules/actus_kernel.py:693 // self.next_principal_redemption = entry.next_principal_redemption frame_dig -2 pushint 41 @@ -6225,7 +6611,7 @@ _apply_non_cash_schedule_entry_else_body@20: // # IPCB keeps principal unchanged and only resets the interest base. // self.interest_calculation_base = self.outstanding_principal intc_0 // 0 - bytec_3 // "outstanding_principal" + bytec 4 // "outstanding_principal" app_global_get_ex assert // check self.outstanding_principal exists bytec 7 // "interest_calculation_base" @@ -6286,7 +6672,7 @@ _apply_non_cash_schedule_entry_else_body@14: // modules.actus_kernel.ActusKernelModule._emit_execution_event(entry: bytes, payoff: uint64, settled_amount: uint64) -> bytes: _emit_execution_event: - // modules/actus_kernel.py:696-702 + // modules/actus_kernel.py:705-711 // def _emit_execution_event( // self, // *, @@ -6295,44 +6681,44 @@ _emit_execution_event: // settled_amount: UInt64, // ) -> None: proto 3 1 - // modules/actus_kernel.py:706 + // modules/actus_kernel.py:715 // contract_id=Global.current_application_id.id, global CurrentApplicationID - // modules/actus_kernel.py:707 + // modules/actus_kernel.py:716 // event_id=entry.event_id, frame_dig -3 intc_0 // 0 extract_uint64 - // modules/actus_kernel.py:708 + // modules/actus_kernel.py:717 // event_type=entry.event_type, frame_dig -3 extract 8 1 - // modules/actus_kernel.py:709 + // modules/actus_kernel.py:718 // scheduled_time=entry.scheduled_time, frame_dig -3 extract 9 8 - // modules/actus_kernel.py:710 + // modules/actus_kernel.py:719 // applied_at=Global.latest_timestamp, global LatestTimestamp - // modules/actus_kernel.py:713 + // modules/actus_kernel.py:722 // self._payoff_sign(entry.event_type.as_uint64(), payoff) frame_dig -3 - // modules/actus_kernel.py:708 + // modules/actus_kernel.py:717 // event_type=entry.event_type, intc_2 // 8 - // modules/actus_kernel.py:713 + // modules/actus_kernel.py:722 // self._payoff_sign(entry.event_type.as_uint64(), payoff) getbyte - // modules/actus_kernel.py:742 + // modules/actus_kernel.py:751 // if payoff == UInt64(0): frame_dig -2 bnz _emit_execution_event_after_if_else@3 - // modules/actus_kernel.py:743 + // modules/actus_kernel.py:752 // return UInt64(enums.PAYOFF_SIGN_POSITIVE) intc_1 // 1 _emit_execution_event_after_inlined_modules.actus_kernel.ActusKernelModule._payoff_sign@7: - // modules/actus_kernel.py:712-714 + // modules/actus_kernel.py:721-723 // payoff_sign=arc4.UInt8( // self._payoff_sign(entry.event_type.as_uint64(), payoff) // ), @@ -6343,19 +6729,19 @@ _emit_execution_event_after_inlined_modules.actus_kernel.ActusKernelModule._payo <= assert // overflow extract 7 1 - // modules/actus_kernel.py:716 + // modules/actus_kernel.py:725 // currency_id=self.settlement_asset_id, intc_0 // 0 bytec 19 // "settlement_asset_id" app_global_get_ex assert // check self.settlement_asset_id exists - // modules/actus_kernel.py:717 + // modules/actus_kernel.py:726 // sequence=entry.event_id + UInt64(1), frame_dig 1 dup intc_1 // 1 + - // modules/actus_kernel.py:705-718 + // modules/actus_kernel.py:714-727 // ExecutionEvent( // contract_id=Global.current_application_id.id, // event_id=entry.event_id, @@ -6396,7 +6782,7 @@ _emit_execution_event_after_inlined_modules.actus_kernel.ActusKernelModule._payo swap itob concat - // modules/actus_kernel.py:704-719 + // modules/actus_kernel.py:713-728 // arc4.emit( // ExecutionEvent( // contract_id=Global.current_application_id.id, @@ -6422,7 +6808,7 @@ _emit_execution_event_after_inlined_modules.actus_kernel.ActusKernelModule._payo retsub _emit_execution_event_after_if_else@3: - // modules/actus_kernel.py:744 + // modules/actus_kernel.py:753 // if event_type in (UInt64(enums.EVT_IED), UInt64(enums.EVT_PI)): frame_dig 5 intc_1 // 1 @@ -6434,18 +6820,18 @@ _emit_execution_event_after_if_else@3: bz _emit_execution_event_after_if_else@6 _emit_execution_event_if_body@5: - // modules/actus_kernel.py:745 + // modules/actus_kernel.py:754 // return UInt64(enums.PAYOFF_SIGN_POSITIVE) intc_1 // 1 - // modules/actus_kernel.py:713 + // modules/actus_kernel.py:722 // self._payoff_sign(entry.event_type.as_uint64(), payoff) b _emit_execution_event_after_inlined_modules.actus_kernel.ActusKernelModule._payoff_sign@7 _emit_execution_event_after_if_else@6: - // modules/actus_kernel.py:746 + // modules/actus_kernel.py:755 // return UInt64(enums.PAYOFF_SIGN_NEGATIVE) pushint 255 - // modules/actus_kernel.py:713 + // modules/actus_kernel.py:722 // self._payoff_sign(entry.event_type.as_uint64(), payoff) b _emit_execution_event_after_inlined_modules.actus_kernel.ActusKernelModule._payoff_sign@7 diff --git a/smart_contracts/artifacts/d_asa/DASA.arc56.json b/smart_contracts/artifacts/d_asa/DASA.arc56.json index e0226b38..c02b060e 100644 --- a/smart_contracts/artifacts/d_asa/DASA.arc56.json +++ b/smart_contracts/artifacts/d_asa/DASA.arc56.json @@ -295,6 +295,44 @@ "type": "uint64" } ], + "ObservedCashEventRequest": [ + { + "name": "event_id", + "type": "uint64" + }, + { + "name": "event_type", + "type": "uint8" + }, + { + "name": "scheduled_time", + "type": "uint64" + }, + { + "name": "accrual_factor", + "type": "uint64" + }, + { + "name": "redemption_accrual_factor", + "type": "uint64" + }, + { + "name": "next_nominal_interest_rate", + "type": "uint64" + }, + { + "name": "next_principal_redemption", + "type": "uint64" + }, + { + "name": "next_outstanding_principal", + "type": "uint64" + }, + { + "name": "flags", + "type": "uint64" + } + ], "ObservedEventRequest": [ { "name": "event_id", @@ -878,6 +916,29 @@ ], "recommendations": {} }, + { + "name": "append_observed_cash_event", + "args": [ + { + "type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", + "struct": "ObservedCashEventRequest", + "name": "payload" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Append an arranger-authorized observed cash event to the schedule tail.", + "events": [], + "recommendations": {} + }, { "name": "contract_get_state", "args": [], @@ -1404,791 +1465,817 @@ "sourceInfo": [ { "pc": [ - 2601 + 2702 ], "errorMessage": "ACTUS event not yet executed" }, { "pc": [ - 2358 + 2460 ], "errorMessage": "Can not distribute zero units" }, { "pc": [ - 3102, - 3109, - 3481 + 3203, + 3210, + 3583 ], "errorMessage": "D-ASA already configured" }, { "pc": [ - 1238, - 1939, - 2318, - 2464, - 3733, - 3880, - 4226, - 4372 + 1309, + 2041, + 2420, + 2566, + 3800, + 3946, + 4297, + 4528, + 4674 ], "errorMessage": "D-ASA not configured" }, { "pc": [ - 3492 + 3594 ], "errorMessage": "D-ASA terms not configured" }, { "pc": [ - 6541 + 6863 ], "errorMessage": "Defaulted" }, { "pc": [ - 3120 + 3221 ], "errorMessage": "Denomination asset is not properly set" }, { "pc": [ - 3135 + 3236 ], "errorMessage": "Different settlement asset not supported, must be equal to denomination asset" }, { "pc": [ - 3370, - 3377, - 3379 + 3472, + 3479, + 3481 ], "errorMessage": "IED must be set in the future" }, { "pc": [ - 1256, - 2008, - 2479, - 5914 + 1327, + 2110, + 2581, + 4315, + 6215 ], "errorMessage": "IED not yet executed" }, { "pc": [ - 2371, - 5297 + 2473, + 5598 ], "errorMessage": "Insufficient remaining D-ASA units" }, { "pc": [ - 2574, - 2641 + 2676, + 2742 ], "errorMessage": "Insufficient sender units to transfer" }, { "pc": [ - 1835, - 3022, - 3040, - 3096, - 3603, - 3641, - 5482, - 5760, - 5820, - 6203 + 1937, + 3123, + 3141, + 3197, + 3674, + 3710, + 4362, + 5782, + 6060, + 6120, + 6523 ], "errorMessage": "Invalid ACTUS configuration" }, { "pc": [ - 1948, - 2352, - 2535, - 2550, - 2708, - 2781, - 2844, - 2886, - 5109, - 5234 + 2050, + 2454, + 2637, + 2652, + 2809, + 2882, + 2945, + 2987, + 5410, + 5535 ], "errorMessage": "Invalid account holding address" }, { "pc": [ - 4564, - 4588, - 4612, - 4636, - 4660, - 4717, - 4745, - 4767, - 4789, - 4811, - 4990, - 5008, - 5023, - 5038, - 5053 + 4865, + 4889, + 4913, + 4937, + 4961, + 5018, + 5046, + 5068, + 5090, + 5112, + 5291, + 5309, + 5324, + 5339, + 5354 ], "errorMessage": "Invalid account role address" }, { "pc": [ - 3082 + 3183 ], "errorMessage": "Invalid day-count convention ID" }, { "pc": [ - 1347, - 3755, - 4089, - 5792 + 1440, + 3821, + 4149, + 6092 ], "errorMessage": "Invalid event cursor" }, { "pc": [ - 3588, - 3654, - 3933, - 5398 + 3659, + 3722, + 3998, + 4339, + 5698 ], "errorMessage": "Invalid event id" }, { "pc": [ - 3768, - 4153, - 4160 + 3834, + 4213, + 4220, + 4352 ], "errorMessage": "Invalid event type" }, { "pc": [ - 4701, - 4980, - 6611 + 5002, + 5281, + 6933 ], "errorMessage": "Invalid role identifier" }, { "pc": [ - 3486, - 3666, - 3674, - 3989, - 5413, - 5429 + 3588, + 3734, + 3742, + 4051, + 4426, + 5713, + 5729 ], "errorMessage": "Invalid schedule page" }, { "pc": [ - 5345 + 5646 ], "errorMessage": "No D-ASA units" }, { "pc": [ - 1353, - 1864, - 2045, - 5801 + 1446, + 1966, + 2147, + 6101 ], "errorMessage": "No due cashflow to pay" }, { "pc": [ - 5883 + 6184 ], "errorMessage": "Not IED event" }, { "pc": [ - 1993, - 2326, - 2522, - 2698, - 2754, - 2764, - 2850, - 4188, - 4834, - 6533 + 2095, + 2428, + 2624, + 2799, + 2855, + 2865, + 2951, + 4248, + 5135, + 6855 ], "errorMessage": "Not authorized" }, { "pc": [ - 1474, - 1482, - 2094, - 2168, - 2177 + 1567, + 1575, + 2196, + 2270, + 2279 ], "errorMessage": "Not enough funds for the payment" }, { "pc": [ - 3905, - 3918 + 3971, + 3984, + 4324 ], "errorMessage": "Observed event required to execute this action" }, { "pc": [ - 2340, - 2388 + 2442, + 2490 ], "errorMessage": "Primary distribution is closed" }, { "pc": [ - 5832 + 6132 ], "errorMessage": "Primary distribution is not complete" }, { "pc": [ - 2563 + 2665 ], "errorMessage": "Sender and receiver must be different" }, { "pc": [ - 5095, - 6549 + 5396, + 6871 ], "errorMessage": "Suspended operations" }, { "pc": [ - 2275, - 3631 + 2377, + 3700, + 4384 ], "errorMessage": "Time events must be sorted in strictly ascending order" }, { "pc": [ - 2496, - 2513 + 2598, + 2615 ], "errorMessage": "Transfer is closed" }, { "pc": [ - 2567 + 2669 ], "errorMessage": "Transfer units must be greater than zero" }, { "pc": [ - 988 + 993 ], "errorMessage": "Wrong Global Bytes allocation" }, { "pc": [ - 994 + 999 ], "errorMessage": "Wrong Global UInts allocation" }, { "pc": [ - 998 + 1003 ], "errorMessage": "Wrong Local Bytes allocation" }, { "pc": [ - 1002 + 1007 ], "errorMessage": "Wrong Local UInts allocation" }, { "pc": [ - 1455, - 2087 + 1548, + 2189 ], "errorMessage": "account opted into asset" }, { "pc": [ - 6493, - 6508 + 6815, + 6830 ], "errorMessage": "check BoxMap entry exists" }, { "pc": [ - 1984, - 2022, - 2063, - 2101, - 2392, - 2570, - 2630, - 2656, - 5089, - 5255 + 2086, + 2124, + 2165, + 2203, + 2494, + 2672, + 2731, + 2757, + 5390, + 5556 ], "errorMessage": "check self.account entry exists" }, { "pc": [ - 1536, - 1762, - 1847, - 4283, - 5919, - 6222 + 1629, + 1861, + 1949, + 4585, + 6220, + 6543 ], "errorMessage": "check self.accrued_interest exists" }, { "pc": [ - 4852, - 6531 + 5153, + 6853 ], "errorMessage": "check self.arranger exists" }, { "pc": [ - 6539 + 6861 ], "errorMessage": "check self.asset_defaulted exists" }, { "pc": [ - 6547 + 6869 ], "errorMessage": "check self.asset_suspended exists" }, { "pc": [ - 3030, - 3475, - 3901, - 3913, - 4231, - 5644 + 3131, + 3577, + 3967, + 3979, + 4320, + 4533, + 5944 ], "errorMessage": "check self.contract_type exists" }, { "pc": [ - 1504, - 4288, - 5117, - 5195 + 1597, + 4590, + 5418, + 5496 ], "errorMessage": "check self.cumulative_interest_index exists" }, { "pc": [ - 1516, - 4293, - 5128, - 5203 + 1609, + 4595, + 5429, + 5504 ], "errorMessage": "check self.cumulative_principal_index exists" }, { "pc": [ - 5654 + 5954 ], "errorMessage": "check self.dynamic_principal_redemption exists" }, { "pc": [ - 1271, - 1284, - 1345, - 1586, - 2578, - 2591, - 3746, - 4082, - 4259, - 4376, - 4389, - 4426, - 5210, - 5790, - 5871, - 6103, - 6241 + 1365, + 1377, + 1438, + 1680, + 2680, + 2692, + 3813, + 4142, + 4561, + 4678, + 4690, + 4727, + 5511, + 6090, + 6172, + 6369, + 6424, + 6562 ], "errorMessage": "check self.event_cursor exists" }, { "pc": [ - 5143, - 5157, - 5350, - 5379, - 5710, - 5718, - 5745, - 5765, - 5954, - 6067, - 6228 + 5444, + 5458, + 5651, + 5680, + 6010, + 6018, + 6045, + 6065, + 6255, + 6388, + 6549 ], "errorMessage": "check self.fixed_point_scale exists" }, { "pc": [ - 5997 + 6298 ], "errorMessage": "check self.has_rate_reset_cap exists" }, { "pc": [ - 5970 + 6271 ], "errorMessage": "check self.has_rate_reset_floor exists" }, { "pc": [ - 3107, - 3491, - 4255, - 5888 + 3208, + 3593, + 4557, + 6189 ], "errorMessage": "check self.initial_exchange_amount exists" }, { "pc": [ - 2376, - 2386 + 2478, + 2488 ], "errorMessage": "check self.initial_exchange_date exists" }, { "pc": [ - 1707, - 4273, - 5686, - 5700 + 1805, + 4575, + 5986, + 6000 ], "errorMessage": "check self.interest_calculation_base exists" }, { "pc": [ - 1778, - 1793 + 1877, + 1892 ], "errorMessage": "check self.next_principal_redemption exists" }, { "pc": [ - 4278, - 5678, - 5705, - 5750 + 4580, + 5978, + 6005, + 6050 ], "errorMessage": "check self.nominal_interest_rate exists" }, { "pc": [ - 1953, - 1966 + 2055, + 2068 ], "errorMessage": "check self.op_daemon exists" }, { "pc": [ - 1607, - 1674, - 1699, - 1752, - 1803, - 1811, - 1832, - 4268, - 6207, - 6287 + 1702, + 1771, + 1797, + 1851, + 1903, + 1912, + 1934, + 4570, + 6528, + 6609 ], "errorMessage": "check self.outstanding_principal exists" }, { "pc": [ - 6005, - 6019 + 6306, + 6320 ], "errorMessage": "check self.rate_reset_cap exists" }, { "pc": [ - 5978, - 5992 + 6279, + 6293 ], "errorMessage": "check self.rate_reset_floor exists" }, { "pc": [ - 5949 + 6250 ], "errorMessage": "check self.rate_reset_multiplier exists" }, { "pc": [ - 6321 + 6643 ], "errorMessage": "check self.rate_reset_next exists" }, { "pc": [ - 5962 + 6263 ], "errorMessage": "check self.rate_reset_spread exists" }, { "pc": [ - 1460, - 2163, - 4298 + 1553, + 2265, + 4600 ], "errorMessage": "check self.reserved_interest exists" }, { "pc": [ - 1465, - 1494, - 2173, - 2188, - 4303 + 1558, + 1587, + 2275, + 2290, + 4605 ], "errorMessage": "check self.reserved_principal exists" }, { "pc": [ - 2363, - 2411, - 4250, - 5292, - 5825 + 2465, + 2513, + 4552, + 5593, + 6125 ], "errorMessage": "check self.reserved_units_total exists" }, { "pc": [ - 1276, - 2583, - 3751, - 3931, - 3949, - 4072, - 4264, - 4381, - 5394, - 6112 + 1369, + 2684, + 3817, + 3996, + 4013, + 4133, + 4334, + 4369, + 4388, + 4508, + 4565, + 4682, + 5694, + 6365, + 6432 ], "errorMessage": "check self.schedule_entry_count exists" }, { "pc": [ - 3979 + 4041, + 4416 ], "errorMessage": "check self.schedule_page entry exists" }, { "pc": [ - 1452, - 2053, - 2081, - 6393 + 1545, + 2155, + 2183, + 6715 ], "errorMessage": "check self.settlement_asset_id exists" }, { "pc": [ - 1237, - 1251, - 1938, - 2003, - 2317, - 2336, - 2463, - 2474, - 2758, - 3100, - 3479, - 3732, - 3879, - 4224, - 4371, - 5238, - 5816, - 5909 + 1308, + 1322, + 2040, + 2105, + 2419, + 2438, + 2565, + 2576, + 2859, + 3201, + 3581, + 3799, + 3945, + 4296, + 4310, + 4526, + 4673, + 5539, + 6116, + 6210 ], "errorMessage": "check self.status exists" }, { "pc": [ - 2369, - 2422, - 4245, - 5343, - 5374, - 5830 + 2471, + 2524, + 4547, + 5644, + 5675, + 6130 ], "errorMessage": "check self.total_units exists" }, { "pc": [ - 2501, - 2511 + 2603, + 2613 ], "errorMessage": "check self.transfer_closure_date exists" }, { "pc": [ - 2484, - 2492 + 2586, + 2594 ], "errorMessage": "check self.transfer_opening_date exists" }, { "pc": [ - 3565, - 3624 + 3636, + 3693 ], "errorMessage": "index access is out of bounds" }, { "pc": [ - 1922, - 2967, - 3449, - 3984 + 2024, + 3068, + 3551, + 4046, + 4421 ], "errorMessage": "invalid array length header" }, { "pc": [ - 2688, - 3437, - 4824 + 2789, + 3539, + 5125 ], "errorMessage": "invalid number of bytes for arc4.bool" }, { "pc": [ - 1930 + 2032 ], "errorMessage": "invalid number of bytes for arc4.dynamic_array" }, { "pc": [ - 3464 + 3566 ], "errorMessage": "invalid number of bytes for arc4.dynamic_array" }, { "pc": [ - 1916, - 2301, - 2441, - 2449, - 2680, - 2738, - 2746, - 2826, - 2834, - 2877, - 2902, - 4445, - 4469, - 4503, - 4684, - 4866, - 4950 + 2018, + 2403, + 2543, + 2551, + 2781, + 2839, + 2847, + 2927, + 2935, + 2978, + 3003, + 4746, + 4770, + 4804, + 4985, + 5167, + 5251 ], "errorMessage": "invalid number of bytes for arc4.static_array" }, { "pc": [ - 1232, - 2259, - 2268, - 2309, - 2458, - 3427, - 3864 + 1303, + 2361, + 2370, + 2411, + 2560, + 3529, + 3930 ], "errorMessage": "invalid number of bytes for arc4.uint64" }, { "pc": [ - 4493, - 4674, - 4940 + 4794, + 4975, + 5241 ], "errorMessage": "invalid number of bytes for arc4.uint8" }, { "pc": [ - 2939 + 3040 ], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.InitialKernelState" }, { "pc": [ - 2928 + 3029 ], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.NormalizedActusTerms" }, { "pc": [ - 3875 + 4292 + ], + "errorMessage": "invalid number of bytes for smart_contracts.abi_types.ObservedCashEventRequest" + }, + { + "pc": [ + 3941 ], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.ObservedEventRequest" }, { "pc": [ - 2972 + 3073 ], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.Prospectus" }, { "pc": [ - 4514 + 4815 ], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.RoleValidity" }, { "pc": [ - 2956 + 3057 ], "errorMessage": "invalid tail pointer at index 1 of (uint8[32],(len+utf8[]))" }, { "pc": [ - 2951 + 3052 ], "errorMessage": "invalid tuple encoding" }, { "pc": [ - 4051 + 4113, + 4488 ], "errorMessage": "max array length exceeded" }, { "pc": [ - 4237, - 6385 + 4539, + 6707 ], "errorMessage": "overflow" } @@ -2201,11 +2288,11 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCAzMgogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1ICJzdGF0dXMiICJldmVudF9jdXJzb3IiICJvdXRzdGFuZGluZ19wcmluY2lwYWwiICJzY2hlZHVsZV9lbnRyeV9jb3VudCIgImZpeGVkX3BvaW50X3NjYWxlIiAiYWNjcnVlZF9pbnRlcmVzdCIgImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMgIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIgInJlc2VydmVkX3VuaXRzX3RvdGFsIiAicmVzZXJ2ZWRfcHJpbmNpcGFsIiAiY29udHJhY3RfdHlwZSIgInRvdGFsX3VuaXRzIiAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIgInJlc2VydmVkX2ludGVyZXN0IiAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIgImN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IiAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMgInNldHRsZW1lbnRfYXNzZXRfaWQiICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIgMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMgMHg1MjIzNTA3MjY5NmQ2MTcyNzk0NDY1NjE2YzY1NzIyMyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMgMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzIDB4NTIyMzRmNzA0NDYxNjU2ZDZmNmUyMyAiaW5pdGlhbF9leGNoYW5nZV9kYXRlIiAidHJhbnNmZXJfb3BlbmluZ19kYXRlIiAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIiAicmF0ZV9yZXNldF9mbG9vciIgInJhdGVfcmVzZXRfY2FwIiAweDUzMjMgMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMyAiYXNzZXRfc3VzcGVuZGVkIiAiZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiIgInJhdGVfcmVzZXRfc3ByZWFkIiAicmF0ZV9yZXNldF9tdWx0aXBsaWVyIiAicmF0ZV9yZXNldF9uZXh0IiAiaGFzX3JhdGVfcmVzZXRfZmxvb3IiICJoYXNfcmF0ZV9yZXNldF9jYXAiIDB4MDAgImFzc2V0X2RlZmF1bHRlZCIgInByb3NwZWN0dXNfaGFzaCIgInByb3NwZWN0dXNfdXJsIiAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIiAibWF0dXJpdHlfZGF0ZSIgImRheV9jb3VudF9jb252ZW50aW9uIiAweDA2ODEwMQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4LTI5CiAgICAvLyAjIFJCQUMgUm9sZXMKICAgIC8vIHNlbGYuYXJyYW5nZXIgPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX0FSUkFOR0VSKQogICAgYnl0ZWMgMTggLy8gMHg1MjIzNDE3MjcyNjE2ZTY3NjU3MjIzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzAKICAgIC8vIHNlbGYub3BfZGFlbW9uID0gR2xvYmFsU3RhdGUoQWNjb3VudCgpLCBrZXk9Y3N0LlBSRUZJWF9JRF9PUF9EQUVNT04pCiAgICBieXRlYyAyNSAvLyAweDUyMjM0ZjcwNDQ2MTY1NmQ2ZjZlMjMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo0Ny00OAogICAgLy8gIyBELUFTQSBHb3Zlcm5hbmNlCiAgICAvLyBzZWxmLmFzc2V0X3N1c3BlbmRlZCA9IEZhbHNlCiAgICBieXRlYyAzMyAvLyAiYXNzZXRfc3VzcGVuZGVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NDkKICAgIC8vIHNlbGYuYXNzZXRfZGVmYXVsdGVkID0gRmFsc2UKICAgIGJ5dGVjIDQxIC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU2LTU3CiAgICAvLyAjIENvbnRyYWN0CiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMTIgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwLTYxCiAgICAvLyAjIFByb3NwZWN0dXMgKEluZm9ybWF0aW9uYWwpCiAgICAvLyBzZWxmLnByb3NwZWN0dXNfaGFzaCA9IEJ5dGVzKCkKICAgIGJ5dGVjIDQyIC8vICJwcm9zcGVjdHVzX2hhc2giCiAgICBwdXNoYnl0ZXMgMHgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MgogICAgLy8gc2VsZi5wcm9zcGVjdHVzX3VybCA9IFN0cmluZygpCiAgICBieXRlYyA0MyAvLyAicHJvc3BlY3R1c191cmwiCiAgICBwdXNoYnl0ZXMgIiIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NC02NQogICAgLy8gIyBEZW5vbWluYXRpb24KICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gQXNzZXQoKQogICAgYnl0ZWMgNDQgLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjYKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCA9IEFzc2V0KCkKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OC02OQogICAgLy8gIyBUaW1lCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgMjYgLy8gImluaXRpYWxfZXhjaGFuZ2VfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzAKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgNDUgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxCiAgICAvLyBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgMjcgLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIKICAgIC8vIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlID0gdHlwLlRpbWVTdGFtcCgpCiAgICBieXRlYyAyOCAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NC03NQogICAgLy8gIyBEYXkgQ291bnQgQ29udmVudGlvbgogICAgLy8gc2VsZi5kYXlfY291bnRfY29udmVudGlvbiA9IFVJbnQ2NCgpCiAgICBieXRlYyA0NiAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc3LTc4CiAgICAvLyAjIFVuaXRzCiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzID0gVUludDY0KCkKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPSBVSW50NjQoKQogICAgYnl0ZWMgMTAgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MS04MgogICAgLy8gIyBQcmluY2lwYWwKICAgIC8vIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPSBVSW50NjQoKQogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MwogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBVSW50NjQoKQogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NAogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gVUludDY0KCkKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NQogICAgLy8gc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gRmFsc2UKICAgIGJ5dGVjIDM0IC8vICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4Ny04OAogICAgLy8gIyBJbnRlcmVzdAogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gVUludDY0KCkKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg5CiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgPSBVSW50NjQoKQogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTEtOTIKICAgIC8vICMgSW50ZXJlc3QgUmF0ZXMKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTMKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQgPSBVSW50NjQoKQogICAgYnl0ZWMgMzUgLy8gInJhdGVfcmVzZXRfc3ByZWFkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NAogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIgPSBVSW50NjQoKQogICAgYnl0ZWMgMzYgLy8gInJhdGVfcmVzZXRfbXVsdGlwbGllciIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTUKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9mbG9vciA9IFVJbnQ2NCgpCiAgICBieXRlYyAyOSAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTYKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9jYXAgPSBVSW50NjQoKQogICAgYnl0ZWMgMzAgLy8gInJhdGVfcmVzZXRfY2FwIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NwogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X25leHQgPSBVSW50NjQoKQogICAgYnl0ZWMgMzcgLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTgKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgPSBGYWxzZQogICAgYnl0ZWMgMzggLy8gImhhc19yYXRlX3Jlc2V0X2Zsb29yIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OQogICAgLy8gc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgPSBGYWxzZQogICAgYnl0ZWMgMzkgLy8gImhhc19yYXRlX3Jlc2V0X2NhcCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAxLTEwMgogICAgLy8gIyBQcmltYXJ5IERpc3RyaWJ1dGlvbgogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgPSBVSW50NjQoKQogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAzCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0ID0gVUludDY0KCkKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA1LTEwNgogICAgLy8gIyBDdW11bGF0aXZlIFBlci1Vbml0IEZpeGVkLVBvaW50IEluZGV4ZXMKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4ID0gVUludDY0KCkKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1CiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciA9IFVJbnQ2NCgpCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNgogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA9IFVJbnQ2NCgpCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE4LTExOQogICAgLy8gIyBTY2FsaW5nCiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlID0gVUludDY0KCkKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6MjMKICAgIC8vIGFzc2VydCBUeG4uZ2xvYmFsX251bV9ieXRlX3NsaWNlID09IGNmZy5HTE9CQUxfQllURVMsIGVyci5XUk9OR19HTE9CQUxfQllURVMKICAgIHR4biBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgQnl0ZXMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjI0CiAgICAvLyBhc3NlcnQgVHhuLmdsb2JhbF9udW1fdWludCA9PSBjZmcuR0xPQkFMX1VJTlRTLCBlcnIuV1JPTkdfR0xPQkFMX1VJTlRTCiAgICB0eG4gR2xvYmFsTnVtVWludAogICAgcHVzaGludCAzNwogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgVUludHMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBhc3NlcnQgVHhuLmxvY2FsX251bV9ieXRlX3NsaWNlID09IGNmZy5MT0NBTF9CWVRFUywgZXJyLldST05HX0xPQ0FMX0JZVEVTCiAgICB0eG4gTG9jYWxOdW1CeXRlU2xpY2UKICAgICEKICAgIGFzc2VydCAvLyBXcm9uZyBMb2NhbCBCeXRlcyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6MjYKICAgIC8vIGFzc2VydCBUeG4ubG9jYWxfbnVtX3VpbnQgPT0gY2ZnLkxPQ0FMX1VJTlRTLCBlcnIuV1JPTkdfTE9DQUxfVUlOVFMKICAgIHR4biBMb2NhbE51bVVpbnQKICAgICEKICAgIGFzc2VydCAvLyBXcm9uZyBMb2NhbCBVSW50cyBhbGxvY2F0aW9uCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kX2FzYS9jb250cmFjdC5weTo4LTE4CiAgICAvLyBjbGFzcyBEQVNBKAogICAgLy8gICAgIFBheW1lbnRBZ2VudCwKICAgIC8vICAgICBUcmFuc2ZlckFnZW50LAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gICAgIGF2bV92ZXJzaW9uPTEyLAogICAgLy8gKToKICAgIHB1c2hieXRlcyAweDkxNGYwNGViIC8vIG1ldGhvZCAiY29udHJhY3RfdXBkYXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9jb250cmFjdF91cGRhdGVfcm91dGVANAoKbWFpbl9zd2l0Y2hfY2FzZV9uZXh0QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6OC0xOAogICAgLy8gY2xhc3MgREFTQSgKICAgIC8vICAgICBQYXltZW50QWdlbnQsCiAgICAvLyAgICAgVHJhbnNmZXJBZ2VudCwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBhdm1fdmVyc2lvbj0xMiwKICAgIC8vICk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBieiBtYWluX2NyZWF0ZV9Ob09wQDMxCiAgICBwdXNoYnl0ZXNzIDB4YjQ0NjE4YzggMHhlNzgzMjUyOSAweDk0Mzg4NzIzIDB4NmM4NWUzZWUgMHhiZGQxYTk0NCAweDdjMGYxODEyIDB4MTRmYzEwZWYgMHg3NGE3Mjk3ZiAweDA5ZDRmZTE0IDB4OWE5YmZhODUgMHg4NWVlZDMzZCAweGFiMmMwZmM0IDB4ZDlmMjI1YWMgMHg4ZWE2ZTc0YyAweDAyYWY1NTdhIDB4ODJmNzFiMmQgMHhlZjA0ZjVkMyAweGRmMzQzNTUwIDB4M2RiZTgwYmQgMHgxZTNlNDhlNyAweDAxMGM4Mjk5IDB4NzQwNmFjZDIgMHgxYTcyYTJlZSAvLyBtZXRob2QgImZ1bmRfZHVlX2Nhc2hmbG93cyh1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJjbGFpbV9kdWVfY2FzaGZsb3dzKGFkZHJlc3MsYnl0ZVtdKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYnl0ZVtdKSIsIG1ldGhvZCAidHJhbnNmZXJfc2V0X3NjaGVkdWxlKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbihhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInRyYW5zZmVyKGFkZHJlc3MsYWRkcmVzcyx1aW50NjQpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X3N1c3BlbnNpb24oYWRkcmVzcyxib29sKXVpbnQ2NCIsIG1ldGhvZCAiYWNjb3VudF9vcGVuKGFkZHJlc3MsYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgImFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzcyhhZGRyZXNzLGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X2dldF9wb3NpdGlvbihhZGRyZXNzKShhZGRyZXNzLHVpbnQ2NCx1aW50NjQsYm9vbCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAiY29udHJhY3RfY29uZmlnKCh1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxib29sLGJvb2wsYm9vbCx1aW50NjQpLCh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCksKGJ5dGVbMzJdLHN0cmluZykpdWludDY0IiwgbWV0aG9kICJjb250cmFjdF9zY2hlZHVsZSh1aW50NjQsYm9vbCwodWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NClbXSl1aW50NjQiLCBtZXRob2QgImNvbnRyYWN0X2V4ZWN1dGVfaWVkKCl1aW50NjQiLCBtZXRob2QgImFwcGx5X25vbl9jYXNoX2V2ZW50KHVpbnQ2NCwodWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIsIG1ldGhvZCAiY29udHJhY3RfZ2V0X3N0YXRlKCkodWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudCgpKHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJyYmFjX3JvdGF0ZV9hcnJhbmdlcihhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19zZXRfb3BfZGFlbW9uKGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX2Fzc2lnbl9yb2xlKHVpbnQ4LGFkZHJlc3MsKHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19yZXZva2Vfcm9sZSh1aW50OCxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19jb250cmFjdF9zdXNwZW5zaW9uKGJvb2wpdWludDY0IiwgbWV0aG9kICJyYmFjX2dldF9hcnJhbmdlcigpYWRkcmVzcyIsIG1ldGhvZCAicmJhY19nZXRfYWRkcmVzc19yb2xlcyhhZGRyZXNzKShib29sLGJvb2wsYm9vbCxib29sLGJvb2wpIiwgbWV0aG9kICJyYmFjX2dldF9yb2xlX3ZhbGlkaXR5KHVpbnQ4LGFkZHJlc3MpKHVpbnQ2NCx1aW50NjQpIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggZnVuZF9kdWVfY2FzaGZsb3dzIGNsYWltX2R1ZV9jYXNoZmxvd3MgdHJhbnNmZXJfc2V0X3NjaGVkdWxlIHByaW1hcnlfZGlzdHJpYnV0aW9uIHRyYW5zZmVyIGFjY291bnRfc3VzcGVuc2lvbiBhY2NvdW50X29wZW4gYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzIGFjY291bnRfZ2V0X3Bvc2l0aW9uIGNvbnRyYWN0X2NvbmZpZyBjb250cmFjdF9zY2hlZHVsZSBjb250cmFjdF9leGVjdXRlX2llZCBhcHBseV9ub25fY2FzaF9ldmVudCBjb250cmFjdF9nZXRfc3RhdGUgY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50IHJiYWNfcm90YXRlX2FycmFuZ2VyIHJiYWNfc2V0X29wX2RhZW1vbiByYmFjX2Fzc2lnbl9yb2xlIHJiYWNfcmV2b2tlX3JvbGUgcmJhY19jb250cmFjdF9zdXNwZW5zaW9uIHJiYWNfZ2V0X2FycmFuZ2VyIHJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXMgcmJhY19nZXRfcm9sZV92YWxpZGl0eQogICAgZXJyCgptYWluX2NyZWF0ZV9Ob09wQDMxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjgtMTgKICAgIC8vIGNsYXNzIERBU0EoCiAgICAvLyAgICAgUGF5bWVudEFnZW50LAogICAgLy8gICAgIFRyYW5zZmVyQWdlbnQsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyAgICAgYXZtX3ZlcnNpb249MTIsCiAgICAvLyApOgogICAgcHVzaGJ5dGVzIDB4OTU2ZDcxNTYgLy8gbWV0aG9kICJjb250cmFjdF9jcmVhdGUoYWRkcmVzcyl1aW50NjQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBjb250cmFjdF9jcmVhdGUKICAgIGVycgoKbWFpbl9jb250cmFjdF91cGRhdGVfcm91dGVANDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgNCAvLyBVcGRhdGVBcHBsaWNhdGlvbgogICAgPT0KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0CiAgICBiIGNvbnRyYWN0X3VwZGF0ZQoKCi8vIG1vZHVsZXMucGF5bWVudF9hZ2VudC5QYXltZW50QWdlbnQuZnVuZF9kdWVfY2FzaGZsb3dzW3JvdXRpbmddKCkgLT4gdm9pZDoKZnVuZF9kdWVfY2FzaGZsb3dzOgogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAxMAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQ2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NTAKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjUxCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjUyCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo1NQogICAgLy8gcHJvY2Vzc2VkX2V2ZW50cyA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo1Ni01NwogICAgLy8gZnVuZGVkX2ludGVyZXN0ID0gVUludDY0KDApCiAgICAvLyBmdW5kZWRfcHJpbmNpcGFsID0gVUludDY0KDApCiAgICBkdXBuIDIKCmZ1bmRfZHVlX2Nhc2hmbG93c193aGlsZV90b3BAMjoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2MAogICAgLy8gcHJvY2Vzc2VkX2V2ZW50cyA8IG1heF9ldmVudF9jb3VudAogICAgZGlnIDIKICAgIGRpZyA0CiAgICA8CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjAtNjEKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgPCBtYXhfZXZlbnRfY291bnQKICAgIC8vIGFuZCBzZWxmLmV2ZW50X2N1cnNvciA8IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQKICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl93aGlsZUA5CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjEKICAgIC8vIGFuZCBzZWxmLmV2ZW50X2N1cnNvciA8IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgPAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjYwLTYxCiAgICAvLyBwcm9jZXNzZWRfZXZlbnRzIDwgbWF4X2V2ZW50X2NvdW50CiAgICAvLyBhbmQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAOQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjYzCiAgICAvLyBlbnRyeSA9IHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLmV2ZW50X2N1cnNvcikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICBkdXAKICAgIGJ1cnkgMTcKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2NAogICAgLy8gaWYgZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcDoKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSA2CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDkKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2NgogICAgLy8gaWYgbm90IHNlbGYuX2V2ZW50X2lzX2Nhc2goZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSk6CiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ1cnkgMTYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM1MQogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUCksCiAgICBpbnRjXzIgLy8gOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzUwLTM1NAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfTUQpLAogICAgLy8gKQogICAgPT0KICAgIGR1cAogICAgYnVyeSA3CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfdHJ1ZUA1MAogICAgZGlnIDE0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNTIKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNTAtMzU0CiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9NRCksCiAgICAvLyApCiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX3RydWVANTAKICAgIGRpZyAxNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzUzCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX01EKSwKICAgIHB1c2hpbnQgMTkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM1MC0zNTQKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX01EKSwKICAgIC8vICkKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUA1MQoKZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfdHJ1ZUA1MDoKICAgIGludGNfMSAvLyAxCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUA1MjoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2NgogICAgLy8gaWYgbm90IHNlbGYuX2V2ZW50X2lzX2Nhc2goZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSk6CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAOQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTQ4CiAgICAvLyBhc3NlcnQgZW50cnkuZXZlbnRfaWQgPT0gc2VsZi5ldmVudF9jdXJzb3IsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgZGlnIDE1CiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGN1cnNvcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTQ5CiAgICAvLyBhc3NlcnQgZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsIGVyci5OT19EVUVfQ0FTSEZMT1cKICAgIGRpZyA0CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA8PQogICAgYXNzZXJ0IC8vIE5vIGR1ZSBjYXNoZmxvdyB0byBwYXkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQxMwogICAgLy8gaWYgZXZlbnRfdHlwZSBub3QgaW4gKFVJbnQ2NChlbnVtcy5FVlRfSVApLCBVSW50NjQoZW51bXMuRVZUX01EKSk6CiAgICBkaWcgNQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDEzCiAgICBkaWcgMTQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQxNAogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTMKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9pbnRlcmVzdF9hbW91bnRAMTQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MjYKICAgIC8vIGV2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ1cnkgMTYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQyNwogICAgLy8gaWYgZXZlbnRfdHlwZSBub3QgaW4gKFVJbnQ2NChlbnVtcy5FVlRfUFIpLCBVSW50NjQoZW51bXMuRVZUX01EKSk6CiAgICBwdXNoaW50IDMKICAgID09CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTcKICAgIGRpZyAxNAogICAgcHVzaGludCAxOQogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDI4CiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyNjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MwogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZGlnIDE1CiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnVyeSAxMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTU2CiAgICAvLyBpZiBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKToKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDI3CiAgICBkaWcgOQogICAgYnVyeSAxMQoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzY6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzItNTc0CiAgICAvLyAjIEZ1bmRpbmcgdXNlcyBwZXItdW5pdCBjdW11bGF0aXZlIGluZGljZXMgc28gZWFjaCBob2xkZXIgY2FuIHNldHRsZQogICAgLy8gIyBpbmRlcGVuZGVudGx5IGZyb20gaXRzIGN1cnJlbnQgdW5pdCBiYWxhbmNlLgogICAgLy8gaW50ZXJlc3RfaW5kZXhfZGVsdGEgPSBzZWxmLl9hbW91bnRfdG9faW5kZXhfZGVsdGEoaW50ZXJlc3RfYW1vdW50X2R1ZSkKICAgIGRpZyAxMgogICAgY2FsbHN1YiBfYW1vdW50X3RvX2luZGV4X2RlbHRhCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzUKICAgIC8vIHByaW5jaXBhbF9pbmRleF9kZWx0YSA9IHNlbGYuX2Ftb3VudF90b19pbmRleF9kZWx0YShwcmluY2lwYWxfYW1vdW50X2R1ZSkKICAgIGRpZyA4CiAgICBjYWxsc3ViIF9hbW91bnRfdG9faW5kZXhfZGVsdGEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU3NgogICAgLy8gaW50ZXJlc3RfYW1vdW50ID0gc2VsZi5faW5kZXhfZGVsdGFfdG9fYW1vdW50KGludGVyZXN0X2luZGV4X2RlbHRhKQogICAgZGlnIDEKICAgIGNhbGxzdWIgX2luZGV4X2RlbHRhX3RvX2Ftb3VudAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBidXJ5IDE3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzcKICAgIC8vIHByaW5jaXBhbF9hbW91bnQgPSBzZWxmLl9pbmRleF9kZWx0YV90b19hbW91bnQocHJpbmNpcGFsX2luZGV4X2RlbHRhKQogICAgZHVwCiAgICBjYWxsc3ViIF9pbmRleF9kZWx0YV90b19hbW91bnQKICAgIGR1cAogICAgYnVyeSAxMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTc4CiAgICAvLyByZXF1aXJlZF9hbW91bnQgPSBpbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50CiAgICBkaWcgMgogICAgZGlnIDEKICAgICsKICAgIGR1cAogICAgYnVyeSAxMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzI3CiAgICAvLyBiYWxhbmNlID0gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYXNzZXJ0IC8vIGFjY291bnQgb3B0ZWQgaW50byBhc3NldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDU2CiAgICAvLyByZXR1cm4gc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCArIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX2ludGVyZXN0IGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIGV4aXN0cwogICAgZGlnIDEKICAgICsKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcyOQogICAgLy8gYXNzZXJ0IGJhbGFuY2UgPj0gcmVzZXJ2ZWRfdG90YWwsIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBkaWcgMgogICAgZGlnIDEKICAgID49CiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcyBmb3IgdGhlIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjczMAogICAgLy8gcmV0dXJuIGJhbGFuY2UgLSByZXNlcnZlZF90b3RhbAogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICAtCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1ODAKICAgIC8vIHNlbGYuX2F2YWlsYWJsZV9zZXR0bGVtZW50X2Z1bmRzKCkgPj0gcmVxdWlyZWRfYW1vdW50CiAgICB1bmNvdmVyIDIKICAgID49CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzktNTgxCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuX2F2YWlsYWJsZV9zZXR0bGVtZW50X2Z1bmRzKCkgPj0gcmVxdWlyZWRfYW1vdW50CiAgICAvLyApLCBlcnIuTk9UX0VOT1VHSF9GVU5EUwogICAgYXNzZXJ0IC8vIE5vdCBlbm91Z2ggZnVuZHMgZm9yIHRoZSBwYXltZW50CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1ODMKICAgIC8vIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgKz0gaW50ZXJlc3RfYW1vdW50CiAgICB1bmNvdmVyIDMKICAgICsKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1ODQKICAgIC8vIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsICs9IHByaW5jaXBhbF9hbW91bnQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgICsKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTg1CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggKz0gaW50ZXJlc3RfaW5kZXhfZGVsdGEKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IGV4aXN0cwogICAgdW5jb3ZlciAyCiAgICArCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1ODYKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggKz0gcHJpbmNpcGFsX2luZGV4X2RlbHRhCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTcgLy8gImN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IGV4aXN0cwogICAgKwogICAgYnl0ZWMgMTcgLy8gImN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4NwogICAgLy8gaWYgZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSA9PSBVSW50NjQoZW51bXMuRVZUX1BSKToKICAgIGRpZyAxNQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19lbHNlX2JvZHlAMzgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4OC01ODkKICAgIC8vICMgRm9yIFBSLCB0aGUgcGVyaW9kIGludGVyZXN0IHN0YXlzIGFjY3J1ZWQgdW50aWwgYSBsYXRlciBJUCBvciBNRC4KICAgIC8vIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCArPSBzZWxmLl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KGVudHJ5KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgIGRpZyAxNgogICAgY2FsbHN1YiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudAogICAgYnVyeSAxOAogICAgKwogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzOToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5MgogICAgLy8gaWYgbm90IHNlbGYuX2lzX2R5bmFtaWNfYW5udWl0eSgpIG9yIGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkgPT0gVUludDY0KAogICAgY2FsbHN1YiBfaXNfZHluYW1pY19hbm51aXR5CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUA0MQogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTkyLTU5NAogICAgLy8gaWYgbm90IHNlbGYuX2lzX2R5bmFtaWNfYW5udWl0eSgpIG9yIGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkgPT0gVUludDY0KAogICAgLy8gICAgIGVudW1zLkVWVF9NRAogICAgLy8gKToKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0MgoKZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlANDE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTUKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IGVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGRpZyAxNQogICAgcHVzaGludCA0MQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTk2CiAgICAvLyBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9IG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBkaWcgMTAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTcKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IG5leHRfaW50ZXJlc3RfYmFzZQogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGRpZyAxMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5OAogICAgLy8gc2VsZi5ldmVudF9jdXJzb3IgKz0gVUludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAwCiAgICAvLyBpZiBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoCiAgICBkaWcgMTUKICAgIGV4dHJhY3QgOCAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MDAtNjAyCiAgICAvLyBpZiBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoCiAgICAvLyAgICAgZW51bXMuRVZUX01ECiAgICAvLyApIGFuZCBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9PSBVSW50NjQoMCk6CiAgICBwdXNoYnl0ZXMgMHgxMwogICAgYj09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0NQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAyCiAgICAvLyApIGFuZCBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9PSBVSW50NjQoMCk6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwMC02MDIKICAgIC8vIGlmIGVudHJ5LmV2ZW50X3R5cGUgPT0gYXJjNC5VSW50OCgKICAgIC8vICAgICBlbnVtcy5FVlRfTUQKICAgIC8vICkgYW5kIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID09IFVJbnQ2NCgwKToKICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0NQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAzCiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbnVtcy5TVEFUVVNfRU5ERUQpCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBwdXNoaW50IDIwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwNAogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gVUludDY0KDApCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0NToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwNi02MTAKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1pbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50LAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PWludGVyZXN0X2Ftb3VudCArIHByaW5jaXBhbF9hbW91bnQsCiAgICAvLyApCiAgICBkaWcgMTUKICAgIGRpZyA3CiAgICBkdXAKICAgIGNhbGxzdWIgX2VtaXRfZXhlY3V0aW9uX2V2ZW50CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3MAogICAgLy8gZnVuZGVkX2ludGVyZXN0ICs9IGludGVyZXN0X2Ftb3VudAogICAgZGlnIDEKICAgIGRpZyAxNAogICAgKwogICAgYnVyeSAyCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzEKICAgIC8vIGZ1bmRlZF9wcmluY2lwYWwgKz0gcHJpbmNpcGFsX2Ftb3VudAogICAgZHVwCiAgICBkaWcgOQogICAgKwogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzIKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgKz0gVUludDY0KDEpCiAgICBkaWcgMgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMwogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3Nfd2hpbGVfdG9wQDIKCmZ1bmRfZHVlX2Nhc2hmbG93c19lbHNlX2JvZHlAMzg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTEKICAgIC8vIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzOQoKZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlAMjc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTcKICAgIC8vIGV2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ1cnkgMTYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1OC01NjAKICAgIC8vICMgRHluYW1pYyBhbm51aXRpZXMgZGVyaXZlIG5leHQgc3RhdGUgZnJvbSB0aGUgcGF5bWVudCBkZWNvbXBvc2l0aW9uLAogICAgLy8gIyBub3Qgb25seSBmcm9tIHRoZSBwcmVjb21wdXRlZCBgbmV4dF8qYCBmaWVsZHMuCiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpOgogICAgcHVzaGludCAzCiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUAyOQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTYyCiAgICAvLyBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCAtIHByaW5jaXBhbF9hbW91bnRfZHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGRpZyA4CiAgICAtCiAgICBkdXAKICAgIGJ1cnkgMTEKICAgIGJ1cnkgMTEKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzYKCmZ1bmRfZHVlX2Nhc2hmbG93c19lbHNlX2JvZHlAMjk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjUKICAgIC8vIGVsaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX0lQKToKICAgIGRpZyAxNAogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDMxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjYKICAgIC8vIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgYnVyeSAxMQogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY3CiAgICAvLyBuZXh0X2ludGVyZXN0X2Jhc2UgPSBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGJ1cnkgMTIKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgZXhpc3RzCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDMxOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY4CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCk6CiAgICBkaWcgMTQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlAMzIKICAgIGRpZyA5CiAgICBidXJ5IDExCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUAzMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU2OQogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDEwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzAKICAgIC8vIG5leHRfaW50ZXJlc3RfYmFzZSA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTEKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzYKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDI5CiAgICAvLyBpZiBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKToKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzMAogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKToKICAgIGRpZyAxNAogICAgcHVzaGludCAxOQogICAgPT0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDIwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzEKICAgIC8vIHJldHVybiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBidXJ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyNgoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzIKICAgIC8vIGludGVyZXN0X2R1ZSA9IHNlbGYuYWNjcnVlZF9pbnRlcmVzdCArIHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZGlnIDE2CiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBidXJ5IDE4CiAgICArCiAgICBkdXAKICAgIGJ1cnkgMTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzMwogICAgLy8gaWYgc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIDw9IGludGVyZXN0X2R1ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIGV4aXN0cwogICAgPj0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDIyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzQKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyNgoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzUKICAgIC8vIHByaW5jaXBhbF9hbW91bnQgPSBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gLSBpbnRlcmVzdF9kdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIGV4aXN0cwogICAgZGlnIDEyCiAgICAtCiAgICBkdXAKICAgIGJ1cnkgMTAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzNgogICAgLy8gaWYgcHJpbmNpcGFsX2Ftb3VudCA+IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICA+CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDM3CiAgICAvLyByZXR1cm4gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTIKICAgIC8vIHByaW5jaXBhbF9hbW91bnRfZHVlID0gc2VsZi5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudChlbnRyeSkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnRAMjYKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDI0OgogICAgZGlnIDgKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTUyCiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyNToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ0MAogICAgLy8gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwgPD0gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGRpZyAxNQogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgZHVwMgogICAgPD0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzOS00NDEKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwgPD0gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDQyCiAgICAvLyByZXR1cm4gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgLSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgc3dhcAogICAgLQogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTIKICAgIC8vIHByaW5jaXBhbF9hbW91bnRfZHVlID0gc2VsZi5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudChlbnRyeSkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnRAMjYKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDE1CiAgICAvLyByZXR1cm4gc2VsZi5hY2NydWVkX2ludGVyZXN0ICsgc2VsZi5fZW50cnlfaW50ZXJlc3Rfc2VnbWVudChlbnRyeSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBkaWcgMTYKICAgIGNhbGxzdWIgX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQKICAgIGJ1cnkgMTgKICAgICsKICAgIGJ1cnkgMTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MQogICAgLy8gaW50ZXJlc3RfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X2ludGVyZXN0X2Ftb3VudChlbnRyeSkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X2ludGVyZXN0X2Ftb3VudEAxNAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDk6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzQKICAgIC8vIGFzc2VydCBwcm9jZXNzZWRfZXZlbnRzID4gVUludDY0KDApLCBlcnIuTk9fRFVFX0NBU0hGTE9XCiAgICBkaWcgMgogICAgZHVwCiAgICBhc3NlcnQgLy8gTm8gZHVlIGNhc2hmbG93IHRvIHBheQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojc4CiAgICAvLyB0b3RhbF9mdW5kZWQ9ZnVuZGVkX2ludGVyZXN0ICsgZnVuZGVkX3ByaW5jaXBhbCwKICAgIGRpZyAyCiAgICBkdXAKICAgIGRpZyAzCiAgICBkdXAKICAgIGNvdmVyIDMKICAgICsKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4MAogICAgLy8gdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojc1LTgxCiAgICAvLyByZXR1cm4gdHlwLkNhc2hGdW5kaW5nUmVzdWx0KAogICAgLy8gICAgIGZ1bmRlZF9pbnRlcmVzdD1mdW5kZWRfaW50ZXJlc3QsCiAgICAvLyAgICAgZnVuZGVkX3ByaW5jaXBhbD1mdW5kZWRfcHJpbmNpcGFsLAogICAgLy8gICAgIHRvdGFsX2Z1bmRlZD1mdW5kZWRfaW50ZXJlc3QgKyBmdW5kZWRfcHJpbmNpcGFsLAogICAgLy8gICAgIHByb2Nlc3NlZF9ldmVudHM9cHJvY2Vzc2VkX2V2ZW50cywKICAgIC8vICAgICB0aW1lc3RhbXA9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQ2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX2ZhbHNlQDUxOgogICAgaW50Y18wIC8vIDAKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfbWVyZ2VANTIKCgovLyBtb2R1bGVzLnBheW1lbnRfYWdlbnQuUGF5bWVudEFnZW50LmNsYWltX2R1ZV9jYXNoZmxvd3Nbcm91dGluZ10oKSAtPiB2b2lkOgpjbGFpbV9kdWVfY2FzaGZsb3dzOgogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDIKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE0CiAgICAvLyBpZiBzZWxmLm9wX2RhZW1vbi52YWx1ZSAhPSBHbG9iYWwuemVyb19hZGRyZXNzOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI1IC8vIDB4NTIyMzRmNzA0NDYxNjU2ZDZmNmUyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wX2RhZW1vbiBleGlzdHMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE2CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjUgLy8gMHg1MjIzNGY3MDQ0NjE2NTZkNmY2ZTIzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BfZGFlbW9uIGV4aXN0cwogICAgPT0KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNi0xOAogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICBibnogY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX3RydWVAMTQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNwogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIHR4biBTZW5kZXIKICAgIGRpZyAzCiAgICA9PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE2LTE4CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIGJueiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfdHJ1ZUAxNAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE4CiAgICAvLyBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgdHhuIFNlbmRlcgogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgMzIKICAgID09CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTYtMTgKICAgIC8vIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICAvLyBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgYnogY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX2ZhbHNlQDE1CgpjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfdHJ1ZUAxNDoKICAgIGludGNfMSAvLyAxCgpjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfbWVyZ2VAMTY6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTUtMTkKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgLy8gICAgIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICAvLyAgICAgb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIC8vICksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAoKY2xhaW1fZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE3OgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojk0CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojk1CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5OAogICAgLy8gc2VsZi5fZW5zdXJlX3VuaXRzX2FjdGl2YXRlZChob2xkaW5nX2FkZHJlc3MpCiAgICBkaWcgMgogICAgZHVwCiAgICBjYWxsc3ViIF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6OTkKICAgIC8vIHNlbGYuX3NldHRsZV9wb3NpdGlvbihob2xkaW5nX2FkZHJlc3MpCiAgICBjYWxsc3ViIF9zZXR0bGVfcG9zaXRpb24KICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExNwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY2xhaW1hYmxlX2ludGVyZXN0CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBkdXAKICAgIHB1c2hpbnQgNzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExOAogICAgLy8gKyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jbGFpbWFibGVfcHJpbmNpcGFsCiAgICBkdXAKICAgIHB1c2hpbnQgODEKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExNy0xMTgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNsYWltYWJsZV9pbnRlcmVzdAogICAgLy8gKyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jbGFpbWFibGVfcHJpbmNpcGFsCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTAxCiAgICAvLyBhc3NlcnQgdG90YWxfYW1vdW50ID4gVUludDY0KDApLCBlcnIuTk9fRFVFX0NBU0hGTE9XCiAgICBhc3NlcnQgLy8gTm8gZHVlIGNhc2hmbG93IHRvIHBheQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MuaXNfb3B0ZWRfaW4oCiAgICBleHRyYWN0IDAgMzIKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNQogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNC0yNgogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLmlzX29wdGVkX2luKAogICAgLy8gICAgIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZAogICAgLy8gKQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNC0yNwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLmlzX29wdGVkX2luKAogICAgLy8gICAgIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZAogICAgLy8gKQogICAgLy8gYW5kIG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQKICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAyNAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI3CiAgICAvLyBhbmQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCAzODQKICAgIGdldGJpdAogICAgYm56IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAyNAogICAgaW50Y18xIC8vIDEKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUAyNToKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMDYKICAgIC8vIGlmIHNlbGYuX2lzX3BheW1lbnRfZXhlY3V0YWJsZShob2xkaW5nX2FkZHJlc3MpOgogICAgYnogY2xhaW1fZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozMwogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIHN3YXAKICAgIGRpZyAxCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozMy0zNAogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIC8vID49IHBheW1lbnRfYW1vdW50CiAgICBkaWcgNQogICAgZHVwCiAgICBjb3ZlciAyCiAgICA+PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjMyLTM1CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICAvLyAgICAgPj0gcGF5bWVudF9hbW91bnQKICAgIC8vICksIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcyBmb3IgdGhlIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMDgKICAgIC8vIHNlbGYuX3BheShzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MsIHRvdGFsX2Ftb3VudCkKICAgIGRpZyAyCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBkdXAKICAgIGV4dHJhY3QgMCAzMgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjM5LTQ0CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9cmVjZWl2ZXIsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWFtb3VudCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQzCiAgICAvLyBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgdW5jb3ZlciAzCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIHVuY292ZXIgMgogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozOQogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgcHVzaGludCA0IC8vIGF4ZmVyCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjM5LTQ0CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9cmVjZWl2ZXIsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWFtb3VudCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMjUtMTI2CiAgICAvLyAjIEdldCB0aGUgY2xhaW1hYmxlIGFtb3VudHMgYmVmb3JlIHJlc2V0CiAgICAvLyBpbnRlcmVzdF9hbW91bnQgPSBwb3NpdGlvbi5jbGFpbWFibGVfaW50ZXJlc3QKICAgIGR1cAogICAgcHVzaGludCA3MwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSA5CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTI3CiAgICAvLyBwcmluY2lwYWxfYW1vdW50ID0gcG9zaXRpb24uY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgZHVwCiAgICBwdXNoaW50IDgxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAzCiAgICBidXJ5IDkKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMjktMTMwCiAgICAvLyAjIFJlc2V0IHRoZSBwb3NpdGlvbidzIGNsYWltYWJsZSBhbW91bnRzCiAgICAvLyBwb3NpdGlvbi5jbGFpbWFibGVfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBpdG9iCiAgICBzd2FwCiAgICBkaWcgMQogICAgcmVwbGFjZTIgNzMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzEKICAgIC8vIHBvc2l0aW9uLmNsYWltYWJsZV9wcmluY2lwYWwgPSBVSW50NjQoMCkKICAgIHN3YXAKICAgIHJlcGxhY2UyIDgxCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTMyCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHBvc2l0aW9uLmNvcHkoKQogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTM0CiAgICAvLyBhc3NlcnQgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCA+PSBpbnRlcmVzdF9hbW91bnQsIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX2ludGVyZXN0IGV4aXN0cwogICAgZHVwCiAgICBkaWcgMgogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzNQogICAgLy8gYXNzZXJ0IHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsID49IHByaW5jaXBhbF9hbW91bnQsIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICBkaWcgMwogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzNy0xMzgKICAgIC8vICMgVXBkYXRlIHRoZSBnbG9iYWwgcmVzZXJ2ZWQgaW50ZXJlc3QgYW5kIHByaW5jaXBhbCBhbW91bnRzCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0IC09IGludGVyZXN0X2Ftb3VudAogICAgc3dhcAogICAgLQogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzkKICAgIC8vIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIC09IHByaW5jaXBhbF9hbW91bnQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIHN3YXAKICAgIC0KICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKY2xhaW1fZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTE0CiAgICAvLyB0b3RhbF9hbW91bnQ9aW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudCwKICAgIGRpZyA1CiAgICBkdXAKICAgIGRpZyA2CiAgICBkdXAKICAgIGNvdmVyIDMKICAgICsKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMTUKICAgIC8vIHRpbWVzdGFtcD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMTEtMTE3CiAgICAvLyByZXR1cm4gdHlwLkNhc2hDbGFpbVJlc3VsdCgKICAgIC8vICAgICBpbnRlcmVzdF9hbW91bnQ9aW50ZXJlc3RfYW1vdW50LAogICAgLy8gICAgIHByaW5jaXBhbF9hbW91bnQ9cHJpbmNpcGFsX2Ftb3VudCwKICAgIC8vICAgICB0b3RhbF9hbW91bnQ9aW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudCwKICAgIC8vICAgICB0aW1lc3RhbXA9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgY29udGV4dD1wYXltZW50X2luZm8sCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgMgogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIHB1c2hieXRlcyAweDAwMjIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX2ZhbHNlQDI0OgogICAgaW50Y18wIC8vIDAKICAgIGIgY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDI1CgpjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VAMTU6CiAgICBpbnRjXzAgLy8gMAogICAgYiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfbWVyZ2VAMTYKCgovLyBtb2R1bGVzLnRyYW5zZmVyX2FnZW50LlRyYW5zZmVyQWdlbnQudHJhbnNmZXJfc2V0X3NjaGVkdWxlW3JvdXRpbmddKCkgLT4gdm9pZDoKdHJhbnNmZXJfc2V0X3NjaGVkdWxlOgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjI2CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MjcKICAgIC8vIGFzc2VydCBvcGVuX2RhdGUgPCBjbG9zdXJlX2RhdGUsIGVyci5JTlZBTElEX1NPUlRJTkcKICAgIGR1cDIKICAgIDwKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBtdXN0IGJlIHNvcnRlZCBpbiBzdHJpY3RseSBhc2NlbmRpbmcgb3JkZXIKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MjkKICAgIC8vIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlID0gb3Blbl9kYXRlCiAgICBieXRlYyAyNyAvLyAidHJhbnNmZXJfb3BlbmluZ19kYXRlIgogICAgdW5jb3ZlciAyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTozMAogICAgLy8gc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGUgPSBjbG9zdXJlX2RhdGUKICAgIGJ5dGVjIDI4IC8vICJ0cmFuc2Zlcl9jbG9zdXJlX2RhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTozMQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnRyYW5zZmVyX2FnZW50LlRyYW5zZmVyQWdlbnQucHJpbWFyeV9kaXN0cmlidXRpb25bcm91dGluZ10oKSAtPiB2b2lkOgpwcmltYXJ5X2Rpc3RyaWJ1dGlvbjoKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzEKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnByaW1hcnlfZGVhbGVyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjIgLy8gMHg1MjIzNTA3MjY5NmQ2MTcyNzk0NDY1NjE2YzY1NzIyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo0MwogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDQKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo0NQogICAgLy8gYXNzZXJ0IHNlbGYuX3N0YXR1c19pc19wZW5kaW5nX2llZCgpLCBlcnIuUFJJTUFSWV9ESVNUUklCVVRJT05fQ0xPU0VECiAgICBhc3NlcnQgLy8gUHJpbWFyeSBkaXN0cmlidXRpb24gaXMgY2xvc2VkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBjb3ZlciAzCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQ3CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKGhvbGRpbmdfYWRkcmVzcykKICAgIHN3YXAKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDgKICAgIC8vIGFzc2VydCB1bml0cyA+IFVJbnQ2NCgwKSwgZXJyLlpFUk9fVU5JVFMKICAgIGR1cAogICAgYXNzZXJ0IC8vIENhbiBub3QgZGlzdHJpYnV0ZSB6ZXJvIHVuaXRzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjUwCiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsICsgdW5pdHMgPD0gc2VsZi50b3RhbF91bml0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCBleGlzdHMKICAgICsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICA8PQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo0OS01MQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsICsgdW5pdHMgPD0gc2VsZi50b3RhbF91bml0cwogICAgLy8gKSwgZXJyLk9WRVJfRElTVFJJQlVUSU9OCiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IHJlbWFpbmluZyBELUFTQSB1bml0cwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo1MgogICAgLy8gaWYgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjYgLy8gImluaXRpYWxfZXhjaGFuZ2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGUgZXhpc3RzCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NTQKICAgIC8vIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDw9IHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjYgLy8gImluaXRpYWxfZXhjaGFuZ2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGUgZXhpc3RzCiAgICA8PQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo1My01NQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8PSBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZQogICAgLy8gKSwgZXJyLlBSSU1BUllfRElTVFJJQlVUSU9OX0NMT1NFRAogICAgYXNzZXJ0IC8vIFByaW1hcnkgZGlzdHJpYnV0aW9uIGlzIGNsb3NlZAoKcHJpbWFyeV9kaXN0cmlidXRpb25fYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE0OAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucmVzZXJ2ZWRfdW5pdHMgKz0gdW5pdHMKICAgIGR1cG4gMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHB1c2hpbnQgNDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMwogICAgZHVwCiAgICBjb3ZlciAzCiAgICArCiAgICBpdG9iCiAgICBwdXNoaW50IDQwCiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo1OAogICAgLy8gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCArPSB1bml0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCBleGlzdHMKICAgICsKICAgIGJ5dGVjIDEwIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo1OQogICAgLy8gcmV0dXJuIHNlbGYudG90YWxfdW5pdHMgLSBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgc3dhcAogICAgLQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTozMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy50cmFuc2Zlcl9hZ2VudC5UcmFuc2ZlckFnZW50LnRyYW5zZmVyW3JvdXRpbmddKCkgLT4gdm9pZDoKdHJhbnNmZXI6CiAgICBpbnRjXzAgLy8gMAogICAgZHVwCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXBuIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo3NQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NzYKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQ3CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuX3N0YXR1c19pc19wZW5kaW5nX2llZCgpLCBlcnIuUEVORElOR19JRUQKICAgICEKICAgIGFzc2VydCAvLyBJRUQgbm90IHlldCBleGVjdXRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxMwogICAgLy8gaWYgc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjcgLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICBieiB0cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTUKICAgIC8vIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjcgLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNC0xNgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gKSwgZXJyLkNMT1NFRF9UUkFOU0ZFUgogICAgYXNzZXJ0IC8vIFRyYW5zZmVyIGlzIGNsb3NlZAoKdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNwogICAgLy8gaWYgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjggLy8gInRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICBieiB0cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTkKICAgIC8vIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDwgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGUKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyOCAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIDwKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTgtMjAKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZQogICAgLy8gKSwgZXJyLkNMT1NFRF9UUkFOU0ZFUgogICAgYXNzZXJ0IC8vIFRyYW5zZmVyIGlzIGNsb3NlZAoKdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4MAogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gc2VuZGVyX2hvbGRpbmdfYWRkcmVzcywgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA4CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIGJ5dGVjIDggLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQyMwogICAgZGlnIDUKICAgIGR1cAogICAgY292ZXIgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgOQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4MwogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChzZW5kZXJfaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDIKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODQKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQocmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzKQogICAgZHVwCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojg1CiAgICAvLyBhc3NlcnQgc2VuZGVyX2hvbGRpbmdfYWRkcmVzcyAhPSByZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3MsIGVyci5TRUxGX1RSQU5TRkVSCiAgICB1bmNvdmVyIDIKICAgICE9CiAgICBhc3NlcnQgLy8gU2VuZGVyIGFuZCByZWNlaXZlciBtdXN0IGJlIGRpZmZlcmVudAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4NgogICAgLy8gYXNzZXJ0IHVuaXRzID4gVUludDY0KDApLCBlcnIuTlVMTF9UUkFOU0ZFUgogICAgZGlnIDEKICAgIGR1cAogICAgYXNzZXJ0IC8vIFRyYW5zZmVyIHVuaXRzIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODcKICAgIC8vIGFzc2VydCB1bml0cyA8PSBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMsIGVyci5PVkVSX1RSQU5TRkVSCiAgICBzd2FwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgPD0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgc2VuZGVyIHVuaXRzIHRvIHRyYW5zZmVyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NTYKICAgIC8vIGlmIHNlbGYuZXZlbnRfY3Vyc29yID49IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQ6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgID49CiAgICBibnogdHJhbnNmZXJfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYXNzZXJ0X25vX2R1ZV9ldmVudF9wZW5kaW5nQDEwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NTgKICAgIC8vIG5leHRfZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoc2VsZi5ldmVudF9jdXJzb3IpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzYwCiAgICAvLyBuZXh0X2VudHJ5LnNjaGVkdWxlZF90aW1lID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgID4KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc1OS03NjEKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgbmV4dF9lbnRyeS5zY2hlZHVsZWRfdGltZSA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyApLCBlcnIuUEVORElOR19BQ1RVU19FVkVOVAogICAgYXNzZXJ0IC8vIEFDVFVTIGV2ZW50IG5vdCB5ZXQgZXhlY3V0ZWQKCnRyYW5zZmVyX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Fzc2VydF9ub19kdWVfZXZlbnRfcGVuZGluZ0AxMDoKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6OTAKICAgIC8vIHNlbGYuX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQoc2VuZGVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGRpZyAzCiAgICBkdXAKICAgIGNhbGxzdWIgX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6OTEKICAgIC8vIHNlbGYuX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQocmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgY2FsbHN1YiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo5MgogICAgLy8gc2VsZi5fc2V0dGxlX3Bvc2l0aW9uKHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBjYWxsc3ViIF9zZXR0bGVfcG9zaXRpb24KICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo5MwogICAgLy8gc2VsZi5fc2V0dGxlX3Bvc2l0aW9uKHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGNhbGxzdWIgX3NldHRsZV9wb3NpdGlvbgogICAgcG9wbiAyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTUyCiAgICAvLyBhc3NlcnQgdW5pdHMgPD0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMsIGVyci5PVkVSX1RSQU5TRkVSCiAgICBkaWcgNQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgZGlnIDEKICAgIDw9CiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IHNlbmRlciB1bml0cyB0byB0cmFuc2ZlcgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE1MwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMgLT0gdW5pdHMKICAgIGRpZyAxCiAgICAtCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGludGNfMyAvLyAzMgogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE0NAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMgKz0gdW5pdHMKICAgIGRpZyA1CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICB1bmNvdmVyIDIKICAgICsKICAgIGl0b2IKICAgIGludGNfMyAvLyAzMgogICAgc3dhcAogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBkaWcgMgogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5hY2NvdW50X3N1c3BlbnNpb25bcm91dGluZ10oKSAtPiB2b2lkOgphY2NvdW50X3N1c3BlbnNpb246CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTY1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo3NwogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYXV0aG9yaXR5LCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjEgLy8gMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTg1CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGR1cAogICAgcHVzaGludCA0OAogICAgaW50Y18xIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIHB1c2hpbnQgNDgKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTg2CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfb3Blbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfb3BlbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2OAogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjMgLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQ0ZDYxNmU2MTY3NjU3MjIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzkKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0VOREVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDIwMAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTAKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX2VuZGVkKCksIGVyci5VTkFVVEhPUklaRUQKICAgICEKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxMQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTIKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjEzCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzQKICAgIC8vIHVuaXRzPVVJbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzItNDIKICAgIC8vIHJldHVybiB0eXAuQWNjb3VudFBvc2l0aW9uKAogICAgLy8gICAgIHBheW1lbnRfYWRkcmVzcz1wYXltZW50X2FkZHJlc3MsCiAgICAvLyAgICAgdW5pdHM9VUludDY0KDApLAogICAgLy8gICAgIHJlc2VydmVkX3VuaXRzPVVJbnQ2NCgwKSwKICAgIC8vICAgICBzdXNwZW5kZWQ9RmFsc2UsCiAgICAvLyAgICAgc2V0dGxlZF9jdXJzb3I9VUludDY0KDApLAogICAgLy8gICAgIGludGVyZXN0X2NoZWNrcG9pbnQ9VUludDY0KDApLAogICAgLy8gICAgIHByaW5jaXBhbF9jaGVja3BvaW50PVVJbnQ2NCgwKSwKICAgIC8vICAgICBjbGFpbWFibGVfaW50ZXJlc3Q9VUludDY0KDApLAogICAgLy8gICAgIGNsYWltYWJsZV9wcmluY2lwYWw9VUludDY0KDApLAogICAgLy8gKQogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBieXRlYyA0MCAvLyAweDAwCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxNAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSBzZWxmLl9uZXdfYWNjb3VudF9wb3NpdGlvbihwYXltZW50X2FkZHJlc3MpCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjE1CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzczoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMzgKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcywgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgdW5jb3ZlciAzCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjM5CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0MAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDEKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcyA9IHBheW1lbnRfYWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDIKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF9nZXRfcG9zaXRpb25bcm91dGluZ10oKSAtPiB2b2lkOgphY2NvdW50X2dldF9wb3NpdGlvbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNTkKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9jcmVhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9jcmVhdGU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5ODAKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSBhcnJhbmdlcgogICAgYnl0ZWMgMTggLy8gMHg1MjIzNDE3MjcyNjE2ZTY3NjU3MjIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTgxCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfY29uZmlnW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfY29uZmlnOgogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGxlbgogICAgcHVzaGludCAxMDcKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuTm9ybWFsaXplZEFjdHVzVGVybXMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDcyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLkluaXRpYWxLZXJuZWxTdGF0ZQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIGxlbgogICAgZGlnIDEKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgdHVwbGUgZW5jb2RpbmcKICAgIGR1cAogICAgcHVzaGludCAzNAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHRhaWwgcG9pbnRlciBhdCBpbmRleCAxIG9mICh1aW50OFszMl0sKGxlbit1dGY4W10pKQogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBjb3ZlciAzCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAzNgogICAgKwogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5Qcm9zcGVjdHVzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDEyCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMTQtMTAxNQogICAgLy8gIyBDb25maWd1cmUgQ29udHJhY3QKICAgIC8vIHNlbGYuY29udHJhY3RfdHlwZSA9IHRlcm1zLmNvbnRyYWN0X3R5cGUuYXNfdWludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ5dGVjIDEyIC8vICJjb250cmFjdF90eXBlIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICBieiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIwCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfQU5OKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjEKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgcHVzaGludCAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjIKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjMKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgcHVzaGludCA0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjQKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYnogY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAOAoKY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUA3OgogICAgaW50Y18xIC8vIDEKCmNvbnRyYWN0X2NvbmZpZ19ib29sX21lcmdlQDk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjkKICAgIC8vIGFzc2VydCBzZWxmLl9pc19zdXBwb3J0ZWRfY29udHJhY3RfdHlwZShjb250cmFjdF90eXBlKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDE3CiAgICAvLyBzZWxmLl9zdG9yZV9jb250cmFjdF9jb25maWcoc2VsZi5jb250cmFjdF90eXBlLCB0ZXJtcywgaW5pdGlhbF9zdGF0ZSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBidXJ5IDIKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMjUKICAgIC8vIGFzc2VydCB0ZXJtcy5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBkaWcgNAogICAgZHVwCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDgKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMyNwogICAgLy8gdGVybXMuZGF5X2NvdW50X2NvbnZlbnRpb24uYXNfdWludDY0KCkKICAgIHB1c2hpbnQgNTcKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyOTctMzAzCiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgIGJ6IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGRpZyA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyOTkKICAgIC8vIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGRpZyA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDAKICAgIC8vIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICBwdXNoaW50IDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI5Ny0zMDMKICAgIC8vIHJldHVybiBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzYwKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwSVNEQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjApLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDE2CiAgICBkaWcgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzAxCiAgICAvLyBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyOTctMzAzCiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgID09CiAgICBibnogY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUAxNgogICAgZGlnIDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMwMgogICAgLy8gVUludDY0KGVudW1zLkRDQ18zMEUzNjApLAogICAgcHVzaGludCA0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyOTctMzAzCiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgID09CiAgICBieiBjb250cmFjdF9jb25maWdfYm9vbF9mYWxzZUAxNwoKY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUAxNjoKICAgIGludGNfMSAvLyAxCgpjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUAxODoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMwOS0zMTEKICAgIC8vIGFzc2VydCBzZWxmLl9pc19zdXBwb3J0ZWRfZGF5X2NvdW50X2NvbnZlbnRpb24oCiAgICAvLyAgICAgZGF5X2NvdW50X2NvbnZlbnRpb24KICAgIC8vICksIGVyci5JTlZBTElEX0RBWV9DT1VOVF9DT05WRU5USU9OCiAgICBhc3NlcnQgLy8gSW52YWxpZCBkYXktY291bnQgY29udmVudGlvbiBJRAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzI5CiAgICAvLyBpZiBjb250cmFjdF90eXBlICE9IFVJbnQ2NChlbnVtcy5DVF9BTk4pOgogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgIT0KICAgIGJ6IGNvbnRyYWN0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDIwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzAKICAgIC8vIGFzc2VydCBub3QgdGVybXMuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBkaWcgNAogICAgcHVzaGludCA3ODYKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgoKY29udHJhY3RfY29uZmlnX2FmdGVyX2lmX2Vsc2VAMjA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MDAKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MDEKICAgIC8vIGFzc2VydCBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID09IFVJbnQ2NCgwKSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBELUFTQSBhbHJlYWR5IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgwMy04MDQKICAgIC8vICMgU2V0IERlbm9taW5hdGlvbiBBc3NldAogICAgLy8gc2VsZi5fYXNzZXJ0X2Rlbm9taW5hdGlvbl9hc3NldCh0ZXJtcy5kZW5vbWluYXRpb25fYXNzZXRfaWQpCiAgICBkaWcgNAogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc2OC03NjkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gZGVub21pbmF0aW9uIHdpdGggQVNBCiAgICAvLyBfY3JlYXRvciwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfY3JlYXRvcihkZW5vbWluYXRpb25fYXNzZXRfaWQpCiAgICBkdXAKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc3MAogICAgLy8gYXNzZXJ0IGV4aXN0cywgZXJyLklOVkFMSURfREVOT01JTkFUSU9OCiAgICBhc3NlcnQgLy8gRGVub21pbmF0aW9uIGFzc2V0IGlzIG5vdCBwcm9wZXJseSBzZXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc3MwogICAgLy8gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgPSBkZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIGJ5dGVjIDQ0IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgwNy04MDgKICAgIC8vICMgU2V0IFNldHRsZW1lbnQgQXNzZXQKICAgIC8vIHNlbGYuX2Fzc2VydF9zZXR0bGVtZW50X2Fzc2V0KHRlcm1zLnNldHRsZW1lbnRfYXNzZXRfaWQpCiAgICBkaWcgMQogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Nzc4CiAgICAvLyBzZXR0bGVtZW50X2Fzc2V0X2lkID09IHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc3Ni03NzkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzZXR0bGVtZW50IGFzc2V0IGlzIHRoZSBkZW5vbWluYXRpb24gYXNzZXQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgLy8gKSwgZXJyLklOVkFMSURfU0VUVExFTUVOVF9BU1NFVAogICAgYXNzZXJ0IC8vIERpZmZlcmVudCBzZXR0bGVtZW50IGFzc2V0IG5vdCBzdXBwb3J0ZWQsIG11c3QgYmUgZXF1YWwgdG8gZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODIKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCA9IHNldHRsZW1lbnRfYXNzZXRfaWQKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODMtNzg5CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODgKICAgIC8vIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODYKICAgIC8vIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Nzg3CiAgICAvLyBhc3NldF9hbW91bnQ9MCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODMtNzg0CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc4My03ODkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gc2V0dGxlbWVudCB3aXRoIEFTQQogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PTAsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTEtODEyCiAgICAvLyAjIFVuaXRzCiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzID0gdGVybXMudG90YWxfdW5pdHMKICAgIGR1cAogICAgcHVzaGludCAxNwogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTMKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDEwIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODE1LTgxNgogICAgLy8gIyBEYXktQ291bnQgQ29udmVudGlvbnMKICAgIC8vIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPSB0ZXJtcy5kYXlfY291bnRfY29udmVudGlvbi5hc191aW50NjQoKQogICAgYnl0ZWMgNDYgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgZGlnIDgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTgtODE5CiAgICAvLyAjIFRpbWUKICAgIC8vIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlID0gdGVybXMuaW5pdGlhbF9leGNoYW5nZV9kYXRlCiAgICBkdXAKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAyNiAvLyAiaW5pdGlhbF9leGNoYW5nZV9kYXRlIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MjAKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IHRlcm1zLm1hdHVyaXR5X2RhdGUKICAgIGRpZyAxCiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNDUgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgyMQogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gaW5pdGlhbF9zdGF0ZS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBkaWcgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBwdXNoaW50IDQ4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODIzLTgyNAogICAgLy8gIyBQcmluY2lwYWwKICAgIC8vIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPSB0ZXJtcy5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudAogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgZGlnIDEwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODI1CiAgICAvLyBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSB0ZXJtcy5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBkaWcgMwogICAgcHVzaGludCA3ODYKICAgIGdldGJpdAogICAgYnl0ZWMgMzQgLy8gImR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODI2CiAgICAvLyBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9IGluaXRpYWxfc3RhdGUub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBkaWcgMQogICAgcHVzaGludCAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjXzMgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MjgtODI5CiAgICAvLyAjIEludGVyZXN0CiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgPSBpbml0aWFsX3N0YXRlLmFjY3J1ZWRfaW50ZXJlc3QKICAgIGRpZyAxCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MzEtODMyCiAgICAvLyAjIEludGVyZXN0IFJhdGUKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gaW5pdGlhbF9zdGF0ZS5ub21pbmFsX2ludGVyZXN0X3JhdGUKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODMzCiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBpbml0aWFsX3N0YXRlLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UKICAgIGRpZyAxCiAgICBwdXNoaW50IDI0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MzQKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQgPSB0ZXJtcy5yYXRlX3Jlc2V0X3NwcmVhZAogICAgZGlnIDMKICAgIHB1c2hpbnQgNTgKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzNSAvLyAicmF0ZV9yZXNldF9zcHJlYWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODM1CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciA9IHRlcm1zLnJhdGVfcmVzZXRfbXVsdGlwbGllcgogICAgZGlnIDMKICAgIHB1c2hpbnQgNjYKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzNiAvLyAicmF0ZV9yZXNldF9tdWx0aXBsaWVyIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzNgogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X2Zsb29yID0gdGVybXMucmF0ZV9yZXNldF9mbG9vcgogICAgZGlnIDMKICAgIHB1c2hpbnQgNzQKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAyOSAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MzcKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9jYXAgPSB0ZXJtcy5yYXRlX3Jlc2V0X2NhcAogICAgZGlnIDMKICAgIHB1c2hpbnQgODIKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzMCAvLyAicmF0ZV9yZXNldF9jYXAiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODM4CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfbmV4dCA9IHRlcm1zLnJhdGVfcmVzZXRfbmV4dAogICAgZGlnIDMKICAgIHB1c2hpbnQgOTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzNyAvLyAicmF0ZV9yZXNldF9uZXh0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzOQogICAgLy8gc2VsZi5oYXNfcmF0ZV9yZXNldF9mbG9vciA9IHRlcm1zLmhhc19yYXRlX3Jlc2V0X2Zsb29yCiAgICBkaWcgMwogICAgcHVzaGludCA3ODQKICAgIGdldGJpdAogICAgYnl0ZWMgMzggLy8gImhhc19yYXRlX3Jlc2V0X2Zsb29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0MAogICAgLy8gc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgPSB0ZXJtcy5oYXNfcmF0ZV9yZXNldF9jYXAKICAgIGRpZyAzCiAgICBwdXNoaW50IDc4NQogICAgZ2V0Yml0CiAgICBieXRlYyAzOSAvLyAiaGFzX3JhdGVfcmVzZXRfY2FwIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0Mi04NDMKICAgIC8vICMgU2NhbGluZwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSA9IHRlcm1zLmZpeGVkX3BvaW50X3NjYWxlCiAgICB1bmNvdmVyIDMKICAgIHB1c2hpbnQgOTkKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDUtODQ2CiAgICAvLyAjIFNjaGVkdWxlIFByb2Nlc3NpbmcKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yID0gaW5pdGlhbF9zdGF0ZS5ldmVudF9jdXJzb3IKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDgtODQ5CiAgICAvLyAjIFBlci1Vbml0IEZpeGVkLVBvaW50IEluZGV4ZXMKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCA9IGluaXRpYWxfc3RhdGUuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleAogICAgZGlnIDEKICAgIHB1c2hpbnQgNTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NTAKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggPSBpbml0aWFsX3N0YXRlLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4CiAgICBkaWcgMQogICAgcHVzaGludCA2NAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NTItODUzCiAgICAvLyAjIFJlc2VydmVkIEFtb3VudCAoZm9yIGV4ZWN1dGVkIGNhc2hmbG93cykKICAgIC8vIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU0CiAgICAvLyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU2CiAgICAvLyBhc3NlcnQgdGVybXMuaW5pdGlhbF9leGNoYW5nZV9kYXRlID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsIGVyci5JTlZBTElEX0lFRAogICAgZGlnIDIKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgID4KICAgIGFzc2VydCAvLyBJRUQgbXVzdCBiZSBzZXQgaW4gdGhlIGZ1dHVyZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU3CiAgICAvLyBhc3NlcnQgdGVybXMuaW5pdGlhbF9leGNoYW5nZV9kYXRlID4gaW5pdGlhbF9zdGF0ZS5zdGF0dXNfZGF0ZSwgZXJyLklOVkFMSURfSUVECiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICA8CiAgICBhc3NlcnQgLy8gSUVEIG11c3QgYmUgc2V0IGluIHRoZSBmdXR1cmUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg1OAogICAgLy8gYXNzZXJ0IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA8IHRlcm1zLm1hdHVyaXR5X2RhdGUsIGVyci5JTlZBTElEX0lFRAogICAgPAogICAgYXNzZXJ0IC8vIElFRCBtdXN0IGJlIHNldCBpbiB0aGUgZnV0dXJlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDE5LTEwMjAKICAgIC8vICMgTm90YXJpemUgcHJvc3BlY3R1cyAob3B0aW9uYWwpCiAgICAvLyBzZWxmLnByb3NwZWN0dXNfaGFzaCA9IHByb3NwZWN0dXMuaGFzaC5ieXRlcwogICAgZGlnIDIKICAgIGV4dHJhY3QgMCAzMgogICAgYnl0ZWMgNDIgLy8gInByb3NwZWN0dXNfaGFzaCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDIxCiAgICAvLyBzZWxmLnByb3NwZWN0dXNfdXJsID0gcHJvc3BlY3R1cy51cmwKICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgYnl0ZWMgNDMgLy8gInByb3NwZWN0dXNfdXJsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMjIKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNvbnRyYWN0X2NvbmZpZ19ib29sX2ZhbHNlQDE3OgogICAgaW50Y18wIC8vIDAKICAgIGIgY29udHJhY3RfY29uZmlnX2Jvb2xfbWVyZ2VAMTgKCmNvbnRyYWN0X2NvbmZpZ19ib29sX2ZhbHNlQDg6CiAgICBpbnRjXzAgLy8gMAogICAgYiBjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUA5CgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3Rfc2NoZWR1bGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9zY2hlZHVsZToKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAyNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBzd2FwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgMwogICAgZHVwCiAgICBwdXNoaW50IDY1CiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIHVuY292ZXIgMgogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8c21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5FeGVjdXRpb25TY2hlZHVsZUVudHJ5PgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAzOQogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDQyCiAgICAvLyBjb250cmFjdF90eXBlPXNlbGYuY29udHJhY3RfdHlwZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBjb3ZlciAzCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODc0CiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIEQtQVNBIGFscmVhZHkgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODc1LTg3NwogICAgLy8gYXNzZXJ0IHNjaGVkdWxlX3BhZ2UubGVuZ3RoIDw9IFVJbnQ2NCgKICAgIC8vICAgICBjc3QuU0NIRURVTEVfUEFHRV9TSVpFCiAgICAvLyApLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBkdXAKICAgIHB1c2hpbnQgMTYKICAgIDw9CiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NzgKICAgIC8vIGFzc2VydCBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID4gVUludDY0KDApLCBlcnIuVEVSTVNfTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMCAvLyAiaW5pdGlhbF9leGNoYW5nZV9hbW91bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0EgdGVybXMgbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg4MAogICAgLy8gcGFnZV9jdXJzb3IgPSBzY2hlZHVsZV9wYWdlX2luZGV4ICogVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpCiAgICBzd2FwCiAgICBwdXNoaW50IDE2CiAgICAqCiAgICBzd2FwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4ODcKICAgIC8vICsgcGFnZV9sZW5ndGggKiBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19QRVJfRU5UUllfQlVER0VUKQogICAgcHVzaGludCAxMDAKICAgICoKICAgIHB1c2hpbnQgMTUxMAogICAgKwoKY29udHJhY3Rfc2NoZWR1bGVfd2hpbGVfdG9wQDI6CiAgICBkdXAKICAgIGdsb2JhbCBPcGNvZGVCdWRnZXQKICAgID4KICAgIGJ6IGNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX3doaWxlQDUKICAgIGl0eG5fYmVnaW4KICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBwdXNoaW50IDUgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICBieXRlYyA0NyAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW0KICAgIGJ5dGVjIDQ3IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBiIGNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEAyCgpjb250cmFjdF9zY2hlZHVsZV9hZnRlcl93aGlsZUA1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODkwCiAgICAvLyBpbmRleCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTAKCmNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODkxCiAgICAvLyB3aGlsZSBpbmRleCA8IHBhZ2VfbGVuZ3RoOgogICAgZGlnIDkKICAgIGRpZyA0CiAgICA8CiAgICBieiBjb250cmFjdF9zY2hlZHVsZV9hZnRlcl93aGlsZUAxNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODkyLTg5MwogICAgLy8gZW50cnkgPSBzY2hlZHVsZV9wYWdlW2luZGV4XS5jb3B5KCkKICAgIC8vIGVudHJ5X2V2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBkaWcgNAogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgYnVyeSAxMwogICAgZGlnIDEwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgNjUKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODkzCiAgICAvLyBlbnRyeV9ldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTItODkzCiAgICAvLyBlbnRyeSA9IHNjaGVkdWxlX3BhZ2VbaW5kZXhdLmNvcHkoKQogICAgLy8gZW50cnlfZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGludGNfMiAvLyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTMKICAgIC8vIGVudHJ5X2V2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBnZXRieXRlCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgMTQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg5NAogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X2lkID09IHBhZ2VfY3Vyc29yICsgaW5kZXgsIGVyci5JTlZBTElEX0VWRU5UX0lECiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEzCiAgICBkaWcgNQogICAgdW5jb3ZlciA0CiAgICArCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTUtODk3CiAgICAvLyBzZWxmLl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBlbnRyeV9ldmVudF90eXBlCiAgICAvLyApCiAgICBkaWcgNQogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODk4CiAgICAvLyBhc3NlcnQgZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgc3dhcAogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTkKICAgIC8vIGlmIGVudHJ5LmV2ZW50X2lkID4gVUludDY0KDApOgogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTAwCiAgICAvLyBpZiBpbmRleCA+IFVJbnQ2NCgwKToKICAgIGRpZyA5CiAgICBieiBjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlAMTAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkwMQogICAgLy8gcHJldmlvdXNfZW50cnkgPSBzY2hlZHVsZV9wYWdlW2luZGV4IC0gVUludDY0KDEpXS5jb3B5KCkKICAgIGRpZyA5CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgcHVzaGludCA2NQogICAgKgogICAgZGlnIDEyCiAgICBzd2FwCiAgICBwdXNoaW50IDY1CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTYKICAgIC8vIHByZXZpb3VzX2VudHJ5LnNjaGVkdWxlZF90aW1lIDw9IGVudHJ5LnNjaGVkdWxlZF90aW1lCiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgOAogICAgPD0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkxNS05MTcKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgcHJldmlvdXNfZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gZW50cnkuc2NoZWR1bGVkX3RpbWUKICAgIC8vICksIGVyci5JTlZBTElEX1NPUlRJTkcKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBtdXN0IGJlIHNvcnRlZCBpbiBzdHJpY3RseSBhc2NlbmRpbmcgb3JkZXIKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTgKICAgIC8vIGlmIGVudHJ5LmV2ZW50X2lkID09IFVJbnQ2NCgwKToKICAgIGRpZyA4CiAgICBibnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTE5LTkyMQogICAgLy8gYXNzZXJ0IGVudHJ5X2V2ZW50X3R5cGUgPT0gVUludDY0KAogICAgLy8gICAgIGVudW1zLkVWVF9JRUQKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZGlnIDEwCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjIKICAgIC8vIGluZGV4ICs9IFVJbnQ2NCgxKQogICAgZGlnIDkKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEwCiAgICBiIGNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEA2Cgpjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlAMTA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDMtOTA1CiAgICAvLyAjIFRoZSBmaXJzdCBlbnRyeSBvZiBhIHBhZ2UgbXVzdCBzdGlsbCBiZSBvcmRlcmVkIGFmdGVyIHRoZQogICAgLy8gIyBsYXN0IGVudHJ5IG9mIHRoZSBwcmV2aW91cyBwYWdlLgogICAgLy8gYXNzZXJ0IHNjaGVkdWxlX3BhZ2VfaW5kZXggPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0VWRU5UX0lECiAgICBkaWcgNgogICAgZHVwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBpZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTA2CiAgICAvLyBwcmV2aW91c19wYWdlX2luZGV4ID0gc2NoZWR1bGVfcGFnZV9pbmRleCAtIFVJbnQ2NCgxKQogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkwOAogICAgLy8gcHJldmlvdXNfcGFnZV9pbmRleCBpbiBzZWxmLnNjaGVkdWxlX3BhZ2UKICAgIGl0b2IKICAgIGJ5dGVjIDMxIC8vIDB4NTMyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTA3LTkwOQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBwcmV2aW91c19wYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZQogICAgLy8gKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTEwLTkxMQogICAgLy8gcHJldmlvdXNfcGFnZSA9IHNlbGYuc2NoZWR1bGVfcGFnZVtwcmV2aW91c19wYWdlX2luZGV4XS5jb3B5KCkKICAgIC8vIGFzc2VydCBwcmV2aW91c19wYWdlLmxlbmd0aCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGludCAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTExCiAgICAvLyBhc3NlcnQgcHJldmlvdXNfcGFnZS5sZW5ndGggPiBVSW50NjQoMCksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGR1cAogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTEzCiAgICAvLyBwcmV2aW91c19wYWdlLmxlbmd0aCAtIFVJbnQ2NCgxKQogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkxMi05MTQKICAgIC8vIHByZXZpb3VzX2VudHJ5ID0gcHJldmlvdXNfcGFnZVsKICAgIC8vICAgICBwcmV2aW91c19wYWdlLmxlbmd0aCAtIFVJbnQ2NCgxKQogICAgLy8gXS5jb3B5KCkKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgMgogICAgKwogICAgcHVzaGludCA2NQogICAgYm94X2V4dHJhY3QKICAgIGIgY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxMQoKY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfd2hpbGVAMTU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMDAKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHNjaGVkdWxlX3BhZ2UuY29weSgpCiAgICBkaWcgNgogICAgaXRvYgogICAgYnl0ZWMgMzEgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBkaWcgNQogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTI1CiAgICAvLyBpZiBpc19sYXN0X3BhZ2U6CiAgICBkaWcgNQogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxNwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTI3CiAgICAvLyBzY2hlZHVsZV9wYWdlX2luZGV4ICogVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpICsgcGFnZV9sZW5ndGgKICAgIGRpZyAxCiAgICBkaWcgNAogICAgKwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTI2CiAgICAvLyBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50ID0gKAogICAgYnl0ZWMgNCAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjYtOTI4CiAgICAvLyBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50ID0gKAogICAgLy8gICAgIHNjaGVkdWxlX3BhZ2VfaW5kZXggKiBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkgKyBwYWdlX2xlbmd0aAogICAgLy8gKQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkyOQogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgcHVzaGludCA1MAogICAgYXBwX2dsb2JhbF9wdXQKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDQ3CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmNvbnRyYWN0X2V4ZWN1dGVfaWVkW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfZXhlY3V0ZV9pZWQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA1NwogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDU4CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA1OQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNjEKICAgIC8vIGFzc2VydCBzZWxmLmV2ZW50X2N1cnNvciA8IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICBkaWcgMQogICAgPgogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgY3Vyc29yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDYyCiAgICAvLyBlbnRyeSA9IHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLmV2ZW50X2N1cnNvcikKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2MwogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X3R5cGUgPT0gYXJjNC5VSW50OChlbnVtcy5FVlRfSUVEKSwgZXJyLklOVkFMSURfRVZFTlRfVFlQRQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgZHVwCiAgICBwdXNoYnl0ZXMgMHgwMQogICAgYj09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCB0eXBlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDY3CiAgICAvLyBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIGRpZyAxCiAgICBleHRyYWN0IDAgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2OQogICAgLy8gc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICBkaWcgMgogICAgZXh0cmFjdCA5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNzAKICAgIC8vIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgZGlnIDMKICAgIGV4dHJhY3QgMTcgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3MQogICAgLy8gcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZGlnIDQKICAgIGV4dHJhY3QgMjUgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3MwogICAgLy8gbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9ZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBkaWcgNQogICAgZXh0cmFjdCAzMyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc0CiAgICAvLyBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICBkaWcgNgogICAgZXh0cmFjdCA0MSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc1CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1lbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIGRpZyA3CiAgICBleHRyYWN0IDQ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNzYKICAgIC8vIGZsYWdzPWVudHJ5LmZsYWdzLAogICAgZGlnIDgKICAgIGV4dHJhY3QgNTcgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2Ni0xMDc3CiAgICAvLyB0eXAuT2JzZXJ2ZWRFdmVudFJlcXVlc3QoCiAgICAvLyAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBvYnNlcnZlZF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1lbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9ZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9ZW50cnkuZmxhZ3MsCiAgICAvLyApLAogICAgdW5jb3ZlciA3CiAgICB1bmNvdmVyIDgKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3MgogICAgLy8gb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2Ni0xMDc3CiAgICAvLyB0eXAuT2JzZXJ2ZWRFdmVudFJlcXVlc3QoCiAgICAvLyAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBvYnNlcnZlZF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1lbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9ZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9ZW50cnkuZmxhZ3MsCiAgICAvLyApLAogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNjQtMTA3OAogICAgLy8gc2VsZi5fYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkoCiAgICAvLyAgICAgZW50cnksCiAgICAvLyAgICAgdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0KAogICAgLy8gICAgICAgICBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIC8vICAgICAgICAgZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgLy8gICAgICAgICBzY2hlZHVsZWRfdGltZT1lbnRyeS5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICAgICAgYWNjcnVhbF9mYWN0b3I9ZW50cnkuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICAgICAgb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPWVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPWVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgICAgICBmbGFncz1lbnRyeS5mbGFncywKICAgIC8vICAgICApLAogICAgLy8gKQogICAgY2FsbHN1YiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkKICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3OQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDQ5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5hcHBseV9ub25fY2FzaF9ldmVudFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFwcGx5X25vbl9jYXNoX2V2ZW50OgogICAgaW50Y18wIC8vIDAKICAgIGR1cG4gNAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwODEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwbiAyCiAgICBsZW4KICAgIHB1c2hpbnQgNzMKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuT2JzZXJ2ZWRFdmVudFJlcXVlc3QKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDk1CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA5NgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwOTgKICAgIC8vIGlmIHBheWxvYWQuZmxhZ3MgJiBVSW50NjQoZW51bXMuRkxBR19PQlNFUlZFRF9FVkVOVCk6CiAgICBwdXNoaW50IDY1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBwdXNoaW50IDQKICAgICYKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjMzCiAgICAvLyByZXR1cm4gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9DTE0pCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIHB1c2hpbnQgNQogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwOTkKICAgIC8vIGFzc2VydCBzZWxmLl9zdXBwb3J0c19vYnNlcnZlZF9ldmVudHMoKSwgZXJyLk9CU0VSVkVEX0VWRU5UX1JFUVVJUkVECiAgICBhc3NlcnQgLy8gT2JzZXJ2ZWQgZXZlbnQgcmVxdWlyZWQgdG8gZXhlY3V0ZSB0aGlzIGFjdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEwMAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMzMKICAgIC8vIHJldHVybiBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0NMTSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgZHVwCiAgICBwdXNoaW50IDUKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MzgKICAgIC8vIGFzc2VydCBzZWxmLl9zdXBwb3J0c19vYnNlcnZlZF9ldmVudHMoKSwgZXJyLk9CU0VSVkVEX0VWRU5UX1JFUVVJUkVECiAgICBhc3NlcnQgLy8gT2JzZXJ2ZWQgZXZlbnQgcmVxdWlyZWQgdG8gZXhlY3V0ZSB0aGlzIGFjdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTM5CiAgICAvLyBhc3NlcnQgcGF5bG9hZC5ldmVudF9pZCA9PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LCBlcnIuSU5WQUxJRF9FVkVOVF9JRAogICAgZGlnIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgNwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NDEKICAgIC8vIHNlbGYuY29udHJhY3RfdHlwZSwgcGF5bG9hZC5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBkdXAKICAgIGV4dHJhY3QgOCAxCiAgICBidXJ5IDEyCiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQwLTk0MgogICAgLy8gc2VsZi5fYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgc2VsZi5jb250cmFjdF90eXBlLCBwYXlsb2FkLmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIC8vICkKICAgIGNhbGxzdWIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NDQKICAgIC8vIHBhZ2VfaW5kZXggPSBzZWxmLl9zY2hlZHVsZV9wYWdlX2luZGV4KHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxOTAKICAgIC8vIHJldHVybiBldmVudF9pZCAvLyBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkKICAgIHB1c2hpbnQgMTYKICAgIC8KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk0NQogICAgLy8gcGFnZSA9IHR5cC5FeGVjdXRpb25TY2hlZHVsZVBhZ2UoKQogICAgcHVzaGJ5dGVzIDB4MDAwMAogICAgYnVyeSA3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NDYKICAgIC8vIGlmIHBhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlOgogICAgaXRvYgogICAgYnl0ZWMgMzEgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA5CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMjcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk0NwogICAgLy8gcGFnZSA9IHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XS5jb3B5KCkKICAgIGRpZyA3CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidXJ5IDcKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX3BhZ2UgZW50cnkgZXhpc3RzCgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDI3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQ4CiAgICAvLyBhc3NlcnQgcGFnZS5sZW5ndGggPCBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGRpZyA1CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgMTYKICAgIDwKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1MwogICAgLy8gc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIGRpZyAzCiAgICBkdXAKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTQKICAgIC8vIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICBkaWcgMQogICAgZXh0cmFjdCAxNyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTUKICAgIC8vIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZGlnIDIKICAgIGV4dHJhY3QgMjUgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTU2CiAgICAvLyBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDMKICAgIGV4dHJhY3QgNDEgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTU3CiAgICAvLyBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIGRpZyA0CiAgICBleHRyYWN0IDQ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1OAogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIHVuY292ZXIgNQogICAgZXh0cmFjdCA1NyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTAtOTYwCiAgICAvLyB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1wYXlsb2FkLmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9cGF5bG9hZC5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPXBheWxvYWQucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXBheWxvYWQubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICkKICAgIGRpZyAxMQogICAgaXRvYgogICAgZGlnIDE4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMwogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NDktOTYxCiAgICAvLyBwYWdlLmFwcGVuZCgKICAgIC8vICAgICB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9cGF5bG9hZC5ldmVudF9pZCwKICAgIC8vICAgICAgICAgZXZlbnRfdHlwZT1wYXlsb2FkLmV2ZW50X3R5cGUsCiAgICAvLyAgICAgICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIC8vICAgICAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICAgICApCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjIKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHBhZ2UuY29weSgpCiAgICBkaWcgOAogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2MwogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTAzCiAgICAvLyBhc3NlcnQgZXZlbnRfaWQgPT0gc2VsZi5ldmVudF9jdXJzb3IsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBjdXJzb3IKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMDQKICAgIC8vIGVudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KGV2ZW50X2lkKQogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEwNgogICAgLy8gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgYnVyeSAxMAogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjQKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY1CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzYzLTM3MAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9SUiksCiAgICBwdXNoaW50IDEyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY3CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICBwdXNoaW50IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY4CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgcHVzaGludCAxOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzYzLTM3MAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBieiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX2ZhbHNlQDE2CgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX3RydWVAMTU6CiAgICBpbnRjXzEgLy8gMQoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9tZXJnZUAxNzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMDUtMTEwNwogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2lzX25vbl9jYXNoKAogICAgLy8gICAgIGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIC8vICksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IHR5cGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMDgKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlICE9IGFyYzQuVUludDgoZW51bXMuRVZUX0lFRCksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGRpZyA4CiAgICBwdXNoYnl0ZXMgMHgwMQogICAgYiE9CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCB0eXBlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNzQKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluIChVSW50NjQoZW51bXMuRVZUX1JSKSwgVUludDY0KGVudW1zLkVWVF9SUkYpKQogICAgZGlnIDQKICAgIHB1c2hpbnQgMTIKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDIxCiAgICBkaWcgNAogICAgcHVzaGludCAxMQogICAgPT0KICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfZmFsc2VAMjIKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAyMToKICAgIGludGNfMSAvLyAxCgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX21lcmdlQDIzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEwOQogICAgLy8gaWYgc2VsZi5fZXZlbnRfaXNfcmF0ZV9yZXNldChlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpKToKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Vsc2VfYm9keUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODAKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLm9ic2VydmVyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjQgLy8gMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTEzCiAgICAvLyBzZWxmLl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeShlbnRyeSwgcGF5bG9hZCkKICAgIGRpZyA2CiAgICBkaWcgMgogICAgY2FsbHN1YiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkKICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTExNAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDgxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Vsc2VfYm9keUA1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTExMgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICBiIGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VANgoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9mYWxzZUAyMjoKICAgIGludGNfMCAvLyAwCiAgICBiIGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfbWVyZ2VAMjMKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfZmFsc2VAMTY6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX21lcmdlQDE3CgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfZ2V0X3N0YXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfZ2V0X3N0YXRlOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBkdXAKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEyMQogICAgLy8gY29udHJhY3RfdHlwZT1hcmM0LlVJbnQ4KHNlbGYuY29udHJhY3RfdHlwZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzIgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMjMKICAgIC8vIHRvdGFsX3VuaXRzPXNlbGYudG90YWxfdW5pdHMsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEyNAogICAgLy8gcmVzZXJ2ZWRfdW5pdHNfdG90YWw9c2VsZi5yZXNlcnZlZF91bml0c190b3RhbCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTI1CiAgICAvLyBpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudD1zZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMjYKICAgIC8vIGV2ZW50X2N1cnNvcj1zZWxmLmV2ZW50X2N1cnNvciwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEyNwogICAgLy8gc2NoZWR1bGVfZW50cnlfY291bnQ9c2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMjgKICAgIC8vIG91dHN0YW5kaW5nX3ByaW5jaXBhbD1zZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEyOQogICAgLy8gaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZT1zZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEzMAogICAgLy8gbm9taW5hbF9pbnRlcmVzdF9yYXRlPXNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTMxCiAgICAvLyBhY2NydWVkX2ludGVyZXN0PXNlbGYuYWNjcnVlZF9pbnRlcmVzdCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTMyCiAgICAvLyBjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4PXNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEzMwogICAgLy8gY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXg9c2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTM0CiAgICAvLyByZXNlcnZlZF9pbnRlcmVzdD1zZWxmLnJlc2VydmVkX2ludGVyZXN0LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMzUKICAgIC8vIHJlc2VydmVkX3ByaW5jaXBhbD1zZWxmLnJlc2VydmVkX3ByaW5jaXBhbCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMjAtMTEzNgogICAgLy8gcmV0dXJuIHR5cC5LZXJuZWxTdGF0ZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlPWFyYzQuVUludDgoc2VsZi5jb250cmFjdF90eXBlKSwKICAgIC8vICAgICBzdGF0dXM9c2VsZi5zdGF0dXMsCiAgICAvLyAgICAgdG90YWxfdW5pdHM9c2VsZi50b3RhbF91bml0cywKICAgIC8vICAgICByZXNlcnZlZF91bml0c190b3RhbD1zZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsLAogICAgLy8gICAgIGluaXRpYWxfZXhjaGFuZ2VfYW1vdW50PXNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQsCiAgICAvLyAgICAgZXZlbnRfY3Vyc29yPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgLy8gICAgIHNjaGVkdWxlX2VudHJ5X2NvdW50PXNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQsCiAgICAvLyAgICAgb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2U9c2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlLAogICAgLy8gICAgIG5vbWluYWxfaW50ZXJlc3RfcmF0ZT1zZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBhY2NydWVkX2ludGVyZXN0PXNlbGYuYWNjcnVlZF9pbnRlcmVzdCwKICAgIC8vICAgICBjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4PXNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCwKICAgIC8vICAgICBjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleD1zZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4LAogICAgLy8gICAgIHJlc2VydmVkX2ludGVyZXN0PXNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QsCiAgICAvLyAgICAgcmVzZXJ2ZWRfcHJpbmNpcGFsPXNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsLAogICAgLy8gKQogICAgdW5jb3ZlciAxNAogICAgaXRvYgogICAgdW5jb3ZlciAxNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDEzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDEwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgOQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDgKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTE2CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnRbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE0MgogICAgLy8gaWYgc2VsZi5ldmVudF9jdXJzb3IgPj0gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgPj0KICAgIGJ6IGNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDQKICAgIC8vIGV2ZW50X2lkPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTQzLTExNTMKICAgIC8vIHJldHVybiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1zZWxmLmV2ZW50X2N1cnNvciwKICAgIC8vICAgICBldmVudF90eXBlPWFyYzQuVUludDgoMCksCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9VUludDY0KDApLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9VUludDY0KDApLAogICAgLy8gICAgIGZsYWdzPVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGl0b2IKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDUKICAgIC8vIGV2ZW50X3R5cGU9YXJjNC5VSW50OCgwKSwKICAgIGJ5dGVjIDQwIC8vIDB4MDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDMtMTE1MwogICAgLy8gcmV0dXJuIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgIGV2ZW50X2lkPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgLy8gICAgIGV2ZW50X3R5cGU9YXJjNC5VSW50OCgwKSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1VSW50NjQoMCksCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1VSW50NjQoMCksCiAgICAvLyAgICAgZmxhZ3M9VUludDY0KDApLAogICAgLy8gKQogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTQ2CiAgICAvLyBzY2hlZHVsZWRfdGltZT1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE0My0xMTUzCiAgICAvLyByZXR1cm4gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkoCiAgICAvLyAgICAgZXZlbnRfaWQ9c2VsZi5ldmVudF9jdXJzb3IsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1hcmM0LlVJbnQ4KDApLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPVVJbnQ2NCgwKSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249VUludDY0KDApLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPVVJbnQ2NCgwKSwKICAgIC8vICAgICBmbGFncz1VSW50NjQoMCksCiAgICAvLyApCiAgICBpdG9iCiAgICBzd2FwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKCmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudF9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudEA0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEzOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpjb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1NAogICAgLy8gcmV0dXJuIHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLmV2ZW50X2N1cnNvcikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50QDQKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5jb250cmFjdF91cGRhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF91cGRhdGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTUzLTE1NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGdyYW50cyB0aGUgdXBkYXRlIHBlcm1pc3Npb25zIHRvIHRoZSBBcnJhbmdlci4KICAgIC8vICMg4pqg77iPIFdBUk5JTkc6IEFwcGxpY2F0aW9uIHVwZGF0ZXMgbXVzdCBiZSBleGVjdXRlZCBWRVJZIGNhcmVmdWxseSwgYXMgdGhleQogICAgLy8gIyBtaWdodCBpbnRyb2R1Y2UgYnJlYWtpbmcgY2hhbmdlcy4KICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfcm90YXRlX2FycmFuZ2VyW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19yb3RhdGVfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2OQogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTcwCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gbmV3X2FycmFuZ2VyCiAgICBieXRlYyAxOCAvLyAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTcxCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfc2V0X29wX2RhZW1vbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfc2V0X29wX2RhZW1vbjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTg0CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODUKICAgIC8vIHNlbGYub3BfZGFlbW9uLnZhbHVlID0gYWRkcmVzcwogICAgYnl0ZWMgMjUgLy8gMHg1MjIzNGY3MDQ0NjE2NTZkNmY2ZTIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4NgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTczCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2Fzc2lnbl9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19hc3NpZ25fcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDE2CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLlJvbGVWYWxpZGl0eQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjExCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMgogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgcHVzaGludCAyMAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTAzCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gcm9sZV9hZGRyZXNzCiAgICBieXRlYyAxOCAvLyAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMKICAgIGRpZyAzCiAgICBhcHBfZ2xvYmFsX3B1dAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTQKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDYKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIGR1cAogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnRfbWFuYWdlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMyAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwOAogICAgLy8gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMiAvLyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTIKICAgIC8vIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIGR1cAogICAgcHVzaGludCA2MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE1CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMzIgLy8gMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE2CiAgICAvLyBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExOAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMSAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIwCiAgICAvLyBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMwogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgODAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIzCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI0IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI0CiAgICAvLyBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3Jldm9rZV9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19yZXZva2Vfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzUKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzNgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzcKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCkpCiAgICBidG9pCiAgICBkdXBuIDIKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCAhPSBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksIGVyci5JTlZBTElEX1JPTEUKICAgIGR1cAogICAgcHVzaGludCAyMAogICAgIT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyOAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIzIC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0NGQ2MTZlNjE2NzY1NzIyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMwCiAgICAvLyBkZWwgc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzOQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjE2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIyIC8vIDB4NTIyMzUwNzI2OTZkNjE3Mjc5NDQ2NTYxNmM2NTcyMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNAogICAgLy8gZGVsIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjM4CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIGR1cAogICAgcHVzaGludCA2MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAzMiAvLyAweDUyMjM1NDcyNzU3Mzc0NjU2NTIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzgKICAgIC8vIGRlbCBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjM4CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDEKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hdXRob3JpdHksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjEgLy8gMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MgogICAgLy8gZGVsIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzOAogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDQKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDgwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI0IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ2CiAgICAvLyBkZWwgc2VsZi5vYnNlcnZlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfY29udHJhY3Rfc3VzcGVuc2lvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfY29udHJhY3Rfc3VzcGVuc2lvbjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCAgIyBUT0RPOiBVcGRhdGUgc3BlY3MgYW5kIGFkZCB0ZXN0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojc3CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyMSAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1NwogICAgLy8gc2VsZi5hc3NldF9zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGJ5dGVjIDMzIC8vICJhc3NldF9zdXNwZW5kZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1OAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QgICMgVE9ETzogVXBkYXRlIHNwZWNzIGFuZCBhZGQgdGVzdAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X2FycmFuZ2VyW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjY4CiAgICAvLyByZXR1cm4gc2VsZi5hcnJhbmdlci52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE4IC8vIDB4NTIyMzQxNzI3MjYxNmU2NzY1NzIyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI2MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYWRkcmVzc19yb2xlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjcwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4NAogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hY2NvdW50X21hbmFnZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjMgLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQ0ZDYxNmU2MTY3NjU3MjIzCiAgICBkaWcgMQogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODUKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYucHJpbWFyeV9kZWFsZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjIgLy8gMHg1MjIzNTA3MjY5NmQ2MTcyNzk0NDY1NjE2YzY1NzIyMwogICAgZGlnIDIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg2CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnRydXN0ZWUsIGFkZHJlc3MpLAogICAgYnl0ZWMgMzIgLy8gMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMwogICAgZGlnIDMKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg3CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgYWRkcmVzcyksCiAgICBieXRlYyAyMSAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgZGlnIDQKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg4CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLm9ic2VydmVyLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDI0IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgdW5jb3ZlciA1CiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlYyA0MCAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciA2CiAgICBzZXRiaXQKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDUKICAgIHNldGJpdAogICAgcHVzaGludCAyCiAgICB1bmNvdmVyIDQKICAgIHNldGJpdAogICAgcHVzaGludCAzCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgcHVzaGludCA0CiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwNQogICAgLy8gcm9sZSA9IHJvbGVfaWQuYXNfdWludDY0KCkKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDYKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGUpCiAgICBkdXAKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA4CiAgICAvLyBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKToKICAgIHB1c2hpbnRzIDIwIDQwIDUwIDYwIDcwIDgwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA3LTMzOAogICAgLy8gbWF0Y2ggcm9sZToKICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKToKICAgIC8vICAgICAgICAgcmV0dXJuIHR5cC5Sb2xlVmFsaWRpdHkoCiAgICAvLyAgICAgICAgICAgICByb2xlX3ZhbGlkaXR5X3N0YXJ0PVVJbnQ2NCgwKSwgcm9sZV92YWxpZGl0eV9lbmQ9VUludDY0KDApCiAgICAvLyAgICAgICAgICkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSk6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSk6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgXzoKICAgIC8vICAgICAgICAgb3AuZXJyKGVyci5JTlZBTElEX1JPTEUpCiAgICB1bmNvdmVyIDYKICAgIG1hdGNoIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMEAyIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMUAzIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMkA0IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfM0A1IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNEA2IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzM4CiAgICAvLyBvcC5lcnIoZXJyLklOVkFMSURfUk9MRSkKICAgIGVyciAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV81QDc6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzM0CiAgICAvLyBzZWxmLm9ic2VydmVyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDI0IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMzMy0zMzUKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLm9ic2VydmVyLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzYKICAgIC8vIHJldHVybiBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV80QDY6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI5CiAgICAvLyBzZWxmLmF1dGhvcml0eSwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAyMSAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOC0zMzAKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLmF1dGhvcml0eSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzMxCiAgICAvLyByZXR1cm4gc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8zQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI0CiAgICAvLyBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMzIgLy8gMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMy0zMjUKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyNgogICAgLy8gcmV0dXJuIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzJANDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTkKICAgIC8vIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMjIgLy8gMHg1MjIzNTA3MjY5NmQ2MTcyNzk0NDY1NjE2YzY1NzIyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxOC0zMjAKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLnByaW1hcnlfZGVhbGVyLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjEKICAgIC8vIHJldHVybiBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMUAzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxNAogICAgLy8gc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMjMgLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQ0ZDYxNmU2MTY3NjU3MjIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEzLTMxNQogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTYKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzBAMjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDktMzExCiAgICAvLyByZXR1cm4gdHlwLlJvbGVWYWxpZGl0eSgKICAgIC8vICAgICByb2xlX3ZhbGlkaXR5X3N0YXJ0PVVJbnQ2NCgwKSwgcm9sZV92YWxpZGl0eV9lbmQ9VUludDY0KDApCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB2b2lkOgpfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZDoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNgogICAgLy8gZGVmIF9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHNlbGYsIGhvbGRpbmdfYWRkcmVzczogQWNjb3VudCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI4CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZCwgZXJyLlNVU1BFTkRFRAogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHB1c2hpbnQgMzg0CiAgICBnZXRiaXQKICAgICEKICAgIGFzc2VydCAvLyBTdXNwZW5kZWQgb3BlcmF0aW9ucwogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuX3NldHRsZV9wb3NpdGlvbihob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB1aW50NjQsIHVpbnQ2NDoKX3NldHRsZV9wb3NpdGlvbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo0NAogICAgLy8gZGVmIF9zZXR0bGVfcG9zaXRpb24oc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50KSAtPiB0dXBsZVtVSW50NjQsIFVJbnQ2NF06CiAgICBwcm90byAxIDIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NjEKICAgIC8vIHBvc2l0aW9uID0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY29weSgpCiAgICBkdXAKICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjYzLTY1CiAgICAvLyAjIENvbXB1dGUgdGhlIGluY3JlbWVudGFsIHBlci11bml0IGZpeGVkLXBvaW50IGludGVyZXN0IGFuZCBwcmluY2lwYWwgYWNjcnVlZAogICAgLy8gIyBzaW5jZSB0aGlzIGFjY291bnQncyBsYXN0IGNoZWNrcG9pbnQuCiAgICAvLyBpbnRlcmVzdF9kZWx0YSA9IHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCAtIHBvc2l0aW9uLmludGVyZXN0X2NoZWNrcG9pbnQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IGV4aXN0cwogICAgZGlnIDEKICAgIHB1c2hpbnQgNTcKICAgIGV4dHJhY3RfdWludDY0CiAgICAtCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NjcKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggLSBwb3NpdGlvbi5wcmluY2lwYWxfY2hlY2twb2ludAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCBleGlzdHMKICAgIGRpZyAyCiAgICBwdXNoaW50IDY1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjczCiAgICAvLyBpbnRlcmVzdF9kZWx0YSwgcG9zaXRpb24udW5pdHMsIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUKICAgIGRpZyAyCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzAtNzQKICAgIC8vICMgQ29udmVydCB0aGUgcGVyLXVuaXQgZml4ZWQtcG9pbnQgZGVsdGFzIGludG8gYWJzb2x1dGUgY2xhaW1hYmxlIGFtb3VudHMKICAgIC8vICMgdXNpbmcgdGhlIGFjY291bnQncyBhY3RpdmUgdW5pdHMuCiAgICAvLyBjbGFpbWFibGVfaW50ZXJlc3QgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBpbnRlcmVzdF9kZWx0YSwgcG9zaXRpb24udW5pdHMsIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUKICAgIC8vICkKICAgIHVuY292ZXIgMwogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3NgogICAgLy8gcHJpbmNpcGFsX2RlbHRhLCBwb3NpdGlvbi51bml0cywgc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojc1LTc3CiAgICAvLyBjbGFpbWFibGVfcHJpbmNpcGFsID0gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgcHJpbmNpcGFsX2RlbHRhLCBwb3NpdGlvbi51bml0cywgc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgLy8gKQogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3OS04MQogICAgLy8gIyBBY2NydWUgdGhlIGNsYWltYWJsZSBhbW91bnRzIHRvIHRoZSBhY2NvdW50IHBvc2l0aW9uIGFuZCBtYWtlIHRoZW0gYXZhaWxhYmxlCiAgICAvLyAjIGZvciB3aXRoZHJhd2FsLgogICAgLy8gcG9zaXRpb24uY2xhaW1hYmxlX2ludGVyZXN0ICs9IGNsYWltYWJsZV9pbnRlcmVzdAogICAgZGlnIDIKICAgIHB1c2hpbnQgNzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgKwogICAgaXRvYgogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICByZXBsYWNlMiA3MwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjgyCiAgICAvLyBwb3NpdGlvbi5jbGFpbWFibGVfcHJpbmNpcGFsICs9IGNsYWltYWJsZV9wcmluY2lwYWwKICAgIGR1cAogICAgcHVzaGludCA4MQogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICArCiAgICBpdG9iCiAgICByZXBsYWNlMiA4MQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojg0LTg2CiAgICAvLyAjIEFkdmFuY2UgdGhlIGFjY291bnQncyBwZXItdW5pdCBmaXhlZC1wb2ludCBjaGVja3BvaW50cyB0byB0aGUgY3VycmVudCBnbG9iYWwKICAgIC8vICMgcGVyLXVuaXQgZml4ZWQtcG9pbnQgZ2xvYmFsIGluZGljZXMuCiAgICAvLyBwb3NpdGlvbi5pbnRlcmVzdF9jaGVja3BvaW50ID0gc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCBleGlzdHMKICAgIGl0b2IKICAgIHJlcGxhY2UyIDU3CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6ODcKICAgIC8vIHBvc2l0aW9uLnByaW5jaXBhbF9jaGVja3BvaW50ID0gc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCBleGlzdHMKICAgIGl0b2IKICAgIHJlcGxhY2UyIDY1CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6ODktOTAKICAgIC8vICMgQWR2YW5jZSB0aGUgYWNjb3VudCdzIGV2ZW50IGN1cnNvciB0byB0aGUgY3VycmVudCBnbG9iYWwgZXZlbnQgY3Vyc29yLgogICAgLy8gcG9zaXRpb24uc2V0dGxlZF9jdXJzb3IgPSBzZWxmLmV2ZW50X2N1cnNvcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpdG9iCiAgICByZXBsYWNlMiA0OQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjkyLTk0CiAgICAvLyAjIFVwZGF0ZSB0aGUgYWNjb3VudCBwb3NpdGlvbiBhbmQgcmV0dXJuIHRoZSBuZXdseSBhY2NydWVkIGNsYWltYWJsZSBhbW91bnRzCiAgICAvLyAjIGFkZGVkIHRvIHRoZSB0b3RhbCBwb3NpdGlvbidzIGNsYWltYWJsZSBhbW91bnRzLgogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSBwb3NpdGlvbi5jb3B5KCkKICAgIHVuY292ZXIgMwogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojk1CiAgICAvLyByZXR1cm4gY2xhaW1hYmxlX2ludGVyZXN0LCBjbGFpbWFibGVfcHJpbmNpcGFsCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5fZW5zdXJlX3VuaXRzX2FjdGl2YXRlZChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB2b2lkOgpfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZDoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo5NwogICAgLy8gZGVmIF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKHNlbGYsIGhvbGRpbmdfYWRkcmVzczogQWNjb3VudCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTAwCiAgICAvLyBpZiBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKToKICAgIGJ6IF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwMQogICAgLy8gcmV0dXJuCiAgICByZXRzdWIKCl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDMKICAgIC8vIHBvc2l0aW9uID0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY29weSgpCiAgICBmcmFtZV9kaWcgMgogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA0CiAgICAvLyBpZiBwb3NpdGlvbi5yZXNlcnZlZF91bml0cyA9PSBVSW50NjQoMCk6CiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIGJueiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZF9hZnRlcl9pZl9lbHNlQDQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDUKICAgIC8vIHJldHVybgogICAgcmV0c3ViCgpfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZF9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA4CiAgICAvLyBwb3NpdGlvbi51bml0cyArPSBhY3RpdmF0ZWRfdW5pdHMKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDMKICAgICsKICAgIGl0b2IKICAgIHJlcGxhY2UyIDMyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA5CiAgICAvLyBwb3NpdGlvbi5yZXNlcnZlZF91bml0cyA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGl0b2IKICAgIHJlcGxhY2UyIDQwCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTEwCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHBvc2l0aW9uLmNvcHkoKQogICAgZnJhbWVfZGlnIDIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTEKICAgIC8vIGFzc2VydCBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID49IGFjdGl2YXRlZF91bml0cywgZXJyLk9WRVJfRElTVFJJQlVUSU9OCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIGV4aXN0cwogICAgZHVwCiAgICBkaWcgMgogICAgPj0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgcmVtYWluaW5nIEQtQVNBIHVuaXRzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTEyCiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIC09IGFjdGl2YXRlZF91bml0cwogICAgc3dhcAogICAgLQogICAgYnl0ZWMgMTAgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9zY2FsZWRfbXVsX2RpdihtdWx0aXBsaWNhbmQ6IHVpbnQ2NCwgbXVsdGlwbGllcjogdWludDY0LCBkaXZpc29yOiB1aW50NjQpIC0+IHVpbnQ2NDoKX3NjYWxlZF9tdWxfZGl2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTUzLTE1NQogICAgLy8gZGVmIF9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLCBtdWx0aXBsaWNhbmQ6IFVJbnQ2NCwgbXVsdGlwbGllcjogVUludDY0LCBkaXZpc29yOiBVSW50NjQKICAgIC8vICkgLT4gVUludDY0OgogICAgcHJvdG8gMyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTcKICAgIC8vIGlmIG11bHRpcGxpY2FuZCA9PSBVSW50NjQoMCkgb3IgbXVsdGlwbGllciA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTMKICAgIGJ6IF9zY2FsZWRfbXVsX2Rpdl9pZl9ib2R5QDIKICAgIGZyYW1lX2RpZyAtMgogICAgYm56IF9zY2FsZWRfbXVsX2Rpdl9hZnRlcl9pZl9lbHNlQDMKCl9zY2FsZWRfbXVsX2Rpdl9pZl9ib2R5QDI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTgKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9zY2FsZWRfbXVsX2Rpdl9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTkKICAgIC8vIGhpZ2gsIGxvdyA9IG9wLm11bHcobXVsdGlwbGljYW5kLCBtdWx0aXBsaWVyKQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIG11bHcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2MAogICAgLy8gcmV0dXJuIG9wLmRpdncoaGlnaCwgbG93LCBkaXZpc29yKQogICAgZnJhbWVfZGlnIC0xCiAgICBkaXZ3CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYW1vdW50X3RvX2luZGV4X2RlbHRhKGFtb3VudDogdWludDY0KSAtPiB1aW50NjQ6Cl9hbW91bnRfdG9faW5kZXhfZGVsdGE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjIKICAgIC8vIGRlZiBfYW1vdW50X3RvX2luZGV4X2RlbHRhKHNlbGYsIGFtb3VudDogVUludDY0KSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2NAogICAgLy8gaWYgYW1vdW50ID09IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMQogICAgYm56IF9hbW91bnRfdG9faW5kZXhfZGVsdGFfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjUKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9hbW91bnRfdG9faW5kZXhfZGVsdGFfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTY2CiAgICAvLyBhc3NlcnQgc2VsZi50b3RhbF91bml0cyA+IFVJbnQ2NCgwKSwgZXJyLk5PX1VOSVRTCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgZHVwCiAgICBhc3NlcnQgLy8gTm8gRC1BU0EgdW5pdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2NwogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KGFtb3VudCwgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwgc2VsZi50b3RhbF91bml0cykKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2luZGV4X2RlbHRhX3RvX2Ftb3VudChpbmRleF9kZWx0YTogdWludDY0KSAtPiB1aW50NjQ6Cl9pbmRleF9kZWx0YV90b19hbW91bnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjkKICAgIC8vIGRlZiBfaW5kZXhfZGVsdGFfdG9fYW1vdW50KHNlbGYsIGluZGV4X2RlbHRhOiBVSW50NjQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTc2CiAgICAvLyBpZiBpbmRleF9kZWx0YSA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGJueiBfaW5kZXhfZGVsdGFfdG9fYW1vdW50X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTc3CiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfaW5kZXhfZGVsdGFfdG9fYW1vdW50X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE3OQogICAgLy8gc2VsZi50b3RhbF91bml0cywKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxODEKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNzgtMTgyCiAgICAvLyByZXR1cm4gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgc2VsZi50b3RhbF91bml0cywKICAgIC8vICAgICBpbmRleF9kZWx0YSwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2dldF9zY2hlZHVsZV9lbnRyeShldmVudF9pZDogdWludDY0KSAtPiBieXRlczoKX2dldF9zY2hlZHVsZV9lbnRyeToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIwMgogICAgLy8gZGVmIF9nZXRfc2NoZWR1bGVfZW50cnkoc2VsZiwgZXZlbnRfaWQ6IFVJbnQ2NCkgLT4gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnk6CiAgICBwcm90byAxIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIwNAogICAgLy8gYXNzZXJ0IGV2ZW50X2lkIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgPgogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgaWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE5MAogICAgLy8gcmV0dXJuIGV2ZW50X2lkIC8vIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDE2CiAgICAvCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMDYKICAgIC8vIGFzc2VydCBwYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgaXRvYgogICAgYnl0ZWMgMzEgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxOTQKICAgIC8vIHJldHVybiBldmVudF9pZCAlIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDE2CiAgICAlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMDkKICAgIC8vIGFzc2VydCBvZmZzZXQgPCBwYWdlLmxlbmd0aCwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBwdXNoaW50IDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgMQogICAgPgogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjEwCiAgICAvLyByZXR1cm4gcGFnZVtvZmZzZXRdLmNvcHkoKQogICAgcHVzaGludCA2NQogICAgKgogICAgcHVzaGludCAyCiAgICArCiAgICBwdXNoaW50IDY1CiAgICBib3hfZXh0cmFjdAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKGNvbnRyYWN0X3R5cGU6IHVpbnQ2NCwgZXZlbnRfdHlwZTogdWludDY0KSAtPiB2b2lkOgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTMtMzE1CiAgICAvLyBkZWYgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIHNlbGYsIGNvbnRyYWN0X3R5cGU6IFVJbnQ2NCwgZXZlbnRfdHlwZTogVUludDY0CiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNDcKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNDgKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgaW50Y18yIC8vIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI0OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9NRCksCiAgICBwdXNoaW50IDE5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTAKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgcHVzaGludCAxMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU0LTI1NQogICAgLy8gIyBDaGVjayBjb21tb24gZXZlbnRzIGZpcnN0CiAgICAvLyBpZiBldmVudF90eXBlIGluIGNvbW1vbl9ldmVudHM6CiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjUxCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICBwdXNoaW50IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUA3CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU2CiAgICAvLyByZXR1cm4gVHJ1ZQogICAgaW50Y18xIC8vIDEKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICByZXRzdWIKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTgtMjU5CiAgICAvLyAjIENvbnRyYWN0LXNwZWNpZmljIGFkZGl0aW9uYWwgZXZlbnRzCiAgICAvLyBpZiBjb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9QQU0pOgogICAgZnJhbWVfZGlnIC0yCiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjYwLTI2MQogICAgLy8gIyBQQU0gb25seSBzdXBwb3J0cyBjb21tb24gZXZlbnRzCiAgICAvLyByZXR1cm4gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNjMKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0xBTSkgb3IgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2My0yNjUKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0xBTSkgb3IgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoCiAgICAvLyAgICAgZW51bXMuQ1RfTkFNCiAgICAvLyApOgogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDExCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMgogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDE2CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUAxMToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2Ni0yNzAKICAgIC8vICMgTEFNL05BTSBhZGQ6IFBSLCBJUENCCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjY4CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjY2LTI3MAogICAgLy8gIyBMQU0vTkFNIGFkZDogUFIsIElQQ0IKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDEzCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIHB1c2hpbnQgMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2Ni0yNzAKICAgIC8vICMgTEFNL05BTSBhZGQ6IFBSLCBJUENCCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICkKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF9mYWxzZUAxNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAxMzoKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDE0OgogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMTY6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzIKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTik6CiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMjMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3My0yNzgKICAgIC8vICMgQU5OIGFkZHM6IFBSLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjc1CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjczLTI3OAogICAgLy8gIyBBTk4gYWRkczogUFIsIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDIwCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIHB1c2hpbnQgMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3My0yNzgKICAgIC8vICMgQU5OIGFkZHM6IFBSLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyMAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzcKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIHB1c2hpbnQgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjczLTI3OAogICAgLy8gIyBBTk4gYWRkczogUFIsIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDIxCgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDIwOgogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMjE6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAyMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MAogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfTEFYKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA0CiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMzEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MS0yODcKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MwogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUiksCiAgICBwdXNoaW50IDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MS0yODcKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjgKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjg0CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjgxLTI4NwogICAgLy8gIyBMQVggYWRkczogUFIsIFBJLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyOAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODUKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICBwdXNoaW50IDE4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODEtMjg3CiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDI4CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODEtMjg3CiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDI5CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDI4OgogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMjk6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAzMToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4OQogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQ0xNKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA1CiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMzMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI5MC0yOTEKICAgIC8vICMgQ0xNIGFkZHM6IFBSCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1BSKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDMKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDMzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjkzCiAgICAvLyByZXR1cm4gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5faXNfZHluYW1pY19hbm51aXR5KCkgLT4gdWludDY0OgpfaXNfZHluYW1pY19hbm51aXR5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM1CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzUtMzM2CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIC8vIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGJ6IF9pc19keW5hbWljX2FubnVpdHlfYm9vbF9mYWxzZUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzYKICAgIC8vIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzNCAvLyAiZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM1LTMzNgogICAgLy8gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICAvLyBhbmQgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBieiBfaXNfZHluYW1pY19hbm51aXR5X2Jvb2xfZmFsc2VAMwogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMzNC0zMzcKICAgIC8vIHJldHVybiAoCiAgICAvLyAgICAgc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICAvLyAgICAgYW5kIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgLy8gKQogICAgcmV0c3ViCgpfaXNfZHluYW1pY19hbm51aXR5X2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzQtMzM3CiAgICAvLyByZXR1cm4gKAogICAgLy8gICAgIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKQogICAgLy8gICAgIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIC8vICkKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KGVudHJ5OiBieXRlcykgLT4gdWludDY0LCBieXRlczoKX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozODAKICAgIC8vIGRlZiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudChzZWxmLCBlbnRyeTogdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5CiAgICAvLyBlbnRyeS5hY2NydWFsX2ZhY3RvciA9PSBVSW50NjQoMCkKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAxNwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5LTM5MQogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGJ6IF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2lmX2JvZHlAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzkwCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5LTM5MQogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGJ6IF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2lmX2JvZHlAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzkxCiAgICAvLyBvciBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPT0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5LTM5MQogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGJueiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudF9hZnRlcl9pZl9lbHNlQDQKCl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2lmX2JvZHlAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5MwogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2RpZyAtMQogICAgdW5jb3ZlciAyCiAgICByZXRzdWIKCl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NQogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NgogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NC0zOTgKICAgIC8vIGFjY3J1ZWQgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICAvLyAgICAgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICkKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MDIKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozOTktNDAzCiAgICAvLyByZXR1cm4gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgYWNjcnVlZCwKICAgIC8vICAgICBlbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICBmcmFtZV9kaWcgLTEKICAgIHVuY292ZXIgMgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yKGRpc2NvdW50X2ZhY3RvcjogdWludDY0LCByZWRlbXB0aW9uX2ZhY3RvcjogdWludDY0KSAtPiB1aW50NjQ6Cl9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ2Mi00NjYKICAgIC8vIGRlZiBfZGlzY291bnRfYW5udWl0eV9mYWN0b3IoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBkaXNjb3VudF9mYWN0b3I6IFVJbnQ2NCwKICAgIC8vICAgICByZWRlbXB0aW9uX2ZhY3RvcjogVUludDY0LAogICAgLy8gKSAtPiBVSW50NjQ6CiAgICBwcm90byAyIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ2OAogICAgLy8gaWYgcmVkZW1wdGlvbl9mYWN0b3IgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0xCiAgICBibnogX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDY5CiAgICAvLyByZXR1cm4gZGlzY291bnRfZmFjdG9yCiAgICBmcmFtZV9kaWcgLTIKICAgIHJldHN1YgoKX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3MAogICAgLy8gcGVyaW9kX3JhdGUgPSBzZWxmLmZpeGVkX3BvaW50X3NjYWxlICsgc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzEKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzAtNDc0CiAgICAvLyBwZXJpb2RfcmF0ZSA9IHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgKyBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICByZWRlbXB0aW9uX2ZhY3RvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICBkaWcgMgogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgICsKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3NQogICAgLy8gYXNzZXJ0IHBlcmlvZF9yYXRlID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGR1cAogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDc4CiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDc2LTQ4MAogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIGRpc2NvdW50X2ZhY3RvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gICAgIHBlcmlvZF9yYXRlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkoZW50cnk6IGJ5dGVzLCBwYXlsb2FkOiBieXRlcykgLT4gYnl0ZXMsIGJ5dGVzOgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MTMtNjE1CiAgICAvLyBkZWYgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5KAogICAgLy8gICAgIHNlbGYsIGVudHJ5OiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSwgcGF5bG9hZDogdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0CiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAyIDIKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjIzCiAgICAvLyBhc3NlcnQgZW50cnkuZXZlbnRfaWQgPT0gc2VsZi5ldmVudF9jdXJzb3IsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGN1cnNvcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjI0CiAgICAvLyBhc3NlcnQgZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsIGVyci5OT19EVUVfQ0FTSEZMT1cKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPD0KICAgIGFzc2VydCAvLyBObyBkdWUgY2FzaGZsb3cgdG8gcGF5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MjYKICAgIC8vIGV2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYyNwogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX0lFRCk6CiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGR1cAogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYyOC02MzAKICAgIC8vICMgSUVEIGZpbmFsaXplcyBpc3N1YW5jZTogcmVzZXJ2ZWQgdW5pdHMgYmVjb21lIGFjdGl2YXRhYmxlIGFuZCB0aGUKICAgIC8vICMgc2NoZWR1bGUncyBpbml0aWFsIGNvbnRyYWN0dWFsIHN0YXRlIGJlY29tZXMgbGl2ZS4KICAgIC8vIGFzc2VydCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzIKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPT0gc2VsZi50b3RhbF91bml0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjMxLTYzMwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID09IHNlbGYudG90YWxfdW5pdHMKICAgIC8vICksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9JTkNPTVBMRVRFCiAgICBhc3NlcnQgLy8gUHJpbWFyeSBkaXN0cmlidXRpb24gaXMgbm90IGNvbXBsZXRlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzQKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjXzMgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM1CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzYKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAzMwogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzcKICAgIC8vIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM4CiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzkKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0MAogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX0FDVElWRSkKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgMTAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDUxCiAgICAvLyBhc3NlcnQgZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSA9PSBVSW50NjQoZW51bXMuRVZUX0lFRCksIGVyci5OT1RfRVZUX0lFRAogICAgZnJhbWVfZGlnIDExCiAgICBhc3NlcnQgLy8gTm90IElFRCBldmVudAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDUyCiAgICAvLyByZXR1cm4gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0MS02NDUKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1zZWxmLl9lbnRyeV9pZWRfYW1vdW50KGVudHJ5KSwKICAgIC8vICAgICBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0NAogICAgLy8gc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0MS02NDUKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1zZWxmLl9lbnRyeV9pZWRfYW1vdW50KGVudHJ5KSwKICAgIC8vICAgICBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICAvLyApCiAgICBjYWxsc3ViIF9lbWl0X2V4ZWN1dGlvbl9ldmVudAogICAgZHVwCiAgICBmcmFtZV9idXJ5IC0yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NDYKICAgIC8vIHJldHVybgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0OQogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ICs9IHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBmcmFtZV9idXJ5IC0yCiAgICArCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1MQogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1JSKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCAxMgogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMTAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1NQogICAgLy8gcGF5bG9hZC5vYnNlcnZlZF9yYXRlLAogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjU2CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzNiAvLyAicmF0ZV9yZXNldF9tdWx0aXBsaWVyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1NwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1Mi02NTgKICAgIC8vICMgUlIgZGVyaXZlcyB0aGUgbmV4dCByYXRlIGZyb20gYW4gb2JzZXJ2ZWQgb3JhY2xlIHZhbHVlIHBsdXMgdGhlCiAgICAvLyAjIGNvbnRyYWN0IHNwcmVhZCAvIG11bHRpcGxpZXIgdGVybXMsIHRoZW4gZW5mb3JjZXMgZmxvb3IgYW5kIGNhcC4KICAgIC8vIG9ic2VydmVkX3JhdGUgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBwYXlsb2FkLm9ic2VydmVkX3JhdGUsCiAgICAvLyAgICAgc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICkKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjAKICAgIC8vIG9ic2VydmVkX3JhdGUgKyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzUgLy8gInJhdGVfcmVzZXRfc3ByZWFkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkIGV4aXN0cwogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MzQKICAgIC8vIGlmIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgYW5kIHJhdGUgPCBzZWxmLnJhdGVfcmVzZXRfZmxvb3I6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzggLy8gImhhc19yYXRlX3Jlc2V0X2Zsb29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmhhc19yYXRlX3Jlc2V0X2Zsb29yIGV4aXN0cwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyOSAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X2Zsb29yIGV4aXN0cwogICAgZnJhbWVfZGlnIDYKICAgID4KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MzUKICAgIC8vIHJhdGUgPSBzZWxmLnJhdGVfcmVzZXRfZmxvb3IKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyOSAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDYKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfZmxvb3IgZXhpc3RzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1NToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjczNgogICAgLy8gaWYgc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgYW5kIHJhdGUgPiBzZWxmLnJhdGVfcmVzZXRfY2FwOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDM5IC8vICJoYXNfcmF0ZV9yZXNldF9jYXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwIGV4aXN0cwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTgKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMCAvLyAicmF0ZV9yZXNldF9jYXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9jYXAgZXhpc3RzCiAgICBmcmFtZV9kaWcgNgogICAgPAogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjczNwogICAgLy8gcmF0ZSA9IHNlbGYucmF0ZV9yZXNldF9jYXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMCAvLyAicmF0ZV9yZXNldF9jYXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSA2CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X2NhcCBleGlzdHMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjU5CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IHNlbGYuX2NsYW1wX3JhdGUoCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NTktNjYxCiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IHNlbGYuX2NsYW1wX3JhdGUoCiAgICAvLyAgICAgb2JzZXJ2ZWRfcmF0ZSArIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQKICAgIC8vICkKICAgIGZyYW1lX2RpZyA2CiAgICBhcHBfZ2xvYmFsX3B1dAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMTg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzEKICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QSSk6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMjAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY3MgogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzMKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDIzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc4CiAgICAvLyBpZiBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKToKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAyOQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc5CiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFJGKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCA1CiAgICA9PQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMzAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5MAogICAgLy8gZGlzY291bnRfZmFjdG9yID0gc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0OTEKICAgIC8vIGRlbm9taW5hdG9yID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0OTIKICAgIC8vIHNraXBfZmlyc3RfcmVkZW1wdGlvbiA9IEZhbHNlCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSA3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0OTQKICAgIC8vIGlmIGVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IgPiBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMjUKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgOAogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMzUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5NS00OTkKICAgIC8vICMgQW4gaW5pdGlhbCBQUkYgbWF5IGRlc2NyaWJlIHRoZSBmaXJzdCByZWRlbXB0aW9uIHBlcmlvZCBkaXJlY3RseS4KICAgIC8vIGRpc2NvdW50X2ZhY3RvciA9IHNlbGYuX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yKAogICAgLy8gICAgIGRpc2NvdW50X2ZhY3RvciwKICAgIC8vICAgICBlbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyA4CiAgICBjYWxsc3ViIF9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwMQogICAgLy8gc2tpcF9maXJzdF9yZWRlbXB0aW9uID0gVHJ1ZQogICAgaW50Y18xIC8vIDEKICAgIGZyYW1lX2J1cnkgNwogICAgZnJhbWVfYnVyeSAxCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAzNToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwMwogICAgLy8gZnV0dXJlX2V2ZW50X2lkID0gc2VsZi5ldmVudF9jdXJzb3IgKyBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X3doaWxlX3RvcEAzNjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwNAogICAgLy8gd2hpbGUgZnV0dXJlX2V2ZW50X2lkIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGZyYW1lX2RpZyAzCiAgICA+CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfd2hpbGVANDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwNQogICAgLy8gZnV0dXJlX2VudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KGZ1dHVyZV9ldmVudF9pZCkKICAgIGZyYW1lX2RpZyAzCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MDYKICAgIC8vIGZ1dHVyZV9ldmVudF90eXBlID0gZnV0dXJlX2VudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA3LTUwOAogICAgLy8gIyBPbmx5IHJlZGVtcHRpb24tYmVhcmluZyBldmVudHMgY29udHJpYnV0ZSB0byB0aGUgYW5udWl0eSBkZW5vbWluYXRvci4KICAgIC8vIGlzX3JlZGVtcHRpb25fZXZlbnQgPSBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1BSKSBvciAoCiAgICBwdXNoaW50IDMKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MDctNTExCiAgICAvLyAjIE9ubHkgcmVkZW1wdGlvbi1iZWFyaW5nIGV2ZW50cyBjb250cmlidXRlIHRvIHRoZSBhbm51aXR5IGRlbm9taW5hdG9yLgogICAgLy8gaXNfcmVkZW1wdGlvbl9ldmVudCA9IGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpIG9yICgKICAgIC8vICAgICBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgLy8gICAgIGFuZCBmdXR1cmVfZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKQogICAgLy8gKQogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX3RydWVANDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwOQogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCkKICAgIGZyYW1lX2RpZyA0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA5LTUxMAogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCkKICAgIC8vIGFuZCBmdXR1cmVfZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUxMAogICAgLy8gYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICBmcmFtZV9kaWcgMAogICAgcHVzaGludCAyNQogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwOS01MTAKICAgIC8vIGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfTUQpCiAgICAvLyBhbmQgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IgPiBVSW50NjQoMCkKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX2ZhbHNlQDQxCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF90cnVlQDQwOgogICAgaW50Y18xIC8vIDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX21lcmdlQDQyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTEyCiAgICAvLyBpZiBpc19yZWRlbXB0aW9uX2V2ZW50OgogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANDcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUxMwogICAgLy8gaWYgc2tpcF9maXJzdF9yZWRlbXB0aW9uOgogICAgZnJhbWVfZGlnIDcKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlANDUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUxNAogICAgLy8gc2tpcF9maXJzdF9yZWRlbXB0aW9uID0gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDcKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDQ3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTIxCiAgICAvLyBmdXR1cmVfZXZlbnRfaWQgKz0gVUludDY0KDEpCiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMwogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfd2hpbGVfdG9wQDM2CgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDQ1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTE4CiAgICAvLyBmdXR1cmVfZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIGZyYW1lX2RpZyAwCiAgICBwdXNoaW50IDI1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTE2LTUxOQogICAgLy8gZGlzY291bnRfZmFjdG9yID0gc2VsZi5fZGlzY291bnRfYW5udWl0eV9mYWN0b3IoCiAgICAvLyAgICAgZGlzY291bnRfZmFjdG9yLAogICAgLy8gICAgIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDIKICAgIHN3YXAKICAgIGNhbGxzdWIgX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTIwCiAgICAvLyBkZW5vbWluYXRvciArPSBkaXNjb3VudF9mYWN0b3IKICAgIGZyYW1lX2RpZyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANDcKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX2ZhbHNlQDQxOgogICAgaW50Y18wIC8vIDAKICAgIGIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfbWVyZ2VANDIKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl93aGlsZUA0ODoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUyMwogICAgLy8gYXNzZXJ0IGRlbm9taW5hdG9yID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGZyYW1lX2RpZyAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjQKICAgIC8vIG51bWVyYXRvciA9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUyNQogICAgLy8gaWYgZW50cnkuZmxhZ3MgJiBVSW50NjQoZW51bXMuRkxBR19JTklUSUFMX1BSRikgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDU3CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18yIC8vIDgKICAgICYKICAgIGJueiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1MAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTI2LTUyNwogICAgLy8gIyBTdWJzZXF1ZW50IFBSRiBldmVudHMgYW1vcnRpemUgYm90aCBwcmluY2lwYWwgYW5kIGFscmVhZHkgYWNjcnVlZCBjYXJyeS4KICAgIC8vIG51bWVyYXRvciArPSBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICArCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1MDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUzMAogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUyOC01MzIKICAgIC8vIHJldHVybiBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBudW1lcmF0b3IsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICAgICBkZW5vbWluYXRvciwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAxCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjgwCiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBzZWxmLl9yZWNhbGN1bGF0ZV9hbm51aXR5X3BheW1lbnQoCiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4MC02ODIKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IHNlbGYuX3JlY2FsY3VsYXRlX2FubnVpdHlfcGF5bWVudCgKICAgIC8vICAgICBlbnRyeQogICAgLy8gKQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDMwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njg1CiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODYtNjkwCiAgICAvLyBzZWxmLl9lbWl0X2V4ZWN1dGlvbl9ldmVudCgKICAgIC8vICAgICBlbnRyeT1lbnRyeSwKICAgIC8vICAgICBwYXlvZmY9VUludDY0KDApLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njg4CiAgICAvLyBwYXlvZmY9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4OQogICAgLy8gc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODYtNjkwCiAgICAvLyBzZWxmLl9lbWl0X2V4ZWN1dGlvbl9ldmVudCgKICAgIC8vICAgICBlbnRyeT1lbnRyeSwKICAgIC8vICAgICBwYXlvZmY9VUludDY0KDApLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGNhbGxzdWIgX2VtaXRfZXhlY3V0aW9uX2V2ZW50CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfYnVyeSAxCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAyOToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4NAogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gZW50cnkubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDQxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAzMAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAyMDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY3NAogICAgLy8gZWxpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfSVBDQik6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgMTgKICAgID09CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAyMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc1LTY3NgogICAgLy8gIyBJUENCIGtlZXBzIHByaW5jaXBhbCB1bmNoYW5nZWQgYW5kIG9ubHkgcmVzZXRzIHRoZSBpbnRlcmVzdCBiYXNlLgogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDIzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDEwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjYyCiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9SUkYpOgogICAgZnJhbWVfZGlnIDEwCiAgICBwdXNoaW50IDExCiAgICA9PQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAxNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjYzCiAgICAvLyBuZXh0X3JhdGUgPSBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZQogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2NAogICAgLy8gaWYgbmV4dF9yYXRlID09IFVJbnQ2NCgwKToKICAgIGJueiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAxMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY1CiAgICAvLyBuZXh0X3JhdGUgPSBzZWxmLnJhdGVfcmVzZXRfbmV4dAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDM3IC8vICJyYXRlX3Jlc2V0X25leHQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSA1CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X25leHQgZXhpc3RzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2NgogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPSBuZXh0X3JhdGUKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGZyYW1lX2RpZyA1CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAxOAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAxNDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2OAogICAgLy8gaWYgZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUgIT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDkKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjkKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGZyYW1lX2RpZyA5CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAxOAoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbWl0X2V4ZWN1dGlvbl9ldmVudChlbnRyeTogYnl0ZXMsIHBheW9mZjogdWludDY0LCBzZXR0bGVkX2Ftb3VudDogdWludDY0KSAtPiBieXRlczoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njk2LTcwMgogICAgLy8gZGVmIF9lbWl0X2V4ZWN1dGlvbl9ldmVudCgKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgICosCiAgICAvLyAgICAgZW50cnk6IHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5LAogICAgLy8gICAgIHBheW9mZjogVUludDY0LAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50OiBVSW50NjQsCiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAzIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcwNgogICAgLy8gY29udHJhY3RfaWQ9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25faWQuaWQsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uSUQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcwNwogICAgLy8gZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzA4CiAgICAvLyBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICBmcmFtZV9kaWcgLTMKICAgIGV4dHJhY3QgOCAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MDkKICAgIC8vIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgZnJhbWVfZGlnIC0zCiAgICBleHRyYWN0IDkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzEwCiAgICAvLyBhcHBsaWVkX2F0PUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzEzCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBmcmFtZV9kaWcgLTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcwOAogICAgLy8gZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgaW50Y18yIC8vIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxMwogICAgLy8gc2VsZi5fcGF5b2ZmX3NpZ24oZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSwgcGF5b2ZmKQogICAgZ2V0Ynl0ZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzQyCiAgICAvLyBpZiBwYXlvZmYgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0yCiAgICBibnogX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzQzCiAgICAvLyByZXR1cm4gVUludDY0KGVudW1zLlBBWU9GRl9TSUdOX1BPU0lUSVZFKQogICAgaW50Y18xIC8vIDEKCl9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9wYXlvZmZfc2lnbkA3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzEyLTcxNAogICAgLy8gcGF5b2ZmX3NpZ249YXJjNC5VSW50OCgKICAgIC8vICAgICBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICAvLyApLAogICAgaXRvYgogICAgZHVwCiAgICBiaXRsZW4KICAgIGludGNfMiAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBleHRyYWN0IDcgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE2CiAgICAvLyBjdXJyZW5jeV9pZD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxNwogICAgLy8gc2VxdWVuY2U9ZW50cnkuZXZlbnRfaWQgKyBVSW50NjQoMSksCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzA1LTcxOAogICAgLy8gRXhlY3V0aW9uRXZlbnQoCiAgICAvLyAgICAgY29udHJhY3RfaWQ9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25faWQuaWQsCiAgICAvLyAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgcGF5b2ZmPXBheW9mZiwKICAgIC8vICAgICBwYXlvZmZfc2lnbj1hcmM0LlVJbnQ4KAogICAgLy8gICAgICAgICBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBzZXR0bGVkX2Ftb3VudD1zZXR0bGVkX2Ftb3VudCwKICAgIC8vICAgICBjdXJyZW5jeV9pZD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgc2VxdWVuY2U9ZW50cnkuZXZlbnRfaWQgKyBVSW50NjQoMSksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMAogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAyCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAzCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyA0CiAgICBpdG9iCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMgogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcwNC03MTkKICAgIC8vIGFyYzQuZW1pdCgKICAgIC8vICAgICBFeGVjdXRpb25FdmVudCgKICAgIC8vICAgICAgICAgY29udHJhY3RfaWQ9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25faWQuaWQsCiAgICAvLyAgICAgICAgIGV2ZW50X2lkPWVudHJ5LmV2ZW50X2lkLAogICAgLy8gICAgICAgICBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICAvLyAgICAgICAgIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgICAgICBhcHBsaWVkX2F0PUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gICAgICAgICBwYXlvZmY9cGF5b2ZmLAogICAgLy8gICAgICAgICBwYXlvZmZfc2lnbj1hcmM0LlVJbnQ4KAogICAgLy8gICAgICAgICAgICAgc2VsZi5fcGF5b2ZmX3NpZ24oZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSwgcGF5b2ZmKQogICAgLy8gICAgICAgICApLAogICAgLy8gICAgICAgICBzZXR0bGVkX2Ftb3VudD1zZXR0bGVkX2Ftb3VudCwKICAgIC8vICAgICAgICAgY3VycmVuY3lfaWQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgICAgICBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIC8vICAgICApCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHg5YTMzMmI5NSAvLyBtZXRob2QgIkV4ZWN1dGlvbkV2ZW50KHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDQKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gKFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwgVUludDY0KGVudW1zLkVWVF9QSSkpOgogICAgZnJhbWVfZGlnIDUKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYm56IF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9pZl9ib2R5QDUKICAgIGZyYW1lX2RpZyA1CiAgICBwdXNoaW50IDQKICAgID09CiAgICBieiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUA2CgpfZW1pdF9leGVjdXRpb25fZXZlbnRfaWZfYm9keUA1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzQ1CiAgICAvLyByZXR1cm4gVUludDY0KGVudW1zLlBBWU9GRl9TSUdOX1BPU0lUSVZFKQogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxMwogICAgLy8gc2VsZi5fcGF5b2ZmX3NpZ24oZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSwgcGF5b2ZmKQogICAgYiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fcGF5b2ZmX3NpZ25ANwoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc0NgogICAgLy8gcmV0dXJuIFVJbnQ2NChlbnVtcy5QQVlPRkZfU0lHTl9ORUdBVElWRSkKICAgIHB1c2hpbnQgMjU1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTMKICAgIC8vIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIGIgX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX3BheW9mZl9zaWduQDcKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fcm9sZV9pc19hY3RpdmUocm9sZV9tYXA6IGJ5dGVzLCByb2xlX2FkZHJlc3M6IGJ5dGVzKSAtPiB1aW50NjQ6Cl9yb2xlX2lzX2FjdGl2ZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NwogICAgLy8gZGVmIF9yb2xlX2lzX2FjdGl2ZShzZWxmLCByb2xlX21hcDogdHlwLlJiYWNSb2xlLCByb2xlX2FkZHJlc3M6IEFjY291bnQpIC0+IGJvb2w6CiAgICBwcm90byAyIDEKICAgIHB1c2hieXRlcyAiIgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU4LTYyCiAgICAvLyByZXR1cm4gc2VsZi5faGFzX3JvbGUocm9sZV9tYXAsIHJvbGVfYWRkcmVzcykgYW5kICgKICAgIC8vICAgICByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICkKICAgIGJ6IF9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIEJveE1hcCBlbnRyeSBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYwCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MAogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgPD0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYxCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIEJveE1hcCBlbnRyeSBleGlzdHMKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYwLTYxCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDAKICAgID49CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTktNjEKICAgIC8vIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IF9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQKICAgIGludGNfMSAvLyAxCgpfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU4LTYyCiAgICAvLyByZXR1cm4gc2VsZi5faGFzX3JvbGUocm9sZV9tYXAsIHJvbGVfYWRkcmVzcykgYW5kICgKICAgIC8vICAgICByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICkKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgX3JvbGVfaXNfYWN0aXZlX2Jvb2xfbWVyZ2VANQoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkgLT4gdm9pZDoKX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjUKICAgIC8vIGFzc2VydCBzZWxmLl9pc19hcnJhbmdlcihUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjUyCiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzID09IHNlbGYuYXJyYW5nZXIudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOCAvLyAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcnJhbmdlciBleGlzdHMKICAgID09CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjUKICAgIC8vIGFzc2VydCBzZWxmLl9pc19hcnJhbmdlcihUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKSAtPiB2b2lkOgpfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODMKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5hc3NldF9kZWZhdWx0ZWQsIGVyci5ERUZBVUxURUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0MSAvLyAiYXNzZXRfZGVmYXVsdGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2RlZmF1bHRlZCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBEZWZhdWx0ZWQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpIC0+IHZvaWQ6Cl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4NgogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFzc2V0X3N1c3BlbmRlZCwgZXJyLlNVU1BFTkRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDMzIC8vICJhc3NldF9zdXNwZW5kZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfc3VzcGVuZGVkIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIFN1c3BlbmRlZCBvcGVyYXRpb25zCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZDogdWludDY0KSAtPiB2b2lkOgpfYXNzZXJ0X3ZhbGlkX3JvbGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODgKICAgIC8vIGRlZiBfYXNzZXJ0X3ZhbGlkX3JvbGUoc2VsZiwgcm9sZV9pZDogVUludDY0KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkwCiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICBwdXNoaW50IDIwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MQogICAgLy8gVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIHB1c2hpbnQgMjUKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkyCiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgcHVzaGludCA0MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTMKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIHB1c2hpbnQgNTAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojk0CiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIHB1c2hpbnQgNjAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojk1CiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgcHVzaGludCA3MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTYKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIHB1c2hpbnQgODAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJ6IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX2ZhbHNlQDgKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANzoKICAgIGludGNfMSAvLyAxCgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9tZXJnZUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBhc3NlcnQgLy8gSW52YWxpZCByb2xlIGlkZW50aWZpZXIKICAgIHJldHN1YgoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfZmFsc2VAODoKICAgIGludGNfMCAvLyAwCiAgICBiIF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX21lcmdlQDkK", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCAzMiAxNTAwCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUgInN0YXR1cyIgImV2ZW50X2N1cnNvciIgInNjaGVkdWxlX2VudHJ5X2NvdW50IiAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIiAiZml4ZWRfcG9pbnRfc2NhbGUiICJhY2NydWVkX2ludGVyZXN0IiAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIgMHg1MjIzNDE2MzYzNmY3NTZlNzQyMyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIiAiY29udHJhY3RfdHlwZSIgInJlc2VydmVkX3VuaXRzX3RvdGFsIiAicmVzZXJ2ZWRfcHJpbmNpcGFsIiAidG90YWxfdW5pdHMiICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIiAicmVzZXJ2ZWRfaW50ZXJlc3QiICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IiAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiIDB4NTIyMzQxNzI3MjYxNmU2NzY1NzIyMyAic2V0dGxlbWVudF9hc3NldF9pZCIgImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IiAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzIDB4NTIyMzQxNjM2MzZmNzU2ZTc0NGQ2MTZlNjE2NzY1NzIyMyAweDUzMjMgMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzIDB4NTIyMzRmNzA0NDYxNjU2ZDZmNmUyMyAiaW5pdGlhbF9leGNoYW5nZV9kYXRlIiAidHJhbnNmZXJfb3BlbmluZ19kYXRlIiAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIiAicmF0ZV9yZXNldF9mbG9vciIgInJhdGVfcmVzZXRfY2FwIiAweDUyMjM1NDcyNzU3Mzc0NjU2NTIzICJhc3NldF9zdXNwZW5kZWQiICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIiAicmF0ZV9yZXNldF9zcHJlYWQiICJyYXRlX3Jlc2V0X211bHRpcGxpZXIiICJyYXRlX3Jlc2V0X25leHQiICJoYXNfcmF0ZV9yZXNldF9mbG9vciIgImhhc19yYXRlX3Jlc2V0X2NhcCIgMHgwMCAiYXNzZXRfZGVmYXVsdGVkIiAicHJvc3BlY3R1c19oYXNoIiAicHJvc3BlY3R1c191cmwiICJkZW5vbWluYXRpb25fYXNzZXRfaWQiICJtYXR1cml0eV9kYXRlIiAiZGF5X2NvdW50X2NvbnZlbnRpb24iIDB4MDY4MTAxIDB4MDAwMAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4LTI5CiAgICAvLyAjIFJCQUMgUm9sZXMKICAgIC8vIHNlbGYuYXJyYW5nZXIgPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX0FSUkFOR0VSKQogICAgYnl0ZWMgMTggLy8gMHg1MjIzNDE3MjcyNjE2ZTY3NjU3MjIzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzAKICAgIC8vIHNlbGYub3BfZGFlbW9uID0gR2xvYmFsU3RhdGUoQWNjb3VudCgpLCBrZXk9Y3N0LlBSRUZJWF9JRF9PUF9EQUVNT04pCiAgICBieXRlYyAyNiAvLyAweDUyMjM0ZjcwNDQ2MTY1NmQ2ZjZlMjMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo0Ny00OAogICAgLy8gIyBELUFTQSBHb3Zlcm5hbmNlCiAgICAvLyBzZWxmLmFzc2V0X3N1c3BlbmRlZCA9IEZhbHNlCiAgICBieXRlYyAzMyAvLyAiYXNzZXRfc3VzcGVuZGVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NDkKICAgIC8vIHNlbGYuYXNzZXRfZGVmYXVsdGVkID0gRmFsc2UKICAgIGJ5dGVjIDQxIC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU2LTU3CiAgICAvLyAjIENvbnRyYWN0CiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwLTYxCiAgICAvLyAjIFByb3NwZWN0dXMgKEluZm9ybWF0aW9uYWwpCiAgICAvLyBzZWxmLnByb3NwZWN0dXNfaGFzaCA9IEJ5dGVzKCkKICAgIGJ5dGVjIDQyIC8vICJwcm9zcGVjdHVzX2hhc2giCiAgICBwdXNoYnl0ZXMgMHgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MgogICAgLy8gc2VsZi5wcm9zcGVjdHVzX3VybCA9IFN0cmluZygpCiAgICBieXRlYyA0MyAvLyAicHJvc3BlY3R1c191cmwiCiAgICBwdXNoYnl0ZXMgIiIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NC02NQogICAgLy8gIyBEZW5vbWluYXRpb24KICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gQXNzZXQoKQogICAgYnl0ZWMgNDQgLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjYKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCA9IEFzc2V0KCkKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OC02OQogICAgLy8gIyBUaW1lCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgMjcgLy8gImluaXRpYWxfZXhjaGFuZ2VfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzAKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgNDUgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxCiAgICAvLyBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgMjggLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIKICAgIC8vIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlID0gdHlwLlRpbWVTdGFtcCgpCiAgICBieXRlYyAyOSAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NC03NQogICAgLy8gIyBEYXkgQ291bnQgQ29udmVudGlvbgogICAgLy8gc2VsZi5kYXlfY291bnRfY29udmVudGlvbiA9IFVJbnQ2NCgpCiAgICBieXRlYyA0NiAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc3LTc4CiAgICAvLyAjIFVuaXRzCiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzID0gVUludDY0KCkKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPSBVSW50NjQoKQogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MS04MgogICAgLy8gIyBQcmluY2lwYWwKICAgIC8vIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPSBVSW50NjQoKQogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MwogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBVSW50NjQoKQogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NAogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gVUludDY0KCkKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NQogICAgLy8gc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gRmFsc2UKICAgIGJ5dGVjIDM0IC8vICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4Ny04OAogICAgLy8gIyBJbnRlcmVzdAogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gVUludDY0KCkKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg5CiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgPSBVSW50NjQoKQogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTEtOTIKICAgIC8vICMgSW50ZXJlc3QgUmF0ZXMKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTMKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQgPSBVSW50NjQoKQogICAgYnl0ZWMgMzUgLy8gInJhdGVfcmVzZXRfc3ByZWFkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NAogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIgPSBVSW50NjQoKQogICAgYnl0ZWMgMzYgLy8gInJhdGVfcmVzZXRfbXVsdGlwbGllciIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTUKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9mbG9vciA9IFVJbnQ2NCgpCiAgICBieXRlYyAzMCAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTYKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9jYXAgPSBVSW50NjQoKQogICAgYnl0ZWMgMzEgLy8gInJhdGVfcmVzZXRfY2FwIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NwogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X25leHQgPSBVSW50NjQoKQogICAgYnl0ZWMgMzcgLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTgKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgPSBGYWxzZQogICAgYnl0ZWMgMzggLy8gImhhc19yYXRlX3Jlc2V0X2Zsb29yIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OQogICAgLy8gc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgPSBGYWxzZQogICAgYnl0ZWMgMzkgLy8gImhhc19yYXRlX3Jlc2V0X2NhcCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAxLTEwMgogICAgLy8gIyBQcmltYXJ5IERpc3RyaWJ1dGlvbgogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgPSBVSW50NjQoKQogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAzCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0ID0gVUludDY0KCkKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA1LTEwNgogICAgLy8gIyBDdW11bGF0aXZlIFBlci1Vbml0IEZpeGVkLVBvaW50IEluZGV4ZXMKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4ID0gVUludDY0KCkKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1CiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciA9IFVJbnQ2NCgpCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNgogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA9IFVJbnQ2NCgpCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE4LTExOQogICAgLy8gIyBTY2FsaW5nCiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlID0gVUludDY0KCkKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6MjMKICAgIC8vIGFzc2VydCBUeG4uZ2xvYmFsX251bV9ieXRlX3NsaWNlID09IGNmZy5HTE9CQUxfQllURVMsIGVyci5XUk9OR19HTE9CQUxfQllURVMKICAgIHR4biBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgQnl0ZXMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjI0CiAgICAvLyBhc3NlcnQgVHhuLmdsb2JhbF9udW1fdWludCA9PSBjZmcuR0xPQkFMX1VJTlRTLCBlcnIuV1JPTkdfR0xPQkFMX1VJTlRTCiAgICB0eG4gR2xvYmFsTnVtVWludAogICAgcHVzaGludCAzNwogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgVUludHMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBhc3NlcnQgVHhuLmxvY2FsX251bV9ieXRlX3NsaWNlID09IGNmZy5MT0NBTF9CWVRFUywgZXJyLldST05HX0xPQ0FMX0JZVEVTCiAgICB0eG4gTG9jYWxOdW1CeXRlU2xpY2UKICAgICEKICAgIGFzc2VydCAvLyBXcm9uZyBMb2NhbCBCeXRlcyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6MjYKICAgIC8vIGFzc2VydCBUeG4ubG9jYWxfbnVtX3VpbnQgPT0gY2ZnLkxPQ0FMX1VJTlRTLCBlcnIuV1JPTkdfTE9DQUxfVUlOVFMKICAgIHR4biBMb2NhbE51bVVpbnQKICAgICEKICAgIGFzc2VydCAvLyBXcm9uZyBMb2NhbCBVSW50cyBhbGxvY2F0aW9uCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kX2FzYS9jb250cmFjdC5weTo4LTE4CiAgICAvLyBjbGFzcyBEQVNBKAogICAgLy8gICAgIFBheW1lbnRBZ2VudCwKICAgIC8vICAgICBUcmFuc2ZlckFnZW50LAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gICAgIGF2bV92ZXJzaW9uPTEyLAogICAgLy8gKToKICAgIHB1c2hieXRlcyAweDkxNGYwNGViIC8vIG1ldGhvZCAiY29udHJhY3RfdXBkYXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9jb250cmFjdF91cGRhdGVfcm91dGVANAoKbWFpbl9zd2l0Y2hfY2FzZV9uZXh0QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6OC0xOAogICAgLy8gY2xhc3MgREFTQSgKICAgIC8vICAgICBQYXltZW50QWdlbnQsCiAgICAvLyAgICAgVHJhbnNmZXJBZ2VudCwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBhdm1fdmVyc2lvbj0xMiwKICAgIC8vICk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBieiBtYWluX2NyZWF0ZV9Ob09wQDMyCiAgICBwdXNoYnl0ZXNzIDB4YjQ0NjE4YzggMHhlNzgzMjUyOSAweDk0Mzg4NzIzIDB4NmM4NWUzZWUgMHhiZGQxYTk0NCAweDdjMGYxODEyIDB4MTRmYzEwZWYgMHg3NGE3Mjk3ZiAweDA5ZDRmZTE0IDB4OWE5YmZhODUgMHg4NWVlZDMzZCAweGFiMmMwZmM0IDB4ZDlmMjI1YWMgMHg5ODgzNTA1YSAweDhlYTZlNzRjIDB4MDJhZjU1N2EgMHg4MmY3MWIyZCAweGVmMDRmNWQzIDB4ZGYzNDM1NTAgMHgzZGJlODBiZCAweDFlM2U0OGU3IDB4MDEwYzgyOTkgMHg3NDA2YWNkMiAweDFhNzJhMmVlIC8vIG1ldGhvZCAiZnVuZF9kdWVfY2FzaGZsb3dzKHVpbnQ2NCkodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImNsYWltX2R1ZV9jYXNoZmxvd3MoYWRkcmVzcyxieXRlW10pKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxieXRlW10pIiwgbWV0aG9kICJ0cmFuc2Zlcl9zZXRfc2NoZWR1bGUodWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInByaW1hcnlfZGlzdHJpYnV0aW9uKGFkZHJlc3MsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidHJhbnNmZXIoYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgImFjY291bnRfc3VzcGVuc2lvbihhZGRyZXNzLGJvb2wpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X29wZW4oYWRkcmVzcyxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAiYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzKGFkZHJlc3MsYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgImFjY291bnRfZ2V0X3Bvc2l0aW9uKGFkZHJlc3MpKGFkZHJlc3MsdWludDY0LHVpbnQ2NCxib29sLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJjb250cmFjdF9jb25maWcoKHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LGJvb2wsYm9vbCxib29sLHVpbnQ2NCksKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSwoYnl0ZVszMl0sc3RyaW5nKSl1aW50NjQiLCBtZXRob2QgImNvbnRyYWN0X3NjaGVkdWxlKHVpbnQ2NCxib29sLCh1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KVtdKXVpbnQ2NCIsIG1ldGhvZCAiY29udHJhY3RfZXhlY3V0ZV9pZWQoKXVpbnQ2NCIsIG1ldGhvZCAiYXBwbHlfbm9uX2Nhc2hfZXZlbnQodWludDY0LCh1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkpdWludDY0IiwgbWV0aG9kICJhcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudCgodWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkpdWludDY0IiwgbWV0aG9kICJjb250cmFjdF9nZXRfc3RhdGUoKSh1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAiY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50KCkodWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgInJiYWNfcm90YXRlX2FycmFuZ2VyKGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX3NldF9vcF9kYWVtb24oYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgInJiYWNfYXNzaWduX3JvbGUodWludDgsYWRkcmVzcywodWludDY0LHVpbnQ2NCkpdWludDY0IiwgbWV0aG9kICJyYmFjX3Jldm9rZV9yb2xlKHVpbnQ4LGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX2NvbnRyYWN0X3N1c3BlbnNpb24oYm9vbCl1aW50NjQiLCBtZXRob2QgInJiYWNfZ2V0X2FycmFuZ2VyKClhZGRyZXNzIiwgbWV0aG9kICJyYmFjX2dldF9hZGRyZXNzX3JvbGVzKGFkZHJlc3MpKGJvb2wsYm9vbCxib29sLGJvb2wsYm9vbCkiLCBtZXRob2QgInJiYWNfZ2V0X3JvbGVfdmFsaWRpdHkodWludDgsYWRkcmVzcykodWludDY0LHVpbnQ2NCkiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBmdW5kX2R1ZV9jYXNoZmxvd3MgY2xhaW1fZHVlX2Nhc2hmbG93cyB0cmFuc2Zlcl9zZXRfc2NoZWR1bGUgcHJpbWFyeV9kaXN0cmlidXRpb24gdHJhbnNmZXIgYWNjb3VudF9zdXNwZW5zaW9uIGFjY291bnRfb3BlbiBhY2NvdW50X3VwZGF0ZV9wYXltZW50X2FkZHJlc3MgYWNjb3VudF9nZXRfcG9zaXRpb24gY29udHJhY3RfY29uZmlnIGNvbnRyYWN0X3NjaGVkdWxlIGNvbnRyYWN0X2V4ZWN1dGVfaWVkIGFwcGx5X25vbl9jYXNoX2V2ZW50IGFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50IGNvbnRyYWN0X2dldF9zdGF0ZSBjb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnQgcmJhY19yb3RhdGVfYXJyYW5nZXIgcmJhY19zZXRfb3BfZGFlbW9uIHJiYWNfYXNzaWduX3JvbGUgcmJhY19yZXZva2Vfcm9sZSByYmFjX2NvbnRyYWN0X3N1c3BlbnNpb24gcmJhY19nZXRfYXJyYW5nZXIgcmJhY19nZXRfYWRkcmVzc19yb2xlcyByYmFjX2dldF9yb2xlX3ZhbGlkaXR5CiAgICBlcnIKCm1haW5fY3JlYXRlX05vT3BAMzI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6OC0xOAogICAgLy8gY2xhc3MgREFTQSgKICAgIC8vICAgICBQYXltZW50QWdlbnQsCiAgICAvLyAgICAgVHJhbnNmZXJBZ2VudCwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBhdm1fdmVyc2lvbj0xMiwKICAgIC8vICk6CiAgICBwdXNoYnl0ZXMgMHg5NTZkNzE1NiAvLyBtZXRob2QgImNvbnRyYWN0X2NyZWF0ZShhZGRyZXNzKXVpbnQ2NCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIGNvbnRyYWN0X2NyZWF0ZQogICAgZXJyCgptYWluX2NvbnRyYWN0X3VwZGF0ZV9yb3V0ZUA0OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgcHVzaGludCA0IC8vIFVwZGF0ZUFwcGxpY2F0aW9uCiAgICA9PQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICYmCiAgICBhc3NlcnQKICAgIGIgY29udHJhY3RfdXBkYXRlCgoKLy8gX3B1eWFfbGliLnV0aWwuZW5zdXJlX2J1ZGdldChyZXF1aXJlZF9idWRnZXQ6IHVpbnQ2NCwgZmVlX3NvdXJjZTogdWludDY0KSAtPiB2b2lkOgplbnN1cmVfYnVkZ2V0OgogICAgcHJvdG8gMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMTAKICAgICsKCmVuc3VyZV9idWRnZXRfd2hpbGVfdG9wQDE6CiAgICBmcmFtZV9kaWcgMAogICAgZ2xvYmFsIE9wY29kZUJ1ZGdldAogICAgPgogICAgYnogZW5zdXJlX2J1ZGdldF9hZnRlcl93aGlsZUA2CiAgICBpdHhuX2JlZ2luCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgYnl0ZWMgNDcgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtCiAgICBieXRlYyA0NyAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbQogICAgZnJhbWVfZGlnIC0xCiAgICBzd2l0Y2ggZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8wQDMgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8xQDQKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfbmV4dEA1OgogICAgaXR4bl9zdWJtaXQKICAgIGIgZW5zdXJlX2J1ZGdldF93aGlsZV90b3BAMQoKZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8xQDQ6CiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgYiBlbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX25leHRANQoKZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8wQDM6CiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGIgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV9uZXh0QDUKCmVuc3VyZV9idWRnZXRfYWZ0ZXJfd2hpbGVANjoKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucGF5bWVudF9hZ2VudC5QYXltZW50QWdlbnQuZnVuZF9kdWVfY2FzaGZsb3dzW3JvdXRpbmddKCkgLT4gdm9pZDoKZnVuZF9kdWVfY2FzaGZsb3dzOgogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAxMwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NTEKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjUyCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjUzCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo1NQogICAgLy8gaWYgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCk6CiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo1OS02MAogICAgLy8gKyBtYXhfZXZlbnRfY291bnQKICAgIC8vICogVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfUEVSX0VWRU5UX0JVREdFVCkKICAgIGR1cAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjYwCiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfRlVORF9EVUVfQ0FTSEZMT1dTX1BFUl9FVkVOVF9CVURHRVQpCiAgICBwdXNoaW50IDEwMAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjU5LTYwCiAgICAvLyArIG1heF9ldmVudF9jb3VudAogICAgLy8gKiBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19QRVJfRVZFTlRfQlVER0VUKQogICAgKgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjU4CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19CQVNFX0JVREdFVCkKICAgIGludGMgNCAvLyAxNTAwCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NTgtNjAKICAgIC8vIFVJbnQ2NChjc3QuT1BfVVBfRlVORF9EVUVfQ0FTSEZMT1dTX0JBU0VfQlVER0VUKQogICAgLy8gKyBtYXhfZXZlbnRfY291bnQKICAgIC8vICogVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfUEVSX0VWRU5UX0JVREdFVCkKICAgICsKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo1Ni02MgogICAgLy8gZW5zdXJlX2J1ZGdldCgKICAgIC8vICAgICByZXF1aXJlZF9idWRnZXQ9KAogICAgLy8gICAgICAgICBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19CQVNFX0JVREdFVCkKICAgIC8vICAgICAgICAgKyBtYXhfZXZlbnRfY291bnQKICAgIC8vICAgICAgICAgKiBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19QRVJfRVZFTlRfQlVER0VUKQogICAgLy8gICAgICksCiAgICAvLyApCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjY0CiAgICAvLyBwcm9jZXNzZWRfZXZlbnRzID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA1CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjUKICAgIC8vIGZ1bmRlZF9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2NgogICAgLy8gZnVuZGVkX3ByaW5jaXBhbCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTMKCmZ1bmRfZHVlX2Nhc2hmbG93c193aGlsZV90b3BANDoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2OQogICAgLy8gcHJvY2Vzc2VkX2V2ZW50cyA8IG1heF9ldmVudF9jb3VudAogICAgZGlnIDQKICAgIGRpZyAxCiAgICA8CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjktNzAKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgPCBtYXhfZXZlbnRfY291bnQKICAgIC8vIGFuZCBzZWxmLmV2ZW50X2N1cnNvciA8IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQKICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl93aGlsZUAxMQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjcwCiAgICAvLyBhbmQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIDwKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2OS03MAogICAgLy8gcHJvY2Vzc2VkX2V2ZW50cyA8IG1heF9ldmVudF9jb3VudAogICAgLy8gYW5kIHNlbGYuZXZlbnRfY3Vyc29yIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudAogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDExCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzIKICAgIC8vIGVudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KHNlbGYuZXZlbnRfY3Vyc29yKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIGR1cAogICAgYnVyeSAxNwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjczCiAgICAvLyBpZiBlbnRyeS5zY2hlZHVsZWRfdGltZSA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wOgogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDMKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgID4KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAMTEKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3NQogICAgLy8gaWYgbm90IHNlbGYuX2V2ZW50X2lzX2Nhc2goZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSk6CiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ1cnkgMTYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM1MQogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUCksCiAgICBpbnRjXzIgLy8gOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzUwLTM1NAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfTUQpLAogICAgLy8gKQogICAgPT0KICAgIGR1cAogICAgYnVyeSA0CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfdHJ1ZUA1MgogICAgZGlnIDE0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNTIKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNTAtMzU0CiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9NRCksCiAgICAvLyApCiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX3RydWVANTIKICAgIGRpZyAxNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzUzCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX01EKSwKICAgIHB1c2hpbnQgMTkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM1MC0zNTQKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX01EKSwKICAgIC8vICkKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUA1MwoKZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfdHJ1ZUA1MjoKICAgIGludGNfMSAvLyAxCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUA1NDoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3NQogICAgLy8gaWYgbm90IHNlbGYuX2V2ZW50X2lzX2Nhc2goZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSk6CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAMTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU0OAogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X2lkID09IHNlbGYuZXZlbnRfY3Vyc29yLCBlcnIuSU5WQUxJRF9FVkVOVF9DVVJTT1IKICAgIGRpZyAxNQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBjdXJzb3IKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU0OQogICAgLy8gYXNzZXJ0IGVudHJ5LnNjaGVkdWxlZF90aW1lIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLCBlcnIuTk9fRFVFX0NBU0hGTE9XCiAgICBkaWcgMQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPD0KICAgIGFzc2VydCAvLyBObyBkdWUgY2FzaGZsb3cgdG8gcGF5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MTMKICAgIC8vIGlmIGV2ZW50X3R5cGUgbm90IGluIChVSW50NjQoZW51bXMuRVZUX0lQKSwgVUludDY0KGVudW1zLkVWVF9NRCkpOgogICAgZGlnIDIKICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNQogICAgZGlnIDE0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MTQKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDExCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfaW50ZXJlc3RfYW1vdW50QDE2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDI2CiAgICAvLyBldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBidXJ5IDE2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MjcKICAgIC8vIGlmIGV2ZW50X3R5cGUgbm90IGluIChVSW50NjQoZW51bXMuRVZUX1BSKSwgVUludDY0KGVudW1zLkVWVF9NRCkpOgogICAgcHVzaGludCAzCiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE5CiAgICBkaWcgMTQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQyOAogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNgoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnRAMjg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTMKICAgIC8vIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGRpZyAxNQogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTU2CiAgICAvLyBpZiBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKToKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDI5CiAgICBkaWcgNwogICAgYnVyeSA5CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzODoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU3Mi01NzQKICAgIC8vICMgRnVuZGluZyB1c2VzIHBlci11bml0IGN1bXVsYXRpdmUgaW5kaWNlcyBzbyBlYWNoIGhvbGRlciBjYW4gc2V0dGxlCiAgICAvLyAjIGluZGVwZW5kZW50bHkgZnJvbSBpdHMgY3VycmVudCB1bml0IGJhbGFuY2UuCiAgICAvLyBpbnRlcmVzdF9pbmRleF9kZWx0YSA9IHNlbGYuX2Ftb3VudF90b19pbmRleF9kZWx0YShpbnRlcmVzdF9hbW91bnRfZHVlKQogICAgZGlnIDEwCiAgICBjYWxsc3ViIF9hbW91bnRfdG9faW5kZXhfZGVsdGEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU3NQogICAgLy8gcHJpbmNpcGFsX2luZGV4X2RlbHRhID0gc2VsZi5fYW1vdW50X3RvX2luZGV4X2RlbHRhKHByaW5jaXBhbF9hbW91bnRfZHVlKQogICAgZGlnIDYKICAgIGNhbGxzdWIgX2Ftb3VudF90b19pbmRleF9kZWx0YQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTc2CiAgICAvLyBpbnRlcmVzdF9hbW91bnQgPSBzZWxmLl9pbmRleF9kZWx0YV90b19hbW91bnQoaW50ZXJlc3RfaW5kZXhfZGVsdGEpCiAgICBkaWcgMQogICAgY2FsbHN1YiBfaW5kZXhfZGVsdGFfdG9fYW1vdW50CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgMTUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU3NwogICAgLy8gcHJpbmNpcGFsX2Ftb3VudCA9IHNlbGYuX2luZGV4X2RlbHRhX3RvX2Ftb3VudChwcmluY2lwYWxfaW5kZXhfZGVsdGEpCiAgICBkdXAKICAgIGNhbGxzdWIgX2luZGV4X2RlbHRhX3RvX2Ftb3VudAogICAgZHVwCiAgICBidXJ5IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzgKICAgIC8vIHJlcXVpcmVkX2Ftb3VudCA9IGludGVyZXN0X2Ftb3VudCArIHByaW5jaXBhbF9hbW91bnQKICAgIGRpZyAyCiAgICBkaWcgMQogICAgKwogICAgZHVwCiAgICBidXJ5IDkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjczNgogICAgLy8gYmFsYW5jZSA9IHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ1NgogICAgLy8gcmV0dXJuIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgKyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIGRpZyAxCiAgICArCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MzgKICAgIC8vIGFzc2VydCBiYWxhbmNlID49IHJlc2VydmVkX3RvdGFsLCBlcnIuTk9UX0VOT1VHSF9GVU5EUwogICAgZGlnIDIKICAgIGRpZyAxCiAgICA+PQogICAgYXNzZXJ0IC8vIE5vdCBlbm91Z2ggZnVuZHMgZm9yIHRoZSBwYXltZW50CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MzkKICAgIC8vIHJldHVybiBiYWxhbmNlIC0gcmVzZXJ2ZWRfdG90YWwKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTgwCiAgICAvLyBzZWxmLl9hdmFpbGFibGVfc2V0dGxlbWVudF9mdW5kcygpID49IHJlcXVpcmVkX2Ftb3VudAogICAgdW5jb3ZlciAyCiAgICA+PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTc5LTU4MQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLl9hdmFpbGFibGVfc2V0dGxlbWVudF9mdW5kcygpID49IHJlcXVpcmVkX2Ftb3VudAogICAgLy8gKSwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTgzCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0ICs9IGludGVyZXN0X2Ftb3VudAogICAgdW5jb3ZlciAzCiAgICArCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTg0CiAgICAvLyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCArPSBwcmluY2lwYWxfYW1vdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICArCiAgICBieXRlYyAxMiAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4NQogICAgLy8gc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4ICs9IGludGVyZXN0X2luZGV4X2RlbHRhCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCBleGlzdHMKICAgIHVuY292ZXIgMgogICAgKwogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTg2CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4ICs9IHByaW5jaXBhbF9pbmRleF9kZWx0YQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCBleGlzdHMKICAgICsKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1ODcKICAgIC8vIGlmIGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkgPT0gVUludDY0KGVudW1zLkVWVF9QUik6CiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBwdXNoaW50IDMKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDQwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1ODgtNTg5CiAgICAvLyAjIEZvciBQUiwgdGhlIHBlcmlvZCBpbnRlcmVzdCBzdGF5cyBhY2NydWVkIHVudGlsIGEgbGF0ZXIgSVAgb3IgTUQuCiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgKz0gc2VsZi5fZW50cnlfaW50ZXJlc3Rfc2VnbWVudChlbnRyeSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBkaWcgMTYKICAgIGNhbGxzdWIgX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQKICAgIGJ1cnkgMTgKICAgICsKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTIKICAgIC8vIGlmIG5vdCBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKSBvciBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NCgKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlANDMKICAgIGRpZyAxNQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5Mi01OTQKICAgIC8vIGlmIG5vdCBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKSBvciBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NCgKICAgIC8vICAgICBlbnVtcy5FVlRfTUQKICAgIC8vICk6CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDQKCmZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDQzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTk1CiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBkaWcgMTUKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0NDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5NgogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgZGlnIDgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTcKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IG5leHRfaW50ZXJlc3RfYmFzZQogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGRpZyA5CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTk4CiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MDAKICAgIC8vIGlmIGVudHJ5LmV2ZW50X3R5cGUgPT0gYXJjNC5VSW50OCgKICAgIGRpZyAxNQogICAgZXh0cmFjdCA4IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwMC02MDIKICAgIC8vIGlmIGVudHJ5LmV2ZW50X3R5cGUgPT0gYXJjNC5VSW50OCgKICAgIC8vICAgICBlbnVtcy5FVlRfTUQKICAgIC8vICkgYW5kIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID09IFVJbnQ2NCgwKToKICAgIHB1c2hieXRlcyAweDEzCiAgICBiPT0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQ3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MDIKICAgIC8vICkgYW5kIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID09IFVJbnQ2NCgwKToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAwLTYwMgogICAgLy8gaWYgZW50cnkuZXZlbnRfdHlwZSA9PSBhcmM0LlVJbnQ4KAogICAgLy8gICAgIGVudW1zLkVWVF9NRAogICAgLy8gKSBhbmQgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPT0gVUludDY0KDApOgogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQ3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MDMKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGVudW1zLlNUQVRVU19FTkRFRCkKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgMjAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjA0CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQ3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjA2LTYxMAogICAgLy8gc2VsZi5fZW1pdF9leGVjdXRpb25fZXZlbnQoCiAgICAvLyAgICAgZW50cnk9ZW50cnksCiAgICAvLyAgICAgcGF5b2ZmPWludGVyZXN0X2Ftb3VudCArIHByaW5jaXBhbF9hbW91bnQsCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9aW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudCwKICAgIC8vICkKICAgIGRpZyAxNQogICAgZGlnIDQKICAgIGR1cAogICAgY2FsbHN1YiBfZW1pdF9leGVjdXRpb25fZXZlbnQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojc5CiAgICAvLyBmdW5kZWRfaW50ZXJlc3QgKz0gaW50ZXJlc3RfYW1vdW50CiAgICBkaWcgMTMKICAgIGRpZyAxMgogICAgKwogICAgYnVyeSAxNAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjgwCiAgICAvLyBmdW5kZWRfcHJpbmNpcGFsICs9IHByaW5jaXBhbF9hbW91bnQKICAgIGRpZyAxMgogICAgZGlnIDcKICAgICsKICAgIGJ1cnkgMTMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4MQogICAgLy8gcHJvY2Vzc2VkX2V2ZW50cyArPSBVSW50NjQoMSkKICAgIGRpZyA0CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSA1CiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c193aGlsZV90b3BANAoKZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUA0MDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5MQogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ID0gVUludDY0KDApCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQxCgpmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUAyOToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1NwogICAgLy8gZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGRpZyAxNQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSAxNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTU4LTU2MAogICAgLy8gIyBEeW5hbWljIGFubnVpdGllcyBkZXJpdmUgbmV4dCBzdGF0ZSBmcm9tIHRoZSBwYXltZW50IGRlY29tcG9zaXRpb24sCiAgICAvLyAjIG5vdCBvbmx5IGZyb20gdGhlIHByZWNvbXB1dGVkIGBuZXh0XypgIGZpZWxkcy4KICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QUik6CiAgICBwdXNoaW50IDMKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDMxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjIKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIC0gcHJpbmNpcGFsX2Ftb3VudF9kdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgZGlnIDYKICAgIC0KICAgIGR1cAogICAgYnVyeSA5CiAgICBidXJ5IDkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzgKCmZ1bmRfZHVlX2Nhc2hmbG93c19lbHNlX2JvZHlAMzE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjUKICAgIC8vIGVsaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX0lQKToKICAgIGRpZyAxNAogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDMzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjYKICAgIC8vIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgYnVyeSA5CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjcKICAgIC8vIG5leHRfaW50ZXJlc3RfYmFzZSA9IHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgYnVyeSAxMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSBleGlzdHMKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzgKCmZ1bmRfZHVlX2Nhc2hmbG93c19lbHNlX2JvZHlAMzM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjgKICAgIC8vIGVsaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKToKICAgIGRpZyAxNAogICAgcHVzaGludCAxOQogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUAzNAogICAgZGlnIDcKICAgIGJ1cnkgOQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlAMzQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjkKICAgIC8vIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzAKICAgIC8vIG5leHRfaW50ZXJlc3RfYmFzZSA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgOQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MjkKICAgIC8vIGlmIHNlbGYuX2lzX2R5bmFtaWNfYW5udWl0eSgpOgogICAgY2FsbHN1YiBfaXNfZHluYW1pY19hbm51aXR5CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyNwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDMwCiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfTUQpOgogICAgZGlnIDE0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzMQogICAgLy8gcmV0dXJuIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTUyCiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzMgogICAgLy8gaW50ZXJlc3RfZHVlID0gc2VsZi5hY2NydWVkX2ludGVyZXN0ICsgc2VsZi5fZW50cnlfaW50ZXJlc3Rfc2VnbWVudChlbnRyeSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBkaWcgMTYKICAgIGNhbGxzdWIgX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQKICAgIGJ1cnkgMTgKICAgICsKICAgIGR1cAogICAgYnVyeSAxMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDMzCiAgICAvLyBpZiBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPD0gaW50ZXJlc3RfZHVlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gZXhpc3RzCiAgICA+PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzNAogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTUyCiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyNDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzNQogICAgLy8gcHJpbmNpcGFsX2Ftb3VudCA9IHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiAtIGludGVyZXN0X2R1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gZXhpc3RzCiAgICBkaWcgMTAKICAgIC0KICAgIGR1cAogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzYKICAgIC8vIGlmIHByaW5jaXBhbF9hbW91bnQgPiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgPgogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzNwogICAgLy8gcmV0dXJuIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTUyCiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyNjoKICAgIGRpZyA2CiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NDAKICAgIC8vIGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsIDw9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBkaWcgMTUKICAgIHB1c2hpbnQgNDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGR1cDIKICAgIDw9CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzktNDQxCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsIDw9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ0MgogICAgLy8gcmV0dXJuIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIC0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIHN3YXAKICAgIC0KICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTUyCiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQxNQogICAgLy8gcmV0dXJuIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCArIHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZGlnIDE2CiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBidXJ5IDE4CiAgICArCiAgICBidXJ5IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTEKICAgIC8vIGludGVyZXN0X2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9pbnRlcmVzdF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9pbnRlcmVzdF9hbW91bnRAMTYKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl93aGlsZUAxMToKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4MwogICAgLy8gYXNzZXJ0IHByb2Nlc3NlZF9ldmVudHMgPiBVSW50NjQoMCksIGVyci5OT19EVUVfQ0FTSEZMT1cKICAgIGRpZyA0CiAgICBkdXAKICAgIGFzc2VydCAvLyBObyBkdWUgY2FzaGZsb3cgdG8gcGF5CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODcKICAgIC8vIHRvdGFsX2Z1bmRlZD1mdW5kZWRfaW50ZXJlc3QgKyBmdW5kZWRfcHJpbmNpcGFsLAogICAgZGlnIDE0CiAgICBkdXAKICAgIGRpZyAxNQogICAgZHVwCiAgICBjb3ZlciAzCiAgICArCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODkKICAgIC8vIHRpbWVzdGFtcD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4NC05MAogICAgLy8gcmV0dXJuIHR5cC5DYXNoRnVuZGluZ1Jlc3VsdCgKICAgIC8vICAgICBmdW5kZWRfaW50ZXJlc3Q9ZnVuZGVkX2ludGVyZXN0LAogICAgLy8gICAgIGZ1bmRlZF9wcmluY2lwYWw9ZnVuZGVkX3ByaW5jaXBhbCwKICAgIC8vICAgICB0b3RhbF9mdW5kZWQ9ZnVuZGVkX2ludGVyZXN0ICsgZnVuZGVkX3ByaW5jaXBhbCwKICAgIC8vICAgICBwcm9jZXNzZWRfZXZlbnRzPXByb2Nlc3NlZF9ldmVudHMsCiAgICAvLyAgICAgdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUA1MzoKICAgIGludGNfMCAvLyAwCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDU0CgoKLy8gbW9kdWxlcy5wYXltZW50X2FnZW50LlBheW1lbnRBZ2VudC5jbGFpbV9kdWVfY2FzaGZsb3dzW3JvdXRpbmddKCkgLT4gdm9pZDoKY2xhaW1fZHVlX2Nhc2hmbG93czoKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6OTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNQogICAgLy8gaWYgc2VsZi5vcF9kYWVtb24udmFsdWUgIT0gR2xvYmFsLnplcm9fYWRkcmVzczoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNiAvLyAweDUyMjM0ZjcwNDQ2MTY1NmQ2ZjZlMjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcF9kYWVtb24gZXhpc3RzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBieiBjbGFpbV9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTcKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNwogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI2IC8vIDB4NTIyMzRmNzA0NDYxNjU2ZDZmNmUyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wX2RhZW1vbiBleGlzdHMKICAgID09CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTctMTkKICAgIC8vIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICAvLyBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgYm56IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDE0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTgKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNy0xOQogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICBibnogY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX3RydWVAMTQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxOQogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIHR4biBTZW5kZXIKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDMyCiAgICA9PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE3LTE5CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAxNQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX3RydWVAMTQ6CiAgICBpbnRjXzEgLy8gMQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDE2OgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE2LTIwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vICAgICBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gICAgIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICAvLyApLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNzoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMDMKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA0CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMDcKICAgIC8vIHNlbGYuX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQoaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDIKICAgIGR1cAogICAgY2FsbHN1YiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjEwOAogICAgLy8gc2VsZi5fc2V0dGxlX3Bvc2l0aW9uKGhvbGRpbmdfYWRkcmVzcykKICAgIGNhbGxzdWIgX3NldHRsZV9wb3NpdGlvbgogICAgcG9wbiAyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTE3CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jbGFpbWFibGVfaW50ZXJlc3QKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGR1cAogICAgcHVzaGludCA3MwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTE4CiAgICAvLyArIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNsYWltYWJsZV9wcmluY2lwYWwKICAgIGR1cAogICAgcHVzaGludCA4MQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTE3LTExOAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY2xhaW1hYmxlX2ludGVyZXN0CiAgICAvLyArIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNsYWltYWJsZV9wcmluY2lwYWwKICAgIHVuY292ZXIgMgogICAgKwogICAgZHVwCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMTAKICAgIC8vIGFzc2VydCB0b3RhbF9hbW91bnQgPiBVSW50NjQoMCksIGVyci5OT19EVUVfQ0FTSEZMT1cKICAgIGFzc2VydCAvLyBObyBkdWUgY2FzaGZsb3cgdG8gcGF5CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MjUKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5pc19vcHRlZF9pbigKICAgIGV4dHJhY3QgMCAzMgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI2CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI1LTI3CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MuaXNfb3B0ZWRfaW4oCiAgICAvLyAgICAgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkCiAgICAvLyApCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI1LTI4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MuaXNfb3B0ZWRfaW4oCiAgICAvLyAgICAgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkCiAgICAvLyApCiAgICAvLyBhbmQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZAogICAgYnogY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX2ZhbHNlQDI0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MjgKICAgIC8vIGFuZCBub3Qgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDM4NAogICAgZ2V0Yml0CiAgICBibnogY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX2ZhbHNlQDI0CiAgICBpbnRjXzEgLy8gMQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDI1OgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjExNQogICAgLy8gaWYgc2VsZi5faXNfcGF5bWVudF9leGVjdXRhYmxlKGhvbGRpbmdfYWRkcmVzcyk6CiAgICBieiBjbGFpbV9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjM0CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgc3dhcAogICAgZGlnIDEKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYXNzZXJ0IC8vIGFjY291bnQgb3B0ZWQgaW50byBhc3NldAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjM0LTM1CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgLy8gPj0gcGF5bWVudF9hbW91bnQKICAgIGRpZyA1CiAgICBkdXAKICAgIGNvdmVyIDIKICAgID49CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MzMtMzYKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIC8vICAgICA+PSBwYXltZW50X2Ftb3VudAogICAgLy8gKSwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjExNwogICAgLy8gc2VsZi5fcGF5KHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcywgdG90YWxfYW1vdW50KQogICAgZGlnIDIKICAgIGR1cAogICAgY292ZXIgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGR1cAogICAgZXh0cmFjdCAwIDMyCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NDAtNDUKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1yZWNlaXZlciwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9YW1vdW50LAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NDQKICAgIC8vIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICB1bmNvdmVyIDMKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgdW5jb3ZlciAyCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQwCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NDAtNDUKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1yZWNlaXZlciwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9YW1vdW50LAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEyNS0xMjYKICAgIC8vICMgR2V0IHRoZSBjbGFpbWFibGUgYW1vdW50cyBiZWZvcmUgcmVzZXQKICAgIC8vIGludGVyZXN0X2Ftb3VudCA9IHBvc2l0aW9uLmNsYWltYWJsZV9pbnRlcmVzdAogICAgZHVwCiAgICBwdXNoaW50IDczCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBidXJ5IDkKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMjcKICAgIC8vIHByaW5jaXBhbF9hbW91bnQgPSBwb3NpdGlvbi5jbGFpbWFibGVfcHJpbmNpcGFsCiAgICBkdXAKICAgIHB1c2hpbnQgODEKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGJ1cnkgOQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEyOS0xMzAKICAgIC8vICMgUmVzZXQgdGhlIHBvc2l0aW9uJ3MgY2xhaW1hYmxlIGFtb3VudHMKICAgIC8vIHBvc2l0aW9uLmNsYWltYWJsZV9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICByZXBsYWNlMiA3MwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzMQogICAgLy8gcG9zaXRpb24uY2xhaW1hYmxlX3ByaW5jaXBhbCA9IFVJbnQ2NCgwKQogICAgc3dhcAogICAgcmVwbGFjZTIgODEKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzIKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gcG9zaXRpb24uY29weSgpCiAgICB1bmNvdmVyIDMKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzQKICAgIC8vIGFzc2VydCBzZWxmLnJlc2VydmVkX2ludGVyZXN0ID49IGludGVyZXN0X2Ftb3VudCwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBkdXAKICAgIGRpZyAyCiAgICA+PQogICAgYXNzZXJ0IC8vIE5vdCBlbm91Z2ggZnVuZHMgZm9yIHRoZSBwYXltZW50CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTM1CiAgICAvLyBhc3NlcnQgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgPj0gcHJpbmNpcGFsX2Ftb3VudCwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIGRpZyAzCiAgICA+PQogICAgYXNzZXJ0IC8vIE5vdCBlbm91Z2ggZnVuZHMgZm9yIHRoZSBwYXltZW50CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTM3LTEzOAogICAgLy8gIyBVcGRhdGUgdGhlIGdsb2JhbCByZXNlcnZlZCBpbnRlcmVzdCBhbmQgcHJpbmNpcGFsIGFtb3VudHMKICAgIC8vIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgLT0gaW50ZXJlc3RfYW1vdW50CiAgICBzd2FwCiAgICAtCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzOQogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgLT0gcHJpbmNpcGFsX2Ftb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIGV4aXN0cwogICAgc3dhcAogICAgLQogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpjbGFpbV9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMjMKICAgIC8vIHRvdGFsX2Ftb3VudD1pbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50LAogICAgZGlnIDUKICAgIGR1cAogICAgZGlnIDYKICAgIGR1cAogICAgY292ZXIgMwogICAgKwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjEyNAogICAgLy8gdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjEyMC0xMjYKICAgIC8vIHJldHVybiB0eXAuQ2FzaENsYWltUmVzdWx0KAogICAgLy8gICAgIGludGVyZXN0X2Ftb3VudD1pbnRlcmVzdF9hbW91bnQsCiAgICAvLyAgICAgcHJpbmNpcGFsX2Ftb3VudD1wcmluY2lwYWxfYW1vdW50LAogICAgLy8gICAgIHRvdGFsX2Ftb3VudD1pbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50LAogICAgLy8gICAgIHRpbWVzdGFtcD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICBjb250ZXh0PXBheW1lbnRfaW5mbywKICAgIC8vICkKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyAyCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgcHVzaGJ5dGVzIDB4MDAyMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VAMjQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfbWVyZ2VAMjUKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAxNToKICAgIGludGNfMCAvLyAwCiAgICBiIGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUAxNgoKCi8vIG1vZHVsZXMudHJhbnNmZXJfYWdlbnQuVHJhbnNmZXJBZ2VudC50cmFuc2Zlcl9zZXRfc2NoZWR1bGVbcm91dGluZ10oKSAtPiB2b2lkOgp0cmFuc2Zlcl9zZXRfc2NoZWR1bGU6CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MjYKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToyNwogICAgLy8gYXNzZXJ0IG9wZW5fZGF0ZSA8IGNsb3N1cmVfZGF0ZSwgZXJyLklOVkFMSURfU09SVElORwogICAgZHVwMgogICAgPAogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIG11c3QgYmUgc29ydGVkIGluIHN0cmljdGx5IGFzY2VuZGluZyBvcmRlcgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToyOQogICAgLy8gc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgPSBvcGVuX2RhdGUKICAgIGJ5dGVjIDI4IC8vICJ0cmFuc2Zlcl9vcGVuaW5nX2RhdGUiCiAgICB1bmNvdmVyIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjMwCiAgICAvLyBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSA9IGNsb3N1cmVfZGF0ZQogICAgYnl0ZWMgMjkgLy8gInRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjMxCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMudHJhbnNmZXJfYWdlbnQuVHJhbnNmZXJBZ2VudC5wcmltYXJ5X2Rpc3RyaWJ1dGlvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnByaW1hcnlfZGlzdHJpYnV0aW9uOgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTozMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo3MQogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYucHJpbWFyeV9kZWFsZXIsIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyMiAvLyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQzCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo0NAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQ1CiAgICAvLyBhc3NlcnQgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TRUQKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBjbG9zZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDcKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQoaG9sZGluZ19hZGRyZXNzKQogICAgc3dhcAogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo0OAogICAgLy8gYXNzZXJ0IHVuaXRzID4gVUludDY0KDApLCBlcnIuWkVST19VTklUUwogICAgZHVwCiAgICBhc3NlcnQgLy8gQ2FuIG5vdCBkaXN0cmlidXRlIHplcm8gdW5pdHMKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NTAKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgKyB1bml0cyA8PSBzZWxmLnRvdGFsX3VuaXRzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIGV4aXN0cwogICAgKwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIDw9CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQ5LTUxCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgKyB1bml0cyA8PSBzZWxmLnRvdGFsX3VuaXRzCiAgICAvLyApLCBlcnIuT1ZFUl9ESVNUUklCVVRJT04KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgcmVtYWluaW5nIEQtQVNBIHVuaXRzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjUyCiAgICAvLyBpZiBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNyAvLyAiaW5pdGlhbF9leGNoYW5nZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSBleGlzdHMKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo1NAogICAgLy8gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPD0gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGUKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNyAvLyAiaW5pdGlhbF9leGNoYW5nZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSBleGlzdHMKICAgIDw9CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjUzLTU1CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDw9IHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlCiAgICAvLyApLCBlcnIuUFJJTUFSWV9ESVNUUklCVVRJT05fQ0xPU0VECiAgICBhc3NlcnQgLy8gUHJpbWFyeSBkaXN0cmlidXRpb24gaXMgY2xvc2VkCgpwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTQ4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5yZXNlcnZlZF91bml0cyArPSB1bml0cwogICAgZHVwbiAyCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCA0MAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAzCiAgICBkdXAKICAgIGNvdmVyIDMKICAgICsKICAgIGl0b2IKICAgIHB1c2hpbnQgNDAKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjU4CiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsICs9IHVuaXRzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIGV4aXN0cwogICAgKwogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjU5CiAgICAvLyByZXR1cm4gc2VsZi50b3RhbF91bml0cyAtIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICBzd2FwCiAgICAtCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnRyYW5zZmVyX2FnZW50LlRyYW5zZmVyQWdlbnQudHJhbnNmZXJbcm91dGluZ10oKSAtPiB2b2lkOgp0cmFuc2ZlcjoKICAgIGludGNfMCAvLyAwCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cG4gMgogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojc1CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo3NgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDcKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjEzCiAgICAvLyBpZiBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyOCAvLyAidHJhbnNmZXJfb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIGJ6IHRyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNQogICAgLy8gc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyOCAvLyAidHJhbnNmZXJfb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIDw9CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE0LTE2CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyApLCBlcnIuQ0xPU0VEX1RSQU5TRkVSCiAgICBhc3NlcnQgLy8gVHJhbnNmZXIgaXMgY2xvc2VkCgp0cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE3CiAgICAvLyBpZiBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyOSAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIGJ6IHRyYW5zZmVyX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxOQogICAgLy8gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI5IC8vICJ0cmFuc2Zlcl9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgPAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxOC0yMAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8IHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlCiAgICAvLyApLCBlcnIuQ0xPU0VEX1RSQU5TRkVSCiAgICBhc3NlcnQgLy8gVHJhbnNmZXIgaXMgY2xvc2VkCgp0cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjgwCiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBzZW5kZXJfaG9sZGluZ19hZGRyZXNzLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICBkaWcgNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQyMwogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDgKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBkaWcgNQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA5CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjgzCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBkaWcgMgogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4NAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBkdXAKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODUKICAgIC8vIGFzc2VydCBzZW5kZXJfaG9sZGluZ19hZGRyZXNzICE9IHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcywgZXJyLlNFTEZfVFJBTlNGRVIKICAgIHVuY292ZXIgMgogICAgIT0KICAgIGFzc2VydCAvLyBTZW5kZXIgYW5kIHJlY2VpdmVyIG11c3QgYmUgZGlmZmVyZW50CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojg2CiAgICAvLyBhc3NlcnQgdW5pdHMgPiBVSW50NjQoMCksIGVyci5OVUxMX1RSQU5TRkVSCiAgICBkaWcgMQogICAgZHVwCiAgICBhc3NlcnQgLy8gVHJhbnNmZXIgdW5pdHMgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4NwogICAgLy8gYXNzZXJ0IHVuaXRzIDw9IHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cywgZXJyLk9WRVJfVFJBTlNGRVIKICAgIHN3YXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICA8PQogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCBzZW5kZXIgdW5pdHMgdG8gdHJhbnNmZXIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc2NQogICAgLy8gaWYgc2VsZi5ldmVudF9jdXJzb3IgPj0gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgPj0KICAgIGJueiB0cmFuc2Zlcl9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9hc3NlcnRfbm9fZHVlX2V2ZW50X3BlbmRpbmdAMTAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc2NwogICAgLy8gbmV4dF9lbnRyeSA9IHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLmV2ZW50X2N1cnNvcikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NjkKICAgIC8vIG5leHRfZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzY4LTc3MAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBuZXh0X2VudHJ5LnNjaGVkdWxlZF90aW1lID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICksIGVyci5QRU5ESU5HX0FDVFVTX0VWRU5UCiAgICBhc3NlcnQgLy8gQUNUVVMgZXZlbnQgbm90IHlldCBleGVjdXRlZAoKdHJhbnNmZXJfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYXNzZXJ0X25vX2R1ZV9ldmVudF9wZW5kaW5nQDEwOgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo5MAogICAgLy8gc2VsZi5fZW5zdXJlX3VuaXRzX2FjdGl2YXRlZChzZW5kZXJfaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDMKICAgIGR1cAogICAgY2FsbHN1YiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo5MQogICAgLy8gc2VsZi5fZW5zdXJlX3VuaXRzX2FjdGl2YXRlZChyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBkaWcgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjYWxsc3ViIF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjkyCiAgICAvLyBzZWxmLl9zZXR0bGVfcG9zaXRpb24oc2VuZGVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGNhbGxzdWIgX3NldHRsZV9wb3NpdGlvbgogICAgcG9wbiAyCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjkzCiAgICAvLyBzZWxmLl9zZXR0bGVfcG9zaXRpb24ocmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzKQogICAgY2FsbHN1YiBfc2V0dGxlX3Bvc2l0aW9uCiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNTIKICAgIC8vIGFzc2VydCB1bml0cyA8PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cywgZXJyLk9WRVJfVFJBTlNGRVIKICAgIGRpZyA1CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkaWcgMQogICAgPD0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgc2VuZGVyIHVuaXRzIHRvIHRyYW5zZmVyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTUzCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyAtPSB1bml0cwogICAgZGlnIDEKICAgIC0KICAgIGl0b2IKICAgIHVuY292ZXIgMgogICAgaW50Y18zIC8vIDMyCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTQ0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyArPSB1bml0cwogICAgZGlnIDUKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIHVuY292ZXIgMgogICAgKwogICAgaXRvYgogICAgaW50Y18zIC8vIDMyCiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo2MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfc3VzcGVuc2lvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfc3VzcGVuc2lvbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojc3CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyMSAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxODUKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZCA9IHN1c3BlbmRlZAogICAgZHVwCiAgICBwdXNoaW50IDQ4CiAgICBpbnRjXzEgLy8gMQogICAgYm94X2V4dHJhY3QKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgcHVzaGludCA0OAogICAgc3dhcAogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxODYKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE2NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF9vcGVuW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF9vcGVuOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjY4CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hY2NvdW50X21hbmFnZXIsIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyMyAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzOQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfRU5ERUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgMjAwCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxMAogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfZW5kZWQoKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgIQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjExCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxMgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTMKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozNAogICAgLy8gdW5pdHM9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozMi00MgogICAgLy8gcmV0dXJuIHR5cC5BY2NvdW50UG9zaXRpb24oCiAgICAvLyAgICAgcGF5bWVudF9hZGRyZXNzPXBheW1lbnRfYWRkcmVzcywKICAgIC8vICAgICB1bml0cz1VSW50NjQoMCksCiAgICAvLyAgICAgcmVzZXJ2ZWRfdW5pdHM9VUludDY0KDApLAogICAgLy8gICAgIHN1c3BlbmRlZD1GYWxzZSwKICAgIC8vICAgICBzZXR0bGVkX2N1cnNvcj1VSW50NjQoMCksCiAgICAvLyAgICAgaW50ZXJlc3RfY2hlY2twb2ludD1VSW50NjQoMCksCiAgICAvLyAgICAgcHJpbmNpcGFsX2NoZWNrcG9pbnQ9VUludDY0KDApLAogICAgLy8gICAgIGNsYWltYWJsZV9pbnRlcmVzdD1VSW50NjQoMCksCiAgICAvLyAgICAgY2xhaW1hYmxlX3ByaW5jaXBhbD1VSW50NjQoMCksCiAgICAvLyApCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGJ5dGVjIDQwIC8vIDB4MDAKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjE0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHNlbGYuX25ld19hY2NvdW50X3Bvc2l0aW9uKHBheW1lbnRfYWRkcmVzcykKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTUKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIzOAogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICB1bmNvdmVyIDMKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMzkKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQwCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0MQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzID0gcGF5bWVudF9hZGRyZXNzCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0MgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5hY2NvdW50X2dldF9wb3NpdGlvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfZ2V0X3Bvc2l0aW9uOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI1OQogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmNvbnRyYWN0X2NyZWF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X2NyZWF0ZToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDI4CiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gYXJyYW5nZXIKICAgIGJ5dGVjIDE4IC8vIDB4NTIyMzQxNzI3MjYxNmU2NzY1NzIyMwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMjkKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfY29uZmlnW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfY29uZmlnOgogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBsZW4KICAgIHB1c2hpbnQgMTA3CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLk5vcm1hbGl6ZWRBY3R1c1Rlcm1zCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgcHVzaGludCA3MgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5Jbml0aWFsS2VybmVsU3RhdGUKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBsZW4KICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIHR1cGxlIGVuY29kaW5nCiAgICBkdXAKICAgIHB1c2hpbnQgMzQKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCB0YWlsIHBvaW50ZXIgYXQgaW5kZXggMSBvZiAodWludDhbMzJdLChsZW4rdXRmOFtdKSkKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgY292ZXIgMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMzYKICAgICsKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuUHJvc3BlY3R1cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2MAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDYyLTEwNjMKICAgIC8vICMgQ29uZmlndXJlIENvbnRyYWN0CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPSB0ZXJtcy5jb250cmFjdF90eXBlLmFzX3VpbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgYnogY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUA3CiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIyMAogICAgLy8gVUludDY0KGVudW1zLkNUX0FOTiksCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIxCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfTkFNKSwKICAgIHB1c2hpbnQgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIyCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfTEFNKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIzCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfTEFYKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjI0CiAgICAvLyBVSW50NjQoZW51bXMuQ1RfQ0xNKSwKICAgIHB1c2hpbnQgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJ6IGNvbnRyYWN0X2NvbmZpZ19ib29sX2ZhbHNlQDgKCmNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANzoKICAgIGludGNfMSAvLyAxCgpjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUA5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjI5CiAgICAvLyBhc3NlcnQgc2VsZi5faXNfc3VwcG9ydGVkX2NvbnRyYWN0X3R5cGUoY29udHJhY3RfdHlwZSksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2NQogICAgLy8gc2VsZi5fc3RvcmVfY29udHJhY3RfY29uZmlnKHNlbGYuY29udHJhY3RfdHlwZSwgdGVybXMsIGluaXRpYWxfc3RhdGUpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgYnVyeSAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzI1CiAgICAvLyBhc3NlcnQgdGVybXMuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZGlnIDQKICAgIGR1cAogICAgcHVzaGludCAzMwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSA4CiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMjcKICAgIC8vIHRlcm1zLmRheV9jb3VudF9jb252ZW50aW9uLmFzX3VpbnQ2NCgpCiAgICBwdXNoaW50IDU3CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICBieiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDE2CiAgICBkaWcgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk5CiAgICAvLyBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI5Ny0zMDMKICAgIC8vIHJldHVybiBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzYwKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwSVNEQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjApLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDE2CiAgICBkaWcgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzAwCiAgICAvLyBVSW50NjQoZW51bXMuRENDX0EzNjUpLAogICAgcHVzaGludCAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyOTctMzAzCiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgID09CiAgICBibnogY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUAxNgogICAgZGlnIDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMwMQogICAgLy8gVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGRpZyA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDIKICAgIC8vIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICA9PQogICAgYnogY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAMTcKCmNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTY6CiAgICBpbnRjXzEgLy8gMQoKY29udHJhY3RfY29uZmlnX2Jvb2xfbWVyZ2VAMTg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDktMzExCiAgICAvLyBhc3NlcnQgc2VsZi5faXNfc3VwcG9ydGVkX2RheV9jb3VudF9jb252ZW50aW9uKAogICAgLy8gICAgIGRheV9jb3VudF9jb252ZW50aW9uCiAgICAvLyApLCBlcnIuSU5WQUxJRF9EQVlfQ09VTlRfQ09OVkVOVElPTgogICAgYXNzZXJ0IC8vIEludmFsaWQgZGF5LWNvdW50IGNvbnZlbnRpb24gSUQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMyOQogICAgLy8gaWYgY29udHJhY3RfdHlwZSAhPSBVSW50NjQoZW51bXMuQ1RfQU5OKToKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgICE9CiAgICBieiBjb250cmFjdF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzMwCiAgICAvLyBhc3NlcnQgbm90IHRlcm1zLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24sIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZGlnIDQKICAgIHB1c2hpbnQgNzg2CiAgICBnZXRiaXQKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KCmNvbnRyYWN0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDIwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODA5CiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIEQtQVNBIGFscmVhZHkgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODEwCiAgICAvLyBhc3NlcnQgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCA9PSBVSW50NjQoMCksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMCAvLyAiaW5pdGlhbF9leGNoYW5nZV9hbW91bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTItODEzCiAgICAvLyAjIFNldCBEZW5vbWluYXRpb24gQXNzZXQKICAgIC8vIHNlbGYuX2Fzc2VydF9kZW5vbWluYXRpb25fYXNzZXQodGVybXMuZGVub21pbmF0aW9uX2Fzc2V0X2lkKQogICAgZGlnIDQKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NzctNzc4CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIGRlbm9taW5hdGlvbiB3aXRoIEFTQQogICAgLy8gX2NyZWF0b3IsIGV4aXN0cyA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X2NyZWF0b3IoZGVub21pbmF0aW9uX2Fzc2V0X2lkKQogICAgZHVwCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q3JlYXRvcgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NzkKICAgIC8vIGFzc2VydCBleGlzdHMsIGVyci5JTlZBTElEX0RFTk9NSU5BVElPTgogICAgYXNzZXJ0IC8vIERlbm9taW5hdGlvbiBhc3NldCBpcyBub3QgcHJvcGVybHkgc2V0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODIKICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICBieXRlYyA0NCAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTYtODE3CiAgICAvLyAjIFNldCBTZXR0bGVtZW50IEFzc2V0CiAgICAvLyBzZWxmLl9hc3NlcnRfc2V0dGxlbWVudF9hc3NldCh0ZXJtcy5zZXR0bGVtZW50X2Fzc2V0X2lkKQogICAgZGlnIDEKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc4NwogICAgLy8gc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODUtNzg4CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc2V0dGxlbWVudCBhc3NldCBpcyB0aGUgZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQgPT0gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIC8vICksIGVyci5JTlZBTElEX1NFVFRMRU1FTlRfQVNTRVQKICAgIGFzc2VydCAvLyBEaWZmZXJlbnQgc2V0dGxlbWVudCBhc3NldCBub3Qgc3VwcG9ydGVkLCBtdXN0IGJlIGVxdWFsIHRvIGRlbm9taW5hdGlvbiBhc3NldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkxCiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBzZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkyLTc5OAogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhc3NldF9hbW91bnQ9MCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Nzk3CiAgICAvLyBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Nzk1CiAgICAvLyBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc5NgogICAgLy8gYXNzZXRfYW1vdW50PTAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkyLTc5MwogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3OTItNzk4CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODIwLTgyMQogICAgLy8gIyBVbml0cwogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IHRlcm1zLnRvdGFsX3VuaXRzCiAgICBkdXAKICAgIHB1c2hpbnQgMTcKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODIyCiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID0gVUludDY0KDApCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgyNC04MjUKICAgIC8vICMgRGF5LUNvdW50IENvbnZlbnRpb25zCiAgICAvLyBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uID0gdGVybXMuZGF5X2NvdW50X2NvbnZlbnRpb24uYXNfdWludDY0KCkKICAgIGJ5dGVjIDQ2IC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGRpZyA4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODI3LTgyOAogICAgLy8gIyBUaW1lCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA9IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZQogICAgZHVwCiAgICBwdXNoaW50IDQxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMjcgLy8gImluaXRpYWxfZXhjaGFuZ2VfZGF0ZSIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODI5CiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSB0ZXJtcy5tYXR1cml0eV9kYXRlCiAgICBkaWcgMQogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDQ1IC8vICJtYXR1cml0eV9kYXRlIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MzAKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IGluaXRpYWxfc3RhdGUubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZGlnIDYKICAgIGR1cAogICAgY292ZXIgMgogICAgcHVzaGludCA0OAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzMi04MzMKICAgIC8vICMgUHJpbmNpcGFsCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID0gdGVybXMuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGRpZyAxMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzNAogICAgLy8gc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gdGVybXMuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZGlnIDMKICAgIHB1c2hpbnQgNzg2CiAgICBnZXRiaXQKICAgIGJ5dGVjIDM0IC8vICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzNQogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBpbml0aWFsX3N0YXRlLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZGlnIDEKICAgIHB1c2hpbnQgMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODM3LTgzOAogICAgLy8gIyBJbnRlcmVzdAogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ID0gaW5pdGlhbF9zdGF0ZS5hY2NydWVkX2ludGVyZXN0CiAgICBkaWcgMQogICAgcHVzaGludCA0MAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQwLTg0MQogICAgLy8gIyBJbnRlcmVzdCBSYXRlCiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IGluaXRpYWxfc3RhdGUubm9taW5hbF9pbnRlcmVzdF9yYXRlCiAgICBkaWcgMQogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0MgogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gaW5pdGlhbF9zdGF0ZS5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlCiAgICBkaWcgMQogICAgcHVzaGludCAyNAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQzCiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkID0gdGVybXMucmF0ZV9yZXNldF9zcHJlYWQKICAgIGRpZyAzCiAgICBwdXNoaW50IDU4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzUgLy8gInJhdGVfcmVzZXRfc3ByZWFkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0NAogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIgPSB0ZXJtcy5yYXRlX3Jlc2V0X211bHRpcGxpZXIKICAgIGRpZyAzCiAgICBwdXNoaW50IDY2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzYgLy8gInJhdGVfcmVzZXRfbXVsdGlwbGllciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDUKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9mbG9vciA9IHRlcm1zLnJhdGVfcmVzZXRfZmxvb3IKICAgIGRpZyAzCiAgICBwdXNoaW50IDc0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzAgLy8gInJhdGVfcmVzZXRfZmxvb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQ2CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfY2FwID0gdGVybXMucmF0ZV9yZXNldF9jYXAKICAgIGRpZyAzCiAgICBwdXNoaW50IDgyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzEgLy8gInJhdGVfcmVzZXRfY2FwIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0NwogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X25leHQgPSB0ZXJtcy5yYXRlX3Jlc2V0X25leHQKICAgIGRpZyAzCiAgICBwdXNoaW50IDkwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzcgLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDgKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgPSB0ZXJtcy5oYXNfcmF0ZV9yZXNldF9mbG9vcgogICAgZGlnIDMKICAgIHB1c2hpbnQgNzg0CiAgICBnZXRiaXQKICAgIGJ5dGVjIDM4IC8vICJoYXNfcmF0ZV9yZXNldF9mbG9vciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDkKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwID0gdGVybXMuaGFzX3JhdGVfcmVzZXRfY2FwCiAgICBkaWcgMwogICAgcHVzaGludCA3ODUKICAgIGdldGJpdAogICAgYnl0ZWMgMzkgLy8gImhhc19yYXRlX3Jlc2V0X2NhcCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NTEtODUyCiAgICAvLyAjIFNjYWxpbmcKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgPSB0ZXJtcy5maXhlZF9wb2ludF9zY2FsZQogICAgdW5jb3ZlciAzCiAgICBwdXNoaW50IDk5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU0LTg1NQogICAgLy8gIyBTY2hlZHVsZSBQcm9jZXNzaW5nCiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciA9IGluaXRpYWxfc3RhdGUuZXZlbnRfY3Vyc29yCiAgICBkaWcgMQogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU3LTg1OAogICAgLy8gIyBQZXItVW5pdCBGaXhlZC1Qb2ludCBJbmRleGVzCiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggPSBpbml0aWFsX3N0YXRlLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgKICAgIGRpZyAxCiAgICBwdXNoaW50IDU2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU5CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4ID0gaW5pdGlhbF9zdGF0ZS5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleAogICAgZGlnIDEKICAgIHB1c2hpbnQgNjQKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODYxLTg2MgogICAgLy8gIyBSZXNlcnZlZCBBbW91bnQgKGZvciBleGVjdXRlZCBjYXNoZmxvd3MpCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0ID0gVUludDY0KDApCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2MwogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2NQogICAgLy8gYXNzZXJ0IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLCBlcnIuSU5WQUxJRF9JRUQKICAgIGRpZyAyCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICBhc3NlcnQgLy8gSUVEIG11c3QgYmUgc2V0IGluIHRoZSBmdXR1cmUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2NgogICAgLy8gYXNzZXJ0IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA+IGluaXRpYWxfc3RhdGUuc3RhdHVzX2RhdGUsIGVyci5JTlZBTElEX0lFRAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgPAogICAgYXNzZXJ0IC8vIElFRCBtdXN0IGJlIHNldCBpbiB0aGUgZnV0dXJlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NjcKICAgIC8vIGFzc2VydCB0ZXJtcy5pbml0aWFsX2V4Y2hhbmdlX2RhdGUgPCB0ZXJtcy5tYXR1cml0eV9kYXRlLCBlcnIuSU5WQUxJRF9JRUQKICAgIDwKICAgIGFzc2VydCAvLyBJRUQgbXVzdCBiZSBzZXQgaW4gdGhlIGZ1dHVyZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2Ny0xMDY4CiAgICAvLyAjIE5vdGFyaXplIHByb3NwZWN0dXMgKG9wdGlvbmFsKQogICAgLy8gc2VsZi5wcm9zcGVjdHVzX2hhc2ggPSBwcm9zcGVjdHVzLmhhc2guYnl0ZXMKICAgIGRpZyAyCiAgICBleHRyYWN0IDAgMzIKICAgIGJ5dGVjIDQyIC8vICJwcm9zcGVjdHVzX2hhc2giCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2OQogICAgLy8gc2VsZi5wcm9zcGVjdHVzX3VybCA9IHByb3NwZWN0dXMudXJsCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGVjIDQzIC8vICJwcm9zcGVjdHVzX3VybCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDcwCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAMTc6CiAgICBpbnRjXzAgLy8gMAogICAgYiBjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUAxOAoKY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAODoKICAgIGludGNfMCAvLyAwCiAgICBiIGNvbnRyYWN0X2NvbmZpZ19ib29sX21lcmdlQDkKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9zY2hlZHVsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X3NjaGVkdWxlOgogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDcyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHN3YXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBkdXAKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgMgogICAgKwogICAgdW5jb3ZlciAyCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLkV4ZWN1dGlvblNjaGVkdWxlRW50cnk+CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDg3CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwOTAKICAgIC8vIGNvbnRyYWN0X3R5cGU9c2VsZi5jb250cmFjdF90eXBlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGNvdmVyIDMKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4ODMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4ODQtODg2CiAgICAvLyBhc3NlcnQgc2NoZWR1bGVfcGFnZS5sZW5ndGggPD0gVUludDY0KAogICAgLy8gICAgIGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUKICAgIC8vICksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGR1cAogICAgcHVzaGludCAxNgogICAgPD0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg4NwogICAgLy8gYXNzZXJ0IHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPiBVSW50NjQoMCksIGVyci5URVJNU19OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSB0ZXJtcyBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODg5CiAgICAvLyBwYWdlX2N1cnNvciA9IHNjaGVkdWxlX3BhZ2VfaW5kZXggKiBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkKICAgIHN3YXAKICAgIHB1c2hpbnQgMTYKICAgICoKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg5NgogICAgLy8gKyBwYWdlX2xlbmd0aCAqIFVJbnQ2NChjc3QuT1BfVVBfQ09OVFJBQ1RfQ09ORklHX1BFUl9FTlRSWV9CVURHRVQpCiAgICBwdXNoaW50IDEwMAogICAgKgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODk1CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19CQVNFX0JVREdFVCkKICAgIGludGMgNCAvLyAxNTAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTUtODk2CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19CQVNFX0JVREdFVCkKICAgIC8vICsgcGFnZV9sZW5ndGggKiBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19QRVJfRU5UUllfQlVER0VUKQogICAgKwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODkxLTg5OAogICAgLy8gIyBWYWxpZGF0aW9uIGNvc3QgZ3Jvd3Mgd2l0aCBwYWdlIGxlbmd0aCwgc28gY29uZmlndXJhdGlvbiBleHBsaWNpdGx5CiAgICAvLyAjIGJ1eXMgZXh0cmEgb3Bjb2RlIGJ1ZGdldCBmb3IgbGFyZ2VyIHVwbG9hZHMuCiAgICAvLyBlbnN1cmVfYnVkZ2V0KAogICAgLy8gICAgIHJlcXVpcmVkX2J1ZGdldD0oCiAgICAvLyAgICAgICAgIFVJbnQ2NChjc3QuT1BfVVBfQ09OVFJBQ1RfQ09ORklHX0JBU0VfQlVER0VUKQogICAgLy8gICAgICAgICArIHBhZ2VfbGVuZ3RoICogVUludDY0KGNzdC5PUF9VUF9DT05UUkFDVF9DT05GSUdfUEVSX0VOVFJZX0JVREdFVCkKICAgIC8vICAgICApLAogICAgLy8gKQogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODk5CiAgICAvLyBpbmRleCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKCmNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEAyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTAwCiAgICAvLyB3aGlsZSBpbmRleCA8IHBhZ2VfbGVuZ3RoOgogICAgZHVwCiAgICBkaWcgNAogICAgPAogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfd2hpbGVAMTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkwMS05MDIKICAgIC8vIGVudHJ5ID0gc2NoZWR1bGVfcGFnZVtpbmRleF0uY29weSgpCiAgICAvLyBlbnRyeV9ldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZGlnIDQKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGJ1cnkgMTIKICAgIGRpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgNjUKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTAyCiAgICAvLyBlbnRyeV9ldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDEtOTAyCiAgICAvLyBlbnRyeSA9IHNjaGVkdWxlX3BhZ2VbaW5kZXhdLmNvcHkoKQogICAgLy8gZW50cnlfZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGludGNfMiAvLyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDIKICAgIC8vIGVudHJ5X2V2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBnZXRieXRlCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgMTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkwMwogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X2lkID09IHBhZ2VfY3Vyc29yICsgaW5kZXgsIGVyci5JTlZBTElEX0VWRU5UX0lECiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEzCiAgICBkaWcgNQogICAgdW5jb3ZlciA0CiAgICArCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDQtOTA2CiAgICAvLyBzZWxmLl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBlbnRyeV9ldmVudF90eXBlCiAgICAvLyApCiAgICBkaWcgNQogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTA3CiAgICAvLyBhc3NlcnQgZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgc3dhcAogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDgKICAgIC8vIGlmIGVudHJ5LmV2ZW50X2lkID4gVUludDY0KDApOgogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDkKICAgIC8vIGlmIGluZGV4ID4gVUludDY0KDApOgogICAgZHVwCiAgICBieiBjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlANgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTEwCiAgICAvLyBwcmV2aW91c19lbnRyeSA9IHNjaGVkdWxlX3BhZ2VbaW5kZXggLSBVSW50NjQoMSldLmNvcHkoKQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgcHVzaGludCA2NQogICAgKgogICAgZGlnIDExCiAgICBzd2FwCiAgICBwdXNoaW50IDY1CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkyNQogICAgLy8gcHJldmlvdXNfZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gZW50cnkuc2NoZWR1bGVkX3RpbWUKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyA4CiAgICA8PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTI0LTkyNgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBwcmV2aW91c19lbnRyeS5zY2hlZHVsZWRfdGltZSA8PSBlbnRyeS5zY2hlZHVsZWRfdGltZQogICAgLy8gKSwgZXJyLklOVkFMSURfU09SVElORwogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIG11c3QgYmUgc29ydGVkIGluIHN0cmljdGx5IGFzY2VuZGluZyBvcmRlcgoKY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUA4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTI3CiAgICAvLyBpZiBlbnRyeS5ldmVudF9pZCA9PSBVSW50NjQoMCk6CiAgICBkaWcgOAogICAgYm56IGNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkyOC05MzAKICAgIC8vIGFzc2VydCBlbnRyeV9ldmVudF90eXBlID09IFVJbnQ2NCgKICAgIC8vICAgICBlbnVtcy5FVlRfSUVECiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGRpZyA5CiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MzEKICAgIC8vIGluZGV4ICs9IFVJbnQ2NCgxKQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIGNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEAyCgpjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlANjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkxMi05MTQKICAgIC8vICMgVGhlIGZpcnN0IGVudHJ5IG9mIGEgcGFnZSBtdXN0IHN0aWxsIGJlIG9yZGVyZWQgYWZ0ZXIgdGhlCiAgICAvLyAjIGxhc3QgZW50cnkgb2YgdGhlIHByZXZpb3VzIHBhZ2UuCiAgICAvLyBhc3NlcnQgc2NoZWR1bGVfcGFnZV9pbmRleCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGRpZyA2CiAgICBkdXAKICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTUKICAgIC8vIHByZXZpb3VzX3BhZ2VfaW5kZXggPSBzY2hlZHVsZV9wYWdlX2luZGV4IC0gVUludDY0KDEpCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTE3CiAgICAvLyBwcmV2aW91c19wYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZQogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTYtOTE4CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHByZXZpb3VzX3BhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTktOTIwCiAgICAvLyBwcmV2aW91c19wYWdlID0gc2VsZi5zY2hlZHVsZV9wYWdlW3ByZXZpb3VzX3BhZ2VfaW5kZXhdLmNvcHkoKQogICAgLy8gYXNzZXJ0IHByZXZpb3VzX3BhZ2UubGVuZ3RoID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBwdXNoaW50IDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjAKICAgIC8vIGFzc2VydCBwcmV2aW91c19wYWdlLmxlbmd0aCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZHVwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjIKICAgIC8vIHByZXZpb3VzX3BhZ2UubGVuZ3RoIC0gVUludDY0KDEpCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTIxLTkyMwogICAgLy8gcHJldmlvdXNfZW50cnkgPSBwcmV2aW91c19wYWdlWwogICAgLy8gICAgIHByZXZpb3VzX3BhZ2UubGVuZ3RoIC0gVUludDY0KDEpCiAgICAvLyBdLmNvcHkoKQogICAgcHVzaGludCA2NQogICAgKgogICAgcHVzaGludCAyCiAgICArCiAgICBwdXNoaW50IDY1CiAgICBib3hfZXh0cmFjdAogICAgYiBjb250cmFjdF9zY2hlZHVsZV9hZnRlcl9pZl9lbHNlQDcKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX3doaWxlQDExOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjAwCiAgICAvLyBzZWxmLnNjaGVkdWxlX3BhZ2VbcGFnZV9pbmRleF0gPSBzY2hlZHVsZV9wYWdlLmNvcHkoKQogICAgZGlnIDYKICAgIGl0b2IKICAgIGJ5dGVjIDI0IC8vIDB4NTMyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgZGlnIDUKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzNAogICAgLy8gaWYgaXNfbGFzdF9wYWdlOgogICAgZGlnIDUKICAgIGJ6IGNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzNgogICAgLy8gc2NoZWR1bGVfcGFnZV9pbmRleCAqIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKSArIHBhZ2VfbGVuZ3RoCiAgICBkaWcgMQogICAgZGlnIDQKICAgICsKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzNQogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA9ICgKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTM1LTkzNwogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA9ICgKICAgIC8vICAgICBzY2hlZHVsZV9wYWdlX2luZGV4ICogVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpICsgcGFnZV9sZW5ndGgKICAgIC8vICkKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MzgKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgNTAKICAgIGFwcF9nbG9iYWxfcHV0Cgpjb250cmFjdF9zY2hlZHVsZV9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA5NQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDcyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9leGVjdXRlX2llZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X2V4ZWN1dGVfaWVkOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMDUKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEwNgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMDcKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTA5CiAgICAvLyBhc3NlcnQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LCBlcnIuSU5WQUxJRF9FVkVOVF9DVVJTT1IKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgZGlnIDEKICAgID4KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGN1cnNvcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTExMAogICAgLy8gZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoc2VsZi5ldmVudF9jdXJzb3IpCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMTEKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoZW51bXMuRVZUX0lFRCksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGR1cAogICAgZXh0cmFjdCA4IDEKICAgIGR1cAogICAgcHVzaGJ5dGVzIDB4MDEKICAgIGI9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTExNQogICAgLy8gZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICBkaWcgMQogICAgZXh0cmFjdCAwIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMTcKICAgIC8vIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgZGlnIDIKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTE4CiAgICAvLyBhY2NydWFsX2ZhY3Rvcj1lbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIGRpZyAzCiAgICBleHRyYWN0IDE3IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMTkKICAgIC8vIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIGRpZyA0CiAgICBleHRyYWN0IDI1IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMjEKICAgIC8vIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPWVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDUKICAgIGV4dHJhY3QgMzMgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEyMgogICAgLy8gbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgZGlnIDYKICAgIGV4dHJhY3QgNDEgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEyMwogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9ZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICBkaWcgNwogICAgZXh0cmFjdCA0OSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTI0CiAgICAvLyBmbGFncz1lbnRyeS5mbGFncywKICAgIGRpZyA4CiAgICBleHRyYWN0IDU3IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMTQtMTEyNQogICAgLy8gdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0KAogICAgLy8gICAgIGV2ZW50X2lkPWVudHJ5LmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1lbnRyeS5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1lbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPWVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9ZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPWVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGZsYWdzPWVudHJ5LmZsYWdzLAogICAgLy8gKSwKICAgIHVuY292ZXIgNwogICAgdW5jb3ZlciA4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNwogICAgY29uY2F0CiAgICB1bmNvdmVyIDYKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMjAKICAgIC8vIG9ic2VydmVkX3JhdGU9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMTQtMTEyNQogICAgLy8gdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0KAogICAgLy8gICAgIGV2ZW50X2lkPWVudHJ5LmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1lbnRyeS5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1lbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPWVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9ZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPWVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGZsYWdzPWVudHJ5LmZsYWdzLAogICAgLy8gKSwKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTEyLTExMjYKICAgIC8vIHNlbGYuX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5KAogICAgLy8gICAgIGVudHJ5LAogICAgLy8gICAgIHR5cC5PYnNlcnZlZEV2ZW50UmVxdWVzdCgKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPWVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIG9ic2VydmVkX3JhdGU9VUludDY0KDApLAogICAgLy8gICAgICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1lbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1lbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICAgICAgZmxhZ3M9ZW50cnkuZmxhZ3MsCiAgICAvLyAgICAgKSwKICAgIC8vICkKICAgIGNhbGxzdWIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5CiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMjcKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA5NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuYXBwbHlfbm9uX2Nhc2hfZXZlbnRbcm91dGluZ10oKSAtPiB2b2lkOgphcHBseV9ub25fY2FzaF9ldmVudDoKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDQKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTI5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cG4gMgogICAgbGVuCiAgICBwdXNoaW50IDczCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLk9ic2VydmVkRXZlbnRSZXF1ZXN0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE0MwogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDQKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTQ2CiAgICAvLyBpZiBwYXlsb2FkLmZsYWdzICYgVUludDY0KGVudW1zLkZMQUdfT0JTRVJWRURfRVZFTlQpOgogICAgcHVzaGludCA2NQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgcHVzaGludCA0CiAgICAmCiAgICBieiBhcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIzMwogICAgLy8gcmV0dXJuIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQ0xNKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICBwdXNoaW50IDUKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTQ3CiAgICAvLyBhc3NlcnQgc2VsZi5fc3VwcG9ydHNfb2JzZXJ2ZWRfZXZlbnRzKCksIGVyci5PQlNFUlZFRF9FVkVOVF9SRVFVSVJFRAogICAgYXNzZXJ0IC8vIE9ic2VydmVkIGV2ZW50IHJlcXVpcmVkIHRvIGV4ZWN1dGUgdGhpcyBhY3Rpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDgKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjMzCiAgICAvLyByZXR1cm4gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9DTE0pCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIGR1cAogICAgcHVzaGludCA1CiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQ3CiAgICAvLyBhc3NlcnQgc2VsZi5fc3VwcG9ydHNfb2JzZXJ2ZWRfZXZlbnRzKCksIGVyci5PQlNFUlZFRF9FVkVOVF9SRVFVSVJFRAogICAgYXNzZXJ0IC8vIE9ic2VydmVkIGV2ZW50IHJlcXVpcmVkIHRvIGV4ZWN1dGUgdGhpcyBhY3Rpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk0OAogICAgLy8gYXNzZXJ0IHBheWxvYWQuZXZlbnRfaWQgPT0gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGRpZyAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDcKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBpZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTUwCiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUsIHBheWxvYWQuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgYnVyeSAxMgogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk0OS05NTEKICAgIC8vIHNlbGYuX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIHNlbGYuY29udHJhY3RfdHlwZSwgcGF5bG9hZC5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICAvLyApCiAgICBjYWxsc3ViIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTUzCiAgICAvLyBwYWdlX2luZGV4ID0gc2VsZi5fc2NoZWR1bGVfcGFnZV9pbmRleChzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTkwCiAgICAvLyByZXR1cm4gZXZlbnRfaWQgLy8gVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpCiAgICBwdXNoaW50IDE2CiAgICAvCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTQKICAgIC8vIHBhZ2UgPSB0eXAuRXhlY3V0aW9uU2NoZWR1bGVQYWdlKCkKICAgIGJ5dGVjIDQ4IC8vIDB4MDAwMAogICAgYnVyeSA3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTUKICAgIC8vIGlmIHBhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlOgogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA5CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMjcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1NgogICAgLy8gcGFnZSA9IHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XS5jb3B5KCkKICAgIGRpZyA3CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidXJ5IDcKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX3BhZ2UgZW50cnkgZXhpc3RzCgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDI3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTU3CiAgICAvLyBhc3NlcnQgcGFnZS5sZW5ndGggPCBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGRpZyA1CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgMTYKICAgIDwKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2MgogICAgLy8gc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIGRpZyAzCiAgICBkdXAKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjMKICAgIC8vIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICBkaWcgMQogICAgZXh0cmFjdCAxNyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjQKICAgIC8vIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZGlnIDIKICAgIGV4dHJhY3QgMjUgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTY1CiAgICAvLyBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDMKICAgIGV4dHJhY3QgNDEgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTY2CiAgICAvLyBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIGRpZyA0CiAgICBleHRyYWN0IDQ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2NwogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIHVuY292ZXIgNQogICAgZXh0cmFjdCA1NyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTktOTY5CiAgICAvLyB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1wYXlsb2FkLmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9cGF5bG9hZC5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPXBheWxvYWQucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXBheWxvYWQubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICkKICAgIGRpZyAxMQogICAgaXRvYgogICAgZGlnIDE4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMwogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTgtOTcwCiAgICAvLyBwYWdlLmFwcGVuZCgKICAgIC8vICAgICB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9cGF5bG9hZC5ldmVudF9pZCwKICAgIC8vICAgICAgICAgZXZlbnRfdHlwZT1wYXlsb2FkLmV2ZW50X3R5cGUsCiAgICAvLyAgICAgICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIC8vICAgICAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICAgICApCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NzEKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHBhZ2UuY29weSgpCiAgICBkaWcgOAogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk3MgogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTUxCiAgICAvLyBhc3NlcnQgZXZlbnRfaWQgPT0gc2VsZi5ldmVudF9jdXJzb3IsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBjdXJzb3IKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTIKICAgIC8vIGVudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KGV2ZW50X2lkKQogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1NAogICAgLy8gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgYnVyeSAxMAogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjQKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY1CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzYzLTM3MAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9SUiksCiAgICBwdXNoaW50IDEyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY3CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICBwdXNoaW50IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY4CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgcHVzaGludCAxOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzYzLTM3MAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBieiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX2ZhbHNlQDE2CgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX3RydWVAMTU6CiAgICBpbnRjXzEgLy8gMQoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9tZXJnZUAxNzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTMtMTE1NQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2lzX25vbl9jYXNoKAogICAgLy8gICAgIGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIC8vICksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IHR5cGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTYKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlICE9IGFyYzQuVUludDgoZW51bXMuRVZUX0lFRCksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGRpZyA4CiAgICBwdXNoYnl0ZXMgMHgwMQogICAgYiE9CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCB0eXBlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNzQKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluIChVSW50NjQoZW51bXMuRVZUX1JSKSwgVUludDY0KGVudW1zLkVWVF9SUkYpKQogICAgZGlnIDQKICAgIHB1c2hpbnQgMTIKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDIxCiAgICBkaWcgNAogICAgcHVzaGludCAxMQogICAgPT0KICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfZmFsc2VAMjIKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAyMToKICAgIGludGNfMSAvLyAxCgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX21lcmdlQDIzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1NwogICAgLy8gaWYgc2VsZi5fZXZlbnRfaXNfcmF0ZV9yZXNldChlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpKToKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Vsc2VfYm9keUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODAKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLm9ic2VydmVyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjUgLy8gMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTYxCiAgICAvLyBzZWxmLl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeShlbnRyeSwgcGF5bG9hZCkKICAgIGRpZyA2CiAgICBkaWcgMgogICAgY2FsbHN1YiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkKICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE2MgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTI5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Vsc2VfYm9keUA1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE2MAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICBiIGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VANgoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9mYWxzZUAyMjoKICAgIGludGNfMCAvLyAwCiAgICBiIGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfbWVyZ2VAMjMKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfZmFsc2VAMTY6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX21lcmdlQDE3CgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuYXBwZW5kX29ic2VydmVkX2Nhc2hfZXZlbnRbcm91dGluZ10oKSAtPiB2b2lkOgphcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudDoKICAgIGludGNfMCAvLyAwCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBsZW4KICAgIHB1c2hpbnQgNjUKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuT2JzZXJ2ZWRDYXNoRXZlbnRSZXF1ZXN0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE3MgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTczCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE3NAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDcKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMzMKICAgIC8vIHJldHVybiBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0NMTSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgcHVzaGludCA1CiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTgxCiAgICAvLyBhc3NlcnQgc2VsZi5fc3VwcG9ydHNfb2JzZXJ2ZWRfZXZlbnRzKCksIGVyci5PQlNFUlZFRF9FVkVOVF9SRVFVSVJFRAogICAgYXNzZXJ0IC8vIE9ic2VydmVkIGV2ZW50IHJlcXVpcmVkIHRvIGV4ZWN1dGUgdGhpcyBhY3Rpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4MgogICAgLy8gYXNzZXJ0IHBheWxvYWQuZXZlbnRfaWQgPT0gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIHN3YXAKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgaWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4MwogICAgLy8gYXNzZXJ0IHBheWxvYWQuZXZlbnRfdHlwZSA9PSBhcmM0LlVJbnQ4KGVudW1zLkVWVF9QUiksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGRpZyAxCiAgICBleHRyYWN0IDggMQogICAgZHVwCiAgICBjb3ZlciAzCiAgICBwdXNoYnl0ZXMgMHgwMwogICAgYj09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCB0eXBlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5ODQKICAgIC8vIGFzc2VydCBwYXlsb2FkLmZsYWdzICYgVUludDY0KGVudW1zLkZMQUdfQ0FTSF9FVkVOVCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgc3dhcAogICAgcHVzaGludCA1NwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18xIC8vIDEKICAgICYKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4NgogICAgLy8gaWYgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA+IFVJbnQ2NCgwKToKICAgIGJ6IGFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTg3CiAgICAvLyBwcmV2aW91c19lbnRyeSA9IHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IC0gVUludDY0KDEpKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTg5CiAgICAvLyBwcmV2aW91c19lbnRyeS5zY2hlZHVsZWRfdGltZSA8PSBwYXlsb2FkLnNjaGVkdWxlZF90aW1lCiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgNAogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgPD0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4OC05OTAKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgcHJldmlvdXNfZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gcGF5bG9hZC5zY2hlZHVsZWRfdGltZQogICAgLy8gKSwgZXJyLklOVkFMSURfU09SVElORwogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIG11c3QgYmUgc29ydGVkIGluIHN0cmljdGx5IGFzY2VuZGluZyBvcmRlcgoKYXBwZW5kX29ic2VydmVkX2Nhc2hfZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTkyCiAgICAvLyBwYWdlX2luZGV4ID0gc2VsZi5fc2NoZWR1bGVfcGFnZV9pbmRleChzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTkwCiAgICAvLyByZXR1cm4gZXZlbnRfaWQgLy8gVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpCiAgICBwdXNoaW50IDE2CiAgICAvCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OTMKICAgIC8vIHBhZ2UgPSB0eXAuRXhlY3V0aW9uU2NoZWR1bGVQYWdlKCkKICAgIGJ5dGVjIDQ4IC8vIDB4MDAwMAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OTQKICAgIC8vIGlmIHBhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlOgogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA3CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VANQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTk1CiAgICAvLyBwYWdlID0gc2VsZi5zY2hlZHVsZV9wYWdlW3BhZ2VfaW5kZXhdLmNvcHkoKQogICAgZGlnIDUKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGJ1cnkgNgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfcGFnZSBlbnRyeSBleGlzdHMKCmFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5NgogICAgLy8gYXNzZXJ0IHBhZ2UubGVuZ3RoIDwgVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBkaWcgNAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBwdXNoaW50IDE2CiAgICA8CiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDAxCiAgICAvLyBzY2hlZHVsZWRfdGltZT1wYXlsb2FkLnNjaGVkdWxlZF90aW1lLAogICAgZGlnIDUKICAgIGR1cAogICAgZXh0cmFjdCA5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMDIKICAgIC8vIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICBkaWcgMQogICAgZXh0cmFjdCAxNyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDAzCiAgICAvLyByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPXBheWxvYWQucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIGRpZyAyCiAgICBleHRyYWN0IDI1IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMDQKICAgIC8vIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPXBheWxvYWQubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBkaWcgMwogICAgZXh0cmFjdCAzMyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDA1CiAgICAvLyBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIGRpZyA0CiAgICBleHRyYWN0IDQxIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMDYKICAgIC8vIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXBheWxvYWQubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICB1bmNvdmVyIDUKICAgIGV4dHJhY3QgNDkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTk4LTEwMDgKICAgIC8vIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgIGV2ZW50X2lkPXBheWxvYWQuZXZlbnRfaWQsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1wYXlsb2FkLmV2ZW50X3R5cGUsCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPXBheWxvYWQubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1wYXlsb2FkLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICBmbGFncz1wYXlsb2FkLmZsYWdzLAogICAgLy8gKQogICAgZGlnIDEwCiAgICBpdG9iCiAgICBkaWcgMTAKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5Ny0xMDA5CiAgICAvLyBwYWdlLmFwcGVuZCgKICAgIC8vICAgICB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9cGF5bG9hZC5ldmVudF9pZCwKICAgIC8vICAgICAgICAgZXZlbnRfdHlwZT1wYXlsb2FkLmV2ZW50X3R5cGUsCiAgICAvLyAgICAgICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIC8vICAgICAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICAgICApCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDEwCiAgICAvLyBzZWxmLnNjaGVkdWxlX3BhZ2VbcGFnZV9pbmRleF0gPSBwYWdlLmNvcHkoKQogICAgZGlnIDYKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDExCiAgICAvLyBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50ICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNzgKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE2NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfZ2V0X3N0YXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfZ2V0X3N0YXRlOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBkdXAKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE4NQogICAgLy8gY29udHJhY3RfdHlwZT1hcmM0LlVJbnQ4KHNlbGYuY29udHJhY3RfdHlwZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzIgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExODcKICAgIC8vIHRvdGFsX3VuaXRzPXNlbGYudG90YWxfdW5pdHMsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE4OAogICAgLy8gcmVzZXJ2ZWRfdW5pdHNfdG90YWw9c2VsZi5yZXNlcnZlZF91bml0c190b3RhbCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTg5CiAgICAvLyBpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudD1zZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExOTAKICAgIC8vIGV2ZW50X2N1cnNvcj1zZWxmLmV2ZW50X2N1cnNvciwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE5MQogICAgLy8gc2NoZWR1bGVfZW50cnlfY291bnQ9c2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExOTIKICAgIC8vIG91dHN0YW5kaW5nX3ByaW5jaXBhbD1zZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE5MwogICAgLy8gaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZT1zZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE5NAogICAgLy8gbm9taW5hbF9pbnRlcmVzdF9yYXRlPXNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTk1CiAgICAvLyBhY2NydWVkX2ludGVyZXN0PXNlbGYuYWNjcnVlZF9pbnRlcmVzdCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTk2CiAgICAvLyBjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4PXNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE5NwogICAgLy8gY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXg9c2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTk4CiAgICAvLyByZXNlcnZlZF9pbnRlcmVzdD1zZWxmLnJlc2VydmVkX2ludGVyZXN0LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExOTkKICAgIC8vIHJlc2VydmVkX3ByaW5jaXBhbD1zZWxmLnJlc2VydmVkX3ByaW5jaXBhbCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExODQtMTIwMAogICAgLy8gcmV0dXJuIHR5cC5LZXJuZWxTdGF0ZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlPWFyYzQuVUludDgoc2VsZi5jb250cmFjdF90eXBlKSwKICAgIC8vICAgICBzdGF0dXM9c2VsZi5zdGF0dXMsCiAgICAvLyAgICAgdG90YWxfdW5pdHM9c2VsZi50b3RhbF91bml0cywKICAgIC8vICAgICByZXNlcnZlZF91bml0c190b3RhbD1zZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsLAogICAgLy8gICAgIGluaXRpYWxfZXhjaGFuZ2VfYW1vdW50PXNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQsCiAgICAvLyAgICAgZXZlbnRfY3Vyc29yPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgLy8gICAgIHNjaGVkdWxlX2VudHJ5X2NvdW50PXNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQsCiAgICAvLyAgICAgb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2U9c2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlLAogICAgLy8gICAgIG5vbWluYWxfaW50ZXJlc3RfcmF0ZT1zZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBhY2NydWVkX2ludGVyZXN0PXNlbGYuYWNjcnVlZF9pbnRlcmVzdCwKICAgIC8vICAgICBjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4PXNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCwKICAgIC8vICAgICBjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleD1zZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4LAogICAgLy8gICAgIHJlc2VydmVkX2ludGVyZXN0PXNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QsCiAgICAvLyAgICAgcmVzZXJ2ZWRfcHJpbmNpcGFsPXNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsLAogICAgLy8gKQogICAgdW5jb3ZlciAxNAogICAgaXRvYgogICAgdW5jb3ZlciAxNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDEzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDEwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgOQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDgKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnRbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIwNgogICAgLy8gaWYgc2VsZi5ldmVudF9jdXJzb3IgPj0gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgPj0KICAgIGJ6IGNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMDgKICAgIC8vIGV2ZW50X2lkPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjA3LTEyMTcKICAgIC8vIHJldHVybiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1zZWxmLmV2ZW50X2N1cnNvciwKICAgIC8vICAgICBldmVudF90eXBlPWFyYzQuVUludDgoMCksCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9VUludDY0KDApLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9VUludDY0KDApLAogICAgLy8gICAgIGZsYWdzPVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGl0b2IKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMDkKICAgIC8vIGV2ZW50X3R5cGU9YXJjNC5VSW50OCgwKSwKICAgIGJ5dGVjIDQwIC8vIDB4MDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMDctMTIxNwogICAgLy8gcmV0dXJuIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgIGV2ZW50X2lkPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgLy8gICAgIGV2ZW50X3R5cGU9YXJjNC5VSW50OCgwKSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1VSW50NjQoMCksCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1VSW50NjQoMCksCiAgICAvLyAgICAgZmxhZ3M9VUludDY0KDApLAogICAgLy8gKQogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjEwCiAgICAvLyBzY2hlZHVsZWRfdGltZT1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIwNy0xMjE3CiAgICAvLyByZXR1cm4gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkoCiAgICAvLyAgICAgZXZlbnRfaWQ9c2VsZi5ldmVudF9jdXJzb3IsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1hcmM0LlVJbnQ4KDApLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPVVJbnQ2NCgwKSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249VUludDY0KDApLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPVVJbnQ2NCgwKSwKICAgIC8vICAgICBmbGFncz1VSW50NjQoMCksCiAgICAvLyApCiAgICBpdG9iCiAgICBzd2FwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKCmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudF9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudEA0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIwMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpjb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIxOAogICAgLy8gcmV0dXJuIHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLmV2ZW50X2N1cnNvcikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjAyCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50QDQKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5jb250cmFjdF91cGRhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF91cGRhdGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTUzLTE1NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGdyYW50cyB0aGUgdXBkYXRlIHBlcm1pc3Npb25zIHRvIHRoZSBBcnJhbmdlci4KICAgIC8vICMg4pqg77iPIFdBUk5JTkc6IEFwcGxpY2F0aW9uIHVwZGF0ZXMgbXVzdCBiZSBleGVjdXRlZCBWRVJZIGNhcmVmdWxseSwgYXMgdGhleQogICAgLy8gIyBtaWdodCBpbnRyb2R1Y2UgYnJlYWtpbmcgY2hhbmdlcy4KICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfcm90YXRlX2FycmFuZ2VyW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19yb3RhdGVfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2OQogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTcwCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gbmV3X2FycmFuZ2VyCiAgICBieXRlYyAxOCAvLyAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTcxCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfc2V0X29wX2RhZW1vbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfc2V0X29wX2RhZW1vbjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTg0CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODUKICAgIC8vIHNlbGYub3BfZGFlbW9uLnZhbHVlID0gYWRkcmVzcwogICAgYnl0ZWMgMjYgLy8gMHg1MjIzNGY3MDQ0NjE2NTZkNmY2ZTIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4NgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTczCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2Fzc2lnbl9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19hc3NpZ25fcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDE2CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLlJvbGVWYWxpZGl0eQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjExCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMgogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgcHVzaGludCAyMAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTAzCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gcm9sZV9hZGRyZXNzCiAgICBieXRlYyAxOCAvLyAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMKICAgIGRpZyAzCiAgICBhcHBfZ2xvYmFsX3B1dAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTQKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDYKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIGR1cAogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnRfbWFuYWdlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMyAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwOAogICAgLy8gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMiAvLyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTIKICAgIC8vIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIGR1cAogICAgcHVzaGludCA2MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE1CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMzIgLy8gMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE2CiAgICAvLyBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExOAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMSAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIwCiAgICAvLyBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMwogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgODAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIzCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI1IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI0CiAgICAvLyBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3Jldm9rZV9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19yZXZva2Vfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzUKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzNgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzcKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCkpCiAgICBidG9pCiAgICBkdXBuIDIKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCAhPSBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksIGVyci5JTlZBTElEX1JPTEUKICAgIGR1cAogICAgcHVzaGludCAyMAogICAgIT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyOAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIzIC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0NGQ2MTZlNjE2NzY1NzIyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMwCiAgICAvLyBkZWwgc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzOQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjE2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIyIC8vIDB4NTIyMzUwNzI2OTZkNjE3Mjc5NDQ2NTYxNmM2NTcyMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNAogICAgLy8gZGVsIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjM4CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIGR1cAogICAgcHVzaGludCA2MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAzMiAvLyAweDUyMjM1NDcyNzU3Mzc0NjU2NTIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzgKICAgIC8vIGRlbCBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjM4CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDEKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hdXRob3JpdHksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjEgLy8gMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MgogICAgLy8gZGVsIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzOAogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDQKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDgwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI1IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ2CiAgICAvLyBkZWwgc2VsZi5vYnNlcnZlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfY29udHJhY3Rfc3VzcGVuc2lvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfY29udHJhY3Rfc3VzcGVuc2lvbjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCAgIyBUT0RPOiBVcGRhdGUgc3BlY3MgYW5kIGFkZCB0ZXN0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojc3CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyMSAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1NwogICAgLy8gc2VsZi5hc3NldF9zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGJ5dGVjIDMzIC8vICJhc3NldF9zdXNwZW5kZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1OAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QgICMgVE9ETzogVXBkYXRlIHNwZWNzIGFuZCBhZGQgdGVzdAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X2FycmFuZ2VyW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjY4CiAgICAvLyByZXR1cm4gc2VsZi5hcnJhbmdlci52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE4IC8vIDB4NTIyMzQxNzI3MjYxNmU2NzY1NzIyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI2MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYWRkcmVzc19yb2xlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjcwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4NAogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hY2NvdW50X21hbmFnZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjMgLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQ0ZDYxNmU2MTY3NjU3MjIzCiAgICBkaWcgMQogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODUKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYucHJpbWFyeV9kZWFsZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjIgLy8gMHg1MjIzNTA3MjY5NmQ2MTcyNzk0NDY1NjE2YzY1NzIyMwogICAgZGlnIDIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg2CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnRydXN0ZWUsIGFkZHJlc3MpLAogICAgYnl0ZWMgMzIgLy8gMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMwogICAgZGlnIDMKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg3CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgYWRkcmVzcyksCiAgICBieXRlYyAyMSAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgZGlnIDQKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg4CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLm9ic2VydmVyLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDI1IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgdW5jb3ZlciA1CiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlYyA0MCAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciA2CiAgICBzZXRiaXQKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDUKICAgIHNldGJpdAogICAgcHVzaGludCAyCiAgICB1bmNvdmVyIDQKICAgIHNldGJpdAogICAgcHVzaGludCAzCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgcHVzaGludCA0CiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwNQogICAgLy8gcm9sZSA9IHJvbGVfaWQuYXNfdWludDY0KCkKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDYKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGUpCiAgICBkdXAKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA4CiAgICAvLyBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKToKICAgIHB1c2hpbnRzIDIwIDQwIDUwIDYwIDcwIDgwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA3LTMzOAogICAgLy8gbWF0Y2ggcm9sZToKICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKToKICAgIC8vICAgICAgICAgcmV0dXJuIHR5cC5Sb2xlVmFsaWRpdHkoCiAgICAvLyAgICAgICAgICAgICByb2xlX3ZhbGlkaXR5X3N0YXJ0PVVJbnQ2NCgwKSwgcm9sZV92YWxpZGl0eV9lbmQ9VUludDY0KDApCiAgICAvLyAgICAgICAgICkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSk6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSk6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgXzoKICAgIC8vICAgICAgICAgb3AuZXJyKGVyci5JTlZBTElEX1JPTEUpCiAgICB1bmNvdmVyIDYKICAgIG1hdGNoIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMEAyIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMUAzIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMkA0IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfM0A1IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNEA2IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzM4CiAgICAvLyBvcC5lcnIoZXJyLklOVkFMSURfUk9MRSkKICAgIGVyciAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV81QDc6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzM0CiAgICAvLyBzZWxmLm9ic2VydmVyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDI1IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMzMy0zMzUKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLm9ic2VydmVyLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzYKICAgIC8vIHJldHVybiBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV80QDY6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI5CiAgICAvLyBzZWxmLmF1dGhvcml0eSwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAyMSAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOC0zMzAKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLmF1dGhvcml0eSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzMxCiAgICAvLyByZXR1cm4gc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8zQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI0CiAgICAvLyBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMzIgLy8gMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMy0zMjUKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyNgogICAgLy8gcmV0dXJuIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzJANDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTkKICAgIC8vIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMjIgLy8gMHg1MjIzNTA3MjY5NmQ2MTcyNzk0NDY1NjE2YzY1NzIyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxOC0zMjAKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLnByaW1hcnlfZGVhbGVyLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjEKICAgIC8vIHJldHVybiBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMUAzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxNAogICAgLy8gc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMjMgLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQ0ZDYxNmU2MTY3NjU3MjIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEzLTMxNQogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTYKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzBAMjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDktMzExCiAgICAvLyByZXR1cm4gdHlwLlJvbGVWYWxpZGl0eSgKICAgIC8vICAgICByb2xlX3ZhbGlkaXR5X3N0YXJ0PVVJbnQ2NCgwKSwgcm9sZV92YWxpZGl0eV9lbmQ9VUludDY0KDApCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB2b2lkOgpfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZDoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNgogICAgLy8gZGVmIF9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHNlbGYsIGhvbGRpbmdfYWRkcmVzczogQWNjb3VudCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI4CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZCwgZXJyLlNVU1BFTkRFRAogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHB1c2hpbnQgMzg0CiAgICBnZXRiaXQKICAgICEKICAgIGFzc2VydCAvLyBTdXNwZW5kZWQgb3BlcmF0aW9ucwogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuX3NldHRsZV9wb3NpdGlvbihob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB1aW50NjQsIHVpbnQ2NDoKX3NldHRsZV9wb3NpdGlvbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo0NAogICAgLy8gZGVmIF9zZXR0bGVfcG9zaXRpb24oc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50KSAtPiB0dXBsZVtVSW50NjQsIFVJbnQ2NF06CiAgICBwcm90byAxIDIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NjEKICAgIC8vIHBvc2l0aW9uID0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY29weSgpCiAgICBkdXAKICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjYzLTY1CiAgICAvLyAjIENvbXB1dGUgdGhlIGluY3JlbWVudGFsIHBlci11bml0IGZpeGVkLXBvaW50IGludGVyZXN0IGFuZCBwcmluY2lwYWwgYWNjcnVlZAogICAgLy8gIyBzaW5jZSB0aGlzIGFjY291bnQncyBsYXN0IGNoZWNrcG9pbnQuCiAgICAvLyBpbnRlcmVzdF9kZWx0YSA9IHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCAtIHBvc2l0aW9uLmludGVyZXN0X2NoZWNrcG9pbnQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IGV4aXN0cwogICAgZGlnIDEKICAgIHB1c2hpbnQgNTcKICAgIGV4dHJhY3RfdWludDY0CiAgICAtCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NjcKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggLSBwb3NpdGlvbi5wcmluY2lwYWxfY2hlY2twb2ludAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCBleGlzdHMKICAgIGRpZyAyCiAgICBwdXNoaW50IDY1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjczCiAgICAvLyBpbnRlcmVzdF9kZWx0YSwgcG9zaXRpb24udW5pdHMsIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUKICAgIGRpZyAyCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzAtNzQKICAgIC8vICMgQ29udmVydCB0aGUgcGVyLXVuaXQgZml4ZWQtcG9pbnQgZGVsdGFzIGludG8gYWJzb2x1dGUgY2xhaW1hYmxlIGFtb3VudHMKICAgIC8vICMgdXNpbmcgdGhlIGFjY291bnQncyBhY3RpdmUgdW5pdHMuCiAgICAvLyBjbGFpbWFibGVfaW50ZXJlc3QgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBpbnRlcmVzdF9kZWx0YSwgcG9zaXRpb24udW5pdHMsIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUKICAgIC8vICkKICAgIHVuY292ZXIgMwogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3NgogICAgLy8gcHJpbmNpcGFsX2RlbHRhLCBwb3NpdGlvbi51bml0cywgc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojc1LTc3CiAgICAvLyBjbGFpbWFibGVfcHJpbmNpcGFsID0gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgcHJpbmNpcGFsX2RlbHRhLCBwb3NpdGlvbi51bml0cywgc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgLy8gKQogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3OS04MQogICAgLy8gIyBBY2NydWUgdGhlIGNsYWltYWJsZSBhbW91bnRzIHRvIHRoZSBhY2NvdW50IHBvc2l0aW9uIGFuZCBtYWtlIHRoZW0gYXZhaWxhYmxlCiAgICAvLyAjIGZvciB3aXRoZHJhd2FsLgogICAgLy8gcG9zaXRpb24uY2xhaW1hYmxlX2ludGVyZXN0ICs9IGNsYWltYWJsZV9pbnRlcmVzdAogICAgZGlnIDIKICAgIHB1c2hpbnQgNzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgKwogICAgaXRvYgogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICByZXBsYWNlMiA3MwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjgyCiAgICAvLyBwb3NpdGlvbi5jbGFpbWFibGVfcHJpbmNpcGFsICs9IGNsYWltYWJsZV9wcmluY2lwYWwKICAgIGR1cAogICAgcHVzaGludCA4MQogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICArCiAgICBpdG9iCiAgICByZXBsYWNlMiA4MQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojg0LTg2CiAgICAvLyAjIEFkdmFuY2UgdGhlIGFjY291bnQncyBwZXItdW5pdCBmaXhlZC1wb2ludCBjaGVja3BvaW50cyB0byB0aGUgY3VycmVudCBnbG9iYWwKICAgIC8vICMgcGVyLXVuaXQgZml4ZWQtcG9pbnQgZ2xvYmFsIGluZGljZXMuCiAgICAvLyBwb3NpdGlvbi5pbnRlcmVzdF9jaGVja3BvaW50ID0gc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCBleGlzdHMKICAgIGl0b2IKICAgIHJlcGxhY2UyIDU3CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6ODcKICAgIC8vIHBvc2l0aW9uLnByaW5jaXBhbF9jaGVja3BvaW50ID0gc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCBleGlzdHMKICAgIGl0b2IKICAgIHJlcGxhY2UyIDY1CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6ODktOTAKICAgIC8vICMgQWR2YW5jZSB0aGUgYWNjb3VudCdzIGV2ZW50IGN1cnNvciB0byB0aGUgY3VycmVudCBnbG9iYWwgZXZlbnQgY3Vyc29yLgogICAgLy8gcG9zaXRpb24uc2V0dGxlZF9jdXJzb3IgPSBzZWxmLmV2ZW50X2N1cnNvcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpdG9iCiAgICByZXBsYWNlMiA0OQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjkyLTk0CiAgICAvLyAjIFVwZGF0ZSB0aGUgYWNjb3VudCBwb3NpdGlvbiBhbmQgcmV0dXJuIHRoZSBuZXdseSBhY2NydWVkIGNsYWltYWJsZSBhbW91bnRzCiAgICAvLyAjIGFkZGVkIHRvIHRoZSB0b3RhbCBwb3NpdGlvbidzIGNsYWltYWJsZSBhbW91bnRzLgogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSBwb3NpdGlvbi5jb3B5KCkKICAgIHVuY292ZXIgMwogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojk1CiAgICAvLyByZXR1cm4gY2xhaW1hYmxlX2ludGVyZXN0LCBjbGFpbWFibGVfcHJpbmNpcGFsCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5fZW5zdXJlX3VuaXRzX2FjdGl2YXRlZChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB2b2lkOgpfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZDoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo5NwogICAgLy8gZGVmIF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKHNlbGYsIGhvbGRpbmdfYWRkcmVzczogQWNjb3VudCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTAwCiAgICAvLyBpZiBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKToKICAgIGJ6IF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwMQogICAgLy8gcmV0dXJuCiAgICByZXRzdWIKCl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDMKICAgIC8vIHBvc2l0aW9uID0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY29weSgpCiAgICBmcmFtZV9kaWcgMgogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA0CiAgICAvLyBpZiBwb3NpdGlvbi5yZXNlcnZlZF91bml0cyA9PSBVSW50NjQoMCk6CiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIGJueiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZF9hZnRlcl9pZl9lbHNlQDQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDUKICAgIC8vIHJldHVybgogICAgcmV0c3ViCgpfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZF9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA4CiAgICAvLyBwb3NpdGlvbi51bml0cyArPSBhY3RpdmF0ZWRfdW5pdHMKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDMKICAgICsKICAgIGl0b2IKICAgIHJlcGxhY2UyIDMyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA5CiAgICAvLyBwb3NpdGlvbi5yZXNlcnZlZF91bml0cyA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGl0b2IKICAgIHJlcGxhY2UyIDQwCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTEwCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHBvc2l0aW9uLmNvcHkoKQogICAgZnJhbWVfZGlnIDIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTEKICAgIC8vIGFzc2VydCBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID49IGFjdGl2YXRlZF91bml0cywgZXJyLk9WRVJfRElTVFJJQlVUSU9OCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIGV4aXN0cwogICAgZHVwCiAgICBkaWcgMgogICAgPj0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgcmVtYWluaW5nIEQtQVNBIHVuaXRzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTEyCiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIC09IGFjdGl2YXRlZF91bml0cwogICAgc3dhcAogICAgLQogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9zY2FsZWRfbXVsX2RpdihtdWx0aXBsaWNhbmQ6IHVpbnQ2NCwgbXVsdGlwbGllcjogdWludDY0LCBkaXZpc29yOiB1aW50NjQpIC0+IHVpbnQ2NDoKX3NjYWxlZF9tdWxfZGl2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTUzLTE1NQogICAgLy8gZGVmIF9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLCBtdWx0aXBsaWNhbmQ6IFVJbnQ2NCwgbXVsdGlwbGllcjogVUludDY0LCBkaXZpc29yOiBVSW50NjQKICAgIC8vICkgLT4gVUludDY0OgogICAgcHJvdG8gMyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTcKICAgIC8vIGlmIG11bHRpcGxpY2FuZCA9PSBVSW50NjQoMCkgb3IgbXVsdGlwbGllciA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTMKICAgIGJ6IF9zY2FsZWRfbXVsX2Rpdl9pZl9ib2R5QDIKICAgIGZyYW1lX2RpZyAtMgogICAgYm56IF9zY2FsZWRfbXVsX2Rpdl9hZnRlcl9pZl9lbHNlQDMKCl9zY2FsZWRfbXVsX2Rpdl9pZl9ib2R5QDI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTgKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9zY2FsZWRfbXVsX2Rpdl9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTkKICAgIC8vIGhpZ2gsIGxvdyA9IG9wLm11bHcobXVsdGlwbGljYW5kLCBtdWx0aXBsaWVyKQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIG11bHcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2MAogICAgLy8gcmV0dXJuIG9wLmRpdncoaGlnaCwgbG93LCBkaXZpc29yKQogICAgZnJhbWVfZGlnIC0xCiAgICBkaXZ3CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYW1vdW50X3RvX2luZGV4X2RlbHRhKGFtb3VudDogdWludDY0KSAtPiB1aW50NjQ6Cl9hbW91bnRfdG9faW5kZXhfZGVsdGE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjIKICAgIC8vIGRlZiBfYW1vdW50X3RvX2luZGV4X2RlbHRhKHNlbGYsIGFtb3VudDogVUludDY0KSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2NAogICAgLy8gaWYgYW1vdW50ID09IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMQogICAgYm56IF9hbW91bnRfdG9faW5kZXhfZGVsdGFfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjUKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9hbW91bnRfdG9faW5kZXhfZGVsdGFfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTY2CiAgICAvLyBhc3NlcnQgc2VsZi50b3RhbF91bml0cyA+IFVJbnQ2NCgwKSwgZXJyLk5PX1VOSVRTCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgZHVwCiAgICBhc3NlcnQgLy8gTm8gRC1BU0EgdW5pdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2NwogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KGFtb3VudCwgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwgc2VsZi50b3RhbF91bml0cykKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2luZGV4X2RlbHRhX3RvX2Ftb3VudChpbmRleF9kZWx0YTogdWludDY0KSAtPiB1aW50NjQ6Cl9pbmRleF9kZWx0YV90b19hbW91bnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjkKICAgIC8vIGRlZiBfaW5kZXhfZGVsdGFfdG9fYW1vdW50KHNlbGYsIGluZGV4X2RlbHRhOiBVSW50NjQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTc2CiAgICAvLyBpZiBpbmRleF9kZWx0YSA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGJueiBfaW5kZXhfZGVsdGFfdG9fYW1vdW50X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTc3CiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfaW5kZXhfZGVsdGFfdG9fYW1vdW50X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE3OQogICAgLy8gc2VsZi50b3RhbF91bml0cywKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxODEKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNzgtMTgyCiAgICAvLyByZXR1cm4gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgc2VsZi50b3RhbF91bml0cywKICAgIC8vICAgICBpbmRleF9kZWx0YSwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2dldF9zY2hlZHVsZV9lbnRyeShldmVudF9pZDogdWludDY0KSAtPiBieXRlczoKX2dldF9zY2hlZHVsZV9lbnRyeToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIwMgogICAgLy8gZGVmIF9nZXRfc2NoZWR1bGVfZW50cnkoc2VsZiwgZXZlbnRfaWQ6IFVJbnQ2NCkgLT4gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnk6CiAgICBwcm90byAxIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIwNAogICAgLy8gYXNzZXJ0IGV2ZW50X2lkIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgPgogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgaWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE5MAogICAgLy8gcmV0dXJuIGV2ZW50X2lkIC8vIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDE2CiAgICAvCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMDYKICAgIC8vIGFzc2VydCBwYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxOTQKICAgIC8vIHJldHVybiBldmVudF9pZCAlIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDE2CiAgICAlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMDkKICAgIC8vIGFzc2VydCBvZmZzZXQgPCBwYWdlLmxlbmd0aCwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBwdXNoaW50IDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgMQogICAgPgogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjEwCiAgICAvLyByZXR1cm4gcGFnZVtvZmZzZXRdLmNvcHkoKQogICAgcHVzaGludCA2NQogICAgKgogICAgcHVzaGludCAyCiAgICArCiAgICBwdXNoaW50IDY1CiAgICBib3hfZXh0cmFjdAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKGNvbnRyYWN0X3R5cGU6IHVpbnQ2NCwgZXZlbnRfdHlwZTogdWludDY0KSAtPiB2b2lkOgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTMtMzE1CiAgICAvLyBkZWYgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIHNlbGYsIGNvbnRyYWN0X3R5cGU6IFVJbnQ2NCwgZXZlbnRfdHlwZTogVUludDY0CiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNDcKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNDgKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgaW50Y18yIC8vIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI0OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9NRCksCiAgICBwdXNoaW50IDE5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTAKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgcHVzaGludCAxMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU0LTI1NQogICAgLy8gIyBDaGVjayBjb21tb24gZXZlbnRzIGZpcnN0CiAgICAvLyBpZiBldmVudF90eXBlIGluIGNvbW1vbl9ldmVudHM6CiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjUxCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICBwdXNoaW50IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUA3CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU2CiAgICAvLyByZXR1cm4gVHJ1ZQogICAgaW50Y18xIC8vIDEKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICByZXRzdWIKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTgtMjU5CiAgICAvLyAjIENvbnRyYWN0LXNwZWNpZmljIGFkZGl0aW9uYWwgZXZlbnRzCiAgICAvLyBpZiBjb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9QQU0pOgogICAgZnJhbWVfZGlnIC0yCiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjYwLTI2MQogICAgLy8gIyBQQU0gb25seSBzdXBwb3J0cyBjb21tb24gZXZlbnRzCiAgICAvLyByZXR1cm4gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNjMKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0xBTSkgb3IgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2My0yNjUKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0xBTSkgb3IgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoCiAgICAvLyAgICAgZW51bXMuQ1RfTkFNCiAgICAvLyApOgogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDExCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMgogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDE2CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUAxMToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2Ni0yNzAKICAgIC8vICMgTEFNL05BTSBhZGQ6IFBSLCBJUENCCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjY4CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjY2LTI3MAogICAgLy8gIyBMQU0vTkFNIGFkZDogUFIsIElQQ0IKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDEzCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIHB1c2hpbnQgMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2Ni0yNzAKICAgIC8vICMgTEFNL05BTSBhZGQ6IFBSLCBJUENCCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICkKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF9mYWxzZUAxNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAxMzoKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDE0OgogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMTY6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzIKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTik6CiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMjMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3My0yNzgKICAgIC8vICMgQU5OIGFkZHM6IFBSLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjc1CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjczLTI3OAogICAgLy8gIyBBTk4gYWRkczogUFIsIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDIwCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIHB1c2hpbnQgMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3My0yNzgKICAgIC8vICMgQU5OIGFkZHM6IFBSLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyMAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzcKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIHB1c2hpbnQgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjczLTI3OAogICAgLy8gIyBBTk4gYWRkczogUFIsIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDIxCgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDIwOgogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMjE6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAyMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MAogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfTEFYKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA0CiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMzEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MS0yODcKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MwogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUiksCiAgICBwdXNoaW50IDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MS0yODcKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjgKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjg0CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjgxLTI4NwogICAgLy8gIyBMQVggYWRkczogUFIsIFBJLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyOAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODUKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICBwdXNoaW50IDE4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODEtMjg3CiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDI4CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODEtMjg3CiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDI5CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDI4OgogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMjk6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAzMToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4OQogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQ0xNKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA1CiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMzMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI5MC0yOTEKICAgIC8vICMgQ0xNIGFkZHM6IFBSCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1BSKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDMKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDMzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjkzCiAgICAvLyByZXR1cm4gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5faXNfZHluYW1pY19hbm51aXR5KCkgLT4gdWludDY0OgpfaXNfZHluYW1pY19hbm51aXR5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM1CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzUtMzM2CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIC8vIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGJ6IF9pc19keW5hbWljX2FubnVpdHlfYm9vbF9mYWxzZUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzYKICAgIC8vIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzNCAvLyAiZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM1LTMzNgogICAgLy8gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICAvLyBhbmQgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBieiBfaXNfZHluYW1pY19hbm51aXR5X2Jvb2xfZmFsc2VAMwogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMzNC0zMzcKICAgIC8vIHJldHVybiAoCiAgICAvLyAgICAgc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICAvLyAgICAgYW5kIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgLy8gKQogICAgcmV0c3ViCgpfaXNfZHluYW1pY19hbm51aXR5X2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzQtMzM3CiAgICAvLyByZXR1cm4gKAogICAgLy8gICAgIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKQogICAgLy8gICAgIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIC8vICkKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KGVudHJ5OiBieXRlcykgLT4gdWludDY0LCBieXRlczoKX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozODAKICAgIC8vIGRlZiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudChzZWxmLCBlbnRyeTogdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5CiAgICAvLyBlbnRyeS5hY2NydWFsX2ZhY3RvciA9PSBVSW50NjQoMCkKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAxNwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5LTM5MQogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGJ6IF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2lmX2JvZHlAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzkwCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5LTM5MQogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGJ6IF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2lmX2JvZHlAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzkxCiAgICAvLyBvciBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPT0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5LTM5MQogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGJueiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudF9hZnRlcl9pZl9lbHNlQDQKCl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2lmX2JvZHlAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5MwogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2RpZyAtMQogICAgdW5jb3ZlciAyCiAgICByZXRzdWIKCl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NQogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NgogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NC0zOTgKICAgIC8vIGFjY3J1ZWQgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICAvLyAgICAgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICkKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MDIKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozOTktNDAzCiAgICAvLyByZXR1cm4gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgYWNjcnVlZCwKICAgIC8vICAgICBlbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICBmcmFtZV9kaWcgLTEKICAgIHVuY292ZXIgMgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yKGRpc2NvdW50X2ZhY3RvcjogdWludDY0LCByZWRlbXB0aW9uX2ZhY3RvcjogdWludDY0KSAtPiB1aW50NjQ6Cl9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ2Mi00NjYKICAgIC8vIGRlZiBfZGlzY291bnRfYW5udWl0eV9mYWN0b3IoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBkaXNjb3VudF9mYWN0b3I6IFVJbnQ2NCwKICAgIC8vICAgICByZWRlbXB0aW9uX2ZhY3RvcjogVUludDY0LAogICAgLy8gKSAtPiBVSW50NjQ6CiAgICBwcm90byAyIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ2OAogICAgLy8gaWYgcmVkZW1wdGlvbl9mYWN0b3IgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0xCiAgICBibnogX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDY5CiAgICAvLyByZXR1cm4gZGlzY291bnRfZmFjdG9yCiAgICBmcmFtZV9kaWcgLTIKICAgIHJldHN1YgoKX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3MAogICAgLy8gcGVyaW9kX3JhdGUgPSBzZWxmLmZpeGVkX3BvaW50X3NjYWxlICsgc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzEKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzAtNDc0CiAgICAvLyBwZXJpb2RfcmF0ZSA9IHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgKyBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICByZWRlbXB0aW9uX2ZhY3RvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICBkaWcgMgogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgICsKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3NQogICAgLy8gYXNzZXJ0IHBlcmlvZF9yYXRlID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGR1cAogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDc4CiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDc2LTQ4MAogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIGRpc2NvdW50X2ZhY3RvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gICAgIHBlcmlvZF9yYXRlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkoZW50cnk6IGJ5dGVzLCBwYXlsb2FkOiBieXRlcykgLT4gYnl0ZXMsIGJ5dGVzOgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MTMtNjE1CiAgICAvLyBkZWYgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5KAogICAgLy8gICAgIHNlbGYsIGVudHJ5OiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSwgcGF5bG9hZDogdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0CiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAyIDIKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjIzCiAgICAvLyBhc3NlcnQgZW50cnkuZXZlbnRfaWQgPT0gc2VsZi5ldmVudF9jdXJzb3IsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGN1cnNvcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjI0CiAgICAvLyBhc3NlcnQgZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsIGVyci5OT19EVUVfQ0FTSEZMT1cKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPD0KICAgIGFzc2VydCAvLyBObyBkdWUgY2FzaGZsb3cgdG8gcGF5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MjYKICAgIC8vIGV2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYyNwogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX0lFRCk6CiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGR1cAogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYyOC02MzAKICAgIC8vICMgSUVEIGZpbmFsaXplcyBpc3N1YW5jZTogcmVzZXJ2ZWQgdW5pdHMgYmVjb21lIGFjdGl2YXRhYmxlIGFuZCB0aGUKICAgIC8vICMgc2NoZWR1bGUncyBpbml0aWFsIGNvbnRyYWN0dWFsIHN0YXRlIGJlY29tZXMgbGl2ZS4KICAgIC8vIGFzc2VydCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzIKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPT0gc2VsZi50b3RhbF91bml0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjMxLTYzMwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID09IHNlbGYudG90YWxfdW5pdHMKICAgIC8vICksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9JTkNPTVBMRVRFCiAgICBhc3NlcnQgLy8gUHJpbWFyeSBkaXN0cmlidXRpb24gaXMgbm90IGNvbXBsZXRlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzQKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM1CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzYKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAzMwogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzcKICAgIC8vIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM4CiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzkKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0MAogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX0FDVElWRSkKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgMTAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDUxCiAgICAvLyBhc3NlcnQgZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSA9PSBVSW50NjQoZW51bXMuRVZUX0lFRCksIGVyci5OT1RfRVZUX0lFRAogICAgZnJhbWVfZGlnIDExCiAgICBhc3NlcnQgLy8gTm90IElFRCBldmVudAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDUyCiAgICAvLyByZXR1cm4gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0MS02NDUKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1zZWxmLl9lbnRyeV9pZWRfYW1vdW50KGVudHJ5KSwKICAgIC8vICAgICBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0NAogICAgLy8gc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0MS02NDUKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1zZWxmLl9lbnRyeV9pZWRfYW1vdW50KGVudHJ5KSwKICAgIC8vICAgICBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICAvLyApCiAgICBjYWxsc3ViIF9lbWl0X2V4ZWN1dGlvbl9ldmVudAogICAgZHVwCiAgICBmcmFtZV9idXJ5IC0yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NDYKICAgIC8vIHJldHVybgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0OQogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ICs9IHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBmcmFtZV9idXJ5IC0yCiAgICArCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1MQogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1JSKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCAxMgogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMTAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1NQogICAgLy8gcGF5bG9hZC5vYnNlcnZlZF9yYXRlLAogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjU2CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzNiAvLyAicmF0ZV9yZXNldF9tdWx0aXBsaWVyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1NwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1Mi02NTgKICAgIC8vICMgUlIgZGVyaXZlcyB0aGUgbmV4dCByYXRlIGZyb20gYW4gb2JzZXJ2ZWQgb3JhY2xlIHZhbHVlIHBsdXMgdGhlCiAgICAvLyAjIGNvbnRyYWN0IHNwcmVhZCAvIG11bHRpcGxpZXIgdGVybXMsIHRoZW4gZW5mb3JjZXMgZmxvb3IgYW5kIGNhcC4KICAgIC8vIG9ic2VydmVkX3JhdGUgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBwYXlsb2FkLm9ic2VydmVkX3JhdGUsCiAgICAvLyAgICAgc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICkKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjAKICAgIC8vIG9ic2VydmVkX3JhdGUgKyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzUgLy8gInJhdGVfcmVzZXRfc3ByZWFkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkIGV4aXN0cwogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDMKICAgIC8vIGlmIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgYW5kIHJhdGUgPCBzZWxmLnJhdGVfcmVzZXRfZmxvb3I6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzggLy8gImhhc19yYXRlX3Jlc2V0X2Zsb29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmhhc19yYXRlX3Jlc2V0X2Zsb29yIGV4aXN0cwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMCAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X2Zsb29yIGV4aXN0cwogICAgZnJhbWVfZGlnIDYKICAgID4KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDQKICAgIC8vIHJhdGUgPSBzZWxmLnJhdGVfcmVzZXRfZmxvb3IKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMCAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDYKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfZmxvb3IgZXhpc3RzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1NToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc0NQogICAgLy8gaWYgc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgYW5kIHJhdGUgPiBzZWxmLnJhdGVfcmVzZXRfY2FwOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDM5IC8vICJoYXNfcmF0ZV9yZXNldF9jYXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwIGV4aXN0cwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTgKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMSAvLyAicmF0ZV9yZXNldF9jYXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9jYXAgZXhpc3RzCiAgICBmcmFtZV9kaWcgNgogICAgPAogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc0NgogICAgLy8gcmF0ZSA9IHNlbGYucmF0ZV9yZXNldF9jYXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMSAvLyAicmF0ZV9yZXNldF9jYXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSA2CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X2NhcCBleGlzdHMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjU5CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IHNlbGYuX2NsYW1wX3JhdGUoCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NTktNjYxCiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IHNlbGYuX2NsYW1wX3JhdGUoCiAgICAvLyAgICAgb2JzZXJ2ZWRfcmF0ZSArIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQKICAgIC8vICkKICAgIGZyYW1lX2RpZyA2CiAgICBhcHBfZ2xvYmFsX3B1dAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMTg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzEKICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QSSk6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMjAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY3MgogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzMKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDIzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc4CiAgICAvLyBpZiBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKToKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAyOQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc5CiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFJGKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCA1CiAgICA9PQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMzAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4NAogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCAtIHNlbGYuZXZlbnRfY3Vyc29yCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIC0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4NgogICAgLy8gKiBVSW50NjQoY3N0Lk9QX1VQX05PTl9DQVNIX1BFUl9FTlRSWV9CVURHRVQpCiAgICBwdXNoaW50IDEwMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjgzLTY4NgogICAgLy8gKyAoCiAgICAvLyAgICAgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCAtIHNlbGYuZXZlbnRfY3Vyc29yCiAgICAvLyApCiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfUEVSX0VOVFJZX0JVREdFVCkKICAgICoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4MgogICAgLy8gVUludDY0KGNzdC5PUF9VUF9OT05fQ0FTSF9CQVNFX0JVREdFVCkKICAgIGludGMgNCAvLyAxNTAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODItNjg2CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX05PTl9DQVNIX0JBU0VfQlVER0VUKQogICAgLy8gKyAoCiAgICAvLyAgICAgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCAtIHNlbGYuZXZlbnRfY3Vyc29yCiAgICAvLyApCiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfUEVSX0VOVFJZX0JVREdFVCkKICAgICsKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4MC02ODgKICAgIC8vIGVuc3VyZV9idWRnZXQoCiAgICAvLyAgICAgcmVxdWlyZWRfYnVkZ2V0PSgKICAgIC8vICAgICAgICAgVUludDY0KGNzdC5PUF9VUF9OT05fQ0FTSF9CQVNFX0JVREdFVCkKICAgIC8vICAgICAgICAgKyAoCiAgICAvLyAgICAgICAgICAgICBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IC0gc2VsZi5ldmVudF9jdXJzb3IKICAgIC8vICAgICAgICAgKQogICAgLy8gICAgICAgICAqIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfUEVSX0VOVFJZX0JVREdFVCkKICAgIC8vICAgICApLAogICAgLy8gKQogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDkwCiAgICAvLyBkaXNjb3VudF9mYWN0b3IgPSBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5MQogICAgLy8gZGVub21pbmF0b3IgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5MgogICAgLy8gc2tpcF9maXJzdF9yZWRlbXB0aW9uID0gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5NAogICAgLy8gaWYgZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAyNQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgZnJhbWVfYnVyeSA4CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAzNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDk1LTQ5OQogICAgLy8gIyBBbiBpbml0aWFsIFBSRiBtYXkgZGVzY3JpYmUgdGhlIGZpcnN0IHJlZGVtcHRpb24gcGVyaW9kIGRpcmVjdGx5LgogICAgLy8gZGlzY291bnRfZmFjdG9yID0gc2VsZi5fZGlzY291bnRfYW5udWl0eV9mYWN0b3IoCiAgICAvLyAgICAgZGlzY291bnRfZmFjdG9yLAogICAgLy8gICAgIGVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDgKICAgIGNhbGxzdWIgX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTAxCiAgICAvLyBza2lwX2ZpcnN0X3JlZGVtcHRpb24gPSBUcnVlCiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfYnVyeSA3CiAgICBmcmFtZV9idXJ5IDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDM1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTAzCiAgICAvLyBmdXR1cmVfZXZlbnRfaWQgPSBzZWxmLmV2ZW50X2N1cnNvciArIFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfd2hpbGVfdG9wQDM2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA0CiAgICAvLyB3aGlsZSBmdXR1cmVfZXZlbnRfaWQgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgZnJhbWVfZGlnIDMKICAgID4KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl93aGlsZUA0OAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA1CiAgICAvLyBmdXR1cmVfZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoZnV0dXJlX2V2ZW50X2lkKQogICAgZnJhbWVfZGlnIDMKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwNgogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPSBmdXR1cmVfZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MDctNTA4CiAgICAvLyAjIE9ubHkgcmVkZW1wdGlvbi1iZWFyaW5nIGV2ZW50cyBjb250cmlidXRlIHRvIHRoZSBhbm51aXR5IGRlbm9taW5hdG9yLgogICAgLy8gaXNfcmVkZW1wdGlvbl9ldmVudCA9IGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpIG9yICgKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwNy01MTEKICAgIC8vICMgT25seSByZWRlbXB0aW9uLWJlYXJpbmcgZXZlbnRzIGNvbnRyaWJ1dGUgdG8gdGhlIGFubnVpdHkgZGVub21pbmF0b3IuCiAgICAvLyBpc19yZWRlbXB0aW9uX2V2ZW50ID0gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QUikgb3IgKAogICAgLy8gICAgIGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfTUQpCiAgICAvLyAgICAgYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICAvLyApCiAgICBibnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfdHJ1ZUA0MAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA5CiAgICAvLyBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgZnJhbWVfZGlnIDQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MDktNTEwCiAgICAvLyBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgLy8gYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF9mYWxzZUA0MQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTEwCiAgICAvLyBhbmQgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IgPiBVSW50NjQoMCkKICAgIGZyYW1lX2RpZyAwCiAgICBwdXNoaW50IDI1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA5LTUxMAogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCkKICAgIC8vIGFuZCBmdXR1cmVfZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX3RydWVANDA6CiAgICBpbnRjXzEgLy8gMQoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfbWVyZ2VANDI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTIKICAgIC8vIGlmIGlzX3JlZGVtcHRpb25fZXZlbnQ6CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA0NwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTEzCiAgICAvLyBpZiBza2lwX2ZpcnN0X3JlZGVtcHRpb246CiAgICBmcmFtZV9kaWcgNwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUA0NQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTE0CiAgICAvLyBza2lwX2ZpcnN0X3JlZGVtcHRpb24gPSBGYWxzZQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgNwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANDc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjEKICAgIC8vIGZ1dHVyZV9ldmVudF9pZCArPSBVSW50NjQoMSkKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV93aGlsZV90b3BAMzYKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlANDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTgKICAgIC8vIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZnJhbWVfZGlnIDAKICAgIHB1c2hpbnQgMjUKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTYtNTE5CiAgICAvLyBkaXNjb3VudF9mYWN0b3IgPSBzZWxmLl9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcigKICAgIC8vICAgICBkaXNjb3VudF9mYWN0b3IsCiAgICAvLyAgICAgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMgogICAgc3dhcAogICAgY2FsbHN1YiBfZGlzY291bnRfYW5udWl0eV9mYWN0b3IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjAKICAgIC8vIGRlbm9taW5hdG9yICs9IGRpc2NvdW50X2ZhY3RvcgogICAgZnJhbWVfZGlnIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA0NwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDE6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF9tZXJnZUA0MgoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX3doaWxlQDQ4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTIzCiAgICAvLyBhc3NlcnQgZGVub21pbmF0b3IgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZnJhbWVfZGlnIDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUyNAogICAgLy8gbnVtZXJhdG9yID0gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTI1CiAgICAvLyBpZiBlbnRyeS5mbGFncyAmIFVJbnQ2NChlbnVtcy5GTEFHX0lOSVRJQUxfUFJGKSA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNTcKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gOAogICAgJgogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDUwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjYtNTI3CiAgICAvLyAjIFN1YnNlcXVlbnQgUFJGIGV2ZW50cyBhbW9ydGl6ZSBib3RoIHByaW5jaXBhbCBhbmQgYWxyZWFkeSBhY2NydWVkIGNhcnJ5LgogICAgLy8gbnVtZXJhdG9yICs9IHNlbGYuYWNjcnVlZF9pbnRlcmVzdAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgICsKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDUwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTMwCiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTI4LTUzMgogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIG51bWVyYXRvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gICAgIGRlbm9taW5hdG9yLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDEKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODkKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IHNlbGYuX3JlY2FsY3VsYXRlX2FubnVpdHlfcGF5bWVudCgKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njg5LTY5MQogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gc2VsZi5fcmVjYWxjdWxhdGVfYW5udWl0eV9wYXltZW50KAogICAgLy8gICAgIGVudHJ5CiAgICAvLyApCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMzA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OTQKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY5NS02OTkKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1VSW50NjQoMCksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OTcKICAgIC8vIHBheW9mZj1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njk4CiAgICAvLyBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY5NS02OTkKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1VSW50NjQoMCksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgY2FsbHN1YiBfZW1pdF9leGVjdXRpb25fZXZlbnQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDI5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjkzCiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDMwCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDIwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc0CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9JUENCKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCAxOAogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDIzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzUtNjc2CiAgICAvLyAjIElQQ0Iga2VlcHMgcHJpbmNpcGFsIHVuY2hhbmdlZCBhbmQgb25seSByZXNldHMgdGhlIGludGVyZXN0IGJhc2UuCiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIGIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMjMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMTA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjIKICAgIC8vIGVsaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1JSRik6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgMTEKICAgID09CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDE0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjMKICAgIC8vIG5leHRfcmF0ZSA9IGVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY0CiAgICAvLyBpZiBuZXh0X3JhdGUgPT0gVUludDY0KDApOgogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDEzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjUKICAgIC8vIG5leHRfcmF0ZSA9IHNlbGYucmF0ZV9yZXNldF9uZXh0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzcgLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDUKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfbmV4dCBleGlzdHMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY2CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IG5leHRfcmF0ZQogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgZnJhbWVfZGlnIDUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDE0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY4CiAgICAvLyBpZiBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSAhPSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgOQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2OQogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPSBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZQogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgZnJhbWVfZGlnIDkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KGVudHJ5OiBieXRlcywgcGF5b2ZmOiB1aW50NjQsIHNldHRsZWRfYW1vdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpfZW1pdF9leGVjdXRpb25fZXZlbnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MDUtNzExCiAgICAvLyBkZWYgX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgKiwKICAgIC8vICAgICBlbnRyeTogdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnksCiAgICAvLyAgICAgcGF5b2ZmOiBVSW50NjQsCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ6IFVJbnQ2NCwKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDMgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE1CiAgICAvLyBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25JRAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE2CiAgICAvLyBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIGZyYW1lX2RpZyAtMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTcKICAgIC8vIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIGZyYW1lX2RpZyAtMwogICAgZXh0cmFjdCA4IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxOAogICAgLy8gc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICBmcmFtZV9kaWcgLTMKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTkKICAgIC8vIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MjIKICAgIC8vIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIGZyYW1lX2RpZyAtMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE3CiAgICAvLyBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICBpbnRjXzIgLy8gOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIyCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBnZXRieXRlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NTEKICAgIC8vIGlmIHBheW9mZiA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJueiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NTIKICAgIC8vIHJldHVybiBVSW50NjQoZW51bXMuUEFZT0ZGX1NJR05fUE9TSVRJVkUpCiAgICBpbnRjXzEgLy8gMQoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX3BheW9mZl9zaWduQDc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MjEtNzIzCiAgICAvLyBwYXlvZmZfc2lnbj1hcmM0LlVJbnQ4KAogICAgLy8gICAgIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIC8vICksCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgaW50Y18yIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MjUKICAgIC8vIGN1cnJlbmN5X2lkPXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzI2CiAgICAvLyBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTQtNzI3CiAgICAvLyBFeGVjdXRpb25FdmVudCgKICAgIC8vICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIC8vICAgICBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYXBwbGllZF9hdD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICBwYXlvZmY9cGF5b2ZmLAogICAgLy8gICAgIHBheW9mZl9zaWduPWFyYzQuVUludDgoCiAgICAvLyAgICAgICAgIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIC8vICAgICApLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PXNldHRsZWRfYW1vdW50LAogICAgLy8gICAgIGN1cnJlbmN5X2lkPXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAwCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzEzLTcyOAogICAgLy8gYXJjNC5lbWl0KAogICAgLy8gICAgIEV4ZWN1dGlvbkV2ZW50KAogICAgLy8gICAgICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgICAgIHBheW9mZj1wYXlvZmYsCiAgICAvLyAgICAgICAgIHBheW9mZl9zaWduPWFyYzQuVUludDgoCiAgICAvLyAgICAgICAgICAgICBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICAvLyAgICAgICAgICksCiAgICAvLyAgICAgICAgIHNldHRsZWRfYW1vdW50PXNldHRsZWRfYW1vdW50LAogICAgLy8gICAgICAgICBjdXJyZW5jeV9pZD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgICAgIHNlcXVlbmNlPWVudHJ5LmV2ZW50X2lkICsgVUludDY0KDEpLAogICAgLy8gICAgICkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDlhMzMyYjk1IC8vIG1ldGhvZCAiRXhlY3V0aW9uRXZlbnQodWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc1MwogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiAoVUludDY0KGVudW1zLkVWVF9JRUQpLCBVSW50NjQoZW51bXMuRVZUX1BJKSk6CiAgICBmcmFtZV9kaWcgNQogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBibnogX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2lmX2JvZHlANQogICAgZnJhbWVfZGlnIDUKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGJ6IF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pZl9lbHNlQDYKCl9lbWl0X2V4ZWN1dGlvbl9ldmVudF9pZl9ib2R5QDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NTQKICAgIC8vIHJldHVybiBVSW50NjQoZW51bXMuUEFZT0ZGX1NJR05fUE9TSVRJVkUpCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIyCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBiIF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9wYXlvZmZfc2lnbkA3CgpfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzU1CiAgICAvLyByZXR1cm4gVUludDY0KGVudW1zLlBBWU9GRl9TSUdOX05FR0FUSVZFKQogICAgcHVzaGludCAyNTUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcyMgogICAgLy8gc2VsZi5fcGF5b2ZmX3NpZ24oZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSwgcGF5b2ZmKQogICAgYiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fcGF5b2ZmX3NpZ25ANwoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9yb2xlX2lzX2FjdGl2ZShyb2xlX21hcDogYnl0ZXMsIHJvbGVfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NDoKX3JvbGVfaXNfYWN0aXZlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU3CiAgICAvLyBkZWYgX3JvbGVfaXNfYWN0aXZlKHNlbGYsIHJvbGVfbWFwOiB0eXAuUmJhY1JvbGUsIHJvbGVfYWRkcmVzczogQWNjb3VudCkgLT4gYm9vbDoKICAgIHByb3RvIDIgMQogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5CiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5LTYwCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5LTYxCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjEKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAtNjEKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgPj0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX21lcmdlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKSAtPiB2b2lkOgpfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2NQogICAgLy8gYXNzZXJ0IHNlbGYuX2lzX2FycmFuZ2VyKFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTIKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgPT0gc2VsZi5hcnJhbmdlci52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE4IC8vIDB4NTIyMzQxNzI3MjYxNmU2NzY1NzIyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgPT0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2NQogICAgLy8gYXNzZXJ0IHNlbGYuX2lzX2FycmFuZ2VyKFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpIC0+IHZvaWQ6Cl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4MwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFzc2V0X2RlZmF1bHRlZCwgZXJyLkRFRkFVTFRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQxIC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfZGVmYXVsdGVkIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIERlZmF1bHRlZAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkgLT4gdm9pZDoKX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg2CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYXNzZXRfc3VzcGVuZGVkLCBlcnIuU1VTUEVOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzMgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9zdXNwZW5kZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gU3VzcGVuZGVkIG9wZXJhdGlvbnMKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkOiB1aW50NjQpIC0+IHZvaWQ6Cl9hc3NlcnRfdmFsaWRfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OAogICAgLy8gZGVmIF9hc3NlcnRfdmFsaWRfcm9sZShzZWxmLCByb2xlX2lkOiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTAKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIHB1c2hpbnQgMjAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkxCiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgcHVzaGludCAyNQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTIKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICBwdXNoaW50IDQwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MwogICAgLy8gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgcHVzaGludCA1MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTQKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgcHVzaGludCA2MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTUKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICBwdXNoaW50IDcwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NgogICAgLy8gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgcHVzaGludCA4MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfZmFsc2VAOAoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3OgogICAgaW50Y18xIC8vIDEKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX21lcmdlQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgcmV0c3ViCgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9mYWxzZUA4OgogICAgaW50Y18wIC8vIDAKICAgIGIgX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfbWVyZ2VAOQo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" }, "byteCode": { - "approval": "DCAEAAEIICYwBBUffHUGc3RhdHVzDGV2ZW50X2N1cnNvchVvdXRzdGFuZGluZ19wcmluY2lwYWwUc2NoZWR1bGVfZW50cnlfY291bnQRZml4ZWRfcG9pbnRfc2NhbGUQYWNjcnVlZF9pbnRlcmVzdBlpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlClIjQWNjb3VudCMVbm9taW5hbF9pbnRlcmVzdF9yYXRlFHJlc2VydmVkX3VuaXRzX3RvdGFsEnJlc2VydmVkX3ByaW5jaXBhbA1jb250cmFjdF90eXBlC3RvdGFsX3VuaXRzGW5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24RcmVzZXJ2ZWRfaW50ZXJlc3QZY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleBpjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleAtSI0FycmFuZ2VyIxNzZXR0bGVtZW50X2Fzc2V0X2lkF2luaXRpYWxfZXhjaGFuZ2VfYW1vdW50DFIjQXV0aG9yaXR5IxBSI1ByaW1hcnlEZWFsZXIjEVIjQWNjb3VudE1hbmFnZXIjC1IjT2JzZXJ2ZXIjC1IjT3BEYWVtb24jFWluaXRpYWxfZXhjaGFuZ2VfZGF0ZRV0cmFuc2Zlcl9vcGVuaW5nX2RhdGUVdHJhbnNmZXJfY2xvc3VyZV9kYXRlEHJhdGVfcmVzZXRfZmxvb3IOcmF0ZV9yZXNldF9jYXACUyMKUiNUcnVzdGVlIw9hc3NldF9zdXNwZW5kZWQcZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbhFyYXRlX3Jlc2V0X3NwcmVhZBVyYXRlX3Jlc2V0X211bHRpcGxpZXIPcmF0ZV9yZXNldF9uZXh0FGhhc19yYXRlX3Jlc2V0X2Zsb29yEmhhc19yYXRlX3Jlc2V0X2NhcAEAD2Fzc2V0X2RlZmF1bHRlZA9wcm9zcGVjdHVzX2hhc2gOcHJvc3BlY3R1c191cmwVZGVub21pbmF0aW9uX2Fzc2V0X2lkDW1hdHVyaXR5X2RhdGUUZGF5X2NvdW50X2NvbnZlbnRpb24DBoEBMRhAAK0nEjIDZycZMgNnJyEiZycpImcpImcnDCJnJyqAAGcnK4AAZycsImcnEyJnJxoiZyctImcnGyJnJxwiZycuImcnDSJnJwoiZycUImcrImcnDiJnJyIiZycHImcnBiJnJwkiZycjImcnJCJnJx0iZyceImcnJSJnJyYiZycnImcnCyJnJw8iZycQImcnESJnKiJnJwQiZycFImcxNYEEEkQxNIElEkQxNxREMTYURIAEkU8E6zYaAI4BAMAxGRREMRhBAKmCFwS0RhjIBOeDJSkElDiHIwRshePuBL3RqUQEfA8YEgQU/BDvBHSnKX8ECdT+FASam/qFBIXu0z0EqywPxATZ8iWsBI6m50wEAq9VegSC9xstBO8E9dME3zQ1UAQ9voC9BB4+SOcEAQyCmQR0BqzSBBpyou42GgCOFwAbAscEIwRNBNcFyAYCBloGjQa7CK4J6ApiC9QMZwytDMUM3Q2SDigORw5SDpwAgASVbXFWNhoAjgEGmAAxGYEEEjEYEERCDI0igABHCjYaAUkVJBJEFyIpZUREiBSjiBSqiBSvIillRIEyEhREIkcCSwJLBAxBAlEiKmVEIicEZUQMQQJEIiplRIgQA0lFEYEJW0lFBjIHDUACLksPJFVJRRAkEklFB0AAEEsOgQMSQAAISw6BExJBAjYjQQILSw8iWyIqZUQSREsEMgcOREsFQAHkSw6BExJAAdwiRQ1LDyRVSUUQgQMSQAFgSw6BExJAAVgiRQhLD4ExW0UKiBCMQAD7SwlFC0sMiA9JSwiID0RLAYgPXklOAkURSYgPVUlFDUsCSwEISUUMMgoiJxNlRHAARCInD2VEIicLZURLAQhLAksBD0RPAkwJTwIPRE8DCCcPTGciJwtlRAgnC0xnIicQZURPAggnEExnIicRZUQIJxFMZ0sPJFWBAxJBAHciJwZlREsQiBAYRRIIJwZMZ4gP+EEACksPJFWBExJBAAlLD4EpWycOTGcrSwpnJwdLC2ciKmVEIwgqTGdLD1cIAYABE6hBABAiK2VEQAAJKYHIAWcnByJnSw9LB0mIEnFISwFLDghFAklLCQhFAUsCIwhFA0L+eScGImdC/5NLDyRVSUUQgQMSQQAPIitlREsICUlFC0ULQv7tSw4kEkEAEiIrZUxFC0QiJwdlTEUMREL+1EsOgRMSQAAHSwlFC0L+xSJFCiJFC0L+vIgPPkEAU0sOgRMSQQAJIitlREUIQv6UIicGZURLEIgPNkUSCElFDSInDmVED0EABiJFCEL+dSInDmVESwwJSUUKIitlRA1BAAkiK2VERQhC/llLCEUIQv5SSw+BMVsiK2VESg5ETAlFCEL+PyInBmVESxCIDuFFEghFDUL+FUsCSURLAklLA0lOAwgyB08CFk8DFlBPAhZQTwIWUEwWUChMULAjQyJC/ceAAEcCNhoBRwIVJRJENhoCSSJZgQIISwEVEkRXAgBMIillREQnCExQSb1FAUQiJxllRDIDE0EAIjEAIicZZUQSQAAVMQBLAxJAAA0xAEsBvkRXACASQQEAI0SIEbqIEb8iKWVEgTISFERLAkmIDISIDAdGAkm+REmBSVtJTgJFCEmBUVtJRQhPAghJRQZEVwAgIicTZURwAEUBQQC3Sb5EgYADU0AArSNBAHgyCiInE2VETEsBcABESwVJTgIPREsCSU4DvkRJVwAgsTIATwOyEkyyFE8CshGBBLIQsgGzSYFJW0lOAkUJSYFRW0lOA0UJIhZMSwFcSUxcUU8DTL8iJw9lRElLAg9EIicLZURLAw9ETAknD0xnIicLZURMCScLTGdLBUlLBklOAwgyB08CFk8DFlBPAhZQTBZQSwJJFRZXBgJMUEyAAgAiUExQKExQsCNDIkL/UCJC/v02GgFJFSQSRBc2GgJJFSQSRBeIEJxKDEQnG08CZyccTGcyBxYoTFCwI0M2GgFJFSUSRDYaAkkVJBJEF0lOAiIpZUREJxYxAIgQM0SIEG2IEHIiKWVEgTISRCcISwJQSU4DvUUBREyICqNJRCInCmVECCInDWVEDkQiJxplREEACTIHIicaZUQOREcCvkSBKFtLA0lOAwgWgShMuyInCmVECCcKSwFnIicNZURMCRYoTFCwI0MiSTYaAUkVJRJENhoCSRUlEkQ2GgNHAhUkEkQXIillRESID+OID+giKWVEgTISFEQiJxtlREEACSInG2VEMgcORCInHGVEQQAJMgciJxxlRAxEMQBLBElOAhJEJwhLAVBJRQhJvUUBRCcISwVJTgJQSUUJvUUBREsCiAncSYgJ2E8CE0RLAUlETL5EJVsORCIqZUQiJwRlRA9AAA4iKmVEiArogQlbMgcNREsDSYgKM0sDSU4CiAoriAmuRgKICalGAksFSb5EJVtLAklOAksBDkRLAQkWTwIlTwK7SwVJvkQlW08CCBYlTLsoSwJQsCNDNhoBSRUlEkQ2GgJJFSMSRCJTJxUxAIgOv0QnCE8CUEm9RQFESYEwI7oiTwNUgTBMuzIHFihMULAjQzYaAUkVJRJENhoCSRUlEkQnFzEAiA6HRCIpZUSByAESFESIDreIDrwnCE8CUEm9RQEURCIWTwJLAVBLAVAnKFBLAVBLAVBLAVBLAVBMUL8yBxYoTFCwI0M2GgFJFSUSRDYaAkkVJRJEJwhLAlBJvUUBRDEATwMSRIgOYYgOZiJPArsyBxYoTFCwI0M2GgFJFSUSRCcITFBJvUUBRL5IKExQsCNDNhoBSRUlEkQnEkxnMgcWKExQsCNDgABJNhoBRwIVgWsSRDYaAklOAhWBSBJENhoDSU4CSRVLASVZSYEiEkRPAkxLAlJJTgMiWYEkCBJEiA3dIlVJJwxLAWdBACJJIxJAABxJgQISQAAVSYEDEkAADkmBBBJAAAdJgQUSQQGGI0QiJwxlTEUCREsESYEhW0lFCESBOVVJRQhBAB9LBiMSQAAYSwaBAhJAABBLBoEDEkAACEsGgQQSQQFGI0RJIxNBAAhLBIGSBlMURCIpZUQURCInFGVEFERLBEkjW0lxC0UBRCcsSwFnSwGBCVtJTwISRCcTSwFnsTIAMgoishKyFEyyEYEEshCyAbNJgRFbJw1MZycKImcnLksIZ0mBKVsnGksBZ0sBgTFbJy1LAWdLBklOAoEwWycOTGcnFEsKZ0sDgZIGUyciTGdLAYEQWytMZ0sBgShbJwZMZ0sBJVsnCUxnSwGBGFsnB0xnSwOBOlsnI0xnSwOBQlsnJExnSwOBSlsnHUxnSwOBUlsnHkxnSwOBWlsnJUxnSwOBkAZTJyZMZ0sDgZEGUycnTGdPA4FjWycFTGdLASRbKkxnSwGBOFsnEExnSwGBQFsnEUxnJw8iZycLImdLAjIHDURMIltLAgxEDERLAlcAICcqTGdLAVcCACcrTGcyBxYoTFCwI0MiQv63IkL+dyKAAEcDNhoBSRUkEkQXSTYaAkkVIxJEIlNMNhoDSU4CSSJZSU4DSYFBC4ECCE8CFRJEiAvxIicMZUxOA0QiKWVEFERJgRAORCInFGVEREyBEAtMgWQLgeYLCEkyDA1BABixgQayEIEFshknL7IeJy+yHyKyAbNC/+EiRQpLCUsEDEEAjksEVwIASUUNSwpJTgKBQQuBQVhJJFVJTgJFDkkiW0lFDUsFTwQISwESREsFTwOIBzRMgQlbSUUKREEAGUsJQQAnSwkjCYFBC0sMTIFBWIEJW0sIDkRLCEAABUsKIxJESwkjCEUKQv+QSwZJRCMJFicfTFBJvUUBREkigQK6F0lEIwmBQQuBAgiBQbpC/8BLBhYnH0xQSbxISwW/SwVBAA1LAUsECCcETGcpgTJnMgcWKExQsCNDIillRESICuSICuuICvAiKmVEIicEZURLAQ1EiAZcSVcIAUmAAQGoREsBVwAISwJXCQhLA1cRCEsEVxkISwVXIQhLBlcpCEsHVzEISwhXOQhPB08IUE8HUE8GUE8FUCIWUE8EUE8DUE8CUExQiAePRgIyBxYoTFCwI0MiRwSAAEk2GgFJFSQSRBc2GgJHAhWBSRJEIillRESICluICmCBQVtJgQQaQQC2IicMZUSBBRJEiAo4IicMZURJgQUSREsCSSJbSUUHIicEZUQSRElXCAFFDCRViAXXIicEZUSBEAqAAgAARQcWJx9MUElFCb1FAUEAB0sHvkxFB0RLBUkiWUmBEAxESwNJVwkISwFXEQhLAlcZCEsDVykISwRXMQhPBVc5CEsLFksSUE8GUE8FUE8EUE8DUE8CUExQSwMWUE8CTFBMIwgWVwYCXABLCEm8SEy/IicEZUQjCCcETGciKmVESwNJTwISRIgFDklFCElXCAFFCiRVSUUGIxJAAChLBIEEEkAAIEsEgQwSQAAYSwSBCxJAABBLBIESEkAACEsEgQUSQQBBI0RLCIABAalESwSBDBJAAAhLBIELEkEAJCNBABonGDEAiAjtREsGSwKIBitGAjIHFihMULAjQ4gJC0L/6CJC/9kiQv+8IillRElEIicMZUQWSZMkDkRXBwEiJw1lRCInCmVEIicUZUQiKmVEIicEZUQiK2VEIicHZUQiJwllRCInBmVEIicQZUQiJxFlRCInD2VEIicLZURPDhZPDkxQTw0WUE8MFlBPCxZQTwoWUE8JFlBPCBZQTwcWUE8GFlBPBRZQTwQWUE8DFlBPAhZQTBZQKExQsCNDIillREQiKmVEIicEZUQPQQAlIiplRBYnKFAiFkxLAVBLAVBLAVBLAVBLAVBLAVBMUChMULAjQyIqZUSIA71C//CICCkjQzYaAUkVJRJEiAgcJxJMZzIHFihMULAjQzYaAUkVJRJEiAgEJxlMZzIHFihMULAjQzYaAUkVIxJENhoCSU4CFSUSRDYaA0lOAhWBEBJEiAfXiAfeF0cCiAfogRQSQQAOJxJLA2cyBxYoTFCwI0NJgSgSQQARJxdLA1BJvUUBFERLAr9C/99JgTISQQARJxZLA1BJvUUBFERLAr9C/8dJgTwSQQARJyBLA1BJvUUBFERLAr9C/69JgUYSQQARJxVLA1BJvUUBFERLAr9C/5dJgVASQf+QJxhLA1BJvUUBFERLAr9C/382GgFJFSMSRDYaAklOAhUlEkSIBy2IBzQXRwKIBz5JgRQTRIEoEkEAFScXSwJQSb1FAUS8SDIHFihMULAjQ0mBMhJBAA8nFksCUEm9RQFEvEhC/+FJgTwSQQAPJyBLAlBJvUUBRLxIQv/LSYFGEkEADycVSwJQSb1FAUS8SEL/tUmBUBJB/64nGEsCUEm9RQFEvEhC/582GgFJFSMSRCJTJxUxAIgGZ0QnIUxnMgcWKExQsCNDIicSZUQoTFCwI0M2GgFJFSUSRCcXSwGIBj8nFksCiAY4JyBLA4gGMScVSwSIBionGE8FiAYjJygiTwZUI08FVIECTwRUgQNPA1SBBE8CVChMULAjQzYaAUkVIxJENhoCSU4CFSUSRBdJiAY7gwYUKDI8RlBPBo4GAE8AQAAxACIAEwABACcYSwFQSb1FAUS+SChMULAjQycVSwFQSb1FAUS+SEL/6ycgSwFQSb1FAUS+SEL/3CcWSwFQSb1FAUS+SEL/zScXSwFQSb1FAUS+SEL/voAQAAAAAAAAAAAAAAAAAAAAAEL/qYoBACcIi/9QvkSBgANTFESJigECJwiL/1BJvUUBREm+SCInEGVESwGBOVsJIicRZURLAoFBWwlLAiVbIicFZURPA0sCTwKIAJgiJwVlRE8DTwNPAogAiksCgUlbSwIIFk8DTFxJSYFRW0sCCBZcUSInEGVEFlw5IicRZUQWXEEiKmVEFlwxTwNMv4mKAQAigAAnCIv/UEm9RQFEIillRIEyEkEAAYmLAr5MSU4CjABEgShbSYwBQAABiYsASSVbiwFJTgMIFlwgIhZcKIsCTL8iJwplRElLAg9ETAknCkxniYoDAYv9QQAFi/5AAAIiiYv9i/4di/+XiYoBAYv/QAACIokiJw1lRElEIicFZUSL/0xPAoj/yomKAQGL/0AAAiKJIicNZUQiJwVlRIv/TIj/r4mKAQEiJwRlRIv/DUSL/4EQChYnH0xQSb1FAUSL/4EQGEsBIoECuhdLAQ1EgUELgQIIgUG6iYoCAIv/IxJAAB+L/yQSQAAYi/+BExJAABCL/4EMEkAACIv/gQsSQQADI0SJi/5AAAQiQv/1i/6BAxJAAAiL/oECEkEAGIv/gQMSQAAIi/+BEhJBAAQjQv/RIkL/zYv+IxJBACCL/4EDEkAAEIv/gRISQAAIi/+BBRJBAAQjQv+qIkL/pov+gQQSQQAoi/+BAxJAABiL/4EEEkAAEIv/gRISQAAIi/+BBRJBAAQjQv96IkL/dov+gQUSQQAIi/+BAxJC/2YiQv9iIicMZUQjEkEACiInImVEQQACI4kiiYoBAov/gRFbSUEAECInCWVEQQAIIicHZURAAAYii/9PAokiJwdlRCInCWVEIicFZUSI/mciJwVlRIsATIj+XIv/TwKJigIBi/9AAAOL/okiJwVlRCInCWVEi/9LAoj+OwhJRCInBWVEi/5MTwKI/iuJigICIoAARwiL/iJbIiplRBJEi/6BCVsyBw5Ei/4kVUkjEklBAF0iKWVEgTISRCInCmVEIicNZUQSRIv+gTFbK0sBZycHTGeL/oEhWycJTGcnBiJni/6BKVsnDkxnIiplRCMIKkxnKYFkZ4sLRCInFGVEi/5MIogBxUmM/ov/jAGMAIkiKWVEgTISFEQiJwZlRIv+iP75jP4IJwZMZ4sKgQwSQQFji/+BIVsiJyRlRCInBWVEiP1zIicjZUQIjAYiJyZlREEAEyInHWVEiwYNQQAIIicdZUyMBkQiJydlREEAEyInHmVEiwYMQQAIIiceZUyMBkQnCYsGZ4sKgQQSQQDzi/6BMVsrSwFnJwdMZ4j+Z0EA1IsKgQUSQQCyIicFZUyMAkQijAEijAeL/oEZW0mMCEEAD4sCiwiI/pZJjAIjjAeMASIqZUQjCIwDIicEZUSLAw1BAFKLA4j9H0mMACRVSYwEgQMSQAAQiwSBExJBADOLAIEZW0EAKyNBAAiLB0EADCKMB4sDIwiMA0L/vYsAgRlbiwJMiP44SYwCiwEIjAFC/+EiQv/SiwFEIitlRIv+gTlbJBpAAAYiJwZlRAgiJwVlRIsBiPxfJw5MZyIqZUQjCCpMZ4v+IkmIAF9JjP6L/4wBjACJi/6BKVsnDkxnQv/aiwqBEhJB/xIiK2VEJwdMZ0L/B4sKgQsSQQAbi/6BIVtJjAVAAAgiJyVlTIwFRCcJiwVnQv7Pi/6BIVtJjAlB/sQnCYsJZ0L+vIoDATIIi/0iW4v9VwgBi/1XCQgyB4v9JFWL/kAARSMWSZMkDkRXBwEiJxNlRIsBSSMIiwAWTwIWUIsCUIsDUIsEFlCL/hZQTwNQi/8WUE8CFlBMFlCABJozK5VMULCL/YwAiYsFIxJAAAiLBYEEEkEABCNC/6mB/wFC/6OKAgGAAIv+i/9QSb1FAUEAH4sBvkQiWzIHSYwADkEAEIsBvkQkW4sAD0EABCOMAIkiQv/5MQAiJxJlRBJEiSInKWVEFESJIichZUQURImKAQCL/4EUEkAAMIv/gRkSQAAoi/+BKBJAACCL/4EyEkAAGIv/gTwSQAAQi/+BRhJAAAiL/4FQEkEAAyNEiSJC//o=", + "approval": "DCAFAAEIINwLJjEEFR98dQZzdGF0dXMMZXZlbnRfY3Vyc29yFHNjaGVkdWxlX2VudHJ5X2NvdW50FW91dHN0YW5kaW5nX3ByaW5jaXBhbBFmaXhlZF9wb2ludF9zY2FsZRBhY2NydWVkX2ludGVyZXN0GWludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UKUiNBY2NvdW50IxVub21pbmFsX2ludGVyZXN0X3JhdGUNY29udHJhY3RfdHlwZRRyZXNlcnZlZF91bml0c190b3RhbBJyZXNlcnZlZF9wcmluY2lwYWwLdG90YWxfdW5pdHMZbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbhFyZXNlcnZlZF9pbnRlcmVzdBljdW11bGF0aXZlX2ludGVyZXN0X2luZGV4GmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4C1IjQXJyYW5nZXIjE3NldHRsZW1lbnRfYXNzZXRfaWQXaW5pdGlhbF9leGNoYW5nZV9hbW91bnQMUiNBdXRob3JpdHkjEFIjUHJpbWFyeURlYWxlciMRUiNBY2NvdW50TWFuYWdlciMCUyMLUiNPYnNlcnZlciMLUiNPcERhZW1vbiMVaW5pdGlhbF9leGNoYW5nZV9kYXRlFXRyYW5zZmVyX29wZW5pbmdfZGF0ZRV0cmFuc2Zlcl9jbG9zdXJlX2RhdGUQcmF0ZV9yZXNldF9mbG9vcg5yYXRlX3Jlc2V0X2NhcApSI1RydXN0ZWUjD2Fzc2V0X3N1c3BlbmRlZBxkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uEXJhdGVfcmVzZXRfc3ByZWFkFXJhdGVfcmVzZXRfbXVsdGlwbGllcg9yYXRlX3Jlc2V0X25leHQUaGFzX3JhdGVfcmVzZXRfZmxvb3ISaGFzX3JhdGVfcmVzZXRfY2FwAQAPYXNzZXRfZGVmYXVsdGVkD3Byb3NwZWN0dXNfaGFzaA5wcm9zcGVjdHVzX3VybBVkZW5vbWluYXRpb25fYXNzZXRfaWQNbWF0dXJpdHlfZGF0ZRRkYXlfY291bnRfY29udmVudGlvbgMGgQECAAAxGEAArScSMgNnJxoyA2cnISJnJykiZykiZycKImcnKoAAZycrgABnJywiZycTImcnGyJnJy0iZyccImcnHSJnJy4iZycNImcnCyJnJxQiZycEImcnDiJnJyIiZycHImcnBiJnJwkiZycjImcnJCJnJx4iZycfImcnJSJnJyYiZycnImcnDCJnJw8iZycQImcnESJnKiJnKyJnJwUiZzE1gQQSRDE0gSUSRDE3FEQxNhREgASRTwTrNhoAjgEAxzEZFEQxGEEAsIIYBLRGGMgE54MlKQSUOIcjBGyF4+4EvdGpRAR8DxgSBBT8EO8EdKcpfwQJ1P4UBJqb+oUEhe7TPQSrLA/EBNnyJawEmINQWgSOpudMBAKvVXoEgvcbLQTvBPXTBN80NVAEPb6AvQQePkjnBAEMgpkEdAas0gQacqLuNhoAjhgAVgMhBH0EpwUxBiEGWwazBuYHFAkICh8KmAwEDPYNiQ3ODeYN/g6zD0kPaA9zD70AgASVbXFWNhoAjgEG8QAxGYEEEjEYEERCDa6KAgCL/oEKCIsAMgwNQQAqsYEGshCBBbIZJy+yHicvsh+L/40CAAsABLNC/9syALIBQv/1IrIBQv/viSKAAEcNNhoBSRUkEkQXIillRESIFZ6IFaWIFaoiKWVEgTISFESIEgFBAAtJgWQLIQQIIoj/jyJFBSJFDiJFDUsESwEMQQJZIiplRCIrZUQMQQJNIiplRIgQ00lFEYEJW0lFAzIHDUACN0sPJFVJRRAkEklFBEAAEEsOgQMSQAAISw6BExJBAj8jQQIUSw8iWyIqZUQSREsBMgcOREsCQAHtSw6BExJAAeUiRQtLDyRVSUUQgQMSQAFlSw6BExJAAV0iRQZLD4ExW0UIiBFbQAD+SwdFCUsKiBAZSwaIEBRLAYgQLklOAkUPSYgQJUlFC0sCSwEISUUJMgoiJxNlRHAARCInD2VEIicMZURLAQhLAksBD0RPAkwJTwIPRE8DCCcPTGciJwxlRAgnDExnIicQZURPAggnEExnIicRZUQIJxFMZ0sPJFWBAxJBAHoiJwZlREsQiBDnRRIIJwZMZ4gQx0EACksPJFWBExJBAAlLD4EpWycOTGcnBEsIZycHSwlnIiplRCMIKkxnSw9XCAGAAROoQQARIicEZURAAAkpgcgBZycHImdLD0sESYgTVEhLDUsMCEUOSwxLBwhFDUsEIwhFBUL+dycGImdC/5BLDyRVSUUQgQMSQQAQIicEZURLBglJRQlFCUL+6UsOJBJBABMiJwRlTEUJRCInB2VMRQpEQv7PSw6BExJAAAdLB0UJQv7AIkUIIkUJQv63iBAIQQBWSw6BExJBAAoiJwRlREUGQv6OIicGZURLEIgP/0USCElFCyInDmVED0EABiJFBkL+byInDmVESwoJSUUIIicEZUQNQQAKIicEZURFBkL+UUsGRQZC/kpLD4ExWyInBGVESg5ETAlFBkL+NiInBmVESxCID6dFEghFC0L+DEsESURLDklLD0lOAwgyB08CFk8DFlBPAhZQTwIWUEwWUChMULAjQyJC/b6AAEcCNhoBRwIVJRJENhoCSSJZgQIISwEVEkRXAgBMIillREQnCExQSb1FAUQiJxplRDIDE0EAIjEAIicaZUQSQAAVMQBLAxJAAA0xAEsBvkRXACASQQEAI0SIEpaIEpsiKWVEgTISFERLAkmIDUuIDM5GAkm+REmBSVtJTgJFCEmBUVtJRQhPAghJRQZEVwAgIicTZURwAEUBQQC3Sb5EgYADU0AArSNBAHgyCiInE2VETEsBcABESwVJTgIPREsCSU4DvkRJVwAgsTIATwOyEkyyFE8CshGBBLIQsgGzSYFJW0lOAkUJSYFRW0lOA0UJIhZMSwFcSUxcUU8DTL8iJw9lRElLAg9EIicMZURLAw9ETAknD0xnIicMZURMCScMTGdLBUlLBklOAwgyB08CFk8DFlBPAhZQTBZQSwJJFRZXBgJMUEyAAgAiUExQKExQsCNDIkL/UCJC/v02GgFJFSQSRBc2GgJJFSQSRBeIEXhKDEQnHE8CZycdTGcyBxYoTFCwI0M2GgFJFSUSRDYaAkkVJBJEF0lOAiIpZUREJxYxAIgRD0SIEUmIEU4iKWVEgTISRCcISwJQSU4DvUUBREyIC2pJRCInC2VECCInDWVEDkQiJxtlREEACTIHIicbZUQOREcCvkSBKFtLA0lOAwgWgShMuyInC2VECCcLSwFnIicNZURMCRYoTFCwI0MiSTYaAUkVJRJENhoCSRUlEkQ2GgNHAhUkEkQXIillRESIEL+IEMQiKWVEgTISFEQiJxxlREEACSInHGVEMgcORCInHWVEQQAJMgciJx1lRAxEMQBLBElOAhJEJwhLAVBJRQhJvUUBRCcISwVJTgJQSUUJvUUBREsCiAqjSYgKn08CE0RLAUlETL5EJVsORCIqZUQiK2VED0AADiIqZUSIC7CBCVsyBw1ESwNJiAr7SwNJTgKICvOICnZGAogKcUYCSwVJvkQlW0sCSU4CSwEOREsBCRZPAiVPArtLBUm+RCVbTwIIFiVMuyhLAlCwI0M2GgFJFSUSRDYaAkkVIxJEIlMnFTEAiA+cRCcITwJQSb1FAURJgTAjuiJPA1SBMEy7MgcWKExQsCNDNhoBSRUlEkQ2GgJJFSUSRCcXMQCID2REIillRIHIARIURIgPlIgPmScITwJQSb1FARREIhZPAksBUEsBUCcoUEsBUEsBUEsBUEsBUExQvzIHFihMULAjQzYaAUkVJRJENhoCSRUlEkQnCEsCUEm9RQFEMQBPAxJEiA8+iA9DIk8CuzIHFihMULAjQzYaAUkVJRJEJwhMUEm9RQFEvkgoTFCwI0M2GgFJFSUSRCcSTGcyBxYoTFCwI0OAAEk2GgFHAhWBaxJENhoCSU4CFYFIEkQ2GgNJTgJJFUsBJVlJgSISRE8CTEsCUklOAyJZgSQIEkSIDroiVUknCksBZ0EAIkkjEkAAHEmBAhJAABVJgQMSQAAOSYEEEkAAB0mBBRJBAYcjRCInCmVMRQJESwRJgSFbSUUIRIE5VUlFCEEAH0sGIxJAABhLBoECEkAAEEsGgQMSQAAISwaBBBJBAUcjREkjE0EACEsEgZIGUxREIillRBREIicUZUQUREsESSNbSXELRQFEJyxLAWdLAYEJW0lPAhJEJxNLAWexMgAyCiKyErIUTLIRgQSyELIBs0mBEVsnDUxnJwsiZycuSwhnSYEpWycbSwFnSwGBMVsnLUsBZ0sGSU4CgTBbJw5MZycUSwpnSwOBkgZTJyJMZ0sBgRBbJwRMZ0sBgShbJwZMZ0sBJVsnCUxnSwGBGFsnB0xnSwOBOlsnI0xnSwOBQlsnJExnSwOBSlsnHkxnSwOBUlsnH0xnSwOBWlsnJUxnSwOBkAZTJyZMZ0sDgZEGUycnTGdPA4FjWycFTGdLASRbKkxnSwGBOFsnEExnSwGBQFsnEUxnJw8iZycMImdLAjIHDURMIltLAgxEDERLAlcAICcqTGdLAVcCACcrTGcyBxYoTFCwI0MiQv62IkL+diKAAEcCNhoBSRUkEkQXSTYaAkkVIxJEIlNMNhoDSU4CSSJZSU4DSYFBC4ECCE8CFRJEiAzNIicKZUxOA0QiKWVEFERJgRAORCInFGVEREyBEAtMgWQLIQQIIoj2tiJJSwQMQQCLSwRXAgBJRQxLAUlOAoFBC4FBWEkkVUlOAkUNSSJbSUUNSwVPBAhLARJESwVPA4gIGUyBCVtJRQpEQQAXSUEAJUkjCYFBC0sLTIFBWIEJW0sIDkRLCEAABUsJIxJESSMIRQFC/5RLBklEIwkWJxhMUEm9RQFESSKBAroXSUQjCYFBC4ECCIFBukL/wUsGFicYTFBJvEhLBb9LBUEADEsBSwQIK0xnKYEyZzIHFihMULAjQyIpZUREiAvjiAvqiAvvIiplRCIrZURLAQ1EiAdHSVcIAUmAAQGoREsBVwAISwJXCQhLA1cRCEsEVxkISwVXIQhLBlcpCEsHVzEISwhXOQhPB08IUE8HUE8GUE8FUCIWUE8EUE8DUE8CUExQiAh5RgIyBxYoTFCwI0MiRwSAAEk2GgFJFSQSRBc2GgJHAhWBSRJEIillRESIC1uIC2CBQVtJgQQaQQCwIicKZUSBBRJEiAs4IicKZURJgQUSREsCSSJbSUUHIitlRBJESVcIAUUMJFWIBsIiK2VEgRAKJzBFBxYnGExQSUUJvUUBQQAHSwe+TEUHREsFSSJZSYEQDERLA0lXCQhLAVcRCEsCVxkISwNXKQhLBFcxCE8FVzkISwsWSxJQTwZQTwVQTwRQTwNQTwJQTFBLAxZQTwJMUEwjCBZXBgJcAEsISbxITL8iK2VEIwgrTGciKmVESwNJTwISRIgF/0lFCElXCAFFCiRVSUUGIxJAAChLBIEEEkAAIEsEgQwSQAAYSwSBCxJAABBLBIESEkAACEsEgQUSQQBBI0RLCIABAalESwSBDBJAAAhLBIELEkEAJCNBABonGTEAiAnzREsGSwKIBxtGAjIHFihMULAjQ4gKEUL/6CJC/9kiQv+8Ikk2GgFHAhWBQRJEIillRESICfKICfmICf4iKWVEgTISFEQiJwplRIEFEkRJIltJTgIiK2VETEsBEkRLAVcIAUlOA4ABA6hETIE5W0lOAiMaREEAEyIrZUQjCYgFIYEJW0sEgQlbDkQiK2VEgRAKJzBFBhYnGExQSUUHvUUBQQAHSwW+TEUGREsESSJZSYEQDERLBUlXCQhLAVcRCEsCVxkISwNXIQhLBFcpCE8FVzEISwoWSwpQTwZQTwVQTwRQTwNQTwJQTFBLAxZQTwJMUEwjCBZXBgJcAEsGSbxITL8iK2VEIwgrTGcyBxYoTFCwI0MiKWVESUQiJwplRBZJkyQORFcHASInDWVEIicLZUQiJxRlRCIqZUQiK2VEIicEZUQiJwdlRCInCWVEIicGZUQiJxBlRCInEWVEIicPZUQiJwxlRE8OFk8OTFBPDRZQTwwWUE8LFlBPChZQTwkWUE8IFlBPBxZQTwYWUE8FFlBPBBZQTwMWUE8CFlBMFlAoTFCwI0MiKWVERCIqZUQiK2VED0EAJSIqZUQWJyhQIhZMSwFQSwFQSwFQSwFQSwFQSwFQTFAoTFCwI0MiKmVEiAO9Qv/wiAg+I0M2GgFJFSUSRIgIMScSTGcyBxYoTFCwI0M2GgFJFSUSRIgIGScaTGcyBxYoTFCwI0M2GgFJFSMSRDYaAklOAhUlEkQ2GgNJTgIVgRASRIgH7IgH8xdHAogH/YEUEkEADicSSwNnMgcWKExQsCNDSYEoEkEAEScXSwNQSb1FARRESwK/Qv/fSYEyEkEAEScWSwNQSb1FARRESwK/Qv/HSYE8EkEAEScgSwNQSb1FARRESwK/Qv+vSYFGEkEAEScVSwNQSb1FARRESwK/Qv+XSYFQEkH/kCcZSwNQSb1FARRESwK/Qv9/NhoBSRUjEkQ2GgJJTgIVJRJEiAdCiAdJF0cCiAdTSYEUE0SBKBJBABUnF0sCUEm9RQFEvEgyBxYoTFCwI0NJgTISQQAPJxZLAlBJvUUBRLxIQv/hSYE8EkEADycgSwJQSb1FAUS8SEL/y0mBRhJBAA8nFUsCUEm9RQFEvEhC/7VJgVASQf+uJxlLAlBJvUUBRLxIQv+fNhoBSRUjEkQiUycVMQCIBnxEJyFMZzIHFihMULAjQyInEmVEKExQsCNDNhoBSRUlEkQnF0sBiAZUJxZLAogGTScgSwOIBkYnFUsEiAY/JxlPBYgGOCcoIk8GVCNPBVSBAk8EVIEDTwNUgQRPAlQoTFCwI0M2GgFJFSMSRDYaAklOAhUlEkQXSYgGUIMGFCgyPEZQTwaOBgBPAEAAMQAiABMAAQAnGUsBUEm9RQFEvkgoTFCwI0MnFUsBUEm9RQFEvkhC/+snIEsBUEm9RQFEvkhC/9wnFksBUEm9RQFEvkhC/80nF0sBUEm9RQFEvkhC/76AEAAAAAAAAAAAAAAAAAAAAABC/6mKAQAnCIv/UL5EgYADUxREiYoBAicIi/9QSb1FAURJvkgiJxBlREsBgTlbCSInEWVESwKBQVsJSwIlWyInBWVETwNLAk8CiACYIicFZURPA08DTwKIAIpLAoFJW0sCCBZPA0xcSUmBUVtLAggWXFEiJxBlRBZcOSInEWVEFlxBIiplRBZcMU8DTL+JigEAIoAAJwiL/1BJvUUBRCIpZUSBMhJBAAGJiwK+TElOAowARIEoW0mMAUAAAYmLAEklW4sBSU4DCBZcICIWXCiLAky/IicLZURJSwIPREwJJwtMZ4mKAwGL/UEABYv+QAACIomL/Yv+HYv/l4mKAQGL/0AAAiKJIicNZURJRCInBWVEi/9MTwKI/8qJigEBi/9AAAIiiSInDWVEIicFZUSL/0yI/6+JigEBIitlRIv/DUSL/4EQChYnGExQSb1FAUSL/4EQGEsBIoECuhdLAQ1EgUELgQIIgUG6iYoCAIv/IxJAAB+L/yQSQAAYi/+BExJAABCL/4EMEkAACIv/gQsSQQADI0SJi/5AAAQiQv/1i/6BAxJAAAiL/oECEkEAGIv/gQMSQAAIi/+BEhJBAAQjQv/RIkL/zYv+IxJBACCL/4EDEkAAEIv/gRISQAAIi/+BBRJBAAQjQv+qIkL/pov+gQQSQQAoi/+BAxJAABiL/4EEEkAAEIv/gRISQAAIi/+BBRJBAAQjQv96IkL/dov+gQUSQQAIi/+BAxJC/2YiQv9iIicKZUQjEkEACiInImVEQQACI4kiiYoBAov/gRFbSUEAECInCWVEQQAIIicHZURAAAYii/9PAokiJwdlRCInCWVEIicFZUSI/mgiJwVlRIsATIj+XYv/TwKJigIBi/9AAAOL/okiJwVlRCInCWVEi/9LAoj+PAhJRCInBWVEi/5MTwKI/iyJigICIoAARwiL/iJbIiplRBJEi/6BCVsyBw5Ei/4kVUkjEklBAF4iKWVEgTISRCInC2VEIicNZUQSRIv+gTFbJwRLAWcnB0xni/6BIVsnCUxnJwYiZ4v+gSlbJw5MZyIqZUQjCCpMZymBZGeLC0QiJxRlRIv+TCKIAdpJjP6L/4wBjACJIillRIEyEhREIicGZUSL/oj++Iz+CCcGTGeLCoEMEkEBeIv/gSFbIickZUQiJwVlRIj9cyInI2VECIwGIicmZURBABMiJx5lRIsGDUEACCInHmVMjAZEIicnZURBABMiJx9lRIsGDEEACCInH2VMjAZEJwmLBmeLCoEEEkEBB4v+gTFbJwRLAWcnB0xniP5lQQDniwqBBRJBAMUiK2VEIiplRAmBZAshBAgiiOvjIicFZUyMAkQijAEijAeL/oEZW0mMCEEAD4sCiwiI/oFJjAIjjAeMASIqZUQjCIwDIitlRIsDDUEAUosDiP0MSYwAJFVJjASBAxJAABCLBIETEkEAM4sAgRlbQQArI0EACIsHQQAMIowHiwMjCIwDQv++iwCBGVuLAkyI/iRJjAKLAQiMAUL/4SJC/9KLAUQiJwRlRIv+gTlbJBpAAAYiJwZlRAgiJwVlRIsBiPxLJw5MZyIqZUQjCCpMZ4v+IkmIAGBJjP6L/4wBjACJi/6BKVsnDkxnQv/aiwqBEhJB/v8iJwRlRCcHTGdC/vOLCoELEkEAG4v+gSFbSYwFQAAIIiclZUyMBUQnCYsFZ0L+uov+gSFbSYwJQf6vJwmLCWdC/qeKAwEyCIv9IluL/VcIAYv9VwkIMgeL/SRVi/5AAEUjFkmTJA5EVwcBIicTZUSLAUkjCIsAFk8CFlCLAlCLA1CLBBZQi/4WUE8DUIv/FlBPAhZQTBZQgASaMyuVTFCwi/2MAImLBSMSQAAIiwWBBBJBAAQjQv+pgf8BQv+jigIBgACL/ov/UEm9RQFBAB+LAb5EIlsyB0mMAA5BABCLAb5EJFuLAA9BAAQjjACJIkL/+TEAIicSZUQSRIkiJyllRBREiSInIWVEFESJigEAi/+BFBJAADCL/4EZEkAAKIv/gSgSQAAgi/+BMhJAABiL/4E8EkAAEIv/gUYSQAAIi/+BUBJBAAMjRIkiQv/6", "clear": "DIEBQw==" }, "compilerInfo": { diff --git a/smart_contracts/artifacts/d_asa/dasa_client.py b/smart_contracts/artifacts/d_asa/dasa_client.py index 29060a19..c3ef630a 100644 --- a/smart_contracts/artifacts/d_asa/dasa_client.py +++ b/smart_contracts/artifacts/d_asa/dasa_client.py @@ -19,7 +19,7 @@ import algokit_utils from algokit_utils import AlgorandClient as _AlgoKitAlgorandClient -_APP_SPEC_JSON = r"""{"arcs": [22, 28], "bareActions": {"call": [], "create": []}, "methods": [{"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "name": "max_event_count"}], "name": "fund_due_cashflows", "returns": {"type": "(uint64,uint64,uint64,uint64,uint64)", "struct": "CashFundingResult"}, "desc": "Reserve due ACTUS cash events into the escrow-style claim ledger.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "name": "holding_address"}, {"type": "byte[]", "name": "payment_info"}], "name": "claim_due_cashflows", "returns": {"type": "(uint64,uint64,uint64,uint64,byte[])", "struct": "CashClaimResult"}, "desc": "Withdraw the holder's already funded ACTUS cash entitlements.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "name": "open_date"}, {"type": "uint64", "name": "closure_date"}], "name": "transfer_set_schedule", "returns": {"type": "uint64"}, "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "name": "holding_address"}, {"type": "uint64", "name": "units"}], "name": "primary_distribution", "returns": {"type": "uint64"}, "desc": "Reserve units for a holder before IED finalizes issuance.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "name": "sender_holding_address"}, {"type": "address", "name": "receiver_holding_address"}, {"type": "uint64", "name": "units"}], "name": "transfer", "returns": {"type": "uint64"}, "desc": "Transfer active units after settling both counterparties to the current cursor.\nReturns the number of units moved. The ACTUS kernel no longer persists a nominal per-unit value on-chain, so transfer results are unit-based.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "bool", "desc": "Suspension status", "name": "suspended"}], "name": "account_suspension", "returns": {"type": "uint64", "desc": "Timestamp of the set account suspension status"}, "desc": "Set account suspension status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "address", "desc": "Account Payment Address", "name": "payment_address"}], "name": "account_open", "returns": {"type": "uint64", "desc": "Timestamp of the account opening"}, "desc": "Open a contract account with a new position and register its payment address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "address", "desc": "Account Payment Address", "name": "payment_address"}], "name": "account_update_payment_address", "returns": {"type": "uint64", "desc": "Timestamp of the account update"}, "desc": "Update the Payment Address of an account", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}], "name": "account_get_position", "returns": {"type": "(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64)", "desc": "Account position", "struct": "AccountPosition"}, "desc": "Get account position", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": [], "create": ["NoOp"]}, "args": [{"type": "address", "desc": "D-ASA Arranger Address", "name": "arranger"}], "name": "contract_create", "returns": {"type": "uint64", "desc": "UNIX timestamp of contract creation"}, "desc": "Create a new D-ASA contract and set the Arranger role", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64)", "desc": "Normalized ACTUS terms", "name": "terms", "struct": "NormalizedActusTerms"}, {"type": "(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "desc": "Initial kernel state (pre-IED)", "name": "initial_state", "struct": "InitialKernelState"}, {"type": "(byte[32],string)", "desc": "Prospectus (informational only)", "name": "prospectus", "struct": "Prospectus"}], "name": "contract_config", "returns": {"type": "uint64", "desc": "UNIX timestamp of contract configuration"}, "desc": "Partial contract configuration with: normalized ACTUS terms, initial kernel\nstate (pre-IED), prospectus (informational only). The contract stays inactive until all schedule pages are configured next.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "name": "schedule_page_index"}, {"type": "bool", "name": "is_last_page"}, {"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[]", "name": "schedule_page"}], "name": "contract_schedule", "returns": {"type": "uint64"}, "desc": "Upload one normalized schedule page.\nThe configuration operation is considered complete only when the last page is stored. At that point `schedule_entry_count` is finalized and the contract moves to `STATUS_PENDING_IED`.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "contract_execute_ied", "returns": {"type": "uint64"}, "desc": "Execute the first due `IED` entry and activate the contract.\n`IED` is the one non-cash event that moves the app from `STATUS_PENDING_IED` to `STATUS_ACTIVE`.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "name": "event_id"}, {"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "name": "payload", "struct": "ObservedEventRequest"}], "name": "apply_non_cash_event", "returns": {"type": "uint64"}, "desc": "Apply the next due non-cash event, optionally appending one first.\nObserved payloads are appended before execution when flagged. Rate reset events require the interest oracle because they can change the running nominal rate; other non-cash events stay arranger-controlled.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "contract_get_state", "returns": {"type": "(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "struct": "KernelState"}, "desc": "Return a readonly snapshot of the generic ACTUS kernel state.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "contract_get_next_due_event", "returns": {"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "struct": "ExecutionScheduleEntry"}, "desc": "Return the next boxed schedule entry, or a zeroed sentinel if ended.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["UpdateApplication"], "create": []}, "args": [], "name": "contract_update", "returns": {"type": "void"}, "desc": "Update D-ASA application.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "New Arranger address", "name": "new_arranger"}], "name": "rbac_rotate_arranger", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Rotate the Arranger address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Operation Daemon address", "name": "address"}], "name": "rbac_set_op_daemon", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Non-Normative: Set the Operation Daemon address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}, {"type": "(uint64,uint64)", "desc": "Role time validity", "name": "validity", "struct": "RoleValidity"}], "name": "rbac_assign_role", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Assign a role to an address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}], "name": "rbac_revoke_role", "returns": {"type": "uint64", "desc": "Timestamp of the role revocation"}, "desc": "Revoke a role from an address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Suspension status", "name": "suspended"}], "name": "rbac_contract_suspension", "returns": {"type": "uint64", "desc": "Timestamp of the set asset suspension status"}, "desc": "Set asset suspension status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "rbac_get_arranger", "returns": {"type": "address", "desc": "Arranger address"}, "desc": "Get Arranger address", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Address to get roles for", "name": "address"}], "name": "rbac_get_address_roles", "returns": {"type": "(bool,bool,bool,bool,bool)", "desc": "Roles mask: (Account Manager, Primary Dealer, Trustee, Authority, Observer)"}, "desc": "Non-normative - Get roles assigned to an address", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}], "name": "rbac_get_role_validity", "returns": {"type": "(uint64,uint64)", "desc": "Role validity", "struct": "RoleValidity"}, "desc": "Get role validity", "events": [], "readonly": true, "recommendations": {}}], "name": "DASA", "state": {"keys": {"box": {}, "global": {"arranger": {"key": "UiNBcnJhbmdlciM=", "keyType": "AVMBytes", "valueType": "address"}, "op_daemon": {"key": "UiNPcERhZW1vbiM=", "keyType": "AVMBytes", "valueType": "address"}, "asset_suspended": {"key": "YXNzZXRfc3VzcGVuZGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "asset_defaulted": {"key": "YXNzZXRfZGVmYXVsdGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "status": {"key": "c3RhdHVz", "keyType": "AVMString", "valueType": "AVMUint64"}, "contract_type": {"key": "Y29udHJhY3RfdHlwZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "prospectus_hash": {"key": "cHJvc3BlY3R1c19oYXNo", "keyType": "AVMString", "valueType": "AVMBytes"}, "prospectus_url": {"key": "cHJvc3BlY3R1c191cmw=", "keyType": "AVMString", "valueType": "AVMString"}, "denomination_asset_id": {"key": "ZGVub21pbmF0aW9uX2Fzc2V0X2lk", "keyType": "AVMString", "valueType": "AVMUint64"}, "settlement_asset_id": {"key": "c2V0dGxlbWVudF9hc3NldF9pZA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "initial_exchange_date": {"key": "aW5pdGlhbF9leGNoYW5nZV9kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "maturity_date": {"key": "bWF0dXJpdHlfZGF0ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "transfer_opening_date": {"key": "dHJhbnNmZXJfb3BlbmluZ19kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "transfer_closure_date": {"key": "dHJhbnNmZXJfY2xvc3VyZV9kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "day_count_convention": {"key": "ZGF5X2NvdW50X2NvbnZlbnRpb24=", "keyType": "AVMString", "valueType": "AVMUint64"}, "total_units": {"key": "dG90YWxfdW5pdHM=", "keyType": "AVMString", "valueType": "AVMUint64"}, "reserved_units_total": {"key": "cmVzZXJ2ZWRfdW5pdHNfdG90YWw=", "keyType": "AVMString", "valueType": "AVMUint64"}, "initial_exchange_amount": {"key": "aW5pdGlhbF9leGNoYW5nZV9hbW91bnQ=", "keyType": "AVMString", "valueType": "AVMUint64"}, "outstanding_principal": {"key": "b3V0c3RhbmRpbmdfcHJpbmNpcGFs", "keyType": "AVMString", "valueType": "AVMUint64"}, "next_principal_redemption": {"key": "bmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbg==", "keyType": "AVMString", "valueType": "AVMUint64"}, "dynamic_principal_redemption": {"key": "ZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbg==", "keyType": "AVMString", "valueType": "AVMUint64"}, "interest_calculation_base": {"key": "aW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "accrued_interest": {"key": "YWNjcnVlZF9pbnRlcmVzdA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "nominal_interest_rate": {"key": "bm9taW5hbF9pbnRlcmVzdF9yYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_spread": {"key": "cmF0ZV9yZXNldF9zcHJlYWQ=", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_multiplier": {"key": "cmF0ZV9yZXNldF9tdWx0aXBsaWVy", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_floor": {"key": "cmF0ZV9yZXNldF9mbG9vcg==", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_cap": {"key": "cmF0ZV9yZXNldF9jYXA=", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_next": {"key": "cmF0ZV9yZXNldF9uZXh0", "keyType": "AVMString", "valueType": "AVMUint64"}, "has_rate_reset_floor": {"key": "aGFzX3JhdGVfcmVzZXRfZmxvb3I=", "keyType": "AVMString", "valueType": "AVMUint64"}, "has_rate_reset_cap": {"key": "aGFzX3JhdGVfcmVzZXRfY2Fw", "keyType": "AVMString", "valueType": "AVMUint64"}, "reserved_principal": {"key": "cmVzZXJ2ZWRfcHJpbmNpcGFs", "keyType": "AVMString", "valueType": "AVMUint64"}, "reserved_interest": {"key": "cmVzZXJ2ZWRfaW50ZXJlc3Q=", "keyType": "AVMString", "valueType": "AVMUint64"}, "cumulative_interest_index": {"key": "Y3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "cumulative_principal_index": {"key": "Y3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXg=", "keyType": "AVMString", "valueType": "AVMUint64"}, "event_cursor": {"key": "ZXZlbnRfY3Vyc29y", "keyType": "AVMString", "valueType": "AVMUint64"}, "schedule_entry_count": {"key": "c2NoZWR1bGVfZW50cnlfY291bnQ=", "keyType": "AVMString", "valueType": "AVMUint64"}, "fixed_point_scale": {"key": "Zml4ZWRfcG9pbnRfc2NhbGU=", "keyType": "AVMString", "valueType": "AVMUint64"}}, "local": {}}, "maps": {"box": {"account_manager": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNBY2NvdW50TWFuYWdlciM="}, "primary_dealer": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNQcmltYXJ5RGVhbGVyIw=="}, "trustee": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNUcnVzdGVlIw=="}, "authority": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNBdXRob3JpdHkj"}, "observer": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNPYnNlcnZlciM="}, "schedule_page": {"keyType": "uint64", "valueType": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[]", "prefix": "UyM="}, "account": {"keyType": "address", "valueType": "AccountPosition", "prefix": "UiNBY2NvdW50Iw=="}}, "global": {}, "local": {}}, "schema": {"global": {"bytes": 4, "ints": 37}, "local": {"bytes": 0, "ints": 0}}}, "structs": {"AccountPosition": [{"name": "payment_address", "type": "address"}, {"name": "units", "type": "uint64"}, {"name": "reserved_units", "type": "uint64"}, {"name": "suspended", "type": "bool"}, {"name": "settled_cursor", "type": "uint64"}, {"name": "interest_checkpoint", "type": "uint64"}, {"name": "principal_checkpoint", "type": "uint64"}, {"name": "claimable_interest", "type": "uint64"}, {"name": "claimable_principal", "type": "uint64"}], "CashClaimResult": [{"name": "interest_amount", "type": "uint64"}, {"name": "principal_amount", "type": "uint64"}, {"name": "total_amount", "type": "uint64"}, {"name": "timestamp", "type": "uint64"}, {"name": "context", "type": "byte[]"}], "CashFundingResult": [{"name": "funded_interest", "type": "uint64"}, {"name": "funded_principal", "type": "uint64"}, {"name": "total_funded", "type": "uint64"}, {"name": "processed_events", "type": "uint64"}, {"name": "timestamp", "type": "uint64"}], "ExecutionScheduleEntry": [{"name": "event_id", "type": "uint64"}, {"name": "event_type", "type": "uint8"}, {"name": "scheduled_time", "type": "uint64"}, {"name": "accrual_factor", "type": "uint64"}, {"name": "redemption_accrual_factor", "type": "uint64"}, {"name": "next_nominal_interest_rate", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "next_outstanding_principal", "type": "uint64"}, {"name": "flags", "type": "uint64"}], "InitialKernelState": [{"name": "status_date", "type": "uint64"}, {"name": "event_cursor", "type": "uint64"}, {"name": "outstanding_principal", "type": "uint64"}, {"name": "interest_calculation_base", "type": "uint64"}, {"name": "nominal_interest_rate", "type": "uint64"}, {"name": "accrued_interest", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "cumulative_interest_index", "type": "uint64"}, {"name": "cumulative_principal_index", "type": "uint64"}], "KernelState": [{"name": "contract_type", "type": "uint8"}, {"name": "status", "type": "uint64"}, {"name": "total_units", "type": "uint64"}, {"name": "reserved_units_total", "type": "uint64"}, {"name": "initial_exchange_amount", "type": "uint64"}, {"name": "event_cursor", "type": "uint64"}, {"name": "schedule_entry_count", "type": "uint64"}, {"name": "outstanding_principal", "type": "uint64"}, {"name": "interest_calculation_base", "type": "uint64"}, {"name": "nominal_interest_rate", "type": "uint64"}, {"name": "accrued_interest", "type": "uint64"}, {"name": "cumulative_interest_index", "type": "uint64"}, {"name": "cumulative_principal_index", "type": "uint64"}, {"name": "reserved_interest", "type": "uint64"}, {"name": "reserved_principal", "type": "uint64"}], "NormalizedActusTerms": [{"name": "contract_type", "type": "uint8"}, {"name": "denomination_asset_id", "type": "uint64"}, {"name": "settlement_asset_id", "type": "uint64"}, {"name": "total_units", "type": "uint64"}, {"name": "notional_principal", "type": "uint64"}, {"name": "initial_exchange_amount", "type": "uint64"}, {"name": "initial_exchange_date", "type": "uint64"}, {"name": "maturity_date", "type": "uint64"}, {"name": "day_count_convention", "type": "uint8"}, {"name": "rate_reset_spread", "type": "uint64"}, {"name": "rate_reset_multiplier", "type": "uint64"}, {"name": "rate_reset_floor", "type": "uint64"}, {"name": "rate_reset_cap", "type": "uint64"}, {"name": "rate_reset_next", "type": "uint64"}, {"name": "has_rate_reset_floor", "type": "bool"}, {"name": "has_rate_reset_cap", "type": "bool"}, {"name": "dynamic_principal_redemption", "type": "bool"}, {"name": "fixed_point_scale", "type": "uint64"}], "ObservedEventRequest": [{"name": "event_id", "type": "uint64"}, {"name": "event_type", "type": "uint8"}, {"name": "scheduled_time", "type": "uint64"}, {"name": "accrual_factor", "type": "uint64"}, {"name": "redemption_accrual_factor", "type": "uint64"}, {"name": "observed_rate", "type": "uint64"}, {"name": "next_nominal_interest_rate", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "next_outstanding_principal", "type": "uint64"}, {"name": "flags", "type": "uint64"}], "Prospectus": [{"name": "hash", "type": "byte[32]"}, {"name": "url", "type": "string"}], "RoleValidity": [{"name": "role_validity_start", "type": "uint64"}, {"name": "role_validity_end", "type": "uint64"}]}, "byteCode": {"approval": "DCAEAAEIICYwBBUffHUGc3RhdHVzDGV2ZW50X2N1cnNvchVvdXRzdGFuZGluZ19wcmluY2lwYWwUc2NoZWR1bGVfZW50cnlfY291bnQRZml4ZWRfcG9pbnRfc2NhbGUQYWNjcnVlZF9pbnRlcmVzdBlpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlClIjQWNjb3VudCMVbm9taW5hbF9pbnRlcmVzdF9yYXRlFHJlc2VydmVkX3VuaXRzX3RvdGFsEnJlc2VydmVkX3ByaW5jaXBhbA1jb250cmFjdF90eXBlC3RvdGFsX3VuaXRzGW5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24RcmVzZXJ2ZWRfaW50ZXJlc3QZY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleBpjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleAtSI0FycmFuZ2VyIxNzZXR0bGVtZW50X2Fzc2V0X2lkF2luaXRpYWxfZXhjaGFuZ2VfYW1vdW50DFIjQXV0aG9yaXR5IxBSI1ByaW1hcnlEZWFsZXIjEVIjQWNjb3VudE1hbmFnZXIjC1IjT2JzZXJ2ZXIjC1IjT3BEYWVtb24jFWluaXRpYWxfZXhjaGFuZ2VfZGF0ZRV0cmFuc2Zlcl9vcGVuaW5nX2RhdGUVdHJhbnNmZXJfY2xvc3VyZV9kYXRlEHJhdGVfcmVzZXRfZmxvb3IOcmF0ZV9yZXNldF9jYXACUyMKUiNUcnVzdGVlIw9hc3NldF9zdXNwZW5kZWQcZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbhFyYXRlX3Jlc2V0X3NwcmVhZBVyYXRlX3Jlc2V0X211bHRpcGxpZXIPcmF0ZV9yZXNldF9uZXh0FGhhc19yYXRlX3Jlc2V0X2Zsb29yEmhhc19yYXRlX3Jlc2V0X2NhcAEAD2Fzc2V0X2RlZmF1bHRlZA9wcm9zcGVjdHVzX2hhc2gOcHJvc3BlY3R1c191cmwVZGVub21pbmF0aW9uX2Fzc2V0X2lkDW1hdHVyaXR5X2RhdGUUZGF5X2NvdW50X2NvbnZlbnRpb24DBoEBMRhAAK0nEjIDZycZMgNnJyEiZycpImcpImcnDCJnJyqAAGcnK4AAZycsImcnEyJnJxoiZyctImcnGyJnJxwiZycuImcnDSJnJwoiZycUImcrImcnDiJnJyIiZycHImcnBiJnJwkiZycjImcnJCJnJx0iZyceImcnJSJnJyYiZycnImcnCyJnJw8iZycQImcnESJnKiJnJwQiZycFImcxNYEEEkQxNIElEkQxNxREMTYURIAEkU8E6zYaAI4BAMAxGRREMRhBAKmCFwS0RhjIBOeDJSkElDiHIwRshePuBL3RqUQEfA8YEgQU/BDvBHSnKX8ECdT+FASam/qFBIXu0z0EqywPxATZ8iWsBI6m50wEAq9VegSC9xstBO8E9dME3zQ1UAQ9voC9BB4+SOcEAQyCmQR0BqzSBBpyou42GgCOFwAbAscEIwRNBNcFyAYCBloGjQa7CK4J6ApiC9QMZwytDMUM3Q2SDigORw5SDpwAgASVbXFWNhoAjgEGmAAxGYEEEjEYEERCDI0igABHCjYaAUkVJBJEFyIpZUREiBSjiBSqiBSvIillRIEyEhREIkcCSwJLBAxBAlEiKmVEIicEZUQMQQJEIiplRIgQA0lFEYEJW0lFBjIHDUACLksPJFVJRRAkEklFB0AAEEsOgQMSQAAISw6BExJBAjYjQQILSw8iWyIqZUQSREsEMgcOREsFQAHkSw6BExJAAdwiRQ1LDyRVSUUQgQMSQAFgSw6BExJAAVgiRQhLD4ExW0UKiBCMQAD7SwlFC0sMiA9JSwiID0RLAYgPXklOAkURSYgPVUlFDUsCSwEISUUMMgoiJxNlRHAARCInD2VEIicLZURLAQhLAksBD0RPAkwJTwIPRE8DCCcPTGciJwtlRAgnC0xnIicQZURPAggnEExnIicRZUQIJxFMZ0sPJFWBAxJBAHciJwZlREsQiBAYRRIIJwZMZ4gP+EEACksPJFWBExJBAAlLD4EpWycOTGcrSwpnJwdLC2ciKmVEIwgqTGdLD1cIAYABE6hBABAiK2VEQAAJKYHIAWcnByJnSw9LB0mIEnFISwFLDghFAklLCQhFAUsCIwhFA0L+eScGImdC/5NLDyRVSUUQgQMSQQAPIitlREsICUlFC0ULQv7tSw4kEkEAEiIrZUxFC0QiJwdlTEUMREL+1EsOgRMSQAAHSwlFC0L+xSJFCiJFC0L+vIgPPkEAU0sOgRMSQQAJIitlREUIQv6UIicGZURLEIgPNkUSCElFDSInDmVED0EABiJFCEL+dSInDmVESwwJSUUKIitlRA1BAAkiK2VERQhC/llLCEUIQv5SSw+BMVsiK2VESg5ETAlFCEL+PyInBmVESxCIDuFFEghFDUL+FUsCSURLAklLA0lOAwgyB08CFk8DFlBPAhZQTwIWUEwWUChMULAjQyJC/ceAAEcCNhoBRwIVJRJENhoCSSJZgQIISwEVEkRXAgBMIillREQnCExQSb1FAUQiJxllRDIDE0EAIjEAIicZZUQSQAAVMQBLAxJAAA0xAEsBvkRXACASQQEAI0SIEbqIEb8iKWVEgTISFERLAkmIDISIDAdGAkm+REmBSVtJTgJFCEmBUVtJRQhPAghJRQZEVwAgIicTZURwAEUBQQC3Sb5EgYADU0AArSNBAHgyCiInE2VETEsBcABESwVJTgIPREsCSU4DvkRJVwAgsTIATwOyEkyyFE8CshGBBLIQsgGzSYFJW0lOAkUJSYFRW0lOA0UJIhZMSwFcSUxcUU8DTL8iJw9lRElLAg9EIicLZURLAw9ETAknD0xnIicLZURMCScLTGdLBUlLBklOAwgyB08CFk8DFlBPAhZQTBZQSwJJFRZXBgJMUEyAAgAiUExQKExQsCNDIkL/UCJC/v02GgFJFSQSRBc2GgJJFSQSRBeIEJxKDEQnG08CZyccTGcyBxYoTFCwI0M2GgFJFSUSRDYaAkkVJBJEF0lOAiIpZUREJxYxAIgQM0SIEG2IEHIiKWVEgTISRCcISwJQSU4DvUUBREyICqNJRCInCmVECCInDWVEDkQiJxplREEACTIHIicaZUQOREcCvkSBKFtLA0lOAwgWgShMuyInCmVECCcKSwFnIicNZURMCRYoTFCwI0MiSTYaAUkVJRJENhoCSRUlEkQ2GgNHAhUkEkQXIillRESID+OID+giKWVEgTISFEQiJxtlREEACSInG2VEMgcORCInHGVEQQAJMgciJxxlRAxEMQBLBElOAhJEJwhLAVBJRQhJvUUBRCcISwVJTgJQSUUJvUUBREsCiAncSYgJ2E8CE0RLAUlETL5EJVsORCIqZUQiJwRlRA9AAA4iKmVEiArogQlbMgcNREsDSYgKM0sDSU4CiAoriAmuRgKICalGAksFSb5EJVtLAklOAksBDkRLAQkWTwIlTwK7SwVJvkQlW08CCBYlTLsoSwJQsCNDNhoBSRUlEkQ2GgJJFSMSRCJTJxUxAIgOv0QnCE8CUEm9RQFESYEwI7oiTwNUgTBMuzIHFihMULAjQzYaAUkVJRJENhoCSRUlEkQnFzEAiA6HRCIpZUSByAESFESIDreIDrwnCE8CUEm9RQEURCIWTwJLAVBLAVAnKFBLAVBLAVBLAVBLAVBMUL8yBxYoTFCwI0M2GgFJFSUSRDYaAkkVJRJEJwhLAlBJvUUBRDEATwMSRIgOYYgOZiJPArsyBxYoTFCwI0M2GgFJFSUSRCcITFBJvUUBRL5IKExQsCNDNhoBSRUlEkQnEkxnMgcWKExQsCNDgABJNhoBRwIVgWsSRDYaAklOAhWBSBJENhoDSU4CSRVLASVZSYEiEkRPAkxLAlJJTgMiWYEkCBJEiA3dIlVJJwxLAWdBACJJIxJAABxJgQISQAAVSYEDEkAADkmBBBJAAAdJgQUSQQGGI0QiJwxlTEUCREsESYEhW0lFCESBOVVJRQhBAB9LBiMSQAAYSwaBAhJAABBLBoEDEkAACEsGgQQSQQFGI0RJIxNBAAhLBIGSBlMURCIpZUQURCInFGVEFERLBEkjW0lxC0UBRCcsSwFnSwGBCVtJTwISRCcTSwFnsTIAMgoishKyFEyyEYEEshCyAbNJgRFbJw1MZycKImcnLksIZ0mBKVsnGksBZ0sBgTFbJy1LAWdLBklOAoEwWycOTGcnFEsKZ0sDgZIGUyciTGdLAYEQWytMZ0sBgShbJwZMZ0sBJVsnCUxnSwGBGFsnB0xnSwOBOlsnI0xnSwOBQlsnJExnSwOBSlsnHUxnSwOBUlsnHkxnSwOBWlsnJUxnSwOBkAZTJyZMZ0sDgZEGUycnTGdPA4FjWycFTGdLASRbKkxnSwGBOFsnEExnSwGBQFsnEUxnJw8iZycLImdLAjIHDURMIltLAgxEDERLAlcAICcqTGdLAVcCACcrTGcyBxYoTFCwI0MiQv63IkL+dyKAAEcDNhoBSRUkEkQXSTYaAkkVIxJEIlNMNhoDSU4CSSJZSU4DSYFBC4ECCE8CFRJEiAvxIicMZUxOA0QiKWVEFERJgRAORCInFGVEREyBEAtMgWQLgeYLCEkyDA1BABixgQayEIEFshknL7IeJy+yHyKyAbNC/+EiRQpLCUsEDEEAjksEVwIASUUNSwpJTgKBQQuBQVhJJFVJTgJFDkkiW0lFDUsFTwQISwESREsFTwOIBzRMgQlbSUUKREEAGUsJQQAnSwkjCYFBC0sMTIFBWIEJW0sIDkRLCEAABUsKIxJESwkjCEUKQv+QSwZJRCMJFicfTFBJvUUBREkigQK6F0lEIwmBQQuBAgiBQbpC/8BLBhYnH0xQSbxISwW/SwVBAA1LAUsECCcETGcpgTJnMgcWKExQsCNDIillRESICuSICuuICvAiKmVEIicEZURLAQ1EiAZcSVcIAUmAAQGoREsBVwAISwJXCQhLA1cRCEsEVxkISwVXIQhLBlcpCEsHVzEISwhXOQhPB08IUE8HUE8GUE8FUCIWUE8EUE8DUE8CUExQiAePRgIyBxYoTFCwI0MiRwSAAEk2GgFJFSQSRBc2GgJHAhWBSRJEIillRESICluICmCBQVtJgQQaQQC2IicMZUSBBRJEiAo4IicMZURJgQUSREsCSSJbSUUHIicEZUQSRElXCAFFDCRViAXXIicEZUSBEAqAAgAARQcWJx9MUElFCb1FAUEAB0sHvkxFB0RLBUkiWUmBEAxESwNJVwkISwFXEQhLAlcZCEsDVykISwRXMQhPBVc5CEsLFksSUE8GUE8FUE8EUE8DUE8CUExQSwMWUE8CTFBMIwgWVwYCXABLCEm8SEy/IicEZUQjCCcETGciKmVESwNJTwISRIgFDklFCElXCAFFCiRVSUUGIxJAAChLBIEEEkAAIEsEgQwSQAAYSwSBCxJAABBLBIESEkAACEsEgQUSQQBBI0RLCIABAalESwSBDBJAAAhLBIELEkEAJCNBABonGDEAiAjtREsGSwKIBitGAjIHFihMULAjQ4gJC0L/6CJC/9kiQv+8IillRElEIicMZUQWSZMkDkRXBwEiJw1lRCInCmVEIicUZUQiKmVEIicEZUQiK2VEIicHZUQiJwllRCInBmVEIicQZUQiJxFlRCInD2VEIicLZURPDhZPDkxQTw0WUE8MFlBPCxZQTwoWUE8JFlBPCBZQTwcWUE8GFlBPBRZQTwQWUE8DFlBPAhZQTBZQKExQsCNDIillREQiKmVEIicEZUQPQQAlIiplRBYnKFAiFkxLAVBLAVBLAVBLAVBLAVBLAVBMUChMULAjQyIqZUSIA71C//CICCkjQzYaAUkVJRJEiAgcJxJMZzIHFihMULAjQzYaAUkVJRJEiAgEJxlMZzIHFihMULAjQzYaAUkVIxJENhoCSU4CFSUSRDYaA0lOAhWBEBJEiAfXiAfeF0cCiAfogRQSQQAOJxJLA2cyBxYoTFCwI0NJgSgSQQARJxdLA1BJvUUBFERLAr9C/99JgTISQQARJxZLA1BJvUUBFERLAr9C/8dJgTwSQQARJyBLA1BJvUUBFERLAr9C/69JgUYSQQARJxVLA1BJvUUBFERLAr9C/5dJgVASQf+QJxhLA1BJvUUBFERLAr9C/382GgFJFSMSRDYaAklOAhUlEkSIBy2IBzQXRwKIBz5JgRQTRIEoEkEAFScXSwJQSb1FAUS8SDIHFihMULAjQ0mBMhJBAA8nFksCUEm9RQFEvEhC/+FJgTwSQQAPJyBLAlBJvUUBRLxIQv/LSYFGEkEADycVSwJQSb1FAUS8SEL/tUmBUBJB/64nGEsCUEm9RQFEvEhC/582GgFJFSMSRCJTJxUxAIgGZ0QnIUxnMgcWKExQsCNDIicSZUQoTFCwI0M2GgFJFSUSRCcXSwGIBj8nFksCiAY4JyBLA4gGMScVSwSIBionGE8FiAYjJygiTwZUI08FVIECTwRUgQNPA1SBBE8CVChMULAjQzYaAUkVIxJENhoCSU4CFSUSRBdJiAY7gwYUKDI8RlBPBo4GAE8AQAAxACIAEwABACcYSwFQSb1FAUS+SChMULAjQycVSwFQSb1FAUS+SEL/6ycgSwFQSb1FAUS+SEL/3CcWSwFQSb1FAUS+SEL/zScXSwFQSb1FAUS+SEL/voAQAAAAAAAAAAAAAAAAAAAAAEL/qYoBACcIi/9QvkSBgANTFESJigECJwiL/1BJvUUBREm+SCInEGVESwGBOVsJIicRZURLAoFBWwlLAiVbIicFZURPA0sCTwKIAJgiJwVlRE8DTwNPAogAiksCgUlbSwIIFk8DTFxJSYFRW0sCCBZcUSInEGVEFlw5IicRZUQWXEEiKmVEFlwxTwNMv4mKAQAigAAnCIv/UEm9RQFEIillRIEyEkEAAYmLAr5MSU4CjABEgShbSYwBQAABiYsASSVbiwFJTgMIFlwgIhZcKIsCTL8iJwplRElLAg9ETAknCkxniYoDAYv9QQAFi/5AAAIiiYv9i/4di/+XiYoBAYv/QAACIokiJw1lRElEIicFZUSL/0xPAoj/yomKAQGL/0AAAiKJIicNZUQiJwVlRIv/TIj/r4mKAQEiJwRlRIv/DUSL/4EQChYnH0xQSb1FAUSL/4EQGEsBIoECuhdLAQ1EgUELgQIIgUG6iYoCAIv/IxJAAB+L/yQSQAAYi/+BExJAABCL/4EMEkAACIv/gQsSQQADI0SJi/5AAAQiQv/1i/6BAxJAAAiL/oECEkEAGIv/gQMSQAAIi/+BEhJBAAQjQv/RIkL/zYv+IxJBACCL/4EDEkAAEIv/gRISQAAIi/+BBRJBAAQjQv+qIkL/pov+gQQSQQAoi/+BAxJAABiL/4EEEkAAEIv/gRISQAAIi/+BBRJBAAQjQv96IkL/dov+gQUSQQAIi/+BAxJC/2YiQv9iIicMZUQjEkEACiInImVEQQACI4kiiYoBAov/gRFbSUEAECInCWVEQQAIIicHZURAAAYii/9PAokiJwdlRCInCWVEIicFZUSI/mciJwVlRIsATIj+XIv/TwKJigIBi/9AAAOL/okiJwVlRCInCWVEi/9LAoj+OwhJRCInBWVEi/5MTwKI/iuJigICIoAARwiL/iJbIiplRBJEi/6BCVsyBw5Ei/4kVUkjEklBAF0iKWVEgTISRCInCmVEIicNZUQSRIv+gTFbK0sBZycHTGeL/oEhWycJTGcnBiJni/6BKVsnDkxnIiplRCMIKkxnKYFkZ4sLRCInFGVEi/5MIogBxUmM/ov/jAGMAIkiKWVEgTISFEQiJwZlRIv+iP75jP4IJwZMZ4sKgQwSQQFji/+BIVsiJyRlRCInBWVEiP1zIicjZUQIjAYiJyZlREEAEyInHWVEiwYNQQAIIicdZUyMBkQiJydlREEAEyInHmVEiwYMQQAIIiceZUyMBkQnCYsGZ4sKgQQSQQDzi/6BMVsrSwFnJwdMZ4j+Z0EA1IsKgQUSQQCyIicFZUyMAkQijAEijAeL/oEZW0mMCEEAD4sCiwiI/pZJjAIjjAeMASIqZUQjCIwDIicEZUSLAw1BAFKLA4j9H0mMACRVSYwEgQMSQAAQiwSBExJBADOLAIEZW0EAKyNBAAiLB0EADCKMB4sDIwiMA0L/vYsAgRlbiwJMiP44SYwCiwEIjAFC/+EiQv/SiwFEIitlRIv+gTlbJBpAAAYiJwZlRAgiJwVlRIsBiPxfJw5MZyIqZUQjCCpMZ4v+IkmIAF9JjP6L/4wBjACJi/6BKVsnDkxnQv/aiwqBEhJB/xIiK2VEJwdMZ0L/B4sKgQsSQQAbi/6BIVtJjAVAAAgiJyVlTIwFRCcJiwVnQv7Pi/6BIVtJjAlB/sQnCYsJZ0L+vIoDATIIi/0iW4v9VwgBi/1XCQgyB4v9JFWL/kAARSMWSZMkDkRXBwEiJxNlRIsBSSMIiwAWTwIWUIsCUIsDUIsEFlCL/hZQTwNQi/8WUE8CFlBMFlCABJozK5VMULCL/YwAiYsFIxJAAAiLBYEEEkEABCNC/6mB/wFC/6OKAgGAAIv+i/9QSb1FAUEAH4sBvkQiWzIHSYwADkEAEIsBvkQkW4sAD0EABCOMAIkiQv/5MQAiJxJlRBJEiSInKWVEFESJIichZUQURImKAQCL/4EUEkAAMIv/gRkSQAAoi/+BKBJAACCL/4EyEkAAGIv/gTwSQAAQi/+BRhJAAAiL/4FQEkEAAyNEiSJC//o=", "clear": "DIEBQw=="}, "desc": "Debt Algorand Standard Application.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "networks": {}, "source": {"approval": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCAzMgogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1ICJzdGF0dXMiICJldmVudF9jdXJzb3IiICJvdXRzdGFuZGluZ19wcmluY2lwYWwiICJzY2hlZHVsZV9lbnRyeV9jb3VudCIgImZpeGVkX3BvaW50X3NjYWxlIiAiYWNjcnVlZF9pbnRlcmVzdCIgImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMgIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIgInJlc2VydmVkX3VuaXRzX3RvdGFsIiAicmVzZXJ2ZWRfcHJpbmNpcGFsIiAiY29udHJhY3RfdHlwZSIgInRvdGFsX3VuaXRzIiAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIgInJlc2VydmVkX2ludGVyZXN0IiAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIgImN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IiAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMgInNldHRsZW1lbnRfYXNzZXRfaWQiICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIgMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMgMHg1MjIzNTA3MjY5NmQ2MTcyNzk0NDY1NjE2YzY1NzIyMyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMgMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzIDB4NTIyMzRmNzA0NDYxNjU2ZDZmNmUyMyAiaW5pdGlhbF9leGNoYW5nZV9kYXRlIiAidHJhbnNmZXJfb3BlbmluZ19kYXRlIiAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIiAicmF0ZV9yZXNldF9mbG9vciIgInJhdGVfcmVzZXRfY2FwIiAweDUzMjMgMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMyAiYXNzZXRfc3VzcGVuZGVkIiAiZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiIgInJhdGVfcmVzZXRfc3ByZWFkIiAicmF0ZV9yZXNldF9tdWx0aXBsaWVyIiAicmF0ZV9yZXNldF9uZXh0IiAiaGFzX3JhdGVfcmVzZXRfZmxvb3IiICJoYXNfcmF0ZV9yZXNldF9jYXAiIDB4MDAgImFzc2V0X2RlZmF1bHRlZCIgInByb3NwZWN0dXNfaGFzaCIgInByb3NwZWN0dXNfdXJsIiAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIiAibWF0dXJpdHlfZGF0ZSIgImRheV9jb3VudF9jb252ZW50aW9uIiAweDA2ODEwMQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4LTI5CiAgICAvLyAjIFJCQUMgUm9sZXMKICAgIC8vIHNlbGYuYXJyYW5nZXIgPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX0FSUkFOR0VSKQogICAgYnl0ZWMgMTggLy8gMHg1MjIzNDE3MjcyNjE2ZTY3NjU3MjIzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzAKICAgIC8vIHNlbGYub3BfZGFlbW9uID0gR2xvYmFsU3RhdGUoQWNjb3VudCgpLCBrZXk9Y3N0LlBSRUZJWF9JRF9PUF9EQUVNT04pCiAgICBieXRlYyAyNSAvLyAweDUyMjM0ZjcwNDQ2MTY1NmQ2ZjZlMjMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo0Ny00OAogICAgLy8gIyBELUFTQSBHb3Zlcm5hbmNlCiAgICAvLyBzZWxmLmFzc2V0X3N1c3BlbmRlZCA9IEZhbHNlCiAgICBieXRlYyAzMyAvLyAiYXNzZXRfc3VzcGVuZGVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NDkKICAgIC8vIHNlbGYuYXNzZXRfZGVmYXVsdGVkID0gRmFsc2UKICAgIGJ5dGVjIDQxIC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU2LTU3CiAgICAvLyAjIENvbnRyYWN0CiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMTIgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwLTYxCiAgICAvLyAjIFByb3NwZWN0dXMgKEluZm9ybWF0aW9uYWwpCiAgICAvLyBzZWxmLnByb3NwZWN0dXNfaGFzaCA9IEJ5dGVzKCkKICAgIGJ5dGVjIDQyIC8vICJwcm9zcGVjdHVzX2hhc2giCiAgICBwdXNoYnl0ZXMgMHgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MgogICAgLy8gc2VsZi5wcm9zcGVjdHVzX3VybCA9IFN0cmluZygpCiAgICBieXRlYyA0MyAvLyAicHJvc3BlY3R1c191cmwiCiAgICBwdXNoYnl0ZXMgIiIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NC02NQogICAgLy8gIyBEZW5vbWluYXRpb24KICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gQXNzZXQoKQogICAgYnl0ZWMgNDQgLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjYKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCA9IEFzc2V0KCkKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OC02OQogICAgLy8gIyBUaW1lCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgMjYgLy8gImluaXRpYWxfZXhjaGFuZ2VfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzAKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgNDUgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxCiAgICAvLyBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgMjcgLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIKICAgIC8vIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlID0gdHlwLlRpbWVTdGFtcCgpCiAgICBieXRlYyAyOCAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NC03NQogICAgLy8gIyBEYXkgQ291bnQgQ29udmVudGlvbgogICAgLy8gc2VsZi5kYXlfY291bnRfY29udmVudGlvbiA9IFVJbnQ2NCgpCiAgICBieXRlYyA0NiAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc3LTc4CiAgICAvLyAjIFVuaXRzCiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzID0gVUludDY0KCkKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPSBVSW50NjQoKQogICAgYnl0ZWMgMTAgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MS04MgogICAgLy8gIyBQcmluY2lwYWwKICAgIC8vIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPSBVSW50NjQoKQogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MwogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBVSW50NjQoKQogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NAogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gVUludDY0KCkKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NQogICAgLy8gc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gRmFsc2UKICAgIGJ5dGVjIDM0IC8vICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4Ny04OAogICAgLy8gIyBJbnRlcmVzdAogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gVUludDY0KCkKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg5CiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgPSBVSW50NjQoKQogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTEtOTIKICAgIC8vICMgSW50ZXJlc3QgUmF0ZXMKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTMKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQgPSBVSW50NjQoKQogICAgYnl0ZWMgMzUgLy8gInJhdGVfcmVzZXRfc3ByZWFkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NAogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIgPSBVSW50NjQoKQogICAgYnl0ZWMgMzYgLy8gInJhdGVfcmVzZXRfbXVsdGlwbGllciIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTUKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9mbG9vciA9IFVJbnQ2NCgpCiAgICBieXRlYyAyOSAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTYKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9jYXAgPSBVSW50NjQoKQogICAgYnl0ZWMgMzAgLy8gInJhdGVfcmVzZXRfY2FwIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NwogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X25leHQgPSBVSW50NjQoKQogICAgYnl0ZWMgMzcgLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTgKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgPSBGYWxzZQogICAgYnl0ZWMgMzggLy8gImhhc19yYXRlX3Jlc2V0X2Zsb29yIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OQogICAgLy8gc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgPSBGYWxzZQogICAgYnl0ZWMgMzkgLy8gImhhc19yYXRlX3Jlc2V0X2NhcCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAxLTEwMgogICAgLy8gIyBQcmltYXJ5IERpc3RyaWJ1dGlvbgogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgPSBVSW50NjQoKQogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAzCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0ID0gVUludDY0KCkKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA1LTEwNgogICAgLy8gIyBDdW11bGF0aXZlIFBlci1Vbml0IEZpeGVkLVBvaW50IEluZGV4ZXMKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4ID0gVUludDY0KCkKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1CiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciA9IFVJbnQ2NCgpCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNgogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA9IFVJbnQ2NCgpCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE4LTExOQogICAgLy8gIyBTY2FsaW5nCiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlID0gVUludDY0KCkKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6MjMKICAgIC8vIGFzc2VydCBUeG4uZ2xvYmFsX251bV9ieXRlX3NsaWNlID09IGNmZy5HTE9CQUxfQllURVMsIGVyci5XUk9OR19HTE9CQUxfQllURVMKICAgIHR4biBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgQnl0ZXMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjI0CiAgICAvLyBhc3NlcnQgVHhuLmdsb2JhbF9udW1fdWludCA9PSBjZmcuR0xPQkFMX1VJTlRTLCBlcnIuV1JPTkdfR0xPQkFMX1VJTlRTCiAgICB0eG4gR2xvYmFsTnVtVWludAogICAgcHVzaGludCAzNwogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgVUludHMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBhc3NlcnQgVHhuLmxvY2FsX251bV9ieXRlX3NsaWNlID09IGNmZy5MT0NBTF9CWVRFUywgZXJyLldST05HX0xPQ0FMX0JZVEVTCiAgICB0eG4gTG9jYWxOdW1CeXRlU2xpY2UKICAgICEKICAgIGFzc2VydCAvLyBXcm9uZyBMb2NhbCBCeXRlcyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6MjYKICAgIC8vIGFzc2VydCBUeG4ubG9jYWxfbnVtX3VpbnQgPT0gY2ZnLkxPQ0FMX1VJTlRTLCBlcnIuV1JPTkdfTE9DQUxfVUlOVFMKICAgIHR4biBMb2NhbE51bVVpbnQKICAgICEKICAgIGFzc2VydCAvLyBXcm9uZyBMb2NhbCBVSW50cyBhbGxvY2F0aW9uCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kX2FzYS9jb250cmFjdC5weTo4LTE4CiAgICAvLyBjbGFzcyBEQVNBKAogICAgLy8gICAgIFBheW1lbnRBZ2VudCwKICAgIC8vICAgICBUcmFuc2ZlckFnZW50LAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gICAgIGF2bV92ZXJzaW9uPTEyLAogICAgLy8gKToKICAgIHB1c2hieXRlcyAweDkxNGYwNGViIC8vIG1ldGhvZCAiY29udHJhY3RfdXBkYXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9jb250cmFjdF91cGRhdGVfcm91dGVANAoKbWFpbl9zd2l0Y2hfY2FzZV9uZXh0QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6OC0xOAogICAgLy8gY2xhc3MgREFTQSgKICAgIC8vICAgICBQYXltZW50QWdlbnQsCiAgICAvLyAgICAgVHJhbnNmZXJBZ2VudCwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBhdm1fdmVyc2lvbj0xMiwKICAgIC8vICk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBieiBtYWluX2NyZWF0ZV9Ob09wQDMxCiAgICBwdXNoYnl0ZXNzIDB4YjQ0NjE4YzggMHhlNzgzMjUyOSAweDk0Mzg4NzIzIDB4NmM4NWUzZWUgMHhiZGQxYTk0NCAweDdjMGYxODEyIDB4MTRmYzEwZWYgMHg3NGE3Mjk3ZiAweDA5ZDRmZTE0IDB4OWE5YmZhODUgMHg4NWVlZDMzZCAweGFiMmMwZmM0IDB4ZDlmMjI1YWMgMHg4ZWE2ZTc0YyAweDAyYWY1NTdhIDB4ODJmNzFiMmQgMHhlZjA0ZjVkMyAweGRmMzQzNTUwIDB4M2RiZTgwYmQgMHgxZTNlNDhlNyAweDAxMGM4Mjk5IDB4NzQwNmFjZDIgMHgxYTcyYTJlZSAvLyBtZXRob2QgImZ1bmRfZHVlX2Nhc2hmbG93cyh1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJjbGFpbV9kdWVfY2FzaGZsb3dzKGFkZHJlc3MsYnl0ZVtdKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYnl0ZVtdKSIsIG1ldGhvZCAidHJhbnNmZXJfc2V0X3NjaGVkdWxlKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbihhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInRyYW5zZmVyKGFkZHJlc3MsYWRkcmVzcyx1aW50NjQpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X3N1c3BlbnNpb24oYWRkcmVzcyxib29sKXVpbnQ2NCIsIG1ldGhvZCAiYWNjb3VudF9vcGVuKGFkZHJlc3MsYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgImFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzcyhhZGRyZXNzLGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X2dldF9wb3NpdGlvbihhZGRyZXNzKShhZGRyZXNzLHVpbnQ2NCx1aW50NjQsYm9vbCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAiY29udHJhY3RfY29uZmlnKCh1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxib29sLGJvb2wsYm9vbCx1aW50NjQpLCh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCksKGJ5dGVbMzJdLHN0cmluZykpdWludDY0IiwgbWV0aG9kICJjb250cmFjdF9zY2hlZHVsZSh1aW50NjQsYm9vbCwodWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NClbXSl1aW50NjQiLCBtZXRob2QgImNvbnRyYWN0X2V4ZWN1dGVfaWVkKCl1aW50NjQiLCBtZXRob2QgImFwcGx5X25vbl9jYXNoX2V2ZW50KHVpbnQ2NCwodWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIsIG1ldGhvZCAiY29udHJhY3RfZ2V0X3N0YXRlKCkodWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudCgpKHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJyYmFjX3JvdGF0ZV9hcnJhbmdlcihhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19zZXRfb3BfZGFlbW9uKGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX2Fzc2lnbl9yb2xlKHVpbnQ4LGFkZHJlc3MsKHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19yZXZva2Vfcm9sZSh1aW50OCxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19jb250cmFjdF9zdXNwZW5zaW9uKGJvb2wpdWludDY0IiwgbWV0aG9kICJyYmFjX2dldF9hcnJhbmdlcigpYWRkcmVzcyIsIG1ldGhvZCAicmJhY19nZXRfYWRkcmVzc19yb2xlcyhhZGRyZXNzKShib29sLGJvb2wsYm9vbCxib29sLGJvb2wpIiwgbWV0aG9kICJyYmFjX2dldF9yb2xlX3ZhbGlkaXR5KHVpbnQ4LGFkZHJlc3MpKHVpbnQ2NCx1aW50NjQpIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggZnVuZF9kdWVfY2FzaGZsb3dzIGNsYWltX2R1ZV9jYXNoZmxvd3MgdHJhbnNmZXJfc2V0X3NjaGVkdWxlIHByaW1hcnlfZGlzdHJpYnV0aW9uIHRyYW5zZmVyIGFjY291bnRfc3VzcGVuc2lvbiBhY2NvdW50X29wZW4gYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzIGFjY291bnRfZ2V0X3Bvc2l0aW9uIGNvbnRyYWN0X2NvbmZpZyBjb250cmFjdF9zY2hlZHVsZSBjb250cmFjdF9leGVjdXRlX2llZCBhcHBseV9ub25fY2FzaF9ldmVudCBjb250cmFjdF9nZXRfc3RhdGUgY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50IHJiYWNfcm90YXRlX2FycmFuZ2VyIHJiYWNfc2V0X29wX2RhZW1vbiByYmFjX2Fzc2lnbl9yb2xlIHJiYWNfcmV2b2tlX3JvbGUgcmJhY19jb250cmFjdF9zdXNwZW5zaW9uIHJiYWNfZ2V0X2FycmFuZ2VyIHJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXMgcmJhY19nZXRfcm9sZV92YWxpZGl0eQogICAgZXJyCgptYWluX2NyZWF0ZV9Ob09wQDMxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjgtMTgKICAgIC8vIGNsYXNzIERBU0EoCiAgICAvLyAgICAgUGF5bWVudEFnZW50LAogICAgLy8gICAgIFRyYW5zZmVyQWdlbnQsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyAgICAgYXZtX3ZlcnNpb249MTIsCiAgICAvLyApOgogICAgcHVzaGJ5dGVzIDB4OTU2ZDcxNTYgLy8gbWV0aG9kICJjb250cmFjdF9jcmVhdGUoYWRkcmVzcyl1aW50NjQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBjb250cmFjdF9jcmVhdGUKICAgIGVycgoKbWFpbl9jb250cmFjdF91cGRhdGVfcm91dGVANDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgNCAvLyBVcGRhdGVBcHBsaWNhdGlvbgogICAgPT0KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0CiAgICBiIGNvbnRyYWN0X3VwZGF0ZQoKCi8vIG1vZHVsZXMucGF5bWVudF9hZ2VudC5QYXltZW50QWdlbnQuZnVuZF9kdWVfY2FzaGZsb3dzW3JvdXRpbmddKCkgLT4gdm9pZDoKZnVuZF9kdWVfY2FzaGZsb3dzOgogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAxMAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQ2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NTAKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjUxCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjUyCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo1NQogICAgLy8gcHJvY2Vzc2VkX2V2ZW50cyA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo1Ni01NwogICAgLy8gZnVuZGVkX2ludGVyZXN0ID0gVUludDY0KDApCiAgICAvLyBmdW5kZWRfcHJpbmNpcGFsID0gVUludDY0KDApCiAgICBkdXBuIDIKCmZ1bmRfZHVlX2Nhc2hmbG93c193aGlsZV90b3BAMjoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2MAogICAgLy8gcHJvY2Vzc2VkX2V2ZW50cyA8IG1heF9ldmVudF9jb3VudAogICAgZGlnIDIKICAgIGRpZyA0CiAgICA8CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjAtNjEKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgPCBtYXhfZXZlbnRfY291bnQKICAgIC8vIGFuZCBzZWxmLmV2ZW50X2N1cnNvciA8IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQKICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl93aGlsZUA5CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjEKICAgIC8vIGFuZCBzZWxmLmV2ZW50X2N1cnNvciA8IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgPAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjYwLTYxCiAgICAvLyBwcm9jZXNzZWRfZXZlbnRzIDwgbWF4X2V2ZW50X2NvdW50CiAgICAvLyBhbmQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAOQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjYzCiAgICAvLyBlbnRyeSA9IHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLmV2ZW50X2N1cnNvcikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICBkdXAKICAgIGJ1cnkgMTcKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2NAogICAgLy8gaWYgZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcDoKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSA2CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDkKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2NgogICAgLy8gaWYgbm90IHNlbGYuX2V2ZW50X2lzX2Nhc2goZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSk6CiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ1cnkgMTYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM1MQogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUCksCiAgICBpbnRjXzIgLy8gOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzUwLTM1NAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfTUQpLAogICAgLy8gKQogICAgPT0KICAgIGR1cAogICAgYnVyeSA3CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfdHJ1ZUA1MAogICAgZGlnIDE0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNTIKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNTAtMzU0CiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9NRCksCiAgICAvLyApCiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX3RydWVANTAKICAgIGRpZyAxNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzUzCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX01EKSwKICAgIHB1c2hpbnQgMTkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM1MC0zNTQKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX01EKSwKICAgIC8vICkKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUA1MQoKZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfdHJ1ZUA1MDoKICAgIGludGNfMSAvLyAxCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUA1MjoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2NgogICAgLy8gaWYgbm90IHNlbGYuX2V2ZW50X2lzX2Nhc2goZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSk6CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAOQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTQ4CiAgICAvLyBhc3NlcnQgZW50cnkuZXZlbnRfaWQgPT0gc2VsZi5ldmVudF9jdXJzb3IsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgZGlnIDE1CiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGN1cnNvcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTQ5CiAgICAvLyBhc3NlcnQgZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsIGVyci5OT19EVUVfQ0FTSEZMT1cKICAgIGRpZyA0CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA8PQogICAgYXNzZXJ0IC8vIE5vIGR1ZSBjYXNoZmxvdyB0byBwYXkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQxMwogICAgLy8gaWYgZXZlbnRfdHlwZSBub3QgaW4gKFVJbnQ2NChlbnVtcy5FVlRfSVApLCBVSW50NjQoZW51bXMuRVZUX01EKSk6CiAgICBkaWcgNQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDEzCiAgICBkaWcgMTQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQxNAogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTMKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9pbnRlcmVzdF9hbW91bnRAMTQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MjYKICAgIC8vIGV2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ1cnkgMTYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQyNwogICAgLy8gaWYgZXZlbnRfdHlwZSBub3QgaW4gKFVJbnQ2NChlbnVtcy5FVlRfUFIpLCBVSW50NjQoZW51bXMuRVZUX01EKSk6CiAgICBwdXNoaW50IDMKICAgID09CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTcKICAgIGRpZyAxNAogICAgcHVzaGludCAxOQogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDI4CiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyNjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MwogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZGlnIDE1CiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnVyeSAxMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTU2CiAgICAvLyBpZiBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKToKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDI3CiAgICBkaWcgOQogICAgYnVyeSAxMQoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzY6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzItNTc0CiAgICAvLyAjIEZ1bmRpbmcgdXNlcyBwZXItdW5pdCBjdW11bGF0aXZlIGluZGljZXMgc28gZWFjaCBob2xkZXIgY2FuIHNldHRsZQogICAgLy8gIyBpbmRlcGVuZGVudGx5IGZyb20gaXRzIGN1cnJlbnQgdW5pdCBiYWxhbmNlLgogICAgLy8gaW50ZXJlc3RfaW5kZXhfZGVsdGEgPSBzZWxmLl9hbW91bnRfdG9faW5kZXhfZGVsdGEoaW50ZXJlc3RfYW1vdW50X2R1ZSkKICAgIGRpZyAxMgogICAgY2FsbHN1YiBfYW1vdW50X3RvX2luZGV4X2RlbHRhCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzUKICAgIC8vIHByaW5jaXBhbF9pbmRleF9kZWx0YSA9IHNlbGYuX2Ftb3VudF90b19pbmRleF9kZWx0YShwcmluY2lwYWxfYW1vdW50X2R1ZSkKICAgIGRpZyA4CiAgICBjYWxsc3ViIF9hbW91bnRfdG9faW5kZXhfZGVsdGEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU3NgogICAgLy8gaW50ZXJlc3RfYW1vdW50ID0gc2VsZi5faW5kZXhfZGVsdGFfdG9fYW1vdW50KGludGVyZXN0X2luZGV4X2RlbHRhKQogICAgZGlnIDEKICAgIGNhbGxzdWIgX2luZGV4X2RlbHRhX3RvX2Ftb3VudAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBidXJ5IDE3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzcKICAgIC8vIHByaW5jaXBhbF9hbW91bnQgPSBzZWxmLl9pbmRleF9kZWx0YV90b19hbW91bnQocHJpbmNpcGFsX2luZGV4X2RlbHRhKQogICAgZHVwCiAgICBjYWxsc3ViIF9pbmRleF9kZWx0YV90b19hbW91bnQKICAgIGR1cAogICAgYnVyeSAxMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTc4CiAgICAvLyByZXF1aXJlZF9hbW91bnQgPSBpbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50CiAgICBkaWcgMgogICAgZGlnIDEKICAgICsKICAgIGR1cAogICAgYnVyeSAxMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzI3CiAgICAvLyBiYWxhbmNlID0gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYXNzZXJ0IC8vIGFjY291bnQgb3B0ZWQgaW50byBhc3NldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDU2CiAgICAvLyByZXR1cm4gc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCArIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX2ludGVyZXN0IGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIGV4aXN0cwogICAgZGlnIDEKICAgICsKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcyOQogICAgLy8gYXNzZXJ0IGJhbGFuY2UgPj0gcmVzZXJ2ZWRfdG90YWwsIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBkaWcgMgogICAgZGlnIDEKICAgID49CiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcyBmb3IgdGhlIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjczMAogICAgLy8gcmV0dXJuIGJhbGFuY2UgLSByZXNlcnZlZF90b3RhbAogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICAtCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1ODAKICAgIC8vIHNlbGYuX2F2YWlsYWJsZV9zZXR0bGVtZW50X2Z1bmRzKCkgPj0gcmVxdWlyZWRfYW1vdW50CiAgICB1bmNvdmVyIDIKICAgID49CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzktNTgxCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuX2F2YWlsYWJsZV9zZXR0bGVtZW50X2Z1bmRzKCkgPj0gcmVxdWlyZWRfYW1vdW50CiAgICAvLyApLCBlcnIuTk9UX0VOT1VHSF9GVU5EUwogICAgYXNzZXJ0IC8vIE5vdCBlbm91Z2ggZnVuZHMgZm9yIHRoZSBwYXltZW50CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1ODMKICAgIC8vIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgKz0gaW50ZXJlc3RfYW1vdW50CiAgICB1bmNvdmVyIDMKICAgICsKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1ODQKICAgIC8vIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsICs9IHByaW5jaXBhbF9hbW91bnQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgICsKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTg1CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggKz0gaW50ZXJlc3RfaW5kZXhfZGVsdGEKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IGV4aXN0cwogICAgdW5jb3ZlciAyCiAgICArCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1ODYKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggKz0gcHJpbmNpcGFsX2luZGV4X2RlbHRhCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTcgLy8gImN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IGV4aXN0cwogICAgKwogICAgYnl0ZWMgMTcgLy8gImN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4NwogICAgLy8gaWYgZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSA9PSBVSW50NjQoZW51bXMuRVZUX1BSKToKICAgIGRpZyAxNQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19lbHNlX2JvZHlAMzgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4OC01ODkKICAgIC8vICMgRm9yIFBSLCB0aGUgcGVyaW9kIGludGVyZXN0IHN0YXlzIGFjY3J1ZWQgdW50aWwgYSBsYXRlciBJUCBvciBNRC4KICAgIC8vIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCArPSBzZWxmLl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KGVudHJ5KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgIGRpZyAxNgogICAgY2FsbHN1YiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudAogICAgYnVyeSAxOAogICAgKwogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzOToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5MgogICAgLy8gaWYgbm90IHNlbGYuX2lzX2R5bmFtaWNfYW5udWl0eSgpIG9yIGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkgPT0gVUludDY0KAogICAgY2FsbHN1YiBfaXNfZHluYW1pY19hbm51aXR5CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUA0MQogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTkyLTU5NAogICAgLy8gaWYgbm90IHNlbGYuX2lzX2R5bmFtaWNfYW5udWl0eSgpIG9yIGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkgPT0gVUludDY0KAogICAgLy8gICAgIGVudW1zLkVWVF9NRAogICAgLy8gKToKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0MgoKZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlANDE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTUKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IGVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGRpZyAxNQogICAgcHVzaGludCA0MQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTk2CiAgICAvLyBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9IG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBkaWcgMTAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTcKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IG5leHRfaW50ZXJlc3RfYmFzZQogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGRpZyAxMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5OAogICAgLy8gc2VsZi5ldmVudF9jdXJzb3IgKz0gVUludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAwCiAgICAvLyBpZiBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoCiAgICBkaWcgMTUKICAgIGV4dHJhY3QgOCAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MDAtNjAyCiAgICAvLyBpZiBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoCiAgICAvLyAgICAgZW51bXMuRVZUX01ECiAgICAvLyApIGFuZCBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9PSBVSW50NjQoMCk6CiAgICBwdXNoYnl0ZXMgMHgxMwogICAgYj09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0NQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAyCiAgICAvLyApIGFuZCBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9PSBVSW50NjQoMCk6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwMC02MDIKICAgIC8vIGlmIGVudHJ5LmV2ZW50X3R5cGUgPT0gYXJjNC5VSW50OCgKICAgIC8vICAgICBlbnVtcy5FVlRfTUQKICAgIC8vICkgYW5kIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID09IFVJbnQ2NCgwKToKICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0NQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAzCiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbnVtcy5TVEFUVVNfRU5ERUQpCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBwdXNoaW50IDIwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwNAogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gVUludDY0KDApCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0NToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwNi02MTAKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1pbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50LAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PWludGVyZXN0X2Ftb3VudCArIHByaW5jaXBhbF9hbW91bnQsCiAgICAvLyApCiAgICBkaWcgMTUKICAgIGRpZyA3CiAgICBkdXAKICAgIGNhbGxzdWIgX2VtaXRfZXhlY3V0aW9uX2V2ZW50CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3MAogICAgLy8gZnVuZGVkX2ludGVyZXN0ICs9IGludGVyZXN0X2Ftb3VudAogICAgZGlnIDEKICAgIGRpZyAxNAogICAgKwogICAgYnVyeSAyCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzEKICAgIC8vIGZ1bmRlZF9wcmluY2lwYWwgKz0gcHJpbmNpcGFsX2Ftb3VudAogICAgZHVwCiAgICBkaWcgOQogICAgKwogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzIKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgKz0gVUludDY0KDEpCiAgICBkaWcgMgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMwogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3Nfd2hpbGVfdG9wQDIKCmZ1bmRfZHVlX2Nhc2hmbG93c19lbHNlX2JvZHlAMzg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTEKICAgIC8vIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzOQoKZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlAMjc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTcKICAgIC8vIGV2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ1cnkgMTYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1OC01NjAKICAgIC8vICMgRHluYW1pYyBhbm51aXRpZXMgZGVyaXZlIG5leHQgc3RhdGUgZnJvbSB0aGUgcGF5bWVudCBkZWNvbXBvc2l0aW9uLAogICAgLy8gIyBub3Qgb25seSBmcm9tIHRoZSBwcmVjb21wdXRlZCBgbmV4dF8qYCBmaWVsZHMuCiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpOgogICAgcHVzaGludCAzCiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUAyOQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTYyCiAgICAvLyBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCAtIHByaW5jaXBhbF9hbW91bnRfZHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGRpZyA4CiAgICAtCiAgICBkdXAKICAgIGJ1cnkgMTEKICAgIGJ1cnkgMTEKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzYKCmZ1bmRfZHVlX2Nhc2hmbG93c19lbHNlX2JvZHlAMjk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjUKICAgIC8vIGVsaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX0lQKToKICAgIGRpZyAxNAogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDMxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjYKICAgIC8vIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgYnVyeSAxMQogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY3CiAgICAvLyBuZXh0X2ludGVyZXN0X2Jhc2UgPSBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGJ1cnkgMTIKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgZXhpc3RzCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDMxOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY4CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCk6CiAgICBkaWcgMTQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlAMzIKICAgIGRpZyA5CiAgICBidXJ5IDExCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUAzMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU2OQogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDEwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzAKICAgIC8vIG5leHRfaW50ZXJlc3RfYmFzZSA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTEKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzYKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDI5CiAgICAvLyBpZiBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKToKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzMAogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKToKICAgIGRpZyAxNAogICAgcHVzaGludCAxOQogICAgPT0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDIwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzEKICAgIC8vIHJldHVybiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBidXJ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyNgoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzIKICAgIC8vIGludGVyZXN0X2R1ZSA9IHNlbGYuYWNjcnVlZF9pbnRlcmVzdCArIHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZGlnIDE2CiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBidXJ5IDE4CiAgICArCiAgICBkdXAKICAgIGJ1cnkgMTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzMwogICAgLy8gaWYgc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIDw9IGludGVyZXN0X2R1ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIGV4aXN0cwogICAgPj0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDIyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzQKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyNgoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzUKICAgIC8vIHByaW5jaXBhbF9hbW91bnQgPSBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gLSBpbnRlcmVzdF9kdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIGV4aXN0cwogICAgZGlnIDEyCiAgICAtCiAgICBkdXAKICAgIGJ1cnkgMTAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzNgogICAgLy8gaWYgcHJpbmNpcGFsX2Ftb3VudCA+IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICA+CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDM3CiAgICAvLyByZXR1cm4gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTIKICAgIC8vIHByaW5jaXBhbF9hbW91bnRfZHVlID0gc2VsZi5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudChlbnRyeSkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnRAMjYKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDI0OgogICAgZGlnIDgKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTUyCiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyNToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ0MAogICAgLy8gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwgPD0gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGRpZyAxNQogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgZHVwMgogICAgPD0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzOS00NDEKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwgPD0gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDQyCiAgICAvLyByZXR1cm4gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgLSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgc3dhcAogICAgLQogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTIKICAgIC8vIHByaW5jaXBhbF9hbW91bnRfZHVlID0gc2VsZi5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudChlbnRyeSkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnRAMjYKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDE1CiAgICAvLyByZXR1cm4gc2VsZi5hY2NydWVkX2ludGVyZXN0ICsgc2VsZi5fZW50cnlfaW50ZXJlc3Rfc2VnbWVudChlbnRyeSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBkaWcgMTYKICAgIGNhbGxzdWIgX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQKICAgIGJ1cnkgMTgKICAgICsKICAgIGJ1cnkgMTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MQogICAgLy8gaW50ZXJlc3RfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X2ludGVyZXN0X2Ftb3VudChlbnRyeSkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X2ludGVyZXN0X2Ftb3VudEAxNAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDk6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzQKICAgIC8vIGFzc2VydCBwcm9jZXNzZWRfZXZlbnRzID4gVUludDY0KDApLCBlcnIuTk9fRFVFX0NBU0hGTE9XCiAgICBkaWcgMgogICAgZHVwCiAgICBhc3NlcnQgLy8gTm8gZHVlIGNhc2hmbG93IHRvIHBheQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojc4CiAgICAvLyB0b3RhbF9mdW5kZWQ9ZnVuZGVkX2ludGVyZXN0ICsgZnVuZGVkX3ByaW5jaXBhbCwKICAgIGRpZyAyCiAgICBkdXAKICAgIGRpZyAzCiAgICBkdXAKICAgIGNvdmVyIDMKICAgICsKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4MAogICAgLy8gdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojc1LTgxCiAgICAvLyByZXR1cm4gdHlwLkNhc2hGdW5kaW5nUmVzdWx0KAogICAgLy8gICAgIGZ1bmRlZF9pbnRlcmVzdD1mdW5kZWRfaW50ZXJlc3QsCiAgICAvLyAgICAgZnVuZGVkX3ByaW5jaXBhbD1mdW5kZWRfcHJpbmNpcGFsLAogICAgLy8gICAgIHRvdGFsX2Z1bmRlZD1mdW5kZWRfaW50ZXJlc3QgKyBmdW5kZWRfcHJpbmNpcGFsLAogICAgLy8gICAgIHByb2Nlc3NlZF9ldmVudHM9cHJvY2Vzc2VkX2V2ZW50cywKICAgIC8vICAgICB0aW1lc3RhbXA9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQ2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX2ZhbHNlQDUxOgogICAgaW50Y18wIC8vIDAKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfbWVyZ2VANTIKCgovLyBtb2R1bGVzLnBheW1lbnRfYWdlbnQuUGF5bWVudEFnZW50LmNsYWltX2R1ZV9jYXNoZmxvd3Nbcm91dGluZ10oKSAtPiB2b2lkOgpjbGFpbV9kdWVfY2FzaGZsb3dzOgogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDIKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE0CiAgICAvLyBpZiBzZWxmLm9wX2RhZW1vbi52YWx1ZSAhPSBHbG9iYWwuemVyb19hZGRyZXNzOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI1IC8vIDB4NTIyMzRmNzA0NDYxNjU2ZDZmNmUyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wX2RhZW1vbiBleGlzdHMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE2CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjUgLy8gMHg1MjIzNGY3MDQ0NjE2NTZkNmY2ZTIzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BfZGFlbW9uIGV4aXN0cwogICAgPT0KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNi0xOAogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICBibnogY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX3RydWVAMTQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNwogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIHR4biBTZW5kZXIKICAgIGRpZyAzCiAgICA9PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE2LTE4CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIGJueiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfdHJ1ZUAxNAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE4CiAgICAvLyBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgdHhuIFNlbmRlcgogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgMzIKICAgID09CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTYtMTgKICAgIC8vIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICAvLyBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgYnogY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX2ZhbHNlQDE1CgpjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfdHJ1ZUAxNDoKICAgIGludGNfMSAvLyAxCgpjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfbWVyZ2VAMTY6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTUtMTkKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgLy8gICAgIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICAvLyAgICAgb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIC8vICksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAoKY2xhaW1fZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE3OgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojk0CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojk1CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5OAogICAgLy8gc2VsZi5fZW5zdXJlX3VuaXRzX2FjdGl2YXRlZChob2xkaW5nX2FkZHJlc3MpCiAgICBkaWcgMgogICAgZHVwCiAgICBjYWxsc3ViIF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6OTkKICAgIC8vIHNlbGYuX3NldHRsZV9wb3NpdGlvbihob2xkaW5nX2FkZHJlc3MpCiAgICBjYWxsc3ViIF9zZXR0bGVfcG9zaXRpb24KICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExNwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY2xhaW1hYmxlX2ludGVyZXN0CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBkdXAKICAgIHB1c2hpbnQgNzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExOAogICAgLy8gKyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jbGFpbWFibGVfcHJpbmNpcGFsCiAgICBkdXAKICAgIHB1c2hpbnQgODEKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExNy0xMTgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNsYWltYWJsZV9pbnRlcmVzdAogICAgLy8gKyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jbGFpbWFibGVfcHJpbmNpcGFsCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTAxCiAgICAvLyBhc3NlcnQgdG90YWxfYW1vdW50ID4gVUludDY0KDApLCBlcnIuTk9fRFVFX0NBU0hGTE9XCiAgICBhc3NlcnQgLy8gTm8gZHVlIGNhc2hmbG93IHRvIHBheQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MuaXNfb3B0ZWRfaW4oCiAgICBleHRyYWN0IDAgMzIKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNQogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNC0yNgogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLmlzX29wdGVkX2luKAogICAgLy8gICAgIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZAogICAgLy8gKQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNC0yNwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLmlzX29wdGVkX2luKAogICAgLy8gICAgIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZAogICAgLy8gKQogICAgLy8gYW5kIG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQKICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAyNAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI3CiAgICAvLyBhbmQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCAzODQKICAgIGdldGJpdAogICAgYm56IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAyNAogICAgaW50Y18xIC8vIDEKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUAyNToKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMDYKICAgIC8vIGlmIHNlbGYuX2lzX3BheW1lbnRfZXhlY3V0YWJsZShob2xkaW5nX2FkZHJlc3MpOgogICAgYnogY2xhaW1fZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozMwogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIHN3YXAKICAgIGRpZyAxCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozMy0zNAogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIC8vID49IHBheW1lbnRfYW1vdW50CiAgICBkaWcgNQogICAgZHVwCiAgICBjb3ZlciAyCiAgICA+PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjMyLTM1CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICAvLyAgICAgPj0gcGF5bWVudF9hbW91bnQKICAgIC8vICksIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcyBmb3IgdGhlIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMDgKICAgIC8vIHNlbGYuX3BheShzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MsIHRvdGFsX2Ftb3VudCkKICAgIGRpZyAyCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBkdXAKICAgIGV4dHJhY3QgMCAzMgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjM5LTQ0CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9cmVjZWl2ZXIsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWFtb3VudCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQzCiAgICAvLyBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgdW5jb3ZlciAzCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIHVuY292ZXIgMgogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozOQogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgcHVzaGludCA0IC8vIGF4ZmVyCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjM5LTQ0CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9cmVjZWl2ZXIsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWFtb3VudCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMjUtMTI2CiAgICAvLyAjIEdldCB0aGUgY2xhaW1hYmxlIGFtb3VudHMgYmVmb3JlIHJlc2V0CiAgICAvLyBpbnRlcmVzdF9hbW91bnQgPSBwb3NpdGlvbi5jbGFpbWFibGVfaW50ZXJlc3QKICAgIGR1cAogICAgcHVzaGludCA3MwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSA5CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTI3CiAgICAvLyBwcmluY2lwYWxfYW1vdW50ID0gcG9zaXRpb24uY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgZHVwCiAgICBwdXNoaW50IDgxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAzCiAgICBidXJ5IDkKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMjktMTMwCiAgICAvLyAjIFJlc2V0IHRoZSBwb3NpdGlvbidzIGNsYWltYWJsZSBhbW91bnRzCiAgICAvLyBwb3NpdGlvbi5jbGFpbWFibGVfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBpdG9iCiAgICBzd2FwCiAgICBkaWcgMQogICAgcmVwbGFjZTIgNzMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzEKICAgIC8vIHBvc2l0aW9uLmNsYWltYWJsZV9wcmluY2lwYWwgPSBVSW50NjQoMCkKICAgIHN3YXAKICAgIHJlcGxhY2UyIDgxCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTMyCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHBvc2l0aW9uLmNvcHkoKQogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTM0CiAgICAvLyBhc3NlcnQgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCA+PSBpbnRlcmVzdF9hbW91bnQsIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX2ludGVyZXN0IGV4aXN0cwogICAgZHVwCiAgICBkaWcgMgogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzNQogICAgLy8gYXNzZXJ0IHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsID49IHByaW5jaXBhbF9hbW91bnQsIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICBkaWcgMwogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzNy0xMzgKICAgIC8vICMgVXBkYXRlIHRoZSBnbG9iYWwgcmVzZXJ2ZWQgaW50ZXJlc3QgYW5kIHByaW5jaXBhbCBhbW91bnRzCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0IC09IGludGVyZXN0X2Ftb3VudAogICAgc3dhcAogICAgLQogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzkKICAgIC8vIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIC09IHByaW5jaXBhbF9hbW91bnQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIHN3YXAKICAgIC0KICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKY2xhaW1fZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTE0CiAgICAvLyB0b3RhbF9hbW91bnQ9aW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudCwKICAgIGRpZyA1CiAgICBkdXAKICAgIGRpZyA2CiAgICBkdXAKICAgIGNvdmVyIDMKICAgICsKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMTUKICAgIC8vIHRpbWVzdGFtcD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMTEtMTE3CiAgICAvLyByZXR1cm4gdHlwLkNhc2hDbGFpbVJlc3VsdCgKICAgIC8vICAgICBpbnRlcmVzdF9hbW91bnQ9aW50ZXJlc3RfYW1vdW50LAogICAgLy8gICAgIHByaW5jaXBhbF9hbW91bnQ9cHJpbmNpcGFsX2Ftb3VudCwKICAgIC8vICAgICB0b3RhbF9hbW91bnQ9aW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudCwKICAgIC8vICAgICB0aW1lc3RhbXA9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgY29udGV4dD1wYXltZW50X2luZm8sCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgMgogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIHB1c2hieXRlcyAweDAwMjIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX2ZhbHNlQDI0OgogICAgaW50Y18wIC8vIDAKICAgIGIgY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDI1CgpjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VAMTU6CiAgICBpbnRjXzAgLy8gMAogICAgYiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfbWVyZ2VAMTYKCgovLyBtb2R1bGVzLnRyYW5zZmVyX2FnZW50LlRyYW5zZmVyQWdlbnQudHJhbnNmZXJfc2V0X3NjaGVkdWxlW3JvdXRpbmddKCkgLT4gdm9pZDoKdHJhbnNmZXJfc2V0X3NjaGVkdWxlOgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjI2CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MjcKICAgIC8vIGFzc2VydCBvcGVuX2RhdGUgPCBjbG9zdXJlX2RhdGUsIGVyci5JTlZBTElEX1NPUlRJTkcKICAgIGR1cDIKICAgIDwKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBtdXN0IGJlIHNvcnRlZCBpbiBzdHJpY3RseSBhc2NlbmRpbmcgb3JkZXIKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MjkKICAgIC8vIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlID0gb3Blbl9kYXRlCiAgICBieXRlYyAyNyAvLyAidHJhbnNmZXJfb3BlbmluZ19kYXRlIgogICAgdW5jb3ZlciAyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTozMAogICAgLy8gc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGUgPSBjbG9zdXJlX2RhdGUKICAgIGJ5dGVjIDI4IC8vICJ0cmFuc2Zlcl9jbG9zdXJlX2RhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTozMQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnRyYW5zZmVyX2FnZW50LlRyYW5zZmVyQWdlbnQucHJpbWFyeV9kaXN0cmlidXRpb25bcm91dGluZ10oKSAtPiB2b2lkOgpwcmltYXJ5X2Rpc3RyaWJ1dGlvbjoKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzEKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnByaW1hcnlfZGVhbGVyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjIgLy8gMHg1MjIzNTA3MjY5NmQ2MTcyNzk0NDY1NjE2YzY1NzIyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo0MwogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDQKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo0NQogICAgLy8gYXNzZXJ0IHNlbGYuX3N0YXR1c19pc19wZW5kaW5nX2llZCgpLCBlcnIuUFJJTUFSWV9ESVNUUklCVVRJT05fQ0xPU0VECiAgICBhc3NlcnQgLy8gUHJpbWFyeSBkaXN0cmlidXRpb24gaXMgY2xvc2VkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBjb3ZlciAzCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQ3CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKGhvbGRpbmdfYWRkcmVzcykKICAgIHN3YXAKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDgKICAgIC8vIGFzc2VydCB1bml0cyA+IFVJbnQ2NCgwKSwgZXJyLlpFUk9fVU5JVFMKICAgIGR1cAogICAgYXNzZXJ0IC8vIENhbiBub3QgZGlzdHJpYnV0ZSB6ZXJvIHVuaXRzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjUwCiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsICsgdW5pdHMgPD0gc2VsZi50b3RhbF91bml0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCBleGlzdHMKICAgICsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICA8PQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo0OS01MQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsICsgdW5pdHMgPD0gc2VsZi50b3RhbF91bml0cwogICAgLy8gKSwgZXJyLk9WRVJfRElTVFJJQlVUSU9OCiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IHJlbWFpbmluZyBELUFTQSB1bml0cwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo1MgogICAgLy8gaWYgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjYgLy8gImluaXRpYWxfZXhjaGFuZ2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGUgZXhpc3RzCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NTQKICAgIC8vIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDw9IHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjYgLy8gImluaXRpYWxfZXhjaGFuZ2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGUgZXhpc3RzCiAgICA8PQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo1My01NQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8PSBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZQogICAgLy8gKSwgZXJyLlBSSU1BUllfRElTVFJJQlVUSU9OX0NMT1NFRAogICAgYXNzZXJ0IC8vIFByaW1hcnkgZGlzdHJpYnV0aW9uIGlzIGNsb3NlZAoKcHJpbWFyeV9kaXN0cmlidXRpb25fYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE0OAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucmVzZXJ2ZWRfdW5pdHMgKz0gdW5pdHMKICAgIGR1cG4gMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHB1c2hpbnQgNDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMwogICAgZHVwCiAgICBjb3ZlciAzCiAgICArCiAgICBpdG9iCiAgICBwdXNoaW50IDQwCiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo1OAogICAgLy8gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCArPSB1bml0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCBleGlzdHMKICAgICsKICAgIGJ5dGVjIDEwIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo1OQogICAgLy8gcmV0dXJuIHNlbGYudG90YWxfdW5pdHMgLSBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgc3dhcAogICAgLQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTozMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy50cmFuc2Zlcl9hZ2VudC5UcmFuc2ZlckFnZW50LnRyYW5zZmVyW3JvdXRpbmddKCkgLT4gdm9pZDoKdHJhbnNmZXI6CiAgICBpbnRjXzAgLy8gMAogICAgZHVwCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXBuIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo3NQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NzYKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQ3CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuX3N0YXR1c19pc19wZW5kaW5nX2llZCgpLCBlcnIuUEVORElOR19JRUQKICAgICEKICAgIGFzc2VydCAvLyBJRUQgbm90IHlldCBleGVjdXRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxMwogICAgLy8gaWYgc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjcgLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICBieiB0cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTUKICAgIC8vIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjcgLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNC0xNgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gKSwgZXJyLkNMT1NFRF9UUkFOU0ZFUgogICAgYXNzZXJ0IC8vIFRyYW5zZmVyIGlzIGNsb3NlZAoKdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNwogICAgLy8gaWYgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjggLy8gInRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICBieiB0cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTkKICAgIC8vIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDwgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGUKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyOCAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIDwKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTgtMjAKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZQogICAgLy8gKSwgZXJyLkNMT1NFRF9UUkFOU0ZFUgogICAgYXNzZXJ0IC8vIFRyYW5zZmVyIGlzIGNsb3NlZAoKdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4MAogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gc2VuZGVyX2hvbGRpbmdfYWRkcmVzcywgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA4CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIGJ5dGVjIDggLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQyMwogICAgZGlnIDUKICAgIGR1cAogICAgY292ZXIgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgOQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4MwogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChzZW5kZXJfaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDIKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODQKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQocmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzKQogICAgZHVwCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojg1CiAgICAvLyBhc3NlcnQgc2VuZGVyX2hvbGRpbmdfYWRkcmVzcyAhPSByZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3MsIGVyci5TRUxGX1RSQU5TRkVSCiAgICB1bmNvdmVyIDIKICAgICE9CiAgICBhc3NlcnQgLy8gU2VuZGVyIGFuZCByZWNlaXZlciBtdXN0IGJlIGRpZmZlcmVudAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4NgogICAgLy8gYXNzZXJ0IHVuaXRzID4gVUludDY0KDApLCBlcnIuTlVMTF9UUkFOU0ZFUgogICAgZGlnIDEKICAgIGR1cAogICAgYXNzZXJ0IC8vIFRyYW5zZmVyIHVuaXRzIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODcKICAgIC8vIGFzc2VydCB1bml0cyA8PSBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMsIGVyci5PVkVSX1RSQU5TRkVSCiAgICBzd2FwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgPD0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgc2VuZGVyIHVuaXRzIHRvIHRyYW5zZmVyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NTYKICAgIC8vIGlmIHNlbGYuZXZlbnRfY3Vyc29yID49IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQ6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgID49CiAgICBibnogdHJhbnNmZXJfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYXNzZXJ0X25vX2R1ZV9ldmVudF9wZW5kaW5nQDEwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NTgKICAgIC8vIG5leHRfZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoc2VsZi5ldmVudF9jdXJzb3IpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzYwCiAgICAvLyBuZXh0X2VudHJ5LnNjaGVkdWxlZF90aW1lID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgID4KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc1OS03NjEKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgbmV4dF9lbnRyeS5zY2hlZHVsZWRfdGltZSA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyApLCBlcnIuUEVORElOR19BQ1RVU19FVkVOVAogICAgYXNzZXJ0IC8vIEFDVFVTIGV2ZW50IG5vdCB5ZXQgZXhlY3V0ZWQKCnRyYW5zZmVyX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Fzc2VydF9ub19kdWVfZXZlbnRfcGVuZGluZ0AxMDoKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6OTAKICAgIC8vIHNlbGYuX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQoc2VuZGVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGRpZyAzCiAgICBkdXAKICAgIGNhbGxzdWIgX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6OTEKICAgIC8vIHNlbGYuX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQocmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgY2FsbHN1YiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo5MgogICAgLy8gc2VsZi5fc2V0dGxlX3Bvc2l0aW9uKHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBjYWxsc3ViIF9zZXR0bGVfcG9zaXRpb24KICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo5MwogICAgLy8gc2VsZi5fc2V0dGxlX3Bvc2l0aW9uKHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGNhbGxzdWIgX3NldHRsZV9wb3NpdGlvbgogICAgcG9wbiAyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTUyCiAgICAvLyBhc3NlcnQgdW5pdHMgPD0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMsIGVyci5PVkVSX1RSQU5TRkVSCiAgICBkaWcgNQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgZGlnIDEKICAgIDw9CiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IHNlbmRlciB1bml0cyB0byB0cmFuc2ZlcgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE1MwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMgLT0gdW5pdHMKICAgIGRpZyAxCiAgICAtCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGludGNfMyAvLyAzMgogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE0NAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMgKz0gdW5pdHMKICAgIGRpZyA1CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICB1bmNvdmVyIDIKICAgICsKICAgIGl0b2IKICAgIGludGNfMyAvLyAzMgogICAgc3dhcAogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBkaWcgMgogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5hY2NvdW50X3N1c3BlbnNpb25bcm91dGluZ10oKSAtPiB2b2lkOgphY2NvdW50X3N1c3BlbnNpb246CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTY1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo3NwogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYXV0aG9yaXR5LCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjEgLy8gMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTg1CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGR1cAogICAgcHVzaGludCA0OAogICAgaW50Y18xIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIHB1c2hpbnQgNDgKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTg2CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfb3Blbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfb3BlbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2OAogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjMgLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQ0ZDYxNmU2MTY3NjU3MjIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzkKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0VOREVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDIwMAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTAKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX2VuZGVkKCksIGVyci5VTkFVVEhPUklaRUQKICAgICEKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxMQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTIKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjEzCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzQKICAgIC8vIHVuaXRzPVVJbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzItNDIKICAgIC8vIHJldHVybiB0eXAuQWNjb3VudFBvc2l0aW9uKAogICAgLy8gICAgIHBheW1lbnRfYWRkcmVzcz1wYXltZW50X2FkZHJlc3MsCiAgICAvLyAgICAgdW5pdHM9VUludDY0KDApLAogICAgLy8gICAgIHJlc2VydmVkX3VuaXRzPVVJbnQ2NCgwKSwKICAgIC8vICAgICBzdXNwZW5kZWQ9RmFsc2UsCiAgICAvLyAgICAgc2V0dGxlZF9jdXJzb3I9VUludDY0KDApLAogICAgLy8gICAgIGludGVyZXN0X2NoZWNrcG9pbnQ9VUludDY0KDApLAogICAgLy8gICAgIHByaW5jaXBhbF9jaGVja3BvaW50PVVJbnQ2NCgwKSwKICAgIC8vICAgICBjbGFpbWFibGVfaW50ZXJlc3Q9VUludDY0KDApLAogICAgLy8gICAgIGNsYWltYWJsZV9wcmluY2lwYWw9VUludDY0KDApLAogICAgLy8gKQogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBieXRlYyA0MCAvLyAweDAwCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxNAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSBzZWxmLl9uZXdfYWNjb3VudF9wb3NpdGlvbihwYXltZW50X2FkZHJlc3MpCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjE1CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzczoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMzgKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcywgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgdW5jb3ZlciAzCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjM5CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0MAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDEKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcyA9IHBheW1lbnRfYWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDIKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF9nZXRfcG9zaXRpb25bcm91dGluZ10oKSAtPiB2b2lkOgphY2NvdW50X2dldF9wb3NpdGlvbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNTkKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9jcmVhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9jcmVhdGU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5ODAKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSBhcnJhbmdlcgogICAgYnl0ZWMgMTggLy8gMHg1MjIzNDE3MjcyNjE2ZTY3NjU3MjIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTgxCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfY29uZmlnW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfY29uZmlnOgogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGxlbgogICAgcHVzaGludCAxMDcKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuTm9ybWFsaXplZEFjdHVzVGVybXMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDcyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLkluaXRpYWxLZXJuZWxTdGF0ZQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIGxlbgogICAgZGlnIDEKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgdHVwbGUgZW5jb2RpbmcKICAgIGR1cAogICAgcHVzaGludCAzNAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHRhaWwgcG9pbnRlciBhdCBpbmRleCAxIG9mICh1aW50OFszMl0sKGxlbit1dGY4W10pKQogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBjb3ZlciAzCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAzNgogICAgKwogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5Qcm9zcGVjdHVzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDEyCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMTQtMTAxNQogICAgLy8gIyBDb25maWd1cmUgQ29udHJhY3QKICAgIC8vIHNlbGYuY29udHJhY3RfdHlwZSA9IHRlcm1zLmNvbnRyYWN0X3R5cGUuYXNfdWludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ5dGVjIDEyIC8vICJjb250cmFjdF90eXBlIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICBieiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIwCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfQU5OKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjEKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgcHVzaGludCAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjIKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjMKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgcHVzaGludCA0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjQKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMTgtMjI1CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYnogY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAOAoKY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUA3OgogICAgaW50Y18xIC8vIDEKCmNvbnRyYWN0X2NvbmZpZ19ib29sX21lcmdlQDk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjkKICAgIC8vIGFzc2VydCBzZWxmLl9pc19zdXBwb3J0ZWRfY29udHJhY3RfdHlwZShjb250cmFjdF90eXBlKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDE3CiAgICAvLyBzZWxmLl9zdG9yZV9jb250cmFjdF9jb25maWcoc2VsZi5jb250cmFjdF90eXBlLCB0ZXJtcywgaW5pdGlhbF9zdGF0ZSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBidXJ5IDIKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMjUKICAgIC8vIGFzc2VydCB0ZXJtcy5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBkaWcgNAogICAgZHVwCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDgKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMyNwogICAgLy8gdGVybXMuZGF5X2NvdW50X2NvbnZlbnRpb24uYXNfdWludDY0KCkKICAgIHB1c2hpbnQgNTcKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyOTctMzAzCiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgIGJ6IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGRpZyA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyOTkKICAgIC8vIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGRpZyA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDAKICAgIC8vIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICBwdXNoaW50IDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI5Ny0zMDMKICAgIC8vIHJldHVybiBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzYwKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwSVNEQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjApLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDE2CiAgICBkaWcgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzAxCiAgICAvLyBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyOTctMzAzCiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgID09CiAgICBibnogY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUAxNgogICAgZGlnIDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMwMgogICAgLy8gVUludDY0KGVudW1zLkRDQ18zMEUzNjApLAogICAgcHVzaGludCA0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyOTctMzAzCiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgID09CiAgICBieiBjb250cmFjdF9jb25maWdfYm9vbF9mYWxzZUAxNwoKY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUAxNjoKICAgIGludGNfMSAvLyAxCgpjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUAxODoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMwOS0zMTEKICAgIC8vIGFzc2VydCBzZWxmLl9pc19zdXBwb3J0ZWRfZGF5X2NvdW50X2NvbnZlbnRpb24oCiAgICAvLyAgICAgZGF5X2NvdW50X2NvbnZlbnRpb24KICAgIC8vICksIGVyci5JTlZBTElEX0RBWV9DT1VOVF9DT05WRU5USU9OCiAgICBhc3NlcnQgLy8gSW52YWxpZCBkYXktY291bnQgY29udmVudGlvbiBJRAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzI5CiAgICAvLyBpZiBjb250cmFjdF90eXBlICE9IFVJbnQ2NChlbnVtcy5DVF9BTk4pOgogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgIT0KICAgIGJ6IGNvbnRyYWN0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDIwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzAKICAgIC8vIGFzc2VydCBub3QgdGVybXMuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBkaWcgNAogICAgcHVzaGludCA3ODYKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgoKY29udHJhY3RfY29uZmlnX2FmdGVyX2lmX2Vsc2VAMjA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MDAKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MDEKICAgIC8vIGFzc2VydCBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID09IFVJbnQ2NCgwKSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBELUFTQSBhbHJlYWR5IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgwMy04MDQKICAgIC8vICMgU2V0IERlbm9taW5hdGlvbiBBc3NldAogICAgLy8gc2VsZi5fYXNzZXJ0X2Rlbm9taW5hdGlvbl9hc3NldCh0ZXJtcy5kZW5vbWluYXRpb25fYXNzZXRfaWQpCiAgICBkaWcgNAogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc2OC03NjkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gZGVub21pbmF0aW9uIHdpdGggQVNBCiAgICAvLyBfY3JlYXRvciwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfY3JlYXRvcihkZW5vbWluYXRpb25fYXNzZXRfaWQpCiAgICBkdXAKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc3MAogICAgLy8gYXNzZXJ0IGV4aXN0cywgZXJyLklOVkFMSURfREVOT01JTkFUSU9OCiAgICBhc3NlcnQgLy8gRGVub21pbmF0aW9uIGFzc2V0IGlzIG5vdCBwcm9wZXJseSBzZXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc3MwogICAgLy8gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgPSBkZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIGJ5dGVjIDQ0IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgwNy04MDgKICAgIC8vICMgU2V0IFNldHRsZW1lbnQgQXNzZXQKICAgIC8vIHNlbGYuX2Fzc2VydF9zZXR0bGVtZW50X2Fzc2V0KHRlcm1zLnNldHRsZW1lbnRfYXNzZXRfaWQpCiAgICBkaWcgMQogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Nzc4CiAgICAvLyBzZXR0bGVtZW50X2Fzc2V0X2lkID09IHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc3Ni03NzkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzZXR0bGVtZW50IGFzc2V0IGlzIHRoZSBkZW5vbWluYXRpb24gYXNzZXQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgLy8gKSwgZXJyLklOVkFMSURfU0VUVExFTUVOVF9BU1NFVAogICAgYXNzZXJ0IC8vIERpZmZlcmVudCBzZXR0bGVtZW50IGFzc2V0IG5vdCBzdXBwb3J0ZWQsIG11c3QgYmUgZXF1YWwgdG8gZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODIKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCA9IHNldHRsZW1lbnRfYXNzZXRfaWQKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODMtNzg5CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODgKICAgIC8vIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODYKICAgIC8vIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Nzg3CiAgICAvLyBhc3NldF9hbW91bnQ9MCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODMtNzg0CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc4My03ODkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gc2V0dGxlbWVudCB3aXRoIEFTQQogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PTAsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTEtODEyCiAgICAvLyAjIFVuaXRzCiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzID0gdGVybXMudG90YWxfdW5pdHMKICAgIGR1cAogICAgcHVzaGludCAxNwogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTMKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDEwIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODE1LTgxNgogICAgLy8gIyBEYXktQ291bnQgQ29udmVudGlvbnMKICAgIC8vIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPSB0ZXJtcy5kYXlfY291bnRfY29udmVudGlvbi5hc191aW50NjQoKQogICAgYnl0ZWMgNDYgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgZGlnIDgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTgtODE5CiAgICAvLyAjIFRpbWUKICAgIC8vIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlID0gdGVybXMuaW5pdGlhbF9leGNoYW5nZV9kYXRlCiAgICBkdXAKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAyNiAvLyAiaW5pdGlhbF9leGNoYW5nZV9kYXRlIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MjAKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IHRlcm1zLm1hdHVyaXR5X2RhdGUKICAgIGRpZyAxCiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNDUgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgyMQogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gaW5pdGlhbF9zdGF0ZS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBkaWcgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBwdXNoaW50IDQ4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODIzLTgyNAogICAgLy8gIyBQcmluY2lwYWwKICAgIC8vIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPSB0ZXJtcy5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudAogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgZGlnIDEwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODI1CiAgICAvLyBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSB0ZXJtcy5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBkaWcgMwogICAgcHVzaGludCA3ODYKICAgIGdldGJpdAogICAgYnl0ZWMgMzQgLy8gImR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODI2CiAgICAvLyBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9IGluaXRpYWxfc3RhdGUub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBkaWcgMQogICAgcHVzaGludCAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjXzMgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MjgtODI5CiAgICAvLyAjIEludGVyZXN0CiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgPSBpbml0aWFsX3N0YXRlLmFjY3J1ZWRfaW50ZXJlc3QKICAgIGRpZyAxCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MzEtODMyCiAgICAvLyAjIEludGVyZXN0IFJhdGUKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gaW5pdGlhbF9zdGF0ZS5ub21pbmFsX2ludGVyZXN0X3JhdGUKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODMzCiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBpbml0aWFsX3N0YXRlLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UKICAgIGRpZyAxCiAgICBwdXNoaW50IDI0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MzQKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQgPSB0ZXJtcy5yYXRlX3Jlc2V0X3NwcmVhZAogICAgZGlnIDMKICAgIHB1c2hpbnQgNTgKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzNSAvLyAicmF0ZV9yZXNldF9zcHJlYWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODM1CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciA9IHRlcm1zLnJhdGVfcmVzZXRfbXVsdGlwbGllcgogICAgZGlnIDMKICAgIHB1c2hpbnQgNjYKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzNiAvLyAicmF0ZV9yZXNldF9tdWx0aXBsaWVyIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzNgogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X2Zsb29yID0gdGVybXMucmF0ZV9yZXNldF9mbG9vcgogICAgZGlnIDMKICAgIHB1c2hpbnQgNzQKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAyOSAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MzcKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9jYXAgPSB0ZXJtcy5yYXRlX3Jlc2V0X2NhcAogICAgZGlnIDMKICAgIHB1c2hpbnQgODIKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzMCAvLyAicmF0ZV9yZXNldF9jYXAiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODM4CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfbmV4dCA9IHRlcm1zLnJhdGVfcmVzZXRfbmV4dAogICAgZGlnIDMKICAgIHB1c2hpbnQgOTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzNyAvLyAicmF0ZV9yZXNldF9uZXh0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzOQogICAgLy8gc2VsZi5oYXNfcmF0ZV9yZXNldF9mbG9vciA9IHRlcm1zLmhhc19yYXRlX3Jlc2V0X2Zsb29yCiAgICBkaWcgMwogICAgcHVzaGludCA3ODQKICAgIGdldGJpdAogICAgYnl0ZWMgMzggLy8gImhhc19yYXRlX3Jlc2V0X2Zsb29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0MAogICAgLy8gc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgPSB0ZXJtcy5oYXNfcmF0ZV9yZXNldF9jYXAKICAgIGRpZyAzCiAgICBwdXNoaW50IDc4NQogICAgZ2V0Yml0CiAgICBieXRlYyAzOSAvLyAiaGFzX3JhdGVfcmVzZXRfY2FwIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0Mi04NDMKICAgIC8vICMgU2NhbGluZwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSA9IHRlcm1zLmZpeGVkX3BvaW50X3NjYWxlCiAgICB1bmNvdmVyIDMKICAgIHB1c2hpbnQgOTkKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDUtODQ2CiAgICAvLyAjIFNjaGVkdWxlIFByb2Nlc3NpbmcKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yID0gaW5pdGlhbF9zdGF0ZS5ldmVudF9jdXJzb3IKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDgtODQ5CiAgICAvLyAjIFBlci1Vbml0IEZpeGVkLVBvaW50IEluZGV4ZXMKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCA9IGluaXRpYWxfc3RhdGUuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleAogICAgZGlnIDEKICAgIHB1c2hpbnQgNTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NTAKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggPSBpbml0aWFsX3N0YXRlLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4CiAgICBkaWcgMQogICAgcHVzaGludCA2NAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NTItODUzCiAgICAvLyAjIFJlc2VydmVkIEFtb3VudCAoZm9yIGV4ZWN1dGVkIGNhc2hmbG93cykKICAgIC8vIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU0CiAgICAvLyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU2CiAgICAvLyBhc3NlcnQgdGVybXMuaW5pdGlhbF9leGNoYW5nZV9kYXRlID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsIGVyci5JTlZBTElEX0lFRAogICAgZGlnIDIKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgID4KICAgIGFzc2VydCAvLyBJRUQgbXVzdCBiZSBzZXQgaW4gdGhlIGZ1dHVyZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU3CiAgICAvLyBhc3NlcnQgdGVybXMuaW5pdGlhbF9leGNoYW5nZV9kYXRlID4gaW5pdGlhbF9zdGF0ZS5zdGF0dXNfZGF0ZSwgZXJyLklOVkFMSURfSUVECiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICA8CiAgICBhc3NlcnQgLy8gSUVEIG11c3QgYmUgc2V0IGluIHRoZSBmdXR1cmUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg1OAogICAgLy8gYXNzZXJ0IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA8IHRlcm1zLm1hdHVyaXR5X2RhdGUsIGVyci5JTlZBTElEX0lFRAogICAgPAogICAgYXNzZXJ0IC8vIElFRCBtdXN0IGJlIHNldCBpbiB0aGUgZnV0dXJlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDE5LTEwMjAKICAgIC8vICMgTm90YXJpemUgcHJvc3BlY3R1cyAob3B0aW9uYWwpCiAgICAvLyBzZWxmLnByb3NwZWN0dXNfaGFzaCA9IHByb3NwZWN0dXMuaGFzaC5ieXRlcwogICAgZGlnIDIKICAgIGV4dHJhY3QgMCAzMgogICAgYnl0ZWMgNDIgLy8gInByb3NwZWN0dXNfaGFzaCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDIxCiAgICAvLyBzZWxmLnByb3NwZWN0dXNfdXJsID0gcHJvc3BlY3R1cy51cmwKICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgYnl0ZWMgNDMgLy8gInByb3NwZWN0dXNfdXJsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMjIKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNvbnRyYWN0X2NvbmZpZ19ib29sX2ZhbHNlQDE3OgogICAgaW50Y18wIC8vIDAKICAgIGIgY29udHJhY3RfY29uZmlnX2Jvb2xfbWVyZ2VAMTgKCmNvbnRyYWN0X2NvbmZpZ19ib29sX2ZhbHNlQDg6CiAgICBpbnRjXzAgLy8gMAogICAgYiBjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUA5CgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3Rfc2NoZWR1bGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9zY2hlZHVsZToKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAyNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBzd2FwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgMwogICAgZHVwCiAgICBwdXNoaW50IDY1CiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIHVuY292ZXIgMgogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8c21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5FeGVjdXRpb25TY2hlZHVsZUVudHJ5PgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAzOQogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDQyCiAgICAvLyBjb250cmFjdF90eXBlPXNlbGYuY29udHJhY3RfdHlwZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBjb3ZlciAzCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODc0CiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIEQtQVNBIGFscmVhZHkgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODc1LTg3NwogICAgLy8gYXNzZXJ0IHNjaGVkdWxlX3BhZ2UubGVuZ3RoIDw9IFVJbnQ2NCgKICAgIC8vICAgICBjc3QuU0NIRURVTEVfUEFHRV9TSVpFCiAgICAvLyApLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBkdXAKICAgIHB1c2hpbnQgMTYKICAgIDw9CiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NzgKICAgIC8vIGFzc2VydCBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID4gVUludDY0KDApLCBlcnIuVEVSTVNfTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMCAvLyAiaW5pdGlhbF9leGNoYW5nZV9hbW91bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0EgdGVybXMgbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg4MAogICAgLy8gcGFnZV9jdXJzb3IgPSBzY2hlZHVsZV9wYWdlX2luZGV4ICogVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpCiAgICBzd2FwCiAgICBwdXNoaW50IDE2CiAgICAqCiAgICBzd2FwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4ODcKICAgIC8vICsgcGFnZV9sZW5ndGggKiBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19QRVJfRU5UUllfQlVER0VUKQogICAgcHVzaGludCAxMDAKICAgICoKICAgIHB1c2hpbnQgMTUxMAogICAgKwoKY29udHJhY3Rfc2NoZWR1bGVfd2hpbGVfdG9wQDI6CiAgICBkdXAKICAgIGdsb2JhbCBPcGNvZGVCdWRnZXQKICAgID4KICAgIGJ6IGNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX3doaWxlQDUKICAgIGl0eG5fYmVnaW4KICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBwdXNoaW50IDUgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICBieXRlYyA0NyAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW0KICAgIGJ5dGVjIDQ3IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBiIGNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEAyCgpjb250cmFjdF9zY2hlZHVsZV9hZnRlcl93aGlsZUA1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODkwCiAgICAvLyBpbmRleCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTAKCmNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODkxCiAgICAvLyB3aGlsZSBpbmRleCA8IHBhZ2VfbGVuZ3RoOgogICAgZGlnIDkKICAgIGRpZyA0CiAgICA8CiAgICBieiBjb250cmFjdF9zY2hlZHVsZV9hZnRlcl93aGlsZUAxNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODkyLTg5MwogICAgLy8gZW50cnkgPSBzY2hlZHVsZV9wYWdlW2luZGV4XS5jb3B5KCkKICAgIC8vIGVudHJ5X2V2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBkaWcgNAogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgYnVyeSAxMwogICAgZGlnIDEwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgNjUKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODkzCiAgICAvLyBlbnRyeV9ldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTItODkzCiAgICAvLyBlbnRyeSA9IHNjaGVkdWxlX3BhZ2VbaW5kZXhdLmNvcHkoKQogICAgLy8gZW50cnlfZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGludGNfMiAvLyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTMKICAgIC8vIGVudHJ5X2V2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBnZXRieXRlCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgMTQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg5NAogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X2lkID09IHBhZ2VfY3Vyc29yICsgaW5kZXgsIGVyci5JTlZBTElEX0VWRU5UX0lECiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEzCiAgICBkaWcgNQogICAgdW5jb3ZlciA0CiAgICArCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTUtODk3CiAgICAvLyBzZWxmLl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBlbnRyeV9ldmVudF90eXBlCiAgICAvLyApCiAgICBkaWcgNQogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODk4CiAgICAvLyBhc3NlcnQgZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgc3dhcAogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTkKICAgIC8vIGlmIGVudHJ5LmV2ZW50X2lkID4gVUludDY0KDApOgogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTAwCiAgICAvLyBpZiBpbmRleCA+IFVJbnQ2NCgwKToKICAgIGRpZyA5CiAgICBieiBjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlAMTAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkwMQogICAgLy8gcHJldmlvdXNfZW50cnkgPSBzY2hlZHVsZV9wYWdlW2luZGV4IC0gVUludDY0KDEpXS5jb3B5KCkKICAgIGRpZyA5CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgcHVzaGludCA2NQogICAgKgogICAgZGlnIDEyCiAgICBzd2FwCiAgICBwdXNoaW50IDY1CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTYKICAgIC8vIHByZXZpb3VzX2VudHJ5LnNjaGVkdWxlZF90aW1lIDw9IGVudHJ5LnNjaGVkdWxlZF90aW1lCiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgOAogICAgPD0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkxNS05MTcKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgcHJldmlvdXNfZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gZW50cnkuc2NoZWR1bGVkX3RpbWUKICAgIC8vICksIGVyci5JTlZBTElEX1NPUlRJTkcKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBtdXN0IGJlIHNvcnRlZCBpbiBzdHJpY3RseSBhc2NlbmRpbmcgb3JkZXIKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTgKICAgIC8vIGlmIGVudHJ5LmV2ZW50X2lkID09IFVJbnQ2NCgwKToKICAgIGRpZyA4CiAgICBibnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTE5LTkyMQogICAgLy8gYXNzZXJ0IGVudHJ5X2V2ZW50X3R5cGUgPT0gVUludDY0KAogICAgLy8gICAgIGVudW1zLkVWVF9JRUQKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZGlnIDEwCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjIKICAgIC8vIGluZGV4ICs9IFVJbnQ2NCgxKQogICAgZGlnIDkKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEwCiAgICBiIGNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEA2Cgpjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlAMTA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDMtOTA1CiAgICAvLyAjIFRoZSBmaXJzdCBlbnRyeSBvZiBhIHBhZ2UgbXVzdCBzdGlsbCBiZSBvcmRlcmVkIGFmdGVyIHRoZQogICAgLy8gIyBsYXN0IGVudHJ5IG9mIHRoZSBwcmV2aW91cyBwYWdlLgogICAgLy8gYXNzZXJ0IHNjaGVkdWxlX3BhZ2VfaW5kZXggPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0VWRU5UX0lECiAgICBkaWcgNgogICAgZHVwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBpZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTA2CiAgICAvLyBwcmV2aW91c19wYWdlX2luZGV4ID0gc2NoZWR1bGVfcGFnZV9pbmRleCAtIFVJbnQ2NCgxKQogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkwOAogICAgLy8gcHJldmlvdXNfcGFnZV9pbmRleCBpbiBzZWxmLnNjaGVkdWxlX3BhZ2UKICAgIGl0b2IKICAgIGJ5dGVjIDMxIC8vIDB4NTMyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTA3LTkwOQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBwcmV2aW91c19wYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZQogICAgLy8gKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTEwLTkxMQogICAgLy8gcHJldmlvdXNfcGFnZSA9IHNlbGYuc2NoZWR1bGVfcGFnZVtwcmV2aW91c19wYWdlX2luZGV4XS5jb3B5KCkKICAgIC8vIGFzc2VydCBwcmV2aW91c19wYWdlLmxlbmd0aCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGludCAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTExCiAgICAvLyBhc3NlcnQgcHJldmlvdXNfcGFnZS5sZW5ndGggPiBVSW50NjQoMCksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGR1cAogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTEzCiAgICAvLyBwcmV2aW91c19wYWdlLmxlbmd0aCAtIFVJbnQ2NCgxKQogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkxMi05MTQKICAgIC8vIHByZXZpb3VzX2VudHJ5ID0gcHJldmlvdXNfcGFnZVsKICAgIC8vICAgICBwcmV2aW91c19wYWdlLmxlbmd0aCAtIFVJbnQ2NCgxKQogICAgLy8gXS5jb3B5KCkKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgMgogICAgKwogICAgcHVzaGludCA2NQogICAgYm94X2V4dHJhY3QKICAgIGIgY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxMQoKY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfd2hpbGVAMTU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMDAKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHNjaGVkdWxlX3BhZ2UuY29weSgpCiAgICBkaWcgNgogICAgaXRvYgogICAgYnl0ZWMgMzEgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBkaWcgNQogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTI1CiAgICAvLyBpZiBpc19sYXN0X3BhZ2U6CiAgICBkaWcgNQogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxNwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTI3CiAgICAvLyBzY2hlZHVsZV9wYWdlX2luZGV4ICogVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpICsgcGFnZV9sZW5ndGgKICAgIGRpZyAxCiAgICBkaWcgNAogICAgKwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTI2CiAgICAvLyBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50ID0gKAogICAgYnl0ZWMgNCAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjYtOTI4CiAgICAvLyBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50ID0gKAogICAgLy8gICAgIHNjaGVkdWxlX3BhZ2VfaW5kZXggKiBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkgKyBwYWdlX2xlbmd0aAogICAgLy8gKQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkyOQogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgcHVzaGludCA1MAogICAgYXBwX2dsb2JhbF9wdXQKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDQ3CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmNvbnRyYWN0X2V4ZWN1dGVfaWVkW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfZXhlY3V0ZV9pZWQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA1NwogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDU4CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA1OQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNjEKICAgIC8vIGFzc2VydCBzZWxmLmV2ZW50X2N1cnNvciA8IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICBkaWcgMQogICAgPgogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgY3Vyc29yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDYyCiAgICAvLyBlbnRyeSA9IHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLmV2ZW50X2N1cnNvcikKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2MwogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X3R5cGUgPT0gYXJjNC5VSW50OChlbnVtcy5FVlRfSUVEKSwgZXJyLklOVkFMSURfRVZFTlRfVFlQRQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgZHVwCiAgICBwdXNoYnl0ZXMgMHgwMQogICAgYj09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCB0eXBlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDY3CiAgICAvLyBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIGRpZyAxCiAgICBleHRyYWN0IDAgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2OQogICAgLy8gc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICBkaWcgMgogICAgZXh0cmFjdCA5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNzAKICAgIC8vIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgZGlnIDMKICAgIGV4dHJhY3QgMTcgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3MQogICAgLy8gcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZGlnIDQKICAgIGV4dHJhY3QgMjUgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3MwogICAgLy8gbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9ZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBkaWcgNQogICAgZXh0cmFjdCAzMyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc0CiAgICAvLyBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICBkaWcgNgogICAgZXh0cmFjdCA0MSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc1CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1lbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIGRpZyA3CiAgICBleHRyYWN0IDQ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNzYKICAgIC8vIGZsYWdzPWVudHJ5LmZsYWdzLAogICAgZGlnIDgKICAgIGV4dHJhY3QgNTcgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2Ni0xMDc3CiAgICAvLyB0eXAuT2JzZXJ2ZWRFdmVudFJlcXVlc3QoCiAgICAvLyAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBvYnNlcnZlZF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1lbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9ZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9ZW50cnkuZmxhZ3MsCiAgICAvLyApLAogICAgdW5jb3ZlciA3CiAgICB1bmNvdmVyIDgKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3MgogICAgLy8gb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2Ni0xMDc3CiAgICAvLyB0eXAuT2JzZXJ2ZWRFdmVudFJlcXVlc3QoCiAgICAvLyAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBvYnNlcnZlZF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1lbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9ZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9ZW50cnkuZmxhZ3MsCiAgICAvLyApLAogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNjQtMTA3OAogICAgLy8gc2VsZi5fYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkoCiAgICAvLyAgICAgZW50cnksCiAgICAvLyAgICAgdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0KAogICAgLy8gICAgICAgICBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIC8vICAgICAgICAgZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgLy8gICAgICAgICBzY2hlZHVsZWRfdGltZT1lbnRyeS5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICAgICAgYWNjcnVhbF9mYWN0b3I9ZW50cnkuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICAgICAgb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPWVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPWVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgICAgICBmbGFncz1lbnRyeS5mbGFncywKICAgIC8vICAgICApLAogICAgLy8gKQogICAgY2FsbHN1YiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkKICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3OQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDQ5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5hcHBseV9ub25fY2FzaF9ldmVudFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFwcGx5X25vbl9jYXNoX2V2ZW50OgogICAgaW50Y18wIC8vIDAKICAgIGR1cG4gNAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwODEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwbiAyCiAgICBsZW4KICAgIHB1c2hpbnQgNzMKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuT2JzZXJ2ZWRFdmVudFJlcXVlc3QKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDk1CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA5NgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwOTgKICAgIC8vIGlmIHBheWxvYWQuZmxhZ3MgJiBVSW50NjQoZW51bXMuRkxBR19PQlNFUlZFRF9FVkVOVCk6CiAgICBwdXNoaW50IDY1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBwdXNoaW50IDQKICAgICYKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjMzCiAgICAvLyByZXR1cm4gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9DTE0pCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIHB1c2hpbnQgNQogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwOTkKICAgIC8vIGFzc2VydCBzZWxmLl9zdXBwb3J0c19vYnNlcnZlZF9ldmVudHMoKSwgZXJyLk9CU0VSVkVEX0VWRU5UX1JFUVVJUkVECiAgICBhc3NlcnQgLy8gT2JzZXJ2ZWQgZXZlbnQgcmVxdWlyZWQgdG8gZXhlY3V0ZSB0aGlzIGFjdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEwMAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMzMKICAgIC8vIHJldHVybiBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0NMTSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgZHVwCiAgICBwdXNoaW50IDUKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MzgKICAgIC8vIGFzc2VydCBzZWxmLl9zdXBwb3J0c19vYnNlcnZlZF9ldmVudHMoKSwgZXJyLk9CU0VSVkVEX0VWRU5UX1JFUVVJUkVECiAgICBhc3NlcnQgLy8gT2JzZXJ2ZWQgZXZlbnQgcmVxdWlyZWQgdG8gZXhlY3V0ZSB0aGlzIGFjdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTM5CiAgICAvLyBhc3NlcnQgcGF5bG9hZC5ldmVudF9pZCA9PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LCBlcnIuSU5WQUxJRF9FVkVOVF9JRAogICAgZGlnIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgNwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NDEKICAgIC8vIHNlbGYuY29udHJhY3RfdHlwZSwgcGF5bG9hZC5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBkdXAKICAgIGV4dHJhY3QgOCAxCiAgICBidXJ5IDEyCiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQwLTk0MgogICAgLy8gc2VsZi5fYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgc2VsZi5jb250cmFjdF90eXBlLCBwYXlsb2FkLmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIC8vICkKICAgIGNhbGxzdWIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NDQKICAgIC8vIHBhZ2VfaW5kZXggPSBzZWxmLl9zY2hlZHVsZV9wYWdlX2luZGV4KHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxOTAKICAgIC8vIHJldHVybiBldmVudF9pZCAvLyBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkKICAgIHB1c2hpbnQgMTYKICAgIC8KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk0NQogICAgLy8gcGFnZSA9IHR5cC5FeGVjdXRpb25TY2hlZHVsZVBhZ2UoKQogICAgcHVzaGJ5dGVzIDB4MDAwMAogICAgYnVyeSA3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NDYKICAgIC8vIGlmIHBhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlOgogICAgaXRvYgogICAgYnl0ZWMgMzEgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA5CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMjcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk0NwogICAgLy8gcGFnZSA9IHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XS5jb3B5KCkKICAgIGRpZyA3CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidXJ5IDcKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX3BhZ2UgZW50cnkgZXhpc3RzCgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDI3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQ4CiAgICAvLyBhc3NlcnQgcGFnZS5sZW5ndGggPCBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGRpZyA1CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgMTYKICAgIDwKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1MwogICAgLy8gc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIGRpZyAzCiAgICBkdXAKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTQKICAgIC8vIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICBkaWcgMQogICAgZXh0cmFjdCAxNyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTUKICAgIC8vIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZGlnIDIKICAgIGV4dHJhY3QgMjUgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTU2CiAgICAvLyBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDMKICAgIGV4dHJhY3QgNDEgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTU3CiAgICAvLyBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIGRpZyA0CiAgICBleHRyYWN0IDQ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1OAogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIHVuY292ZXIgNQogICAgZXh0cmFjdCA1NyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTAtOTYwCiAgICAvLyB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1wYXlsb2FkLmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9cGF5bG9hZC5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPXBheWxvYWQucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXBheWxvYWQubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICkKICAgIGRpZyAxMQogICAgaXRvYgogICAgZGlnIDE4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMwogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NDktOTYxCiAgICAvLyBwYWdlLmFwcGVuZCgKICAgIC8vICAgICB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9cGF5bG9hZC5ldmVudF9pZCwKICAgIC8vICAgICAgICAgZXZlbnRfdHlwZT1wYXlsb2FkLmV2ZW50X3R5cGUsCiAgICAvLyAgICAgICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIC8vICAgICAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICAgICApCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjIKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHBhZ2UuY29weSgpCiAgICBkaWcgOAogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2MwogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTAzCiAgICAvLyBhc3NlcnQgZXZlbnRfaWQgPT0gc2VsZi5ldmVudF9jdXJzb3IsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBjdXJzb3IKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMDQKICAgIC8vIGVudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KGV2ZW50X2lkKQogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEwNgogICAgLy8gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgYnVyeSAxMAogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjQKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY1CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzYzLTM3MAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9SUiksCiAgICBwdXNoaW50IDEyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY3CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICBwdXNoaW50IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY4CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgcHVzaGludCAxOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzYzLTM3MAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBieiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX2ZhbHNlQDE2CgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX3RydWVAMTU6CiAgICBpbnRjXzEgLy8gMQoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9tZXJnZUAxNzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMDUtMTEwNwogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2lzX25vbl9jYXNoKAogICAgLy8gICAgIGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIC8vICksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IHR5cGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMDgKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlICE9IGFyYzQuVUludDgoZW51bXMuRVZUX0lFRCksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGRpZyA4CiAgICBwdXNoYnl0ZXMgMHgwMQogICAgYiE9CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCB0eXBlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNzQKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluIChVSW50NjQoZW51bXMuRVZUX1JSKSwgVUludDY0KGVudW1zLkVWVF9SUkYpKQogICAgZGlnIDQKICAgIHB1c2hpbnQgMTIKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDIxCiAgICBkaWcgNAogICAgcHVzaGludCAxMQogICAgPT0KICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfZmFsc2VAMjIKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAyMToKICAgIGludGNfMSAvLyAxCgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX21lcmdlQDIzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEwOQogICAgLy8gaWYgc2VsZi5fZXZlbnRfaXNfcmF0ZV9yZXNldChlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpKToKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Vsc2VfYm9keUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODAKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLm9ic2VydmVyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjQgLy8gMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTEzCiAgICAvLyBzZWxmLl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeShlbnRyeSwgcGF5bG9hZCkKICAgIGRpZyA2CiAgICBkaWcgMgogICAgY2FsbHN1YiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkKICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTExNAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDgxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Vsc2VfYm9keUA1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTExMgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICBiIGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VANgoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9mYWxzZUAyMjoKICAgIGludGNfMCAvLyAwCiAgICBiIGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfbWVyZ2VAMjMKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfZmFsc2VAMTY6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX21lcmdlQDE3CgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfZ2V0X3N0YXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfZ2V0X3N0YXRlOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBkdXAKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEyMQogICAgLy8gY29udHJhY3RfdHlwZT1hcmM0LlVJbnQ4KHNlbGYuY29udHJhY3RfdHlwZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzIgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMjMKICAgIC8vIHRvdGFsX3VuaXRzPXNlbGYudG90YWxfdW5pdHMsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEyNAogICAgLy8gcmVzZXJ2ZWRfdW5pdHNfdG90YWw9c2VsZi5yZXNlcnZlZF91bml0c190b3RhbCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTI1CiAgICAvLyBpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudD1zZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMjYKICAgIC8vIGV2ZW50X2N1cnNvcj1zZWxmLmV2ZW50X2N1cnNvciwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEyNwogICAgLy8gc2NoZWR1bGVfZW50cnlfY291bnQ9c2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMjgKICAgIC8vIG91dHN0YW5kaW5nX3ByaW5jaXBhbD1zZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEyOQogICAgLy8gaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZT1zZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEzMAogICAgLy8gbm9taW5hbF9pbnRlcmVzdF9yYXRlPXNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTMxCiAgICAvLyBhY2NydWVkX2ludGVyZXN0PXNlbGYuYWNjcnVlZF9pbnRlcmVzdCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTMyCiAgICAvLyBjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4PXNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEzMwogICAgLy8gY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXg9c2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTM0CiAgICAvLyByZXNlcnZlZF9pbnRlcmVzdD1zZWxmLnJlc2VydmVkX2ludGVyZXN0LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMzUKICAgIC8vIHJlc2VydmVkX3ByaW5jaXBhbD1zZWxmLnJlc2VydmVkX3ByaW5jaXBhbCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMjAtMTEzNgogICAgLy8gcmV0dXJuIHR5cC5LZXJuZWxTdGF0ZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlPWFyYzQuVUludDgoc2VsZi5jb250cmFjdF90eXBlKSwKICAgIC8vICAgICBzdGF0dXM9c2VsZi5zdGF0dXMsCiAgICAvLyAgICAgdG90YWxfdW5pdHM9c2VsZi50b3RhbF91bml0cywKICAgIC8vICAgICByZXNlcnZlZF91bml0c190b3RhbD1zZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsLAogICAgLy8gICAgIGluaXRpYWxfZXhjaGFuZ2VfYW1vdW50PXNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQsCiAgICAvLyAgICAgZXZlbnRfY3Vyc29yPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgLy8gICAgIHNjaGVkdWxlX2VudHJ5X2NvdW50PXNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQsCiAgICAvLyAgICAgb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2U9c2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlLAogICAgLy8gICAgIG5vbWluYWxfaW50ZXJlc3RfcmF0ZT1zZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBhY2NydWVkX2ludGVyZXN0PXNlbGYuYWNjcnVlZF9pbnRlcmVzdCwKICAgIC8vICAgICBjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4PXNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCwKICAgIC8vICAgICBjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleD1zZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4LAogICAgLy8gICAgIHJlc2VydmVkX2ludGVyZXN0PXNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QsCiAgICAvLyAgICAgcmVzZXJ2ZWRfcHJpbmNpcGFsPXNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsLAogICAgLy8gKQogICAgdW5jb3ZlciAxNAogICAgaXRvYgogICAgdW5jb3ZlciAxNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDEzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDEwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgOQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDgKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTE2CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnRbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE0MgogICAgLy8gaWYgc2VsZi5ldmVudF9jdXJzb3IgPj0gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgPj0KICAgIGJ6IGNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDQKICAgIC8vIGV2ZW50X2lkPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTQzLTExNTMKICAgIC8vIHJldHVybiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1zZWxmLmV2ZW50X2N1cnNvciwKICAgIC8vICAgICBldmVudF90eXBlPWFyYzQuVUludDgoMCksCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9VUludDY0KDApLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9VUludDY0KDApLAogICAgLy8gICAgIGZsYWdzPVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGl0b2IKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDUKICAgIC8vIGV2ZW50X3R5cGU9YXJjNC5VSW50OCgwKSwKICAgIGJ5dGVjIDQwIC8vIDB4MDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDMtMTE1MwogICAgLy8gcmV0dXJuIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgIGV2ZW50X2lkPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgLy8gICAgIGV2ZW50X3R5cGU9YXJjNC5VSW50OCgwKSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1VSW50NjQoMCksCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1VSW50NjQoMCksCiAgICAvLyAgICAgZmxhZ3M9VUludDY0KDApLAogICAgLy8gKQogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTQ2CiAgICAvLyBzY2hlZHVsZWRfdGltZT1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE0My0xMTUzCiAgICAvLyByZXR1cm4gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkoCiAgICAvLyAgICAgZXZlbnRfaWQ9c2VsZi5ldmVudF9jdXJzb3IsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1hcmM0LlVJbnQ4KDApLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPVVJbnQ2NCgwKSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249VUludDY0KDApLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPVVJbnQ2NCgwKSwKICAgIC8vICAgICBmbGFncz1VSW50NjQoMCksCiAgICAvLyApCiAgICBpdG9iCiAgICBzd2FwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKCmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudF9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudEA0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEzOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpjb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1NAogICAgLy8gcmV0dXJuIHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLmV2ZW50X2N1cnNvcikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50QDQKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5jb250cmFjdF91cGRhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF91cGRhdGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTUzLTE1NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGdyYW50cyB0aGUgdXBkYXRlIHBlcm1pc3Npb25zIHRvIHRoZSBBcnJhbmdlci4KICAgIC8vICMg4pqg77iPIFdBUk5JTkc6IEFwcGxpY2F0aW9uIHVwZGF0ZXMgbXVzdCBiZSBleGVjdXRlZCBWRVJZIGNhcmVmdWxseSwgYXMgdGhleQogICAgLy8gIyBtaWdodCBpbnRyb2R1Y2UgYnJlYWtpbmcgY2hhbmdlcy4KICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfcm90YXRlX2FycmFuZ2VyW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19yb3RhdGVfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2OQogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTcwCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gbmV3X2FycmFuZ2VyCiAgICBieXRlYyAxOCAvLyAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTcxCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfc2V0X29wX2RhZW1vbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfc2V0X29wX2RhZW1vbjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTg0CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODUKICAgIC8vIHNlbGYub3BfZGFlbW9uLnZhbHVlID0gYWRkcmVzcwogICAgYnl0ZWMgMjUgLy8gMHg1MjIzNGY3MDQ0NjE2NTZkNmY2ZTIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4NgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTczCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2Fzc2lnbl9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19hc3NpZ25fcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDE2CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLlJvbGVWYWxpZGl0eQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjExCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMgogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgcHVzaGludCAyMAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTAzCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gcm9sZV9hZGRyZXNzCiAgICBieXRlYyAxOCAvLyAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMKICAgIGRpZyAzCiAgICBhcHBfZ2xvYmFsX3B1dAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTQKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDYKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIGR1cAogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnRfbWFuYWdlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMyAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwOAogICAgLy8gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMiAvLyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTIKICAgIC8vIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIGR1cAogICAgcHVzaGludCA2MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE1CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMzIgLy8gMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE2CiAgICAvLyBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExOAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMSAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIwCiAgICAvLyBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMwogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgODAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIzCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI0IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI0CiAgICAvLyBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3Jldm9rZV9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19yZXZva2Vfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzUKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzNgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzcKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCkpCiAgICBidG9pCiAgICBkdXBuIDIKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCAhPSBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksIGVyci5JTlZBTElEX1JPTEUKICAgIGR1cAogICAgcHVzaGludCAyMAogICAgIT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyOAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIzIC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0NGQ2MTZlNjE2NzY1NzIyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMwCiAgICAvLyBkZWwgc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzOQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjE2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIyIC8vIDB4NTIyMzUwNzI2OTZkNjE3Mjc5NDQ2NTYxNmM2NTcyMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNAogICAgLy8gZGVsIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjM4CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIGR1cAogICAgcHVzaGludCA2MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAzMiAvLyAweDUyMjM1NDcyNzU3Mzc0NjU2NTIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzgKICAgIC8vIGRlbCBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjM4CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDEKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hdXRob3JpdHksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjEgLy8gMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MgogICAgLy8gZGVsIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzOAogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDQKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDgwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI0IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ2CiAgICAvLyBkZWwgc2VsZi5vYnNlcnZlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfY29udHJhY3Rfc3VzcGVuc2lvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfY29udHJhY3Rfc3VzcGVuc2lvbjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCAgIyBUT0RPOiBVcGRhdGUgc3BlY3MgYW5kIGFkZCB0ZXN0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojc3CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyMSAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1NwogICAgLy8gc2VsZi5hc3NldF9zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGJ5dGVjIDMzIC8vICJhc3NldF9zdXNwZW5kZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1OAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QgICMgVE9ETzogVXBkYXRlIHNwZWNzIGFuZCBhZGQgdGVzdAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X2FycmFuZ2VyW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjY4CiAgICAvLyByZXR1cm4gc2VsZi5hcnJhbmdlci52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE4IC8vIDB4NTIyMzQxNzI3MjYxNmU2NzY1NzIyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI2MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYWRkcmVzc19yb2xlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjcwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4NAogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hY2NvdW50X21hbmFnZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjMgLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQ0ZDYxNmU2MTY3NjU3MjIzCiAgICBkaWcgMQogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODUKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYucHJpbWFyeV9kZWFsZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjIgLy8gMHg1MjIzNTA3MjY5NmQ2MTcyNzk0NDY1NjE2YzY1NzIyMwogICAgZGlnIDIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg2CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnRydXN0ZWUsIGFkZHJlc3MpLAogICAgYnl0ZWMgMzIgLy8gMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMwogICAgZGlnIDMKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg3CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgYWRkcmVzcyksCiAgICBieXRlYyAyMSAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgZGlnIDQKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg4CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLm9ic2VydmVyLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDI0IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgdW5jb3ZlciA1CiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlYyA0MCAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciA2CiAgICBzZXRiaXQKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDUKICAgIHNldGJpdAogICAgcHVzaGludCAyCiAgICB1bmNvdmVyIDQKICAgIHNldGJpdAogICAgcHVzaGludCAzCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgcHVzaGludCA0CiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwNQogICAgLy8gcm9sZSA9IHJvbGVfaWQuYXNfdWludDY0KCkKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDYKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGUpCiAgICBkdXAKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA4CiAgICAvLyBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKToKICAgIHB1c2hpbnRzIDIwIDQwIDUwIDYwIDcwIDgwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA3LTMzOAogICAgLy8gbWF0Y2ggcm9sZToKICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKToKICAgIC8vICAgICAgICAgcmV0dXJuIHR5cC5Sb2xlVmFsaWRpdHkoCiAgICAvLyAgICAgICAgICAgICByb2xlX3ZhbGlkaXR5X3N0YXJ0PVVJbnQ2NCgwKSwgcm9sZV92YWxpZGl0eV9lbmQ9VUludDY0KDApCiAgICAvLyAgICAgICAgICkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSk6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSk6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgXzoKICAgIC8vICAgICAgICAgb3AuZXJyKGVyci5JTlZBTElEX1JPTEUpCiAgICB1bmNvdmVyIDYKICAgIG1hdGNoIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMEAyIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMUAzIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMkA0IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfM0A1IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNEA2IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzM4CiAgICAvLyBvcC5lcnIoZXJyLklOVkFMSURfUk9MRSkKICAgIGVyciAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV81QDc6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzM0CiAgICAvLyBzZWxmLm9ic2VydmVyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDI0IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMzMy0zMzUKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLm9ic2VydmVyLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzYKICAgIC8vIHJldHVybiBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV80QDY6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI5CiAgICAvLyBzZWxmLmF1dGhvcml0eSwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAyMSAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOC0zMzAKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLmF1dGhvcml0eSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzMxCiAgICAvLyByZXR1cm4gc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8zQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI0CiAgICAvLyBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMzIgLy8gMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMy0zMjUKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyNgogICAgLy8gcmV0dXJuIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzJANDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTkKICAgIC8vIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMjIgLy8gMHg1MjIzNTA3MjY5NmQ2MTcyNzk0NDY1NjE2YzY1NzIyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxOC0zMjAKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLnByaW1hcnlfZGVhbGVyLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjEKICAgIC8vIHJldHVybiBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMUAzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxNAogICAgLy8gc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMjMgLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQ0ZDYxNmU2MTY3NjU3MjIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEzLTMxNQogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTYKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzBAMjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDktMzExCiAgICAvLyByZXR1cm4gdHlwLlJvbGVWYWxpZGl0eSgKICAgIC8vICAgICByb2xlX3ZhbGlkaXR5X3N0YXJ0PVVJbnQ2NCgwKSwgcm9sZV92YWxpZGl0eV9lbmQ9VUludDY0KDApCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB2b2lkOgpfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZDoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNgogICAgLy8gZGVmIF9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHNlbGYsIGhvbGRpbmdfYWRkcmVzczogQWNjb3VudCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI4CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZCwgZXJyLlNVU1BFTkRFRAogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHB1c2hpbnQgMzg0CiAgICBnZXRiaXQKICAgICEKICAgIGFzc2VydCAvLyBTdXNwZW5kZWQgb3BlcmF0aW9ucwogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuX3NldHRsZV9wb3NpdGlvbihob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB1aW50NjQsIHVpbnQ2NDoKX3NldHRsZV9wb3NpdGlvbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo0NAogICAgLy8gZGVmIF9zZXR0bGVfcG9zaXRpb24oc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50KSAtPiB0dXBsZVtVSW50NjQsIFVJbnQ2NF06CiAgICBwcm90byAxIDIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NjEKICAgIC8vIHBvc2l0aW9uID0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY29weSgpCiAgICBkdXAKICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjYzLTY1CiAgICAvLyAjIENvbXB1dGUgdGhlIGluY3JlbWVudGFsIHBlci11bml0IGZpeGVkLXBvaW50IGludGVyZXN0IGFuZCBwcmluY2lwYWwgYWNjcnVlZAogICAgLy8gIyBzaW5jZSB0aGlzIGFjY291bnQncyBsYXN0IGNoZWNrcG9pbnQuCiAgICAvLyBpbnRlcmVzdF9kZWx0YSA9IHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCAtIHBvc2l0aW9uLmludGVyZXN0X2NoZWNrcG9pbnQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IGV4aXN0cwogICAgZGlnIDEKICAgIHB1c2hpbnQgNTcKICAgIGV4dHJhY3RfdWludDY0CiAgICAtCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NjcKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggLSBwb3NpdGlvbi5wcmluY2lwYWxfY2hlY2twb2ludAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCBleGlzdHMKICAgIGRpZyAyCiAgICBwdXNoaW50IDY1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjczCiAgICAvLyBpbnRlcmVzdF9kZWx0YSwgcG9zaXRpb24udW5pdHMsIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUKICAgIGRpZyAyCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzAtNzQKICAgIC8vICMgQ29udmVydCB0aGUgcGVyLXVuaXQgZml4ZWQtcG9pbnQgZGVsdGFzIGludG8gYWJzb2x1dGUgY2xhaW1hYmxlIGFtb3VudHMKICAgIC8vICMgdXNpbmcgdGhlIGFjY291bnQncyBhY3RpdmUgdW5pdHMuCiAgICAvLyBjbGFpbWFibGVfaW50ZXJlc3QgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBpbnRlcmVzdF9kZWx0YSwgcG9zaXRpb24udW5pdHMsIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUKICAgIC8vICkKICAgIHVuY292ZXIgMwogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3NgogICAgLy8gcHJpbmNpcGFsX2RlbHRhLCBwb3NpdGlvbi51bml0cywgc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojc1LTc3CiAgICAvLyBjbGFpbWFibGVfcHJpbmNpcGFsID0gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgcHJpbmNpcGFsX2RlbHRhLCBwb3NpdGlvbi51bml0cywgc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgLy8gKQogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3OS04MQogICAgLy8gIyBBY2NydWUgdGhlIGNsYWltYWJsZSBhbW91bnRzIHRvIHRoZSBhY2NvdW50IHBvc2l0aW9uIGFuZCBtYWtlIHRoZW0gYXZhaWxhYmxlCiAgICAvLyAjIGZvciB3aXRoZHJhd2FsLgogICAgLy8gcG9zaXRpb24uY2xhaW1hYmxlX2ludGVyZXN0ICs9IGNsYWltYWJsZV9pbnRlcmVzdAogICAgZGlnIDIKICAgIHB1c2hpbnQgNzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgKwogICAgaXRvYgogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICByZXBsYWNlMiA3MwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjgyCiAgICAvLyBwb3NpdGlvbi5jbGFpbWFibGVfcHJpbmNpcGFsICs9IGNsYWltYWJsZV9wcmluY2lwYWwKICAgIGR1cAogICAgcHVzaGludCA4MQogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICArCiAgICBpdG9iCiAgICByZXBsYWNlMiA4MQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojg0LTg2CiAgICAvLyAjIEFkdmFuY2UgdGhlIGFjY291bnQncyBwZXItdW5pdCBmaXhlZC1wb2ludCBjaGVja3BvaW50cyB0byB0aGUgY3VycmVudCBnbG9iYWwKICAgIC8vICMgcGVyLXVuaXQgZml4ZWQtcG9pbnQgZ2xvYmFsIGluZGljZXMuCiAgICAvLyBwb3NpdGlvbi5pbnRlcmVzdF9jaGVja3BvaW50ID0gc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCBleGlzdHMKICAgIGl0b2IKICAgIHJlcGxhY2UyIDU3CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6ODcKICAgIC8vIHBvc2l0aW9uLnByaW5jaXBhbF9jaGVja3BvaW50ID0gc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCBleGlzdHMKICAgIGl0b2IKICAgIHJlcGxhY2UyIDY1CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6ODktOTAKICAgIC8vICMgQWR2YW5jZSB0aGUgYWNjb3VudCdzIGV2ZW50IGN1cnNvciB0byB0aGUgY3VycmVudCBnbG9iYWwgZXZlbnQgY3Vyc29yLgogICAgLy8gcG9zaXRpb24uc2V0dGxlZF9jdXJzb3IgPSBzZWxmLmV2ZW50X2N1cnNvcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpdG9iCiAgICByZXBsYWNlMiA0OQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjkyLTk0CiAgICAvLyAjIFVwZGF0ZSB0aGUgYWNjb3VudCBwb3NpdGlvbiBhbmQgcmV0dXJuIHRoZSBuZXdseSBhY2NydWVkIGNsYWltYWJsZSBhbW91bnRzCiAgICAvLyAjIGFkZGVkIHRvIHRoZSB0b3RhbCBwb3NpdGlvbidzIGNsYWltYWJsZSBhbW91bnRzLgogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSBwb3NpdGlvbi5jb3B5KCkKICAgIHVuY292ZXIgMwogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojk1CiAgICAvLyByZXR1cm4gY2xhaW1hYmxlX2ludGVyZXN0LCBjbGFpbWFibGVfcHJpbmNpcGFsCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5fZW5zdXJlX3VuaXRzX2FjdGl2YXRlZChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB2b2lkOgpfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZDoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo5NwogICAgLy8gZGVmIF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKHNlbGYsIGhvbGRpbmdfYWRkcmVzczogQWNjb3VudCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTAwCiAgICAvLyBpZiBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKToKICAgIGJ6IF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwMQogICAgLy8gcmV0dXJuCiAgICByZXRzdWIKCl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDMKICAgIC8vIHBvc2l0aW9uID0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY29weSgpCiAgICBmcmFtZV9kaWcgMgogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA0CiAgICAvLyBpZiBwb3NpdGlvbi5yZXNlcnZlZF91bml0cyA9PSBVSW50NjQoMCk6CiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIGJueiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZF9hZnRlcl9pZl9lbHNlQDQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDUKICAgIC8vIHJldHVybgogICAgcmV0c3ViCgpfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZF9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA4CiAgICAvLyBwb3NpdGlvbi51bml0cyArPSBhY3RpdmF0ZWRfdW5pdHMKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDMKICAgICsKICAgIGl0b2IKICAgIHJlcGxhY2UyIDMyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA5CiAgICAvLyBwb3NpdGlvbi5yZXNlcnZlZF91bml0cyA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGl0b2IKICAgIHJlcGxhY2UyIDQwCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTEwCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHBvc2l0aW9uLmNvcHkoKQogICAgZnJhbWVfZGlnIDIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTEKICAgIC8vIGFzc2VydCBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID49IGFjdGl2YXRlZF91bml0cywgZXJyLk9WRVJfRElTVFJJQlVUSU9OCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIGV4aXN0cwogICAgZHVwCiAgICBkaWcgMgogICAgPj0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgcmVtYWluaW5nIEQtQVNBIHVuaXRzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTEyCiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIC09IGFjdGl2YXRlZF91bml0cwogICAgc3dhcAogICAgLQogICAgYnl0ZWMgMTAgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9zY2FsZWRfbXVsX2RpdihtdWx0aXBsaWNhbmQ6IHVpbnQ2NCwgbXVsdGlwbGllcjogdWludDY0LCBkaXZpc29yOiB1aW50NjQpIC0+IHVpbnQ2NDoKX3NjYWxlZF9tdWxfZGl2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTUzLTE1NQogICAgLy8gZGVmIF9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLCBtdWx0aXBsaWNhbmQ6IFVJbnQ2NCwgbXVsdGlwbGllcjogVUludDY0LCBkaXZpc29yOiBVSW50NjQKICAgIC8vICkgLT4gVUludDY0OgogICAgcHJvdG8gMyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTcKICAgIC8vIGlmIG11bHRpcGxpY2FuZCA9PSBVSW50NjQoMCkgb3IgbXVsdGlwbGllciA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTMKICAgIGJ6IF9zY2FsZWRfbXVsX2Rpdl9pZl9ib2R5QDIKICAgIGZyYW1lX2RpZyAtMgogICAgYm56IF9zY2FsZWRfbXVsX2Rpdl9hZnRlcl9pZl9lbHNlQDMKCl9zY2FsZWRfbXVsX2Rpdl9pZl9ib2R5QDI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTgKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9zY2FsZWRfbXVsX2Rpdl9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTkKICAgIC8vIGhpZ2gsIGxvdyA9IG9wLm11bHcobXVsdGlwbGljYW5kLCBtdWx0aXBsaWVyKQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIG11bHcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2MAogICAgLy8gcmV0dXJuIG9wLmRpdncoaGlnaCwgbG93LCBkaXZpc29yKQogICAgZnJhbWVfZGlnIC0xCiAgICBkaXZ3CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYW1vdW50X3RvX2luZGV4X2RlbHRhKGFtb3VudDogdWludDY0KSAtPiB1aW50NjQ6Cl9hbW91bnRfdG9faW5kZXhfZGVsdGE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjIKICAgIC8vIGRlZiBfYW1vdW50X3RvX2luZGV4X2RlbHRhKHNlbGYsIGFtb3VudDogVUludDY0KSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2NAogICAgLy8gaWYgYW1vdW50ID09IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMQogICAgYm56IF9hbW91bnRfdG9faW5kZXhfZGVsdGFfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjUKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9hbW91bnRfdG9faW5kZXhfZGVsdGFfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTY2CiAgICAvLyBhc3NlcnQgc2VsZi50b3RhbF91bml0cyA+IFVJbnQ2NCgwKSwgZXJyLk5PX1VOSVRTCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgZHVwCiAgICBhc3NlcnQgLy8gTm8gRC1BU0EgdW5pdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2NwogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KGFtb3VudCwgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwgc2VsZi50b3RhbF91bml0cykKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2luZGV4X2RlbHRhX3RvX2Ftb3VudChpbmRleF9kZWx0YTogdWludDY0KSAtPiB1aW50NjQ6Cl9pbmRleF9kZWx0YV90b19hbW91bnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjkKICAgIC8vIGRlZiBfaW5kZXhfZGVsdGFfdG9fYW1vdW50KHNlbGYsIGluZGV4X2RlbHRhOiBVSW50NjQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTc2CiAgICAvLyBpZiBpbmRleF9kZWx0YSA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGJueiBfaW5kZXhfZGVsdGFfdG9fYW1vdW50X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTc3CiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfaW5kZXhfZGVsdGFfdG9fYW1vdW50X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE3OQogICAgLy8gc2VsZi50b3RhbF91bml0cywKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxODEKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNzgtMTgyCiAgICAvLyByZXR1cm4gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgc2VsZi50b3RhbF91bml0cywKICAgIC8vICAgICBpbmRleF9kZWx0YSwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2dldF9zY2hlZHVsZV9lbnRyeShldmVudF9pZDogdWludDY0KSAtPiBieXRlczoKX2dldF9zY2hlZHVsZV9lbnRyeToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIwMgogICAgLy8gZGVmIF9nZXRfc2NoZWR1bGVfZW50cnkoc2VsZiwgZXZlbnRfaWQ6IFVJbnQ2NCkgLT4gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnk6CiAgICBwcm90byAxIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIwNAogICAgLy8gYXNzZXJ0IGV2ZW50X2lkIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgPgogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgaWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE5MAogICAgLy8gcmV0dXJuIGV2ZW50X2lkIC8vIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDE2CiAgICAvCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMDYKICAgIC8vIGFzc2VydCBwYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgaXRvYgogICAgYnl0ZWMgMzEgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxOTQKICAgIC8vIHJldHVybiBldmVudF9pZCAlIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDE2CiAgICAlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMDkKICAgIC8vIGFzc2VydCBvZmZzZXQgPCBwYWdlLmxlbmd0aCwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBwdXNoaW50IDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgMQogICAgPgogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjEwCiAgICAvLyByZXR1cm4gcGFnZVtvZmZzZXRdLmNvcHkoKQogICAgcHVzaGludCA2NQogICAgKgogICAgcHVzaGludCAyCiAgICArCiAgICBwdXNoaW50IDY1CiAgICBib3hfZXh0cmFjdAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKGNvbnRyYWN0X3R5cGU6IHVpbnQ2NCwgZXZlbnRfdHlwZTogdWludDY0KSAtPiB2b2lkOgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTMtMzE1CiAgICAvLyBkZWYgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIHNlbGYsIGNvbnRyYWN0X3R5cGU6IFVJbnQ2NCwgZXZlbnRfdHlwZTogVUludDY0CiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNDcKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNDgKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgaW50Y18yIC8vIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI0OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9NRCksCiAgICBwdXNoaW50IDE5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTAKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgcHVzaGludCAxMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU0LTI1NQogICAgLy8gIyBDaGVjayBjb21tb24gZXZlbnRzIGZpcnN0CiAgICAvLyBpZiBldmVudF90eXBlIGluIGNvbW1vbl9ldmVudHM6CiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjUxCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICBwdXNoaW50IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUA3CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU2CiAgICAvLyByZXR1cm4gVHJ1ZQogICAgaW50Y18xIC8vIDEKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICByZXRzdWIKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTgtMjU5CiAgICAvLyAjIENvbnRyYWN0LXNwZWNpZmljIGFkZGl0aW9uYWwgZXZlbnRzCiAgICAvLyBpZiBjb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9QQU0pOgogICAgZnJhbWVfZGlnIC0yCiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjYwLTI2MQogICAgLy8gIyBQQU0gb25seSBzdXBwb3J0cyBjb21tb24gZXZlbnRzCiAgICAvLyByZXR1cm4gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNjMKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0xBTSkgb3IgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2My0yNjUKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0xBTSkgb3IgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoCiAgICAvLyAgICAgZW51bXMuQ1RfTkFNCiAgICAvLyApOgogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDExCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMgogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDE2CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUAxMToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2Ni0yNzAKICAgIC8vICMgTEFNL05BTSBhZGQ6IFBSLCBJUENCCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjY4CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjY2LTI3MAogICAgLy8gIyBMQU0vTkFNIGFkZDogUFIsIElQQ0IKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDEzCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIHB1c2hpbnQgMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2Ni0yNzAKICAgIC8vICMgTEFNL05BTSBhZGQ6IFBSLCBJUENCCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICkKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF9mYWxzZUAxNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAxMzoKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDE0OgogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMTY6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzIKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTik6CiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMjMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3My0yNzgKICAgIC8vICMgQU5OIGFkZHM6IFBSLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjc1CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjczLTI3OAogICAgLy8gIyBBTk4gYWRkczogUFIsIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDIwCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIHB1c2hpbnQgMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3My0yNzgKICAgIC8vICMgQU5OIGFkZHM6IFBSLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyMAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzcKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIHB1c2hpbnQgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjczLTI3OAogICAgLy8gIyBBTk4gYWRkczogUFIsIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDIxCgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDIwOgogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMjE6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAyMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MAogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfTEFYKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA0CiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMzEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MS0yODcKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MwogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUiksCiAgICBwdXNoaW50IDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MS0yODcKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjgKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjg0CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjgxLTI4NwogICAgLy8gIyBMQVggYWRkczogUFIsIFBJLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyOAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODUKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICBwdXNoaW50IDE4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODEtMjg3CiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDI4CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODEtMjg3CiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDI5CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDI4OgogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMjk6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAzMToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4OQogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQ0xNKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA1CiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMzMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI5MC0yOTEKICAgIC8vICMgQ0xNIGFkZHM6IFBSCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1BSKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDMKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDMzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjkzCiAgICAvLyByZXR1cm4gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5faXNfZHluYW1pY19hbm51aXR5KCkgLT4gdWludDY0OgpfaXNfZHluYW1pY19hbm51aXR5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM1CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzUtMzM2CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIC8vIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGJ6IF9pc19keW5hbWljX2FubnVpdHlfYm9vbF9mYWxzZUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzYKICAgIC8vIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzNCAvLyAiZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM1LTMzNgogICAgLy8gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICAvLyBhbmQgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBieiBfaXNfZHluYW1pY19hbm51aXR5X2Jvb2xfZmFsc2VAMwogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMzNC0zMzcKICAgIC8vIHJldHVybiAoCiAgICAvLyAgICAgc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICAvLyAgICAgYW5kIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgLy8gKQogICAgcmV0c3ViCgpfaXNfZHluYW1pY19hbm51aXR5X2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzQtMzM3CiAgICAvLyByZXR1cm4gKAogICAgLy8gICAgIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKQogICAgLy8gICAgIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIC8vICkKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KGVudHJ5OiBieXRlcykgLT4gdWludDY0LCBieXRlczoKX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozODAKICAgIC8vIGRlZiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudChzZWxmLCBlbnRyeTogdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5CiAgICAvLyBlbnRyeS5hY2NydWFsX2ZhY3RvciA9PSBVSW50NjQoMCkKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAxNwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5LTM5MQogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGJ6IF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2lmX2JvZHlAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzkwCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5LTM5MQogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGJ6IF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2lmX2JvZHlAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzkxCiAgICAvLyBvciBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPT0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5LTM5MQogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGJueiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudF9hZnRlcl9pZl9lbHNlQDQKCl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2lmX2JvZHlAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5MwogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2RpZyAtMQogICAgdW5jb3ZlciAyCiAgICByZXRzdWIKCl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NQogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NgogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NC0zOTgKICAgIC8vIGFjY3J1ZWQgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICAvLyAgICAgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICkKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MDIKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozOTktNDAzCiAgICAvLyByZXR1cm4gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgYWNjcnVlZCwKICAgIC8vICAgICBlbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICBmcmFtZV9kaWcgLTEKICAgIHVuY292ZXIgMgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yKGRpc2NvdW50X2ZhY3RvcjogdWludDY0LCByZWRlbXB0aW9uX2ZhY3RvcjogdWludDY0KSAtPiB1aW50NjQ6Cl9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ2Mi00NjYKICAgIC8vIGRlZiBfZGlzY291bnRfYW5udWl0eV9mYWN0b3IoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBkaXNjb3VudF9mYWN0b3I6IFVJbnQ2NCwKICAgIC8vICAgICByZWRlbXB0aW9uX2ZhY3RvcjogVUludDY0LAogICAgLy8gKSAtPiBVSW50NjQ6CiAgICBwcm90byAyIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ2OAogICAgLy8gaWYgcmVkZW1wdGlvbl9mYWN0b3IgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0xCiAgICBibnogX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDY5CiAgICAvLyByZXR1cm4gZGlzY291bnRfZmFjdG9yCiAgICBmcmFtZV9kaWcgLTIKICAgIHJldHN1YgoKX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3MAogICAgLy8gcGVyaW9kX3JhdGUgPSBzZWxmLmZpeGVkX3BvaW50X3NjYWxlICsgc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzEKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzAtNDc0CiAgICAvLyBwZXJpb2RfcmF0ZSA9IHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgKyBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICByZWRlbXB0aW9uX2ZhY3RvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICBkaWcgMgogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgICsKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3NQogICAgLy8gYXNzZXJ0IHBlcmlvZF9yYXRlID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGR1cAogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDc4CiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDc2LTQ4MAogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIGRpc2NvdW50X2ZhY3RvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gICAgIHBlcmlvZF9yYXRlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkoZW50cnk6IGJ5dGVzLCBwYXlsb2FkOiBieXRlcykgLT4gYnl0ZXMsIGJ5dGVzOgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MTMtNjE1CiAgICAvLyBkZWYgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5KAogICAgLy8gICAgIHNlbGYsIGVudHJ5OiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSwgcGF5bG9hZDogdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0CiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAyIDIKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjIzCiAgICAvLyBhc3NlcnQgZW50cnkuZXZlbnRfaWQgPT0gc2VsZi5ldmVudF9jdXJzb3IsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGN1cnNvcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjI0CiAgICAvLyBhc3NlcnQgZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsIGVyci5OT19EVUVfQ0FTSEZMT1cKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPD0KICAgIGFzc2VydCAvLyBObyBkdWUgY2FzaGZsb3cgdG8gcGF5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MjYKICAgIC8vIGV2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYyNwogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX0lFRCk6CiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGR1cAogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYyOC02MzAKICAgIC8vICMgSUVEIGZpbmFsaXplcyBpc3N1YW5jZTogcmVzZXJ2ZWQgdW5pdHMgYmVjb21lIGFjdGl2YXRhYmxlIGFuZCB0aGUKICAgIC8vICMgc2NoZWR1bGUncyBpbml0aWFsIGNvbnRyYWN0dWFsIHN0YXRlIGJlY29tZXMgbGl2ZS4KICAgIC8vIGFzc2VydCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzIKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPT0gc2VsZi50b3RhbF91bml0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjMxLTYzMwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID09IHNlbGYudG90YWxfdW5pdHMKICAgIC8vICksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9JTkNPTVBMRVRFCiAgICBhc3NlcnQgLy8gUHJpbWFyeSBkaXN0cmlidXRpb24gaXMgbm90IGNvbXBsZXRlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzQKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjXzMgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM1CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzYKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAzMwogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzcKICAgIC8vIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM4CiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzkKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0MAogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX0FDVElWRSkKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgMTAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDUxCiAgICAvLyBhc3NlcnQgZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSA9PSBVSW50NjQoZW51bXMuRVZUX0lFRCksIGVyci5OT1RfRVZUX0lFRAogICAgZnJhbWVfZGlnIDExCiAgICBhc3NlcnQgLy8gTm90IElFRCBldmVudAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDUyCiAgICAvLyByZXR1cm4gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0MS02NDUKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1zZWxmLl9lbnRyeV9pZWRfYW1vdW50KGVudHJ5KSwKICAgIC8vICAgICBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0NAogICAgLy8gc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0MS02NDUKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1zZWxmLl9lbnRyeV9pZWRfYW1vdW50KGVudHJ5KSwKICAgIC8vICAgICBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICAvLyApCiAgICBjYWxsc3ViIF9lbWl0X2V4ZWN1dGlvbl9ldmVudAogICAgZHVwCiAgICBmcmFtZV9idXJ5IC0yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NDYKICAgIC8vIHJldHVybgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0OQogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ICs9IHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBmcmFtZV9idXJ5IC0yCiAgICArCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1MQogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1JSKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCAxMgogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMTAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1NQogICAgLy8gcGF5bG9hZC5vYnNlcnZlZF9yYXRlLAogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjU2CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzNiAvLyAicmF0ZV9yZXNldF9tdWx0aXBsaWVyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1NwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1Mi02NTgKICAgIC8vICMgUlIgZGVyaXZlcyB0aGUgbmV4dCByYXRlIGZyb20gYW4gb2JzZXJ2ZWQgb3JhY2xlIHZhbHVlIHBsdXMgdGhlCiAgICAvLyAjIGNvbnRyYWN0IHNwcmVhZCAvIG11bHRpcGxpZXIgdGVybXMsIHRoZW4gZW5mb3JjZXMgZmxvb3IgYW5kIGNhcC4KICAgIC8vIG9ic2VydmVkX3JhdGUgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBwYXlsb2FkLm9ic2VydmVkX3JhdGUsCiAgICAvLyAgICAgc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICkKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjAKICAgIC8vIG9ic2VydmVkX3JhdGUgKyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzUgLy8gInJhdGVfcmVzZXRfc3ByZWFkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkIGV4aXN0cwogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MzQKICAgIC8vIGlmIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgYW5kIHJhdGUgPCBzZWxmLnJhdGVfcmVzZXRfZmxvb3I6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzggLy8gImhhc19yYXRlX3Jlc2V0X2Zsb29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmhhc19yYXRlX3Jlc2V0X2Zsb29yIGV4aXN0cwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyOSAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X2Zsb29yIGV4aXN0cwogICAgZnJhbWVfZGlnIDYKICAgID4KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MzUKICAgIC8vIHJhdGUgPSBzZWxmLnJhdGVfcmVzZXRfZmxvb3IKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyOSAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDYKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfZmxvb3IgZXhpc3RzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1NToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjczNgogICAgLy8gaWYgc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgYW5kIHJhdGUgPiBzZWxmLnJhdGVfcmVzZXRfY2FwOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDM5IC8vICJoYXNfcmF0ZV9yZXNldF9jYXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwIGV4aXN0cwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTgKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMCAvLyAicmF0ZV9yZXNldF9jYXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9jYXAgZXhpc3RzCiAgICBmcmFtZV9kaWcgNgogICAgPAogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjczNwogICAgLy8gcmF0ZSA9IHNlbGYucmF0ZV9yZXNldF9jYXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMCAvLyAicmF0ZV9yZXNldF9jYXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSA2CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X2NhcCBleGlzdHMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjU5CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IHNlbGYuX2NsYW1wX3JhdGUoCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NTktNjYxCiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IHNlbGYuX2NsYW1wX3JhdGUoCiAgICAvLyAgICAgb2JzZXJ2ZWRfcmF0ZSArIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQKICAgIC8vICkKICAgIGZyYW1lX2RpZyA2CiAgICBhcHBfZ2xvYmFsX3B1dAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMTg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzEKICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QSSk6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMjAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY3MgogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzMKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDIzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc4CiAgICAvLyBpZiBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKToKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAyOQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc5CiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFJGKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCA1CiAgICA9PQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMzAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5MAogICAgLy8gZGlzY291bnRfZmFjdG9yID0gc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0OTEKICAgIC8vIGRlbm9taW5hdG9yID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0OTIKICAgIC8vIHNraXBfZmlyc3RfcmVkZW1wdGlvbiA9IEZhbHNlCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSA3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0OTQKICAgIC8vIGlmIGVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IgPiBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMjUKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgOAogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMzUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5NS00OTkKICAgIC8vICMgQW4gaW5pdGlhbCBQUkYgbWF5IGRlc2NyaWJlIHRoZSBmaXJzdCByZWRlbXB0aW9uIHBlcmlvZCBkaXJlY3RseS4KICAgIC8vIGRpc2NvdW50X2ZhY3RvciA9IHNlbGYuX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yKAogICAgLy8gICAgIGRpc2NvdW50X2ZhY3RvciwKICAgIC8vICAgICBlbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyA4CiAgICBjYWxsc3ViIF9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwMQogICAgLy8gc2tpcF9maXJzdF9yZWRlbXB0aW9uID0gVHJ1ZQogICAgaW50Y18xIC8vIDEKICAgIGZyYW1lX2J1cnkgNwogICAgZnJhbWVfYnVyeSAxCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAzNToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwMwogICAgLy8gZnV0dXJlX2V2ZW50X2lkID0gc2VsZi5ldmVudF9jdXJzb3IgKyBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X3doaWxlX3RvcEAzNjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwNAogICAgLy8gd2hpbGUgZnV0dXJlX2V2ZW50X2lkIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGZyYW1lX2RpZyAzCiAgICA+CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfd2hpbGVANDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwNQogICAgLy8gZnV0dXJlX2VudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KGZ1dHVyZV9ldmVudF9pZCkKICAgIGZyYW1lX2RpZyAzCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MDYKICAgIC8vIGZ1dHVyZV9ldmVudF90eXBlID0gZnV0dXJlX2VudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA3LTUwOAogICAgLy8gIyBPbmx5IHJlZGVtcHRpb24tYmVhcmluZyBldmVudHMgY29udHJpYnV0ZSB0byB0aGUgYW5udWl0eSBkZW5vbWluYXRvci4KICAgIC8vIGlzX3JlZGVtcHRpb25fZXZlbnQgPSBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1BSKSBvciAoCiAgICBwdXNoaW50IDMKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MDctNTExCiAgICAvLyAjIE9ubHkgcmVkZW1wdGlvbi1iZWFyaW5nIGV2ZW50cyBjb250cmlidXRlIHRvIHRoZSBhbm51aXR5IGRlbm9taW5hdG9yLgogICAgLy8gaXNfcmVkZW1wdGlvbl9ldmVudCA9IGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpIG9yICgKICAgIC8vICAgICBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgLy8gICAgIGFuZCBmdXR1cmVfZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKQogICAgLy8gKQogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX3RydWVANDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwOQogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCkKICAgIGZyYW1lX2RpZyA0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA5LTUxMAogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCkKICAgIC8vIGFuZCBmdXR1cmVfZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUxMAogICAgLy8gYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICBmcmFtZV9kaWcgMAogICAgcHVzaGludCAyNQogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwOS01MTAKICAgIC8vIGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfTUQpCiAgICAvLyBhbmQgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IgPiBVSW50NjQoMCkKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX2ZhbHNlQDQxCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF90cnVlQDQwOgogICAgaW50Y18xIC8vIDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX21lcmdlQDQyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTEyCiAgICAvLyBpZiBpc19yZWRlbXB0aW9uX2V2ZW50OgogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANDcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUxMwogICAgLy8gaWYgc2tpcF9maXJzdF9yZWRlbXB0aW9uOgogICAgZnJhbWVfZGlnIDcKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlANDUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUxNAogICAgLy8gc2tpcF9maXJzdF9yZWRlbXB0aW9uID0gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDcKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDQ3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTIxCiAgICAvLyBmdXR1cmVfZXZlbnRfaWQgKz0gVUludDY0KDEpCiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMwogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfd2hpbGVfdG9wQDM2CgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDQ1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTE4CiAgICAvLyBmdXR1cmVfZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIGZyYW1lX2RpZyAwCiAgICBwdXNoaW50IDI1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTE2LTUxOQogICAgLy8gZGlzY291bnRfZmFjdG9yID0gc2VsZi5fZGlzY291bnRfYW5udWl0eV9mYWN0b3IoCiAgICAvLyAgICAgZGlzY291bnRfZmFjdG9yLAogICAgLy8gICAgIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDIKICAgIHN3YXAKICAgIGNhbGxzdWIgX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTIwCiAgICAvLyBkZW5vbWluYXRvciArPSBkaXNjb3VudF9mYWN0b3IKICAgIGZyYW1lX2RpZyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANDcKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX2ZhbHNlQDQxOgogICAgaW50Y18wIC8vIDAKICAgIGIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfbWVyZ2VANDIKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl93aGlsZUA0ODoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUyMwogICAgLy8gYXNzZXJ0IGRlbm9taW5hdG9yID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGZyYW1lX2RpZyAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjQKICAgIC8vIG51bWVyYXRvciA9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUyNQogICAgLy8gaWYgZW50cnkuZmxhZ3MgJiBVSW50NjQoZW51bXMuRkxBR19JTklUSUFMX1BSRikgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDU3CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18yIC8vIDgKICAgICYKICAgIGJueiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1MAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTI2LTUyNwogICAgLy8gIyBTdWJzZXF1ZW50IFBSRiBldmVudHMgYW1vcnRpemUgYm90aCBwcmluY2lwYWwgYW5kIGFscmVhZHkgYWNjcnVlZCBjYXJyeS4KICAgIC8vIG51bWVyYXRvciArPSBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICArCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1MDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUzMAogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUyOC01MzIKICAgIC8vIHJldHVybiBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBudW1lcmF0b3IsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICAgICBkZW5vbWluYXRvciwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAxCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjgwCiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBzZWxmLl9yZWNhbGN1bGF0ZV9hbm51aXR5X3BheW1lbnQoCiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4MC02ODIKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IHNlbGYuX3JlY2FsY3VsYXRlX2FubnVpdHlfcGF5bWVudCgKICAgIC8vICAgICBlbnRyeQogICAgLy8gKQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDMwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njg1CiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODYtNjkwCiAgICAvLyBzZWxmLl9lbWl0X2V4ZWN1dGlvbl9ldmVudCgKICAgIC8vICAgICBlbnRyeT1lbnRyeSwKICAgIC8vICAgICBwYXlvZmY9VUludDY0KDApLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njg4CiAgICAvLyBwYXlvZmY9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4OQogICAgLy8gc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODYtNjkwCiAgICAvLyBzZWxmLl9lbWl0X2V4ZWN1dGlvbl9ldmVudCgKICAgIC8vICAgICBlbnRyeT1lbnRyeSwKICAgIC8vICAgICBwYXlvZmY9VUludDY0KDApLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGNhbGxzdWIgX2VtaXRfZXhlY3V0aW9uX2V2ZW50CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfYnVyeSAxCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAyOToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4NAogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gZW50cnkubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDQxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAzMAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAyMDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY3NAogICAgLy8gZWxpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfSVBDQik6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgMTgKICAgID09CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAyMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc1LTY3NgogICAgLy8gIyBJUENCIGtlZXBzIHByaW5jaXBhbCB1bmNoYW5nZWQgYW5kIG9ubHkgcmVzZXRzIHRoZSBpbnRlcmVzdCBiYXNlLgogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDIzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDEwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjYyCiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9SUkYpOgogICAgZnJhbWVfZGlnIDEwCiAgICBwdXNoaW50IDExCiAgICA9PQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAxNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjYzCiAgICAvLyBuZXh0X3JhdGUgPSBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZQogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2NAogICAgLy8gaWYgbmV4dF9yYXRlID09IFVJbnQ2NCgwKToKICAgIGJueiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAxMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY1CiAgICAvLyBuZXh0X3JhdGUgPSBzZWxmLnJhdGVfcmVzZXRfbmV4dAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDM3IC8vICJyYXRlX3Jlc2V0X25leHQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSA1CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X25leHQgZXhpc3RzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2NgogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPSBuZXh0X3JhdGUKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGZyYW1lX2RpZyA1CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAxOAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAxNDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2OAogICAgLy8gaWYgZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUgIT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDkKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjkKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGZyYW1lX2RpZyA5CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAxOAoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbWl0X2V4ZWN1dGlvbl9ldmVudChlbnRyeTogYnl0ZXMsIHBheW9mZjogdWludDY0LCBzZXR0bGVkX2Ftb3VudDogdWludDY0KSAtPiBieXRlczoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njk2LTcwMgogICAgLy8gZGVmIF9lbWl0X2V4ZWN1dGlvbl9ldmVudCgKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgICosCiAgICAvLyAgICAgZW50cnk6IHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5LAogICAgLy8gICAgIHBheW9mZjogVUludDY0LAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50OiBVSW50NjQsCiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAzIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcwNgogICAgLy8gY29udHJhY3RfaWQ9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25faWQuaWQsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uSUQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcwNwogICAgLy8gZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzA4CiAgICAvLyBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICBmcmFtZV9kaWcgLTMKICAgIGV4dHJhY3QgOCAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MDkKICAgIC8vIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgZnJhbWVfZGlnIC0zCiAgICBleHRyYWN0IDkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzEwCiAgICAvLyBhcHBsaWVkX2F0PUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzEzCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBmcmFtZV9kaWcgLTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcwOAogICAgLy8gZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgaW50Y18yIC8vIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxMwogICAgLy8gc2VsZi5fcGF5b2ZmX3NpZ24oZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSwgcGF5b2ZmKQogICAgZ2V0Ynl0ZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzQyCiAgICAvLyBpZiBwYXlvZmYgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0yCiAgICBibnogX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzQzCiAgICAvLyByZXR1cm4gVUludDY0KGVudW1zLlBBWU9GRl9TSUdOX1BPU0lUSVZFKQogICAgaW50Y18xIC8vIDEKCl9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9wYXlvZmZfc2lnbkA3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzEyLTcxNAogICAgLy8gcGF5b2ZmX3NpZ249YXJjNC5VSW50OCgKICAgIC8vICAgICBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICAvLyApLAogICAgaXRvYgogICAgZHVwCiAgICBiaXRsZW4KICAgIGludGNfMiAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBleHRyYWN0IDcgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE2CiAgICAvLyBjdXJyZW5jeV9pZD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxNwogICAgLy8gc2VxdWVuY2U9ZW50cnkuZXZlbnRfaWQgKyBVSW50NjQoMSksCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzA1LTcxOAogICAgLy8gRXhlY3V0aW9uRXZlbnQoCiAgICAvLyAgICAgY29udHJhY3RfaWQ9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25faWQuaWQsCiAgICAvLyAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgcGF5b2ZmPXBheW9mZiwKICAgIC8vICAgICBwYXlvZmZfc2lnbj1hcmM0LlVJbnQ4KAogICAgLy8gICAgICAgICBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBzZXR0bGVkX2Ftb3VudD1zZXR0bGVkX2Ftb3VudCwKICAgIC8vICAgICBjdXJyZW5jeV9pZD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgc2VxdWVuY2U9ZW50cnkuZXZlbnRfaWQgKyBVSW50NjQoMSksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMAogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAyCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAzCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyA0CiAgICBpdG9iCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMgogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcwNC03MTkKICAgIC8vIGFyYzQuZW1pdCgKICAgIC8vICAgICBFeGVjdXRpb25FdmVudCgKICAgIC8vICAgICAgICAgY29udHJhY3RfaWQ9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25faWQuaWQsCiAgICAvLyAgICAgICAgIGV2ZW50X2lkPWVudHJ5LmV2ZW50X2lkLAogICAgLy8gICAgICAgICBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICAvLyAgICAgICAgIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgICAgICBhcHBsaWVkX2F0PUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gICAgICAgICBwYXlvZmY9cGF5b2ZmLAogICAgLy8gICAgICAgICBwYXlvZmZfc2lnbj1hcmM0LlVJbnQ4KAogICAgLy8gICAgICAgICAgICAgc2VsZi5fcGF5b2ZmX3NpZ24oZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSwgcGF5b2ZmKQogICAgLy8gICAgICAgICApLAogICAgLy8gICAgICAgICBzZXR0bGVkX2Ftb3VudD1zZXR0bGVkX2Ftb3VudCwKICAgIC8vICAgICAgICAgY3VycmVuY3lfaWQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgICAgICBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIC8vICAgICApCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHg5YTMzMmI5NSAvLyBtZXRob2QgIkV4ZWN1dGlvbkV2ZW50KHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDQKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gKFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwgVUludDY0KGVudW1zLkVWVF9QSSkpOgogICAgZnJhbWVfZGlnIDUKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYm56IF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9pZl9ib2R5QDUKICAgIGZyYW1lX2RpZyA1CiAgICBwdXNoaW50IDQKICAgID09CiAgICBieiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUA2CgpfZW1pdF9leGVjdXRpb25fZXZlbnRfaWZfYm9keUA1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzQ1CiAgICAvLyByZXR1cm4gVUludDY0KGVudW1zLlBBWU9GRl9TSUdOX1BPU0lUSVZFKQogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxMwogICAgLy8gc2VsZi5fcGF5b2ZmX3NpZ24oZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSwgcGF5b2ZmKQogICAgYiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fcGF5b2ZmX3NpZ25ANwoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc0NgogICAgLy8gcmV0dXJuIFVJbnQ2NChlbnVtcy5QQVlPRkZfU0lHTl9ORUdBVElWRSkKICAgIHB1c2hpbnQgMjU1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTMKICAgIC8vIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIGIgX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX3BheW9mZl9zaWduQDcKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fcm9sZV9pc19hY3RpdmUocm9sZV9tYXA6IGJ5dGVzLCByb2xlX2FkZHJlc3M6IGJ5dGVzKSAtPiB1aW50NjQ6Cl9yb2xlX2lzX2FjdGl2ZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NwogICAgLy8gZGVmIF9yb2xlX2lzX2FjdGl2ZShzZWxmLCByb2xlX21hcDogdHlwLlJiYWNSb2xlLCByb2xlX2FkZHJlc3M6IEFjY291bnQpIC0+IGJvb2w6CiAgICBwcm90byAyIDEKICAgIHB1c2hieXRlcyAiIgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU4LTYyCiAgICAvLyByZXR1cm4gc2VsZi5faGFzX3JvbGUocm9sZV9tYXAsIHJvbGVfYWRkcmVzcykgYW5kICgKICAgIC8vICAgICByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICkKICAgIGJ6IF9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIEJveE1hcCBlbnRyeSBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYwCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MAogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgPD0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYxCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIEJveE1hcCBlbnRyeSBleGlzdHMKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYwLTYxCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDAKICAgID49CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTktNjEKICAgIC8vIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IF9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQKICAgIGludGNfMSAvLyAxCgpfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU4LTYyCiAgICAvLyByZXR1cm4gc2VsZi5faGFzX3JvbGUocm9sZV9tYXAsIHJvbGVfYWRkcmVzcykgYW5kICgKICAgIC8vICAgICByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICkKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgX3JvbGVfaXNfYWN0aXZlX2Jvb2xfbWVyZ2VANQoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkgLT4gdm9pZDoKX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjUKICAgIC8vIGFzc2VydCBzZWxmLl9pc19hcnJhbmdlcihUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjUyCiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzID09IHNlbGYuYXJyYW5nZXIudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOCAvLyAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcnJhbmdlciBleGlzdHMKICAgID09CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjUKICAgIC8vIGFzc2VydCBzZWxmLl9pc19hcnJhbmdlcihUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKSAtPiB2b2lkOgpfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODMKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5hc3NldF9kZWZhdWx0ZWQsIGVyci5ERUZBVUxURUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0MSAvLyAiYXNzZXRfZGVmYXVsdGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2RlZmF1bHRlZCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBEZWZhdWx0ZWQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpIC0+IHZvaWQ6Cl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4NgogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFzc2V0X3N1c3BlbmRlZCwgZXJyLlNVU1BFTkRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDMzIC8vICJhc3NldF9zdXNwZW5kZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfc3VzcGVuZGVkIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIFN1c3BlbmRlZCBvcGVyYXRpb25zCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZDogdWludDY0KSAtPiB2b2lkOgpfYXNzZXJ0X3ZhbGlkX3JvbGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODgKICAgIC8vIGRlZiBfYXNzZXJ0X3ZhbGlkX3JvbGUoc2VsZiwgcm9sZV9pZDogVUludDY0KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkwCiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICBwdXNoaW50IDIwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MQogICAgLy8gVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIHB1c2hpbnQgMjUKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkyCiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgcHVzaGludCA0MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTMKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIHB1c2hpbnQgNTAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojk0CiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIHB1c2hpbnQgNjAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojk1CiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgcHVzaGludCA3MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTYKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIHB1c2hpbnQgODAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJ6IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX2ZhbHNlQDgKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANzoKICAgIGludGNfMSAvLyAxCgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9tZXJnZUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBhc3NlcnQgLy8gSW52YWxpZCByb2xlIGlkZW50aWZpZXIKICAgIHJldHN1YgoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfZmFsc2VAODoKICAgIGludGNfMCAvLyAwCiAgICBiIF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX21lcmdlQDkK", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="}, "sourceInfo": {"approval": {"pcOffsetMethod": "none", "sourceInfo": [{"pc": [2601], "errorMessage": "ACTUS event not yet executed"}, {"pc": [2358], "errorMessage": "Can not distribute zero units"}, {"pc": [3102, 3109, 3481], "errorMessage": "D-ASA already configured"}, {"pc": [1238, 1939, 2318, 2464, 3733, 3880, 4226, 4372], "errorMessage": "D-ASA not configured"}, {"pc": [3492], "errorMessage": "D-ASA terms not configured"}, {"pc": [6541], "errorMessage": "Defaulted"}, {"pc": [3120], "errorMessage": "Denomination asset is not properly set"}, {"pc": [3135], "errorMessage": "Different settlement asset not supported, must be equal to denomination asset"}, {"pc": [3370, 3377, 3379], "errorMessage": "IED must be set in the future"}, {"pc": [1256, 2008, 2479, 5914], "errorMessage": "IED not yet executed"}, {"pc": [2371, 5297], "errorMessage": "Insufficient remaining D-ASA units"}, {"pc": [2574, 2641], "errorMessage": "Insufficient sender units to transfer"}, {"pc": [1835, 3022, 3040, 3096, 3603, 3641, 5482, 5760, 5820, 6203], "errorMessage": "Invalid ACTUS configuration"}, {"pc": [1948, 2352, 2535, 2550, 2708, 2781, 2844, 2886, 5109, 5234], "errorMessage": "Invalid account holding address"}, {"pc": [4564, 4588, 4612, 4636, 4660, 4717, 4745, 4767, 4789, 4811, 4990, 5008, 5023, 5038, 5053], "errorMessage": "Invalid account role address"}, {"pc": [3082], "errorMessage": "Invalid day-count convention ID"}, {"pc": [1347, 3755, 4089, 5792], "errorMessage": "Invalid event cursor"}, {"pc": [3588, 3654, 3933, 5398], "errorMessage": "Invalid event id"}, {"pc": [3768, 4153, 4160], "errorMessage": "Invalid event type"}, {"pc": [4701, 4980, 6611], "errorMessage": "Invalid role identifier"}, {"pc": [3486, 3666, 3674, 3989, 5413, 5429], "errorMessage": "Invalid schedule page"}, {"pc": [5345], "errorMessage": "No D-ASA units"}, {"pc": [1353, 1864, 2045, 5801], "errorMessage": "No due cashflow to pay"}, {"pc": [5883], "errorMessage": "Not IED event"}, {"pc": [1993, 2326, 2522, 2698, 2754, 2764, 2850, 4188, 4834, 6533], "errorMessage": "Not authorized"}, {"pc": [1474, 1482, 2094, 2168, 2177], "errorMessage": "Not enough funds for the payment"}, {"pc": [3905, 3918], "errorMessage": "Observed event required to execute this action"}, {"pc": [2340, 2388], "errorMessage": "Primary distribution is closed"}, {"pc": [5832], "errorMessage": "Primary distribution is not complete"}, {"pc": [2563], "errorMessage": "Sender and receiver must be different"}, {"pc": [5095, 6549], "errorMessage": "Suspended operations"}, {"pc": [2275, 3631], "errorMessage": "Time events must be sorted in strictly ascending order"}, {"pc": [2496, 2513], "errorMessage": "Transfer is closed"}, {"pc": [2567], "errorMessage": "Transfer units must be greater than zero"}, {"pc": [988], "errorMessage": "Wrong Global Bytes allocation"}, {"pc": [994], "errorMessage": "Wrong Global UInts allocation"}, {"pc": [998], "errorMessage": "Wrong Local Bytes allocation"}, {"pc": [1002], "errorMessage": "Wrong Local UInts allocation"}, {"pc": [1455, 2087], "errorMessage": "account opted into asset"}, {"pc": [6493, 6508], "errorMessage": "check BoxMap entry exists"}, {"pc": [1984, 2022, 2063, 2101, 2392, 2570, 2630, 2656, 5089, 5255], "errorMessage": "check self.account entry exists"}, {"pc": [1536, 1762, 1847, 4283, 5919, 6222], "errorMessage": "check self.accrued_interest exists"}, {"pc": [4852, 6531], "errorMessage": "check self.arranger exists"}, {"pc": [6539], "errorMessage": "check self.asset_defaulted exists"}, {"pc": [6547], "errorMessage": "check self.asset_suspended exists"}, {"pc": [3030, 3475, 3901, 3913, 4231, 5644], "errorMessage": "check self.contract_type exists"}, {"pc": [1504, 4288, 5117, 5195], "errorMessage": "check self.cumulative_interest_index exists"}, {"pc": [1516, 4293, 5128, 5203], "errorMessage": "check self.cumulative_principal_index exists"}, {"pc": [5654], "errorMessage": "check self.dynamic_principal_redemption exists"}, {"pc": [1271, 1284, 1345, 1586, 2578, 2591, 3746, 4082, 4259, 4376, 4389, 4426, 5210, 5790, 5871, 6103, 6241], "errorMessage": "check self.event_cursor exists"}, {"pc": [5143, 5157, 5350, 5379, 5710, 5718, 5745, 5765, 5954, 6067, 6228], "errorMessage": "check self.fixed_point_scale exists"}, {"pc": [5997], "errorMessage": "check self.has_rate_reset_cap exists"}, {"pc": [5970], "errorMessage": "check self.has_rate_reset_floor exists"}, {"pc": [3107, 3491, 4255, 5888], "errorMessage": "check self.initial_exchange_amount exists"}, {"pc": [2376, 2386], "errorMessage": "check self.initial_exchange_date exists"}, {"pc": [1707, 4273, 5686, 5700], "errorMessage": "check self.interest_calculation_base exists"}, {"pc": [1778, 1793], "errorMessage": "check self.next_principal_redemption exists"}, {"pc": [4278, 5678, 5705, 5750], "errorMessage": "check self.nominal_interest_rate exists"}, {"pc": [1953, 1966], "errorMessage": "check self.op_daemon exists"}, {"pc": [1607, 1674, 1699, 1752, 1803, 1811, 1832, 4268, 6207, 6287], "errorMessage": "check self.outstanding_principal exists"}, {"pc": [6005, 6019], "errorMessage": "check self.rate_reset_cap exists"}, {"pc": [5978, 5992], "errorMessage": "check self.rate_reset_floor exists"}, {"pc": [5949], "errorMessage": "check self.rate_reset_multiplier exists"}, {"pc": [6321], "errorMessage": "check self.rate_reset_next exists"}, {"pc": [5962], "errorMessage": "check self.rate_reset_spread exists"}, {"pc": [1460, 2163, 4298], "errorMessage": "check self.reserved_interest exists"}, {"pc": [1465, 1494, 2173, 2188, 4303], "errorMessage": "check self.reserved_principal exists"}, {"pc": [2363, 2411, 4250, 5292, 5825], "errorMessage": "check self.reserved_units_total exists"}, {"pc": [1276, 2583, 3751, 3931, 3949, 4072, 4264, 4381, 5394, 6112], "errorMessage": "check self.schedule_entry_count exists"}, {"pc": [3979], "errorMessage": "check self.schedule_page entry exists"}, {"pc": [1452, 2053, 2081, 6393], "errorMessage": "check self.settlement_asset_id exists"}, {"pc": [1237, 1251, 1938, 2003, 2317, 2336, 2463, 2474, 2758, 3100, 3479, 3732, 3879, 4224, 4371, 5238, 5816, 5909], "errorMessage": "check self.status exists"}, {"pc": [2369, 2422, 4245, 5343, 5374, 5830], "errorMessage": "check self.total_units exists"}, {"pc": [2501, 2511], "errorMessage": "check self.transfer_closure_date exists"}, {"pc": [2484, 2492], "errorMessage": "check self.transfer_opening_date exists"}, {"pc": [3565, 3624], "errorMessage": "index access is out of bounds"}, {"pc": [1922, 2967, 3449, 3984], "errorMessage": "invalid array length header"}, {"pc": [2688, 3437, 4824], "errorMessage": "invalid number of bytes for arc4.bool"}, {"pc": [1930], "errorMessage": "invalid number of bytes for arc4.dynamic_array"}, {"pc": [3464], "errorMessage": "invalid number of bytes for arc4.dynamic_array"}, {"pc": [1916, 2301, 2441, 2449, 2680, 2738, 2746, 2826, 2834, 2877, 2902, 4445, 4469, 4503, 4684, 4866, 4950], "errorMessage": "invalid number of bytes for arc4.static_array"}, {"pc": [1232, 2259, 2268, 2309, 2458, 3427, 3864], "errorMessage": "invalid number of bytes for arc4.uint64"}, {"pc": [4493, 4674, 4940], "errorMessage": "invalid number of bytes for arc4.uint8"}, {"pc": [2939], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.InitialKernelState"}, {"pc": [2928], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.NormalizedActusTerms"}, {"pc": [3875], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.ObservedEventRequest"}, {"pc": [2972], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.Prospectus"}, {"pc": [4514], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.RoleValidity"}, {"pc": [2956], "errorMessage": "invalid tail pointer at index 1 of (uint8[32],(len+utf8[]))"}, {"pc": [2951], "errorMessage": "invalid tuple encoding"}, {"pc": [4051], "errorMessage": "max array length exceeded"}, {"pc": [4237, 6385], "errorMessage": "overflow"}]}, "clear": {"pcOffsetMethod": "none", "sourceInfo": []}}, "templateVariables": {}}""" +_APP_SPEC_JSON = r"""{"arcs": [22, 28], "bareActions": {"call": [], "create": []}, "methods": [{"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "name": "max_event_count"}], "name": "fund_due_cashflows", "returns": {"type": "(uint64,uint64,uint64,uint64,uint64)", "struct": "CashFundingResult"}, "desc": "Reserve due ACTUS cash events into the escrow-style claim ledger.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "name": "holding_address"}, {"type": "byte[]", "name": "payment_info"}], "name": "claim_due_cashflows", "returns": {"type": "(uint64,uint64,uint64,uint64,byte[])", "struct": "CashClaimResult"}, "desc": "Withdraw the holder's already funded ACTUS cash entitlements.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "name": "open_date"}, {"type": "uint64", "name": "closure_date"}], "name": "transfer_set_schedule", "returns": {"type": "uint64"}, "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "name": "holding_address"}, {"type": "uint64", "name": "units"}], "name": "primary_distribution", "returns": {"type": "uint64"}, "desc": "Reserve units for a holder before IED finalizes issuance.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "name": "sender_holding_address"}, {"type": "address", "name": "receiver_holding_address"}, {"type": "uint64", "name": "units"}], "name": "transfer", "returns": {"type": "uint64"}, "desc": "Transfer active units after settling both counterparties to the current cursor.\nReturns the number of units moved. The ACTUS kernel no longer persists a nominal per-unit value on-chain, so transfer results are unit-based.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "bool", "desc": "Suspension status", "name": "suspended"}], "name": "account_suspension", "returns": {"type": "uint64", "desc": "Timestamp of the set account suspension status"}, "desc": "Set account suspension status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "address", "desc": "Account Payment Address", "name": "payment_address"}], "name": "account_open", "returns": {"type": "uint64", "desc": "Timestamp of the account opening"}, "desc": "Open a contract account with a new position and register its payment address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "address", "desc": "Account Payment Address", "name": "payment_address"}], "name": "account_update_payment_address", "returns": {"type": "uint64", "desc": "Timestamp of the account update"}, "desc": "Update the Payment Address of an account", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}], "name": "account_get_position", "returns": {"type": "(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64)", "desc": "Account position", "struct": "AccountPosition"}, "desc": "Get account position", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": [], "create": ["NoOp"]}, "args": [{"type": "address", "desc": "D-ASA Arranger Address", "name": "arranger"}], "name": "contract_create", "returns": {"type": "uint64", "desc": "UNIX timestamp of contract creation"}, "desc": "Create a new D-ASA contract and set the Arranger role", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64)", "desc": "Normalized ACTUS terms", "name": "terms", "struct": "NormalizedActusTerms"}, {"type": "(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "desc": "Initial kernel state (pre-IED)", "name": "initial_state", "struct": "InitialKernelState"}, {"type": "(byte[32],string)", "desc": "Prospectus (informational only)", "name": "prospectus", "struct": "Prospectus"}], "name": "contract_config", "returns": {"type": "uint64", "desc": "UNIX timestamp of contract configuration"}, "desc": "Partial contract configuration with: normalized ACTUS terms, initial kernel\nstate (pre-IED), prospectus (informational only). The contract stays inactive until all schedule pages are configured next.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "name": "schedule_page_index"}, {"type": "bool", "name": "is_last_page"}, {"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[]", "name": "schedule_page"}], "name": "contract_schedule", "returns": {"type": "uint64"}, "desc": "Upload one normalized schedule page.\nThe configuration operation is considered complete only when the last page is stored. At that point `schedule_entry_count` is finalized and the contract moves to `STATUS_PENDING_IED`.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "contract_execute_ied", "returns": {"type": "uint64"}, "desc": "Execute the first due `IED` entry and activate the contract.\n`IED` is the one non-cash event that moves the app from `STATUS_PENDING_IED` to `STATUS_ACTIVE`.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "name": "event_id"}, {"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "name": "payload", "struct": "ObservedEventRequest"}], "name": "apply_non_cash_event", "returns": {"type": "uint64"}, "desc": "Apply the next due non-cash event, optionally appending one first.\nObserved payloads are appended before execution when flagged. Rate reset events require the interest oracle because they can change the running nominal rate; other non-cash events stay arranger-controlled.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "name": "payload", "struct": "ObservedCashEventRequest"}], "name": "append_observed_cash_event", "returns": {"type": "uint64"}, "desc": "Append an arranger-authorized observed cash event to the schedule tail.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "contract_get_state", "returns": {"type": "(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "struct": "KernelState"}, "desc": "Return a readonly snapshot of the generic ACTUS kernel state.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "contract_get_next_due_event", "returns": {"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "struct": "ExecutionScheduleEntry"}, "desc": "Return the next boxed schedule entry, or a zeroed sentinel if ended.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["UpdateApplication"], "create": []}, "args": [], "name": "contract_update", "returns": {"type": "void"}, "desc": "Update D-ASA application.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "New Arranger address", "name": "new_arranger"}], "name": "rbac_rotate_arranger", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Rotate the Arranger address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Operation Daemon address", "name": "address"}], "name": "rbac_set_op_daemon", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Non-Normative: Set the Operation Daemon address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}, {"type": "(uint64,uint64)", "desc": "Role time validity", "name": "validity", "struct": "RoleValidity"}], "name": "rbac_assign_role", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Assign a role to an address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}], "name": "rbac_revoke_role", "returns": {"type": "uint64", "desc": "Timestamp of the role revocation"}, "desc": "Revoke a role from an address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Suspension status", "name": "suspended"}], "name": "rbac_contract_suspension", "returns": {"type": "uint64", "desc": "Timestamp of the set asset suspension status"}, "desc": "Set asset suspension status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "rbac_get_arranger", "returns": {"type": "address", "desc": "Arranger address"}, "desc": "Get Arranger address", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Address to get roles for", "name": "address"}], "name": "rbac_get_address_roles", "returns": {"type": "(bool,bool,bool,bool,bool)", "desc": "Roles mask: (Account Manager, Primary Dealer, Trustee, Authority, Observer)"}, "desc": "Non-normative - Get roles assigned to an address", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}], "name": "rbac_get_role_validity", "returns": {"type": "(uint64,uint64)", "desc": "Role validity", "struct": "RoleValidity"}, "desc": "Get role validity", "events": [], "readonly": true, "recommendations": {}}], "name": "DASA", "state": {"keys": {"box": {}, "global": {"arranger": {"key": "UiNBcnJhbmdlciM=", "keyType": "AVMBytes", "valueType": "address"}, "op_daemon": {"key": "UiNPcERhZW1vbiM=", "keyType": "AVMBytes", "valueType": "address"}, "asset_suspended": {"key": "YXNzZXRfc3VzcGVuZGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "asset_defaulted": {"key": "YXNzZXRfZGVmYXVsdGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "status": {"key": "c3RhdHVz", "keyType": "AVMString", "valueType": "AVMUint64"}, "contract_type": {"key": "Y29udHJhY3RfdHlwZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "prospectus_hash": {"key": "cHJvc3BlY3R1c19oYXNo", "keyType": "AVMString", "valueType": "AVMBytes"}, "prospectus_url": {"key": "cHJvc3BlY3R1c191cmw=", "keyType": "AVMString", "valueType": "AVMString"}, "denomination_asset_id": {"key": "ZGVub21pbmF0aW9uX2Fzc2V0X2lk", "keyType": "AVMString", "valueType": "AVMUint64"}, "settlement_asset_id": {"key": "c2V0dGxlbWVudF9hc3NldF9pZA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "initial_exchange_date": {"key": "aW5pdGlhbF9leGNoYW5nZV9kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "maturity_date": {"key": "bWF0dXJpdHlfZGF0ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "transfer_opening_date": {"key": "dHJhbnNmZXJfb3BlbmluZ19kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "transfer_closure_date": {"key": "dHJhbnNmZXJfY2xvc3VyZV9kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "day_count_convention": {"key": "ZGF5X2NvdW50X2NvbnZlbnRpb24=", "keyType": "AVMString", "valueType": "AVMUint64"}, "total_units": {"key": "dG90YWxfdW5pdHM=", "keyType": "AVMString", "valueType": "AVMUint64"}, "reserved_units_total": {"key": "cmVzZXJ2ZWRfdW5pdHNfdG90YWw=", "keyType": "AVMString", "valueType": "AVMUint64"}, "initial_exchange_amount": {"key": "aW5pdGlhbF9leGNoYW5nZV9hbW91bnQ=", "keyType": "AVMString", "valueType": "AVMUint64"}, "outstanding_principal": {"key": "b3V0c3RhbmRpbmdfcHJpbmNpcGFs", "keyType": "AVMString", "valueType": "AVMUint64"}, "next_principal_redemption": {"key": "bmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbg==", "keyType": "AVMString", "valueType": "AVMUint64"}, "dynamic_principal_redemption": {"key": "ZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbg==", "keyType": "AVMString", "valueType": "AVMUint64"}, "interest_calculation_base": {"key": "aW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "accrued_interest": {"key": "YWNjcnVlZF9pbnRlcmVzdA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "nominal_interest_rate": {"key": "bm9taW5hbF9pbnRlcmVzdF9yYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_spread": {"key": "cmF0ZV9yZXNldF9zcHJlYWQ=", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_multiplier": {"key": "cmF0ZV9yZXNldF9tdWx0aXBsaWVy", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_floor": {"key": "cmF0ZV9yZXNldF9mbG9vcg==", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_cap": {"key": "cmF0ZV9yZXNldF9jYXA=", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_next": {"key": "cmF0ZV9yZXNldF9uZXh0", "keyType": "AVMString", "valueType": "AVMUint64"}, "has_rate_reset_floor": {"key": "aGFzX3JhdGVfcmVzZXRfZmxvb3I=", "keyType": "AVMString", "valueType": "AVMUint64"}, "has_rate_reset_cap": {"key": "aGFzX3JhdGVfcmVzZXRfY2Fw", "keyType": "AVMString", "valueType": "AVMUint64"}, "reserved_principal": {"key": "cmVzZXJ2ZWRfcHJpbmNpcGFs", "keyType": "AVMString", "valueType": "AVMUint64"}, "reserved_interest": {"key": "cmVzZXJ2ZWRfaW50ZXJlc3Q=", "keyType": "AVMString", "valueType": "AVMUint64"}, "cumulative_interest_index": {"key": "Y3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "cumulative_principal_index": {"key": "Y3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXg=", "keyType": "AVMString", "valueType": "AVMUint64"}, "event_cursor": {"key": "ZXZlbnRfY3Vyc29y", "keyType": "AVMString", "valueType": "AVMUint64"}, "schedule_entry_count": {"key": "c2NoZWR1bGVfZW50cnlfY291bnQ=", "keyType": "AVMString", "valueType": "AVMUint64"}, "fixed_point_scale": {"key": "Zml4ZWRfcG9pbnRfc2NhbGU=", "keyType": "AVMString", "valueType": "AVMUint64"}}, "local": {}}, "maps": {"box": {"account_manager": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNBY2NvdW50TWFuYWdlciM="}, "primary_dealer": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNQcmltYXJ5RGVhbGVyIw=="}, "trustee": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNUcnVzdGVlIw=="}, "authority": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNBdXRob3JpdHkj"}, "observer": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNPYnNlcnZlciM="}, "schedule_page": {"keyType": "uint64", "valueType": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[]", "prefix": "UyM="}, "account": {"keyType": "address", "valueType": "AccountPosition", "prefix": "UiNBY2NvdW50Iw=="}}, "global": {}, "local": {}}, "schema": {"global": {"bytes": 4, "ints": 37}, "local": {"bytes": 0, "ints": 0}}}, "structs": {"AccountPosition": [{"name": "payment_address", "type": "address"}, {"name": "units", "type": "uint64"}, {"name": "reserved_units", "type": "uint64"}, {"name": "suspended", "type": "bool"}, {"name": "settled_cursor", "type": "uint64"}, {"name": "interest_checkpoint", "type": "uint64"}, {"name": "principal_checkpoint", "type": "uint64"}, {"name": "claimable_interest", "type": "uint64"}, {"name": "claimable_principal", "type": "uint64"}], "CashClaimResult": [{"name": "interest_amount", "type": "uint64"}, {"name": "principal_amount", "type": "uint64"}, {"name": "total_amount", "type": "uint64"}, {"name": "timestamp", "type": "uint64"}, {"name": "context", "type": "byte[]"}], "CashFundingResult": [{"name": "funded_interest", "type": "uint64"}, {"name": "funded_principal", "type": "uint64"}, {"name": "total_funded", "type": "uint64"}, {"name": "processed_events", "type": "uint64"}, {"name": "timestamp", "type": "uint64"}], "ExecutionScheduleEntry": [{"name": "event_id", "type": "uint64"}, {"name": "event_type", "type": "uint8"}, {"name": "scheduled_time", "type": "uint64"}, {"name": "accrual_factor", "type": "uint64"}, {"name": "redemption_accrual_factor", "type": "uint64"}, {"name": "next_nominal_interest_rate", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "next_outstanding_principal", "type": "uint64"}, {"name": "flags", "type": "uint64"}], "InitialKernelState": [{"name": "status_date", "type": "uint64"}, {"name": "event_cursor", "type": "uint64"}, {"name": "outstanding_principal", "type": "uint64"}, {"name": "interest_calculation_base", "type": "uint64"}, {"name": "nominal_interest_rate", "type": "uint64"}, {"name": "accrued_interest", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "cumulative_interest_index", "type": "uint64"}, {"name": "cumulative_principal_index", "type": "uint64"}], "KernelState": [{"name": "contract_type", "type": "uint8"}, {"name": "status", "type": "uint64"}, {"name": "total_units", "type": "uint64"}, {"name": "reserved_units_total", "type": "uint64"}, {"name": "initial_exchange_amount", "type": "uint64"}, {"name": "event_cursor", "type": "uint64"}, {"name": "schedule_entry_count", "type": "uint64"}, {"name": "outstanding_principal", "type": "uint64"}, {"name": "interest_calculation_base", "type": "uint64"}, {"name": "nominal_interest_rate", "type": "uint64"}, {"name": "accrued_interest", "type": "uint64"}, {"name": "cumulative_interest_index", "type": "uint64"}, {"name": "cumulative_principal_index", "type": "uint64"}, {"name": "reserved_interest", "type": "uint64"}, {"name": "reserved_principal", "type": "uint64"}], "NormalizedActusTerms": [{"name": "contract_type", "type": "uint8"}, {"name": "denomination_asset_id", "type": "uint64"}, {"name": "settlement_asset_id", "type": "uint64"}, {"name": "total_units", "type": "uint64"}, {"name": "notional_principal", "type": "uint64"}, {"name": "initial_exchange_amount", "type": "uint64"}, {"name": "initial_exchange_date", "type": "uint64"}, {"name": "maturity_date", "type": "uint64"}, {"name": "day_count_convention", "type": "uint8"}, {"name": "rate_reset_spread", "type": "uint64"}, {"name": "rate_reset_multiplier", "type": "uint64"}, {"name": "rate_reset_floor", "type": "uint64"}, {"name": "rate_reset_cap", "type": "uint64"}, {"name": "rate_reset_next", "type": "uint64"}, {"name": "has_rate_reset_floor", "type": "bool"}, {"name": "has_rate_reset_cap", "type": "bool"}, {"name": "dynamic_principal_redemption", "type": "bool"}, {"name": "fixed_point_scale", "type": "uint64"}], "ObservedCashEventRequest": [{"name": "event_id", "type": "uint64"}, {"name": "event_type", "type": "uint8"}, {"name": "scheduled_time", "type": "uint64"}, {"name": "accrual_factor", "type": "uint64"}, {"name": "redemption_accrual_factor", "type": "uint64"}, {"name": "next_nominal_interest_rate", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "next_outstanding_principal", "type": "uint64"}, {"name": "flags", "type": "uint64"}], "ObservedEventRequest": [{"name": "event_id", "type": "uint64"}, {"name": "event_type", "type": "uint8"}, {"name": "scheduled_time", "type": "uint64"}, {"name": "accrual_factor", "type": "uint64"}, {"name": "redemption_accrual_factor", "type": "uint64"}, {"name": "observed_rate", "type": "uint64"}, {"name": "next_nominal_interest_rate", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "next_outstanding_principal", "type": "uint64"}, {"name": "flags", "type": "uint64"}], "Prospectus": [{"name": "hash", "type": "byte[32]"}, {"name": "url", "type": "string"}], "RoleValidity": [{"name": "role_validity_start", "type": "uint64"}, {"name": "role_validity_end", "type": "uint64"}]}, "byteCode": {"approval": "DCAFAAEIINwLJjEEFR98dQZzdGF0dXMMZXZlbnRfY3Vyc29yFHNjaGVkdWxlX2VudHJ5X2NvdW50FW91dHN0YW5kaW5nX3ByaW5jaXBhbBFmaXhlZF9wb2ludF9zY2FsZRBhY2NydWVkX2ludGVyZXN0GWludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UKUiNBY2NvdW50IxVub21pbmFsX2ludGVyZXN0X3JhdGUNY29udHJhY3RfdHlwZRRyZXNlcnZlZF91bml0c190b3RhbBJyZXNlcnZlZF9wcmluY2lwYWwLdG90YWxfdW5pdHMZbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbhFyZXNlcnZlZF9pbnRlcmVzdBljdW11bGF0aXZlX2ludGVyZXN0X2luZGV4GmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4C1IjQXJyYW5nZXIjE3NldHRsZW1lbnRfYXNzZXRfaWQXaW5pdGlhbF9leGNoYW5nZV9hbW91bnQMUiNBdXRob3JpdHkjEFIjUHJpbWFyeURlYWxlciMRUiNBY2NvdW50TWFuYWdlciMCUyMLUiNPYnNlcnZlciMLUiNPcERhZW1vbiMVaW5pdGlhbF9leGNoYW5nZV9kYXRlFXRyYW5zZmVyX29wZW5pbmdfZGF0ZRV0cmFuc2Zlcl9jbG9zdXJlX2RhdGUQcmF0ZV9yZXNldF9mbG9vcg5yYXRlX3Jlc2V0X2NhcApSI1RydXN0ZWUjD2Fzc2V0X3N1c3BlbmRlZBxkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uEXJhdGVfcmVzZXRfc3ByZWFkFXJhdGVfcmVzZXRfbXVsdGlwbGllcg9yYXRlX3Jlc2V0X25leHQUaGFzX3JhdGVfcmVzZXRfZmxvb3ISaGFzX3JhdGVfcmVzZXRfY2FwAQAPYXNzZXRfZGVmYXVsdGVkD3Byb3NwZWN0dXNfaGFzaA5wcm9zcGVjdHVzX3VybBVkZW5vbWluYXRpb25fYXNzZXRfaWQNbWF0dXJpdHlfZGF0ZRRkYXlfY291bnRfY29udmVudGlvbgMGgQECAAAxGEAArScSMgNnJxoyA2cnISJnJykiZykiZycKImcnKoAAZycrgABnJywiZycTImcnGyJnJy0iZyccImcnHSJnJy4iZycNImcnCyJnJxQiZycEImcnDiJnJyIiZycHImcnBiJnJwkiZycjImcnJCJnJx4iZycfImcnJSJnJyYiZycnImcnDCJnJw8iZycQImcnESJnKiJnKyJnJwUiZzE1gQQSRDE0gSUSRDE3FEQxNhREgASRTwTrNhoAjgEAxzEZFEQxGEEAsIIYBLRGGMgE54MlKQSUOIcjBGyF4+4EvdGpRAR8DxgSBBT8EO8EdKcpfwQJ1P4UBJqb+oUEhe7TPQSrLA/EBNnyJawEmINQWgSOpudMBAKvVXoEgvcbLQTvBPXTBN80NVAEPb6AvQQePkjnBAEMgpkEdAas0gQacqLuNhoAjhgAVgMhBH0EpwUxBiEGWwazBuYHFAkICh8KmAwEDPYNiQ3ODeYN/g6zD0kPaA9zD70AgASVbXFWNhoAjgEG8QAxGYEEEjEYEERCDa6KAgCL/oEKCIsAMgwNQQAqsYEGshCBBbIZJy+yHicvsh+L/40CAAsABLNC/9syALIBQv/1IrIBQv/viSKAAEcNNhoBSRUkEkQXIillRESIFZ6IFaWIFaoiKWVEgTISFESIEgFBAAtJgWQLIQQIIoj/jyJFBSJFDiJFDUsESwEMQQJZIiplRCIrZUQMQQJNIiplRIgQ00lFEYEJW0lFAzIHDUACN0sPJFVJRRAkEklFBEAAEEsOgQMSQAAISw6BExJBAj8jQQIUSw8iWyIqZUQSREsBMgcOREsCQAHtSw6BExJAAeUiRQtLDyRVSUUQgQMSQAFlSw6BExJAAV0iRQZLD4ExW0UIiBFbQAD+SwdFCUsKiBAZSwaIEBRLAYgQLklOAkUPSYgQJUlFC0sCSwEISUUJMgoiJxNlRHAARCInD2VEIicMZURLAQhLAksBD0RPAkwJTwIPRE8DCCcPTGciJwxlRAgnDExnIicQZURPAggnEExnIicRZUQIJxFMZ0sPJFWBAxJBAHoiJwZlREsQiBDnRRIIJwZMZ4gQx0EACksPJFWBExJBAAlLD4EpWycOTGcnBEsIZycHSwlnIiplRCMIKkxnSw9XCAGAAROoQQARIicEZURAAAkpgcgBZycHImdLD0sESYgTVEhLDUsMCEUOSwxLBwhFDUsEIwhFBUL+dycGImdC/5BLDyRVSUUQgQMSQQAQIicEZURLBglJRQlFCUL+6UsOJBJBABMiJwRlTEUJRCInB2VMRQpEQv7PSw6BExJAAAdLB0UJQv7AIkUIIkUJQv63iBAIQQBWSw6BExJBAAoiJwRlREUGQv6OIicGZURLEIgP/0USCElFCyInDmVED0EABiJFBkL+byInDmVESwoJSUUIIicEZUQNQQAKIicEZURFBkL+UUsGRQZC/kpLD4ExWyInBGVESg5ETAlFBkL+NiInBmVESxCID6dFEghFC0L+DEsESURLDklLD0lOAwgyB08CFk8DFlBPAhZQTwIWUEwWUChMULAjQyJC/b6AAEcCNhoBRwIVJRJENhoCSSJZgQIISwEVEkRXAgBMIillREQnCExQSb1FAUQiJxplRDIDE0EAIjEAIicaZUQSQAAVMQBLAxJAAA0xAEsBvkRXACASQQEAI0SIEpaIEpsiKWVEgTISFERLAkmIDUuIDM5GAkm+REmBSVtJTgJFCEmBUVtJRQhPAghJRQZEVwAgIicTZURwAEUBQQC3Sb5EgYADU0AArSNBAHgyCiInE2VETEsBcABESwVJTgIPREsCSU4DvkRJVwAgsTIATwOyEkyyFE8CshGBBLIQsgGzSYFJW0lOAkUJSYFRW0lOA0UJIhZMSwFcSUxcUU8DTL8iJw9lRElLAg9EIicMZURLAw9ETAknD0xnIicMZURMCScMTGdLBUlLBklOAwgyB08CFk8DFlBPAhZQTBZQSwJJFRZXBgJMUEyAAgAiUExQKExQsCNDIkL/UCJC/v02GgFJFSQSRBc2GgJJFSQSRBeIEXhKDEQnHE8CZycdTGcyBxYoTFCwI0M2GgFJFSUSRDYaAkkVJBJEF0lOAiIpZUREJxYxAIgRD0SIEUmIEU4iKWVEgTISRCcISwJQSU4DvUUBREyIC2pJRCInC2VECCInDWVEDkQiJxtlREEACTIHIicbZUQOREcCvkSBKFtLA0lOAwgWgShMuyInC2VECCcLSwFnIicNZURMCRYoTFCwI0MiSTYaAUkVJRJENhoCSRUlEkQ2GgNHAhUkEkQXIillRESIEL+IEMQiKWVEgTISFEQiJxxlREEACSInHGVEMgcORCInHWVEQQAJMgciJx1lRAxEMQBLBElOAhJEJwhLAVBJRQhJvUUBRCcISwVJTgJQSUUJvUUBREsCiAqjSYgKn08CE0RLAUlETL5EJVsORCIqZUQiK2VED0AADiIqZUSIC7CBCVsyBw1ESwNJiAr7SwNJTgKICvOICnZGAogKcUYCSwVJvkQlW0sCSU4CSwEOREsBCRZPAiVPArtLBUm+RCVbTwIIFiVMuyhLAlCwI0M2GgFJFSUSRDYaAkkVIxJEIlMnFTEAiA+cRCcITwJQSb1FAURJgTAjuiJPA1SBMEy7MgcWKExQsCNDNhoBSRUlEkQ2GgJJFSUSRCcXMQCID2REIillRIHIARIURIgPlIgPmScITwJQSb1FARREIhZPAksBUEsBUCcoUEsBUEsBUEsBUEsBUExQvzIHFihMULAjQzYaAUkVJRJENhoCSRUlEkQnCEsCUEm9RQFEMQBPAxJEiA8+iA9DIk8CuzIHFihMULAjQzYaAUkVJRJEJwhMUEm9RQFEvkgoTFCwI0M2GgFJFSUSRCcSTGcyBxYoTFCwI0OAAEk2GgFHAhWBaxJENhoCSU4CFYFIEkQ2GgNJTgJJFUsBJVlJgSISRE8CTEsCUklOAyJZgSQIEkSIDroiVUknCksBZ0EAIkkjEkAAHEmBAhJAABVJgQMSQAAOSYEEEkAAB0mBBRJBAYcjRCInCmVMRQJESwRJgSFbSUUIRIE5VUlFCEEAH0sGIxJAABhLBoECEkAAEEsGgQMSQAAISwaBBBJBAUcjREkjE0EACEsEgZIGUxREIillRBREIicUZUQUREsESSNbSXELRQFEJyxLAWdLAYEJW0lPAhJEJxNLAWexMgAyCiKyErIUTLIRgQSyELIBs0mBEVsnDUxnJwsiZycuSwhnSYEpWycbSwFnSwGBMVsnLUsBZ0sGSU4CgTBbJw5MZycUSwpnSwOBkgZTJyJMZ0sBgRBbJwRMZ0sBgShbJwZMZ0sBJVsnCUxnSwGBGFsnB0xnSwOBOlsnI0xnSwOBQlsnJExnSwOBSlsnHkxnSwOBUlsnH0xnSwOBWlsnJUxnSwOBkAZTJyZMZ0sDgZEGUycnTGdPA4FjWycFTGdLASRbKkxnSwGBOFsnEExnSwGBQFsnEUxnJw8iZycMImdLAjIHDURMIltLAgxEDERLAlcAICcqTGdLAVcCACcrTGcyBxYoTFCwI0MiQv62IkL+diKAAEcCNhoBSRUkEkQXSTYaAkkVIxJEIlNMNhoDSU4CSSJZSU4DSYFBC4ECCE8CFRJEiAzNIicKZUxOA0QiKWVEFERJgRAORCInFGVEREyBEAtMgWQLIQQIIoj2tiJJSwQMQQCLSwRXAgBJRQxLAUlOAoFBC4FBWEkkVUlOAkUNSSJbSUUNSwVPBAhLARJESwVPA4gIGUyBCVtJRQpEQQAXSUEAJUkjCYFBC0sLTIFBWIEJW0sIDkRLCEAABUsJIxJESSMIRQFC/5RLBklEIwkWJxhMUEm9RQFESSKBAroXSUQjCYFBC4ECCIFBukL/wUsGFicYTFBJvEhLBb9LBUEADEsBSwQIK0xnKYEyZzIHFihMULAjQyIpZUREiAvjiAvqiAvvIiplRCIrZURLAQ1EiAdHSVcIAUmAAQGoREsBVwAISwJXCQhLA1cRCEsEVxkISwVXIQhLBlcpCEsHVzEISwhXOQhPB08IUE8HUE8GUE8FUCIWUE8EUE8DUE8CUExQiAh5RgIyBxYoTFCwI0MiRwSAAEk2GgFJFSQSRBc2GgJHAhWBSRJEIillRESIC1uIC2CBQVtJgQQaQQCwIicKZUSBBRJEiAs4IicKZURJgQUSREsCSSJbSUUHIitlRBJESVcIAUUMJFWIBsIiK2VEgRAKJzBFBxYnGExQSUUJvUUBQQAHSwe+TEUHREsFSSJZSYEQDERLA0lXCQhLAVcRCEsCVxkISwNXKQhLBFcxCE8FVzkISwsWSxJQTwZQTwVQTwRQTwNQTwJQTFBLAxZQTwJMUEwjCBZXBgJcAEsISbxITL8iK2VEIwgrTGciKmVESwNJTwISRIgF/0lFCElXCAFFCiRVSUUGIxJAAChLBIEEEkAAIEsEgQwSQAAYSwSBCxJAABBLBIESEkAACEsEgQUSQQBBI0RLCIABAalESwSBDBJAAAhLBIELEkEAJCNBABonGTEAiAnzREsGSwKIBxtGAjIHFihMULAjQ4gKEUL/6CJC/9kiQv+8Ikk2GgFHAhWBQRJEIillRESICfKICfmICf4iKWVEgTISFEQiJwplRIEFEkRJIltJTgIiK2VETEsBEkRLAVcIAUlOA4ABA6hETIE5W0lOAiMaREEAEyIrZUQjCYgFIYEJW0sEgQlbDkQiK2VEgRAKJzBFBhYnGExQSUUHvUUBQQAHSwW+TEUGREsESSJZSYEQDERLBUlXCQhLAVcRCEsCVxkISwNXIQhLBFcpCE8FVzEISwoWSwpQTwZQTwVQTwRQTwNQTwJQTFBLAxZQTwJMUEwjCBZXBgJcAEsGSbxITL8iK2VEIwgrTGcyBxYoTFCwI0MiKWVESUQiJwplRBZJkyQORFcHASInDWVEIicLZUQiJxRlRCIqZUQiK2VEIicEZUQiJwdlRCInCWVEIicGZUQiJxBlRCInEWVEIicPZUQiJwxlRE8OFk8OTFBPDRZQTwwWUE8LFlBPChZQTwkWUE8IFlBPBxZQTwYWUE8FFlBPBBZQTwMWUE8CFlBMFlAoTFCwI0MiKWVERCIqZUQiK2VED0EAJSIqZUQWJyhQIhZMSwFQSwFQSwFQSwFQSwFQSwFQTFAoTFCwI0MiKmVEiAO9Qv/wiAg+I0M2GgFJFSUSRIgIMScSTGcyBxYoTFCwI0M2GgFJFSUSRIgIGScaTGcyBxYoTFCwI0M2GgFJFSMSRDYaAklOAhUlEkQ2GgNJTgIVgRASRIgH7IgH8xdHAogH/YEUEkEADicSSwNnMgcWKExQsCNDSYEoEkEAEScXSwNQSb1FARRESwK/Qv/fSYEyEkEAEScWSwNQSb1FARRESwK/Qv/HSYE8EkEAEScgSwNQSb1FARRESwK/Qv+vSYFGEkEAEScVSwNQSb1FARRESwK/Qv+XSYFQEkH/kCcZSwNQSb1FARRESwK/Qv9/NhoBSRUjEkQ2GgJJTgIVJRJEiAdCiAdJF0cCiAdTSYEUE0SBKBJBABUnF0sCUEm9RQFEvEgyBxYoTFCwI0NJgTISQQAPJxZLAlBJvUUBRLxIQv/hSYE8EkEADycgSwJQSb1FAUS8SEL/y0mBRhJBAA8nFUsCUEm9RQFEvEhC/7VJgVASQf+uJxlLAlBJvUUBRLxIQv+fNhoBSRUjEkQiUycVMQCIBnxEJyFMZzIHFihMULAjQyInEmVEKExQsCNDNhoBSRUlEkQnF0sBiAZUJxZLAogGTScgSwOIBkYnFUsEiAY/JxlPBYgGOCcoIk8GVCNPBVSBAk8EVIEDTwNUgQRPAlQoTFCwI0M2GgFJFSMSRDYaAklOAhUlEkQXSYgGUIMGFCgyPEZQTwaOBgBPAEAAMQAiABMAAQAnGUsBUEm9RQFEvkgoTFCwI0MnFUsBUEm9RQFEvkhC/+snIEsBUEm9RQFEvkhC/9wnFksBUEm9RQFEvkhC/80nF0sBUEm9RQFEvkhC/76AEAAAAAAAAAAAAAAAAAAAAABC/6mKAQAnCIv/UL5EgYADUxREiYoBAicIi/9QSb1FAURJvkgiJxBlREsBgTlbCSInEWVESwKBQVsJSwIlWyInBWVETwNLAk8CiACYIicFZURPA08DTwKIAIpLAoFJW0sCCBZPA0xcSUmBUVtLAggWXFEiJxBlRBZcOSInEWVEFlxBIiplRBZcMU8DTL+JigEAIoAAJwiL/1BJvUUBRCIpZUSBMhJBAAGJiwK+TElOAowARIEoW0mMAUAAAYmLAEklW4sBSU4DCBZcICIWXCiLAky/IicLZURJSwIPREwJJwtMZ4mKAwGL/UEABYv+QAACIomL/Yv+HYv/l4mKAQGL/0AAAiKJIicNZURJRCInBWVEi/9MTwKI/8qJigEBi/9AAAIiiSInDWVEIicFZUSL/0yI/6+JigEBIitlRIv/DUSL/4EQChYnGExQSb1FAUSL/4EQGEsBIoECuhdLAQ1EgUELgQIIgUG6iYoCAIv/IxJAAB+L/yQSQAAYi/+BExJAABCL/4EMEkAACIv/gQsSQQADI0SJi/5AAAQiQv/1i/6BAxJAAAiL/oECEkEAGIv/gQMSQAAIi/+BEhJBAAQjQv/RIkL/zYv+IxJBACCL/4EDEkAAEIv/gRISQAAIi/+BBRJBAAQjQv+qIkL/pov+gQQSQQAoi/+BAxJAABiL/4EEEkAAEIv/gRISQAAIi/+BBRJBAAQjQv96IkL/dov+gQUSQQAIi/+BAxJC/2YiQv9iIicKZUQjEkEACiInImVEQQACI4kiiYoBAov/gRFbSUEAECInCWVEQQAIIicHZURAAAYii/9PAokiJwdlRCInCWVEIicFZUSI/mgiJwVlRIsATIj+XYv/TwKJigIBi/9AAAOL/okiJwVlRCInCWVEi/9LAoj+PAhJRCInBWVEi/5MTwKI/iyJigICIoAARwiL/iJbIiplRBJEi/6BCVsyBw5Ei/4kVUkjEklBAF4iKWVEgTISRCInC2VEIicNZUQSRIv+gTFbJwRLAWcnB0xni/6BIVsnCUxnJwYiZ4v+gSlbJw5MZyIqZUQjCCpMZymBZGeLC0QiJxRlRIv+TCKIAdpJjP6L/4wBjACJIillRIEyEhREIicGZUSL/oj++Iz+CCcGTGeLCoEMEkEBeIv/gSFbIickZUQiJwVlRIj9cyInI2VECIwGIicmZURBABMiJx5lRIsGDUEACCInHmVMjAZEIicnZURBABMiJx9lRIsGDEEACCInH2VMjAZEJwmLBmeLCoEEEkEBB4v+gTFbJwRLAWcnB0xniP5lQQDniwqBBRJBAMUiK2VEIiplRAmBZAshBAgiiOvjIicFZUyMAkQijAEijAeL/oEZW0mMCEEAD4sCiwiI/oFJjAIjjAeMASIqZUQjCIwDIitlRIsDDUEAUosDiP0MSYwAJFVJjASBAxJAABCLBIETEkEAM4sAgRlbQQArI0EACIsHQQAMIowHiwMjCIwDQv++iwCBGVuLAkyI/iRJjAKLAQiMAUL/4SJC/9KLAUQiJwRlRIv+gTlbJBpAAAYiJwZlRAgiJwVlRIsBiPxLJw5MZyIqZUQjCCpMZ4v+IkmIAGBJjP6L/4wBjACJi/6BKVsnDkxnQv/aiwqBEhJB/v8iJwRlRCcHTGdC/vOLCoELEkEAG4v+gSFbSYwFQAAIIiclZUyMBUQnCYsFZ0L+uov+gSFbSYwJQf6vJwmLCWdC/qeKAwEyCIv9IluL/VcIAYv9VwkIMgeL/SRVi/5AAEUjFkmTJA5EVwcBIicTZUSLAUkjCIsAFk8CFlCLAlCLA1CLBBZQi/4WUE8DUIv/FlBPAhZQTBZQgASaMyuVTFCwi/2MAImLBSMSQAAIiwWBBBJBAAQjQv+pgf8BQv+jigIBgACL/ov/UEm9RQFBAB+LAb5EIlsyB0mMAA5BABCLAb5EJFuLAA9BAAQjjACJIkL/+TEAIicSZUQSRIkiJyllRBREiSInIWVEFESJigEAi/+BFBJAADCL/4EZEkAAKIv/gSgSQAAgi/+BMhJAABiL/4E8EkAAEIv/gUYSQAAIi/+BUBJBAAMjRIkiQv/6", "clear": "DIEBQw=="}, "desc": "Debt Algorand Standard Application.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "networks": {}, "source": {"approval": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCAzMiAxNTAwCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUgInN0YXR1cyIgImV2ZW50X2N1cnNvciIgInNjaGVkdWxlX2VudHJ5X2NvdW50IiAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIiAiZml4ZWRfcG9pbnRfc2NhbGUiICJhY2NydWVkX2ludGVyZXN0IiAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIgMHg1MjIzNDE2MzYzNmY3NTZlNzQyMyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIiAiY29udHJhY3RfdHlwZSIgInJlc2VydmVkX3VuaXRzX3RvdGFsIiAicmVzZXJ2ZWRfcHJpbmNpcGFsIiAidG90YWxfdW5pdHMiICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIiAicmVzZXJ2ZWRfaW50ZXJlc3QiICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IiAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiIDB4NTIyMzQxNzI3MjYxNmU2NzY1NzIyMyAic2V0dGxlbWVudF9hc3NldF9pZCIgImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IiAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzIDB4NTIyMzQxNjM2MzZmNzU2ZTc0NGQ2MTZlNjE2NzY1NzIyMyAweDUzMjMgMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzIDB4NTIyMzRmNzA0NDYxNjU2ZDZmNmUyMyAiaW5pdGlhbF9leGNoYW5nZV9kYXRlIiAidHJhbnNmZXJfb3BlbmluZ19kYXRlIiAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIiAicmF0ZV9yZXNldF9mbG9vciIgInJhdGVfcmVzZXRfY2FwIiAweDUyMjM1NDcyNzU3Mzc0NjU2NTIzICJhc3NldF9zdXNwZW5kZWQiICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIiAicmF0ZV9yZXNldF9zcHJlYWQiICJyYXRlX3Jlc2V0X211bHRpcGxpZXIiICJyYXRlX3Jlc2V0X25leHQiICJoYXNfcmF0ZV9yZXNldF9mbG9vciIgImhhc19yYXRlX3Jlc2V0X2NhcCIgMHgwMCAiYXNzZXRfZGVmYXVsdGVkIiAicHJvc3BlY3R1c19oYXNoIiAicHJvc3BlY3R1c191cmwiICJkZW5vbWluYXRpb25fYXNzZXRfaWQiICJtYXR1cml0eV9kYXRlIiAiZGF5X2NvdW50X2NvbnZlbnRpb24iIDB4MDY4MTAxIDB4MDAwMAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4LTI5CiAgICAvLyAjIFJCQUMgUm9sZXMKICAgIC8vIHNlbGYuYXJyYW5nZXIgPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX0FSUkFOR0VSKQogICAgYnl0ZWMgMTggLy8gMHg1MjIzNDE3MjcyNjE2ZTY3NjU3MjIzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzAKICAgIC8vIHNlbGYub3BfZGFlbW9uID0gR2xvYmFsU3RhdGUoQWNjb3VudCgpLCBrZXk9Y3N0LlBSRUZJWF9JRF9PUF9EQUVNT04pCiAgICBieXRlYyAyNiAvLyAweDUyMjM0ZjcwNDQ2MTY1NmQ2ZjZlMjMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo0Ny00OAogICAgLy8gIyBELUFTQSBHb3Zlcm5hbmNlCiAgICAvLyBzZWxmLmFzc2V0X3N1c3BlbmRlZCA9IEZhbHNlCiAgICBieXRlYyAzMyAvLyAiYXNzZXRfc3VzcGVuZGVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NDkKICAgIC8vIHNlbGYuYXNzZXRfZGVmYXVsdGVkID0gRmFsc2UKICAgIGJ5dGVjIDQxIC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU2LTU3CiAgICAvLyAjIENvbnRyYWN0CiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwLTYxCiAgICAvLyAjIFByb3NwZWN0dXMgKEluZm9ybWF0aW9uYWwpCiAgICAvLyBzZWxmLnByb3NwZWN0dXNfaGFzaCA9IEJ5dGVzKCkKICAgIGJ5dGVjIDQyIC8vICJwcm9zcGVjdHVzX2hhc2giCiAgICBwdXNoYnl0ZXMgMHgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MgogICAgLy8gc2VsZi5wcm9zcGVjdHVzX3VybCA9IFN0cmluZygpCiAgICBieXRlYyA0MyAvLyAicHJvc3BlY3R1c191cmwiCiAgICBwdXNoYnl0ZXMgIiIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NC02NQogICAgLy8gIyBEZW5vbWluYXRpb24KICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gQXNzZXQoKQogICAgYnl0ZWMgNDQgLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjYKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCA9IEFzc2V0KCkKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OC02OQogICAgLy8gIyBUaW1lCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgMjcgLy8gImluaXRpYWxfZXhjaGFuZ2VfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzAKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgNDUgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxCiAgICAvLyBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgMjggLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIKICAgIC8vIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlID0gdHlwLlRpbWVTdGFtcCgpCiAgICBieXRlYyAyOSAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NC03NQogICAgLy8gIyBEYXkgQ291bnQgQ29udmVudGlvbgogICAgLy8gc2VsZi5kYXlfY291bnRfY29udmVudGlvbiA9IFVJbnQ2NCgpCiAgICBieXRlYyA0NiAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc3LTc4CiAgICAvLyAjIFVuaXRzCiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzID0gVUludDY0KCkKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPSBVSW50NjQoKQogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MS04MgogICAgLy8gIyBQcmluY2lwYWwKICAgIC8vIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPSBVSW50NjQoKQogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MwogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBVSW50NjQoKQogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NAogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gVUludDY0KCkKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NQogICAgLy8gc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gRmFsc2UKICAgIGJ5dGVjIDM0IC8vICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4Ny04OAogICAgLy8gIyBJbnRlcmVzdAogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gVUludDY0KCkKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg5CiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgPSBVSW50NjQoKQogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTEtOTIKICAgIC8vICMgSW50ZXJlc3QgUmF0ZXMKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTMKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQgPSBVSW50NjQoKQogICAgYnl0ZWMgMzUgLy8gInJhdGVfcmVzZXRfc3ByZWFkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NAogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIgPSBVSW50NjQoKQogICAgYnl0ZWMgMzYgLy8gInJhdGVfcmVzZXRfbXVsdGlwbGllciIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTUKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9mbG9vciA9IFVJbnQ2NCgpCiAgICBieXRlYyAzMCAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTYKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9jYXAgPSBVSW50NjQoKQogICAgYnl0ZWMgMzEgLy8gInJhdGVfcmVzZXRfY2FwIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NwogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X25leHQgPSBVSW50NjQoKQogICAgYnl0ZWMgMzcgLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTgKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgPSBGYWxzZQogICAgYnl0ZWMgMzggLy8gImhhc19yYXRlX3Jlc2V0X2Zsb29yIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OQogICAgLy8gc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgPSBGYWxzZQogICAgYnl0ZWMgMzkgLy8gImhhc19yYXRlX3Jlc2V0X2NhcCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAxLTEwMgogICAgLy8gIyBQcmltYXJ5IERpc3RyaWJ1dGlvbgogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgPSBVSW50NjQoKQogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAzCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0ID0gVUludDY0KCkKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA1LTEwNgogICAgLy8gIyBDdW11bGF0aXZlIFBlci1Vbml0IEZpeGVkLVBvaW50IEluZGV4ZXMKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4ID0gVUludDY0KCkKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1CiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciA9IFVJbnQ2NCgpCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNgogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA9IFVJbnQ2NCgpCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE4LTExOQogICAgLy8gIyBTY2FsaW5nCiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlID0gVUludDY0KCkKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6MjMKICAgIC8vIGFzc2VydCBUeG4uZ2xvYmFsX251bV9ieXRlX3NsaWNlID09IGNmZy5HTE9CQUxfQllURVMsIGVyci5XUk9OR19HTE9CQUxfQllURVMKICAgIHR4biBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgQnl0ZXMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjI0CiAgICAvLyBhc3NlcnQgVHhuLmdsb2JhbF9udW1fdWludCA9PSBjZmcuR0xPQkFMX1VJTlRTLCBlcnIuV1JPTkdfR0xPQkFMX1VJTlRTCiAgICB0eG4gR2xvYmFsTnVtVWludAogICAgcHVzaGludCAzNwogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgVUludHMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBhc3NlcnQgVHhuLmxvY2FsX251bV9ieXRlX3NsaWNlID09IGNmZy5MT0NBTF9CWVRFUywgZXJyLldST05HX0xPQ0FMX0JZVEVTCiAgICB0eG4gTG9jYWxOdW1CeXRlU2xpY2UKICAgICEKICAgIGFzc2VydCAvLyBXcm9uZyBMb2NhbCBCeXRlcyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6MjYKICAgIC8vIGFzc2VydCBUeG4ubG9jYWxfbnVtX3VpbnQgPT0gY2ZnLkxPQ0FMX1VJTlRTLCBlcnIuV1JPTkdfTE9DQUxfVUlOVFMKICAgIHR4biBMb2NhbE51bVVpbnQKICAgICEKICAgIGFzc2VydCAvLyBXcm9uZyBMb2NhbCBVSW50cyBhbGxvY2F0aW9uCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kX2FzYS9jb250cmFjdC5weTo4LTE4CiAgICAvLyBjbGFzcyBEQVNBKAogICAgLy8gICAgIFBheW1lbnRBZ2VudCwKICAgIC8vICAgICBUcmFuc2ZlckFnZW50LAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gICAgIGF2bV92ZXJzaW9uPTEyLAogICAgLy8gKToKICAgIHB1c2hieXRlcyAweDkxNGYwNGViIC8vIG1ldGhvZCAiY29udHJhY3RfdXBkYXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9jb250cmFjdF91cGRhdGVfcm91dGVANAoKbWFpbl9zd2l0Y2hfY2FzZV9uZXh0QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6OC0xOAogICAgLy8gY2xhc3MgREFTQSgKICAgIC8vICAgICBQYXltZW50QWdlbnQsCiAgICAvLyAgICAgVHJhbnNmZXJBZ2VudCwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBhdm1fdmVyc2lvbj0xMiwKICAgIC8vICk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBieiBtYWluX2NyZWF0ZV9Ob09wQDMyCiAgICBwdXNoYnl0ZXNzIDB4YjQ0NjE4YzggMHhlNzgzMjUyOSAweDk0Mzg4NzIzIDB4NmM4NWUzZWUgMHhiZGQxYTk0NCAweDdjMGYxODEyIDB4MTRmYzEwZWYgMHg3NGE3Mjk3ZiAweDA5ZDRmZTE0IDB4OWE5YmZhODUgMHg4NWVlZDMzZCAweGFiMmMwZmM0IDB4ZDlmMjI1YWMgMHg5ODgzNTA1YSAweDhlYTZlNzRjIDB4MDJhZjU1N2EgMHg4MmY3MWIyZCAweGVmMDRmNWQzIDB4ZGYzNDM1NTAgMHgzZGJlODBiZCAweDFlM2U0OGU3IDB4MDEwYzgyOTkgMHg3NDA2YWNkMiAweDFhNzJhMmVlIC8vIG1ldGhvZCAiZnVuZF9kdWVfY2FzaGZsb3dzKHVpbnQ2NCkodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImNsYWltX2R1ZV9jYXNoZmxvd3MoYWRkcmVzcyxieXRlW10pKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxieXRlW10pIiwgbWV0aG9kICJ0cmFuc2Zlcl9zZXRfc2NoZWR1bGUodWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInByaW1hcnlfZGlzdHJpYnV0aW9uKGFkZHJlc3MsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidHJhbnNmZXIoYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgImFjY291bnRfc3VzcGVuc2lvbihhZGRyZXNzLGJvb2wpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X29wZW4oYWRkcmVzcyxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAiYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzKGFkZHJlc3MsYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgImFjY291bnRfZ2V0X3Bvc2l0aW9uKGFkZHJlc3MpKGFkZHJlc3MsdWludDY0LHVpbnQ2NCxib29sLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJjb250cmFjdF9jb25maWcoKHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LGJvb2wsYm9vbCxib29sLHVpbnQ2NCksKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSwoYnl0ZVszMl0sc3RyaW5nKSl1aW50NjQiLCBtZXRob2QgImNvbnRyYWN0X3NjaGVkdWxlKHVpbnQ2NCxib29sLCh1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KVtdKXVpbnQ2NCIsIG1ldGhvZCAiY29udHJhY3RfZXhlY3V0ZV9pZWQoKXVpbnQ2NCIsIG1ldGhvZCAiYXBwbHlfbm9uX2Nhc2hfZXZlbnQodWludDY0LCh1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkpdWludDY0IiwgbWV0aG9kICJhcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudCgodWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkpdWludDY0IiwgbWV0aG9kICJjb250cmFjdF9nZXRfc3RhdGUoKSh1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAiY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50KCkodWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgInJiYWNfcm90YXRlX2FycmFuZ2VyKGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX3NldF9vcF9kYWVtb24oYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgInJiYWNfYXNzaWduX3JvbGUodWludDgsYWRkcmVzcywodWludDY0LHVpbnQ2NCkpdWludDY0IiwgbWV0aG9kICJyYmFjX3Jldm9rZV9yb2xlKHVpbnQ4LGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX2NvbnRyYWN0X3N1c3BlbnNpb24oYm9vbCl1aW50NjQiLCBtZXRob2QgInJiYWNfZ2V0X2FycmFuZ2VyKClhZGRyZXNzIiwgbWV0aG9kICJyYmFjX2dldF9hZGRyZXNzX3JvbGVzKGFkZHJlc3MpKGJvb2wsYm9vbCxib29sLGJvb2wsYm9vbCkiLCBtZXRob2QgInJiYWNfZ2V0X3JvbGVfdmFsaWRpdHkodWludDgsYWRkcmVzcykodWludDY0LHVpbnQ2NCkiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBmdW5kX2R1ZV9jYXNoZmxvd3MgY2xhaW1fZHVlX2Nhc2hmbG93cyB0cmFuc2Zlcl9zZXRfc2NoZWR1bGUgcHJpbWFyeV9kaXN0cmlidXRpb24gdHJhbnNmZXIgYWNjb3VudF9zdXNwZW5zaW9uIGFjY291bnRfb3BlbiBhY2NvdW50X3VwZGF0ZV9wYXltZW50X2FkZHJlc3MgYWNjb3VudF9nZXRfcG9zaXRpb24gY29udHJhY3RfY29uZmlnIGNvbnRyYWN0X3NjaGVkdWxlIGNvbnRyYWN0X2V4ZWN1dGVfaWVkIGFwcGx5X25vbl9jYXNoX2V2ZW50IGFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50IGNvbnRyYWN0X2dldF9zdGF0ZSBjb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnQgcmJhY19yb3RhdGVfYXJyYW5nZXIgcmJhY19zZXRfb3BfZGFlbW9uIHJiYWNfYXNzaWduX3JvbGUgcmJhY19yZXZva2Vfcm9sZSByYmFjX2NvbnRyYWN0X3N1c3BlbnNpb24gcmJhY19nZXRfYXJyYW5nZXIgcmJhY19nZXRfYWRkcmVzc19yb2xlcyByYmFjX2dldF9yb2xlX3ZhbGlkaXR5CiAgICBlcnIKCm1haW5fY3JlYXRlX05vT3BAMzI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6OC0xOAogICAgLy8gY2xhc3MgREFTQSgKICAgIC8vICAgICBQYXltZW50QWdlbnQsCiAgICAvLyAgICAgVHJhbnNmZXJBZ2VudCwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBhdm1fdmVyc2lvbj0xMiwKICAgIC8vICk6CiAgICBwdXNoYnl0ZXMgMHg5NTZkNzE1NiAvLyBtZXRob2QgImNvbnRyYWN0X2NyZWF0ZShhZGRyZXNzKXVpbnQ2NCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIGNvbnRyYWN0X2NyZWF0ZQogICAgZXJyCgptYWluX2NvbnRyYWN0X3VwZGF0ZV9yb3V0ZUA0OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgcHVzaGludCA0IC8vIFVwZGF0ZUFwcGxpY2F0aW9uCiAgICA9PQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICYmCiAgICBhc3NlcnQKICAgIGIgY29udHJhY3RfdXBkYXRlCgoKLy8gX3B1eWFfbGliLnV0aWwuZW5zdXJlX2J1ZGdldChyZXF1aXJlZF9idWRnZXQ6IHVpbnQ2NCwgZmVlX3NvdXJjZTogdWludDY0KSAtPiB2b2lkOgplbnN1cmVfYnVkZ2V0OgogICAgcHJvdG8gMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMTAKICAgICsKCmVuc3VyZV9idWRnZXRfd2hpbGVfdG9wQDE6CiAgICBmcmFtZV9kaWcgMAogICAgZ2xvYmFsIE9wY29kZUJ1ZGdldAogICAgPgogICAgYnogZW5zdXJlX2J1ZGdldF9hZnRlcl93aGlsZUA2CiAgICBpdHhuX2JlZ2luCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgYnl0ZWMgNDcgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtCiAgICBieXRlYyA0NyAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbQogICAgZnJhbWVfZGlnIC0xCiAgICBzd2l0Y2ggZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8wQDMgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8xQDQKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfbmV4dEA1OgogICAgaXR4bl9zdWJtaXQKICAgIGIgZW5zdXJlX2J1ZGdldF93aGlsZV90b3BAMQoKZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8xQDQ6CiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgYiBlbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX25leHRANQoKZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8wQDM6CiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGIgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV9uZXh0QDUKCmVuc3VyZV9idWRnZXRfYWZ0ZXJfd2hpbGVANjoKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucGF5bWVudF9hZ2VudC5QYXltZW50QWdlbnQuZnVuZF9kdWVfY2FzaGZsb3dzW3JvdXRpbmddKCkgLT4gdm9pZDoKZnVuZF9kdWVfY2FzaGZsb3dzOgogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAxMwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NTEKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjUyCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjUzCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo1NQogICAgLy8gaWYgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCk6CiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo1OS02MAogICAgLy8gKyBtYXhfZXZlbnRfY291bnQKICAgIC8vICogVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfUEVSX0VWRU5UX0JVREdFVCkKICAgIGR1cAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjYwCiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfRlVORF9EVUVfQ0FTSEZMT1dTX1BFUl9FVkVOVF9CVURHRVQpCiAgICBwdXNoaW50IDEwMAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjU5LTYwCiAgICAvLyArIG1heF9ldmVudF9jb3VudAogICAgLy8gKiBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19QRVJfRVZFTlRfQlVER0VUKQogICAgKgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjU4CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19CQVNFX0JVREdFVCkKICAgIGludGMgNCAvLyAxNTAwCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NTgtNjAKICAgIC8vIFVJbnQ2NChjc3QuT1BfVVBfRlVORF9EVUVfQ0FTSEZMT1dTX0JBU0VfQlVER0VUKQogICAgLy8gKyBtYXhfZXZlbnRfY291bnQKICAgIC8vICogVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfUEVSX0VWRU5UX0JVREdFVCkKICAgICsKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo1Ni02MgogICAgLy8gZW5zdXJlX2J1ZGdldCgKICAgIC8vICAgICByZXF1aXJlZF9idWRnZXQ9KAogICAgLy8gICAgICAgICBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19CQVNFX0JVREdFVCkKICAgIC8vICAgICAgICAgKyBtYXhfZXZlbnRfY291bnQKICAgIC8vICAgICAgICAgKiBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19QRVJfRVZFTlRfQlVER0VUKQogICAgLy8gICAgICksCiAgICAvLyApCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjY0CiAgICAvLyBwcm9jZXNzZWRfZXZlbnRzID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA1CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjUKICAgIC8vIGZ1bmRlZF9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2NgogICAgLy8gZnVuZGVkX3ByaW5jaXBhbCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTMKCmZ1bmRfZHVlX2Nhc2hmbG93c193aGlsZV90b3BANDoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2OQogICAgLy8gcHJvY2Vzc2VkX2V2ZW50cyA8IG1heF9ldmVudF9jb3VudAogICAgZGlnIDQKICAgIGRpZyAxCiAgICA8CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjktNzAKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgPCBtYXhfZXZlbnRfY291bnQKICAgIC8vIGFuZCBzZWxmLmV2ZW50X2N1cnNvciA8IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQKICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl93aGlsZUAxMQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjcwCiAgICAvLyBhbmQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIDwKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2OS03MAogICAgLy8gcHJvY2Vzc2VkX2V2ZW50cyA8IG1heF9ldmVudF9jb3VudAogICAgLy8gYW5kIHNlbGYuZXZlbnRfY3Vyc29yIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudAogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDExCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzIKICAgIC8vIGVudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KHNlbGYuZXZlbnRfY3Vyc29yKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIGR1cAogICAgYnVyeSAxNwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjczCiAgICAvLyBpZiBlbnRyeS5zY2hlZHVsZWRfdGltZSA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wOgogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDMKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgID4KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAMTEKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3NQogICAgLy8gaWYgbm90IHNlbGYuX2V2ZW50X2lzX2Nhc2goZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSk6CiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ1cnkgMTYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM1MQogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUCksCiAgICBpbnRjXzIgLy8gOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzUwLTM1NAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfTUQpLAogICAgLy8gKQogICAgPT0KICAgIGR1cAogICAgYnVyeSA0CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfdHJ1ZUA1MgogICAgZGlnIDE0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNTIKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNTAtMzU0CiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9NRCksCiAgICAvLyApCiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX3RydWVANTIKICAgIGRpZyAxNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzUzCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX01EKSwKICAgIHB1c2hpbnQgMTkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM1MC0zNTQKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX01EKSwKICAgIC8vICkKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUA1MwoKZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfdHJ1ZUA1MjoKICAgIGludGNfMSAvLyAxCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUA1NDoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3NQogICAgLy8gaWYgbm90IHNlbGYuX2V2ZW50X2lzX2Nhc2goZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSk6CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAMTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU0OAogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X2lkID09IHNlbGYuZXZlbnRfY3Vyc29yLCBlcnIuSU5WQUxJRF9FVkVOVF9DVVJTT1IKICAgIGRpZyAxNQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBjdXJzb3IKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU0OQogICAgLy8gYXNzZXJ0IGVudHJ5LnNjaGVkdWxlZF90aW1lIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLCBlcnIuTk9fRFVFX0NBU0hGTE9XCiAgICBkaWcgMQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPD0KICAgIGFzc2VydCAvLyBObyBkdWUgY2FzaGZsb3cgdG8gcGF5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MTMKICAgIC8vIGlmIGV2ZW50X3R5cGUgbm90IGluIChVSW50NjQoZW51bXMuRVZUX0lQKSwgVUludDY0KGVudW1zLkVWVF9NRCkpOgogICAgZGlnIDIKICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNQogICAgZGlnIDE0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MTQKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDExCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfaW50ZXJlc3RfYW1vdW50QDE2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDI2CiAgICAvLyBldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBidXJ5IDE2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MjcKICAgIC8vIGlmIGV2ZW50X3R5cGUgbm90IGluIChVSW50NjQoZW51bXMuRVZUX1BSKSwgVUludDY0KGVudW1zLkVWVF9NRCkpOgogICAgcHVzaGludCAzCiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE5CiAgICBkaWcgMTQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQyOAogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNgoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnRAMjg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTMKICAgIC8vIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGRpZyAxNQogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTU2CiAgICAvLyBpZiBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKToKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDI5CiAgICBkaWcgNwogICAgYnVyeSA5CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzODoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU3Mi01NzQKICAgIC8vICMgRnVuZGluZyB1c2VzIHBlci11bml0IGN1bXVsYXRpdmUgaW5kaWNlcyBzbyBlYWNoIGhvbGRlciBjYW4gc2V0dGxlCiAgICAvLyAjIGluZGVwZW5kZW50bHkgZnJvbSBpdHMgY3VycmVudCB1bml0IGJhbGFuY2UuCiAgICAvLyBpbnRlcmVzdF9pbmRleF9kZWx0YSA9IHNlbGYuX2Ftb3VudF90b19pbmRleF9kZWx0YShpbnRlcmVzdF9hbW91bnRfZHVlKQogICAgZGlnIDEwCiAgICBjYWxsc3ViIF9hbW91bnRfdG9faW5kZXhfZGVsdGEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU3NQogICAgLy8gcHJpbmNpcGFsX2luZGV4X2RlbHRhID0gc2VsZi5fYW1vdW50X3RvX2luZGV4X2RlbHRhKHByaW5jaXBhbF9hbW91bnRfZHVlKQogICAgZGlnIDYKICAgIGNhbGxzdWIgX2Ftb3VudF90b19pbmRleF9kZWx0YQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTc2CiAgICAvLyBpbnRlcmVzdF9hbW91bnQgPSBzZWxmLl9pbmRleF9kZWx0YV90b19hbW91bnQoaW50ZXJlc3RfaW5kZXhfZGVsdGEpCiAgICBkaWcgMQogICAgY2FsbHN1YiBfaW5kZXhfZGVsdGFfdG9fYW1vdW50CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgMTUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU3NwogICAgLy8gcHJpbmNpcGFsX2Ftb3VudCA9IHNlbGYuX2luZGV4X2RlbHRhX3RvX2Ftb3VudChwcmluY2lwYWxfaW5kZXhfZGVsdGEpCiAgICBkdXAKICAgIGNhbGxzdWIgX2luZGV4X2RlbHRhX3RvX2Ftb3VudAogICAgZHVwCiAgICBidXJ5IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzgKICAgIC8vIHJlcXVpcmVkX2Ftb3VudCA9IGludGVyZXN0X2Ftb3VudCArIHByaW5jaXBhbF9hbW91bnQKICAgIGRpZyAyCiAgICBkaWcgMQogICAgKwogICAgZHVwCiAgICBidXJ5IDkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjczNgogICAgLy8gYmFsYW5jZSA9IHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ1NgogICAgLy8gcmV0dXJuIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgKyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIGRpZyAxCiAgICArCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MzgKICAgIC8vIGFzc2VydCBiYWxhbmNlID49IHJlc2VydmVkX3RvdGFsLCBlcnIuTk9UX0VOT1VHSF9GVU5EUwogICAgZGlnIDIKICAgIGRpZyAxCiAgICA+PQogICAgYXNzZXJ0IC8vIE5vdCBlbm91Z2ggZnVuZHMgZm9yIHRoZSBwYXltZW50CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MzkKICAgIC8vIHJldHVybiBiYWxhbmNlIC0gcmVzZXJ2ZWRfdG90YWwKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTgwCiAgICAvLyBzZWxmLl9hdmFpbGFibGVfc2V0dGxlbWVudF9mdW5kcygpID49IHJlcXVpcmVkX2Ftb3VudAogICAgdW5jb3ZlciAyCiAgICA+PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTc5LTU4MQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLl9hdmFpbGFibGVfc2V0dGxlbWVudF9mdW5kcygpID49IHJlcXVpcmVkX2Ftb3VudAogICAgLy8gKSwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTgzCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0ICs9IGludGVyZXN0X2Ftb3VudAogICAgdW5jb3ZlciAzCiAgICArCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTg0CiAgICAvLyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCArPSBwcmluY2lwYWxfYW1vdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICArCiAgICBieXRlYyAxMiAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4NQogICAgLy8gc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4ICs9IGludGVyZXN0X2luZGV4X2RlbHRhCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCBleGlzdHMKICAgIHVuY292ZXIgMgogICAgKwogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTg2CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4ICs9IHByaW5jaXBhbF9pbmRleF9kZWx0YQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCBleGlzdHMKICAgICsKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1ODcKICAgIC8vIGlmIGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkgPT0gVUludDY0KGVudW1zLkVWVF9QUik6CiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBwdXNoaW50IDMKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDQwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1ODgtNTg5CiAgICAvLyAjIEZvciBQUiwgdGhlIHBlcmlvZCBpbnRlcmVzdCBzdGF5cyBhY2NydWVkIHVudGlsIGEgbGF0ZXIgSVAgb3IgTUQuCiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgKz0gc2VsZi5fZW50cnlfaW50ZXJlc3Rfc2VnbWVudChlbnRyeSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBkaWcgMTYKICAgIGNhbGxzdWIgX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQKICAgIGJ1cnkgMTgKICAgICsKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTIKICAgIC8vIGlmIG5vdCBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKSBvciBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NCgKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlANDMKICAgIGRpZyAxNQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5Mi01OTQKICAgIC8vIGlmIG5vdCBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKSBvciBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NCgKICAgIC8vICAgICBlbnVtcy5FVlRfTUQKICAgIC8vICk6CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDQKCmZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDQzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTk1CiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBkaWcgMTUKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0NDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5NgogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgZGlnIDgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTcKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IG5leHRfaW50ZXJlc3RfYmFzZQogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGRpZyA5CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTk4CiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MDAKICAgIC8vIGlmIGVudHJ5LmV2ZW50X3R5cGUgPT0gYXJjNC5VSW50OCgKICAgIGRpZyAxNQogICAgZXh0cmFjdCA4IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwMC02MDIKICAgIC8vIGlmIGVudHJ5LmV2ZW50X3R5cGUgPT0gYXJjNC5VSW50OCgKICAgIC8vICAgICBlbnVtcy5FVlRfTUQKICAgIC8vICkgYW5kIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID09IFVJbnQ2NCgwKToKICAgIHB1c2hieXRlcyAweDEzCiAgICBiPT0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQ3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MDIKICAgIC8vICkgYW5kIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID09IFVJbnQ2NCgwKToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAwLTYwMgogICAgLy8gaWYgZW50cnkuZXZlbnRfdHlwZSA9PSBhcmM0LlVJbnQ4KAogICAgLy8gICAgIGVudW1zLkVWVF9NRAogICAgLy8gKSBhbmQgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPT0gVUludDY0KDApOgogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQ3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MDMKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGVudW1zLlNUQVRVU19FTkRFRCkKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgMjAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjA0CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQ3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjA2LTYxMAogICAgLy8gc2VsZi5fZW1pdF9leGVjdXRpb25fZXZlbnQoCiAgICAvLyAgICAgZW50cnk9ZW50cnksCiAgICAvLyAgICAgcGF5b2ZmPWludGVyZXN0X2Ftb3VudCArIHByaW5jaXBhbF9hbW91bnQsCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9aW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudCwKICAgIC8vICkKICAgIGRpZyAxNQogICAgZGlnIDQKICAgIGR1cAogICAgY2FsbHN1YiBfZW1pdF9leGVjdXRpb25fZXZlbnQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojc5CiAgICAvLyBmdW5kZWRfaW50ZXJlc3QgKz0gaW50ZXJlc3RfYW1vdW50CiAgICBkaWcgMTMKICAgIGRpZyAxMgogICAgKwogICAgYnVyeSAxNAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjgwCiAgICAvLyBmdW5kZWRfcHJpbmNpcGFsICs9IHByaW5jaXBhbF9hbW91bnQKICAgIGRpZyAxMgogICAgZGlnIDcKICAgICsKICAgIGJ1cnkgMTMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4MQogICAgLy8gcHJvY2Vzc2VkX2V2ZW50cyArPSBVSW50NjQoMSkKICAgIGRpZyA0CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSA1CiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c193aGlsZV90b3BANAoKZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUA0MDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5MQogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ID0gVUludDY0KDApCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQxCgpmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUAyOToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1NwogICAgLy8gZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGRpZyAxNQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSAxNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTU4LTU2MAogICAgLy8gIyBEeW5hbWljIGFubnVpdGllcyBkZXJpdmUgbmV4dCBzdGF0ZSBmcm9tIHRoZSBwYXltZW50IGRlY29tcG9zaXRpb24sCiAgICAvLyAjIG5vdCBvbmx5IGZyb20gdGhlIHByZWNvbXB1dGVkIGBuZXh0XypgIGZpZWxkcy4KICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QUik6CiAgICBwdXNoaW50IDMKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDMxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjIKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIC0gcHJpbmNpcGFsX2Ftb3VudF9kdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgZGlnIDYKICAgIC0KICAgIGR1cAogICAgYnVyeSA5CiAgICBidXJ5IDkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzgKCmZ1bmRfZHVlX2Nhc2hmbG93c19lbHNlX2JvZHlAMzE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjUKICAgIC8vIGVsaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX0lQKToKICAgIGRpZyAxNAogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDMzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjYKICAgIC8vIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgYnVyeSA5CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjcKICAgIC8vIG5leHRfaW50ZXJlc3RfYmFzZSA9IHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgYnVyeSAxMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSBleGlzdHMKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzgKCmZ1bmRfZHVlX2Nhc2hmbG93c19lbHNlX2JvZHlAMzM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjgKICAgIC8vIGVsaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKToKICAgIGRpZyAxNAogICAgcHVzaGludCAxOQogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUAzNAogICAgZGlnIDcKICAgIGJ1cnkgOQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlAMzQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjkKICAgIC8vIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzAKICAgIC8vIG5leHRfaW50ZXJlc3RfYmFzZSA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgOQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MjkKICAgIC8vIGlmIHNlbGYuX2lzX2R5bmFtaWNfYW5udWl0eSgpOgogICAgY2FsbHN1YiBfaXNfZHluYW1pY19hbm51aXR5CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyNwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDMwCiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfTUQpOgogICAgZGlnIDE0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzMQogICAgLy8gcmV0dXJuIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTUyCiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzMgogICAgLy8gaW50ZXJlc3RfZHVlID0gc2VsZi5hY2NydWVkX2ludGVyZXN0ICsgc2VsZi5fZW50cnlfaW50ZXJlc3Rfc2VnbWVudChlbnRyeSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBkaWcgMTYKICAgIGNhbGxzdWIgX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQKICAgIGJ1cnkgMTgKICAgICsKICAgIGR1cAogICAgYnVyeSAxMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDMzCiAgICAvLyBpZiBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPD0gaW50ZXJlc3RfZHVlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gZXhpc3RzCiAgICA+PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzNAogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTUyCiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyNDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzNQogICAgLy8gcHJpbmNpcGFsX2Ftb3VudCA9IHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiAtIGludGVyZXN0X2R1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gZXhpc3RzCiAgICBkaWcgMTAKICAgIC0KICAgIGR1cAogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzYKICAgIC8vIGlmIHByaW5jaXBhbF9hbW91bnQgPiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgPgogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzNwogICAgLy8gcmV0dXJuIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTUyCiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyNjoKICAgIGRpZyA2CiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NDAKICAgIC8vIGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsIDw9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBkaWcgMTUKICAgIHB1c2hpbnQgNDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGR1cDIKICAgIDw9CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzktNDQxCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsIDw9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ0MgogICAgLy8gcmV0dXJuIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIC0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIHN3YXAKICAgIC0KICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTUyCiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQxNQogICAgLy8gcmV0dXJuIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCArIHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZGlnIDE2CiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBidXJ5IDE4CiAgICArCiAgICBidXJ5IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTEKICAgIC8vIGludGVyZXN0X2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9pbnRlcmVzdF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9pbnRlcmVzdF9hbW91bnRAMTYKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl93aGlsZUAxMToKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4MwogICAgLy8gYXNzZXJ0IHByb2Nlc3NlZF9ldmVudHMgPiBVSW50NjQoMCksIGVyci5OT19EVUVfQ0FTSEZMT1cKICAgIGRpZyA0CiAgICBkdXAKICAgIGFzc2VydCAvLyBObyBkdWUgY2FzaGZsb3cgdG8gcGF5CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODcKICAgIC8vIHRvdGFsX2Z1bmRlZD1mdW5kZWRfaW50ZXJlc3QgKyBmdW5kZWRfcHJpbmNpcGFsLAogICAgZGlnIDE0CiAgICBkdXAKICAgIGRpZyAxNQogICAgZHVwCiAgICBjb3ZlciAzCiAgICArCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODkKICAgIC8vIHRpbWVzdGFtcD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4NC05MAogICAgLy8gcmV0dXJuIHR5cC5DYXNoRnVuZGluZ1Jlc3VsdCgKICAgIC8vICAgICBmdW5kZWRfaW50ZXJlc3Q9ZnVuZGVkX2ludGVyZXN0LAogICAgLy8gICAgIGZ1bmRlZF9wcmluY2lwYWw9ZnVuZGVkX3ByaW5jaXBhbCwKICAgIC8vICAgICB0b3RhbF9mdW5kZWQ9ZnVuZGVkX2ludGVyZXN0ICsgZnVuZGVkX3ByaW5jaXBhbCwKICAgIC8vICAgICBwcm9jZXNzZWRfZXZlbnRzPXByb2Nlc3NlZF9ldmVudHMsCiAgICAvLyAgICAgdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUA1MzoKICAgIGludGNfMCAvLyAwCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDU0CgoKLy8gbW9kdWxlcy5wYXltZW50X2FnZW50LlBheW1lbnRBZ2VudC5jbGFpbV9kdWVfY2FzaGZsb3dzW3JvdXRpbmddKCkgLT4gdm9pZDoKY2xhaW1fZHVlX2Nhc2hmbG93czoKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6OTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNQogICAgLy8gaWYgc2VsZi5vcF9kYWVtb24udmFsdWUgIT0gR2xvYmFsLnplcm9fYWRkcmVzczoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNiAvLyAweDUyMjM0ZjcwNDQ2MTY1NmQ2ZjZlMjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcF9kYWVtb24gZXhpc3RzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBieiBjbGFpbV9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTcKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNwogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI2IC8vIDB4NTIyMzRmNzA0NDYxNjU2ZDZmNmUyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wX2RhZW1vbiBleGlzdHMKICAgID09CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTctMTkKICAgIC8vIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICAvLyBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgYm56IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDE0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTgKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNy0xOQogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICBibnogY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX3RydWVAMTQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxOQogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIHR4biBTZW5kZXIKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDMyCiAgICA9PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE3LTE5CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAxNQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX3RydWVAMTQ6CiAgICBpbnRjXzEgLy8gMQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDE2OgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE2LTIwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vICAgICBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gICAgIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICAvLyApLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNzoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMDMKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA0CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMDcKICAgIC8vIHNlbGYuX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQoaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDIKICAgIGR1cAogICAgY2FsbHN1YiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjEwOAogICAgLy8gc2VsZi5fc2V0dGxlX3Bvc2l0aW9uKGhvbGRpbmdfYWRkcmVzcykKICAgIGNhbGxzdWIgX3NldHRsZV9wb3NpdGlvbgogICAgcG9wbiAyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTE3CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jbGFpbWFibGVfaW50ZXJlc3QKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGR1cAogICAgcHVzaGludCA3MwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTE4CiAgICAvLyArIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNsYWltYWJsZV9wcmluY2lwYWwKICAgIGR1cAogICAgcHVzaGludCA4MQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTE3LTExOAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY2xhaW1hYmxlX2ludGVyZXN0CiAgICAvLyArIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNsYWltYWJsZV9wcmluY2lwYWwKICAgIHVuY292ZXIgMgogICAgKwogICAgZHVwCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMTAKICAgIC8vIGFzc2VydCB0b3RhbF9hbW91bnQgPiBVSW50NjQoMCksIGVyci5OT19EVUVfQ0FTSEZMT1cKICAgIGFzc2VydCAvLyBObyBkdWUgY2FzaGZsb3cgdG8gcGF5CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MjUKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5pc19vcHRlZF9pbigKICAgIGV4dHJhY3QgMCAzMgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI2CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI1LTI3CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MuaXNfb3B0ZWRfaW4oCiAgICAvLyAgICAgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkCiAgICAvLyApCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI1LTI4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MuaXNfb3B0ZWRfaW4oCiAgICAvLyAgICAgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkCiAgICAvLyApCiAgICAvLyBhbmQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZAogICAgYnogY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX2ZhbHNlQDI0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MjgKICAgIC8vIGFuZCBub3Qgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDM4NAogICAgZ2V0Yml0CiAgICBibnogY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX2ZhbHNlQDI0CiAgICBpbnRjXzEgLy8gMQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDI1OgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjExNQogICAgLy8gaWYgc2VsZi5faXNfcGF5bWVudF9leGVjdXRhYmxlKGhvbGRpbmdfYWRkcmVzcyk6CiAgICBieiBjbGFpbV9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjM0CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgc3dhcAogICAgZGlnIDEKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYXNzZXJ0IC8vIGFjY291bnQgb3B0ZWQgaW50byBhc3NldAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjM0LTM1CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgLy8gPj0gcGF5bWVudF9hbW91bnQKICAgIGRpZyA1CiAgICBkdXAKICAgIGNvdmVyIDIKICAgID49CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MzMtMzYKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIC8vICAgICA+PSBwYXltZW50X2Ftb3VudAogICAgLy8gKSwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjExNwogICAgLy8gc2VsZi5fcGF5KHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcywgdG90YWxfYW1vdW50KQogICAgZGlnIDIKICAgIGR1cAogICAgY292ZXIgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGR1cAogICAgZXh0cmFjdCAwIDMyCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NDAtNDUKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1yZWNlaXZlciwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9YW1vdW50LAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NDQKICAgIC8vIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICB1bmNvdmVyIDMKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgdW5jb3ZlciAyCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQwCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NDAtNDUKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1yZWNlaXZlciwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9YW1vdW50LAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEyNS0xMjYKICAgIC8vICMgR2V0IHRoZSBjbGFpbWFibGUgYW1vdW50cyBiZWZvcmUgcmVzZXQKICAgIC8vIGludGVyZXN0X2Ftb3VudCA9IHBvc2l0aW9uLmNsYWltYWJsZV9pbnRlcmVzdAogICAgZHVwCiAgICBwdXNoaW50IDczCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBidXJ5IDkKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMjcKICAgIC8vIHByaW5jaXBhbF9hbW91bnQgPSBwb3NpdGlvbi5jbGFpbWFibGVfcHJpbmNpcGFsCiAgICBkdXAKICAgIHB1c2hpbnQgODEKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGJ1cnkgOQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEyOS0xMzAKICAgIC8vICMgUmVzZXQgdGhlIHBvc2l0aW9uJ3MgY2xhaW1hYmxlIGFtb3VudHMKICAgIC8vIHBvc2l0aW9uLmNsYWltYWJsZV9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICByZXBsYWNlMiA3MwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzMQogICAgLy8gcG9zaXRpb24uY2xhaW1hYmxlX3ByaW5jaXBhbCA9IFVJbnQ2NCgwKQogICAgc3dhcAogICAgcmVwbGFjZTIgODEKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzIKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gcG9zaXRpb24uY29weSgpCiAgICB1bmNvdmVyIDMKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzQKICAgIC8vIGFzc2VydCBzZWxmLnJlc2VydmVkX2ludGVyZXN0ID49IGludGVyZXN0X2Ftb3VudCwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBkdXAKICAgIGRpZyAyCiAgICA+PQogICAgYXNzZXJ0IC8vIE5vdCBlbm91Z2ggZnVuZHMgZm9yIHRoZSBwYXltZW50CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTM1CiAgICAvLyBhc3NlcnQgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgPj0gcHJpbmNpcGFsX2Ftb3VudCwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIGRpZyAzCiAgICA+PQogICAgYXNzZXJ0IC8vIE5vdCBlbm91Z2ggZnVuZHMgZm9yIHRoZSBwYXltZW50CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTM3LTEzOAogICAgLy8gIyBVcGRhdGUgdGhlIGdsb2JhbCByZXNlcnZlZCBpbnRlcmVzdCBhbmQgcHJpbmNpcGFsIGFtb3VudHMKICAgIC8vIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgLT0gaW50ZXJlc3RfYW1vdW50CiAgICBzd2FwCiAgICAtCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzOQogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgLT0gcHJpbmNpcGFsX2Ftb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIGV4aXN0cwogICAgc3dhcAogICAgLQogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpjbGFpbV9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMjMKICAgIC8vIHRvdGFsX2Ftb3VudD1pbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50LAogICAgZGlnIDUKICAgIGR1cAogICAgZGlnIDYKICAgIGR1cAogICAgY292ZXIgMwogICAgKwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjEyNAogICAgLy8gdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjEyMC0xMjYKICAgIC8vIHJldHVybiB0eXAuQ2FzaENsYWltUmVzdWx0KAogICAgLy8gICAgIGludGVyZXN0X2Ftb3VudD1pbnRlcmVzdF9hbW91bnQsCiAgICAvLyAgICAgcHJpbmNpcGFsX2Ftb3VudD1wcmluY2lwYWxfYW1vdW50LAogICAgLy8gICAgIHRvdGFsX2Ftb3VudD1pbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50LAogICAgLy8gICAgIHRpbWVzdGFtcD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICBjb250ZXh0PXBheW1lbnRfaW5mbywKICAgIC8vICkKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyAyCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgcHVzaGJ5dGVzIDB4MDAyMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VAMjQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfbWVyZ2VAMjUKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAxNToKICAgIGludGNfMCAvLyAwCiAgICBiIGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUAxNgoKCi8vIG1vZHVsZXMudHJhbnNmZXJfYWdlbnQuVHJhbnNmZXJBZ2VudC50cmFuc2Zlcl9zZXRfc2NoZWR1bGVbcm91dGluZ10oKSAtPiB2b2lkOgp0cmFuc2Zlcl9zZXRfc2NoZWR1bGU6CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MjYKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToyNwogICAgLy8gYXNzZXJ0IG9wZW5fZGF0ZSA8IGNsb3N1cmVfZGF0ZSwgZXJyLklOVkFMSURfU09SVElORwogICAgZHVwMgogICAgPAogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIG11c3QgYmUgc29ydGVkIGluIHN0cmljdGx5IGFzY2VuZGluZyBvcmRlcgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToyOQogICAgLy8gc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgPSBvcGVuX2RhdGUKICAgIGJ5dGVjIDI4IC8vICJ0cmFuc2Zlcl9vcGVuaW5nX2RhdGUiCiAgICB1bmNvdmVyIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjMwCiAgICAvLyBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSA9IGNsb3N1cmVfZGF0ZQogICAgYnl0ZWMgMjkgLy8gInRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjMxCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMudHJhbnNmZXJfYWdlbnQuVHJhbnNmZXJBZ2VudC5wcmltYXJ5X2Rpc3RyaWJ1dGlvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnByaW1hcnlfZGlzdHJpYnV0aW9uOgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTozMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo3MQogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYucHJpbWFyeV9kZWFsZXIsIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyMiAvLyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQzCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo0NAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQ1CiAgICAvLyBhc3NlcnQgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TRUQKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBjbG9zZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDcKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQoaG9sZGluZ19hZGRyZXNzKQogICAgc3dhcAogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo0OAogICAgLy8gYXNzZXJ0IHVuaXRzID4gVUludDY0KDApLCBlcnIuWkVST19VTklUUwogICAgZHVwCiAgICBhc3NlcnQgLy8gQ2FuIG5vdCBkaXN0cmlidXRlIHplcm8gdW5pdHMKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NTAKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgKyB1bml0cyA8PSBzZWxmLnRvdGFsX3VuaXRzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIGV4aXN0cwogICAgKwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIDw9CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQ5LTUxCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgKyB1bml0cyA8PSBzZWxmLnRvdGFsX3VuaXRzCiAgICAvLyApLCBlcnIuT1ZFUl9ESVNUUklCVVRJT04KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgcmVtYWluaW5nIEQtQVNBIHVuaXRzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjUyCiAgICAvLyBpZiBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNyAvLyAiaW5pdGlhbF9leGNoYW5nZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSBleGlzdHMKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo1NAogICAgLy8gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPD0gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGUKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNyAvLyAiaW5pdGlhbF9leGNoYW5nZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSBleGlzdHMKICAgIDw9CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjUzLTU1CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDw9IHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlCiAgICAvLyApLCBlcnIuUFJJTUFSWV9ESVNUUklCVVRJT05fQ0xPU0VECiAgICBhc3NlcnQgLy8gUHJpbWFyeSBkaXN0cmlidXRpb24gaXMgY2xvc2VkCgpwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTQ4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5yZXNlcnZlZF91bml0cyArPSB1bml0cwogICAgZHVwbiAyCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCA0MAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAzCiAgICBkdXAKICAgIGNvdmVyIDMKICAgICsKICAgIGl0b2IKICAgIHB1c2hpbnQgNDAKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjU4CiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsICs9IHVuaXRzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIGV4aXN0cwogICAgKwogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjU5CiAgICAvLyByZXR1cm4gc2VsZi50b3RhbF91bml0cyAtIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICBzd2FwCiAgICAtCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnRyYW5zZmVyX2FnZW50LlRyYW5zZmVyQWdlbnQudHJhbnNmZXJbcm91dGluZ10oKSAtPiB2b2lkOgp0cmFuc2ZlcjoKICAgIGludGNfMCAvLyAwCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cG4gMgogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojc1CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo3NgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDcKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjEzCiAgICAvLyBpZiBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyOCAvLyAidHJhbnNmZXJfb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIGJ6IHRyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNQogICAgLy8gc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyOCAvLyAidHJhbnNmZXJfb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIDw9CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE0LTE2CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyApLCBlcnIuQ0xPU0VEX1RSQU5TRkVSCiAgICBhc3NlcnQgLy8gVHJhbnNmZXIgaXMgY2xvc2VkCgp0cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE3CiAgICAvLyBpZiBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyOSAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIGJ6IHRyYW5zZmVyX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxOQogICAgLy8gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI5IC8vICJ0cmFuc2Zlcl9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgPAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxOC0yMAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8IHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlCiAgICAvLyApLCBlcnIuQ0xPU0VEX1RSQU5TRkVSCiAgICBhc3NlcnQgLy8gVHJhbnNmZXIgaXMgY2xvc2VkCgp0cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjgwCiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBzZW5kZXJfaG9sZGluZ19hZGRyZXNzLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICBkaWcgNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQyMwogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDgKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBkaWcgNQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA5CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjgzCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBkaWcgMgogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4NAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBkdXAKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODUKICAgIC8vIGFzc2VydCBzZW5kZXJfaG9sZGluZ19hZGRyZXNzICE9IHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcywgZXJyLlNFTEZfVFJBTlNGRVIKICAgIHVuY292ZXIgMgogICAgIT0KICAgIGFzc2VydCAvLyBTZW5kZXIgYW5kIHJlY2VpdmVyIG11c3QgYmUgZGlmZmVyZW50CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojg2CiAgICAvLyBhc3NlcnQgdW5pdHMgPiBVSW50NjQoMCksIGVyci5OVUxMX1RSQU5TRkVSCiAgICBkaWcgMQogICAgZHVwCiAgICBhc3NlcnQgLy8gVHJhbnNmZXIgdW5pdHMgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4NwogICAgLy8gYXNzZXJ0IHVuaXRzIDw9IHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cywgZXJyLk9WRVJfVFJBTlNGRVIKICAgIHN3YXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICA8PQogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCBzZW5kZXIgdW5pdHMgdG8gdHJhbnNmZXIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc2NQogICAgLy8gaWYgc2VsZi5ldmVudF9jdXJzb3IgPj0gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgPj0KICAgIGJueiB0cmFuc2Zlcl9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9hc3NlcnRfbm9fZHVlX2V2ZW50X3BlbmRpbmdAMTAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc2NwogICAgLy8gbmV4dF9lbnRyeSA9IHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLmV2ZW50X2N1cnNvcikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NjkKICAgIC8vIG5leHRfZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzY4LTc3MAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBuZXh0X2VudHJ5LnNjaGVkdWxlZF90aW1lID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICksIGVyci5QRU5ESU5HX0FDVFVTX0VWRU5UCiAgICBhc3NlcnQgLy8gQUNUVVMgZXZlbnQgbm90IHlldCBleGVjdXRlZAoKdHJhbnNmZXJfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYXNzZXJ0X25vX2R1ZV9ldmVudF9wZW5kaW5nQDEwOgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo5MAogICAgLy8gc2VsZi5fZW5zdXJlX3VuaXRzX2FjdGl2YXRlZChzZW5kZXJfaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDMKICAgIGR1cAogICAgY2FsbHN1YiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo5MQogICAgLy8gc2VsZi5fZW5zdXJlX3VuaXRzX2FjdGl2YXRlZChyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBkaWcgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjYWxsc3ViIF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjkyCiAgICAvLyBzZWxmLl9zZXR0bGVfcG9zaXRpb24oc2VuZGVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGNhbGxzdWIgX3NldHRsZV9wb3NpdGlvbgogICAgcG9wbiAyCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjkzCiAgICAvLyBzZWxmLl9zZXR0bGVfcG9zaXRpb24ocmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzKQogICAgY2FsbHN1YiBfc2V0dGxlX3Bvc2l0aW9uCiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNTIKICAgIC8vIGFzc2VydCB1bml0cyA8PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cywgZXJyLk9WRVJfVFJBTlNGRVIKICAgIGRpZyA1CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkaWcgMQogICAgPD0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgc2VuZGVyIHVuaXRzIHRvIHRyYW5zZmVyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTUzCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyAtPSB1bml0cwogICAgZGlnIDEKICAgIC0KICAgIGl0b2IKICAgIHVuY292ZXIgMgogICAgaW50Y18zIC8vIDMyCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTQ0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyArPSB1bml0cwogICAgZGlnIDUKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIHVuY292ZXIgMgogICAgKwogICAgaXRvYgogICAgaW50Y18zIC8vIDMyCiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo2MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfc3VzcGVuc2lvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfc3VzcGVuc2lvbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojc3CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyMSAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxODUKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZCA9IHN1c3BlbmRlZAogICAgZHVwCiAgICBwdXNoaW50IDQ4CiAgICBpbnRjXzEgLy8gMQogICAgYm94X2V4dHJhY3QKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgcHVzaGludCA0OAogICAgc3dhcAogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxODYKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE2NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF9vcGVuW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF9vcGVuOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjY4CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hY2NvdW50X21hbmFnZXIsIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyMyAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzOQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfRU5ERUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgMjAwCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxMAogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfZW5kZWQoKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgIQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjExCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxMgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTMKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozNAogICAgLy8gdW5pdHM9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozMi00MgogICAgLy8gcmV0dXJuIHR5cC5BY2NvdW50UG9zaXRpb24oCiAgICAvLyAgICAgcGF5bWVudF9hZGRyZXNzPXBheW1lbnRfYWRkcmVzcywKICAgIC8vICAgICB1bml0cz1VSW50NjQoMCksCiAgICAvLyAgICAgcmVzZXJ2ZWRfdW5pdHM9VUludDY0KDApLAogICAgLy8gICAgIHN1c3BlbmRlZD1GYWxzZSwKICAgIC8vICAgICBzZXR0bGVkX2N1cnNvcj1VSW50NjQoMCksCiAgICAvLyAgICAgaW50ZXJlc3RfY2hlY2twb2ludD1VSW50NjQoMCksCiAgICAvLyAgICAgcHJpbmNpcGFsX2NoZWNrcG9pbnQ9VUludDY0KDApLAogICAgLy8gICAgIGNsYWltYWJsZV9pbnRlcmVzdD1VSW50NjQoMCksCiAgICAvLyAgICAgY2xhaW1hYmxlX3ByaW5jaXBhbD1VSW50NjQoMCksCiAgICAvLyApCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGJ5dGVjIDQwIC8vIDB4MDAKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjE0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHNlbGYuX25ld19hY2NvdW50X3Bvc2l0aW9uKHBheW1lbnRfYWRkcmVzcykKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTUKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIzOAogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICB1bmNvdmVyIDMKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMzkKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQwCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0MQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzID0gcGF5bWVudF9hZGRyZXNzCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0MgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5hY2NvdW50X2dldF9wb3NpdGlvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfZ2V0X3Bvc2l0aW9uOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI1OQogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmNvbnRyYWN0X2NyZWF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X2NyZWF0ZToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDI4CiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gYXJyYW5nZXIKICAgIGJ5dGVjIDE4IC8vIDB4NTIyMzQxNzI3MjYxNmU2NzY1NzIyMwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMjkKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfY29uZmlnW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfY29uZmlnOgogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBsZW4KICAgIHB1c2hpbnQgMTA3CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLk5vcm1hbGl6ZWRBY3R1c1Rlcm1zCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgcHVzaGludCA3MgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5Jbml0aWFsS2VybmVsU3RhdGUKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBsZW4KICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIHR1cGxlIGVuY29kaW5nCiAgICBkdXAKICAgIHB1c2hpbnQgMzQKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCB0YWlsIHBvaW50ZXIgYXQgaW5kZXggMSBvZiAodWludDhbMzJdLChsZW4rdXRmOFtdKSkKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgY292ZXIgMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMzYKICAgICsKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuUHJvc3BlY3R1cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2MAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDYyLTEwNjMKICAgIC8vICMgQ29uZmlndXJlIENvbnRyYWN0CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPSB0ZXJtcy5jb250cmFjdF90eXBlLmFzX3VpbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgYnogY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUA3CiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIyMAogICAgLy8gVUludDY0KGVudW1zLkNUX0FOTiksCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIxCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfTkFNKSwKICAgIHB1c2hpbnQgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIyCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfTEFNKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIzCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfTEFYKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjI0CiAgICAvLyBVSW50NjQoZW51bXMuQ1RfQ0xNKSwKICAgIHB1c2hpbnQgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJ6IGNvbnRyYWN0X2NvbmZpZ19ib29sX2ZhbHNlQDgKCmNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANzoKICAgIGludGNfMSAvLyAxCgpjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUA5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjI5CiAgICAvLyBhc3NlcnQgc2VsZi5faXNfc3VwcG9ydGVkX2NvbnRyYWN0X3R5cGUoY29udHJhY3RfdHlwZSksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2NQogICAgLy8gc2VsZi5fc3RvcmVfY29udHJhY3RfY29uZmlnKHNlbGYuY29udHJhY3RfdHlwZSwgdGVybXMsIGluaXRpYWxfc3RhdGUpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgYnVyeSAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzI1CiAgICAvLyBhc3NlcnQgdGVybXMuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZGlnIDQKICAgIGR1cAogICAgcHVzaGludCAzMwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSA4CiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMjcKICAgIC8vIHRlcm1zLmRheV9jb3VudF9jb252ZW50aW9uLmFzX3VpbnQ2NCgpCiAgICBwdXNoaW50IDU3CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICBieiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDE2CiAgICBkaWcgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk5CiAgICAvLyBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI5Ny0zMDMKICAgIC8vIHJldHVybiBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzYwKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwSVNEQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjApLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDE2CiAgICBkaWcgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzAwCiAgICAvLyBVSW50NjQoZW51bXMuRENDX0EzNjUpLAogICAgcHVzaGludCAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyOTctMzAzCiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgID09CiAgICBibnogY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUAxNgogICAgZGlnIDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMwMQogICAgLy8gVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGRpZyA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDIKICAgIC8vIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICA9PQogICAgYnogY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAMTcKCmNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTY6CiAgICBpbnRjXzEgLy8gMQoKY29udHJhY3RfY29uZmlnX2Jvb2xfbWVyZ2VAMTg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDktMzExCiAgICAvLyBhc3NlcnQgc2VsZi5faXNfc3VwcG9ydGVkX2RheV9jb3VudF9jb252ZW50aW9uKAogICAgLy8gICAgIGRheV9jb3VudF9jb252ZW50aW9uCiAgICAvLyApLCBlcnIuSU5WQUxJRF9EQVlfQ09VTlRfQ09OVkVOVElPTgogICAgYXNzZXJ0IC8vIEludmFsaWQgZGF5LWNvdW50IGNvbnZlbnRpb24gSUQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMyOQogICAgLy8gaWYgY29udHJhY3RfdHlwZSAhPSBVSW50NjQoZW51bXMuQ1RfQU5OKToKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgICE9CiAgICBieiBjb250cmFjdF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzMwCiAgICAvLyBhc3NlcnQgbm90IHRlcm1zLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24sIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZGlnIDQKICAgIHB1c2hpbnQgNzg2CiAgICBnZXRiaXQKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KCmNvbnRyYWN0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDIwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODA5CiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIEQtQVNBIGFscmVhZHkgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODEwCiAgICAvLyBhc3NlcnQgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCA9PSBVSW50NjQoMCksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMCAvLyAiaW5pdGlhbF9leGNoYW5nZV9hbW91bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTItODEzCiAgICAvLyAjIFNldCBEZW5vbWluYXRpb24gQXNzZXQKICAgIC8vIHNlbGYuX2Fzc2VydF9kZW5vbWluYXRpb25fYXNzZXQodGVybXMuZGVub21pbmF0aW9uX2Fzc2V0X2lkKQogICAgZGlnIDQKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NzctNzc4CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIGRlbm9taW5hdGlvbiB3aXRoIEFTQQogICAgLy8gX2NyZWF0b3IsIGV4aXN0cyA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X2NyZWF0b3IoZGVub21pbmF0aW9uX2Fzc2V0X2lkKQogICAgZHVwCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q3JlYXRvcgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NzkKICAgIC8vIGFzc2VydCBleGlzdHMsIGVyci5JTlZBTElEX0RFTk9NSU5BVElPTgogICAgYXNzZXJ0IC8vIERlbm9taW5hdGlvbiBhc3NldCBpcyBub3QgcHJvcGVybHkgc2V0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODIKICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICBieXRlYyA0NCAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTYtODE3CiAgICAvLyAjIFNldCBTZXR0bGVtZW50IEFzc2V0CiAgICAvLyBzZWxmLl9hc3NlcnRfc2V0dGxlbWVudF9hc3NldCh0ZXJtcy5zZXR0bGVtZW50X2Fzc2V0X2lkKQogICAgZGlnIDEKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc4NwogICAgLy8gc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODUtNzg4CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc2V0dGxlbWVudCBhc3NldCBpcyB0aGUgZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQgPT0gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIC8vICksIGVyci5JTlZBTElEX1NFVFRMRU1FTlRfQVNTRVQKICAgIGFzc2VydCAvLyBEaWZmZXJlbnQgc2V0dGxlbWVudCBhc3NldCBub3Qgc3VwcG9ydGVkLCBtdXN0IGJlIGVxdWFsIHRvIGRlbm9taW5hdGlvbiBhc3NldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkxCiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBzZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkyLTc5OAogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhc3NldF9hbW91bnQ9MCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Nzk3CiAgICAvLyBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Nzk1CiAgICAvLyBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc5NgogICAgLy8gYXNzZXRfYW1vdW50PTAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkyLTc5MwogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3OTItNzk4CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODIwLTgyMQogICAgLy8gIyBVbml0cwogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IHRlcm1zLnRvdGFsX3VuaXRzCiAgICBkdXAKICAgIHB1c2hpbnQgMTcKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODIyCiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID0gVUludDY0KDApCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgyNC04MjUKICAgIC8vICMgRGF5LUNvdW50IENvbnZlbnRpb25zCiAgICAvLyBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uID0gdGVybXMuZGF5X2NvdW50X2NvbnZlbnRpb24uYXNfdWludDY0KCkKICAgIGJ5dGVjIDQ2IC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGRpZyA4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODI3LTgyOAogICAgLy8gIyBUaW1lCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA9IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZQogICAgZHVwCiAgICBwdXNoaW50IDQxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMjcgLy8gImluaXRpYWxfZXhjaGFuZ2VfZGF0ZSIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODI5CiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSB0ZXJtcy5tYXR1cml0eV9kYXRlCiAgICBkaWcgMQogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDQ1IC8vICJtYXR1cml0eV9kYXRlIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MzAKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IGluaXRpYWxfc3RhdGUubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZGlnIDYKICAgIGR1cAogICAgY292ZXIgMgogICAgcHVzaGludCA0OAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzMi04MzMKICAgIC8vICMgUHJpbmNpcGFsCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID0gdGVybXMuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGRpZyAxMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzNAogICAgLy8gc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gdGVybXMuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZGlnIDMKICAgIHB1c2hpbnQgNzg2CiAgICBnZXRiaXQKICAgIGJ5dGVjIDM0IC8vICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzNQogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBpbml0aWFsX3N0YXRlLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZGlnIDEKICAgIHB1c2hpbnQgMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODM3LTgzOAogICAgLy8gIyBJbnRlcmVzdAogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ID0gaW5pdGlhbF9zdGF0ZS5hY2NydWVkX2ludGVyZXN0CiAgICBkaWcgMQogICAgcHVzaGludCA0MAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQwLTg0MQogICAgLy8gIyBJbnRlcmVzdCBSYXRlCiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IGluaXRpYWxfc3RhdGUubm9taW5hbF9pbnRlcmVzdF9yYXRlCiAgICBkaWcgMQogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0MgogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gaW5pdGlhbF9zdGF0ZS5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlCiAgICBkaWcgMQogICAgcHVzaGludCAyNAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQzCiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkID0gdGVybXMucmF0ZV9yZXNldF9zcHJlYWQKICAgIGRpZyAzCiAgICBwdXNoaW50IDU4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzUgLy8gInJhdGVfcmVzZXRfc3ByZWFkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0NAogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIgPSB0ZXJtcy5yYXRlX3Jlc2V0X211bHRpcGxpZXIKICAgIGRpZyAzCiAgICBwdXNoaW50IDY2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzYgLy8gInJhdGVfcmVzZXRfbXVsdGlwbGllciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDUKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9mbG9vciA9IHRlcm1zLnJhdGVfcmVzZXRfZmxvb3IKICAgIGRpZyAzCiAgICBwdXNoaW50IDc0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzAgLy8gInJhdGVfcmVzZXRfZmxvb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQ2CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfY2FwID0gdGVybXMucmF0ZV9yZXNldF9jYXAKICAgIGRpZyAzCiAgICBwdXNoaW50IDgyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzEgLy8gInJhdGVfcmVzZXRfY2FwIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0NwogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X25leHQgPSB0ZXJtcy5yYXRlX3Jlc2V0X25leHQKICAgIGRpZyAzCiAgICBwdXNoaW50IDkwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzcgLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDgKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgPSB0ZXJtcy5oYXNfcmF0ZV9yZXNldF9mbG9vcgogICAgZGlnIDMKICAgIHB1c2hpbnQgNzg0CiAgICBnZXRiaXQKICAgIGJ5dGVjIDM4IC8vICJoYXNfcmF0ZV9yZXNldF9mbG9vciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDkKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwID0gdGVybXMuaGFzX3JhdGVfcmVzZXRfY2FwCiAgICBkaWcgMwogICAgcHVzaGludCA3ODUKICAgIGdldGJpdAogICAgYnl0ZWMgMzkgLy8gImhhc19yYXRlX3Jlc2V0X2NhcCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NTEtODUyCiAgICAvLyAjIFNjYWxpbmcKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgPSB0ZXJtcy5maXhlZF9wb2ludF9zY2FsZQogICAgdW5jb3ZlciAzCiAgICBwdXNoaW50IDk5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU0LTg1NQogICAgLy8gIyBTY2hlZHVsZSBQcm9jZXNzaW5nCiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciA9IGluaXRpYWxfc3RhdGUuZXZlbnRfY3Vyc29yCiAgICBkaWcgMQogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU3LTg1OAogICAgLy8gIyBQZXItVW5pdCBGaXhlZC1Qb2ludCBJbmRleGVzCiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggPSBpbml0aWFsX3N0YXRlLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgKICAgIGRpZyAxCiAgICBwdXNoaW50IDU2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU5CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4ID0gaW5pdGlhbF9zdGF0ZS5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleAogICAgZGlnIDEKICAgIHB1c2hpbnQgNjQKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODYxLTg2MgogICAgLy8gIyBSZXNlcnZlZCBBbW91bnQgKGZvciBleGVjdXRlZCBjYXNoZmxvd3MpCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0ID0gVUludDY0KDApCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2MwogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2NQogICAgLy8gYXNzZXJ0IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLCBlcnIuSU5WQUxJRF9JRUQKICAgIGRpZyAyCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICBhc3NlcnQgLy8gSUVEIG11c3QgYmUgc2V0IGluIHRoZSBmdXR1cmUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2NgogICAgLy8gYXNzZXJ0IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA+IGluaXRpYWxfc3RhdGUuc3RhdHVzX2RhdGUsIGVyci5JTlZBTElEX0lFRAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgPAogICAgYXNzZXJ0IC8vIElFRCBtdXN0IGJlIHNldCBpbiB0aGUgZnV0dXJlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NjcKICAgIC8vIGFzc2VydCB0ZXJtcy5pbml0aWFsX2V4Y2hhbmdlX2RhdGUgPCB0ZXJtcy5tYXR1cml0eV9kYXRlLCBlcnIuSU5WQUxJRF9JRUQKICAgIDwKICAgIGFzc2VydCAvLyBJRUQgbXVzdCBiZSBzZXQgaW4gdGhlIGZ1dHVyZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2Ny0xMDY4CiAgICAvLyAjIE5vdGFyaXplIHByb3NwZWN0dXMgKG9wdGlvbmFsKQogICAgLy8gc2VsZi5wcm9zcGVjdHVzX2hhc2ggPSBwcm9zcGVjdHVzLmhhc2guYnl0ZXMKICAgIGRpZyAyCiAgICBleHRyYWN0IDAgMzIKICAgIGJ5dGVjIDQyIC8vICJwcm9zcGVjdHVzX2hhc2giCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2OQogICAgLy8gc2VsZi5wcm9zcGVjdHVzX3VybCA9IHByb3NwZWN0dXMudXJsCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGVjIDQzIC8vICJwcm9zcGVjdHVzX3VybCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDcwCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAMTc6CiAgICBpbnRjXzAgLy8gMAogICAgYiBjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUAxOAoKY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAODoKICAgIGludGNfMCAvLyAwCiAgICBiIGNvbnRyYWN0X2NvbmZpZ19ib29sX21lcmdlQDkKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9zY2hlZHVsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X3NjaGVkdWxlOgogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDcyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHN3YXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBkdXAKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgMgogICAgKwogICAgdW5jb3ZlciAyCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLkV4ZWN1dGlvblNjaGVkdWxlRW50cnk+CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDg3CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwOTAKICAgIC8vIGNvbnRyYWN0X3R5cGU9c2VsZi5jb250cmFjdF90eXBlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGNvdmVyIDMKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4ODMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4ODQtODg2CiAgICAvLyBhc3NlcnQgc2NoZWR1bGVfcGFnZS5sZW5ndGggPD0gVUludDY0KAogICAgLy8gICAgIGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUKICAgIC8vICksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGR1cAogICAgcHVzaGludCAxNgogICAgPD0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg4NwogICAgLy8gYXNzZXJ0IHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPiBVSW50NjQoMCksIGVyci5URVJNU19OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSB0ZXJtcyBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODg5CiAgICAvLyBwYWdlX2N1cnNvciA9IHNjaGVkdWxlX3BhZ2VfaW5kZXggKiBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkKICAgIHN3YXAKICAgIHB1c2hpbnQgMTYKICAgICoKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg5NgogICAgLy8gKyBwYWdlX2xlbmd0aCAqIFVJbnQ2NChjc3QuT1BfVVBfQ09OVFJBQ1RfQ09ORklHX1BFUl9FTlRSWV9CVURHRVQpCiAgICBwdXNoaW50IDEwMAogICAgKgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODk1CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19CQVNFX0JVREdFVCkKICAgIGludGMgNCAvLyAxNTAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTUtODk2CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19CQVNFX0JVREdFVCkKICAgIC8vICsgcGFnZV9sZW5ndGggKiBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19QRVJfRU5UUllfQlVER0VUKQogICAgKwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODkxLTg5OAogICAgLy8gIyBWYWxpZGF0aW9uIGNvc3QgZ3Jvd3Mgd2l0aCBwYWdlIGxlbmd0aCwgc28gY29uZmlndXJhdGlvbiBleHBsaWNpdGx5CiAgICAvLyAjIGJ1eXMgZXh0cmEgb3Bjb2RlIGJ1ZGdldCBmb3IgbGFyZ2VyIHVwbG9hZHMuCiAgICAvLyBlbnN1cmVfYnVkZ2V0KAogICAgLy8gICAgIHJlcXVpcmVkX2J1ZGdldD0oCiAgICAvLyAgICAgICAgIFVJbnQ2NChjc3QuT1BfVVBfQ09OVFJBQ1RfQ09ORklHX0JBU0VfQlVER0VUKQogICAgLy8gICAgICAgICArIHBhZ2VfbGVuZ3RoICogVUludDY0KGNzdC5PUF9VUF9DT05UUkFDVF9DT05GSUdfUEVSX0VOVFJZX0JVREdFVCkKICAgIC8vICAgICApLAogICAgLy8gKQogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODk5CiAgICAvLyBpbmRleCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKCmNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEAyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTAwCiAgICAvLyB3aGlsZSBpbmRleCA8IHBhZ2VfbGVuZ3RoOgogICAgZHVwCiAgICBkaWcgNAogICAgPAogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfd2hpbGVAMTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkwMS05MDIKICAgIC8vIGVudHJ5ID0gc2NoZWR1bGVfcGFnZVtpbmRleF0uY29weSgpCiAgICAvLyBlbnRyeV9ldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZGlnIDQKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGJ1cnkgMTIKICAgIGRpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgNjUKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTAyCiAgICAvLyBlbnRyeV9ldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDEtOTAyCiAgICAvLyBlbnRyeSA9IHNjaGVkdWxlX3BhZ2VbaW5kZXhdLmNvcHkoKQogICAgLy8gZW50cnlfZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGludGNfMiAvLyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDIKICAgIC8vIGVudHJ5X2V2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBnZXRieXRlCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgMTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkwMwogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X2lkID09IHBhZ2VfY3Vyc29yICsgaW5kZXgsIGVyci5JTlZBTElEX0VWRU5UX0lECiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEzCiAgICBkaWcgNQogICAgdW5jb3ZlciA0CiAgICArCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDQtOTA2CiAgICAvLyBzZWxmLl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBlbnRyeV9ldmVudF90eXBlCiAgICAvLyApCiAgICBkaWcgNQogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTA3CiAgICAvLyBhc3NlcnQgZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgc3dhcAogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDgKICAgIC8vIGlmIGVudHJ5LmV2ZW50X2lkID4gVUludDY0KDApOgogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDkKICAgIC8vIGlmIGluZGV4ID4gVUludDY0KDApOgogICAgZHVwCiAgICBieiBjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlANgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTEwCiAgICAvLyBwcmV2aW91c19lbnRyeSA9IHNjaGVkdWxlX3BhZ2VbaW5kZXggLSBVSW50NjQoMSldLmNvcHkoKQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgcHVzaGludCA2NQogICAgKgogICAgZGlnIDExCiAgICBzd2FwCiAgICBwdXNoaW50IDY1CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkyNQogICAgLy8gcHJldmlvdXNfZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gZW50cnkuc2NoZWR1bGVkX3RpbWUKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyA4CiAgICA8PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTI0LTkyNgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBwcmV2aW91c19lbnRyeS5zY2hlZHVsZWRfdGltZSA8PSBlbnRyeS5zY2hlZHVsZWRfdGltZQogICAgLy8gKSwgZXJyLklOVkFMSURfU09SVElORwogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIG11c3QgYmUgc29ydGVkIGluIHN0cmljdGx5IGFzY2VuZGluZyBvcmRlcgoKY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUA4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTI3CiAgICAvLyBpZiBlbnRyeS5ldmVudF9pZCA9PSBVSW50NjQoMCk6CiAgICBkaWcgOAogICAgYm56IGNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkyOC05MzAKICAgIC8vIGFzc2VydCBlbnRyeV9ldmVudF90eXBlID09IFVJbnQ2NCgKICAgIC8vICAgICBlbnVtcy5FVlRfSUVECiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGRpZyA5CiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MzEKICAgIC8vIGluZGV4ICs9IFVJbnQ2NCgxKQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIGNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEAyCgpjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlANjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkxMi05MTQKICAgIC8vICMgVGhlIGZpcnN0IGVudHJ5IG9mIGEgcGFnZSBtdXN0IHN0aWxsIGJlIG9yZGVyZWQgYWZ0ZXIgdGhlCiAgICAvLyAjIGxhc3QgZW50cnkgb2YgdGhlIHByZXZpb3VzIHBhZ2UuCiAgICAvLyBhc3NlcnQgc2NoZWR1bGVfcGFnZV9pbmRleCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGRpZyA2CiAgICBkdXAKICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTUKICAgIC8vIHByZXZpb3VzX3BhZ2VfaW5kZXggPSBzY2hlZHVsZV9wYWdlX2luZGV4IC0gVUludDY0KDEpCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTE3CiAgICAvLyBwcmV2aW91c19wYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZQogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTYtOTE4CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHByZXZpb3VzX3BhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTktOTIwCiAgICAvLyBwcmV2aW91c19wYWdlID0gc2VsZi5zY2hlZHVsZV9wYWdlW3ByZXZpb3VzX3BhZ2VfaW5kZXhdLmNvcHkoKQogICAgLy8gYXNzZXJ0IHByZXZpb3VzX3BhZ2UubGVuZ3RoID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBwdXNoaW50IDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjAKICAgIC8vIGFzc2VydCBwcmV2aW91c19wYWdlLmxlbmd0aCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZHVwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjIKICAgIC8vIHByZXZpb3VzX3BhZ2UubGVuZ3RoIC0gVUludDY0KDEpCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTIxLTkyMwogICAgLy8gcHJldmlvdXNfZW50cnkgPSBwcmV2aW91c19wYWdlWwogICAgLy8gICAgIHByZXZpb3VzX3BhZ2UubGVuZ3RoIC0gVUludDY0KDEpCiAgICAvLyBdLmNvcHkoKQogICAgcHVzaGludCA2NQogICAgKgogICAgcHVzaGludCAyCiAgICArCiAgICBwdXNoaW50IDY1CiAgICBib3hfZXh0cmFjdAogICAgYiBjb250cmFjdF9zY2hlZHVsZV9hZnRlcl9pZl9lbHNlQDcKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX3doaWxlQDExOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjAwCiAgICAvLyBzZWxmLnNjaGVkdWxlX3BhZ2VbcGFnZV9pbmRleF0gPSBzY2hlZHVsZV9wYWdlLmNvcHkoKQogICAgZGlnIDYKICAgIGl0b2IKICAgIGJ5dGVjIDI0IC8vIDB4NTMyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgZGlnIDUKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzNAogICAgLy8gaWYgaXNfbGFzdF9wYWdlOgogICAgZGlnIDUKICAgIGJ6IGNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzNgogICAgLy8gc2NoZWR1bGVfcGFnZV9pbmRleCAqIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKSArIHBhZ2VfbGVuZ3RoCiAgICBkaWcgMQogICAgZGlnIDQKICAgICsKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzNQogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA9ICgKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTM1LTkzNwogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA9ICgKICAgIC8vICAgICBzY2hlZHVsZV9wYWdlX2luZGV4ICogVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpICsgcGFnZV9sZW5ndGgKICAgIC8vICkKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MzgKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgNTAKICAgIGFwcF9nbG9iYWxfcHV0Cgpjb250cmFjdF9zY2hlZHVsZV9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA5NQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDcyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9leGVjdXRlX2llZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X2V4ZWN1dGVfaWVkOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMDUKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEwNgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMDcKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTA5CiAgICAvLyBhc3NlcnQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LCBlcnIuSU5WQUxJRF9FVkVOVF9DVVJTT1IKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgZGlnIDEKICAgID4KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGN1cnNvcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTExMAogICAgLy8gZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoc2VsZi5ldmVudF9jdXJzb3IpCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMTEKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoZW51bXMuRVZUX0lFRCksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGR1cAogICAgZXh0cmFjdCA4IDEKICAgIGR1cAogICAgcHVzaGJ5dGVzIDB4MDEKICAgIGI9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTExNQogICAgLy8gZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICBkaWcgMQogICAgZXh0cmFjdCAwIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMTcKICAgIC8vIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgZGlnIDIKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTE4CiAgICAvLyBhY2NydWFsX2ZhY3Rvcj1lbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIGRpZyAzCiAgICBleHRyYWN0IDE3IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMTkKICAgIC8vIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIGRpZyA0CiAgICBleHRyYWN0IDI1IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMjEKICAgIC8vIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPWVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDUKICAgIGV4dHJhY3QgMzMgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEyMgogICAgLy8gbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgZGlnIDYKICAgIGV4dHJhY3QgNDEgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEyMwogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9ZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICBkaWcgNwogICAgZXh0cmFjdCA0OSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTI0CiAgICAvLyBmbGFncz1lbnRyeS5mbGFncywKICAgIGRpZyA4CiAgICBleHRyYWN0IDU3IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMTQtMTEyNQogICAgLy8gdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0KAogICAgLy8gICAgIGV2ZW50X2lkPWVudHJ5LmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1lbnRyeS5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1lbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPWVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9ZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPWVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGZsYWdzPWVudHJ5LmZsYWdzLAogICAgLy8gKSwKICAgIHVuY292ZXIgNwogICAgdW5jb3ZlciA4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNwogICAgY29uY2F0CiAgICB1bmNvdmVyIDYKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMjAKICAgIC8vIG9ic2VydmVkX3JhdGU9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMTQtMTEyNQogICAgLy8gdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0KAogICAgLy8gICAgIGV2ZW50X2lkPWVudHJ5LmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1lbnRyeS5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1lbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPWVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9ZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPWVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGZsYWdzPWVudHJ5LmZsYWdzLAogICAgLy8gKSwKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTEyLTExMjYKICAgIC8vIHNlbGYuX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5KAogICAgLy8gICAgIGVudHJ5LAogICAgLy8gICAgIHR5cC5PYnNlcnZlZEV2ZW50UmVxdWVzdCgKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPWVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIG9ic2VydmVkX3JhdGU9VUludDY0KDApLAogICAgLy8gICAgICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1lbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1lbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICAgICAgZmxhZ3M9ZW50cnkuZmxhZ3MsCiAgICAvLyAgICAgKSwKICAgIC8vICkKICAgIGNhbGxzdWIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5CiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMjcKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA5NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuYXBwbHlfbm9uX2Nhc2hfZXZlbnRbcm91dGluZ10oKSAtPiB2b2lkOgphcHBseV9ub25fY2FzaF9ldmVudDoKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDQKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTI5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cG4gMgogICAgbGVuCiAgICBwdXNoaW50IDczCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLk9ic2VydmVkRXZlbnRSZXF1ZXN0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE0MwogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDQKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTQ2CiAgICAvLyBpZiBwYXlsb2FkLmZsYWdzICYgVUludDY0KGVudW1zLkZMQUdfT0JTRVJWRURfRVZFTlQpOgogICAgcHVzaGludCA2NQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgcHVzaGludCA0CiAgICAmCiAgICBieiBhcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIzMwogICAgLy8gcmV0dXJuIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQ0xNKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICBwdXNoaW50IDUKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTQ3CiAgICAvLyBhc3NlcnQgc2VsZi5fc3VwcG9ydHNfb2JzZXJ2ZWRfZXZlbnRzKCksIGVyci5PQlNFUlZFRF9FVkVOVF9SRVFVSVJFRAogICAgYXNzZXJ0IC8vIE9ic2VydmVkIGV2ZW50IHJlcXVpcmVkIHRvIGV4ZWN1dGUgdGhpcyBhY3Rpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDgKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjMzCiAgICAvLyByZXR1cm4gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9DTE0pCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIGR1cAogICAgcHVzaGludCA1CiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQ3CiAgICAvLyBhc3NlcnQgc2VsZi5fc3VwcG9ydHNfb2JzZXJ2ZWRfZXZlbnRzKCksIGVyci5PQlNFUlZFRF9FVkVOVF9SRVFVSVJFRAogICAgYXNzZXJ0IC8vIE9ic2VydmVkIGV2ZW50IHJlcXVpcmVkIHRvIGV4ZWN1dGUgdGhpcyBhY3Rpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk0OAogICAgLy8gYXNzZXJ0IHBheWxvYWQuZXZlbnRfaWQgPT0gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGRpZyAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDcKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBpZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTUwCiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUsIHBheWxvYWQuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgYnVyeSAxMgogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk0OS05NTEKICAgIC8vIHNlbGYuX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIHNlbGYuY29udHJhY3RfdHlwZSwgcGF5bG9hZC5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICAvLyApCiAgICBjYWxsc3ViIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTUzCiAgICAvLyBwYWdlX2luZGV4ID0gc2VsZi5fc2NoZWR1bGVfcGFnZV9pbmRleChzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTkwCiAgICAvLyByZXR1cm4gZXZlbnRfaWQgLy8gVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpCiAgICBwdXNoaW50IDE2CiAgICAvCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTQKICAgIC8vIHBhZ2UgPSB0eXAuRXhlY3V0aW9uU2NoZWR1bGVQYWdlKCkKICAgIGJ5dGVjIDQ4IC8vIDB4MDAwMAogICAgYnVyeSA3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTUKICAgIC8vIGlmIHBhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlOgogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA5CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMjcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1NgogICAgLy8gcGFnZSA9IHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XS5jb3B5KCkKICAgIGRpZyA3CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidXJ5IDcKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX3BhZ2UgZW50cnkgZXhpc3RzCgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDI3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTU3CiAgICAvLyBhc3NlcnQgcGFnZS5sZW5ndGggPCBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGRpZyA1CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgMTYKICAgIDwKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2MgogICAgLy8gc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIGRpZyAzCiAgICBkdXAKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjMKICAgIC8vIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICBkaWcgMQogICAgZXh0cmFjdCAxNyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjQKICAgIC8vIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZGlnIDIKICAgIGV4dHJhY3QgMjUgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTY1CiAgICAvLyBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDMKICAgIGV4dHJhY3QgNDEgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTY2CiAgICAvLyBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIGRpZyA0CiAgICBleHRyYWN0IDQ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2NwogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIHVuY292ZXIgNQogICAgZXh0cmFjdCA1NyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTktOTY5CiAgICAvLyB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1wYXlsb2FkLmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9cGF5bG9hZC5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPXBheWxvYWQucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXBheWxvYWQubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICkKICAgIGRpZyAxMQogICAgaXRvYgogICAgZGlnIDE4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMwogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTgtOTcwCiAgICAvLyBwYWdlLmFwcGVuZCgKICAgIC8vICAgICB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9cGF5bG9hZC5ldmVudF9pZCwKICAgIC8vICAgICAgICAgZXZlbnRfdHlwZT1wYXlsb2FkLmV2ZW50X3R5cGUsCiAgICAvLyAgICAgICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIC8vICAgICAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICAgICApCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NzEKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHBhZ2UuY29weSgpCiAgICBkaWcgOAogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk3MgogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTUxCiAgICAvLyBhc3NlcnQgZXZlbnRfaWQgPT0gc2VsZi5ldmVudF9jdXJzb3IsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBjdXJzb3IKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTIKICAgIC8vIGVudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KGV2ZW50X2lkKQogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1NAogICAgLy8gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgYnVyeSAxMAogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjQKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY1CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzYzLTM3MAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9SUiksCiAgICBwdXNoaW50IDEyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY3CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICBwdXNoaW50IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY4CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgcHVzaGludCAxOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzYzLTM3MAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBieiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX2ZhbHNlQDE2CgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX3RydWVAMTU6CiAgICBpbnRjXzEgLy8gMQoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9tZXJnZUAxNzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTMtMTE1NQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2lzX25vbl9jYXNoKAogICAgLy8gICAgIGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIC8vICksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IHR5cGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTYKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlICE9IGFyYzQuVUludDgoZW51bXMuRVZUX0lFRCksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGRpZyA4CiAgICBwdXNoYnl0ZXMgMHgwMQogICAgYiE9CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCB0eXBlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNzQKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluIChVSW50NjQoZW51bXMuRVZUX1JSKSwgVUludDY0KGVudW1zLkVWVF9SUkYpKQogICAgZGlnIDQKICAgIHB1c2hpbnQgMTIKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDIxCiAgICBkaWcgNAogICAgcHVzaGludCAxMQogICAgPT0KICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfZmFsc2VAMjIKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAyMToKICAgIGludGNfMSAvLyAxCgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX21lcmdlQDIzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1NwogICAgLy8gaWYgc2VsZi5fZXZlbnRfaXNfcmF0ZV9yZXNldChlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpKToKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Vsc2VfYm9keUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODAKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLm9ic2VydmVyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjUgLy8gMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTYxCiAgICAvLyBzZWxmLl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeShlbnRyeSwgcGF5bG9hZCkKICAgIGRpZyA2CiAgICBkaWcgMgogICAgY2FsbHN1YiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkKICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE2MgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTI5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Vsc2VfYm9keUA1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE2MAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICBiIGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VANgoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9mYWxzZUAyMjoKICAgIGludGNfMCAvLyAwCiAgICBiIGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfbWVyZ2VAMjMKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfZmFsc2VAMTY6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX21lcmdlQDE3CgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuYXBwZW5kX29ic2VydmVkX2Nhc2hfZXZlbnRbcm91dGluZ10oKSAtPiB2b2lkOgphcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudDoKICAgIGludGNfMCAvLyAwCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBsZW4KICAgIHB1c2hpbnQgNjUKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuT2JzZXJ2ZWRDYXNoRXZlbnRSZXF1ZXN0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE3MgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTczCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE3NAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDcKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMzMKICAgIC8vIHJldHVybiBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0NMTSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgcHVzaGludCA1CiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTgxCiAgICAvLyBhc3NlcnQgc2VsZi5fc3VwcG9ydHNfb2JzZXJ2ZWRfZXZlbnRzKCksIGVyci5PQlNFUlZFRF9FVkVOVF9SRVFVSVJFRAogICAgYXNzZXJ0IC8vIE9ic2VydmVkIGV2ZW50IHJlcXVpcmVkIHRvIGV4ZWN1dGUgdGhpcyBhY3Rpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4MgogICAgLy8gYXNzZXJ0IHBheWxvYWQuZXZlbnRfaWQgPT0gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIHN3YXAKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgaWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4MwogICAgLy8gYXNzZXJ0IHBheWxvYWQuZXZlbnRfdHlwZSA9PSBhcmM0LlVJbnQ4KGVudW1zLkVWVF9QUiksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGRpZyAxCiAgICBleHRyYWN0IDggMQogICAgZHVwCiAgICBjb3ZlciAzCiAgICBwdXNoYnl0ZXMgMHgwMwogICAgYj09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCB0eXBlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5ODQKICAgIC8vIGFzc2VydCBwYXlsb2FkLmZsYWdzICYgVUludDY0KGVudW1zLkZMQUdfQ0FTSF9FVkVOVCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgc3dhcAogICAgcHVzaGludCA1NwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18xIC8vIDEKICAgICYKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4NgogICAgLy8gaWYgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA+IFVJbnQ2NCgwKToKICAgIGJ6IGFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTg3CiAgICAvLyBwcmV2aW91c19lbnRyeSA9IHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IC0gVUludDY0KDEpKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTg5CiAgICAvLyBwcmV2aW91c19lbnRyeS5zY2hlZHVsZWRfdGltZSA8PSBwYXlsb2FkLnNjaGVkdWxlZF90aW1lCiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgNAogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgPD0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4OC05OTAKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgcHJldmlvdXNfZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gcGF5bG9hZC5zY2hlZHVsZWRfdGltZQogICAgLy8gKSwgZXJyLklOVkFMSURfU09SVElORwogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIG11c3QgYmUgc29ydGVkIGluIHN0cmljdGx5IGFzY2VuZGluZyBvcmRlcgoKYXBwZW5kX29ic2VydmVkX2Nhc2hfZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTkyCiAgICAvLyBwYWdlX2luZGV4ID0gc2VsZi5fc2NoZWR1bGVfcGFnZV9pbmRleChzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTkwCiAgICAvLyByZXR1cm4gZXZlbnRfaWQgLy8gVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpCiAgICBwdXNoaW50IDE2CiAgICAvCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OTMKICAgIC8vIHBhZ2UgPSB0eXAuRXhlY3V0aW9uU2NoZWR1bGVQYWdlKCkKICAgIGJ5dGVjIDQ4IC8vIDB4MDAwMAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OTQKICAgIC8vIGlmIHBhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlOgogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA3CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VANQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTk1CiAgICAvLyBwYWdlID0gc2VsZi5zY2hlZHVsZV9wYWdlW3BhZ2VfaW5kZXhdLmNvcHkoKQogICAgZGlnIDUKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGJ1cnkgNgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfcGFnZSBlbnRyeSBleGlzdHMKCmFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5NgogICAgLy8gYXNzZXJ0IHBhZ2UubGVuZ3RoIDwgVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBkaWcgNAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBwdXNoaW50IDE2CiAgICA8CiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDAxCiAgICAvLyBzY2hlZHVsZWRfdGltZT1wYXlsb2FkLnNjaGVkdWxlZF90aW1lLAogICAgZGlnIDUKICAgIGR1cAogICAgZXh0cmFjdCA5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMDIKICAgIC8vIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICBkaWcgMQogICAgZXh0cmFjdCAxNyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDAzCiAgICAvLyByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPXBheWxvYWQucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIGRpZyAyCiAgICBleHRyYWN0IDI1IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMDQKICAgIC8vIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPXBheWxvYWQubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBkaWcgMwogICAgZXh0cmFjdCAzMyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDA1CiAgICAvLyBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIGRpZyA0CiAgICBleHRyYWN0IDQxIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMDYKICAgIC8vIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXBheWxvYWQubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICB1bmNvdmVyIDUKICAgIGV4dHJhY3QgNDkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTk4LTEwMDgKICAgIC8vIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgIGV2ZW50X2lkPXBheWxvYWQuZXZlbnRfaWQsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1wYXlsb2FkLmV2ZW50X3R5cGUsCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPXBheWxvYWQubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1wYXlsb2FkLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICBmbGFncz1wYXlsb2FkLmZsYWdzLAogICAgLy8gKQogICAgZGlnIDEwCiAgICBpdG9iCiAgICBkaWcgMTAKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5Ny0xMDA5CiAgICAvLyBwYWdlLmFwcGVuZCgKICAgIC8vICAgICB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9cGF5bG9hZC5ldmVudF9pZCwKICAgIC8vICAgICAgICAgZXZlbnRfdHlwZT1wYXlsb2FkLmV2ZW50X3R5cGUsCiAgICAvLyAgICAgICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIC8vICAgICAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICAgICApCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDEwCiAgICAvLyBzZWxmLnNjaGVkdWxlX3BhZ2VbcGFnZV9pbmRleF0gPSBwYWdlLmNvcHkoKQogICAgZGlnIDYKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDExCiAgICAvLyBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50ICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNzgKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE2NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfZ2V0X3N0YXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfZ2V0X3N0YXRlOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBkdXAKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE4NQogICAgLy8gY29udHJhY3RfdHlwZT1hcmM0LlVJbnQ4KHNlbGYuY29udHJhY3RfdHlwZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzIgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExODcKICAgIC8vIHRvdGFsX3VuaXRzPXNlbGYudG90YWxfdW5pdHMsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE4OAogICAgLy8gcmVzZXJ2ZWRfdW5pdHNfdG90YWw9c2VsZi5yZXNlcnZlZF91bml0c190b3RhbCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTg5CiAgICAvLyBpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudD1zZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExOTAKICAgIC8vIGV2ZW50X2N1cnNvcj1zZWxmLmV2ZW50X2N1cnNvciwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE5MQogICAgLy8gc2NoZWR1bGVfZW50cnlfY291bnQ9c2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExOTIKICAgIC8vIG91dHN0YW5kaW5nX3ByaW5jaXBhbD1zZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE5MwogICAgLy8gaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZT1zZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE5NAogICAgLy8gbm9taW5hbF9pbnRlcmVzdF9yYXRlPXNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTk1CiAgICAvLyBhY2NydWVkX2ludGVyZXN0PXNlbGYuYWNjcnVlZF9pbnRlcmVzdCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTk2CiAgICAvLyBjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4PXNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE5NwogICAgLy8gY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXg9c2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTk4CiAgICAvLyByZXNlcnZlZF9pbnRlcmVzdD1zZWxmLnJlc2VydmVkX2ludGVyZXN0LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExOTkKICAgIC8vIHJlc2VydmVkX3ByaW5jaXBhbD1zZWxmLnJlc2VydmVkX3ByaW5jaXBhbCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExODQtMTIwMAogICAgLy8gcmV0dXJuIHR5cC5LZXJuZWxTdGF0ZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlPWFyYzQuVUludDgoc2VsZi5jb250cmFjdF90eXBlKSwKICAgIC8vICAgICBzdGF0dXM9c2VsZi5zdGF0dXMsCiAgICAvLyAgICAgdG90YWxfdW5pdHM9c2VsZi50b3RhbF91bml0cywKICAgIC8vICAgICByZXNlcnZlZF91bml0c190b3RhbD1zZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsLAogICAgLy8gICAgIGluaXRpYWxfZXhjaGFuZ2VfYW1vdW50PXNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQsCiAgICAvLyAgICAgZXZlbnRfY3Vyc29yPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgLy8gICAgIHNjaGVkdWxlX2VudHJ5X2NvdW50PXNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQsCiAgICAvLyAgICAgb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2U9c2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlLAogICAgLy8gICAgIG5vbWluYWxfaW50ZXJlc3RfcmF0ZT1zZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBhY2NydWVkX2ludGVyZXN0PXNlbGYuYWNjcnVlZF9pbnRlcmVzdCwKICAgIC8vICAgICBjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4PXNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCwKICAgIC8vICAgICBjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleD1zZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4LAogICAgLy8gICAgIHJlc2VydmVkX2ludGVyZXN0PXNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QsCiAgICAvLyAgICAgcmVzZXJ2ZWRfcHJpbmNpcGFsPXNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsLAogICAgLy8gKQogICAgdW5jb3ZlciAxNAogICAgaXRvYgogICAgdW5jb3ZlciAxNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDEzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDEwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgOQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDgKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnRbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIwNgogICAgLy8gaWYgc2VsZi5ldmVudF9jdXJzb3IgPj0gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgPj0KICAgIGJ6IGNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMDgKICAgIC8vIGV2ZW50X2lkPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjA3LTEyMTcKICAgIC8vIHJldHVybiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1zZWxmLmV2ZW50X2N1cnNvciwKICAgIC8vICAgICBldmVudF90eXBlPWFyYzQuVUludDgoMCksCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9VUludDY0KDApLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9VUludDY0KDApLAogICAgLy8gICAgIGZsYWdzPVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGl0b2IKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMDkKICAgIC8vIGV2ZW50X3R5cGU9YXJjNC5VSW50OCgwKSwKICAgIGJ5dGVjIDQwIC8vIDB4MDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMDctMTIxNwogICAgLy8gcmV0dXJuIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgIGV2ZW50X2lkPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgLy8gICAgIGV2ZW50X3R5cGU9YXJjNC5VSW50OCgwKSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1VSW50NjQoMCksCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1VSW50NjQoMCksCiAgICAvLyAgICAgZmxhZ3M9VUludDY0KDApLAogICAgLy8gKQogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjEwCiAgICAvLyBzY2hlZHVsZWRfdGltZT1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIwNy0xMjE3CiAgICAvLyByZXR1cm4gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkoCiAgICAvLyAgICAgZXZlbnRfaWQ9c2VsZi5ldmVudF9jdXJzb3IsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1hcmM0LlVJbnQ4KDApLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPVVJbnQ2NCgwKSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249VUludDY0KDApLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPVVJbnQ2NCgwKSwKICAgIC8vICAgICBmbGFncz1VSW50NjQoMCksCiAgICAvLyApCiAgICBpdG9iCiAgICBzd2FwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKCmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudF9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudEA0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIwMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpjb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIxOAogICAgLy8gcmV0dXJuIHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLmV2ZW50X2N1cnNvcikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjAyCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50QDQKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5jb250cmFjdF91cGRhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF91cGRhdGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTUzLTE1NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGdyYW50cyB0aGUgdXBkYXRlIHBlcm1pc3Npb25zIHRvIHRoZSBBcnJhbmdlci4KICAgIC8vICMg4pqg77iPIFdBUk5JTkc6IEFwcGxpY2F0aW9uIHVwZGF0ZXMgbXVzdCBiZSBleGVjdXRlZCBWRVJZIGNhcmVmdWxseSwgYXMgdGhleQogICAgLy8gIyBtaWdodCBpbnRyb2R1Y2UgYnJlYWtpbmcgY2hhbmdlcy4KICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfcm90YXRlX2FycmFuZ2VyW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19yb3RhdGVfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2OQogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTcwCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gbmV3X2FycmFuZ2VyCiAgICBieXRlYyAxOCAvLyAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTcxCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfc2V0X29wX2RhZW1vbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfc2V0X29wX2RhZW1vbjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTg0CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODUKICAgIC8vIHNlbGYub3BfZGFlbW9uLnZhbHVlID0gYWRkcmVzcwogICAgYnl0ZWMgMjYgLy8gMHg1MjIzNGY3MDQ0NjE2NTZkNmY2ZTIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4NgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTczCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2Fzc2lnbl9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19hc3NpZ25fcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDE2CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLlJvbGVWYWxpZGl0eQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjExCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMgogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgcHVzaGludCAyMAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTAzCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gcm9sZV9hZGRyZXNzCiAgICBieXRlYyAxOCAvLyAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMKICAgIGRpZyAzCiAgICBhcHBfZ2xvYmFsX3B1dAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTQKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDYKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIGR1cAogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnRfbWFuYWdlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMyAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwOAogICAgLy8gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMiAvLyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTIKICAgIC8vIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIGR1cAogICAgcHVzaGludCA2MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE1CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMzIgLy8gMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE2CiAgICAvLyBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExOAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMSAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIwCiAgICAvLyBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMwogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgODAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIzCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI1IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI0CiAgICAvLyBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3Jldm9rZV9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19yZXZva2Vfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzUKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzNgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzcKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCkpCiAgICBidG9pCiAgICBkdXBuIDIKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCAhPSBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksIGVyci5JTlZBTElEX1JPTEUKICAgIGR1cAogICAgcHVzaGludCAyMAogICAgIT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyOAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIzIC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0NGQ2MTZlNjE2NzY1NzIyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMwCiAgICAvLyBkZWwgc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzOQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjE2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIyIC8vIDB4NTIyMzUwNzI2OTZkNjE3Mjc5NDQ2NTYxNmM2NTcyMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNAogICAgLy8gZGVsIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjM4CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIGR1cAogICAgcHVzaGludCA2MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAzMiAvLyAweDUyMjM1NDcyNzU3Mzc0NjU2NTIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzgKICAgIC8vIGRlbCBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjM4CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDEKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hdXRob3JpdHksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjEgLy8gMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MgogICAgLy8gZGVsIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzOAogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDQKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDgwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI1IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ2CiAgICAvLyBkZWwgc2VsZi5vYnNlcnZlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfY29udHJhY3Rfc3VzcGVuc2lvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfY29udHJhY3Rfc3VzcGVuc2lvbjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCAgIyBUT0RPOiBVcGRhdGUgc3BlY3MgYW5kIGFkZCB0ZXN0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojc3CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyMSAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1NwogICAgLy8gc2VsZi5hc3NldF9zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGJ5dGVjIDMzIC8vICJhc3NldF9zdXNwZW5kZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1OAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QgICMgVE9ETzogVXBkYXRlIHNwZWNzIGFuZCBhZGQgdGVzdAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X2FycmFuZ2VyW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjY4CiAgICAvLyByZXR1cm4gc2VsZi5hcnJhbmdlci52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE4IC8vIDB4NTIyMzQxNzI3MjYxNmU2NzY1NzIyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI2MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYWRkcmVzc19yb2xlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjcwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4NAogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hY2NvdW50X21hbmFnZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjMgLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQ0ZDYxNmU2MTY3NjU3MjIzCiAgICBkaWcgMQogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODUKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYucHJpbWFyeV9kZWFsZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjIgLy8gMHg1MjIzNTA3MjY5NmQ2MTcyNzk0NDY1NjE2YzY1NzIyMwogICAgZGlnIDIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg2CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnRydXN0ZWUsIGFkZHJlc3MpLAogICAgYnl0ZWMgMzIgLy8gMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMwogICAgZGlnIDMKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg3CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgYWRkcmVzcyksCiAgICBieXRlYyAyMSAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgZGlnIDQKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg4CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLm9ic2VydmVyLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDI1IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgdW5jb3ZlciA1CiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlYyA0MCAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciA2CiAgICBzZXRiaXQKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDUKICAgIHNldGJpdAogICAgcHVzaGludCAyCiAgICB1bmNvdmVyIDQKICAgIHNldGJpdAogICAgcHVzaGludCAzCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgcHVzaGludCA0CiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwNQogICAgLy8gcm9sZSA9IHJvbGVfaWQuYXNfdWludDY0KCkKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDYKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGUpCiAgICBkdXAKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA4CiAgICAvLyBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKToKICAgIHB1c2hpbnRzIDIwIDQwIDUwIDYwIDcwIDgwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA3LTMzOAogICAgLy8gbWF0Y2ggcm9sZToKICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKToKICAgIC8vICAgICAgICAgcmV0dXJuIHR5cC5Sb2xlVmFsaWRpdHkoCiAgICAvLyAgICAgICAgICAgICByb2xlX3ZhbGlkaXR5X3N0YXJ0PVVJbnQ2NCgwKSwgcm9sZV92YWxpZGl0eV9lbmQ9VUludDY0KDApCiAgICAvLyAgICAgICAgICkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSk6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSk6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgXzoKICAgIC8vICAgICAgICAgb3AuZXJyKGVyci5JTlZBTElEX1JPTEUpCiAgICB1bmNvdmVyIDYKICAgIG1hdGNoIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMEAyIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMUAzIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMkA0IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfM0A1IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNEA2IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzM4CiAgICAvLyBvcC5lcnIoZXJyLklOVkFMSURfUk9MRSkKICAgIGVyciAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV81QDc6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzM0CiAgICAvLyBzZWxmLm9ic2VydmVyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDI1IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMzMy0zMzUKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLm9ic2VydmVyLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzYKICAgIC8vIHJldHVybiBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV80QDY6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI5CiAgICAvLyBzZWxmLmF1dGhvcml0eSwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAyMSAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOC0zMzAKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLmF1dGhvcml0eSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzMxCiAgICAvLyByZXR1cm4gc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8zQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI0CiAgICAvLyBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMzIgLy8gMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMy0zMjUKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyNgogICAgLy8gcmV0dXJuIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzJANDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTkKICAgIC8vIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMjIgLy8gMHg1MjIzNTA3MjY5NmQ2MTcyNzk0NDY1NjE2YzY1NzIyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxOC0zMjAKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLnByaW1hcnlfZGVhbGVyLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjEKICAgIC8vIHJldHVybiBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMUAzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxNAogICAgLy8gc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMjMgLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQ0ZDYxNmU2MTY3NjU3MjIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEzLTMxNQogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTYKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzBAMjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDktMzExCiAgICAvLyByZXR1cm4gdHlwLlJvbGVWYWxpZGl0eSgKICAgIC8vICAgICByb2xlX3ZhbGlkaXR5X3N0YXJ0PVVJbnQ2NCgwKSwgcm9sZV92YWxpZGl0eV9lbmQ9VUludDY0KDApCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB2b2lkOgpfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZDoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNgogICAgLy8gZGVmIF9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHNlbGYsIGhvbGRpbmdfYWRkcmVzczogQWNjb3VudCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI4CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZCwgZXJyLlNVU1BFTkRFRAogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHB1c2hpbnQgMzg0CiAgICBnZXRiaXQKICAgICEKICAgIGFzc2VydCAvLyBTdXNwZW5kZWQgb3BlcmF0aW9ucwogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuX3NldHRsZV9wb3NpdGlvbihob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB1aW50NjQsIHVpbnQ2NDoKX3NldHRsZV9wb3NpdGlvbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo0NAogICAgLy8gZGVmIF9zZXR0bGVfcG9zaXRpb24oc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50KSAtPiB0dXBsZVtVSW50NjQsIFVJbnQ2NF06CiAgICBwcm90byAxIDIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NjEKICAgIC8vIHBvc2l0aW9uID0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY29weSgpCiAgICBkdXAKICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjYzLTY1CiAgICAvLyAjIENvbXB1dGUgdGhlIGluY3JlbWVudGFsIHBlci11bml0IGZpeGVkLXBvaW50IGludGVyZXN0IGFuZCBwcmluY2lwYWwgYWNjcnVlZAogICAgLy8gIyBzaW5jZSB0aGlzIGFjY291bnQncyBsYXN0IGNoZWNrcG9pbnQuCiAgICAvLyBpbnRlcmVzdF9kZWx0YSA9IHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCAtIHBvc2l0aW9uLmludGVyZXN0X2NoZWNrcG9pbnQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IGV4aXN0cwogICAgZGlnIDEKICAgIHB1c2hpbnQgNTcKICAgIGV4dHJhY3RfdWludDY0CiAgICAtCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NjcKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggLSBwb3NpdGlvbi5wcmluY2lwYWxfY2hlY2twb2ludAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCBleGlzdHMKICAgIGRpZyAyCiAgICBwdXNoaW50IDY1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjczCiAgICAvLyBpbnRlcmVzdF9kZWx0YSwgcG9zaXRpb24udW5pdHMsIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUKICAgIGRpZyAyCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzAtNzQKICAgIC8vICMgQ29udmVydCB0aGUgcGVyLXVuaXQgZml4ZWQtcG9pbnQgZGVsdGFzIGludG8gYWJzb2x1dGUgY2xhaW1hYmxlIGFtb3VudHMKICAgIC8vICMgdXNpbmcgdGhlIGFjY291bnQncyBhY3RpdmUgdW5pdHMuCiAgICAvLyBjbGFpbWFibGVfaW50ZXJlc3QgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBpbnRlcmVzdF9kZWx0YSwgcG9zaXRpb24udW5pdHMsIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUKICAgIC8vICkKICAgIHVuY292ZXIgMwogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3NgogICAgLy8gcHJpbmNpcGFsX2RlbHRhLCBwb3NpdGlvbi51bml0cywgc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojc1LTc3CiAgICAvLyBjbGFpbWFibGVfcHJpbmNpcGFsID0gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgcHJpbmNpcGFsX2RlbHRhLCBwb3NpdGlvbi51bml0cywgc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgLy8gKQogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3OS04MQogICAgLy8gIyBBY2NydWUgdGhlIGNsYWltYWJsZSBhbW91bnRzIHRvIHRoZSBhY2NvdW50IHBvc2l0aW9uIGFuZCBtYWtlIHRoZW0gYXZhaWxhYmxlCiAgICAvLyAjIGZvciB3aXRoZHJhd2FsLgogICAgLy8gcG9zaXRpb24uY2xhaW1hYmxlX2ludGVyZXN0ICs9IGNsYWltYWJsZV9pbnRlcmVzdAogICAgZGlnIDIKICAgIHB1c2hpbnQgNzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgKwogICAgaXRvYgogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICByZXBsYWNlMiA3MwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjgyCiAgICAvLyBwb3NpdGlvbi5jbGFpbWFibGVfcHJpbmNpcGFsICs9IGNsYWltYWJsZV9wcmluY2lwYWwKICAgIGR1cAogICAgcHVzaGludCA4MQogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICArCiAgICBpdG9iCiAgICByZXBsYWNlMiA4MQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojg0LTg2CiAgICAvLyAjIEFkdmFuY2UgdGhlIGFjY291bnQncyBwZXItdW5pdCBmaXhlZC1wb2ludCBjaGVja3BvaW50cyB0byB0aGUgY3VycmVudCBnbG9iYWwKICAgIC8vICMgcGVyLXVuaXQgZml4ZWQtcG9pbnQgZ2xvYmFsIGluZGljZXMuCiAgICAvLyBwb3NpdGlvbi5pbnRlcmVzdF9jaGVja3BvaW50ID0gc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCBleGlzdHMKICAgIGl0b2IKICAgIHJlcGxhY2UyIDU3CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6ODcKICAgIC8vIHBvc2l0aW9uLnByaW5jaXBhbF9jaGVja3BvaW50ID0gc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCBleGlzdHMKICAgIGl0b2IKICAgIHJlcGxhY2UyIDY1CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6ODktOTAKICAgIC8vICMgQWR2YW5jZSB0aGUgYWNjb3VudCdzIGV2ZW50IGN1cnNvciB0byB0aGUgY3VycmVudCBnbG9iYWwgZXZlbnQgY3Vyc29yLgogICAgLy8gcG9zaXRpb24uc2V0dGxlZF9jdXJzb3IgPSBzZWxmLmV2ZW50X2N1cnNvcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpdG9iCiAgICByZXBsYWNlMiA0OQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjkyLTk0CiAgICAvLyAjIFVwZGF0ZSB0aGUgYWNjb3VudCBwb3NpdGlvbiBhbmQgcmV0dXJuIHRoZSBuZXdseSBhY2NydWVkIGNsYWltYWJsZSBhbW91bnRzCiAgICAvLyAjIGFkZGVkIHRvIHRoZSB0b3RhbCBwb3NpdGlvbidzIGNsYWltYWJsZSBhbW91bnRzLgogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSBwb3NpdGlvbi5jb3B5KCkKICAgIHVuY292ZXIgMwogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojk1CiAgICAvLyByZXR1cm4gY2xhaW1hYmxlX2ludGVyZXN0LCBjbGFpbWFibGVfcHJpbmNpcGFsCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5fZW5zdXJlX3VuaXRzX2FjdGl2YXRlZChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB2b2lkOgpfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZDoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo5NwogICAgLy8gZGVmIF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKHNlbGYsIGhvbGRpbmdfYWRkcmVzczogQWNjb3VudCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTAwCiAgICAvLyBpZiBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKToKICAgIGJ6IF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwMQogICAgLy8gcmV0dXJuCiAgICByZXRzdWIKCl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDMKICAgIC8vIHBvc2l0aW9uID0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY29weSgpCiAgICBmcmFtZV9kaWcgMgogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA0CiAgICAvLyBpZiBwb3NpdGlvbi5yZXNlcnZlZF91bml0cyA9PSBVSW50NjQoMCk6CiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIGJueiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZF9hZnRlcl9pZl9lbHNlQDQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDUKICAgIC8vIHJldHVybgogICAgcmV0c3ViCgpfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZF9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA4CiAgICAvLyBwb3NpdGlvbi51bml0cyArPSBhY3RpdmF0ZWRfdW5pdHMKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDMKICAgICsKICAgIGl0b2IKICAgIHJlcGxhY2UyIDMyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA5CiAgICAvLyBwb3NpdGlvbi5yZXNlcnZlZF91bml0cyA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGl0b2IKICAgIHJlcGxhY2UyIDQwCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTEwCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHBvc2l0aW9uLmNvcHkoKQogICAgZnJhbWVfZGlnIDIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTEKICAgIC8vIGFzc2VydCBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID49IGFjdGl2YXRlZF91bml0cywgZXJyLk9WRVJfRElTVFJJQlVUSU9OCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIGV4aXN0cwogICAgZHVwCiAgICBkaWcgMgogICAgPj0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgcmVtYWluaW5nIEQtQVNBIHVuaXRzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTEyCiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIC09IGFjdGl2YXRlZF91bml0cwogICAgc3dhcAogICAgLQogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9zY2FsZWRfbXVsX2RpdihtdWx0aXBsaWNhbmQ6IHVpbnQ2NCwgbXVsdGlwbGllcjogdWludDY0LCBkaXZpc29yOiB1aW50NjQpIC0+IHVpbnQ2NDoKX3NjYWxlZF9tdWxfZGl2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTUzLTE1NQogICAgLy8gZGVmIF9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLCBtdWx0aXBsaWNhbmQ6IFVJbnQ2NCwgbXVsdGlwbGllcjogVUludDY0LCBkaXZpc29yOiBVSW50NjQKICAgIC8vICkgLT4gVUludDY0OgogICAgcHJvdG8gMyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTcKICAgIC8vIGlmIG11bHRpcGxpY2FuZCA9PSBVSW50NjQoMCkgb3IgbXVsdGlwbGllciA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTMKICAgIGJ6IF9zY2FsZWRfbXVsX2Rpdl9pZl9ib2R5QDIKICAgIGZyYW1lX2RpZyAtMgogICAgYm56IF9zY2FsZWRfbXVsX2Rpdl9hZnRlcl9pZl9lbHNlQDMKCl9zY2FsZWRfbXVsX2Rpdl9pZl9ib2R5QDI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTgKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9zY2FsZWRfbXVsX2Rpdl9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTkKICAgIC8vIGhpZ2gsIGxvdyA9IG9wLm11bHcobXVsdGlwbGljYW5kLCBtdWx0aXBsaWVyKQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIG11bHcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2MAogICAgLy8gcmV0dXJuIG9wLmRpdncoaGlnaCwgbG93LCBkaXZpc29yKQogICAgZnJhbWVfZGlnIC0xCiAgICBkaXZ3CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYW1vdW50X3RvX2luZGV4X2RlbHRhKGFtb3VudDogdWludDY0KSAtPiB1aW50NjQ6Cl9hbW91bnRfdG9faW5kZXhfZGVsdGE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjIKICAgIC8vIGRlZiBfYW1vdW50X3RvX2luZGV4X2RlbHRhKHNlbGYsIGFtb3VudDogVUludDY0KSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2NAogICAgLy8gaWYgYW1vdW50ID09IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMQogICAgYm56IF9hbW91bnRfdG9faW5kZXhfZGVsdGFfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjUKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9hbW91bnRfdG9faW5kZXhfZGVsdGFfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTY2CiAgICAvLyBhc3NlcnQgc2VsZi50b3RhbF91bml0cyA+IFVJbnQ2NCgwKSwgZXJyLk5PX1VOSVRTCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgZHVwCiAgICBhc3NlcnQgLy8gTm8gRC1BU0EgdW5pdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2NwogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KGFtb3VudCwgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwgc2VsZi50b3RhbF91bml0cykKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2luZGV4X2RlbHRhX3RvX2Ftb3VudChpbmRleF9kZWx0YTogdWludDY0KSAtPiB1aW50NjQ6Cl9pbmRleF9kZWx0YV90b19hbW91bnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjkKICAgIC8vIGRlZiBfaW5kZXhfZGVsdGFfdG9fYW1vdW50KHNlbGYsIGluZGV4X2RlbHRhOiBVSW50NjQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTc2CiAgICAvLyBpZiBpbmRleF9kZWx0YSA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGJueiBfaW5kZXhfZGVsdGFfdG9fYW1vdW50X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTc3CiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfaW5kZXhfZGVsdGFfdG9fYW1vdW50X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE3OQogICAgLy8gc2VsZi50b3RhbF91bml0cywKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxODEKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNzgtMTgyCiAgICAvLyByZXR1cm4gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgc2VsZi50b3RhbF91bml0cywKICAgIC8vICAgICBpbmRleF9kZWx0YSwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2dldF9zY2hlZHVsZV9lbnRyeShldmVudF9pZDogdWludDY0KSAtPiBieXRlczoKX2dldF9zY2hlZHVsZV9lbnRyeToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIwMgogICAgLy8gZGVmIF9nZXRfc2NoZWR1bGVfZW50cnkoc2VsZiwgZXZlbnRfaWQ6IFVJbnQ2NCkgLT4gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnk6CiAgICBwcm90byAxIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIwNAogICAgLy8gYXNzZXJ0IGV2ZW50X2lkIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgPgogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgaWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE5MAogICAgLy8gcmV0dXJuIGV2ZW50X2lkIC8vIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDE2CiAgICAvCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMDYKICAgIC8vIGFzc2VydCBwYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxOTQKICAgIC8vIHJldHVybiBldmVudF9pZCAlIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDE2CiAgICAlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMDkKICAgIC8vIGFzc2VydCBvZmZzZXQgPCBwYWdlLmxlbmd0aCwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBwdXNoaW50IDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgMQogICAgPgogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjEwCiAgICAvLyByZXR1cm4gcGFnZVtvZmZzZXRdLmNvcHkoKQogICAgcHVzaGludCA2NQogICAgKgogICAgcHVzaGludCAyCiAgICArCiAgICBwdXNoaW50IDY1CiAgICBib3hfZXh0cmFjdAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKGNvbnRyYWN0X3R5cGU6IHVpbnQ2NCwgZXZlbnRfdHlwZTogdWludDY0KSAtPiB2b2lkOgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTMtMzE1CiAgICAvLyBkZWYgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIHNlbGYsIGNvbnRyYWN0X3R5cGU6IFVJbnQ2NCwgZXZlbnRfdHlwZTogVUludDY0CiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNDcKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNDgKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgaW50Y18yIC8vIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI0OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9NRCksCiAgICBwdXNoaW50IDE5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTAKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgcHVzaGludCAxMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU0LTI1NQogICAgLy8gIyBDaGVjayBjb21tb24gZXZlbnRzIGZpcnN0CiAgICAvLyBpZiBldmVudF90eXBlIGluIGNvbW1vbl9ldmVudHM6CiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjUxCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICBwdXNoaW50IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUA3CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU2CiAgICAvLyByZXR1cm4gVHJ1ZQogICAgaW50Y18xIC8vIDEKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICByZXRzdWIKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTgtMjU5CiAgICAvLyAjIENvbnRyYWN0LXNwZWNpZmljIGFkZGl0aW9uYWwgZXZlbnRzCiAgICAvLyBpZiBjb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9QQU0pOgogICAgZnJhbWVfZGlnIC0yCiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjYwLTI2MQogICAgLy8gIyBQQU0gb25seSBzdXBwb3J0cyBjb21tb24gZXZlbnRzCiAgICAvLyByZXR1cm4gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNjMKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0xBTSkgb3IgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2My0yNjUKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0xBTSkgb3IgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoCiAgICAvLyAgICAgZW51bXMuQ1RfTkFNCiAgICAvLyApOgogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDExCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMgogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDE2CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUAxMToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2Ni0yNzAKICAgIC8vICMgTEFNL05BTSBhZGQ6IFBSLCBJUENCCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjY4CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjY2LTI3MAogICAgLy8gIyBMQU0vTkFNIGFkZDogUFIsIElQQ0IKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDEzCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIHB1c2hpbnQgMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2Ni0yNzAKICAgIC8vICMgTEFNL05BTSBhZGQ6IFBSLCBJUENCCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICkKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF9mYWxzZUAxNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAxMzoKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDE0OgogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMTY6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzIKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTik6CiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMjMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3My0yNzgKICAgIC8vICMgQU5OIGFkZHM6IFBSLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjc1CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjczLTI3OAogICAgLy8gIyBBTk4gYWRkczogUFIsIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDIwCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIHB1c2hpbnQgMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3My0yNzgKICAgIC8vICMgQU5OIGFkZHM6IFBSLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyMAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzcKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIHB1c2hpbnQgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjczLTI3OAogICAgLy8gIyBBTk4gYWRkczogUFIsIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDIxCgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDIwOgogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMjE6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAyMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MAogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfTEFYKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA0CiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMzEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MS0yODcKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MwogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUiksCiAgICBwdXNoaW50IDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MS0yODcKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjgKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjg0CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjgxLTI4NwogICAgLy8gIyBMQVggYWRkczogUFIsIFBJLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyOAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODUKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICBwdXNoaW50IDE4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODEtMjg3CiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDI4CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODEtMjg3CiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDI5CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDI4OgogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMjk6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAzMToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4OQogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQ0xNKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA1CiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMzMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI5MC0yOTEKICAgIC8vICMgQ0xNIGFkZHM6IFBSCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1BSKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDMKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDMzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjkzCiAgICAvLyByZXR1cm4gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5faXNfZHluYW1pY19hbm51aXR5KCkgLT4gdWludDY0OgpfaXNfZHluYW1pY19hbm51aXR5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM1CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzUtMzM2CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIC8vIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGJ6IF9pc19keW5hbWljX2FubnVpdHlfYm9vbF9mYWxzZUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzYKICAgIC8vIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzNCAvLyAiZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM1LTMzNgogICAgLy8gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICAvLyBhbmQgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBieiBfaXNfZHluYW1pY19hbm51aXR5X2Jvb2xfZmFsc2VAMwogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMzNC0zMzcKICAgIC8vIHJldHVybiAoCiAgICAvLyAgICAgc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICAvLyAgICAgYW5kIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgLy8gKQogICAgcmV0c3ViCgpfaXNfZHluYW1pY19hbm51aXR5X2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzQtMzM3CiAgICAvLyByZXR1cm4gKAogICAgLy8gICAgIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKQogICAgLy8gICAgIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIC8vICkKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KGVudHJ5OiBieXRlcykgLT4gdWludDY0LCBieXRlczoKX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozODAKICAgIC8vIGRlZiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudChzZWxmLCBlbnRyeTogdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5CiAgICAvLyBlbnRyeS5hY2NydWFsX2ZhY3RvciA9PSBVSW50NjQoMCkKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAxNwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5LTM5MQogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGJ6IF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2lmX2JvZHlAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzkwCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5LTM5MQogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGJ6IF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2lmX2JvZHlAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzkxCiAgICAvLyBvciBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPT0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5LTM5MQogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGJueiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudF9hZnRlcl9pZl9lbHNlQDQKCl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2lmX2JvZHlAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5MwogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2RpZyAtMQogICAgdW5jb3ZlciAyCiAgICByZXRzdWIKCl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NQogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NgogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NC0zOTgKICAgIC8vIGFjY3J1ZWQgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICAvLyAgICAgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICkKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MDIKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozOTktNDAzCiAgICAvLyByZXR1cm4gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgYWNjcnVlZCwKICAgIC8vICAgICBlbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICBmcmFtZV9kaWcgLTEKICAgIHVuY292ZXIgMgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yKGRpc2NvdW50X2ZhY3RvcjogdWludDY0LCByZWRlbXB0aW9uX2ZhY3RvcjogdWludDY0KSAtPiB1aW50NjQ6Cl9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ2Mi00NjYKICAgIC8vIGRlZiBfZGlzY291bnRfYW5udWl0eV9mYWN0b3IoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBkaXNjb3VudF9mYWN0b3I6IFVJbnQ2NCwKICAgIC8vICAgICByZWRlbXB0aW9uX2ZhY3RvcjogVUludDY0LAogICAgLy8gKSAtPiBVSW50NjQ6CiAgICBwcm90byAyIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ2OAogICAgLy8gaWYgcmVkZW1wdGlvbl9mYWN0b3IgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0xCiAgICBibnogX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDY5CiAgICAvLyByZXR1cm4gZGlzY291bnRfZmFjdG9yCiAgICBmcmFtZV9kaWcgLTIKICAgIHJldHN1YgoKX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3MAogICAgLy8gcGVyaW9kX3JhdGUgPSBzZWxmLmZpeGVkX3BvaW50X3NjYWxlICsgc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzEKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzAtNDc0CiAgICAvLyBwZXJpb2RfcmF0ZSA9IHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgKyBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICByZWRlbXB0aW9uX2ZhY3RvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICBkaWcgMgogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgICsKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3NQogICAgLy8gYXNzZXJ0IHBlcmlvZF9yYXRlID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGR1cAogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDc4CiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDc2LTQ4MAogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIGRpc2NvdW50X2ZhY3RvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gICAgIHBlcmlvZF9yYXRlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkoZW50cnk6IGJ5dGVzLCBwYXlsb2FkOiBieXRlcykgLT4gYnl0ZXMsIGJ5dGVzOgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MTMtNjE1CiAgICAvLyBkZWYgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5KAogICAgLy8gICAgIHNlbGYsIGVudHJ5OiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSwgcGF5bG9hZDogdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0CiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAyIDIKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjIzCiAgICAvLyBhc3NlcnQgZW50cnkuZXZlbnRfaWQgPT0gc2VsZi5ldmVudF9jdXJzb3IsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGN1cnNvcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjI0CiAgICAvLyBhc3NlcnQgZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsIGVyci5OT19EVUVfQ0FTSEZMT1cKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPD0KICAgIGFzc2VydCAvLyBObyBkdWUgY2FzaGZsb3cgdG8gcGF5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MjYKICAgIC8vIGV2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYyNwogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX0lFRCk6CiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGR1cAogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYyOC02MzAKICAgIC8vICMgSUVEIGZpbmFsaXplcyBpc3N1YW5jZTogcmVzZXJ2ZWQgdW5pdHMgYmVjb21lIGFjdGl2YXRhYmxlIGFuZCB0aGUKICAgIC8vICMgc2NoZWR1bGUncyBpbml0aWFsIGNvbnRyYWN0dWFsIHN0YXRlIGJlY29tZXMgbGl2ZS4KICAgIC8vIGFzc2VydCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzIKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPT0gc2VsZi50b3RhbF91bml0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjMxLTYzMwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID09IHNlbGYudG90YWxfdW5pdHMKICAgIC8vICksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9JTkNPTVBMRVRFCiAgICBhc3NlcnQgLy8gUHJpbWFyeSBkaXN0cmlidXRpb24gaXMgbm90IGNvbXBsZXRlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzQKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM1CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzYKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAzMwogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzcKICAgIC8vIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM4CiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzkKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0MAogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX0FDVElWRSkKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgMTAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDUxCiAgICAvLyBhc3NlcnQgZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSA9PSBVSW50NjQoZW51bXMuRVZUX0lFRCksIGVyci5OT1RfRVZUX0lFRAogICAgZnJhbWVfZGlnIDExCiAgICBhc3NlcnQgLy8gTm90IElFRCBldmVudAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDUyCiAgICAvLyByZXR1cm4gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0MS02NDUKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1zZWxmLl9lbnRyeV9pZWRfYW1vdW50KGVudHJ5KSwKICAgIC8vICAgICBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0NAogICAgLy8gc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0MS02NDUKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1zZWxmLl9lbnRyeV9pZWRfYW1vdW50KGVudHJ5KSwKICAgIC8vICAgICBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICAvLyApCiAgICBjYWxsc3ViIF9lbWl0X2V4ZWN1dGlvbl9ldmVudAogICAgZHVwCiAgICBmcmFtZV9idXJ5IC0yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NDYKICAgIC8vIHJldHVybgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0OQogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ICs9IHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBmcmFtZV9idXJ5IC0yCiAgICArCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1MQogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1JSKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCAxMgogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMTAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1NQogICAgLy8gcGF5bG9hZC5vYnNlcnZlZF9yYXRlLAogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjU2CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzNiAvLyAicmF0ZV9yZXNldF9tdWx0aXBsaWVyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1NwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1Mi02NTgKICAgIC8vICMgUlIgZGVyaXZlcyB0aGUgbmV4dCByYXRlIGZyb20gYW4gb2JzZXJ2ZWQgb3JhY2xlIHZhbHVlIHBsdXMgdGhlCiAgICAvLyAjIGNvbnRyYWN0IHNwcmVhZCAvIG11bHRpcGxpZXIgdGVybXMsIHRoZW4gZW5mb3JjZXMgZmxvb3IgYW5kIGNhcC4KICAgIC8vIG9ic2VydmVkX3JhdGUgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBwYXlsb2FkLm9ic2VydmVkX3JhdGUsCiAgICAvLyAgICAgc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICkKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjAKICAgIC8vIG9ic2VydmVkX3JhdGUgKyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzUgLy8gInJhdGVfcmVzZXRfc3ByZWFkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkIGV4aXN0cwogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDMKICAgIC8vIGlmIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgYW5kIHJhdGUgPCBzZWxmLnJhdGVfcmVzZXRfZmxvb3I6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzggLy8gImhhc19yYXRlX3Jlc2V0X2Zsb29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmhhc19yYXRlX3Jlc2V0X2Zsb29yIGV4aXN0cwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMCAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X2Zsb29yIGV4aXN0cwogICAgZnJhbWVfZGlnIDYKICAgID4KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDQKICAgIC8vIHJhdGUgPSBzZWxmLnJhdGVfcmVzZXRfZmxvb3IKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMCAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDYKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfZmxvb3IgZXhpc3RzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1NToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc0NQogICAgLy8gaWYgc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgYW5kIHJhdGUgPiBzZWxmLnJhdGVfcmVzZXRfY2FwOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDM5IC8vICJoYXNfcmF0ZV9yZXNldF9jYXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwIGV4aXN0cwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTgKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMSAvLyAicmF0ZV9yZXNldF9jYXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9jYXAgZXhpc3RzCiAgICBmcmFtZV9kaWcgNgogICAgPAogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc0NgogICAgLy8gcmF0ZSA9IHNlbGYucmF0ZV9yZXNldF9jYXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMSAvLyAicmF0ZV9yZXNldF9jYXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSA2CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X2NhcCBleGlzdHMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjU5CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IHNlbGYuX2NsYW1wX3JhdGUoCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NTktNjYxCiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IHNlbGYuX2NsYW1wX3JhdGUoCiAgICAvLyAgICAgb2JzZXJ2ZWRfcmF0ZSArIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQKICAgIC8vICkKICAgIGZyYW1lX2RpZyA2CiAgICBhcHBfZ2xvYmFsX3B1dAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMTg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzEKICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QSSk6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMjAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY3MgogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzMKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDIzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc4CiAgICAvLyBpZiBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKToKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAyOQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc5CiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFJGKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCA1CiAgICA9PQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMzAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4NAogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCAtIHNlbGYuZXZlbnRfY3Vyc29yCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIC0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4NgogICAgLy8gKiBVSW50NjQoY3N0Lk9QX1VQX05PTl9DQVNIX1BFUl9FTlRSWV9CVURHRVQpCiAgICBwdXNoaW50IDEwMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjgzLTY4NgogICAgLy8gKyAoCiAgICAvLyAgICAgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCAtIHNlbGYuZXZlbnRfY3Vyc29yCiAgICAvLyApCiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfUEVSX0VOVFJZX0JVREdFVCkKICAgICoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4MgogICAgLy8gVUludDY0KGNzdC5PUF9VUF9OT05fQ0FTSF9CQVNFX0JVREdFVCkKICAgIGludGMgNCAvLyAxNTAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODItNjg2CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX05PTl9DQVNIX0JBU0VfQlVER0VUKQogICAgLy8gKyAoCiAgICAvLyAgICAgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCAtIHNlbGYuZXZlbnRfY3Vyc29yCiAgICAvLyApCiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfUEVSX0VOVFJZX0JVREdFVCkKICAgICsKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4MC02ODgKICAgIC8vIGVuc3VyZV9idWRnZXQoCiAgICAvLyAgICAgcmVxdWlyZWRfYnVkZ2V0PSgKICAgIC8vICAgICAgICAgVUludDY0KGNzdC5PUF9VUF9OT05fQ0FTSF9CQVNFX0JVREdFVCkKICAgIC8vICAgICAgICAgKyAoCiAgICAvLyAgICAgICAgICAgICBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IC0gc2VsZi5ldmVudF9jdXJzb3IKICAgIC8vICAgICAgICAgKQogICAgLy8gICAgICAgICAqIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfUEVSX0VOVFJZX0JVREdFVCkKICAgIC8vICAgICApLAogICAgLy8gKQogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDkwCiAgICAvLyBkaXNjb3VudF9mYWN0b3IgPSBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5MQogICAgLy8gZGVub21pbmF0b3IgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5MgogICAgLy8gc2tpcF9maXJzdF9yZWRlbXB0aW9uID0gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5NAogICAgLy8gaWYgZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAyNQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgZnJhbWVfYnVyeSA4CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAzNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDk1LTQ5OQogICAgLy8gIyBBbiBpbml0aWFsIFBSRiBtYXkgZGVzY3JpYmUgdGhlIGZpcnN0IHJlZGVtcHRpb24gcGVyaW9kIGRpcmVjdGx5LgogICAgLy8gZGlzY291bnRfZmFjdG9yID0gc2VsZi5fZGlzY291bnRfYW5udWl0eV9mYWN0b3IoCiAgICAvLyAgICAgZGlzY291bnRfZmFjdG9yLAogICAgLy8gICAgIGVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDgKICAgIGNhbGxzdWIgX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTAxCiAgICAvLyBza2lwX2ZpcnN0X3JlZGVtcHRpb24gPSBUcnVlCiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfYnVyeSA3CiAgICBmcmFtZV9idXJ5IDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDM1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTAzCiAgICAvLyBmdXR1cmVfZXZlbnRfaWQgPSBzZWxmLmV2ZW50X2N1cnNvciArIFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfd2hpbGVfdG9wQDM2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA0CiAgICAvLyB3aGlsZSBmdXR1cmVfZXZlbnRfaWQgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgZnJhbWVfZGlnIDMKICAgID4KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl93aGlsZUA0OAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA1CiAgICAvLyBmdXR1cmVfZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoZnV0dXJlX2V2ZW50X2lkKQogICAgZnJhbWVfZGlnIDMKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwNgogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPSBmdXR1cmVfZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MDctNTA4CiAgICAvLyAjIE9ubHkgcmVkZW1wdGlvbi1iZWFyaW5nIGV2ZW50cyBjb250cmlidXRlIHRvIHRoZSBhbm51aXR5IGRlbm9taW5hdG9yLgogICAgLy8gaXNfcmVkZW1wdGlvbl9ldmVudCA9IGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpIG9yICgKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwNy01MTEKICAgIC8vICMgT25seSByZWRlbXB0aW9uLWJlYXJpbmcgZXZlbnRzIGNvbnRyaWJ1dGUgdG8gdGhlIGFubnVpdHkgZGVub21pbmF0b3IuCiAgICAvLyBpc19yZWRlbXB0aW9uX2V2ZW50ID0gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QUikgb3IgKAogICAgLy8gICAgIGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfTUQpCiAgICAvLyAgICAgYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICAvLyApCiAgICBibnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfdHJ1ZUA0MAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA5CiAgICAvLyBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgZnJhbWVfZGlnIDQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MDktNTEwCiAgICAvLyBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgLy8gYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF9mYWxzZUA0MQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTEwCiAgICAvLyBhbmQgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IgPiBVSW50NjQoMCkKICAgIGZyYW1lX2RpZyAwCiAgICBwdXNoaW50IDI1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA5LTUxMAogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCkKICAgIC8vIGFuZCBmdXR1cmVfZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX3RydWVANDA6CiAgICBpbnRjXzEgLy8gMQoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfbWVyZ2VANDI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTIKICAgIC8vIGlmIGlzX3JlZGVtcHRpb25fZXZlbnQ6CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA0NwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTEzCiAgICAvLyBpZiBza2lwX2ZpcnN0X3JlZGVtcHRpb246CiAgICBmcmFtZV9kaWcgNwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUA0NQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTE0CiAgICAvLyBza2lwX2ZpcnN0X3JlZGVtcHRpb24gPSBGYWxzZQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgNwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANDc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjEKICAgIC8vIGZ1dHVyZV9ldmVudF9pZCArPSBVSW50NjQoMSkKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV93aGlsZV90b3BAMzYKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlANDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTgKICAgIC8vIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZnJhbWVfZGlnIDAKICAgIHB1c2hpbnQgMjUKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTYtNTE5CiAgICAvLyBkaXNjb3VudF9mYWN0b3IgPSBzZWxmLl9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcigKICAgIC8vICAgICBkaXNjb3VudF9mYWN0b3IsCiAgICAvLyAgICAgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMgogICAgc3dhcAogICAgY2FsbHN1YiBfZGlzY291bnRfYW5udWl0eV9mYWN0b3IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjAKICAgIC8vIGRlbm9taW5hdG9yICs9IGRpc2NvdW50X2ZhY3RvcgogICAgZnJhbWVfZGlnIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA0NwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDE6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF9tZXJnZUA0MgoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX3doaWxlQDQ4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTIzCiAgICAvLyBhc3NlcnQgZGVub21pbmF0b3IgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZnJhbWVfZGlnIDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUyNAogICAgLy8gbnVtZXJhdG9yID0gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTI1CiAgICAvLyBpZiBlbnRyeS5mbGFncyAmIFVJbnQ2NChlbnVtcy5GTEFHX0lOSVRJQUxfUFJGKSA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNTcKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gOAogICAgJgogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDUwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjYtNTI3CiAgICAvLyAjIFN1YnNlcXVlbnQgUFJGIGV2ZW50cyBhbW9ydGl6ZSBib3RoIHByaW5jaXBhbCBhbmQgYWxyZWFkeSBhY2NydWVkIGNhcnJ5LgogICAgLy8gbnVtZXJhdG9yICs9IHNlbGYuYWNjcnVlZF9pbnRlcmVzdAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgICsKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDUwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTMwCiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTI4LTUzMgogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIG51bWVyYXRvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gICAgIGRlbm9taW5hdG9yLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDEKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODkKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IHNlbGYuX3JlY2FsY3VsYXRlX2FubnVpdHlfcGF5bWVudCgKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njg5LTY5MQogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gc2VsZi5fcmVjYWxjdWxhdGVfYW5udWl0eV9wYXltZW50KAogICAgLy8gICAgIGVudHJ5CiAgICAvLyApCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMzA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OTQKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY5NS02OTkKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1VSW50NjQoMCksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OTcKICAgIC8vIHBheW9mZj1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njk4CiAgICAvLyBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY5NS02OTkKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1VSW50NjQoMCksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgY2FsbHN1YiBfZW1pdF9leGVjdXRpb25fZXZlbnQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDI5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjkzCiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDMwCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDIwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc0CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9JUENCKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCAxOAogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDIzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzUtNjc2CiAgICAvLyAjIElQQ0Iga2VlcHMgcHJpbmNpcGFsIHVuY2hhbmdlZCBhbmQgb25seSByZXNldHMgdGhlIGludGVyZXN0IGJhc2UuCiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIGIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMjMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMTA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjIKICAgIC8vIGVsaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1JSRik6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgMTEKICAgID09CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDE0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjMKICAgIC8vIG5leHRfcmF0ZSA9IGVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY0CiAgICAvLyBpZiBuZXh0X3JhdGUgPT0gVUludDY0KDApOgogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDEzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjUKICAgIC8vIG5leHRfcmF0ZSA9IHNlbGYucmF0ZV9yZXNldF9uZXh0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzcgLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDUKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfbmV4dCBleGlzdHMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY2CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IG5leHRfcmF0ZQogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgZnJhbWVfZGlnIDUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDE0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY4CiAgICAvLyBpZiBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSAhPSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgOQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2OQogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPSBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZQogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgZnJhbWVfZGlnIDkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KGVudHJ5OiBieXRlcywgcGF5b2ZmOiB1aW50NjQsIHNldHRsZWRfYW1vdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpfZW1pdF9leGVjdXRpb25fZXZlbnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MDUtNzExCiAgICAvLyBkZWYgX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgKiwKICAgIC8vICAgICBlbnRyeTogdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnksCiAgICAvLyAgICAgcGF5b2ZmOiBVSW50NjQsCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ6IFVJbnQ2NCwKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDMgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE1CiAgICAvLyBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25JRAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE2CiAgICAvLyBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIGZyYW1lX2RpZyAtMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTcKICAgIC8vIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIGZyYW1lX2RpZyAtMwogICAgZXh0cmFjdCA4IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxOAogICAgLy8gc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICBmcmFtZV9kaWcgLTMKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTkKICAgIC8vIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MjIKICAgIC8vIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIGZyYW1lX2RpZyAtMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE3CiAgICAvLyBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICBpbnRjXzIgLy8gOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIyCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBnZXRieXRlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NTEKICAgIC8vIGlmIHBheW9mZiA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJueiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NTIKICAgIC8vIHJldHVybiBVSW50NjQoZW51bXMuUEFZT0ZGX1NJR05fUE9TSVRJVkUpCiAgICBpbnRjXzEgLy8gMQoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX3BheW9mZl9zaWduQDc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MjEtNzIzCiAgICAvLyBwYXlvZmZfc2lnbj1hcmM0LlVJbnQ4KAogICAgLy8gICAgIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIC8vICksCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgaW50Y18yIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MjUKICAgIC8vIGN1cnJlbmN5X2lkPXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzI2CiAgICAvLyBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTQtNzI3CiAgICAvLyBFeGVjdXRpb25FdmVudCgKICAgIC8vICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIC8vICAgICBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYXBwbGllZF9hdD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICBwYXlvZmY9cGF5b2ZmLAogICAgLy8gICAgIHBheW9mZl9zaWduPWFyYzQuVUludDgoCiAgICAvLyAgICAgICAgIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIC8vICAgICApLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PXNldHRsZWRfYW1vdW50LAogICAgLy8gICAgIGN1cnJlbmN5X2lkPXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAwCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzEzLTcyOAogICAgLy8gYXJjNC5lbWl0KAogICAgLy8gICAgIEV4ZWN1dGlvbkV2ZW50KAogICAgLy8gICAgICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgICAgIHBheW9mZj1wYXlvZmYsCiAgICAvLyAgICAgICAgIHBheW9mZl9zaWduPWFyYzQuVUludDgoCiAgICAvLyAgICAgICAgICAgICBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICAvLyAgICAgICAgICksCiAgICAvLyAgICAgICAgIHNldHRsZWRfYW1vdW50PXNldHRsZWRfYW1vdW50LAogICAgLy8gICAgICAgICBjdXJyZW5jeV9pZD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgICAgIHNlcXVlbmNlPWVudHJ5LmV2ZW50X2lkICsgVUludDY0KDEpLAogICAgLy8gICAgICkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDlhMzMyYjk1IC8vIG1ldGhvZCAiRXhlY3V0aW9uRXZlbnQodWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc1MwogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiAoVUludDY0KGVudW1zLkVWVF9JRUQpLCBVSW50NjQoZW51bXMuRVZUX1BJKSk6CiAgICBmcmFtZV9kaWcgNQogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBibnogX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2lmX2JvZHlANQogICAgZnJhbWVfZGlnIDUKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGJ6IF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pZl9lbHNlQDYKCl9lbWl0X2V4ZWN1dGlvbl9ldmVudF9pZl9ib2R5QDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NTQKICAgIC8vIHJldHVybiBVSW50NjQoZW51bXMuUEFZT0ZGX1NJR05fUE9TSVRJVkUpCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIyCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBiIF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9wYXlvZmZfc2lnbkA3CgpfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzU1CiAgICAvLyByZXR1cm4gVUludDY0KGVudW1zLlBBWU9GRl9TSUdOX05FR0FUSVZFKQogICAgcHVzaGludCAyNTUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcyMgogICAgLy8gc2VsZi5fcGF5b2ZmX3NpZ24oZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSwgcGF5b2ZmKQogICAgYiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fcGF5b2ZmX3NpZ25ANwoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9yb2xlX2lzX2FjdGl2ZShyb2xlX21hcDogYnl0ZXMsIHJvbGVfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NDoKX3JvbGVfaXNfYWN0aXZlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU3CiAgICAvLyBkZWYgX3JvbGVfaXNfYWN0aXZlKHNlbGYsIHJvbGVfbWFwOiB0eXAuUmJhY1JvbGUsIHJvbGVfYWRkcmVzczogQWNjb3VudCkgLT4gYm9vbDoKICAgIHByb3RvIDIgMQogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5CiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5LTYwCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5LTYxCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjEKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAtNjEKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgPj0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX21lcmdlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKSAtPiB2b2lkOgpfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2NQogICAgLy8gYXNzZXJ0IHNlbGYuX2lzX2FycmFuZ2VyKFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTIKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgPT0gc2VsZi5hcnJhbmdlci52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE4IC8vIDB4NTIyMzQxNzI3MjYxNmU2NzY1NzIyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgPT0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2NQogICAgLy8gYXNzZXJ0IHNlbGYuX2lzX2FycmFuZ2VyKFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpIC0+IHZvaWQ6Cl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4MwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFzc2V0X2RlZmF1bHRlZCwgZXJyLkRFRkFVTFRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQxIC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfZGVmYXVsdGVkIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIERlZmF1bHRlZAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkgLT4gdm9pZDoKX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg2CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYXNzZXRfc3VzcGVuZGVkLCBlcnIuU1VTUEVOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzMgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9zdXNwZW5kZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gU3VzcGVuZGVkIG9wZXJhdGlvbnMKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkOiB1aW50NjQpIC0+IHZvaWQ6Cl9hc3NlcnRfdmFsaWRfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OAogICAgLy8gZGVmIF9hc3NlcnRfdmFsaWRfcm9sZShzZWxmLCByb2xlX2lkOiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTAKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIHB1c2hpbnQgMjAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkxCiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgcHVzaGludCAyNQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTIKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICBwdXNoaW50IDQwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MwogICAgLy8gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgcHVzaGludCA1MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTQKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgcHVzaGludCA2MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTUKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICBwdXNoaW50IDcwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NgogICAgLy8gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgcHVzaGludCA4MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfZmFsc2VAOAoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3OgogICAgaW50Y18xIC8vIDEKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX21lcmdlQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgcmV0c3ViCgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9mYWxzZUA4OgogICAgaW50Y18wIC8vIDAKICAgIGIgX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfbWVyZ2VAOQo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="}, "sourceInfo": {"approval": {"pcOffsetMethod": "none", "sourceInfo": [{"pc": [2702], "errorMessage": "ACTUS event not yet executed"}, {"pc": [2460], "errorMessage": "Can not distribute zero units"}, {"pc": [3203, 3210, 3583], "errorMessage": "D-ASA already configured"}, {"pc": [1309, 2041, 2420, 2566, 3800, 3946, 4297, 4528, 4674], "errorMessage": "D-ASA not configured"}, {"pc": [3594], "errorMessage": "D-ASA terms not configured"}, {"pc": [6863], "errorMessage": "Defaulted"}, {"pc": [3221], "errorMessage": "Denomination asset is not properly set"}, {"pc": [3236], "errorMessage": "Different settlement asset not supported, must be equal to denomination asset"}, {"pc": [3472, 3479, 3481], "errorMessage": "IED must be set in the future"}, {"pc": [1327, 2110, 2581, 4315, 6215], "errorMessage": "IED not yet executed"}, {"pc": [2473, 5598], "errorMessage": "Insufficient remaining D-ASA units"}, {"pc": [2676, 2742], "errorMessage": "Insufficient sender units to transfer"}, {"pc": [1937, 3123, 3141, 3197, 3674, 3710, 4362, 5782, 6060, 6120, 6523], "errorMessage": "Invalid ACTUS configuration"}, {"pc": [2050, 2454, 2637, 2652, 2809, 2882, 2945, 2987, 5410, 5535], "errorMessage": "Invalid account holding address"}, {"pc": [4865, 4889, 4913, 4937, 4961, 5018, 5046, 5068, 5090, 5112, 5291, 5309, 5324, 5339, 5354], "errorMessage": "Invalid account role address"}, {"pc": [3183], "errorMessage": "Invalid day-count convention ID"}, {"pc": [1440, 3821, 4149, 6092], "errorMessage": "Invalid event cursor"}, {"pc": [3659, 3722, 3998, 4339, 5698], "errorMessage": "Invalid event id"}, {"pc": [3834, 4213, 4220, 4352], "errorMessage": "Invalid event type"}, {"pc": [5002, 5281, 6933], "errorMessage": "Invalid role identifier"}, {"pc": [3588, 3734, 3742, 4051, 4426, 5713, 5729], "errorMessage": "Invalid schedule page"}, {"pc": [5646], "errorMessage": "No D-ASA units"}, {"pc": [1446, 1966, 2147, 6101], "errorMessage": "No due cashflow to pay"}, {"pc": [6184], "errorMessage": "Not IED event"}, {"pc": [2095, 2428, 2624, 2799, 2855, 2865, 2951, 4248, 5135, 6855], "errorMessage": "Not authorized"}, {"pc": [1567, 1575, 2196, 2270, 2279], "errorMessage": "Not enough funds for the payment"}, {"pc": [3971, 3984, 4324], "errorMessage": "Observed event required to execute this action"}, {"pc": [2442, 2490], "errorMessage": "Primary distribution is closed"}, {"pc": [6132], "errorMessage": "Primary distribution is not complete"}, {"pc": [2665], "errorMessage": "Sender and receiver must be different"}, {"pc": [5396, 6871], "errorMessage": "Suspended operations"}, {"pc": [2377, 3700, 4384], "errorMessage": "Time events must be sorted in strictly ascending order"}, {"pc": [2598, 2615], "errorMessage": "Transfer is closed"}, {"pc": [2669], "errorMessage": "Transfer units must be greater than zero"}, {"pc": [993], "errorMessage": "Wrong Global Bytes allocation"}, {"pc": [999], "errorMessage": "Wrong Global UInts allocation"}, {"pc": [1003], "errorMessage": "Wrong Local Bytes allocation"}, {"pc": [1007], "errorMessage": "Wrong Local UInts allocation"}, {"pc": [1548, 2189], "errorMessage": "account opted into asset"}, {"pc": [6815, 6830], "errorMessage": "check BoxMap entry exists"}, {"pc": [2086, 2124, 2165, 2203, 2494, 2672, 2731, 2757, 5390, 5556], "errorMessage": "check self.account entry exists"}, {"pc": [1629, 1861, 1949, 4585, 6220, 6543], "errorMessage": "check self.accrued_interest exists"}, {"pc": [5153, 6853], "errorMessage": "check self.arranger exists"}, {"pc": [6861], "errorMessage": "check self.asset_defaulted exists"}, {"pc": [6869], "errorMessage": "check self.asset_suspended exists"}, {"pc": [3131, 3577, 3967, 3979, 4320, 4533, 5944], "errorMessage": "check self.contract_type exists"}, {"pc": [1597, 4590, 5418, 5496], "errorMessage": "check self.cumulative_interest_index exists"}, {"pc": [1609, 4595, 5429, 5504], "errorMessage": "check self.cumulative_principal_index exists"}, {"pc": [5954], "errorMessage": "check self.dynamic_principal_redemption exists"}, {"pc": [1365, 1377, 1438, 1680, 2680, 2692, 3813, 4142, 4561, 4678, 4690, 4727, 5511, 6090, 6172, 6369, 6424, 6562], "errorMessage": "check self.event_cursor exists"}, {"pc": [5444, 5458, 5651, 5680, 6010, 6018, 6045, 6065, 6255, 6388, 6549], "errorMessage": "check self.fixed_point_scale exists"}, {"pc": [6298], "errorMessage": "check self.has_rate_reset_cap exists"}, {"pc": [6271], "errorMessage": "check self.has_rate_reset_floor exists"}, {"pc": [3208, 3593, 4557, 6189], "errorMessage": "check self.initial_exchange_amount exists"}, {"pc": [2478, 2488], "errorMessage": "check self.initial_exchange_date exists"}, {"pc": [1805, 4575, 5986, 6000], "errorMessage": "check self.interest_calculation_base exists"}, {"pc": [1877, 1892], "errorMessage": "check self.next_principal_redemption exists"}, {"pc": [4580, 5978, 6005, 6050], "errorMessage": "check self.nominal_interest_rate exists"}, {"pc": [2055, 2068], "errorMessage": "check self.op_daemon exists"}, {"pc": [1702, 1771, 1797, 1851, 1903, 1912, 1934, 4570, 6528, 6609], "errorMessage": "check self.outstanding_principal exists"}, {"pc": [6306, 6320], "errorMessage": "check self.rate_reset_cap exists"}, {"pc": [6279, 6293], "errorMessage": "check self.rate_reset_floor exists"}, {"pc": [6250], "errorMessage": "check self.rate_reset_multiplier exists"}, {"pc": [6643], "errorMessage": "check self.rate_reset_next exists"}, {"pc": [6263], "errorMessage": "check self.rate_reset_spread exists"}, {"pc": [1553, 2265, 4600], "errorMessage": "check self.reserved_interest exists"}, {"pc": [1558, 1587, 2275, 2290, 4605], "errorMessage": "check self.reserved_principal exists"}, {"pc": [2465, 2513, 4552, 5593, 6125], "errorMessage": "check self.reserved_units_total exists"}, {"pc": [1369, 2684, 3817, 3996, 4013, 4133, 4334, 4369, 4388, 4508, 4565, 4682, 5694, 6365, 6432], "errorMessage": "check self.schedule_entry_count exists"}, {"pc": [4041, 4416], "errorMessage": "check self.schedule_page entry exists"}, {"pc": [1545, 2155, 2183, 6715], "errorMessage": "check self.settlement_asset_id exists"}, {"pc": [1308, 1322, 2040, 2105, 2419, 2438, 2565, 2576, 2859, 3201, 3581, 3799, 3945, 4296, 4310, 4526, 4673, 5539, 6116, 6210], "errorMessage": "check self.status exists"}, {"pc": [2471, 2524, 4547, 5644, 5675, 6130], "errorMessage": "check self.total_units exists"}, {"pc": [2603, 2613], "errorMessage": "check self.transfer_closure_date exists"}, {"pc": [2586, 2594], "errorMessage": "check self.transfer_opening_date exists"}, {"pc": [3636, 3693], "errorMessage": "index access is out of bounds"}, {"pc": [2024, 3068, 3551, 4046, 4421], "errorMessage": "invalid array length header"}, {"pc": [2789, 3539, 5125], "errorMessage": "invalid number of bytes for arc4.bool"}, {"pc": [2032], "errorMessage": "invalid number of bytes for arc4.dynamic_array"}, {"pc": [3566], "errorMessage": "invalid number of bytes for arc4.dynamic_array"}, {"pc": [2018, 2403, 2543, 2551, 2781, 2839, 2847, 2927, 2935, 2978, 3003, 4746, 4770, 4804, 4985, 5167, 5251], "errorMessage": "invalid number of bytes for arc4.static_array"}, {"pc": [1303, 2361, 2370, 2411, 2560, 3529, 3930], "errorMessage": "invalid number of bytes for arc4.uint64"}, {"pc": [4794, 4975, 5241], "errorMessage": "invalid number of bytes for arc4.uint8"}, {"pc": [3040], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.InitialKernelState"}, {"pc": [3029], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.NormalizedActusTerms"}, {"pc": [4292], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.ObservedCashEventRequest"}, {"pc": [3941], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.ObservedEventRequest"}, {"pc": [3073], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.Prospectus"}, {"pc": [4815], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.RoleValidity"}, {"pc": [3057], "errorMessage": "invalid tail pointer at index 1 of (uint8[32],(len+utf8[]))"}, {"pc": [3052], "errorMessage": "invalid tuple encoding"}, {"pc": [4113, 4488], "errorMessage": "max array length exceeded"}, {"pc": [4539, 6707], "errorMessage": "overflow"}]}, "clear": {"pcOffsetMethod": "none", "sourceInfo": []}}, "templateVariables": {}}""" APP_SPEC = algokit_utils.Arc56Contract.from_json(_APP_SPEC_JSON) def _parse_abi_args(args: object | None = None) -> list[object] | None: @@ -162,6 +162,19 @@ class NormalizedActusTerms: dynamic_principal_redemption: bool fixed_point_scale: int +@dataclasses.dataclass(frozen=True) +class ObservedCashEventRequest: + """Struct for ObservedCashEventRequest""" + event_id: int + event_type: int + scheduled_time: int + accrual_factor: int + redemption_accrual_factor: int + next_nominal_interest_rate: int + next_principal_redemption: int + next_outstanding_principal: int + flags: int + @dataclasses.dataclass(frozen=True) class ObservedEventRequest: """Struct for ObservedEventRequest""" @@ -310,6 +323,15 @@ class ApplyNonCashEventArgs: def abi_method_signature(self) -> str: return "apply_non_cash_event(uint64,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64" +@dataclasses.dataclass(frozen=True, kw_only=True) +class AppendObservedCashEventArgs: + """Dataclass for append_observed_cash_event arguments""" + payload: ObservedCashEventRequest + + @property + def abi_method_signature(self) -> str: + return "append_observed_cash_event((uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64" + @dataclasses.dataclass(frozen=True, kw_only=True) class RbacRotateArrangerArgs: """Dataclass for rbac_rotate_arranger arguments""" @@ -580,6 +602,19 @@ def apply_non_cash_event( "args": method_args, })) + def append_observed_cash_event( + self, + args: tuple[ObservedCashEventRequest] | AppendObservedCashEventArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.AppCallMethodCallParams: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "append_observed_cash_event((uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64", + "args": method_args, + })) + def contract_get_state( self, params: algokit_utils.CommonAppCallParams | None = None @@ -921,6 +956,19 @@ def apply_non_cash_event( "args": method_args, })) + def append_observed_cash_event( + self, + args: tuple[ObservedCashEventRequest] | AppendObservedCashEventArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.BuiltTransactions: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "append_observed_cash_event((uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64", + "args": method_args, + })) + def contract_get_state( self, params: algokit_utils.CommonAppCallParams | None = None @@ -1304,6 +1352,22 @@ def apply_non_cash_event( parsed_response = response return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) + def append_observed_cash_event( + self, + args: tuple[ObservedCashEventRequest] | AppendObservedCashEventArgs, + params: algokit_utils.CommonAppCallParams | None = None, + send_params: algokit_utils.SendParams | None = None + ) -> algokit_utils.SendAppTransactionResult[int]: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "append_observed_cash_event((uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64", + "args": method_args, + }), send_params=send_params) + parsed_response = response + return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) + def contract_get_state( self, params: algokit_utils.CommonAppCallParams | None = None, @@ -2219,6 +2283,12 @@ def decode_return_value( return_value: algokit_utils.ABIReturn | None ) -> int | None: ... @typing.overload + def decode_return_value( + self, + method: typing.Literal["append_observed_cash_event((uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64"], + return_value: algokit_utils.ABIReturn | None + ) -> int | None: ... + @typing.overload def decode_return_value( self, method: typing.Literal["contract_get_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)"], @@ -2765,6 +2835,26 @@ def apply_non_cash_event( compilation_params=compilation_params ) + def append_observed_cash_event( + self, + args: tuple[ObservedCashEventRequest] | AppendObservedCashEventArgs, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.AppCreateMethodCallParams: + """Creates a new instance using the append_observed_cash_event((uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64 ABI method""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.create( + algokit_utils.AppFactoryCreateMethodCallParams( + **{ + **dataclasses.asdict(params), + "method": "append_observed_cash_event((uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64", + "args": _parse_abi_args(args), + } + ), + compilation_params=compilation_params + ) + def contract_get_state( self, *, @@ -3413,6 +3503,25 @@ def apply_non_cash_event( ) return self + def append_observed_cash_event( + self, + args: tuple[ObservedCashEventRequest] | AppendObservedCashEventArgs, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> "DasaComposer": + self._composer.add_app_call_method_call( + self.client.params.append_observed_cash_event( + args=args, + params=params, + ) + ) + self._result_mappers.append( + lambda v: self.client.decode_return_value( + "append_observed_cash_event((uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64", v + ) + ) + return self + def contract_get_state( self, params: algokit_utils.CommonAppCallParams | None = None, From 1e8c98167283ba00a86372a3650a41bb134b7982 Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 00:11:08 +0100 Subject: [PATCH 154/244] chore: lint --- modules/actus_kernel.py | 12 +++++++----- src/normalization/core.py | 3 +-- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/modules/actus_kernel.py b/modules/actus_kernel.py index 362ab425..88388660 100644 --- a/modules/actus_kernel.py +++ b/modules/actus_kernel.py @@ -680,9 +680,7 @@ def _apply_non_cash_schedule_entry( ensure_budget( required_budget=( UInt64(cst.OP_UP_NON_CASH_BASE_BUDGET) - + ( - self.schedule_entry_count - self.event_cursor - ) + + (self.schedule_entry_count - self.event_cursor) * UInt64(cst.OP_UP_NON_CASH_PER_ENTRY_BUDGET) ), ) @@ -971,7 +969,9 @@ def _append_observed_event(self, payload: typ.ObservedEventRequest) -> None: self.schedule_page[page_index] = page.copy() self.schedule_entry_count += UInt64(1) - def _append_observed_cash_event(self, payload: typ.ObservedCashEventRequest) -> None: + def _append_observed_cash_event( + self, payload: typ.ObservedCashEventRequest + ) -> None: """ Append an authorized observed cash event to the schedule tail. @@ -984,7 +984,9 @@ def _append_observed_cash_event(self, payload: typ.ObservedCashEventRequest) -> assert payload.flags & UInt64(enums.FLAG_CASH_EVENT), err.INVALID_ACTUS_CONFIG if self.schedule_entry_count > UInt64(0): - previous_entry = self._get_schedule_entry(self.schedule_entry_count - UInt64(1)) + previous_entry = self._get_schedule_entry( + self.schedule_entry_count - UInt64(1) + ) assert ( previous_entry.scheduled_time <= payload.scheduled_time ), err.INVALID_SORTING diff --git a/src/normalization/core.py b/src/normalization/core.py index 6237cf27..df879d8b 100644 --- a/src/normalization/core.py +++ b/src/normalization/core.py @@ -8,8 +8,7 @@ from smart_contracts import constants as cst from ..contracts import ContractAttributes -from ..day_count import BusinessDayConvention, Calendar -from ..day_count import year_fraction_fixed +from ..day_count import BusinessDayConvention, Calendar, year_fraction_fixed from ..errors import ActusNormalizationError, UnsupportedActusFeatureError from ..models import ( ExecutionScheduleEntry, From 197df8d3da73ca923c9c235348f9ff858605e53c Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 00:11:33 +0100 Subject: [PATCH 155/244] chore: build artifacts --- .../artifacts/d_asa/DASA.approval.puya.map | 2 +- .../artifacts/d_asa/DASA.approval.teal | 518 +++++++++--------- .../artifacts/d_asa/DASA.arc56.json | 2 +- .../artifacts/d_asa/dasa_client.py | 2 +- 4 files changed, 261 insertions(+), 263 deletions(-) diff --git a/smart_contracts/artifacts/d_asa/DASA.approval.puya.map b/smart_contracts/artifacts/d_asa/DASA.approval.puya.map index dc64620b..b314f1b2 100644 --- a/smart_contracts/artifacts/d_asa/DASA.approval.puya.map +++ b/smart_contracts/artifacts/d_asa/DASA.approval.puya.map @@ -8,7 +8,7 @@ "../../../modules/transfer_agent.py", "../../d_asa/contract.py" ], - "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AG4BmD;;AAAf;;AAA5B;AAC4C;;AAAf;;AAA7B;AAkBA;;AAAuB;AAAvB;AACA;;AAAuB;AAAvB;AFQA;AAAc;AAAd;AACA;;AAAqB;AAArB;AAGA;;AAAuB;;AAAvB;AACA;;AAAsB;;AAAtB;AAGA;;AAA6B;AAA7B;AACA;;AAA2B;AAA3B;AAGA;;AAA6B;AAA7B;AACA;;AAAqB;AAArB;AACA;;AAA6B;AAA7B;AACA;;AAA6B;AAA7B;AAGA;;AAA4B;AAA5B;AAGA;;AAAmB;AAAnB;AACA;;AAA4B;AAA5B;AAGA;;AAA+B;AAA/B;AACA;;AAA6B;AAA7B;AACA;;AAAiC;AAAjC;AACA;;AAAoC;AAApC;AAGA;;AAAiC;AAAjC;AACA;;AAAwB;AAAxB;AAGA;;AAA6B;AAA7B;AACA;;AAAyB;AAAzB;AACA;;AAA6B;AAA7B;AACA;;AAAwB;AAAxB;AACA;;AAAsB;AAAtB;AACA;;AAAuB;AAAvB;AACA;;AAA4B;AAA5B;AACA;;AAA0B;AAA1B;AAGA;;AAA0B;AAA1B;AACA;;AAAyB;AAAzB;AAGA;;AAAiC;AAAjC;AACA;;AAAkC;AAAlC;AAQA;AAAoB;AAApB;AACA;AAA4B;AAA5B;AAGA;;AAAyB;AAAzB;AIhGO;;AAA6B;;AAA7B;AAAP;AACO;;AAAuB;;AAAvB;AAAP;AACO;;AAAA;AAAP;AACO;;AAAA;AAAP;AAlBR;;;;;;AAAA;;;AAAA;;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;;;;;;AAAA;;;AAAA;;;;AAAA;AF4IK;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ADrGA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ADgGU;AAAA;AAAA;AAAA;AAAP;AC5FA;;;AACA;;;AACA;;;ADkFO;AAAA;AAAA;AAAA;AAAe;;AAAf;AAYA;AAAP;AC5FG;;;AAAX;;;AAIsB;AACA;;AADA;AADF;;AAAA;AAFR;AAAA;;;AAQe;AAAnB;;AACkB;AAAlB;;AACmB;AAAnB;;AAGI;;AAAA;;AAAA;AAAA;;;AACI;AAAA;AAAA;AAAA;AAAoB;AAAA;AAAA;AAAA;AAApB;AADJ;;;AAGiC;AAAA;AAAA;AAAA;AAAzB;;;AAAA;AAAA;;AACL;;AAAA;AAAA;AAAA;;AAAuB;;AAAvB;AAAf;;;AAEuC;;AAAA;AAAA;AAAA;AAAA;;ADoR3B;AADG;AAAA;AAAA;;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;;ACnRA;;;ADydA;;AAAA;AAAA;AAAkB;AAAA;AAAA;AAAA;AAAlB;AAAP;AACO;;AAAwB;;AAAxB;AAAP;AAxIG;;AAAA;;;AAAA;;AAAyC;;AAAzC;AAAA;;;AACQ;;;AAYE;;AAAA;AAAA;AAAA;AAAA;;AACS;;AAAnB;AAAA;;;AAAA;;AAAyC;;AAAzC;AAAA;;;AACQ;;;AA6HkB;;AAAA;;AAAA;AAAA;;AAG1B;;;AAAX;;;;;;;AAkB+B;;AAAA;;;AACC;;AAAA;;;AACN;;AAAA;;;AAAA;AAAA;;AAAA;;AACC;AAAA;;;AAAA;AAAA;;AACD;;AAAA;;AAAA;AAAA;AAAA;;AA8JyB;;AAAjC;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAxRH;AAAA;;AAAA;AAAA;AAAyB;AAAA;;AAAA;AAAA;AAAzB;;AAAA;AA0RA;;AAAA;;AAAA;AAAP;AACO;;AAAA;AAAA;AA/JH;;AAAA;AADJ;AAIA;;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AACG;;AAAA;AAAA;AAAgC;;AAAhC;AAAX;;;AAEY;AAAA;;AAAA;AAAA;AAAyB;;AAAA;;;AAAA;;AAAzB;AAAA;;AAAA;AAAA;AAGG;;;AAAJ;;;AAAkC;;AAAA;AAAA;AAAgC;;AAAhC;AAAlC;;;AAGkC;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;AACJ;;AAAA;;AAAA;AACA;;AAAA;;AAAA;AACA;AAAA;AAAA;AAAA;AAAqB;AAArB;AAAA;AAAA;AAAA;AAEG;;AAAA;;;AAAoB;;;AAApB;AAAA;;;AAEG;AAAA;;AAAA;AAAA;AAFH;;;AAGC;AAAc;;;AAAd;AACA;;AAAiC;AAAjC;AAEJ;;AAAA;;AAAA;AAAA;;;AAAA;AC/gBI;;AAAA;;AAAA;AAAA;;AACA;;AAAA;;AAAA;AAAA;;AACA;;AAAoB;AAApB;AAAA;;;;;AD8fA;;AAAwB;AAAxB;;;;AAlCa;;AAAA;AAAA;AAAA;AAAA;;AAGI;;AAAd;AAAf;;;AAEoB;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;;;;;;AAGH;;AAAc;AAAd;AAAjB;;;AAC6C;AAAA;;AAAA;AAAA;AAAA;;AAAA;AACR;AAAA;;AAAA;AAAA;AAAA;;AAAA;;;;AACpB;;AAAc;;AAAd;AAAjB;;;;;;;AAAA;;;AAC6C;AAA7B;;AACqB;AAArB;;;;;AA7IL;;;AAAX;;;AACe;;AAAc;;AAAd;AAAf;;;AACuB;AAAA;;AAAA;AAAA;;;AAyHQ;;;AAxHJ;AAAA;;AAAA;AAAA;AAAwB;;AAAA;;;AAAA;;AAAxB;AAAA;AAAA;;AACZ;AAAA;;AAAA;AAAA;AAAA;AAAf;;;AACuB;;;AAsHQ;;;AArHA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AACG;AAAA;;AAAA;AAAA;AAAnB;AAAf;;;AACuB;AAAA;;AAAA;AAAA;;;AAmHQ;;;;;;;AAAA;;;AAhHnB;;AAAA;;AAAA;AAAoC;AAAA;;AAAA;AAAA;AAApC;AAAA;AADJ;AAGO;AAAA;;;AA8GgB;;;AAzIhB;AAAA;;AAAA;AAAA;AAAwB;;AAAA;;;AAAA;;AAAxB;;;AAwIe;;;ACpdtB;;AAAA;AAAA;AAIiB;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAEH;;AALP;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AArCV;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;;;AA6CA;;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;ADmDU;AAAA;AAAA;AAAA;AAAP;ADvH0B;;AAAnB;AAAA;AAAA;AAAA;AAAA;;AAAP;AETG;AAAA;;AAAA;AAAA;AAAwB;;AAAxB;AAAX;;;AAEgB;;AAAc;AAAA;;AAAA;AAAA;AAAd;AAAA;;;AACG;;AAAA;;AAAA;AADH;;;AAEG;;AAAc;;AAAA;AAAA;AAAA;;;AAAd;AAFH;;;;AADJ;AAuFJ;;;AACA;;;AD+BO;AAAA;AAAA;AAAA;AAAe;;AAAf;AAYA;AAAP;ACxCA;;AAAA;AAAA;;;AACA;;;;;AFSI;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AACE;AAAA;;AAAA;AAAA;AAAA;;AADF;;AAAA;AAAA;AAAA;;AEPJ;AArFI;;;AACI;AAAA;;AAAA;AAAA;AADJ;;AAAA;;AAAA;;;AAGQ;AAAA;AAAA;AAAA;;;AAAA;AAAJ;;;;AAuFhB;;;AAjF6C;;AAAjC;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AADJ;AAoFc;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AA7Ed;AAIQ;;;;;;;;;;;;;AAJR;;;;;;AAAA;AFsFkB;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AACC;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAGW;AAA9B;AAAA;AAAA;;AAAA;;AACA;AAAA;;AACA;;AAAA;AAAA;AAEO;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACO;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAP;AAGA;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AEhBiB;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AACH;;AAJP;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;;;;AAAA;AAAA;AAAA;AA5BV;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;;;AEtEA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIG;;;AACO;AAAA;AAAP;AAEA;;AAAA;;AAAA;AACA;;AAAA;AAAA;AACO;;AATV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AH8GU;AAAA;AAAA;AAAA;AAAP;AExE4B;;AAAqB;;AAA1C;;;AAAP;AC5BA;;;AACA;;;AH2FO;AAAA;AAAA;AAAA;AAAe;;AAAf;AG1FP;AJrB0B;;AAAnB;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAP;AIuBA;AAAA;;;AACA;AAAA;AAEI;AAAA;;AAAA;AAAA;AAAA;AAAqC;AAAA;;AAAA;AAAA;AAArC;AADJ;AAGG;AAAA;;AAAA;AAAA;AAAX;;;AAEgB;;AAA2B;AAAA;;AAAA;AAAA;AAA3B;AADJ;AJ+FJ;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AI1FA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AACO;AAAA;;AAAA;AAAA;AAAA;AAAA;AA1BV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AA4BA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AHkFU;AAAA;AAAA;AAAA;AAAP;AGpEA;;;AACA;;;AH2DO;AAAA;AAAA;AAAA;AAAe;;AAAf;AAYA;AAAP;AGtIG;AAAA;;AAAA;AAAA;AAAX;;;AAEgB;AAAA;;AAAA;AAAA;AAA8B;;AAA9B;AADJ;AAGD;AAAA;;AAAA;AAAA;AAAX;;;AAEgB;;AAA0B;AAAA;;AAAA;AAAA;AAA1B;AADJ;AA8DG;;AAAA;;AAAA;AAAA;;AAAA;AAAP;AJxD0B;;AAAnB;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAP;AAA0B;;AAAnB;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAP;AI2DA;;AAAA;;;AACA;AAAA;;;AACO;;AAAA;AAAP;AACA;;AAAA;AAAA;AACgB;AAAA;AAAA;AAAA;AAAA;AAAT;AAAP;AHsqBG;AAAA;AAAA;AAAA;AAAqB;AAAA;AAAA;AAAA;AAArB;AAAX;;;AAE8C;AAAA;AAAA;AAAA;AAAzB;;;AAET;;AAAA;AAA4B;;AAA5B;AADJ;AGtqBA;;AAAA;AAAA;;;AACA;;AAAA;AAAA;;AAAA;;;AACA;;;;;AACA;;;;;AJ2DgB;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAT;;AAAA;AAAA;;AAAA;;AAAA;AAAP;AACA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AATA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AInFH;AAAA;;AAAA;AAAA;AAAA;AAAA;AJwGA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AGxF+B;;AAAgB;;AAArC;;;AAAP;AHrD0B;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAiKA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AACO;;AArBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AGxH+B;;AAAsB;;AAA3C;;;AAAP;AFuEO;AAAA;AAAA;AAAA;AAAe;;;AAAf;ADuEA;AAAP;AACA;;;AACA;;;AAC8B;;AAAvB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AAnLU;AAFH;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAsLP;AACO;;AA3BV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA6BA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAjM6B;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAsNO;;AAAA;;AAAA;AAAP;AACA;;;AACA;;;AACA;AAAA;;AAAA;AACO;;AAzBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA5N6B;;AAAnB;AAAA;AAAA;AAAA;AAAA;;AAAP;AA2OO;AAAA;AAfV;AAAA;AAAA;AAAA;AAAA;AAAA;ACqwBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAWG;;AAAA;AAAA;AACO;;AAZV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;AAcA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AA6BG;;;AAGqB;AAAA;AAAA;AAArB;;AAAA;;AAAA;AA70BO;;;AAAA;AAEH;AAFG;AAAA;;;AAAA;AAGH;;AAHG;AAAA;;;AAAA;AAIH;;AAJG;AAAA;;;AAAA;AAKH;;AALG;AAAA;;;AAAA;AAMH;;AANG;AAAA;;;;AAWP;AAo0B4B;AAAA;;AAAA;AAAA;AAAA;;AAAA;AApuBrB;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAP;AAEI;;AAAA;AAAA;AAAA;;AA9BG;;;AAAA;;AAEH;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;;AAYP;AAoBG;AAAiB;AAAjB;AAAX;;;AACuB;;AAAA;;;AAAA;AAAJ;AAAP;AA+dG;AAAA;AAAA;AAAA;AAAA;AAAP;AACO;AAAA;;AAAA;AAAA;AAAA;AAAP;AAGgC;;AAAA;AAAA;AAAA;AAnCb;AAAA;;AAAA;;AACnB;AAGA;;AAAA;;AAAA;AAmC8B;;AAAA;;AAAA;AA9B1B;AAAA;;AAAA;AADJ;AAKA;;AAAA;;AAAA;AAEA;AAIQ;;AAFW;;AACF;;;;;;;;AAHjB;;;;;;AAAA;AA4BmB;AAAA;;AAAA;AAAnB;;AAAA;AAAA;AACA;;AAA4B;AAA5B;AAGA;;AAAA;;AAAA;AAG6B;AAAA;;AAAA;AAA7B;;AAAA;;AAAA;AACqB;;AAAA;;AAAA;AAArB;;AAAA;;AAAA;AACiC;;AAAA;AAAA;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;AAGA;;AAAA;;AAAA;AACoC;;AAAA;;;AAAA;AAApC;;AAAA;AAAA;AAC6B;;AAAA;;AAAA;AAA7B;;AAAA;AAAA;AAGwB;;AAAA;;AAAA;AAAxB;;AAAA;AAAA;AAG6B;;AAAA;AAAA;AAA7B;;AAAA;AAAA;AACiC;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;AACyB;;AAAA;;AAAA;AAAzB;;AAAA;AAAA;AAC6B;;AAAA;;AAAA;AAA7B;;AAAA;AAAA;AACwB;;AAAA;;AAAA;AAAxB;;AAAA;AAAA;AACsB;;AAAA;;AAAA;AAAtB;;AAAA;AAAA;AACuB;;AAAA;;AAAA;AAAvB;;AAAA;AAAA;AAC4B;;AAAA;;;AAAA;AAA5B;;AAAA;AAAA;AAC0B;;AAAA;;;AAAA;AAA1B;;AAAA;AAAA;AAGyB;;AAAA;;AAAA;AAAzB;;AAAA;AAAA;AAGoB;;AAAA;AAAA;AAApB;AAAA;AAAA;AAGiC;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;AACkC;;AAAA;;AAAA;AAAlC;;AAAA;AAAA;AAGA;;AAAyB;AAAzB;AACA;;AAA0B;AAA1B;AAEO;;AAA8B;;AAA9B;AAAP;AACqC;AAAA;AAAA;AAA9B;;AAAA;AAAP;AACO;AAAP;AAyMuB;;AAAA;;;AAAvB;;AAAA;AAAA;AACsB;;AAAA;;;AAAtB;;AAAA;AAAA;AACO;;AAvCV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;;;;;;;;AAyCA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAeG;;;AAGkB;AAAA;;AAAA;AAAA;AAAA;;AAAA;AA/MX;AAAA;AAAA;AAAA;AAAA;AAAP;AACO;AAAwB;;AAAxB;AAAP;AAGO;AAAA;;AAAA;AAAA;AAAP;AAEc;AAAsB;;AAAtB;AAAA;AAOU;;AAAd;AADF;;AAAA;AAFR;AAAA;;;AAMQ;AACF;AAAA;;AAAA;AAAd;;;AACoB;;AAAA;;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AACW;AADX;AACW;AAAA;AAAA;;AAAA;;AACZ;AAAA;AAAA;AAAA;AAAA;;AAAkB;;AAAA;;AAAA;AAAlB;;AAAA;AAAP;AACA;;AAAA;;AAAA;;;AAGO;AAAA;;AAAA;AAAA;AAAA;;AAAP;AACZ;;;AACA;AAAA;;;AACmD;AAAQ;AAAR;AAAd;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAejB;;AAAA;AAAA;;AAAA;AADJ;AAGhB;;AAAA;;;AACuB;;AAAoB;AAApB;AAAP;AAGJ;AAAS;AAAT;AAAA;;;;;AAjBQ;;AAAA;AAAA;AAC4C;AAAtB;AAElB;AAAuB;;AAAvB;AAAA;AAAA;AAAA;AAAA;;AADJ;AAGgB;AAAA;AAAA;;AAAA;AAAA;AAChB;AAAA;AAE2B;AAAvB;AADa;;AAAA;AAAA;;AAAA;AAAA;;AAAA;;;;AAjtBV;;AAAA;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AA8tBR;;AAAA;;;AAEgB;;AAAA;;AAAA;AADJ;AAAA;AAAA;AAGA;AAAc;;AAAd;AA6JG;;AAvBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAj6BU;AAAA;AAAA;AAAA;AAAP;AAk8BA;;;AACA;;;AACA;;;AAEO;AAAA;AAAA;AAAA;AAAoB;AAAA;AAAA;AAAA;AAApB;;AAAA;AAAP;AACQ;;;AACD;AAAA;;;AAAA;AAAoB;;;AAApB;AAAP;AAIiB;;AAAA;;;AAEM;;AAAA;;;AACA;;AAAA;;;AACW;;AAAA;;;AAEC;;AAAA;;;AACD;;AAAA;;;AACC;;AAAA;;;AACrB;;AAAA;;;AAVV;;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAMkB;AANlB;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAFJ;;;AAAA;;AAeO;;AA9BV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;AAgCA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AA19BU;AAAA;AAAA;AAAA;AAAP;AAw+BA;;;AACA;;;AAEG;;AAAA;AAAA;AAAgB;;AAAhB;AAAX;;;AAj5Be;AAAA;;AAAA;AAAA;AAAsB;;AAAtB;AAk5BH;AACA;;;AAn5BG;AAAA;;AAAA;AAAA;AAAA;AAAsB;;AAAtB;AA0sBP;AACO;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAoB;AAAA;AAAA;AAAA;AAApB;AAAP;AAEwB;AAAA;;;AAAA;;AAAA;AAAA;AADxB;;;AAIuC;AAAA;AAAA;AAAA;AA3vBpB;;AAAZ;AA4vBA;;AAAA;;AACJ;AAAc;;AAAd;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAX;;;AACmB;;AAAA;AAAA;AAAA;;AAAA;AACJ;;AAAA;AAAA;AAAA;AAAA;AAAc;;AAAd;AAAP;AAKuB;;AAAA;AAAA;;;AACA;;AAAA;;;AACW;;AAAA;;;AACC;;AAAA;;;AACD;;AAAA;;;AACC;;AAAA;;;AAR/B;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AADJ;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAaA;;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAA6B;AAA7B;AAAA;AAAA;AAAA;AAmLmB;AAAA;AAAA;AAAA;AAAZ;;AAAA;AAAA;;AAAA;AAAP;AACQ;;;AAAA;AAAA;;AAEJ;AAAA;;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAtxBA;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;AAAA;;AAMH;;AANG;AAAA;;;;AAsxBP;AAGO;;AAAoB;;;AAApB;AAAP;AA9wBO;;AAAe;;AAAf;AAAA;;;AAAA;;AAAqC;;AAArC;AAAA;;;;AA+wBf;;;AErjCoC;;AAAe;;AAApC;;;AAAP;AFyjCA;;AAAA;;AAAA;;;AAAA;;AACO;;AAjCV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA+BO;;;;;;;;;;;;;;;;AAIP;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AA7/BU;AAAA;AAAA;AAAA;AAAP;AAqgCA;;;AACA;;;AACA;;;AA/gCO;AAAA;AAAA;AAAA;AAAe;;AAAf;AAYA;AAAP;AAsFO;AAAA;;AAAA;AAAA;AAAsB;;AAAtB;AA4uBP;AACO;AAAA;AAAA;AAAA;AAAA;;AAAoB;AAAA;AAAA;AAAA;AAApB;AAAA;;AAAA;AAAP;AACO;;AAAA;;;AAAA;AAAA;;AAAsB;;;AAAtB;AAAP;AACO;AAAA;;AAAA;AAAA;AAAA;;AAAgB;AAAhB;AAAP;AAER;;;AACsD;AAAA;AAAA;AAAA;AAA4B;AAA5B;AAAzB;;;AAEb;;AAAA;AAAiC;;AAAA;;AAAA;AAAjC;AADJ;AAImC;AAAA;AAAA;AAAA;AAlyBpB;;AAAZ;AAmyBA;;AAAA;;AACJ;AAAc;;AAAd;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAX;;;AACmB;;AAAA;AAAA;AAAA;;AAAA;AACJ;;AAAA;AAAA;AAAA;AAAA;AAAc;;AAAd;AAAP;AAKuB;;AAAA;AAAA;;;AACA;;AAAA;;;AACW;;AAAA;;;AACC;;AAAA;;;AACD;;AAAA;;;AACC;;AAAA;;;AAR/B;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AADJ;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAaA;;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAA6B;AAA7B;AAAA;AAAA;AAAA;AAuKO;;AAdV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA7/BU;AAAA;AAAA;AAAA;AAAP;AAAA;AAkhC6B;AAAA;;AAAA;AAAA;AAAX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAEF;AAAA;;AAAA;AAAA;AACS;AAAA;;AAAA;AAAA;AACG;AAAA;;AAAA;AAAA;AACX;AAAA;AAAA;AAAA;AACQ;AAAA;AAAA;AAAA;AACC;AAAA;;AAAA;AAAA;AACI;AAAA;;AAAA;AAAA;AACJ;AAAA;;AAAA;AAAA;AACL;AAAA;;AAAA;AAAA;AACS;AAAA;;AAAA;AAAA;AACC;AAAA;;AAAA;AAAA;AACT;AAAA;;AAAA;AAAA;AACC;AAAA;;AAAA;AAAA;AAfhB;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAJV;AAAA;AAAA;AAAA;AAAA;AAAA;AA7gCU;AAAA;AAAA;AAAA;AAAP;AAuiCG;AAAA;AAAA;AAAA;AAAqB;AAAA;AAAA;AAAA;AAArB;AAAX;;;AAEyB;AAAA;AAAA;AAAA;AADN;AAEQ;;AAFR;AAGY;AAHZ;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AALd;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBmC;AAAA;AAAA;AAAA;AAAzB;;;AAhBV;;;AEthCG;;;AARH;AAAA;AAUA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAWG;;;AACA;;AAAA;AAAA;AACO;;AAbV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAeA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAWG;;;AACA;;AAAA;AAAA;AACO;;AAbV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAeA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAsBG;;;AACA;;;AACwB;AAAA;;AAAxB;;;AA9Gc;;AAAX;AAAX;;;AACY;;AAAA;;AAAA;AA+GG;;AA1BV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAlFM;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAyGJ;;;AAvGG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAqGJ;;;AAnGG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAiGJ;;;AA/FG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AA6FJ;;;AA3FG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;;;;AA4FP;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAmBG;;;AACA;;;AACwB;AAAA;;AAAxB;;;AA9GO;AAAW;;AAAX;AAAP;AACc;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AA6GG;;AAvBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AApFM;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAwGJ;;;AAtGG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAoGJ;;;AAlGG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAgGJ;;;AA9FG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;;;;AA+FP;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AApK+B;;AAAgB;;AAArC;;;AAAP;AAoLA;;AAAA;AAAA;AACO;;AAjBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BU;AAAA;;AAAA;AAAA;AARV;AAAA;AAAA;AAAA;AAAA;AAAA;AAUA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAc4B;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AAlBP;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAcU;AACP;AAAA;;;AAES;;;;;;;;AADT;;AAAA;;;;;;;;;;;;;;AA+BQ;AAJI;;AAvRL;;AAAA;AAAA;AAAA;AAAA;;AAsRC;AAGO;AAAA;AA7ClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAsCe;;AAlRL;;AAAA;AAAA;AAAA;AAAA;;AAiRC;AAGO;AAAA;AAxClB;;;AAiCe;;AA7QL;;AAAA;AAAA;AAAA;AAAA;;AA4QC;AAGO;AAAA;AAnClB;;;AA4Be;;AAxQL;;AAAA;AAAA;AAAA;AAAA;;AAuQC;AAGO;AAAA;AA9BlB;;;AAuBe;;AAnQL;;AAAA;AAAA;AAAA;AAAA;;AAkQC;AAGO;AAAA;AAzBlB;;;AAkBkB;;;;;;;;;;;;;;;;;;AAlBlB;;;AHzQD;;;AAEe;;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAJ;AAAP;;AAgBJ;;;AApB8B;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAqCW;AAAA;AAAA;AAIM;AAAA;;AAAA;AAAA;AAAiC;;AAAA;;AAAA;AAAjC;AAEb;AAAA;;AAAA;AAAA;AAAkC;;AAAA;;AAAA;AAAlC;AAMgB;;AAAA;AAAA;AAAgB;AAAA;;AAAA;AAAA;AADf;;AAAA;;AAAA;;AAAA;;;AAIgB;AAAA;;AAAA;AAAA;AADf;;AAAA;;AAAA;;AAAA;;;AAMtB;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAI+B;AAAA;;AAAA;AAAA;AAA/B;AAAA;;AACgC;AAAA;;AAAA;AAAA;AAAhC;AAAA;;AAG0B;AAAA;AAAA;AAAA;AAA1B;AAAA;;AAIA;;AAAA;AAAA;AACA;AAEJ;;;;;;AAzE8B;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AC+GO;AAAA;AAAA;AAAA;AAAe;;AAAf;ADnCf;;;AACY;AAEO;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AACR;;AAAA;AAAA;AAAA;;AAAX;;;AACY;AAGJ;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAC0B;AAA1B;AAAA;;AACA;;AAAA;AAAA;AACO;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;AAAA;AAAA;;AAAA;AAAA;;ACyCJ;;;AAIO;;AAAA;;;AAAA;;AAAA;;;AACQ;AAAP;AACQ;;AAAA;;AAAA;AACL;;AAAA;AAAP;AAEJ;;;AAEJ;;AAAA;;;AACmB;AAAP;AACG;AAAA;;AAAA;AAAA;AAAP;AAAA;AACoC;AAAA;;AAAA;AAAA;AAA7B;;AAAA;AAAA;;AAAA;;;AAAP;AAEJ;;;AAOJ;;AAAA;;;AACmB;AAAP;AAEA;AAAA;;AAAA;AAAA;AAEA;AAAA;;AAAA;AAAA;AAHG;;AAAA;AAAA;;;AAAP;AAwBJ;;;AAEsB;AAAA;AAAA;AAAA;AAAX;;AAAA;AAAP;AAdO;;AAAY;;AAAZ;AAgBA;AAAc;;AAAd;AAAA;AAAA;AAAA;AAAA;;AAAP;AAZO;;AAAW;;AAAX;AAeS;;AAAA;AAAA;;AAAA;AAAA;AAAT;;AAAA;AAAP;AACO;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAP;AAuGJ;;;AA1DO;;AARC;AAQD;AAAA;;;AAAA;;AAPC;AAOD;AAAA;;;AAAA;;AANC;;AAMD;AAAA;;;AAAA;;AALC;;AAKD;AAAA;;;AAAA;;AAJC;;AAID;AAAA;;;AACQ;AA6DX;;AA1DR;;AAAA;;;AAEmB;AAwDJ;;;AAtDJ;;AAAiB;;AAAjB;AAAA;;;AAAyC;;AAAiB;;AAAjB;AAAzC;;;AAIQ;;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;;AAkDJ;;;;AAAA;;;AA7CJ;;AAAiB;AAAjB;AAAX;;;AAEmB;;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;;AA2CJ;;;;AAAA;;;AArCJ;;AAAiB;;AAAjB;AAAX;;;AAEmB;;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;;AAmCJ;;;;AAAA;;;AA5BJ;;AAAiB;;AAAjB;AAAX;;;AAEmB;;AAAc;;AAAd;AA0BJ;;;AAxBA;AAwBA;;;AAkBH;AAAA;;AAAA;AAAA;AAAsB;AAAtB;AAAA;;;AACI;AAAA;;AAAA;AAAA;AADJ;;;;AADJ;;AAAA;AA8CJ;;;AASQ;;AAAA;;AAAA;AAAA;AAAA;;;AACG;AAAA;;AAAA;AAAA;AADH;;;AAEG;AAAA;;AAAA;AAAA;AAFH;;;AAIO;AAAP;;AAAA;;AAAA;AAEA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAHM;;;AAQN;AAAA;;AAAA;AAAA;AAHG;;AAAA;AAAA;;;AAAP;;AAAA;;AAAA;AA+DJ;;;AAMJ;;AAAA;;;AACY;;AAAA;AACU;AAAA;;AAAA;AAAA;AACV;AAAA;;AAAA;AAAA;AADmC;;AAAA;;AAAA;;;AAAzB;AAKd;AAAA;AAGI;AAAA;;AAAA;AAAA;AAFG;;AAAA;AAAA;;AAAA;;;AAAP;AAyIJ;;;;;;;;AAUW;;AAAA;AAAA;AAAkB;AAAA;AAAA;AAAA;AAAlB;AAAP;AACO;;AAAA;;AAAA;AAAwB;;AAAxB;AAAP;AAEa;;AAAA;AAAA;AAAA;AACI;AAAd;AAAA;AAAX;;;AA5ee;AAAA;AAAA;AAAA;AAAe;;AAAf;AA+eH;AAEI;AAAA;;AAAA;AAAA;AAA6B;AAAA;;AAAA;AAAA;AAA7B;AADJ;AAG6B;;AAAA;;AAAA;AAA7B;;AAAA;;AAAA;AACA;;AAAA;AAAA;AAC6B;;AAAA;;AAAA;AAA7B;;AAAA;AAAA;AACA;;AAAwB;AAAxB;AACiC;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAqB;AAArB;AAAA;AAAA;AAAA;AACA;AAAc;;AAAd;AA7LJ;;AAAA;AACO;AAAA;;AAAA;AAAA;AA6LH;;AAAA;AAGmB;AAHnB;;;;AAAA;;AAKA;;AAAA;;AAAA;;AAAA;AA/fG;AAAA;AAAA;AAAA;AAAe;;AAAf;AAYA;AAAP;AAsfA;AAAA;;AAAA;AAAA;AAAyB;;AAAA;;;AAAA;;AAAzB;AAAA;;AAAA;AAAA;AAEG;;AAAc;;AAAd;AAAX;;;AAIgB;;AAAA;;AAAA;AACA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAHY;;;AAMI;AAAA;;AAAA;AAAA;AAAhB;AAAA;;AAmFL;AAAA;;AAAA;AAAA;AAAA;;;AAAqC;AAAA;;AAAA;AAAA;AAAP;;AAAA;AAA9B;;;AACQ;AAAA;;AAAA;AAAA;AAAA;;AAAA;AACR;AAAA;;AAAA;AAAA;AAAA;;;AAAmC;AAAA;;AAAA;AAAA;AAAP;;AAAA;AAA5B;;;AACQ;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAvFP;;AAAA;;AAAA;AAYD;;AAAc;;AAAd;AAAX;;;AACyC;;AAAA;;AAAA;AAA7B;;AAAA;;AAAA;AACA;;AAAA;AAAA;AAKD;;;AAAX;;;AACe;;AAAc;;AAAd;AAAf;;;AAK4B;AAAA;AAAA;AAAA;AAA4B;AAAA;AAAA;AAAA;AAA5B;AAEF;;AAHA;AADF;;AAAA;AAFR;AAAA;;;AA9LU;AAAA;;AAAA;AAAA;AAAA;;AAAA;AACJ;AAAd;;AACwB;AAAxB;;AAEG;;AAAA;;AAAA;AAAA;AAAA;;AAAX;;;AAE8B;;AAAA;;AAAA;;;AAAA;AAAA;;AAKM;AAAxB;;;;AAEc;AAAA;AAAA;AAAA;AAAoB;AAApB;AAAA;;AACM;AAAA;AAAA;AAAA;AAAlB;;AAAA;AAAd;;;AAC2B;;AAAA;;;AAAA;AAAA;;AACK;AAAA;AAAA;AAAA;;AAEuB;;AAArB;AAAA;;;AAClB;;AAAqB;;AAArB;AAAA;;;AACI;;AAAA;;AAAA;AADJ;;;;AAGhB;;;AACA;;AAAA;;;AAC4C;AAAxB;;AAOR;;AAAmB;AAAnB;AAAA;;;;;AAHY;;AAAA;;AAAA;AAFc;;AAAA;AAAA;;;AAAA;AAAA;;AAIlB;;AAAA;AAAA;;;;;;;;;AAGZ;;AAAA;AACY;AAAA;;AAAA;AAAA;AACT;;AAAA;;AAAA;AAAc;AAAd;AAAX;;;AAEyB;AAAA;;AAAA;AAAA;AAAb;AAGA;AAAA;;AAAA;AAAA;AAFG;;AAAA;;;AAiKC;;AAAA;AAAA;AAKR;AAAA;AAAA;AAAA;AAAqB;AAArB;AAAA;AAAA;AAAA;AACA;;AAEW;AACQ;AAHnB;;;;AAAA;;;;;;;;;AAFqC;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;;;;AAnBC;;AAAc;;AAAd;AAAb;;;AAE6C;AAAA;;AAAA;AAAA;AAAjC;;AAAA;AAAA;;;;AAdC;;AAAc;;AAAd;AAAb;;;AACwB;;AAAA;;AAAA;AAAA;AAAA;;AACxB;;;AAC4B;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAChB;;AAAA;;AAAA;;;;AAEG;;AAAA;;AAAA;AAAA;AAAA;;AAAf;;;AACgB;;AAAA;;AAAA;;;;AAoCZ;;;AAUwB;;AACH;;AAAA;AAAA;AACE;;AAAA;;;AACI;;AAAA;;;AACJ;;AAGW;;AALX;AAKW;AA6BtC;;AAAA;;;AACmB;AA/BS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAIA;AAAA;;AAAA;AAAA;AACH;;AAAA;AAAiB;AAAjB;AAZb;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AADJ;;;;;;AAAA;AAAA;AAAA;;;;;;AAwCG;;AAAe;AAAf;AAAA;;;AAAA;;AAAsC;;AAAtC;AAAA;;;AACQ;AAhCC;;;AAiCL;;;AAjCK;;;AEzpBhB;;;;;AAFW;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAGA;;;AACH;;AAAA;AAAA;AAAA;AAAA;AACG;;AAAA;AAAA;;AADH;AAAA;;;AAEG;;AAAA;AAAA;AAAA;AAAA;AADA;;AAAA;AADH;;;;AADJ;;AAAA;;;;;AAOyB;;AAbF;AAAA;;AAAA;AAAA;AAAhB;AAaP;;AAkBW;AAAA;;AAAA;AAAA;AAAJ;AAAP;;AAGW;AAAA;;AAAA;AAAA;AAAJ;AAAP;;AAEJ;;;AACW;;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;AAAA;;AAMH;;AANG;AAAA;;;AAAA;;AAOH;;AAPG;AAAA;;;;AAAP;;;", + "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AG4BmD;;AAAf;;AAA5B;AAC4C;;AAAf;;AAA7B;AAkBA;;AAAuB;AAAvB;AACA;;AAAuB;AAAvB;AFQA;AAAc;AAAd;AACA;;AAAqB;AAArB;AAGA;;AAAuB;;AAAvB;AACA;;AAAsB;;AAAtB;AAGA;;AAA6B;AAA7B;AACA;;AAA2B;AAA3B;AAGA;;AAA6B;AAA7B;AACA;;AAAqB;AAArB;AACA;;AAA6B;AAA7B;AACA;;AAA6B;AAA7B;AAGA;;AAA4B;AAA5B;AAGA;;AAAmB;AAAnB;AACA;;AAA4B;AAA5B;AAGA;;AAA+B;AAA/B;AACA;;AAA6B;AAA7B;AACA;;AAAiC;AAAjC;AACA;;AAAoC;AAApC;AAGA;;AAAiC;AAAjC;AACA;;AAAwB;AAAxB;AAGA;;AAA6B;AAA7B;AACA;;AAAyB;AAAzB;AACA;;AAA6B;AAA7B;AACA;;AAAwB;AAAxB;AACA;;AAAsB;AAAtB;AACA;;AAAuB;AAAvB;AACA;;AAA4B;AAA5B;AACA;;AAA0B;AAA1B;AAGA;;AAA0B;AAA1B;AACA;;AAAyB;AAAzB;AAGA;;AAAiC;AAAjC;AACA;;AAAkC;AAAlC;AAQA;AAAoB;AAApB;AACA;AAA4B;AAA5B;AAGA;;AAAyB;AAAzB;AIhGO;;AAA6B;;AAA7B;AAAP;AACO;;AAAuB;;AAAvB;AAAP;AACO;;AAAA;AAAP;AACO;;AAAA;AAAP;AAlBR;;;;;;AAAA;;;AAAA;;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;;;;;;AAAA;;;AAAA;;;;AAAA;AF4IK;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ADrGA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ADgGU;AAAA;AAAA;AAAA;AAAP;AC5FA;;;AACA;;;AACA;;;ADkFO;AAAA;AAAA;AAAA;AAAe;;AAAf;AAYA;AAAP;AC5FG;;;AAAX;;;AAIsB;AACA;;AADA;AADF;;AAAA;AAFR;AAAA;;;AAQe;AAAnB;;AACkB;AAAlB;;AACmB;AAAnB;;AAGI;;AAAA;;AAAA;AAAA;;;AACI;AAAA;AAAA;AAAA;AAAoB;AAAA;AAAA;AAAA;AAApB;AADJ;;;AAGiC;AAAA;AAAA;AAAA;AAAzB;;;AAAA;AAAA;;AACL;;AAAA;AAAA;AAAA;;AAAuB;;AAAvB;AAAf;;;AAEuC;;AAAA;AAAA;AAAA;AAAA;;ADoR3B;AADG;AAAA;AAAA;;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;;ACnRA;;;ADydA;;AAAA;AAAA;AAAkB;AAAA;AAAA;AAAA;AAAlB;AAAP;AACO;;AAAwB;;AAAxB;AAAP;AAxIG;;AAAA;;;AAAA;;AAAyC;;AAAzC;AAAA;;;AACQ;;;AAYE;;AAAA;AAAA;AAAA;AAAA;;AACS;;AAAnB;AAAA;;;AAAA;;AAAyC;;AAAzC;AAAA;;;AACQ;;;AA6HkB;;AAAA;;AAAA;AAAA;;AAG1B;;;AAAX;;;;;;;AAkB+B;;AAAA;;;AACC;;AAAA;;;AACN;;AAAA;;;AAAA;AAAA;;AAAA;;AACC;AAAA;;;AAAA;AAAA;;AACD;;AAAA;;AAAA;AAAA;AAAA;;AA4JyB;;AAAjC;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAtRH;AAAA;;AAAA;AAAA;AAAyB;AAAA;;AAAA;AAAA;AAAzB;;AAAA;AAwRA;;AAAA;;AAAA;AAAP;AACO;;AAAA;AAAA;AA7JH;;AAAA;AADJ;AAIA;;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AACG;;AAAA;AAAA;AAAgC;;AAAhC;AAAX;;;AAEY;AAAA;;AAAA;AAAA;AAAyB;;AAAA;;;AAAA;;AAAzB;AAAA;;AAAA;AAAA;AAGG;;;AAAJ;;;AAAkC;;AAAA;AAAA;AAAgC;;AAAhC;AAAlC;;;AAGkC;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;AACJ;;AAAA;;AAAA;AACA;;AAAA;;AAAA;AACA;AAAA;AAAA;AAAA;AAAqB;AAArB;AAAA;AAAA;AAAA;AAEG;;AAAA;;;AAAoB;;;AAApB;AAAA;;;AAEG;AAAA;;AAAA;AAAA;AAFH;;;AAGC;AAAc;;;AAAd;AACA;;AAAiC;AAAjC;AAEJ;;AAAA;;AAAA;AAAA;;;AAAA;AC/gBI;;AAAA;;AAAA;AAAA;;AACA;;AAAA;;AAAA;AAAA;;AACA;;AAAoB;AAApB;AAAA;;;;;AD8fA;;AAAwB;AAAxB;;;;AAlCa;;AAAA;AAAA;AAAA;AAAA;;AAGI;;AAAd;AAAf;;;AAEoB;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;;;;;;AAGH;;AAAc;AAAd;AAAjB;;;AAC6C;AAAA;;AAAA;AAAA;AAAA;;AAAA;AACR;AAAA;;AAAA;AAAA;AAAA;;AAAA;;;;AACpB;;AAAc;;AAAd;AAAjB;;;;;;;AAAA;;;AAC6C;AAA7B;;AACqB;AAArB;;;;;AA7IL;;;AAAX;;;AACe;;AAAc;;AAAd;AAAf;;;AACuB;AAAA;;AAAA;AAAA;;;AAyHQ;;;AAxHJ;AAAA;;AAAA;AAAA;AAAwB;;AAAA;;;AAAA;;AAAxB;AAAA;AAAA;;AACZ;AAAA;;AAAA;AAAA;AAAA;AAAf;;;AACuB;;;AAsHQ;;;AArHA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AACG;AAAA;;AAAA;AAAA;AAAnB;AAAf;;;AACuB;AAAA;;AAAA;AAAA;;;AAmHQ;;;;;;;AAAA;;;AAhHnB;;AAAA;;AAAA;AAAoC;AAAA;;AAAA;AAAA;AAApC;AAAA;AADJ;AAGO;AAAA;;;AA8GgB;;;AAzIhB;AAAA;;AAAA;AAAA;AAAwB;;AAAA;;;AAAA;;AAAxB;;;AAwIe;;;ACpdtB;;AAAA;AAAA;AAIiB;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAEH;;AALP;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AArCV;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;;;AA6CA;;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;ADmDU;AAAA;AAAA;AAAA;AAAP;ADvH0B;;AAAnB;AAAA;AAAA;AAAA;AAAA;;AAAP;AETG;AAAA;;AAAA;AAAA;AAAwB;;AAAxB;AAAX;;;AAEgB;;AAAc;AAAA;;AAAA;AAAA;AAAd;AAAA;;;AACG;;AAAA;;AAAA;AADH;;;AAEG;;AAAc;;AAAA;AAAA;AAAA;;;AAAd;AAFH;;;;AADJ;AAuFJ;;;AACA;;;AD+BO;AAAA;AAAA;AAAA;AAAe;;AAAf;AAYA;AAAP;ACxCA;;AAAA;AAAA;;;AACA;;;;;AFSI;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AACE;AAAA;;AAAA;AAAA;AAAA;;AADF;;AAAA;AAAA;AAAA;;AEPJ;AArFI;;;AACI;AAAA;;AAAA;AAAA;AADJ;;AAAA;;AAAA;;;AAGQ;AAAA;AAAA;AAAA;;;AAAA;AAAJ;;;;AAuFhB;;;AAjF6C;;AAAjC;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AADJ;AAoFc;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AA7Ed;AAIQ;;;;;;;;;;;;;AAJR;;;;;;AAAA;AFsFkB;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AACC;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAGW;AAA9B;AAAA;AAAA;;AAAA;;AACA;AAAA;;AACA;;AAAA;AAAA;AAEO;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACO;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAP;AAGA;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AEhBiB;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AACH;;AAJP;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;;;;AAAA;AAAA;AAAA;AA5BV;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;;;AEtEA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIG;;;AACO;AAAA;AAAP;AAEA;;AAAA;;AAAA;AACA;;AAAA;AAAA;AACO;;AATV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AH8GU;AAAA;AAAA;AAAA;AAAP;AExE4B;;AAAqB;;AAA1C;;;AAAP;AC5BA;;;AACA;;;AH2FO;AAAA;AAAA;AAAA;AAAe;;AAAf;AG1FP;AJrB0B;;AAAnB;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAP;AIuBA;AAAA;;;AACA;AAAA;AAEI;AAAA;;AAAA;AAAA;AAAA;AAAqC;AAAA;;AAAA;AAAA;AAArC;AADJ;AAGG;AAAA;;AAAA;AAAA;AAAX;;;AAEgB;;AAA2B;AAAA;;AAAA;AAAA;AAA3B;AADJ;AJ+FJ;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AI1FA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AACO;AAAA;;AAAA;AAAA;AAAA;AAAA;AA1BV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AA4BA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AHkFU;AAAA;AAAA;AAAA;AAAP;AGpEA;;;AACA;;;AH2DO;AAAA;AAAA;AAAA;AAAe;;AAAf;AAYA;AAAP;AGtIG;AAAA;;AAAA;AAAA;AAAX;;;AAEgB;AAAA;;AAAA;AAAA;AAA8B;;AAA9B;AADJ;AAGD;AAAA;;AAAA;AAAA;AAAX;;;AAEgB;;AAA0B;AAAA;;AAAA;AAAA;AAA1B;AADJ;AA8DG;;AAAA;;AAAA;AAAA;;AAAA;AAAP;AJxD0B;;AAAnB;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAP;AAA0B;;AAAnB;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAP;AI2DA;;AAAA;;;AACA;AAAA;;;AACO;;AAAA;AAAP;AACA;;AAAA;AAAA;AACgB;AAAA;AAAA;AAAA;AAAA;AAAT;AAAP;AHoqBG;AAAA;AAAA;AAAA;AAAqB;AAAA;AAAA;AAAA;AAArB;AAAX;;;AAE8C;AAAA;AAAA;AAAA;AAAzB;;;AAET;;AAAA;AAA4B;;AAA5B;AADJ;AGpqBA;;AAAA;AAAA;;;AACA;;AAAA;AAAA;;AAAA;;;AACA;;;;;AACA;;;;;AJ2DgB;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAT;;AAAA;AAAA;;AAAA;;AAAA;AAAP;AACA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AATA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AInFH;AAAA;;AAAA;AAAA;AAAA;AAAA;AJwGA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AGxF+B;;AAAgB;;AAArC;;;AAAP;AHrD0B;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAiKA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AACO;;AArBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AGxH+B;;AAAsB;;AAA3C;;;AAAP;AFuEO;AAAA;AAAA;AAAA;AAAe;;;AAAf;ADuEA;AAAP;AACA;;;AACA;;;AAC8B;;AAAvB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AAnLU;AAFH;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAsLP;AACO;;AA3BV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA6BA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAjM6B;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAsNO;;AAAA;;AAAA;AAAP;AACA;;;AACA;;;AACA;AAAA;;AAAA;AACO;;AAzBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA5N6B;;AAAnB;AAAA;AAAA;AAAA;AAAA;;AAAP;AA2OO;AAAA;AAfV;AAAA;AAAA;AAAA;AAAA;AAAA;ACuwBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAWG;;AAAA;AAAA;AACO;;AAZV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;AAcA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AA6BG;;;AAGqB;AAAA;AAAA;AAArB;;AAAA;;AAAA;AA/0BO;;;AAAA;AAEH;AAFG;AAAA;;;AAAA;AAGH;;AAHG;AAAA;;;AAAA;AAIH;;AAJG;AAAA;;;AAAA;AAKH;;AALG;AAAA;;;AAAA;AAMH;;AANG;AAAA;;;;AAWP;AAs0B4B;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAtuBrB;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAP;AAEI;;AAAA;AAAA;AAAA;;AA9BG;;;AAAA;;AAEH;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;;AAYP;AAoBG;AAAiB;AAAjB;AAAX;;;AACuB;;AAAA;;;AAAA;AAAJ;AAAP;AA6dG;AAAA;AAAA;AAAA;AAAA;AAAP;AACO;AAAA;;AAAA;AAAA;AAAA;AAAP;AAGgC;;AAAA;AAAA;AAAA;AAnCb;AAAA;;AAAA;;AACnB;AAGA;;AAAA;;AAAA;AAmC8B;;AAAA;;AAAA;AA9B1B;AAAA;;AAAA;AADJ;AAKA;;AAAA;;AAAA;AAEA;AAIQ;;AAFW;;AACF;;;;;;;;AAHjB;;;;;;AAAA;AA4BmB;AAAA;;AAAA;AAAnB;;AAAA;AAAA;AACA;;AAA4B;AAA5B;AAGA;;AAAA;;AAAA;AAG6B;AAAA;;AAAA;AAA7B;;AAAA;;AAAA;AACqB;;AAAA;;AAAA;AAArB;;AAAA;;AAAA;AACiC;;AAAA;AAAA;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;AAGA;;AAAA;;AAAA;AACoC;;AAAA;;;AAAA;AAApC;;AAAA;AAAA;AAC6B;;AAAA;;AAAA;AAA7B;;AAAA;AAAA;AAGwB;;AAAA;;AAAA;AAAxB;;AAAA;AAAA;AAG6B;;AAAA;AAAA;AAA7B;;AAAA;AAAA;AACiC;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;AACyB;;AAAA;;AAAA;AAAzB;;AAAA;AAAA;AAC6B;;AAAA;;AAAA;AAA7B;;AAAA;AAAA;AACwB;;AAAA;;AAAA;AAAxB;;AAAA;AAAA;AACsB;;AAAA;;AAAA;AAAtB;;AAAA;AAAA;AACuB;;AAAA;;AAAA;AAAvB;;AAAA;AAAA;AAC4B;;AAAA;;;AAAA;AAA5B;;AAAA;AAAA;AAC0B;;AAAA;;;AAAA;AAA1B;;AAAA;AAAA;AAGyB;;AAAA;;AAAA;AAAzB;;AAAA;AAAA;AAGoB;;AAAA;AAAA;AAApB;AAAA;AAAA;AAGiC;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;AACkC;;AAAA;;AAAA;AAAlC;;AAAA;AAAA;AAGA;;AAAyB;AAAzB;AACA;;AAA0B;AAA1B;AAEO;;AAA8B;;AAA9B;AAAP;AACqC;AAAA;AAAA;AAA9B;;AAAA;AAAP;AACO;AAAP;AA6MuB;;AAAA;;;AAAvB;;AAAA;AAAA;AACsB;;AAAA;;;AAAtB;;AAAA;AAAA;AACO;;AAvCV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;;;;;;;;AAyCA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAeG;;;AAGkB;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAnNX;AAAA;AAAA;AAAA;AAAA;AAAP;AACO;AAAwB;;AAAxB;AAAP;AAGO;AAAA;;AAAA;AAAA;AAAP;AAEc;AAAsB;;AAAtB;AAAA;AAOU;;AAAd;AADF;;AAAA;AAFR;AAAA;;;AAMQ;AACF;AAAA;;AAAA;AAAd;;;AACoB;;AAAA;;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AACW;AADX;AACW;AAAA;AAAA;;AAAA;;AACZ;AAAA;AAAA;AAAA;AAAA;;AAAkB;;AAAA;;AAAA;AAAlB;;AAAA;AAAP;AACA;;AAAA;;AAAA;;;AAGO;AAAA;;AAAA;AAAA;AAAA;;AAAP;AACZ;;;AACA;AAAA;;;AACmD;AAAQ;AAAR;AAAd;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAejB;;AAAA;AAAA;;AAAA;AADJ;AAGhB;;AAAA;;;AACuB;;AAAoB;AAApB;AAAP;AAGJ;AAAS;AAAT;AAAA;;;;;AAjBQ;;AAAA;AAAA;AAC4C;AAAtB;AAElB;AAAuB;;AAAvB;AAAA;AAAA;AAAA;AAAA;;AADJ;AAGgB;AAAA;AAAA;;AAAA;AAAA;AAChB;AAAA;AAE2B;AAAvB;AADa;;AAAA;AAAA;;AAAA;AAAA;;AAAA;;;;AA/sBV;;AAAA;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AA4tBR;;AAAA;;;AAEgB;;AAAA;;AAAA;AADJ;AAAA;AAAA;AAGA;AAAc;;AAAd;AAiKG;;AAvBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAn6BU;AAAA;AAAA;AAAA;AAAP;AAo8BA;;;AACA;;;AACA;;;AAEO;AAAA;AAAA;AAAA;AAAoB;AAAA;AAAA;AAAA;AAApB;;AAAA;AAAP;AACQ;;;AACD;AAAA;;;AAAA;AAAoB;;;AAApB;AAAP;AAIiB;;AAAA;;;AAEM;;AAAA;;;AACA;;AAAA;;;AACW;;AAAA;;;AAEC;;AAAA;;;AACD;;AAAA;;;AACC;;AAAA;;;AACrB;;AAAA;;;AAVV;;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAMkB;AANlB;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAFJ;;;AAAA;;AAeO;;AA9BV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;AAgCA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AA59BU;AAAA;AAAA;AAAA;AAAP;AA0+BA;;;AACA;;;AAEG;;AAAA;AAAA;AAAgB;;AAAhB;AAAX;;;AAn5Be;AAAA;;AAAA;AAAA;AAAsB;;AAAtB;AAo5BH;AACA;;;AAr5BG;AAAA;;AAAA;AAAA;AAAA;AAAsB;;AAAtB;AAwsBP;AACO;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAoB;AAAA;AAAA;AAAA;AAApB;AAAP;AAEwB;AAAA;;;AAAA;;AAAA;AAAA;AADxB;;;AAIuC;AAAA;AAAA;AAAA;AAzvBpB;;AAAZ;AA0vBA;;AAAA;;AACJ;AAAc;;AAAd;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAX;;;AACmB;;AAAA;AAAA;AAAA;;AAAA;AACJ;;AAAA;AAAA;AAAA;AAAA;AAAc;;AAAd;AAAP;AAKuB;;AAAA;AAAA;;;AACA;;AAAA;;;AACW;;AAAA;;;AACC;;AAAA;;;AACD;;AAAA;;;AACC;;AAAA;;;AAR/B;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AADJ;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAaA;;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAA6B;AAA7B;AAAA;AAAA;AAAA;AAuLmB;AAAA;AAAA;AAAA;AAAZ;;AAAA;AAAA;;AAAA;AAAP;AACQ;;;AAAA;AAAA;;AAEJ;AAAA;;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAxxBA;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;AAAA;;AAMH;;AANG;AAAA;;;;AAwxBP;AAGO;;AAAoB;;;AAApB;AAAP;AAhxBO;;AAAe;;AAAf;AAAA;;;AAAA;;AAAqC;;AAArC;AAAA;;;;AAixBf;;;AEvjCoC;;AAAe;;AAApC;;;AAAP;AF2jCA;;AAAA;;AAAA;;;AAAA;;AACO;;AAjCV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA+BO;;;;;;;;;;;;;;;;AAIP;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AA//BU;AAAA;AAAA;AAAA;AAAP;AAugCA;;;AACA;;;AACA;;;AAjhCO;AAAA;AAAA;AAAA;AAAe;;AAAf;AAYA;AAAP;AAsFO;AAAA;;AAAA;AAAA;AAAsB;;AAAtB;AA4uBP;AACO;AAAA;AAAA;AAAA;AAAA;;AAAoB;AAAA;AAAA;AAAA;AAApB;AAAA;;AAAA;AAAP;AACO;;AAAA;;;AAAA;AAAA;;AAAsB;;;AAAtB;AAAP;AACO;AAAA;;AAAA;AAAA;AAAA;;AAAgB;AAAhB;AAAP;AAER;;;AAEgB;AAAA;AAAA;AAAA;AAA4B;AAA5B;AADa;;;AAIb;;AAAA;AAAiC;;AAAA;;AAAA;AAAjC;AADJ;AAImC;AAAA;AAAA;AAAA;AApyBpB;;AAAZ;AAqyBA;;AAAA;;AACJ;AAAc;;AAAd;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAX;;;AACmB;;AAAA;AAAA;AAAA;;AAAA;AACJ;;AAAA;AAAA;AAAA;AAAA;AAAc;;AAAd;AAAP;AAKuB;;AAAA;AAAA;;;AACA;;AAAA;;;AACW;;AAAA;;;AACC;;AAAA;;;AACD;;AAAA;;;AACC;;AAAA;;;AAR/B;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AADJ;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAaA;;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAA6B;AAA7B;AAAA;AAAA;AAAA;AAuKO;;AAdV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA//BU;AAAA;AAAA;AAAA;AAAP;AAAA;AAohC6B;AAAA;;AAAA;AAAA;AAAX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAEF;AAAA;;AAAA;AAAA;AACS;AAAA;;AAAA;AAAA;AACG;AAAA;;AAAA;AAAA;AACX;AAAA;AAAA;AAAA;AACQ;AAAA;AAAA;AAAA;AACC;AAAA;;AAAA;AAAA;AACI;AAAA;;AAAA;AAAA;AACJ;AAAA;;AAAA;AAAA;AACL;AAAA;;AAAA;AAAA;AACS;AAAA;;AAAA;AAAA;AACC;AAAA;;AAAA;AAAA;AACT;AAAA;;AAAA;AAAA;AACC;AAAA;;AAAA;AAAA;AAfhB;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAJV;AAAA;AAAA;AAAA;AAAA;AAAA;AA/gCU;AAAA;AAAA;AAAA;AAAP;AAyiCG;AAAA;AAAA;AAAA;AAAqB;AAAA;AAAA;AAAA;AAArB;AAAX;;;AAEyB;AAAA;AAAA;AAAA;AADN;AAEQ;;AAFR;AAGY;AAHZ;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AALd;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBmC;AAAA;AAAA;AAAA;AAAzB;;;AAhBV;;;AExhCG;;;AARH;AAAA;AAUA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAWG;;;AACA;;AAAA;AAAA;AACO;;AAbV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAeA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAWG;;;AACA;;AAAA;AAAA;AACO;;AAbV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAeA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAsBG;;;AACA;;;AACwB;AAAA;;AAAxB;;;AA9Gc;;AAAX;AAAX;;;AACY;;AAAA;;AAAA;AA+GG;;AA1BV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAlFM;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAyGJ;;;AAvGG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAqGJ;;;AAnGG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAiGJ;;;AA/FG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AA6FJ;;;AA3FG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;;;;AA4FP;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAmBG;;;AACA;;;AACwB;AAAA;;AAAxB;;;AA9GO;AAAW;;AAAX;AAAP;AACc;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AA6GG;;AAvBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AApFM;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAwGJ;;;AAtGG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAoGJ;;;AAlGG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAgGJ;;;AA9FG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;;;;AA+FP;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AApK+B;;AAAgB;;AAArC;;;AAAP;AAoLA;;AAAA;AAAA;AACO;;AAjBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BU;AAAA;;AAAA;AAAA;AARV;AAAA;AAAA;AAAA;AAAA;AAAA;AAUA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAc4B;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AAlBP;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAcU;AACP;AAAA;;;AAES;;;;;;;;AADT;;AAAA;;;;;;;;;;;;;;AA+BQ;AAJI;;AAvRL;;AAAA;AAAA;AAAA;AAAA;;AAsRC;AAGO;AAAA;AA7ClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAsCe;;AAlRL;;AAAA;AAAA;AAAA;AAAA;;AAiRC;AAGO;AAAA;AAxClB;;;AAiCe;;AA7QL;;AAAA;AAAA;AAAA;AAAA;;AA4QC;AAGO;AAAA;AAnClB;;;AA4Be;;AAxQL;;AAAA;AAAA;AAAA;AAAA;;AAuQC;AAGO;AAAA;AA9BlB;;;AAuBe;;AAnQL;;AAAA;AAAA;AAAA;AAAA;;AAkQC;AAGO;AAAA;AAzBlB;;;AAkBkB;;;;;;;;;;;;;;;;;;AAlBlB;;;AHzQD;;;AAEe;;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAJ;AAAP;;AAgBJ;;;AApB8B;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAqCW;AAAA;AAAA;AAIM;AAAA;;AAAA;AAAA;AAAiC;;AAAA;;AAAA;AAAjC;AAEb;AAAA;;AAAA;AAAA;AAAkC;;AAAA;;AAAA;AAAlC;AAMgB;;AAAA;AAAA;AAAgB;AAAA;;AAAA;AAAA;AADf;;AAAA;;AAAA;;AAAA;;;AAIgB;AAAA;;AAAA;AAAA;AADf;;AAAA;;AAAA;;AAAA;;;AAMtB;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAI+B;AAAA;;AAAA;AAAA;AAA/B;AAAA;;AACgC;AAAA;;AAAA;AAAA;AAAhC;AAAA;;AAG0B;AAAA;AAAA;AAAA;AAA1B;AAAA;;AAIA;;AAAA;AAAA;AACA;AAEJ;;;;;;AAzE8B;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AC+GO;AAAA;AAAA;AAAA;AAAe;;AAAf;ADnCf;;;AACY;AAEO;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AACR;;AAAA;AAAA;AAAA;;AAAX;;;AACY;AAGJ;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAC0B;AAA1B;AAAA;;AACA;;AAAA;AAAA;AACO;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;AAAA;AAAA;;AAAA;AAAA;;ACyCJ;;;AAIO;;AAAA;;;AAAA;;AAAA;;;AACQ;AAAP;AACQ;;AAAA;;AAAA;AACL;;AAAA;AAAP;AAEJ;;;AAEJ;;AAAA;;;AACmB;AAAP;AACG;AAAA;;AAAA;AAAA;AAAP;AAAA;AACoC;AAAA;;AAAA;AAAA;AAA7B;;AAAA;AAAA;;AAAA;;;AAAP;AAEJ;;;AAOJ;;AAAA;;;AACmB;AAAP;AAEA;AAAA;;AAAA;AAAA;AAEA;AAAA;;AAAA;AAAA;AAHG;;AAAA;AAAA;;;AAAP;AAwBJ;;;AAEsB;AAAA;AAAA;AAAA;AAAX;;AAAA;AAAP;AAdO;;AAAY;;AAAZ;AAgBA;AAAc;;AAAd;AAAA;AAAA;AAAA;AAAA;;AAAP;AAZO;;AAAW;;AAAX;AAeS;;AAAA;AAAA;;AAAA;AAAA;AAAT;;AAAA;AAAP;AACO;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAP;AAuGJ;;;AA1DO;;AARC;AAQD;AAAA;;;AAAA;;AAPC;AAOD;AAAA;;;AAAA;;AANC;;AAMD;AAAA;;;AAAA;;AALC;;AAKD;AAAA;;;AAAA;;AAJC;;AAID;AAAA;;;AACQ;AA6DX;;AA1DR;;AAAA;;;AAEmB;AAwDJ;;;AAtDJ;;AAAiB;;AAAjB;AAAA;;;AAAyC;;AAAiB;;AAAjB;AAAzC;;;AAIQ;;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;;AAkDJ;;;;AAAA;;;AA7CJ;;AAAiB;AAAjB;AAAX;;;AAEmB;;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;;AA2CJ;;;;AAAA;;;AArCJ;;AAAiB;;AAAjB;AAAX;;;AAEmB;;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;;AAmCJ;;;;AAAA;;;AA5BJ;;AAAiB;;AAAjB;AAAX;;;AAEmB;;AAAc;;AAAd;AA0BJ;;;AAxBA;AAwBA;;;AAkBH;AAAA;;AAAA;AAAA;AAAsB;AAAtB;AAAA;;;AACI;AAAA;;AAAA;AAAA;AADJ;;;;AADJ;;AAAA;AA8CJ;;;AASQ;;AAAA;;AAAA;AAAA;AAAA;;;AACG;AAAA;;AAAA;AAAA;AADH;;;AAEG;AAAA;;AAAA;AAAA;AAFH;;;AAIO;AAAP;;AAAA;;AAAA;AAEA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAHM;;;AAQN;AAAA;;AAAA;AAAA;AAHG;;AAAA;AAAA;;;AAAP;;AAAA;;AAAA;AA+DJ;;;AAMJ;;AAAA;;;AACY;;AAAA;AACU;AAAA;;AAAA;AAAA;AACV;AAAA;;AAAA;AAAA;AADmC;;AAAA;;AAAA;;;AAAzB;AAKd;AAAA;AAGI;AAAA;;AAAA;AAAA;AAFG;;AAAA;AAAA;;AAAA;;;AAAP;AAyIJ;;;;;;;;AAUW;;AAAA;AAAA;AAAkB;AAAA;AAAA;AAAA;AAAlB;AAAP;AACO;;AAAA;;AAAA;AAAwB;;AAAxB;AAAP;AAEa;;AAAA;AAAA;AAAA;AACI;AAAd;AAAA;AAAX;;;AA5ee;AAAA;AAAA;AAAA;AAAe;;AAAf;AA+eH;AAEI;AAAA;;AAAA;AAAA;AAA6B;AAAA;;AAAA;AAAA;AAA7B;AADJ;AAG6B;;AAAA;;AAAA;AAA7B;;AAAA;;AAAA;AACA;;AAAA;AAAA;AAC6B;;AAAA;;AAAA;AAA7B;;AAAA;AAAA;AACA;;AAAwB;AAAxB;AACiC;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAqB;AAArB;AAAA;AAAA;AAAA;AACA;AAAc;;AAAd;AA7LJ;;AAAA;AACO;AAAA;;AAAA;AAAA;AA6LH;;AAAA;AAGmB;AAHnB;;;;AAAA;;AAKA;;AAAA;;AAAA;;AAAA;AA/fG;AAAA;AAAA;AAAA;AAAe;;AAAf;AAYA;AAAP;AAsfA;AAAA;;AAAA;AAAA;AAAyB;;AAAA;;;AAAA;;AAAzB;AAAA;;AAAA;AAAA;AAEG;;AAAc;;AAAd;AAAX;;;AAIgB;;AAAA;;AAAA;AACA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAHY;;;AAMI;AAAA;;AAAA;AAAA;AAAhB;AAAA;;AAiFL;AAAA;;AAAA;AAAA;AAAA;;;AAAqC;AAAA;;AAAA;AAAA;AAAP;;AAAA;AAA9B;;;AACQ;AAAA;;AAAA;AAAA;AAAA;;AAAA;AACR;AAAA;;AAAA;AAAA;AAAA;;;AAAmC;AAAA;;AAAA;AAAA;AAAP;;AAAA;AAA5B;;;AACQ;AAAA;;AAAA;AAAA;AAAA;;AAAA;AArFP;;AAAA;;AAAA;AAYD;;AAAc;;AAAd;AAAX;;;AACyC;;AAAA;;AAAA;AAA7B;;AAAA;;AAAA;AACA;;AAAA;AAAA;AAKD;;;AAAX;;;AACe;;AAAc;;AAAd;AAAf;;;AAI2B;AAAA;AAAA;AAAA;AAA4B;AAAA;AAAA;AAAA;AAA5B;AACD;;AADA;AADF;;AAAA;AAFR;AAAA;;;AA9LU;AAAA;;AAAA;AAAA;AAAA;;AAAA;AACJ;AAAd;;AACwB;AAAxB;;AAEG;;AAAA;;AAAA;AAAA;AAAA;;AAAX;;;AAE8B;;AAAA;;AAAA;;;AAAA;AAAA;;AAKM;AAAxB;;;;AAEc;AAAA;AAAA;AAAA;AAAoB;AAApB;AAAA;;AACM;AAAA;AAAA;AAAA;AAAlB;;AAAA;AAAd;;;AAC2B;;AAAA;;;AAAA;AAAA;;AACK;AAAA;AAAA;AAAA;;AAEuB;;AAArB;AAAA;;;AAClB;;AAAqB;;AAArB;AAAA;;;AACI;;AAAA;;AAAA;AADJ;;;;AAGhB;;;AACA;;AAAA;;;AAC4C;AAAxB;;AAOR;;AAAmB;AAAnB;AAAA;;;;;AAHY;;AAAA;;AAAA;AAFc;;AAAA;AAAA;;;AAAA;AAAA;;AAIlB;;AAAA;AAAA;;;;;;;;;AAGZ;;AAAA;AACY;AAAA;;AAAA;AAAA;AACT;;AAAA;;AAAA;AAAc;AAAd;AAAX;;;AAEyB;AAAA;;AAAA;AAAA;AAAb;AAGA;AAAA;;AAAA;AAAA;AAFG;;AAAA;;;AA+JC;;AAAA;AAAA;AAKR;AAAA;AAAA;AAAA;AAAqB;AAArB;AAAA;AAAA;AAAA;AACA;;AAEW;AACQ;AAHnB;;;;AAAA;;;;;;;;;AAFqC;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;;;;AAjBC;;AAAc;;AAAd;AAAb;;;AAE6C;AAAA;;AAAA;AAAA;AAAjC;;AAAA;AAAA;;;;AAdC;;AAAc;;AAAd;AAAb;;;AACwB;;AAAA;;AAAA;AAAA;AAAA;;AACxB;;;AAC4B;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAChB;;AAAA;;AAAA;;;;AAEG;;AAAA;;AAAA;AAAA;AAAA;;AAAf;;;AACgB;;AAAA;;AAAA;;;;AAkCZ;;;AAUwB;;AACH;;AAAA;AAAA;AACE;;AAAA;;;AACI;;AAAA;;;AACJ;;AAGW;;AALX;AAKW;AA6BtC;;AAAA;;;AACmB;AA/BS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAIA;AAAA;;AAAA;AAAA;AACH;;AAAA;AAAiB;AAAjB;AAZb;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AADJ;;;;;;AAAA;AAAA;AAAA;;;;;;AAwCG;;AAAe;AAAf;AAAA;;;AAAA;;AAAsC;;AAAtC;AAAA;;;AACQ;AAhCC;;;AAiCL;;;AAjCK;;;AEvpBhB;;;;;AAFW;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAGA;;;AACH;;AAAA;AAAA;AAAA;AAAA;AACG;;AAAA;AAAA;;AADH;AAAA;;;AAEG;;AAAA;AAAA;AAAA;AAAA;AADA;;AAAA;AADH;;;;AADJ;;AAAA;;;;;AAOyB;;AAbF;AAAA;;AAAA;AAAA;AAAhB;AAaP;;AAkBW;AAAA;;AAAA;AAAA;AAAJ;AAAP;;AAGW;AAAA;;AAAA;AAAA;AAAJ;AAAP;;AAEJ;;;AACW;;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;AAAA;;AAMH;;AANG;AAAA;;;AAAA;;AAOH;;AAPG;AAAA;;;;AAAP;;;", "op_pc_offset": 0, "pc_events": { "1": { diff --git a/smart_contracts/artifacts/d_asa/DASA.approval.teal b/smart_contracts/artifacts/d_asa/DASA.approval.teal index d6e2cd7a..2657603e 100644 --- a/smart_contracts/artifacts/d_asa/DASA.approval.teal +++ b/smart_contracts/artifacts/d_asa/DASA.approval.teal @@ -628,7 +628,7 @@ fund_due_cashflows_after_if_else@38: + dup bury 9 - // modules/actus_kernel.py:736 + // modules/actus_kernel.py:734 // balance = self.settlement_asset_id.balance(Global.current_application_address) global CurrentApplicationAddress intc_0 // 0 @@ -649,13 +649,13 @@ fund_due_cashflows_after_if_else@38: assert // check self.reserved_principal exists dig 1 + - // modules/actus_kernel.py:738 + // modules/actus_kernel.py:736 // assert balance >= reserved_total, err.NOT_ENOUGH_FUNDS dig 2 dig 1 >= assert // Not enough funds for the payment - // modules/actus_kernel.py:739 + // modules/actus_kernel.py:737 // return balance - reserved_total uncover 2 swap @@ -1845,7 +1845,7 @@ transfer_after_if_else@5: extract_uint64 <= assert // Insufficient sender units to transfer - // modules/actus_kernel.py:765 + // modules/actus_kernel.py:763 // if self.event_cursor >= self.schedule_entry_count: intc_0 // 0 bytec_2 // "event_cursor" @@ -1857,20 +1857,20 @@ transfer_after_if_else@5: assert // check self.schedule_entry_count exists >= bnz transfer_after_inlined_modules.actus_kernel.ActusKernelModule._assert_no_due_event_pending@10 - // modules/actus_kernel.py:767 + // modules/actus_kernel.py:765 // next_entry = self._get_schedule_entry(self.event_cursor) intc_0 // 0 bytec_2 // "event_cursor" app_global_get_ex assert // check self.event_cursor exists callsub _get_schedule_entry - // modules/actus_kernel.py:769 + // modules/actus_kernel.py:767 // next_entry.scheduled_time > Global.latest_timestamp pushint 9 extract_uint64 global LatestTimestamp > - // modules/actus_kernel.py:768-770 + // modules/actus_kernel.py:766-768 // assert ( // next_entry.scheduled_time > Global.latest_timestamp // ), err.PENDING_ACTUS_EVENT @@ -2193,7 +2193,7 @@ account_get_position: // modules.actus_kernel.ActusKernelModule.contract_create[routing]() -> void: contract_create: - // modules/actus_kernel.py:1017 + // modules/actus_kernel.py:1019 // @arc4.abimethod(create="require") txna ApplicationArgs 1 dup @@ -2201,15 +2201,15 @@ contract_create: intc_3 // 32 == assert // invalid number of bytes for arc4.static_array - // modules/actus_kernel.py:1028 + // modules/actus_kernel.py:1030 // self.arranger.value = arranger bytec 18 // 0x5223417272616e67657223 swap app_global_put - // modules/actus_kernel.py:1029 + // modules/actus_kernel.py:1031 // return Global.latest_timestamp global LatestTimestamp - // modules/actus_kernel.py:1017 + // modules/actus_kernel.py:1019 // @arc4.abimethod(create="require") itob bytec_0 // 0x151f7c75 @@ -2224,7 +2224,7 @@ contract_create: contract_config: pushbytes "" dup - // modules/actus_kernel.py:1031 + // modules/actus_kernel.py:1033 // @arc4.abimethod txna ApplicationArgs 1 dupn 2 @@ -2263,10 +2263,10 @@ contract_config: + == assert // invalid number of bytes for smart_contracts.abi_types.Prospectus - // modules/actus_kernel.py:1060 + // modules/actus_kernel.py:1062 // self._assert_caller_is_arranger() callsub _assert_caller_is_arranger - // modules/actus_kernel.py:1062-1063 + // modules/actus_kernel.py:1064-1065 // # Configure Contract // self.contract_type = terms.contract_type.as_uint64() intc_0 // 0 @@ -2368,7 +2368,7 @@ contract_config_bool_merge@9: // modules/actus_kernel.py:229 // assert self._is_supported_contract_type(contract_type), err.INVALID_ACTUS_CONFIG assert // Invalid ACTUS configuration - // modules/actus_kernel.py:1065 + // modules/actus_kernel.py:1067 // self._store_contract_config(self.contract_type, terms, initial_state) intc_0 // 0 bytec 10 // "contract_type" @@ -2481,7 +2481,7 @@ contract_config_bool_merge@18: assert // Invalid ACTUS configuration contract_config_after_if_else@20: - // modules/actus_kernel.py:809 + // modules/actus_kernel.py:807 // assert self.status == UInt64(enums.STATUS_INACTIVE), err.ALREADY_CONFIGURED intc_0 // 0 bytec_1 // "status" @@ -2489,7 +2489,7 @@ contract_config_after_if_else@20: assert // check self.status exists ! assert // D-ASA already configured - // modules/actus_kernel.py:810 + // modules/actus_kernel.py:808 // assert self.initial_exchange_amount == UInt64(0), err.ALREADY_CONFIGURED intc_0 // 0 bytec 20 // "initial_exchange_amount" @@ -2497,50 +2497,50 @@ contract_config_after_if_else@20: assert // check self.initial_exchange_amount exists ! assert // D-ASA already configured - // modules/actus_kernel.py:812-813 + // modules/actus_kernel.py:810-811 // # Set Denomination Asset // self._assert_denomination_asset(terms.denomination_asset_id) dig 4 dup intc_1 // 1 extract_uint64 - // modules/actus_kernel.py:777-778 + // modules/actus_kernel.py:775-776 // # The reference implementation has on-chain denomination with ASA // _creator, exists = op.AssetParamsGet.asset_creator(denomination_asset_id) dup asset_params_get AssetCreator bury 1 - // modules/actus_kernel.py:779 + // modules/actus_kernel.py:777 // assert exists, err.INVALID_DENOMINATION assert // Denomination asset is not properly set - // modules/actus_kernel.py:782 + // modules/actus_kernel.py:780 // self.denomination_asset_id = denomination_asset_id bytec 44 // "denomination_asset_id" dig 1 app_global_put - // modules/actus_kernel.py:816-817 + // modules/actus_kernel.py:814-815 // # Set Settlement Asset // self._assert_settlement_asset(terms.settlement_asset_id) dig 1 pushint 9 extract_uint64 - // modules/actus_kernel.py:787 + // modules/actus_kernel.py:785 // settlement_asset_id == self.denomination_asset_id dup uncover 2 == - // modules/actus_kernel.py:785-788 + // modules/actus_kernel.py:783-786 // # The reference implementation settlement asset is the denomination asset // assert ( // settlement_asset_id == self.denomination_asset_id // ), err.INVALID_SETTLEMENT_ASSET assert // Different settlement asset not supported, must be equal to denomination asset - // modules/actus_kernel.py:791 + // modules/actus_kernel.py:789 // self.settlement_asset_id = settlement_asset_id bytec 19 // "settlement_asset_id" dig 1 app_global_put - // modules/actus_kernel.py:792-798 + // modules/actus_kernel.py:790-796 // # The reference implementation has on-chain settlement with ASA // itxn.AssetTransfer( // xfer_asset=self.settlement_asset_id, @@ -2549,26 +2549,26 @@ contract_config_after_if_else@20: // fee=Global.min_txn_fee, // ).submit() itxn_begin - // modules/actus_kernel.py:797 + // modules/actus_kernel.py:795 // fee=Global.min_txn_fee, global MinTxnFee - // modules/actus_kernel.py:795 + // modules/actus_kernel.py:793 // asset_receiver=Global.current_application_address, global CurrentApplicationAddress - // modules/actus_kernel.py:796 + // modules/actus_kernel.py:794 // asset_amount=0, intc_0 // 0 itxn_field AssetAmount itxn_field AssetReceiver swap itxn_field XferAsset - // modules/actus_kernel.py:792-793 + // modules/actus_kernel.py:790-791 // # The reference implementation has on-chain settlement with ASA // itxn.AssetTransfer( pushint 4 // axfer itxn_field TypeEnum itxn_field Fee - // modules/actus_kernel.py:792-798 + // modules/actus_kernel.py:790-796 // # The reference implementation has on-chain settlement with ASA // itxn.AssetTransfer( // xfer_asset=self.settlement_asset_id, @@ -2577,7 +2577,7 @@ contract_config_after_if_else@20: // fee=Global.min_txn_fee, // ).submit() itxn_submit - // modules/actus_kernel.py:820-821 + // modules/actus_kernel.py:818-819 // # Units // self.total_units = terms.total_units dup @@ -2586,18 +2586,18 @@ contract_config_after_if_else@20: bytec 13 // "total_units" swap app_global_put - // modules/actus_kernel.py:822 + // modules/actus_kernel.py:820 // self.reserved_units_total = UInt64(0) bytec 11 // "reserved_units_total" intc_0 // 0 app_global_put - // modules/actus_kernel.py:824-825 + // modules/actus_kernel.py:822-823 // # Day-Count Conventions // self.day_count_convention = terms.day_count_convention.as_uint64() bytec 46 // "day_count_convention" dig 8 app_global_put - // modules/actus_kernel.py:827-828 + // modules/actus_kernel.py:825-826 // # Time // self.initial_exchange_date = terms.initial_exchange_date dup @@ -2606,7 +2606,7 @@ contract_config_after_if_else@20: bytec 27 // "initial_exchange_date" dig 1 app_global_put - // modules/actus_kernel.py:829 + // modules/actus_kernel.py:827 // self.maturity_date = terms.maturity_date dig 1 pushint 49 @@ -2614,7 +2614,7 @@ contract_config_after_if_else@20: bytec 45 // "maturity_date" dig 1 app_global_put - // modules/actus_kernel.py:830 + // modules/actus_kernel.py:828 // self.next_principal_redemption = initial_state.next_principal_redemption dig 6 dup @@ -2624,13 +2624,13 @@ contract_config_after_if_else@20: bytec 14 // "next_principal_redemption" swap app_global_put - // modules/actus_kernel.py:832-833 + // modules/actus_kernel.py:830-831 // # Principal // self.initial_exchange_amount = terms.initial_exchange_amount bytec 20 // "initial_exchange_amount" dig 10 app_global_put - // modules/actus_kernel.py:834 + // modules/actus_kernel.py:832 // self.dynamic_principal_redemption = terms.dynamic_principal_redemption dig 3 pushint 786 @@ -2638,7 +2638,7 @@ contract_config_after_if_else@20: bytec 34 // "dynamic_principal_redemption" swap app_global_put - // modules/actus_kernel.py:835 + // modules/actus_kernel.py:833 // self.outstanding_principal = initial_state.outstanding_principal dig 1 pushint 16 @@ -2646,7 +2646,7 @@ contract_config_after_if_else@20: bytec 4 // "outstanding_principal" swap app_global_put - // modules/actus_kernel.py:837-838 + // modules/actus_kernel.py:835-836 // # Interest // self.accrued_interest = initial_state.accrued_interest dig 1 @@ -2655,7 +2655,7 @@ contract_config_after_if_else@20: bytec 6 // "accrued_interest" swap app_global_put - // modules/actus_kernel.py:840-841 + // modules/actus_kernel.py:838-839 // # Interest Rate // self.nominal_interest_rate = initial_state.nominal_interest_rate dig 1 @@ -2664,7 +2664,7 @@ contract_config_after_if_else@20: bytec 9 // "nominal_interest_rate" swap app_global_put - // modules/actus_kernel.py:842 + // modules/actus_kernel.py:840 // self.interest_calculation_base = initial_state.interest_calculation_base dig 1 pushint 24 @@ -2672,7 +2672,7 @@ contract_config_after_if_else@20: bytec 7 // "interest_calculation_base" swap app_global_put - // modules/actus_kernel.py:843 + // modules/actus_kernel.py:841 // self.rate_reset_spread = terms.rate_reset_spread dig 3 pushint 58 @@ -2680,7 +2680,7 @@ contract_config_after_if_else@20: bytec 35 // "rate_reset_spread" swap app_global_put - // modules/actus_kernel.py:844 + // modules/actus_kernel.py:842 // self.rate_reset_multiplier = terms.rate_reset_multiplier dig 3 pushint 66 @@ -2688,7 +2688,7 @@ contract_config_after_if_else@20: bytec 36 // "rate_reset_multiplier" swap app_global_put - // modules/actus_kernel.py:845 + // modules/actus_kernel.py:843 // self.rate_reset_floor = terms.rate_reset_floor dig 3 pushint 74 @@ -2696,7 +2696,7 @@ contract_config_after_if_else@20: bytec 30 // "rate_reset_floor" swap app_global_put - // modules/actus_kernel.py:846 + // modules/actus_kernel.py:844 // self.rate_reset_cap = terms.rate_reset_cap dig 3 pushint 82 @@ -2704,7 +2704,7 @@ contract_config_after_if_else@20: bytec 31 // "rate_reset_cap" swap app_global_put - // modules/actus_kernel.py:847 + // modules/actus_kernel.py:845 // self.rate_reset_next = terms.rate_reset_next dig 3 pushint 90 @@ -2712,7 +2712,7 @@ contract_config_after_if_else@20: bytec 37 // "rate_reset_next" swap app_global_put - // modules/actus_kernel.py:848 + // modules/actus_kernel.py:846 // self.has_rate_reset_floor = terms.has_rate_reset_floor dig 3 pushint 784 @@ -2720,7 +2720,7 @@ contract_config_after_if_else@20: bytec 38 // "has_rate_reset_floor" swap app_global_put - // modules/actus_kernel.py:849 + // modules/actus_kernel.py:847 // self.has_rate_reset_cap = terms.has_rate_reset_cap dig 3 pushint 785 @@ -2728,7 +2728,7 @@ contract_config_after_if_else@20: bytec 39 // "has_rate_reset_cap" swap app_global_put - // modules/actus_kernel.py:851-852 + // modules/actus_kernel.py:849-850 // # Scaling // self.fixed_point_scale = terms.fixed_point_scale uncover 3 @@ -2737,7 +2737,7 @@ contract_config_after_if_else@20: bytec 5 // "fixed_point_scale" swap app_global_put - // modules/actus_kernel.py:854-855 + // modules/actus_kernel.py:852-853 // # Schedule Processing // self.event_cursor = initial_state.event_cursor dig 1 @@ -2746,7 +2746,7 @@ contract_config_after_if_else@20: bytec_2 // "event_cursor" swap app_global_put - // modules/actus_kernel.py:857-858 + // modules/actus_kernel.py:855-856 // # Per-Unit Fixed-Point Indexes // self.cumulative_interest_index = initial_state.cumulative_interest_index dig 1 @@ -2755,7 +2755,7 @@ contract_config_after_if_else@20: bytec 16 // "cumulative_interest_index" swap app_global_put - // modules/actus_kernel.py:859 + // modules/actus_kernel.py:857 // self.cumulative_principal_index = initial_state.cumulative_principal_index dig 1 pushint 64 @@ -2763,24 +2763,24 @@ contract_config_after_if_else@20: bytec 17 // "cumulative_principal_index" swap app_global_put - // modules/actus_kernel.py:861-862 + // modules/actus_kernel.py:859-860 // # Reserved Amount (for executed cashflows) // self.reserved_interest = UInt64(0) bytec 15 // "reserved_interest" intc_0 // 0 app_global_put - // modules/actus_kernel.py:863 + // modules/actus_kernel.py:861 // self.reserved_principal = UInt64(0) bytec 12 // "reserved_principal" intc_0 // 0 app_global_put - // modules/actus_kernel.py:865 + // modules/actus_kernel.py:863 // assert terms.initial_exchange_date > Global.latest_timestamp, err.INVALID_IED dig 2 global LatestTimestamp > assert // IED must be set in the future - // modules/actus_kernel.py:866 + // modules/actus_kernel.py:864 // assert terms.initial_exchange_date > initial_state.status_date, err.INVALID_IED swap intc_0 // 0 @@ -2788,11 +2788,11 @@ contract_config_after_if_else@20: dig 2 < assert // IED must be set in the future - // modules/actus_kernel.py:867 + // modules/actus_kernel.py:865 // assert terms.initial_exchange_date < terms.maturity_date, err.INVALID_IED < assert // IED must be set in the future - // modules/actus_kernel.py:1067-1068 + // modules/actus_kernel.py:1069-1070 // # Notarize prospectus (optional) // self.prospectus_hash = prospectus.hash.bytes dig 2 @@ -2800,17 +2800,17 @@ contract_config_after_if_else@20: bytec 42 // "prospectus_hash" swap app_global_put - // modules/actus_kernel.py:1069 + // modules/actus_kernel.py:1071 // self.prospectus_url = prospectus.url dig 1 extract 2 0 bytec 43 // "prospectus_url" swap app_global_put - // modules/actus_kernel.py:1070 + // modules/actus_kernel.py:1072 // return Global.latest_timestamp global LatestTimestamp - // modules/actus_kernel.py:1031 + // modules/actus_kernel.py:1033 // @arc4.abimethod itob bytec_0 // 0x151f7c75 @@ -2834,7 +2834,7 @@ contract_schedule: intc_0 // 0 pushbytes "" dupn 2 - // modules/actus_kernel.py:1072 + // modules/actus_kernel.py:1074 // @arc4.abimethod txna ApplicationArgs 1 dup @@ -2870,10 +2870,10 @@ contract_schedule: len == assert // invalid number of bytes for arc4.dynamic_array - // modules/actus_kernel.py:1087 + // modules/actus_kernel.py:1089 // self._assert_caller_is_arranger() callsub _assert_caller_is_arranger - // modules/actus_kernel.py:1090 + // modules/actus_kernel.py:1092 // contract_type=self.contract_type, intc_0 // 0 bytec 10 // "contract_type" @@ -2881,7 +2881,7 @@ contract_schedule: swap cover 3 assert // check self.contract_type exists - // modules/actus_kernel.py:883 + // modules/actus_kernel.py:881 // assert self.status == UInt64(enums.STATUS_INACTIVE), err.ALREADY_CONFIGURED intc_0 // 0 bytec_1 // "status" @@ -2889,7 +2889,7 @@ contract_schedule: assert // check self.status exists ! assert // D-ASA already configured - // modules/actus_kernel.py:884-886 + // modules/actus_kernel.py:882-884 // assert schedule_page.length <= UInt64( // cst.SCHEDULE_PAGE_SIZE // ), err.INVALID_SCHEDULE_PAGE @@ -2897,31 +2897,31 @@ contract_schedule: pushint 16 <= assert // Invalid schedule page - // modules/actus_kernel.py:887 + // modules/actus_kernel.py:885 // assert self.initial_exchange_amount > UInt64(0), err.TERMS_NOT_CONFIGURED intc_0 // 0 bytec 20 // "initial_exchange_amount" app_global_get_ex assert // check self.initial_exchange_amount exists assert // D-ASA terms not configured - // modules/actus_kernel.py:889 + // modules/actus_kernel.py:887 // page_cursor = schedule_page_index * UInt64(cst.SCHEDULE_PAGE_SIZE) swap pushint 16 * swap - // modules/actus_kernel.py:896 + // modules/actus_kernel.py:894 // + page_length * UInt64(cst.OP_UP_CONTRACT_CONFIG_PER_ENTRY_BUDGET) pushint 100 * - // modules/actus_kernel.py:895 + // modules/actus_kernel.py:893 // UInt64(cst.OP_UP_CONTRACT_CONFIG_BASE_BUDGET) intc 4 // 1500 - // modules/actus_kernel.py:895-896 + // modules/actus_kernel.py:893-894 // UInt64(cst.OP_UP_CONTRACT_CONFIG_BASE_BUDGET) // + page_length * UInt64(cst.OP_UP_CONTRACT_CONFIG_PER_ENTRY_BUDGET) + - // modules/actus_kernel.py:891-898 + // modules/actus_kernel.py:889-896 // # Validation cost grows with page length, so configuration explicitly // # buys extra opcode budget for larger uploads. // ensure_budget( @@ -2932,18 +2932,18 @@ contract_schedule: // ) intc_0 // 0 callsub ensure_budget - // modules/actus_kernel.py:899 + // modules/actus_kernel.py:897 // index = UInt64(0) intc_0 // 0 contract_schedule_while_top@2: - // modules/actus_kernel.py:900 + // modules/actus_kernel.py:898 // while index < page_length: dup dig 4 < bz contract_schedule_after_while@11 - // modules/actus_kernel.py:901-902 + // modules/actus_kernel.py:899-900 // entry = schedule_page[index].copy() // entry_event_type = entry.event_type.as_uint64() dig 4 @@ -2957,20 +2957,20 @@ contract_schedule_while_top@2: * pushint 65 extract3 // on error: index access is out of bounds - // modules/actus_kernel.py:902 + // modules/actus_kernel.py:900 // entry_event_type = entry.event_type.as_uint64() dup - // modules/actus_kernel.py:901-902 + // modules/actus_kernel.py:899-900 // entry = schedule_page[index].copy() // entry_event_type = entry.event_type.as_uint64() intc_2 // 8 - // modules/actus_kernel.py:902 + // modules/actus_kernel.py:900 // entry_event_type = entry.event_type.as_uint64() getbyte dup cover 2 bury 13 - // modules/actus_kernel.py:903 + // modules/actus_kernel.py:901 // assert entry.event_id == page_cursor + index, err.INVALID_EVENT_ID dup intc_0 // 0 @@ -2983,14 +2983,14 @@ contract_schedule_while_top@2: dig 1 == assert // Invalid event id - // modules/actus_kernel.py:904-906 + // modules/actus_kernel.py:902-904 // self._assert_event_allowed_for_contract_type( // contract_type, entry_event_type // ) dig 5 uncover 3 callsub _assert_event_allowed_for_contract_type - // modules/actus_kernel.py:907 + // modules/actus_kernel.py:905 // assert entry.scheduled_time > UInt64(0), err.INVALID_ACTUS_CONFIG swap pushint 9 @@ -2998,14 +2998,14 @@ contract_schedule_while_top@2: dup bury 10 assert // Invalid ACTUS configuration - // modules/actus_kernel.py:908 + // modules/actus_kernel.py:906 // if entry.event_id > UInt64(0): bz contract_schedule_after_if_else@8 - // modules/actus_kernel.py:909 + // modules/actus_kernel.py:907 // if index > UInt64(0): dup bz contract_schedule_else_body@6 - // modules/actus_kernel.py:910 + // modules/actus_kernel.py:908 // previous_entry = schedule_page[index - UInt64(1)].copy() dup intc_1 // 1 @@ -3018,24 +3018,24 @@ contract_schedule_while_top@2: extract3 // on error: index access is out of bounds contract_schedule_after_if_else@7: - // modules/actus_kernel.py:925 + // modules/actus_kernel.py:923 // previous_entry.scheduled_time <= entry.scheduled_time pushint 9 extract_uint64 dig 8 <= - // modules/actus_kernel.py:924-926 + // modules/actus_kernel.py:922-924 // assert ( // previous_entry.scheduled_time <= entry.scheduled_time // ), err.INVALID_SORTING assert // Time events must be sorted in strictly ascending order contract_schedule_after_if_else@8: - // modules/actus_kernel.py:927 + // modules/actus_kernel.py:925 // if entry.event_id == UInt64(0): dig 8 bnz contract_schedule_after_if_else@10 - // modules/actus_kernel.py:928-930 + // modules/actus_kernel.py:926-928 // assert entry_event_type == UInt64( // enums.EVT_IED // ), err.INVALID_ACTUS_CONFIG @@ -3045,7 +3045,7 @@ contract_schedule_after_if_else@8: assert // Invalid ACTUS configuration contract_schedule_after_if_else@10: - // modules/actus_kernel.py:931 + // modules/actus_kernel.py:929 // index += UInt64(1) dup intc_1 // 1 @@ -3054,18 +3054,18 @@ contract_schedule_after_if_else@10: b contract_schedule_while_top@2 contract_schedule_else_body@6: - // modules/actus_kernel.py:912-914 + // modules/actus_kernel.py:910-912 // # The first entry of a page must still be ordered after the // # last entry of the previous page. // assert schedule_page_index > UInt64(0), err.INVALID_EVENT_ID dig 6 dup assert // Invalid event id - // modules/actus_kernel.py:915 + // modules/actus_kernel.py:913 // previous_page_index = schedule_page_index - UInt64(1) intc_1 // 1 - - // modules/actus_kernel.py:917 + // modules/actus_kernel.py:915 // previous_page_index in self.schedule_page itob bytec 24 // 0x5323 @@ -3074,12 +3074,12 @@ contract_schedule_else_body@6: dup box_len bury 1 - // modules/actus_kernel.py:916-918 + // modules/actus_kernel.py:914-916 // assert ( // previous_page_index in self.schedule_page // ), err.INVALID_SCHEDULE_PAGE assert // Invalid schedule page - // modules/actus_kernel.py:919-920 + // modules/actus_kernel.py:917-918 // previous_page = self.schedule_page[previous_page_index].copy() // assert previous_page.length > UInt64(0), err.INVALID_SCHEDULE_PAGE dup @@ -3087,15 +3087,15 @@ contract_schedule_else_body@6: pushint 2 box_extract btoi - // modules/actus_kernel.py:920 + // modules/actus_kernel.py:918 // assert previous_page.length > UInt64(0), err.INVALID_SCHEDULE_PAGE dup assert // Invalid schedule page - // modules/actus_kernel.py:922 + // modules/actus_kernel.py:920 // previous_page.length - UInt64(1) intc_1 // 1 - - // modules/actus_kernel.py:921-923 + // modules/actus_kernel.py:919-921 // previous_entry = previous_page[ // previous_page.length - UInt64(1) // ].copy() @@ -3120,35 +3120,35 @@ contract_schedule_after_while@11: pop dig 5 box_put - // modules/actus_kernel.py:934 + // modules/actus_kernel.py:932 // if is_last_page: dig 5 bz contract_schedule_after_if_else@13 - // modules/actus_kernel.py:936 + // modules/actus_kernel.py:934 // schedule_page_index * UInt64(cst.SCHEDULE_PAGE_SIZE) + page_length dig 1 dig 4 + - // modules/actus_kernel.py:935 + // modules/actus_kernel.py:933 // self.schedule_entry_count = ( bytec_3 // "schedule_entry_count" - // modules/actus_kernel.py:935-937 + // modules/actus_kernel.py:933-935 // self.schedule_entry_count = ( // schedule_page_index * UInt64(cst.SCHEDULE_PAGE_SIZE) + page_length // ) swap app_global_put - // modules/actus_kernel.py:938 + // modules/actus_kernel.py:936 // self.status = UInt64(enums.STATUS_PENDING_IED) bytec_1 // "status" pushint 50 app_global_put contract_schedule_after_if_else@13: - // modules/actus_kernel.py:1095 + // modules/actus_kernel.py:1097 // return Global.latest_timestamp global LatestTimestamp - // modules/actus_kernel.py:1072 + // modules/actus_kernel.py:1074 // @arc4.abimethod itob bytec_0 // 0x151f7c75 @@ -3168,16 +3168,16 @@ contract_execute_ied: app_global_get_ex assert // check self.status exists assert // D-ASA not configured - // modules/actus_kernel.py:1105 + // modules/actus_kernel.py:1107 // self._assert_caller_is_arranger() callsub _assert_caller_is_arranger - // modules/actus_kernel.py:1106 + // modules/actus_kernel.py:1108 // self._assert_is_not_asset_defaulted() callsub _assert_is_not_asset_defaulted - // modules/actus_kernel.py:1107 + // modules/actus_kernel.py:1109 // self._assert_is_not_asset_suspended() callsub _assert_is_not_asset_suspended - // modules/actus_kernel.py:1109 + // modules/actus_kernel.py:1111 // assert self.event_cursor < self.schedule_entry_count, err.INVALID_EVENT_CURSOR intc_0 // 0 bytec_2 // "event_cursor" @@ -3190,10 +3190,10 @@ contract_execute_ied: dig 1 > assert // Invalid event cursor - // modules/actus_kernel.py:1110 + // modules/actus_kernel.py:1112 // entry = self._get_schedule_entry(self.event_cursor) callsub _get_schedule_entry - // modules/actus_kernel.py:1111 + // modules/actus_kernel.py:1113 // assert entry.event_type == arc4.UInt8(enums.EVT_IED), err.INVALID_EVENT_TYPE dup extract 8 1 @@ -3201,39 +3201,39 @@ contract_execute_ied: pushbytes 0x01 b== assert // Invalid event type - // modules/actus_kernel.py:1115 + // modules/actus_kernel.py:1117 // event_id=entry.event_id, dig 1 extract 0 8 - // modules/actus_kernel.py:1117 + // modules/actus_kernel.py:1119 // scheduled_time=entry.scheduled_time, dig 2 extract 9 8 - // modules/actus_kernel.py:1118 + // modules/actus_kernel.py:1120 // accrual_factor=entry.accrual_factor, dig 3 extract 17 8 - // modules/actus_kernel.py:1119 + // modules/actus_kernel.py:1121 // redemption_accrual_factor=entry.redemption_accrual_factor, dig 4 extract 25 8 - // modules/actus_kernel.py:1121 + // modules/actus_kernel.py:1123 // next_nominal_interest_rate=entry.next_nominal_interest_rate, dig 5 extract 33 8 - // modules/actus_kernel.py:1122 + // modules/actus_kernel.py:1124 // next_principal_redemption=entry.next_principal_redemption, dig 6 extract 41 8 - // modules/actus_kernel.py:1123 + // modules/actus_kernel.py:1125 // next_outstanding_principal=entry.next_outstanding_principal, dig 7 extract 49 8 - // modules/actus_kernel.py:1124 + // modules/actus_kernel.py:1126 // flags=entry.flags, dig 8 extract 57 8 - // modules/actus_kernel.py:1114-1125 + // modules/actus_kernel.py:1116-1127 // typ.ObservedEventRequest( // event_id=entry.event_id, // event_type=entry.event_type, @@ -3255,10 +3255,10 @@ contract_execute_ied: concat uncover 5 concat - // modules/actus_kernel.py:1120 + // modules/actus_kernel.py:1122 // observed_rate=UInt64(0), intc_0 // 0 - // modules/actus_kernel.py:1114-1125 + // modules/actus_kernel.py:1116-1127 // typ.ObservedEventRequest( // event_id=entry.event_id, // event_type=entry.event_type, @@ -3281,7 +3281,7 @@ contract_execute_ied: concat swap concat - // modules/actus_kernel.py:1112-1126 + // modules/actus_kernel.py:1114-1128 // self._apply_non_cash_schedule_entry( // entry, // typ.ObservedEventRequest( @@ -3299,10 +3299,10 @@ contract_execute_ied: // ) callsub _apply_non_cash_schedule_entry popn 2 - // modules/actus_kernel.py:1127 + // modules/actus_kernel.py:1129 // return Global.latest_timestamp global LatestTimestamp - // modules/actus_kernel.py:1097 + // modules/actus_kernel.py:1099 // @arc4.abimethod itob bytec_0 // 0x151f7c75 @@ -3319,7 +3319,7 @@ apply_non_cash_event: dupn 4 pushbytes "" dup - // modules/actus_kernel.py:1129 + // modules/actus_kernel.py:1131 // @arc4.abimethod txna ApplicationArgs 1 dup @@ -3341,13 +3341,13 @@ apply_non_cash_event: app_global_get_ex assert // check self.status exists assert // D-ASA not configured - // modules/actus_kernel.py:1143 + // modules/actus_kernel.py:1145 // self._assert_is_not_asset_defaulted() callsub _assert_is_not_asset_defaulted - // modules/actus_kernel.py:1144 + // modules/actus_kernel.py:1146 // self._assert_is_not_asset_suspended() callsub _assert_is_not_asset_suspended - // modules/actus_kernel.py:1146 + // modules/actus_kernel.py:1148 // if payload.flags & UInt64(enums.FLAG_OBSERVED_EVENT): pushint 65 extract_uint64 @@ -3363,10 +3363,10 @@ apply_non_cash_event: assert // check self.contract_type exists pushint 5 == - // modules/actus_kernel.py:1147 + // modules/actus_kernel.py:1149 // assert self._supports_observed_events(), err.OBSERVED_EVENT_REQUIRED assert // Observed event required to execute this action - // modules/actus_kernel.py:1148 + // modules/actus_kernel.py:1150 // self._assert_caller_is_arranger() callsub _assert_caller_is_arranger // modules/actus_kernel.py:233 @@ -3378,10 +3378,10 @@ apply_non_cash_event: dup pushint 5 == - // modules/actus_kernel.py:947 + // modules/actus_kernel.py:945 // assert self._supports_observed_events(), err.OBSERVED_EVENT_REQUIRED assert // Observed event required to execute this action - // modules/actus_kernel.py:948 + // modules/actus_kernel.py:946 // assert payload.event_id == self.schedule_entry_count, err.INVALID_EVENT_ID dig 2 dup @@ -3395,19 +3395,19 @@ apply_non_cash_event: assert // check self.schedule_entry_count exists == assert // Invalid event id - // modules/actus_kernel.py:950 + // modules/actus_kernel.py:948 // self.contract_type, payload.event_type.as_uint64() dup extract 8 1 bury 12 intc_2 // 8 getbyte - // modules/actus_kernel.py:949-951 + // modules/actus_kernel.py:947-949 // self._assert_event_allowed_for_contract_type( // self.contract_type, payload.event_type.as_uint64() // ) callsub _assert_event_allowed_for_contract_type - // modules/actus_kernel.py:953 + // modules/actus_kernel.py:951 // page_index = self._schedule_page_index(self.schedule_entry_count) intc_0 // 0 bytec_3 // "schedule_entry_count" @@ -3417,11 +3417,11 @@ apply_non_cash_event: // return event_id // UInt64(cst.SCHEDULE_PAGE_SIZE) pushint 16 / - // modules/actus_kernel.py:954 + // modules/actus_kernel.py:952 // page = typ.ExecutionSchedulePage() bytec 48 // 0x0000 bury 7 - // modules/actus_kernel.py:955 + // modules/actus_kernel.py:953 // if page_index in self.schedule_page: itob bytec 24 // 0x5323 @@ -3432,7 +3432,7 @@ apply_non_cash_event: box_len bury 1 bz apply_non_cash_event_after_if_else@27 - // modules/actus_kernel.py:956 + // modules/actus_kernel.py:954 // page = self.schedule_page[page_index].copy() dig 7 box_get @@ -3441,7 +3441,7 @@ apply_non_cash_event: assert // check self.schedule_page entry exists apply_non_cash_event_after_if_else@27: - // modules/actus_kernel.py:957 + // modules/actus_kernel.py:955 // assert page.length < UInt64(cst.SCHEDULE_PAGE_SIZE), err.INVALID_SCHEDULE_PAGE dig 5 dup @@ -3451,32 +3451,32 @@ apply_non_cash_event_after_if_else@27: pushint 16 < assert // Invalid schedule page - // modules/actus_kernel.py:962 + // modules/actus_kernel.py:960 // scheduled_time=payload.scheduled_time, dig 3 dup extract 9 8 - // modules/actus_kernel.py:963 + // modules/actus_kernel.py:961 // accrual_factor=payload.accrual_factor, dig 1 extract 17 8 - // modules/actus_kernel.py:964 + // modules/actus_kernel.py:962 // redemption_accrual_factor=payload.redemption_accrual_factor, dig 2 extract 25 8 - // modules/actus_kernel.py:965 + // modules/actus_kernel.py:963 // next_nominal_interest_rate=payload.next_nominal_interest_rate, dig 3 extract 41 8 - // modules/actus_kernel.py:966 + // modules/actus_kernel.py:964 // next_principal_redemption=payload.next_principal_redemption, dig 4 extract 49 8 - // modules/actus_kernel.py:967 + // modules/actus_kernel.py:965 // next_outstanding_principal=payload.next_outstanding_principal, uncover 5 extract 57 8 - // modules/actus_kernel.py:959-969 + // modules/actus_kernel.py:957-967 // typ.ExecutionScheduleEntry( // event_id=payload.event_id, // event_type=payload.event_type, @@ -3507,7 +3507,7 @@ apply_non_cash_event_after_if_else@27: dig 3 itob concat - // modules/actus_kernel.py:958-970 + // modules/actus_kernel.py:956-968 // page.append( // typ.ExecutionScheduleEntry( // event_id=payload.event_id, @@ -3530,7 +3530,7 @@ apply_non_cash_event_after_if_else@27: itob extract 6 2 replace2 0 - // modules/actus_kernel.py:971 + // modules/actus_kernel.py:969 // self.schedule_page[page_index] = page.copy() dig 8 dup @@ -3538,7 +3538,7 @@ apply_non_cash_event_after_if_else@27: pop swap box_put - // modules/actus_kernel.py:972 + // modules/actus_kernel.py:970 // self.schedule_entry_count += UInt64(1) intc_0 // 0 bytec_3 // "schedule_entry_count" @@ -3551,7 +3551,7 @@ apply_non_cash_event_after_if_else@27: app_global_put apply_non_cash_event_after_if_else@3: - // modules/actus_kernel.py:1151 + // modules/actus_kernel.py:1153 // assert event_id == self.event_cursor, err.INVALID_EVENT_CURSOR intc_0 // 0 bytec_2 // "event_cursor" @@ -3562,12 +3562,12 @@ apply_non_cash_event_after_if_else@3: uncover 2 == assert // Invalid event cursor - // modules/actus_kernel.py:1152 + // modules/actus_kernel.py:1154 // entry = self._get_schedule_entry(event_id) callsub _get_schedule_entry dup bury 8 - // modules/actus_kernel.py:1154 + // modules/actus_kernel.py:1156 // entry.event_type.as_uint64() dup extract 8 1 @@ -3670,12 +3670,12 @@ apply_non_cash_event_bool_true@15: intc_1 // 1 apply_non_cash_event_bool_merge@17: - // modules/actus_kernel.py:1153-1155 + // modules/actus_kernel.py:1155-1157 // assert self._event_is_non_cash( // entry.event_type.as_uint64() // ), err.INVALID_EVENT_TYPE assert // Invalid event type - // modules/actus_kernel.py:1156 + // modules/actus_kernel.py:1158 // assert entry.event_type != arc4.UInt8(enums.EVT_IED), err.INVALID_EVENT_TYPE dig 8 pushbytes 0x01 @@ -3696,7 +3696,7 @@ apply_non_cash_event_bool_true@21: intc_1 // 1 apply_non_cash_event_bool_merge@23: - // modules/actus_kernel.py:1157 + // modules/actus_kernel.py:1159 // if self._event_is_rate_reset(entry.event_type.as_uint64()): bz apply_non_cash_event_else_body@5 // modules/rbac.py:80 @@ -3707,16 +3707,16 @@ apply_non_cash_event_bool_merge@23: assert // Not authorized apply_non_cash_event_after_if_else@6: - // modules/actus_kernel.py:1161 + // modules/actus_kernel.py:1163 // self._apply_non_cash_schedule_entry(entry, payload) dig 6 dig 2 callsub _apply_non_cash_schedule_entry popn 2 - // modules/actus_kernel.py:1162 + // modules/actus_kernel.py:1164 // return Global.latest_timestamp global LatestTimestamp - // modules/actus_kernel.py:1129 + // modules/actus_kernel.py:1131 // @arc4.abimethod itob bytec_0 // 0x151f7c75 @@ -3727,7 +3727,7 @@ apply_non_cash_event_after_if_else@6: return apply_non_cash_event_else_body@5: - // modules/actus_kernel.py:1160 + // modules/actus_kernel.py:1162 // self._assert_caller_is_arranger() callsub _assert_caller_is_arranger b apply_non_cash_event_after_if_else@6 @@ -3745,7 +3745,7 @@ apply_non_cash_event_bool_false@16: append_observed_cash_event: intc_0 // 0 dup - // modules/actus_kernel.py:1164 + // modules/actus_kernel.py:1166 // @arc4.abimethod txna ApplicationArgs 1 dupn 2 @@ -3760,13 +3760,13 @@ append_observed_cash_event: app_global_get_ex assert // check self.status exists assert // D-ASA not configured - // modules/actus_kernel.py:1172 + // modules/actus_kernel.py:1174 // self._assert_caller_is_arranger() callsub _assert_caller_is_arranger - // modules/actus_kernel.py:1173 + // modules/actus_kernel.py:1175 // self._assert_is_not_asset_defaulted() callsub _assert_is_not_asset_defaulted - // modules/actus_kernel.py:1174 + // modules/actus_kernel.py:1176 // self._assert_is_not_asset_suspended() callsub _assert_is_not_asset_suspended // modules/actus_kernel.py:135 @@ -3829,16 +3829,20 @@ append_observed_cash_event: // modules/actus_kernel.py:986 // if self.schedule_entry_count > UInt64(0): bz append_observed_cash_event_after_if_else@3 - // modules/actus_kernel.py:987 - // previous_entry = self._get_schedule_entry(self.schedule_entry_count - UInt64(1)) + // modules/actus_kernel.py:988 + // self.schedule_entry_count - UInt64(1) intc_0 // 0 bytec_3 // "schedule_entry_count" app_global_get_ex assert // check self.schedule_entry_count exists intc_1 // 1 - + // modules/actus_kernel.py:987-989 + // previous_entry = self._get_schedule_entry( + // self.schedule_entry_count - UInt64(1) + // ) callsub _get_schedule_entry - // modules/actus_kernel.py:989 + // modules/actus_kernel.py:991 // previous_entry.scheduled_time <= payload.scheduled_time pushint 9 extract_uint64 @@ -3846,14 +3850,14 @@ append_observed_cash_event: pushint 9 extract_uint64 <= - // modules/actus_kernel.py:988-990 + // modules/actus_kernel.py:990-992 // assert ( // previous_entry.scheduled_time <= payload.scheduled_time // ), err.INVALID_SORTING assert // Time events must be sorted in strictly ascending order append_observed_cash_event_after_if_else@3: - // modules/actus_kernel.py:992 + // modules/actus_kernel.py:994 // page_index = self._schedule_page_index(self.schedule_entry_count) intc_0 // 0 bytec_3 // "schedule_entry_count" @@ -3863,11 +3867,11 @@ append_observed_cash_event_after_if_else@3: // return event_id // UInt64(cst.SCHEDULE_PAGE_SIZE) pushint 16 / - // modules/actus_kernel.py:993 + // modules/actus_kernel.py:995 // page = typ.ExecutionSchedulePage() bytec 48 // 0x0000 bury 6 - // modules/actus_kernel.py:994 + // modules/actus_kernel.py:996 // if page_index in self.schedule_page: itob bytec 24 // 0x5323 @@ -3878,7 +3882,7 @@ append_observed_cash_event_after_if_else@3: box_len bury 1 bz append_observed_cash_event_after_if_else@5 - // modules/actus_kernel.py:995 + // modules/actus_kernel.py:997 // page = self.schedule_page[page_index].copy() dig 5 box_get @@ -3887,7 +3891,7 @@ append_observed_cash_event_after_if_else@3: assert // check self.schedule_page entry exists append_observed_cash_event_after_if_else@5: - // modules/actus_kernel.py:996 + // modules/actus_kernel.py:998 // assert page.length < UInt64(cst.SCHEDULE_PAGE_SIZE), err.INVALID_SCHEDULE_PAGE dig 4 dup @@ -3897,32 +3901,32 @@ append_observed_cash_event_after_if_else@5: pushint 16 < assert // Invalid schedule page - // modules/actus_kernel.py:1001 + // modules/actus_kernel.py:1003 // scheduled_time=payload.scheduled_time, dig 5 dup extract 9 8 - // modules/actus_kernel.py:1002 + // modules/actus_kernel.py:1004 // accrual_factor=payload.accrual_factor, dig 1 extract 17 8 - // modules/actus_kernel.py:1003 + // modules/actus_kernel.py:1005 // redemption_accrual_factor=payload.redemption_accrual_factor, dig 2 extract 25 8 - // modules/actus_kernel.py:1004 + // modules/actus_kernel.py:1006 // next_nominal_interest_rate=payload.next_nominal_interest_rate, dig 3 extract 33 8 - // modules/actus_kernel.py:1005 + // modules/actus_kernel.py:1007 // next_principal_redemption=payload.next_principal_redemption, dig 4 extract 41 8 - // modules/actus_kernel.py:1006 + // modules/actus_kernel.py:1008 // next_outstanding_principal=payload.next_outstanding_principal, uncover 5 extract 49 8 - // modules/actus_kernel.py:998-1008 + // modules/actus_kernel.py:1000-1010 // typ.ExecutionScheduleEntry( // event_id=payload.event_id, // event_type=payload.event_type, @@ -3953,7 +3957,7 @@ append_observed_cash_event_after_if_else@5: dig 3 itob concat - // modules/actus_kernel.py:997-1009 + // modules/actus_kernel.py:999-1011 // page.append( // typ.ExecutionScheduleEntry( // event_id=payload.event_id, @@ -3976,7 +3980,7 @@ append_observed_cash_event_after_if_else@5: itob extract 6 2 replace2 0 - // modules/actus_kernel.py:1010 + // modules/actus_kernel.py:1012 // self.schedule_page[page_index] = page.copy() dig 6 dup @@ -3984,7 +3988,7 @@ append_observed_cash_event_after_if_else@5: pop swap box_put - // modules/actus_kernel.py:1011 + // modules/actus_kernel.py:1013 // self.schedule_entry_count += UInt64(1) intc_0 // 0 bytec_3 // "schedule_entry_count" @@ -3995,10 +3999,10 @@ append_observed_cash_event_after_if_else@5: bytec_3 // "schedule_entry_count" swap app_global_put - // modules/actus_kernel.py:1178 + // modules/actus_kernel.py:1180 // return Global.latest_timestamp global LatestTimestamp - // modules/actus_kernel.py:1164 + // modules/actus_kernel.py:1166 // @arc4.abimethod itob bytec_0 // 0x151f7c75 @@ -4019,7 +4023,7 @@ contract_get_state: assert // check self.status exists dup assert // D-ASA not configured - // modules/actus_kernel.py:1185 + // modules/actus_kernel.py:1187 // contract_type=arc4.UInt8(self.contract_type), intc_0 // 0 bytec 10 // "contract_type" @@ -4032,85 +4036,85 @@ contract_get_state: <= assert // overflow extract 7 1 - // modules/actus_kernel.py:1187 + // modules/actus_kernel.py:1189 // total_units=self.total_units, intc_0 // 0 bytec 13 // "total_units" app_global_get_ex assert // check self.total_units exists - // modules/actus_kernel.py:1188 + // modules/actus_kernel.py:1190 // reserved_units_total=self.reserved_units_total, intc_0 // 0 bytec 11 // "reserved_units_total" app_global_get_ex assert // check self.reserved_units_total exists - // modules/actus_kernel.py:1189 + // modules/actus_kernel.py:1191 // initial_exchange_amount=self.initial_exchange_amount, intc_0 // 0 bytec 20 // "initial_exchange_amount" app_global_get_ex assert // check self.initial_exchange_amount exists - // modules/actus_kernel.py:1190 + // modules/actus_kernel.py:1192 // event_cursor=self.event_cursor, intc_0 // 0 bytec_2 // "event_cursor" app_global_get_ex assert // check self.event_cursor exists - // modules/actus_kernel.py:1191 + // modules/actus_kernel.py:1193 // schedule_entry_count=self.schedule_entry_count, intc_0 // 0 bytec_3 // "schedule_entry_count" app_global_get_ex assert // check self.schedule_entry_count exists - // modules/actus_kernel.py:1192 + // modules/actus_kernel.py:1194 // outstanding_principal=self.outstanding_principal, intc_0 // 0 bytec 4 // "outstanding_principal" app_global_get_ex assert // check self.outstanding_principal exists - // modules/actus_kernel.py:1193 + // modules/actus_kernel.py:1195 // interest_calculation_base=self.interest_calculation_base, intc_0 // 0 bytec 7 // "interest_calculation_base" app_global_get_ex assert // check self.interest_calculation_base exists - // modules/actus_kernel.py:1194 + // modules/actus_kernel.py:1196 // nominal_interest_rate=self.nominal_interest_rate, intc_0 // 0 bytec 9 // "nominal_interest_rate" app_global_get_ex assert // check self.nominal_interest_rate exists - // modules/actus_kernel.py:1195 + // modules/actus_kernel.py:1197 // accrued_interest=self.accrued_interest, intc_0 // 0 bytec 6 // "accrued_interest" app_global_get_ex assert // check self.accrued_interest exists - // modules/actus_kernel.py:1196 + // modules/actus_kernel.py:1198 // cumulative_interest_index=self.cumulative_interest_index, intc_0 // 0 bytec 16 // "cumulative_interest_index" app_global_get_ex assert // check self.cumulative_interest_index exists - // modules/actus_kernel.py:1197 + // modules/actus_kernel.py:1199 // cumulative_principal_index=self.cumulative_principal_index, intc_0 // 0 bytec 17 // "cumulative_principal_index" app_global_get_ex assert // check self.cumulative_principal_index exists - // modules/actus_kernel.py:1198 + // modules/actus_kernel.py:1200 // reserved_interest=self.reserved_interest, intc_0 // 0 bytec 15 // "reserved_interest" app_global_get_ex assert // check self.reserved_interest exists - // modules/actus_kernel.py:1199 + // modules/actus_kernel.py:1201 // reserved_principal=self.reserved_principal, intc_0 // 0 bytec 12 // "reserved_principal" app_global_get_ex assert // check self.reserved_principal exists - // modules/actus_kernel.py:1184-1200 + // modules/actus_kernel.py:1186-1202 // return typ.KernelState( // contract_type=arc4.UInt8(self.contract_type), // status=self.status, @@ -4172,7 +4176,7 @@ contract_get_state: swap itob concat - // modules/actus_kernel.py:1180 + // modules/actus_kernel.py:1182 // @arc4.abimethod(readonly=True) bytec_0 // 0x151f7c75 swap @@ -4191,7 +4195,7 @@ contract_get_next_due_event: app_global_get_ex assert // check self.status exists assert // D-ASA not configured - // modules/actus_kernel.py:1206 + // modules/actus_kernel.py:1208 // if self.event_cursor >= self.schedule_entry_count: intc_0 // 0 bytec_2 // "event_cursor" @@ -4203,13 +4207,13 @@ contract_get_next_due_event: assert // check self.schedule_entry_count exists >= bz contract_get_next_due_event_after_if_else@3 - // modules/actus_kernel.py:1208 + // modules/actus_kernel.py:1210 // event_id=self.event_cursor, intc_0 // 0 bytec_2 // "event_cursor" app_global_get_ex assert // check self.event_cursor exists - // modules/actus_kernel.py:1207-1217 + // modules/actus_kernel.py:1209-1219 // return typ.ExecutionScheduleEntry( // event_id=self.event_cursor, // event_type=arc4.UInt8(0), @@ -4222,10 +4226,10 @@ contract_get_next_due_event: // flags=UInt64(0), // ) itob - // modules/actus_kernel.py:1209 + // modules/actus_kernel.py:1211 // event_type=arc4.UInt8(0), bytec 40 // 0x00 - // modules/actus_kernel.py:1207-1217 + // modules/actus_kernel.py:1209-1219 // return typ.ExecutionScheduleEntry( // event_id=self.event_cursor, // event_type=arc4.UInt8(0), @@ -4238,10 +4242,10 @@ contract_get_next_due_event: // flags=UInt64(0), // ) concat - // modules/actus_kernel.py:1210 + // modules/actus_kernel.py:1212 // scheduled_time=UInt64(0), intc_0 // 0 - // modules/actus_kernel.py:1207-1217 + // modules/actus_kernel.py:1209-1219 // return typ.ExecutionScheduleEntry( // event_id=self.event_cursor, // event_type=arc4.UInt8(0), @@ -4271,7 +4275,7 @@ contract_get_next_due_event: concat contract_get_next_due_event_after_inlined_modules.actus_kernel.ActusKernelModule.contract_get_next_due_event@4: - // modules/actus_kernel.py:1202 + // modules/actus_kernel.py:1204 // @arc4.abimethod(readonly=True) bytec_0 // 0x151f7c75 swap @@ -4281,14 +4285,14 @@ contract_get_next_due_event_after_inlined_modules.actus_kernel.ActusKernelModule return contract_get_next_due_event_after_if_else@3: - // modules/actus_kernel.py:1218 + // modules/actus_kernel.py:1220 // return self._get_schedule_entry(self.event_cursor) intc_0 // 0 bytec_2 // "event_cursor" app_global_get_ex assert // check self.event_cursor exists callsub _get_schedule_entry - // modules/actus_kernel.py:1202 + // modules/actus_kernel.py:1204 // @arc4.abimethod(readonly=True) b contract_get_next_due_event_after_inlined_modules.actus_kernel.ActusKernelModule.contract_get_next_due_event@4 @@ -6208,7 +6212,7 @@ _apply_non_cash_schedule_entry_after_if_else@6: assert // check self.rate_reset_spread exists + frame_bury 6 - // modules/actus_kernel.py:743 + // modules/actus_kernel.py:741 // if self.has_rate_reset_floor and rate < self.rate_reset_floor: intc_0 // 0 bytec 38 // "has_rate_reset_floor" @@ -6222,7 +6226,7 @@ _apply_non_cash_schedule_entry_after_if_else@6: frame_dig 6 > bz _apply_non_cash_schedule_entry_after_if_else@55 - // modules/actus_kernel.py:744 + // modules/actus_kernel.py:742 // rate = self.rate_reset_floor intc_0 // 0 bytec 30 // "rate_reset_floor" @@ -6232,7 +6236,7 @@ _apply_non_cash_schedule_entry_after_if_else@6: assert // check self.rate_reset_floor exists _apply_non_cash_schedule_entry_after_if_else@55: - // modules/actus_kernel.py:745 + // modules/actus_kernel.py:743 // if self.has_rate_reset_cap and rate > self.rate_reset_cap: intc_0 // 0 bytec 39 // "has_rate_reset_cap" @@ -6246,7 +6250,7 @@ _apply_non_cash_schedule_entry_after_if_else@55: frame_dig 6 < bz _apply_non_cash_schedule_entry_after_if_else@58 - // modules/actus_kernel.py:746 + // modules/actus_kernel.py:744 // rate = self.rate_reset_cap intc_0 // 0 bytec 31 // "rate_reset_cap" @@ -6298,8 +6302,8 @@ _apply_non_cash_schedule_entry_after_if_else@23: pushint 5 == bz _apply_non_cash_schedule_entry_after_if_else@30 - // modules/actus_kernel.py:684 - // self.schedule_entry_count - self.event_cursor + // modules/actus_kernel.py:683 + // + (self.schedule_entry_count - self.event_cursor) intc_0 // 0 bytec_3 // "schedule_entry_count" app_global_get_ex @@ -6309,32 +6313,26 @@ _apply_non_cash_schedule_entry_after_if_else@23: app_global_get_ex assert // check self.event_cursor exists - - // modules/actus_kernel.py:686 + // modules/actus_kernel.py:684 // * UInt64(cst.OP_UP_NON_CASH_PER_ENTRY_BUDGET) pushint 100 - // modules/actus_kernel.py:683-686 - // + ( - // self.schedule_entry_count - self.event_cursor - // ) + // modules/actus_kernel.py:683-684 + // + (self.schedule_entry_count - self.event_cursor) // * UInt64(cst.OP_UP_NON_CASH_PER_ENTRY_BUDGET) * // modules/actus_kernel.py:682 // UInt64(cst.OP_UP_NON_CASH_BASE_BUDGET) intc 4 // 1500 - // modules/actus_kernel.py:682-686 + // modules/actus_kernel.py:682-684 // UInt64(cst.OP_UP_NON_CASH_BASE_BUDGET) - // + ( - // self.schedule_entry_count - self.event_cursor - // ) + // + (self.schedule_entry_count - self.event_cursor) // * UInt64(cst.OP_UP_NON_CASH_PER_ENTRY_BUDGET) + - // modules/actus_kernel.py:680-688 + // modules/actus_kernel.py:680-686 // ensure_budget( // required_budget=( // UInt64(cst.OP_UP_NON_CASH_BASE_BUDGET) - // + ( - // self.schedule_entry_count - self.event_cursor - // ) + // + (self.schedule_entry_count - self.event_cursor) // * UInt64(cst.OP_UP_NON_CASH_PER_ENTRY_BUDGET) // ), // ) @@ -6540,10 +6538,10 @@ _apply_non_cash_schedule_entry_after_if_else@50: // ) frame_dig 1 callsub _scaled_mul_div - // modules/actus_kernel.py:689 + // modules/actus_kernel.py:687 // self.next_principal_redemption = self._recalculate_annuity_payment( bytec 14 // "next_principal_redemption" - // modules/actus_kernel.py:689-691 + // modules/actus_kernel.py:687-689 // self.next_principal_redemption = self._recalculate_annuity_payment( // entry // ) @@ -6551,7 +6549,7 @@ _apply_non_cash_schedule_entry_after_if_else@50: app_global_put _apply_non_cash_schedule_entry_after_if_else@30: - // modules/actus_kernel.py:694 + // modules/actus_kernel.py:692 // self.event_cursor += UInt64(1) intc_0 // 0 bytec_2 // "event_cursor" @@ -6562,20 +6560,20 @@ _apply_non_cash_schedule_entry_after_if_else@30: bytec_2 // "event_cursor" swap app_global_put - // modules/actus_kernel.py:695-699 + // modules/actus_kernel.py:693-697 // self._emit_execution_event( // entry=entry, // payoff=UInt64(0), // settled_amount=UInt64(0), // ) frame_dig -2 - // modules/actus_kernel.py:697 + // modules/actus_kernel.py:695 // payoff=UInt64(0), intc_0 // 0 - // modules/actus_kernel.py:698 + // modules/actus_kernel.py:696 // settled_amount=UInt64(0), dup - // modules/actus_kernel.py:695-699 + // modules/actus_kernel.py:693-697 // self._emit_execution_event( // entry=entry, // payoff=UInt64(0), @@ -6590,7 +6588,7 @@ _apply_non_cash_schedule_entry_after_if_else@30: retsub _apply_non_cash_schedule_entry_else_body@29: - // modules/actus_kernel.py:693 + // modules/actus_kernel.py:691 // self.next_principal_redemption = entry.next_principal_redemption frame_dig -2 pushint 41 @@ -6672,7 +6670,7 @@ _apply_non_cash_schedule_entry_else_body@14: // modules.actus_kernel.ActusKernelModule._emit_execution_event(entry: bytes, payoff: uint64, settled_amount: uint64) -> bytes: _emit_execution_event: - // modules/actus_kernel.py:705-711 + // modules/actus_kernel.py:703-709 // def _emit_execution_event( // self, // *, @@ -6681,44 +6679,44 @@ _emit_execution_event: // settled_amount: UInt64, // ) -> None: proto 3 1 - // modules/actus_kernel.py:715 + // modules/actus_kernel.py:713 // contract_id=Global.current_application_id.id, global CurrentApplicationID - // modules/actus_kernel.py:716 + // modules/actus_kernel.py:714 // event_id=entry.event_id, frame_dig -3 intc_0 // 0 extract_uint64 - // modules/actus_kernel.py:717 + // modules/actus_kernel.py:715 // event_type=entry.event_type, frame_dig -3 extract 8 1 - // modules/actus_kernel.py:718 + // modules/actus_kernel.py:716 // scheduled_time=entry.scheduled_time, frame_dig -3 extract 9 8 - // modules/actus_kernel.py:719 + // modules/actus_kernel.py:717 // applied_at=Global.latest_timestamp, global LatestTimestamp - // modules/actus_kernel.py:722 + // modules/actus_kernel.py:720 // self._payoff_sign(entry.event_type.as_uint64(), payoff) frame_dig -3 - // modules/actus_kernel.py:717 + // modules/actus_kernel.py:715 // event_type=entry.event_type, intc_2 // 8 - // modules/actus_kernel.py:722 + // modules/actus_kernel.py:720 // self._payoff_sign(entry.event_type.as_uint64(), payoff) getbyte - // modules/actus_kernel.py:751 + // modules/actus_kernel.py:749 // if payoff == UInt64(0): frame_dig -2 bnz _emit_execution_event_after_if_else@3 - // modules/actus_kernel.py:752 + // modules/actus_kernel.py:750 // return UInt64(enums.PAYOFF_SIGN_POSITIVE) intc_1 // 1 _emit_execution_event_after_inlined_modules.actus_kernel.ActusKernelModule._payoff_sign@7: - // modules/actus_kernel.py:721-723 + // modules/actus_kernel.py:719-721 // payoff_sign=arc4.UInt8( // self._payoff_sign(entry.event_type.as_uint64(), payoff) // ), @@ -6729,19 +6727,19 @@ _emit_execution_event_after_inlined_modules.actus_kernel.ActusKernelModule._payo <= assert // overflow extract 7 1 - // modules/actus_kernel.py:725 + // modules/actus_kernel.py:723 // currency_id=self.settlement_asset_id, intc_0 // 0 bytec 19 // "settlement_asset_id" app_global_get_ex assert // check self.settlement_asset_id exists - // modules/actus_kernel.py:726 + // modules/actus_kernel.py:724 // sequence=entry.event_id + UInt64(1), frame_dig 1 dup intc_1 // 1 + - // modules/actus_kernel.py:714-727 + // modules/actus_kernel.py:712-725 // ExecutionEvent( // contract_id=Global.current_application_id.id, // event_id=entry.event_id, @@ -6782,7 +6780,7 @@ _emit_execution_event_after_inlined_modules.actus_kernel.ActusKernelModule._payo swap itob concat - // modules/actus_kernel.py:713-728 + // modules/actus_kernel.py:711-726 // arc4.emit( // ExecutionEvent( // contract_id=Global.current_application_id.id, @@ -6808,7 +6806,7 @@ _emit_execution_event_after_inlined_modules.actus_kernel.ActusKernelModule._payo retsub _emit_execution_event_after_if_else@3: - // modules/actus_kernel.py:753 + // modules/actus_kernel.py:751 // if event_type in (UInt64(enums.EVT_IED), UInt64(enums.EVT_PI)): frame_dig 5 intc_1 // 1 @@ -6820,18 +6818,18 @@ _emit_execution_event_after_if_else@3: bz _emit_execution_event_after_if_else@6 _emit_execution_event_if_body@5: - // modules/actus_kernel.py:754 + // modules/actus_kernel.py:752 // return UInt64(enums.PAYOFF_SIGN_POSITIVE) intc_1 // 1 - // modules/actus_kernel.py:722 + // modules/actus_kernel.py:720 // self._payoff_sign(entry.event_type.as_uint64(), payoff) b _emit_execution_event_after_inlined_modules.actus_kernel.ActusKernelModule._payoff_sign@7 _emit_execution_event_after_if_else@6: - // modules/actus_kernel.py:755 + // modules/actus_kernel.py:753 // return UInt64(enums.PAYOFF_SIGN_NEGATIVE) pushint 255 - // modules/actus_kernel.py:722 + // modules/actus_kernel.py:720 // self._payoff_sign(entry.event_type.as_uint64(), payoff) b _emit_execution_event_after_inlined_modules.actus_kernel.ActusKernelModule._payoff_sign@7 diff --git a/smart_contracts/artifacts/d_asa/DASA.arc56.json b/smart_contracts/artifacts/d_asa/DASA.arc56.json index c02b060e..de17538f 100644 --- a/smart_contracts/artifacts/d_asa/DASA.arc56.json +++ b/smart_contracts/artifacts/d_asa/DASA.arc56.json @@ -2288,7 +2288,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCAzMiAxNTAwCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUgInN0YXR1cyIgImV2ZW50X2N1cnNvciIgInNjaGVkdWxlX2VudHJ5X2NvdW50IiAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIiAiZml4ZWRfcG9pbnRfc2NhbGUiICJhY2NydWVkX2ludGVyZXN0IiAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIgMHg1MjIzNDE2MzYzNmY3NTZlNzQyMyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIiAiY29udHJhY3RfdHlwZSIgInJlc2VydmVkX3VuaXRzX3RvdGFsIiAicmVzZXJ2ZWRfcHJpbmNpcGFsIiAidG90YWxfdW5pdHMiICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIiAicmVzZXJ2ZWRfaW50ZXJlc3QiICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IiAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiIDB4NTIyMzQxNzI3MjYxNmU2NzY1NzIyMyAic2V0dGxlbWVudF9hc3NldF9pZCIgImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IiAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzIDB4NTIyMzQxNjM2MzZmNzU2ZTc0NGQ2MTZlNjE2NzY1NzIyMyAweDUzMjMgMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzIDB4NTIyMzRmNzA0NDYxNjU2ZDZmNmUyMyAiaW5pdGlhbF9leGNoYW5nZV9kYXRlIiAidHJhbnNmZXJfb3BlbmluZ19kYXRlIiAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIiAicmF0ZV9yZXNldF9mbG9vciIgInJhdGVfcmVzZXRfY2FwIiAweDUyMjM1NDcyNzU3Mzc0NjU2NTIzICJhc3NldF9zdXNwZW5kZWQiICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIiAicmF0ZV9yZXNldF9zcHJlYWQiICJyYXRlX3Jlc2V0X211bHRpcGxpZXIiICJyYXRlX3Jlc2V0X25leHQiICJoYXNfcmF0ZV9yZXNldF9mbG9vciIgImhhc19yYXRlX3Jlc2V0X2NhcCIgMHgwMCAiYXNzZXRfZGVmYXVsdGVkIiAicHJvc3BlY3R1c19oYXNoIiAicHJvc3BlY3R1c191cmwiICJkZW5vbWluYXRpb25fYXNzZXRfaWQiICJtYXR1cml0eV9kYXRlIiAiZGF5X2NvdW50X2NvbnZlbnRpb24iIDB4MDY4MTAxIDB4MDAwMAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4LTI5CiAgICAvLyAjIFJCQUMgUm9sZXMKICAgIC8vIHNlbGYuYXJyYW5nZXIgPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX0FSUkFOR0VSKQogICAgYnl0ZWMgMTggLy8gMHg1MjIzNDE3MjcyNjE2ZTY3NjU3MjIzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzAKICAgIC8vIHNlbGYub3BfZGFlbW9uID0gR2xvYmFsU3RhdGUoQWNjb3VudCgpLCBrZXk9Y3N0LlBSRUZJWF9JRF9PUF9EQUVNT04pCiAgICBieXRlYyAyNiAvLyAweDUyMjM0ZjcwNDQ2MTY1NmQ2ZjZlMjMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo0Ny00OAogICAgLy8gIyBELUFTQSBHb3Zlcm5hbmNlCiAgICAvLyBzZWxmLmFzc2V0X3N1c3BlbmRlZCA9IEZhbHNlCiAgICBieXRlYyAzMyAvLyAiYXNzZXRfc3VzcGVuZGVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NDkKICAgIC8vIHNlbGYuYXNzZXRfZGVmYXVsdGVkID0gRmFsc2UKICAgIGJ5dGVjIDQxIC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU2LTU3CiAgICAvLyAjIENvbnRyYWN0CiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwLTYxCiAgICAvLyAjIFByb3NwZWN0dXMgKEluZm9ybWF0aW9uYWwpCiAgICAvLyBzZWxmLnByb3NwZWN0dXNfaGFzaCA9IEJ5dGVzKCkKICAgIGJ5dGVjIDQyIC8vICJwcm9zcGVjdHVzX2hhc2giCiAgICBwdXNoYnl0ZXMgMHgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MgogICAgLy8gc2VsZi5wcm9zcGVjdHVzX3VybCA9IFN0cmluZygpCiAgICBieXRlYyA0MyAvLyAicHJvc3BlY3R1c191cmwiCiAgICBwdXNoYnl0ZXMgIiIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NC02NQogICAgLy8gIyBEZW5vbWluYXRpb24KICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gQXNzZXQoKQogICAgYnl0ZWMgNDQgLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjYKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCA9IEFzc2V0KCkKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OC02OQogICAgLy8gIyBUaW1lCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgMjcgLy8gImluaXRpYWxfZXhjaGFuZ2VfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzAKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgNDUgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxCiAgICAvLyBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgMjggLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIKICAgIC8vIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlID0gdHlwLlRpbWVTdGFtcCgpCiAgICBieXRlYyAyOSAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NC03NQogICAgLy8gIyBEYXkgQ291bnQgQ29udmVudGlvbgogICAgLy8gc2VsZi5kYXlfY291bnRfY29udmVudGlvbiA9IFVJbnQ2NCgpCiAgICBieXRlYyA0NiAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc3LTc4CiAgICAvLyAjIFVuaXRzCiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzID0gVUludDY0KCkKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPSBVSW50NjQoKQogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MS04MgogICAgLy8gIyBQcmluY2lwYWwKICAgIC8vIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPSBVSW50NjQoKQogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MwogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBVSW50NjQoKQogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NAogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gVUludDY0KCkKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NQogICAgLy8gc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gRmFsc2UKICAgIGJ5dGVjIDM0IC8vICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4Ny04OAogICAgLy8gIyBJbnRlcmVzdAogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gVUludDY0KCkKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg5CiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgPSBVSW50NjQoKQogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTEtOTIKICAgIC8vICMgSW50ZXJlc3QgUmF0ZXMKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTMKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQgPSBVSW50NjQoKQogICAgYnl0ZWMgMzUgLy8gInJhdGVfcmVzZXRfc3ByZWFkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NAogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIgPSBVSW50NjQoKQogICAgYnl0ZWMgMzYgLy8gInJhdGVfcmVzZXRfbXVsdGlwbGllciIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTUKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9mbG9vciA9IFVJbnQ2NCgpCiAgICBieXRlYyAzMCAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTYKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9jYXAgPSBVSW50NjQoKQogICAgYnl0ZWMgMzEgLy8gInJhdGVfcmVzZXRfY2FwIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NwogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X25leHQgPSBVSW50NjQoKQogICAgYnl0ZWMgMzcgLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTgKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgPSBGYWxzZQogICAgYnl0ZWMgMzggLy8gImhhc19yYXRlX3Jlc2V0X2Zsb29yIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OQogICAgLy8gc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgPSBGYWxzZQogICAgYnl0ZWMgMzkgLy8gImhhc19yYXRlX3Jlc2V0X2NhcCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAxLTEwMgogICAgLy8gIyBQcmltYXJ5IERpc3RyaWJ1dGlvbgogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgPSBVSW50NjQoKQogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAzCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0ID0gVUludDY0KCkKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA1LTEwNgogICAgLy8gIyBDdW11bGF0aXZlIFBlci1Vbml0IEZpeGVkLVBvaW50IEluZGV4ZXMKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4ID0gVUludDY0KCkKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1CiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciA9IFVJbnQ2NCgpCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNgogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA9IFVJbnQ2NCgpCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE4LTExOQogICAgLy8gIyBTY2FsaW5nCiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlID0gVUludDY0KCkKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6MjMKICAgIC8vIGFzc2VydCBUeG4uZ2xvYmFsX251bV9ieXRlX3NsaWNlID09IGNmZy5HTE9CQUxfQllURVMsIGVyci5XUk9OR19HTE9CQUxfQllURVMKICAgIHR4biBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgQnl0ZXMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjI0CiAgICAvLyBhc3NlcnQgVHhuLmdsb2JhbF9udW1fdWludCA9PSBjZmcuR0xPQkFMX1VJTlRTLCBlcnIuV1JPTkdfR0xPQkFMX1VJTlRTCiAgICB0eG4gR2xvYmFsTnVtVWludAogICAgcHVzaGludCAzNwogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgVUludHMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBhc3NlcnQgVHhuLmxvY2FsX251bV9ieXRlX3NsaWNlID09IGNmZy5MT0NBTF9CWVRFUywgZXJyLldST05HX0xPQ0FMX0JZVEVTCiAgICB0eG4gTG9jYWxOdW1CeXRlU2xpY2UKICAgICEKICAgIGFzc2VydCAvLyBXcm9uZyBMb2NhbCBCeXRlcyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6MjYKICAgIC8vIGFzc2VydCBUeG4ubG9jYWxfbnVtX3VpbnQgPT0gY2ZnLkxPQ0FMX1VJTlRTLCBlcnIuV1JPTkdfTE9DQUxfVUlOVFMKICAgIHR4biBMb2NhbE51bVVpbnQKICAgICEKICAgIGFzc2VydCAvLyBXcm9uZyBMb2NhbCBVSW50cyBhbGxvY2F0aW9uCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kX2FzYS9jb250cmFjdC5weTo4LTE4CiAgICAvLyBjbGFzcyBEQVNBKAogICAgLy8gICAgIFBheW1lbnRBZ2VudCwKICAgIC8vICAgICBUcmFuc2ZlckFnZW50LAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gICAgIGF2bV92ZXJzaW9uPTEyLAogICAgLy8gKToKICAgIHB1c2hieXRlcyAweDkxNGYwNGViIC8vIG1ldGhvZCAiY29udHJhY3RfdXBkYXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9jb250cmFjdF91cGRhdGVfcm91dGVANAoKbWFpbl9zd2l0Y2hfY2FzZV9uZXh0QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6OC0xOAogICAgLy8gY2xhc3MgREFTQSgKICAgIC8vICAgICBQYXltZW50QWdlbnQsCiAgICAvLyAgICAgVHJhbnNmZXJBZ2VudCwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBhdm1fdmVyc2lvbj0xMiwKICAgIC8vICk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBieiBtYWluX2NyZWF0ZV9Ob09wQDMyCiAgICBwdXNoYnl0ZXNzIDB4YjQ0NjE4YzggMHhlNzgzMjUyOSAweDk0Mzg4NzIzIDB4NmM4NWUzZWUgMHhiZGQxYTk0NCAweDdjMGYxODEyIDB4MTRmYzEwZWYgMHg3NGE3Mjk3ZiAweDA5ZDRmZTE0IDB4OWE5YmZhODUgMHg4NWVlZDMzZCAweGFiMmMwZmM0IDB4ZDlmMjI1YWMgMHg5ODgzNTA1YSAweDhlYTZlNzRjIDB4MDJhZjU1N2EgMHg4MmY3MWIyZCAweGVmMDRmNWQzIDB4ZGYzNDM1NTAgMHgzZGJlODBiZCAweDFlM2U0OGU3IDB4MDEwYzgyOTkgMHg3NDA2YWNkMiAweDFhNzJhMmVlIC8vIG1ldGhvZCAiZnVuZF9kdWVfY2FzaGZsb3dzKHVpbnQ2NCkodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImNsYWltX2R1ZV9jYXNoZmxvd3MoYWRkcmVzcyxieXRlW10pKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxieXRlW10pIiwgbWV0aG9kICJ0cmFuc2Zlcl9zZXRfc2NoZWR1bGUodWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInByaW1hcnlfZGlzdHJpYnV0aW9uKGFkZHJlc3MsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidHJhbnNmZXIoYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgImFjY291bnRfc3VzcGVuc2lvbihhZGRyZXNzLGJvb2wpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X29wZW4oYWRkcmVzcyxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAiYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzKGFkZHJlc3MsYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgImFjY291bnRfZ2V0X3Bvc2l0aW9uKGFkZHJlc3MpKGFkZHJlc3MsdWludDY0LHVpbnQ2NCxib29sLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJjb250cmFjdF9jb25maWcoKHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LGJvb2wsYm9vbCxib29sLHVpbnQ2NCksKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSwoYnl0ZVszMl0sc3RyaW5nKSl1aW50NjQiLCBtZXRob2QgImNvbnRyYWN0X3NjaGVkdWxlKHVpbnQ2NCxib29sLCh1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KVtdKXVpbnQ2NCIsIG1ldGhvZCAiY29udHJhY3RfZXhlY3V0ZV9pZWQoKXVpbnQ2NCIsIG1ldGhvZCAiYXBwbHlfbm9uX2Nhc2hfZXZlbnQodWludDY0LCh1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkpdWludDY0IiwgbWV0aG9kICJhcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudCgodWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkpdWludDY0IiwgbWV0aG9kICJjb250cmFjdF9nZXRfc3RhdGUoKSh1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAiY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50KCkodWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgInJiYWNfcm90YXRlX2FycmFuZ2VyKGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX3NldF9vcF9kYWVtb24oYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgInJiYWNfYXNzaWduX3JvbGUodWludDgsYWRkcmVzcywodWludDY0LHVpbnQ2NCkpdWludDY0IiwgbWV0aG9kICJyYmFjX3Jldm9rZV9yb2xlKHVpbnQ4LGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX2NvbnRyYWN0X3N1c3BlbnNpb24oYm9vbCl1aW50NjQiLCBtZXRob2QgInJiYWNfZ2V0X2FycmFuZ2VyKClhZGRyZXNzIiwgbWV0aG9kICJyYmFjX2dldF9hZGRyZXNzX3JvbGVzKGFkZHJlc3MpKGJvb2wsYm9vbCxib29sLGJvb2wsYm9vbCkiLCBtZXRob2QgInJiYWNfZ2V0X3JvbGVfdmFsaWRpdHkodWludDgsYWRkcmVzcykodWludDY0LHVpbnQ2NCkiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBmdW5kX2R1ZV9jYXNoZmxvd3MgY2xhaW1fZHVlX2Nhc2hmbG93cyB0cmFuc2Zlcl9zZXRfc2NoZWR1bGUgcHJpbWFyeV9kaXN0cmlidXRpb24gdHJhbnNmZXIgYWNjb3VudF9zdXNwZW5zaW9uIGFjY291bnRfb3BlbiBhY2NvdW50X3VwZGF0ZV9wYXltZW50X2FkZHJlc3MgYWNjb3VudF9nZXRfcG9zaXRpb24gY29udHJhY3RfY29uZmlnIGNvbnRyYWN0X3NjaGVkdWxlIGNvbnRyYWN0X2V4ZWN1dGVfaWVkIGFwcGx5X25vbl9jYXNoX2V2ZW50IGFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50IGNvbnRyYWN0X2dldF9zdGF0ZSBjb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnQgcmJhY19yb3RhdGVfYXJyYW5nZXIgcmJhY19zZXRfb3BfZGFlbW9uIHJiYWNfYXNzaWduX3JvbGUgcmJhY19yZXZva2Vfcm9sZSByYmFjX2NvbnRyYWN0X3N1c3BlbnNpb24gcmJhY19nZXRfYXJyYW5nZXIgcmJhY19nZXRfYWRkcmVzc19yb2xlcyByYmFjX2dldF9yb2xlX3ZhbGlkaXR5CiAgICBlcnIKCm1haW5fY3JlYXRlX05vT3BAMzI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6OC0xOAogICAgLy8gY2xhc3MgREFTQSgKICAgIC8vICAgICBQYXltZW50QWdlbnQsCiAgICAvLyAgICAgVHJhbnNmZXJBZ2VudCwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBhdm1fdmVyc2lvbj0xMiwKICAgIC8vICk6CiAgICBwdXNoYnl0ZXMgMHg5NTZkNzE1NiAvLyBtZXRob2QgImNvbnRyYWN0X2NyZWF0ZShhZGRyZXNzKXVpbnQ2NCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIGNvbnRyYWN0X2NyZWF0ZQogICAgZXJyCgptYWluX2NvbnRyYWN0X3VwZGF0ZV9yb3V0ZUA0OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgcHVzaGludCA0IC8vIFVwZGF0ZUFwcGxpY2F0aW9uCiAgICA9PQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICYmCiAgICBhc3NlcnQKICAgIGIgY29udHJhY3RfdXBkYXRlCgoKLy8gX3B1eWFfbGliLnV0aWwuZW5zdXJlX2J1ZGdldChyZXF1aXJlZF9idWRnZXQ6IHVpbnQ2NCwgZmVlX3NvdXJjZTogdWludDY0KSAtPiB2b2lkOgplbnN1cmVfYnVkZ2V0OgogICAgcHJvdG8gMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMTAKICAgICsKCmVuc3VyZV9idWRnZXRfd2hpbGVfdG9wQDE6CiAgICBmcmFtZV9kaWcgMAogICAgZ2xvYmFsIE9wY29kZUJ1ZGdldAogICAgPgogICAgYnogZW5zdXJlX2J1ZGdldF9hZnRlcl93aGlsZUA2CiAgICBpdHhuX2JlZ2luCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgYnl0ZWMgNDcgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtCiAgICBieXRlYyA0NyAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbQogICAgZnJhbWVfZGlnIC0xCiAgICBzd2l0Y2ggZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8wQDMgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8xQDQKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfbmV4dEA1OgogICAgaXR4bl9zdWJtaXQKICAgIGIgZW5zdXJlX2J1ZGdldF93aGlsZV90b3BAMQoKZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8xQDQ6CiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgYiBlbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX25leHRANQoKZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8wQDM6CiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGIgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV9uZXh0QDUKCmVuc3VyZV9idWRnZXRfYWZ0ZXJfd2hpbGVANjoKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucGF5bWVudF9hZ2VudC5QYXltZW50QWdlbnQuZnVuZF9kdWVfY2FzaGZsb3dzW3JvdXRpbmddKCkgLT4gdm9pZDoKZnVuZF9kdWVfY2FzaGZsb3dzOgogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAxMwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NTEKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjUyCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjUzCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo1NQogICAgLy8gaWYgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCk6CiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo1OS02MAogICAgLy8gKyBtYXhfZXZlbnRfY291bnQKICAgIC8vICogVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfUEVSX0VWRU5UX0JVREdFVCkKICAgIGR1cAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjYwCiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfRlVORF9EVUVfQ0FTSEZMT1dTX1BFUl9FVkVOVF9CVURHRVQpCiAgICBwdXNoaW50IDEwMAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjU5LTYwCiAgICAvLyArIG1heF9ldmVudF9jb3VudAogICAgLy8gKiBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19QRVJfRVZFTlRfQlVER0VUKQogICAgKgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjU4CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19CQVNFX0JVREdFVCkKICAgIGludGMgNCAvLyAxNTAwCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NTgtNjAKICAgIC8vIFVJbnQ2NChjc3QuT1BfVVBfRlVORF9EVUVfQ0FTSEZMT1dTX0JBU0VfQlVER0VUKQogICAgLy8gKyBtYXhfZXZlbnRfY291bnQKICAgIC8vICogVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfUEVSX0VWRU5UX0JVREdFVCkKICAgICsKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo1Ni02MgogICAgLy8gZW5zdXJlX2J1ZGdldCgKICAgIC8vICAgICByZXF1aXJlZF9idWRnZXQ9KAogICAgLy8gICAgICAgICBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19CQVNFX0JVREdFVCkKICAgIC8vICAgICAgICAgKyBtYXhfZXZlbnRfY291bnQKICAgIC8vICAgICAgICAgKiBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19QRVJfRVZFTlRfQlVER0VUKQogICAgLy8gICAgICksCiAgICAvLyApCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjY0CiAgICAvLyBwcm9jZXNzZWRfZXZlbnRzID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA1CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjUKICAgIC8vIGZ1bmRlZF9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2NgogICAgLy8gZnVuZGVkX3ByaW5jaXBhbCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTMKCmZ1bmRfZHVlX2Nhc2hmbG93c193aGlsZV90b3BANDoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2OQogICAgLy8gcHJvY2Vzc2VkX2V2ZW50cyA8IG1heF9ldmVudF9jb3VudAogICAgZGlnIDQKICAgIGRpZyAxCiAgICA8CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjktNzAKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgPCBtYXhfZXZlbnRfY291bnQKICAgIC8vIGFuZCBzZWxmLmV2ZW50X2N1cnNvciA8IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQKICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl93aGlsZUAxMQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjcwCiAgICAvLyBhbmQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIDwKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2OS03MAogICAgLy8gcHJvY2Vzc2VkX2V2ZW50cyA8IG1heF9ldmVudF9jb3VudAogICAgLy8gYW5kIHNlbGYuZXZlbnRfY3Vyc29yIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudAogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDExCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzIKICAgIC8vIGVudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KHNlbGYuZXZlbnRfY3Vyc29yKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIGR1cAogICAgYnVyeSAxNwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjczCiAgICAvLyBpZiBlbnRyeS5zY2hlZHVsZWRfdGltZSA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wOgogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDMKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgID4KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAMTEKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3NQogICAgLy8gaWYgbm90IHNlbGYuX2V2ZW50X2lzX2Nhc2goZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSk6CiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ1cnkgMTYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM1MQogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUCksCiAgICBpbnRjXzIgLy8gOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzUwLTM1NAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfTUQpLAogICAgLy8gKQogICAgPT0KICAgIGR1cAogICAgYnVyeSA0CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfdHJ1ZUA1MgogICAgZGlnIDE0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNTIKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNTAtMzU0CiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9NRCksCiAgICAvLyApCiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX3RydWVANTIKICAgIGRpZyAxNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzUzCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX01EKSwKICAgIHB1c2hpbnQgMTkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM1MC0zNTQKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX01EKSwKICAgIC8vICkKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUA1MwoKZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfdHJ1ZUA1MjoKICAgIGludGNfMSAvLyAxCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUA1NDoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3NQogICAgLy8gaWYgbm90IHNlbGYuX2V2ZW50X2lzX2Nhc2goZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSk6CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAMTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU0OAogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X2lkID09IHNlbGYuZXZlbnRfY3Vyc29yLCBlcnIuSU5WQUxJRF9FVkVOVF9DVVJTT1IKICAgIGRpZyAxNQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBjdXJzb3IKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU0OQogICAgLy8gYXNzZXJ0IGVudHJ5LnNjaGVkdWxlZF90aW1lIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLCBlcnIuTk9fRFVFX0NBU0hGTE9XCiAgICBkaWcgMQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPD0KICAgIGFzc2VydCAvLyBObyBkdWUgY2FzaGZsb3cgdG8gcGF5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MTMKICAgIC8vIGlmIGV2ZW50X3R5cGUgbm90IGluIChVSW50NjQoZW51bXMuRVZUX0lQKSwgVUludDY0KGVudW1zLkVWVF9NRCkpOgogICAgZGlnIDIKICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNQogICAgZGlnIDE0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MTQKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDExCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfaW50ZXJlc3RfYW1vdW50QDE2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDI2CiAgICAvLyBldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBidXJ5IDE2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MjcKICAgIC8vIGlmIGV2ZW50X3R5cGUgbm90IGluIChVSW50NjQoZW51bXMuRVZUX1BSKSwgVUludDY0KGVudW1zLkVWVF9NRCkpOgogICAgcHVzaGludCAzCiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE5CiAgICBkaWcgMTQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQyOAogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNgoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnRAMjg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTMKICAgIC8vIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGRpZyAxNQogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTU2CiAgICAvLyBpZiBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKToKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDI5CiAgICBkaWcgNwogICAgYnVyeSA5CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzODoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU3Mi01NzQKICAgIC8vICMgRnVuZGluZyB1c2VzIHBlci11bml0IGN1bXVsYXRpdmUgaW5kaWNlcyBzbyBlYWNoIGhvbGRlciBjYW4gc2V0dGxlCiAgICAvLyAjIGluZGVwZW5kZW50bHkgZnJvbSBpdHMgY3VycmVudCB1bml0IGJhbGFuY2UuCiAgICAvLyBpbnRlcmVzdF9pbmRleF9kZWx0YSA9IHNlbGYuX2Ftb3VudF90b19pbmRleF9kZWx0YShpbnRlcmVzdF9hbW91bnRfZHVlKQogICAgZGlnIDEwCiAgICBjYWxsc3ViIF9hbW91bnRfdG9faW5kZXhfZGVsdGEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU3NQogICAgLy8gcHJpbmNpcGFsX2luZGV4X2RlbHRhID0gc2VsZi5fYW1vdW50X3RvX2luZGV4X2RlbHRhKHByaW5jaXBhbF9hbW91bnRfZHVlKQogICAgZGlnIDYKICAgIGNhbGxzdWIgX2Ftb3VudF90b19pbmRleF9kZWx0YQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTc2CiAgICAvLyBpbnRlcmVzdF9hbW91bnQgPSBzZWxmLl9pbmRleF9kZWx0YV90b19hbW91bnQoaW50ZXJlc3RfaW5kZXhfZGVsdGEpCiAgICBkaWcgMQogICAgY2FsbHN1YiBfaW5kZXhfZGVsdGFfdG9fYW1vdW50CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgMTUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU3NwogICAgLy8gcHJpbmNpcGFsX2Ftb3VudCA9IHNlbGYuX2luZGV4X2RlbHRhX3RvX2Ftb3VudChwcmluY2lwYWxfaW5kZXhfZGVsdGEpCiAgICBkdXAKICAgIGNhbGxzdWIgX2luZGV4X2RlbHRhX3RvX2Ftb3VudAogICAgZHVwCiAgICBidXJ5IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzgKICAgIC8vIHJlcXVpcmVkX2Ftb3VudCA9IGludGVyZXN0X2Ftb3VudCArIHByaW5jaXBhbF9hbW91bnQKICAgIGRpZyAyCiAgICBkaWcgMQogICAgKwogICAgZHVwCiAgICBidXJ5IDkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjczNgogICAgLy8gYmFsYW5jZSA9IHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ1NgogICAgLy8gcmV0dXJuIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgKyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIGRpZyAxCiAgICArCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MzgKICAgIC8vIGFzc2VydCBiYWxhbmNlID49IHJlc2VydmVkX3RvdGFsLCBlcnIuTk9UX0VOT1VHSF9GVU5EUwogICAgZGlnIDIKICAgIGRpZyAxCiAgICA+PQogICAgYXNzZXJ0IC8vIE5vdCBlbm91Z2ggZnVuZHMgZm9yIHRoZSBwYXltZW50CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MzkKICAgIC8vIHJldHVybiBiYWxhbmNlIC0gcmVzZXJ2ZWRfdG90YWwKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTgwCiAgICAvLyBzZWxmLl9hdmFpbGFibGVfc2V0dGxlbWVudF9mdW5kcygpID49IHJlcXVpcmVkX2Ftb3VudAogICAgdW5jb3ZlciAyCiAgICA+PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTc5LTU4MQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLl9hdmFpbGFibGVfc2V0dGxlbWVudF9mdW5kcygpID49IHJlcXVpcmVkX2Ftb3VudAogICAgLy8gKSwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTgzCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0ICs9IGludGVyZXN0X2Ftb3VudAogICAgdW5jb3ZlciAzCiAgICArCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTg0CiAgICAvLyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCArPSBwcmluY2lwYWxfYW1vdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICArCiAgICBieXRlYyAxMiAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4NQogICAgLy8gc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4ICs9IGludGVyZXN0X2luZGV4X2RlbHRhCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCBleGlzdHMKICAgIHVuY292ZXIgMgogICAgKwogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTg2CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4ICs9IHByaW5jaXBhbF9pbmRleF9kZWx0YQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCBleGlzdHMKICAgICsKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1ODcKICAgIC8vIGlmIGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkgPT0gVUludDY0KGVudW1zLkVWVF9QUik6CiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBwdXNoaW50IDMKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDQwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1ODgtNTg5CiAgICAvLyAjIEZvciBQUiwgdGhlIHBlcmlvZCBpbnRlcmVzdCBzdGF5cyBhY2NydWVkIHVudGlsIGEgbGF0ZXIgSVAgb3IgTUQuCiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgKz0gc2VsZi5fZW50cnlfaW50ZXJlc3Rfc2VnbWVudChlbnRyeSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBkaWcgMTYKICAgIGNhbGxzdWIgX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQKICAgIGJ1cnkgMTgKICAgICsKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTIKICAgIC8vIGlmIG5vdCBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKSBvciBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NCgKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlANDMKICAgIGRpZyAxNQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5Mi01OTQKICAgIC8vIGlmIG5vdCBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKSBvciBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NCgKICAgIC8vICAgICBlbnVtcy5FVlRfTUQKICAgIC8vICk6CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDQKCmZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDQzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTk1CiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBkaWcgMTUKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0NDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5NgogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgZGlnIDgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTcKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IG5leHRfaW50ZXJlc3RfYmFzZQogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGRpZyA5CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTk4CiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MDAKICAgIC8vIGlmIGVudHJ5LmV2ZW50X3R5cGUgPT0gYXJjNC5VSW50OCgKICAgIGRpZyAxNQogICAgZXh0cmFjdCA4IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwMC02MDIKICAgIC8vIGlmIGVudHJ5LmV2ZW50X3R5cGUgPT0gYXJjNC5VSW50OCgKICAgIC8vICAgICBlbnVtcy5FVlRfTUQKICAgIC8vICkgYW5kIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID09IFVJbnQ2NCgwKToKICAgIHB1c2hieXRlcyAweDEzCiAgICBiPT0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQ3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MDIKICAgIC8vICkgYW5kIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID09IFVJbnQ2NCgwKToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAwLTYwMgogICAgLy8gaWYgZW50cnkuZXZlbnRfdHlwZSA9PSBhcmM0LlVJbnQ4KAogICAgLy8gICAgIGVudW1zLkVWVF9NRAogICAgLy8gKSBhbmQgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPT0gVUludDY0KDApOgogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQ3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MDMKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGVudW1zLlNUQVRVU19FTkRFRCkKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgMjAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjA0CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQ3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjA2LTYxMAogICAgLy8gc2VsZi5fZW1pdF9leGVjdXRpb25fZXZlbnQoCiAgICAvLyAgICAgZW50cnk9ZW50cnksCiAgICAvLyAgICAgcGF5b2ZmPWludGVyZXN0X2Ftb3VudCArIHByaW5jaXBhbF9hbW91bnQsCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9aW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudCwKICAgIC8vICkKICAgIGRpZyAxNQogICAgZGlnIDQKICAgIGR1cAogICAgY2FsbHN1YiBfZW1pdF9leGVjdXRpb25fZXZlbnQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojc5CiAgICAvLyBmdW5kZWRfaW50ZXJlc3QgKz0gaW50ZXJlc3RfYW1vdW50CiAgICBkaWcgMTMKICAgIGRpZyAxMgogICAgKwogICAgYnVyeSAxNAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjgwCiAgICAvLyBmdW5kZWRfcHJpbmNpcGFsICs9IHByaW5jaXBhbF9hbW91bnQKICAgIGRpZyAxMgogICAgZGlnIDcKICAgICsKICAgIGJ1cnkgMTMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4MQogICAgLy8gcHJvY2Vzc2VkX2V2ZW50cyArPSBVSW50NjQoMSkKICAgIGRpZyA0CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSA1CiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c193aGlsZV90b3BANAoKZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUA0MDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5MQogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ID0gVUludDY0KDApCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQxCgpmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUAyOToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1NwogICAgLy8gZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGRpZyAxNQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSAxNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTU4LTU2MAogICAgLy8gIyBEeW5hbWljIGFubnVpdGllcyBkZXJpdmUgbmV4dCBzdGF0ZSBmcm9tIHRoZSBwYXltZW50IGRlY29tcG9zaXRpb24sCiAgICAvLyAjIG5vdCBvbmx5IGZyb20gdGhlIHByZWNvbXB1dGVkIGBuZXh0XypgIGZpZWxkcy4KICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QUik6CiAgICBwdXNoaW50IDMKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDMxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjIKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIC0gcHJpbmNpcGFsX2Ftb3VudF9kdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgZGlnIDYKICAgIC0KICAgIGR1cAogICAgYnVyeSA5CiAgICBidXJ5IDkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzgKCmZ1bmRfZHVlX2Nhc2hmbG93c19lbHNlX2JvZHlAMzE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjUKICAgIC8vIGVsaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX0lQKToKICAgIGRpZyAxNAogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDMzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjYKICAgIC8vIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgYnVyeSA5CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjcKICAgIC8vIG5leHRfaW50ZXJlc3RfYmFzZSA9IHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgYnVyeSAxMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSBleGlzdHMKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzgKCmZ1bmRfZHVlX2Nhc2hmbG93c19lbHNlX2JvZHlAMzM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjgKICAgIC8vIGVsaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKToKICAgIGRpZyAxNAogICAgcHVzaGludCAxOQogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUAzNAogICAgZGlnIDcKICAgIGJ1cnkgOQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlAMzQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjkKICAgIC8vIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzAKICAgIC8vIG5leHRfaW50ZXJlc3RfYmFzZSA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgOQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MjkKICAgIC8vIGlmIHNlbGYuX2lzX2R5bmFtaWNfYW5udWl0eSgpOgogICAgY2FsbHN1YiBfaXNfZHluYW1pY19hbm51aXR5CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyNwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDMwCiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfTUQpOgogICAgZGlnIDE0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzMQogICAgLy8gcmV0dXJuIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTUyCiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzMgogICAgLy8gaW50ZXJlc3RfZHVlID0gc2VsZi5hY2NydWVkX2ludGVyZXN0ICsgc2VsZi5fZW50cnlfaW50ZXJlc3Rfc2VnbWVudChlbnRyeSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBkaWcgMTYKICAgIGNhbGxzdWIgX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQKICAgIGJ1cnkgMTgKICAgICsKICAgIGR1cAogICAgYnVyeSAxMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDMzCiAgICAvLyBpZiBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPD0gaW50ZXJlc3RfZHVlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gZXhpc3RzCiAgICA+PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzNAogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTUyCiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyNDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzNQogICAgLy8gcHJpbmNpcGFsX2Ftb3VudCA9IHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiAtIGludGVyZXN0X2R1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gZXhpc3RzCiAgICBkaWcgMTAKICAgIC0KICAgIGR1cAogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzYKICAgIC8vIGlmIHByaW5jaXBhbF9hbW91bnQgPiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgPgogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzNwogICAgLy8gcmV0dXJuIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTUyCiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyNjoKICAgIGRpZyA2CiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NDAKICAgIC8vIGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsIDw9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBkaWcgMTUKICAgIHB1c2hpbnQgNDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGR1cDIKICAgIDw9CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzktNDQxCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsIDw9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ0MgogICAgLy8gcmV0dXJuIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIC0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIHN3YXAKICAgIC0KICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTUyCiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQxNQogICAgLy8gcmV0dXJuIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCArIHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZGlnIDE2CiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBidXJ5IDE4CiAgICArCiAgICBidXJ5IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTEKICAgIC8vIGludGVyZXN0X2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9pbnRlcmVzdF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9pbnRlcmVzdF9hbW91bnRAMTYKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl93aGlsZUAxMToKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4MwogICAgLy8gYXNzZXJ0IHByb2Nlc3NlZF9ldmVudHMgPiBVSW50NjQoMCksIGVyci5OT19EVUVfQ0FTSEZMT1cKICAgIGRpZyA0CiAgICBkdXAKICAgIGFzc2VydCAvLyBObyBkdWUgY2FzaGZsb3cgdG8gcGF5CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODcKICAgIC8vIHRvdGFsX2Z1bmRlZD1mdW5kZWRfaW50ZXJlc3QgKyBmdW5kZWRfcHJpbmNpcGFsLAogICAgZGlnIDE0CiAgICBkdXAKICAgIGRpZyAxNQogICAgZHVwCiAgICBjb3ZlciAzCiAgICArCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODkKICAgIC8vIHRpbWVzdGFtcD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4NC05MAogICAgLy8gcmV0dXJuIHR5cC5DYXNoRnVuZGluZ1Jlc3VsdCgKICAgIC8vICAgICBmdW5kZWRfaW50ZXJlc3Q9ZnVuZGVkX2ludGVyZXN0LAogICAgLy8gICAgIGZ1bmRlZF9wcmluY2lwYWw9ZnVuZGVkX3ByaW5jaXBhbCwKICAgIC8vICAgICB0b3RhbF9mdW5kZWQ9ZnVuZGVkX2ludGVyZXN0ICsgZnVuZGVkX3ByaW5jaXBhbCwKICAgIC8vICAgICBwcm9jZXNzZWRfZXZlbnRzPXByb2Nlc3NlZF9ldmVudHMsCiAgICAvLyAgICAgdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUA1MzoKICAgIGludGNfMCAvLyAwCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDU0CgoKLy8gbW9kdWxlcy5wYXltZW50X2FnZW50LlBheW1lbnRBZ2VudC5jbGFpbV9kdWVfY2FzaGZsb3dzW3JvdXRpbmddKCkgLT4gdm9pZDoKY2xhaW1fZHVlX2Nhc2hmbG93czoKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6OTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNQogICAgLy8gaWYgc2VsZi5vcF9kYWVtb24udmFsdWUgIT0gR2xvYmFsLnplcm9fYWRkcmVzczoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNiAvLyAweDUyMjM0ZjcwNDQ2MTY1NmQ2ZjZlMjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcF9kYWVtb24gZXhpc3RzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBieiBjbGFpbV9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTcKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNwogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI2IC8vIDB4NTIyMzRmNzA0NDYxNjU2ZDZmNmUyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wX2RhZW1vbiBleGlzdHMKICAgID09CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTctMTkKICAgIC8vIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICAvLyBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgYm56IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDE0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTgKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNy0xOQogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICBibnogY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX3RydWVAMTQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxOQogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIHR4biBTZW5kZXIKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDMyCiAgICA9PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE3LTE5CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAxNQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX3RydWVAMTQ6CiAgICBpbnRjXzEgLy8gMQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDE2OgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE2LTIwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vICAgICBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gICAgIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICAvLyApLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNzoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMDMKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA0CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMDcKICAgIC8vIHNlbGYuX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQoaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDIKICAgIGR1cAogICAgY2FsbHN1YiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjEwOAogICAgLy8gc2VsZi5fc2V0dGxlX3Bvc2l0aW9uKGhvbGRpbmdfYWRkcmVzcykKICAgIGNhbGxzdWIgX3NldHRsZV9wb3NpdGlvbgogICAgcG9wbiAyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTE3CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jbGFpbWFibGVfaW50ZXJlc3QKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGR1cAogICAgcHVzaGludCA3MwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTE4CiAgICAvLyArIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNsYWltYWJsZV9wcmluY2lwYWwKICAgIGR1cAogICAgcHVzaGludCA4MQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTE3LTExOAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY2xhaW1hYmxlX2ludGVyZXN0CiAgICAvLyArIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNsYWltYWJsZV9wcmluY2lwYWwKICAgIHVuY292ZXIgMgogICAgKwogICAgZHVwCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMTAKICAgIC8vIGFzc2VydCB0b3RhbF9hbW91bnQgPiBVSW50NjQoMCksIGVyci5OT19EVUVfQ0FTSEZMT1cKICAgIGFzc2VydCAvLyBObyBkdWUgY2FzaGZsb3cgdG8gcGF5CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MjUKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5pc19vcHRlZF9pbigKICAgIGV4dHJhY3QgMCAzMgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI2CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI1LTI3CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MuaXNfb3B0ZWRfaW4oCiAgICAvLyAgICAgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkCiAgICAvLyApCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI1LTI4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MuaXNfb3B0ZWRfaW4oCiAgICAvLyAgICAgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkCiAgICAvLyApCiAgICAvLyBhbmQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZAogICAgYnogY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX2ZhbHNlQDI0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MjgKICAgIC8vIGFuZCBub3Qgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDM4NAogICAgZ2V0Yml0CiAgICBibnogY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX2ZhbHNlQDI0CiAgICBpbnRjXzEgLy8gMQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDI1OgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjExNQogICAgLy8gaWYgc2VsZi5faXNfcGF5bWVudF9leGVjdXRhYmxlKGhvbGRpbmdfYWRkcmVzcyk6CiAgICBieiBjbGFpbV9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjM0CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgc3dhcAogICAgZGlnIDEKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYXNzZXJ0IC8vIGFjY291bnQgb3B0ZWQgaW50byBhc3NldAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjM0LTM1CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgLy8gPj0gcGF5bWVudF9hbW91bnQKICAgIGRpZyA1CiAgICBkdXAKICAgIGNvdmVyIDIKICAgID49CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MzMtMzYKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIC8vICAgICA+PSBwYXltZW50X2Ftb3VudAogICAgLy8gKSwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjExNwogICAgLy8gc2VsZi5fcGF5KHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcywgdG90YWxfYW1vdW50KQogICAgZGlnIDIKICAgIGR1cAogICAgY292ZXIgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGR1cAogICAgZXh0cmFjdCAwIDMyCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NDAtNDUKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1yZWNlaXZlciwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9YW1vdW50LAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NDQKICAgIC8vIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICB1bmNvdmVyIDMKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgdW5jb3ZlciAyCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQwCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NDAtNDUKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1yZWNlaXZlciwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9YW1vdW50LAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEyNS0xMjYKICAgIC8vICMgR2V0IHRoZSBjbGFpbWFibGUgYW1vdW50cyBiZWZvcmUgcmVzZXQKICAgIC8vIGludGVyZXN0X2Ftb3VudCA9IHBvc2l0aW9uLmNsYWltYWJsZV9pbnRlcmVzdAogICAgZHVwCiAgICBwdXNoaW50IDczCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBidXJ5IDkKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMjcKICAgIC8vIHByaW5jaXBhbF9hbW91bnQgPSBwb3NpdGlvbi5jbGFpbWFibGVfcHJpbmNpcGFsCiAgICBkdXAKICAgIHB1c2hpbnQgODEKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGJ1cnkgOQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEyOS0xMzAKICAgIC8vICMgUmVzZXQgdGhlIHBvc2l0aW9uJ3MgY2xhaW1hYmxlIGFtb3VudHMKICAgIC8vIHBvc2l0aW9uLmNsYWltYWJsZV9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICByZXBsYWNlMiA3MwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzMQogICAgLy8gcG9zaXRpb24uY2xhaW1hYmxlX3ByaW5jaXBhbCA9IFVJbnQ2NCgwKQogICAgc3dhcAogICAgcmVwbGFjZTIgODEKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzIKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gcG9zaXRpb24uY29weSgpCiAgICB1bmNvdmVyIDMKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzQKICAgIC8vIGFzc2VydCBzZWxmLnJlc2VydmVkX2ludGVyZXN0ID49IGludGVyZXN0X2Ftb3VudCwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBkdXAKICAgIGRpZyAyCiAgICA+PQogICAgYXNzZXJ0IC8vIE5vdCBlbm91Z2ggZnVuZHMgZm9yIHRoZSBwYXltZW50CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTM1CiAgICAvLyBhc3NlcnQgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgPj0gcHJpbmNpcGFsX2Ftb3VudCwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIGRpZyAzCiAgICA+PQogICAgYXNzZXJ0IC8vIE5vdCBlbm91Z2ggZnVuZHMgZm9yIHRoZSBwYXltZW50CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTM3LTEzOAogICAgLy8gIyBVcGRhdGUgdGhlIGdsb2JhbCByZXNlcnZlZCBpbnRlcmVzdCBhbmQgcHJpbmNpcGFsIGFtb3VudHMKICAgIC8vIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgLT0gaW50ZXJlc3RfYW1vdW50CiAgICBzd2FwCiAgICAtCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzOQogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgLT0gcHJpbmNpcGFsX2Ftb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIGV4aXN0cwogICAgc3dhcAogICAgLQogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpjbGFpbV9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMjMKICAgIC8vIHRvdGFsX2Ftb3VudD1pbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50LAogICAgZGlnIDUKICAgIGR1cAogICAgZGlnIDYKICAgIGR1cAogICAgY292ZXIgMwogICAgKwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjEyNAogICAgLy8gdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjEyMC0xMjYKICAgIC8vIHJldHVybiB0eXAuQ2FzaENsYWltUmVzdWx0KAogICAgLy8gICAgIGludGVyZXN0X2Ftb3VudD1pbnRlcmVzdF9hbW91bnQsCiAgICAvLyAgICAgcHJpbmNpcGFsX2Ftb3VudD1wcmluY2lwYWxfYW1vdW50LAogICAgLy8gICAgIHRvdGFsX2Ftb3VudD1pbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50LAogICAgLy8gICAgIHRpbWVzdGFtcD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICBjb250ZXh0PXBheW1lbnRfaW5mbywKICAgIC8vICkKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyAyCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgcHVzaGJ5dGVzIDB4MDAyMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VAMjQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfbWVyZ2VAMjUKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAxNToKICAgIGludGNfMCAvLyAwCiAgICBiIGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUAxNgoKCi8vIG1vZHVsZXMudHJhbnNmZXJfYWdlbnQuVHJhbnNmZXJBZ2VudC50cmFuc2Zlcl9zZXRfc2NoZWR1bGVbcm91dGluZ10oKSAtPiB2b2lkOgp0cmFuc2Zlcl9zZXRfc2NoZWR1bGU6CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MjYKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToyNwogICAgLy8gYXNzZXJ0IG9wZW5fZGF0ZSA8IGNsb3N1cmVfZGF0ZSwgZXJyLklOVkFMSURfU09SVElORwogICAgZHVwMgogICAgPAogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIG11c3QgYmUgc29ydGVkIGluIHN0cmljdGx5IGFzY2VuZGluZyBvcmRlcgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToyOQogICAgLy8gc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgPSBvcGVuX2RhdGUKICAgIGJ5dGVjIDI4IC8vICJ0cmFuc2Zlcl9vcGVuaW5nX2RhdGUiCiAgICB1bmNvdmVyIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjMwCiAgICAvLyBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSA9IGNsb3N1cmVfZGF0ZQogICAgYnl0ZWMgMjkgLy8gInRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjMxCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMudHJhbnNmZXJfYWdlbnQuVHJhbnNmZXJBZ2VudC5wcmltYXJ5X2Rpc3RyaWJ1dGlvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnByaW1hcnlfZGlzdHJpYnV0aW9uOgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTozMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo3MQogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYucHJpbWFyeV9kZWFsZXIsIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyMiAvLyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQzCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo0NAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQ1CiAgICAvLyBhc3NlcnQgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TRUQKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBjbG9zZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDcKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQoaG9sZGluZ19hZGRyZXNzKQogICAgc3dhcAogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo0OAogICAgLy8gYXNzZXJ0IHVuaXRzID4gVUludDY0KDApLCBlcnIuWkVST19VTklUUwogICAgZHVwCiAgICBhc3NlcnQgLy8gQ2FuIG5vdCBkaXN0cmlidXRlIHplcm8gdW5pdHMKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NTAKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgKyB1bml0cyA8PSBzZWxmLnRvdGFsX3VuaXRzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIGV4aXN0cwogICAgKwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIDw9CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQ5LTUxCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgKyB1bml0cyA8PSBzZWxmLnRvdGFsX3VuaXRzCiAgICAvLyApLCBlcnIuT1ZFUl9ESVNUUklCVVRJT04KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgcmVtYWluaW5nIEQtQVNBIHVuaXRzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjUyCiAgICAvLyBpZiBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNyAvLyAiaW5pdGlhbF9leGNoYW5nZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSBleGlzdHMKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo1NAogICAgLy8gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPD0gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGUKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNyAvLyAiaW5pdGlhbF9leGNoYW5nZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSBleGlzdHMKICAgIDw9CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjUzLTU1CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDw9IHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlCiAgICAvLyApLCBlcnIuUFJJTUFSWV9ESVNUUklCVVRJT05fQ0xPU0VECiAgICBhc3NlcnQgLy8gUHJpbWFyeSBkaXN0cmlidXRpb24gaXMgY2xvc2VkCgpwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTQ4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5yZXNlcnZlZF91bml0cyArPSB1bml0cwogICAgZHVwbiAyCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCA0MAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAzCiAgICBkdXAKICAgIGNvdmVyIDMKICAgICsKICAgIGl0b2IKICAgIHB1c2hpbnQgNDAKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjU4CiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsICs9IHVuaXRzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIGV4aXN0cwogICAgKwogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjU5CiAgICAvLyByZXR1cm4gc2VsZi50b3RhbF91bml0cyAtIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICBzd2FwCiAgICAtCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnRyYW5zZmVyX2FnZW50LlRyYW5zZmVyQWdlbnQudHJhbnNmZXJbcm91dGluZ10oKSAtPiB2b2lkOgp0cmFuc2ZlcjoKICAgIGludGNfMCAvLyAwCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cG4gMgogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojc1CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo3NgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDcKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjEzCiAgICAvLyBpZiBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyOCAvLyAidHJhbnNmZXJfb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIGJ6IHRyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNQogICAgLy8gc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyOCAvLyAidHJhbnNmZXJfb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIDw9CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE0LTE2CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyApLCBlcnIuQ0xPU0VEX1RSQU5TRkVSCiAgICBhc3NlcnQgLy8gVHJhbnNmZXIgaXMgY2xvc2VkCgp0cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE3CiAgICAvLyBpZiBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyOSAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIGJ6IHRyYW5zZmVyX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxOQogICAgLy8gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI5IC8vICJ0cmFuc2Zlcl9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgPAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxOC0yMAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8IHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlCiAgICAvLyApLCBlcnIuQ0xPU0VEX1RSQU5TRkVSCiAgICBhc3NlcnQgLy8gVHJhbnNmZXIgaXMgY2xvc2VkCgp0cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjgwCiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBzZW5kZXJfaG9sZGluZ19hZGRyZXNzLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICBkaWcgNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQyMwogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDgKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBkaWcgNQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA5CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjgzCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBkaWcgMgogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4NAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBkdXAKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODUKICAgIC8vIGFzc2VydCBzZW5kZXJfaG9sZGluZ19hZGRyZXNzICE9IHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcywgZXJyLlNFTEZfVFJBTlNGRVIKICAgIHVuY292ZXIgMgogICAgIT0KICAgIGFzc2VydCAvLyBTZW5kZXIgYW5kIHJlY2VpdmVyIG11c3QgYmUgZGlmZmVyZW50CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojg2CiAgICAvLyBhc3NlcnQgdW5pdHMgPiBVSW50NjQoMCksIGVyci5OVUxMX1RSQU5TRkVSCiAgICBkaWcgMQogICAgZHVwCiAgICBhc3NlcnQgLy8gVHJhbnNmZXIgdW5pdHMgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4NwogICAgLy8gYXNzZXJ0IHVuaXRzIDw9IHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cywgZXJyLk9WRVJfVFJBTlNGRVIKICAgIHN3YXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICA8PQogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCBzZW5kZXIgdW5pdHMgdG8gdHJhbnNmZXIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc2NQogICAgLy8gaWYgc2VsZi5ldmVudF9jdXJzb3IgPj0gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgPj0KICAgIGJueiB0cmFuc2Zlcl9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9hc3NlcnRfbm9fZHVlX2V2ZW50X3BlbmRpbmdAMTAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc2NwogICAgLy8gbmV4dF9lbnRyeSA9IHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLmV2ZW50X2N1cnNvcikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NjkKICAgIC8vIG5leHRfZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzY4LTc3MAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBuZXh0X2VudHJ5LnNjaGVkdWxlZF90aW1lID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICksIGVyci5QRU5ESU5HX0FDVFVTX0VWRU5UCiAgICBhc3NlcnQgLy8gQUNUVVMgZXZlbnQgbm90IHlldCBleGVjdXRlZAoKdHJhbnNmZXJfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYXNzZXJ0X25vX2R1ZV9ldmVudF9wZW5kaW5nQDEwOgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo5MAogICAgLy8gc2VsZi5fZW5zdXJlX3VuaXRzX2FjdGl2YXRlZChzZW5kZXJfaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDMKICAgIGR1cAogICAgY2FsbHN1YiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo5MQogICAgLy8gc2VsZi5fZW5zdXJlX3VuaXRzX2FjdGl2YXRlZChyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBkaWcgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjYWxsc3ViIF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjkyCiAgICAvLyBzZWxmLl9zZXR0bGVfcG9zaXRpb24oc2VuZGVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGNhbGxzdWIgX3NldHRsZV9wb3NpdGlvbgogICAgcG9wbiAyCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjkzCiAgICAvLyBzZWxmLl9zZXR0bGVfcG9zaXRpb24ocmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzKQogICAgY2FsbHN1YiBfc2V0dGxlX3Bvc2l0aW9uCiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNTIKICAgIC8vIGFzc2VydCB1bml0cyA8PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cywgZXJyLk9WRVJfVFJBTlNGRVIKICAgIGRpZyA1CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkaWcgMQogICAgPD0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgc2VuZGVyIHVuaXRzIHRvIHRyYW5zZmVyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTUzCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyAtPSB1bml0cwogICAgZGlnIDEKICAgIC0KICAgIGl0b2IKICAgIHVuY292ZXIgMgogICAgaW50Y18zIC8vIDMyCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTQ0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyArPSB1bml0cwogICAgZGlnIDUKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIHVuY292ZXIgMgogICAgKwogICAgaXRvYgogICAgaW50Y18zIC8vIDMyCiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo2MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfc3VzcGVuc2lvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfc3VzcGVuc2lvbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojc3CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyMSAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxODUKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZCA9IHN1c3BlbmRlZAogICAgZHVwCiAgICBwdXNoaW50IDQ4CiAgICBpbnRjXzEgLy8gMQogICAgYm94X2V4dHJhY3QKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgcHVzaGludCA0OAogICAgc3dhcAogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxODYKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE2NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF9vcGVuW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF9vcGVuOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjY4CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hY2NvdW50X21hbmFnZXIsIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyMyAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzOQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfRU5ERUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgMjAwCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxMAogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfZW5kZWQoKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgIQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjExCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxMgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTMKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozNAogICAgLy8gdW5pdHM9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozMi00MgogICAgLy8gcmV0dXJuIHR5cC5BY2NvdW50UG9zaXRpb24oCiAgICAvLyAgICAgcGF5bWVudF9hZGRyZXNzPXBheW1lbnRfYWRkcmVzcywKICAgIC8vICAgICB1bml0cz1VSW50NjQoMCksCiAgICAvLyAgICAgcmVzZXJ2ZWRfdW5pdHM9VUludDY0KDApLAogICAgLy8gICAgIHN1c3BlbmRlZD1GYWxzZSwKICAgIC8vICAgICBzZXR0bGVkX2N1cnNvcj1VSW50NjQoMCksCiAgICAvLyAgICAgaW50ZXJlc3RfY2hlY2twb2ludD1VSW50NjQoMCksCiAgICAvLyAgICAgcHJpbmNpcGFsX2NoZWNrcG9pbnQ9VUludDY0KDApLAogICAgLy8gICAgIGNsYWltYWJsZV9pbnRlcmVzdD1VSW50NjQoMCksCiAgICAvLyAgICAgY2xhaW1hYmxlX3ByaW5jaXBhbD1VSW50NjQoMCksCiAgICAvLyApCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGJ5dGVjIDQwIC8vIDB4MDAKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjE0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHNlbGYuX25ld19hY2NvdW50X3Bvc2l0aW9uKHBheW1lbnRfYWRkcmVzcykKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTUKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIzOAogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICB1bmNvdmVyIDMKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMzkKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQwCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0MQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzID0gcGF5bWVudF9hZGRyZXNzCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0MgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5hY2NvdW50X2dldF9wb3NpdGlvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfZ2V0X3Bvc2l0aW9uOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI1OQogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmNvbnRyYWN0X2NyZWF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X2NyZWF0ZToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDI4CiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gYXJyYW5nZXIKICAgIGJ5dGVjIDE4IC8vIDB4NTIyMzQxNzI3MjYxNmU2NzY1NzIyMwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMjkKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfY29uZmlnW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfY29uZmlnOgogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBsZW4KICAgIHB1c2hpbnQgMTA3CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLk5vcm1hbGl6ZWRBY3R1c1Rlcm1zCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgcHVzaGludCA3MgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5Jbml0aWFsS2VybmVsU3RhdGUKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBsZW4KICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIHR1cGxlIGVuY29kaW5nCiAgICBkdXAKICAgIHB1c2hpbnQgMzQKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCB0YWlsIHBvaW50ZXIgYXQgaW5kZXggMSBvZiAodWludDhbMzJdLChsZW4rdXRmOFtdKSkKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgY292ZXIgMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMzYKICAgICsKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuUHJvc3BlY3R1cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2MAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDYyLTEwNjMKICAgIC8vICMgQ29uZmlndXJlIENvbnRyYWN0CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPSB0ZXJtcy5jb250cmFjdF90eXBlLmFzX3VpbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgYnogY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUA3CiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIyMAogICAgLy8gVUludDY0KGVudW1zLkNUX0FOTiksCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIxCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfTkFNKSwKICAgIHB1c2hpbnQgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIyCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfTEFNKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIzCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfTEFYKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjI0CiAgICAvLyBVSW50NjQoZW51bXMuQ1RfQ0xNKSwKICAgIHB1c2hpbnQgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJ6IGNvbnRyYWN0X2NvbmZpZ19ib29sX2ZhbHNlQDgKCmNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANzoKICAgIGludGNfMSAvLyAxCgpjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUA5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjI5CiAgICAvLyBhc3NlcnQgc2VsZi5faXNfc3VwcG9ydGVkX2NvbnRyYWN0X3R5cGUoY29udHJhY3RfdHlwZSksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2NQogICAgLy8gc2VsZi5fc3RvcmVfY29udHJhY3RfY29uZmlnKHNlbGYuY29udHJhY3RfdHlwZSwgdGVybXMsIGluaXRpYWxfc3RhdGUpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgYnVyeSAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzI1CiAgICAvLyBhc3NlcnQgdGVybXMuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZGlnIDQKICAgIGR1cAogICAgcHVzaGludCAzMwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSA4CiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMjcKICAgIC8vIHRlcm1zLmRheV9jb3VudF9jb252ZW50aW9uLmFzX3VpbnQ2NCgpCiAgICBwdXNoaW50IDU3CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICBieiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDE2CiAgICBkaWcgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk5CiAgICAvLyBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI5Ny0zMDMKICAgIC8vIHJldHVybiBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzYwKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwSVNEQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjApLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDE2CiAgICBkaWcgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzAwCiAgICAvLyBVSW50NjQoZW51bXMuRENDX0EzNjUpLAogICAgcHVzaGludCAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyOTctMzAzCiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgID09CiAgICBibnogY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUAxNgogICAgZGlnIDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMwMQogICAgLy8gVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGRpZyA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDIKICAgIC8vIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICA9PQogICAgYnogY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAMTcKCmNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTY6CiAgICBpbnRjXzEgLy8gMQoKY29udHJhY3RfY29uZmlnX2Jvb2xfbWVyZ2VAMTg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDktMzExCiAgICAvLyBhc3NlcnQgc2VsZi5faXNfc3VwcG9ydGVkX2RheV9jb3VudF9jb252ZW50aW9uKAogICAgLy8gICAgIGRheV9jb3VudF9jb252ZW50aW9uCiAgICAvLyApLCBlcnIuSU5WQUxJRF9EQVlfQ09VTlRfQ09OVkVOVElPTgogICAgYXNzZXJ0IC8vIEludmFsaWQgZGF5LWNvdW50IGNvbnZlbnRpb24gSUQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMyOQogICAgLy8gaWYgY29udHJhY3RfdHlwZSAhPSBVSW50NjQoZW51bXMuQ1RfQU5OKToKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgICE9CiAgICBieiBjb250cmFjdF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzMwCiAgICAvLyBhc3NlcnQgbm90IHRlcm1zLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24sIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZGlnIDQKICAgIHB1c2hpbnQgNzg2CiAgICBnZXRiaXQKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KCmNvbnRyYWN0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDIwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODA5CiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIEQtQVNBIGFscmVhZHkgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODEwCiAgICAvLyBhc3NlcnQgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCA9PSBVSW50NjQoMCksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMCAvLyAiaW5pdGlhbF9leGNoYW5nZV9hbW91bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTItODEzCiAgICAvLyAjIFNldCBEZW5vbWluYXRpb24gQXNzZXQKICAgIC8vIHNlbGYuX2Fzc2VydF9kZW5vbWluYXRpb25fYXNzZXQodGVybXMuZGVub21pbmF0aW9uX2Fzc2V0X2lkKQogICAgZGlnIDQKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NzctNzc4CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIGRlbm9taW5hdGlvbiB3aXRoIEFTQQogICAgLy8gX2NyZWF0b3IsIGV4aXN0cyA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X2NyZWF0b3IoZGVub21pbmF0aW9uX2Fzc2V0X2lkKQogICAgZHVwCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q3JlYXRvcgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NzkKICAgIC8vIGFzc2VydCBleGlzdHMsIGVyci5JTlZBTElEX0RFTk9NSU5BVElPTgogICAgYXNzZXJ0IC8vIERlbm9taW5hdGlvbiBhc3NldCBpcyBub3QgcHJvcGVybHkgc2V0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODIKICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICBieXRlYyA0NCAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTYtODE3CiAgICAvLyAjIFNldCBTZXR0bGVtZW50IEFzc2V0CiAgICAvLyBzZWxmLl9hc3NlcnRfc2V0dGxlbWVudF9hc3NldCh0ZXJtcy5zZXR0bGVtZW50X2Fzc2V0X2lkKQogICAgZGlnIDEKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc4NwogICAgLy8gc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODUtNzg4CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc2V0dGxlbWVudCBhc3NldCBpcyB0aGUgZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQgPT0gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIC8vICksIGVyci5JTlZBTElEX1NFVFRMRU1FTlRfQVNTRVQKICAgIGFzc2VydCAvLyBEaWZmZXJlbnQgc2V0dGxlbWVudCBhc3NldCBub3Qgc3VwcG9ydGVkLCBtdXN0IGJlIGVxdWFsIHRvIGRlbm9taW5hdGlvbiBhc3NldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkxCiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBzZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkyLTc5OAogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhc3NldF9hbW91bnQ9MCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Nzk3CiAgICAvLyBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Nzk1CiAgICAvLyBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc5NgogICAgLy8gYXNzZXRfYW1vdW50PTAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkyLTc5MwogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3OTItNzk4CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODIwLTgyMQogICAgLy8gIyBVbml0cwogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IHRlcm1zLnRvdGFsX3VuaXRzCiAgICBkdXAKICAgIHB1c2hpbnQgMTcKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODIyCiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID0gVUludDY0KDApCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgyNC04MjUKICAgIC8vICMgRGF5LUNvdW50IENvbnZlbnRpb25zCiAgICAvLyBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uID0gdGVybXMuZGF5X2NvdW50X2NvbnZlbnRpb24uYXNfdWludDY0KCkKICAgIGJ5dGVjIDQ2IC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGRpZyA4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODI3LTgyOAogICAgLy8gIyBUaW1lCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA9IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZQogICAgZHVwCiAgICBwdXNoaW50IDQxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMjcgLy8gImluaXRpYWxfZXhjaGFuZ2VfZGF0ZSIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODI5CiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSB0ZXJtcy5tYXR1cml0eV9kYXRlCiAgICBkaWcgMQogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDQ1IC8vICJtYXR1cml0eV9kYXRlIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MzAKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IGluaXRpYWxfc3RhdGUubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZGlnIDYKICAgIGR1cAogICAgY292ZXIgMgogICAgcHVzaGludCA0OAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzMi04MzMKICAgIC8vICMgUHJpbmNpcGFsCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID0gdGVybXMuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGRpZyAxMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzNAogICAgLy8gc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gdGVybXMuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZGlnIDMKICAgIHB1c2hpbnQgNzg2CiAgICBnZXRiaXQKICAgIGJ5dGVjIDM0IC8vICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzNQogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBpbml0aWFsX3N0YXRlLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZGlnIDEKICAgIHB1c2hpbnQgMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODM3LTgzOAogICAgLy8gIyBJbnRlcmVzdAogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ID0gaW5pdGlhbF9zdGF0ZS5hY2NydWVkX2ludGVyZXN0CiAgICBkaWcgMQogICAgcHVzaGludCA0MAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQwLTg0MQogICAgLy8gIyBJbnRlcmVzdCBSYXRlCiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IGluaXRpYWxfc3RhdGUubm9taW5hbF9pbnRlcmVzdF9yYXRlCiAgICBkaWcgMQogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0MgogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gaW5pdGlhbF9zdGF0ZS5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlCiAgICBkaWcgMQogICAgcHVzaGludCAyNAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQzCiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkID0gdGVybXMucmF0ZV9yZXNldF9zcHJlYWQKICAgIGRpZyAzCiAgICBwdXNoaW50IDU4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzUgLy8gInJhdGVfcmVzZXRfc3ByZWFkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0NAogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIgPSB0ZXJtcy5yYXRlX3Jlc2V0X211bHRpcGxpZXIKICAgIGRpZyAzCiAgICBwdXNoaW50IDY2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzYgLy8gInJhdGVfcmVzZXRfbXVsdGlwbGllciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDUKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9mbG9vciA9IHRlcm1zLnJhdGVfcmVzZXRfZmxvb3IKICAgIGRpZyAzCiAgICBwdXNoaW50IDc0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzAgLy8gInJhdGVfcmVzZXRfZmxvb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQ2CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfY2FwID0gdGVybXMucmF0ZV9yZXNldF9jYXAKICAgIGRpZyAzCiAgICBwdXNoaW50IDgyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzEgLy8gInJhdGVfcmVzZXRfY2FwIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0NwogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X25leHQgPSB0ZXJtcy5yYXRlX3Jlc2V0X25leHQKICAgIGRpZyAzCiAgICBwdXNoaW50IDkwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzcgLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDgKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgPSB0ZXJtcy5oYXNfcmF0ZV9yZXNldF9mbG9vcgogICAgZGlnIDMKICAgIHB1c2hpbnQgNzg0CiAgICBnZXRiaXQKICAgIGJ5dGVjIDM4IC8vICJoYXNfcmF0ZV9yZXNldF9mbG9vciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDkKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwID0gdGVybXMuaGFzX3JhdGVfcmVzZXRfY2FwCiAgICBkaWcgMwogICAgcHVzaGludCA3ODUKICAgIGdldGJpdAogICAgYnl0ZWMgMzkgLy8gImhhc19yYXRlX3Jlc2V0X2NhcCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NTEtODUyCiAgICAvLyAjIFNjYWxpbmcKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgPSB0ZXJtcy5maXhlZF9wb2ludF9zY2FsZQogICAgdW5jb3ZlciAzCiAgICBwdXNoaW50IDk5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU0LTg1NQogICAgLy8gIyBTY2hlZHVsZSBQcm9jZXNzaW5nCiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciA9IGluaXRpYWxfc3RhdGUuZXZlbnRfY3Vyc29yCiAgICBkaWcgMQogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU3LTg1OAogICAgLy8gIyBQZXItVW5pdCBGaXhlZC1Qb2ludCBJbmRleGVzCiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggPSBpbml0aWFsX3N0YXRlLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgKICAgIGRpZyAxCiAgICBwdXNoaW50IDU2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU5CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4ID0gaW5pdGlhbF9zdGF0ZS5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleAogICAgZGlnIDEKICAgIHB1c2hpbnQgNjQKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODYxLTg2MgogICAgLy8gIyBSZXNlcnZlZCBBbW91bnQgKGZvciBleGVjdXRlZCBjYXNoZmxvd3MpCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0ID0gVUludDY0KDApCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2MwogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2NQogICAgLy8gYXNzZXJ0IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLCBlcnIuSU5WQUxJRF9JRUQKICAgIGRpZyAyCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICBhc3NlcnQgLy8gSUVEIG11c3QgYmUgc2V0IGluIHRoZSBmdXR1cmUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2NgogICAgLy8gYXNzZXJ0IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA+IGluaXRpYWxfc3RhdGUuc3RhdHVzX2RhdGUsIGVyci5JTlZBTElEX0lFRAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgPAogICAgYXNzZXJ0IC8vIElFRCBtdXN0IGJlIHNldCBpbiB0aGUgZnV0dXJlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NjcKICAgIC8vIGFzc2VydCB0ZXJtcy5pbml0aWFsX2V4Y2hhbmdlX2RhdGUgPCB0ZXJtcy5tYXR1cml0eV9kYXRlLCBlcnIuSU5WQUxJRF9JRUQKICAgIDwKICAgIGFzc2VydCAvLyBJRUQgbXVzdCBiZSBzZXQgaW4gdGhlIGZ1dHVyZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2Ny0xMDY4CiAgICAvLyAjIE5vdGFyaXplIHByb3NwZWN0dXMgKG9wdGlvbmFsKQogICAgLy8gc2VsZi5wcm9zcGVjdHVzX2hhc2ggPSBwcm9zcGVjdHVzLmhhc2guYnl0ZXMKICAgIGRpZyAyCiAgICBleHRyYWN0IDAgMzIKICAgIGJ5dGVjIDQyIC8vICJwcm9zcGVjdHVzX2hhc2giCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2OQogICAgLy8gc2VsZi5wcm9zcGVjdHVzX3VybCA9IHByb3NwZWN0dXMudXJsCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGVjIDQzIC8vICJwcm9zcGVjdHVzX3VybCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDcwCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAMTc6CiAgICBpbnRjXzAgLy8gMAogICAgYiBjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUAxOAoKY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAODoKICAgIGludGNfMCAvLyAwCiAgICBiIGNvbnRyYWN0X2NvbmZpZ19ib29sX21lcmdlQDkKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9zY2hlZHVsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X3NjaGVkdWxlOgogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDcyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHN3YXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBkdXAKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgMgogICAgKwogICAgdW5jb3ZlciAyCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLkV4ZWN1dGlvblNjaGVkdWxlRW50cnk+CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDg3CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwOTAKICAgIC8vIGNvbnRyYWN0X3R5cGU9c2VsZi5jb250cmFjdF90eXBlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGNvdmVyIDMKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4ODMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4ODQtODg2CiAgICAvLyBhc3NlcnQgc2NoZWR1bGVfcGFnZS5sZW5ndGggPD0gVUludDY0KAogICAgLy8gICAgIGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUKICAgIC8vICksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGR1cAogICAgcHVzaGludCAxNgogICAgPD0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg4NwogICAgLy8gYXNzZXJ0IHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPiBVSW50NjQoMCksIGVyci5URVJNU19OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSB0ZXJtcyBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODg5CiAgICAvLyBwYWdlX2N1cnNvciA9IHNjaGVkdWxlX3BhZ2VfaW5kZXggKiBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkKICAgIHN3YXAKICAgIHB1c2hpbnQgMTYKICAgICoKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg5NgogICAgLy8gKyBwYWdlX2xlbmd0aCAqIFVJbnQ2NChjc3QuT1BfVVBfQ09OVFJBQ1RfQ09ORklHX1BFUl9FTlRSWV9CVURHRVQpCiAgICBwdXNoaW50IDEwMAogICAgKgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODk1CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19CQVNFX0JVREdFVCkKICAgIGludGMgNCAvLyAxNTAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTUtODk2CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19CQVNFX0JVREdFVCkKICAgIC8vICsgcGFnZV9sZW5ndGggKiBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19QRVJfRU5UUllfQlVER0VUKQogICAgKwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODkxLTg5OAogICAgLy8gIyBWYWxpZGF0aW9uIGNvc3QgZ3Jvd3Mgd2l0aCBwYWdlIGxlbmd0aCwgc28gY29uZmlndXJhdGlvbiBleHBsaWNpdGx5CiAgICAvLyAjIGJ1eXMgZXh0cmEgb3Bjb2RlIGJ1ZGdldCBmb3IgbGFyZ2VyIHVwbG9hZHMuCiAgICAvLyBlbnN1cmVfYnVkZ2V0KAogICAgLy8gICAgIHJlcXVpcmVkX2J1ZGdldD0oCiAgICAvLyAgICAgICAgIFVJbnQ2NChjc3QuT1BfVVBfQ09OVFJBQ1RfQ09ORklHX0JBU0VfQlVER0VUKQogICAgLy8gICAgICAgICArIHBhZ2VfbGVuZ3RoICogVUludDY0KGNzdC5PUF9VUF9DT05UUkFDVF9DT05GSUdfUEVSX0VOVFJZX0JVREdFVCkKICAgIC8vICAgICApLAogICAgLy8gKQogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODk5CiAgICAvLyBpbmRleCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKCmNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEAyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTAwCiAgICAvLyB3aGlsZSBpbmRleCA8IHBhZ2VfbGVuZ3RoOgogICAgZHVwCiAgICBkaWcgNAogICAgPAogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfd2hpbGVAMTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkwMS05MDIKICAgIC8vIGVudHJ5ID0gc2NoZWR1bGVfcGFnZVtpbmRleF0uY29weSgpCiAgICAvLyBlbnRyeV9ldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZGlnIDQKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGJ1cnkgMTIKICAgIGRpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgNjUKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTAyCiAgICAvLyBlbnRyeV9ldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDEtOTAyCiAgICAvLyBlbnRyeSA9IHNjaGVkdWxlX3BhZ2VbaW5kZXhdLmNvcHkoKQogICAgLy8gZW50cnlfZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGludGNfMiAvLyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDIKICAgIC8vIGVudHJ5X2V2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBnZXRieXRlCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgMTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkwMwogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X2lkID09IHBhZ2VfY3Vyc29yICsgaW5kZXgsIGVyci5JTlZBTElEX0VWRU5UX0lECiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEzCiAgICBkaWcgNQogICAgdW5jb3ZlciA0CiAgICArCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDQtOTA2CiAgICAvLyBzZWxmLl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBlbnRyeV9ldmVudF90eXBlCiAgICAvLyApCiAgICBkaWcgNQogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTA3CiAgICAvLyBhc3NlcnQgZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgc3dhcAogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDgKICAgIC8vIGlmIGVudHJ5LmV2ZW50X2lkID4gVUludDY0KDApOgogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDkKICAgIC8vIGlmIGluZGV4ID4gVUludDY0KDApOgogICAgZHVwCiAgICBieiBjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlANgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTEwCiAgICAvLyBwcmV2aW91c19lbnRyeSA9IHNjaGVkdWxlX3BhZ2VbaW5kZXggLSBVSW50NjQoMSldLmNvcHkoKQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgcHVzaGludCA2NQogICAgKgogICAgZGlnIDExCiAgICBzd2FwCiAgICBwdXNoaW50IDY1CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkyNQogICAgLy8gcHJldmlvdXNfZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gZW50cnkuc2NoZWR1bGVkX3RpbWUKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyA4CiAgICA8PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTI0LTkyNgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBwcmV2aW91c19lbnRyeS5zY2hlZHVsZWRfdGltZSA8PSBlbnRyeS5zY2hlZHVsZWRfdGltZQogICAgLy8gKSwgZXJyLklOVkFMSURfU09SVElORwogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIG11c3QgYmUgc29ydGVkIGluIHN0cmljdGx5IGFzY2VuZGluZyBvcmRlcgoKY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUA4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTI3CiAgICAvLyBpZiBlbnRyeS5ldmVudF9pZCA9PSBVSW50NjQoMCk6CiAgICBkaWcgOAogICAgYm56IGNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkyOC05MzAKICAgIC8vIGFzc2VydCBlbnRyeV9ldmVudF90eXBlID09IFVJbnQ2NCgKICAgIC8vICAgICBlbnVtcy5FVlRfSUVECiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGRpZyA5CiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MzEKICAgIC8vIGluZGV4ICs9IFVJbnQ2NCgxKQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIGNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEAyCgpjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlANjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkxMi05MTQKICAgIC8vICMgVGhlIGZpcnN0IGVudHJ5IG9mIGEgcGFnZSBtdXN0IHN0aWxsIGJlIG9yZGVyZWQgYWZ0ZXIgdGhlCiAgICAvLyAjIGxhc3QgZW50cnkgb2YgdGhlIHByZXZpb3VzIHBhZ2UuCiAgICAvLyBhc3NlcnQgc2NoZWR1bGVfcGFnZV9pbmRleCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGRpZyA2CiAgICBkdXAKICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTUKICAgIC8vIHByZXZpb3VzX3BhZ2VfaW5kZXggPSBzY2hlZHVsZV9wYWdlX2luZGV4IC0gVUludDY0KDEpCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTE3CiAgICAvLyBwcmV2aW91c19wYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZQogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTYtOTE4CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHByZXZpb3VzX3BhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTktOTIwCiAgICAvLyBwcmV2aW91c19wYWdlID0gc2VsZi5zY2hlZHVsZV9wYWdlW3ByZXZpb3VzX3BhZ2VfaW5kZXhdLmNvcHkoKQogICAgLy8gYXNzZXJ0IHByZXZpb3VzX3BhZ2UubGVuZ3RoID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBwdXNoaW50IDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjAKICAgIC8vIGFzc2VydCBwcmV2aW91c19wYWdlLmxlbmd0aCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZHVwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjIKICAgIC8vIHByZXZpb3VzX3BhZ2UubGVuZ3RoIC0gVUludDY0KDEpCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTIxLTkyMwogICAgLy8gcHJldmlvdXNfZW50cnkgPSBwcmV2aW91c19wYWdlWwogICAgLy8gICAgIHByZXZpb3VzX3BhZ2UubGVuZ3RoIC0gVUludDY0KDEpCiAgICAvLyBdLmNvcHkoKQogICAgcHVzaGludCA2NQogICAgKgogICAgcHVzaGludCAyCiAgICArCiAgICBwdXNoaW50IDY1CiAgICBib3hfZXh0cmFjdAogICAgYiBjb250cmFjdF9zY2hlZHVsZV9hZnRlcl9pZl9lbHNlQDcKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX3doaWxlQDExOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjAwCiAgICAvLyBzZWxmLnNjaGVkdWxlX3BhZ2VbcGFnZV9pbmRleF0gPSBzY2hlZHVsZV9wYWdlLmNvcHkoKQogICAgZGlnIDYKICAgIGl0b2IKICAgIGJ5dGVjIDI0IC8vIDB4NTMyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgZGlnIDUKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzNAogICAgLy8gaWYgaXNfbGFzdF9wYWdlOgogICAgZGlnIDUKICAgIGJ6IGNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzNgogICAgLy8gc2NoZWR1bGVfcGFnZV9pbmRleCAqIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKSArIHBhZ2VfbGVuZ3RoCiAgICBkaWcgMQogICAgZGlnIDQKICAgICsKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzNQogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA9ICgKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTM1LTkzNwogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA9ICgKICAgIC8vICAgICBzY2hlZHVsZV9wYWdlX2luZGV4ICogVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpICsgcGFnZV9sZW5ndGgKICAgIC8vICkKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MzgKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgNTAKICAgIGFwcF9nbG9iYWxfcHV0Cgpjb250cmFjdF9zY2hlZHVsZV9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA5NQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDcyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9leGVjdXRlX2llZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X2V4ZWN1dGVfaWVkOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMDUKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEwNgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMDcKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTA5CiAgICAvLyBhc3NlcnQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LCBlcnIuSU5WQUxJRF9FVkVOVF9DVVJTT1IKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgZGlnIDEKICAgID4KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGN1cnNvcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTExMAogICAgLy8gZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoc2VsZi5ldmVudF9jdXJzb3IpCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMTEKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoZW51bXMuRVZUX0lFRCksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGR1cAogICAgZXh0cmFjdCA4IDEKICAgIGR1cAogICAgcHVzaGJ5dGVzIDB4MDEKICAgIGI9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTExNQogICAgLy8gZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICBkaWcgMQogICAgZXh0cmFjdCAwIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMTcKICAgIC8vIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgZGlnIDIKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTE4CiAgICAvLyBhY2NydWFsX2ZhY3Rvcj1lbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIGRpZyAzCiAgICBleHRyYWN0IDE3IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMTkKICAgIC8vIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIGRpZyA0CiAgICBleHRyYWN0IDI1IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMjEKICAgIC8vIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPWVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDUKICAgIGV4dHJhY3QgMzMgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEyMgogICAgLy8gbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgZGlnIDYKICAgIGV4dHJhY3QgNDEgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEyMwogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9ZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICBkaWcgNwogICAgZXh0cmFjdCA0OSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTI0CiAgICAvLyBmbGFncz1lbnRyeS5mbGFncywKICAgIGRpZyA4CiAgICBleHRyYWN0IDU3IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMTQtMTEyNQogICAgLy8gdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0KAogICAgLy8gICAgIGV2ZW50X2lkPWVudHJ5LmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1lbnRyeS5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1lbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPWVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9ZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPWVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGZsYWdzPWVudHJ5LmZsYWdzLAogICAgLy8gKSwKICAgIHVuY292ZXIgNwogICAgdW5jb3ZlciA4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNwogICAgY29uY2F0CiAgICB1bmNvdmVyIDYKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMjAKICAgIC8vIG9ic2VydmVkX3JhdGU9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMTQtMTEyNQogICAgLy8gdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0KAogICAgLy8gICAgIGV2ZW50X2lkPWVudHJ5LmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1lbnRyeS5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1lbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPWVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9ZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPWVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGZsYWdzPWVudHJ5LmZsYWdzLAogICAgLy8gKSwKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTEyLTExMjYKICAgIC8vIHNlbGYuX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5KAogICAgLy8gICAgIGVudHJ5LAogICAgLy8gICAgIHR5cC5PYnNlcnZlZEV2ZW50UmVxdWVzdCgKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPWVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIG9ic2VydmVkX3JhdGU9VUludDY0KDApLAogICAgLy8gICAgICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1lbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1lbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICAgICAgZmxhZ3M9ZW50cnkuZmxhZ3MsCiAgICAvLyAgICAgKSwKICAgIC8vICkKICAgIGNhbGxzdWIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5CiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMjcKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA5NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuYXBwbHlfbm9uX2Nhc2hfZXZlbnRbcm91dGluZ10oKSAtPiB2b2lkOgphcHBseV9ub25fY2FzaF9ldmVudDoKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDQKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTI5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cG4gMgogICAgbGVuCiAgICBwdXNoaW50IDczCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLk9ic2VydmVkRXZlbnRSZXF1ZXN0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE0MwogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDQKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTQ2CiAgICAvLyBpZiBwYXlsb2FkLmZsYWdzICYgVUludDY0KGVudW1zLkZMQUdfT0JTRVJWRURfRVZFTlQpOgogICAgcHVzaGludCA2NQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgcHVzaGludCA0CiAgICAmCiAgICBieiBhcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIzMwogICAgLy8gcmV0dXJuIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQ0xNKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICBwdXNoaW50IDUKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTQ3CiAgICAvLyBhc3NlcnQgc2VsZi5fc3VwcG9ydHNfb2JzZXJ2ZWRfZXZlbnRzKCksIGVyci5PQlNFUlZFRF9FVkVOVF9SRVFVSVJFRAogICAgYXNzZXJ0IC8vIE9ic2VydmVkIGV2ZW50IHJlcXVpcmVkIHRvIGV4ZWN1dGUgdGhpcyBhY3Rpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDgKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjMzCiAgICAvLyByZXR1cm4gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9DTE0pCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIGR1cAogICAgcHVzaGludCA1CiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQ3CiAgICAvLyBhc3NlcnQgc2VsZi5fc3VwcG9ydHNfb2JzZXJ2ZWRfZXZlbnRzKCksIGVyci5PQlNFUlZFRF9FVkVOVF9SRVFVSVJFRAogICAgYXNzZXJ0IC8vIE9ic2VydmVkIGV2ZW50IHJlcXVpcmVkIHRvIGV4ZWN1dGUgdGhpcyBhY3Rpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk0OAogICAgLy8gYXNzZXJ0IHBheWxvYWQuZXZlbnRfaWQgPT0gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGRpZyAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDcKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBpZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTUwCiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUsIHBheWxvYWQuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgYnVyeSAxMgogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk0OS05NTEKICAgIC8vIHNlbGYuX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIHNlbGYuY29udHJhY3RfdHlwZSwgcGF5bG9hZC5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICAvLyApCiAgICBjYWxsc3ViIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTUzCiAgICAvLyBwYWdlX2luZGV4ID0gc2VsZi5fc2NoZWR1bGVfcGFnZV9pbmRleChzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTkwCiAgICAvLyByZXR1cm4gZXZlbnRfaWQgLy8gVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpCiAgICBwdXNoaW50IDE2CiAgICAvCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTQKICAgIC8vIHBhZ2UgPSB0eXAuRXhlY3V0aW9uU2NoZWR1bGVQYWdlKCkKICAgIGJ5dGVjIDQ4IC8vIDB4MDAwMAogICAgYnVyeSA3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTUKICAgIC8vIGlmIHBhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlOgogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA5CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMjcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1NgogICAgLy8gcGFnZSA9IHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XS5jb3B5KCkKICAgIGRpZyA3CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidXJ5IDcKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX3BhZ2UgZW50cnkgZXhpc3RzCgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDI3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTU3CiAgICAvLyBhc3NlcnQgcGFnZS5sZW5ndGggPCBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGRpZyA1CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgMTYKICAgIDwKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2MgogICAgLy8gc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIGRpZyAzCiAgICBkdXAKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjMKICAgIC8vIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICBkaWcgMQogICAgZXh0cmFjdCAxNyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjQKICAgIC8vIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZGlnIDIKICAgIGV4dHJhY3QgMjUgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTY1CiAgICAvLyBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDMKICAgIGV4dHJhY3QgNDEgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTY2CiAgICAvLyBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIGRpZyA0CiAgICBleHRyYWN0IDQ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2NwogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIHVuY292ZXIgNQogICAgZXh0cmFjdCA1NyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTktOTY5CiAgICAvLyB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1wYXlsb2FkLmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9cGF5bG9hZC5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPXBheWxvYWQucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXBheWxvYWQubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICkKICAgIGRpZyAxMQogICAgaXRvYgogICAgZGlnIDE4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMwogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTgtOTcwCiAgICAvLyBwYWdlLmFwcGVuZCgKICAgIC8vICAgICB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9cGF5bG9hZC5ldmVudF9pZCwKICAgIC8vICAgICAgICAgZXZlbnRfdHlwZT1wYXlsb2FkLmV2ZW50X3R5cGUsCiAgICAvLyAgICAgICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIC8vICAgICAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICAgICApCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NzEKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHBhZ2UuY29weSgpCiAgICBkaWcgOAogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk3MgogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTUxCiAgICAvLyBhc3NlcnQgZXZlbnRfaWQgPT0gc2VsZi5ldmVudF9jdXJzb3IsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBjdXJzb3IKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTIKICAgIC8vIGVudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KGV2ZW50X2lkKQogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1NAogICAgLy8gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgYnVyeSAxMAogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjQKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY1CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzYzLTM3MAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9SUiksCiAgICBwdXNoaW50IDEyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY3CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICBwdXNoaW50IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY4CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgcHVzaGludCAxOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzYzLTM3MAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBieiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX2ZhbHNlQDE2CgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX3RydWVAMTU6CiAgICBpbnRjXzEgLy8gMQoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9tZXJnZUAxNzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTMtMTE1NQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2lzX25vbl9jYXNoKAogICAgLy8gICAgIGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIC8vICksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IHR5cGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTYKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlICE9IGFyYzQuVUludDgoZW51bXMuRVZUX0lFRCksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGRpZyA4CiAgICBwdXNoYnl0ZXMgMHgwMQogICAgYiE9CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCB0eXBlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNzQKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluIChVSW50NjQoZW51bXMuRVZUX1JSKSwgVUludDY0KGVudW1zLkVWVF9SUkYpKQogICAgZGlnIDQKICAgIHB1c2hpbnQgMTIKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDIxCiAgICBkaWcgNAogICAgcHVzaGludCAxMQogICAgPT0KICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfZmFsc2VAMjIKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAyMToKICAgIGludGNfMSAvLyAxCgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX21lcmdlQDIzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1NwogICAgLy8gaWYgc2VsZi5fZXZlbnRfaXNfcmF0ZV9yZXNldChlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpKToKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Vsc2VfYm9keUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODAKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLm9ic2VydmVyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjUgLy8gMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTYxCiAgICAvLyBzZWxmLl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeShlbnRyeSwgcGF5bG9hZCkKICAgIGRpZyA2CiAgICBkaWcgMgogICAgY2FsbHN1YiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkKICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE2MgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTI5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Vsc2VfYm9keUA1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE2MAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICBiIGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VANgoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9mYWxzZUAyMjoKICAgIGludGNfMCAvLyAwCiAgICBiIGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfbWVyZ2VAMjMKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfZmFsc2VAMTY6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX21lcmdlQDE3CgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuYXBwZW5kX29ic2VydmVkX2Nhc2hfZXZlbnRbcm91dGluZ10oKSAtPiB2b2lkOgphcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudDoKICAgIGludGNfMCAvLyAwCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBsZW4KICAgIHB1c2hpbnQgNjUKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuT2JzZXJ2ZWRDYXNoRXZlbnRSZXF1ZXN0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE3MgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTczCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE3NAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDcKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMzMKICAgIC8vIHJldHVybiBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0NMTSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgcHVzaGludCA1CiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTgxCiAgICAvLyBhc3NlcnQgc2VsZi5fc3VwcG9ydHNfb2JzZXJ2ZWRfZXZlbnRzKCksIGVyci5PQlNFUlZFRF9FVkVOVF9SRVFVSVJFRAogICAgYXNzZXJ0IC8vIE9ic2VydmVkIGV2ZW50IHJlcXVpcmVkIHRvIGV4ZWN1dGUgdGhpcyBhY3Rpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4MgogICAgLy8gYXNzZXJ0IHBheWxvYWQuZXZlbnRfaWQgPT0gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIHN3YXAKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgaWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4MwogICAgLy8gYXNzZXJ0IHBheWxvYWQuZXZlbnRfdHlwZSA9PSBhcmM0LlVJbnQ4KGVudW1zLkVWVF9QUiksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGRpZyAxCiAgICBleHRyYWN0IDggMQogICAgZHVwCiAgICBjb3ZlciAzCiAgICBwdXNoYnl0ZXMgMHgwMwogICAgYj09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCB0eXBlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5ODQKICAgIC8vIGFzc2VydCBwYXlsb2FkLmZsYWdzICYgVUludDY0KGVudW1zLkZMQUdfQ0FTSF9FVkVOVCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgc3dhcAogICAgcHVzaGludCA1NwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18xIC8vIDEKICAgICYKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4NgogICAgLy8gaWYgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA+IFVJbnQ2NCgwKToKICAgIGJ6IGFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTg3CiAgICAvLyBwcmV2aW91c19lbnRyeSA9IHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IC0gVUludDY0KDEpKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTg5CiAgICAvLyBwcmV2aW91c19lbnRyeS5zY2hlZHVsZWRfdGltZSA8PSBwYXlsb2FkLnNjaGVkdWxlZF90aW1lCiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgNAogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgPD0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4OC05OTAKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgcHJldmlvdXNfZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gcGF5bG9hZC5zY2hlZHVsZWRfdGltZQogICAgLy8gKSwgZXJyLklOVkFMSURfU09SVElORwogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIG11c3QgYmUgc29ydGVkIGluIHN0cmljdGx5IGFzY2VuZGluZyBvcmRlcgoKYXBwZW5kX29ic2VydmVkX2Nhc2hfZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTkyCiAgICAvLyBwYWdlX2luZGV4ID0gc2VsZi5fc2NoZWR1bGVfcGFnZV9pbmRleChzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTkwCiAgICAvLyByZXR1cm4gZXZlbnRfaWQgLy8gVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpCiAgICBwdXNoaW50IDE2CiAgICAvCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OTMKICAgIC8vIHBhZ2UgPSB0eXAuRXhlY3V0aW9uU2NoZWR1bGVQYWdlKCkKICAgIGJ5dGVjIDQ4IC8vIDB4MDAwMAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OTQKICAgIC8vIGlmIHBhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlOgogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA3CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VANQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTk1CiAgICAvLyBwYWdlID0gc2VsZi5zY2hlZHVsZV9wYWdlW3BhZ2VfaW5kZXhdLmNvcHkoKQogICAgZGlnIDUKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGJ1cnkgNgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfcGFnZSBlbnRyeSBleGlzdHMKCmFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5NgogICAgLy8gYXNzZXJ0IHBhZ2UubGVuZ3RoIDwgVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBkaWcgNAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBwdXNoaW50IDE2CiAgICA8CiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDAxCiAgICAvLyBzY2hlZHVsZWRfdGltZT1wYXlsb2FkLnNjaGVkdWxlZF90aW1lLAogICAgZGlnIDUKICAgIGR1cAogICAgZXh0cmFjdCA5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMDIKICAgIC8vIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICBkaWcgMQogICAgZXh0cmFjdCAxNyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDAzCiAgICAvLyByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPXBheWxvYWQucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIGRpZyAyCiAgICBleHRyYWN0IDI1IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMDQKICAgIC8vIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPXBheWxvYWQubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBkaWcgMwogICAgZXh0cmFjdCAzMyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDA1CiAgICAvLyBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIGRpZyA0CiAgICBleHRyYWN0IDQxIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMDYKICAgIC8vIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXBheWxvYWQubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICB1bmNvdmVyIDUKICAgIGV4dHJhY3QgNDkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTk4LTEwMDgKICAgIC8vIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgIGV2ZW50X2lkPXBheWxvYWQuZXZlbnRfaWQsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1wYXlsb2FkLmV2ZW50X3R5cGUsCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPXBheWxvYWQubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1wYXlsb2FkLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICBmbGFncz1wYXlsb2FkLmZsYWdzLAogICAgLy8gKQogICAgZGlnIDEwCiAgICBpdG9iCiAgICBkaWcgMTAKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5Ny0xMDA5CiAgICAvLyBwYWdlLmFwcGVuZCgKICAgIC8vICAgICB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9cGF5bG9hZC5ldmVudF9pZCwKICAgIC8vICAgICAgICAgZXZlbnRfdHlwZT1wYXlsb2FkLmV2ZW50X3R5cGUsCiAgICAvLyAgICAgICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIC8vICAgICAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICAgICApCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDEwCiAgICAvLyBzZWxmLnNjaGVkdWxlX3BhZ2VbcGFnZV9pbmRleF0gPSBwYWdlLmNvcHkoKQogICAgZGlnIDYKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDExCiAgICAvLyBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50ICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNzgKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE2NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfZ2V0X3N0YXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfZ2V0X3N0YXRlOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBkdXAKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE4NQogICAgLy8gY29udHJhY3RfdHlwZT1hcmM0LlVJbnQ4KHNlbGYuY29udHJhY3RfdHlwZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzIgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExODcKICAgIC8vIHRvdGFsX3VuaXRzPXNlbGYudG90YWxfdW5pdHMsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE4OAogICAgLy8gcmVzZXJ2ZWRfdW5pdHNfdG90YWw9c2VsZi5yZXNlcnZlZF91bml0c190b3RhbCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTg5CiAgICAvLyBpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudD1zZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExOTAKICAgIC8vIGV2ZW50X2N1cnNvcj1zZWxmLmV2ZW50X2N1cnNvciwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE5MQogICAgLy8gc2NoZWR1bGVfZW50cnlfY291bnQ9c2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExOTIKICAgIC8vIG91dHN0YW5kaW5nX3ByaW5jaXBhbD1zZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE5MwogICAgLy8gaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZT1zZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE5NAogICAgLy8gbm9taW5hbF9pbnRlcmVzdF9yYXRlPXNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTk1CiAgICAvLyBhY2NydWVkX2ludGVyZXN0PXNlbGYuYWNjcnVlZF9pbnRlcmVzdCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTk2CiAgICAvLyBjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4PXNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE5NwogICAgLy8gY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXg9c2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTk4CiAgICAvLyByZXNlcnZlZF9pbnRlcmVzdD1zZWxmLnJlc2VydmVkX2ludGVyZXN0LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExOTkKICAgIC8vIHJlc2VydmVkX3ByaW5jaXBhbD1zZWxmLnJlc2VydmVkX3ByaW5jaXBhbCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExODQtMTIwMAogICAgLy8gcmV0dXJuIHR5cC5LZXJuZWxTdGF0ZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlPWFyYzQuVUludDgoc2VsZi5jb250cmFjdF90eXBlKSwKICAgIC8vICAgICBzdGF0dXM9c2VsZi5zdGF0dXMsCiAgICAvLyAgICAgdG90YWxfdW5pdHM9c2VsZi50b3RhbF91bml0cywKICAgIC8vICAgICByZXNlcnZlZF91bml0c190b3RhbD1zZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsLAogICAgLy8gICAgIGluaXRpYWxfZXhjaGFuZ2VfYW1vdW50PXNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQsCiAgICAvLyAgICAgZXZlbnRfY3Vyc29yPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgLy8gICAgIHNjaGVkdWxlX2VudHJ5X2NvdW50PXNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQsCiAgICAvLyAgICAgb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2U9c2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlLAogICAgLy8gICAgIG5vbWluYWxfaW50ZXJlc3RfcmF0ZT1zZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBhY2NydWVkX2ludGVyZXN0PXNlbGYuYWNjcnVlZF9pbnRlcmVzdCwKICAgIC8vICAgICBjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4PXNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCwKICAgIC8vICAgICBjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleD1zZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4LAogICAgLy8gICAgIHJlc2VydmVkX2ludGVyZXN0PXNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QsCiAgICAvLyAgICAgcmVzZXJ2ZWRfcHJpbmNpcGFsPXNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsLAogICAgLy8gKQogICAgdW5jb3ZlciAxNAogICAgaXRvYgogICAgdW5jb3ZlciAxNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDEzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDEwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgOQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDgKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnRbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIwNgogICAgLy8gaWYgc2VsZi5ldmVudF9jdXJzb3IgPj0gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgPj0KICAgIGJ6IGNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMDgKICAgIC8vIGV2ZW50X2lkPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjA3LTEyMTcKICAgIC8vIHJldHVybiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1zZWxmLmV2ZW50X2N1cnNvciwKICAgIC8vICAgICBldmVudF90eXBlPWFyYzQuVUludDgoMCksCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9VUludDY0KDApLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9VUludDY0KDApLAogICAgLy8gICAgIGZsYWdzPVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGl0b2IKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMDkKICAgIC8vIGV2ZW50X3R5cGU9YXJjNC5VSW50OCgwKSwKICAgIGJ5dGVjIDQwIC8vIDB4MDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMDctMTIxNwogICAgLy8gcmV0dXJuIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgIGV2ZW50X2lkPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgLy8gICAgIGV2ZW50X3R5cGU9YXJjNC5VSW50OCgwKSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1VSW50NjQoMCksCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1VSW50NjQoMCksCiAgICAvLyAgICAgZmxhZ3M9VUludDY0KDApLAogICAgLy8gKQogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjEwCiAgICAvLyBzY2hlZHVsZWRfdGltZT1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIwNy0xMjE3CiAgICAvLyByZXR1cm4gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkoCiAgICAvLyAgICAgZXZlbnRfaWQ9c2VsZi5ldmVudF9jdXJzb3IsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1hcmM0LlVJbnQ4KDApLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPVVJbnQ2NCgwKSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249VUludDY0KDApLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPVVJbnQ2NCgwKSwKICAgIC8vICAgICBmbGFncz1VSW50NjQoMCksCiAgICAvLyApCiAgICBpdG9iCiAgICBzd2FwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKCmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudF9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudEA0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIwMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpjb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIxOAogICAgLy8gcmV0dXJuIHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLmV2ZW50X2N1cnNvcikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjAyCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50QDQKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5jb250cmFjdF91cGRhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF91cGRhdGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTUzLTE1NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGdyYW50cyB0aGUgdXBkYXRlIHBlcm1pc3Npb25zIHRvIHRoZSBBcnJhbmdlci4KICAgIC8vICMg4pqg77iPIFdBUk5JTkc6IEFwcGxpY2F0aW9uIHVwZGF0ZXMgbXVzdCBiZSBleGVjdXRlZCBWRVJZIGNhcmVmdWxseSwgYXMgdGhleQogICAgLy8gIyBtaWdodCBpbnRyb2R1Y2UgYnJlYWtpbmcgY2hhbmdlcy4KICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfcm90YXRlX2FycmFuZ2VyW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19yb3RhdGVfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2OQogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTcwCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gbmV3X2FycmFuZ2VyCiAgICBieXRlYyAxOCAvLyAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTcxCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfc2V0X29wX2RhZW1vbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfc2V0X29wX2RhZW1vbjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTg0CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODUKICAgIC8vIHNlbGYub3BfZGFlbW9uLnZhbHVlID0gYWRkcmVzcwogICAgYnl0ZWMgMjYgLy8gMHg1MjIzNGY3MDQ0NjE2NTZkNmY2ZTIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4NgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTczCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2Fzc2lnbl9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19hc3NpZ25fcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDE2CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLlJvbGVWYWxpZGl0eQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjExCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMgogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgcHVzaGludCAyMAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTAzCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gcm9sZV9hZGRyZXNzCiAgICBieXRlYyAxOCAvLyAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMKICAgIGRpZyAzCiAgICBhcHBfZ2xvYmFsX3B1dAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTQKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDYKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIGR1cAogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnRfbWFuYWdlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMyAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwOAogICAgLy8gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMiAvLyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTIKICAgIC8vIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIGR1cAogICAgcHVzaGludCA2MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE1CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMzIgLy8gMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE2CiAgICAvLyBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExOAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMSAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIwCiAgICAvLyBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMwogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgODAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIzCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI1IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI0CiAgICAvLyBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3Jldm9rZV9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19yZXZva2Vfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzUKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzNgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzcKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCkpCiAgICBidG9pCiAgICBkdXBuIDIKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCAhPSBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksIGVyci5JTlZBTElEX1JPTEUKICAgIGR1cAogICAgcHVzaGludCAyMAogICAgIT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyOAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIzIC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0NGQ2MTZlNjE2NzY1NzIyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMwCiAgICAvLyBkZWwgc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzOQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjE2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIyIC8vIDB4NTIyMzUwNzI2OTZkNjE3Mjc5NDQ2NTYxNmM2NTcyMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNAogICAgLy8gZGVsIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjM4CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIGR1cAogICAgcHVzaGludCA2MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAzMiAvLyAweDUyMjM1NDcyNzU3Mzc0NjU2NTIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzgKICAgIC8vIGRlbCBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjM4CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDEKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hdXRob3JpdHksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjEgLy8gMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MgogICAgLy8gZGVsIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzOAogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDQKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDgwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI1IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ2CiAgICAvLyBkZWwgc2VsZi5vYnNlcnZlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfY29udHJhY3Rfc3VzcGVuc2lvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfY29udHJhY3Rfc3VzcGVuc2lvbjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCAgIyBUT0RPOiBVcGRhdGUgc3BlY3MgYW5kIGFkZCB0ZXN0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojc3CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyMSAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1NwogICAgLy8gc2VsZi5hc3NldF9zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGJ5dGVjIDMzIC8vICJhc3NldF9zdXNwZW5kZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1OAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QgICMgVE9ETzogVXBkYXRlIHNwZWNzIGFuZCBhZGQgdGVzdAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X2FycmFuZ2VyW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjY4CiAgICAvLyByZXR1cm4gc2VsZi5hcnJhbmdlci52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE4IC8vIDB4NTIyMzQxNzI3MjYxNmU2NzY1NzIyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI2MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYWRkcmVzc19yb2xlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjcwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4NAogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hY2NvdW50X21hbmFnZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjMgLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQ0ZDYxNmU2MTY3NjU3MjIzCiAgICBkaWcgMQogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODUKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYucHJpbWFyeV9kZWFsZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjIgLy8gMHg1MjIzNTA3MjY5NmQ2MTcyNzk0NDY1NjE2YzY1NzIyMwogICAgZGlnIDIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg2CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnRydXN0ZWUsIGFkZHJlc3MpLAogICAgYnl0ZWMgMzIgLy8gMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMwogICAgZGlnIDMKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg3CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgYWRkcmVzcyksCiAgICBieXRlYyAyMSAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgZGlnIDQKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg4CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLm9ic2VydmVyLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDI1IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgdW5jb3ZlciA1CiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlYyA0MCAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciA2CiAgICBzZXRiaXQKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDUKICAgIHNldGJpdAogICAgcHVzaGludCAyCiAgICB1bmNvdmVyIDQKICAgIHNldGJpdAogICAgcHVzaGludCAzCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgcHVzaGludCA0CiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwNQogICAgLy8gcm9sZSA9IHJvbGVfaWQuYXNfdWludDY0KCkKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDYKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGUpCiAgICBkdXAKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA4CiAgICAvLyBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKToKICAgIHB1c2hpbnRzIDIwIDQwIDUwIDYwIDcwIDgwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA3LTMzOAogICAgLy8gbWF0Y2ggcm9sZToKICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKToKICAgIC8vICAgICAgICAgcmV0dXJuIHR5cC5Sb2xlVmFsaWRpdHkoCiAgICAvLyAgICAgICAgICAgICByb2xlX3ZhbGlkaXR5X3N0YXJ0PVVJbnQ2NCgwKSwgcm9sZV92YWxpZGl0eV9lbmQ9VUludDY0KDApCiAgICAvLyAgICAgICAgICkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSk6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSk6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgXzoKICAgIC8vICAgICAgICAgb3AuZXJyKGVyci5JTlZBTElEX1JPTEUpCiAgICB1bmNvdmVyIDYKICAgIG1hdGNoIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMEAyIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMUAzIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMkA0IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfM0A1IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNEA2IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzM4CiAgICAvLyBvcC5lcnIoZXJyLklOVkFMSURfUk9MRSkKICAgIGVyciAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV81QDc6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzM0CiAgICAvLyBzZWxmLm9ic2VydmVyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDI1IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMzMy0zMzUKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLm9ic2VydmVyLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzYKICAgIC8vIHJldHVybiBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV80QDY6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI5CiAgICAvLyBzZWxmLmF1dGhvcml0eSwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAyMSAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOC0zMzAKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLmF1dGhvcml0eSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzMxCiAgICAvLyByZXR1cm4gc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8zQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI0CiAgICAvLyBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMzIgLy8gMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMy0zMjUKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyNgogICAgLy8gcmV0dXJuIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzJANDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTkKICAgIC8vIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMjIgLy8gMHg1MjIzNTA3MjY5NmQ2MTcyNzk0NDY1NjE2YzY1NzIyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxOC0zMjAKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLnByaW1hcnlfZGVhbGVyLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjEKICAgIC8vIHJldHVybiBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMUAzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxNAogICAgLy8gc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMjMgLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQ0ZDYxNmU2MTY3NjU3MjIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEzLTMxNQogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTYKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzBAMjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDktMzExCiAgICAvLyByZXR1cm4gdHlwLlJvbGVWYWxpZGl0eSgKICAgIC8vICAgICByb2xlX3ZhbGlkaXR5X3N0YXJ0PVVJbnQ2NCgwKSwgcm9sZV92YWxpZGl0eV9lbmQ9VUludDY0KDApCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB2b2lkOgpfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZDoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNgogICAgLy8gZGVmIF9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHNlbGYsIGhvbGRpbmdfYWRkcmVzczogQWNjb3VudCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI4CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZCwgZXJyLlNVU1BFTkRFRAogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHB1c2hpbnQgMzg0CiAgICBnZXRiaXQKICAgICEKICAgIGFzc2VydCAvLyBTdXNwZW5kZWQgb3BlcmF0aW9ucwogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuX3NldHRsZV9wb3NpdGlvbihob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB1aW50NjQsIHVpbnQ2NDoKX3NldHRsZV9wb3NpdGlvbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo0NAogICAgLy8gZGVmIF9zZXR0bGVfcG9zaXRpb24oc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50KSAtPiB0dXBsZVtVSW50NjQsIFVJbnQ2NF06CiAgICBwcm90byAxIDIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NjEKICAgIC8vIHBvc2l0aW9uID0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY29weSgpCiAgICBkdXAKICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjYzLTY1CiAgICAvLyAjIENvbXB1dGUgdGhlIGluY3JlbWVudGFsIHBlci11bml0IGZpeGVkLXBvaW50IGludGVyZXN0IGFuZCBwcmluY2lwYWwgYWNjcnVlZAogICAgLy8gIyBzaW5jZSB0aGlzIGFjY291bnQncyBsYXN0IGNoZWNrcG9pbnQuCiAgICAvLyBpbnRlcmVzdF9kZWx0YSA9IHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCAtIHBvc2l0aW9uLmludGVyZXN0X2NoZWNrcG9pbnQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IGV4aXN0cwogICAgZGlnIDEKICAgIHB1c2hpbnQgNTcKICAgIGV4dHJhY3RfdWludDY0CiAgICAtCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NjcKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggLSBwb3NpdGlvbi5wcmluY2lwYWxfY2hlY2twb2ludAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCBleGlzdHMKICAgIGRpZyAyCiAgICBwdXNoaW50IDY1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjczCiAgICAvLyBpbnRlcmVzdF9kZWx0YSwgcG9zaXRpb24udW5pdHMsIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUKICAgIGRpZyAyCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzAtNzQKICAgIC8vICMgQ29udmVydCB0aGUgcGVyLXVuaXQgZml4ZWQtcG9pbnQgZGVsdGFzIGludG8gYWJzb2x1dGUgY2xhaW1hYmxlIGFtb3VudHMKICAgIC8vICMgdXNpbmcgdGhlIGFjY291bnQncyBhY3RpdmUgdW5pdHMuCiAgICAvLyBjbGFpbWFibGVfaW50ZXJlc3QgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBpbnRlcmVzdF9kZWx0YSwgcG9zaXRpb24udW5pdHMsIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUKICAgIC8vICkKICAgIHVuY292ZXIgMwogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3NgogICAgLy8gcHJpbmNpcGFsX2RlbHRhLCBwb3NpdGlvbi51bml0cywgc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojc1LTc3CiAgICAvLyBjbGFpbWFibGVfcHJpbmNpcGFsID0gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgcHJpbmNpcGFsX2RlbHRhLCBwb3NpdGlvbi51bml0cywgc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgLy8gKQogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3OS04MQogICAgLy8gIyBBY2NydWUgdGhlIGNsYWltYWJsZSBhbW91bnRzIHRvIHRoZSBhY2NvdW50IHBvc2l0aW9uIGFuZCBtYWtlIHRoZW0gYXZhaWxhYmxlCiAgICAvLyAjIGZvciB3aXRoZHJhd2FsLgogICAgLy8gcG9zaXRpb24uY2xhaW1hYmxlX2ludGVyZXN0ICs9IGNsYWltYWJsZV9pbnRlcmVzdAogICAgZGlnIDIKICAgIHB1c2hpbnQgNzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgKwogICAgaXRvYgogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICByZXBsYWNlMiA3MwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjgyCiAgICAvLyBwb3NpdGlvbi5jbGFpbWFibGVfcHJpbmNpcGFsICs9IGNsYWltYWJsZV9wcmluY2lwYWwKICAgIGR1cAogICAgcHVzaGludCA4MQogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICArCiAgICBpdG9iCiAgICByZXBsYWNlMiA4MQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojg0LTg2CiAgICAvLyAjIEFkdmFuY2UgdGhlIGFjY291bnQncyBwZXItdW5pdCBmaXhlZC1wb2ludCBjaGVja3BvaW50cyB0byB0aGUgY3VycmVudCBnbG9iYWwKICAgIC8vICMgcGVyLXVuaXQgZml4ZWQtcG9pbnQgZ2xvYmFsIGluZGljZXMuCiAgICAvLyBwb3NpdGlvbi5pbnRlcmVzdF9jaGVja3BvaW50ID0gc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCBleGlzdHMKICAgIGl0b2IKICAgIHJlcGxhY2UyIDU3CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6ODcKICAgIC8vIHBvc2l0aW9uLnByaW5jaXBhbF9jaGVja3BvaW50ID0gc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCBleGlzdHMKICAgIGl0b2IKICAgIHJlcGxhY2UyIDY1CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6ODktOTAKICAgIC8vICMgQWR2YW5jZSB0aGUgYWNjb3VudCdzIGV2ZW50IGN1cnNvciB0byB0aGUgY3VycmVudCBnbG9iYWwgZXZlbnQgY3Vyc29yLgogICAgLy8gcG9zaXRpb24uc2V0dGxlZF9jdXJzb3IgPSBzZWxmLmV2ZW50X2N1cnNvcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpdG9iCiAgICByZXBsYWNlMiA0OQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjkyLTk0CiAgICAvLyAjIFVwZGF0ZSB0aGUgYWNjb3VudCBwb3NpdGlvbiBhbmQgcmV0dXJuIHRoZSBuZXdseSBhY2NydWVkIGNsYWltYWJsZSBhbW91bnRzCiAgICAvLyAjIGFkZGVkIHRvIHRoZSB0b3RhbCBwb3NpdGlvbidzIGNsYWltYWJsZSBhbW91bnRzLgogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSBwb3NpdGlvbi5jb3B5KCkKICAgIHVuY292ZXIgMwogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojk1CiAgICAvLyByZXR1cm4gY2xhaW1hYmxlX2ludGVyZXN0LCBjbGFpbWFibGVfcHJpbmNpcGFsCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5fZW5zdXJlX3VuaXRzX2FjdGl2YXRlZChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB2b2lkOgpfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZDoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo5NwogICAgLy8gZGVmIF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKHNlbGYsIGhvbGRpbmdfYWRkcmVzczogQWNjb3VudCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTAwCiAgICAvLyBpZiBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKToKICAgIGJ6IF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwMQogICAgLy8gcmV0dXJuCiAgICByZXRzdWIKCl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDMKICAgIC8vIHBvc2l0aW9uID0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY29weSgpCiAgICBmcmFtZV9kaWcgMgogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA0CiAgICAvLyBpZiBwb3NpdGlvbi5yZXNlcnZlZF91bml0cyA9PSBVSW50NjQoMCk6CiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIGJueiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZF9hZnRlcl9pZl9lbHNlQDQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDUKICAgIC8vIHJldHVybgogICAgcmV0c3ViCgpfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZF9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA4CiAgICAvLyBwb3NpdGlvbi51bml0cyArPSBhY3RpdmF0ZWRfdW5pdHMKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDMKICAgICsKICAgIGl0b2IKICAgIHJlcGxhY2UyIDMyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA5CiAgICAvLyBwb3NpdGlvbi5yZXNlcnZlZF91bml0cyA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGl0b2IKICAgIHJlcGxhY2UyIDQwCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTEwCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHBvc2l0aW9uLmNvcHkoKQogICAgZnJhbWVfZGlnIDIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTEKICAgIC8vIGFzc2VydCBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID49IGFjdGl2YXRlZF91bml0cywgZXJyLk9WRVJfRElTVFJJQlVUSU9OCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIGV4aXN0cwogICAgZHVwCiAgICBkaWcgMgogICAgPj0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgcmVtYWluaW5nIEQtQVNBIHVuaXRzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTEyCiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIC09IGFjdGl2YXRlZF91bml0cwogICAgc3dhcAogICAgLQogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9zY2FsZWRfbXVsX2RpdihtdWx0aXBsaWNhbmQ6IHVpbnQ2NCwgbXVsdGlwbGllcjogdWludDY0LCBkaXZpc29yOiB1aW50NjQpIC0+IHVpbnQ2NDoKX3NjYWxlZF9tdWxfZGl2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTUzLTE1NQogICAgLy8gZGVmIF9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLCBtdWx0aXBsaWNhbmQ6IFVJbnQ2NCwgbXVsdGlwbGllcjogVUludDY0LCBkaXZpc29yOiBVSW50NjQKICAgIC8vICkgLT4gVUludDY0OgogICAgcHJvdG8gMyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTcKICAgIC8vIGlmIG11bHRpcGxpY2FuZCA9PSBVSW50NjQoMCkgb3IgbXVsdGlwbGllciA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTMKICAgIGJ6IF9zY2FsZWRfbXVsX2Rpdl9pZl9ib2R5QDIKICAgIGZyYW1lX2RpZyAtMgogICAgYm56IF9zY2FsZWRfbXVsX2Rpdl9hZnRlcl9pZl9lbHNlQDMKCl9zY2FsZWRfbXVsX2Rpdl9pZl9ib2R5QDI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTgKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9zY2FsZWRfbXVsX2Rpdl9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTkKICAgIC8vIGhpZ2gsIGxvdyA9IG9wLm11bHcobXVsdGlwbGljYW5kLCBtdWx0aXBsaWVyKQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIG11bHcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2MAogICAgLy8gcmV0dXJuIG9wLmRpdncoaGlnaCwgbG93LCBkaXZpc29yKQogICAgZnJhbWVfZGlnIC0xCiAgICBkaXZ3CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYW1vdW50X3RvX2luZGV4X2RlbHRhKGFtb3VudDogdWludDY0KSAtPiB1aW50NjQ6Cl9hbW91bnRfdG9faW5kZXhfZGVsdGE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjIKICAgIC8vIGRlZiBfYW1vdW50X3RvX2luZGV4X2RlbHRhKHNlbGYsIGFtb3VudDogVUludDY0KSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2NAogICAgLy8gaWYgYW1vdW50ID09IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMQogICAgYm56IF9hbW91bnRfdG9faW5kZXhfZGVsdGFfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjUKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9hbW91bnRfdG9faW5kZXhfZGVsdGFfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTY2CiAgICAvLyBhc3NlcnQgc2VsZi50b3RhbF91bml0cyA+IFVJbnQ2NCgwKSwgZXJyLk5PX1VOSVRTCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgZHVwCiAgICBhc3NlcnQgLy8gTm8gRC1BU0EgdW5pdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2NwogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KGFtb3VudCwgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwgc2VsZi50b3RhbF91bml0cykKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2luZGV4X2RlbHRhX3RvX2Ftb3VudChpbmRleF9kZWx0YTogdWludDY0KSAtPiB1aW50NjQ6Cl9pbmRleF9kZWx0YV90b19hbW91bnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjkKICAgIC8vIGRlZiBfaW5kZXhfZGVsdGFfdG9fYW1vdW50KHNlbGYsIGluZGV4X2RlbHRhOiBVSW50NjQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTc2CiAgICAvLyBpZiBpbmRleF9kZWx0YSA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGJueiBfaW5kZXhfZGVsdGFfdG9fYW1vdW50X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTc3CiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfaW5kZXhfZGVsdGFfdG9fYW1vdW50X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE3OQogICAgLy8gc2VsZi50b3RhbF91bml0cywKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxODEKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNzgtMTgyCiAgICAvLyByZXR1cm4gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgc2VsZi50b3RhbF91bml0cywKICAgIC8vICAgICBpbmRleF9kZWx0YSwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2dldF9zY2hlZHVsZV9lbnRyeShldmVudF9pZDogdWludDY0KSAtPiBieXRlczoKX2dldF9zY2hlZHVsZV9lbnRyeToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIwMgogICAgLy8gZGVmIF9nZXRfc2NoZWR1bGVfZW50cnkoc2VsZiwgZXZlbnRfaWQ6IFVJbnQ2NCkgLT4gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnk6CiAgICBwcm90byAxIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIwNAogICAgLy8gYXNzZXJ0IGV2ZW50X2lkIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgPgogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgaWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE5MAogICAgLy8gcmV0dXJuIGV2ZW50X2lkIC8vIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDE2CiAgICAvCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMDYKICAgIC8vIGFzc2VydCBwYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxOTQKICAgIC8vIHJldHVybiBldmVudF9pZCAlIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDE2CiAgICAlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMDkKICAgIC8vIGFzc2VydCBvZmZzZXQgPCBwYWdlLmxlbmd0aCwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBwdXNoaW50IDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgMQogICAgPgogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjEwCiAgICAvLyByZXR1cm4gcGFnZVtvZmZzZXRdLmNvcHkoKQogICAgcHVzaGludCA2NQogICAgKgogICAgcHVzaGludCAyCiAgICArCiAgICBwdXNoaW50IDY1CiAgICBib3hfZXh0cmFjdAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKGNvbnRyYWN0X3R5cGU6IHVpbnQ2NCwgZXZlbnRfdHlwZTogdWludDY0KSAtPiB2b2lkOgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTMtMzE1CiAgICAvLyBkZWYgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIHNlbGYsIGNvbnRyYWN0X3R5cGU6IFVJbnQ2NCwgZXZlbnRfdHlwZTogVUludDY0CiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNDcKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNDgKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgaW50Y18yIC8vIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI0OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9NRCksCiAgICBwdXNoaW50IDE5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTAKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgcHVzaGludCAxMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU0LTI1NQogICAgLy8gIyBDaGVjayBjb21tb24gZXZlbnRzIGZpcnN0CiAgICAvLyBpZiBldmVudF90eXBlIGluIGNvbW1vbl9ldmVudHM6CiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjUxCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICBwdXNoaW50IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUA3CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU2CiAgICAvLyByZXR1cm4gVHJ1ZQogICAgaW50Y18xIC8vIDEKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICByZXRzdWIKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTgtMjU5CiAgICAvLyAjIENvbnRyYWN0LXNwZWNpZmljIGFkZGl0aW9uYWwgZXZlbnRzCiAgICAvLyBpZiBjb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9QQU0pOgogICAgZnJhbWVfZGlnIC0yCiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjYwLTI2MQogICAgLy8gIyBQQU0gb25seSBzdXBwb3J0cyBjb21tb24gZXZlbnRzCiAgICAvLyByZXR1cm4gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNjMKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0xBTSkgb3IgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2My0yNjUKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0xBTSkgb3IgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoCiAgICAvLyAgICAgZW51bXMuQ1RfTkFNCiAgICAvLyApOgogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDExCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMgogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDE2CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUAxMToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2Ni0yNzAKICAgIC8vICMgTEFNL05BTSBhZGQ6IFBSLCBJUENCCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjY4CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjY2LTI3MAogICAgLy8gIyBMQU0vTkFNIGFkZDogUFIsIElQQ0IKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDEzCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIHB1c2hpbnQgMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2Ni0yNzAKICAgIC8vICMgTEFNL05BTSBhZGQ6IFBSLCBJUENCCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICkKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF9mYWxzZUAxNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAxMzoKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDE0OgogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMTY6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzIKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTik6CiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMjMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3My0yNzgKICAgIC8vICMgQU5OIGFkZHM6IFBSLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjc1CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjczLTI3OAogICAgLy8gIyBBTk4gYWRkczogUFIsIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDIwCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIHB1c2hpbnQgMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3My0yNzgKICAgIC8vICMgQU5OIGFkZHM6IFBSLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyMAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzcKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIHB1c2hpbnQgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjczLTI3OAogICAgLy8gIyBBTk4gYWRkczogUFIsIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDIxCgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDIwOgogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMjE6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAyMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MAogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfTEFYKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA0CiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMzEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MS0yODcKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MwogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUiksCiAgICBwdXNoaW50IDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MS0yODcKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjgKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjg0CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjgxLTI4NwogICAgLy8gIyBMQVggYWRkczogUFIsIFBJLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyOAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODUKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICBwdXNoaW50IDE4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODEtMjg3CiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDI4CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODEtMjg3CiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDI5CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDI4OgogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMjk6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAzMToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4OQogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQ0xNKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA1CiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMzMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI5MC0yOTEKICAgIC8vICMgQ0xNIGFkZHM6IFBSCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1BSKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDMKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDMzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjkzCiAgICAvLyByZXR1cm4gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5faXNfZHluYW1pY19hbm51aXR5KCkgLT4gdWludDY0OgpfaXNfZHluYW1pY19hbm51aXR5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM1CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzUtMzM2CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIC8vIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGJ6IF9pc19keW5hbWljX2FubnVpdHlfYm9vbF9mYWxzZUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzYKICAgIC8vIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzNCAvLyAiZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM1LTMzNgogICAgLy8gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICAvLyBhbmQgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBieiBfaXNfZHluYW1pY19hbm51aXR5X2Jvb2xfZmFsc2VAMwogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMzNC0zMzcKICAgIC8vIHJldHVybiAoCiAgICAvLyAgICAgc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICAvLyAgICAgYW5kIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgLy8gKQogICAgcmV0c3ViCgpfaXNfZHluYW1pY19hbm51aXR5X2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzQtMzM3CiAgICAvLyByZXR1cm4gKAogICAgLy8gICAgIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKQogICAgLy8gICAgIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIC8vICkKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KGVudHJ5OiBieXRlcykgLT4gdWludDY0LCBieXRlczoKX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozODAKICAgIC8vIGRlZiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudChzZWxmLCBlbnRyeTogdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5CiAgICAvLyBlbnRyeS5hY2NydWFsX2ZhY3RvciA9PSBVSW50NjQoMCkKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAxNwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5LTM5MQogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGJ6IF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2lmX2JvZHlAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzkwCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5LTM5MQogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGJ6IF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2lmX2JvZHlAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzkxCiAgICAvLyBvciBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPT0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5LTM5MQogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGJueiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudF9hZnRlcl9pZl9lbHNlQDQKCl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2lmX2JvZHlAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5MwogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2RpZyAtMQogICAgdW5jb3ZlciAyCiAgICByZXRzdWIKCl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NQogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NgogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NC0zOTgKICAgIC8vIGFjY3J1ZWQgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICAvLyAgICAgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICkKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MDIKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozOTktNDAzCiAgICAvLyByZXR1cm4gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgYWNjcnVlZCwKICAgIC8vICAgICBlbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICBmcmFtZV9kaWcgLTEKICAgIHVuY292ZXIgMgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yKGRpc2NvdW50X2ZhY3RvcjogdWludDY0LCByZWRlbXB0aW9uX2ZhY3RvcjogdWludDY0KSAtPiB1aW50NjQ6Cl9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ2Mi00NjYKICAgIC8vIGRlZiBfZGlzY291bnRfYW5udWl0eV9mYWN0b3IoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBkaXNjb3VudF9mYWN0b3I6IFVJbnQ2NCwKICAgIC8vICAgICByZWRlbXB0aW9uX2ZhY3RvcjogVUludDY0LAogICAgLy8gKSAtPiBVSW50NjQ6CiAgICBwcm90byAyIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ2OAogICAgLy8gaWYgcmVkZW1wdGlvbl9mYWN0b3IgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0xCiAgICBibnogX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDY5CiAgICAvLyByZXR1cm4gZGlzY291bnRfZmFjdG9yCiAgICBmcmFtZV9kaWcgLTIKICAgIHJldHN1YgoKX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3MAogICAgLy8gcGVyaW9kX3JhdGUgPSBzZWxmLmZpeGVkX3BvaW50X3NjYWxlICsgc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzEKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzAtNDc0CiAgICAvLyBwZXJpb2RfcmF0ZSA9IHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgKyBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICByZWRlbXB0aW9uX2ZhY3RvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICBkaWcgMgogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgICsKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3NQogICAgLy8gYXNzZXJ0IHBlcmlvZF9yYXRlID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGR1cAogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDc4CiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDc2LTQ4MAogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIGRpc2NvdW50X2ZhY3RvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gICAgIHBlcmlvZF9yYXRlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkoZW50cnk6IGJ5dGVzLCBwYXlsb2FkOiBieXRlcykgLT4gYnl0ZXMsIGJ5dGVzOgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MTMtNjE1CiAgICAvLyBkZWYgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5KAogICAgLy8gICAgIHNlbGYsIGVudHJ5OiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSwgcGF5bG9hZDogdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0CiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAyIDIKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjIzCiAgICAvLyBhc3NlcnQgZW50cnkuZXZlbnRfaWQgPT0gc2VsZi5ldmVudF9jdXJzb3IsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGN1cnNvcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjI0CiAgICAvLyBhc3NlcnQgZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsIGVyci5OT19EVUVfQ0FTSEZMT1cKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPD0KICAgIGFzc2VydCAvLyBObyBkdWUgY2FzaGZsb3cgdG8gcGF5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MjYKICAgIC8vIGV2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYyNwogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX0lFRCk6CiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGR1cAogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYyOC02MzAKICAgIC8vICMgSUVEIGZpbmFsaXplcyBpc3N1YW5jZTogcmVzZXJ2ZWQgdW5pdHMgYmVjb21lIGFjdGl2YXRhYmxlIGFuZCB0aGUKICAgIC8vICMgc2NoZWR1bGUncyBpbml0aWFsIGNvbnRyYWN0dWFsIHN0YXRlIGJlY29tZXMgbGl2ZS4KICAgIC8vIGFzc2VydCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzIKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPT0gc2VsZi50b3RhbF91bml0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjMxLTYzMwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID09IHNlbGYudG90YWxfdW5pdHMKICAgIC8vICksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9JTkNPTVBMRVRFCiAgICBhc3NlcnQgLy8gUHJpbWFyeSBkaXN0cmlidXRpb24gaXMgbm90IGNvbXBsZXRlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzQKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM1CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzYKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAzMwogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzcKICAgIC8vIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM4CiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzkKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0MAogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX0FDVElWRSkKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgMTAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDUxCiAgICAvLyBhc3NlcnQgZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSA9PSBVSW50NjQoZW51bXMuRVZUX0lFRCksIGVyci5OT1RfRVZUX0lFRAogICAgZnJhbWVfZGlnIDExCiAgICBhc3NlcnQgLy8gTm90IElFRCBldmVudAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDUyCiAgICAvLyByZXR1cm4gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0MS02NDUKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1zZWxmLl9lbnRyeV9pZWRfYW1vdW50KGVudHJ5KSwKICAgIC8vICAgICBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0NAogICAgLy8gc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0MS02NDUKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1zZWxmLl9lbnRyeV9pZWRfYW1vdW50KGVudHJ5KSwKICAgIC8vICAgICBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICAvLyApCiAgICBjYWxsc3ViIF9lbWl0X2V4ZWN1dGlvbl9ldmVudAogICAgZHVwCiAgICBmcmFtZV9idXJ5IC0yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NDYKICAgIC8vIHJldHVybgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0OQogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ICs9IHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBmcmFtZV9idXJ5IC0yCiAgICArCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1MQogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1JSKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCAxMgogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMTAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1NQogICAgLy8gcGF5bG9hZC5vYnNlcnZlZF9yYXRlLAogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjU2CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzNiAvLyAicmF0ZV9yZXNldF9tdWx0aXBsaWVyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1NwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1Mi02NTgKICAgIC8vICMgUlIgZGVyaXZlcyB0aGUgbmV4dCByYXRlIGZyb20gYW4gb2JzZXJ2ZWQgb3JhY2xlIHZhbHVlIHBsdXMgdGhlCiAgICAvLyAjIGNvbnRyYWN0IHNwcmVhZCAvIG11bHRpcGxpZXIgdGVybXMsIHRoZW4gZW5mb3JjZXMgZmxvb3IgYW5kIGNhcC4KICAgIC8vIG9ic2VydmVkX3JhdGUgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBwYXlsb2FkLm9ic2VydmVkX3JhdGUsCiAgICAvLyAgICAgc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICkKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjAKICAgIC8vIG9ic2VydmVkX3JhdGUgKyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzUgLy8gInJhdGVfcmVzZXRfc3ByZWFkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkIGV4aXN0cwogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDMKICAgIC8vIGlmIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgYW5kIHJhdGUgPCBzZWxmLnJhdGVfcmVzZXRfZmxvb3I6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzggLy8gImhhc19yYXRlX3Jlc2V0X2Zsb29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmhhc19yYXRlX3Jlc2V0X2Zsb29yIGV4aXN0cwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMCAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X2Zsb29yIGV4aXN0cwogICAgZnJhbWVfZGlnIDYKICAgID4KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDQKICAgIC8vIHJhdGUgPSBzZWxmLnJhdGVfcmVzZXRfZmxvb3IKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMCAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDYKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfZmxvb3IgZXhpc3RzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1NToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc0NQogICAgLy8gaWYgc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgYW5kIHJhdGUgPiBzZWxmLnJhdGVfcmVzZXRfY2FwOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDM5IC8vICJoYXNfcmF0ZV9yZXNldF9jYXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwIGV4aXN0cwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTgKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMSAvLyAicmF0ZV9yZXNldF9jYXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9jYXAgZXhpc3RzCiAgICBmcmFtZV9kaWcgNgogICAgPAogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc0NgogICAgLy8gcmF0ZSA9IHNlbGYucmF0ZV9yZXNldF9jYXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMSAvLyAicmF0ZV9yZXNldF9jYXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSA2CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X2NhcCBleGlzdHMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjU5CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IHNlbGYuX2NsYW1wX3JhdGUoCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NTktNjYxCiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IHNlbGYuX2NsYW1wX3JhdGUoCiAgICAvLyAgICAgb2JzZXJ2ZWRfcmF0ZSArIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQKICAgIC8vICkKICAgIGZyYW1lX2RpZyA2CiAgICBhcHBfZ2xvYmFsX3B1dAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMTg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzEKICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QSSk6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMjAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY3MgogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzMKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDIzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc4CiAgICAvLyBpZiBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKToKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAyOQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc5CiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFJGKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCA1CiAgICA9PQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMzAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4NAogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCAtIHNlbGYuZXZlbnRfY3Vyc29yCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIC0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4NgogICAgLy8gKiBVSW50NjQoY3N0Lk9QX1VQX05PTl9DQVNIX1BFUl9FTlRSWV9CVURHRVQpCiAgICBwdXNoaW50IDEwMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjgzLTY4NgogICAgLy8gKyAoCiAgICAvLyAgICAgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCAtIHNlbGYuZXZlbnRfY3Vyc29yCiAgICAvLyApCiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfUEVSX0VOVFJZX0JVREdFVCkKICAgICoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4MgogICAgLy8gVUludDY0KGNzdC5PUF9VUF9OT05fQ0FTSF9CQVNFX0JVREdFVCkKICAgIGludGMgNCAvLyAxNTAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODItNjg2CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX05PTl9DQVNIX0JBU0VfQlVER0VUKQogICAgLy8gKyAoCiAgICAvLyAgICAgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCAtIHNlbGYuZXZlbnRfY3Vyc29yCiAgICAvLyApCiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfUEVSX0VOVFJZX0JVREdFVCkKICAgICsKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4MC02ODgKICAgIC8vIGVuc3VyZV9idWRnZXQoCiAgICAvLyAgICAgcmVxdWlyZWRfYnVkZ2V0PSgKICAgIC8vICAgICAgICAgVUludDY0KGNzdC5PUF9VUF9OT05fQ0FTSF9CQVNFX0JVREdFVCkKICAgIC8vICAgICAgICAgKyAoCiAgICAvLyAgICAgICAgICAgICBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IC0gc2VsZi5ldmVudF9jdXJzb3IKICAgIC8vICAgICAgICAgKQogICAgLy8gICAgICAgICAqIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfUEVSX0VOVFJZX0JVREdFVCkKICAgIC8vICAgICApLAogICAgLy8gKQogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDkwCiAgICAvLyBkaXNjb3VudF9mYWN0b3IgPSBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5MQogICAgLy8gZGVub21pbmF0b3IgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5MgogICAgLy8gc2tpcF9maXJzdF9yZWRlbXB0aW9uID0gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5NAogICAgLy8gaWYgZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAyNQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgZnJhbWVfYnVyeSA4CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAzNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDk1LTQ5OQogICAgLy8gIyBBbiBpbml0aWFsIFBSRiBtYXkgZGVzY3JpYmUgdGhlIGZpcnN0IHJlZGVtcHRpb24gcGVyaW9kIGRpcmVjdGx5LgogICAgLy8gZGlzY291bnRfZmFjdG9yID0gc2VsZi5fZGlzY291bnRfYW5udWl0eV9mYWN0b3IoCiAgICAvLyAgICAgZGlzY291bnRfZmFjdG9yLAogICAgLy8gICAgIGVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDgKICAgIGNhbGxzdWIgX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTAxCiAgICAvLyBza2lwX2ZpcnN0X3JlZGVtcHRpb24gPSBUcnVlCiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfYnVyeSA3CiAgICBmcmFtZV9idXJ5IDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDM1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTAzCiAgICAvLyBmdXR1cmVfZXZlbnRfaWQgPSBzZWxmLmV2ZW50X2N1cnNvciArIFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfd2hpbGVfdG9wQDM2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA0CiAgICAvLyB3aGlsZSBmdXR1cmVfZXZlbnRfaWQgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgZnJhbWVfZGlnIDMKICAgID4KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl93aGlsZUA0OAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA1CiAgICAvLyBmdXR1cmVfZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoZnV0dXJlX2V2ZW50X2lkKQogICAgZnJhbWVfZGlnIDMKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwNgogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPSBmdXR1cmVfZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MDctNTA4CiAgICAvLyAjIE9ubHkgcmVkZW1wdGlvbi1iZWFyaW5nIGV2ZW50cyBjb250cmlidXRlIHRvIHRoZSBhbm51aXR5IGRlbm9taW5hdG9yLgogICAgLy8gaXNfcmVkZW1wdGlvbl9ldmVudCA9IGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpIG9yICgKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwNy01MTEKICAgIC8vICMgT25seSByZWRlbXB0aW9uLWJlYXJpbmcgZXZlbnRzIGNvbnRyaWJ1dGUgdG8gdGhlIGFubnVpdHkgZGVub21pbmF0b3IuCiAgICAvLyBpc19yZWRlbXB0aW9uX2V2ZW50ID0gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QUikgb3IgKAogICAgLy8gICAgIGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfTUQpCiAgICAvLyAgICAgYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICAvLyApCiAgICBibnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfdHJ1ZUA0MAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA5CiAgICAvLyBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgZnJhbWVfZGlnIDQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MDktNTEwCiAgICAvLyBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgLy8gYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF9mYWxzZUA0MQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTEwCiAgICAvLyBhbmQgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IgPiBVSW50NjQoMCkKICAgIGZyYW1lX2RpZyAwCiAgICBwdXNoaW50IDI1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA5LTUxMAogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCkKICAgIC8vIGFuZCBmdXR1cmVfZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX3RydWVANDA6CiAgICBpbnRjXzEgLy8gMQoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfbWVyZ2VANDI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTIKICAgIC8vIGlmIGlzX3JlZGVtcHRpb25fZXZlbnQ6CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA0NwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTEzCiAgICAvLyBpZiBza2lwX2ZpcnN0X3JlZGVtcHRpb246CiAgICBmcmFtZV9kaWcgNwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUA0NQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTE0CiAgICAvLyBza2lwX2ZpcnN0X3JlZGVtcHRpb24gPSBGYWxzZQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgNwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANDc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjEKICAgIC8vIGZ1dHVyZV9ldmVudF9pZCArPSBVSW50NjQoMSkKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV93aGlsZV90b3BAMzYKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlANDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTgKICAgIC8vIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZnJhbWVfZGlnIDAKICAgIHB1c2hpbnQgMjUKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTYtNTE5CiAgICAvLyBkaXNjb3VudF9mYWN0b3IgPSBzZWxmLl9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcigKICAgIC8vICAgICBkaXNjb3VudF9mYWN0b3IsCiAgICAvLyAgICAgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMgogICAgc3dhcAogICAgY2FsbHN1YiBfZGlzY291bnRfYW5udWl0eV9mYWN0b3IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjAKICAgIC8vIGRlbm9taW5hdG9yICs9IGRpc2NvdW50X2ZhY3RvcgogICAgZnJhbWVfZGlnIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA0NwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDE6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF9tZXJnZUA0MgoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX3doaWxlQDQ4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTIzCiAgICAvLyBhc3NlcnQgZGVub21pbmF0b3IgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZnJhbWVfZGlnIDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUyNAogICAgLy8gbnVtZXJhdG9yID0gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTI1CiAgICAvLyBpZiBlbnRyeS5mbGFncyAmIFVJbnQ2NChlbnVtcy5GTEFHX0lOSVRJQUxfUFJGKSA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNTcKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gOAogICAgJgogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDUwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjYtNTI3CiAgICAvLyAjIFN1YnNlcXVlbnQgUFJGIGV2ZW50cyBhbW9ydGl6ZSBib3RoIHByaW5jaXBhbCBhbmQgYWxyZWFkeSBhY2NydWVkIGNhcnJ5LgogICAgLy8gbnVtZXJhdG9yICs9IHNlbGYuYWNjcnVlZF9pbnRlcmVzdAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgICsKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDUwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTMwCiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTI4LTUzMgogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIG51bWVyYXRvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gICAgIGRlbm9taW5hdG9yLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDEKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODkKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IHNlbGYuX3JlY2FsY3VsYXRlX2FubnVpdHlfcGF5bWVudCgKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njg5LTY5MQogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gc2VsZi5fcmVjYWxjdWxhdGVfYW5udWl0eV9wYXltZW50KAogICAgLy8gICAgIGVudHJ5CiAgICAvLyApCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMzA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OTQKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY5NS02OTkKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1VSW50NjQoMCksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OTcKICAgIC8vIHBheW9mZj1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njk4CiAgICAvLyBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY5NS02OTkKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1VSW50NjQoMCksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgY2FsbHN1YiBfZW1pdF9leGVjdXRpb25fZXZlbnQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDI5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjkzCiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDMwCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDIwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc0CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9JUENCKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCAxOAogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDIzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzUtNjc2CiAgICAvLyAjIElQQ0Iga2VlcHMgcHJpbmNpcGFsIHVuY2hhbmdlZCBhbmQgb25seSByZXNldHMgdGhlIGludGVyZXN0IGJhc2UuCiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIGIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMjMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMTA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjIKICAgIC8vIGVsaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1JSRik6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgMTEKICAgID09CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDE0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjMKICAgIC8vIG5leHRfcmF0ZSA9IGVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY0CiAgICAvLyBpZiBuZXh0X3JhdGUgPT0gVUludDY0KDApOgogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDEzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjUKICAgIC8vIG5leHRfcmF0ZSA9IHNlbGYucmF0ZV9yZXNldF9uZXh0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzcgLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDUKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfbmV4dCBleGlzdHMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY2CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IG5leHRfcmF0ZQogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgZnJhbWVfZGlnIDUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDE0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY4CiAgICAvLyBpZiBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSAhPSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgOQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2OQogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPSBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZQogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgZnJhbWVfZGlnIDkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KGVudHJ5OiBieXRlcywgcGF5b2ZmOiB1aW50NjQsIHNldHRsZWRfYW1vdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpfZW1pdF9leGVjdXRpb25fZXZlbnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MDUtNzExCiAgICAvLyBkZWYgX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgKiwKICAgIC8vICAgICBlbnRyeTogdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnksCiAgICAvLyAgICAgcGF5b2ZmOiBVSW50NjQsCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ6IFVJbnQ2NCwKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDMgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE1CiAgICAvLyBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25JRAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE2CiAgICAvLyBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIGZyYW1lX2RpZyAtMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTcKICAgIC8vIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIGZyYW1lX2RpZyAtMwogICAgZXh0cmFjdCA4IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxOAogICAgLy8gc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICBmcmFtZV9kaWcgLTMKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTkKICAgIC8vIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MjIKICAgIC8vIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIGZyYW1lX2RpZyAtMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE3CiAgICAvLyBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICBpbnRjXzIgLy8gOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIyCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBnZXRieXRlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NTEKICAgIC8vIGlmIHBheW9mZiA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJueiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NTIKICAgIC8vIHJldHVybiBVSW50NjQoZW51bXMuUEFZT0ZGX1NJR05fUE9TSVRJVkUpCiAgICBpbnRjXzEgLy8gMQoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX3BheW9mZl9zaWduQDc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MjEtNzIzCiAgICAvLyBwYXlvZmZfc2lnbj1hcmM0LlVJbnQ4KAogICAgLy8gICAgIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIC8vICksCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgaW50Y18yIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MjUKICAgIC8vIGN1cnJlbmN5X2lkPXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzI2CiAgICAvLyBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTQtNzI3CiAgICAvLyBFeGVjdXRpb25FdmVudCgKICAgIC8vICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIC8vICAgICBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYXBwbGllZF9hdD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICBwYXlvZmY9cGF5b2ZmLAogICAgLy8gICAgIHBheW9mZl9zaWduPWFyYzQuVUludDgoCiAgICAvLyAgICAgICAgIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIC8vICAgICApLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PXNldHRsZWRfYW1vdW50LAogICAgLy8gICAgIGN1cnJlbmN5X2lkPXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAwCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzEzLTcyOAogICAgLy8gYXJjNC5lbWl0KAogICAgLy8gICAgIEV4ZWN1dGlvbkV2ZW50KAogICAgLy8gICAgICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgICAgIHBheW9mZj1wYXlvZmYsCiAgICAvLyAgICAgICAgIHBheW9mZl9zaWduPWFyYzQuVUludDgoCiAgICAvLyAgICAgICAgICAgICBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICAvLyAgICAgICAgICksCiAgICAvLyAgICAgICAgIHNldHRsZWRfYW1vdW50PXNldHRsZWRfYW1vdW50LAogICAgLy8gICAgICAgICBjdXJyZW5jeV9pZD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgICAgIHNlcXVlbmNlPWVudHJ5LmV2ZW50X2lkICsgVUludDY0KDEpLAogICAgLy8gICAgICkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDlhMzMyYjk1IC8vIG1ldGhvZCAiRXhlY3V0aW9uRXZlbnQodWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc1MwogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiAoVUludDY0KGVudW1zLkVWVF9JRUQpLCBVSW50NjQoZW51bXMuRVZUX1BJKSk6CiAgICBmcmFtZV9kaWcgNQogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBibnogX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2lmX2JvZHlANQogICAgZnJhbWVfZGlnIDUKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGJ6IF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pZl9lbHNlQDYKCl9lbWl0X2V4ZWN1dGlvbl9ldmVudF9pZl9ib2R5QDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NTQKICAgIC8vIHJldHVybiBVSW50NjQoZW51bXMuUEFZT0ZGX1NJR05fUE9TSVRJVkUpCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIyCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBiIF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9wYXlvZmZfc2lnbkA3CgpfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzU1CiAgICAvLyByZXR1cm4gVUludDY0KGVudW1zLlBBWU9GRl9TSUdOX05FR0FUSVZFKQogICAgcHVzaGludCAyNTUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcyMgogICAgLy8gc2VsZi5fcGF5b2ZmX3NpZ24oZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSwgcGF5b2ZmKQogICAgYiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fcGF5b2ZmX3NpZ25ANwoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9yb2xlX2lzX2FjdGl2ZShyb2xlX21hcDogYnl0ZXMsIHJvbGVfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NDoKX3JvbGVfaXNfYWN0aXZlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU3CiAgICAvLyBkZWYgX3JvbGVfaXNfYWN0aXZlKHNlbGYsIHJvbGVfbWFwOiB0eXAuUmJhY1JvbGUsIHJvbGVfYWRkcmVzczogQWNjb3VudCkgLT4gYm9vbDoKICAgIHByb3RvIDIgMQogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5CiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5LTYwCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5LTYxCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjEKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAtNjEKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgPj0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX21lcmdlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKSAtPiB2b2lkOgpfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2NQogICAgLy8gYXNzZXJ0IHNlbGYuX2lzX2FycmFuZ2VyKFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTIKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgPT0gc2VsZi5hcnJhbmdlci52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE4IC8vIDB4NTIyMzQxNzI3MjYxNmU2NzY1NzIyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgPT0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2NQogICAgLy8gYXNzZXJ0IHNlbGYuX2lzX2FycmFuZ2VyKFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpIC0+IHZvaWQ6Cl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4MwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFzc2V0X2RlZmF1bHRlZCwgZXJyLkRFRkFVTFRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQxIC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfZGVmYXVsdGVkIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIERlZmF1bHRlZAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkgLT4gdm9pZDoKX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg2CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYXNzZXRfc3VzcGVuZGVkLCBlcnIuU1VTUEVOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzMgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9zdXNwZW5kZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gU3VzcGVuZGVkIG9wZXJhdGlvbnMKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkOiB1aW50NjQpIC0+IHZvaWQ6Cl9hc3NlcnRfdmFsaWRfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OAogICAgLy8gZGVmIF9hc3NlcnRfdmFsaWRfcm9sZShzZWxmLCByb2xlX2lkOiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTAKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIHB1c2hpbnQgMjAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkxCiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgcHVzaGludCAyNQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTIKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICBwdXNoaW50IDQwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MwogICAgLy8gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgcHVzaGludCA1MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTQKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgcHVzaGludCA2MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTUKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICBwdXNoaW50IDcwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NgogICAgLy8gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgcHVzaGludCA4MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfZmFsc2VAOAoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3OgogICAgaW50Y18xIC8vIDEKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX21lcmdlQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgcmV0c3ViCgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9mYWxzZUA4OgogICAgaW50Y18wIC8vIDAKICAgIGIgX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfbWVyZ2VAOQo=", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCAzMiAxNTAwCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUgInN0YXR1cyIgImV2ZW50X2N1cnNvciIgInNjaGVkdWxlX2VudHJ5X2NvdW50IiAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIiAiZml4ZWRfcG9pbnRfc2NhbGUiICJhY2NydWVkX2ludGVyZXN0IiAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIgMHg1MjIzNDE2MzYzNmY3NTZlNzQyMyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIiAiY29udHJhY3RfdHlwZSIgInJlc2VydmVkX3VuaXRzX3RvdGFsIiAicmVzZXJ2ZWRfcHJpbmNpcGFsIiAidG90YWxfdW5pdHMiICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIiAicmVzZXJ2ZWRfaW50ZXJlc3QiICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IiAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiIDB4NTIyMzQxNzI3MjYxNmU2NzY1NzIyMyAic2V0dGxlbWVudF9hc3NldF9pZCIgImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IiAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzIDB4NTIyMzQxNjM2MzZmNzU2ZTc0NGQ2MTZlNjE2NzY1NzIyMyAweDUzMjMgMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzIDB4NTIyMzRmNzA0NDYxNjU2ZDZmNmUyMyAiaW5pdGlhbF9leGNoYW5nZV9kYXRlIiAidHJhbnNmZXJfb3BlbmluZ19kYXRlIiAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIiAicmF0ZV9yZXNldF9mbG9vciIgInJhdGVfcmVzZXRfY2FwIiAweDUyMjM1NDcyNzU3Mzc0NjU2NTIzICJhc3NldF9zdXNwZW5kZWQiICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIiAicmF0ZV9yZXNldF9zcHJlYWQiICJyYXRlX3Jlc2V0X211bHRpcGxpZXIiICJyYXRlX3Jlc2V0X25leHQiICJoYXNfcmF0ZV9yZXNldF9mbG9vciIgImhhc19yYXRlX3Jlc2V0X2NhcCIgMHgwMCAiYXNzZXRfZGVmYXVsdGVkIiAicHJvc3BlY3R1c19oYXNoIiAicHJvc3BlY3R1c191cmwiICJkZW5vbWluYXRpb25fYXNzZXRfaWQiICJtYXR1cml0eV9kYXRlIiAiZGF5X2NvdW50X2NvbnZlbnRpb24iIDB4MDY4MTAxIDB4MDAwMAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4LTI5CiAgICAvLyAjIFJCQUMgUm9sZXMKICAgIC8vIHNlbGYuYXJyYW5nZXIgPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX0FSUkFOR0VSKQogICAgYnl0ZWMgMTggLy8gMHg1MjIzNDE3MjcyNjE2ZTY3NjU3MjIzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzAKICAgIC8vIHNlbGYub3BfZGFlbW9uID0gR2xvYmFsU3RhdGUoQWNjb3VudCgpLCBrZXk9Y3N0LlBSRUZJWF9JRF9PUF9EQUVNT04pCiAgICBieXRlYyAyNiAvLyAweDUyMjM0ZjcwNDQ2MTY1NmQ2ZjZlMjMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo0Ny00OAogICAgLy8gIyBELUFTQSBHb3Zlcm5hbmNlCiAgICAvLyBzZWxmLmFzc2V0X3N1c3BlbmRlZCA9IEZhbHNlCiAgICBieXRlYyAzMyAvLyAiYXNzZXRfc3VzcGVuZGVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NDkKICAgIC8vIHNlbGYuYXNzZXRfZGVmYXVsdGVkID0gRmFsc2UKICAgIGJ5dGVjIDQxIC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU2LTU3CiAgICAvLyAjIENvbnRyYWN0CiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwLTYxCiAgICAvLyAjIFByb3NwZWN0dXMgKEluZm9ybWF0aW9uYWwpCiAgICAvLyBzZWxmLnByb3NwZWN0dXNfaGFzaCA9IEJ5dGVzKCkKICAgIGJ5dGVjIDQyIC8vICJwcm9zcGVjdHVzX2hhc2giCiAgICBwdXNoYnl0ZXMgMHgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MgogICAgLy8gc2VsZi5wcm9zcGVjdHVzX3VybCA9IFN0cmluZygpCiAgICBieXRlYyA0MyAvLyAicHJvc3BlY3R1c191cmwiCiAgICBwdXNoYnl0ZXMgIiIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NC02NQogICAgLy8gIyBEZW5vbWluYXRpb24KICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gQXNzZXQoKQogICAgYnl0ZWMgNDQgLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjYKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCA9IEFzc2V0KCkKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OC02OQogICAgLy8gIyBUaW1lCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgMjcgLy8gImluaXRpYWxfZXhjaGFuZ2VfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzAKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgNDUgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxCiAgICAvLyBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgMjggLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIKICAgIC8vIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlID0gdHlwLlRpbWVTdGFtcCgpCiAgICBieXRlYyAyOSAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NC03NQogICAgLy8gIyBEYXkgQ291bnQgQ29udmVudGlvbgogICAgLy8gc2VsZi5kYXlfY291bnRfY29udmVudGlvbiA9IFVJbnQ2NCgpCiAgICBieXRlYyA0NiAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc3LTc4CiAgICAvLyAjIFVuaXRzCiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzID0gVUludDY0KCkKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPSBVSW50NjQoKQogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MS04MgogICAgLy8gIyBQcmluY2lwYWwKICAgIC8vIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPSBVSW50NjQoKQogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MwogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBVSW50NjQoKQogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NAogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gVUludDY0KCkKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NQogICAgLy8gc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gRmFsc2UKICAgIGJ5dGVjIDM0IC8vICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4Ny04OAogICAgLy8gIyBJbnRlcmVzdAogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gVUludDY0KCkKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg5CiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgPSBVSW50NjQoKQogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTEtOTIKICAgIC8vICMgSW50ZXJlc3QgUmF0ZXMKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTMKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQgPSBVSW50NjQoKQogICAgYnl0ZWMgMzUgLy8gInJhdGVfcmVzZXRfc3ByZWFkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NAogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIgPSBVSW50NjQoKQogICAgYnl0ZWMgMzYgLy8gInJhdGVfcmVzZXRfbXVsdGlwbGllciIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTUKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9mbG9vciA9IFVJbnQ2NCgpCiAgICBieXRlYyAzMCAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTYKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9jYXAgPSBVSW50NjQoKQogICAgYnl0ZWMgMzEgLy8gInJhdGVfcmVzZXRfY2FwIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NwogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X25leHQgPSBVSW50NjQoKQogICAgYnl0ZWMgMzcgLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTgKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgPSBGYWxzZQogICAgYnl0ZWMgMzggLy8gImhhc19yYXRlX3Jlc2V0X2Zsb29yIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OQogICAgLy8gc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgPSBGYWxzZQogICAgYnl0ZWMgMzkgLy8gImhhc19yYXRlX3Jlc2V0X2NhcCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAxLTEwMgogICAgLy8gIyBQcmltYXJ5IERpc3RyaWJ1dGlvbgogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgPSBVSW50NjQoKQogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAzCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0ID0gVUludDY0KCkKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA1LTEwNgogICAgLy8gIyBDdW11bGF0aXZlIFBlci1Vbml0IEZpeGVkLVBvaW50IEluZGV4ZXMKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4ID0gVUludDY0KCkKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1CiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciA9IFVJbnQ2NCgpCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNgogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA9IFVJbnQ2NCgpCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE4LTExOQogICAgLy8gIyBTY2FsaW5nCiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlID0gVUludDY0KCkKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6MjMKICAgIC8vIGFzc2VydCBUeG4uZ2xvYmFsX251bV9ieXRlX3NsaWNlID09IGNmZy5HTE9CQUxfQllURVMsIGVyci5XUk9OR19HTE9CQUxfQllURVMKICAgIHR4biBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgQnl0ZXMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjI0CiAgICAvLyBhc3NlcnQgVHhuLmdsb2JhbF9udW1fdWludCA9PSBjZmcuR0xPQkFMX1VJTlRTLCBlcnIuV1JPTkdfR0xPQkFMX1VJTlRTCiAgICB0eG4gR2xvYmFsTnVtVWludAogICAgcHVzaGludCAzNwogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgVUludHMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBhc3NlcnQgVHhuLmxvY2FsX251bV9ieXRlX3NsaWNlID09IGNmZy5MT0NBTF9CWVRFUywgZXJyLldST05HX0xPQ0FMX0JZVEVTCiAgICB0eG4gTG9jYWxOdW1CeXRlU2xpY2UKICAgICEKICAgIGFzc2VydCAvLyBXcm9uZyBMb2NhbCBCeXRlcyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6MjYKICAgIC8vIGFzc2VydCBUeG4ubG9jYWxfbnVtX3VpbnQgPT0gY2ZnLkxPQ0FMX1VJTlRTLCBlcnIuV1JPTkdfTE9DQUxfVUlOVFMKICAgIHR4biBMb2NhbE51bVVpbnQKICAgICEKICAgIGFzc2VydCAvLyBXcm9uZyBMb2NhbCBVSW50cyBhbGxvY2F0aW9uCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kX2FzYS9jb250cmFjdC5weTo4LTE4CiAgICAvLyBjbGFzcyBEQVNBKAogICAgLy8gICAgIFBheW1lbnRBZ2VudCwKICAgIC8vICAgICBUcmFuc2ZlckFnZW50LAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gICAgIGF2bV92ZXJzaW9uPTEyLAogICAgLy8gKToKICAgIHB1c2hieXRlcyAweDkxNGYwNGViIC8vIG1ldGhvZCAiY29udHJhY3RfdXBkYXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9jb250cmFjdF91cGRhdGVfcm91dGVANAoKbWFpbl9zd2l0Y2hfY2FzZV9uZXh0QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6OC0xOAogICAgLy8gY2xhc3MgREFTQSgKICAgIC8vICAgICBQYXltZW50QWdlbnQsCiAgICAvLyAgICAgVHJhbnNmZXJBZ2VudCwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBhdm1fdmVyc2lvbj0xMiwKICAgIC8vICk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBieiBtYWluX2NyZWF0ZV9Ob09wQDMyCiAgICBwdXNoYnl0ZXNzIDB4YjQ0NjE4YzggMHhlNzgzMjUyOSAweDk0Mzg4NzIzIDB4NmM4NWUzZWUgMHhiZGQxYTk0NCAweDdjMGYxODEyIDB4MTRmYzEwZWYgMHg3NGE3Mjk3ZiAweDA5ZDRmZTE0IDB4OWE5YmZhODUgMHg4NWVlZDMzZCAweGFiMmMwZmM0IDB4ZDlmMjI1YWMgMHg5ODgzNTA1YSAweDhlYTZlNzRjIDB4MDJhZjU1N2EgMHg4MmY3MWIyZCAweGVmMDRmNWQzIDB4ZGYzNDM1NTAgMHgzZGJlODBiZCAweDFlM2U0OGU3IDB4MDEwYzgyOTkgMHg3NDA2YWNkMiAweDFhNzJhMmVlIC8vIG1ldGhvZCAiZnVuZF9kdWVfY2FzaGZsb3dzKHVpbnQ2NCkodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImNsYWltX2R1ZV9jYXNoZmxvd3MoYWRkcmVzcyxieXRlW10pKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxieXRlW10pIiwgbWV0aG9kICJ0cmFuc2Zlcl9zZXRfc2NoZWR1bGUodWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInByaW1hcnlfZGlzdHJpYnV0aW9uKGFkZHJlc3MsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidHJhbnNmZXIoYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgImFjY291bnRfc3VzcGVuc2lvbihhZGRyZXNzLGJvb2wpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X29wZW4oYWRkcmVzcyxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAiYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzKGFkZHJlc3MsYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgImFjY291bnRfZ2V0X3Bvc2l0aW9uKGFkZHJlc3MpKGFkZHJlc3MsdWludDY0LHVpbnQ2NCxib29sLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJjb250cmFjdF9jb25maWcoKHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LGJvb2wsYm9vbCxib29sLHVpbnQ2NCksKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSwoYnl0ZVszMl0sc3RyaW5nKSl1aW50NjQiLCBtZXRob2QgImNvbnRyYWN0X3NjaGVkdWxlKHVpbnQ2NCxib29sLCh1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KVtdKXVpbnQ2NCIsIG1ldGhvZCAiY29udHJhY3RfZXhlY3V0ZV9pZWQoKXVpbnQ2NCIsIG1ldGhvZCAiYXBwbHlfbm9uX2Nhc2hfZXZlbnQodWludDY0LCh1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkpdWludDY0IiwgbWV0aG9kICJhcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudCgodWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkpdWludDY0IiwgbWV0aG9kICJjb250cmFjdF9nZXRfc3RhdGUoKSh1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAiY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50KCkodWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgInJiYWNfcm90YXRlX2FycmFuZ2VyKGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX3NldF9vcF9kYWVtb24oYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgInJiYWNfYXNzaWduX3JvbGUodWludDgsYWRkcmVzcywodWludDY0LHVpbnQ2NCkpdWludDY0IiwgbWV0aG9kICJyYmFjX3Jldm9rZV9yb2xlKHVpbnQ4LGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX2NvbnRyYWN0X3N1c3BlbnNpb24oYm9vbCl1aW50NjQiLCBtZXRob2QgInJiYWNfZ2V0X2FycmFuZ2VyKClhZGRyZXNzIiwgbWV0aG9kICJyYmFjX2dldF9hZGRyZXNzX3JvbGVzKGFkZHJlc3MpKGJvb2wsYm9vbCxib29sLGJvb2wsYm9vbCkiLCBtZXRob2QgInJiYWNfZ2V0X3JvbGVfdmFsaWRpdHkodWludDgsYWRkcmVzcykodWludDY0LHVpbnQ2NCkiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBmdW5kX2R1ZV9jYXNoZmxvd3MgY2xhaW1fZHVlX2Nhc2hmbG93cyB0cmFuc2Zlcl9zZXRfc2NoZWR1bGUgcHJpbWFyeV9kaXN0cmlidXRpb24gdHJhbnNmZXIgYWNjb3VudF9zdXNwZW5zaW9uIGFjY291bnRfb3BlbiBhY2NvdW50X3VwZGF0ZV9wYXltZW50X2FkZHJlc3MgYWNjb3VudF9nZXRfcG9zaXRpb24gY29udHJhY3RfY29uZmlnIGNvbnRyYWN0X3NjaGVkdWxlIGNvbnRyYWN0X2V4ZWN1dGVfaWVkIGFwcGx5X25vbl9jYXNoX2V2ZW50IGFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50IGNvbnRyYWN0X2dldF9zdGF0ZSBjb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnQgcmJhY19yb3RhdGVfYXJyYW5nZXIgcmJhY19zZXRfb3BfZGFlbW9uIHJiYWNfYXNzaWduX3JvbGUgcmJhY19yZXZva2Vfcm9sZSByYmFjX2NvbnRyYWN0X3N1c3BlbnNpb24gcmJhY19nZXRfYXJyYW5nZXIgcmJhY19nZXRfYWRkcmVzc19yb2xlcyByYmFjX2dldF9yb2xlX3ZhbGlkaXR5CiAgICBlcnIKCm1haW5fY3JlYXRlX05vT3BAMzI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6OC0xOAogICAgLy8gY2xhc3MgREFTQSgKICAgIC8vICAgICBQYXltZW50QWdlbnQsCiAgICAvLyAgICAgVHJhbnNmZXJBZ2VudCwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBhdm1fdmVyc2lvbj0xMiwKICAgIC8vICk6CiAgICBwdXNoYnl0ZXMgMHg5NTZkNzE1NiAvLyBtZXRob2QgImNvbnRyYWN0X2NyZWF0ZShhZGRyZXNzKXVpbnQ2NCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIGNvbnRyYWN0X2NyZWF0ZQogICAgZXJyCgptYWluX2NvbnRyYWN0X3VwZGF0ZV9yb3V0ZUA0OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgcHVzaGludCA0IC8vIFVwZGF0ZUFwcGxpY2F0aW9uCiAgICA9PQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICYmCiAgICBhc3NlcnQKICAgIGIgY29udHJhY3RfdXBkYXRlCgoKLy8gX3B1eWFfbGliLnV0aWwuZW5zdXJlX2J1ZGdldChyZXF1aXJlZF9idWRnZXQ6IHVpbnQ2NCwgZmVlX3NvdXJjZTogdWludDY0KSAtPiB2b2lkOgplbnN1cmVfYnVkZ2V0OgogICAgcHJvdG8gMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMTAKICAgICsKCmVuc3VyZV9idWRnZXRfd2hpbGVfdG9wQDE6CiAgICBmcmFtZV9kaWcgMAogICAgZ2xvYmFsIE9wY29kZUJ1ZGdldAogICAgPgogICAgYnogZW5zdXJlX2J1ZGdldF9hZnRlcl93aGlsZUA2CiAgICBpdHhuX2JlZ2luCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgYnl0ZWMgNDcgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtCiAgICBieXRlYyA0NyAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbQogICAgZnJhbWVfZGlnIC0xCiAgICBzd2l0Y2ggZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8wQDMgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8xQDQKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfbmV4dEA1OgogICAgaXR4bl9zdWJtaXQKICAgIGIgZW5zdXJlX2J1ZGdldF93aGlsZV90b3BAMQoKZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8xQDQ6CiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgYiBlbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX25leHRANQoKZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8wQDM6CiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGIgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV9uZXh0QDUKCmVuc3VyZV9idWRnZXRfYWZ0ZXJfd2hpbGVANjoKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucGF5bWVudF9hZ2VudC5QYXltZW50QWdlbnQuZnVuZF9kdWVfY2FzaGZsb3dzW3JvdXRpbmddKCkgLT4gdm9pZDoKZnVuZF9kdWVfY2FzaGZsb3dzOgogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAxMwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NTEKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjUyCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjUzCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo1NQogICAgLy8gaWYgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCk6CiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo1OS02MAogICAgLy8gKyBtYXhfZXZlbnRfY291bnQKICAgIC8vICogVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfUEVSX0VWRU5UX0JVREdFVCkKICAgIGR1cAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjYwCiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfRlVORF9EVUVfQ0FTSEZMT1dTX1BFUl9FVkVOVF9CVURHRVQpCiAgICBwdXNoaW50IDEwMAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjU5LTYwCiAgICAvLyArIG1heF9ldmVudF9jb3VudAogICAgLy8gKiBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19QRVJfRVZFTlRfQlVER0VUKQogICAgKgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjU4CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19CQVNFX0JVREdFVCkKICAgIGludGMgNCAvLyAxNTAwCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NTgtNjAKICAgIC8vIFVJbnQ2NChjc3QuT1BfVVBfRlVORF9EVUVfQ0FTSEZMT1dTX0JBU0VfQlVER0VUKQogICAgLy8gKyBtYXhfZXZlbnRfY291bnQKICAgIC8vICogVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfUEVSX0VWRU5UX0JVREdFVCkKICAgICsKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo1Ni02MgogICAgLy8gZW5zdXJlX2J1ZGdldCgKICAgIC8vICAgICByZXF1aXJlZF9idWRnZXQ9KAogICAgLy8gICAgICAgICBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19CQVNFX0JVREdFVCkKICAgIC8vICAgICAgICAgKyBtYXhfZXZlbnRfY291bnQKICAgIC8vICAgICAgICAgKiBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19QRVJfRVZFTlRfQlVER0VUKQogICAgLy8gICAgICksCiAgICAvLyApCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjY0CiAgICAvLyBwcm9jZXNzZWRfZXZlbnRzID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA1CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjUKICAgIC8vIGZ1bmRlZF9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2NgogICAgLy8gZnVuZGVkX3ByaW5jaXBhbCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTMKCmZ1bmRfZHVlX2Nhc2hmbG93c193aGlsZV90b3BANDoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2OQogICAgLy8gcHJvY2Vzc2VkX2V2ZW50cyA8IG1heF9ldmVudF9jb3VudAogICAgZGlnIDQKICAgIGRpZyAxCiAgICA8CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjktNzAKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgPCBtYXhfZXZlbnRfY291bnQKICAgIC8vIGFuZCBzZWxmLmV2ZW50X2N1cnNvciA8IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQKICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl93aGlsZUAxMQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjcwCiAgICAvLyBhbmQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIDwKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2OS03MAogICAgLy8gcHJvY2Vzc2VkX2V2ZW50cyA8IG1heF9ldmVudF9jb3VudAogICAgLy8gYW5kIHNlbGYuZXZlbnRfY3Vyc29yIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudAogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDExCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzIKICAgIC8vIGVudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KHNlbGYuZXZlbnRfY3Vyc29yKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIGR1cAogICAgYnVyeSAxNwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjczCiAgICAvLyBpZiBlbnRyeS5zY2hlZHVsZWRfdGltZSA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wOgogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDMKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgID4KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAMTEKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3NQogICAgLy8gaWYgbm90IHNlbGYuX2V2ZW50X2lzX2Nhc2goZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSk6CiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ1cnkgMTYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM1MQogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUCksCiAgICBpbnRjXzIgLy8gOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzUwLTM1NAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfTUQpLAogICAgLy8gKQogICAgPT0KICAgIGR1cAogICAgYnVyeSA0CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfdHJ1ZUA1MgogICAgZGlnIDE0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNTIKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNTAtMzU0CiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9NRCksCiAgICAvLyApCiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX3RydWVANTIKICAgIGRpZyAxNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzUzCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX01EKSwKICAgIHB1c2hpbnQgMTkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM1MC0zNTQKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX01EKSwKICAgIC8vICkKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUA1MwoKZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfdHJ1ZUA1MjoKICAgIGludGNfMSAvLyAxCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUA1NDoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3NQogICAgLy8gaWYgbm90IHNlbGYuX2V2ZW50X2lzX2Nhc2goZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSk6CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAMTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU0OAogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X2lkID09IHNlbGYuZXZlbnRfY3Vyc29yLCBlcnIuSU5WQUxJRF9FVkVOVF9DVVJTT1IKICAgIGRpZyAxNQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBjdXJzb3IKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU0OQogICAgLy8gYXNzZXJ0IGVudHJ5LnNjaGVkdWxlZF90aW1lIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLCBlcnIuTk9fRFVFX0NBU0hGTE9XCiAgICBkaWcgMQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPD0KICAgIGFzc2VydCAvLyBObyBkdWUgY2FzaGZsb3cgdG8gcGF5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MTMKICAgIC8vIGlmIGV2ZW50X3R5cGUgbm90IGluIChVSW50NjQoZW51bXMuRVZUX0lQKSwgVUludDY0KGVudW1zLkVWVF9NRCkpOgogICAgZGlnIDIKICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNQogICAgZGlnIDE0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MTQKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDExCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfaW50ZXJlc3RfYW1vdW50QDE2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDI2CiAgICAvLyBldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBidXJ5IDE2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MjcKICAgIC8vIGlmIGV2ZW50X3R5cGUgbm90IGluIChVSW50NjQoZW51bXMuRVZUX1BSKSwgVUludDY0KGVudW1zLkVWVF9NRCkpOgogICAgcHVzaGludCAzCiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE5CiAgICBkaWcgMTQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQyOAogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNgoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnRAMjg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTMKICAgIC8vIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGRpZyAxNQogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTU2CiAgICAvLyBpZiBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKToKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDI5CiAgICBkaWcgNwogICAgYnVyeSA5CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzODoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU3Mi01NzQKICAgIC8vICMgRnVuZGluZyB1c2VzIHBlci11bml0IGN1bXVsYXRpdmUgaW5kaWNlcyBzbyBlYWNoIGhvbGRlciBjYW4gc2V0dGxlCiAgICAvLyAjIGluZGVwZW5kZW50bHkgZnJvbSBpdHMgY3VycmVudCB1bml0IGJhbGFuY2UuCiAgICAvLyBpbnRlcmVzdF9pbmRleF9kZWx0YSA9IHNlbGYuX2Ftb3VudF90b19pbmRleF9kZWx0YShpbnRlcmVzdF9hbW91bnRfZHVlKQogICAgZGlnIDEwCiAgICBjYWxsc3ViIF9hbW91bnRfdG9faW5kZXhfZGVsdGEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU3NQogICAgLy8gcHJpbmNpcGFsX2luZGV4X2RlbHRhID0gc2VsZi5fYW1vdW50X3RvX2luZGV4X2RlbHRhKHByaW5jaXBhbF9hbW91bnRfZHVlKQogICAgZGlnIDYKICAgIGNhbGxzdWIgX2Ftb3VudF90b19pbmRleF9kZWx0YQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTc2CiAgICAvLyBpbnRlcmVzdF9hbW91bnQgPSBzZWxmLl9pbmRleF9kZWx0YV90b19hbW91bnQoaW50ZXJlc3RfaW5kZXhfZGVsdGEpCiAgICBkaWcgMQogICAgY2FsbHN1YiBfaW5kZXhfZGVsdGFfdG9fYW1vdW50CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgMTUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU3NwogICAgLy8gcHJpbmNpcGFsX2Ftb3VudCA9IHNlbGYuX2luZGV4X2RlbHRhX3RvX2Ftb3VudChwcmluY2lwYWxfaW5kZXhfZGVsdGEpCiAgICBkdXAKICAgIGNhbGxzdWIgX2luZGV4X2RlbHRhX3RvX2Ftb3VudAogICAgZHVwCiAgICBidXJ5IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzgKICAgIC8vIHJlcXVpcmVkX2Ftb3VudCA9IGludGVyZXN0X2Ftb3VudCArIHByaW5jaXBhbF9hbW91bnQKICAgIGRpZyAyCiAgICBkaWcgMQogICAgKwogICAgZHVwCiAgICBidXJ5IDkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjczNAogICAgLy8gYmFsYW5jZSA9IHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ1NgogICAgLy8gcmV0dXJuIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgKyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIGRpZyAxCiAgICArCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MzYKICAgIC8vIGFzc2VydCBiYWxhbmNlID49IHJlc2VydmVkX3RvdGFsLCBlcnIuTk9UX0VOT1VHSF9GVU5EUwogICAgZGlnIDIKICAgIGRpZyAxCiAgICA+PQogICAgYXNzZXJ0IC8vIE5vdCBlbm91Z2ggZnVuZHMgZm9yIHRoZSBwYXltZW50CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MzcKICAgIC8vIHJldHVybiBiYWxhbmNlIC0gcmVzZXJ2ZWRfdG90YWwKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTgwCiAgICAvLyBzZWxmLl9hdmFpbGFibGVfc2V0dGxlbWVudF9mdW5kcygpID49IHJlcXVpcmVkX2Ftb3VudAogICAgdW5jb3ZlciAyCiAgICA+PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTc5LTU4MQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLl9hdmFpbGFibGVfc2V0dGxlbWVudF9mdW5kcygpID49IHJlcXVpcmVkX2Ftb3VudAogICAgLy8gKSwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTgzCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0ICs9IGludGVyZXN0X2Ftb3VudAogICAgdW5jb3ZlciAzCiAgICArCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTg0CiAgICAvLyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCArPSBwcmluY2lwYWxfYW1vdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICArCiAgICBieXRlYyAxMiAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4NQogICAgLy8gc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4ICs9IGludGVyZXN0X2luZGV4X2RlbHRhCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCBleGlzdHMKICAgIHVuY292ZXIgMgogICAgKwogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTg2CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4ICs9IHByaW5jaXBhbF9pbmRleF9kZWx0YQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCBleGlzdHMKICAgICsKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1ODcKICAgIC8vIGlmIGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkgPT0gVUludDY0KGVudW1zLkVWVF9QUik6CiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBwdXNoaW50IDMKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDQwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1ODgtNTg5CiAgICAvLyAjIEZvciBQUiwgdGhlIHBlcmlvZCBpbnRlcmVzdCBzdGF5cyBhY2NydWVkIHVudGlsIGEgbGF0ZXIgSVAgb3IgTUQuCiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgKz0gc2VsZi5fZW50cnlfaW50ZXJlc3Rfc2VnbWVudChlbnRyeSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBkaWcgMTYKICAgIGNhbGxzdWIgX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQKICAgIGJ1cnkgMTgKICAgICsKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTIKICAgIC8vIGlmIG5vdCBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKSBvciBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NCgKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlANDMKICAgIGRpZyAxNQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5Mi01OTQKICAgIC8vIGlmIG5vdCBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKSBvciBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NCgKICAgIC8vICAgICBlbnVtcy5FVlRfTUQKICAgIC8vICk6CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDQKCmZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDQzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTk1CiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBkaWcgMTUKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0NDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5NgogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgZGlnIDgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTcKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IG5leHRfaW50ZXJlc3RfYmFzZQogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGRpZyA5CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTk4CiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MDAKICAgIC8vIGlmIGVudHJ5LmV2ZW50X3R5cGUgPT0gYXJjNC5VSW50OCgKICAgIGRpZyAxNQogICAgZXh0cmFjdCA4IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwMC02MDIKICAgIC8vIGlmIGVudHJ5LmV2ZW50X3R5cGUgPT0gYXJjNC5VSW50OCgKICAgIC8vICAgICBlbnVtcy5FVlRfTUQKICAgIC8vICkgYW5kIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID09IFVJbnQ2NCgwKToKICAgIHB1c2hieXRlcyAweDEzCiAgICBiPT0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQ3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MDIKICAgIC8vICkgYW5kIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID09IFVJbnQ2NCgwKToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAwLTYwMgogICAgLy8gaWYgZW50cnkuZXZlbnRfdHlwZSA9PSBhcmM0LlVJbnQ4KAogICAgLy8gICAgIGVudW1zLkVWVF9NRAogICAgLy8gKSBhbmQgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPT0gVUludDY0KDApOgogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQ3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MDMKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGVudW1zLlNUQVRVU19FTkRFRCkKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgMjAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjA0CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQ3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjA2LTYxMAogICAgLy8gc2VsZi5fZW1pdF9leGVjdXRpb25fZXZlbnQoCiAgICAvLyAgICAgZW50cnk9ZW50cnksCiAgICAvLyAgICAgcGF5b2ZmPWludGVyZXN0X2Ftb3VudCArIHByaW5jaXBhbF9hbW91bnQsCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9aW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudCwKICAgIC8vICkKICAgIGRpZyAxNQogICAgZGlnIDQKICAgIGR1cAogICAgY2FsbHN1YiBfZW1pdF9leGVjdXRpb25fZXZlbnQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojc5CiAgICAvLyBmdW5kZWRfaW50ZXJlc3QgKz0gaW50ZXJlc3RfYW1vdW50CiAgICBkaWcgMTMKICAgIGRpZyAxMgogICAgKwogICAgYnVyeSAxNAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjgwCiAgICAvLyBmdW5kZWRfcHJpbmNpcGFsICs9IHByaW5jaXBhbF9hbW91bnQKICAgIGRpZyAxMgogICAgZGlnIDcKICAgICsKICAgIGJ1cnkgMTMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4MQogICAgLy8gcHJvY2Vzc2VkX2V2ZW50cyArPSBVSW50NjQoMSkKICAgIGRpZyA0CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSA1CiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c193aGlsZV90b3BANAoKZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUA0MDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5MQogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ID0gVUludDY0KDApCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQxCgpmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUAyOToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1NwogICAgLy8gZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGRpZyAxNQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSAxNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTU4LTU2MAogICAgLy8gIyBEeW5hbWljIGFubnVpdGllcyBkZXJpdmUgbmV4dCBzdGF0ZSBmcm9tIHRoZSBwYXltZW50IGRlY29tcG9zaXRpb24sCiAgICAvLyAjIG5vdCBvbmx5IGZyb20gdGhlIHByZWNvbXB1dGVkIGBuZXh0XypgIGZpZWxkcy4KICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QUik6CiAgICBwdXNoaW50IDMKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDMxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjIKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIC0gcHJpbmNpcGFsX2Ftb3VudF9kdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgZGlnIDYKICAgIC0KICAgIGR1cAogICAgYnVyeSA5CiAgICBidXJ5IDkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzgKCmZ1bmRfZHVlX2Nhc2hmbG93c19lbHNlX2JvZHlAMzE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjUKICAgIC8vIGVsaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX0lQKToKICAgIGRpZyAxNAogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDMzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjYKICAgIC8vIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgYnVyeSA5CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjcKICAgIC8vIG5leHRfaW50ZXJlc3RfYmFzZSA9IHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgYnVyeSAxMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSBleGlzdHMKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzgKCmZ1bmRfZHVlX2Nhc2hmbG93c19lbHNlX2JvZHlAMzM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjgKICAgIC8vIGVsaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKToKICAgIGRpZyAxNAogICAgcHVzaGludCAxOQogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUAzNAogICAgZGlnIDcKICAgIGJ1cnkgOQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlAMzQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjkKICAgIC8vIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzAKICAgIC8vIG5leHRfaW50ZXJlc3RfYmFzZSA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgOQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MjkKICAgIC8vIGlmIHNlbGYuX2lzX2R5bmFtaWNfYW5udWl0eSgpOgogICAgY2FsbHN1YiBfaXNfZHluYW1pY19hbm51aXR5CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyNwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDMwCiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfTUQpOgogICAgZGlnIDE0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzMQogICAgLy8gcmV0dXJuIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTUyCiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzMgogICAgLy8gaW50ZXJlc3RfZHVlID0gc2VsZi5hY2NydWVkX2ludGVyZXN0ICsgc2VsZi5fZW50cnlfaW50ZXJlc3Rfc2VnbWVudChlbnRyeSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBkaWcgMTYKICAgIGNhbGxzdWIgX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQKICAgIGJ1cnkgMTgKICAgICsKICAgIGR1cAogICAgYnVyeSAxMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDMzCiAgICAvLyBpZiBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPD0gaW50ZXJlc3RfZHVlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gZXhpc3RzCiAgICA+PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzNAogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTUyCiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyNDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzNQogICAgLy8gcHJpbmNpcGFsX2Ftb3VudCA9IHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiAtIGludGVyZXN0X2R1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gZXhpc3RzCiAgICBkaWcgMTAKICAgIC0KICAgIGR1cAogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzYKICAgIC8vIGlmIHByaW5jaXBhbF9hbW91bnQgPiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgPgogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzNwogICAgLy8gcmV0dXJuIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTUyCiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyNjoKICAgIGRpZyA2CiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NDAKICAgIC8vIGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsIDw9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBkaWcgMTUKICAgIHB1c2hpbnQgNDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGR1cDIKICAgIDw9CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzktNDQxCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsIDw9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ0MgogICAgLy8gcmV0dXJuIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIC0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIHN3YXAKICAgIC0KICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTUyCiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQxNQogICAgLy8gcmV0dXJuIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCArIHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZGlnIDE2CiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBidXJ5IDE4CiAgICArCiAgICBidXJ5IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTEKICAgIC8vIGludGVyZXN0X2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9pbnRlcmVzdF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9pbnRlcmVzdF9hbW91bnRAMTYKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl93aGlsZUAxMToKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4MwogICAgLy8gYXNzZXJ0IHByb2Nlc3NlZF9ldmVudHMgPiBVSW50NjQoMCksIGVyci5OT19EVUVfQ0FTSEZMT1cKICAgIGRpZyA0CiAgICBkdXAKICAgIGFzc2VydCAvLyBObyBkdWUgY2FzaGZsb3cgdG8gcGF5CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODcKICAgIC8vIHRvdGFsX2Z1bmRlZD1mdW5kZWRfaW50ZXJlc3QgKyBmdW5kZWRfcHJpbmNpcGFsLAogICAgZGlnIDE0CiAgICBkdXAKICAgIGRpZyAxNQogICAgZHVwCiAgICBjb3ZlciAzCiAgICArCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODkKICAgIC8vIHRpbWVzdGFtcD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4NC05MAogICAgLy8gcmV0dXJuIHR5cC5DYXNoRnVuZGluZ1Jlc3VsdCgKICAgIC8vICAgICBmdW5kZWRfaW50ZXJlc3Q9ZnVuZGVkX2ludGVyZXN0LAogICAgLy8gICAgIGZ1bmRlZF9wcmluY2lwYWw9ZnVuZGVkX3ByaW5jaXBhbCwKICAgIC8vICAgICB0b3RhbF9mdW5kZWQ9ZnVuZGVkX2ludGVyZXN0ICsgZnVuZGVkX3ByaW5jaXBhbCwKICAgIC8vICAgICBwcm9jZXNzZWRfZXZlbnRzPXByb2Nlc3NlZF9ldmVudHMsCiAgICAvLyAgICAgdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUA1MzoKICAgIGludGNfMCAvLyAwCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDU0CgoKLy8gbW9kdWxlcy5wYXltZW50X2FnZW50LlBheW1lbnRBZ2VudC5jbGFpbV9kdWVfY2FzaGZsb3dzW3JvdXRpbmddKCkgLT4gdm9pZDoKY2xhaW1fZHVlX2Nhc2hmbG93czoKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6OTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNQogICAgLy8gaWYgc2VsZi5vcF9kYWVtb24udmFsdWUgIT0gR2xvYmFsLnplcm9fYWRkcmVzczoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNiAvLyAweDUyMjM0ZjcwNDQ2MTY1NmQ2ZjZlMjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcF9kYWVtb24gZXhpc3RzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBieiBjbGFpbV9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTcKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNwogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI2IC8vIDB4NTIyMzRmNzA0NDYxNjU2ZDZmNmUyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wX2RhZW1vbiBleGlzdHMKICAgID09CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTctMTkKICAgIC8vIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICAvLyBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgYm56IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDE0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTgKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNy0xOQogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICBibnogY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX3RydWVAMTQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxOQogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIHR4biBTZW5kZXIKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDMyCiAgICA9PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE3LTE5CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAxNQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX3RydWVAMTQ6CiAgICBpbnRjXzEgLy8gMQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDE2OgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE2LTIwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vICAgICBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gICAgIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICAvLyApLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNzoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMDMKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA0CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMDcKICAgIC8vIHNlbGYuX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQoaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDIKICAgIGR1cAogICAgY2FsbHN1YiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjEwOAogICAgLy8gc2VsZi5fc2V0dGxlX3Bvc2l0aW9uKGhvbGRpbmdfYWRkcmVzcykKICAgIGNhbGxzdWIgX3NldHRsZV9wb3NpdGlvbgogICAgcG9wbiAyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTE3CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jbGFpbWFibGVfaW50ZXJlc3QKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGR1cAogICAgcHVzaGludCA3MwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTE4CiAgICAvLyArIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNsYWltYWJsZV9wcmluY2lwYWwKICAgIGR1cAogICAgcHVzaGludCA4MQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTE3LTExOAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY2xhaW1hYmxlX2ludGVyZXN0CiAgICAvLyArIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNsYWltYWJsZV9wcmluY2lwYWwKICAgIHVuY292ZXIgMgogICAgKwogICAgZHVwCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMTAKICAgIC8vIGFzc2VydCB0b3RhbF9hbW91bnQgPiBVSW50NjQoMCksIGVyci5OT19EVUVfQ0FTSEZMT1cKICAgIGFzc2VydCAvLyBObyBkdWUgY2FzaGZsb3cgdG8gcGF5CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MjUKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5pc19vcHRlZF9pbigKICAgIGV4dHJhY3QgMCAzMgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI2CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI1LTI3CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MuaXNfb3B0ZWRfaW4oCiAgICAvLyAgICAgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkCiAgICAvLyApCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI1LTI4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MuaXNfb3B0ZWRfaW4oCiAgICAvLyAgICAgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkCiAgICAvLyApCiAgICAvLyBhbmQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZAogICAgYnogY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX2ZhbHNlQDI0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MjgKICAgIC8vIGFuZCBub3Qgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDM4NAogICAgZ2V0Yml0CiAgICBibnogY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX2ZhbHNlQDI0CiAgICBpbnRjXzEgLy8gMQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDI1OgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjExNQogICAgLy8gaWYgc2VsZi5faXNfcGF5bWVudF9leGVjdXRhYmxlKGhvbGRpbmdfYWRkcmVzcyk6CiAgICBieiBjbGFpbV9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjM0CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgc3dhcAogICAgZGlnIDEKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYXNzZXJ0IC8vIGFjY291bnQgb3B0ZWQgaW50byBhc3NldAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjM0LTM1CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgLy8gPj0gcGF5bWVudF9hbW91bnQKICAgIGRpZyA1CiAgICBkdXAKICAgIGNvdmVyIDIKICAgID49CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MzMtMzYKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIC8vICAgICA+PSBwYXltZW50X2Ftb3VudAogICAgLy8gKSwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjExNwogICAgLy8gc2VsZi5fcGF5KHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcywgdG90YWxfYW1vdW50KQogICAgZGlnIDIKICAgIGR1cAogICAgY292ZXIgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGR1cAogICAgZXh0cmFjdCAwIDMyCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NDAtNDUKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1yZWNlaXZlciwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9YW1vdW50LAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NDQKICAgIC8vIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICB1bmNvdmVyIDMKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgdW5jb3ZlciAyCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQwCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NDAtNDUKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1yZWNlaXZlciwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9YW1vdW50LAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEyNS0xMjYKICAgIC8vICMgR2V0IHRoZSBjbGFpbWFibGUgYW1vdW50cyBiZWZvcmUgcmVzZXQKICAgIC8vIGludGVyZXN0X2Ftb3VudCA9IHBvc2l0aW9uLmNsYWltYWJsZV9pbnRlcmVzdAogICAgZHVwCiAgICBwdXNoaW50IDczCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBidXJ5IDkKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMjcKICAgIC8vIHByaW5jaXBhbF9hbW91bnQgPSBwb3NpdGlvbi5jbGFpbWFibGVfcHJpbmNpcGFsCiAgICBkdXAKICAgIHB1c2hpbnQgODEKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGJ1cnkgOQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEyOS0xMzAKICAgIC8vICMgUmVzZXQgdGhlIHBvc2l0aW9uJ3MgY2xhaW1hYmxlIGFtb3VudHMKICAgIC8vIHBvc2l0aW9uLmNsYWltYWJsZV9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICByZXBsYWNlMiA3MwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzMQogICAgLy8gcG9zaXRpb24uY2xhaW1hYmxlX3ByaW5jaXBhbCA9IFVJbnQ2NCgwKQogICAgc3dhcAogICAgcmVwbGFjZTIgODEKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzIKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gcG9zaXRpb24uY29weSgpCiAgICB1bmNvdmVyIDMKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzQKICAgIC8vIGFzc2VydCBzZWxmLnJlc2VydmVkX2ludGVyZXN0ID49IGludGVyZXN0X2Ftb3VudCwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBkdXAKICAgIGRpZyAyCiAgICA+PQogICAgYXNzZXJ0IC8vIE5vdCBlbm91Z2ggZnVuZHMgZm9yIHRoZSBwYXltZW50CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTM1CiAgICAvLyBhc3NlcnQgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgPj0gcHJpbmNpcGFsX2Ftb3VudCwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIGRpZyAzCiAgICA+PQogICAgYXNzZXJ0IC8vIE5vdCBlbm91Z2ggZnVuZHMgZm9yIHRoZSBwYXltZW50CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTM3LTEzOAogICAgLy8gIyBVcGRhdGUgdGhlIGdsb2JhbCByZXNlcnZlZCBpbnRlcmVzdCBhbmQgcHJpbmNpcGFsIGFtb3VudHMKICAgIC8vIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgLT0gaW50ZXJlc3RfYW1vdW50CiAgICBzd2FwCiAgICAtCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzOQogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgLT0gcHJpbmNpcGFsX2Ftb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIGV4aXN0cwogICAgc3dhcAogICAgLQogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpjbGFpbV9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMjMKICAgIC8vIHRvdGFsX2Ftb3VudD1pbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50LAogICAgZGlnIDUKICAgIGR1cAogICAgZGlnIDYKICAgIGR1cAogICAgY292ZXIgMwogICAgKwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjEyNAogICAgLy8gdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjEyMC0xMjYKICAgIC8vIHJldHVybiB0eXAuQ2FzaENsYWltUmVzdWx0KAogICAgLy8gICAgIGludGVyZXN0X2Ftb3VudD1pbnRlcmVzdF9hbW91bnQsCiAgICAvLyAgICAgcHJpbmNpcGFsX2Ftb3VudD1wcmluY2lwYWxfYW1vdW50LAogICAgLy8gICAgIHRvdGFsX2Ftb3VudD1pbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50LAogICAgLy8gICAgIHRpbWVzdGFtcD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICBjb250ZXh0PXBheW1lbnRfaW5mbywKICAgIC8vICkKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyAyCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgcHVzaGJ5dGVzIDB4MDAyMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VAMjQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfbWVyZ2VAMjUKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAxNToKICAgIGludGNfMCAvLyAwCiAgICBiIGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUAxNgoKCi8vIG1vZHVsZXMudHJhbnNmZXJfYWdlbnQuVHJhbnNmZXJBZ2VudC50cmFuc2Zlcl9zZXRfc2NoZWR1bGVbcm91dGluZ10oKSAtPiB2b2lkOgp0cmFuc2Zlcl9zZXRfc2NoZWR1bGU6CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MjYKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToyNwogICAgLy8gYXNzZXJ0IG9wZW5fZGF0ZSA8IGNsb3N1cmVfZGF0ZSwgZXJyLklOVkFMSURfU09SVElORwogICAgZHVwMgogICAgPAogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIG11c3QgYmUgc29ydGVkIGluIHN0cmljdGx5IGFzY2VuZGluZyBvcmRlcgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToyOQogICAgLy8gc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgPSBvcGVuX2RhdGUKICAgIGJ5dGVjIDI4IC8vICJ0cmFuc2Zlcl9vcGVuaW5nX2RhdGUiCiAgICB1bmNvdmVyIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjMwCiAgICAvLyBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSA9IGNsb3N1cmVfZGF0ZQogICAgYnl0ZWMgMjkgLy8gInRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjMxCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMudHJhbnNmZXJfYWdlbnQuVHJhbnNmZXJBZ2VudC5wcmltYXJ5X2Rpc3RyaWJ1dGlvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnByaW1hcnlfZGlzdHJpYnV0aW9uOgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTozMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo3MQogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYucHJpbWFyeV9kZWFsZXIsIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyMiAvLyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQzCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo0NAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQ1CiAgICAvLyBhc3NlcnQgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TRUQKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBjbG9zZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDcKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQoaG9sZGluZ19hZGRyZXNzKQogICAgc3dhcAogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo0OAogICAgLy8gYXNzZXJ0IHVuaXRzID4gVUludDY0KDApLCBlcnIuWkVST19VTklUUwogICAgZHVwCiAgICBhc3NlcnQgLy8gQ2FuIG5vdCBkaXN0cmlidXRlIHplcm8gdW5pdHMKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NTAKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgKyB1bml0cyA8PSBzZWxmLnRvdGFsX3VuaXRzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIGV4aXN0cwogICAgKwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIDw9CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQ5LTUxCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgKyB1bml0cyA8PSBzZWxmLnRvdGFsX3VuaXRzCiAgICAvLyApLCBlcnIuT1ZFUl9ESVNUUklCVVRJT04KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgcmVtYWluaW5nIEQtQVNBIHVuaXRzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjUyCiAgICAvLyBpZiBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNyAvLyAiaW5pdGlhbF9leGNoYW5nZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSBleGlzdHMKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo1NAogICAgLy8gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPD0gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGUKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNyAvLyAiaW5pdGlhbF9leGNoYW5nZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSBleGlzdHMKICAgIDw9CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjUzLTU1CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDw9IHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlCiAgICAvLyApLCBlcnIuUFJJTUFSWV9ESVNUUklCVVRJT05fQ0xPU0VECiAgICBhc3NlcnQgLy8gUHJpbWFyeSBkaXN0cmlidXRpb24gaXMgY2xvc2VkCgpwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTQ4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5yZXNlcnZlZF91bml0cyArPSB1bml0cwogICAgZHVwbiAyCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCA0MAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAzCiAgICBkdXAKICAgIGNvdmVyIDMKICAgICsKICAgIGl0b2IKICAgIHB1c2hpbnQgNDAKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjU4CiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsICs9IHVuaXRzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIGV4aXN0cwogICAgKwogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjU5CiAgICAvLyByZXR1cm4gc2VsZi50b3RhbF91bml0cyAtIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICBzd2FwCiAgICAtCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnRyYW5zZmVyX2FnZW50LlRyYW5zZmVyQWdlbnQudHJhbnNmZXJbcm91dGluZ10oKSAtPiB2b2lkOgp0cmFuc2ZlcjoKICAgIGludGNfMCAvLyAwCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cG4gMgogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojc1CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo3NgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDcKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjEzCiAgICAvLyBpZiBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyOCAvLyAidHJhbnNmZXJfb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIGJ6IHRyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNQogICAgLy8gc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyOCAvLyAidHJhbnNmZXJfb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIDw9CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE0LTE2CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyApLCBlcnIuQ0xPU0VEX1RSQU5TRkVSCiAgICBhc3NlcnQgLy8gVHJhbnNmZXIgaXMgY2xvc2VkCgp0cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE3CiAgICAvLyBpZiBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyOSAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIGJ6IHRyYW5zZmVyX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxOQogICAgLy8gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI5IC8vICJ0cmFuc2Zlcl9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgPAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxOC0yMAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8IHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlCiAgICAvLyApLCBlcnIuQ0xPU0VEX1RSQU5TRkVSCiAgICBhc3NlcnQgLy8gVHJhbnNmZXIgaXMgY2xvc2VkCgp0cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjgwCiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBzZW5kZXJfaG9sZGluZ19hZGRyZXNzLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICBkaWcgNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQyMwogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDgKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBkaWcgNQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA5CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjgzCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBkaWcgMgogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4NAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBkdXAKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODUKICAgIC8vIGFzc2VydCBzZW5kZXJfaG9sZGluZ19hZGRyZXNzICE9IHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcywgZXJyLlNFTEZfVFJBTlNGRVIKICAgIHVuY292ZXIgMgogICAgIT0KICAgIGFzc2VydCAvLyBTZW5kZXIgYW5kIHJlY2VpdmVyIG11c3QgYmUgZGlmZmVyZW50CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojg2CiAgICAvLyBhc3NlcnQgdW5pdHMgPiBVSW50NjQoMCksIGVyci5OVUxMX1RSQU5TRkVSCiAgICBkaWcgMQogICAgZHVwCiAgICBhc3NlcnQgLy8gVHJhbnNmZXIgdW5pdHMgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4NwogICAgLy8gYXNzZXJ0IHVuaXRzIDw9IHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cywgZXJyLk9WRVJfVFJBTlNGRVIKICAgIHN3YXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICA8PQogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCBzZW5kZXIgdW5pdHMgdG8gdHJhbnNmZXIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc2MwogICAgLy8gaWYgc2VsZi5ldmVudF9jdXJzb3IgPj0gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgPj0KICAgIGJueiB0cmFuc2Zlcl9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9hc3NlcnRfbm9fZHVlX2V2ZW50X3BlbmRpbmdAMTAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc2NQogICAgLy8gbmV4dF9lbnRyeSA9IHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLmV2ZW50X2N1cnNvcikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NjcKICAgIC8vIG5leHRfZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzY2LTc2OAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBuZXh0X2VudHJ5LnNjaGVkdWxlZF90aW1lID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICksIGVyci5QRU5ESU5HX0FDVFVTX0VWRU5UCiAgICBhc3NlcnQgLy8gQUNUVVMgZXZlbnQgbm90IHlldCBleGVjdXRlZAoKdHJhbnNmZXJfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYXNzZXJ0X25vX2R1ZV9ldmVudF9wZW5kaW5nQDEwOgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo5MAogICAgLy8gc2VsZi5fZW5zdXJlX3VuaXRzX2FjdGl2YXRlZChzZW5kZXJfaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDMKICAgIGR1cAogICAgY2FsbHN1YiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo5MQogICAgLy8gc2VsZi5fZW5zdXJlX3VuaXRzX2FjdGl2YXRlZChyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBkaWcgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjYWxsc3ViIF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjkyCiAgICAvLyBzZWxmLl9zZXR0bGVfcG9zaXRpb24oc2VuZGVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGNhbGxzdWIgX3NldHRsZV9wb3NpdGlvbgogICAgcG9wbiAyCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjkzCiAgICAvLyBzZWxmLl9zZXR0bGVfcG9zaXRpb24ocmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzKQogICAgY2FsbHN1YiBfc2V0dGxlX3Bvc2l0aW9uCiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNTIKICAgIC8vIGFzc2VydCB1bml0cyA8PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cywgZXJyLk9WRVJfVFJBTlNGRVIKICAgIGRpZyA1CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkaWcgMQogICAgPD0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgc2VuZGVyIHVuaXRzIHRvIHRyYW5zZmVyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTUzCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyAtPSB1bml0cwogICAgZGlnIDEKICAgIC0KICAgIGl0b2IKICAgIHVuY292ZXIgMgogICAgaW50Y18zIC8vIDMyCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTQ0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyArPSB1bml0cwogICAgZGlnIDUKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIHVuY292ZXIgMgogICAgKwogICAgaXRvYgogICAgaW50Y18zIC8vIDMyCiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo2MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfc3VzcGVuc2lvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfc3VzcGVuc2lvbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojc3CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyMSAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxODUKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZCA9IHN1c3BlbmRlZAogICAgZHVwCiAgICBwdXNoaW50IDQ4CiAgICBpbnRjXzEgLy8gMQogICAgYm94X2V4dHJhY3QKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgcHVzaGludCA0OAogICAgc3dhcAogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxODYKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE2NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF9vcGVuW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF9vcGVuOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjY4CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hY2NvdW50X21hbmFnZXIsIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyMyAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzOQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfRU5ERUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgMjAwCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxMAogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfZW5kZWQoKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgIQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjExCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxMgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTMKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozNAogICAgLy8gdW5pdHM9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozMi00MgogICAgLy8gcmV0dXJuIHR5cC5BY2NvdW50UG9zaXRpb24oCiAgICAvLyAgICAgcGF5bWVudF9hZGRyZXNzPXBheW1lbnRfYWRkcmVzcywKICAgIC8vICAgICB1bml0cz1VSW50NjQoMCksCiAgICAvLyAgICAgcmVzZXJ2ZWRfdW5pdHM9VUludDY0KDApLAogICAgLy8gICAgIHN1c3BlbmRlZD1GYWxzZSwKICAgIC8vICAgICBzZXR0bGVkX2N1cnNvcj1VSW50NjQoMCksCiAgICAvLyAgICAgaW50ZXJlc3RfY2hlY2twb2ludD1VSW50NjQoMCksCiAgICAvLyAgICAgcHJpbmNpcGFsX2NoZWNrcG9pbnQ9VUludDY0KDApLAogICAgLy8gICAgIGNsYWltYWJsZV9pbnRlcmVzdD1VSW50NjQoMCksCiAgICAvLyAgICAgY2xhaW1hYmxlX3ByaW5jaXBhbD1VSW50NjQoMCksCiAgICAvLyApCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGJ5dGVjIDQwIC8vIDB4MDAKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjE0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHNlbGYuX25ld19hY2NvdW50X3Bvc2l0aW9uKHBheW1lbnRfYWRkcmVzcykKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTUKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIzOAogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICB1bmNvdmVyIDMKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMzkKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQwCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0MQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzID0gcGF5bWVudF9hZGRyZXNzCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0MgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5hY2NvdW50X2dldF9wb3NpdGlvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfZ2V0X3Bvc2l0aW9uOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI1OQogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmNvbnRyYWN0X2NyZWF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X2NyZWF0ZToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDMwCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gYXJyYW5nZXIKICAgIGJ5dGVjIDE4IC8vIDB4NTIyMzQxNzI3MjYxNmU2NzY1NzIyMwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMzEKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAxOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfY29uZmlnW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfY29uZmlnOgogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBsZW4KICAgIHB1c2hpbnQgMTA3CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLk5vcm1hbGl6ZWRBY3R1c1Rlcm1zCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgcHVzaGludCA3MgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5Jbml0aWFsS2VybmVsU3RhdGUKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBsZW4KICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIHR1cGxlIGVuY29kaW5nCiAgICBkdXAKICAgIHB1c2hpbnQgMzQKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCB0YWlsIHBvaW50ZXIgYXQgaW5kZXggMSBvZiAodWludDhbMzJdLChsZW4rdXRmOFtdKSkKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgY292ZXIgMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMzYKICAgICsKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuUHJvc3BlY3R1cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2MgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDY0LTEwNjUKICAgIC8vICMgQ29uZmlndXJlIENvbnRyYWN0CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPSB0ZXJtcy5jb250cmFjdF90eXBlLmFzX3VpbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgYnogY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUA3CiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIyMAogICAgLy8gVUludDY0KGVudW1zLkNUX0FOTiksCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIxCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfTkFNKSwKICAgIHB1c2hpbnQgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIyCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfTEFNKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIzCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfTEFYKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjI0CiAgICAvLyBVSW50NjQoZW51bXMuQ1RfQ0xNKSwKICAgIHB1c2hpbnQgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJ6IGNvbnRyYWN0X2NvbmZpZ19ib29sX2ZhbHNlQDgKCmNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANzoKICAgIGludGNfMSAvLyAxCgpjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUA5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjI5CiAgICAvLyBhc3NlcnQgc2VsZi5faXNfc3VwcG9ydGVkX2NvbnRyYWN0X3R5cGUoY29udHJhY3RfdHlwZSksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2NwogICAgLy8gc2VsZi5fc3RvcmVfY29udHJhY3RfY29uZmlnKHNlbGYuY29udHJhY3RfdHlwZSwgdGVybXMsIGluaXRpYWxfc3RhdGUpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgYnVyeSAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzI1CiAgICAvLyBhc3NlcnQgdGVybXMuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZGlnIDQKICAgIGR1cAogICAgcHVzaGludCAzMwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSA4CiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMjcKICAgIC8vIHRlcm1zLmRheV9jb3VudF9jb252ZW50aW9uLmFzX3VpbnQ2NCgpCiAgICBwdXNoaW50IDU3CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICBieiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDE2CiAgICBkaWcgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk5CiAgICAvLyBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI5Ny0zMDMKICAgIC8vIHJldHVybiBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzYwKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwSVNEQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjApLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDE2CiAgICBkaWcgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzAwCiAgICAvLyBVSW50NjQoZW51bXMuRENDX0EzNjUpLAogICAgcHVzaGludCAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyOTctMzAzCiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgID09CiAgICBibnogY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUAxNgogICAgZGlnIDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMwMQogICAgLy8gVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGRpZyA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDIKICAgIC8vIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICA9PQogICAgYnogY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAMTcKCmNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTY6CiAgICBpbnRjXzEgLy8gMQoKY29udHJhY3RfY29uZmlnX2Jvb2xfbWVyZ2VAMTg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDktMzExCiAgICAvLyBhc3NlcnQgc2VsZi5faXNfc3VwcG9ydGVkX2RheV9jb3VudF9jb252ZW50aW9uKAogICAgLy8gICAgIGRheV9jb3VudF9jb252ZW50aW9uCiAgICAvLyApLCBlcnIuSU5WQUxJRF9EQVlfQ09VTlRfQ09OVkVOVElPTgogICAgYXNzZXJ0IC8vIEludmFsaWQgZGF5LWNvdW50IGNvbnZlbnRpb24gSUQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMyOQogICAgLy8gaWYgY29udHJhY3RfdHlwZSAhPSBVSW50NjQoZW51bXMuQ1RfQU5OKToKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgICE9CiAgICBieiBjb250cmFjdF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzMwCiAgICAvLyBhc3NlcnQgbm90IHRlcm1zLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24sIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZGlnIDQKICAgIHB1c2hpbnQgNzg2CiAgICBnZXRiaXQKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KCmNvbnRyYWN0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDIwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODA3CiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIEQtQVNBIGFscmVhZHkgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODA4CiAgICAvLyBhc3NlcnQgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCA9PSBVSW50NjQoMCksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMCAvLyAiaW5pdGlhbF9leGNoYW5nZV9hbW91bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTAtODExCiAgICAvLyAjIFNldCBEZW5vbWluYXRpb24gQXNzZXQKICAgIC8vIHNlbGYuX2Fzc2VydF9kZW5vbWluYXRpb25fYXNzZXQodGVybXMuZGVub21pbmF0aW9uX2Fzc2V0X2lkKQogICAgZGlnIDQKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NzUtNzc2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIGRlbm9taW5hdGlvbiB3aXRoIEFTQQogICAgLy8gX2NyZWF0b3IsIGV4aXN0cyA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X2NyZWF0b3IoZGVub21pbmF0aW9uX2Fzc2V0X2lkKQogICAgZHVwCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q3JlYXRvcgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NzcKICAgIC8vIGFzc2VydCBleGlzdHMsIGVyci5JTlZBTElEX0RFTk9NSU5BVElPTgogICAgYXNzZXJ0IC8vIERlbm9taW5hdGlvbiBhc3NldCBpcyBub3QgcHJvcGVybHkgc2V0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODAKICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICBieXRlYyA0NCAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTQtODE1CiAgICAvLyAjIFNldCBTZXR0bGVtZW50IEFzc2V0CiAgICAvLyBzZWxmLl9hc3NlcnRfc2V0dGxlbWVudF9hc3NldCh0ZXJtcy5zZXR0bGVtZW50X2Fzc2V0X2lkKQogICAgZGlnIDEKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc4NQogICAgLy8gc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODMtNzg2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc2V0dGxlbWVudCBhc3NldCBpcyB0aGUgZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQgPT0gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIC8vICksIGVyci5JTlZBTElEX1NFVFRMRU1FTlRfQVNTRVQKICAgIGFzc2VydCAvLyBEaWZmZXJlbnQgc2V0dGxlbWVudCBhc3NldCBub3Qgc3VwcG9ydGVkLCBtdXN0IGJlIGVxdWFsIHRvIGRlbm9taW5hdGlvbiBhc3NldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Nzg5CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBzZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkwLTc5NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhc3NldF9hbW91bnQ9MCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Nzk1CiAgICAvLyBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkzCiAgICAvLyBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc5NAogICAgLy8gYXNzZXRfYW1vdW50PTAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkwLTc5MQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3OTAtNzk2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODE4LTgxOQogICAgLy8gIyBVbml0cwogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IHRlcm1zLnRvdGFsX3VuaXRzCiAgICBkdXAKICAgIHB1c2hpbnQgMTcKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODIwCiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID0gVUludDY0KDApCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgyMi04MjMKICAgIC8vICMgRGF5LUNvdW50IENvbnZlbnRpb25zCiAgICAvLyBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uID0gdGVybXMuZGF5X2NvdW50X2NvbnZlbnRpb24uYXNfdWludDY0KCkKICAgIGJ5dGVjIDQ2IC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGRpZyA4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODI1LTgyNgogICAgLy8gIyBUaW1lCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA9IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZQogICAgZHVwCiAgICBwdXNoaW50IDQxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMjcgLy8gImluaXRpYWxfZXhjaGFuZ2VfZGF0ZSIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODI3CiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSB0ZXJtcy5tYXR1cml0eV9kYXRlCiAgICBkaWcgMQogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDQ1IC8vICJtYXR1cml0eV9kYXRlIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MjgKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IGluaXRpYWxfc3RhdGUubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZGlnIDYKICAgIGR1cAogICAgY292ZXIgMgogICAgcHVzaGludCA0OAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzMC04MzEKICAgIC8vICMgUHJpbmNpcGFsCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID0gdGVybXMuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGRpZyAxMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzMgogICAgLy8gc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gdGVybXMuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZGlnIDMKICAgIHB1c2hpbnQgNzg2CiAgICBnZXRiaXQKICAgIGJ5dGVjIDM0IC8vICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzMwogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBpbml0aWFsX3N0YXRlLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZGlnIDEKICAgIHB1c2hpbnQgMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODM1LTgzNgogICAgLy8gIyBJbnRlcmVzdAogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ID0gaW5pdGlhbF9zdGF0ZS5hY2NydWVkX2ludGVyZXN0CiAgICBkaWcgMQogICAgcHVzaGludCA0MAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODM4LTgzOQogICAgLy8gIyBJbnRlcmVzdCBSYXRlCiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IGluaXRpYWxfc3RhdGUubm9taW5hbF9pbnRlcmVzdF9yYXRlCiAgICBkaWcgMQogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0MAogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gaW5pdGlhbF9zdGF0ZS5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlCiAgICBkaWcgMQogICAgcHVzaGludCAyNAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQxCiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkID0gdGVybXMucmF0ZV9yZXNldF9zcHJlYWQKICAgIGRpZyAzCiAgICBwdXNoaW50IDU4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzUgLy8gInJhdGVfcmVzZXRfc3ByZWFkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0MgogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIgPSB0ZXJtcy5yYXRlX3Jlc2V0X211bHRpcGxpZXIKICAgIGRpZyAzCiAgICBwdXNoaW50IDY2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzYgLy8gInJhdGVfcmVzZXRfbXVsdGlwbGllciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDMKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9mbG9vciA9IHRlcm1zLnJhdGVfcmVzZXRfZmxvb3IKICAgIGRpZyAzCiAgICBwdXNoaW50IDc0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzAgLy8gInJhdGVfcmVzZXRfZmxvb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQ0CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfY2FwID0gdGVybXMucmF0ZV9yZXNldF9jYXAKICAgIGRpZyAzCiAgICBwdXNoaW50IDgyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzEgLy8gInJhdGVfcmVzZXRfY2FwIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0NQogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X25leHQgPSB0ZXJtcy5yYXRlX3Jlc2V0X25leHQKICAgIGRpZyAzCiAgICBwdXNoaW50IDkwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzcgLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDYKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgPSB0ZXJtcy5oYXNfcmF0ZV9yZXNldF9mbG9vcgogICAgZGlnIDMKICAgIHB1c2hpbnQgNzg0CiAgICBnZXRiaXQKICAgIGJ5dGVjIDM4IC8vICJoYXNfcmF0ZV9yZXNldF9mbG9vciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDcKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwID0gdGVybXMuaGFzX3JhdGVfcmVzZXRfY2FwCiAgICBkaWcgMwogICAgcHVzaGludCA3ODUKICAgIGdldGJpdAogICAgYnl0ZWMgMzkgLy8gImhhc19yYXRlX3Jlc2V0X2NhcCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDktODUwCiAgICAvLyAjIFNjYWxpbmcKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgPSB0ZXJtcy5maXhlZF9wb2ludF9zY2FsZQogICAgdW5jb3ZlciAzCiAgICBwdXNoaW50IDk5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODUyLTg1MwogICAgLy8gIyBTY2hlZHVsZSBQcm9jZXNzaW5nCiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciA9IGluaXRpYWxfc3RhdGUuZXZlbnRfY3Vyc29yCiAgICBkaWcgMQogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU1LTg1NgogICAgLy8gIyBQZXItVW5pdCBGaXhlZC1Qb2ludCBJbmRleGVzCiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggPSBpbml0aWFsX3N0YXRlLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgKICAgIGRpZyAxCiAgICBwdXNoaW50IDU2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU3CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4ID0gaW5pdGlhbF9zdGF0ZS5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleAogICAgZGlnIDEKICAgIHB1c2hpbnQgNjQKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU5LTg2MAogICAgLy8gIyBSZXNlcnZlZCBBbW91bnQgKGZvciBleGVjdXRlZCBjYXNoZmxvd3MpCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0ID0gVUludDY0KDApCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2MQogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2MwogICAgLy8gYXNzZXJ0IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLCBlcnIuSU5WQUxJRF9JRUQKICAgIGRpZyAyCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICBhc3NlcnQgLy8gSUVEIG11c3QgYmUgc2V0IGluIHRoZSBmdXR1cmUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2NAogICAgLy8gYXNzZXJ0IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA+IGluaXRpYWxfc3RhdGUuc3RhdHVzX2RhdGUsIGVyci5JTlZBTElEX0lFRAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgPAogICAgYXNzZXJ0IC8vIElFRCBtdXN0IGJlIHNldCBpbiB0aGUgZnV0dXJlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NjUKICAgIC8vIGFzc2VydCB0ZXJtcy5pbml0aWFsX2V4Y2hhbmdlX2RhdGUgPCB0ZXJtcy5tYXR1cml0eV9kYXRlLCBlcnIuSU5WQUxJRF9JRUQKICAgIDwKICAgIGFzc2VydCAvLyBJRUQgbXVzdCBiZSBzZXQgaW4gdGhlIGZ1dHVyZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2OS0xMDcwCiAgICAvLyAjIE5vdGFyaXplIHByb3NwZWN0dXMgKG9wdGlvbmFsKQogICAgLy8gc2VsZi5wcm9zcGVjdHVzX2hhc2ggPSBwcm9zcGVjdHVzLmhhc2guYnl0ZXMKICAgIGRpZyAyCiAgICBleHRyYWN0IDAgMzIKICAgIGJ5dGVjIDQyIC8vICJwcm9zcGVjdHVzX2hhc2giCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3MQogICAgLy8gc2VsZi5wcm9zcGVjdHVzX3VybCA9IHByb3NwZWN0dXMudXJsCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGVjIDQzIC8vICJwcm9zcGVjdHVzX3VybCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDcyCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAMTc6CiAgICBpbnRjXzAgLy8gMAogICAgYiBjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUAxOAoKY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAODoKICAgIGludGNfMCAvLyAwCiAgICBiIGNvbnRyYWN0X2NvbmZpZ19ib29sX21lcmdlQDkKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9zY2hlZHVsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X3NjaGVkdWxlOgogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHN3YXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBkdXAKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgMgogICAgKwogICAgdW5jb3ZlciAyCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLkV4ZWN1dGlvblNjaGVkdWxlRW50cnk+CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDg5CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwOTIKICAgIC8vIGNvbnRyYWN0X3R5cGU9c2VsZi5jb250cmFjdF90eXBlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGNvdmVyIDMKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4ODEKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4ODItODg0CiAgICAvLyBhc3NlcnQgc2NoZWR1bGVfcGFnZS5sZW5ndGggPD0gVUludDY0KAogICAgLy8gICAgIGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUKICAgIC8vICksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGR1cAogICAgcHVzaGludCAxNgogICAgPD0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg4NQogICAgLy8gYXNzZXJ0IHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPiBVSW50NjQoMCksIGVyci5URVJNU19OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSB0ZXJtcyBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODg3CiAgICAvLyBwYWdlX2N1cnNvciA9IHNjaGVkdWxlX3BhZ2VfaW5kZXggKiBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkKICAgIHN3YXAKICAgIHB1c2hpbnQgMTYKICAgICoKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg5NAogICAgLy8gKyBwYWdlX2xlbmd0aCAqIFVJbnQ2NChjc3QuT1BfVVBfQ09OVFJBQ1RfQ09ORklHX1BFUl9FTlRSWV9CVURHRVQpCiAgICBwdXNoaW50IDEwMAogICAgKgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODkzCiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19CQVNFX0JVREdFVCkKICAgIGludGMgNCAvLyAxNTAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTMtODk0CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19CQVNFX0JVREdFVCkKICAgIC8vICsgcGFnZV9sZW5ndGggKiBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19QRVJfRU5UUllfQlVER0VUKQogICAgKwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODg5LTg5NgogICAgLy8gIyBWYWxpZGF0aW9uIGNvc3QgZ3Jvd3Mgd2l0aCBwYWdlIGxlbmd0aCwgc28gY29uZmlndXJhdGlvbiBleHBsaWNpdGx5CiAgICAvLyAjIGJ1eXMgZXh0cmEgb3Bjb2RlIGJ1ZGdldCBmb3IgbGFyZ2VyIHVwbG9hZHMuCiAgICAvLyBlbnN1cmVfYnVkZ2V0KAogICAgLy8gICAgIHJlcXVpcmVkX2J1ZGdldD0oCiAgICAvLyAgICAgICAgIFVJbnQ2NChjc3QuT1BfVVBfQ09OVFJBQ1RfQ09ORklHX0JBU0VfQlVER0VUKQogICAgLy8gICAgICAgICArIHBhZ2VfbGVuZ3RoICogVUludDY0KGNzdC5PUF9VUF9DT05UUkFDVF9DT05GSUdfUEVSX0VOVFJZX0JVREdFVCkKICAgIC8vICAgICApLAogICAgLy8gKQogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODk3CiAgICAvLyBpbmRleCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKCmNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEAyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODk4CiAgICAvLyB3aGlsZSBpbmRleCA8IHBhZ2VfbGVuZ3RoOgogICAgZHVwCiAgICBkaWcgNAogICAgPAogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfd2hpbGVAMTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg5OS05MDAKICAgIC8vIGVudHJ5ID0gc2NoZWR1bGVfcGFnZVtpbmRleF0uY29weSgpCiAgICAvLyBlbnRyeV9ldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZGlnIDQKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGJ1cnkgMTIKICAgIGRpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgNjUKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTAwCiAgICAvLyBlbnRyeV9ldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTktOTAwCiAgICAvLyBlbnRyeSA9IHNjaGVkdWxlX3BhZ2VbaW5kZXhdLmNvcHkoKQogICAgLy8gZW50cnlfZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGludGNfMiAvLyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDAKICAgIC8vIGVudHJ5X2V2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBnZXRieXRlCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgMTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkwMQogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X2lkID09IHBhZ2VfY3Vyc29yICsgaW5kZXgsIGVyci5JTlZBTElEX0VWRU5UX0lECiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEzCiAgICBkaWcgNQogICAgdW5jb3ZlciA0CiAgICArCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDItOTA0CiAgICAvLyBzZWxmLl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBlbnRyeV9ldmVudF90eXBlCiAgICAvLyApCiAgICBkaWcgNQogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTA1CiAgICAvLyBhc3NlcnQgZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgc3dhcAogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDYKICAgIC8vIGlmIGVudHJ5LmV2ZW50X2lkID4gVUludDY0KDApOgogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDcKICAgIC8vIGlmIGluZGV4ID4gVUludDY0KDApOgogICAgZHVwCiAgICBieiBjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlANgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTA4CiAgICAvLyBwcmV2aW91c19lbnRyeSA9IHNjaGVkdWxlX3BhZ2VbaW5kZXggLSBVSW50NjQoMSldLmNvcHkoKQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgcHVzaGludCA2NQogICAgKgogICAgZGlnIDExCiAgICBzd2FwCiAgICBwdXNoaW50IDY1CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkyMwogICAgLy8gcHJldmlvdXNfZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gZW50cnkuc2NoZWR1bGVkX3RpbWUKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyA4CiAgICA8PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTIyLTkyNAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBwcmV2aW91c19lbnRyeS5zY2hlZHVsZWRfdGltZSA8PSBlbnRyeS5zY2hlZHVsZWRfdGltZQogICAgLy8gKSwgZXJyLklOVkFMSURfU09SVElORwogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIG11c3QgYmUgc29ydGVkIGluIHN0cmljdGx5IGFzY2VuZGluZyBvcmRlcgoKY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUA4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTI1CiAgICAvLyBpZiBlbnRyeS5ldmVudF9pZCA9PSBVSW50NjQoMCk6CiAgICBkaWcgOAogICAgYm56IGNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkyNi05MjgKICAgIC8vIGFzc2VydCBlbnRyeV9ldmVudF90eXBlID09IFVJbnQ2NCgKICAgIC8vICAgICBlbnVtcy5FVlRfSUVECiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGRpZyA5CiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjkKICAgIC8vIGluZGV4ICs9IFVJbnQ2NCgxKQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIGNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEAyCgpjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlANjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkxMC05MTIKICAgIC8vICMgVGhlIGZpcnN0IGVudHJ5IG9mIGEgcGFnZSBtdXN0IHN0aWxsIGJlIG9yZGVyZWQgYWZ0ZXIgdGhlCiAgICAvLyAjIGxhc3QgZW50cnkgb2YgdGhlIHByZXZpb3VzIHBhZ2UuCiAgICAvLyBhc3NlcnQgc2NoZWR1bGVfcGFnZV9pbmRleCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGRpZyA2CiAgICBkdXAKICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTMKICAgIC8vIHByZXZpb3VzX3BhZ2VfaW5kZXggPSBzY2hlZHVsZV9wYWdlX2luZGV4IC0gVUludDY0KDEpCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTE1CiAgICAvLyBwcmV2aW91c19wYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZQogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTQtOTE2CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHByZXZpb3VzX3BhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTctOTE4CiAgICAvLyBwcmV2aW91c19wYWdlID0gc2VsZi5zY2hlZHVsZV9wYWdlW3ByZXZpb3VzX3BhZ2VfaW5kZXhdLmNvcHkoKQogICAgLy8gYXNzZXJ0IHByZXZpb3VzX3BhZ2UubGVuZ3RoID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBwdXNoaW50IDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTgKICAgIC8vIGFzc2VydCBwcmV2aW91c19wYWdlLmxlbmd0aCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZHVwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjAKICAgIC8vIHByZXZpb3VzX3BhZ2UubGVuZ3RoIC0gVUludDY0KDEpCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTE5LTkyMQogICAgLy8gcHJldmlvdXNfZW50cnkgPSBwcmV2aW91c19wYWdlWwogICAgLy8gICAgIHByZXZpb3VzX3BhZ2UubGVuZ3RoIC0gVUludDY0KDEpCiAgICAvLyBdLmNvcHkoKQogICAgcHVzaGludCA2NQogICAgKgogICAgcHVzaGludCAyCiAgICArCiAgICBwdXNoaW50IDY1CiAgICBib3hfZXh0cmFjdAogICAgYiBjb250cmFjdF9zY2hlZHVsZV9hZnRlcl9pZl9lbHNlQDcKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX3doaWxlQDExOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjAwCiAgICAvLyBzZWxmLnNjaGVkdWxlX3BhZ2VbcGFnZV9pbmRleF0gPSBzY2hlZHVsZV9wYWdlLmNvcHkoKQogICAgZGlnIDYKICAgIGl0b2IKICAgIGJ5dGVjIDI0IC8vIDB4NTMyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgZGlnIDUKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzMgogICAgLy8gaWYgaXNfbGFzdF9wYWdlOgogICAgZGlnIDUKICAgIGJ6IGNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzNAogICAgLy8gc2NoZWR1bGVfcGFnZV9pbmRleCAqIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKSArIHBhZ2VfbGVuZ3RoCiAgICBkaWcgMQogICAgZGlnIDQKICAgICsKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzMwogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA9ICgKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTMzLTkzNQogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA9ICgKICAgIC8vICAgICBzY2hlZHVsZV9wYWdlX2luZGV4ICogVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpICsgcGFnZV9sZW5ndGgKICAgIC8vICkKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MzYKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgNTAKICAgIGFwcF9nbG9iYWxfcHV0Cgpjb250cmFjdF9zY2hlZHVsZV9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA5NwogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9leGVjdXRlX2llZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X2V4ZWN1dGVfaWVkOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMDcKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEwOAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMDkKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTExCiAgICAvLyBhc3NlcnQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LCBlcnIuSU5WQUxJRF9FVkVOVF9DVVJTT1IKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgZGlnIDEKICAgID4KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGN1cnNvcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTExMgogICAgLy8gZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoc2VsZi5ldmVudF9jdXJzb3IpCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMTMKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoZW51bXMuRVZUX0lFRCksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGR1cAogICAgZXh0cmFjdCA4IDEKICAgIGR1cAogICAgcHVzaGJ5dGVzIDB4MDEKICAgIGI9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTExNwogICAgLy8gZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICBkaWcgMQogICAgZXh0cmFjdCAwIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMTkKICAgIC8vIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgZGlnIDIKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTIwCiAgICAvLyBhY2NydWFsX2ZhY3Rvcj1lbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIGRpZyAzCiAgICBleHRyYWN0IDE3IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMjEKICAgIC8vIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIGRpZyA0CiAgICBleHRyYWN0IDI1IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMjMKICAgIC8vIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPWVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDUKICAgIGV4dHJhY3QgMzMgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEyNAogICAgLy8gbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgZGlnIDYKICAgIGV4dHJhY3QgNDEgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEyNQogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9ZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICBkaWcgNwogICAgZXh0cmFjdCA0OSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTI2CiAgICAvLyBmbGFncz1lbnRyeS5mbGFncywKICAgIGRpZyA4CiAgICBleHRyYWN0IDU3IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMTYtMTEyNwogICAgLy8gdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0KAogICAgLy8gICAgIGV2ZW50X2lkPWVudHJ5LmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1lbnRyeS5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1lbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPWVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9ZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPWVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGZsYWdzPWVudHJ5LmZsYWdzLAogICAgLy8gKSwKICAgIHVuY292ZXIgNwogICAgdW5jb3ZlciA4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNwogICAgY29uY2F0CiAgICB1bmNvdmVyIDYKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMjIKICAgIC8vIG9ic2VydmVkX3JhdGU9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMTYtMTEyNwogICAgLy8gdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0KAogICAgLy8gICAgIGV2ZW50X2lkPWVudHJ5LmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1lbnRyeS5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1lbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPWVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9ZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPWVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGZsYWdzPWVudHJ5LmZsYWdzLAogICAgLy8gKSwKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTE0LTExMjgKICAgIC8vIHNlbGYuX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5KAogICAgLy8gICAgIGVudHJ5LAogICAgLy8gICAgIHR5cC5PYnNlcnZlZEV2ZW50UmVxdWVzdCgKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPWVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIG9ic2VydmVkX3JhdGU9VUludDY0KDApLAogICAgLy8gICAgICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1lbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1lbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICAgICAgZmxhZ3M9ZW50cnkuZmxhZ3MsCiAgICAvLyAgICAgKSwKICAgIC8vICkKICAgIGNhbGxzdWIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5CiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMjkKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA5OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuYXBwbHlfbm9uX2Nhc2hfZXZlbnRbcm91dGluZ10oKSAtPiB2b2lkOgphcHBseV9ub25fY2FzaF9ldmVudDoKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDQKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cG4gMgogICAgbGVuCiAgICBwdXNoaW50IDczCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLk9ic2VydmVkRXZlbnRSZXF1ZXN0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE0NQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDYKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTQ4CiAgICAvLyBpZiBwYXlsb2FkLmZsYWdzICYgVUludDY0KGVudW1zLkZMQUdfT0JTRVJWRURfRVZFTlQpOgogICAgcHVzaGludCA2NQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgcHVzaGludCA0CiAgICAmCiAgICBieiBhcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIzMwogICAgLy8gcmV0dXJuIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQ0xNKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICBwdXNoaW50IDUKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTQ5CiAgICAvLyBhc3NlcnQgc2VsZi5fc3VwcG9ydHNfb2JzZXJ2ZWRfZXZlbnRzKCksIGVyci5PQlNFUlZFRF9FVkVOVF9SRVFVSVJFRAogICAgYXNzZXJ0IC8vIE9ic2VydmVkIGV2ZW50IHJlcXVpcmVkIHRvIGV4ZWN1dGUgdGhpcyBhY3Rpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTAKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjMzCiAgICAvLyByZXR1cm4gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9DTE0pCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIGR1cAogICAgcHVzaGludCA1CiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQ1CiAgICAvLyBhc3NlcnQgc2VsZi5fc3VwcG9ydHNfb2JzZXJ2ZWRfZXZlbnRzKCksIGVyci5PQlNFUlZFRF9FVkVOVF9SRVFVSVJFRAogICAgYXNzZXJ0IC8vIE9ic2VydmVkIGV2ZW50IHJlcXVpcmVkIHRvIGV4ZWN1dGUgdGhpcyBhY3Rpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk0NgogICAgLy8gYXNzZXJ0IHBheWxvYWQuZXZlbnRfaWQgPT0gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGRpZyAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDcKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBpZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQ4CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUsIHBheWxvYWQuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgYnVyeSAxMgogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk0Ny05NDkKICAgIC8vIHNlbGYuX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIHNlbGYuY29udHJhY3RfdHlwZSwgcGF5bG9hZC5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICAvLyApCiAgICBjYWxsc3ViIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTUxCiAgICAvLyBwYWdlX2luZGV4ID0gc2VsZi5fc2NoZWR1bGVfcGFnZV9pbmRleChzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTkwCiAgICAvLyByZXR1cm4gZXZlbnRfaWQgLy8gVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpCiAgICBwdXNoaW50IDE2CiAgICAvCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTIKICAgIC8vIHBhZ2UgPSB0eXAuRXhlY3V0aW9uU2NoZWR1bGVQYWdlKCkKICAgIGJ5dGVjIDQ4IC8vIDB4MDAwMAogICAgYnVyeSA3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTMKICAgIC8vIGlmIHBhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlOgogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA5CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMjcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1NAogICAgLy8gcGFnZSA9IHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XS5jb3B5KCkKICAgIGRpZyA3CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidXJ5IDcKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX3BhZ2UgZW50cnkgZXhpc3RzCgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDI3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTU1CiAgICAvLyBhc3NlcnQgcGFnZS5sZW5ndGggPCBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGRpZyA1CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgMTYKICAgIDwKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2MAogICAgLy8gc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIGRpZyAzCiAgICBkdXAKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjEKICAgIC8vIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICBkaWcgMQogICAgZXh0cmFjdCAxNyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjIKICAgIC8vIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZGlnIDIKICAgIGV4dHJhY3QgMjUgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTYzCiAgICAvLyBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDMKICAgIGV4dHJhY3QgNDEgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTY0CiAgICAvLyBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIGRpZyA0CiAgICBleHRyYWN0IDQ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2NQogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIHVuY292ZXIgNQogICAgZXh0cmFjdCA1NyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTctOTY3CiAgICAvLyB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1wYXlsb2FkLmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9cGF5bG9hZC5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPXBheWxvYWQucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXBheWxvYWQubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICkKICAgIGRpZyAxMQogICAgaXRvYgogICAgZGlnIDE4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMwogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTYtOTY4CiAgICAvLyBwYWdlLmFwcGVuZCgKICAgIC8vICAgICB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9cGF5bG9hZC5ldmVudF9pZCwKICAgIC8vICAgICAgICAgZXZlbnRfdHlwZT1wYXlsb2FkLmV2ZW50X3R5cGUsCiAgICAvLyAgICAgICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIC8vICAgICAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICAgICApCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjkKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHBhZ2UuY29weSgpCiAgICBkaWcgOAogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk3MAogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTUzCiAgICAvLyBhc3NlcnQgZXZlbnRfaWQgPT0gc2VsZi5ldmVudF9jdXJzb3IsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBjdXJzb3IKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTQKICAgIC8vIGVudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KGV2ZW50X2lkKQogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1NgogICAgLy8gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgYnVyeSAxMAogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjQKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY1CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzYzLTM3MAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9SUiksCiAgICBwdXNoaW50IDEyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY3CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICBwdXNoaW50IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY4CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgcHVzaGludCAxOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzYzLTM3MAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBieiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX2ZhbHNlQDE2CgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX3RydWVAMTU6CiAgICBpbnRjXzEgLy8gMQoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9tZXJnZUAxNzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTUtMTE1NwogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2lzX25vbl9jYXNoKAogICAgLy8gICAgIGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIC8vICksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IHR5cGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTgKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlICE9IGFyYzQuVUludDgoZW51bXMuRVZUX0lFRCksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGRpZyA4CiAgICBwdXNoYnl0ZXMgMHgwMQogICAgYiE9CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCB0eXBlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNzQKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluIChVSW50NjQoZW51bXMuRVZUX1JSKSwgVUludDY0KGVudW1zLkVWVF9SUkYpKQogICAgZGlnIDQKICAgIHB1c2hpbnQgMTIKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDIxCiAgICBkaWcgNAogICAgcHVzaGludCAxMQogICAgPT0KICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfZmFsc2VAMjIKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAyMToKICAgIGludGNfMSAvLyAxCgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX21lcmdlQDIzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1OQogICAgLy8gaWYgc2VsZi5fZXZlbnRfaXNfcmF0ZV9yZXNldChlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpKToKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Vsc2VfYm9keUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODAKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLm9ic2VydmVyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjUgLy8gMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTYzCiAgICAvLyBzZWxmLl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeShlbnRyeSwgcGF5bG9hZCkKICAgIGRpZyA2CiAgICBkaWcgMgogICAgY2FsbHN1YiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkKICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE2NAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Vsc2VfYm9keUA1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE2MgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICBiIGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VANgoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9mYWxzZUAyMjoKICAgIGludGNfMCAvLyAwCiAgICBiIGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfbWVyZ2VAMjMKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfZmFsc2VAMTY6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX21lcmdlQDE3CgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuYXBwZW5kX29ic2VydmVkX2Nhc2hfZXZlbnRbcm91dGluZ10oKSAtPiB2b2lkOgphcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudDoKICAgIGludGNfMCAvLyAwCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBsZW4KICAgIHB1c2hpbnQgNjUKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuT2JzZXJ2ZWRDYXNoRXZlbnRSZXF1ZXN0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE3NAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTc1CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE3NgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDcKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMzMKICAgIC8vIHJldHVybiBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0NMTSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgcHVzaGludCA1CiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTgxCiAgICAvLyBhc3NlcnQgc2VsZi5fc3VwcG9ydHNfb2JzZXJ2ZWRfZXZlbnRzKCksIGVyci5PQlNFUlZFRF9FVkVOVF9SRVFVSVJFRAogICAgYXNzZXJ0IC8vIE9ic2VydmVkIGV2ZW50IHJlcXVpcmVkIHRvIGV4ZWN1dGUgdGhpcyBhY3Rpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4MgogICAgLy8gYXNzZXJ0IHBheWxvYWQuZXZlbnRfaWQgPT0gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIHN3YXAKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgaWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4MwogICAgLy8gYXNzZXJ0IHBheWxvYWQuZXZlbnRfdHlwZSA9PSBhcmM0LlVJbnQ4KGVudW1zLkVWVF9QUiksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGRpZyAxCiAgICBleHRyYWN0IDggMQogICAgZHVwCiAgICBjb3ZlciAzCiAgICBwdXNoYnl0ZXMgMHgwMwogICAgYj09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCB0eXBlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5ODQKICAgIC8vIGFzc2VydCBwYXlsb2FkLmZsYWdzICYgVUludDY0KGVudW1zLkZMQUdfQ0FTSF9FVkVOVCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgc3dhcAogICAgcHVzaGludCA1NwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18xIC8vIDEKICAgICYKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4NgogICAgLy8gaWYgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA+IFVJbnQ2NCgwKToKICAgIGJ6IGFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTg4CiAgICAvLyBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IC0gVUludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTg3LTk4OQogICAgLy8gcHJldmlvdXNfZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoCiAgICAvLyAgICAgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCAtIFVJbnQ2NCgxKQogICAgLy8gKQogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OTEKICAgIC8vIHByZXZpb3VzX2VudHJ5LnNjaGVkdWxlZF90aW1lIDw9IHBheWxvYWQuc2NoZWR1bGVkX3RpbWUKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyA0CiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICA8PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTkwLTk5MgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBwcmV2aW91c19lbnRyeS5zY2hlZHVsZWRfdGltZSA8PSBwYXlsb2FkLnNjaGVkdWxlZF90aW1lCiAgICAvLyApLCBlcnIuSU5WQUxJRF9TT1JUSU5HCiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbXVzdCBiZSBzb3J0ZWQgaW4gc3RyaWN0bHkgYXNjZW5kaW5nIG9yZGVyCgphcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OTQKICAgIC8vIHBhZ2VfaW5kZXggPSBzZWxmLl9zY2hlZHVsZV9wYWdlX2luZGV4KHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxOTAKICAgIC8vIHJldHVybiBldmVudF9pZCAvLyBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkKICAgIHB1c2hpbnQgMTYKICAgIC8KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5NQogICAgLy8gcGFnZSA9IHR5cC5FeGVjdXRpb25TY2hlZHVsZVBhZ2UoKQogICAgYnl0ZWMgNDggLy8gMHgwMDAwCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5NgogICAgLy8gaWYgcGFnZV9pbmRleCBpbiBzZWxmLnNjaGVkdWxlX3BhZ2U6CiAgICBpdG9iCiAgICBieXRlYyAyNCAvLyAweDUzMjMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDcKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogYXBwZW5kX29ic2VydmVkX2Nhc2hfZXZlbnRfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OTcKICAgIC8vIHBhZ2UgPSBzZWxmLnNjaGVkdWxlX3BhZ2VbcGFnZV9pbmRleF0uY29weSgpCiAgICBkaWcgNQogICAgYm94X2dldAogICAgc3dhcAogICAgYnVyeSA2CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9wYWdlIGVudHJ5IGV4aXN0cwoKYXBwZW5kX29ic2VydmVkX2Nhc2hfZXZlbnRfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTk4CiAgICAvLyBhc3NlcnQgcGFnZS5sZW5ndGggPCBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGRpZyA0CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgMTYKICAgIDwKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMDMKICAgIC8vIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICBkaWcgNQogICAgZHVwCiAgICBleHRyYWN0IDkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAwNAogICAgLy8gYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIGRpZyAxCiAgICBleHRyYWN0IDE3IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMDUKICAgIC8vIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZGlnIDIKICAgIGV4dHJhY3QgMjUgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAwNgogICAgLy8gbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9cGF5bG9hZC5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIGRpZyAzCiAgICBleHRyYWN0IDMzIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMDcKICAgIC8vIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgZGlnIDQKICAgIGV4dHJhY3QgNDEgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAwOAogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIHVuY292ZXIgNQogICAgZXh0cmFjdCA0OSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDAwLTEwMTAKICAgIC8vIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgIGV2ZW50X2lkPXBheWxvYWQuZXZlbnRfaWQsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1wYXlsb2FkLmV2ZW50X3R5cGUsCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPXBheWxvYWQubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1wYXlsb2FkLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICBmbGFncz1wYXlsb2FkLmZsYWdzLAogICAgLy8gKQogICAgZGlnIDEwCiAgICBpdG9iCiAgICBkaWcgMTAKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5OS0xMDExCiAgICAvLyBwYWdlLmFwcGVuZCgKICAgIC8vICAgICB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9cGF5bG9hZC5ldmVudF9pZCwKICAgIC8vICAgICAgICAgZXZlbnRfdHlwZT1wYXlsb2FkLmV2ZW50X3R5cGUsCiAgICAvLyAgICAgICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIC8vICAgICAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICAgICApCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDEyCiAgICAvLyBzZWxmLnNjaGVkdWxlX3BhZ2VbcGFnZV9pbmRleF0gPSBwYWdlLmNvcHkoKQogICAgZGlnIDYKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDEzCiAgICAvLyBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50ICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExODAKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfZ2V0X3N0YXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfZ2V0X3N0YXRlOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBkdXAKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE4NwogICAgLy8gY29udHJhY3RfdHlwZT1hcmM0LlVJbnQ4KHNlbGYuY29udHJhY3RfdHlwZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzIgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExODkKICAgIC8vIHRvdGFsX3VuaXRzPXNlbGYudG90YWxfdW5pdHMsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE5MAogICAgLy8gcmVzZXJ2ZWRfdW5pdHNfdG90YWw9c2VsZi5yZXNlcnZlZF91bml0c190b3RhbCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTkxCiAgICAvLyBpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudD1zZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExOTIKICAgIC8vIGV2ZW50X2N1cnNvcj1zZWxmLmV2ZW50X2N1cnNvciwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE5MwogICAgLy8gc2NoZWR1bGVfZW50cnlfY291bnQ9c2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExOTQKICAgIC8vIG91dHN0YW5kaW5nX3ByaW5jaXBhbD1zZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE5NQogICAgLy8gaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZT1zZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE5NgogICAgLy8gbm9taW5hbF9pbnRlcmVzdF9yYXRlPXNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTk3CiAgICAvLyBhY2NydWVkX2ludGVyZXN0PXNlbGYuYWNjcnVlZF9pbnRlcmVzdCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTk4CiAgICAvLyBjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4PXNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE5OQogICAgLy8gY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXg9c2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjAwCiAgICAvLyByZXNlcnZlZF9pbnRlcmVzdD1zZWxmLnJlc2VydmVkX2ludGVyZXN0LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMDEKICAgIC8vIHJlc2VydmVkX3ByaW5jaXBhbD1zZWxmLnJlc2VydmVkX3ByaW5jaXBhbCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExODYtMTIwMgogICAgLy8gcmV0dXJuIHR5cC5LZXJuZWxTdGF0ZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlPWFyYzQuVUludDgoc2VsZi5jb250cmFjdF90eXBlKSwKICAgIC8vICAgICBzdGF0dXM9c2VsZi5zdGF0dXMsCiAgICAvLyAgICAgdG90YWxfdW5pdHM9c2VsZi50b3RhbF91bml0cywKICAgIC8vICAgICByZXNlcnZlZF91bml0c190b3RhbD1zZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsLAogICAgLy8gICAgIGluaXRpYWxfZXhjaGFuZ2VfYW1vdW50PXNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQsCiAgICAvLyAgICAgZXZlbnRfY3Vyc29yPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgLy8gICAgIHNjaGVkdWxlX2VudHJ5X2NvdW50PXNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQsCiAgICAvLyAgICAgb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2U9c2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlLAogICAgLy8gICAgIG5vbWluYWxfaW50ZXJlc3RfcmF0ZT1zZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBhY2NydWVkX2ludGVyZXN0PXNlbGYuYWNjcnVlZF9pbnRlcmVzdCwKICAgIC8vICAgICBjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4PXNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCwKICAgIC8vICAgICBjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleD1zZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4LAogICAgLy8gICAgIHJlc2VydmVkX2ludGVyZXN0PXNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QsCiAgICAvLyAgICAgcmVzZXJ2ZWRfcHJpbmNpcGFsPXNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsLAogICAgLy8gKQogICAgdW5jb3ZlciAxNAogICAgaXRvYgogICAgdW5jb3ZlciAxNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDEzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDEwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgOQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDgKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTgyCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnRbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIwOAogICAgLy8gaWYgc2VsZi5ldmVudF9jdXJzb3IgPj0gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgPj0KICAgIGJ6IGNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMTAKICAgIC8vIGV2ZW50X2lkPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjA5LTEyMTkKICAgIC8vIHJldHVybiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1zZWxmLmV2ZW50X2N1cnNvciwKICAgIC8vICAgICBldmVudF90eXBlPWFyYzQuVUludDgoMCksCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9VUludDY0KDApLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9VUludDY0KDApLAogICAgLy8gICAgIGZsYWdzPVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGl0b2IKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMTEKICAgIC8vIGV2ZW50X3R5cGU9YXJjNC5VSW50OCgwKSwKICAgIGJ5dGVjIDQwIC8vIDB4MDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMDktMTIxOQogICAgLy8gcmV0dXJuIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgIGV2ZW50X2lkPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgLy8gICAgIGV2ZW50X3R5cGU9YXJjNC5VSW50OCgwKSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1VSW50NjQoMCksCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1VSW50NjQoMCksCiAgICAvLyAgICAgZmxhZ3M9VUludDY0KDApLAogICAgLy8gKQogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjEyCiAgICAvLyBzY2hlZHVsZWRfdGltZT1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIwOS0xMjE5CiAgICAvLyByZXR1cm4gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkoCiAgICAvLyAgICAgZXZlbnRfaWQ9c2VsZi5ldmVudF9jdXJzb3IsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1hcmM0LlVJbnQ4KDApLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPVVJbnQ2NCgwKSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249VUludDY0KDApLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPVVJbnQ2NCgwKSwKICAgIC8vICAgICBmbGFncz1VSW50NjQoMCksCiAgICAvLyApCiAgICBpdG9iCiAgICBzd2FwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKCmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudF9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudEA0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIwNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpjb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIyMAogICAgLy8gcmV0dXJuIHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLmV2ZW50X2N1cnNvcikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjA0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50QDQKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5jb250cmFjdF91cGRhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF91cGRhdGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTUzLTE1NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGdyYW50cyB0aGUgdXBkYXRlIHBlcm1pc3Npb25zIHRvIHRoZSBBcnJhbmdlci4KICAgIC8vICMg4pqg77iPIFdBUk5JTkc6IEFwcGxpY2F0aW9uIHVwZGF0ZXMgbXVzdCBiZSBleGVjdXRlZCBWRVJZIGNhcmVmdWxseSwgYXMgdGhleQogICAgLy8gIyBtaWdodCBpbnRyb2R1Y2UgYnJlYWtpbmcgY2hhbmdlcy4KICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfcm90YXRlX2FycmFuZ2VyW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19yb3RhdGVfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2OQogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTcwCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gbmV3X2FycmFuZ2VyCiAgICBieXRlYyAxOCAvLyAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTcxCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfc2V0X29wX2RhZW1vbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfc2V0X29wX2RhZW1vbjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTg0CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODUKICAgIC8vIHNlbGYub3BfZGFlbW9uLnZhbHVlID0gYWRkcmVzcwogICAgYnl0ZWMgMjYgLy8gMHg1MjIzNGY3MDQ0NjE2NTZkNmY2ZTIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4NgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTczCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2Fzc2lnbl9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19hc3NpZ25fcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDE2CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLlJvbGVWYWxpZGl0eQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjExCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMgogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgcHVzaGludCAyMAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTAzCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gcm9sZV9hZGRyZXNzCiAgICBieXRlYyAxOCAvLyAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMKICAgIGRpZyAzCiAgICBhcHBfZ2xvYmFsX3B1dAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTQKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDYKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIGR1cAogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnRfbWFuYWdlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMyAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwOAogICAgLy8gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMiAvLyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTIKICAgIC8vIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIGR1cAogICAgcHVzaGludCA2MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE1CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMzIgLy8gMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE2CiAgICAvLyBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExOAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMSAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIwCiAgICAvLyBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMwogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgODAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIzCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI1IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI0CiAgICAvLyBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3Jldm9rZV9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19yZXZva2Vfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzUKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzNgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzcKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCkpCiAgICBidG9pCiAgICBkdXBuIDIKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCAhPSBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksIGVyci5JTlZBTElEX1JPTEUKICAgIGR1cAogICAgcHVzaGludCAyMAogICAgIT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyOAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIzIC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0NGQ2MTZlNjE2NzY1NzIyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMwCiAgICAvLyBkZWwgc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzOQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjE2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIyIC8vIDB4NTIyMzUwNzI2OTZkNjE3Mjc5NDQ2NTYxNmM2NTcyMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNAogICAgLy8gZGVsIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjM4CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIGR1cAogICAgcHVzaGludCA2MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAzMiAvLyAweDUyMjM1NDcyNzU3Mzc0NjU2NTIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzgKICAgIC8vIGRlbCBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjM4CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDEKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hdXRob3JpdHksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjEgLy8gMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MgogICAgLy8gZGVsIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzOAogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDQKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDgwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI1IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ2CiAgICAvLyBkZWwgc2VsZi5vYnNlcnZlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfY29udHJhY3Rfc3VzcGVuc2lvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfY29udHJhY3Rfc3VzcGVuc2lvbjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCAgIyBUT0RPOiBVcGRhdGUgc3BlY3MgYW5kIGFkZCB0ZXN0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojc3CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyMSAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1NwogICAgLy8gc2VsZi5hc3NldF9zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGJ5dGVjIDMzIC8vICJhc3NldF9zdXNwZW5kZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1OAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QgICMgVE9ETzogVXBkYXRlIHNwZWNzIGFuZCBhZGQgdGVzdAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X2FycmFuZ2VyW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjY4CiAgICAvLyByZXR1cm4gc2VsZi5hcnJhbmdlci52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE4IC8vIDB4NTIyMzQxNzI3MjYxNmU2NzY1NzIyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI2MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYWRkcmVzc19yb2xlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjcwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4NAogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hY2NvdW50X21hbmFnZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjMgLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQ0ZDYxNmU2MTY3NjU3MjIzCiAgICBkaWcgMQogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODUKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYucHJpbWFyeV9kZWFsZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjIgLy8gMHg1MjIzNTA3MjY5NmQ2MTcyNzk0NDY1NjE2YzY1NzIyMwogICAgZGlnIDIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg2CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnRydXN0ZWUsIGFkZHJlc3MpLAogICAgYnl0ZWMgMzIgLy8gMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMwogICAgZGlnIDMKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg3CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgYWRkcmVzcyksCiAgICBieXRlYyAyMSAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgZGlnIDQKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg4CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLm9ic2VydmVyLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDI1IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgdW5jb3ZlciA1CiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlYyA0MCAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciA2CiAgICBzZXRiaXQKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDUKICAgIHNldGJpdAogICAgcHVzaGludCAyCiAgICB1bmNvdmVyIDQKICAgIHNldGJpdAogICAgcHVzaGludCAzCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgcHVzaGludCA0CiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwNQogICAgLy8gcm9sZSA9IHJvbGVfaWQuYXNfdWludDY0KCkKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDYKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGUpCiAgICBkdXAKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA4CiAgICAvLyBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKToKICAgIHB1c2hpbnRzIDIwIDQwIDUwIDYwIDcwIDgwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA3LTMzOAogICAgLy8gbWF0Y2ggcm9sZToKICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKToKICAgIC8vICAgICAgICAgcmV0dXJuIHR5cC5Sb2xlVmFsaWRpdHkoCiAgICAvLyAgICAgICAgICAgICByb2xlX3ZhbGlkaXR5X3N0YXJ0PVVJbnQ2NCgwKSwgcm9sZV92YWxpZGl0eV9lbmQ9VUludDY0KDApCiAgICAvLyAgICAgICAgICkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSk6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSk6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgXzoKICAgIC8vICAgICAgICAgb3AuZXJyKGVyci5JTlZBTElEX1JPTEUpCiAgICB1bmNvdmVyIDYKICAgIG1hdGNoIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMEAyIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMUAzIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMkA0IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfM0A1IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNEA2IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzM4CiAgICAvLyBvcC5lcnIoZXJyLklOVkFMSURfUk9MRSkKICAgIGVyciAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV81QDc6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzM0CiAgICAvLyBzZWxmLm9ic2VydmVyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDI1IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMzMy0zMzUKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLm9ic2VydmVyLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzYKICAgIC8vIHJldHVybiBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV80QDY6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI5CiAgICAvLyBzZWxmLmF1dGhvcml0eSwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAyMSAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOC0zMzAKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLmF1dGhvcml0eSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzMxCiAgICAvLyByZXR1cm4gc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8zQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI0CiAgICAvLyBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMzIgLy8gMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMy0zMjUKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyNgogICAgLy8gcmV0dXJuIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzJANDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTkKICAgIC8vIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMjIgLy8gMHg1MjIzNTA3MjY5NmQ2MTcyNzk0NDY1NjE2YzY1NzIyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxOC0zMjAKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLnByaW1hcnlfZGVhbGVyLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjEKICAgIC8vIHJldHVybiBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMUAzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxNAogICAgLy8gc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMjMgLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQ0ZDYxNmU2MTY3NjU3MjIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEzLTMxNQogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTYKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzBAMjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDktMzExCiAgICAvLyByZXR1cm4gdHlwLlJvbGVWYWxpZGl0eSgKICAgIC8vICAgICByb2xlX3ZhbGlkaXR5X3N0YXJ0PVVJbnQ2NCgwKSwgcm9sZV92YWxpZGl0eV9lbmQ9VUludDY0KDApCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB2b2lkOgpfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZDoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNgogICAgLy8gZGVmIF9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHNlbGYsIGhvbGRpbmdfYWRkcmVzczogQWNjb3VudCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI4CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZCwgZXJyLlNVU1BFTkRFRAogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHB1c2hpbnQgMzg0CiAgICBnZXRiaXQKICAgICEKICAgIGFzc2VydCAvLyBTdXNwZW5kZWQgb3BlcmF0aW9ucwogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuX3NldHRsZV9wb3NpdGlvbihob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB1aW50NjQsIHVpbnQ2NDoKX3NldHRsZV9wb3NpdGlvbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo0NAogICAgLy8gZGVmIF9zZXR0bGVfcG9zaXRpb24oc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50KSAtPiB0dXBsZVtVSW50NjQsIFVJbnQ2NF06CiAgICBwcm90byAxIDIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NjEKICAgIC8vIHBvc2l0aW9uID0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY29weSgpCiAgICBkdXAKICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjYzLTY1CiAgICAvLyAjIENvbXB1dGUgdGhlIGluY3JlbWVudGFsIHBlci11bml0IGZpeGVkLXBvaW50IGludGVyZXN0IGFuZCBwcmluY2lwYWwgYWNjcnVlZAogICAgLy8gIyBzaW5jZSB0aGlzIGFjY291bnQncyBsYXN0IGNoZWNrcG9pbnQuCiAgICAvLyBpbnRlcmVzdF9kZWx0YSA9IHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCAtIHBvc2l0aW9uLmludGVyZXN0X2NoZWNrcG9pbnQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IGV4aXN0cwogICAgZGlnIDEKICAgIHB1c2hpbnQgNTcKICAgIGV4dHJhY3RfdWludDY0CiAgICAtCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NjcKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggLSBwb3NpdGlvbi5wcmluY2lwYWxfY2hlY2twb2ludAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCBleGlzdHMKICAgIGRpZyAyCiAgICBwdXNoaW50IDY1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjczCiAgICAvLyBpbnRlcmVzdF9kZWx0YSwgcG9zaXRpb24udW5pdHMsIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUKICAgIGRpZyAyCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzAtNzQKICAgIC8vICMgQ29udmVydCB0aGUgcGVyLXVuaXQgZml4ZWQtcG9pbnQgZGVsdGFzIGludG8gYWJzb2x1dGUgY2xhaW1hYmxlIGFtb3VudHMKICAgIC8vICMgdXNpbmcgdGhlIGFjY291bnQncyBhY3RpdmUgdW5pdHMuCiAgICAvLyBjbGFpbWFibGVfaW50ZXJlc3QgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBpbnRlcmVzdF9kZWx0YSwgcG9zaXRpb24udW5pdHMsIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUKICAgIC8vICkKICAgIHVuY292ZXIgMwogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3NgogICAgLy8gcHJpbmNpcGFsX2RlbHRhLCBwb3NpdGlvbi51bml0cywgc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojc1LTc3CiAgICAvLyBjbGFpbWFibGVfcHJpbmNpcGFsID0gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgcHJpbmNpcGFsX2RlbHRhLCBwb3NpdGlvbi51bml0cywgc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgLy8gKQogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3OS04MQogICAgLy8gIyBBY2NydWUgdGhlIGNsYWltYWJsZSBhbW91bnRzIHRvIHRoZSBhY2NvdW50IHBvc2l0aW9uIGFuZCBtYWtlIHRoZW0gYXZhaWxhYmxlCiAgICAvLyAjIGZvciB3aXRoZHJhd2FsLgogICAgLy8gcG9zaXRpb24uY2xhaW1hYmxlX2ludGVyZXN0ICs9IGNsYWltYWJsZV9pbnRlcmVzdAogICAgZGlnIDIKICAgIHB1c2hpbnQgNzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgKwogICAgaXRvYgogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICByZXBsYWNlMiA3MwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjgyCiAgICAvLyBwb3NpdGlvbi5jbGFpbWFibGVfcHJpbmNpcGFsICs9IGNsYWltYWJsZV9wcmluY2lwYWwKICAgIGR1cAogICAgcHVzaGludCA4MQogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICArCiAgICBpdG9iCiAgICByZXBsYWNlMiA4MQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojg0LTg2CiAgICAvLyAjIEFkdmFuY2UgdGhlIGFjY291bnQncyBwZXItdW5pdCBmaXhlZC1wb2ludCBjaGVja3BvaW50cyB0byB0aGUgY3VycmVudCBnbG9iYWwKICAgIC8vICMgcGVyLXVuaXQgZml4ZWQtcG9pbnQgZ2xvYmFsIGluZGljZXMuCiAgICAvLyBwb3NpdGlvbi5pbnRlcmVzdF9jaGVja3BvaW50ID0gc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCBleGlzdHMKICAgIGl0b2IKICAgIHJlcGxhY2UyIDU3CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6ODcKICAgIC8vIHBvc2l0aW9uLnByaW5jaXBhbF9jaGVja3BvaW50ID0gc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCBleGlzdHMKICAgIGl0b2IKICAgIHJlcGxhY2UyIDY1CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6ODktOTAKICAgIC8vICMgQWR2YW5jZSB0aGUgYWNjb3VudCdzIGV2ZW50IGN1cnNvciB0byB0aGUgY3VycmVudCBnbG9iYWwgZXZlbnQgY3Vyc29yLgogICAgLy8gcG9zaXRpb24uc2V0dGxlZF9jdXJzb3IgPSBzZWxmLmV2ZW50X2N1cnNvcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpdG9iCiAgICByZXBsYWNlMiA0OQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjkyLTk0CiAgICAvLyAjIFVwZGF0ZSB0aGUgYWNjb3VudCBwb3NpdGlvbiBhbmQgcmV0dXJuIHRoZSBuZXdseSBhY2NydWVkIGNsYWltYWJsZSBhbW91bnRzCiAgICAvLyAjIGFkZGVkIHRvIHRoZSB0b3RhbCBwb3NpdGlvbidzIGNsYWltYWJsZSBhbW91bnRzLgogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSBwb3NpdGlvbi5jb3B5KCkKICAgIHVuY292ZXIgMwogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojk1CiAgICAvLyByZXR1cm4gY2xhaW1hYmxlX2ludGVyZXN0LCBjbGFpbWFibGVfcHJpbmNpcGFsCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5fZW5zdXJlX3VuaXRzX2FjdGl2YXRlZChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB2b2lkOgpfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZDoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo5NwogICAgLy8gZGVmIF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKHNlbGYsIGhvbGRpbmdfYWRkcmVzczogQWNjb3VudCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTAwCiAgICAvLyBpZiBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKToKICAgIGJ6IF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwMQogICAgLy8gcmV0dXJuCiAgICByZXRzdWIKCl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDMKICAgIC8vIHBvc2l0aW9uID0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY29weSgpCiAgICBmcmFtZV9kaWcgMgogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA0CiAgICAvLyBpZiBwb3NpdGlvbi5yZXNlcnZlZF91bml0cyA9PSBVSW50NjQoMCk6CiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIGJueiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZF9hZnRlcl9pZl9lbHNlQDQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDUKICAgIC8vIHJldHVybgogICAgcmV0c3ViCgpfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZF9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA4CiAgICAvLyBwb3NpdGlvbi51bml0cyArPSBhY3RpdmF0ZWRfdW5pdHMKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDMKICAgICsKICAgIGl0b2IKICAgIHJlcGxhY2UyIDMyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA5CiAgICAvLyBwb3NpdGlvbi5yZXNlcnZlZF91bml0cyA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGl0b2IKICAgIHJlcGxhY2UyIDQwCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTEwCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHBvc2l0aW9uLmNvcHkoKQogICAgZnJhbWVfZGlnIDIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTEKICAgIC8vIGFzc2VydCBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID49IGFjdGl2YXRlZF91bml0cywgZXJyLk9WRVJfRElTVFJJQlVUSU9OCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIGV4aXN0cwogICAgZHVwCiAgICBkaWcgMgogICAgPj0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgcmVtYWluaW5nIEQtQVNBIHVuaXRzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTEyCiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIC09IGFjdGl2YXRlZF91bml0cwogICAgc3dhcAogICAgLQogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9zY2FsZWRfbXVsX2RpdihtdWx0aXBsaWNhbmQ6IHVpbnQ2NCwgbXVsdGlwbGllcjogdWludDY0LCBkaXZpc29yOiB1aW50NjQpIC0+IHVpbnQ2NDoKX3NjYWxlZF9tdWxfZGl2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTUzLTE1NQogICAgLy8gZGVmIF9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLCBtdWx0aXBsaWNhbmQ6IFVJbnQ2NCwgbXVsdGlwbGllcjogVUludDY0LCBkaXZpc29yOiBVSW50NjQKICAgIC8vICkgLT4gVUludDY0OgogICAgcHJvdG8gMyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTcKICAgIC8vIGlmIG11bHRpcGxpY2FuZCA9PSBVSW50NjQoMCkgb3IgbXVsdGlwbGllciA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTMKICAgIGJ6IF9zY2FsZWRfbXVsX2Rpdl9pZl9ib2R5QDIKICAgIGZyYW1lX2RpZyAtMgogICAgYm56IF9zY2FsZWRfbXVsX2Rpdl9hZnRlcl9pZl9lbHNlQDMKCl9zY2FsZWRfbXVsX2Rpdl9pZl9ib2R5QDI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTgKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9zY2FsZWRfbXVsX2Rpdl9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTkKICAgIC8vIGhpZ2gsIGxvdyA9IG9wLm11bHcobXVsdGlwbGljYW5kLCBtdWx0aXBsaWVyKQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIG11bHcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2MAogICAgLy8gcmV0dXJuIG9wLmRpdncoaGlnaCwgbG93LCBkaXZpc29yKQogICAgZnJhbWVfZGlnIC0xCiAgICBkaXZ3CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYW1vdW50X3RvX2luZGV4X2RlbHRhKGFtb3VudDogdWludDY0KSAtPiB1aW50NjQ6Cl9hbW91bnRfdG9faW5kZXhfZGVsdGE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjIKICAgIC8vIGRlZiBfYW1vdW50X3RvX2luZGV4X2RlbHRhKHNlbGYsIGFtb3VudDogVUludDY0KSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2NAogICAgLy8gaWYgYW1vdW50ID09IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMQogICAgYm56IF9hbW91bnRfdG9faW5kZXhfZGVsdGFfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjUKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9hbW91bnRfdG9faW5kZXhfZGVsdGFfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTY2CiAgICAvLyBhc3NlcnQgc2VsZi50b3RhbF91bml0cyA+IFVJbnQ2NCgwKSwgZXJyLk5PX1VOSVRTCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgZHVwCiAgICBhc3NlcnQgLy8gTm8gRC1BU0EgdW5pdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2NwogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KGFtb3VudCwgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwgc2VsZi50b3RhbF91bml0cykKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2luZGV4X2RlbHRhX3RvX2Ftb3VudChpbmRleF9kZWx0YTogdWludDY0KSAtPiB1aW50NjQ6Cl9pbmRleF9kZWx0YV90b19hbW91bnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjkKICAgIC8vIGRlZiBfaW5kZXhfZGVsdGFfdG9fYW1vdW50KHNlbGYsIGluZGV4X2RlbHRhOiBVSW50NjQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTc2CiAgICAvLyBpZiBpbmRleF9kZWx0YSA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGJueiBfaW5kZXhfZGVsdGFfdG9fYW1vdW50X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTc3CiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfaW5kZXhfZGVsdGFfdG9fYW1vdW50X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE3OQogICAgLy8gc2VsZi50b3RhbF91bml0cywKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxODEKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNzgtMTgyCiAgICAvLyByZXR1cm4gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgc2VsZi50b3RhbF91bml0cywKICAgIC8vICAgICBpbmRleF9kZWx0YSwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2dldF9zY2hlZHVsZV9lbnRyeShldmVudF9pZDogdWludDY0KSAtPiBieXRlczoKX2dldF9zY2hlZHVsZV9lbnRyeToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIwMgogICAgLy8gZGVmIF9nZXRfc2NoZWR1bGVfZW50cnkoc2VsZiwgZXZlbnRfaWQ6IFVJbnQ2NCkgLT4gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnk6CiAgICBwcm90byAxIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIwNAogICAgLy8gYXNzZXJ0IGV2ZW50X2lkIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgPgogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgaWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE5MAogICAgLy8gcmV0dXJuIGV2ZW50X2lkIC8vIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDE2CiAgICAvCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMDYKICAgIC8vIGFzc2VydCBwYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxOTQKICAgIC8vIHJldHVybiBldmVudF9pZCAlIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDE2CiAgICAlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMDkKICAgIC8vIGFzc2VydCBvZmZzZXQgPCBwYWdlLmxlbmd0aCwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBwdXNoaW50IDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgMQogICAgPgogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjEwCiAgICAvLyByZXR1cm4gcGFnZVtvZmZzZXRdLmNvcHkoKQogICAgcHVzaGludCA2NQogICAgKgogICAgcHVzaGludCAyCiAgICArCiAgICBwdXNoaW50IDY1CiAgICBib3hfZXh0cmFjdAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKGNvbnRyYWN0X3R5cGU6IHVpbnQ2NCwgZXZlbnRfdHlwZTogdWludDY0KSAtPiB2b2lkOgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTMtMzE1CiAgICAvLyBkZWYgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIHNlbGYsIGNvbnRyYWN0X3R5cGU6IFVJbnQ2NCwgZXZlbnRfdHlwZTogVUludDY0CiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNDcKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNDgKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgaW50Y18yIC8vIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI0OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9NRCksCiAgICBwdXNoaW50IDE5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTAKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgcHVzaGludCAxMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU0LTI1NQogICAgLy8gIyBDaGVjayBjb21tb24gZXZlbnRzIGZpcnN0CiAgICAvLyBpZiBldmVudF90eXBlIGluIGNvbW1vbl9ldmVudHM6CiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjUxCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICBwdXNoaW50IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUA3CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU2CiAgICAvLyByZXR1cm4gVHJ1ZQogICAgaW50Y18xIC8vIDEKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICByZXRzdWIKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTgtMjU5CiAgICAvLyAjIENvbnRyYWN0LXNwZWNpZmljIGFkZGl0aW9uYWwgZXZlbnRzCiAgICAvLyBpZiBjb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9QQU0pOgogICAgZnJhbWVfZGlnIC0yCiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjYwLTI2MQogICAgLy8gIyBQQU0gb25seSBzdXBwb3J0cyBjb21tb24gZXZlbnRzCiAgICAvLyByZXR1cm4gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNjMKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0xBTSkgb3IgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2My0yNjUKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0xBTSkgb3IgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoCiAgICAvLyAgICAgZW51bXMuQ1RfTkFNCiAgICAvLyApOgogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDExCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMgogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDE2CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUAxMToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2Ni0yNzAKICAgIC8vICMgTEFNL05BTSBhZGQ6IFBSLCBJUENCCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjY4CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjY2LTI3MAogICAgLy8gIyBMQU0vTkFNIGFkZDogUFIsIElQQ0IKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDEzCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIHB1c2hpbnQgMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2Ni0yNzAKICAgIC8vICMgTEFNL05BTSBhZGQ6IFBSLCBJUENCCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICkKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF9mYWxzZUAxNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAxMzoKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDE0OgogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMTY6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzIKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTik6CiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMjMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3My0yNzgKICAgIC8vICMgQU5OIGFkZHM6IFBSLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjc1CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjczLTI3OAogICAgLy8gIyBBTk4gYWRkczogUFIsIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDIwCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIHB1c2hpbnQgMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3My0yNzgKICAgIC8vICMgQU5OIGFkZHM6IFBSLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyMAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzcKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIHB1c2hpbnQgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjczLTI3OAogICAgLy8gIyBBTk4gYWRkczogUFIsIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDIxCgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDIwOgogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMjE6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAyMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MAogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfTEFYKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA0CiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMzEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MS0yODcKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MwogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUiksCiAgICBwdXNoaW50IDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MS0yODcKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjgKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjg0CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjgxLTI4NwogICAgLy8gIyBMQVggYWRkczogUFIsIFBJLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyOAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODUKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICBwdXNoaW50IDE4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODEtMjg3CiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDI4CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODEtMjg3CiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDI5CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDI4OgogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMjk6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAzMToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4OQogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQ0xNKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA1CiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMzMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI5MC0yOTEKICAgIC8vICMgQ0xNIGFkZHM6IFBSCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1BSKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDMKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDMzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjkzCiAgICAvLyByZXR1cm4gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5faXNfZHluYW1pY19hbm51aXR5KCkgLT4gdWludDY0OgpfaXNfZHluYW1pY19hbm51aXR5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM1CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzUtMzM2CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIC8vIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGJ6IF9pc19keW5hbWljX2FubnVpdHlfYm9vbF9mYWxzZUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzYKICAgIC8vIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzNCAvLyAiZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM1LTMzNgogICAgLy8gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICAvLyBhbmQgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBieiBfaXNfZHluYW1pY19hbm51aXR5X2Jvb2xfZmFsc2VAMwogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMzNC0zMzcKICAgIC8vIHJldHVybiAoCiAgICAvLyAgICAgc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICAvLyAgICAgYW5kIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgLy8gKQogICAgcmV0c3ViCgpfaXNfZHluYW1pY19hbm51aXR5X2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzQtMzM3CiAgICAvLyByZXR1cm4gKAogICAgLy8gICAgIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKQogICAgLy8gICAgIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIC8vICkKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KGVudHJ5OiBieXRlcykgLT4gdWludDY0LCBieXRlczoKX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozODAKICAgIC8vIGRlZiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudChzZWxmLCBlbnRyeTogdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5CiAgICAvLyBlbnRyeS5hY2NydWFsX2ZhY3RvciA9PSBVSW50NjQoMCkKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAxNwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5LTM5MQogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGJ6IF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2lmX2JvZHlAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzkwCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5LTM5MQogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGJ6IF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2lmX2JvZHlAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzkxCiAgICAvLyBvciBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPT0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5LTM5MQogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGJueiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudF9hZnRlcl9pZl9lbHNlQDQKCl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2lmX2JvZHlAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5MwogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2RpZyAtMQogICAgdW5jb3ZlciAyCiAgICByZXRzdWIKCl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NQogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NgogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NC0zOTgKICAgIC8vIGFjY3J1ZWQgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICAvLyAgICAgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICkKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MDIKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozOTktNDAzCiAgICAvLyByZXR1cm4gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgYWNjcnVlZCwKICAgIC8vICAgICBlbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICBmcmFtZV9kaWcgLTEKICAgIHVuY292ZXIgMgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yKGRpc2NvdW50X2ZhY3RvcjogdWludDY0LCByZWRlbXB0aW9uX2ZhY3RvcjogdWludDY0KSAtPiB1aW50NjQ6Cl9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ2Mi00NjYKICAgIC8vIGRlZiBfZGlzY291bnRfYW5udWl0eV9mYWN0b3IoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBkaXNjb3VudF9mYWN0b3I6IFVJbnQ2NCwKICAgIC8vICAgICByZWRlbXB0aW9uX2ZhY3RvcjogVUludDY0LAogICAgLy8gKSAtPiBVSW50NjQ6CiAgICBwcm90byAyIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ2OAogICAgLy8gaWYgcmVkZW1wdGlvbl9mYWN0b3IgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0xCiAgICBibnogX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDY5CiAgICAvLyByZXR1cm4gZGlzY291bnRfZmFjdG9yCiAgICBmcmFtZV9kaWcgLTIKICAgIHJldHN1YgoKX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3MAogICAgLy8gcGVyaW9kX3JhdGUgPSBzZWxmLmZpeGVkX3BvaW50X3NjYWxlICsgc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzEKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzAtNDc0CiAgICAvLyBwZXJpb2RfcmF0ZSA9IHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgKyBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICByZWRlbXB0aW9uX2ZhY3RvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICBkaWcgMgogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgICsKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3NQogICAgLy8gYXNzZXJ0IHBlcmlvZF9yYXRlID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGR1cAogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDc4CiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDc2LTQ4MAogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIGRpc2NvdW50X2ZhY3RvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gICAgIHBlcmlvZF9yYXRlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkoZW50cnk6IGJ5dGVzLCBwYXlsb2FkOiBieXRlcykgLT4gYnl0ZXMsIGJ5dGVzOgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MTMtNjE1CiAgICAvLyBkZWYgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5KAogICAgLy8gICAgIHNlbGYsIGVudHJ5OiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSwgcGF5bG9hZDogdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0CiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAyIDIKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjIzCiAgICAvLyBhc3NlcnQgZW50cnkuZXZlbnRfaWQgPT0gc2VsZi5ldmVudF9jdXJzb3IsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGN1cnNvcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjI0CiAgICAvLyBhc3NlcnQgZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsIGVyci5OT19EVUVfQ0FTSEZMT1cKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPD0KICAgIGFzc2VydCAvLyBObyBkdWUgY2FzaGZsb3cgdG8gcGF5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MjYKICAgIC8vIGV2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYyNwogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX0lFRCk6CiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGR1cAogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYyOC02MzAKICAgIC8vICMgSUVEIGZpbmFsaXplcyBpc3N1YW5jZTogcmVzZXJ2ZWQgdW5pdHMgYmVjb21lIGFjdGl2YXRhYmxlIGFuZCB0aGUKICAgIC8vICMgc2NoZWR1bGUncyBpbml0aWFsIGNvbnRyYWN0dWFsIHN0YXRlIGJlY29tZXMgbGl2ZS4KICAgIC8vIGFzc2VydCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzIKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPT0gc2VsZi50b3RhbF91bml0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjMxLTYzMwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID09IHNlbGYudG90YWxfdW5pdHMKICAgIC8vICksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9JTkNPTVBMRVRFCiAgICBhc3NlcnQgLy8gUHJpbWFyeSBkaXN0cmlidXRpb24gaXMgbm90IGNvbXBsZXRlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzQKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM1CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzYKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAzMwogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzcKICAgIC8vIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM4CiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzkKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0MAogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX0FDVElWRSkKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgMTAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDUxCiAgICAvLyBhc3NlcnQgZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSA9PSBVSW50NjQoZW51bXMuRVZUX0lFRCksIGVyci5OT1RfRVZUX0lFRAogICAgZnJhbWVfZGlnIDExCiAgICBhc3NlcnQgLy8gTm90IElFRCBldmVudAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDUyCiAgICAvLyByZXR1cm4gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0MS02NDUKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1zZWxmLl9lbnRyeV9pZWRfYW1vdW50KGVudHJ5KSwKICAgIC8vICAgICBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0NAogICAgLy8gc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0MS02NDUKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1zZWxmLl9lbnRyeV9pZWRfYW1vdW50KGVudHJ5KSwKICAgIC8vICAgICBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICAvLyApCiAgICBjYWxsc3ViIF9lbWl0X2V4ZWN1dGlvbl9ldmVudAogICAgZHVwCiAgICBmcmFtZV9idXJ5IC0yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NDYKICAgIC8vIHJldHVybgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0OQogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ICs9IHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBmcmFtZV9idXJ5IC0yCiAgICArCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1MQogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1JSKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCAxMgogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMTAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1NQogICAgLy8gcGF5bG9hZC5vYnNlcnZlZF9yYXRlLAogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjU2CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzNiAvLyAicmF0ZV9yZXNldF9tdWx0aXBsaWVyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1NwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1Mi02NTgKICAgIC8vICMgUlIgZGVyaXZlcyB0aGUgbmV4dCByYXRlIGZyb20gYW4gb2JzZXJ2ZWQgb3JhY2xlIHZhbHVlIHBsdXMgdGhlCiAgICAvLyAjIGNvbnRyYWN0IHNwcmVhZCAvIG11bHRpcGxpZXIgdGVybXMsIHRoZW4gZW5mb3JjZXMgZmxvb3IgYW5kIGNhcC4KICAgIC8vIG9ic2VydmVkX3JhdGUgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBwYXlsb2FkLm9ic2VydmVkX3JhdGUsCiAgICAvLyAgICAgc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICkKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjAKICAgIC8vIG9ic2VydmVkX3JhdGUgKyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzUgLy8gInJhdGVfcmVzZXRfc3ByZWFkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkIGV4aXN0cwogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDEKICAgIC8vIGlmIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgYW5kIHJhdGUgPCBzZWxmLnJhdGVfcmVzZXRfZmxvb3I6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzggLy8gImhhc19yYXRlX3Jlc2V0X2Zsb29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmhhc19yYXRlX3Jlc2V0X2Zsb29yIGV4aXN0cwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMCAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X2Zsb29yIGV4aXN0cwogICAgZnJhbWVfZGlnIDYKICAgID4KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDIKICAgIC8vIHJhdGUgPSBzZWxmLnJhdGVfcmVzZXRfZmxvb3IKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMCAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDYKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfZmxvb3IgZXhpc3RzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1NToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc0MwogICAgLy8gaWYgc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgYW5kIHJhdGUgPiBzZWxmLnJhdGVfcmVzZXRfY2FwOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDM5IC8vICJoYXNfcmF0ZV9yZXNldF9jYXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwIGV4aXN0cwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTgKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMSAvLyAicmF0ZV9yZXNldF9jYXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9jYXAgZXhpc3RzCiAgICBmcmFtZV9kaWcgNgogICAgPAogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc0NAogICAgLy8gcmF0ZSA9IHNlbGYucmF0ZV9yZXNldF9jYXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMSAvLyAicmF0ZV9yZXNldF9jYXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSA2CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X2NhcCBleGlzdHMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjU5CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IHNlbGYuX2NsYW1wX3JhdGUoCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NTktNjYxCiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IHNlbGYuX2NsYW1wX3JhdGUoCiAgICAvLyAgICAgb2JzZXJ2ZWRfcmF0ZSArIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQKICAgIC8vICkKICAgIGZyYW1lX2RpZyA2CiAgICBhcHBfZ2xvYmFsX3B1dAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMTg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzEKICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QSSk6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMjAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY3MgogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzMKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDIzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc4CiAgICAvLyBpZiBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKToKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAyOQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc5CiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFJGKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCA1CiAgICA9PQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMzAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4MwogICAgLy8gKyAoc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCAtIHNlbGYuZXZlbnRfY3Vyc29yKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICAtCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODQKICAgIC8vICogVUludDY0KGNzdC5PUF9VUF9OT05fQ0FTSF9QRVJfRU5UUllfQlVER0VUKQogICAgcHVzaGludCAxMDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4My02ODQKICAgIC8vICsgKHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgLSBzZWxmLmV2ZW50X2N1cnNvcikKICAgIC8vICogVUludDY0KGNzdC5PUF9VUF9OT05fQ0FTSF9QRVJfRU5UUllfQlVER0VUKQogICAgKgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjgyCiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX05PTl9DQVNIX0JBU0VfQlVER0VUKQogICAgaW50YyA0IC8vIDE1MDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4Mi02ODQKICAgIC8vIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfQkFTRV9CVURHRVQpCiAgICAvLyArIChzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IC0gc2VsZi5ldmVudF9jdXJzb3IpCiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfUEVSX0VOVFJZX0JVREdFVCkKICAgICsKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4MC02ODYKICAgIC8vIGVuc3VyZV9idWRnZXQoCiAgICAvLyAgICAgcmVxdWlyZWRfYnVkZ2V0PSgKICAgIC8vICAgICAgICAgVUludDY0KGNzdC5PUF9VUF9OT05fQ0FTSF9CQVNFX0JVREdFVCkKICAgIC8vICAgICAgICAgKyAoc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCAtIHNlbGYuZXZlbnRfY3Vyc29yKQogICAgLy8gICAgICAgICAqIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfUEVSX0VOVFJZX0JVREdFVCkKICAgIC8vICAgICApLAogICAgLy8gKQogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDkwCiAgICAvLyBkaXNjb3VudF9mYWN0b3IgPSBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5MQogICAgLy8gZGVub21pbmF0b3IgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5MgogICAgLy8gc2tpcF9maXJzdF9yZWRlbXB0aW9uID0gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5NAogICAgLy8gaWYgZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAyNQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgZnJhbWVfYnVyeSA4CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAzNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDk1LTQ5OQogICAgLy8gIyBBbiBpbml0aWFsIFBSRiBtYXkgZGVzY3JpYmUgdGhlIGZpcnN0IHJlZGVtcHRpb24gcGVyaW9kIGRpcmVjdGx5LgogICAgLy8gZGlzY291bnRfZmFjdG9yID0gc2VsZi5fZGlzY291bnRfYW5udWl0eV9mYWN0b3IoCiAgICAvLyAgICAgZGlzY291bnRfZmFjdG9yLAogICAgLy8gICAgIGVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDgKICAgIGNhbGxzdWIgX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTAxCiAgICAvLyBza2lwX2ZpcnN0X3JlZGVtcHRpb24gPSBUcnVlCiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfYnVyeSA3CiAgICBmcmFtZV9idXJ5IDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDM1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTAzCiAgICAvLyBmdXR1cmVfZXZlbnRfaWQgPSBzZWxmLmV2ZW50X2N1cnNvciArIFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfd2hpbGVfdG9wQDM2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA0CiAgICAvLyB3aGlsZSBmdXR1cmVfZXZlbnRfaWQgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgZnJhbWVfZGlnIDMKICAgID4KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl93aGlsZUA0OAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA1CiAgICAvLyBmdXR1cmVfZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoZnV0dXJlX2V2ZW50X2lkKQogICAgZnJhbWVfZGlnIDMKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwNgogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPSBmdXR1cmVfZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MDctNTA4CiAgICAvLyAjIE9ubHkgcmVkZW1wdGlvbi1iZWFyaW5nIGV2ZW50cyBjb250cmlidXRlIHRvIHRoZSBhbm51aXR5IGRlbm9taW5hdG9yLgogICAgLy8gaXNfcmVkZW1wdGlvbl9ldmVudCA9IGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpIG9yICgKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwNy01MTEKICAgIC8vICMgT25seSByZWRlbXB0aW9uLWJlYXJpbmcgZXZlbnRzIGNvbnRyaWJ1dGUgdG8gdGhlIGFubnVpdHkgZGVub21pbmF0b3IuCiAgICAvLyBpc19yZWRlbXB0aW9uX2V2ZW50ID0gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QUikgb3IgKAogICAgLy8gICAgIGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfTUQpCiAgICAvLyAgICAgYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICAvLyApCiAgICBibnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfdHJ1ZUA0MAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA5CiAgICAvLyBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgZnJhbWVfZGlnIDQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MDktNTEwCiAgICAvLyBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgLy8gYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF9mYWxzZUA0MQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTEwCiAgICAvLyBhbmQgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IgPiBVSW50NjQoMCkKICAgIGZyYW1lX2RpZyAwCiAgICBwdXNoaW50IDI1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA5LTUxMAogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCkKICAgIC8vIGFuZCBmdXR1cmVfZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX3RydWVANDA6CiAgICBpbnRjXzEgLy8gMQoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfbWVyZ2VANDI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTIKICAgIC8vIGlmIGlzX3JlZGVtcHRpb25fZXZlbnQ6CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA0NwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTEzCiAgICAvLyBpZiBza2lwX2ZpcnN0X3JlZGVtcHRpb246CiAgICBmcmFtZV9kaWcgNwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUA0NQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTE0CiAgICAvLyBza2lwX2ZpcnN0X3JlZGVtcHRpb24gPSBGYWxzZQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgNwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANDc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjEKICAgIC8vIGZ1dHVyZV9ldmVudF9pZCArPSBVSW50NjQoMSkKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV93aGlsZV90b3BAMzYKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlANDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTgKICAgIC8vIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZnJhbWVfZGlnIDAKICAgIHB1c2hpbnQgMjUKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTYtNTE5CiAgICAvLyBkaXNjb3VudF9mYWN0b3IgPSBzZWxmLl9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcigKICAgIC8vICAgICBkaXNjb3VudF9mYWN0b3IsCiAgICAvLyAgICAgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMgogICAgc3dhcAogICAgY2FsbHN1YiBfZGlzY291bnRfYW5udWl0eV9mYWN0b3IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjAKICAgIC8vIGRlbm9taW5hdG9yICs9IGRpc2NvdW50X2ZhY3RvcgogICAgZnJhbWVfZGlnIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA0NwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDE6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF9tZXJnZUA0MgoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX3doaWxlQDQ4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTIzCiAgICAvLyBhc3NlcnQgZGVub21pbmF0b3IgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZnJhbWVfZGlnIDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUyNAogICAgLy8gbnVtZXJhdG9yID0gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTI1CiAgICAvLyBpZiBlbnRyeS5mbGFncyAmIFVJbnQ2NChlbnVtcy5GTEFHX0lOSVRJQUxfUFJGKSA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNTcKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gOAogICAgJgogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDUwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjYtNTI3CiAgICAvLyAjIFN1YnNlcXVlbnQgUFJGIGV2ZW50cyBhbW9ydGl6ZSBib3RoIHByaW5jaXBhbCBhbmQgYWxyZWFkeSBhY2NydWVkIGNhcnJ5LgogICAgLy8gbnVtZXJhdG9yICs9IHNlbGYuYWNjcnVlZF9pbnRlcmVzdAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgICsKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDUwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTMwCiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTI4LTUzMgogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIG51bWVyYXRvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gICAgIGRlbm9taW5hdG9yLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDEKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODcKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IHNlbGYuX3JlY2FsY3VsYXRlX2FubnVpdHlfcGF5bWVudCgKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njg3LTY4OQogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gc2VsZi5fcmVjYWxjdWxhdGVfYW5udWl0eV9wYXltZW50KAogICAgLy8gICAgIGVudHJ5CiAgICAvLyApCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMzA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OTIKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY5My02OTcKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1VSW50NjQoMCksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OTUKICAgIC8vIHBheW9mZj1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njk2CiAgICAvLyBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY5My02OTcKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1VSW50NjQoMCksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgY2FsbHN1YiBfZW1pdF9leGVjdXRpb25fZXZlbnQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDI5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjkxCiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDMwCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDIwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc0CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9JUENCKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCAxOAogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDIzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzUtNjc2CiAgICAvLyAjIElQQ0Iga2VlcHMgcHJpbmNpcGFsIHVuY2hhbmdlZCBhbmQgb25seSByZXNldHMgdGhlIGludGVyZXN0IGJhc2UuCiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIGIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMjMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMTA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjIKICAgIC8vIGVsaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1JSRik6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgMTEKICAgID09CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDE0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjMKICAgIC8vIG5leHRfcmF0ZSA9IGVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY0CiAgICAvLyBpZiBuZXh0X3JhdGUgPT0gVUludDY0KDApOgogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDEzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjUKICAgIC8vIG5leHRfcmF0ZSA9IHNlbGYucmF0ZV9yZXNldF9uZXh0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzcgLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDUKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfbmV4dCBleGlzdHMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY2CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IG5leHRfcmF0ZQogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgZnJhbWVfZGlnIDUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDE0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY4CiAgICAvLyBpZiBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSAhPSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgOQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2OQogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPSBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZQogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgZnJhbWVfZGlnIDkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KGVudHJ5OiBieXRlcywgcGF5b2ZmOiB1aW50NjQsIHNldHRsZWRfYW1vdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpfZW1pdF9leGVjdXRpb25fZXZlbnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MDMtNzA5CiAgICAvLyBkZWYgX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgKiwKICAgIC8vICAgICBlbnRyeTogdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnksCiAgICAvLyAgICAgcGF5b2ZmOiBVSW50NjQsCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ6IFVJbnQ2NCwKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDMgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzEzCiAgICAvLyBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25JRAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE0CiAgICAvLyBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIGZyYW1lX2RpZyAtMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTUKICAgIC8vIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIGZyYW1lX2RpZyAtMwogICAgZXh0cmFjdCA4IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxNgogICAgLy8gc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICBmcmFtZV9kaWcgLTMKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTcKICAgIC8vIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MjAKICAgIC8vIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIGZyYW1lX2RpZyAtMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE1CiAgICAvLyBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICBpbnRjXzIgLy8gOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIwCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBnZXRieXRlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDkKICAgIC8vIGlmIHBheW9mZiA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJueiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NTAKICAgIC8vIHJldHVybiBVSW50NjQoZW51bXMuUEFZT0ZGX1NJR05fUE9TSVRJVkUpCiAgICBpbnRjXzEgLy8gMQoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX3BheW9mZl9zaWduQDc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTktNzIxCiAgICAvLyBwYXlvZmZfc2lnbj1hcmM0LlVJbnQ4KAogICAgLy8gICAgIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIC8vICksCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgaW50Y18yIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MjMKICAgIC8vIGN1cnJlbmN5X2lkPXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzI0CiAgICAvLyBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTItNzI1CiAgICAvLyBFeGVjdXRpb25FdmVudCgKICAgIC8vICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIC8vICAgICBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYXBwbGllZF9hdD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICBwYXlvZmY9cGF5b2ZmLAogICAgLy8gICAgIHBheW9mZl9zaWduPWFyYzQuVUludDgoCiAgICAvLyAgICAgICAgIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIC8vICAgICApLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PXNldHRsZWRfYW1vdW50LAogICAgLy8gICAgIGN1cnJlbmN5X2lkPXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAwCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzExLTcyNgogICAgLy8gYXJjNC5lbWl0KAogICAgLy8gICAgIEV4ZWN1dGlvbkV2ZW50KAogICAgLy8gICAgICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgICAgIHBheW9mZj1wYXlvZmYsCiAgICAvLyAgICAgICAgIHBheW9mZl9zaWduPWFyYzQuVUludDgoCiAgICAvLyAgICAgICAgICAgICBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICAvLyAgICAgICAgICksCiAgICAvLyAgICAgICAgIHNldHRsZWRfYW1vdW50PXNldHRsZWRfYW1vdW50LAogICAgLy8gICAgICAgICBjdXJyZW5jeV9pZD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgICAgIHNlcXVlbmNlPWVudHJ5LmV2ZW50X2lkICsgVUludDY0KDEpLAogICAgLy8gICAgICkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDlhMzMyYjk1IC8vIG1ldGhvZCAiRXhlY3V0aW9uRXZlbnQodWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc1MQogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiAoVUludDY0KGVudW1zLkVWVF9JRUQpLCBVSW50NjQoZW51bXMuRVZUX1BJKSk6CiAgICBmcmFtZV9kaWcgNQogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBibnogX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2lmX2JvZHlANQogICAgZnJhbWVfZGlnIDUKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGJ6IF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pZl9lbHNlQDYKCl9lbWl0X2V4ZWN1dGlvbl9ldmVudF9pZl9ib2R5QDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NTIKICAgIC8vIHJldHVybiBVSW50NjQoZW51bXMuUEFZT0ZGX1NJR05fUE9TSVRJVkUpCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIwCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBiIF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9wYXlvZmZfc2lnbkA3CgpfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzUzCiAgICAvLyByZXR1cm4gVUludDY0KGVudW1zLlBBWU9GRl9TSUdOX05FR0FUSVZFKQogICAgcHVzaGludCAyNTUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcyMAogICAgLy8gc2VsZi5fcGF5b2ZmX3NpZ24oZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSwgcGF5b2ZmKQogICAgYiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fcGF5b2ZmX3NpZ25ANwoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9yb2xlX2lzX2FjdGl2ZShyb2xlX21hcDogYnl0ZXMsIHJvbGVfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NDoKX3JvbGVfaXNfYWN0aXZlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU3CiAgICAvLyBkZWYgX3JvbGVfaXNfYWN0aXZlKHNlbGYsIHJvbGVfbWFwOiB0eXAuUmJhY1JvbGUsIHJvbGVfYWRkcmVzczogQWNjb3VudCkgLT4gYm9vbDoKICAgIHByb3RvIDIgMQogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5CiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5LTYwCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5LTYxCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjEKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAtNjEKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgPj0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX21lcmdlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKSAtPiB2b2lkOgpfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2NQogICAgLy8gYXNzZXJ0IHNlbGYuX2lzX2FycmFuZ2VyKFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTIKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgPT0gc2VsZi5hcnJhbmdlci52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE4IC8vIDB4NTIyMzQxNzI3MjYxNmU2NzY1NzIyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgPT0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2NQogICAgLy8gYXNzZXJ0IHNlbGYuX2lzX2FycmFuZ2VyKFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpIC0+IHZvaWQ6Cl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4MwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFzc2V0X2RlZmF1bHRlZCwgZXJyLkRFRkFVTFRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQxIC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfZGVmYXVsdGVkIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIERlZmF1bHRlZAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkgLT4gdm9pZDoKX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg2CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYXNzZXRfc3VzcGVuZGVkLCBlcnIuU1VTUEVOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzMgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9zdXNwZW5kZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gU3VzcGVuZGVkIG9wZXJhdGlvbnMKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkOiB1aW50NjQpIC0+IHZvaWQ6Cl9hc3NlcnRfdmFsaWRfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OAogICAgLy8gZGVmIF9hc3NlcnRfdmFsaWRfcm9sZShzZWxmLCByb2xlX2lkOiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTAKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIHB1c2hpbnQgMjAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkxCiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgcHVzaGludCAyNQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTIKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICBwdXNoaW50IDQwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MwogICAgLy8gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgcHVzaGludCA1MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTQKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgcHVzaGludCA2MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTUKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICBwdXNoaW50IDcwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NgogICAgLy8gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgcHVzaGludCA4MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfZmFsc2VAOAoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3OgogICAgaW50Y18xIC8vIDEKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX21lcmdlQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgcmV0c3ViCgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9mYWxzZUA4OgogICAgaW50Y18wIC8vIDAKICAgIGIgX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfbWVyZ2VAOQo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" }, "byteCode": { diff --git a/smart_contracts/artifacts/d_asa/dasa_client.py b/smart_contracts/artifacts/d_asa/dasa_client.py index c3ef630a..8522c1fd 100644 --- a/smart_contracts/artifacts/d_asa/dasa_client.py +++ b/smart_contracts/artifacts/d_asa/dasa_client.py @@ -19,7 +19,7 @@ import algokit_utils from algokit_utils import AlgorandClient as _AlgoKitAlgorandClient -_APP_SPEC_JSON = r"""{"arcs": [22, 28], "bareActions": {"call": [], "create": []}, "methods": [{"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "name": "max_event_count"}], "name": "fund_due_cashflows", "returns": {"type": "(uint64,uint64,uint64,uint64,uint64)", "struct": "CashFundingResult"}, "desc": "Reserve due ACTUS cash events into the escrow-style claim ledger.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "name": "holding_address"}, {"type": "byte[]", "name": "payment_info"}], "name": "claim_due_cashflows", "returns": {"type": "(uint64,uint64,uint64,uint64,byte[])", "struct": "CashClaimResult"}, "desc": "Withdraw the holder's already funded ACTUS cash entitlements.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "name": "open_date"}, {"type": "uint64", "name": "closure_date"}], "name": "transfer_set_schedule", "returns": {"type": "uint64"}, "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "name": "holding_address"}, {"type": "uint64", "name": "units"}], "name": "primary_distribution", "returns": {"type": "uint64"}, "desc": "Reserve units for a holder before IED finalizes issuance.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "name": "sender_holding_address"}, {"type": "address", "name": "receiver_holding_address"}, {"type": "uint64", "name": "units"}], "name": "transfer", "returns": {"type": "uint64"}, "desc": "Transfer active units after settling both counterparties to the current cursor.\nReturns the number of units moved. The ACTUS kernel no longer persists a nominal per-unit value on-chain, so transfer results are unit-based.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "bool", "desc": "Suspension status", "name": "suspended"}], "name": "account_suspension", "returns": {"type": "uint64", "desc": "Timestamp of the set account suspension status"}, "desc": "Set account suspension status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "address", "desc": "Account Payment Address", "name": "payment_address"}], "name": "account_open", "returns": {"type": "uint64", "desc": "Timestamp of the account opening"}, "desc": "Open a contract account with a new position and register its payment address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "address", "desc": "Account Payment Address", "name": "payment_address"}], "name": "account_update_payment_address", "returns": {"type": "uint64", "desc": "Timestamp of the account update"}, "desc": "Update the Payment Address of an account", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}], "name": "account_get_position", "returns": {"type": "(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64)", "desc": "Account position", "struct": "AccountPosition"}, "desc": "Get account position", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": [], "create": ["NoOp"]}, "args": [{"type": "address", "desc": "D-ASA Arranger Address", "name": "arranger"}], "name": "contract_create", "returns": {"type": "uint64", "desc": "UNIX timestamp of contract creation"}, "desc": "Create a new D-ASA contract and set the Arranger role", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64)", "desc": "Normalized ACTUS terms", "name": "terms", "struct": "NormalizedActusTerms"}, {"type": "(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "desc": "Initial kernel state (pre-IED)", "name": "initial_state", "struct": "InitialKernelState"}, {"type": "(byte[32],string)", "desc": "Prospectus (informational only)", "name": "prospectus", "struct": "Prospectus"}], "name": "contract_config", "returns": {"type": "uint64", "desc": "UNIX timestamp of contract configuration"}, "desc": "Partial contract configuration with: normalized ACTUS terms, initial kernel\nstate (pre-IED), prospectus (informational only). The contract stays inactive until all schedule pages are configured next.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "name": "schedule_page_index"}, {"type": "bool", "name": "is_last_page"}, {"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[]", "name": "schedule_page"}], "name": "contract_schedule", "returns": {"type": "uint64"}, "desc": "Upload one normalized schedule page.\nThe configuration operation is considered complete only when the last page is stored. At that point `schedule_entry_count` is finalized and the contract moves to `STATUS_PENDING_IED`.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "contract_execute_ied", "returns": {"type": "uint64"}, "desc": "Execute the first due `IED` entry and activate the contract.\n`IED` is the one non-cash event that moves the app from `STATUS_PENDING_IED` to `STATUS_ACTIVE`.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "name": "event_id"}, {"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "name": "payload", "struct": "ObservedEventRequest"}], "name": "apply_non_cash_event", "returns": {"type": "uint64"}, "desc": "Apply the next due non-cash event, optionally appending one first.\nObserved payloads are appended before execution when flagged. Rate reset events require the interest oracle because they can change the running nominal rate; other non-cash events stay arranger-controlled.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "name": "payload", "struct": "ObservedCashEventRequest"}], "name": "append_observed_cash_event", "returns": {"type": "uint64"}, "desc": "Append an arranger-authorized observed cash event to the schedule tail.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "contract_get_state", "returns": {"type": "(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "struct": "KernelState"}, "desc": "Return a readonly snapshot of the generic ACTUS kernel state.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "contract_get_next_due_event", "returns": {"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "struct": "ExecutionScheduleEntry"}, "desc": "Return the next boxed schedule entry, or a zeroed sentinel if ended.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["UpdateApplication"], "create": []}, "args": [], "name": "contract_update", "returns": {"type": "void"}, "desc": "Update D-ASA application.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "New Arranger address", "name": "new_arranger"}], "name": "rbac_rotate_arranger", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Rotate the Arranger address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Operation Daemon address", "name": "address"}], "name": "rbac_set_op_daemon", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Non-Normative: Set the Operation Daemon address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}, {"type": "(uint64,uint64)", "desc": "Role time validity", "name": "validity", "struct": "RoleValidity"}], "name": "rbac_assign_role", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Assign a role to an address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}], "name": "rbac_revoke_role", "returns": {"type": "uint64", "desc": "Timestamp of the role revocation"}, "desc": "Revoke a role from an address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Suspension status", "name": "suspended"}], "name": "rbac_contract_suspension", "returns": {"type": "uint64", "desc": "Timestamp of the set asset suspension status"}, "desc": "Set asset suspension status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "rbac_get_arranger", "returns": {"type": "address", "desc": "Arranger address"}, "desc": "Get Arranger address", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Address to get roles for", "name": "address"}], "name": "rbac_get_address_roles", "returns": {"type": "(bool,bool,bool,bool,bool)", "desc": "Roles mask: (Account Manager, Primary Dealer, Trustee, Authority, Observer)"}, "desc": "Non-normative - Get roles assigned to an address", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}], "name": "rbac_get_role_validity", "returns": {"type": "(uint64,uint64)", "desc": "Role validity", "struct": "RoleValidity"}, "desc": "Get role validity", "events": [], "readonly": true, "recommendations": {}}], "name": "DASA", "state": {"keys": {"box": {}, "global": {"arranger": {"key": "UiNBcnJhbmdlciM=", "keyType": "AVMBytes", "valueType": "address"}, "op_daemon": {"key": "UiNPcERhZW1vbiM=", "keyType": "AVMBytes", "valueType": "address"}, "asset_suspended": {"key": "YXNzZXRfc3VzcGVuZGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "asset_defaulted": {"key": "YXNzZXRfZGVmYXVsdGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "status": {"key": "c3RhdHVz", "keyType": "AVMString", "valueType": "AVMUint64"}, "contract_type": {"key": "Y29udHJhY3RfdHlwZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "prospectus_hash": {"key": "cHJvc3BlY3R1c19oYXNo", "keyType": "AVMString", "valueType": "AVMBytes"}, "prospectus_url": {"key": "cHJvc3BlY3R1c191cmw=", "keyType": "AVMString", "valueType": "AVMString"}, "denomination_asset_id": {"key": "ZGVub21pbmF0aW9uX2Fzc2V0X2lk", "keyType": "AVMString", "valueType": "AVMUint64"}, "settlement_asset_id": {"key": "c2V0dGxlbWVudF9hc3NldF9pZA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "initial_exchange_date": {"key": "aW5pdGlhbF9leGNoYW5nZV9kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "maturity_date": {"key": "bWF0dXJpdHlfZGF0ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "transfer_opening_date": {"key": "dHJhbnNmZXJfb3BlbmluZ19kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "transfer_closure_date": {"key": "dHJhbnNmZXJfY2xvc3VyZV9kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "day_count_convention": {"key": "ZGF5X2NvdW50X2NvbnZlbnRpb24=", "keyType": "AVMString", "valueType": "AVMUint64"}, "total_units": {"key": "dG90YWxfdW5pdHM=", "keyType": "AVMString", "valueType": "AVMUint64"}, "reserved_units_total": {"key": "cmVzZXJ2ZWRfdW5pdHNfdG90YWw=", "keyType": "AVMString", "valueType": "AVMUint64"}, "initial_exchange_amount": {"key": "aW5pdGlhbF9leGNoYW5nZV9hbW91bnQ=", "keyType": "AVMString", "valueType": "AVMUint64"}, "outstanding_principal": {"key": "b3V0c3RhbmRpbmdfcHJpbmNpcGFs", "keyType": "AVMString", "valueType": "AVMUint64"}, "next_principal_redemption": {"key": "bmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbg==", "keyType": "AVMString", "valueType": "AVMUint64"}, "dynamic_principal_redemption": {"key": "ZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbg==", "keyType": "AVMString", "valueType": "AVMUint64"}, "interest_calculation_base": {"key": "aW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "accrued_interest": {"key": "YWNjcnVlZF9pbnRlcmVzdA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "nominal_interest_rate": {"key": "bm9taW5hbF9pbnRlcmVzdF9yYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_spread": {"key": "cmF0ZV9yZXNldF9zcHJlYWQ=", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_multiplier": {"key": "cmF0ZV9yZXNldF9tdWx0aXBsaWVy", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_floor": {"key": "cmF0ZV9yZXNldF9mbG9vcg==", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_cap": {"key": "cmF0ZV9yZXNldF9jYXA=", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_next": {"key": "cmF0ZV9yZXNldF9uZXh0", "keyType": "AVMString", "valueType": "AVMUint64"}, "has_rate_reset_floor": {"key": "aGFzX3JhdGVfcmVzZXRfZmxvb3I=", "keyType": "AVMString", "valueType": "AVMUint64"}, "has_rate_reset_cap": {"key": "aGFzX3JhdGVfcmVzZXRfY2Fw", "keyType": "AVMString", "valueType": "AVMUint64"}, "reserved_principal": {"key": "cmVzZXJ2ZWRfcHJpbmNpcGFs", "keyType": "AVMString", "valueType": "AVMUint64"}, "reserved_interest": {"key": "cmVzZXJ2ZWRfaW50ZXJlc3Q=", "keyType": "AVMString", "valueType": "AVMUint64"}, "cumulative_interest_index": {"key": "Y3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "cumulative_principal_index": {"key": "Y3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXg=", "keyType": "AVMString", "valueType": "AVMUint64"}, "event_cursor": {"key": "ZXZlbnRfY3Vyc29y", "keyType": "AVMString", "valueType": "AVMUint64"}, "schedule_entry_count": {"key": "c2NoZWR1bGVfZW50cnlfY291bnQ=", "keyType": "AVMString", "valueType": "AVMUint64"}, "fixed_point_scale": {"key": "Zml4ZWRfcG9pbnRfc2NhbGU=", "keyType": "AVMString", "valueType": "AVMUint64"}}, "local": {}}, "maps": {"box": {"account_manager": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNBY2NvdW50TWFuYWdlciM="}, "primary_dealer": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNQcmltYXJ5RGVhbGVyIw=="}, "trustee": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNUcnVzdGVlIw=="}, "authority": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNBdXRob3JpdHkj"}, "observer": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNPYnNlcnZlciM="}, "schedule_page": {"keyType": "uint64", "valueType": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[]", "prefix": "UyM="}, "account": {"keyType": "address", "valueType": "AccountPosition", "prefix": "UiNBY2NvdW50Iw=="}}, "global": {}, "local": {}}, "schema": {"global": {"bytes": 4, "ints": 37}, "local": {"bytes": 0, "ints": 0}}}, "structs": {"AccountPosition": [{"name": "payment_address", "type": "address"}, {"name": "units", "type": "uint64"}, {"name": "reserved_units", "type": "uint64"}, {"name": "suspended", "type": "bool"}, {"name": "settled_cursor", "type": "uint64"}, {"name": "interest_checkpoint", "type": "uint64"}, {"name": "principal_checkpoint", "type": "uint64"}, {"name": "claimable_interest", "type": "uint64"}, {"name": "claimable_principal", "type": "uint64"}], "CashClaimResult": [{"name": "interest_amount", "type": "uint64"}, {"name": "principal_amount", "type": "uint64"}, {"name": "total_amount", "type": "uint64"}, {"name": "timestamp", "type": "uint64"}, {"name": "context", "type": "byte[]"}], "CashFundingResult": [{"name": "funded_interest", "type": "uint64"}, {"name": "funded_principal", "type": "uint64"}, {"name": "total_funded", "type": "uint64"}, {"name": "processed_events", "type": "uint64"}, {"name": "timestamp", "type": "uint64"}], "ExecutionScheduleEntry": [{"name": "event_id", "type": "uint64"}, {"name": "event_type", "type": "uint8"}, {"name": "scheduled_time", "type": "uint64"}, {"name": "accrual_factor", "type": "uint64"}, {"name": "redemption_accrual_factor", "type": "uint64"}, {"name": "next_nominal_interest_rate", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "next_outstanding_principal", "type": "uint64"}, {"name": "flags", "type": "uint64"}], "InitialKernelState": [{"name": "status_date", "type": "uint64"}, {"name": "event_cursor", "type": "uint64"}, {"name": "outstanding_principal", "type": "uint64"}, {"name": "interest_calculation_base", "type": "uint64"}, {"name": "nominal_interest_rate", "type": "uint64"}, {"name": "accrued_interest", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "cumulative_interest_index", "type": "uint64"}, {"name": "cumulative_principal_index", "type": "uint64"}], "KernelState": [{"name": "contract_type", "type": "uint8"}, {"name": "status", "type": "uint64"}, {"name": "total_units", "type": "uint64"}, {"name": "reserved_units_total", "type": "uint64"}, {"name": "initial_exchange_amount", "type": "uint64"}, {"name": "event_cursor", "type": "uint64"}, {"name": "schedule_entry_count", "type": "uint64"}, {"name": "outstanding_principal", "type": "uint64"}, {"name": "interest_calculation_base", "type": "uint64"}, {"name": "nominal_interest_rate", "type": "uint64"}, {"name": "accrued_interest", "type": "uint64"}, {"name": "cumulative_interest_index", "type": "uint64"}, {"name": "cumulative_principal_index", "type": "uint64"}, {"name": "reserved_interest", "type": "uint64"}, {"name": "reserved_principal", "type": "uint64"}], "NormalizedActusTerms": [{"name": "contract_type", "type": "uint8"}, {"name": "denomination_asset_id", "type": "uint64"}, {"name": "settlement_asset_id", "type": "uint64"}, {"name": "total_units", "type": "uint64"}, {"name": "notional_principal", "type": "uint64"}, {"name": "initial_exchange_amount", "type": "uint64"}, {"name": "initial_exchange_date", "type": "uint64"}, {"name": "maturity_date", "type": "uint64"}, {"name": "day_count_convention", "type": "uint8"}, {"name": "rate_reset_spread", "type": "uint64"}, {"name": "rate_reset_multiplier", "type": "uint64"}, {"name": "rate_reset_floor", "type": "uint64"}, {"name": "rate_reset_cap", "type": "uint64"}, {"name": "rate_reset_next", "type": "uint64"}, {"name": "has_rate_reset_floor", "type": "bool"}, {"name": "has_rate_reset_cap", "type": "bool"}, {"name": "dynamic_principal_redemption", "type": "bool"}, {"name": "fixed_point_scale", "type": "uint64"}], "ObservedCashEventRequest": [{"name": "event_id", "type": "uint64"}, {"name": "event_type", "type": "uint8"}, {"name": "scheduled_time", "type": "uint64"}, {"name": "accrual_factor", "type": "uint64"}, {"name": "redemption_accrual_factor", "type": "uint64"}, {"name": "next_nominal_interest_rate", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "next_outstanding_principal", "type": "uint64"}, {"name": "flags", "type": "uint64"}], "ObservedEventRequest": [{"name": "event_id", "type": "uint64"}, {"name": "event_type", "type": "uint8"}, {"name": "scheduled_time", "type": "uint64"}, {"name": "accrual_factor", "type": "uint64"}, {"name": "redemption_accrual_factor", "type": "uint64"}, {"name": "observed_rate", "type": "uint64"}, {"name": "next_nominal_interest_rate", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "next_outstanding_principal", "type": "uint64"}, {"name": "flags", "type": "uint64"}], "Prospectus": [{"name": "hash", "type": "byte[32]"}, {"name": "url", "type": "string"}], "RoleValidity": [{"name": "role_validity_start", "type": "uint64"}, {"name": "role_validity_end", "type": "uint64"}]}, "byteCode": {"approval": "DCAFAAEIINwLJjEEFR98dQZzdGF0dXMMZXZlbnRfY3Vyc29yFHNjaGVkdWxlX2VudHJ5X2NvdW50FW91dHN0YW5kaW5nX3ByaW5jaXBhbBFmaXhlZF9wb2ludF9zY2FsZRBhY2NydWVkX2ludGVyZXN0GWludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UKUiNBY2NvdW50IxVub21pbmFsX2ludGVyZXN0X3JhdGUNY29udHJhY3RfdHlwZRRyZXNlcnZlZF91bml0c190b3RhbBJyZXNlcnZlZF9wcmluY2lwYWwLdG90YWxfdW5pdHMZbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbhFyZXNlcnZlZF9pbnRlcmVzdBljdW11bGF0aXZlX2ludGVyZXN0X2luZGV4GmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4C1IjQXJyYW5nZXIjE3NldHRsZW1lbnRfYXNzZXRfaWQXaW5pdGlhbF9leGNoYW5nZV9hbW91bnQMUiNBdXRob3JpdHkjEFIjUHJpbWFyeURlYWxlciMRUiNBY2NvdW50TWFuYWdlciMCUyMLUiNPYnNlcnZlciMLUiNPcERhZW1vbiMVaW5pdGlhbF9leGNoYW5nZV9kYXRlFXRyYW5zZmVyX29wZW5pbmdfZGF0ZRV0cmFuc2Zlcl9jbG9zdXJlX2RhdGUQcmF0ZV9yZXNldF9mbG9vcg5yYXRlX3Jlc2V0X2NhcApSI1RydXN0ZWUjD2Fzc2V0X3N1c3BlbmRlZBxkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uEXJhdGVfcmVzZXRfc3ByZWFkFXJhdGVfcmVzZXRfbXVsdGlwbGllcg9yYXRlX3Jlc2V0X25leHQUaGFzX3JhdGVfcmVzZXRfZmxvb3ISaGFzX3JhdGVfcmVzZXRfY2FwAQAPYXNzZXRfZGVmYXVsdGVkD3Byb3NwZWN0dXNfaGFzaA5wcm9zcGVjdHVzX3VybBVkZW5vbWluYXRpb25fYXNzZXRfaWQNbWF0dXJpdHlfZGF0ZRRkYXlfY291bnRfY29udmVudGlvbgMGgQECAAAxGEAArScSMgNnJxoyA2cnISJnJykiZykiZycKImcnKoAAZycrgABnJywiZycTImcnGyJnJy0iZyccImcnHSJnJy4iZycNImcnCyJnJxQiZycEImcnDiJnJyIiZycHImcnBiJnJwkiZycjImcnJCJnJx4iZycfImcnJSJnJyYiZycnImcnDCJnJw8iZycQImcnESJnKiJnKyJnJwUiZzE1gQQSRDE0gSUSRDE3FEQxNhREgASRTwTrNhoAjgEAxzEZFEQxGEEAsIIYBLRGGMgE54MlKQSUOIcjBGyF4+4EvdGpRAR8DxgSBBT8EO8EdKcpfwQJ1P4UBJqb+oUEhe7TPQSrLA/EBNnyJawEmINQWgSOpudMBAKvVXoEgvcbLQTvBPXTBN80NVAEPb6AvQQePkjnBAEMgpkEdAas0gQacqLuNhoAjhgAVgMhBH0EpwUxBiEGWwazBuYHFAkICh8KmAwEDPYNiQ3ODeYN/g6zD0kPaA9zD70AgASVbXFWNhoAjgEG8QAxGYEEEjEYEERCDa6KAgCL/oEKCIsAMgwNQQAqsYEGshCBBbIZJy+yHicvsh+L/40CAAsABLNC/9syALIBQv/1IrIBQv/viSKAAEcNNhoBSRUkEkQXIillRESIFZ6IFaWIFaoiKWVEgTISFESIEgFBAAtJgWQLIQQIIoj/jyJFBSJFDiJFDUsESwEMQQJZIiplRCIrZUQMQQJNIiplRIgQ00lFEYEJW0lFAzIHDUACN0sPJFVJRRAkEklFBEAAEEsOgQMSQAAISw6BExJBAj8jQQIUSw8iWyIqZUQSREsBMgcOREsCQAHtSw6BExJAAeUiRQtLDyRVSUUQgQMSQAFlSw6BExJAAV0iRQZLD4ExW0UIiBFbQAD+SwdFCUsKiBAZSwaIEBRLAYgQLklOAkUPSYgQJUlFC0sCSwEISUUJMgoiJxNlRHAARCInD2VEIicMZURLAQhLAksBD0RPAkwJTwIPRE8DCCcPTGciJwxlRAgnDExnIicQZURPAggnEExnIicRZUQIJxFMZ0sPJFWBAxJBAHoiJwZlREsQiBDnRRIIJwZMZ4gQx0EACksPJFWBExJBAAlLD4EpWycOTGcnBEsIZycHSwlnIiplRCMIKkxnSw9XCAGAAROoQQARIicEZURAAAkpgcgBZycHImdLD0sESYgTVEhLDUsMCEUOSwxLBwhFDUsEIwhFBUL+dycGImdC/5BLDyRVSUUQgQMSQQAQIicEZURLBglJRQlFCUL+6UsOJBJBABMiJwRlTEUJRCInB2VMRQpEQv7PSw6BExJAAAdLB0UJQv7AIkUIIkUJQv63iBAIQQBWSw6BExJBAAoiJwRlREUGQv6OIicGZURLEIgP/0USCElFCyInDmVED0EABiJFBkL+byInDmVESwoJSUUIIicEZUQNQQAKIicEZURFBkL+UUsGRQZC/kpLD4ExWyInBGVESg5ETAlFBkL+NiInBmVESxCID6dFEghFC0L+DEsESURLDklLD0lOAwgyB08CFk8DFlBPAhZQTwIWUEwWUChMULAjQyJC/b6AAEcCNhoBRwIVJRJENhoCSSJZgQIISwEVEkRXAgBMIillREQnCExQSb1FAUQiJxplRDIDE0EAIjEAIicaZUQSQAAVMQBLAxJAAA0xAEsBvkRXACASQQEAI0SIEpaIEpsiKWVEgTISFERLAkmIDUuIDM5GAkm+REmBSVtJTgJFCEmBUVtJRQhPAghJRQZEVwAgIicTZURwAEUBQQC3Sb5EgYADU0AArSNBAHgyCiInE2VETEsBcABESwVJTgIPREsCSU4DvkRJVwAgsTIATwOyEkyyFE8CshGBBLIQsgGzSYFJW0lOAkUJSYFRW0lOA0UJIhZMSwFcSUxcUU8DTL8iJw9lRElLAg9EIicMZURLAw9ETAknD0xnIicMZURMCScMTGdLBUlLBklOAwgyB08CFk8DFlBPAhZQTBZQSwJJFRZXBgJMUEyAAgAiUExQKExQsCNDIkL/UCJC/v02GgFJFSQSRBc2GgJJFSQSRBeIEXhKDEQnHE8CZycdTGcyBxYoTFCwI0M2GgFJFSUSRDYaAkkVJBJEF0lOAiIpZUREJxYxAIgRD0SIEUmIEU4iKWVEgTISRCcISwJQSU4DvUUBREyIC2pJRCInC2VECCInDWVEDkQiJxtlREEACTIHIicbZUQOREcCvkSBKFtLA0lOAwgWgShMuyInC2VECCcLSwFnIicNZURMCRYoTFCwI0MiSTYaAUkVJRJENhoCSRUlEkQ2GgNHAhUkEkQXIillRESIEL+IEMQiKWVEgTISFEQiJxxlREEACSInHGVEMgcORCInHWVEQQAJMgciJx1lRAxEMQBLBElOAhJEJwhLAVBJRQhJvUUBRCcISwVJTgJQSUUJvUUBREsCiAqjSYgKn08CE0RLAUlETL5EJVsORCIqZUQiK2VED0AADiIqZUSIC7CBCVsyBw1ESwNJiAr7SwNJTgKICvOICnZGAogKcUYCSwVJvkQlW0sCSU4CSwEOREsBCRZPAiVPArtLBUm+RCVbTwIIFiVMuyhLAlCwI0M2GgFJFSUSRDYaAkkVIxJEIlMnFTEAiA+cRCcITwJQSb1FAURJgTAjuiJPA1SBMEy7MgcWKExQsCNDNhoBSRUlEkQ2GgJJFSUSRCcXMQCID2REIillRIHIARIURIgPlIgPmScITwJQSb1FARREIhZPAksBUEsBUCcoUEsBUEsBUEsBUEsBUExQvzIHFihMULAjQzYaAUkVJRJENhoCSRUlEkQnCEsCUEm9RQFEMQBPAxJEiA8+iA9DIk8CuzIHFihMULAjQzYaAUkVJRJEJwhMUEm9RQFEvkgoTFCwI0M2GgFJFSUSRCcSTGcyBxYoTFCwI0OAAEk2GgFHAhWBaxJENhoCSU4CFYFIEkQ2GgNJTgJJFUsBJVlJgSISRE8CTEsCUklOAyJZgSQIEkSIDroiVUknCksBZ0EAIkkjEkAAHEmBAhJAABVJgQMSQAAOSYEEEkAAB0mBBRJBAYcjRCInCmVMRQJESwRJgSFbSUUIRIE5VUlFCEEAH0sGIxJAABhLBoECEkAAEEsGgQMSQAAISwaBBBJBAUcjREkjE0EACEsEgZIGUxREIillRBREIicUZUQUREsESSNbSXELRQFEJyxLAWdLAYEJW0lPAhJEJxNLAWexMgAyCiKyErIUTLIRgQSyELIBs0mBEVsnDUxnJwsiZycuSwhnSYEpWycbSwFnSwGBMVsnLUsBZ0sGSU4CgTBbJw5MZycUSwpnSwOBkgZTJyJMZ0sBgRBbJwRMZ0sBgShbJwZMZ0sBJVsnCUxnSwGBGFsnB0xnSwOBOlsnI0xnSwOBQlsnJExnSwOBSlsnHkxnSwOBUlsnH0xnSwOBWlsnJUxnSwOBkAZTJyZMZ0sDgZEGUycnTGdPA4FjWycFTGdLASRbKkxnSwGBOFsnEExnSwGBQFsnEUxnJw8iZycMImdLAjIHDURMIltLAgxEDERLAlcAICcqTGdLAVcCACcrTGcyBxYoTFCwI0MiQv62IkL+diKAAEcCNhoBSRUkEkQXSTYaAkkVIxJEIlNMNhoDSU4CSSJZSU4DSYFBC4ECCE8CFRJEiAzNIicKZUxOA0QiKWVEFERJgRAORCInFGVEREyBEAtMgWQLIQQIIoj2tiJJSwQMQQCLSwRXAgBJRQxLAUlOAoFBC4FBWEkkVUlOAkUNSSJbSUUNSwVPBAhLARJESwVPA4gIGUyBCVtJRQpEQQAXSUEAJUkjCYFBC0sLTIFBWIEJW0sIDkRLCEAABUsJIxJESSMIRQFC/5RLBklEIwkWJxhMUEm9RQFESSKBAroXSUQjCYFBC4ECCIFBukL/wUsGFicYTFBJvEhLBb9LBUEADEsBSwQIK0xnKYEyZzIHFihMULAjQyIpZUREiAvjiAvqiAvvIiplRCIrZURLAQ1EiAdHSVcIAUmAAQGoREsBVwAISwJXCQhLA1cRCEsEVxkISwVXIQhLBlcpCEsHVzEISwhXOQhPB08IUE8HUE8GUE8FUCIWUE8EUE8DUE8CUExQiAh5RgIyBxYoTFCwI0MiRwSAAEk2GgFJFSQSRBc2GgJHAhWBSRJEIillRESIC1uIC2CBQVtJgQQaQQCwIicKZUSBBRJEiAs4IicKZURJgQUSREsCSSJbSUUHIitlRBJESVcIAUUMJFWIBsIiK2VEgRAKJzBFBxYnGExQSUUJvUUBQQAHSwe+TEUHREsFSSJZSYEQDERLA0lXCQhLAVcRCEsCVxkISwNXKQhLBFcxCE8FVzkISwsWSxJQTwZQTwVQTwRQTwNQTwJQTFBLAxZQTwJMUEwjCBZXBgJcAEsISbxITL8iK2VEIwgrTGciKmVESwNJTwISRIgF/0lFCElXCAFFCiRVSUUGIxJAAChLBIEEEkAAIEsEgQwSQAAYSwSBCxJAABBLBIESEkAACEsEgQUSQQBBI0RLCIABAalESwSBDBJAAAhLBIELEkEAJCNBABonGTEAiAnzREsGSwKIBxtGAjIHFihMULAjQ4gKEUL/6CJC/9kiQv+8Ikk2GgFHAhWBQRJEIillRESICfKICfmICf4iKWVEgTISFEQiJwplRIEFEkRJIltJTgIiK2VETEsBEkRLAVcIAUlOA4ABA6hETIE5W0lOAiMaREEAEyIrZUQjCYgFIYEJW0sEgQlbDkQiK2VEgRAKJzBFBhYnGExQSUUHvUUBQQAHSwW+TEUGREsESSJZSYEQDERLBUlXCQhLAVcRCEsCVxkISwNXIQhLBFcpCE8FVzEISwoWSwpQTwZQTwVQTwRQTwNQTwJQTFBLAxZQTwJMUEwjCBZXBgJcAEsGSbxITL8iK2VEIwgrTGcyBxYoTFCwI0MiKWVESUQiJwplRBZJkyQORFcHASInDWVEIicLZUQiJxRlRCIqZUQiK2VEIicEZUQiJwdlRCInCWVEIicGZUQiJxBlRCInEWVEIicPZUQiJwxlRE8OFk8OTFBPDRZQTwwWUE8LFlBPChZQTwkWUE8IFlBPBxZQTwYWUE8FFlBPBBZQTwMWUE8CFlBMFlAoTFCwI0MiKWVERCIqZUQiK2VED0EAJSIqZUQWJyhQIhZMSwFQSwFQSwFQSwFQSwFQSwFQTFAoTFCwI0MiKmVEiAO9Qv/wiAg+I0M2GgFJFSUSRIgIMScSTGcyBxYoTFCwI0M2GgFJFSUSRIgIGScaTGcyBxYoTFCwI0M2GgFJFSMSRDYaAklOAhUlEkQ2GgNJTgIVgRASRIgH7IgH8xdHAogH/YEUEkEADicSSwNnMgcWKExQsCNDSYEoEkEAEScXSwNQSb1FARRESwK/Qv/fSYEyEkEAEScWSwNQSb1FARRESwK/Qv/HSYE8EkEAEScgSwNQSb1FARRESwK/Qv+vSYFGEkEAEScVSwNQSb1FARRESwK/Qv+XSYFQEkH/kCcZSwNQSb1FARRESwK/Qv9/NhoBSRUjEkQ2GgJJTgIVJRJEiAdCiAdJF0cCiAdTSYEUE0SBKBJBABUnF0sCUEm9RQFEvEgyBxYoTFCwI0NJgTISQQAPJxZLAlBJvUUBRLxIQv/hSYE8EkEADycgSwJQSb1FAUS8SEL/y0mBRhJBAA8nFUsCUEm9RQFEvEhC/7VJgVASQf+uJxlLAlBJvUUBRLxIQv+fNhoBSRUjEkQiUycVMQCIBnxEJyFMZzIHFihMULAjQyInEmVEKExQsCNDNhoBSRUlEkQnF0sBiAZUJxZLAogGTScgSwOIBkYnFUsEiAY/JxlPBYgGOCcoIk8GVCNPBVSBAk8EVIEDTwNUgQRPAlQoTFCwI0M2GgFJFSMSRDYaAklOAhUlEkQXSYgGUIMGFCgyPEZQTwaOBgBPAEAAMQAiABMAAQAnGUsBUEm9RQFEvkgoTFCwI0MnFUsBUEm9RQFEvkhC/+snIEsBUEm9RQFEvkhC/9wnFksBUEm9RQFEvkhC/80nF0sBUEm9RQFEvkhC/76AEAAAAAAAAAAAAAAAAAAAAABC/6mKAQAnCIv/UL5EgYADUxREiYoBAicIi/9QSb1FAURJvkgiJxBlREsBgTlbCSInEWVESwKBQVsJSwIlWyInBWVETwNLAk8CiACYIicFZURPA08DTwKIAIpLAoFJW0sCCBZPA0xcSUmBUVtLAggWXFEiJxBlRBZcOSInEWVEFlxBIiplRBZcMU8DTL+JigEAIoAAJwiL/1BJvUUBRCIpZUSBMhJBAAGJiwK+TElOAowARIEoW0mMAUAAAYmLAEklW4sBSU4DCBZcICIWXCiLAky/IicLZURJSwIPREwJJwtMZ4mKAwGL/UEABYv+QAACIomL/Yv+HYv/l4mKAQGL/0AAAiKJIicNZURJRCInBWVEi/9MTwKI/8qJigEBi/9AAAIiiSInDWVEIicFZUSL/0yI/6+JigEBIitlRIv/DUSL/4EQChYnGExQSb1FAUSL/4EQGEsBIoECuhdLAQ1EgUELgQIIgUG6iYoCAIv/IxJAAB+L/yQSQAAYi/+BExJAABCL/4EMEkAACIv/gQsSQQADI0SJi/5AAAQiQv/1i/6BAxJAAAiL/oECEkEAGIv/gQMSQAAIi/+BEhJBAAQjQv/RIkL/zYv+IxJBACCL/4EDEkAAEIv/gRISQAAIi/+BBRJBAAQjQv+qIkL/pov+gQQSQQAoi/+BAxJAABiL/4EEEkAAEIv/gRISQAAIi/+BBRJBAAQjQv96IkL/dov+gQUSQQAIi/+BAxJC/2YiQv9iIicKZUQjEkEACiInImVEQQACI4kiiYoBAov/gRFbSUEAECInCWVEQQAIIicHZURAAAYii/9PAokiJwdlRCInCWVEIicFZUSI/mgiJwVlRIsATIj+XYv/TwKJigIBi/9AAAOL/okiJwVlRCInCWVEi/9LAoj+PAhJRCInBWVEi/5MTwKI/iyJigICIoAARwiL/iJbIiplRBJEi/6BCVsyBw5Ei/4kVUkjEklBAF4iKWVEgTISRCInC2VEIicNZUQSRIv+gTFbJwRLAWcnB0xni/6BIVsnCUxnJwYiZ4v+gSlbJw5MZyIqZUQjCCpMZymBZGeLC0QiJxRlRIv+TCKIAdpJjP6L/4wBjACJIillRIEyEhREIicGZUSL/oj++Iz+CCcGTGeLCoEMEkEBeIv/gSFbIickZUQiJwVlRIj9cyInI2VECIwGIicmZURBABMiJx5lRIsGDUEACCInHmVMjAZEIicnZURBABMiJx9lRIsGDEEACCInH2VMjAZEJwmLBmeLCoEEEkEBB4v+gTFbJwRLAWcnB0xniP5lQQDniwqBBRJBAMUiK2VEIiplRAmBZAshBAgiiOvjIicFZUyMAkQijAEijAeL/oEZW0mMCEEAD4sCiwiI/oFJjAIjjAeMASIqZUQjCIwDIitlRIsDDUEAUosDiP0MSYwAJFVJjASBAxJAABCLBIETEkEAM4sAgRlbQQArI0EACIsHQQAMIowHiwMjCIwDQv++iwCBGVuLAkyI/iRJjAKLAQiMAUL/4SJC/9KLAUQiJwRlRIv+gTlbJBpAAAYiJwZlRAgiJwVlRIsBiPxLJw5MZyIqZUQjCCpMZ4v+IkmIAGBJjP6L/4wBjACJi/6BKVsnDkxnQv/aiwqBEhJB/v8iJwRlRCcHTGdC/vOLCoELEkEAG4v+gSFbSYwFQAAIIiclZUyMBUQnCYsFZ0L+uov+gSFbSYwJQf6vJwmLCWdC/qeKAwEyCIv9IluL/VcIAYv9VwkIMgeL/SRVi/5AAEUjFkmTJA5EVwcBIicTZUSLAUkjCIsAFk8CFlCLAlCLA1CLBBZQi/4WUE8DUIv/FlBPAhZQTBZQgASaMyuVTFCwi/2MAImLBSMSQAAIiwWBBBJBAAQjQv+pgf8BQv+jigIBgACL/ov/UEm9RQFBAB+LAb5EIlsyB0mMAA5BABCLAb5EJFuLAA9BAAQjjACJIkL/+TEAIicSZUQSRIkiJyllRBREiSInIWVEFESJigEAi/+BFBJAADCL/4EZEkAAKIv/gSgSQAAgi/+BMhJAABiL/4E8EkAAEIv/gUYSQAAIi/+BUBJBAAMjRIkiQv/6", "clear": "DIEBQw=="}, "desc": "Debt Algorand Standard Application.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "networks": {}, "source": {"approval": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCAzMiAxNTAwCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUgInN0YXR1cyIgImV2ZW50X2N1cnNvciIgInNjaGVkdWxlX2VudHJ5X2NvdW50IiAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIiAiZml4ZWRfcG9pbnRfc2NhbGUiICJhY2NydWVkX2ludGVyZXN0IiAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIgMHg1MjIzNDE2MzYzNmY3NTZlNzQyMyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIiAiY29udHJhY3RfdHlwZSIgInJlc2VydmVkX3VuaXRzX3RvdGFsIiAicmVzZXJ2ZWRfcHJpbmNpcGFsIiAidG90YWxfdW5pdHMiICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIiAicmVzZXJ2ZWRfaW50ZXJlc3QiICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IiAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiIDB4NTIyMzQxNzI3MjYxNmU2NzY1NzIyMyAic2V0dGxlbWVudF9hc3NldF9pZCIgImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IiAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzIDB4NTIyMzQxNjM2MzZmNzU2ZTc0NGQ2MTZlNjE2NzY1NzIyMyAweDUzMjMgMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzIDB4NTIyMzRmNzA0NDYxNjU2ZDZmNmUyMyAiaW5pdGlhbF9leGNoYW5nZV9kYXRlIiAidHJhbnNmZXJfb3BlbmluZ19kYXRlIiAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIiAicmF0ZV9yZXNldF9mbG9vciIgInJhdGVfcmVzZXRfY2FwIiAweDUyMjM1NDcyNzU3Mzc0NjU2NTIzICJhc3NldF9zdXNwZW5kZWQiICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIiAicmF0ZV9yZXNldF9zcHJlYWQiICJyYXRlX3Jlc2V0X211bHRpcGxpZXIiICJyYXRlX3Jlc2V0X25leHQiICJoYXNfcmF0ZV9yZXNldF9mbG9vciIgImhhc19yYXRlX3Jlc2V0X2NhcCIgMHgwMCAiYXNzZXRfZGVmYXVsdGVkIiAicHJvc3BlY3R1c19oYXNoIiAicHJvc3BlY3R1c191cmwiICJkZW5vbWluYXRpb25fYXNzZXRfaWQiICJtYXR1cml0eV9kYXRlIiAiZGF5X2NvdW50X2NvbnZlbnRpb24iIDB4MDY4MTAxIDB4MDAwMAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4LTI5CiAgICAvLyAjIFJCQUMgUm9sZXMKICAgIC8vIHNlbGYuYXJyYW5nZXIgPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX0FSUkFOR0VSKQogICAgYnl0ZWMgMTggLy8gMHg1MjIzNDE3MjcyNjE2ZTY3NjU3MjIzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzAKICAgIC8vIHNlbGYub3BfZGFlbW9uID0gR2xvYmFsU3RhdGUoQWNjb3VudCgpLCBrZXk9Y3N0LlBSRUZJWF9JRF9PUF9EQUVNT04pCiAgICBieXRlYyAyNiAvLyAweDUyMjM0ZjcwNDQ2MTY1NmQ2ZjZlMjMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo0Ny00OAogICAgLy8gIyBELUFTQSBHb3Zlcm5hbmNlCiAgICAvLyBzZWxmLmFzc2V0X3N1c3BlbmRlZCA9IEZhbHNlCiAgICBieXRlYyAzMyAvLyAiYXNzZXRfc3VzcGVuZGVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NDkKICAgIC8vIHNlbGYuYXNzZXRfZGVmYXVsdGVkID0gRmFsc2UKICAgIGJ5dGVjIDQxIC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU2LTU3CiAgICAvLyAjIENvbnRyYWN0CiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwLTYxCiAgICAvLyAjIFByb3NwZWN0dXMgKEluZm9ybWF0aW9uYWwpCiAgICAvLyBzZWxmLnByb3NwZWN0dXNfaGFzaCA9IEJ5dGVzKCkKICAgIGJ5dGVjIDQyIC8vICJwcm9zcGVjdHVzX2hhc2giCiAgICBwdXNoYnl0ZXMgMHgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MgogICAgLy8gc2VsZi5wcm9zcGVjdHVzX3VybCA9IFN0cmluZygpCiAgICBieXRlYyA0MyAvLyAicHJvc3BlY3R1c191cmwiCiAgICBwdXNoYnl0ZXMgIiIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NC02NQogICAgLy8gIyBEZW5vbWluYXRpb24KICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gQXNzZXQoKQogICAgYnl0ZWMgNDQgLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjYKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCA9IEFzc2V0KCkKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OC02OQogICAgLy8gIyBUaW1lCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgMjcgLy8gImluaXRpYWxfZXhjaGFuZ2VfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzAKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgNDUgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxCiAgICAvLyBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgMjggLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIKICAgIC8vIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlID0gdHlwLlRpbWVTdGFtcCgpCiAgICBieXRlYyAyOSAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NC03NQogICAgLy8gIyBEYXkgQ291bnQgQ29udmVudGlvbgogICAgLy8gc2VsZi5kYXlfY291bnRfY29udmVudGlvbiA9IFVJbnQ2NCgpCiAgICBieXRlYyA0NiAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc3LTc4CiAgICAvLyAjIFVuaXRzCiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzID0gVUludDY0KCkKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPSBVSW50NjQoKQogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MS04MgogICAgLy8gIyBQcmluY2lwYWwKICAgIC8vIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPSBVSW50NjQoKQogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MwogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBVSW50NjQoKQogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NAogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gVUludDY0KCkKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NQogICAgLy8gc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gRmFsc2UKICAgIGJ5dGVjIDM0IC8vICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4Ny04OAogICAgLy8gIyBJbnRlcmVzdAogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gVUludDY0KCkKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg5CiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgPSBVSW50NjQoKQogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTEtOTIKICAgIC8vICMgSW50ZXJlc3QgUmF0ZXMKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTMKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQgPSBVSW50NjQoKQogICAgYnl0ZWMgMzUgLy8gInJhdGVfcmVzZXRfc3ByZWFkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NAogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIgPSBVSW50NjQoKQogICAgYnl0ZWMgMzYgLy8gInJhdGVfcmVzZXRfbXVsdGlwbGllciIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTUKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9mbG9vciA9IFVJbnQ2NCgpCiAgICBieXRlYyAzMCAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTYKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9jYXAgPSBVSW50NjQoKQogICAgYnl0ZWMgMzEgLy8gInJhdGVfcmVzZXRfY2FwIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NwogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X25leHQgPSBVSW50NjQoKQogICAgYnl0ZWMgMzcgLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTgKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgPSBGYWxzZQogICAgYnl0ZWMgMzggLy8gImhhc19yYXRlX3Jlc2V0X2Zsb29yIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OQogICAgLy8gc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgPSBGYWxzZQogICAgYnl0ZWMgMzkgLy8gImhhc19yYXRlX3Jlc2V0X2NhcCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAxLTEwMgogICAgLy8gIyBQcmltYXJ5IERpc3RyaWJ1dGlvbgogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgPSBVSW50NjQoKQogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAzCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0ID0gVUludDY0KCkKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA1LTEwNgogICAgLy8gIyBDdW11bGF0aXZlIFBlci1Vbml0IEZpeGVkLVBvaW50IEluZGV4ZXMKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4ID0gVUludDY0KCkKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1CiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciA9IFVJbnQ2NCgpCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNgogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA9IFVJbnQ2NCgpCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE4LTExOQogICAgLy8gIyBTY2FsaW5nCiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlID0gVUludDY0KCkKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6MjMKICAgIC8vIGFzc2VydCBUeG4uZ2xvYmFsX251bV9ieXRlX3NsaWNlID09IGNmZy5HTE9CQUxfQllURVMsIGVyci5XUk9OR19HTE9CQUxfQllURVMKICAgIHR4biBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgQnl0ZXMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjI0CiAgICAvLyBhc3NlcnQgVHhuLmdsb2JhbF9udW1fdWludCA9PSBjZmcuR0xPQkFMX1VJTlRTLCBlcnIuV1JPTkdfR0xPQkFMX1VJTlRTCiAgICB0eG4gR2xvYmFsTnVtVWludAogICAgcHVzaGludCAzNwogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgVUludHMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBhc3NlcnQgVHhuLmxvY2FsX251bV9ieXRlX3NsaWNlID09IGNmZy5MT0NBTF9CWVRFUywgZXJyLldST05HX0xPQ0FMX0JZVEVTCiAgICB0eG4gTG9jYWxOdW1CeXRlU2xpY2UKICAgICEKICAgIGFzc2VydCAvLyBXcm9uZyBMb2NhbCBCeXRlcyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6MjYKICAgIC8vIGFzc2VydCBUeG4ubG9jYWxfbnVtX3VpbnQgPT0gY2ZnLkxPQ0FMX1VJTlRTLCBlcnIuV1JPTkdfTE9DQUxfVUlOVFMKICAgIHR4biBMb2NhbE51bVVpbnQKICAgICEKICAgIGFzc2VydCAvLyBXcm9uZyBMb2NhbCBVSW50cyBhbGxvY2F0aW9uCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kX2FzYS9jb250cmFjdC5weTo4LTE4CiAgICAvLyBjbGFzcyBEQVNBKAogICAgLy8gICAgIFBheW1lbnRBZ2VudCwKICAgIC8vICAgICBUcmFuc2ZlckFnZW50LAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gICAgIGF2bV92ZXJzaW9uPTEyLAogICAgLy8gKToKICAgIHB1c2hieXRlcyAweDkxNGYwNGViIC8vIG1ldGhvZCAiY29udHJhY3RfdXBkYXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9jb250cmFjdF91cGRhdGVfcm91dGVANAoKbWFpbl9zd2l0Y2hfY2FzZV9uZXh0QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6OC0xOAogICAgLy8gY2xhc3MgREFTQSgKICAgIC8vICAgICBQYXltZW50QWdlbnQsCiAgICAvLyAgICAgVHJhbnNmZXJBZ2VudCwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBhdm1fdmVyc2lvbj0xMiwKICAgIC8vICk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBieiBtYWluX2NyZWF0ZV9Ob09wQDMyCiAgICBwdXNoYnl0ZXNzIDB4YjQ0NjE4YzggMHhlNzgzMjUyOSAweDk0Mzg4NzIzIDB4NmM4NWUzZWUgMHhiZGQxYTk0NCAweDdjMGYxODEyIDB4MTRmYzEwZWYgMHg3NGE3Mjk3ZiAweDA5ZDRmZTE0IDB4OWE5YmZhODUgMHg4NWVlZDMzZCAweGFiMmMwZmM0IDB4ZDlmMjI1YWMgMHg5ODgzNTA1YSAweDhlYTZlNzRjIDB4MDJhZjU1N2EgMHg4MmY3MWIyZCAweGVmMDRmNWQzIDB4ZGYzNDM1NTAgMHgzZGJlODBiZCAweDFlM2U0OGU3IDB4MDEwYzgyOTkgMHg3NDA2YWNkMiAweDFhNzJhMmVlIC8vIG1ldGhvZCAiZnVuZF9kdWVfY2FzaGZsb3dzKHVpbnQ2NCkodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImNsYWltX2R1ZV9jYXNoZmxvd3MoYWRkcmVzcyxieXRlW10pKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxieXRlW10pIiwgbWV0aG9kICJ0cmFuc2Zlcl9zZXRfc2NoZWR1bGUodWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInByaW1hcnlfZGlzdHJpYnV0aW9uKGFkZHJlc3MsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidHJhbnNmZXIoYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgImFjY291bnRfc3VzcGVuc2lvbihhZGRyZXNzLGJvb2wpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X29wZW4oYWRkcmVzcyxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAiYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzKGFkZHJlc3MsYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgImFjY291bnRfZ2V0X3Bvc2l0aW9uKGFkZHJlc3MpKGFkZHJlc3MsdWludDY0LHVpbnQ2NCxib29sLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJjb250cmFjdF9jb25maWcoKHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LGJvb2wsYm9vbCxib29sLHVpbnQ2NCksKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSwoYnl0ZVszMl0sc3RyaW5nKSl1aW50NjQiLCBtZXRob2QgImNvbnRyYWN0X3NjaGVkdWxlKHVpbnQ2NCxib29sLCh1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KVtdKXVpbnQ2NCIsIG1ldGhvZCAiY29udHJhY3RfZXhlY3V0ZV9pZWQoKXVpbnQ2NCIsIG1ldGhvZCAiYXBwbHlfbm9uX2Nhc2hfZXZlbnQodWludDY0LCh1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkpdWludDY0IiwgbWV0aG9kICJhcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudCgodWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkpdWludDY0IiwgbWV0aG9kICJjb250cmFjdF9nZXRfc3RhdGUoKSh1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAiY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50KCkodWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgInJiYWNfcm90YXRlX2FycmFuZ2VyKGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX3NldF9vcF9kYWVtb24oYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgInJiYWNfYXNzaWduX3JvbGUodWludDgsYWRkcmVzcywodWludDY0LHVpbnQ2NCkpdWludDY0IiwgbWV0aG9kICJyYmFjX3Jldm9rZV9yb2xlKHVpbnQ4LGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX2NvbnRyYWN0X3N1c3BlbnNpb24oYm9vbCl1aW50NjQiLCBtZXRob2QgInJiYWNfZ2V0X2FycmFuZ2VyKClhZGRyZXNzIiwgbWV0aG9kICJyYmFjX2dldF9hZGRyZXNzX3JvbGVzKGFkZHJlc3MpKGJvb2wsYm9vbCxib29sLGJvb2wsYm9vbCkiLCBtZXRob2QgInJiYWNfZ2V0X3JvbGVfdmFsaWRpdHkodWludDgsYWRkcmVzcykodWludDY0LHVpbnQ2NCkiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBmdW5kX2R1ZV9jYXNoZmxvd3MgY2xhaW1fZHVlX2Nhc2hmbG93cyB0cmFuc2Zlcl9zZXRfc2NoZWR1bGUgcHJpbWFyeV9kaXN0cmlidXRpb24gdHJhbnNmZXIgYWNjb3VudF9zdXNwZW5zaW9uIGFjY291bnRfb3BlbiBhY2NvdW50X3VwZGF0ZV9wYXltZW50X2FkZHJlc3MgYWNjb3VudF9nZXRfcG9zaXRpb24gY29udHJhY3RfY29uZmlnIGNvbnRyYWN0X3NjaGVkdWxlIGNvbnRyYWN0X2V4ZWN1dGVfaWVkIGFwcGx5X25vbl9jYXNoX2V2ZW50IGFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50IGNvbnRyYWN0X2dldF9zdGF0ZSBjb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnQgcmJhY19yb3RhdGVfYXJyYW5nZXIgcmJhY19zZXRfb3BfZGFlbW9uIHJiYWNfYXNzaWduX3JvbGUgcmJhY19yZXZva2Vfcm9sZSByYmFjX2NvbnRyYWN0X3N1c3BlbnNpb24gcmJhY19nZXRfYXJyYW5nZXIgcmJhY19nZXRfYWRkcmVzc19yb2xlcyByYmFjX2dldF9yb2xlX3ZhbGlkaXR5CiAgICBlcnIKCm1haW5fY3JlYXRlX05vT3BAMzI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6OC0xOAogICAgLy8gY2xhc3MgREFTQSgKICAgIC8vICAgICBQYXltZW50QWdlbnQsCiAgICAvLyAgICAgVHJhbnNmZXJBZ2VudCwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBhdm1fdmVyc2lvbj0xMiwKICAgIC8vICk6CiAgICBwdXNoYnl0ZXMgMHg5NTZkNzE1NiAvLyBtZXRob2QgImNvbnRyYWN0X2NyZWF0ZShhZGRyZXNzKXVpbnQ2NCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIGNvbnRyYWN0X2NyZWF0ZQogICAgZXJyCgptYWluX2NvbnRyYWN0X3VwZGF0ZV9yb3V0ZUA0OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgcHVzaGludCA0IC8vIFVwZGF0ZUFwcGxpY2F0aW9uCiAgICA9PQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICYmCiAgICBhc3NlcnQKICAgIGIgY29udHJhY3RfdXBkYXRlCgoKLy8gX3B1eWFfbGliLnV0aWwuZW5zdXJlX2J1ZGdldChyZXF1aXJlZF9idWRnZXQ6IHVpbnQ2NCwgZmVlX3NvdXJjZTogdWludDY0KSAtPiB2b2lkOgplbnN1cmVfYnVkZ2V0OgogICAgcHJvdG8gMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMTAKICAgICsKCmVuc3VyZV9idWRnZXRfd2hpbGVfdG9wQDE6CiAgICBmcmFtZV9kaWcgMAogICAgZ2xvYmFsIE9wY29kZUJ1ZGdldAogICAgPgogICAgYnogZW5zdXJlX2J1ZGdldF9hZnRlcl93aGlsZUA2CiAgICBpdHhuX2JlZ2luCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgYnl0ZWMgNDcgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtCiAgICBieXRlYyA0NyAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbQogICAgZnJhbWVfZGlnIC0xCiAgICBzd2l0Y2ggZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8wQDMgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8xQDQKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfbmV4dEA1OgogICAgaXR4bl9zdWJtaXQKICAgIGIgZW5zdXJlX2J1ZGdldF93aGlsZV90b3BAMQoKZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8xQDQ6CiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgYiBlbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX25leHRANQoKZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8wQDM6CiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGIgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV9uZXh0QDUKCmVuc3VyZV9idWRnZXRfYWZ0ZXJfd2hpbGVANjoKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucGF5bWVudF9hZ2VudC5QYXltZW50QWdlbnQuZnVuZF9kdWVfY2FzaGZsb3dzW3JvdXRpbmddKCkgLT4gdm9pZDoKZnVuZF9kdWVfY2FzaGZsb3dzOgogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAxMwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NTEKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjUyCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjUzCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo1NQogICAgLy8gaWYgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCk6CiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo1OS02MAogICAgLy8gKyBtYXhfZXZlbnRfY291bnQKICAgIC8vICogVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfUEVSX0VWRU5UX0JVREdFVCkKICAgIGR1cAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjYwCiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfRlVORF9EVUVfQ0FTSEZMT1dTX1BFUl9FVkVOVF9CVURHRVQpCiAgICBwdXNoaW50IDEwMAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjU5LTYwCiAgICAvLyArIG1heF9ldmVudF9jb3VudAogICAgLy8gKiBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19QRVJfRVZFTlRfQlVER0VUKQogICAgKgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjU4CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19CQVNFX0JVREdFVCkKICAgIGludGMgNCAvLyAxNTAwCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NTgtNjAKICAgIC8vIFVJbnQ2NChjc3QuT1BfVVBfRlVORF9EVUVfQ0FTSEZMT1dTX0JBU0VfQlVER0VUKQogICAgLy8gKyBtYXhfZXZlbnRfY291bnQKICAgIC8vICogVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfUEVSX0VWRU5UX0JVREdFVCkKICAgICsKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo1Ni02MgogICAgLy8gZW5zdXJlX2J1ZGdldCgKICAgIC8vICAgICByZXF1aXJlZF9idWRnZXQ9KAogICAgLy8gICAgICAgICBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19CQVNFX0JVREdFVCkKICAgIC8vICAgICAgICAgKyBtYXhfZXZlbnRfY291bnQKICAgIC8vICAgICAgICAgKiBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19QRVJfRVZFTlRfQlVER0VUKQogICAgLy8gICAgICksCiAgICAvLyApCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjY0CiAgICAvLyBwcm9jZXNzZWRfZXZlbnRzID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA1CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjUKICAgIC8vIGZ1bmRlZF9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2NgogICAgLy8gZnVuZGVkX3ByaW5jaXBhbCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTMKCmZ1bmRfZHVlX2Nhc2hmbG93c193aGlsZV90b3BANDoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2OQogICAgLy8gcHJvY2Vzc2VkX2V2ZW50cyA8IG1heF9ldmVudF9jb3VudAogICAgZGlnIDQKICAgIGRpZyAxCiAgICA8CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjktNzAKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgPCBtYXhfZXZlbnRfY291bnQKICAgIC8vIGFuZCBzZWxmLmV2ZW50X2N1cnNvciA8IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQKICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl93aGlsZUAxMQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjcwCiAgICAvLyBhbmQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIDwKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2OS03MAogICAgLy8gcHJvY2Vzc2VkX2V2ZW50cyA8IG1heF9ldmVudF9jb3VudAogICAgLy8gYW5kIHNlbGYuZXZlbnRfY3Vyc29yIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudAogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDExCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzIKICAgIC8vIGVudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KHNlbGYuZXZlbnRfY3Vyc29yKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIGR1cAogICAgYnVyeSAxNwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjczCiAgICAvLyBpZiBlbnRyeS5zY2hlZHVsZWRfdGltZSA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wOgogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDMKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgID4KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAMTEKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3NQogICAgLy8gaWYgbm90IHNlbGYuX2V2ZW50X2lzX2Nhc2goZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSk6CiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ1cnkgMTYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM1MQogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUCksCiAgICBpbnRjXzIgLy8gOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzUwLTM1NAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfTUQpLAogICAgLy8gKQogICAgPT0KICAgIGR1cAogICAgYnVyeSA0CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfdHJ1ZUA1MgogICAgZGlnIDE0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNTIKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNTAtMzU0CiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9NRCksCiAgICAvLyApCiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX3RydWVANTIKICAgIGRpZyAxNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzUzCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX01EKSwKICAgIHB1c2hpbnQgMTkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM1MC0zNTQKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX01EKSwKICAgIC8vICkKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUA1MwoKZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfdHJ1ZUA1MjoKICAgIGludGNfMSAvLyAxCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUA1NDoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3NQogICAgLy8gaWYgbm90IHNlbGYuX2V2ZW50X2lzX2Nhc2goZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSk6CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAMTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU0OAogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X2lkID09IHNlbGYuZXZlbnRfY3Vyc29yLCBlcnIuSU5WQUxJRF9FVkVOVF9DVVJTT1IKICAgIGRpZyAxNQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBjdXJzb3IKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU0OQogICAgLy8gYXNzZXJ0IGVudHJ5LnNjaGVkdWxlZF90aW1lIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLCBlcnIuTk9fRFVFX0NBU0hGTE9XCiAgICBkaWcgMQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPD0KICAgIGFzc2VydCAvLyBObyBkdWUgY2FzaGZsb3cgdG8gcGF5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MTMKICAgIC8vIGlmIGV2ZW50X3R5cGUgbm90IGluIChVSW50NjQoZW51bXMuRVZUX0lQKSwgVUludDY0KGVudW1zLkVWVF9NRCkpOgogICAgZGlnIDIKICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNQogICAgZGlnIDE0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MTQKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDExCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfaW50ZXJlc3RfYW1vdW50QDE2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDI2CiAgICAvLyBldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBidXJ5IDE2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MjcKICAgIC8vIGlmIGV2ZW50X3R5cGUgbm90IGluIChVSW50NjQoZW51bXMuRVZUX1BSKSwgVUludDY0KGVudW1zLkVWVF9NRCkpOgogICAgcHVzaGludCAzCiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE5CiAgICBkaWcgMTQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQyOAogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNgoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnRAMjg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTMKICAgIC8vIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGRpZyAxNQogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTU2CiAgICAvLyBpZiBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKToKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDI5CiAgICBkaWcgNwogICAgYnVyeSA5CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzODoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU3Mi01NzQKICAgIC8vICMgRnVuZGluZyB1c2VzIHBlci11bml0IGN1bXVsYXRpdmUgaW5kaWNlcyBzbyBlYWNoIGhvbGRlciBjYW4gc2V0dGxlCiAgICAvLyAjIGluZGVwZW5kZW50bHkgZnJvbSBpdHMgY3VycmVudCB1bml0IGJhbGFuY2UuCiAgICAvLyBpbnRlcmVzdF9pbmRleF9kZWx0YSA9IHNlbGYuX2Ftb3VudF90b19pbmRleF9kZWx0YShpbnRlcmVzdF9hbW91bnRfZHVlKQogICAgZGlnIDEwCiAgICBjYWxsc3ViIF9hbW91bnRfdG9faW5kZXhfZGVsdGEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU3NQogICAgLy8gcHJpbmNpcGFsX2luZGV4X2RlbHRhID0gc2VsZi5fYW1vdW50X3RvX2luZGV4X2RlbHRhKHByaW5jaXBhbF9hbW91bnRfZHVlKQogICAgZGlnIDYKICAgIGNhbGxzdWIgX2Ftb3VudF90b19pbmRleF9kZWx0YQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTc2CiAgICAvLyBpbnRlcmVzdF9hbW91bnQgPSBzZWxmLl9pbmRleF9kZWx0YV90b19hbW91bnQoaW50ZXJlc3RfaW5kZXhfZGVsdGEpCiAgICBkaWcgMQogICAgY2FsbHN1YiBfaW5kZXhfZGVsdGFfdG9fYW1vdW50CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgMTUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU3NwogICAgLy8gcHJpbmNpcGFsX2Ftb3VudCA9IHNlbGYuX2luZGV4X2RlbHRhX3RvX2Ftb3VudChwcmluY2lwYWxfaW5kZXhfZGVsdGEpCiAgICBkdXAKICAgIGNhbGxzdWIgX2luZGV4X2RlbHRhX3RvX2Ftb3VudAogICAgZHVwCiAgICBidXJ5IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzgKICAgIC8vIHJlcXVpcmVkX2Ftb3VudCA9IGludGVyZXN0X2Ftb3VudCArIHByaW5jaXBhbF9hbW91bnQKICAgIGRpZyAyCiAgICBkaWcgMQogICAgKwogICAgZHVwCiAgICBidXJ5IDkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjczNgogICAgLy8gYmFsYW5jZSA9IHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ1NgogICAgLy8gcmV0dXJuIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgKyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIGRpZyAxCiAgICArCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MzgKICAgIC8vIGFzc2VydCBiYWxhbmNlID49IHJlc2VydmVkX3RvdGFsLCBlcnIuTk9UX0VOT1VHSF9GVU5EUwogICAgZGlnIDIKICAgIGRpZyAxCiAgICA+PQogICAgYXNzZXJ0IC8vIE5vdCBlbm91Z2ggZnVuZHMgZm9yIHRoZSBwYXltZW50CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MzkKICAgIC8vIHJldHVybiBiYWxhbmNlIC0gcmVzZXJ2ZWRfdG90YWwKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTgwCiAgICAvLyBzZWxmLl9hdmFpbGFibGVfc2V0dGxlbWVudF9mdW5kcygpID49IHJlcXVpcmVkX2Ftb3VudAogICAgdW5jb3ZlciAyCiAgICA+PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTc5LTU4MQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLl9hdmFpbGFibGVfc2V0dGxlbWVudF9mdW5kcygpID49IHJlcXVpcmVkX2Ftb3VudAogICAgLy8gKSwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTgzCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0ICs9IGludGVyZXN0X2Ftb3VudAogICAgdW5jb3ZlciAzCiAgICArCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTg0CiAgICAvLyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCArPSBwcmluY2lwYWxfYW1vdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICArCiAgICBieXRlYyAxMiAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4NQogICAgLy8gc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4ICs9IGludGVyZXN0X2luZGV4X2RlbHRhCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCBleGlzdHMKICAgIHVuY292ZXIgMgogICAgKwogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTg2CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4ICs9IHByaW5jaXBhbF9pbmRleF9kZWx0YQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCBleGlzdHMKICAgICsKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1ODcKICAgIC8vIGlmIGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkgPT0gVUludDY0KGVudW1zLkVWVF9QUik6CiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBwdXNoaW50IDMKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDQwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1ODgtNTg5CiAgICAvLyAjIEZvciBQUiwgdGhlIHBlcmlvZCBpbnRlcmVzdCBzdGF5cyBhY2NydWVkIHVudGlsIGEgbGF0ZXIgSVAgb3IgTUQuCiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgKz0gc2VsZi5fZW50cnlfaW50ZXJlc3Rfc2VnbWVudChlbnRyeSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBkaWcgMTYKICAgIGNhbGxzdWIgX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQKICAgIGJ1cnkgMTgKICAgICsKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTIKICAgIC8vIGlmIG5vdCBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKSBvciBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NCgKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlANDMKICAgIGRpZyAxNQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5Mi01OTQKICAgIC8vIGlmIG5vdCBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKSBvciBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NCgKICAgIC8vICAgICBlbnVtcy5FVlRfTUQKICAgIC8vICk6CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDQKCmZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDQzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTk1CiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBkaWcgMTUKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0NDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5NgogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgZGlnIDgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTcKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IG5leHRfaW50ZXJlc3RfYmFzZQogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGRpZyA5CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTk4CiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MDAKICAgIC8vIGlmIGVudHJ5LmV2ZW50X3R5cGUgPT0gYXJjNC5VSW50OCgKICAgIGRpZyAxNQogICAgZXh0cmFjdCA4IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwMC02MDIKICAgIC8vIGlmIGVudHJ5LmV2ZW50X3R5cGUgPT0gYXJjNC5VSW50OCgKICAgIC8vICAgICBlbnVtcy5FVlRfTUQKICAgIC8vICkgYW5kIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID09IFVJbnQ2NCgwKToKICAgIHB1c2hieXRlcyAweDEzCiAgICBiPT0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQ3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MDIKICAgIC8vICkgYW5kIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID09IFVJbnQ2NCgwKToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAwLTYwMgogICAgLy8gaWYgZW50cnkuZXZlbnRfdHlwZSA9PSBhcmM0LlVJbnQ4KAogICAgLy8gICAgIGVudW1zLkVWVF9NRAogICAgLy8gKSBhbmQgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPT0gVUludDY0KDApOgogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQ3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MDMKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGVudW1zLlNUQVRVU19FTkRFRCkKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgMjAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjA0CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQ3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjA2LTYxMAogICAgLy8gc2VsZi5fZW1pdF9leGVjdXRpb25fZXZlbnQoCiAgICAvLyAgICAgZW50cnk9ZW50cnksCiAgICAvLyAgICAgcGF5b2ZmPWludGVyZXN0X2Ftb3VudCArIHByaW5jaXBhbF9hbW91bnQsCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9aW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudCwKICAgIC8vICkKICAgIGRpZyAxNQogICAgZGlnIDQKICAgIGR1cAogICAgY2FsbHN1YiBfZW1pdF9leGVjdXRpb25fZXZlbnQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojc5CiAgICAvLyBmdW5kZWRfaW50ZXJlc3QgKz0gaW50ZXJlc3RfYW1vdW50CiAgICBkaWcgMTMKICAgIGRpZyAxMgogICAgKwogICAgYnVyeSAxNAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjgwCiAgICAvLyBmdW5kZWRfcHJpbmNpcGFsICs9IHByaW5jaXBhbF9hbW91bnQKICAgIGRpZyAxMgogICAgZGlnIDcKICAgICsKICAgIGJ1cnkgMTMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4MQogICAgLy8gcHJvY2Vzc2VkX2V2ZW50cyArPSBVSW50NjQoMSkKICAgIGRpZyA0CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSA1CiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c193aGlsZV90b3BANAoKZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUA0MDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5MQogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ID0gVUludDY0KDApCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQxCgpmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUAyOToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1NwogICAgLy8gZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGRpZyAxNQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSAxNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTU4LTU2MAogICAgLy8gIyBEeW5hbWljIGFubnVpdGllcyBkZXJpdmUgbmV4dCBzdGF0ZSBmcm9tIHRoZSBwYXltZW50IGRlY29tcG9zaXRpb24sCiAgICAvLyAjIG5vdCBvbmx5IGZyb20gdGhlIHByZWNvbXB1dGVkIGBuZXh0XypgIGZpZWxkcy4KICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QUik6CiAgICBwdXNoaW50IDMKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDMxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjIKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIC0gcHJpbmNpcGFsX2Ftb3VudF9kdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgZGlnIDYKICAgIC0KICAgIGR1cAogICAgYnVyeSA5CiAgICBidXJ5IDkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzgKCmZ1bmRfZHVlX2Nhc2hmbG93c19lbHNlX2JvZHlAMzE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjUKICAgIC8vIGVsaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX0lQKToKICAgIGRpZyAxNAogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDMzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjYKICAgIC8vIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgYnVyeSA5CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjcKICAgIC8vIG5leHRfaW50ZXJlc3RfYmFzZSA9IHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgYnVyeSAxMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSBleGlzdHMKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzgKCmZ1bmRfZHVlX2Nhc2hmbG93c19lbHNlX2JvZHlAMzM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjgKICAgIC8vIGVsaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKToKICAgIGRpZyAxNAogICAgcHVzaGludCAxOQogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUAzNAogICAgZGlnIDcKICAgIGJ1cnkgOQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlAMzQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjkKICAgIC8vIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzAKICAgIC8vIG5leHRfaW50ZXJlc3RfYmFzZSA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgOQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MjkKICAgIC8vIGlmIHNlbGYuX2lzX2R5bmFtaWNfYW5udWl0eSgpOgogICAgY2FsbHN1YiBfaXNfZHluYW1pY19hbm51aXR5CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyNwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDMwCiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfTUQpOgogICAgZGlnIDE0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzMQogICAgLy8gcmV0dXJuIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTUyCiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzMgogICAgLy8gaW50ZXJlc3RfZHVlID0gc2VsZi5hY2NydWVkX2ludGVyZXN0ICsgc2VsZi5fZW50cnlfaW50ZXJlc3Rfc2VnbWVudChlbnRyeSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBkaWcgMTYKICAgIGNhbGxzdWIgX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQKICAgIGJ1cnkgMTgKICAgICsKICAgIGR1cAogICAgYnVyeSAxMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDMzCiAgICAvLyBpZiBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPD0gaW50ZXJlc3RfZHVlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gZXhpc3RzCiAgICA+PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzNAogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTUyCiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyNDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzNQogICAgLy8gcHJpbmNpcGFsX2Ftb3VudCA9IHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiAtIGludGVyZXN0X2R1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gZXhpc3RzCiAgICBkaWcgMTAKICAgIC0KICAgIGR1cAogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzYKICAgIC8vIGlmIHByaW5jaXBhbF9hbW91bnQgPiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgPgogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzNwogICAgLy8gcmV0dXJuIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTUyCiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyNjoKICAgIGRpZyA2CiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NDAKICAgIC8vIGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsIDw9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBkaWcgMTUKICAgIHB1c2hpbnQgNDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGR1cDIKICAgIDw9CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzktNDQxCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsIDw9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ0MgogICAgLy8gcmV0dXJuIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIC0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIHN3YXAKICAgIC0KICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTUyCiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQxNQogICAgLy8gcmV0dXJuIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCArIHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZGlnIDE2CiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBidXJ5IDE4CiAgICArCiAgICBidXJ5IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTEKICAgIC8vIGludGVyZXN0X2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9pbnRlcmVzdF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9pbnRlcmVzdF9hbW91bnRAMTYKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl93aGlsZUAxMToKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4MwogICAgLy8gYXNzZXJ0IHByb2Nlc3NlZF9ldmVudHMgPiBVSW50NjQoMCksIGVyci5OT19EVUVfQ0FTSEZMT1cKICAgIGRpZyA0CiAgICBkdXAKICAgIGFzc2VydCAvLyBObyBkdWUgY2FzaGZsb3cgdG8gcGF5CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODcKICAgIC8vIHRvdGFsX2Z1bmRlZD1mdW5kZWRfaW50ZXJlc3QgKyBmdW5kZWRfcHJpbmNpcGFsLAogICAgZGlnIDE0CiAgICBkdXAKICAgIGRpZyAxNQogICAgZHVwCiAgICBjb3ZlciAzCiAgICArCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODkKICAgIC8vIHRpbWVzdGFtcD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4NC05MAogICAgLy8gcmV0dXJuIHR5cC5DYXNoRnVuZGluZ1Jlc3VsdCgKICAgIC8vICAgICBmdW5kZWRfaW50ZXJlc3Q9ZnVuZGVkX2ludGVyZXN0LAogICAgLy8gICAgIGZ1bmRlZF9wcmluY2lwYWw9ZnVuZGVkX3ByaW5jaXBhbCwKICAgIC8vICAgICB0b3RhbF9mdW5kZWQ9ZnVuZGVkX2ludGVyZXN0ICsgZnVuZGVkX3ByaW5jaXBhbCwKICAgIC8vICAgICBwcm9jZXNzZWRfZXZlbnRzPXByb2Nlc3NlZF9ldmVudHMsCiAgICAvLyAgICAgdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUA1MzoKICAgIGludGNfMCAvLyAwCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDU0CgoKLy8gbW9kdWxlcy5wYXltZW50X2FnZW50LlBheW1lbnRBZ2VudC5jbGFpbV9kdWVfY2FzaGZsb3dzW3JvdXRpbmddKCkgLT4gdm9pZDoKY2xhaW1fZHVlX2Nhc2hmbG93czoKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6OTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNQogICAgLy8gaWYgc2VsZi5vcF9kYWVtb24udmFsdWUgIT0gR2xvYmFsLnplcm9fYWRkcmVzczoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNiAvLyAweDUyMjM0ZjcwNDQ2MTY1NmQ2ZjZlMjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcF9kYWVtb24gZXhpc3RzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBieiBjbGFpbV9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTcKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNwogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI2IC8vIDB4NTIyMzRmNzA0NDYxNjU2ZDZmNmUyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wX2RhZW1vbiBleGlzdHMKICAgID09CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTctMTkKICAgIC8vIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICAvLyBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgYm56IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDE0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTgKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNy0xOQogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICBibnogY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX3RydWVAMTQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxOQogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIHR4biBTZW5kZXIKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDMyCiAgICA9PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE3LTE5CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAxNQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX3RydWVAMTQ6CiAgICBpbnRjXzEgLy8gMQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDE2OgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE2LTIwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vICAgICBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gICAgIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICAvLyApLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNzoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMDMKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA0CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMDcKICAgIC8vIHNlbGYuX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQoaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDIKICAgIGR1cAogICAgY2FsbHN1YiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjEwOAogICAgLy8gc2VsZi5fc2V0dGxlX3Bvc2l0aW9uKGhvbGRpbmdfYWRkcmVzcykKICAgIGNhbGxzdWIgX3NldHRsZV9wb3NpdGlvbgogICAgcG9wbiAyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTE3CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jbGFpbWFibGVfaW50ZXJlc3QKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGR1cAogICAgcHVzaGludCA3MwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTE4CiAgICAvLyArIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNsYWltYWJsZV9wcmluY2lwYWwKICAgIGR1cAogICAgcHVzaGludCA4MQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTE3LTExOAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY2xhaW1hYmxlX2ludGVyZXN0CiAgICAvLyArIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNsYWltYWJsZV9wcmluY2lwYWwKICAgIHVuY292ZXIgMgogICAgKwogICAgZHVwCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMTAKICAgIC8vIGFzc2VydCB0b3RhbF9hbW91bnQgPiBVSW50NjQoMCksIGVyci5OT19EVUVfQ0FTSEZMT1cKICAgIGFzc2VydCAvLyBObyBkdWUgY2FzaGZsb3cgdG8gcGF5CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MjUKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5pc19vcHRlZF9pbigKICAgIGV4dHJhY3QgMCAzMgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI2CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI1LTI3CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MuaXNfb3B0ZWRfaW4oCiAgICAvLyAgICAgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkCiAgICAvLyApCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI1LTI4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MuaXNfb3B0ZWRfaW4oCiAgICAvLyAgICAgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkCiAgICAvLyApCiAgICAvLyBhbmQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZAogICAgYnogY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX2ZhbHNlQDI0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MjgKICAgIC8vIGFuZCBub3Qgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDM4NAogICAgZ2V0Yml0CiAgICBibnogY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX2ZhbHNlQDI0CiAgICBpbnRjXzEgLy8gMQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDI1OgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjExNQogICAgLy8gaWYgc2VsZi5faXNfcGF5bWVudF9leGVjdXRhYmxlKGhvbGRpbmdfYWRkcmVzcyk6CiAgICBieiBjbGFpbV9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjM0CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgc3dhcAogICAgZGlnIDEKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYXNzZXJ0IC8vIGFjY291bnQgb3B0ZWQgaW50byBhc3NldAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjM0LTM1CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgLy8gPj0gcGF5bWVudF9hbW91bnQKICAgIGRpZyA1CiAgICBkdXAKICAgIGNvdmVyIDIKICAgID49CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MzMtMzYKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIC8vICAgICA+PSBwYXltZW50X2Ftb3VudAogICAgLy8gKSwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjExNwogICAgLy8gc2VsZi5fcGF5KHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcywgdG90YWxfYW1vdW50KQogICAgZGlnIDIKICAgIGR1cAogICAgY292ZXIgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGR1cAogICAgZXh0cmFjdCAwIDMyCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NDAtNDUKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1yZWNlaXZlciwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9YW1vdW50LAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NDQKICAgIC8vIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICB1bmNvdmVyIDMKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgdW5jb3ZlciAyCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQwCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NDAtNDUKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1yZWNlaXZlciwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9YW1vdW50LAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEyNS0xMjYKICAgIC8vICMgR2V0IHRoZSBjbGFpbWFibGUgYW1vdW50cyBiZWZvcmUgcmVzZXQKICAgIC8vIGludGVyZXN0X2Ftb3VudCA9IHBvc2l0aW9uLmNsYWltYWJsZV9pbnRlcmVzdAogICAgZHVwCiAgICBwdXNoaW50IDczCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBidXJ5IDkKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMjcKICAgIC8vIHByaW5jaXBhbF9hbW91bnQgPSBwb3NpdGlvbi5jbGFpbWFibGVfcHJpbmNpcGFsCiAgICBkdXAKICAgIHB1c2hpbnQgODEKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGJ1cnkgOQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEyOS0xMzAKICAgIC8vICMgUmVzZXQgdGhlIHBvc2l0aW9uJ3MgY2xhaW1hYmxlIGFtb3VudHMKICAgIC8vIHBvc2l0aW9uLmNsYWltYWJsZV9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICByZXBsYWNlMiA3MwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzMQogICAgLy8gcG9zaXRpb24uY2xhaW1hYmxlX3ByaW5jaXBhbCA9IFVJbnQ2NCgwKQogICAgc3dhcAogICAgcmVwbGFjZTIgODEKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzIKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gcG9zaXRpb24uY29weSgpCiAgICB1bmNvdmVyIDMKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzQKICAgIC8vIGFzc2VydCBzZWxmLnJlc2VydmVkX2ludGVyZXN0ID49IGludGVyZXN0X2Ftb3VudCwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBkdXAKICAgIGRpZyAyCiAgICA+PQogICAgYXNzZXJ0IC8vIE5vdCBlbm91Z2ggZnVuZHMgZm9yIHRoZSBwYXltZW50CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTM1CiAgICAvLyBhc3NlcnQgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgPj0gcHJpbmNpcGFsX2Ftb3VudCwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIGRpZyAzCiAgICA+PQogICAgYXNzZXJ0IC8vIE5vdCBlbm91Z2ggZnVuZHMgZm9yIHRoZSBwYXltZW50CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTM3LTEzOAogICAgLy8gIyBVcGRhdGUgdGhlIGdsb2JhbCByZXNlcnZlZCBpbnRlcmVzdCBhbmQgcHJpbmNpcGFsIGFtb3VudHMKICAgIC8vIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgLT0gaW50ZXJlc3RfYW1vdW50CiAgICBzd2FwCiAgICAtCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzOQogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgLT0gcHJpbmNpcGFsX2Ftb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIGV4aXN0cwogICAgc3dhcAogICAgLQogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpjbGFpbV9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMjMKICAgIC8vIHRvdGFsX2Ftb3VudD1pbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50LAogICAgZGlnIDUKICAgIGR1cAogICAgZGlnIDYKICAgIGR1cAogICAgY292ZXIgMwogICAgKwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjEyNAogICAgLy8gdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjEyMC0xMjYKICAgIC8vIHJldHVybiB0eXAuQ2FzaENsYWltUmVzdWx0KAogICAgLy8gICAgIGludGVyZXN0X2Ftb3VudD1pbnRlcmVzdF9hbW91bnQsCiAgICAvLyAgICAgcHJpbmNpcGFsX2Ftb3VudD1wcmluY2lwYWxfYW1vdW50LAogICAgLy8gICAgIHRvdGFsX2Ftb3VudD1pbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50LAogICAgLy8gICAgIHRpbWVzdGFtcD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICBjb250ZXh0PXBheW1lbnRfaW5mbywKICAgIC8vICkKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyAyCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgcHVzaGJ5dGVzIDB4MDAyMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VAMjQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfbWVyZ2VAMjUKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAxNToKICAgIGludGNfMCAvLyAwCiAgICBiIGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUAxNgoKCi8vIG1vZHVsZXMudHJhbnNmZXJfYWdlbnQuVHJhbnNmZXJBZ2VudC50cmFuc2Zlcl9zZXRfc2NoZWR1bGVbcm91dGluZ10oKSAtPiB2b2lkOgp0cmFuc2Zlcl9zZXRfc2NoZWR1bGU6CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MjYKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToyNwogICAgLy8gYXNzZXJ0IG9wZW5fZGF0ZSA8IGNsb3N1cmVfZGF0ZSwgZXJyLklOVkFMSURfU09SVElORwogICAgZHVwMgogICAgPAogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIG11c3QgYmUgc29ydGVkIGluIHN0cmljdGx5IGFzY2VuZGluZyBvcmRlcgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToyOQogICAgLy8gc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgPSBvcGVuX2RhdGUKICAgIGJ5dGVjIDI4IC8vICJ0cmFuc2Zlcl9vcGVuaW5nX2RhdGUiCiAgICB1bmNvdmVyIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjMwCiAgICAvLyBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSA9IGNsb3N1cmVfZGF0ZQogICAgYnl0ZWMgMjkgLy8gInRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjMxCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMudHJhbnNmZXJfYWdlbnQuVHJhbnNmZXJBZ2VudC5wcmltYXJ5X2Rpc3RyaWJ1dGlvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnByaW1hcnlfZGlzdHJpYnV0aW9uOgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTozMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo3MQogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYucHJpbWFyeV9kZWFsZXIsIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyMiAvLyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQzCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo0NAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQ1CiAgICAvLyBhc3NlcnQgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TRUQKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBjbG9zZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDcKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQoaG9sZGluZ19hZGRyZXNzKQogICAgc3dhcAogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo0OAogICAgLy8gYXNzZXJ0IHVuaXRzID4gVUludDY0KDApLCBlcnIuWkVST19VTklUUwogICAgZHVwCiAgICBhc3NlcnQgLy8gQ2FuIG5vdCBkaXN0cmlidXRlIHplcm8gdW5pdHMKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NTAKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgKyB1bml0cyA8PSBzZWxmLnRvdGFsX3VuaXRzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIGV4aXN0cwogICAgKwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIDw9CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQ5LTUxCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgKyB1bml0cyA8PSBzZWxmLnRvdGFsX3VuaXRzCiAgICAvLyApLCBlcnIuT1ZFUl9ESVNUUklCVVRJT04KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgcmVtYWluaW5nIEQtQVNBIHVuaXRzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjUyCiAgICAvLyBpZiBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNyAvLyAiaW5pdGlhbF9leGNoYW5nZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSBleGlzdHMKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo1NAogICAgLy8gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPD0gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGUKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNyAvLyAiaW5pdGlhbF9leGNoYW5nZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSBleGlzdHMKICAgIDw9CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjUzLTU1CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDw9IHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlCiAgICAvLyApLCBlcnIuUFJJTUFSWV9ESVNUUklCVVRJT05fQ0xPU0VECiAgICBhc3NlcnQgLy8gUHJpbWFyeSBkaXN0cmlidXRpb24gaXMgY2xvc2VkCgpwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTQ4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5yZXNlcnZlZF91bml0cyArPSB1bml0cwogICAgZHVwbiAyCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCA0MAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAzCiAgICBkdXAKICAgIGNvdmVyIDMKICAgICsKICAgIGl0b2IKICAgIHB1c2hpbnQgNDAKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjU4CiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsICs9IHVuaXRzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIGV4aXN0cwogICAgKwogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjU5CiAgICAvLyByZXR1cm4gc2VsZi50b3RhbF91bml0cyAtIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICBzd2FwCiAgICAtCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnRyYW5zZmVyX2FnZW50LlRyYW5zZmVyQWdlbnQudHJhbnNmZXJbcm91dGluZ10oKSAtPiB2b2lkOgp0cmFuc2ZlcjoKICAgIGludGNfMCAvLyAwCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cG4gMgogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojc1CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo3NgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDcKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjEzCiAgICAvLyBpZiBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyOCAvLyAidHJhbnNmZXJfb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIGJ6IHRyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNQogICAgLy8gc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyOCAvLyAidHJhbnNmZXJfb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIDw9CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE0LTE2CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyApLCBlcnIuQ0xPU0VEX1RSQU5TRkVSCiAgICBhc3NlcnQgLy8gVHJhbnNmZXIgaXMgY2xvc2VkCgp0cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE3CiAgICAvLyBpZiBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyOSAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIGJ6IHRyYW5zZmVyX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxOQogICAgLy8gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI5IC8vICJ0cmFuc2Zlcl9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgPAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxOC0yMAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8IHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlCiAgICAvLyApLCBlcnIuQ0xPU0VEX1RSQU5TRkVSCiAgICBhc3NlcnQgLy8gVHJhbnNmZXIgaXMgY2xvc2VkCgp0cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjgwCiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBzZW5kZXJfaG9sZGluZ19hZGRyZXNzLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICBkaWcgNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQyMwogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDgKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBkaWcgNQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA5CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjgzCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBkaWcgMgogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4NAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBkdXAKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODUKICAgIC8vIGFzc2VydCBzZW5kZXJfaG9sZGluZ19hZGRyZXNzICE9IHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcywgZXJyLlNFTEZfVFJBTlNGRVIKICAgIHVuY292ZXIgMgogICAgIT0KICAgIGFzc2VydCAvLyBTZW5kZXIgYW5kIHJlY2VpdmVyIG11c3QgYmUgZGlmZmVyZW50CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojg2CiAgICAvLyBhc3NlcnQgdW5pdHMgPiBVSW50NjQoMCksIGVyci5OVUxMX1RSQU5TRkVSCiAgICBkaWcgMQogICAgZHVwCiAgICBhc3NlcnQgLy8gVHJhbnNmZXIgdW5pdHMgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4NwogICAgLy8gYXNzZXJ0IHVuaXRzIDw9IHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cywgZXJyLk9WRVJfVFJBTlNGRVIKICAgIHN3YXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICA8PQogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCBzZW5kZXIgdW5pdHMgdG8gdHJhbnNmZXIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc2NQogICAgLy8gaWYgc2VsZi5ldmVudF9jdXJzb3IgPj0gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgPj0KICAgIGJueiB0cmFuc2Zlcl9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9hc3NlcnRfbm9fZHVlX2V2ZW50X3BlbmRpbmdAMTAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc2NwogICAgLy8gbmV4dF9lbnRyeSA9IHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLmV2ZW50X2N1cnNvcikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NjkKICAgIC8vIG5leHRfZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzY4LTc3MAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBuZXh0X2VudHJ5LnNjaGVkdWxlZF90aW1lID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICksIGVyci5QRU5ESU5HX0FDVFVTX0VWRU5UCiAgICBhc3NlcnQgLy8gQUNUVVMgZXZlbnQgbm90IHlldCBleGVjdXRlZAoKdHJhbnNmZXJfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYXNzZXJ0X25vX2R1ZV9ldmVudF9wZW5kaW5nQDEwOgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo5MAogICAgLy8gc2VsZi5fZW5zdXJlX3VuaXRzX2FjdGl2YXRlZChzZW5kZXJfaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDMKICAgIGR1cAogICAgY2FsbHN1YiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo5MQogICAgLy8gc2VsZi5fZW5zdXJlX3VuaXRzX2FjdGl2YXRlZChyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBkaWcgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjYWxsc3ViIF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjkyCiAgICAvLyBzZWxmLl9zZXR0bGVfcG9zaXRpb24oc2VuZGVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGNhbGxzdWIgX3NldHRsZV9wb3NpdGlvbgogICAgcG9wbiAyCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjkzCiAgICAvLyBzZWxmLl9zZXR0bGVfcG9zaXRpb24ocmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzKQogICAgY2FsbHN1YiBfc2V0dGxlX3Bvc2l0aW9uCiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNTIKICAgIC8vIGFzc2VydCB1bml0cyA8PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cywgZXJyLk9WRVJfVFJBTlNGRVIKICAgIGRpZyA1CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkaWcgMQogICAgPD0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgc2VuZGVyIHVuaXRzIHRvIHRyYW5zZmVyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTUzCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyAtPSB1bml0cwogICAgZGlnIDEKICAgIC0KICAgIGl0b2IKICAgIHVuY292ZXIgMgogICAgaW50Y18zIC8vIDMyCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTQ0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyArPSB1bml0cwogICAgZGlnIDUKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIHVuY292ZXIgMgogICAgKwogICAgaXRvYgogICAgaW50Y18zIC8vIDMyCiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo2MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfc3VzcGVuc2lvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfc3VzcGVuc2lvbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojc3CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyMSAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxODUKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZCA9IHN1c3BlbmRlZAogICAgZHVwCiAgICBwdXNoaW50IDQ4CiAgICBpbnRjXzEgLy8gMQogICAgYm94X2V4dHJhY3QKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgcHVzaGludCA0OAogICAgc3dhcAogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxODYKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE2NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF9vcGVuW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF9vcGVuOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjY4CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hY2NvdW50X21hbmFnZXIsIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyMyAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzOQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfRU5ERUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgMjAwCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxMAogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfZW5kZWQoKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgIQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjExCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxMgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTMKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozNAogICAgLy8gdW5pdHM9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozMi00MgogICAgLy8gcmV0dXJuIHR5cC5BY2NvdW50UG9zaXRpb24oCiAgICAvLyAgICAgcGF5bWVudF9hZGRyZXNzPXBheW1lbnRfYWRkcmVzcywKICAgIC8vICAgICB1bml0cz1VSW50NjQoMCksCiAgICAvLyAgICAgcmVzZXJ2ZWRfdW5pdHM9VUludDY0KDApLAogICAgLy8gICAgIHN1c3BlbmRlZD1GYWxzZSwKICAgIC8vICAgICBzZXR0bGVkX2N1cnNvcj1VSW50NjQoMCksCiAgICAvLyAgICAgaW50ZXJlc3RfY2hlY2twb2ludD1VSW50NjQoMCksCiAgICAvLyAgICAgcHJpbmNpcGFsX2NoZWNrcG9pbnQ9VUludDY0KDApLAogICAgLy8gICAgIGNsYWltYWJsZV9pbnRlcmVzdD1VSW50NjQoMCksCiAgICAvLyAgICAgY2xhaW1hYmxlX3ByaW5jaXBhbD1VSW50NjQoMCksCiAgICAvLyApCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGJ5dGVjIDQwIC8vIDB4MDAKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjE0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHNlbGYuX25ld19hY2NvdW50X3Bvc2l0aW9uKHBheW1lbnRfYWRkcmVzcykKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTUKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIzOAogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICB1bmNvdmVyIDMKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMzkKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQwCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0MQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzID0gcGF5bWVudF9hZGRyZXNzCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0MgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5hY2NvdW50X2dldF9wb3NpdGlvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfZ2V0X3Bvc2l0aW9uOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI1OQogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmNvbnRyYWN0X2NyZWF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X2NyZWF0ZToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDI4CiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gYXJyYW5nZXIKICAgIGJ5dGVjIDE4IC8vIDB4NTIyMzQxNzI3MjYxNmU2NzY1NzIyMwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMjkKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfY29uZmlnW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfY29uZmlnOgogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBsZW4KICAgIHB1c2hpbnQgMTA3CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLk5vcm1hbGl6ZWRBY3R1c1Rlcm1zCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgcHVzaGludCA3MgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5Jbml0aWFsS2VybmVsU3RhdGUKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBsZW4KICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIHR1cGxlIGVuY29kaW5nCiAgICBkdXAKICAgIHB1c2hpbnQgMzQKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCB0YWlsIHBvaW50ZXIgYXQgaW5kZXggMSBvZiAodWludDhbMzJdLChsZW4rdXRmOFtdKSkKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgY292ZXIgMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMzYKICAgICsKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuUHJvc3BlY3R1cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2MAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDYyLTEwNjMKICAgIC8vICMgQ29uZmlndXJlIENvbnRyYWN0CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPSB0ZXJtcy5jb250cmFjdF90eXBlLmFzX3VpbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgYnogY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUA3CiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIyMAogICAgLy8gVUludDY0KGVudW1zLkNUX0FOTiksCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIxCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfTkFNKSwKICAgIHB1c2hpbnQgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIyCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfTEFNKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIzCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfTEFYKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjI0CiAgICAvLyBVSW50NjQoZW51bXMuQ1RfQ0xNKSwKICAgIHB1c2hpbnQgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJ6IGNvbnRyYWN0X2NvbmZpZ19ib29sX2ZhbHNlQDgKCmNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANzoKICAgIGludGNfMSAvLyAxCgpjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUA5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjI5CiAgICAvLyBhc3NlcnQgc2VsZi5faXNfc3VwcG9ydGVkX2NvbnRyYWN0X3R5cGUoY29udHJhY3RfdHlwZSksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2NQogICAgLy8gc2VsZi5fc3RvcmVfY29udHJhY3RfY29uZmlnKHNlbGYuY29udHJhY3RfdHlwZSwgdGVybXMsIGluaXRpYWxfc3RhdGUpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgYnVyeSAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzI1CiAgICAvLyBhc3NlcnQgdGVybXMuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZGlnIDQKICAgIGR1cAogICAgcHVzaGludCAzMwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSA4CiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMjcKICAgIC8vIHRlcm1zLmRheV9jb3VudF9jb252ZW50aW9uLmFzX3VpbnQ2NCgpCiAgICBwdXNoaW50IDU3CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICBieiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDE2CiAgICBkaWcgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk5CiAgICAvLyBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI5Ny0zMDMKICAgIC8vIHJldHVybiBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzYwKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwSVNEQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjApLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDE2CiAgICBkaWcgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzAwCiAgICAvLyBVSW50NjQoZW51bXMuRENDX0EzNjUpLAogICAgcHVzaGludCAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyOTctMzAzCiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgID09CiAgICBibnogY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUAxNgogICAgZGlnIDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMwMQogICAgLy8gVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGRpZyA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDIKICAgIC8vIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICA9PQogICAgYnogY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAMTcKCmNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTY6CiAgICBpbnRjXzEgLy8gMQoKY29udHJhY3RfY29uZmlnX2Jvb2xfbWVyZ2VAMTg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDktMzExCiAgICAvLyBhc3NlcnQgc2VsZi5faXNfc3VwcG9ydGVkX2RheV9jb3VudF9jb252ZW50aW9uKAogICAgLy8gICAgIGRheV9jb3VudF9jb252ZW50aW9uCiAgICAvLyApLCBlcnIuSU5WQUxJRF9EQVlfQ09VTlRfQ09OVkVOVElPTgogICAgYXNzZXJ0IC8vIEludmFsaWQgZGF5LWNvdW50IGNvbnZlbnRpb24gSUQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMyOQogICAgLy8gaWYgY29udHJhY3RfdHlwZSAhPSBVSW50NjQoZW51bXMuQ1RfQU5OKToKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgICE9CiAgICBieiBjb250cmFjdF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzMwCiAgICAvLyBhc3NlcnQgbm90IHRlcm1zLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24sIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZGlnIDQKICAgIHB1c2hpbnQgNzg2CiAgICBnZXRiaXQKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KCmNvbnRyYWN0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDIwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODA5CiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIEQtQVNBIGFscmVhZHkgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODEwCiAgICAvLyBhc3NlcnQgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCA9PSBVSW50NjQoMCksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMCAvLyAiaW5pdGlhbF9leGNoYW5nZV9hbW91bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTItODEzCiAgICAvLyAjIFNldCBEZW5vbWluYXRpb24gQXNzZXQKICAgIC8vIHNlbGYuX2Fzc2VydF9kZW5vbWluYXRpb25fYXNzZXQodGVybXMuZGVub21pbmF0aW9uX2Fzc2V0X2lkKQogICAgZGlnIDQKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NzctNzc4CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIGRlbm9taW5hdGlvbiB3aXRoIEFTQQogICAgLy8gX2NyZWF0b3IsIGV4aXN0cyA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X2NyZWF0b3IoZGVub21pbmF0aW9uX2Fzc2V0X2lkKQogICAgZHVwCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q3JlYXRvcgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NzkKICAgIC8vIGFzc2VydCBleGlzdHMsIGVyci5JTlZBTElEX0RFTk9NSU5BVElPTgogICAgYXNzZXJ0IC8vIERlbm9taW5hdGlvbiBhc3NldCBpcyBub3QgcHJvcGVybHkgc2V0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODIKICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICBieXRlYyA0NCAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTYtODE3CiAgICAvLyAjIFNldCBTZXR0bGVtZW50IEFzc2V0CiAgICAvLyBzZWxmLl9hc3NlcnRfc2V0dGxlbWVudF9hc3NldCh0ZXJtcy5zZXR0bGVtZW50X2Fzc2V0X2lkKQogICAgZGlnIDEKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc4NwogICAgLy8gc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODUtNzg4CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc2V0dGxlbWVudCBhc3NldCBpcyB0aGUgZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQgPT0gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIC8vICksIGVyci5JTlZBTElEX1NFVFRMRU1FTlRfQVNTRVQKICAgIGFzc2VydCAvLyBEaWZmZXJlbnQgc2V0dGxlbWVudCBhc3NldCBub3Qgc3VwcG9ydGVkLCBtdXN0IGJlIGVxdWFsIHRvIGRlbm9taW5hdGlvbiBhc3NldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkxCiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBzZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkyLTc5OAogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhc3NldF9hbW91bnQ9MCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Nzk3CiAgICAvLyBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Nzk1CiAgICAvLyBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc5NgogICAgLy8gYXNzZXRfYW1vdW50PTAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkyLTc5MwogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3OTItNzk4CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODIwLTgyMQogICAgLy8gIyBVbml0cwogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IHRlcm1zLnRvdGFsX3VuaXRzCiAgICBkdXAKICAgIHB1c2hpbnQgMTcKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODIyCiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID0gVUludDY0KDApCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgyNC04MjUKICAgIC8vICMgRGF5LUNvdW50IENvbnZlbnRpb25zCiAgICAvLyBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uID0gdGVybXMuZGF5X2NvdW50X2NvbnZlbnRpb24uYXNfdWludDY0KCkKICAgIGJ5dGVjIDQ2IC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGRpZyA4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODI3LTgyOAogICAgLy8gIyBUaW1lCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA9IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZQogICAgZHVwCiAgICBwdXNoaW50IDQxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMjcgLy8gImluaXRpYWxfZXhjaGFuZ2VfZGF0ZSIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODI5CiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSB0ZXJtcy5tYXR1cml0eV9kYXRlCiAgICBkaWcgMQogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDQ1IC8vICJtYXR1cml0eV9kYXRlIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MzAKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IGluaXRpYWxfc3RhdGUubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZGlnIDYKICAgIGR1cAogICAgY292ZXIgMgogICAgcHVzaGludCA0OAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzMi04MzMKICAgIC8vICMgUHJpbmNpcGFsCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID0gdGVybXMuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGRpZyAxMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzNAogICAgLy8gc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gdGVybXMuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZGlnIDMKICAgIHB1c2hpbnQgNzg2CiAgICBnZXRiaXQKICAgIGJ5dGVjIDM0IC8vICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzNQogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBpbml0aWFsX3N0YXRlLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZGlnIDEKICAgIHB1c2hpbnQgMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODM3LTgzOAogICAgLy8gIyBJbnRlcmVzdAogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ID0gaW5pdGlhbF9zdGF0ZS5hY2NydWVkX2ludGVyZXN0CiAgICBkaWcgMQogICAgcHVzaGludCA0MAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQwLTg0MQogICAgLy8gIyBJbnRlcmVzdCBSYXRlCiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IGluaXRpYWxfc3RhdGUubm9taW5hbF9pbnRlcmVzdF9yYXRlCiAgICBkaWcgMQogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0MgogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gaW5pdGlhbF9zdGF0ZS5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlCiAgICBkaWcgMQogICAgcHVzaGludCAyNAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQzCiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkID0gdGVybXMucmF0ZV9yZXNldF9zcHJlYWQKICAgIGRpZyAzCiAgICBwdXNoaW50IDU4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzUgLy8gInJhdGVfcmVzZXRfc3ByZWFkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0NAogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIgPSB0ZXJtcy5yYXRlX3Jlc2V0X211bHRpcGxpZXIKICAgIGRpZyAzCiAgICBwdXNoaW50IDY2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzYgLy8gInJhdGVfcmVzZXRfbXVsdGlwbGllciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDUKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9mbG9vciA9IHRlcm1zLnJhdGVfcmVzZXRfZmxvb3IKICAgIGRpZyAzCiAgICBwdXNoaW50IDc0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzAgLy8gInJhdGVfcmVzZXRfZmxvb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQ2CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfY2FwID0gdGVybXMucmF0ZV9yZXNldF9jYXAKICAgIGRpZyAzCiAgICBwdXNoaW50IDgyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzEgLy8gInJhdGVfcmVzZXRfY2FwIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0NwogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X25leHQgPSB0ZXJtcy5yYXRlX3Jlc2V0X25leHQKICAgIGRpZyAzCiAgICBwdXNoaW50IDkwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzcgLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDgKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgPSB0ZXJtcy5oYXNfcmF0ZV9yZXNldF9mbG9vcgogICAgZGlnIDMKICAgIHB1c2hpbnQgNzg0CiAgICBnZXRiaXQKICAgIGJ5dGVjIDM4IC8vICJoYXNfcmF0ZV9yZXNldF9mbG9vciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDkKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwID0gdGVybXMuaGFzX3JhdGVfcmVzZXRfY2FwCiAgICBkaWcgMwogICAgcHVzaGludCA3ODUKICAgIGdldGJpdAogICAgYnl0ZWMgMzkgLy8gImhhc19yYXRlX3Jlc2V0X2NhcCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NTEtODUyCiAgICAvLyAjIFNjYWxpbmcKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgPSB0ZXJtcy5maXhlZF9wb2ludF9zY2FsZQogICAgdW5jb3ZlciAzCiAgICBwdXNoaW50IDk5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU0LTg1NQogICAgLy8gIyBTY2hlZHVsZSBQcm9jZXNzaW5nCiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciA9IGluaXRpYWxfc3RhdGUuZXZlbnRfY3Vyc29yCiAgICBkaWcgMQogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU3LTg1OAogICAgLy8gIyBQZXItVW5pdCBGaXhlZC1Qb2ludCBJbmRleGVzCiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggPSBpbml0aWFsX3N0YXRlLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgKICAgIGRpZyAxCiAgICBwdXNoaW50IDU2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU5CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4ID0gaW5pdGlhbF9zdGF0ZS5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleAogICAgZGlnIDEKICAgIHB1c2hpbnQgNjQKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODYxLTg2MgogICAgLy8gIyBSZXNlcnZlZCBBbW91bnQgKGZvciBleGVjdXRlZCBjYXNoZmxvd3MpCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0ID0gVUludDY0KDApCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2MwogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2NQogICAgLy8gYXNzZXJ0IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLCBlcnIuSU5WQUxJRF9JRUQKICAgIGRpZyAyCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICBhc3NlcnQgLy8gSUVEIG11c3QgYmUgc2V0IGluIHRoZSBmdXR1cmUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2NgogICAgLy8gYXNzZXJ0IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA+IGluaXRpYWxfc3RhdGUuc3RhdHVzX2RhdGUsIGVyci5JTlZBTElEX0lFRAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgPAogICAgYXNzZXJ0IC8vIElFRCBtdXN0IGJlIHNldCBpbiB0aGUgZnV0dXJlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NjcKICAgIC8vIGFzc2VydCB0ZXJtcy5pbml0aWFsX2V4Y2hhbmdlX2RhdGUgPCB0ZXJtcy5tYXR1cml0eV9kYXRlLCBlcnIuSU5WQUxJRF9JRUQKICAgIDwKICAgIGFzc2VydCAvLyBJRUQgbXVzdCBiZSBzZXQgaW4gdGhlIGZ1dHVyZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2Ny0xMDY4CiAgICAvLyAjIE5vdGFyaXplIHByb3NwZWN0dXMgKG9wdGlvbmFsKQogICAgLy8gc2VsZi5wcm9zcGVjdHVzX2hhc2ggPSBwcm9zcGVjdHVzLmhhc2guYnl0ZXMKICAgIGRpZyAyCiAgICBleHRyYWN0IDAgMzIKICAgIGJ5dGVjIDQyIC8vICJwcm9zcGVjdHVzX2hhc2giCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2OQogICAgLy8gc2VsZi5wcm9zcGVjdHVzX3VybCA9IHByb3NwZWN0dXMudXJsCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGVjIDQzIC8vICJwcm9zcGVjdHVzX3VybCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDcwCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAMTc6CiAgICBpbnRjXzAgLy8gMAogICAgYiBjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUAxOAoKY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAODoKICAgIGludGNfMCAvLyAwCiAgICBiIGNvbnRyYWN0X2NvbmZpZ19ib29sX21lcmdlQDkKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9zY2hlZHVsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X3NjaGVkdWxlOgogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDcyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHN3YXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBkdXAKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgMgogICAgKwogICAgdW5jb3ZlciAyCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLkV4ZWN1dGlvblNjaGVkdWxlRW50cnk+CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDg3CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwOTAKICAgIC8vIGNvbnRyYWN0X3R5cGU9c2VsZi5jb250cmFjdF90eXBlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGNvdmVyIDMKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4ODMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4ODQtODg2CiAgICAvLyBhc3NlcnQgc2NoZWR1bGVfcGFnZS5sZW5ndGggPD0gVUludDY0KAogICAgLy8gICAgIGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUKICAgIC8vICksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGR1cAogICAgcHVzaGludCAxNgogICAgPD0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg4NwogICAgLy8gYXNzZXJ0IHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPiBVSW50NjQoMCksIGVyci5URVJNU19OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSB0ZXJtcyBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODg5CiAgICAvLyBwYWdlX2N1cnNvciA9IHNjaGVkdWxlX3BhZ2VfaW5kZXggKiBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkKICAgIHN3YXAKICAgIHB1c2hpbnQgMTYKICAgICoKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg5NgogICAgLy8gKyBwYWdlX2xlbmd0aCAqIFVJbnQ2NChjc3QuT1BfVVBfQ09OVFJBQ1RfQ09ORklHX1BFUl9FTlRSWV9CVURHRVQpCiAgICBwdXNoaW50IDEwMAogICAgKgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODk1CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19CQVNFX0JVREdFVCkKICAgIGludGMgNCAvLyAxNTAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTUtODk2CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19CQVNFX0JVREdFVCkKICAgIC8vICsgcGFnZV9sZW5ndGggKiBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19QRVJfRU5UUllfQlVER0VUKQogICAgKwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODkxLTg5OAogICAgLy8gIyBWYWxpZGF0aW9uIGNvc3QgZ3Jvd3Mgd2l0aCBwYWdlIGxlbmd0aCwgc28gY29uZmlndXJhdGlvbiBleHBsaWNpdGx5CiAgICAvLyAjIGJ1eXMgZXh0cmEgb3Bjb2RlIGJ1ZGdldCBmb3IgbGFyZ2VyIHVwbG9hZHMuCiAgICAvLyBlbnN1cmVfYnVkZ2V0KAogICAgLy8gICAgIHJlcXVpcmVkX2J1ZGdldD0oCiAgICAvLyAgICAgICAgIFVJbnQ2NChjc3QuT1BfVVBfQ09OVFJBQ1RfQ09ORklHX0JBU0VfQlVER0VUKQogICAgLy8gICAgICAgICArIHBhZ2VfbGVuZ3RoICogVUludDY0KGNzdC5PUF9VUF9DT05UUkFDVF9DT05GSUdfUEVSX0VOVFJZX0JVREdFVCkKICAgIC8vICAgICApLAogICAgLy8gKQogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODk5CiAgICAvLyBpbmRleCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKCmNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEAyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTAwCiAgICAvLyB3aGlsZSBpbmRleCA8IHBhZ2VfbGVuZ3RoOgogICAgZHVwCiAgICBkaWcgNAogICAgPAogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfd2hpbGVAMTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkwMS05MDIKICAgIC8vIGVudHJ5ID0gc2NoZWR1bGVfcGFnZVtpbmRleF0uY29weSgpCiAgICAvLyBlbnRyeV9ldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZGlnIDQKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGJ1cnkgMTIKICAgIGRpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgNjUKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTAyCiAgICAvLyBlbnRyeV9ldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDEtOTAyCiAgICAvLyBlbnRyeSA9IHNjaGVkdWxlX3BhZ2VbaW5kZXhdLmNvcHkoKQogICAgLy8gZW50cnlfZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGludGNfMiAvLyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDIKICAgIC8vIGVudHJ5X2V2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBnZXRieXRlCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgMTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkwMwogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X2lkID09IHBhZ2VfY3Vyc29yICsgaW5kZXgsIGVyci5JTlZBTElEX0VWRU5UX0lECiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEzCiAgICBkaWcgNQogICAgdW5jb3ZlciA0CiAgICArCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDQtOTA2CiAgICAvLyBzZWxmLl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBlbnRyeV9ldmVudF90eXBlCiAgICAvLyApCiAgICBkaWcgNQogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTA3CiAgICAvLyBhc3NlcnQgZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgc3dhcAogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDgKICAgIC8vIGlmIGVudHJ5LmV2ZW50X2lkID4gVUludDY0KDApOgogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDkKICAgIC8vIGlmIGluZGV4ID4gVUludDY0KDApOgogICAgZHVwCiAgICBieiBjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlANgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTEwCiAgICAvLyBwcmV2aW91c19lbnRyeSA9IHNjaGVkdWxlX3BhZ2VbaW5kZXggLSBVSW50NjQoMSldLmNvcHkoKQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgcHVzaGludCA2NQogICAgKgogICAgZGlnIDExCiAgICBzd2FwCiAgICBwdXNoaW50IDY1CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkyNQogICAgLy8gcHJldmlvdXNfZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gZW50cnkuc2NoZWR1bGVkX3RpbWUKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyA4CiAgICA8PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTI0LTkyNgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBwcmV2aW91c19lbnRyeS5zY2hlZHVsZWRfdGltZSA8PSBlbnRyeS5zY2hlZHVsZWRfdGltZQogICAgLy8gKSwgZXJyLklOVkFMSURfU09SVElORwogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIG11c3QgYmUgc29ydGVkIGluIHN0cmljdGx5IGFzY2VuZGluZyBvcmRlcgoKY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUA4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTI3CiAgICAvLyBpZiBlbnRyeS5ldmVudF9pZCA9PSBVSW50NjQoMCk6CiAgICBkaWcgOAogICAgYm56IGNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkyOC05MzAKICAgIC8vIGFzc2VydCBlbnRyeV9ldmVudF90eXBlID09IFVJbnQ2NCgKICAgIC8vICAgICBlbnVtcy5FVlRfSUVECiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGRpZyA5CiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MzEKICAgIC8vIGluZGV4ICs9IFVJbnQ2NCgxKQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIGNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEAyCgpjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlANjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkxMi05MTQKICAgIC8vICMgVGhlIGZpcnN0IGVudHJ5IG9mIGEgcGFnZSBtdXN0IHN0aWxsIGJlIG9yZGVyZWQgYWZ0ZXIgdGhlCiAgICAvLyAjIGxhc3QgZW50cnkgb2YgdGhlIHByZXZpb3VzIHBhZ2UuCiAgICAvLyBhc3NlcnQgc2NoZWR1bGVfcGFnZV9pbmRleCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGRpZyA2CiAgICBkdXAKICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTUKICAgIC8vIHByZXZpb3VzX3BhZ2VfaW5kZXggPSBzY2hlZHVsZV9wYWdlX2luZGV4IC0gVUludDY0KDEpCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTE3CiAgICAvLyBwcmV2aW91c19wYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZQogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTYtOTE4CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHByZXZpb3VzX3BhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTktOTIwCiAgICAvLyBwcmV2aW91c19wYWdlID0gc2VsZi5zY2hlZHVsZV9wYWdlW3ByZXZpb3VzX3BhZ2VfaW5kZXhdLmNvcHkoKQogICAgLy8gYXNzZXJ0IHByZXZpb3VzX3BhZ2UubGVuZ3RoID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBwdXNoaW50IDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjAKICAgIC8vIGFzc2VydCBwcmV2aW91c19wYWdlLmxlbmd0aCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZHVwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjIKICAgIC8vIHByZXZpb3VzX3BhZ2UubGVuZ3RoIC0gVUludDY0KDEpCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTIxLTkyMwogICAgLy8gcHJldmlvdXNfZW50cnkgPSBwcmV2aW91c19wYWdlWwogICAgLy8gICAgIHByZXZpb3VzX3BhZ2UubGVuZ3RoIC0gVUludDY0KDEpCiAgICAvLyBdLmNvcHkoKQogICAgcHVzaGludCA2NQogICAgKgogICAgcHVzaGludCAyCiAgICArCiAgICBwdXNoaW50IDY1CiAgICBib3hfZXh0cmFjdAogICAgYiBjb250cmFjdF9zY2hlZHVsZV9hZnRlcl9pZl9lbHNlQDcKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX3doaWxlQDExOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjAwCiAgICAvLyBzZWxmLnNjaGVkdWxlX3BhZ2VbcGFnZV9pbmRleF0gPSBzY2hlZHVsZV9wYWdlLmNvcHkoKQogICAgZGlnIDYKICAgIGl0b2IKICAgIGJ5dGVjIDI0IC8vIDB4NTMyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgZGlnIDUKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzNAogICAgLy8gaWYgaXNfbGFzdF9wYWdlOgogICAgZGlnIDUKICAgIGJ6IGNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzNgogICAgLy8gc2NoZWR1bGVfcGFnZV9pbmRleCAqIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKSArIHBhZ2VfbGVuZ3RoCiAgICBkaWcgMQogICAgZGlnIDQKICAgICsKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzNQogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA9ICgKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTM1LTkzNwogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA9ICgKICAgIC8vICAgICBzY2hlZHVsZV9wYWdlX2luZGV4ICogVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpICsgcGFnZV9sZW5ndGgKICAgIC8vICkKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MzgKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgNTAKICAgIGFwcF9nbG9iYWxfcHV0Cgpjb250cmFjdF9zY2hlZHVsZV9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA5NQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDcyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9leGVjdXRlX2llZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X2V4ZWN1dGVfaWVkOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMDUKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEwNgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMDcKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTA5CiAgICAvLyBhc3NlcnQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LCBlcnIuSU5WQUxJRF9FVkVOVF9DVVJTT1IKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgZGlnIDEKICAgID4KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGN1cnNvcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTExMAogICAgLy8gZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoc2VsZi5ldmVudF9jdXJzb3IpCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMTEKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoZW51bXMuRVZUX0lFRCksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGR1cAogICAgZXh0cmFjdCA4IDEKICAgIGR1cAogICAgcHVzaGJ5dGVzIDB4MDEKICAgIGI9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTExNQogICAgLy8gZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICBkaWcgMQogICAgZXh0cmFjdCAwIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMTcKICAgIC8vIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgZGlnIDIKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTE4CiAgICAvLyBhY2NydWFsX2ZhY3Rvcj1lbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIGRpZyAzCiAgICBleHRyYWN0IDE3IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMTkKICAgIC8vIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIGRpZyA0CiAgICBleHRyYWN0IDI1IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMjEKICAgIC8vIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPWVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDUKICAgIGV4dHJhY3QgMzMgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEyMgogICAgLy8gbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgZGlnIDYKICAgIGV4dHJhY3QgNDEgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEyMwogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9ZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICBkaWcgNwogICAgZXh0cmFjdCA0OSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTI0CiAgICAvLyBmbGFncz1lbnRyeS5mbGFncywKICAgIGRpZyA4CiAgICBleHRyYWN0IDU3IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMTQtMTEyNQogICAgLy8gdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0KAogICAgLy8gICAgIGV2ZW50X2lkPWVudHJ5LmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1lbnRyeS5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1lbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPWVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9ZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPWVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGZsYWdzPWVudHJ5LmZsYWdzLAogICAgLy8gKSwKICAgIHVuY292ZXIgNwogICAgdW5jb3ZlciA4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNwogICAgY29uY2F0CiAgICB1bmNvdmVyIDYKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMjAKICAgIC8vIG9ic2VydmVkX3JhdGU9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMTQtMTEyNQogICAgLy8gdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0KAogICAgLy8gICAgIGV2ZW50X2lkPWVudHJ5LmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1lbnRyeS5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1lbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPWVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9ZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPWVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGZsYWdzPWVudHJ5LmZsYWdzLAogICAgLy8gKSwKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTEyLTExMjYKICAgIC8vIHNlbGYuX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5KAogICAgLy8gICAgIGVudHJ5LAogICAgLy8gICAgIHR5cC5PYnNlcnZlZEV2ZW50UmVxdWVzdCgKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPWVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIG9ic2VydmVkX3JhdGU9VUludDY0KDApLAogICAgLy8gICAgICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1lbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1lbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICAgICAgZmxhZ3M9ZW50cnkuZmxhZ3MsCiAgICAvLyAgICAgKSwKICAgIC8vICkKICAgIGNhbGxzdWIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5CiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMjcKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA5NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuYXBwbHlfbm9uX2Nhc2hfZXZlbnRbcm91dGluZ10oKSAtPiB2b2lkOgphcHBseV9ub25fY2FzaF9ldmVudDoKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDQKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTI5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cG4gMgogICAgbGVuCiAgICBwdXNoaW50IDczCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLk9ic2VydmVkRXZlbnRSZXF1ZXN0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE0MwogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDQKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTQ2CiAgICAvLyBpZiBwYXlsb2FkLmZsYWdzICYgVUludDY0KGVudW1zLkZMQUdfT0JTRVJWRURfRVZFTlQpOgogICAgcHVzaGludCA2NQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgcHVzaGludCA0CiAgICAmCiAgICBieiBhcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIzMwogICAgLy8gcmV0dXJuIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQ0xNKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICBwdXNoaW50IDUKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTQ3CiAgICAvLyBhc3NlcnQgc2VsZi5fc3VwcG9ydHNfb2JzZXJ2ZWRfZXZlbnRzKCksIGVyci5PQlNFUlZFRF9FVkVOVF9SRVFVSVJFRAogICAgYXNzZXJ0IC8vIE9ic2VydmVkIGV2ZW50IHJlcXVpcmVkIHRvIGV4ZWN1dGUgdGhpcyBhY3Rpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDgKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjMzCiAgICAvLyByZXR1cm4gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9DTE0pCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIGR1cAogICAgcHVzaGludCA1CiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQ3CiAgICAvLyBhc3NlcnQgc2VsZi5fc3VwcG9ydHNfb2JzZXJ2ZWRfZXZlbnRzKCksIGVyci5PQlNFUlZFRF9FVkVOVF9SRVFVSVJFRAogICAgYXNzZXJ0IC8vIE9ic2VydmVkIGV2ZW50IHJlcXVpcmVkIHRvIGV4ZWN1dGUgdGhpcyBhY3Rpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk0OAogICAgLy8gYXNzZXJ0IHBheWxvYWQuZXZlbnRfaWQgPT0gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGRpZyAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDcKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBpZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTUwCiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUsIHBheWxvYWQuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgYnVyeSAxMgogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk0OS05NTEKICAgIC8vIHNlbGYuX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIHNlbGYuY29udHJhY3RfdHlwZSwgcGF5bG9hZC5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICAvLyApCiAgICBjYWxsc3ViIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTUzCiAgICAvLyBwYWdlX2luZGV4ID0gc2VsZi5fc2NoZWR1bGVfcGFnZV9pbmRleChzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTkwCiAgICAvLyByZXR1cm4gZXZlbnRfaWQgLy8gVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpCiAgICBwdXNoaW50IDE2CiAgICAvCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTQKICAgIC8vIHBhZ2UgPSB0eXAuRXhlY3V0aW9uU2NoZWR1bGVQYWdlKCkKICAgIGJ5dGVjIDQ4IC8vIDB4MDAwMAogICAgYnVyeSA3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTUKICAgIC8vIGlmIHBhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlOgogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA5CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMjcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1NgogICAgLy8gcGFnZSA9IHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XS5jb3B5KCkKICAgIGRpZyA3CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidXJ5IDcKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX3BhZ2UgZW50cnkgZXhpc3RzCgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDI3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTU3CiAgICAvLyBhc3NlcnQgcGFnZS5sZW5ndGggPCBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGRpZyA1CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgMTYKICAgIDwKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2MgogICAgLy8gc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIGRpZyAzCiAgICBkdXAKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjMKICAgIC8vIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICBkaWcgMQogICAgZXh0cmFjdCAxNyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjQKICAgIC8vIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZGlnIDIKICAgIGV4dHJhY3QgMjUgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTY1CiAgICAvLyBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDMKICAgIGV4dHJhY3QgNDEgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTY2CiAgICAvLyBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIGRpZyA0CiAgICBleHRyYWN0IDQ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2NwogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIHVuY292ZXIgNQogICAgZXh0cmFjdCA1NyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTktOTY5CiAgICAvLyB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1wYXlsb2FkLmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9cGF5bG9hZC5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPXBheWxvYWQucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXBheWxvYWQubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICkKICAgIGRpZyAxMQogICAgaXRvYgogICAgZGlnIDE4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMwogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTgtOTcwCiAgICAvLyBwYWdlLmFwcGVuZCgKICAgIC8vICAgICB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9cGF5bG9hZC5ldmVudF9pZCwKICAgIC8vICAgICAgICAgZXZlbnRfdHlwZT1wYXlsb2FkLmV2ZW50X3R5cGUsCiAgICAvLyAgICAgICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIC8vICAgICAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICAgICApCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NzEKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHBhZ2UuY29weSgpCiAgICBkaWcgOAogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk3MgogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTUxCiAgICAvLyBhc3NlcnQgZXZlbnRfaWQgPT0gc2VsZi5ldmVudF9jdXJzb3IsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBjdXJzb3IKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTIKICAgIC8vIGVudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KGV2ZW50X2lkKQogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1NAogICAgLy8gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgYnVyeSAxMAogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjQKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY1CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzYzLTM3MAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9SUiksCiAgICBwdXNoaW50IDEyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY3CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICBwdXNoaW50IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY4CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgcHVzaGludCAxOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzYzLTM3MAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBieiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX2ZhbHNlQDE2CgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX3RydWVAMTU6CiAgICBpbnRjXzEgLy8gMQoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9tZXJnZUAxNzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTMtMTE1NQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2lzX25vbl9jYXNoKAogICAgLy8gICAgIGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIC8vICksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IHR5cGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTYKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlICE9IGFyYzQuVUludDgoZW51bXMuRVZUX0lFRCksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGRpZyA4CiAgICBwdXNoYnl0ZXMgMHgwMQogICAgYiE9CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCB0eXBlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNzQKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluIChVSW50NjQoZW51bXMuRVZUX1JSKSwgVUludDY0KGVudW1zLkVWVF9SUkYpKQogICAgZGlnIDQKICAgIHB1c2hpbnQgMTIKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDIxCiAgICBkaWcgNAogICAgcHVzaGludCAxMQogICAgPT0KICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfZmFsc2VAMjIKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAyMToKICAgIGludGNfMSAvLyAxCgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX21lcmdlQDIzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1NwogICAgLy8gaWYgc2VsZi5fZXZlbnRfaXNfcmF0ZV9yZXNldChlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpKToKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Vsc2VfYm9keUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODAKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLm9ic2VydmVyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjUgLy8gMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTYxCiAgICAvLyBzZWxmLl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeShlbnRyeSwgcGF5bG9hZCkKICAgIGRpZyA2CiAgICBkaWcgMgogICAgY2FsbHN1YiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkKICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE2MgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTI5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Vsc2VfYm9keUA1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE2MAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICBiIGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VANgoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9mYWxzZUAyMjoKICAgIGludGNfMCAvLyAwCiAgICBiIGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfbWVyZ2VAMjMKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfZmFsc2VAMTY6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX21lcmdlQDE3CgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuYXBwZW5kX29ic2VydmVkX2Nhc2hfZXZlbnRbcm91dGluZ10oKSAtPiB2b2lkOgphcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudDoKICAgIGludGNfMCAvLyAwCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBsZW4KICAgIHB1c2hpbnQgNjUKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuT2JzZXJ2ZWRDYXNoRXZlbnRSZXF1ZXN0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE3MgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTczCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE3NAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDcKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMzMKICAgIC8vIHJldHVybiBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0NMTSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgcHVzaGludCA1CiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTgxCiAgICAvLyBhc3NlcnQgc2VsZi5fc3VwcG9ydHNfb2JzZXJ2ZWRfZXZlbnRzKCksIGVyci5PQlNFUlZFRF9FVkVOVF9SRVFVSVJFRAogICAgYXNzZXJ0IC8vIE9ic2VydmVkIGV2ZW50IHJlcXVpcmVkIHRvIGV4ZWN1dGUgdGhpcyBhY3Rpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4MgogICAgLy8gYXNzZXJ0IHBheWxvYWQuZXZlbnRfaWQgPT0gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIHN3YXAKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgaWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4MwogICAgLy8gYXNzZXJ0IHBheWxvYWQuZXZlbnRfdHlwZSA9PSBhcmM0LlVJbnQ4KGVudW1zLkVWVF9QUiksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGRpZyAxCiAgICBleHRyYWN0IDggMQogICAgZHVwCiAgICBjb3ZlciAzCiAgICBwdXNoYnl0ZXMgMHgwMwogICAgYj09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCB0eXBlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5ODQKICAgIC8vIGFzc2VydCBwYXlsb2FkLmZsYWdzICYgVUludDY0KGVudW1zLkZMQUdfQ0FTSF9FVkVOVCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgc3dhcAogICAgcHVzaGludCA1NwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18xIC8vIDEKICAgICYKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4NgogICAgLy8gaWYgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA+IFVJbnQ2NCgwKToKICAgIGJ6IGFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTg3CiAgICAvLyBwcmV2aW91c19lbnRyeSA9IHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IC0gVUludDY0KDEpKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTg5CiAgICAvLyBwcmV2aW91c19lbnRyeS5zY2hlZHVsZWRfdGltZSA8PSBwYXlsb2FkLnNjaGVkdWxlZF90aW1lCiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgNAogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgPD0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4OC05OTAKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgcHJldmlvdXNfZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gcGF5bG9hZC5zY2hlZHVsZWRfdGltZQogICAgLy8gKSwgZXJyLklOVkFMSURfU09SVElORwogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIG11c3QgYmUgc29ydGVkIGluIHN0cmljdGx5IGFzY2VuZGluZyBvcmRlcgoKYXBwZW5kX29ic2VydmVkX2Nhc2hfZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTkyCiAgICAvLyBwYWdlX2luZGV4ID0gc2VsZi5fc2NoZWR1bGVfcGFnZV9pbmRleChzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTkwCiAgICAvLyByZXR1cm4gZXZlbnRfaWQgLy8gVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpCiAgICBwdXNoaW50IDE2CiAgICAvCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OTMKICAgIC8vIHBhZ2UgPSB0eXAuRXhlY3V0aW9uU2NoZWR1bGVQYWdlKCkKICAgIGJ5dGVjIDQ4IC8vIDB4MDAwMAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OTQKICAgIC8vIGlmIHBhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlOgogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA3CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VANQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTk1CiAgICAvLyBwYWdlID0gc2VsZi5zY2hlZHVsZV9wYWdlW3BhZ2VfaW5kZXhdLmNvcHkoKQogICAgZGlnIDUKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGJ1cnkgNgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfcGFnZSBlbnRyeSBleGlzdHMKCmFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5NgogICAgLy8gYXNzZXJ0IHBhZ2UubGVuZ3RoIDwgVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBkaWcgNAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBwdXNoaW50IDE2CiAgICA8CiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDAxCiAgICAvLyBzY2hlZHVsZWRfdGltZT1wYXlsb2FkLnNjaGVkdWxlZF90aW1lLAogICAgZGlnIDUKICAgIGR1cAogICAgZXh0cmFjdCA5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMDIKICAgIC8vIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICBkaWcgMQogICAgZXh0cmFjdCAxNyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDAzCiAgICAvLyByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPXBheWxvYWQucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIGRpZyAyCiAgICBleHRyYWN0IDI1IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMDQKICAgIC8vIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPXBheWxvYWQubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBkaWcgMwogICAgZXh0cmFjdCAzMyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDA1CiAgICAvLyBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIGRpZyA0CiAgICBleHRyYWN0IDQxIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMDYKICAgIC8vIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXBheWxvYWQubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICB1bmNvdmVyIDUKICAgIGV4dHJhY3QgNDkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTk4LTEwMDgKICAgIC8vIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgIGV2ZW50X2lkPXBheWxvYWQuZXZlbnRfaWQsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1wYXlsb2FkLmV2ZW50X3R5cGUsCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPXBheWxvYWQubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1wYXlsb2FkLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICBmbGFncz1wYXlsb2FkLmZsYWdzLAogICAgLy8gKQogICAgZGlnIDEwCiAgICBpdG9iCiAgICBkaWcgMTAKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5Ny0xMDA5CiAgICAvLyBwYWdlLmFwcGVuZCgKICAgIC8vICAgICB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9cGF5bG9hZC5ldmVudF9pZCwKICAgIC8vICAgICAgICAgZXZlbnRfdHlwZT1wYXlsb2FkLmV2ZW50X3R5cGUsCiAgICAvLyAgICAgICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIC8vICAgICAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICAgICApCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDEwCiAgICAvLyBzZWxmLnNjaGVkdWxlX3BhZ2VbcGFnZV9pbmRleF0gPSBwYWdlLmNvcHkoKQogICAgZGlnIDYKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDExCiAgICAvLyBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50ICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNzgKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE2NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfZ2V0X3N0YXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfZ2V0X3N0YXRlOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBkdXAKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE4NQogICAgLy8gY29udHJhY3RfdHlwZT1hcmM0LlVJbnQ4KHNlbGYuY29udHJhY3RfdHlwZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzIgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExODcKICAgIC8vIHRvdGFsX3VuaXRzPXNlbGYudG90YWxfdW5pdHMsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE4OAogICAgLy8gcmVzZXJ2ZWRfdW5pdHNfdG90YWw9c2VsZi5yZXNlcnZlZF91bml0c190b3RhbCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTg5CiAgICAvLyBpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudD1zZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExOTAKICAgIC8vIGV2ZW50X2N1cnNvcj1zZWxmLmV2ZW50X2N1cnNvciwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE5MQogICAgLy8gc2NoZWR1bGVfZW50cnlfY291bnQ9c2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExOTIKICAgIC8vIG91dHN0YW5kaW5nX3ByaW5jaXBhbD1zZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE5MwogICAgLy8gaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZT1zZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE5NAogICAgLy8gbm9taW5hbF9pbnRlcmVzdF9yYXRlPXNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTk1CiAgICAvLyBhY2NydWVkX2ludGVyZXN0PXNlbGYuYWNjcnVlZF9pbnRlcmVzdCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTk2CiAgICAvLyBjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4PXNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE5NwogICAgLy8gY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXg9c2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTk4CiAgICAvLyByZXNlcnZlZF9pbnRlcmVzdD1zZWxmLnJlc2VydmVkX2ludGVyZXN0LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExOTkKICAgIC8vIHJlc2VydmVkX3ByaW5jaXBhbD1zZWxmLnJlc2VydmVkX3ByaW5jaXBhbCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExODQtMTIwMAogICAgLy8gcmV0dXJuIHR5cC5LZXJuZWxTdGF0ZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlPWFyYzQuVUludDgoc2VsZi5jb250cmFjdF90eXBlKSwKICAgIC8vICAgICBzdGF0dXM9c2VsZi5zdGF0dXMsCiAgICAvLyAgICAgdG90YWxfdW5pdHM9c2VsZi50b3RhbF91bml0cywKICAgIC8vICAgICByZXNlcnZlZF91bml0c190b3RhbD1zZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsLAogICAgLy8gICAgIGluaXRpYWxfZXhjaGFuZ2VfYW1vdW50PXNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQsCiAgICAvLyAgICAgZXZlbnRfY3Vyc29yPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgLy8gICAgIHNjaGVkdWxlX2VudHJ5X2NvdW50PXNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQsCiAgICAvLyAgICAgb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2U9c2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlLAogICAgLy8gICAgIG5vbWluYWxfaW50ZXJlc3RfcmF0ZT1zZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBhY2NydWVkX2ludGVyZXN0PXNlbGYuYWNjcnVlZF9pbnRlcmVzdCwKICAgIC8vICAgICBjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4PXNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCwKICAgIC8vICAgICBjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleD1zZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4LAogICAgLy8gICAgIHJlc2VydmVkX2ludGVyZXN0PXNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QsCiAgICAvLyAgICAgcmVzZXJ2ZWRfcHJpbmNpcGFsPXNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsLAogICAgLy8gKQogICAgdW5jb3ZlciAxNAogICAgaXRvYgogICAgdW5jb3ZlciAxNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDEzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDEwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgOQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDgKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnRbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIwNgogICAgLy8gaWYgc2VsZi5ldmVudF9jdXJzb3IgPj0gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgPj0KICAgIGJ6IGNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMDgKICAgIC8vIGV2ZW50X2lkPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjA3LTEyMTcKICAgIC8vIHJldHVybiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1zZWxmLmV2ZW50X2N1cnNvciwKICAgIC8vICAgICBldmVudF90eXBlPWFyYzQuVUludDgoMCksCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9VUludDY0KDApLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9VUludDY0KDApLAogICAgLy8gICAgIGZsYWdzPVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGl0b2IKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMDkKICAgIC8vIGV2ZW50X3R5cGU9YXJjNC5VSW50OCgwKSwKICAgIGJ5dGVjIDQwIC8vIDB4MDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMDctMTIxNwogICAgLy8gcmV0dXJuIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgIGV2ZW50X2lkPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgLy8gICAgIGV2ZW50X3R5cGU9YXJjNC5VSW50OCgwKSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1VSW50NjQoMCksCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1VSW50NjQoMCksCiAgICAvLyAgICAgZmxhZ3M9VUludDY0KDApLAogICAgLy8gKQogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjEwCiAgICAvLyBzY2hlZHVsZWRfdGltZT1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIwNy0xMjE3CiAgICAvLyByZXR1cm4gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkoCiAgICAvLyAgICAgZXZlbnRfaWQ9c2VsZi5ldmVudF9jdXJzb3IsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1hcmM0LlVJbnQ4KDApLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPVVJbnQ2NCgwKSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249VUludDY0KDApLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPVVJbnQ2NCgwKSwKICAgIC8vICAgICBmbGFncz1VSW50NjQoMCksCiAgICAvLyApCiAgICBpdG9iCiAgICBzd2FwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKCmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudF9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudEA0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIwMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpjb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIxOAogICAgLy8gcmV0dXJuIHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLmV2ZW50X2N1cnNvcikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjAyCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50QDQKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5jb250cmFjdF91cGRhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF91cGRhdGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTUzLTE1NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGdyYW50cyB0aGUgdXBkYXRlIHBlcm1pc3Npb25zIHRvIHRoZSBBcnJhbmdlci4KICAgIC8vICMg4pqg77iPIFdBUk5JTkc6IEFwcGxpY2F0aW9uIHVwZGF0ZXMgbXVzdCBiZSBleGVjdXRlZCBWRVJZIGNhcmVmdWxseSwgYXMgdGhleQogICAgLy8gIyBtaWdodCBpbnRyb2R1Y2UgYnJlYWtpbmcgY2hhbmdlcy4KICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfcm90YXRlX2FycmFuZ2VyW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19yb3RhdGVfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2OQogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTcwCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gbmV3X2FycmFuZ2VyCiAgICBieXRlYyAxOCAvLyAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTcxCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfc2V0X29wX2RhZW1vbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfc2V0X29wX2RhZW1vbjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTg0CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODUKICAgIC8vIHNlbGYub3BfZGFlbW9uLnZhbHVlID0gYWRkcmVzcwogICAgYnl0ZWMgMjYgLy8gMHg1MjIzNGY3MDQ0NjE2NTZkNmY2ZTIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4NgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTczCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2Fzc2lnbl9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19hc3NpZ25fcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDE2CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLlJvbGVWYWxpZGl0eQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjExCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMgogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgcHVzaGludCAyMAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTAzCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gcm9sZV9hZGRyZXNzCiAgICBieXRlYyAxOCAvLyAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMKICAgIGRpZyAzCiAgICBhcHBfZ2xvYmFsX3B1dAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTQKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDYKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIGR1cAogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnRfbWFuYWdlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMyAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwOAogICAgLy8gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMiAvLyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTIKICAgIC8vIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIGR1cAogICAgcHVzaGludCA2MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE1CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMzIgLy8gMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE2CiAgICAvLyBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExOAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMSAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIwCiAgICAvLyBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMwogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgODAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIzCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI1IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI0CiAgICAvLyBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3Jldm9rZV9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19yZXZva2Vfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzUKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzNgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzcKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCkpCiAgICBidG9pCiAgICBkdXBuIDIKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCAhPSBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksIGVyci5JTlZBTElEX1JPTEUKICAgIGR1cAogICAgcHVzaGludCAyMAogICAgIT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyOAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIzIC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0NGQ2MTZlNjE2NzY1NzIyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMwCiAgICAvLyBkZWwgc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzOQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjE2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIyIC8vIDB4NTIyMzUwNzI2OTZkNjE3Mjc5NDQ2NTYxNmM2NTcyMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNAogICAgLy8gZGVsIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjM4CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIGR1cAogICAgcHVzaGludCA2MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAzMiAvLyAweDUyMjM1NDcyNzU3Mzc0NjU2NTIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzgKICAgIC8vIGRlbCBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjM4CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDEKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hdXRob3JpdHksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjEgLy8gMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MgogICAgLy8gZGVsIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzOAogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDQKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDgwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI1IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ2CiAgICAvLyBkZWwgc2VsZi5vYnNlcnZlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfY29udHJhY3Rfc3VzcGVuc2lvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfY29udHJhY3Rfc3VzcGVuc2lvbjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCAgIyBUT0RPOiBVcGRhdGUgc3BlY3MgYW5kIGFkZCB0ZXN0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojc3CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyMSAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1NwogICAgLy8gc2VsZi5hc3NldF9zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGJ5dGVjIDMzIC8vICJhc3NldF9zdXNwZW5kZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1OAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QgICMgVE9ETzogVXBkYXRlIHNwZWNzIGFuZCBhZGQgdGVzdAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X2FycmFuZ2VyW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjY4CiAgICAvLyByZXR1cm4gc2VsZi5hcnJhbmdlci52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE4IC8vIDB4NTIyMzQxNzI3MjYxNmU2NzY1NzIyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI2MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYWRkcmVzc19yb2xlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjcwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4NAogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hY2NvdW50X21hbmFnZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjMgLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQ0ZDYxNmU2MTY3NjU3MjIzCiAgICBkaWcgMQogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODUKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYucHJpbWFyeV9kZWFsZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjIgLy8gMHg1MjIzNTA3MjY5NmQ2MTcyNzk0NDY1NjE2YzY1NzIyMwogICAgZGlnIDIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg2CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnRydXN0ZWUsIGFkZHJlc3MpLAogICAgYnl0ZWMgMzIgLy8gMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMwogICAgZGlnIDMKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg3CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgYWRkcmVzcyksCiAgICBieXRlYyAyMSAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgZGlnIDQKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg4CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLm9ic2VydmVyLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDI1IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgdW5jb3ZlciA1CiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlYyA0MCAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciA2CiAgICBzZXRiaXQKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDUKICAgIHNldGJpdAogICAgcHVzaGludCAyCiAgICB1bmNvdmVyIDQKICAgIHNldGJpdAogICAgcHVzaGludCAzCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgcHVzaGludCA0CiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwNQogICAgLy8gcm9sZSA9IHJvbGVfaWQuYXNfdWludDY0KCkKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDYKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGUpCiAgICBkdXAKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA4CiAgICAvLyBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKToKICAgIHB1c2hpbnRzIDIwIDQwIDUwIDYwIDcwIDgwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA3LTMzOAogICAgLy8gbWF0Y2ggcm9sZToKICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKToKICAgIC8vICAgICAgICAgcmV0dXJuIHR5cC5Sb2xlVmFsaWRpdHkoCiAgICAvLyAgICAgICAgICAgICByb2xlX3ZhbGlkaXR5X3N0YXJ0PVVJbnQ2NCgwKSwgcm9sZV92YWxpZGl0eV9lbmQ9VUludDY0KDApCiAgICAvLyAgICAgICAgICkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSk6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSk6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgXzoKICAgIC8vICAgICAgICAgb3AuZXJyKGVyci5JTlZBTElEX1JPTEUpCiAgICB1bmNvdmVyIDYKICAgIG1hdGNoIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMEAyIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMUAzIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMkA0IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfM0A1IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNEA2IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzM4CiAgICAvLyBvcC5lcnIoZXJyLklOVkFMSURfUk9MRSkKICAgIGVyciAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV81QDc6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzM0CiAgICAvLyBzZWxmLm9ic2VydmVyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDI1IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMzMy0zMzUKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLm9ic2VydmVyLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzYKICAgIC8vIHJldHVybiBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV80QDY6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI5CiAgICAvLyBzZWxmLmF1dGhvcml0eSwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAyMSAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOC0zMzAKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLmF1dGhvcml0eSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzMxCiAgICAvLyByZXR1cm4gc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8zQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI0CiAgICAvLyBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMzIgLy8gMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMy0zMjUKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyNgogICAgLy8gcmV0dXJuIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzJANDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTkKICAgIC8vIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMjIgLy8gMHg1MjIzNTA3MjY5NmQ2MTcyNzk0NDY1NjE2YzY1NzIyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxOC0zMjAKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLnByaW1hcnlfZGVhbGVyLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjEKICAgIC8vIHJldHVybiBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMUAzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxNAogICAgLy8gc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMjMgLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQ0ZDYxNmU2MTY3NjU3MjIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEzLTMxNQogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTYKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzBAMjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDktMzExCiAgICAvLyByZXR1cm4gdHlwLlJvbGVWYWxpZGl0eSgKICAgIC8vICAgICByb2xlX3ZhbGlkaXR5X3N0YXJ0PVVJbnQ2NCgwKSwgcm9sZV92YWxpZGl0eV9lbmQ9VUludDY0KDApCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB2b2lkOgpfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZDoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNgogICAgLy8gZGVmIF9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHNlbGYsIGhvbGRpbmdfYWRkcmVzczogQWNjb3VudCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI4CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZCwgZXJyLlNVU1BFTkRFRAogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHB1c2hpbnQgMzg0CiAgICBnZXRiaXQKICAgICEKICAgIGFzc2VydCAvLyBTdXNwZW5kZWQgb3BlcmF0aW9ucwogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuX3NldHRsZV9wb3NpdGlvbihob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB1aW50NjQsIHVpbnQ2NDoKX3NldHRsZV9wb3NpdGlvbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo0NAogICAgLy8gZGVmIF9zZXR0bGVfcG9zaXRpb24oc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50KSAtPiB0dXBsZVtVSW50NjQsIFVJbnQ2NF06CiAgICBwcm90byAxIDIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NjEKICAgIC8vIHBvc2l0aW9uID0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY29weSgpCiAgICBkdXAKICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjYzLTY1CiAgICAvLyAjIENvbXB1dGUgdGhlIGluY3JlbWVudGFsIHBlci11bml0IGZpeGVkLXBvaW50IGludGVyZXN0IGFuZCBwcmluY2lwYWwgYWNjcnVlZAogICAgLy8gIyBzaW5jZSB0aGlzIGFjY291bnQncyBsYXN0IGNoZWNrcG9pbnQuCiAgICAvLyBpbnRlcmVzdF9kZWx0YSA9IHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCAtIHBvc2l0aW9uLmludGVyZXN0X2NoZWNrcG9pbnQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IGV4aXN0cwogICAgZGlnIDEKICAgIHB1c2hpbnQgNTcKICAgIGV4dHJhY3RfdWludDY0CiAgICAtCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NjcKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggLSBwb3NpdGlvbi5wcmluY2lwYWxfY2hlY2twb2ludAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCBleGlzdHMKICAgIGRpZyAyCiAgICBwdXNoaW50IDY1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjczCiAgICAvLyBpbnRlcmVzdF9kZWx0YSwgcG9zaXRpb24udW5pdHMsIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUKICAgIGRpZyAyCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzAtNzQKICAgIC8vICMgQ29udmVydCB0aGUgcGVyLXVuaXQgZml4ZWQtcG9pbnQgZGVsdGFzIGludG8gYWJzb2x1dGUgY2xhaW1hYmxlIGFtb3VudHMKICAgIC8vICMgdXNpbmcgdGhlIGFjY291bnQncyBhY3RpdmUgdW5pdHMuCiAgICAvLyBjbGFpbWFibGVfaW50ZXJlc3QgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBpbnRlcmVzdF9kZWx0YSwgcG9zaXRpb24udW5pdHMsIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUKICAgIC8vICkKICAgIHVuY292ZXIgMwogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3NgogICAgLy8gcHJpbmNpcGFsX2RlbHRhLCBwb3NpdGlvbi51bml0cywgc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojc1LTc3CiAgICAvLyBjbGFpbWFibGVfcHJpbmNpcGFsID0gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgcHJpbmNpcGFsX2RlbHRhLCBwb3NpdGlvbi51bml0cywgc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgLy8gKQogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3OS04MQogICAgLy8gIyBBY2NydWUgdGhlIGNsYWltYWJsZSBhbW91bnRzIHRvIHRoZSBhY2NvdW50IHBvc2l0aW9uIGFuZCBtYWtlIHRoZW0gYXZhaWxhYmxlCiAgICAvLyAjIGZvciB3aXRoZHJhd2FsLgogICAgLy8gcG9zaXRpb24uY2xhaW1hYmxlX2ludGVyZXN0ICs9IGNsYWltYWJsZV9pbnRlcmVzdAogICAgZGlnIDIKICAgIHB1c2hpbnQgNzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgKwogICAgaXRvYgogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICByZXBsYWNlMiA3MwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjgyCiAgICAvLyBwb3NpdGlvbi5jbGFpbWFibGVfcHJpbmNpcGFsICs9IGNsYWltYWJsZV9wcmluY2lwYWwKICAgIGR1cAogICAgcHVzaGludCA4MQogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICArCiAgICBpdG9iCiAgICByZXBsYWNlMiA4MQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojg0LTg2CiAgICAvLyAjIEFkdmFuY2UgdGhlIGFjY291bnQncyBwZXItdW5pdCBmaXhlZC1wb2ludCBjaGVja3BvaW50cyB0byB0aGUgY3VycmVudCBnbG9iYWwKICAgIC8vICMgcGVyLXVuaXQgZml4ZWQtcG9pbnQgZ2xvYmFsIGluZGljZXMuCiAgICAvLyBwb3NpdGlvbi5pbnRlcmVzdF9jaGVja3BvaW50ID0gc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCBleGlzdHMKICAgIGl0b2IKICAgIHJlcGxhY2UyIDU3CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6ODcKICAgIC8vIHBvc2l0aW9uLnByaW5jaXBhbF9jaGVja3BvaW50ID0gc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCBleGlzdHMKICAgIGl0b2IKICAgIHJlcGxhY2UyIDY1CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6ODktOTAKICAgIC8vICMgQWR2YW5jZSB0aGUgYWNjb3VudCdzIGV2ZW50IGN1cnNvciB0byB0aGUgY3VycmVudCBnbG9iYWwgZXZlbnQgY3Vyc29yLgogICAgLy8gcG9zaXRpb24uc2V0dGxlZF9jdXJzb3IgPSBzZWxmLmV2ZW50X2N1cnNvcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpdG9iCiAgICByZXBsYWNlMiA0OQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjkyLTk0CiAgICAvLyAjIFVwZGF0ZSB0aGUgYWNjb3VudCBwb3NpdGlvbiBhbmQgcmV0dXJuIHRoZSBuZXdseSBhY2NydWVkIGNsYWltYWJsZSBhbW91bnRzCiAgICAvLyAjIGFkZGVkIHRvIHRoZSB0b3RhbCBwb3NpdGlvbidzIGNsYWltYWJsZSBhbW91bnRzLgogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSBwb3NpdGlvbi5jb3B5KCkKICAgIHVuY292ZXIgMwogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojk1CiAgICAvLyByZXR1cm4gY2xhaW1hYmxlX2ludGVyZXN0LCBjbGFpbWFibGVfcHJpbmNpcGFsCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5fZW5zdXJlX3VuaXRzX2FjdGl2YXRlZChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB2b2lkOgpfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZDoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo5NwogICAgLy8gZGVmIF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKHNlbGYsIGhvbGRpbmdfYWRkcmVzczogQWNjb3VudCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTAwCiAgICAvLyBpZiBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKToKICAgIGJ6IF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwMQogICAgLy8gcmV0dXJuCiAgICByZXRzdWIKCl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDMKICAgIC8vIHBvc2l0aW9uID0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY29weSgpCiAgICBmcmFtZV9kaWcgMgogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA0CiAgICAvLyBpZiBwb3NpdGlvbi5yZXNlcnZlZF91bml0cyA9PSBVSW50NjQoMCk6CiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIGJueiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZF9hZnRlcl9pZl9lbHNlQDQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDUKICAgIC8vIHJldHVybgogICAgcmV0c3ViCgpfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZF9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA4CiAgICAvLyBwb3NpdGlvbi51bml0cyArPSBhY3RpdmF0ZWRfdW5pdHMKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDMKICAgICsKICAgIGl0b2IKICAgIHJlcGxhY2UyIDMyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA5CiAgICAvLyBwb3NpdGlvbi5yZXNlcnZlZF91bml0cyA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGl0b2IKICAgIHJlcGxhY2UyIDQwCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTEwCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHBvc2l0aW9uLmNvcHkoKQogICAgZnJhbWVfZGlnIDIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTEKICAgIC8vIGFzc2VydCBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID49IGFjdGl2YXRlZF91bml0cywgZXJyLk9WRVJfRElTVFJJQlVUSU9OCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIGV4aXN0cwogICAgZHVwCiAgICBkaWcgMgogICAgPj0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgcmVtYWluaW5nIEQtQVNBIHVuaXRzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTEyCiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIC09IGFjdGl2YXRlZF91bml0cwogICAgc3dhcAogICAgLQogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9zY2FsZWRfbXVsX2RpdihtdWx0aXBsaWNhbmQ6IHVpbnQ2NCwgbXVsdGlwbGllcjogdWludDY0LCBkaXZpc29yOiB1aW50NjQpIC0+IHVpbnQ2NDoKX3NjYWxlZF9tdWxfZGl2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTUzLTE1NQogICAgLy8gZGVmIF9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLCBtdWx0aXBsaWNhbmQ6IFVJbnQ2NCwgbXVsdGlwbGllcjogVUludDY0LCBkaXZpc29yOiBVSW50NjQKICAgIC8vICkgLT4gVUludDY0OgogICAgcHJvdG8gMyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTcKICAgIC8vIGlmIG11bHRpcGxpY2FuZCA9PSBVSW50NjQoMCkgb3IgbXVsdGlwbGllciA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTMKICAgIGJ6IF9zY2FsZWRfbXVsX2Rpdl9pZl9ib2R5QDIKICAgIGZyYW1lX2RpZyAtMgogICAgYm56IF9zY2FsZWRfbXVsX2Rpdl9hZnRlcl9pZl9lbHNlQDMKCl9zY2FsZWRfbXVsX2Rpdl9pZl9ib2R5QDI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTgKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9zY2FsZWRfbXVsX2Rpdl9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTkKICAgIC8vIGhpZ2gsIGxvdyA9IG9wLm11bHcobXVsdGlwbGljYW5kLCBtdWx0aXBsaWVyKQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIG11bHcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2MAogICAgLy8gcmV0dXJuIG9wLmRpdncoaGlnaCwgbG93LCBkaXZpc29yKQogICAgZnJhbWVfZGlnIC0xCiAgICBkaXZ3CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYW1vdW50X3RvX2luZGV4X2RlbHRhKGFtb3VudDogdWludDY0KSAtPiB1aW50NjQ6Cl9hbW91bnRfdG9faW5kZXhfZGVsdGE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjIKICAgIC8vIGRlZiBfYW1vdW50X3RvX2luZGV4X2RlbHRhKHNlbGYsIGFtb3VudDogVUludDY0KSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2NAogICAgLy8gaWYgYW1vdW50ID09IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMQogICAgYm56IF9hbW91bnRfdG9faW5kZXhfZGVsdGFfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjUKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9hbW91bnRfdG9faW5kZXhfZGVsdGFfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTY2CiAgICAvLyBhc3NlcnQgc2VsZi50b3RhbF91bml0cyA+IFVJbnQ2NCgwKSwgZXJyLk5PX1VOSVRTCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgZHVwCiAgICBhc3NlcnQgLy8gTm8gRC1BU0EgdW5pdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2NwogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KGFtb3VudCwgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwgc2VsZi50b3RhbF91bml0cykKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2luZGV4X2RlbHRhX3RvX2Ftb3VudChpbmRleF9kZWx0YTogdWludDY0KSAtPiB1aW50NjQ6Cl9pbmRleF9kZWx0YV90b19hbW91bnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjkKICAgIC8vIGRlZiBfaW5kZXhfZGVsdGFfdG9fYW1vdW50KHNlbGYsIGluZGV4X2RlbHRhOiBVSW50NjQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTc2CiAgICAvLyBpZiBpbmRleF9kZWx0YSA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGJueiBfaW5kZXhfZGVsdGFfdG9fYW1vdW50X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTc3CiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfaW5kZXhfZGVsdGFfdG9fYW1vdW50X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE3OQogICAgLy8gc2VsZi50b3RhbF91bml0cywKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxODEKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNzgtMTgyCiAgICAvLyByZXR1cm4gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgc2VsZi50b3RhbF91bml0cywKICAgIC8vICAgICBpbmRleF9kZWx0YSwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2dldF9zY2hlZHVsZV9lbnRyeShldmVudF9pZDogdWludDY0KSAtPiBieXRlczoKX2dldF9zY2hlZHVsZV9lbnRyeToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIwMgogICAgLy8gZGVmIF9nZXRfc2NoZWR1bGVfZW50cnkoc2VsZiwgZXZlbnRfaWQ6IFVJbnQ2NCkgLT4gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnk6CiAgICBwcm90byAxIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIwNAogICAgLy8gYXNzZXJ0IGV2ZW50X2lkIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgPgogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgaWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE5MAogICAgLy8gcmV0dXJuIGV2ZW50X2lkIC8vIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDE2CiAgICAvCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMDYKICAgIC8vIGFzc2VydCBwYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxOTQKICAgIC8vIHJldHVybiBldmVudF9pZCAlIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDE2CiAgICAlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMDkKICAgIC8vIGFzc2VydCBvZmZzZXQgPCBwYWdlLmxlbmd0aCwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBwdXNoaW50IDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgMQogICAgPgogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjEwCiAgICAvLyByZXR1cm4gcGFnZVtvZmZzZXRdLmNvcHkoKQogICAgcHVzaGludCA2NQogICAgKgogICAgcHVzaGludCAyCiAgICArCiAgICBwdXNoaW50IDY1CiAgICBib3hfZXh0cmFjdAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKGNvbnRyYWN0X3R5cGU6IHVpbnQ2NCwgZXZlbnRfdHlwZTogdWludDY0KSAtPiB2b2lkOgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTMtMzE1CiAgICAvLyBkZWYgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIHNlbGYsIGNvbnRyYWN0X3R5cGU6IFVJbnQ2NCwgZXZlbnRfdHlwZTogVUludDY0CiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNDcKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNDgKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgaW50Y18yIC8vIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI0OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9NRCksCiAgICBwdXNoaW50IDE5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTAKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgcHVzaGludCAxMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU0LTI1NQogICAgLy8gIyBDaGVjayBjb21tb24gZXZlbnRzIGZpcnN0CiAgICAvLyBpZiBldmVudF90eXBlIGluIGNvbW1vbl9ldmVudHM6CiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjUxCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICBwdXNoaW50IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUA3CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU2CiAgICAvLyByZXR1cm4gVHJ1ZQogICAgaW50Y18xIC8vIDEKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICByZXRzdWIKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTgtMjU5CiAgICAvLyAjIENvbnRyYWN0LXNwZWNpZmljIGFkZGl0aW9uYWwgZXZlbnRzCiAgICAvLyBpZiBjb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9QQU0pOgogICAgZnJhbWVfZGlnIC0yCiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjYwLTI2MQogICAgLy8gIyBQQU0gb25seSBzdXBwb3J0cyBjb21tb24gZXZlbnRzCiAgICAvLyByZXR1cm4gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNjMKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0xBTSkgb3IgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2My0yNjUKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0xBTSkgb3IgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoCiAgICAvLyAgICAgZW51bXMuQ1RfTkFNCiAgICAvLyApOgogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDExCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMgogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDE2CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUAxMToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2Ni0yNzAKICAgIC8vICMgTEFNL05BTSBhZGQ6IFBSLCBJUENCCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjY4CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjY2LTI3MAogICAgLy8gIyBMQU0vTkFNIGFkZDogUFIsIElQQ0IKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDEzCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIHB1c2hpbnQgMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2Ni0yNzAKICAgIC8vICMgTEFNL05BTSBhZGQ6IFBSLCBJUENCCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICkKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF9mYWxzZUAxNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAxMzoKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDE0OgogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMTY6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzIKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTik6CiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMjMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3My0yNzgKICAgIC8vICMgQU5OIGFkZHM6IFBSLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjc1CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjczLTI3OAogICAgLy8gIyBBTk4gYWRkczogUFIsIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDIwCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIHB1c2hpbnQgMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3My0yNzgKICAgIC8vICMgQU5OIGFkZHM6IFBSLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyMAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzcKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIHB1c2hpbnQgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjczLTI3OAogICAgLy8gIyBBTk4gYWRkczogUFIsIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDIxCgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDIwOgogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMjE6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAyMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MAogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfTEFYKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA0CiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMzEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MS0yODcKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MwogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUiksCiAgICBwdXNoaW50IDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MS0yODcKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjgKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjg0CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjgxLTI4NwogICAgLy8gIyBMQVggYWRkczogUFIsIFBJLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyOAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODUKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICBwdXNoaW50IDE4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODEtMjg3CiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDI4CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODEtMjg3CiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDI5CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDI4OgogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMjk6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAzMToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4OQogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQ0xNKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA1CiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMzMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI5MC0yOTEKICAgIC8vICMgQ0xNIGFkZHM6IFBSCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1BSKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDMKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDMzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjkzCiAgICAvLyByZXR1cm4gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5faXNfZHluYW1pY19hbm51aXR5KCkgLT4gdWludDY0OgpfaXNfZHluYW1pY19hbm51aXR5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM1CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzUtMzM2CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIC8vIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGJ6IF9pc19keW5hbWljX2FubnVpdHlfYm9vbF9mYWxzZUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzYKICAgIC8vIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzNCAvLyAiZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM1LTMzNgogICAgLy8gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICAvLyBhbmQgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBieiBfaXNfZHluYW1pY19hbm51aXR5X2Jvb2xfZmFsc2VAMwogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMzNC0zMzcKICAgIC8vIHJldHVybiAoCiAgICAvLyAgICAgc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICAvLyAgICAgYW5kIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgLy8gKQogICAgcmV0c3ViCgpfaXNfZHluYW1pY19hbm51aXR5X2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzQtMzM3CiAgICAvLyByZXR1cm4gKAogICAgLy8gICAgIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKQogICAgLy8gICAgIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIC8vICkKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KGVudHJ5OiBieXRlcykgLT4gdWludDY0LCBieXRlczoKX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozODAKICAgIC8vIGRlZiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudChzZWxmLCBlbnRyeTogdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5CiAgICAvLyBlbnRyeS5hY2NydWFsX2ZhY3RvciA9PSBVSW50NjQoMCkKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAxNwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5LTM5MQogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGJ6IF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2lmX2JvZHlAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzkwCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5LTM5MQogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGJ6IF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2lmX2JvZHlAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzkxCiAgICAvLyBvciBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPT0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5LTM5MQogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGJueiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudF9hZnRlcl9pZl9lbHNlQDQKCl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2lmX2JvZHlAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5MwogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2RpZyAtMQogICAgdW5jb3ZlciAyCiAgICByZXRzdWIKCl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NQogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NgogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NC0zOTgKICAgIC8vIGFjY3J1ZWQgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICAvLyAgICAgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICkKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MDIKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozOTktNDAzCiAgICAvLyByZXR1cm4gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgYWNjcnVlZCwKICAgIC8vICAgICBlbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICBmcmFtZV9kaWcgLTEKICAgIHVuY292ZXIgMgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yKGRpc2NvdW50X2ZhY3RvcjogdWludDY0LCByZWRlbXB0aW9uX2ZhY3RvcjogdWludDY0KSAtPiB1aW50NjQ6Cl9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ2Mi00NjYKICAgIC8vIGRlZiBfZGlzY291bnRfYW5udWl0eV9mYWN0b3IoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBkaXNjb3VudF9mYWN0b3I6IFVJbnQ2NCwKICAgIC8vICAgICByZWRlbXB0aW9uX2ZhY3RvcjogVUludDY0LAogICAgLy8gKSAtPiBVSW50NjQ6CiAgICBwcm90byAyIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ2OAogICAgLy8gaWYgcmVkZW1wdGlvbl9mYWN0b3IgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0xCiAgICBibnogX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDY5CiAgICAvLyByZXR1cm4gZGlzY291bnRfZmFjdG9yCiAgICBmcmFtZV9kaWcgLTIKICAgIHJldHN1YgoKX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3MAogICAgLy8gcGVyaW9kX3JhdGUgPSBzZWxmLmZpeGVkX3BvaW50X3NjYWxlICsgc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzEKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzAtNDc0CiAgICAvLyBwZXJpb2RfcmF0ZSA9IHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgKyBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICByZWRlbXB0aW9uX2ZhY3RvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICBkaWcgMgogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgICsKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3NQogICAgLy8gYXNzZXJ0IHBlcmlvZF9yYXRlID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGR1cAogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDc4CiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDc2LTQ4MAogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIGRpc2NvdW50X2ZhY3RvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gICAgIHBlcmlvZF9yYXRlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkoZW50cnk6IGJ5dGVzLCBwYXlsb2FkOiBieXRlcykgLT4gYnl0ZXMsIGJ5dGVzOgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MTMtNjE1CiAgICAvLyBkZWYgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5KAogICAgLy8gICAgIHNlbGYsIGVudHJ5OiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSwgcGF5bG9hZDogdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0CiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAyIDIKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjIzCiAgICAvLyBhc3NlcnQgZW50cnkuZXZlbnRfaWQgPT0gc2VsZi5ldmVudF9jdXJzb3IsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGN1cnNvcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjI0CiAgICAvLyBhc3NlcnQgZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsIGVyci5OT19EVUVfQ0FTSEZMT1cKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPD0KICAgIGFzc2VydCAvLyBObyBkdWUgY2FzaGZsb3cgdG8gcGF5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MjYKICAgIC8vIGV2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYyNwogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX0lFRCk6CiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGR1cAogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYyOC02MzAKICAgIC8vICMgSUVEIGZpbmFsaXplcyBpc3N1YW5jZTogcmVzZXJ2ZWQgdW5pdHMgYmVjb21lIGFjdGl2YXRhYmxlIGFuZCB0aGUKICAgIC8vICMgc2NoZWR1bGUncyBpbml0aWFsIGNvbnRyYWN0dWFsIHN0YXRlIGJlY29tZXMgbGl2ZS4KICAgIC8vIGFzc2VydCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzIKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPT0gc2VsZi50b3RhbF91bml0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjMxLTYzMwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID09IHNlbGYudG90YWxfdW5pdHMKICAgIC8vICksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9JTkNPTVBMRVRFCiAgICBhc3NlcnQgLy8gUHJpbWFyeSBkaXN0cmlidXRpb24gaXMgbm90IGNvbXBsZXRlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzQKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM1CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzYKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAzMwogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzcKICAgIC8vIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM4CiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzkKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0MAogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX0FDVElWRSkKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgMTAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDUxCiAgICAvLyBhc3NlcnQgZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSA9PSBVSW50NjQoZW51bXMuRVZUX0lFRCksIGVyci5OT1RfRVZUX0lFRAogICAgZnJhbWVfZGlnIDExCiAgICBhc3NlcnQgLy8gTm90IElFRCBldmVudAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDUyCiAgICAvLyByZXR1cm4gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0MS02NDUKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1zZWxmLl9lbnRyeV9pZWRfYW1vdW50KGVudHJ5KSwKICAgIC8vICAgICBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0NAogICAgLy8gc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0MS02NDUKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1zZWxmLl9lbnRyeV9pZWRfYW1vdW50KGVudHJ5KSwKICAgIC8vICAgICBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICAvLyApCiAgICBjYWxsc3ViIF9lbWl0X2V4ZWN1dGlvbl9ldmVudAogICAgZHVwCiAgICBmcmFtZV9idXJ5IC0yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NDYKICAgIC8vIHJldHVybgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0OQogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ICs9IHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBmcmFtZV9idXJ5IC0yCiAgICArCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1MQogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1JSKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCAxMgogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMTAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1NQogICAgLy8gcGF5bG9hZC5vYnNlcnZlZF9yYXRlLAogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjU2CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzNiAvLyAicmF0ZV9yZXNldF9tdWx0aXBsaWVyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1NwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1Mi02NTgKICAgIC8vICMgUlIgZGVyaXZlcyB0aGUgbmV4dCByYXRlIGZyb20gYW4gb2JzZXJ2ZWQgb3JhY2xlIHZhbHVlIHBsdXMgdGhlCiAgICAvLyAjIGNvbnRyYWN0IHNwcmVhZCAvIG11bHRpcGxpZXIgdGVybXMsIHRoZW4gZW5mb3JjZXMgZmxvb3IgYW5kIGNhcC4KICAgIC8vIG9ic2VydmVkX3JhdGUgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBwYXlsb2FkLm9ic2VydmVkX3JhdGUsCiAgICAvLyAgICAgc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICkKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjAKICAgIC8vIG9ic2VydmVkX3JhdGUgKyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzUgLy8gInJhdGVfcmVzZXRfc3ByZWFkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkIGV4aXN0cwogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDMKICAgIC8vIGlmIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgYW5kIHJhdGUgPCBzZWxmLnJhdGVfcmVzZXRfZmxvb3I6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzggLy8gImhhc19yYXRlX3Jlc2V0X2Zsb29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmhhc19yYXRlX3Jlc2V0X2Zsb29yIGV4aXN0cwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMCAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X2Zsb29yIGV4aXN0cwogICAgZnJhbWVfZGlnIDYKICAgID4KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDQKICAgIC8vIHJhdGUgPSBzZWxmLnJhdGVfcmVzZXRfZmxvb3IKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMCAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDYKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfZmxvb3IgZXhpc3RzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1NToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc0NQogICAgLy8gaWYgc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgYW5kIHJhdGUgPiBzZWxmLnJhdGVfcmVzZXRfY2FwOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDM5IC8vICJoYXNfcmF0ZV9yZXNldF9jYXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwIGV4aXN0cwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTgKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMSAvLyAicmF0ZV9yZXNldF9jYXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9jYXAgZXhpc3RzCiAgICBmcmFtZV9kaWcgNgogICAgPAogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc0NgogICAgLy8gcmF0ZSA9IHNlbGYucmF0ZV9yZXNldF9jYXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMSAvLyAicmF0ZV9yZXNldF9jYXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSA2CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X2NhcCBleGlzdHMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjU5CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IHNlbGYuX2NsYW1wX3JhdGUoCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NTktNjYxCiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IHNlbGYuX2NsYW1wX3JhdGUoCiAgICAvLyAgICAgb2JzZXJ2ZWRfcmF0ZSArIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQKICAgIC8vICkKICAgIGZyYW1lX2RpZyA2CiAgICBhcHBfZ2xvYmFsX3B1dAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMTg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzEKICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QSSk6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMjAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY3MgogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzMKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDIzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc4CiAgICAvLyBpZiBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKToKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAyOQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc5CiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFJGKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCA1CiAgICA9PQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMzAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4NAogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCAtIHNlbGYuZXZlbnRfY3Vyc29yCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIC0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4NgogICAgLy8gKiBVSW50NjQoY3N0Lk9QX1VQX05PTl9DQVNIX1BFUl9FTlRSWV9CVURHRVQpCiAgICBwdXNoaW50IDEwMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjgzLTY4NgogICAgLy8gKyAoCiAgICAvLyAgICAgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCAtIHNlbGYuZXZlbnRfY3Vyc29yCiAgICAvLyApCiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfUEVSX0VOVFJZX0JVREdFVCkKICAgICoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4MgogICAgLy8gVUludDY0KGNzdC5PUF9VUF9OT05fQ0FTSF9CQVNFX0JVREdFVCkKICAgIGludGMgNCAvLyAxNTAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODItNjg2CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX05PTl9DQVNIX0JBU0VfQlVER0VUKQogICAgLy8gKyAoCiAgICAvLyAgICAgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCAtIHNlbGYuZXZlbnRfY3Vyc29yCiAgICAvLyApCiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfUEVSX0VOVFJZX0JVREdFVCkKICAgICsKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4MC02ODgKICAgIC8vIGVuc3VyZV9idWRnZXQoCiAgICAvLyAgICAgcmVxdWlyZWRfYnVkZ2V0PSgKICAgIC8vICAgICAgICAgVUludDY0KGNzdC5PUF9VUF9OT05fQ0FTSF9CQVNFX0JVREdFVCkKICAgIC8vICAgICAgICAgKyAoCiAgICAvLyAgICAgICAgICAgICBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IC0gc2VsZi5ldmVudF9jdXJzb3IKICAgIC8vICAgICAgICAgKQogICAgLy8gICAgICAgICAqIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfUEVSX0VOVFJZX0JVREdFVCkKICAgIC8vICAgICApLAogICAgLy8gKQogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDkwCiAgICAvLyBkaXNjb3VudF9mYWN0b3IgPSBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5MQogICAgLy8gZGVub21pbmF0b3IgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5MgogICAgLy8gc2tpcF9maXJzdF9yZWRlbXB0aW9uID0gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5NAogICAgLy8gaWYgZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAyNQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgZnJhbWVfYnVyeSA4CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAzNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDk1LTQ5OQogICAgLy8gIyBBbiBpbml0aWFsIFBSRiBtYXkgZGVzY3JpYmUgdGhlIGZpcnN0IHJlZGVtcHRpb24gcGVyaW9kIGRpcmVjdGx5LgogICAgLy8gZGlzY291bnRfZmFjdG9yID0gc2VsZi5fZGlzY291bnRfYW5udWl0eV9mYWN0b3IoCiAgICAvLyAgICAgZGlzY291bnRfZmFjdG9yLAogICAgLy8gICAgIGVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDgKICAgIGNhbGxzdWIgX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTAxCiAgICAvLyBza2lwX2ZpcnN0X3JlZGVtcHRpb24gPSBUcnVlCiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfYnVyeSA3CiAgICBmcmFtZV9idXJ5IDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDM1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTAzCiAgICAvLyBmdXR1cmVfZXZlbnRfaWQgPSBzZWxmLmV2ZW50X2N1cnNvciArIFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfd2hpbGVfdG9wQDM2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA0CiAgICAvLyB3aGlsZSBmdXR1cmVfZXZlbnRfaWQgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgZnJhbWVfZGlnIDMKICAgID4KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl93aGlsZUA0OAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA1CiAgICAvLyBmdXR1cmVfZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoZnV0dXJlX2V2ZW50X2lkKQogICAgZnJhbWVfZGlnIDMKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwNgogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPSBmdXR1cmVfZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MDctNTA4CiAgICAvLyAjIE9ubHkgcmVkZW1wdGlvbi1iZWFyaW5nIGV2ZW50cyBjb250cmlidXRlIHRvIHRoZSBhbm51aXR5IGRlbm9taW5hdG9yLgogICAgLy8gaXNfcmVkZW1wdGlvbl9ldmVudCA9IGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpIG9yICgKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwNy01MTEKICAgIC8vICMgT25seSByZWRlbXB0aW9uLWJlYXJpbmcgZXZlbnRzIGNvbnRyaWJ1dGUgdG8gdGhlIGFubnVpdHkgZGVub21pbmF0b3IuCiAgICAvLyBpc19yZWRlbXB0aW9uX2V2ZW50ID0gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QUikgb3IgKAogICAgLy8gICAgIGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfTUQpCiAgICAvLyAgICAgYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICAvLyApCiAgICBibnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfdHJ1ZUA0MAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA5CiAgICAvLyBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgZnJhbWVfZGlnIDQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MDktNTEwCiAgICAvLyBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgLy8gYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF9mYWxzZUA0MQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTEwCiAgICAvLyBhbmQgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IgPiBVSW50NjQoMCkKICAgIGZyYW1lX2RpZyAwCiAgICBwdXNoaW50IDI1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA5LTUxMAogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCkKICAgIC8vIGFuZCBmdXR1cmVfZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX3RydWVANDA6CiAgICBpbnRjXzEgLy8gMQoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfbWVyZ2VANDI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTIKICAgIC8vIGlmIGlzX3JlZGVtcHRpb25fZXZlbnQ6CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA0NwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTEzCiAgICAvLyBpZiBza2lwX2ZpcnN0X3JlZGVtcHRpb246CiAgICBmcmFtZV9kaWcgNwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUA0NQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTE0CiAgICAvLyBza2lwX2ZpcnN0X3JlZGVtcHRpb24gPSBGYWxzZQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgNwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANDc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjEKICAgIC8vIGZ1dHVyZV9ldmVudF9pZCArPSBVSW50NjQoMSkKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV93aGlsZV90b3BAMzYKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlANDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTgKICAgIC8vIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZnJhbWVfZGlnIDAKICAgIHB1c2hpbnQgMjUKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTYtNTE5CiAgICAvLyBkaXNjb3VudF9mYWN0b3IgPSBzZWxmLl9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcigKICAgIC8vICAgICBkaXNjb3VudF9mYWN0b3IsCiAgICAvLyAgICAgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMgogICAgc3dhcAogICAgY2FsbHN1YiBfZGlzY291bnRfYW5udWl0eV9mYWN0b3IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjAKICAgIC8vIGRlbm9taW5hdG9yICs9IGRpc2NvdW50X2ZhY3RvcgogICAgZnJhbWVfZGlnIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA0NwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDE6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF9tZXJnZUA0MgoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX3doaWxlQDQ4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTIzCiAgICAvLyBhc3NlcnQgZGVub21pbmF0b3IgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZnJhbWVfZGlnIDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUyNAogICAgLy8gbnVtZXJhdG9yID0gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTI1CiAgICAvLyBpZiBlbnRyeS5mbGFncyAmIFVJbnQ2NChlbnVtcy5GTEFHX0lOSVRJQUxfUFJGKSA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNTcKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gOAogICAgJgogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDUwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjYtNTI3CiAgICAvLyAjIFN1YnNlcXVlbnQgUFJGIGV2ZW50cyBhbW9ydGl6ZSBib3RoIHByaW5jaXBhbCBhbmQgYWxyZWFkeSBhY2NydWVkIGNhcnJ5LgogICAgLy8gbnVtZXJhdG9yICs9IHNlbGYuYWNjcnVlZF9pbnRlcmVzdAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgICsKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDUwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTMwCiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTI4LTUzMgogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIG51bWVyYXRvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gICAgIGRlbm9taW5hdG9yLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDEKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODkKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IHNlbGYuX3JlY2FsY3VsYXRlX2FubnVpdHlfcGF5bWVudCgKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njg5LTY5MQogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gc2VsZi5fcmVjYWxjdWxhdGVfYW5udWl0eV9wYXltZW50KAogICAgLy8gICAgIGVudHJ5CiAgICAvLyApCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMzA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OTQKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY5NS02OTkKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1VSW50NjQoMCksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OTcKICAgIC8vIHBheW9mZj1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njk4CiAgICAvLyBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY5NS02OTkKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1VSW50NjQoMCksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgY2FsbHN1YiBfZW1pdF9leGVjdXRpb25fZXZlbnQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDI5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjkzCiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDMwCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDIwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc0CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9JUENCKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCAxOAogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDIzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzUtNjc2CiAgICAvLyAjIElQQ0Iga2VlcHMgcHJpbmNpcGFsIHVuY2hhbmdlZCBhbmQgb25seSByZXNldHMgdGhlIGludGVyZXN0IGJhc2UuCiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIGIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMjMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMTA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjIKICAgIC8vIGVsaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1JSRik6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgMTEKICAgID09CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDE0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjMKICAgIC8vIG5leHRfcmF0ZSA9IGVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY0CiAgICAvLyBpZiBuZXh0X3JhdGUgPT0gVUludDY0KDApOgogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDEzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjUKICAgIC8vIG5leHRfcmF0ZSA9IHNlbGYucmF0ZV9yZXNldF9uZXh0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzcgLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDUKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfbmV4dCBleGlzdHMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY2CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IG5leHRfcmF0ZQogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgZnJhbWVfZGlnIDUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDE0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY4CiAgICAvLyBpZiBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSAhPSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgOQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2OQogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPSBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZQogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgZnJhbWVfZGlnIDkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KGVudHJ5OiBieXRlcywgcGF5b2ZmOiB1aW50NjQsIHNldHRsZWRfYW1vdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpfZW1pdF9leGVjdXRpb25fZXZlbnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MDUtNzExCiAgICAvLyBkZWYgX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgKiwKICAgIC8vICAgICBlbnRyeTogdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnksCiAgICAvLyAgICAgcGF5b2ZmOiBVSW50NjQsCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ6IFVJbnQ2NCwKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDMgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE1CiAgICAvLyBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25JRAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE2CiAgICAvLyBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIGZyYW1lX2RpZyAtMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTcKICAgIC8vIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIGZyYW1lX2RpZyAtMwogICAgZXh0cmFjdCA4IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxOAogICAgLy8gc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICBmcmFtZV9kaWcgLTMKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTkKICAgIC8vIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MjIKICAgIC8vIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIGZyYW1lX2RpZyAtMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE3CiAgICAvLyBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICBpbnRjXzIgLy8gOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIyCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBnZXRieXRlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NTEKICAgIC8vIGlmIHBheW9mZiA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJueiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NTIKICAgIC8vIHJldHVybiBVSW50NjQoZW51bXMuUEFZT0ZGX1NJR05fUE9TSVRJVkUpCiAgICBpbnRjXzEgLy8gMQoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX3BheW9mZl9zaWduQDc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MjEtNzIzCiAgICAvLyBwYXlvZmZfc2lnbj1hcmM0LlVJbnQ4KAogICAgLy8gICAgIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIC8vICksCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgaW50Y18yIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MjUKICAgIC8vIGN1cnJlbmN5X2lkPXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzI2CiAgICAvLyBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTQtNzI3CiAgICAvLyBFeGVjdXRpb25FdmVudCgKICAgIC8vICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIC8vICAgICBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYXBwbGllZF9hdD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICBwYXlvZmY9cGF5b2ZmLAogICAgLy8gICAgIHBheW9mZl9zaWduPWFyYzQuVUludDgoCiAgICAvLyAgICAgICAgIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIC8vICAgICApLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PXNldHRsZWRfYW1vdW50LAogICAgLy8gICAgIGN1cnJlbmN5X2lkPXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAwCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzEzLTcyOAogICAgLy8gYXJjNC5lbWl0KAogICAgLy8gICAgIEV4ZWN1dGlvbkV2ZW50KAogICAgLy8gICAgICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgICAgIHBheW9mZj1wYXlvZmYsCiAgICAvLyAgICAgICAgIHBheW9mZl9zaWduPWFyYzQuVUludDgoCiAgICAvLyAgICAgICAgICAgICBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICAvLyAgICAgICAgICksCiAgICAvLyAgICAgICAgIHNldHRsZWRfYW1vdW50PXNldHRsZWRfYW1vdW50LAogICAgLy8gICAgICAgICBjdXJyZW5jeV9pZD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgICAgIHNlcXVlbmNlPWVudHJ5LmV2ZW50X2lkICsgVUludDY0KDEpLAogICAgLy8gICAgICkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDlhMzMyYjk1IC8vIG1ldGhvZCAiRXhlY3V0aW9uRXZlbnQodWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc1MwogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiAoVUludDY0KGVudW1zLkVWVF9JRUQpLCBVSW50NjQoZW51bXMuRVZUX1BJKSk6CiAgICBmcmFtZV9kaWcgNQogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBibnogX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2lmX2JvZHlANQogICAgZnJhbWVfZGlnIDUKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGJ6IF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pZl9lbHNlQDYKCl9lbWl0X2V4ZWN1dGlvbl9ldmVudF9pZl9ib2R5QDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NTQKICAgIC8vIHJldHVybiBVSW50NjQoZW51bXMuUEFZT0ZGX1NJR05fUE9TSVRJVkUpCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIyCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBiIF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9wYXlvZmZfc2lnbkA3CgpfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzU1CiAgICAvLyByZXR1cm4gVUludDY0KGVudW1zLlBBWU9GRl9TSUdOX05FR0FUSVZFKQogICAgcHVzaGludCAyNTUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcyMgogICAgLy8gc2VsZi5fcGF5b2ZmX3NpZ24oZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSwgcGF5b2ZmKQogICAgYiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fcGF5b2ZmX3NpZ25ANwoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9yb2xlX2lzX2FjdGl2ZShyb2xlX21hcDogYnl0ZXMsIHJvbGVfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NDoKX3JvbGVfaXNfYWN0aXZlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU3CiAgICAvLyBkZWYgX3JvbGVfaXNfYWN0aXZlKHNlbGYsIHJvbGVfbWFwOiB0eXAuUmJhY1JvbGUsIHJvbGVfYWRkcmVzczogQWNjb3VudCkgLT4gYm9vbDoKICAgIHByb3RvIDIgMQogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5CiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5LTYwCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5LTYxCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjEKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAtNjEKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgPj0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX21lcmdlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKSAtPiB2b2lkOgpfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2NQogICAgLy8gYXNzZXJ0IHNlbGYuX2lzX2FycmFuZ2VyKFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTIKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgPT0gc2VsZi5hcnJhbmdlci52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE4IC8vIDB4NTIyMzQxNzI3MjYxNmU2NzY1NzIyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgPT0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2NQogICAgLy8gYXNzZXJ0IHNlbGYuX2lzX2FycmFuZ2VyKFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpIC0+IHZvaWQ6Cl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4MwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFzc2V0X2RlZmF1bHRlZCwgZXJyLkRFRkFVTFRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQxIC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfZGVmYXVsdGVkIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIERlZmF1bHRlZAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkgLT4gdm9pZDoKX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg2CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYXNzZXRfc3VzcGVuZGVkLCBlcnIuU1VTUEVOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzMgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9zdXNwZW5kZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gU3VzcGVuZGVkIG9wZXJhdGlvbnMKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkOiB1aW50NjQpIC0+IHZvaWQ6Cl9hc3NlcnRfdmFsaWRfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OAogICAgLy8gZGVmIF9hc3NlcnRfdmFsaWRfcm9sZShzZWxmLCByb2xlX2lkOiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTAKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIHB1c2hpbnQgMjAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkxCiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgcHVzaGludCAyNQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTIKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICBwdXNoaW50IDQwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MwogICAgLy8gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgcHVzaGludCA1MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTQKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgcHVzaGludCA2MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTUKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICBwdXNoaW50IDcwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NgogICAgLy8gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgcHVzaGludCA4MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfZmFsc2VAOAoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3OgogICAgaW50Y18xIC8vIDEKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX21lcmdlQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgcmV0c3ViCgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9mYWxzZUA4OgogICAgaW50Y18wIC8vIDAKICAgIGIgX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfbWVyZ2VAOQo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="}, "sourceInfo": {"approval": {"pcOffsetMethod": "none", "sourceInfo": [{"pc": [2702], "errorMessage": "ACTUS event not yet executed"}, {"pc": [2460], "errorMessage": "Can not distribute zero units"}, {"pc": [3203, 3210, 3583], "errorMessage": "D-ASA already configured"}, {"pc": [1309, 2041, 2420, 2566, 3800, 3946, 4297, 4528, 4674], "errorMessage": "D-ASA not configured"}, {"pc": [3594], "errorMessage": "D-ASA terms not configured"}, {"pc": [6863], "errorMessage": "Defaulted"}, {"pc": [3221], "errorMessage": "Denomination asset is not properly set"}, {"pc": [3236], "errorMessage": "Different settlement asset not supported, must be equal to denomination asset"}, {"pc": [3472, 3479, 3481], "errorMessage": "IED must be set in the future"}, {"pc": [1327, 2110, 2581, 4315, 6215], "errorMessage": "IED not yet executed"}, {"pc": [2473, 5598], "errorMessage": "Insufficient remaining D-ASA units"}, {"pc": [2676, 2742], "errorMessage": "Insufficient sender units to transfer"}, {"pc": [1937, 3123, 3141, 3197, 3674, 3710, 4362, 5782, 6060, 6120, 6523], "errorMessage": "Invalid ACTUS configuration"}, {"pc": [2050, 2454, 2637, 2652, 2809, 2882, 2945, 2987, 5410, 5535], "errorMessage": "Invalid account holding address"}, {"pc": [4865, 4889, 4913, 4937, 4961, 5018, 5046, 5068, 5090, 5112, 5291, 5309, 5324, 5339, 5354], "errorMessage": "Invalid account role address"}, {"pc": [3183], "errorMessage": "Invalid day-count convention ID"}, {"pc": [1440, 3821, 4149, 6092], "errorMessage": "Invalid event cursor"}, {"pc": [3659, 3722, 3998, 4339, 5698], "errorMessage": "Invalid event id"}, {"pc": [3834, 4213, 4220, 4352], "errorMessage": "Invalid event type"}, {"pc": [5002, 5281, 6933], "errorMessage": "Invalid role identifier"}, {"pc": [3588, 3734, 3742, 4051, 4426, 5713, 5729], "errorMessage": "Invalid schedule page"}, {"pc": [5646], "errorMessage": "No D-ASA units"}, {"pc": [1446, 1966, 2147, 6101], "errorMessage": "No due cashflow to pay"}, {"pc": [6184], "errorMessage": "Not IED event"}, {"pc": [2095, 2428, 2624, 2799, 2855, 2865, 2951, 4248, 5135, 6855], "errorMessage": "Not authorized"}, {"pc": [1567, 1575, 2196, 2270, 2279], "errorMessage": "Not enough funds for the payment"}, {"pc": [3971, 3984, 4324], "errorMessage": "Observed event required to execute this action"}, {"pc": [2442, 2490], "errorMessage": "Primary distribution is closed"}, {"pc": [6132], "errorMessage": "Primary distribution is not complete"}, {"pc": [2665], "errorMessage": "Sender and receiver must be different"}, {"pc": [5396, 6871], "errorMessage": "Suspended operations"}, {"pc": [2377, 3700, 4384], "errorMessage": "Time events must be sorted in strictly ascending order"}, {"pc": [2598, 2615], "errorMessage": "Transfer is closed"}, {"pc": [2669], "errorMessage": "Transfer units must be greater than zero"}, {"pc": [993], "errorMessage": "Wrong Global Bytes allocation"}, {"pc": [999], "errorMessage": "Wrong Global UInts allocation"}, {"pc": [1003], "errorMessage": "Wrong Local Bytes allocation"}, {"pc": [1007], "errorMessage": "Wrong Local UInts allocation"}, {"pc": [1548, 2189], "errorMessage": "account opted into asset"}, {"pc": [6815, 6830], "errorMessage": "check BoxMap entry exists"}, {"pc": [2086, 2124, 2165, 2203, 2494, 2672, 2731, 2757, 5390, 5556], "errorMessage": "check self.account entry exists"}, {"pc": [1629, 1861, 1949, 4585, 6220, 6543], "errorMessage": "check self.accrued_interest exists"}, {"pc": [5153, 6853], "errorMessage": "check self.arranger exists"}, {"pc": [6861], "errorMessage": "check self.asset_defaulted exists"}, {"pc": [6869], "errorMessage": "check self.asset_suspended exists"}, {"pc": [3131, 3577, 3967, 3979, 4320, 4533, 5944], "errorMessage": "check self.contract_type exists"}, {"pc": [1597, 4590, 5418, 5496], "errorMessage": "check self.cumulative_interest_index exists"}, {"pc": [1609, 4595, 5429, 5504], "errorMessage": "check self.cumulative_principal_index exists"}, {"pc": [5954], "errorMessage": "check self.dynamic_principal_redemption exists"}, {"pc": [1365, 1377, 1438, 1680, 2680, 2692, 3813, 4142, 4561, 4678, 4690, 4727, 5511, 6090, 6172, 6369, 6424, 6562], "errorMessage": "check self.event_cursor exists"}, {"pc": [5444, 5458, 5651, 5680, 6010, 6018, 6045, 6065, 6255, 6388, 6549], "errorMessage": "check self.fixed_point_scale exists"}, {"pc": [6298], "errorMessage": "check self.has_rate_reset_cap exists"}, {"pc": [6271], "errorMessage": "check self.has_rate_reset_floor exists"}, {"pc": [3208, 3593, 4557, 6189], "errorMessage": "check self.initial_exchange_amount exists"}, {"pc": [2478, 2488], "errorMessage": "check self.initial_exchange_date exists"}, {"pc": [1805, 4575, 5986, 6000], "errorMessage": "check self.interest_calculation_base exists"}, {"pc": [1877, 1892], "errorMessage": "check self.next_principal_redemption exists"}, {"pc": [4580, 5978, 6005, 6050], "errorMessage": "check self.nominal_interest_rate exists"}, {"pc": [2055, 2068], "errorMessage": "check self.op_daemon exists"}, {"pc": [1702, 1771, 1797, 1851, 1903, 1912, 1934, 4570, 6528, 6609], "errorMessage": "check self.outstanding_principal exists"}, {"pc": [6306, 6320], "errorMessage": "check self.rate_reset_cap exists"}, {"pc": [6279, 6293], "errorMessage": "check self.rate_reset_floor exists"}, {"pc": [6250], "errorMessage": "check self.rate_reset_multiplier exists"}, {"pc": [6643], "errorMessage": "check self.rate_reset_next exists"}, {"pc": [6263], "errorMessage": "check self.rate_reset_spread exists"}, {"pc": [1553, 2265, 4600], "errorMessage": "check self.reserved_interest exists"}, {"pc": [1558, 1587, 2275, 2290, 4605], "errorMessage": "check self.reserved_principal exists"}, {"pc": [2465, 2513, 4552, 5593, 6125], "errorMessage": "check self.reserved_units_total exists"}, {"pc": [1369, 2684, 3817, 3996, 4013, 4133, 4334, 4369, 4388, 4508, 4565, 4682, 5694, 6365, 6432], "errorMessage": "check self.schedule_entry_count exists"}, {"pc": [4041, 4416], "errorMessage": "check self.schedule_page entry exists"}, {"pc": [1545, 2155, 2183, 6715], "errorMessage": "check self.settlement_asset_id exists"}, {"pc": [1308, 1322, 2040, 2105, 2419, 2438, 2565, 2576, 2859, 3201, 3581, 3799, 3945, 4296, 4310, 4526, 4673, 5539, 6116, 6210], "errorMessage": "check self.status exists"}, {"pc": [2471, 2524, 4547, 5644, 5675, 6130], "errorMessage": "check self.total_units exists"}, {"pc": [2603, 2613], "errorMessage": "check self.transfer_closure_date exists"}, {"pc": [2586, 2594], "errorMessage": "check self.transfer_opening_date exists"}, {"pc": [3636, 3693], "errorMessage": "index access is out of bounds"}, {"pc": [2024, 3068, 3551, 4046, 4421], "errorMessage": "invalid array length header"}, {"pc": [2789, 3539, 5125], "errorMessage": "invalid number of bytes for arc4.bool"}, {"pc": [2032], "errorMessage": "invalid number of bytes for arc4.dynamic_array"}, {"pc": [3566], "errorMessage": "invalid number of bytes for arc4.dynamic_array"}, {"pc": [2018, 2403, 2543, 2551, 2781, 2839, 2847, 2927, 2935, 2978, 3003, 4746, 4770, 4804, 4985, 5167, 5251], "errorMessage": "invalid number of bytes for arc4.static_array"}, {"pc": [1303, 2361, 2370, 2411, 2560, 3529, 3930], "errorMessage": "invalid number of bytes for arc4.uint64"}, {"pc": [4794, 4975, 5241], "errorMessage": "invalid number of bytes for arc4.uint8"}, {"pc": [3040], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.InitialKernelState"}, {"pc": [3029], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.NormalizedActusTerms"}, {"pc": [4292], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.ObservedCashEventRequest"}, {"pc": [3941], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.ObservedEventRequest"}, {"pc": [3073], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.Prospectus"}, {"pc": [4815], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.RoleValidity"}, {"pc": [3057], "errorMessage": "invalid tail pointer at index 1 of (uint8[32],(len+utf8[]))"}, {"pc": [3052], "errorMessage": "invalid tuple encoding"}, {"pc": [4113, 4488], "errorMessage": "max array length exceeded"}, {"pc": [4539, 6707], "errorMessage": "overflow"}]}, "clear": {"pcOffsetMethod": "none", "sourceInfo": []}}, "templateVariables": {}}""" +_APP_SPEC_JSON = r"""{"arcs": [22, 28], "bareActions": {"call": [], "create": []}, "methods": [{"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "name": "max_event_count"}], "name": "fund_due_cashflows", "returns": {"type": "(uint64,uint64,uint64,uint64,uint64)", "struct": "CashFundingResult"}, "desc": "Reserve due ACTUS cash events into the escrow-style claim ledger.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "name": "holding_address"}, {"type": "byte[]", "name": "payment_info"}], "name": "claim_due_cashflows", "returns": {"type": "(uint64,uint64,uint64,uint64,byte[])", "struct": "CashClaimResult"}, "desc": "Withdraw the holder's already funded ACTUS cash entitlements.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "name": "open_date"}, {"type": "uint64", "name": "closure_date"}], "name": "transfer_set_schedule", "returns": {"type": "uint64"}, "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "name": "holding_address"}, {"type": "uint64", "name": "units"}], "name": "primary_distribution", "returns": {"type": "uint64"}, "desc": "Reserve units for a holder before IED finalizes issuance.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "name": "sender_holding_address"}, {"type": "address", "name": "receiver_holding_address"}, {"type": "uint64", "name": "units"}], "name": "transfer", "returns": {"type": "uint64"}, "desc": "Transfer active units after settling both counterparties to the current cursor.\nReturns the number of units moved. The ACTUS kernel no longer persists a nominal per-unit value on-chain, so transfer results are unit-based.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "bool", "desc": "Suspension status", "name": "suspended"}], "name": "account_suspension", "returns": {"type": "uint64", "desc": "Timestamp of the set account suspension status"}, "desc": "Set account suspension status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "address", "desc": "Account Payment Address", "name": "payment_address"}], "name": "account_open", "returns": {"type": "uint64", "desc": "Timestamp of the account opening"}, "desc": "Open a contract account with a new position and register its payment address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "address", "desc": "Account Payment Address", "name": "payment_address"}], "name": "account_update_payment_address", "returns": {"type": "uint64", "desc": "Timestamp of the account update"}, "desc": "Update the Payment Address of an account", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}], "name": "account_get_position", "returns": {"type": "(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64)", "desc": "Account position", "struct": "AccountPosition"}, "desc": "Get account position", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": [], "create": ["NoOp"]}, "args": [{"type": "address", "desc": "D-ASA Arranger Address", "name": "arranger"}], "name": "contract_create", "returns": {"type": "uint64", "desc": "UNIX timestamp of contract creation"}, "desc": "Create a new D-ASA contract and set the Arranger role", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64)", "desc": "Normalized ACTUS terms", "name": "terms", "struct": "NormalizedActusTerms"}, {"type": "(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "desc": "Initial kernel state (pre-IED)", "name": "initial_state", "struct": "InitialKernelState"}, {"type": "(byte[32],string)", "desc": "Prospectus (informational only)", "name": "prospectus", "struct": "Prospectus"}], "name": "contract_config", "returns": {"type": "uint64", "desc": "UNIX timestamp of contract configuration"}, "desc": "Partial contract configuration with: normalized ACTUS terms, initial kernel\nstate (pre-IED), prospectus (informational only). The contract stays inactive until all schedule pages are configured next.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "name": "schedule_page_index"}, {"type": "bool", "name": "is_last_page"}, {"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[]", "name": "schedule_page"}], "name": "contract_schedule", "returns": {"type": "uint64"}, "desc": "Upload one normalized schedule page.\nThe configuration operation is considered complete only when the last page is stored. At that point `schedule_entry_count` is finalized and the contract moves to `STATUS_PENDING_IED`.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "contract_execute_ied", "returns": {"type": "uint64"}, "desc": "Execute the first due `IED` entry and activate the contract.\n`IED` is the one non-cash event that moves the app from `STATUS_PENDING_IED` to `STATUS_ACTIVE`.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "name": "event_id"}, {"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "name": "payload", "struct": "ObservedEventRequest"}], "name": "apply_non_cash_event", "returns": {"type": "uint64"}, "desc": "Apply the next due non-cash event, optionally appending one first.\nObserved payloads are appended before execution when flagged. Rate reset events require the interest oracle because they can change the running nominal rate; other non-cash events stay arranger-controlled.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "name": "payload", "struct": "ObservedCashEventRequest"}], "name": "append_observed_cash_event", "returns": {"type": "uint64"}, "desc": "Append an arranger-authorized observed cash event to the schedule tail.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "contract_get_state", "returns": {"type": "(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "struct": "KernelState"}, "desc": "Return a readonly snapshot of the generic ACTUS kernel state.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "contract_get_next_due_event", "returns": {"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "struct": "ExecutionScheduleEntry"}, "desc": "Return the next boxed schedule entry, or a zeroed sentinel if ended.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["UpdateApplication"], "create": []}, "args": [], "name": "contract_update", "returns": {"type": "void"}, "desc": "Update D-ASA application.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "New Arranger address", "name": "new_arranger"}], "name": "rbac_rotate_arranger", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Rotate the Arranger address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Operation Daemon address", "name": "address"}], "name": "rbac_set_op_daemon", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Non-Normative: Set the Operation Daemon address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}, {"type": "(uint64,uint64)", "desc": "Role time validity", "name": "validity", "struct": "RoleValidity"}], "name": "rbac_assign_role", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Assign a role to an address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}], "name": "rbac_revoke_role", "returns": {"type": "uint64", "desc": "Timestamp of the role revocation"}, "desc": "Revoke a role from an address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Suspension status", "name": "suspended"}], "name": "rbac_contract_suspension", "returns": {"type": "uint64", "desc": "Timestamp of the set asset suspension status"}, "desc": "Set asset suspension status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "rbac_get_arranger", "returns": {"type": "address", "desc": "Arranger address"}, "desc": "Get Arranger address", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Address to get roles for", "name": "address"}], "name": "rbac_get_address_roles", "returns": {"type": "(bool,bool,bool,bool,bool)", "desc": "Roles mask: (Account Manager, Primary Dealer, Trustee, Authority, Observer)"}, "desc": "Non-normative - Get roles assigned to an address", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}], "name": "rbac_get_role_validity", "returns": {"type": "(uint64,uint64)", "desc": "Role validity", "struct": "RoleValidity"}, "desc": "Get role validity", "events": [], "readonly": true, "recommendations": {}}], "name": "DASA", "state": {"keys": {"box": {}, "global": {"arranger": {"key": "UiNBcnJhbmdlciM=", "keyType": "AVMBytes", "valueType": "address"}, "op_daemon": {"key": "UiNPcERhZW1vbiM=", "keyType": "AVMBytes", "valueType": "address"}, "asset_suspended": {"key": "YXNzZXRfc3VzcGVuZGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "asset_defaulted": {"key": "YXNzZXRfZGVmYXVsdGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "status": {"key": "c3RhdHVz", "keyType": "AVMString", "valueType": "AVMUint64"}, "contract_type": {"key": "Y29udHJhY3RfdHlwZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "prospectus_hash": {"key": "cHJvc3BlY3R1c19oYXNo", "keyType": "AVMString", "valueType": "AVMBytes"}, "prospectus_url": {"key": "cHJvc3BlY3R1c191cmw=", "keyType": "AVMString", "valueType": "AVMString"}, "denomination_asset_id": {"key": "ZGVub21pbmF0aW9uX2Fzc2V0X2lk", "keyType": "AVMString", "valueType": "AVMUint64"}, "settlement_asset_id": {"key": "c2V0dGxlbWVudF9hc3NldF9pZA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "initial_exchange_date": {"key": "aW5pdGlhbF9leGNoYW5nZV9kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "maturity_date": {"key": "bWF0dXJpdHlfZGF0ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "transfer_opening_date": {"key": "dHJhbnNmZXJfb3BlbmluZ19kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "transfer_closure_date": {"key": "dHJhbnNmZXJfY2xvc3VyZV9kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "day_count_convention": {"key": "ZGF5X2NvdW50X2NvbnZlbnRpb24=", "keyType": "AVMString", "valueType": "AVMUint64"}, "total_units": {"key": "dG90YWxfdW5pdHM=", "keyType": "AVMString", "valueType": "AVMUint64"}, "reserved_units_total": {"key": "cmVzZXJ2ZWRfdW5pdHNfdG90YWw=", "keyType": "AVMString", "valueType": "AVMUint64"}, "initial_exchange_amount": {"key": "aW5pdGlhbF9leGNoYW5nZV9hbW91bnQ=", "keyType": "AVMString", "valueType": "AVMUint64"}, "outstanding_principal": {"key": "b3V0c3RhbmRpbmdfcHJpbmNpcGFs", "keyType": "AVMString", "valueType": "AVMUint64"}, "next_principal_redemption": {"key": "bmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbg==", "keyType": "AVMString", "valueType": "AVMUint64"}, "dynamic_principal_redemption": {"key": "ZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbg==", "keyType": "AVMString", "valueType": "AVMUint64"}, "interest_calculation_base": {"key": "aW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "accrued_interest": {"key": "YWNjcnVlZF9pbnRlcmVzdA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "nominal_interest_rate": {"key": "bm9taW5hbF9pbnRlcmVzdF9yYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_spread": {"key": "cmF0ZV9yZXNldF9zcHJlYWQ=", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_multiplier": {"key": "cmF0ZV9yZXNldF9tdWx0aXBsaWVy", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_floor": {"key": "cmF0ZV9yZXNldF9mbG9vcg==", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_cap": {"key": "cmF0ZV9yZXNldF9jYXA=", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_next": {"key": "cmF0ZV9yZXNldF9uZXh0", "keyType": "AVMString", "valueType": "AVMUint64"}, "has_rate_reset_floor": {"key": "aGFzX3JhdGVfcmVzZXRfZmxvb3I=", "keyType": "AVMString", "valueType": "AVMUint64"}, "has_rate_reset_cap": {"key": "aGFzX3JhdGVfcmVzZXRfY2Fw", "keyType": "AVMString", "valueType": "AVMUint64"}, "reserved_principal": {"key": "cmVzZXJ2ZWRfcHJpbmNpcGFs", "keyType": "AVMString", "valueType": "AVMUint64"}, "reserved_interest": {"key": "cmVzZXJ2ZWRfaW50ZXJlc3Q=", "keyType": "AVMString", "valueType": "AVMUint64"}, "cumulative_interest_index": {"key": "Y3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "cumulative_principal_index": {"key": "Y3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXg=", "keyType": "AVMString", "valueType": "AVMUint64"}, "event_cursor": {"key": "ZXZlbnRfY3Vyc29y", "keyType": "AVMString", "valueType": "AVMUint64"}, "schedule_entry_count": {"key": "c2NoZWR1bGVfZW50cnlfY291bnQ=", "keyType": "AVMString", "valueType": "AVMUint64"}, "fixed_point_scale": {"key": "Zml4ZWRfcG9pbnRfc2NhbGU=", "keyType": "AVMString", "valueType": "AVMUint64"}}, "local": {}}, "maps": {"box": {"account_manager": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNBY2NvdW50TWFuYWdlciM="}, "primary_dealer": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNQcmltYXJ5RGVhbGVyIw=="}, "trustee": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNUcnVzdGVlIw=="}, "authority": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNBdXRob3JpdHkj"}, "observer": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNPYnNlcnZlciM="}, "schedule_page": {"keyType": "uint64", "valueType": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[]", "prefix": "UyM="}, "account": {"keyType": "address", "valueType": "AccountPosition", "prefix": "UiNBY2NvdW50Iw=="}}, "global": {}, "local": {}}, "schema": {"global": {"bytes": 4, "ints": 37}, "local": {"bytes": 0, "ints": 0}}}, "structs": {"AccountPosition": [{"name": "payment_address", "type": "address"}, {"name": "units", "type": "uint64"}, {"name": "reserved_units", "type": "uint64"}, {"name": "suspended", "type": "bool"}, {"name": "settled_cursor", "type": "uint64"}, {"name": "interest_checkpoint", "type": "uint64"}, {"name": "principal_checkpoint", "type": "uint64"}, {"name": "claimable_interest", "type": "uint64"}, {"name": "claimable_principal", "type": "uint64"}], "CashClaimResult": [{"name": "interest_amount", "type": "uint64"}, {"name": "principal_amount", "type": "uint64"}, {"name": "total_amount", "type": "uint64"}, {"name": "timestamp", "type": "uint64"}, {"name": "context", "type": "byte[]"}], "CashFundingResult": [{"name": "funded_interest", "type": "uint64"}, {"name": "funded_principal", "type": "uint64"}, {"name": "total_funded", "type": "uint64"}, {"name": "processed_events", "type": "uint64"}, {"name": "timestamp", "type": "uint64"}], "ExecutionScheduleEntry": [{"name": "event_id", "type": "uint64"}, {"name": "event_type", "type": "uint8"}, {"name": "scheduled_time", "type": "uint64"}, {"name": "accrual_factor", "type": "uint64"}, {"name": "redemption_accrual_factor", "type": "uint64"}, {"name": "next_nominal_interest_rate", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "next_outstanding_principal", "type": "uint64"}, {"name": "flags", "type": "uint64"}], "InitialKernelState": [{"name": "status_date", "type": "uint64"}, {"name": "event_cursor", "type": "uint64"}, {"name": "outstanding_principal", "type": "uint64"}, {"name": "interest_calculation_base", "type": "uint64"}, {"name": "nominal_interest_rate", "type": "uint64"}, {"name": "accrued_interest", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "cumulative_interest_index", "type": "uint64"}, {"name": "cumulative_principal_index", "type": "uint64"}], "KernelState": [{"name": "contract_type", "type": "uint8"}, {"name": "status", "type": "uint64"}, {"name": "total_units", "type": "uint64"}, {"name": "reserved_units_total", "type": "uint64"}, {"name": "initial_exchange_amount", "type": "uint64"}, {"name": "event_cursor", "type": "uint64"}, {"name": "schedule_entry_count", "type": "uint64"}, {"name": "outstanding_principal", "type": "uint64"}, {"name": "interest_calculation_base", "type": "uint64"}, {"name": "nominal_interest_rate", "type": "uint64"}, {"name": "accrued_interest", "type": "uint64"}, {"name": "cumulative_interest_index", "type": "uint64"}, {"name": "cumulative_principal_index", "type": "uint64"}, {"name": "reserved_interest", "type": "uint64"}, {"name": "reserved_principal", "type": "uint64"}], "NormalizedActusTerms": [{"name": "contract_type", "type": "uint8"}, {"name": "denomination_asset_id", "type": "uint64"}, {"name": "settlement_asset_id", "type": "uint64"}, {"name": "total_units", "type": "uint64"}, {"name": "notional_principal", "type": "uint64"}, {"name": "initial_exchange_amount", "type": "uint64"}, {"name": "initial_exchange_date", "type": "uint64"}, {"name": "maturity_date", "type": "uint64"}, {"name": "day_count_convention", "type": "uint8"}, {"name": "rate_reset_spread", "type": "uint64"}, {"name": "rate_reset_multiplier", "type": "uint64"}, {"name": "rate_reset_floor", "type": "uint64"}, {"name": "rate_reset_cap", "type": "uint64"}, {"name": "rate_reset_next", "type": "uint64"}, {"name": "has_rate_reset_floor", "type": "bool"}, {"name": "has_rate_reset_cap", "type": "bool"}, {"name": "dynamic_principal_redemption", "type": "bool"}, {"name": "fixed_point_scale", "type": "uint64"}], "ObservedCashEventRequest": [{"name": "event_id", "type": "uint64"}, {"name": "event_type", "type": "uint8"}, {"name": "scheduled_time", "type": "uint64"}, {"name": "accrual_factor", "type": "uint64"}, {"name": "redemption_accrual_factor", "type": "uint64"}, {"name": "next_nominal_interest_rate", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "next_outstanding_principal", "type": "uint64"}, {"name": "flags", "type": "uint64"}], "ObservedEventRequest": [{"name": "event_id", "type": "uint64"}, {"name": "event_type", "type": "uint8"}, {"name": "scheduled_time", "type": "uint64"}, {"name": "accrual_factor", "type": "uint64"}, {"name": "redemption_accrual_factor", "type": "uint64"}, {"name": "observed_rate", "type": "uint64"}, {"name": "next_nominal_interest_rate", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "next_outstanding_principal", "type": "uint64"}, {"name": "flags", "type": "uint64"}], "Prospectus": [{"name": "hash", "type": "byte[32]"}, {"name": "url", "type": "string"}], "RoleValidity": [{"name": "role_validity_start", "type": "uint64"}, {"name": "role_validity_end", "type": "uint64"}]}, "byteCode": {"approval": "DCAFAAEIINwLJjEEFR98dQZzdGF0dXMMZXZlbnRfY3Vyc29yFHNjaGVkdWxlX2VudHJ5X2NvdW50FW91dHN0YW5kaW5nX3ByaW5jaXBhbBFmaXhlZF9wb2ludF9zY2FsZRBhY2NydWVkX2ludGVyZXN0GWludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UKUiNBY2NvdW50IxVub21pbmFsX2ludGVyZXN0X3JhdGUNY29udHJhY3RfdHlwZRRyZXNlcnZlZF91bml0c190b3RhbBJyZXNlcnZlZF9wcmluY2lwYWwLdG90YWxfdW5pdHMZbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbhFyZXNlcnZlZF9pbnRlcmVzdBljdW11bGF0aXZlX2ludGVyZXN0X2luZGV4GmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4C1IjQXJyYW5nZXIjE3NldHRsZW1lbnRfYXNzZXRfaWQXaW5pdGlhbF9leGNoYW5nZV9hbW91bnQMUiNBdXRob3JpdHkjEFIjUHJpbWFyeURlYWxlciMRUiNBY2NvdW50TWFuYWdlciMCUyMLUiNPYnNlcnZlciMLUiNPcERhZW1vbiMVaW5pdGlhbF9leGNoYW5nZV9kYXRlFXRyYW5zZmVyX29wZW5pbmdfZGF0ZRV0cmFuc2Zlcl9jbG9zdXJlX2RhdGUQcmF0ZV9yZXNldF9mbG9vcg5yYXRlX3Jlc2V0X2NhcApSI1RydXN0ZWUjD2Fzc2V0X3N1c3BlbmRlZBxkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uEXJhdGVfcmVzZXRfc3ByZWFkFXJhdGVfcmVzZXRfbXVsdGlwbGllcg9yYXRlX3Jlc2V0X25leHQUaGFzX3JhdGVfcmVzZXRfZmxvb3ISaGFzX3JhdGVfcmVzZXRfY2FwAQAPYXNzZXRfZGVmYXVsdGVkD3Byb3NwZWN0dXNfaGFzaA5wcm9zcGVjdHVzX3VybBVkZW5vbWluYXRpb25fYXNzZXRfaWQNbWF0dXJpdHlfZGF0ZRRkYXlfY291bnRfY29udmVudGlvbgMGgQECAAAxGEAArScSMgNnJxoyA2cnISJnJykiZykiZycKImcnKoAAZycrgABnJywiZycTImcnGyJnJy0iZyccImcnHSJnJy4iZycNImcnCyJnJxQiZycEImcnDiJnJyIiZycHImcnBiJnJwkiZycjImcnJCJnJx4iZycfImcnJSJnJyYiZycnImcnDCJnJw8iZycQImcnESJnKiJnKyJnJwUiZzE1gQQSRDE0gSUSRDE3FEQxNhREgASRTwTrNhoAjgEAxzEZFEQxGEEAsIIYBLRGGMgE54MlKQSUOIcjBGyF4+4EvdGpRAR8DxgSBBT8EO8EdKcpfwQJ1P4UBJqb+oUEhe7TPQSrLA/EBNnyJawEmINQWgSOpudMBAKvVXoEgvcbLQTvBPXTBN80NVAEPb6AvQQePkjnBAEMgpkEdAas0gQacqLuNhoAjhgAVgMhBH0EpwUxBiEGWwazBuYHFAkICh8KmAwEDPYNiQ3ODeYN/g6zD0kPaA9zD70AgASVbXFWNhoAjgEG8QAxGYEEEjEYEERCDa6KAgCL/oEKCIsAMgwNQQAqsYEGshCBBbIZJy+yHicvsh+L/40CAAsABLNC/9syALIBQv/1IrIBQv/viSKAAEcNNhoBSRUkEkQXIillRESIFZ6IFaWIFaoiKWVEgTISFESIEgFBAAtJgWQLIQQIIoj/jyJFBSJFDiJFDUsESwEMQQJZIiplRCIrZUQMQQJNIiplRIgQ00lFEYEJW0lFAzIHDUACN0sPJFVJRRAkEklFBEAAEEsOgQMSQAAISw6BExJBAj8jQQIUSw8iWyIqZUQSREsBMgcOREsCQAHtSw6BExJAAeUiRQtLDyRVSUUQgQMSQAFlSw6BExJAAV0iRQZLD4ExW0UIiBFbQAD+SwdFCUsKiBAZSwaIEBRLAYgQLklOAkUPSYgQJUlFC0sCSwEISUUJMgoiJxNlRHAARCInD2VEIicMZURLAQhLAksBD0RPAkwJTwIPRE8DCCcPTGciJwxlRAgnDExnIicQZURPAggnEExnIicRZUQIJxFMZ0sPJFWBAxJBAHoiJwZlREsQiBDnRRIIJwZMZ4gQx0EACksPJFWBExJBAAlLD4EpWycOTGcnBEsIZycHSwlnIiplRCMIKkxnSw9XCAGAAROoQQARIicEZURAAAkpgcgBZycHImdLD0sESYgTVEhLDUsMCEUOSwxLBwhFDUsEIwhFBUL+dycGImdC/5BLDyRVSUUQgQMSQQAQIicEZURLBglJRQlFCUL+6UsOJBJBABMiJwRlTEUJRCInB2VMRQpEQv7PSw6BExJAAAdLB0UJQv7AIkUIIkUJQv63iBAIQQBWSw6BExJBAAoiJwRlREUGQv6OIicGZURLEIgP/0USCElFCyInDmVED0EABiJFBkL+byInDmVESwoJSUUIIicEZUQNQQAKIicEZURFBkL+UUsGRQZC/kpLD4ExWyInBGVESg5ETAlFBkL+NiInBmVESxCID6dFEghFC0L+DEsESURLDklLD0lOAwgyB08CFk8DFlBPAhZQTwIWUEwWUChMULAjQyJC/b6AAEcCNhoBRwIVJRJENhoCSSJZgQIISwEVEkRXAgBMIillREQnCExQSb1FAUQiJxplRDIDE0EAIjEAIicaZUQSQAAVMQBLAxJAAA0xAEsBvkRXACASQQEAI0SIEpaIEpsiKWVEgTISFERLAkmIDUuIDM5GAkm+REmBSVtJTgJFCEmBUVtJRQhPAghJRQZEVwAgIicTZURwAEUBQQC3Sb5EgYADU0AArSNBAHgyCiInE2VETEsBcABESwVJTgIPREsCSU4DvkRJVwAgsTIATwOyEkyyFE8CshGBBLIQsgGzSYFJW0lOAkUJSYFRW0lOA0UJIhZMSwFcSUxcUU8DTL8iJw9lRElLAg9EIicMZURLAw9ETAknD0xnIicMZURMCScMTGdLBUlLBklOAwgyB08CFk8DFlBPAhZQTBZQSwJJFRZXBgJMUEyAAgAiUExQKExQsCNDIkL/UCJC/v02GgFJFSQSRBc2GgJJFSQSRBeIEXhKDEQnHE8CZycdTGcyBxYoTFCwI0M2GgFJFSUSRDYaAkkVJBJEF0lOAiIpZUREJxYxAIgRD0SIEUmIEU4iKWVEgTISRCcISwJQSU4DvUUBREyIC2pJRCInC2VECCInDWVEDkQiJxtlREEACTIHIicbZUQOREcCvkSBKFtLA0lOAwgWgShMuyInC2VECCcLSwFnIicNZURMCRYoTFCwI0MiSTYaAUkVJRJENhoCSRUlEkQ2GgNHAhUkEkQXIillRESIEL+IEMQiKWVEgTISFEQiJxxlREEACSInHGVEMgcORCInHWVEQQAJMgciJx1lRAxEMQBLBElOAhJEJwhLAVBJRQhJvUUBRCcISwVJTgJQSUUJvUUBREsCiAqjSYgKn08CE0RLAUlETL5EJVsORCIqZUQiK2VED0AADiIqZUSIC7CBCVsyBw1ESwNJiAr7SwNJTgKICvOICnZGAogKcUYCSwVJvkQlW0sCSU4CSwEOREsBCRZPAiVPArtLBUm+RCVbTwIIFiVMuyhLAlCwI0M2GgFJFSUSRDYaAkkVIxJEIlMnFTEAiA+cRCcITwJQSb1FAURJgTAjuiJPA1SBMEy7MgcWKExQsCNDNhoBSRUlEkQ2GgJJFSUSRCcXMQCID2REIillRIHIARIURIgPlIgPmScITwJQSb1FARREIhZPAksBUEsBUCcoUEsBUEsBUEsBUEsBUExQvzIHFihMULAjQzYaAUkVJRJENhoCSRUlEkQnCEsCUEm9RQFEMQBPAxJEiA8+iA9DIk8CuzIHFihMULAjQzYaAUkVJRJEJwhMUEm9RQFEvkgoTFCwI0M2GgFJFSUSRCcSTGcyBxYoTFCwI0OAAEk2GgFHAhWBaxJENhoCSU4CFYFIEkQ2GgNJTgJJFUsBJVlJgSISRE8CTEsCUklOAyJZgSQIEkSIDroiVUknCksBZ0EAIkkjEkAAHEmBAhJAABVJgQMSQAAOSYEEEkAAB0mBBRJBAYcjRCInCmVMRQJESwRJgSFbSUUIRIE5VUlFCEEAH0sGIxJAABhLBoECEkAAEEsGgQMSQAAISwaBBBJBAUcjREkjE0EACEsEgZIGUxREIillRBREIicUZUQUREsESSNbSXELRQFEJyxLAWdLAYEJW0lPAhJEJxNLAWexMgAyCiKyErIUTLIRgQSyELIBs0mBEVsnDUxnJwsiZycuSwhnSYEpWycbSwFnSwGBMVsnLUsBZ0sGSU4CgTBbJw5MZycUSwpnSwOBkgZTJyJMZ0sBgRBbJwRMZ0sBgShbJwZMZ0sBJVsnCUxnSwGBGFsnB0xnSwOBOlsnI0xnSwOBQlsnJExnSwOBSlsnHkxnSwOBUlsnH0xnSwOBWlsnJUxnSwOBkAZTJyZMZ0sDgZEGUycnTGdPA4FjWycFTGdLASRbKkxnSwGBOFsnEExnSwGBQFsnEUxnJw8iZycMImdLAjIHDURMIltLAgxEDERLAlcAICcqTGdLAVcCACcrTGcyBxYoTFCwI0MiQv62IkL+diKAAEcCNhoBSRUkEkQXSTYaAkkVIxJEIlNMNhoDSU4CSSJZSU4DSYFBC4ECCE8CFRJEiAzNIicKZUxOA0QiKWVEFERJgRAORCInFGVEREyBEAtMgWQLIQQIIoj2tiJJSwQMQQCLSwRXAgBJRQxLAUlOAoFBC4FBWEkkVUlOAkUNSSJbSUUNSwVPBAhLARJESwVPA4gIGUyBCVtJRQpEQQAXSUEAJUkjCYFBC0sLTIFBWIEJW0sIDkRLCEAABUsJIxJESSMIRQFC/5RLBklEIwkWJxhMUEm9RQFESSKBAroXSUQjCYFBC4ECCIFBukL/wUsGFicYTFBJvEhLBb9LBUEADEsBSwQIK0xnKYEyZzIHFihMULAjQyIpZUREiAvjiAvqiAvvIiplRCIrZURLAQ1EiAdHSVcIAUmAAQGoREsBVwAISwJXCQhLA1cRCEsEVxkISwVXIQhLBlcpCEsHVzEISwhXOQhPB08IUE8HUE8GUE8FUCIWUE8EUE8DUE8CUExQiAh5RgIyBxYoTFCwI0MiRwSAAEk2GgFJFSQSRBc2GgJHAhWBSRJEIillRESIC1uIC2CBQVtJgQQaQQCwIicKZUSBBRJEiAs4IicKZURJgQUSREsCSSJbSUUHIitlRBJESVcIAUUMJFWIBsIiK2VEgRAKJzBFBxYnGExQSUUJvUUBQQAHSwe+TEUHREsFSSJZSYEQDERLA0lXCQhLAVcRCEsCVxkISwNXKQhLBFcxCE8FVzkISwsWSxJQTwZQTwVQTwRQTwNQTwJQTFBLAxZQTwJMUEwjCBZXBgJcAEsISbxITL8iK2VEIwgrTGciKmVESwNJTwISRIgF/0lFCElXCAFFCiRVSUUGIxJAAChLBIEEEkAAIEsEgQwSQAAYSwSBCxJAABBLBIESEkAACEsEgQUSQQBBI0RLCIABAalESwSBDBJAAAhLBIELEkEAJCNBABonGTEAiAnzREsGSwKIBxtGAjIHFihMULAjQ4gKEUL/6CJC/9kiQv+8Ikk2GgFHAhWBQRJEIillRESICfKICfmICf4iKWVEgTISFEQiJwplRIEFEkRJIltJTgIiK2VETEsBEkRLAVcIAUlOA4ABA6hETIE5W0lOAiMaREEAEyIrZUQjCYgFIYEJW0sEgQlbDkQiK2VEgRAKJzBFBhYnGExQSUUHvUUBQQAHSwW+TEUGREsESSJZSYEQDERLBUlXCQhLAVcRCEsCVxkISwNXIQhLBFcpCE8FVzEISwoWSwpQTwZQTwVQTwRQTwNQTwJQTFBLAxZQTwJMUEwjCBZXBgJcAEsGSbxITL8iK2VEIwgrTGcyBxYoTFCwI0MiKWVESUQiJwplRBZJkyQORFcHASInDWVEIicLZUQiJxRlRCIqZUQiK2VEIicEZUQiJwdlRCInCWVEIicGZUQiJxBlRCInEWVEIicPZUQiJwxlRE8OFk8OTFBPDRZQTwwWUE8LFlBPChZQTwkWUE8IFlBPBxZQTwYWUE8FFlBPBBZQTwMWUE8CFlBMFlAoTFCwI0MiKWVERCIqZUQiK2VED0EAJSIqZUQWJyhQIhZMSwFQSwFQSwFQSwFQSwFQSwFQTFAoTFCwI0MiKmVEiAO9Qv/wiAg+I0M2GgFJFSUSRIgIMScSTGcyBxYoTFCwI0M2GgFJFSUSRIgIGScaTGcyBxYoTFCwI0M2GgFJFSMSRDYaAklOAhUlEkQ2GgNJTgIVgRASRIgH7IgH8xdHAogH/YEUEkEADicSSwNnMgcWKExQsCNDSYEoEkEAEScXSwNQSb1FARRESwK/Qv/fSYEyEkEAEScWSwNQSb1FARRESwK/Qv/HSYE8EkEAEScgSwNQSb1FARRESwK/Qv+vSYFGEkEAEScVSwNQSb1FARRESwK/Qv+XSYFQEkH/kCcZSwNQSb1FARRESwK/Qv9/NhoBSRUjEkQ2GgJJTgIVJRJEiAdCiAdJF0cCiAdTSYEUE0SBKBJBABUnF0sCUEm9RQFEvEgyBxYoTFCwI0NJgTISQQAPJxZLAlBJvUUBRLxIQv/hSYE8EkEADycgSwJQSb1FAUS8SEL/y0mBRhJBAA8nFUsCUEm9RQFEvEhC/7VJgVASQf+uJxlLAlBJvUUBRLxIQv+fNhoBSRUjEkQiUycVMQCIBnxEJyFMZzIHFihMULAjQyInEmVEKExQsCNDNhoBSRUlEkQnF0sBiAZUJxZLAogGTScgSwOIBkYnFUsEiAY/JxlPBYgGOCcoIk8GVCNPBVSBAk8EVIEDTwNUgQRPAlQoTFCwI0M2GgFJFSMSRDYaAklOAhUlEkQXSYgGUIMGFCgyPEZQTwaOBgBPAEAAMQAiABMAAQAnGUsBUEm9RQFEvkgoTFCwI0MnFUsBUEm9RQFEvkhC/+snIEsBUEm9RQFEvkhC/9wnFksBUEm9RQFEvkhC/80nF0sBUEm9RQFEvkhC/76AEAAAAAAAAAAAAAAAAAAAAABC/6mKAQAnCIv/UL5EgYADUxREiYoBAicIi/9QSb1FAURJvkgiJxBlREsBgTlbCSInEWVESwKBQVsJSwIlWyInBWVETwNLAk8CiACYIicFZURPA08DTwKIAIpLAoFJW0sCCBZPA0xcSUmBUVtLAggWXFEiJxBlRBZcOSInEWVEFlxBIiplRBZcMU8DTL+JigEAIoAAJwiL/1BJvUUBRCIpZUSBMhJBAAGJiwK+TElOAowARIEoW0mMAUAAAYmLAEklW4sBSU4DCBZcICIWXCiLAky/IicLZURJSwIPREwJJwtMZ4mKAwGL/UEABYv+QAACIomL/Yv+HYv/l4mKAQGL/0AAAiKJIicNZURJRCInBWVEi/9MTwKI/8qJigEBi/9AAAIiiSInDWVEIicFZUSL/0yI/6+JigEBIitlRIv/DUSL/4EQChYnGExQSb1FAUSL/4EQGEsBIoECuhdLAQ1EgUELgQIIgUG6iYoCAIv/IxJAAB+L/yQSQAAYi/+BExJAABCL/4EMEkAACIv/gQsSQQADI0SJi/5AAAQiQv/1i/6BAxJAAAiL/oECEkEAGIv/gQMSQAAIi/+BEhJBAAQjQv/RIkL/zYv+IxJBACCL/4EDEkAAEIv/gRISQAAIi/+BBRJBAAQjQv+qIkL/pov+gQQSQQAoi/+BAxJAABiL/4EEEkAAEIv/gRISQAAIi/+BBRJBAAQjQv96IkL/dov+gQUSQQAIi/+BAxJC/2YiQv9iIicKZUQjEkEACiInImVEQQACI4kiiYoBAov/gRFbSUEAECInCWVEQQAIIicHZURAAAYii/9PAokiJwdlRCInCWVEIicFZUSI/mgiJwVlRIsATIj+XYv/TwKJigIBi/9AAAOL/okiJwVlRCInCWVEi/9LAoj+PAhJRCInBWVEi/5MTwKI/iyJigICIoAARwiL/iJbIiplRBJEi/6BCVsyBw5Ei/4kVUkjEklBAF4iKWVEgTISRCInC2VEIicNZUQSRIv+gTFbJwRLAWcnB0xni/6BIVsnCUxnJwYiZ4v+gSlbJw5MZyIqZUQjCCpMZymBZGeLC0QiJxRlRIv+TCKIAdpJjP6L/4wBjACJIillRIEyEhREIicGZUSL/oj++Iz+CCcGTGeLCoEMEkEBeIv/gSFbIickZUQiJwVlRIj9cyInI2VECIwGIicmZURBABMiJx5lRIsGDUEACCInHmVMjAZEIicnZURBABMiJx9lRIsGDEEACCInH2VMjAZEJwmLBmeLCoEEEkEBB4v+gTFbJwRLAWcnB0xniP5lQQDniwqBBRJBAMUiK2VEIiplRAmBZAshBAgiiOvjIicFZUyMAkQijAEijAeL/oEZW0mMCEEAD4sCiwiI/oFJjAIjjAeMASIqZUQjCIwDIitlRIsDDUEAUosDiP0MSYwAJFVJjASBAxJAABCLBIETEkEAM4sAgRlbQQArI0EACIsHQQAMIowHiwMjCIwDQv++iwCBGVuLAkyI/iRJjAKLAQiMAUL/4SJC/9KLAUQiJwRlRIv+gTlbJBpAAAYiJwZlRAgiJwVlRIsBiPxLJw5MZyIqZUQjCCpMZ4v+IkmIAGBJjP6L/4wBjACJi/6BKVsnDkxnQv/aiwqBEhJB/v8iJwRlRCcHTGdC/vOLCoELEkEAG4v+gSFbSYwFQAAIIiclZUyMBUQnCYsFZ0L+uov+gSFbSYwJQf6vJwmLCWdC/qeKAwEyCIv9IluL/VcIAYv9VwkIMgeL/SRVi/5AAEUjFkmTJA5EVwcBIicTZUSLAUkjCIsAFk8CFlCLAlCLA1CLBBZQi/4WUE8DUIv/FlBPAhZQTBZQgASaMyuVTFCwi/2MAImLBSMSQAAIiwWBBBJBAAQjQv+pgf8BQv+jigIBgACL/ov/UEm9RQFBAB+LAb5EIlsyB0mMAA5BABCLAb5EJFuLAA9BAAQjjACJIkL/+TEAIicSZUQSRIkiJyllRBREiSInIWVEFESJigEAi/+BFBJAADCL/4EZEkAAKIv/gSgSQAAgi/+BMhJAABiL/4E8EkAAEIv/gUYSQAAIi/+BUBJBAAMjRIkiQv/6", "clear": "DIEBQw=="}, "desc": "Debt Algorand Standard Application.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "networks": {}, "source": {"approval": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCAzMiAxNTAwCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUgInN0YXR1cyIgImV2ZW50X2N1cnNvciIgInNjaGVkdWxlX2VudHJ5X2NvdW50IiAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIiAiZml4ZWRfcG9pbnRfc2NhbGUiICJhY2NydWVkX2ludGVyZXN0IiAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIgMHg1MjIzNDE2MzYzNmY3NTZlNzQyMyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIiAiY29udHJhY3RfdHlwZSIgInJlc2VydmVkX3VuaXRzX3RvdGFsIiAicmVzZXJ2ZWRfcHJpbmNpcGFsIiAidG90YWxfdW5pdHMiICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIiAicmVzZXJ2ZWRfaW50ZXJlc3QiICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IiAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiIDB4NTIyMzQxNzI3MjYxNmU2NzY1NzIyMyAic2V0dGxlbWVudF9hc3NldF9pZCIgImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IiAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzIDB4NTIyMzQxNjM2MzZmNzU2ZTc0NGQ2MTZlNjE2NzY1NzIyMyAweDUzMjMgMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzIDB4NTIyMzRmNzA0NDYxNjU2ZDZmNmUyMyAiaW5pdGlhbF9leGNoYW5nZV9kYXRlIiAidHJhbnNmZXJfb3BlbmluZ19kYXRlIiAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIiAicmF0ZV9yZXNldF9mbG9vciIgInJhdGVfcmVzZXRfY2FwIiAweDUyMjM1NDcyNzU3Mzc0NjU2NTIzICJhc3NldF9zdXNwZW5kZWQiICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIiAicmF0ZV9yZXNldF9zcHJlYWQiICJyYXRlX3Jlc2V0X211bHRpcGxpZXIiICJyYXRlX3Jlc2V0X25leHQiICJoYXNfcmF0ZV9yZXNldF9mbG9vciIgImhhc19yYXRlX3Jlc2V0X2NhcCIgMHgwMCAiYXNzZXRfZGVmYXVsdGVkIiAicHJvc3BlY3R1c19oYXNoIiAicHJvc3BlY3R1c191cmwiICJkZW5vbWluYXRpb25fYXNzZXRfaWQiICJtYXR1cml0eV9kYXRlIiAiZGF5X2NvdW50X2NvbnZlbnRpb24iIDB4MDY4MTAxIDB4MDAwMAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4LTI5CiAgICAvLyAjIFJCQUMgUm9sZXMKICAgIC8vIHNlbGYuYXJyYW5nZXIgPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX0FSUkFOR0VSKQogICAgYnl0ZWMgMTggLy8gMHg1MjIzNDE3MjcyNjE2ZTY3NjU3MjIzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzAKICAgIC8vIHNlbGYub3BfZGFlbW9uID0gR2xvYmFsU3RhdGUoQWNjb3VudCgpLCBrZXk9Y3N0LlBSRUZJWF9JRF9PUF9EQUVNT04pCiAgICBieXRlYyAyNiAvLyAweDUyMjM0ZjcwNDQ2MTY1NmQ2ZjZlMjMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo0Ny00OAogICAgLy8gIyBELUFTQSBHb3Zlcm5hbmNlCiAgICAvLyBzZWxmLmFzc2V0X3N1c3BlbmRlZCA9IEZhbHNlCiAgICBieXRlYyAzMyAvLyAiYXNzZXRfc3VzcGVuZGVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NDkKICAgIC8vIHNlbGYuYXNzZXRfZGVmYXVsdGVkID0gRmFsc2UKICAgIGJ5dGVjIDQxIC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU2LTU3CiAgICAvLyAjIENvbnRyYWN0CiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwLTYxCiAgICAvLyAjIFByb3NwZWN0dXMgKEluZm9ybWF0aW9uYWwpCiAgICAvLyBzZWxmLnByb3NwZWN0dXNfaGFzaCA9IEJ5dGVzKCkKICAgIGJ5dGVjIDQyIC8vICJwcm9zcGVjdHVzX2hhc2giCiAgICBwdXNoYnl0ZXMgMHgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MgogICAgLy8gc2VsZi5wcm9zcGVjdHVzX3VybCA9IFN0cmluZygpCiAgICBieXRlYyA0MyAvLyAicHJvc3BlY3R1c191cmwiCiAgICBwdXNoYnl0ZXMgIiIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NC02NQogICAgLy8gIyBEZW5vbWluYXRpb24KICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gQXNzZXQoKQogICAgYnl0ZWMgNDQgLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjYKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCA9IEFzc2V0KCkKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OC02OQogICAgLy8gIyBUaW1lCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgMjcgLy8gImluaXRpYWxfZXhjaGFuZ2VfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzAKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgNDUgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxCiAgICAvLyBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgMjggLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIKICAgIC8vIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlID0gdHlwLlRpbWVTdGFtcCgpCiAgICBieXRlYyAyOSAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NC03NQogICAgLy8gIyBEYXkgQ291bnQgQ29udmVudGlvbgogICAgLy8gc2VsZi5kYXlfY291bnRfY29udmVudGlvbiA9IFVJbnQ2NCgpCiAgICBieXRlYyA0NiAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc3LTc4CiAgICAvLyAjIFVuaXRzCiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzID0gVUludDY0KCkKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPSBVSW50NjQoKQogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MS04MgogICAgLy8gIyBQcmluY2lwYWwKICAgIC8vIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPSBVSW50NjQoKQogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MwogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBVSW50NjQoKQogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NAogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gVUludDY0KCkKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NQogICAgLy8gc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gRmFsc2UKICAgIGJ5dGVjIDM0IC8vICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4Ny04OAogICAgLy8gIyBJbnRlcmVzdAogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gVUludDY0KCkKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg5CiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgPSBVSW50NjQoKQogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTEtOTIKICAgIC8vICMgSW50ZXJlc3QgUmF0ZXMKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTMKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQgPSBVSW50NjQoKQogICAgYnl0ZWMgMzUgLy8gInJhdGVfcmVzZXRfc3ByZWFkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NAogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIgPSBVSW50NjQoKQogICAgYnl0ZWMgMzYgLy8gInJhdGVfcmVzZXRfbXVsdGlwbGllciIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTUKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9mbG9vciA9IFVJbnQ2NCgpCiAgICBieXRlYyAzMCAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTYKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9jYXAgPSBVSW50NjQoKQogICAgYnl0ZWMgMzEgLy8gInJhdGVfcmVzZXRfY2FwIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NwogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X25leHQgPSBVSW50NjQoKQogICAgYnl0ZWMgMzcgLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTgKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgPSBGYWxzZQogICAgYnl0ZWMgMzggLy8gImhhc19yYXRlX3Jlc2V0X2Zsb29yIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OQogICAgLy8gc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgPSBGYWxzZQogICAgYnl0ZWMgMzkgLy8gImhhc19yYXRlX3Jlc2V0X2NhcCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAxLTEwMgogICAgLy8gIyBQcmltYXJ5IERpc3RyaWJ1dGlvbgogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgPSBVSW50NjQoKQogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAzCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0ID0gVUludDY0KCkKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA1LTEwNgogICAgLy8gIyBDdW11bGF0aXZlIFBlci1Vbml0IEZpeGVkLVBvaW50IEluZGV4ZXMKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4ID0gVUludDY0KCkKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1CiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciA9IFVJbnQ2NCgpCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNgogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA9IFVJbnQ2NCgpCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE4LTExOQogICAgLy8gIyBTY2FsaW5nCiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlID0gVUludDY0KCkKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6MjMKICAgIC8vIGFzc2VydCBUeG4uZ2xvYmFsX251bV9ieXRlX3NsaWNlID09IGNmZy5HTE9CQUxfQllURVMsIGVyci5XUk9OR19HTE9CQUxfQllURVMKICAgIHR4biBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgQnl0ZXMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjI0CiAgICAvLyBhc3NlcnQgVHhuLmdsb2JhbF9udW1fdWludCA9PSBjZmcuR0xPQkFMX1VJTlRTLCBlcnIuV1JPTkdfR0xPQkFMX1VJTlRTCiAgICB0eG4gR2xvYmFsTnVtVWludAogICAgcHVzaGludCAzNwogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgVUludHMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBhc3NlcnQgVHhuLmxvY2FsX251bV9ieXRlX3NsaWNlID09IGNmZy5MT0NBTF9CWVRFUywgZXJyLldST05HX0xPQ0FMX0JZVEVTCiAgICB0eG4gTG9jYWxOdW1CeXRlU2xpY2UKICAgICEKICAgIGFzc2VydCAvLyBXcm9uZyBMb2NhbCBCeXRlcyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6MjYKICAgIC8vIGFzc2VydCBUeG4ubG9jYWxfbnVtX3VpbnQgPT0gY2ZnLkxPQ0FMX1VJTlRTLCBlcnIuV1JPTkdfTE9DQUxfVUlOVFMKICAgIHR4biBMb2NhbE51bVVpbnQKICAgICEKICAgIGFzc2VydCAvLyBXcm9uZyBMb2NhbCBVSW50cyBhbGxvY2F0aW9uCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kX2FzYS9jb250cmFjdC5weTo4LTE4CiAgICAvLyBjbGFzcyBEQVNBKAogICAgLy8gICAgIFBheW1lbnRBZ2VudCwKICAgIC8vICAgICBUcmFuc2ZlckFnZW50LAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gICAgIGF2bV92ZXJzaW9uPTEyLAogICAgLy8gKToKICAgIHB1c2hieXRlcyAweDkxNGYwNGViIC8vIG1ldGhvZCAiY29udHJhY3RfdXBkYXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9jb250cmFjdF91cGRhdGVfcm91dGVANAoKbWFpbl9zd2l0Y2hfY2FzZV9uZXh0QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6OC0xOAogICAgLy8gY2xhc3MgREFTQSgKICAgIC8vICAgICBQYXltZW50QWdlbnQsCiAgICAvLyAgICAgVHJhbnNmZXJBZ2VudCwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBhdm1fdmVyc2lvbj0xMiwKICAgIC8vICk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBieiBtYWluX2NyZWF0ZV9Ob09wQDMyCiAgICBwdXNoYnl0ZXNzIDB4YjQ0NjE4YzggMHhlNzgzMjUyOSAweDk0Mzg4NzIzIDB4NmM4NWUzZWUgMHhiZGQxYTk0NCAweDdjMGYxODEyIDB4MTRmYzEwZWYgMHg3NGE3Mjk3ZiAweDA5ZDRmZTE0IDB4OWE5YmZhODUgMHg4NWVlZDMzZCAweGFiMmMwZmM0IDB4ZDlmMjI1YWMgMHg5ODgzNTA1YSAweDhlYTZlNzRjIDB4MDJhZjU1N2EgMHg4MmY3MWIyZCAweGVmMDRmNWQzIDB4ZGYzNDM1NTAgMHgzZGJlODBiZCAweDFlM2U0OGU3IDB4MDEwYzgyOTkgMHg3NDA2YWNkMiAweDFhNzJhMmVlIC8vIG1ldGhvZCAiZnVuZF9kdWVfY2FzaGZsb3dzKHVpbnQ2NCkodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImNsYWltX2R1ZV9jYXNoZmxvd3MoYWRkcmVzcyxieXRlW10pKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxieXRlW10pIiwgbWV0aG9kICJ0cmFuc2Zlcl9zZXRfc2NoZWR1bGUodWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInByaW1hcnlfZGlzdHJpYnV0aW9uKGFkZHJlc3MsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidHJhbnNmZXIoYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgImFjY291bnRfc3VzcGVuc2lvbihhZGRyZXNzLGJvb2wpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X29wZW4oYWRkcmVzcyxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAiYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzKGFkZHJlc3MsYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgImFjY291bnRfZ2V0X3Bvc2l0aW9uKGFkZHJlc3MpKGFkZHJlc3MsdWludDY0LHVpbnQ2NCxib29sLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJjb250cmFjdF9jb25maWcoKHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LGJvb2wsYm9vbCxib29sLHVpbnQ2NCksKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSwoYnl0ZVszMl0sc3RyaW5nKSl1aW50NjQiLCBtZXRob2QgImNvbnRyYWN0X3NjaGVkdWxlKHVpbnQ2NCxib29sLCh1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KVtdKXVpbnQ2NCIsIG1ldGhvZCAiY29udHJhY3RfZXhlY3V0ZV9pZWQoKXVpbnQ2NCIsIG1ldGhvZCAiYXBwbHlfbm9uX2Nhc2hfZXZlbnQodWludDY0LCh1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkpdWludDY0IiwgbWV0aG9kICJhcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudCgodWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkpdWludDY0IiwgbWV0aG9kICJjb250cmFjdF9nZXRfc3RhdGUoKSh1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAiY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50KCkodWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgInJiYWNfcm90YXRlX2FycmFuZ2VyKGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX3NldF9vcF9kYWVtb24oYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgInJiYWNfYXNzaWduX3JvbGUodWludDgsYWRkcmVzcywodWludDY0LHVpbnQ2NCkpdWludDY0IiwgbWV0aG9kICJyYmFjX3Jldm9rZV9yb2xlKHVpbnQ4LGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX2NvbnRyYWN0X3N1c3BlbnNpb24oYm9vbCl1aW50NjQiLCBtZXRob2QgInJiYWNfZ2V0X2FycmFuZ2VyKClhZGRyZXNzIiwgbWV0aG9kICJyYmFjX2dldF9hZGRyZXNzX3JvbGVzKGFkZHJlc3MpKGJvb2wsYm9vbCxib29sLGJvb2wsYm9vbCkiLCBtZXRob2QgInJiYWNfZ2V0X3JvbGVfdmFsaWRpdHkodWludDgsYWRkcmVzcykodWludDY0LHVpbnQ2NCkiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBmdW5kX2R1ZV9jYXNoZmxvd3MgY2xhaW1fZHVlX2Nhc2hmbG93cyB0cmFuc2Zlcl9zZXRfc2NoZWR1bGUgcHJpbWFyeV9kaXN0cmlidXRpb24gdHJhbnNmZXIgYWNjb3VudF9zdXNwZW5zaW9uIGFjY291bnRfb3BlbiBhY2NvdW50X3VwZGF0ZV9wYXltZW50X2FkZHJlc3MgYWNjb3VudF9nZXRfcG9zaXRpb24gY29udHJhY3RfY29uZmlnIGNvbnRyYWN0X3NjaGVkdWxlIGNvbnRyYWN0X2V4ZWN1dGVfaWVkIGFwcGx5X25vbl9jYXNoX2V2ZW50IGFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50IGNvbnRyYWN0X2dldF9zdGF0ZSBjb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnQgcmJhY19yb3RhdGVfYXJyYW5nZXIgcmJhY19zZXRfb3BfZGFlbW9uIHJiYWNfYXNzaWduX3JvbGUgcmJhY19yZXZva2Vfcm9sZSByYmFjX2NvbnRyYWN0X3N1c3BlbnNpb24gcmJhY19nZXRfYXJyYW5nZXIgcmJhY19nZXRfYWRkcmVzc19yb2xlcyByYmFjX2dldF9yb2xlX3ZhbGlkaXR5CiAgICBlcnIKCm1haW5fY3JlYXRlX05vT3BAMzI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6OC0xOAogICAgLy8gY2xhc3MgREFTQSgKICAgIC8vICAgICBQYXltZW50QWdlbnQsCiAgICAvLyAgICAgVHJhbnNmZXJBZ2VudCwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBhdm1fdmVyc2lvbj0xMiwKICAgIC8vICk6CiAgICBwdXNoYnl0ZXMgMHg5NTZkNzE1NiAvLyBtZXRob2QgImNvbnRyYWN0X2NyZWF0ZShhZGRyZXNzKXVpbnQ2NCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIGNvbnRyYWN0X2NyZWF0ZQogICAgZXJyCgptYWluX2NvbnRyYWN0X3VwZGF0ZV9yb3V0ZUA0OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgcHVzaGludCA0IC8vIFVwZGF0ZUFwcGxpY2F0aW9uCiAgICA9PQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICYmCiAgICBhc3NlcnQKICAgIGIgY29udHJhY3RfdXBkYXRlCgoKLy8gX3B1eWFfbGliLnV0aWwuZW5zdXJlX2J1ZGdldChyZXF1aXJlZF9idWRnZXQ6IHVpbnQ2NCwgZmVlX3NvdXJjZTogdWludDY0KSAtPiB2b2lkOgplbnN1cmVfYnVkZ2V0OgogICAgcHJvdG8gMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMTAKICAgICsKCmVuc3VyZV9idWRnZXRfd2hpbGVfdG9wQDE6CiAgICBmcmFtZV9kaWcgMAogICAgZ2xvYmFsIE9wY29kZUJ1ZGdldAogICAgPgogICAgYnogZW5zdXJlX2J1ZGdldF9hZnRlcl93aGlsZUA2CiAgICBpdHhuX2JlZ2luCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgYnl0ZWMgNDcgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtCiAgICBieXRlYyA0NyAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbQogICAgZnJhbWVfZGlnIC0xCiAgICBzd2l0Y2ggZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8wQDMgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8xQDQKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfbmV4dEA1OgogICAgaXR4bl9zdWJtaXQKICAgIGIgZW5zdXJlX2J1ZGdldF93aGlsZV90b3BAMQoKZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8xQDQ6CiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgYiBlbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX25leHRANQoKZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8wQDM6CiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGIgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV9uZXh0QDUKCmVuc3VyZV9idWRnZXRfYWZ0ZXJfd2hpbGVANjoKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucGF5bWVudF9hZ2VudC5QYXltZW50QWdlbnQuZnVuZF9kdWVfY2FzaGZsb3dzW3JvdXRpbmddKCkgLT4gdm9pZDoKZnVuZF9kdWVfY2FzaGZsb3dzOgogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAxMwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NTEKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjUyCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjUzCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo1NQogICAgLy8gaWYgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCk6CiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo1OS02MAogICAgLy8gKyBtYXhfZXZlbnRfY291bnQKICAgIC8vICogVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfUEVSX0VWRU5UX0JVREdFVCkKICAgIGR1cAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjYwCiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfRlVORF9EVUVfQ0FTSEZMT1dTX1BFUl9FVkVOVF9CVURHRVQpCiAgICBwdXNoaW50IDEwMAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjU5LTYwCiAgICAvLyArIG1heF9ldmVudF9jb3VudAogICAgLy8gKiBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19QRVJfRVZFTlRfQlVER0VUKQogICAgKgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjU4CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19CQVNFX0JVREdFVCkKICAgIGludGMgNCAvLyAxNTAwCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NTgtNjAKICAgIC8vIFVJbnQ2NChjc3QuT1BfVVBfRlVORF9EVUVfQ0FTSEZMT1dTX0JBU0VfQlVER0VUKQogICAgLy8gKyBtYXhfZXZlbnRfY291bnQKICAgIC8vICogVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfUEVSX0VWRU5UX0JVREdFVCkKICAgICsKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo1Ni02MgogICAgLy8gZW5zdXJlX2J1ZGdldCgKICAgIC8vICAgICByZXF1aXJlZF9idWRnZXQ9KAogICAgLy8gICAgICAgICBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19CQVNFX0JVREdFVCkKICAgIC8vICAgICAgICAgKyBtYXhfZXZlbnRfY291bnQKICAgIC8vICAgICAgICAgKiBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19QRVJfRVZFTlRfQlVER0VUKQogICAgLy8gICAgICksCiAgICAvLyApCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjY0CiAgICAvLyBwcm9jZXNzZWRfZXZlbnRzID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA1CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjUKICAgIC8vIGZ1bmRlZF9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2NgogICAgLy8gZnVuZGVkX3ByaW5jaXBhbCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTMKCmZ1bmRfZHVlX2Nhc2hmbG93c193aGlsZV90b3BANDoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2OQogICAgLy8gcHJvY2Vzc2VkX2V2ZW50cyA8IG1heF9ldmVudF9jb3VudAogICAgZGlnIDQKICAgIGRpZyAxCiAgICA8CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjktNzAKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgPCBtYXhfZXZlbnRfY291bnQKICAgIC8vIGFuZCBzZWxmLmV2ZW50X2N1cnNvciA8IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQKICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl93aGlsZUAxMQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjcwCiAgICAvLyBhbmQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIDwKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2OS03MAogICAgLy8gcHJvY2Vzc2VkX2V2ZW50cyA8IG1heF9ldmVudF9jb3VudAogICAgLy8gYW5kIHNlbGYuZXZlbnRfY3Vyc29yIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudAogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDExCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzIKICAgIC8vIGVudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KHNlbGYuZXZlbnRfY3Vyc29yKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIGR1cAogICAgYnVyeSAxNwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjczCiAgICAvLyBpZiBlbnRyeS5zY2hlZHVsZWRfdGltZSA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wOgogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDMKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgID4KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAMTEKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3NQogICAgLy8gaWYgbm90IHNlbGYuX2V2ZW50X2lzX2Nhc2goZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSk6CiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ1cnkgMTYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM1MQogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUCksCiAgICBpbnRjXzIgLy8gOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzUwLTM1NAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfTUQpLAogICAgLy8gKQogICAgPT0KICAgIGR1cAogICAgYnVyeSA0CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfdHJ1ZUA1MgogICAgZGlnIDE0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNTIKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNTAtMzU0CiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9NRCksCiAgICAvLyApCiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX3RydWVANTIKICAgIGRpZyAxNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzUzCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX01EKSwKICAgIHB1c2hpbnQgMTkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM1MC0zNTQKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX01EKSwKICAgIC8vICkKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUA1MwoKZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfdHJ1ZUA1MjoKICAgIGludGNfMSAvLyAxCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUA1NDoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3NQogICAgLy8gaWYgbm90IHNlbGYuX2V2ZW50X2lzX2Nhc2goZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSk6CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAMTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU0OAogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X2lkID09IHNlbGYuZXZlbnRfY3Vyc29yLCBlcnIuSU5WQUxJRF9FVkVOVF9DVVJTT1IKICAgIGRpZyAxNQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBjdXJzb3IKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU0OQogICAgLy8gYXNzZXJ0IGVudHJ5LnNjaGVkdWxlZF90aW1lIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLCBlcnIuTk9fRFVFX0NBU0hGTE9XCiAgICBkaWcgMQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPD0KICAgIGFzc2VydCAvLyBObyBkdWUgY2FzaGZsb3cgdG8gcGF5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MTMKICAgIC8vIGlmIGV2ZW50X3R5cGUgbm90IGluIChVSW50NjQoZW51bXMuRVZUX0lQKSwgVUludDY0KGVudW1zLkVWVF9NRCkpOgogICAgZGlnIDIKICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNQogICAgZGlnIDE0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MTQKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDExCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfaW50ZXJlc3RfYW1vdW50QDE2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDI2CiAgICAvLyBldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBidXJ5IDE2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MjcKICAgIC8vIGlmIGV2ZW50X3R5cGUgbm90IGluIChVSW50NjQoZW51bXMuRVZUX1BSKSwgVUludDY0KGVudW1zLkVWVF9NRCkpOgogICAgcHVzaGludCAzCiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE5CiAgICBkaWcgMTQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQyOAogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNgoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnRAMjg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTMKICAgIC8vIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGRpZyAxNQogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTU2CiAgICAvLyBpZiBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKToKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDI5CiAgICBkaWcgNwogICAgYnVyeSA5CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzODoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU3Mi01NzQKICAgIC8vICMgRnVuZGluZyB1c2VzIHBlci11bml0IGN1bXVsYXRpdmUgaW5kaWNlcyBzbyBlYWNoIGhvbGRlciBjYW4gc2V0dGxlCiAgICAvLyAjIGluZGVwZW5kZW50bHkgZnJvbSBpdHMgY3VycmVudCB1bml0IGJhbGFuY2UuCiAgICAvLyBpbnRlcmVzdF9pbmRleF9kZWx0YSA9IHNlbGYuX2Ftb3VudF90b19pbmRleF9kZWx0YShpbnRlcmVzdF9hbW91bnRfZHVlKQogICAgZGlnIDEwCiAgICBjYWxsc3ViIF9hbW91bnRfdG9faW5kZXhfZGVsdGEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU3NQogICAgLy8gcHJpbmNpcGFsX2luZGV4X2RlbHRhID0gc2VsZi5fYW1vdW50X3RvX2luZGV4X2RlbHRhKHByaW5jaXBhbF9hbW91bnRfZHVlKQogICAgZGlnIDYKICAgIGNhbGxzdWIgX2Ftb3VudF90b19pbmRleF9kZWx0YQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTc2CiAgICAvLyBpbnRlcmVzdF9hbW91bnQgPSBzZWxmLl9pbmRleF9kZWx0YV90b19hbW91bnQoaW50ZXJlc3RfaW5kZXhfZGVsdGEpCiAgICBkaWcgMQogICAgY2FsbHN1YiBfaW5kZXhfZGVsdGFfdG9fYW1vdW50CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgMTUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU3NwogICAgLy8gcHJpbmNpcGFsX2Ftb3VudCA9IHNlbGYuX2luZGV4X2RlbHRhX3RvX2Ftb3VudChwcmluY2lwYWxfaW5kZXhfZGVsdGEpCiAgICBkdXAKICAgIGNhbGxzdWIgX2luZGV4X2RlbHRhX3RvX2Ftb3VudAogICAgZHVwCiAgICBidXJ5IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzgKICAgIC8vIHJlcXVpcmVkX2Ftb3VudCA9IGludGVyZXN0X2Ftb3VudCArIHByaW5jaXBhbF9hbW91bnQKICAgIGRpZyAyCiAgICBkaWcgMQogICAgKwogICAgZHVwCiAgICBidXJ5IDkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjczNAogICAgLy8gYmFsYW5jZSA9IHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ1NgogICAgLy8gcmV0dXJuIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgKyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIGRpZyAxCiAgICArCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MzYKICAgIC8vIGFzc2VydCBiYWxhbmNlID49IHJlc2VydmVkX3RvdGFsLCBlcnIuTk9UX0VOT1VHSF9GVU5EUwogICAgZGlnIDIKICAgIGRpZyAxCiAgICA+PQogICAgYXNzZXJ0IC8vIE5vdCBlbm91Z2ggZnVuZHMgZm9yIHRoZSBwYXltZW50CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MzcKICAgIC8vIHJldHVybiBiYWxhbmNlIC0gcmVzZXJ2ZWRfdG90YWwKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTgwCiAgICAvLyBzZWxmLl9hdmFpbGFibGVfc2V0dGxlbWVudF9mdW5kcygpID49IHJlcXVpcmVkX2Ftb3VudAogICAgdW5jb3ZlciAyCiAgICA+PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTc5LTU4MQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLl9hdmFpbGFibGVfc2V0dGxlbWVudF9mdW5kcygpID49IHJlcXVpcmVkX2Ftb3VudAogICAgLy8gKSwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTgzCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0ICs9IGludGVyZXN0X2Ftb3VudAogICAgdW5jb3ZlciAzCiAgICArCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTg0CiAgICAvLyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCArPSBwcmluY2lwYWxfYW1vdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICArCiAgICBieXRlYyAxMiAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4NQogICAgLy8gc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4ICs9IGludGVyZXN0X2luZGV4X2RlbHRhCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCBleGlzdHMKICAgIHVuY292ZXIgMgogICAgKwogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTg2CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4ICs9IHByaW5jaXBhbF9pbmRleF9kZWx0YQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCBleGlzdHMKICAgICsKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1ODcKICAgIC8vIGlmIGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkgPT0gVUludDY0KGVudW1zLkVWVF9QUik6CiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBwdXNoaW50IDMKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDQwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1ODgtNTg5CiAgICAvLyAjIEZvciBQUiwgdGhlIHBlcmlvZCBpbnRlcmVzdCBzdGF5cyBhY2NydWVkIHVudGlsIGEgbGF0ZXIgSVAgb3IgTUQuCiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgKz0gc2VsZi5fZW50cnlfaW50ZXJlc3Rfc2VnbWVudChlbnRyeSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBkaWcgMTYKICAgIGNhbGxzdWIgX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQKICAgIGJ1cnkgMTgKICAgICsKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTIKICAgIC8vIGlmIG5vdCBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKSBvciBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NCgKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlANDMKICAgIGRpZyAxNQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5Mi01OTQKICAgIC8vIGlmIG5vdCBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKSBvciBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NCgKICAgIC8vICAgICBlbnVtcy5FVlRfTUQKICAgIC8vICk6CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDQKCmZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDQzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTk1CiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBkaWcgMTUKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0NDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5NgogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgZGlnIDgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTcKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IG5leHRfaW50ZXJlc3RfYmFzZQogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGRpZyA5CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTk4CiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MDAKICAgIC8vIGlmIGVudHJ5LmV2ZW50X3R5cGUgPT0gYXJjNC5VSW50OCgKICAgIGRpZyAxNQogICAgZXh0cmFjdCA4IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwMC02MDIKICAgIC8vIGlmIGVudHJ5LmV2ZW50X3R5cGUgPT0gYXJjNC5VSW50OCgKICAgIC8vICAgICBlbnVtcy5FVlRfTUQKICAgIC8vICkgYW5kIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID09IFVJbnQ2NCgwKToKICAgIHB1c2hieXRlcyAweDEzCiAgICBiPT0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQ3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MDIKICAgIC8vICkgYW5kIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID09IFVJbnQ2NCgwKToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAwLTYwMgogICAgLy8gaWYgZW50cnkuZXZlbnRfdHlwZSA9PSBhcmM0LlVJbnQ4KAogICAgLy8gICAgIGVudW1zLkVWVF9NRAogICAgLy8gKSBhbmQgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPT0gVUludDY0KDApOgogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQ3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MDMKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGVudW1zLlNUQVRVU19FTkRFRCkKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgMjAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjA0CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQ3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjA2LTYxMAogICAgLy8gc2VsZi5fZW1pdF9leGVjdXRpb25fZXZlbnQoCiAgICAvLyAgICAgZW50cnk9ZW50cnksCiAgICAvLyAgICAgcGF5b2ZmPWludGVyZXN0X2Ftb3VudCArIHByaW5jaXBhbF9hbW91bnQsCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9aW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudCwKICAgIC8vICkKICAgIGRpZyAxNQogICAgZGlnIDQKICAgIGR1cAogICAgY2FsbHN1YiBfZW1pdF9leGVjdXRpb25fZXZlbnQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojc5CiAgICAvLyBmdW5kZWRfaW50ZXJlc3QgKz0gaW50ZXJlc3RfYW1vdW50CiAgICBkaWcgMTMKICAgIGRpZyAxMgogICAgKwogICAgYnVyeSAxNAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjgwCiAgICAvLyBmdW5kZWRfcHJpbmNpcGFsICs9IHByaW5jaXBhbF9hbW91bnQKICAgIGRpZyAxMgogICAgZGlnIDcKICAgICsKICAgIGJ1cnkgMTMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4MQogICAgLy8gcHJvY2Vzc2VkX2V2ZW50cyArPSBVSW50NjQoMSkKICAgIGRpZyA0CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSA1CiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c193aGlsZV90b3BANAoKZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUA0MDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5MQogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ID0gVUludDY0KDApCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQxCgpmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUAyOToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1NwogICAgLy8gZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGRpZyAxNQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSAxNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTU4LTU2MAogICAgLy8gIyBEeW5hbWljIGFubnVpdGllcyBkZXJpdmUgbmV4dCBzdGF0ZSBmcm9tIHRoZSBwYXltZW50IGRlY29tcG9zaXRpb24sCiAgICAvLyAjIG5vdCBvbmx5IGZyb20gdGhlIHByZWNvbXB1dGVkIGBuZXh0XypgIGZpZWxkcy4KICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QUik6CiAgICBwdXNoaW50IDMKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDMxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjIKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIC0gcHJpbmNpcGFsX2Ftb3VudF9kdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgZGlnIDYKICAgIC0KICAgIGR1cAogICAgYnVyeSA5CiAgICBidXJ5IDkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzgKCmZ1bmRfZHVlX2Nhc2hmbG93c19lbHNlX2JvZHlAMzE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjUKICAgIC8vIGVsaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX0lQKToKICAgIGRpZyAxNAogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDMzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjYKICAgIC8vIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgYnVyeSA5CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjcKICAgIC8vIG5leHRfaW50ZXJlc3RfYmFzZSA9IHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgYnVyeSAxMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSBleGlzdHMKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzgKCmZ1bmRfZHVlX2Nhc2hmbG93c19lbHNlX2JvZHlAMzM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjgKICAgIC8vIGVsaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKToKICAgIGRpZyAxNAogICAgcHVzaGludCAxOQogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUAzNAogICAgZGlnIDcKICAgIGJ1cnkgOQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlAMzQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjkKICAgIC8vIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzAKICAgIC8vIG5leHRfaW50ZXJlc3RfYmFzZSA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgOQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MjkKICAgIC8vIGlmIHNlbGYuX2lzX2R5bmFtaWNfYW5udWl0eSgpOgogICAgY2FsbHN1YiBfaXNfZHluYW1pY19hbm51aXR5CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyNwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDMwCiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfTUQpOgogICAgZGlnIDE0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzMQogICAgLy8gcmV0dXJuIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTUyCiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzMgogICAgLy8gaW50ZXJlc3RfZHVlID0gc2VsZi5hY2NydWVkX2ludGVyZXN0ICsgc2VsZi5fZW50cnlfaW50ZXJlc3Rfc2VnbWVudChlbnRyeSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBkaWcgMTYKICAgIGNhbGxzdWIgX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQKICAgIGJ1cnkgMTgKICAgICsKICAgIGR1cAogICAgYnVyeSAxMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDMzCiAgICAvLyBpZiBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPD0gaW50ZXJlc3RfZHVlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gZXhpc3RzCiAgICA+PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzNAogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTUyCiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyNDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzNQogICAgLy8gcHJpbmNpcGFsX2Ftb3VudCA9IHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiAtIGludGVyZXN0X2R1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gZXhpc3RzCiAgICBkaWcgMTAKICAgIC0KICAgIGR1cAogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzYKICAgIC8vIGlmIHByaW5jaXBhbF9hbW91bnQgPiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgPgogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzNwogICAgLy8gcmV0dXJuIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTUyCiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyNjoKICAgIGRpZyA2CiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NDAKICAgIC8vIGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsIDw9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBkaWcgMTUKICAgIHB1c2hpbnQgNDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGR1cDIKICAgIDw9CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzktNDQxCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsIDw9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ0MgogICAgLy8gcmV0dXJuIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIC0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIHN3YXAKICAgIC0KICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTUyCiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQxNQogICAgLy8gcmV0dXJuIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCArIHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZGlnIDE2CiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBidXJ5IDE4CiAgICArCiAgICBidXJ5IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTEKICAgIC8vIGludGVyZXN0X2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9pbnRlcmVzdF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9pbnRlcmVzdF9hbW91bnRAMTYKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl93aGlsZUAxMToKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4MwogICAgLy8gYXNzZXJ0IHByb2Nlc3NlZF9ldmVudHMgPiBVSW50NjQoMCksIGVyci5OT19EVUVfQ0FTSEZMT1cKICAgIGRpZyA0CiAgICBkdXAKICAgIGFzc2VydCAvLyBObyBkdWUgY2FzaGZsb3cgdG8gcGF5CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODcKICAgIC8vIHRvdGFsX2Z1bmRlZD1mdW5kZWRfaW50ZXJlc3QgKyBmdW5kZWRfcHJpbmNpcGFsLAogICAgZGlnIDE0CiAgICBkdXAKICAgIGRpZyAxNQogICAgZHVwCiAgICBjb3ZlciAzCiAgICArCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODkKICAgIC8vIHRpbWVzdGFtcD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4NC05MAogICAgLy8gcmV0dXJuIHR5cC5DYXNoRnVuZGluZ1Jlc3VsdCgKICAgIC8vICAgICBmdW5kZWRfaW50ZXJlc3Q9ZnVuZGVkX2ludGVyZXN0LAogICAgLy8gICAgIGZ1bmRlZF9wcmluY2lwYWw9ZnVuZGVkX3ByaW5jaXBhbCwKICAgIC8vICAgICB0b3RhbF9mdW5kZWQ9ZnVuZGVkX2ludGVyZXN0ICsgZnVuZGVkX3ByaW5jaXBhbCwKICAgIC8vICAgICBwcm9jZXNzZWRfZXZlbnRzPXByb2Nlc3NlZF9ldmVudHMsCiAgICAvLyAgICAgdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUA1MzoKICAgIGludGNfMCAvLyAwCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDU0CgoKLy8gbW9kdWxlcy5wYXltZW50X2FnZW50LlBheW1lbnRBZ2VudC5jbGFpbV9kdWVfY2FzaGZsb3dzW3JvdXRpbmddKCkgLT4gdm9pZDoKY2xhaW1fZHVlX2Nhc2hmbG93czoKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6OTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNQogICAgLy8gaWYgc2VsZi5vcF9kYWVtb24udmFsdWUgIT0gR2xvYmFsLnplcm9fYWRkcmVzczoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNiAvLyAweDUyMjM0ZjcwNDQ2MTY1NmQ2ZjZlMjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcF9kYWVtb24gZXhpc3RzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBieiBjbGFpbV9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTcKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNwogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI2IC8vIDB4NTIyMzRmNzA0NDYxNjU2ZDZmNmUyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wX2RhZW1vbiBleGlzdHMKICAgID09CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTctMTkKICAgIC8vIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICAvLyBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgYm56IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDE0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTgKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNy0xOQogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICBibnogY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX3RydWVAMTQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxOQogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIHR4biBTZW5kZXIKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDMyCiAgICA9PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE3LTE5CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAxNQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX3RydWVAMTQ6CiAgICBpbnRjXzEgLy8gMQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDE2OgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE2LTIwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vICAgICBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gICAgIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICAvLyApLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNzoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMDMKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA0CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMDcKICAgIC8vIHNlbGYuX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQoaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDIKICAgIGR1cAogICAgY2FsbHN1YiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjEwOAogICAgLy8gc2VsZi5fc2V0dGxlX3Bvc2l0aW9uKGhvbGRpbmdfYWRkcmVzcykKICAgIGNhbGxzdWIgX3NldHRsZV9wb3NpdGlvbgogICAgcG9wbiAyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTE3CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jbGFpbWFibGVfaW50ZXJlc3QKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGR1cAogICAgcHVzaGludCA3MwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTE4CiAgICAvLyArIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNsYWltYWJsZV9wcmluY2lwYWwKICAgIGR1cAogICAgcHVzaGludCA4MQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTE3LTExOAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY2xhaW1hYmxlX2ludGVyZXN0CiAgICAvLyArIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNsYWltYWJsZV9wcmluY2lwYWwKICAgIHVuY292ZXIgMgogICAgKwogICAgZHVwCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMTAKICAgIC8vIGFzc2VydCB0b3RhbF9hbW91bnQgPiBVSW50NjQoMCksIGVyci5OT19EVUVfQ0FTSEZMT1cKICAgIGFzc2VydCAvLyBObyBkdWUgY2FzaGZsb3cgdG8gcGF5CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MjUKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5pc19vcHRlZF9pbigKICAgIGV4dHJhY3QgMCAzMgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI2CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI1LTI3CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MuaXNfb3B0ZWRfaW4oCiAgICAvLyAgICAgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkCiAgICAvLyApCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI1LTI4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MuaXNfb3B0ZWRfaW4oCiAgICAvLyAgICAgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkCiAgICAvLyApCiAgICAvLyBhbmQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZAogICAgYnogY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX2ZhbHNlQDI0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MjgKICAgIC8vIGFuZCBub3Qgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDM4NAogICAgZ2V0Yml0CiAgICBibnogY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX2ZhbHNlQDI0CiAgICBpbnRjXzEgLy8gMQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDI1OgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjExNQogICAgLy8gaWYgc2VsZi5faXNfcGF5bWVudF9leGVjdXRhYmxlKGhvbGRpbmdfYWRkcmVzcyk6CiAgICBieiBjbGFpbV9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjM0CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgc3dhcAogICAgZGlnIDEKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYXNzZXJ0IC8vIGFjY291bnQgb3B0ZWQgaW50byBhc3NldAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjM0LTM1CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgLy8gPj0gcGF5bWVudF9hbW91bnQKICAgIGRpZyA1CiAgICBkdXAKICAgIGNvdmVyIDIKICAgID49CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MzMtMzYKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIC8vICAgICA+PSBwYXltZW50X2Ftb3VudAogICAgLy8gKSwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjExNwogICAgLy8gc2VsZi5fcGF5KHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcywgdG90YWxfYW1vdW50KQogICAgZGlnIDIKICAgIGR1cAogICAgY292ZXIgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGR1cAogICAgZXh0cmFjdCAwIDMyCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NDAtNDUKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1yZWNlaXZlciwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9YW1vdW50LAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NDQKICAgIC8vIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICB1bmNvdmVyIDMKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgdW5jb3ZlciAyCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQwCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NDAtNDUKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1yZWNlaXZlciwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9YW1vdW50LAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEyNS0xMjYKICAgIC8vICMgR2V0IHRoZSBjbGFpbWFibGUgYW1vdW50cyBiZWZvcmUgcmVzZXQKICAgIC8vIGludGVyZXN0X2Ftb3VudCA9IHBvc2l0aW9uLmNsYWltYWJsZV9pbnRlcmVzdAogICAgZHVwCiAgICBwdXNoaW50IDczCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBidXJ5IDkKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMjcKICAgIC8vIHByaW5jaXBhbF9hbW91bnQgPSBwb3NpdGlvbi5jbGFpbWFibGVfcHJpbmNpcGFsCiAgICBkdXAKICAgIHB1c2hpbnQgODEKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGJ1cnkgOQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEyOS0xMzAKICAgIC8vICMgUmVzZXQgdGhlIHBvc2l0aW9uJ3MgY2xhaW1hYmxlIGFtb3VudHMKICAgIC8vIHBvc2l0aW9uLmNsYWltYWJsZV9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICByZXBsYWNlMiA3MwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzMQogICAgLy8gcG9zaXRpb24uY2xhaW1hYmxlX3ByaW5jaXBhbCA9IFVJbnQ2NCgwKQogICAgc3dhcAogICAgcmVwbGFjZTIgODEKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzIKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gcG9zaXRpb24uY29weSgpCiAgICB1bmNvdmVyIDMKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzQKICAgIC8vIGFzc2VydCBzZWxmLnJlc2VydmVkX2ludGVyZXN0ID49IGludGVyZXN0X2Ftb3VudCwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBkdXAKICAgIGRpZyAyCiAgICA+PQogICAgYXNzZXJ0IC8vIE5vdCBlbm91Z2ggZnVuZHMgZm9yIHRoZSBwYXltZW50CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTM1CiAgICAvLyBhc3NlcnQgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgPj0gcHJpbmNpcGFsX2Ftb3VudCwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIGRpZyAzCiAgICA+PQogICAgYXNzZXJ0IC8vIE5vdCBlbm91Z2ggZnVuZHMgZm9yIHRoZSBwYXltZW50CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTM3LTEzOAogICAgLy8gIyBVcGRhdGUgdGhlIGdsb2JhbCByZXNlcnZlZCBpbnRlcmVzdCBhbmQgcHJpbmNpcGFsIGFtb3VudHMKICAgIC8vIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgLT0gaW50ZXJlc3RfYW1vdW50CiAgICBzd2FwCiAgICAtCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzOQogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgLT0gcHJpbmNpcGFsX2Ftb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIGV4aXN0cwogICAgc3dhcAogICAgLQogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpjbGFpbV9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMjMKICAgIC8vIHRvdGFsX2Ftb3VudD1pbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50LAogICAgZGlnIDUKICAgIGR1cAogICAgZGlnIDYKICAgIGR1cAogICAgY292ZXIgMwogICAgKwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjEyNAogICAgLy8gdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjEyMC0xMjYKICAgIC8vIHJldHVybiB0eXAuQ2FzaENsYWltUmVzdWx0KAogICAgLy8gICAgIGludGVyZXN0X2Ftb3VudD1pbnRlcmVzdF9hbW91bnQsCiAgICAvLyAgICAgcHJpbmNpcGFsX2Ftb3VudD1wcmluY2lwYWxfYW1vdW50LAogICAgLy8gICAgIHRvdGFsX2Ftb3VudD1pbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50LAogICAgLy8gICAgIHRpbWVzdGFtcD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICBjb250ZXh0PXBheW1lbnRfaW5mbywKICAgIC8vICkKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyAyCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgcHVzaGJ5dGVzIDB4MDAyMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VAMjQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfbWVyZ2VAMjUKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAxNToKICAgIGludGNfMCAvLyAwCiAgICBiIGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUAxNgoKCi8vIG1vZHVsZXMudHJhbnNmZXJfYWdlbnQuVHJhbnNmZXJBZ2VudC50cmFuc2Zlcl9zZXRfc2NoZWR1bGVbcm91dGluZ10oKSAtPiB2b2lkOgp0cmFuc2Zlcl9zZXRfc2NoZWR1bGU6CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MjYKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToyNwogICAgLy8gYXNzZXJ0IG9wZW5fZGF0ZSA8IGNsb3N1cmVfZGF0ZSwgZXJyLklOVkFMSURfU09SVElORwogICAgZHVwMgogICAgPAogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIG11c3QgYmUgc29ydGVkIGluIHN0cmljdGx5IGFzY2VuZGluZyBvcmRlcgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToyOQogICAgLy8gc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgPSBvcGVuX2RhdGUKICAgIGJ5dGVjIDI4IC8vICJ0cmFuc2Zlcl9vcGVuaW5nX2RhdGUiCiAgICB1bmNvdmVyIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjMwCiAgICAvLyBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSA9IGNsb3N1cmVfZGF0ZQogICAgYnl0ZWMgMjkgLy8gInRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjMxCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMudHJhbnNmZXJfYWdlbnQuVHJhbnNmZXJBZ2VudC5wcmltYXJ5X2Rpc3RyaWJ1dGlvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnByaW1hcnlfZGlzdHJpYnV0aW9uOgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTozMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo3MQogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYucHJpbWFyeV9kZWFsZXIsIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyMiAvLyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQzCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo0NAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQ1CiAgICAvLyBhc3NlcnQgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TRUQKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBjbG9zZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDcKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQoaG9sZGluZ19hZGRyZXNzKQogICAgc3dhcAogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo0OAogICAgLy8gYXNzZXJ0IHVuaXRzID4gVUludDY0KDApLCBlcnIuWkVST19VTklUUwogICAgZHVwCiAgICBhc3NlcnQgLy8gQ2FuIG5vdCBkaXN0cmlidXRlIHplcm8gdW5pdHMKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NTAKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgKyB1bml0cyA8PSBzZWxmLnRvdGFsX3VuaXRzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIGV4aXN0cwogICAgKwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIDw9CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQ5LTUxCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgKyB1bml0cyA8PSBzZWxmLnRvdGFsX3VuaXRzCiAgICAvLyApLCBlcnIuT1ZFUl9ESVNUUklCVVRJT04KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgcmVtYWluaW5nIEQtQVNBIHVuaXRzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjUyCiAgICAvLyBpZiBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNyAvLyAiaW5pdGlhbF9leGNoYW5nZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSBleGlzdHMKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo1NAogICAgLy8gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPD0gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGUKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNyAvLyAiaW5pdGlhbF9leGNoYW5nZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSBleGlzdHMKICAgIDw9CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjUzLTU1CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDw9IHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlCiAgICAvLyApLCBlcnIuUFJJTUFSWV9ESVNUUklCVVRJT05fQ0xPU0VECiAgICBhc3NlcnQgLy8gUHJpbWFyeSBkaXN0cmlidXRpb24gaXMgY2xvc2VkCgpwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTQ4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5yZXNlcnZlZF91bml0cyArPSB1bml0cwogICAgZHVwbiAyCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCA0MAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAzCiAgICBkdXAKICAgIGNvdmVyIDMKICAgICsKICAgIGl0b2IKICAgIHB1c2hpbnQgNDAKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjU4CiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsICs9IHVuaXRzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIGV4aXN0cwogICAgKwogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjU5CiAgICAvLyByZXR1cm4gc2VsZi50b3RhbF91bml0cyAtIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICBzd2FwCiAgICAtCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnRyYW5zZmVyX2FnZW50LlRyYW5zZmVyQWdlbnQudHJhbnNmZXJbcm91dGluZ10oKSAtPiB2b2lkOgp0cmFuc2ZlcjoKICAgIGludGNfMCAvLyAwCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cG4gMgogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojc1CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo3NgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDcKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjEzCiAgICAvLyBpZiBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyOCAvLyAidHJhbnNmZXJfb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIGJ6IHRyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNQogICAgLy8gc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyOCAvLyAidHJhbnNmZXJfb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIDw9CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE0LTE2CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyApLCBlcnIuQ0xPU0VEX1RSQU5TRkVSCiAgICBhc3NlcnQgLy8gVHJhbnNmZXIgaXMgY2xvc2VkCgp0cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE3CiAgICAvLyBpZiBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyOSAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIGJ6IHRyYW5zZmVyX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxOQogICAgLy8gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI5IC8vICJ0cmFuc2Zlcl9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgPAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxOC0yMAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8IHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlCiAgICAvLyApLCBlcnIuQ0xPU0VEX1RSQU5TRkVSCiAgICBhc3NlcnQgLy8gVHJhbnNmZXIgaXMgY2xvc2VkCgp0cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjgwCiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBzZW5kZXJfaG9sZGluZ19hZGRyZXNzLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICBkaWcgNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQyMwogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDgKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBkaWcgNQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA5CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjgzCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBkaWcgMgogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4NAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBkdXAKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODUKICAgIC8vIGFzc2VydCBzZW5kZXJfaG9sZGluZ19hZGRyZXNzICE9IHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcywgZXJyLlNFTEZfVFJBTlNGRVIKICAgIHVuY292ZXIgMgogICAgIT0KICAgIGFzc2VydCAvLyBTZW5kZXIgYW5kIHJlY2VpdmVyIG11c3QgYmUgZGlmZmVyZW50CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojg2CiAgICAvLyBhc3NlcnQgdW5pdHMgPiBVSW50NjQoMCksIGVyci5OVUxMX1RSQU5TRkVSCiAgICBkaWcgMQogICAgZHVwCiAgICBhc3NlcnQgLy8gVHJhbnNmZXIgdW5pdHMgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4NwogICAgLy8gYXNzZXJ0IHVuaXRzIDw9IHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cywgZXJyLk9WRVJfVFJBTlNGRVIKICAgIHN3YXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICA8PQogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCBzZW5kZXIgdW5pdHMgdG8gdHJhbnNmZXIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc2MwogICAgLy8gaWYgc2VsZi5ldmVudF9jdXJzb3IgPj0gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgPj0KICAgIGJueiB0cmFuc2Zlcl9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9hc3NlcnRfbm9fZHVlX2V2ZW50X3BlbmRpbmdAMTAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc2NQogICAgLy8gbmV4dF9lbnRyeSA9IHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLmV2ZW50X2N1cnNvcikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NjcKICAgIC8vIG5leHRfZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzY2LTc2OAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBuZXh0X2VudHJ5LnNjaGVkdWxlZF90aW1lID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICksIGVyci5QRU5ESU5HX0FDVFVTX0VWRU5UCiAgICBhc3NlcnQgLy8gQUNUVVMgZXZlbnQgbm90IHlldCBleGVjdXRlZAoKdHJhbnNmZXJfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYXNzZXJ0X25vX2R1ZV9ldmVudF9wZW5kaW5nQDEwOgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo5MAogICAgLy8gc2VsZi5fZW5zdXJlX3VuaXRzX2FjdGl2YXRlZChzZW5kZXJfaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDMKICAgIGR1cAogICAgY2FsbHN1YiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo5MQogICAgLy8gc2VsZi5fZW5zdXJlX3VuaXRzX2FjdGl2YXRlZChyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBkaWcgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjYWxsc3ViIF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjkyCiAgICAvLyBzZWxmLl9zZXR0bGVfcG9zaXRpb24oc2VuZGVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGNhbGxzdWIgX3NldHRsZV9wb3NpdGlvbgogICAgcG9wbiAyCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjkzCiAgICAvLyBzZWxmLl9zZXR0bGVfcG9zaXRpb24ocmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzKQogICAgY2FsbHN1YiBfc2V0dGxlX3Bvc2l0aW9uCiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNTIKICAgIC8vIGFzc2VydCB1bml0cyA8PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cywgZXJyLk9WRVJfVFJBTlNGRVIKICAgIGRpZyA1CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkaWcgMQogICAgPD0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgc2VuZGVyIHVuaXRzIHRvIHRyYW5zZmVyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTUzCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyAtPSB1bml0cwogICAgZGlnIDEKICAgIC0KICAgIGl0b2IKICAgIHVuY292ZXIgMgogICAgaW50Y18zIC8vIDMyCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTQ0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyArPSB1bml0cwogICAgZGlnIDUKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIHVuY292ZXIgMgogICAgKwogICAgaXRvYgogICAgaW50Y18zIC8vIDMyCiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo2MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfc3VzcGVuc2lvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfc3VzcGVuc2lvbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojc3CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyMSAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxODUKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZCA9IHN1c3BlbmRlZAogICAgZHVwCiAgICBwdXNoaW50IDQ4CiAgICBpbnRjXzEgLy8gMQogICAgYm94X2V4dHJhY3QKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgcHVzaGludCA0OAogICAgc3dhcAogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxODYKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE2NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF9vcGVuW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF9vcGVuOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjY4CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hY2NvdW50X21hbmFnZXIsIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyMyAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzOQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfRU5ERUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgMjAwCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxMAogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfZW5kZWQoKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgIQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjExCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxMgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTMKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozNAogICAgLy8gdW5pdHM9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozMi00MgogICAgLy8gcmV0dXJuIHR5cC5BY2NvdW50UG9zaXRpb24oCiAgICAvLyAgICAgcGF5bWVudF9hZGRyZXNzPXBheW1lbnRfYWRkcmVzcywKICAgIC8vICAgICB1bml0cz1VSW50NjQoMCksCiAgICAvLyAgICAgcmVzZXJ2ZWRfdW5pdHM9VUludDY0KDApLAogICAgLy8gICAgIHN1c3BlbmRlZD1GYWxzZSwKICAgIC8vICAgICBzZXR0bGVkX2N1cnNvcj1VSW50NjQoMCksCiAgICAvLyAgICAgaW50ZXJlc3RfY2hlY2twb2ludD1VSW50NjQoMCksCiAgICAvLyAgICAgcHJpbmNpcGFsX2NoZWNrcG9pbnQ9VUludDY0KDApLAogICAgLy8gICAgIGNsYWltYWJsZV9pbnRlcmVzdD1VSW50NjQoMCksCiAgICAvLyAgICAgY2xhaW1hYmxlX3ByaW5jaXBhbD1VSW50NjQoMCksCiAgICAvLyApCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGJ5dGVjIDQwIC8vIDB4MDAKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjE0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHNlbGYuX25ld19hY2NvdW50X3Bvc2l0aW9uKHBheW1lbnRfYWRkcmVzcykKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTUKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIzOAogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICB1bmNvdmVyIDMKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMzkKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQwCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0MQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzID0gcGF5bWVudF9hZGRyZXNzCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0MgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5hY2NvdW50X2dldF9wb3NpdGlvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfZ2V0X3Bvc2l0aW9uOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI1OQogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmNvbnRyYWN0X2NyZWF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X2NyZWF0ZToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDMwCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gYXJyYW5nZXIKICAgIGJ5dGVjIDE4IC8vIDB4NTIyMzQxNzI3MjYxNmU2NzY1NzIyMwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMzEKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAxOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfY29uZmlnW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfY29uZmlnOgogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBsZW4KICAgIHB1c2hpbnQgMTA3CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLk5vcm1hbGl6ZWRBY3R1c1Rlcm1zCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgcHVzaGludCA3MgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5Jbml0aWFsS2VybmVsU3RhdGUKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBsZW4KICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIHR1cGxlIGVuY29kaW5nCiAgICBkdXAKICAgIHB1c2hpbnQgMzQKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCB0YWlsIHBvaW50ZXIgYXQgaW5kZXggMSBvZiAodWludDhbMzJdLChsZW4rdXRmOFtdKSkKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgY292ZXIgMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMzYKICAgICsKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuUHJvc3BlY3R1cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2MgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDY0LTEwNjUKICAgIC8vICMgQ29uZmlndXJlIENvbnRyYWN0CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPSB0ZXJtcy5jb250cmFjdF90eXBlLmFzX3VpbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgYnogY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUA3CiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIyMAogICAgLy8gVUludDY0KGVudW1zLkNUX0FOTiksCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIxCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfTkFNKSwKICAgIHB1c2hpbnQgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIyCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfTEFNKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIzCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfTEFYKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjI0CiAgICAvLyBVSW50NjQoZW51bXMuQ1RfQ0xNKSwKICAgIHB1c2hpbnQgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJ6IGNvbnRyYWN0X2NvbmZpZ19ib29sX2ZhbHNlQDgKCmNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANzoKICAgIGludGNfMSAvLyAxCgpjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUA5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjI5CiAgICAvLyBhc3NlcnQgc2VsZi5faXNfc3VwcG9ydGVkX2NvbnRyYWN0X3R5cGUoY29udHJhY3RfdHlwZSksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2NwogICAgLy8gc2VsZi5fc3RvcmVfY29udHJhY3RfY29uZmlnKHNlbGYuY29udHJhY3RfdHlwZSwgdGVybXMsIGluaXRpYWxfc3RhdGUpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgYnVyeSAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzI1CiAgICAvLyBhc3NlcnQgdGVybXMuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZGlnIDQKICAgIGR1cAogICAgcHVzaGludCAzMwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSA4CiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMjcKICAgIC8vIHRlcm1zLmRheV9jb3VudF9jb252ZW50aW9uLmFzX3VpbnQ2NCgpCiAgICBwdXNoaW50IDU3CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICBieiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDE2CiAgICBkaWcgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk5CiAgICAvLyBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI5Ny0zMDMKICAgIC8vIHJldHVybiBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzYwKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwSVNEQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjApLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDE2CiAgICBkaWcgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzAwCiAgICAvLyBVSW50NjQoZW51bXMuRENDX0EzNjUpLAogICAgcHVzaGludCAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyOTctMzAzCiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgID09CiAgICBibnogY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUAxNgogICAgZGlnIDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMwMQogICAgLy8gVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGRpZyA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDIKICAgIC8vIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICA9PQogICAgYnogY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAMTcKCmNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTY6CiAgICBpbnRjXzEgLy8gMQoKY29udHJhY3RfY29uZmlnX2Jvb2xfbWVyZ2VAMTg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDktMzExCiAgICAvLyBhc3NlcnQgc2VsZi5faXNfc3VwcG9ydGVkX2RheV9jb3VudF9jb252ZW50aW9uKAogICAgLy8gICAgIGRheV9jb3VudF9jb252ZW50aW9uCiAgICAvLyApLCBlcnIuSU5WQUxJRF9EQVlfQ09VTlRfQ09OVkVOVElPTgogICAgYXNzZXJ0IC8vIEludmFsaWQgZGF5LWNvdW50IGNvbnZlbnRpb24gSUQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMyOQogICAgLy8gaWYgY29udHJhY3RfdHlwZSAhPSBVSW50NjQoZW51bXMuQ1RfQU5OKToKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgICE9CiAgICBieiBjb250cmFjdF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzMwCiAgICAvLyBhc3NlcnQgbm90IHRlcm1zLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24sIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZGlnIDQKICAgIHB1c2hpbnQgNzg2CiAgICBnZXRiaXQKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KCmNvbnRyYWN0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDIwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODA3CiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIEQtQVNBIGFscmVhZHkgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODA4CiAgICAvLyBhc3NlcnQgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCA9PSBVSW50NjQoMCksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMCAvLyAiaW5pdGlhbF9leGNoYW5nZV9hbW91bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTAtODExCiAgICAvLyAjIFNldCBEZW5vbWluYXRpb24gQXNzZXQKICAgIC8vIHNlbGYuX2Fzc2VydF9kZW5vbWluYXRpb25fYXNzZXQodGVybXMuZGVub21pbmF0aW9uX2Fzc2V0X2lkKQogICAgZGlnIDQKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NzUtNzc2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIGRlbm9taW5hdGlvbiB3aXRoIEFTQQogICAgLy8gX2NyZWF0b3IsIGV4aXN0cyA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X2NyZWF0b3IoZGVub21pbmF0aW9uX2Fzc2V0X2lkKQogICAgZHVwCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q3JlYXRvcgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NzcKICAgIC8vIGFzc2VydCBleGlzdHMsIGVyci5JTlZBTElEX0RFTk9NSU5BVElPTgogICAgYXNzZXJ0IC8vIERlbm9taW5hdGlvbiBhc3NldCBpcyBub3QgcHJvcGVybHkgc2V0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODAKICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICBieXRlYyA0NCAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTQtODE1CiAgICAvLyAjIFNldCBTZXR0bGVtZW50IEFzc2V0CiAgICAvLyBzZWxmLl9hc3NlcnRfc2V0dGxlbWVudF9hc3NldCh0ZXJtcy5zZXR0bGVtZW50X2Fzc2V0X2lkKQogICAgZGlnIDEKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc4NQogICAgLy8gc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODMtNzg2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc2V0dGxlbWVudCBhc3NldCBpcyB0aGUgZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQgPT0gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIC8vICksIGVyci5JTlZBTElEX1NFVFRMRU1FTlRfQVNTRVQKICAgIGFzc2VydCAvLyBEaWZmZXJlbnQgc2V0dGxlbWVudCBhc3NldCBub3Qgc3VwcG9ydGVkLCBtdXN0IGJlIGVxdWFsIHRvIGRlbm9taW5hdGlvbiBhc3NldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Nzg5CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBzZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkwLTc5NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhc3NldF9hbW91bnQ9MCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Nzk1CiAgICAvLyBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkzCiAgICAvLyBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc5NAogICAgLy8gYXNzZXRfYW1vdW50PTAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkwLTc5MQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3OTAtNzk2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODE4LTgxOQogICAgLy8gIyBVbml0cwogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IHRlcm1zLnRvdGFsX3VuaXRzCiAgICBkdXAKICAgIHB1c2hpbnQgMTcKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODIwCiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID0gVUludDY0KDApCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgyMi04MjMKICAgIC8vICMgRGF5LUNvdW50IENvbnZlbnRpb25zCiAgICAvLyBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uID0gdGVybXMuZGF5X2NvdW50X2NvbnZlbnRpb24uYXNfdWludDY0KCkKICAgIGJ5dGVjIDQ2IC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGRpZyA4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODI1LTgyNgogICAgLy8gIyBUaW1lCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA9IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZQogICAgZHVwCiAgICBwdXNoaW50IDQxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMjcgLy8gImluaXRpYWxfZXhjaGFuZ2VfZGF0ZSIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODI3CiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSB0ZXJtcy5tYXR1cml0eV9kYXRlCiAgICBkaWcgMQogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDQ1IC8vICJtYXR1cml0eV9kYXRlIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MjgKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IGluaXRpYWxfc3RhdGUubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZGlnIDYKICAgIGR1cAogICAgY292ZXIgMgogICAgcHVzaGludCA0OAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzMC04MzEKICAgIC8vICMgUHJpbmNpcGFsCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID0gdGVybXMuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGRpZyAxMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzMgogICAgLy8gc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gdGVybXMuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZGlnIDMKICAgIHB1c2hpbnQgNzg2CiAgICBnZXRiaXQKICAgIGJ5dGVjIDM0IC8vICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzMwogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBpbml0aWFsX3N0YXRlLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZGlnIDEKICAgIHB1c2hpbnQgMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODM1LTgzNgogICAgLy8gIyBJbnRlcmVzdAogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ID0gaW5pdGlhbF9zdGF0ZS5hY2NydWVkX2ludGVyZXN0CiAgICBkaWcgMQogICAgcHVzaGludCA0MAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODM4LTgzOQogICAgLy8gIyBJbnRlcmVzdCBSYXRlCiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IGluaXRpYWxfc3RhdGUubm9taW5hbF9pbnRlcmVzdF9yYXRlCiAgICBkaWcgMQogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0MAogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gaW5pdGlhbF9zdGF0ZS5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlCiAgICBkaWcgMQogICAgcHVzaGludCAyNAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQxCiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkID0gdGVybXMucmF0ZV9yZXNldF9zcHJlYWQKICAgIGRpZyAzCiAgICBwdXNoaW50IDU4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzUgLy8gInJhdGVfcmVzZXRfc3ByZWFkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0MgogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIgPSB0ZXJtcy5yYXRlX3Jlc2V0X211bHRpcGxpZXIKICAgIGRpZyAzCiAgICBwdXNoaW50IDY2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzYgLy8gInJhdGVfcmVzZXRfbXVsdGlwbGllciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDMKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9mbG9vciA9IHRlcm1zLnJhdGVfcmVzZXRfZmxvb3IKICAgIGRpZyAzCiAgICBwdXNoaW50IDc0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzAgLy8gInJhdGVfcmVzZXRfZmxvb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQ0CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfY2FwID0gdGVybXMucmF0ZV9yZXNldF9jYXAKICAgIGRpZyAzCiAgICBwdXNoaW50IDgyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzEgLy8gInJhdGVfcmVzZXRfY2FwIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0NQogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X25leHQgPSB0ZXJtcy5yYXRlX3Jlc2V0X25leHQKICAgIGRpZyAzCiAgICBwdXNoaW50IDkwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzcgLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDYKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgPSB0ZXJtcy5oYXNfcmF0ZV9yZXNldF9mbG9vcgogICAgZGlnIDMKICAgIHB1c2hpbnQgNzg0CiAgICBnZXRiaXQKICAgIGJ5dGVjIDM4IC8vICJoYXNfcmF0ZV9yZXNldF9mbG9vciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDcKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwID0gdGVybXMuaGFzX3JhdGVfcmVzZXRfY2FwCiAgICBkaWcgMwogICAgcHVzaGludCA3ODUKICAgIGdldGJpdAogICAgYnl0ZWMgMzkgLy8gImhhc19yYXRlX3Jlc2V0X2NhcCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDktODUwCiAgICAvLyAjIFNjYWxpbmcKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgPSB0ZXJtcy5maXhlZF9wb2ludF9zY2FsZQogICAgdW5jb3ZlciAzCiAgICBwdXNoaW50IDk5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODUyLTg1MwogICAgLy8gIyBTY2hlZHVsZSBQcm9jZXNzaW5nCiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciA9IGluaXRpYWxfc3RhdGUuZXZlbnRfY3Vyc29yCiAgICBkaWcgMQogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU1LTg1NgogICAgLy8gIyBQZXItVW5pdCBGaXhlZC1Qb2ludCBJbmRleGVzCiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggPSBpbml0aWFsX3N0YXRlLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgKICAgIGRpZyAxCiAgICBwdXNoaW50IDU2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU3CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4ID0gaW5pdGlhbF9zdGF0ZS5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleAogICAgZGlnIDEKICAgIHB1c2hpbnQgNjQKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU5LTg2MAogICAgLy8gIyBSZXNlcnZlZCBBbW91bnQgKGZvciBleGVjdXRlZCBjYXNoZmxvd3MpCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0ID0gVUludDY0KDApCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2MQogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2MwogICAgLy8gYXNzZXJ0IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLCBlcnIuSU5WQUxJRF9JRUQKICAgIGRpZyAyCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICBhc3NlcnQgLy8gSUVEIG11c3QgYmUgc2V0IGluIHRoZSBmdXR1cmUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2NAogICAgLy8gYXNzZXJ0IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA+IGluaXRpYWxfc3RhdGUuc3RhdHVzX2RhdGUsIGVyci5JTlZBTElEX0lFRAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgPAogICAgYXNzZXJ0IC8vIElFRCBtdXN0IGJlIHNldCBpbiB0aGUgZnV0dXJlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NjUKICAgIC8vIGFzc2VydCB0ZXJtcy5pbml0aWFsX2V4Y2hhbmdlX2RhdGUgPCB0ZXJtcy5tYXR1cml0eV9kYXRlLCBlcnIuSU5WQUxJRF9JRUQKICAgIDwKICAgIGFzc2VydCAvLyBJRUQgbXVzdCBiZSBzZXQgaW4gdGhlIGZ1dHVyZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2OS0xMDcwCiAgICAvLyAjIE5vdGFyaXplIHByb3NwZWN0dXMgKG9wdGlvbmFsKQogICAgLy8gc2VsZi5wcm9zcGVjdHVzX2hhc2ggPSBwcm9zcGVjdHVzLmhhc2guYnl0ZXMKICAgIGRpZyAyCiAgICBleHRyYWN0IDAgMzIKICAgIGJ5dGVjIDQyIC8vICJwcm9zcGVjdHVzX2hhc2giCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3MQogICAgLy8gc2VsZi5wcm9zcGVjdHVzX3VybCA9IHByb3NwZWN0dXMudXJsCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGVjIDQzIC8vICJwcm9zcGVjdHVzX3VybCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDcyCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAMTc6CiAgICBpbnRjXzAgLy8gMAogICAgYiBjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUAxOAoKY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAODoKICAgIGludGNfMCAvLyAwCiAgICBiIGNvbnRyYWN0X2NvbmZpZ19ib29sX21lcmdlQDkKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9zY2hlZHVsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X3NjaGVkdWxlOgogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHN3YXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBkdXAKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgMgogICAgKwogICAgdW5jb3ZlciAyCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLkV4ZWN1dGlvblNjaGVkdWxlRW50cnk+CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDg5CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwOTIKICAgIC8vIGNvbnRyYWN0X3R5cGU9c2VsZi5jb250cmFjdF90eXBlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGNvdmVyIDMKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4ODEKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4ODItODg0CiAgICAvLyBhc3NlcnQgc2NoZWR1bGVfcGFnZS5sZW5ndGggPD0gVUludDY0KAogICAgLy8gICAgIGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUKICAgIC8vICksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGR1cAogICAgcHVzaGludCAxNgogICAgPD0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg4NQogICAgLy8gYXNzZXJ0IHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPiBVSW50NjQoMCksIGVyci5URVJNU19OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSB0ZXJtcyBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODg3CiAgICAvLyBwYWdlX2N1cnNvciA9IHNjaGVkdWxlX3BhZ2VfaW5kZXggKiBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkKICAgIHN3YXAKICAgIHB1c2hpbnQgMTYKICAgICoKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg5NAogICAgLy8gKyBwYWdlX2xlbmd0aCAqIFVJbnQ2NChjc3QuT1BfVVBfQ09OVFJBQ1RfQ09ORklHX1BFUl9FTlRSWV9CVURHRVQpCiAgICBwdXNoaW50IDEwMAogICAgKgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODkzCiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19CQVNFX0JVREdFVCkKICAgIGludGMgNCAvLyAxNTAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTMtODk0CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19CQVNFX0JVREdFVCkKICAgIC8vICsgcGFnZV9sZW5ndGggKiBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19QRVJfRU5UUllfQlVER0VUKQogICAgKwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODg5LTg5NgogICAgLy8gIyBWYWxpZGF0aW9uIGNvc3QgZ3Jvd3Mgd2l0aCBwYWdlIGxlbmd0aCwgc28gY29uZmlndXJhdGlvbiBleHBsaWNpdGx5CiAgICAvLyAjIGJ1eXMgZXh0cmEgb3Bjb2RlIGJ1ZGdldCBmb3IgbGFyZ2VyIHVwbG9hZHMuCiAgICAvLyBlbnN1cmVfYnVkZ2V0KAogICAgLy8gICAgIHJlcXVpcmVkX2J1ZGdldD0oCiAgICAvLyAgICAgICAgIFVJbnQ2NChjc3QuT1BfVVBfQ09OVFJBQ1RfQ09ORklHX0JBU0VfQlVER0VUKQogICAgLy8gICAgICAgICArIHBhZ2VfbGVuZ3RoICogVUludDY0KGNzdC5PUF9VUF9DT05UUkFDVF9DT05GSUdfUEVSX0VOVFJZX0JVREdFVCkKICAgIC8vICAgICApLAogICAgLy8gKQogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODk3CiAgICAvLyBpbmRleCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKCmNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEAyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODk4CiAgICAvLyB3aGlsZSBpbmRleCA8IHBhZ2VfbGVuZ3RoOgogICAgZHVwCiAgICBkaWcgNAogICAgPAogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfd2hpbGVAMTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg5OS05MDAKICAgIC8vIGVudHJ5ID0gc2NoZWR1bGVfcGFnZVtpbmRleF0uY29weSgpCiAgICAvLyBlbnRyeV9ldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZGlnIDQKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGJ1cnkgMTIKICAgIGRpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgNjUKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTAwCiAgICAvLyBlbnRyeV9ldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTktOTAwCiAgICAvLyBlbnRyeSA9IHNjaGVkdWxlX3BhZ2VbaW5kZXhdLmNvcHkoKQogICAgLy8gZW50cnlfZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGludGNfMiAvLyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDAKICAgIC8vIGVudHJ5X2V2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBnZXRieXRlCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgMTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkwMQogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X2lkID09IHBhZ2VfY3Vyc29yICsgaW5kZXgsIGVyci5JTlZBTElEX0VWRU5UX0lECiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEzCiAgICBkaWcgNQogICAgdW5jb3ZlciA0CiAgICArCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDItOTA0CiAgICAvLyBzZWxmLl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBlbnRyeV9ldmVudF90eXBlCiAgICAvLyApCiAgICBkaWcgNQogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTA1CiAgICAvLyBhc3NlcnQgZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgc3dhcAogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDYKICAgIC8vIGlmIGVudHJ5LmV2ZW50X2lkID4gVUludDY0KDApOgogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDcKICAgIC8vIGlmIGluZGV4ID4gVUludDY0KDApOgogICAgZHVwCiAgICBieiBjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlANgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTA4CiAgICAvLyBwcmV2aW91c19lbnRyeSA9IHNjaGVkdWxlX3BhZ2VbaW5kZXggLSBVSW50NjQoMSldLmNvcHkoKQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgcHVzaGludCA2NQogICAgKgogICAgZGlnIDExCiAgICBzd2FwCiAgICBwdXNoaW50IDY1CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkyMwogICAgLy8gcHJldmlvdXNfZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gZW50cnkuc2NoZWR1bGVkX3RpbWUKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyA4CiAgICA8PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTIyLTkyNAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBwcmV2aW91c19lbnRyeS5zY2hlZHVsZWRfdGltZSA8PSBlbnRyeS5zY2hlZHVsZWRfdGltZQogICAgLy8gKSwgZXJyLklOVkFMSURfU09SVElORwogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIG11c3QgYmUgc29ydGVkIGluIHN0cmljdGx5IGFzY2VuZGluZyBvcmRlcgoKY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUA4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTI1CiAgICAvLyBpZiBlbnRyeS5ldmVudF9pZCA9PSBVSW50NjQoMCk6CiAgICBkaWcgOAogICAgYm56IGNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkyNi05MjgKICAgIC8vIGFzc2VydCBlbnRyeV9ldmVudF90eXBlID09IFVJbnQ2NCgKICAgIC8vICAgICBlbnVtcy5FVlRfSUVECiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGRpZyA5CiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjkKICAgIC8vIGluZGV4ICs9IFVJbnQ2NCgxKQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIGNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEAyCgpjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlANjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkxMC05MTIKICAgIC8vICMgVGhlIGZpcnN0IGVudHJ5IG9mIGEgcGFnZSBtdXN0IHN0aWxsIGJlIG9yZGVyZWQgYWZ0ZXIgdGhlCiAgICAvLyAjIGxhc3QgZW50cnkgb2YgdGhlIHByZXZpb3VzIHBhZ2UuCiAgICAvLyBhc3NlcnQgc2NoZWR1bGVfcGFnZV9pbmRleCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGRpZyA2CiAgICBkdXAKICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTMKICAgIC8vIHByZXZpb3VzX3BhZ2VfaW5kZXggPSBzY2hlZHVsZV9wYWdlX2luZGV4IC0gVUludDY0KDEpCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTE1CiAgICAvLyBwcmV2aW91c19wYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZQogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTQtOTE2CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHByZXZpb3VzX3BhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTctOTE4CiAgICAvLyBwcmV2aW91c19wYWdlID0gc2VsZi5zY2hlZHVsZV9wYWdlW3ByZXZpb3VzX3BhZ2VfaW5kZXhdLmNvcHkoKQogICAgLy8gYXNzZXJ0IHByZXZpb3VzX3BhZ2UubGVuZ3RoID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBwdXNoaW50IDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTgKICAgIC8vIGFzc2VydCBwcmV2aW91c19wYWdlLmxlbmd0aCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZHVwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjAKICAgIC8vIHByZXZpb3VzX3BhZ2UubGVuZ3RoIC0gVUludDY0KDEpCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTE5LTkyMQogICAgLy8gcHJldmlvdXNfZW50cnkgPSBwcmV2aW91c19wYWdlWwogICAgLy8gICAgIHByZXZpb3VzX3BhZ2UubGVuZ3RoIC0gVUludDY0KDEpCiAgICAvLyBdLmNvcHkoKQogICAgcHVzaGludCA2NQogICAgKgogICAgcHVzaGludCAyCiAgICArCiAgICBwdXNoaW50IDY1CiAgICBib3hfZXh0cmFjdAogICAgYiBjb250cmFjdF9zY2hlZHVsZV9hZnRlcl9pZl9lbHNlQDcKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX3doaWxlQDExOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjAwCiAgICAvLyBzZWxmLnNjaGVkdWxlX3BhZ2VbcGFnZV9pbmRleF0gPSBzY2hlZHVsZV9wYWdlLmNvcHkoKQogICAgZGlnIDYKICAgIGl0b2IKICAgIGJ5dGVjIDI0IC8vIDB4NTMyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgZGlnIDUKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzMgogICAgLy8gaWYgaXNfbGFzdF9wYWdlOgogICAgZGlnIDUKICAgIGJ6IGNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzNAogICAgLy8gc2NoZWR1bGVfcGFnZV9pbmRleCAqIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKSArIHBhZ2VfbGVuZ3RoCiAgICBkaWcgMQogICAgZGlnIDQKICAgICsKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzMwogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA9ICgKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTMzLTkzNQogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA9ICgKICAgIC8vICAgICBzY2hlZHVsZV9wYWdlX2luZGV4ICogVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpICsgcGFnZV9sZW5ndGgKICAgIC8vICkKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MzYKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgNTAKICAgIGFwcF9nbG9iYWxfcHV0Cgpjb250cmFjdF9zY2hlZHVsZV9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA5NwogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9leGVjdXRlX2llZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X2V4ZWN1dGVfaWVkOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMDcKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEwOAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMDkKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTExCiAgICAvLyBhc3NlcnQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LCBlcnIuSU5WQUxJRF9FVkVOVF9DVVJTT1IKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgZGlnIDEKICAgID4KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGN1cnNvcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTExMgogICAgLy8gZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoc2VsZi5ldmVudF9jdXJzb3IpCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMTMKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoZW51bXMuRVZUX0lFRCksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGR1cAogICAgZXh0cmFjdCA4IDEKICAgIGR1cAogICAgcHVzaGJ5dGVzIDB4MDEKICAgIGI9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTExNwogICAgLy8gZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICBkaWcgMQogICAgZXh0cmFjdCAwIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMTkKICAgIC8vIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgZGlnIDIKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTIwCiAgICAvLyBhY2NydWFsX2ZhY3Rvcj1lbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIGRpZyAzCiAgICBleHRyYWN0IDE3IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMjEKICAgIC8vIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIGRpZyA0CiAgICBleHRyYWN0IDI1IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMjMKICAgIC8vIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPWVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDUKICAgIGV4dHJhY3QgMzMgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEyNAogICAgLy8gbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgZGlnIDYKICAgIGV4dHJhY3QgNDEgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEyNQogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9ZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICBkaWcgNwogICAgZXh0cmFjdCA0OSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTI2CiAgICAvLyBmbGFncz1lbnRyeS5mbGFncywKICAgIGRpZyA4CiAgICBleHRyYWN0IDU3IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMTYtMTEyNwogICAgLy8gdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0KAogICAgLy8gICAgIGV2ZW50X2lkPWVudHJ5LmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1lbnRyeS5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1lbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPWVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9ZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPWVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGZsYWdzPWVudHJ5LmZsYWdzLAogICAgLy8gKSwKICAgIHVuY292ZXIgNwogICAgdW5jb3ZlciA4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNwogICAgY29uY2F0CiAgICB1bmNvdmVyIDYKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMjIKICAgIC8vIG9ic2VydmVkX3JhdGU9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMTYtMTEyNwogICAgLy8gdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0KAogICAgLy8gICAgIGV2ZW50X2lkPWVudHJ5LmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1lbnRyeS5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1lbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPWVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9ZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPWVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGZsYWdzPWVudHJ5LmZsYWdzLAogICAgLy8gKSwKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTE0LTExMjgKICAgIC8vIHNlbGYuX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5KAogICAgLy8gICAgIGVudHJ5LAogICAgLy8gICAgIHR5cC5PYnNlcnZlZEV2ZW50UmVxdWVzdCgKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPWVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIG9ic2VydmVkX3JhdGU9VUludDY0KDApLAogICAgLy8gICAgICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1lbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1lbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICAgICAgZmxhZ3M9ZW50cnkuZmxhZ3MsCiAgICAvLyAgICAgKSwKICAgIC8vICkKICAgIGNhbGxzdWIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5CiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMjkKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA5OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuYXBwbHlfbm9uX2Nhc2hfZXZlbnRbcm91dGluZ10oKSAtPiB2b2lkOgphcHBseV9ub25fY2FzaF9ldmVudDoKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDQKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cG4gMgogICAgbGVuCiAgICBwdXNoaW50IDczCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLk9ic2VydmVkRXZlbnRSZXF1ZXN0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE0NQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDYKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTQ4CiAgICAvLyBpZiBwYXlsb2FkLmZsYWdzICYgVUludDY0KGVudW1zLkZMQUdfT0JTRVJWRURfRVZFTlQpOgogICAgcHVzaGludCA2NQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgcHVzaGludCA0CiAgICAmCiAgICBieiBhcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIzMwogICAgLy8gcmV0dXJuIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQ0xNKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICBwdXNoaW50IDUKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTQ5CiAgICAvLyBhc3NlcnQgc2VsZi5fc3VwcG9ydHNfb2JzZXJ2ZWRfZXZlbnRzKCksIGVyci5PQlNFUlZFRF9FVkVOVF9SRVFVSVJFRAogICAgYXNzZXJ0IC8vIE9ic2VydmVkIGV2ZW50IHJlcXVpcmVkIHRvIGV4ZWN1dGUgdGhpcyBhY3Rpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTAKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjMzCiAgICAvLyByZXR1cm4gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9DTE0pCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIGR1cAogICAgcHVzaGludCA1CiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQ1CiAgICAvLyBhc3NlcnQgc2VsZi5fc3VwcG9ydHNfb2JzZXJ2ZWRfZXZlbnRzKCksIGVyci5PQlNFUlZFRF9FVkVOVF9SRVFVSVJFRAogICAgYXNzZXJ0IC8vIE9ic2VydmVkIGV2ZW50IHJlcXVpcmVkIHRvIGV4ZWN1dGUgdGhpcyBhY3Rpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk0NgogICAgLy8gYXNzZXJ0IHBheWxvYWQuZXZlbnRfaWQgPT0gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGRpZyAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDcKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBpZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQ4CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUsIHBheWxvYWQuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgYnVyeSAxMgogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk0Ny05NDkKICAgIC8vIHNlbGYuX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIHNlbGYuY29udHJhY3RfdHlwZSwgcGF5bG9hZC5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICAvLyApCiAgICBjYWxsc3ViIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTUxCiAgICAvLyBwYWdlX2luZGV4ID0gc2VsZi5fc2NoZWR1bGVfcGFnZV9pbmRleChzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTkwCiAgICAvLyByZXR1cm4gZXZlbnRfaWQgLy8gVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpCiAgICBwdXNoaW50IDE2CiAgICAvCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTIKICAgIC8vIHBhZ2UgPSB0eXAuRXhlY3V0aW9uU2NoZWR1bGVQYWdlKCkKICAgIGJ5dGVjIDQ4IC8vIDB4MDAwMAogICAgYnVyeSA3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTMKICAgIC8vIGlmIHBhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlOgogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA5CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMjcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1NAogICAgLy8gcGFnZSA9IHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XS5jb3B5KCkKICAgIGRpZyA3CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidXJ5IDcKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX3BhZ2UgZW50cnkgZXhpc3RzCgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDI3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTU1CiAgICAvLyBhc3NlcnQgcGFnZS5sZW5ndGggPCBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGRpZyA1CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgMTYKICAgIDwKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2MAogICAgLy8gc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIGRpZyAzCiAgICBkdXAKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjEKICAgIC8vIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICBkaWcgMQogICAgZXh0cmFjdCAxNyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjIKICAgIC8vIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZGlnIDIKICAgIGV4dHJhY3QgMjUgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTYzCiAgICAvLyBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDMKICAgIGV4dHJhY3QgNDEgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTY0CiAgICAvLyBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIGRpZyA0CiAgICBleHRyYWN0IDQ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2NQogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIHVuY292ZXIgNQogICAgZXh0cmFjdCA1NyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTctOTY3CiAgICAvLyB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1wYXlsb2FkLmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9cGF5bG9hZC5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPXBheWxvYWQucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXBheWxvYWQubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICkKICAgIGRpZyAxMQogICAgaXRvYgogICAgZGlnIDE4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMwogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTYtOTY4CiAgICAvLyBwYWdlLmFwcGVuZCgKICAgIC8vICAgICB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9cGF5bG9hZC5ldmVudF9pZCwKICAgIC8vICAgICAgICAgZXZlbnRfdHlwZT1wYXlsb2FkLmV2ZW50X3R5cGUsCiAgICAvLyAgICAgICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIC8vICAgICAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICAgICApCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjkKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHBhZ2UuY29weSgpCiAgICBkaWcgOAogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk3MAogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTUzCiAgICAvLyBhc3NlcnQgZXZlbnRfaWQgPT0gc2VsZi5ldmVudF9jdXJzb3IsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBjdXJzb3IKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTQKICAgIC8vIGVudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KGV2ZW50X2lkKQogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1NgogICAgLy8gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgYnVyeSAxMAogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjQKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY1CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzYzLTM3MAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9SUiksCiAgICBwdXNoaW50IDEyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY3CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICBwdXNoaW50IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY4CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgcHVzaGludCAxOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzYzLTM3MAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBieiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX2ZhbHNlQDE2CgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX3RydWVAMTU6CiAgICBpbnRjXzEgLy8gMQoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9tZXJnZUAxNzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTUtMTE1NwogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2lzX25vbl9jYXNoKAogICAgLy8gICAgIGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIC8vICksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IHR5cGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTgKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlICE9IGFyYzQuVUludDgoZW51bXMuRVZUX0lFRCksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGRpZyA4CiAgICBwdXNoYnl0ZXMgMHgwMQogICAgYiE9CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCB0eXBlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNzQKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluIChVSW50NjQoZW51bXMuRVZUX1JSKSwgVUludDY0KGVudW1zLkVWVF9SUkYpKQogICAgZGlnIDQKICAgIHB1c2hpbnQgMTIKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDIxCiAgICBkaWcgNAogICAgcHVzaGludCAxMQogICAgPT0KICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfZmFsc2VAMjIKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAyMToKICAgIGludGNfMSAvLyAxCgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX21lcmdlQDIzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1OQogICAgLy8gaWYgc2VsZi5fZXZlbnRfaXNfcmF0ZV9yZXNldChlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpKToKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Vsc2VfYm9keUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODAKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLm9ic2VydmVyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjUgLy8gMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTYzCiAgICAvLyBzZWxmLl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeShlbnRyeSwgcGF5bG9hZCkKICAgIGRpZyA2CiAgICBkaWcgMgogICAgY2FsbHN1YiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkKICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE2NAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Vsc2VfYm9keUA1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE2MgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICBiIGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VANgoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9mYWxzZUAyMjoKICAgIGludGNfMCAvLyAwCiAgICBiIGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfbWVyZ2VAMjMKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfZmFsc2VAMTY6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX21lcmdlQDE3CgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuYXBwZW5kX29ic2VydmVkX2Nhc2hfZXZlbnRbcm91dGluZ10oKSAtPiB2b2lkOgphcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudDoKICAgIGludGNfMCAvLyAwCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBsZW4KICAgIHB1c2hpbnQgNjUKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuT2JzZXJ2ZWRDYXNoRXZlbnRSZXF1ZXN0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE3NAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTc1CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE3NgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDcKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMzMKICAgIC8vIHJldHVybiBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0NMTSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgcHVzaGludCA1CiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTgxCiAgICAvLyBhc3NlcnQgc2VsZi5fc3VwcG9ydHNfb2JzZXJ2ZWRfZXZlbnRzKCksIGVyci5PQlNFUlZFRF9FVkVOVF9SRVFVSVJFRAogICAgYXNzZXJ0IC8vIE9ic2VydmVkIGV2ZW50IHJlcXVpcmVkIHRvIGV4ZWN1dGUgdGhpcyBhY3Rpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4MgogICAgLy8gYXNzZXJ0IHBheWxvYWQuZXZlbnRfaWQgPT0gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIHN3YXAKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgaWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4MwogICAgLy8gYXNzZXJ0IHBheWxvYWQuZXZlbnRfdHlwZSA9PSBhcmM0LlVJbnQ4KGVudW1zLkVWVF9QUiksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGRpZyAxCiAgICBleHRyYWN0IDggMQogICAgZHVwCiAgICBjb3ZlciAzCiAgICBwdXNoYnl0ZXMgMHgwMwogICAgYj09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCB0eXBlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5ODQKICAgIC8vIGFzc2VydCBwYXlsb2FkLmZsYWdzICYgVUludDY0KGVudW1zLkZMQUdfQ0FTSF9FVkVOVCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgc3dhcAogICAgcHVzaGludCA1NwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18xIC8vIDEKICAgICYKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4NgogICAgLy8gaWYgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA+IFVJbnQ2NCgwKToKICAgIGJ6IGFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTg4CiAgICAvLyBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IC0gVUludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTg3LTk4OQogICAgLy8gcHJldmlvdXNfZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoCiAgICAvLyAgICAgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCAtIFVJbnQ2NCgxKQogICAgLy8gKQogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OTEKICAgIC8vIHByZXZpb3VzX2VudHJ5LnNjaGVkdWxlZF90aW1lIDw9IHBheWxvYWQuc2NoZWR1bGVkX3RpbWUKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyA0CiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICA8PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTkwLTk5MgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBwcmV2aW91c19lbnRyeS5zY2hlZHVsZWRfdGltZSA8PSBwYXlsb2FkLnNjaGVkdWxlZF90aW1lCiAgICAvLyApLCBlcnIuSU5WQUxJRF9TT1JUSU5HCiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbXVzdCBiZSBzb3J0ZWQgaW4gc3RyaWN0bHkgYXNjZW5kaW5nIG9yZGVyCgphcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OTQKICAgIC8vIHBhZ2VfaW5kZXggPSBzZWxmLl9zY2hlZHVsZV9wYWdlX2luZGV4KHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxOTAKICAgIC8vIHJldHVybiBldmVudF9pZCAvLyBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkKICAgIHB1c2hpbnQgMTYKICAgIC8KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5NQogICAgLy8gcGFnZSA9IHR5cC5FeGVjdXRpb25TY2hlZHVsZVBhZ2UoKQogICAgYnl0ZWMgNDggLy8gMHgwMDAwCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5NgogICAgLy8gaWYgcGFnZV9pbmRleCBpbiBzZWxmLnNjaGVkdWxlX3BhZ2U6CiAgICBpdG9iCiAgICBieXRlYyAyNCAvLyAweDUzMjMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDcKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogYXBwZW5kX29ic2VydmVkX2Nhc2hfZXZlbnRfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OTcKICAgIC8vIHBhZ2UgPSBzZWxmLnNjaGVkdWxlX3BhZ2VbcGFnZV9pbmRleF0uY29weSgpCiAgICBkaWcgNQogICAgYm94X2dldAogICAgc3dhcAogICAgYnVyeSA2CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9wYWdlIGVudHJ5IGV4aXN0cwoKYXBwZW5kX29ic2VydmVkX2Nhc2hfZXZlbnRfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTk4CiAgICAvLyBhc3NlcnQgcGFnZS5sZW5ndGggPCBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGRpZyA0CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgMTYKICAgIDwKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMDMKICAgIC8vIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICBkaWcgNQogICAgZHVwCiAgICBleHRyYWN0IDkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAwNAogICAgLy8gYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIGRpZyAxCiAgICBleHRyYWN0IDE3IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMDUKICAgIC8vIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZGlnIDIKICAgIGV4dHJhY3QgMjUgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAwNgogICAgLy8gbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9cGF5bG9hZC5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIGRpZyAzCiAgICBleHRyYWN0IDMzIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMDcKICAgIC8vIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgZGlnIDQKICAgIGV4dHJhY3QgNDEgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAwOAogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIHVuY292ZXIgNQogICAgZXh0cmFjdCA0OSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDAwLTEwMTAKICAgIC8vIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgIGV2ZW50X2lkPXBheWxvYWQuZXZlbnRfaWQsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1wYXlsb2FkLmV2ZW50X3R5cGUsCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPXBheWxvYWQubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1wYXlsb2FkLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICBmbGFncz1wYXlsb2FkLmZsYWdzLAogICAgLy8gKQogICAgZGlnIDEwCiAgICBpdG9iCiAgICBkaWcgMTAKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5OS0xMDExCiAgICAvLyBwYWdlLmFwcGVuZCgKICAgIC8vICAgICB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9cGF5bG9hZC5ldmVudF9pZCwKICAgIC8vICAgICAgICAgZXZlbnRfdHlwZT1wYXlsb2FkLmV2ZW50X3R5cGUsCiAgICAvLyAgICAgICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIC8vICAgICAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICAgICApCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDEyCiAgICAvLyBzZWxmLnNjaGVkdWxlX3BhZ2VbcGFnZV9pbmRleF0gPSBwYWdlLmNvcHkoKQogICAgZGlnIDYKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDEzCiAgICAvLyBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50ICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExODAKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfZ2V0X3N0YXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfZ2V0X3N0YXRlOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBkdXAKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE4NwogICAgLy8gY29udHJhY3RfdHlwZT1hcmM0LlVJbnQ4KHNlbGYuY29udHJhY3RfdHlwZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzIgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExODkKICAgIC8vIHRvdGFsX3VuaXRzPXNlbGYudG90YWxfdW5pdHMsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE5MAogICAgLy8gcmVzZXJ2ZWRfdW5pdHNfdG90YWw9c2VsZi5yZXNlcnZlZF91bml0c190b3RhbCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTkxCiAgICAvLyBpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudD1zZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExOTIKICAgIC8vIGV2ZW50X2N1cnNvcj1zZWxmLmV2ZW50X2N1cnNvciwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE5MwogICAgLy8gc2NoZWR1bGVfZW50cnlfY291bnQ9c2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExOTQKICAgIC8vIG91dHN0YW5kaW5nX3ByaW5jaXBhbD1zZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE5NQogICAgLy8gaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZT1zZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE5NgogICAgLy8gbm9taW5hbF9pbnRlcmVzdF9yYXRlPXNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTk3CiAgICAvLyBhY2NydWVkX2ludGVyZXN0PXNlbGYuYWNjcnVlZF9pbnRlcmVzdCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTk4CiAgICAvLyBjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4PXNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE5OQogICAgLy8gY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXg9c2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjAwCiAgICAvLyByZXNlcnZlZF9pbnRlcmVzdD1zZWxmLnJlc2VydmVkX2ludGVyZXN0LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMDEKICAgIC8vIHJlc2VydmVkX3ByaW5jaXBhbD1zZWxmLnJlc2VydmVkX3ByaW5jaXBhbCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExODYtMTIwMgogICAgLy8gcmV0dXJuIHR5cC5LZXJuZWxTdGF0ZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlPWFyYzQuVUludDgoc2VsZi5jb250cmFjdF90eXBlKSwKICAgIC8vICAgICBzdGF0dXM9c2VsZi5zdGF0dXMsCiAgICAvLyAgICAgdG90YWxfdW5pdHM9c2VsZi50b3RhbF91bml0cywKICAgIC8vICAgICByZXNlcnZlZF91bml0c190b3RhbD1zZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsLAogICAgLy8gICAgIGluaXRpYWxfZXhjaGFuZ2VfYW1vdW50PXNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQsCiAgICAvLyAgICAgZXZlbnRfY3Vyc29yPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgLy8gICAgIHNjaGVkdWxlX2VudHJ5X2NvdW50PXNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQsCiAgICAvLyAgICAgb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2U9c2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlLAogICAgLy8gICAgIG5vbWluYWxfaW50ZXJlc3RfcmF0ZT1zZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBhY2NydWVkX2ludGVyZXN0PXNlbGYuYWNjcnVlZF9pbnRlcmVzdCwKICAgIC8vICAgICBjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4PXNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCwKICAgIC8vICAgICBjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleD1zZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4LAogICAgLy8gICAgIHJlc2VydmVkX2ludGVyZXN0PXNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QsCiAgICAvLyAgICAgcmVzZXJ2ZWRfcHJpbmNpcGFsPXNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsLAogICAgLy8gKQogICAgdW5jb3ZlciAxNAogICAgaXRvYgogICAgdW5jb3ZlciAxNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDEzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDEwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgOQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDgKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTgyCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnRbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIwOAogICAgLy8gaWYgc2VsZi5ldmVudF9jdXJzb3IgPj0gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgPj0KICAgIGJ6IGNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMTAKICAgIC8vIGV2ZW50X2lkPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjA5LTEyMTkKICAgIC8vIHJldHVybiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1zZWxmLmV2ZW50X2N1cnNvciwKICAgIC8vICAgICBldmVudF90eXBlPWFyYzQuVUludDgoMCksCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9VUludDY0KDApLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9VUludDY0KDApLAogICAgLy8gICAgIGZsYWdzPVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGl0b2IKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMTEKICAgIC8vIGV2ZW50X3R5cGU9YXJjNC5VSW50OCgwKSwKICAgIGJ5dGVjIDQwIC8vIDB4MDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMDktMTIxOQogICAgLy8gcmV0dXJuIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgIGV2ZW50X2lkPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgLy8gICAgIGV2ZW50X3R5cGU9YXJjNC5VSW50OCgwKSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1VSW50NjQoMCksCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1VSW50NjQoMCksCiAgICAvLyAgICAgZmxhZ3M9VUludDY0KDApLAogICAgLy8gKQogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjEyCiAgICAvLyBzY2hlZHVsZWRfdGltZT1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIwOS0xMjE5CiAgICAvLyByZXR1cm4gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkoCiAgICAvLyAgICAgZXZlbnRfaWQ9c2VsZi5ldmVudF9jdXJzb3IsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1hcmM0LlVJbnQ4KDApLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPVVJbnQ2NCgwKSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249VUludDY0KDApLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPVVJbnQ2NCgwKSwKICAgIC8vICAgICBmbGFncz1VSW50NjQoMCksCiAgICAvLyApCiAgICBpdG9iCiAgICBzd2FwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKCmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudF9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudEA0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIwNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpjb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIyMAogICAgLy8gcmV0dXJuIHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLmV2ZW50X2N1cnNvcikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjA0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50QDQKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5jb250cmFjdF91cGRhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF91cGRhdGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTUzLTE1NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGdyYW50cyB0aGUgdXBkYXRlIHBlcm1pc3Npb25zIHRvIHRoZSBBcnJhbmdlci4KICAgIC8vICMg4pqg77iPIFdBUk5JTkc6IEFwcGxpY2F0aW9uIHVwZGF0ZXMgbXVzdCBiZSBleGVjdXRlZCBWRVJZIGNhcmVmdWxseSwgYXMgdGhleQogICAgLy8gIyBtaWdodCBpbnRyb2R1Y2UgYnJlYWtpbmcgY2hhbmdlcy4KICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfcm90YXRlX2FycmFuZ2VyW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19yb3RhdGVfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2OQogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTcwCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gbmV3X2FycmFuZ2VyCiAgICBieXRlYyAxOCAvLyAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTcxCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfc2V0X29wX2RhZW1vbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfc2V0X29wX2RhZW1vbjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTg0CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODUKICAgIC8vIHNlbGYub3BfZGFlbW9uLnZhbHVlID0gYWRkcmVzcwogICAgYnl0ZWMgMjYgLy8gMHg1MjIzNGY3MDQ0NjE2NTZkNmY2ZTIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4NgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTczCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2Fzc2lnbl9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19hc3NpZ25fcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDE2CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLlJvbGVWYWxpZGl0eQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjExCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMgogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgcHVzaGludCAyMAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTAzCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gcm9sZV9hZGRyZXNzCiAgICBieXRlYyAxOCAvLyAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMKICAgIGRpZyAzCiAgICBhcHBfZ2xvYmFsX3B1dAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTQKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDYKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIGR1cAogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnRfbWFuYWdlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMyAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwOAogICAgLy8gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMiAvLyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTIKICAgIC8vIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIGR1cAogICAgcHVzaGludCA2MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE1CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMzIgLy8gMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE2CiAgICAvLyBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExOAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMSAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIwCiAgICAvLyBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMwogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgODAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIzCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI1IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI0CiAgICAvLyBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3Jldm9rZV9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19yZXZva2Vfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzUKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzNgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzcKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCkpCiAgICBidG9pCiAgICBkdXBuIDIKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCAhPSBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksIGVyci5JTlZBTElEX1JPTEUKICAgIGR1cAogICAgcHVzaGludCAyMAogICAgIT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyOAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIzIC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0NGQ2MTZlNjE2NzY1NzIyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMwCiAgICAvLyBkZWwgc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzOQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjE2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIyIC8vIDB4NTIyMzUwNzI2OTZkNjE3Mjc5NDQ2NTYxNmM2NTcyMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNAogICAgLy8gZGVsIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjM4CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIGR1cAogICAgcHVzaGludCA2MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAzMiAvLyAweDUyMjM1NDcyNzU3Mzc0NjU2NTIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzgKICAgIC8vIGRlbCBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjM4CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDEKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hdXRob3JpdHksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjEgLy8gMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MgogICAgLy8gZGVsIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzOAogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDQKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDgwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI1IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ2CiAgICAvLyBkZWwgc2VsZi5vYnNlcnZlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfY29udHJhY3Rfc3VzcGVuc2lvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfY29udHJhY3Rfc3VzcGVuc2lvbjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCAgIyBUT0RPOiBVcGRhdGUgc3BlY3MgYW5kIGFkZCB0ZXN0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojc3CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyMSAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1NwogICAgLy8gc2VsZi5hc3NldF9zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGJ5dGVjIDMzIC8vICJhc3NldF9zdXNwZW5kZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1OAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QgICMgVE9ETzogVXBkYXRlIHNwZWNzIGFuZCBhZGQgdGVzdAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X2FycmFuZ2VyW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjY4CiAgICAvLyByZXR1cm4gc2VsZi5hcnJhbmdlci52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE4IC8vIDB4NTIyMzQxNzI3MjYxNmU2NzY1NzIyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI2MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYWRkcmVzc19yb2xlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjcwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4NAogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hY2NvdW50X21hbmFnZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjMgLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQ0ZDYxNmU2MTY3NjU3MjIzCiAgICBkaWcgMQogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODUKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYucHJpbWFyeV9kZWFsZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjIgLy8gMHg1MjIzNTA3MjY5NmQ2MTcyNzk0NDY1NjE2YzY1NzIyMwogICAgZGlnIDIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg2CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnRydXN0ZWUsIGFkZHJlc3MpLAogICAgYnl0ZWMgMzIgLy8gMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMwogICAgZGlnIDMKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg3CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgYWRkcmVzcyksCiAgICBieXRlYyAyMSAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgZGlnIDQKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg4CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLm9ic2VydmVyLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDI1IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgdW5jb3ZlciA1CiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlYyA0MCAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciA2CiAgICBzZXRiaXQKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDUKICAgIHNldGJpdAogICAgcHVzaGludCAyCiAgICB1bmNvdmVyIDQKICAgIHNldGJpdAogICAgcHVzaGludCAzCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgcHVzaGludCA0CiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwNQogICAgLy8gcm9sZSA9IHJvbGVfaWQuYXNfdWludDY0KCkKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDYKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGUpCiAgICBkdXAKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA4CiAgICAvLyBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKToKICAgIHB1c2hpbnRzIDIwIDQwIDUwIDYwIDcwIDgwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA3LTMzOAogICAgLy8gbWF0Y2ggcm9sZToKICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKToKICAgIC8vICAgICAgICAgcmV0dXJuIHR5cC5Sb2xlVmFsaWRpdHkoCiAgICAvLyAgICAgICAgICAgICByb2xlX3ZhbGlkaXR5X3N0YXJ0PVVJbnQ2NCgwKSwgcm9sZV92YWxpZGl0eV9lbmQ9VUludDY0KDApCiAgICAvLyAgICAgICAgICkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSk6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSk6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgXzoKICAgIC8vICAgICAgICAgb3AuZXJyKGVyci5JTlZBTElEX1JPTEUpCiAgICB1bmNvdmVyIDYKICAgIG1hdGNoIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMEAyIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMUAzIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMkA0IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfM0A1IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNEA2IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzM4CiAgICAvLyBvcC5lcnIoZXJyLklOVkFMSURfUk9MRSkKICAgIGVyciAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV81QDc6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzM0CiAgICAvLyBzZWxmLm9ic2VydmVyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDI1IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMzMy0zMzUKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLm9ic2VydmVyLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzYKICAgIC8vIHJldHVybiBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV80QDY6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI5CiAgICAvLyBzZWxmLmF1dGhvcml0eSwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAyMSAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOC0zMzAKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLmF1dGhvcml0eSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzMxCiAgICAvLyByZXR1cm4gc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8zQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI0CiAgICAvLyBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMzIgLy8gMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMy0zMjUKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyNgogICAgLy8gcmV0dXJuIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzJANDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTkKICAgIC8vIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMjIgLy8gMHg1MjIzNTA3MjY5NmQ2MTcyNzk0NDY1NjE2YzY1NzIyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxOC0zMjAKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLnByaW1hcnlfZGVhbGVyLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjEKICAgIC8vIHJldHVybiBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMUAzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxNAogICAgLy8gc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMjMgLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQ0ZDYxNmU2MTY3NjU3MjIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEzLTMxNQogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTYKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzBAMjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDktMzExCiAgICAvLyByZXR1cm4gdHlwLlJvbGVWYWxpZGl0eSgKICAgIC8vICAgICByb2xlX3ZhbGlkaXR5X3N0YXJ0PVVJbnQ2NCgwKSwgcm9sZV92YWxpZGl0eV9lbmQ9VUludDY0KDApCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB2b2lkOgpfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZDoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNgogICAgLy8gZGVmIF9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHNlbGYsIGhvbGRpbmdfYWRkcmVzczogQWNjb3VudCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI4CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZCwgZXJyLlNVU1BFTkRFRAogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHB1c2hpbnQgMzg0CiAgICBnZXRiaXQKICAgICEKICAgIGFzc2VydCAvLyBTdXNwZW5kZWQgb3BlcmF0aW9ucwogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuX3NldHRsZV9wb3NpdGlvbihob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB1aW50NjQsIHVpbnQ2NDoKX3NldHRsZV9wb3NpdGlvbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo0NAogICAgLy8gZGVmIF9zZXR0bGVfcG9zaXRpb24oc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50KSAtPiB0dXBsZVtVSW50NjQsIFVJbnQ2NF06CiAgICBwcm90byAxIDIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NjEKICAgIC8vIHBvc2l0aW9uID0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY29weSgpCiAgICBkdXAKICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjYzLTY1CiAgICAvLyAjIENvbXB1dGUgdGhlIGluY3JlbWVudGFsIHBlci11bml0IGZpeGVkLXBvaW50IGludGVyZXN0IGFuZCBwcmluY2lwYWwgYWNjcnVlZAogICAgLy8gIyBzaW5jZSB0aGlzIGFjY291bnQncyBsYXN0IGNoZWNrcG9pbnQuCiAgICAvLyBpbnRlcmVzdF9kZWx0YSA9IHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCAtIHBvc2l0aW9uLmludGVyZXN0X2NoZWNrcG9pbnQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IGV4aXN0cwogICAgZGlnIDEKICAgIHB1c2hpbnQgNTcKICAgIGV4dHJhY3RfdWludDY0CiAgICAtCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NjcKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggLSBwb3NpdGlvbi5wcmluY2lwYWxfY2hlY2twb2ludAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCBleGlzdHMKICAgIGRpZyAyCiAgICBwdXNoaW50IDY1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjczCiAgICAvLyBpbnRlcmVzdF9kZWx0YSwgcG9zaXRpb24udW5pdHMsIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUKICAgIGRpZyAyCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzAtNzQKICAgIC8vICMgQ29udmVydCB0aGUgcGVyLXVuaXQgZml4ZWQtcG9pbnQgZGVsdGFzIGludG8gYWJzb2x1dGUgY2xhaW1hYmxlIGFtb3VudHMKICAgIC8vICMgdXNpbmcgdGhlIGFjY291bnQncyBhY3RpdmUgdW5pdHMuCiAgICAvLyBjbGFpbWFibGVfaW50ZXJlc3QgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBpbnRlcmVzdF9kZWx0YSwgcG9zaXRpb24udW5pdHMsIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUKICAgIC8vICkKICAgIHVuY292ZXIgMwogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3NgogICAgLy8gcHJpbmNpcGFsX2RlbHRhLCBwb3NpdGlvbi51bml0cywgc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojc1LTc3CiAgICAvLyBjbGFpbWFibGVfcHJpbmNpcGFsID0gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgcHJpbmNpcGFsX2RlbHRhLCBwb3NpdGlvbi51bml0cywgc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgLy8gKQogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3OS04MQogICAgLy8gIyBBY2NydWUgdGhlIGNsYWltYWJsZSBhbW91bnRzIHRvIHRoZSBhY2NvdW50IHBvc2l0aW9uIGFuZCBtYWtlIHRoZW0gYXZhaWxhYmxlCiAgICAvLyAjIGZvciB3aXRoZHJhd2FsLgogICAgLy8gcG9zaXRpb24uY2xhaW1hYmxlX2ludGVyZXN0ICs9IGNsYWltYWJsZV9pbnRlcmVzdAogICAgZGlnIDIKICAgIHB1c2hpbnQgNzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgKwogICAgaXRvYgogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICByZXBsYWNlMiA3MwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjgyCiAgICAvLyBwb3NpdGlvbi5jbGFpbWFibGVfcHJpbmNpcGFsICs9IGNsYWltYWJsZV9wcmluY2lwYWwKICAgIGR1cAogICAgcHVzaGludCA4MQogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICArCiAgICBpdG9iCiAgICByZXBsYWNlMiA4MQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojg0LTg2CiAgICAvLyAjIEFkdmFuY2UgdGhlIGFjY291bnQncyBwZXItdW5pdCBmaXhlZC1wb2ludCBjaGVja3BvaW50cyB0byB0aGUgY3VycmVudCBnbG9iYWwKICAgIC8vICMgcGVyLXVuaXQgZml4ZWQtcG9pbnQgZ2xvYmFsIGluZGljZXMuCiAgICAvLyBwb3NpdGlvbi5pbnRlcmVzdF9jaGVja3BvaW50ID0gc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCBleGlzdHMKICAgIGl0b2IKICAgIHJlcGxhY2UyIDU3CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6ODcKICAgIC8vIHBvc2l0aW9uLnByaW5jaXBhbF9jaGVja3BvaW50ID0gc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCBleGlzdHMKICAgIGl0b2IKICAgIHJlcGxhY2UyIDY1CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6ODktOTAKICAgIC8vICMgQWR2YW5jZSB0aGUgYWNjb3VudCdzIGV2ZW50IGN1cnNvciB0byB0aGUgY3VycmVudCBnbG9iYWwgZXZlbnQgY3Vyc29yLgogICAgLy8gcG9zaXRpb24uc2V0dGxlZF9jdXJzb3IgPSBzZWxmLmV2ZW50X2N1cnNvcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpdG9iCiAgICByZXBsYWNlMiA0OQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjkyLTk0CiAgICAvLyAjIFVwZGF0ZSB0aGUgYWNjb3VudCBwb3NpdGlvbiBhbmQgcmV0dXJuIHRoZSBuZXdseSBhY2NydWVkIGNsYWltYWJsZSBhbW91bnRzCiAgICAvLyAjIGFkZGVkIHRvIHRoZSB0b3RhbCBwb3NpdGlvbidzIGNsYWltYWJsZSBhbW91bnRzLgogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSBwb3NpdGlvbi5jb3B5KCkKICAgIHVuY292ZXIgMwogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojk1CiAgICAvLyByZXR1cm4gY2xhaW1hYmxlX2ludGVyZXN0LCBjbGFpbWFibGVfcHJpbmNpcGFsCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5fZW5zdXJlX3VuaXRzX2FjdGl2YXRlZChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB2b2lkOgpfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZDoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo5NwogICAgLy8gZGVmIF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKHNlbGYsIGhvbGRpbmdfYWRkcmVzczogQWNjb3VudCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTAwCiAgICAvLyBpZiBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKToKICAgIGJ6IF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwMQogICAgLy8gcmV0dXJuCiAgICByZXRzdWIKCl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDMKICAgIC8vIHBvc2l0aW9uID0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY29weSgpCiAgICBmcmFtZV9kaWcgMgogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA0CiAgICAvLyBpZiBwb3NpdGlvbi5yZXNlcnZlZF91bml0cyA9PSBVSW50NjQoMCk6CiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIGJueiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZF9hZnRlcl9pZl9lbHNlQDQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDUKICAgIC8vIHJldHVybgogICAgcmV0c3ViCgpfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZF9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA4CiAgICAvLyBwb3NpdGlvbi51bml0cyArPSBhY3RpdmF0ZWRfdW5pdHMKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDMKICAgICsKICAgIGl0b2IKICAgIHJlcGxhY2UyIDMyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA5CiAgICAvLyBwb3NpdGlvbi5yZXNlcnZlZF91bml0cyA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGl0b2IKICAgIHJlcGxhY2UyIDQwCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTEwCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHBvc2l0aW9uLmNvcHkoKQogICAgZnJhbWVfZGlnIDIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTEKICAgIC8vIGFzc2VydCBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID49IGFjdGl2YXRlZF91bml0cywgZXJyLk9WRVJfRElTVFJJQlVUSU9OCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIGV4aXN0cwogICAgZHVwCiAgICBkaWcgMgogICAgPj0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgcmVtYWluaW5nIEQtQVNBIHVuaXRzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTEyCiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIC09IGFjdGl2YXRlZF91bml0cwogICAgc3dhcAogICAgLQogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9zY2FsZWRfbXVsX2RpdihtdWx0aXBsaWNhbmQ6IHVpbnQ2NCwgbXVsdGlwbGllcjogdWludDY0LCBkaXZpc29yOiB1aW50NjQpIC0+IHVpbnQ2NDoKX3NjYWxlZF9tdWxfZGl2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTUzLTE1NQogICAgLy8gZGVmIF9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLCBtdWx0aXBsaWNhbmQ6IFVJbnQ2NCwgbXVsdGlwbGllcjogVUludDY0LCBkaXZpc29yOiBVSW50NjQKICAgIC8vICkgLT4gVUludDY0OgogICAgcHJvdG8gMyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTcKICAgIC8vIGlmIG11bHRpcGxpY2FuZCA9PSBVSW50NjQoMCkgb3IgbXVsdGlwbGllciA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTMKICAgIGJ6IF9zY2FsZWRfbXVsX2Rpdl9pZl9ib2R5QDIKICAgIGZyYW1lX2RpZyAtMgogICAgYm56IF9zY2FsZWRfbXVsX2Rpdl9hZnRlcl9pZl9lbHNlQDMKCl9zY2FsZWRfbXVsX2Rpdl9pZl9ib2R5QDI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTgKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9zY2FsZWRfbXVsX2Rpdl9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTkKICAgIC8vIGhpZ2gsIGxvdyA9IG9wLm11bHcobXVsdGlwbGljYW5kLCBtdWx0aXBsaWVyKQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIG11bHcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2MAogICAgLy8gcmV0dXJuIG9wLmRpdncoaGlnaCwgbG93LCBkaXZpc29yKQogICAgZnJhbWVfZGlnIC0xCiAgICBkaXZ3CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYW1vdW50X3RvX2luZGV4X2RlbHRhKGFtb3VudDogdWludDY0KSAtPiB1aW50NjQ6Cl9hbW91bnRfdG9faW5kZXhfZGVsdGE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjIKICAgIC8vIGRlZiBfYW1vdW50X3RvX2luZGV4X2RlbHRhKHNlbGYsIGFtb3VudDogVUludDY0KSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2NAogICAgLy8gaWYgYW1vdW50ID09IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMQogICAgYm56IF9hbW91bnRfdG9faW5kZXhfZGVsdGFfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjUKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9hbW91bnRfdG9faW5kZXhfZGVsdGFfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTY2CiAgICAvLyBhc3NlcnQgc2VsZi50b3RhbF91bml0cyA+IFVJbnQ2NCgwKSwgZXJyLk5PX1VOSVRTCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgZHVwCiAgICBhc3NlcnQgLy8gTm8gRC1BU0EgdW5pdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2NwogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KGFtb3VudCwgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwgc2VsZi50b3RhbF91bml0cykKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2luZGV4X2RlbHRhX3RvX2Ftb3VudChpbmRleF9kZWx0YTogdWludDY0KSAtPiB1aW50NjQ6Cl9pbmRleF9kZWx0YV90b19hbW91bnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjkKICAgIC8vIGRlZiBfaW5kZXhfZGVsdGFfdG9fYW1vdW50KHNlbGYsIGluZGV4X2RlbHRhOiBVSW50NjQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTc2CiAgICAvLyBpZiBpbmRleF9kZWx0YSA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGJueiBfaW5kZXhfZGVsdGFfdG9fYW1vdW50X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTc3CiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfaW5kZXhfZGVsdGFfdG9fYW1vdW50X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE3OQogICAgLy8gc2VsZi50b3RhbF91bml0cywKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxODEKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNzgtMTgyCiAgICAvLyByZXR1cm4gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgc2VsZi50b3RhbF91bml0cywKICAgIC8vICAgICBpbmRleF9kZWx0YSwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2dldF9zY2hlZHVsZV9lbnRyeShldmVudF9pZDogdWludDY0KSAtPiBieXRlczoKX2dldF9zY2hlZHVsZV9lbnRyeToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIwMgogICAgLy8gZGVmIF9nZXRfc2NoZWR1bGVfZW50cnkoc2VsZiwgZXZlbnRfaWQ6IFVJbnQ2NCkgLT4gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnk6CiAgICBwcm90byAxIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIwNAogICAgLy8gYXNzZXJ0IGV2ZW50X2lkIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgPgogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgaWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE5MAogICAgLy8gcmV0dXJuIGV2ZW50X2lkIC8vIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDE2CiAgICAvCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMDYKICAgIC8vIGFzc2VydCBwYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxOTQKICAgIC8vIHJldHVybiBldmVudF9pZCAlIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDE2CiAgICAlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMDkKICAgIC8vIGFzc2VydCBvZmZzZXQgPCBwYWdlLmxlbmd0aCwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBwdXNoaW50IDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgMQogICAgPgogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjEwCiAgICAvLyByZXR1cm4gcGFnZVtvZmZzZXRdLmNvcHkoKQogICAgcHVzaGludCA2NQogICAgKgogICAgcHVzaGludCAyCiAgICArCiAgICBwdXNoaW50IDY1CiAgICBib3hfZXh0cmFjdAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKGNvbnRyYWN0X3R5cGU6IHVpbnQ2NCwgZXZlbnRfdHlwZTogdWludDY0KSAtPiB2b2lkOgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTMtMzE1CiAgICAvLyBkZWYgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIHNlbGYsIGNvbnRyYWN0X3R5cGU6IFVJbnQ2NCwgZXZlbnRfdHlwZTogVUludDY0CiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNDcKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNDgKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgaW50Y18yIC8vIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI0OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9NRCksCiAgICBwdXNoaW50IDE5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTAKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgcHVzaGludCAxMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU0LTI1NQogICAgLy8gIyBDaGVjayBjb21tb24gZXZlbnRzIGZpcnN0CiAgICAvLyBpZiBldmVudF90eXBlIGluIGNvbW1vbl9ldmVudHM6CiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjUxCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICBwdXNoaW50IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUA3CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU2CiAgICAvLyByZXR1cm4gVHJ1ZQogICAgaW50Y18xIC8vIDEKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICByZXRzdWIKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTgtMjU5CiAgICAvLyAjIENvbnRyYWN0LXNwZWNpZmljIGFkZGl0aW9uYWwgZXZlbnRzCiAgICAvLyBpZiBjb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9QQU0pOgogICAgZnJhbWVfZGlnIC0yCiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjYwLTI2MQogICAgLy8gIyBQQU0gb25seSBzdXBwb3J0cyBjb21tb24gZXZlbnRzCiAgICAvLyByZXR1cm4gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNjMKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0xBTSkgb3IgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2My0yNjUKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0xBTSkgb3IgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoCiAgICAvLyAgICAgZW51bXMuQ1RfTkFNCiAgICAvLyApOgogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDExCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMgogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDE2CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUAxMToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2Ni0yNzAKICAgIC8vICMgTEFNL05BTSBhZGQ6IFBSLCBJUENCCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjY4CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjY2LTI3MAogICAgLy8gIyBMQU0vTkFNIGFkZDogUFIsIElQQ0IKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDEzCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIHB1c2hpbnQgMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2Ni0yNzAKICAgIC8vICMgTEFNL05BTSBhZGQ6IFBSLCBJUENCCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICkKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF9mYWxzZUAxNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAxMzoKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDE0OgogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMTY6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzIKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTik6CiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMjMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3My0yNzgKICAgIC8vICMgQU5OIGFkZHM6IFBSLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjc1CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjczLTI3OAogICAgLy8gIyBBTk4gYWRkczogUFIsIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDIwCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIHB1c2hpbnQgMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3My0yNzgKICAgIC8vICMgQU5OIGFkZHM6IFBSLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyMAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzcKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIHB1c2hpbnQgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjczLTI3OAogICAgLy8gIyBBTk4gYWRkczogUFIsIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDIxCgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDIwOgogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMjE6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAyMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MAogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfTEFYKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA0CiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMzEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MS0yODcKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MwogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUiksCiAgICBwdXNoaW50IDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MS0yODcKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjgKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjg0CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjgxLTI4NwogICAgLy8gIyBMQVggYWRkczogUFIsIFBJLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyOAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODUKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICBwdXNoaW50IDE4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODEtMjg3CiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDI4CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODEtMjg3CiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDI5CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDI4OgogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMjk6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAzMToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4OQogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQ0xNKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA1CiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMzMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI5MC0yOTEKICAgIC8vICMgQ0xNIGFkZHM6IFBSCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1BSKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDMKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDMzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjkzCiAgICAvLyByZXR1cm4gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5faXNfZHluYW1pY19hbm51aXR5KCkgLT4gdWludDY0OgpfaXNfZHluYW1pY19hbm51aXR5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM1CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzUtMzM2CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIC8vIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGJ6IF9pc19keW5hbWljX2FubnVpdHlfYm9vbF9mYWxzZUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzYKICAgIC8vIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzNCAvLyAiZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM1LTMzNgogICAgLy8gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICAvLyBhbmQgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBieiBfaXNfZHluYW1pY19hbm51aXR5X2Jvb2xfZmFsc2VAMwogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMzNC0zMzcKICAgIC8vIHJldHVybiAoCiAgICAvLyAgICAgc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICAvLyAgICAgYW5kIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgLy8gKQogICAgcmV0c3ViCgpfaXNfZHluYW1pY19hbm51aXR5X2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzQtMzM3CiAgICAvLyByZXR1cm4gKAogICAgLy8gICAgIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKQogICAgLy8gICAgIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIC8vICkKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KGVudHJ5OiBieXRlcykgLT4gdWludDY0LCBieXRlczoKX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozODAKICAgIC8vIGRlZiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudChzZWxmLCBlbnRyeTogdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5CiAgICAvLyBlbnRyeS5hY2NydWFsX2ZhY3RvciA9PSBVSW50NjQoMCkKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAxNwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5LTM5MQogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGJ6IF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2lmX2JvZHlAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzkwCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5LTM5MQogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGJ6IF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2lmX2JvZHlAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzkxCiAgICAvLyBvciBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPT0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5LTM5MQogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGJueiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudF9hZnRlcl9pZl9lbHNlQDQKCl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2lmX2JvZHlAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5MwogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2RpZyAtMQogICAgdW5jb3ZlciAyCiAgICByZXRzdWIKCl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NQogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NgogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NC0zOTgKICAgIC8vIGFjY3J1ZWQgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICAvLyAgICAgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICkKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MDIKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozOTktNDAzCiAgICAvLyByZXR1cm4gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgYWNjcnVlZCwKICAgIC8vICAgICBlbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICBmcmFtZV9kaWcgLTEKICAgIHVuY292ZXIgMgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yKGRpc2NvdW50X2ZhY3RvcjogdWludDY0LCByZWRlbXB0aW9uX2ZhY3RvcjogdWludDY0KSAtPiB1aW50NjQ6Cl9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ2Mi00NjYKICAgIC8vIGRlZiBfZGlzY291bnRfYW5udWl0eV9mYWN0b3IoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBkaXNjb3VudF9mYWN0b3I6IFVJbnQ2NCwKICAgIC8vICAgICByZWRlbXB0aW9uX2ZhY3RvcjogVUludDY0LAogICAgLy8gKSAtPiBVSW50NjQ6CiAgICBwcm90byAyIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ2OAogICAgLy8gaWYgcmVkZW1wdGlvbl9mYWN0b3IgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0xCiAgICBibnogX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDY5CiAgICAvLyByZXR1cm4gZGlzY291bnRfZmFjdG9yCiAgICBmcmFtZV9kaWcgLTIKICAgIHJldHN1YgoKX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3MAogICAgLy8gcGVyaW9kX3JhdGUgPSBzZWxmLmZpeGVkX3BvaW50X3NjYWxlICsgc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzEKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzAtNDc0CiAgICAvLyBwZXJpb2RfcmF0ZSA9IHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgKyBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICByZWRlbXB0aW9uX2ZhY3RvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICBkaWcgMgogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgICsKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3NQogICAgLy8gYXNzZXJ0IHBlcmlvZF9yYXRlID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGR1cAogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDc4CiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDc2LTQ4MAogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIGRpc2NvdW50X2ZhY3RvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gICAgIHBlcmlvZF9yYXRlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkoZW50cnk6IGJ5dGVzLCBwYXlsb2FkOiBieXRlcykgLT4gYnl0ZXMsIGJ5dGVzOgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MTMtNjE1CiAgICAvLyBkZWYgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5KAogICAgLy8gICAgIHNlbGYsIGVudHJ5OiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSwgcGF5bG9hZDogdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0CiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAyIDIKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjIzCiAgICAvLyBhc3NlcnQgZW50cnkuZXZlbnRfaWQgPT0gc2VsZi5ldmVudF9jdXJzb3IsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGN1cnNvcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjI0CiAgICAvLyBhc3NlcnQgZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsIGVyci5OT19EVUVfQ0FTSEZMT1cKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPD0KICAgIGFzc2VydCAvLyBObyBkdWUgY2FzaGZsb3cgdG8gcGF5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MjYKICAgIC8vIGV2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYyNwogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX0lFRCk6CiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGR1cAogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYyOC02MzAKICAgIC8vICMgSUVEIGZpbmFsaXplcyBpc3N1YW5jZTogcmVzZXJ2ZWQgdW5pdHMgYmVjb21lIGFjdGl2YXRhYmxlIGFuZCB0aGUKICAgIC8vICMgc2NoZWR1bGUncyBpbml0aWFsIGNvbnRyYWN0dWFsIHN0YXRlIGJlY29tZXMgbGl2ZS4KICAgIC8vIGFzc2VydCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzIKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPT0gc2VsZi50b3RhbF91bml0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjMxLTYzMwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID09IHNlbGYudG90YWxfdW5pdHMKICAgIC8vICksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9JTkNPTVBMRVRFCiAgICBhc3NlcnQgLy8gUHJpbWFyeSBkaXN0cmlidXRpb24gaXMgbm90IGNvbXBsZXRlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzQKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM1CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzYKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAzMwogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzcKICAgIC8vIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM4CiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzkKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0MAogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX0FDVElWRSkKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgMTAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDUxCiAgICAvLyBhc3NlcnQgZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSA9PSBVSW50NjQoZW51bXMuRVZUX0lFRCksIGVyci5OT1RfRVZUX0lFRAogICAgZnJhbWVfZGlnIDExCiAgICBhc3NlcnQgLy8gTm90IElFRCBldmVudAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDUyCiAgICAvLyByZXR1cm4gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0MS02NDUKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1zZWxmLl9lbnRyeV9pZWRfYW1vdW50KGVudHJ5KSwKICAgIC8vICAgICBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0NAogICAgLy8gc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0MS02NDUKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1zZWxmLl9lbnRyeV9pZWRfYW1vdW50KGVudHJ5KSwKICAgIC8vICAgICBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICAvLyApCiAgICBjYWxsc3ViIF9lbWl0X2V4ZWN1dGlvbl9ldmVudAogICAgZHVwCiAgICBmcmFtZV9idXJ5IC0yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NDYKICAgIC8vIHJldHVybgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0OQogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ICs9IHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBmcmFtZV9idXJ5IC0yCiAgICArCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1MQogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1JSKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCAxMgogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMTAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1NQogICAgLy8gcGF5bG9hZC5vYnNlcnZlZF9yYXRlLAogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjU2CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzNiAvLyAicmF0ZV9yZXNldF9tdWx0aXBsaWVyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1NwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1Mi02NTgKICAgIC8vICMgUlIgZGVyaXZlcyB0aGUgbmV4dCByYXRlIGZyb20gYW4gb2JzZXJ2ZWQgb3JhY2xlIHZhbHVlIHBsdXMgdGhlCiAgICAvLyAjIGNvbnRyYWN0IHNwcmVhZCAvIG11bHRpcGxpZXIgdGVybXMsIHRoZW4gZW5mb3JjZXMgZmxvb3IgYW5kIGNhcC4KICAgIC8vIG9ic2VydmVkX3JhdGUgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBwYXlsb2FkLm9ic2VydmVkX3JhdGUsCiAgICAvLyAgICAgc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICkKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjAKICAgIC8vIG9ic2VydmVkX3JhdGUgKyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzUgLy8gInJhdGVfcmVzZXRfc3ByZWFkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkIGV4aXN0cwogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDEKICAgIC8vIGlmIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgYW5kIHJhdGUgPCBzZWxmLnJhdGVfcmVzZXRfZmxvb3I6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzggLy8gImhhc19yYXRlX3Jlc2V0X2Zsb29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmhhc19yYXRlX3Jlc2V0X2Zsb29yIGV4aXN0cwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMCAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X2Zsb29yIGV4aXN0cwogICAgZnJhbWVfZGlnIDYKICAgID4KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDIKICAgIC8vIHJhdGUgPSBzZWxmLnJhdGVfcmVzZXRfZmxvb3IKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMCAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDYKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfZmxvb3IgZXhpc3RzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1NToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc0MwogICAgLy8gaWYgc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgYW5kIHJhdGUgPiBzZWxmLnJhdGVfcmVzZXRfY2FwOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDM5IC8vICJoYXNfcmF0ZV9yZXNldF9jYXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwIGV4aXN0cwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTgKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMSAvLyAicmF0ZV9yZXNldF9jYXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9jYXAgZXhpc3RzCiAgICBmcmFtZV9kaWcgNgogICAgPAogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc0NAogICAgLy8gcmF0ZSA9IHNlbGYucmF0ZV9yZXNldF9jYXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMSAvLyAicmF0ZV9yZXNldF9jYXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSA2CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X2NhcCBleGlzdHMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjU5CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IHNlbGYuX2NsYW1wX3JhdGUoCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NTktNjYxCiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IHNlbGYuX2NsYW1wX3JhdGUoCiAgICAvLyAgICAgb2JzZXJ2ZWRfcmF0ZSArIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQKICAgIC8vICkKICAgIGZyYW1lX2RpZyA2CiAgICBhcHBfZ2xvYmFsX3B1dAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMTg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzEKICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QSSk6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMjAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY3MgogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzMKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDIzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc4CiAgICAvLyBpZiBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKToKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAyOQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc5CiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFJGKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCA1CiAgICA9PQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMzAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4MwogICAgLy8gKyAoc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCAtIHNlbGYuZXZlbnRfY3Vyc29yKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICAtCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODQKICAgIC8vICogVUludDY0KGNzdC5PUF9VUF9OT05fQ0FTSF9QRVJfRU5UUllfQlVER0VUKQogICAgcHVzaGludCAxMDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4My02ODQKICAgIC8vICsgKHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgLSBzZWxmLmV2ZW50X2N1cnNvcikKICAgIC8vICogVUludDY0KGNzdC5PUF9VUF9OT05fQ0FTSF9QRVJfRU5UUllfQlVER0VUKQogICAgKgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjgyCiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX05PTl9DQVNIX0JBU0VfQlVER0VUKQogICAgaW50YyA0IC8vIDE1MDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4Mi02ODQKICAgIC8vIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfQkFTRV9CVURHRVQpCiAgICAvLyArIChzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IC0gc2VsZi5ldmVudF9jdXJzb3IpCiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfUEVSX0VOVFJZX0JVREdFVCkKICAgICsKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4MC02ODYKICAgIC8vIGVuc3VyZV9idWRnZXQoCiAgICAvLyAgICAgcmVxdWlyZWRfYnVkZ2V0PSgKICAgIC8vICAgICAgICAgVUludDY0KGNzdC5PUF9VUF9OT05fQ0FTSF9CQVNFX0JVREdFVCkKICAgIC8vICAgICAgICAgKyAoc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCAtIHNlbGYuZXZlbnRfY3Vyc29yKQogICAgLy8gICAgICAgICAqIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfUEVSX0VOVFJZX0JVREdFVCkKICAgIC8vICAgICApLAogICAgLy8gKQogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDkwCiAgICAvLyBkaXNjb3VudF9mYWN0b3IgPSBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5MQogICAgLy8gZGVub21pbmF0b3IgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5MgogICAgLy8gc2tpcF9maXJzdF9yZWRlbXB0aW9uID0gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5NAogICAgLy8gaWYgZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAyNQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgZnJhbWVfYnVyeSA4CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAzNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDk1LTQ5OQogICAgLy8gIyBBbiBpbml0aWFsIFBSRiBtYXkgZGVzY3JpYmUgdGhlIGZpcnN0IHJlZGVtcHRpb24gcGVyaW9kIGRpcmVjdGx5LgogICAgLy8gZGlzY291bnRfZmFjdG9yID0gc2VsZi5fZGlzY291bnRfYW5udWl0eV9mYWN0b3IoCiAgICAvLyAgICAgZGlzY291bnRfZmFjdG9yLAogICAgLy8gICAgIGVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDgKICAgIGNhbGxzdWIgX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTAxCiAgICAvLyBza2lwX2ZpcnN0X3JlZGVtcHRpb24gPSBUcnVlCiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfYnVyeSA3CiAgICBmcmFtZV9idXJ5IDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDM1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTAzCiAgICAvLyBmdXR1cmVfZXZlbnRfaWQgPSBzZWxmLmV2ZW50X2N1cnNvciArIFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfd2hpbGVfdG9wQDM2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA0CiAgICAvLyB3aGlsZSBmdXR1cmVfZXZlbnRfaWQgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgZnJhbWVfZGlnIDMKICAgID4KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl93aGlsZUA0OAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA1CiAgICAvLyBmdXR1cmVfZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoZnV0dXJlX2V2ZW50X2lkKQogICAgZnJhbWVfZGlnIDMKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwNgogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPSBmdXR1cmVfZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MDctNTA4CiAgICAvLyAjIE9ubHkgcmVkZW1wdGlvbi1iZWFyaW5nIGV2ZW50cyBjb250cmlidXRlIHRvIHRoZSBhbm51aXR5IGRlbm9taW5hdG9yLgogICAgLy8gaXNfcmVkZW1wdGlvbl9ldmVudCA9IGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpIG9yICgKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwNy01MTEKICAgIC8vICMgT25seSByZWRlbXB0aW9uLWJlYXJpbmcgZXZlbnRzIGNvbnRyaWJ1dGUgdG8gdGhlIGFubnVpdHkgZGVub21pbmF0b3IuCiAgICAvLyBpc19yZWRlbXB0aW9uX2V2ZW50ID0gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QUikgb3IgKAogICAgLy8gICAgIGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfTUQpCiAgICAvLyAgICAgYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICAvLyApCiAgICBibnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfdHJ1ZUA0MAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA5CiAgICAvLyBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgZnJhbWVfZGlnIDQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MDktNTEwCiAgICAvLyBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgLy8gYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF9mYWxzZUA0MQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTEwCiAgICAvLyBhbmQgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IgPiBVSW50NjQoMCkKICAgIGZyYW1lX2RpZyAwCiAgICBwdXNoaW50IDI1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA5LTUxMAogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCkKICAgIC8vIGFuZCBmdXR1cmVfZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX3RydWVANDA6CiAgICBpbnRjXzEgLy8gMQoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfbWVyZ2VANDI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTIKICAgIC8vIGlmIGlzX3JlZGVtcHRpb25fZXZlbnQ6CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA0NwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTEzCiAgICAvLyBpZiBza2lwX2ZpcnN0X3JlZGVtcHRpb246CiAgICBmcmFtZV9kaWcgNwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUA0NQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTE0CiAgICAvLyBza2lwX2ZpcnN0X3JlZGVtcHRpb24gPSBGYWxzZQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgNwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANDc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjEKICAgIC8vIGZ1dHVyZV9ldmVudF9pZCArPSBVSW50NjQoMSkKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV93aGlsZV90b3BAMzYKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlANDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTgKICAgIC8vIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZnJhbWVfZGlnIDAKICAgIHB1c2hpbnQgMjUKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTYtNTE5CiAgICAvLyBkaXNjb3VudF9mYWN0b3IgPSBzZWxmLl9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcigKICAgIC8vICAgICBkaXNjb3VudF9mYWN0b3IsCiAgICAvLyAgICAgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMgogICAgc3dhcAogICAgY2FsbHN1YiBfZGlzY291bnRfYW5udWl0eV9mYWN0b3IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjAKICAgIC8vIGRlbm9taW5hdG9yICs9IGRpc2NvdW50X2ZhY3RvcgogICAgZnJhbWVfZGlnIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA0NwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDE6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF9tZXJnZUA0MgoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX3doaWxlQDQ4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTIzCiAgICAvLyBhc3NlcnQgZGVub21pbmF0b3IgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZnJhbWVfZGlnIDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUyNAogICAgLy8gbnVtZXJhdG9yID0gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTI1CiAgICAvLyBpZiBlbnRyeS5mbGFncyAmIFVJbnQ2NChlbnVtcy5GTEFHX0lOSVRJQUxfUFJGKSA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNTcKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gOAogICAgJgogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDUwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjYtNTI3CiAgICAvLyAjIFN1YnNlcXVlbnQgUFJGIGV2ZW50cyBhbW9ydGl6ZSBib3RoIHByaW5jaXBhbCBhbmQgYWxyZWFkeSBhY2NydWVkIGNhcnJ5LgogICAgLy8gbnVtZXJhdG9yICs9IHNlbGYuYWNjcnVlZF9pbnRlcmVzdAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgICsKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDUwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTMwCiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTI4LTUzMgogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIG51bWVyYXRvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gICAgIGRlbm9taW5hdG9yLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDEKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODcKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IHNlbGYuX3JlY2FsY3VsYXRlX2FubnVpdHlfcGF5bWVudCgKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njg3LTY4OQogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gc2VsZi5fcmVjYWxjdWxhdGVfYW5udWl0eV9wYXltZW50KAogICAgLy8gICAgIGVudHJ5CiAgICAvLyApCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMzA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OTIKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY5My02OTcKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1VSW50NjQoMCksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OTUKICAgIC8vIHBheW9mZj1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njk2CiAgICAvLyBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY5My02OTcKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1VSW50NjQoMCksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgY2FsbHN1YiBfZW1pdF9leGVjdXRpb25fZXZlbnQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDI5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjkxCiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDMwCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDIwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc0CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9JUENCKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCAxOAogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDIzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzUtNjc2CiAgICAvLyAjIElQQ0Iga2VlcHMgcHJpbmNpcGFsIHVuY2hhbmdlZCBhbmQgb25seSByZXNldHMgdGhlIGludGVyZXN0IGJhc2UuCiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIGIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMjMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMTA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjIKICAgIC8vIGVsaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1JSRik6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgMTEKICAgID09CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDE0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjMKICAgIC8vIG5leHRfcmF0ZSA9IGVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY0CiAgICAvLyBpZiBuZXh0X3JhdGUgPT0gVUludDY0KDApOgogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDEzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjUKICAgIC8vIG5leHRfcmF0ZSA9IHNlbGYucmF0ZV9yZXNldF9uZXh0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzcgLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDUKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfbmV4dCBleGlzdHMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY2CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IG5leHRfcmF0ZQogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgZnJhbWVfZGlnIDUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDE0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY4CiAgICAvLyBpZiBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSAhPSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgOQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2OQogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPSBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZQogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgZnJhbWVfZGlnIDkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KGVudHJ5OiBieXRlcywgcGF5b2ZmOiB1aW50NjQsIHNldHRsZWRfYW1vdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpfZW1pdF9leGVjdXRpb25fZXZlbnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MDMtNzA5CiAgICAvLyBkZWYgX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgKiwKICAgIC8vICAgICBlbnRyeTogdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnksCiAgICAvLyAgICAgcGF5b2ZmOiBVSW50NjQsCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ6IFVJbnQ2NCwKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDMgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzEzCiAgICAvLyBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25JRAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE0CiAgICAvLyBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIGZyYW1lX2RpZyAtMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTUKICAgIC8vIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIGZyYW1lX2RpZyAtMwogICAgZXh0cmFjdCA4IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxNgogICAgLy8gc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICBmcmFtZV9kaWcgLTMKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTcKICAgIC8vIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MjAKICAgIC8vIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIGZyYW1lX2RpZyAtMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE1CiAgICAvLyBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICBpbnRjXzIgLy8gOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIwCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBnZXRieXRlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDkKICAgIC8vIGlmIHBheW9mZiA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJueiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NTAKICAgIC8vIHJldHVybiBVSW50NjQoZW51bXMuUEFZT0ZGX1NJR05fUE9TSVRJVkUpCiAgICBpbnRjXzEgLy8gMQoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX3BheW9mZl9zaWduQDc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTktNzIxCiAgICAvLyBwYXlvZmZfc2lnbj1hcmM0LlVJbnQ4KAogICAgLy8gICAgIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIC8vICksCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgaW50Y18yIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MjMKICAgIC8vIGN1cnJlbmN5X2lkPXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzI0CiAgICAvLyBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTItNzI1CiAgICAvLyBFeGVjdXRpb25FdmVudCgKICAgIC8vICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIC8vICAgICBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYXBwbGllZF9hdD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICBwYXlvZmY9cGF5b2ZmLAogICAgLy8gICAgIHBheW9mZl9zaWduPWFyYzQuVUludDgoCiAgICAvLyAgICAgICAgIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIC8vICAgICApLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PXNldHRsZWRfYW1vdW50LAogICAgLy8gICAgIGN1cnJlbmN5X2lkPXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAwCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzExLTcyNgogICAgLy8gYXJjNC5lbWl0KAogICAgLy8gICAgIEV4ZWN1dGlvbkV2ZW50KAogICAgLy8gICAgICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgICAgIHBheW9mZj1wYXlvZmYsCiAgICAvLyAgICAgICAgIHBheW9mZl9zaWduPWFyYzQuVUludDgoCiAgICAvLyAgICAgICAgICAgICBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICAvLyAgICAgICAgICksCiAgICAvLyAgICAgICAgIHNldHRsZWRfYW1vdW50PXNldHRsZWRfYW1vdW50LAogICAgLy8gICAgICAgICBjdXJyZW5jeV9pZD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgICAgIHNlcXVlbmNlPWVudHJ5LmV2ZW50X2lkICsgVUludDY0KDEpLAogICAgLy8gICAgICkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDlhMzMyYjk1IC8vIG1ldGhvZCAiRXhlY3V0aW9uRXZlbnQodWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc1MQogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiAoVUludDY0KGVudW1zLkVWVF9JRUQpLCBVSW50NjQoZW51bXMuRVZUX1BJKSk6CiAgICBmcmFtZV9kaWcgNQogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBibnogX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2lmX2JvZHlANQogICAgZnJhbWVfZGlnIDUKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGJ6IF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pZl9lbHNlQDYKCl9lbWl0X2V4ZWN1dGlvbl9ldmVudF9pZl9ib2R5QDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NTIKICAgIC8vIHJldHVybiBVSW50NjQoZW51bXMuUEFZT0ZGX1NJR05fUE9TSVRJVkUpCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIwCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBiIF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9wYXlvZmZfc2lnbkA3CgpfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzUzCiAgICAvLyByZXR1cm4gVUludDY0KGVudW1zLlBBWU9GRl9TSUdOX05FR0FUSVZFKQogICAgcHVzaGludCAyNTUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcyMAogICAgLy8gc2VsZi5fcGF5b2ZmX3NpZ24oZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSwgcGF5b2ZmKQogICAgYiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fcGF5b2ZmX3NpZ25ANwoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9yb2xlX2lzX2FjdGl2ZShyb2xlX21hcDogYnl0ZXMsIHJvbGVfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NDoKX3JvbGVfaXNfYWN0aXZlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU3CiAgICAvLyBkZWYgX3JvbGVfaXNfYWN0aXZlKHNlbGYsIHJvbGVfbWFwOiB0eXAuUmJhY1JvbGUsIHJvbGVfYWRkcmVzczogQWNjb3VudCkgLT4gYm9vbDoKICAgIHByb3RvIDIgMQogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5CiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5LTYwCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5LTYxCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjEKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAtNjEKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgPj0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX21lcmdlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKSAtPiB2b2lkOgpfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2NQogICAgLy8gYXNzZXJ0IHNlbGYuX2lzX2FycmFuZ2VyKFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTIKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgPT0gc2VsZi5hcnJhbmdlci52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE4IC8vIDB4NTIyMzQxNzI3MjYxNmU2NzY1NzIyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgPT0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2NQogICAgLy8gYXNzZXJ0IHNlbGYuX2lzX2FycmFuZ2VyKFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpIC0+IHZvaWQ6Cl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4MwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFzc2V0X2RlZmF1bHRlZCwgZXJyLkRFRkFVTFRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQxIC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfZGVmYXVsdGVkIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIERlZmF1bHRlZAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkgLT4gdm9pZDoKX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg2CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYXNzZXRfc3VzcGVuZGVkLCBlcnIuU1VTUEVOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzMgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9zdXNwZW5kZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gU3VzcGVuZGVkIG9wZXJhdGlvbnMKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkOiB1aW50NjQpIC0+IHZvaWQ6Cl9hc3NlcnRfdmFsaWRfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OAogICAgLy8gZGVmIF9hc3NlcnRfdmFsaWRfcm9sZShzZWxmLCByb2xlX2lkOiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTAKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIHB1c2hpbnQgMjAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkxCiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgcHVzaGludCAyNQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTIKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICBwdXNoaW50IDQwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MwogICAgLy8gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgcHVzaGludCA1MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTQKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgcHVzaGludCA2MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTUKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICBwdXNoaW50IDcwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NgogICAgLy8gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgcHVzaGludCA4MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfZmFsc2VAOAoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3OgogICAgaW50Y18xIC8vIDEKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX21lcmdlQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgcmV0c3ViCgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9mYWxzZUA4OgogICAgaW50Y18wIC8vIDAKICAgIGIgX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfbWVyZ2VAOQo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="}, "sourceInfo": {"approval": {"pcOffsetMethod": "none", "sourceInfo": [{"pc": [2702], "errorMessage": "ACTUS event not yet executed"}, {"pc": [2460], "errorMessage": "Can not distribute zero units"}, {"pc": [3203, 3210, 3583], "errorMessage": "D-ASA already configured"}, {"pc": [1309, 2041, 2420, 2566, 3800, 3946, 4297, 4528, 4674], "errorMessage": "D-ASA not configured"}, {"pc": [3594], "errorMessage": "D-ASA terms not configured"}, {"pc": [6863], "errorMessage": "Defaulted"}, {"pc": [3221], "errorMessage": "Denomination asset is not properly set"}, {"pc": [3236], "errorMessage": "Different settlement asset not supported, must be equal to denomination asset"}, {"pc": [3472, 3479, 3481], "errorMessage": "IED must be set in the future"}, {"pc": [1327, 2110, 2581, 4315, 6215], "errorMessage": "IED not yet executed"}, {"pc": [2473, 5598], "errorMessage": "Insufficient remaining D-ASA units"}, {"pc": [2676, 2742], "errorMessage": "Insufficient sender units to transfer"}, {"pc": [1937, 3123, 3141, 3197, 3674, 3710, 4362, 5782, 6060, 6120, 6523], "errorMessage": "Invalid ACTUS configuration"}, {"pc": [2050, 2454, 2637, 2652, 2809, 2882, 2945, 2987, 5410, 5535], "errorMessage": "Invalid account holding address"}, {"pc": [4865, 4889, 4913, 4937, 4961, 5018, 5046, 5068, 5090, 5112, 5291, 5309, 5324, 5339, 5354], "errorMessage": "Invalid account role address"}, {"pc": [3183], "errorMessage": "Invalid day-count convention ID"}, {"pc": [1440, 3821, 4149, 6092], "errorMessage": "Invalid event cursor"}, {"pc": [3659, 3722, 3998, 4339, 5698], "errorMessage": "Invalid event id"}, {"pc": [3834, 4213, 4220, 4352], "errorMessage": "Invalid event type"}, {"pc": [5002, 5281, 6933], "errorMessage": "Invalid role identifier"}, {"pc": [3588, 3734, 3742, 4051, 4426, 5713, 5729], "errorMessage": "Invalid schedule page"}, {"pc": [5646], "errorMessage": "No D-ASA units"}, {"pc": [1446, 1966, 2147, 6101], "errorMessage": "No due cashflow to pay"}, {"pc": [6184], "errorMessage": "Not IED event"}, {"pc": [2095, 2428, 2624, 2799, 2855, 2865, 2951, 4248, 5135, 6855], "errorMessage": "Not authorized"}, {"pc": [1567, 1575, 2196, 2270, 2279], "errorMessage": "Not enough funds for the payment"}, {"pc": [3971, 3984, 4324], "errorMessage": "Observed event required to execute this action"}, {"pc": [2442, 2490], "errorMessage": "Primary distribution is closed"}, {"pc": [6132], "errorMessage": "Primary distribution is not complete"}, {"pc": [2665], "errorMessage": "Sender and receiver must be different"}, {"pc": [5396, 6871], "errorMessage": "Suspended operations"}, {"pc": [2377, 3700, 4384], "errorMessage": "Time events must be sorted in strictly ascending order"}, {"pc": [2598, 2615], "errorMessage": "Transfer is closed"}, {"pc": [2669], "errorMessage": "Transfer units must be greater than zero"}, {"pc": [993], "errorMessage": "Wrong Global Bytes allocation"}, {"pc": [999], "errorMessage": "Wrong Global UInts allocation"}, {"pc": [1003], "errorMessage": "Wrong Local Bytes allocation"}, {"pc": [1007], "errorMessage": "Wrong Local UInts allocation"}, {"pc": [1548, 2189], "errorMessage": "account opted into asset"}, {"pc": [6815, 6830], "errorMessage": "check BoxMap entry exists"}, {"pc": [2086, 2124, 2165, 2203, 2494, 2672, 2731, 2757, 5390, 5556], "errorMessage": "check self.account entry exists"}, {"pc": [1629, 1861, 1949, 4585, 6220, 6543], "errorMessage": "check self.accrued_interest exists"}, {"pc": [5153, 6853], "errorMessage": "check self.arranger exists"}, {"pc": [6861], "errorMessage": "check self.asset_defaulted exists"}, {"pc": [6869], "errorMessage": "check self.asset_suspended exists"}, {"pc": [3131, 3577, 3967, 3979, 4320, 4533, 5944], "errorMessage": "check self.contract_type exists"}, {"pc": [1597, 4590, 5418, 5496], "errorMessage": "check self.cumulative_interest_index exists"}, {"pc": [1609, 4595, 5429, 5504], "errorMessage": "check self.cumulative_principal_index exists"}, {"pc": [5954], "errorMessage": "check self.dynamic_principal_redemption exists"}, {"pc": [1365, 1377, 1438, 1680, 2680, 2692, 3813, 4142, 4561, 4678, 4690, 4727, 5511, 6090, 6172, 6369, 6424, 6562], "errorMessage": "check self.event_cursor exists"}, {"pc": [5444, 5458, 5651, 5680, 6010, 6018, 6045, 6065, 6255, 6388, 6549], "errorMessage": "check self.fixed_point_scale exists"}, {"pc": [6298], "errorMessage": "check self.has_rate_reset_cap exists"}, {"pc": [6271], "errorMessage": "check self.has_rate_reset_floor exists"}, {"pc": [3208, 3593, 4557, 6189], "errorMessage": "check self.initial_exchange_amount exists"}, {"pc": [2478, 2488], "errorMessage": "check self.initial_exchange_date exists"}, {"pc": [1805, 4575, 5986, 6000], "errorMessage": "check self.interest_calculation_base exists"}, {"pc": [1877, 1892], "errorMessage": "check self.next_principal_redemption exists"}, {"pc": [4580, 5978, 6005, 6050], "errorMessage": "check self.nominal_interest_rate exists"}, {"pc": [2055, 2068], "errorMessage": "check self.op_daemon exists"}, {"pc": [1702, 1771, 1797, 1851, 1903, 1912, 1934, 4570, 6528, 6609], "errorMessage": "check self.outstanding_principal exists"}, {"pc": [6306, 6320], "errorMessage": "check self.rate_reset_cap exists"}, {"pc": [6279, 6293], "errorMessage": "check self.rate_reset_floor exists"}, {"pc": [6250], "errorMessage": "check self.rate_reset_multiplier exists"}, {"pc": [6643], "errorMessage": "check self.rate_reset_next exists"}, {"pc": [6263], "errorMessage": "check self.rate_reset_spread exists"}, {"pc": [1553, 2265, 4600], "errorMessage": "check self.reserved_interest exists"}, {"pc": [1558, 1587, 2275, 2290, 4605], "errorMessage": "check self.reserved_principal exists"}, {"pc": [2465, 2513, 4552, 5593, 6125], "errorMessage": "check self.reserved_units_total exists"}, {"pc": [1369, 2684, 3817, 3996, 4013, 4133, 4334, 4369, 4388, 4508, 4565, 4682, 5694, 6365, 6432], "errorMessage": "check self.schedule_entry_count exists"}, {"pc": [4041, 4416], "errorMessage": "check self.schedule_page entry exists"}, {"pc": [1545, 2155, 2183, 6715], "errorMessage": "check self.settlement_asset_id exists"}, {"pc": [1308, 1322, 2040, 2105, 2419, 2438, 2565, 2576, 2859, 3201, 3581, 3799, 3945, 4296, 4310, 4526, 4673, 5539, 6116, 6210], "errorMessage": "check self.status exists"}, {"pc": [2471, 2524, 4547, 5644, 5675, 6130], "errorMessage": "check self.total_units exists"}, {"pc": [2603, 2613], "errorMessage": "check self.transfer_closure_date exists"}, {"pc": [2586, 2594], "errorMessage": "check self.transfer_opening_date exists"}, {"pc": [3636, 3693], "errorMessage": "index access is out of bounds"}, {"pc": [2024, 3068, 3551, 4046, 4421], "errorMessage": "invalid array length header"}, {"pc": [2789, 3539, 5125], "errorMessage": "invalid number of bytes for arc4.bool"}, {"pc": [2032], "errorMessage": "invalid number of bytes for arc4.dynamic_array"}, {"pc": [3566], "errorMessage": "invalid number of bytes for arc4.dynamic_array"}, {"pc": [2018, 2403, 2543, 2551, 2781, 2839, 2847, 2927, 2935, 2978, 3003, 4746, 4770, 4804, 4985, 5167, 5251], "errorMessage": "invalid number of bytes for arc4.static_array"}, {"pc": [1303, 2361, 2370, 2411, 2560, 3529, 3930], "errorMessage": "invalid number of bytes for arc4.uint64"}, {"pc": [4794, 4975, 5241], "errorMessage": "invalid number of bytes for arc4.uint8"}, {"pc": [3040], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.InitialKernelState"}, {"pc": [3029], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.NormalizedActusTerms"}, {"pc": [4292], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.ObservedCashEventRequest"}, {"pc": [3941], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.ObservedEventRequest"}, {"pc": [3073], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.Prospectus"}, {"pc": [4815], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.RoleValidity"}, {"pc": [3057], "errorMessage": "invalid tail pointer at index 1 of (uint8[32],(len+utf8[]))"}, {"pc": [3052], "errorMessage": "invalid tuple encoding"}, {"pc": [4113, 4488], "errorMessage": "max array length exceeded"}, {"pc": [4539, 6707], "errorMessage": "overflow"}]}, "clear": {"pcOffsetMethod": "none", "sourceInfo": []}}, "templateVariables": {}}""" APP_SPEC = algokit_utils.Arc56Contract.from_json(_APP_SPEC_JSON) def _parse_abi_args(args: object | None = None) -> list[object] | None: From 73cfa196651a658915c3887edde6913ee77d006e Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 14:31:45 +0100 Subject: [PATCH 156/244] docs: update docs --- README.md | 17 +- book.toml | 6 + docs/CONTRIBUTIONS.md | 22 +- docs/COVER.md | 42 ++-- docs/{motivation.md => INTRO.md} | 4 +- docs/READING-GUIDELINES.md | 9 +- docs/SUMMARY.md | 111 +++----- docs/_include/styles.md | 4 - docs/events/events.md | 134 +++++----- docs/implementation/architecture.md | 238 ++++++------------ docs/implementation/ref-fixed-coupon-bond.md | 63 ----- docs/implementation/ref-perpetual-bond.md | 70 ------ docs/implementation/ref-zero-coupon-bond.md | 55 ---- .../reference-implementation.md | 84 ++----- ...rence-implementation-tests.md => tests.md} | 0 docs/interfaces/account/close.md | 43 ---- docs/interfaces/account/get-info.md | 29 --- docs/interfaces/account/gov-suspension.md | 41 --- docs/interfaces/account/open.md | 54 ---- docs/interfaces/account/overview.md | 70 ++++++ .../account/update-payment-address.md | 54 ---- docs/interfaces/contract/config.md | 168 ------------- .../get-account-units-current-value.md | 64 ----- .../contract/get-account-units-value.md | 48 ---- .../contract/get-amortizing-rates.md | 14 -- docs/interfaces/contract/get-asset-info.md | 14 -- .../interfaces/contract/get-asset-metadata.md | 14 -- docs/interfaces/contract/get-coupon-rates.md | 14 -- docs/interfaces/contract/get-coupon-status.md | 19 -- .../contract/get-early-repayment-schedule.md | 14 -- .../interfaces/contract/get-payment-amount.md | 53 ---- .../contract/get-secondary-market-schedule.md | 14 -- docs/interfaces/contract/get-time-events.md | 14 -- docs/interfaces/contract/get-time-periods.md | 14 -- docs/interfaces/contract/overview.md | 179 +++++++++++++ .../contract/primary-distribution.md | 75 ------ .../contract/set-amortizing-rates.md | 63 ----- .../interfaces/contract/set-default-status.md | 29 --- .../contract/set-early-repayment-option.md | 82 ------ docs/interfaces/contract/set-metadata.md | 76 ------ .../contract/set-secondary-time-events.md | 78 ------ .../contract/set-variable-interest-rate.md | 60 ----- .../contract/update-coupon-rates.md | 62 ----- .../contract/update-global-unit-value.md | 48 ---- .../contract/update-interest-rate.md | 48 ---- .../interfaces/contract/update-time-events.md | 76 ------ .../contract/update-time-periods.md | 56 ----- .../interfaces/contract/update-total-units.md | 48 ---- docs/interfaces/overview.md | 4 + .../payment-agent/early-repayment.md | 100 -------- docs/interfaces/payment-agent/overview.md | 54 ++++ docs/interfaces/payment-agent/pay-coupon.md | 92 ------- .../interfaces/payment-agent/pay-principal.md | 88 ------- docs/interfaces/rbac/assign-role.md | 59 ----- docs/interfaces/rbac/get-arranger.md | 15 -- docs/interfaces/rbac/get-role-config.md | 35 --- docs/interfaces/rbac/get-roles.md | 14 -- docs/interfaces/rbac/gov-asset-suspension.md | 29 --- docs/interfaces/rbac/overview.md | 138 ++++++++++ docs/interfaces/rbac/revoke-role.md | 54 ---- docs/interfaces/rbac/rotate-arranger.md | 28 --- .../transfer-agent/asset-transfer.md | 105 -------- docs/interfaces/transfer-agent/overview.md | 75 ++++++ docs/interfaces/types.md | 189 ++++++++++++++ docs/rationale.md | 17 -- docs/specs/accounting/account.md | 30 +++ docs/specs/accounting/overview.md | 4 + docs/specs/accounting/units.md | 86 +++---- .../contract/actus-compliance-profile.md | 82 ++++++ docs/specs/contract/attributes.md | 221 ++++++++++++++++ docs/specs/contract/day-count-convention.md | 105 ++++---- docs/specs/contract/denomination.md | 9 +- .../specs/contract/early-repayment-options.md | 99 -------- docs/specs/contract/interests.md | 86 ------- docs/specs/contract/intro.md | 35 ++- .../contract/kernel-state-and-schedule.md | 134 ++++++++++ docs/specs/contract/metadata.md | 12 +- .../normalization-and-configuration.md | 90 +++++++ docs/specs/contract/numeric-precision.md | 85 +++++++ docs/specs/contract/overview.md | 10 + docs/specs/contract/performance.md | 107 -------- docs/specs/contract/principal.md | 91 ------- docs/specs/contract/time-events.md | 138 ---------- docs/specs/contract/time-periods.md | 84 ------- docs/specs/contract/time-schedule.md | 33 --- docs/specs/contract/type.md | 22 -- docs/specs/contract/variable-interests.md | 122 --------- docs/specs/contract/variable-time-schedule.md | 47 ---- docs/specs/execution/overview.md | 4 + .../payment-agent/coupons-payment.md | 11 - .../payment-agent/early-repayment.md | 18 -- .../execution/payment-agent/payment-agent.md | 66 +++-- .../payment-agent/principal-repayment.md | 49 ---- .../execution/payment-agent/settlement.md | 18 +- docs/specs/execution/primary-market.md | 23 -- docs/specs/execution/secondary-market.md | 37 --- docs/specs/execution/time.md | 8 + docs/specs/execution/transfer-agent.md | 34 --- docs/specs/execution/transfer-agent/dvp.md | 27 ++ .../transfer-agent/primary-market.md | 52 ++++ .../transfer-agent/secondary-market.md | 30 +++ .../transfer-agent/transfer-agent.md | 34 +++ docs/specs/overview.md | 108 +++++--- docs/specs/rbac/overview.md | 7 + docs/specs/rbac/rbac.md | 66 +++-- docs/specs/rbac/roles.md | 127 +++++----- modules/accounting.py | 50 ++-- 107 files changed, 2165 insertions(+), 4026 deletions(-) rename docs/{motivation.md => INTRO.md} (92%) delete mode 100644 docs/_include/styles.md delete mode 100644 docs/implementation/ref-fixed-coupon-bond.md delete mode 100644 docs/implementation/ref-perpetual-bond.md delete mode 100644 docs/implementation/ref-zero-coupon-bond.md rename docs/implementation/{reference-implementation-tests.md => tests.md} (100%) delete mode 100644 docs/interfaces/account/close.md delete mode 100644 docs/interfaces/account/get-info.md delete mode 100644 docs/interfaces/account/gov-suspension.md delete mode 100644 docs/interfaces/account/open.md create mode 100644 docs/interfaces/account/overview.md delete mode 100644 docs/interfaces/account/update-payment-address.md delete mode 100644 docs/interfaces/contract/config.md delete mode 100644 docs/interfaces/contract/get-account-units-current-value.md delete mode 100644 docs/interfaces/contract/get-account-units-value.md delete mode 100644 docs/interfaces/contract/get-amortizing-rates.md delete mode 100644 docs/interfaces/contract/get-asset-info.md delete mode 100644 docs/interfaces/contract/get-asset-metadata.md delete mode 100644 docs/interfaces/contract/get-coupon-rates.md delete mode 100644 docs/interfaces/contract/get-coupon-status.md delete mode 100644 docs/interfaces/contract/get-early-repayment-schedule.md delete mode 100644 docs/interfaces/contract/get-payment-amount.md delete mode 100644 docs/interfaces/contract/get-secondary-market-schedule.md delete mode 100644 docs/interfaces/contract/get-time-events.md delete mode 100644 docs/interfaces/contract/get-time-periods.md create mode 100644 docs/interfaces/contract/overview.md delete mode 100644 docs/interfaces/contract/primary-distribution.md delete mode 100644 docs/interfaces/contract/set-amortizing-rates.md delete mode 100644 docs/interfaces/contract/set-default-status.md delete mode 100644 docs/interfaces/contract/set-early-repayment-option.md delete mode 100644 docs/interfaces/contract/set-metadata.md delete mode 100644 docs/interfaces/contract/set-secondary-time-events.md delete mode 100644 docs/interfaces/contract/set-variable-interest-rate.md delete mode 100644 docs/interfaces/contract/update-coupon-rates.md delete mode 100644 docs/interfaces/contract/update-global-unit-value.md delete mode 100644 docs/interfaces/contract/update-interest-rate.md delete mode 100644 docs/interfaces/contract/update-time-events.md delete mode 100644 docs/interfaces/contract/update-time-periods.md delete mode 100644 docs/interfaces/contract/update-total-units.md create mode 100644 docs/interfaces/overview.md delete mode 100644 docs/interfaces/payment-agent/early-repayment.md create mode 100644 docs/interfaces/payment-agent/overview.md delete mode 100644 docs/interfaces/payment-agent/pay-coupon.md delete mode 100644 docs/interfaces/payment-agent/pay-principal.md delete mode 100644 docs/interfaces/rbac/assign-role.md delete mode 100644 docs/interfaces/rbac/get-arranger.md delete mode 100644 docs/interfaces/rbac/get-role-config.md delete mode 100644 docs/interfaces/rbac/get-roles.md delete mode 100644 docs/interfaces/rbac/gov-asset-suspension.md create mode 100644 docs/interfaces/rbac/overview.md delete mode 100644 docs/interfaces/rbac/revoke-role.md delete mode 100644 docs/interfaces/rbac/rotate-arranger.md delete mode 100644 docs/interfaces/transfer-agent/asset-transfer.md create mode 100644 docs/interfaces/transfer-agent/overview.md create mode 100644 docs/interfaces/types.md delete mode 100644 docs/rationale.md create mode 100644 docs/specs/accounting/account.md create mode 100644 docs/specs/accounting/overview.md create mode 100644 docs/specs/contract/actus-compliance-profile.md create mode 100644 docs/specs/contract/attributes.md delete mode 100644 docs/specs/contract/early-repayment-options.md delete mode 100644 docs/specs/contract/interests.md create mode 100644 docs/specs/contract/kernel-state-and-schedule.md create mode 100644 docs/specs/contract/normalization-and-configuration.md create mode 100644 docs/specs/contract/numeric-precision.md create mode 100644 docs/specs/contract/overview.md delete mode 100644 docs/specs/contract/performance.md delete mode 100644 docs/specs/contract/principal.md delete mode 100644 docs/specs/contract/time-events.md delete mode 100644 docs/specs/contract/time-periods.md delete mode 100644 docs/specs/contract/time-schedule.md delete mode 100644 docs/specs/contract/type.md delete mode 100644 docs/specs/contract/variable-interests.md delete mode 100644 docs/specs/contract/variable-time-schedule.md create mode 100644 docs/specs/execution/overview.md delete mode 100644 docs/specs/execution/payment-agent/coupons-payment.md delete mode 100644 docs/specs/execution/payment-agent/early-repayment.md delete mode 100644 docs/specs/execution/payment-agent/principal-repayment.md delete mode 100644 docs/specs/execution/primary-market.md delete mode 100644 docs/specs/execution/secondary-market.md create mode 100644 docs/specs/execution/time.md delete mode 100644 docs/specs/execution/transfer-agent.md create mode 100644 docs/specs/execution/transfer-agent/dvp.md create mode 100644 docs/specs/execution/transfer-agent/primary-market.md create mode 100644 docs/specs/execution/transfer-agent/secondary-market.md create mode 100644 docs/specs/execution/transfer-agent/transfer-agent.md create mode 100644 docs/specs/rbac/overview.md diff --git a/README.md b/README.md index 147b049e..76bdbee7 100644 --- a/README.md +++ b/README.md @@ -4,20 +4,15 @@ Documentation: https://cusma.github.io/d-asa/ -## Deployments +The reference implementation follows the execution chain: -D-ASA examples deployed on TestNet: +```text +ACTUS contract -> AVM normalization -> AVM execution +``` -| Type | App ID | App Spec | -|-------------------|--------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------| -| Zero Coupon Bond | [756574705](https://lora.algokit.io/testnet/application/756574705) | [ARC-56](https://github.com/cusma/d-asa/blob/main/smart_contracts/artifacts/zero_coupon_bond/ZeroCouponBond.arc56.json) | -| Fixed Coupon Bond | [756574716](https://lora.algokit.io/testnet/application/756574716) | [ARC-56](https://github.com/cusma/d-asa/blob/main/smart_contracts/artifacts/fixed_coupon_bond/FixedCouponBond.arc56.json) | -| Perpetual Bond | [756574702](https://lora.algokit.io/testnet/application/756574702) | [ARC-56](https://github.com/cusma/d-asa/blob/main/smart_contracts/artifacts/perpetual_bond/PerpetualBond.arc56.json) | +The canonical ABI artifact is: -1. Download the App Spec JSON file; -1. Navigate to the [Lora App Lab](https://lora.algokit.io/testnet/app-lab); -1. Create the App Interface using the existing App ID and App Spec JSON; -1. Explore the D-ASA interface. +- `smart_contracts/artifacts/d_asa/DASA.arc56.json` ## Local Setup and Tests diff --git a/book.toml b/book.toml index 4757e8e5..ab4cd1d0 100644 --- a/book.toml +++ b/book.toml @@ -13,7 +13,13 @@ mathjax-support = true git-repository-url = "https://github.com/cusma/d-asa" edit-url-template = "https://github.com/cusma/d-asa/edit/main/{path}" site-url = "https://cusma.github.io/d-asa/" +additional-js = ["mermaid.min.js", "mermaid-init.js"] [output.html.fold] enable = true level = 3 + +[preprocessor] + +[preprocessor.mermaid] +command = "mdbook-mermaid" diff --git a/docs/CONTRIBUTIONS.md b/docs/CONTRIBUTIONS.md index 3c5b6ea4..e10cbe5d 100644 --- a/docs/CONTRIBUTIONS.md +++ b/docs/CONTRIBUTIONS.md @@ -33,7 +33,6 @@ The source code is structured as follows: .algokit/ -> AlgoKit configurations .github/ -> GitHub actions and CI/CD workflows docs/ -> mdBook source code -└── _include/ -> Templates, etc. └── images/ -> Image files └── images/ -> D-ASA implementation documents └── interfaces/ -> D-ASA interfaces @@ -92,7 +91,7 @@ The CI pipeline enforces Markdown linting, formatting, and style checking with Numbered lists **MUST** be defined with `1`-only style. -{{#include ./_include/styles.md:example}} +> [!TIP] > ```text > 1. First item > 1. Second item @@ -108,7 +107,7 @@ Numbered lists **MUST** be defined with `1`-only style. Table rows **MUST** use the same column widths. -{{#include ./_include/styles.md:example}} +> [!TIP] > ✅ Correct table format > ```text > | Month | Savings | @@ -138,7 +137,7 @@ Consider aligning text in the columns to the left, right, or center by adding a colon `:` to the left, right, or on both sides of the dashes `---` within the header row. -{{#include ./_include/styles.md:example}} +> [!TIP] > ```text > | Name | Quantity | Size | > |:-------|:--------:|-----:| @@ -159,18 +158,3 @@ row. Mathematical formulas are defined with [MathJax](https://www.mathjax.org/). > mdBook MathJax [documentation](https://rust-lang.github.io/mdBook/format/mathjax.html). - -#### Block Styles - -Block styles are defined in the `./docs/_include/styles.md` file using the mdBook -[include feature](https://rust-lang.github.io/mdBook/format/mdbook.html#including-files). - -Block styles (e.g., examples, implementation notes, etc.) are “styled quote” blocks -included in the book. - -{{#include ./_include/styles.md:example}} -> This example block has been included with the following syntax: -> ```text -> \{{#include ./_include/styles.md:example}} -> > This example block has been included with the following syntax: -> ``` diff --git a/docs/COVER.md b/docs/COVER.md index e78f25da..4a798301 100644 --- a/docs/COVER.md +++ b/docs/COVER.md @@ -7,30 +7,34 @@ The *Debt Algorand Standard Application* (D-ASA) is a standard for tokenizing *debt instruments* on the Algorand Virtual Machine. -It provides the interfaces for arranging the asset, configuring its role-based access +It provides a framework for arranging the asset, configuring its role-based access control, issuing and distributing it on the primary market, executing cash flows, exchanging it on the secondary market, and querying information about the debt instrument. -The specification provides recommendations to conform, to the best effort[^1], to -the *Algorithmic Contract Types Unified Standards* (ACTUS). +The specification complies with the *Algorithmic Contract Types Unified Standards* +(ACTUS) for the definition of the contracts. + +**D-ASA is, at its core, an ACTUS execution engine for the Algorand Virtual Machine.** The specification allows the tokenization of various debt instruments, such as bonds, -loans, commercial papers, mortgages, etc. A [reference implementation](./implementation/reference-implementation.md) -of some fixed income contract examples are provided. +loans, commercial papers, mortgages, etc. + +The [reference implementation](./implementation/reference-implementation.md) of +some fixed income contracts is provided. -This document is a *technical specification*, it is not intended to be as a legal -or a financial document. +This document is a *technical specification*, it is not intended to be a legal or +a financial document. ## Contents -Contents are organized in four hierarchical levels (see the navigation sidebar on -the left): +Contents are organized in three hierarchical levels (see the navigation sidebar +on the left): ```text Part └── 1. Chapter └── 1.1. Section - └── 1.1.1. Sub Section + └── 1.1.1. Sub-section ``` The navigation sidebar can be folded up to the *Chapter* level by clicking the folding @@ -40,20 +44,16 @@ icon (**>**), next to the level name. The D-ASA is free and open source. -The source code is released on the official -GitHub repository. +The source code is released on the official [GitHub repository](https://github.com/cusma/d-asa). External contributions are welcome, the project relies on the community to improve -and expand. Issues and features requests can be submitted on the GitHub -issues page. +and expand. -If you would like to contribute, please read the [guidelines](CONTRIBUTIONS.md#guidelines-guidelines) -and consider submitting a pull request. +Issues and feature requests can be submitted on the [GitHub issues page](https://github.com/cusma/d-asa/issues). -## License {#license} +If you would like to contribute, please read the [guidelines](./CONTRIBUTIONS.md#guidelines-guidelines) +and consider submitting a [pull request](https://github.com/cusma/d-asa/pulls). -The D-ASA source and documentation are released under the [AGPL-3.0 license](LICENSE.md). - ---- +## License {#license} -[^1]: ACTUS compliance is recommended but not mandatory. +The D-ASA source and documentation are released under the [AGPL-3.0 license](./LICENSE.md). diff --git a/docs/motivation.md b/docs/INTRO.md similarity index 92% rename from docs/motivation.md rename to docs/INTRO.md index e2fb453a..5ea72974 100644 --- a/docs/motivation.md +++ b/docs/INTRO.md @@ -11,7 +11,9 @@ benefits several players of the traditional value chain, such as issuers, arrang asset managers, risk managers, lenders, payment agents, transfer agents, etc. The *Debt Algorand Standard Application* turns a traditional debt instrument into -a deterministic financial contract, executed on the Algorand Virtual Machine (AVM). +a deterministic ACTUS financial contract, executed on the Algorand Virtual Machine +(AVM). + The machine-readable and executable contract removes existing frictions over the debt instruments lifecycle and reconciliation, enabling use cases such as truly atomic delivery-vs-payment (with instant finality and no counterparty risk), deterministic diff --git a/docs/READING-GUIDELINES.md b/docs/READING-GUIDELINES.md index be7c295e..920414a1 100644 --- a/docs/READING-GUIDELINES.md +++ b/docs/READING-GUIDELINES.md @@ -2,21 +2,20 @@ The keywords "**MUST**", "**MUST NOT**", "**REQUIRED**", "**SHALL**", "**SHALL NOT**", "**SHOULD**", "**SHOULD NOT**", "**RECOMMENDED**", "**MAY**", and "**OPTIONAL**" -in this document are to be interpreted as described in RFC -2119. +in this document are to be interpreted as described in [RFC 2119](https://datatracker.ietf.org/doc/html/rfc2119). The data types (like `uint64`, `byte[]`, etc.) in this document are to be interpreted as specified in ARC-4. -Acronyms in square brackets like \\([THIS]\\) are to be interpreted as defined in -the ACTUS dictionary. +Acronyms in square brackets like \\( [THIS] \\) are to be interpreted as defined +in the [ACTUS dictionary](https://github.com/actusfrf/actus-dictionary). > Notes like this are non-normative Non-normative sections mainly contextualize the specification for technical readers unfamiliar with the financial concepts described. -{{#include ./_include/styles.md:example}} +> [!TIP] > Sections like this are examples aiming to clarify the specifications. ```text diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md index a6255bba..02c3e2a1 100644 --- a/docs/SUMMARY.md +++ b/docs/SUMMARY.md @@ -6,40 +6,36 @@ # Introduction -- [Motivation](./motivation.md) +- [Motivation](./INTRO.md) - [Reading Guidelines](./READING-GUIDELINES.md) # Specification - [Overview](./specs/overview.md) -- [Trust Model]() +- [RBAC Model](./specs/rbac/overview.md) - [Roles](./specs/rbac/roles.md) - - [Role-Based Access Control (RBAC)](./specs/rbac/rbac.md) -- [Contract](specs/contract/intro.md) - - [Type](./specs/contract/type.md) + - [Role-Based Access Control](./specs/rbac/rbac.md) +- [Contract](./specs/contract/overview.md) + - [Introduction](./specs/contract/intro.md) + - [ACTUS Compliance Profile](./specs/contract/actus-compliance-profile.md) - [Denomination](./specs/contract/denomination.md) - - [Principal](./specs/contract/principal.md) - - [Interests](./specs/contract/interests.md) - - [Variable Interests](./specs/contract/variable-interests.md) - - [Time Schedule](./specs/contract/time-schedule.md) - - [Time Events](./specs/contract/time-events.md) - - [Time Periods](./specs/contract/time-periods.md) - - [Variable Time Schedule](./specs/contract/variable-time-schedule.md) - [Day-Count Convention](./specs/contract/day-count-convention.md) - - [Early Repayment Options](./specs/contract/early-repayment-options.md) - - [Performance](./specs/contract/performance.md) + - [Main Attributes](./specs/contract/attributes.md) + - [Kernel State and Schedule](./specs/contract/kernel-state-and-schedule.md) + - [Normalization and Configuration](./specs/contract/normalization-and-configuration.md) + - [Numeric Precision and Conversions](./specs/contract/numeric-precision.md) - [Metadata](./specs/contract/metadata.md) -- [Accounting]() - - [D-ASA Units](./specs/accounting/units.md) -- [Execution]() - - [Primary Market](./specs/execution/primary-market.md) +- [Accounting](./specs/accounting/overview.md) + - [Account](./specs/accounting/account.md) + - [Units and Positions](./specs/accounting/units.md) +- [Execution](./specs/execution/overview.md) + - [Time](./specs/execution/time.md) - [Payment Agent](./specs/execution/payment-agent/payment-agent.md) - [Settlement](./specs/execution/payment-agent/settlement.md) - - [Principal Repayment](./specs/execution/payment-agent/principal-repayment.md) - - [Early Repayment](./specs/execution/payment-agent/early-repayment.md) - - [Coupons Payment](./specs/execution/payment-agent/coupons-payment.md) - - [Transfer Agent](./specs/execution/transfer-agent.md) - - [Secondary Market](./specs/execution/secondary-market.md) + - [Transfer Agent](./specs/execution/transfer-agent/transfer-agent.md) + - [Primary Distribution](./specs/execution/transfer-agent/primary-market.md) + - [Secondary Market](./specs/execution/transfer-agent/secondary-market.md) + - [Delivery-vs-Payment](./specs/execution/transfer-agent/dvp.md) # Events @@ -47,73 +43,22 @@ # Interfaces -- [RBAC]() - - [Rotate Arranger](./interfaces/rbac/rotate-arranger.md) - - [Assign Role](./interfaces/rbac/assign-role.md) - - [Revoke Role](./interfaces/rbac/revoke-role.md) - - [Governance Asset Suspension](interfaces/rbac/gov-asset-suspension.md) - - [Get Arranger](./interfaces/rbac/get-arranger.md) - - [Get Roles](./interfaces/rbac/get-roles.md) - - [Get Role Config](./interfaces/rbac/get-role-config.md) - -- [Account]() - - [Open](interfaces/account/open.md) - - [Close](interfaces/account/close.md) - - [Update Payment Address](./interfaces/account/update-payment-address.md) - - [Governance Suspension](interfaces/account/gov-suspension.md) - - [Get Info](interfaces/account/get-info.md) - -- [Contract]() - - [Asset Config](./interfaces/contract/config.md) - - [Set Metadata](./interfaces/contract/set-metadata.md) - - [Set Amortizing Rates](./interfaces/contract/set-amortizing-rates.md) - - [Set Secondary Time Events](./interfaces/contract/set-secondary-time-events.md) - - [Set Early Repayment Option](./interfaces/contract/set-early-repayment-option.md) - - [Set Variable Interest Rate](./interfaces/contract/set-variable-interest-rate.md) - - [Set Default Status](./interfaces/contract/set-default-status.md) - - [Primary Distribution](./interfaces/contract/primary-distribution.md) - - [Update Total Units](./interfaces/contract/update-total-units.md) - - [Update Global Unit Value](./interfaces/contract/update-global-unit-value.md) - - [Update Interest Rate](./interfaces/contract/update-interest-rate.md) - - [Update Coupon Rates](./interfaces/contract/update-coupon-rates.md) - - [Update Time Events](./interfaces/contract/update-time-events.md) - - [Update Time Periods](./interfaces/contract/update-time-periods.md) - - [Get Asset Info](./interfaces/contract/get-asset-info.md) - - [Get Asset Metadata](./interfaces/contract/get-asset-metadata.md) - - [Get Account Units Value](./interfaces/contract/get-account-units-value.md) - - [Get Account Units Current Value](./interfaces/contract/get-account-units-current-value.md) - - [Get Time Events](./interfaces/contract/get-time-events.md) - - [Get Time Periods](./interfaces/contract/get-time-periods.md) - - [Get Payment Amount](./interfaces/contract/get-payment-amount.md) - - [Get Coupon Rates](./interfaces/contract/get-coupon-rates.md) - - [Get Coupon Status](./interfaces/contract/get-coupon-status.md) - - [Get Amortizing Rates](./interfaces/contract/get-amortizing-rates.md) - - [Get Secondary Market Schedule](./interfaces/contract/get-secondary-market-schedule.md) - - [Get Early Repayment Schedule](./interfaces/contract/get-early-repayment-schedule.md) - -- [Payment Agent]() - - [Pay Coupon](./interfaces/payment-agent/pay-coupon.md) - - [Pay Principal](./interfaces/payment-agent/pay-principal.md) - - [Early Repayment](interfaces/payment-agent/early-repayment.md) - -- [Transfer Agent]() - - [Asset Transfer](./interfaces/transfer-agent/asset-transfer.md) - -# Rationale - -- [Rationale](./rationale.md) +- [Interfaces](./interfaces/overview.md) + - [ABI Types](./interfaces/types.md) + - [RBAC Interface](./interfaces/rbac/overview.md) + - [Accounting Interface](./interfaces/account/overview.md) + - [ACTUS Kernel Interface](./interfaces/contract/overview.md) + - [Payment Agent Interface](./interfaces/payment-agent/overview.md) + - [Transfer Agent Interface](./interfaces/transfer-agent/overview.md) # Reference Implementation - [Reference Implementation](./implementation/reference-implementation.md) - [Architecture](./implementation/architecture.md) - - [Zero Coupon Bond](./implementation/ref-zero-coupon-bond.md) - - [Fixed Coupon Bond](./implementation/ref-fixed-coupon-bond.md) - - [Perpetual Bond](./implementation/ref-perpetual-bond.md) -- [Tests](./implementation/reference-implementation-tests.md) +- [Tests](./implementation/tests.md) - [DeepWiki (Experimental)](./implementation/deepwiki.md) --- [Contribution Guidelines](./CONTRIBUTIONS.md) -[License](LICENSE.md) +[License](./LICENSE.md) diff --git a/docs/_include/styles.md b/docs/_include/styles.md deleted file mode 100644 index 3ee93eb3..00000000 --- a/docs/_include/styles.md +++ /dev/null @@ -1,4 +0,0 @@ -// ANCHOR: example -> [!TIP] -> -// ANCHOR_END: example diff --git a/docs/events/events.md b/docs/events/events.md index e02b0a27..2d3b40af 100644 --- a/docs/events/events.md +++ b/docs/events/events.md @@ -1,69 +1,89 @@ # Events -The D-ASA implements ACTUS events as [ARC-28 events](https://dev.algorand.co/arc-standards/arc-0028/). +The D-ASA uses two distinct event concepts: -The following is the ACTUS event schema: +1. *ACTUS schedule events*: contractual events stored in the normalized execution +schedule. + +1. *ARC-28 execution events*: proofs that a scheduled event was actually applied +on chain. + +Those concepts are related, but they are not interchangeable. + +## ACTUS schedule events + +ACTUS schedule events live inside `ExecutionScheduleEntry` records in the boxed +schedule. They describe what the contract is expected to execute next. + +An ACTUS schedule event contains: + +- `event_id` +- `event_type` +- `scheduled_time` +- accrual factors +- next-state values +- flags + +Schedule events exist before execution and remain part of contract state even if +no ARC-28 proof has been emitted yet. + +See [Kernel State and Schedule](../specs/contract/kernel-state-and-schedule.md) +for the normative schedule definition. + +## ARC-28 execution events + +When the kernel applies a schedule entry, it emits an ARC-28 `ExecutionEvent` as +an execution proof. + +This proof is non-normative receipt data. It does not replace the kernel state, +and it does not define future schedule entries. Its purpose is to attest that a +given event was applied at a specific block time with a specific payoff and settlement +outcome. + +The current execution-proof schema is: ```json { - "name": "Event", - "desc": "ACTUS Event", + "name": "ExecutionEvent", + "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event", "args": [ - { - "type": "uint64", - "name": "contract_id", - "desc": "The Contract ID emitting the event" - }, - { - "type": "uint8", - "name": "type", - "desc": "The ACTUS Event type" - }, - { - "type": "string", - "name": "type_name", - "desc": "The ACTUS Event acronym" - }, - { - "type": "uint64", - "name": "time", - "desc": "The timestamp of the event (UNIX time)" - }, - { - "type": "uint64", - "name": "payoff", - "desc": "The payoff associated with the event (if any)" - }, - { - "type": "uint64", - "name": "currency_id", - "desc": "The currency ID (Asset ID on chain or ISO 4217 numeric code)" - }, - { - "type": "byte[]", - "name": "currency_unit", - "desc": "The unit name of the currency ID" - }, - { - "type": "uint64", - "name": "nominal_value", - "desc": "The nominal value at the time of the event" - }, - { - "type": "uint16", - "name": "nominal_rate_bps" - }, - { - "type": "uint64", - "name": "nominal_accrued" - } + { "name": "contract_id", "type": "uint64", "desc": "Application ID emitting the proof" }, + { "name": "event_id", "type": "uint64", "desc": "Executed schedule event identifier" }, + { "name": "event_type", "type": "uint8", "desc": "Executed ACTUS event type" }, + { "name": "scheduled_time", "type": "uint64", "desc": "Contractual due timestamp from the schedule" }, + { "name": "applied_at", "type": "uint64", "desc": "Block timestamp at which execution occurred" }, + { "name": "payoff", "type": "uint64", "desc": "Contractual payoff computed for the event" }, + { "name": "payoff_sign", "type": "uint8", "desc": "Payoff sign identifier" }, + { "name": "settled_amount", "type": "uint64", "desc": "Amount actually reserved or transferred on chain" }, + { "name": "currency_id", "type": "uint64", "desc": "Settlement asset identifier" }, + { "name": "sequence", "type": "uint64", "desc": "Monotonic proof sequence, currently event_id + 1" } ] } ``` -The D-ASA supports the following ACTUS event types: +## Proof semantics + +The following field distinctions are normative for interpreting the receipt: + +- `scheduled_time` is the contractual timestamp from the normalized ACTUS schedule. +- `applied_at` is the actual block timestamp at which the kernel applied the event. +- `payoff` is the contractual amount implied by the event. +- `settled_amount` is the amount actually reserved or transferred on chain. +- non-cash executions emit a proof with `settled_amount = 0`. + +## Supported ACTUS event identifiers + +The current kernel can emit proofs for the following ACTUS event types, subject +to contract-family compatibility: -| Type | Acronym | Description | -|------|------------|----------------------| -| `3` | \\( PR \\) | Principal Redemption | -| `8` | \\( IP \\) | Interest Payment | +| Type | Acronym | Description | +|:-----|:--------|:--------------------------------| +| `1` | `IED` | Initial Exchange Date | +| `3` | `PR` | Principal Redemption | +| `4` | `PI` | Principal Increase | +| `5` | `PRF` | Principal Redemption Fixing | +| `8` | `IP` | Interest Payment | +| `11` | `RRF` | Rate Reset Fixing | +| `12` | `RR` | Rate Reset | +| `18` | `IPCB` | Interest Calculation Base Reset | +| `19` | `MD` | Maturity | diff --git a/docs/implementation/architecture.md b/docs/implementation/architecture.md index 982d1fc1..f97dffa9 100644 --- a/docs/implementation/architecture.md +++ b/docs/implementation/architecture.md @@ -1,198 +1,100 @@ # Architecture -The D-ASA architecture is designed to support a wide range of financial products -and instrument types, fostering modularization and code reuse. +The current D-ASA architecture is layered, not product-specific. The on-chain contract +is a single `DASA` application assembled from five modules: -The financial contract specialization is executed compile-time composition. Each -concrete financial contract is built from _mixins_ that implement only the required -behavior. - -As a result, unused flows (e.g., coupon payment for zero coupon bonds, principal -repayment for perpetual bonds) are not part of the deployed program. - -## Architectural Axes - -The architecture is organized along four orthogonal axes: +```mermaid +flowchart LR + RBAC["RBAC"] --> KERNEL["ACTUS Kernel"] + KERNEL --> ACCOUNTING["Accounting"] + ACCOUNTING --> PAYMENT["Payment Agent"] + ACCOUNTING --> TRANSFER["Transfer Agent"] +``` -- Axis A: `RbacModule` and `AccountingModule` -- Axis B: Maturity-based core (`PAM`) vs Non-maturity-based core (`PBN`) -- Axis C: Coupon vs No-coupon cashflow -- Axis D: `CoreFinancial` (compute), `PaymentAgent` (execute payments), - `TransferAgent` (transfer ownership) +## Processing chain -## High-level architecture +The canonical processing chain is: ```mermaid -flowchart TD - RBAC["RbacModule"] --> ACC["AccountingModule"] - ACC --> CFC["CoreFinancialCommonMixin"] - CFC --> PAM["PAMCoreMixin (Maturity)"] - CFC --> PBN["PBNCoreMixin (Non-Maturity)"] - - PAM --> NC["NoCouponCashflowMixin"] - PAM --> FC["FixedCouponCashflowMixin"] - PBN --> PC["PerpetualCouponCashflowMixin"] - - CFC --> PAC["PaymentAgentCommonMixin"] - CFC --> TAC["TransferAgentCommonMixin"] - - PAC --> CPP["CouponPaymentAgentMixin"] - PAC --> PRP["PrincipalPaymentAgentMixin"] - PAC --> NPP["NoPrincipalPaymentMixin"] - - TAC --> CTA["CouponTransferAgentMixin"] - TAC --> NTA["NoCouponTransferAgentMixin"] - - NC --> ZCB["ZeroCouponBond"] - FC --> FCB["FixedCouponBond"] - PC --> PB["PerpetualBond"] - PRP --> ZCB - NTA --> ZCB - CPP --> FCB - PRP --> FCB - CTA --> FCB - CPP --> PB - NPP --> PB - CTA --> PB +flowchart LR + ACTUS["ACTUS Contract"] --> NORMALIZE["AVM Normalization"] + NORMALIZE --> ABI["ABI Upload"] + ABI --> EXEC["AVM Execution"] ``` -## Module responsibilities - -- `CoreFinancialCommonMixin`: shared asset configuration, schedule validation, and - state/getter primitives. - Must not do: payment settlement execution. - -- `PAMCoreMixin`: maturity-driven lifecycle and principal redemption authorization. - Must not do: perpetual-only logic. +This separation is intentional: -- `PBNCoreMixin`: non-maturity lifecycle and perpetual-oriented schedule base. - Must not do: maturity principal flow. +- ACTUS contract definition and schedule generation happen off chain. +- Normalization converts that contract into fixed-size AVM-compatible structs. +- The AVM kernel validates and executes the normalized lifecycle. -- `CouponCashflowMixin`: coupon due counting, coupon ordering constraints, and coupon-related - cashflow preconditions. - Must not do: settlement transfer execution. +## Module responsibilities -- `NoCouponCashflowMixin`: discount/accrual logic for no-coupon instruments. - Must not do: coupon sequencing logic. +- `RbacModule`: role assignment, suspension, and application-control methods. -- `PaymentAgentCommonMixin`: payment executability checks, liquidity checks, and - settlement transaction execution. - Must not do: interest/day-count formulas. +- `ActusKernelModule`: normalized-term validation, schedule storage, event cursor, +state transitions, and generic ACTUS getters. -- `CouponPaymentAgentMixin`: executes `pay_coupon` using core-computed amount and - core state transition hooks. - Must not do: coupon formula computation. +- `AccountingModule`: holder positions, unit activation, checkpoints, and claim +ledgers. -- `PrincipalPaymentAgentMixin`: executes `pay_principal` using core-computed amount - and core state transition hooks. - Must not do: maturity or coupon-ordering math. +- `PaymentAgent`: funding of due cash events and holder withdrawals. -- `NoPrincipalPaymentMixin`: explicit no-principal specialization (no `pay_principal`). - Must not do: expose principal payment flow. +- `TransferAgent`: primary distribution, transfer schedule, and settled unit transfers. -- `TransferAgentCommonMixin`: shared transfer-agent composition point. - Must not do: cashflow formulas. +## Public API by layer -- `CouponTransferAgentMixin`: ownership transfer with coupon-payment ordering guards - delegated to core hooks. - Must not do: coupon rate/day-count calculations. +| Layer | Public methods | +|:---------------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| RBAC | `contract_update`, `rbac_rotate_arranger`, `rbac_set_op_daemon`, `rbac_assign_role`, `rbac_revoke_role`, `rbac_contract_suspension`, `rbac_get_arranger`, `rbac_get_address_roles`, `rbac_get_role_validity` | +| Accounting | `account_suspension`, `account_open`, `account_update_payment_address`, `account_get_position` | +| ACTUS Kernel | `contract_create`, `contract_config`, `contract_schedule`, `contract_execute_ied`, `apply_non_cash_event`, `append_observed_cash_event`, `contract_get_state`, `contract_get_next_due_event` | +| Payment Agent | `fund_due_cashflows`, `claim_due_cashflows` | +| Transfer Agent | `transfer_set_schedule`, `primary_distribution`, `transfer` | -- `NoCouponTransferAgentMixin`: ownership transfer for no-coupon instruments with - accrual delegated to core hooks. - Must not do: coupon sequencing checks. +## Execution flows -## Composition Matrix +### Configuration ```mermaid -flowchart TD - PAM["PAM (Maturity Core)"] --> Z["ZeroCouponBond"] - PAM --> F["FixedCouponBond"] - PBN["PBN (Non-Maturity Core)"] --> P["PerpetualBond"] - - NOC["No-Coupon Cashflow"] --> Z - CUP["Coupon Cashflow"] --> F - CUP --> P - - PRIN["Principal Payment Agent"] --> Z - PRIN --> F - NOPR["No Principal Payment Agent"] --> P - - TRN["No-Coupon Transfer Agent"] --> Z - TRC["Coupon Transfer Agent"] --> F - TRC --> P +sequenceDiagram + participant SDK as "Normalization SDK" + participant ABI as "ABI Caller" + participant K as "ACTUS Kernel" + + SDK->>ABI: "NormalizedActusTerms + InitialKernelState + Schedule Pages" + ABI->>K: "contract_config(...)" + ABI->>K: "contract_schedule(page 0)" + ABI->>K: "contract_schedule(page n, is_last_page=true)" + ABI->>K: "primary_distribution(...)" + ABI->>K: "contract_execute_ied()" ``` -Current supported combinations: - -- `PAM + no-coupon` -> `ZeroCouponBond` -- `PAM + coupon` -> `FixedCouponBond` -- `PBN + coupon` -> `PerpetualBond` - -## Execution flow by agent +### Cash events ```mermaid sequenceDiagram - participant API as "External Caller / ABI" - participant PA as "PaymentAgent" - participant TA as "TransferAgent" - participant CF as "CoreFinancial" - participant SET as "Settlement (ASA Transfer)" - participant ACC as "Accounting State" - - API->>PA: "pay_coupon(holding_address, payment_info)" - PA->>CF: "core_prepare_coupon_payment(...)" - CF-->>PA: "computed amount + preconditions satisfied" - PA->>SET: "execute settlement transfer" - PA->>CF: "core_apply_coupon_payment(...)" - CF->>ACC: "update paid coupons / coupon units" - - API->>TA: "asset_transfer(sender, receiver, units)" - TA->>CF: "core_prepare_transfer_* (...)" - CF-->>TA: "accrued amount + transfer guards" - TA->>ACC: "transfer ownership units" - - Note over PA,TA: "Agents orchestrate execution, formulas in CoreFinancial" + participant ABI as "ABI Caller" + participant PA as "Payment Agent" + participant ACC as "Accounting" + + ABI->>PA: "fund_due_cashflows(max_event_count)" + PA->>ACC: "advance global indices and reserve funds" + ABI->>PA: "claim_due_cashflows(holding_address, payment_info)" + PA->>ACC: "settle holder checkpoints" + PA-->>ABI: "CashClaimResult" ``` -## Contract API surface +### Transfers -| Method / Surface | Zero | Fixed | Perpetual | -|--------------------------------------------------------------------------------|------|-------|-----------| -| `asset_config` | Yes | Yes | Yes | -| `asset_transfer` | Yes | Yes | Yes | -| `pay_coupon` | No | Yes | Yes | -| `pay_principal` | Yes | Yes | No | -| `update_interest_rate` | No | No | Yes | -| Core getters (`get_asset_info`, `get_time_events`, `get_asset_metadata`, etc.) | Yes | Yes | Yes | -| Coupon getters (`get_coupon_rates`, `get_coupons_status`) | No | Yes | Yes | -| `get_time_periods` | No | No | Yes | - -## Composition Safety - -Contract composition is validated at build time before contract compilation. - -- Agent mixins (`CouponTransferAgentMixin`, `NoCouponTransferAgentMixin`, - `CouponPaymentAgentMixin`, `PrincipalPaymentAgentMixin`) must resolve their core - hook methods to safe implementations. -- If a hook resolves to an unsafe default in agent-common mixins, build validation - fails before compilation. -- Core financial hook defaults also fail-closed with `INVALID_MIXIN_COMPOSITION` - and must be resolved by the expected cashflow/core mixins in the effective MRO. -- Unsafe default hooks are fail-closed and abort with `INVALID_MIXIN_COMPOSITION` - if reached. -- Build and deploy flows verify generated `.teal` and `.arc56.json` artifacts do - not contain `INVALID_MIXIN_COMPOSITION` markers. - -This prevents missing mixins or incorrect MRO ordering from silently producing -fail-open settlement behavior. - -## On-chain optimization outcome - -Contracts are assembled from only the mixins required for each product. This removes -unreachable logic from deployment artifacts and keeps method selectors, state usage, -and control flow minimal for each contract. - -Examples: - -- `ZeroCouponBond` excludes `pay_coupon`. -- `PerpetualBond` excludes `pay_principal`. +```mermaid +sequenceDiagram + participant ABI as "Holder" + participant TA as "Transfer Agent" + participant ACC as "Accounting" + + ABI->>TA: "transfer(sender, receiver, units)" + TA->>ACC: "settle sender" + TA->>ACC: "settle receiver" + TA->>ACC: "move active units" +``` diff --git a/docs/implementation/ref-fixed-coupon-bond.md b/docs/implementation/ref-fixed-coupon-bond.md deleted file mode 100644 index 027f3433..00000000 --- a/docs/implementation/ref-fixed-coupon-bond.md +++ /dev/null @@ -1,63 +0,0 @@ -# Fixed Coupon Bond - -## Contract Data Model - -| Property | ACTUS | Option | -|-------------------------|---------------|--------------------------| -| Type | \\([CT]\\) | \\([PAM]\\) | -| ID | \\([CID]\\) | D-ASA App ID | -| Denomination | \\([CUR]\\) | ASA | -| Settlement | \\([CURS]\\) | ASA | -| Interest | \\([IPNR]\\) | Fixed | -| Principal Discount | \\([PDIED]\\) | - | -| Time Schedule | \\([EVT]\\) | Events (Fixed) | -| Early Repayment Options | \\([PPEF]\\) | \\([N]\\) | -| Early Repayment Penalty | \\([PYTP]\\) | - | -| Day-Count Convention | \\([IPCD]\\) | \\([AA]\\) or Continuous | -| Calendar | \\([CLDR]\\) | \\([NC]\\) | -| Business Day Convention | \\([BDC]\\) | - | -| End of Month Convention | \\([EOMC]\\) | - | -| Performance | \\([PRF]\\) | Manual Default (Trustee) | -| Grace Period | \\([GRP]\\) | No | -| Delinquency Period | \\([DQP]\\) | No | - -## Contract Events - -| Event | ACTUS | Option | -|----------------------|-------------|-------------| -| Coupon Payments | \\([IP]\\) | Yes (Fixed) | -| Known Rate Updates | \\([RR]\\) | - | -| Unknown Rate Updates | \\([RRF]\\) | - | -| Maturity Date | \\([MD]\\) | Yes (Fixed) | -| Principal Repayment | \\([PR]\\) | At Maturity | -| Early Repayment | \\([PP]\\) | - | - -## Contract Execution - -| Execution | Option | -|----------------------|-------------------------| -| Primary Distribution | Direct placement | -| Primary Market | Placed at nominal value | -| Transfer Agent | Trustless | -| Payment Agent | Trustless, On-chain | -| Secondary Market | Yes | - -## Payment Agent - -Payments are trustless (i.e., can be triggered by anyone), as long as payments' -conditions are met (e.g., the payment is due). - -AVM fees (ALGO) for the execution of the cash flows are paid by who triggers the -cash flow. - -A coupon payment **cannot** be executed until all the previous due coupons (if -any) have been paid to all the investors. - -## Transfer Agent - -D-ASA units **cannot** be transferred until all the pending due coupon payments -for the sender and receiver (if any) have been executed. - -## Performance - -No grace period. No delinquency period. Default called manually by the trustee. diff --git a/docs/implementation/ref-perpetual-bond.md b/docs/implementation/ref-perpetual-bond.md deleted file mode 100644 index ef979f30..00000000 --- a/docs/implementation/ref-perpetual-bond.md +++ /dev/null @@ -1,70 +0,0 @@ -# Perpetual Bond - -## Contract Data Model - -| Property | ACTUS | Option | -|-------------------------|---------------|----------------------------| -| Type | \\([CT]\\) | \\([PBN]\\) | -| ID | \\([CID]\\) | D-ASA App ID | -| Denomination | \\([CUR]\\) | ASA | -| Settlement | \\([CURS]\\) | ASA | -| Interest | \\([IPNR]\\) | Variable (Interest Oracle) | -| Principal Discount | \\([PDIED]\\) | - | -| Time Schedule | \\([EVT]\\) | Events, Periods (Fixed) | -| Early Repayment Options | \\([PPEF]\\) | \\([N]\\) | -| Early Repayment Penalty | \\([PYTP]\\) | - | -| Day-Count Convention | \\([IPCD]\\) | \\([AA]\\) or Continuous | -| Calendar | \\([CLDR]\\) | \\([NC]\\) | -| Business Day Convention | \\([BDC]\\) | - | -| End of Month Convention | \\([EOMC]\\) | - | -| Performance | \\([PRF]\\) | Manual Default (Trustee) | -| Grace Period | \\([GRP]\\) | No | -| Delinquency Period | \\([DQP]\\) | No | - -## Contract Events - -| Event | ACTUS | Option | -|----------------------|-------------|-----------------| -| Coupon Payments | \\([IP]\\) | Yes (Perpetual) | -| Known Rate Updates | \\([RR]\\) | - | -| Unknown Rate Updates | \\([RRF]\\) | - | -| Maturity Date | \\([MD]\\) | No | -| Principal Repayment | \\([PR]\\) | No | -| Early Repayment | \\([PP]\\) | - | - -## Contract Execution - -| Execution | Option | -|----------------------|-------------------------| -| Primary Distribution | Direct placement | -| Primary Market | Placed at nominal value | -| Transfer Agent | Trustless | -| Payment Agent | Trustless, On-chain | -| Secondary Market | Yes | - -## Payment Agent - -Payments are trustless (i.e., can be triggered by anyone), as long as payments' -conditions are met (e.g., the payment is due). - -AVM fees (ALGO) for the execution of the cash flows are paid by who triggers the -cash flow. - -A coupon payment **cannot** be executed until all the previous due coupons (if -any) have been paid to all the investors. - -## Transfer Agent - -D-ASA units **cannot** be transferred until all the pending due coupon payments -for the sender and receiver (if any) have been executed. - -## Interest Rate - -Updated by the interest oracle. - -Interest rate **cannot** be updated until all the previous due coupons (if any) -have been paid to all the investors. - -## Performance - -No grace period. No delinquency period. Default called manually by the trustee. diff --git a/docs/implementation/ref-zero-coupon-bond.md b/docs/implementation/ref-zero-coupon-bond.md deleted file mode 100644 index eba8801a..00000000 --- a/docs/implementation/ref-zero-coupon-bond.md +++ /dev/null @@ -1,55 +0,0 @@ -# Zero Coupon Bond - -## Contract Data Model - -| Property | ACTUS | Option | -|-------------------------|---------------|--------------------------| -| Type | \\([CT]\\) | \\([PAM]\\) | -| ID | \\([CID]\\) | D-ASA App ID | -| Denomination | \\([CUR]\\) | ASA | -| Settlement | \\([CURS]\\) | ASA | -| Interest | \\([IPNR]\\) | - | -| Principal Discount | \\([PDIED]\\) | Yes | -| Time Schedule | \\([EVT]\\) | Events (Fixed) | -| Early Repayment Options | \\([PPEF]\\) | \\([N]\\) | -| Early Repayment Penalty | \\([PYTP]\\) | - | -| Day-Count Convention | \\([IPCD]\\) | \\([AA]\\) or Continuous | -| Calendar | \\([CLDR]\\) | \\([NC]\\) | -| Business Day Convention | \\([BDC]\\) | - | -| End of Month Convention | \\([EOMC]\\) | - | -| Performance | \\([PRF]\\) | Manual Default (Trustee) | -| Grace Period | \\([GRP]\\) | No | -| Delinquency Period | \\([DQP]\\) | No | - -## Contract Events - -| Event | ACTUS | Option | -|----------------------|-------------|-------------| -| Coupon Payments | \\([IP]\\) | No | -| Known Rate Updates | \\([RR]\\) | - | -| Unknown Rate Updates | \\([RRF]\\) | - | -| Maturity Date | \\([MD]\\) | Yes (Fixed) | -| Principal Repayment | \\([PR]\\) | At Maturity | -| Early Repayment | \\([PP]\\) | - | - -## Contract Execution - -| Execution | Option | -|----------------------|---------------------| -| Primary Distribution | Direct placement | -| Primary Market | Placed at discount | -| Transfer Agent | Trustless | -| Payment Agent | Trustless, On-chain | -| Secondary Market | Yes | - -## Payment Agent - -Payments are trustless (i.e., can be triggered by anyone), as long as payments' -conditions are met (e.g., the payment is due). - -AVM fees (ALGO) for the execution of the cash flows are paid by who triggers the -cash flow. - -## Performance - -No grace period. No delinquency period. Default called manually by the trustee. diff --git a/docs/implementation/reference-implementation.md b/docs/implementation/reference-implementation.md index 220113c7..cb918f2c 100644 --- a/docs/implementation/reference-implementation.md +++ b/docs/implementation/reference-implementation.md @@ -1,76 +1,32 @@ # Reference Implementation {#reference-implementation} -> ⚠️The reference implementations have not been audited. Do not use this code for +> ⚠️The reference implementation has not been audited. Do not use this code for > real products. The author declines all responsibility. -> ⚠️The reference implementation does not guarantee compliance with ACTUS reference -> implementation. +The reference implementation exposes one canonical on-chain contract, `DASA`, and +composes it from five modules: -The reference implementation provides the following features: +- `RbacModule` +- `ActusKernelModule` +- `AccountingModule` +- `PaymentAgent` +- `TransferAgent` -- RBAC and Accounting: - - Arranger: creates, configures and updates the D-ASA - - Account Manager: opens and closes accounts (proxy a KYC process) - - Primary Dealer: performs the primary distribution on the primary market - - Trustee: can call a default - - Authority: can suspend accounts or the whole asset - - Interest Oracle: can update the interest rate in case of variable rates +The implementation executes normalized ACTUS schedules on the AVM and currently +supports the kernel contract families `PAM`, `ANN`, `NAM`, `LAM`, `LAX`, and `CLM`. -- Types: - - Zero Coupon Bond - - Fixed Coupon Bond - - Perpetual Bond +## Delivered artifacts -- Denomination: - - On-chain (ASA) - - Off-chain +The canonical artifacts are: -- Payment Agent (Settlement): - - On-chain (ASA) +- `smart_contracts/artifacts/d_asa/DASA.arc56.json` +- `smart_contracts/artifacts/d_asa/dasa_client.py` -- Day-count conventions: - - Actual/Actual (time periods must be in days, i.e., multiples of `86400` seconds) - - Continuous +The deployment helpers in `smart_contracts/d_asa/deploy_config.py` provide code-accurate +demo normalization flows for: -- Transfer Agent: - - On-chain - - Direct (i.e., from investor to investor) +- a PAM fixed coupon bond profile; +- a PAM zero coupon bond profile. -- Secondary market - -- Notarize metadata (e.g., prospectus, etc.) - -- Updatable program (restricted to the Arranger) - -## Architecture - -The reference implementation architecture is structured in composable modules with -a clear separation of concerns: - -- RBAC Module -- Accounting Module -- Core Financial Module - - Common Cashflow Utilities - - Coupon Cashflow - - No-coupon Cashflow -- Payment Agent -- Transfer Agent - -The concrete financial contract inherits mixins to achieve compile-time specialization -across the ACTUS Contract Types (e.g., `PAM`, `PBN`), so each deployed contract -includes only the logic it actually needs. - -## Deployments {#deployments} - -D-ASA examples deployed on TestNet: - -| Type | App ID | App Spec | -|-------------------------------------------------|-------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------| -| [Zero Coupon Bond](./ref-zero-coupon-bond.md) | 756574705 | ARC-56 | -| [Fixed Coupon Bond](./ref-fixed-coupon-bond.md) | 756574716 | ARC-56 | -| [Perpetual Bond](./ref-perpetual-bond.md) | 756574702 | ARC-56 | - -1. Download the App Spec JSON file; -1. Navigate to the Lora App Lab; -1. Create the App Interface using the existing App ID and App Spec JSON; -1. Explore the D-ASA interface. +Those demos are examples of normalized inputs to the shared kernel, not separate +contract classes with different public ABIs. diff --git a/docs/implementation/reference-implementation-tests.md b/docs/implementation/tests.md similarity index 100% rename from docs/implementation/reference-implementation-tests.md rename to docs/implementation/tests.md diff --git a/docs/interfaces/account/close.md b/docs/interfaces/account/close.md deleted file mode 100644 index 92febec6..00000000 --- a/docs/interfaces/account/close.md +++ /dev/null @@ -1,43 +0,0 @@ -# Account Close - -```json -{ - "name": "account_close", - "desc": "Close D-ASA account", - "readonly": false, - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - } - ], - "returns": { - "type": "(uint64,uint64)", - "desc": "Closed units, Timestamp of the account closing" - }, - "errors": [ - { - "code": "UNAUTHORIZED", - "message": "Not authorized" - }, - { - "code": "DEFAULTED", - "message": "Defaulted" - }, - { - "code": "INVALID_HOLDING_ADDRESS", - "message": "Invalid account holding address" - } - ] -} - -``` - -The call **MUST** fail with the `UNAUTHORIZED` error code if not called by an authorized -caller or if the operation is not authorized. - -The call **MUST** fail with the `DEFAULTED` error code if the asset is defaulted. - -The call **MUST** fail with the `INVALID_HOLDING_ADDRESS` error code if the Account -does not exist. diff --git a/docs/interfaces/account/get-info.md b/docs/interfaces/account/get-info.md deleted file mode 100644 index 5c18bfd8..00000000 --- a/docs/interfaces/account/get-info.md +++ /dev/null @@ -1,29 +0,0 @@ -# Account Get Info - -```json -{ - "name": "account_get_info", - "desc": "Get account account info", - "readonly": true, - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - } - ], - "returns": { - "type": "(address,uint64,uint64,uint64,bool)", - "desc": "Payment Address, D-ASA units, Unit nominal value in denomination asset, Paid coupons, Suspended" - }, - "errors": [ - { - "code": "INVALID_HOLDING_ADDRESS", - "message": "Invalid Holding Address" - } - ] -} -``` - -The call **MUST** fail with the `INVALID_HOLDING_ADDRESS` error code if the Sender -or Receiver Holding Address is invalid. diff --git a/docs/interfaces/account/gov-suspension.md b/docs/interfaces/account/gov-suspension.md deleted file mode 100644 index 1e500712..00000000 --- a/docs/interfaces/account/gov-suspension.md +++ /dev/null @@ -1,41 +0,0 @@ -# Account Governance Suspension - -```json -{ - "name": "account_gov_suspension", - "desc": "Set account suspension status", - "readonly": false, - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - }, - { - "type": "bool", - "name": "suspended", - "desc": "Suspension status" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the set account suspension status" - }, - "errors": [ - { - "code": "UNAUTHORIZED", - "message": "Not authorized" - }, - { - "code": "INVALID_HOLDING_ADDRESS", - "message": "Invalid account holding address" - } - ] -} -``` - -The call **MUST** fail with the `UNAUTHORIZED` error code if not called by an authorized -caller. - -The call **MUST** fail with the `INVALID_HOLDING_ADDRESS` error code if the Account -does not exist. diff --git a/docs/interfaces/account/open.md b/docs/interfaces/account/open.md deleted file mode 100644 index 5f5f3a7d..00000000 --- a/docs/interfaces/account/open.md +++ /dev/null @@ -1,54 +0,0 @@ -# Account Open - -```json -{ - "name": "account_open", - "desc": "Open D-ASA account", - "readonly": false, - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - }, - { - "type": "address", - "name": "payment_address", - "desc": "Account Payment Address" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the account opening" - }, - "errors": [ - { - "code": "UNAUTHORIZED", - "message": "Not authorized" - }, - { - "code": "DEFAULTED", - "message": "Defaulted" - }, - { - "code": "SUSPENDED", - "message": "Suspended operations" - }, - { - "code": "INVALID_HOLDING_ADDRESS", - "message": "Invalid account holding address" - } - ] -} -``` - -The call **MUST** fail with the `UNAUTHORIZED` error code if not called by an authorized -caller or if the operation is not authorized. - -The call **MUST** fail with the `DEFAULTED` error code if the asset is defaulted. - -The call **MAY** fail with the `SUSPENDED` error code if the asset operations are -suspended. - -The call **MUST** fail with the `INVALID_HOLDING_ADDRESS` error code if the Account -already exists. diff --git a/docs/interfaces/account/overview.md b/docs/interfaces/account/overview.md new file mode 100644 index 00000000..7f4629cc --- /dev/null +++ b/docs/interfaces/account/overview.md @@ -0,0 +1,70 @@ +# Accounting Interface + +The Accounting interface manages holder positions and account-level suspension. + +## `account_suspension` + +```json +{ + "name": "account_suspension", + "readonly": false, + "args": [ + { "name": "holding_address", "type": "address" }, + { "name": "suspended", "type": "bool" } + ], + "returns": { "type": "uint64", "desc": "UNIX timestamp of the suspension update" }, + "errors": ["UNAUTHORIZED", "INVALID_HOLDING_ADDRESS"] +} +``` + +Only an active Authority may call this method. + +## `account_open` + +```json +{ + "name": "account_open", + "readonly": false, + "args": [ + { "name": "holding_address", "type": "address" }, + { "name": "payment_address", "type": "address" } + ], + "returns": { "type": "uint64", "desc": "UNIX timestamp of the account opening" }, + "errors": ["UNAUTHORIZED", "DEFAULTED", "SUSPENDED", "INVALID_HOLDING_ADDRESS"] +} +``` + +Only an active Account Manager may call this method. + +The current implementation treats an already existing holding address as `INVALID_HOLDING_ADDRESS`. + +## `account_update_payment_address` + +```json +{ + "name": "account_update_payment_address", + "readonly": false, + "args": [ + { "name": "holding_address", "type": "address" }, + { "name": "payment_address", "type": "address" } + ], + "returns": { "type": "uint64", "desc": "UNIX timestamp of the account update" }, + "errors": ["UNAUTHORIZED", "DEFAULTED", "SUSPENDED", "INVALID_HOLDING_ADDRESS"] +} +``` + +Only the Account Holding Address itself may call this method. + +## `account_get_position` + +```json +{ + "name": "account_get_position", + "readonly": true, + "args": [ + { "name": "holding_address", "type": "address" } + ], + "returns": { "type": "AccountPosition", "desc": "Full holder accounting position" }, + "errors": ["INVALID_HOLDING_ADDRESS"] +} +``` diff --git a/docs/interfaces/account/update-payment-address.md b/docs/interfaces/account/update-payment-address.md deleted file mode 100644 index 4176b224..00000000 --- a/docs/interfaces/account/update-payment-address.md +++ /dev/null @@ -1,54 +0,0 @@ -# Update Payment Address - -```json -{ - "name": "account_update_payment_address", - "desc": "Update Payment Address of an account", - "readonly": false, - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - }, - { - "type": "address", - "name": "payment_address", - "desc": "Account Payment Address" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the account update" - }, - "errors": [ - { - "code": "UNAUTHORIZED", - "message": "Not authorized" - }, - { - "code": "DEFAULTED", - "message": "Defaulted" - }, - { - "code": "SUSPENDED", - "message": "Suspended operations" - }, - { - "code": "INVALID_HOLDING_ADDRESS", - "message": "Invalid account holding address" - } - ] -} -``` - -The call **MUST** fail with the `UNAUTHORIZED` error code if not called by the Holding -Address. - -The call **MUST** fail with the `DEFAULTED` error code if the asset is defaulted. - -The call **MAY** fail with the `SUSPENDED` error code if the asset operations are -suspended. - -The call **MUST** fail with the `INVALID_HOLDING_ADDRESS` error code if the Account -does not exist. diff --git a/docs/interfaces/contract/config.md b/docs/interfaces/contract/config.md deleted file mode 100644 index 373ceb81..00000000 --- a/docs/interfaces/contract/config.md +++ /dev/null @@ -1,168 +0,0 @@ -# Asset Config - -```json -{ - "name": "asset_config", - "desc": "Configure the Debt Algorand Standard Application", - "readonly": false, - "args": [ - { - "type": "uint64", - "name": "denomination_asset_id", - "desc": "Denomination asset identifier" - }, - { - "type": "uint64", - "name": "settlement_asset_id", - "desc": "Settlement asset identifier" - }, - { - "type": "uint64", - "name": "principal", - "desc": "Principal, expressed in denomination asset" - }, - { - "type": "uint16", - "name": "principal_discount", - "desc": "Discount on principal in bps" - }, - { - "type": "uint64", - "name": "minimum_denomination", - "desc": "Minimum denomination, expressed in denomination asset" - }, - { - "type": "uint8", - "name": "day_count_convention_id", - "desc": "Day-count convention for interests calculation" - }, - { - "type": "uint16", - "name": "interest_rate", - "desc": "Interest rates in bps" - }, - { - "type": "uint16[]", - "name": "coupon_rates", - "desc": "Coupon interest rates in bps" - }, - { - "type": "uint64[]", - "name": "time_events", - "desc": "Time events (strictly ascending order)" - }, - { - "type": "(uint64,uint64)[]", - "name": "time_periods", - "desc": "Time periods of recurring time events" - } - ], - "returns": { - "type": "void" - }, - "errors": [ - { - "code": "UNAUTHORIZED", - "message": "Not authorized" - }, - { - "code": "ALREADY_CONFIGURED", - "message": "D-ASA already configured" - }, - { - "code": "INVALID_DENOMINATION", - "message": "Denomination asset is not properly set" - }, - { - "code": "INVALID_MINIMUM_DENOMINATION", - "message": "Minimum denomination is not a divisor of principal" - }, - { - "code": "INVALID_DAY_COUNT_CONVENTION", - "message": "Invalid day-count convention ID" - }, - { - "code": "INVALID_INTEREST_RATE", - "message": "Interest rate is not properly defined" - }, - { - "code": "INVALID_TIME_EVENTS_LENGTH", - "message": "Time events length is invalid" - }, - { - "code": "INVALID_TIME", - "message": "Time events must be set in the future" - }, - { - "code": "INVALID_SORTING", - "message": "Time events are not sorted correctly" - }, - { - "code": "INVALID_TIME_PERIOD_DURATION", - "message": "Time period durations must be greater than zero" - }, - { - "code": "INVALID_SETTLEMENT_ASSET", - "message": "Different settlement asset not supported, must be equal to denomination asset" - }, - { - "code": "INVALID_TIME_PERIODS", - "message": "Time periods not properly set" - }, - { - "code": "INVALID_TIME_PERIOD_REPETITIONS", - "message": "Time period repetitions not properly set" - }, - { - "code": "INVALID_COUPON_RATES", - "message": "Coupon rates not properly set" - } - ] -} -``` - -The call **MUST** fail with the `UNAUTHORIZED` error code if not called by an authorized -caller. - -The call **MUST** fail with the `ALREADY_CONFIGURED` error code if the D-ASA has -been already configured. - -The call **MUST** fail with the `INVALID_DENOMINATION` error code if the *denomination -asset* is not properly set for the specific implementation. - -The call **MUST** fail with the `INVALID_MINIMUM_DENOMINATION` error code if the -*minimum denomination* is not a divisor of the *principal*. - -The call **MUST** fail with the `INVALID_DAY_COUNT_CONVENTION` error code if the -*day-count convention* ID is invalid. - -The call **MUST** fail with the `INVALID_INTEREST_RATE` error code if the *interest -rate* is not properly set for the specific implementation. - -The call **MUST** fail with the `INVALID_TIME_EVENTS_LENGTH` error code if the length -of the *time events* is not greater than or equal to: - -- *total coupons* + `3`, if the D-ASA **has not** a defined *maturity date*; -- *total coupons* + `4`, if the D-ASA **has** a defined *maturity date*. - -The call **MUST** fail with the `INVALID_TIME` error code if the first *time event* -is earlier than the latest timestamp (or block height). - -The call **MUST** fail with the `INVALID_SORTING` error code if the *time events* -are not sorted in strictly ascending order. - -The call **MUST** fail with the `INVALID_TIME_PERIOD_DURATION` error code if the -*time period durations* are not strictly greater than zero. - -The call **MAY** fail with the `INVALID_SETTLEMENT_ASSET` error code if a *settlement -asset* different from the *denomination asset* is not supported by the specific -implementation. - -The call **MAY** fail with the `INVALID_TIME_PERIODS` error code if the *time periods* -are not properly set for the specific implementation. - -The call **MAY** fail with the `INVALID_TIME_PERIOD_REPETITIONS` error code if the -*time period repetitions* are not properly set for the specific implementation. - -The call **MAY** fail with the `INVALID_COUPON_RATES` error code if the *coupon -rates* are not properly set for the specific implementation. diff --git a/docs/interfaces/contract/get-account-units-current-value.md b/docs/interfaces/contract/get-account-units-current-value.md deleted file mode 100644 index 382104e1..00000000 --- a/docs/interfaces/contract/get-account-units-current-value.md +++ /dev/null @@ -1,64 +0,0 @@ -# Get Account Units Current Value - -```json -{ - "name": "get_account_units_current_value", - "desc": "Get account's current units value and accrued interest", - "readonly": true, - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - }, - { - "type": "uint64", - "name": "units", - "desc": "Account's units for the current value calculation" - } - ], - "returns": { - "type": "(uint64,uint64,(uint64,uint64))", - "desc": "Units current value in denomination asset, Accrued interest in denomination asset, (Day count factor numerator, Day count factor denominator)" - }, - "errors": [ - { - "code": "NO_PRIMARY_DISTRIBUTION", - "message": "Primary distribution not yet executed" - }, - { - "code": "INVALID_HOLDING_ADDRESS", - "message": "Invalid Holding Address" - }, - { - "code": "INVALID_UNITS", - "message": "Invalid amount of units for the account" - }, - { - "code": "PENDING_COUPON_PAYMENT", - "message": "Pending due coupon payment for the account" - } - ] -} -``` - -The call **MUST** fail with the `NO_PRIMARY_DISTRIBUTION` error code if the method -is called before the *primary distribution opening date*. - -The call **MUST** fail with the `INVALID_HOLDING_ADDRESS` error code if the Sender -or Receiver Holding Address is invalid. - -The call **MUST** fail with the `INVALID_UNITS` error code if the *unit* value is -greater than Account D-ASA units. - -If the D-ASA has coupons, the call **MUST** fail with the `PENDING_COUPON_PAYMENT` -error code if there is an old due coupon still to be paid to any account. - -The *accrued interest* **MUST** `0` if the method is called before the *issuance -date*. - -If the D-ASA has fixed coupons, the *accrued interest* **MUST** be `0` after all -coupons are due. - -If the D-ASA has zero coupons, the *accrued interest* **MUST** be `0` after the -*maturity date*. diff --git a/docs/interfaces/contract/get-account-units-value.md b/docs/interfaces/contract/get-account-units-value.md deleted file mode 100644 index d0764bdc..00000000 --- a/docs/interfaces/contract/get-account-units-value.md +++ /dev/null @@ -1,48 +0,0 @@ -# Get Account Units Value - -```json -{ - "name": "get_account_units_value", - "desc": "Get account's units nominal value", - "readonly": true, - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - }, - { - "type": "uint64", - "name": "units", - "desc": "Account's units for the nominal value calculation" - } - ], - "returns": { - "type": "uint64", - "desc": "Units nominal value in denomination asset" - }, - "errors": [ - { - "code": "NO_PRIMARY_DISTRIBUTION", - "message": "Primary distribution not yet executed" - }, - { - "code": "INVALID_HOLDING_ADDRESS", - "message": "Invalid Holding Address" - }, - { - "code": "INVALID_UNITS", - "message": "Invalid amount of units for the account" - } - ] -} -``` - -The call **MUST** fail with the `NO_PRIMARY_DISTRIBUTION` error code if the method -is called before the *primary distribution opening date*. - -The call **MUST** fail with the `INVALID_HOLDING_ADDRESS` error code if the Sender -or Receiver Holding Address is invalid. - -The call **MUST** fail with the `INVALID_UNITS` error code if the *unit* value is -greater than Account D-ASA units. diff --git a/docs/interfaces/contract/get-amortizing-rates.md b/docs/interfaces/contract/get-amortizing-rates.md deleted file mode 100644 index fd3cf539..00000000 --- a/docs/interfaces/contract/get-amortizing-rates.md +++ /dev/null @@ -1,14 +0,0 @@ -# Get Amortizing Rates - -```json -{ - "name": "get_amortizing_rates", - "desc": "Get D-ASA principal amortizing rates", - "readonly": true, - "args": [], - "returns": { - "type": "uint64[]", - "desc": "Principal amortizing rates" - } -} -``` diff --git a/docs/interfaces/contract/get-asset-info.md b/docs/interfaces/contract/get-asset-info.md deleted file mode 100644 index 9ec3b977..00000000 --- a/docs/interfaces/contract/get-asset-info.md +++ /dev/null @@ -1,14 +0,0 @@ -# Get Asset Info - -```json -{ - "name": "get_asset_info", - "desc": "Get D-ASA info", - "readonly": true, - "args": [], - "returns": { - "type": "(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64, uint64,uint64,uint64,bool,uint8)", - "desc": "Denomination asset ID, Settlement asset ID, Outstanding principal, Unit nominal value, Day-count convention, Principal discount, Interest rate, Total supply, Circulating supply, Primary distribution opening date, Primary distribution closure date, Issuance date, Maturity date, Suspended, Performance" - } -} -``` diff --git a/docs/interfaces/contract/get-asset-metadata.md b/docs/interfaces/contract/get-asset-metadata.md deleted file mode 100644 index 6c19a144..00000000 --- a/docs/interfaces/contract/get-asset-metadata.md +++ /dev/null @@ -1,14 +0,0 @@ -# Get Asset Metadata - -```json -{ - "name": "get_asset_metadata", - "desc": "Get D-ASA metadata", - "readonly": true, - "args": [], - "returns": { - "type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", - "desc": "Contract type, Calendar, Business day convention, End of month convention, Early repayment effect, Early repayment penalty type, Prospectus hash, Prospectus URL" - } -} -``` diff --git a/docs/interfaces/contract/get-coupon-rates.md b/docs/interfaces/contract/get-coupon-rates.md deleted file mode 100644 index 4a11ccbb..00000000 --- a/docs/interfaces/contract/get-coupon-rates.md +++ /dev/null @@ -1,14 +0,0 @@ -# Get Coupon Rates - -```json -{ - "name": "get_coupons_rates", - "desc": "Get D-ASA coupon rates", - "readonly": true, - "args": [], - "returns": { - "type": "uint16[]", - "desc": "Coupon rates" - } -} -``` diff --git a/docs/interfaces/contract/get-coupon-status.md b/docs/interfaces/contract/get-coupon-status.md deleted file mode 100644 index 674b31bc..00000000 --- a/docs/interfaces/contract/get-coupon-status.md +++ /dev/null @@ -1,19 +0,0 @@ -# Get Coupons Status - -```json -{ - "name": "get_coupons_status", - "desc": "Get D-ASA coupons status", - "readonly": true, - "args": [], - "returns": { - "type": "(uint64,uint64,uint64,(uint64,uint64),bool)", - "desc": "Total coupons, Due coupons, Next coupon due date, (Day count factor numerator, Day count factor denominator) , All coupons due paid" - } -} -``` - -The *next coupon due date* value **MUST** be `0` if all coupons are due. - -The *day count factor* values **MUST** `0` if the method is called before the *issuance -date* or if all coupons are due. diff --git a/docs/interfaces/contract/get-early-repayment-schedule.md b/docs/interfaces/contract/get-early-repayment-schedule.md deleted file mode 100644 index c3be4aa1..00000000 --- a/docs/interfaces/contract/get-early-repayment-schedule.md +++ /dev/null @@ -1,14 +0,0 @@ -# Get Early Repayment Schedule - -```json -{ - "name": "get_early_repayment_schedule", - "desc": "Get early repayment schedule", - "readonly": true, - "args": [], - "returns": { - "type": "uint64[]", - "desc": "Early repayment schedule" - } -} -``` diff --git a/docs/interfaces/contract/get-payment-amount.md b/docs/interfaces/contract/get-payment-amount.md deleted file mode 100644 index ee697263..00000000 --- a/docs/interfaces/contract/get-payment-amount.md +++ /dev/null @@ -1,53 +0,0 @@ -# Get Payment Amount - -```json -{ - "name": "get_payment_amount", - "desc": "Get the next payment amount", - "readonly": true, - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - } - ], - "returns": { - "type": "(uint64,uint64)", - "desc": "Interest amount in denomination asset, Principal amount in denomination asset" - }, - "errors": [ - { - "code": "INVALID_HOLDING_ADDRESS", - "message": "Invalid Holding Address" - } - ] -} -``` - -The getter **MUST** return the next payment amount for the account or `0` if there -is no payment to execute for the account. - -The getter **MUST** return the interest and the principal components separately. - -{{#include ../../_include/styles.md:example}} -> Let's have a D-ASA with `4` coupons. The account already received `2` coupon payments. -> The getter returns the interest amount of the 3rd coupon. - -{{#include ../../_include/styles.md:example}} -> Let's have a D-ASA with `4` coupons and a principal amortizing schedule. The account -> already received `2` coupon payments. The getter returns the interest amount of -> the 3rd coupon and the amortized principal. - -{{#include ../../_include/styles.md:example}} -> Let's have a D-ASA with `4` coupons and principal at maturity. The account already -> received `4` coupon payments. The getter returns the amount of the principal repayment. - -{{#include ../../_include/styles.md:example}} -> Let's have a D-ASA with zero coupons and principal at maturity. The principal -> is not yet mature. The getter returns the amount of the principal repayment. - -{{#include ../../_include/styles.md:example}} -> Let's have a D-ASA with perpetual coupons and no callable principal. The account -> already received `N` coupon payments. The getter returns the interest amount of -> the `N+1` coupon. diff --git a/docs/interfaces/contract/get-secondary-market-schedule.md b/docs/interfaces/contract/get-secondary-market-schedule.md deleted file mode 100644 index d65901d3..00000000 --- a/docs/interfaces/contract/get-secondary-market-schedule.md +++ /dev/null @@ -1,14 +0,0 @@ -# Get Secondary Market Schedule - -```json -{ - "name": "get_secondary_market_schedule", - "desc": "Get secondary market schedule", - "readonly": true, - "args": [], - "returns": { - "type": "uint64[]", - "desc": "Secondary market schedule" - } -} -``` diff --git a/docs/interfaces/contract/get-time-events.md b/docs/interfaces/contract/get-time-events.md deleted file mode 100644 index 3bd0c204..00000000 --- a/docs/interfaces/contract/get-time-events.md +++ /dev/null @@ -1,14 +0,0 @@ -# Get Time Events - -```json -{ - "name": "get_time_events", - "desc": "Get D-ASA time events", - "readonly": true, - "args": [], - "returns": { - "type": "uint64[]", - "desc": "Time events" - } -} -``` diff --git a/docs/interfaces/contract/get-time-periods.md b/docs/interfaces/contract/get-time-periods.md deleted file mode 100644 index fc327414..00000000 --- a/docs/interfaces/contract/get-time-periods.md +++ /dev/null @@ -1,14 +0,0 @@ -# Get Time Periods - -```json -{ - "name": "get_time_periods", - "desc": "Get D-ASA time periods", - "readonly": true, - "args": [], - "returns": { - "type": "(uint64,uint64)[]", - "desc": "Time periods" - } -} -``` diff --git a/docs/interfaces/contract/overview.md b/docs/interfaces/contract/overview.md new file mode 100644 index 00000000..ac527136 --- /dev/null +++ b/docs/interfaces/contract/overview.md @@ -0,0 +1,179 @@ +# ACTUS Kernel Interface + +The ACTUS Kernel interface configures the normalized contract, stores the execution +schedule, and advances non-cash lifecycle events. + +## `contract_create` + +```json +{ + "name": "contract_create", + "create": "require", + "readonly": false, + "args": [ + { "name": "arranger", "type": "address" } + ], + "returns": { "type": "uint64", "desc": "UNIX timestamp of contract creation" }, + "errors": [] +} +``` + +## `contract_config` + +```json +{ + "name": "contract_config", + "readonly": false, + "args": [ + { "name": "terms", "type": "NormalizedActusTerms" }, + { "name": "initial_state", "type": "InitialKernelState" }, + { "name": "prospectus", "type": "Prospectus" } + ], + "returns": { "type": "uint64", "desc": "UNIX timestamp of contract configuration" }, + "errors": [ + "UNAUTHORIZED", + "ALREADY_CONFIGURED", + "INVALID_ACTUS_CONFIG", + "INVALID_DAY_COUNT_CONVENTION", + "INVALID_DENOMINATION", + "INVALID_SETTLEMENT_ASSET", + "INVALID_IED" + ] +} +``` + +Only the Arranger may call this method. + +## `contract_schedule` + +```json +{ + "name": "contract_schedule", + "readonly": false, + "args": [ + { "name": "schedule_page_index", "type": "uint64" }, + { "name": "is_last_page", "type": "bool" }, + { "name": "schedule_page", "type": "ExecutionSchedulePage" } + ], + "returns": { "type": "uint64", "desc": "UNIX timestamp of the schedule upload" }, + "errors": [ + "UNAUTHORIZED", + "ALREADY_CONFIGURED", + "TERMS_NOT_CONFIGURED", + "INVALID_SCHEDULE_PAGE", + "INVALID_EVENT_ID", + "INVALID_ACTUS_CONFIG", + "INVALID_SORTING" + ] +} +``` + +Only the Arranger may call this method. + +## `contract_execute_ied` + +```json +{ + "name": "contract_execute_ied", + "readonly": false, + "args": [], + "returns": { "type": "uint64", "desc": "UNIX timestamp of the IED execution" }, + "errors": [ + "NOT_CONFIGURED", + "UNAUTHORIZED", + "DEFAULTED", + "SUSPENDED", + "INVALID_EVENT_CURSOR", + "INVALID_EVENT_TYPE", + "NO_DUE_CASHFLOW", + "INVALID_ACTUS_CONFIG", + "PRIMARY_DISTRIBUTION_INCOMPLETE" + ] +} +``` + +Only the Arranger may call this method. + +## `apply_non_cash_event` + +```json +{ + "name": "apply_non_cash_event", + "readonly": false, + "args": [ + { "name": "event_id", "type": "uint64" }, + { "name": "payload", "type": "ObservedEventRequest" } + ], + "returns": { "type": "uint64", "desc": "UNIX timestamp of the event application" }, + "errors": [ + "NOT_CONFIGURED", + "DEFAULTED", + "SUSPENDED", + "OBSERVED_EVENT_REQUIRED", + "UNAUTHORIZED", + "INVALID_EVENT_ID", + "INVALID_EVENT_CURSOR", + "INVALID_EVENT_TYPE", + "INVALID_SCHEDULE_PAGE", + "INVALID_ACTUS_CONFIG", + "INVALID_SORTING", + "NO_DUE_CASHFLOW", + "PENDING_IED" + ] +} +``` + +`RR` and `RRF` execution is Observer-controlled. Other non-cash events are Arranger-controlled. + +## `append_observed_cash_event` + +```json +{ + "name": "append_observed_cash_event", + "readonly": false, + "args": [ + { "name": "payload", "type": "ObservedCashEventRequest" } + ], + "returns": { "type": "uint64", "desc": "UNIX timestamp of the append operation" }, + "errors": [ + "NOT_CONFIGURED", + "UNAUTHORIZED", + "DEFAULTED", + "SUSPENDED", + "PENDING_IED", + "OBSERVED_EVENT_REQUIRED", + "INVALID_EVENT_ID", + "INVALID_EVENT_TYPE", + "INVALID_SCHEDULE_PAGE", + "INVALID_ACTUS_CONFIG", + "INVALID_SORTING" + ] +} +``` + +## `contract_get_state` + +```json +{ + "name": "contract_get_state", + "readonly": true, + "args": [], + "returns": { "type": "KernelState", "desc": "Current kernel state snapshot" }, + "errors": ["NOT_CONFIGURED"] +} +``` + +## `contract_get_next_due_event` + +```json +{ + "name": "contract_get_next_due_event", + "readonly": true, + "args": [], + "returns": { + "type": "ExecutionScheduleEntry", + "desc": "Next due schedule entry, or a zero sentinel if the contract ended" + }, + "errors": ["NOT_CONFIGURED"] +} +``` diff --git a/docs/interfaces/contract/primary-distribution.md b/docs/interfaces/contract/primary-distribution.md deleted file mode 100644 index c4181a60..00000000 --- a/docs/interfaces/contract/primary-distribution.md +++ /dev/null @@ -1,75 +0,0 @@ -# Primary Distribution - -```json -{ - "name": "primary_distribution", - "desc": "Distribute D-ASA units to accounts according the primary market", - "readonly": false, - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - }, - { - "type": "uint64", - "name": "units", - "desc": "Amount of D-ASA units to distribute" - } - ], - "returns": { - "type": "uint64", - "desc": "Remaining D-ASA units to be distributed" - }, - "errors": [ - { - "code": "UNAUTHORIZED", - "message": "Not authorized" - }, - { - "code": "DEFAULTED", - "message": "Defaulted" - }, - { - "code": "SUSPENDED", - "message": "Suspended operations" - }, - { - "code": "INVALID_HOLDING_ADDRESS", - "message": "Invalid account holding address" - }, - { - "code": "ZERO_UNITS", - "message": "Cannot distribute zero units" - }, - { - "code": "OVER_DISTRIBUTION", - "message": "Insufficient remaining D-ASA units" - }, - { - "code": "PRIMARY_DISTRIBUTION_CLOSED", - "message": "Primary distribution is closed" - } - ] -} -``` - -The call **MUST** fail with the `UNAUTHORIZED` error code if not called by the authorized -primary market entity. - -The call **MUST** fail with the `INVALID_HOLDING_ADDRESS` error code if the Account -associated with the holding address does not exist. - -The call **MUST** fail with the `DEFAULTED` error code if the asset is defaulted. - -The call **MAY** fail with the `SUSPENDED` error code if the asset operations are -suspended. - -The call **MUST** fail with the `ZERO_UNITS` error code if the distributing units -are null. - -The call **MUST** fail with the `OVER_DISTRIBUTION` error code if there are no sufficient -remaining D-ASA units for the primary distribution. - -The call **MUST** fail with the `PRIMARY_DISTRIBUTION_CLOSED` error code if the -*primary distribution* is closed. diff --git a/docs/interfaces/contract/set-amortizing-rates.md b/docs/interfaces/contract/set-amortizing-rates.md deleted file mode 100644 index 82b1fda3..00000000 --- a/docs/interfaces/contract/set-amortizing-rates.md +++ /dev/null @@ -1,63 +0,0 @@ -# Set Amortizing Rates - -```json -{ - "name": "set_amortizing_rates", - "desc": "Set principal amortizing rates", - "readonly": false, - "args": [ - { - "type": "uint16[]", - "name": "amortizing_rates", - "desc": "Principal amortizing rates in bps" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the set rates" - }, - "errors": [ - { - "code": "UNAUTHORIZED", - "message": "Not authorized" - }, - { - "code": "DEFAULTED", - "message": "Defaulted" - }, - { - "code": "SUSPENDED", - "message": "Suspended operations" - }, - { - "code": "INVALID_AMORTIZING_RATES_LENGTH", - "message": "Amortizing rates length is invalid" - }, - { - "code": "INVALID_RATES", - "message": "Sum of amortizing rates must be equal to 10000 bps" - }, - { - "code": "INVALID_PAST_RATE", - "message": "Past amortizing rates can not be modified" - } - ] -} -``` - -The call **MUST** fail with the `UNAUTHORIZED` error code if not called by an authorized -caller. - -The call **MUST** fail with the `DEFAULTED` error code if the asset is defaulted. - -The call **MAY** fail with the `SUSPENDED` error code if the asset operations are -suspended. - -The call **MUST** fail with the `INVALID_AMORTIZING_RATES_LENGTH` error code if -the length of the *amortizing rates* is not equal to *total\_coupons* plus `1`. - -The call **MUST** fail with the `INVALID_RATES` error code if the sum of *amortizing -rates* is not equal to 10,000 bps. - -The call **MUST** fail with the `INVALID_PAST_RATE` error code if a past amortizing -rate is modified. diff --git a/docs/interfaces/contract/set-default-status.md b/docs/interfaces/contract/set-default-status.md deleted file mode 100644 index 9ac908f0..00000000 --- a/docs/interfaces/contract/set-default-status.md +++ /dev/null @@ -1,29 +0,0 @@ -# Set Default Status - -```json -{ - "name": "set_default_status", - "desc": "Set D-ASA default status", - "readonly": false, - "args": [ - { - "type": "bool", - "name": "defaulted", - "desc": "Default status" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the set status" - }, - "errors": [ - { - "code": "UNAUTHORIZED", - "message": "Not authorized" - } - ] -} -``` - -The call **MUST** fail with the `UNAUTHORIZED` error code if not called by an authorized -caller. diff --git a/docs/interfaces/contract/set-early-repayment-option.md b/docs/interfaces/contract/set-early-repayment-option.md deleted file mode 100644 index f7b852b2..00000000 --- a/docs/interfaces/contract/set-early-repayment-option.md +++ /dev/null @@ -1,82 +0,0 @@ -# Set Early Repayment Option - -```json -{ - "name": "set_early_repayment_option", - "desc": "Set early repayment schedule and eventual penalty rate", - "readonly": false, - "args": [ - { - "type": "uint64[]", - "name": "time_events", - "desc": "Early repayment time events (strictly ascending order)" - }, - { - "type": "uint64", - "name": "penalty_rate", - "desc": "Early repayment penalty rate (absolute or relative), if any" - } - ], - "returns": { - "type": "(uint64, uint64)", - "desc": "Early repayments start date, Early repayments end date" - }, - "errors": [ - { - "code": "UNAUTHORIZED", - "message": "Not authorized" - }, - { - "code": "DEFAULTED", - "message": "Defaulted" - }, - { - "code": "SUSPENDED", - "message": "Suspended operations" - }, - { - "code": "INVALID_TIME_EVENTS_LENGTH", - "message": "Time events length is invalid" - }, - { - "code": "INVALID_SORTING", - "message": "Time events are not sorted correctly" - }, - { - "code": "INVALID_EARLY_REPAYMENT_START_DATE", - "message": "Invalid early repayment start date" - }, - { - "code": "INVALID_EARLY_REPAYMENT_END_DATE", - "message": "Invalid early repayment end date" - }, - { - "code": "INVALID_PAST_EVENT", - "message": "Past time events can not be modified" - } - ] -} -``` - -The call **MUST** fail with the `UNAUTHORIZED` error code if not called by an authorized -caller. - -The call **MUST** fail with the `DEFAULTED` error code if the asset is defaulted. - -The call **MAY** fail with the `SUSPENDED` error code if the asset operations are -suspended. - -The call **MUST** fail with the `INVALID_TIME_EVENTS_LENGTH` error code if the length -of the *time events* is not greater than or equal to `2`. - -The call **MUST** fail with the `INVALID_SORTING` error code if the *time events* -are not sorted in strictly ascending order. - -The call **MUST** fail with the `INVALID_EARLY_REPAYMENT_START_DATE` error code -if the *early repayment start date* is earlier than the *issuance date*. - -The call **MUST** fail with the `INVALID_EARLY_REPAYMENT_END_DATE` error code if -the *early repayment end date* is later than the *maturity date*. - -The call **MUST** fail with the `INVALID_PAST_EVENT` error code if a past event -is modified. diff --git a/docs/interfaces/contract/set-metadata.md b/docs/interfaces/contract/set-metadata.md deleted file mode 100644 index 0bc74f8e..00000000 --- a/docs/interfaces/contract/set-metadata.md +++ /dev/null @@ -1,76 +0,0 @@ -# Set Asset Metadata - -```json -{ - "name": "set_metadata", - "desc": "Set D-ASA metadata", - "readonly": false, - "args": [ - { - "type": "uint8", - "name": "contract_type", - "desc": "Contract type" - }, - { - "type": "uint8", - "name": "calendar", - "desc": "Calendar [default 0]" - }, - { - "type": "uint8", - "name": "business_day_convention", - "desc": "Business day convention [default 0]" - }, - { - "type": "uint8", - "name": "end_of_month_convention", - "desc": "End of month convention [default 0]" - }, - { - "type": "uint8", - "name": "prepayment_effect", - "desc": "Early repayment effect [default 0]" - }, - { - "type": "uint8", - "name": "penalty_type", - "desc": "Early repayment penalty type [default 0]" - }, - { - "type": "byte[32]", - "name": "prospectus_hash", - "desc": "Prospectus hash" - }, - { - "type": "string", - "name": "prospectus_url", - "desc": "Prospectus URL" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the set metadata" - }, - "errors": [ - { - "code": "UNAUTHORIZED", - "message": "Not authorized" - }, - { - "code": "DEFAULTED", - "message": "Defaulted" - }, - { - "code": "SUSPENDED", - "message": "Asset operations are suspended" - } - ] -} -``` - -The call **MUST** fail with the `UNAUTHORIZED` error code if not called by an authorized -caller. - -The call **MUST** fail with the `DEFAULTED` error code if the asset is defaulted. - -The call **MAY** fail with the `SUSPENDED` error code if the asset is suspended. diff --git a/docs/interfaces/contract/set-secondary-time-events.md b/docs/interfaces/contract/set-secondary-time-events.md deleted file mode 100644 index 9a702827..00000000 --- a/docs/interfaces/contract/set-secondary-time-events.md +++ /dev/null @@ -1,78 +0,0 @@ -# Set Secondary Time Events - -```json -{ - "name": "set_secondary_time_events", - "desc": "Set secondary market time schedule", - "readonly": false, - "args": [ - { - "type": "uint64[]", - "name": "secondary_market_time_events", - "desc": "Secondary market time events (strictly ascending order)" - } - ], - "returns": { - "type": "(uint64, uint64)", - "desc": "Secondary market opening date, Secondary market closure date" - }, - "errors": [ - { - "code": "UNAUTHORIZED", - "message": "Not authorized" - }, - { - "code": "DEFAULTED", - "message": "Defaulted" - }, - { - "code": "SUSPENDED", - "message": "Suspended operations" - }, - { - "code": "INVALID_TIME_EVENTS_LENGTH", - "message": "Time events length is invalid" - }, - { - "code": "INVALID_SORTING", - "message": "Time events are not sorted correctly" - }, - { - "code": "INVALID_SECONDARY_OPENING_DATE", - "message": "Invalid secondary market opening date" - }, - { - "code": "INVALID_SECONDARY_CLOSURE_DATE", - "message": "Invalid secondary market closure date" - }, - { - "code": "INVALID_PAST_EVENT", - "message": "Past time events can not be modified" - } - ] -} -``` - -The call **MUST** fail with the `UNAUTHORIZED` error code if not called by an authorized -caller. - -The call **MUST** fail with the `DEFAULTED` error code if the asset is defaulted. - -The call **MAY** fail with the `SUSPENDED` error code if the asset operations are -suspended. - -The call **MUST** fail with the `INVALID_TIME_EVENTS_LENGTH` error code if the length -of the *time events* is not greater than or equal to `1`. - -The call **MUST** fail with the `INVALID_SORTING` error code if the *time events* -are not sorted in strictly ascending order. - -The call **MUST** fail with the `INVALID_SECONDARY_OPENING_DATE` error code if the -*secondary market opening date* is earlier than the *issuance date*. - -The call **MUST** fail with the `INVALID_SECONDARY_CLOSURE_DATE` error code if the -*secondary market closure date* is earlier than the *secondary market opening date* -or later than the *maturity date*. - -The call **MUST** fail with the `INVALID_PAST_EVENT` error code if a past event -is modified. diff --git a/docs/interfaces/contract/set-variable-interest-rate.md b/docs/interfaces/contract/set-variable-interest-rate.md deleted file mode 100644 index 6fea582d..00000000 --- a/docs/interfaces/contract/set-variable-interest-rate.md +++ /dev/null @@ -1,60 +0,0 @@ -# Set Variable Rate - -```json -{ - "name": "set_variable_interest_rate", - "desc": "Set D-ASA variable interest rate", - "readonly": false, - "args": [ - { - "type": "uint16", - "name": "spread", - "desc": "Spread in bps" - }, - { - "type": "uint16", - "name": "life_cap", - "desc": "Rate life cap in bps" - }, - { - "type": "uint16", - "name": "life_floor", - "desc": "Rate life floor in bps" - }, - { - "type": "uint16", - "name": "period_cap", - "desc": "Rate period cap in bps" - }, - { - "type": "uint16", - "name": "period_floor", - "desc": "Rate period floor in bps" - }, - { - "type": "uint64", - "name": "fixing_period", - "desc": "Rate fixing period (UNIX time)" - } - ], - "returns": { - "type": "void" - }, - "errors": [ - { - "code": "UNAUTHORIZED", - "message": "Not authorized" - }, - { - "code": "DEFAULTED", - "message": "Defaulted" - }, - { - "code": "SUSPENDED", - "message": "Asset operations are suspended" - } - ] -} -``` - -TODO: Add specs diff --git a/docs/interfaces/contract/update-coupon-rates.md b/docs/interfaces/contract/update-coupon-rates.md deleted file mode 100644 index 539b526c..00000000 --- a/docs/interfaces/contract/update-coupon-rates.md +++ /dev/null @@ -1,62 +0,0 @@ -# Update Coupon Rates - -```json -{ - "name": "update_coupon_rates", - "desc": "Update variable coupon interest rates in bps", - "readonly": false, - "args": [ - { - "type": "uint16[]", - "name": "coupon_rates", - "desc": "Coupon interest rates in bps" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the update" - }, - "errors": [ - { - "code": "UNAUTHORIZED", - "message": "Not authorized" - }, - { - "code": "DEFAULTED", - "message": "Defaulted" - }, - { - "code": "SUSPENDED", - "message": "Asset operations are suspended" - }, - { - "code": "INVALID_COUPON_RATES_LENGTH", - "message": "Coupon rates length is not equal to total coupons" - }, - { - "code": "INVALID_PAST_RATE", - "message": "Due coupon rates can not be modified" - }, - { - "code": "PENDING_COUPON_PAYMENT", - "message": "Pending due coupon payment" - } - ] -} -``` - -The call **MUST** fail with the `UNAUTHORIZED` error code if not called by an authorized -caller. - -The call **MUST** fail with the `DEFAULTED` error code if the asset is defaulted. - -The call **MAY** fail with the `SUSPENDED` error code if the asset is suspended. - -The call **MUST** fail with the `INVALID_COUPON_RATES_LENGTH` error code if the -length of the *coupon rates* is not equal to *total_coupons*. - -The call **MUST** fail with the `INVALID_PAST_RATE` error code if a due coupon rate -is modified. - -The call **MUST** fail with the `PENDING_COUPON_PAYMENT` error code if there is -any due coupon still to be paid. diff --git a/docs/interfaces/contract/update-global-unit-value.md b/docs/interfaces/contract/update-global-unit-value.md deleted file mode 100644 index b2dbab08..00000000 --- a/docs/interfaces/contract/update-global-unit-value.md +++ /dev/null @@ -1,48 +0,0 @@ -# Update Global Unit Value - -```json -{ - "name": "update_global_unit_value", - "desc": "Update D-ASA nominal unit value globally", - "readonly": false, - "args": [ - { - "type": "uint64", - "name": "unit_value", - "desc": "D-ASA nominal unit value, expressed in denomination asset" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the update" - }, - "errors": [ - { - "code": "UNAUTHORIZED", - "message": "Not authorized" - }, - { - "code": "DEFAULTED", - "message": "Defaulted" - }, - { - "code": "SUSPENDED", - "message": "Asset operations are suspended" - }, - { - "code": "PENDING_COUPON_PAYMENT", - "message": "Pending due coupon payment" - } - ] -} -``` - -The call **MUST** fail with the `UNAUTHORIZED` error code if not called by an authorized -caller. - -The call **MUST** fail with the `DEFAULTED` error code if the asset is defaulted. - -The call **MAY** fail with the `SUSPENDED` error code if the asset is suspended. - -The call **MUST** fail with the `PENDING_COUPON_PAYMENT` error code if there is -any due coupon still to be paid. diff --git a/docs/interfaces/contract/update-interest-rate.md b/docs/interfaces/contract/update-interest-rate.md deleted file mode 100644 index 95bdf90b..00000000 --- a/docs/interfaces/contract/update-interest-rate.md +++ /dev/null @@ -1,48 +0,0 @@ -# Update Interest Rate - -```json -{ - "name": "update_interest_rate", - "desc": "Update variable interest rates in bps", - "readonly": false, - "args": [ - { - "type": "uint16", - "name": "interest_rate", - "desc": "Interest rate in bps" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the update" - }, - "errors": [ - { - "code": "UNAUTHORIZED", - "message": "Not authorized" - }, - { - "code": "DEFAULTED", - "message": "Defaulted" - }, - { - "code": "SUSPENDED", - "message": "Asset operations are suspended" - }, - { - "code": "PENDING_COUPON_PAYMENT", - "message": "Pending due coupon payment" - } - ] -} -``` - -The call **MUST** fail with the `UNAUTHORIZED` error code if not called by an authorized -caller. - -The call **MUST** fail with the `DEFAULTED` error code if the asset is defaulted. - -The call **MAY** fail with the `SUSPENDED` error code if the asset is suspended. - -The call **MUST** fail with the `PENDING_COUPON_PAYMENT` error code if there is -any due coupon still to be paid. diff --git a/docs/interfaces/contract/update-time-events.md b/docs/interfaces/contract/update-time-events.md deleted file mode 100644 index 940fc1c6..00000000 --- a/docs/interfaces/contract/update-time-events.md +++ /dev/null @@ -1,76 +0,0 @@ -# Update Time Events - -```json -{ - "name": "update_time_events", - "desc": "Update D-ASA variable time schedule", - "readonly": false, - "args": [ - { - "type": "uint64[]", - "name": "time_events", - "desc": "D-ASA time events (strictly ascending order)" - } - ], - "returns": { - "type": "(uint64, uint64, uint64, uint64, uint64)", - "desc": "Primary distribution opening date, Primary distribution closure date, Issuance date, Maturity date, Timestamp of the update" - }, - "errors": [ - { - "code": "UNAUTHORIZED", - "message": "Not authorized" - }, - { - "code": "DEFAULTED", - "message": "Defaulted" - }, - { - "code": "SUSPENDED", - "message": "Suspended operations" - }, - { - "code": "INVALID_TIME_EVENTS_LENGTH", - "message": "Time events length is invalid" - }, - { - "code": "INVALID_TIME", - "message": "Time events must be set in the future" - }, - { - "code": "INVALID_SORTING", - "message": "Time events are not sorted correctly" - }, - { - "code": "INVALID_PAST_EVENT", - "message": "Past time events can not be modified" - }, - { - "code": "PENDING_COUPON_PAYMENT", - "message": "Pending due coupon payment" - } - ] -} -``` - -The call **MUST** fail with the `UNAUTHORIZED` error code if not called by an authorized -caller. - -The call **MUST** fail with the `DEFAULTED` error code if the asset is defaulted. - -The call **MAY** fail with the `SUSPENDED` error code if the asset is suspended. - -The call **MUST** fail with the `INVALID_TIME_EVENTS_LENGTH` error code if the length -of the *time events* is not equal to *total\_coupons* plus `4`. - -The call **MUST** fail with the `INVALID_TIME` error code if the first *time event* -is earlier than the latest timestamp (or block height). - -The call **MUST** fail with the `INVALID_SORTING` error code if the *time events* -are not sorted in strictly ascending order. - -The call **MUST** fail with the `INVALID_PAST_EVENT` error code if a past event -is modified. - -The call **MUST** fail with the `PENDING_COUPON_PAYMENT` error code if there is -any due coupon still to be paid. diff --git a/docs/interfaces/contract/update-time-periods.md b/docs/interfaces/contract/update-time-periods.md deleted file mode 100644 index b0cb2160..00000000 --- a/docs/interfaces/contract/update-time-periods.md +++ /dev/null @@ -1,56 +0,0 @@ -# Update Time Periods - -```json -{ - "name": "update_time_periods", - "desc": "Update D-ASA variable time periods", - "readonly": false, - "args": [ - { - "type": "(uint64,uint64)[]", - "name": "time_periods", - "desc": "D-ASA time periods" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the update" - }, - "errors": [ - { - "code": "UNAUTHORIZED", - "message": "Not authorized" - }, - { - "code": "DEFAULTED", - "message": "Defaulted" - }, - { - "code": "SUSPENDED", - "message": "Suspended operations" - }, - { - "code": "INVALID_TIME_PERIOD", - "message": "Time period durations must be greater than zero" - }, - { - "code": "PENDING_COUPON_PAYMENT", - "message": "Pending due coupon payment" - } - ] -} - -``` - -The call **MUST** fail with the `UNAUTHORIZED` error code if not called by an authorized -caller. - -The call **MUST** fail with the `DEFAULTED` error code if the asset is defaulted. - -The call **MAY** fail with the `SUSPENDED` error code if the asset is suspended. - -The call **MUST** fail with the `INVALID_TIME_PERIOD` error code if the *time period -durations* are not strictly greater than zero. - -The call **MUST** fail with the `PENDING_COUPON_PAYMENT` error code if there is -any due coupon still to be paid. diff --git a/docs/interfaces/contract/update-total-units.md b/docs/interfaces/contract/update-total-units.md deleted file mode 100644 index 693b0e7a..00000000 --- a/docs/interfaces/contract/update-total-units.md +++ /dev/null @@ -1,48 +0,0 @@ -# Update Total Units - -```json -{ - "name": "update_total_units", - "desc": "Update D-ASA total_units", - "readonly": false, - "args": [ - { - "type": "uint64", - "name": "total_units", - "desc": "D-ASA total units" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the update" - }, - "errors": [ - { - "code": "UNAUTHORIZED", - "message": "Not authorized" - }, - { - "code": "DEFAULTED", - "message": "Defaulted" - }, - { - "code": "SUSPENDED", - "message": "Asset operations are suspended" - }, - { - "code": "PENDING_COUPON_PAYMENT", - "message": "Pending due coupon payment" - } - ] -} -``` - -The call **MUST** fail with the `UNAUTHORIZED` error code if not called by an authorized -caller. - -The call **MUST** fail with the `DEFAULTED` error code if the asset is defaulted. - -The call **MAY** fail with the `SUSPENDED` error code if the asset is suspended. - -The call **MUST** fail with the `PENDING_COUPON_PAYMENT` error code if there is -any due coupon still to be paid. diff --git a/docs/interfaces/overview.md b/docs/interfaces/overview.md new file mode 100644 index 00000000..d93dc810 --- /dev/null +++ b/docs/interfaces/overview.md @@ -0,0 +1,4 @@ +# Interfaces + +The interface section documents the public ARC-4 ABI grouped by architecture layer, +plus the ABI structs used by those methods. diff --git a/docs/interfaces/payment-agent/early-repayment.md b/docs/interfaces/payment-agent/early-repayment.md deleted file mode 100644 index 2ac8e350..00000000 --- a/docs/interfaces/payment-agent/early-repayment.md +++ /dev/null @@ -1,100 +0,0 @@ -# Early Repayment - -```json -{ - "name": "early_repayment", - "desc": "Pay the principal to an account before maturity", - "readonly": false, - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - }, - { - "type": "uint64", - "name": "units", - "desc": "Amount of D-ASA units to repay" - }, - { - "type": "byte[]", - "name": "payment_info", - "desc": "Additional payment information (Optional)" - } - ], - "returns": { - "type": "(uint64, uint64, byte[])", - "desc": "Paid principal amount in denomination asset, Payment timestamp, Payment information" - }, - "errors": [ - { - "code": "UNAUTHORIZED", - "message": "Not authorized" - }, - { - "code": "DEFAULTED", - "message": "Defaulted" - }, - { - "code": "SUSPENDED", - "message": "Suspended operations" - }, - { - "code": "INVALID_HOLDING_ADDRESS", - "message": "Invalid account holding address" - }, - { - "code": "NO_UNITS", - "message": "No D-ASA units" - }, - { - "code": "PENDING_COUPON_PAYMENT", - "message": "Pending due coupon payment for the account" - }, - { - "code": "ZERO_UNITS", - "message": "Can not repay zero units" - }, - { - "code": "OVER_REPAYMENT", - "message": "Insufficient units to repay for the account" - }, - { - "code": "ALREADY_MATURE", - "message": "Already mature" - } - ] -} -``` - -The call **MUST** remove D-ASA early rapid units from the Account Holding Address -and from circulation. - -The call **MUST** fail with the `UNAUTHORIZED` error code if not called by an authorized -caller. - -The call **MUST** fail with the `DEFAULTED` error code if the asset is defaulted. - -The call **MUST** fail with the `SUSPENDED` error code if the asset operations or -any account involved in the transfers are suspended. - -The call **MUST** fail with the `INVALID_HOLDING_ADDRESS` error code if the Sender -or Receiver Holding Address is invalid. - -The call **MUST** fail with the `NO_UNITS` error code if the Account has no D-ASA -units. - -The call **MUST** fail with the `PENDING_COUPON_PAYMENT` error code if there is -a due coupon still to be paid for the Account. - -The call **MUST** fail with the `ZERO_UNITS` error code if the distributing units -are null. - -The call **MUST** fail with the `OVER_REPAYMENT` error code if there are no sufficient -remaining D-ASA units to repay. - -The call **MUST** fail with the `ALREADY_MATURE` error code if the principal is -mature. - -If the D-ASA has on-chain payment agent, the call **MUST** fail with the `NOT_ENOUGH_FUNDS` -error code if funds are not enough for the payment. diff --git a/docs/interfaces/payment-agent/overview.md b/docs/interfaces/payment-agent/overview.md new file mode 100644 index 00000000..fb910485 --- /dev/null +++ b/docs/interfaces/payment-agent/overview.md @@ -0,0 +1,54 @@ +# Payment Agent Interface + +The Payment Agent interface funds due ACTUS cash events and allows holder claims. + +## `fund_due_cashflows` + +```json +{ + "name": "fund_due_cashflows", + "readonly": false, + "args": [ + { "name": "max_event_count", "type": "uint64" } + ], + "returns": { "type": "CashFundingResult", "desc": "Funding result for the processed events" }, + "errors": [ + "NOT_CONFIGURED", + "UNAUTHORIZED", + "DEFAULTED", + "SUSPENDED", + "PENDING_IED", + "NO_DUE_CASHFLOW", + "NOT_ENOUGH_FUNDS" + ] +} +``` + +Only the Arranger may call this method. + +## `claim_due_cashflows` + +```json +{ + "name": "claim_due_cashflows", + "readonly": false, + "args": [ + { "name": "holding_address", "type": "address" }, + { "name": "payment_info", "type": "byte[]" } + ], + "returns": { "type": "CashClaimResult", "desc": "Holder claim result" }, + "errors": [ + "NOT_CONFIGURED", + "INVALID_HOLDING_ADDRESS", + "UNAUTHORIZED", + "DEFAULTED", + "SUSPENDED", + "PENDING_IED", + "NO_DUE_CASHFLOW", + "NOT_ENOUGH_FUNDS" + ] +} +``` + +If the holder's payment path is not executable, the method reports the claimable +amounts without clearing them. diff --git a/docs/interfaces/payment-agent/pay-coupon.md b/docs/interfaces/payment-agent/pay-coupon.md deleted file mode 100644 index 3ddcb893..00000000 --- a/docs/interfaces/payment-agent/pay-coupon.md +++ /dev/null @@ -1,92 +0,0 @@ -# Pay Coupon - -```json -{ - "name": "pay_coupon", - "desc": "Pay due coupon to an account", - "readonly": false, - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - }, - { - "type": "byte[]", - "name": "payment_info", - "desc": "Additional payment information (Optional)" - } - ], - "events": [ - { - "type_name": "IP" - } - ], - "returns": { - "type": "(uint64, uint64, byte[])", - "desc": "Paid coupon amount in denomination asset, Payment timestamp, Payment context" - }, - "errors": [ - { - "code": "UNAUTHORIZED", - "message": "Not authorized" - }, - { - "code": "DEFAULTED", - "message": "Defaulted" - }, - { - "code": "SUSPENDED", - "message": "Suspended operations" - }, - { - "code": "INVALID_HOLDING_ADDRESS", - "message": "Invalid account holding address" - }, - { - "code": "NO_UNITS", - "message": "No D-ASA units" - }, - { - "code": "NO_DUE_COUPON", - "message": "No due coupon to pay" - }, - { - "code": "PENDING_COUPON_PAYMENT", - "message": "Pending due coupon payment" - }, - { - "code": "NOT_ENOUGH_FUNDS", - "message": "Not enough funds for the payment" - } - ] -} -``` - -> A reference implementation **SHOULD NOT** require an authorized caller. - -If the D-ASA has an amortizing principal payment schedule, the call **MUST** update -the Account's *unit value*. - -If the call requires authorization, it **MUST** fail with the `UNAUTHORIZED` error -code if not called by an authorized caller. - -The call **MUST** fail with the `DEFAULTED` error code if the asset is defaulted. - -The call **MUST** fail with the `SUSPENDED` error code if the asset operations are -suspended. - -The call **MUST** fail with the `INVALID_HOLDING_ADDRESS` error code if the Account -does not exist. - -The call **MUST** fail with the `NO_UNITS` error code if the Account has no D-ASA -units. - -The call **MUST** fail with the `NO_DUE_COUPON` error code if there is no due -coupon left to pay for the Account. - -The call **MUST** fail with the `PENDING_COUPON_PAYMENT` error code if there is -an old due coupon still to be paid to any account. - -If the D-ASA has on-chain payment agent, the call **MUST** fail with the `NOT_ENOUGH_FUNDS` -error code if funds are not enough for the payment. diff --git a/docs/interfaces/payment-agent/pay-principal.md b/docs/interfaces/payment-agent/pay-principal.md deleted file mode 100644 index d9c04e52..00000000 --- a/docs/interfaces/payment-agent/pay-principal.md +++ /dev/null @@ -1,88 +0,0 @@ -# Pay Principal - -```json -{ - "name": "pay_principal", - "desc": "Pay the outstanding principal to an account", - "readonly": false, - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - }, - { - "type": "byte[]", - "name": "payment_info", - "desc": "Additional payment information (Optional)" - } - ], - "events": [ - { - "type_name": "PR" - } - ], - "returns": { - "type": "(uint64, uint64, byte[])", - "desc": "Paid principal amount in denomination asset, Payment timestamp, Payment context" - }, - "errors": [ - { - "code": "UNAUTHORIZED", - "message": "Not authorized" - }, - { - "code": "DEFAULTED", - "message": "Defaulted" - }, - { - "code": "SUSPENDED", - "message": "Suspended operations" - }, - { - "code": "INVALID_HOLDING_ADDRESS", - "message": "Invalid account holding address" - }, - { - "code": "NO_UNITS", - "message": "No D-ASA units" - }, - { - "code": "NOT_MATURE", - "message": "Not mature" - }, - { - "code": "PENDING_COUPON_PAYMENT", - "message": "Pending due coupon payment" - } - ] -} -``` - -> A reference implementation **SHOULD NOT** require an authorized caller. - -The call **MUST** remove D-ASA units from the Account Holding Address and from -circulation. - -If the call requires authorization, it **MUST** fail with the `UNAUTHORIZED` error -code if not called by an authorized caller. - -The call **MUST** fail with the `DEFAULTED` error code if the asset is defaulted. - -The call **MUST** fail with the `SUSPENDED` error code if the asset operations are -suspended. - -The call **MUST** fail with the `INVALID_HOLDING_ADDRESS` error code if the Account -does not exist. - -The call **MUST** fail with the `NO_UNITS` error code if the Account has no D-ASA -units. - -The call **MUST** fail with the `NOT_MATURE` error code if the principal is not -mature. - -The call **MUST** fail with the `PENDING_COUPON_PAYMENT` error code if there is -any due coupon still to be paid. - -If the D-ASA has on-chain payment agent, the call **MUST** fail with the `NOT_ENOUGH_FUNDS` -error code if funds are not enough for the payment. diff --git a/docs/interfaces/rbac/assign-role.md b/docs/interfaces/rbac/assign-role.md deleted file mode 100644 index 646d508e..00000000 --- a/docs/interfaces/rbac/assign-role.md +++ /dev/null @@ -1,59 +0,0 @@ -# RBAC Assign Role - -```json -{ - "name": "rbac_assign_role", - "desc": "Assign a role to an address", - "readonly": false, - "args": [ - { - "type": "uint8", - "name": "role_id", - "desc": "Role Identifier" - }, - { - "type": "address", - "name": "role_address", - "desc": "Account Role Address" - }, - { - "type": "byte[]", - "name": "config", - "desc": "Role configuration (Optional)" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the role assignment" - }, - "errors": [ - { - "code": "UNAUTHORIZED", - "message": "Not authorized" - }, - { - "code": "DEFAULTED", - "message": "Defaulted" - }, - { - "code": "INVALID_ROLE", - "message": "Invalid role identifier" - }, - { - "code": "INVALID_ROLE_ADDRESS", - "message": "Invalid account role address" - } - ] -} -``` - -The call **MUST** fail with the `UNAUTHORIZED` error code if not called by an -authorized. - -The call **MUST** fail with the `DEFAULTED` error code if the asset is defaulted. - -The call **MUST** fail with the `INVALID_ROLE` error code if the *role identifier* -is invalid. - -The call **MUST** fail with the `INVALID_ROLE_ADDRESS` error code if the *role -address* has been already assigned to the *role*. diff --git a/docs/interfaces/rbac/get-arranger.md b/docs/interfaces/rbac/get-arranger.md deleted file mode 100644 index 8d49bff0..00000000 --- a/docs/interfaces/rbac/get-arranger.md +++ /dev/null @@ -1,15 +0,0 @@ -# RBAC Get Arranger - -```json -{ - "name": "rbac_get_arranger", - "desc": "Get Arranger address", - "readonly": true, - "args": [], - "returns": { - "type": "address", - "desc": "Arranger address" - }, - "errors": [] -} -``` diff --git a/docs/interfaces/rbac/get-role-config.md b/docs/interfaces/rbac/get-role-config.md deleted file mode 100644 index 0ceeef6d..00000000 --- a/docs/interfaces/rbac/get-role-config.md +++ /dev/null @@ -1,35 +0,0 @@ -# RBAC Get Role Config - -```json -{ - "name": "rbac_get_role_config", - "desc": "Get role configuration", - "readonly": true, - "args": [ - { - "type": "uint8", - "name": "role_id", - "desc": "Role Identifier" - }, - { - "type": "address", - "name": "role_address", - "desc": "Account Role Address" - } - ], - "returns": { - "type": "byte[]", - "desc": "Role configuration" - }, - "errors": [ - { - "code": "INVALID_ROLE", - "message": "Invalid role identifier" - }, - { - "code": "INVALID_ROLE_ADDRESS", - "message": "Invalid account role address" - } - ] -} -``` diff --git a/docs/interfaces/rbac/get-roles.md b/docs/interfaces/rbac/get-roles.md deleted file mode 100644 index f4f55273..00000000 --- a/docs/interfaces/rbac/get-roles.md +++ /dev/null @@ -1,14 +0,0 @@ -# RBAC Get Roles - -```json -{ - "name": "rbac_get_roles", - "desc": "Get role identifiers", - "readonly": true, - "args": [], - "returns": { - "type": "uint8[]", - "desc": "Role identifiers" - } -} -``` diff --git a/docs/interfaces/rbac/gov-asset-suspension.md b/docs/interfaces/rbac/gov-asset-suspension.md deleted file mode 100644 index 4abbaa57..00000000 --- a/docs/interfaces/rbac/gov-asset-suspension.md +++ /dev/null @@ -1,29 +0,0 @@ -# RBAC Governance Asset Suspension - -```json -{ - "name": "rbac_gov_asset_suspension", - "desc": "Set asset suspension status", - "readonly": false, - "args": [ - { - "type": "bool", - "name": "suspended", - "desc": "Suspension status" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the set asset suspension status" - }, - "errors": [ - { - "code": "UNAUTHORIZED", - "message": "Not authorized" - } - ] -} -``` - -The call **MUST** fail with the `UNAUTHORIZED` error code if not called by an authorized -caller. diff --git a/docs/interfaces/rbac/overview.md b/docs/interfaces/rbac/overview.md new file mode 100644 index 00000000..26406aa3 --- /dev/null +++ b/docs/interfaces/rbac/overview.md @@ -0,0 +1,138 @@ +# RBAC Interface + +The RBAC interface manages privileged roles, suspension state, and application control. + +Only the Arranger may call RBAC methods. + +## `contract_update` + +```json +{ + "name": "contract_update", + "readonly": false, + "args": [], + "returns": { "type": "void" }, + "errors": ["UNAUTHORIZED"] +} +``` + +## `rbac_rotate_arranger` + +```json +{ + "name": "rbac_rotate_arranger", + "readonly": false, + "args": [ + { "name": "new_arranger", "type": "address" } + ], + "returns": { "type": "uint64", "desc": "UNIX timestamp of the rotation" }, + "errors": ["UNAUTHORIZED"] +} +``` + +## `rbac_set_op_daemon` + +```json +{ + "name": "rbac_set_op_daemon", + "readonly": false, + "args": [ + { "name": "address", "type": "address" } + ], + "returns": { "type": "uint64", "desc": "UNIX timestamp of the assignment" }, + "errors": ["UNAUTHORIZED"] +} +``` + +This is a non-normative helper for payment automation. + +## `rbac_assign_role` + +```json +{ + "name": "rbac_assign_role", + "readonly": false, + "args": [ + { "name": "role_id", "type": "uint8" }, + { "name": "role_address", "type": "address" }, + { "name": "validity", "type": "RoleValidity" } + ], + "returns": { "type": "uint64", "desc": "UNIX timestamp of the assignment" }, + "errors": ["UNAUTHORIZED", "DEFAULTED", "INVALID_ROLE", "INVALID_ROLE_ADDRESS"] +} +``` + +## `rbac_revoke_role` + +```json +{ + "name": "rbac_revoke_role", + "readonly": false, + "args": [ + { "name": "role_id", "type": "uint8" }, + { "name": "role_address", "type": "address" } + ], + "returns": { "type": "uint64", "desc": "UNIX timestamp of the revocation" }, + "errors": ["UNAUTHORIZED", "DEFAULTED", "INVALID_ROLE", "INVALID_ROLE_ADDRESS"] +} +``` + +## `rbac_contract_suspension` + +```json +{ + "name": "rbac_contract_suspension", + "readonly": false, + "args": [ + { "name": "suspended", "type": "bool" } + ], + "returns": { "type": "uint64", "desc": "UNIX timestamp of the suspension update" }, + "errors": ["UNAUTHORIZED"] +} +``` + +Only an active Authority may call this method. + +## `rbac_get_arranger` + +```json +{ + "name": "rbac_get_arranger", + "readonly": true, + "args": [], + "returns": { "type": "address", "desc": "Current arranger address" }, + "errors": [] +} +``` + +## `rbac_get_address_roles` + +```json +{ + "name": "rbac_get_address_roles", + "readonly": true, + "args": [ + { "name": "address", "type": "address" } + ], + "returns": { + "type": "(bool,bool,bool,bool,bool)", + "desc": "Account manager, primary dealer, trustee, authority, observer" + }, + "errors": [] +} +``` + +## `rbac_get_role_validity` + +```json +{ + "name": "rbac_get_role_validity", + "readonly": true, + "args": [ + { "name": "role_id", "type": "uint8" }, + { "name": "role_address", "type": "address" } + ], + "returns": { "type": "RoleValidity", "desc": "Stored validity interval" }, + "errors": ["INVALID_ROLE", "INVALID_ROLE_ADDRESS"] +} +``` diff --git a/docs/interfaces/rbac/revoke-role.md b/docs/interfaces/rbac/revoke-role.md deleted file mode 100644 index db5cd107..00000000 --- a/docs/interfaces/rbac/revoke-role.md +++ /dev/null @@ -1,54 +0,0 @@ -# RBAC Revoke Role - -```json -{ - "name": "rbac_revoke_role", - "desc": "Revoke a role from an address", - "readonly": false, - "args": [ - { - "type": "uint8", - "name": "role_id", - "desc": "Role Identifier" - }, - { - "type": "address", - "name": "role_address", - "desc": "Account Role Address" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the role revocation" - }, - "errors": [ - { - "code": "UNAUTHORIZED", - "message": "Not authorized" - }, - { - "code": "DEFAULTED", - "message": "Defaulted" - }, - { - "code": "INVALID_ROLE", - "message": "Invalid role identifier" - }, - { - "code": "INVALID_ROLE_ADDRESS", - "message": "Invalid account role address" - } - ] -} -``` - -The call **MUST** fail with the `UNAUTHORIZED` error code if not called by an authorized -caller or if the operation is not authorized. - -The call **MUST** fail with the `DEFAULTED` error code if the asset is defaulted. - -The call **MUST** fail with the `INVALID_ROLE` error code if the *role identifier* -is invalid. - -The call **MUST** fail with the `INVALID_ROLE_ADDRESS` error code if the Account -Role Address is invalid. diff --git a/docs/interfaces/rbac/rotate-arranger.md b/docs/interfaces/rbac/rotate-arranger.md deleted file mode 100644 index 82d5e44a..00000000 --- a/docs/interfaces/rbac/rotate-arranger.md +++ /dev/null @@ -1,28 +0,0 @@ -# RBAC Rotate Arranger - -```json -{ - "name": "rbac_rotate_arranger", - "desc": "Rotate Arranger role to a new address", - "readonly": false, - "args": [ - { - "type": "address", - "name": "new_arranger", - "desc": "New Arranger address" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the role assignment" - }, - "errors": [ - { - "code": "UNAUTHORIZED", - "message": "Not authorized" - } - ] -} -``` - -The call **MUST** fail with the `UNAUTHORIZED` error code if not called by the Arranger. diff --git a/docs/interfaces/transfer-agent/asset-transfer.md b/docs/interfaces/transfer-agent/asset-transfer.md deleted file mode 100644 index 878c0ed1..00000000 --- a/docs/interfaces/transfer-agent/asset-transfer.md +++ /dev/null @@ -1,105 +0,0 @@ -# Asset Transfer - -```json -{ - "name": "asset_transfer", - "desc": "Transfer D-ASA units between accounts", - "readonly": false, - "args": [ - { - "type": "address", - "name": "sender_holding_address", - "desc": "Sender Account Holding Address" - }, - { - "type": "address", - "name": "receiver_holding_address", - "desc": "Receiver Account Holding Address" - }, - { - "type": "uint64", - "name": "units", - "desc": "Amount of D-ASA units to transfer" - } - ], - "returns": { - "type": "uint64", - "desc": "Transferred actualized value in denomination asset" - }, - "errors": [ - { - "code": "UNAUTHORIZED", - "message": "Not authorized" - }, - { - "code": "DEFAULTED", - "message": "Defaulted" - }, - { - "code": "SUSPENDED", - "message": "Suspended operations" - }, - { - "code": "INVALID_HOLDING_ADDRESS", - "message": "Invalid account holding address" - }, - { - "code": "SECONDARY_MARKET_CLOSED", - "message": "Secondary market is closed" - }, - { - "code": "SELF_TRANSFER", - "message": "Sender and receiver must be different" - }, - { - "code": "NULL_TRANSFER", - "message": "Transfer units must be greater than zero" - }, - { - "code": "OVER_TRANSFER", - "message": "Insufficient sender units to transfer" - }, - { - "code": "NON_FUNGIBLE_UNITS", - "message": "Sender and receiver units are not fungible" - }, - { - "code": "PENDING_COUPON_PAYMENT", - "message": "Pending due coupon payment" - } - ] -} -``` - -The call **MUST** transfer D-ASA units from the Sender Account Holding Address (removing -D-ASA units) to the Receiver Account Holding Address (adding D-ASA units). - -The call **MUST** fail with the `UNAUTHORIZED` error code if not called by an authorized -caller. - -The call **MUST** fail with the `DEFAULTED` error code if the asset is defaulted. - -The call **MUST** fail with the `SUSPENDED` error code if the asset operations or -any account involved in the transfers are suspended. - -The call **MUST** fail with the `INVALID_HOLDING_ADDRESS` error code if the Sender -or Receiver Holding Address is invalid. - -The call **MUST** fail with the `SECONDARY_MARKET_CLOSED` error code if the secondary -market is closed. - -The call **MUST** fail with the `SELF_TRANSFER` error code if the Sender and Receiver -Holding Addresses are the same. - -The call **MUST** fail with the `NULL_TRANSFER` error code if the transfer units -are zero. - -The call **MUST** fail with the `OVER_TRANSFER` error code if the Sender Account -Holding Address has insufficient D-ASA units to transfer. - -The call **MUST** fail with the `NON_FUNGIBLE_UNITS` error code if the Sender and -Receiver units are not fungible (e.g. different paid coupons, see D-ASA units fungibility -section). - -The call **MUST** fail with the `PENDING_COUPON_PAYMENT` error code if there is -a due coupon still to be paid to the Sender Holding Address. diff --git a/docs/interfaces/transfer-agent/overview.md b/docs/interfaces/transfer-agent/overview.md new file mode 100644 index 00000000..65eeaa06 --- /dev/null +++ b/docs/interfaces/transfer-agent/overview.md @@ -0,0 +1,75 @@ +# Transfer Agent Interface + +The Transfer Agent interface manages transfer windows, primary allocations, and +secondary transfers. + +## `transfer_set_schedule` + +```json +{ + "name": "transfer_set_schedule", + "readonly": false, + "args": [ + { "name": "open_date", "type": "uint64" }, + { "name": "closure_date", "type": "uint64" } + ], + "returns": { "type": "uint64", "desc": "UNIX timestamp of the schedule update" }, + "errors": ["UNAUTHORIZED", "INVALID_SORTING"] +} +``` + +Only the Arranger may call this method. + +## `primary_distribution` + +```json +{ + "name": "primary_distribution", + "readonly": false, + "args": [ + { "name": "holding_address", "type": "address" }, + { "name": "units", "type": "uint64" } + ], + "returns": { "type": "uint64", "desc": "Remaining undistributed unit balance" }, + "errors": [ + "NOT_CONFIGURED", + "UNAUTHORIZED", + "DEFAULTED", + "SUSPENDED", + "PRIMARY_DISTRIBUTION_CLOSED", + "INVALID_HOLDING_ADDRESS", + "ZERO_UNITS", + "OVER_DISTRIBUTION" + ] +} +``` + +## `transfer` + +```json +{ + "name": "transfer", + "readonly": false, + "args": [ + { "name": "sender_holding_address", "type": "address" }, + { "name": "receiver_holding_address", "type": "address" }, + { "name": "units", "type": "uint64" } + ], + "returns": { "type": "uint64", "desc": "Number of units transferred" }, + "errors": [ + "NOT_CONFIGURED", + "DEFAULTED", + "SUSPENDED", + "PENDING_IED", + "CLOSED_TRANSFER", + "UNAUTHORIZED", + "INVALID_HOLDING_ADDRESS", + "SELF_TRANSFER", + "NULL_TRANSFER", + "OVER_TRANSFER", + "PENDING_ACTUS_EVENT" + ] +} +``` + +The current implementation requires the sender holding address to submit the transaction. diff --git a/docs/interfaces/types.md b/docs/interfaces/types.md new file mode 100644 index 00000000..226d438f --- /dev/null +++ b/docs/interfaces/types.md @@ -0,0 +1,189 @@ +# ABI Types + +This section documents the canonical ARC-4 structs exposed by the D-ASA ABI. + +The types below refer to the on-chain ABI structs in `smart_contracts/abi_types.py`, +not to the richer SDK-side normalization models in `src/models.py`. + +## `RoleValidity` + +Time-bounded role assignment. + +| Field | Type | Meaning | +|:----------------------|:---------|:-------------------------------| +| `role_validity_start` | `uint64` | Inclusive activation timestamp | +| `role_validity_end` | `uint64` | Inclusive expiration timestamp | + +## `Prospectus` + +Informational contract metadata uploaded with `contract_config`. + +| Field | Type | Meaning | +|:-------|:-----------|:-----------------------------| +| `hash` | `byte[32]` | Prospectus digest | +| `url` | `string` | Prospectus location or label | + +## `NormalizedActusTerms` + +Normalized ACTUS terms required by the AVM kernel. + +| Field | Type | Meaning | +|:-------------------------------|:---------|:---------------------------------------------| +| `contract_type` | `uint8` | ACTUS contract family id | +| `denomination_asset_id` | `uint64` | Denomination asset id | +| `settlement_asset_id` | `uint64` | Settlement asset id | +| `total_units` | `uint64` | Total unit supply | +| `notional_principal` | `uint64` | Notional principal in base units | +| `initial_exchange_amount` | `uint64` | Initial exchange amount in base units | +| `initial_exchange_date` | `uint64` | `IED` timestamp | +| `maturity_date` | `uint64` | `MD` timestamp, or `0` if absent | +| `day_count_convention` | `uint8` | Supported day-count identifier | +| `rate_reset_spread` | `uint64` | Fixed-point spread | +| `rate_reset_multiplier` | `uint64` | Fixed-point rate multiplier | +| `rate_reset_floor` | `uint64` | Fixed-point floor | +| `rate_reset_cap` | `uint64` | Fixed-point cap | +| `rate_reset_next` | `uint64` | Prefixed next rate value | +| `has_rate_reset_floor` | `bool` | Floor flag | +| `has_rate_reset_cap` | `bool` | Cap flag | +| `dynamic_principal_redemption` | `bool` | Dynamic annuity redemption flag | +| `fixed_point_scale` | `uint64` | Fixed-point scale, currently `1_000_000_000` | + +SDK-only metadata such as `notional_unit_value` and secondary-market dates is not +part of this ABI struct. + +## `InitialKernelState` + +Pre-`IED` state snapshot uploaded with `contract_config`. + +| Field | Type | Meaning | +|:-----------------------------|:---------|:-------------------------------------------| +| `status_date` | `uint64` | Reference timestamp for the uploaded state | +| `event_cursor` | `uint64` | Starting global event cursor | +| `outstanding_principal` | `uint64` | Outstanding principal in base units | +| `interest_calculation_base` | `uint64` | Interest base in base units | +| `nominal_interest_rate` | `uint64` | Current fixed-point nominal rate | +| `accrued_interest` | `uint64` | Accrued interest in base units | +| `next_principal_redemption` | `uint64` | Next redemption target | +| `cumulative_interest_index` | `uint64` | Per-unit fixed-point interest index | +| `cumulative_principal_index` | `uint64` | Per-unit fixed-point principal index | + +## `ExecutionScheduleEntry` + +One normalized ACTUS schedule entry. + +| Field | Type | Meaning | +|:-----------------------------|:---------|:-----------------------------------| +| `event_id` | `uint64` | Global contiguous event identifier | +| `event_type` | `uint8` | ACTUS event id | +| `scheduled_time` | `uint64` | Due timestamp | +| `accrual_factor` | `uint64` | Fixed-point accrual factor | +| `redemption_accrual_factor` | `uint64` | Fixed-point redemption factor | +| `next_nominal_interest_rate` | `uint64` | Fixed-point next rate | +| `next_principal_redemption` | `uint64` | Next redemption state value | +| `next_outstanding_principal` | `uint64` | Next outstanding principal | +| `flags` | `uint64` | Entry flags | + +## `ExecutionSchedulePage` + +Alias for: + +```text +ExecutionScheduleEntry[] +``` + +The current kernel accepts at most `16` entries per page. + +## `ObservedEventRequest` + +Observed non-cash event payload used by `apply_non_cash_event`. + +| Field | Type | Meaning | +|:-----------------------------|:---------|:---------------------------------| +| `event_id` | `uint64` | Expected event id when appending | +| `event_type` | `uint8` | ACTUS event id | +| `scheduled_time` | `uint64` | Event timestamp | +| `accrual_factor` | `uint64` | Fixed-point accrual factor | +| `redemption_accrual_factor` | `uint64` | Fixed-point redemption factor | +| `observed_rate` | `uint64` | Observed fixed-point rate input | +| `next_nominal_interest_rate` | `uint64` | Fixed-point next rate | +| `next_principal_redemption` | `uint64` | Next redemption state value | +| `next_outstanding_principal` | `uint64` | Next outstanding principal | +| `flags` | `uint64` | Observed-event flags | + +## `ObservedCashEventRequest` + +Observed cash event payload used by `append_observed_cash_event`. + +| Field | Type | Meaning | +|:-----------------------------|:---------|:---------------------------------| +| `event_id` | `uint64` | Expected event id when appending | +| `event_type` | `uint8` | ACTUS cash event id | +| `scheduled_time` | `uint64` | Event timestamp | +| `accrual_factor` | `uint64` | Fixed-point accrual factor | +| `redemption_accrual_factor` | `uint64` | Fixed-point redemption factor | +| `next_nominal_interest_rate` | `uint64` | Fixed-point next rate | +| `next_principal_redemption` | `uint64` | Next redemption state value | +| `next_outstanding_principal` | `uint64` | Next outstanding principal | +| `flags` | `uint64` | Observed cash-event flags | + +## `KernelState` + +Readonly snapshot returned by `contract_get_state`. + +| Field | Type | Meaning | +|:-----------------------------|:---------|:---------------------------------| +| `contract_type` | `uint8` | ACTUS contract family id | +| `status` | `uint64` | Kernel lifecycle status | +| `total_units` | `uint64` | Total unit supply | +| `reserved_units_total` | `uint64` | Units reserved pre-`IED` | +| `initial_exchange_amount` | `uint64` | Initial exchange amount | +| `event_cursor` | `uint64` | Current global event cursor | +| `schedule_entry_count` | `uint64` | Total uploaded schedule entries | +| `outstanding_principal` | `uint64` | Outstanding principal | +| `interest_calculation_base` | `uint64` | Current interest base | +| `nominal_interest_rate` | `uint64` | Current fixed-point nominal rate | +| `accrued_interest` | `uint64` | Current accrued interest | +| `cumulative_interest_index` | `uint64` | Global per-unit interest index | +| `cumulative_principal_index` | `uint64` | Global per-unit principal index | +| `reserved_interest` | `uint64` | Reserved interest balance | +| `reserved_principal` | `uint64` | Reserved principal balance | + +## `AccountPosition` + +Accounting position returned by `account_get_position`. + +| Field | Type | Meaning | +|:-----------------------|:----------|:-----------------------------------| +| `payment_address` | `address` | Cashflow destination | +| `units` | `uint64` | Active units | +| `reserved_units` | `uint64` | Pre-`IED` reserved units | +| `suspended` | `bool` | Account suspension flag | +| `settled_cursor` | `uint64` | Last settled global cursor | +| `interest_checkpoint` | `uint64` | Applied interest index checkpoint | +| `principal_checkpoint` | `uint64` | Applied principal index checkpoint | +| `claimable_interest` | `uint64` | Claimable interest amount | +| `claimable_principal` | `uint64` | Claimable principal amount | + +## `CashFundingResult` + +Result returned by `fund_due_cashflows`. + +| Field | Type | Meaning | +|:-------------------|:---------|:--------------------------------| +| `funded_interest` | `uint64` | Interest reserved in the call | +| `funded_principal` | `uint64` | Principal reserved in the call | +| `total_funded` | `uint64` | Total reserved amount | +| `processed_events` | `uint64` | Number of processed cash events | +| `timestamp` | `uint64` | Execution timestamp | + +## `CashClaimResult` + +Result returned by `claim_due_cashflows`. + +| Field | Type | Meaning | +|:-------------------|:---------|:----------------------------------| +| `interest_amount` | `uint64` | Interest realized or reported | +| `principal_amount` | `uint64` | Principal realized or reported | +| `total_amount` | `uint64` | Total realized or reported amount | +| `timestamp` | `uint64` | Execution timestamp | +| `context` | `byte[]` | Opaque caller-supplied context | diff --git a/docs/rationale.md b/docs/rationale.md deleted file mode 100644 index d304e344..00000000 --- a/docs/rationale.md +++ /dev/null @@ -1,17 +0,0 @@ -# Rationale {#rationale} - -This standard has been designed to support different types of debt instruments and -their payoffs, with cash-flows executed both on-chain and off-chain. - -The standard fosters modularity, with high degree of flexibility with respect to -the integration of external components (Applications), such as KYC, auctions, order-books, -off-chain transfer agents, etc. - -The specification makes sure that the trust model and RBAC of D-ASA implementations -can range from trustless versions (e.g., payments triggered automatically if the -conditions are met, default called automatically on payment failure) to trusted -ones (e.g., payments triggered only by authorized entities, default called manually -by a trustee). - -The implementation of the specified interfaces is left to the use-cases, which may -cherry-pick a subset of methods and getters based on their requirements. diff --git a/docs/specs/accounting/account.md b/docs/specs/accounting/account.md new file mode 100644 index 00000000..abcc0950 --- /dev/null +++ b/docs/specs/accounting/account.md @@ -0,0 +1,30 @@ +# Account (Investor) + +> Investors are lenders providing capital to borrowers with the expectation of a +> financial return, defined by debt instruments. + +Investors \\( [CPID] \\) own D-ASA accounts, characterized by a pair of Algorand +Addresses: + +- *Holding Address*: address that owns D-ASA units with the right to future payments; +- *Payment Address*: address that receives D-ASA payments. + +The Payment Address **MAY** be different from the Holding Address. + +The Account is uniquely identified by the account key of the form: + +`[A#||]` + +Where || denotes concatenation. + +> D-ASA units can be in custody with a third party or temporarily deposited on an +> order book (Holding Address). At the same time, payments are always executed +> towards the investor (on the Payment Address). + +## Seniority + +> Debt instruments may have an order of repayment in the event of a sale or default +> of the issuer, based on investors’ seniority. Investors with the same seniority +> are treated equally. + +D-ASA does not enforce investor *seniority* \\( [SEN] \\). diff --git a/docs/specs/accounting/overview.md b/docs/specs/accounting/overview.md new file mode 100644 index 00000000..ae720f2c --- /dev/null +++ b/docs/specs/accounting/overview.md @@ -0,0 +1,4 @@ +# Accounting + +The accounting section defines how the kernel's contract-wide cashflow state is +projected into holder positions, checkpoints, and claimable balances. diff --git a/docs/specs/accounting/units.md b/docs/specs/accounting/units.md index e1701efb..d3cc30e6 100644 --- a/docs/specs/accounting/units.md +++ b/docs/specs/accounting/units.md @@ -1,69 +1,61 @@ # D-ASA units {#d-asa-units} -> D-ASA units represent the ownership of the tokenized debt instrument. +D-ASA units represent pro-rata ownership of the normalized ACTUS contract. -## Supply {#supply} +## Total supply -The D-ASA **MUST** define its *total units* (`uint64`). +The kernel **MUST** store `total_units` as a `uint64`. -If the D-ASA has a *principal*, its initials *total units* **MUST** be equal to -the *principal* divided by the *minimum denomination.* +The off-chain normalization process **MUST** derive `total_units` exactly as: -{{#include ../../_include/styles.md:example}} -> Let’s have a D-ASA denominated in EUR, with a principal of 1M EUR and a minimum -> denomination of 1,000 EUR. The D-ASA has 1,000 initial total units. +```text +notional_principal / notional_unit_value +``` -The D-ASA *total units* **MAY** be updated with the **OPTIONAL** `update_total_units` -method. +The division **MUST** be exact. If the principal is not divisible by the chosen +unit value, normalization **MUST** fail. -## Value {#value} +`notional_unit_value` is an SDK-side normalization input. It is used to derive +`total_units`, but it is not persisted on chain. -> The D-ASA unit’s value is always intended as **nominal value** (at redemption). +## Unit states -The D-ASA *unit value* (`uint64`) **MUST** be expressed in the *denomination asset*. +A holder account stores two unit balances: -If the D-ASA has a *principal*, its initial *unit value* **MUST** be equal to the -*minimum denomination.* +- `reserved_units`: units allocated before `IED`; +- `units`: active units participating in funded ACTUS cashflows. -The D-ASA *unit* *value* **MAY** change over time. +When `IED` executes, reserved units become activatable and are moved into `units` +the first time the holder position is touched. -> The D-ASA unit’s value may change according to different conditions, such as an -> amortizing principal repayment schedule (see [Amortizing Schedule](../execution/payment-agent/principal-repayment.md#amortizing-schedule) -> section). +## Position accounting -The D-ASA *unit value* **MAY** change globally or locally (per account). +Each holder position **MUST** track: -> The D-ASA unit’s value can be global or local (per-account). Global unit value -> should be used when the value of all the units can be updated at the same time. -> Local unit value should be used when the units' value is updated at different -> times per each account. +- The payment address; +- Active and reserved unit balances; +- Suspension state; +- The last settled event cursor; +- The last applied cumulative interest index; +- The last applied cumulative principal index; +- Claimable interest and principal amounts. -{{#include ../../_include/styles.md:example}} -> Let’s have a D-ASA denominated in EUR, with an initial unit value of 1,000 EUR. -> The D-ASA accrues interest on a daily basis, paid at redemption. The unit value -> is updated globally (for all the units). +The accounting layer does not maintain a mutable on-chain nominal unit value. Transfers +and claims are therefore unit-based and index-based, not value-array-based. -{{#include ../../_include/styles.md:example}} -> Let’s have a D-ASA denominated in EUR, with an initial unit value of 1,000 EUR. -> The D-ASA has an amortizing principal repayment schedule. Repayments are executed -> per-account. The unit value is updated per-account (for the account’s units). +## Lazy settlement -The D-ASA *unit value* **MAY** be globally updated with the **OPTIONAL** `update_global_unit_value` -method. +The accounting layer **MUST** settle holder positions lazily against the global +cumulative indices maintained by the kernel. -## Fungibility {#fungibility} +On settlement: -> D-ASA units' fungibility depends on: -> -> - Units value (nominal); -> - Executed payments. -> +1. The delta between global and account checkpoints is computed; +1. The delta is multiplied by the holder's active units; +1. The result is moved into `claimable_interest` and `claimable_principal`; +1. The checkpoints and settled cursor are advanced. -The D-ASA *fungible units* **MUST** have the same *value* and *executed payments.* +This model allows: -{{#include ../../_include/styles.md:example}} -> Let’s have a D-ASA with 4 coupons. Investors A and B are holding 10 D-ASA units -> each. The 1st coupon is due. Coupon payments might not be executed synchronously -> for all the Investors. The coupon payment is executed for Investor A, while Investor -> B is still waiting for the payment settlement. Investor A units are temporarily -> non-fungible with Investor B units until the 1st coupon is paid for both. +- Contract-wide funding of due ACTUS cash events once; +- Account-by-Account realization of the funded cashflows later. diff --git a/docs/specs/contract/actus-compliance-profile.md b/docs/specs/contract/actus-compliance-profile.md new file mode 100644 index 00000000..5cb67f3c --- /dev/null +++ b/docs/specs/contract/actus-compliance-profile.md @@ -0,0 +1,82 @@ +# ACTUS Compliance Profile + +> Debt instruments such as bullet bonds, amortizing loans, mortgages, etc. differ +> based on their cash flow exchange patterns (e.g., principal and interest payment +> time schedules, fixed or variable interest rates, etc.). + +> The ACTUS taxonomy reduces the majority of all financial contracts to a defined +> set of 32 generalized cash flow exchange patterns, called contract types. + +The D-ASA **MUST** be to classified with an ACTUS *contract type* \\( [CT] \\) +(`uint8`) (see the [ACTUS taxonomy](https://github.com/actusfrf/actus-dictionary/blob/master/actus-dictionary-taxonomy.json)). + +The *contract type* **MUST** have the following properties: + +- `family`: Basic +- `class`: Fixed Income +- `sub-class`: Maturities + +## Contract Identifier + +The D-ASA *contract identifier* \\( [CID] \\) is the Algorand Application ID (`uint64`). + +The D-ASA contract layer **MUST** follow a constrained ACTUS fixed-income profile +that can be normalized and executed on the AVM. + +## Supported contract families + +The current kernel supports the following ACTUS contract family identifiers: + +| ID | Contract Type | Description | Rate | Use case | +|:---:|:-------------:|:---------------------------------------------------------------------------------------------------------------------------------------|:----------------------|:---------------------------------------------------------------| +| `0` | `PAM` | Principal payment fully at \\( [IED] \\) and repaid at \\( [MD] \\). | Fix or variable rates | All kind of bonds, term deposits, bullet loans, mograges, etc. | +| `1` | `ANN` | Principal payment fully at \\( [IED] \\) and repaid periodically in constants amounts till \\( [MD] \\). | Fix or variable rates | Classical level payment morgages, leasing contracts, etc. | +| `2` | `NAM` | As `ANN`, when resetting reate total amount (principal + interest) stay constant. \\( [MD] \\) shifts. | Variable only | Adjustable rate morgages | +| `3` | `LAM` | Principal payment fully at \\( [IED] \\) and repaid periodically in constants amounts till \\( [MD] \\), interest reduced accordingly. | Fix or variable | Amortizing loans | +| `4` | `LAX` | Flexible version of `LAM`. | Fix or variable | Teaser rate loans | +| `5` | `CLM` | Loans rolled over as long as they are not called. Once called, it has to be paid back after noticed period. | Fix or variable | Loans with call options | + +> Non-normative subtypes such as `PAM:ZCB` and `PAM:FCB` are resolved before normalization. +> The AVM kernel stores only the normalized family identifier. + +## Supported event types + +The normalized execution schedule **MUST** contain only event types permitted for +the configured contract family. + +| Family | Allowed events | +|:-------|:----------------------------------------------------------| +| `PAM` | `IED`, `IP`, `MD`, `RR`, `RRF` | +| `ANN` | `IED`, `IP`, `PR`, `MD`, `RR`, `RRF`, `IPCB`, `PRF` | +| `NAM` | `IED`, `IP`, `PR`, `MD`, `RR`, `RRF`, `IPCB` | +| `LAM` | `IED`, `IP`, `PR`, `MD`, `RR`, `RRF`, `IPCB` | +| `LAX` | `IED`, `IP`, `PR`, `PI`, `MD`, `RR`, `RRF`, `IPCB`, `PRF` | +| `CLM` | `IED`, `IP`, `PR`, `MD`, `RR`, `RRF` | + +- **Cash events** are limited to `IP`, `PR`, and `MD`. + +- **Non-cash events** are limited to `IED`, `PI`, `RR`, `RRF`, `IPCB`, and `PRF`. + +## Normalization constraints + +The D-ASA profile further requires: + +- `business_day_convention = NOS`; +- `calendar = NC`; +- One of the supported day-count conventions listed in [Day-Count Convention](./day-count-convention.md); +- AVM-compatible `uint64` values for amounts, times, and fixed-point factors. + +Normalization **MUST** reject any contract that cannot satisfy those constraints. + +## Observed events + +Observed schedule extension is intentionally narrow: + +- Only `CLM` contracts may append observed events at runtime; + +- `append_observed_cash_event` only accepts observed `PR` cash events; + +- `apply_non_cash_event` applies due `RR` and `RRF` events under Observer control; + +- Arranger-controlled observed appends **MUST** preserve event ordering and contiguous +event IDs. diff --git a/docs/specs/contract/attributes.md b/docs/specs/contract/attributes.md new file mode 100644 index 00000000..3339eb2a --- /dev/null +++ b/docs/specs/contract/attributes.md @@ -0,0 +1,221 @@ +# Main Contract Attributes + +The following are the main ACTUS Contract Attributes. + +This section is intended to clarify ACTUS-specific terminology and map it to the +corresponding terms used in the D-ASA implementation. ACTUS remains the normative +specification throughout. + +> [!IMPORTANT] +> In the event of any inconsistency, the ACTUS specification shall prevail. + +> For further details, refer to the ACTUS specification. + +## Principal + +> Debt instruments principal is the amount of capital borrowed and used as a base +> for calculating interest. + +The D-ASA **MUST** define the *principal* \\( [NT] \\), expressed in the *denomination +asset*. + +The D-ASA **MUST** define a *minimum denomination*, expressed in the *denomination +asset*. + +The *minimum denomination* **MUST** be a divisor of the *principal*. + +### Discount + +> Debt instruments principal may be placed at premium or discount on issuance. + +The D-ASA **MAY** define a *premium* or *discount* \\( [PDIED] \\) to apply to the +principal on the issuance. + +> [!TIP] +> Let’s have a D-ASA denominated in EUR, with a principal of 1M EUR paid at maturity +> and a minimum denomination of 1,000 EUR. The D-ASA has a principal discount of +> 200 bps (2%) at the issuance. Each D-ASA unit is sold on the primary market at +> 980 EUR and will be redeemed for 1,000 EUR of principal at maturity. + +## Interests + +> Debt instruments interest is calculated on a fixed or variable rate on the outstanding +> principal. + +> The interest rate is the nominal yield paid by the debt instrument on the principal, +> usually defined *per-annum* (APY). + +### Interest Rate + +> Debt instruments may have variable interest rates, based on external data oracles. + +The D-ASA **MAY** define a nominal *interest rate* \\( [IPNR] \\). + +If the interest rate is variable, the D-ASA **MUST** define *interest update dates* +known \\( [RRF] \\) or unknown \\( [RR] \\). + +#### Cap and Floor + +> Debt instruments may define limitations to the interest rate variability, either +> over the whole contract lifespan or over specific periods. + +#### Life Caps + +The D-ASA **MAY** define a *life cap* \\( [RRLC] \\) to apply to the variable *interest +rate*. + +The D-ASA **MAY** define a *life floor* \\( [RRLF] \\) to apply to the variable +*interest rate*. + +#### Period Caps + +The D-ASA **MAY** define a *period cap* \\( [RRPC] \\) to the variable *interest +rate*. + +The D-ASA **MAY** define a *period floor* \\( [RRPF] \\) to apply to the variable +*interest rate*. + +#### Fixing Period + +> Debt instruments usually schedule interest rate updates before the new rate applies +> (defined by the rate reset schedule). + +The D-ASA **MUST** define a *fixing period* \\( [RRFIX] \\) that specifies a period +of time before the *interest payment* \\( [IP] \\) in which the interest can be +updated. + +## Issuance + +> Debt instruments start accruing interest on the issuance date. + +The D-ASA **MUST** have an *initial exchange date* \\( [IED] \\) (issuance). + +## Maturity + +> Debt instruments may have a maturity date, on which the principal is repaid and +> the contract obligations expire. + +> Debt instruments may have a fixed or variable maturity date. + +The D-ASA **MAY** have a *maturity date* \\( [MD] \\). + +The *maturity date* **MAY** be updated in case or pre-payment options. + +## Prepayment Options + +> Debt instruments could have early repayment options to repay the principal to +> investors (partially or totally) before maturity or to reduce the maturity date. + +> Debt instrument with defined maturity date may terminate earlier if the full principal +> redemption happens earlier than maturity. + +If the debt instrument has early repayment options, the D-ASA **MUST** implement +the **OPTIONAL** `set_early_repayment_option` method. + +### Prepayment Effects + +> Debt instruments could have early repayment options to repay the principal to +> investors (partially or totally) before maturity or to reduce the maturity date. + +> Debt instrument with a defined maturity date may terminate earlier if the full +> principal redemption happens earlier than maturity. + +An early repayment option could have different *prepayment effects* \\(v[PPEF]v\\): + +- It **MAY** repay the *principal* partially or totally before the *maturity date*; + +- It **MAY** reduce the *maturity date*. + +The *prepayment effect* **MUST** be identified with one of the following enumerated +IDs: + +| ID | Name | ACTUS Acronym | Description | +|:------|:------------------------------------:|---------------|:------------------------------------------------------------------------------------------------| +| `0` | No Prepayment | \\([N]\\) | Prepayment is not allowed under the agreement | +| `1` | Prepayment Reduces Redemption Amount | \\([A]\\) | Prepayment is allowed and reduces the redemption amount for the remaining period up to maturity | +| `2` | Prepayment Reduces Maturity | \\([M]\\) | Prepayment is allowed and reduces the maturity | + +### Penalties + +> Debt instruments may have a penalty as a consequence of an early repayment option. + +The D-ASA **MAY** define a *penalty type* \\( [PYTP] \\) for the early repayment +options. + +The *penalty type* **MUST** be identified with one of the following enumerated IDs: + +| ID | Name | ACTUS Acronym | Description | +|:------|:--------------------------:|---------------|:-------------------------------------------------------------------------------------------------------| +| `0` | No Penalty | \\([N]\\) | No penalty applies | +| `1` | Fixed Penalty | \\([A]\\) | A fixed amount applies as penalty | +| `2` | Relative Penalty | \\([R]\\) | A penalty relative to the notional outstanding applies | +| `3` | Interest Rate Differential | \\([I]\\) | A penalty based on the current interest rate differential relative to the notional outstanding applies | + +## Performance + +> Debt instruments performances are exposed to credit risks. + +The D-ASA *performance* \\( [PRF] \\) **MUST** be identified with one of the following +enumerated IDs: + +| ID | Name | ACTUS Acronym | Description | +|:----|:----------:|---------------|:-------------------------------------------------------------------------------------| +| `0` | Performant | \\( [PF] \\) | Contract is performing according to terms and conditions | +| `1` | Delayed | \\( [DL] \\) | Contractual payment obligations are delayed according to the *grace period* | +| `2` | Delinquent | \\( [DQ] \\) | Contractual payment obligations are delinquent according to the *delinquency period* | +| `3` | Default | \\( [DF] \\) | Contract defaulted on payment obligations according to *delinquency period* | +| `4` | Matured | \\( [MA] \\) | Contract matured | +| `5` | Terminated | \\( [TE] \\) | Contract has been terminated | + +> [!NOTE] +> The current version of D-ASA reference implementation does not support contract +> performance and its attributes defined below. + +### Grace Period + +> Debt instruments may define a grace period as a time window after the payment +> due date during which payment may be retried without a penalty. + +The D-ASA **MAY** define a *grace period* \\( [GRP] \\). + +### Delinquency Period + +> Debt instruments may define a delinquency period as a time window after the grace +> period. If payment happens after the delinquency period, then the counterparty +> is in technical default. + +The D-ASA **MAY** define a *delinquency period* \\( [DQP] \\)). + +### Default + +> Default is the ultimate failure to pay the lenders according to the payment obligations. +> When this happens, the creditors have the right to declare default to the debtors. + +> Default processes require the intervention of regulatory bodies and courts, therefore +> the D-ASA default status bridges the default process off-chain. + +The D-ASA **SHOULD** enter *default* status if it cannot perform payments on due +dates. + +The D-ASA **MAY** disable all non-administrative methods on *default* status. + +> The D-ASA default can be called either automatically (based on program conditions) +> or manually (based on the decision of a trustee). + +The *default* status **MAY** be set by the Trustee with the `set_default_status` +method. + +> [!TIP] +> The D-ASA has no *grace period* and no *delinquency period*. A D-ASA coupon payment +> is triggered on due date, but there is not enough liquidity to pay all the investors. +> The D-ASA contract automatically enters in *default* immediately. + +> [!TIP] +> The D-ASA has a *grace period* and a *delinquency period*. A D-ASA coupon payment +> is triggered on due date, but there is not enough liquidity to pay all the investors. +> The D-ASA program starts counting the *grace period* and *delinquency period*. +> If the *delinquency period* expires, then the contract enters in *default*. + +> [!TIP] +> A D-ASA coupon payment is triggered on due date, but there is not enough liquidity +> to pay all the investors. The D-ASA contract relies on a Trustee to call the *default*. diff --git a/docs/specs/contract/day-count-convention.md b/docs/specs/contract/day-count-convention.md index d33a71e8..2aad6ab0 100644 --- a/docs/specs/contract/day-count-convention.md +++ b/docs/specs/contract/day-count-convention.md @@ -1,10 +1,10 @@ # Day-Count Convention {#day-count-convention} -> Debt instruments use a day-count -> convention to calculate the amount of accrued interest when the next coupon -> payment is less than a full coupon period away. +> Debt instruments use a [day-count convention](https://en.wikipedia.org/wiki/Day_count_convention) +> to calculate the amount of accrued interest when the next coupon payment is less +> than a full coupon period away. -The D-ASA **MUST** specify one *day-count convention* \\([IPCD]\\) (`uint8`). +The D-ASA **MUST** specify one *day-count convention* \\( [IPCD] \\). The *day-count convention* **MUST** be identified with one of the following enumerated IDs (`uint8`): @@ -18,40 +18,6 @@ IDs (`uint8`): | `4` | 30/360 | \\([30E360]\\) | Year fractions accrue on the basis of 30 days per month and 360 days per year in the respective period | | `5` | 28/366 | \\([28E366]\\) | Year fractions accrue on the basis of 28 days per month and 366 days per year in the respective period | | `6` | 30/365 | - | Year fractions accrue on the basis of 30 days per month and 365 days per year in the respective period | -| `255` | Continuous | - | Time fractions accrue on the basis of the number of UNIX time units (non-leap seconds) in the respective time period | - -The *day-count convention* defines the *day-count factor* as a fraction of: - -- Numerator: elapsed time of the accrual period to date; -- Denominator: time of the full accrual period defined by the *time schedule*. - -The *day-count convention* **MUST** be set using the `asset_config` method. - -{{#include ../../_include/styles.md:example}} -> Let’s have a D-ASA with the following coupon dates: -> -> - `date1`: starting date for the current coupon’s interest accrual, defined by -> the *time schedule*; -> - `date2`: date through which the interest is being accrued (“to” date), equals -> to the current block timestamp; -> - `date3`: next coupon due date, defined by the *time schedule*. -> -> The day-count factor is calculated as: -> -> **Continuous** (`255`) convention: -> -> ```text -> (date2 - date1) / (date3 - date1) -> ``` -> -> **Actual/Actual** (`0`) convention: -> -> ```text -> days_in(date2 - date1) / days_in(date3 - date1) -> ``` -> -> Where `days_in` returns the actual number of days (equal to `86400` seconds) in -> the time interval. ## Calendar @@ -60,22 +26,16 @@ The *day-count convention* **MUST** be set using the `asset_config` method. > The AVM (so the D-ASA) time has no notion of calendars. Conversion of serial UNIX > timestamps into a year/month/day triple[^1] (and vice versa) can be performed -> by external Algorand Applications[^2] or client side. +> by external Algorand Applications[^2] or client side (normalization). -The D-ASA **MAY** specify a *calendar* \\([CLDR]\\). +The D-ASA **MAY** specify a *calendar* \\( [CLDR] \\). -The *calendar* **MUST** be identified with one of the following enumerated IDs (`uint8`): +The *calendar* **MUST** be identified with one of the following enumerated IDs: | ID | Name | ACTUS | Description | |:------|:----------------:|------------|:-----------------------------------------------| | `0` | No Calendar | \\([NC]\\) | No holidays defined (default if not specified) | | `1` | Monday to Friday | \\([MF]\\) | Saturdays and Sundays are holidays | -| `255` | Custom | - | Custom holidays definition | - -The *calendar* **MAY** be set using the **OPTIONAL** `set_asset_metadata` method -(see [Metadata](metadata.md) section). - -> A reference implementation **SHOULD** use the default *calendar* (`0`). ## Business Day Convention @@ -85,15 +45,7 @@ The *calendar* **MAY** be set using the **OPTIONAL** `set_asset_metadata` method > The business day convention defines how D-ASA execution can be shifted to the > next business day (following) or the previous on (preceding). -The D-ASA **MAY** specify a *business day convention* \\([BDC]\\). - -It is **RECOMMENDED** to use an ACTUS *business day convention*. - -The *business day convention* **MAY** be set using the **OPTIONAL** `set_asset_metadata` -method (see [Metadata](metadata.md) section). - -> A reference implementation **SHOULD NOT** adopt a *business day convention* (as -> it has no defined calendar). +The D-ASA **MAY** specify a *business day convention* \\( [BDC] \\). ## End of Month Convention @@ -102,15 +54,44 @@ method (see [Metadata](metadata.md) section). > The end-of-month convention defines how D-ASA execution can be shifted according > to the different number of days in months (31, 30, and 28) according to the calendar. -The D-ASA **MAY** specify a *end-of-month convention* \\([EOMC]\\). +The D-ASA **MAY** specify a *end-of-month convention* \\( [EOMC] \\). + +## Normalization profile restrictions + +The D-ASA kernel **MUST** store one normalized day-count convention identifier. + +The current kernel accepts the following identifiers: + +| ID | Name | ACTUS | +|:----|:--------------|:-------------| +| `0` | Actual/Actual | `AA` | +| `1` | Actual/360 | `A360` | +| `2` | Actual/365 | `A365` | +| `3` | 30E/360 ISDA | `30E360ISDA` | +| `4` | 30E/360 | `30E360` | + +A contract configuration **MUST** fail if the normalized terms use any other day-count +identifier. + +The current D-ASA ACTUS profile imposes the following additional constraints on +date handling: + +- `business_day_convention` **MUST** be `NOS`; +- `calendar` **MUST** be `NC`; +- Timestamps **MUST** be expressed as UTC UNIX seconds. + +Those constraints are enforced during normalization so that the AVM only receives +values that can be executed deterministically without external calendar logic. + +## Accrual factors -It is **RECOMMENDED** to use an ACTUS *end-of-month convention*. +The AVM kernel does not recompute year fractions from raw dates. Instead, normalization +**MUST** precompute the relevant accrual factors and place them in each `ExecutionScheduleEntry`. -The *end-of-month convention* **MAY** be set using the **OPTIONAL** `set_asset_metadata` -method (see [Metadata](metadata.md) section). +This split is intentional: -> A reference implementation **SHOULD NOT** adopt an *end-of-month day convention* -> (as it has no defined calendar). +- Date arithmetic and ACTUS schedule generation happen off chain; +- Execution, validation, and state transitions happen on chain. --- diff --git a/docs/specs/contract/denomination.md b/docs/specs/contract/denomination.md index 54571b71..e27308f8 100644 --- a/docs/specs/contract/denomination.md +++ b/docs/specs/contract/denomination.md @@ -6,12 +6,11 @@ The D-ASA **MUST** be denominated either in an on-chain or off-chain *denomination asset* \\([CUR]\\)[^1]. -The *denomination asset identifier* (`uint64`) **MUST** be set using the `asset_config` -method. - All values (`uint64`) are integer minor units of the relevant on-chain or off-chain *denomination asset*. +> The reference implementation supports only on-chain ASA denominations (e.g., "stablecoins"). + ## On-chain denomination {#on-chain-denomination} The *denomination asset* **MUST** be an Algorand Standard Asset (ASA), an Application @@ -24,7 +23,7 @@ If asset is ALGO (`0`): amount is in microALGOs (\\( 10^{-6} \\) ALGO). If asset is ASA or App: amount is in base units as per that asset’s `decimals`. -{{#include ../../_include/styles.md:example}} +> [!TIP] > The value (`uint64`) `10000` of an ASA denomination with 2 `decimals` is interpreted > as `100.00` units of the ASA. @@ -39,7 +38,7 @@ The *denomination asset* **MUST** use the decimal digits specified by the [!TIP] > The value (`uint64`) `10000` an EUR (ISO 4217, 2 decimals) denomination is interpreted > as `100.00` Euro. diff --git a/docs/specs/contract/early-repayment-options.md b/docs/specs/contract/early-repayment-options.md deleted file mode 100644 index 9c590ef5..00000000 --- a/docs/specs/contract/early-repayment-options.md +++ /dev/null @@ -1,99 +0,0 @@ -# Early Repayment Options {#early-repayment-options} - -> Debt instruments could have early repayment options to repay the principal to -> investors (partially or totally) before maturity or to reduce the maturity date. - -> Debt instrument with defined maturity date may terminate earlier if the full principal -> redemption happens earlier than maturity. - -If the debt instrument has early repayment options, the D-ASA **MUST** implement -the **OPTIONAL** `set_early_repayment_option` method. - -## Early Repayment Schedule - -If the D-ASA has early repayment options, it **MUST** define *early repayment time -events* as `uint64[]` array, where: - -- The length of the array **MUST** be `N>=1`; - -- The first element **MUST** be the *early repayment start date* \\([OPANX]\\) (`uint64`): -the time after which early repayment options could be executed; - -- If the D-ASA has a *maturity date*, the last element **MUST** be the *early repayment -end date* \\([OPXED]\\) (`uint64`): the time after which early repayment options -cannot be executed. - -The *early repayment time events* **MUST** be sorted in strictly ascending order. - -The *early repayment start date* **MUST NOT** be earlier than the *issuance date*. - -The *early repayment end date* **MUST NOT** be later than the *maturity date*. - -The unscheduled *prepayment events* \\([PP]\\) **MUST** occur within the defined -*early repayment schedule*. - -In the case of non-continuous *day-count conventions* (`ID<255`, see [Day-Count -Conventions](day-count-convention.md) section), the *time periods* between subsequent -events **MUST** be multiples of a day, in seconds (`86400`). - -The *early repayment time events* **MUST** be set with the `set_early_repayment_option` -method. - -The *early repayment time events* **MAY** be updated with the `set_early_repayment_option` -method. - -The updated *early repayment time events* **MUST NOT** modify past events. - -## Prepayment Effects - -An early repayment option could have different *prepayment effects* \\([PPEF]\\): - -- It **MAY** repay the *principal* partially or totally, to all or some Investors -before the *maturity date* (see [Early Repayment](../execution/payment-agent/early-repayment.md) -section); - -- It **MAY** reduce the *maturity date* (see [Variable Time Schedule](variable-time-schedule.md) -section). - -The *prepayment effect* **MUST** be identified with one of the following enumerated -IDs (`uint8`): - -| ID | Name | ACTUS Acronym | Description | -|:------|:------------------------------------:|---------------|:------------------------------------------------------------------------------------------------| -| `0` | No Prepayment | \\([N]\\) | Prepayment is not allowed under the agreement | -| `1` | Prepayment Reduces Redemption Amount | \\([A]\\) | Prepayment is allowed and reduces the redemption amount for the remaining period up to maturity | -| `2` | Prepayment Reduces Maturity | \\([M]\\) | Prepayment is allowed and reduces the maturity | -| `255` | Custom | - | Prepayment is allowed and the effect is custom | - -The *prepayment effect* **MAY** be set using the **OPTIONAL** `set_asset_metadata` -method (see [Metadata](metadata.md) section). - -> The implementation **SHOULD** manage the accrued interest on early repayments. - -## Penalties - -> Debt instruments may have a penalty as a consequence of an early repayment option. - -The D-ASA **MAY** define a *penalty type* \\([PYTP]\\) (`uint8`) for the early repayment -options. - -The *penalty type* **MUST** be identified with one of the following enumerated IDs: - -| ID | Name | ACTUS Acronym | Description | -|:------|:--------------------------:|---------------|:-------------------------------------------------------------------------------------------------------| -| `0` | No Penalty | \\([N]\\) | No penalty applies | -| `1` | Fixed Penalty | \\([A]\\) | A fixed amount applies as penalty | -| `2` | Relative Penalty | \\([R]\\) | A penalty relative to the notional outstanding applies | -| `3` | Interest Rate Differential | \\([I]\\) | A penalty based on the current interest rate differential relative to the notional outstanding applies | -| `255` | Custom | - | Custom penalty | - -The *penalty type* **MAY** be set using the **OPTIONAL** `set_asset_metadata` method -(see [Metadata](metadata.md) section). - -If the debt instrument has a *penalty type* with `ID>0`, the D-ASA **MUST** define -a *penalty rate* \\([PYRT]\\) (`uint64`) for the amount of the penalty. - -> The *penalty rate* is either the absolute amount or the rate of the penalty. - -The *penalty rate* **MAY** be set using the **OPTIONAL** `set_early_repayment_option` -method (see [Metadata](metadata.md) section). diff --git a/docs/specs/contract/interests.md b/docs/specs/contract/interests.md deleted file mode 100644 index e908f6f3..00000000 --- a/docs/specs/contract/interests.md +++ /dev/null @@ -1,86 +0,0 @@ -# Interests - -> Debt instruments interest is calculated on a fixed or variable rate on the outstanding -> principal. - -> The interest rate is the nominal yield paid by the debt instrument on the principal, -> usually expressed as *Annual Percentage Yield* (APY). - -The D-ASA *interest rates* **MUST** be defined in *basis -points* (*bps*). - -## Interest Rate - -The D-ASA **MAY** define a nominal *interest rate* \\([IPNR]\\) (`uint16`). - -The *interest rate* **MUST** be set using the `asset_config` method. - -## Coupons - -> Debt instruments can pay interest in periodic installments, called coupons. - -> Coupons mature in a coupon period, according to a defined coupon schedule. - -The D-ASA **MUST** define the number of *total coupons* `K` (`uint64`): - -- `K>0` if the D-ASA has a **defined** number of coupons; -- `K=0` if the D-ASA has **zero** or **undefined** (perpetual) coupons. - -## Coupon Rates - -> Debt instruments can pay coupons with fixed or variable interest rates. - -The D-ASA **MAY** define the *coupon rates* \\([ARRATE]\\) as `uint16[]` array, -where: - -- The length of the array **MUST** be `K`, equal to the *total coupons*; -- The `K`\-elements of the array are the *coupon rates*, expressed in *bps*. - -If the D-ASA has zero or undefined coupons (`K=0`), the *coupon rates* array **MUST** -be empty and the *interest rate* **MUST** be used instead. - -> Coupon rates could be derived from the interest rate. - -{{#include ../../_include/styles.md:example}} -> D-ASA with 4 coupons with the following rates: 2,00%, 2,50%, 3,00%, and 3,50% -> would have the following coupon rates array (bps): -> -> ```text -> uint16[] = [200, 250, 300, 350] -> ``` - -{{#include ../../_include/styles.md:example}} -> D-ASA with zero coupons would have the following coupon rates array (bps): -> -> ```text -> uint16[] = [] -> ``` - -The *coupon rates* **MUST** be set using the `asset_config` method. - -## Accruing Interest - -> Debt instruments may accrue interest over time. - -The D-ASA *units* **MAY** accrue interest \\([IPAC]\\), according to the *day-count -convention* (see [Day-Count Convention](day-count-convention.md) section). - -If the D-ASA has coupons, the *units* accrued interest **MUST** be calculated with -respect to the latest coupon due date. - -{{#include ../../_include/styles.md:example}} -> Let's have a D-ASA with `4` coupons. The 2nd coupon is due. The D-ASA units are -> accruing the interest of the 3rd coupon. The accrued interest is calculated according -> to the day-count convention, applied to the elapsed time with respect to the 2nd -> coupon due date. - -If the D-ASA has coupons, the account *units* accrued interest calculation **SHOULD** -fail if it has pending coupon payments. - -{{#include ../../_include/styles.md:example}} -> Let's have a D-ASA with `4` coupons. The 2nd coupon is due. The D-ASA units are -> accruing the interest of the 3rd coupon. Coupon payments are not executed synchronously -> for all the Investors. The 2nd coupon payment is executed for Investor A, while -> Investor B is still waiting for the payment settlement. The accrued interest calculation -> succeeds for Investor A and fails for Investor B until the 2nd coupon payment -> is settled. diff --git a/docs/specs/contract/intro.md b/docs/specs/contract/intro.md index 44bd159a..90b6bec3 100644 --- a/docs/specs/contract/intro.md +++ b/docs/specs/contract/intro.md @@ -4,5 +4,36 @@ > on the exchange of future cash flows. Debt instruments are a subset of financial > contracts. -This section specifies the D-ASA *data model*, with properties and attributes, which -enables the tokenization of a variety of fixed income contracts. +This section specifies the D-ASA ACTUS contract layer. + +A conforming D-ASA **MUST** express the debt instrument as: + +1. ACTUS contract attributes; + +1. Normalized ACTUS terms, initial kernel state, and execution schedule for the +AVM; + +1. Explicit AVM execution of due ACTUS events. + +The canonical execution chain is, therefore: + +```mermaid +flowchart LR + ACTUS["ACTUS Contract"] + NORMALIZE["AVM Normalization"] + EXEC["AVM Execution"] + + ACTUS --> NORMALIZE + NORMALIZE --> EXEC + + style ACTUS fill:#fff9c4,stroke:#f57f17,stroke-width:2px,color:#000 + style NORMALIZE fill:#c8e6c9,stroke:#388e3c,stroke-width:2px,color:#000 + style EXEC fill:#ffccbc,stroke:#d84315,stroke-width:2px,color:#000 +``` + +The following pages define: + +- The supported ACTUS compliance profile; +- The normalized on-chain state and schedule model; +- The contract normalization and configuration flow; +- The numeric representation rules required to move ACTUS values onto the AVM. diff --git a/docs/specs/contract/kernel-state-and-schedule.md b/docs/specs/contract/kernel-state-and-schedule.md new file mode 100644 index 00000000..48ec7b80 --- /dev/null +++ b/docs/specs/contract/kernel-state-and-schedule.md @@ -0,0 +1,134 @@ +# Kernel State and Schedule + +The ACTUS kernel stores the executable contract as three normalized payload classes: + +1. `NormalizedActusTerms` +1. `InitialKernelState` +1. `ExecutionScheduleEntry[]` + +## Normalized Terms + +`NormalizedActusTerms` **MUST** contain the immutable or quasi-immutable contract +configuration required by the kernel, including: + +- Contract Type ID; +- Denomination asset ID and Settlement asset ID; +- Total units; +- Notional Principal; +- Initial Exchange Amount and Date; +- Maturity Date; +- Day-Count Convention ID; +- Rate Reset parameters; +- Dynamic-principal-redemption flags; +- Fixed-point scale. + +## Initial kernel state + +`InitialKernelState` **MUST** capture the pre-`IED` kernel state snapshot uploaded +with `contract_config`. It defines: + +- Status Date \\( [SD] \\); +- Starting event cursor; +- Outstanding principal; +- Interest calculation base; +- Current nominal rate; +- Accrued interest; +- Next principal redemption; +- Cumulative interest and principal indices. + +## Execution schedule + +Each `ExecutionScheduleEntry` **MUST** contain: + +- A contiguous `event_id`; +- An ACTUS `event_type`; +- `scheduled_time`; +- Precomputed accrual factors; +- The next normalized rate and principal state; +- Entry flags. + +The schedule **MUST** satisfy the following invariants: + +- `event_id = 0` **MUST** be `IED`; +- Event IDs **MUST** be contiguous across all pages; +- Schedule entries **MUST** be ordered by nondecreasing `scheduled_time`; +- Page size **MUST NOT** exceed `16` entries in the current kernel; +- The last uploaded page **MUST** finalize `schedule_entry_count` and move the +contract to `STATUS_PENDING_IED`. + +## ACTUS cycles + +ACTUS cycles are an off-chain schedule-generation concept. They define recurring +periods before normalization resolves them into concrete timestamps. + +The D-ASA SDK models ACTUS cycles with the syntax: + +```text +[+|-] +``` + +where: + +- `count` is a positive integer; +- `unit` is one of `D`, `W`, `M`, `Q`, `H`, `Y`; +- `+` and `-` are optional ACTUS stub markers. + +Examples: + +- `90D` +- `3M` +- `1Q` +- `1H` +- `2Y` +- `3M+` +- `1Q-` + +Cycles are used together with ACTUS anchors in `ContractAttributes`, such as: + +- `interest_payment_anchor` + `interest_payment_cycle` +- `principal_redemption_anchor` + `principal_redemption_cycle` +- `rate_reset_anchor` + `rate_reset_cycle` + +The normalization process **MUST** resolve those cycles into explicit schedule entries +before the contract is uploaded to the AVM. + +As a result, the on-chain kernel does not store raw ACTUS cycles. It stores only +the normalized timestamps and state transitions that were derived from those cycles. + +## Contract status machine + +The kernel uses the following status identifiers: + +| Status | ID | Meaning | +|:--------------|:------|:----------------------------------------------| +| `INACTIVE` | `0` | Terms and schedule not fully configured | +| `PENDING_IED` | `50` | Schedule uploaded; issuance not yet activated | +| `ACTIVE` | `100` | `IED` executed; contract lifecycle is live | +| `ENDED` | `200` | Terminal state reached | + +```mermaid +stateDiagram-v2 + [*] --> INACTIVE + INACTIVE --> PENDING_IED: Upload schedule + PENDING_IED --> ACTIVE: Execute IED + ACTIVE --> ACTIVE: Execute events + ACTIVE --> ENDED: Terminal state + ENDED --> [*] + + state "INACTIVE (0)
Terms and schedule
not fully configured" as INACTIVE + state "PENDING_IED (50)
Schedule uploaded
Issuance not activated" as PENDING_IED + state "ACTIVE (100)
IED executed
Contract lifecycle live" as ACTIVE + state "ENDED (200)
Terminal state reached" as ENDED +``` + +## Due-event execution + +The kernel advances the schedule through explicit ABI calls: + +- `contract_execute_ied` applies the first due `IED`; +- `apply_non_cash_event` applies the next due non-cash event after `IED`; +- `fund_due_cashflows` processes due cash events and advances the cursor; +- `contract_get_next_due_event` returns the next due entry, or a zero sentinel after +end. + +This split is the normative execution model for D-ASA. diff --git a/docs/specs/contract/metadata.md b/docs/specs/contract/metadata.md index 9d2635a2..b2552896 100644 --- a/docs/specs/contract/metadata.md +++ b/docs/specs/contract/metadata.md @@ -1,12 +1,10 @@ # Metadata {#metadata} -> Metadata can be used to inform optional properties that define the specific D-ASA -> implementation. +> Metadata can be used to inform optional properties that define the specific D-ASA. -The D-ASA metadata **MAY** be set using the **OPTIONAL** `set_asset_metadata` method. - -The D-ASA metadata **MAY** be updated using the **OPTIONAL** `set_asset_metadata` -method. +> [!IMPORTANT] +> D-ASA metadata is *informational only*, they have no influence on the contract +> execution and are non-normative with respect to ACTUS specifications. ## Prospectus @@ -15,7 +13,7 @@ method. > The D-ASA can notarize the debt instrument prospectus in the metadata. The D-ASA *prospectus hash* (`byte[32]`) and *prospectus URL* (`string`) **MAY** -be set using the **OPTIONAL** `set_asset_metadata` method. +be set on contract configuration. The *prospectus hash* **MUST** be computed with SHA-512/256, as defined in NIST FIPS 180-4. diff --git a/docs/specs/contract/normalization-and-configuration.md b/docs/specs/contract/normalization-and-configuration.md new file mode 100644 index 00000000..9bba8db3 --- /dev/null +++ b/docs/specs/contract/normalization-and-configuration.md @@ -0,0 +1,90 @@ +# Normalization and Configuration + +The contract configuration flow **MUST** follow the same sequence as the reference +implementation: + +```text +ContractAttributes -> normalize_contract_attributes() -> contract_config() -> contract_schedule() -> primary_distribution() -> contract_execute_ied() +``` + +## Required steps + +1. Define the debt instrument with `ContractAttributes`. + +1. Normalize the contract off chain with `normalize_contract_attributes()`. + +1. Upload `NormalizedActusTerms`, `InitialKernelState`, and the prospectus with +`contract_config`. + +1. Upload the normalized schedule in contiguous pages with `contract_schedule`. + +1. Reserve all units with `primary_distribution`. + +1. Activate issuance by executing `contract_execute_ied`. + +`contract_schedule` **MUST** be called after `contract_config`, and `contract_execute_ied` +**MUST** be called only after the full schedule is uploaded and the full unit supply +is reserved. + +## Example + +The deployment helpers and tests provide a code-accurate PAM fixed coupon bond example: + +```python +attrs = make_pam_fixed_coupon_bond_profile( + contract_id=1, + status_date=1_700_000_000, + initial_exchange_date=1_702_592_000, + maturity_date=1_858_112_000, + notional_principal=10_000, + nominal_interest_rate=0.02, + interest_payment_cycle=Cycle.parse_cycle("90D"), + interest_payment_anchor=1_710_368_000, +) + +normalized = normalize_contract_attributes( + attrs, + denomination_asset_id=12345, + denomination_asset_decimals=2, + notional_unit_value=100, + secondary_market_opening_date=1_702_592_000, + secondary_market_closure_date=1_858_198_400, +) + +pages = normalized.schedule_pages(page_size=16) +``` + +The normalized result has the following properties: + +- `notional_principal = 1_000_000` base units; +- `total_units = 100`; +- `fixed_point_scale = 1_000_000_000`; +- `schedule = [IED] + 20 * [IP] + [MD]`; +- `len(schedule) = 22`; +- `len(pages) = 2`. + +The upload sequence is: + +```python +client.send.contract_config(...) +client.send.contract_schedule(schedule_page_index=0, is_last_page=False, ...) +client.send.contract_schedule(schedule_page_index=1, is_last_page=True, ...) +client.send.primary_distribution(...) +client.send.contract_execute_ied() +``` + +## Schedule paging + +Schedule paging is part of configuration, not a transport detail. The caller **MUST** +preserve: + +- contiguous `schedule_page_index` values; +- contiguous `event_id` values across pages; +- chronological ordering across page boundaries; +- one final page flagged with `is_last_page = true`. + +## Secondary-market configuration + +`transfer_set_schedule` is separate from kernel configuration. Secondary-market +dates are not part of the on-chain `NormalizedActusTerms` struct in the current +ABI and, if enforced, **MUST** be configured separately at the execution layer. diff --git a/docs/specs/contract/numeric-precision.md b/docs/specs/contract/numeric-precision.md new file mode 100644 index 00000000..9a14408d --- /dev/null +++ b/docs/specs/contract/numeric-precision.md @@ -0,0 +1,85 @@ +# Numeric Precision and Conversions + +All values uploaded to the kernel **MUST** fit into AVM `uint64` values. + +## Amounts + +Display amounts are normalized into ASA base units: + +```text +base_units = int(display_amount * 10^decimals) +``` + +The conversion truncates toward zero because normalization converts the scaled decimal +value to an integer directly. + +## Rates + +Rates are normalized into fixed-point integers with: + +```text +fixed_point_rate = int(rate * 1_000_000_000) +``` + +The D-ASA fixed-point scale is: + +```text +FIXED_POINT_SCALE = 1_000_000_000 +``` + +The kernel then uses wide multiplication and division to apply those rates safely +on chain. + +## Units + +The normalization process **MUST** derive the total unit supply from: + +```text +total_units = notional_principal / notional_unit_value +``` + +This division **MUST** be exact. + +## Initial exchange amount + +The initial exchange amount is normalized as: + +```text +initial_exchange_amount = notional - discount +initial_exchange_amount = notional + premium +``` + +where: + +- a positive `premium_discount_at_ied` is treated as a discount; +- a negative `premium_discount_at_ied` is treated as a premium. + +Normalization **MUST** fail if the result becomes negative or exceeds `uint64`. + +## Overflow constraints + +Every normalization step **MUST** reject: + +- negative amounts that would require signed integers on chain; +- values larger than `2^64 - 1`; +- scaled amounts or rates that overflow after multiplication by their scale. + +## Example + +For a denomination asset with `2` decimals: + +- `10_000` display units normalize to `1_000_000` base units; +- `100` display units normalize to `10_000` base units; +- `0.02` normalizes to `20_000_000` fixed-point units; +- `1_000_000 / 10_000 = 100` total units. + +## Cumulative indices + +The accounting layer uses fixed-point cumulative indices for contract-wide cashflow +funding: + +- Contract-wide amount -> Per-unit index delta; +- Per-unit index delta -> Claim at settlement time. + +This design preserves precision at contract level while keeping holder settlement +lazy and deterministic. diff --git a/docs/specs/contract/overview.md b/docs/specs/contract/overview.md new file mode 100644 index 00000000..a72ad57e --- /dev/null +++ b/docs/specs/contract/overview.md @@ -0,0 +1,10 @@ +# Contract + +The contract section defines the ACTUS compliance profile, the normalized kernel +state, the schedule model, and the AVM configuration flow. + +The canonical execution chain is: + +```text +ACTUS contract -> AVM normalization -> AVM execution +``` diff --git a/docs/specs/contract/performance.md b/docs/specs/contract/performance.md deleted file mode 100644 index db3cc289..00000000 --- a/docs/specs/contract/performance.md +++ /dev/null @@ -1,107 +0,0 @@ -# Performance {#performance} - -> Debt instruments performances are exposed to credit risks. - -The D-ASA *performance* \\([PRF]\\) **MUST** be identified with one of the following -enumerated IDs (`uint8`): - -| ID | Name | ACTUS Acronym | Description | -|:----|:----------:|---------------|:-------------------------------------------------------------------------------------| -| `0` | Performant | \\([PF]\\) | Contract is performing according to terms and conditions | -| `1` | Delayed | \\([DL]\\) | Contractual payment obligations are delayed according to the *grace period* | -| `2` | Delinquent | \\([DQ]\\) | Contractual payment obligations are delinquent according to the *delinquency period* | -| `3` | Default | \\([DF]\\) | Contract defaulted on payment obligations according to *delinquency period* | -| `4` | Matured | \\([MA]\\) | Contract matured | -| `5` | Terminated | \\([TE]\\) | Contract has been terminated | - -## Grace Period {#grace-period} - -> Debt instruments may define a grace period as a time window after the payment -> due date during which payment may be retried without a penalty. - -The D-ASA **MAY** define a *grace period* \\([GRP]\\) (`uint64`). - -The *grace period* **MUST** be defined as UNIX time, in seconds. - -In case of non-continuous *day-count conventions* (`ID<255`, see [Day-Count Conventions](day-count-convention.md) -section), the *grace period* **MUST** be multiples of a day, in seconds (`86400`). - -The *grace period* **MAY** be set using the `asset_config` method as *time period* -with: - -- The *time period duration* (`uint64`) equal to the *grace period* duration; - -- The *time period repetitions* (`uint64`) equal to `1`. - -- The *grace period* **MUST** be anchored \\([ANX]\\) to the *time event* of the -first failed payment. - -{{#include ../../_include/styles.md:example}} -> Let's have a D-ASA with a *grace period*. A D-ASA coupon payment is triggered -> on due date, but there is not enough liquidity to pay all the investors. The D-ASA -> program starts counting the *grace period*, increments a failed payments counter, -> and waits 3 hours to retry. If the D-ASA payment retrial succeeds within the *grace -> period*, no penalty or fee is applied. - -## Delinquency Period {#delinquency-period} - -> Debt instruments may define a delinquency period as a time window after the grace -> period. If payment happens after the delinquency period, then the counterparty -> is in technical default. - -The D-ASA **MAY** define a *delinquency period* \\([DQP]\\) (`uint64`). - -The *delinquency period* **MUST** be defined as UNIX time, in seconds. - -In case of non-continuous *day-count conventions* (`ID<255`, see [Day-Count Conventions](day-count-convention.md) -section), the *delinquency period* **MUST** be multiples of a day, in seconds (`86400`). - -The *delinquency period* **MAY** be set using the `asset_config` method as *time -period* with: - -- The *time period duration* (`uint64`) equal to the *delinquency period* duration; - -- The *time period repetitions* (`uint64`) equal to `1`. - -- The *delinquency period* **MUST** be anchored \\([ANX]\\) to the *time event* -of the first failed payment or at the end of the *grace period* (if any). - -{{#include ../../_include/styles.md:example}} -> Let's have a D-ASA with a *delinquency period*. A D-ASA coupon payment is triggered -> on due date, but there is not enough liquidity to pay all the investors. The D-ASA -> program starts counting the *delinquency period*, increments a failed payments -> counter, and waits 3 hours to retry. If the D-ASA payment retrial succeeds within -> the *delinquency period*, a penalty or fee is applied. - -## Default - -> Default is the ultimate failure to pay the lenders according to the payment obligations. -> When this happens, the creditors have the right to declare default to the debtors. - -> Default processes require the intervention of regulatory bodies and courts, therefore -> the D-ASA default status bridges the default process off-chain. - -The D-ASA **SHOULD** enter *default* status if it cannot perform payments on due -dates. - -The D-ASA **MAY** disable all non-administrative methods on *default* status. - -> The D-ASA default can be called either automatically (based on program conditions) -> or manually (based on the decision of a trustee). - -The *default* status **MAY** be set with the **OPTIONAL** `set_default_status` method. - -{{#include ../../_include/styles.md:example}} -> The D-ASA has no *grace period* and no *delinquency period*. A D-ASA coupon payment -> is triggered on due date, but there is not enough liquidity to pay all the investors. -> The D-ASA contract automatically enters in *default* immediately. - -{{#include ../../_include/styles.md:example}} -> The D-ASA has a *grace period* and a *delinquency period*. A D-ASA coupon payment -> is triggered on due date, but there is not enough liquidity to pay all the investors. -> The D-ASA program starts counting the *grace period* and *delinquency period*. -> If the *delinquency period* expires, then the contract enters in *default*. - -{{#include ../../_include/styles.md:example}} -> A D-ASA coupon payment is triggered on due date, but there is not enough liquidity -> to pay all the investors. The D-ASA contract relies on a trustee to call the *default*. diff --git a/docs/specs/contract/principal.md b/docs/specs/contract/principal.md deleted file mode 100644 index 9451baa8..00000000 --- a/docs/specs/contract/principal.md +++ /dev/null @@ -1,91 +0,0 @@ -# Principal {#principal} - -> Debt instruments principal is the amount of capital borrowed and used as a base -> for calculating interest. - -The D-ASA **MAY** define the *principal* \\([NT]\\) (`uint64`), expressed in the -*denomination asset*. - -If the D-ASA has a *principal*, it **MUST** define a *minimum denomination* (`uint64`), -expressed in the *denomination asset*. - -The *minimum denomination* **MUST** be a divisor of the *principal*. - -The *principal* and the *minimum denomination* **MUST** be set using the `asset_config` -method. - -If the D-ASA has no defined *principal*, the *principal* and the *minimum denomination* -**MUST** be set to `0`. - -## Discount - -> Debt instruments principal may be placed at discount on issuance. - -The D-ASA **MAY** define a *discount* rate \\([PDIED]\\) (`uint16`) in *bps* to -apply to the principal on the issuance. - -The *discount* **MUST** be set using the `asset_config` method. - -{{#include ../../_include/styles.md:example}} -> Let’s have a D-ASA denominated in EUR, with a principal of 1M EUR paid at maturity -> and a minimum denomination of 1,000 EUR. The D-ASA has a principal discount of -> 200 bps (2%) at the issuance. Each D-ASA unit is sold on the primary market at -> 980 EUR and will be redeemed for 1,000 EUR of principal at maturity. - -## Amortization - -> ⚠️This section is still subject to major changes and reviews. - -> Debt instruments principal may be amortized until maturity, according to an amortization -> schedule. - -If the debt instrument has *principal amortization*, the D-ASA **MUST** define the -*amortization rates* as `uint16[]` array, where: - -- The length of the array is `N=K+1`, with `K` equal to the **fixed** *total coupons* -(see [Coupons](interests.md#coupons) section); - -- The first `K`elements of the array are the *amortizing rates* associated with -*coupon* payments; - -- The last element of the array is the *amortization rate* associated with *outstanding -principal* payment at *maturity date*; - -- The elements of the array are expressed in *basis -points* (*bps*); - -- The sum of all the *amortization rates* is equal to `10,000` *bps*. - -The *amortization rates* define the amount of principal \\([PRNXT]\\) paid at the -next payment date. - -{{#include ../../_include/styles.md:example}} -> A D-ASA with 5 coupons and even principal amortizing rates has the following amortizing -> rates (bps): -> -> ```uint16[] = [2000, 2000, 2000, 2000, 2000, 0]``` - -{{#include ../../_include/styles.md:example}} -> A D-ASA with 5 coupons and a single principal early repayment of 50% has the following -> amortizing rates (bps): -> -> ```uint16[] = [0, 0, 5000, 0, 0, 5000]``` - -{{#include ../../_include/styles.md:example}} -> A D-ASA with 4 coupons and different principal amortizing rates (bps): -> -> ```uint16[] = [1000, 2000, 3000, 4000, 0]``` - -{{#include ../../_include/styles.md:example}} -> The following are invalid amortizing rates, since their sum is not equal to `10,000` -> bps: -> -> ```uint16[] = [1000, 2000, 3000, 4000, 5000]``` - -The *amortizing rates* **MUST** be set using the **OPTIONAL** `set_amortizing_rates` -method. - -The *amortizing rates* **MAY** be updated with the **OPTIONAL** `set_amortizing_rates` -method. - -The updated *amortizing rates* **MUST NOT** modify past amortizing rates. diff --git a/docs/specs/contract/time-events.md b/docs/specs/contract/time-events.md deleted file mode 100644 index f4d7712e..00000000 --- a/docs/specs/contract/time-events.md +++ /dev/null @@ -1,138 +0,0 @@ -# Time Events - -> D-ASA *time events* are time on which contractual events are due or on which cyclic -> events begin or end. - -## Primary Distribution - -> Debt instruments can be distributed on the primary market during the primary distribution. - -> The opening and closure dates define the primary distribution duration. - -The D-ASA **MUST** have a *primary opening* (`uint64`) and *closure date* (`uint64`). - -## Issuance - -> Debt instruments start accruing interest on the issuance date. - -The D-ASA **MUST** have an *issuance date* \\([IED]\\) (`uint64`). - -## Maturity - -> Debt instruments may have a maturity date, on which the principal is repaid and -> the contract obligations expire. - -> Debt instruments may have a fixed or variable maturity date. - -The D-ASA **MAY** have a *maturity date* \\([MD]\\) (`uint64`). - -The *maturity date* **MAY** be updated in case of early repayment options (see -[Early Repayment Options](early-repayment-options.md) section). - -## Time Events Array - -The D-ASA **MUST** define *time events* \\([TEV]\\) as `uint64[]` array, where: - -- The length of the array **MUST** be: - - - `N=K+4`, if the D-ASA **has** a *maturity date;* - - `N=K+3`, if the D-ASA **has not** a *maturity date;* - - with `K` equal to the *total coupons*. - -- The first element **MUST** be the *primary distribution opening date* (`uint64`): -the time at which the D-ASA primary distribution opens; - -- The second element **MUST** be the *primary distribution closure date* (`uint64`): -the time at which the D-ASA primary distribution closes; - -- The third element **MUST** be the *issuance date* (`uint64`): the time at which -D-ASA starts to accrue interest on the principal; - -- If the D-ASA has a **fixed** number of *coupons*, then the next `K`-elements -**MUST** be the *coupon due dates* \\([IP]\\) (`uint64[K]`): times at which the -coupons mature and the interest payment \\([IPPNT]\\) can be executed[^1]. The first -coupon due date corresponds to \\([IPANX]\\). - -- If the D-ASA has **unlimited** number of *coupons*, then `K` **MUST** be `0` and -*coupons due dates* \\([IP]\\) are managed with *time periods* (see [Time Periods](time-periods.md#unlimited-time-schedule) -section). - -- If the D-ASA **has** a *maturity date*, the last element **MUST** be the *maturity -date* (`uint64`). - -The *time events* **MUST** be sorted in strictly ascending order. - -The *time events* **MUST** be defined as UNIX time, in seconds. - -In the case of non-continuous *day-count conventions* (`ID<255`, see [Day-Count -Conventions](day-count-convention.md) section), the *time periods* between subsequent -events **MUST** be multiples of a day, in seconds (`86400`)[^2]. - -The *time events* **MUST** be set using the `asset_config` method. - -{{#include ../../_include/styles.md:example}} -> The following are valid *time events* (UNIX times): -> -> ```text -> uint64[] = [1704067200, 1735603200, 1767139200, 1798675200, 1830211200] -> ``` - -{{#include ../../_include/styles.md:example}} -> The following are invalid (respectively unsorted and not-strictly sorted) *time -> events* (UNIX times): -> -> ```text -> uint64[] = [1830211200, 1704067200, 1735603200, 1767139200, 1798675200] -> ``` -> -> ```text -> uint64[] = [1704067200, 1735603200, 1767139200, 1798675200, 1830211200, 1830211200] -> ``` - -{{#include ../../_include/styles.md:example}} -> A D-ASA with `K` *total coupons* and a **defined** *maturity date*, has the following -> *time events*: -> -> ```text -> uint64[] = [primary_distribution_opening_date, primary_distribution_closure_date, issuance_date, coupon_due_date_1, ..., coupon_due_date_K, maturity_date] -> ``` - -{{#include ../../_include/styles.md:example}} -> A D-ASA whose primary distribution lasts from December 1st, 2023 00:00:00 GMT+0 -> to December 15th, 2023 00:00:00 GMT+0, is issued on January 1st, 2024 00:00:00 -> GMT+0 and matures on January 1st, 2028 00:00:00 GMT+0, with 4 annual coupons, -> each paid on December 31st 00:00:00 GMT+0, has the following *time events* array -> (UNIX times): -> -> ```text -> uint64[] = [1701388800, 1702598400, 1704067200, 1735603200, 1767139200, 1798675200, 1830211200, 1830297600] -> ``` - -{{#include ../../_include/styles.md:example}} -> A D-ASA whose primary distribution lasts from December 1st, 2023 00:00:00 GMT+0 -> to December 15th, 2023 00:00:00 GMT+0, is issued on January 1st, 2024 00:00:00 -> GMT+0 and matures on January 1st, 2028 00:00:00 GMT+0, with zero coupons, has -> the following *time events* array (UNIX times): -> -> ```text -> uint64[] = [1701388800, 1702598400, 1704067200, 1830297600] -> ``` - -{{#include ../../_include/styles.md:example}} -> A D-ASA whose primary distribution lasts from December 1st, 2023 00:00:00 GMT+0 -> to December 15th, 2023 00:00:00 GMT+0, is issued on January 1st, 2024 00:00:00 -> GMT+0 and no maturity, with perpetual coupons, has the following *time events* -> array (UNIX times): -> -> ```text -> uint64[] = [1701388800, 1702598400, 1704067200] -> ``` - ---- - -[^1]: The D-ASA supports just interest payments at the end of each coupon period. - -[^2]: This applies to any kind of time event (e.g., principal and interest payments, -primary and secondary market dates, early repayments options, interest updates, -etc.) diff --git a/docs/specs/contract/time-periods.md b/docs/specs/contract/time-periods.md deleted file mode 100644 index 5ddb5303..00000000 --- a/docs/specs/contract/time-periods.md +++ /dev/null @@ -1,84 +0,0 @@ -# Time Periods - -> D-ASA time periods can be used to define recurring (or "cyclic") events. - -> D-ASA time periods start on (are "anchored" to) *time events*. - -The D-ASA **MAY** define *time periods* \\([CL]\\) as `(uint64,uint64)[]` array, -where: - -- The first element of the tuple defines the *time period duration* (`uint64`). -It **MUST** be strictly greater than `0`; - -- The second element of the tuple defines the *time period repetitions* (`uint64`). -It **MUST** be `0` if *repetitions* are **unlimited**; - -The *time periods* **MUST** be anchored \\([ANX]\\) to a *time event* (see [Time -Events](time-events.md) section). - -The *time periods* **MUST** be defined as UNIX time, in seconds. - -In case of non-continuous *day-count conventions* (`ID<255`, see [Day-Count Conventions](day-count-convention.md) -section), the *time periods* **MUST** be multiples of a day, in seconds (`86400`). - -The *time periods* **MAY** be set using the `asset_config` method. - -If the D-ASA does not implement *time periods,* it **MUST** be set to `[]` in the -`asset_config` method. - -{{#include ../../_include/styles.md:example}} -> The following are valid *time periods* (UNIX times) indicating: -> -> - a daily time event with unlimited repetitions -> - a monthly (30 days) time event with 12 repetitions -> -> ```text -> (uint64,uint64)[] = [(86400, 0), (2592000, 12)] -> ``` - -{{#include ../../_include/styles.md:example}} -> The following are invalid *time periods* (UNIX times): -> -> ```text -> (uint64,uint64)[] = [(0, 0), (0, 12)] -> ``` - -The *time periods* **MUST** be chronologically consistent with respect to the *time -events*. - -{{#include ../../_include/styles.md:example}} -> Let's have a D-ASA with an *issuance date* and a *maturity date*, defined as *time -> events*, and 4 coupons whose periods are defined by *time periods*. -> -> The sum of the 4 coupon *time period durations* must be smaller than the time -> period between the *issuance date* and the *maturity date*. - -## Unlimited Time Schedule - -If the D-ASA has an **undefined** number of *coupons*, then the *coupon due dates* -\\([IP]\\) **MUST** be defined with a *time period* `(uint64,uint64)`. - -The first coupon due date \\([IPANX]\\) occurs on *issuance date* plus the *time -period duration* \\([IPCL]\\) and the interest payment \\([IPPNT]\\) can be executed[^1]. - -{{#include ../../_include/styles.md:example}} -> A D-ASA whose primary distribution lasts from December 1st, 2023 00:00:00 GMT+0 -> to December 15th, 2023 00:00:00 GMT+0, is issued on January 1st, 2024 00:00:00 -> GMT+0 and no maturity, with perpetual coupons maturing every 365 days, has the -> following *time events* array (UNIX times): -> -> ```text -> uint64[] = [1701388800, 1702598400, 1704067200] -> ``` -> -> and the following *time period*: -> -> ```text -> (uint64, uint64) = [31536000, 0] -> ``` -> -> The first coupon due date \\([IPANX]\\) is `1704067200 + 31536000` (UNIX time). - ---- - -[^1]: The D-ASA supports just interest payments at the end of each coupon period. diff --git a/docs/specs/contract/time-schedule.md b/docs/specs/contract/time-schedule.md deleted file mode 100644 index eb1c13f5..00000000 --- a/docs/specs/contract/time-schedule.md +++ /dev/null @@ -1,33 +0,0 @@ -# Time Schedule - -> Debt instruments may have fixed or variable time schedule (e.g., variable coupon -> due date, etc.). - -> Debt instruments may have a limited or unlimited time schedule (e.g., a fixed -> coupon bond or a perpetual bond). - -## Time Measurement - -The time on the Algorand Virtual Machine is defined by the block UNIX -timestamp[^1]. - -> The Algorand protocol has dynamic block latency with instant finality. At the -> time of writing (Jan 2025), block finality is about 2.8 seconds[^2]. - -> The AVM time may present a drift with respect to external standard time references. - -## Events - -The D-ASA events \\([EVT]\\) are defined by: - -- *time events* \\([TEV]\\) (or "anchors"); -- *time periods* (or "cycles"). - ---- - -[^1]: ACTUS is based on ISO 8601 -timestamps. The UNIX to ISO 8601 conversions are left to clients (see [Calendar](day-count-convention.md#calendar) -section). - -[^2]: ACTUS timestamps have millisecond precision, which is not compatible with -blockchains' latency. diff --git a/docs/specs/contract/type.md b/docs/specs/contract/type.md deleted file mode 100644 index c01e9e66..00000000 --- a/docs/specs/contract/type.md +++ /dev/null @@ -1,22 +0,0 @@ -# Contract Type - -> Debt instruments such as bullet bonds, amortizing loans, mortgages, etc. differ -> based on their cash flow exchange patterns (e.g., principal and interest payment -> time schedules, fixed or variable interest rates, etc.). - -> The ACTUS taxonomy reduces the majority of all financial contracts to a defined -> set of 32 generalized cash flow exchange patterns, called contract types. - -It is **RECOMMENDED** to classify the D-ASA with an ACTUS *contract type* \\([CT]\\) -(`uint8`) (see the ACTUS -taxonomy). - -The *contract type* **MUST** have the following properties: - -- `family`: Basic -- `class`: Fixed Income - -The *contract type* **MAY** be set using the **OPTIONAL** `set_asset_metadata` method -(see [Metadata](metadata.md) section). - -It is **RECOMMENDED** to use the unique D-ASA ID as *contract identifier* \\([CID]\\). diff --git a/docs/specs/contract/variable-interests.md b/docs/specs/contract/variable-interests.md deleted file mode 100644 index 7a054b26..00000000 --- a/docs/specs/contract/variable-interests.md +++ /dev/null @@ -1,122 +0,0 @@ -# Variable Rates - -> ⚠️This section is still subject to major changes and reviews. - -> Debt instruments may have variable interest rates, based on external data oracles. - -If the debt instrument has *variable interest rates*, the D-ASA **MAY** implement -the **OPTIONAL** `set_variable_interest_rate` method. - -## Interest Update Dates - -The D-ASA **MUST** define *interest update dates* of known \\([RRF]\\) or unknown -\\([RR]\\) with respect to: - -- *time events* if the D-ASA has **fixed** number of *coupons* (see [Time -Events](time-events.md#time-events-array) section); - -- *time periods* if the D-ASA has **undefined** number of *coupons* (see [Time -Periods](time-periods.md#unlimited-time-schedule) section). - -The first *interest update date* corresponds to \\([RRANX]\\). - -## Spread - -> Debt instruments typically define a spread (bps) with respect to an external index -> to update the interest rate. - -The D-ASA **MAY** define a *rate spread* \\([RRSP]\\) (`uint16`) in *bps* to apply -to the external interest data feed. - -The *rate spread* **MUST** be set using the **OPTIONAL** `set_variable_interest_rate` -method. - -If the debt instrument has no *rate spread*, then the D-ASA **MUST** set the *rate -spread* to `0`. - -{{#include ../../_include/styles.md:example}} -> A D-ASA has variable interest rates pegged to an off-chain index. Interest update -> is equal to the off-chain index plus the *rate spread* (bps). - -## Cap and Floor - -> Debt instruments may define limitations to the interest rate variability, either -> over the whole contract lifespan or over specific periods. - -### Life Caps - -The D-ASA **MAY** define a *life cap* \\([RRLC]\\) (`uint16`) in *bps* to apply -to the variable *interest rate*. - -The D-ASA **MAY** define a *life floor* \\([RRLF]\\) (`uint16`) in *bps* to apply -to the variable *interest rate*. - -The *life cap* and the *life floor* **MUST** be set using the **OPTIONAL** `set_variable_interest_rate` -method. - -If the debt instrument has no *life cap*, then the D-ASA **MUST** set the *life -cap* to `0`. - -If the debt instrument has no *life floor*, then the D-ASA **MUST** set the *life -floor* to `0`. - -### Period Caps - -The D-ASA **MAY** define a *period cap* \\([RRPC]\\) (`uint16`) in *bps* to apply -to the variable *interest rate*. - -The D-ASA **MAY** define a *period floor* \\([RRPF]\\) (`uint16`) in *bps* to -apply to the variable *interest rate*. - -The *period cap* and the *period floor* **MUST** be set using the **OPTIONAL** `set_variable_interest_rate` -method. - -If the debt instrument has no *period cap*, then the D-ASA **MUST** set the *period -cap* to `0`. - -If the debt instrument has no *period floor*, then the D-ASA **MUST** set the *period -floor* to `0`. - -## Fixing Period - -> Debt instruments usually schedule interest rate updates before the new rate applies -> (defined by the rate reset schedule). - -The D-ASA **MUST** define a *fixing period* \\([RRFIX]\\) (`uint64`) that specifies -a period of time before the *coupon due date* in which the interest can be updated. - -The *fixing period* **MUST** be set using the **OPTIONAL** `set_variable_interest_rate` -method. - -## Rates Update - -> Debt instruments may have a fixed or undefined rate update schedule. - -If the debt instrument has a **fixed** rate update schedule, then the D-ASA **MUST** -use the *coupon due dates* (either *time events* or *time periods*) as anchors for -the rate update events (see [Time Schedule](time-schedule.md) section). - -The *interest rate* **MAY** be updated using the **OPTIONAL** `update_interest_rate` -method. - -If the D-ASA has coupons, the *interest rate* **MUST NOT** be updated if there is -any due coupon still to be paid. - -The *coupon rates* **MAY** be updated using the **OPTIONAL** `update_coupon_rates` -method. - -The *coupon rates* **MUST NOT** be updated if there is any due coupon still to be -paid. - -The updated *coupon rates* **MUST NOT** modify past coupon rates. - -The *interest rate* and *coupon rates* updatability **MUST** be restricted to the -*interest oracle* role (see [Oracles](../rbac/roles.md#oracles) section). - -{{#include ../../_include/styles.md:example}} -> A D-ASA has variable interest rates pegged to an off-chain index. Interest update -> permissions are granted to an external interest oracle. - -{{#include ../../_include/styles.md:example}} -> A D-ASA has variable interest rates based on covenant breaches. Interest update -> permissions are granted to a trustee in charge of verifying breaches. diff --git a/docs/specs/contract/variable-time-schedule.md b/docs/specs/contract/variable-time-schedule.md deleted file mode 100644 index 5e749664..00000000 --- a/docs/specs/contract/variable-time-schedule.md +++ /dev/null @@ -1,47 +0,0 @@ -# Variable Time Schedule {#variable-time-schedule} - -> Debt instruments can have variable time schedule, based on different contract -> terms, such as covenants, etc. - -## Variable Time Events {#variable-time-events} - -The *time events* **MAY** be updated with the **OPTIONAL** `update_time_events` -method. - -The updated *time events* **MUST NOT** modify past events. - -> A reference implementation **SHOULD** restrict the time events updatability according -> to the optionalities of the agreement. - -{{#include ../../_include/styles.md:example}} -> Let's have a D-ASA with a *maturity date* and 4 coupons, defined by *time events*. -> The 2nd coupon is due. -> -> The updated time events **can no longer** modify: -> -> - the *primary distribution opening date*; -> - the *primary distribution closure date*; -> - the *issuance date*; -> - the 1st and 2nd coupon due dates. -> -> The updated time events **can still** modify: -> -> - the 3rd and 4th coupon due dates; -> - the *maturity date*. - -## Variable Time Periods {#variable-time-periods} - -The *time periods* **MAY** be updated with the **OPTIONAL** `update_time_periods` -method. - -The updated *time periods* **MUST** preserve chronological consistency with respect -to the *time events*. - -> A reference implementation **SHOULD** restrict the time periods updatability. - -{{#include ../../_include/styles.md:example}} -> Let's have a D-ASA with an *issuance date* and a *maturity date*, defined as *time -> events*, and 4 coupons whose periods are defined by *time periods*. -> -> The sum of the 4 updated coupon *time period durations* must be smaller than the -> time period between the *issuance date* and the *maturity date*. diff --git a/docs/specs/execution/overview.md b/docs/specs/execution/overview.md new file mode 100644 index 00000000..0cb22d0a --- /dev/null +++ b/docs/specs/execution/overview.md @@ -0,0 +1,4 @@ +# Execution + +The execution layer applies the configured contract in production through primary +distribution, cashflow funding and claims, and unit transfers. diff --git a/docs/specs/execution/payment-agent/coupons-payment.md b/docs/specs/execution/payment-agent/coupons-payment.md deleted file mode 100644 index fa3daad1..00000000 --- a/docs/specs/execution/payment-agent/coupons-payment.md +++ /dev/null @@ -1,11 +0,0 @@ -# Coupons Payment {#coupons-payment} - -If the D-ASA has coupons, it **MUST** pay due coupons, according to the *time schedule*, -with the **OPTIONAL** `pay_coupon` method. - -The D-ASA **MUST** pay due coupons, once, to the Investors. - -The D-ASA **MUST NOT** pay coupons before *coupon due dates*. - -In the case of an on-chain payment agent, the D-ASA **MUST** pay the *coupons* to -the Investor Payment Addresses. diff --git a/docs/specs/execution/payment-agent/early-repayment.md b/docs/specs/execution/payment-agent/early-repayment.md deleted file mode 100644 index 0999c4db..00000000 --- a/docs/specs/execution/payment-agent/early-repayment.md +++ /dev/null @@ -1,18 +0,0 @@ -# Early Repayment {#early-repayment} - -If the *early repayment options* repays the principal amount before *maturity* (*prepayment -effect* `1`, see [Prepayment Effects](../../contract/early-repayment-options.md#prepayment-effects) -section), the D-ASA **MUST** implement the **OPTIONAL** `early_repayment` method. - -In the case of an on-chain payment agent, the D-ASA **MUST** repay the *principal* -to the Investor Payment Addresses. - -The D-ASA units associated with the early repaid principal **MUST** be removed from -Investors’ Accounts and from circulation. - -{{#include ../../../_include/styles.md:example}} -> Let’s have a D-ASA denominated in EUR, with a *principal* of 1M EUR and a *minimum -> denomination* of 1,000 EUR. The D-ASA originally had 1,000 *total units* in circulation. -> An early repayment of 500k EUR (equal to 500 units) is executed for some Investors. -> The D-ASA now has 500 circulating units (worth 1,000 EUR each), while 500 early -> repaid units are removed from circulation. diff --git a/docs/specs/execution/payment-agent/payment-agent.md b/docs/specs/execution/payment-agent/payment-agent.md index a12903eb..ee834796 100644 --- a/docs/specs/execution/payment-agent/payment-agent.md +++ b/docs/specs/execution/payment-agent/payment-agent.md @@ -1,40 +1,66 @@ # Payment Agent {#payment-agent} > Debt instruments' cash flows usually involve: -> > - *Principal repayment* > - *Early repayments* > - *Coupon payments* -> D-ASA cash flows might not be executed synchronously for all the Investors. The -> execution of a given cash flow could last a few blocks[^1], depending on the number -> of payees. +The Payment Agent executes ACTUS cashflows in two phases: -> Although a single block proposer could order transactions in a block, in a healthy -> network block proposers are selected randomly by the Algorand consensus. Therefore, -> order of payments in a block is random and unbiased, with no systematic advantage -> or precedence of a payee with respect to others. +1. `fund_due_cashflows` +1. `claim_due_cashflows` -> D-ASA supports both on-chain and off-chain payment agents, depending on the settlement -> asset (see [Settlement](settlement.md) section). +This split is normative for the current reference implementation. There are no +separate `pay_coupon`, `pay_principal`, or legacy early-repayment payment methods. -> For reference implementations using on-chain payment agents, the AVM fees (ALGO) -> for the cash flows execution **SHOULD** be paid by who triggers the cash flows. +## Funding phase -> A reference implementation of an on-chain payment agent **SHOULD NOT** require -> extra fees for the cash flows execution. +`fund_due_cashflows` **MUST**: -The D-ASA payment methods **MAY** provide additional information about the payment. +- Inspect the schedule at the current global cursor; +- Process only due cash events (`IP`, `PR`, `MD`); +- Compute contract-wide interest and principal due from the normalized schedule; +- Reserve settlement funds in the contract; +- Convert those amounts into cumulative per-unit indices; +- Advance the global event cursor. + +Only the Arranger **MUST** be able to call `fund_due_cashflows`. + +## Claim phase + +`claim_due_cashflows` **MUST**: + +- Settle the holder position to the latest cumulative indices; +- Expose the holder's claimable interest and principal amounts; +- Execute an on-chain transfer if the payment address is executable; +- Otherwise leave the claimable amounts reserved for a later attempt. + +The method **MUST** return an opaque `payment_info` context unchanged so callers +can bind off-chain metadata to the claim. > The payment information could be used, for example, for: -> > - Adding unique identifiers or external context to the payments; > - Enabling external payment system integration in the case of off-chain settlement; > - Providing information about the settled amount and conversion rate used with > respect to the denomination asset. ---- +## Authorization model + +If an Op Daemon address is configured, `claim_due_cashflows` **MUST** only accept +calls from: + +- The Op Daemon; +- The Account *holding address*; +- The Account *payment address*. + +If no Op Daemon is configured, the current implementation applies no extra caller +restriction beyond the contract and account checks. + +## Payment ordering -[^1]: The Algorand protocol has dynamic block latency with instant finality. At -the time of writing (Jan 2025), block finality is about 2.8 seconds, the block size -is 5 MB, resulting in theoretical throughput of 10,000 transactions per second. +> [!IMPORTANT] +> Algornad block proposers could order transactions in a block. In a *healthy network*, +> block proposers are selected randomly by the Algorand consensus based on a Verifiable +> Random Function (VRF). Therefore, the order of payments in a block is random and +> unbiased, with no systematic advantage or precedence of a payee with respect to +> others. diff --git a/docs/specs/execution/payment-agent/principal-repayment.md b/docs/specs/execution/payment-agent/principal-repayment.md deleted file mode 100644 index 127b756c..00000000 --- a/docs/specs/execution/payment-agent/principal-repayment.md +++ /dev/null @@ -1,49 +0,0 @@ -# Principal Repayment {#principal-repayment} - -> Debt instruments repay the principal according to the repayment schedule. - -The *principal* **MUST** be repaid according to a *principal repayment schedule*. - -In the case of an on-chain payment agent, the D-ASA **MUST** repay the *principal* -to the Investor’s Payment Addresses. - -## Bullet Schedule - -If the debt instrument has a *bullet principal repayment schedule*, the principal -**MUST** be paid entirely at the *maturity date* using the `pay_principal` method. - -If the D-ASA has coupons, the *principal* **MUST NOT** be paid if there is any due -coupon still to be paid. - -## Amortizing Schedule - -If the debt instrument has an *amortizing principal repayment schedule*, the *principal* -**MUST** be repaid along with the **fixed** number of *coupons*, according to the -*principal amortization* (see [Amortization](../../contract/principal.md#amortization) -section), using the `pay_coupon` method. - -The first coupon due date corresponds to \\([PRANX]\\). - -The D-ASA *unit value* **MUST** be updated according to the *outstanding principal.* - -It is **RECOMMENDED** to use an ACTUS *interest calculation base* \\([IPCB]\\). - -> A reference implementation **SHOULD** calculate interest on the outstanding principal. - -> A reference implementation **SHOULD** restrict the amortizing rates updatability. - -{{#include ../../../_include/styles.md:example}} -> Let’s have a D-ASA denominated in EUR, with a *principal* of 1M EUR and a *minimum -> denomination* of 1,000 EUR, 5 coupons, and an even amortizing schedule (20% amortizing -> rate). The D-ASA has 1,000 *total units*. The D-ASA initial *unit value* is 1,000 -> EUR. The 1st coupon pays both the interest (according to the *coupon rates*) and -> 20% of the principal (according to *amortizing rates*). The D-ASA outstanding -> principal is 800k EUR. The D-ASA *unit value* is 800 EUR. - -{{#include ../../../_include/styles.md:example}} -> Let’s have a D-ASA denominated in EUR, with a *principal* of 1M EUR and a *minimum -> denomination* of 1,000 EUR. The D-ASA originally had 1,000 *total units* (worth -> 1,000 EUR each) in circulation. A partial repayment of 500k EUR (50% of the original -> principal) must be executed pro-rata to all investors. A single amortizing rate -> of 5,000 bps is used. After the partial repayment, the D-ASA still has 1000 circulating -> units (worth 500 EUR each). diff --git a/docs/specs/execution/payment-agent/settlement.md b/docs/specs/execution/payment-agent/settlement.md index 9d9fdc67..d4a89a4c 100644 --- a/docs/specs/execution/payment-agent/settlement.md +++ b/docs/specs/execution/payment-agent/settlement.md @@ -2,11 +2,8 @@ > Debt instruments cash flows may be settled in a currency different from the denomination. -The D-ASA **MUST** define either an on-chain or off-chain *settlement asset* \\([CURS]\\)[^1] -to regulate the cash flows. - -The *settlement asset identifier* (`uint64`) **MUST** be set using the `asset_config` -method. +The D-ASA **MUST** define either an on-chain or off-chain *settlement asset* +\\( [CURS] \\)[^1] to regulate the cash flows. All values (`uint64`) are integer minor units of the relevant on-chain or off-chain *settlement asset*. @@ -22,6 +19,13 @@ If the D-ASA **does not define** a different *settlement asset*, then the cash f **MUST** be settled in the denomination asset and the *settlement asset identifier* **MUST** be equal to the *denomination asset identifier*. +> [!NOTE] +> The D-ASA reference implementation supports only on-chain ASA settlement assets. + +> [!NOTE] +> The D-ASA reference implementation requires settlement assets to be the denomination +> asset. + ## On-chain settlement {#on-chain-settlement} The *settlement asset* **MUST** be an Algorand Standard Asset (ASA), an Application @@ -34,7 +38,7 @@ If asset is ALGO (`0`): amount is in microALGOs (\\( 10^{-6} \\) ALGO). If asset is ASA or App: amount is in base units as per that asset’s `decimals`. -{{#include ../../../_include/styles.md:example}} +> [!TIP] > The value (`uint64`) `10000` of settlement in ASA settlement 2 decimals is interpreted > as `100.00` units of the ASA. @@ -52,7 +56,7 @@ The *settlement asset* **MUST** use the decimal digits specified by the [!TIP] > The value (`uint64`) `10000` of a settlement in EUR (ISO 4217, 2 decimals) is > interpreted as `100.00` Euro. diff --git a/docs/specs/execution/primary-market.md b/docs/specs/execution/primary-market.md deleted file mode 100644 index a9411de6..00000000 --- a/docs/specs/execution/primary-market.md +++ /dev/null @@ -1,23 +0,0 @@ -# Primary Market {#primary-market} - -> Debt instruments can be distributed on the primary market in different ways, such -> as book building, auctions, etc. - -The D-ASA units **MUST** be distributed to D-ASA accounts, at most up to *total -units*, using the `primary_distribution` method. - -The primary distribution of D-ASA *units* **SHALL** be completed between the *primary -distribution opening* and *closing dates*, according to the primary market. - -The `primary_distribution` method **MUST** be called by an authorized primary distribution -entity. - -{{#include ../../_include/styles.md:example}} -> The primary market is performed as an auction on a dedicated Algorand Application. -> The implementation requires the `primary_distribution` method to be called exclusively -> by the primary market Application, which defines the auction’s outcome. - -{{#include ../../_include/styles.md:example}} -> The primary market is performed as a book building by an authorized Book-builder -> Address. The implementation requires the `primary_distribution` method to be called -> exclusively by the authorized Book-builder. diff --git a/docs/specs/execution/secondary-market.md b/docs/specs/execution/secondary-market.md deleted file mode 100644 index db4b77fb..00000000 --- a/docs/specs/execution/secondary-market.md +++ /dev/null @@ -1,37 +0,0 @@ -# Secondary Market {#secondary-market} - -> Debt instruments can be traded on secondary markets. - -If the debt instrument can be traded on secondary markets, the D-ASA **MUST** be -transferable and implement the **OPTIONAL** `set_secondary_time_events`. - -The D-ASA **MUST** define *secondary market time events* as `uint64[]` array, where: - -- The length of the array **MUST** be `N>=1`; - -- The first element **MUST** be the *secondary market opening date* (`uint64`): -the time at which the secondary market opens; - -- If the secondary market has a closure date, the last element **MUST** be the -*secondary market closure date* (`uint64`): the time at which the secondary market -closes. - -The *secondary market time events* **MUST** be sorted in strictly ascending order. - -The *secondary market opening date* **MUST NOT** be earlier than the *issuance date*. - -The *secondary market closure date* **MUST NOT** be later than the *maturity date*. - -In case of non-continuous *day-count conventions* (`ID<255`, see [Day-Count Conventions](../contract/day-count-convention.md) -section), the *time periods* between subsequent events **MUST** be multiples of -a day, in seconds (`86400`). - -The *secondary market time events* **MUST** be set using the `set_secondary_time_events` -method. - -The *secondary market time events* **MAY** be updated with the `set_secondary_time_events` -method. - -The updated *secondary market time events* **MUST NOT** modify past events. - -The `asset_transfer` method **MUST** fail if the secondary market is closed. diff --git a/docs/specs/execution/time.md b/docs/specs/execution/time.md new file mode 100644 index 00000000..e989f0c6 --- /dev/null +++ b/docs/specs/execution/time.md @@ -0,0 +1,8 @@ +# Time + +The time on the Algorand Virtual Machine is defined by the block UNIX timestamp. + +> The Algorand protocol has dynamic block latency with instant finality. At the +> time of writing (March 2026), block finality is about 2.8 seconds. + +> The AVM time may present a drift with respect to external standard time references. diff --git a/docs/specs/execution/transfer-agent.md b/docs/specs/execution/transfer-agent.md deleted file mode 100644 index af2a4dfd..00000000 --- a/docs/specs/execution/transfer-agent.md +++ /dev/null @@ -1,34 +0,0 @@ -# Transfer Agent {#transfer-agent} - -> Debt instruments can be transferable among investors. - -> D-ASA supports both on-chain and off-chain transfer agents. - -The Transfer Agent **SHALL** authorize the D-ASA transfers according to the transferability -policy and the secondary market. - -The sender and receiver of the D-ASA transfer: - -- **MUST** have a valid Holding Addresse, and -- **MUST** be different from each other, and -- **MUST NOT** be suspended from operations. - -The sender of the D-ASA transfer **MUST** have sufficient D-ASA *units* to transfer. - -The transferred D-ASA *units*: - -- **MUST** be non-zero, and -- **MUST** be *fungible* (see [D-ASA Units fungibility](../accounting/units.md#fungibility-fungibility) -section), and -- **MUST** record D-ASA *unit value* and *paid coupons*. - -D-ASA *units* **SHALL NOT** be transferred if the sender has pending due coupon -payments. - -> The D-ASA transferability policy may involve and integrate KYC/AML processes, -> secondary market restrictions, etc. - -If the debt instrument is transferable, the D-ASA **MUST** implement the **OPTIONAL** -`asset_transfer` methods. - -The `asset_transfer` method **MAY** be restricted to an authorized Transfer Agent. diff --git a/docs/specs/execution/transfer-agent/dvp.md b/docs/specs/execution/transfer-agent/dvp.md new file mode 100644 index 00000000..a9ae7da0 --- /dev/null +++ b/docs/specs/execution/transfer-agent/dvp.md @@ -0,0 +1,27 @@ +# Delivery-vs-Payment (DvP) + +> Delivery-vs-Payment (DvP) can be used to exchange D-ASA units both on the primary +> market (placement) and secondary market (e.g., OTC trades). + +The D-ASA framework supports the execution of composable DvP transactions. + +The D-ASA DvP transactions are native Algorand Group transactions. + +The Algorand Group transactions ensure **atomicity**, they are executed on an "all-or-nothing" +basis, meaning that either all transactions in the group are executed or none of +them are. + +Therefore, D-ASA DvP ensures **no counterparty risk**, as the transfer of D-ASA +nits and the corresponding payment occur simultaneously. If either the transfer +or the payment fails, the entire transaction group is rejected, preventing any party +from being left in a vulnerable position. + +The simplest DvP consists of: + +- A *delivery-leg*, executed by the D-ASA Transfer Agent; +- A *payment-leg*, executed as a general Algorand transaction (usually an ASA transfer). + +The **payment** is not restricted to specific assets (e.g., not restricted to the +denomination or settlement assets). + +The amounts of the DvP are negotiated between the two parties. diff --git a/docs/specs/execution/transfer-agent/primary-market.md b/docs/specs/execution/transfer-agent/primary-market.md new file mode 100644 index 00000000..781f4ba1 --- /dev/null +++ b/docs/specs/execution/transfer-agent/primary-market.md @@ -0,0 +1,52 @@ +# Primary Market {#primary-market} + +> Debt instruments can be distributed on the primary market in different ways, such +> as book building, auctions, etc. + +The primary market allocates units before the contract becomes active. + +## Allocation phase + +`primary_distribution` **MUST** reserve units for an existing holder account while +the contract is in `STATUS_PENDING_IED`. + +The method **MUST** reject allocations that: + +- Occur before configuration is complete; +- Occur after `IED`; +- Exceed the remaining unallocated supply; +- Target a suspended or missing holder account; +- Request zero units. + +Only an active Primary Dealer **MUST** be able to call `primary_distribution`. + +## Completion requirement + +`contract_execute_ied` **MUST** fail unless: + +```text +reserved_units_total == total_units +``` + +This rule makes full issuance an explicit precondition of activation in the current +reference implementation. + +## Activation + +Primary distribution reserves units only. Reserved units do not accrue funded ACTUS +cashflows until `IED` executes and the holder position is activated. + +## Proxies + +The Primary Dealer role **MAY** be delegated to a proxy Application implementing +a primary market. + +> [!TIP] +> The primary market is performed as an auction on a dedicated Algorand Application. +> The implementation requires the `primary_distribution` method to be called exclusively +> by the primary market Application, which defines the auction’s outcome. + +> [!TIP] +> The primary market is performed as a book building by an authorized Book-builder +> Address. The implementation requires the `primary_distribution` method to be called +> exclusively by the authorized Book-builder. diff --git a/docs/specs/execution/transfer-agent/secondary-market.md b/docs/specs/execution/transfer-agent/secondary-market.md new file mode 100644 index 00000000..324f99c3 --- /dev/null +++ b/docs/specs/execution/transfer-agent/secondary-market.md @@ -0,0 +1,30 @@ +# Secondary Market {#secondary-market} + +> Debt instruments can be traded on secondary markets. + +Secondary-market control is an execution-layer policy. + +## Transfer window + +If transfer window enforcement is required, the Arranger **MUST** configure it with +`transfer_set_schedule(open_date, closure_date)`. + +The transfer window is interpreted as: + +```text +open_date <= now < closure_date +``` + +The method **MUST** reject a schedule in which `open_date >= closure_date`. + +## Default behavior + +If no transfer window is configured, the current reference implementation applies +no additional secondary-market date restriction beyond the generic transfer checks. + +## Relation to normalization + +The SDK normalization helpers may carry secondary-market dates as deployment metadata. +Those dates are not part of the on-chain `NormalizedActusTerms` ABI struct in the +current kernel. On-chain enforcement therefore happens through `transfer_set_schedule`, +not through `contract_config`. diff --git a/docs/specs/execution/transfer-agent/transfer-agent.md b/docs/specs/execution/transfer-agent/transfer-agent.md new file mode 100644 index 00000000..e97c6a4a --- /dev/null +++ b/docs/specs/execution/transfer-agent/transfer-agent.md @@ -0,0 +1,34 @@ +# Transfer Agent {#transfer-agent} + +> Debt instruments can be transferable among investors. + +> D-ASA supports both on-chain and off-chain transfer agents. + +The Transfer Agent executes primary and secondary movement of D-ASA units. + +## Secondary transfers + +`transfer` **MUST** move active units only after: + +- The contract is active; +- The transfer window is open, if a window was configured; +- Both counterparties are valid, distinct, and unsuspended accounts; +- Both counterparties are settled to the current global indices; +- There is no due ACTUS event pending at the global cursor. + +The sender of the D-ASA transfer **MUST** have enough D-ASA *units* to transfer. + +The method **MUST** return the number of units transferred. + +Transfers are unit-based. The current kernel does not persist a mutable per-unit +nominal value or per-unit coupon status. + +## Caller model + +> The D-ASA transferability policy may involve and integrate KYC/AML processes, +> pre-authorizations, secondary market restrictions, etc. + +The current reference implementation requires the holder to call `transfer` directly. + +The method **MUST** reject calls from any other address. Transfers are therefor +direct holder actions, not transfer-agent proxy calls. diff --git a/docs/specs/overview.md b/docs/specs/overview.md index 42b84328..d3b2e080 100644 --- a/docs/specs/overview.md +++ b/docs/specs/overview.md @@ -1,38 +1,84 @@ # Overview {#overview} -A *Debt Algorand Standard Application* (D-ASA) is a debt instrument issued as an -Algorand Application, that conforms to this specification, and whose operations -and cash flows are executed on the AVM. - -This specification defines the actors of a D-ASA and the interfaces of the Algorand -Application to: - -- Arrange and configure the D-ASA (e.g. principal, interest, time events, etc.); -- Manage D-ASA accounts (e.g. opening and closing accounts, etc.); -- Distribute the D-ASA on the primary market (e.g. book building, auctions, etc.); -- Execute D-ASA cash flows (e.g coupon payments, principal repayment, etc.); -- Exchange the D-ASA on secondary markets (if any); -- Query D-ASA information (e.g. due coupons, next coupon due date, etc.). - -This specification also provides the interfaces to comply with regulatory requirements, -such as defining a role-based access control, suspending D-ASA operations completely -or for specific accounts, managing default processes, etc. - -The contents are structured on four functional layers: - -1. *Trust Model*: this layer defines the application role-based access -control model to manage the fixed income contract and comply with regulatory frameworks; -1. *Contract*: this layer provides the algorithmic definitions of the debt instrument -(data model, attributes, and cash flows); -1. *Accounting*: this layer defines the tokenization of the contract; -1. *Execution*: this layer defines the execution of the contract, both the distribution, -cash flows and transfers. +A *Debt Algorand Standard Application* (D-ASA) is an Algorand application that +executes a fixed-income ACTUS contract on the AVM. + +A conforming D-ASA **MUST** process a debt instrument through the following stages: + +1. Define the debt instrument as an ACTUS contract. + +1. Normalize the ACTUS contract into AVM-compatible integers, state, and schedule +pages. + +1. Execute the normalized contract on the AVM through explicit ABI methods. + +The D-ASA therefore uses the AVM as the execution layer of ACTUS. The canonical +contract interface is the normalized ACTUS interface defined in this specification. + +This specification is structured in four layers: + +1. **RBAC**: identifies operational actors and their authorities. + +1. **ACTUS Kernel**: defines the normalized contract terms, schedule, and lifecycle +state machine. + +1. **Accounting**: defines holder positions, unit balances, checkpoints, and claims. + +1. **Execution**: executes the ACTUS cashflows and tokenized contract transfers. + + - *Payment Agent*: defines funding and withdrawal of due ACTUS cashflows. + + - *Transfer Agent*: defines primary distribution and secondary transfer execution. + +--- + +```mermaid +flowchart TD + RBAC["Layer 1: RBAC
Operational actors & authorities"] + KERNEL["Layer 2: ACTUS Kernel
Contract terms, schedule & state machine"] + ACCOUNTING["Layer 3: Accounting
Positions, balances, checkpoints & claims"] + PAYMENT["Layer 4a: Payment Agent
Funding & withdrawal of cashflows"] + TRANSFER["Layer 4b: Transfer Agent
Primary distribution & secondary transfers"] + + RBAC --> KERNEL + KERNEL --> ACCOUNTING + ACCOUNTING --> PAYMENT + ACCOUNTING --> TRANSFER + + style RBAC fill:#bbdefb,stroke:#1976d2,stroke-width:2px,color:#000 + style KERNEL fill:#fff9c4,stroke:#f57f17,stroke-width:2px,color:#000 + style ACCOUNTING fill:#c8e6c9,stroke:#388e3c,stroke-width:2px,color:#000 + style PAYMENT fill:#ffccbc,stroke:#d84315,stroke-width:2px,color:#000 + style TRANSFER fill:#ffccbc,stroke:#d84315,stroke-width:2px,color:#000 +``` + +--- + +## Conformance + +A conforming implementation: + +- **MUST** implement the public ABI described in the [Interfaces](../interfaces/types.md) +section; + +- **MUST** accept normalized ACTUS terms, an initial kernel state, and a paged execution +schedule; + +- **MUST** execute ACTUS non-cash and cash events through the kernel and agent interfaces; + +- **MUST** follow the ACTUS compliance profile defined in the [Contract](./contract/intro.md) +section. ## ACTUS compliance -
ACTUS still presents some limitations with -respect to blockchain-based implementations. +D-ASA is designed to be ACTUS-compliant, with three minor deviations required by +AVM constraints: -Therefore, ACTUS compliance is **RECOMMENDED** but not mandatory. +| | ACTUS | D-ASA | +|:---------------|:---------------------------------------------------|:------------------------------------------------| +| Time format | [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) | [UNIX](https://en.wikipedia.org/wiki/Unix_time) | +| Time precision | Millisecond \\( 10^{-3} [s] \\) | Second \\( [s] \\) | +| Arithmetic | Floating-point | Fixed-point | -ACTUS limitations are usually marked with footnotes. +> The ACTUS compliance has not yet been certified by an *official* ACTUS standardization +> body. diff --git a/docs/specs/rbac/overview.md b/docs/specs/rbac/overview.md new file mode 100644 index 00000000..d58278e6 --- /dev/null +++ b/docs/specs/rbac/overview.md @@ -0,0 +1,7 @@ +# Trust Model + +The trust model defines who is allowed to configure, operate, suspend, and observe +the D-ASA lifecycle. + +The canonical role set and the RBAC enforcement rules are specified in the following +pages. diff --git a/docs/specs/rbac/rbac.md b/docs/specs/rbac/rbac.md index 69540bbe..593a3ccc 100644 --- a/docs/specs/rbac/rbac.md +++ b/docs/specs/rbac/rbac.md @@ -1,45 +1,71 @@ # Role-Based Access Control {#role-based-access-control} -> D-ASA can define a custom role-based access control to comply with administrative -> and regulatory requirements. +The D-ASA role model **MUST** gate every privileged ABI method. -A D-ASA *role* **MAY** be assigned using the **OPTIONAL** `rbac_assign_role` method. +## Role administration -A D-ASA *role* **MAY** be revoked using the **OPTIONAL** `rbac_revoke_role` method. +The Arranger **MUST** control role administration through: + +- `rbac_assign_role` +- `rbac_revoke_role` +- `rbac_get_role_validity` +- `rbac_get_address_roles` + +Role assignments **MUST** be validated against their stored time window at execution +time. A role that exists but is outside its validity interval **MUST** be treated +as inactive. + +## Arrangement + +The Arranger **MUST** retain the authority to: + +- rotate the arranger address with `rbac_rotate_arranger`; +- set the optional operation daemon with `rbac_set_op_daemon`; +- update the application with `contract_update`. ## Suspension > Debt instruments are regulated under different legal frameworks and their jurisdictions. -> The D-ASA ensures efficient execution of the debt instrument in the "best case -> scenarios", where it offers the highest improvements in cost and time efficiency +> The D-ASA ensures efficient execution of the debt instrument in the “best case +> scenarios”, where it offers the highest improvements in cost and time efficiency > if compared to the traditional, manual, and labor-intensive contracts. > The D-ASA provides methods to comply with regulatory obligations, allowing the -> management of the "worst case scenarios", in which the intervention of the authority +> management of the “worst case scenarios”, in which the intervention of the authority > or the regulator is necessary. > Debt instruments can be temporarily suspended due to regulations or operational > reasons. -The D-ASA suspension authority **MUST** be restricted to specific *contract roles*. +The D-ASA suspension authority **MUST** be restricted to specific contract roles. + +### Asset suspension + +`rbac_contract_suspension` **MUST** suspend or resume asset-wide operations. + +When the asset is suspended, the implementation **MUST** reject: -### Asset Suspension +- primary distribution; +- funding and claiming of due cashflows; +- holder payment-address updates; +- transfers; +- any other method explicitly guarded by the suspension flag. -The D-ASA **MAY** suspend all: +### Account suspension -- Payments; -- D-ASA units transfers. +`account_suspension` **MUST** suspend or resume a specific holder account. -The asset *suspension* status **MUST** be set with the `rbac_gov_asset_suspension` -method. +When an account is suspended, the implementation **MUST** reject: -### Account Suspension +- unit allocations to that account during primary distribution; +- transfers from or to that account; +- on-chain cashflow execution to that account while the suspension remains in force. -The D-ASA **MAY** suspend an account: +## Observer-controlled events -- Payments (skipped on due dates); -- D-ASA units transfers (from and to). +The Observer role **MUST** authorize due `RR` and `RRF` event application through +`apply_non_cash_event`. -The account *suspension* status **MUST** be set with the `account_gov_suspension` -method. +All other non-cash events remain arranger-controlled unless a future profile explicitly +states otherwise. diff --git a/docs/specs/rbac/roles.md b/docs/specs/rbac/roles.md index 7d3fed86..d1405a1e 100644 --- a/docs/specs/rbac/roles.md +++ b/docs/specs/rbac/roles.md @@ -3,99 +3,114 @@ > D-ASA defines custom roles and permissions for the entities involved in the debt > instrument. -The D-ASA **MUST** define *contract roles* \\([CNTRL]\\). +The D-ASA **MUST** define contract roles \\( [CNTRL] \\). -The *contract roles* **MUST** be identified with a *role ID* (`uint8`). +The D-ASA **MUST** identify operational authorities with reserved role identifiers. -The *contract roles* **MUST** be associated with Algorand Addresses through a *role -key* of the form: +The contract roles **MUST** be associated with Algorand Addresses through a role +key of the form: -`[R||||#||]` +`[R:||||#||]` -Where `||` denotes concatenation. +Where || denotes concatenation. -{{#include ../../_include/styles.md:example}} -> Let’s have a D-ASA role ID `42` associated with the Algorand Address `XYZ`. The -> corresponding role key is `42#XYZ`. +The current reference implementation uses the following role set: -## Issuer (Borrower) +| Key | Role | Scope | +|:-----:|:----------------|:------------------------------------------------------------------------------| +| `ARR` | Arranger | Owns contract creation, configuration, schedule upload, and upgrade authority | +| `OPD` | Op Daemon | Optional automation address for payment execution workflows | +| `MNG` | Account Manager | Opens holder accounts | +| `PYD` | Primary Dealer | Allocates units during primary distribution | +| `TRS` | Trustee | Reserved for workout/default extensions; no dedicated ABI endpoint in v0.5 | +| `AUT` | Authority | Suspends the asset or individual accounts | +| `MOC` | Observer | Applies rate-reset events that depend on observed data | -> Issuers are individuals, companies, institutions, governments, or other entities -> who borrow capital by issuing a debt. +> [!TIP] +> The Arranger with Algorand Address `XYZ` is identified as `R:ARR#XYZ`. -An Issuer \\([CRID]\\) is an entity that owes a debt issued as D-ASA. +## Role model -The Issuer role **MUST** be identified with the reserved ID `1` \\([RPL]\\). +The Arranger and Op Daemon are single-address global roles. -## Arranger +The Account Manager, Primary Dealer, Trustee, Authority, and Observer roles are +time-bounded assignments. A role assignment is active only if: -> Arrangers are legal entities authorized to arrange debt instruments on behalf -> of the issuers. +```text +role_validity_start <= current_block_timestamp <= role_validity_end +``` -The Arranger owns an Algorand Address. +The D-ASA **MUST** reject actions that require an inactive role assignment. + +## Responsibilities -The Arranger role **MUST** be identified with the reserved ID `20`. +### Issuer (Borrower) -The Arranger **SHALL** configure the D-ASA using the `asset_config` method. +> Issuers are individuals, companies, institutions, governments, or other entities +> who borrow capital by issuing a debt. -The Arranger **MAY** rotate its Algorand Address using the `rbac_rotate_arranger` -method. +The Issuer \\( [RPL] \\) is a meta-role in the D-ASA role model, they have no specific +permissions. -The Arranger **MAY** configure the D-ASA *role-based access control* with the **OPTIONAL** -`rbac_assign_role` and `rbac_revoke_role` methods. +### Arranger -## Investor (Lender) +> Arrangers are legal entities authorized to arrange debt instruments on behalf +> of the issuers. -> Investors are lenders providing capital to borrowers with the expectation of a -> financial return, defined by debt instruments. +The Arranger owns an Algorand Address. -Investors \\([CPID]\\) own D-ASA accounts, characterized by a pair of Algorand Addresses: +The Arranger **MUST** be able to: -- *Holding Address*: address that owns D-ASA units with the right to future payments; -- *Payment Address*: address that receives D-ASA payments. +- create the contract; +- upload normalized ACTUS terms and schedule pages; +- execute `IED`; +- append or apply arranger-controlled observed events; +- rotate the arranger address; +- assign and revoke time-bounded roles; +- update the application. -The Payment Address **MAY** be different from the Holding Address. +### Op Daemon -> D-ASA units can be in custody with a third party or temporarily deposited on an -> order book (Holding Address). At the same time, payments are always executed towards -> the investor (on the Payment Address). +The Op Daemon is an optional execution helper. If configured, the Op Daemon **MAY** +trigger holder cashflow claims in addition to the holder or payment address. -> The right to open and close investor accounts can be granted to different entities, -> such as KYC providers or banks. +### Account Manager -The Investor role **MUST** be identified with the reserved ID `30`. +The Account Manager owns an Algorand Address. -> Debt instruments may have an order of repayment in the event of a sale or default -> of the issuer, based on investors' seniority. +The Account Manager **MUST** be able to open holder accounts. The role does not +control payments or transfers. -> Investors with the same seniority are treated equally. +> The right to open investor accounts can be granted to different entities, such +> as KYC providers or banks. -The Investors **MAY** have different **seniority** \\([SEN]\\). +### Primary Dealer -### Open Account +The Primary Dealer **MUST** be able to reserve units during primary distribution +before `IED`. -The D-ASA accounts **SHALL** be opened using the `account_open` method. +### Trustee -The D-ASA accounts **MUST NOT** be opened if the D-ASA is suspended (see [Suspension](rbac.md#suspension) -section). +The Trustee role **MUST** control the contract performance \\( [PRF] \\) (see +[Performance](../contract/attributes.md#performance) section for further details). -The D-ASA accounts **MUST NOT** be opened if the D-ASA is in default (see [Default](../contract/performance.md#default) -section). +The Trustee role is reserved by the ABI and state layout. The current reference +implementation exposes no trustee-only method, but the role identifier remains +part of the role model. -### Close Account +### Authority -The D-ASA accounts **MAY** be closed using the `account_close` method. +The Authority owns an Algorand Address. -The D-ASA accounts **MUST NOT** be closed if the D-ASA is in default (see [Default](../contract/performance.md#default) -section). +The Authority **MUST** be able to suspend the whole asset and individual holder +accounts. -## Oracles +### Observer > Debt instruments may rely on external data, such as interest rates, covenant breaches, > etc., provided by trusted oracles. -An Oracle \\([MOC]\\) is an external entity that provides trusted data to the D-ASA. - -A D-ASA **MAY** have multiple oracles. +The Observer \\( [MOC] \\) owns an Algorand Address. -The Oracle roles **MUST** be identified with the reserved IDs between `80 - 100`. +The Observer **MUST** be able to apply due rate-reset events (`RR`, `RRF`) whose +execution depends on observed external values. diff --git a/modules/accounting.py b/modules/accounting.py index 206ed5a4..74a070e3 100644 --- a/modules/accounting.py +++ b/modules/accounting.py @@ -167,18 +167,18 @@ def account_suspension( self, *, holding_address: Account, suspended: bool ) -> UInt64: """ - Set account suspension status + Set the suspension status of one account. Args: - holding_address: Account Holding Address - suspended: Suspension status + holding_address: Account holding address. + suspended: Suspension status to apply. Returns: - Timestamp of the set account suspension status + UNIX timestamp of the suspension update. Raises: - UNAUTHORIZED: Not authorized - INVALID_HOLDING_ADDRESS: Invalid account holding address + UNAUTHORIZED: Caller is not an active authority. + INVALID_HOLDING_ADDRESS: Holding address does not exist. """ self._assert_caller_is_authority() self._assert_valid_holding_address(holding_address) @@ -193,17 +193,17 @@ def account_open( Open a contract account with a new position and register its payment address. Args: - holding_address: Account Holding Address - payment_address: Account Payment Address + holding_address: Account holding address. + payment_address: Account payment address. Returns: - Timestamp of the account opening + UNIX timestamp of the account opening. Raises: - UNAUTHORIZED: Not authorized - DEFAULTED: Defaulted - SUSPENDED: Suspended operations - INVALID_HOLDING_ADDRESS: Invalid account holding address + UNAUTHORIZED: Caller is not an active account manager or contract already ended. + DEFAULTED: Asset is defaulted. + SUSPENDED: Asset operations are suspended. + INVALID_HOLDING_ADDRESS: Holding address already exists. """ self._assert_caller_is_account_manager() @@ -219,20 +219,20 @@ def account_update_payment_address( self, *, holding_address: Account, payment_address: Account ) -> UInt64: """ - Update the Payment Address of an account + Update the payment address of an account. Args: - holding_address: Account Holding Address - payment_address: Account Payment Address + holding_address: Account holding address. + payment_address: New account payment address. Returns: - Timestamp of the account update + UNIX timestamp of the account update. Raises: - UNAUTHORIZED: Not authorized - DEFAULTED: Defaulted - SUSPENDED: Suspended operations - INVALID_HOLDING_ADDRESS: Invalid account holding address + UNAUTHORIZED: Caller is not the holding address owner. + DEFAULTED: Asset is defaulted. + SUSPENDED: Asset operations are suspended. + INVALID_HOLDING_ADDRESS: Holding address does not exist. """ self._assert_valid_holding_address(holding_address) assert Txn.sender == holding_address, err.UNAUTHORIZED @@ -244,16 +244,16 @@ def account_update_payment_address( @arc4.abimethod(readonly=True) def account_get_position(self, *, holding_address: Account) -> typ.AccountPosition: """ - Get account position + Get the full accounting position for one holder. Args: - holding_address: Account Holding Address + holding_address: Account holding address. Returns: - Account position + Account position record. Raises: - INVALID_HOLDING_ADDRESS: Invalid account holding address + INVALID_HOLDING_ADDRESS: Holding address does not exist. """ self._assert_valid_holding_address(holding_address) return self.account[holding_address] From bbdf55f8ce0af626987eb53339388890d393ca20 Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 14:32:08 +0100 Subject: [PATCH 157/244] chore: add docsrtings --- modules/actus_kernel.py | 132 ++++++++++++++++++++++++++++++++------ modules/payment_agent.py | 40 +++++++++++- modules/rbac.py | 95 ++++++++++++++++----------- modules/transfer_agent.py | 59 ++++++++++++++++- 4 files changed, 268 insertions(+), 58 deletions(-) diff --git a/modules/actus_kernel.py b/modules/actus_kernel.py index 88388660..df6a611c 100644 --- a/modules/actus_kernel.py +++ b/modules/actus_kernel.py @@ -1019,13 +1019,16 @@ def _append_observed_cash_event( @arc4.abimethod(create="require") def contract_create(self, *, arranger: Account) -> typ.TimeStamp: """ - Create a new D-ASA contract and set the Arranger role + Create a new D-ASA contract and set the arranger role. Args: - arranger: D-ASA Arranger Address + arranger: D-ASA arranger address. Returns: - UNIX timestamp of contract creation + UNIX timestamp of contract creation. + + Raises: + None: This method does not raise contract-specific errors. """ self.arranger.value = arranger return Global.latest_timestamp @@ -1044,20 +1047,21 @@ def contract_config( until all schedule pages are configured next. Args: - terms: Normalized ACTUS terms - initial_state: Initial kernel state (pre-IED) - prospectus: Prospectus (informational only) + terms: Normalized ACTUS terms. + initial_state: Initial kernel state captured before `IED`. + prospectus: Prospectus metadata stored for reference only. Returns: - UNIX timestamp of contract configuration + UNIX timestamp of contract configuration. Raises: - UNAUTHORIZED: Not authorized - ALREADY_CONFIGURED: Contract already configured - INVALID_ACTUS_CONFIG: Invalid ACTUS configuration - INVALID_DAY_COUNT_CONVENTION: Invalid day-count convention ID - INVALID_IED: IED must be set in the future - INVALID_SORTING: Time events are not sorted correctly + UNAUTHORIZED: Caller is not the arranger. + ALREADY_CONFIGURED: Contract configuration was already stored. + INVALID_ACTUS_CONFIG: Normalized terms are incompatible with the kernel. + INVALID_DAY_COUNT_CONVENTION: Day-count identifier is not supported on chain. + INVALID_DENOMINATION: Denomination asset is not valid for this implementation. + INVALID_SETTLEMENT_ASSET: Settlement asset does not match implementation rules. + INVALID_IED: Initial exchange date is not in a valid future position. """ self._assert_caller_is_arranger() @@ -1085,6 +1089,23 @@ def contract_schedule( The configuration operation is considered complete only when the last page is stored. At that point `schedule_entry_count` is finalized and the contract moves to `STATUS_PENDING_IED`. + + Args: + schedule_page_index: Zero-based page index within the boxed schedule. + is_last_page: Whether this page finalizes the schedule upload. + schedule_page: Normalized schedule entries for the requested page. + + Returns: + UNIX timestamp of the schedule upload. + + Raises: + UNAUTHORIZED: Caller is not the arranger. + ALREADY_CONFIGURED: Schedule upload already finalized or contract is active. + TERMS_NOT_CONFIGURED: Terms were not stored before schedule upload. + INVALID_SCHEDULE_PAGE: Page size or page continuity is invalid. + INVALID_EVENT_ID: Event identifiers do not match the expected page offsets. + INVALID_ACTUS_CONFIG: Event type or entry payload is incompatible with the contract type. + INVALID_SORTING: Schedule entries are not chronologically ordered. """ self._assert_caller_is_arranger() @@ -1098,10 +1119,25 @@ def contract_schedule( @arc4.abimethod def contract_execute_ied(self) -> UInt64: - """Execute the first due `IED` entry and activate the contract. + """ + Execute the first due `IED` entry and activate the contract. `IED` is the one non-cash event that moves the app from `STATUS_PENDING_IED` to `STATUS_ACTIVE`. + + Returns: + UNIX timestamp of the `IED` execution. + + Raises: + NOT_CONFIGURED: Contract terms and schedule are not fully configured. + UNAUTHORIZED: Caller is not the arranger. + DEFAULTED: Asset is defaulted. + SUSPENDED: Asset operations are suspended. + INVALID_EVENT_CURSOR: Current cursor does not point to the first schedule entry. + INVALID_EVENT_TYPE: Next due event is not `IED`. + NO_DUE_CASHFLOW: The `IED` entry is not yet due. + INVALID_ACTUS_CONFIG: Contract is not in the expected pre-IED state. + PRIMARY_DISTRIBUTION_INCOMPLETE: Not all units were allocated before issuance. """ self._assert_configured() self._assert_caller_is_arranger() @@ -1135,11 +1171,34 @@ def apply_non_cash_event( event_id: UInt64, payload: typ.ObservedEventRequest, ) -> UInt64: - """Apply the next due non-cash event, optionally appending one first. + """ + Apply the next due non-cash event, optionally appending one first. Observed payloads are appended before execution when flagged. Rate reset events require the interest oracle because they can change the running nominal rate; other non-cash events stay arranger-controlled. + + Args: + event_id: Expected global schedule event identifier at the current cursor. + payload: Observed payload used for append-on-execute and/or rate resets. + + Returns: + UNIX timestamp of the non-cash event application. + + Raises: + NOT_CONFIGURED: Contract terms and schedule are not fully configured. + DEFAULTED: Asset is defaulted. + SUSPENDED: Asset operations are suspended. + OBSERVED_EVENT_REQUIRED: Observed-event append is not supported for this contract. + UNAUTHORIZED: Caller is not authorized for the selected non-cash event. + INVALID_EVENT_ID: Observed append payload does not target the schedule tail. + INVALID_EVENT_CURSOR: Requested event is not the next due cursor position. + INVALID_EVENT_TYPE: Requested event is not a supported non-cash event. + INVALID_SCHEDULE_PAGE: Observed append cannot be stored in the tail page. + INVALID_ACTUS_CONFIG: Event payload is incompatible with kernel state. + INVALID_SORTING: Observed append would break schedule ordering. + NO_DUE_CASHFLOW: The targeted non-cash event is not yet due. + PENDING_IED: Initial exchange has not executed yet for post-IED events. """ self._assert_configured() self._assert_is_not_asset_defaulted() @@ -1169,7 +1228,28 @@ def append_observed_cash_event( *, payload: typ.ObservedCashEventRequest, ) -> UInt64: - """Append an arranger-authorized observed cash event to the schedule tail.""" + """ + Append an arranger-authorized observed cash event to the schedule tail. + + Args: + payload: Observed cash-event payload to append after the current tail. + + Returns: + UNIX timestamp of the append operation. + + Raises: + NOT_CONFIGURED: Contract terms and schedule are not fully configured. + UNAUTHORIZED: Caller is not the arranger. + DEFAULTED: Asset is defaulted. + SUSPENDED: Asset operations are suspended. + PENDING_IED: Initial exchange has not executed yet. + OBSERVED_EVENT_REQUIRED: Observed cash events are not supported for this contract. + INVALID_EVENT_ID: Payload event id does not match the schedule tail. + INVALID_EVENT_TYPE: Payload event type is not the supported observed cash type. + INVALID_SCHEDULE_PAGE: Tail page cannot accept another schedule entry. + INVALID_ACTUS_CONFIG: Payload flags or values are inconsistent with the contract. + INVALID_SORTING: Payload time is earlier than the current schedule tail. + """ self._assert_configured() self._assert_caller_is_arranger() self._assert_is_not_asset_defaulted() @@ -1181,7 +1261,15 @@ def append_observed_cash_event( @arc4.abimethod(readonly=True) def contract_get_state(self) -> typ.KernelState: - """Return a readonly snapshot of the generic ACTUS kernel state.""" + """ + Return a readonly snapshot of the generic ACTUS kernel state. + + Returns: + Current kernel state snapshot. + + Raises: + NOT_CONFIGURED: Contract terms and schedule are not fully configured. + """ self._assert_configured() return typ.KernelState( contract_type=arc4.UInt8(self.contract_type), @@ -1203,7 +1291,15 @@ def contract_get_state(self) -> typ.KernelState: @arc4.abimethod(readonly=True) def contract_get_next_due_event(self) -> typ.ExecutionScheduleEntry: - """Return the next boxed schedule entry, or a zeroed sentinel if ended.""" + """ + Return the next boxed schedule entry, or a zeroed sentinel if ended. + + Returns: + Next due schedule entry, or an all-zero sentinel if the contract ended. + + Raises: + NOT_CONFIGURED: Contract terms and schedule are not fully configured. + """ self._assert_configured() if self.event_cursor >= self.schedule_entry_count: return typ.ExecutionScheduleEntry( diff --git a/modules/payment_agent.py b/modules/payment_agent.py index fae119bc..62380afc 100644 --- a/modules/payment_agent.py +++ b/modules/payment_agent.py @@ -46,7 +46,24 @@ def _pay(self, receiver: Account, amount: UInt64) -> None: @arc4.abimethod def fund_due_cashflows(self, *, max_event_count: UInt64) -> typ.CashFundingResult: - """Reserve due ACTUS cash events into the escrow-style claim ledger.""" + """ + Reserve due ACTUS cash events into the escrow-style claim ledger. + + Args: + max_event_count: Maximum number of due cash events to process in this call. + + Returns: + Funding result with reserved interest, reserved principal, and event count. + + Raises: + NOT_CONFIGURED: Contract terms and schedule are not fully configured. + UNAUTHORIZED: Caller is not the arranger. + DEFAULTED: Asset is defaulted. + SUSPENDED: Asset operations are suspended. + PENDING_IED: Initial exchange has not executed yet. + NO_DUE_CASHFLOW: No due cash event is currently available for funding. + NOT_ENOUGH_FUNDS: Contract account does not hold enough free settlement funds. + """ self._assert_configured() self._assert_caller_is_arranger() self._assert_is_not_asset_defaulted() @@ -96,7 +113,26 @@ def claim_due_cashflows( holding_address: Account, payment_info: Bytes, ) -> typ.CashClaimResult: - """Withdraw the holder's already funded ACTUS cash entitlements.""" + """ + Withdraw the holder's already funded ACTUS cash entitlements. + + Args: + holding_address: Holder whose position should be settled and claimed. + payment_info: Opaque settlement context returned in the result. + + Returns: + Claim result with realized interest, principal, and passthrough context. + + Raises: + NOT_CONFIGURED: Contract terms and schedule are not fully configured. + INVALID_HOLDING_ADDRESS: Holding address has no opened account. + UNAUTHORIZED: Caller is not authorized to trigger the claim. + DEFAULTED: Asset is defaulted. + SUSPENDED: Asset operations are suspended. + PENDING_IED: Initial exchange has not executed yet. + NO_DUE_CASHFLOW: The account has no claimable funded cashflow. + NOT_ENOUGH_FUNDS: Contract account lacks settlement funds for an executable payment. + """ self._assert_configured() self._assert_valid_holding_address(holding_address) self._assert_payment_authorization(holding_address) diff --git a/modules/rbac.py b/modules/rbac.py index a9a71237..3936824f 100644 --- a/modules/rbac.py +++ b/modules/rbac.py @@ -149,6 +149,12 @@ def _delete_role(self, role_id: UInt64, role_address: Account) -> None: def contract_update(self) -> None: """ Update D-ASA application. + + Returns: + None. + + Raises: + UNAUTHORIZED: Caller is not the arranger. """ # The reference implementation grants the update permissions to the Arranger. # ⚠️ WARNING: Application updates must be executed VERY carefully, as they @@ -158,13 +164,16 @@ def contract_update(self) -> None: @arc4.abimethod def rbac_rotate_arranger(self, *, new_arranger: Account) -> UInt64: """ - Rotate the Arranger address + Rotate the arranger address. Args: - new_arranger: New Arranger address + new_arranger: New arranger address. Returns: - Timestamp of the role assignment + UNIX timestamp of the role assignment. + + Raises: + UNAUTHORIZED: Caller is not the current arranger. """ self._assert_caller_is_arranger() self.arranger.value = new_arranger @@ -173,13 +182,16 @@ def rbac_rotate_arranger(self, *, new_arranger: Account) -> UInt64: @arc4.abimethod def rbac_set_op_daemon(self, *, address: Account) -> UInt64: """ - Non-Normative: Set the Operation Daemon address + Non-normative helper to set the operation daemon address. Args: - address: Operation Daemon address + address: Operation daemon address. Returns: - Timestamp of the role assignment + UNIX timestamp of the role assignment. + + Raises: + UNAUTHORIZED: Caller is not the arranger. """ self._assert_caller_is_arranger() self.op_daemon.value = address @@ -190,21 +202,21 @@ def rbac_assign_role( self, *, role_id: arc4.UInt8, role_address: Account, validity: typ.RoleValidity ) -> UInt64: """ - Assign a role to an address + Assign a role to an address. Args: - role_id: Role Identifier - role_address: Account Role Address - validity: Role time validity + role_id: Role identifier. + role_address: Account role address. + validity: Inclusive validity interval for the assignment. Returns: - Timestamp of the role assignment + UNIX timestamp of the role assignment. Raises: - UNAUTHORIZED: Not authorized - DEFAULTED: Defaulted - INVALID_ROLE: Invalid role identifier - INVALID_ROLE_ADDRESS: Invalid account role address + UNAUTHORIZED: Caller is not the arranger. + DEFAULTED: Asset is defaulted. + INVALID_ROLE: Role identifier is not supported. + INVALID_ROLE_ADDRESS: Address is invalid for the requested role. """ self._assert_caller_is_arranger() @@ -216,20 +228,20 @@ def rbac_assign_role( @arc4.abimethod def rbac_revoke_role(self, *, role_id: arc4.UInt8, role_address: Account) -> UInt64: """ - Revoke a role from an address + Revoke a role from an address. Args: - role_id: Role Identifier - role_address: Account Role Address + role_id: Role identifier. + role_address: Account role address. Returns: - Timestamp of the role revocation + UNIX timestamp of the role revocation. Raises: - UNAUTHORIZED: Not authorized - DEFAULTED: Defaulted - INVALID_ROLE: Invalid role identifier - INVALID_ROLE_ADDRESS: Invalid account role address + UNAUTHORIZED: Caller is not the arranger. + DEFAULTED: Asset is defaulted. + INVALID_ROLE: Role identifier is not supported. + INVALID_ROLE_ADDRESS: Address is not currently assigned to that role. """ self._assert_caller_is_arranger() @@ -241,16 +253,16 @@ def rbac_revoke_role(self, *, role_id: arc4.UInt8, role_address: Account) -> UIn @arc4.abimethod # TODO: Update specs and add test def rbac_contract_suspension(self, *, suspended: bool) -> UInt64: """ - Set asset suspension status + Set the asset-wide suspension status. Args: - suspended: Suspension status + suspended: Suspension status to apply. Returns: - Timestamp of the set asset suspension status + UNIX timestamp of the suspension update. Raises: - UNAUTHORIZED: Not authorized + UNAUTHORIZED: Caller is not an active authority. """ self._assert_caller_is_authority() @@ -260,10 +272,13 @@ def rbac_contract_suspension(self, *, suspended: bool) -> UInt64: @arc4.abimethod(readonly=True) def rbac_get_arranger(self) -> Account: """ - Get Arranger address + Get the arranger address. Returns: - Arranger address + Current arranger address. + + Raises: + None: This method does not raise contract-specific errors. """ return self.arranger.value @@ -272,13 +287,17 @@ def rbac_get_address_roles( self, address: Account ) -> tuple[bool, bool, bool, bool, bool]: """ - Non-normative - Get roles assigned to an address + Non-normative helper to get the active roles assigned to an address. Args: - address: Address to get roles for + address: Address to query. Returns: - Roles mask: (Account Manager, Primary Dealer, Trustee, Authority, Observer) + Roles mask in the order: account manager, primary dealer, trustee, + authority, observer. + + Raises: + None: This method does not raise contract-specific errors. """ return ( self._role_is_active(self.account_manager, address), @@ -293,14 +312,18 @@ def rbac_get_role_validity( self, *, role_id: arc4.UInt8, role_address: Account ) -> typ.RoleValidity: """ - Get role validity + Get the stored validity interval for a role assignment. Args: - role_id: Role Identifier - role_address: Account Role Address + role_id: Role identifier. + role_address: Account role address. Returns: - Role validity + Stored role validity interval. + + Raises: + INVALID_ROLE: Role identifier is not supported. + INVALID_ROLE_ADDRESS: Address is not assigned to that role. """ role = role_id.as_uint64() self._assert_valid_role(role) diff --git a/modules/transfer_agent.py b/modules/transfer_agent.py index 73afbd74..be8c2047 100644 --- a/modules/transfer_agent.py +++ b/modules/transfer_agent.py @@ -23,6 +23,20 @@ def _assert_transfer_is_open(self) -> None: def transfer_set_schedule( self, *, open_date: UInt64, closure_date: UInt64 ) -> UInt64: + """ + Configure the secondary-market transfer window. + + Args: + open_date: Inclusive UNIX timestamp at which transfers may start. + closure_date: Exclusive UNIX timestamp at which transfers stop. + + Returns: + UNIX timestamp of the schedule update. + + Raises: + UNAUTHORIZED: Caller is not the arranger. + INVALID_SORTING: The opening date is not earlier than the closure date. + """ self._assert_caller_is_arranger() assert open_date < closure_date, err.INVALID_SORTING @@ -37,7 +51,26 @@ def primary_distribution( holding_address: Account, units: UInt64, ) -> UInt64: - """Reserve units for a holder before IED finalizes issuance.""" + """ + Reserve units for a holder before the initial exchange activates issuance. + + Args: + holding_address: Account receiving the reserved units. + units: Number of units to reserve. + + Returns: + Remaining undistributed unit balance. + + Raises: + NOT_CONFIGURED: Contract terms and schedule are not fully configured. + UNAUTHORIZED: Caller is not an active primary dealer. + DEFAULTED: Asset is defaulted. + SUSPENDED: Asset or account operations are suspended. + PRIMARY_DISTRIBUTION_CLOSED: Issuance is no longer accepting allocations. + INVALID_HOLDING_ADDRESS: Holding address has no opened account. + ZERO_UNITS: Requested distribution amount is zero. + OVER_DISTRIBUTION: Requested units exceed the remaining supply. + """ self._assert_configured() self._assert_caller_is_primary_dealer() self._assert_is_not_asset_defaulted() @@ -66,10 +99,32 @@ def transfer( receiver_holding_address: Account, units: UInt64, ) -> UInt64: - """Transfer active units after settling both counterparties to the current cursor. + """ + Transfer active units after settling both counterparties to the current cursor. Returns the number of units moved. The ACTUS kernel no longer persists a nominal per-unit value on-chain, so transfer results are unit-based. + + Args: + sender_holding_address: Account debited for the transfer. + receiver_holding_address: Account credited for the transfer. + units: Number of active units to move. + + Returns: + Number of units transferred. + + Raises: + NOT_CONFIGURED: Contract terms and schedule are not fully configured. + DEFAULTED: Asset is defaulted. + SUSPENDED: Asset or account operations are suspended. + PENDING_IED: Initial exchange has not executed yet. + CLOSED_TRANSFER: Transfer window is closed. + UNAUTHORIZED: Caller is not the sender holding address. + INVALID_HOLDING_ADDRESS: Sender or receiver account does not exist. + SELF_TRANSFER: Sender and receiver are the same address. + NULL_TRANSFER: Requested transfer amount is zero. + OVER_TRANSFER: Sender does not hold enough active units. + PENDING_ACTUS_EVENT: A due ACTUS event must be processed before transfer. """ self._assert_configured() self._assert_is_not_asset_defaulted() From af5e89d07c86de4a9bc85eece0f0a8a9ef135484 Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 14:32:23 +0100 Subject: [PATCH 158/244] chore: build artifacts --- .../artifacts/d_asa/DASA.approval.puya.map | 8212 ++++++++--------- .../artifacts/d_asa/DASA.approval.teal | 548 +- .../artifacts/d_asa/DASA.arc56.json | 901 +- .../artifacts/d_asa/dasa_client.py | 2 +- .../MockRbacModule.approval.puya.map | 1332 +-- .../MockRbacModule.approval.teal | 204 +- .../MockRbacModule.arc56.json | 149 +- .../mock_rbac_module_client.py | 2 +- 8 files changed, 5690 insertions(+), 5660 deletions(-) diff --git a/smart_contracts/artifacts/d_asa/DASA.approval.puya.map b/smart_contracts/artifacts/d_asa/DASA.approval.puya.map index b314f1b2..a9e4bac4 100644 --- a/smart_contracts/artifacts/d_asa/DASA.approval.puya.map +++ b/smart_contracts/artifacts/d_asa/DASA.approval.puya.map @@ -8,7 +8,7 @@ "../../../modules/transfer_agent.py", "../../d_asa/contract.py" ], - "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AG4BmD;;AAAf;;AAA5B;AAC4C;;AAAf;;AAA7B;AAkBA;;AAAuB;AAAvB;AACA;;AAAuB;AAAvB;AFQA;AAAc;AAAd;AACA;;AAAqB;AAArB;AAGA;;AAAuB;;AAAvB;AACA;;AAAsB;;AAAtB;AAGA;;AAA6B;AAA7B;AACA;;AAA2B;AAA3B;AAGA;;AAA6B;AAA7B;AACA;;AAAqB;AAArB;AACA;;AAA6B;AAA7B;AACA;;AAA6B;AAA7B;AAGA;;AAA4B;AAA5B;AAGA;;AAAmB;AAAnB;AACA;;AAA4B;AAA5B;AAGA;;AAA+B;AAA/B;AACA;;AAA6B;AAA7B;AACA;;AAAiC;AAAjC;AACA;;AAAoC;AAApC;AAGA;;AAAiC;AAAjC;AACA;;AAAwB;AAAxB;AAGA;;AAA6B;AAA7B;AACA;;AAAyB;AAAzB;AACA;;AAA6B;AAA7B;AACA;;AAAwB;AAAxB;AACA;;AAAsB;AAAtB;AACA;;AAAuB;AAAvB;AACA;;AAA4B;AAA5B;AACA;;AAA0B;AAA1B;AAGA;;AAA0B;AAA1B;AACA;;AAAyB;AAAzB;AAGA;;AAAiC;AAAjC;AACA;;AAAkC;AAAlC;AAQA;AAAoB;AAApB;AACA;AAA4B;AAA5B;AAGA;;AAAyB;AAAzB;AIhGO;;AAA6B;;AAA7B;AAAP;AACO;;AAAuB;;AAAvB;AAAP;AACO;;AAAA;AAAP;AACO;;AAAA;AAAP;AAlBR;;;;;;AAAA;;;AAAA;;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;;;;;;AAAA;;;AAAA;;;;AAAA;AF4IK;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ADrGA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ADgGU;AAAA;AAAA;AAAA;AAAP;AC5FA;;;AACA;;;AACA;;;ADkFO;AAAA;AAAA;AAAA;AAAe;;AAAf;AAYA;AAAP;AC5FG;;;AAAX;;;AAIsB;AACA;;AADA;AADF;;AAAA;AAFR;AAAA;;;AAQe;AAAnB;;AACkB;AAAlB;;AACmB;AAAnB;;AAGI;;AAAA;;AAAA;AAAA;;;AACI;AAAA;AAAA;AAAA;AAAoB;AAAA;AAAA;AAAA;AAApB;AADJ;;;AAGiC;AAAA;AAAA;AAAA;AAAzB;;;AAAA;AAAA;;AACL;;AAAA;AAAA;AAAA;;AAAuB;;AAAvB;AAAf;;;AAEuC;;AAAA;AAAA;AAAA;AAAA;;ADoR3B;AADG;AAAA;AAAA;;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;;ACnRA;;;ADydA;;AAAA;AAAA;AAAkB;AAAA;AAAA;AAAA;AAAlB;AAAP;AACO;;AAAwB;;AAAxB;AAAP;AAxIG;;AAAA;;;AAAA;;AAAyC;;AAAzC;AAAA;;;AACQ;;;AAYE;;AAAA;AAAA;AAAA;AAAA;;AACS;;AAAnB;AAAA;;;AAAA;;AAAyC;;AAAzC;AAAA;;;AACQ;;;AA6HkB;;AAAA;;AAAA;AAAA;;AAG1B;;;AAAX;;;;;;;AAkB+B;;AAAA;;;AACC;;AAAA;;;AACN;;AAAA;;;AAAA;AAAA;;AAAA;;AACC;AAAA;;;AAAA;AAAA;;AACD;;AAAA;;AAAA;AAAA;AAAA;;AA4JyB;;AAAjC;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAtRH;AAAA;;AAAA;AAAA;AAAyB;AAAA;;AAAA;AAAA;AAAzB;;AAAA;AAwRA;;AAAA;;AAAA;AAAP;AACO;;AAAA;AAAA;AA7JH;;AAAA;AADJ;AAIA;;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AACG;;AAAA;AAAA;AAAgC;;AAAhC;AAAX;;;AAEY;AAAA;;AAAA;AAAA;AAAyB;;AAAA;;;AAAA;;AAAzB;AAAA;;AAAA;AAAA;AAGG;;;AAAJ;;;AAAkC;;AAAA;AAAA;AAAgC;;AAAhC;AAAlC;;;AAGkC;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;AACJ;;AAAA;;AAAA;AACA;;AAAA;;AAAA;AACA;AAAA;AAAA;AAAA;AAAqB;AAArB;AAAA;AAAA;AAAA;AAEG;;AAAA;;;AAAoB;;;AAApB;AAAA;;;AAEG;AAAA;;AAAA;AAAA;AAFH;;;AAGC;AAAc;;;AAAd;AACA;;AAAiC;AAAjC;AAEJ;;AAAA;;AAAA;AAAA;;;AAAA;AC/gBI;;AAAA;;AAAA;AAAA;;AACA;;AAAA;;AAAA;AAAA;;AACA;;AAAoB;AAApB;AAAA;;;;;AD8fA;;AAAwB;AAAxB;;;;AAlCa;;AAAA;AAAA;AAAA;AAAA;;AAGI;;AAAd;AAAf;;;AAEoB;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;;;;;;AAGH;;AAAc;AAAd;AAAjB;;;AAC6C;AAAA;;AAAA;AAAA;AAAA;;AAAA;AACR;AAAA;;AAAA;AAAA;AAAA;;AAAA;;;;AACpB;;AAAc;;AAAd;AAAjB;;;;;;;AAAA;;;AAC6C;AAA7B;;AACqB;AAArB;;;;;AA7IL;;;AAAX;;;AACe;;AAAc;;AAAd;AAAf;;;AACuB;AAAA;;AAAA;AAAA;;;AAyHQ;;;AAxHJ;AAAA;;AAAA;AAAA;AAAwB;;AAAA;;;AAAA;;AAAxB;AAAA;AAAA;;AACZ;AAAA;;AAAA;AAAA;AAAA;AAAf;;;AACuB;;;AAsHQ;;;AArHA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AACG;AAAA;;AAAA;AAAA;AAAnB;AAAf;;;AACuB;AAAA;;AAAA;AAAA;;;AAmHQ;;;;;;;AAAA;;;AAhHnB;;AAAA;;AAAA;AAAoC;AAAA;;AAAA;AAAA;AAApC;AAAA;AADJ;AAGO;AAAA;;;AA8GgB;;;AAzIhB;AAAA;;AAAA;AAAA;AAAwB;;AAAA;;;AAAA;;AAAxB;;;AAwIe;;;ACpdtB;;AAAA;AAAA;AAIiB;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAEH;;AALP;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AArCV;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;;;AA6CA;;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;ADmDU;AAAA;AAAA;AAAA;AAAP;ADvH0B;;AAAnB;AAAA;AAAA;AAAA;AAAA;;AAAP;AETG;AAAA;;AAAA;AAAA;AAAwB;;AAAxB;AAAX;;;AAEgB;;AAAc;AAAA;;AAAA;AAAA;AAAd;AAAA;;;AACG;;AAAA;;AAAA;AADH;;;AAEG;;AAAc;;AAAA;AAAA;AAAA;;;AAAd;AAFH;;;;AADJ;AAuFJ;;;AACA;;;AD+BO;AAAA;AAAA;AAAA;AAAe;;AAAf;AAYA;AAAP;ACxCA;;AAAA;AAAA;;;AACA;;;;;AFSI;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AACE;AAAA;;AAAA;AAAA;AAAA;;AADF;;AAAA;AAAA;AAAA;;AEPJ;AArFI;;;AACI;AAAA;;AAAA;AAAA;AADJ;;AAAA;;AAAA;;;AAGQ;AAAA;AAAA;AAAA;;;AAAA;AAAJ;;;;AAuFhB;;;AAjF6C;;AAAjC;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AADJ;AAoFc;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AA7Ed;AAIQ;;;;;;;;;;;;;AAJR;;;;;;AAAA;AFsFkB;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AACC;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAGW;AAA9B;AAAA;AAAA;;AAAA;;AACA;AAAA;;AACA;;AAAA;AAAA;AAEO;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACO;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAP;AAGA;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AEhBiB;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AACH;;AAJP;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;;;;AAAA;AAAA;AAAA;AA5BV;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;;;AEtEA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIG;;;AACO;AAAA;AAAP;AAEA;;AAAA;;AAAA;AACA;;AAAA;AAAA;AACO;;AATV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AH8GU;AAAA;AAAA;AAAA;AAAP;AExE4B;;AAAqB;;AAA1C;;;AAAP;AC5BA;;;AACA;;;AH2FO;AAAA;AAAA;AAAA;AAAe;;AAAf;AG1FP;AJrB0B;;AAAnB;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAP;AIuBA;AAAA;;;AACA;AAAA;AAEI;AAAA;;AAAA;AAAA;AAAA;AAAqC;AAAA;;AAAA;AAAA;AAArC;AADJ;AAGG;AAAA;;AAAA;AAAA;AAAX;;;AAEgB;;AAA2B;AAAA;;AAAA;AAAA;AAA3B;AADJ;AJ+FJ;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AI1FA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AACO;AAAA;;AAAA;AAAA;AAAA;AAAA;AA1BV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AA4BA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AHkFU;AAAA;AAAA;AAAA;AAAP;AGpEA;;;AACA;;;AH2DO;AAAA;AAAA;AAAA;AAAe;;AAAf;AAYA;AAAP;AGtIG;AAAA;;AAAA;AAAA;AAAX;;;AAEgB;AAAA;;AAAA;AAAA;AAA8B;;AAA9B;AADJ;AAGD;AAAA;;AAAA;AAAA;AAAX;;;AAEgB;;AAA0B;AAAA;;AAAA;AAAA;AAA1B;AADJ;AA8DG;;AAAA;;AAAA;AAAA;;AAAA;AAAP;AJxD0B;;AAAnB;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAP;AAA0B;;AAAnB;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAP;AI2DA;;AAAA;;;AACA;AAAA;;;AACO;;AAAA;AAAP;AACA;;AAAA;AAAA;AACgB;AAAA;AAAA;AAAA;AAAA;AAAT;AAAP;AHoqBG;AAAA;AAAA;AAAA;AAAqB;AAAA;AAAA;AAAA;AAArB;AAAX;;;AAE8C;AAAA;AAAA;AAAA;AAAzB;;;AAET;;AAAA;AAA4B;;AAA5B;AADJ;AGpqBA;;AAAA;AAAA;;;AACA;;AAAA;AAAA;;AAAA;;;AACA;;;;;AACA;;;;;AJ2DgB;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAT;;AAAA;AAAA;;AAAA;;AAAA;AAAP;AACA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AATA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AInFH;AAAA;;AAAA;AAAA;AAAA;AAAA;AJwGA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AGxF+B;;AAAgB;;AAArC;;;AAAP;AHrD0B;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAiKA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AACO;;AArBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AGxH+B;;AAAsB;;AAA3C;;;AAAP;AFuEO;AAAA;AAAA;AAAA;AAAe;;;AAAf;ADuEA;AAAP;AACA;;;AACA;;;AAC8B;;AAAvB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AAnLU;AAFH;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAsLP;AACO;;AA3BV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA6BA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAjM6B;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAsNO;;AAAA;;AAAA;AAAP;AACA;;;AACA;;;AACA;AAAA;;AAAA;AACO;;AAzBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA5N6B;;AAAnB;AAAA;AAAA;AAAA;AAAA;;AAAP;AA2OO;AAAA;AAfV;AAAA;AAAA;AAAA;AAAA;AAAA;ACuwBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAWG;;AAAA;AAAA;AACO;;AAZV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;AAcA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AA6BG;;;AAGqB;AAAA;AAAA;AAArB;;AAAA;;AAAA;AA/0BO;;;AAAA;AAEH;AAFG;AAAA;;;AAAA;AAGH;;AAHG;AAAA;;;AAAA;AAIH;;AAJG;AAAA;;;AAAA;AAKH;;AALG;AAAA;;;AAAA;AAMH;;AANG;AAAA;;;;AAWP;AAs0B4B;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAtuBrB;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAP;AAEI;;AAAA;AAAA;AAAA;;AA9BG;;;AAAA;;AAEH;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;;AAYP;AAoBG;AAAiB;AAAjB;AAAX;;;AACuB;;AAAA;;;AAAA;AAAJ;AAAP;AA6dG;AAAA;AAAA;AAAA;AAAA;AAAP;AACO;AAAA;;AAAA;AAAA;AAAA;AAAP;AAGgC;;AAAA;AAAA;AAAA;AAnCb;AAAA;;AAAA;;AACnB;AAGA;;AAAA;;AAAA;AAmC8B;;AAAA;;AAAA;AA9B1B;AAAA;;AAAA;AADJ;AAKA;;AAAA;;AAAA;AAEA;AAIQ;;AAFW;;AACF;;;;;;;;AAHjB;;;;;;AAAA;AA4BmB;AAAA;;AAAA;AAAnB;;AAAA;AAAA;AACA;;AAA4B;AAA5B;AAGA;;AAAA;;AAAA;AAG6B;AAAA;;AAAA;AAA7B;;AAAA;;AAAA;AACqB;;AAAA;;AAAA;AAArB;;AAAA;;AAAA;AACiC;;AAAA;AAAA;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;AAGA;;AAAA;;AAAA;AACoC;;AAAA;;;AAAA;AAApC;;AAAA;AAAA;AAC6B;;AAAA;;AAAA;AAA7B;;AAAA;AAAA;AAGwB;;AAAA;;AAAA;AAAxB;;AAAA;AAAA;AAG6B;;AAAA;AAAA;AAA7B;;AAAA;AAAA;AACiC;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;AACyB;;AAAA;;AAAA;AAAzB;;AAAA;AAAA;AAC6B;;AAAA;;AAAA;AAA7B;;AAAA;AAAA;AACwB;;AAAA;;AAAA;AAAxB;;AAAA;AAAA;AACsB;;AAAA;;AAAA;AAAtB;;AAAA;AAAA;AACuB;;AAAA;;AAAA;AAAvB;;AAAA;AAAA;AAC4B;;AAAA;;;AAAA;AAA5B;;AAAA;AAAA;AAC0B;;AAAA;;;AAAA;AAA1B;;AAAA;AAAA;AAGyB;;AAAA;;AAAA;AAAzB;;AAAA;AAAA;AAGoB;;AAAA;AAAA;AAApB;AAAA;AAAA;AAGiC;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;AACkC;;AAAA;;AAAA;AAAlC;;AAAA;AAAA;AAGA;;AAAyB;AAAzB;AACA;;AAA0B;AAA1B;AAEO;;AAA8B;;AAA9B;AAAP;AACqC;AAAA;AAAA;AAA9B;;AAAA;AAAP;AACO;AAAP;AA6MuB;;AAAA;;;AAAvB;;AAAA;AAAA;AACsB;;AAAA;;;AAAtB;;AAAA;AAAA;AACO;;AAvCV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;;;;;;;;AAyCA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAeG;;;AAGkB;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAnNX;AAAA;AAAA;AAAA;AAAA;AAAP;AACO;AAAwB;;AAAxB;AAAP;AAGO;AAAA;;AAAA;AAAA;AAAP;AAEc;AAAsB;;AAAtB;AAAA;AAOU;;AAAd;AADF;;AAAA;AAFR;AAAA;;;AAMQ;AACF;AAAA;;AAAA;AAAd;;;AACoB;;AAAA;;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AACW;AADX;AACW;AAAA;AAAA;;AAAA;;AACZ;AAAA;AAAA;AAAA;AAAA;;AAAkB;;AAAA;;AAAA;AAAlB;;AAAA;AAAP;AACA;;AAAA;;AAAA;;;AAGO;AAAA;;AAAA;AAAA;AAAA;;AAAP;AACZ;;;AACA;AAAA;;;AACmD;AAAQ;AAAR;AAAd;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAejB;;AAAA;AAAA;;AAAA;AADJ;AAGhB;;AAAA;;;AACuB;;AAAoB;AAApB;AAAP;AAGJ;AAAS;AAAT;AAAA;;;;;AAjBQ;;AAAA;AAAA;AAC4C;AAAtB;AAElB;AAAuB;;AAAvB;AAAA;AAAA;AAAA;AAAA;;AADJ;AAGgB;AAAA;AAAA;;AAAA;AAAA;AAChB;AAAA;AAE2B;AAAvB;AADa;;AAAA;AAAA;;AAAA;AAAA;;AAAA;;;;AA/sBV;;AAAA;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AA4tBR;;AAAA;;;AAEgB;;AAAA;;AAAA;AADJ;AAAA;AAAA;AAGA;AAAc;;AAAd;AAiKG;;AAvBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAn6BU;AAAA;AAAA;AAAA;AAAP;AAo8BA;;;AACA;;;AACA;;;AAEO;AAAA;AAAA;AAAA;AAAoB;AAAA;AAAA;AAAA;AAApB;;AAAA;AAAP;AACQ;;;AACD;AAAA;;;AAAA;AAAoB;;;AAApB;AAAP;AAIiB;;AAAA;;;AAEM;;AAAA;;;AACA;;AAAA;;;AACW;;AAAA;;;AAEC;;AAAA;;;AACD;;AAAA;;;AACC;;AAAA;;;AACrB;;AAAA;;;AAVV;;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAMkB;AANlB;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAFJ;;;AAAA;;AAeO;;AA9BV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;AAgCA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AA59BU;AAAA;AAAA;AAAA;AAAP;AA0+BA;;;AACA;;;AAEG;;AAAA;AAAA;AAAgB;;AAAhB;AAAX;;;AAn5Be;AAAA;;AAAA;AAAA;AAAsB;;AAAtB;AAo5BH;AACA;;;AAr5BG;AAAA;;AAAA;AAAA;AAAA;AAAsB;;AAAtB;AAwsBP;AACO;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAoB;AAAA;AAAA;AAAA;AAApB;AAAP;AAEwB;AAAA;;;AAAA;;AAAA;AAAA;AADxB;;;AAIuC;AAAA;AAAA;AAAA;AAzvBpB;;AAAZ;AA0vBA;;AAAA;;AACJ;AAAc;;AAAd;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAX;;;AACmB;;AAAA;AAAA;AAAA;;AAAA;AACJ;;AAAA;AAAA;AAAA;AAAA;AAAc;;AAAd;AAAP;AAKuB;;AAAA;AAAA;;;AACA;;AAAA;;;AACW;;AAAA;;;AACC;;AAAA;;;AACD;;AAAA;;;AACC;;AAAA;;;AAR/B;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AADJ;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAaA;;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAA6B;AAA7B;AAAA;AAAA;AAAA;AAuLmB;AAAA;AAAA;AAAA;AAAZ;;AAAA;AAAA;;AAAA;AAAP;AACQ;;;AAAA;AAAA;;AAEJ;AAAA;;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAxxBA;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;AAAA;;AAMH;;AANG;AAAA;;;;AAwxBP;AAGO;;AAAoB;;;AAApB;AAAP;AAhxBO;;AAAe;;AAAf;AAAA;;;AAAA;;AAAqC;;AAArC;AAAA;;;;AAixBf;;;AEvjCoC;;AAAe;;AAApC;;;AAAP;AF2jCA;;AAAA;;AAAA;;;AAAA;;AACO;;AAjCV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA+BO;;;;;;;;;;;;;;;;AAIP;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AA//BU;AAAA;AAAA;AAAA;AAAP;AAugCA;;;AACA;;;AACA;;;AAjhCO;AAAA;AAAA;AAAA;AAAe;;AAAf;AAYA;AAAP;AAsFO;AAAA;;AAAA;AAAA;AAAsB;;AAAtB;AA4uBP;AACO;AAAA;AAAA;AAAA;AAAA;;AAAoB;AAAA;AAAA;AAAA;AAApB;AAAA;;AAAA;AAAP;AACO;;AAAA;;;AAAA;AAAA;;AAAsB;;;AAAtB;AAAP;AACO;AAAA;;AAAA;AAAA;AAAA;;AAAgB;AAAhB;AAAP;AAER;;;AAEgB;AAAA;AAAA;AAAA;AAA4B;AAA5B;AADa;;;AAIb;;AAAA;AAAiC;;AAAA;;AAAA;AAAjC;AADJ;AAImC;AAAA;AAAA;AAAA;AApyBpB;;AAAZ;AAqyBA;;AAAA;;AACJ;AAAc;;AAAd;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAX;;;AACmB;;AAAA;AAAA;AAAA;;AAAA;AACJ;;AAAA;AAAA;AAAA;AAAA;AAAc;;AAAd;AAAP;AAKuB;;AAAA;AAAA;;;AACA;;AAAA;;;AACW;;AAAA;;;AACC;;AAAA;;;AACD;;AAAA;;;AACC;;AAAA;;;AAR/B;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AADJ;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAaA;;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAA6B;AAA7B;AAAA;AAAA;AAAA;AAuKO;;AAdV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA//BU;AAAA;AAAA;AAAA;AAAP;AAAA;AAohC6B;AAAA;;AAAA;AAAA;AAAX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAEF;AAAA;;AAAA;AAAA;AACS;AAAA;;AAAA;AAAA;AACG;AAAA;;AAAA;AAAA;AACX;AAAA;AAAA;AAAA;AACQ;AAAA;AAAA;AAAA;AACC;AAAA;;AAAA;AAAA;AACI;AAAA;;AAAA;AAAA;AACJ;AAAA;;AAAA;AAAA;AACL;AAAA;;AAAA;AAAA;AACS;AAAA;;AAAA;AAAA;AACC;AAAA;;AAAA;AAAA;AACT;AAAA;;AAAA;AAAA;AACC;AAAA;;AAAA;AAAA;AAfhB;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAJV;AAAA;AAAA;AAAA;AAAA;AAAA;AA/gCU;AAAA;AAAA;AAAA;AAAP;AAyiCG;AAAA;AAAA;AAAA;AAAqB;AAAA;AAAA;AAAA;AAArB;AAAX;;;AAEyB;AAAA;AAAA;AAAA;AADN;AAEQ;;AAFR;AAGY;AAHZ;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AALd;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBmC;AAAA;AAAA;AAAA;AAAzB;;;AAhBV;;;AExhCG;;;AARH;AAAA;AAUA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAWG;;;AACA;;AAAA;AAAA;AACO;;AAbV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAeA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAWG;;;AACA;;AAAA;AAAA;AACO;;AAbV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAeA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAsBG;;;AACA;;;AACwB;AAAA;;AAAxB;;;AA9Gc;;AAAX;AAAX;;;AACY;;AAAA;;AAAA;AA+GG;;AA1BV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAlFM;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAyGJ;;;AAvGG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAqGJ;;;AAnGG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAiGJ;;;AA/FG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AA6FJ;;;AA3FG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;;;;AA4FP;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAmBG;;;AACA;;;AACwB;AAAA;;AAAxB;;;AA9GO;AAAW;;AAAX;AAAP;AACc;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AA6GG;;AAvBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AApFM;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAwGJ;;;AAtGG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAoGJ;;;AAlGG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAgGJ;;;AA9FG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;;;;AA+FP;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AApK+B;;AAAgB;;AAArC;;;AAAP;AAoLA;;AAAA;AAAA;AACO;;AAjBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BU;AAAA;;AAAA;AAAA;AARV;AAAA;AAAA;AAAA;AAAA;AAAA;AAUA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAc4B;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AAlBP;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAcU;AACP;AAAA;;;AAES;;;;;;;;AADT;;AAAA;;;;;;;;;;;;;;AA+BQ;AAJI;;AAvRL;;AAAA;AAAA;AAAA;AAAA;;AAsRC;AAGO;AAAA;AA7ClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAsCe;;AAlRL;;AAAA;AAAA;AAAA;AAAA;;AAiRC;AAGO;AAAA;AAxClB;;;AAiCe;;AA7QL;;AAAA;AAAA;AAAA;AAAA;;AA4QC;AAGO;AAAA;AAnClB;;;AA4Be;;AAxQL;;AAAA;AAAA;AAAA;AAAA;;AAuQC;AAGO;AAAA;AA9BlB;;;AAuBe;;AAnQL;;AAAA;AAAA;AAAA;AAAA;;AAkQC;AAGO;AAAA;AAzBlB;;;AAkBkB;;;;;;;;;;;;;;;;;;AAlBlB;;;AHzQD;;;AAEe;;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAJ;AAAP;;AAgBJ;;;AApB8B;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAqCW;AAAA;AAAA;AAIM;AAAA;;AAAA;AAAA;AAAiC;;AAAA;;AAAA;AAAjC;AAEb;AAAA;;AAAA;AAAA;AAAkC;;AAAA;;AAAA;AAAlC;AAMgB;;AAAA;AAAA;AAAgB;AAAA;;AAAA;AAAA;AADf;;AAAA;;AAAA;;AAAA;;;AAIgB;AAAA;;AAAA;AAAA;AADf;;AAAA;;AAAA;;AAAA;;;AAMtB;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAI+B;AAAA;;AAAA;AAAA;AAA/B;AAAA;;AACgC;AAAA;;AAAA;AAAA;AAAhC;AAAA;;AAG0B;AAAA;AAAA;AAAA;AAA1B;AAAA;;AAIA;;AAAA;AAAA;AACA;AAEJ;;;;;;AAzE8B;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AC+GO;AAAA;AAAA;AAAA;AAAe;;AAAf;ADnCf;;;AACY;AAEO;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AACR;;AAAA;AAAA;AAAA;;AAAX;;;AACY;AAGJ;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAC0B;AAA1B;AAAA;;AACA;;AAAA;AAAA;AACO;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;AAAA;AAAA;;AAAA;AAAA;;ACyCJ;;;AAIO;;AAAA;;;AAAA;;AAAA;;;AACQ;AAAP;AACQ;;AAAA;;AAAA;AACL;;AAAA;AAAP;AAEJ;;;AAEJ;;AAAA;;;AACmB;AAAP;AACG;AAAA;;AAAA;AAAA;AAAP;AAAA;AACoC;AAAA;;AAAA;AAAA;AAA7B;;AAAA;AAAA;;AAAA;;;AAAP;AAEJ;;;AAOJ;;AAAA;;;AACmB;AAAP;AAEA;AAAA;;AAAA;AAAA;AAEA;AAAA;;AAAA;AAAA;AAHG;;AAAA;AAAA;;;AAAP;AAwBJ;;;AAEsB;AAAA;AAAA;AAAA;AAAX;;AAAA;AAAP;AAdO;;AAAY;;AAAZ;AAgBA;AAAc;;AAAd;AAAA;AAAA;AAAA;AAAA;;AAAP;AAZO;;AAAW;;AAAX;AAeS;;AAAA;AAAA;;AAAA;AAAA;AAAT;;AAAA;AAAP;AACO;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAP;AAuGJ;;;AA1DO;;AARC;AAQD;AAAA;;;AAAA;;AAPC;AAOD;AAAA;;;AAAA;;AANC;;AAMD;AAAA;;;AAAA;;AALC;;AAKD;AAAA;;;AAAA;;AAJC;;AAID;AAAA;;;AACQ;AA6DX;;AA1DR;;AAAA;;;AAEmB;AAwDJ;;;AAtDJ;;AAAiB;;AAAjB;AAAA;;;AAAyC;;AAAiB;;AAAjB;AAAzC;;;AAIQ;;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;;AAkDJ;;;;AAAA;;;AA7CJ;;AAAiB;AAAjB;AAAX;;;AAEmB;;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;;AA2CJ;;;;AAAA;;;AArCJ;;AAAiB;;AAAjB;AAAX;;;AAEmB;;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;;AAmCJ;;;;AAAA;;;AA5BJ;;AAAiB;;AAAjB;AAAX;;;AAEmB;;AAAc;;AAAd;AA0BJ;;;AAxBA;AAwBA;;;AAkBH;AAAA;;AAAA;AAAA;AAAsB;AAAtB;AAAA;;;AACI;AAAA;;AAAA;AAAA;AADJ;;;;AADJ;;AAAA;AA8CJ;;;AASQ;;AAAA;;AAAA;AAAA;AAAA;;;AACG;AAAA;;AAAA;AAAA;AADH;;;AAEG;AAAA;;AAAA;AAAA;AAFH;;;AAIO;AAAP;;AAAA;;AAAA;AAEA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAHM;;;AAQN;AAAA;;AAAA;AAAA;AAHG;;AAAA;AAAA;;;AAAP;;AAAA;;AAAA;AA+DJ;;;AAMJ;;AAAA;;;AACY;;AAAA;AACU;AAAA;;AAAA;AAAA;AACV;AAAA;;AAAA;AAAA;AADmC;;AAAA;;AAAA;;;AAAzB;AAKd;AAAA;AAGI;AAAA;;AAAA;AAAA;AAFG;;AAAA;AAAA;;AAAA;;;AAAP;AAyIJ;;;;;;;;AAUW;;AAAA;AAAA;AAAkB;AAAA;AAAA;AAAA;AAAlB;AAAP;AACO;;AAAA;;AAAA;AAAwB;;AAAxB;AAAP;AAEa;;AAAA;AAAA;AAAA;AACI;AAAd;AAAA;AAAX;;;AA5ee;AAAA;AAAA;AAAA;AAAe;;AAAf;AA+eH;AAEI;AAAA;;AAAA;AAAA;AAA6B;AAAA;;AAAA;AAAA;AAA7B;AADJ;AAG6B;;AAAA;;AAAA;AAA7B;;AAAA;;AAAA;AACA;;AAAA;AAAA;AAC6B;;AAAA;;AAAA;AAA7B;;AAAA;AAAA;AACA;;AAAwB;AAAxB;AACiC;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAqB;AAArB;AAAA;AAAA;AAAA;AACA;AAAc;;AAAd;AA7LJ;;AAAA;AACO;AAAA;;AAAA;AAAA;AA6LH;;AAAA;AAGmB;AAHnB;;;;AAAA;;AAKA;;AAAA;;AAAA;;AAAA;AA/fG;AAAA;AAAA;AAAA;AAAe;;AAAf;AAYA;AAAP;AAsfA;AAAA;;AAAA;AAAA;AAAyB;;AAAA;;;AAAA;;AAAzB;AAAA;;AAAA;AAAA;AAEG;;AAAc;;AAAd;AAAX;;;AAIgB;;AAAA;;AAAA;AACA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAHY;;;AAMI;AAAA;;AAAA;AAAA;AAAhB;AAAA;;AAiFL;AAAA;;AAAA;AAAA;AAAA;;;AAAqC;AAAA;;AAAA;AAAA;AAAP;;AAAA;AAA9B;;;AACQ;AAAA;;AAAA;AAAA;AAAA;;AAAA;AACR;AAAA;;AAAA;AAAA;AAAA;;;AAAmC;AAAA;;AAAA;AAAA;AAAP;;AAAA;AAA5B;;;AACQ;AAAA;;AAAA;AAAA;AAAA;;AAAA;AArFP;;AAAA;;AAAA;AAYD;;AAAc;;AAAd;AAAX;;;AACyC;;AAAA;;AAAA;AAA7B;;AAAA;;AAAA;AACA;;AAAA;AAAA;AAKD;;;AAAX;;;AACe;;AAAc;;AAAd;AAAf;;;AAI2B;AAAA;AAAA;AAAA;AAA4B;AAAA;AAAA;AAAA;AAA5B;AACD;;AADA;AADF;;AAAA;AAFR;AAAA;;;AA9LU;AAAA;;AAAA;AAAA;AAAA;;AAAA;AACJ;AAAd;;AACwB;AAAxB;;AAEG;;AAAA;;AAAA;AAAA;AAAA;;AAAX;;;AAE8B;;AAAA;;AAAA;;;AAAA;AAAA;;AAKM;AAAxB;;;;AAEc;AAAA;AAAA;AAAA;AAAoB;AAApB;AAAA;;AACM;AAAA;AAAA;AAAA;AAAlB;;AAAA;AAAd;;;AAC2B;;AAAA;;;AAAA;AAAA;;AACK;AAAA;AAAA;AAAA;;AAEuB;;AAArB;AAAA;;;AAClB;;AAAqB;;AAArB;AAAA;;;AACI;;AAAA;;AAAA;AADJ;;;;AAGhB;;;AACA;;AAAA;;;AAC4C;AAAxB;;AAOR;;AAAmB;AAAnB;AAAA;;;;;AAHY;;AAAA;;AAAA;AAFc;;AAAA;AAAA;;;AAAA;AAAA;;AAIlB;;AAAA;AAAA;;;;;;;;;AAGZ;;AAAA;AACY;AAAA;;AAAA;AAAA;AACT;;AAAA;;AAAA;AAAc;AAAd;AAAX;;;AAEyB;AAAA;;AAAA;AAAA;AAAb;AAGA;AAAA;;AAAA;AAAA;AAFG;;AAAA;;;AA+JC;;AAAA;AAAA;AAKR;AAAA;AAAA;AAAA;AAAqB;AAArB;AAAA;AAAA;AAAA;AACA;;AAEW;AACQ;AAHnB;;;;AAAA;;;;;;;;;AAFqC;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;;;;AAjBC;;AAAc;;AAAd;AAAb;;;AAE6C;AAAA;;AAAA;AAAA;AAAjC;;AAAA;AAAA;;;;AAdC;;AAAc;;AAAd;AAAb;;;AACwB;;AAAA;;AAAA;AAAA;AAAA;;AACxB;;;AAC4B;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAChB;;AAAA;;AAAA;;;;AAEG;;AAAA;;AAAA;AAAA;AAAA;;AAAf;;;AACgB;;AAAA;;AAAA;;;;AAkCZ;;;AAUwB;;AACH;;AAAA;AAAA;AACE;;AAAA;;;AACI;;AAAA;;;AACJ;;AAGW;;AALX;AAKW;AA6BtC;;AAAA;;;AACmB;AA/BS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAIA;AAAA;;AAAA;AAAA;AACH;;AAAA;AAAiB;AAAjB;AAZb;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AADJ;;;;;;AAAA;AAAA;AAAA;;;;;;AAwCG;;AAAe;AAAf;AAAA;;;AAAA;;AAAsC;;AAAtC;AAAA;;;AACQ;AAhCC;;;AAiCL;;;AAjCK;;;AEvpBhB;;;;;AAFW;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAGA;;;AACH;;AAAA;AAAA;AAAA;AAAA;AACG;;AAAA;AAAA;;AADH;AAAA;;;AAEG;;AAAA;AAAA;AAAA;AAAA;AADA;;AAAA;AADH;;;;AADJ;;AAAA;;;;;AAOyB;;AAbF;AAAA;;AAAA;AAAA;AAAhB;AAaP;;AAkBW;AAAA;;AAAA;AAAA;AAAJ;AAAP;;AAGW;AAAA;;AAAA;AAAA;AAAJ;AAAP;;AAEJ;;;AACW;;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;AAAA;;AAMH;;AANG;AAAA;;;AAAA;;AAOH;;AAPG;AAAA;;;;AAAP;;;", + "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AG4BmD;;AAAf;;AAA5B;AAC4C;;AAAf;;AAA7B;AAkBA;;AAAuB;AAAvB;AACA;;AAAuB;AAAvB;AFQA;AAAc;AAAd;AACA;;AAAqB;AAArB;AAGA;;AAAuB;;AAAvB;AACA;;AAAsB;;AAAtB;AAGA;;AAA6B;AAA7B;AACA;;AAA2B;AAA3B;AAGA;;AAA6B;AAA7B;AACA;;AAAqB;AAArB;AACA;;AAA6B;AAA7B;AACA;;AAA6B;AAA7B;AAGA;;AAA4B;AAA5B;AAGA;;AAAmB;AAAnB;AACA;;AAA4B;AAA5B;AAGA;;AAA+B;AAA/B;AACA;;AAA6B;AAA7B;AACA;;AAAiC;AAAjC;AACA;;AAAoC;AAApC;AAGA;;AAAiC;AAAjC;AACA;;AAAwB;AAAxB;AAGA;;AAA6B;AAA7B;AACA;;AAAyB;AAAzB;AACA;;AAA6B;AAA7B;AACA;;AAAwB;AAAxB;AACA;;AAAsB;AAAtB;AACA;;AAAuB;AAAvB;AACA;;AAA4B;AAA5B;AACA;;AAA0B;AAA1B;AAGA;;AAA0B;AAA1B;AACA;;AAAyB;AAAzB;AAGA;;AAAiC;AAAjC;AACA;;AAAkC;AAAlC;AAQA;AAAoB;AAApB;AACA;AAA4B;AAA5B;AAGA;;AAAyB;AAAzB;AIhGO;;AAA6B;;AAA7B;AAAP;AACO;;AAAuB;;AAAvB;AAAP;AACO;;AAAA;AAAP;AACO;;AAAA;AAAP;AAlBR;;;;;;AAAA;;;AAAA;;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;;;;;;AAAA;;;AAAA;;;;AAAA;AF4IK;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ADrGA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ADgGU;AAAA;AAAA;AAAA;AAAP;AC3EA;;;AACA;;;AACA;;;ADiEO;AAAA;AAAA;AAAA;AAAe;;AAAf;AAYA;AAAP;AC3EG;;;AAAX;;;AAIsB;AACA;;AADA;AADF;;AAAA;AAFR;AAAA;;;AAQe;AAAnB;;AACkB;AAAlB;;AACmB;AAAnB;;AAGI;;AAAA;;AAAA;AAAA;;;AACI;AAAA;AAAA;AAAA;AAAoB;AAAA;AAAA;AAAA;AAApB;AADJ;;;AAGiC;AAAA;AAAA;AAAA;AAAzB;;;AAAA;AAAA;;AACL;;AAAA;AAAA;AAAA;;AAAuB;;AAAvB;AAAf;;;AAEuC;;AAAA;AAAA;AAAA;AAAA;;ADmQ3B;AADG;AAAA;AAAA;;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;;AClQA;;;ADwcA;;AAAA;AAAA;AAAkB;AAAA;AAAA;AAAA;AAAlB;AAAP;AACO;;AAAwB;;AAAxB;AAAP;AAxIG;;AAAA;;;AAAA;;AAAyC;;AAAzC;AAAA;;;AACQ;;;AAYE;;AAAA;AAAA;AAAA;AAAA;;AACS;;AAAnB;AAAA;;;AAAA;;AAAyC;;AAAzC;AAAA;;;AACQ;;;AA6HkB;;AAAA;;AAAA;AAAA;;AAG1B;;;AAAX;;;;;;;AAkB+B;;AAAA;;;AACC;;AAAA;;;AACN;;AAAA;;;AAAA;AAAA;;AAAA;;AACC;AAAA;;;AAAA;AAAA;;AACD;;AAAA;;AAAA;AAAA;AAAA;;AA4JyB;;AAAjC;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAtRH;AAAA;;AAAA;AAAA;AAAyB;AAAA;;AAAA;AAAA;AAAzB;;AAAA;AAwRA;;AAAA;;AAAA;AAAP;AACO;;AAAA;AAAA;AA7JH;;AAAA;AADJ;AAIA;;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AACG;;AAAA;AAAA;AAAgC;;AAAhC;AAAX;;;AAEY;AAAA;;AAAA;AAAA;AAAyB;;AAAA;;;AAAA;;AAAzB;AAAA;;AAAA;AAAA;AAGG;;;AAAJ;;;AAAkC;;AAAA;AAAA;AAAgC;;AAAhC;AAAlC;;;AAGkC;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;AACJ;;AAAA;;AAAA;AACA;;AAAA;;AAAA;AACA;AAAA;AAAA;AAAA;AAAqB;AAArB;AAAA;AAAA;AAAA;AAEG;;AAAA;;;AAAoB;;;AAApB;AAAA;;;AAEG;AAAA;;AAAA;AAAA;AAFH;;;AAGC;AAAc;;;AAAd;AACA;;AAAiC;AAAjC;AAEJ;;AAAA;;AAAA;AAAA;;;AAAA;AC9fI;;AAAA;;AAAA;AAAA;;AACA;;AAAA;;AAAA;AAAA;;AACA;;AAAoB;AAApB;AAAA;;;;;AD6eA;;AAAwB;AAAxB;;;;AAlCa;;AAAA;AAAA;AAAA;AAAA;;AAGI;;AAAd;AAAf;;;AAEoB;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;;;;;;AAGH;;AAAc;AAAd;AAAjB;;;AAC6C;AAAA;;AAAA;AAAA;AAAA;;AAAA;AACR;AAAA;;AAAA;AAAA;AAAA;;AAAA;;;;AACpB;;AAAc;;AAAd;AAAjB;;;;;;;AAAA;;;AAC6C;AAA7B;;AACqB;AAArB;;;;;AA7IL;;;AAAX;;;AACe;;AAAc;;AAAd;AAAf;;;AACuB;AAAA;;AAAA;AAAA;;;AAyHQ;;;AAxHJ;AAAA;;AAAA;AAAA;AAAwB;;AAAA;;;AAAA;;AAAxB;AAAA;AAAA;;AACZ;AAAA;;AAAA;AAAA;AAAA;AAAf;;;AACuB;;;AAsHQ;;;AArHA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AACG;AAAA;;AAAA;AAAA;AAAnB;AAAf;;;AACuB;AAAA;;AAAA;AAAA;;;AAmHQ;;;;;;;AAAA;;;AAhHnB;;AAAA;;AAAA;AAAoC;AAAA;;AAAA;AAAA;AAApC;AAAA;AADJ;AAGO;AAAA;;;AA8GgB;;;AAzIhB;AAAA;;AAAA;AAAA;AAAwB;;AAAA;;;AAAA;;AAAxB;;;AAwIe;;;ACnctB;;AAAA;AAAA;AAIiB;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAEH;;AALP;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAtDV;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;;;AA8DA;;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;ADkCU;AAAA;AAAA;AAAA;AAAP;ADvH0B;;AAAnB;AAAA;AAAA;AAAA;AAAA;;AAAP;AETG;AAAA;;AAAA;AAAA;AAAwB;;AAAxB;AAAX;;;AAEgB;;AAAc;AAAA;;AAAA;AAAA;AAAd;AAAA;;;AACG;;AAAA;;AAAA;AADH;;;AAEG;;AAAc;;AAAA;AAAA;AAAA;;;AAAd;AAFH;;;;AADJ;AA2HJ;;;AACA;;;ADLO;AAAA;AAAA;AAAA;AAAe;;AAAf;AAYA;AAAP;ACJA;;AAAA;AAAA;;;AACA;;;;;AF3BI;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AACE;AAAA;;AAAA;AAAA;AAAA;;AADF;;AAAA;AAAA;AAAA;;AE6BJ;AAzHI;;;AACI;AAAA;;AAAA;AAAA;AADJ;;AAAA;;AAAA;;;AAGQ;AAAA;AAAA;AAAA;;;AAAA;AAAJ;;;;AA2HhB;;;AArH6C;;AAAjC;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AADJ;AAwHc;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAjHd;AAIQ;;;;;;;;;;;;;AAJR;;;;;;AAAA;AFsFkB;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AACC;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAGW;AAA9B;AAAA;AAAA;;AAAA;;AACA;AAAA;;AACA;;AAAA;AAAA;AAEO;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACO;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAP;AAGA;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AEoBiB;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AACH;;AAJP;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;;;;AAAA;AAAA;AAAA;AA/CV;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;;;AEvFA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBG;;;AACO;AAAA;AAAP;AAEA;;AAAA;;AAAA;AACA;;AAAA;AAAA;AACO;;AAvBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAyBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AHgGU;AAAA;AAAA;AAAA;AAAP;AExE4B;;AAAqB;;AAA1C;;;AAAP;ACKA;;;AACA;;;AH0DO;AAAA;AAAA;AAAA;AAAe;;AAAf;AGzDP;AJtD0B;;AAAnB;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAP;AIwDA;AAAA;;;AACA;AAAA;AAEI;AAAA;;AAAA;AAAA;AAAA;AAAqC;AAAA;;AAAA;AAAA;AAArC;AADJ;AAGG;AAAA;;AAAA;AAAA;AAAX;;;AAEgB;;AAA2B;AAAA;;AAAA;AAAA;AAA3B;AADJ;AJ8DJ;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AIzDA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AACO;AAAA;;AAAA;AAAA;AAAA;AAAA;AA7CV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AA+CA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AHiDU;AAAA;AAAA;AAAA;AAAP;AGbA;;;AACA;;;AHIO;AAAA;AAAA;AAAA;AAAe;;AAAf;AAYA;AAAP;AGtIG;AAAA;;AAAA;AAAA;AAAX;;;AAEgB;AAAA;;AAAA;AAAA;AAA8B;;AAA9B;AADJ;AAGD;AAAA;;AAAA;AAAA;AAAX;;;AAEgB;;AAA0B;AAAA;;AAAA;AAAA;AAA1B;AADJ;AAqHG;;AAAA;;AAAA;AAAA;;AAAA;AAAP;AJ/G0B;;AAAnB;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAP;AAA0B;;AAAnB;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAP;AIkHA;;AAAA;;;AACA;AAAA;;;AACO;;AAAA;AAAP;AACA;;AAAA;AAAA;AACgB;AAAA;AAAA;AAAA;AAAA;AAAT;AAAP;AH6mBG;AAAA;AAAA;AAAA;AAAqB;AAAA;AAAA;AAAA;AAArB;AAAX;;;AAE8C;AAAA;AAAA;AAAA;AAAzB;;;AAET;;AAAA;AAA4B;;AAA5B;AADJ;AG7mBA;;AAAA;AAAA;;;AACA;;AAAA;AAAA;;AAAA;;;AACA;;;;;AACA;;;;;AJIgB;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAT;;AAAA;AAAA;;AAAA;;AAAA;AAAP;AACA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AATA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AIlDH;AAAA;;AAAA;AAAA;AAAA;AAAA;AJuEA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AGxF+B;;AAAgB;;AAArC;;;AAAP;AHrD0B;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAiKA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AACO;;AArBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AGxH+B;;AAAsB;;AAA3C;;;AAAP;AFuEO;AAAA;AAAA;AAAA;AAAe;;;AAAf;ADuEA;AAAP;AACA;;;AACA;;;AAC8B;;AAAvB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AAnLU;AAFH;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAsLP;AACO;;AA3BV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA6BA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAjM6B;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAsNO;;AAAA;;AAAA;AAAP;AACA;;;AACA;;;AACA;AAAA;;AAAA;AACO;;AAzBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA5N6B;;AAAnB;AAAA;AAAA;AAAA;AAAA;;AAAP;AA2OO;AAAA;AAfV;AAAA;AAAA;AAAA;AAAA;AAAA;ACuwBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAcG;;AAAA;AAAA;AACO;;AAfV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;AAiBA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AA8BG;;;AAGqB;AAAA;AAAA;AAArB;;AAAA;;AAAA;AAn1BO;;;AAAA;AAEH;AAFG;AAAA;;;AAAA;AAGH;;AAHG;AAAA;;;AAAA;AAIH;;AAJG;AAAA;;;AAAA;AAKH;;AALG;AAAA;;;AAAA;AAMH;;AANG;AAAA;;;;AAWP;AA00B4B;AAAA;;AAAA;AAAA;AAAA;;AAAA;AA1uBrB;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAP;AAEI;;AAAA;AAAA;AAAA;;AA9BG;;;AAAA;;AAEH;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;;AAYP;AAoBG;AAAiB;AAAjB;AAAX;;;AACuB;;AAAA;;;AAAA;AAAJ;AAAP;AA6dG;AAAA;AAAA;AAAA;AAAA;AAAP;AACO;AAAA;;AAAA;AAAA;AAAA;AAAP;AAGgC;;AAAA;AAAA;AAAA;AAnCb;AAAA;;AAAA;;AACnB;AAGA;;AAAA;;AAAA;AAmC8B;;AAAA;;AAAA;AA9B1B;AAAA;;AAAA;AADJ;AAKA;;AAAA;;AAAA;AAEA;AAIQ;;AAFW;;AACF;;;;;;;;AAHjB;;;;;;AAAA;AA4BmB;AAAA;;AAAA;AAAnB;;AAAA;AAAA;AACA;;AAA4B;AAA5B;AAGA;;AAAA;;AAAA;AAG6B;AAAA;;AAAA;AAA7B;;AAAA;;AAAA;AACqB;;AAAA;;AAAA;AAArB;;AAAA;;AAAA;AACiC;;AAAA;AAAA;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;AAGA;;AAAA;;AAAA;AACoC;;AAAA;;;AAAA;AAApC;;AAAA;AAAA;AAC6B;;AAAA;;AAAA;AAA7B;;AAAA;AAAA;AAGwB;;AAAA;;AAAA;AAAxB;;AAAA;AAAA;AAG6B;;AAAA;AAAA;AAA7B;;AAAA;AAAA;AACiC;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;AACyB;;AAAA;;AAAA;AAAzB;;AAAA;AAAA;AAC6B;;AAAA;;AAAA;AAA7B;;AAAA;AAAA;AACwB;;AAAA;;AAAA;AAAxB;;AAAA;AAAA;AACsB;;AAAA;;AAAA;AAAtB;;AAAA;AAAA;AACuB;;AAAA;;AAAA;AAAvB;;AAAA;AAAA;AAC4B;;AAAA;;;AAAA;AAA5B;;AAAA;AAAA;AAC0B;;AAAA;;;AAAA;AAA1B;;AAAA;AAAA;AAGyB;;AAAA;;AAAA;AAAzB;;AAAA;AAAA;AAGoB;;AAAA;AAAA;AAApB;AAAA;AAAA;AAGiC;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;AACkC;;AAAA;;AAAA;AAAlC;;AAAA;AAAA;AAGA;;AAAyB;AAAzB;AACA;;AAA0B;AAA1B;AAEO;;AAA8B;;AAA9B;AAAP;AACqC;AAAA;AAAA;AAA9B;;AAAA;AAAP;AACO;AAAP;AAiNuB;;AAAA;;;AAAvB;;AAAA;AAAA;AACsB;;AAAA;;;AAAtB;;AAAA;AAAA;AACO;;AAxCV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;;;;;;;;AA0CA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAgCG;;;AAGkB;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAxOX;AAAA;AAAA;AAAA;AAAA;AAAP;AACO;AAAwB;;AAAxB;AAAP;AAGO;AAAA;;AAAA;AAAA;AAAP;AAEc;AAAsB;;AAAtB;AAAA;AAOU;;AAAd;AADF;;AAAA;AAFR;AAAA;;;AAMQ;AACF;AAAA;;AAAA;AAAd;;;AACoB;;AAAA;;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AACW;AADX;AACW;AAAA;AAAA;;AAAA;;AACZ;AAAA;AAAA;AAAA;AAAA;;AAAkB;;AAAA;;AAAA;AAAlB;;AAAA;AAAP;AACA;;AAAA;;AAAA;;;AAGO;AAAA;;AAAA;AAAA;AAAA;;AAAP;AACZ;;;AACA;AAAA;;;AACmD;AAAQ;AAAR;AAAd;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAejB;;AAAA;AAAA;;AAAA;AADJ;AAGhB;;AAAA;;;AACuB;;AAAoB;AAApB;AAAP;AAGJ;AAAS;AAAT;AAAA;;;;;AAjBQ;;AAAA;AAAA;AAC4C;AAAtB;AAElB;AAAuB;;AAAvB;AAAA;AAAA;AAAA;AAAA;;AADJ;AAGgB;AAAA;AAAA;;AAAA;AAAA;AAChB;AAAA;AAE2B;AAAvB;AADa;;AAAA;AAAA;;AAAA;AAAA;;AAAA;;;;AA/sBV;;AAAA;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AA4tBR;;AAAA;;;AAEgB;;AAAA;;AAAA;AADJ;AAAA;AAAA;AAGA;AAAc;;AAAd;AAsLG;;AAxCV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAv6BU;AAAA;AAAA;AAAA;AAAP;AAw+BA;;;AACA;;;AACA;;;AAEO;AAAA;AAAA;AAAA;AAAoB;AAAA;AAAA;AAAA;AAApB;;AAAA;AAAP;AACQ;;;AACD;AAAA;;;AAAA;AAAoB;;;AAApB;AAAP;AAIiB;;AAAA;;;AAEM;;AAAA;;;AACA;;AAAA;;;AACW;;AAAA;;;AAEC;;AAAA;;;AACD;;AAAA;;;AACC;;AAAA;;;AACrB;;AAAA;;;AAVV;;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAMkB;AANlB;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAFJ;;;AAAA;;AAeO;;AA7CV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;AA+CA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAhgCU;AAAA;AAAA;AAAA;AAAP;AAqiCA;;;AACA;;;AAEG;;AAAA;AAAA;AAAgB;;AAAhB;AAAX;;;AA98Be;AAAA;;AAAA;AAAA;AAAsB;;AAAtB;AA+8BH;AACA;;;AAh9BG;AAAA;;AAAA;AAAA;AAAA;AAAsB;;AAAtB;AAwsBP;AACO;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAoB;AAAA;AAAA;AAAA;AAApB;AAAP;AAEwB;AAAA;;;AAAA;;AAAA;AAAA;AADxB;;;AAIuC;AAAA;AAAA;AAAA;AAzvBpB;;AAAZ;AA0vBA;;AAAA;;AACJ;AAAc;;AAAd;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAX;;;AACmB;;AAAA;AAAA;AAAA;;AAAA;AACJ;;AAAA;AAAA;AAAA;AAAA;AAAc;;AAAd;AAAP;AAKuB;;AAAA;AAAA;;;AACA;;AAAA;;;AACW;;AAAA;;;AACC;;AAAA;;;AACD;;AAAA;;;AACC;;AAAA;;;AAR/B;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AADJ;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAaA;;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAA6B;AAA7B;AAAA;AAAA;AAAA;AAkPmB;AAAA;AAAA;AAAA;AAAZ;;AAAA;AAAA;;AAAA;AAAP;AACQ;;;AAAA;AAAA;;AAEJ;AAAA;;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAn1BA;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;AAAA;;AAMH;;AANG;AAAA;;;;AAm1BP;AAGO;;AAAoB;;;AAApB;AAAP;AA30BO;;AAAe;;AAAf;AAAA;;;AAAA;;AAAqC;;AAArC;AAAA;;;;AA40Bf;;;AElnCoC;;AAAe;;AAApC;;;AAAP;AFsnCA;;AAAA;;AAAA;;;AAAA;;AACO;;AAxDV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsDO;;;;;;;;;;;;;;;;AAIP;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AA1jCU;AAAA;AAAA;AAAA;AAAP;AAulCA;;;AACA;;;AACA;;;AAjmCO;AAAA;AAAA;AAAA;AAAe;;AAAf;AAYA;AAAP;AAsFO;AAAA;;AAAA;AAAA;AAAsB;;AAAtB;AA4uBP;AACO;AAAA;AAAA;AAAA;AAAA;;AAAoB;AAAA;AAAA;AAAA;AAApB;AAAA;;AAAA;AAAP;AACO;;AAAA;;;AAAA;AAAA;;AAAsB;;;AAAtB;AAAP;AACO;AAAA;;AAAA;AAAA;AAAA;;AAAgB;AAAhB;AAAP;AAER;;;AAEgB;AAAA;AAAA;AAAA;AAA4B;AAA5B;AADa;;;AAIb;;AAAA;AAAiC;;AAAA;;AAAA;AAAjC;AADJ;AAImC;AAAA;AAAA;AAAA;AApyBpB;;AAAZ;AAqyBA;;AAAA;;AACJ;AAAc;;AAAd;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAX;;;AACmB;;AAAA;AAAA;AAAA;;AAAA;AACJ;;AAAA;AAAA;AAAA;AAAA;AAAc;;AAAd;AAAP;AAKuB;;AAAA;AAAA;;;AACA;;AAAA;;;AACW;;AAAA;;;AACC;;AAAA;;;AACD;;AAAA;;;AACC;;AAAA;;;AAR/B;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AADJ;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAaA;;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAA6B;AAA7B;AAAA;AAAA;AAAA;AAuPO;;AAnCV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA1jCU;AAAA;AAAA;AAAA;AAAP;AAAA;AA4mC6B;AAAA;;AAAA;AAAA;AAAX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAEF;AAAA;;AAAA;AAAA;AACS;AAAA;;AAAA;AAAA;AACG;AAAA;;AAAA;AAAA;AACX;AAAA;AAAA;AAAA;AACQ;AAAA;AAAA;AAAA;AACC;AAAA;;AAAA;AAAA;AACI;AAAA;;AAAA;AAAA;AACJ;AAAA;;AAAA;AAAA;AACL;AAAA;;AAAA;AAAA;AACS;AAAA;;AAAA;AAAA;AACC;AAAA;;AAAA;AAAA;AACT;AAAA;;AAAA;AAAA;AACC;AAAA;;AAAA;AAAA;AAfhB;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAZV;AAAA;AAAA;AAAA;AAAA;AAAA;AA/lCU;AAAA;AAAA;AAAA;AAAP;AAyoCG;AAAA;AAAA;AAAA;AAAqB;AAAA;AAAA;AAAA;AAArB;AAAX;;;AAEyB;AAAA;AAAA;AAAA;AADN;AAEQ;;AAFR;AAGY;AAHZ;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAbd;AAAA;AAAA;AAAA;AAAA;AAAA;AAwBmC;AAAA;AAAA;AAAA;AAAzB;;;AAxBV;;;AE1mCG;;;AAdH;AAAA;AAgBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAcG;;;AACA;;AAAA;AAAA;AACO;;AAhBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAcG;;;AACA;;AAAA;AAAA;AACO;;AAhBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAsBG;;;AACA;;;AACwB;AAAA;;AAAxB;;;AA1Hc;;AAAX;AAAX;;;AACY;;AAAA;;AAAA;AA2HG;;AA1BV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA9FM;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAqHJ;;;AAnHG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAiHJ;;;AA/GG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AA6GJ;;;AA3GG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAyGJ;;;AAvGG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;;;;AAwGP;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAmBG;;;AACA;;;AACwB;AAAA;;AAAxB;;;AA1HO;AAAW;;AAAX;AAAP;AACc;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAyHG;;AAvBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAhGM;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAoHJ;;;AAlHG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAgHJ;;;AA9GG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AA4GJ;;;AA1GG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;;;;AA2GP;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAhL+B;;AAAgB;;AAArC;;;AAAP;AAgMA;;AAAA;AAAA;AACO;;AAjBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA8BU;AAAA;;AAAA;AAAA;AAXV;AAAA;AAAA;AAAA;AAAA;AAAA;AAaA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAkB4B;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AAtBP;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAyBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAkBU;AACP;AAAA;;;AAES;;;;;;;;AADT;;AAAA;;;;;;;;;;;;;;AA+BQ;AAJI;;AA9SL;;AAAA;AAAA;AAAA;AAAA;;AA6SC;AAGO;AAAA;AAjDlB;AAAA;AAAA;AAAA;AAAA;AAAA;AA0Ce;;AAzSL;;AAAA;AAAA;AAAA;AAAA;;AAwSC;AAGO;AAAA;AA5ClB;;;AAqCe;;AApSL;;AAAA;AAAA;AAAA;AAAA;;AAmSC;AAGO;AAAA;AAvClB;;;AAgCe;;AA/RL;;AAAA;AAAA;AAAA;AAAA;;AA8RC;AAGO;AAAA;AAlClB;;;AA2Be;;AA1RL;;AAAA;AAAA;AAAA;AAAA;;AAyRC;AAGO;AAAA;AA7BlB;;;AAsBkB;;;;;;;;;;;;;;;;;;AAtBlB;;;AH5RD;;;AAEe;;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAJ;AAAP;;AAgBJ;;;AApB8B;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAqCW;AAAA;AAAA;AAIM;AAAA;;AAAA;AAAA;AAAiC;;AAAA;;AAAA;AAAjC;AAEb;AAAA;;AAAA;AAAA;AAAkC;;AAAA;;AAAA;AAAlC;AAMgB;;AAAA;AAAA;AAAgB;AAAA;;AAAA;AAAA;AADf;;AAAA;;AAAA;;AAAA;;;AAIgB;AAAA;;AAAA;AAAA;AADf;;AAAA;;AAAA;;AAAA;;;AAMtB;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAI+B;AAAA;;AAAA;AAAA;AAA/B;AAAA;;AACgC;AAAA;;AAAA;AAAA;AAAhC;AAAA;;AAG0B;AAAA;AAAA;AAAA;AAA1B;AAAA;;AAIA;;AAAA;AAAA;AACA;AAEJ;;;;;;AAzE8B;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AC+GO;AAAA;AAAA;AAAA;AAAe;;AAAf;ADnCf;;;AACY;AAEO;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AACR;;AAAA;AAAA;AAAA;;AAAX;;;AACY;AAGJ;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAC0B;AAA1B;AAAA;;AACA;;AAAA;AAAA;AACO;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;AAAA;AAAA;;AAAA;AAAA;;ACyCJ;;;AAIO;;AAAA;;;AAAA;;AAAA;;;AACQ;AAAP;AACQ;;AAAA;;AAAA;AACL;;AAAA;AAAP;AAEJ;;;AAEJ;;AAAA;;;AACmB;AAAP;AACG;AAAA;;AAAA;AAAA;AAAP;AAAA;AACoC;AAAA;;AAAA;AAAA;AAA7B;;AAAA;AAAA;;AAAA;;;AAAP;AAEJ;;;AAOJ;;AAAA;;;AACmB;AAAP;AAEA;AAAA;;AAAA;AAAA;AAEA;AAAA;;AAAA;AAAA;AAHG;;AAAA;AAAA;;;AAAP;AAwBJ;;;AAEsB;AAAA;AAAA;AAAA;AAAX;;AAAA;AAAP;AAdO;;AAAY;;AAAZ;AAgBA;AAAc;;AAAd;AAAA;AAAA;AAAA;AAAA;;AAAP;AAZO;;AAAW;;AAAX;AAeS;;AAAA;AAAA;;AAAA;AAAA;AAAT;;AAAA;AAAP;AACO;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAP;AAuGJ;;;AA1DO;;AARC;AAQD;AAAA;;;AAAA;;AAPC;AAOD;AAAA;;;AAAA;;AANC;;AAMD;AAAA;;;AAAA;;AALC;;AAKD;AAAA;;;AAAA;;AAJC;;AAID;AAAA;;;AACQ;AA6DX;;AA1DR;;AAAA;;;AAEmB;AAwDJ;;;AAtDJ;;AAAiB;;AAAjB;AAAA;;;AAAyC;;AAAiB;;AAAjB;AAAzC;;;AAIQ;;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;;AAkDJ;;;;AAAA;;;AA7CJ;;AAAiB;AAAjB;AAAX;;;AAEmB;;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;;AA2CJ;;;;AAAA;;;AArCJ;;AAAiB;;AAAjB;AAAX;;;AAEmB;;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;;AAmCJ;;;;AAAA;;;AA5BJ;;AAAiB;;AAAjB;AAAX;;;AAEmB;;AAAc;;AAAd;AA0BJ;;;AAxBA;AAwBA;;;AAkBH;AAAA;;AAAA;AAAA;AAAsB;AAAtB;AAAA;;;AACI;AAAA;;AAAA;AAAA;AADJ;;;;AADJ;;AAAA;AA8CJ;;;AASQ;;AAAA;;AAAA;AAAA;AAAA;;;AACG;AAAA;;AAAA;AAAA;AADH;;;AAEG;AAAA;;AAAA;AAAA;AAFH;;;AAIO;AAAP;;AAAA;;AAAA;AAEA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAHM;;;AAQN;AAAA;;AAAA;AAAA;AAHG;;AAAA;AAAA;;;AAAP;;AAAA;;AAAA;AA+DJ;;;AAMJ;;AAAA;;;AACY;;AAAA;AACU;AAAA;;AAAA;AAAA;AACV;AAAA;;AAAA;AAAA;AADmC;;AAAA;;AAAA;;;AAAzB;AAKd;AAAA;AAGI;AAAA;;AAAA;AAAA;AAFG;;AAAA;AAAA;;AAAA;;;AAAP;AAyIJ;;;;;;;;AAUW;;AAAA;AAAA;AAAkB;AAAA;AAAA;AAAA;AAAlB;AAAP;AACO;;AAAA;;AAAA;AAAwB;;AAAxB;AAAP;AAEa;;AAAA;AAAA;AAAA;AACI;AAAd;AAAA;AAAX;;;AA5ee;AAAA;AAAA;AAAA;AAAe;;AAAf;AA+eH;AAEI;AAAA;;AAAA;AAAA;AAA6B;AAAA;;AAAA;AAAA;AAA7B;AADJ;AAG6B;;AAAA;;AAAA;AAA7B;;AAAA;;AAAA;AACA;;AAAA;AAAA;AAC6B;;AAAA;;AAAA;AAA7B;;AAAA;AAAA;AACA;;AAAwB;AAAxB;AACiC;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAqB;AAArB;AAAA;AAAA;AAAA;AACA;AAAc;;AAAd;AA7LJ;;AAAA;AACO;AAAA;;AAAA;AAAA;AA6LH;;AAAA;AAGmB;AAHnB;;;;AAAA;;AAKA;;AAAA;;AAAA;;AAAA;AA/fG;AAAA;AAAA;AAAA;AAAe;;AAAf;AAYA;AAAP;AAsfA;AAAA;;AAAA;AAAA;AAAyB;;AAAA;;;AAAA;;AAAzB;AAAA;;AAAA;AAAA;AAEG;;AAAc;;AAAd;AAAX;;;AAIgB;;AAAA;;AAAA;AACA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAHY;;;AAMI;AAAA;;AAAA;AAAA;AAAhB;AAAA;;AAiFL;AAAA;;AAAA;AAAA;AAAA;;;AAAqC;AAAA;;AAAA;AAAA;AAAP;;AAAA;AAA9B;;;AACQ;AAAA;;AAAA;AAAA;AAAA;;AAAA;AACR;AAAA;;AAAA;AAAA;AAAA;;;AAAmC;AAAA;;AAAA;AAAA;AAAP;;AAAA;AAA5B;;;AACQ;AAAA;;AAAA;AAAA;AAAA;;AAAA;AArFP;;AAAA;;AAAA;AAYD;;AAAc;;AAAd;AAAX;;;AACyC;;AAAA;;AAAA;AAA7B;;AAAA;;AAAA;AACA;;AAAA;AAAA;AAKD;;;AAAX;;;AACe;;AAAc;;AAAd;AAAf;;;AAI2B;AAAA;AAAA;AAAA;AAA4B;AAAA;AAAA;AAAA;AAA5B;AACD;;AADA;AADF;;AAAA;AAFR;AAAA;;;AA9LU;AAAA;;AAAA;AAAA;AAAA;;AAAA;AACJ;AAAd;;AACwB;AAAxB;;AAEG;;AAAA;;AAAA;AAAA;AAAA;;AAAX;;;AAE8B;;AAAA;;AAAA;;;AAAA;AAAA;;AAKM;AAAxB;;;;AAEc;AAAA;AAAA;AAAA;AAAoB;AAApB;AAAA;;AACM;AAAA;AAAA;AAAA;AAAlB;;AAAA;AAAd;;;AAC2B;;AAAA;;;AAAA;AAAA;;AACK;AAAA;AAAA;AAAA;;AAEuB;;AAArB;AAAA;;;AAClB;;AAAqB;;AAArB;AAAA;;;AACI;;AAAA;;AAAA;AADJ;;;;AAGhB;;;AACA;;AAAA;;;AAC4C;AAAxB;;AAOR;;AAAmB;AAAnB;AAAA;;;;;AAHY;;AAAA;;AAAA;AAFc;;AAAA;AAAA;;;AAAA;AAAA;;AAIlB;;AAAA;AAAA;;;;;;;;;AAGZ;;AAAA;AACY;AAAA;;AAAA;AAAA;AACT;;AAAA;;AAAA;AAAc;AAAd;AAAX;;;AAEyB;AAAA;;AAAA;AAAA;AAAb;AAGA;AAAA;;AAAA;AAAA;AAFG;;AAAA;;;AA+JC;;AAAA;AAAA;AAKR;AAAA;AAAA;AAAA;AAAqB;AAArB;AAAA;AAAA;AAAA;AACA;;AAEW;AACQ;AAHnB;;;;AAAA;;;;;;;;;AAFqC;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;;;;AAjBC;;AAAc;;AAAd;AAAb;;;AAE6C;AAAA;;AAAA;AAAA;AAAjC;;AAAA;AAAA;;;;AAdC;;AAAc;;AAAd;AAAb;;;AACwB;;AAAA;;AAAA;AAAA;AAAA;;AACxB;;;AAC4B;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAChB;;AAAA;;AAAA;;;;AAEG;;AAAA;;AAAA;AAAA;AAAA;;AAAf;;;AACgB;;AAAA;;AAAA;;;;AAkCZ;;;AAUwB;;AACH;;AAAA;AAAA;AACE;;AAAA;;;AACI;;AAAA;;;AACJ;;AAGW;;AALX;AAKW;AA6BtC;;AAAA;;;AACmB;AA/BS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAIA;AAAA;;AAAA;AAAA;AACH;;AAAA;AAAiB;AAAjB;AAZb;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AADJ;;;;;;AAAA;AAAA;AAAA;;;;;;AAwCG;;AAAe;AAAf;AAAA;;;AAAA;;AAAsC;;AAAtC;AAAA;;;AACQ;AAhCC;;;AAiCL;;;AAjCK;;;AEvpBhB;;;;;AAFW;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAGA;;;AACH;;AAAA;AAAA;AAAA;AAAA;AACG;;AAAA;AAAA;;AADH;AAAA;;;AAEG;;AAAA;AAAA;AAAA;AAAA;AADA;;AAAA;AADH;;;;AADJ;;AAAA;;;;;AAOyB;;AAbF;AAAA;;AAAA;AAAA;AAAhB;AAaP;;AAkBW;AAAA;;AAAA;AAAA;AAAJ;AAAP;;AAGW;AAAA;;AAAA;AAAA;AAAJ;AAAP;;AAEJ;;;AACW;;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;AAAA;;AAMH;;AANG;AAAA;;;AAAA;;AAOH;;AAPG;AAAA;;;;AAAP;;;", "op_pc_offset": 0, "pc_events": { "1": { @@ -19,9 +19,9 @@ "op": "intcblock 0 1 8 32 1500" }, "9": { - "op": "bytecblock 0x151f7c75 \"status\" \"event_cursor\" \"schedule_entry_count\" \"outstanding_principal\" \"fixed_point_scale\" \"accrued_interest\" \"interest_calculation_base\" 0x52234163636f756e7423 \"nominal_interest_rate\" \"contract_type\" \"reserved_units_total\" \"reserved_principal\" \"total_units\" \"next_principal_redemption\" \"reserved_interest\" \"cumulative_interest_index\" \"cumulative_principal_index\" 0x5223417272616e67657223 \"settlement_asset_id\" \"initial_exchange_amount\" 0x5223417574686f7269747923 0x52235072696d6172794465616c657223 0x52234163636f756e744d616e6167657223 0x5323 0x52234f6273657276657223 0x52234f704461656d6f6e23 \"initial_exchange_date\" \"transfer_opening_date\" \"transfer_closure_date\" \"rate_reset_floor\" \"rate_reset_cap\" 0x52235472757374656523 \"asset_suspended\" \"dynamic_principal_redemption\" \"rate_reset_spread\" \"rate_reset_multiplier\" \"rate_reset_next\" \"has_rate_reset_floor\" \"has_rate_reset_cap\" 0x00 \"asset_defaulted\" \"prospectus_hash\" \"prospectus_url\" \"denomination_asset_id\" \"maturity_date\" \"day_count_convention\" 0x068101 0x0000" + "op": "bytecblock 0x151f7c75 \"status\" \"event_cursor\" \"schedule_entry_count\" \"outstanding_principal\" \"fixed_point_scale\" \"accrued_interest\" \"interest_calculation_base\" 0x4123 \"nominal_interest_rate\" \"contract_type\" \"reserved_units_total\" \"reserved_principal\" \"total_units\" \"next_principal_redemption\" \"reserved_interest\" \"cumulative_interest_index\" \"cumulative_principal_index\" 0x523a41525223 \"settlement_asset_id\" \"initial_exchange_amount\" 0x523a41555423 0x523a50594423 0x523a4d4e4723 0x5323 0x523a4d4f4323 0x523a4f504423 \"initial_exchange_date\" \"transfer_opening_date\" \"transfer_closure_date\" \"rate_reset_floor\" \"rate_reset_cap\" 0x523a54525323 \"asset_suspended\" \"dynamic_principal_redemption\" \"rate_reset_spread\" \"rate_reset_multiplier\" \"rate_reset_next\" \"has_rate_reset_floor\" \"has_rate_reset_cap\" 0x00 \"asset_defaulted\" \"prospectus_hash\" \"prospectus_url\" \"denomination_asset_id\" \"maturity_date\" \"day_count_convention\" 0x068101 0x0000" }, - "830": { + "776": { "op": "txn ApplicationID", "defined_out": [ "tmp%0#0" @@ -30,59 +30,59 @@ "tmp%0#0" ] }, - "832": { + "778": { "op": "bnz main_after_if_else@2", "stack_out": [] }, - "835": { - "op": "bytec 18 // 0x5223417272616e67657223", + "781": { + "op": "bytec 18 // 0x523a41525223", "defined_out": [ - "0x5223417272616e67657223" + "0x523a41525223" ], "stack_out": [ - "0x5223417272616e67657223" + "0x523a41525223" ] }, - "837": { + "783": { "op": "global ZeroAddress", "defined_out": [ - "0x5223417272616e67657223", + "0x523a41525223", "tmp%0#3" ], "stack_out": [ - "0x5223417272616e67657223", + "0x523a41525223", "tmp%0#3" ] }, - "839": { + "785": { "op": "app_global_put", "stack_out": [] }, - "840": { - "op": "bytec 26 // 0x52234f704461656d6f6e23", + "786": { + "op": "bytec 26 // 0x523a4f504423", "defined_out": [ - "0x52234f704461656d6f6e23" + "0x523a4f504423" ], "stack_out": [ - "0x52234f704461656d6f6e23" + "0x523a4f504423" ] }, - "842": { + "788": { "op": "global ZeroAddress", "defined_out": [ - "0x52234f704461656d6f6e23", + "0x523a4f504423", "tmp%1#3" ], "stack_out": [ - "0x52234f704461656d6f6e23", + "0x523a4f504423", "tmp%1#3" ] }, - "844": { + "790": { "op": "app_global_put", "stack_out": [] }, - "845": { + "791": { "op": "bytec 33 // \"asset_suspended\"", "defined_out": [ "\"asset_suspended\"" @@ -91,7 +91,7 @@ "\"asset_suspended\"" ] }, - "847": { + "793": { "op": "intc_0 // 0", "defined_out": [ "\"asset_suspended\"", @@ -102,11 +102,11 @@ "0" ] }, - "848": { + "794": { "op": "app_global_put", "stack_out": [] }, - "849": { + "795": { "op": "bytec 41 // \"asset_defaulted\"", "defined_out": [ "\"asset_defaulted\"" @@ -115,18 +115,18 @@ "\"asset_defaulted\"" ] }, - "851": { + "797": { "op": "intc_0 // 0", "stack_out": [ "\"asset_defaulted\"", "0" ] }, - "852": { + "798": { "op": "app_global_put", "stack_out": [] }, - "853": { + "799": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"" @@ -135,18 +135,18 @@ "\"status\"" ] }, - "854": { + "800": { "op": "intc_0 // 0", "stack_out": [ "\"status\"", "0" ] }, - "855": { + "801": { "op": "app_global_put", "stack_out": [] }, - "856": { + "802": { "op": "bytec 10 // \"contract_type\"", "defined_out": [ "\"contract_type\"" @@ -155,18 +155,18 @@ "\"contract_type\"" ] }, - "858": { + "804": { "op": "intc_0 // 0", "stack_out": [ "\"contract_type\"", "0" ] }, - "859": { + "805": { "op": "app_global_put", "stack_out": [] }, - "860": { + "806": { "op": "bytec 42 // \"prospectus_hash\"", "defined_out": [ "\"prospectus_hash\"" @@ -175,7 +175,7 @@ "\"prospectus_hash\"" ] }, - "862": { + "808": { "op": "pushbytes 0x", "defined_out": [ "\"prospectus_hash\"", @@ -186,11 +186,11 @@ "0x" ] }, - "864": { + "810": { "op": "app_global_put", "stack_out": [] }, - "865": { + "811": { "op": "bytec 43 // \"prospectus_url\"", "defined_out": [ "\"prospectus_url\"" @@ -199,7 +199,7 @@ "\"prospectus_url\"" ] }, - "867": { + "813": { "op": "pushbytes \"\"", "defined_out": [ "\"\"", @@ -210,11 +210,11 @@ "\"\"" ] }, - "869": { + "815": { "op": "app_global_put", "stack_out": [] }, - "870": { + "816": { "op": "bytec 44 // \"denomination_asset_id\"", "defined_out": [ "\"denomination_asset_id\"" @@ -223,18 +223,18 @@ "\"denomination_asset_id\"" ] }, - "872": { + "818": { "op": "intc_0 // 0", "stack_out": [ "\"denomination_asset_id\"", "0" ] }, - "873": { + "819": { "op": "app_global_put", "stack_out": [] }, - "874": { + "820": { "op": "bytec 19 // \"settlement_asset_id\"", "defined_out": [ "\"settlement_asset_id\"" @@ -243,18 +243,18 @@ "\"settlement_asset_id\"" ] }, - "876": { + "822": { "op": "intc_0 // 0", "stack_out": [ "\"settlement_asset_id\"", "0" ] }, - "877": { + "823": { "op": "app_global_put", "stack_out": [] }, - "878": { + "824": { "op": "bytec 27 // \"initial_exchange_date\"", "defined_out": [ "\"initial_exchange_date\"" @@ -263,18 +263,18 @@ "\"initial_exchange_date\"" ] }, - "880": { + "826": { "op": "intc_0 // 0", "stack_out": [ "\"initial_exchange_date\"", "0" ] }, - "881": { + "827": { "op": "app_global_put", "stack_out": [] }, - "882": { + "828": { "op": "bytec 45 // \"maturity_date\"", "defined_out": [ "\"maturity_date\"" @@ -283,18 +283,18 @@ "\"maturity_date\"" ] }, - "884": { + "830": { "op": "intc_0 // 0", "stack_out": [ "\"maturity_date\"", "0" ] }, - "885": { + "831": { "op": "app_global_put", "stack_out": [] }, - "886": { + "832": { "op": "bytec 28 // \"transfer_opening_date\"", "defined_out": [ "\"transfer_opening_date\"" @@ -303,18 +303,18 @@ "\"transfer_opening_date\"" ] }, - "888": { + "834": { "op": "intc_0 // 0", "stack_out": [ "\"transfer_opening_date\"", "0" ] }, - "889": { + "835": { "op": "app_global_put", "stack_out": [] }, - "890": { + "836": { "op": "bytec 29 // \"transfer_closure_date\"", "defined_out": [ "\"transfer_closure_date\"" @@ -323,18 +323,18 @@ "\"transfer_closure_date\"" ] }, - "892": { + "838": { "op": "intc_0 // 0", "stack_out": [ "\"transfer_closure_date\"", "0" ] }, - "893": { + "839": { "op": "app_global_put", "stack_out": [] }, - "894": { + "840": { "op": "bytec 46 // \"day_count_convention\"", "defined_out": [ "\"day_count_convention\"" @@ -343,18 +343,18 @@ "\"day_count_convention\"" ] }, - "896": { + "842": { "op": "intc_0 // 0", "stack_out": [ "\"day_count_convention\"", "0" ] }, - "897": { + "843": { "op": "app_global_put", "stack_out": [] }, - "898": { + "844": { "op": "bytec 13 // \"total_units\"", "defined_out": [ "\"total_units\"" @@ -363,18 +363,18 @@ "\"total_units\"" ] }, - "900": { + "846": { "op": "intc_0 // 0", "stack_out": [ "\"total_units\"", "0" ] }, - "901": { + "847": { "op": "app_global_put", "stack_out": [] }, - "902": { + "848": { "op": "bytec 11 // \"reserved_units_total\"", "defined_out": [ "\"reserved_units_total\"" @@ -383,18 +383,18 @@ "\"reserved_units_total\"" ] }, - "904": { + "850": { "op": "intc_0 // 0", "stack_out": [ "\"reserved_units_total\"", "0" ] }, - "905": { + "851": { "op": "app_global_put", "stack_out": [] }, - "906": { + "852": { "op": "bytec 20 // \"initial_exchange_amount\"", "defined_out": [ "\"initial_exchange_amount\"" @@ -403,18 +403,18 @@ "\"initial_exchange_amount\"" ] }, - "908": { + "854": { "op": "intc_0 // 0", "stack_out": [ "\"initial_exchange_amount\"", "0" ] }, - "909": { + "855": { "op": "app_global_put", "stack_out": [] }, - "910": { + "856": { "op": "bytec 4 // \"outstanding_principal\"", "defined_out": [ "\"outstanding_principal\"" @@ -423,18 +423,18 @@ "\"outstanding_principal\"" ] }, - "912": { + "858": { "op": "intc_0 // 0", "stack_out": [ "\"outstanding_principal\"", "0" ] }, - "913": { + "859": { "op": "app_global_put", "stack_out": [] }, - "914": { + "860": { "op": "bytec 14 // \"next_principal_redemption\"", "defined_out": [ "\"next_principal_redemption\"" @@ -443,18 +443,18 @@ "\"next_principal_redemption\"" ] }, - "916": { + "862": { "op": "intc_0 // 0", "stack_out": [ "\"next_principal_redemption\"", "0" ] }, - "917": { + "863": { "op": "app_global_put", "stack_out": [] }, - "918": { + "864": { "op": "bytec 34 // \"dynamic_principal_redemption\"", "defined_out": [ "\"dynamic_principal_redemption\"" @@ -463,18 +463,18 @@ "\"dynamic_principal_redemption\"" ] }, - "920": { + "866": { "op": "intc_0 // 0", "stack_out": [ "\"dynamic_principal_redemption\"", "0" ] }, - "921": { + "867": { "op": "app_global_put", "stack_out": [] }, - "922": { + "868": { "op": "bytec 7 // \"interest_calculation_base\"", "defined_out": [ "\"interest_calculation_base\"" @@ -483,18 +483,18 @@ "\"interest_calculation_base\"" ] }, - "924": { + "870": { "op": "intc_0 // 0", "stack_out": [ "\"interest_calculation_base\"", "0" ] }, - "925": { + "871": { "op": "app_global_put", "stack_out": [] }, - "926": { + "872": { "op": "bytec 6 // \"accrued_interest\"", "defined_out": [ "\"accrued_interest\"" @@ -503,18 +503,18 @@ "\"accrued_interest\"" ] }, - "928": { + "874": { "op": "intc_0 // 0", "stack_out": [ "\"accrued_interest\"", "0" ] }, - "929": { + "875": { "op": "app_global_put", "stack_out": [] }, - "930": { + "876": { "op": "bytec 9 // \"nominal_interest_rate\"", "defined_out": [ "\"nominal_interest_rate\"" @@ -523,18 +523,18 @@ "\"nominal_interest_rate\"" ] }, - "932": { + "878": { "op": "intc_0 // 0", "stack_out": [ "\"nominal_interest_rate\"", "0" ] }, - "933": { + "879": { "op": "app_global_put", "stack_out": [] }, - "934": { + "880": { "op": "bytec 35 // \"rate_reset_spread\"", "defined_out": [ "\"rate_reset_spread\"" @@ -543,18 +543,18 @@ "\"rate_reset_spread\"" ] }, - "936": { + "882": { "op": "intc_0 // 0", "stack_out": [ "\"rate_reset_spread\"", "0" ] }, - "937": { + "883": { "op": "app_global_put", "stack_out": [] }, - "938": { + "884": { "op": "bytec 36 // \"rate_reset_multiplier\"", "defined_out": [ "\"rate_reset_multiplier\"" @@ -563,18 +563,18 @@ "\"rate_reset_multiplier\"" ] }, - "940": { + "886": { "op": "intc_0 // 0", "stack_out": [ "\"rate_reset_multiplier\"", "0" ] }, - "941": { + "887": { "op": "app_global_put", "stack_out": [] }, - "942": { + "888": { "op": "bytec 30 // \"rate_reset_floor\"", "defined_out": [ "\"rate_reset_floor\"" @@ -583,18 +583,18 @@ "\"rate_reset_floor\"" ] }, - "944": { + "890": { "op": "intc_0 // 0", "stack_out": [ "\"rate_reset_floor\"", "0" ] }, - "945": { + "891": { "op": "app_global_put", "stack_out": [] }, - "946": { + "892": { "op": "bytec 31 // \"rate_reset_cap\"", "defined_out": [ "\"rate_reset_cap\"" @@ -603,18 +603,18 @@ "\"rate_reset_cap\"" ] }, - "948": { + "894": { "op": "intc_0 // 0", "stack_out": [ "\"rate_reset_cap\"", "0" ] }, - "949": { + "895": { "op": "app_global_put", "stack_out": [] }, - "950": { + "896": { "op": "bytec 37 // \"rate_reset_next\"", "defined_out": [ "\"rate_reset_next\"" @@ -623,18 +623,18 @@ "\"rate_reset_next\"" ] }, - "952": { + "898": { "op": "intc_0 // 0", "stack_out": [ "\"rate_reset_next\"", "0" ] }, - "953": { + "899": { "op": "app_global_put", "stack_out": [] }, - "954": { + "900": { "op": "bytec 38 // \"has_rate_reset_floor\"", "defined_out": [ "\"has_rate_reset_floor\"" @@ -643,18 +643,18 @@ "\"has_rate_reset_floor\"" ] }, - "956": { + "902": { "op": "intc_0 // 0", "stack_out": [ "\"has_rate_reset_floor\"", "0" ] }, - "957": { + "903": { "op": "app_global_put", "stack_out": [] }, - "958": { + "904": { "op": "bytec 39 // \"has_rate_reset_cap\"", "defined_out": [ "\"has_rate_reset_cap\"" @@ -663,18 +663,18 @@ "\"has_rate_reset_cap\"" ] }, - "960": { + "906": { "op": "intc_0 // 0", "stack_out": [ "\"has_rate_reset_cap\"", "0" ] }, - "961": { + "907": { "op": "app_global_put", "stack_out": [] }, - "962": { + "908": { "op": "bytec 12 // \"reserved_principal\"", "defined_out": [ "\"reserved_principal\"" @@ -683,18 +683,18 @@ "\"reserved_principal\"" ] }, - "964": { + "910": { "op": "intc_0 // 0", "stack_out": [ "\"reserved_principal\"", "0" ] }, - "965": { + "911": { "op": "app_global_put", "stack_out": [] }, - "966": { + "912": { "op": "bytec 15 // \"reserved_interest\"", "defined_out": [ "\"reserved_interest\"" @@ -703,18 +703,18 @@ "\"reserved_interest\"" ] }, - "968": { + "914": { "op": "intc_0 // 0", "stack_out": [ "\"reserved_interest\"", "0" ] }, - "969": { + "915": { "op": "app_global_put", "stack_out": [] }, - "970": { + "916": { "op": "bytec 16 // \"cumulative_interest_index\"", "defined_out": [ "\"cumulative_interest_index\"" @@ -723,18 +723,18 @@ "\"cumulative_interest_index\"" ] }, - "972": { + "918": { "op": "intc_0 // 0", "stack_out": [ "\"cumulative_interest_index\"", "0" ] }, - "973": { + "919": { "op": "app_global_put", "stack_out": [] }, - "974": { + "920": { "op": "bytec 17 // \"cumulative_principal_index\"", "defined_out": [ "\"cumulative_principal_index\"" @@ -743,18 +743,18 @@ "\"cumulative_principal_index\"" ] }, - "976": { + "922": { "op": "intc_0 // 0", "stack_out": [ "\"cumulative_principal_index\"", "0" ] }, - "977": { + "923": { "op": "app_global_put", "stack_out": [] }, - "978": { + "924": { "op": "bytec_2 // \"event_cursor\"", "defined_out": [ "\"event_cursor\"" @@ -763,18 +763,18 @@ "\"event_cursor\"" ] }, - "979": { + "925": { "op": "intc_0 // 0", "stack_out": [ "\"event_cursor\"", "0" ] }, - "980": { + "926": { "op": "app_global_put", "stack_out": [] }, - "981": { + "927": { "op": "bytec_3 // \"schedule_entry_count\"", "defined_out": [ "\"schedule_entry_count\"" @@ -783,18 +783,18 @@ "\"schedule_entry_count\"" ] }, - "982": { + "928": { "op": "intc_0 // 0", "stack_out": [ "\"schedule_entry_count\"", "0" ] }, - "983": { + "929": { "op": "app_global_put", "stack_out": [] }, - "984": { + "930": { "op": "bytec 5 // \"fixed_point_scale\"", "defined_out": [ "\"fixed_point_scale\"" @@ -803,18 +803,18 @@ "\"fixed_point_scale\"" ] }, - "986": { + "932": { "op": "intc_0 // 0", "stack_out": [ "\"fixed_point_scale\"", "0" ] }, - "987": { + "933": { "op": "app_global_put", "stack_out": [] }, - "988": { + "934": { "op": "txn GlobalNumByteSlice", "defined_out": [ "tmp%0#2" @@ -823,7 +823,7 @@ "tmp%0#2" ] }, - "990": { + "936": { "op": "pushint 4", "defined_out": [ "4", @@ -834,7 +834,7 @@ "4" ] }, - "992": { + "938": { "op": "==", "defined_out": [ "tmp%1#2" @@ -843,12 +843,12 @@ "tmp%1#2" ] }, - "993": { + "939": { "error": "Wrong Global Bytes allocation", "op": "assert // Wrong Global Bytes allocation", "stack_out": [] }, - "994": { + "940": { "op": "txn GlobalNumUint", "defined_out": [ "tmp%2#1" @@ -857,7 +857,7 @@ "tmp%2#1" ] }, - "996": { + "942": { "op": "pushint 37", "defined_out": [ "37", @@ -868,7 +868,7 @@ "37" ] }, - "998": { + "944": { "op": "==", "defined_out": [ "tmp%3#1" @@ -877,12 +877,12 @@ "tmp%3#1" ] }, - "999": { + "945": { "error": "Wrong Global UInts allocation", "op": "assert // Wrong Global UInts allocation", "stack_out": [] }, - "1000": { + "946": { "op": "txn LocalNumByteSlice", "defined_out": [ "tmp%4#1" @@ -891,7 +891,7 @@ "tmp%4#1" ] }, - "1002": { + "948": { "op": "!", "defined_out": [ "tmp%5#0" @@ -900,12 +900,12 @@ "tmp%5#0" ] }, - "1003": { + "949": { "error": "Wrong Local Bytes allocation", "op": "assert // Wrong Local Bytes allocation", "stack_out": [] }, - "1004": { + "950": { "op": "txn LocalNumUint", "defined_out": [ "tmp%6#0" @@ -914,7 +914,7 @@ "tmp%6#0" ] }, - "1006": { + "952": { "op": "!", "defined_out": [ "tmp%7#0" @@ -923,12 +923,12 @@ "tmp%7#0" ] }, - "1007": { + "953": { "error": "Wrong Local UInts allocation", "op": "assert // Wrong Local UInts allocation", "stack_out": [] }, - "1008": { + "954": { "block": "main_after_if_else@2", "stack_in": [], "op": "pushbytes 0x914f04eb // method \"contract_update()void\"", @@ -939,7 +939,7 @@ "Method(contract_update()void)" ] }, - "1014": { + "960": { "op": "txna ApplicationArgs 0", "defined_out": [ "Method(contract_update()void)", @@ -950,11 +950,11 @@ "tmp%0#1" ] }, - "1017": { + "963": { "op": "match main_contract_update_route@4", "stack_out": [] }, - "1021": { + "967": { "block": "main_switch_case_next@5", "stack_in": [], "op": "txn OnCompletion", @@ -965,7 +965,7 @@ "tmp%6#0" ] }, - "1023": { + "969": { "op": "!", "defined_out": [ "tmp%7#0" @@ -974,11 +974,11 @@ "tmp%7#0" ] }, - "1024": { + "970": { "op": "assert", "stack_out": [] }, - "1025": { + "971": { "op": "txn ApplicationID", "defined_out": [ "tmp%8#0" @@ -987,11 +987,11 @@ "tmp%8#0" ] }, - "1027": { + "973": { "op": "bz main_create_NoOp@32", "stack_out": [] }, - "1030": { + "976": { "op": "pushbytess 0xb44618c8 0xe7832529 0x94388723 0x6c85e3ee 0xbdd1a944 0x7c0f1812 0x14fc10ef 0x74a7297f 0x09d4fe14 0x9a9bfa85 0x85eed33d 0xab2c0fc4 0xd9f225ac 0x9883505a 0x8ea6e74c 0x02af557a 0x82f71b2d 0xef04f5d3 0xdf343550 0x3dbe80bd 0x1e3e48e7 0x010c8299 0x7406acd2 0x1a72a2ee // method \"fund_due_cashflows(uint64)(uint64,uint64,uint64,uint64,uint64)\", method \"claim_due_cashflows(address,byte[])(uint64,uint64,uint64,uint64,byte[])\", method \"transfer_set_schedule(uint64,uint64)uint64\", method \"primary_distribution(address,uint64)uint64\", method \"transfer(address,address,uint64)uint64\", method \"account_suspension(address,bool)uint64\", method \"account_open(address,address)uint64\", method \"account_update_payment_address(address,address)uint64\", method \"account_get_position(address)(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64)\", method \"contract_config((uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64),(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64),(byte[32],string))uint64\", method \"contract_schedule(uint64,bool,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[])uint64\", method \"contract_execute_ied()uint64\", method \"apply_non_cash_event(uint64,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64\", method \"append_observed_cash_event((uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64\", method \"contract_get_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)\", method \"contract_get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)\", method \"rbac_rotate_arranger(address)uint64\", method \"rbac_set_op_daemon(address)uint64\", method \"rbac_assign_role(uint8,address,(uint64,uint64))uint64\", method \"rbac_revoke_role(uint8,address)uint64\", method \"rbac_contract_suspension(bool)uint64\", method \"rbac_get_arranger()address\", method \"rbac_get_address_roles(address)(bool,bool,bool,bool,bool)\", method \"rbac_get_role_validity(uint8,address)(uint64,uint64)\"", "defined_out": [ "Method(account_get_position(address)(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64))", @@ -1046,7 +1046,7 @@ "Method(rbac_get_role_validity(uint8,address)(uint64,uint64))" ] }, - "1152": { + "1098": { "op": "txna ApplicationArgs 0", "defined_out": [ "Method(account_get_position(address)(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64))", @@ -1103,14 +1103,14 @@ "tmp%10#0" ] }, - "1155": { + "1101": { "op": "match fund_due_cashflows claim_due_cashflows transfer_set_schedule primary_distribution transfer account_suspension account_open account_update_payment_address account_get_position contract_config contract_schedule contract_execute_ied apply_non_cash_event append_observed_cash_event contract_get_state contract_get_next_due_event rbac_rotate_arranger rbac_set_op_daemon rbac_assign_role rbac_revoke_role rbac_contract_suspension rbac_get_arranger rbac_get_address_roles rbac_get_role_validity", "stack_out": [] }, - "1205": { + "1151": { "op": "err" }, - "1206": { + "1152": { "block": "main_create_NoOp@32", "stack_in": [], "op": "pushbytes 0x956d7156 // method \"contract_create(address)uint64\"", @@ -1121,7 +1121,7 @@ "Method(contract_create(address)uint64)" ] }, - "1212": { + "1158": { "op": "txna ApplicationArgs 0", "defined_out": [ "Method(contract_create(address)uint64)", @@ -1132,14 +1132,14 @@ "tmp%11#0" ] }, - "1215": { + "1161": { "op": "match contract_create", "stack_out": [] }, - "1219": { + "1165": { "op": "err" }, - "1220": { + "1166": { "block": "main_contract_update_route@4", "stack_in": [], "op": "txn OnCompletion", @@ -1150,7 +1150,7 @@ "tmp%1#1" ] }, - "1222": { + "1168": { "op": "pushint 4 // UpdateApplication", "defined_out": [ "UpdateApplication", @@ -1161,7 +1161,7 @@ "UpdateApplication" ] }, - "1224": { + "1170": { "op": "==", "defined_out": [ "tmp%2#0" @@ -1170,7 +1170,7 @@ "tmp%2#0" ] }, - "1225": { + "1171": { "op": "txn ApplicationID", "defined_out": [ "tmp%2#0", @@ -1181,7 +1181,7 @@ "tmp%3#0" ] }, - "1227": { + "1173": { "op": "&&", "defined_out": [ "tmp%5#0" @@ -1190,14 +1190,14 @@ "tmp%5#0" ] }, - "1228": { + "1174": { "op": "assert", "stack_out": [] }, - "1229": { + "1175": { "op": "b contract_update" }, - "1232": { + "1178": { "subroutine": "_puya_lib.util.ensure_budget", "params": { "required_budget#0": "uint64", @@ -1207,7 +1207,7 @@ "stack_in": [], "op": "proto 2 0" }, - "1235": { + "1181": { "op": "frame_dig -2", "defined_out": [ "required_budget#0 (copy)" @@ -1216,7 +1216,7 @@ "required_budget#0 (copy)" ] }, - "1237": { + "1183": { "op": "pushint 10", "defined_out": [ "10", @@ -1227,7 +1227,7 @@ "10" ] }, - "1239": { + "1185": { "op": "+", "defined_out": [ "required_budget_with_buffer#0" @@ -1236,7 +1236,7 @@ "required_budget_with_buffer#0" ] }, - "1240": { + "1186": { "block": "ensure_budget_while_top@1", "stack_in": [ "required_budget_with_buffer#0" @@ -1250,7 +1250,7 @@ "required_budget_with_buffer#0" ] }, - "1242": { + "1188": { "op": "global OpcodeBudget", "defined_out": [ "required_budget_with_buffer#0", @@ -1262,7 +1262,7 @@ "tmp%1#0" ] }, - "1244": { + "1190": { "op": ">", "defined_out": [ "required_budget_with_buffer#0", @@ -1273,16 +1273,16 @@ "tmp%2#0" ] }, - "1245": { + "1191": { "op": "bz ensure_budget_after_while@6", "stack_out": [ "required_budget_with_buffer#0" ] }, - "1248": { + "1194": { "op": "itxn_begin" }, - "1249": { + "1195": { "op": "pushint 6 // appl", "defined_out": [ "appl", @@ -1293,13 +1293,13 @@ "appl" ] }, - "1251": { + "1197": { "op": "itxn_field TypeEnum", "stack_out": [ "required_budget_with_buffer#0" ] }, - "1253": { + "1199": { "op": "pushint 5 // DeleteApplication", "defined_out": [ "DeleteApplication", @@ -1310,13 +1310,13 @@ "DeleteApplication" ] }, - "1255": { + "1201": { "op": "itxn_field OnCompletion", "stack_out": [ "required_budget_with_buffer#0" ] }, - "1257": { + "1203": { "op": "bytec 47 // 0x068101", "defined_out": [ "0x068101", @@ -1327,26 +1327,26 @@ "0x068101" ] }, - "1259": { + "1205": { "op": "itxn_field ApprovalProgram", "stack_out": [ "required_budget_with_buffer#0" ] }, - "1261": { + "1207": { "op": "bytec 47 // 0x068101", "stack_out": [ "required_budget_with_buffer#0", "0x068101" ] }, - "1263": { + "1209": { "op": "itxn_field ClearStateProgram", "stack_out": [ "required_budget_with_buffer#0" ] }, - "1265": { + "1211": { "op": "frame_dig -1", "defined_out": [ "fee_source#0 (copy)", @@ -1357,23 +1357,23 @@ "fee_source#0 (copy)" ] }, - "1267": { + "1213": { "op": "switch ensure_budget_switch_case_0@3 ensure_budget_switch_case_1@4", "stack_out": [ "required_budget_with_buffer#0" ] }, - "1273": { + "1219": { "block": "ensure_budget_switch_case_next@5", "stack_in": [ "required_budget_with_buffer#0" ], "op": "itxn_submit" }, - "1274": { + "1220": { "op": "b ensure_budget_while_top@1" }, - "1277": { + "1223": { "block": "ensure_budget_switch_case_1@4", "stack_in": [ "required_budget_with_buffer#0" @@ -1387,16 +1387,16 @@ "tmp%3#0" ] }, - "1279": { + "1225": { "op": "itxn_field Fee", "stack_out": [ "required_budget_with_buffer#0" ] }, - "1281": { + "1227": { "op": "b ensure_budget_switch_case_next@5" }, - "1284": { + "1230": { "block": "ensure_budget_switch_case_0@3", "stack_in": [ "required_budget_with_buffer#0" @@ -1410,16 +1410,16 @@ "0" ] }, - "1285": { + "1231": { "op": "itxn_field Fee", "stack_out": [ "required_budget_with_buffer#0" ] }, - "1287": { + "1233": { "op": "b ensure_budget_switch_case_next@5" }, - "1290": { + "1236": { "block": "ensure_budget_after_while@6", "stack_in": [ "required_budget_with_buffer#0" @@ -1427,7 +1427,7 @@ "retsub": true, "op": "retsub" }, - "1291": { + "1237": { "subroutine": "modules.payment_agent.PaymentAgent.fund_due_cashflows[routing]", "params": {}, "block": "fund_due_cashflows", @@ -1437,14 +1437,14 @@ "entry#0" ] }, - "1292": { + "1238": { "op": "pushbytes \"\"", "stack_out": [ "entry#0", "event_type#0" ] }, - "1294": { + "1240": { "op": "dupn 13", "stack_out": [ "entry#0", @@ -1464,7 +1464,7 @@ "values%0#0" ] }, - "1296": { + "1242": { "op": "txna ApplicationArgs 1", "defined_out": [ "tmp%0#0" @@ -1488,7 +1488,7 @@ "tmp%0#0" ] }, - "1299": { + "1245": { "op": "dup", "defined_out": [ "tmp%0#0", @@ -1514,7 +1514,7 @@ "tmp%0#0 (copy)" ] }, - "1300": { + "1246": { "op": "len", "defined_out": [ "len%0#0", @@ -1540,7 +1540,7 @@ "len%0#0" ] }, - "1301": { + "1247": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -1568,7 +1568,7 @@ "8" ] }, - "1302": { + "1248": { "op": "==", "defined_out": [ "eq%0#0", @@ -1594,7 +1594,7 @@ "eq%0#0" ] }, - "1303": { + "1249": { "error": "invalid number of bytes for arc4.uint64", "op": "assert // invalid number of bytes for arc4.uint64", "stack_out": [ @@ -1616,7 +1616,7 @@ "tmp%0#0" ] }, - "1304": { + "1250": { "op": "btoi", "defined_out": [ "max_event_count#0" @@ -1640,7 +1640,7 @@ "max_event_count#0" ] }, - "1305": { + "1251": { "op": "intc_0 // 0", "stack_out": [ "entry#0", @@ -1662,7 +1662,7 @@ "0" ] }, - "1306": { + "1252": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"", @@ -1690,7 +1690,7 @@ "\"status\"" ] }, - "1307": { + "1253": { "op": "app_global_get_ex", "defined_out": [ "max_event_count#0", @@ -1718,7 +1718,7 @@ "maybe_exists%0#0" ] }, - "1308": { + "1254": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ @@ -1741,7 +1741,7 @@ "maybe_value%0#0" ] }, - "1309": { + "1255": { "error": "D-ASA not configured", "op": "assert // D-ASA not configured", "stack_out": [ @@ -1763,19 +1763,19 @@ "max_event_count#0" ] }, - "1310": { + "1256": { "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", "op": "callsub _assert_caller_is_arranger" }, - "1313": { + "1259": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", "op": "callsub _assert_is_not_asset_defaulted" }, - "1316": { + "1262": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_suspended", "op": "callsub _assert_is_not_asset_suspended" }, - "1319": { + "1265": { "op": "intc_0 // 0", "stack_out": [ "entry#0", @@ -1797,7 +1797,7 @@ "0" ] }, - "1320": { + "1266": { "op": "bytec_1 // \"status\"", "stack_out": [ "entry#0", @@ -1820,7 +1820,7 @@ "\"status\"" ] }, - "1321": { + "1267": { "op": "app_global_get_ex", "stack_out": [ "entry#0", @@ -1843,7 +1843,7 @@ "maybe_exists%0#0" ] }, - "1322": { + "1268": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ @@ -1866,7 +1866,7 @@ "maybe_value%0#0" ] }, - "1323": { + "1269": { "op": "pushint 50", "defined_out": [ "50", @@ -1894,7 +1894,7 @@ "50" ] }, - "1325": { + "1271": { "op": "==", "defined_out": [ "max_event_count#0", @@ -1920,7 +1920,7 @@ "tmp%0#1" ] }, - "1326": { + "1272": { "op": "!", "defined_out": [ "max_event_count#0", @@ -1947,7 +1947,7 @@ "tmp%1#4" ] }, - "1327": { + "1273": { "error": "IED not yet executed", "op": "assert // IED not yet executed", "stack_out": [ @@ -1969,7 +1969,7 @@ "max_event_count#0" ] }, - "1328": { + "1274": { "callsub": "modules.actus_kernel.ActusKernelModule._is_dynamic_annuity", "op": "callsub _is_dynamic_annuity", "stack_out": [ @@ -1992,7 +1992,7 @@ "tmp%0#1" ] }, - "1331": { + "1277": { "op": "bz fund_due_cashflows_after_if_else@3", "stack_out": [ "entry#0", @@ -2013,7 +2013,7 @@ "max_event_count#0" ] }, - "1334": { + "1280": { "op": "dup", "stack_out": [ "entry#0", @@ -2035,7 +2035,7 @@ "max_event_count#0" ] }, - "1335": { + "1281": { "op": "pushint 100", "defined_out": [ "100", @@ -2063,7 +2063,7 @@ "100" ] }, - "1337": { + "1283": { "op": "*", "defined_out": [ "max_event_count#0", @@ -2090,7 +2090,7 @@ "tmp%1#1" ] }, - "1338": { + "1284": { "op": "intc 4 // 1500", "defined_out": [ "1500", @@ -2119,7 +2119,7 @@ "1500" ] }, - "1340": { + "1286": { "op": "+", "defined_out": [ "max_event_count#0", @@ -2146,7 +2146,7 @@ "tmp%2#1" ] }, - "1341": { + "1287": { "op": "intc_0 // 0", "stack_out": [ "entry#0", @@ -2169,7 +2169,7 @@ "0" ] }, - "1342": { + "1288": { "callsub": "_puya_lib.util.ensure_budget", "op": "callsub ensure_budget", "stack_out": [ @@ -2191,7 +2191,7 @@ "max_event_count#0" ] }, - "1345": { + "1291": { "block": "fund_due_cashflows_after_if_else@3", "stack_in": [ "entry#0", @@ -2235,7 +2235,7 @@ "processed_events#0" ] }, - "1346": { + "1292": { "op": "bury 5", "defined_out": [ "processed_events#0" @@ -2259,7 +2259,7 @@ "max_event_count#0" ] }, - "1348": { + "1294": { "op": "intc_0 // 0", "defined_out": [ "funded_interest#0", @@ -2285,7 +2285,7 @@ "funded_interest#0" ] }, - "1349": { + "1295": { "op": "bury 14", "defined_out": [ "funded_interest#0", @@ -2310,7 +2310,7 @@ "max_event_count#0" ] }, - "1351": { + "1297": { "op": "intc_0 // 0", "defined_out": [ "funded_interest#0", @@ -2337,7 +2337,7 @@ "funded_principal#0" ] }, - "1352": { + "1298": { "op": "bury 13", "defined_out": [ "funded_interest#0", @@ -2363,7 +2363,7 @@ "max_event_count#0" ] }, - "1354": { + "1300": { "block": "fund_due_cashflows_while_top@4", "stack_in": [ "entry#0", @@ -2407,7 +2407,7 @@ "processed_events#0" ] }, - "1356": { + "1302": { "op": "dig 1", "defined_out": [ "max_event_count#0", @@ -2434,7 +2434,7 @@ "max_event_count#0" ] }, - "1358": { + "1304": { "op": "<", "defined_out": [ "max_event_count#0", @@ -2461,7 +2461,7 @@ "tmp%3#1" ] }, - "1359": { + "1305": { "op": "bz fund_due_cashflows_after_while@11", "stack_out": [ "entry#0", @@ -2482,7 +2482,7 @@ "max_event_count#0" ] }, - "1362": { + "1308": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -2509,7 +2509,7 @@ "0" ] }, - "1363": { + "1309": { "op": "bytec_2 // \"event_cursor\"", "defined_out": [ "\"event_cursor\"", @@ -2538,7 +2538,7 @@ "\"event_cursor\"" ] }, - "1364": { + "1310": { "op": "app_global_get_ex", "defined_out": [ "max_event_count#0", @@ -2567,7 +2567,7 @@ "maybe_exists%0#0" ] }, - "1365": { + "1311": { "error": "check self.event_cursor exists", "op": "assert // check self.event_cursor exists", "stack_out": [ @@ -2590,7 +2590,7 @@ "maybe_value%0#0" ] }, - "1366": { + "1312": { "op": "intc_0 // 0", "stack_out": [ "entry#0", @@ -2613,7 +2613,7 @@ "0" ] }, - "1367": { + "1313": { "op": "bytec_3 // \"schedule_entry_count\"", "defined_out": [ "\"schedule_entry_count\"", @@ -2644,7 +2644,7 @@ "\"schedule_entry_count\"" ] }, - "1368": { + "1314": { "op": "app_global_get_ex", "defined_out": [ "max_event_count#0", @@ -2675,7 +2675,7 @@ "maybe_exists%1#0" ] }, - "1369": { + "1315": { "error": "check self.schedule_entry_count exists", "op": "assert // check self.schedule_entry_count exists", "stack_out": [ @@ -2699,7 +2699,7 @@ "maybe_value%1#0" ] }, - "1370": { + "1316": { "op": "<", "defined_out": [ "max_event_count#0", @@ -2726,7 +2726,7 @@ "tmp%4#0" ] }, - "1371": { + "1317": { "op": "bz fund_due_cashflows_after_while@11", "stack_out": [ "entry#0", @@ -2747,7 +2747,7 @@ "max_event_count#0" ] }, - "1374": { + "1320": { "op": "intc_0 // 0", "stack_out": [ "entry#0", @@ -2769,7 +2769,7 @@ "0" ] }, - "1375": { + "1321": { "op": "bytec_2 // \"event_cursor\"", "stack_out": [ "entry#0", @@ -2792,7 +2792,7 @@ "\"event_cursor\"" ] }, - "1376": { + "1322": { "op": "app_global_get_ex", "defined_out": [ "max_event_count#0", @@ -2821,7 +2821,7 @@ "maybe_exists%2#0" ] }, - "1377": { + "1323": { "error": "check self.event_cursor exists", "op": "assert // check self.event_cursor exists", "stack_out": [ @@ -2844,7 +2844,7 @@ "maybe_value%2#0" ] }, - "1378": { + "1324": { "callsub": "modules.actus_kernel.ActusKernelModule._get_schedule_entry", "op": "callsub _get_schedule_entry", "defined_out": [ @@ -2872,7 +2872,7 @@ "entry#0" ] }, - "1381": { + "1327": { "op": "dup", "stack_out": [ "entry#0", @@ -2895,7 +2895,7 @@ "entry#0" ] }, - "1382": { + "1328": { "op": "bury 17", "defined_out": [ "entry#0", @@ -2922,7 +2922,7 @@ "entry#0" ] }, - "1384": { + "1330": { "op": "pushint 9", "defined_out": [ "9", @@ -2951,7 +2951,7 @@ "9" ] }, - "1386": { + "1332": { "op": "extract_uint64", "defined_out": [ "entry#0", @@ -2979,7 +2979,7 @@ "values%0#0" ] }, - "1387": { + "1333": { "op": "dup", "stack_out": [ "entry#0", @@ -3002,7 +3002,7 @@ "values%0#0" ] }, - "1388": { + "1334": { "op": "bury 3", "defined_out": [ "entry#0", @@ -3030,7 +3030,7 @@ "values%0#0" ] }, - "1390": { + "1336": { "op": "global LatestTimestamp", "defined_out": [ "entry#0", @@ -3060,7 +3060,7 @@ "tmp%6#0" ] }, - "1392": { + "1338": { "op": ">", "defined_out": [ "entry#0", @@ -3089,7 +3089,7 @@ "tmp%7#0" ] }, - "1393": { + "1339": { "op": "bnz fund_due_cashflows_after_while@11", "stack_out": [ "entry#0", @@ -3110,7 +3110,7 @@ "max_event_count#0" ] }, - "1396": { + "1342": { "op": "dig 15", "stack_out": [ "entry#0", @@ -3132,7 +3132,7 @@ "entry#0" ] }, - "1398": { + "1344": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -3162,7 +3162,7 @@ "8" ] }, - "1399": { + "1345": { "op": "getbyte", "defined_out": [ "entry#0", @@ -3191,7 +3191,7 @@ "event_type#0" ] }, - "1400": { + "1346": { "op": "dup", "stack_out": [ "entry#0", @@ -3214,7 +3214,7 @@ "event_type#0" ] }, - "1401": { + "1347": { "op": "bury 16", "defined_out": [ "entry#0", @@ -3243,7 +3243,7 @@ "event_type#0" ] }, - "1403": { + "1349": { "op": "intc_2 // 8", "stack_out": [ "entry#0", @@ -3266,7 +3266,7 @@ "8" ] }, - "1404": { + "1350": { "op": "==", "defined_out": [ "entry#0", @@ -3296,7 +3296,7 @@ "tmp%0#1" ] }, - "1405": { + "1351": { "op": "dup", "stack_out": [ "entry#0", @@ -3319,7 +3319,7 @@ "tmp%0#1" ] }, - "1406": { + "1352": { "op": "bury 4", "defined_out": [ "entry#0", @@ -3349,7 +3349,7 @@ "tmp%0#1" ] }, - "1408": { + "1354": { "op": "bnz fund_due_cashflows_bool_true@52", "stack_out": [ "entry#0", @@ -3370,7 +3370,7 @@ "max_event_count#0" ] }, - "1411": { + "1357": { "op": "dig 14", "stack_out": [ "entry#0", @@ -3392,7 +3392,7 @@ "event_type#0" ] }, - "1413": { + "1359": { "op": "pushint 3", "defined_out": [ "3", @@ -3424,7 +3424,7 @@ "3" ] }, - "1415": { + "1361": { "op": "==", "defined_out": [ "entry#0", @@ -3455,7 +3455,7 @@ "tmp%1#4" ] }, - "1416": { + "1362": { "op": "bnz fund_due_cashflows_bool_true@52", "stack_out": [ "entry#0", @@ -3476,7 +3476,7 @@ "max_event_count#0" ] }, - "1419": { + "1365": { "op": "dig 14", "stack_out": [ "entry#0", @@ -3498,7 +3498,7 @@ "event_type#0" ] }, - "1421": { + "1367": { "op": "pushint 19", "defined_out": [ "19", @@ -3530,7 +3530,7 @@ "19" ] }, - "1423": { + "1369": { "op": "==", "defined_out": [ "entry#0", @@ -3561,7 +3561,7 @@ "tmp%2#2" ] }, - "1424": { + "1370": { "op": "bz fund_due_cashflows_bool_false@53", "stack_out": [ "entry#0", @@ -3582,7 +3582,7 @@ "max_event_count#0" ] }, - "1427": { + "1373": { "block": "fund_due_cashflows_bool_true@52", "stack_in": [ "entry#0", @@ -3626,7 +3626,7 @@ "or_result%0#0" ] }, - "1428": { + "1374": { "block": "fund_due_cashflows_bool_merge@54", "stack_in": [ "entry#0", @@ -3668,7 +3668,7 @@ "max_event_count#0" ] }, - "1431": { + "1377": { "op": "dig 15", "defined_out": [ "entry#0" @@ -3693,7 +3693,7 @@ "entry#0" ] }, - "1433": { + "1379": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -3720,7 +3720,7 @@ "0" ] }, - "1434": { + "1380": { "op": "extract_uint64", "defined_out": [ "entry#0", @@ -3746,7 +3746,7 @@ "values%0#1" ] }, - "1435": { + "1381": { "op": "intc_0 // 0", "stack_out": [ "entry#0", @@ -3769,7 +3769,7 @@ "0" ] }, - "1436": { + "1382": { "op": "bytec_2 // \"event_cursor\"", "defined_out": [ "\"event_cursor\"", @@ -3799,7 +3799,7 @@ "\"event_cursor\"" ] }, - "1437": { + "1383": { "op": "app_global_get_ex", "defined_out": [ "entry#0", @@ -3829,7 +3829,7 @@ "maybe_exists%0#0" ] }, - "1438": { + "1384": { "error": "check self.event_cursor exists", "op": "assert // check self.event_cursor exists", "stack_out": [ @@ -3853,7 +3853,7 @@ "maybe_value%0#0" ] }, - "1439": { + "1385": { "op": "==", "defined_out": [ "entry#0", @@ -3879,7 +3879,7 @@ "tmp%0#2" ] }, - "1440": { + "1386": { "error": "Invalid event cursor", "op": "assert // Invalid event cursor", "stack_out": [ @@ -3901,7 +3901,7 @@ "max_event_count#0" ] }, - "1441": { + "1387": { "op": "dig 1", "defined_out": [ "entry#0", @@ -3927,7 +3927,7 @@ "values%0#0" ] }, - "1443": { + "1389": { "op": "global LatestTimestamp", "defined_out": [ "entry#0", @@ -3955,7 +3955,7 @@ "tmp%1#1" ] }, - "1445": { + "1391": { "op": "<=", "defined_out": [ "entry#0", @@ -3982,7 +3982,7 @@ "tmp%2#2" ] }, - "1446": { + "1392": { "error": "No due cashflow to pay", "op": "assert // No due cashflow to pay", "stack_out": [ @@ -4004,7 +4004,7 @@ "max_event_count#0" ] }, - "1447": { + "1393": { "op": "dig 2", "defined_out": [ "entry#0", @@ -4031,7 +4031,7 @@ "tmp%0#1" ] }, - "1449": { + "1395": { "op": "bnz fund_due_cashflows_after_if_else@15", "stack_out": [ "entry#0", @@ -4052,7 +4052,7 @@ "max_event_count#0" ] }, - "1452": { + "1398": { "op": "dig 14", "defined_out": [ "entry#0", @@ -4080,7 +4080,7 @@ "event_type#0" ] }, - "1454": { + "1400": { "op": "pushint 19", "defined_out": [ "19", @@ -4110,7 +4110,7 @@ "19" ] }, - "1456": { + "1402": { "op": "==", "stack_out": [ "entry#0", @@ -4132,7 +4132,7 @@ "tmp%2#2" ] }, - "1457": { + "1403": { "op": "bnz fund_due_cashflows_after_if_else@15", "stack_out": [ "entry#0", @@ -4153,7 +4153,7 @@ "max_event_count#0" ] }, - "1460": { + "1406": { "op": "intc_0 // 0", "defined_out": [ "entry#0", @@ -4182,7 +4182,7 @@ "interest_amount_due#0" ] }, - "1461": { + "1407": { "op": "bury 11", "defined_out": [ "entry#0", @@ -4210,7 +4210,7 @@ "max_event_count#0" ] }, - "1463": { + "1409": { "block": "fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_interest_amount@16", "stack_in": [ "entry#0", @@ -4254,7 +4254,7 @@ "entry#0" ] }, - "1465": { + "1411": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -4281,7 +4281,7 @@ "8" ] }, - "1466": { + "1412": { "op": "getbyte", "defined_out": [ "entry#0", @@ -4307,7 +4307,7 @@ "event_type#0" ] }, - "1467": { + "1413": { "op": "dup", "stack_out": [ "entry#0", @@ -4330,7 +4330,7 @@ "event_type#0" ] }, - "1468": { + "1414": { "op": "bury 16", "defined_out": [ "entry#0", @@ -4356,7 +4356,7 @@ "event_type#0" ] }, - "1470": { + "1416": { "op": "pushint 3", "defined_out": [ "3", @@ -4384,7 +4384,7 @@ "3" ] }, - "1472": { + "1418": { "op": "==", "defined_out": [ "entry#0", @@ -4411,7 +4411,7 @@ "tmp%1#4" ] }, - "1473": { + "1419": { "op": "bnz fund_due_cashflows_after_if_else@19", "stack_out": [ "entry#0", @@ -4432,7 +4432,7 @@ "max_event_count#0" ] }, - "1476": { + "1422": { "op": "dig 14", "stack_out": [ "entry#0", @@ -4454,7 +4454,7 @@ "event_type#0" ] }, - "1478": { + "1424": { "op": "pushint 19", "defined_out": [ "19", @@ -4482,7 +4482,7 @@ "19" ] }, - "1480": { + "1426": { "op": "==", "defined_out": [ "entry#0", @@ -4509,7 +4509,7 @@ "tmp%2#2" ] }, - "1481": { + "1427": { "op": "bnz fund_due_cashflows_after_if_else@19", "stack_out": [ "entry#0", @@ -4530,7 +4530,7 @@ "max_event_count#0" ] }, - "1484": { + "1430": { "op": "intc_0 // 0", "defined_out": [ "entry#0", @@ -4557,7 +4557,7 @@ "principal_amount_due#0" ] }, - "1485": { + "1431": { "op": "bury 6", "defined_out": [ "entry#0", @@ -4583,7 +4583,7 @@ "max_event_count#0" ] }, - "1487": { + "1433": { "block": "fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@28", "stack_in": [ "entry#0", @@ -4627,7 +4627,7 @@ "entry#0" ] }, - "1489": { + "1435": { "op": "pushint 49", "defined_out": [ "49", @@ -4654,7 +4654,7 @@ "49" ] }, - "1491": { + "1437": { "op": "extract_uint64", "defined_out": [ "entry#0", @@ -4680,7 +4680,7 @@ "next_outstanding_principal#0" ] }, - "1492": { + "1438": { "op": "bury 8", "defined_out": [ "entry#0", @@ -4705,7 +4705,7 @@ "max_event_count#0" ] }, - "1494": { + "1440": { "callsub": "modules.actus_kernel.ActusKernelModule._is_dynamic_annuity", "op": "callsub _is_dynamic_annuity", "defined_out": [ @@ -4733,7 +4733,7 @@ "tmp%3#1" ] }, - "1497": { + "1443": { "op": "bnz fund_due_cashflows_if_body@29", "stack_out": [ "entry#0", @@ -4754,7 +4754,7 @@ "max_event_count#0" ] }, - "1500": { + "1446": { "op": "dig 7", "defined_out": [ "entry#0", @@ -4781,7 +4781,7 @@ "next_interest_base#2" ] }, - "1502": { + "1448": { "op": "bury 9", "defined_out": [ "entry#0", @@ -4807,7 +4807,7 @@ "max_event_count#0" ] }, - "1504": { + "1450": { "block": "fund_due_cashflows_after_if_else@38", "stack_in": [ "entry#0", @@ -4851,7 +4851,7 @@ "interest_amount_due#0" ] }, - "1506": { + "1452": { "callsub": "modules.actus_kernel.ActusKernelModule._amount_to_index_delta", "op": "callsub _amount_to_index_delta", "defined_out": [ @@ -4878,7 +4878,7 @@ "interest_index_delta#0" ] }, - "1509": { + "1455": { "op": "dig 6", "defined_out": [ "interest_amount_due#0", @@ -4906,7 +4906,7 @@ "principal_amount_due#0" ] }, - "1511": { + "1457": { "callsub": "modules.actus_kernel.ActusKernelModule._amount_to_index_delta", "op": "callsub _amount_to_index_delta", "defined_out": [ @@ -4936,7 +4936,7 @@ "principal_index_delta#0" ] }, - "1514": { + "1460": { "op": "dig 1", "defined_out": [ "interest_amount_due#0", @@ -4967,7 +4967,7 @@ "interest_index_delta#0 (copy)" ] }, - "1516": { + "1462": { "callsub": "modules.actus_kernel.ActusKernelModule._index_delta_to_amount", "op": "callsub _index_delta_to_amount", "defined_out": [ @@ -4999,7 +4999,7 @@ "interest_amount#1" ] }, - "1519": { + "1465": { "op": "dup", "stack_out": [ "entry#0", @@ -5024,7 +5024,7 @@ "interest_amount#1 (copy)" ] }, - "1520": { + "1466": { "op": "cover 2", "stack_out": [ "entry#0", @@ -5049,7 +5049,7 @@ "interest_amount#1" ] }, - "1522": { + "1468": { "op": "bury 15", "defined_out": [ "interest_amount#1", @@ -5080,7 +5080,7 @@ "principal_index_delta#0" ] }, - "1524": { + "1470": { "op": "dup", "defined_out": [ "interest_amount#1", @@ -5113,7 +5113,7 @@ "principal_index_delta#0 (copy)" ] }, - "1525": { + "1471": { "callsub": "modules.actus_kernel.ActusKernelModule._index_delta_to_amount", "op": "callsub _index_delta_to_amount", "defined_out": [ @@ -5147,7 +5147,7 @@ "principal_amount#1" ] }, - "1528": { + "1474": { "op": "dup", "stack_out": [ "entry#0", @@ -5173,7 +5173,7 @@ "principal_amount#1" ] }, - "1529": { + "1475": { "op": "bury 11", "defined_out": [ "interest_amount#1", @@ -5206,7 +5206,7 @@ "principal_amount#1" ] }, - "1531": { + "1477": { "op": "dig 2", "defined_out": [ "interest_amount#1", @@ -5241,7 +5241,7 @@ "interest_amount#1 (copy)" ] }, - "1533": { + "1479": { "op": "dig 1", "defined_out": [ "interest_amount#1", @@ -5278,7 +5278,7 @@ "principal_amount#1 (copy)" ] }, - "1535": { + "1481": { "op": "+", "defined_out": [ "interest_amount#1", @@ -5313,7 +5313,7 @@ "required_amount#0" ] }, - "1536": { + "1482": { "op": "dup", "stack_out": [ "entry#0", @@ -5340,7 +5340,7 @@ "required_amount#0" ] }, - "1537": { + "1483": { "op": "bury 9", "defined_out": [ "interest_amount#1", @@ -5375,7 +5375,7 @@ "required_amount#0" ] }, - "1539": { + "1485": { "op": "global CurrentApplicationAddress", "defined_out": [ "interest_amount#1", @@ -5412,7 +5412,7 @@ "tmp%0#3" ] }, - "1541": { + "1487": { "op": "intc_0 // 0", "stack_out": [ "entry#0", @@ -5440,7 +5440,7 @@ "0" ] }, - "1542": { + "1488": { "op": "bytec 19 // \"settlement_asset_id\"", "defined_out": [ "\"settlement_asset_id\"", @@ -5481,7 +5481,7 @@ "\"settlement_asset_id\"" ] }, - "1544": { + "1490": { "op": "app_global_get_ex", "defined_out": [ "interest_amount#1", @@ -5522,7 +5522,7 @@ "maybe_exists%0#0" ] }, - "1545": { + "1491": { "error": "check self.settlement_asset_id exists", "op": "assert // check self.settlement_asset_id exists", "stack_out": [ @@ -5551,7 +5551,7 @@ "maybe_value%0#0" ] }, - "1546": { + "1492": { "op": "asset_holding_get AssetBalance", "defined_out": [ "balance#0", @@ -5590,7 +5590,7 @@ "check%0#0" ] }, - "1548": { + "1494": { "error": "account opted into asset", "op": "assert // account opted into asset", "stack_out": [ @@ -5618,7 +5618,7 @@ "balance#0" ] }, - "1549": { + "1495": { "op": "intc_0 // 0", "stack_out": [ "entry#0", @@ -5646,7 +5646,7 @@ "0" ] }, - "1550": { + "1496": { "op": "bytec 15 // \"reserved_interest\"", "defined_out": [ "\"reserved_interest\"", @@ -5687,7 +5687,7 @@ "\"reserved_interest\"" ] }, - "1552": { + "1498": { "op": "app_global_get_ex", "stack_out": [ "entry#0", @@ -5716,7 +5716,7 @@ "maybe_exists%0#0" ] }, - "1553": { + "1499": { "error": "check self.reserved_interest exists", "op": "assert // check self.reserved_interest exists", "stack_out": [ @@ -5745,7 +5745,7 @@ "maybe_value%0#0" ] }, - "1554": { + "1500": { "op": "intc_0 // 0", "stack_out": [ "entry#0", @@ -5774,7 +5774,7 @@ "0" ] }, - "1555": { + "1501": { "op": "bytec 12 // \"reserved_principal\"", "defined_out": [ "\"reserved_principal\"", @@ -5817,7 +5817,7 @@ "\"reserved_principal\"" ] }, - "1557": { + "1503": { "op": "app_global_get_ex", "defined_out": [ "balance#0", @@ -5860,7 +5860,7 @@ "maybe_exists%1#0" ] }, - "1558": { + "1504": { "error": "check self.reserved_principal exists", "op": "assert // check self.reserved_principal exists", "stack_out": [ @@ -5890,7 +5890,7 @@ "maybe_value%1#0" ] }, - "1559": { + "1505": { "op": "dig 1", "defined_out": [ "balance#0", @@ -5933,7 +5933,7 @@ "maybe_value%0#0 (copy)" ] }, - "1561": { + "1507": { "op": "+", "defined_out": [ "balance#0", @@ -5974,7 +5974,7 @@ "reserved_total#0" ] }, - "1562": { + "1508": { "op": "dig 2", "defined_out": [ "balance#0", @@ -6017,7 +6017,7 @@ "balance#0 (copy)" ] }, - "1564": { + "1510": { "op": "dig 1", "defined_out": [ "balance#0", @@ -6062,7 +6062,7 @@ "reserved_total#0 (copy)" ] }, - "1566": { + "1512": { "op": ">=", "defined_out": [ "balance#0", @@ -6105,7 +6105,7 @@ "tmp%2#2" ] }, - "1567": { + "1513": { "error": "Not enough funds for the payment", "op": "assert // Not enough funds for the payment", "stack_out": [ @@ -6135,7 +6135,7 @@ "reserved_total#0" ] }, - "1568": { + "1514": { "op": "uncover 2", "stack_out": [ "entry#0", @@ -6164,7 +6164,7 @@ "balance#0" ] }, - "1570": { + "1516": { "op": "swap", "stack_out": [ "entry#0", @@ -6193,7 +6193,7 @@ "reserved_total#0" ] }, - "1571": { + "1517": { "op": "-", "defined_out": [ "interest_amount#1", @@ -6232,7 +6232,7 @@ "tmp%3#3" ] }, - "1572": { + "1518": { "op": "uncover 2", "stack_out": [ "entry#0", @@ -6260,7 +6260,7 @@ "required_amount#0" ] }, - "1574": { + "1520": { "op": ">=", "defined_out": [ "interest_amount#1", @@ -6298,7 +6298,7 @@ "tmp%15#1" ] }, - "1575": { + "1521": { "error": "Not enough funds for the payment", "op": "assert // Not enough funds for the payment", "stack_out": [ @@ -6325,7 +6325,7 @@ "maybe_value%0#0" ] }, - "1576": { + "1522": { "op": "uncover 3", "stack_out": [ "entry#0", @@ -6351,7 +6351,7 @@ "interest_amount#1" ] }, - "1578": { + "1524": { "op": "+", "defined_out": [ "interest_amount#1", @@ -6386,7 +6386,7 @@ "tmp%16#1" ] }, - "1579": { + "1525": { "op": "bytec 15 // \"reserved_interest\"", "stack_out": [ "entry#0", @@ -6412,7 +6412,7 @@ "\"reserved_interest\"" ] }, - "1581": { + "1527": { "op": "swap", "stack_out": [ "entry#0", @@ -6438,7 +6438,7 @@ "tmp%16#1" ] }, - "1582": { + "1528": { "op": "app_global_put", "stack_out": [ "entry#0", @@ -6462,7 +6462,7 @@ "principal_amount#1" ] }, - "1583": { + "1529": { "op": "intc_0 // 0", "stack_out": [ "entry#0", @@ -6487,7 +6487,7 @@ "0" ] }, - "1584": { + "1530": { "op": "bytec 12 // \"reserved_principal\"", "stack_out": [ "entry#0", @@ -6513,7 +6513,7 @@ "\"reserved_principal\"" ] }, - "1586": { + "1532": { "op": "app_global_get_ex", "defined_out": [ "interest_amount#1", @@ -6550,7 +6550,7 @@ "maybe_exists%5#0" ] }, - "1587": { + "1533": { "error": "check self.reserved_principal exists", "op": "assert // check self.reserved_principal exists", "stack_out": [ @@ -6576,7 +6576,7 @@ "maybe_value%5#0" ] }, - "1588": { + "1534": { "op": "+", "defined_out": [ "interest_amount#1", @@ -6610,7 +6610,7 @@ "tmp%17#0" ] }, - "1589": { + "1535": { "op": "bytec 12 // \"reserved_principal\"", "stack_out": [ "entry#0", @@ -6635,7 +6635,7 @@ "\"reserved_principal\"" ] }, - "1591": { + "1537": { "op": "swap", "stack_out": [ "entry#0", @@ -6660,7 +6660,7 @@ "tmp%17#0" ] }, - "1592": { + "1538": { "op": "app_global_put", "stack_out": [ "entry#0", @@ -6683,7 +6683,7 @@ "principal_index_delta#0" ] }, - "1593": { + "1539": { "op": "intc_0 // 0", "stack_out": [ "entry#0", @@ -6707,7 +6707,7 @@ "0" ] }, - "1594": { + "1540": { "op": "bytec 16 // \"cumulative_interest_index\"", "defined_out": [ "\"cumulative_interest_index\"", @@ -6743,7 +6743,7 @@ "\"cumulative_interest_index\"" ] }, - "1596": { + "1542": { "op": "app_global_get_ex", "defined_out": [ "interest_amount#1", @@ -6779,7 +6779,7 @@ "maybe_exists%6#0" ] }, - "1597": { + "1543": { "error": "check self.cumulative_interest_index exists", "op": "assert // check self.cumulative_interest_index exists", "stack_out": [ @@ -6804,7 +6804,7 @@ "maybe_value%6#0" ] }, - "1598": { + "1544": { "op": "uncover 2", "stack_out": [ "entry#0", @@ -6828,7 +6828,7 @@ "interest_index_delta#0" ] }, - "1600": { + "1546": { "op": "+", "defined_out": [ "interest_amount#1", @@ -6860,7 +6860,7 @@ "tmp%18#0" ] }, - "1601": { + "1547": { "op": "bytec 16 // \"cumulative_interest_index\"", "stack_out": [ "entry#0", @@ -6884,7 +6884,7 @@ "\"cumulative_interest_index\"" ] }, - "1603": { + "1549": { "op": "swap", "stack_out": [ "entry#0", @@ -6908,7 +6908,7 @@ "tmp%18#0" ] }, - "1604": { + "1550": { "op": "app_global_put", "stack_out": [ "entry#0", @@ -6930,7 +6930,7 @@ "principal_index_delta#0" ] }, - "1605": { + "1551": { "op": "intc_0 // 0", "stack_out": [ "entry#0", @@ -6953,7 +6953,7 @@ "0" ] }, - "1606": { + "1552": { "op": "bytec 17 // \"cumulative_principal_index\"", "defined_out": [ "\"cumulative_principal_index\"", @@ -6987,7 +6987,7 @@ "\"cumulative_principal_index\"" ] }, - "1608": { + "1554": { "op": "app_global_get_ex", "defined_out": [ "interest_amount#1", @@ -7021,7 +7021,7 @@ "maybe_exists%7#0" ] }, - "1609": { + "1555": { "error": "check self.cumulative_principal_index exists", "op": "assert // check self.cumulative_principal_index exists", "stack_out": [ @@ -7045,7 +7045,7 @@ "maybe_value%7#0" ] }, - "1610": { + "1556": { "op": "+", "defined_out": [ "interest_amount#1", @@ -7075,7 +7075,7 @@ "tmp%19#0" ] }, - "1611": { + "1557": { "op": "bytec 17 // \"cumulative_principal_index\"", "stack_out": [ "entry#0", @@ -7098,7 +7098,7 @@ "\"cumulative_principal_index\"" ] }, - "1613": { + "1559": { "op": "swap", "stack_out": [ "entry#0", @@ -7121,7 +7121,7 @@ "tmp%19#0" ] }, - "1614": { + "1560": { "op": "app_global_put", "stack_out": [ "entry#0", @@ -7142,7 +7142,7 @@ "max_event_count#0" ] }, - "1615": { + "1561": { "op": "dig 15", "defined_out": [ "entry#0", @@ -7172,7 +7172,7 @@ "entry#0" ] }, - "1617": { + "1563": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -7204,7 +7204,7 @@ "8" ] }, - "1618": { + "1564": { "op": "getbyte", "defined_out": [ "entry#0", @@ -7235,7 +7235,7 @@ "tmp%20#0" ] }, - "1619": { + "1565": { "op": "pushint 3", "defined_out": [ "3", @@ -7268,7 +7268,7 @@ "3" ] }, - "1621": { + "1567": { "op": "==", "defined_out": [ "entry#0", @@ -7299,7 +7299,7 @@ "tmp%21#0" ] }, - "1622": { + "1568": { "op": "bz fund_due_cashflows_else_body@40", "stack_out": [ "entry#0", @@ -7320,7 +7320,7 @@ "max_event_count#0" ] }, - "1625": { + "1571": { "op": "intc_0 // 0", "stack_out": [ "entry#0", @@ -7342,7 +7342,7 @@ "0" ] }, - "1626": { + "1572": { "op": "bytec 6 // \"accrued_interest\"", "defined_out": [ "\"accrued_interest\"", @@ -7375,7 +7375,7 @@ "\"accrued_interest\"" ] }, - "1628": { + "1574": { "op": "app_global_get_ex", "defined_out": [ "entry#0", @@ -7408,7 +7408,7 @@ "maybe_exists%8#0" ] }, - "1629": { + "1575": { "error": "check self.accrued_interest exists", "op": "assert // check self.accrued_interest exists", "stack_out": [ @@ -7431,7 +7431,7 @@ "maybe_value%8#0" ] }, - "1630": { + "1576": { "op": "dig 16", "stack_out": [ "entry#0", @@ -7454,7 +7454,7 @@ "entry#0" ] }, - "1632": { + "1578": { "callsub": "modules.actus_kernel.ActusKernelModule._entry_interest_segment", "op": "callsub _entry_interest_segment", "defined_out": [ @@ -7489,7 +7489,7 @@ "entry#0" ] }, - "1635": { + "1581": { "op": "bury 18", "defined_out": [ "_entry_interest_segment%0#0", @@ -7522,7 +7522,7 @@ "_entry_interest_segment%0#0" ] }, - "1637": { + "1583": { "op": "+", "defined_out": [ "entry#0", @@ -7553,7 +7553,7 @@ "tmp%22#0" ] }, - "1638": { + "1584": { "op": "bytec 6 // \"accrued_interest\"", "stack_out": [ "entry#0", @@ -7576,7 +7576,7 @@ "\"accrued_interest\"" ] }, - "1640": { + "1586": { "op": "swap", "stack_out": [ "entry#0", @@ -7599,7 +7599,7 @@ "tmp%22#0" ] }, - "1641": { + "1587": { "op": "app_global_put", "stack_out": [ "entry#0", @@ -7620,7 +7620,7 @@ "max_event_count#0" ] }, - "1642": { + "1588": { "block": "fund_due_cashflows_after_if_else@41", "stack_in": [ "entry#0", @@ -7665,7 +7665,7 @@ "tmp%23#0" ] }, - "1645": { + "1591": { "op": "bz fund_due_cashflows_if_body@43", "stack_out": [ "entry#0", @@ -7686,7 +7686,7 @@ "max_event_count#0" ] }, - "1648": { + "1594": { "op": "dig 15", "defined_out": [ "entry#0" @@ -7711,7 +7711,7 @@ "entry#0" ] }, - "1650": { + "1596": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -7738,7 +7738,7 @@ "8" ] }, - "1651": { + "1597": { "op": "getbyte", "defined_out": [ "entry#0", @@ -7764,7 +7764,7 @@ "tmp%24#0" ] }, - "1652": { + "1598": { "op": "pushint 19", "defined_out": [ "19", @@ -7792,7 +7792,7 @@ "19" ] }, - "1654": { + "1600": { "op": "==", "defined_out": [ "entry#0", @@ -7818,7 +7818,7 @@ "tmp%25#0" ] }, - "1655": { + "1601": { "op": "bz fund_due_cashflows_after_if_else@44", "stack_out": [ "entry#0", @@ -7839,7 +7839,7 @@ "max_event_count#0" ] }, - "1658": { + "1604": { "block": "fund_due_cashflows_if_body@43", "stack_in": [ "entry#0", @@ -7883,7 +7883,7 @@ "entry#0" ] }, - "1660": { + "1606": { "op": "pushint 41", "defined_out": [ "41", @@ -7910,7 +7910,7 @@ "41" ] }, - "1662": { + "1608": { "op": "extract_uint64", "defined_out": [ "entry#0", @@ -7936,7 +7936,7 @@ "values%4#0" ] }, - "1663": { + "1609": { "op": "bytec 14 // \"next_principal_redemption\"", "defined_out": [ "\"next_principal_redemption\"", @@ -7964,7 +7964,7 @@ "\"next_principal_redemption\"" ] }, - "1665": { + "1611": { "op": "swap", "stack_out": [ "entry#0", @@ -7987,7 +7987,7 @@ "values%4#0" ] }, - "1666": { + "1612": { "op": "app_global_put", "stack_out": [ "entry#0", @@ -8008,7 +8008,7 @@ "max_event_count#0" ] }, - "1667": { + "1613": { "block": "fund_due_cashflows_after_if_else@44", "stack_in": [ "entry#0", @@ -8052,7 +8052,7 @@ "\"outstanding_principal\"" ] }, - "1669": { + "1615": { "op": "dig 8", "defined_out": [ "\"outstanding_principal\"", @@ -8079,7 +8079,7 @@ "next_outstanding_principal#0" ] }, - "1671": { + "1617": { "op": "app_global_put", "stack_out": [ "entry#0", @@ -8100,7 +8100,7 @@ "max_event_count#0" ] }, - "1672": { + "1618": { "op": "bytec 7 // \"interest_calculation_base\"", "defined_out": [ "\"interest_calculation_base\"", @@ -8126,7 +8126,7 @@ "\"interest_calculation_base\"" ] }, - "1674": { + "1620": { "op": "dig 9", "defined_out": [ "\"interest_calculation_base\"", @@ -8154,7 +8154,7 @@ "next_interest_base#2" ] }, - "1676": { + "1622": { "op": "app_global_put", "stack_out": [ "entry#0", @@ -8175,7 +8175,7 @@ "max_event_count#0" ] }, - "1677": { + "1623": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -8202,7 +8202,7 @@ "0" ] }, - "1678": { + "1624": { "op": "bytec_2 // \"event_cursor\"", "defined_out": [ "\"event_cursor\"", @@ -8231,7 +8231,7 @@ "\"event_cursor\"" ] }, - "1679": { + "1625": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%9#0", @@ -8260,7 +8260,7 @@ "maybe_exists%9#0" ] }, - "1680": { + "1626": { "error": "check self.event_cursor exists", "op": "assert // check self.event_cursor exists", "stack_out": [ @@ -8283,7 +8283,7 @@ "maybe_value%9#0" ] }, - "1681": { + "1627": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -8312,7 +8312,7 @@ "1" ] }, - "1682": { + "1628": { "op": "+", "defined_out": [ "next_interest_base#2", @@ -8339,7 +8339,7 @@ "tmp%26#0" ] }, - "1683": { + "1629": { "op": "bytec_2 // \"event_cursor\"", "stack_out": [ "entry#0", @@ -8362,7 +8362,7 @@ "\"event_cursor\"" ] }, - "1684": { + "1630": { "op": "swap", "stack_out": [ "entry#0", @@ -8385,7 +8385,7 @@ "tmp%26#0" ] }, - "1685": { + "1631": { "op": "app_global_put", "stack_out": [ "entry#0", @@ -8406,7 +8406,7 @@ "max_event_count#0" ] }, - "1686": { + "1632": { "op": "dig 15", "defined_out": [ "entry#0", @@ -8433,7 +8433,7 @@ "entry#0" ] }, - "1688": { + "1634": { "op": "extract 8 1", "defined_out": [ "aggregate%extract%10#0", @@ -8461,7 +8461,7 @@ "aggregate%extract%10#0" ] }, - "1691": { + "1637": { "op": "pushbytes 0x13", "defined_out": [ "0x13", @@ -8491,7 +8491,7 @@ "0x13" ] }, - "1694": { + "1640": { "op": "b==", "defined_out": [ "entry#0", @@ -8519,7 +8519,7 @@ "tmp%27#0" ] }, - "1695": { + "1641": { "op": "bz fund_due_cashflows_after_if_else@47", "stack_out": [ "entry#0", @@ -8540,7 +8540,7 @@ "max_event_count#0" ] }, - "1698": { + "1644": { "op": "intc_0 // 0", "stack_out": [ "entry#0", @@ -8562,7 +8562,7 @@ "0" ] }, - "1699": { + "1645": { "op": "bytec 4 // \"outstanding_principal\"", "stack_out": [ "entry#0", @@ -8585,7 +8585,7 @@ "\"outstanding_principal\"" ] }, - "1701": { + "1647": { "op": "app_global_get_ex", "defined_out": [ "entry#0", @@ -8615,7 +8615,7 @@ "maybe_exists%10#0" ] }, - "1702": { + "1648": { "error": "check self.outstanding_principal exists", "op": "assert // check self.outstanding_principal exists", "stack_out": [ @@ -8638,7 +8638,7 @@ "maybe_value%10#0" ] }, - "1703": { + "1649": { "op": "bnz fund_due_cashflows_after_if_else@47", "stack_out": [ "entry#0", @@ -8659,7 +8659,7 @@ "max_event_count#0" ] }, - "1706": { + "1652": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"", @@ -8687,7 +8687,7 @@ "\"status\"" ] }, - "1707": { + "1653": { "op": "pushint 200", "defined_out": [ "\"status\"", @@ -8717,7 +8717,7 @@ "200" ] }, - "1710": { + "1656": { "op": "app_global_put", "stack_out": [ "entry#0", @@ -8738,7 +8738,7 @@ "max_event_count#0" ] }, - "1711": { + "1657": { "op": "bytec 7 // \"interest_calculation_base\"", "stack_out": [ "entry#0", @@ -8760,7 +8760,7 @@ "\"interest_calculation_base\"" ] }, - "1713": { + "1659": { "op": "intc_0 // 0", "stack_out": [ "entry#0", @@ -8783,7 +8783,7 @@ "0" ] }, - "1714": { + "1660": { "op": "app_global_put", "stack_out": [ "entry#0", @@ -8804,7 +8804,7 @@ "max_event_count#0" ] }, - "1715": { + "1661": { "block": "fund_due_cashflows_after_if_else@47", "stack_in": [ "entry#0", @@ -8848,7 +8848,7 @@ "entry#0" ] }, - "1717": { + "1663": { "op": "dig 4", "defined_out": [ "entry#0", @@ -8875,7 +8875,7 @@ "required_amount#0" ] }, - "1719": { + "1665": { "op": "dup", "defined_out": [ "entry#0", @@ -8904,7 +8904,7 @@ "required_amount#0" ] }, - "1720": { + "1666": { "callsub": "modules.actus_kernel.ActusKernelModule._emit_execution_event", "op": "callsub _emit_execution_event", "stack_out": [ @@ -8927,7 +8927,7 @@ "entry#0" ] }, - "1723": { + "1669": { "op": "pop", "stack_out": [ "entry#0", @@ -8948,7 +8948,7 @@ "max_event_count#0" ] }, - "1724": { + "1670": { "op": "dig 13", "defined_out": [ "entry#0", @@ -8975,7 +8975,7 @@ "funded_interest#0" ] }, - "1726": { + "1672": { "op": "dig 12", "defined_out": [ "entry#0", @@ -9004,7 +9004,7 @@ "interest_amount#1" ] }, - "1728": { + "1674": { "op": "+", "stack_out": [ "entry#0", @@ -9026,7 +9026,7 @@ "funded_interest#0" ] }, - "1729": { + "1675": { "op": "bury 14", "defined_out": [ "entry#0", @@ -9053,7 +9053,7 @@ "max_event_count#0" ] }, - "1731": { + "1677": { "op": "dig 12", "defined_out": [ "entry#0", @@ -9082,7 +9082,7 @@ "funded_principal#0" ] }, - "1733": { + "1679": { "op": "dig 7", "defined_out": [ "entry#0", @@ -9113,7 +9113,7 @@ "principal_amount#1" ] }, - "1735": { + "1681": { "op": "+", "stack_out": [ "entry#0", @@ -9135,7 +9135,7 @@ "funded_principal#0" ] }, - "1736": { + "1682": { "op": "bury 13", "defined_out": [ "entry#0", @@ -9164,7 +9164,7 @@ "max_event_count#0" ] }, - "1738": { + "1684": { "op": "dig 4", "defined_out": [ "entry#0", @@ -9195,7 +9195,7 @@ "processed_events#0" ] }, - "1740": { + "1686": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -9228,7 +9228,7 @@ "1" ] }, - "1741": { + "1687": { "op": "+", "stack_out": [ "entry#0", @@ -9250,7 +9250,7 @@ "processed_events#0" ] }, - "1742": { + "1688": { "op": "bury 5", "defined_out": [ "entry#0", @@ -9280,10 +9280,10 @@ "max_event_count#0" ] }, - "1744": { + "1690": { "op": "b fund_due_cashflows_while_top@4" }, - "1747": { + "1693": { "block": "fund_due_cashflows_else_body@40", "stack_in": [ "entry#0", @@ -9327,7 +9327,7 @@ "\"accrued_interest\"" ] }, - "1749": { + "1695": { "op": "intc_0 // 0", "defined_out": [ "\"accrued_interest\"", @@ -9354,7 +9354,7 @@ "0" ] }, - "1750": { + "1696": { "op": "app_global_put", "stack_out": [ "entry#0", @@ -9375,10 +9375,10 @@ "max_event_count#0" ] }, - "1751": { + "1697": { "op": "b fund_due_cashflows_after_if_else@41" }, - "1754": { + "1700": { "block": "fund_due_cashflows_if_body@29", "stack_in": [ "entry#0", @@ -9422,7 +9422,7 @@ "entry#0" ] }, - "1756": { + "1702": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -9449,7 +9449,7 @@ "8" ] }, - "1757": { + "1703": { "op": "getbyte", "defined_out": [ "entry#0", @@ -9475,7 +9475,7 @@ "event_type#0" ] }, - "1758": { + "1704": { "op": "dup", "stack_out": [ "entry#0", @@ -9498,7 +9498,7 @@ "event_type#0" ] }, - "1759": { + "1705": { "op": "bury 16", "defined_out": [ "entry#0", @@ -9524,7 +9524,7 @@ "event_type#0" ] }, - "1761": { + "1707": { "op": "pushint 3", "defined_out": [ "3", @@ -9552,7 +9552,7 @@ "3" ] }, - "1763": { + "1709": { "op": "==", "defined_out": [ "entry#0", @@ -9579,7 +9579,7 @@ "tmp%5#0" ] }, - "1764": { + "1710": { "op": "bz fund_due_cashflows_else_body@31", "stack_out": [ "entry#0", @@ -9600,7 +9600,7 @@ "max_event_count#0" ] }, - "1767": { + "1713": { "op": "intc_0 // 0", "stack_out": [ "entry#0", @@ -9622,7 +9622,7 @@ "0" ] }, - "1768": { + "1714": { "op": "bytec 4 // \"outstanding_principal\"", "defined_out": [ "\"outstanding_principal\"", @@ -9651,7 +9651,7 @@ "\"outstanding_principal\"" ] }, - "1770": { + "1716": { "op": "app_global_get_ex", "defined_out": [ "entry#0", @@ -9680,7 +9680,7 @@ "maybe_exists%1#0" ] }, - "1771": { + "1717": { "error": "check self.outstanding_principal exists", "op": "assert // check self.outstanding_principal exists", "stack_out": [ @@ -9703,7 +9703,7 @@ "maybe_value%1#0" ] }, - "1772": { + "1718": { "op": "dig 6", "defined_out": [ "entry#0", @@ -9732,7 +9732,7 @@ "principal_amount_due#0" ] }, - "1774": { + "1720": { "op": "-", "defined_out": [ "entry#0", @@ -9760,7 +9760,7 @@ "next_outstanding_principal#0" ] }, - "1775": { + "1721": { "op": "dup", "stack_out": [ "entry#0", @@ -9783,7 +9783,7 @@ "next_outstanding_principal#0" ] }, - "1776": { + "1722": { "op": "bury 9", "defined_out": [ "entry#0", @@ -9812,7 +9812,7 @@ "next_interest_base#2" ] }, - "1778": { + "1724": { "op": "bury 9", "defined_out": [ "entry#0", @@ -9840,10 +9840,10 @@ "max_event_count#0" ] }, - "1780": { + "1726": { "op": "b fund_due_cashflows_after_if_else@38" }, - "1783": { + "1729": { "block": "fund_due_cashflows_else_body@31", "stack_in": [ "entry#0", @@ -9887,7 +9887,7 @@ "event_type#0" ] }, - "1785": { + "1731": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -9914,7 +9914,7 @@ "8" ] }, - "1786": { + "1732": { "op": "==", "defined_out": [ "event_type#0", @@ -9940,7 +9940,7 @@ "tmp%7#0" ] }, - "1787": { + "1733": { "op": "bz fund_due_cashflows_else_body@33", "stack_out": [ "entry#0", @@ -9961,7 +9961,7 @@ "max_event_count#0" ] }, - "1790": { + "1736": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -9987,7 +9987,7 @@ "0" ] }, - "1791": { + "1737": { "op": "bytec 4 // \"outstanding_principal\"", "defined_out": [ "\"outstanding_principal\"", @@ -10015,7 +10015,7 @@ "\"outstanding_principal\"" ] }, - "1793": { + "1739": { "op": "app_global_get_ex", "defined_out": [ "event_type#0", @@ -10043,7 +10043,7 @@ "maybe_exists%2#0" ] }, - "1794": { + "1740": { "op": "swap", "stack_out": [ "entry#0", @@ -10066,7 +10066,7 @@ "next_outstanding_principal#0" ] }, - "1795": { + "1741": { "op": "bury 9", "defined_out": [ "event_type#0", @@ -10093,7 +10093,7 @@ "maybe_exists%2#0" ] }, - "1797": { + "1743": { "error": "check self.outstanding_principal exists", "op": "assert // check self.outstanding_principal exists", "stack_out": [ @@ -10115,7 +10115,7 @@ "max_event_count#0" ] }, - "1798": { + "1744": { "op": "intc_0 // 0", "stack_out": [ "entry#0", @@ -10137,7 +10137,7 @@ "0" ] }, - "1799": { + "1745": { "op": "bytec 7 // \"interest_calculation_base\"", "defined_out": [ "\"interest_calculation_base\"", @@ -10166,7 +10166,7 @@ "\"interest_calculation_base\"" ] }, - "1801": { + "1747": { "op": "app_global_get_ex", "defined_out": [ "event_type#0", @@ -10195,7 +10195,7 @@ "maybe_exists%3#0" ] }, - "1802": { + "1748": { "op": "swap", "stack_out": [ "entry#0", @@ -10218,7 +10218,7 @@ "next_interest_base#2" ] }, - "1803": { + "1749": { "op": "bury 10", "defined_out": [ "event_type#0", @@ -10246,7 +10246,7 @@ "maybe_exists%3#0" ] }, - "1805": { + "1751": { "error": "check self.interest_calculation_base exists", "op": "assert // check self.interest_calculation_base exists", "stack_out": [ @@ -10268,10 +10268,10 @@ "max_event_count#0" ] }, - "1806": { + "1752": { "op": "b fund_due_cashflows_after_if_else@38" }, - "1809": { + "1755": { "block": "fund_due_cashflows_else_body@33", "stack_in": [ "entry#0", @@ -10315,7 +10315,7 @@ "event_type#0" ] }, - "1811": { + "1757": { "op": "pushint 19", "defined_out": [ "19", @@ -10342,7 +10342,7 @@ "19" ] }, - "1813": { + "1759": { "op": "==", "defined_out": [ "event_type#0", @@ -10368,7 +10368,7 @@ "tmp%8#1" ] }, - "1814": { + "1760": { "op": "bnz fund_due_cashflows_if_body@34", "stack_out": [ "entry#0", @@ -10389,7 +10389,7 @@ "max_event_count#0" ] }, - "1817": { + "1763": { "op": "dig 7", "defined_out": [ "event_type#0", @@ -10415,7 +10415,7 @@ "next_interest_base#2" ] }, - "1819": { + "1765": { "op": "bury 9", "defined_out": [ "event_type#0", @@ -10440,10 +10440,10 @@ "max_event_count#0" ] }, - "1821": { + "1767": { "op": "b fund_due_cashflows_after_if_else@38" }, - "1824": { + "1770": { "block": "fund_due_cashflows_if_body@34", "stack_in": [ "entry#0", @@ -10487,7 +10487,7 @@ "next_outstanding_principal#0" ] }, - "1825": { + "1771": { "op": "bury 8", "defined_out": [ "next_outstanding_principal#0" @@ -10511,7 +10511,7 @@ "max_event_count#0" ] }, - "1827": { + "1773": { "op": "intc_0 // 0", "defined_out": [ "next_interest_base#2", @@ -10537,7 +10537,7 @@ "next_interest_base#2" ] }, - "1828": { + "1774": { "op": "bury 9", "defined_out": [ "next_interest_base#2", @@ -10562,10 +10562,10 @@ "max_event_count#0" ] }, - "1830": { + "1776": { "op": "b fund_due_cashflows_after_if_else@38" }, - "1833": { + "1779": { "block": "fund_due_cashflows_after_if_else@19", "stack_in": [ "entry#0", @@ -10610,7 +10610,7 @@ "tmp%3#1" ] }, - "1836": { + "1782": { "op": "bz fund_due_cashflows_after_if_else@27", "stack_out": [ "entry#0", @@ -10631,7 +10631,7 @@ "max_event_count#0" ] }, - "1839": { + "1785": { "op": "dig 14", "defined_out": [ "event_type#0" @@ -10656,7 +10656,7 @@ "event_type#0" ] }, - "1841": { + "1787": { "op": "pushint 19", "defined_out": [ "19", @@ -10683,7 +10683,7 @@ "19" ] }, - "1843": { + "1789": { "op": "==", "defined_out": [ "event_type#0", @@ -10709,7 +10709,7 @@ "tmp%4#0" ] }, - "1844": { + "1790": { "op": "bz fund_due_cashflows_after_if_else@22", "stack_out": [ "entry#0", @@ -10730,7 +10730,7 @@ "max_event_count#0" ] }, - "1847": { + "1793": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -10756,7 +10756,7 @@ "0" ] }, - "1848": { + "1794": { "op": "bytec 4 // \"outstanding_principal\"", "defined_out": [ "\"outstanding_principal\"", @@ -10784,7 +10784,7 @@ "\"outstanding_principal\"" ] }, - "1850": { + "1796": { "op": "app_global_get_ex", "defined_out": [ "event_type#0", @@ -10812,7 +10812,7 @@ "maybe_exists%0#0" ] }, - "1851": { + "1797": { "error": "check self.outstanding_principal exists", "op": "assert // check self.outstanding_principal exists", "defined_out": [ @@ -10839,7 +10839,7 @@ "principal_amount_due#0" ] }, - "1852": { + "1798": { "op": "bury 6", "defined_out": [ "event_type#0", @@ -10864,10 +10864,10 @@ "max_event_count#0" ] }, - "1854": { + "1800": { "op": "b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@28" }, - "1857": { + "1803": { "block": "fund_due_cashflows_after_if_else@22", "stack_in": [ "entry#0", @@ -10911,7 +10911,7 @@ "0" ] }, - "1858": { + "1804": { "op": "bytec 6 // \"accrued_interest\"", "defined_out": [ "\"accrued_interest\"", @@ -10938,7 +10938,7 @@ "\"accrued_interest\"" ] }, - "1860": { + "1806": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%1#0", @@ -10965,7 +10965,7 @@ "maybe_exists%1#0" ] }, - "1861": { + "1807": { "error": "check self.accrued_interest exists", "op": "assert // check self.accrued_interest exists", "stack_out": [ @@ -10988,7 +10988,7 @@ "maybe_value%1#0" ] }, - "1862": { + "1808": { "op": "dig 16", "defined_out": [ "entry#0", @@ -11015,7 +11015,7 @@ "entry#0" ] }, - "1864": { + "1810": { "callsub": "modules.actus_kernel.ActusKernelModule._entry_interest_segment", "op": "callsub _entry_interest_segment", "defined_out": [ @@ -11045,7 +11045,7 @@ "entry#0" ] }, - "1867": { + "1813": { "op": "bury 18", "defined_out": [ "_entry_interest_segment%0#0", @@ -11073,7 +11073,7 @@ "_entry_interest_segment%0#0" ] }, - "1869": { + "1815": { "op": "+", "defined_out": [ "entry#0", @@ -11099,7 +11099,7 @@ "interest_due#0" ] }, - "1870": { + "1816": { "op": "dup", "stack_out": [ "entry#0", @@ -11122,7 +11122,7 @@ "interest_due#0" ] }, - "1871": { + "1817": { "op": "bury 11", "defined_out": [ "entry#0", @@ -11148,7 +11148,7 @@ "interest_due#0" ] }, - "1873": { + "1819": { "op": "intc_0 // 0", "stack_out": [ "entry#0", @@ -11171,7 +11171,7 @@ "0" ] }, - "1874": { + "1820": { "op": "bytec 14 // \"next_principal_redemption\"", "defined_out": [ "\"next_principal_redemption\"", @@ -11201,7 +11201,7 @@ "\"next_principal_redemption\"" ] }, - "1876": { + "1822": { "op": "app_global_get_ex", "defined_out": [ "entry#0", @@ -11231,7 +11231,7 @@ "maybe_exists%2#0" ] }, - "1877": { + "1823": { "error": "check self.next_principal_redemption exists", "op": "assert // check self.next_principal_redemption exists", "stack_out": [ @@ -11255,7 +11255,7 @@ "maybe_value%2#0" ] }, - "1878": { + "1824": { "op": ">=", "defined_out": [ "entry#0", @@ -11282,7 +11282,7 @@ "tmp%6#2" ] }, - "1879": { + "1825": { "op": "bz fund_due_cashflows_after_if_else@24", "stack_out": [ "entry#0", @@ -11303,7 +11303,7 @@ "max_event_count#0" ] }, - "1882": { + "1828": { "op": "intc_0 // 0", "defined_out": [ "entry#0", @@ -11330,7 +11330,7 @@ "principal_amount_due#0" ] }, - "1883": { + "1829": { "op": "bury 6", "defined_out": [ "entry#0", @@ -11356,10 +11356,10 @@ "max_event_count#0" ] }, - "1885": { + "1831": { "op": "b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@28" }, - "1888": { + "1834": { "block": "fund_due_cashflows_after_if_else@24", "stack_in": [ "entry#0", @@ -11403,7 +11403,7 @@ "0" ] }, - "1889": { + "1835": { "op": "bytec 14 // \"next_principal_redemption\"", "defined_out": [ "\"next_principal_redemption\"", @@ -11430,7 +11430,7 @@ "\"next_principal_redemption\"" ] }, - "1891": { + "1837": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%3#0", @@ -11457,7 +11457,7 @@ "maybe_exists%3#0" ] }, - "1892": { + "1838": { "error": "check self.next_principal_redemption exists", "op": "assert // check self.next_principal_redemption exists", "stack_out": [ @@ -11480,7 +11480,7 @@ "maybe_value%3#1" ] }, - "1893": { + "1839": { "op": "dig 10", "defined_out": [ "interest_due#0", @@ -11507,7 +11507,7 @@ "interest_due#0" ] }, - "1895": { + "1841": { "op": "-", "defined_out": [ "interest_due#0", @@ -11533,7 +11533,7 @@ "principal_amount#1" ] }, - "1896": { + "1842": { "op": "dup", "stack_out": [ "entry#0", @@ -11556,7 +11556,7 @@ "principal_amount#1" ] }, - "1897": { + "1843": { "op": "bury 8", "defined_out": [ "interest_due#0", @@ -11582,7 +11582,7 @@ "principal_amount#1" ] }, - "1899": { + "1845": { "op": "intc_0 // 0", "stack_out": [ "entry#0", @@ -11605,7 +11605,7 @@ "0" ] }, - "1900": { + "1846": { "op": "bytec 4 // \"outstanding_principal\"", "defined_out": [ "\"outstanding_principal\"", @@ -11635,7 +11635,7 @@ "\"outstanding_principal\"" ] }, - "1902": { + "1848": { "op": "app_global_get_ex", "defined_out": [ "interest_due#0", @@ -11665,7 +11665,7 @@ "maybe_exists%4#1" ] }, - "1903": { + "1849": { "error": "check self.outstanding_principal exists", "op": "assert // check self.outstanding_principal exists", "stack_out": [ @@ -11689,7 +11689,7 @@ "maybe_value%4#1" ] }, - "1904": { + "1850": { "op": ">", "defined_out": [ "interest_due#0", @@ -11716,7 +11716,7 @@ "tmp%8#1" ] }, - "1905": { + "1851": { "op": "bz fund_due_cashflows_after_if_else@26", "stack_out": [ "entry#0", @@ -11737,7 +11737,7 @@ "max_event_count#0" ] }, - "1908": { + "1854": { "op": "intc_0 // 0", "stack_out": [ "entry#0", @@ -11759,7 +11759,7 @@ "0" ] }, - "1909": { + "1855": { "op": "bytec 4 // \"outstanding_principal\"", "stack_out": [ "entry#0", @@ -11782,7 +11782,7 @@ "\"outstanding_principal\"" ] }, - "1911": { + "1857": { "op": "app_global_get_ex", "defined_out": [ "interest_due#0", @@ -11811,7 +11811,7 @@ "maybe_exists%5#0" ] }, - "1912": { + "1858": { "error": "check self.outstanding_principal exists", "op": "assert // check self.outstanding_principal exists", "defined_out": [ @@ -11839,7 +11839,7 @@ "principal_amount_due#0" ] }, - "1913": { + "1859": { "op": "bury 6", "defined_out": [ "interest_due#0", @@ -11865,10 +11865,10 @@ "max_event_count#0" ] }, - "1915": { + "1861": { "op": "b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@28" }, - "1918": { + "1864": { "block": "fund_due_cashflows_after_if_else@26", "stack_in": [ "entry#0", @@ -11912,7 +11912,7 @@ "principal_amount_due#0" ] }, - "1920": { + "1866": { "op": "bury 6", "defined_out": [ "principal_amount_due#0" @@ -11936,10 +11936,10 @@ "max_event_count#0" ] }, - "1922": { + "1868": { "op": "b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@28" }, - "1925": { + "1871": { "block": "fund_due_cashflows_after_if_else@27", "stack_in": [ "entry#0", @@ -11983,7 +11983,7 @@ "entry#0" ] }, - "1927": { + "1873": { "op": "pushint 49", "defined_out": [ "49", @@ -12010,7 +12010,7 @@ "49" ] }, - "1929": { + "1875": { "op": "extract_uint64", "defined_out": [ "entry#0", @@ -12036,7 +12036,7 @@ "values%0#0" ] }, - "1930": { + "1876": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -12064,7 +12064,7 @@ "0" ] }, - "1931": { + "1877": { "op": "bytec 4 // \"outstanding_principal\"", "defined_out": [ "\"outstanding_principal\"", @@ -12094,7 +12094,7 @@ "\"outstanding_principal\"" ] }, - "1933": { + "1879": { "op": "app_global_get_ex", "defined_out": [ "entry#0", @@ -12124,7 +12124,7 @@ "maybe_exists%6#0" ] }, - "1934": { + "1880": { "error": "check self.outstanding_principal exists", "op": "assert // check self.outstanding_principal exists", "stack_out": [ @@ -12148,7 +12148,7 @@ "maybe_value%6#0" ] }, - "1935": { + "1881": { "op": "dup2", "defined_out": [ "entry#0", @@ -12180,7 +12180,7 @@ "maybe_value%6#0 (copy)" ] }, - "1936": { + "1882": { "op": "<=", "defined_out": [ "entry#0", @@ -12210,7 +12210,7 @@ "tmp%9#2" ] }, - "1937": { + "1883": { "error": "Invalid ACTUS configuration", "op": "assert // Invalid ACTUS configuration", "stack_out": [ @@ -12234,7 +12234,7 @@ "maybe_value%6#0" ] }, - "1938": { + "1884": { "op": "swap", "stack_out": [ "entry#0", @@ -12257,7 +12257,7 @@ "values%0#0" ] }, - "1939": { + "1885": { "op": "-", "defined_out": [ "entry#0", @@ -12284,7 +12284,7 @@ "principal_amount_due#0" ] }, - "1940": { + "1886": { "op": "bury 6", "defined_out": [ "entry#0", @@ -12310,10 +12310,10 @@ "max_event_count#0" ] }, - "1942": { + "1888": { "op": "b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@28" }, - "1945": { + "1891": { "block": "fund_due_cashflows_after_if_else@15", "stack_in": [ "entry#0", @@ -12357,7 +12357,7 @@ "0" ] }, - "1946": { + "1892": { "op": "bytec 6 // \"accrued_interest\"", "defined_out": [ "\"accrued_interest\"", @@ -12384,7 +12384,7 @@ "\"accrued_interest\"" ] }, - "1948": { + "1894": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -12411,7 +12411,7 @@ "maybe_exists%0#0" ] }, - "1949": { + "1895": { "error": "check self.accrued_interest exists", "op": "assert // check self.accrued_interest exists", "stack_out": [ @@ -12434,7 +12434,7 @@ "maybe_value%0#0" ] }, - "1950": { + "1896": { "op": "dig 16", "defined_out": [ "entry#0", @@ -12461,7 +12461,7 @@ "entry#0" ] }, - "1952": { + "1898": { "callsub": "modules.actus_kernel.ActusKernelModule._entry_interest_segment", "op": "callsub _entry_interest_segment", "defined_out": [ @@ -12491,7 +12491,7 @@ "entry#0" ] }, - "1955": { + "1901": { "op": "bury 18", "defined_out": [ "_entry_interest_segment%0#0", @@ -12519,7 +12519,7 @@ "_entry_interest_segment%0#0" ] }, - "1957": { + "1903": { "op": "+", "defined_out": [ "entry#0", @@ -12545,7 +12545,7 @@ "interest_amount_due#0" ] }, - "1958": { + "1904": { "op": "bury 11", "defined_out": [ "entry#0", @@ -12570,10 +12570,10 @@ "max_event_count#0" ] }, - "1960": { + "1906": { "op": "b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_interest_amount@16" }, - "1963": { + "1909": { "block": "fund_due_cashflows_after_while@11", "stack_in": [ "entry#0", @@ -12617,7 +12617,7 @@ "processed_events#0" ] }, - "1965": { + "1911": { "op": "dup", "defined_out": [ "processed_events#0", @@ -12644,7 +12644,7 @@ "processed_events#0 (copy)" ] }, - "1966": { + "1912": { "error": "No due cashflow to pay", "op": "assert // No due cashflow to pay", "stack_out": [ @@ -12667,7 +12667,7 @@ "processed_events#0" ] }, - "1967": { + "1913": { "op": "dig 14", "defined_out": [ "funded_interest#0", @@ -12694,7 +12694,7 @@ "funded_interest#0" ] }, - "1969": { + "1915": { "op": "dup", "defined_out": [ "funded_interest#0", @@ -12723,7 +12723,7 @@ "funded_interest#0 (copy)" ] }, - "1970": { + "1916": { "op": "dig 15", "defined_out": [ "funded_interest#0", @@ -12754,7 +12754,7 @@ "funded_principal#0" ] }, - "1972": { + "1918": { "op": "dup", "defined_out": [ "funded_interest#0", @@ -12787,7 +12787,7 @@ "funded_principal#0 (copy)" ] }, - "1973": { + "1919": { "op": "cover 3", "stack_out": [ "entry#0", @@ -12813,7 +12813,7 @@ "funded_principal#0 (copy)" ] }, - "1975": { + "1921": { "op": "+", "defined_out": [ "funded_interest#0", @@ -12844,7 +12844,7 @@ "tmp%14#0" ] }, - "1976": { + "1922": { "op": "global LatestTimestamp", "defined_out": [ "funded_interest#0", @@ -12877,7 +12877,7 @@ "tmp%15#0" ] }, - "1978": { + "1924": { "op": "uncover 2", "stack_out": [ "entry#0", @@ -12903,7 +12903,7 @@ "funded_interest#0" ] }, - "1980": { + "1926": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0", @@ -12937,7 +12937,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "1981": { + "1927": { "op": "uncover 3", "stack_out": [ "entry#0", @@ -12963,7 +12963,7 @@ "funded_principal#0" ] }, - "1983": { + "1929": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0", @@ -12998,7 +12998,7 @@ "aggregate%val_as_bytes%1#0" ] }, - "1984": { + "1930": { "op": "concat", "defined_out": [ "aggregate%head%1#0", @@ -13031,7 +13031,7 @@ "aggregate%head%1#0" ] }, - "1985": { + "1931": { "op": "uncover 2", "stack_out": [ "entry#0", @@ -13056,7 +13056,7 @@ "tmp%14#0" ] }, - "1987": { + "1933": { "op": "itob", "defined_out": [ "aggregate%head%1#0", @@ -13089,7 +13089,7 @@ "aggregate%val_as_bytes%2#0" ] }, - "1988": { + "1934": { "op": "concat", "defined_out": [ "aggregate%head%2#0", @@ -13120,7 +13120,7 @@ "aggregate%head%2#0" ] }, - "1989": { + "1935": { "op": "uncover 2", "stack_out": [ "entry#0", @@ -13144,7 +13144,7 @@ "processed_events#0" ] }, - "1991": { + "1937": { "op": "itob", "defined_out": [ "aggregate%head%2#0", @@ -13176,7 +13176,7 @@ "aggregate%val_as_bytes%3#0" ] }, - "1992": { + "1938": { "op": "concat", "defined_out": [ "aggregate%head%3#0", @@ -13206,7 +13206,7 @@ "aggregate%head%3#0" ] }, - "1993": { + "1939": { "op": "swap", "stack_out": [ "entry#0", @@ -13229,7 +13229,7 @@ "tmp%15#0" ] }, - "1994": { + "1940": { "op": "itob", "defined_out": [ "aggregate%head%3#0", @@ -13259,7 +13259,7 @@ "aggregate%val_as_bytes%4#0" ] }, - "1995": { + "1941": { "op": "concat", "defined_out": [ "aggregate%head%4#0", @@ -13287,7 +13287,7 @@ "aggregate%head%4#0" ] }, - "1996": { + "1942": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -13317,7 +13317,7 @@ "0x151f7c75" ] }, - "1997": { + "1943": { "op": "swap", "stack_out": [ "entry#0", @@ -13340,7 +13340,7 @@ "aggregate%head%4#0" ] }, - "1998": { + "1944": { "op": "concat", "defined_out": [ "funded_interest#0", @@ -13368,7 +13368,7 @@ "tmp%3#0" ] }, - "1999": { + "1945": { "op": "log", "stack_out": [ "entry#0", @@ -13389,7 +13389,7 @@ "max_event_count#0" ] }, - "2000": { + "1946": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -13417,7 +13417,7 @@ "1" ] }, - "2001": { + "1947": { "op": "return", "stack_out": [ "entry#0", @@ -13438,7 +13438,7 @@ "max_event_count#0" ] }, - "2002": { + "1948": { "block": "fund_due_cashflows_bool_false@53", "stack_in": [ "entry#0", @@ -13482,10 +13482,10 @@ "or_result%0#0" ] }, - "2003": { + "1949": { "op": "b fund_due_cashflows_bool_merge@54" }, - "2006": { + "1952": { "subroutine": "modules.payment_agent.PaymentAgent.claim_due_cashflows[routing]", "params": {}, "block": "claim_due_cashflows", @@ -13495,7 +13495,7 @@ "interest_amount#0" ] }, - "2008": { + "1954": { "op": "dupn 2", "stack_out": [ "interest_amount#0", @@ -13503,10 +13503,10 @@ "total_amount#0" ] }, - "2010": { + "1956": { "op": "txna ApplicationArgs 1" }, - "2013": { + "1959": { "op": "dupn 2", "defined_out": [ "holding_address#0", @@ -13521,7 +13521,7 @@ "holding_address#0 (copy)" ] }, - "2015": { + "1961": { "op": "len", "defined_out": [ "holding_address#0", @@ -13536,7 +13536,7 @@ "len%0#0" ] }, - "2016": { + "1962": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -13553,7 +13553,7 @@ "32" ] }, - "2017": { + "1963": { "op": "==", "defined_out": [ "eq%0#0", @@ -13568,7 +13568,7 @@ "eq%0#0" ] }, - "2018": { + "1964": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ @@ -13579,7 +13579,7 @@ "holding_address#0" ] }, - "2019": { + "1965": { "op": "txna ApplicationArgs 2", "defined_out": [ "holding_address#0", @@ -13594,7 +13594,7 @@ "tmp%2#0" ] }, - "2022": { + "1968": { "op": "dup", "defined_out": [ "holding_address#0", @@ -13611,7 +13611,7 @@ "tmp%2#0 (copy)" ] }, - "2023": { + "1969": { "op": "intc_0 // 0", "stack_out": [ "interest_amount#0", @@ -13624,7 +13624,7 @@ "0" ] }, - "2024": { + "1970": { "error": "invalid array length header", "op": "extract_uint16 // on error: invalid array length header", "defined_out": [ @@ -13642,7 +13642,7 @@ "aggregate%array_length%0#0" ] }, - "2025": { + "1971": { "op": "pushint 2", "defined_out": [ "2", @@ -13661,7 +13661,7 @@ "2" ] }, - "2027": { + "1973": { "op": "+", "defined_out": [ "add%0#0", @@ -13678,7 +13678,7 @@ "add%0#0" ] }, - "2028": { + "1974": { "op": "dig 1", "stack_out": [ "interest_amount#0", @@ -13691,7 +13691,7 @@ "tmp%2#0 (copy)" ] }, - "2030": { + "1976": { "op": "len", "defined_out": [ "add%0#0", @@ -13710,7 +13710,7 @@ "len%1#0" ] }, - "2031": { + "1977": { "op": "==", "defined_out": [ "eq%1#0", @@ -13727,7 +13727,7 @@ "eq%1#0" ] }, - "2032": { + "1978": { "error": "invalid number of bytes for arc4.dynamic_array", "op": "assert // invalid number of bytes for arc4.dynamic_array", "stack_out": [ @@ -13739,7 +13739,7 @@ "tmp%2#0" ] }, - "2033": { + "1979": { "op": "extract 2 0", "defined_out": [ "holding_address#0", @@ -13754,7 +13754,7 @@ "payment_info#0" ] }, - "2036": { + "1982": { "op": "swap", "defined_out": [ "holding_address#0", @@ -13769,7 +13769,7 @@ "holding_address#0" ] }, - "2037": { + "1983": { "op": "intc_0 // 0", "stack_out": [ "interest_amount#0", @@ -13781,7 +13781,7 @@ "0" ] }, - "2038": { + "1984": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"", @@ -13800,7 +13800,7 @@ "\"status\"" ] }, - "2039": { + "1985": { "op": "app_global_get_ex", "defined_out": [ "holding_address#0", @@ -13819,7 +13819,7 @@ "maybe_exists%0#0" ] }, - "2040": { + "1986": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ @@ -13832,7 +13832,7 @@ "maybe_value%0#0" ] }, - "2041": { + "1987": { "error": "D-ASA not configured", "op": "assert // D-ASA not configured", "stack_out": [ @@ -13844,10 +13844,10 @@ "holding_address#0" ] }, - "2042": { - "op": "bytec 8 // 0x52234163636f756e7423", + "1988": { + "op": "bytec 8 // 0x4123", "defined_out": [ - "0x52234163636f756e7423", + "0x4123", "holding_address#0", "payment_info#0" ], @@ -13858,10 +13858,10 @@ "holding_address#0", "payment_info#0", "holding_address#0", - "0x52234163636f756e7423" + "0x4123" ] }, - "2044": { + "1990": { "op": "swap", "stack_out": [ "interest_amount#0", @@ -13869,11 +13869,11 @@ "total_amount#0", "holding_address#0", "payment_info#0", - "0x52234163636f756e7423", + "0x4123", "holding_address#0" ] }, - "2045": { + "1991": { "op": "concat", "defined_out": [ "box_prefixed_key%0#4", @@ -13889,7 +13889,7 @@ "box_prefixed_key%0#4" ] }, - "2046": { + "1992": { "op": "dup", "defined_out": [ "box_prefixed_key%0#4", @@ -13906,7 +13906,7 @@ "box_prefixed_key%0#4" ] }, - "2047": { + "1993": { "op": "box_len", "defined_out": [ "_%0#0", @@ -13926,7 +13926,7 @@ "maybe_exists%0#0" ] }, - "2048": { + "1994": { "op": "bury 1", "stack_out": [ "interest_amount#0", @@ -13938,7 +13938,7 @@ "maybe_exists%0#0" ] }, - "2050": { + "1996": { "error": "Invalid account holding address", "op": "assert // Invalid account holding address", "stack_out": [ @@ -13950,7 +13950,7 @@ "box_prefixed_key%0#4" ] }, - "2051": { + "1997": { "op": "intc_0 // 0", "stack_out": [ "interest_amount#0", @@ -13962,11 +13962,11 @@ "0" ] }, - "2052": { - "op": "bytec 26 // 0x52234f704461656d6f6e23", + "1998": { + "op": "bytec 26 // 0x523a4f504423", "defined_out": [ "0", - "0x52234f704461656d6f6e23", + "0x523a4f504423", "box_prefixed_key%0#4", "holding_address#0", "payment_info#0" @@ -13979,10 +13979,10 @@ "payment_info#0", "box_prefixed_key%0#4", "0", - "0x52234f704461656d6f6e23" + "0x523a4f504423" ] }, - "2054": { + "2000": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#4", @@ -14002,7 +14002,7 @@ "maybe_exists%0#0" ] }, - "2055": { + "2001": { "error": "check self.op_daemon exists", "op": "assert // check self.op_daemon exists", "stack_out": [ @@ -14015,7 +14015,7 @@ "maybe_value%0#3" ] }, - "2056": { + "2002": { "op": "global ZeroAddress", "defined_out": [ "box_prefixed_key%0#4", @@ -14035,7 +14035,7 @@ "tmp%0#1" ] }, - "2058": { + "2004": { "op": "!=", "defined_out": [ "box_prefixed_key%0#4", @@ -14053,7 +14053,7 @@ "tmp%1#2" ] }, - "2059": { + "2005": { "op": "bz claim_due_cashflows_after_if_else@17", "stack_out": [ "interest_amount#0", @@ -14064,7 +14064,7 @@ "box_prefixed_key%0#4" ] }, - "2062": { + "2008": { "op": "txn Sender", "defined_out": [ "box_prefixed_key%0#4", @@ -14082,7 +14082,7 @@ "tmp%2#3" ] }, - "2064": { + "2010": { "op": "intc_0 // 0", "stack_out": [ "interest_amount#0", @@ -14095,8 +14095,8 @@ "0" ] }, - "2065": { - "op": "bytec 26 // 0x52234f704461656d6f6e23", + "2011": { + "op": "bytec 26 // 0x523a4f504423", "stack_out": [ "interest_amount#0", "principal_amount#0", @@ -14106,10 +14106,10 @@ "box_prefixed_key%0#4", "tmp%2#3", "0", - "0x52234f704461656d6f6e23" + "0x523a4f504423" ] }, - "2067": { + "2013": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#4", @@ -14131,7 +14131,7 @@ "maybe_exists%1#0" ] }, - "2068": { + "2014": { "error": "check self.op_daemon exists", "op": "assert // check self.op_daemon exists", "stack_out": [ @@ -14145,7 +14145,7 @@ "maybe_value%1#1" ] }, - "2069": { + "2015": { "op": "==", "defined_out": [ "box_prefixed_key%0#4", @@ -14163,7 +14163,7 @@ "tmp%3#1" ] }, - "2070": { + "2016": { "op": "bnz claim_due_cashflows_bool_true@14", "stack_out": [ "interest_amount#0", @@ -14174,7 +14174,7 @@ "box_prefixed_key%0#4" ] }, - "2073": { + "2019": { "op": "txn Sender", "defined_out": [ "box_prefixed_key%0#4", @@ -14192,7 +14192,7 @@ "tmp%4#0" ] }, - "2075": { + "2021": { "op": "dig 3", "stack_out": [ "interest_amount#0", @@ -14205,7 +14205,7 @@ "holding_address#0" ] }, - "2077": { + "2023": { "op": "==", "defined_out": [ "box_prefixed_key%0#4", @@ -14223,7 +14223,7 @@ "tmp%5#2" ] }, - "2078": { + "2024": { "op": "bnz claim_due_cashflows_bool_true@14", "stack_out": [ "interest_amount#0", @@ -14234,7 +14234,7 @@ "box_prefixed_key%0#4" ] }, - "2081": { + "2027": { "op": "txn Sender", "defined_out": [ "box_prefixed_key%0#4", @@ -14252,7 +14252,7 @@ "tmp%6#1" ] }, - "2083": { + "2029": { "op": "dig 1", "stack_out": [ "interest_amount#0", @@ -14265,7 +14265,7 @@ "box_prefixed_key%0#4" ] }, - "2085": { + "2031": { "op": "box_get", "defined_out": [ "aggregate%box_get%0#0", @@ -14287,7 +14287,7 @@ "aggregate%box_get%1#0" ] }, - "2086": { + "2032": { "error": "check self.account entry exists", "op": "assert // check self.account entry exists", "stack_out": [ @@ -14301,7 +14301,7 @@ "aggregate%box_get%0#0" ] }, - "2087": { + "2033": { "op": "extract 0 32", "defined_out": [ "aggregate%extract%0#0", @@ -14321,7 +14321,7 @@ "aggregate%extract%0#0" ] }, - "2090": { + "2036": { "op": "==", "defined_out": [ "box_prefixed_key%0#4", @@ -14339,7 +14339,7 @@ "tmp%7#1" ] }, - "2091": { + "2037": { "op": "bz claim_due_cashflows_bool_false@15", "stack_out": [ "interest_amount#0", @@ -14350,7 +14350,7 @@ "box_prefixed_key%0#4" ] }, - "2094": { + "2040": { "block": "claim_due_cashflows_bool_true@14", "stack_in": [ "interest_amount#0", @@ -14374,7 +14374,7 @@ "or_result%0#0" ] }, - "2095": { + "2041": { "error": "Not authorized", "block": "claim_due_cashflows_bool_merge@16", "stack_in": [ @@ -14397,7 +14397,7 @@ "box_prefixed_key%0#4" ] }, - "2096": { + "2042": { "block": "claim_due_cashflows_after_if_else@17", "stack_in": [ "interest_amount#0", @@ -14410,11 +14410,11 @@ "callsub": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", "op": "callsub _assert_is_not_asset_defaulted" }, - "2099": { + "2045": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_suspended", "op": "callsub _assert_is_not_asset_suspended" }, - "2102": { + "2048": { "op": "intc_0 // 0", "defined_out": [ "0" @@ -14429,7 +14429,7 @@ "0" ] }, - "2103": { + "2049": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"", @@ -14446,7 +14446,7 @@ "\"status\"" ] }, - "2104": { + "2050": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -14463,7 +14463,7 @@ "maybe_exists%0#0" ] }, - "2105": { + "2051": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ @@ -14476,7 +14476,7 @@ "maybe_value%0#0" ] }, - "2106": { + "2052": { "op": "pushint 50", "defined_out": [ "50", @@ -14493,7 +14493,7 @@ "50" ] }, - "2108": { + "2054": { "op": "==", "defined_out": [ "tmp%0#2" @@ -14508,7 +14508,7 @@ "tmp%0#2" ] }, - "2109": { + "2055": { "op": "!", "defined_out": [ "tmp%1#2" @@ -14523,7 +14523,7 @@ "tmp%1#2" ] }, - "2110": { + "2056": { "error": "IED not yet executed", "op": "assert // IED not yet executed", "stack_out": [ @@ -14535,7 +14535,7 @@ "box_prefixed_key%0#4" ] }, - "2111": { + "2057": { "op": "dig 2", "defined_out": [ "holding_address#0" @@ -14550,7 +14550,7 @@ "holding_address#0" ] }, - "2113": { + "2059": { "op": "dup", "defined_out": [ "holding_address#0", @@ -14567,7 +14567,7 @@ "holding_address#0 (copy)" ] }, - "2114": { + "2060": { "callsub": "modules.accounting.AccountingModule._ensure_units_activated", "op": "callsub _ensure_units_activated", "stack_out": [ @@ -14580,7 +14580,7 @@ "holding_address#0" ] }, - "2117": { + "2063": { "callsub": "modules.accounting.AccountingModule._settle_position", "op": "callsub _settle_position", "defined_out": [ @@ -14599,7 +14599,7 @@ "{_settle_position}.1" ] }, - "2120": { + "2066": { "op": "popn 2", "stack_out": [ "interest_amount#0", @@ -14610,7 +14610,7 @@ "box_prefixed_key%0#4" ] }, - "2122": { + "2068": { "op": "dup", "defined_out": [ "box_prefixed_key%0#4", @@ -14626,7 +14626,7 @@ "box_prefixed_key%0#4" ] }, - "2123": { + "2069": { "op": "box_get", "defined_out": [ "aggregate%box_get%2#0", @@ -14645,7 +14645,7 @@ "aggregate%box_get%3#0" ] }, - "2124": { + "2070": { "error": "check self.account entry exists", "op": "assert // check self.account entry exists", "stack_out": [ @@ -14658,7 +14658,7 @@ "aggregate%box_get%2#0" ] }, - "2125": { + "2071": { "op": "dup", "defined_out": [ "aggregate%box_get%2#0", @@ -14677,7 +14677,7 @@ "aggregate%box_get%2#0 (copy)" ] }, - "2126": { + "2072": { "op": "pushint 73", "defined_out": [ "73", @@ -14698,7 +14698,7 @@ "73" ] }, - "2128": { + "2074": { "op": "extract_uint64", "defined_out": [ "aggregate%box_get%2#0", @@ -14717,7 +14717,7 @@ "interest_amount#0" ] }, - "2129": { + "2075": { "op": "dup", "stack_out": [ "interest_amount#0", @@ -14731,7 +14731,7 @@ "interest_amount#0 (copy)" ] }, - "2130": { + "2076": { "op": "cover 2", "stack_out": [ "interest_amount#0", @@ -14745,7 +14745,7 @@ "interest_amount#0" ] }, - "2132": { + "2078": { "op": "bury 8", "defined_out": [ "aggregate%box_get%2#0", @@ -14764,7 +14764,7 @@ "aggregate%box_get%2#0" ] }, - "2134": { + "2080": { "op": "dup", "stack_out": [ "interest_amount#0", @@ -14778,7 +14778,7 @@ "aggregate%box_get%2#0 (copy)" ] }, - "2135": { + "2081": { "op": "pushint 81", "defined_out": [ "81", @@ -14801,7 +14801,7 @@ "81" ] }, - "2137": { + "2083": { "op": "extract_uint64", "defined_out": [ "aggregate%box_get%2#0", @@ -14822,7 +14822,7 @@ "principal_amount#0" ] }, - "2138": { + "2084": { "op": "dup", "stack_out": [ "interest_amount#0", @@ -14837,7 +14837,7 @@ "principal_amount#0" ] }, - "2139": { + "2085": { "op": "bury 8", "defined_out": [ "aggregate%box_get%2#0", @@ -14858,7 +14858,7 @@ "principal_amount#0" ] }, - "2141": { + "2087": { "op": "uncover 2", "stack_out": [ "interest_amount#0", @@ -14872,7 +14872,7 @@ "interest_amount#0" ] }, - "2143": { + "2089": { "op": "+", "defined_out": [ "aggregate%box_get%2#0", @@ -14893,7 +14893,7 @@ "total_amount#0" ] }, - "2144": { + "2090": { "op": "dup", "stack_out": [ "interest_amount#0", @@ -14907,7 +14907,7 @@ "total_amount#0" ] }, - "2145": { + "2091": { "op": "bury 6", "stack_out": [ "interest_amount#0", @@ -14920,7 +14920,7 @@ "total_amount#0" ] }, - "2147": { + "2093": { "error": "No due cashflow to pay", "op": "assert // No due cashflow to pay", "stack_out": [ @@ -14933,7 +14933,7 @@ "aggregate%box_get%2#0" ] }, - "2148": { + "2094": { "op": "extract 0 32", "defined_out": [ "aggregate%extract%5#0", @@ -14953,7 +14953,7 @@ "aggregate%extract%5#0" ] }, - "2151": { + "2097": { "op": "intc_0 // 0", "stack_out": [ "interest_amount#0", @@ -14966,7 +14966,7 @@ "0" ] }, - "2152": { + "2098": { "op": "bytec 19 // \"settlement_asset_id\"", "defined_out": [ "\"settlement_asset_id\"", @@ -14990,7 +14990,7 @@ "\"settlement_asset_id\"" ] }, - "2154": { + "2100": { "op": "app_global_get_ex", "stack_out": [ "interest_amount#0", @@ -15004,7 +15004,7 @@ "maybe_exists%0#0" ] }, - "2155": { + "2101": { "error": "check self.settlement_asset_id exists", "op": "assert // check self.settlement_asset_id exists", "stack_out": [ @@ -15018,7 +15018,7 @@ "maybe_value%0#0" ] }, - "2156": { + "2102": { "op": "asset_holding_get AssetBalance", "defined_out": [ "box_prefixed_key%0#4", @@ -15040,7 +15040,7 @@ "tmp%1#2" ] }, - "2158": { + "2104": { "op": "bury 1", "stack_out": [ "interest_amount#0", @@ -15052,7 +15052,7 @@ "tmp%1#2" ] }, - "2160": { + "2106": { "op": "bz claim_due_cashflows_bool_false@24", "stack_out": [ "interest_amount#0", @@ -15063,7 +15063,7 @@ "box_prefixed_key%0#4" ] }, - "2163": { + "2109": { "op": "dup", "stack_out": [ "interest_amount#0", @@ -15075,7 +15075,7 @@ "box_prefixed_key%0#4" ] }, - "2164": { + "2110": { "op": "box_get", "defined_out": [ "aggregate%box_get%12#0", @@ -15097,7 +15097,7 @@ "aggregate%box_get%13#0" ] }, - "2165": { + "2111": { "error": "check self.account entry exists", "op": "assert // check self.account entry exists", "stack_out": [ @@ -15110,7 +15110,7 @@ "aggregate%box_get%12#0" ] }, - "2166": { + "2112": { "op": "pushint 384", "defined_out": [ "384", @@ -15132,7 +15132,7 @@ "384" ] }, - "2169": { + "2115": { "op": "getbit", "defined_out": [ "aggregate%get_bit%0#0", @@ -15152,7 +15152,7 @@ "aggregate%get_bit%0#0" ] }, - "2170": { + "2116": { "op": "bnz claim_due_cashflows_bool_false@24", "stack_out": [ "interest_amount#0", @@ -15163,7 +15163,7 @@ "box_prefixed_key%0#4" ] }, - "2173": { + "2119": { "op": "intc_1 // 1", "defined_out": [ "and_result%0#0", @@ -15183,7 +15183,7 @@ "and_result%0#0" ] }, - "2174": { + "2120": { "block": "claim_due_cashflows_bool_merge@25", "stack_in": [ "interest_amount#0", @@ -15205,7 +15205,7 @@ "box_prefixed_key%0#4" ] }, - "2177": { + "2123": { "op": "global CurrentApplicationAddress", "defined_out": [ "tmp%0#1" @@ -15220,7 +15220,7 @@ "tmp%0#1" ] }, - "2179": { + "2125": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -15237,7 +15237,7 @@ "0" ] }, - "2180": { + "2126": { "op": "bytec 19 // \"settlement_asset_id\"", "defined_out": [ "\"settlement_asset_id\"", @@ -15256,7 +15256,7 @@ "\"settlement_asset_id\"" ] }, - "2182": { + "2128": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -15275,7 +15275,7 @@ "maybe_exists%0#0" ] }, - "2183": { + "2129": { "error": "check self.settlement_asset_id exists", "op": "assert // check self.settlement_asset_id exists", "stack_out": [ @@ -15289,7 +15289,7 @@ "maybe_value%0#0" ] }, - "2184": { + "2130": { "op": "swap", "stack_out": [ "interest_amount#0", @@ -15302,7 +15302,7 @@ "tmp%0#1" ] }, - "2185": { + "2131": { "op": "dig 1", "defined_out": [ "maybe_value%0#0", @@ -15321,7 +15321,7 @@ "maybe_value%0#0 (copy)" ] }, - "2187": { + "2133": { "op": "asset_holding_get AssetBalance", "defined_out": [ "check%0#0", @@ -15340,7 +15340,7 @@ "check%0#0" ] }, - "2189": { + "2135": { "error": "account opted into asset", "op": "assert // account opted into asset", "stack_out": [ @@ -15354,7 +15354,7 @@ "value%0#0" ] }, - "2190": { + "2136": { "op": "dig 5", "defined_out": [ "maybe_value%0#0", @@ -15373,7 +15373,7 @@ "total_amount#0" ] }, - "2192": { + "2138": { "op": "dup", "defined_out": [ "maybe_value%0#0", @@ -15394,7 +15394,7 @@ "total_amount#0 (copy)" ] }, - "2193": { + "2139": { "op": "cover 2", "stack_out": [ "interest_amount#0", @@ -15409,7 +15409,7 @@ "total_amount#0 (copy)" ] }, - "2195": { + "2141": { "op": ">=", "defined_out": [ "maybe_value%0#0", @@ -15428,7 +15428,7 @@ "tmp%1#2" ] }, - "2196": { + "2142": { "error": "Not enough funds for the payment", "op": "assert // Not enough funds for the payment", "stack_out": [ @@ -15442,7 +15442,7 @@ "total_amount#0" ] }, - "2197": { + "2143": { "op": "dig 2", "defined_out": [ "box_prefixed_key%0#4", @@ -15461,7 +15461,7 @@ "box_prefixed_key%0#4" ] }, - "2199": { + "2145": { "op": "dup", "defined_out": [ "box_prefixed_key%0#4", @@ -15482,7 +15482,7 @@ "box_prefixed_key%0#4 (copy)" ] }, - "2200": { + "2146": { "op": "cover 3", "stack_out": [ "interest_amount#0", @@ -15497,7 +15497,7 @@ "box_prefixed_key%0#4 (copy)" ] }, - "2202": { + "2148": { "op": "box_get", "defined_out": [ "aggregate%box_get%15#0", @@ -15520,7 +15520,7 @@ "aggregate%box_get%15#0" ] }, - "2203": { + "2149": { "error": "check self.account entry exists", "op": "assert // check self.account entry exists", "stack_out": [ @@ -15536,7 +15536,7 @@ "position#0" ] }, - "2204": { + "2150": { "op": "dup", "defined_out": [ "box_prefixed_key%0#4", @@ -15559,7 +15559,7 @@ "position#0 (copy)" ] }, - "2205": { + "2151": { "op": "extract 0 32", "defined_out": [ "box_prefixed_key%0#4", @@ -15582,10 +15582,10 @@ "receiver#0" ] }, - "2208": { + "2154": { "op": "itxn_begin" }, - "2209": { + "2155": { "op": "global MinTxnFee", "defined_out": [ "box_prefixed_key%0#4", @@ -15610,7 +15610,7 @@ "inner_txn_params%0%%param_Fee_idx_0#0" ] }, - "2211": { + "2157": { "op": "uncover 3", "stack_out": [ "interest_amount#0", @@ -15627,7 +15627,7 @@ "total_amount#0" ] }, - "2213": { + "2159": { "op": "itxn_field AssetAmount", "stack_out": [ "interest_amount#0", @@ -15643,7 +15643,7 @@ "inner_txn_params%0%%param_Fee_idx_0#0" ] }, - "2215": { + "2161": { "op": "swap", "stack_out": [ "interest_amount#0", @@ -15659,7 +15659,7 @@ "receiver#0" ] }, - "2216": { + "2162": { "op": "itxn_field AssetReceiver", "stack_out": [ "interest_amount#0", @@ -15674,7 +15674,7 @@ "inner_txn_params%0%%param_Fee_idx_0#0" ] }, - "2218": { + "2164": { "op": "uncover 2", "stack_out": [ "interest_amount#0", @@ -15689,7 +15689,7 @@ "maybe_value%0#0" ] }, - "2220": { + "2166": { "op": "itxn_field XferAsset", "stack_out": [ "interest_amount#0", @@ -15703,7 +15703,7 @@ "inner_txn_params%0%%param_Fee_idx_0#0" ] }, - "2222": { + "2168": { "op": "pushint 4 // axfer", "defined_out": [ "axfer", @@ -15725,7 +15725,7 @@ "axfer" ] }, - "2224": { + "2170": { "op": "itxn_field TypeEnum", "stack_out": [ "interest_amount#0", @@ -15739,7 +15739,7 @@ "inner_txn_params%0%%param_Fee_idx_0#0" ] }, - "2226": { + "2172": { "op": "itxn_field Fee", "stack_out": [ "interest_amount#0", @@ -15752,10 +15752,10 @@ "position#0" ] }, - "2228": { + "2174": { "op": "itxn_submit" }, - "2229": { + "2175": { "op": "dup", "stack_out": [ "interest_amount#0", @@ -15769,7 +15769,7 @@ "position#0 (copy)" ] }, - "2230": { + "2176": { "op": "pushint 73", "defined_out": [ "73", @@ -15791,7 +15791,7 @@ "73" ] }, - "2232": { + "2178": { "op": "extract_uint64", "defined_out": [ "box_prefixed_key%0#4", @@ -15811,7 +15811,7 @@ "interest_amount#0" ] }, - "2233": { + "2179": { "op": "dup", "stack_out": [ "interest_amount#0", @@ -15826,7 +15826,7 @@ "interest_amount#0 (copy)" ] }, - "2234": { + "2180": { "op": "cover 2", "stack_out": [ "interest_amount#0", @@ -15841,7 +15841,7 @@ "interest_amount#0" ] }, - "2236": { + "2182": { "op": "bury 9", "defined_out": [ "box_prefixed_key%0#4", @@ -15861,7 +15861,7 @@ "position#0" ] }, - "2238": { + "2184": { "op": "dup", "stack_out": [ "interest_amount#0", @@ -15876,7 +15876,7 @@ "position#0 (copy)" ] }, - "2239": { + "2185": { "op": "pushint 81", "defined_out": [ "81", @@ -15900,7 +15900,7 @@ "81" ] }, - "2241": { + "2187": { "op": "extract_uint64", "defined_out": [ "box_prefixed_key%0#4", @@ -15922,7 +15922,7 @@ "principal_amount#0" ] }, - "2242": { + "2188": { "op": "dup", "stack_out": [ "interest_amount#0", @@ -15938,7 +15938,7 @@ "principal_amount#0 (copy)" ] }, - "2243": { + "2189": { "op": "cover 3", "stack_out": [ "interest_amount#0", @@ -15954,7 +15954,7 @@ "principal_amount#0" ] }, - "2245": { + "2191": { "op": "bury 9", "defined_out": [ "box_prefixed_key%0#4", @@ -15976,7 +15976,7 @@ "position#0" ] }, - "2247": { + "2193": { "op": "intc_0 // 0", "stack_out": [ "interest_amount#0", @@ -15992,7 +15992,7 @@ "0" ] }, - "2248": { + "2194": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0", @@ -16016,7 +16016,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "2249": { + "2195": { "op": "swap", "stack_out": [ "interest_amount#0", @@ -16032,7 +16032,7 @@ "position#0" ] }, - "2250": { + "2196": { "op": "dig 1", "defined_out": [ "aggregate%val_as_bytes%0#0", @@ -16058,7 +16058,7 @@ "aggregate%val_as_bytes%0#0 (copy)" ] }, - "2252": { + "2198": { "op": "replace2 73", "stack_out": [ "interest_amount#0", @@ -16074,7 +16074,7 @@ "position#0" ] }, - "2254": { + "2200": { "op": "swap", "stack_out": [ "interest_amount#0", @@ -16090,7 +16090,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "2255": { + "2201": { "op": "replace2 81", "stack_out": [ "interest_amount#0", @@ -16105,7 +16105,7 @@ "position#0" ] }, - "2257": { + "2203": { "op": "uncover 3", "stack_out": [ "interest_amount#0", @@ -16120,7 +16120,7 @@ "box_prefixed_key%0#4" ] }, - "2259": { + "2205": { "op": "swap", "stack_out": [ "interest_amount#0", @@ -16135,7 +16135,7 @@ "position#0" ] }, - "2260": { + "2206": { "op": "box_put", "stack_out": [ "interest_amount#0", @@ -16148,7 +16148,7 @@ "interest_amount#0" ] }, - "2261": { + "2207": { "op": "intc_0 // 0", "stack_out": [ "interest_amount#0", @@ -16162,7 +16162,7 @@ "0" ] }, - "2262": { + "2208": { "op": "bytec 15 // \"reserved_interest\"", "defined_out": [ "\"reserved_interest\"", @@ -16185,7 +16185,7 @@ "\"reserved_interest\"" ] }, - "2264": { + "2210": { "op": "app_global_get_ex", "stack_out": [ "interest_amount#0", @@ -16200,7 +16200,7 @@ "maybe_exists%0#0" ] }, - "2265": { + "2211": { "error": "check self.reserved_interest exists", "op": "assert // check self.reserved_interest exists", "stack_out": [ @@ -16215,7 +16215,7 @@ "maybe_value%0#0" ] }, - "2266": { + "2212": { "op": "dup", "stack_out": [ "interest_amount#0", @@ -16230,7 +16230,7 @@ "maybe_value%0#0 (copy)" ] }, - "2267": { + "2213": { "op": "dig 2", "defined_out": [ "box_prefixed_key%0#4", @@ -16255,7 +16255,7 @@ "interest_amount#0 (copy)" ] }, - "2269": { + "2215": { "op": ">=", "defined_out": [ "box_prefixed_key%0#4", @@ -16278,7 +16278,7 @@ "tmp%0#2" ] }, - "2270": { + "2216": { "error": "Not enough funds for the payment", "op": "assert // Not enough funds for the payment", "stack_out": [ @@ -16293,7 +16293,7 @@ "maybe_value%0#0" ] }, - "2271": { + "2217": { "op": "intc_0 // 0", "stack_out": [ "interest_amount#0", @@ -16308,7 +16308,7 @@ "0" ] }, - "2272": { + "2218": { "op": "bytec 12 // \"reserved_principal\"", "defined_out": [ "\"reserved_principal\"", @@ -16333,7 +16333,7 @@ "\"reserved_principal\"" ] }, - "2274": { + "2220": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#4", @@ -16358,7 +16358,7 @@ "maybe_exists%1#0" ] }, - "2275": { + "2221": { "error": "check self.reserved_principal exists", "op": "assert // check self.reserved_principal exists", "stack_out": [ @@ -16374,7 +16374,7 @@ "maybe_value%1#0" ] }, - "2276": { + "2222": { "op": "dig 3", "defined_out": [ "box_prefixed_key%0#4", @@ -16399,7 +16399,7 @@ "principal_amount#0 (copy)" ] }, - "2278": { + "2224": { "op": ">=", "stack_out": [ "interest_amount#0", @@ -16414,7 +16414,7 @@ "tmp%1#2" ] }, - "2279": { + "2225": { "error": "Not enough funds for the payment", "op": "assert // Not enough funds for the payment", "stack_out": [ @@ -16429,7 +16429,7 @@ "maybe_value%0#0" ] }, - "2280": { + "2226": { "op": "swap", "stack_out": [ "interest_amount#0", @@ -16443,7 +16443,7 @@ "interest_amount#0" ] }, - "2281": { + "2227": { "op": "-", "defined_out": [ "box_prefixed_key%0#4", @@ -16463,7 +16463,7 @@ "tmp%2#2" ] }, - "2282": { + "2228": { "op": "bytec 15 // \"reserved_interest\"", "stack_out": [ "interest_amount#0", @@ -16477,7 +16477,7 @@ "\"reserved_interest\"" ] }, - "2284": { + "2230": { "op": "swap", "stack_out": [ "interest_amount#0", @@ -16491,7 +16491,7 @@ "tmp%2#2" ] }, - "2285": { + "2231": { "op": "app_global_put", "stack_out": [ "interest_amount#0", @@ -16503,7 +16503,7 @@ "principal_amount#0" ] }, - "2286": { + "2232": { "op": "intc_0 // 0", "stack_out": [ "interest_amount#0", @@ -16516,7 +16516,7 @@ "0" ] }, - "2287": { + "2233": { "op": "bytec 12 // \"reserved_principal\"", "stack_out": [ "interest_amount#0", @@ -16530,7 +16530,7 @@ "\"reserved_principal\"" ] }, - "2289": { + "2235": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#4", @@ -16552,7 +16552,7 @@ "maybe_exists%3#0" ] }, - "2290": { + "2236": { "error": "check self.reserved_principal exists", "op": "assert // check self.reserved_principal exists", "stack_out": [ @@ -16566,7 +16566,7 @@ "maybe_value%3#0" ] }, - "2291": { + "2237": { "op": "swap", "stack_out": [ "interest_amount#0", @@ -16579,7 +16579,7 @@ "principal_amount#0" ] }, - "2292": { + "2238": { "op": "-", "defined_out": [ "box_prefixed_key%0#4", @@ -16598,7 +16598,7 @@ "tmp%3#0" ] }, - "2293": { + "2239": { "op": "bytec 12 // \"reserved_principal\"", "stack_out": [ "interest_amount#0", @@ -16611,7 +16611,7 @@ "\"reserved_principal\"" ] }, - "2295": { + "2241": { "op": "swap", "stack_out": [ "interest_amount#0", @@ -16624,7 +16624,7 @@ "tmp%3#0" ] }, - "2296": { + "2242": { "op": "app_global_put", "stack_out": [ "interest_amount#0", @@ -16635,7 +16635,7 @@ "box_prefixed_key%0#4" ] }, - "2297": { + "2243": { "block": "claim_due_cashflows_after_if_else@3", "stack_in": [ "interest_amount#0", @@ -16659,7 +16659,7 @@ "interest_amount#0" ] }, - "2299": { + "2245": { "op": "dup", "defined_out": [ "interest_amount#0", @@ -16676,7 +16676,7 @@ "interest_amount#0 (copy)" ] }, - "2300": { + "2246": { "op": "dig 6", "defined_out": [ "interest_amount#0", @@ -16695,7 +16695,7 @@ "principal_amount#0" ] }, - "2302": { + "2248": { "op": "dup", "defined_out": [ "interest_amount#0", @@ -16716,7 +16716,7 @@ "principal_amount#0 (copy)" ] }, - "2303": { + "2249": { "op": "cover 3", "stack_out": [ "interest_amount#0", @@ -16731,7 +16731,7 @@ "principal_amount#0 (copy)" ] }, - "2305": { + "2251": { "op": "+", "defined_out": [ "interest_amount#0", @@ -16750,7 +16750,7 @@ "tmp%5#1" ] }, - "2306": { + "2252": { "op": "global LatestTimestamp", "defined_out": [ "interest_amount#0", @@ -16771,7 +16771,7 @@ "tmp%6#0" ] }, - "2308": { + "2254": { "op": "uncover 2", "stack_out": [ "interest_amount#0", @@ -16786,7 +16786,7 @@ "interest_amount#0" ] }, - "2310": { + "2256": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%1#0", @@ -16808,7 +16808,7 @@ "aggregate%val_as_bytes%1#0" ] }, - "2311": { + "2257": { "op": "uncover 3", "stack_out": [ "interest_amount#0", @@ -16823,7 +16823,7 @@ "principal_amount#0" ] }, - "2313": { + "2259": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%1#0", @@ -16846,7 +16846,7 @@ "aggregate%val_as_bytes%2#0" ] }, - "2314": { + "2260": { "op": "concat", "defined_out": [ "aggregate%head%1#0", @@ -16867,7 +16867,7 @@ "aggregate%head%1#0" ] }, - "2315": { + "2261": { "op": "uncover 2", "stack_out": [ "interest_amount#0", @@ -16881,7 +16881,7 @@ "tmp%5#1" ] }, - "2317": { + "2263": { "op": "itob", "defined_out": [ "aggregate%head%1#0", @@ -16902,7 +16902,7 @@ "aggregate%val_as_bytes%3#0" ] }, - "2318": { + "2264": { "op": "concat", "defined_out": [ "aggregate%head%2#0", @@ -16921,7 +16921,7 @@ "aggregate%head%2#0" ] }, - "2319": { + "2265": { "op": "swap", "stack_out": [ "interest_amount#0", @@ -16934,7 +16934,7 @@ "tmp%6#0" ] }, - "2320": { + "2266": { "op": "itob", "defined_out": [ "aggregate%head%2#0", @@ -16953,7 +16953,7 @@ "aggregate%val_as_bytes%4#0" ] }, - "2321": { + "2267": { "op": "concat", "defined_out": [ "aggregate%head%3#0", @@ -16970,7 +16970,7 @@ "aggregate%head%3#0" ] }, - "2322": { + "2268": { "op": "dig 2", "defined_out": [ "aggregate%head%3#0", @@ -16989,7 +16989,7 @@ "payment_info#0" ] }, - "2324": { + "2270": { "op": "dup", "defined_out": [ "aggregate%head%3#0", @@ -17010,7 +17010,7 @@ "payment_info#0 (copy)" ] }, - "2325": { + "2271": { "op": "len", "defined_out": [ "aggregate%head%3#0", @@ -17031,7 +17031,7 @@ "aggregate%length%0#0" ] }, - "2326": { + "2272": { "op": "itob", "defined_out": [ "aggregate%as_bytes%0#0", @@ -17052,7 +17052,7 @@ "aggregate%as_bytes%0#0" ] }, - "2327": { + "2273": { "op": "extract 6 2", "defined_out": [ "aggregate%head%3#0", @@ -17073,7 +17073,7 @@ "aggregate%length_uint16%0#0" ] }, - "2330": { + "2276": { "op": "swap", "stack_out": [ "interest_amount#0", @@ -17087,7 +17087,7 @@ "payment_info#0" ] }, - "2331": { + "2277": { "op": "concat", "defined_out": [ "aggregate%encoded_value%0#0", @@ -17107,7 +17107,7 @@ "aggregate%encoded_value%0#0" ] }, - "2332": { + "2278": { "op": "swap", "stack_out": [ "interest_amount#0", @@ -17120,7 +17120,7 @@ "aggregate%head%3#0" ] }, - "2333": { + "2279": { "op": "pushbytes 0x0022", "defined_out": [ "0x0022", @@ -17142,7 +17142,7 @@ "0x0022" ] }, - "2337": { + "2283": { "op": "concat", "defined_out": [ "aggregate%encoded_value%0#0", @@ -17162,7 +17162,7 @@ "aggregate%head%4#0" ] }, - "2338": { + "2284": { "op": "swap", "stack_out": [ "interest_amount#0", @@ -17175,7 +17175,7 @@ "aggregate%encoded_value%0#0" ] }, - "2339": { + "2285": { "op": "concat", "defined_out": [ "aggregate%concat%0#0", @@ -17193,7 +17193,7 @@ "aggregate%concat%0#0" ] }, - "2340": { + "2286": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -17213,7 +17213,7 @@ "0x151f7c75" ] }, - "2341": { + "2287": { "op": "swap", "stack_out": [ "interest_amount#0", @@ -17226,7 +17226,7 @@ "aggregate%concat%0#0" ] }, - "2342": { + "2288": { "op": "concat", "defined_out": [ "interest_amount#0", @@ -17244,7 +17244,7 @@ "tmp%5#0" ] }, - "2343": { + "2289": { "op": "log", "stack_out": [ "interest_amount#0", @@ -17255,7 +17255,7 @@ "box_prefixed_key%0#4" ] }, - "2344": { + "2290": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -17273,7 +17273,7 @@ "1" ] }, - "2345": { + "2291": { "op": "return", "stack_out": [ "interest_amount#0", @@ -17284,7 +17284,7 @@ "box_prefixed_key%0#4" ] }, - "2346": { + "2292": { "block": "claim_due_cashflows_bool_false@24", "stack_in": [ "interest_amount#0", @@ -17308,10 +17308,10 @@ "and_result%0#0" ] }, - "2347": { + "2293": { "op": "b claim_due_cashflows_bool_merge@25" }, - "2350": { + "2296": { "block": "claim_due_cashflows_bool_false@15", "stack_in": [ "interest_amount#0", @@ -17335,10 +17335,10 @@ "or_result%0#0" ] }, - "2351": { + "2297": { "op": "b claim_due_cashflows_bool_merge@16" }, - "2354": { + "2300": { "subroutine": "modules.transfer_agent.TransferAgent.transfer_set_schedule[routing]", "params": {}, "block": "transfer_set_schedule", @@ -17351,7 +17351,7 @@ "tmp%0#0" ] }, - "2357": { + "2303": { "op": "dup", "defined_out": [ "tmp%0#0", @@ -17362,7 +17362,7 @@ "tmp%0#0 (copy)" ] }, - "2358": { + "2304": { "op": "len", "defined_out": [ "len%0#0", @@ -17373,7 +17373,7 @@ "len%0#0" ] }, - "2359": { + "2305": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -17386,7 +17386,7 @@ "8" ] }, - "2360": { + "2306": { "op": "==", "defined_out": [ "eq%0#0", @@ -17397,14 +17397,14 @@ "eq%0#0" ] }, - "2361": { + "2307": { "error": "invalid number of bytes for arc4.uint64", "op": "assert // invalid number of bytes for arc4.uint64", "stack_out": [ "tmp%0#0" ] }, - "2362": { + "2308": { "op": "btoi", "defined_out": [ "open_date#0" @@ -17413,7 +17413,7 @@ "open_date#0" ] }, - "2363": { + "2309": { "op": "txna ApplicationArgs 2", "defined_out": [ "open_date#0", @@ -17424,7 +17424,7 @@ "tmp%2#0" ] }, - "2366": { + "2312": { "op": "dup", "defined_out": [ "open_date#0", @@ -17437,7 +17437,7 @@ "tmp%2#0 (copy)" ] }, - "2367": { + "2313": { "op": "len", "defined_out": [ "len%1#0", @@ -17450,7 +17450,7 @@ "len%1#0" ] }, - "2368": { + "2314": { "op": "intc_2 // 8", "stack_out": [ "open_date#0", @@ -17459,7 +17459,7 @@ "8" ] }, - "2369": { + "2315": { "op": "==", "defined_out": [ "eq%1#0", @@ -17472,7 +17472,7 @@ "eq%1#0" ] }, - "2370": { + "2316": { "error": "invalid number of bytes for arc4.uint64", "op": "assert // invalid number of bytes for arc4.uint64", "stack_out": [ @@ -17480,7 +17480,7 @@ "tmp%2#0" ] }, - "2371": { + "2317": { "op": "btoi", "defined_out": [ "closure_date#0", @@ -17491,11 +17491,11 @@ "closure_date#0" ] }, - "2372": { + "2318": { "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", "op": "callsub _assert_caller_is_arranger" }, - "2375": { + "2321": { "op": "dup2", "defined_out": [ "closure_date#0", @@ -17510,7 +17510,7 @@ "closure_date#0 (copy)" ] }, - "2376": { + "2322": { "op": "<", "defined_out": [ "closure_date#0", @@ -17523,7 +17523,7 @@ "tmp%0#1" ] }, - "2377": { + "2323": { "error": "Time events must be sorted in strictly ascending order", "op": "assert // Time events must be sorted in strictly ascending order", "stack_out": [ @@ -17531,7 +17531,7 @@ "closure_date#0" ] }, - "2378": { + "2324": { "op": "bytec 28 // \"transfer_opening_date\"", "defined_out": [ "\"transfer_opening_date\"", @@ -17544,7 +17544,7 @@ "\"transfer_opening_date\"" ] }, - "2380": { + "2326": { "op": "uncover 2", "stack_out": [ "closure_date#0", @@ -17552,13 +17552,13 @@ "open_date#0" ] }, - "2382": { + "2328": { "op": "app_global_put", "stack_out": [ "closure_date#0" ] }, - "2383": { + "2329": { "op": "bytec 29 // \"transfer_closure_date\"", "defined_out": [ "\"transfer_closure_date\"", @@ -17569,18 +17569,18 @@ "\"transfer_closure_date\"" ] }, - "2385": { + "2331": { "op": "swap", "stack_out": [ "\"transfer_closure_date\"", "closure_date#0" ] }, - "2386": { + "2332": { "op": "app_global_put", "stack_out": [] }, - "2387": { + "2333": { "op": "global LatestTimestamp", "defined_out": [ "tmp%1#1" @@ -17589,7 +17589,7 @@ "tmp%1#1" ] }, - "2389": { + "2335": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0" @@ -17598,7 +17598,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "2390": { + "2336": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -17609,14 +17609,14 @@ "0x151f7c75" ] }, - "2391": { + "2337": { "op": "swap", "stack_out": [ "0x151f7c75", "aggregate%val_as_bytes%0#0" ] }, - "2392": { + "2338": { "op": "concat", "defined_out": [ "tmp%6#0" @@ -17625,11 +17625,11 @@ "tmp%6#0" ] }, - "2393": { + "2339": { "op": "log", "stack_out": [] }, - "2394": { + "2340": { "op": "intc_1 // 1", "defined_out": [ "1" @@ -17638,11 +17638,11 @@ "1" ] }, - "2395": { + "2341": { "op": "return", "stack_out": [] }, - "2396": { + "2342": { "subroutine": "modules.transfer_agent.TransferAgent.primary_distribution[routing]", "params": {}, "block": "primary_distribution", @@ -17655,7 +17655,7 @@ "holding_address#0" ] }, - "2399": { + "2345": { "op": "dup", "defined_out": [ "holding_address#0", @@ -17666,7 +17666,7 @@ "holding_address#0 (copy)" ] }, - "2400": { + "2346": { "op": "len", "defined_out": [ "holding_address#0", @@ -17677,7 +17677,7 @@ "len%0#0" ] }, - "2401": { + "2347": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -17690,7 +17690,7 @@ "32" ] }, - "2402": { + "2348": { "op": "==", "defined_out": [ "eq%0#0", @@ -17701,14 +17701,14 @@ "eq%0#0" ] }, - "2403": { + "2349": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ "holding_address#0" ] }, - "2404": { + "2350": { "op": "txna ApplicationArgs 2", "defined_out": [ "holding_address#0", @@ -17719,7 +17719,7 @@ "tmp%2#0" ] }, - "2407": { + "2353": { "op": "dup", "defined_out": [ "holding_address#0", @@ -17732,7 +17732,7 @@ "tmp%2#0 (copy)" ] }, - "2408": { + "2354": { "op": "len", "defined_out": [ "holding_address#0", @@ -17745,7 +17745,7 @@ "len%1#0" ] }, - "2409": { + "2355": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -17760,7 +17760,7 @@ "8" ] }, - "2410": { + "2356": { "op": "==", "defined_out": [ "eq%1#0", @@ -17773,7 +17773,7 @@ "eq%1#0" ] }, - "2411": { + "2357": { "error": "invalid number of bytes for arc4.uint64", "op": "assert // invalid number of bytes for arc4.uint64", "stack_out": [ @@ -17781,7 +17781,7 @@ "tmp%2#0" ] }, - "2412": { + "2358": { "op": "btoi", "defined_out": [ "holding_address#0", @@ -17792,7 +17792,7 @@ "units#0" ] }, - "2413": { + "2359": { "op": "dup", "stack_out": [ "holding_address#0", @@ -17800,7 +17800,7 @@ "units#0" ] }, - "2414": { + "2360": { "op": "cover 2", "defined_out": [ "holding_address#0", @@ -17812,7 +17812,7 @@ "units#0" ] }, - "2416": { + "2362": { "op": "intc_0 // 0", "stack_out": [ "units#0", @@ -17821,7 +17821,7 @@ "0" ] }, - "2417": { + "2363": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"", @@ -17837,7 +17837,7 @@ "\"status\"" ] }, - "2418": { + "2364": { "op": "app_global_get_ex", "defined_out": [ "holding_address#0", @@ -17853,7 +17853,7 @@ "maybe_exists%0#0" ] }, - "2419": { + "2365": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ @@ -17863,7 +17863,7 @@ "maybe_value%0#0" ] }, - "2420": { + "2366": { "error": "D-ASA not configured", "op": "assert // D-ASA not configured", "stack_out": [ @@ -17872,10 +17872,10 @@ "units#0" ] }, - "2421": { - "op": "bytec 22 // 0x52235072696d6172794465616c657223", + "2367": { + "op": "bytec 22 // 0x523a50594423", "defined_out": [ - "0x52235072696d6172794465616c657223", + "0x523a50594423", "holding_address#0", "units#0" ], @@ -17883,13 +17883,13 @@ "units#0", "holding_address#0", "units#0", - "0x52235072696d6172794465616c657223" + "0x523a50594423" ] }, - "2423": { + "2369": { "op": "txn Sender", "defined_out": [ - "0x52235072696d6172794465616c657223", + "0x523a50594423", "holding_address#0", "tmp%0#3", "units#0" @@ -17898,11 +17898,11 @@ "units#0", "holding_address#0", "units#0", - "0x52235072696d6172794465616c657223", + "0x523a50594423", "tmp%0#3" ] }, - "2425": { + "2371": { "callsub": "modules.rbac.RbacModule._role_is_active", "op": "callsub _role_is_active", "defined_out": [ @@ -17917,7 +17917,7 @@ "tmp%1#2" ] }, - "2428": { + "2374": { "error": "Not authorized", "op": "assert // Not authorized", "stack_out": [ @@ -17926,15 +17926,15 @@ "units#0" ] }, - "2429": { + "2375": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", "op": "callsub _assert_is_not_asset_defaulted" }, - "2432": { + "2378": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_suspended", "op": "callsub _assert_is_not_asset_suspended" }, - "2435": { + "2381": { "op": "intc_0 // 0", "stack_out": [ "units#0", @@ -17943,7 +17943,7 @@ "0" ] }, - "2436": { + "2382": { "op": "bytec_1 // \"status\"", "stack_out": [ "units#0", @@ -17953,7 +17953,7 @@ "\"status\"" ] }, - "2437": { + "2383": { "op": "app_global_get_ex", "stack_out": [ "units#0", @@ -17963,7 +17963,7 @@ "maybe_exists%0#0" ] }, - "2438": { + "2384": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ @@ -17973,7 +17973,7 @@ "maybe_value%0#0" ] }, - "2439": { + "2385": { "op": "pushint 50", "defined_out": [ "50", @@ -17989,7 +17989,7 @@ "50" ] }, - "2441": { + "2387": { "op": "==", "defined_out": [ "holding_address#0", @@ -18003,7 +18003,7 @@ "tmp%0#4" ] }, - "2442": { + "2388": { "error": "Primary distribution is closed", "op": "assert // Primary distribution is closed", "stack_out": [ @@ -18012,10 +18012,10 @@ "units#0" ] }, - "2443": { - "op": "bytec 8 // 0x52234163636f756e7423", + "2389": { + "op": "bytec 8 // 0x4123", "defined_out": [ - "0x52234163636f756e7423", + "0x4123", "holding_address#0", "units#0" ], @@ -18023,20 +18023,20 @@ "units#0", "holding_address#0", "units#0", - "0x52234163636f756e7423" + "0x4123" ] }, - "2445": { + "2391": { "op": "dig 2", "stack_out": [ "units#0", "holding_address#0", "units#0", - "0x52234163636f756e7423", + "0x4123", "holding_address#0 (copy)" ] }, - "2447": { + "2393": { "op": "concat", "defined_out": [ "box_prefixed_key%0#1", @@ -18050,7 +18050,7 @@ "box_prefixed_key%0#1" ] }, - "2448": { + "2394": { "op": "dup", "stack_out": [ "units#0", @@ -18060,7 +18060,7 @@ "box_prefixed_key%0#1" ] }, - "2449": { + "2395": { "op": "cover 3", "defined_out": [ "box_prefixed_key%0#1", @@ -18075,7 +18075,7 @@ "box_prefixed_key%0#1" ] }, - "2451": { + "2397": { "op": "box_len", "defined_out": [ "_%0#0", @@ -18093,7 +18093,7 @@ "maybe_exists%0#0" ] }, - "2452": { + "2398": { "op": "bury 1", "stack_out": [ "units#0", @@ -18103,7 +18103,7 @@ "maybe_exists%0#0" ] }, - "2454": { + "2400": { "error": "Invalid account holding address", "op": "assert // Invalid account holding address", "stack_out": [ @@ -18113,7 +18113,7 @@ "units#0" ] }, - "2455": { + "2401": { "op": "swap", "stack_out": [ "units#0", @@ -18122,7 +18122,7 @@ "holding_address#0" ] }, - "2456": { + "2402": { "callsub": "modules.accounting.AccountingModule._assert_is_not_account_suspended", "op": "callsub _assert_is_not_account_suspended", "stack_out": [ @@ -18131,7 +18131,7 @@ "units#0" ] }, - "2459": { + "2405": { "op": "dup", "defined_out": [ "box_prefixed_key%0#1", @@ -18145,7 +18145,7 @@ "units#0 (copy)" ] }, - "2460": { + "2406": { "error": "Can not distribute zero units", "op": "assert // Can not distribute zero units", "stack_out": [ @@ -18154,7 +18154,7 @@ "units#0" ] }, - "2461": { + "2407": { "op": "intc_0 // 0", "stack_out": [ "units#0", @@ -18163,7 +18163,7 @@ "0" ] }, - "2462": { + "2408": { "op": "bytec 11 // \"reserved_units_total\"", "defined_out": [ "\"reserved_units_total\"", @@ -18179,7 +18179,7 @@ "\"reserved_units_total\"" ] }, - "2464": { + "2410": { "op": "app_global_get_ex", "stack_out": [ "units#0", @@ -18189,7 +18189,7 @@ "maybe_exists%0#0" ] }, - "2465": { + "2411": { "error": "check self.reserved_units_total exists", "op": "assert // check self.reserved_units_total exists", "stack_out": [ @@ -18199,7 +18199,7 @@ "maybe_value%0#0" ] }, - "2466": { + "2412": { "op": "+", "defined_out": [ "box_prefixed_key%0#1", @@ -18212,7 +18212,7 @@ "tmp%2#1" ] }, - "2467": { + "2413": { "op": "intc_0 // 0", "stack_out": [ "units#0", @@ -18221,7 +18221,7 @@ "0" ] }, - "2468": { + "2414": { "op": "bytec 13 // \"total_units\"", "defined_out": [ "\"total_units\"", @@ -18238,7 +18238,7 @@ "\"total_units\"" ] }, - "2470": { + "2416": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#1", @@ -18255,7 +18255,7 @@ "maybe_exists%1#0" ] }, - "2471": { + "2417": { "error": "check self.total_units exists", "op": "assert // check self.total_units exists", "stack_out": [ @@ -18265,7 +18265,7 @@ "maybe_value%1#0" ] }, - "2472": { + "2418": { "op": "<=", "defined_out": [ "box_prefixed_key%0#1", @@ -18278,7 +18278,7 @@ "tmp%3#1" ] }, - "2473": { + "2419": { "error": "Insufficient remaining D-ASA units", "op": "assert // Insufficient remaining D-ASA units", "stack_out": [ @@ -18286,7 +18286,7 @@ "box_prefixed_key%0#1" ] }, - "2474": { + "2420": { "op": "intc_0 // 0", "stack_out": [ "units#0", @@ -18294,7 +18294,7 @@ "0" ] }, - "2475": { + "2421": { "op": "bytec 27 // \"initial_exchange_date\"", "defined_out": [ "\"initial_exchange_date\"", @@ -18309,7 +18309,7 @@ "\"initial_exchange_date\"" ] }, - "2477": { + "2423": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#1", @@ -18324,7 +18324,7 @@ "maybe_exists%2#0" ] }, - "2478": { + "2424": { "error": "check self.initial_exchange_date exists", "op": "assert // check self.initial_exchange_date exists", "stack_out": [ @@ -18333,14 +18333,14 @@ "maybe_value%2#0" ] }, - "2479": { + "2425": { "op": "bz primary_distribution_after_if_else@3", "stack_out": [ "units#0", "box_prefixed_key%0#1" ] }, - "2482": { + "2428": { "op": "global LatestTimestamp", "defined_out": [ "box_prefixed_key%0#1", @@ -18353,7 +18353,7 @@ "tmp%5#1" ] }, - "2484": { + "2430": { "op": "intc_0 // 0", "stack_out": [ "units#0", @@ -18362,7 +18362,7 @@ "0" ] }, - "2485": { + "2431": { "op": "bytec 27 // \"initial_exchange_date\"", "stack_out": [ "units#0", @@ -18372,7 +18372,7 @@ "\"initial_exchange_date\"" ] }, - "2487": { + "2433": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#1", @@ -18389,7 +18389,7 @@ "maybe_exists%3#0" ] }, - "2488": { + "2434": { "error": "check self.initial_exchange_date exists", "op": "assert // check self.initial_exchange_date exists", "stack_out": [ @@ -18399,7 +18399,7 @@ "maybe_value%3#0" ] }, - "2489": { + "2435": { "op": "<=", "defined_out": [ "box_prefixed_key%0#1", @@ -18412,7 +18412,7 @@ "tmp%6#1" ] }, - "2490": { + "2436": { "error": "Primary distribution is closed", "op": "assert // Primary distribution is closed", "stack_out": [ @@ -18420,7 +18420,7 @@ "box_prefixed_key%0#1" ] }, - "2491": { + "2437": { "block": "primary_distribution_after_if_else@3", "stack_in": [ "units#0", @@ -18438,7 +18438,7 @@ "box_prefixed_key%0#1 (copy)" ] }, - "2493": { + "2439": { "op": "box_get", "defined_out": [ "aggregate%box_get%0#0", @@ -18453,7 +18453,7 @@ "aggregate%box_get%1#0" ] }, - "2494": { + "2440": { "error": "check self.account entry exists", "op": "assert // check self.account entry exists", "stack_out": [ @@ -18463,7 +18463,7 @@ "aggregate%box_get%0#0" ] }, - "2495": { + "2441": { "op": "pushint 40", "defined_out": [ "40", @@ -18478,7 +18478,7 @@ "40" ] }, - "2497": { + "2443": { "op": "extract_uint64", "defined_out": [ "box_prefixed_key%0#1", @@ -18491,7 +18491,7 @@ "values%0#0" ] }, - "2498": { + "2444": { "op": "dig 3", "defined_out": [ "box_prefixed_key%0#1", @@ -18506,7 +18506,7 @@ "units#0" ] }, - "2500": { + "2446": { "op": "dup", "defined_out": [ "box_prefixed_key%0#1", @@ -18523,7 +18523,7 @@ "units#0 (copy)" ] }, - "2501": { + "2447": { "op": "cover 3", "stack_out": [ "units#0", @@ -18534,7 +18534,7 @@ "units#0 (copy)" ] }, - "2503": { + "2449": { "op": "+", "defined_out": [ "box_prefixed_key%0#1", @@ -18549,7 +18549,7 @@ "tmp%0#2" ] }, - "2504": { + "2450": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0", @@ -18564,10 +18564,10 @@ "aggregate%val_as_bytes%0#0" ] }, - "2505": { + "2451": { "op": "pushint 40" }, - "2507": { + "2453": { "op": "swap", "stack_out": [ "units#0", @@ -18578,7 +18578,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "2508": { + "2454": { "op": "box_replace", "stack_out": [ "units#0", @@ -18586,7 +18586,7 @@ "units#0" ] }, - "2509": { + "2455": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -18600,7 +18600,7 @@ "0" ] }, - "2510": { + "2456": { "op": "bytec 11 // \"reserved_units_total\"", "defined_out": [ "\"reserved_units_total\"", @@ -18616,7 +18616,7 @@ "\"reserved_units_total\"" ] }, - "2512": { + "2458": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#1", @@ -18632,7 +18632,7 @@ "maybe_exists%4#0" ] }, - "2513": { + "2459": { "error": "check self.reserved_units_total exists", "op": "assert // check self.reserved_units_total exists", "stack_out": [ @@ -18642,7 +18642,7 @@ "maybe_value%4#0" ] }, - "2514": { + "2460": { "op": "+", "defined_out": [ "box_prefixed_key%0#1", @@ -18655,7 +18655,7 @@ "tmp%7#0" ] }, - "2515": { + "2461": { "op": "bytec 11 // \"reserved_units_total\"", "stack_out": [ "units#0", @@ -18664,7 +18664,7 @@ "\"reserved_units_total\"" ] }, - "2517": { + "2463": { "op": "dig 1", "defined_out": [ "\"reserved_units_total\"", @@ -18681,7 +18681,7 @@ "tmp%7#0 (copy)" ] }, - "2519": { + "2465": { "op": "app_global_put", "stack_out": [ "units#0", @@ -18689,7 +18689,7 @@ "tmp%7#0" ] }, - "2520": { + "2466": { "op": "intc_0 // 0", "stack_out": [ "units#0", @@ -18698,7 +18698,7 @@ "0" ] }, - "2521": { + "2467": { "op": "bytec 13 // \"total_units\"", "defined_out": [ "\"total_units\"", @@ -18715,7 +18715,7 @@ "\"total_units\"" ] }, - "2523": { + "2469": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#1", @@ -18732,7 +18732,7 @@ "maybe_exists%5#0" ] }, - "2524": { + "2470": { "error": "check self.total_units exists", "op": "assert // check self.total_units exists", "stack_out": [ @@ -18742,7 +18742,7 @@ "maybe_value%5#0" ] }, - "2525": { + "2471": { "op": "swap", "stack_out": [ "units#0", @@ -18751,7 +18751,7 @@ "tmp%7#0" ] }, - "2526": { + "2472": { "op": "-", "defined_out": [ "box_prefixed_key%0#1", @@ -18764,7 +18764,7 @@ "tmp%8#0" ] }, - "2527": { + "2473": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%1#0", @@ -18777,7 +18777,7 @@ "aggregate%val_as_bytes%1#0" ] }, - "2528": { + "2474": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -18792,7 +18792,7 @@ "0x151f7c75" ] }, - "2529": { + "2475": { "op": "swap", "stack_out": [ "units#0", @@ -18801,7 +18801,7 @@ "aggregate%val_as_bytes%1#0" ] }, - "2530": { + "2476": { "op": "concat", "defined_out": [ "box_prefixed_key%0#1", @@ -18814,14 +18814,14 @@ "tmp%6#0" ] }, - "2531": { + "2477": { "op": "log", "stack_out": [ "units#0", "box_prefixed_key%0#1" ] }, - "2532": { + "2478": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -18834,14 +18834,14 @@ "1" ] }, - "2533": { + "2479": { "op": "return", "stack_out": [ "units#0", "box_prefixed_key%0#1" ] }, - "2534": { + "2480": { "subroutine": "modules.transfer_agent.TransferAgent.transfer[routing]", "params": {}, "block": "transfer", @@ -18851,17 +18851,17 @@ "box_prefixed_key%0#3" ] }, - "2535": { + "2481": { "op": "dup", "stack_out": [ "box_prefixed_key%0#3", "box_prefixed_key%0#4" ] }, - "2536": { + "2482": { "op": "txna ApplicationArgs 1" }, - "2539": { + "2485": { "op": "dup", "defined_out": [ "sender_holding_address#0" @@ -18873,7 +18873,7 @@ "sender_holding_address#0" ] }, - "2540": { + "2486": { "op": "len", "defined_out": [ "len%0#0", @@ -18886,7 +18886,7 @@ "len%0#0" ] }, - "2541": { + "2487": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -18901,7 +18901,7 @@ "32" ] }, - "2542": { + "2488": { "op": "==", "defined_out": [ "eq%0#0", @@ -18914,7 +18914,7 @@ "eq%0#0" ] }, - "2543": { + "2489": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ @@ -18923,10 +18923,10 @@ "sender_holding_address#0" ] }, - "2544": { + "2490": { "op": "txna ApplicationArgs 2" }, - "2547": { + "2493": { "op": "dup", "defined_out": [ "receiver_holding_address#0", @@ -18940,7 +18940,7 @@ "receiver_holding_address#0" ] }, - "2548": { + "2494": { "op": "len", "defined_out": [ "len%1#0", @@ -18955,7 +18955,7 @@ "len%1#0" ] }, - "2549": { + "2495": { "op": "intc_3 // 32", "stack_out": [ "box_prefixed_key%0#3", @@ -18966,7 +18966,7 @@ "32" ] }, - "2550": { + "2496": { "op": "==", "defined_out": [ "eq%1#0", @@ -18981,7 +18981,7 @@ "eq%1#0" ] }, - "2551": { + "2497": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ @@ -18991,10 +18991,10 @@ "receiver_holding_address#0" ] }, - "2552": { + "2498": { "op": "txna ApplicationArgs 3" }, - "2555": { + "2501": { "op": "dupn 2", "defined_out": [ "receiver_holding_address#0", @@ -19012,7 +19012,7 @@ "tmp%4#0 (copy)" ] }, - "2557": { + "2503": { "op": "len", "defined_out": [ "len%2#0", @@ -19030,7 +19030,7 @@ "len%2#0" ] }, - "2558": { + "2504": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -19050,7 +19050,7 @@ "8" ] }, - "2559": { + "2505": { "op": "==", "defined_out": [ "eq%2#0", @@ -19068,7 +19068,7 @@ "eq%2#0" ] }, - "2560": { + "2506": { "error": "invalid number of bytes for arc4.uint64", "op": "assert // invalid number of bytes for arc4.uint64", "stack_out": [ @@ -19080,7 +19080,7 @@ "tmp%4#0" ] }, - "2561": { + "2507": { "op": "btoi", "defined_out": [ "receiver_holding_address#0", @@ -19097,7 +19097,7 @@ "units#0" ] }, - "2562": { + "2508": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#3", @@ -19109,7 +19109,7 @@ "0" ] }, - "2563": { + "2509": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"", @@ -19130,7 +19130,7 @@ "\"status\"" ] }, - "2564": { + "2510": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -19151,7 +19151,7 @@ "maybe_exists%0#0" ] }, - "2565": { + "2511": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ @@ -19164,7 +19164,7 @@ "maybe_value%0#0" ] }, - "2566": { + "2512": { "error": "D-ASA not configured", "op": "assert // D-ASA not configured", "stack_out": [ @@ -19176,15 +19176,15 @@ "units#0" ] }, - "2567": { + "2513": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", "op": "callsub _assert_is_not_asset_defaulted" }, - "2570": { + "2516": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_suspended", "op": "callsub _assert_is_not_asset_suspended" }, - "2573": { + "2519": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#3", @@ -19196,7 +19196,7 @@ "0" ] }, - "2574": { + "2520": { "op": "bytec_1 // \"status\"", "stack_out": [ "box_prefixed_key%0#3", @@ -19209,7 +19209,7 @@ "\"status\"" ] }, - "2575": { + "2521": { "op": "app_global_get_ex", "stack_out": [ "box_prefixed_key%0#3", @@ -19222,7 +19222,7 @@ "maybe_exists%0#0" ] }, - "2576": { + "2522": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ @@ -19235,7 +19235,7 @@ "maybe_value%0#0" ] }, - "2577": { + "2523": { "op": "pushint 50", "defined_out": [ "50", @@ -19256,7 +19256,7 @@ "50" ] }, - "2579": { + "2525": { "op": "==", "defined_out": [ "receiver_holding_address#0", @@ -19275,7 +19275,7 @@ "tmp%0#3" ] }, - "2580": { + "2526": { "op": "!", "defined_out": [ "receiver_holding_address#0", @@ -19294,7 +19294,7 @@ "tmp%1#1" ] }, - "2581": { + "2527": { "error": "IED not yet executed", "op": "assert // IED not yet executed", "stack_out": [ @@ -19306,7 +19306,7 @@ "units#0" ] }, - "2582": { + "2528": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#3", @@ -19318,7 +19318,7 @@ "0" ] }, - "2583": { + "2529": { "op": "bytec 28 // \"transfer_opening_date\"", "defined_out": [ "\"transfer_opening_date\"", @@ -19339,7 +19339,7 @@ "\"transfer_opening_date\"" ] }, - "2585": { + "2531": { "op": "app_global_get_ex", "stack_out": [ "box_prefixed_key%0#3", @@ -19352,7 +19352,7 @@ "maybe_exists%0#0" ] }, - "2586": { + "2532": { "error": "check self.transfer_opening_date exists", "op": "assert // check self.transfer_opening_date exists", "stack_out": [ @@ -19365,7 +19365,7 @@ "maybe_value%0#0" ] }, - "2587": { + "2533": { "op": "bz transfer_after_if_else@3", "stack_out": [ "box_prefixed_key%0#3", @@ -19376,7 +19376,7 @@ "units#0" ] }, - "2590": { + "2536": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#3", @@ -19388,7 +19388,7 @@ "0" ] }, - "2591": { + "2537": { "op": "bytec 28 // \"transfer_opening_date\"", "stack_out": [ "box_prefixed_key%0#3", @@ -19401,7 +19401,7 @@ "\"transfer_opening_date\"" ] }, - "2593": { + "2539": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%1#0", @@ -19422,7 +19422,7 @@ "maybe_exists%1#0" ] }, - "2594": { + "2540": { "error": "check self.transfer_opening_date exists", "op": "assert // check self.transfer_opening_date exists", "stack_out": [ @@ -19435,7 +19435,7 @@ "maybe_value%1#0" ] }, - "2595": { + "2541": { "op": "global LatestTimestamp", "defined_out": [ "maybe_value%1#0", @@ -19456,7 +19456,7 @@ "tmp%1#2" ] }, - "2597": { + "2543": { "op": "<=", "defined_out": [ "receiver_holding_address#0", @@ -19475,7 +19475,7 @@ "tmp%2#1" ] }, - "2598": { + "2544": { "error": "Transfer is closed", "op": "assert // Transfer is closed", "stack_out": [ @@ -19487,7 +19487,7 @@ "units#0" ] }, - "2599": { + "2545": { "block": "transfer_after_if_else@3", "stack_in": [ "box_prefixed_key%0#3", @@ -19511,7 +19511,7 @@ "0" ] }, - "2600": { + "2546": { "op": "bytec 29 // \"transfer_closure_date\"", "defined_out": [ "\"transfer_closure_date\"", @@ -19528,7 +19528,7 @@ "\"transfer_closure_date\"" ] }, - "2602": { + "2548": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%2#0", @@ -19545,7 +19545,7 @@ "maybe_exists%2#0" ] }, - "2603": { + "2549": { "error": "check self.transfer_closure_date exists", "op": "assert // check self.transfer_closure_date exists", "stack_out": [ @@ -19558,7 +19558,7 @@ "maybe_value%2#0" ] }, - "2604": { + "2550": { "op": "bz transfer_after_if_else@5", "stack_out": [ "box_prefixed_key%0#3", @@ -19569,7 +19569,7 @@ "units#0" ] }, - "2607": { + "2553": { "op": "global LatestTimestamp", "defined_out": [ "tmp%4#2" @@ -19584,7 +19584,7 @@ "tmp%4#2" ] }, - "2609": { + "2555": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#3", @@ -19597,7 +19597,7 @@ "0" ] }, - "2610": { + "2556": { "op": "bytec 29 // \"transfer_closure_date\"", "stack_out": [ "box_prefixed_key%0#3", @@ -19611,7 +19611,7 @@ "\"transfer_closure_date\"" ] }, - "2612": { + "2558": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%3#0", @@ -19630,7 +19630,7 @@ "maybe_exists%3#0" ] }, - "2613": { + "2559": { "error": "check self.transfer_closure_date exists", "op": "assert // check self.transfer_closure_date exists", "stack_out": [ @@ -19644,7 +19644,7 @@ "maybe_value%3#0" ] }, - "2614": { + "2560": { "op": "<", "defined_out": [ "tmp%5#0" @@ -19659,7 +19659,7 @@ "tmp%5#0" ] }, - "2615": { + "2561": { "error": "Transfer is closed", "op": "assert // Transfer is closed", "stack_out": [ @@ -19671,7 +19671,7 @@ "units#0" ] }, - "2616": { + "2562": { "block": "transfer_after_if_else@5", "stack_in": [ "box_prefixed_key%0#3", @@ -19695,7 +19695,7 @@ "tmp%0#1" ] }, - "2618": { + "2564": { "op": "dig 4", "defined_out": [ "sender_holding_address#0", @@ -19712,7 +19712,7 @@ "sender_holding_address#0" ] }, - "2620": { + "2566": { "op": "dup", "defined_out": [ "sender_holding_address#0", @@ -19731,7 +19731,7 @@ "sender_holding_address#0 (copy)" ] }, - "2621": { + "2567": { "op": "cover 2", "stack_out": [ "box_prefixed_key%0#3", @@ -19745,7 +19745,7 @@ "sender_holding_address#0 (copy)" ] }, - "2623": { + "2569": { "op": "==", "defined_out": [ "sender_holding_address#0", @@ -19762,7 +19762,7 @@ "tmp%1#1" ] }, - "2624": { + "2570": { "error": "Not authorized", "op": "assert // Not authorized", "stack_out": [ @@ -19775,10 +19775,10 @@ "sender_holding_address#0" ] }, - "2625": { - "op": "bytec 8 // 0x52234163636f756e7423", + "2571": { + "op": "bytec 8 // 0x4123", "defined_out": [ - "0x52234163636f756e7423", + "0x4123", "sender_holding_address#0" ], "stack_out": [ @@ -19789,10 +19789,10 @@ "tmp%4#0", "units#0", "sender_holding_address#0", - "0x52234163636f756e7423" + "0x4123" ] }, - "2627": { + "2573": { "op": "dig 1", "stack_out": [ "box_prefixed_key%0#3", @@ -19802,11 +19802,11 @@ "tmp%4#0", "units#0", "sender_holding_address#0", - "0x52234163636f756e7423", + "0x4123", "sender_holding_address#0 (copy)" ] }, - "2629": { + "2575": { "op": "concat", "defined_out": [ "box_prefixed_key%0#3", @@ -19823,7 +19823,7 @@ "box_prefixed_key%0#3" ] }, - "2630": { + "2576": { "op": "dup", "stack_out": [ "box_prefixed_key%0#3", @@ -19837,7 +19837,7 @@ "box_prefixed_key%0#3" ] }, - "2631": { + "2577": { "op": "bury 8", "defined_out": [ "box_prefixed_key%0#3", @@ -19854,7 +19854,7 @@ "box_prefixed_key%0#3" ] }, - "2633": { + "2579": { "op": "dup", "defined_out": [ "box_prefixed_key%0#3", @@ -19873,7 +19873,7 @@ "box_prefixed_key%0#3 (copy)" ] }, - "2634": { + "2580": { "op": "box_len", "defined_out": [ "_%0#0", @@ -19894,7 +19894,7 @@ "maybe_exists%0#0" ] }, - "2635": { + "2581": { "op": "bury 1", "stack_out": [ "box_prefixed_key%0#3", @@ -19908,7 +19908,7 @@ "maybe_exists%0#0" ] }, - "2637": { + "2583": { "error": "Invalid account holding address", "op": "assert // Invalid account holding address", "stack_out": [ @@ -19922,8 +19922,8 @@ "box_prefixed_key%0#3" ] }, - "2638": { - "op": "bytec 8 // 0x52234163636f756e7423", + "2584": { + "op": "bytec 8 // 0x4123", "stack_out": [ "box_prefixed_key%0#3", "box_prefixed_key%0#4", @@ -19933,13 +19933,13 @@ "units#0", "sender_holding_address#0", "box_prefixed_key%0#3", - "0x52234163636f756e7423" + "0x4123" ] }, - "2640": { + "2586": { "op": "dig 5", "defined_out": [ - "0x52234163636f756e7423", + "0x4123", "box_prefixed_key%0#3", "receiver_holding_address#0", "sender_holding_address#0" @@ -19953,14 +19953,14 @@ "units#0", "sender_holding_address#0", "box_prefixed_key%0#3", - "0x52234163636f756e7423", + "0x4123", "receiver_holding_address#0" ] }, - "2642": { + "2588": { "op": "dup", "defined_out": [ - "0x52234163636f756e7423", + "0x4123", "box_prefixed_key%0#3", "receiver_holding_address#0", "receiver_holding_address#0 (copy)", @@ -19975,12 +19975,12 @@ "units#0", "sender_holding_address#0", "box_prefixed_key%0#3", - "0x52234163636f756e7423", + "0x4123", "receiver_holding_address#0 (copy)", "receiver_holding_address#0 (copy)" ] }, - "2643": { + "2589": { "op": "cover 2", "stack_out": [ "box_prefixed_key%0#3", @@ -19992,11 +19992,11 @@ "sender_holding_address#0", "box_prefixed_key%0#3", "receiver_holding_address#0", - "0x52234163636f756e7423", + "0x4123", "receiver_holding_address#0 (copy)" ] }, - "2645": { + "2591": { "op": "concat", "defined_out": [ "box_prefixed_key%0#3", @@ -20017,7 +20017,7 @@ "box_prefixed_key%0#4" ] }, - "2646": { + "2592": { "op": "dup", "stack_out": [ "box_prefixed_key%0#3", @@ -20033,7 +20033,7 @@ "box_prefixed_key%0#4" ] }, - "2647": { + "2593": { "op": "bury 9", "defined_out": [ "box_prefixed_key%0#3", @@ -20054,7 +20054,7 @@ "box_prefixed_key%0#4" ] }, - "2649": { + "2595": { "op": "box_len", "stack_out": [ "box_prefixed_key%0#3", @@ -20070,7 +20070,7 @@ "maybe_exists%0#0" ] }, - "2650": { + "2596": { "op": "bury 1", "stack_out": [ "box_prefixed_key%0#3", @@ -20085,7 +20085,7 @@ "maybe_exists%0#0" ] }, - "2652": { + "2598": { "error": "Invalid account holding address", "op": "assert // Invalid account holding address", "stack_out": [ @@ -20100,7 +20100,7 @@ "receiver_holding_address#0" ] }, - "2653": { + "2599": { "op": "dig 2", "stack_out": [ "box_prefixed_key%0#3", @@ -20115,7 +20115,7 @@ "sender_holding_address#0 (copy)" ] }, - "2655": { + "2601": { "callsub": "modules.accounting.AccountingModule._assert_is_not_account_suspended", "op": "callsub _assert_is_not_account_suspended", "stack_out": [ @@ -20130,7 +20130,7 @@ "receiver_holding_address#0" ] }, - "2658": { + "2604": { "op": "dup", "stack_out": [ "box_prefixed_key%0#3", @@ -20145,7 +20145,7 @@ "receiver_holding_address#0 (copy)" ] }, - "2659": { + "2605": { "callsub": "modules.accounting.AccountingModule._assert_is_not_account_suspended", "op": "callsub _assert_is_not_account_suspended", "stack_out": [ @@ -20160,7 +20160,7 @@ "receiver_holding_address#0" ] }, - "2662": { + "2608": { "op": "uncover 2", "stack_out": [ "box_prefixed_key%0#3", @@ -20174,7 +20174,7 @@ "sender_holding_address#0" ] }, - "2664": { + "2610": { "op": "!=", "defined_out": [ "box_prefixed_key%0#3", @@ -20194,7 +20194,7 @@ "tmp%2#1" ] }, - "2665": { + "2611": { "error": "Sender and receiver must be different", "op": "assert // Sender and receiver must be different", "stack_out": [ @@ -20207,7 +20207,7 @@ "box_prefixed_key%0#3" ] }, - "2666": { + "2612": { "op": "dig 1", "defined_out": [ "box_prefixed_key%0#3", @@ -20227,7 +20227,7 @@ "units#0" ] }, - "2668": { + "2614": { "op": "dup", "defined_out": [ "box_prefixed_key%0#3", @@ -20249,7 +20249,7 @@ "units#0 (copy)" ] }, - "2669": { + "2615": { "error": "Transfer units must be greater than zero", "op": "assert // Transfer units must be greater than zero", "stack_out": [ @@ -20263,7 +20263,7 @@ "units#0" ] }, - "2670": { + "2616": { "op": "swap", "stack_out": [ "box_prefixed_key%0#3", @@ -20276,7 +20276,7 @@ "box_prefixed_key%0#3" ] }, - "2671": { + "2617": { "op": "box_get", "defined_out": [ "aggregate%box_get%0#0", @@ -20299,7 +20299,7 @@ "aggregate%box_get%1#0" ] }, - "2672": { + "2618": { "error": "check self.account entry exists", "op": "assert // check self.account entry exists", "stack_out": [ @@ -20313,7 +20313,7 @@ "aggregate%box_get%0#0" ] }, - "2673": { + "2619": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -20336,7 +20336,7 @@ "32" ] }, - "2674": { + "2620": { "op": "extract_uint64", "defined_out": [ "box_prefixed_key%0#3", @@ -20357,7 +20357,7 @@ "values%0#0" ] }, - "2675": { + "2621": { "op": "<=", "defined_out": [ "box_prefixed_key%0#3", @@ -20377,7 +20377,7 @@ "tmp%4#1" ] }, - "2676": { + "2622": { "error": "Insufficient sender units to transfer", "op": "assert // Insufficient sender units to transfer", "stack_out": [ @@ -20389,7 +20389,7 @@ "units#0" ] }, - "2677": { + "2623": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#3", @@ -20401,7 +20401,7 @@ "0" ] }, - "2678": { + "2624": { "op": "bytec_2 // \"event_cursor\"", "defined_out": [ "\"event_cursor\"", @@ -20423,7 +20423,7 @@ "\"event_cursor\"" ] }, - "2679": { + "2625": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#3", @@ -20445,7 +20445,7 @@ "maybe_exists%0#0" ] }, - "2680": { + "2626": { "error": "check self.event_cursor exists", "op": "assert // check self.event_cursor exists", "stack_out": [ @@ -20458,7 +20458,7 @@ "maybe_value%0#0" ] }, - "2681": { + "2627": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#3", @@ -20471,7 +20471,7 @@ "0" ] }, - "2682": { + "2628": { "op": "bytec_3 // \"schedule_entry_count\"", "defined_out": [ "\"schedule_entry_count\"", @@ -20495,7 +20495,7 @@ "\"schedule_entry_count\"" ] }, - "2683": { + "2629": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#3", @@ -20519,7 +20519,7 @@ "maybe_exists%1#0" ] }, - "2684": { + "2630": { "error": "check self.schedule_entry_count exists", "op": "assert // check self.schedule_entry_count exists", "stack_out": [ @@ -20533,7 +20533,7 @@ "maybe_value%1#0" ] }, - "2685": { + "2631": { "op": ">=", "defined_out": [ "box_prefixed_key%0#3", @@ -20553,7 +20553,7 @@ "tmp%0#3" ] }, - "2686": { + "2632": { "op": "bnz transfer_after_inlined_modules.actus_kernel.ActusKernelModule._assert_no_due_event_pending@10", "stack_out": [ "box_prefixed_key%0#3", @@ -20564,7 +20564,7 @@ "units#0" ] }, - "2689": { + "2635": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#3", @@ -20576,7 +20576,7 @@ "0" ] }, - "2690": { + "2636": { "op": "bytec_2 // \"event_cursor\"", "stack_out": [ "box_prefixed_key%0#3", @@ -20589,7 +20589,7 @@ "\"event_cursor\"" ] }, - "2691": { + "2637": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#3", @@ -20611,7 +20611,7 @@ "maybe_exists%2#0" ] }, - "2692": { + "2638": { "error": "check self.event_cursor exists", "op": "assert // check self.event_cursor exists", "stack_out": [ @@ -20624,7 +20624,7 @@ "maybe_value%2#0" ] }, - "2693": { + "2639": { "callsub": "modules.actus_kernel.ActusKernelModule._get_schedule_entry", "op": "callsub _get_schedule_entry", "defined_out": [ @@ -20645,7 +20645,7 @@ "next_entry#0" ] }, - "2696": { + "2642": { "op": "pushint 9", "defined_out": [ "9", @@ -20667,7 +20667,7 @@ "9" ] }, - "2698": { + "2644": { "op": "extract_uint64", "stack_out": [ "box_prefixed_key%0#3", @@ -20679,7 +20679,7 @@ "values%0#0" ] }, - "2699": { + "2645": { "op": "global LatestTimestamp", "defined_out": [ "box_prefixed_key%0#3", @@ -20701,7 +20701,7 @@ "tmp%2#3" ] }, - "2701": { + "2647": { "op": ">", "defined_out": [ "box_prefixed_key%0#3", @@ -20721,7 +20721,7 @@ "tmp%3#3" ] }, - "2702": { + "2648": { "error": "ACTUS event not yet executed", "op": "assert // ACTUS event not yet executed", "stack_out": [ @@ -20733,7 +20733,7 @@ "units#0" ] }, - "2703": { + "2649": { "block": "transfer_after_inlined_modules.actus_kernel.ActusKernelModule._assert_no_due_event_pending@10", "stack_in": [ "box_prefixed_key%0#3", @@ -20757,7 +20757,7 @@ "sender_holding_address#0" ] }, - "2705": { + "2651": { "op": "dup", "defined_out": [ "sender_holding_address#0", @@ -20774,7 +20774,7 @@ "sender_holding_address#0 (copy)" ] }, - "2706": { + "2652": { "callsub": "modules.accounting.AccountingModule._ensure_units_activated", "op": "callsub _ensure_units_activated", "stack_out": [ @@ -20787,7 +20787,7 @@ "sender_holding_address#0" ] }, - "2709": { + "2655": { "op": "dig 3", "defined_out": [ "receiver_holding_address#0", @@ -20804,7 +20804,7 @@ "receiver_holding_address#0" ] }, - "2711": { + "2657": { "op": "dup", "defined_out": [ "receiver_holding_address#0", @@ -20823,7 +20823,7 @@ "receiver_holding_address#0 (copy)" ] }, - "2712": { + "2658": { "op": "cover 2", "stack_out": [ "box_prefixed_key%0#3", @@ -20837,7 +20837,7 @@ "receiver_holding_address#0 (copy)" ] }, - "2714": { + "2660": { "callsub": "modules.accounting.AccountingModule._ensure_units_activated", "op": "callsub _ensure_units_activated", "stack_out": [ @@ -20851,7 +20851,7 @@ "sender_holding_address#0" ] }, - "2717": { + "2663": { "callsub": "modules.accounting.AccountingModule._settle_position", "op": "callsub _settle_position", "defined_out": [ @@ -20872,7 +20872,7 @@ "{_settle_position}.1" ] }, - "2720": { + "2666": { "op": "popn 2", "stack_out": [ "box_prefixed_key%0#3", @@ -20884,7 +20884,7 @@ "receiver_holding_address#0" ] }, - "2722": { + "2668": { "callsub": "modules.accounting.AccountingModule._settle_position", "op": "callsub _settle_position", "stack_out": [ @@ -20898,7 +20898,7 @@ "{_settle_position}.1" ] }, - "2725": { + "2671": { "op": "popn 2", "stack_out": [ "box_prefixed_key%0#3", @@ -20909,7 +20909,7 @@ "units#0" ] }, - "2727": { + "2673": { "op": "dig 5", "defined_out": [ "box_prefixed_key%0#3", @@ -20926,7 +20926,7 @@ "box_prefixed_key%0#3" ] }, - "2729": { + "2675": { "op": "dup", "defined_out": [ "box_prefixed_key%0#3", @@ -20945,7 +20945,7 @@ "box_prefixed_key%0#3 (copy)" ] }, - "2730": { + "2676": { "op": "box_get", "defined_out": [ "aggregate%box_get%2#0", @@ -20966,7 +20966,7 @@ "aggregate%box_get%3#0" ] }, - "2731": { + "2677": { "error": "check self.account entry exists", "op": "assert // check self.account entry exists", "stack_out": [ @@ -20980,7 +20980,7 @@ "aggregate%box_get%2#0" ] }, - "2732": { + "2678": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -21001,7 +21001,7 @@ "32" ] }, - "2733": { + "2679": { "op": "extract_uint64", "defined_out": [ "box_prefixed_key%0#3", @@ -21020,7 +21020,7 @@ "values%0#0" ] }, - "2734": { + "2680": { "op": "dig 2", "defined_out": [ "box_prefixed_key%0#3", @@ -21041,7 +21041,7 @@ "units#0" ] }, - "2736": { + "2682": { "op": "dup", "defined_out": [ "box_prefixed_key%0#3", @@ -21064,7 +21064,7 @@ "units#0 (copy)" ] }, - "2737": { + "2683": { "op": "cover 2", "stack_out": [ "box_prefixed_key%0#3", @@ -21079,7 +21079,7 @@ "units#0 (copy)" ] }, - "2739": { + "2685": { "op": "dig 1", "defined_out": [ "box_prefixed_key%0#3", @@ -21104,7 +21104,7 @@ "values%0#0 (copy)" ] }, - "2741": { + "2687": { "op": "<=", "defined_out": [ "box_prefixed_key%0#3", @@ -21127,7 +21127,7 @@ "tmp%0#3" ] }, - "2742": { + "2688": { "error": "Insufficient sender units to transfer", "op": "assert // Insufficient sender units to transfer", "stack_out": [ @@ -21142,7 +21142,7 @@ "values%0#0" ] }, - "2743": { + "2689": { "op": "dig 1", "stack_out": [ "box_prefixed_key%0#3", @@ -21157,7 +21157,7 @@ "units#0 (copy)" ] }, - "2745": { + "2691": { "op": "-", "defined_out": [ "box_prefixed_key%0#3", @@ -21178,7 +21178,7 @@ "tmp%1#2" ] }, - "2746": { + "2692": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0", @@ -21199,7 +21199,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "2747": { + "2693": { "op": "uncover 2", "stack_out": [ "box_prefixed_key%0#3", @@ -21213,7 +21213,7 @@ "box_prefixed_key%0#3" ] }, - "2749": { + "2695": { "op": "intc_3 // 32", "stack_out": [ "box_prefixed_key%0#3", @@ -21228,7 +21228,7 @@ "32" ] }, - "2750": { + "2696": { "op": "uncover 2", "stack_out": [ "box_prefixed_key%0#3", @@ -21243,7 +21243,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "2752": { + "2698": { "op": "box_replace", "stack_out": [ "box_prefixed_key%0#3", @@ -21255,7 +21255,7 @@ "units#0" ] }, - "2753": { + "2699": { "op": "dig 5", "defined_out": [ "box_prefixed_key%0#3", @@ -21275,7 +21275,7 @@ "box_prefixed_key%0#4" ] }, - "2755": { + "2701": { "op": "dup", "defined_out": [ "box_prefixed_key%0#3", @@ -21297,7 +21297,7 @@ "box_prefixed_key%0#4 (copy)" ] }, - "2756": { + "2702": { "op": "box_get", "defined_out": [ "aggregate%box_get%6#0", @@ -21321,7 +21321,7 @@ "aggregate%box_get%7#0" ] }, - "2757": { + "2703": { "error": "check self.account entry exists", "op": "assert // check self.account entry exists", "stack_out": [ @@ -21336,7 +21336,7 @@ "aggregate%box_get%6#0" ] }, - "2758": { + "2704": { "op": "intc_3 // 32", "stack_out": [ "box_prefixed_key%0#3", @@ -21351,7 +21351,7 @@ "32" ] }, - "2759": { + "2705": { "op": "extract_uint64", "stack_out": [ "box_prefixed_key%0#3", @@ -21365,7 +21365,7 @@ "values%0#0" ] }, - "2760": { + "2706": { "op": "uncover 2", "stack_out": [ "box_prefixed_key%0#3", @@ -21379,7 +21379,7 @@ "units#0" ] }, - "2762": { + "2708": { "op": "+", "defined_out": [ "box_prefixed_key%0#3", @@ -21400,7 +21400,7 @@ "tmp%0#5" ] }, - "2763": { + "2709": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%1#0", @@ -21421,10 +21421,10 @@ "aggregate%val_as_bytes%1#0" ] }, - "2764": { + "2710": { "op": "intc_3 // 32" }, - "2765": { + "2711": { "op": "swap", "stack_out": [ "box_prefixed_key%0#3", @@ -21438,7 +21438,7 @@ "aggregate%val_as_bytes%1#0" ] }, - "2766": { + "2712": { "op": "box_replace", "stack_out": [ "box_prefixed_key%0#3", @@ -21449,7 +21449,7 @@ "units#0" ] }, - "2767": { + "2713": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -21469,7 +21469,7 @@ "0x151f7c75" ] }, - "2768": { + "2714": { "op": "dig 2", "defined_out": [ "0x151f7c75", @@ -21491,7 +21491,7 @@ "tmp%4#0" ] }, - "2770": { + "2716": { "op": "concat", "defined_out": [ "box_prefixed_key%0#3", @@ -21512,7 +21512,7 @@ "tmp%8#0" ] }, - "2771": { + "2717": { "op": "log", "stack_out": [ "box_prefixed_key%0#3", @@ -21523,7 +21523,7 @@ "units#0" ] }, - "2772": { + "2718": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -21544,7 +21544,7 @@ "1" ] }, - "2773": { + "2719": { "op": "return", "stack_out": [ "box_prefixed_key%0#3", @@ -21555,7 +21555,7 @@ "units#0" ] }, - "2774": { + "2720": { "subroutine": "modules.accounting.AccountingModule.account_suspension[routing]", "params": {}, "block": "account_suspension", @@ -21568,7 +21568,7 @@ "holding_address#0" ] }, - "2777": { + "2723": { "op": "dup", "defined_out": [ "holding_address#0", @@ -21579,7 +21579,7 @@ "holding_address#0 (copy)" ] }, - "2778": { + "2724": { "op": "len", "defined_out": [ "holding_address#0", @@ -21590,7 +21590,7 @@ "len%0#0" ] }, - "2779": { + "2725": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -21603,7 +21603,7 @@ "32" ] }, - "2780": { + "2726": { "op": "==", "defined_out": [ "eq%0#0", @@ -21614,14 +21614,14 @@ "eq%0#0" ] }, - "2781": { + "2727": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ "holding_address#0" ] }, - "2782": { + "2728": { "op": "txna ApplicationArgs 2", "defined_out": [ "holding_address#0", @@ -21632,7 +21632,7 @@ "tmp%2#0" ] }, - "2785": { + "2731": { "op": "dup", "defined_out": [ "holding_address#0", @@ -21645,7 +21645,7 @@ "tmp%2#0 (copy)" ] }, - "2786": { + "2732": { "op": "len", "defined_out": [ "holding_address#0", @@ -21658,7 +21658,7 @@ "len%1#0" ] }, - "2787": { + "2733": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -21673,7 +21673,7 @@ "1" ] }, - "2788": { + "2734": { "op": "==", "defined_out": [ "eq%1#0", @@ -21686,7 +21686,7 @@ "eq%1#0" ] }, - "2789": { + "2735": { "error": "invalid number of bytes for arc4.bool", "op": "assert // invalid number of bytes for arc4.bool", "stack_out": [ @@ -21694,7 +21694,7 @@ "tmp%2#0" ] }, - "2790": { + "2736": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -21707,7 +21707,7 @@ "0" ] }, - "2791": { + "2737": { "op": "getbit", "defined_out": [ "holding_address#0", @@ -21718,23 +21718,23 @@ "suspended#0" ] }, - "2792": { - "op": "bytec 21 // 0x5223417574686f7269747923", + "2738": { + "op": "bytec 21 // 0x523a41555423", "defined_out": [ - "0x5223417574686f7269747923", + "0x523a41555423", "holding_address#0", "suspended#0" ], "stack_out": [ "holding_address#0", "suspended#0", - "0x5223417574686f7269747923" + "0x523a41555423" ] }, - "2794": { + "2740": { "op": "txn Sender", "defined_out": [ - "0x5223417574686f7269747923", + "0x523a41555423", "holding_address#0", "suspended#0", "tmp%0#2" @@ -21742,11 +21742,11 @@ "stack_out": [ "holding_address#0", "suspended#0", - "0x5223417574686f7269747923", + "0x523a41555423", "tmp%0#2" ] }, - "2796": { + "2742": { "callsub": "modules.rbac.RbacModule._role_is_active", "op": "callsub _role_is_active", "defined_out": [ @@ -21760,7 +21760,7 @@ "tmp%1#0" ] }, - "2799": { + "2745": { "error": "Not authorized", "op": "assert // Not authorized", "stack_out": [ @@ -21768,28 +21768,28 @@ "suspended#0" ] }, - "2800": { - "op": "bytec 8 // 0x52234163636f756e7423", + "2746": { + "op": "bytec 8 // 0x4123", "defined_out": [ - "0x52234163636f756e7423", + "0x4123", "holding_address#0", "suspended#0" ], "stack_out": [ "holding_address#0", "suspended#0", - "0x52234163636f756e7423" + "0x4123" ] }, - "2802": { + "2748": { "op": "uncover 2", "stack_out": [ "suspended#0", - "0x52234163636f756e7423", + "0x4123", "holding_address#0" ] }, - "2804": { + "2750": { "op": "concat", "defined_out": [ "box_prefixed_key%0#1", @@ -21800,7 +21800,7 @@ "box_prefixed_key%0#1" ] }, - "2805": { + "2751": { "op": "dup", "defined_out": [ "box_prefixed_key%0#1", @@ -21813,7 +21813,7 @@ "box_prefixed_key%0#1 (copy)" ] }, - "2806": { + "2752": { "op": "box_len", "defined_out": [ "_%0#0", @@ -21828,7 +21828,7 @@ "maybe_exists%0#0" ] }, - "2807": { + "2753": { "op": "bury 1", "stack_out": [ "suspended#0", @@ -21836,7 +21836,7 @@ "maybe_exists%0#0" ] }, - "2809": { + "2755": { "error": "Invalid account holding address", "op": "assert // Invalid account holding address", "stack_out": [ @@ -21844,7 +21844,7 @@ "box_prefixed_key%0#1" ] }, - "2810": { + "2756": { "op": "dup", "stack_out": [ "suspended#0", @@ -21852,7 +21852,7 @@ "box_prefixed_key%0#1 (copy)" ] }, - "2811": { + "2757": { "op": "pushint 48", "defined_out": [ "48", @@ -21867,7 +21867,7 @@ "48" ] }, - "2813": { + "2759": { "op": "intc_1 // 1", "stack_out": [ "suspended#0", @@ -21877,7 +21877,7 @@ "1" ] }, - "2814": { + "2760": { "op": "box_extract", "defined_out": [ "box%box_extract%0#0", @@ -21890,7 +21890,7 @@ "box%box_extract%0#0" ] }, - "2815": { + "2761": { "op": "intc_0 // 0", "stack_out": [ "suspended#0", @@ -21899,7 +21899,7 @@ "0" ] }, - "2816": { + "2762": { "op": "uncover 3", "stack_out": [ "box_prefixed_key%0#1", @@ -21908,7 +21908,7 @@ "suspended#0" ] }, - "2818": { + "2764": { "op": "setbit", "defined_out": [ "aggregate%updated_target%0#0", @@ -21919,10 +21919,10 @@ "aggregate%updated_target%0#0" ] }, - "2819": { + "2765": { "op": "pushint 48" }, - "2821": { + "2767": { "op": "swap", "stack_out": [ "box_prefixed_key%0#1", @@ -21930,11 +21930,11 @@ "aggregate%updated_target%0#0" ] }, - "2822": { + "2768": { "op": "box_replace", "stack_out": [] }, - "2823": { + "2769": { "op": "global LatestTimestamp", "defined_out": [ "tmp%0#1" @@ -21943,7 +21943,7 @@ "tmp%0#1" ] }, - "2825": { + "2771": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0" @@ -21952,7 +21952,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "2826": { + "2772": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -21963,14 +21963,14 @@ "0x151f7c75" ] }, - "2827": { + "2773": { "op": "swap", "stack_out": [ "0x151f7c75", "aggregate%val_as_bytes%0#0" ] }, - "2828": { + "2774": { "op": "concat", "defined_out": [ "tmp%6#0" @@ -21979,21 +21979,21 @@ "tmp%6#0" ] }, - "2829": { + "2775": { "op": "log", "stack_out": [] }, - "2830": { + "2776": { "op": "intc_1 // 1", "stack_out": [ "1" ] }, - "2831": { + "2777": { "op": "return", "stack_out": [] }, - "2832": { + "2778": { "subroutine": "modules.accounting.AccountingModule.account_open[routing]", "params": {}, "block": "account_open", @@ -22006,7 +22006,7 @@ "holding_address#0" ] }, - "2835": { + "2781": { "op": "dup", "defined_out": [ "holding_address#0", @@ -22017,7 +22017,7 @@ "holding_address#0 (copy)" ] }, - "2836": { + "2782": { "op": "len", "defined_out": [ "holding_address#0", @@ -22028,7 +22028,7 @@ "len%0#0" ] }, - "2837": { + "2783": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -22041,7 +22041,7 @@ "32" ] }, - "2838": { + "2784": { "op": "==", "defined_out": [ "eq%0#0", @@ -22052,14 +22052,14 @@ "eq%0#0" ] }, - "2839": { + "2785": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ "holding_address#0" ] }, - "2840": { + "2786": { "op": "txna ApplicationArgs 2", "defined_out": [ "holding_address#0", @@ -22070,7 +22070,7 @@ "payment_address#0" ] }, - "2843": { + "2789": { "op": "dup", "defined_out": [ "holding_address#0", @@ -22083,7 +22083,7 @@ "payment_address#0 (copy)" ] }, - "2844": { + "2790": { "op": "len", "defined_out": [ "holding_address#0", @@ -22096,7 +22096,7 @@ "len%1#0" ] }, - "2845": { + "2791": { "op": "intc_3 // 32", "stack_out": [ "holding_address#0", @@ -22105,7 +22105,7 @@ "32" ] }, - "2846": { + "2792": { "op": "==", "defined_out": [ "eq%1#0", @@ -22118,7 +22118,7 @@ "eq%1#0" ] }, - "2847": { + "2793": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ @@ -22126,23 +22126,23 @@ "payment_address#0" ] }, - "2848": { - "op": "bytec 23 // 0x52234163636f756e744d616e6167657223", + "2794": { + "op": "bytec 23 // 0x523a4d4e4723", "defined_out": [ - "0x52234163636f756e744d616e6167657223", + "0x523a4d4e4723", "holding_address#0", "payment_address#0" ], "stack_out": [ "holding_address#0", "payment_address#0", - "0x52234163636f756e744d616e6167657223" + "0x523a4d4e4723" ] }, - "2850": { + "2796": { "op": "txn Sender", "defined_out": [ - "0x52234163636f756e744d616e6167657223", + "0x523a4d4e4723", "holding_address#0", "payment_address#0", "tmp%0#2" @@ -22150,11 +22150,11 @@ "stack_out": [ "holding_address#0", "payment_address#0", - "0x52234163636f756e744d616e6167657223", + "0x523a4d4e4723", "tmp%0#2" ] }, - "2852": { + "2798": { "callsub": "modules.rbac.RbacModule._role_is_active", "op": "callsub _role_is_active", "defined_out": [ @@ -22168,7 +22168,7 @@ "tmp%1#1" ] }, - "2855": { + "2801": { "error": "Not authorized", "op": "assert // Not authorized", "stack_out": [ @@ -22176,7 +22176,7 @@ "payment_address#0" ] }, - "2856": { + "2802": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -22189,7 +22189,7 @@ "0" ] }, - "2857": { + "2803": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"", @@ -22204,7 +22204,7 @@ "\"status\"" ] }, - "2858": { + "2804": { "op": "app_global_get_ex", "defined_out": [ "holding_address#0", @@ -22219,7 +22219,7 @@ "maybe_exists%0#0" ] }, - "2859": { + "2805": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ @@ -22228,7 +22228,7 @@ "maybe_value%0#0" ] }, - "2860": { + "2806": { "op": "pushint 200", "defined_out": [ "200", @@ -22243,7 +22243,7 @@ "200" ] }, - "2863": { + "2809": { "op": "==", "defined_out": [ "holding_address#0", @@ -22256,7 +22256,7 @@ "tmp%0#3" ] }, - "2864": { + "2810": { "op": "!", "stack_out": [ "holding_address#0", @@ -22264,7 +22264,7 @@ "tmp%1#1" ] }, - "2865": { + "2811": { "error": "Not authorized", "op": "assert // Not authorized", "stack_out": [ @@ -22272,36 +22272,36 @@ "payment_address#0" ] }, - "2866": { + "2812": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", "op": "callsub _assert_is_not_asset_defaulted" }, - "2869": { + "2815": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_suspended", "op": "callsub _assert_is_not_asset_suspended" }, - "2872": { - "op": "bytec 8 // 0x52234163636f756e7423", + "2818": { + "op": "bytec 8 // 0x4123", "defined_out": [ - "0x52234163636f756e7423", + "0x4123", "holding_address#0", "payment_address#0" ], "stack_out": [ "holding_address#0", "payment_address#0", - "0x52234163636f756e7423" + "0x4123" ] }, - "2874": { + "2820": { "op": "uncover 2", "stack_out": [ "payment_address#0", - "0x52234163636f756e7423", + "0x4123", "holding_address#0" ] }, - "2876": { + "2822": { "op": "concat", "defined_out": [ "box_prefixed_key%0#0", @@ -22312,7 +22312,7 @@ "box_prefixed_key%0#0" ] }, - "2877": { + "2823": { "op": "dup", "defined_out": [ "box_prefixed_key%0#0", @@ -22325,7 +22325,7 @@ "box_prefixed_key%0#0 (copy)" ] }, - "2878": { + "2824": { "op": "box_len", "defined_out": [ "_%0#0", @@ -22340,7 +22340,7 @@ "maybe_exists%0#0" ] }, - "2879": { + "2825": { "op": "bury 1", "stack_out": [ "payment_address#0", @@ -22348,7 +22348,7 @@ "maybe_exists%0#0" ] }, - "2881": { + "2827": { "op": "!", "defined_out": [ "box_prefixed_key%0#0", @@ -22361,7 +22361,7 @@ "tmp%2#1" ] }, - "2882": { + "2828": { "error": "Invalid account holding address", "op": "assert // Invalid account holding address", "stack_out": [ @@ -22369,7 +22369,7 @@ "box_prefixed_key%0#0" ] }, - "2883": { + "2829": { "op": "intc_0 // 0", "stack_out": [ "payment_address#0", @@ -22377,7 +22377,7 @@ "0" ] }, - "2884": { + "2830": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0", @@ -22390,7 +22390,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "2885": { + "2831": { "op": "uncover 2", "stack_out": [ "box_prefixed_key%0#0", @@ -22398,7 +22398,7 @@ "payment_address#0" ] }, - "2887": { + "2833": { "op": "dig 1", "defined_out": [ "aggregate%val_as_bytes%0#0", @@ -22413,7 +22413,7 @@ "aggregate%val_as_bytes%0#0 (copy)" ] }, - "2889": { + "2835": { "op": "concat", "defined_out": [ "aggregate%head%1#0", @@ -22426,7 +22426,7 @@ "aggregate%head%1#0" ] }, - "2890": { + "2836": { "op": "dig 1", "stack_out": [ "box_prefixed_key%0#0", @@ -22435,7 +22435,7 @@ "aggregate%val_as_bytes%0#0 (copy)" ] }, - "2892": { + "2838": { "op": "concat", "defined_out": [ "aggregate%head%2#0", @@ -22448,7 +22448,7 @@ "aggregate%head%2#0" ] }, - "2893": { + "2839": { "op": "bytec 40 // 0x00", "defined_out": [ "0x00", @@ -22463,7 +22463,7 @@ "0x00" ] }, - "2895": { + "2841": { "op": "concat", "defined_out": [ "aggregate%head%3#0", @@ -22476,7 +22476,7 @@ "aggregate%head%3#0" ] }, - "2896": { + "2842": { "op": "dig 1", "stack_out": [ "box_prefixed_key%0#0", @@ -22485,7 +22485,7 @@ "aggregate%val_as_bytes%0#0 (copy)" ] }, - "2898": { + "2844": { "op": "concat", "defined_out": [ "aggregate%head%4#0", @@ -22498,7 +22498,7 @@ "aggregate%head%4#0" ] }, - "2899": { + "2845": { "op": "dig 1", "stack_out": [ "box_prefixed_key%0#0", @@ -22507,7 +22507,7 @@ "aggregate%val_as_bytes%0#0 (copy)" ] }, - "2901": { + "2847": { "op": "concat", "defined_out": [ "aggregate%head%5#0", @@ -22520,7 +22520,7 @@ "aggregate%head%5#0" ] }, - "2902": { + "2848": { "op": "dig 1", "stack_out": [ "box_prefixed_key%0#0", @@ -22529,7 +22529,7 @@ "aggregate%val_as_bytes%0#0 (copy)" ] }, - "2904": { + "2850": { "op": "concat", "defined_out": [ "aggregate%head%6#0", @@ -22542,7 +22542,7 @@ "aggregate%head%6#0" ] }, - "2905": { + "2851": { "op": "dig 1", "stack_out": [ "box_prefixed_key%0#0", @@ -22551,7 +22551,7 @@ "aggregate%val_as_bytes%0#0 (copy)" ] }, - "2907": { + "2853": { "op": "concat", "defined_out": [ "aggregate%head%7#0", @@ -22564,7 +22564,7 @@ "aggregate%head%7#0" ] }, - "2908": { + "2854": { "op": "swap", "stack_out": [ "box_prefixed_key%0#0", @@ -22572,7 +22572,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "2909": { + "2855": { "op": "concat", "defined_out": [ "aggregate%head%8#0", @@ -22583,11 +22583,11 @@ "aggregate%head%8#0" ] }, - "2910": { + "2856": { "op": "box_put", "stack_out": [] }, - "2911": { + "2857": { "op": "global LatestTimestamp", "defined_out": [ "tmp%4#1" @@ -22596,7 +22596,7 @@ "tmp%4#1" ] }, - "2913": { + "2859": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%7#0" @@ -22605,7 +22605,7 @@ "aggregate%val_as_bytes%7#0" ] }, - "2914": { + "2860": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -22616,14 +22616,14 @@ "0x151f7c75" ] }, - "2915": { + "2861": { "op": "swap", "stack_out": [ "0x151f7c75", "aggregate%val_as_bytes%7#0" ] }, - "2916": { + "2862": { "op": "concat", "defined_out": [ "tmp%6#0" @@ -22632,11 +22632,11 @@ "tmp%6#0" ] }, - "2917": { + "2863": { "op": "log", "stack_out": [] }, - "2918": { + "2864": { "op": "intc_1 // 1", "defined_out": [ "1" @@ -22645,11 +22645,11 @@ "1" ] }, - "2919": { + "2865": { "op": "return", "stack_out": [] }, - "2920": { + "2866": { "subroutine": "modules.accounting.AccountingModule.account_update_payment_address[routing]", "params": {}, "block": "account_update_payment_address", @@ -22662,7 +22662,7 @@ "holding_address#0" ] }, - "2923": { + "2869": { "op": "dup", "defined_out": [ "holding_address#0", @@ -22673,7 +22673,7 @@ "holding_address#0 (copy)" ] }, - "2924": { + "2870": { "op": "len", "defined_out": [ "holding_address#0", @@ -22684,7 +22684,7 @@ "len%0#0" ] }, - "2925": { + "2871": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -22697,7 +22697,7 @@ "32" ] }, - "2926": { + "2872": { "op": "==", "defined_out": [ "eq%0#0", @@ -22708,14 +22708,14 @@ "eq%0#0" ] }, - "2927": { + "2873": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ "holding_address#0" ] }, - "2928": { + "2874": { "op": "txna ApplicationArgs 2", "defined_out": [ "holding_address#0", @@ -22726,7 +22726,7 @@ "tmp%2#0" ] }, - "2931": { + "2877": { "op": "dup", "defined_out": [ "holding_address#0", @@ -22739,7 +22739,7 @@ "tmp%2#0 (copy)" ] }, - "2932": { + "2878": { "op": "len", "defined_out": [ "holding_address#0", @@ -22752,7 +22752,7 @@ "len%1#0" ] }, - "2933": { + "2879": { "op": "intc_3 // 32", "stack_out": [ "holding_address#0", @@ -22761,7 +22761,7 @@ "32" ] }, - "2934": { + "2880": { "op": "==", "defined_out": [ "eq%1#0", @@ -22774,7 +22774,7 @@ "eq%1#0" ] }, - "2935": { + "2881": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ @@ -22782,29 +22782,29 @@ "tmp%2#0" ] }, - "2936": { - "op": "bytec 8 // 0x52234163636f756e7423", + "2882": { + "op": "bytec 8 // 0x4123", "defined_out": [ - "0x52234163636f756e7423", + "0x4123", "holding_address#0", "tmp%2#0" ], "stack_out": [ "holding_address#0", "tmp%2#0", - "0x52234163636f756e7423" + "0x4123" ] }, - "2938": { + "2884": { "op": "dig 2", "stack_out": [ "holding_address#0", "tmp%2#0", - "0x52234163636f756e7423", + "0x4123", "holding_address#0 (copy)" ] }, - "2940": { + "2886": { "op": "concat", "defined_out": [ "box_prefixed_key%0#1", @@ -22817,7 +22817,7 @@ "box_prefixed_key%0#1" ] }, - "2941": { + "2887": { "op": "dup", "defined_out": [ "box_prefixed_key%0#1", @@ -22832,7 +22832,7 @@ "box_prefixed_key%0#1 (copy)" ] }, - "2942": { + "2888": { "op": "box_len", "defined_out": [ "_%0#0", @@ -22849,7 +22849,7 @@ "maybe_exists%0#0" ] }, - "2943": { + "2889": { "op": "bury 1", "stack_out": [ "holding_address#0", @@ -22858,7 +22858,7 @@ "maybe_exists%0#0" ] }, - "2945": { + "2891": { "error": "Invalid account holding address", "op": "assert // Invalid account holding address", "stack_out": [ @@ -22867,7 +22867,7 @@ "box_prefixed_key%0#1" ] }, - "2946": { + "2892": { "op": "txn Sender", "defined_out": [ "box_prefixed_key%0#1", @@ -22882,7 +22882,7 @@ "tmp%0#1" ] }, - "2948": { + "2894": { "op": "uncover 3", "stack_out": [ "tmp%2#0", @@ -22891,7 +22891,7 @@ "holding_address#0" ] }, - "2950": { + "2896": { "op": "==", "defined_out": [ "box_prefixed_key%0#1", @@ -22904,7 +22904,7 @@ "tmp%1#1" ] }, - "2951": { + "2897": { "error": "Not authorized", "op": "assert // Not authorized", "stack_out": [ @@ -22912,15 +22912,15 @@ "box_prefixed_key%0#1" ] }, - "2952": { + "2898": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", "op": "callsub _assert_is_not_asset_defaulted" }, - "2955": { + "2901": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_suspended", "op": "callsub _assert_is_not_asset_suspended" }, - "2958": { + "2904": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -22933,7 +22933,7 @@ "0" ] }, - "2959": { + "2905": { "op": "uncover 2", "stack_out": [ "box_prefixed_key%0#1", @@ -22941,11 +22941,11 @@ "tmp%2#0" ] }, - "2961": { + "2907": { "op": "box_replace", "stack_out": [] }, - "2962": { + "2908": { "op": "global LatestTimestamp", "defined_out": [ "tmp%2#1" @@ -22954,7 +22954,7 @@ "tmp%2#1" ] }, - "2964": { + "2910": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0" @@ -22963,7 +22963,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "2965": { + "2911": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -22974,14 +22974,14 @@ "0x151f7c75" ] }, - "2966": { + "2912": { "op": "swap", "stack_out": [ "0x151f7c75", "aggregate%val_as_bytes%0#0" ] }, - "2967": { + "2913": { "op": "concat", "defined_out": [ "tmp%6#0" @@ -22990,11 +22990,11 @@ "tmp%6#0" ] }, - "2968": { + "2914": { "op": "log", "stack_out": [] }, - "2969": { + "2915": { "op": "intc_1 // 1", "defined_out": [ "1" @@ -23003,11 +23003,11 @@ "1" ] }, - "2970": { + "2916": { "op": "return", "stack_out": [] }, - "2971": { + "2917": { "subroutine": "modules.accounting.AccountingModule.account_get_position[routing]", "params": {}, "block": "account_get_position", @@ -23020,7 +23020,7 @@ "holding_address#0" ] }, - "2974": { + "2920": { "op": "dup", "defined_out": [ "holding_address#0", @@ -23031,7 +23031,7 @@ "holding_address#0 (copy)" ] }, - "2975": { + "2921": { "op": "len", "defined_out": [ "holding_address#0", @@ -23042,7 +23042,7 @@ "len%0#0" ] }, - "2976": { + "2922": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -23055,7 +23055,7 @@ "32" ] }, - "2977": { + "2923": { "op": "==", "defined_out": [ "eq%0#0", @@ -23066,32 +23066,32 @@ "eq%0#0" ] }, - "2978": { + "2924": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ "holding_address#0" ] }, - "2979": { - "op": "bytec 8 // 0x52234163636f756e7423", + "2925": { + "op": "bytec 8 // 0x4123", "defined_out": [ - "0x52234163636f756e7423", + "0x4123", "holding_address#0" ], "stack_out": [ "holding_address#0", - "0x52234163636f756e7423" + "0x4123" ] }, - "2981": { + "2927": { "op": "swap", "stack_out": [ - "0x52234163636f756e7423", + "0x4123", "holding_address#0" ] }, - "2982": { + "2928": { "op": "concat", "defined_out": [ "box_prefixed_key%0#1" @@ -23100,7 +23100,7 @@ "box_prefixed_key%0#1" ] }, - "2983": { + "2929": { "op": "dup", "defined_out": [ "box_prefixed_key%0#1", @@ -23111,7 +23111,7 @@ "box_prefixed_key%0#1 (copy)" ] }, - "2984": { + "2930": { "op": "box_len", "defined_out": [ "_%0#0", @@ -23124,21 +23124,21 @@ "maybe_exists%0#0" ] }, - "2985": { + "2931": { "op": "bury 1", "stack_out": [ "box_prefixed_key%0#1", "maybe_exists%0#0" ] }, - "2987": { + "2933": { "error": "Invalid account holding address", "op": "assert // Invalid account holding address", "stack_out": [ "box_prefixed_key%0#1" ] }, - "2988": { + "2934": { "op": "box_get", "defined_out": [ "aggregate%box_get%0#0", @@ -23149,13 +23149,13 @@ "aggregate%box_get%1#0" ] }, - "2989": { + "2935": { "op": "pop", "stack_out": [ "aggregate%box_get%0#0" ] }, - "2990": { + "2936": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -23166,14 +23166,14 @@ "0x151f7c75" ] }, - "2991": { + "2937": { "op": "swap", "stack_out": [ "0x151f7c75", "aggregate%box_get%0#0" ] }, - "2992": { + "2938": { "op": "concat", "defined_out": [ "tmp%3#0" @@ -23182,11 +23182,11 @@ "tmp%3#0" ] }, - "2993": { + "2939": { "op": "log", "stack_out": [] }, - "2994": { + "2940": { "op": "intc_1 // 1", "defined_out": [ "1" @@ -23195,11 +23195,11 @@ "1" ] }, - "2995": { + "2941": { "op": "return", "stack_out": [] }, - "2996": { + "2942": { "subroutine": "modules.actus_kernel.ActusKernelModule.contract_create[routing]", "params": {}, "block": "contract_create", @@ -23212,7 +23212,7 @@ "arranger#0" ] }, - "2999": { + "2945": { "op": "dup", "defined_out": [ "arranger#0", @@ -23223,7 +23223,7 @@ "arranger#0 (copy)" ] }, - "3000": { + "2946": { "op": "len", "defined_out": [ "arranger#0", @@ -23234,7 +23234,7 @@ "len%0#0" ] }, - "3001": { + "2947": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -23247,7 +23247,7 @@ "32" ] }, - "3002": { + "2948": { "op": "==", "defined_out": [ "arranger#0", @@ -23258,36 +23258,36 @@ "eq%0#0" ] }, - "3003": { + "2949": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ "arranger#0" ] }, - "3004": { - "op": "bytec 18 // 0x5223417272616e67657223", + "2950": { + "op": "bytec 18 // 0x523a41525223", "defined_out": [ - "0x5223417272616e67657223", + "0x523a41525223", "arranger#0" ], "stack_out": [ "arranger#0", - "0x5223417272616e67657223" + "0x523a41525223" ] }, - "3006": { + "2952": { "op": "swap", "stack_out": [ - "0x5223417272616e67657223", + "0x523a41525223", "arranger#0" ] }, - "3007": { + "2953": { "op": "app_global_put", "stack_out": [] }, - "3008": { + "2954": { "op": "global LatestTimestamp", "defined_out": [ "tmp%0#1" @@ -23296,7 +23296,7 @@ "tmp%0#1" ] }, - "3010": { + "2956": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0" @@ -23305,7 +23305,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "3011": { + "2957": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -23316,14 +23316,14 @@ "0x151f7c75" ] }, - "3012": { + "2958": { "op": "swap", "stack_out": [ "0x151f7c75", "aggregate%val_as_bytes%0#0" ] }, - "3013": { + "2959": { "op": "concat", "defined_out": [ "tmp%4#0" @@ -23332,11 +23332,11 @@ "tmp%4#0" ] }, - "3014": { + "2960": { "op": "log", "stack_out": [] }, - "3015": { + "2961": { "op": "intc_1 // 1", "defined_out": [ "1" @@ -23345,11 +23345,11 @@ "1" ] }, - "3016": { + "2962": { "op": "return", "stack_out": [] }, - "3017": { + "2963": { "subroutine": "modules.actus_kernel.ActusKernelModule.contract_config[routing]", "params": {}, "block": "contract_config", @@ -23359,17 +23359,17 @@ "day_count_convention#0" ] }, - "3019": { + "2965": { "op": "dup", "stack_out": [ "day_count_convention#0", "values%0#2" ] }, - "3020": { + "2966": { "op": "txna ApplicationArgs 1" }, - "3023": { + "2969": { "op": "dupn 2", "defined_out": [ "terms#0", @@ -23383,7 +23383,7 @@ "terms#0 (copy)" ] }, - "3025": { + "2971": { "op": "len", "defined_out": [ "len%0#0", @@ -23397,7 +23397,7 @@ "len%0#0" ] }, - "3026": { + "2972": { "op": "pushint 107", "defined_out": [ "107", @@ -23413,7 +23413,7 @@ "107" ] }, - "3028": { + "2974": { "op": "==", "defined_out": [ "eq%0#0", @@ -23427,7 +23427,7 @@ "eq%0#0" ] }, - "3029": { + "2975": { "error": "invalid number of bytes for smart_contracts.abi_types.NormalizedActusTerms", "op": "assert // invalid number of bytes for smart_contracts.abi_types.NormalizedActusTerms", "stack_out": [ @@ -23437,10 +23437,10 @@ "terms#0" ] }, - "3030": { + "2976": { "op": "txna ApplicationArgs 2" }, - "3033": { + "2979": { "op": "dup", "defined_out": [ "initial_state#0", @@ -23455,7 +23455,7 @@ "initial_state#0" ] }, - "3034": { + "2980": { "op": "cover 2", "defined_out": [ "initial_state#0", @@ -23470,7 +23470,7 @@ "initial_state#0" ] }, - "3036": { + "2982": { "op": "len", "defined_out": [ "initial_state#0", @@ -23486,7 +23486,7 @@ "len%1#0" ] }, - "3037": { + "2983": { "op": "pushint 72", "defined_out": [ "72", @@ -23504,7 +23504,7 @@ "72" ] }, - "3039": { + "2985": { "op": "==", "defined_out": [ "eq%1#0", @@ -23520,7 +23520,7 @@ "eq%1#0" ] }, - "3040": { + "2986": { "error": "invalid number of bytes for smart_contracts.abi_types.InitialKernelState", "op": "assert // invalid number of bytes for smart_contracts.abi_types.InitialKernelState", "stack_out": [ @@ -23531,10 +23531,10 @@ "terms#0" ] }, - "3041": { + "2987": { "op": "txna ApplicationArgs 3" }, - "3044": { + "2990": { "op": "dup", "defined_out": [ "initial_state#0", @@ -23551,7 +23551,7 @@ "prospectus#0" ] }, - "3045": { + "2991": { "op": "cover 2", "defined_out": [ "initial_state#0", @@ -23568,7 +23568,7 @@ "prospectus#0" ] }, - "3047": { + "2993": { "op": "dup", "defined_out": [ "initial_state#0", @@ -23587,7 +23587,7 @@ "prospectus#0 (copy)" ] }, - "3048": { + "2994": { "op": "len", "defined_out": [ "initial_state#0", @@ -23606,7 +23606,7 @@ "tuple_len%0#0" ] }, - "3049": { + "2995": { "op": "dig 1", "stack_out": [ "day_count_convention#0", @@ -23620,7 +23620,7 @@ "prospectus#0 (copy)" ] }, - "3051": { + "2997": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -23643,7 +23643,7 @@ "32" ] }, - "3052": { + "2998": { "error": "invalid tuple encoding", "op": "extract_uint16 // on error: invalid tuple encoding", "defined_out": [ @@ -23665,7 +23665,7 @@ "extract_uint16%0#0" ] }, - "3053": { + "2999": { "op": "dup", "defined_out": [ "extract_uint16%0#0", @@ -23688,7 +23688,7 @@ "extract_uint16%0#0 (copy)" ] }, - "3054": { + "3000": { "op": "pushint 34", "defined_out": [ "34", @@ -23713,7 +23713,7 @@ "34" ] }, - "3056": { + "3002": { "op": "==", "defined_out": [ "eq%2#0", @@ -23736,7 +23736,7 @@ "eq%2#0" ] }, - "3057": { + "3003": { "error": "invalid tail pointer at index 1 of (uint8[32],(len+utf8[]))", "op": "assert // invalid tail pointer at index 1 of (uint8[32],(len+utf8[]))", "stack_out": [ @@ -23751,7 +23751,7 @@ "extract_uint16%0#0" ] }, - "3058": { + "3004": { "op": "uncover 2", "stack_out": [ "day_count_convention#0", @@ -23765,7 +23765,7 @@ "prospectus#0" ] }, - "3060": { + "3006": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -23779,7 +23779,7 @@ "extract_uint16%0#0" ] }, - "3061": { + "3007": { "op": "dig 2", "defined_out": [ "extract_uint16%0#0", @@ -23802,7 +23802,7 @@ "tuple_len%0#0 (copy)" ] }, - "3063": { + "3009": { "op": "substring3", "defined_out": [ "initial_state#0", @@ -23822,7 +23822,7 @@ "substring3%0#0" ] }, - "3064": { + "3010": { "op": "dup", "stack_out": [ "day_count_convention#0", @@ -23836,7 +23836,7 @@ "substring3%0#0" ] }, - "3065": { + "3011": { "op": "cover 3", "defined_out": [ "initial_state#0", @@ -23857,7 +23857,7 @@ "substring3%0#0" ] }, - "3067": { + "3013": { "op": "intc_0 // 0", "stack_out": [ "day_count_convention#0", @@ -23872,7 +23872,7 @@ "0" ] }, - "3068": { + "3014": { "error": "invalid array length header", "op": "extract_uint16 // on error: invalid array length header", "defined_out": [ @@ -23895,7 +23895,7 @@ "aggregate%array_length%0#0" ] }, - "3069": { + "3015": { "op": "pushint 36", "defined_out": [ "36", @@ -23919,7 +23919,7 @@ "36" ] }, - "3071": { + "3017": { "op": "+", "defined_out": [ "add%1#0", @@ -23941,7 +23941,7 @@ "add%1#0" ] }, - "3072": { + "3018": { "op": "==", "defined_out": [ "eq%3#0", @@ -23961,7 +23961,7 @@ "eq%3#0" ] }, - "3073": { + "3019": { "error": "invalid number of bytes for smart_contracts.abi_types.Prospectus", "op": "assert // invalid number of bytes for smart_contracts.abi_types.Prospectus", "stack_out": [ @@ -23974,11 +23974,11 @@ "terms#0" ] }, - "3074": { + "3020": { "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", "op": "callsub _assert_caller_is_arranger" }, - "3077": { + "3023": { "op": "intc_0 // 0", "stack_out": [ "day_count_convention#0", @@ -23991,7 +23991,7 @@ "0" ] }, - "3078": { + "3024": { "op": "getbyte", "defined_out": [ "contract_type#0", @@ -24010,7 +24010,7 @@ "contract_type#0" ] }, - "3079": { + "3025": { "op": "dup", "defined_out": [ "contract_type#0", @@ -24030,7 +24030,7 @@ "contract_type#0" ] }, - "3080": { + "3026": { "op": "bytec 10 // \"contract_type\"", "defined_out": [ "\"contract_type\"", @@ -24052,7 +24052,7 @@ "\"contract_type\"" ] }, - "3082": { + "3028": { "op": "dig 1", "defined_out": [ "\"contract_type\"", @@ -24076,7 +24076,7 @@ "contract_type#0 (copy)" ] }, - "3084": { + "3030": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -24089,7 +24089,7 @@ "contract_type#0" ] }, - "3085": { + "3031": { "op": "bz contract_config_bool_true@7", "stack_out": [ "day_count_convention#0", @@ -24101,7 +24101,7 @@ "contract_type#0" ] }, - "3088": { + "3034": { "op": "dup", "stack_out": [ "day_count_convention#0", @@ -24114,7 +24114,7 @@ "contract_type#0" ] }, - "3089": { + "3035": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -24136,7 +24136,7 @@ "1" ] }, - "3090": { + "3036": { "op": "==", "defined_out": [ "contract_type#0", @@ -24157,7 +24157,7 @@ "tmp%1#2" ] }, - "3091": { + "3037": { "op": "bnz contract_config_bool_true@7", "stack_out": [ "day_count_convention#0", @@ -24169,7 +24169,7 @@ "contract_type#0" ] }, - "3094": { + "3040": { "op": "dup", "stack_out": [ "day_count_convention#0", @@ -24182,7 +24182,7 @@ "contract_type#0" ] }, - "3095": { + "3041": { "op": "pushint 2", "defined_out": [ "2", @@ -24204,7 +24204,7 @@ "2" ] }, - "3097": { + "3043": { "op": "==", "defined_out": [ "contract_type#0", @@ -24225,7 +24225,7 @@ "tmp%2#0" ] }, - "3098": { + "3044": { "op": "bnz contract_config_bool_true@7", "stack_out": [ "day_count_convention#0", @@ -24237,7 +24237,7 @@ "contract_type#0" ] }, - "3101": { + "3047": { "op": "dup", "stack_out": [ "day_count_convention#0", @@ -24250,7 +24250,7 @@ "contract_type#0" ] }, - "3102": { + "3048": { "op": "pushint 3", "stack_out": [ "day_count_convention#0", @@ -24264,7 +24264,7 @@ "3" ] }, - "3104": { + "3050": { "op": "==", "defined_out": [ "contract_type#0", @@ -24285,7 +24285,7 @@ "tmp%3#0" ] }, - "3105": { + "3051": { "op": "bnz contract_config_bool_true@7", "stack_out": [ "day_count_convention#0", @@ -24297,7 +24297,7 @@ "contract_type#0" ] }, - "3108": { + "3054": { "op": "dup", "stack_out": [ "day_count_convention#0", @@ -24310,7 +24310,7 @@ "contract_type#0" ] }, - "3109": { + "3055": { "op": "pushint 4", "defined_out": [ "4", @@ -24332,7 +24332,7 @@ "4" ] }, - "3111": { + "3057": { "op": "==", "defined_out": [ "contract_type#0", @@ -24353,7 +24353,7 @@ "tmp%4#1" ] }, - "3112": { + "3058": { "op": "bnz contract_config_bool_true@7", "stack_out": [ "day_count_convention#0", @@ -24365,7 +24365,7 @@ "contract_type#0" ] }, - "3115": { + "3061": { "op": "dup", "stack_out": [ "day_count_convention#0", @@ -24378,7 +24378,7 @@ "contract_type#0" ] }, - "3116": { + "3062": { "op": "pushint 5", "defined_out": [ "5", @@ -24400,7 +24400,7 @@ "5" ] }, - "3118": { + "3064": { "op": "==", "defined_out": [ "contract_type#0", @@ -24421,7 +24421,7 @@ "tmp%5#1" ] }, - "3119": { + "3065": { "op": "bz contract_config_bool_false@8", "stack_out": [ "day_count_convention#0", @@ -24433,7 +24433,7 @@ "contract_type#0" ] }, - "3122": { + "3068": { "block": "contract_config_bool_true@7", "stack_in": [ "day_count_convention#0", @@ -24459,7 +24459,7 @@ "or_result%0#0" ] }, - "3123": { + "3069": { "error": "Invalid ACTUS configuration", "block": "contract_config_bool_merge@9", "stack_in": [ @@ -24484,7 +24484,7 @@ "contract_type#0" ] }, - "3124": { + "3070": { "op": "intc_0 // 0", "defined_out": [ "0" @@ -24500,7 +24500,7 @@ "0" ] }, - "3125": { + "3071": { "op": "bytec 10 // \"contract_type\"", "defined_out": [ "\"contract_type\"", @@ -24518,7 +24518,7 @@ "\"contract_type\"" ] }, - "3127": { + "3073": { "op": "app_global_get_ex", "defined_out": [ "contract_type#0", @@ -24536,7 +24536,7 @@ "maybe_exists%1#0" ] }, - "3128": { + "3074": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -24550,7 +24550,7 @@ "contract_type#0" ] }, - "3129": { + "3075": { "op": "bury 2", "defined_out": [ "contract_type#0", @@ -24567,7 +24567,7 @@ "maybe_exists%1#0" ] }, - "3131": { + "3077": { "error": "check self.contract_type exists", "op": "assert // check self.contract_type exists", "stack_out": [ @@ -24580,7 +24580,7 @@ "contract_type#0" ] }, - "3132": { + "3078": { "op": "dig 4", "defined_out": [ "contract_type#0", @@ -24597,7 +24597,7 @@ "terms#0" ] }, - "3134": { + "3080": { "op": "dup", "defined_out": [ "contract_type#0", @@ -24616,7 +24616,7 @@ "terms#0 (copy)" ] }, - "3135": { + "3081": { "op": "pushint 33", "defined_out": [ "33", @@ -24637,7 +24637,7 @@ "33" ] }, - "3137": { + "3083": { "op": "extract_uint64", "defined_out": [ "contract_type#0", @@ -24656,7 +24656,7 @@ "values%0#2" ] }, - "3138": { + "3084": { "op": "dup", "stack_out": [ "day_count_convention#0", @@ -24671,7 +24671,7 @@ "values%0#2" ] }, - "3139": { + "3085": { "op": "bury 8", "defined_out": [ "contract_type#0", @@ -24690,7 +24690,7 @@ "values%0#2" ] }, - "3141": { + "3087": { "error": "Invalid ACTUS configuration", "op": "assert // Invalid ACTUS configuration", "stack_out": [ @@ -24704,7 +24704,7 @@ "terms#0" ] }, - "3142": { + "3088": { "op": "pushint 57", "defined_out": [ "57", @@ -24724,7 +24724,7 @@ "57" ] }, - "3144": { + "3090": { "op": "getbyte", "defined_out": [ "contract_type#0", @@ -24743,7 +24743,7 @@ "day_count_convention#0" ] }, - "3145": { + "3091": { "op": "dup", "stack_out": [ "day_count_convention#0", @@ -24757,7 +24757,7 @@ "day_count_convention#0" ] }, - "3146": { + "3092": { "op": "bury 8", "defined_out": [ "contract_type#0", @@ -24776,7 +24776,7 @@ "day_count_convention#0" ] }, - "3148": { + "3094": { "op": "bz contract_config_bool_true@16", "stack_out": [ "day_count_convention#0", @@ -24788,7 +24788,7 @@ "contract_type#0" ] }, - "3151": { + "3097": { "op": "dig 6", "stack_out": [ "day_count_convention#0", @@ -24801,7 +24801,7 @@ "day_count_convention#0" ] }, - "3153": { + "3099": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -24822,7 +24822,7 @@ "1" ] }, - "3154": { + "3100": { "op": "==", "defined_out": [ "contract_type#0", @@ -24842,7 +24842,7 @@ "tmp%1#2" ] }, - "3155": { + "3101": { "op": "bnz contract_config_bool_true@16", "stack_out": [ "day_count_convention#0", @@ -24854,7 +24854,7 @@ "contract_type#0" ] }, - "3158": { + "3104": { "op": "dig 6", "stack_out": [ "day_count_convention#0", @@ -24867,7 +24867,7 @@ "day_count_convention#0" ] }, - "3160": { + "3106": { "op": "pushint 2", "stack_out": [ "day_count_convention#0", @@ -24881,7 +24881,7 @@ "2" ] }, - "3162": { + "3108": { "op": "==", "defined_out": [ "contract_type#0", @@ -24901,7 +24901,7 @@ "tmp%2#0" ] }, - "3163": { + "3109": { "op": "bnz contract_config_bool_true@16", "stack_out": [ "day_count_convention#0", @@ -24913,7 +24913,7 @@ "contract_type#0" ] }, - "3166": { + "3112": { "op": "dig 6", "stack_out": [ "day_count_convention#0", @@ -24926,7 +24926,7 @@ "day_count_convention#0" ] }, - "3168": { + "3114": { "op": "pushint 3", "defined_out": [ "3", @@ -24947,7 +24947,7 @@ "3" ] }, - "3170": { + "3116": { "op": "==", "defined_out": [ "contract_type#0", @@ -24967,7 +24967,7 @@ "tmp%3#0" ] }, - "3171": { + "3117": { "op": "bnz contract_config_bool_true@16", "stack_out": [ "day_count_convention#0", @@ -24979,7 +24979,7 @@ "contract_type#0" ] }, - "3174": { + "3120": { "op": "dig 6", "stack_out": [ "day_count_convention#0", @@ -24992,7 +24992,7 @@ "day_count_convention#0" ] }, - "3176": { + "3122": { "op": "pushint 4", "defined_out": [ "4", @@ -25013,7 +25013,7 @@ "4" ] }, - "3178": { + "3124": { "op": "==", "defined_out": [ "contract_type#0", @@ -25033,7 +25033,7 @@ "tmp%4#1" ] }, - "3179": { + "3125": { "op": "bz contract_config_bool_false@17", "stack_out": [ "day_count_convention#0", @@ -25045,7 +25045,7 @@ "contract_type#0" ] }, - "3182": { + "3128": { "block": "contract_config_bool_true@16", "stack_in": [ "day_count_convention#0", @@ -25071,7 +25071,7 @@ "or_result%0#0" ] }, - "3183": { + "3129": { "error": "Invalid day-count convention ID", "block": "contract_config_bool_merge@18", "stack_in": [ @@ -25096,7 +25096,7 @@ "contract_type#0" ] }, - "3184": { + "3130": { "op": "dup", "defined_out": [ "contract_type#0" @@ -25112,7 +25112,7 @@ "contract_type#0" ] }, - "3185": { + "3131": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -25130,7 +25130,7 @@ "1" ] }, - "3186": { + "3132": { "op": "!=", "defined_out": [ "contract_type#0", @@ -25147,7 +25147,7 @@ "tmp%2#0" ] }, - "3187": { + "3133": { "op": "bz contract_config_after_if_else@20", "stack_out": [ "day_count_convention#0", @@ -25159,7 +25159,7 @@ "contract_type#0" ] }, - "3190": { + "3136": { "op": "dig 4", "defined_out": [ "contract_type#0", @@ -25176,7 +25176,7 @@ "terms#0" ] }, - "3192": { + "3138": { "op": "pushint 786", "defined_out": [ "786", @@ -25195,7 +25195,7 @@ "786" ] }, - "3195": { + "3141": { "op": "getbit", "defined_out": [ "aggregate%get_bit%0#0", @@ -25213,7 +25213,7 @@ "aggregate%get_bit%0#0" ] }, - "3196": { + "3142": { "op": "!", "defined_out": [ "contract_type#0", @@ -25231,7 +25231,7 @@ "tmp%3#0" ] }, - "3197": { + "3143": { "error": "Invalid ACTUS configuration", "op": "assert // Invalid ACTUS configuration", "stack_out": [ @@ -25244,7 +25244,7 @@ "contract_type#0" ] }, - "3198": { + "3144": { "block": "contract_config_after_if_else@20", "stack_in": [ "day_count_convention#0", @@ -25270,7 +25270,7 @@ "0" ] }, - "3199": { + "3145": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"", @@ -25288,7 +25288,7 @@ "\"status\"" ] }, - "3200": { + "3146": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#1", @@ -25306,7 +25306,7 @@ "maybe_exists%0#1" ] }, - "3201": { + "3147": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ @@ -25320,7 +25320,7 @@ "maybe_value%0#1" ] }, - "3202": { + "3148": { "op": "!", "defined_out": [ "tmp%0#2" @@ -25336,7 +25336,7 @@ "tmp%0#2" ] }, - "3203": { + "3149": { "error": "D-ASA already configured", "op": "assert // D-ASA already configured", "stack_out": [ @@ -25349,7 +25349,7 @@ "contract_type#0" ] }, - "3204": { + "3150": { "op": "intc_0 // 0", "stack_out": [ "day_count_convention#0", @@ -25362,7 +25362,7 @@ "0" ] }, - "3205": { + "3151": { "op": "bytec 20 // \"initial_exchange_amount\"", "defined_out": [ "\"initial_exchange_amount\"", @@ -25380,7 +25380,7 @@ "\"initial_exchange_amount\"" ] }, - "3207": { + "3153": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%1#0", @@ -25398,7 +25398,7 @@ "maybe_exists%1#0" ] }, - "3208": { + "3154": { "error": "check self.initial_exchange_amount exists", "op": "assert // check self.initial_exchange_amount exists", "stack_out": [ @@ -25412,7 +25412,7 @@ "maybe_value%1#1" ] }, - "3209": { + "3155": { "op": "!", "defined_out": [ "tmp%1#2" @@ -25428,7 +25428,7 @@ "tmp%1#2" ] }, - "3210": { + "3156": { "error": "D-ASA already configured", "op": "assert // D-ASA already configured", "stack_out": [ @@ -25441,7 +25441,7 @@ "contract_type#0" ] }, - "3211": { + "3157": { "op": "dig 4", "defined_out": [ "terms#0" @@ -25457,7 +25457,7 @@ "terms#0" ] }, - "3213": { + "3159": { "op": "dup", "defined_out": [ "terms#0", @@ -25475,7 +25475,7 @@ "terms#0 (copy)" ] }, - "3214": { + "3160": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -25495,7 +25495,7 @@ "1" ] }, - "3215": { + "3161": { "op": "extract_uint64", "defined_out": [ "denomination_asset_id#0", @@ -25513,7 +25513,7 @@ "denomination_asset_id#0" ] }, - "3216": { + "3162": { "op": "dup", "defined_out": [ "denomination_asset_id#0", @@ -25533,7 +25533,7 @@ "denomination_asset_id#0 (copy)" ] }, - "3217": { + "3163": { "op": "asset_params_get AssetCreator", "defined_out": [ "_creator#0", @@ -25555,7 +25555,7 @@ "exists#0" ] }, - "3219": { + "3165": { "op": "bury 1", "stack_out": [ "day_count_convention#0", @@ -25570,7 +25570,7 @@ "exists#0" ] }, - "3221": { + "3167": { "error": "Denomination asset is not properly set", "op": "assert // Denomination asset is not properly set", "stack_out": [ @@ -25585,7 +25585,7 @@ "denomination_asset_id#0" ] }, - "3222": { + "3168": { "op": "bytec 44 // \"denomination_asset_id\"", "defined_out": [ "\"denomination_asset_id\"", @@ -25605,7 +25605,7 @@ "\"denomination_asset_id\"" ] }, - "3224": { + "3170": { "op": "dig 1", "stack_out": [ "day_count_convention#0", @@ -25621,7 +25621,7 @@ "denomination_asset_id#0 (copy)" ] }, - "3226": { + "3172": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -25635,7 +25635,7 @@ "denomination_asset_id#0" ] }, - "3227": { + "3173": { "op": "dig 1", "stack_out": [ "day_count_convention#0", @@ -25650,7 +25650,7 @@ "terms#0 (copy)" ] }, - "3229": { + "3175": { "op": "pushint 9", "defined_out": [ "9", @@ -25672,7 +25672,7 @@ "9" ] }, - "3231": { + "3177": { "op": "extract_uint64", "defined_out": [ "denomination_asset_id#0", @@ -25692,7 +25692,7 @@ "settlement_asset_id#0" ] }, - "3232": { + "3178": { "op": "dup", "defined_out": [ "denomination_asset_id#0", @@ -25714,7 +25714,7 @@ "settlement_asset_id#0 (copy)" ] }, - "3233": { + "3179": { "op": "uncover 2", "stack_out": [ "day_count_convention#0", @@ -25730,7 +25730,7 @@ "denomination_asset_id#0" ] }, - "3235": { + "3181": { "op": "==", "stack_out": [ "day_count_convention#0", @@ -25745,7 +25745,7 @@ "tmp%0#2" ] }, - "3236": { + "3182": { "error": "Different settlement asset not supported, must be equal to denomination asset", "op": "assert // Different settlement asset not supported, must be equal to denomination asset", "stack_out": [ @@ -25760,7 +25760,7 @@ "settlement_asset_id#0" ] }, - "3237": { + "3183": { "op": "bytec 19 // \"settlement_asset_id\"", "defined_out": [ "\"settlement_asset_id\"", @@ -25780,7 +25780,7 @@ "\"settlement_asset_id\"" ] }, - "3239": { + "3185": { "op": "dig 1", "stack_out": [ "day_count_convention#0", @@ -25796,7 +25796,7 @@ "settlement_asset_id#0 (copy)" ] }, - "3241": { + "3187": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -25810,10 +25810,10 @@ "settlement_asset_id#0" ] }, - "3242": { + "3188": { "op": "itxn_begin" }, - "3243": { + "3189": { "op": "global MinTxnFee", "defined_out": [ "inner_txn_params%0%%param_Fee_idx_0#0", @@ -25833,7 +25833,7 @@ "inner_txn_params%0%%param_Fee_idx_0#0" ] }, - "3245": { + "3191": { "op": "global CurrentApplicationAddress", "defined_out": [ "inner_txn_params%0%%param_AssetReceiver_idx_0#0", @@ -25855,7 +25855,7 @@ "inner_txn_params%0%%param_AssetReceiver_idx_0#0" ] }, - "3247": { + "3193": { "op": "intc_0 // 0", "stack_out": [ "day_count_convention#0", @@ -25872,7 +25872,7 @@ "0" ] }, - "3248": { + "3194": { "op": "itxn_field AssetAmount", "stack_out": [ "day_count_convention#0", @@ -25888,7 +25888,7 @@ "inner_txn_params%0%%param_AssetReceiver_idx_0#0" ] }, - "3250": { + "3196": { "op": "itxn_field AssetReceiver", "stack_out": [ "day_count_convention#0", @@ -25903,7 +25903,7 @@ "inner_txn_params%0%%param_Fee_idx_0#0" ] }, - "3252": { + "3198": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -25918,7 +25918,7 @@ "settlement_asset_id#0" ] }, - "3253": { + "3199": { "op": "itxn_field XferAsset", "stack_out": [ "day_count_convention#0", @@ -25932,7 +25932,7 @@ "inner_txn_params%0%%param_Fee_idx_0#0" ] }, - "3255": { + "3201": { "op": "pushint 4 // axfer", "defined_out": [ "axfer", @@ -25952,7 +25952,7 @@ "axfer" ] }, - "3257": { + "3203": { "op": "itxn_field TypeEnum", "stack_out": [ "day_count_convention#0", @@ -25966,7 +25966,7 @@ "inner_txn_params%0%%param_Fee_idx_0#0" ] }, - "3259": { + "3205": { "op": "itxn_field Fee", "stack_out": [ "day_count_convention#0", @@ -25979,10 +25979,10 @@ "terms#0" ] }, - "3261": { + "3207": { "op": "itxn_submit" }, - "3262": { + "3208": { "op": "dup", "stack_out": [ "day_count_convention#0", @@ -25996,7 +25996,7 @@ "terms#0 (copy)" ] }, - "3263": { + "3209": { "op": "pushint 17", "defined_out": [ "17", @@ -26016,7 +26016,7 @@ "17" ] }, - "3265": { + "3211": { "op": "extract_uint64", "defined_out": [ "terms#0", @@ -26034,7 +26034,7 @@ "values%4#0" ] }, - "3266": { + "3212": { "op": "bytec 13 // \"total_units\"", "defined_out": [ "\"total_units\"", @@ -26054,7 +26054,7 @@ "\"total_units\"" ] }, - "3268": { + "3214": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -26069,7 +26069,7 @@ "values%4#0" ] }, - "3269": { + "3215": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -26082,7 +26082,7 @@ "terms#0" ] }, - "3270": { + "3216": { "op": "bytec 11 // \"reserved_units_total\"", "defined_out": [ "\"reserved_units_total\"", @@ -26100,7 +26100,7 @@ "\"reserved_units_total\"" ] }, - "3272": { + "3218": { "op": "intc_0 // 0", "stack_out": [ "day_count_convention#0", @@ -26115,7 +26115,7 @@ "0" ] }, - "3273": { + "3219": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -26128,7 +26128,7 @@ "terms#0" ] }, - "3274": { + "3220": { "op": "bytec 46 // \"day_count_convention\"", "defined_out": [ "\"day_count_convention\"", @@ -26146,7 +26146,7 @@ "\"day_count_convention\"" ] }, - "3276": { + "3222": { "op": "dig 8", "defined_out": [ "\"day_count_convention\"", @@ -26166,7 +26166,7 @@ "day_count_convention#0" ] }, - "3278": { + "3224": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -26179,7 +26179,7 @@ "terms#0" ] }, - "3279": { + "3225": { "op": "dup", "stack_out": [ "day_count_convention#0", @@ -26193,7 +26193,7 @@ "terms#0 (copy)" ] }, - "3280": { + "3226": { "op": "pushint 41", "defined_out": [ "41", @@ -26214,7 +26214,7 @@ "41" ] }, - "3282": { + "3228": { "op": "extract_uint64", "defined_out": [ "day_count_convention#0", @@ -26233,7 +26233,7 @@ "values%5#0" ] }, - "3283": { + "3229": { "op": "bytec 27 // \"initial_exchange_date\"", "defined_out": [ "\"initial_exchange_date\"", @@ -26254,7 +26254,7 @@ "\"initial_exchange_date\"" ] }, - "3285": { + "3231": { "op": "dig 1", "defined_out": [ "\"initial_exchange_date\"", @@ -26277,7 +26277,7 @@ "values%5#0 (copy)" ] }, - "3287": { + "3233": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -26291,7 +26291,7 @@ "values%5#0" ] }, - "3288": { + "3234": { "op": "dig 1", "stack_out": [ "day_count_convention#0", @@ -26306,7 +26306,7 @@ "terms#0 (copy)" ] }, - "3290": { + "3236": { "op": "pushint 49", "defined_out": [ "49", @@ -26329,7 +26329,7 @@ "49" ] }, - "3292": { + "3238": { "op": "extract_uint64", "defined_out": [ "day_count_convention#0", @@ -26350,7 +26350,7 @@ "values%6#0" ] }, - "3293": { + "3239": { "op": "bytec 45 // \"maturity_date\"", "defined_out": [ "\"maturity_date\"", @@ -26373,7 +26373,7 @@ "\"maturity_date\"" ] }, - "3295": { + "3241": { "op": "dig 1", "defined_out": [ "\"maturity_date\"", @@ -26398,7 +26398,7 @@ "values%6#0 (copy)" ] }, - "3297": { + "3243": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -26413,7 +26413,7 @@ "values%6#0" ] }, - "3298": { + "3244": { "op": "dig 6", "defined_out": [ "day_count_convention#0", @@ -26436,7 +26436,7 @@ "initial_state#0" ] }, - "3300": { + "3246": { "op": "dup", "defined_out": [ "day_count_convention#0", @@ -26461,7 +26461,7 @@ "initial_state#0 (copy)" ] }, - "3301": { + "3247": { "op": "cover 2", "stack_out": [ "day_count_convention#0", @@ -26478,7 +26478,7 @@ "initial_state#0 (copy)" ] }, - "3303": { + "3249": { "op": "pushint 48", "defined_out": [ "48", @@ -26505,7 +26505,7 @@ "48" ] }, - "3305": { + "3251": { "op": "extract_uint64", "defined_out": [ "day_count_convention#0", @@ -26530,7 +26530,7 @@ "values%7#0" ] }, - "3306": { + "3252": { "op": "bytec 14 // \"next_principal_redemption\"", "defined_out": [ "\"next_principal_redemption\"", @@ -26557,7 +26557,7 @@ "\"next_principal_redemption\"" ] }, - "3308": { + "3254": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -26575,7 +26575,7 @@ "values%7#0" ] }, - "3309": { + "3255": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -26591,7 +26591,7 @@ "values%6#0" ] }, - "3310": { + "3256": { "op": "bytec 20 // \"initial_exchange_amount\"", "stack_out": [ "day_count_convention#0", @@ -26608,7 +26608,7 @@ "\"initial_exchange_amount\"" ] }, - "3312": { + "3258": { "op": "dig 10", "defined_out": [ "\"initial_exchange_amount\"", @@ -26635,7 +26635,7 @@ "values%0#2" ] }, - "3314": { + "3260": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -26651,7 +26651,7 @@ "values%6#0" ] }, - "3315": { + "3261": { "op": "dig 3", "stack_out": [ "day_count_convention#0", @@ -26668,7 +26668,7 @@ "terms#0 (copy)" ] }, - "3317": { + "3263": { "op": "pushint 786", "defined_out": [ "786", @@ -26696,7 +26696,7 @@ "786" ] }, - "3320": { + "3266": { "op": "getbit", "defined_out": [ "aggregate%get_bit%1#0", @@ -26722,7 +26722,7 @@ "aggregate%get_bit%1#0" ] }, - "3321": { + "3267": { "op": "bytec 34 // \"dynamic_principal_redemption\"", "defined_out": [ "\"dynamic_principal_redemption\"", @@ -26750,7 +26750,7 @@ "\"dynamic_principal_redemption\"" ] }, - "3323": { + "3269": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -26768,7 +26768,7 @@ "aggregate%get_bit%1#0" ] }, - "3324": { + "3270": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -26784,7 +26784,7 @@ "values%6#0" ] }, - "3325": { + "3271": { "op": "dig 1", "stack_out": [ "day_count_convention#0", @@ -26801,7 +26801,7 @@ "initial_state#0 (copy)" ] }, - "3327": { + "3273": { "op": "pushint 16", "defined_out": [ "16", @@ -26829,7 +26829,7 @@ "16" ] }, - "3329": { + "3275": { "op": "extract_uint64", "defined_out": [ "day_count_convention#0", @@ -26855,7 +26855,7 @@ "values%10#0" ] }, - "3330": { + "3276": { "op": "bytec 4 // \"outstanding_principal\"", "defined_out": [ "\"outstanding_principal\"", @@ -26883,7 +26883,7 @@ "\"outstanding_principal\"" ] }, - "3332": { + "3278": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -26901,7 +26901,7 @@ "values%10#0" ] }, - "3333": { + "3279": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -26917,7 +26917,7 @@ "values%6#0" ] }, - "3334": { + "3280": { "op": "dig 1", "stack_out": [ "day_count_convention#0", @@ -26934,7 +26934,7 @@ "initial_state#0 (copy)" ] }, - "3336": { + "3282": { "op": "pushint 40", "defined_out": [ "40", @@ -26962,7 +26962,7 @@ "40" ] }, - "3338": { + "3284": { "op": "extract_uint64", "defined_out": [ "day_count_convention#0", @@ -26988,7 +26988,7 @@ "values%11#0" ] }, - "3339": { + "3285": { "op": "bytec 6 // \"accrued_interest\"", "defined_out": [ "\"accrued_interest\"", @@ -27016,7 +27016,7 @@ "\"accrued_interest\"" ] }, - "3341": { + "3287": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -27034,7 +27034,7 @@ "values%11#0" ] }, - "3342": { + "3288": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -27050,7 +27050,7 @@ "values%6#0" ] }, - "3343": { + "3289": { "op": "dig 1", "stack_out": [ "day_count_convention#0", @@ -27067,7 +27067,7 @@ "initial_state#0 (copy)" ] }, - "3345": { + "3291": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -27095,7 +27095,7 @@ "32" ] }, - "3346": { + "3292": { "op": "extract_uint64", "defined_out": [ "day_count_convention#0", @@ -27121,7 +27121,7 @@ "values%12#0" ] }, - "3347": { + "3293": { "op": "bytec 9 // \"nominal_interest_rate\"", "defined_out": [ "\"nominal_interest_rate\"", @@ -27149,7 +27149,7 @@ "\"nominal_interest_rate\"" ] }, - "3349": { + "3295": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -27167,7 +27167,7 @@ "values%12#0" ] }, - "3350": { + "3296": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -27183,7 +27183,7 @@ "values%6#0" ] }, - "3351": { + "3297": { "op": "dig 1", "stack_out": [ "day_count_convention#0", @@ -27200,7 +27200,7 @@ "initial_state#0 (copy)" ] }, - "3353": { + "3299": { "op": "pushint 24", "defined_out": [ "24", @@ -27228,7 +27228,7 @@ "24" ] }, - "3355": { + "3301": { "op": "extract_uint64", "defined_out": [ "day_count_convention#0", @@ -27254,7 +27254,7 @@ "values%13#0" ] }, - "3356": { + "3302": { "op": "bytec 7 // \"interest_calculation_base\"", "defined_out": [ "\"interest_calculation_base\"", @@ -27282,7 +27282,7 @@ "\"interest_calculation_base\"" ] }, - "3358": { + "3304": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -27300,7 +27300,7 @@ "values%13#0" ] }, - "3359": { + "3305": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -27316,7 +27316,7 @@ "values%6#0" ] }, - "3360": { + "3306": { "op": "dig 3", "stack_out": [ "day_count_convention#0", @@ -27333,7 +27333,7 @@ "terms#0 (copy)" ] }, - "3362": { + "3308": { "op": "pushint 58", "defined_out": [ "58", @@ -27361,7 +27361,7 @@ "58" ] }, - "3364": { + "3310": { "op": "extract_uint64", "defined_out": [ "day_count_convention#0", @@ -27387,7 +27387,7 @@ "values%14#0" ] }, - "3365": { + "3311": { "op": "bytec 35 // \"rate_reset_spread\"", "defined_out": [ "\"rate_reset_spread\"", @@ -27415,7 +27415,7 @@ "\"rate_reset_spread\"" ] }, - "3367": { + "3313": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -27433,7 +27433,7 @@ "values%14#0" ] }, - "3368": { + "3314": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -27449,7 +27449,7 @@ "values%6#0" ] }, - "3369": { + "3315": { "op": "dig 3", "stack_out": [ "day_count_convention#0", @@ -27466,7 +27466,7 @@ "terms#0 (copy)" ] }, - "3371": { + "3317": { "op": "pushint 66", "defined_out": [ "66", @@ -27494,7 +27494,7 @@ "66" ] }, - "3373": { + "3319": { "op": "extract_uint64", "defined_out": [ "day_count_convention#0", @@ -27520,7 +27520,7 @@ "values%15#0" ] }, - "3374": { + "3320": { "op": "bytec 36 // \"rate_reset_multiplier\"", "defined_out": [ "\"rate_reset_multiplier\"", @@ -27548,7 +27548,7 @@ "\"rate_reset_multiplier\"" ] }, - "3376": { + "3322": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -27566,7 +27566,7 @@ "values%15#0" ] }, - "3377": { + "3323": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -27582,7 +27582,7 @@ "values%6#0" ] }, - "3378": { + "3324": { "op": "dig 3", "stack_out": [ "day_count_convention#0", @@ -27599,7 +27599,7 @@ "terms#0 (copy)" ] }, - "3380": { + "3326": { "op": "pushint 74", "defined_out": [ "74", @@ -27627,7 +27627,7 @@ "74" ] }, - "3382": { + "3328": { "op": "extract_uint64", "defined_out": [ "day_count_convention#0", @@ -27653,7 +27653,7 @@ "values%16#0" ] }, - "3383": { + "3329": { "op": "bytec 30 // \"rate_reset_floor\"", "defined_out": [ "\"rate_reset_floor\"", @@ -27681,7 +27681,7 @@ "\"rate_reset_floor\"" ] }, - "3385": { + "3331": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -27699,7 +27699,7 @@ "values%16#0" ] }, - "3386": { + "3332": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -27715,7 +27715,7 @@ "values%6#0" ] }, - "3387": { + "3333": { "op": "dig 3", "stack_out": [ "day_count_convention#0", @@ -27732,7 +27732,7 @@ "terms#0 (copy)" ] }, - "3389": { + "3335": { "op": "pushint 82", "defined_out": [ "82", @@ -27760,7 +27760,7 @@ "82" ] }, - "3391": { + "3337": { "op": "extract_uint64", "defined_out": [ "day_count_convention#0", @@ -27786,7 +27786,7 @@ "values%17#0" ] }, - "3392": { + "3338": { "op": "bytec 31 // \"rate_reset_cap\"", "defined_out": [ "\"rate_reset_cap\"", @@ -27814,7 +27814,7 @@ "\"rate_reset_cap\"" ] }, - "3394": { + "3340": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -27832,7 +27832,7 @@ "values%17#0" ] }, - "3395": { + "3341": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -27848,7 +27848,7 @@ "values%6#0" ] }, - "3396": { + "3342": { "op": "dig 3", "stack_out": [ "day_count_convention#0", @@ -27865,7 +27865,7 @@ "terms#0 (copy)" ] }, - "3398": { + "3344": { "op": "pushint 90", "defined_out": [ "90", @@ -27893,7 +27893,7 @@ "90" ] }, - "3400": { + "3346": { "op": "extract_uint64", "defined_out": [ "day_count_convention#0", @@ -27919,7 +27919,7 @@ "values%18#0" ] }, - "3401": { + "3347": { "op": "bytec 37 // \"rate_reset_next\"", "defined_out": [ "\"rate_reset_next\"", @@ -27947,7 +27947,7 @@ "\"rate_reset_next\"" ] }, - "3403": { + "3349": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -27965,7 +27965,7 @@ "values%18#0" ] }, - "3404": { + "3350": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -27981,7 +27981,7 @@ "values%6#0" ] }, - "3405": { + "3351": { "op": "dig 3", "stack_out": [ "day_count_convention#0", @@ -27998,7 +27998,7 @@ "terms#0 (copy)" ] }, - "3407": { + "3353": { "op": "pushint 784", "defined_out": [ "784", @@ -28026,7 +28026,7 @@ "784" ] }, - "3410": { + "3356": { "op": "getbit", "defined_out": [ "aggregate%get_bit%2#0", @@ -28052,7 +28052,7 @@ "aggregate%get_bit%2#0" ] }, - "3411": { + "3357": { "op": "bytec 38 // \"has_rate_reset_floor\"", "defined_out": [ "\"has_rate_reset_floor\"", @@ -28080,7 +28080,7 @@ "\"has_rate_reset_floor\"" ] }, - "3413": { + "3359": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -28098,7 +28098,7 @@ "aggregate%get_bit%2#0" ] }, - "3414": { + "3360": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -28114,7 +28114,7 @@ "values%6#0" ] }, - "3415": { + "3361": { "op": "dig 3", "stack_out": [ "day_count_convention#0", @@ -28131,7 +28131,7 @@ "terms#0 (copy)" ] }, - "3417": { + "3363": { "op": "pushint 785", "defined_out": [ "785", @@ -28159,7 +28159,7 @@ "785" ] }, - "3420": { + "3366": { "op": "getbit", "defined_out": [ "aggregate%get_bit%3#0", @@ -28185,7 +28185,7 @@ "aggregate%get_bit%3#0" ] }, - "3421": { + "3367": { "op": "bytec 39 // \"has_rate_reset_cap\"", "defined_out": [ "\"has_rate_reset_cap\"", @@ -28213,7 +28213,7 @@ "\"has_rate_reset_cap\"" ] }, - "3423": { + "3369": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -28231,7 +28231,7 @@ "aggregate%get_bit%3#0" ] }, - "3424": { + "3370": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -28247,7 +28247,7 @@ "values%6#0" ] }, - "3425": { + "3371": { "op": "uncover 3", "stack_out": [ "day_count_convention#0", @@ -28263,7 +28263,7 @@ "terms#0" ] }, - "3427": { + "3373": { "op": "pushint 99", "defined_out": [ "99", @@ -28289,7 +28289,7 @@ "99" ] }, - "3429": { + "3375": { "op": "extract_uint64", "defined_out": [ "day_count_convention#0", @@ -28314,7 +28314,7 @@ "values%21#0" ] }, - "3430": { + "3376": { "op": "bytec 5 // \"fixed_point_scale\"", "defined_out": [ "\"fixed_point_scale\"", @@ -28341,7 +28341,7 @@ "\"fixed_point_scale\"" ] }, - "3432": { + "3378": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -28358,7 +28358,7 @@ "values%21#0" ] }, - "3433": { + "3379": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -28373,7 +28373,7 @@ "values%6#0" ] }, - "3434": { + "3380": { "op": "dig 1", "stack_out": [ "day_count_convention#0", @@ -28389,7 +28389,7 @@ "initial_state#0 (copy)" ] }, - "3436": { + "3382": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -28416,7 +28416,7 @@ "8" ] }, - "3437": { + "3383": { "op": "extract_uint64", "defined_out": [ "day_count_convention#0", @@ -28441,7 +28441,7 @@ "values%22#0" ] }, - "3438": { + "3384": { "op": "bytec_2 // \"event_cursor\"", "defined_out": [ "\"event_cursor\"", @@ -28468,7 +28468,7 @@ "\"event_cursor\"" ] }, - "3439": { + "3385": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -28485,7 +28485,7 @@ "values%22#0" ] }, - "3440": { + "3386": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -28500,7 +28500,7 @@ "values%6#0" ] }, - "3441": { + "3387": { "op": "dig 1", "stack_out": [ "day_count_convention#0", @@ -28516,7 +28516,7 @@ "initial_state#0 (copy)" ] }, - "3443": { + "3389": { "op": "pushint 56", "defined_out": [ "56", @@ -28543,7 +28543,7 @@ "56" ] }, - "3445": { + "3391": { "op": "extract_uint64", "defined_out": [ "day_count_convention#0", @@ -28568,7 +28568,7 @@ "values%23#0" ] }, - "3446": { + "3392": { "op": "bytec 16 // \"cumulative_interest_index\"", "defined_out": [ "\"cumulative_interest_index\"", @@ -28595,7 +28595,7 @@ "\"cumulative_interest_index\"" ] }, - "3448": { + "3394": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -28612,7 +28612,7 @@ "values%23#0" ] }, - "3449": { + "3395": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -28627,7 +28627,7 @@ "values%6#0" ] }, - "3450": { + "3396": { "op": "dig 1", "stack_out": [ "day_count_convention#0", @@ -28643,7 +28643,7 @@ "initial_state#0 (copy)" ] }, - "3452": { + "3398": { "op": "pushint 64", "defined_out": [ "64", @@ -28670,7 +28670,7 @@ "64" ] }, - "3454": { + "3400": { "op": "extract_uint64", "defined_out": [ "day_count_convention#0", @@ -28695,7 +28695,7 @@ "values%24#0" ] }, - "3455": { + "3401": { "op": "bytec 17 // \"cumulative_principal_index\"", "defined_out": [ "\"cumulative_principal_index\"", @@ -28722,7 +28722,7 @@ "\"cumulative_principal_index\"" ] }, - "3457": { + "3403": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -28739,7 +28739,7 @@ "values%24#0" ] }, - "3458": { + "3404": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -28754,7 +28754,7 @@ "values%6#0" ] }, - "3459": { + "3405": { "op": "bytec 15 // \"reserved_interest\"", "defined_out": [ "\"reserved_interest\"", @@ -28779,7 +28779,7 @@ "\"reserved_interest\"" ] }, - "3461": { + "3407": { "op": "intc_0 // 0", "stack_out": [ "day_count_convention#0", @@ -28796,7 +28796,7 @@ "0" ] }, - "3462": { + "3408": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -28811,7 +28811,7 @@ "values%6#0" ] }, - "3463": { + "3409": { "op": "bytec 12 // \"reserved_principal\"", "defined_out": [ "\"reserved_principal\"", @@ -28836,7 +28836,7 @@ "\"reserved_principal\"" ] }, - "3465": { + "3411": { "op": "intc_0 // 0", "stack_out": [ "day_count_convention#0", @@ -28853,7 +28853,7 @@ "0" ] }, - "3466": { + "3412": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -28868,7 +28868,7 @@ "values%6#0" ] }, - "3467": { + "3413": { "op": "dig 2", "stack_out": [ "day_count_convention#0", @@ -28884,7 +28884,7 @@ "values%5#0 (copy)" ] }, - "3469": { + "3415": { "op": "global LatestTimestamp", "defined_out": [ "day_count_convention#0", @@ -28911,7 +28911,7 @@ "tmp%3#1" ] }, - "3471": { + "3417": { "op": ">", "defined_out": [ "day_count_convention#0", @@ -28936,7 +28936,7 @@ "tmp%4#1" ] }, - "3472": { + "3418": { "error": "IED must be set in the future", "op": "assert // IED must be set in the future", "stack_out": [ @@ -28952,7 +28952,7 @@ "values%6#0" ] }, - "3473": { + "3419": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -28967,7 +28967,7 @@ "initial_state#0" ] }, - "3474": { + "3420": { "op": "intc_0 // 0", "stack_out": [ "day_count_convention#0", @@ -28983,7 +28983,7 @@ "0" ] }, - "3475": { + "3421": { "op": "extract_uint64", "defined_out": [ "day_count_convention#0", @@ -29007,7 +29007,7 @@ "values%27#0" ] }, - "3476": { + "3422": { "op": "dig 2", "stack_out": [ "day_count_convention#0", @@ -29023,7 +29023,7 @@ "values%5#0 (copy)" ] }, - "3478": { + "3424": { "op": "<", "defined_out": [ "day_count_convention#0", @@ -29047,7 +29047,7 @@ "tmp%5#1" ] }, - "3479": { + "3425": { "error": "IED must be set in the future", "op": "assert // IED must be set in the future", "stack_out": [ @@ -29062,7 +29062,7 @@ "values%6#0" ] }, - "3480": { + "3426": { "op": "<", "defined_out": [ "day_count_convention#0", @@ -29082,7 +29082,7 @@ "tmp%6#0" ] }, - "3481": { + "3427": { "error": "IED must be set in the future", "op": "assert // IED must be set in the future", "stack_out": [ @@ -29095,7 +29095,7 @@ "contract_type#0" ] }, - "3482": { + "3428": { "op": "dig 2", "defined_out": [ "day_count_convention#0", @@ -29115,7 +29115,7 @@ "prospectus#0" ] }, - "3484": { + "3430": { "op": "extract 0 32", "defined_out": [ "aggregate%extract%23#0", @@ -29136,7 +29136,7 @@ "aggregate%extract%23#0" ] }, - "3487": { + "3433": { "op": "bytec 42 // \"prospectus_hash\"", "defined_out": [ "\"prospectus_hash\"", @@ -29159,7 +29159,7 @@ "\"prospectus_hash\"" ] }, - "3489": { + "3435": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -29173,7 +29173,7 @@ "aggregate%extract%23#0" ] }, - "3490": { + "3436": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -29185,7 +29185,7 @@ "contract_type#0" ] }, - "3491": { + "3437": { "op": "dig 1", "defined_out": [ "day_count_convention#0", @@ -29206,7 +29206,7 @@ "substring3%0#0" ] }, - "3493": { + "3439": { "op": "extract 2 0", "defined_out": [ "day_count_convention#0", @@ -29228,7 +29228,7 @@ "values%1#0" ] }, - "3496": { + "3442": { "op": "bytec 43 // \"prospectus_url\"", "defined_out": [ "\"prospectus_url\"", @@ -29252,7 +29252,7 @@ "\"prospectus_url\"" ] }, - "3498": { + "3444": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -29266,7 +29266,7 @@ "values%1#0" ] }, - "3499": { + "3445": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -29278,7 +29278,7 @@ "contract_type#0" ] }, - "3500": { + "3446": { "op": "global LatestTimestamp", "defined_out": [ "day_count_convention#0", @@ -29300,7 +29300,7 @@ "tmp%1#1" ] }, - "3502": { + "3448": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0", @@ -29322,7 +29322,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "3503": { + "3449": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -29346,7 +29346,7 @@ "0x151f7c75" ] }, - "3504": { + "3450": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -29360,7 +29360,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "3505": { + "3451": { "op": "concat", "defined_out": [ "day_count_convention#0", @@ -29382,7 +29382,7 @@ "tmp%5#0" ] }, - "3506": { + "3452": { "op": "log", "stack_out": [ "day_count_convention#0", @@ -29394,7 +29394,7 @@ "contract_type#0" ] }, - "3507": { + "3453": { "op": "intc_1 // 1", "stack_out": [ "day_count_convention#0", @@ -29407,7 +29407,7 @@ "1" ] }, - "3508": { + "3454": { "op": "return", "stack_out": [ "day_count_convention#0", @@ -29419,7 +29419,7 @@ "contract_type#0" ] }, - "3509": { + "3455": { "block": "contract_config_bool_false@17", "stack_in": [ "day_count_convention#0", @@ -29445,10 +29445,10 @@ "or_result%0#0" ] }, - "3510": { + "3456": { "op": "b contract_config_bool_merge@18" }, - "3513": { + "3459": { "block": "contract_config_bool_false@8", "stack_in": [ "day_count_convention#0", @@ -29474,10 +29474,10 @@ "or_result%0#0" ] }, - "3514": { + "3460": { "op": "b contract_config_bool_merge@9" }, - "3517": { + "3463": { "subroutine": "modules.actus_kernel.ActusKernelModule.contract_schedule[routing]", "params": {}, "block": "contract_schedule", @@ -29487,14 +29487,14 @@ "aggregate%array_trimmed%0#0" ] }, - "3518": { + "3464": { "op": "pushbytes \"\"", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0" ] }, - "3520": { + "3466": { "op": "dupn 2", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -29503,7 +29503,7 @@ "values%1#0" ] }, - "3522": { + "3468": { "op": "txna ApplicationArgs 1", "defined_out": [ "tmp%0#0" @@ -29516,7 +29516,7 @@ "tmp%0#0" ] }, - "3525": { + "3471": { "op": "dup", "defined_out": [ "tmp%0#0", @@ -29531,7 +29531,7 @@ "tmp%0#0 (copy)" ] }, - "3526": { + "3472": { "op": "len", "defined_out": [ "len%0#0", @@ -29546,7 +29546,7 @@ "len%0#0" ] }, - "3527": { + "3473": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -29563,7 +29563,7 @@ "8" ] }, - "3528": { + "3474": { "op": "==", "defined_out": [ "eq%0#0", @@ -29578,7 +29578,7 @@ "eq%0#0" ] }, - "3529": { + "3475": { "error": "invalid number of bytes for arc4.uint64", "op": "assert // invalid number of bytes for arc4.uint64", "stack_out": [ @@ -29589,7 +29589,7 @@ "tmp%0#0" ] }, - "3530": { + "3476": { "op": "btoi", "defined_out": [ "schedule_page_index#0" @@ -29602,7 +29602,7 @@ "schedule_page_index#0" ] }, - "3531": { + "3477": { "op": "dup", "defined_out": [ "schedule_page_index#0" @@ -29616,7 +29616,7 @@ "schedule_page_index#0" ] }, - "3532": { + "3478": { "op": "txna ApplicationArgs 2", "defined_out": [ "schedule_page_index#0", @@ -29632,7 +29632,7 @@ "tmp%2#0" ] }, - "3535": { + "3481": { "op": "dup", "defined_out": [ "schedule_page_index#0", @@ -29650,7 +29650,7 @@ "tmp%2#0 (copy)" ] }, - "3536": { + "3482": { "op": "len", "defined_out": [ "len%1#0", @@ -29668,7 +29668,7 @@ "len%1#0" ] }, - "3537": { + "3483": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -29688,7 +29688,7 @@ "1" ] }, - "3538": { + "3484": { "op": "==", "defined_out": [ "eq%1#0", @@ -29706,7 +29706,7 @@ "eq%1#0" ] }, - "3539": { + "3485": { "error": "invalid number of bytes for arc4.bool", "op": "assert // invalid number of bytes for arc4.bool", "stack_out": [ @@ -29719,7 +29719,7 @@ "tmp%2#0" ] }, - "3540": { + "3486": { "op": "intc_0 // 0", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -29732,7 +29732,7 @@ "0" ] }, - "3541": { + "3487": { "op": "getbit", "defined_out": [ "is_last_page#0", @@ -29748,7 +29748,7 @@ "is_last_page#0" ] }, - "3542": { + "3488": { "op": "swap", "defined_out": [ "is_last_page#0", @@ -29764,10 +29764,10 @@ "schedule_page_index#0" ] }, - "3543": { + "3489": { "op": "txna ApplicationArgs 3" }, - "3546": { + "3492": { "op": "dup", "defined_out": [ "is_last_page#0", @@ -29786,7 +29786,7 @@ "schedule_page#0" ] }, - "3547": { + "3493": { "op": "cover 2", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -29800,7 +29800,7 @@ "schedule_page#0" ] }, - "3549": { + "3495": { "op": "dup", "defined_out": [ "is_last_page#0", @@ -29821,7 +29821,7 @@ "schedule_page#0 (copy)" ] }, - "3550": { + "3496": { "op": "intc_0 // 0", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -29837,7 +29837,7 @@ "0" ] }, - "3551": { + "3497": { "error": "invalid array length header", "op": "extract_uint16 // on error: invalid array length header", "defined_out": [ @@ -29859,7 +29859,7 @@ "page_length#0" ] }, - "3552": { + "3498": { "op": "dup", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -29875,7 +29875,7 @@ "page_length#0" ] }, - "3553": { + "3499": { "op": "cover 3", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -29891,7 +29891,7 @@ "page_length#0" ] }, - "3555": { + "3501": { "op": "dup", "defined_out": [ "is_last_page#0", @@ -29915,7 +29915,7 @@ "page_length#0 (copy)" ] }, - "3556": { + "3502": { "op": "pushint 65", "defined_out": [ "65", @@ -29941,7 +29941,7 @@ "65" ] }, - "3558": { + "3504": { "op": "*", "defined_out": [ "is_last_page#0", @@ -29965,7 +29965,7 @@ "mul%0#0" ] }, - "3559": { + "3505": { "op": "pushint 2", "defined_out": [ "2", @@ -29991,7 +29991,7 @@ "2" ] }, - "3561": { + "3507": { "op": "+", "defined_out": [ "add%0#0", @@ -30015,7 +30015,7 @@ "add%0#0" ] }, - "3562": { + "3508": { "op": "uncover 2", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -30032,7 +30032,7 @@ "schedule_page#0" ] }, - "3564": { + "3510": { "op": "len", "defined_out": [ "add%0#0", @@ -30057,7 +30057,7 @@ "len%2#0" ] }, - "3565": { + "3511": { "op": "==", "defined_out": [ "eq%2#0", @@ -30080,7 +30080,7 @@ "eq%2#0" ] }, - "3566": { + "3512": { "error": "invalid number of bytes for arc4.dynamic_array", "op": "assert // invalid number of bytes for arc4.dynamic_array", "stack_out": [ @@ -30096,11 +30096,11 @@ "page_length#0" ] }, - "3567": { + "3513": { "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", "op": "callsub _assert_caller_is_arranger" }, - "3570": { + "3516": { "op": "intc_0 // 0", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -30116,7 +30116,7 @@ "0" ] }, - "3571": { + "3517": { "op": "bytec 10 // \"contract_type\"", "defined_out": [ "\"contract_type\"", @@ -30141,7 +30141,7 @@ "\"contract_type\"" ] }, - "3573": { + "3519": { "op": "app_global_get_ex", "defined_out": [ "contract_type#0", @@ -30166,7 +30166,7 @@ "maybe_exists%0#0" ] }, - "3574": { + "3520": { "op": "swap", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -30183,7 +30183,7 @@ "contract_type#0" ] }, - "3575": { + "3521": { "op": "cover 3", "defined_out": [ "contract_type#0", @@ -30208,7 +30208,7 @@ "maybe_exists%0#0" ] }, - "3577": { + "3523": { "error": "check self.contract_type exists", "op": "assert // check self.contract_type exists", "stack_out": [ @@ -30225,7 +30225,7 @@ "page_length#0" ] }, - "3578": { + "3524": { "op": "intc_0 // 0", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -30242,7 +30242,7 @@ "0" ] }, - "3579": { + "3525": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"", @@ -30269,7 +30269,7 @@ "\"status\"" ] }, - "3580": { + "3526": { "op": "app_global_get_ex", "defined_out": [ "contract_type#0", @@ -30296,7 +30296,7 @@ "maybe_exists%0#0" ] }, - "3581": { + "3527": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ @@ -30314,7 +30314,7 @@ "maybe_value%0#1" ] }, - "3582": { + "3528": { "op": "!", "defined_out": [ "contract_type#0", @@ -30339,7 +30339,7 @@ "tmp%0#2" ] }, - "3583": { + "3529": { "error": "D-ASA already configured", "op": "assert // D-ASA already configured", "stack_out": [ @@ -30356,7 +30356,7 @@ "page_length#0" ] }, - "3584": { + "3530": { "op": "dup", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -30373,7 +30373,7 @@ "page_length#0 (copy)" ] }, - "3585": { + "3531": { "op": "pushint 16", "defined_out": [ "16", @@ -30400,7 +30400,7 @@ "16" ] }, - "3587": { + "3533": { "op": "<=", "defined_out": [ "contract_type#0", @@ -30425,7 +30425,7 @@ "tmp%2#1" ] }, - "3588": { + "3534": { "error": "Invalid schedule page", "op": "assert // Invalid schedule page", "stack_out": [ @@ -30442,7 +30442,7 @@ "page_length#0" ] }, - "3589": { + "3535": { "op": "intc_0 // 0", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -30459,7 +30459,7 @@ "0" ] }, - "3590": { + "3536": { "op": "bytec 20 // \"initial_exchange_amount\"", "defined_out": [ "\"initial_exchange_amount\"", @@ -30486,7 +30486,7 @@ "\"initial_exchange_amount\"" ] }, - "3592": { + "3538": { "op": "app_global_get_ex", "defined_out": [ "contract_type#0", @@ -30513,7 +30513,7 @@ "maybe_exists%1#0" ] }, - "3593": { + "3539": { "error": "check self.initial_exchange_amount exists", "op": "assert // check self.initial_exchange_amount exists", "stack_out": [ @@ -30531,7 +30531,7 @@ "maybe_value%1#0" ] }, - "3594": { + "3540": { "error": "D-ASA terms not configured", "op": "assert // D-ASA terms not configured", "stack_out": [ @@ -30548,7 +30548,7 @@ "page_length#0" ] }, - "3595": { + "3541": { "op": "swap", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -30564,7 +30564,7 @@ "schedule_page_index#0" ] }, - "3596": { + "3542": { "op": "pushint 16", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -30581,7 +30581,7 @@ "16" ] }, - "3598": { + "3544": { "op": "*", "defined_out": [ "contract_type#0", @@ -30605,7 +30605,7 @@ "page_cursor#0" ] }, - "3599": { + "3545": { "op": "swap", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -30621,7 +30621,7 @@ "page_length#0" ] }, - "3600": { + "3546": { "op": "pushint 100", "defined_out": [ "100", @@ -30647,7 +30647,7 @@ "100" ] }, - "3602": { + "3548": { "op": "*", "defined_out": [ "contract_type#0", @@ -30672,7 +30672,7 @@ "tmp%6#1" ] }, - "3603": { + "3549": { "op": "intc 4 // 1500", "defined_out": [ "1500", @@ -30699,7 +30699,7 @@ "1500" ] }, - "3605": { + "3551": { "op": "+", "defined_out": [ "contract_type#0", @@ -30724,7 +30724,7 @@ "tmp%7#1" ] }, - "3606": { + "3552": { "op": "intc_0 // 0", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -30741,7 +30741,7 @@ "0" ] }, - "3607": { + "3553": { "callsub": "_puya_lib.util.ensure_budget", "op": "callsub ensure_budget", "stack_out": [ @@ -30757,7 +30757,7 @@ "page_cursor#0" ] }, - "3610": { + "3556": { "op": "intc_0 // 0", "defined_out": [ "contract_type#0", @@ -30782,7 +30782,7 @@ "index#0" ] }, - "3611": { + "3557": { "block": "contract_schedule_while_top@2", "stack_in": [ "aggregate%array_trimmed%0#0", @@ -30816,7 +30816,7 @@ "index#0" ] }, - "3612": { + "3558": { "op": "dig 4", "defined_out": [ "index#0", @@ -30838,7 +30838,7 @@ "page_length#0" ] }, - "3614": { + "3560": { "op": "<", "defined_out": [ "index#0", @@ -30860,7 +30860,7 @@ "tmp%8#0" ] }, - "3615": { + "3561": { "op": "bz contract_schedule_after_while@11", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -30876,7 +30876,7 @@ "index#0" ] }, - "3618": { + "3564": { "op": "dig 4", "defined_out": [ "index#0", @@ -30898,7 +30898,7 @@ "schedule_page#0" ] }, - "3620": { + "3566": { "op": "extract 2 0", "defined_out": [ "aggregate%array_trimmed%0#0", @@ -30921,7 +30921,7 @@ "aggregate%array_trimmed%0#0" ] }, - "3623": { + "3569": { "op": "dup", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -30939,7 +30939,7 @@ "aggregate%array_trimmed%0#0" ] }, - "3624": { + "3570": { "op": "bury 12", "defined_out": [ "aggregate%array_trimmed%0#0", @@ -30962,7 +30962,7 @@ "aggregate%array_trimmed%0#0" ] }, - "3626": { + "3572": { "op": "dig 1", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -30980,7 +30980,7 @@ "index#0" ] }, - "3628": { + "3574": { "op": "dup", "defined_out": [ "aggregate%array_trimmed%0#0", @@ -31006,7 +31006,7 @@ "index#0 (copy)" ] }, - "3629": { + "3575": { "op": "cover 2", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -31025,7 +31025,7 @@ "index#0 (copy)" ] }, - "3631": { + "3577": { "op": "pushint 65", "defined_out": [ "65", @@ -31053,7 +31053,7 @@ "65" ] }, - "3633": { + "3579": { "op": "*", "defined_out": [ "aggregate%array_trimmed%0#0", @@ -31079,7 +31079,7 @@ "aggregate%bytes_offset%0#0" ] }, - "3634": { + "3580": { "op": "pushint 65", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -31099,7 +31099,7 @@ "65" ] }, - "3636": { + "3582": { "error": "index access is out of bounds", "op": "extract3 // on error: index access is out of bounds", "defined_out": [ @@ -31125,7 +31125,7 @@ "aggregate%encoded_element%0#0" ] }, - "3637": { + "3583": { "op": "dup", "defined_out": [ "aggregate%array_trimmed%0#0", @@ -31152,7 +31152,7 @@ "aggregate%encoded_element%0#0 (copy)" ] }, - "3638": { + "3584": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -31181,7 +31181,7 @@ "8" ] }, - "3639": { + "3585": { "op": "getbyte", "defined_out": [ "aggregate%array_trimmed%0#0", @@ -31208,7 +31208,7 @@ "entry_event_type#0" ] }, - "3640": { + "3586": { "op": "dup", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -31228,7 +31228,7 @@ "entry_event_type#0 (copy)" ] }, - "3641": { + "3587": { "op": "cover 2", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -31248,7 +31248,7 @@ "entry_event_type#0" ] }, - "3643": { + "3589": { "op": "bury 13", "defined_out": [ "aggregate%array_trimmed%0#0", @@ -31275,7 +31275,7 @@ "aggregate%encoded_element%0#0" ] }, - "3645": { + "3591": { "op": "dup", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -31295,7 +31295,7 @@ "aggregate%encoded_element%0#0 (copy)" ] }, - "3646": { + "3592": { "op": "intc_0 // 0", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -31316,7 +31316,7 @@ "0" ] }, - "3647": { + "3593": { "op": "extract_uint64", "defined_out": [ "aggregate%array_trimmed%0#0", @@ -31345,7 +31345,7 @@ "values%0#0" ] }, - "3648": { + "3594": { "op": "dup", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -31366,7 +31366,7 @@ "values%0#0" ] }, - "3649": { + "3595": { "op": "bury 13", "defined_out": [ "aggregate%array_trimmed%0#0", @@ -31395,7 +31395,7 @@ "values%0#0" ] }, - "3651": { + "3597": { "op": "dig 5", "defined_out": [ "aggregate%array_trimmed%0#0", @@ -31426,7 +31426,7 @@ "page_cursor#0" ] }, - "3653": { + "3599": { "op": "uncover 4", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -31447,7 +31447,7 @@ "index#0" ] }, - "3655": { + "3601": { "op": "+", "defined_out": [ "aggregate%array_trimmed%0#0", @@ -31478,7 +31478,7 @@ "tmp%10#0" ] }, - "3656": { + "3602": { "op": "dig 1", "defined_out": [ "aggregate%array_trimmed%0#0", @@ -31511,7 +31511,7 @@ "values%0#0 (copy)" ] }, - "3658": { + "3604": { "op": "==", "defined_out": [ "aggregate%array_trimmed%0#0", @@ -31542,7 +31542,7 @@ "tmp%11#0" ] }, - "3659": { + "3605": { "error": "Invalid event id", "op": "assert // Invalid event id", "stack_out": [ @@ -31562,7 +31562,7 @@ "values%0#0" ] }, - "3660": { + "3606": { "op": "dig 5", "defined_out": [ "aggregate%array_trimmed%0#0", @@ -31593,7 +31593,7 @@ "contract_type#0" ] }, - "3662": { + "3608": { "op": "uncover 3", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -31613,7 +31613,7 @@ "entry_event_type#0" ] }, - "3664": { + "3610": { "callsub": "modules.actus_kernel.ActusKernelModule._assert_event_allowed_for_contract_type", "op": "callsub _assert_event_allowed_for_contract_type", "stack_out": [ @@ -31632,7 +31632,7 @@ "values%0#0" ] }, - "3667": { + "3613": { "op": "swap", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -31650,7 +31650,7 @@ "aggregate%encoded_element%0#0" ] }, - "3668": { + "3614": { "op": "pushint 9", "defined_out": [ "9", @@ -31681,7 +31681,7 @@ "9" ] }, - "3670": { + "3616": { "op": "extract_uint64", "defined_out": [ "aggregate%array_trimmed%0#0", @@ -31710,7 +31710,7 @@ "values%1#0" ] }, - "3671": { + "3617": { "op": "dup", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -31729,7 +31729,7 @@ "values%1#0" ] }, - "3672": { + "3618": { "op": "bury 10", "defined_out": [ "aggregate%array_trimmed%0#0", @@ -31758,7 +31758,7 @@ "values%1#0" ] }, - "3674": { + "3620": { "error": "Invalid ACTUS configuration", "op": "assert // Invalid ACTUS configuration", "stack_out": [ @@ -31776,7 +31776,7 @@ "values%0#0" ] }, - "3675": { + "3621": { "op": "bz contract_schedule_after_if_else@8", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -31792,7 +31792,7 @@ "index#0" ] }, - "3678": { + "3624": { "op": "dup", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -31809,7 +31809,7 @@ "index#0" ] }, - "3679": { + "3625": { "op": "bz contract_schedule_else_body@6", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -31825,7 +31825,7 @@ "index#0" ] }, - "3682": { + "3628": { "op": "dup", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -31842,7 +31842,7 @@ "index#0" ] }, - "3683": { + "3629": { "op": "intc_1 // 1", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -31860,7 +31860,7 @@ "1" ] }, - "3684": { + "3630": { "op": "-", "defined_out": [ "aggregate%array_trimmed%0#0", @@ -31889,7 +31889,7 @@ "tmp%15#0" ] }, - "3685": { + "3631": { "op": "pushint 65", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -31907,7 +31907,7 @@ "65" ] }, - "3687": { + "3633": { "op": "*", "defined_out": [ "aggregate%array_trimmed%0#0", @@ -31936,7 +31936,7 @@ "aggregate%bytes_offset%3#0" ] }, - "3688": { + "3634": { "op": "dig 11", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -31954,7 +31954,7 @@ "aggregate%array_trimmed%0#0" ] }, - "3690": { + "3636": { "op": "swap", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -31972,7 +31972,7 @@ "aggregate%bytes_offset%3#0" ] }, - "3691": { + "3637": { "op": "pushint 65", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -31991,7 +31991,7 @@ "65" ] }, - "3693": { + "3639": { "error": "index access is out of bounds", "op": "extract3 // on error: index access is out of bounds", "defined_out": [ @@ -32021,7 +32021,7 @@ "previous_entry#0" ] }, - "3694": { + "3640": { "block": "contract_schedule_after_if_else@7", "stack_in": [ "aggregate%array_trimmed%0#0", @@ -32058,7 +32058,7 @@ "9" ] }, - "3696": { + "3642": { "op": "extract_uint64", "defined_out": [ "values%3#0" @@ -32078,7 +32078,7 @@ "values%3#0" ] }, - "3697": { + "3643": { "op": "dig 8", "defined_out": [ "values%1#0", @@ -32100,7 +32100,7 @@ "values%1#0" ] }, - "3699": { + "3645": { "op": "<=", "defined_out": [ "tmp%22#0", @@ -32121,7 +32121,7 @@ "tmp%22#0" ] }, - "3700": { + "3646": { "error": "Time events must be sorted in strictly ascending order", "op": "assert // Time events must be sorted in strictly ascending order", "stack_out": [ @@ -32138,7 +32138,7 @@ "index#0" ] }, - "3701": { + "3647": { "block": "contract_schedule_after_if_else@8", "stack_in": [ "aggregate%array_trimmed%0#0", @@ -32172,7 +32172,7 @@ "values%0#0" ] }, - "3703": { + "3649": { "op": "bnz contract_schedule_after_if_else@10", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -32188,7 +32188,7 @@ "index#0" ] }, - "3706": { + "3652": { "op": "dig 9", "defined_out": [ "entry_event_type#0", @@ -32209,7 +32209,7 @@ "entry_event_type#0" ] }, - "3708": { + "3654": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -32232,7 +32232,7 @@ "1" ] }, - "3709": { + "3655": { "op": "==", "defined_out": [ "entry_event_type#0", @@ -32254,7 +32254,7 @@ "tmp%24#0" ] }, - "3710": { + "3656": { "error": "Invalid ACTUS configuration", "op": "assert // Invalid ACTUS configuration", "stack_out": [ @@ -32271,7 +32271,7 @@ "index#0" ] }, - "3711": { + "3657": { "block": "contract_schedule_after_if_else@10", "stack_in": [ "aggregate%array_trimmed%0#0", @@ -32305,7 +32305,7 @@ "index#0" ] }, - "3712": { + "3658": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -32327,7 +32327,7 @@ "1" ] }, - "3713": { + "3659": { "op": "+", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -32344,7 +32344,7 @@ "index#0" ] }, - "3714": { + "3660": { "op": "bury 1", "defined_out": [ "index#0" @@ -32363,10 +32363,10 @@ "index#0" ] }, - "3716": { + "3662": { "op": "b contract_schedule_while_top@2" }, - "3719": { + "3665": { "block": "contract_schedule_else_body@6", "stack_in": [ "aggregate%array_trimmed%0#0", @@ -32400,7 +32400,7 @@ "schedule_page_index#0" ] }, - "3721": { + "3667": { "op": "dup", "defined_out": [ "schedule_page_index#0", @@ -32422,7 +32422,7 @@ "schedule_page_index#0 (copy)" ] }, - "3722": { + "3668": { "error": "Invalid event id", "op": "assert // Invalid event id", "stack_out": [ @@ -32440,7 +32440,7 @@ "schedule_page_index#0" ] }, - "3723": { + "3669": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -32462,7 +32462,7 @@ "1" ] }, - "3724": { + "3670": { "op": "-", "defined_out": [ "previous_page_index#0", @@ -32483,7 +32483,7 @@ "previous_page_index#0" ] }, - "3725": { + "3671": { "op": "itob", "defined_out": [ "encoded_value%0#0", @@ -32504,7 +32504,7 @@ "encoded_value%0#0" ] }, - "3726": { + "3672": { "op": "bytec 24 // 0x5323", "defined_out": [ "0x5323", @@ -32527,7 +32527,7 @@ "0x5323" ] }, - "3728": { + "3674": { "op": "swap", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -32545,7 +32545,7 @@ "encoded_value%0#0" ] }, - "3729": { + "3675": { "op": "concat", "defined_out": [ "box_prefixed_key%0#0", @@ -32566,7 +32566,7 @@ "box_prefixed_key%0#0" ] }, - "3730": { + "3676": { "op": "dup", "defined_out": [ "box_prefixed_key%0#0", @@ -32589,7 +32589,7 @@ "box_prefixed_key%0#0 (copy)" ] }, - "3731": { + "3677": { "op": "box_len", "defined_out": [ "_%0#0", @@ -32614,7 +32614,7 @@ "maybe_exists%2#0" ] }, - "3732": { + "3678": { "op": "bury 1", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -32632,7 +32632,7 @@ "maybe_exists%2#0" ] }, - "3734": { + "3680": { "error": "Invalid schedule page", "op": "assert // Invalid schedule page", "stack_out": [ @@ -32650,7 +32650,7 @@ "box_prefixed_key%0#0" ] }, - "3735": { + "3681": { "op": "dup", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -32668,7 +32668,7 @@ "box_prefixed_key%0#0 (copy)" ] }, - "3736": { + "3682": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -32693,7 +32693,7 @@ "0" ] }, - "3737": { + "3683": { "op": "pushint 2", "defined_out": [ "0", @@ -32720,7 +32720,7 @@ "2" ] }, - "3739": { + "3685": { "op": "box_extract", "defined_out": [ "box%box_extract%0#0", @@ -32743,7 +32743,7 @@ "box%box_extract%0#0" ] }, - "3740": { + "3686": { "op": "btoi", "defined_out": [ "box%array_length%0#0", @@ -32766,7 +32766,7 @@ "box%array_length%0#0" ] }, - "3741": { + "3687": { "op": "dup", "defined_out": [ "box%array_length%0#0", @@ -32791,7 +32791,7 @@ "box%array_length%0#0 (copy)" ] }, - "3742": { + "3688": { "error": "Invalid schedule page", "op": "assert // Invalid schedule page", "stack_out": [ @@ -32810,7 +32810,7 @@ "box%array_length%0#0" ] }, - "3743": { + "3689": { "op": "intc_1 // 1", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -32829,7 +32829,7 @@ "1" ] }, - "3744": { + "3690": { "op": "-", "defined_out": [ "box_prefixed_key%0#0", @@ -32852,7 +32852,7 @@ "tmp%21#0" ] }, - "3745": { + "3691": { "op": "pushint 65", "defined_out": [ "65", @@ -32877,7 +32877,7 @@ "65" ] }, - "3747": { + "3693": { "op": "*", "defined_out": [ "box%element_offset%0#0", @@ -32900,7 +32900,7 @@ "box%element_offset%0#0" ] }, - "3748": { + "3694": { "op": "pushint 2", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -32919,7 +32919,7 @@ "2" ] }, - "3750": { + "3696": { "op": "+", "defined_out": [ "box%offset%0#0", @@ -32942,7 +32942,7 @@ "box%offset%0#0" ] }, - "3751": { + "3697": { "op": "pushint 65", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -32961,7 +32961,7 @@ "65" ] }, - "3753": { + "3699": { "op": "box_extract", "defined_out": [ "previous_entry#0", @@ -32982,10 +32982,10 @@ "previous_entry#0" ] }, - "3754": { + "3700": { "op": "b contract_schedule_after_if_else@7" }, - "3757": { + "3703": { "block": "contract_schedule_after_while@11", "stack_in": [ "aggregate%array_trimmed%0#0", @@ -33019,7 +33019,7 @@ "schedule_page_index#0" ] }, - "3759": { + "3705": { "op": "itob", "defined_out": [ "encoded_value%0#0", @@ -33040,7 +33040,7 @@ "encoded_value%0#0" ] }, - "3760": { + "3706": { "op": "bytec 24 // 0x5323", "defined_out": [ "0x5323", @@ -33063,7 +33063,7 @@ "0x5323" ] }, - "3762": { + "3708": { "op": "swap", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -33081,7 +33081,7 @@ "encoded_value%0#0" ] }, - "3763": { + "3709": { "op": "concat", "defined_out": [ "box_prefixed_key%0#0", @@ -33102,7 +33102,7 @@ "box_prefixed_key%0#0" ] }, - "3764": { + "3710": { "op": "dup", "defined_out": [ "box_prefixed_key%0#0", @@ -33125,7 +33125,7 @@ "box_prefixed_key%0#0 (copy)" ] }, - "3765": { + "3711": { "op": "box_del", "defined_out": [ "box_prefixed_key%0#0", @@ -33148,7 +33148,7 @@ "{box_del}" ] }, - "3766": { + "3712": { "op": "pop", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -33165,7 +33165,7 @@ "box_prefixed_key%0#0" ] }, - "3767": { + "3713": { "op": "dig 5", "defined_out": [ "box_prefixed_key%0#0", @@ -33188,7 +33188,7 @@ "schedule_page#0" ] }, - "3769": { + "3715": { "op": "box_put", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -33204,7 +33204,7 @@ "index#0" ] }, - "3770": { + "3716": { "op": "dig 5", "defined_out": [ "is_last_page#0", @@ -33226,7 +33226,7 @@ "is_last_page#0" ] }, - "3772": { + "3718": { "op": "bz contract_schedule_after_if_else@13", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -33242,7 +33242,7 @@ "index#0" ] }, - "3775": { + "3721": { "op": "dig 1", "defined_out": [ "is_last_page#0", @@ -33265,7 +33265,7 @@ "page_cursor#0" ] }, - "3777": { + "3723": { "op": "dig 4", "defined_out": [ "is_last_page#0", @@ -33290,7 +33290,7 @@ "page_length#0" ] }, - "3779": { + "3725": { "op": "+", "defined_out": [ "is_last_page#0", @@ -33315,7 +33315,7 @@ "tmp%27#0" ] }, - "3780": { + "3726": { "op": "bytec_3 // \"schedule_entry_count\"", "defined_out": [ "\"schedule_entry_count\"", @@ -33342,7 +33342,7 @@ "\"schedule_entry_count\"" ] }, - "3781": { + "3727": { "op": "swap", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -33360,7 +33360,7 @@ "tmp%27#0" ] }, - "3782": { + "3728": { "op": "app_global_put", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -33376,7 +33376,7 @@ "index#0" ] }, - "3783": { + "3729": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"", @@ -33401,7 +33401,7 @@ "\"status\"" ] }, - "3784": { + "3730": { "op": "pushint 50", "defined_out": [ "\"status\"", @@ -33428,7 +33428,7 @@ "50" ] }, - "3786": { + "3732": { "op": "app_global_put", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -33444,7 +33444,7 @@ "index#0" ] }, - "3787": { + "3733": { "block": "contract_schedule_after_if_else@13", "stack_in": [ "aggregate%array_trimmed%0#0", @@ -33478,7 +33478,7 @@ "tmp%0#1" ] }, - "3789": { + "3735": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0" @@ -33498,7 +33498,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "3790": { + "3736": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -33520,7 +33520,7 @@ "0x151f7c75" ] }, - "3791": { + "3737": { "op": "swap", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -33538,7 +33538,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "3792": { + "3738": { "op": "concat", "defined_out": [ "tmp%7#0" @@ -33558,7 +33558,7 @@ "tmp%7#0" ] }, - "3793": { + "3739": { "op": "log", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -33574,7 +33574,7 @@ "index#0" ] }, - "3794": { + "3740": { "op": "intc_1 // 1", "defined_out": [ "1" @@ -33594,7 +33594,7 @@ "1" ] }, - "3795": { + "3741": { "op": "return", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -33610,7 +33610,7 @@ "index#0" ] }, - "3796": { + "3742": { "subroutine": "modules.actus_kernel.ActusKernelModule.contract_execute_ied[routing]", "params": {}, "block": "contract_execute_ied", @@ -33623,7 +33623,7 @@ "0" ] }, - "3797": { + "3743": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"", @@ -33634,7 +33634,7 @@ "\"status\"" ] }, - "3798": { + "3744": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -33645,37 +33645,37 @@ "maybe_exists%0#0" ] }, - "3799": { + "3745": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ "maybe_value%0#0" ] }, - "3800": { + "3746": { "error": "D-ASA not configured", "op": "assert // D-ASA not configured", "stack_out": [] }, - "3801": { + "3747": { "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", "op": "callsub _assert_caller_is_arranger" }, - "3804": { + "3750": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", "op": "callsub _assert_is_not_asset_defaulted" }, - "3807": { + "3753": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_suspended", "op": "callsub _assert_is_not_asset_suspended" }, - "3810": { + "3756": { "op": "intc_0 // 0", "stack_out": [ "0" ] }, - "3811": { + "3757": { "op": "bytec_2 // \"event_cursor\"", "defined_out": [ "\"event_cursor\"", @@ -33686,28 +33686,28 @@ "\"event_cursor\"" ] }, - "3812": { + "3758": { "op": "app_global_get_ex", "stack_out": [ "maybe_value%0#0", "maybe_exists%0#0" ] }, - "3813": { + "3759": { "error": "check self.event_cursor exists", "op": "assert // check self.event_cursor exists", "stack_out": [ "maybe_value%0#0" ] }, - "3814": { + "3760": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#0", "0" ] }, - "3815": { + "3761": { "op": "bytec_3 // \"schedule_entry_count\"", "defined_out": [ "\"schedule_entry_count\"", @@ -33720,7 +33720,7 @@ "\"schedule_entry_count\"" ] }, - "3816": { + "3762": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%1#0", @@ -33733,7 +33733,7 @@ "maybe_exists%1#0" ] }, - "3817": { + "3763": { "error": "check self.schedule_entry_count exists", "op": "assert // check self.schedule_entry_count exists", "stack_out": [ @@ -33741,7 +33741,7 @@ "maybe_value%1#0" ] }, - "3818": { + "3764": { "op": "dig 1", "defined_out": [ "maybe_value%0#0", @@ -33754,7 +33754,7 @@ "maybe_value%0#0 (copy)" ] }, - "3820": { + "3766": { "op": ">", "defined_out": [ "maybe_value%0#0", @@ -33765,14 +33765,14 @@ "tmp%0#1" ] }, - "3821": { + "3767": { "error": "Invalid event cursor", "op": "assert // Invalid event cursor", "stack_out": [ "maybe_value%0#0" ] }, - "3822": { + "3768": { "callsub": "modules.actus_kernel.ActusKernelModule._get_schedule_entry", "op": "callsub _get_schedule_entry", "defined_out": [ @@ -33782,7 +33782,7 @@ "entry#0" ] }, - "3825": { + "3771": { "op": "dup", "defined_out": [ "entry#0", @@ -33793,7 +33793,7 @@ "entry#0 (copy)" ] }, - "3826": { + "3772": { "op": "extract 8 1", "defined_out": [ "aggregate%extract%0#0", @@ -33804,7 +33804,7 @@ "aggregate%extract%0#0" ] }, - "3829": { + "3775": { "op": "dup", "defined_out": [ "aggregate%extract%0#0", @@ -33817,7 +33817,7 @@ "aggregate%extract%0#0 (copy)" ] }, - "3830": { + "3776": { "op": "pushbytes 0x01", "defined_out": [ "0x01", @@ -33832,7 +33832,7 @@ "0x01" ] }, - "3833": { + "3779": { "op": "b==", "defined_out": [ "aggregate%extract%0#0", @@ -33845,7 +33845,7 @@ "tmp%2#1" ] }, - "3834": { + "3780": { "error": "Invalid event type", "op": "assert // Invalid event type", "stack_out": [ @@ -33853,7 +33853,7 @@ "aggregate%extract%0#0" ] }, - "3835": { + "3781": { "op": "dig 1", "stack_out": [ "entry#0", @@ -33861,7 +33861,7 @@ "entry#0 (copy)" ] }, - "3837": { + "3783": { "op": "extract 0 8", "defined_out": [ "aggregate%extract%0#0", @@ -33874,7 +33874,7 @@ "aggregate%extract%1#0" ] }, - "3840": { + "3786": { "op": "dig 2", "stack_out": [ "entry#0", @@ -33883,7 +33883,7 @@ "entry#0 (copy)" ] }, - "3842": { + "3788": { "op": "extract 9 8", "defined_out": [ "aggregate%extract%0#0", @@ -33898,7 +33898,7 @@ "aggregate%extract%2#0" ] }, - "3845": { + "3791": { "op": "dig 3", "stack_out": [ "entry#0", @@ -33908,7 +33908,7 @@ "entry#0 (copy)" ] }, - "3847": { + "3793": { "op": "extract 17 8", "defined_out": [ "aggregate%extract%0#0", @@ -33925,7 +33925,7 @@ "aggregate%extract%3#0" ] }, - "3850": { + "3796": { "op": "dig 4", "stack_out": [ "entry#0", @@ -33936,7 +33936,7 @@ "entry#0 (copy)" ] }, - "3852": { + "3798": { "op": "extract 25 8", "defined_out": [ "aggregate%extract%0#0", @@ -33955,7 +33955,7 @@ "aggregate%extract%4#0" ] }, - "3855": { + "3801": { "op": "dig 5", "stack_out": [ "entry#0", @@ -33967,7 +33967,7 @@ "entry#0 (copy)" ] }, - "3857": { + "3803": { "op": "extract 33 8", "defined_out": [ "aggregate%extract%0#0", @@ -33988,7 +33988,7 @@ "aggregate%extract%5#0" ] }, - "3860": { + "3806": { "op": "dig 6", "stack_out": [ "entry#0", @@ -34001,7 +34001,7 @@ "entry#0 (copy)" ] }, - "3862": { + "3808": { "op": "extract 41 8", "defined_out": [ "aggregate%extract%0#0", @@ -34024,7 +34024,7 @@ "aggregate%extract%6#0" ] }, - "3865": { + "3811": { "op": "dig 7", "stack_out": [ "entry#0", @@ -34038,7 +34038,7 @@ "entry#0 (copy)" ] }, - "3867": { + "3813": { "op": "extract 49 8", "defined_out": [ "aggregate%extract%0#0", @@ -34063,7 +34063,7 @@ "aggregate%extract%7#0" ] }, - "3870": { + "3816": { "op": "dig 8", "stack_out": [ "entry#0", @@ -34078,7 +34078,7 @@ "entry#0 (copy)" ] }, - "3872": { + "3818": { "op": "extract 57 8", "defined_out": [ "aggregate%extract%0#0", @@ -34105,7 +34105,7 @@ "aggregate%extract%8#0" ] }, - "3875": { + "3821": { "op": "uncover 7", "stack_out": [ "entry#0", @@ -34120,7 +34120,7 @@ "aggregate%extract%1#0" ] }, - "3877": { + "3823": { "op": "uncover 8", "stack_out": [ "entry#0", @@ -34135,7 +34135,7 @@ "aggregate%extract%0#0" ] }, - "3879": { + "3825": { "op": "concat", "defined_out": [ "aggregate%extract%2#0", @@ -34160,7 +34160,7 @@ "aggregate%head%1#0" ] }, - "3880": { + "3826": { "op": "uncover 7", "stack_out": [ "entry#0", @@ -34174,7 +34174,7 @@ "aggregate%extract%2#0" ] }, - "3882": { + "3828": { "op": "concat", "defined_out": [ "aggregate%extract%3#0", @@ -34197,7 +34197,7 @@ "aggregate%head%2#0" ] }, - "3883": { + "3829": { "op": "uncover 6", "stack_out": [ "entry#0", @@ -34210,7 +34210,7 @@ "aggregate%extract%3#0" ] }, - "3885": { + "3831": { "op": "concat", "defined_out": [ "aggregate%extract%4#0", @@ -34231,7 +34231,7 @@ "aggregate%head%3#0" ] }, - "3886": { + "3832": { "op": "uncover 5", "stack_out": [ "entry#0", @@ -34243,7 +34243,7 @@ "aggregate%extract%4#0" ] }, - "3888": { + "3834": { "op": "concat", "defined_out": [ "aggregate%extract%5#0", @@ -34262,7 +34262,7 @@ "aggregate%head%4#0" ] }, - "3889": { + "3835": { "op": "intc_0 // 0", "stack_out": [ "entry#0", @@ -34274,7 +34274,7 @@ "0" ] }, - "3890": { + "3836": { "op": "itob", "defined_out": [ "aggregate%extract%5#0", @@ -34295,7 +34295,7 @@ "aggregate%val_as_bytes%4#0" ] }, - "3891": { + "3837": { "op": "concat", "defined_out": [ "aggregate%extract%5#0", @@ -34314,7 +34314,7 @@ "aggregate%head%5#0" ] }, - "3892": { + "3838": { "op": "uncover 4", "stack_out": [ "entry#0", @@ -34325,7 +34325,7 @@ "aggregate%extract%5#0" ] }, - "3894": { + "3840": { "op": "concat", "defined_out": [ "aggregate%extract%6#0", @@ -34342,7 +34342,7 @@ "aggregate%head%6#0" ] }, - "3895": { + "3841": { "op": "uncover 3", "stack_out": [ "entry#0", @@ -34352,7 +34352,7 @@ "aggregate%extract%6#0" ] }, - "3897": { + "3843": { "op": "concat", "defined_out": [ "aggregate%extract%7#0", @@ -34367,7 +34367,7 @@ "aggregate%head%7#0" ] }, - "3898": { + "3844": { "op": "uncover 2", "stack_out": [ "entry#0", @@ -34376,7 +34376,7 @@ "aggregate%extract%7#0" ] }, - "3900": { + "3846": { "op": "concat", "defined_out": [ "aggregate%extract%8#0", @@ -34389,7 +34389,7 @@ "aggregate%head%8#0" ] }, - "3901": { + "3847": { "op": "swap", "stack_out": [ "entry#0", @@ -34397,7 +34397,7 @@ "aggregate%extract%8#0" ] }, - "3902": { + "3848": { "op": "concat", "defined_out": [ "aggregate%head%9#0", @@ -34408,7 +34408,7 @@ "aggregate%head%9#0" ] }, - "3903": { + "3849": { "callsub": "modules.actus_kernel.ActusKernelModule._apply_non_cash_schedule_entry", "op": "callsub _apply_non_cash_schedule_entry", "defined_out": [ @@ -34420,11 +34420,11 @@ "_apply_non_cash_schedule_entry%1#0" ] }, - "3906": { + "3852": { "op": "popn 2", "stack_out": [] }, - "3908": { + "3854": { "op": "global LatestTimestamp", "defined_out": [ "tmp%4#0" @@ -34433,7 +34433,7 @@ "tmp%4#0" ] }, - "3910": { + "3856": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%9#0" @@ -34442,7 +34442,7 @@ "aggregate%val_as_bytes%9#0" ] }, - "3911": { + "3857": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -34453,14 +34453,14 @@ "0x151f7c75" ] }, - "3912": { + "3858": { "op": "swap", "stack_out": [ "0x151f7c75", "aggregate%val_as_bytes%9#0" ] }, - "3913": { + "3859": { "op": "concat", "defined_out": [ "tmp%2#0" @@ -34469,11 +34469,11 @@ "tmp%2#0" ] }, - "3914": { + "3860": { "op": "log", "stack_out": [] }, - "3915": { + "3861": { "op": "intc_1 // 1", "defined_out": [ "1" @@ -34482,11 +34482,11 @@ "1" ] }, - "3916": { + "3862": { "op": "return", "stack_out": [] }, - "3917": { + "3863": { "subroutine": "modules.actus_kernel.ActusKernelModule.apply_non_cash_event[routing]", "params": {}, "block": "apply_non_cash_event", @@ -34496,7 +34496,7 @@ "aggregate%extract%2#0" ] }, - "3918": { + "3864": { "op": "dupn 4", "stack_out": [ "aggregate%extract%2#0", @@ -34506,7 +34506,7 @@ "page#0" ] }, - "3920": { + "3866": { "op": "pushbytes \"\"", "stack_out": [ "aggregate%extract%2#0", @@ -34517,7 +34517,7 @@ "event_type#0" ] }, - "3922": { + "3868": { "op": "dup", "stack_out": [ "aggregate%extract%2#0", @@ -34529,7 +34529,7 @@ "values%0#1" ] }, - "3923": { + "3869": { "op": "txna ApplicationArgs 1", "defined_out": [ "tmp%0#0" @@ -34545,7 +34545,7 @@ "tmp%0#0" ] }, - "3926": { + "3872": { "op": "dup", "defined_out": [ "tmp%0#0", @@ -34563,7 +34563,7 @@ "tmp%0#0 (copy)" ] }, - "3927": { + "3873": { "op": "len", "defined_out": [ "len%0#0", @@ -34581,7 +34581,7 @@ "len%0#0" ] }, - "3928": { + "3874": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -34601,7 +34601,7 @@ "8" ] }, - "3929": { + "3875": { "op": "==", "defined_out": [ "eq%0#0", @@ -34619,7 +34619,7 @@ "eq%0#0" ] }, - "3930": { + "3876": { "error": "invalid number of bytes for arc4.uint64", "op": "assert // invalid number of bytes for arc4.uint64", "stack_out": [ @@ -34633,7 +34633,7 @@ "tmp%0#0" ] }, - "3931": { + "3877": { "op": "btoi", "defined_out": [ "event_id#0" @@ -34649,10 +34649,10 @@ "event_id#0" ] }, - "3932": { + "3878": { "op": "txna ApplicationArgs 2" }, - "3935": { + "3881": { "op": "dupn 2", "defined_out": [ "event_id#0", @@ -34673,7 +34673,7 @@ "payload#0 (copy)" ] }, - "3937": { + "3883": { "op": "len", "defined_out": [ "event_id#0", @@ -34694,7 +34694,7 @@ "len%1#0" ] }, - "3938": { + "3884": { "op": "pushint 73", "defined_out": [ "73", @@ -34717,7 +34717,7 @@ "73" ] }, - "3940": { + "3886": { "op": "==", "defined_out": [ "eq%1#0", @@ -34738,7 +34738,7 @@ "eq%1#0" ] }, - "3941": { + "3887": { "error": "invalid number of bytes for smart_contracts.abi_types.ObservedEventRequest", "op": "assert // invalid number of bytes for smart_contracts.abi_types.ObservedEventRequest", "stack_out": [ @@ -34754,7 +34754,7 @@ "payload#0" ] }, - "3942": { + "3888": { "op": "intc_0 // 0", "stack_out": [ "aggregate%extract%2#0", @@ -34770,7 +34770,7 @@ "0" ] }, - "3943": { + "3889": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"", @@ -34793,7 +34793,7 @@ "\"status\"" ] }, - "3944": { + "3890": { "op": "app_global_get_ex", "defined_out": [ "event_id#0", @@ -34816,7 +34816,7 @@ "maybe_exists%0#0" ] }, - "3945": { + "3891": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ @@ -34833,7 +34833,7 @@ "maybe_value%0#0" ] }, - "3946": { + "3892": { "error": "D-ASA not configured", "op": "assert // D-ASA not configured", "stack_out": [ @@ -34849,15 +34849,15 @@ "payload#0" ] }, - "3947": { + "3893": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", "op": "callsub _assert_is_not_asset_defaulted" }, - "3950": { + "3896": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_suspended", "op": "callsub _assert_is_not_asset_suspended" }, - "3953": { + "3899": { "op": "pushint 65", "defined_out": [ "65", @@ -34878,7 +34878,7 @@ "65" ] }, - "3955": { + "3901": { "op": "extract_uint64", "defined_out": [ "event_id#0", @@ -34898,7 +34898,7 @@ "values%0#0" ] }, - "3956": { + "3902": { "op": "dup", "defined_out": [ "event_id#0", @@ -34919,7 +34919,7 @@ "values%0#0" ] }, - "3957": { + "3903": { "op": "pushint 4", "defined_out": [ "4", @@ -34942,7 +34942,7 @@ "4" ] }, - "3959": { + "3905": { "op": "&", "defined_out": [ "event_id#0", @@ -34964,7 +34964,7 @@ "tmp%0#1" ] }, - "3960": { + "3906": { "op": "bz apply_non_cash_event_after_if_else@3", "stack_out": [ "aggregate%extract%2#0", @@ -34979,7 +34979,7 @@ "values%0#0" ] }, - "3963": { + "3909": { "op": "intc_0 // 0", "stack_out": [ "aggregate%extract%2#0", @@ -34995,7 +34995,7 @@ "0" ] }, - "3964": { + "3910": { "op": "bytec 10 // \"contract_type\"", "defined_out": [ "\"contract_type\"", @@ -35019,7 +35019,7 @@ "\"contract_type\"" ] }, - "3966": { + "3912": { "op": "app_global_get_ex", "stack_out": [ "aggregate%extract%2#0", @@ -35036,7 +35036,7 @@ "maybe_exists%0#0" ] }, - "3967": { + "3913": { "error": "check self.contract_type exists", "op": "assert // check self.contract_type exists", "stack_out": [ @@ -35053,7 +35053,7 @@ "maybe_value%0#0" ] }, - "3968": { + "3914": { "op": "pushint 5", "defined_out": [ "5", @@ -35077,7 +35077,7 @@ "5" ] }, - "3970": { + "3916": { "op": "==", "defined_out": [ "event_id#0", @@ -35099,7 +35099,7 @@ "tmp%0#3" ] }, - "3971": { + "3917": { "error": "Observed event required to execute this action", "op": "assert // Observed event required to execute this action", "stack_out": [ @@ -35115,11 +35115,11 @@ "values%0#0" ] }, - "3972": { + "3918": { "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", "op": "callsub _assert_caller_is_arranger" }, - "3975": { + "3921": { "op": "intc_0 // 0", "stack_out": [ "aggregate%extract%2#0", @@ -35135,7 +35135,7 @@ "0" ] }, - "3976": { + "3922": { "op": "bytec 10 // \"contract_type\"", "stack_out": [ "aggregate%extract%2#0", @@ -35152,7 +35152,7 @@ "\"contract_type\"" ] }, - "3978": { + "3924": { "op": "app_global_get_ex", "stack_out": [ "aggregate%extract%2#0", @@ -35169,7 +35169,7 @@ "maybe_exists%0#0" ] }, - "3979": { + "3925": { "error": "check self.contract_type exists", "op": "assert // check self.contract_type exists", "stack_out": [ @@ -35186,7 +35186,7 @@ "maybe_value%0#0" ] }, - "3980": { + "3926": { "op": "dup", "defined_out": [ "event_id#0", @@ -35210,7 +35210,7 @@ "maybe_value%0#0 (copy)" ] }, - "3981": { + "3927": { "op": "pushint 5", "stack_out": [ "aggregate%extract%2#0", @@ -35228,7 +35228,7 @@ "5" ] }, - "3983": { + "3929": { "op": "==", "stack_out": [ "aggregate%extract%2#0", @@ -35245,7 +35245,7 @@ "tmp%0#3" ] }, - "3984": { + "3930": { "error": "Observed event required to execute this action", "op": "assert // Observed event required to execute this action", "stack_out": [ @@ -35262,7 +35262,7 @@ "maybe_value%0#0" ] }, - "3985": { + "3931": { "op": "dig 2", "stack_out": [ "aggregate%extract%2#0", @@ -35279,7 +35279,7 @@ "payload#0" ] }, - "3987": { + "3933": { "op": "dup", "stack_out": [ "aggregate%extract%2#0", @@ -35297,7 +35297,7 @@ "payload#0 (copy)" ] }, - "3988": { + "3934": { "op": "intc_0 // 0", "stack_out": [ "aggregate%extract%2#0", @@ -35316,7 +35316,7 @@ "0" ] }, - "3989": { + "3935": { "op": "extract_uint64", "defined_out": [ "event_id#0", @@ -35341,7 +35341,7 @@ "values%0#1" ] }, - "3990": { + "3936": { "op": "dup", "stack_out": [ "aggregate%extract%2#0", @@ -35360,7 +35360,7 @@ "values%0#1" ] }, - "3991": { + "3937": { "op": "bury 7", "defined_out": [ "event_id#0", @@ -35385,7 +35385,7 @@ "values%0#1" ] }, - "3993": { + "3939": { "op": "intc_0 // 0", "stack_out": [ "aggregate%extract%2#0", @@ -35404,7 +35404,7 @@ "0" ] }, - "3994": { + "3940": { "op": "bytec_3 // \"schedule_entry_count\"", "defined_out": [ "\"schedule_entry_count\"", @@ -35433,7 +35433,7 @@ "\"schedule_entry_count\"" ] }, - "3995": { + "3941": { "op": "app_global_get_ex", "defined_out": [ "event_id#0", @@ -35462,7 +35462,7 @@ "maybe_exists%0#0" ] }, - "3996": { + "3942": { "error": "check self.schedule_entry_count exists", "op": "assert // check self.schedule_entry_count exists", "stack_out": [ @@ -35482,7 +35482,7 @@ "maybe_value%0#1" ] }, - "3997": { + "3943": { "op": "==", "defined_out": [ "event_id#0", @@ -35508,7 +35508,7 @@ "tmp%1#2" ] }, - "3998": { + "3944": { "error": "Invalid event id", "op": "assert // Invalid event id", "stack_out": [ @@ -35526,7 +35526,7 @@ "payload#0" ] }, - "3999": { + "3945": { "op": "dup", "stack_out": [ "aggregate%extract%2#0", @@ -35544,7 +35544,7 @@ "payload#0 (copy)" ] }, - "4000": { + "3946": { "op": "extract 8 1", "defined_out": [ "aggregate%extract%2#0", @@ -35570,7 +35570,7 @@ "aggregate%extract%2#0" ] }, - "4003": { + "3949": { "op": "bury 12", "defined_out": [ "aggregate%extract%2#0", @@ -35595,7 +35595,7 @@ "payload#0" ] }, - "4005": { + "3951": { "op": "intc_2 // 8", "stack_out": [ "aggregate%extract%2#0", @@ -35613,7 +35613,7 @@ "8" ] }, - "4006": { + "3952": { "op": "getbyte", "defined_out": [ "aggregate%extract%2#0", @@ -35639,7 +35639,7 @@ "tmp%2#3" ] }, - "4007": { + "3953": { "callsub": "modules.actus_kernel.ActusKernelModule._assert_event_allowed_for_contract_type", "op": "callsub _assert_event_allowed_for_contract_type", "stack_out": [ @@ -35655,7 +35655,7 @@ "values%0#0" ] }, - "4010": { + "3956": { "op": "intc_0 // 0", "stack_out": [ "aggregate%extract%2#0", @@ -35671,7 +35671,7 @@ "0" ] }, - "4011": { + "3957": { "op": "bytec_3 // \"schedule_entry_count\"", "stack_out": [ "aggregate%extract%2#0", @@ -35688,7 +35688,7 @@ "\"schedule_entry_count\"" ] }, - "4012": { + "3958": { "op": "app_global_get_ex", "defined_out": [ "aggregate%extract%2#0", @@ -35714,7 +35714,7 @@ "maybe_exists%2#0" ] }, - "4013": { + "3959": { "error": "check self.schedule_entry_count exists", "op": "assert // check self.schedule_entry_count exists", "stack_out": [ @@ -35731,7 +35731,7 @@ "event_id#1" ] }, - "4014": { + "3960": { "op": "pushint 16", "defined_out": [ "16", @@ -35757,7 +35757,7 @@ "16" ] }, - "4016": { + "3962": { "op": "/", "defined_out": [ "aggregate%extract%2#0", @@ -35781,7 +35781,7 @@ "page_index#0" ] }, - "4017": { + "3963": { "op": "bytec 48 // 0x0000", "defined_out": [ "aggregate%extract%2#0", @@ -35807,7 +35807,7 @@ "page#0" ] }, - "4019": { + "3965": { "op": "bury 7", "stack_out": [ "aggregate%extract%2#0", @@ -35823,7 +35823,7 @@ "page_index#0" ] }, - "4021": { + "3967": { "op": "itob", "defined_out": [ "aggregate%extract%2#0", @@ -35848,7 +35848,7 @@ "encoded_value%0#0" ] }, - "4022": { + "3968": { "op": "bytec 24 // 0x5323", "defined_out": [ "0x5323", @@ -35875,7 +35875,7 @@ "0x5323" ] }, - "4024": { + "3970": { "op": "swap", "stack_out": [ "aggregate%extract%2#0", @@ -35892,7 +35892,7 @@ "encoded_value%0#0" ] }, - "4025": { + "3971": { "op": "concat", "defined_out": [ "aggregate%extract%2#0", @@ -35917,7 +35917,7 @@ "box_prefixed_key%0#0" ] }, - "4026": { + "3972": { "op": "dup", "stack_out": [ "aggregate%extract%2#0", @@ -35934,7 +35934,7 @@ "box_prefixed_key%0#0" ] }, - "4027": { + "3973": { "op": "bury 9", "defined_out": [ "aggregate%extract%2#0", @@ -35959,7 +35959,7 @@ "box_prefixed_key%0#0" ] }, - "4029": { + "3975": { "op": "box_len", "defined_out": [ "_%0#0", @@ -35987,7 +35987,7 @@ "maybe_exists%3#0" ] }, - "4030": { + "3976": { "op": "bury 1", "stack_out": [ "aggregate%extract%2#0", @@ -36003,7 +36003,7 @@ "maybe_exists%3#0" ] }, - "4032": { + "3978": { "op": "bz apply_non_cash_event_after_if_else@27", "stack_out": [ "aggregate%extract%2#0", @@ -36018,7 +36018,7 @@ "values%0#0" ] }, - "4035": { + "3981": { "op": "dig 7", "stack_out": [ "aggregate%extract%2#0", @@ -36034,7 +36034,7 @@ "box_prefixed_key%0#0" ] }, - "4037": { + "3983": { "op": "box_get", "defined_out": [ "aggregate%box_get%1#0", @@ -36061,7 +36061,7 @@ "aggregate%box_get%1#0" ] }, - "4038": { + "3984": { "op": "swap", "stack_out": [ "aggregate%extract%2#0", @@ -36078,7 +36078,7 @@ "page#0" ] }, - "4039": { + "3985": { "op": "bury 7", "stack_out": [ "aggregate%extract%2#0", @@ -36094,7 +36094,7 @@ "aggregate%box_get%1#0" ] }, - "4041": { + "3987": { "error": "check self.schedule_page entry exists", "op": "assert // check self.schedule_page entry exists", "stack_out": [ @@ -36110,7 +36110,7 @@ "values%0#0" ] }, - "4042": { + "3988": { "block": "apply_non_cash_event_after_if_else@27", "stack_in": [ "aggregate%extract%2#0", @@ -36142,7 +36142,7 @@ "page#0" ] }, - "4044": { + "3990": { "op": "dup", "defined_out": [ "page#0", @@ -36163,7 +36163,7 @@ "page#0 (copy)" ] }, - "4045": { + "3991": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -36186,7 +36186,7 @@ "0" ] }, - "4046": { + "3992": { "error": "invalid array length header", "op": "extract_uint16 // on error: invalid array length header", "defined_out": [ @@ -36208,7 +36208,7 @@ "aggregate%array_length%0#0" ] }, - "4047": { + "3993": { "op": "dup", "defined_out": [ "aggregate%array_length%0#0", @@ -36231,7 +36231,7 @@ "aggregate%array_length%0#0 (copy)" ] }, - "4048": { + "3994": { "op": "pushint 16", "defined_out": [ "16", @@ -36256,7 +36256,7 @@ "16" ] }, - "4050": { + "3996": { "op": "<", "defined_out": [ "aggregate%array_length%0#0", @@ -36279,7 +36279,7 @@ "tmp%5#2" ] }, - "4051": { + "3997": { "error": "Invalid schedule page", "op": "assert // Invalid schedule page", "stack_out": [ @@ -36297,7 +36297,7 @@ "aggregate%array_length%0#0" ] }, - "4052": { + "3998": { "op": "dig 3", "defined_out": [ "aggregate%array_length%0#0", @@ -36320,7 +36320,7 @@ "payload#0" ] }, - "4054": { + "4000": { "op": "dup", "defined_out": [ "aggregate%array_length%0#0", @@ -36345,7 +36345,7 @@ "payload#0 (copy)" ] }, - "4055": { + "4001": { "op": "extract 9 8", "defined_out": [ "aggregate%array_length%0#0", @@ -36370,7 +36370,7 @@ "aggregate%extract%3#0" ] }, - "4058": { + "4004": { "op": "dig 1", "stack_out": [ "aggregate%extract%2#0", @@ -36390,7 +36390,7 @@ "payload#0 (copy)" ] }, - "4060": { + "4006": { "op": "extract 17 8", "defined_out": [ "aggregate%array_length%0#0", @@ -36417,7 +36417,7 @@ "aggregate%extract%4#0" ] }, - "4063": { + "4009": { "op": "dig 2", "stack_out": [ "aggregate%extract%2#0", @@ -36438,7 +36438,7 @@ "payload#0 (copy)" ] }, - "4065": { + "4011": { "op": "extract 25 8", "defined_out": [ "aggregate%array_length%0#0", @@ -36467,7 +36467,7 @@ "aggregate%extract%5#0" ] }, - "4068": { + "4014": { "op": "dig 3", "stack_out": [ "aggregate%extract%2#0", @@ -36489,7 +36489,7 @@ "payload#0 (copy)" ] }, - "4070": { + "4016": { "op": "extract 41 8", "defined_out": [ "aggregate%array_length%0#0", @@ -36520,7 +36520,7 @@ "aggregate%extract%6#0" ] }, - "4073": { + "4019": { "op": "dig 4", "stack_out": [ "aggregate%extract%2#0", @@ -36543,7 +36543,7 @@ "payload#0 (copy)" ] }, - "4075": { + "4021": { "op": "extract 49 8", "defined_out": [ "aggregate%array_length%0#0", @@ -36576,7 +36576,7 @@ "aggregate%extract%7#0" ] }, - "4078": { + "4024": { "op": "uncover 5", "stack_out": [ "aggregate%extract%2#0", @@ -36599,7 +36599,7 @@ "payload#0" ] }, - "4080": { + "4026": { "op": "extract 57 8", "defined_out": [ "aggregate%array_length%0#0", @@ -36633,7 +36633,7 @@ "aggregate%extract%8#0" ] }, - "4083": { + "4029": { "op": "dig 11", "defined_out": [ "aggregate%array_length%0#0", @@ -36669,7 +36669,7 @@ "values%0#1" ] }, - "4085": { + "4031": { "op": "itob", "defined_out": [ "aggregate%array_length%0#0", @@ -36706,7 +36706,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "4086": { + "4032": { "op": "dig 18", "defined_out": [ "aggregate%array_length%0#0", @@ -36745,7 +36745,7 @@ "aggregate%extract%2#0" ] }, - "4088": { + "4034": { "op": "concat", "defined_out": [ "aggregate%array_length%0#0", @@ -36783,7 +36783,7 @@ "aggregate%head%1#0" ] }, - "4089": { + "4035": { "op": "uncover 6", "stack_out": [ "aggregate%extract%2#0", @@ -36807,7 +36807,7 @@ "aggregate%extract%3#0" ] }, - "4091": { + "4037": { "op": "concat", "defined_out": [ "aggregate%array_length%0#0", @@ -36843,7 +36843,7 @@ "aggregate%head%2#0" ] }, - "4092": { + "4038": { "op": "uncover 5", "stack_out": [ "aggregate%extract%2#0", @@ -36866,7 +36866,7 @@ "aggregate%extract%4#0" ] }, - "4094": { + "4040": { "op": "concat", "defined_out": [ "aggregate%array_length%0#0", @@ -36900,7 +36900,7 @@ "aggregate%head%3#0" ] }, - "4095": { + "4041": { "op": "uncover 4", "stack_out": [ "aggregate%extract%2#0", @@ -36922,7 +36922,7 @@ "aggregate%extract%5#0" ] }, - "4097": { + "4043": { "op": "concat", "defined_out": [ "aggregate%array_length%0#0", @@ -36954,7 +36954,7 @@ "aggregate%head%4#0" ] }, - "4098": { + "4044": { "op": "uncover 3", "stack_out": [ "aggregate%extract%2#0", @@ -36975,7 +36975,7 @@ "aggregate%extract%6#0" ] }, - "4100": { + "4046": { "op": "concat", "defined_out": [ "aggregate%array_length%0#0", @@ -37005,7 +37005,7 @@ "aggregate%head%5#0" ] }, - "4101": { + "4047": { "op": "uncover 2", "stack_out": [ "aggregate%extract%2#0", @@ -37025,7 +37025,7 @@ "aggregate%extract%7#0" ] }, - "4103": { + "4049": { "op": "concat", "defined_out": [ "aggregate%array_length%0#0", @@ -37053,7 +37053,7 @@ "aggregate%head%6#0" ] }, - "4104": { + "4050": { "op": "swap", "stack_out": [ "aggregate%extract%2#0", @@ -37072,7 +37072,7 @@ "aggregate%extract%8#0" ] }, - "4105": { + "4051": { "op": "concat", "defined_out": [ "aggregate%array_length%0#0", @@ -37098,7 +37098,7 @@ "aggregate%head%7#0" ] }, - "4106": { + "4052": { "op": "dig 3", "defined_out": [ "aggregate%array_length%0#0", @@ -37126,7 +37126,7 @@ "values%0#0" ] }, - "4108": { + "4054": { "op": "itob", "defined_out": [ "aggregate%array_length%0#0", @@ -37155,7 +37155,7 @@ "aggregate%val_as_bytes%7#0" ] }, - "4109": { + "4055": { "op": "concat", "defined_out": [ "aggregate%array_length%0#0", @@ -37182,7 +37182,7 @@ "aggregate%head%8#0" ] }, - "4110": { + "4056": { "op": "uncover 2", "stack_out": [ "aggregate%extract%2#0", @@ -37200,7 +37200,7 @@ "page#0" ] }, - "4112": { + "4058": { "op": "swap", "stack_out": [ "aggregate%extract%2#0", @@ -37218,7 +37218,7 @@ "aggregate%head%8#0" ] }, - "4113": { + "4059": { "error": "max array length exceeded", "op": "concat // on error: max array length exceeded", "defined_out": [ @@ -37245,7 +37245,7 @@ "concat%0#0" ] }, - "4114": { + "4060": { "op": "swap", "stack_out": [ "aggregate%extract%2#0", @@ -37262,7 +37262,7 @@ "aggregate%array_length%0#0" ] }, - "4115": { + "4061": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -37290,7 +37290,7 @@ "1" ] }, - "4116": { + "4062": { "op": "+", "defined_out": [ "add%0#0", @@ -37316,7 +37316,7 @@ "add%0#0" ] }, - "4117": { + "4063": { "op": "itob", "defined_out": [ "aggregate%extract%2#0", @@ -37342,7 +37342,7 @@ "as_bytes%0#0" ] }, - "4118": { + "4064": { "op": "extract 6 2", "defined_out": [ "aggregate%extract%2#0", @@ -37368,7 +37368,7 @@ "as_u16_bytes%0#0" ] }, - "4121": { + "4067": { "op": "replace2 0", "stack_out": [ "aggregate%extract%2#0", @@ -37384,7 +37384,7 @@ "page#0" ] }, - "4123": { + "4069": { "op": "dig 8", "defined_out": [ "aggregate%extract%2#0", @@ -37409,7 +37409,7 @@ "box_prefixed_key%0#0" ] }, - "4125": { + "4071": { "op": "dup", "defined_out": [ "aggregate%extract%2#0", @@ -37436,7 +37436,7 @@ "box_prefixed_key%0#0 (copy)" ] }, - "4126": { + "4072": { "op": "box_del", "defined_out": [ "aggregate%extract%2#0", @@ -37463,7 +37463,7 @@ "{box_del}" ] }, - "4127": { + "4073": { "op": "pop", "stack_out": [ "aggregate%extract%2#0", @@ -37480,7 +37480,7 @@ "box_prefixed_key%0#0" ] }, - "4128": { + "4074": { "op": "swap", "stack_out": [ "aggregate%extract%2#0", @@ -37497,7 +37497,7 @@ "page#0" ] }, - "4129": { + "4075": { "op": "box_put", "stack_out": [ "aggregate%extract%2#0", @@ -37512,7 +37512,7 @@ "values%0#0" ] }, - "4130": { + "4076": { "op": "intc_0 // 0", "stack_out": [ "aggregate%extract%2#0", @@ -37528,7 +37528,7 @@ "0" ] }, - "4131": { + "4077": { "op": "bytec_3 // \"schedule_entry_count\"", "defined_out": [ "\"schedule_entry_count\"", @@ -37555,7 +37555,7 @@ "\"schedule_entry_count\"" ] }, - "4132": { + "4078": { "op": "app_global_get_ex", "defined_out": [ "aggregate%extract%2#0", @@ -37582,7 +37582,7 @@ "maybe_exists%4#0" ] }, - "4133": { + "4079": { "error": "check self.schedule_entry_count exists", "op": "assert // check self.schedule_entry_count exists", "stack_out": [ @@ -37599,7 +37599,7 @@ "maybe_value%3#0" ] }, - "4134": { + "4080": { "op": "intc_1 // 1", "stack_out": [ "aggregate%extract%2#0", @@ -37616,7 +37616,7 @@ "1" ] }, - "4135": { + "4081": { "op": "+", "defined_out": [ "aggregate%extract%2#0", @@ -37641,7 +37641,7 @@ "tmp%8#0" ] }, - "4136": { + "4082": { "op": "bytec_3 // \"schedule_entry_count\"", "stack_out": [ "aggregate%extract%2#0", @@ -37658,7 +37658,7 @@ "\"schedule_entry_count\"" ] }, - "4137": { + "4083": { "op": "swap", "stack_out": [ "aggregate%extract%2#0", @@ -37675,7 +37675,7 @@ "tmp%8#0" ] }, - "4138": { + "4084": { "op": "app_global_put", "stack_out": [ "aggregate%extract%2#0", @@ -37690,7 +37690,7 @@ "values%0#0" ] }, - "4139": { + "4085": { "block": "apply_non_cash_event_after_if_else@3", "stack_in": [ "aggregate%extract%2#0", @@ -37722,7 +37722,7 @@ "0" ] }, - "4140": { + "4086": { "op": "bytec_2 // \"event_cursor\"", "defined_out": [ "\"event_cursor\"", @@ -37743,7 +37743,7 @@ "\"event_cursor\"" ] }, - "4141": { + "4087": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -37764,7 +37764,7 @@ "maybe_exists%0#0" ] }, - "4142": { + "4088": { "error": "check self.event_cursor exists", "op": "assert // check self.event_cursor exists", "stack_out": [ @@ -37781,7 +37781,7 @@ "maybe_value%0#0" ] }, - "4143": { + "4089": { "op": "dig 3", "defined_out": [ "event_id#0", @@ -37802,10 +37802,10 @@ "event_id#0" ] }, - "4145": { + "4091": { "op": "dup" }, - "4146": { + "4092": { "op": "uncover 2", "defined_out": [ "event_id#0", @@ -37828,7 +37828,7 @@ "maybe_value%0#0" ] }, - "4148": { + "4094": { "op": "==", "defined_out": [ "event_id#0", @@ -37849,7 +37849,7 @@ "tmp%3#1" ] }, - "4149": { + "4095": { "error": "Invalid event cursor", "op": "assert // Invalid event cursor", "stack_out": [ @@ -37866,7 +37866,7 @@ "event_id#0" ] }, - "4150": { + "4096": { "callsub": "modules.actus_kernel.ActusKernelModule._get_schedule_entry", "op": "callsub _get_schedule_entry", "defined_out": [ @@ -37887,7 +37887,7 @@ "entry#0" ] }, - "4153": { + "4099": { "op": "dup", "stack_out": [ "aggregate%extract%2#0", @@ -37904,7 +37904,7 @@ "entry#0" ] }, - "4154": { + "4100": { "op": "bury 8", "defined_out": [ "entry#0", @@ -37924,7 +37924,7 @@ "entry#0" ] }, - "4156": { + "4102": { "op": "dup", "defined_out": [ "entry#0", @@ -37946,7 +37946,7 @@ "entry#0 (copy)" ] }, - "4157": { + "4103": { "op": "extract 8 1", "defined_out": [ "aggregate%extract%9#0", @@ -37968,7 +37968,7 @@ "aggregate%extract%9#0" ] }, - "4160": { + "4106": { "op": "bury 10", "defined_out": [ "aggregate%extract%9#0", @@ -37989,7 +37989,7 @@ "entry#0" ] }, - "4162": { + "4108": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -38012,7 +38012,7 @@ "8" ] }, - "4163": { + "4109": { "op": "getbyte", "defined_out": [ "aggregate%extract%9#0", @@ -38034,7 +38034,7 @@ "event_type#0" ] }, - "4164": { + "4110": { "op": "dup", "stack_out": [ "aggregate%extract%2#0", @@ -38051,7 +38051,7 @@ "event_type#0" ] }, - "4165": { + "4111": { "op": "bury 6", "defined_out": [ "aggregate%extract%9#0", @@ -38073,7 +38073,7 @@ "event_type#0" ] }, - "4167": { + "4113": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -38097,7 +38097,7 @@ "1" ] }, - "4168": { + "4114": { "op": "==", "defined_out": [ "aggregate%extract%9#0", @@ -38120,7 +38120,7 @@ "tmp%0#3" ] }, - "4169": { + "4115": { "op": "bnz apply_non_cash_event_bool_true@15", "stack_out": [ "aggregate%extract%2#0", @@ -38135,7 +38135,7 @@ "values%0#0" ] }, - "4172": { + "4118": { "op": "dig 4", "stack_out": [ "aggregate%extract%2#0", @@ -38151,7 +38151,7 @@ "event_type#0" ] }, - "4174": { + "4120": { "op": "pushint 4", "defined_out": [ "4", @@ -38175,7 +38175,7 @@ "4" ] }, - "4176": { + "4122": { "op": "==", "defined_out": [ "aggregate%extract%9#0", @@ -38198,7 +38198,7 @@ "tmp%1#2" ] }, - "4177": { + "4123": { "op": "bnz apply_non_cash_event_bool_true@15", "stack_out": [ "aggregate%extract%2#0", @@ -38213,7 +38213,7 @@ "values%0#0" ] }, - "4180": { + "4126": { "op": "dig 4", "stack_out": [ "aggregate%extract%2#0", @@ -38229,7 +38229,7 @@ "event_type#0" ] }, - "4182": { + "4128": { "op": "pushint 12", "defined_out": [ "12", @@ -38253,7 +38253,7 @@ "12" ] }, - "4184": { + "4130": { "op": "==", "defined_out": [ "aggregate%extract%9#0", @@ -38276,7 +38276,7 @@ "tmp%2#2" ] }, - "4185": { + "4131": { "op": "bnz apply_non_cash_event_bool_true@15", "stack_out": [ "aggregate%extract%2#0", @@ -38291,7 +38291,7 @@ "values%0#0" ] }, - "4188": { + "4134": { "op": "dig 4", "stack_out": [ "aggregate%extract%2#0", @@ -38307,7 +38307,7 @@ "event_type#0" ] }, - "4190": { + "4136": { "op": "pushint 11", "defined_out": [ "11", @@ -38331,7 +38331,7 @@ "11" ] }, - "4192": { + "4138": { "op": "==", "stack_out": [ "aggregate%extract%2#0", @@ -38347,7 +38347,7 @@ "tmp%3#1" ] }, - "4193": { + "4139": { "op": "bnz apply_non_cash_event_bool_true@15", "stack_out": [ "aggregate%extract%2#0", @@ -38362,7 +38362,7 @@ "values%0#0" ] }, - "4196": { + "4142": { "op": "dig 4", "stack_out": [ "aggregate%extract%2#0", @@ -38378,7 +38378,7 @@ "event_type#0" ] }, - "4198": { + "4144": { "op": "pushint 18", "defined_out": [ "18", @@ -38402,7 +38402,7 @@ "18" ] }, - "4200": { + "4146": { "op": "==", "defined_out": [ "aggregate%extract%9#0", @@ -38425,7 +38425,7 @@ "tmp%4#1" ] }, - "4201": { + "4147": { "op": "bnz apply_non_cash_event_bool_true@15", "stack_out": [ "aggregate%extract%2#0", @@ -38440,7 +38440,7 @@ "values%0#0" ] }, - "4204": { + "4150": { "op": "dig 4", "stack_out": [ "aggregate%extract%2#0", @@ -38456,7 +38456,7 @@ "event_type#0" ] }, - "4206": { + "4152": { "op": "pushint 5", "defined_out": [ "5", @@ -38480,7 +38480,7 @@ "5" ] }, - "4208": { + "4154": { "op": "==", "defined_out": [ "aggregate%extract%9#0", @@ -38503,7 +38503,7 @@ "tmp%5#2" ] }, - "4209": { + "4155": { "op": "bz apply_non_cash_event_bool_false@16", "stack_out": [ "aggregate%extract%2#0", @@ -38518,7 +38518,7 @@ "values%0#0" ] }, - "4212": { + "4158": { "block": "apply_non_cash_event_bool_true@15", "stack_in": [ "aggregate%extract%2#0", @@ -38550,7 +38550,7 @@ "or_result%0#0" ] }, - "4213": { + "4159": { "error": "Invalid event type", "block": "apply_non_cash_event_bool_merge@17", "stack_in": [ @@ -38581,7 +38581,7 @@ "values%0#0" ] }, - "4214": { + "4160": { "op": "dig 8", "defined_out": [ "aggregate%extract%9#0" @@ -38600,7 +38600,7 @@ "aggregate%extract%9#0" ] }, - "4216": { + "4162": { "op": "pushbytes 0x01", "defined_out": [ "0x01", @@ -38621,7 +38621,7 @@ "0x01" ] }, - "4219": { + "4165": { "op": "b!=", "defined_out": [ "aggregate%extract%9#0", @@ -38641,7 +38641,7 @@ "tmp%7#0" ] }, - "4220": { + "4166": { "error": "Invalid event type", "op": "assert // Invalid event type", "stack_out": [ @@ -38657,7 +38657,7 @@ "values%0#0" ] }, - "4221": { + "4167": { "op": "dig 4", "defined_out": [ "aggregate%extract%9#0", @@ -38677,7 +38677,7 @@ "event_type#0" ] }, - "4223": { + "4169": { "op": "pushint 12", "defined_out": [ "12", @@ -38699,7 +38699,7 @@ "12" ] }, - "4225": { + "4171": { "op": "==", "defined_out": [ "aggregate%extract%9#0", @@ -38720,7 +38720,7 @@ "tmp%0#3" ] }, - "4226": { + "4172": { "op": "bnz apply_non_cash_event_bool_true@21", "stack_out": [ "aggregate%extract%2#0", @@ -38735,7 +38735,7 @@ "values%0#0" ] }, - "4229": { + "4175": { "op": "dig 4", "stack_out": [ "aggregate%extract%2#0", @@ -38751,7 +38751,7 @@ "event_type#0" ] }, - "4231": { + "4177": { "op": "pushint 11", "defined_out": [ "11", @@ -38773,7 +38773,7 @@ "11" ] }, - "4233": { + "4179": { "op": "==", "defined_out": [ "aggregate%extract%9#0", @@ -38794,7 +38794,7 @@ "tmp%1#2" ] }, - "4234": { + "4180": { "op": "bz apply_non_cash_event_bool_false@22", "stack_out": [ "aggregate%extract%2#0", @@ -38809,7 +38809,7 @@ "values%0#0" ] }, - "4237": { + "4183": { "block": "apply_non_cash_event_bool_true@21", "stack_in": [ "aggregate%extract%2#0", @@ -38841,7 +38841,7 @@ "or_result%0#0" ] }, - "4238": { + "4184": { "block": "apply_non_cash_event_bool_merge@23", "stack_in": [ "aggregate%extract%2#0", @@ -38871,10 +38871,10 @@ "values%0#0" ] }, - "4241": { - "op": "bytec 25 // 0x52234f6273657276657223", + "4187": { + "op": "bytec 25 // 0x523a4d4f4323", "defined_out": [ - "0x52234f6273657276657223" + "0x523a4d4f4323" ], "stack_out": [ "aggregate%extract%2#0", @@ -38887,13 +38887,13 @@ "event_id#0", "payload#0", "values%0#0", - "0x52234f6273657276657223" + "0x523a4d4f4323" ] }, - "4243": { + "4189": { "op": "txn Sender", "defined_out": [ - "0x52234f6273657276657223", + "0x523a4d4f4323", "tmp%0#2" ], "stack_out": [ @@ -38907,11 +38907,11 @@ "event_id#0", "payload#0", "values%0#0", - "0x52234f6273657276657223", + "0x523a4d4f4323", "tmp%0#2" ] }, - "4245": { + "4191": { "callsub": "modules.rbac.RbacModule._role_is_active", "op": "callsub _role_is_active", "defined_out": [ @@ -38931,7 +38931,7 @@ "tmp%1#2" ] }, - "4248": { + "4194": { "error": "Not authorized", "op": "assert // Not authorized", "stack_out": [ @@ -38947,7 +38947,7 @@ "values%0#0" ] }, - "4249": { + "4195": { "block": "apply_non_cash_event_after_if_else@6", "stack_in": [ "aggregate%extract%2#0", @@ -38979,7 +38979,7 @@ "entry#0" ] }, - "4251": { + "4197": { "op": "dig 2", "defined_out": [ "entry#0", @@ -39000,11 +39000,11 @@ "payload#0" ] }, - "4253": { + "4199": { "callsub": "modules.actus_kernel.ActusKernelModule._apply_non_cash_schedule_entry", "op": "callsub _apply_non_cash_schedule_entry" }, - "4256": { + "4202": { "op": "popn 2", "stack_out": [ "aggregate%extract%2#0", @@ -39019,7 +39019,7 @@ "values%0#0" ] }, - "4258": { + "4204": { "op": "global LatestTimestamp", "defined_out": [ "entry#0", @@ -39040,7 +39040,7 @@ "tmp%10#0" ] }, - "4260": { + "4206": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%8#0", @@ -39061,7 +39061,7 @@ "aggregate%val_as_bytes%8#0" ] }, - "4261": { + "4207": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -39084,7 +39084,7 @@ "0x151f7c75" ] }, - "4262": { + "4208": { "op": "swap", "stack_out": [ "aggregate%extract%2#0", @@ -39101,7 +39101,7 @@ "aggregate%val_as_bytes%8#0" ] }, - "4263": { + "4209": { "op": "concat", "defined_out": [ "entry#0", @@ -39122,7 +39122,7 @@ "tmp%5#0" ] }, - "4264": { + "4210": { "op": "log", "stack_out": [ "aggregate%extract%2#0", @@ -39137,7 +39137,7 @@ "values%0#0" ] }, - "4265": { + "4211": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -39158,7 +39158,7 @@ "1" ] }, - "4266": { + "4212": { "op": "return", "stack_out": [ "aggregate%extract%2#0", @@ -39173,7 +39173,7 @@ "values%0#0" ] }, - "4267": { + "4213": { "block": "apply_non_cash_event_else_body@5", "stack_in": [ "aggregate%extract%2#0", @@ -39190,10 +39190,10 @@ "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", "op": "callsub _assert_caller_is_arranger" }, - "4270": { + "4216": { "op": "b apply_non_cash_event_after_if_else@6" }, - "4273": { + "4219": { "block": "apply_non_cash_event_bool_false@22", "stack_in": [ "aggregate%extract%2#0", @@ -39225,10 +39225,10 @@ "or_result%0#0" ] }, - "4274": { + "4220": { "op": "b apply_non_cash_event_bool_merge@23" }, - "4277": { + "4223": { "block": "apply_non_cash_event_bool_false@16", "stack_in": [ "aggregate%extract%2#0", @@ -39260,10 +39260,10 @@ "or_result%0#0" ] }, - "4278": { + "4224": { "op": "b apply_non_cash_event_bool_merge@17" }, - "4281": { + "4227": { "subroutine": "modules.actus_kernel.ActusKernelModule.append_observed_cash_event[routing]", "params": {}, "block": "append_observed_cash_event", @@ -39273,17 +39273,17 @@ "box_prefixed_key%0#0" ] }, - "4282": { + "4228": { "op": "dup", "stack_out": [ "box_prefixed_key%0#0", "page#0" ] }, - "4283": { + "4229": { "op": "txna ApplicationArgs 1" }, - "4286": { + "4232": { "op": "dupn 2", "defined_out": [ "payload#0", @@ -39297,7 +39297,7 @@ "payload#0 (copy)" ] }, - "4288": { + "4234": { "op": "len", "defined_out": [ "len%0#0", @@ -39311,7 +39311,7 @@ "len%0#0" ] }, - "4289": { + "4235": { "op": "pushint 65", "defined_out": [ "65", @@ -39327,7 +39327,7 @@ "65" ] }, - "4291": { + "4237": { "op": "==", "defined_out": [ "eq%0#0", @@ -39341,7 +39341,7 @@ "eq%0#0" ] }, - "4292": { + "4238": { "error": "invalid number of bytes for smart_contracts.abi_types.ObservedCashEventRequest", "op": "assert // invalid number of bytes for smart_contracts.abi_types.ObservedCashEventRequest", "stack_out": [ @@ -39351,7 +39351,7 @@ "payload#0" ] }, - "4293": { + "4239": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#0", @@ -39361,7 +39361,7 @@ "0" ] }, - "4294": { + "4240": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"", @@ -39377,7 +39377,7 @@ "\"status\"" ] }, - "4295": { + "4241": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -39393,7 +39393,7 @@ "maybe_exists%0#0" ] }, - "4296": { + "4242": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ @@ -39404,7 +39404,7 @@ "maybe_value%0#0" ] }, - "4297": { + "4243": { "error": "D-ASA not configured", "op": "assert // D-ASA not configured", "stack_out": [ @@ -39414,19 +39414,19 @@ "payload#0" ] }, - "4298": { + "4244": { "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", "op": "callsub _assert_caller_is_arranger" }, - "4301": { + "4247": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", "op": "callsub _assert_is_not_asset_defaulted" }, - "4304": { + "4250": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_suspended", "op": "callsub _assert_is_not_asset_suspended" }, - "4307": { + "4253": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#0", @@ -39436,7 +39436,7 @@ "0" ] }, - "4308": { + "4254": { "op": "bytec_1 // \"status\"", "stack_out": [ "box_prefixed_key%0#0", @@ -39447,7 +39447,7 @@ "\"status\"" ] }, - "4309": { + "4255": { "op": "app_global_get_ex", "stack_out": [ "box_prefixed_key%0#0", @@ -39458,7 +39458,7 @@ "maybe_exists%0#0" ] }, - "4310": { + "4256": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ @@ -39469,7 +39469,7 @@ "maybe_value%0#0" ] }, - "4311": { + "4257": { "op": "pushint 50", "defined_out": [ "50", @@ -39485,7 +39485,7 @@ "50" ] }, - "4313": { + "4259": { "op": "==", "defined_out": [ "payload#0", @@ -39499,7 +39499,7 @@ "tmp%0#5" ] }, - "4314": { + "4260": { "op": "!", "defined_out": [ "payload#0", @@ -39513,7 +39513,7 @@ "tmp%1#0" ] }, - "4315": { + "4261": { "error": "IED not yet executed", "op": "assert // IED not yet executed", "stack_out": [ @@ -39523,7 +39523,7 @@ "payload#0" ] }, - "4316": { + "4262": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#0", @@ -39533,7 +39533,7 @@ "0" ] }, - "4317": { + "4263": { "op": "bytec 10 // \"contract_type\"", "defined_out": [ "\"contract_type\"", @@ -39549,7 +39549,7 @@ "\"contract_type\"" ] }, - "4319": { + "4265": { "op": "app_global_get_ex", "stack_out": [ "box_prefixed_key%0#0", @@ -39560,7 +39560,7 @@ "maybe_exists%0#0" ] }, - "4320": { + "4266": { "error": "check self.contract_type exists", "op": "assert // check self.contract_type exists", "stack_out": [ @@ -39571,7 +39571,7 @@ "maybe_value%0#0" ] }, - "4321": { + "4267": { "op": "pushint 5", "defined_out": [ "5", @@ -39587,7 +39587,7 @@ "5" ] }, - "4323": { + "4269": { "op": "==", "stack_out": [ "box_prefixed_key%0#0", @@ -39597,7 +39597,7 @@ "tmp%0#5" ] }, - "4324": { + "4270": { "error": "Observed event required to execute this action", "op": "assert // Observed event required to execute this action", "stack_out": [ @@ -39607,7 +39607,7 @@ "payload#0" ] }, - "4325": { + "4271": { "op": "dup", "stack_out": [ "box_prefixed_key%0#0", @@ -39617,7 +39617,7 @@ "payload#0 (copy)" ] }, - "4326": { + "4272": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#0", @@ -39628,7 +39628,7 @@ "0" ] }, - "4327": { + "4273": { "op": "extract_uint64", "defined_out": [ "payload#0", @@ -39642,7 +39642,7 @@ "values%0#0" ] }, - "4328": { + "4274": { "op": "dup", "stack_out": [ "box_prefixed_key%0#0", @@ -39653,7 +39653,7 @@ "values%0#0" ] }, - "4329": { + "4275": { "op": "cover 2", "defined_out": [ "payload#0", @@ -39668,7 +39668,7 @@ "values%0#0" ] }, - "4331": { + "4277": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#0", @@ -39680,7 +39680,7 @@ "0" ] }, - "4332": { + "4278": { "op": "bytec_3 // \"schedule_entry_count\"", "defined_out": [ "\"schedule_entry_count\"", @@ -39699,7 +39699,7 @@ "\"schedule_entry_count\"" ] }, - "4333": { + "4279": { "op": "app_global_get_ex", "stack_out": [ "box_prefixed_key%0#0", @@ -39712,7 +39712,7 @@ "maybe_exists%0#0" ] }, - "4334": { + "4280": { "error": "check self.schedule_entry_count exists", "op": "assert // check self.schedule_entry_count exists", "stack_out": [ @@ -39725,7 +39725,7 @@ "maybe_value%0#0" ] }, - "4335": { + "4281": { "op": "swap", "stack_out": [ "box_prefixed_key%0#0", @@ -39737,7 +39737,7 @@ "values%0#0" ] }, - "4336": { + "4282": { "op": "dig 1", "defined_out": [ "maybe_value%0#0", @@ -39756,7 +39756,7 @@ "maybe_value%0#0 (copy)" ] }, - "4338": { + "4284": { "op": "==", "stack_out": [ "box_prefixed_key%0#0", @@ -39768,7 +39768,7 @@ "tmp%1#0" ] }, - "4339": { + "4285": { "error": "Invalid event id", "op": "assert // Invalid event id", "stack_out": [ @@ -39780,7 +39780,7 @@ "maybe_value%0#0" ] }, - "4340": { + "4286": { "op": "dig 1", "stack_out": [ "box_prefixed_key%0#0", @@ -39792,7 +39792,7 @@ "payload#0 (copy)" ] }, - "4342": { + "4288": { "op": "extract 8 1", "defined_out": [ "aggregate%extract%1#0", @@ -39810,7 +39810,7 @@ "aggregate%extract%1#0" ] }, - "4345": { + "4291": { "op": "dup", "stack_out": [ "box_prefixed_key%0#0", @@ -39823,7 +39823,7 @@ "aggregate%extract%1#0" ] }, - "4346": { + "4292": { "op": "cover 3", "defined_out": [ "aggregate%extract%1#0", @@ -39842,7 +39842,7 @@ "aggregate%extract%1#0" ] }, - "4348": { + "4294": { "op": "pushbytes 0x03", "defined_out": [ "0x03", @@ -39863,7 +39863,7 @@ "0x03" ] }, - "4351": { + "4297": { "op": "b==", "defined_out": [ "aggregate%extract%1#0", @@ -39883,7 +39883,7 @@ "tmp%2#1" ] }, - "4352": { + "4298": { "error": "Invalid event type", "op": "assert // Invalid event type", "stack_out": [ @@ -39896,7 +39896,7 @@ "maybe_value%0#0" ] }, - "4353": { + "4299": { "op": "swap", "stack_out": [ "box_prefixed_key%0#0", @@ -39908,7 +39908,7 @@ "payload#0" ] }, - "4354": { + "4300": { "op": "pushint 57", "defined_out": [ "57", @@ -39928,7 +39928,7 @@ "57" ] }, - "4356": { + "4302": { "op": "extract_uint64", "defined_out": [ "aggregate%extract%1#0", @@ -39947,7 +39947,7 @@ "values%1#0" ] }, - "4357": { + "4303": { "op": "dup", "stack_out": [ "box_prefixed_key%0#0", @@ -39960,7 +39960,7 @@ "values%1#0" ] }, - "4358": { + "4304": { "op": "cover 2", "stack_out": [ "box_prefixed_key%0#0", @@ -39973,7 +39973,7 @@ "values%1#0" ] }, - "4360": { + "4306": { "op": "intc_1 // 1", "stack_out": [ "box_prefixed_key%0#0", @@ -39987,7 +39987,7 @@ "1" ] }, - "4361": { + "4307": { "op": "&", "defined_out": [ "aggregate%extract%1#0", @@ -40008,7 +40008,7 @@ "tmp%3#1" ] }, - "4362": { + "4308": { "error": "Invalid ACTUS configuration", "op": "assert // Invalid ACTUS configuration", "stack_out": [ @@ -40021,7 +40021,7 @@ "maybe_value%0#0" ] }, - "4363": { + "4309": { "op": "bz append_observed_cash_event_after_if_else@3", "stack_out": [ "box_prefixed_key%0#0", @@ -40032,7 +40032,7 @@ "values%1#0" ] }, - "4366": { + "4312": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#0", @@ -40044,7 +40044,7 @@ "0" ] }, - "4367": { + "4313": { "op": "bytec_3 // \"schedule_entry_count\"", "stack_out": [ "box_prefixed_key%0#0", @@ -40057,7 +40057,7 @@ "\"schedule_entry_count\"" ] }, - "4368": { + "4314": { "op": "app_global_get_ex", "defined_out": [ "aggregate%extract%1#0", @@ -40078,7 +40078,7 @@ "maybe_exists%2#0" ] }, - "4369": { + "4315": { "error": "check self.schedule_entry_count exists", "op": "assert // check self.schedule_entry_count exists", "stack_out": [ @@ -40091,7 +40091,7 @@ "maybe_value%2#0" ] }, - "4370": { + "4316": { "op": "intc_1 // 1", "stack_out": [ "box_prefixed_key%0#0", @@ -40104,7 +40104,7 @@ "1" ] }, - "4371": { + "4317": { "op": "-", "defined_out": [ "aggregate%extract%1#0", @@ -40123,7 +40123,7 @@ "tmp%6#0" ] }, - "4372": { + "4318": { "callsub": "modules.actus_kernel.ActusKernelModule._get_schedule_entry", "op": "callsub _get_schedule_entry", "defined_out": [ @@ -40143,7 +40143,7 @@ "previous_entry#0" ] }, - "4375": { + "4321": { "op": "pushint 9", "defined_out": [ "9", @@ -40164,7 +40164,7 @@ "9" ] }, - "4377": { + "4323": { "op": "extract_uint64", "defined_out": [ "aggregate%extract%1#0", @@ -40183,7 +40183,7 @@ "values%2#0" ] }, - "4378": { + "4324": { "op": "dig 4", "stack_out": [ "box_prefixed_key%0#0", @@ -40196,7 +40196,7 @@ "payload#0" ] }, - "4380": { + "4326": { "op": "pushint 9", "stack_out": [ "box_prefixed_key%0#0", @@ -40210,7 +40210,7 @@ "9" ] }, - "4382": { + "4328": { "op": "extract_uint64", "defined_out": [ "aggregate%extract%1#0", @@ -40231,7 +40231,7 @@ "values%3#0" ] }, - "4383": { + "4329": { "op": "<=", "defined_out": [ "aggregate%extract%1#0", @@ -40250,7 +40250,7 @@ "tmp%8#0" ] }, - "4384": { + "4330": { "error": "Time events must be sorted in strictly ascending order", "op": "assert // Time events must be sorted in strictly ascending order", "stack_out": [ @@ -40262,7 +40262,7 @@ "values%1#0" ] }, - "4385": { + "4331": { "block": "append_observed_cash_event_after_if_else@3", "stack_in": [ "box_prefixed_key%0#0", @@ -40286,7 +40286,7 @@ "0" ] }, - "4386": { + "4332": { "op": "bytec_3 // \"schedule_entry_count\"", "defined_out": [ "\"schedule_entry_count\"", @@ -40303,7 +40303,7 @@ "\"schedule_entry_count\"" ] }, - "4387": { + "4333": { "op": "app_global_get_ex", "defined_out": [ "event_id#0", @@ -40320,7 +40320,7 @@ "maybe_exists%3#0" ] }, - "4388": { + "4334": { "error": "check self.schedule_entry_count exists", "op": "assert // check self.schedule_entry_count exists", "stack_out": [ @@ -40333,7 +40333,7 @@ "event_id#0" ] }, - "4389": { + "4335": { "op": "pushint 16", "defined_out": [ "16", @@ -40350,7 +40350,7 @@ "16" ] }, - "4391": { + "4337": { "op": "/", "defined_out": [ "page_index#0" @@ -40365,7 +40365,7 @@ "page_index#0" ] }, - "4392": { + "4338": { "op": "bytec 48 // 0x0000", "defined_out": [ "page#0", @@ -40382,7 +40382,7 @@ "page#0" ] }, - "4394": { + "4340": { "op": "bury 6", "defined_out": [ "page#0", @@ -40398,7 +40398,7 @@ "page_index#0" ] }, - "4396": { + "4342": { "op": "itob", "defined_out": [ "encoded_value%0#0", @@ -40414,7 +40414,7 @@ "encoded_value%0#0" ] }, - "4397": { + "4343": { "op": "bytec 24 // 0x5323", "defined_out": [ "0x5323", @@ -40432,7 +40432,7 @@ "0x5323" ] }, - "4399": { + "4345": { "op": "swap", "stack_out": [ "box_prefixed_key%0#0", @@ -40445,7 +40445,7 @@ "encoded_value%0#0" ] }, - "4400": { + "4346": { "op": "concat", "defined_out": [ "box_prefixed_key%0#0", @@ -40461,7 +40461,7 @@ "box_prefixed_key%0#0" ] }, - "4401": { + "4347": { "op": "dup", "stack_out": [ "box_prefixed_key%0#0", @@ -40474,7 +40474,7 @@ "box_prefixed_key%0#0" ] }, - "4402": { + "4348": { "op": "bury 7", "defined_out": [ "box_prefixed_key%0#0", @@ -40490,7 +40490,7 @@ "box_prefixed_key%0#0" ] }, - "4404": { + "4350": { "op": "box_len", "defined_out": [ "_%0#0", @@ -40509,7 +40509,7 @@ "maybe_exists%4#0" ] }, - "4405": { + "4351": { "op": "bury 1", "stack_out": [ "box_prefixed_key%0#0", @@ -40521,7 +40521,7 @@ "maybe_exists%4#0" ] }, - "4407": { + "4353": { "op": "bz append_observed_cash_event_after_if_else@5", "stack_out": [ "box_prefixed_key%0#0", @@ -40532,7 +40532,7 @@ "values%1#0" ] }, - "4410": { + "4356": { "op": "dig 5", "stack_out": [ "box_prefixed_key%0#0", @@ -40544,7 +40544,7 @@ "box_prefixed_key%0#0" ] }, - "4412": { + "4358": { "op": "box_get", "defined_out": [ "aggregate%box_get%1#0", @@ -40562,7 +40562,7 @@ "aggregate%box_get%1#0" ] }, - "4413": { + "4359": { "op": "swap", "stack_out": [ "box_prefixed_key%0#0", @@ -40575,7 +40575,7 @@ "page#0" ] }, - "4414": { + "4360": { "op": "bury 6", "stack_out": [ "box_prefixed_key%0#0", @@ -40587,7 +40587,7 @@ "aggregate%box_get%1#0" ] }, - "4416": { + "4362": { "error": "check self.schedule_page entry exists", "op": "assert // check self.schedule_page entry exists", "stack_out": [ @@ -40599,7 +40599,7 @@ "values%1#0" ] }, - "4417": { + "4363": { "block": "append_observed_cash_event_after_if_else@5", "stack_in": [ "box_prefixed_key%0#0", @@ -40623,7 +40623,7 @@ "page#0" ] }, - "4419": { + "4365": { "op": "dup", "defined_out": [ "page#0", @@ -40640,7 +40640,7 @@ "page#0 (copy)" ] }, - "4420": { + "4366": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -40659,7 +40659,7 @@ "0" ] }, - "4421": { + "4367": { "error": "invalid array length header", "op": "extract_uint16 // on error: invalid array length header", "defined_out": [ @@ -40677,7 +40677,7 @@ "aggregate%array_length%0#0" ] }, - "4422": { + "4368": { "op": "dup", "defined_out": [ "aggregate%array_length%0#0", @@ -40696,7 +40696,7 @@ "aggregate%array_length%0#0 (copy)" ] }, - "4423": { + "4369": { "op": "pushint 16", "defined_out": [ "16", @@ -40717,7 +40717,7 @@ "16" ] }, - "4425": { + "4371": { "op": "<", "defined_out": [ "aggregate%array_length%0#0", @@ -40736,7 +40736,7 @@ "tmp%11#0" ] }, - "4426": { + "4372": { "error": "Invalid schedule page", "op": "assert // Invalid schedule page", "stack_out": [ @@ -40750,7 +40750,7 @@ "aggregate%array_length%0#0" ] }, - "4427": { + "4373": { "op": "dig 5", "defined_out": [ "aggregate%array_length%0#0", @@ -40769,7 +40769,7 @@ "payload#0" ] }, - "4429": { + "4375": { "op": "dup", "defined_out": [ "aggregate%array_length%0#0", @@ -40790,7 +40790,7 @@ "payload#0 (copy)" ] }, - "4430": { + "4376": { "op": "extract 9 8", "defined_out": [ "aggregate%array_length%0#0", @@ -40811,7 +40811,7 @@ "aggregate%extract%5#0" ] }, - "4433": { + "4379": { "op": "dig 1", "stack_out": [ "box_prefixed_key%0#0", @@ -40827,7 +40827,7 @@ "payload#0 (copy)" ] }, - "4435": { + "4381": { "op": "extract 17 8", "defined_out": [ "aggregate%array_length%0#0", @@ -40850,7 +40850,7 @@ "aggregate%extract%6#0" ] }, - "4438": { + "4384": { "op": "dig 2", "stack_out": [ "box_prefixed_key%0#0", @@ -40867,7 +40867,7 @@ "payload#0 (copy)" ] }, - "4440": { + "4386": { "op": "extract 25 8", "defined_out": [ "aggregate%array_length%0#0", @@ -40892,7 +40892,7 @@ "aggregate%extract%7#0" ] }, - "4443": { + "4389": { "op": "dig 3", "stack_out": [ "box_prefixed_key%0#0", @@ -40910,7 +40910,7 @@ "payload#0 (copy)" ] }, - "4445": { + "4391": { "op": "extract 33 8", "defined_out": [ "aggregate%array_length%0#0", @@ -40937,7 +40937,7 @@ "aggregate%extract%8#0" ] }, - "4448": { + "4394": { "op": "dig 4", "stack_out": [ "box_prefixed_key%0#0", @@ -40956,7 +40956,7 @@ "payload#0 (copy)" ] }, - "4450": { + "4396": { "op": "extract 41 8", "defined_out": [ "aggregate%array_length%0#0", @@ -40985,7 +40985,7 @@ "aggregate%extract%9#0" ] }, - "4453": { + "4399": { "op": "uncover 5", "stack_out": [ "box_prefixed_key%0#0", @@ -41004,7 +41004,7 @@ "payload#0" ] }, - "4455": { + "4401": { "op": "extract 49 8", "defined_out": [ "aggregate%array_length%0#0", @@ -41034,7 +41034,7 @@ "aggregate%extract%10#0" ] }, - "4458": { + "4404": { "op": "dig 10", "defined_out": [ "aggregate%array_length%0#0", @@ -41066,7 +41066,7 @@ "values%0#0" ] }, - "4460": { + "4406": { "op": "itob", "defined_out": [ "aggregate%array_length%0#0", @@ -41099,7 +41099,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "4461": { + "4407": { "op": "dig 10", "defined_out": [ "aggregate%array_length%0#0", @@ -41134,7 +41134,7 @@ "aggregate%extract%1#0" ] }, - "4463": { + "4409": { "op": "concat", "defined_out": [ "aggregate%array_length%0#0", @@ -41168,7 +41168,7 @@ "aggregate%head%1#0" ] }, - "4464": { + "4410": { "op": "uncover 6", "stack_out": [ "box_prefixed_key%0#0", @@ -41188,7 +41188,7 @@ "aggregate%extract%5#0" ] }, - "4466": { + "4412": { "op": "concat", "defined_out": [ "aggregate%array_length%0#0", @@ -41220,7 +41220,7 @@ "aggregate%head%2#0" ] }, - "4467": { + "4413": { "op": "uncover 5", "stack_out": [ "box_prefixed_key%0#0", @@ -41239,7 +41239,7 @@ "aggregate%extract%6#0" ] }, - "4469": { + "4415": { "op": "concat", "defined_out": [ "aggregate%array_length%0#0", @@ -41269,7 +41269,7 @@ "aggregate%head%3#0" ] }, - "4470": { + "4416": { "op": "uncover 4", "stack_out": [ "box_prefixed_key%0#0", @@ -41287,7 +41287,7 @@ "aggregate%extract%7#0" ] }, - "4472": { + "4418": { "op": "concat", "defined_out": [ "aggregate%array_length%0#0", @@ -41315,7 +41315,7 @@ "aggregate%head%4#0" ] }, - "4473": { + "4419": { "op": "uncover 3", "stack_out": [ "box_prefixed_key%0#0", @@ -41332,7 +41332,7 @@ "aggregate%extract%8#0" ] }, - "4475": { + "4421": { "op": "concat", "defined_out": [ "aggregate%array_length%0#0", @@ -41358,7 +41358,7 @@ "aggregate%head%5#0" ] }, - "4476": { + "4422": { "op": "uncover 2", "stack_out": [ "box_prefixed_key%0#0", @@ -41374,7 +41374,7 @@ "aggregate%extract%9#0" ] }, - "4478": { + "4424": { "op": "concat", "defined_out": [ "aggregate%array_length%0#0", @@ -41398,7 +41398,7 @@ "aggregate%head%6#0" ] }, - "4479": { + "4425": { "op": "swap", "stack_out": [ "box_prefixed_key%0#0", @@ -41413,7 +41413,7 @@ "aggregate%extract%10#0" ] }, - "4480": { + "4426": { "op": "concat", "defined_out": [ "aggregate%array_length%0#0", @@ -41435,7 +41435,7 @@ "aggregate%head%7#0" ] }, - "4481": { + "4427": { "op": "dig 3", "defined_out": [ "aggregate%array_length%0#0", @@ -41459,7 +41459,7 @@ "values%1#0" ] }, - "4483": { + "4429": { "op": "itob", "defined_out": [ "aggregate%array_length%0#0", @@ -41484,7 +41484,7 @@ "aggregate%val_as_bytes%7#0" ] }, - "4484": { + "4430": { "op": "concat", "defined_out": [ "aggregate%array_length%0#0", @@ -41507,7 +41507,7 @@ "aggregate%head%8#0" ] }, - "4485": { + "4431": { "op": "uncover 2", "stack_out": [ "box_prefixed_key%0#0", @@ -41521,7 +41521,7 @@ "page#0" ] }, - "4487": { + "4433": { "op": "swap", "stack_out": [ "box_prefixed_key%0#0", @@ -41535,7 +41535,7 @@ "aggregate%head%8#0" ] }, - "4488": { + "4434": { "error": "max array length exceeded", "op": "concat // on error: max array length exceeded", "defined_out": [ @@ -41558,7 +41558,7 @@ "concat%0#0" ] }, - "4489": { + "4435": { "op": "swap", "stack_out": [ "box_prefixed_key%0#0", @@ -41571,7 +41571,7 @@ "aggregate%array_length%0#0" ] }, - "4490": { + "4436": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -41595,7 +41595,7 @@ "1" ] }, - "4491": { + "4437": { "op": "+", "defined_out": [ "add%0#0", @@ -41617,7 +41617,7 @@ "add%0#0" ] }, - "4492": { + "4438": { "op": "itob", "defined_out": [ "aggregate%extract%1#0", @@ -41639,7 +41639,7 @@ "as_bytes%0#0" ] }, - "4493": { + "4439": { "op": "extract 6 2", "defined_out": [ "aggregate%extract%1#0", @@ -41661,7 +41661,7 @@ "as_u16_bytes%0#0" ] }, - "4496": { + "4442": { "op": "replace2 0", "stack_out": [ "box_prefixed_key%0#0", @@ -41673,7 +41673,7 @@ "page#0" ] }, - "4498": { + "4444": { "op": "dig 6", "defined_out": [ "aggregate%extract%1#0", @@ -41694,7 +41694,7 @@ "box_prefixed_key%0#0" ] }, - "4500": { + "4446": { "op": "dup", "defined_out": [ "aggregate%extract%1#0", @@ -41717,7 +41717,7 @@ "box_prefixed_key%0#0 (copy)" ] }, - "4501": { + "4447": { "op": "box_del", "defined_out": [ "aggregate%extract%1#0", @@ -41740,7 +41740,7 @@ "{box_del}" ] }, - "4502": { + "4448": { "op": "pop", "stack_out": [ "box_prefixed_key%0#0", @@ -41753,7 +41753,7 @@ "box_prefixed_key%0#0" ] }, - "4503": { + "4449": { "op": "swap", "stack_out": [ "box_prefixed_key%0#0", @@ -41766,7 +41766,7 @@ "page#0" ] }, - "4504": { + "4450": { "op": "box_put", "stack_out": [ "box_prefixed_key%0#0", @@ -41777,7 +41777,7 @@ "values%1#0" ] }, - "4505": { + "4451": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#0", @@ -41789,7 +41789,7 @@ "0" ] }, - "4506": { + "4452": { "op": "bytec_3 // \"schedule_entry_count\"", "defined_out": [ "\"schedule_entry_count\"", @@ -41812,7 +41812,7 @@ "\"schedule_entry_count\"" ] }, - "4507": { + "4453": { "op": "app_global_get_ex", "defined_out": [ "aggregate%extract%1#0", @@ -41835,7 +41835,7 @@ "maybe_exists%5#0" ] }, - "4508": { + "4454": { "error": "check self.schedule_entry_count exists", "op": "assert // check self.schedule_entry_count exists", "stack_out": [ @@ -41848,7 +41848,7 @@ "maybe_value%4#0" ] }, - "4509": { + "4455": { "op": "intc_1 // 1", "stack_out": [ "box_prefixed_key%0#0", @@ -41861,7 +41861,7 @@ "1" ] }, - "4510": { + "4456": { "op": "+", "defined_out": [ "aggregate%extract%1#0", @@ -41882,7 +41882,7 @@ "tmp%14#0" ] }, - "4511": { + "4457": { "op": "bytec_3 // \"schedule_entry_count\"", "stack_out": [ "box_prefixed_key%0#0", @@ -41895,7 +41895,7 @@ "\"schedule_entry_count\"" ] }, - "4512": { + "4458": { "op": "swap", "stack_out": [ "box_prefixed_key%0#0", @@ -41908,7 +41908,7 @@ "tmp%14#0" ] }, - "4513": { + "4459": { "op": "app_global_put", "stack_out": [ "box_prefixed_key%0#0", @@ -41919,7 +41919,7 @@ "values%1#0" ] }, - "4514": { + "4460": { "op": "global LatestTimestamp", "defined_out": [ "aggregate%extract%1#0", @@ -41940,7 +41940,7 @@ "tmp%0#1" ] }, - "4516": { + "4462": { "op": "itob", "defined_out": [ "aggregate%extract%1#0", @@ -41961,7 +41961,7 @@ "aggregate%val_as_bytes%8#0" ] }, - "4517": { + "4463": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -41984,7 +41984,7 @@ "0x151f7c75" ] }, - "4518": { + "4464": { "op": "swap", "stack_out": [ "box_prefixed_key%0#0", @@ -41997,7 +41997,7 @@ "aggregate%val_as_bytes%8#0" ] }, - "4519": { + "4465": { "op": "concat", "defined_out": [ "aggregate%extract%1#0", @@ -42018,7 +42018,7 @@ "tmp%3#0" ] }, - "4520": { + "4466": { "op": "log", "stack_out": [ "box_prefixed_key%0#0", @@ -42029,7 +42029,7 @@ "values%1#0" ] }, - "4521": { + "4467": { "op": "intc_1 // 1", "stack_out": [ "box_prefixed_key%0#0", @@ -42041,7 +42041,7 @@ "1" ] }, - "4522": { + "4468": { "op": "return", "stack_out": [ "box_prefixed_key%0#0", @@ -42052,7 +42052,7 @@ "values%1#0" ] }, - "4523": { + "4469": { "subroutine": "modules.actus_kernel.ActusKernelModule.contract_get_state[routing]", "params": {}, "block": "contract_get_state", @@ -42065,7 +42065,7 @@ "0" ] }, - "4524": { + "4470": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"", @@ -42076,7 +42076,7 @@ "\"status\"" ] }, - "4525": { + "4471": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -42087,14 +42087,14 @@ "maybe_exists%0#0" ] }, - "4526": { + "4472": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ "maybe_value%0#1" ] }, - "4527": { + "4473": { "op": "dup", "defined_out": [ "maybe_value%0#1", @@ -42105,21 +42105,21 @@ "maybe_value%0#1 (copy)" ] }, - "4528": { + "4474": { "error": "D-ASA not configured", "op": "assert // D-ASA not configured", "stack_out": [ "maybe_value%0#1" ] }, - "4529": { + "4475": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#1", "0" ] }, - "4530": { + "4476": { "op": "bytec 10 // \"contract_type\"", "defined_out": [ "\"contract_type\"", @@ -42132,7 +42132,7 @@ "\"contract_type\"" ] }, - "4532": { + "4478": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -42145,7 +42145,7 @@ "maybe_exists%0#0" ] }, - "4533": { + "4479": { "error": "check self.contract_type exists", "op": "assert // check self.contract_type exists", "stack_out": [ @@ -42153,7 +42153,7 @@ "maybe_value%0#0" ] }, - "4534": { + "4480": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0", @@ -42164,7 +42164,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "4535": { + "4481": { "op": "dup", "defined_out": [ "aggregate%val_as_bytes%0#0", @@ -42177,7 +42177,7 @@ "aggregate%val_as_bytes%0#0 (copy)" ] }, - "4536": { + "4482": { "op": "bitlen", "defined_out": [ "aggregate%bitlen%0#0", @@ -42190,7 +42190,7 @@ "aggregate%bitlen%0#0" ] }, - "4537": { + "4483": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -42205,7 +42205,7 @@ "8" ] }, - "4538": { + "4484": { "op": "<=", "defined_out": [ "aggregate%no_overflow%0#0", @@ -42218,7 +42218,7 @@ "aggregate%no_overflow%0#0" ] }, - "4539": { + "4485": { "error": "overflow", "op": "assert // overflow", "stack_out": [ @@ -42226,7 +42226,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "4540": { + "4486": { "op": "extract 7 1", "defined_out": [ "aggregate%uint8%0#0", @@ -42237,7 +42237,7 @@ "aggregate%uint8%0#0" ] }, - "4543": { + "4489": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#1", @@ -42245,7 +42245,7 @@ "0" ] }, - "4544": { + "4490": { "op": "bytec 13 // \"total_units\"", "defined_out": [ "\"total_units\"", @@ -42260,7 +42260,7 @@ "\"total_units\"" ] }, - "4546": { + "4492": { "op": "app_global_get_ex", "defined_out": [ "aggregate%uint8%0#0", @@ -42275,7 +42275,7 @@ "maybe_exists%2#0" ] }, - "4547": { + "4493": { "error": "check self.total_units exists", "op": "assert // check self.total_units exists", "stack_out": [ @@ -42284,7 +42284,7 @@ "maybe_value%2#0" ] }, - "4548": { + "4494": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#1", @@ -42293,7 +42293,7 @@ "0" ] }, - "4549": { + "4495": { "op": "bytec 11 // \"reserved_units_total\"", "defined_out": [ "\"reserved_units_total\"", @@ -42310,7 +42310,7 @@ "\"reserved_units_total\"" ] }, - "4551": { + "4497": { "op": "app_global_get_ex", "defined_out": [ "aggregate%uint8%0#0", @@ -42327,7 +42327,7 @@ "maybe_exists%3#0" ] }, - "4552": { + "4498": { "error": "check self.reserved_units_total exists", "op": "assert // check self.reserved_units_total exists", "stack_out": [ @@ -42337,7 +42337,7 @@ "maybe_value%3#0" ] }, - "4553": { + "4499": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#1", @@ -42347,7 +42347,7 @@ "0" ] }, - "4554": { + "4500": { "op": "bytec 20 // \"initial_exchange_amount\"", "defined_out": [ "\"initial_exchange_amount\"", @@ -42366,7 +42366,7 @@ "\"initial_exchange_amount\"" ] }, - "4556": { + "4502": { "op": "app_global_get_ex", "defined_out": [ "aggregate%uint8%0#0", @@ -42385,7 +42385,7 @@ "maybe_exists%4#0" ] }, - "4557": { + "4503": { "error": "check self.initial_exchange_amount exists", "op": "assert // check self.initial_exchange_amount exists", "stack_out": [ @@ -42396,7 +42396,7 @@ "maybe_value%4#0" ] }, - "4558": { + "4504": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#1", @@ -42407,7 +42407,7 @@ "0" ] }, - "4559": { + "4505": { "op": "bytec_2 // \"event_cursor\"", "defined_out": [ "\"event_cursor\"", @@ -42428,7 +42428,7 @@ "\"event_cursor\"" ] }, - "4560": { + "4506": { "op": "app_global_get_ex", "defined_out": [ "aggregate%uint8%0#0", @@ -42449,7 +42449,7 @@ "maybe_exists%5#0" ] }, - "4561": { + "4507": { "error": "check self.event_cursor exists", "op": "assert // check self.event_cursor exists", "stack_out": [ @@ -42461,7 +42461,7 @@ "maybe_value%5#0" ] }, - "4562": { + "4508": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#1", @@ -42473,7 +42473,7 @@ "0" ] }, - "4563": { + "4509": { "op": "bytec_3 // \"schedule_entry_count\"", "defined_out": [ "\"schedule_entry_count\"", @@ -42496,7 +42496,7 @@ "\"schedule_entry_count\"" ] }, - "4564": { + "4510": { "op": "app_global_get_ex", "defined_out": [ "aggregate%uint8%0#0", @@ -42519,7 +42519,7 @@ "maybe_exists%6#0" ] }, - "4565": { + "4511": { "error": "check self.schedule_entry_count exists", "op": "assert // check self.schedule_entry_count exists", "stack_out": [ @@ -42532,7 +42532,7 @@ "maybe_value%6#0" ] }, - "4566": { + "4512": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#1", @@ -42545,7 +42545,7 @@ "0" ] }, - "4567": { + "4513": { "op": "bytec 4 // \"outstanding_principal\"", "defined_out": [ "\"outstanding_principal\"", @@ -42570,7 +42570,7 @@ "\"outstanding_principal\"" ] }, - "4569": { + "4515": { "op": "app_global_get_ex", "defined_out": [ "aggregate%uint8%0#0", @@ -42595,7 +42595,7 @@ "maybe_exists%7#0" ] }, - "4570": { + "4516": { "error": "check self.outstanding_principal exists", "op": "assert // check self.outstanding_principal exists", "stack_out": [ @@ -42609,7 +42609,7 @@ "maybe_value%7#0" ] }, - "4571": { + "4517": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#1", @@ -42623,7 +42623,7 @@ "0" ] }, - "4572": { + "4518": { "op": "bytec 7 // \"interest_calculation_base\"", "defined_out": [ "\"interest_calculation_base\"", @@ -42650,7 +42650,7 @@ "\"interest_calculation_base\"" ] }, - "4574": { + "4520": { "op": "app_global_get_ex", "defined_out": [ "aggregate%uint8%0#0", @@ -42677,7 +42677,7 @@ "maybe_exists%8#0" ] }, - "4575": { + "4521": { "error": "check self.interest_calculation_base exists", "op": "assert // check self.interest_calculation_base exists", "stack_out": [ @@ -42692,7 +42692,7 @@ "maybe_value%8#0" ] }, - "4576": { + "4522": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#1", @@ -42707,7 +42707,7 @@ "0" ] }, - "4577": { + "4523": { "op": "bytec 9 // \"nominal_interest_rate\"", "defined_out": [ "\"nominal_interest_rate\"", @@ -42736,7 +42736,7 @@ "\"nominal_interest_rate\"" ] }, - "4579": { + "4525": { "op": "app_global_get_ex", "defined_out": [ "aggregate%uint8%0#0", @@ -42765,7 +42765,7 @@ "maybe_exists%9#0" ] }, - "4580": { + "4526": { "error": "check self.nominal_interest_rate exists", "op": "assert // check self.nominal_interest_rate exists", "stack_out": [ @@ -42781,7 +42781,7 @@ "maybe_value%9#0" ] }, - "4581": { + "4527": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#1", @@ -42797,7 +42797,7 @@ "0" ] }, - "4582": { + "4528": { "op": "bytec 6 // \"accrued_interest\"", "defined_out": [ "\"accrued_interest\"", @@ -42828,7 +42828,7 @@ "\"accrued_interest\"" ] }, - "4584": { + "4530": { "op": "app_global_get_ex", "defined_out": [ "aggregate%uint8%0#0", @@ -42859,7 +42859,7 @@ "maybe_exists%10#0" ] }, - "4585": { + "4531": { "error": "check self.accrued_interest exists", "op": "assert // check self.accrued_interest exists", "stack_out": [ @@ -42876,7 +42876,7 @@ "maybe_value%10#0" ] }, - "4586": { + "4532": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#1", @@ -42893,7 +42893,7 @@ "0" ] }, - "4587": { + "4533": { "op": "bytec 16 // \"cumulative_interest_index\"", "defined_out": [ "\"cumulative_interest_index\"", @@ -42926,7 +42926,7 @@ "\"cumulative_interest_index\"" ] }, - "4589": { + "4535": { "op": "app_global_get_ex", "defined_out": [ "aggregate%uint8%0#0", @@ -42959,7 +42959,7 @@ "maybe_exists%11#0" ] }, - "4590": { + "4536": { "error": "check self.cumulative_interest_index exists", "op": "assert // check self.cumulative_interest_index exists", "stack_out": [ @@ -42977,7 +42977,7 @@ "maybe_value%11#0" ] }, - "4591": { + "4537": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#1", @@ -42995,7 +42995,7 @@ "0" ] }, - "4592": { + "4538": { "op": "bytec 17 // \"cumulative_principal_index\"", "defined_out": [ "\"cumulative_principal_index\"", @@ -43030,7 +43030,7 @@ "\"cumulative_principal_index\"" ] }, - "4594": { + "4540": { "op": "app_global_get_ex", "defined_out": [ "aggregate%uint8%0#0", @@ -43065,7 +43065,7 @@ "maybe_exists%12#0" ] }, - "4595": { + "4541": { "error": "check self.cumulative_principal_index exists", "op": "assert // check self.cumulative_principal_index exists", "stack_out": [ @@ -43084,7 +43084,7 @@ "maybe_value%12#0" ] }, - "4596": { + "4542": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#1", @@ -43103,7 +43103,7 @@ "0" ] }, - "4597": { + "4543": { "op": "bytec 15 // \"reserved_interest\"", "defined_out": [ "\"reserved_interest\"", @@ -43140,7 +43140,7 @@ "\"reserved_interest\"" ] }, - "4599": { + "4545": { "op": "app_global_get_ex", "defined_out": [ "aggregate%uint8%0#0", @@ -43177,7 +43177,7 @@ "maybe_exists%13#0" ] }, - "4600": { + "4546": { "error": "check self.reserved_interest exists", "op": "assert // check self.reserved_interest exists", "stack_out": [ @@ -43197,7 +43197,7 @@ "maybe_value%13#0" ] }, - "4601": { + "4547": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#1", @@ -43217,7 +43217,7 @@ "0" ] }, - "4602": { + "4548": { "op": "bytec 12 // \"reserved_principal\"", "defined_out": [ "\"reserved_principal\"", @@ -43256,7 +43256,7 @@ "\"reserved_principal\"" ] }, - "4604": { + "4550": { "op": "app_global_get_ex", "defined_out": [ "aggregate%uint8%0#0", @@ -43295,7 +43295,7 @@ "maybe_exists%14#0" ] }, - "4605": { + "4551": { "error": "check self.reserved_principal exists", "op": "assert // check self.reserved_principal exists", "stack_out": [ @@ -43316,7 +43316,7 @@ "maybe_value%14#0" ] }, - "4606": { + "4552": { "op": "uncover 14", "stack_out": [ "aggregate%uint8%0#0", @@ -43336,7 +43336,7 @@ "maybe_value%0#1" ] }, - "4608": { + "4554": { "op": "itob", "defined_out": [ "aggregate%uint8%0#0", @@ -43373,7 +43373,7 @@ "aggregate%val_as_bytes%1#0" ] }, - "4609": { + "4555": { "op": "uncover 14", "stack_out": [ "maybe_value%2#0", @@ -43393,7 +43393,7 @@ "aggregate%uint8%0#0" ] }, - "4611": { + "4557": { "op": "swap", "stack_out": [ "maybe_value%2#0", @@ -43413,7 +43413,7 @@ "aggregate%val_as_bytes%1#0" ] }, - "4612": { + "4558": { "op": "concat", "defined_out": [ "aggregate%head%1#0", @@ -43448,7 +43448,7 @@ "aggregate%head%1#0" ] }, - "4613": { + "4559": { "op": "uncover 13", "stack_out": [ "maybe_value%3#0", @@ -43467,7 +43467,7 @@ "maybe_value%2#0" ] }, - "4615": { + "4561": { "op": "itob", "defined_out": [ "aggregate%head%1#0", @@ -43502,7 +43502,7 @@ "aggregate%val_as_bytes%2#0" ] }, - "4616": { + "4562": { "op": "concat", "defined_out": [ "aggregate%head%2#0", @@ -43535,7 +43535,7 @@ "aggregate%head%2#0" ] }, - "4617": { + "4563": { "op": "uncover 12", "stack_out": [ "maybe_value%4#0", @@ -43553,7 +43553,7 @@ "maybe_value%3#0" ] }, - "4619": { + "4565": { "op": "itob", "defined_out": [ "aggregate%head%2#0", @@ -43586,7 +43586,7 @@ "aggregate%val_as_bytes%3#0" ] }, - "4620": { + "4566": { "op": "concat", "defined_out": [ "aggregate%head%3#0", @@ -43617,7 +43617,7 @@ "aggregate%head%3#0" ] }, - "4621": { + "4567": { "op": "uncover 11", "stack_out": [ "maybe_value%5#0", @@ -43634,7 +43634,7 @@ "maybe_value%4#0" ] }, - "4623": { + "4569": { "op": "itob", "defined_out": [ "aggregate%head%3#0", @@ -43665,7 +43665,7 @@ "aggregate%val_as_bytes%4#0" ] }, - "4624": { + "4570": { "op": "concat", "defined_out": [ "aggregate%head%4#0", @@ -43694,7 +43694,7 @@ "aggregate%head%4#0" ] }, - "4625": { + "4571": { "op": "uncover 10", "stack_out": [ "maybe_value%6#0", @@ -43710,7 +43710,7 @@ "maybe_value%5#0" ] }, - "4627": { + "4573": { "op": "itob", "defined_out": [ "aggregate%head%4#0", @@ -43739,7 +43739,7 @@ "aggregate%val_as_bytes%5#0" ] }, - "4628": { + "4574": { "op": "concat", "defined_out": [ "aggregate%head%5#0", @@ -43766,7 +43766,7 @@ "aggregate%head%5#0" ] }, - "4629": { + "4575": { "op": "uncover 9", "stack_out": [ "maybe_value%7#0", @@ -43781,7 +43781,7 @@ "maybe_value%6#0" ] }, - "4631": { + "4577": { "op": "itob", "defined_out": [ "aggregate%head%5#0", @@ -43808,7 +43808,7 @@ "aggregate%val_as_bytes%6#0" ] }, - "4632": { + "4578": { "op": "concat", "defined_out": [ "aggregate%head%6#0", @@ -43833,7 +43833,7 @@ "aggregate%head%6#0" ] }, - "4633": { + "4579": { "op": "uncover 8", "stack_out": [ "maybe_value%8#0", @@ -43847,7 +43847,7 @@ "maybe_value%7#0" ] }, - "4635": { + "4581": { "op": "itob", "defined_out": [ "aggregate%head%6#0", @@ -43872,7 +43872,7 @@ "aggregate%val_as_bytes%7#0" ] }, - "4636": { + "4582": { "op": "concat", "defined_out": [ "aggregate%head%7#0", @@ -43895,7 +43895,7 @@ "aggregate%head%7#0" ] }, - "4637": { + "4583": { "op": "uncover 7", "stack_out": [ "maybe_value%9#0", @@ -43908,7 +43908,7 @@ "maybe_value%8#0" ] }, - "4639": { + "4585": { "op": "itob", "defined_out": [ "aggregate%head%7#0", @@ -43931,7 +43931,7 @@ "aggregate%val_as_bytes%8#0" ] }, - "4640": { + "4586": { "op": "concat", "defined_out": [ "aggregate%head%8#0", @@ -43952,7 +43952,7 @@ "aggregate%head%8#0" ] }, - "4641": { + "4587": { "op": "uncover 6", "stack_out": [ "maybe_value%10#0", @@ -43964,7 +43964,7 @@ "maybe_value%9#0" ] }, - "4643": { + "4589": { "op": "itob", "defined_out": [ "aggregate%head%8#0", @@ -43985,7 +43985,7 @@ "aggregate%val_as_bytes%9#0" ] }, - "4644": { + "4590": { "op": "concat", "defined_out": [ "aggregate%head%9#0", @@ -44004,7 +44004,7 @@ "aggregate%head%9#0" ] }, - "4645": { + "4591": { "op": "uncover 5", "stack_out": [ "maybe_value%11#0", @@ -44015,7 +44015,7 @@ "maybe_value%10#0" ] }, - "4647": { + "4593": { "op": "itob", "defined_out": [ "aggregate%head%9#0", @@ -44034,7 +44034,7 @@ "aggregate%val_as_bytes%10#0" ] }, - "4648": { + "4594": { "op": "concat", "defined_out": [ "aggregate%head%10#0", @@ -44051,7 +44051,7 @@ "aggregate%head%10#0" ] }, - "4649": { + "4595": { "op": "uncover 4", "stack_out": [ "maybe_value%12#0", @@ -44061,7 +44061,7 @@ "maybe_value%11#0" ] }, - "4651": { + "4597": { "op": "itob", "defined_out": [ "aggregate%head%10#0", @@ -44078,7 +44078,7 @@ "aggregate%val_as_bytes%11#0" ] }, - "4652": { + "4598": { "op": "concat", "defined_out": [ "aggregate%head%11#0", @@ -44093,7 +44093,7 @@ "aggregate%head%11#0" ] }, - "4653": { + "4599": { "op": "uncover 3", "stack_out": [ "maybe_value%13#0", @@ -44102,7 +44102,7 @@ "maybe_value%12#0" ] }, - "4655": { + "4601": { "op": "itob", "defined_out": [ "aggregate%head%11#0", @@ -44117,7 +44117,7 @@ "aggregate%val_as_bytes%12#0" ] }, - "4656": { + "4602": { "op": "concat", "defined_out": [ "aggregate%head%12#0", @@ -44130,7 +44130,7 @@ "aggregate%head%12#0" ] }, - "4657": { + "4603": { "op": "uncover 2", "stack_out": [ "maybe_value%14#0", @@ -44138,7 +44138,7 @@ "maybe_value%13#0" ] }, - "4659": { + "4605": { "op": "itob", "defined_out": [ "aggregate%head%12#0", @@ -44151,7 +44151,7 @@ "aggregate%val_as_bytes%13#0" ] }, - "4660": { + "4606": { "op": "concat", "defined_out": [ "aggregate%head%13#0", @@ -44162,14 +44162,14 @@ "aggregate%head%13#0" ] }, - "4661": { + "4607": { "op": "swap", "stack_out": [ "aggregate%head%13#0", "maybe_value%14#0" ] }, - "4662": { + "4608": { "op": "itob", "defined_out": [ "aggregate%head%13#0", @@ -44180,7 +44180,7 @@ "aggregate%val_as_bytes%14#0" ] }, - "4663": { + "4609": { "op": "concat", "defined_out": [ "aggregate%head%14#0" @@ -44189,7 +44189,7 @@ "aggregate%head%14#0" ] }, - "4664": { + "4610": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -44200,14 +44200,14 @@ "0x151f7c75" ] }, - "4665": { + "4611": { "op": "swap", "stack_out": [ "0x151f7c75", "aggregate%head%14#0" ] }, - "4666": { + "4612": { "op": "concat", "defined_out": [ "tmp%1#0" @@ -44216,11 +44216,11 @@ "tmp%1#0" ] }, - "4667": { + "4613": { "op": "log", "stack_out": [] }, - "4668": { + "4614": { "op": "intc_1 // 1", "defined_out": [ "1" @@ -44229,11 +44229,11 @@ "1" ] }, - "4669": { + "4615": { "op": "return", "stack_out": [] }, - "4670": { + "4616": { "subroutine": "modules.actus_kernel.ActusKernelModule.contract_get_next_due_event[routing]", "params": {}, "block": "contract_get_next_due_event", @@ -44246,7 +44246,7 @@ "0" ] }, - "4671": { + "4617": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"", @@ -44257,7 +44257,7 @@ "\"status\"" ] }, - "4672": { + "4618": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -44268,25 +44268,25 @@ "maybe_exists%0#0" ] }, - "4673": { + "4619": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ "maybe_value%0#0" ] }, - "4674": { + "4620": { "error": "D-ASA not configured", "op": "assert // D-ASA not configured", "stack_out": [] }, - "4675": { + "4621": { "op": "intc_0 // 0", "stack_out": [ "0" ] }, - "4676": { + "4622": { "op": "bytec_2 // \"event_cursor\"", "defined_out": [ "\"event_cursor\"", @@ -44297,28 +44297,28 @@ "\"event_cursor\"" ] }, - "4677": { + "4623": { "op": "app_global_get_ex", "stack_out": [ "maybe_value%0#0", "maybe_exists%0#0" ] }, - "4678": { + "4624": { "error": "check self.event_cursor exists", "op": "assert // check self.event_cursor exists", "stack_out": [ "maybe_value%0#0" ] }, - "4679": { + "4625": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#0", "0" ] }, - "4680": { + "4626": { "op": "bytec_3 // \"schedule_entry_count\"", "defined_out": [ "\"schedule_entry_count\"", @@ -44331,7 +44331,7 @@ "\"schedule_entry_count\"" ] }, - "4681": { + "4627": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%1#0", @@ -44344,7 +44344,7 @@ "maybe_exists%1#0" ] }, - "4682": { + "4628": { "error": "check self.schedule_entry_count exists", "op": "assert // check self.schedule_entry_count exists", "stack_out": [ @@ -44352,7 +44352,7 @@ "maybe_value%1#0" ] }, - "4683": { + "4629": { "op": ">=", "defined_out": [ "tmp%0#1" @@ -44361,24 +44361,24 @@ "tmp%0#1" ] }, - "4684": { + "4630": { "op": "bz contract_get_next_due_event_after_if_else@3", "stack_out": [] }, - "4687": { + "4633": { "op": "intc_0 // 0", "stack_out": [ "0" ] }, - "4688": { + "4634": { "op": "bytec_2 // \"event_cursor\"", "stack_out": [ "0", "\"event_cursor\"" ] }, - "4689": { + "4635": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%2#0", @@ -44389,14 +44389,14 @@ "maybe_exists%2#0" ] }, - "4690": { + "4636": { "error": "check self.event_cursor exists", "op": "assert // check self.event_cursor exists", "stack_out": [ "maybe_value%2#0" ] }, - "4691": { + "4637": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0" @@ -44405,7 +44405,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "4692": { + "4638": { "op": "bytec 40 // 0x00", "defined_out": [ "0x00", @@ -44416,7 +44416,7 @@ "0x00" ] }, - "4694": { + "4640": { "op": "concat", "defined_out": [ "aggregate%head%1#0" @@ -44425,14 +44425,14 @@ "aggregate%head%1#0" ] }, - "4695": { + "4641": { "op": "intc_0 // 0", "stack_out": [ "aggregate%head%1#0", "0" ] }, - "4696": { + "4642": { "op": "itob", "defined_out": [ "aggregate%head%1#0", @@ -44443,14 +44443,14 @@ "aggregate%val_as_bytes%1#0" ] }, - "4697": { + "4643": { "op": "swap", "stack_out": [ "aggregate%val_as_bytes%1#0", "aggregate%head%1#0" ] }, - "4698": { + "4644": { "op": "dig 1", "defined_out": [ "aggregate%head%1#0", @@ -44463,7 +44463,7 @@ "aggregate%val_as_bytes%1#0 (copy)" ] }, - "4700": { + "4646": { "op": "concat", "defined_out": [ "aggregate%head%2#0", @@ -44474,7 +44474,7 @@ "aggregate%head%2#0" ] }, - "4701": { + "4647": { "op": "dig 1", "stack_out": [ "aggregate%val_as_bytes%1#0", @@ -44482,7 +44482,7 @@ "aggregate%val_as_bytes%1#0 (copy)" ] }, - "4703": { + "4649": { "op": "concat", "defined_out": [ "aggregate%head%3#0", @@ -44493,7 +44493,7 @@ "aggregate%head%3#0" ] }, - "4704": { + "4650": { "op": "dig 1", "stack_out": [ "aggregate%val_as_bytes%1#0", @@ -44501,7 +44501,7 @@ "aggregate%val_as_bytes%1#0 (copy)" ] }, - "4706": { + "4652": { "op": "concat", "defined_out": [ "aggregate%head%4#0", @@ -44512,7 +44512,7 @@ "aggregate%head%4#0" ] }, - "4707": { + "4653": { "op": "dig 1", "stack_out": [ "aggregate%val_as_bytes%1#0", @@ -44520,7 +44520,7 @@ "aggregate%val_as_bytes%1#0 (copy)" ] }, - "4709": { + "4655": { "op": "concat", "defined_out": [ "aggregate%head%5#0", @@ -44531,7 +44531,7 @@ "aggregate%head%5#0" ] }, - "4710": { + "4656": { "op": "dig 1", "stack_out": [ "aggregate%val_as_bytes%1#0", @@ -44539,7 +44539,7 @@ "aggregate%val_as_bytes%1#0 (copy)" ] }, - "4712": { + "4658": { "op": "concat", "defined_out": [ "aggregate%head%6#0", @@ -44550,7 +44550,7 @@ "aggregate%head%6#0" ] }, - "4713": { + "4659": { "op": "dig 1", "stack_out": [ "aggregate%val_as_bytes%1#0", @@ -44558,7 +44558,7 @@ "aggregate%val_as_bytes%1#0 (copy)" ] }, - "4715": { + "4661": { "op": "concat", "defined_out": [ "aggregate%head%7#0", @@ -44569,14 +44569,14 @@ "aggregate%head%7#0" ] }, - "4716": { + "4662": { "op": "swap", "stack_out": [ "aggregate%head%7#0", "aggregate%val_as_bytes%1#0" ] }, - "4717": { + "4663": { "op": "concat", "defined_out": [ "tmp%0#0" @@ -44585,7 +44585,7 @@ "tmp%0#0" ] }, - "4718": { + "4664": { "block": "contract_get_next_due_event_after_inlined_modules.actus_kernel.ActusKernelModule.contract_get_next_due_event@4", "stack_in": [ "tmp%0#0" @@ -44599,7 +44599,7 @@ "0x151f7c75" ] }, - "4719": { + "4665": { "op": "swap", "defined_out": [ "0x151f7c75", @@ -44610,7 +44610,7 @@ "tmp%0#0" ] }, - "4720": { + "4666": { "op": "concat", "defined_out": [ "tmp%1#0" @@ -44619,11 +44619,11 @@ "tmp%1#0" ] }, - "4721": { + "4667": { "op": "log", "stack_out": [] }, - "4722": { + "4668": { "op": "intc_1 // 1", "defined_out": [ "1" @@ -44632,11 +44632,11 @@ "1" ] }, - "4723": { + "4669": { "op": "return", "stack_out": [] }, - "4724": { + "4670": { "block": "contract_get_next_due_event_after_if_else@3", "stack_in": [], "op": "intc_0 // 0", @@ -44647,7 +44647,7 @@ "0" ] }, - "4725": { + "4671": { "op": "bytec_2 // \"event_cursor\"", "defined_out": [ "\"event_cursor\"", @@ -44658,7 +44658,7 @@ "\"event_cursor\"" ] }, - "4726": { + "4672": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%3#0", @@ -44669,14 +44669,14 @@ "maybe_exists%3#0" ] }, - "4727": { + "4673": { "error": "check self.event_cursor exists", "op": "assert // check self.event_cursor exists", "stack_out": [ "maybe_value%3#0" ] }, - "4728": { + "4674": { "callsub": "modules.actus_kernel.ActusKernelModule._get_schedule_entry", "op": "callsub _get_schedule_entry", "defined_out": [ @@ -44686,10 +44686,10 @@ "tmp%0#0" ] }, - "4731": { + "4677": { "op": "b contract_get_next_due_event_after_inlined_modules.actus_kernel.ActusKernelModule.contract_get_next_due_event@4" }, - "4734": { + "4680": { "subroutine": "modules.rbac.RbacModule.contract_update[routing]", "params": {}, "block": "contract_update", @@ -44697,7 +44697,7 @@ "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", "op": "callsub _assert_caller_is_arranger" }, - "4737": { + "4683": { "op": "intc_1 // 1", "defined_out": [ "1" @@ -44706,11 +44706,11 @@ "1" ] }, - "4738": { + "4684": { "op": "return", "stack_out": [] }, - "4739": { + "4685": { "subroutine": "modules.rbac.RbacModule.rbac_rotate_arranger[routing]", "params": {}, "block": "rbac_rotate_arranger", @@ -44723,7 +44723,7 @@ "new_arranger#0" ] }, - "4742": { + "4688": { "op": "dup", "defined_out": [ "new_arranger#0", @@ -44734,7 +44734,7 @@ "new_arranger#0 (copy)" ] }, - "4743": { + "4689": { "op": "len", "defined_out": [ "len%0#0", @@ -44745,7 +44745,7 @@ "len%0#0" ] }, - "4744": { + "4690": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -44758,7 +44758,7 @@ "32" ] }, - "4745": { + "4691": { "op": "==", "defined_out": [ "eq%0#0", @@ -44769,40 +44769,40 @@ "eq%0#0" ] }, - "4746": { + "4692": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ "new_arranger#0" ] }, - "4747": { + "4693": { "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", "op": "callsub _assert_caller_is_arranger" }, - "4750": { - "op": "bytec 18 // 0x5223417272616e67657223", + "4696": { + "op": "bytec 18 // 0x523a41525223", "defined_out": [ - "0x5223417272616e67657223", + "0x523a41525223", "new_arranger#0" ], "stack_out": [ "new_arranger#0", - "0x5223417272616e67657223" + "0x523a41525223" ] }, - "4752": { + "4698": { "op": "swap", "stack_out": [ - "0x5223417272616e67657223", + "0x523a41525223", "new_arranger#0" ] }, - "4753": { + "4699": { "op": "app_global_put", "stack_out": [] }, - "4754": { + "4700": { "op": "global LatestTimestamp", "defined_out": [ "tmp%0#1" @@ -44811,7 +44811,7 @@ "tmp%0#1" ] }, - "4756": { + "4702": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0" @@ -44820,7 +44820,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "4757": { + "4703": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -44831,14 +44831,14 @@ "0x151f7c75" ] }, - "4758": { + "4704": { "op": "swap", "stack_out": [ "0x151f7c75", "aggregate%val_as_bytes%0#0" ] }, - "4759": { + "4705": { "op": "concat", "defined_out": [ "tmp%4#0" @@ -44847,11 +44847,11 @@ "tmp%4#0" ] }, - "4760": { + "4706": { "op": "log", "stack_out": [] }, - "4761": { + "4707": { "op": "intc_1 // 1", "defined_out": [ "1" @@ -44860,11 +44860,11 @@ "1" ] }, - "4762": { + "4708": { "op": "return", "stack_out": [] }, - "4763": { + "4709": { "subroutine": "modules.rbac.RbacModule.rbac_set_op_daemon[routing]", "params": {}, "block": "rbac_set_op_daemon", @@ -44877,7 +44877,7 @@ "address#0" ] }, - "4766": { + "4712": { "op": "dup", "defined_out": [ "address#0", @@ -44888,7 +44888,7 @@ "address#0 (copy)" ] }, - "4767": { + "4713": { "op": "len", "defined_out": [ "address#0", @@ -44899,7 +44899,7 @@ "len%0#0" ] }, - "4768": { + "4714": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -44912,7 +44912,7 @@ "32" ] }, - "4769": { + "4715": { "op": "==", "defined_out": [ "address#0", @@ -44923,40 +44923,40 @@ "eq%0#0" ] }, - "4770": { + "4716": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ "address#0" ] }, - "4771": { + "4717": { "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", "op": "callsub _assert_caller_is_arranger" }, - "4774": { - "op": "bytec 26 // 0x52234f704461656d6f6e23", + "4720": { + "op": "bytec 26 // 0x523a4f504423", "defined_out": [ - "0x52234f704461656d6f6e23", + "0x523a4f504423", "address#0" ], "stack_out": [ "address#0", - "0x52234f704461656d6f6e23" + "0x523a4f504423" ] }, - "4776": { + "4722": { "op": "swap", "stack_out": [ - "0x52234f704461656d6f6e23", + "0x523a4f504423", "address#0" ] }, - "4777": { + "4723": { "op": "app_global_put", "stack_out": [] }, - "4778": { + "4724": { "op": "global LatestTimestamp", "defined_out": [ "tmp%0#1" @@ -44965,7 +44965,7 @@ "tmp%0#1" ] }, - "4780": { + "4726": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0" @@ -44974,7 +44974,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "4781": { + "4727": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -44985,14 +44985,14 @@ "0x151f7c75" ] }, - "4782": { + "4728": { "op": "swap", "stack_out": [ "0x151f7c75", "aggregate%val_as_bytes%0#0" ] }, - "4783": { + "4729": { "op": "concat", "defined_out": [ "tmp%4#0" @@ -45001,11 +45001,11 @@ "tmp%4#0" ] }, - "4784": { + "4730": { "op": "log", "stack_out": [] }, - "4785": { + "4731": { "op": "intc_1 // 1", "defined_out": [ "1" @@ -45014,11 +45014,11 @@ "1" ] }, - "4786": { + "4732": { "op": "return", "stack_out": [] }, - "4787": { + "4733": { "subroutine": "modules.rbac.RbacModule.rbac_assign_role[routing]", "params": {}, "block": "rbac_assign_role", @@ -45031,7 +45031,7 @@ "role_id#0" ] }, - "4790": { + "4736": { "op": "dup", "defined_out": [ "role_id#0", @@ -45042,7 +45042,7 @@ "role_id#0 (copy)" ] }, - "4791": { + "4737": { "op": "len", "defined_out": [ "len%0#0", @@ -45053,7 +45053,7 @@ "len%0#0" ] }, - "4792": { + "4738": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -45066,7 +45066,7 @@ "1" ] }, - "4793": { + "4739": { "op": "==", "defined_out": [ "eq%0#0", @@ -45077,17 +45077,17 @@ "eq%0#0" ] }, - "4794": { + "4740": { "error": "invalid number of bytes for arc4.uint8", "op": "assert // invalid number of bytes for arc4.uint8", "stack_out": [ "role_id#0" ] }, - "4795": { + "4741": { "op": "txna ApplicationArgs 2" }, - "4798": { + "4744": { "op": "dup", "defined_out": [ "role_address#0", @@ -45099,7 +45099,7 @@ "role_address#0" ] }, - "4799": { + "4745": { "op": "cover 2", "defined_out": [ "role_address#0", @@ -45111,7 +45111,7 @@ "role_address#0" ] }, - "4801": { + "4747": { "op": "len", "defined_out": [ "len%1#0", @@ -45124,7 +45124,7 @@ "len%1#0" ] }, - "4802": { + "4748": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -45139,7 +45139,7 @@ "32" ] }, - "4803": { + "4749": { "op": "==", "defined_out": [ "eq%1#0", @@ -45152,7 +45152,7 @@ "eq%1#0" ] }, - "4804": { + "4750": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ @@ -45160,10 +45160,10 @@ "role_id#0" ] }, - "4805": { + "4751": { "op": "txna ApplicationArgs 3" }, - "4808": { + "4754": { "op": "dup", "defined_out": [ "role_address#0", @@ -45177,7 +45177,7 @@ "validity#0" ] }, - "4809": { + "4755": { "op": "cover 2", "defined_out": [ "role_address#0", @@ -45191,7 +45191,7 @@ "validity#0" ] }, - "4811": { + "4757": { "op": "len", "defined_out": [ "len%2#0", @@ -45206,7 +45206,7 @@ "len%2#0" ] }, - "4812": { + "4758": { "op": "pushint 16", "defined_out": [ "16", @@ -45223,7 +45223,7 @@ "16" ] }, - "4814": { + "4760": { "op": "==", "defined_out": [ "eq%2#0", @@ -45238,7 +45238,7 @@ "eq%2#0" ] }, - "4815": { + "4761": { "error": "invalid number of bytes for smart_contracts.abi_types.RoleValidity", "op": "assert // invalid number of bytes for smart_contracts.abi_types.RoleValidity", "stack_out": [ @@ -45247,15 +45247,15 @@ "role_id#0" ] }, - "4816": { + "4762": { "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", "op": "callsub _assert_caller_is_arranger" }, - "4819": { + "4765": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", "op": "callsub _assert_is_not_asset_defaulted" }, - "4822": { + "4768": { "op": "btoi", "defined_out": [ "role_address#0", @@ -45268,7 +45268,7 @@ "role_id#1" ] }, - "4823": { + "4769": { "op": "dupn 2", "defined_out": [ "role_address#0", @@ -45284,7 +45284,7 @@ "role_id#1 (copy)" ] }, - "4825": { + "4771": { "callsub": "modules.rbac.RbacModule._assert_valid_role", "op": "callsub _assert_valid_role", "stack_out": [ @@ -45294,7 +45294,7 @@ "role_id#1" ] }, - "4828": { + "4774": { "op": "pushint 20", "defined_out": [ "20", @@ -45310,7 +45310,7 @@ "20" ] }, - "4830": { + "4776": { "op": "==", "defined_out": [ "role_address#0", @@ -45325,7 +45325,7 @@ "tmp%0#2" ] }, - "4831": { + "4777": { "op": "bz rbac_assign_role_after_if_else@3", "stack_out": [ "role_address#0", @@ -45333,10 +45333,10 @@ "role_id#1" ] }, - "4834": { - "op": "bytec 18 // 0x5223417272616e67657223", + "4780": { + "op": "bytec 18 // 0x523a41525223", "defined_out": [ - "0x5223417272616e67657223", + "0x523a41525223", "role_address#0", "role_id#1", "validity#0" @@ -45345,20 +45345,20 @@ "role_address#0", "validity#0", "role_id#1", - "0x5223417272616e67657223" + "0x523a41525223" ] }, - "4836": { + "4782": { "op": "dig 3", "stack_out": [ "role_address#0", "validity#0", "role_id#1", - "0x5223417272616e67657223", + "0x523a41525223", "role_address#0" ] }, - "4838": { + "4784": { "op": "app_global_put", "stack_out": [ "role_address#0", @@ -45366,7 +45366,7 @@ "role_id#1" ] }, - "4839": { + "4785": { "block": "rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14", "stack_in": [ "role_address#0", @@ -45384,7 +45384,7 @@ "tmp%2#1" ] }, - "4841": { + "4787": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0" @@ -45396,7 +45396,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "4842": { + "4788": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -45410,7 +45410,7 @@ "0x151f7c75" ] }, - "4843": { + "4789": { "op": "swap", "stack_out": [ "role_address#0", @@ -45420,7 +45420,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "4844": { + "4790": { "op": "concat", "defined_out": [ "tmp%6#0" @@ -45432,7 +45432,7 @@ "tmp%6#0" ] }, - "4845": { + "4791": { "op": "log", "stack_out": [ "role_address#0", @@ -45440,7 +45440,7 @@ "role_id#1" ] }, - "4846": { + "4792": { "op": "intc_1 // 1", "defined_out": [ "1" @@ -45452,7 +45452,7 @@ "1" ] }, - "4847": { + "4793": { "op": "return", "stack_out": [ "role_address#0", @@ -45460,7 +45460,7 @@ "role_id#1" ] }, - "4848": { + "4794": { "block": "rbac_assign_role_after_if_else@3", "stack_in": [ "role_address#0", @@ -45478,7 +45478,7 @@ "role_id#1" ] }, - "4849": { + "4795": { "op": "pushint 40", "defined_out": [ "40", @@ -45492,7 +45492,7 @@ "40" ] }, - "4851": { + "4797": { "op": "==", "defined_out": [ "role_id#1", @@ -45505,7 +45505,7 @@ "tmp%1#1" ] }, - "4852": { + "4798": { "op": "bz rbac_assign_role_after_if_else@5", "stack_out": [ "role_address#0", @@ -45513,23 +45513,23 @@ "role_id#1" ] }, - "4855": { - "op": "bytec 23 // 0x52234163636f756e744d616e6167657223", + "4801": { + "op": "bytec 23 // 0x523a4d4e4723", "defined_out": [ - "0x52234163636f756e744d616e6167657223", + "0x523a4d4e4723", "role_id#1" ], "stack_out": [ "role_address#0", "validity#0", "role_id#1", - "0x52234163636f756e744d616e6167657223" + "0x523a4d4e4723" ] }, - "4857": { + "4803": { "op": "dig 3", "defined_out": [ - "0x52234163636f756e744d616e6167657223", + "0x523a4d4e4723", "role_address#0", "role_id#1" ], @@ -45537,11 +45537,11 @@ "role_address#0", "validity#0", "role_id#1", - "0x52234163636f756e744d616e6167657223", + "0x523a4d4e4723", "role_address#0" ] }, - "4859": { + "4805": { "op": "concat", "defined_out": [ "box_prefixed_key%0#0", @@ -45555,7 +45555,7 @@ "box_prefixed_key%0#0" ] }, - "4860": { + "4806": { "op": "dup", "defined_out": [ "box_prefixed_key%0#0", @@ -45571,7 +45571,7 @@ "box_prefixed_key%0#0 (copy)" ] }, - "4861": { + "4807": { "op": "box_len", "defined_out": [ "_%0#0", @@ -45589,7 +45589,7 @@ "maybe_exists%0#0" ] }, - "4862": { + "4808": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -45599,7 +45599,7 @@ "maybe_exists%0#0" ] }, - "4864": { + "4810": { "op": "!", "defined_out": [ "box_prefixed_key%0#0", @@ -45615,7 +45615,7 @@ "tmp%2#2" ] }, - "4865": { + "4811": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -45625,7 +45625,7 @@ "box_prefixed_key%0#0" ] }, - "4866": { + "4812": { "op": "dig 2", "defined_out": [ "box_prefixed_key%0#0", @@ -45641,7 +45641,7 @@ "validity#0" ] }, - "4868": { + "4814": { "op": "box_put", "stack_out": [ "role_address#0", @@ -45649,10 +45649,10 @@ "role_id#1" ] }, - "4869": { + "4815": { "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14" }, - "4872": { + "4818": { "block": "rbac_assign_role_after_if_else@5", "stack_in": [ "role_address#0", @@ -45670,7 +45670,7 @@ "role_id#1" ] }, - "4873": { + "4819": { "op": "pushint 50", "defined_out": [ "50", @@ -45684,7 +45684,7 @@ "50" ] }, - "4875": { + "4821": { "op": "==", "defined_out": [ "role_id#1", @@ -45697,7 +45697,7 @@ "tmp%3#0" ] }, - "4876": { + "4822": { "op": "bz rbac_assign_role_after_if_else@7", "stack_out": [ "role_address#0", @@ -45705,23 +45705,23 @@ "role_id#1" ] }, - "4879": { - "op": "bytec 22 // 0x52235072696d6172794465616c657223", + "4825": { + "op": "bytec 22 // 0x523a50594423", "defined_out": [ - "0x52235072696d6172794465616c657223", + "0x523a50594423", "role_id#1" ], "stack_out": [ "role_address#0", "validity#0", "role_id#1", - "0x52235072696d6172794465616c657223" + "0x523a50594423" ] }, - "4881": { + "4827": { "op": "dig 3", "defined_out": [ - "0x52235072696d6172794465616c657223", + "0x523a50594423", "role_address#0", "role_id#1" ], @@ -45729,11 +45729,11 @@ "role_address#0", "validity#0", "role_id#1", - "0x52235072696d6172794465616c657223", + "0x523a50594423", "role_address#0" ] }, - "4883": { + "4829": { "op": "concat", "defined_out": [ "box_prefixed_key%2#0", @@ -45747,7 +45747,7 @@ "box_prefixed_key%2#0" ] }, - "4884": { + "4830": { "op": "dup", "defined_out": [ "box_prefixed_key%2#0", @@ -45763,7 +45763,7 @@ "box_prefixed_key%2#0 (copy)" ] }, - "4885": { + "4831": { "op": "box_len", "defined_out": [ "_%1#0", @@ -45781,7 +45781,7 @@ "maybe_exists%1#0" ] }, - "4886": { + "4832": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -45791,7 +45791,7 @@ "maybe_exists%1#0" ] }, - "4888": { + "4834": { "op": "!", "defined_out": [ "box_prefixed_key%2#0", @@ -45807,7 +45807,7 @@ "tmp%4#0" ] }, - "4889": { + "4835": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -45817,7 +45817,7 @@ "box_prefixed_key%2#0" ] }, - "4890": { + "4836": { "op": "dig 2", "defined_out": [ "box_prefixed_key%2#0", @@ -45833,7 +45833,7 @@ "validity#0" ] }, - "4892": { + "4838": { "op": "box_put", "stack_out": [ "role_address#0", @@ -45841,10 +45841,10 @@ "role_id#1" ] }, - "4893": { + "4839": { "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14" }, - "4896": { + "4842": { "block": "rbac_assign_role_after_if_else@7", "stack_in": [ "role_address#0", @@ -45862,7 +45862,7 @@ "role_id#1" ] }, - "4897": { + "4843": { "op": "pushint 60", "defined_out": [ "60", @@ -45876,7 +45876,7 @@ "60" ] }, - "4899": { + "4845": { "op": "==", "defined_out": [ "role_id#1", @@ -45889,7 +45889,7 @@ "tmp%5#1" ] }, - "4900": { + "4846": { "op": "bz rbac_assign_role_after_if_else@9", "stack_out": [ "role_address#0", @@ -45897,23 +45897,23 @@ "role_id#1" ] }, - "4903": { - "op": "bytec 32 // 0x52235472757374656523", + "4849": { + "op": "bytec 32 // 0x523a54525323", "defined_out": [ - "0x52235472757374656523", + "0x523a54525323", "role_id#1" ], "stack_out": [ "role_address#0", "validity#0", "role_id#1", - "0x52235472757374656523" + "0x523a54525323" ] }, - "4905": { + "4851": { "op": "dig 3", "defined_out": [ - "0x52235472757374656523", + "0x523a54525323", "role_address#0", "role_id#1" ], @@ -45921,11 +45921,11 @@ "role_address#0", "validity#0", "role_id#1", - "0x52235472757374656523", + "0x523a54525323", "role_address#0" ] }, - "4907": { + "4853": { "op": "concat", "defined_out": [ "box_prefixed_key%4#0", @@ -45939,7 +45939,7 @@ "box_prefixed_key%4#0" ] }, - "4908": { + "4854": { "op": "dup", "defined_out": [ "box_prefixed_key%4#0", @@ -45955,7 +45955,7 @@ "box_prefixed_key%4#0 (copy)" ] }, - "4909": { + "4855": { "op": "box_len", "defined_out": [ "_%2#0", @@ -45973,7 +45973,7 @@ "maybe_exists%2#0" ] }, - "4910": { + "4856": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -45983,7 +45983,7 @@ "maybe_exists%2#0" ] }, - "4912": { + "4858": { "op": "!", "defined_out": [ "box_prefixed_key%4#0", @@ -45999,7 +45999,7 @@ "tmp%6#1" ] }, - "4913": { + "4859": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -46009,7 +46009,7 @@ "box_prefixed_key%4#0" ] }, - "4914": { + "4860": { "op": "dig 2", "defined_out": [ "box_prefixed_key%4#0", @@ -46025,7 +46025,7 @@ "validity#0" ] }, - "4916": { + "4862": { "op": "box_put", "stack_out": [ "role_address#0", @@ -46033,10 +46033,10 @@ "role_id#1" ] }, - "4917": { + "4863": { "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14" }, - "4920": { + "4866": { "block": "rbac_assign_role_after_if_else@9", "stack_in": [ "role_address#0", @@ -46054,7 +46054,7 @@ "role_id#1" ] }, - "4921": { + "4867": { "op": "pushint 70", "defined_out": [ "70", @@ -46068,7 +46068,7 @@ "70" ] }, - "4923": { + "4869": { "op": "==", "defined_out": [ "role_id#1", @@ -46081,7 +46081,7 @@ "tmp%7#0" ] }, - "4924": { + "4870": { "op": "bz rbac_assign_role_after_if_else@11", "stack_out": [ "role_address#0", @@ -46089,23 +46089,23 @@ "role_id#1" ] }, - "4927": { - "op": "bytec 21 // 0x5223417574686f7269747923", + "4873": { + "op": "bytec 21 // 0x523a41555423", "defined_out": [ - "0x5223417574686f7269747923", + "0x523a41555423", "role_id#1" ], "stack_out": [ "role_address#0", "validity#0", "role_id#1", - "0x5223417574686f7269747923" + "0x523a41555423" ] }, - "4929": { + "4875": { "op": "dig 3", "defined_out": [ - "0x5223417574686f7269747923", + "0x523a41555423", "role_address#0", "role_id#1" ], @@ -46113,11 +46113,11 @@ "role_address#0", "validity#0", "role_id#1", - "0x5223417574686f7269747923", + "0x523a41555423", "role_address#0" ] }, - "4931": { + "4877": { "op": "concat", "defined_out": [ "box_prefixed_key%6#0", @@ -46131,7 +46131,7 @@ "box_prefixed_key%6#0" ] }, - "4932": { + "4878": { "op": "dup", "defined_out": [ "box_prefixed_key%6#0", @@ -46147,7 +46147,7 @@ "box_prefixed_key%6#0 (copy)" ] }, - "4933": { + "4879": { "op": "box_len", "defined_out": [ "_%3#0", @@ -46165,7 +46165,7 @@ "maybe_exists%3#0" ] }, - "4934": { + "4880": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -46175,7 +46175,7 @@ "maybe_exists%3#0" ] }, - "4936": { + "4882": { "op": "!", "defined_out": [ "box_prefixed_key%6#0", @@ -46191,7 +46191,7 @@ "tmp%8#0" ] }, - "4937": { + "4883": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -46201,7 +46201,7 @@ "box_prefixed_key%6#0" ] }, - "4938": { + "4884": { "op": "dig 2", "defined_out": [ "box_prefixed_key%6#0", @@ -46217,7 +46217,7 @@ "validity#0" ] }, - "4940": { + "4886": { "op": "box_put", "stack_out": [ "role_address#0", @@ -46225,10 +46225,10 @@ "role_id#1" ] }, - "4941": { + "4887": { "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14" }, - "4944": { + "4890": { "block": "rbac_assign_role_after_if_else@11", "stack_in": [ "role_address#0", @@ -46246,7 +46246,7 @@ "role_id#1" ] }, - "4945": { + "4891": { "op": "pushint 80", "defined_out": [ "80", @@ -46260,7 +46260,7 @@ "80" ] }, - "4947": { + "4893": { "op": "==", "defined_out": [ "role_id#1", @@ -46273,7 +46273,7 @@ "tmp%9#0" ] }, - "4948": { + "4894": { "op": "bz rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14", "stack_out": [ "role_address#0", @@ -46281,23 +46281,23 @@ "role_id#1" ] }, - "4951": { - "op": "bytec 25 // 0x52234f6273657276657223", + "4897": { + "op": "bytec 25 // 0x523a4d4f4323", "defined_out": [ - "0x52234f6273657276657223", + "0x523a4d4f4323", "role_id#1" ], "stack_out": [ "role_address#0", "validity#0", "role_id#1", - "0x52234f6273657276657223" + "0x523a4d4f4323" ] }, - "4953": { + "4899": { "op": "dig 3", "defined_out": [ - "0x52234f6273657276657223", + "0x523a4d4f4323", "role_address#0", "role_id#1" ], @@ -46305,11 +46305,11 @@ "role_address#0", "validity#0", "role_id#1", - "0x52234f6273657276657223", + "0x523a4d4f4323", "role_address#0" ] }, - "4955": { + "4901": { "op": "concat", "defined_out": [ "box_prefixed_key%8#0", @@ -46323,7 +46323,7 @@ "box_prefixed_key%8#0" ] }, - "4956": { + "4902": { "op": "dup", "defined_out": [ "box_prefixed_key%8#0", @@ -46339,7 +46339,7 @@ "box_prefixed_key%8#0 (copy)" ] }, - "4957": { + "4903": { "op": "box_len", "defined_out": [ "_%4#0", @@ -46357,7 +46357,7 @@ "maybe_exists%4#0" ] }, - "4958": { + "4904": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -46367,7 +46367,7 @@ "maybe_exists%4#0" ] }, - "4960": { + "4906": { "op": "!", "defined_out": [ "box_prefixed_key%8#0", @@ -46383,7 +46383,7 @@ "tmp%10#0" ] }, - "4961": { + "4907": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -46393,7 +46393,7 @@ "box_prefixed_key%8#0" ] }, - "4962": { + "4908": { "op": "dig 2", "defined_out": [ "box_prefixed_key%8#0", @@ -46409,7 +46409,7 @@ "validity#0" ] }, - "4964": { + "4910": { "op": "box_put", "stack_out": [ "role_address#0", @@ -46417,10 +46417,10 @@ "role_id#1" ] }, - "4965": { + "4911": { "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14" }, - "4968": { + "4914": { "subroutine": "modules.rbac.RbacModule.rbac_revoke_role[routing]", "params": {}, "block": "rbac_revoke_role", @@ -46433,7 +46433,7 @@ "role_id#0" ] }, - "4971": { + "4917": { "op": "dup", "defined_out": [ "role_id#0", @@ -46444,7 +46444,7 @@ "role_id#0 (copy)" ] }, - "4972": { + "4918": { "op": "len", "defined_out": [ "len%0#0", @@ -46455,7 +46455,7 @@ "len%0#0" ] }, - "4973": { + "4919": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -46468,7 +46468,7 @@ "1" ] }, - "4974": { + "4920": { "op": "==", "defined_out": [ "eq%0#0", @@ -46479,17 +46479,17 @@ "eq%0#0" ] }, - "4975": { + "4921": { "error": "invalid number of bytes for arc4.uint8", "op": "assert // invalid number of bytes for arc4.uint8", "stack_out": [ "role_id#0" ] }, - "4976": { + "4922": { "op": "txna ApplicationArgs 2" }, - "4979": { + "4925": { "op": "dup", "defined_out": [ "role_address#0", @@ -46501,7 +46501,7 @@ "role_address#0" ] }, - "4980": { + "4926": { "op": "cover 2", "defined_out": [ "role_address#0", @@ -46513,7 +46513,7 @@ "role_address#0" ] }, - "4982": { + "4928": { "op": "len", "defined_out": [ "len%1#0", @@ -46526,7 +46526,7 @@ "len%1#0" ] }, - "4983": { + "4929": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -46541,7 +46541,7 @@ "32" ] }, - "4984": { + "4930": { "op": "==", "defined_out": [ "eq%1#0", @@ -46554,7 +46554,7 @@ "eq%1#0" ] }, - "4985": { + "4931": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ @@ -46562,15 +46562,15 @@ "role_id#0" ] }, - "4986": { + "4932": { "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", "op": "callsub _assert_caller_is_arranger" }, - "4989": { + "4935": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", "op": "callsub _assert_is_not_asset_defaulted" }, - "4992": { + "4938": { "op": "btoi", "defined_out": [ "role_address#0", @@ -46581,7 +46581,7 @@ "role_id#1" ] }, - "4993": { + "4939": { "op": "dupn 2", "defined_out": [ "role_address#0", @@ -46595,7 +46595,7 @@ "role_id#1 (copy)" ] }, - "4995": { + "4941": { "callsub": "modules.rbac.RbacModule._assert_valid_role", "op": "callsub _assert_valid_role", "stack_out": [ @@ -46604,7 +46604,7 @@ "role_id#1" ] }, - "4998": { + "4944": { "op": "dup", "stack_out": [ "role_address#0", @@ -46613,7 +46613,7 @@ "role_id#1 (copy)" ] }, - "4999": { + "4945": { "op": "pushint 20", "defined_out": [ "20", @@ -46629,7 +46629,7 @@ "20" ] }, - "5001": { + "4947": { "op": "!=", "defined_out": [ "role_address#0", @@ -46643,7 +46643,7 @@ "tmp%0#2" ] }, - "5002": { + "4948": { "error": "Invalid role identifier", "op": "assert // Invalid role identifier", "stack_out": [ @@ -46652,7 +46652,7 @@ "role_id#1" ] }, - "5003": { + "4949": { "op": "pushint 40", "defined_out": [ "40", @@ -46666,7 +46666,7 @@ "40" ] }, - "5005": { + "4951": { "op": "==", "defined_out": [ "role_address#0", @@ -46679,36 +46679,36 @@ "tmp%1#1" ] }, - "5006": { + "4952": { "op": "bz rbac_revoke_role_after_if_else@3", "stack_out": [ "role_address#0", "role_id#1" ] }, - "5009": { - "op": "bytec 23 // 0x52234163636f756e744d616e6167657223", + "4955": { + "op": "bytec 23 // 0x523a4d4e4723", "defined_out": [ - "0x52234163636f756e744d616e6167657223", + "0x523a4d4e4723", "role_address#0", "role_id#1" ], "stack_out": [ "role_address#0", "role_id#1", - "0x52234163636f756e744d616e6167657223" + "0x523a4d4e4723" ] }, - "5011": { + "4957": { "op": "dig 2", "stack_out": [ "role_address#0", "role_id#1", - "0x52234163636f756e744d616e6167657223", + "0x523a4d4e4723", "role_address#0" ] }, - "5013": { + "4959": { "op": "concat", "defined_out": [ "box_prefixed_key%0#0", @@ -46721,7 +46721,7 @@ "box_prefixed_key%0#0" ] }, - "5014": { + "4960": { "op": "dup", "defined_out": [ "box_prefixed_key%0#0", @@ -46736,7 +46736,7 @@ "box_prefixed_key%0#0 (copy)" ] }, - "5015": { + "4961": { "op": "box_len", "defined_out": [ "_%0#0", @@ -46753,7 +46753,7 @@ "maybe_exists%0#0" ] }, - "5016": { + "4962": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -46762,7 +46762,7 @@ "maybe_exists%0#0" ] }, - "5018": { + "4964": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -46771,7 +46771,7 @@ "box_prefixed_key%0#0" ] }, - "5019": { + "4965": { "op": "box_del", "defined_out": [ "role_address#0", @@ -46784,14 +46784,14 @@ "{box_del}" ] }, - "5020": { + "4966": { "op": "pop", "stack_out": [ "role_address#0", "role_id#1" ] }, - "5021": { + "4967": { "block": "rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12", "stack_in": [ "role_address#0", @@ -46807,7 +46807,7 @@ "tmp%2#1" ] }, - "5023": { + "4969": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0" @@ -46818,7 +46818,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "5024": { + "4970": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -46831,7 +46831,7 @@ "0x151f7c75" ] }, - "5025": { + "4971": { "op": "swap", "stack_out": [ "role_address#0", @@ -46840,7 +46840,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "5026": { + "4972": { "op": "concat", "defined_out": [ "tmp%5#0" @@ -46851,14 +46851,14 @@ "tmp%5#0" ] }, - "5027": { + "4973": { "op": "log", "stack_out": [ "role_address#0", "role_id#1" ] }, - "5028": { + "4974": { "op": "intc_1 // 1", "defined_out": [ "1" @@ -46869,14 +46869,14 @@ "1" ] }, - "5029": { + "4975": { "op": "return", "stack_out": [ "role_address#0", "role_id#1" ] }, - "5030": { + "4976": { "block": "rbac_revoke_role_after_if_else@3", "stack_in": [ "role_address#0", @@ -46892,7 +46892,7 @@ "role_id#1" ] }, - "5031": { + "4977": { "op": "pushint 50", "defined_out": [ "50", @@ -46905,7 +46905,7 @@ "50" ] }, - "5033": { + "4979": { "op": "==", "defined_out": [ "role_id#1", @@ -46917,40 +46917,40 @@ "tmp%2#2" ] }, - "5034": { + "4980": { "op": "bz rbac_revoke_role_after_if_else@5", "stack_out": [ "role_address#0", "role_id#1" ] }, - "5037": { - "op": "bytec 22 // 0x52235072696d6172794465616c657223", + "4983": { + "op": "bytec 22 // 0x523a50594423", "defined_out": [ - "0x52235072696d6172794465616c657223", + "0x523a50594423", "role_id#1" ], "stack_out": [ "role_address#0", "role_id#1", - "0x52235072696d6172794465616c657223" + "0x523a50594423" ] }, - "5039": { + "4985": { "op": "dig 2", "defined_out": [ - "0x52235072696d6172794465616c657223", + "0x523a50594423", "role_address#0", "role_id#1" ], "stack_out": [ "role_address#0", "role_id#1", - "0x52235072696d6172794465616c657223", + "0x523a50594423", "role_address#0" ] }, - "5041": { + "4987": { "op": "concat", "defined_out": [ "box_prefixed_key%2#0", @@ -46963,7 +46963,7 @@ "box_prefixed_key%2#0" ] }, - "5042": { + "4988": { "op": "dup", "defined_out": [ "box_prefixed_key%2#0", @@ -46978,7 +46978,7 @@ "box_prefixed_key%2#0 (copy)" ] }, - "5043": { + "4989": { "op": "box_len", "defined_out": [ "_%1#0", @@ -46995,7 +46995,7 @@ "maybe_exists%1#0" ] }, - "5044": { + "4990": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -47004,7 +47004,7 @@ "maybe_exists%1#0" ] }, - "5046": { + "4992": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -47013,7 +47013,7 @@ "box_prefixed_key%2#0" ] }, - "5047": { + "4993": { "op": "box_del", "defined_out": [ "role_address#0", @@ -47026,17 +47026,17 @@ "{box_del}" ] }, - "5048": { + "4994": { "op": "pop", "stack_out": [ "role_address#0", "role_id#1" ] }, - "5049": { + "4995": { "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" }, - "5052": { + "4998": { "block": "rbac_revoke_role_after_if_else@5", "stack_in": [ "role_address#0", @@ -47052,7 +47052,7 @@ "role_id#1" ] }, - "5053": { + "4999": { "op": "pushint 60", "defined_out": [ "60", @@ -47065,7 +47065,7 @@ "60" ] }, - "5055": { + "5001": { "op": "==", "defined_out": [ "role_id#1", @@ -47077,40 +47077,40 @@ "tmp%3#0" ] }, - "5056": { + "5002": { "op": "bz rbac_revoke_role_after_if_else@7", "stack_out": [ "role_address#0", "role_id#1" ] }, - "5059": { - "op": "bytec 32 // 0x52235472757374656523", + "5005": { + "op": "bytec 32 // 0x523a54525323", "defined_out": [ - "0x52235472757374656523", + "0x523a54525323", "role_id#1" ], "stack_out": [ "role_address#0", "role_id#1", - "0x52235472757374656523" + "0x523a54525323" ] }, - "5061": { + "5007": { "op": "dig 2", "defined_out": [ - "0x52235472757374656523", + "0x523a54525323", "role_address#0", "role_id#1" ], "stack_out": [ "role_address#0", "role_id#1", - "0x52235472757374656523", + "0x523a54525323", "role_address#0" ] }, - "5063": { + "5009": { "op": "concat", "defined_out": [ "box_prefixed_key%4#0", @@ -47123,7 +47123,7 @@ "box_prefixed_key%4#0" ] }, - "5064": { + "5010": { "op": "dup", "defined_out": [ "box_prefixed_key%4#0", @@ -47138,7 +47138,7 @@ "box_prefixed_key%4#0 (copy)" ] }, - "5065": { + "5011": { "op": "box_len", "defined_out": [ "_%2#0", @@ -47155,7 +47155,7 @@ "maybe_exists%2#0" ] }, - "5066": { + "5012": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -47164,7 +47164,7 @@ "maybe_exists%2#0" ] }, - "5068": { + "5014": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -47173,7 +47173,7 @@ "box_prefixed_key%4#0" ] }, - "5069": { + "5015": { "op": "box_del", "defined_out": [ "role_address#0", @@ -47186,17 +47186,17 @@ "{box_del}" ] }, - "5070": { + "5016": { "op": "pop", "stack_out": [ "role_address#0", "role_id#1" ] }, - "5071": { + "5017": { "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" }, - "5074": { + "5020": { "block": "rbac_revoke_role_after_if_else@7", "stack_in": [ "role_address#0", @@ -47212,7 +47212,7 @@ "role_id#1" ] }, - "5075": { + "5021": { "op": "pushint 70", "defined_out": [ "70", @@ -47225,7 +47225,7 @@ "70" ] }, - "5077": { + "5023": { "op": "==", "defined_out": [ "role_id#1", @@ -47237,40 +47237,40 @@ "tmp%4#1" ] }, - "5078": { + "5024": { "op": "bz rbac_revoke_role_after_if_else@9", "stack_out": [ "role_address#0", "role_id#1" ] }, - "5081": { - "op": "bytec 21 // 0x5223417574686f7269747923", + "5027": { + "op": "bytec 21 // 0x523a41555423", "defined_out": [ - "0x5223417574686f7269747923", + "0x523a41555423", "role_id#1" ], "stack_out": [ "role_address#0", "role_id#1", - "0x5223417574686f7269747923" + "0x523a41555423" ] }, - "5083": { + "5029": { "op": "dig 2", "defined_out": [ - "0x5223417574686f7269747923", + "0x523a41555423", "role_address#0", "role_id#1" ], "stack_out": [ "role_address#0", "role_id#1", - "0x5223417574686f7269747923", + "0x523a41555423", "role_address#0" ] }, - "5085": { + "5031": { "op": "concat", "defined_out": [ "box_prefixed_key%6#0", @@ -47283,7 +47283,7 @@ "box_prefixed_key%6#0" ] }, - "5086": { + "5032": { "op": "dup", "defined_out": [ "box_prefixed_key%6#0", @@ -47298,7 +47298,7 @@ "box_prefixed_key%6#0 (copy)" ] }, - "5087": { + "5033": { "op": "box_len", "defined_out": [ "_%3#0", @@ -47315,7 +47315,7 @@ "maybe_exists%3#0" ] }, - "5088": { + "5034": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -47324,7 +47324,7 @@ "maybe_exists%3#0" ] }, - "5090": { + "5036": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -47333,7 +47333,7 @@ "box_prefixed_key%6#0" ] }, - "5091": { + "5037": { "op": "box_del", "defined_out": [ "role_address#0", @@ -47346,17 +47346,17 @@ "{box_del}" ] }, - "5092": { + "5038": { "op": "pop", "stack_out": [ "role_address#0", "role_id#1" ] }, - "5093": { + "5039": { "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" }, - "5096": { + "5042": { "block": "rbac_revoke_role_after_if_else@9", "stack_in": [ "role_address#0", @@ -47372,7 +47372,7 @@ "role_id#1" ] }, - "5097": { + "5043": { "op": "pushint 80", "defined_out": [ "80", @@ -47385,7 +47385,7 @@ "80" ] }, - "5099": { + "5045": { "op": "==", "defined_out": [ "role_id#1", @@ -47397,40 +47397,40 @@ "tmp%5#1" ] }, - "5100": { + "5046": { "op": "bz rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12", "stack_out": [ "role_address#0", "role_id#1" ] }, - "5103": { - "op": "bytec 25 // 0x52234f6273657276657223", + "5049": { + "op": "bytec 25 // 0x523a4d4f4323", "defined_out": [ - "0x52234f6273657276657223", + "0x523a4d4f4323", "role_id#1" ], "stack_out": [ "role_address#0", "role_id#1", - "0x52234f6273657276657223" + "0x523a4d4f4323" ] }, - "5105": { + "5051": { "op": "dig 2", "defined_out": [ - "0x52234f6273657276657223", + "0x523a4d4f4323", "role_address#0", "role_id#1" ], "stack_out": [ "role_address#0", "role_id#1", - "0x52234f6273657276657223", + "0x523a4d4f4323", "role_address#0" ] }, - "5107": { + "5053": { "op": "concat", "defined_out": [ "box_prefixed_key%8#0", @@ -47443,7 +47443,7 @@ "box_prefixed_key%8#0" ] }, - "5108": { + "5054": { "op": "dup", "defined_out": [ "box_prefixed_key%8#0", @@ -47458,7 +47458,7 @@ "box_prefixed_key%8#0 (copy)" ] }, - "5109": { + "5055": { "op": "box_len", "defined_out": [ "_%4#0", @@ -47475,7 +47475,7 @@ "maybe_exists%4#0" ] }, - "5110": { + "5056": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -47484,7 +47484,7 @@ "maybe_exists%4#0" ] }, - "5112": { + "5058": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -47493,7 +47493,7 @@ "box_prefixed_key%8#0" ] }, - "5113": { + "5059": { "op": "box_del", "defined_out": [ "role_address#0", @@ -47506,17 +47506,17 @@ "{box_del}" ] }, - "5114": { + "5060": { "op": "pop", "stack_out": [ "role_address#0", "role_id#1" ] }, - "5115": { + "5061": { "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" }, - "5118": { + "5064": { "subroutine": "modules.rbac.RbacModule.rbac_contract_suspension[routing]", "params": {}, "block": "rbac_contract_suspension", @@ -47529,7 +47529,7 @@ "tmp%0#0" ] }, - "5121": { + "5067": { "op": "dup", "defined_out": [ "tmp%0#0", @@ -47540,7 +47540,7 @@ "tmp%0#0 (copy)" ] }, - "5122": { + "5068": { "op": "len", "defined_out": [ "len%0#0", @@ -47551,7 +47551,7 @@ "len%0#0" ] }, - "5123": { + "5069": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -47564,7 +47564,7 @@ "1" ] }, - "5124": { + "5070": { "op": "==", "defined_out": [ "eq%0#0", @@ -47575,14 +47575,14 @@ "eq%0#0" ] }, - "5125": { + "5071": { "error": "invalid number of bytes for arc4.bool", "op": "assert // invalid number of bytes for arc4.bool", "stack_out": [ "tmp%0#0" ] }, - "5126": { + "5072": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -47593,7 +47593,7 @@ "0" ] }, - "5127": { + "5073": { "op": "getbit", "defined_out": [ "suspended#0" @@ -47602,31 +47602,31 @@ "suspended#0" ] }, - "5128": { - "op": "bytec 21 // 0x5223417574686f7269747923", + "5074": { + "op": "bytec 21 // 0x523a41555423", "defined_out": [ - "0x5223417574686f7269747923", + "0x523a41555423", "suspended#0" ], "stack_out": [ "suspended#0", - "0x5223417574686f7269747923" + "0x523a41555423" ] }, - "5130": { + "5076": { "op": "txn Sender", "defined_out": [ - "0x5223417574686f7269747923", + "0x523a41555423", "suspended#0", "tmp%0#2" ], "stack_out": [ "suspended#0", - "0x5223417574686f7269747923", + "0x523a41555423", "tmp%0#2" ] }, - "5132": { + "5078": { "callsub": "modules.rbac.RbacModule._role_is_active", "op": "callsub _role_is_active", "defined_out": [ @@ -47638,14 +47638,14 @@ "tmp%1#0" ] }, - "5135": { + "5081": { "error": "Not authorized", "op": "assert // Not authorized", "stack_out": [ "suspended#0" ] }, - "5136": { + "5082": { "op": "bytec 33 // \"asset_suspended\"", "defined_out": [ "\"asset_suspended\"", @@ -47656,18 +47656,18 @@ "\"asset_suspended\"" ] }, - "5138": { + "5084": { "op": "swap", "stack_out": [ "\"asset_suspended\"", "suspended#0" ] }, - "5139": { + "5085": { "op": "app_global_put", "stack_out": [] }, - "5140": { + "5086": { "op": "global LatestTimestamp", "defined_out": [ "tmp%0#1" @@ -47676,7 +47676,7 @@ "tmp%0#1" ] }, - "5142": { + "5088": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0" @@ -47685,7 +47685,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "5143": { + "5089": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -47696,14 +47696,14 @@ "0x151f7c75" ] }, - "5144": { + "5090": { "op": "swap", "stack_out": [ "0x151f7c75", "aggregate%val_as_bytes%0#0" ] }, - "5145": { + "5091": { "op": "concat", "defined_out": [ "tmp%4#0" @@ -47712,21 +47712,21 @@ "tmp%4#0" ] }, - "5146": { + "5092": { "op": "log", "stack_out": [] }, - "5147": { + "5093": { "op": "intc_1 // 1", "stack_out": [ "1" ] }, - "5148": { + "5094": { "op": "return", "stack_out": [] }, - "5149": { + "5095": { "subroutine": "modules.rbac.RbacModule.rbac_get_arranger[routing]", "params": {}, "block": "rbac_get_arranger", @@ -47739,18 +47739,18 @@ "0" ] }, - "5150": { - "op": "bytec 18 // 0x5223417272616e67657223", + "5096": { + "op": "bytec 18 // 0x523a41525223", "defined_out": [ "0", - "0x5223417272616e67657223" + "0x523a41525223" ], "stack_out": [ "0", - "0x5223417272616e67657223" + "0x523a41525223" ] }, - "5152": { + "5098": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -47761,14 +47761,14 @@ "maybe_exists%0#0" ] }, - "5153": { + "5099": { "error": "check self.arranger exists", "op": "assert // check self.arranger exists", "stack_out": [ "maybe_value%0#0" ] }, - "5154": { + "5100": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -47779,14 +47779,14 @@ "0x151f7c75" ] }, - "5155": { + "5101": { "op": "swap", "stack_out": [ "0x151f7c75", "maybe_value%0#0" ] }, - "5156": { + "5102": { "op": "concat", "defined_out": [ "tmp%2#0" @@ -47795,11 +47795,11 @@ "tmp%2#0" ] }, - "5157": { + "5103": { "op": "log", "stack_out": [] }, - "5158": { + "5104": { "op": "intc_1 // 1", "defined_out": [ "1" @@ -47808,11 +47808,11 @@ "1" ] }, - "5159": { + "5105": { "op": "return", "stack_out": [] }, - "5160": { + "5106": { "subroutine": "modules.rbac.RbacModule.rbac_get_address_roles[routing]", "params": {}, "block": "rbac_get_address_roles", @@ -47825,7 +47825,7 @@ "address#0" ] }, - "5163": { + "5109": { "op": "dup", "defined_out": [ "address#0", @@ -47836,7 +47836,7 @@ "address#0 (copy)" ] }, - "5164": { + "5110": { "op": "len", "defined_out": [ "address#0", @@ -47847,7 +47847,7 @@ "len%0#0" ] }, - "5165": { + "5111": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -47860,7 +47860,7 @@ "32" ] }, - "5166": { + "5112": { "op": "==", "defined_out": [ "address#0", @@ -47871,33 +47871,33 @@ "eq%0#0" ] }, - "5167": { + "5113": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ "address#0" ] }, - "5168": { - "op": "bytec 23 // 0x52234163636f756e744d616e6167657223", + "5114": { + "op": "bytec 23 // 0x523a4d4e4723", "defined_out": [ - "0x52234163636f756e744d616e6167657223", + "0x523a4d4e4723", "address#0" ], "stack_out": [ "address#0", - "0x52234163636f756e744d616e6167657223" + "0x523a4d4e4723" ] }, - "5170": { + "5116": { "op": "dig 1", "stack_out": [ "address#0", - "0x52234163636f756e744d616e6167657223", + "0x523a4d4e4723", "address#0 (copy)" ] }, - "5172": { + "5118": { "callsub": "modules.rbac.RbacModule._role_is_active", "op": "callsub _role_is_active", "defined_out": [ @@ -47909,29 +47909,29 @@ "tmp%0#1" ] }, - "5175": { - "op": "bytec 22 // 0x52235072696d6172794465616c657223", + "5121": { + "op": "bytec 22 // 0x523a50594423", "defined_out": [ - "0x52235072696d6172794465616c657223", + "0x523a50594423", "address#0", "tmp%0#1" ], "stack_out": [ "address#0", "tmp%0#1", - "0x52235072696d6172794465616c657223" + "0x523a50594423" ] }, - "5177": { + "5123": { "op": "dig 2", "stack_out": [ "address#0", "tmp%0#1", - "0x52235072696d6172794465616c657223", + "0x523a50594423", "address#0 (copy)" ] }, - "5179": { + "5125": { "callsub": "modules.rbac.RbacModule._role_is_active", "op": "callsub _role_is_active", "defined_out": [ @@ -47945,10 +47945,10 @@ "tmp%1#1" ] }, - "5182": { - "op": "bytec 32 // 0x52235472757374656523", + "5128": { + "op": "bytec 32 // 0x523a54525323", "defined_out": [ - "0x52235472757374656523", + "0x523a54525323", "address#0", "tmp%0#1", "tmp%1#1" @@ -47957,20 +47957,20 @@ "address#0", "tmp%0#1", "tmp%1#1", - "0x52235472757374656523" + "0x523a54525323" ] }, - "5184": { + "5130": { "op": "dig 3", "stack_out": [ "address#0", "tmp%0#1", "tmp%1#1", - "0x52235472757374656523", + "0x523a54525323", "address#0 (copy)" ] }, - "5186": { + "5132": { "callsub": "modules.rbac.RbacModule._role_is_active", "op": "callsub _role_is_active", "defined_out": [ @@ -47986,10 +47986,10 @@ "tmp%2#1" ] }, - "5189": { - "op": "bytec 21 // 0x5223417574686f7269747923", + "5135": { + "op": "bytec 21 // 0x523a41555423", "defined_out": [ - "0x5223417574686f7269747923", + "0x523a41555423", "address#0", "tmp%0#1", "tmp%1#1", @@ -48000,21 +48000,21 @@ "tmp%0#1", "tmp%1#1", "tmp%2#1", - "0x5223417574686f7269747923" + "0x523a41555423" ] }, - "5191": { + "5137": { "op": "dig 4", "stack_out": [ "address#0", "tmp%0#1", "tmp%1#1", "tmp%2#1", - "0x5223417574686f7269747923", + "0x523a41555423", "address#0 (copy)" ] }, - "5193": { + "5139": { "callsub": "modules.rbac.RbacModule._role_is_active", "op": "callsub _role_is_active", "defined_out": [ @@ -48032,10 +48032,10 @@ "tmp%3#1" ] }, - "5196": { - "op": "bytec 25 // 0x52234f6273657276657223", + "5142": { + "op": "bytec 25 // 0x523a4d4f4323", "defined_out": [ - "0x52234f6273657276657223", + "0x523a4d4f4323", "address#0", "tmp%0#1", "tmp%1#1", @@ -48048,21 +48048,21 @@ "tmp%1#1", "tmp%2#1", "tmp%3#1", - "0x52234f6273657276657223" + "0x523a4d4f4323" ] }, - "5198": { + "5144": { "op": "uncover 5", "stack_out": [ "tmp%0#1", "tmp%1#1", "tmp%2#1", "tmp%3#1", - "0x52234f6273657276657223", + "0x523a4d4f4323", "address#0" ] }, - "5200": { + "5146": { "callsub": "modules.rbac.RbacModule._role_is_active", "op": "callsub _role_is_active", "defined_out": [ @@ -48080,7 +48080,7 @@ "tmp%4#1" ] }, - "5203": { + "5149": { "op": "bytec 40 // 0x00", "defined_out": [ "0x00", @@ -48099,7 +48099,7 @@ "0x00" ] }, - "5205": { + "5151": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -48120,7 +48120,7 @@ "0" ] }, - "5206": { + "5152": { "op": "uncover 6", "stack_out": [ "tmp%1#1", @@ -48132,7 +48132,7 @@ "tmp%0#1" ] }, - "5208": { + "5154": { "op": "setbit", "defined_out": [ "aggregate%encoded_bool%0#0", @@ -48149,7 +48149,7 @@ "aggregate%encoded_bool%0#0" ] }, - "5209": { + "5155": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -48168,7 +48168,7 @@ "1" ] }, - "5210": { + "5156": { "op": "uncover 5", "stack_out": [ "tmp%2#1", @@ -48179,7 +48179,7 @@ "tmp%1#1" ] }, - "5212": { + "5158": { "op": "setbit", "defined_out": [ "aggregate%set_bit%0#0", @@ -48194,7 +48194,7 @@ "aggregate%set_bit%0#0" ] }, - "5213": { + "5159": { "op": "pushint 2", "defined_out": [ "2", @@ -48211,7 +48211,7 @@ "2" ] }, - "5215": { + "5161": { "op": "uncover 4", "stack_out": [ "tmp%3#1", @@ -48221,7 +48221,7 @@ "tmp%2#1" ] }, - "5217": { + "5163": { "op": "setbit", "defined_out": [ "aggregate%set_bit%1#0", @@ -48234,7 +48234,7 @@ "aggregate%set_bit%1#0" ] }, - "5218": { + "5164": { "op": "pushint 3", "defined_out": [ "3", @@ -48249,7 +48249,7 @@ "3" ] }, - "5220": { + "5166": { "op": "uncover 3", "stack_out": [ "tmp%4#1", @@ -48258,7 +48258,7 @@ "tmp%3#1" ] }, - "5222": { + "5168": { "op": "setbit", "defined_out": [ "aggregate%set_bit%2#0", @@ -48269,7 +48269,7 @@ "aggregate%set_bit%2#0" ] }, - "5223": { + "5169": { "op": "pushint 4", "defined_out": [ "4", @@ -48282,7 +48282,7 @@ "4" ] }, - "5225": { + "5171": { "op": "uncover 2", "stack_out": [ "aggregate%set_bit%2#0", @@ -48290,7 +48290,7 @@ "tmp%4#1" ] }, - "5227": { + "5173": { "op": "setbit", "defined_out": [ "aggregate%set_bit%3#0" @@ -48299,7 +48299,7 @@ "aggregate%set_bit%3#0" ] }, - "5228": { + "5174": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -48310,14 +48310,14 @@ "0x151f7c75" ] }, - "5229": { + "5175": { "op": "swap", "stack_out": [ "0x151f7c75", "aggregate%set_bit%3#0" ] }, - "5230": { + "5176": { "op": "concat", "defined_out": [ "tmp%8#0" @@ -48326,21 +48326,21 @@ "tmp%8#0" ] }, - "5231": { + "5177": { "op": "log", "stack_out": [] }, - "5232": { + "5178": { "op": "intc_1 // 1", "stack_out": [ "1" ] }, - "5233": { + "5179": { "op": "return", "stack_out": [] }, - "5234": { + "5180": { "subroutine": "modules.rbac.RbacModule.rbac_get_role_validity[routing]", "params": {}, "block": "rbac_get_role_validity", @@ -48353,7 +48353,7 @@ "role_id#0" ] }, - "5237": { + "5183": { "op": "dup", "defined_out": [ "role_id#0", @@ -48364,7 +48364,7 @@ "role_id#0 (copy)" ] }, - "5238": { + "5184": { "op": "len", "defined_out": [ "len%0#0", @@ -48375,7 +48375,7 @@ "len%0#0" ] }, - "5239": { + "5185": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -48388,7 +48388,7 @@ "1" ] }, - "5240": { + "5186": { "op": "==", "defined_out": [ "eq%0#0", @@ -48399,17 +48399,17 @@ "eq%0#0" ] }, - "5241": { + "5187": { "error": "invalid number of bytes for arc4.uint8", "op": "assert // invalid number of bytes for arc4.uint8", "stack_out": [ "role_id#0" ] }, - "5242": { + "5188": { "op": "txna ApplicationArgs 2" }, - "5245": { + "5191": { "op": "dup", "defined_out": [ "role_address#0", @@ -48421,7 +48421,7 @@ "role_address#0" ] }, - "5246": { + "5192": { "op": "cover 2", "defined_out": [ "role_address#0", @@ -48433,7 +48433,7 @@ "role_address#0" ] }, - "5248": { + "5194": { "op": "len", "defined_out": [ "len%1#0", @@ -48446,7 +48446,7 @@ "len%1#0" ] }, - "5249": { + "5195": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -48461,7 +48461,7 @@ "32" ] }, - "5250": { + "5196": { "op": "==", "defined_out": [ "eq%1#0", @@ -48474,7 +48474,7 @@ "eq%1#0" ] }, - "5251": { + "5197": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ @@ -48482,7 +48482,7 @@ "role_id#0" ] }, - "5252": { + "5198": { "op": "btoi", "defined_out": [ "role#0", @@ -48493,7 +48493,7 @@ "role#0" ] }, - "5253": { + "5199": { "op": "dup", "defined_out": [ "role#0", @@ -48506,7 +48506,7 @@ "role#0 (copy)" ] }, - "5254": { + "5200": { "callsub": "modules.rbac.RbacModule._assert_valid_role", "op": "callsub _assert_valid_role", "stack_out": [ @@ -48514,7 +48514,7 @@ "role#0" ] }, - "5257": { + "5203": { "op": "pushints 20 40 50 60 70 80", "defined_out": [ "20", @@ -48537,7 +48537,7 @@ "80" ] }, - "5265": { + "5211": { "op": "uncover 6", "stack_out": [ "role_address#0", @@ -48550,43 +48550,43 @@ "role#0" ] }, - "5267": { + "5213": { "op": "match rbac_get_role_validity_switch_case_0@2 rbac_get_role_validity_switch_case_1@3 rbac_get_role_validity_switch_case_2@4 rbac_get_role_validity_switch_case_3@5 rbac_get_role_validity_switch_case_4@6 rbac_get_role_validity_switch_case_5@7", "stack_out": [ "role_address#0" ] }, - "5281": { + "5227": { "error": "Invalid role identifier", "op": "err // Invalid role identifier" }, - "5282": { + "5228": { "block": "rbac_get_role_validity_switch_case_5@7", "stack_in": [ "role_address#0" ], - "op": "bytec 25 // 0x52234f6273657276657223", + "op": "bytec 25 // 0x523a4d4f4323", "defined_out": [ - "0x52234f6273657276657223" + "0x523a4d4f4323" ], "stack_out": [ "role_address#0", - "0x52234f6273657276657223" + "0x523a4d4f4323" ] }, - "5284": { + "5230": { "op": "dig 1", "defined_out": [ - "0x52234f6273657276657223", + "0x523a4d4f4323", "role_address#0" ], "stack_out": [ "role_address#0", - "0x52234f6273657276657223", + "0x523a4d4f4323", "role_address#0" ] }, - "5286": { + "5232": { "op": "concat", "defined_out": [ "box_prefixed_key%0#1", @@ -48597,7 +48597,7 @@ "box_prefixed_key%0#1" ] }, - "5287": { + "5233": { "op": "dup", "defined_out": [ "box_prefixed_key%0#1", @@ -48610,7 +48610,7 @@ "box_prefixed_key%0#1 (copy)" ] }, - "5288": { + "5234": { "op": "box_len", "defined_out": [ "_%0#0", @@ -48625,7 +48625,7 @@ "maybe_exists%0#0" ] }, - "5289": { + "5235": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -48633,7 +48633,7 @@ "maybe_exists%0#0" ] }, - "5291": { + "5237": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -48641,7 +48641,7 @@ "box_prefixed_key%0#1" ] }, - "5292": { + "5238": { "op": "box_get", "defined_out": [ "aggregate%box_get%8#0", @@ -48654,7 +48654,7 @@ "aggregate%box_get%9#0" ] }, - "5293": { + "5239": { "op": "pop", "defined_out": [ "role_address#0", @@ -48665,7 +48665,7 @@ "tmp%3#0" ] }, - "5294": { + "5240": { "block": "rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9", "stack_in": [ "role_address#0", @@ -48681,7 +48681,7 @@ "0x151f7c75" ] }, - "5295": { + "5241": { "op": "swap", "defined_out": [ "0x151f7c75", @@ -48693,7 +48693,7 @@ "tmp%3#0" ] }, - "5296": { + "5242": { "op": "concat", "defined_out": [ "tmp%4#0" @@ -48703,13 +48703,13 @@ "tmp%4#0" ] }, - "5297": { + "5243": { "op": "log", "stack_out": [ "role_address#0" ] }, - "5298": { + "5244": { "op": "intc_1 // 1", "defined_out": [ "1" @@ -48719,39 +48719,39 @@ "1" ] }, - "5299": { + "5245": { "op": "return", "stack_out": [ "role_address#0" ] }, - "5300": { + "5246": { "block": "rbac_get_role_validity_switch_case_4@6", "stack_in": [ "role_address#0" ], - "op": "bytec 21 // 0x5223417574686f7269747923", + "op": "bytec 21 // 0x523a41555423", "defined_out": [ - "0x5223417574686f7269747923" + "0x523a41555423" ], "stack_out": [ "role_address#0", - "0x5223417574686f7269747923" + "0x523a41555423" ] }, - "5302": { + "5248": { "op": "dig 1", "defined_out": [ - "0x5223417574686f7269747923", + "0x523a41555423", "role_address#0" ], "stack_out": [ "role_address#0", - "0x5223417574686f7269747923", + "0x523a41555423", "role_address#0" ] }, - "5304": { + "5250": { "op": "concat", "defined_out": [ "box_prefixed_key%0#1", @@ -48762,7 +48762,7 @@ "box_prefixed_key%0#1" ] }, - "5305": { + "5251": { "op": "dup", "defined_out": [ "box_prefixed_key%0#1", @@ -48775,7 +48775,7 @@ "box_prefixed_key%0#1 (copy)" ] }, - "5306": { + "5252": { "op": "box_len", "defined_out": [ "_%0#0", @@ -48790,7 +48790,7 @@ "maybe_exists%0#0" ] }, - "5307": { + "5253": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -48798,7 +48798,7 @@ "maybe_exists%0#0" ] }, - "5309": { + "5255": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -48806,7 +48806,7 @@ "box_prefixed_key%0#1" ] }, - "5310": { + "5256": { "op": "box_get", "defined_out": [ "aggregate%box_get%6#0", @@ -48819,7 +48819,7 @@ "aggregate%box_get%7#0" ] }, - "5311": { + "5257": { "op": "pop", "defined_out": [ "role_address#0", @@ -48830,36 +48830,36 @@ "tmp%3#0" ] }, - "5312": { + "5258": { "op": "b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9" }, - "5315": { + "5261": { "block": "rbac_get_role_validity_switch_case_3@5", "stack_in": [ "role_address#0" ], - "op": "bytec 32 // 0x52235472757374656523", + "op": "bytec 32 // 0x523a54525323", "defined_out": [ - "0x52235472757374656523" + "0x523a54525323" ], "stack_out": [ "role_address#0", - "0x52235472757374656523" + "0x523a54525323" ] }, - "5317": { + "5263": { "op": "dig 1", "defined_out": [ - "0x52235472757374656523", + "0x523a54525323", "role_address#0" ], "stack_out": [ "role_address#0", - "0x52235472757374656523", + "0x523a54525323", "role_address#0" ] }, - "5319": { + "5265": { "op": "concat", "defined_out": [ "box_prefixed_key%0#1", @@ -48870,7 +48870,7 @@ "box_prefixed_key%0#1" ] }, - "5320": { + "5266": { "op": "dup", "defined_out": [ "box_prefixed_key%0#1", @@ -48883,7 +48883,7 @@ "box_prefixed_key%0#1 (copy)" ] }, - "5321": { + "5267": { "op": "box_len", "defined_out": [ "_%0#0", @@ -48898,7 +48898,7 @@ "maybe_exists%0#0" ] }, - "5322": { + "5268": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -48906,7 +48906,7 @@ "maybe_exists%0#0" ] }, - "5324": { + "5270": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -48914,7 +48914,7 @@ "box_prefixed_key%0#1" ] }, - "5325": { + "5271": { "op": "box_get", "defined_out": [ "aggregate%box_get%4#0", @@ -48927,7 +48927,7 @@ "aggregate%box_get%5#0" ] }, - "5326": { + "5272": { "op": "pop", "defined_out": [ "role_address#0", @@ -48938,36 +48938,36 @@ "tmp%3#0" ] }, - "5327": { + "5273": { "op": "b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9" }, - "5330": { + "5276": { "block": "rbac_get_role_validity_switch_case_2@4", "stack_in": [ "role_address#0" ], - "op": "bytec 22 // 0x52235072696d6172794465616c657223", + "op": "bytec 22 // 0x523a50594423", "defined_out": [ - "0x52235072696d6172794465616c657223" + "0x523a50594423" ], "stack_out": [ "role_address#0", - "0x52235072696d6172794465616c657223" + "0x523a50594423" ] }, - "5332": { + "5278": { "op": "dig 1", "defined_out": [ - "0x52235072696d6172794465616c657223", + "0x523a50594423", "role_address#0" ], "stack_out": [ "role_address#0", - "0x52235072696d6172794465616c657223", + "0x523a50594423", "role_address#0" ] }, - "5334": { + "5280": { "op": "concat", "defined_out": [ "box_prefixed_key%0#1", @@ -48978,7 +48978,7 @@ "box_prefixed_key%0#1" ] }, - "5335": { + "5281": { "op": "dup", "defined_out": [ "box_prefixed_key%0#1", @@ -48991,7 +48991,7 @@ "box_prefixed_key%0#1 (copy)" ] }, - "5336": { + "5282": { "op": "box_len", "defined_out": [ "_%0#0", @@ -49006,7 +49006,7 @@ "maybe_exists%0#0" ] }, - "5337": { + "5283": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -49014,7 +49014,7 @@ "maybe_exists%0#0" ] }, - "5339": { + "5285": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -49022,7 +49022,7 @@ "box_prefixed_key%0#1" ] }, - "5340": { + "5286": { "op": "box_get", "defined_out": [ "aggregate%box_get%2#0", @@ -49035,7 +49035,7 @@ "aggregate%box_get%3#0" ] }, - "5341": { + "5287": { "op": "pop", "defined_out": [ "role_address#0", @@ -49046,36 +49046,36 @@ "tmp%3#0" ] }, - "5342": { + "5288": { "op": "b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9" }, - "5345": { + "5291": { "block": "rbac_get_role_validity_switch_case_1@3", "stack_in": [ "role_address#0" ], - "op": "bytec 23 // 0x52234163636f756e744d616e6167657223", + "op": "bytec 23 // 0x523a4d4e4723", "defined_out": [ - "0x52234163636f756e744d616e6167657223" + "0x523a4d4e4723" ], "stack_out": [ "role_address#0", - "0x52234163636f756e744d616e6167657223" + "0x523a4d4e4723" ] }, - "5347": { + "5293": { "op": "dig 1", "defined_out": [ - "0x52234163636f756e744d616e6167657223", + "0x523a4d4e4723", "role_address#0" ], "stack_out": [ "role_address#0", - "0x52234163636f756e744d616e6167657223", + "0x523a4d4e4723", "role_address#0" ] }, - "5349": { + "5295": { "op": "concat", "defined_out": [ "box_prefixed_key%0#1", @@ -49086,7 +49086,7 @@ "box_prefixed_key%0#1" ] }, - "5350": { + "5296": { "op": "dup", "defined_out": [ "box_prefixed_key%0#1", @@ -49099,7 +49099,7 @@ "box_prefixed_key%0#1 (copy)" ] }, - "5351": { + "5297": { "op": "box_len", "defined_out": [ "_%0#0", @@ -49114,7 +49114,7 @@ "maybe_exists%0#0" ] }, - "5352": { + "5298": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -49122,7 +49122,7 @@ "maybe_exists%0#0" ] }, - "5354": { + "5300": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -49130,7 +49130,7 @@ "box_prefixed_key%0#1" ] }, - "5355": { + "5301": { "op": "box_get", "defined_out": [ "aggregate%box_get%0#0", @@ -49143,7 +49143,7 @@ "aggregate%box_get%1#0" ] }, - "5356": { + "5302": { "op": "pop", "defined_out": [ "role_address#0", @@ -49154,10 +49154,10 @@ "tmp%3#0" ] }, - "5357": { + "5303": { "op": "b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9" }, - "5360": { + "5306": { "block": "rbac_get_role_validity_switch_case_0@2", "stack_in": [ "role_address#0" @@ -49171,10 +49171,10 @@ "tmp%3#0" ] }, - "5378": { + "5324": { "op": "b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9" }, - "5381": { + "5327": { "subroutine": "modules.accounting.AccountingModule._assert_is_not_account_suspended", "params": { "holding_address#0": "bytes" @@ -49183,27 +49183,27 @@ "stack_in": [], "op": "proto 1 0" }, - "5384": { - "op": "bytec 8 // 0x52234163636f756e7423", + "5330": { + "op": "bytec 8 // 0x4123", "defined_out": [ - "0x52234163636f756e7423" + "0x4123" ], "stack_out": [ - "0x52234163636f756e7423" + "0x4123" ] }, - "5386": { + "5332": { "op": "frame_dig -1", "defined_out": [ - "0x52234163636f756e7423", + "0x4123", "holding_address#0 (copy)" ], "stack_out": [ - "0x52234163636f756e7423", + "0x4123", "holding_address#0 (copy)" ] }, - "5388": { + "5334": { "op": "concat", "defined_out": [ "box_prefixed_key%0#0" @@ -49212,7 +49212,7 @@ "box_prefixed_key%0#0" ] }, - "5389": { + "5335": { "op": "box_get", "defined_out": [ "aggregate%box_get%0#0", @@ -49223,14 +49223,14 @@ "aggregate%box_get%1#0" ] }, - "5390": { + "5336": { "error": "check self.account entry exists", "op": "assert // check self.account entry exists", "stack_out": [ "aggregate%box_get%0#0" ] }, - "5391": { + "5337": { "op": "pushint 384", "defined_out": [ "384", @@ -49241,7 +49241,7 @@ "384" ] }, - "5394": { + "5340": { "op": "getbit", "defined_out": [ "aggregate%get_bit%0#0" @@ -49250,7 +49250,7 @@ "aggregate%get_bit%0#0" ] }, - "5395": { + "5341": { "op": "!", "defined_out": [ "tmp%0#0" @@ -49259,16 +49259,16 @@ "tmp%0#0" ] }, - "5396": { + "5342": { "error": "Suspended operations", "op": "assert // Suspended operations", "stack_out": [] }, - "5397": { + "5343": { "retsub": true, "op": "retsub" }, - "5398": { + "5344": { "subroutine": "modules.accounting.AccountingModule._settle_position", "params": { "holding_address#0": "bytes" @@ -49277,27 +49277,27 @@ "stack_in": [], "op": "proto 1 2" }, - "5401": { - "op": "bytec 8 // 0x52234163636f756e7423", + "5347": { + "op": "bytec 8 // 0x4123", "defined_out": [ - "0x52234163636f756e7423" + "0x4123" ], "stack_out": [ - "0x52234163636f756e7423" + "0x4123" ] }, - "5403": { + "5349": { "op": "frame_dig -1", "defined_out": [ - "0x52234163636f756e7423", + "0x4123", "holding_address#0 (copy)" ], "stack_out": [ - "0x52234163636f756e7423", + "0x4123", "holding_address#0 (copy)" ] }, - "5405": { + "5351": { "op": "concat", "defined_out": [ "box_prefixed_key%0#1" @@ -49306,7 +49306,7 @@ "box_prefixed_key%0#1" ] }, - "5406": { + "5352": { "op": "dup", "defined_out": [ "box_prefixed_key%0#1", @@ -49317,7 +49317,7 @@ "box_prefixed_key%0#1 (copy)" ] }, - "5407": { + "5353": { "op": "box_len", "defined_out": [ "_%0#0", @@ -49330,28 +49330,28 @@ "maybe_exists%0#0" ] }, - "5408": { + "5354": { "op": "bury 1", "stack_out": [ "box_prefixed_key%0#1", "maybe_exists%0#0" ] }, - "5410": { + "5356": { "error": "Invalid account holding address", "op": "assert // Invalid account holding address", "stack_out": [ "box_prefixed_key%0#1" ] }, - "5411": { + "5357": { "op": "dup", "stack_out": [ "box_prefixed_key%0#1", "box_prefixed_key%0#1 (copy)" ] }, - "5412": { + "5358": { "op": "box_get", "defined_out": [ "aggregate%box_get%1#0", @@ -49364,14 +49364,14 @@ "aggregate%box_get%1#0" ] }, - "5413": { + "5359": { "op": "pop", "stack_out": [ "box_prefixed_key%0#1", "position#0" ] }, - "5414": { + "5360": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -49384,7 +49384,7 @@ "0" ] }, - "5415": { + "5361": { "op": "bytec 16 // \"cumulative_interest_index\"", "defined_out": [ "\"cumulative_interest_index\"", @@ -49399,7 +49399,7 @@ "\"cumulative_interest_index\"" ] }, - "5417": { + "5363": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#1", @@ -49414,7 +49414,7 @@ "maybe_exists%0#0" ] }, - "5418": { + "5364": { "error": "check self.cumulative_interest_index exists", "op": "assert // check self.cumulative_interest_index exists", "stack_out": [ @@ -49423,7 +49423,7 @@ "maybe_value%0#0" ] }, - "5419": { + "5365": { "op": "dig 1", "defined_out": [ "box_prefixed_key%0#1", @@ -49438,7 +49438,7 @@ "position#0 (copy)" ] }, - "5421": { + "5367": { "op": "pushint 57", "defined_out": [ "57", @@ -49455,7 +49455,7 @@ "57" ] }, - "5423": { + "5369": { "op": "extract_uint64", "defined_out": [ "box_prefixed_key%0#1", @@ -49470,7 +49470,7 @@ "values%0#0" ] }, - "5424": { + "5370": { "op": "-", "defined_out": [ "box_prefixed_key%0#1", @@ -49483,7 +49483,7 @@ "interest_delta#0" ] }, - "5425": { + "5371": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#1", @@ -49492,7 +49492,7 @@ "0" ] }, - "5426": { + "5372": { "op": "bytec 17 // \"cumulative_principal_index\"", "defined_out": [ "\"cumulative_principal_index\"", @@ -49509,7 +49509,7 @@ "\"cumulative_principal_index\"" ] }, - "5428": { + "5374": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#1", @@ -49526,7 +49526,7 @@ "maybe_exists%1#0" ] }, - "5429": { + "5375": { "error": "check self.cumulative_principal_index exists", "op": "assert // check self.cumulative_principal_index exists", "stack_out": [ @@ -49536,7 +49536,7 @@ "maybe_value%1#0" ] }, - "5430": { + "5376": { "op": "dig 2", "stack_out": [ "box_prefixed_key%0#1", @@ -49546,7 +49546,7 @@ "position#0 (copy)" ] }, - "5432": { + "5378": { "op": "pushint 65", "defined_out": [ "65", @@ -49565,7 +49565,7 @@ "65" ] }, - "5434": { + "5380": { "op": "extract_uint64", "defined_out": [ "box_prefixed_key%0#1", @@ -49582,7 +49582,7 @@ "values%1#0" ] }, - "5435": { + "5381": { "op": "-", "defined_out": [ "box_prefixed_key%0#1", @@ -49597,7 +49597,7 @@ "principal_delta#0" ] }, - "5436": { + "5382": { "op": "dig 2", "stack_out": [ "box_prefixed_key%0#1", @@ -49607,7 +49607,7 @@ "position#0 (copy)" ] }, - "5438": { + "5384": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -49626,7 +49626,7 @@ "32" ] }, - "5439": { + "5385": { "op": "extract_uint64", "defined_out": [ "box_prefixed_key%0#1", @@ -49643,7 +49643,7 @@ "values%2#0" ] }, - "5440": { + "5386": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#1", @@ -49654,7 +49654,7 @@ "0" ] }, - "5441": { + "5387": { "op": "bytec 5 // \"fixed_point_scale\"", "defined_out": [ "\"fixed_point_scale\"", @@ -49675,7 +49675,7 @@ "\"fixed_point_scale\"" ] }, - "5443": { + "5389": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#1", @@ -49696,7 +49696,7 @@ "maybe_exists%2#0" ] }, - "5444": { + "5390": { "error": "check self.fixed_point_scale exists", "op": "assert // check self.fixed_point_scale exists", "stack_out": [ @@ -49708,7 +49708,7 @@ "maybe_value%2#0" ] }, - "5445": { + "5391": { "op": "uncover 3", "stack_out": [ "box_prefixed_key%0#1", @@ -49719,7 +49719,7 @@ "interest_delta#0" ] }, - "5447": { + "5393": { "op": "dig 2", "defined_out": [ "box_prefixed_key%0#1", @@ -49740,7 +49740,7 @@ "values%2#0 (copy)" ] }, - "5449": { + "5395": { "op": "uncover 2", "stack_out": [ "box_prefixed_key%0#1", @@ -49752,7 +49752,7 @@ "maybe_value%2#0" ] }, - "5451": { + "5397": { "callsub": "modules.actus_kernel.ActusKernelModule._scaled_mul_div", "op": "callsub _scaled_mul_div", "defined_out": [ @@ -49770,7 +49770,7 @@ "claimable_interest#0" ] }, - "5454": { + "5400": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#1", @@ -49781,7 +49781,7 @@ "0" ] }, - "5455": { + "5401": { "op": "bytec 5 // \"fixed_point_scale\"", "stack_out": [ "box_prefixed_key%0#1", @@ -49793,7 +49793,7 @@ "\"fixed_point_scale\"" ] }, - "5457": { + "5403": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#1", @@ -49814,7 +49814,7 @@ "maybe_exists%3#0" ] }, - "5458": { + "5404": { "error": "check self.fixed_point_scale exists", "op": "assert // check self.fixed_point_scale exists", "stack_out": [ @@ -49826,7 +49826,7 @@ "maybe_value%3#0" ] }, - "5459": { + "5405": { "op": "uncover 3", "stack_out": [ "box_prefixed_key%0#1", @@ -49837,7 +49837,7 @@ "principal_delta#0" ] }, - "5461": { + "5407": { "op": "uncover 3", "stack_out": [ "box_prefixed_key%0#1", @@ -49848,7 +49848,7 @@ "values%2#0" ] }, - "5463": { + "5409": { "op": "uncover 2", "stack_out": [ "box_prefixed_key%0#1", @@ -49859,7 +49859,7 @@ "maybe_value%3#0" ] }, - "5465": { + "5411": { "callsub": "modules.actus_kernel.ActusKernelModule._scaled_mul_div", "op": "callsub _scaled_mul_div", "defined_out": [ @@ -49875,7 +49875,7 @@ "claimable_principal#0" ] }, - "5468": { + "5414": { "op": "dig 2", "stack_out": [ "box_prefixed_key%0#1", @@ -49885,7 +49885,7 @@ "position#0 (copy)" ] }, - "5470": { + "5416": { "op": "pushint 73", "defined_out": [ "73", @@ -49904,7 +49904,7 @@ "73" ] }, - "5472": { + "5418": { "op": "extract_uint64", "defined_out": [ "box_prefixed_key%0#1", @@ -49921,7 +49921,7 @@ "values%4#0" ] }, - "5473": { + "5419": { "op": "dig 2", "defined_out": [ "box_prefixed_key%0#1", @@ -49940,7 +49940,7 @@ "claimable_interest#0 (copy)" ] }, - "5475": { + "5421": { "op": "+", "defined_out": [ "box_prefixed_key%0#1", @@ -49957,7 +49957,7 @@ "tmp%4#0" ] }, - "5476": { + "5422": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0", @@ -49974,7 +49974,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "5477": { + "5423": { "op": "uncover 3", "stack_out": [ "box_prefixed_key%0#1", @@ -49984,7 +49984,7 @@ "position#0" ] }, - "5479": { + "5425": { "op": "swap", "stack_out": [ "box_prefixed_key%0#1", @@ -49994,7 +49994,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "5480": { + "5426": { "op": "replace2 73", "stack_out": [ "box_prefixed_key%0#1", @@ -50003,7 +50003,7 @@ "position#0" ] }, - "5482": { + "5428": { "op": "dup", "stack_out": [ "box_prefixed_key%0#1", @@ -50013,7 +50013,7 @@ "position#0 (copy)" ] }, - "5483": { + "5429": { "op": "pushint 81", "defined_out": [ "81", @@ -50032,7 +50032,7 @@ "81" ] }, - "5485": { + "5431": { "op": "extract_uint64", "defined_out": [ "box_prefixed_key%0#1", @@ -50049,7 +50049,7 @@ "values%5#0" ] }, - "5486": { + "5432": { "op": "dig 2", "defined_out": [ "box_prefixed_key%0#1", @@ -50068,7 +50068,7 @@ "claimable_principal#0 (copy)" ] }, - "5488": { + "5434": { "op": "+", "defined_out": [ "box_prefixed_key%0#1", @@ -50085,7 +50085,7 @@ "tmp%5#0" ] }, - "5489": { + "5435": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%1#0", @@ -50102,7 +50102,7 @@ "aggregate%val_as_bytes%1#0" ] }, - "5490": { + "5436": { "op": "replace2 81", "stack_out": [ "box_prefixed_key%0#1", @@ -50111,7 +50111,7 @@ "position#0" ] }, - "5492": { + "5438": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#1", @@ -50121,7 +50121,7 @@ "0" ] }, - "5493": { + "5439": { "op": "bytec 16 // \"cumulative_interest_index\"", "stack_out": [ "box_prefixed_key%0#1", @@ -50132,7 +50132,7 @@ "\"cumulative_interest_index\"" ] }, - "5495": { + "5441": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#1", @@ -50151,7 +50151,7 @@ "maybe_exists%4#0" ] }, - "5496": { + "5442": { "error": "check self.cumulative_interest_index exists", "op": "assert // check self.cumulative_interest_index exists", "stack_out": [ @@ -50162,7 +50162,7 @@ "maybe_value%4#0" ] }, - "5497": { + "5443": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%2#0", @@ -50179,7 +50179,7 @@ "aggregate%val_as_bytes%2#0" ] }, - "5498": { + "5444": { "op": "replace2 57", "stack_out": [ "box_prefixed_key%0#1", @@ -50188,7 +50188,7 @@ "position#0" ] }, - "5500": { + "5446": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#1", @@ -50198,7 +50198,7 @@ "0" ] }, - "5501": { + "5447": { "op": "bytec 17 // \"cumulative_principal_index\"", "stack_out": [ "box_prefixed_key%0#1", @@ -50209,7 +50209,7 @@ "\"cumulative_principal_index\"" ] }, - "5503": { + "5449": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#1", @@ -50228,7 +50228,7 @@ "maybe_exists%5#0" ] }, - "5504": { + "5450": { "error": "check self.cumulative_principal_index exists", "op": "assert // check self.cumulative_principal_index exists", "stack_out": [ @@ -50239,7 +50239,7 @@ "maybe_value%5#0" ] }, - "5505": { + "5451": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%3#0", @@ -50256,7 +50256,7 @@ "aggregate%val_as_bytes%3#0" ] }, - "5506": { + "5452": { "op": "replace2 65", "stack_out": [ "box_prefixed_key%0#1", @@ -50265,7 +50265,7 @@ "position#0" ] }, - "5508": { + "5454": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#1", @@ -50275,7 +50275,7 @@ "0" ] }, - "5509": { + "5455": { "op": "bytec_2 // \"event_cursor\"", "defined_out": [ "\"event_cursor\"", @@ -50294,7 +50294,7 @@ "\"event_cursor\"" ] }, - "5510": { + "5456": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#1", @@ -50313,7 +50313,7 @@ "maybe_exists%6#0" ] }, - "5511": { + "5457": { "error": "check self.event_cursor exists", "op": "assert // check self.event_cursor exists", "stack_out": [ @@ -50324,7 +50324,7 @@ "maybe_value%6#0" ] }, - "5512": { + "5458": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%4#0", @@ -50341,7 +50341,7 @@ "aggregate%val_as_bytes%4#0" ] }, - "5513": { + "5459": { "op": "replace2 49", "stack_out": [ "box_prefixed_key%0#1", @@ -50350,7 +50350,7 @@ "position#0" ] }, - "5515": { + "5461": { "op": "uncover 3", "stack_out": [ "claimable_interest#0", @@ -50359,7 +50359,7 @@ "box_prefixed_key%0#1" ] }, - "5517": { + "5463": { "op": "swap", "stack_out": [ "claimable_interest#0", @@ -50368,18 +50368,18 @@ "position#0" ] }, - "5518": { + "5464": { "op": "box_put", "stack_out": [ "claimable_interest#0", "claimable_principal#0" ] }, - "5519": { + "5465": { "retsub": true, "op": "retsub" }, - "5520": { + "5466": { "subroutine": "modules.accounting.AccountingModule._ensure_units_activated", "params": { "holding_address#0": "bytes" @@ -50388,44 +50388,44 @@ "stack_in": [], "op": "proto 1 0" }, - "5523": { + "5469": { "op": "intc_0 // 0", "stack_out": [ "position#0" ] }, - "5524": { + "5470": { "op": "pushbytes \"\"", "stack_out": [ "position#0", "activated_units#0" ] }, - "5526": { - "op": "bytec 8 // 0x52234163636f756e7423", + "5472": { + "op": "bytec 8 // 0x4123", "defined_out": [ - "0x52234163636f756e7423" + "0x4123" ], "stack_out": [ "position#0", "activated_units#0", - "0x52234163636f756e7423" + "0x4123" ] }, - "5528": { + "5474": { "op": "frame_dig -1", "defined_out": [ - "0x52234163636f756e7423", + "0x4123", "holding_address#0 (copy)" ], "stack_out": [ "position#0", "activated_units#0", - "0x52234163636f756e7423", + "0x4123", "holding_address#0 (copy)" ] }, - "5530": { + "5476": { "op": "concat", "defined_out": [ "box_prefixed_key%0#1" @@ -50436,7 +50436,7 @@ "box_prefixed_key%0#1" ] }, - "5531": { + "5477": { "op": "dup", "defined_out": [ "box_prefixed_key%0#1" @@ -50448,7 +50448,7 @@ "box_prefixed_key%0#1" ] }, - "5532": { + "5478": { "op": "box_len", "defined_out": [ "_%0#0", @@ -50463,7 +50463,7 @@ "maybe_exists%0#0" ] }, - "5533": { + "5479": { "op": "bury 1", "stack_out": [ "position#0", @@ -50472,7 +50472,7 @@ "maybe_exists%0#0" ] }, - "5535": { + "5481": { "error": "Invalid account holding address", "op": "assert // Invalid account holding address", "stack_out": [ @@ -50481,7 +50481,7 @@ "box_prefixed_key%0#1" ] }, - "5536": { + "5482": { "op": "intc_0 // 0", "stack_out": [ "position#0", @@ -50490,7 +50490,7 @@ "0" ] }, - "5537": { + "5483": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"", @@ -50505,7 +50505,7 @@ "\"status\"" ] }, - "5538": { + "5484": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#1", @@ -50520,7 +50520,7 @@ "maybe_exists%0#0" ] }, - "5539": { + "5485": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ @@ -50530,7 +50530,7 @@ "maybe_value%0#0" ] }, - "5540": { + "5486": { "op": "pushint 50", "defined_out": [ "50", @@ -50545,7 +50545,7 @@ "50" ] }, - "5542": { + "5488": { "op": "==", "defined_out": [ "box_prefixed_key%0#1", @@ -50558,7 +50558,7 @@ "tmp%0#1" ] }, - "5543": { + "5489": { "op": "bz _ensure_units_activated_after_if_else@2", "stack_out": [ "position#0", @@ -50566,11 +50566,11 @@ "box_prefixed_key%0#1" ] }, - "5546": { + "5492": { "retsub": true, "op": "retsub" }, - "5547": { + "5493": { "block": "_ensure_units_activated_after_if_else@2", "stack_in": [ "position#0", @@ -50588,7 +50588,7 @@ "box_prefixed_key%0#1" ] }, - "5549": { + "5495": { "op": "box_get", "defined_out": [ "aggregate%box_get%1#0", @@ -50603,7 +50603,7 @@ "aggregate%box_get%1#0" ] }, - "5550": { + "5496": { "op": "swap", "stack_out": [ "position#0", @@ -50613,7 +50613,7 @@ "position#0" ] }, - "5551": { + "5497": { "op": "dup", "stack_out": [ "position#0", @@ -50624,7 +50624,7 @@ "position#0 (copy)" ] }, - "5552": { + "5498": { "op": "cover 2", "stack_out": [ "position#0", @@ -50635,7 +50635,7 @@ "position#0" ] }, - "5554": { + "5500": { "op": "frame_bury 0", "defined_out": [ "aggregate%box_get%1#0", @@ -50650,7 +50650,7 @@ "aggregate%box_get%1#0" ] }, - "5556": { + "5502": { "error": "check self.account entry exists", "op": "assert // check self.account entry exists", "stack_out": [ @@ -50660,7 +50660,7 @@ "position#0" ] }, - "5557": { + "5503": { "op": "pushint 40", "defined_out": [ "40", @@ -50675,7 +50675,7 @@ "40" ] }, - "5559": { + "5505": { "op": "extract_uint64", "defined_out": [ "activated_units#0", @@ -50689,7 +50689,7 @@ "activated_units#0" ] }, - "5560": { + "5506": { "op": "dup", "stack_out": [ "position#0", @@ -50699,7 +50699,7 @@ "activated_units#0" ] }, - "5561": { + "5507": { "op": "frame_bury 1", "defined_out": [ "activated_units#0", @@ -50713,7 +50713,7 @@ "activated_units#0" ] }, - "5563": { + "5509": { "op": "bnz _ensure_units_activated_after_if_else@4", "stack_out": [ "position#0", @@ -50721,11 +50721,11 @@ "box_prefixed_key%0#1" ] }, - "5566": { + "5512": { "retsub": true, "op": "retsub" }, - "5567": { + "5513": { "block": "_ensure_units_activated_after_if_else@4", "stack_in": [ "position#0", @@ -50743,7 +50743,7 @@ "position#0" ] }, - "5569": { + "5515": { "op": "dup", "defined_out": [ "position#0", @@ -50757,7 +50757,7 @@ "position#0 (copy)" ] }, - "5570": { + "5516": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -50773,7 +50773,7 @@ "32" ] }, - "5571": { + "5517": { "op": "extract_uint64", "defined_out": [ "position#0", @@ -50787,7 +50787,7 @@ "values%2#0" ] }, - "5572": { + "5518": { "op": "frame_dig 1", "defined_out": [ "activated_units#0", @@ -50803,7 +50803,7 @@ "activated_units#0" ] }, - "5574": { + "5520": { "op": "dup", "defined_out": [ "activated_units#0", @@ -50821,7 +50821,7 @@ "activated_units#0 (copy)" ] }, - "5575": { + "5521": { "op": "cover 3", "stack_out": [ "position#0", @@ -50833,7 +50833,7 @@ "activated_units#0 (copy)" ] }, - "5577": { + "5523": { "op": "+", "defined_out": [ "activated_units#0", @@ -50849,7 +50849,7 @@ "tmp%2#0" ] }, - "5578": { + "5524": { "op": "itob", "defined_out": [ "activated_units#0", @@ -50865,7 +50865,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "5579": { + "5525": { "op": "replace2 32", "stack_out": [ "position#0", @@ -50875,7 +50875,7 @@ "position#0" ] }, - "5581": { + "5527": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -50891,7 +50891,7 @@ "0" ] }, - "5582": { + "5528": { "op": "itob", "defined_out": [ "activated_units#0", @@ -50907,7 +50907,7 @@ "aggregate%val_as_bytes%1#0" ] }, - "5583": { + "5529": { "op": "replace2 40", "stack_out": [ "position#0", @@ -50917,7 +50917,7 @@ "position#0" ] }, - "5585": { + "5531": { "op": "frame_dig 2", "defined_out": [ "activated_units#0", @@ -50933,7 +50933,7 @@ "box_prefixed_key%0#1" ] }, - "5587": { + "5533": { "op": "swap", "stack_out": [ "position#0", @@ -50944,7 +50944,7 @@ "position#0" ] }, - "5588": { + "5534": { "op": "box_put", "stack_out": [ "position#0", @@ -50953,7 +50953,7 @@ "activated_units#0" ] }, - "5589": { + "5535": { "op": "intc_0 // 0", "stack_out": [ "position#0", @@ -50963,7 +50963,7 @@ "0" ] }, - "5590": { + "5536": { "op": "bytec 11 // \"reserved_units_total\"", "defined_out": [ "\"reserved_units_total\"", @@ -50981,7 +50981,7 @@ "\"reserved_units_total\"" ] }, - "5592": { + "5538": { "op": "app_global_get_ex", "defined_out": [ "activated_units#0", @@ -50999,7 +50999,7 @@ "maybe_exists%0#0" ] }, - "5593": { + "5539": { "error": "check self.reserved_units_total exists", "op": "assert // check self.reserved_units_total exists", "stack_out": [ @@ -51010,7 +51010,7 @@ "maybe_value%0#0" ] }, - "5594": { + "5540": { "op": "dup", "defined_out": [ "activated_units#0", @@ -51028,7 +51028,7 @@ "maybe_value%0#0 (copy)" ] }, - "5595": { + "5541": { "op": "dig 2", "stack_out": [ "position#0", @@ -51040,7 +51040,7 @@ "activated_units#0 (copy)" ] }, - "5597": { + "5543": { "op": ">=", "defined_out": [ "activated_units#0", @@ -51058,7 +51058,7 @@ "tmp%3#0" ] }, - "5598": { + "5544": { "error": "Insufficient remaining D-ASA units", "op": "assert // Insufficient remaining D-ASA units", "stack_out": [ @@ -51069,7 +51069,7 @@ "maybe_value%0#0" ] }, - "5599": { + "5545": { "op": "swap", "stack_out": [ "position#0", @@ -51079,7 +51079,7 @@ "activated_units#0" ] }, - "5600": { + "5546": { "op": "-", "defined_out": [ "activated_units#0", @@ -51094,7 +51094,7 @@ "tmp%4#0" ] }, - "5601": { + "5547": { "op": "bytec 11 // \"reserved_units_total\"", "stack_out": [ "position#0", @@ -51104,7 +51104,7 @@ "\"reserved_units_total\"" ] }, - "5603": { + "5549": { "op": "swap", "stack_out": [ "position#0", @@ -51114,7 +51114,7 @@ "tmp%4#0" ] }, - "5604": { + "5550": { "op": "app_global_put", "stack_out": [ "position#0", @@ -51122,11 +51122,11 @@ "box_prefixed_key%0#1" ] }, - "5605": { + "5551": { "retsub": true, "op": "retsub" }, - "5606": { + "5552": { "subroutine": "modules.actus_kernel.ActusKernelModule._scaled_mul_div", "params": { "multiplicand#0": "uint64", @@ -51137,7 +51137,7 @@ "stack_in": [], "op": "proto 3 1" }, - "5609": { + "5555": { "op": "frame_dig -3", "defined_out": [ "multiplicand#0 (copy)" @@ -51146,11 +51146,11 @@ "multiplicand#0 (copy)" ] }, - "5611": { + "5557": { "op": "bz _scaled_mul_div_if_body@2", "stack_out": [] }, - "5614": { + "5560": { "op": "frame_dig -2", "defined_out": [ "multiplier#0 (copy)" @@ -51159,11 +51159,11 @@ "multiplier#0 (copy)" ] }, - "5616": { + "5562": { "op": "bnz _scaled_mul_div_after_if_else@3", "stack_out": [] }, - "5619": { + "5565": { "block": "_scaled_mul_div_if_body@2", "stack_in": [], "op": "intc_0 // 0", @@ -51174,11 +51174,11 @@ "0" ] }, - "5620": { + "5566": { "retsub": true, "op": "retsub" }, - "5621": { + "5567": { "block": "_scaled_mul_div_after_if_else@3", "stack_in": [], "op": "frame_dig -3", @@ -51189,7 +51189,7 @@ "multiplicand#0 (copy)" ] }, - "5623": { + "5569": { "op": "frame_dig -2", "defined_out": [ "multiplicand#0 (copy)", @@ -51200,7 +51200,7 @@ "multiplier#0 (copy)" ] }, - "5625": { + "5571": { "op": "mulw", "defined_out": [ "high#0", @@ -51211,7 +51211,7 @@ "low#0" ] }, - "5626": { + "5572": { "op": "frame_dig -1", "defined_out": [ "divisor#0 (copy)", @@ -51224,7 +51224,7 @@ "divisor#0 (copy)" ] }, - "5628": { + "5574": { "op": "divw", "defined_out": [ "tmp%4#0" @@ -51233,11 +51233,11 @@ "tmp%4#0" ] }, - "5629": { + "5575": { "retsub": true, "op": "retsub" }, - "5630": { + "5576": { "subroutine": "modules.actus_kernel.ActusKernelModule._amount_to_index_delta", "params": { "amount#0": "uint64" @@ -51246,7 +51246,7 @@ "stack_in": [], "op": "proto 1 1" }, - "5633": { + "5579": { "op": "frame_dig -1", "defined_out": [ "amount#0 (copy)" @@ -51255,11 +51255,11 @@ "amount#0 (copy)" ] }, - "5635": { + "5581": { "op": "bnz _amount_to_index_delta_after_if_else@2", "stack_out": [] }, - "5638": { + "5584": { "op": "intc_0 // 0", "defined_out": [ "0" @@ -51268,11 +51268,11 @@ "0" ] }, - "5639": { + "5585": { "retsub": true, "op": "retsub" }, - "5640": { + "5586": { "block": "_amount_to_index_delta_after_if_else@2", "stack_in": [], "op": "intc_0 // 0", @@ -51283,7 +51283,7 @@ "0" ] }, - "5641": { + "5587": { "op": "bytec 13 // \"total_units\"", "defined_out": [ "\"total_units\"", @@ -51294,7 +51294,7 @@ "\"total_units\"" ] }, - "5643": { + "5589": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -51305,14 +51305,14 @@ "maybe_exists%0#0" ] }, - "5644": { + "5590": { "error": "check self.total_units exists", "op": "assert // check self.total_units exists", "stack_out": [ "maybe_value%0#0" ] }, - "5645": { + "5591": { "op": "dup", "defined_out": [ "maybe_value%0#0", @@ -51323,21 +51323,21 @@ "maybe_value%0#0 (copy)" ] }, - "5646": { + "5592": { "error": "No D-ASA units", "op": "assert // No D-ASA units", "stack_out": [ "maybe_value%0#0" ] }, - "5647": { + "5593": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#0", "0" ] }, - "5648": { + "5594": { "op": "bytec 5 // \"fixed_point_scale\"", "defined_out": [ "\"fixed_point_scale\"", @@ -51350,7 +51350,7 @@ "\"fixed_point_scale\"" ] }, - "5650": { + "5596": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%1#0", @@ -51363,7 +51363,7 @@ "maybe_exists%1#0" ] }, - "5651": { + "5597": { "error": "check self.fixed_point_scale exists", "op": "assert // check self.fixed_point_scale exists", "stack_out": [ @@ -51371,7 +51371,7 @@ "maybe_value%1#0" ] }, - "5652": { + "5598": { "op": "frame_dig -1", "defined_out": [ "amount#0 (copy)", @@ -51384,7 +51384,7 @@ "amount#0 (copy)" ] }, - "5654": { + "5600": { "op": "swap", "stack_out": [ "maybe_value%0#0", @@ -51392,7 +51392,7 @@ "maybe_value%1#0" ] }, - "5655": { + "5601": { "op": "uncover 2", "stack_out": [ "amount#0 (copy)", @@ -51400,7 +51400,7 @@ "maybe_value%0#0" ] }, - "5657": { + "5603": { "callsub": "modules.actus_kernel.ActusKernelModule._scaled_mul_div", "op": "callsub _scaled_mul_div", "defined_out": [ @@ -51410,11 +51410,11 @@ "tmp%2#0" ] }, - "5660": { + "5606": { "retsub": true, "op": "retsub" }, - "5661": { + "5607": { "subroutine": "modules.actus_kernel.ActusKernelModule._index_delta_to_amount", "params": { "index_delta#0": "uint64" @@ -51423,7 +51423,7 @@ "stack_in": [], "op": "proto 1 1" }, - "5664": { + "5610": { "op": "frame_dig -1", "defined_out": [ "index_delta#0 (copy)" @@ -51432,11 +51432,11 @@ "index_delta#0 (copy)" ] }, - "5666": { + "5612": { "op": "bnz _index_delta_to_amount_after_if_else@2", "stack_out": [] }, - "5669": { + "5615": { "op": "intc_0 // 0", "defined_out": [ "0" @@ -51445,11 +51445,11 @@ "0" ] }, - "5670": { + "5616": { "retsub": true, "op": "retsub" }, - "5671": { + "5617": { "block": "_index_delta_to_amount_after_if_else@2", "stack_in": [], "op": "intc_0 // 0", @@ -51460,7 +51460,7 @@ "0" ] }, - "5672": { + "5618": { "op": "bytec 13 // \"total_units\"", "defined_out": [ "\"total_units\"", @@ -51471,7 +51471,7 @@ "\"total_units\"" ] }, - "5674": { + "5620": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -51482,21 +51482,21 @@ "maybe_exists%0#0" ] }, - "5675": { + "5621": { "error": "check self.total_units exists", "op": "assert // check self.total_units exists", "stack_out": [ "maybe_value%0#0" ] }, - "5676": { + "5622": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#0", "0" ] }, - "5677": { + "5623": { "op": "bytec 5 // \"fixed_point_scale\"", "defined_out": [ "\"fixed_point_scale\"", @@ -51509,7 +51509,7 @@ "\"fixed_point_scale\"" ] }, - "5679": { + "5625": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%1#0", @@ -51522,7 +51522,7 @@ "maybe_exists%1#0" ] }, - "5680": { + "5626": { "error": "check self.fixed_point_scale exists", "op": "assert // check self.fixed_point_scale exists", "stack_out": [ @@ -51530,10 +51530,10 @@ "maybe_value%1#0" ] }, - "5681": { + "5627": { "op": "frame_dig -1" }, - "5683": { + "5629": { "op": "swap", "defined_out": [ "index_delta#0 (copy)", @@ -51546,7 +51546,7 @@ "maybe_value%1#0" ] }, - "5684": { + "5630": { "callsub": "modules.actus_kernel.ActusKernelModule._scaled_mul_div", "op": "callsub _scaled_mul_div", "defined_out": [ @@ -51556,11 +51556,11 @@ "tmp%1#0" ] }, - "5687": { + "5633": { "retsub": true, "op": "retsub" }, - "5688": { + "5634": { "subroutine": "modules.actus_kernel.ActusKernelModule._get_schedule_entry", "params": { "event_id#0": "uint64" @@ -51569,7 +51569,7 @@ "stack_in": [], "op": "proto 1 1" }, - "5691": { + "5637": { "op": "intc_0 // 0", "defined_out": [ "0" @@ -51578,7 +51578,7 @@ "0" ] }, - "5692": { + "5638": { "op": "bytec_3 // \"schedule_entry_count\"", "defined_out": [ "\"schedule_entry_count\"", @@ -51589,7 +51589,7 @@ "\"schedule_entry_count\"" ] }, - "5693": { + "5639": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -51600,14 +51600,14 @@ "maybe_exists%0#0" ] }, - "5694": { + "5640": { "error": "check self.schedule_entry_count exists", "op": "assert // check self.schedule_entry_count exists", "stack_out": [ "maybe_value%0#0" ] }, - "5695": { + "5641": { "op": "frame_dig -1", "defined_out": [ "event_id#0 (copy)", @@ -51618,7 +51618,7 @@ "event_id#0 (copy)" ] }, - "5697": { + "5643": { "op": ">", "defined_out": [ "tmp%0#0" @@ -51627,18 +51627,18 @@ "tmp%0#0" ] }, - "5698": { + "5644": { "error": "Invalid event id", "op": "assert // Invalid event id", "stack_out": [] }, - "5699": { + "5645": { "op": "frame_dig -1", "stack_out": [ "event_id#0 (copy)" ] }, - "5701": { + "5647": { "op": "pushint 16", "defined_out": [ "16", @@ -51649,7 +51649,7 @@ "16" ] }, - "5703": { + "5649": { "op": "/", "defined_out": [ "page_index#0" @@ -51658,7 +51658,7 @@ "page_index#0" ] }, - "5704": { + "5650": { "op": "itob", "defined_out": [ "encoded_value%0#0" @@ -51667,7 +51667,7 @@ "encoded_value%0#0" ] }, - "5705": { + "5651": { "op": "bytec 24 // 0x5323", "defined_out": [ "0x5323", @@ -51678,14 +51678,14 @@ "0x5323" ] }, - "5707": { + "5653": { "op": "swap", "stack_out": [ "0x5323", "encoded_value%0#0" ] }, - "5708": { + "5654": { "op": "concat", "defined_out": [ "box_prefixed_key%0#0" @@ -51694,7 +51694,7 @@ "box_prefixed_key%0#0" ] }, - "5709": { + "5655": { "op": "dup", "defined_out": [ "box_prefixed_key%0#0", @@ -51705,7 +51705,7 @@ "box_prefixed_key%0#0 (copy)" ] }, - "5710": { + "5656": { "op": "box_len", "defined_out": [ "_%0#0", @@ -51718,28 +51718,28 @@ "maybe_exists%1#0" ] }, - "5711": { + "5657": { "op": "bury 1", "stack_out": [ "box_prefixed_key%0#0", "maybe_exists%1#0" ] }, - "5713": { + "5659": { "error": "Invalid schedule page", "op": "assert // Invalid schedule page", "stack_out": [ "box_prefixed_key%0#0" ] }, - "5714": { + "5660": { "op": "frame_dig -1", "stack_out": [ "box_prefixed_key%0#0", "event_id#0 (copy)" ] }, - "5716": { + "5662": { "op": "pushint 16", "stack_out": [ "box_prefixed_key%0#0", @@ -51747,7 +51747,7 @@ "16" ] }, - "5718": { + "5664": { "op": "%", "defined_out": [ "box_prefixed_key%0#0", @@ -51758,7 +51758,7 @@ "offset#0" ] }, - "5719": { + "5665": { "op": "dig 1", "stack_out": [ "box_prefixed_key%0#0", @@ -51766,7 +51766,7 @@ "box_prefixed_key%0#0 (copy)" ] }, - "5721": { + "5667": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#0", @@ -51775,7 +51775,7 @@ "0" ] }, - "5722": { + "5668": { "op": "pushint 2", "defined_out": [ "0", @@ -51792,7 +51792,7 @@ "2" ] }, - "5724": { + "5670": { "op": "box_extract", "defined_out": [ "box%box_extract%0#0", @@ -51805,7 +51805,7 @@ "box%box_extract%0#0" ] }, - "5725": { + "5671": { "op": "btoi", "defined_out": [ "box%array_length%0#0", @@ -51818,7 +51818,7 @@ "box%array_length%0#0" ] }, - "5726": { + "5672": { "op": "dig 1", "defined_out": [ "box%array_length%0#0", @@ -51833,7 +51833,7 @@ "offset#0 (copy)" ] }, - "5728": { + "5674": { "op": ">", "defined_out": [ "box_prefixed_key%0#0", @@ -51846,7 +51846,7 @@ "tmp%4#0" ] }, - "5729": { + "5675": { "error": "Invalid schedule page", "op": "assert // Invalid schedule page", "stack_out": [ @@ -51854,7 +51854,7 @@ "offset#0" ] }, - "5730": { + "5676": { "op": "pushint 65", "defined_out": [ "65", @@ -51867,7 +51867,7 @@ "65" ] }, - "5732": { + "5678": { "op": "*", "defined_out": [ "box%element_offset%0#0", @@ -51878,7 +51878,7 @@ "box%element_offset%0#0" ] }, - "5733": { + "5679": { "op": "pushint 2", "stack_out": [ "box_prefixed_key%0#0", @@ -51886,7 +51886,7 @@ "2" ] }, - "5735": { + "5681": { "op": "+", "defined_out": [ "box%offset%0#0", @@ -51897,7 +51897,7 @@ "box%offset%0#0" ] }, - "5736": { + "5682": { "op": "pushint 65", "stack_out": [ "box_prefixed_key%0#0", @@ -51905,7 +51905,7 @@ "65" ] }, - "5738": { + "5684": { "op": "box_extract", "defined_out": [ "box%box_extract%1#0" @@ -51914,11 +51914,11 @@ "box%box_extract%1#0" ] }, - "5739": { + "5685": { "retsub": true, "op": "retsub" }, - "5740": { + "5686": { "subroutine": "modules.actus_kernel.ActusKernelModule._assert_event_allowed_for_contract_type", "params": { "contract_type#0": "uint64", @@ -51928,7 +51928,7 @@ "stack_in": [], "op": "proto 2 0" }, - "5743": { + "5689": { "op": "frame_dig -1", "defined_out": [ "event_type#0 (copy)" @@ -51937,7 +51937,7 @@ "event_type#0 (copy)" ] }, - "5745": { + "5691": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -51948,7 +51948,7 @@ "1" ] }, - "5746": { + "5692": { "op": "==", "defined_out": [ "tmp%0#0" @@ -51957,17 +51957,17 @@ "tmp%0#0" ] }, - "5747": { + "5693": { "op": "bnz _assert_event_allowed_for_contract_type_if_body@6", "stack_out": [] }, - "5750": { + "5696": { "op": "frame_dig -1", "stack_out": [ "event_type#0 (copy)" ] }, - "5752": { + "5698": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -51978,7 +51978,7 @@ "8" ] }, - "5753": { + "5699": { "op": "==", "defined_out": [ "tmp%1#0" @@ -51987,17 +51987,17 @@ "tmp%1#0" ] }, - "5754": { + "5700": { "op": "bnz _assert_event_allowed_for_contract_type_if_body@6", "stack_out": [] }, - "5757": { + "5703": { "op": "frame_dig -1", "stack_out": [ "event_type#0 (copy)" ] }, - "5759": { + "5705": { "op": "pushint 19", "defined_out": [ "19", @@ -52008,7 +52008,7 @@ "19" ] }, - "5761": { + "5707": { "op": "==", "defined_out": [ "tmp%2#0" @@ -52017,17 +52017,17 @@ "tmp%2#0" ] }, - "5762": { + "5708": { "op": "bnz _assert_event_allowed_for_contract_type_if_body@6", "stack_out": [] }, - "5765": { + "5711": { "op": "frame_dig -1", "stack_out": [ "event_type#0 (copy)" ] }, - "5767": { + "5713": { "op": "pushint 12", "defined_out": [ "12", @@ -52038,7 +52038,7 @@ "12" ] }, - "5769": { + "5715": { "op": "==", "defined_out": [ "tmp%3#0" @@ -52047,17 +52047,17 @@ "tmp%3#0" ] }, - "5770": { + "5716": { "op": "bnz _assert_event_allowed_for_contract_type_if_body@6", "stack_out": [] }, - "5773": { + "5719": { "op": "frame_dig -1", "stack_out": [ "event_type#0 (copy)" ] }, - "5775": { + "5721": { "op": "pushint 11", "defined_out": [ "11", @@ -52068,7 +52068,7 @@ "11" ] }, - "5777": { + "5723": { "op": "==", "defined_out": [ "tmp%4#0" @@ -52077,11 +52077,11 @@ "tmp%4#0" ] }, - "5778": { + "5724": { "op": "bz _assert_event_allowed_for_contract_type_after_if_else@7", "stack_out": [] }, - "5781": { + "5727": { "block": "_assert_event_allowed_for_contract_type_if_body@6", "stack_in": [], "op": "intc_1 // 1", @@ -52092,7 +52092,7 @@ "tmp%0#0" ] }, - "5782": { + "5728": { "error": "Invalid ACTUS configuration", "block": "_assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34", "stack_in": [ @@ -52102,11 +52102,11 @@ "defined_out": [], "stack_out": [] }, - "5783": { + "5729": { "retsub": true, "op": "retsub" }, - "5784": { + "5730": { "block": "_assert_event_allowed_for_contract_type_after_if_else@7", "stack_in": [], "op": "frame_dig -2", @@ -52117,11 +52117,11 @@ "contract_type#0 (copy)" ] }, - "5786": { + "5732": { "op": "bnz _assert_event_allowed_for_contract_type_after_if_else@9", "stack_out": [] }, - "5789": { + "5735": { "op": "intc_0 // 0", "defined_out": [ "tmp%0#0" @@ -52130,10 +52130,10 @@ "tmp%0#0" ] }, - "5790": { + "5736": { "op": "b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34" }, - "5793": { + "5739": { "block": "_assert_event_allowed_for_contract_type_after_if_else@9", "stack_in": [], "op": "frame_dig -2", @@ -52144,7 +52144,7 @@ "contract_type#0 (copy)" ] }, - "5795": { + "5741": { "op": "pushint 3", "defined_out": [ "3", @@ -52155,7 +52155,7 @@ "3" ] }, - "5797": { + "5743": { "op": "==", "defined_out": [ "tmp%6#0" @@ -52164,17 +52164,17 @@ "tmp%6#0" ] }, - "5798": { + "5744": { "op": "bnz _assert_event_allowed_for_contract_type_if_body@11", "stack_out": [] }, - "5801": { + "5747": { "op": "frame_dig -2", "stack_out": [ "contract_type#0 (copy)" ] }, - "5803": { + "5749": { "op": "pushint 2", "defined_out": [ "2", @@ -52185,7 +52185,7 @@ "2" ] }, - "5805": { + "5751": { "op": "==", "defined_out": [ "tmp%7#0" @@ -52194,11 +52194,11 @@ "tmp%7#0" ] }, - "5806": { + "5752": { "op": "bz _assert_event_allowed_for_contract_type_after_if_else@16", "stack_out": [] }, - "5809": { + "5755": { "block": "_assert_event_allowed_for_contract_type_if_body@11", "stack_in": [], "op": "frame_dig -1", @@ -52209,7 +52209,7 @@ "event_type#0 (copy)" ] }, - "5811": { + "5757": { "op": "pushint 3", "defined_out": [ "3", @@ -52220,7 +52220,7 @@ "3" ] }, - "5813": { + "5759": { "op": "==", "defined_out": [ "tmp%8#0" @@ -52229,17 +52229,17 @@ "tmp%8#0" ] }, - "5814": { + "5760": { "op": "bnz _assert_event_allowed_for_contract_type_bool_true@13", "stack_out": [] }, - "5817": { + "5763": { "op": "frame_dig -1", "stack_out": [ "event_type#0 (copy)" ] }, - "5819": { + "5765": { "op": "pushint 18", "defined_out": [ "18", @@ -52250,7 +52250,7 @@ "18" ] }, - "5821": { + "5767": { "op": "==", "defined_out": [ "tmp%9#0" @@ -52259,11 +52259,11 @@ "tmp%9#0" ] }, - "5822": { + "5768": { "op": "bz _assert_event_allowed_for_contract_type_bool_false@14", "stack_out": [] }, - "5825": { + "5771": { "block": "_assert_event_allowed_for_contract_type_bool_true@13", "stack_in": [], "op": "intc_1 // 1", @@ -52274,7 +52274,7 @@ "or_result%0#0" ] }, - "5826": { + "5772": { "op": "b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34", "defined_out": [ "tmp%0#0" @@ -52283,7 +52283,7 @@ "tmp%0#0" ] }, - "5829": { + "5775": { "block": "_assert_event_allowed_for_contract_type_bool_false@14", "stack_in": [], "op": "intc_0 // 0", @@ -52294,7 +52294,7 @@ "or_result%0#0" ] }, - "5830": { + "5776": { "op": "b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34", "defined_out": [ "tmp%0#0" @@ -52303,7 +52303,7 @@ "tmp%0#0" ] }, - "5833": { + "5779": { "block": "_assert_event_allowed_for_contract_type_after_if_else@16", "stack_in": [], "op": "frame_dig -2", @@ -52314,7 +52314,7 @@ "contract_type#0 (copy)" ] }, - "5835": { + "5781": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -52325,7 +52325,7 @@ "1" ] }, - "5836": { + "5782": { "op": "==", "defined_out": [ "tmp%10#0" @@ -52334,11 +52334,11 @@ "tmp%10#0" ] }, - "5837": { + "5783": { "op": "bz _assert_event_allowed_for_contract_type_after_if_else@23", "stack_out": [] }, - "5840": { + "5786": { "op": "frame_dig -1", "defined_out": [ "event_type#0 (copy)" @@ -52347,7 +52347,7 @@ "event_type#0 (copy)" ] }, - "5842": { + "5788": { "op": "pushint 3", "defined_out": [ "3", @@ -52358,7 +52358,7 @@ "3" ] }, - "5844": { + "5790": { "op": "==", "defined_out": [ "tmp%11#0" @@ -52367,17 +52367,17 @@ "tmp%11#0" ] }, - "5845": { + "5791": { "op": "bnz _assert_event_allowed_for_contract_type_bool_true@20", "stack_out": [] }, - "5848": { + "5794": { "op": "frame_dig -1", "stack_out": [ "event_type#0 (copy)" ] }, - "5850": { + "5796": { "op": "pushint 18", "defined_out": [ "18", @@ -52388,7 +52388,7 @@ "18" ] }, - "5852": { + "5798": { "op": "==", "defined_out": [ "tmp%12#0" @@ -52397,17 +52397,17 @@ "tmp%12#0" ] }, - "5853": { + "5799": { "op": "bnz _assert_event_allowed_for_contract_type_bool_true@20", "stack_out": [] }, - "5856": { + "5802": { "op": "frame_dig -1", "stack_out": [ "event_type#0 (copy)" ] }, - "5858": { + "5804": { "op": "pushint 5", "defined_out": [ "5", @@ -52418,7 +52418,7 @@ "5" ] }, - "5860": { + "5806": { "op": "==", "defined_out": [ "tmp%13#0" @@ -52427,11 +52427,11 @@ "tmp%13#0" ] }, - "5861": { + "5807": { "op": "bz _assert_event_allowed_for_contract_type_bool_false@21", "stack_out": [] }, - "5864": { + "5810": { "block": "_assert_event_allowed_for_contract_type_bool_true@20", "stack_in": [], "op": "intc_1 // 1", @@ -52442,7 +52442,7 @@ "or_result%1#0" ] }, - "5865": { + "5811": { "op": "b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34", "defined_out": [ "tmp%0#0" @@ -52451,7 +52451,7 @@ "tmp%0#0" ] }, - "5868": { + "5814": { "block": "_assert_event_allowed_for_contract_type_bool_false@21", "stack_in": [], "op": "intc_0 // 0", @@ -52462,7 +52462,7 @@ "or_result%1#0" ] }, - "5869": { + "5815": { "op": "b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34", "defined_out": [ "tmp%0#0" @@ -52471,7 +52471,7 @@ "tmp%0#0" ] }, - "5872": { + "5818": { "block": "_assert_event_allowed_for_contract_type_after_if_else@23", "stack_in": [], "op": "frame_dig -2", @@ -52482,7 +52482,7 @@ "contract_type#0 (copy)" ] }, - "5874": { + "5820": { "op": "pushint 4", "defined_out": [ "4", @@ -52493,7 +52493,7 @@ "4" ] }, - "5876": { + "5822": { "op": "==", "defined_out": [ "tmp%14#0" @@ -52502,11 +52502,11 @@ "tmp%14#0" ] }, - "5877": { + "5823": { "op": "bz _assert_event_allowed_for_contract_type_after_if_else@31", "stack_out": [] }, - "5880": { + "5826": { "op": "frame_dig -1", "defined_out": [ "event_type#0 (copy)" @@ -52515,7 +52515,7 @@ "event_type#0 (copy)" ] }, - "5882": { + "5828": { "op": "pushint 3", "defined_out": [ "3", @@ -52526,7 +52526,7 @@ "3" ] }, - "5884": { + "5830": { "op": "==", "defined_out": [ "tmp%15#0" @@ -52535,24 +52535,24 @@ "tmp%15#0" ] }, - "5885": { + "5831": { "op": "bnz _assert_event_allowed_for_contract_type_bool_true@28", "stack_out": [] }, - "5888": { + "5834": { "op": "frame_dig -1", "stack_out": [ "event_type#0 (copy)" ] }, - "5890": { + "5836": { "op": "pushint 4", "stack_out": [ "event_type#0 (copy)", "4" ] }, - "5892": { + "5838": { "op": "==", "defined_out": [ "tmp%16#0" @@ -52561,17 +52561,17 @@ "tmp%16#0" ] }, - "5893": { + "5839": { "op": "bnz _assert_event_allowed_for_contract_type_bool_true@28", "stack_out": [] }, - "5896": { + "5842": { "op": "frame_dig -1", "stack_out": [ "event_type#0 (copy)" ] }, - "5898": { + "5844": { "op": "pushint 18", "defined_out": [ "18", @@ -52582,7 +52582,7 @@ "18" ] }, - "5900": { + "5846": { "op": "==", "defined_out": [ "tmp%17#0" @@ -52591,17 +52591,17 @@ "tmp%17#0" ] }, - "5901": { + "5847": { "op": "bnz _assert_event_allowed_for_contract_type_bool_true@28", "stack_out": [] }, - "5904": { + "5850": { "op": "frame_dig -1", "stack_out": [ "event_type#0 (copy)" ] }, - "5906": { + "5852": { "op": "pushint 5", "defined_out": [ "5", @@ -52612,7 +52612,7 @@ "5" ] }, - "5908": { + "5854": { "op": "==", "defined_out": [ "tmp%18#0" @@ -52621,11 +52621,11 @@ "tmp%18#0" ] }, - "5909": { + "5855": { "op": "bz _assert_event_allowed_for_contract_type_bool_false@29", "stack_out": [] }, - "5912": { + "5858": { "block": "_assert_event_allowed_for_contract_type_bool_true@28", "stack_in": [], "op": "intc_1 // 1", @@ -52636,7 +52636,7 @@ "or_result%2#0" ] }, - "5913": { + "5859": { "op": "b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34", "defined_out": [ "tmp%0#0" @@ -52645,7 +52645,7 @@ "tmp%0#0" ] }, - "5916": { + "5862": { "block": "_assert_event_allowed_for_contract_type_bool_false@29", "stack_in": [], "op": "intc_0 // 0", @@ -52656,7 +52656,7 @@ "or_result%2#0" ] }, - "5917": { + "5863": { "op": "b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34", "defined_out": [ "tmp%0#0" @@ -52665,7 +52665,7 @@ "tmp%0#0" ] }, - "5920": { + "5866": { "block": "_assert_event_allowed_for_contract_type_after_if_else@31", "stack_in": [], "op": "frame_dig -2", @@ -52676,7 +52676,7 @@ "contract_type#0 (copy)" ] }, - "5922": { + "5868": { "op": "pushint 5", "defined_out": [ "5", @@ -52687,7 +52687,7 @@ "5" ] }, - "5924": { + "5870": { "op": "==", "defined_out": [ "tmp%19#0" @@ -52696,11 +52696,11 @@ "tmp%19#0" ] }, - "5925": { + "5871": { "op": "bz _assert_event_allowed_for_contract_type_after_if_else@33", "stack_out": [] }, - "5928": { + "5874": { "op": "frame_dig -1", "defined_out": [ "event_type#0 (copy)" @@ -52709,7 +52709,7 @@ "event_type#0 (copy)" ] }, - "5930": { + "5876": { "op": "pushint 3", "defined_out": [ "3", @@ -52720,7 +52720,7 @@ "3" ] }, - "5932": { + "5878": { "op": "==", "defined_out": [ "tmp%0#0" @@ -52729,10 +52729,10 @@ "tmp%0#0" ] }, - "5933": { + "5879": { "op": "b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34" }, - "5936": { + "5882": { "block": "_assert_event_allowed_for_contract_type_after_if_else@33", "stack_in": [], "op": "intc_0 // 0", @@ -52743,10 +52743,10 @@ "tmp%0#0" ] }, - "5937": { + "5883": { "op": "b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34" }, - "5940": { + "5886": { "subroutine": "modules.actus_kernel.ActusKernelModule._is_dynamic_annuity", "params": {}, "block": "_is_dynamic_annuity", @@ -52759,7 +52759,7 @@ "0" ] }, - "5941": { + "5887": { "op": "bytec 10 // \"contract_type\"", "defined_out": [ "\"contract_type\"", @@ -52770,7 +52770,7 @@ "\"contract_type\"" ] }, - "5943": { + "5889": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -52781,14 +52781,14 @@ "maybe_exists%0#0" ] }, - "5944": { + "5890": { "error": "check self.contract_type exists", "op": "assert // check self.contract_type exists", "stack_out": [ "maybe_value%0#0" ] }, - "5945": { + "5891": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -52799,7 +52799,7 @@ "1" ] }, - "5946": { + "5892": { "op": "==", "defined_out": [ "tmp%0#0" @@ -52808,17 +52808,17 @@ "tmp%0#0" ] }, - "5947": { + "5893": { "op": "bz _is_dynamic_annuity_bool_false@3", "stack_out": [] }, - "5950": { + "5896": { "op": "intc_0 // 0", "stack_out": [ "0" ] }, - "5951": { + "5897": { "op": "bytec 34 // \"dynamic_principal_redemption\"", "defined_out": [ "\"dynamic_principal_redemption\"", @@ -52829,7 +52829,7 @@ "\"dynamic_principal_redemption\"" ] }, - "5953": { + "5899": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%1#0", @@ -52840,18 +52840,18 @@ "maybe_exists%1#0" ] }, - "5954": { + "5900": { "error": "check self.dynamic_principal_redemption exists", "op": "assert // check self.dynamic_principal_redemption exists", "stack_out": [ "maybe_value%1#0" ] }, - "5955": { + "5901": { "op": "bz _is_dynamic_annuity_bool_false@3", "stack_out": [] }, - "5958": { + "5904": { "op": "intc_1 // 1", "defined_out": [ "and_result%0#0" @@ -52860,11 +52860,11 @@ "and_result%0#0" ] }, - "5959": { + "5905": { "retsub": true, "op": "retsub" }, - "5960": { + "5906": { "block": "_is_dynamic_annuity_bool_false@3", "stack_in": [], "op": "intc_0 // 0", @@ -52875,11 +52875,11 @@ "and_result%0#0" ] }, - "5961": { + "5907": { "retsub": true, "op": "retsub" }, - "5962": { + "5908": { "subroutine": "modules.actus_kernel.ActusKernelModule._entry_interest_segment", "params": { "entry#0": "bytes" @@ -52888,7 +52888,7 @@ "stack_in": [], "op": "proto 1 2" }, - "5965": { + "5911": { "op": "frame_dig -1", "defined_out": [ "entry#0 (copy)" @@ -52897,7 +52897,7 @@ "entry#0 (copy)" ] }, - "5967": { + "5913": { "op": "pushint 17", "defined_out": [ "17", @@ -52908,7 +52908,7 @@ "17" ] }, - "5969": { + "5915": { "op": "extract_uint64", "defined_out": [ "values%0#0" @@ -52917,7 +52917,7 @@ "values%0#0" ] }, - "5970": { + "5916": { "op": "dup", "defined_out": [ "values%0#0" @@ -52927,20 +52927,20 @@ "values%0#0" ] }, - "5971": { + "5917": { "op": "bz _entry_interest_segment_if_body@3", "stack_out": [ "values%0#0" ] }, - "5974": { + "5920": { "op": "intc_0 // 0", "stack_out": [ "values%0#0", "0" ] }, - "5975": { + "5921": { "op": "bytec 9 // \"nominal_interest_rate\"", "defined_out": [ "\"nominal_interest_rate\"", @@ -52953,7 +52953,7 @@ "\"nominal_interest_rate\"" ] }, - "5977": { + "5923": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -52966,7 +52966,7 @@ "maybe_exists%0#0" ] }, - "5978": { + "5924": { "error": "check self.nominal_interest_rate exists", "op": "assert // check self.nominal_interest_rate exists", "stack_out": [ @@ -52974,20 +52974,20 @@ "maybe_value%0#0" ] }, - "5979": { + "5925": { "op": "bz _entry_interest_segment_if_body@3", "stack_out": [ "values%0#0" ] }, - "5982": { + "5928": { "op": "intc_0 // 0", "stack_out": [ "values%0#0", "0" ] }, - "5983": { + "5929": { "op": "bytec 7 // \"interest_calculation_base\"", "defined_out": [ "\"interest_calculation_base\"", @@ -53000,7 +53000,7 @@ "\"interest_calculation_base\"" ] }, - "5985": { + "5931": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%1#0", @@ -53013,7 +53013,7 @@ "maybe_exists%1#0" ] }, - "5986": { + "5932": { "error": "check self.interest_calculation_base exists", "op": "assert // check self.interest_calculation_base exists", "stack_out": [ @@ -53021,13 +53021,13 @@ "maybe_value%1#0" ] }, - "5987": { + "5933": { "op": "bnz _entry_interest_segment_after_if_else@4", "stack_out": [ "values%0#0" ] }, - "5990": { + "5936": { "block": "_entry_interest_segment_if_body@3", "stack_in": [ "values%0#0" @@ -53041,7 +53041,7 @@ "0" ] }, - "5991": { + "5937": { "op": "frame_dig -1", "defined_out": [ "0", @@ -53053,14 +53053,14 @@ "entry#0 (copy)" ] }, - "5993": { + "5939": { "op": "uncover 2" }, - "5995": { + "5941": { "retsub": true, "op": "retsub" }, - "5996": { + "5942": { "block": "_entry_interest_segment_after_if_else@4", "stack_in": [ "values%0#0" @@ -53074,7 +53074,7 @@ "0" ] }, - "5997": { + "5943": { "op": "bytec 7 // \"interest_calculation_base\"", "defined_out": [ "\"interest_calculation_base\"", @@ -53086,7 +53086,7 @@ "\"interest_calculation_base\"" ] }, - "5999": { + "5945": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%2#0", @@ -53098,7 +53098,7 @@ "maybe_exists%2#0" ] }, - "6000": { + "5946": { "error": "check self.interest_calculation_base exists", "op": "assert // check self.interest_calculation_base exists", "stack_out": [ @@ -53106,7 +53106,7 @@ "maybe_value%2#0" ] }, - "6001": { + "5947": { "op": "intc_0 // 0", "stack_out": [ "values%0#0", @@ -53114,7 +53114,7 @@ "0" ] }, - "6002": { + "5948": { "op": "bytec 9 // \"nominal_interest_rate\"", "defined_out": [ "\"nominal_interest_rate\"", @@ -53128,7 +53128,7 @@ "\"nominal_interest_rate\"" ] }, - "6004": { + "5950": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%3#0", @@ -53142,7 +53142,7 @@ "maybe_exists%3#0" ] }, - "6005": { + "5951": { "error": "check self.nominal_interest_rate exists", "op": "assert // check self.nominal_interest_rate exists", "stack_out": [ @@ -53151,7 +53151,7 @@ "maybe_value%3#0" ] }, - "6006": { + "5952": { "op": "intc_0 // 0", "stack_out": [ "values%0#0", @@ -53160,7 +53160,7 @@ "0" ] }, - "6007": { + "5953": { "op": "bytec 5 // \"fixed_point_scale\"", "defined_out": [ "\"fixed_point_scale\"", @@ -53176,7 +53176,7 @@ "\"fixed_point_scale\"" ] }, - "6009": { + "5955": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%4#0", @@ -53192,7 +53192,7 @@ "maybe_exists%4#0" ] }, - "6010": { + "5956": { "error": "check self.fixed_point_scale exists", "op": "assert // check self.fixed_point_scale exists", "stack_out": [ @@ -53202,7 +53202,7 @@ "maybe_value%4#0" ] }, - "6011": { + "5957": { "callsub": "modules.actus_kernel.ActusKernelModule._scaled_mul_div", "op": "callsub _scaled_mul_div", "defined_out": [ @@ -53213,7 +53213,7 @@ "accrued#0" ] }, - "6014": { + "5960": { "op": "intc_0 // 0", "stack_out": [ "values%0#0", @@ -53221,7 +53221,7 @@ "0" ] }, - "6015": { + "5961": { "op": "bytec 5 // \"fixed_point_scale\"", "stack_out": [ "values%0#0", @@ -53230,7 +53230,7 @@ "\"fixed_point_scale\"" ] }, - "6017": { + "5963": { "op": "app_global_get_ex", "defined_out": [ "accrued#0", @@ -53244,7 +53244,7 @@ "maybe_exists%5#0" ] }, - "6018": { + "5964": { "error": "check self.fixed_point_scale exists", "op": "assert // check self.fixed_point_scale exists", "stack_out": [ @@ -53253,10 +53253,10 @@ "maybe_value%5#0" ] }, - "6019": { + "5965": { "op": "frame_dig 0" }, - "6021": { + "5967": { "op": "swap", "defined_out": [ "accrued#0", @@ -53270,7 +53270,7 @@ "maybe_value%5#0" ] }, - "6022": { + "5968": { "callsub": "modules.actus_kernel.ActusKernelModule._scaled_mul_div", "op": "callsub _scaled_mul_div", "defined_out": [ @@ -53282,7 +53282,7 @@ "tmp%4#0" ] }, - "6025": { + "5971": { "op": "frame_dig -1", "defined_out": [ "entry#0 (copy)", @@ -53295,14 +53295,14 @@ "entry#0 (copy)" ] }, - "6027": { + "5973": { "op": "uncover 2" }, - "6029": { + "5975": { "retsub": true, "op": "retsub" }, - "6030": { + "5976": { "subroutine": "modules.actus_kernel.ActusKernelModule._discount_annuity_factor", "params": { "discount_factor#0": "uint64", @@ -53312,7 +53312,7 @@ "stack_in": [], "op": "proto 2 1" }, - "6033": { + "5979": { "op": "frame_dig -1", "defined_out": [ "redemption_factor#0 (copy)" @@ -53321,11 +53321,11 @@ "redemption_factor#0 (copy)" ] }, - "6035": { + "5981": { "op": "bnz _discount_annuity_factor_after_if_else@2", "stack_out": [] }, - "6038": { + "5984": { "op": "frame_dig -2", "defined_out": [ "discount_factor#0 (copy)" @@ -53334,11 +53334,11 @@ "discount_factor#0 (copy)" ] }, - "6040": { + "5986": { "retsub": true, "op": "retsub" }, - "6041": { + "5987": { "block": "_discount_annuity_factor_after_if_else@2", "stack_in": [], "op": "intc_0 // 0", @@ -53349,7 +53349,7 @@ "0" ] }, - "6042": { + "5988": { "op": "bytec 5 // \"fixed_point_scale\"", "defined_out": [ "\"fixed_point_scale\"", @@ -53360,7 +53360,7 @@ "\"fixed_point_scale\"" ] }, - "6044": { + "5990": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -53371,21 +53371,21 @@ "maybe_exists%0#0" ] }, - "6045": { + "5991": { "error": "check self.fixed_point_scale exists", "op": "assert // check self.fixed_point_scale exists", "stack_out": [ "maybe_value%0#0" ] }, - "6046": { + "5992": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#0", "0" ] }, - "6047": { + "5993": { "op": "bytec 9 // \"nominal_interest_rate\"", "defined_out": [ "\"nominal_interest_rate\"", @@ -53398,7 +53398,7 @@ "\"nominal_interest_rate\"" ] }, - "6049": { + "5995": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%1#0", @@ -53411,7 +53411,7 @@ "maybe_exists%1#0" ] }, - "6050": { + "5996": { "error": "check self.nominal_interest_rate exists", "op": "assert // check self.nominal_interest_rate exists", "stack_out": [ @@ -53419,7 +53419,7 @@ "maybe_value%1#0" ] }, - "6051": { + "5997": { "op": "frame_dig -1", "defined_out": [ "maybe_value%0#0", @@ -53432,7 +53432,7 @@ "redemption_factor#0 (copy)" ] }, - "6053": { + "5999": { "op": "dig 2", "defined_out": [ "maybe_value%0#0", @@ -53447,7 +53447,7 @@ "maybe_value%0#0 (copy)" ] }, - "6055": { + "6001": { "callsub": "modules.actus_kernel.ActusKernelModule._scaled_mul_div", "op": "callsub _scaled_mul_div", "defined_out": [ @@ -53459,7 +53459,7 @@ "tmp%1#0" ] }, - "6058": { + "6004": { "op": "+", "defined_out": [ "period_rate#0" @@ -53468,7 +53468,7 @@ "period_rate#0" ] }, - "6059": { + "6005": { "op": "dup", "defined_out": [ "period_rate#0", @@ -53479,21 +53479,21 @@ "period_rate#0 (copy)" ] }, - "6060": { + "6006": { "error": "Invalid ACTUS configuration", "op": "assert // Invalid ACTUS configuration", "stack_out": [ "period_rate#0" ] }, - "6061": { + "6007": { "op": "intc_0 // 0", "stack_out": [ "period_rate#0", "0" ] }, - "6062": { + "6008": { "op": "bytec 5 // \"fixed_point_scale\"", "stack_out": [ "period_rate#0", @@ -53501,7 +53501,7 @@ "\"fixed_point_scale\"" ] }, - "6064": { + "6010": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%3#0", @@ -53514,7 +53514,7 @@ "maybe_exists%3#0" ] }, - "6065": { + "6011": { "error": "check self.fixed_point_scale exists", "op": "assert // check self.fixed_point_scale exists", "stack_out": [ @@ -53522,7 +53522,7 @@ "maybe_value%3#0" ] }, - "6066": { + "6012": { "op": "frame_dig -2", "defined_out": [ "discount_factor#0 (copy)", @@ -53535,7 +53535,7 @@ "discount_factor#0 (copy)" ] }, - "6068": { + "6014": { "op": "swap", "stack_out": [ "period_rate#0", @@ -53543,7 +53543,7 @@ "maybe_value%3#0" ] }, - "6069": { + "6015": { "op": "uncover 2", "stack_out": [ "discount_factor#0 (copy)", @@ -53551,7 +53551,7 @@ "period_rate#0" ] }, - "6071": { + "6017": { "callsub": "modules.actus_kernel.ActusKernelModule._scaled_mul_div", "op": "callsub _scaled_mul_div", "defined_out": [ @@ -53561,11 +53561,11 @@ "tmp%4#0" ] }, - "6074": { + "6020": { "retsub": true, "op": "retsub" }, - "6075": { + "6021": { "subroutine": "modules.actus_kernel.ActusKernelModule._apply_non_cash_schedule_entry", "params": { "entry#0": "bytes", @@ -53575,20 +53575,20 @@ "stack_in": [], "op": "proto 2 2" }, - "6078": { + "6024": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0" ] }, - "6079": { + "6025": { "op": "pushbytes \"\"", "stack_out": [ "future_entry#0", "denominator#0" ] }, - "6081": { + "6027": { "op": "dupn 8", "stack_out": [ "future_entry#0", @@ -53603,7 +53603,7 @@ "values%8#0" ] }, - "6083": { + "6029": { "op": "frame_dig -2", "defined_out": [ "entry#0 (copy)" @@ -53622,7 +53622,7 @@ "entry#0 (copy)" ] }, - "6085": { + "6031": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -53643,7 +53643,7 @@ "0" ] }, - "6086": { + "6032": { "op": "extract_uint64", "defined_out": [ "values%0#0" @@ -53662,7 +53662,7 @@ "values%0#0" ] }, - "6087": { + "6033": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -53679,7 +53679,7 @@ "0" ] }, - "6088": { + "6034": { "op": "bytec_2 // \"event_cursor\"", "defined_out": [ "\"event_cursor\"", @@ -53702,7 +53702,7 @@ "\"event_cursor\"" ] }, - "6089": { + "6035": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -53725,7 +53725,7 @@ "maybe_exists%0#0" ] }, - "6090": { + "6036": { "error": "check self.event_cursor exists", "op": "assert // check self.event_cursor exists", "stack_out": [ @@ -53743,7 +53743,7 @@ "maybe_value%0#0" ] }, - "6091": { + "6037": { "op": "==", "defined_out": [ "tmp%0#0", @@ -53763,7 +53763,7 @@ "tmp%0#0" ] }, - "6092": { + "6038": { "error": "Invalid event cursor", "op": "assert // Invalid event cursor", "stack_out": [ @@ -53779,7 +53779,7 @@ "values%8#0" ] }, - "6093": { + "6039": { "op": "frame_dig -2", "stack_out": [ "future_entry#0", @@ -53795,7 +53795,7 @@ "entry#0 (copy)" ] }, - "6095": { + "6041": { "op": "pushint 9", "defined_out": [ "9", @@ -53817,7 +53817,7 @@ "9" ] }, - "6097": { + "6043": { "op": "extract_uint64", "defined_out": [ "values%0#0", @@ -53837,7 +53837,7 @@ "values%1#0" ] }, - "6098": { + "6044": { "op": "global LatestTimestamp", "defined_out": [ "tmp%1#0", @@ -53859,7 +53859,7 @@ "tmp%1#0" ] }, - "6100": { + "6046": { "op": "<=", "defined_out": [ "tmp%2#0", @@ -53879,7 +53879,7 @@ "tmp%2#0" ] }, - "6101": { + "6047": { "error": "No due cashflow to pay", "op": "assert // No due cashflow to pay", "stack_out": [ @@ -53895,7 +53895,7 @@ "values%8#0" ] }, - "6102": { + "6048": { "op": "frame_dig -2", "stack_out": [ "future_entry#0", @@ -53911,7 +53911,7 @@ "entry#0 (copy)" ] }, - "6104": { + "6050": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -53933,7 +53933,7 @@ "8" ] }, - "6105": { + "6051": { "op": "getbyte", "defined_out": [ "event_type#0", @@ -53953,7 +53953,7 @@ "event_type#0" ] }, - "6106": { + "6052": { "op": "dup", "defined_out": [ "event_type#0", @@ -53974,7 +53974,7 @@ "event_type#0" ] }, - "6107": { + "6053": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -53997,7 +53997,7 @@ "1" ] }, - "6108": { + "6054": { "op": "==", "defined_out": [ "event_type#0", @@ -54019,7 +54019,7 @@ "tmp%4#0" ] }, - "6109": { + "6055": { "op": "dup", "defined_out": [ "event_type#0", @@ -54042,7 +54042,7 @@ "tmp%4#0" ] }, - "6110": { + "6056": { "op": "bz _apply_non_cash_schedule_entry_after_if_else@6", "stack_out": [ "future_entry#0", @@ -54059,7 +54059,7 @@ "tmp%4#0" ] }, - "6113": { + "6059": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -54077,7 +54077,7 @@ "0" ] }, - "6114": { + "6060": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"", @@ -54103,7 +54103,7 @@ "\"status\"" ] }, - "6115": { + "6061": { "op": "app_global_get_ex", "stack_out": [ "future_entry#0", @@ -54122,7 +54122,7 @@ "maybe_exists%0#0" ] }, - "6116": { + "6062": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ @@ -54141,7 +54141,7 @@ "maybe_value%0#0" ] }, - "6117": { + "6063": { "op": "pushint 50", "defined_out": [ "50", @@ -54167,7 +54167,7 @@ "50" ] }, - "6119": { + "6065": { "op": "==", "stack_out": [ "future_entry#0", @@ -54185,7 +54185,7 @@ "tmp%0#0" ] }, - "6120": { + "6066": { "error": "Invalid ACTUS configuration", "op": "assert // Invalid ACTUS configuration", "stack_out": [ @@ -54203,7 +54203,7 @@ "tmp%4#0" ] }, - "6121": { + "6067": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -54221,7 +54221,7 @@ "0" ] }, - "6122": { + "6068": { "op": "bytec 11 // \"reserved_units_total\"", "defined_out": [ "\"reserved_units_total\"", @@ -54247,7 +54247,7 @@ "\"reserved_units_total\"" ] }, - "6124": { + "6070": { "op": "app_global_get_ex", "defined_out": [ "event_type#0", @@ -54273,7 +54273,7 @@ "maybe_exists%1#0" ] }, - "6125": { + "6071": { "error": "check self.reserved_units_total exists", "op": "assert // check self.reserved_units_total exists", "stack_out": [ @@ -54292,7 +54292,7 @@ "maybe_value%1#0" ] }, - "6126": { + "6072": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -54311,7 +54311,7 @@ "0" ] }, - "6127": { + "6073": { "op": "bytec 13 // \"total_units\"", "defined_out": [ "\"total_units\"", @@ -54339,7 +54339,7 @@ "\"total_units\"" ] }, - "6129": { + "6075": { "op": "app_global_get_ex", "defined_out": [ "event_type#0", @@ -54367,7 +54367,7 @@ "maybe_exists%2#0" ] }, - "6130": { + "6076": { "error": "check self.total_units exists", "op": "assert // check self.total_units exists", "stack_out": [ @@ -54387,7 +54387,7 @@ "maybe_value%2#0" ] }, - "6131": { + "6077": { "op": "==", "defined_out": [ "event_type#0", @@ -54411,7 +54411,7 @@ "tmp%6#0" ] }, - "6132": { + "6078": { "error": "Primary distribution is not complete", "op": "assert // Primary distribution is not complete", "stack_out": [ @@ -54429,7 +54429,7 @@ "tmp%4#0" ] }, - "6133": { + "6079": { "op": "frame_dig -2", "stack_out": [ "future_entry#0", @@ -54447,7 +54447,7 @@ "entry#0 (copy)" ] }, - "6135": { + "6081": { "op": "pushint 49", "defined_out": [ "49", @@ -54473,7 +54473,7 @@ "49" ] }, - "6137": { + "6083": { "op": "extract_uint64", "defined_out": [ "event_type#0", @@ -54497,7 +54497,7 @@ "values%2#0" ] }, - "6138": { + "6084": { "op": "bytec 4 // \"outstanding_principal\"", "defined_out": [ "\"outstanding_principal\"", @@ -54523,7 +54523,7 @@ "\"outstanding_principal\"" ] }, - "6140": { + "6086": { "op": "dig 1", "defined_out": [ "\"outstanding_principal\"", @@ -54551,7 +54551,7 @@ "values%2#0 (copy)" ] }, - "6142": { + "6088": { "op": "app_global_put", "stack_out": [ "future_entry#0", @@ -54569,7 +54569,7 @@ "values%2#0" ] }, - "6143": { + "6089": { "op": "bytec 7 // \"interest_calculation_base\"", "defined_out": [ "\"interest_calculation_base\"", @@ -54595,7 +54595,7 @@ "\"interest_calculation_base\"" ] }, - "6145": { + "6091": { "op": "swap", "stack_out": [ "future_entry#0", @@ -54614,7 +54614,7 @@ "values%2#0" ] }, - "6146": { + "6092": { "op": "app_global_put", "stack_out": [ "future_entry#0", @@ -54631,7 +54631,7 @@ "tmp%4#0" ] }, - "6147": { + "6093": { "op": "frame_dig -2", "stack_out": [ "future_entry#0", @@ -54649,7 +54649,7 @@ "entry#0 (copy)" ] }, - "6149": { + "6095": { "op": "pushint 33", "defined_out": [ "33", @@ -54675,7 +54675,7 @@ "33" ] }, - "6151": { + "6097": { "op": "extract_uint64", "defined_out": [ "event_type#0", @@ -54699,7 +54699,7 @@ "values%4#0" ] }, - "6152": { + "6098": { "op": "bytec 9 // \"nominal_interest_rate\"", "defined_out": [ "\"nominal_interest_rate\"", @@ -54725,7 +54725,7 @@ "\"nominal_interest_rate\"" ] }, - "6154": { + "6100": { "op": "swap", "stack_out": [ "future_entry#0", @@ -54744,7 +54744,7 @@ "values%4#0" ] }, - "6155": { + "6101": { "op": "app_global_put", "stack_out": [ "future_entry#0", @@ -54761,7 +54761,7 @@ "tmp%4#0" ] }, - "6156": { + "6102": { "op": "bytec 6 // \"accrued_interest\"", "defined_out": [ "\"accrued_interest\"", @@ -54785,7 +54785,7 @@ "\"accrued_interest\"" ] }, - "6158": { + "6104": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -54804,7 +54804,7 @@ "0" ] }, - "6159": { + "6105": { "op": "app_global_put", "stack_out": [ "future_entry#0", @@ -54821,7 +54821,7 @@ "tmp%4#0" ] }, - "6160": { + "6106": { "op": "frame_dig -2", "stack_out": [ "future_entry#0", @@ -54839,7 +54839,7 @@ "entry#0 (copy)" ] }, - "6162": { + "6108": { "op": "pushint 41", "defined_out": [ "41", @@ -54865,7 +54865,7 @@ "41" ] }, - "6164": { + "6110": { "op": "extract_uint64", "defined_out": [ "event_type#0", @@ -54889,7 +54889,7 @@ "values%5#0" ] }, - "6165": { + "6111": { "op": "bytec 14 // \"next_principal_redemption\"", "defined_out": [ "\"next_principal_redemption\"", @@ -54915,7 +54915,7 @@ "\"next_principal_redemption\"" ] }, - "6167": { + "6113": { "op": "swap", "stack_out": [ "future_entry#0", @@ -54934,7 +54934,7 @@ "values%5#0" ] }, - "6168": { + "6114": { "op": "app_global_put", "stack_out": [ "future_entry#0", @@ -54951,7 +54951,7 @@ "tmp%4#0" ] }, - "6169": { + "6115": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -54969,7 +54969,7 @@ "0" ] }, - "6170": { + "6116": { "op": "bytec_2 // \"event_cursor\"", "stack_out": [ "future_entry#0", @@ -54988,7 +54988,7 @@ "\"event_cursor\"" ] }, - "6171": { + "6117": { "op": "app_global_get_ex", "defined_out": [ "event_type#0", @@ -55014,7 +55014,7 @@ "maybe_exists%3#0" ] }, - "6172": { + "6118": { "error": "check self.event_cursor exists", "op": "assert // check self.event_cursor exists", "stack_out": [ @@ -55033,7 +55033,7 @@ "maybe_value%3#0" ] }, - "6173": { + "6119": { "op": "intc_1 // 1", "stack_out": [ "future_entry#0", @@ -55052,7 +55052,7 @@ "1" ] }, - "6174": { + "6120": { "op": "+", "defined_out": [ "event_type#0", @@ -55076,7 +55076,7 @@ "tmp%7#0" ] }, - "6175": { + "6121": { "op": "bytec_2 // \"event_cursor\"", "stack_out": [ "future_entry#0", @@ -55095,7 +55095,7 @@ "\"event_cursor\"" ] }, - "6176": { + "6122": { "op": "swap", "stack_out": [ "future_entry#0", @@ -55114,7 +55114,7 @@ "tmp%7#0" ] }, - "6177": { + "6123": { "op": "app_global_put", "stack_out": [ "future_entry#0", @@ -55131,7 +55131,7 @@ "tmp%4#0" ] }, - "6178": { + "6124": { "op": "bytec_1 // \"status\"", "stack_out": [ "future_entry#0", @@ -55149,7 +55149,7 @@ "\"status\"" ] }, - "6179": { + "6125": { "op": "pushint 100", "defined_out": [ "\"status\"", @@ -55175,7 +55175,7 @@ "100" ] }, - "6181": { + "6127": { "op": "app_global_put", "stack_out": [ "future_entry#0", @@ -55192,7 +55192,7 @@ "tmp%4#0" ] }, - "6182": { + "6128": { "op": "frame_dig 11", "stack_out": [ "future_entry#0", @@ -55210,7 +55210,7 @@ "tmp%4#0" ] }, - "6184": { + "6130": { "error": "Not IED event", "op": "assert // Not IED event", "stack_out": [ @@ -55228,7 +55228,7 @@ "tmp%4#0" ] }, - "6185": { + "6131": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -55246,7 +55246,7 @@ "0" ] }, - "6186": { + "6132": { "op": "bytec 20 // \"initial_exchange_amount\"", "defined_out": [ "\"initial_exchange_amount\"", @@ -55272,7 +55272,7 @@ "\"initial_exchange_amount\"" ] }, - "6188": { + "6134": { "op": "app_global_get_ex", "stack_out": [ "future_entry#0", @@ -55291,7 +55291,7 @@ "maybe_exists%0#0" ] }, - "6189": { + "6135": { "error": "check self.initial_exchange_amount exists", "op": "assert // check self.initial_exchange_amount exists", "stack_out": [ @@ -55310,7 +55310,7 @@ "maybe_value%0#0" ] }, - "6190": { + "6136": { "op": "frame_dig -2", "stack_out": [ "future_entry#0", @@ -55329,7 +55329,7 @@ "entry#0 (copy)" ] }, - "6192": { + "6138": { "op": "swap", "stack_out": [ "future_entry#0", @@ -55348,7 +55348,7 @@ "maybe_value%0#0" ] }, - "6193": { + "6139": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -55368,7 +55368,7 @@ "0" ] }, - "6194": { + "6140": { "callsub": "modules.actus_kernel.ActusKernelModule._emit_execution_event", "op": "callsub _emit_execution_event", "defined_out": [ @@ -55393,10 +55393,10 @@ "entry#0" ] }, - "6197": { + "6143": { "op": "dup" }, - "6198": { + "6144": { "op": "frame_bury -2", "stack_out": [ "future_entry#0", @@ -55414,7 +55414,7 @@ "entry#0 (copy)" ] }, - "6200": { + "6146": { "op": "frame_dig -1", "defined_out": [ "entry#0 (copy)", @@ -55440,17 +55440,17 @@ "payload#0 (copy)" ] }, - "6202": { + "6148": { "op": "frame_bury 1" }, - "6204": { + "6150": { "op": "frame_bury 0" }, - "6206": { + "6152": { "retsub": true, "op": "retsub" }, - "6207": { + "6153": { "block": "_apply_non_cash_schedule_entry_after_if_else@6", "stack_in": [ "future_entry#0", @@ -55486,7 +55486,7 @@ "0" ] }, - "6208": { + "6154": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"", @@ -55509,7 +55509,7 @@ "\"status\"" ] }, - "6209": { + "6155": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -55532,7 +55532,7 @@ "maybe_exists%0#0" ] }, - "6210": { + "6156": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ @@ -55551,7 +55551,7 @@ "maybe_value%0#0" ] }, - "6211": { + "6157": { "op": "pushint 50", "defined_out": [ "50", @@ -55574,7 +55574,7 @@ "50" ] }, - "6213": { + "6159": { "op": "==", "defined_out": [ "tmp%0#0" @@ -55595,7 +55595,7 @@ "tmp%0#0" ] }, - "6214": { + "6160": { "op": "!", "defined_out": [ "tmp%1#1" @@ -55616,7 +55616,7 @@ "tmp%1#1" ] }, - "6215": { + "6161": { "error": "IED not yet executed", "op": "assert // IED not yet executed", "stack_out": [ @@ -55634,7 +55634,7 @@ "tmp%4#0" ] }, - "6216": { + "6162": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -55652,7 +55652,7 @@ "0" ] }, - "6217": { + "6163": { "op": "bytec 6 // \"accrued_interest\"", "defined_out": [ "\"accrued_interest\"", @@ -55675,7 +55675,7 @@ "\"accrued_interest\"" ] }, - "6219": { + "6165": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%4#0", @@ -55698,7 +55698,7 @@ "maybe_exists%4#0" ] }, - "6220": { + "6166": { "error": "check self.accrued_interest exists", "op": "assert // check self.accrued_interest exists", "stack_out": [ @@ -55717,7 +55717,7 @@ "maybe_value%4#0" ] }, - "6221": { + "6167": { "op": "frame_dig -2", "defined_out": [ "entry#0 (copy)", @@ -55740,7 +55740,7 @@ "entry#0 (copy)" ] }, - "6223": { + "6169": { "callsub": "modules.actus_kernel.ActusKernelModule._entry_interest_segment", "op": "callsub _entry_interest_segment", "defined_out": [ @@ -55766,7 +55766,7 @@ "entry#0" ] }, - "6226": { + "6172": { "op": "frame_bury -2", "stack_out": [ "future_entry#0", @@ -55785,7 +55785,7 @@ "_entry_interest_segment%0#0" ] }, - "6228": { + "6174": { "op": "+", "defined_out": [ "tmp%8#0" @@ -55806,7 +55806,7 @@ "tmp%8#0" ] }, - "6229": { + "6175": { "op": "bytec 6 // \"accrued_interest\"", "stack_out": [ "future_entry#0", @@ -55825,7 +55825,7 @@ "\"accrued_interest\"" ] }, - "6231": { + "6177": { "op": "swap", "stack_out": [ "future_entry#0", @@ -55844,7 +55844,7 @@ "tmp%8#0" ] }, - "6232": { + "6178": { "op": "app_global_put", "stack_out": [ "future_entry#0", @@ -55861,7 +55861,7 @@ "tmp%4#0" ] }, - "6233": { + "6179": { "op": "frame_dig 10", "defined_out": [ "event_type#0" @@ -55882,7 +55882,7 @@ "event_type#0" ] }, - "6235": { + "6181": { "op": "pushint 12", "defined_out": [ "12", @@ -55905,7 +55905,7 @@ "12" ] }, - "6237": { + "6183": { "op": "==", "defined_out": [ "event_type#0", @@ -55927,7 +55927,7 @@ "tmp%9#0" ] }, - "6238": { + "6184": { "op": "bz _apply_non_cash_schedule_entry_else_body@10", "stack_out": [ "future_entry#0", @@ -55944,7 +55944,7 @@ "tmp%4#0" ] }, - "6241": { + "6187": { "op": "frame_dig -1", "defined_out": [ "event_type#0", @@ -55966,7 +55966,7 @@ "payload#0 (copy)" ] }, - "6243": { + "6189": { "op": "pushint 33", "defined_out": [ "33", @@ -55990,7 +55990,7 @@ "33" ] }, - "6245": { + "6191": { "op": "extract_uint64", "defined_out": [ "event_type#0", @@ -56012,7 +56012,7 @@ "values%6#0" ] }, - "6246": { + "6192": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -56031,7 +56031,7 @@ "0" ] }, - "6247": { + "6193": { "op": "bytec 36 // \"rate_reset_multiplier\"", "defined_out": [ "\"rate_reset_multiplier\"", @@ -56057,7 +56057,7 @@ "\"rate_reset_multiplier\"" ] }, - "6249": { + "6195": { "op": "app_global_get_ex", "defined_out": [ "event_type#0", @@ -56083,7 +56083,7 @@ "maybe_exists%5#0" ] }, - "6250": { + "6196": { "error": "check self.rate_reset_multiplier exists", "op": "assert // check self.rate_reset_multiplier exists", "stack_out": [ @@ -56103,7 +56103,7 @@ "maybe_value%5#0" ] }, - "6251": { + "6197": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -56123,7 +56123,7 @@ "0" ] }, - "6252": { + "6198": { "op": "bytec 5 // \"fixed_point_scale\"", "defined_out": [ "\"fixed_point_scale\"", @@ -56151,7 +56151,7 @@ "\"fixed_point_scale\"" ] }, - "6254": { + "6200": { "op": "app_global_get_ex", "defined_out": [ "event_type#0", @@ -56179,7 +56179,7 @@ "maybe_exists%6#0" ] }, - "6255": { + "6201": { "error": "check self.fixed_point_scale exists", "op": "assert // check self.fixed_point_scale exists", "stack_out": [ @@ -56200,7 +56200,7 @@ "maybe_value%6#0" ] }, - "6256": { + "6202": { "callsub": "modules.actus_kernel.ActusKernelModule._scaled_mul_div", "op": "callsub _scaled_mul_div", "defined_out": [ @@ -56223,7 +56223,7 @@ "observed_rate#0" ] }, - "6259": { + "6205": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -56242,7 +56242,7 @@ "0" ] }, - "6260": { + "6206": { "op": "bytec 35 // \"rate_reset_spread\"", "defined_out": [ "\"rate_reset_spread\"", @@ -56268,7 +56268,7 @@ "\"rate_reset_spread\"" ] }, - "6262": { + "6208": { "op": "app_global_get_ex", "defined_out": [ "event_type#0", @@ -56294,7 +56294,7 @@ "maybe_exists%7#0" ] }, - "6263": { + "6209": { "error": "check self.rate_reset_spread exists", "op": "assert // check self.rate_reset_spread exists", "stack_out": [ @@ -56314,7 +56314,7 @@ "maybe_value%7#0" ] }, - "6264": { + "6210": { "op": "+", "defined_out": [ "event_type#0", @@ -56336,7 +56336,7 @@ "rate#0" ] }, - "6265": { + "6211": { "op": "frame_bury 6", "defined_out": [ "event_type#0", @@ -56357,7 +56357,7 @@ "tmp%4#0" ] }, - "6267": { + "6213": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -56375,7 +56375,7 @@ "0" ] }, - "6268": { + "6214": { "op": "bytec 38 // \"has_rate_reset_floor\"", "defined_out": [ "\"has_rate_reset_floor\"", @@ -56400,7 +56400,7 @@ "\"has_rate_reset_floor\"" ] }, - "6270": { + "6216": { "op": "app_global_get_ex", "stack_out": [ "future_entry#0", @@ -56419,7 +56419,7 @@ "maybe_exists%0#0" ] }, - "6271": { + "6217": { "error": "check self.has_rate_reset_floor exists", "op": "assert // check self.has_rate_reset_floor exists", "stack_out": [ @@ -56438,7 +56438,7 @@ "maybe_value%0#0" ] }, - "6272": { + "6218": { "op": "bz _apply_non_cash_schedule_entry_after_if_else@55", "stack_out": [ "future_entry#0", @@ -56455,7 +56455,7 @@ "tmp%4#0" ] }, - "6275": { + "6221": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -56473,7 +56473,7 @@ "0" ] }, - "6276": { + "6222": { "op": "bytec 30 // \"rate_reset_floor\"", "defined_out": [ "\"rate_reset_floor\"", @@ -56498,7 +56498,7 @@ "\"rate_reset_floor\"" ] }, - "6278": { + "6224": { "op": "app_global_get_ex", "defined_out": [ "event_type#0", @@ -56523,7 +56523,7 @@ "maybe_exists%1#0" ] }, - "6279": { + "6225": { "error": "check self.rate_reset_floor exists", "op": "assert // check self.rate_reset_floor exists", "stack_out": [ @@ -56542,7 +56542,7 @@ "maybe_value%1#0" ] }, - "6280": { + "6226": { "op": "frame_dig 6", "stack_out": [ "future_entry#0", @@ -56561,7 +56561,7 @@ "rate#0" ] }, - "6282": { + "6228": { "op": ">", "stack_out": [ "future_entry#0", @@ -56579,7 +56579,7 @@ "tmp%0#0" ] }, - "6283": { + "6229": { "op": "bz _apply_non_cash_schedule_entry_after_if_else@55", "stack_out": [ "future_entry#0", @@ -56596,7 +56596,7 @@ "tmp%4#0" ] }, - "6286": { + "6232": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -56614,7 +56614,7 @@ "0" ] }, - "6287": { + "6233": { "op": "bytec 30 // \"rate_reset_floor\"", "stack_out": [ "future_entry#0", @@ -56633,7 +56633,7 @@ "\"rate_reset_floor\"" ] }, - "6289": { + "6235": { "op": "app_global_get_ex", "defined_out": [ "event_type#0", @@ -56657,7 +56657,7 @@ "maybe_exists%2#0" ] }, - "6290": { + "6236": { "op": "swap", "stack_out": [ "future_entry#0", @@ -56676,7 +56676,7 @@ "rate#0" ] }, - "6291": { + "6237": { "op": "frame_bury 6", "stack_out": [ "future_entry#0", @@ -56694,7 +56694,7 @@ "maybe_exists%2#0" ] }, - "6293": { + "6239": { "error": "check self.rate_reset_floor exists", "op": "assert // check self.rate_reset_floor exists", "stack_out": [ @@ -56712,7 +56712,7 @@ "tmp%4#0" ] }, - "6294": { + "6240": { "block": "_apply_non_cash_schedule_entry_after_if_else@55", "stack_in": [ "future_entry#0", @@ -56748,7 +56748,7 @@ "0" ] }, - "6295": { + "6241": { "op": "bytec 39 // \"has_rate_reset_cap\"", "defined_out": [ "\"has_rate_reset_cap\"", @@ -56771,7 +56771,7 @@ "\"has_rate_reset_cap\"" ] }, - "6297": { + "6243": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%3#0", @@ -56794,7 +56794,7 @@ "maybe_exists%3#0" ] }, - "6298": { + "6244": { "error": "check self.has_rate_reset_cap exists", "op": "assert // check self.has_rate_reset_cap exists", "stack_out": [ @@ -56813,7 +56813,7 @@ "maybe_value%3#0" ] }, - "6299": { + "6245": { "op": "bz _apply_non_cash_schedule_entry_after_if_else@58", "stack_out": [ "future_entry#0", @@ -56830,7 +56830,7 @@ "tmp%4#0" ] }, - "6302": { + "6248": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -56848,7 +56848,7 @@ "0" ] }, - "6303": { + "6249": { "op": "bytec 31 // \"rate_reset_cap\"", "defined_out": [ "\"rate_reset_cap\"", @@ -56871,7 +56871,7 @@ "\"rate_reset_cap\"" ] }, - "6305": { + "6251": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%4#0", @@ -56894,7 +56894,7 @@ "maybe_exists%4#0" ] }, - "6306": { + "6252": { "error": "check self.rate_reset_cap exists", "op": "assert // check self.rate_reset_cap exists", "stack_out": [ @@ -56913,7 +56913,7 @@ "maybe_value%4#0" ] }, - "6307": { + "6253": { "op": "frame_dig 6", "defined_out": [ "maybe_value%4#0", @@ -56936,7 +56936,7 @@ "rate#0" ] }, - "6309": { + "6255": { "op": "<", "defined_out": [ "rate#0", @@ -56958,7 +56958,7 @@ "tmp%1#1" ] }, - "6310": { + "6256": { "op": "bz _apply_non_cash_schedule_entry_after_if_else@58", "stack_out": [ "future_entry#0", @@ -56975,7 +56975,7 @@ "tmp%4#0" ] }, - "6313": { + "6259": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -56993,7 +56993,7 @@ "0" ] }, - "6314": { + "6260": { "op": "bytec 31 // \"rate_reset_cap\"", "stack_out": [ "future_entry#0", @@ -57012,7 +57012,7 @@ "\"rate_reset_cap\"" ] }, - "6316": { + "6262": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%5#0", @@ -57035,7 +57035,7 @@ "maybe_exists%5#0" ] }, - "6317": { + "6263": { "op": "swap", "stack_out": [ "future_entry#0", @@ -57054,7 +57054,7 @@ "rate#0" ] }, - "6318": { + "6264": { "op": "frame_bury 6", "defined_out": [ "maybe_exists%5#0", @@ -57076,7 +57076,7 @@ "maybe_exists%5#0" ] }, - "6320": { + "6266": { "error": "check self.rate_reset_cap exists", "op": "assert // check self.rate_reset_cap exists", "stack_out": [ @@ -57094,7 +57094,7 @@ "tmp%4#0" ] }, - "6321": { + "6267": { "block": "_apply_non_cash_schedule_entry_after_if_else@58", "stack_in": [ "future_entry#0", @@ -57130,7 +57130,7 @@ "\"nominal_interest_rate\"" ] }, - "6323": { + "6269": { "op": "frame_dig 6", "defined_out": [ "\"nominal_interest_rate\"", @@ -57153,7 +57153,7 @@ "rate#0" ] }, - "6325": { + "6271": { "op": "app_global_put", "stack_out": [ "future_entry#0", @@ -57170,7 +57170,7 @@ "tmp%4#0" ] }, - "6326": { + "6272": { "block": "_apply_non_cash_schedule_entry_after_if_else@18", "stack_in": [ "future_entry#0", @@ -57206,7 +57206,7 @@ "event_type#0" ] }, - "6328": { + "6274": { "op": "pushint 4", "defined_out": [ "4", @@ -57229,7 +57229,7 @@ "4" ] }, - "6330": { + "6276": { "op": "==", "defined_out": [ "event_type#0", @@ -57251,7 +57251,7 @@ "tmp%16#0" ] }, - "6331": { + "6277": { "op": "bz _apply_non_cash_schedule_entry_else_body@20", "stack_out": [ "future_entry#0", @@ -57268,7 +57268,7 @@ "tmp%4#0" ] }, - "6334": { + "6280": { "op": "frame_dig -2", "defined_out": [ "entry#0 (copy)", @@ -57290,7 +57290,7 @@ "entry#0 (copy)" ] }, - "6336": { + "6282": { "op": "pushint 49", "defined_out": [ "49", @@ -57314,7 +57314,7 @@ "49" ] }, - "6338": { + "6284": { "op": "extract_uint64", "defined_out": [ "event_type#0", @@ -57336,7 +57336,7 @@ "values%10#0" ] }, - "6339": { + "6285": { "op": "bytec 4 // \"outstanding_principal\"", "defined_out": [ "\"outstanding_principal\"", @@ -57360,7 +57360,7 @@ "\"outstanding_principal\"" ] }, - "6341": { + "6287": { "op": "dig 1", "defined_out": [ "\"outstanding_principal\"", @@ -57386,7 +57386,7 @@ "values%10#0 (copy)" ] }, - "6343": { + "6289": { "op": "app_global_put", "stack_out": [ "future_entry#0", @@ -57404,7 +57404,7 @@ "values%10#0" ] }, - "6344": { + "6290": { "op": "bytec 7 // \"interest_calculation_base\"", "defined_out": [ "\"interest_calculation_base\"", @@ -57428,7 +57428,7 @@ "\"interest_calculation_base\"" ] }, - "6346": { + "6292": { "op": "swap", "stack_out": [ "future_entry#0", @@ -57447,7 +57447,7 @@ "values%10#0" ] }, - "6347": { + "6293": { "op": "app_global_put", "stack_out": [ "future_entry#0", @@ -57464,7 +57464,7 @@ "tmp%4#0" ] }, - "6348": { + "6294": { "block": "_apply_non_cash_schedule_entry_after_if_else@23", "stack_in": [ "future_entry#0", @@ -57501,7 +57501,7 @@ "tmp%18#0" ] }, - "6351": { + "6297": { "op": "bz _apply_non_cash_schedule_entry_else_body@29", "stack_out": [ "future_entry#0", @@ -57518,7 +57518,7 @@ "tmp%4#0" ] }, - "6354": { + "6300": { "op": "frame_dig 10", "defined_out": [ "event_type#0" @@ -57539,7 +57539,7 @@ "event_type#0" ] }, - "6356": { + "6302": { "op": "pushint 5", "defined_out": [ "5", @@ -57562,7 +57562,7 @@ "5" ] }, - "6358": { + "6304": { "op": "==", "defined_out": [ "event_type#0", @@ -57584,7 +57584,7 @@ "tmp%19#0" ] }, - "6359": { + "6305": { "op": "bz _apply_non_cash_schedule_entry_after_if_else@30", "stack_out": [ "future_entry#0", @@ -57601,7 +57601,7 @@ "tmp%4#0" ] }, - "6362": { + "6308": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -57623,7 +57623,7 @@ "0" ] }, - "6363": { + "6309": { "op": "bytec_3 // \"schedule_entry_count\"", "defined_out": [ "\"schedule_entry_count\"", @@ -57647,7 +57647,7 @@ "\"schedule_entry_count\"" ] }, - "6364": { + "6310": { "op": "app_global_get_ex", "defined_out": [ "event_type#0", @@ -57671,7 +57671,7 @@ "maybe_exists%10#0" ] }, - "6365": { + "6311": { "error": "check self.schedule_entry_count exists", "op": "assert // check self.schedule_entry_count exists", "stack_out": [ @@ -57690,7 +57690,7 @@ "maybe_value%10#0" ] }, - "6366": { + "6312": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -57709,7 +57709,7 @@ "0" ] }, - "6367": { + "6313": { "op": "bytec_2 // \"event_cursor\"", "defined_out": [ "\"event_cursor\"", @@ -57735,7 +57735,7 @@ "\"event_cursor\"" ] }, - "6368": { + "6314": { "op": "app_global_get_ex", "defined_out": [ "event_type#0", @@ -57761,7 +57761,7 @@ "maybe_exists%11#0" ] }, - "6369": { + "6315": { "error": "check self.event_cursor exists", "op": "assert // check self.event_cursor exists", "stack_out": [ @@ -57781,7 +57781,7 @@ "maybe_value%11#0" ] }, - "6370": { + "6316": { "op": "-", "defined_out": [ "event_type#0", @@ -57803,7 +57803,7 @@ "tmp%20#0" ] }, - "6371": { + "6317": { "op": "pushint 100", "defined_out": [ "100", @@ -57827,7 +57827,7 @@ "100" ] }, - "6373": { + "6319": { "op": "*", "defined_out": [ "event_type#0", @@ -57849,7 +57849,7 @@ "tmp%21#0" ] }, - "6374": { + "6320": { "op": "intc 4 // 1500", "defined_out": [ "1500", @@ -57873,7 +57873,7 @@ "1500" ] }, - "6376": { + "6322": { "op": "+", "defined_out": [ "event_type#0", @@ -57895,7 +57895,7 @@ "tmp%22#0" ] }, - "6377": { + "6323": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -57914,7 +57914,7 @@ "0" ] }, - "6378": { + "6324": { "callsub": "_puya_lib.util.ensure_budget", "op": "callsub ensure_budget", "stack_out": [ @@ -57932,7 +57932,7 @@ "tmp%4#0" ] }, - "6381": { + "6327": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -57950,7 +57950,7 @@ "0" ] }, - "6382": { + "6328": { "op": "bytec 5 // \"fixed_point_scale\"", "defined_out": [ "\"fixed_point_scale\"", @@ -57974,7 +57974,7 @@ "\"fixed_point_scale\"" ] }, - "6384": { + "6330": { "op": "app_global_get_ex", "defined_out": [ "discount_factor#0", @@ -57998,7 +57998,7 @@ "maybe_exists%0#0" ] }, - "6385": { + "6331": { "op": "swap", "stack_out": [ "future_entry#0", @@ -58017,7 +58017,7 @@ "discount_factor#0" ] }, - "6386": { + "6332": { "op": "frame_bury 2", "defined_out": [ "discount_factor#0", @@ -58040,7 +58040,7 @@ "maybe_exists%0#0" ] }, - "6388": { + "6334": { "error": "check self.fixed_point_scale exists", "op": "assert // check self.fixed_point_scale exists", "stack_out": [ @@ -58058,7 +58058,7 @@ "tmp%4#0" ] }, - "6389": { + "6335": { "op": "intc_0 // 0", "defined_out": [ "denominator#0", @@ -58081,7 +58081,7 @@ "denominator#0" ] }, - "6390": { + "6336": { "op": "frame_bury 1", "defined_out": [ "denominator#0", @@ -58103,7 +58103,7 @@ "tmp%4#0" ] }, - "6392": { + "6338": { "op": "intc_0 // 0", "defined_out": [ "denominator#0", @@ -58127,7 +58127,7 @@ "skip_first_redemption#0" ] }, - "6393": { + "6339": { "op": "frame_bury 7", "defined_out": [ "denominator#0", @@ -58150,7 +58150,7 @@ "tmp%4#0" ] }, - "6395": { + "6341": { "op": "frame_dig -2", "defined_out": [ "denominator#0", @@ -58175,7 +58175,7 @@ "entry#0 (copy)" ] }, - "6397": { + "6343": { "op": "pushint 25", "defined_out": [ "25", @@ -58202,7 +58202,7 @@ "25" ] }, - "6399": { + "6345": { "op": "extract_uint64", "defined_out": [ "denominator#0", @@ -58227,7 +58227,7 @@ "values%0#0" ] }, - "6400": { + "6346": { "op": "dup", "stack_out": [ "future_entry#0", @@ -58246,7 +58246,7 @@ "values%0#0" ] }, - "6401": { + "6347": { "op": "frame_bury 8", "defined_out": [ "denominator#0", @@ -58271,7 +58271,7 @@ "values%0#0" ] }, - "6403": { + "6349": { "op": "bz _apply_non_cash_schedule_entry_after_if_else@35", "stack_out": [ "future_entry#0", @@ -58288,7 +58288,7 @@ "tmp%4#0" ] }, - "6406": { + "6352": { "op": "frame_dig 2", "stack_out": [ "future_entry#0", @@ -58306,7 +58306,7 @@ "discount_factor#0" ] }, - "6408": { + "6354": { "op": "frame_dig 8", "stack_out": [ "future_entry#0", @@ -58325,7 +58325,7 @@ "values%0#0" ] }, - "6410": { + "6356": { "callsub": "modules.actus_kernel.ActusKernelModule._discount_annuity_factor", "op": "callsub _discount_annuity_factor", "stack_out": [ @@ -58344,7 +58344,7 @@ "discount_factor#0" ] }, - "6413": { + "6359": { "op": "dup", "stack_out": [ "future_entry#0", @@ -58363,7 +58363,7 @@ "discount_factor#0" ] }, - "6414": { + "6360": { "op": "frame_bury 2", "stack_out": [ "future_entry#0", @@ -58381,7 +58381,7 @@ "discount_factor#0" ] }, - "6416": { + "6362": { "op": "intc_1 // 1", "stack_out": [ "future_entry#0", @@ -58400,7 +58400,7 @@ "skip_first_redemption#0" ] }, - "6417": { + "6363": { "op": "frame_bury 7", "stack_out": [ "future_entry#0", @@ -58418,7 +58418,7 @@ "denominator#0" ] }, - "6419": { + "6365": { "op": "frame_bury 1", "stack_out": [ "future_entry#0", @@ -58435,7 +58435,7 @@ "tmp%4#0" ] }, - "6421": { + "6367": { "block": "_apply_non_cash_schedule_entry_after_if_else@35", "stack_in": [ "future_entry#0", @@ -58471,7 +58471,7 @@ "0" ] }, - "6422": { + "6368": { "op": "bytec_2 // \"event_cursor\"", "defined_out": [ "\"event_cursor\"", @@ -58494,7 +58494,7 @@ "\"event_cursor\"" ] }, - "6423": { + "6369": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%1#0", @@ -58517,7 +58517,7 @@ "maybe_exists%1#0" ] }, - "6424": { + "6370": { "error": "check self.event_cursor exists", "op": "assert // check self.event_cursor exists", "stack_out": [ @@ -58536,7 +58536,7 @@ "maybe_value%1#0" ] }, - "6425": { + "6371": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -58559,7 +58559,7 @@ "1" ] }, - "6426": { + "6372": { "op": "+", "defined_out": [ "future_event_id#0" @@ -58580,7 +58580,7 @@ "future_event_id#0" ] }, - "6427": { + "6373": { "op": "frame_bury 3", "defined_out": [ "future_event_id#0" @@ -58600,7 +58600,7 @@ "tmp%4#0" ] }, - "6429": { + "6375": { "block": "_apply_non_cash_schedule_entry_while_top@36", "stack_in": [ "future_entry#0", @@ -58636,7 +58636,7 @@ "0" ] }, - "6430": { + "6376": { "op": "bytec_3 // \"schedule_entry_count\"", "defined_out": [ "\"schedule_entry_count\"", @@ -58659,7 +58659,7 @@ "\"schedule_entry_count\"" ] }, - "6431": { + "6377": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%2#0", @@ -58682,7 +58682,7 @@ "maybe_exists%2#0" ] }, - "6432": { + "6378": { "error": "check self.schedule_entry_count exists", "op": "assert // check self.schedule_entry_count exists", "stack_out": [ @@ -58701,7 +58701,7 @@ "maybe_value%2#0" ] }, - "6433": { + "6379": { "op": "frame_dig 3", "defined_out": [ "future_event_id#0", @@ -58724,7 +58724,7 @@ "future_event_id#0" ] }, - "6435": { + "6381": { "op": ">", "defined_out": [ "future_event_id#0", @@ -58746,7 +58746,7 @@ "tmp%4#0" ] }, - "6436": { + "6382": { "op": "bz _apply_non_cash_schedule_entry_after_while@48", "stack_out": [ "future_entry#0", @@ -58763,7 +58763,7 @@ "tmp%4#0" ] }, - "6439": { + "6385": { "op": "frame_dig 3", "stack_out": [ "future_entry#0", @@ -58781,7 +58781,7 @@ "future_event_id#0" ] }, - "6441": { + "6387": { "callsub": "modules.actus_kernel.ActusKernelModule._get_schedule_entry", "op": "callsub _get_schedule_entry", "defined_out": [ @@ -58805,7 +58805,7 @@ "future_entry#0" ] }, - "6444": { + "6390": { "op": "dup", "stack_out": [ "future_entry#0", @@ -58824,7 +58824,7 @@ "future_entry#0" ] }, - "6445": { + "6391": { "op": "frame_bury 0", "defined_out": [ "future_entry#0", @@ -58847,7 +58847,7 @@ "future_entry#0" ] }, - "6447": { + "6393": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -58872,7 +58872,7 @@ "8" ] }, - "6448": { + "6394": { "op": "getbyte", "defined_out": [ "future_entry#0", @@ -58896,7 +58896,7 @@ "future_event_type#0" ] }, - "6449": { + "6395": { "op": "dup", "stack_out": [ "future_entry#0", @@ -58915,7 +58915,7 @@ "future_event_type#0" ] }, - "6450": { + "6396": { "op": "frame_bury 4", "defined_out": [ "future_entry#0", @@ -58939,7 +58939,7 @@ "future_event_type#0" ] }, - "6452": { + "6398": { "op": "pushint 3", "defined_out": [ "3", @@ -58965,7 +58965,7 @@ "3" ] }, - "6454": { + "6400": { "op": "==", "defined_out": [ "future_entry#0", @@ -58990,7 +58990,7 @@ "tmp%7#1" ] }, - "6455": { + "6401": { "op": "bnz _apply_non_cash_schedule_entry_bool_true@40", "stack_out": [ "future_entry#0", @@ -59007,7 +59007,7 @@ "tmp%4#0" ] }, - "6458": { + "6404": { "op": "frame_dig 4", "stack_out": [ "future_entry#0", @@ -59025,7 +59025,7 @@ "future_event_type#0" ] }, - "6460": { + "6406": { "op": "pushint 19", "defined_out": [ "19", @@ -59051,7 +59051,7 @@ "19" ] }, - "6462": { + "6408": { "op": "==", "defined_out": [ "future_entry#0", @@ -59076,7 +59076,7 @@ "tmp%8#1" ] }, - "6463": { + "6409": { "op": "bz _apply_non_cash_schedule_entry_bool_false@41", "stack_out": [ "future_entry#0", @@ -59093,7 +59093,7 @@ "tmp%4#0" ] }, - "6466": { + "6412": { "op": "frame_dig 0", "stack_out": [ "future_entry#0", @@ -59111,7 +59111,7 @@ "future_entry#0" ] }, - "6468": { + "6414": { "op": "pushint 25", "defined_out": [ "25", @@ -59137,7 +59137,7 @@ "25" ] }, - "6470": { + "6416": { "op": "extract_uint64", "defined_out": [ "future_entry#0", @@ -59162,7 +59162,7 @@ "values%2#0" ] }, - "6471": { + "6417": { "op": "bz _apply_non_cash_schedule_entry_bool_false@41", "stack_out": [ "future_entry#0", @@ -59179,7 +59179,7 @@ "tmp%4#0" ] }, - "6474": { + "6420": { "block": "_apply_non_cash_schedule_entry_bool_true@40", "stack_in": [ "future_entry#0", @@ -59215,7 +59215,7 @@ "is_redemption_event#0" ] }, - "6475": { + "6421": { "block": "_apply_non_cash_schedule_entry_bool_merge@42", "stack_in": [ "future_entry#0", @@ -59249,7 +59249,7 @@ "tmp%4#0" ] }, - "6478": { + "6424": { "op": "frame_dig 7", "defined_out": [ "skip_first_redemption#0" @@ -59270,7 +59270,7 @@ "skip_first_redemption#0" ] }, - "6480": { + "6426": { "op": "bz _apply_non_cash_schedule_entry_else_body@45", "stack_out": [ "future_entry#0", @@ -59287,7 +59287,7 @@ "tmp%4#0" ] }, - "6483": { + "6429": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -59305,7 +59305,7 @@ "skip_first_redemption#0" ] }, - "6484": { + "6430": { "op": "frame_bury 7", "defined_out": [ "skip_first_redemption#0" @@ -59325,7 +59325,7 @@ "tmp%4#0" ] }, - "6486": { + "6432": { "block": "_apply_non_cash_schedule_entry_after_if_else@47", "stack_in": [ "future_entry#0", @@ -59361,7 +59361,7 @@ "future_event_id#0" ] }, - "6488": { + "6434": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -59384,7 +59384,7 @@ "1" ] }, - "6489": { + "6435": { "op": "+", "stack_out": [ "future_entry#0", @@ -59402,7 +59402,7 @@ "future_event_id#0" ] }, - "6490": { + "6436": { "op": "frame_bury 3", "defined_out": [ "future_event_id#0" @@ -59422,10 +59422,10 @@ "tmp%4#0" ] }, - "6492": { + "6438": { "op": "b _apply_non_cash_schedule_entry_while_top@36" }, - "6495": { + "6441": { "block": "_apply_non_cash_schedule_entry_else_body@45", "stack_in": [ "future_entry#0", @@ -59461,7 +59461,7 @@ "future_entry#0" ] }, - "6497": { + "6443": { "op": "pushint 25", "defined_out": [ "25", @@ -59484,7 +59484,7 @@ "25" ] }, - "6499": { + "6445": { "op": "extract_uint64", "defined_out": [ "future_entry#0", @@ -59506,7 +59506,7 @@ "values%3#1" ] }, - "6500": { + "6446": { "op": "frame_dig 2", "defined_out": [ "discount_factor#0", @@ -59530,7 +59530,7 @@ "discount_factor#0" ] }, - "6502": { + "6448": { "op": "swap", "stack_out": [ "future_entry#0", @@ -59549,7 +59549,7 @@ "values%3#1" ] }, - "6503": { + "6449": { "callsub": "modules.actus_kernel.ActusKernelModule._discount_annuity_factor", "op": "callsub _discount_annuity_factor", "stack_out": [ @@ -59568,7 +59568,7 @@ "discount_factor#0" ] }, - "6506": { + "6452": { "op": "dup", "stack_out": [ "future_entry#0", @@ -59587,7 +59587,7 @@ "discount_factor#0" ] }, - "6507": { + "6453": { "op": "frame_bury 2", "defined_out": [ "discount_factor#0", @@ -59609,7 +59609,7 @@ "discount_factor#0" ] }, - "6509": { + "6455": { "op": "frame_dig 1", "defined_out": [ "denominator#0", @@ -59633,7 +59633,7 @@ "denominator#0" ] }, - "6511": { + "6457": { "op": "+", "stack_out": [ "future_entry#0", @@ -59651,7 +59651,7 @@ "denominator#0" ] }, - "6512": { + "6458": { "op": "frame_bury 1", "defined_out": [ "denominator#0", @@ -59673,10 +59673,10 @@ "tmp%4#0" ] }, - "6514": { + "6460": { "op": "b _apply_non_cash_schedule_entry_after_if_else@47" }, - "6517": { + "6463": { "block": "_apply_non_cash_schedule_entry_bool_false@41", "stack_in": [ "future_entry#0", @@ -59712,10 +59712,10 @@ "is_redemption_event#0" ] }, - "6518": { + "6464": { "op": "b _apply_non_cash_schedule_entry_bool_merge@42" }, - "6521": { + "6467": { "block": "_apply_non_cash_schedule_entry_after_while@48", "stack_in": [ "future_entry#0", @@ -59751,7 +59751,7 @@ "denominator#0" ] }, - "6523": { + "6469": { "error": "Invalid ACTUS configuration", "op": "assert // Invalid ACTUS configuration", "stack_out": [ @@ -59769,7 +59769,7 @@ "tmp%4#0" ] }, - "6524": { + "6470": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -59791,7 +59791,7 @@ "0" ] }, - "6525": { + "6471": { "op": "bytec 4 // \"outstanding_principal\"", "defined_out": [ "\"outstanding_principal\"", @@ -59815,7 +59815,7 @@ "\"outstanding_principal\"" ] }, - "6527": { + "6473": { "op": "app_global_get_ex", "defined_out": [ "denominator#0", @@ -59839,7 +59839,7 @@ "maybe_exists%3#0" ] }, - "6528": { + "6474": { "error": "check self.outstanding_principal exists", "op": "assert // check self.outstanding_principal exists", "stack_out": [ @@ -59858,7 +59858,7 @@ "numerator#0" ] }, - "6529": { + "6475": { "op": "frame_dig -2", "defined_out": [ "denominator#0", @@ -59882,7 +59882,7 @@ "entry#0 (copy)" ] }, - "6531": { + "6477": { "op": "pushint 57", "defined_out": [ "57", @@ -59908,7 +59908,7 @@ "57" ] }, - "6533": { + "6479": { "op": "extract_uint64", "defined_out": [ "denominator#0", @@ -59932,7 +59932,7 @@ "values%4#0" ] }, - "6534": { + "6480": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -59958,7 +59958,7 @@ "8" ] }, - "6535": { + "6481": { "op": "&", "defined_out": [ "denominator#0", @@ -59982,7 +59982,7 @@ "tmp%14#1" ] }, - "6536": { + "6482": { "op": "bnz _apply_non_cash_schedule_entry_after_if_else@50", "stack_out": [ "future_entry#0", @@ -60000,7 +60000,7 @@ "numerator#0" ] }, - "6539": { + "6485": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -60019,7 +60019,7 @@ "0" ] }, - "6540": { + "6486": { "op": "bytec 6 // \"accrued_interest\"", "defined_out": [ "\"accrued_interest\"", @@ -60045,7 +60045,7 @@ "\"accrued_interest\"" ] }, - "6542": { + "6488": { "op": "app_global_get_ex", "defined_out": [ "denominator#0", @@ -60071,7 +60071,7 @@ "maybe_exists%4#0" ] }, - "6543": { + "6489": { "error": "check self.accrued_interest exists", "op": "assert // check self.accrued_interest exists", "stack_out": [ @@ -60091,7 +60091,7 @@ "maybe_value%4#0" ] }, - "6544": { + "6490": { "op": "+", "stack_out": [ "future_entry#0", @@ -60109,7 +60109,7 @@ "numerator#0" ] }, - "6545": { + "6491": { "block": "_apply_non_cash_schedule_entry_after_if_else@50", "stack_in": [ "future_entry#0", @@ -60147,7 +60147,7 @@ "0" ] }, - "6546": { + "6492": { "op": "bytec 5 // \"fixed_point_scale\"", "defined_out": [ "\"fixed_point_scale\"", @@ -60171,7 +60171,7 @@ "\"fixed_point_scale\"" ] }, - "6548": { + "6494": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%5#0", @@ -60195,7 +60195,7 @@ "maybe_exists%5#0" ] }, - "6549": { + "6495": { "error": "check self.fixed_point_scale exists", "op": "assert // check self.fixed_point_scale exists", "defined_out": [ @@ -60219,7 +60219,7 @@ "maybe_value%5#0" ] }, - "6550": { + "6496": { "op": "frame_dig 1", "defined_out": [ "denominator#0", @@ -60244,7 +60244,7 @@ "denominator#0" ] }, - "6552": { + "6498": { "callsub": "modules.actus_kernel.ActusKernelModule._scaled_mul_div", "op": "callsub _scaled_mul_div", "defined_out": [ @@ -60267,7 +60267,7 @@ "tmp%17#1" ] }, - "6555": { + "6501": { "op": "bytec 14 // \"next_principal_redemption\"", "defined_out": [ "\"next_principal_redemption\"", @@ -60291,7 +60291,7 @@ "\"next_principal_redemption\"" ] }, - "6557": { + "6503": { "op": "swap", "stack_out": [ "future_entry#0", @@ -60310,7 +60310,7 @@ "tmp%17#1" ] }, - "6558": { + "6504": { "op": "app_global_put", "stack_out": [ "future_entry#0", @@ -60327,7 +60327,7 @@ "tmp%4#0" ] }, - "6559": { + "6505": { "block": "_apply_non_cash_schedule_entry_after_if_else@30", "stack_in": [ "future_entry#0", @@ -60363,7 +60363,7 @@ "0" ] }, - "6560": { + "6506": { "op": "bytec_2 // \"event_cursor\"", "defined_out": [ "\"event_cursor\"", @@ -60386,7 +60386,7 @@ "\"event_cursor\"" ] }, - "6561": { + "6507": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%12#0", @@ -60409,7 +60409,7 @@ "maybe_exists%12#0" ] }, - "6562": { + "6508": { "error": "check self.event_cursor exists", "op": "assert // check self.event_cursor exists", "stack_out": [ @@ -60428,7 +60428,7 @@ "maybe_value%12#0" ] }, - "6563": { + "6509": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -60451,7 +60451,7 @@ "1" ] }, - "6564": { + "6510": { "op": "+", "defined_out": [ "tmp%23#0" @@ -60472,7 +60472,7 @@ "tmp%23#0" ] }, - "6565": { + "6511": { "op": "bytec_2 // \"event_cursor\"", "stack_out": [ "future_entry#0", @@ -60491,7 +60491,7 @@ "\"event_cursor\"" ] }, - "6566": { + "6512": { "op": "swap", "stack_out": [ "future_entry#0", @@ -60510,7 +60510,7 @@ "tmp%23#0" ] }, - "6567": { + "6513": { "op": "app_global_put", "stack_out": [ "future_entry#0", @@ -60527,7 +60527,7 @@ "tmp%4#0" ] }, - "6568": { + "6514": { "op": "frame_dig -2", "defined_out": [ "entry#0 (copy)" @@ -60548,7 +60548,7 @@ "entry#0 (copy)" ] }, - "6570": { + "6516": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -60567,7 +60567,7 @@ "0" ] }, - "6571": { + "6517": { "op": "dup", "stack_out": [ "future_entry#0", @@ -60587,7 +60587,7 @@ "0" ] }, - "6572": { + "6518": { "callsub": "modules.actus_kernel.ActusKernelModule._emit_execution_event", "op": "callsub _emit_execution_event", "defined_out": [ @@ -60609,10 +60609,10 @@ "entry#0" ] }, - "6575": { + "6521": { "op": "dup" }, - "6576": { + "6522": { "op": "frame_bury -2", "stack_out": [ "future_entry#0", @@ -60630,7 +60630,7 @@ "entry#0 (copy)" ] }, - "6578": { + "6524": { "op": "frame_dig -1", "defined_out": [ "entry#0 (copy)", @@ -60653,17 +60653,17 @@ "payload#0 (copy)" ] }, - "6580": { + "6526": { "op": "frame_bury 1" }, - "6582": { + "6528": { "op": "frame_bury 0" }, - "6584": { + "6530": { "retsub": true, "op": "retsub" }, - "6585": { + "6531": { "block": "_apply_non_cash_schedule_entry_else_body@29", "stack_in": [ "future_entry#0", @@ -60699,7 +60699,7 @@ "entry#0 (copy)" ] }, - "6587": { + "6533": { "op": "pushint 41", "defined_out": [ "41", @@ -60722,7 +60722,7 @@ "41" ] }, - "6589": { + "6535": { "op": "extract_uint64", "defined_out": [ "values%12#0" @@ -60743,7 +60743,7 @@ "values%12#0" ] }, - "6590": { + "6536": { "op": "bytec 14 // \"next_principal_redemption\"", "defined_out": [ "\"next_principal_redemption\"", @@ -60766,7 +60766,7 @@ "\"next_principal_redemption\"" ] }, - "6592": { + "6538": { "op": "swap", "stack_out": [ "future_entry#0", @@ -60785,7 +60785,7 @@ "values%12#0" ] }, - "6593": { + "6539": { "op": "app_global_put", "stack_out": [ "future_entry#0", @@ -60802,10 +60802,10 @@ "tmp%4#0" ] }, - "6594": { + "6540": { "op": "b _apply_non_cash_schedule_entry_after_if_else@30" }, - "6597": { + "6543": { "block": "_apply_non_cash_schedule_entry_else_body@20", "stack_in": [ "future_entry#0", @@ -60841,7 +60841,7 @@ "event_type#0" ] }, - "6599": { + "6545": { "op": "pushint 18", "defined_out": [ "18", @@ -60864,7 +60864,7 @@ "18" ] }, - "6601": { + "6547": { "op": "==", "defined_out": [ "event_type#0", @@ -60886,7 +60886,7 @@ "tmp%17#0" ] }, - "6602": { + "6548": { "op": "bz _apply_non_cash_schedule_entry_after_if_else@23", "stack_out": [ "future_entry#0", @@ -60903,7 +60903,7 @@ "tmp%4#0" ] }, - "6605": { + "6551": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -60925,7 +60925,7 @@ "0" ] }, - "6606": { + "6552": { "op": "bytec 4 // \"outstanding_principal\"", "defined_out": [ "\"outstanding_principal\"", @@ -60949,7 +60949,7 @@ "\"outstanding_principal\"" ] }, - "6608": { + "6554": { "op": "app_global_get_ex", "defined_out": [ "event_type#0", @@ -60973,7 +60973,7 @@ "maybe_exists%9#0" ] }, - "6609": { + "6555": { "error": "check self.outstanding_principal exists", "op": "assert // check self.outstanding_principal exists", "stack_out": [ @@ -60992,7 +60992,7 @@ "maybe_value%9#0" ] }, - "6610": { + "6556": { "op": "bytec 7 // \"interest_calculation_base\"", "defined_out": [ "\"interest_calculation_base\"", @@ -61016,7 +61016,7 @@ "\"interest_calculation_base\"" ] }, - "6612": { + "6558": { "op": "swap", "stack_out": [ "future_entry#0", @@ -61035,7 +61035,7 @@ "maybe_value%9#0" ] }, - "6613": { + "6559": { "op": "app_global_put", "stack_out": [ "future_entry#0", @@ -61052,10 +61052,10 @@ "tmp%4#0" ] }, - "6614": { + "6560": { "op": "b _apply_non_cash_schedule_entry_after_if_else@23" }, - "6617": { + "6563": { "block": "_apply_non_cash_schedule_entry_else_body@10", "stack_in": [ "future_entry#0", @@ -61091,7 +61091,7 @@ "event_type#0" ] }, - "6619": { + "6565": { "op": "pushint 11", "defined_out": [ "11", @@ -61114,7 +61114,7 @@ "11" ] }, - "6621": { + "6567": { "op": "==", "defined_out": [ "event_type#0", @@ -61136,7 +61136,7 @@ "tmp%13#0" ] }, - "6622": { + "6568": { "op": "bz _apply_non_cash_schedule_entry_else_body@14", "stack_out": [ "future_entry#0", @@ -61153,7 +61153,7 @@ "tmp%4#0" ] }, - "6625": { + "6571": { "op": "frame_dig -2", "defined_out": [ "entry#0 (copy)", @@ -61175,7 +61175,7 @@ "entry#0 (copy)" ] }, - "6627": { + "6573": { "op": "pushint 33", "defined_out": [ "33", @@ -61199,7 +61199,7 @@ "33" ] }, - "6629": { + "6575": { "op": "extract_uint64", "defined_out": [ "event_type#0", @@ -61221,7 +61221,7 @@ "next_rate#0" ] }, - "6630": { + "6576": { "op": "dup", "stack_out": [ "future_entry#0", @@ -61240,7 +61240,7 @@ "next_rate#0" ] }, - "6631": { + "6577": { "op": "frame_bury 5", "defined_out": [ "event_type#0", @@ -61262,7 +61262,7 @@ "next_rate#0" ] }, - "6633": { + "6579": { "op": "bnz _apply_non_cash_schedule_entry_after_if_else@13", "stack_out": [ "future_entry#0", @@ -61279,7 +61279,7 @@ "tmp%4#0" ] }, - "6636": { + "6582": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -61297,7 +61297,7 @@ "0" ] }, - "6637": { + "6583": { "op": "bytec 37 // \"rate_reset_next\"", "defined_out": [ "\"rate_reset_next\"", @@ -61322,7 +61322,7 @@ "\"rate_reset_next\"" ] }, - "6639": { + "6585": { "op": "app_global_get_ex", "defined_out": [ "event_type#0", @@ -61346,7 +61346,7 @@ "maybe_exists%8#0" ] }, - "6640": { + "6586": { "op": "swap", "stack_out": [ "future_entry#0", @@ -61365,7 +61365,7 @@ "next_rate#0" ] }, - "6641": { + "6587": { "op": "frame_bury 5", "stack_out": [ "future_entry#0", @@ -61383,7 +61383,7 @@ "maybe_exists%8#0" ] }, - "6643": { + "6589": { "error": "check self.rate_reset_next exists", "op": "assert // check self.rate_reset_next exists", "stack_out": [ @@ -61401,7 +61401,7 @@ "tmp%4#0" ] }, - "6644": { + "6590": { "block": "_apply_non_cash_schedule_entry_after_if_else@13", "stack_in": [ "future_entry#0", @@ -61437,7 +61437,7 @@ "\"nominal_interest_rate\"" ] }, - "6646": { + "6592": { "op": "frame_dig 5", "defined_out": [ "\"nominal_interest_rate\"", @@ -61460,7 +61460,7 @@ "next_rate#0" ] }, - "6648": { + "6594": { "op": "app_global_put", "stack_out": [ "future_entry#0", @@ -61477,10 +61477,10 @@ "tmp%4#0" ] }, - "6649": { + "6595": { "op": "b _apply_non_cash_schedule_entry_after_if_else@18" }, - "6652": { + "6598": { "block": "_apply_non_cash_schedule_entry_else_body@14", "stack_in": [ "future_entry#0", @@ -61516,7 +61516,7 @@ "entry#0 (copy)" ] }, - "6654": { + "6600": { "op": "pushint 33", "defined_out": [ "33", @@ -61539,7 +61539,7 @@ "33" ] }, - "6656": { + "6602": { "op": "extract_uint64", "defined_out": [ "values%8#0" @@ -61560,7 +61560,7 @@ "values%8#0" ] }, - "6657": { + "6603": { "op": "dup", "stack_out": [ "future_entry#0", @@ -61579,7 +61579,7 @@ "values%8#0" ] }, - "6658": { + "6604": { "op": "frame_bury 9", "defined_out": [ "values%8#0" @@ -61600,7 +61600,7 @@ "values%8#0" ] }, - "6660": { + "6606": { "op": "bz _apply_non_cash_schedule_entry_after_if_else@18", "stack_out": [ "future_entry#0", @@ -61617,7 +61617,7 @@ "tmp%4#0" ] }, - "6663": { + "6609": { "op": "bytec 9 // \"nominal_interest_rate\"", "defined_out": [ "\"nominal_interest_rate\"", @@ -61639,7 +61639,7 @@ "\"nominal_interest_rate\"" ] }, - "6665": { + "6611": { "op": "frame_dig 9", "stack_out": [ "future_entry#0", @@ -61658,7 +61658,7 @@ "values%8#0" ] }, - "6667": { + "6613": { "op": "app_global_put", "stack_out": [ "future_entry#0", @@ -61675,10 +61675,10 @@ "tmp%4#0" ] }, - "6668": { + "6614": { "op": "b _apply_non_cash_schedule_entry_after_if_else@18" }, - "6671": { + "6617": { "subroutine": "modules.actus_kernel.ActusKernelModule._emit_execution_event", "params": { "entry#0": "bytes", @@ -61689,13 +61689,13 @@ "stack_in": [], "op": "proto 3 1" }, - "6674": { + "6620": { "op": "global CurrentApplicationID" }, - "6676": { + "6622": { "op": "frame_dig -3" }, - "6678": { + "6624": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -61708,7 +61708,7 @@ "0" ] }, - "6679": { + "6625": { "op": "extract_uint64", "defined_out": [ "tmp%0#0", @@ -61719,7 +61719,7 @@ "values%0#0" ] }, - "6680": { + "6626": { "op": "frame_dig -3", "stack_out": [ "tmp%0#0", @@ -61727,7 +61727,7 @@ "entry#0 (copy)" ] }, - "6682": { + "6628": { "op": "extract 8 1", "defined_out": [ "aggregate%extract%1#0", @@ -61740,7 +61740,7 @@ "aggregate%extract%1#0" ] }, - "6685": { + "6631": { "op": "frame_dig -3", "stack_out": [ "tmp%0#0", @@ -61749,7 +61749,7 @@ "entry#0 (copy)" ] }, - "6687": { + "6633": { "op": "extract 9 8", "defined_out": [ "aggregate%extract%1#0", @@ -61764,13 +61764,13 @@ "aggregate%extract%2#0" ] }, - "6690": { + "6636": { "op": "global LatestTimestamp" }, - "6692": { + "6638": { "op": "frame_dig -3" }, - "6694": { + "6640": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -61791,7 +61791,7 @@ "8" ] }, - "6695": { + "6641": { "op": "getbyte", "defined_out": [ "aggregate%extract%1#0", @@ -61810,7 +61810,7 @@ "event_type#0" ] }, - "6696": { + "6642": { "op": "frame_dig -2", "defined_out": [ "aggregate%extract%1#0", @@ -61831,7 +61831,7 @@ "payoff#0 (copy)" ] }, - "6698": { + "6644": { "op": "bnz _emit_execution_event_after_if_else@3", "stack_out": [ "tmp%0#0", @@ -61842,7 +61842,7 @@ "event_type#0" ] }, - "6701": { + "6647": { "op": "intc_1 // 1", "defined_out": [ "aggregate%extract%1#0", @@ -61863,7 +61863,7 @@ "tmp%3#0" ] }, - "6702": { + "6648": { "block": "_emit_execution_event_after_inlined_modules.actus_kernel.ActusKernelModule._payoff_sign@7", "stack_in": [ "tmp%0#0", @@ -61888,7 +61888,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "6703": { + "6649": { "op": "dup", "defined_out": [ "aggregate%val_as_bytes%0#0", @@ -61905,7 +61905,7 @@ "aggregate%val_as_bytes%0#0 (copy)" ] }, - "6704": { + "6650": { "op": "bitlen", "defined_out": [ "aggregate%bitlen%0#0", @@ -61922,7 +61922,7 @@ "aggregate%bitlen%0#0" ] }, - "6705": { + "6651": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -61941,7 +61941,7 @@ "8" ] }, - "6706": { + "6652": { "op": "<=", "defined_out": [ "aggregate%no_overflow%0#0", @@ -61958,7 +61958,7 @@ "aggregate%no_overflow%0#0" ] }, - "6707": { + "6653": { "error": "overflow", "op": "assert // overflow", "stack_out": [ @@ -61971,7 +61971,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "6708": { + "6654": { "op": "extract 7 1", "defined_out": [ "aggregate%uint8%0#0" @@ -61986,7 +61986,7 @@ "aggregate%uint8%0#0" ] }, - "6711": { + "6657": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -62003,7 +62003,7 @@ "0" ] }, - "6712": { + "6658": { "op": "bytec 19 // \"settlement_asset_id\"", "defined_out": [ "\"settlement_asset_id\"", @@ -62022,7 +62022,7 @@ "\"settlement_asset_id\"" ] }, - "6714": { + "6660": { "op": "app_global_get_ex", "defined_out": [ "aggregate%uint8%0#0", @@ -62041,7 +62041,7 @@ "maybe_exists%0#0" ] }, - "6715": { + "6661": { "error": "check self.settlement_asset_id exists", "op": "assert // check self.settlement_asset_id exists", "stack_out": [ @@ -62055,7 +62055,7 @@ "maybe_value%0#0" ] }, - "6716": { + "6662": { "op": "frame_dig 1", "defined_out": [ "aggregate%uint8%0#0", @@ -62074,7 +62074,7 @@ "values%0#0" ] }, - "6718": { + "6664": { "op": "dup", "defined_out": [ "aggregate%uint8%0#0", @@ -62095,7 +62095,7 @@ "values%0#0 (copy)" ] }, - "6719": { + "6665": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -62118,7 +62118,7 @@ "1" ] }, - "6720": { + "6666": { "op": "+", "defined_out": [ "aggregate%uint8%0#0", @@ -62139,7 +62139,7 @@ "tmp%5#0" ] }, - "6721": { + "6667": { "op": "frame_dig 0", "defined_out": [ "aggregate%uint8%0#0", @@ -62162,7 +62162,7 @@ "tmp%0#0" ] }, - "6723": { + "6669": { "op": "itob", "defined_out": [ "aggregate%uint8%0#0", @@ -62186,7 +62186,7 @@ "aggregate%val_as_bytes%1#0" ] }, - "6724": { + "6670": { "op": "uncover 2", "stack_out": [ "tmp%0#0", @@ -62202,7 +62202,7 @@ "values%0#0" ] }, - "6726": { + "6672": { "op": "itob", "defined_out": [ "aggregate%uint8%0#0", @@ -62227,7 +62227,7 @@ "aggregate%val_as_bytes%2#0" ] }, - "6727": { + "6673": { "op": "concat", "defined_out": [ "aggregate%head%1#0", @@ -62250,7 +62250,7 @@ "aggregate%head%1#0" ] }, - "6728": { + "6674": { "op": "frame_dig 2", "defined_out": [ "aggregate%extract%1#0", @@ -62275,7 +62275,7 @@ "aggregate%extract%1#0" ] }, - "6730": { + "6676": { "op": "concat", "defined_out": [ "aggregate%extract%1#0", @@ -62299,7 +62299,7 @@ "aggregate%head%2#0" ] }, - "6731": { + "6677": { "op": "frame_dig 3", "defined_out": [ "aggregate%extract%1#0", @@ -62325,7 +62325,7 @@ "aggregate%extract%2#0" ] }, - "6733": { + "6679": { "op": "concat", "defined_out": [ "aggregate%extract%1#0", @@ -62350,7 +62350,7 @@ "aggregate%head%3#0" ] }, - "6734": { + "6680": { "op": "frame_dig 4", "defined_out": [ "aggregate%extract%1#0", @@ -62377,7 +62377,7 @@ "tmp%1#0" ] }, - "6736": { + "6682": { "op": "itob", "defined_out": [ "aggregate%extract%1#0", @@ -62405,7 +62405,7 @@ "aggregate%val_as_bytes%4#0" ] }, - "6737": { + "6683": { "op": "concat", "defined_out": [ "aggregate%extract%1#0", @@ -62431,7 +62431,7 @@ "aggregate%head%4#0" ] }, - "6738": { + "6684": { "op": "frame_dig -2", "defined_out": [ "aggregate%extract%1#0", @@ -62459,7 +62459,7 @@ "payoff#0 (copy)" ] }, - "6740": { + "6686": { "op": "itob", "defined_out": [ "aggregate%extract%1#0", @@ -62487,7 +62487,7 @@ "aggregate%val_as_bytes%5#0" ] }, - "6741": { + "6687": { "op": "concat", "defined_out": [ "aggregate%extract%1#0", @@ -62513,7 +62513,7 @@ "aggregate%head%5#0" ] }, - "6742": { + "6688": { "op": "uncover 3", "stack_out": [ "tmp%0#0", @@ -62528,7 +62528,7 @@ "aggregate%uint8%0#0" ] }, - "6744": { + "6690": { "op": "concat", "defined_out": [ "aggregate%extract%1#0", @@ -62552,7 +62552,7 @@ "aggregate%head%6#0" ] }, - "6745": { + "6691": { "op": "frame_dig -1", "defined_out": [ "aggregate%extract%1#0", @@ -62578,7 +62578,7 @@ "settled_amount#0 (copy)" ] }, - "6747": { + "6693": { "op": "itob", "defined_out": [ "aggregate%extract%1#0", @@ -62604,7 +62604,7 @@ "aggregate%val_as_bytes%6#0" ] }, - "6748": { + "6694": { "op": "concat", "defined_out": [ "aggregate%extract%1#0", @@ -62628,7 +62628,7 @@ "aggregate%head%7#0" ] }, - "6749": { + "6695": { "op": "uncover 2", "stack_out": [ "tmp%0#0", @@ -62642,7 +62642,7 @@ "maybe_value%0#0" ] }, - "6751": { + "6697": { "op": "itob", "defined_out": [ "aggregate%extract%1#0", @@ -62666,7 +62666,7 @@ "aggregate%val_as_bytes%7#0" ] }, - "6752": { + "6698": { "op": "concat", "defined_out": [ "aggregate%extract%1#0", @@ -62688,7 +62688,7 @@ "aggregate%head%8#0" ] }, - "6753": { + "6699": { "op": "swap", "stack_out": [ "tmp%0#0", @@ -62701,7 +62701,7 @@ "tmp%5#0" ] }, - "6754": { + "6700": { "op": "itob", "defined_out": [ "aggregate%extract%1#0", @@ -62723,7 +62723,7 @@ "aggregate%val_as_bytes%8#0" ] }, - "6755": { + "6701": { "op": "concat", "defined_out": [ "aggregate%extract%1#0", @@ -62743,7 +62743,7 @@ "aggregate%head%9#0" ] }, - "6756": { + "6702": { "op": "pushbytes 0x9a332b95 // method \"ExecutionEvent(uint64,uint64,uint8,uint64,uint64,uint64,uint8,uint64,uint64,uint64)\"", "defined_out": [ "Method(ExecutionEvent(uint64,uint64,uint8,uint64,uint64,uint64,uint8,uint64,uint64,uint64))", @@ -62765,7 +62765,7 @@ "Method(ExecutionEvent(uint64,uint64,uint8,uint64,uint64,uint64,uint8,uint64,uint64,uint64))" ] }, - "6762": { + "6708": { "op": "swap", "stack_out": [ "tmp%0#0", @@ -62778,7 +62778,7 @@ "aggregate%head%9#0" ] }, - "6763": { + "6709": { "op": "concat", "defined_out": [ "aggregate%extract%1#0", @@ -62798,7 +62798,7 @@ "event%0#0" ] }, - "6764": { + "6710": { "op": "log", "stack_out": [ "tmp%0#0", @@ -62809,7 +62809,7 @@ "event_type#0" ] }, - "6765": { + "6711": { "op": "frame_dig -3", "defined_out": [ "aggregate%extract%1#0", @@ -62829,14 +62829,14 @@ "entry#0 (copy)" ] }, - "6767": { + "6713": { "op": "frame_bury 0" }, - "6769": { + "6715": { "retsub": true, "op": "retsub" }, - "6770": { + "6716": { "block": "_emit_execution_event_after_if_else@3", "stack_in": [ "tmp%0#0", @@ -62860,7 +62860,7 @@ "event_type#0" ] }, - "6772": { + "6718": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -62877,7 +62877,7 @@ "1" ] }, - "6773": { + "6719": { "op": "==", "defined_out": [ "event_type#0", @@ -62893,7 +62893,7 @@ "tmp%1#1" ] }, - "6774": { + "6720": { "op": "bnz _emit_execution_event_if_body@5", "stack_out": [ "tmp%0#0", @@ -62904,7 +62904,7 @@ "event_type#0" ] }, - "6777": { + "6723": { "op": "frame_dig 5", "stack_out": [ "tmp%0#0", @@ -62916,7 +62916,7 @@ "event_type#0" ] }, - "6779": { + "6725": { "op": "pushint 4", "defined_out": [ "4", @@ -62933,7 +62933,7 @@ "4" ] }, - "6781": { + "6727": { "op": "==", "defined_out": [ "event_type#0", @@ -62949,7 +62949,7 @@ "tmp%2#1" ] }, - "6782": { + "6728": { "op": "bz _emit_execution_event_after_if_else@6", "stack_out": [ "tmp%0#0", @@ -62960,7 +62960,7 @@ "event_type#0" ] }, - "6785": { + "6731": { "block": "_emit_execution_event_if_body@5", "stack_in": [ "tmp%0#0", @@ -62984,10 +62984,10 @@ "tmp%3#0" ] }, - "6786": { + "6732": { "op": "b _emit_execution_event_after_inlined_modules.actus_kernel.ActusKernelModule._payoff_sign@7" }, - "6789": { + "6735": { "block": "_emit_execution_event_after_if_else@6", "stack_in": [ "tmp%0#0", @@ -63011,10 +63011,10 @@ "tmp%3#0" ] }, - "6792": { + "6738": { "op": "b _emit_execution_event_after_inlined_modules.actus_kernel.ActusKernelModule._payoff_sign@7" }, - "6795": { + "6741": { "subroutine": "modules.rbac.RbacModule._role_is_active", "params": { "role_map#0": "bytes", @@ -63024,13 +63024,13 @@ "stack_in": [], "op": "proto 2 1" }, - "6798": { + "6744": { "op": "pushbytes \"\"", "stack_out": [ "awst_tmp%0#0" ] }, - "6800": { + "6746": { "op": "frame_dig -2", "defined_out": [ "role_map#0 (copy)" @@ -63040,7 +63040,7 @@ "role_map#0 (copy)" ] }, - "6802": { + "6748": { "op": "frame_dig -1", "defined_out": [ "role_address#0 (copy)", @@ -63052,7 +63052,7 @@ "role_address#0 (copy)" ] }, - "6804": { + "6750": { "op": "concat", "defined_out": [ "box_prefixed_key%0#1" @@ -63062,7 +63062,7 @@ "box_prefixed_key%0#1" ] }, - "6805": { + "6751": { "op": "dup", "defined_out": [ "box_prefixed_key%0#1" @@ -63073,7 +63073,7 @@ "box_prefixed_key%0#1" ] }, - "6806": { + "6752": { "op": "box_len", "defined_out": [ "_%0#0", @@ -63087,7 +63087,7 @@ "maybe_exists%0#0" ] }, - "6807": { + "6753": { "op": "bury 1", "stack_out": [ "awst_tmp%0#0", @@ -63095,14 +63095,14 @@ "maybe_exists%0#0" ] }, - "6809": { + "6755": { "op": "bz _role_is_active_bool_false@4", "stack_out": [ "awst_tmp%0#0", "box_prefixed_key%0#1" ] }, - "6812": { + "6758": { "op": "frame_dig 1", "stack_out": [ "awst_tmp%0#0", @@ -63110,7 +63110,7 @@ "box_prefixed_key%0#1" ] }, - "6814": { + "6760": { "op": "box_get", "defined_out": [ "aggregate%box_get%0#0", @@ -63124,7 +63124,7 @@ "aggregate%box_get%1#0" ] }, - "6815": { + "6761": { "error": "check BoxMap entry exists", "op": "assert // check BoxMap entry exists", "stack_out": [ @@ -63133,7 +63133,7 @@ "aggregate%box_get%0#0" ] }, - "6816": { + "6762": { "op": "intc_0 // 0", "stack_out": [ "awst_tmp%0#0", @@ -63142,7 +63142,7 @@ "0" ] }, - "6817": { + "6763": { "op": "extract_uint64", "defined_out": [ "box_prefixed_key%0#1", @@ -63154,10 +63154,10 @@ "values%0#0" ] }, - "6818": { + "6764": { "op": "global LatestTimestamp" }, - "6820": { + "6766": { "op": "dup", "defined_out": [ "awst_tmp%0#0", @@ -63172,7 +63172,7 @@ "awst_tmp%0#0" ] }, - "6821": { + "6767": { "op": "frame_bury 0", "defined_out": [ "awst_tmp%0#0", @@ -63186,7 +63186,7 @@ "awst_tmp%0#0" ] }, - "6823": { + "6769": { "op": "<=", "defined_out": [ "awst_tmp%0#0", @@ -63199,14 +63199,14 @@ "tmp%1#0" ] }, - "6824": { + "6770": { "op": "bz _role_is_active_bool_false@4", "stack_out": [ "awst_tmp%0#0", "box_prefixed_key%0#1" ] }, - "6827": { + "6773": { "op": "frame_dig 1", "stack_out": [ "awst_tmp%0#0", @@ -63214,7 +63214,7 @@ "box_prefixed_key%0#1" ] }, - "6829": { + "6775": { "op": "box_get", "defined_out": [ "aggregate%box_get%2#0", @@ -63229,7 +63229,7 @@ "aggregate%box_get%3#0" ] }, - "6830": { + "6776": { "error": "check BoxMap entry exists", "op": "assert // check BoxMap entry exists", "stack_out": [ @@ -63238,7 +63238,7 @@ "aggregate%box_get%2#0" ] }, - "6831": { + "6777": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -63253,7 +63253,7 @@ "8" ] }, - "6832": { + "6778": { "op": "extract_uint64", "defined_out": [ "awst_tmp%0#0", @@ -63266,7 +63266,7 @@ "values%1#0" ] }, - "6833": { + "6779": { "op": "frame_dig 0", "stack_out": [ "awst_tmp%0#0", @@ -63275,7 +63275,7 @@ "awst_tmp%0#0" ] }, - "6835": { + "6781": { "op": ">=", "defined_out": [ "awst_tmp%0#0", @@ -63288,14 +63288,14 @@ "tmp%2#0" ] }, - "6836": { + "6782": { "op": "bz _role_is_active_bool_false@4", "stack_out": [ "awst_tmp%0#0", "box_prefixed_key%0#1" ] }, - "6839": { + "6785": { "op": "intc_1 // 1", "defined_out": [ "and_result%0#0", @@ -63308,7 +63308,7 @@ "and_result%0#0" ] }, - "6840": { + "6786": { "block": "_role_is_active_bool_merge@5", "stack_in": [ "awst_tmp%0#0", @@ -63320,11 +63320,11 @@ "and_result%0#0" ] }, - "6842": { + "6788": { "retsub": true, "op": "retsub" }, - "6843": { + "6789": { "block": "_role_is_active_bool_false@4", "stack_in": [ "awst_tmp%0#0", @@ -63340,10 +63340,10 @@ "and_result%0#0" ] }, - "6844": { + "6790": { "op": "b _role_is_active_bool_merge@5" }, - "6847": { + "6793": { "subroutine": "modules.rbac.RbacModule._assert_caller_is_arranger", "params": {}, "block": "_assert_caller_is_arranger", @@ -63356,7 +63356,7 @@ "role_address#0" ] }, - "6849": { + "6795": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -63367,20 +63367,20 @@ "0" ] }, - "6850": { - "op": "bytec 18 // 0x5223417272616e67657223", + "6796": { + "op": "bytec 18 // 0x523a41525223", "defined_out": [ "0", - "0x5223417272616e67657223", + "0x523a41525223", "role_address#0" ], "stack_out": [ "role_address#0", "0", - "0x5223417272616e67657223" + "0x523a41525223" ] }, - "6852": { + "6798": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -63393,7 +63393,7 @@ "maybe_exists%0#0" ] }, - "6853": { + "6799": { "error": "check self.arranger exists", "op": "assert // check self.arranger exists", "stack_out": [ @@ -63401,7 +63401,7 @@ "maybe_value%0#0" ] }, - "6854": { + "6800": { "op": "==", "defined_out": [ "tmp%0#1" @@ -63410,16 +63410,16 @@ "tmp%0#1" ] }, - "6855": { + "6801": { "error": "Not authorized", "op": "assert // Not authorized", "stack_out": [] }, - "6856": { + "6802": { "retsub": true, "op": "retsub" }, - "6857": { + "6803": { "subroutine": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", "params": {}, "block": "_assert_is_not_asset_defaulted", @@ -63432,7 +63432,7 @@ "0" ] }, - "6858": { + "6804": { "op": "bytec 41 // \"asset_defaulted\"", "defined_out": [ "\"asset_defaulted\"", @@ -63443,7 +63443,7 @@ "\"asset_defaulted\"" ] }, - "6860": { + "6806": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -63454,14 +63454,14 @@ "maybe_exists%0#0" ] }, - "6861": { + "6807": { "error": "check self.asset_defaulted exists", "op": "assert // check self.asset_defaulted exists", "stack_out": [ "maybe_value%0#0" ] }, - "6862": { + "6808": { "op": "!", "defined_out": [ "tmp%0#0" @@ -63470,16 +63470,16 @@ "tmp%0#0" ] }, - "6863": { + "6809": { "error": "Defaulted", "op": "assert // Defaulted", "stack_out": [] }, - "6864": { + "6810": { "retsub": true, "op": "retsub" }, - "6865": { + "6811": { "subroutine": "modules.rbac.RbacModule._assert_is_not_asset_suspended", "params": {}, "block": "_assert_is_not_asset_suspended", @@ -63492,7 +63492,7 @@ "0" ] }, - "6866": { + "6812": { "op": "bytec 33 // \"asset_suspended\"", "defined_out": [ "\"asset_suspended\"", @@ -63503,7 +63503,7 @@ "\"asset_suspended\"" ] }, - "6868": { + "6814": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -63514,14 +63514,14 @@ "maybe_exists%0#0" ] }, - "6869": { + "6815": { "error": "check self.asset_suspended exists", "op": "assert // check self.asset_suspended exists", "stack_out": [ "maybe_value%0#0" ] }, - "6870": { + "6816": { "op": "!", "defined_out": [ "tmp%0#0" @@ -63530,16 +63530,16 @@ "tmp%0#0" ] }, - "6871": { + "6817": { "error": "Suspended operations", "op": "assert // Suspended operations", "stack_out": [] }, - "6872": { + "6818": { "retsub": true, "op": "retsub" }, - "6873": { + "6819": { "subroutine": "modules.rbac.RbacModule._assert_valid_role", "params": { "role_id#0": "uint64" @@ -63548,7 +63548,7 @@ "stack_in": [], "op": "proto 1 0" }, - "6876": { + "6822": { "op": "frame_dig -1", "defined_out": [ "role_id#0 (copy)" @@ -63557,7 +63557,7 @@ "role_id#0 (copy)" ] }, - "6878": { + "6824": { "op": "pushint 20", "defined_out": [ "20", @@ -63568,7 +63568,7 @@ "20" ] }, - "6880": { + "6826": { "op": "==", "defined_out": [ "tmp%0#0" @@ -63577,17 +63577,17 @@ "tmp%0#0" ] }, - "6881": { + "6827": { "op": "bnz _assert_valid_role_bool_true@7", "stack_out": [] }, - "6884": { + "6830": { "op": "frame_dig -1", "stack_out": [ "role_id#0 (copy)" ] }, - "6886": { + "6832": { "op": "pushint 25", "defined_out": [ "25", @@ -63598,7 +63598,7 @@ "25" ] }, - "6888": { + "6834": { "op": "==", "defined_out": [ "tmp%1#0" @@ -63607,17 +63607,17 @@ "tmp%1#0" ] }, - "6889": { + "6835": { "op": "bnz _assert_valid_role_bool_true@7", "stack_out": [] }, - "6892": { + "6838": { "op": "frame_dig -1", "stack_out": [ "role_id#0 (copy)" ] }, - "6894": { + "6840": { "op": "pushint 40", "defined_out": [ "40", @@ -63628,7 +63628,7 @@ "40" ] }, - "6896": { + "6842": { "op": "==", "defined_out": [ "tmp%2#0" @@ -63637,17 +63637,17 @@ "tmp%2#0" ] }, - "6897": { + "6843": { "op": "bnz _assert_valid_role_bool_true@7", "stack_out": [] }, - "6900": { + "6846": { "op": "frame_dig -1", "stack_out": [ "role_id#0 (copy)" ] }, - "6902": { + "6848": { "op": "pushint 50", "defined_out": [ "50", @@ -63658,7 +63658,7 @@ "50" ] }, - "6904": { + "6850": { "op": "==", "defined_out": [ "tmp%3#0" @@ -63667,17 +63667,17 @@ "tmp%3#0" ] }, - "6905": { + "6851": { "op": "bnz _assert_valid_role_bool_true@7", "stack_out": [] }, - "6908": { + "6854": { "op": "frame_dig -1", "stack_out": [ "role_id#0 (copy)" ] }, - "6910": { + "6856": { "op": "pushint 60", "defined_out": [ "60", @@ -63688,7 +63688,7 @@ "60" ] }, - "6912": { + "6858": { "op": "==", "defined_out": [ "tmp%4#0" @@ -63697,17 +63697,17 @@ "tmp%4#0" ] }, - "6913": { + "6859": { "op": "bnz _assert_valid_role_bool_true@7", "stack_out": [] }, - "6916": { + "6862": { "op": "frame_dig -1", "stack_out": [ "role_id#0 (copy)" ] }, - "6918": { + "6864": { "op": "pushint 70", "defined_out": [ "70", @@ -63718,7 +63718,7 @@ "70" ] }, - "6920": { + "6866": { "op": "==", "defined_out": [ "tmp%5#0" @@ -63727,17 +63727,17 @@ "tmp%5#0" ] }, - "6921": { + "6867": { "op": "bnz _assert_valid_role_bool_true@7", "stack_out": [] }, - "6924": { + "6870": { "op": "frame_dig -1", "stack_out": [ "role_id#0 (copy)" ] }, - "6926": { + "6872": { "op": "pushint 80", "defined_out": [ "80", @@ -63748,7 +63748,7 @@ "80" ] }, - "6928": { + "6874": { "op": "==", "defined_out": [ "tmp%6#0" @@ -63757,11 +63757,11 @@ "tmp%6#0" ] }, - "6929": { + "6875": { "op": "bz _assert_valid_role_bool_false@8", "stack_out": [] }, - "6932": { + "6878": { "block": "_assert_valid_role_bool_true@7", "stack_in": [], "op": "intc_1 // 1", @@ -63772,7 +63772,7 @@ "or_result%0#0" ] }, - "6933": { + "6879": { "error": "Invalid role identifier", "block": "_assert_valid_role_bool_merge@9", "stack_in": [ @@ -63782,11 +63782,11 @@ "defined_out": [], "stack_out": [] }, - "6934": { + "6880": { "retsub": true, "op": "retsub" }, - "6935": { + "6881": { "block": "_assert_valid_role_bool_false@8", "stack_in": [], "op": "intc_0 // 0", @@ -63797,7 +63797,7 @@ "or_result%0#0" ] }, - "6936": { + "6882": { "op": "b _assert_valid_role_bool_merge@9" } } diff --git a/smart_contracts/artifacts/d_asa/DASA.approval.teal b/smart_contracts/artifacts/d_asa/DASA.approval.teal index 2657603e..d5e016a1 100644 --- a/smart_contracts/artifacts/d_asa/DASA.approval.teal +++ b/smart_contracts/artifacts/d_asa/DASA.approval.teal @@ -4,18 +4,18 @@ // algopy.arc4.ARC4Contract.approval_program() -> uint64: main: intcblock 0 1 8 32 1500 - bytecblock 0x151f7c75 "status" "event_cursor" "schedule_entry_count" "outstanding_principal" "fixed_point_scale" "accrued_interest" "interest_calculation_base" 0x52234163636f756e7423 "nominal_interest_rate" "contract_type" "reserved_units_total" "reserved_principal" "total_units" "next_principal_redemption" "reserved_interest" "cumulative_interest_index" "cumulative_principal_index" 0x5223417272616e67657223 "settlement_asset_id" "initial_exchange_amount" 0x5223417574686f7269747923 0x52235072696d6172794465616c657223 0x52234163636f756e744d616e6167657223 0x5323 0x52234f6273657276657223 0x52234f704461656d6f6e23 "initial_exchange_date" "transfer_opening_date" "transfer_closure_date" "rate_reset_floor" "rate_reset_cap" 0x52235472757374656523 "asset_suspended" "dynamic_principal_redemption" "rate_reset_spread" "rate_reset_multiplier" "rate_reset_next" "has_rate_reset_floor" "has_rate_reset_cap" 0x00 "asset_defaulted" "prospectus_hash" "prospectus_url" "denomination_asset_id" "maturity_date" "day_count_convention" 0x068101 0x0000 + bytecblock 0x151f7c75 "status" "event_cursor" "schedule_entry_count" "outstanding_principal" "fixed_point_scale" "accrued_interest" "interest_calculation_base" 0x4123 "nominal_interest_rate" "contract_type" "reserved_units_total" "reserved_principal" "total_units" "next_principal_redemption" "reserved_interest" "cumulative_interest_index" "cumulative_principal_index" 0x523a41525223 "settlement_asset_id" "initial_exchange_amount" 0x523a41555423 0x523a50594423 0x523a4d4e4723 0x5323 0x523a4d4f4323 0x523a4f504423 "initial_exchange_date" "transfer_opening_date" "transfer_closure_date" "rate_reset_floor" "rate_reset_cap" 0x523a54525323 "asset_suspended" "dynamic_principal_redemption" "rate_reset_spread" "rate_reset_multiplier" "rate_reset_next" "has_rate_reset_floor" "has_rate_reset_cap" 0x00 "asset_defaulted" "prospectus_hash" "prospectus_url" "denomination_asset_id" "maturity_date" "day_count_convention" 0x068101 0x0000 txn ApplicationID bnz main_after_if_else@2 // modules/rbac.py:28-29 // # RBAC Roles // self.arranger = GlobalState(Account(), key=cst.PREFIX_ID_ARRANGER) - bytec 18 // 0x5223417272616e67657223 + bytec 18 // 0x523a41525223 global ZeroAddress app_global_put // modules/rbac.py:30 // self.op_daemon = GlobalState(Account(), key=cst.PREFIX_ID_OP_DAEMON) - bytec 26 // 0x52234f704461656d6f6e23 + bytec 26 // 0x523a4f504423 global ZeroAddress app_global_put // modules/rbac.py:47-48 @@ -367,13 +367,13 @@ fund_due_cashflows: app_global_get_ex assert // check self.status exists assert // D-ASA not configured - // modules/payment_agent.py:51 + // modules/payment_agent.py:68 // self._assert_caller_is_arranger() callsub _assert_caller_is_arranger - // modules/payment_agent.py:52 + // modules/payment_agent.py:69 // self._assert_is_not_asset_defaulted() callsub _assert_is_not_asset_defaulted - // modules/payment_agent.py:53 + // modules/payment_agent.py:70 // self._assert_is_not_asset_suspended() callsub _assert_is_not_asset_suspended // modules/actus_kernel.py:135 @@ -388,30 +388,30 @@ fund_due_cashflows: // assert not self._status_is_pending_ied(), err.PENDING_IED ! assert // IED not yet executed - // modules/payment_agent.py:55 + // modules/payment_agent.py:72 // if self._is_dynamic_annuity(): callsub _is_dynamic_annuity bz fund_due_cashflows_after_if_else@3 - // modules/payment_agent.py:59-60 + // modules/payment_agent.py:76-77 // + max_event_count // * UInt64(cst.OP_UP_FUND_DUE_CASHFLOWS_PER_EVENT_BUDGET) dup - // modules/payment_agent.py:60 + // modules/payment_agent.py:77 // * UInt64(cst.OP_UP_FUND_DUE_CASHFLOWS_PER_EVENT_BUDGET) pushint 100 - // modules/payment_agent.py:59-60 + // modules/payment_agent.py:76-77 // + max_event_count // * UInt64(cst.OP_UP_FUND_DUE_CASHFLOWS_PER_EVENT_BUDGET) * - // modules/payment_agent.py:58 + // modules/payment_agent.py:75 // UInt64(cst.OP_UP_FUND_DUE_CASHFLOWS_BASE_BUDGET) intc 4 // 1500 - // modules/payment_agent.py:58-60 + // modules/payment_agent.py:75-77 // UInt64(cst.OP_UP_FUND_DUE_CASHFLOWS_BASE_BUDGET) // + max_event_count // * UInt64(cst.OP_UP_FUND_DUE_CASHFLOWS_PER_EVENT_BUDGET) + - // modules/payment_agent.py:56-62 + // modules/payment_agent.py:73-79 // ensure_budget( // required_budget=( // UInt64(cst.OP_UP_FUND_DUE_CASHFLOWS_BASE_BUDGET) @@ -423,30 +423,30 @@ fund_due_cashflows: callsub ensure_budget fund_due_cashflows_after_if_else@3: - // modules/payment_agent.py:64 + // modules/payment_agent.py:81 // processed_events = UInt64(0) intc_0 // 0 bury 5 - // modules/payment_agent.py:65 + // modules/payment_agent.py:82 // funded_interest = UInt64(0) intc_0 // 0 bury 14 - // modules/payment_agent.py:66 + // modules/payment_agent.py:83 // funded_principal = UInt64(0) intc_0 // 0 bury 13 fund_due_cashflows_while_top@4: - // modules/payment_agent.py:69 + // modules/payment_agent.py:86 // processed_events < max_event_count dig 4 dig 1 < - // modules/payment_agent.py:69-70 + // modules/payment_agent.py:86-87 // processed_events < max_event_count // and self.event_cursor < self.schedule_entry_count bz fund_due_cashflows_after_while@11 - // modules/payment_agent.py:70 + // modules/payment_agent.py:87 // and self.event_cursor < self.schedule_entry_count intc_0 // 0 bytec_2 // "event_cursor" @@ -457,11 +457,11 @@ fund_due_cashflows_while_top@4: app_global_get_ex assert // check self.schedule_entry_count exists < - // modules/payment_agent.py:69-70 + // modules/payment_agent.py:86-87 // processed_events < max_event_count // and self.event_cursor < self.schedule_entry_count bz fund_due_cashflows_after_while@11 - // modules/payment_agent.py:72 + // modules/payment_agent.py:89 // entry = self._get_schedule_entry(self.event_cursor) intc_0 // 0 bytec_2 // "event_cursor" @@ -470,7 +470,7 @@ fund_due_cashflows_while_top@4: callsub _get_schedule_entry dup bury 17 - // modules/payment_agent.py:73 + // modules/payment_agent.py:90 // if entry.scheduled_time > Global.latest_timestamp: pushint 9 extract_uint64 @@ -479,7 +479,7 @@ fund_due_cashflows_while_top@4: global LatestTimestamp > bnz fund_due_cashflows_after_while@11 - // modules/payment_agent.py:75 + // modules/payment_agent.py:92 // if not self._event_is_cash(entry.event_type.as_uint64()): dig 15 intc_2 // 8 @@ -528,7 +528,7 @@ fund_due_cashflows_bool_true@52: intc_1 // 1 fund_due_cashflows_bool_merge@54: - // modules/payment_agent.py:75 + // modules/payment_agent.py:92 // if not self._event_is_cash(entry.event_type.as_uint64()): bz fund_due_cashflows_after_while@11 // modules/actus_kernel.py:548 @@ -823,19 +823,19 @@ fund_due_cashflows_after_if_else@47: dup callsub _emit_execution_event pop - // modules/payment_agent.py:79 + // modules/payment_agent.py:96 // funded_interest += interest_amount dig 13 dig 12 + bury 14 - // modules/payment_agent.py:80 + // modules/payment_agent.py:97 // funded_principal += principal_amount dig 12 dig 7 + bury 13 - // modules/payment_agent.py:81 + // modules/payment_agent.py:98 // processed_events += UInt64(1) dig 4 intc_1 // 1 @@ -1057,12 +1057,12 @@ fund_due_cashflows_after_if_else@15: b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_interest_amount@16 fund_due_cashflows_after_while@11: - // modules/payment_agent.py:83 + // modules/payment_agent.py:100 // assert processed_events > UInt64(0), err.NO_DUE_CASHFLOW dig 4 dup assert // No due cashflow to pay - // modules/payment_agent.py:87 + // modules/payment_agent.py:104 // total_funded=funded_interest + funded_principal, dig 14 dup @@ -1070,10 +1070,10 @@ fund_due_cashflows_after_while@11: dup cover 3 + - // modules/payment_agent.py:89 + // modules/payment_agent.py:106 // timestamp=Global.latest_timestamp, global LatestTimestamp - // modules/payment_agent.py:84-90 + // modules/payment_agent.py:101-107 // return typ.CashFundingResult( // funded_interest=funded_interest, // funded_principal=funded_principal, @@ -1113,7 +1113,7 @@ fund_due_cashflows_bool_false@53: claim_due_cashflows: pushbytes "" dupn 2 - // modules/payment_agent.py:92 + // modules/payment_agent.py:109 // @arc4.abimethod txna ApplicationArgs 1 dupn 2 @@ -1142,7 +1142,7 @@ claim_due_cashflows: assert // D-ASA not configured // modules/accounting.py:24 // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec 8 // 0x52234163636f756e7423 + bytec 8 // 0x4123 swap concat dup @@ -1152,7 +1152,7 @@ claim_due_cashflows: // modules/payment_agent.py:15 // if self.op_daemon.value != Global.zero_address: intc_0 // 0 - bytec 26 // 0x52234f704461656d6f6e23 + bytec 26 // 0x523a4f504423 app_global_get_ex assert // check self.op_daemon exists global ZeroAddress @@ -1162,7 +1162,7 @@ claim_due_cashflows: // Txn.sender == self.op_daemon.value txn Sender intc_0 // 0 - bytec 26 // 0x52234f704461656d6f6e23 + bytec 26 // 0x523a4f504423 app_global_get_ex assert // check self.op_daemon exists == @@ -1208,10 +1208,10 @@ claim_due_cashflows_bool_merge@16: assert // Not authorized claim_due_cashflows_after_if_else@17: - // modules/payment_agent.py:103 + // modules/payment_agent.py:139 // self._assert_is_not_asset_defaulted() callsub _assert_is_not_asset_defaulted - // modules/payment_agent.py:104 + // modules/payment_agent.py:140 // self._assert_is_not_asset_suspended() callsub _assert_is_not_asset_suspended // modules/actus_kernel.py:135 @@ -1226,12 +1226,12 @@ claim_due_cashflows_after_if_else@17: // assert not self._status_is_pending_ied(), err.PENDING_IED ! assert // IED not yet executed - // modules/payment_agent.py:107 + // modules/payment_agent.py:143 // self._ensure_units_activated(holding_address) dig 2 dup callsub _ensure_units_activated - // modules/payment_agent.py:108 + // modules/payment_agent.py:144 // self._settle_position(holding_address) callsub _settle_position popn 2 @@ -1260,7 +1260,7 @@ claim_due_cashflows_after_if_else@17: + dup bury 6 - // modules/payment_agent.py:110 + // modules/payment_agent.py:146 // assert total_amount > UInt64(0), err.NO_DUE_CASHFLOW assert // No due cashflow to pay // modules/payment_agent.py:25 @@ -1295,7 +1295,7 @@ claim_due_cashflows_after_if_else@17: intc_1 // 1 claim_due_cashflows_bool_merge@25: - // modules/payment_agent.py:115 + // modules/payment_agent.py:151 // if self._is_payment_executable(holding_address): bz claim_due_cashflows_after_if_else@3 // modules/payment_agent.py:34 @@ -1322,7 +1322,7 @@ claim_due_cashflows_bool_merge@25: // >= payment_amount // ), err.NOT_ENOUGH_FUNDS assert // Not enough funds for the payment - // modules/payment_agent.py:117 + // modules/payment_agent.py:153 // self._pay(self.account[holding_address].payment_address, total_amount) dig 2 dup @@ -1435,7 +1435,7 @@ claim_due_cashflows_bool_merge@25: app_global_put claim_due_cashflows_after_if_else@3: - // modules/payment_agent.py:123 + // modules/payment_agent.py:159 // total_amount=interest_amount + principal_amount, dig 5 dup @@ -1443,10 +1443,10 @@ claim_due_cashflows_after_if_else@3: dup cover 3 + - // modules/payment_agent.py:124 + // modules/payment_agent.py:160 // timestamp=Global.latest_timestamp, global LatestTimestamp - // modules/payment_agent.py:120-126 + // modules/payment_agent.py:156-162 // return typ.CashClaimResult( // interest_amount=interest_amount, // principal_amount=principal_amount, @@ -1477,7 +1477,7 @@ claim_due_cashflows_after_if_else@3: concat swap concat - // modules/payment_agent.py:92 + // modules/payment_agent.py:109 // @arc4.abimethod bytec_0 // 0x151f7c75 swap @@ -1513,25 +1513,25 @@ transfer_set_schedule: == assert // invalid number of bytes for arc4.uint64 btoi - // modules/transfer_agent.py:26 + // modules/transfer_agent.py:40 // self._assert_caller_is_arranger() callsub _assert_caller_is_arranger - // modules/transfer_agent.py:27 + // modules/transfer_agent.py:41 // assert open_date < closure_date, err.INVALID_SORTING dup2 < assert // Time events must be sorted in strictly ascending order - // modules/transfer_agent.py:29 + // modules/transfer_agent.py:43 // self.transfer_opening_date = open_date bytec 28 // "transfer_opening_date" uncover 2 app_global_put - // modules/transfer_agent.py:30 + // modules/transfer_agent.py:44 // self.transfer_closure_date = closure_date bytec 29 // "transfer_closure_date" swap app_global_put - // modules/transfer_agent.py:31 + // modules/transfer_agent.py:45 // return Global.latest_timestamp global LatestTimestamp // modules/transfer_agent.py:22 @@ -1547,7 +1547,7 @@ transfer_set_schedule: // modules.transfer_agent.TransferAgent.primary_distribution[routing]() -> void: primary_distribution: - // modules/transfer_agent.py:33 + // modules/transfer_agent.py:47 // @arc4.abimethod txna ApplicationArgs 1 dup @@ -1573,14 +1573,14 @@ primary_distribution: assert // D-ASA not configured // modules/rbac.py:71 // assert self._role_is_active(self.primary_dealer, Txn.sender), err.UNAUTHORIZED - bytec 22 // 0x52235072696d6172794465616c657223 + bytec 22 // 0x523a50594423 txn Sender callsub _role_is_active assert // Not authorized - // modules/transfer_agent.py:43 + // modules/transfer_agent.py:76 // self._assert_is_not_asset_defaulted() callsub _assert_is_not_asset_defaulted - // modules/transfer_agent.py:44 + // modules/transfer_agent.py:77 // self._assert_is_not_asset_suspended() callsub _assert_is_not_asset_suspended // modules/actus_kernel.py:135 @@ -1591,12 +1591,12 @@ primary_distribution: assert // check self.status exists pushint 50 == - // modules/transfer_agent.py:45 + // modules/transfer_agent.py:78 // assert self._status_is_pending_ied(), err.PRIMARY_DISTRIBUTION_CLOSED assert // Primary distribution is closed // modules/accounting.py:24 // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec 8 // 0x52234163636f756e7423 + bytec 8 // 0x4123 dig 2 concat dup @@ -1604,15 +1604,15 @@ primary_distribution: box_len bury 1 assert // Invalid account holding address - // modules/transfer_agent.py:47 + // modules/transfer_agent.py:80 // self._assert_is_not_account_suspended(holding_address) swap callsub _assert_is_not_account_suspended - // modules/transfer_agent.py:48 + // modules/transfer_agent.py:81 // assert units > UInt64(0), err.ZERO_UNITS dup assert // Can not distribute zero units - // modules/transfer_agent.py:50 + // modules/transfer_agent.py:83 // self.reserved_units_total + units <= self.total_units intc_0 // 0 bytec 11 // "reserved_units_total" @@ -1624,19 +1624,19 @@ primary_distribution: app_global_get_ex assert // check self.total_units exists <= - // modules/transfer_agent.py:49-51 + // modules/transfer_agent.py:82-84 // assert ( // self.reserved_units_total + units <= self.total_units // ), err.OVER_DISTRIBUTION assert // Insufficient remaining D-ASA units - // modules/transfer_agent.py:52 + // modules/transfer_agent.py:85 // if self.initial_exchange_date: intc_0 // 0 bytec 27 // "initial_exchange_date" app_global_get_ex assert // check self.initial_exchange_date exists bz primary_distribution_after_if_else@3 - // modules/transfer_agent.py:54 + // modules/transfer_agent.py:87 // Global.latest_timestamp <= self.initial_exchange_date global LatestTimestamp intc_0 // 0 @@ -1644,7 +1644,7 @@ primary_distribution: app_global_get_ex assert // check self.initial_exchange_date exists <= - // modules/transfer_agent.py:53-55 + // modules/transfer_agent.py:86-88 // assert ( // Global.latest_timestamp <= self.initial_exchange_date // ), err.PRIMARY_DISTRIBUTION_CLOSED @@ -1666,7 +1666,7 @@ primary_distribution_after_if_else@3: pushint 40 swap box_replace - // modules/transfer_agent.py:58 + // modules/transfer_agent.py:91 // self.reserved_units_total += units intc_0 // 0 bytec 11 // "reserved_units_total" @@ -1676,7 +1676,7 @@ primary_distribution_after_if_else@3: bytec 11 // "reserved_units_total" dig 1 app_global_put - // modules/transfer_agent.py:59 + // modules/transfer_agent.py:92 // return self.total_units - self.reserved_units_total intc_0 // 0 bytec 13 // "total_units" @@ -1684,7 +1684,7 @@ primary_distribution_after_if_else@3: assert // check self.total_units exists swap - - // modules/transfer_agent.py:33 + // modules/transfer_agent.py:47 // @arc4.abimethod itob bytec_0 // 0x151f7c75 @@ -1699,7 +1699,7 @@ primary_distribution_after_if_else@3: transfer: intc_0 // 0 dup - // modules/transfer_agent.py:61 + // modules/transfer_agent.py:94 // @arc4.abimethod txna ApplicationArgs 1 dup @@ -1727,10 +1727,10 @@ transfer: app_global_get_ex assert // check self.status exists assert // D-ASA not configured - // modules/transfer_agent.py:75 + // modules/transfer_agent.py:130 // self._assert_is_not_asset_defaulted() callsub _assert_is_not_asset_defaulted - // modules/transfer_agent.py:76 + // modules/transfer_agent.py:131 // self._assert_is_not_asset_suspended() callsub _assert_is_not_asset_suspended // modules/actus_kernel.py:135 @@ -1789,7 +1789,7 @@ transfer_after_if_else@3: assert // Transfer is closed transfer_after_if_else@5: - // modules/transfer_agent.py:80 + // modules/transfer_agent.py:135 // assert Txn.sender == sender_holding_address, err.UNAUTHORIZED txn Sender dig 4 @@ -1799,7 +1799,7 @@ transfer_after_if_else@5: assert // Not authorized // modules/accounting.py:24 // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec 8 // 0x52234163636f756e7423 + bytec 8 // 0x4123 dig 1 concat dup @@ -1808,7 +1808,7 @@ transfer_after_if_else@5: box_len bury 1 assert // Invalid account holding address - bytec 8 // 0x52234163636f756e7423 + bytec 8 // 0x4123 dig 5 dup cover 2 @@ -1818,25 +1818,25 @@ transfer_after_if_else@5: box_len bury 1 assert // Invalid account holding address - // modules/transfer_agent.py:83 + // modules/transfer_agent.py:138 // self._assert_is_not_account_suspended(sender_holding_address) dig 2 callsub _assert_is_not_account_suspended - // modules/transfer_agent.py:84 + // modules/transfer_agent.py:139 // self._assert_is_not_account_suspended(receiver_holding_address) dup callsub _assert_is_not_account_suspended - // modules/transfer_agent.py:85 + // modules/transfer_agent.py:140 // assert sender_holding_address != receiver_holding_address, err.SELF_TRANSFER uncover 2 != assert // Sender and receiver must be different - // modules/transfer_agent.py:86 + // modules/transfer_agent.py:141 // assert units > UInt64(0), err.NULL_TRANSFER dig 1 dup assert // Transfer units must be greater than zero - // modules/transfer_agent.py:87 + // modules/transfer_agent.py:142 // assert units <= self.account[sender_holding_address].units, err.OVER_TRANSFER swap box_get @@ -1877,22 +1877,22 @@ transfer_after_if_else@5: assert // ACTUS event not yet executed transfer_after_inlined_modules.actus_kernel.ActusKernelModule._assert_no_due_event_pending@10: - // modules/transfer_agent.py:90 + // modules/transfer_agent.py:145 // self._ensure_units_activated(sender_holding_address) dig 3 dup callsub _ensure_units_activated - // modules/transfer_agent.py:91 + // modules/transfer_agent.py:146 // self._ensure_units_activated(receiver_holding_address) dig 3 dup cover 2 callsub _ensure_units_activated - // modules/transfer_agent.py:92 + // modules/transfer_agent.py:147 // self._settle_position(sender_holding_address) callsub _settle_position popn 2 - // modules/transfer_agent.py:93 + // modules/transfer_agent.py:148 // self._settle_position(receiver_holding_address) callsub _settle_position popn 2 @@ -1933,7 +1933,7 @@ transfer_after_inlined_modules.actus_kernel.ActusKernelModule._assert_no_due_eve intc_3 // 32 swap box_replace - // modules/transfer_agent.py:61 + // modules/transfer_agent.py:94 // @arc4.abimethod bytec_0 // 0x151f7c75 dig 2 @@ -1963,13 +1963,13 @@ account_suspension: getbit // modules/rbac.py:77 // assert self._role_is_active(self.authority, Txn.sender), err.UNAUTHORIZED - bytec 21 // 0x5223417574686f7269747923 + bytec 21 // 0x523a41555423 txn Sender callsub _role_is_active assert // Not authorized // modules/accounting.py:24 // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec 8 // 0x52234163636f756e7423 + bytec 8 // 0x4123 uncover 2 concat dup @@ -2020,7 +2020,7 @@ account_open: assert // invalid number of bytes for arc4.static_array // modules/rbac.py:68 // assert self._role_is_active(self.account_manager, Txn.sender), err.UNAUTHORIZED - bytec 23 // 0x52234163636f756e744d616e6167657223 + bytec 23 // 0x523a4d4e4723 txn Sender callsub _role_is_active assert // Not authorized @@ -2044,7 +2044,7 @@ account_open: callsub _assert_is_not_asset_suspended // modules/accounting.py:213 // assert holding_address not in self.account, err.INVALID_HOLDING_ADDRESS - bytec 8 // 0x52234163636f756e7423 + bytec 8 // 0x4123 uncover 2 concat dup @@ -2120,7 +2120,7 @@ account_update_payment_address: assert // invalid number of bytes for arc4.static_array // modules/accounting.py:24 // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec 8 // 0x52234163636f756e7423 + bytec 8 // 0x4123 dig 2 concat dup @@ -2170,7 +2170,7 @@ account_get_position: assert // invalid number of bytes for arc4.static_array // modules/accounting.py:24 // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec 8 // 0x52234163636f756e7423 + bytec 8 // 0x4123 swap concat dup @@ -2201,12 +2201,12 @@ contract_create: intc_3 // 32 == assert // invalid number of bytes for arc4.static_array - // modules/actus_kernel.py:1030 + // modules/actus_kernel.py:1033 // self.arranger.value = arranger - bytec 18 // 0x5223417272616e67657223 + bytec 18 // 0x523a41525223 swap app_global_put - // modules/actus_kernel.py:1031 + // modules/actus_kernel.py:1034 // return Global.latest_timestamp global LatestTimestamp // modules/actus_kernel.py:1019 @@ -2224,7 +2224,7 @@ contract_create: contract_config: pushbytes "" dup - // modules/actus_kernel.py:1033 + // modules/actus_kernel.py:1036 // @arc4.abimethod txna ApplicationArgs 1 dupn 2 @@ -2263,10 +2263,10 @@ contract_config: + == assert // invalid number of bytes for smart_contracts.abi_types.Prospectus - // modules/actus_kernel.py:1062 + // modules/actus_kernel.py:1066 // self._assert_caller_is_arranger() callsub _assert_caller_is_arranger - // modules/actus_kernel.py:1064-1065 + // modules/actus_kernel.py:1068-1069 // # Configure Contract // self.contract_type = terms.contract_type.as_uint64() intc_0 // 0 @@ -2368,7 +2368,7 @@ contract_config_bool_merge@9: // modules/actus_kernel.py:229 // assert self._is_supported_contract_type(contract_type), err.INVALID_ACTUS_CONFIG assert // Invalid ACTUS configuration - // modules/actus_kernel.py:1067 + // modules/actus_kernel.py:1071 // self._store_contract_config(self.contract_type, terms, initial_state) intc_0 // 0 bytec 10 // "contract_type" @@ -2792,7 +2792,7 @@ contract_config_after_if_else@20: // assert terms.initial_exchange_date < terms.maturity_date, err.INVALID_IED < assert // IED must be set in the future - // modules/actus_kernel.py:1069-1070 + // modules/actus_kernel.py:1073-1074 // # Notarize prospectus (optional) // self.prospectus_hash = prospectus.hash.bytes dig 2 @@ -2800,17 +2800,17 @@ contract_config_after_if_else@20: bytec 42 // "prospectus_hash" swap app_global_put - // modules/actus_kernel.py:1071 + // modules/actus_kernel.py:1075 // self.prospectus_url = prospectus.url dig 1 extract 2 0 bytec 43 // "prospectus_url" swap app_global_put - // modules/actus_kernel.py:1072 + // modules/actus_kernel.py:1076 // return Global.latest_timestamp global LatestTimestamp - // modules/actus_kernel.py:1033 + // modules/actus_kernel.py:1036 // @arc4.abimethod itob bytec_0 // 0x151f7c75 @@ -2834,7 +2834,7 @@ contract_schedule: intc_0 // 0 pushbytes "" dupn 2 - // modules/actus_kernel.py:1074 + // modules/actus_kernel.py:1078 // @arc4.abimethod txna ApplicationArgs 1 dup @@ -2870,10 +2870,10 @@ contract_schedule: len == assert // invalid number of bytes for arc4.dynamic_array - // modules/actus_kernel.py:1089 + // modules/actus_kernel.py:1110 // self._assert_caller_is_arranger() callsub _assert_caller_is_arranger - // modules/actus_kernel.py:1092 + // modules/actus_kernel.py:1113 // contract_type=self.contract_type, intc_0 // 0 bytec 10 // "contract_type" @@ -3145,10 +3145,10 @@ contract_schedule_after_while@11: app_global_put contract_schedule_after_if_else@13: - // modules/actus_kernel.py:1097 + // modules/actus_kernel.py:1118 // return Global.latest_timestamp global LatestTimestamp - // modules/actus_kernel.py:1074 + // modules/actus_kernel.py:1078 // @arc4.abimethod itob bytec_0 // 0x151f7c75 @@ -3168,16 +3168,16 @@ contract_execute_ied: app_global_get_ex assert // check self.status exists assert // D-ASA not configured - // modules/actus_kernel.py:1107 + // modules/actus_kernel.py:1143 // self._assert_caller_is_arranger() callsub _assert_caller_is_arranger - // modules/actus_kernel.py:1108 + // modules/actus_kernel.py:1144 // self._assert_is_not_asset_defaulted() callsub _assert_is_not_asset_defaulted - // modules/actus_kernel.py:1109 + // modules/actus_kernel.py:1145 // self._assert_is_not_asset_suspended() callsub _assert_is_not_asset_suspended - // modules/actus_kernel.py:1111 + // modules/actus_kernel.py:1147 // assert self.event_cursor < self.schedule_entry_count, err.INVALID_EVENT_CURSOR intc_0 // 0 bytec_2 // "event_cursor" @@ -3190,10 +3190,10 @@ contract_execute_ied: dig 1 > assert // Invalid event cursor - // modules/actus_kernel.py:1112 + // modules/actus_kernel.py:1148 // entry = self._get_schedule_entry(self.event_cursor) callsub _get_schedule_entry - // modules/actus_kernel.py:1113 + // modules/actus_kernel.py:1149 // assert entry.event_type == arc4.UInt8(enums.EVT_IED), err.INVALID_EVENT_TYPE dup extract 8 1 @@ -3201,39 +3201,39 @@ contract_execute_ied: pushbytes 0x01 b== assert // Invalid event type - // modules/actus_kernel.py:1117 + // modules/actus_kernel.py:1153 // event_id=entry.event_id, dig 1 extract 0 8 - // modules/actus_kernel.py:1119 + // modules/actus_kernel.py:1155 // scheduled_time=entry.scheduled_time, dig 2 extract 9 8 - // modules/actus_kernel.py:1120 + // modules/actus_kernel.py:1156 // accrual_factor=entry.accrual_factor, dig 3 extract 17 8 - // modules/actus_kernel.py:1121 + // modules/actus_kernel.py:1157 // redemption_accrual_factor=entry.redemption_accrual_factor, dig 4 extract 25 8 - // modules/actus_kernel.py:1123 + // modules/actus_kernel.py:1159 // next_nominal_interest_rate=entry.next_nominal_interest_rate, dig 5 extract 33 8 - // modules/actus_kernel.py:1124 + // modules/actus_kernel.py:1160 // next_principal_redemption=entry.next_principal_redemption, dig 6 extract 41 8 - // modules/actus_kernel.py:1125 + // modules/actus_kernel.py:1161 // next_outstanding_principal=entry.next_outstanding_principal, dig 7 extract 49 8 - // modules/actus_kernel.py:1126 + // modules/actus_kernel.py:1162 // flags=entry.flags, dig 8 extract 57 8 - // modules/actus_kernel.py:1116-1127 + // modules/actus_kernel.py:1152-1163 // typ.ObservedEventRequest( // event_id=entry.event_id, // event_type=entry.event_type, @@ -3255,10 +3255,10 @@ contract_execute_ied: concat uncover 5 concat - // modules/actus_kernel.py:1122 + // modules/actus_kernel.py:1158 // observed_rate=UInt64(0), intc_0 // 0 - // modules/actus_kernel.py:1116-1127 + // modules/actus_kernel.py:1152-1163 // typ.ObservedEventRequest( // event_id=entry.event_id, // event_type=entry.event_type, @@ -3281,7 +3281,7 @@ contract_execute_ied: concat swap concat - // modules/actus_kernel.py:1114-1128 + // modules/actus_kernel.py:1150-1164 // self._apply_non_cash_schedule_entry( // entry, // typ.ObservedEventRequest( @@ -3299,10 +3299,10 @@ contract_execute_ied: // ) callsub _apply_non_cash_schedule_entry popn 2 - // modules/actus_kernel.py:1129 + // modules/actus_kernel.py:1165 // return Global.latest_timestamp global LatestTimestamp - // modules/actus_kernel.py:1099 + // modules/actus_kernel.py:1120 // @arc4.abimethod itob bytec_0 // 0x151f7c75 @@ -3319,7 +3319,7 @@ apply_non_cash_event: dupn 4 pushbytes "" dup - // modules/actus_kernel.py:1131 + // modules/actus_kernel.py:1167 // @arc4.abimethod txna ApplicationArgs 1 dup @@ -3341,13 +3341,13 @@ apply_non_cash_event: app_global_get_ex assert // check self.status exists assert // D-ASA not configured - // modules/actus_kernel.py:1145 + // modules/actus_kernel.py:1204 // self._assert_is_not_asset_defaulted() callsub _assert_is_not_asset_defaulted - // modules/actus_kernel.py:1146 + // modules/actus_kernel.py:1205 // self._assert_is_not_asset_suspended() callsub _assert_is_not_asset_suspended - // modules/actus_kernel.py:1148 + // modules/actus_kernel.py:1207 // if payload.flags & UInt64(enums.FLAG_OBSERVED_EVENT): pushint 65 extract_uint64 @@ -3363,10 +3363,10 @@ apply_non_cash_event: assert // check self.contract_type exists pushint 5 == - // modules/actus_kernel.py:1149 + // modules/actus_kernel.py:1208 // assert self._supports_observed_events(), err.OBSERVED_EVENT_REQUIRED assert // Observed event required to execute this action - // modules/actus_kernel.py:1150 + // modules/actus_kernel.py:1209 // self._assert_caller_is_arranger() callsub _assert_caller_is_arranger // modules/actus_kernel.py:233 @@ -3551,7 +3551,7 @@ apply_non_cash_event_after_if_else@27: app_global_put apply_non_cash_event_after_if_else@3: - // modules/actus_kernel.py:1153 + // modules/actus_kernel.py:1212 // assert event_id == self.event_cursor, err.INVALID_EVENT_CURSOR intc_0 // 0 bytec_2 // "event_cursor" @@ -3562,12 +3562,12 @@ apply_non_cash_event_after_if_else@3: uncover 2 == assert // Invalid event cursor - // modules/actus_kernel.py:1154 + // modules/actus_kernel.py:1213 // entry = self._get_schedule_entry(event_id) callsub _get_schedule_entry dup bury 8 - // modules/actus_kernel.py:1156 + // modules/actus_kernel.py:1215 // entry.event_type.as_uint64() dup extract 8 1 @@ -3670,12 +3670,12 @@ apply_non_cash_event_bool_true@15: intc_1 // 1 apply_non_cash_event_bool_merge@17: - // modules/actus_kernel.py:1155-1157 + // modules/actus_kernel.py:1214-1216 // assert self._event_is_non_cash( // entry.event_type.as_uint64() // ), err.INVALID_EVENT_TYPE assert // Invalid event type - // modules/actus_kernel.py:1158 + // modules/actus_kernel.py:1217 // assert entry.event_type != arc4.UInt8(enums.EVT_IED), err.INVALID_EVENT_TYPE dig 8 pushbytes 0x01 @@ -3696,27 +3696,27 @@ apply_non_cash_event_bool_true@21: intc_1 // 1 apply_non_cash_event_bool_merge@23: - // modules/actus_kernel.py:1159 + // modules/actus_kernel.py:1218 // if self._event_is_rate_reset(entry.event_type.as_uint64()): bz apply_non_cash_event_else_body@5 // modules/rbac.py:80 // assert self._role_is_active(self.observer, Txn.sender), err.UNAUTHORIZED - bytec 25 // 0x52234f6273657276657223 + bytec 25 // 0x523a4d4f4323 txn Sender callsub _role_is_active assert // Not authorized apply_non_cash_event_after_if_else@6: - // modules/actus_kernel.py:1163 + // modules/actus_kernel.py:1222 // self._apply_non_cash_schedule_entry(entry, payload) dig 6 dig 2 callsub _apply_non_cash_schedule_entry popn 2 - // modules/actus_kernel.py:1164 + // modules/actus_kernel.py:1223 // return Global.latest_timestamp global LatestTimestamp - // modules/actus_kernel.py:1131 + // modules/actus_kernel.py:1167 // @arc4.abimethod itob bytec_0 // 0x151f7c75 @@ -3727,7 +3727,7 @@ apply_non_cash_event_after_if_else@6: return apply_non_cash_event_else_body@5: - // modules/actus_kernel.py:1162 + // modules/actus_kernel.py:1221 // self._assert_caller_is_arranger() callsub _assert_caller_is_arranger b apply_non_cash_event_after_if_else@6 @@ -3745,7 +3745,7 @@ apply_non_cash_event_bool_false@16: append_observed_cash_event: intc_0 // 0 dup - // modules/actus_kernel.py:1166 + // modules/actus_kernel.py:1225 // @arc4.abimethod txna ApplicationArgs 1 dupn 2 @@ -3760,13 +3760,13 @@ append_observed_cash_event: app_global_get_ex assert // check self.status exists assert // D-ASA not configured - // modules/actus_kernel.py:1174 + // modules/actus_kernel.py:1254 // self._assert_caller_is_arranger() callsub _assert_caller_is_arranger - // modules/actus_kernel.py:1175 + // modules/actus_kernel.py:1255 // self._assert_is_not_asset_defaulted() callsub _assert_is_not_asset_defaulted - // modules/actus_kernel.py:1176 + // modules/actus_kernel.py:1256 // self._assert_is_not_asset_suspended() callsub _assert_is_not_asset_suspended // modules/actus_kernel.py:135 @@ -3999,10 +3999,10 @@ append_observed_cash_event_after_if_else@5: bytec_3 // "schedule_entry_count" swap app_global_put - // modules/actus_kernel.py:1180 + // modules/actus_kernel.py:1260 // return Global.latest_timestamp global LatestTimestamp - // modules/actus_kernel.py:1166 + // modules/actus_kernel.py:1225 // @arc4.abimethod itob bytec_0 // 0x151f7c75 @@ -4023,7 +4023,7 @@ contract_get_state: assert // check self.status exists dup assert // D-ASA not configured - // modules/actus_kernel.py:1187 + // modules/actus_kernel.py:1275 // contract_type=arc4.UInt8(self.contract_type), intc_0 // 0 bytec 10 // "contract_type" @@ -4036,85 +4036,85 @@ contract_get_state: <= assert // overflow extract 7 1 - // modules/actus_kernel.py:1189 + // modules/actus_kernel.py:1277 // total_units=self.total_units, intc_0 // 0 bytec 13 // "total_units" app_global_get_ex assert // check self.total_units exists - // modules/actus_kernel.py:1190 + // modules/actus_kernel.py:1278 // reserved_units_total=self.reserved_units_total, intc_0 // 0 bytec 11 // "reserved_units_total" app_global_get_ex assert // check self.reserved_units_total exists - // modules/actus_kernel.py:1191 + // modules/actus_kernel.py:1279 // initial_exchange_amount=self.initial_exchange_amount, intc_0 // 0 bytec 20 // "initial_exchange_amount" app_global_get_ex assert // check self.initial_exchange_amount exists - // modules/actus_kernel.py:1192 + // modules/actus_kernel.py:1280 // event_cursor=self.event_cursor, intc_0 // 0 bytec_2 // "event_cursor" app_global_get_ex assert // check self.event_cursor exists - // modules/actus_kernel.py:1193 + // modules/actus_kernel.py:1281 // schedule_entry_count=self.schedule_entry_count, intc_0 // 0 bytec_3 // "schedule_entry_count" app_global_get_ex assert // check self.schedule_entry_count exists - // modules/actus_kernel.py:1194 + // modules/actus_kernel.py:1282 // outstanding_principal=self.outstanding_principal, intc_0 // 0 bytec 4 // "outstanding_principal" app_global_get_ex assert // check self.outstanding_principal exists - // modules/actus_kernel.py:1195 + // modules/actus_kernel.py:1283 // interest_calculation_base=self.interest_calculation_base, intc_0 // 0 bytec 7 // "interest_calculation_base" app_global_get_ex assert // check self.interest_calculation_base exists - // modules/actus_kernel.py:1196 + // modules/actus_kernel.py:1284 // nominal_interest_rate=self.nominal_interest_rate, intc_0 // 0 bytec 9 // "nominal_interest_rate" app_global_get_ex assert // check self.nominal_interest_rate exists - // modules/actus_kernel.py:1197 + // modules/actus_kernel.py:1285 // accrued_interest=self.accrued_interest, intc_0 // 0 bytec 6 // "accrued_interest" app_global_get_ex assert // check self.accrued_interest exists - // modules/actus_kernel.py:1198 + // modules/actus_kernel.py:1286 // cumulative_interest_index=self.cumulative_interest_index, intc_0 // 0 bytec 16 // "cumulative_interest_index" app_global_get_ex assert // check self.cumulative_interest_index exists - // modules/actus_kernel.py:1199 + // modules/actus_kernel.py:1287 // cumulative_principal_index=self.cumulative_principal_index, intc_0 // 0 bytec 17 // "cumulative_principal_index" app_global_get_ex assert // check self.cumulative_principal_index exists - // modules/actus_kernel.py:1200 + // modules/actus_kernel.py:1288 // reserved_interest=self.reserved_interest, intc_0 // 0 bytec 15 // "reserved_interest" app_global_get_ex assert // check self.reserved_interest exists - // modules/actus_kernel.py:1201 + // modules/actus_kernel.py:1289 // reserved_principal=self.reserved_principal, intc_0 // 0 bytec 12 // "reserved_principal" app_global_get_ex assert // check self.reserved_principal exists - // modules/actus_kernel.py:1186-1202 + // modules/actus_kernel.py:1274-1290 // return typ.KernelState( // contract_type=arc4.UInt8(self.contract_type), // status=self.status, @@ -4176,7 +4176,7 @@ contract_get_state: swap itob concat - // modules/actus_kernel.py:1182 + // modules/actus_kernel.py:1262 // @arc4.abimethod(readonly=True) bytec_0 // 0x151f7c75 swap @@ -4195,7 +4195,7 @@ contract_get_next_due_event: app_global_get_ex assert // check self.status exists assert // D-ASA not configured - // modules/actus_kernel.py:1208 + // modules/actus_kernel.py:1304 // if self.event_cursor >= self.schedule_entry_count: intc_0 // 0 bytec_2 // "event_cursor" @@ -4207,13 +4207,13 @@ contract_get_next_due_event: assert // check self.schedule_entry_count exists >= bz contract_get_next_due_event_after_if_else@3 - // modules/actus_kernel.py:1210 + // modules/actus_kernel.py:1306 // event_id=self.event_cursor, intc_0 // 0 bytec_2 // "event_cursor" app_global_get_ex assert // check self.event_cursor exists - // modules/actus_kernel.py:1209-1219 + // modules/actus_kernel.py:1305-1315 // return typ.ExecutionScheduleEntry( // event_id=self.event_cursor, // event_type=arc4.UInt8(0), @@ -4226,10 +4226,10 @@ contract_get_next_due_event: // flags=UInt64(0), // ) itob - // modules/actus_kernel.py:1211 + // modules/actus_kernel.py:1307 // event_type=arc4.UInt8(0), bytec 40 // 0x00 - // modules/actus_kernel.py:1209-1219 + // modules/actus_kernel.py:1305-1315 // return typ.ExecutionScheduleEntry( // event_id=self.event_cursor, // event_type=arc4.UInt8(0), @@ -4242,10 +4242,10 @@ contract_get_next_due_event: // flags=UInt64(0), // ) concat - // modules/actus_kernel.py:1212 + // modules/actus_kernel.py:1308 // scheduled_time=UInt64(0), intc_0 // 0 - // modules/actus_kernel.py:1209-1219 + // modules/actus_kernel.py:1305-1315 // return typ.ExecutionScheduleEntry( // event_id=self.event_cursor, // event_type=arc4.UInt8(0), @@ -4275,7 +4275,7 @@ contract_get_next_due_event: concat contract_get_next_due_event_after_inlined_modules.actus_kernel.ActusKernelModule.contract_get_next_due_event@4: - // modules/actus_kernel.py:1204 + // modules/actus_kernel.py:1292 // @arc4.abimethod(readonly=True) bytec_0 // 0x151f7c75 swap @@ -4285,21 +4285,21 @@ contract_get_next_due_event_after_inlined_modules.actus_kernel.ActusKernelModule return contract_get_next_due_event_after_if_else@3: - // modules/actus_kernel.py:1220 + // modules/actus_kernel.py:1316 // return self._get_schedule_entry(self.event_cursor) intc_0 // 0 bytec_2 // "event_cursor" app_global_get_ex assert // check self.event_cursor exists callsub _get_schedule_entry - // modules/actus_kernel.py:1204 + // modules/actus_kernel.py:1292 // @arc4.abimethod(readonly=True) b contract_get_next_due_event_after_inlined_modules.actus_kernel.ActusKernelModule.contract_get_next_due_event@4 // modules.rbac.RbacModule.contract_update[routing]() -> void: contract_update: - // modules/rbac.py:153-156 + // modules/rbac.py:159-162 // # The reference implementation grants the update permissions to the Arranger. // # ⚠️ WARNING: Application updates must be executed VERY carefully, as they // # might introduce breaking changes. @@ -4313,7 +4313,7 @@ contract_update: // modules.rbac.RbacModule.rbac_rotate_arranger[routing]() -> void: rbac_rotate_arranger: - // modules/rbac.py:158 + // modules/rbac.py:164 // @arc4.abimethod txna ApplicationArgs 1 dup @@ -4321,18 +4321,18 @@ rbac_rotate_arranger: intc_3 // 32 == assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:169 + // modules/rbac.py:178 // self._assert_caller_is_arranger() callsub _assert_caller_is_arranger - // modules/rbac.py:170 + // modules/rbac.py:179 // self.arranger.value = new_arranger - bytec 18 // 0x5223417272616e67657223 + bytec 18 // 0x523a41525223 swap app_global_put - // modules/rbac.py:171 + // modules/rbac.py:180 // return Global.latest_timestamp global LatestTimestamp - // modules/rbac.py:158 + // modules/rbac.py:164 // @arc4.abimethod itob bytec_0 // 0x151f7c75 @@ -4345,7 +4345,7 @@ rbac_rotate_arranger: // modules.rbac.RbacModule.rbac_set_op_daemon[routing]() -> void: rbac_set_op_daemon: - // modules/rbac.py:173 + // modules/rbac.py:182 // @arc4.abimethod txna ApplicationArgs 1 dup @@ -4353,18 +4353,18 @@ rbac_set_op_daemon: intc_3 // 32 == assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:184 + // modules/rbac.py:196 // self._assert_caller_is_arranger() callsub _assert_caller_is_arranger - // modules/rbac.py:185 + // modules/rbac.py:197 // self.op_daemon.value = address - bytec 26 // 0x52234f704461656d6f6e23 + bytec 26 // 0x523a4f504423 swap app_global_put - // modules/rbac.py:186 + // modules/rbac.py:198 // return Global.latest_timestamp global LatestTimestamp - // modules/rbac.py:173 + // modules/rbac.py:182 // @arc4.abimethod itob bytec_0 // 0x151f7c75 @@ -4377,7 +4377,7 @@ rbac_set_op_daemon: // modules.rbac.RbacModule.rbac_assign_role[routing]() -> void: rbac_assign_role: - // modules/rbac.py:188 + // modules/rbac.py:200 // @arc4.abimethod txna ApplicationArgs 1 dup @@ -4399,13 +4399,13 @@ rbac_assign_role: pushint 16 == assert // invalid number of bytes for smart_contracts.abi_types.RoleValidity - // modules/rbac.py:210 + // modules/rbac.py:222 // self._assert_caller_is_arranger() callsub _assert_caller_is_arranger - // modules/rbac.py:211 + // modules/rbac.py:223 // self._assert_is_not_asset_defaulted() callsub _assert_is_not_asset_defaulted - // modules/rbac.py:212 + // modules/rbac.py:224 // self._assert_valid_role(role_id.as_uint64()) btoi dupn 2 @@ -4417,15 +4417,15 @@ rbac_assign_role: bz rbac_assign_role_after_if_else@3 // modules/rbac.py:103 // self.arranger.value = role_address - bytec 18 // 0x5223417272616e67657223 + bytec 18 // 0x523a41525223 dig 3 app_global_put rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14: - // modules/rbac.py:214 + // modules/rbac.py:226 // return Global.latest_timestamp global LatestTimestamp - // modules/rbac.py:188 + // modules/rbac.py:200 // @arc4.abimethod itob bytec_0 // 0x151f7c75 @@ -4444,7 +4444,7 @@ rbac_assign_role_after_if_else@3: bz rbac_assign_role_after_if_else@5 // modules/rbac.py:107 // assert role_address not in self.account_manager, err.INVALID_ROLE_ADDRESS - bytec 23 // 0x52234163636f756e744d616e6167657223 + bytec 23 // 0x523a4d4e4723 dig 3 concat dup @@ -4456,7 +4456,7 @@ rbac_assign_role_after_if_else@3: // self.account_manager[role_address] = validity.copy() dig 2 box_put - // modules/rbac.py:213 + // modules/rbac.py:225 // self._set_role(role_id.as_uint64(), role_address, validity) b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14 @@ -4469,7 +4469,7 @@ rbac_assign_role_after_if_else@5: bz rbac_assign_role_after_if_else@7 // modules/rbac.py:111 // assert role_address not in self.primary_dealer, err.INVALID_ROLE_ADDRESS - bytec 22 // 0x52235072696d6172794465616c657223 + bytec 22 // 0x523a50594423 dig 3 concat dup @@ -4481,7 +4481,7 @@ rbac_assign_role_after_if_else@5: // self.primary_dealer[role_address] = validity.copy() dig 2 box_put - // modules/rbac.py:213 + // modules/rbac.py:225 // self._set_role(role_id.as_uint64(), role_address, validity) b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14 @@ -4494,7 +4494,7 @@ rbac_assign_role_after_if_else@7: bz rbac_assign_role_after_if_else@9 // modules/rbac.py:115 // assert role_address not in self.trustee, err.INVALID_ROLE_ADDRESS - bytec 32 // 0x52235472757374656523 + bytec 32 // 0x523a54525323 dig 3 concat dup @@ -4506,7 +4506,7 @@ rbac_assign_role_after_if_else@7: // self.trustee[role_address] = validity.copy() dig 2 box_put - // modules/rbac.py:213 + // modules/rbac.py:225 // self._set_role(role_id.as_uint64(), role_address, validity) b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14 @@ -4519,7 +4519,7 @@ rbac_assign_role_after_if_else@9: bz rbac_assign_role_after_if_else@11 // modules/rbac.py:119 // assert role_address not in self.authority, err.INVALID_ROLE_ADDRESS - bytec 21 // 0x5223417574686f7269747923 + bytec 21 // 0x523a41555423 dig 3 concat dup @@ -4531,7 +4531,7 @@ rbac_assign_role_after_if_else@9: // self.authority[role_address] = validity.copy() dig 2 box_put - // modules/rbac.py:213 + // modules/rbac.py:225 // self._set_role(role_id.as_uint64(), role_address, validity) b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14 @@ -4544,7 +4544,7 @@ rbac_assign_role_after_if_else@11: bz rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14 // modules/rbac.py:123 // assert role_address not in self.observer, err.INVALID_ROLE_ADDRESS - bytec 25 // 0x52234f6273657276657223 + bytec 25 // 0x523a4d4f4323 dig 3 concat dup @@ -4561,7 +4561,7 @@ rbac_assign_role_after_if_else@11: // modules.rbac.RbacModule.rbac_revoke_role[routing]() -> void: rbac_revoke_role: - // modules/rbac.py:216 + // modules/rbac.py:228 // @arc4.abimethod txna ApplicationArgs 1 dup @@ -4576,13 +4576,13 @@ rbac_revoke_role: intc_3 // 32 == assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:235 + // modules/rbac.py:247 // self._assert_caller_is_arranger() callsub _assert_caller_is_arranger - // modules/rbac.py:236 + // modules/rbac.py:248 // self._assert_is_not_asset_defaulted() callsub _assert_is_not_asset_defaulted - // modules/rbac.py:237 + // modules/rbac.py:249 // self._assert_valid_role(role_id.as_uint64()) btoi dupn 2 @@ -4600,7 +4600,7 @@ rbac_revoke_role: bz rbac_revoke_role_after_if_else@3 // modules/rbac.py:129 // assert role_address in self.account_manager, err.INVALID_ROLE_ADDRESS - bytec 23 // 0x52234163636f756e744d616e6167657223 + bytec 23 // 0x523a4d4e4723 dig 2 concat dup @@ -4613,10 +4613,10 @@ rbac_revoke_role: pop rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12: - // modules/rbac.py:239 + // modules/rbac.py:251 // return Global.latest_timestamp global LatestTimestamp - // modules/rbac.py:216 + // modules/rbac.py:228 // @arc4.abimethod itob bytec_0 // 0x151f7c75 @@ -4635,7 +4635,7 @@ rbac_revoke_role_after_if_else@3: bz rbac_revoke_role_after_if_else@5 // modules/rbac.py:133 // assert role_address in self.primary_dealer, err.INVALID_ROLE_ADDRESS - bytec 22 // 0x52235072696d6172794465616c657223 + bytec 22 // 0x523a50594423 dig 2 concat dup @@ -4646,7 +4646,7 @@ rbac_revoke_role_after_if_else@3: // del self.primary_dealer[role_address] box_del pop - // modules/rbac.py:238 + // modules/rbac.py:250 // self._delete_role(role_id.as_uint64(), role_address) b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 @@ -4659,7 +4659,7 @@ rbac_revoke_role_after_if_else@5: bz rbac_revoke_role_after_if_else@7 // modules/rbac.py:137 // assert role_address in self.trustee, err.INVALID_ROLE_ADDRESS - bytec 32 // 0x52235472757374656523 + bytec 32 // 0x523a54525323 dig 2 concat dup @@ -4670,7 +4670,7 @@ rbac_revoke_role_after_if_else@5: // del self.trustee[role_address] box_del pop - // modules/rbac.py:238 + // modules/rbac.py:250 // self._delete_role(role_id.as_uint64(), role_address) b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 @@ -4683,7 +4683,7 @@ rbac_revoke_role_after_if_else@7: bz rbac_revoke_role_after_if_else@9 // modules/rbac.py:141 // assert role_address in self.authority, err.INVALID_ROLE_ADDRESS - bytec 21 // 0x5223417574686f7269747923 + bytec 21 // 0x523a41555423 dig 2 concat dup @@ -4694,7 +4694,7 @@ rbac_revoke_role_after_if_else@7: // del self.authority[role_address] box_del pop - // modules/rbac.py:238 + // modules/rbac.py:250 // self._delete_role(role_id.as_uint64(), role_address) b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 @@ -4707,7 +4707,7 @@ rbac_revoke_role_after_if_else@9: bz rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 // modules/rbac.py:145 // assert role_address in self.observer, err.INVALID_ROLE_ADDRESS - bytec 25 // 0x52234f6273657276657223 + bytec 25 // 0x523a4d4f4323 dig 2 concat dup @@ -4723,7 +4723,7 @@ rbac_revoke_role_after_if_else@9: // modules.rbac.RbacModule.rbac_contract_suspension[routing]() -> void: rbac_contract_suspension: - // modules/rbac.py:241 + // modules/rbac.py:253 // @arc4.abimethod # TODO: Update specs and add test txna ApplicationArgs 1 dup @@ -4735,19 +4735,19 @@ rbac_contract_suspension: getbit // modules/rbac.py:77 // assert self._role_is_active(self.authority, Txn.sender), err.UNAUTHORIZED - bytec 21 // 0x5223417574686f7269747923 + bytec 21 // 0x523a41555423 txn Sender callsub _role_is_active assert // Not authorized - // modules/rbac.py:257 + // modules/rbac.py:269 // self.asset_suspended = suspended bytec 33 // "asset_suspended" swap app_global_put - // modules/rbac.py:258 + // modules/rbac.py:270 // return Global.latest_timestamp global LatestTimestamp - // modules/rbac.py:241 + // modules/rbac.py:253 // @arc4.abimethod # TODO: Update specs and add test itob bytec_0 // 0x151f7c75 @@ -4760,13 +4760,13 @@ rbac_contract_suspension: // modules.rbac.RbacModule.rbac_get_arranger[routing]() -> void: rbac_get_arranger: - // modules/rbac.py:268 + // modules/rbac.py:283 // return self.arranger.value intc_0 // 0 - bytec 18 // 0x5223417272616e67657223 + bytec 18 // 0x523a41525223 app_global_get_ex assert // check self.arranger exists - // modules/rbac.py:260 + // modules/rbac.py:272 // @arc4.abimethod(readonly=True) bytec_0 // 0x151f7c75 swap @@ -4778,7 +4778,7 @@ rbac_get_arranger: // modules.rbac.RbacModule.rbac_get_address_roles[routing]() -> void: rbac_get_address_roles: - // modules/rbac.py:270 + // modules/rbac.py:285 // @arc4.abimethod(readonly=True) txna ApplicationArgs 1 dup @@ -4786,32 +4786,32 @@ rbac_get_address_roles: intc_3 // 32 == assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:284 + // modules/rbac.py:303 // self._role_is_active(self.account_manager, address), - bytec 23 // 0x52234163636f756e744d616e6167657223 + bytec 23 // 0x523a4d4e4723 dig 1 callsub _role_is_active - // modules/rbac.py:285 + // modules/rbac.py:304 // self._role_is_active(self.primary_dealer, address), - bytec 22 // 0x52235072696d6172794465616c657223 + bytec 22 // 0x523a50594423 dig 2 callsub _role_is_active - // modules/rbac.py:286 + // modules/rbac.py:305 // self._role_is_active(self.trustee, address), - bytec 32 // 0x52235472757374656523 + bytec 32 // 0x523a54525323 dig 3 callsub _role_is_active - // modules/rbac.py:287 + // modules/rbac.py:306 // self._role_is_active(self.authority, address), - bytec 21 // 0x5223417574686f7269747923 + bytec 21 // 0x523a41555423 dig 4 callsub _role_is_active - // modules/rbac.py:288 + // modules/rbac.py:307 // self._role_is_active(self.observer, address), - bytec 25 // 0x52234f6273657276657223 + bytec 25 // 0x523a4d4f4323 uncover 5 callsub _role_is_active - // modules/rbac.py:270 + // modules/rbac.py:285 // @arc4.abimethod(readonly=True) bytec 40 // 0x00 intc_0 // 0 @@ -4839,7 +4839,7 @@ rbac_get_address_roles: // modules.rbac.RbacModule.rbac_get_role_validity[routing]() -> void: rbac_get_role_validity: - // modules/rbac.py:291 + // modules/rbac.py:310 // @arc4.abimethod(readonly=True) txna ApplicationArgs 1 dup @@ -4854,17 +4854,17 @@ rbac_get_role_validity: intc_3 // 32 == assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:305 + // modules/rbac.py:328 // role = role_id.as_uint64() btoi - // modules/rbac.py:306 + // modules/rbac.py:329 // self._assert_valid_role(role) dup callsub _assert_valid_role - // modules/rbac.py:308 + // modules/rbac.py:331 // case UInt64(enums.ROLE_ARRANGER): pushints 20 40 50 60 70 80 - // modules/rbac.py:307-338 + // modules/rbac.py:330-361 // match role: // case UInt64(enums.ROLE_ARRANGER): // return typ.RoleValidity( @@ -4899,14 +4899,14 @@ rbac_get_role_validity: // op.err(err.INVALID_ROLE) uncover 6 match rbac_get_role_validity_switch_case_0@2 rbac_get_role_validity_switch_case_1@3 rbac_get_role_validity_switch_case_2@4 rbac_get_role_validity_switch_case_3@5 rbac_get_role_validity_switch_case_4@6 rbac_get_role_validity_switch_case_5@7 - // modules/rbac.py:338 + // modules/rbac.py:361 // op.err(err.INVALID_ROLE) err // Invalid role identifier rbac_get_role_validity_switch_case_5@7: - // modules/rbac.py:334 + // modules/rbac.py:357 // self.observer, role_address - bytec 25 // 0x52234f6273657276657223 + bytec 25 // 0x523a4d4f4323 // modules/rbac.py:55 // return role_address in role_map dig 1 @@ -4914,18 +4914,18 @@ rbac_get_role_validity_switch_case_5@7: dup box_len bury 1 - // modules/rbac.py:333-335 + // modules/rbac.py:356-358 // assert self._has_role( // self.observer, role_address // ), err.INVALID_ROLE_ADDRESS assert // Invalid account role address - // modules/rbac.py:336 + // modules/rbac.py:359 // return self.observer[role_address] box_get pop rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9: - // modules/rbac.py:291 + // modules/rbac.py:310 // @arc4.abimethod(readonly=True) bytec_0 // 0x151f7c75 swap @@ -4935,9 +4935,9 @@ rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_valid return rbac_get_role_validity_switch_case_4@6: - // modules/rbac.py:329 + // modules/rbac.py:352 // self.authority, role_address - bytec 21 // 0x5223417574686f7269747923 + bytec 21 // 0x523a41555423 // modules/rbac.py:55 // return role_address in role_map dig 1 @@ -4945,23 +4945,23 @@ rbac_get_role_validity_switch_case_4@6: dup box_len bury 1 - // modules/rbac.py:328-330 + // modules/rbac.py:351-353 // assert self._has_role( // self.authority, role_address // ), err.INVALID_ROLE_ADDRESS assert // Invalid account role address - // modules/rbac.py:331 + // modules/rbac.py:354 // return self.authority[role_address] box_get pop - // modules/rbac.py:291 + // modules/rbac.py:310 // @arc4.abimethod(readonly=True) b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9 rbac_get_role_validity_switch_case_3@5: - // modules/rbac.py:324 + // modules/rbac.py:347 // self.trustee, role_address - bytec 32 // 0x52235472757374656523 + bytec 32 // 0x523a54525323 // modules/rbac.py:55 // return role_address in role_map dig 1 @@ -4969,23 +4969,23 @@ rbac_get_role_validity_switch_case_3@5: dup box_len bury 1 - // modules/rbac.py:323-325 + // modules/rbac.py:346-348 // assert self._has_role( // self.trustee, role_address // ), err.INVALID_ROLE_ADDRESS assert // Invalid account role address - // modules/rbac.py:326 + // modules/rbac.py:349 // return self.trustee[role_address] box_get pop - // modules/rbac.py:291 + // modules/rbac.py:310 // @arc4.abimethod(readonly=True) b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9 rbac_get_role_validity_switch_case_2@4: - // modules/rbac.py:319 + // modules/rbac.py:342 // self.primary_dealer, role_address - bytec 22 // 0x52235072696d6172794465616c657223 + bytec 22 // 0x523a50594423 // modules/rbac.py:55 // return role_address in role_map dig 1 @@ -4993,23 +4993,23 @@ rbac_get_role_validity_switch_case_2@4: dup box_len bury 1 - // modules/rbac.py:318-320 + // modules/rbac.py:341-343 // assert self._has_role( // self.primary_dealer, role_address // ), err.INVALID_ROLE_ADDRESS assert // Invalid account role address - // modules/rbac.py:321 + // modules/rbac.py:344 // return self.primary_dealer[role_address] box_get pop - // modules/rbac.py:291 + // modules/rbac.py:310 // @arc4.abimethod(readonly=True) b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9 rbac_get_role_validity_switch_case_1@3: - // modules/rbac.py:314 + // modules/rbac.py:337 // self.account_manager, role_address - bytec 23 // 0x52234163636f756e744d616e6167657223 + bytec 23 // 0x523a4d4e4723 // modules/rbac.py:55 // return role_address in role_map dig 1 @@ -5017,26 +5017,26 @@ rbac_get_role_validity_switch_case_1@3: dup box_len bury 1 - // modules/rbac.py:313-315 + // modules/rbac.py:336-338 // assert self._has_role( // self.account_manager, role_address // ), err.INVALID_ROLE_ADDRESS assert // Invalid account role address - // modules/rbac.py:316 + // modules/rbac.py:339 // return self.account_manager[role_address] box_get pop - // modules/rbac.py:291 + // modules/rbac.py:310 // @arc4.abimethod(readonly=True) b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9 rbac_get_role_validity_switch_case_0@2: - // modules/rbac.py:309-311 + // modules/rbac.py:332-334 // return typ.RoleValidity( // role_validity_start=UInt64(0), role_validity_end=UInt64(0) // ) pushbytes 0x00000000000000000000000000000000 - // modules/rbac.py:291 + // modules/rbac.py:310 // @arc4.abimethod(readonly=True) b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9 @@ -5048,7 +5048,7 @@ _assert_is_not_account_suspended: proto 1 0 // modules/accounting.py:28 // assert not self.account[holding_address].suspended, err.SUSPENDED - bytec 8 // 0x52234163636f756e7423 + bytec 8 // 0x4123 frame_dig -1 concat box_get @@ -5067,7 +5067,7 @@ _settle_position: proto 1 2 // modules/accounting.py:24 // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec 8 // 0x52234163636f756e7423 + bytec 8 // 0x4123 frame_dig -1 concat dup @@ -5204,7 +5204,7 @@ _ensure_units_activated: pushbytes "" // modules/accounting.py:24 // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec 8 // 0x52234163636f756e7423 + bytec 8 // 0x4123 frame_dig -1 concat dup @@ -6918,7 +6918,7 @@ _assert_caller_is_arranger: // modules/rbac.py:52 // return role_address == self.arranger.value intc_0 // 0 - bytec 18 // 0x5223417272616e67657223 + bytec 18 // 0x523a41525223 app_global_get_ex assert // check self.arranger exists == diff --git a/smart_contracts/artifacts/d_asa/DASA.arc56.json b/smart_contracts/artifacts/d_asa/DASA.arc56.json index de17538f..f45774cb 100644 --- a/smart_contracts/artifacts/d_asa/DASA.arc56.json +++ b/smart_contracts/artifacts/d_asa/DASA.arc56.json @@ -402,12 +402,14 @@ "args": [ { "type": "uint64", - "name": "max_event_count" + "name": "max_event_count", + "desc": "Maximum number of due cash events to process in this call." } ], "returns": { "type": "(uint64,uint64,uint64,uint64,uint64)", - "struct": "CashFundingResult" + "struct": "CashFundingResult", + "desc": "Funding result with reserved interest, reserved principal, and event count." }, "actions": { "create": [], @@ -472,16 +474,19 @@ "args": [ { "type": "address", - "name": "holding_address" + "name": "holding_address", + "desc": "Holder whose position should be settled and claimed." }, { "type": "byte[]", - "name": "payment_info" + "name": "payment_info", + "desc": "Opaque settlement context returned in the result." } ], "returns": { "type": "(uint64,uint64,uint64,uint64,byte[])", - "struct": "CashClaimResult" + "struct": "CashClaimResult", + "desc": "Claim result with realized interest, principal, and passthrough context." }, "actions": { "create": [], @@ -499,15 +504,18 @@ "args": [ { "type": "uint64", - "name": "open_date" + "name": "open_date", + "desc": "Inclusive UNIX timestamp at which transfers may start." }, { "type": "uint64", - "name": "closure_date" + "name": "closure_date", + "desc": "Exclusive UNIX timestamp at which transfers stop." } ], "returns": { - "type": "uint64" + "type": "uint64", + "desc": "UNIX timestamp of the schedule update." }, "actions": { "create": [], @@ -516,6 +524,7 @@ ] }, "readonly": false, + "desc": "Configure the secondary-market transfer window.", "events": [], "recommendations": {} }, @@ -524,15 +533,18 @@ "args": [ { "type": "address", - "name": "holding_address" + "name": "holding_address", + "desc": "Account receiving the reserved units." }, { "type": "uint64", - "name": "units" + "name": "units", + "desc": "Number of units to reserve." } ], "returns": { - "type": "uint64" + "type": "uint64", + "desc": "Remaining undistributed unit balance." }, "actions": { "create": [], @@ -541,7 +553,7 @@ ] }, "readonly": false, - "desc": "Reserve units for a holder before IED finalizes issuance.", + "desc": "Reserve units for a holder before the initial exchange activates issuance.", "events": [], "recommendations": {} }, @@ -550,19 +562,23 @@ "args": [ { "type": "address", - "name": "sender_holding_address" + "name": "sender_holding_address", + "desc": "Account debited for the transfer." }, { "type": "address", - "name": "receiver_holding_address" + "name": "receiver_holding_address", + "desc": "Account credited for the transfer." }, { "type": "uint64", - "name": "units" + "name": "units", + "desc": "Number of active units to move." } ], "returns": { - "type": "uint64" + "type": "uint64", + "desc": "Number of units transferred." }, "actions": { "create": [], @@ -581,17 +597,17 @@ { "type": "address", "name": "holding_address", - "desc": "Account Holding Address" + "desc": "Account holding address." }, { "type": "bool", "name": "suspended", - "desc": "Suspension status" + "desc": "Suspension status to apply." } ], "returns": { "type": "uint64", - "desc": "Timestamp of the set account suspension status" + "desc": "UNIX timestamp of the suspension update." }, "actions": { "create": [], @@ -600,7 +616,7 @@ ] }, "readonly": false, - "desc": "Set account suspension status", + "desc": "Set the suspension status of one account.", "events": [], "recommendations": {} }, @@ -610,17 +626,17 @@ { "type": "address", "name": "holding_address", - "desc": "Account Holding Address" + "desc": "Account holding address." }, { "type": "address", "name": "payment_address", - "desc": "Account Payment Address" + "desc": "Account payment address." } ], "returns": { "type": "uint64", - "desc": "Timestamp of the account opening" + "desc": "UNIX timestamp of the account opening." }, "actions": { "create": [], @@ -639,17 +655,17 @@ { "type": "address", "name": "holding_address", - "desc": "Account Holding Address" + "desc": "Account holding address." }, { "type": "address", "name": "payment_address", - "desc": "Account Payment Address" + "desc": "New account payment address." } ], "returns": { "type": "uint64", - "desc": "Timestamp of the account update" + "desc": "UNIX timestamp of the account update." }, "actions": { "create": [], @@ -658,7 +674,7 @@ ] }, "readonly": false, - "desc": "Update the Payment Address of an account", + "desc": "Update the payment address of an account.", "events": [], "recommendations": {} }, @@ -668,13 +684,13 @@ { "type": "address", "name": "holding_address", - "desc": "Account Holding Address" + "desc": "Account holding address." } ], "returns": { "type": "(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64)", "struct": "AccountPosition", - "desc": "Account position" + "desc": "Account position record." }, "actions": { "create": [], @@ -683,7 +699,7 @@ ] }, "readonly": true, - "desc": "Get account position", + "desc": "Get the full accounting position for one holder.", "events": [], "recommendations": {} }, @@ -693,12 +709,12 @@ { "type": "address", "name": "arranger", - "desc": "D-ASA Arranger Address" + "desc": "D-ASA arranger address." } ], "returns": { "type": "uint64", - "desc": "UNIX timestamp of contract creation" + "desc": "UNIX timestamp of contract creation." }, "actions": { "create": [ @@ -707,7 +723,7 @@ "call": [] }, "readonly": false, - "desc": "Create a new D-ASA contract and set the Arranger role", + "desc": "Create a new D-ASA contract and set the arranger role.", "events": [], "recommendations": {} }, @@ -718,24 +734,24 @@ "type": "(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64)", "struct": "NormalizedActusTerms", "name": "terms", - "desc": "Normalized ACTUS terms" + "desc": "Normalized ACTUS terms." }, { "type": "(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "struct": "InitialKernelState", "name": "initial_state", - "desc": "Initial kernel state (pre-IED)" + "desc": "Initial kernel state captured before `IED`." }, { "type": "(byte[32],string)", "struct": "Prospectus", "name": "prospectus", - "desc": "Prospectus (informational only)" + "desc": "Prospectus metadata stored for reference only." } ], "returns": { "type": "uint64", - "desc": "UNIX timestamp of contract configuration" + "desc": "UNIX timestamp of contract configuration." }, "actions": { "create": [], @@ -753,19 +769,23 @@ "args": [ { "type": "uint64", - "name": "schedule_page_index" + "name": "schedule_page_index", + "desc": "Zero-based page index within the boxed schedule." }, { "type": "bool", - "name": "is_last_page" + "name": "is_last_page", + "desc": "Whether this page finalizes the schedule upload." }, { "type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[]", - "name": "schedule_page" + "name": "schedule_page", + "desc": "Normalized schedule entries for the requested page." } ], "returns": { - "type": "uint64" + "type": "uint64", + "desc": "UNIX timestamp of the schedule upload." }, "actions": { "create": [], @@ -782,7 +802,8 @@ "name": "contract_execute_ied", "args": [], "returns": { - "type": "uint64" + "type": "uint64", + "desc": "UNIX timestamp of the `IED` execution." }, "actions": { "create": [], @@ -847,16 +868,19 @@ "args": [ { "type": "uint64", - "name": "event_id" + "name": "event_id", + "desc": "Expected global schedule event identifier at the current cursor." }, { "type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "struct": "ObservedEventRequest", - "name": "payload" + "name": "payload", + "desc": "Observed payload used for append-on-execute and/or rate resets." } ], "returns": { - "type": "uint64" + "type": "uint64", + "desc": "UNIX timestamp of the non-cash event application." }, "actions": { "create": [], @@ -922,11 +946,13 @@ { "type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "struct": "ObservedCashEventRequest", - "name": "payload" + "name": "payload", + "desc": "Observed cash-event payload to append after the current tail." } ], "returns": { - "type": "uint64" + "type": "uint64", + "desc": "UNIX timestamp of the append operation." }, "actions": { "create": [], @@ -944,7 +970,8 @@ "args": [], "returns": { "type": "(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", - "struct": "KernelState" + "struct": "KernelState", + "desc": "Current kernel state snapshot." }, "actions": { "create": [], @@ -962,7 +989,8 @@ "args": [], "returns": { "type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", - "struct": "ExecutionScheduleEntry" + "struct": "ExecutionScheduleEntry", + "desc": "Next due schedule entry, or an all-zero sentinel if the contract ended." }, "actions": { "create": [], @@ -979,7 +1007,8 @@ "name": "contract_update", "args": [], "returns": { - "type": "void" + "type": "void", + "desc": "None." }, "actions": { "create": [], @@ -998,12 +1027,12 @@ { "type": "address", "name": "new_arranger", - "desc": "New Arranger address" + "desc": "New arranger address." } ], "returns": { "type": "uint64", - "desc": "Timestamp of the role assignment" + "desc": "UNIX timestamp of the role assignment." }, "actions": { "create": [], @@ -1012,7 +1041,7 @@ ] }, "readonly": false, - "desc": "Rotate the Arranger address", + "desc": "Rotate the arranger address.", "events": [], "recommendations": {} }, @@ -1022,12 +1051,12 @@ { "type": "address", "name": "address", - "desc": "Operation Daemon address" + "desc": "Operation daemon address." } ], "returns": { "type": "uint64", - "desc": "Timestamp of the role assignment" + "desc": "UNIX timestamp of the role assignment." }, "actions": { "create": [], @@ -1036,7 +1065,7 @@ ] }, "readonly": false, - "desc": "Non-Normative: Set the Operation Daemon address", + "desc": "Non-normative helper to set the operation daemon address.", "events": [], "recommendations": {} }, @@ -1046,23 +1075,23 @@ { "type": "uint8", "name": "role_id", - "desc": "Role Identifier" + "desc": "Role identifier." }, { "type": "address", "name": "role_address", - "desc": "Account Role Address" + "desc": "Account role address." }, { "type": "(uint64,uint64)", "struct": "RoleValidity", "name": "validity", - "desc": "Role time validity" + "desc": "Inclusive validity interval for the assignment." } ], "returns": { "type": "uint64", - "desc": "Timestamp of the role assignment" + "desc": "UNIX timestamp of the role assignment." }, "actions": { "create": [], @@ -1071,7 +1100,7 @@ ] }, "readonly": false, - "desc": "Assign a role to an address", + "desc": "Assign a role to an address.", "events": [], "recommendations": {} }, @@ -1081,17 +1110,17 @@ { "type": "uint8", "name": "role_id", - "desc": "Role Identifier" + "desc": "Role identifier." }, { "type": "address", "name": "role_address", - "desc": "Account Role Address" + "desc": "Account role address." } ], "returns": { "type": "uint64", - "desc": "Timestamp of the role revocation" + "desc": "UNIX timestamp of the role revocation." }, "actions": { "create": [], @@ -1100,7 +1129,7 @@ ] }, "readonly": false, - "desc": "Revoke a role from an address", + "desc": "Revoke a role from an address.", "events": [], "recommendations": {} }, @@ -1110,12 +1139,12 @@ { "type": "bool", "name": "suspended", - "desc": "Suspension status" + "desc": "Suspension status to apply." } ], "returns": { "type": "uint64", - "desc": "Timestamp of the set asset suspension status" + "desc": "UNIX timestamp of the suspension update." }, "actions": { "create": [], @@ -1124,7 +1153,7 @@ ] }, "readonly": false, - "desc": "Set asset suspension status", + "desc": "Set the asset-wide suspension status.", "events": [], "recommendations": {} }, @@ -1133,7 +1162,7 @@ "args": [], "returns": { "type": "address", - "desc": "Arranger address" + "desc": "Current arranger address." }, "actions": { "create": [], @@ -1142,7 +1171,7 @@ ] }, "readonly": true, - "desc": "Get Arranger address", + "desc": "Get the arranger address.", "events": [], "recommendations": {} }, @@ -1152,12 +1181,12 @@ { "type": "address", "name": "address", - "desc": "Address to get roles for" + "desc": "Address to query." } ], "returns": { "type": "(bool,bool,bool,bool,bool)", - "desc": "Roles mask: (Account Manager, Primary Dealer, Trustee, Authority, Observer)" + "desc": "Roles mask in the order: account manager, primary dealer, trustee, authority, observer." }, "actions": { "create": [], @@ -1166,7 +1195,7 @@ ] }, "readonly": true, - "desc": "Non-normative - Get roles assigned to an address", + "desc": "Non-normative helper to get the active roles assigned to an address.", "events": [], "recommendations": {} }, @@ -1176,18 +1205,18 @@ { "type": "uint8", "name": "role_id", - "desc": "Role Identifier" + "desc": "Role identifier." }, { "type": "address", "name": "role_address", - "desc": "Account Role Address" + "desc": "Account role address." } ], "returns": { "type": "(uint64,uint64)", "struct": "RoleValidity", - "desc": "Role validity" + "desc": "Stored role validity interval." }, "actions": { "create": [], @@ -1196,7 +1225,7 @@ ] }, "readonly": true, - "desc": "Get role validity", + "desc": "Get the stored validity interval for a role assignment.", "events": [], "recommendations": {} } @@ -1223,12 +1252,12 @@ "arranger": { "keyType": "AVMBytes", "valueType": "address", - "key": "UiNBcnJhbmdlciM=" + "key": "UjpBUlIj" }, "op_daemon": { "keyType": "AVMBytes", "valueType": "address", - "key": "UiNPcERhZW1vbiM=" + "key": "UjpPUEQj" }, "asset_suspended": { "keyType": "AVMString", @@ -1421,27 +1450,27 @@ "account_manager": { "keyType": "address", "valueType": "RoleValidity", - "prefix": "UiNBY2NvdW50TWFuYWdlciM=" + "prefix": "UjpNTkcj" }, "primary_dealer": { "keyType": "address", "valueType": "RoleValidity", - "prefix": "UiNQcmltYXJ5RGVhbGVyIw==" + "prefix": "UjpQWUQj" }, "trustee": { "keyType": "address", "valueType": "RoleValidity", - "prefix": "UiNUcnVzdGVlIw==" + "prefix": "UjpUUlMj" }, "authority": { "keyType": "address", "valueType": "RoleValidity", - "prefix": "UiNBdXRob3JpdHkj" + "prefix": "UjpBVVQj" }, "observer": { "keyType": "address", "valueType": "RoleValidity", - "prefix": "UiNPYnNlcnZlciM=" + "prefix": "UjpNT0Mj" }, "schedule_page": { "keyType": "uint64", @@ -1451,7 +1480,7 @@ "account": { "keyType": "address", "valueType": "AccountPosition", - "prefix": "UiNBY2NvdW50Iw==" + "prefix": "QSM=" } } } @@ -1465,817 +1494,817 @@ "sourceInfo": [ { "pc": [ - 2702 + 2648 ], "errorMessage": "ACTUS event not yet executed" }, { "pc": [ - 2460 + 2406 ], "errorMessage": "Can not distribute zero units" }, { "pc": [ - 3203, - 3210, - 3583 + 3149, + 3156, + 3529 ], "errorMessage": "D-ASA already configured" }, { "pc": [ - 1309, - 2041, - 2420, - 2566, - 3800, - 3946, - 4297, - 4528, - 4674 + 1255, + 1987, + 2366, + 2512, + 3746, + 3892, + 4243, + 4474, + 4620 ], "errorMessage": "D-ASA not configured" }, { "pc": [ - 3594 + 3540 ], "errorMessage": "D-ASA terms not configured" }, { "pc": [ - 6863 + 6809 ], "errorMessage": "Defaulted" }, { "pc": [ - 3221 + 3167 ], "errorMessage": "Denomination asset is not properly set" }, { "pc": [ - 3236 + 3182 ], "errorMessage": "Different settlement asset not supported, must be equal to denomination asset" }, { "pc": [ - 3472, - 3479, - 3481 + 3418, + 3425, + 3427 ], "errorMessage": "IED must be set in the future" }, { "pc": [ - 1327, - 2110, - 2581, - 4315, - 6215 + 1273, + 2056, + 2527, + 4261, + 6161 ], "errorMessage": "IED not yet executed" }, { "pc": [ - 2473, - 5598 + 2419, + 5544 ], "errorMessage": "Insufficient remaining D-ASA units" }, { "pc": [ - 2676, - 2742 + 2622, + 2688 ], "errorMessage": "Insufficient sender units to transfer" }, { "pc": [ - 1937, - 3123, - 3141, - 3197, - 3674, - 3710, - 4362, - 5782, - 6060, - 6120, - 6523 + 1883, + 3069, + 3087, + 3143, + 3620, + 3656, + 4308, + 5728, + 6006, + 6066, + 6469 ], "errorMessage": "Invalid ACTUS configuration" }, { "pc": [ - 2050, - 2454, - 2637, - 2652, - 2809, - 2882, - 2945, - 2987, - 5410, - 5535 + 1996, + 2400, + 2583, + 2598, + 2755, + 2828, + 2891, + 2933, + 5356, + 5481 ], "errorMessage": "Invalid account holding address" }, { "pc": [ - 4865, - 4889, - 4913, - 4937, - 4961, - 5018, - 5046, - 5068, - 5090, - 5112, - 5291, - 5309, - 5324, - 5339, - 5354 + 4811, + 4835, + 4859, + 4883, + 4907, + 4964, + 4992, + 5014, + 5036, + 5058, + 5237, + 5255, + 5270, + 5285, + 5300 ], "errorMessage": "Invalid account role address" }, { "pc": [ - 3183 + 3129 ], "errorMessage": "Invalid day-count convention ID" }, { "pc": [ - 1440, - 3821, - 4149, - 6092 + 1386, + 3767, + 4095, + 6038 ], "errorMessage": "Invalid event cursor" }, { "pc": [ - 3659, - 3722, - 3998, - 4339, - 5698 + 3605, + 3668, + 3944, + 4285, + 5644 ], "errorMessage": "Invalid event id" }, { "pc": [ - 3834, - 4213, - 4220, - 4352 + 3780, + 4159, + 4166, + 4298 ], "errorMessage": "Invalid event type" }, { "pc": [ - 5002, - 5281, - 6933 + 4948, + 5227, + 6879 ], "errorMessage": "Invalid role identifier" }, { "pc": [ - 3588, - 3734, - 3742, - 4051, - 4426, - 5713, - 5729 + 3534, + 3680, + 3688, + 3997, + 4372, + 5659, + 5675 ], "errorMessage": "Invalid schedule page" }, { "pc": [ - 5646 + 5592 ], "errorMessage": "No D-ASA units" }, { "pc": [ - 1446, - 1966, - 2147, - 6101 + 1392, + 1912, + 2093, + 6047 ], "errorMessage": "No due cashflow to pay" }, { "pc": [ - 6184 + 6130 ], "errorMessage": "Not IED event" }, { "pc": [ - 2095, - 2428, - 2624, - 2799, - 2855, - 2865, - 2951, - 4248, - 5135, - 6855 + 2041, + 2374, + 2570, + 2745, + 2801, + 2811, + 2897, + 4194, + 5081, + 6801 ], "errorMessage": "Not authorized" }, { "pc": [ - 1567, - 1575, - 2196, - 2270, - 2279 + 1513, + 1521, + 2142, + 2216, + 2225 ], "errorMessage": "Not enough funds for the payment" }, { "pc": [ - 3971, - 3984, - 4324 + 3917, + 3930, + 4270 ], "errorMessage": "Observed event required to execute this action" }, { "pc": [ - 2442, - 2490 + 2388, + 2436 ], "errorMessage": "Primary distribution is closed" }, { "pc": [ - 6132 + 6078 ], "errorMessage": "Primary distribution is not complete" }, { "pc": [ - 2665 + 2611 ], "errorMessage": "Sender and receiver must be different" }, { "pc": [ - 5396, - 6871 + 5342, + 6817 ], "errorMessage": "Suspended operations" }, { "pc": [ - 2377, - 3700, - 4384 + 2323, + 3646, + 4330 ], "errorMessage": "Time events must be sorted in strictly ascending order" }, { "pc": [ - 2598, - 2615 + 2544, + 2561 ], "errorMessage": "Transfer is closed" }, { "pc": [ - 2669 + 2615 ], "errorMessage": "Transfer units must be greater than zero" }, { "pc": [ - 993 + 939 ], "errorMessage": "Wrong Global Bytes allocation" }, { "pc": [ - 999 + 945 ], "errorMessage": "Wrong Global UInts allocation" }, { "pc": [ - 1003 + 949 ], "errorMessage": "Wrong Local Bytes allocation" }, { "pc": [ - 1007 + 953 ], "errorMessage": "Wrong Local UInts allocation" }, { "pc": [ - 1548, - 2189 + 1494, + 2135 ], "errorMessage": "account opted into asset" }, { "pc": [ - 6815, - 6830 + 6761, + 6776 ], "errorMessage": "check BoxMap entry exists" }, { "pc": [ - 2086, - 2124, - 2165, - 2203, - 2494, - 2672, - 2731, - 2757, - 5390, - 5556 + 2032, + 2070, + 2111, + 2149, + 2440, + 2618, + 2677, + 2703, + 5336, + 5502 ], "errorMessage": "check self.account entry exists" }, { "pc": [ - 1629, - 1861, - 1949, - 4585, - 6220, - 6543 + 1575, + 1807, + 1895, + 4531, + 6166, + 6489 ], "errorMessage": "check self.accrued_interest exists" }, { "pc": [ - 5153, - 6853 + 5099, + 6799 ], "errorMessage": "check self.arranger exists" }, { "pc": [ - 6861 + 6807 ], "errorMessage": "check self.asset_defaulted exists" }, { "pc": [ - 6869 + 6815 ], "errorMessage": "check self.asset_suspended exists" }, { "pc": [ - 3131, - 3577, - 3967, - 3979, - 4320, - 4533, - 5944 + 3077, + 3523, + 3913, + 3925, + 4266, + 4479, + 5890 ], "errorMessage": "check self.contract_type exists" }, { "pc": [ - 1597, - 4590, - 5418, - 5496 + 1543, + 4536, + 5364, + 5442 ], "errorMessage": "check self.cumulative_interest_index exists" }, { "pc": [ - 1609, - 4595, - 5429, - 5504 + 1555, + 4541, + 5375, + 5450 ], "errorMessage": "check self.cumulative_principal_index exists" }, { "pc": [ - 5954 + 5900 ], "errorMessage": "check self.dynamic_principal_redemption exists" }, { "pc": [ - 1365, - 1377, - 1438, - 1680, - 2680, - 2692, - 3813, - 4142, - 4561, - 4678, - 4690, - 4727, - 5511, - 6090, - 6172, - 6369, - 6424, - 6562 + 1311, + 1323, + 1384, + 1626, + 2626, + 2638, + 3759, + 4088, + 4507, + 4624, + 4636, + 4673, + 5457, + 6036, + 6118, + 6315, + 6370, + 6508 ], "errorMessage": "check self.event_cursor exists" }, { "pc": [ - 5444, - 5458, - 5651, - 5680, - 6010, - 6018, - 6045, - 6065, - 6255, - 6388, - 6549 + 5390, + 5404, + 5597, + 5626, + 5956, + 5964, + 5991, + 6011, + 6201, + 6334, + 6495 ], "errorMessage": "check self.fixed_point_scale exists" }, { "pc": [ - 6298 + 6244 ], "errorMessage": "check self.has_rate_reset_cap exists" }, { "pc": [ - 6271 + 6217 ], "errorMessage": "check self.has_rate_reset_floor exists" }, { "pc": [ - 3208, - 3593, - 4557, - 6189 + 3154, + 3539, + 4503, + 6135 ], "errorMessage": "check self.initial_exchange_amount exists" }, { "pc": [ - 2478, - 2488 + 2424, + 2434 ], "errorMessage": "check self.initial_exchange_date exists" }, { "pc": [ - 1805, - 4575, - 5986, - 6000 + 1751, + 4521, + 5932, + 5946 ], "errorMessage": "check self.interest_calculation_base exists" }, { "pc": [ - 1877, - 1892 + 1823, + 1838 ], "errorMessage": "check self.next_principal_redemption exists" }, { "pc": [ - 4580, - 5978, - 6005, - 6050 + 4526, + 5924, + 5951, + 5996 ], "errorMessage": "check self.nominal_interest_rate exists" }, { "pc": [ - 2055, - 2068 + 2001, + 2014 ], "errorMessage": "check self.op_daemon exists" }, { "pc": [ - 1702, - 1771, + 1648, + 1717, + 1743, 1797, - 1851, - 1903, - 1912, - 1934, - 4570, - 6528, - 6609 + 1849, + 1858, + 1880, + 4516, + 6474, + 6555 ], "errorMessage": "check self.outstanding_principal exists" }, { "pc": [ - 6306, - 6320 + 6252, + 6266 ], "errorMessage": "check self.rate_reset_cap exists" }, { "pc": [ - 6279, - 6293 + 6225, + 6239 ], "errorMessage": "check self.rate_reset_floor exists" }, { "pc": [ - 6250 + 6196 ], "errorMessage": "check self.rate_reset_multiplier exists" }, { "pc": [ - 6643 + 6589 ], "errorMessage": "check self.rate_reset_next exists" }, { "pc": [ - 6263 + 6209 ], "errorMessage": "check self.rate_reset_spread exists" }, { "pc": [ - 1553, - 2265, - 4600 + 1499, + 2211, + 4546 ], "errorMessage": "check self.reserved_interest exists" }, { "pc": [ - 1558, - 1587, - 2275, - 2290, - 4605 + 1504, + 1533, + 2221, + 2236, + 4551 ], "errorMessage": "check self.reserved_principal exists" }, { "pc": [ - 2465, - 2513, - 4552, - 5593, - 6125 + 2411, + 2459, + 4498, + 5539, + 6071 ], "errorMessage": "check self.reserved_units_total exists" }, { "pc": [ - 1369, - 2684, - 3817, - 3996, - 4013, - 4133, + 1315, + 2630, + 3763, + 3942, + 3959, + 4079, + 4280, + 4315, 4334, - 4369, - 4388, - 4508, - 4565, - 4682, - 5694, - 6365, - 6432 + 4454, + 4511, + 4628, + 5640, + 6311, + 6378 ], "errorMessage": "check self.schedule_entry_count exists" }, { "pc": [ - 4041, - 4416 + 3987, + 4362 ], "errorMessage": "check self.schedule_page entry exists" }, { "pc": [ - 1545, - 2155, - 2183, - 6715 + 1491, + 2101, + 2129, + 6661 ], "errorMessage": "check self.settlement_asset_id exists" }, { "pc": [ - 1308, - 1322, - 2040, - 2105, - 2419, - 2438, - 2565, - 2576, - 2859, - 3201, - 3581, - 3799, - 3945, - 4296, - 4310, - 4526, - 4673, - 5539, - 6116, - 6210 + 1254, + 1268, + 1986, + 2051, + 2365, + 2384, + 2511, + 2522, + 2805, + 3147, + 3527, + 3745, + 3891, + 4242, + 4256, + 4472, + 4619, + 5485, + 6062, + 6156 ], "errorMessage": "check self.status exists" }, { "pc": [ - 2471, - 2524, - 4547, - 5644, - 5675, - 6130 + 2417, + 2470, + 4493, + 5590, + 5621, + 6076 ], "errorMessage": "check self.total_units exists" }, { "pc": [ - 2603, - 2613 + 2549, + 2559 ], "errorMessage": "check self.transfer_closure_date exists" }, { "pc": [ - 2586, - 2594 + 2532, + 2540 ], "errorMessage": "check self.transfer_opening_date exists" }, { "pc": [ - 3636, - 3693 + 3582, + 3639 ], "errorMessage": "index access is out of bounds" }, { "pc": [ - 2024, - 3068, - 3551, - 4046, - 4421 + 1970, + 3014, + 3497, + 3992, + 4367 ], "errorMessage": "invalid array length header" }, { "pc": [ - 2789, - 3539, - 5125 + 2735, + 3485, + 5071 ], "errorMessage": "invalid number of bytes for arc4.bool" }, { "pc": [ - 2032 + 1978 ], "errorMessage": "invalid number of bytes for arc4.dynamic_array" }, { "pc": [ - 3566 + 3512 ], "errorMessage": "invalid number of bytes for arc4.dynamic_array" }, { "pc": [ - 2018, - 2403, - 2543, - 2551, - 2781, - 2839, - 2847, - 2927, - 2935, - 2978, - 3003, - 4746, - 4770, - 4804, - 4985, - 5167, - 5251 + 1964, + 2349, + 2489, + 2497, + 2727, + 2785, + 2793, + 2873, + 2881, + 2924, + 2949, + 4692, + 4716, + 4750, + 4931, + 5113, + 5197 ], "errorMessage": "invalid number of bytes for arc4.static_array" }, { "pc": [ - 1303, - 2361, - 2370, - 2411, - 2560, - 3529, - 3930 + 1249, + 2307, + 2316, + 2357, + 2506, + 3475, + 3876 ], "errorMessage": "invalid number of bytes for arc4.uint64" }, { "pc": [ - 4794, - 4975, - 5241 + 4740, + 4921, + 5187 ], "errorMessage": "invalid number of bytes for arc4.uint8" }, { "pc": [ - 3040 + 2986 ], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.InitialKernelState" }, { "pc": [ - 3029 + 2975 ], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.NormalizedActusTerms" }, { "pc": [ - 4292 + 4238 ], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.ObservedCashEventRequest" }, { "pc": [ - 3941 + 3887 ], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.ObservedEventRequest" }, { "pc": [ - 3073 + 3019 ], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.Prospectus" }, { "pc": [ - 4815 + 4761 ], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.RoleValidity" }, { "pc": [ - 3057 + 3003 ], "errorMessage": "invalid tail pointer at index 1 of (uint8[32],(len+utf8[]))" }, { "pc": [ - 3052 + 2998 ], "errorMessage": "invalid tuple encoding" }, { "pc": [ - 4113, - 4488 + 4059, + 4434 ], "errorMessage": "max array length exceeded" }, { "pc": [ - 4539, - 6707 + 4485, + 6653 ], "errorMessage": "overflow" } @@ -2288,11 +2317,11 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCAzMiAxNTAwCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUgInN0YXR1cyIgImV2ZW50X2N1cnNvciIgInNjaGVkdWxlX2VudHJ5X2NvdW50IiAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIiAiZml4ZWRfcG9pbnRfc2NhbGUiICJhY2NydWVkX2ludGVyZXN0IiAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIgMHg1MjIzNDE2MzYzNmY3NTZlNzQyMyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIiAiY29udHJhY3RfdHlwZSIgInJlc2VydmVkX3VuaXRzX3RvdGFsIiAicmVzZXJ2ZWRfcHJpbmNpcGFsIiAidG90YWxfdW5pdHMiICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIiAicmVzZXJ2ZWRfaW50ZXJlc3QiICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IiAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiIDB4NTIyMzQxNzI3MjYxNmU2NzY1NzIyMyAic2V0dGxlbWVudF9hc3NldF9pZCIgImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IiAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzIDB4NTIyMzQxNjM2MzZmNzU2ZTc0NGQ2MTZlNjE2NzY1NzIyMyAweDUzMjMgMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzIDB4NTIyMzRmNzA0NDYxNjU2ZDZmNmUyMyAiaW5pdGlhbF9leGNoYW5nZV9kYXRlIiAidHJhbnNmZXJfb3BlbmluZ19kYXRlIiAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIiAicmF0ZV9yZXNldF9mbG9vciIgInJhdGVfcmVzZXRfY2FwIiAweDUyMjM1NDcyNzU3Mzc0NjU2NTIzICJhc3NldF9zdXNwZW5kZWQiICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIiAicmF0ZV9yZXNldF9zcHJlYWQiICJyYXRlX3Jlc2V0X211bHRpcGxpZXIiICJyYXRlX3Jlc2V0X25leHQiICJoYXNfcmF0ZV9yZXNldF9mbG9vciIgImhhc19yYXRlX3Jlc2V0X2NhcCIgMHgwMCAiYXNzZXRfZGVmYXVsdGVkIiAicHJvc3BlY3R1c19oYXNoIiAicHJvc3BlY3R1c191cmwiICJkZW5vbWluYXRpb25fYXNzZXRfaWQiICJtYXR1cml0eV9kYXRlIiAiZGF5X2NvdW50X2NvbnZlbnRpb24iIDB4MDY4MTAxIDB4MDAwMAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4LTI5CiAgICAvLyAjIFJCQUMgUm9sZXMKICAgIC8vIHNlbGYuYXJyYW5nZXIgPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX0FSUkFOR0VSKQogICAgYnl0ZWMgMTggLy8gMHg1MjIzNDE3MjcyNjE2ZTY3NjU3MjIzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzAKICAgIC8vIHNlbGYub3BfZGFlbW9uID0gR2xvYmFsU3RhdGUoQWNjb3VudCgpLCBrZXk9Y3N0LlBSRUZJWF9JRF9PUF9EQUVNT04pCiAgICBieXRlYyAyNiAvLyAweDUyMjM0ZjcwNDQ2MTY1NmQ2ZjZlMjMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo0Ny00OAogICAgLy8gIyBELUFTQSBHb3Zlcm5hbmNlCiAgICAvLyBzZWxmLmFzc2V0X3N1c3BlbmRlZCA9IEZhbHNlCiAgICBieXRlYyAzMyAvLyAiYXNzZXRfc3VzcGVuZGVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NDkKICAgIC8vIHNlbGYuYXNzZXRfZGVmYXVsdGVkID0gRmFsc2UKICAgIGJ5dGVjIDQxIC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU2LTU3CiAgICAvLyAjIENvbnRyYWN0CiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwLTYxCiAgICAvLyAjIFByb3NwZWN0dXMgKEluZm9ybWF0aW9uYWwpCiAgICAvLyBzZWxmLnByb3NwZWN0dXNfaGFzaCA9IEJ5dGVzKCkKICAgIGJ5dGVjIDQyIC8vICJwcm9zcGVjdHVzX2hhc2giCiAgICBwdXNoYnl0ZXMgMHgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MgogICAgLy8gc2VsZi5wcm9zcGVjdHVzX3VybCA9IFN0cmluZygpCiAgICBieXRlYyA0MyAvLyAicHJvc3BlY3R1c191cmwiCiAgICBwdXNoYnl0ZXMgIiIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NC02NQogICAgLy8gIyBEZW5vbWluYXRpb24KICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gQXNzZXQoKQogICAgYnl0ZWMgNDQgLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjYKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCA9IEFzc2V0KCkKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OC02OQogICAgLy8gIyBUaW1lCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgMjcgLy8gImluaXRpYWxfZXhjaGFuZ2VfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzAKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgNDUgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxCiAgICAvLyBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgMjggLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIKICAgIC8vIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlID0gdHlwLlRpbWVTdGFtcCgpCiAgICBieXRlYyAyOSAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NC03NQogICAgLy8gIyBEYXkgQ291bnQgQ29udmVudGlvbgogICAgLy8gc2VsZi5kYXlfY291bnRfY29udmVudGlvbiA9IFVJbnQ2NCgpCiAgICBieXRlYyA0NiAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc3LTc4CiAgICAvLyAjIFVuaXRzCiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzID0gVUludDY0KCkKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPSBVSW50NjQoKQogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MS04MgogICAgLy8gIyBQcmluY2lwYWwKICAgIC8vIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPSBVSW50NjQoKQogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MwogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBVSW50NjQoKQogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NAogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gVUludDY0KCkKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NQogICAgLy8gc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gRmFsc2UKICAgIGJ5dGVjIDM0IC8vICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4Ny04OAogICAgLy8gIyBJbnRlcmVzdAogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gVUludDY0KCkKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg5CiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgPSBVSW50NjQoKQogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTEtOTIKICAgIC8vICMgSW50ZXJlc3QgUmF0ZXMKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTMKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQgPSBVSW50NjQoKQogICAgYnl0ZWMgMzUgLy8gInJhdGVfcmVzZXRfc3ByZWFkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NAogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIgPSBVSW50NjQoKQogICAgYnl0ZWMgMzYgLy8gInJhdGVfcmVzZXRfbXVsdGlwbGllciIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTUKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9mbG9vciA9IFVJbnQ2NCgpCiAgICBieXRlYyAzMCAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTYKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9jYXAgPSBVSW50NjQoKQogICAgYnl0ZWMgMzEgLy8gInJhdGVfcmVzZXRfY2FwIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NwogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X25leHQgPSBVSW50NjQoKQogICAgYnl0ZWMgMzcgLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTgKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgPSBGYWxzZQogICAgYnl0ZWMgMzggLy8gImhhc19yYXRlX3Jlc2V0X2Zsb29yIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OQogICAgLy8gc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgPSBGYWxzZQogICAgYnl0ZWMgMzkgLy8gImhhc19yYXRlX3Jlc2V0X2NhcCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAxLTEwMgogICAgLy8gIyBQcmltYXJ5IERpc3RyaWJ1dGlvbgogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgPSBVSW50NjQoKQogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAzCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0ID0gVUludDY0KCkKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA1LTEwNgogICAgLy8gIyBDdW11bGF0aXZlIFBlci1Vbml0IEZpeGVkLVBvaW50IEluZGV4ZXMKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4ID0gVUludDY0KCkKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1CiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciA9IFVJbnQ2NCgpCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNgogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA9IFVJbnQ2NCgpCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE4LTExOQogICAgLy8gIyBTY2FsaW5nCiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlID0gVUludDY0KCkKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6MjMKICAgIC8vIGFzc2VydCBUeG4uZ2xvYmFsX251bV9ieXRlX3NsaWNlID09IGNmZy5HTE9CQUxfQllURVMsIGVyci5XUk9OR19HTE9CQUxfQllURVMKICAgIHR4biBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgQnl0ZXMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjI0CiAgICAvLyBhc3NlcnQgVHhuLmdsb2JhbF9udW1fdWludCA9PSBjZmcuR0xPQkFMX1VJTlRTLCBlcnIuV1JPTkdfR0xPQkFMX1VJTlRTCiAgICB0eG4gR2xvYmFsTnVtVWludAogICAgcHVzaGludCAzNwogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgVUludHMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBhc3NlcnQgVHhuLmxvY2FsX251bV9ieXRlX3NsaWNlID09IGNmZy5MT0NBTF9CWVRFUywgZXJyLldST05HX0xPQ0FMX0JZVEVTCiAgICB0eG4gTG9jYWxOdW1CeXRlU2xpY2UKICAgICEKICAgIGFzc2VydCAvLyBXcm9uZyBMb2NhbCBCeXRlcyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6MjYKICAgIC8vIGFzc2VydCBUeG4ubG9jYWxfbnVtX3VpbnQgPT0gY2ZnLkxPQ0FMX1VJTlRTLCBlcnIuV1JPTkdfTE9DQUxfVUlOVFMKICAgIHR4biBMb2NhbE51bVVpbnQKICAgICEKICAgIGFzc2VydCAvLyBXcm9uZyBMb2NhbCBVSW50cyBhbGxvY2F0aW9uCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kX2FzYS9jb250cmFjdC5weTo4LTE4CiAgICAvLyBjbGFzcyBEQVNBKAogICAgLy8gICAgIFBheW1lbnRBZ2VudCwKICAgIC8vICAgICBUcmFuc2ZlckFnZW50LAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gICAgIGF2bV92ZXJzaW9uPTEyLAogICAgLy8gKToKICAgIHB1c2hieXRlcyAweDkxNGYwNGViIC8vIG1ldGhvZCAiY29udHJhY3RfdXBkYXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9jb250cmFjdF91cGRhdGVfcm91dGVANAoKbWFpbl9zd2l0Y2hfY2FzZV9uZXh0QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6OC0xOAogICAgLy8gY2xhc3MgREFTQSgKICAgIC8vICAgICBQYXltZW50QWdlbnQsCiAgICAvLyAgICAgVHJhbnNmZXJBZ2VudCwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBhdm1fdmVyc2lvbj0xMiwKICAgIC8vICk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBieiBtYWluX2NyZWF0ZV9Ob09wQDMyCiAgICBwdXNoYnl0ZXNzIDB4YjQ0NjE4YzggMHhlNzgzMjUyOSAweDk0Mzg4NzIzIDB4NmM4NWUzZWUgMHhiZGQxYTk0NCAweDdjMGYxODEyIDB4MTRmYzEwZWYgMHg3NGE3Mjk3ZiAweDA5ZDRmZTE0IDB4OWE5YmZhODUgMHg4NWVlZDMzZCAweGFiMmMwZmM0IDB4ZDlmMjI1YWMgMHg5ODgzNTA1YSAweDhlYTZlNzRjIDB4MDJhZjU1N2EgMHg4MmY3MWIyZCAweGVmMDRmNWQzIDB4ZGYzNDM1NTAgMHgzZGJlODBiZCAweDFlM2U0OGU3IDB4MDEwYzgyOTkgMHg3NDA2YWNkMiAweDFhNzJhMmVlIC8vIG1ldGhvZCAiZnVuZF9kdWVfY2FzaGZsb3dzKHVpbnQ2NCkodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImNsYWltX2R1ZV9jYXNoZmxvd3MoYWRkcmVzcyxieXRlW10pKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxieXRlW10pIiwgbWV0aG9kICJ0cmFuc2Zlcl9zZXRfc2NoZWR1bGUodWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInByaW1hcnlfZGlzdHJpYnV0aW9uKGFkZHJlc3MsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidHJhbnNmZXIoYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgImFjY291bnRfc3VzcGVuc2lvbihhZGRyZXNzLGJvb2wpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X29wZW4oYWRkcmVzcyxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAiYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzKGFkZHJlc3MsYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgImFjY291bnRfZ2V0X3Bvc2l0aW9uKGFkZHJlc3MpKGFkZHJlc3MsdWludDY0LHVpbnQ2NCxib29sLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJjb250cmFjdF9jb25maWcoKHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LGJvb2wsYm9vbCxib29sLHVpbnQ2NCksKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSwoYnl0ZVszMl0sc3RyaW5nKSl1aW50NjQiLCBtZXRob2QgImNvbnRyYWN0X3NjaGVkdWxlKHVpbnQ2NCxib29sLCh1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KVtdKXVpbnQ2NCIsIG1ldGhvZCAiY29udHJhY3RfZXhlY3V0ZV9pZWQoKXVpbnQ2NCIsIG1ldGhvZCAiYXBwbHlfbm9uX2Nhc2hfZXZlbnQodWludDY0LCh1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkpdWludDY0IiwgbWV0aG9kICJhcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudCgodWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkpdWludDY0IiwgbWV0aG9kICJjb250cmFjdF9nZXRfc3RhdGUoKSh1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAiY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50KCkodWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgInJiYWNfcm90YXRlX2FycmFuZ2VyKGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX3NldF9vcF9kYWVtb24oYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgInJiYWNfYXNzaWduX3JvbGUodWludDgsYWRkcmVzcywodWludDY0LHVpbnQ2NCkpdWludDY0IiwgbWV0aG9kICJyYmFjX3Jldm9rZV9yb2xlKHVpbnQ4LGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX2NvbnRyYWN0X3N1c3BlbnNpb24oYm9vbCl1aW50NjQiLCBtZXRob2QgInJiYWNfZ2V0X2FycmFuZ2VyKClhZGRyZXNzIiwgbWV0aG9kICJyYmFjX2dldF9hZGRyZXNzX3JvbGVzKGFkZHJlc3MpKGJvb2wsYm9vbCxib29sLGJvb2wsYm9vbCkiLCBtZXRob2QgInJiYWNfZ2V0X3JvbGVfdmFsaWRpdHkodWludDgsYWRkcmVzcykodWludDY0LHVpbnQ2NCkiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBmdW5kX2R1ZV9jYXNoZmxvd3MgY2xhaW1fZHVlX2Nhc2hmbG93cyB0cmFuc2Zlcl9zZXRfc2NoZWR1bGUgcHJpbWFyeV9kaXN0cmlidXRpb24gdHJhbnNmZXIgYWNjb3VudF9zdXNwZW5zaW9uIGFjY291bnRfb3BlbiBhY2NvdW50X3VwZGF0ZV9wYXltZW50X2FkZHJlc3MgYWNjb3VudF9nZXRfcG9zaXRpb24gY29udHJhY3RfY29uZmlnIGNvbnRyYWN0X3NjaGVkdWxlIGNvbnRyYWN0X2V4ZWN1dGVfaWVkIGFwcGx5X25vbl9jYXNoX2V2ZW50IGFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50IGNvbnRyYWN0X2dldF9zdGF0ZSBjb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnQgcmJhY19yb3RhdGVfYXJyYW5nZXIgcmJhY19zZXRfb3BfZGFlbW9uIHJiYWNfYXNzaWduX3JvbGUgcmJhY19yZXZva2Vfcm9sZSByYmFjX2NvbnRyYWN0X3N1c3BlbnNpb24gcmJhY19nZXRfYXJyYW5nZXIgcmJhY19nZXRfYWRkcmVzc19yb2xlcyByYmFjX2dldF9yb2xlX3ZhbGlkaXR5CiAgICBlcnIKCm1haW5fY3JlYXRlX05vT3BAMzI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6OC0xOAogICAgLy8gY2xhc3MgREFTQSgKICAgIC8vICAgICBQYXltZW50QWdlbnQsCiAgICAvLyAgICAgVHJhbnNmZXJBZ2VudCwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBhdm1fdmVyc2lvbj0xMiwKICAgIC8vICk6CiAgICBwdXNoYnl0ZXMgMHg5NTZkNzE1NiAvLyBtZXRob2QgImNvbnRyYWN0X2NyZWF0ZShhZGRyZXNzKXVpbnQ2NCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIGNvbnRyYWN0X2NyZWF0ZQogICAgZXJyCgptYWluX2NvbnRyYWN0X3VwZGF0ZV9yb3V0ZUA0OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgcHVzaGludCA0IC8vIFVwZGF0ZUFwcGxpY2F0aW9uCiAgICA9PQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICYmCiAgICBhc3NlcnQKICAgIGIgY29udHJhY3RfdXBkYXRlCgoKLy8gX3B1eWFfbGliLnV0aWwuZW5zdXJlX2J1ZGdldChyZXF1aXJlZF9idWRnZXQ6IHVpbnQ2NCwgZmVlX3NvdXJjZTogdWludDY0KSAtPiB2b2lkOgplbnN1cmVfYnVkZ2V0OgogICAgcHJvdG8gMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMTAKICAgICsKCmVuc3VyZV9idWRnZXRfd2hpbGVfdG9wQDE6CiAgICBmcmFtZV9kaWcgMAogICAgZ2xvYmFsIE9wY29kZUJ1ZGdldAogICAgPgogICAgYnogZW5zdXJlX2J1ZGdldF9hZnRlcl93aGlsZUA2CiAgICBpdHhuX2JlZ2luCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgYnl0ZWMgNDcgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtCiAgICBieXRlYyA0NyAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbQogICAgZnJhbWVfZGlnIC0xCiAgICBzd2l0Y2ggZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8wQDMgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8xQDQKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfbmV4dEA1OgogICAgaXR4bl9zdWJtaXQKICAgIGIgZW5zdXJlX2J1ZGdldF93aGlsZV90b3BAMQoKZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8xQDQ6CiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgYiBlbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX25leHRANQoKZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8wQDM6CiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGIgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV9uZXh0QDUKCmVuc3VyZV9idWRnZXRfYWZ0ZXJfd2hpbGVANjoKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucGF5bWVudF9hZ2VudC5QYXltZW50QWdlbnQuZnVuZF9kdWVfY2FzaGZsb3dzW3JvdXRpbmddKCkgLT4gdm9pZDoKZnVuZF9kdWVfY2FzaGZsb3dzOgogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAxMwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NTEKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjUyCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjUzCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo1NQogICAgLy8gaWYgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCk6CiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo1OS02MAogICAgLy8gKyBtYXhfZXZlbnRfY291bnQKICAgIC8vICogVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfUEVSX0VWRU5UX0JVREdFVCkKICAgIGR1cAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjYwCiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfRlVORF9EVUVfQ0FTSEZMT1dTX1BFUl9FVkVOVF9CVURHRVQpCiAgICBwdXNoaW50IDEwMAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjU5LTYwCiAgICAvLyArIG1heF9ldmVudF9jb3VudAogICAgLy8gKiBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19QRVJfRVZFTlRfQlVER0VUKQogICAgKgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjU4CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19CQVNFX0JVREdFVCkKICAgIGludGMgNCAvLyAxNTAwCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NTgtNjAKICAgIC8vIFVJbnQ2NChjc3QuT1BfVVBfRlVORF9EVUVfQ0FTSEZMT1dTX0JBU0VfQlVER0VUKQogICAgLy8gKyBtYXhfZXZlbnRfY291bnQKICAgIC8vICogVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfUEVSX0VWRU5UX0JVREdFVCkKICAgICsKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo1Ni02MgogICAgLy8gZW5zdXJlX2J1ZGdldCgKICAgIC8vICAgICByZXF1aXJlZF9idWRnZXQ9KAogICAgLy8gICAgICAgICBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19CQVNFX0JVREdFVCkKICAgIC8vICAgICAgICAgKyBtYXhfZXZlbnRfY291bnQKICAgIC8vICAgICAgICAgKiBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19QRVJfRVZFTlRfQlVER0VUKQogICAgLy8gICAgICksCiAgICAvLyApCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjY0CiAgICAvLyBwcm9jZXNzZWRfZXZlbnRzID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA1CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjUKICAgIC8vIGZ1bmRlZF9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2NgogICAgLy8gZnVuZGVkX3ByaW5jaXBhbCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTMKCmZ1bmRfZHVlX2Nhc2hmbG93c193aGlsZV90b3BANDoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2OQogICAgLy8gcHJvY2Vzc2VkX2V2ZW50cyA8IG1heF9ldmVudF9jb3VudAogICAgZGlnIDQKICAgIGRpZyAxCiAgICA8CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjktNzAKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgPCBtYXhfZXZlbnRfY291bnQKICAgIC8vIGFuZCBzZWxmLmV2ZW50X2N1cnNvciA8IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQKICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl93aGlsZUAxMQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjcwCiAgICAvLyBhbmQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIDwKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2OS03MAogICAgLy8gcHJvY2Vzc2VkX2V2ZW50cyA8IG1heF9ldmVudF9jb3VudAogICAgLy8gYW5kIHNlbGYuZXZlbnRfY3Vyc29yIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudAogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDExCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzIKICAgIC8vIGVudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KHNlbGYuZXZlbnRfY3Vyc29yKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIGR1cAogICAgYnVyeSAxNwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjczCiAgICAvLyBpZiBlbnRyeS5zY2hlZHVsZWRfdGltZSA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wOgogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDMKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgID4KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAMTEKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3NQogICAgLy8gaWYgbm90IHNlbGYuX2V2ZW50X2lzX2Nhc2goZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSk6CiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ1cnkgMTYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM1MQogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUCksCiAgICBpbnRjXzIgLy8gOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzUwLTM1NAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfTUQpLAogICAgLy8gKQogICAgPT0KICAgIGR1cAogICAgYnVyeSA0CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfdHJ1ZUA1MgogICAgZGlnIDE0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNTIKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNTAtMzU0CiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9NRCksCiAgICAvLyApCiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX3RydWVANTIKICAgIGRpZyAxNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzUzCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX01EKSwKICAgIHB1c2hpbnQgMTkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM1MC0zNTQKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX01EKSwKICAgIC8vICkKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUA1MwoKZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfdHJ1ZUA1MjoKICAgIGludGNfMSAvLyAxCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUA1NDoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3NQogICAgLy8gaWYgbm90IHNlbGYuX2V2ZW50X2lzX2Nhc2goZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSk6CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAMTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU0OAogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X2lkID09IHNlbGYuZXZlbnRfY3Vyc29yLCBlcnIuSU5WQUxJRF9FVkVOVF9DVVJTT1IKICAgIGRpZyAxNQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBjdXJzb3IKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU0OQogICAgLy8gYXNzZXJ0IGVudHJ5LnNjaGVkdWxlZF90aW1lIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLCBlcnIuTk9fRFVFX0NBU0hGTE9XCiAgICBkaWcgMQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPD0KICAgIGFzc2VydCAvLyBObyBkdWUgY2FzaGZsb3cgdG8gcGF5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MTMKICAgIC8vIGlmIGV2ZW50X3R5cGUgbm90IGluIChVSW50NjQoZW51bXMuRVZUX0lQKSwgVUludDY0KGVudW1zLkVWVF9NRCkpOgogICAgZGlnIDIKICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNQogICAgZGlnIDE0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MTQKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDExCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfaW50ZXJlc3RfYW1vdW50QDE2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDI2CiAgICAvLyBldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBidXJ5IDE2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MjcKICAgIC8vIGlmIGV2ZW50X3R5cGUgbm90IGluIChVSW50NjQoZW51bXMuRVZUX1BSKSwgVUludDY0KGVudW1zLkVWVF9NRCkpOgogICAgcHVzaGludCAzCiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE5CiAgICBkaWcgMTQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQyOAogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNgoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnRAMjg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTMKICAgIC8vIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGRpZyAxNQogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTU2CiAgICAvLyBpZiBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKToKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDI5CiAgICBkaWcgNwogICAgYnVyeSA5CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzODoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU3Mi01NzQKICAgIC8vICMgRnVuZGluZyB1c2VzIHBlci11bml0IGN1bXVsYXRpdmUgaW5kaWNlcyBzbyBlYWNoIGhvbGRlciBjYW4gc2V0dGxlCiAgICAvLyAjIGluZGVwZW5kZW50bHkgZnJvbSBpdHMgY3VycmVudCB1bml0IGJhbGFuY2UuCiAgICAvLyBpbnRlcmVzdF9pbmRleF9kZWx0YSA9IHNlbGYuX2Ftb3VudF90b19pbmRleF9kZWx0YShpbnRlcmVzdF9hbW91bnRfZHVlKQogICAgZGlnIDEwCiAgICBjYWxsc3ViIF9hbW91bnRfdG9faW5kZXhfZGVsdGEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU3NQogICAgLy8gcHJpbmNpcGFsX2luZGV4X2RlbHRhID0gc2VsZi5fYW1vdW50X3RvX2luZGV4X2RlbHRhKHByaW5jaXBhbF9hbW91bnRfZHVlKQogICAgZGlnIDYKICAgIGNhbGxzdWIgX2Ftb3VudF90b19pbmRleF9kZWx0YQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTc2CiAgICAvLyBpbnRlcmVzdF9hbW91bnQgPSBzZWxmLl9pbmRleF9kZWx0YV90b19hbW91bnQoaW50ZXJlc3RfaW5kZXhfZGVsdGEpCiAgICBkaWcgMQogICAgY2FsbHN1YiBfaW5kZXhfZGVsdGFfdG9fYW1vdW50CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgMTUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU3NwogICAgLy8gcHJpbmNpcGFsX2Ftb3VudCA9IHNlbGYuX2luZGV4X2RlbHRhX3RvX2Ftb3VudChwcmluY2lwYWxfaW5kZXhfZGVsdGEpCiAgICBkdXAKICAgIGNhbGxzdWIgX2luZGV4X2RlbHRhX3RvX2Ftb3VudAogICAgZHVwCiAgICBidXJ5IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzgKICAgIC8vIHJlcXVpcmVkX2Ftb3VudCA9IGludGVyZXN0X2Ftb3VudCArIHByaW5jaXBhbF9hbW91bnQKICAgIGRpZyAyCiAgICBkaWcgMQogICAgKwogICAgZHVwCiAgICBidXJ5IDkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjczNAogICAgLy8gYmFsYW5jZSA9IHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ1NgogICAgLy8gcmV0dXJuIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgKyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIGRpZyAxCiAgICArCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MzYKICAgIC8vIGFzc2VydCBiYWxhbmNlID49IHJlc2VydmVkX3RvdGFsLCBlcnIuTk9UX0VOT1VHSF9GVU5EUwogICAgZGlnIDIKICAgIGRpZyAxCiAgICA+PQogICAgYXNzZXJ0IC8vIE5vdCBlbm91Z2ggZnVuZHMgZm9yIHRoZSBwYXltZW50CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MzcKICAgIC8vIHJldHVybiBiYWxhbmNlIC0gcmVzZXJ2ZWRfdG90YWwKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTgwCiAgICAvLyBzZWxmLl9hdmFpbGFibGVfc2V0dGxlbWVudF9mdW5kcygpID49IHJlcXVpcmVkX2Ftb3VudAogICAgdW5jb3ZlciAyCiAgICA+PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTc5LTU4MQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLl9hdmFpbGFibGVfc2V0dGxlbWVudF9mdW5kcygpID49IHJlcXVpcmVkX2Ftb3VudAogICAgLy8gKSwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTgzCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0ICs9IGludGVyZXN0X2Ftb3VudAogICAgdW5jb3ZlciAzCiAgICArCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTg0CiAgICAvLyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCArPSBwcmluY2lwYWxfYW1vdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICArCiAgICBieXRlYyAxMiAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4NQogICAgLy8gc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4ICs9IGludGVyZXN0X2luZGV4X2RlbHRhCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCBleGlzdHMKICAgIHVuY292ZXIgMgogICAgKwogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTg2CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4ICs9IHByaW5jaXBhbF9pbmRleF9kZWx0YQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCBleGlzdHMKICAgICsKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1ODcKICAgIC8vIGlmIGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkgPT0gVUludDY0KGVudW1zLkVWVF9QUik6CiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBwdXNoaW50IDMKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDQwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1ODgtNTg5CiAgICAvLyAjIEZvciBQUiwgdGhlIHBlcmlvZCBpbnRlcmVzdCBzdGF5cyBhY2NydWVkIHVudGlsIGEgbGF0ZXIgSVAgb3IgTUQuCiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgKz0gc2VsZi5fZW50cnlfaW50ZXJlc3Rfc2VnbWVudChlbnRyeSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBkaWcgMTYKICAgIGNhbGxzdWIgX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQKICAgIGJ1cnkgMTgKICAgICsKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTIKICAgIC8vIGlmIG5vdCBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKSBvciBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NCgKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlANDMKICAgIGRpZyAxNQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5Mi01OTQKICAgIC8vIGlmIG5vdCBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKSBvciBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NCgKICAgIC8vICAgICBlbnVtcy5FVlRfTUQKICAgIC8vICk6CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDQKCmZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDQzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTk1CiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBkaWcgMTUKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0NDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5NgogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgZGlnIDgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTcKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IG5leHRfaW50ZXJlc3RfYmFzZQogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGRpZyA5CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTk4CiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MDAKICAgIC8vIGlmIGVudHJ5LmV2ZW50X3R5cGUgPT0gYXJjNC5VSW50OCgKICAgIGRpZyAxNQogICAgZXh0cmFjdCA4IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwMC02MDIKICAgIC8vIGlmIGVudHJ5LmV2ZW50X3R5cGUgPT0gYXJjNC5VSW50OCgKICAgIC8vICAgICBlbnVtcy5FVlRfTUQKICAgIC8vICkgYW5kIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID09IFVJbnQ2NCgwKToKICAgIHB1c2hieXRlcyAweDEzCiAgICBiPT0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQ3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MDIKICAgIC8vICkgYW5kIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID09IFVJbnQ2NCgwKToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAwLTYwMgogICAgLy8gaWYgZW50cnkuZXZlbnRfdHlwZSA9PSBhcmM0LlVJbnQ4KAogICAgLy8gICAgIGVudW1zLkVWVF9NRAogICAgLy8gKSBhbmQgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPT0gVUludDY0KDApOgogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQ3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MDMKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGVudW1zLlNUQVRVU19FTkRFRCkKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgMjAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjA0CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQ3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjA2LTYxMAogICAgLy8gc2VsZi5fZW1pdF9leGVjdXRpb25fZXZlbnQoCiAgICAvLyAgICAgZW50cnk9ZW50cnksCiAgICAvLyAgICAgcGF5b2ZmPWludGVyZXN0X2Ftb3VudCArIHByaW5jaXBhbF9hbW91bnQsCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9aW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudCwKICAgIC8vICkKICAgIGRpZyAxNQogICAgZGlnIDQKICAgIGR1cAogICAgY2FsbHN1YiBfZW1pdF9leGVjdXRpb25fZXZlbnQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojc5CiAgICAvLyBmdW5kZWRfaW50ZXJlc3QgKz0gaW50ZXJlc3RfYW1vdW50CiAgICBkaWcgMTMKICAgIGRpZyAxMgogICAgKwogICAgYnVyeSAxNAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjgwCiAgICAvLyBmdW5kZWRfcHJpbmNpcGFsICs9IHByaW5jaXBhbF9hbW91bnQKICAgIGRpZyAxMgogICAgZGlnIDcKICAgICsKICAgIGJ1cnkgMTMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4MQogICAgLy8gcHJvY2Vzc2VkX2V2ZW50cyArPSBVSW50NjQoMSkKICAgIGRpZyA0CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSA1CiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c193aGlsZV90b3BANAoKZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUA0MDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5MQogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ID0gVUludDY0KDApCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQxCgpmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUAyOToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1NwogICAgLy8gZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGRpZyAxNQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSAxNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTU4LTU2MAogICAgLy8gIyBEeW5hbWljIGFubnVpdGllcyBkZXJpdmUgbmV4dCBzdGF0ZSBmcm9tIHRoZSBwYXltZW50IGRlY29tcG9zaXRpb24sCiAgICAvLyAjIG5vdCBvbmx5IGZyb20gdGhlIHByZWNvbXB1dGVkIGBuZXh0XypgIGZpZWxkcy4KICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QUik6CiAgICBwdXNoaW50IDMKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDMxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjIKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIC0gcHJpbmNpcGFsX2Ftb3VudF9kdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgZGlnIDYKICAgIC0KICAgIGR1cAogICAgYnVyeSA5CiAgICBidXJ5IDkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzgKCmZ1bmRfZHVlX2Nhc2hmbG93c19lbHNlX2JvZHlAMzE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjUKICAgIC8vIGVsaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX0lQKToKICAgIGRpZyAxNAogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDMzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjYKICAgIC8vIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgYnVyeSA5CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjcKICAgIC8vIG5leHRfaW50ZXJlc3RfYmFzZSA9IHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgYnVyeSAxMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSBleGlzdHMKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzgKCmZ1bmRfZHVlX2Nhc2hmbG93c19lbHNlX2JvZHlAMzM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjgKICAgIC8vIGVsaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKToKICAgIGRpZyAxNAogICAgcHVzaGludCAxOQogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUAzNAogICAgZGlnIDcKICAgIGJ1cnkgOQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlAMzQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjkKICAgIC8vIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzAKICAgIC8vIG5leHRfaW50ZXJlc3RfYmFzZSA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgOQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MjkKICAgIC8vIGlmIHNlbGYuX2lzX2R5bmFtaWNfYW5udWl0eSgpOgogICAgY2FsbHN1YiBfaXNfZHluYW1pY19hbm51aXR5CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyNwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDMwCiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfTUQpOgogICAgZGlnIDE0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzMQogICAgLy8gcmV0dXJuIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTUyCiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzMgogICAgLy8gaW50ZXJlc3RfZHVlID0gc2VsZi5hY2NydWVkX2ludGVyZXN0ICsgc2VsZi5fZW50cnlfaW50ZXJlc3Rfc2VnbWVudChlbnRyeSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBkaWcgMTYKICAgIGNhbGxzdWIgX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQKICAgIGJ1cnkgMTgKICAgICsKICAgIGR1cAogICAgYnVyeSAxMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDMzCiAgICAvLyBpZiBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPD0gaW50ZXJlc3RfZHVlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gZXhpc3RzCiAgICA+PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzNAogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTUyCiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyNDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzNQogICAgLy8gcHJpbmNpcGFsX2Ftb3VudCA9IHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiAtIGludGVyZXN0X2R1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gZXhpc3RzCiAgICBkaWcgMTAKICAgIC0KICAgIGR1cAogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzYKICAgIC8vIGlmIHByaW5jaXBhbF9hbW91bnQgPiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgPgogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzNwogICAgLy8gcmV0dXJuIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTUyCiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyNjoKICAgIGRpZyA2CiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NDAKICAgIC8vIGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsIDw9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBkaWcgMTUKICAgIHB1c2hpbnQgNDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGR1cDIKICAgIDw9CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzktNDQxCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsIDw9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ0MgogICAgLy8gcmV0dXJuIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIC0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIHN3YXAKICAgIC0KICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTUyCiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQxNQogICAgLy8gcmV0dXJuIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCArIHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZGlnIDE2CiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBidXJ5IDE4CiAgICArCiAgICBidXJ5IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTEKICAgIC8vIGludGVyZXN0X2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9pbnRlcmVzdF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9pbnRlcmVzdF9hbW91bnRAMTYKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl93aGlsZUAxMToKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4MwogICAgLy8gYXNzZXJ0IHByb2Nlc3NlZF9ldmVudHMgPiBVSW50NjQoMCksIGVyci5OT19EVUVfQ0FTSEZMT1cKICAgIGRpZyA0CiAgICBkdXAKICAgIGFzc2VydCAvLyBObyBkdWUgY2FzaGZsb3cgdG8gcGF5CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODcKICAgIC8vIHRvdGFsX2Z1bmRlZD1mdW5kZWRfaW50ZXJlc3QgKyBmdW5kZWRfcHJpbmNpcGFsLAogICAgZGlnIDE0CiAgICBkdXAKICAgIGRpZyAxNQogICAgZHVwCiAgICBjb3ZlciAzCiAgICArCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODkKICAgIC8vIHRpbWVzdGFtcD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4NC05MAogICAgLy8gcmV0dXJuIHR5cC5DYXNoRnVuZGluZ1Jlc3VsdCgKICAgIC8vICAgICBmdW5kZWRfaW50ZXJlc3Q9ZnVuZGVkX2ludGVyZXN0LAogICAgLy8gICAgIGZ1bmRlZF9wcmluY2lwYWw9ZnVuZGVkX3ByaW5jaXBhbCwKICAgIC8vICAgICB0b3RhbF9mdW5kZWQ9ZnVuZGVkX2ludGVyZXN0ICsgZnVuZGVkX3ByaW5jaXBhbCwKICAgIC8vICAgICBwcm9jZXNzZWRfZXZlbnRzPXByb2Nlc3NlZF9ldmVudHMsCiAgICAvLyAgICAgdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUA1MzoKICAgIGludGNfMCAvLyAwCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDU0CgoKLy8gbW9kdWxlcy5wYXltZW50X2FnZW50LlBheW1lbnRBZ2VudC5jbGFpbV9kdWVfY2FzaGZsb3dzW3JvdXRpbmddKCkgLT4gdm9pZDoKY2xhaW1fZHVlX2Nhc2hmbG93czoKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6OTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNQogICAgLy8gaWYgc2VsZi5vcF9kYWVtb24udmFsdWUgIT0gR2xvYmFsLnplcm9fYWRkcmVzczoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNiAvLyAweDUyMjM0ZjcwNDQ2MTY1NmQ2ZjZlMjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcF9kYWVtb24gZXhpc3RzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBieiBjbGFpbV9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTcKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNwogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI2IC8vIDB4NTIyMzRmNzA0NDYxNjU2ZDZmNmUyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wX2RhZW1vbiBleGlzdHMKICAgID09CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTctMTkKICAgIC8vIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICAvLyBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgYm56IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDE0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTgKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNy0xOQogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICBibnogY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX3RydWVAMTQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxOQogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIHR4biBTZW5kZXIKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDMyCiAgICA9PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE3LTE5CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAxNQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX3RydWVAMTQ6CiAgICBpbnRjXzEgLy8gMQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDE2OgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE2LTIwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vICAgICBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gICAgIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICAvLyApLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNzoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMDMKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA0CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMDcKICAgIC8vIHNlbGYuX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQoaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDIKICAgIGR1cAogICAgY2FsbHN1YiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjEwOAogICAgLy8gc2VsZi5fc2V0dGxlX3Bvc2l0aW9uKGhvbGRpbmdfYWRkcmVzcykKICAgIGNhbGxzdWIgX3NldHRsZV9wb3NpdGlvbgogICAgcG9wbiAyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTE3CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jbGFpbWFibGVfaW50ZXJlc3QKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGR1cAogICAgcHVzaGludCA3MwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTE4CiAgICAvLyArIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNsYWltYWJsZV9wcmluY2lwYWwKICAgIGR1cAogICAgcHVzaGludCA4MQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTE3LTExOAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY2xhaW1hYmxlX2ludGVyZXN0CiAgICAvLyArIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNsYWltYWJsZV9wcmluY2lwYWwKICAgIHVuY292ZXIgMgogICAgKwogICAgZHVwCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMTAKICAgIC8vIGFzc2VydCB0b3RhbF9hbW91bnQgPiBVSW50NjQoMCksIGVyci5OT19EVUVfQ0FTSEZMT1cKICAgIGFzc2VydCAvLyBObyBkdWUgY2FzaGZsb3cgdG8gcGF5CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MjUKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5pc19vcHRlZF9pbigKICAgIGV4dHJhY3QgMCAzMgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI2CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI1LTI3CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MuaXNfb3B0ZWRfaW4oCiAgICAvLyAgICAgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkCiAgICAvLyApCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI1LTI4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MuaXNfb3B0ZWRfaW4oCiAgICAvLyAgICAgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkCiAgICAvLyApCiAgICAvLyBhbmQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZAogICAgYnogY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX2ZhbHNlQDI0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MjgKICAgIC8vIGFuZCBub3Qgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDM4NAogICAgZ2V0Yml0CiAgICBibnogY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX2ZhbHNlQDI0CiAgICBpbnRjXzEgLy8gMQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDI1OgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjExNQogICAgLy8gaWYgc2VsZi5faXNfcGF5bWVudF9leGVjdXRhYmxlKGhvbGRpbmdfYWRkcmVzcyk6CiAgICBieiBjbGFpbV9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjM0CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgc3dhcAogICAgZGlnIDEKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYXNzZXJ0IC8vIGFjY291bnQgb3B0ZWQgaW50byBhc3NldAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjM0LTM1CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgLy8gPj0gcGF5bWVudF9hbW91bnQKICAgIGRpZyA1CiAgICBkdXAKICAgIGNvdmVyIDIKICAgID49CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MzMtMzYKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIC8vICAgICA+PSBwYXltZW50X2Ftb3VudAogICAgLy8gKSwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjExNwogICAgLy8gc2VsZi5fcGF5KHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcywgdG90YWxfYW1vdW50KQogICAgZGlnIDIKICAgIGR1cAogICAgY292ZXIgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGR1cAogICAgZXh0cmFjdCAwIDMyCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NDAtNDUKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1yZWNlaXZlciwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9YW1vdW50LAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NDQKICAgIC8vIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICB1bmNvdmVyIDMKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgdW5jb3ZlciAyCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQwCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NDAtNDUKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1yZWNlaXZlciwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9YW1vdW50LAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEyNS0xMjYKICAgIC8vICMgR2V0IHRoZSBjbGFpbWFibGUgYW1vdW50cyBiZWZvcmUgcmVzZXQKICAgIC8vIGludGVyZXN0X2Ftb3VudCA9IHBvc2l0aW9uLmNsYWltYWJsZV9pbnRlcmVzdAogICAgZHVwCiAgICBwdXNoaW50IDczCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBidXJ5IDkKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMjcKICAgIC8vIHByaW5jaXBhbF9hbW91bnQgPSBwb3NpdGlvbi5jbGFpbWFibGVfcHJpbmNpcGFsCiAgICBkdXAKICAgIHB1c2hpbnQgODEKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGJ1cnkgOQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEyOS0xMzAKICAgIC8vICMgUmVzZXQgdGhlIHBvc2l0aW9uJ3MgY2xhaW1hYmxlIGFtb3VudHMKICAgIC8vIHBvc2l0aW9uLmNsYWltYWJsZV9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICByZXBsYWNlMiA3MwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzMQogICAgLy8gcG9zaXRpb24uY2xhaW1hYmxlX3ByaW5jaXBhbCA9IFVJbnQ2NCgwKQogICAgc3dhcAogICAgcmVwbGFjZTIgODEKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzIKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gcG9zaXRpb24uY29weSgpCiAgICB1bmNvdmVyIDMKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzQKICAgIC8vIGFzc2VydCBzZWxmLnJlc2VydmVkX2ludGVyZXN0ID49IGludGVyZXN0X2Ftb3VudCwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBkdXAKICAgIGRpZyAyCiAgICA+PQogICAgYXNzZXJ0IC8vIE5vdCBlbm91Z2ggZnVuZHMgZm9yIHRoZSBwYXltZW50CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTM1CiAgICAvLyBhc3NlcnQgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgPj0gcHJpbmNpcGFsX2Ftb3VudCwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIGRpZyAzCiAgICA+PQogICAgYXNzZXJ0IC8vIE5vdCBlbm91Z2ggZnVuZHMgZm9yIHRoZSBwYXltZW50CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTM3LTEzOAogICAgLy8gIyBVcGRhdGUgdGhlIGdsb2JhbCByZXNlcnZlZCBpbnRlcmVzdCBhbmQgcHJpbmNpcGFsIGFtb3VudHMKICAgIC8vIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgLT0gaW50ZXJlc3RfYW1vdW50CiAgICBzd2FwCiAgICAtCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzOQogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgLT0gcHJpbmNpcGFsX2Ftb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIGV4aXN0cwogICAgc3dhcAogICAgLQogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpjbGFpbV9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMjMKICAgIC8vIHRvdGFsX2Ftb3VudD1pbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50LAogICAgZGlnIDUKICAgIGR1cAogICAgZGlnIDYKICAgIGR1cAogICAgY292ZXIgMwogICAgKwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjEyNAogICAgLy8gdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjEyMC0xMjYKICAgIC8vIHJldHVybiB0eXAuQ2FzaENsYWltUmVzdWx0KAogICAgLy8gICAgIGludGVyZXN0X2Ftb3VudD1pbnRlcmVzdF9hbW91bnQsCiAgICAvLyAgICAgcHJpbmNpcGFsX2Ftb3VudD1wcmluY2lwYWxfYW1vdW50LAogICAgLy8gICAgIHRvdGFsX2Ftb3VudD1pbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50LAogICAgLy8gICAgIHRpbWVzdGFtcD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICBjb250ZXh0PXBheW1lbnRfaW5mbywKICAgIC8vICkKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyAyCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgcHVzaGJ5dGVzIDB4MDAyMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VAMjQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfbWVyZ2VAMjUKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAxNToKICAgIGludGNfMCAvLyAwCiAgICBiIGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUAxNgoKCi8vIG1vZHVsZXMudHJhbnNmZXJfYWdlbnQuVHJhbnNmZXJBZ2VudC50cmFuc2Zlcl9zZXRfc2NoZWR1bGVbcm91dGluZ10oKSAtPiB2b2lkOgp0cmFuc2Zlcl9zZXRfc2NoZWR1bGU6CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MjYKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToyNwogICAgLy8gYXNzZXJ0IG9wZW5fZGF0ZSA8IGNsb3N1cmVfZGF0ZSwgZXJyLklOVkFMSURfU09SVElORwogICAgZHVwMgogICAgPAogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIG11c3QgYmUgc29ydGVkIGluIHN0cmljdGx5IGFzY2VuZGluZyBvcmRlcgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToyOQogICAgLy8gc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgPSBvcGVuX2RhdGUKICAgIGJ5dGVjIDI4IC8vICJ0cmFuc2Zlcl9vcGVuaW5nX2RhdGUiCiAgICB1bmNvdmVyIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjMwCiAgICAvLyBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSA9IGNsb3N1cmVfZGF0ZQogICAgYnl0ZWMgMjkgLy8gInRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjMxCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMudHJhbnNmZXJfYWdlbnQuVHJhbnNmZXJBZ2VudC5wcmltYXJ5X2Rpc3RyaWJ1dGlvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnByaW1hcnlfZGlzdHJpYnV0aW9uOgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTozMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo3MQogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYucHJpbWFyeV9kZWFsZXIsIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyMiAvLyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQzCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo0NAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQ1CiAgICAvLyBhc3NlcnQgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TRUQKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBjbG9zZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDcKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQoaG9sZGluZ19hZGRyZXNzKQogICAgc3dhcAogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo0OAogICAgLy8gYXNzZXJ0IHVuaXRzID4gVUludDY0KDApLCBlcnIuWkVST19VTklUUwogICAgZHVwCiAgICBhc3NlcnQgLy8gQ2FuIG5vdCBkaXN0cmlidXRlIHplcm8gdW5pdHMKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NTAKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgKyB1bml0cyA8PSBzZWxmLnRvdGFsX3VuaXRzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIGV4aXN0cwogICAgKwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIDw9CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQ5LTUxCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgKyB1bml0cyA8PSBzZWxmLnRvdGFsX3VuaXRzCiAgICAvLyApLCBlcnIuT1ZFUl9ESVNUUklCVVRJT04KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgcmVtYWluaW5nIEQtQVNBIHVuaXRzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjUyCiAgICAvLyBpZiBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNyAvLyAiaW5pdGlhbF9leGNoYW5nZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSBleGlzdHMKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo1NAogICAgLy8gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPD0gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGUKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNyAvLyAiaW5pdGlhbF9leGNoYW5nZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSBleGlzdHMKICAgIDw9CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjUzLTU1CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDw9IHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlCiAgICAvLyApLCBlcnIuUFJJTUFSWV9ESVNUUklCVVRJT05fQ0xPU0VECiAgICBhc3NlcnQgLy8gUHJpbWFyeSBkaXN0cmlidXRpb24gaXMgY2xvc2VkCgpwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTQ4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5yZXNlcnZlZF91bml0cyArPSB1bml0cwogICAgZHVwbiAyCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCA0MAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAzCiAgICBkdXAKICAgIGNvdmVyIDMKICAgICsKICAgIGl0b2IKICAgIHB1c2hpbnQgNDAKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjU4CiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsICs9IHVuaXRzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIGV4aXN0cwogICAgKwogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjU5CiAgICAvLyByZXR1cm4gc2VsZi50b3RhbF91bml0cyAtIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICBzd2FwCiAgICAtCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnRyYW5zZmVyX2FnZW50LlRyYW5zZmVyQWdlbnQudHJhbnNmZXJbcm91dGluZ10oKSAtPiB2b2lkOgp0cmFuc2ZlcjoKICAgIGludGNfMCAvLyAwCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cG4gMgogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojc1CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo3NgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDcKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjEzCiAgICAvLyBpZiBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyOCAvLyAidHJhbnNmZXJfb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIGJ6IHRyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNQogICAgLy8gc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyOCAvLyAidHJhbnNmZXJfb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIDw9CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE0LTE2CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyApLCBlcnIuQ0xPU0VEX1RSQU5TRkVSCiAgICBhc3NlcnQgLy8gVHJhbnNmZXIgaXMgY2xvc2VkCgp0cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE3CiAgICAvLyBpZiBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyOSAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIGJ6IHRyYW5zZmVyX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxOQogICAgLy8gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI5IC8vICJ0cmFuc2Zlcl9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgPAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxOC0yMAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8IHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlCiAgICAvLyApLCBlcnIuQ0xPU0VEX1RSQU5TRkVSCiAgICBhc3NlcnQgLy8gVHJhbnNmZXIgaXMgY2xvc2VkCgp0cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjgwCiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBzZW5kZXJfaG9sZGluZ19hZGRyZXNzLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICBkaWcgNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQyMwogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDgKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBkaWcgNQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA5CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjgzCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBkaWcgMgogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4NAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBkdXAKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODUKICAgIC8vIGFzc2VydCBzZW5kZXJfaG9sZGluZ19hZGRyZXNzICE9IHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcywgZXJyLlNFTEZfVFJBTlNGRVIKICAgIHVuY292ZXIgMgogICAgIT0KICAgIGFzc2VydCAvLyBTZW5kZXIgYW5kIHJlY2VpdmVyIG11c3QgYmUgZGlmZmVyZW50CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojg2CiAgICAvLyBhc3NlcnQgdW5pdHMgPiBVSW50NjQoMCksIGVyci5OVUxMX1RSQU5TRkVSCiAgICBkaWcgMQogICAgZHVwCiAgICBhc3NlcnQgLy8gVHJhbnNmZXIgdW5pdHMgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4NwogICAgLy8gYXNzZXJ0IHVuaXRzIDw9IHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cywgZXJyLk9WRVJfVFJBTlNGRVIKICAgIHN3YXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICA8PQogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCBzZW5kZXIgdW5pdHMgdG8gdHJhbnNmZXIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc2MwogICAgLy8gaWYgc2VsZi5ldmVudF9jdXJzb3IgPj0gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgPj0KICAgIGJueiB0cmFuc2Zlcl9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9hc3NlcnRfbm9fZHVlX2V2ZW50X3BlbmRpbmdAMTAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc2NQogICAgLy8gbmV4dF9lbnRyeSA9IHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLmV2ZW50X2N1cnNvcikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NjcKICAgIC8vIG5leHRfZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzY2LTc2OAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBuZXh0X2VudHJ5LnNjaGVkdWxlZF90aW1lID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICksIGVyci5QRU5ESU5HX0FDVFVTX0VWRU5UCiAgICBhc3NlcnQgLy8gQUNUVVMgZXZlbnQgbm90IHlldCBleGVjdXRlZAoKdHJhbnNmZXJfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYXNzZXJ0X25vX2R1ZV9ldmVudF9wZW5kaW5nQDEwOgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo5MAogICAgLy8gc2VsZi5fZW5zdXJlX3VuaXRzX2FjdGl2YXRlZChzZW5kZXJfaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDMKICAgIGR1cAogICAgY2FsbHN1YiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo5MQogICAgLy8gc2VsZi5fZW5zdXJlX3VuaXRzX2FjdGl2YXRlZChyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBkaWcgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjYWxsc3ViIF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjkyCiAgICAvLyBzZWxmLl9zZXR0bGVfcG9zaXRpb24oc2VuZGVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGNhbGxzdWIgX3NldHRsZV9wb3NpdGlvbgogICAgcG9wbiAyCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjkzCiAgICAvLyBzZWxmLl9zZXR0bGVfcG9zaXRpb24ocmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzKQogICAgY2FsbHN1YiBfc2V0dGxlX3Bvc2l0aW9uCiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNTIKICAgIC8vIGFzc2VydCB1bml0cyA8PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cywgZXJyLk9WRVJfVFJBTlNGRVIKICAgIGRpZyA1CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkaWcgMQogICAgPD0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgc2VuZGVyIHVuaXRzIHRvIHRyYW5zZmVyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTUzCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyAtPSB1bml0cwogICAgZGlnIDEKICAgIC0KICAgIGl0b2IKICAgIHVuY292ZXIgMgogICAgaW50Y18zIC8vIDMyCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTQ0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyArPSB1bml0cwogICAgZGlnIDUKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIHVuY292ZXIgMgogICAgKwogICAgaXRvYgogICAgaW50Y18zIC8vIDMyCiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo2MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfc3VzcGVuc2lvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfc3VzcGVuc2lvbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojc3CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyMSAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxODUKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZCA9IHN1c3BlbmRlZAogICAgZHVwCiAgICBwdXNoaW50IDQ4CiAgICBpbnRjXzEgLy8gMQogICAgYm94X2V4dHJhY3QKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgcHVzaGludCA0OAogICAgc3dhcAogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxODYKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE2NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF9vcGVuW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF9vcGVuOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjY4CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hY2NvdW50X21hbmFnZXIsIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyMyAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzOQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfRU5ERUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgMjAwCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxMAogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfZW5kZWQoKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgIQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjExCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxMgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTMKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozNAogICAgLy8gdW5pdHM9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozMi00MgogICAgLy8gcmV0dXJuIHR5cC5BY2NvdW50UG9zaXRpb24oCiAgICAvLyAgICAgcGF5bWVudF9hZGRyZXNzPXBheW1lbnRfYWRkcmVzcywKICAgIC8vICAgICB1bml0cz1VSW50NjQoMCksCiAgICAvLyAgICAgcmVzZXJ2ZWRfdW5pdHM9VUludDY0KDApLAogICAgLy8gICAgIHN1c3BlbmRlZD1GYWxzZSwKICAgIC8vICAgICBzZXR0bGVkX2N1cnNvcj1VSW50NjQoMCksCiAgICAvLyAgICAgaW50ZXJlc3RfY2hlY2twb2ludD1VSW50NjQoMCksCiAgICAvLyAgICAgcHJpbmNpcGFsX2NoZWNrcG9pbnQ9VUludDY0KDApLAogICAgLy8gICAgIGNsYWltYWJsZV9pbnRlcmVzdD1VSW50NjQoMCksCiAgICAvLyAgICAgY2xhaW1hYmxlX3ByaW5jaXBhbD1VSW50NjQoMCksCiAgICAvLyApCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGJ5dGVjIDQwIC8vIDB4MDAKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjE0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHNlbGYuX25ld19hY2NvdW50X3Bvc2l0aW9uKHBheW1lbnRfYWRkcmVzcykKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTUKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIzOAogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICB1bmNvdmVyIDMKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMzkKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQwCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0MQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzID0gcGF5bWVudF9hZGRyZXNzCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0MgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5hY2NvdW50X2dldF9wb3NpdGlvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfZ2V0X3Bvc2l0aW9uOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI1OQogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmNvbnRyYWN0X2NyZWF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X2NyZWF0ZToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDMwCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gYXJyYW5nZXIKICAgIGJ5dGVjIDE4IC8vIDB4NTIyMzQxNzI3MjYxNmU2NzY1NzIyMwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMzEKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAxOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfY29uZmlnW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfY29uZmlnOgogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBsZW4KICAgIHB1c2hpbnQgMTA3CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLk5vcm1hbGl6ZWRBY3R1c1Rlcm1zCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgcHVzaGludCA3MgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5Jbml0aWFsS2VybmVsU3RhdGUKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBsZW4KICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIHR1cGxlIGVuY29kaW5nCiAgICBkdXAKICAgIHB1c2hpbnQgMzQKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCB0YWlsIHBvaW50ZXIgYXQgaW5kZXggMSBvZiAodWludDhbMzJdLChsZW4rdXRmOFtdKSkKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgY292ZXIgMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMzYKICAgICsKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuUHJvc3BlY3R1cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2MgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDY0LTEwNjUKICAgIC8vICMgQ29uZmlndXJlIENvbnRyYWN0CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPSB0ZXJtcy5jb250cmFjdF90eXBlLmFzX3VpbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgYnogY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUA3CiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIyMAogICAgLy8gVUludDY0KGVudW1zLkNUX0FOTiksCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIxCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfTkFNKSwKICAgIHB1c2hpbnQgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIyCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfTEFNKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIzCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfTEFYKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjI0CiAgICAvLyBVSW50NjQoZW51bXMuQ1RfQ0xNKSwKICAgIHB1c2hpbnQgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJ6IGNvbnRyYWN0X2NvbmZpZ19ib29sX2ZhbHNlQDgKCmNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANzoKICAgIGludGNfMSAvLyAxCgpjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUA5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjI5CiAgICAvLyBhc3NlcnQgc2VsZi5faXNfc3VwcG9ydGVkX2NvbnRyYWN0X3R5cGUoY29udHJhY3RfdHlwZSksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2NwogICAgLy8gc2VsZi5fc3RvcmVfY29udHJhY3RfY29uZmlnKHNlbGYuY29udHJhY3RfdHlwZSwgdGVybXMsIGluaXRpYWxfc3RhdGUpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgYnVyeSAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzI1CiAgICAvLyBhc3NlcnQgdGVybXMuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZGlnIDQKICAgIGR1cAogICAgcHVzaGludCAzMwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSA4CiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMjcKICAgIC8vIHRlcm1zLmRheV9jb3VudF9jb252ZW50aW9uLmFzX3VpbnQ2NCgpCiAgICBwdXNoaW50IDU3CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICBieiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDE2CiAgICBkaWcgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk5CiAgICAvLyBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI5Ny0zMDMKICAgIC8vIHJldHVybiBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzYwKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwSVNEQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjApLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDE2CiAgICBkaWcgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzAwCiAgICAvLyBVSW50NjQoZW51bXMuRENDX0EzNjUpLAogICAgcHVzaGludCAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyOTctMzAzCiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgID09CiAgICBibnogY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUAxNgogICAgZGlnIDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMwMQogICAgLy8gVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGRpZyA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDIKICAgIC8vIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICA9PQogICAgYnogY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAMTcKCmNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTY6CiAgICBpbnRjXzEgLy8gMQoKY29udHJhY3RfY29uZmlnX2Jvb2xfbWVyZ2VAMTg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDktMzExCiAgICAvLyBhc3NlcnQgc2VsZi5faXNfc3VwcG9ydGVkX2RheV9jb3VudF9jb252ZW50aW9uKAogICAgLy8gICAgIGRheV9jb3VudF9jb252ZW50aW9uCiAgICAvLyApLCBlcnIuSU5WQUxJRF9EQVlfQ09VTlRfQ09OVkVOVElPTgogICAgYXNzZXJ0IC8vIEludmFsaWQgZGF5LWNvdW50IGNvbnZlbnRpb24gSUQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMyOQogICAgLy8gaWYgY29udHJhY3RfdHlwZSAhPSBVSW50NjQoZW51bXMuQ1RfQU5OKToKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgICE9CiAgICBieiBjb250cmFjdF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzMwCiAgICAvLyBhc3NlcnQgbm90IHRlcm1zLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24sIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZGlnIDQKICAgIHB1c2hpbnQgNzg2CiAgICBnZXRiaXQKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KCmNvbnRyYWN0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDIwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODA3CiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIEQtQVNBIGFscmVhZHkgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODA4CiAgICAvLyBhc3NlcnQgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCA9PSBVSW50NjQoMCksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMCAvLyAiaW5pdGlhbF9leGNoYW5nZV9hbW91bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTAtODExCiAgICAvLyAjIFNldCBEZW5vbWluYXRpb24gQXNzZXQKICAgIC8vIHNlbGYuX2Fzc2VydF9kZW5vbWluYXRpb25fYXNzZXQodGVybXMuZGVub21pbmF0aW9uX2Fzc2V0X2lkKQogICAgZGlnIDQKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NzUtNzc2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIGRlbm9taW5hdGlvbiB3aXRoIEFTQQogICAgLy8gX2NyZWF0b3IsIGV4aXN0cyA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X2NyZWF0b3IoZGVub21pbmF0aW9uX2Fzc2V0X2lkKQogICAgZHVwCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q3JlYXRvcgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NzcKICAgIC8vIGFzc2VydCBleGlzdHMsIGVyci5JTlZBTElEX0RFTk9NSU5BVElPTgogICAgYXNzZXJ0IC8vIERlbm9taW5hdGlvbiBhc3NldCBpcyBub3QgcHJvcGVybHkgc2V0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODAKICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICBieXRlYyA0NCAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTQtODE1CiAgICAvLyAjIFNldCBTZXR0bGVtZW50IEFzc2V0CiAgICAvLyBzZWxmLl9hc3NlcnRfc2V0dGxlbWVudF9hc3NldCh0ZXJtcy5zZXR0bGVtZW50X2Fzc2V0X2lkKQogICAgZGlnIDEKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc4NQogICAgLy8gc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODMtNzg2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc2V0dGxlbWVudCBhc3NldCBpcyB0aGUgZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQgPT0gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIC8vICksIGVyci5JTlZBTElEX1NFVFRMRU1FTlRfQVNTRVQKICAgIGFzc2VydCAvLyBEaWZmZXJlbnQgc2V0dGxlbWVudCBhc3NldCBub3Qgc3VwcG9ydGVkLCBtdXN0IGJlIGVxdWFsIHRvIGRlbm9taW5hdGlvbiBhc3NldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Nzg5CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBzZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkwLTc5NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhc3NldF9hbW91bnQ9MCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Nzk1CiAgICAvLyBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkzCiAgICAvLyBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc5NAogICAgLy8gYXNzZXRfYW1vdW50PTAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkwLTc5MQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3OTAtNzk2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODE4LTgxOQogICAgLy8gIyBVbml0cwogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IHRlcm1zLnRvdGFsX3VuaXRzCiAgICBkdXAKICAgIHB1c2hpbnQgMTcKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODIwCiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID0gVUludDY0KDApCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgyMi04MjMKICAgIC8vICMgRGF5LUNvdW50IENvbnZlbnRpb25zCiAgICAvLyBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uID0gdGVybXMuZGF5X2NvdW50X2NvbnZlbnRpb24uYXNfdWludDY0KCkKICAgIGJ5dGVjIDQ2IC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGRpZyA4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODI1LTgyNgogICAgLy8gIyBUaW1lCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA9IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZQogICAgZHVwCiAgICBwdXNoaW50IDQxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMjcgLy8gImluaXRpYWxfZXhjaGFuZ2VfZGF0ZSIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODI3CiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSB0ZXJtcy5tYXR1cml0eV9kYXRlCiAgICBkaWcgMQogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDQ1IC8vICJtYXR1cml0eV9kYXRlIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MjgKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IGluaXRpYWxfc3RhdGUubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZGlnIDYKICAgIGR1cAogICAgY292ZXIgMgogICAgcHVzaGludCA0OAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzMC04MzEKICAgIC8vICMgUHJpbmNpcGFsCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID0gdGVybXMuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGRpZyAxMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzMgogICAgLy8gc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gdGVybXMuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZGlnIDMKICAgIHB1c2hpbnQgNzg2CiAgICBnZXRiaXQKICAgIGJ5dGVjIDM0IC8vICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzMwogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBpbml0aWFsX3N0YXRlLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZGlnIDEKICAgIHB1c2hpbnQgMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODM1LTgzNgogICAgLy8gIyBJbnRlcmVzdAogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ID0gaW5pdGlhbF9zdGF0ZS5hY2NydWVkX2ludGVyZXN0CiAgICBkaWcgMQogICAgcHVzaGludCA0MAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODM4LTgzOQogICAgLy8gIyBJbnRlcmVzdCBSYXRlCiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IGluaXRpYWxfc3RhdGUubm9taW5hbF9pbnRlcmVzdF9yYXRlCiAgICBkaWcgMQogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0MAogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gaW5pdGlhbF9zdGF0ZS5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlCiAgICBkaWcgMQogICAgcHVzaGludCAyNAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQxCiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkID0gdGVybXMucmF0ZV9yZXNldF9zcHJlYWQKICAgIGRpZyAzCiAgICBwdXNoaW50IDU4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzUgLy8gInJhdGVfcmVzZXRfc3ByZWFkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0MgogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIgPSB0ZXJtcy5yYXRlX3Jlc2V0X211bHRpcGxpZXIKICAgIGRpZyAzCiAgICBwdXNoaW50IDY2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzYgLy8gInJhdGVfcmVzZXRfbXVsdGlwbGllciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDMKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9mbG9vciA9IHRlcm1zLnJhdGVfcmVzZXRfZmxvb3IKICAgIGRpZyAzCiAgICBwdXNoaW50IDc0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzAgLy8gInJhdGVfcmVzZXRfZmxvb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQ0CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfY2FwID0gdGVybXMucmF0ZV9yZXNldF9jYXAKICAgIGRpZyAzCiAgICBwdXNoaW50IDgyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzEgLy8gInJhdGVfcmVzZXRfY2FwIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0NQogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X25leHQgPSB0ZXJtcy5yYXRlX3Jlc2V0X25leHQKICAgIGRpZyAzCiAgICBwdXNoaW50IDkwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzcgLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDYKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgPSB0ZXJtcy5oYXNfcmF0ZV9yZXNldF9mbG9vcgogICAgZGlnIDMKICAgIHB1c2hpbnQgNzg0CiAgICBnZXRiaXQKICAgIGJ5dGVjIDM4IC8vICJoYXNfcmF0ZV9yZXNldF9mbG9vciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDcKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwID0gdGVybXMuaGFzX3JhdGVfcmVzZXRfY2FwCiAgICBkaWcgMwogICAgcHVzaGludCA3ODUKICAgIGdldGJpdAogICAgYnl0ZWMgMzkgLy8gImhhc19yYXRlX3Jlc2V0X2NhcCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDktODUwCiAgICAvLyAjIFNjYWxpbmcKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgPSB0ZXJtcy5maXhlZF9wb2ludF9zY2FsZQogICAgdW5jb3ZlciAzCiAgICBwdXNoaW50IDk5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODUyLTg1MwogICAgLy8gIyBTY2hlZHVsZSBQcm9jZXNzaW5nCiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciA9IGluaXRpYWxfc3RhdGUuZXZlbnRfY3Vyc29yCiAgICBkaWcgMQogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU1LTg1NgogICAgLy8gIyBQZXItVW5pdCBGaXhlZC1Qb2ludCBJbmRleGVzCiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggPSBpbml0aWFsX3N0YXRlLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgKICAgIGRpZyAxCiAgICBwdXNoaW50IDU2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU3CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4ID0gaW5pdGlhbF9zdGF0ZS5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleAogICAgZGlnIDEKICAgIHB1c2hpbnQgNjQKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU5LTg2MAogICAgLy8gIyBSZXNlcnZlZCBBbW91bnQgKGZvciBleGVjdXRlZCBjYXNoZmxvd3MpCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0ID0gVUludDY0KDApCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2MQogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2MwogICAgLy8gYXNzZXJ0IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLCBlcnIuSU5WQUxJRF9JRUQKICAgIGRpZyAyCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICBhc3NlcnQgLy8gSUVEIG11c3QgYmUgc2V0IGluIHRoZSBmdXR1cmUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2NAogICAgLy8gYXNzZXJ0IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA+IGluaXRpYWxfc3RhdGUuc3RhdHVzX2RhdGUsIGVyci5JTlZBTElEX0lFRAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgPAogICAgYXNzZXJ0IC8vIElFRCBtdXN0IGJlIHNldCBpbiB0aGUgZnV0dXJlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NjUKICAgIC8vIGFzc2VydCB0ZXJtcy5pbml0aWFsX2V4Y2hhbmdlX2RhdGUgPCB0ZXJtcy5tYXR1cml0eV9kYXRlLCBlcnIuSU5WQUxJRF9JRUQKICAgIDwKICAgIGFzc2VydCAvLyBJRUQgbXVzdCBiZSBzZXQgaW4gdGhlIGZ1dHVyZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2OS0xMDcwCiAgICAvLyAjIE5vdGFyaXplIHByb3NwZWN0dXMgKG9wdGlvbmFsKQogICAgLy8gc2VsZi5wcm9zcGVjdHVzX2hhc2ggPSBwcm9zcGVjdHVzLmhhc2guYnl0ZXMKICAgIGRpZyAyCiAgICBleHRyYWN0IDAgMzIKICAgIGJ5dGVjIDQyIC8vICJwcm9zcGVjdHVzX2hhc2giCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3MQogICAgLy8gc2VsZi5wcm9zcGVjdHVzX3VybCA9IHByb3NwZWN0dXMudXJsCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGVjIDQzIC8vICJwcm9zcGVjdHVzX3VybCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDcyCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAMTc6CiAgICBpbnRjXzAgLy8gMAogICAgYiBjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUAxOAoKY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAODoKICAgIGludGNfMCAvLyAwCiAgICBiIGNvbnRyYWN0X2NvbmZpZ19ib29sX21lcmdlQDkKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9zY2hlZHVsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X3NjaGVkdWxlOgogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHN3YXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBkdXAKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgMgogICAgKwogICAgdW5jb3ZlciAyCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLkV4ZWN1dGlvblNjaGVkdWxlRW50cnk+CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDg5CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwOTIKICAgIC8vIGNvbnRyYWN0X3R5cGU9c2VsZi5jb250cmFjdF90eXBlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGNvdmVyIDMKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4ODEKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4ODItODg0CiAgICAvLyBhc3NlcnQgc2NoZWR1bGVfcGFnZS5sZW5ndGggPD0gVUludDY0KAogICAgLy8gICAgIGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUKICAgIC8vICksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGR1cAogICAgcHVzaGludCAxNgogICAgPD0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg4NQogICAgLy8gYXNzZXJ0IHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPiBVSW50NjQoMCksIGVyci5URVJNU19OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSB0ZXJtcyBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODg3CiAgICAvLyBwYWdlX2N1cnNvciA9IHNjaGVkdWxlX3BhZ2VfaW5kZXggKiBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkKICAgIHN3YXAKICAgIHB1c2hpbnQgMTYKICAgICoKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg5NAogICAgLy8gKyBwYWdlX2xlbmd0aCAqIFVJbnQ2NChjc3QuT1BfVVBfQ09OVFJBQ1RfQ09ORklHX1BFUl9FTlRSWV9CVURHRVQpCiAgICBwdXNoaW50IDEwMAogICAgKgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODkzCiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19CQVNFX0JVREdFVCkKICAgIGludGMgNCAvLyAxNTAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTMtODk0CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19CQVNFX0JVREdFVCkKICAgIC8vICsgcGFnZV9sZW5ndGggKiBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19QRVJfRU5UUllfQlVER0VUKQogICAgKwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODg5LTg5NgogICAgLy8gIyBWYWxpZGF0aW9uIGNvc3QgZ3Jvd3Mgd2l0aCBwYWdlIGxlbmd0aCwgc28gY29uZmlndXJhdGlvbiBleHBsaWNpdGx5CiAgICAvLyAjIGJ1eXMgZXh0cmEgb3Bjb2RlIGJ1ZGdldCBmb3IgbGFyZ2VyIHVwbG9hZHMuCiAgICAvLyBlbnN1cmVfYnVkZ2V0KAogICAgLy8gICAgIHJlcXVpcmVkX2J1ZGdldD0oCiAgICAvLyAgICAgICAgIFVJbnQ2NChjc3QuT1BfVVBfQ09OVFJBQ1RfQ09ORklHX0JBU0VfQlVER0VUKQogICAgLy8gICAgICAgICArIHBhZ2VfbGVuZ3RoICogVUludDY0KGNzdC5PUF9VUF9DT05UUkFDVF9DT05GSUdfUEVSX0VOVFJZX0JVREdFVCkKICAgIC8vICAgICApLAogICAgLy8gKQogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODk3CiAgICAvLyBpbmRleCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKCmNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEAyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODk4CiAgICAvLyB3aGlsZSBpbmRleCA8IHBhZ2VfbGVuZ3RoOgogICAgZHVwCiAgICBkaWcgNAogICAgPAogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfd2hpbGVAMTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg5OS05MDAKICAgIC8vIGVudHJ5ID0gc2NoZWR1bGVfcGFnZVtpbmRleF0uY29weSgpCiAgICAvLyBlbnRyeV9ldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZGlnIDQKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGJ1cnkgMTIKICAgIGRpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgNjUKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTAwCiAgICAvLyBlbnRyeV9ldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTktOTAwCiAgICAvLyBlbnRyeSA9IHNjaGVkdWxlX3BhZ2VbaW5kZXhdLmNvcHkoKQogICAgLy8gZW50cnlfZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGludGNfMiAvLyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDAKICAgIC8vIGVudHJ5X2V2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBnZXRieXRlCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgMTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkwMQogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X2lkID09IHBhZ2VfY3Vyc29yICsgaW5kZXgsIGVyci5JTlZBTElEX0VWRU5UX0lECiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEzCiAgICBkaWcgNQogICAgdW5jb3ZlciA0CiAgICArCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDItOTA0CiAgICAvLyBzZWxmLl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBlbnRyeV9ldmVudF90eXBlCiAgICAvLyApCiAgICBkaWcgNQogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTA1CiAgICAvLyBhc3NlcnQgZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgc3dhcAogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDYKICAgIC8vIGlmIGVudHJ5LmV2ZW50X2lkID4gVUludDY0KDApOgogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDcKICAgIC8vIGlmIGluZGV4ID4gVUludDY0KDApOgogICAgZHVwCiAgICBieiBjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlANgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTA4CiAgICAvLyBwcmV2aW91c19lbnRyeSA9IHNjaGVkdWxlX3BhZ2VbaW5kZXggLSBVSW50NjQoMSldLmNvcHkoKQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgcHVzaGludCA2NQogICAgKgogICAgZGlnIDExCiAgICBzd2FwCiAgICBwdXNoaW50IDY1CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkyMwogICAgLy8gcHJldmlvdXNfZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gZW50cnkuc2NoZWR1bGVkX3RpbWUKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyA4CiAgICA8PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTIyLTkyNAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBwcmV2aW91c19lbnRyeS5zY2hlZHVsZWRfdGltZSA8PSBlbnRyeS5zY2hlZHVsZWRfdGltZQogICAgLy8gKSwgZXJyLklOVkFMSURfU09SVElORwogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIG11c3QgYmUgc29ydGVkIGluIHN0cmljdGx5IGFzY2VuZGluZyBvcmRlcgoKY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUA4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTI1CiAgICAvLyBpZiBlbnRyeS5ldmVudF9pZCA9PSBVSW50NjQoMCk6CiAgICBkaWcgOAogICAgYm56IGNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkyNi05MjgKICAgIC8vIGFzc2VydCBlbnRyeV9ldmVudF90eXBlID09IFVJbnQ2NCgKICAgIC8vICAgICBlbnVtcy5FVlRfSUVECiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGRpZyA5CiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjkKICAgIC8vIGluZGV4ICs9IFVJbnQ2NCgxKQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIGNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEAyCgpjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlANjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkxMC05MTIKICAgIC8vICMgVGhlIGZpcnN0IGVudHJ5IG9mIGEgcGFnZSBtdXN0IHN0aWxsIGJlIG9yZGVyZWQgYWZ0ZXIgdGhlCiAgICAvLyAjIGxhc3QgZW50cnkgb2YgdGhlIHByZXZpb3VzIHBhZ2UuCiAgICAvLyBhc3NlcnQgc2NoZWR1bGVfcGFnZV9pbmRleCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGRpZyA2CiAgICBkdXAKICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTMKICAgIC8vIHByZXZpb3VzX3BhZ2VfaW5kZXggPSBzY2hlZHVsZV9wYWdlX2luZGV4IC0gVUludDY0KDEpCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTE1CiAgICAvLyBwcmV2aW91c19wYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZQogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTQtOTE2CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHByZXZpb3VzX3BhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTctOTE4CiAgICAvLyBwcmV2aW91c19wYWdlID0gc2VsZi5zY2hlZHVsZV9wYWdlW3ByZXZpb3VzX3BhZ2VfaW5kZXhdLmNvcHkoKQogICAgLy8gYXNzZXJ0IHByZXZpb3VzX3BhZ2UubGVuZ3RoID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBwdXNoaW50IDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTgKICAgIC8vIGFzc2VydCBwcmV2aW91c19wYWdlLmxlbmd0aCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZHVwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjAKICAgIC8vIHByZXZpb3VzX3BhZ2UubGVuZ3RoIC0gVUludDY0KDEpCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTE5LTkyMQogICAgLy8gcHJldmlvdXNfZW50cnkgPSBwcmV2aW91c19wYWdlWwogICAgLy8gICAgIHByZXZpb3VzX3BhZ2UubGVuZ3RoIC0gVUludDY0KDEpCiAgICAvLyBdLmNvcHkoKQogICAgcHVzaGludCA2NQogICAgKgogICAgcHVzaGludCAyCiAgICArCiAgICBwdXNoaW50IDY1CiAgICBib3hfZXh0cmFjdAogICAgYiBjb250cmFjdF9zY2hlZHVsZV9hZnRlcl9pZl9lbHNlQDcKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX3doaWxlQDExOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjAwCiAgICAvLyBzZWxmLnNjaGVkdWxlX3BhZ2VbcGFnZV9pbmRleF0gPSBzY2hlZHVsZV9wYWdlLmNvcHkoKQogICAgZGlnIDYKICAgIGl0b2IKICAgIGJ5dGVjIDI0IC8vIDB4NTMyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgZGlnIDUKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzMgogICAgLy8gaWYgaXNfbGFzdF9wYWdlOgogICAgZGlnIDUKICAgIGJ6IGNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzNAogICAgLy8gc2NoZWR1bGVfcGFnZV9pbmRleCAqIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKSArIHBhZ2VfbGVuZ3RoCiAgICBkaWcgMQogICAgZGlnIDQKICAgICsKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzMwogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA9ICgKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTMzLTkzNQogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA9ICgKICAgIC8vICAgICBzY2hlZHVsZV9wYWdlX2luZGV4ICogVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpICsgcGFnZV9sZW5ndGgKICAgIC8vICkKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MzYKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgNTAKICAgIGFwcF9nbG9iYWxfcHV0Cgpjb250cmFjdF9zY2hlZHVsZV9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA5NwogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9leGVjdXRlX2llZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X2V4ZWN1dGVfaWVkOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMDcKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEwOAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMDkKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTExCiAgICAvLyBhc3NlcnQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LCBlcnIuSU5WQUxJRF9FVkVOVF9DVVJTT1IKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgZGlnIDEKICAgID4KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGN1cnNvcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTExMgogICAgLy8gZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoc2VsZi5ldmVudF9jdXJzb3IpCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMTMKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoZW51bXMuRVZUX0lFRCksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGR1cAogICAgZXh0cmFjdCA4IDEKICAgIGR1cAogICAgcHVzaGJ5dGVzIDB4MDEKICAgIGI9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTExNwogICAgLy8gZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICBkaWcgMQogICAgZXh0cmFjdCAwIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMTkKICAgIC8vIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgZGlnIDIKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTIwCiAgICAvLyBhY2NydWFsX2ZhY3Rvcj1lbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIGRpZyAzCiAgICBleHRyYWN0IDE3IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMjEKICAgIC8vIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIGRpZyA0CiAgICBleHRyYWN0IDI1IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMjMKICAgIC8vIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPWVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDUKICAgIGV4dHJhY3QgMzMgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEyNAogICAgLy8gbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgZGlnIDYKICAgIGV4dHJhY3QgNDEgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEyNQogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9ZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICBkaWcgNwogICAgZXh0cmFjdCA0OSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTI2CiAgICAvLyBmbGFncz1lbnRyeS5mbGFncywKICAgIGRpZyA4CiAgICBleHRyYWN0IDU3IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMTYtMTEyNwogICAgLy8gdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0KAogICAgLy8gICAgIGV2ZW50X2lkPWVudHJ5LmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1lbnRyeS5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1lbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPWVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9ZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPWVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGZsYWdzPWVudHJ5LmZsYWdzLAogICAgLy8gKSwKICAgIHVuY292ZXIgNwogICAgdW5jb3ZlciA4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNwogICAgY29uY2F0CiAgICB1bmNvdmVyIDYKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMjIKICAgIC8vIG9ic2VydmVkX3JhdGU9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMTYtMTEyNwogICAgLy8gdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0KAogICAgLy8gICAgIGV2ZW50X2lkPWVudHJ5LmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1lbnRyeS5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1lbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPWVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9ZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPWVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGZsYWdzPWVudHJ5LmZsYWdzLAogICAgLy8gKSwKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTE0LTExMjgKICAgIC8vIHNlbGYuX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5KAogICAgLy8gICAgIGVudHJ5LAogICAgLy8gICAgIHR5cC5PYnNlcnZlZEV2ZW50UmVxdWVzdCgKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPWVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIG9ic2VydmVkX3JhdGU9VUludDY0KDApLAogICAgLy8gICAgICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1lbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1lbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICAgICAgZmxhZ3M9ZW50cnkuZmxhZ3MsCiAgICAvLyAgICAgKSwKICAgIC8vICkKICAgIGNhbGxzdWIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5CiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMjkKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA5OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuYXBwbHlfbm9uX2Nhc2hfZXZlbnRbcm91dGluZ10oKSAtPiB2b2lkOgphcHBseV9ub25fY2FzaF9ldmVudDoKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDQKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cG4gMgogICAgbGVuCiAgICBwdXNoaW50IDczCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLk9ic2VydmVkRXZlbnRSZXF1ZXN0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE0NQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDYKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTQ4CiAgICAvLyBpZiBwYXlsb2FkLmZsYWdzICYgVUludDY0KGVudW1zLkZMQUdfT0JTRVJWRURfRVZFTlQpOgogICAgcHVzaGludCA2NQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgcHVzaGludCA0CiAgICAmCiAgICBieiBhcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIzMwogICAgLy8gcmV0dXJuIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQ0xNKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICBwdXNoaW50IDUKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTQ5CiAgICAvLyBhc3NlcnQgc2VsZi5fc3VwcG9ydHNfb2JzZXJ2ZWRfZXZlbnRzKCksIGVyci5PQlNFUlZFRF9FVkVOVF9SRVFVSVJFRAogICAgYXNzZXJ0IC8vIE9ic2VydmVkIGV2ZW50IHJlcXVpcmVkIHRvIGV4ZWN1dGUgdGhpcyBhY3Rpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTAKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjMzCiAgICAvLyByZXR1cm4gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9DTE0pCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIGR1cAogICAgcHVzaGludCA1CiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQ1CiAgICAvLyBhc3NlcnQgc2VsZi5fc3VwcG9ydHNfb2JzZXJ2ZWRfZXZlbnRzKCksIGVyci5PQlNFUlZFRF9FVkVOVF9SRVFVSVJFRAogICAgYXNzZXJ0IC8vIE9ic2VydmVkIGV2ZW50IHJlcXVpcmVkIHRvIGV4ZWN1dGUgdGhpcyBhY3Rpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk0NgogICAgLy8gYXNzZXJ0IHBheWxvYWQuZXZlbnRfaWQgPT0gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGRpZyAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDcKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBpZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQ4CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUsIHBheWxvYWQuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgYnVyeSAxMgogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk0Ny05NDkKICAgIC8vIHNlbGYuX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIHNlbGYuY29udHJhY3RfdHlwZSwgcGF5bG9hZC5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICAvLyApCiAgICBjYWxsc3ViIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTUxCiAgICAvLyBwYWdlX2luZGV4ID0gc2VsZi5fc2NoZWR1bGVfcGFnZV9pbmRleChzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTkwCiAgICAvLyByZXR1cm4gZXZlbnRfaWQgLy8gVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpCiAgICBwdXNoaW50IDE2CiAgICAvCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTIKICAgIC8vIHBhZ2UgPSB0eXAuRXhlY3V0aW9uU2NoZWR1bGVQYWdlKCkKICAgIGJ5dGVjIDQ4IC8vIDB4MDAwMAogICAgYnVyeSA3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTMKICAgIC8vIGlmIHBhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlOgogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA5CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMjcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1NAogICAgLy8gcGFnZSA9IHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XS5jb3B5KCkKICAgIGRpZyA3CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidXJ5IDcKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX3BhZ2UgZW50cnkgZXhpc3RzCgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDI3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTU1CiAgICAvLyBhc3NlcnQgcGFnZS5sZW5ndGggPCBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGRpZyA1CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgMTYKICAgIDwKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2MAogICAgLy8gc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIGRpZyAzCiAgICBkdXAKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjEKICAgIC8vIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICBkaWcgMQogICAgZXh0cmFjdCAxNyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjIKICAgIC8vIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZGlnIDIKICAgIGV4dHJhY3QgMjUgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTYzCiAgICAvLyBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDMKICAgIGV4dHJhY3QgNDEgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTY0CiAgICAvLyBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIGRpZyA0CiAgICBleHRyYWN0IDQ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2NQogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIHVuY292ZXIgNQogICAgZXh0cmFjdCA1NyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTctOTY3CiAgICAvLyB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1wYXlsb2FkLmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9cGF5bG9hZC5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPXBheWxvYWQucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXBheWxvYWQubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICkKICAgIGRpZyAxMQogICAgaXRvYgogICAgZGlnIDE4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMwogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTYtOTY4CiAgICAvLyBwYWdlLmFwcGVuZCgKICAgIC8vICAgICB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9cGF5bG9hZC5ldmVudF9pZCwKICAgIC8vICAgICAgICAgZXZlbnRfdHlwZT1wYXlsb2FkLmV2ZW50X3R5cGUsCiAgICAvLyAgICAgICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIC8vICAgICAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICAgICApCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjkKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHBhZ2UuY29weSgpCiAgICBkaWcgOAogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk3MAogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTUzCiAgICAvLyBhc3NlcnQgZXZlbnRfaWQgPT0gc2VsZi5ldmVudF9jdXJzb3IsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBjdXJzb3IKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTQKICAgIC8vIGVudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KGV2ZW50X2lkKQogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1NgogICAgLy8gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgYnVyeSAxMAogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjQKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY1CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzYzLTM3MAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9SUiksCiAgICBwdXNoaW50IDEyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY3CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICBwdXNoaW50IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY4CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgcHVzaGludCAxOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzYzLTM3MAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBieiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX2ZhbHNlQDE2CgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX3RydWVAMTU6CiAgICBpbnRjXzEgLy8gMQoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9tZXJnZUAxNzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTUtMTE1NwogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2lzX25vbl9jYXNoKAogICAgLy8gICAgIGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIC8vICksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IHR5cGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTgKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlICE9IGFyYzQuVUludDgoZW51bXMuRVZUX0lFRCksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGRpZyA4CiAgICBwdXNoYnl0ZXMgMHgwMQogICAgYiE9CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCB0eXBlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNzQKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluIChVSW50NjQoZW51bXMuRVZUX1JSKSwgVUludDY0KGVudW1zLkVWVF9SUkYpKQogICAgZGlnIDQKICAgIHB1c2hpbnQgMTIKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDIxCiAgICBkaWcgNAogICAgcHVzaGludCAxMQogICAgPT0KICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfZmFsc2VAMjIKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAyMToKICAgIGludGNfMSAvLyAxCgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX21lcmdlQDIzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1OQogICAgLy8gaWYgc2VsZi5fZXZlbnRfaXNfcmF0ZV9yZXNldChlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpKToKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Vsc2VfYm9keUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODAKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLm9ic2VydmVyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjUgLy8gMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTYzCiAgICAvLyBzZWxmLl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeShlbnRyeSwgcGF5bG9hZCkKICAgIGRpZyA2CiAgICBkaWcgMgogICAgY2FsbHN1YiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkKICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE2NAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Vsc2VfYm9keUA1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE2MgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICBiIGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VANgoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9mYWxzZUAyMjoKICAgIGludGNfMCAvLyAwCiAgICBiIGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfbWVyZ2VAMjMKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfZmFsc2VAMTY6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX21lcmdlQDE3CgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuYXBwZW5kX29ic2VydmVkX2Nhc2hfZXZlbnRbcm91dGluZ10oKSAtPiB2b2lkOgphcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudDoKICAgIGludGNfMCAvLyAwCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBsZW4KICAgIHB1c2hpbnQgNjUKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuT2JzZXJ2ZWRDYXNoRXZlbnRSZXF1ZXN0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE3NAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTc1CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE3NgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDcKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMzMKICAgIC8vIHJldHVybiBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0NMTSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgcHVzaGludCA1CiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTgxCiAgICAvLyBhc3NlcnQgc2VsZi5fc3VwcG9ydHNfb2JzZXJ2ZWRfZXZlbnRzKCksIGVyci5PQlNFUlZFRF9FVkVOVF9SRVFVSVJFRAogICAgYXNzZXJ0IC8vIE9ic2VydmVkIGV2ZW50IHJlcXVpcmVkIHRvIGV4ZWN1dGUgdGhpcyBhY3Rpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4MgogICAgLy8gYXNzZXJ0IHBheWxvYWQuZXZlbnRfaWQgPT0gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIHN3YXAKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgaWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4MwogICAgLy8gYXNzZXJ0IHBheWxvYWQuZXZlbnRfdHlwZSA9PSBhcmM0LlVJbnQ4KGVudW1zLkVWVF9QUiksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGRpZyAxCiAgICBleHRyYWN0IDggMQogICAgZHVwCiAgICBjb3ZlciAzCiAgICBwdXNoYnl0ZXMgMHgwMwogICAgYj09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCB0eXBlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5ODQKICAgIC8vIGFzc2VydCBwYXlsb2FkLmZsYWdzICYgVUludDY0KGVudW1zLkZMQUdfQ0FTSF9FVkVOVCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgc3dhcAogICAgcHVzaGludCA1NwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18xIC8vIDEKICAgICYKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4NgogICAgLy8gaWYgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA+IFVJbnQ2NCgwKToKICAgIGJ6IGFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTg4CiAgICAvLyBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IC0gVUludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTg3LTk4OQogICAgLy8gcHJldmlvdXNfZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoCiAgICAvLyAgICAgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCAtIFVJbnQ2NCgxKQogICAgLy8gKQogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OTEKICAgIC8vIHByZXZpb3VzX2VudHJ5LnNjaGVkdWxlZF90aW1lIDw9IHBheWxvYWQuc2NoZWR1bGVkX3RpbWUKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyA0CiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICA8PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTkwLTk5MgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBwcmV2aW91c19lbnRyeS5zY2hlZHVsZWRfdGltZSA8PSBwYXlsb2FkLnNjaGVkdWxlZF90aW1lCiAgICAvLyApLCBlcnIuSU5WQUxJRF9TT1JUSU5HCiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbXVzdCBiZSBzb3J0ZWQgaW4gc3RyaWN0bHkgYXNjZW5kaW5nIG9yZGVyCgphcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OTQKICAgIC8vIHBhZ2VfaW5kZXggPSBzZWxmLl9zY2hlZHVsZV9wYWdlX2luZGV4KHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxOTAKICAgIC8vIHJldHVybiBldmVudF9pZCAvLyBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkKICAgIHB1c2hpbnQgMTYKICAgIC8KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5NQogICAgLy8gcGFnZSA9IHR5cC5FeGVjdXRpb25TY2hlZHVsZVBhZ2UoKQogICAgYnl0ZWMgNDggLy8gMHgwMDAwCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5NgogICAgLy8gaWYgcGFnZV9pbmRleCBpbiBzZWxmLnNjaGVkdWxlX3BhZ2U6CiAgICBpdG9iCiAgICBieXRlYyAyNCAvLyAweDUzMjMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDcKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogYXBwZW5kX29ic2VydmVkX2Nhc2hfZXZlbnRfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OTcKICAgIC8vIHBhZ2UgPSBzZWxmLnNjaGVkdWxlX3BhZ2VbcGFnZV9pbmRleF0uY29weSgpCiAgICBkaWcgNQogICAgYm94X2dldAogICAgc3dhcAogICAgYnVyeSA2CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9wYWdlIGVudHJ5IGV4aXN0cwoKYXBwZW5kX29ic2VydmVkX2Nhc2hfZXZlbnRfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTk4CiAgICAvLyBhc3NlcnQgcGFnZS5sZW5ndGggPCBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGRpZyA0CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgMTYKICAgIDwKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMDMKICAgIC8vIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICBkaWcgNQogICAgZHVwCiAgICBleHRyYWN0IDkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAwNAogICAgLy8gYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIGRpZyAxCiAgICBleHRyYWN0IDE3IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMDUKICAgIC8vIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZGlnIDIKICAgIGV4dHJhY3QgMjUgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAwNgogICAgLy8gbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9cGF5bG9hZC5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIGRpZyAzCiAgICBleHRyYWN0IDMzIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMDcKICAgIC8vIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgZGlnIDQKICAgIGV4dHJhY3QgNDEgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAwOAogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIHVuY292ZXIgNQogICAgZXh0cmFjdCA0OSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDAwLTEwMTAKICAgIC8vIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgIGV2ZW50X2lkPXBheWxvYWQuZXZlbnRfaWQsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1wYXlsb2FkLmV2ZW50X3R5cGUsCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPXBheWxvYWQubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1wYXlsb2FkLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICBmbGFncz1wYXlsb2FkLmZsYWdzLAogICAgLy8gKQogICAgZGlnIDEwCiAgICBpdG9iCiAgICBkaWcgMTAKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5OS0xMDExCiAgICAvLyBwYWdlLmFwcGVuZCgKICAgIC8vICAgICB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9cGF5bG9hZC5ldmVudF9pZCwKICAgIC8vICAgICAgICAgZXZlbnRfdHlwZT1wYXlsb2FkLmV2ZW50X3R5cGUsCiAgICAvLyAgICAgICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIC8vICAgICAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICAgICApCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDEyCiAgICAvLyBzZWxmLnNjaGVkdWxlX3BhZ2VbcGFnZV9pbmRleF0gPSBwYWdlLmNvcHkoKQogICAgZGlnIDYKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDEzCiAgICAvLyBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50ICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExODAKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfZ2V0X3N0YXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfZ2V0X3N0YXRlOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBkdXAKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE4NwogICAgLy8gY29udHJhY3RfdHlwZT1hcmM0LlVJbnQ4KHNlbGYuY29udHJhY3RfdHlwZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzIgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExODkKICAgIC8vIHRvdGFsX3VuaXRzPXNlbGYudG90YWxfdW5pdHMsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE5MAogICAgLy8gcmVzZXJ2ZWRfdW5pdHNfdG90YWw9c2VsZi5yZXNlcnZlZF91bml0c190b3RhbCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTkxCiAgICAvLyBpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudD1zZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExOTIKICAgIC8vIGV2ZW50X2N1cnNvcj1zZWxmLmV2ZW50X2N1cnNvciwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE5MwogICAgLy8gc2NoZWR1bGVfZW50cnlfY291bnQ9c2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExOTQKICAgIC8vIG91dHN0YW5kaW5nX3ByaW5jaXBhbD1zZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE5NQogICAgLy8gaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZT1zZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE5NgogICAgLy8gbm9taW5hbF9pbnRlcmVzdF9yYXRlPXNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTk3CiAgICAvLyBhY2NydWVkX2ludGVyZXN0PXNlbGYuYWNjcnVlZF9pbnRlcmVzdCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTk4CiAgICAvLyBjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4PXNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE5OQogICAgLy8gY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXg9c2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjAwCiAgICAvLyByZXNlcnZlZF9pbnRlcmVzdD1zZWxmLnJlc2VydmVkX2ludGVyZXN0LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMDEKICAgIC8vIHJlc2VydmVkX3ByaW5jaXBhbD1zZWxmLnJlc2VydmVkX3ByaW5jaXBhbCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExODYtMTIwMgogICAgLy8gcmV0dXJuIHR5cC5LZXJuZWxTdGF0ZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlPWFyYzQuVUludDgoc2VsZi5jb250cmFjdF90eXBlKSwKICAgIC8vICAgICBzdGF0dXM9c2VsZi5zdGF0dXMsCiAgICAvLyAgICAgdG90YWxfdW5pdHM9c2VsZi50b3RhbF91bml0cywKICAgIC8vICAgICByZXNlcnZlZF91bml0c190b3RhbD1zZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsLAogICAgLy8gICAgIGluaXRpYWxfZXhjaGFuZ2VfYW1vdW50PXNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQsCiAgICAvLyAgICAgZXZlbnRfY3Vyc29yPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgLy8gICAgIHNjaGVkdWxlX2VudHJ5X2NvdW50PXNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQsCiAgICAvLyAgICAgb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2U9c2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlLAogICAgLy8gICAgIG5vbWluYWxfaW50ZXJlc3RfcmF0ZT1zZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBhY2NydWVkX2ludGVyZXN0PXNlbGYuYWNjcnVlZF9pbnRlcmVzdCwKICAgIC8vICAgICBjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4PXNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCwKICAgIC8vICAgICBjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleD1zZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4LAogICAgLy8gICAgIHJlc2VydmVkX2ludGVyZXN0PXNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QsCiAgICAvLyAgICAgcmVzZXJ2ZWRfcHJpbmNpcGFsPXNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsLAogICAgLy8gKQogICAgdW5jb3ZlciAxNAogICAgaXRvYgogICAgdW5jb3ZlciAxNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDEzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDEwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgOQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDgKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTgyCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnRbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIwOAogICAgLy8gaWYgc2VsZi5ldmVudF9jdXJzb3IgPj0gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgPj0KICAgIGJ6IGNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMTAKICAgIC8vIGV2ZW50X2lkPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjA5LTEyMTkKICAgIC8vIHJldHVybiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1zZWxmLmV2ZW50X2N1cnNvciwKICAgIC8vICAgICBldmVudF90eXBlPWFyYzQuVUludDgoMCksCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9VUludDY0KDApLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9VUludDY0KDApLAogICAgLy8gICAgIGZsYWdzPVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGl0b2IKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMTEKICAgIC8vIGV2ZW50X3R5cGU9YXJjNC5VSW50OCgwKSwKICAgIGJ5dGVjIDQwIC8vIDB4MDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMDktMTIxOQogICAgLy8gcmV0dXJuIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgIGV2ZW50X2lkPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgLy8gICAgIGV2ZW50X3R5cGU9YXJjNC5VSW50OCgwKSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1VSW50NjQoMCksCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1VSW50NjQoMCksCiAgICAvLyAgICAgZmxhZ3M9VUludDY0KDApLAogICAgLy8gKQogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjEyCiAgICAvLyBzY2hlZHVsZWRfdGltZT1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIwOS0xMjE5CiAgICAvLyByZXR1cm4gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkoCiAgICAvLyAgICAgZXZlbnRfaWQ9c2VsZi5ldmVudF9jdXJzb3IsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1hcmM0LlVJbnQ4KDApLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPVVJbnQ2NCgwKSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249VUludDY0KDApLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPVVJbnQ2NCgwKSwKICAgIC8vICAgICBmbGFncz1VSW50NjQoMCksCiAgICAvLyApCiAgICBpdG9iCiAgICBzd2FwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKCmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudF9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudEA0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIwNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpjb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIyMAogICAgLy8gcmV0dXJuIHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLmV2ZW50X2N1cnNvcikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjA0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50QDQKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5jb250cmFjdF91cGRhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF91cGRhdGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTUzLTE1NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGdyYW50cyB0aGUgdXBkYXRlIHBlcm1pc3Npb25zIHRvIHRoZSBBcnJhbmdlci4KICAgIC8vICMg4pqg77iPIFdBUk5JTkc6IEFwcGxpY2F0aW9uIHVwZGF0ZXMgbXVzdCBiZSBleGVjdXRlZCBWRVJZIGNhcmVmdWxseSwgYXMgdGhleQogICAgLy8gIyBtaWdodCBpbnRyb2R1Y2UgYnJlYWtpbmcgY2hhbmdlcy4KICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfcm90YXRlX2FycmFuZ2VyW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19yb3RhdGVfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2OQogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTcwCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gbmV3X2FycmFuZ2VyCiAgICBieXRlYyAxOCAvLyAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTcxCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfc2V0X29wX2RhZW1vbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfc2V0X29wX2RhZW1vbjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTg0CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODUKICAgIC8vIHNlbGYub3BfZGFlbW9uLnZhbHVlID0gYWRkcmVzcwogICAgYnl0ZWMgMjYgLy8gMHg1MjIzNGY3MDQ0NjE2NTZkNmY2ZTIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4NgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTczCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2Fzc2lnbl9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19hc3NpZ25fcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDE2CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLlJvbGVWYWxpZGl0eQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjExCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMgogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgcHVzaGludCAyMAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTAzCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gcm9sZV9hZGRyZXNzCiAgICBieXRlYyAxOCAvLyAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMKICAgIGRpZyAzCiAgICBhcHBfZ2xvYmFsX3B1dAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTQKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDYKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIGR1cAogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnRfbWFuYWdlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMyAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwOAogICAgLy8gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMiAvLyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTIKICAgIC8vIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIGR1cAogICAgcHVzaGludCA2MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE1CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMzIgLy8gMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE2CiAgICAvLyBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExOAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMSAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIwCiAgICAvLyBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMwogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgODAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIzCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI1IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI0CiAgICAvLyBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3Jldm9rZV9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19yZXZva2Vfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzUKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzNgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzcKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCkpCiAgICBidG9pCiAgICBkdXBuIDIKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCAhPSBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksIGVyci5JTlZBTElEX1JPTEUKICAgIGR1cAogICAgcHVzaGludCAyMAogICAgIT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyOAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIzIC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0NGQ2MTZlNjE2NzY1NzIyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMwCiAgICAvLyBkZWwgc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzOQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjE2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIyIC8vIDB4NTIyMzUwNzI2OTZkNjE3Mjc5NDQ2NTYxNmM2NTcyMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNAogICAgLy8gZGVsIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjM4CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIGR1cAogICAgcHVzaGludCA2MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAzMiAvLyAweDUyMjM1NDcyNzU3Mzc0NjU2NTIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzgKICAgIC8vIGRlbCBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjM4CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDEKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hdXRob3JpdHksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjEgLy8gMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MgogICAgLy8gZGVsIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzOAogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDQKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDgwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI1IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ2CiAgICAvLyBkZWwgc2VsZi5vYnNlcnZlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfY29udHJhY3Rfc3VzcGVuc2lvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfY29udHJhY3Rfc3VzcGVuc2lvbjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCAgIyBUT0RPOiBVcGRhdGUgc3BlY3MgYW5kIGFkZCB0ZXN0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojc3CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyMSAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1NwogICAgLy8gc2VsZi5hc3NldF9zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGJ5dGVjIDMzIC8vICJhc3NldF9zdXNwZW5kZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1OAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QgICMgVE9ETzogVXBkYXRlIHNwZWNzIGFuZCBhZGQgdGVzdAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X2FycmFuZ2VyW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjY4CiAgICAvLyByZXR1cm4gc2VsZi5hcnJhbmdlci52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE4IC8vIDB4NTIyMzQxNzI3MjYxNmU2NzY1NzIyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI2MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYWRkcmVzc19yb2xlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjcwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4NAogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hY2NvdW50X21hbmFnZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjMgLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQ0ZDYxNmU2MTY3NjU3MjIzCiAgICBkaWcgMQogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODUKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYucHJpbWFyeV9kZWFsZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjIgLy8gMHg1MjIzNTA3MjY5NmQ2MTcyNzk0NDY1NjE2YzY1NzIyMwogICAgZGlnIDIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg2CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnRydXN0ZWUsIGFkZHJlc3MpLAogICAgYnl0ZWMgMzIgLy8gMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMwogICAgZGlnIDMKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg3CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgYWRkcmVzcyksCiAgICBieXRlYyAyMSAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgZGlnIDQKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg4CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLm9ic2VydmVyLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDI1IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgdW5jb3ZlciA1CiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlYyA0MCAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciA2CiAgICBzZXRiaXQKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDUKICAgIHNldGJpdAogICAgcHVzaGludCAyCiAgICB1bmNvdmVyIDQKICAgIHNldGJpdAogICAgcHVzaGludCAzCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgcHVzaGludCA0CiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwNQogICAgLy8gcm9sZSA9IHJvbGVfaWQuYXNfdWludDY0KCkKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDYKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGUpCiAgICBkdXAKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA4CiAgICAvLyBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKToKICAgIHB1c2hpbnRzIDIwIDQwIDUwIDYwIDcwIDgwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA3LTMzOAogICAgLy8gbWF0Y2ggcm9sZToKICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKToKICAgIC8vICAgICAgICAgcmV0dXJuIHR5cC5Sb2xlVmFsaWRpdHkoCiAgICAvLyAgICAgICAgICAgICByb2xlX3ZhbGlkaXR5X3N0YXJ0PVVJbnQ2NCgwKSwgcm9sZV92YWxpZGl0eV9lbmQ9VUludDY0KDApCiAgICAvLyAgICAgICAgICkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSk6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSk6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgXzoKICAgIC8vICAgICAgICAgb3AuZXJyKGVyci5JTlZBTElEX1JPTEUpCiAgICB1bmNvdmVyIDYKICAgIG1hdGNoIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMEAyIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMUAzIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMkA0IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfM0A1IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNEA2IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzM4CiAgICAvLyBvcC5lcnIoZXJyLklOVkFMSURfUk9MRSkKICAgIGVyciAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV81QDc6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzM0CiAgICAvLyBzZWxmLm9ic2VydmVyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDI1IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMzMy0zMzUKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLm9ic2VydmVyLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzYKICAgIC8vIHJldHVybiBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV80QDY6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI5CiAgICAvLyBzZWxmLmF1dGhvcml0eSwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAyMSAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOC0zMzAKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLmF1dGhvcml0eSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzMxCiAgICAvLyByZXR1cm4gc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8zQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI0CiAgICAvLyBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMzIgLy8gMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMy0zMjUKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyNgogICAgLy8gcmV0dXJuIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzJANDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTkKICAgIC8vIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMjIgLy8gMHg1MjIzNTA3MjY5NmQ2MTcyNzk0NDY1NjE2YzY1NzIyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxOC0zMjAKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLnByaW1hcnlfZGVhbGVyLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjEKICAgIC8vIHJldHVybiBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMUAzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxNAogICAgLy8gc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMjMgLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQ0ZDYxNmU2MTY3NjU3MjIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEzLTMxNQogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTYKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzBAMjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDktMzExCiAgICAvLyByZXR1cm4gdHlwLlJvbGVWYWxpZGl0eSgKICAgIC8vICAgICByb2xlX3ZhbGlkaXR5X3N0YXJ0PVVJbnQ2NCgwKSwgcm9sZV92YWxpZGl0eV9lbmQ9VUludDY0KDApCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB2b2lkOgpfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZDoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNgogICAgLy8gZGVmIF9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHNlbGYsIGhvbGRpbmdfYWRkcmVzczogQWNjb3VudCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI4CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZCwgZXJyLlNVU1BFTkRFRAogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHB1c2hpbnQgMzg0CiAgICBnZXRiaXQKICAgICEKICAgIGFzc2VydCAvLyBTdXNwZW5kZWQgb3BlcmF0aW9ucwogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuX3NldHRsZV9wb3NpdGlvbihob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB1aW50NjQsIHVpbnQ2NDoKX3NldHRsZV9wb3NpdGlvbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo0NAogICAgLy8gZGVmIF9zZXR0bGVfcG9zaXRpb24oc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50KSAtPiB0dXBsZVtVSW50NjQsIFVJbnQ2NF06CiAgICBwcm90byAxIDIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NjEKICAgIC8vIHBvc2l0aW9uID0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY29weSgpCiAgICBkdXAKICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjYzLTY1CiAgICAvLyAjIENvbXB1dGUgdGhlIGluY3JlbWVudGFsIHBlci11bml0IGZpeGVkLXBvaW50IGludGVyZXN0IGFuZCBwcmluY2lwYWwgYWNjcnVlZAogICAgLy8gIyBzaW5jZSB0aGlzIGFjY291bnQncyBsYXN0IGNoZWNrcG9pbnQuCiAgICAvLyBpbnRlcmVzdF9kZWx0YSA9IHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCAtIHBvc2l0aW9uLmludGVyZXN0X2NoZWNrcG9pbnQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IGV4aXN0cwogICAgZGlnIDEKICAgIHB1c2hpbnQgNTcKICAgIGV4dHJhY3RfdWludDY0CiAgICAtCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NjcKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggLSBwb3NpdGlvbi5wcmluY2lwYWxfY2hlY2twb2ludAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCBleGlzdHMKICAgIGRpZyAyCiAgICBwdXNoaW50IDY1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjczCiAgICAvLyBpbnRlcmVzdF9kZWx0YSwgcG9zaXRpb24udW5pdHMsIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUKICAgIGRpZyAyCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzAtNzQKICAgIC8vICMgQ29udmVydCB0aGUgcGVyLXVuaXQgZml4ZWQtcG9pbnQgZGVsdGFzIGludG8gYWJzb2x1dGUgY2xhaW1hYmxlIGFtb3VudHMKICAgIC8vICMgdXNpbmcgdGhlIGFjY291bnQncyBhY3RpdmUgdW5pdHMuCiAgICAvLyBjbGFpbWFibGVfaW50ZXJlc3QgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBpbnRlcmVzdF9kZWx0YSwgcG9zaXRpb24udW5pdHMsIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUKICAgIC8vICkKICAgIHVuY292ZXIgMwogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3NgogICAgLy8gcHJpbmNpcGFsX2RlbHRhLCBwb3NpdGlvbi51bml0cywgc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojc1LTc3CiAgICAvLyBjbGFpbWFibGVfcHJpbmNpcGFsID0gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgcHJpbmNpcGFsX2RlbHRhLCBwb3NpdGlvbi51bml0cywgc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgLy8gKQogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3OS04MQogICAgLy8gIyBBY2NydWUgdGhlIGNsYWltYWJsZSBhbW91bnRzIHRvIHRoZSBhY2NvdW50IHBvc2l0aW9uIGFuZCBtYWtlIHRoZW0gYXZhaWxhYmxlCiAgICAvLyAjIGZvciB3aXRoZHJhd2FsLgogICAgLy8gcG9zaXRpb24uY2xhaW1hYmxlX2ludGVyZXN0ICs9IGNsYWltYWJsZV9pbnRlcmVzdAogICAgZGlnIDIKICAgIHB1c2hpbnQgNzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgKwogICAgaXRvYgogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICByZXBsYWNlMiA3MwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjgyCiAgICAvLyBwb3NpdGlvbi5jbGFpbWFibGVfcHJpbmNpcGFsICs9IGNsYWltYWJsZV9wcmluY2lwYWwKICAgIGR1cAogICAgcHVzaGludCA4MQogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICArCiAgICBpdG9iCiAgICByZXBsYWNlMiA4MQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojg0LTg2CiAgICAvLyAjIEFkdmFuY2UgdGhlIGFjY291bnQncyBwZXItdW5pdCBmaXhlZC1wb2ludCBjaGVja3BvaW50cyB0byB0aGUgY3VycmVudCBnbG9iYWwKICAgIC8vICMgcGVyLXVuaXQgZml4ZWQtcG9pbnQgZ2xvYmFsIGluZGljZXMuCiAgICAvLyBwb3NpdGlvbi5pbnRlcmVzdF9jaGVja3BvaW50ID0gc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCBleGlzdHMKICAgIGl0b2IKICAgIHJlcGxhY2UyIDU3CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6ODcKICAgIC8vIHBvc2l0aW9uLnByaW5jaXBhbF9jaGVja3BvaW50ID0gc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCBleGlzdHMKICAgIGl0b2IKICAgIHJlcGxhY2UyIDY1CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6ODktOTAKICAgIC8vICMgQWR2YW5jZSB0aGUgYWNjb3VudCdzIGV2ZW50IGN1cnNvciB0byB0aGUgY3VycmVudCBnbG9iYWwgZXZlbnQgY3Vyc29yLgogICAgLy8gcG9zaXRpb24uc2V0dGxlZF9jdXJzb3IgPSBzZWxmLmV2ZW50X2N1cnNvcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpdG9iCiAgICByZXBsYWNlMiA0OQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjkyLTk0CiAgICAvLyAjIFVwZGF0ZSB0aGUgYWNjb3VudCBwb3NpdGlvbiBhbmQgcmV0dXJuIHRoZSBuZXdseSBhY2NydWVkIGNsYWltYWJsZSBhbW91bnRzCiAgICAvLyAjIGFkZGVkIHRvIHRoZSB0b3RhbCBwb3NpdGlvbidzIGNsYWltYWJsZSBhbW91bnRzLgogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSBwb3NpdGlvbi5jb3B5KCkKICAgIHVuY292ZXIgMwogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojk1CiAgICAvLyByZXR1cm4gY2xhaW1hYmxlX2ludGVyZXN0LCBjbGFpbWFibGVfcHJpbmNpcGFsCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5fZW5zdXJlX3VuaXRzX2FjdGl2YXRlZChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB2b2lkOgpfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZDoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo5NwogICAgLy8gZGVmIF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKHNlbGYsIGhvbGRpbmdfYWRkcmVzczogQWNjb3VudCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTAwCiAgICAvLyBpZiBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKToKICAgIGJ6IF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwMQogICAgLy8gcmV0dXJuCiAgICByZXRzdWIKCl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDMKICAgIC8vIHBvc2l0aW9uID0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY29weSgpCiAgICBmcmFtZV9kaWcgMgogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA0CiAgICAvLyBpZiBwb3NpdGlvbi5yZXNlcnZlZF91bml0cyA9PSBVSW50NjQoMCk6CiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIGJueiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZF9hZnRlcl9pZl9lbHNlQDQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDUKICAgIC8vIHJldHVybgogICAgcmV0c3ViCgpfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZF9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA4CiAgICAvLyBwb3NpdGlvbi51bml0cyArPSBhY3RpdmF0ZWRfdW5pdHMKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDMKICAgICsKICAgIGl0b2IKICAgIHJlcGxhY2UyIDMyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA5CiAgICAvLyBwb3NpdGlvbi5yZXNlcnZlZF91bml0cyA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGl0b2IKICAgIHJlcGxhY2UyIDQwCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTEwCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHBvc2l0aW9uLmNvcHkoKQogICAgZnJhbWVfZGlnIDIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTEKICAgIC8vIGFzc2VydCBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID49IGFjdGl2YXRlZF91bml0cywgZXJyLk9WRVJfRElTVFJJQlVUSU9OCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIGV4aXN0cwogICAgZHVwCiAgICBkaWcgMgogICAgPj0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgcmVtYWluaW5nIEQtQVNBIHVuaXRzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTEyCiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIC09IGFjdGl2YXRlZF91bml0cwogICAgc3dhcAogICAgLQogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9zY2FsZWRfbXVsX2RpdihtdWx0aXBsaWNhbmQ6IHVpbnQ2NCwgbXVsdGlwbGllcjogdWludDY0LCBkaXZpc29yOiB1aW50NjQpIC0+IHVpbnQ2NDoKX3NjYWxlZF9tdWxfZGl2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTUzLTE1NQogICAgLy8gZGVmIF9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLCBtdWx0aXBsaWNhbmQ6IFVJbnQ2NCwgbXVsdGlwbGllcjogVUludDY0LCBkaXZpc29yOiBVSW50NjQKICAgIC8vICkgLT4gVUludDY0OgogICAgcHJvdG8gMyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTcKICAgIC8vIGlmIG11bHRpcGxpY2FuZCA9PSBVSW50NjQoMCkgb3IgbXVsdGlwbGllciA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTMKICAgIGJ6IF9zY2FsZWRfbXVsX2Rpdl9pZl9ib2R5QDIKICAgIGZyYW1lX2RpZyAtMgogICAgYm56IF9zY2FsZWRfbXVsX2Rpdl9hZnRlcl9pZl9lbHNlQDMKCl9zY2FsZWRfbXVsX2Rpdl9pZl9ib2R5QDI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTgKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9zY2FsZWRfbXVsX2Rpdl9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTkKICAgIC8vIGhpZ2gsIGxvdyA9IG9wLm11bHcobXVsdGlwbGljYW5kLCBtdWx0aXBsaWVyKQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIG11bHcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2MAogICAgLy8gcmV0dXJuIG9wLmRpdncoaGlnaCwgbG93LCBkaXZpc29yKQogICAgZnJhbWVfZGlnIC0xCiAgICBkaXZ3CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYW1vdW50X3RvX2luZGV4X2RlbHRhKGFtb3VudDogdWludDY0KSAtPiB1aW50NjQ6Cl9hbW91bnRfdG9faW5kZXhfZGVsdGE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjIKICAgIC8vIGRlZiBfYW1vdW50X3RvX2luZGV4X2RlbHRhKHNlbGYsIGFtb3VudDogVUludDY0KSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2NAogICAgLy8gaWYgYW1vdW50ID09IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMQogICAgYm56IF9hbW91bnRfdG9faW5kZXhfZGVsdGFfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjUKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9hbW91bnRfdG9faW5kZXhfZGVsdGFfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTY2CiAgICAvLyBhc3NlcnQgc2VsZi50b3RhbF91bml0cyA+IFVJbnQ2NCgwKSwgZXJyLk5PX1VOSVRTCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgZHVwCiAgICBhc3NlcnQgLy8gTm8gRC1BU0EgdW5pdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2NwogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KGFtb3VudCwgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwgc2VsZi50b3RhbF91bml0cykKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2luZGV4X2RlbHRhX3RvX2Ftb3VudChpbmRleF9kZWx0YTogdWludDY0KSAtPiB1aW50NjQ6Cl9pbmRleF9kZWx0YV90b19hbW91bnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjkKICAgIC8vIGRlZiBfaW5kZXhfZGVsdGFfdG9fYW1vdW50KHNlbGYsIGluZGV4X2RlbHRhOiBVSW50NjQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTc2CiAgICAvLyBpZiBpbmRleF9kZWx0YSA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGJueiBfaW5kZXhfZGVsdGFfdG9fYW1vdW50X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTc3CiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfaW5kZXhfZGVsdGFfdG9fYW1vdW50X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE3OQogICAgLy8gc2VsZi50b3RhbF91bml0cywKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxODEKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNzgtMTgyCiAgICAvLyByZXR1cm4gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgc2VsZi50b3RhbF91bml0cywKICAgIC8vICAgICBpbmRleF9kZWx0YSwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2dldF9zY2hlZHVsZV9lbnRyeShldmVudF9pZDogdWludDY0KSAtPiBieXRlczoKX2dldF9zY2hlZHVsZV9lbnRyeToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIwMgogICAgLy8gZGVmIF9nZXRfc2NoZWR1bGVfZW50cnkoc2VsZiwgZXZlbnRfaWQ6IFVJbnQ2NCkgLT4gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnk6CiAgICBwcm90byAxIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIwNAogICAgLy8gYXNzZXJ0IGV2ZW50X2lkIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgPgogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgaWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE5MAogICAgLy8gcmV0dXJuIGV2ZW50X2lkIC8vIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDE2CiAgICAvCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMDYKICAgIC8vIGFzc2VydCBwYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxOTQKICAgIC8vIHJldHVybiBldmVudF9pZCAlIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDE2CiAgICAlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMDkKICAgIC8vIGFzc2VydCBvZmZzZXQgPCBwYWdlLmxlbmd0aCwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBwdXNoaW50IDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgMQogICAgPgogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjEwCiAgICAvLyByZXR1cm4gcGFnZVtvZmZzZXRdLmNvcHkoKQogICAgcHVzaGludCA2NQogICAgKgogICAgcHVzaGludCAyCiAgICArCiAgICBwdXNoaW50IDY1CiAgICBib3hfZXh0cmFjdAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKGNvbnRyYWN0X3R5cGU6IHVpbnQ2NCwgZXZlbnRfdHlwZTogdWludDY0KSAtPiB2b2lkOgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTMtMzE1CiAgICAvLyBkZWYgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIHNlbGYsIGNvbnRyYWN0X3R5cGU6IFVJbnQ2NCwgZXZlbnRfdHlwZTogVUludDY0CiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNDcKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNDgKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgaW50Y18yIC8vIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI0OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9NRCksCiAgICBwdXNoaW50IDE5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTAKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgcHVzaGludCAxMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU0LTI1NQogICAgLy8gIyBDaGVjayBjb21tb24gZXZlbnRzIGZpcnN0CiAgICAvLyBpZiBldmVudF90eXBlIGluIGNvbW1vbl9ldmVudHM6CiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjUxCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICBwdXNoaW50IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUA3CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU2CiAgICAvLyByZXR1cm4gVHJ1ZQogICAgaW50Y18xIC8vIDEKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICByZXRzdWIKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTgtMjU5CiAgICAvLyAjIENvbnRyYWN0LXNwZWNpZmljIGFkZGl0aW9uYWwgZXZlbnRzCiAgICAvLyBpZiBjb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9QQU0pOgogICAgZnJhbWVfZGlnIC0yCiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjYwLTI2MQogICAgLy8gIyBQQU0gb25seSBzdXBwb3J0cyBjb21tb24gZXZlbnRzCiAgICAvLyByZXR1cm4gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNjMKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0xBTSkgb3IgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2My0yNjUKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0xBTSkgb3IgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoCiAgICAvLyAgICAgZW51bXMuQ1RfTkFNCiAgICAvLyApOgogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDExCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMgogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDE2CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUAxMToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2Ni0yNzAKICAgIC8vICMgTEFNL05BTSBhZGQ6IFBSLCBJUENCCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjY4CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjY2LTI3MAogICAgLy8gIyBMQU0vTkFNIGFkZDogUFIsIElQQ0IKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDEzCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIHB1c2hpbnQgMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2Ni0yNzAKICAgIC8vICMgTEFNL05BTSBhZGQ6IFBSLCBJUENCCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICkKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF9mYWxzZUAxNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAxMzoKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDE0OgogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMTY6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzIKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTik6CiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMjMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3My0yNzgKICAgIC8vICMgQU5OIGFkZHM6IFBSLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjc1CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjczLTI3OAogICAgLy8gIyBBTk4gYWRkczogUFIsIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDIwCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIHB1c2hpbnQgMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3My0yNzgKICAgIC8vICMgQU5OIGFkZHM6IFBSLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyMAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzcKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIHB1c2hpbnQgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjczLTI3OAogICAgLy8gIyBBTk4gYWRkczogUFIsIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDIxCgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDIwOgogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMjE6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAyMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MAogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfTEFYKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA0CiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMzEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MS0yODcKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MwogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUiksCiAgICBwdXNoaW50IDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MS0yODcKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjgKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjg0CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjgxLTI4NwogICAgLy8gIyBMQVggYWRkczogUFIsIFBJLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyOAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODUKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICBwdXNoaW50IDE4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODEtMjg3CiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDI4CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODEtMjg3CiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDI5CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDI4OgogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMjk6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAzMToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4OQogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQ0xNKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA1CiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMzMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI5MC0yOTEKICAgIC8vICMgQ0xNIGFkZHM6IFBSCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1BSKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDMKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDMzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjkzCiAgICAvLyByZXR1cm4gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5faXNfZHluYW1pY19hbm51aXR5KCkgLT4gdWludDY0OgpfaXNfZHluYW1pY19hbm51aXR5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM1CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzUtMzM2CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIC8vIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGJ6IF9pc19keW5hbWljX2FubnVpdHlfYm9vbF9mYWxzZUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzYKICAgIC8vIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzNCAvLyAiZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM1LTMzNgogICAgLy8gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICAvLyBhbmQgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBieiBfaXNfZHluYW1pY19hbm51aXR5X2Jvb2xfZmFsc2VAMwogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMzNC0zMzcKICAgIC8vIHJldHVybiAoCiAgICAvLyAgICAgc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICAvLyAgICAgYW5kIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgLy8gKQogICAgcmV0c3ViCgpfaXNfZHluYW1pY19hbm51aXR5X2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzQtMzM3CiAgICAvLyByZXR1cm4gKAogICAgLy8gICAgIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKQogICAgLy8gICAgIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIC8vICkKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KGVudHJ5OiBieXRlcykgLT4gdWludDY0LCBieXRlczoKX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozODAKICAgIC8vIGRlZiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudChzZWxmLCBlbnRyeTogdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5CiAgICAvLyBlbnRyeS5hY2NydWFsX2ZhY3RvciA9PSBVSW50NjQoMCkKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAxNwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5LTM5MQogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGJ6IF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2lmX2JvZHlAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzkwCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5LTM5MQogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGJ6IF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2lmX2JvZHlAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzkxCiAgICAvLyBvciBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPT0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5LTM5MQogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGJueiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudF9hZnRlcl9pZl9lbHNlQDQKCl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2lmX2JvZHlAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5MwogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2RpZyAtMQogICAgdW5jb3ZlciAyCiAgICByZXRzdWIKCl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NQogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NgogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NC0zOTgKICAgIC8vIGFjY3J1ZWQgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICAvLyAgICAgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICkKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MDIKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozOTktNDAzCiAgICAvLyByZXR1cm4gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgYWNjcnVlZCwKICAgIC8vICAgICBlbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICBmcmFtZV9kaWcgLTEKICAgIHVuY292ZXIgMgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yKGRpc2NvdW50X2ZhY3RvcjogdWludDY0LCByZWRlbXB0aW9uX2ZhY3RvcjogdWludDY0KSAtPiB1aW50NjQ6Cl9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ2Mi00NjYKICAgIC8vIGRlZiBfZGlzY291bnRfYW5udWl0eV9mYWN0b3IoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBkaXNjb3VudF9mYWN0b3I6IFVJbnQ2NCwKICAgIC8vICAgICByZWRlbXB0aW9uX2ZhY3RvcjogVUludDY0LAogICAgLy8gKSAtPiBVSW50NjQ6CiAgICBwcm90byAyIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ2OAogICAgLy8gaWYgcmVkZW1wdGlvbl9mYWN0b3IgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0xCiAgICBibnogX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDY5CiAgICAvLyByZXR1cm4gZGlzY291bnRfZmFjdG9yCiAgICBmcmFtZV9kaWcgLTIKICAgIHJldHN1YgoKX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3MAogICAgLy8gcGVyaW9kX3JhdGUgPSBzZWxmLmZpeGVkX3BvaW50X3NjYWxlICsgc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzEKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzAtNDc0CiAgICAvLyBwZXJpb2RfcmF0ZSA9IHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgKyBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICByZWRlbXB0aW9uX2ZhY3RvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICBkaWcgMgogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgICsKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3NQogICAgLy8gYXNzZXJ0IHBlcmlvZF9yYXRlID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGR1cAogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDc4CiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDc2LTQ4MAogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIGRpc2NvdW50X2ZhY3RvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gICAgIHBlcmlvZF9yYXRlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkoZW50cnk6IGJ5dGVzLCBwYXlsb2FkOiBieXRlcykgLT4gYnl0ZXMsIGJ5dGVzOgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MTMtNjE1CiAgICAvLyBkZWYgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5KAogICAgLy8gICAgIHNlbGYsIGVudHJ5OiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSwgcGF5bG9hZDogdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0CiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAyIDIKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjIzCiAgICAvLyBhc3NlcnQgZW50cnkuZXZlbnRfaWQgPT0gc2VsZi5ldmVudF9jdXJzb3IsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGN1cnNvcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjI0CiAgICAvLyBhc3NlcnQgZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsIGVyci5OT19EVUVfQ0FTSEZMT1cKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPD0KICAgIGFzc2VydCAvLyBObyBkdWUgY2FzaGZsb3cgdG8gcGF5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MjYKICAgIC8vIGV2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYyNwogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX0lFRCk6CiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGR1cAogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYyOC02MzAKICAgIC8vICMgSUVEIGZpbmFsaXplcyBpc3N1YW5jZTogcmVzZXJ2ZWQgdW5pdHMgYmVjb21lIGFjdGl2YXRhYmxlIGFuZCB0aGUKICAgIC8vICMgc2NoZWR1bGUncyBpbml0aWFsIGNvbnRyYWN0dWFsIHN0YXRlIGJlY29tZXMgbGl2ZS4KICAgIC8vIGFzc2VydCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzIKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPT0gc2VsZi50b3RhbF91bml0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjMxLTYzMwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID09IHNlbGYudG90YWxfdW5pdHMKICAgIC8vICksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9JTkNPTVBMRVRFCiAgICBhc3NlcnQgLy8gUHJpbWFyeSBkaXN0cmlidXRpb24gaXMgbm90IGNvbXBsZXRlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzQKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM1CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzYKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAzMwogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzcKICAgIC8vIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM4CiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzkKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0MAogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX0FDVElWRSkKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgMTAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDUxCiAgICAvLyBhc3NlcnQgZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSA9PSBVSW50NjQoZW51bXMuRVZUX0lFRCksIGVyci5OT1RfRVZUX0lFRAogICAgZnJhbWVfZGlnIDExCiAgICBhc3NlcnQgLy8gTm90IElFRCBldmVudAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDUyCiAgICAvLyByZXR1cm4gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0MS02NDUKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1zZWxmLl9lbnRyeV9pZWRfYW1vdW50KGVudHJ5KSwKICAgIC8vICAgICBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0NAogICAgLy8gc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0MS02NDUKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1zZWxmLl9lbnRyeV9pZWRfYW1vdW50KGVudHJ5KSwKICAgIC8vICAgICBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICAvLyApCiAgICBjYWxsc3ViIF9lbWl0X2V4ZWN1dGlvbl9ldmVudAogICAgZHVwCiAgICBmcmFtZV9idXJ5IC0yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NDYKICAgIC8vIHJldHVybgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0OQogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ICs9IHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBmcmFtZV9idXJ5IC0yCiAgICArCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1MQogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1JSKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCAxMgogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMTAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1NQogICAgLy8gcGF5bG9hZC5vYnNlcnZlZF9yYXRlLAogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjU2CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzNiAvLyAicmF0ZV9yZXNldF9tdWx0aXBsaWVyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1NwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1Mi02NTgKICAgIC8vICMgUlIgZGVyaXZlcyB0aGUgbmV4dCByYXRlIGZyb20gYW4gb2JzZXJ2ZWQgb3JhY2xlIHZhbHVlIHBsdXMgdGhlCiAgICAvLyAjIGNvbnRyYWN0IHNwcmVhZCAvIG11bHRpcGxpZXIgdGVybXMsIHRoZW4gZW5mb3JjZXMgZmxvb3IgYW5kIGNhcC4KICAgIC8vIG9ic2VydmVkX3JhdGUgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBwYXlsb2FkLm9ic2VydmVkX3JhdGUsCiAgICAvLyAgICAgc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICkKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjAKICAgIC8vIG9ic2VydmVkX3JhdGUgKyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzUgLy8gInJhdGVfcmVzZXRfc3ByZWFkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkIGV4aXN0cwogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDEKICAgIC8vIGlmIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgYW5kIHJhdGUgPCBzZWxmLnJhdGVfcmVzZXRfZmxvb3I6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzggLy8gImhhc19yYXRlX3Jlc2V0X2Zsb29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmhhc19yYXRlX3Jlc2V0X2Zsb29yIGV4aXN0cwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMCAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X2Zsb29yIGV4aXN0cwogICAgZnJhbWVfZGlnIDYKICAgID4KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDIKICAgIC8vIHJhdGUgPSBzZWxmLnJhdGVfcmVzZXRfZmxvb3IKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMCAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDYKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfZmxvb3IgZXhpc3RzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1NToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc0MwogICAgLy8gaWYgc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgYW5kIHJhdGUgPiBzZWxmLnJhdGVfcmVzZXRfY2FwOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDM5IC8vICJoYXNfcmF0ZV9yZXNldF9jYXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwIGV4aXN0cwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTgKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMSAvLyAicmF0ZV9yZXNldF9jYXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9jYXAgZXhpc3RzCiAgICBmcmFtZV9kaWcgNgogICAgPAogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc0NAogICAgLy8gcmF0ZSA9IHNlbGYucmF0ZV9yZXNldF9jYXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMSAvLyAicmF0ZV9yZXNldF9jYXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSA2CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X2NhcCBleGlzdHMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjU5CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IHNlbGYuX2NsYW1wX3JhdGUoCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NTktNjYxCiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IHNlbGYuX2NsYW1wX3JhdGUoCiAgICAvLyAgICAgb2JzZXJ2ZWRfcmF0ZSArIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQKICAgIC8vICkKICAgIGZyYW1lX2RpZyA2CiAgICBhcHBfZ2xvYmFsX3B1dAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMTg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzEKICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QSSk6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMjAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY3MgogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzMKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDIzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc4CiAgICAvLyBpZiBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKToKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAyOQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc5CiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFJGKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCA1CiAgICA9PQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMzAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4MwogICAgLy8gKyAoc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCAtIHNlbGYuZXZlbnRfY3Vyc29yKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICAtCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODQKICAgIC8vICogVUludDY0KGNzdC5PUF9VUF9OT05fQ0FTSF9QRVJfRU5UUllfQlVER0VUKQogICAgcHVzaGludCAxMDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4My02ODQKICAgIC8vICsgKHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgLSBzZWxmLmV2ZW50X2N1cnNvcikKICAgIC8vICogVUludDY0KGNzdC5PUF9VUF9OT05fQ0FTSF9QRVJfRU5UUllfQlVER0VUKQogICAgKgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjgyCiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX05PTl9DQVNIX0JBU0VfQlVER0VUKQogICAgaW50YyA0IC8vIDE1MDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4Mi02ODQKICAgIC8vIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfQkFTRV9CVURHRVQpCiAgICAvLyArIChzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IC0gc2VsZi5ldmVudF9jdXJzb3IpCiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfUEVSX0VOVFJZX0JVREdFVCkKICAgICsKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4MC02ODYKICAgIC8vIGVuc3VyZV9idWRnZXQoCiAgICAvLyAgICAgcmVxdWlyZWRfYnVkZ2V0PSgKICAgIC8vICAgICAgICAgVUludDY0KGNzdC5PUF9VUF9OT05fQ0FTSF9CQVNFX0JVREdFVCkKICAgIC8vICAgICAgICAgKyAoc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCAtIHNlbGYuZXZlbnRfY3Vyc29yKQogICAgLy8gICAgICAgICAqIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfUEVSX0VOVFJZX0JVREdFVCkKICAgIC8vICAgICApLAogICAgLy8gKQogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDkwCiAgICAvLyBkaXNjb3VudF9mYWN0b3IgPSBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5MQogICAgLy8gZGVub21pbmF0b3IgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5MgogICAgLy8gc2tpcF9maXJzdF9yZWRlbXB0aW9uID0gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5NAogICAgLy8gaWYgZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAyNQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgZnJhbWVfYnVyeSA4CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAzNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDk1LTQ5OQogICAgLy8gIyBBbiBpbml0aWFsIFBSRiBtYXkgZGVzY3JpYmUgdGhlIGZpcnN0IHJlZGVtcHRpb24gcGVyaW9kIGRpcmVjdGx5LgogICAgLy8gZGlzY291bnRfZmFjdG9yID0gc2VsZi5fZGlzY291bnRfYW5udWl0eV9mYWN0b3IoCiAgICAvLyAgICAgZGlzY291bnRfZmFjdG9yLAogICAgLy8gICAgIGVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDgKICAgIGNhbGxzdWIgX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTAxCiAgICAvLyBza2lwX2ZpcnN0X3JlZGVtcHRpb24gPSBUcnVlCiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfYnVyeSA3CiAgICBmcmFtZV9idXJ5IDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDM1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTAzCiAgICAvLyBmdXR1cmVfZXZlbnRfaWQgPSBzZWxmLmV2ZW50X2N1cnNvciArIFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfd2hpbGVfdG9wQDM2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA0CiAgICAvLyB3aGlsZSBmdXR1cmVfZXZlbnRfaWQgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgZnJhbWVfZGlnIDMKICAgID4KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl93aGlsZUA0OAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA1CiAgICAvLyBmdXR1cmVfZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoZnV0dXJlX2V2ZW50X2lkKQogICAgZnJhbWVfZGlnIDMKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwNgogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPSBmdXR1cmVfZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MDctNTA4CiAgICAvLyAjIE9ubHkgcmVkZW1wdGlvbi1iZWFyaW5nIGV2ZW50cyBjb250cmlidXRlIHRvIHRoZSBhbm51aXR5IGRlbm9taW5hdG9yLgogICAgLy8gaXNfcmVkZW1wdGlvbl9ldmVudCA9IGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpIG9yICgKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwNy01MTEKICAgIC8vICMgT25seSByZWRlbXB0aW9uLWJlYXJpbmcgZXZlbnRzIGNvbnRyaWJ1dGUgdG8gdGhlIGFubnVpdHkgZGVub21pbmF0b3IuCiAgICAvLyBpc19yZWRlbXB0aW9uX2V2ZW50ID0gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QUikgb3IgKAogICAgLy8gICAgIGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfTUQpCiAgICAvLyAgICAgYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICAvLyApCiAgICBibnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfdHJ1ZUA0MAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA5CiAgICAvLyBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgZnJhbWVfZGlnIDQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MDktNTEwCiAgICAvLyBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgLy8gYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF9mYWxzZUA0MQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTEwCiAgICAvLyBhbmQgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IgPiBVSW50NjQoMCkKICAgIGZyYW1lX2RpZyAwCiAgICBwdXNoaW50IDI1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA5LTUxMAogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCkKICAgIC8vIGFuZCBmdXR1cmVfZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX3RydWVANDA6CiAgICBpbnRjXzEgLy8gMQoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfbWVyZ2VANDI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTIKICAgIC8vIGlmIGlzX3JlZGVtcHRpb25fZXZlbnQ6CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA0NwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTEzCiAgICAvLyBpZiBza2lwX2ZpcnN0X3JlZGVtcHRpb246CiAgICBmcmFtZV9kaWcgNwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUA0NQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTE0CiAgICAvLyBza2lwX2ZpcnN0X3JlZGVtcHRpb24gPSBGYWxzZQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgNwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANDc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjEKICAgIC8vIGZ1dHVyZV9ldmVudF9pZCArPSBVSW50NjQoMSkKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV93aGlsZV90b3BAMzYKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlANDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTgKICAgIC8vIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZnJhbWVfZGlnIDAKICAgIHB1c2hpbnQgMjUKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTYtNTE5CiAgICAvLyBkaXNjb3VudF9mYWN0b3IgPSBzZWxmLl9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcigKICAgIC8vICAgICBkaXNjb3VudF9mYWN0b3IsCiAgICAvLyAgICAgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMgogICAgc3dhcAogICAgY2FsbHN1YiBfZGlzY291bnRfYW5udWl0eV9mYWN0b3IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjAKICAgIC8vIGRlbm9taW5hdG9yICs9IGRpc2NvdW50X2ZhY3RvcgogICAgZnJhbWVfZGlnIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA0NwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDE6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF9tZXJnZUA0MgoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX3doaWxlQDQ4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTIzCiAgICAvLyBhc3NlcnQgZGVub21pbmF0b3IgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZnJhbWVfZGlnIDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUyNAogICAgLy8gbnVtZXJhdG9yID0gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTI1CiAgICAvLyBpZiBlbnRyeS5mbGFncyAmIFVJbnQ2NChlbnVtcy5GTEFHX0lOSVRJQUxfUFJGKSA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNTcKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gOAogICAgJgogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDUwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjYtNTI3CiAgICAvLyAjIFN1YnNlcXVlbnQgUFJGIGV2ZW50cyBhbW9ydGl6ZSBib3RoIHByaW5jaXBhbCBhbmQgYWxyZWFkeSBhY2NydWVkIGNhcnJ5LgogICAgLy8gbnVtZXJhdG9yICs9IHNlbGYuYWNjcnVlZF9pbnRlcmVzdAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgICsKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDUwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTMwCiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTI4LTUzMgogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIG51bWVyYXRvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gICAgIGRlbm9taW5hdG9yLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDEKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODcKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IHNlbGYuX3JlY2FsY3VsYXRlX2FubnVpdHlfcGF5bWVudCgKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njg3LTY4OQogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gc2VsZi5fcmVjYWxjdWxhdGVfYW5udWl0eV9wYXltZW50KAogICAgLy8gICAgIGVudHJ5CiAgICAvLyApCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMzA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OTIKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY5My02OTcKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1VSW50NjQoMCksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OTUKICAgIC8vIHBheW9mZj1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njk2CiAgICAvLyBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY5My02OTcKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1VSW50NjQoMCksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgY2FsbHN1YiBfZW1pdF9leGVjdXRpb25fZXZlbnQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDI5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjkxCiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDMwCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDIwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc0CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9JUENCKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCAxOAogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDIzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzUtNjc2CiAgICAvLyAjIElQQ0Iga2VlcHMgcHJpbmNpcGFsIHVuY2hhbmdlZCBhbmQgb25seSByZXNldHMgdGhlIGludGVyZXN0IGJhc2UuCiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIGIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMjMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMTA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjIKICAgIC8vIGVsaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1JSRik6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgMTEKICAgID09CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDE0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjMKICAgIC8vIG5leHRfcmF0ZSA9IGVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY0CiAgICAvLyBpZiBuZXh0X3JhdGUgPT0gVUludDY0KDApOgogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDEzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjUKICAgIC8vIG5leHRfcmF0ZSA9IHNlbGYucmF0ZV9yZXNldF9uZXh0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzcgLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDUKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfbmV4dCBleGlzdHMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY2CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IG5leHRfcmF0ZQogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgZnJhbWVfZGlnIDUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDE0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY4CiAgICAvLyBpZiBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSAhPSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgOQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2OQogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPSBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZQogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgZnJhbWVfZGlnIDkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KGVudHJ5OiBieXRlcywgcGF5b2ZmOiB1aW50NjQsIHNldHRsZWRfYW1vdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpfZW1pdF9leGVjdXRpb25fZXZlbnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MDMtNzA5CiAgICAvLyBkZWYgX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgKiwKICAgIC8vICAgICBlbnRyeTogdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnksCiAgICAvLyAgICAgcGF5b2ZmOiBVSW50NjQsCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ6IFVJbnQ2NCwKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDMgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzEzCiAgICAvLyBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25JRAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE0CiAgICAvLyBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIGZyYW1lX2RpZyAtMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTUKICAgIC8vIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIGZyYW1lX2RpZyAtMwogICAgZXh0cmFjdCA4IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxNgogICAgLy8gc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICBmcmFtZV9kaWcgLTMKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTcKICAgIC8vIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MjAKICAgIC8vIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIGZyYW1lX2RpZyAtMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE1CiAgICAvLyBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICBpbnRjXzIgLy8gOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIwCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBnZXRieXRlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDkKICAgIC8vIGlmIHBheW9mZiA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJueiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NTAKICAgIC8vIHJldHVybiBVSW50NjQoZW51bXMuUEFZT0ZGX1NJR05fUE9TSVRJVkUpCiAgICBpbnRjXzEgLy8gMQoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX3BheW9mZl9zaWduQDc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTktNzIxCiAgICAvLyBwYXlvZmZfc2lnbj1hcmM0LlVJbnQ4KAogICAgLy8gICAgIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIC8vICksCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgaW50Y18yIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MjMKICAgIC8vIGN1cnJlbmN5X2lkPXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzI0CiAgICAvLyBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTItNzI1CiAgICAvLyBFeGVjdXRpb25FdmVudCgKICAgIC8vICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIC8vICAgICBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYXBwbGllZF9hdD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICBwYXlvZmY9cGF5b2ZmLAogICAgLy8gICAgIHBheW9mZl9zaWduPWFyYzQuVUludDgoCiAgICAvLyAgICAgICAgIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIC8vICAgICApLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PXNldHRsZWRfYW1vdW50LAogICAgLy8gICAgIGN1cnJlbmN5X2lkPXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAwCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzExLTcyNgogICAgLy8gYXJjNC5lbWl0KAogICAgLy8gICAgIEV4ZWN1dGlvbkV2ZW50KAogICAgLy8gICAgICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgICAgIHBheW9mZj1wYXlvZmYsCiAgICAvLyAgICAgICAgIHBheW9mZl9zaWduPWFyYzQuVUludDgoCiAgICAvLyAgICAgICAgICAgICBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICAvLyAgICAgICAgICksCiAgICAvLyAgICAgICAgIHNldHRsZWRfYW1vdW50PXNldHRsZWRfYW1vdW50LAogICAgLy8gICAgICAgICBjdXJyZW5jeV9pZD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgICAgIHNlcXVlbmNlPWVudHJ5LmV2ZW50X2lkICsgVUludDY0KDEpLAogICAgLy8gICAgICkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDlhMzMyYjk1IC8vIG1ldGhvZCAiRXhlY3V0aW9uRXZlbnQodWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc1MQogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiAoVUludDY0KGVudW1zLkVWVF9JRUQpLCBVSW50NjQoZW51bXMuRVZUX1BJKSk6CiAgICBmcmFtZV9kaWcgNQogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBibnogX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2lmX2JvZHlANQogICAgZnJhbWVfZGlnIDUKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGJ6IF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pZl9lbHNlQDYKCl9lbWl0X2V4ZWN1dGlvbl9ldmVudF9pZl9ib2R5QDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NTIKICAgIC8vIHJldHVybiBVSW50NjQoZW51bXMuUEFZT0ZGX1NJR05fUE9TSVRJVkUpCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIwCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBiIF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9wYXlvZmZfc2lnbkA3CgpfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzUzCiAgICAvLyByZXR1cm4gVUludDY0KGVudW1zLlBBWU9GRl9TSUdOX05FR0FUSVZFKQogICAgcHVzaGludCAyNTUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcyMAogICAgLy8gc2VsZi5fcGF5b2ZmX3NpZ24oZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSwgcGF5b2ZmKQogICAgYiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fcGF5b2ZmX3NpZ25ANwoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9yb2xlX2lzX2FjdGl2ZShyb2xlX21hcDogYnl0ZXMsIHJvbGVfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NDoKX3JvbGVfaXNfYWN0aXZlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU3CiAgICAvLyBkZWYgX3JvbGVfaXNfYWN0aXZlKHNlbGYsIHJvbGVfbWFwOiB0eXAuUmJhY1JvbGUsIHJvbGVfYWRkcmVzczogQWNjb3VudCkgLT4gYm9vbDoKICAgIHByb3RvIDIgMQogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5CiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5LTYwCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5LTYxCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjEKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAtNjEKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgPj0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX21lcmdlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKSAtPiB2b2lkOgpfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2NQogICAgLy8gYXNzZXJ0IHNlbGYuX2lzX2FycmFuZ2VyKFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTIKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgPT0gc2VsZi5hcnJhbmdlci52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE4IC8vIDB4NTIyMzQxNzI3MjYxNmU2NzY1NzIyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgPT0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2NQogICAgLy8gYXNzZXJ0IHNlbGYuX2lzX2FycmFuZ2VyKFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpIC0+IHZvaWQ6Cl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4MwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFzc2V0X2RlZmF1bHRlZCwgZXJyLkRFRkFVTFRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQxIC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfZGVmYXVsdGVkIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIERlZmF1bHRlZAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkgLT4gdm9pZDoKX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg2CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYXNzZXRfc3VzcGVuZGVkLCBlcnIuU1VTUEVOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzMgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9zdXNwZW5kZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gU3VzcGVuZGVkIG9wZXJhdGlvbnMKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkOiB1aW50NjQpIC0+IHZvaWQ6Cl9hc3NlcnRfdmFsaWRfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OAogICAgLy8gZGVmIF9hc3NlcnRfdmFsaWRfcm9sZShzZWxmLCByb2xlX2lkOiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTAKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIHB1c2hpbnQgMjAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkxCiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgcHVzaGludCAyNQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTIKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICBwdXNoaW50IDQwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MwogICAgLy8gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgcHVzaGludCA1MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTQKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgcHVzaGludCA2MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTUKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICBwdXNoaW50IDcwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NgogICAgLy8gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgcHVzaGludCA4MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfZmFsc2VAOAoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3OgogICAgaW50Y18xIC8vIDEKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX21lcmdlQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgcmV0c3ViCgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9mYWxzZUA4OgogICAgaW50Y18wIC8vIDAKICAgIGIgX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfbWVyZ2VAOQo=", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCAzMiAxNTAwCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUgInN0YXR1cyIgImV2ZW50X2N1cnNvciIgInNjaGVkdWxlX2VudHJ5X2NvdW50IiAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIiAiZml4ZWRfcG9pbnRfc2NhbGUiICJhY2NydWVkX2ludGVyZXN0IiAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIgMHg0MTIzICJub21pbmFsX2ludGVyZXN0X3JhdGUiICJjb250cmFjdF90eXBlIiAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiICJyZXNlcnZlZF9wcmluY2lwYWwiICJ0b3RhbF91bml0cyIgIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iICJyZXNlcnZlZF9pbnRlcmVzdCIgImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIgMHg1MjNhNDE1MjUyMjMgInNldHRsZW1lbnRfYXNzZXRfaWQiICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIgMHg1MjNhNDE1NTU0MjMgMHg1MjNhNTA1OTQ0MjMgMHg1MjNhNGQ0ZTQ3MjMgMHg1MzIzIDB4NTIzYTRkNGY0MzIzIDB4NTIzYTRmNTA0NDIzICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiICJ0cmFuc2Zlcl9vcGVuaW5nX2RhdGUiICJ0cmFuc2Zlcl9jbG9zdXJlX2RhdGUiICJyYXRlX3Jlc2V0X2Zsb29yIiAicmF0ZV9yZXNldF9jYXAiIDB4NTIzYTU0NTI1MzIzICJhc3NldF9zdXNwZW5kZWQiICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIiAicmF0ZV9yZXNldF9zcHJlYWQiICJyYXRlX3Jlc2V0X211bHRpcGxpZXIiICJyYXRlX3Jlc2V0X25leHQiICJoYXNfcmF0ZV9yZXNldF9mbG9vciIgImhhc19yYXRlX3Jlc2V0X2NhcCIgMHgwMCAiYXNzZXRfZGVmYXVsdGVkIiAicHJvc3BlY3R1c19oYXNoIiAicHJvc3BlY3R1c191cmwiICJkZW5vbWluYXRpb25fYXNzZXRfaWQiICJtYXR1cml0eV9kYXRlIiAiZGF5X2NvdW50X2NvbnZlbnRpb24iIDB4MDY4MTAxIDB4MDAwMAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4LTI5CiAgICAvLyAjIFJCQUMgUm9sZXMKICAgIC8vIHNlbGYuYXJyYW5nZXIgPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX0FSUkFOR0VSKQogICAgYnl0ZWMgMTggLy8gMHg1MjNhNDE1MjUyMjMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMAogICAgLy8gc2VsZi5vcF9kYWVtb24gPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX09QX0RBRU1PTikKICAgIGJ5dGVjIDI2IC8vIDB4NTIzYTRmNTA0NDIzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NDctNDgKICAgIC8vICMgRC1BU0EgR292ZXJuYW5jZQogICAgLy8gc2VsZi5hc3NldF9zdXNwZW5kZWQgPSBGYWxzZQogICAgYnl0ZWMgMzMgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjQ5CiAgICAvLyBzZWxmLmFzc2V0X2RlZmF1bHRlZCA9IEZhbHNlCiAgICBieXRlYyA0MSAvLyAiYXNzZXRfZGVmYXVsdGVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1Ni01NwogICAgLy8gIyBDb250cmFjdAogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKQogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OAogICAgLy8gc2VsZi5jb250cmFjdF90eXBlID0gVUludDY0KCkKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MC02MQogICAgLy8gIyBQcm9zcGVjdHVzIChJbmZvcm1hdGlvbmFsKQogICAgLy8gc2VsZi5wcm9zcGVjdHVzX2hhc2ggPSBCeXRlcygpCiAgICBieXRlYyA0MiAvLyAicHJvc3BlY3R1c19oYXNoIgogICAgcHVzaGJ5dGVzIDB4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjIKICAgIC8vIHNlbGYucHJvc3BlY3R1c191cmwgPSBTdHJpbmcoKQogICAgYnl0ZWMgNDMgLy8gInByb3NwZWN0dXNfdXJsIgogICAgcHVzaGJ5dGVzICIiCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjQtNjUKICAgIC8vICMgRGVub21pbmF0aW9uCiAgICAvLyBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCA9IEFzc2V0KCkKICAgIGJ5dGVjIDQ0IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBBc3NldCgpCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjgtNjkKICAgIC8vICMgVGltZQogICAgLy8gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGUgPSB0eXAuVGltZVN0YW1wKCkKICAgIGJ5dGVjIDI3IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcwCiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSB0eXAuVGltZVN0YW1wKCkKICAgIGJ5dGVjIDQ1IC8vICJtYXR1cml0eV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MQogICAgLy8gc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgPSB0eXAuVGltZVN0YW1wKCkKICAgIGJ5dGVjIDI4IC8vICJ0cmFuc2Zlcl9vcGVuaW5nX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcyCiAgICAvLyBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgMjkgLy8gInRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzQtNzUKICAgIC8vICMgRGF5IENvdW50IENvbnZlbnRpb24KICAgIC8vIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPSBVSW50NjQoKQogICAgYnl0ZWMgNDYgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3Ny03OAogICAgLy8gIyBVbml0cwogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IFVJbnQ2NCgpCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc5CiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID0gVUludDY0KCkKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODEtODIKICAgIC8vICMgUHJpbmNpcGFsCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID0gVUludDY0KCkKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODMKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gVUludDY0KCkKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODUKICAgIC8vIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiA9IEZhbHNlCiAgICBieXRlYyAzNCAvLyAiZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODctODgKICAgIC8vICMgSW50ZXJlc3QKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OQogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ID0gVUludDY0KCkKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkxLTkyCiAgICAvLyAjIEludGVyZXN0IFJhdGVzCiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzCiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkID0gVUludDY0KCkKICAgIGJ5dGVjIDM1IC8vICJyYXRlX3Jlc2V0X3NwcmVhZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9tdWx0aXBsaWVyID0gVUludDY0KCkKICAgIGJ5dGVjIDM2IC8vICJyYXRlX3Jlc2V0X211bHRpcGxpZXIiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfZmxvb3IgPSBVSW50NjQoKQogICAgYnl0ZWMgMzAgLy8gInJhdGVfcmVzZXRfZmxvb3IiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfY2FwID0gVUludDY0KCkKICAgIGJ5dGVjIDMxIC8vICJyYXRlX3Jlc2V0X2NhcCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTcKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9uZXh0ID0gVUludDY0KCkKICAgIGJ5dGVjIDM3IC8vICJyYXRlX3Jlc2V0X25leHQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4CiAgICAvLyBzZWxmLmhhc19yYXRlX3Jlc2V0X2Zsb29yID0gRmFsc2UKICAgIGJ5dGVjIDM4IC8vICJoYXNfcmF0ZV9yZXNldF9mbG9vciIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTkKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwID0gRmFsc2UKICAgIGJ5dGVjIDM5IC8vICJoYXNfcmF0ZV9yZXNldF9jYXAiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMS0xMDIKICAgIC8vICMgUHJpbWFyeSBEaXN0cmlidXRpb24KICAgIC8vIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsID0gVUludDY0KCkKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMwogICAgLy8gc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNS0xMDYKICAgIC8vICMgQ3VtdWxhdGl2ZSBQZXItVW5pdCBGaXhlZC1Qb2ludCBJbmRleGVzCiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggPSBVSW50NjQoKQogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNwogICAgLy8gc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNQogICAgLy8gc2VsZi5ldmVudF9jdXJzb3IgPSBVSW50NjQoKQogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTYKICAgIC8vIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgPSBVSW50NjQoKQogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExOC0xMTkKICAgIC8vICMgU2NhbGluZwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjIzCiAgICAvLyBhc3NlcnQgVHhuLmdsb2JhbF9udW1fYnl0ZV9zbGljZSA9PSBjZmcuR0xPQkFMX0JZVEVTLCBlcnIuV1JPTkdfR0xPQkFMX0JZVEVTCiAgICB0eG4gR2xvYmFsTnVtQnl0ZVNsaWNlCiAgICBwdXNoaW50IDQKICAgID09CiAgICBhc3NlcnQgLy8gV3JvbmcgR2xvYmFsIEJ5dGVzIGFsbG9jYXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kX2FzYS9jb250cmFjdC5weToyNAogICAgLy8gYXNzZXJ0IFR4bi5nbG9iYWxfbnVtX3VpbnQgPT0gY2ZnLkdMT0JBTF9VSU5UUywgZXJyLldST05HX0dMT0JBTF9VSU5UUwogICAgdHhuIEdsb2JhbE51bVVpbnQKICAgIHB1c2hpbnQgMzcKICAgID09CiAgICBhc3NlcnQgLy8gV3JvbmcgR2xvYmFsIFVJbnRzIGFsbG9jYXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kX2FzYS9jb250cmFjdC5weToyNQogICAgLy8gYXNzZXJ0IFR4bi5sb2NhbF9udW1fYnl0ZV9zbGljZSA9PSBjZmcuTE9DQUxfQllURVMsIGVyci5XUk9OR19MT0NBTF9CWVRFUwogICAgdHhuIExvY2FsTnVtQnl0ZVNsaWNlCiAgICAhCiAgICBhc3NlcnQgLy8gV3JvbmcgTG9jYWwgQnl0ZXMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBhc3NlcnQgVHhuLmxvY2FsX251bV91aW50ID09IGNmZy5MT0NBTF9VSU5UUywgZXJyLldST05HX0xPQ0FMX1VJTlRTCiAgICB0eG4gTG9jYWxOdW1VaW50CiAgICAhCiAgICBhc3NlcnQgLy8gV3JvbmcgTG9jYWwgVUludHMgYWxsb2NhdGlvbgoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6OC0xOAogICAgLy8gY2xhc3MgREFTQSgKICAgIC8vICAgICBQYXltZW50QWdlbnQsCiAgICAvLyAgICAgVHJhbnNmZXJBZ2VudCwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBhdm1fdmVyc2lvbj0xMiwKICAgIC8vICk6CiAgICBwdXNoYnl0ZXMgMHg5MTRmMDRlYiAvLyBtZXRob2QgImNvbnRyYWN0X3VwZGF0ZSgpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fY29udHJhY3RfdXBkYXRlX3JvdXRlQDQKCm1haW5fc3dpdGNoX2Nhc2VfbmV4dEA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjgtMTgKICAgIC8vIGNsYXNzIERBU0EoCiAgICAvLyAgICAgUGF5bWVudEFnZW50LAogICAgLy8gICAgIFRyYW5zZmVyQWdlbnQsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyAgICAgYXZtX3ZlcnNpb249MTIsCiAgICAvLyApOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYnogbWFpbl9jcmVhdGVfTm9PcEAzMgogICAgcHVzaGJ5dGVzcyAweGI0NDYxOGM4IDB4ZTc4MzI1MjkgMHg5NDM4ODcyMyAweDZjODVlM2VlIDB4YmRkMWE5NDQgMHg3YzBmMTgxMiAweDE0ZmMxMGVmIDB4NzRhNzI5N2YgMHgwOWQ0ZmUxNCAweDlhOWJmYTg1IDB4ODVlZWQzM2QgMHhhYjJjMGZjNCAweGQ5ZjIyNWFjIDB4OTg4MzUwNWEgMHg4ZWE2ZTc0YyAweDAyYWY1NTdhIDB4ODJmNzFiMmQgMHhlZjA0ZjVkMyAweGRmMzQzNTUwIDB4M2RiZTgwYmQgMHgxZTNlNDhlNyAweDAxMGM4Mjk5IDB4NzQwNmFjZDIgMHgxYTcyYTJlZSAvLyBtZXRob2QgImZ1bmRfZHVlX2Nhc2hmbG93cyh1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJjbGFpbV9kdWVfY2FzaGZsb3dzKGFkZHJlc3MsYnl0ZVtdKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYnl0ZVtdKSIsIG1ldGhvZCAidHJhbnNmZXJfc2V0X3NjaGVkdWxlKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbihhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInRyYW5zZmVyKGFkZHJlc3MsYWRkcmVzcyx1aW50NjQpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X3N1c3BlbnNpb24oYWRkcmVzcyxib29sKXVpbnQ2NCIsIG1ldGhvZCAiYWNjb3VudF9vcGVuKGFkZHJlc3MsYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgImFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzcyhhZGRyZXNzLGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X2dldF9wb3NpdGlvbihhZGRyZXNzKShhZGRyZXNzLHVpbnQ2NCx1aW50NjQsYm9vbCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAiY29udHJhY3RfY29uZmlnKCh1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxib29sLGJvb2wsYm9vbCx1aW50NjQpLCh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCksKGJ5dGVbMzJdLHN0cmluZykpdWludDY0IiwgbWV0aG9kICJjb250cmFjdF9zY2hlZHVsZSh1aW50NjQsYm9vbCwodWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NClbXSl1aW50NjQiLCBtZXRob2QgImNvbnRyYWN0X2V4ZWN1dGVfaWVkKCl1aW50NjQiLCBtZXRob2QgImFwcGx5X25vbl9jYXNoX2V2ZW50KHVpbnQ2NCwodWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIsIG1ldGhvZCAiYXBwZW5kX29ic2VydmVkX2Nhc2hfZXZlbnQoKHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIsIG1ldGhvZCAiY29udHJhY3RfZ2V0X3N0YXRlKCkodWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudCgpKHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJyYmFjX3JvdGF0ZV9hcnJhbmdlcihhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19zZXRfb3BfZGFlbW9uKGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX2Fzc2lnbl9yb2xlKHVpbnQ4LGFkZHJlc3MsKHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19yZXZva2Vfcm9sZSh1aW50OCxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19jb250cmFjdF9zdXNwZW5zaW9uKGJvb2wpdWludDY0IiwgbWV0aG9kICJyYmFjX2dldF9hcnJhbmdlcigpYWRkcmVzcyIsIG1ldGhvZCAicmJhY19nZXRfYWRkcmVzc19yb2xlcyhhZGRyZXNzKShib29sLGJvb2wsYm9vbCxib29sLGJvb2wpIiwgbWV0aG9kICJyYmFjX2dldF9yb2xlX3ZhbGlkaXR5KHVpbnQ4LGFkZHJlc3MpKHVpbnQ2NCx1aW50NjQpIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggZnVuZF9kdWVfY2FzaGZsb3dzIGNsYWltX2R1ZV9jYXNoZmxvd3MgdHJhbnNmZXJfc2V0X3NjaGVkdWxlIHByaW1hcnlfZGlzdHJpYnV0aW9uIHRyYW5zZmVyIGFjY291bnRfc3VzcGVuc2lvbiBhY2NvdW50X29wZW4gYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzIGFjY291bnRfZ2V0X3Bvc2l0aW9uIGNvbnRyYWN0X2NvbmZpZyBjb250cmFjdF9zY2hlZHVsZSBjb250cmFjdF9leGVjdXRlX2llZCBhcHBseV9ub25fY2FzaF9ldmVudCBhcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudCBjb250cmFjdF9nZXRfc3RhdGUgY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50IHJiYWNfcm90YXRlX2FycmFuZ2VyIHJiYWNfc2V0X29wX2RhZW1vbiByYmFjX2Fzc2lnbl9yb2xlIHJiYWNfcmV2b2tlX3JvbGUgcmJhY19jb250cmFjdF9zdXNwZW5zaW9uIHJiYWNfZ2V0X2FycmFuZ2VyIHJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXMgcmJhY19nZXRfcm9sZV92YWxpZGl0eQogICAgZXJyCgptYWluX2NyZWF0ZV9Ob09wQDMyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjgtMTgKICAgIC8vIGNsYXNzIERBU0EoCiAgICAvLyAgICAgUGF5bWVudEFnZW50LAogICAgLy8gICAgIFRyYW5zZmVyQWdlbnQsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyAgICAgYXZtX3ZlcnNpb249MTIsCiAgICAvLyApOgogICAgcHVzaGJ5dGVzIDB4OTU2ZDcxNTYgLy8gbWV0aG9kICJjb250cmFjdF9jcmVhdGUoYWRkcmVzcyl1aW50NjQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBjb250cmFjdF9jcmVhdGUKICAgIGVycgoKbWFpbl9jb250cmFjdF91cGRhdGVfcm91dGVANDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgNCAvLyBVcGRhdGVBcHBsaWNhdGlvbgogICAgPT0KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0CiAgICBiIGNvbnRyYWN0X3VwZGF0ZQoKCi8vIF9wdXlhX2xpYi51dGlsLmVuc3VyZV9idWRnZXQocmVxdWlyZWRfYnVkZ2V0OiB1aW50NjQsIGZlZV9zb3VyY2U6IHVpbnQ2NCkgLT4gdm9pZDoKZW5zdXJlX2J1ZGdldDoKICAgIHByb3RvIDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDEwCiAgICArCgplbnN1cmVfYnVkZ2V0X3doaWxlX3RvcEAxOgogICAgZnJhbWVfZGlnIDAKICAgIGdsb2JhbCBPcGNvZGVCdWRnZXQKICAgID4KICAgIGJ6IGVuc3VyZV9idWRnZXRfYWZ0ZXJfd2hpbGVANgogICAgaXR4bl9iZWdpbgogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGJ5dGVjIDQ3IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbQogICAgYnl0ZWMgNDcgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KICAgIGZyYW1lX2RpZyAtMQogICAgc3dpdGNoIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMEAzIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMUA0CgplbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX25leHRANToKICAgIGl0eG5fc3VibWl0CiAgICBiIGVuc3VyZV9idWRnZXRfd2hpbGVfdG9wQDEKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMUA0OgogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgaXR4bl9maWVsZCBGZWUKICAgIGIgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV9uZXh0QDUKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMEAzOgogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBiIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfbmV4dEA1CgplbnN1cmVfYnVkZ2V0X2FmdGVyX3doaWxlQDY6CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnBheW1lbnRfYWdlbnQuUGF5bWVudEFnZW50LmZ1bmRfZHVlX2Nhc2hmbG93c1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmZ1bmRfZHVlX2Nhc2hmbG93czoKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gMTMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjY4CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2OQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3MAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDcKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzIKICAgIC8vIGlmIHNlbGYuX2lzX2R5bmFtaWNfYW5udWl0eSgpOgogICAgY2FsbHN1YiBfaXNfZHluYW1pY19hbm51aXR5CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzYtNzcKICAgIC8vICsgbWF4X2V2ZW50X2NvdW50CiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfRlVORF9EVUVfQ0FTSEZMT1dTX1BFUl9FVkVOVF9CVURHRVQpCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3NwogICAgLy8gKiBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19QRVJfRVZFTlRfQlVER0VUKQogICAgcHVzaGludCAxMDAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3Ni03NwogICAgLy8gKyBtYXhfZXZlbnRfY291bnQKICAgIC8vICogVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfUEVSX0VWRU5UX0JVREdFVCkKICAgICoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3NQogICAgLy8gVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfQkFTRV9CVURHRVQpCiAgICBpbnRjIDQgLy8gMTUwMAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojc1LTc3CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19CQVNFX0JVREdFVCkKICAgIC8vICsgbWF4X2V2ZW50X2NvdW50CiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfRlVORF9EVUVfQ0FTSEZMT1dTX1BFUl9FVkVOVF9CVURHRVQpCiAgICArCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzMtNzkKICAgIC8vIGVuc3VyZV9idWRnZXQoCiAgICAvLyAgICAgcmVxdWlyZWRfYnVkZ2V0PSgKICAgIC8vICAgICAgICAgVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfQkFTRV9CVURHRVQpCiAgICAvLyAgICAgICAgICsgbWF4X2V2ZW50X2NvdW50CiAgICAvLyAgICAgICAgICogVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfUEVSX0VWRU5UX0JVREdFVCkKICAgIC8vICAgICApLAogICAgLy8gKQogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4MQogICAgLy8gcHJvY2Vzc2VkX2V2ZW50cyA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjgyCiAgICAvLyBmdW5kZWRfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDE0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODMKICAgIC8vIGZ1bmRlZF9wcmluY2lwYWwgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDEzCgpmdW5kX2R1ZV9jYXNoZmxvd3Nfd2hpbGVfdG9wQDQ6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODYKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgPCBtYXhfZXZlbnRfY291bnQKICAgIGRpZyA0CiAgICBkaWcgMQogICAgPAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojg2LTg3CiAgICAvLyBwcm9jZXNzZWRfZXZlbnRzIDwgbWF4X2V2ZW50X2NvdW50CiAgICAvLyBhbmQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAMTEKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4NwogICAgLy8gYW5kIHNlbGYuZXZlbnRfY3Vyc29yIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICA8CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODYtODcKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgPCBtYXhfZXZlbnRfY291bnQKICAgIC8vIGFuZCBzZWxmLmV2ZW50X2N1cnNvciA8IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQKICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl93aGlsZUAxMQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojg5CiAgICAvLyBlbnRyeSA9IHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLmV2ZW50X2N1cnNvcikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICBkdXAKICAgIGJ1cnkgMTcKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5MAogICAgLy8gaWYgZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcDoKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSAzCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDExCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6OTIKICAgIC8vIGlmIG5vdCBzZWxmLl9ldmVudF9pc19jYXNoKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkpOgogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBidXJ5IDE2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNTEKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgaW50Y18yIC8vIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM1MC0zNTQKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX01EKSwKICAgIC8vICkKICAgID09CiAgICBkdXAKICAgIGJ1cnkgNAogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX3RydWVANTIKICAgIGRpZyAxNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzUyCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzUwLTM1NAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfTUQpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDUyCiAgICBkaWcgMTQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM1MwogICAgLy8gVUludDY0KGVudW1zLkVWVF9NRCksCiAgICBwdXNoaW50IDE5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNTAtMzU0CiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9NRCksCiAgICAvLyApCiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VANTMKCmZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX3RydWVANTI6CiAgICBpbnRjXzEgLy8gMQoKZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfbWVyZ2VANTQ6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6OTIKICAgIC8vIGlmIG5vdCBzZWxmLl9ldmVudF9pc19jYXNoKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkpOgogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NDgKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF9pZCA9PSBzZWxmLmV2ZW50X2N1cnNvciwgZXJyLklOVkFMSURfRVZFTlRfQ1VSU09SCiAgICBkaWcgMTUKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgY3Vyc29yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NDkKICAgIC8vIGFzc2VydCBlbnRyeS5zY2hlZHVsZWRfdGltZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwgZXJyLk5PX0RVRV9DQVNIRkxPVwogICAgZGlnIDEKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIDw9CiAgICBhc3NlcnQgLy8gTm8gZHVlIGNhc2hmbG93IHRvIHBheQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDEzCiAgICAvLyBpZiBldmVudF90eXBlIG5vdCBpbiAoVUludDY0KGVudW1zLkVWVF9JUCksIFVJbnQ2NChlbnVtcy5FVlRfTUQpKToKICAgIGRpZyAyCiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTUKICAgIGRpZyAxNAogICAgcHVzaGludCAxOQogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDE0CiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAxMQoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X2ludGVyZXN0X2Ftb3VudEAxNjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQyNgogICAgLy8gZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGRpZyAxNQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSAxNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDI3CiAgICAvLyBpZiBldmVudF90eXBlIG5vdCBpbiAoVUludDY0KGVudW1zLkVWVF9QUiksIFVJbnQ2NChlbnVtcy5FVlRfTUQpKToKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxOQogICAgZGlnIDE0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MjgKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDYKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTUzCiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA9IGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBkaWcgMTUKICAgIHB1c2hpbnQgNDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBidXJ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1NgogICAgLy8gaWYgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCk6CiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUAyOQogICAgZGlnIDcKICAgIGJ1cnkgOQoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzItNTc0CiAgICAvLyAjIEZ1bmRpbmcgdXNlcyBwZXItdW5pdCBjdW11bGF0aXZlIGluZGljZXMgc28gZWFjaCBob2xkZXIgY2FuIHNldHRsZQogICAgLy8gIyBpbmRlcGVuZGVudGx5IGZyb20gaXRzIGN1cnJlbnQgdW5pdCBiYWxhbmNlLgogICAgLy8gaW50ZXJlc3RfaW5kZXhfZGVsdGEgPSBzZWxmLl9hbW91bnRfdG9faW5kZXhfZGVsdGEoaW50ZXJlc3RfYW1vdW50X2R1ZSkKICAgIGRpZyAxMAogICAgY2FsbHN1YiBfYW1vdW50X3RvX2luZGV4X2RlbHRhCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzUKICAgIC8vIHByaW5jaXBhbF9pbmRleF9kZWx0YSA9IHNlbGYuX2Ftb3VudF90b19pbmRleF9kZWx0YShwcmluY2lwYWxfYW1vdW50X2R1ZSkKICAgIGRpZyA2CiAgICBjYWxsc3ViIF9hbW91bnRfdG9faW5kZXhfZGVsdGEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU3NgogICAgLy8gaW50ZXJlc3RfYW1vdW50ID0gc2VsZi5faW5kZXhfZGVsdGFfdG9fYW1vdW50KGludGVyZXN0X2luZGV4X2RlbHRhKQogICAgZGlnIDEKICAgIGNhbGxzdWIgX2luZGV4X2RlbHRhX3RvX2Ftb3VudAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBidXJ5IDE1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzcKICAgIC8vIHByaW5jaXBhbF9hbW91bnQgPSBzZWxmLl9pbmRleF9kZWx0YV90b19hbW91bnQocHJpbmNpcGFsX2luZGV4X2RlbHRhKQogICAgZHVwCiAgICBjYWxsc3ViIF9pbmRleF9kZWx0YV90b19hbW91bnQKICAgIGR1cAogICAgYnVyeSAxMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTc4CiAgICAvLyByZXF1aXJlZF9hbW91bnQgPSBpbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50CiAgICBkaWcgMgogICAgZGlnIDEKICAgICsKICAgIGR1cAogICAgYnVyeSA5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MzQKICAgIC8vIGJhbGFuY2UgPSBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBvcHRlZCBpbnRvIGFzc2V0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NTYKICAgIC8vIHJldHVybiBzZWxmLnJlc2VydmVkX2ludGVyZXN0ICsgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICBkaWcgMQogICAgKwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzM2CiAgICAvLyBhc3NlcnQgYmFsYW5jZSA+PSByZXNlcnZlZF90b3RhbCwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGRpZyAyCiAgICBkaWcgMQogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzM3CiAgICAvLyByZXR1cm4gYmFsYW5jZSAtIHJlc2VydmVkX3RvdGFsCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIC0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4MAogICAgLy8gc2VsZi5fYXZhaWxhYmxlX3NldHRsZW1lbnRfZnVuZHMoKSA+PSByZXF1aXJlZF9hbW91bnQKICAgIHVuY292ZXIgMgogICAgPj0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU3OS01ODEKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5fYXZhaWxhYmxlX3NldHRsZW1lbnRfZnVuZHMoKSA+PSByZXF1aXJlZF9hbW91bnQKICAgIC8vICksIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcyBmb3IgdGhlIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4MwogICAgLy8gc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCArPSBpbnRlcmVzdF9hbW91bnQKICAgIHVuY292ZXIgMwogICAgKwogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4NAogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgKz0gcHJpbmNpcGFsX2Ftb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIGV4aXN0cwogICAgKwogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1ODUKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCArPSBpbnRlcmVzdF9pbmRleF9kZWx0YQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggZXhpc3RzCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4NgogICAgLy8gc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCArPSBwcmluY2lwYWxfaW5kZXhfZGVsdGEKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggZXhpc3RzCiAgICArCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTg3CiAgICAvLyBpZiBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpOgogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgcHVzaGludCAzCiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUA0MAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTg4LTU4OQogICAgLy8gIyBGb3IgUFIsIHRoZSBwZXJpb2QgaW50ZXJlc3Qgc3RheXMgYWNjcnVlZCB1bnRpbCBhIGxhdGVyIElQIG9yIE1ELgogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ICs9IHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZGlnIDE2CiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBidXJ5IDE4CiAgICArCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQxOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTkyCiAgICAvLyBpZiBub3Qgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCkgb3IgZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSA9PSBVSW50NjQoCiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDQzCiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTItNTk0CiAgICAvLyBpZiBub3Qgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCkgb3IgZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSA9PSBVSW50NjQoCiAgICAvLyAgICAgZW51bXMuRVZUX01ECiAgICAvLyApOgogICAgcHVzaGludCAxOQogICAgPT0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQ0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUA0MzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5NQogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gZW50cnkubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZGlnIDE1CiAgICBwdXNoaW50IDQxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTYKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGRpZyA4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTk3CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBuZXh0X2ludGVyZXN0X2Jhc2UKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBkaWcgOQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5OAogICAgLy8gc2VsZi5ldmVudF9jdXJzb3IgKz0gVUludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAwCiAgICAvLyBpZiBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoCiAgICBkaWcgMTUKICAgIGV4dHJhY3QgOCAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MDAtNjAyCiAgICAvLyBpZiBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoCiAgICAvLyAgICAgZW51bXMuRVZUX01ECiAgICAvLyApIGFuZCBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9PSBVSW50NjQoMCk6CiAgICBwdXNoYnl0ZXMgMHgxMwogICAgYj09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0NwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAyCiAgICAvLyApIGFuZCBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9PSBVSW50NjQoMCk6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwMC02MDIKICAgIC8vIGlmIGVudHJ5LmV2ZW50X3R5cGUgPT0gYXJjNC5VSW50OCgKICAgIC8vICAgICBlbnVtcy5FVlRfTUQKICAgIC8vICkgYW5kIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID09IFVJbnQ2NCgwKToKICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0NwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAzCiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbnVtcy5TVEFUVVNfRU5ERUQpCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBwdXNoaW50IDIwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwNAogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gVUludDY0KDApCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0NzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwNi02MTAKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1pbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50LAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PWludGVyZXN0X2Ftb3VudCArIHByaW5jaXBhbF9hbW91bnQsCiAgICAvLyApCiAgICBkaWcgMTUKICAgIGRpZyA0CiAgICBkdXAKICAgIGNhbGxzdWIgX2VtaXRfZXhlY3V0aW9uX2V2ZW50CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5NgogICAgLy8gZnVuZGVkX2ludGVyZXN0ICs9IGludGVyZXN0X2Ftb3VudAogICAgZGlnIDEzCiAgICBkaWcgMTIKICAgICsKICAgIGJ1cnkgMTQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5NwogICAgLy8gZnVuZGVkX3ByaW5jaXBhbCArPSBwcmluY2lwYWxfYW1vdW50CiAgICBkaWcgMTIKICAgIGRpZyA3CiAgICArCiAgICBidXJ5IDEzCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6OTgKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgKz0gVUludDY0KDEpCiAgICBkaWcgNAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgNQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3Nfd2hpbGVfdG9wQDQKCmZ1bmRfZHVlX2Nhc2hmbG93c19lbHNlX2JvZHlANDA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTEKICAgIC8vIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0MQoKZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlAMjk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTcKICAgIC8vIGV2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ1cnkgMTYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1OC01NjAKICAgIC8vICMgRHluYW1pYyBhbm51aXRpZXMgZGVyaXZlIG5leHQgc3RhdGUgZnJvbSB0aGUgcGF5bWVudCBkZWNvbXBvc2l0aW9uLAogICAgLy8gIyBub3Qgb25seSBmcm9tIHRoZSBwcmVjb21wdXRlZCBgbmV4dF8qYCBmaWVsZHMuCiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpOgogICAgcHVzaGludCAzCiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUAzMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTYyCiAgICAvLyBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCAtIHByaW5jaXBhbF9hbW91bnRfZHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGRpZyA2CiAgICAtCiAgICBkdXAKICAgIGJ1cnkgOQogICAgYnVyeSA5CiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDMxOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY1CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9JUCk6CiAgICBkaWcgMTQKICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUAzMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY2CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGJ1cnkgOQogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY3CiAgICAvLyBuZXh0X2ludGVyZXN0X2Jhc2UgPSBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGJ1cnkgMTAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgZXhpc3RzCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDMzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY4CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCk6CiAgICBkaWcgMTQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlAMzQKICAgIGRpZyA3CiAgICBidXJ5IDkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzgKCmZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDM0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY5CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTcwCiAgICAvLyBuZXh0X2ludGVyZXN0X2Jhc2UgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzgKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDI5CiAgICAvLyBpZiBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKToKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzMAogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKToKICAgIGRpZyAxNAogICAgcHVzaGludCAxOQogICAgPT0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDIyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzEKICAgIC8vIHJldHVybiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzIKICAgIC8vIGludGVyZXN0X2R1ZSA9IHNlbGYuYWNjcnVlZF9pbnRlcmVzdCArIHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZGlnIDE2CiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBidXJ5IDE4CiAgICArCiAgICBkdXAKICAgIGJ1cnkgMTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzMwogICAgLy8gaWYgc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIDw9IGludGVyZXN0X2R1ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIGV4aXN0cwogICAgPj0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDI0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzQKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzUKICAgIC8vIHByaW5jaXBhbF9hbW91bnQgPSBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gLSBpbnRlcmVzdF9kdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIGV4aXN0cwogICAgZGlnIDEwCiAgICAtCiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDM2CiAgICAvLyBpZiBwcmluY2lwYWxfYW1vdW50ID4gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWw6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgID4KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDI2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzcKICAgIC8vIHJldHVybiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjY6CiAgICBkaWcgNgogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTIKICAgIC8vIHByaW5jaXBhbF9hbW91bnRfZHVlID0gc2VsZi5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudChlbnRyeSkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnRAMjgKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDI3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDQwCiAgICAvLyBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA8PSBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZGlnIDE1CiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBkdXAyCiAgICA8PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDM5LTQ0MQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA8PSBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NDIKICAgIC8vIHJldHVybiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCAtIGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBzd2FwCiAgICAtCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MTUKICAgIC8vIHJldHVybiBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgKyBzZWxmLl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KGVudHJ5KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgIGRpZyAxNgogICAgY2FsbHN1YiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudAogICAgYnVyeSAxOAogICAgKwogICAgYnVyeSAxMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTUxCiAgICAvLyBpbnRlcmVzdF9hbW91bnRfZHVlID0gc2VsZi5fZW50cnlfaW50ZXJlc3RfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfaW50ZXJlc3RfYW1vdW50QDE2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAMTE6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTAwCiAgICAvLyBhc3NlcnQgcHJvY2Vzc2VkX2V2ZW50cyA+IFVJbnQ2NCgwKSwgZXJyLk5PX0RVRV9DQVNIRkxPVwogICAgZGlnIDQKICAgIGR1cAogICAgYXNzZXJ0IC8vIE5vIGR1ZSBjYXNoZmxvdyB0byBwYXkKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMDQKICAgIC8vIHRvdGFsX2Z1bmRlZD1mdW5kZWRfaW50ZXJlc3QgKyBmdW5kZWRfcHJpbmNpcGFsLAogICAgZGlnIDE0CiAgICBkdXAKICAgIGRpZyAxNQogICAgZHVwCiAgICBjb3ZlciAzCiAgICArCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA2CiAgICAvLyB0aW1lc3RhbXA9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTAxLTEwNwogICAgLy8gcmV0dXJuIHR5cC5DYXNoRnVuZGluZ1Jlc3VsdCgKICAgIC8vICAgICBmdW5kZWRfaW50ZXJlc3Q9ZnVuZGVkX2ludGVyZXN0LAogICAgLy8gICAgIGZ1bmRlZF9wcmluY2lwYWw9ZnVuZGVkX3ByaW5jaXBhbCwKICAgIC8vICAgICB0b3RhbF9mdW5kZWQ9ZnVuZGVkX2ludGVyZXN0ICsgZnVuZGVkX3ByaW5jaXBhbCwKICAgIC8vICAgICBwcm9jZXNzZWRfZXZlbnRzPXByb2Nlc3NlZF9ldmVudHMsCiAgICAvLyAgICAgdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUA1MzoKICAgIGludGNfMCAvLyAwCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDU0CgoKLy8gbW9kdWxlcy5wYXltZW50X2FnZW50LlBheW1lbnRBZ2VudC5jbGFpbV9kdWVfY2FzaGZsb3dzW3JvdXRpbmddKCkgLT4gdm9pZDoKY2xhaW1fZHVlX2Nhc2hmbG93czoKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cG4gMgogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNQogICAgLy8gaWYgc2VsZi5vcF9kYWVtb24udmFsdWUgIT0gR2xvYmFsLnplcm9fYWRkcmVzczoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNiAvLyAweDUyM2E0ZjUwNDQyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wX2RhZW1vbiBleGlzdHMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE3CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjYgLy8gMHg1MjNhNGY1MDQ0MjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcF9kYWVtb24gZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE3LTE5CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIGJueiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfdHJ1ZUAxNAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE4CiAgICAvLyBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgdHhuIFNlbmRlcgogICAgZGlnIDMKICAgID09CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTctMTkKICAgIC8vIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICAvLyBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgYm56IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDE0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTkKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCAzMgogICAgPT0KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNy0xOQogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICBieiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VAMTUKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDE0OgogICAgaW50Y18xIC8vIDEKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUAxNjoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNi0yMAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyAgICAgb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vICAgICBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgLy8gKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCgpjbGFpbV9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTc6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTM5CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE0MAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDcKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTQzCiAgICAvLyBzZWxmLl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKGhvbGRpbmdfYWRkcmVzcykKICAgIGRpZyAyCiAgICBkdXAKICAgIGNhbGxzdWIgX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNDQKICAgIC8vIHNlbGYuX3NldHRsZV9wb3NpdGlvbihob2xkaW5nX2FkZHJlc3MpCiAgICBjYWxsc3ViIF9zZXR0bGVfcG9zaXRpb24KICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExNwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY2xhaW1hYmxlX2ludGVyZXN0CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBkdXAKICAgIHB1c2hpbnQgNzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExOAogICAgLy8gKyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jbGFpbWFibGVfcHJpbmNpcGFsCiAgICBkdXAKICAgIHB1c2hpbnQgODEKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExNy0xMTgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNsYWltYWJsZV9pbnRlcmVzdAogICAgLy8gKyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jbGFpbWFibGVfcHJpbmNpcGFsCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTQ2CiAgICAvLyBhc3NlcnQgdG90YWxfYW1vdW50ID4gVUludDY0KDApLCBlcnIuTk9fRFVFX0NBU0hGTE9XCiAgICBhc3NlcnQgLy8gTm8gZHVlIGNhc2hmbG93IHRvIHBheQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI1CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MuaXNfb3B0ZWRfaW4oCiAgICBleHRyYWN0IDAgMzIKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNgogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNS0yNwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLmlzX29wdGVkX2luKAogICAgLy8gICAgIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZAogICAgLy8gKQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNS0yOAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLmlzX29wdGVkX2luKAogICAgLy8gICAgIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZAogICAgLy8gKQogICAgLy8gYW5kIG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQKICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAyNAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI4CiAgICAvLyBhbmQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCAzODQKICAgIGdldGJpdAogICAgYm56IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAyNAogICAgaW50Y18xIC8vIDEKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUAyNToKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNTEKICAgIC8vIGlmIHNlbGYuX2lzX3BheW1lbnRfZXhlY3V0YWJsZShob2xkaW5nX2FkZHJlc3MpOgogICAgYnogY2xhaW1fZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozNAogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIHN3YXAKICAgIGRpZyAxCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozNC0zNQogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIC8vID49IHBheW1lbnRfYW1vdW50CiAgICBkaWcgNQogICAgZHVwCiAgICBjb3ZlciAyCiAgICA+PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjMzLTM2CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICAvLyAgICAgPj0gcGF5bWVudF9hbW91bnQKICAgIC8vICksIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcyBmb3IgdGhlIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNTMKICAgIC8vIHNlbGYuX3BheShzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MsIHRvdGFsX2Ftb3VudCkKICAgIGRpZyAyCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBkdXAKICAgIGV4dHJhY3QgMCAzMgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQwLTQ1CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9cmVjZWl2ZXIsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWFtb3VudCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQ0CiAgICAvLyBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgdW5jb3ZlciAzCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIHVuY292ZXIgMgogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0MAogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgcHVzaGludCA0IC8vIGF4ZmVyCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQwLTQ1CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9cmVjZWl2ZXIsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWFtb3VudCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMjUtMTI2CiAgICAvLyAjIEdldCB0aGUgY2xhaW1hYmxlIGFtb3VudHMgYmVmb3JlIHJlc2V0CiAgICAvLyBpbnRlcmVzdF9hbW91bnQgPSBwb3NpdGlvbi5jbGFpbWFibGVfaW50ZXJlc3QKICAgIGR1cAogICAgcHVzaGludCA3MwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSA5CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTI3CiAgICAvLyBwcmluY2lwYWxfYW1vdW50ID0gcG9zaXRpb24uY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgZHVwCiAgICBwdXNoaW50IDgxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAzCiAgICBidXJ5IDkKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMjktMTMwCiAgICAvLyAjIFJlc2V0IHRoZSBwb3NpdGlvbidzIGNsYWltYWJsZSBhbW91bnRzCiAgICAvLyBwb3NpdGlvbi5jbGFpbWFibGVfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBpdG9iCiAgICBzd2FwCiAgICBkaWcgMQogICAgcmVwbGFjZTIgNzMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzEKICAgIC8vIHBvc2l0aW9uLmNsYWltYWJsZV9wcmluY2lwYWwgPSBVSW50NjQoMCkKICAgIHN3YXAKICAgIHJlcGxhY2UyIDgxCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTMyCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHBvc2l0aW9uLmNvcHkoKQogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTM0CiAgICAvLyBhc3NlcnQgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCA+PSBpbnRlcmVzdF9hbW91bnQsIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX2ludGVyZXN0IGV4aXN0cwogICAgZHVwCiAgICBkaWcgMgogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzNQogICAgLy8gYXNzZXJ0IHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsID49IHByaW5jaXBhbF9hbW91bnQsIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICBkaWcgMwogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzNy0xMzgKICAgIC8vICMgVXBkYXRlIHRoZSBnbG9iYWwgcmVzZXJ2ZWQgaW50ZXJlc3QgYW5kIHByaW5jaXBhbCBhbW91bnRzCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0IC09IGludGVyZXN0X2Ftb3VudAogICAgc3dhcAogICAgLQogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzkKICAgIC8vIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIC09IHByaW5jaXBhbF9hbW91bnQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIHN3YXAKICAgIC0KICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKY2xhaW1fZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTU5CiAgICAvLyB0b3RhbF9hbW91bnQ9aW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudCwKICAgIGRpZyA1CiAgICBkdXAKICAgIGRpZyA2CiAgICBkdXAKICAgIGNvdmVyIDMKICAgICsKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNjAKICAgIC8vIHRpbWVzdGFtcD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNTYtMTYyCiAgICAvLyByZXR1cm4gdHlwLkNhc2hDbGFpbVJlc3VsdCgKICAgIC8vICAgICBpbnRlcmVzdF9hbW91bnQ9aW50ZXJlc3RfYW1vdW50LAogICAgLy8gICAgIHByaW5jaXBhbF9hbW91bnQ9cHJpbmNpcGFsX2Ftb3VudCwKICAgIC8vICAgICB0b3RhbF9hbW91bnQ9aW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudCwKICAgIC8vICAgICB0aW1lc3RhbXA9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgY29udGV4dD1wYXltZW50X2luZm8sCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgMgogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIHB1c2hieXRlcyAweDAwMjIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAyNDoKICAgIGludGNfMCAvLyAwCiAgICBiIGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUAyNQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX2ZhbHNlQDE1OgogICAgaW50Y18wIC8vIDAKICAgIGIgY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDE2CgoKLy8gbW9kdWxlcy50cmFuc2Zlcl9hZ2VudC5UcmFuc2ZlckFnZW50LnRyYW5zZmVyX3NldF9zY2hlZHVsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRyYW5zZmVyX3NldF9zY2hlZHVsZToKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo0MAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQxCiAgICAvLyBhc3NlcnQgb3Blbl9kYXRlIDwgY2xvc3VyZV9kYXRlLCBlcnIuSU5WQUxJRF9TT1JUSU5HCiAgICBkdXAyCiAgICA8CiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbXVzdCBiZSBzb3J0ZWQgaW4gc3RyaWN0bHkgYXNjZW5kaW5nIG9yZGVyCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQzCiAgICAvLyBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA9IG9wZW5fZGF0ZQogICAgYnl0ZWMgMjggLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIHVuY292ZXIgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDQKICAgIC8vIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlID0gY2xvc3VyZV9kYXRlCiAgICBieXRlYyAyOSAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDUKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy50cmFuc2Zlcl9hZ2VudC5UcmFuc2ZlckFnZW50LnByaW1hcnlfZGlzdHJpYnV0aW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcHJpbWFyeV9kaXN0cmlidXRpb246CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjcxCiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5wcmltYXJ5X2RlYWxlciwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDIyIC8vIDB4NTIzYTUwNTk0NDIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojc2CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo3NwogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojc4CiAgICAvLyBhc3NlcnQgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TRUQKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBjbG9zZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgY292ZXIgMwogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4MAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChob2xkaW5nX2FkZHJlc3MpCiAgICBzd2FwCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjgxCiAgICAvLyBhc3NlcnQgdW5pdHMgPiBVSW50NjQoMCksIGVyci5aRVJPX1VOSVRTCiAgICBkdXAKICAgIGFzc2VydCAvLyBDYW4gbm90IGRpc3RyaWJ1dGUgemVybyB1bml0cwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4MwogICAgLy8gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCArIHVuaXRzIDw9IHNlbGYudG90YWxfdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICArCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgPD0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODItODQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCArIHVuaXRzIDw9IHNlbGYudG90YWxfdW5pdHMKICAgIC8vICksIGVyci5PVkVSX0RJU1RSSUJVVElPTgogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCByZW1haW5pbmcgRC1BU0EgdW5pdHMKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODUKICAgIC8vIGlmIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI3IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlIGV4aXN0cwogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojg3CiAgICAvLyBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8PSBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI3IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlIGV4aXN0cwogICAgPD0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODYtODgKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPD0gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGUKICAgIC8vICksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TRUQKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBjbG9zZWQKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNDgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnJlc2VydmVkX3VuaXRzICs9IHVuaXRzCiAgICBkdXBuIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDMKICAgIGR1cAogICAgY292ZXIgMwogICAgKwogICAgaXRvYgogICAgcHVzaGludCA0MAogICAgc3dhcAogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6OTEKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgKz0gdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICArCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6OTIKICAgIC8vIHJldHVybiBzZWxmLnRvdGFsX3VuaXRzIC0gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIHN3YXAKICAgIC0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMudHJhbnNmZXJfYWdlbnQuVHJhbnNmZXJBZ2VudC50cmFuc2Zlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnRyYW5zZmVyOgogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTMwCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxMzEKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQ3CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuX3N0YXR1c19pc19wZW5kaW5nX2llZCgpLCBlcnIuUEVORElOR19JRUQKICAgICEKICAgIGFzc2VydCAvLyBJRUQgbm90IHlldCBleGVjdXRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxMwogICAgLy8gaWYgc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjggLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICBieiB0cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTUKICAgIC8vIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjggLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNC0xNgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gKSwgZXJyLkNMT1NFRF9UUkFOU0ZFUgogICAgYXNzZXJ0IC8vIFRyYW5zZmVyIGlzIGNsb3NlZAoKdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNwogICAgLy8gaWYgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjkgLy8gInRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICBieiB0cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTkKICAgIC8vIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDwgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGUKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyOSAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIDwKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTgtMjAKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZQogICAgLy8gKSwgZXJyLkNMT1NFRF9UUkFOU0ZFUgogICAgYXNzZXJ0IC8vIFRyYW5zZmVyIGlzIGNsb3NlZAoKdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxMzUKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIGRpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA4CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIGJ5dGVjIDggLy8gMHg0MTIzCiAgICBkaWcgNQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA5CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjEzOAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChzZW5kZXJfaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDIKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTM5CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGR1cAogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNDAKICAgIC8vIGFzc2VydCBzZW5kZXJfaG9sZGluZ19hZGRyZXNzICE9IHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcywgZXJyLlNFTEZfVFJBTlNGRVIKICAgIHVuY292ZXIgMgogICAgIT0KICAgIGFzc2VydCAvLyBTZW5kZXIgYW5kIHJlY2VpdmVyIG11c3QgYmUgZGlmZmVyZW50CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE0MQogICAgLy8gYXNzZXJ0IHVuaXRzID4gVUludDY0KDApLCBlcnIuTlVMTF9UUkFOU0ZFUgogICAgZGlnIDEKICAgIGR1cAogICAgYXNzZXJ0IC8vIFRyYW5zZmVyIHVuaXRzIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTQyCiAgICAvLyBhc3NlcnQgdW5pdHMgPD0gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLCBlcnIuT1ZFUl9UUkFOU0ZFUgogICAgc3dhcAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIDw9CiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IHNlbmRlciB1bml0cyB0byB0cmFuc2ZlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzYzCiAgICAvLyBpZiBzZWxmLmV2ZW50X2N1cnNvciA+PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICA+PQogICAgYm56IHRyYW5zZmVyX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Fzc2VydF9ub19kdWVfZXZlbnRfcGVuZGluZ0AxMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzY1CiAgICAvLyBuZXh0X2VudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KHNlbGYuZXZlbnRfY3Vyc29yKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc2NwogICAgLy8gbmV4dF9lbnRyeS5zY2hlZHVsZWRfdGltZSA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NjYtNzY4CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIG5leHRfZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gKSwgZXJyLlBFTkRJTkdfQUNUVVNfRVZFTlQKICAgIGFzc2VydCAvLyBBQ1RVUyBldmVudCBub3QgeWV0IGV4ZWN1dGVkCgp0cmFuc2Zlcl9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9hc3NlcnRfbm9fZHVlX2V2ZW50X3BlbmRpbmdAMTA6CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE0NQogICAgLy8gc2VsZi5fZW5zdXJlX3VuaXRzX2FjdGl2YXRlZChzZW5kZXJfaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDMKICAgIGR1cAogICAgY2FsbHN1YiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNDYKICAgIC8vIHNlbGYuX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQocmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgY2FsbHN1YiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNDcKICAgIC8vIHNlbGYuX3NldHRsZV9wb3NpdGlvbihzZW5kZXJfaG9sZGluZ19hZGRyZXNzKQogICAgY2FsbHN1YiBfc2V0dGxlX3Bvc2l0aW9uCiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTQ4CiAgICAvLyBzZWxmLl9zZXR0bGVfcG9zaXRpb24ocmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzKQogICAgY2FsbHN1YiBfc2V0dGxlX3Bvc2l0aW9uCiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNTIKICAgIC8vIGFzc2VydCB1bml0cyA8PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cywgZXJyLk9WRVJfVFJBTlNGRVIKICAgIGRpZyA1CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkaWcgMQogICAgPD0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgc2VuZGVyIHVuaXRzIHRvIHRyYW5zZmVyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTUzCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyAtPSB1bml0cwogICAgZGlnIDEKICAgIC0KICAgIGl0b2IKICAgIHVuY292ZXIgMgogICAgaW50Y18zIC8vIDMyCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTQ0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyArPSB1bml0cwogICAgZGlnIDUKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIHVuY292ZXIgMgogICAgKwogICAgaXRvYgogICAgaW50Y18zIC8vIDMyCiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfc3VzcGVuc2lvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfc3VzcGVuc2lvbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojc3CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyMSAvLyAweDUyM2E0MTU1NTQyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE4NQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkID0gc3VzcGVuZGVkCiAgICBkdXAKICAgIHB1c2hpbnQgNDgKICAgIGludGNfMSAvLyAxCiAgICBib3hfZXh0cmFjdAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMwogICAgc2V0Yml0CiAgICBwdXNoaW50IDQ4CiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE4NgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTY1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5hY2NvdW50X29wZW5bcm91dGluZ10oKSAtPiB2b2lkOgphY2NvdW50X29wZW46CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjgKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmFjY291bnRfbWFuYWdlciwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDIzIC8vIDB4NTIzYTRkNGU0NzIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzkKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0VOREVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDIwMAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTAKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX2VuZGVkKCksIGVyci5VTkFVVEhPUklaRUQKICAgICEKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxMQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTIKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjEzCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozNAogICAgLy8gdW5pdHM9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozMi00MgogICAgLy8gcmV0dXJuIHR5cC5BY2NvdW50UG9zaXRpb24oCiAgICAvLyAgICAgcGF5bWVudF9hZGRyZXNzPXBheW1lbnRfYWRkcmVzcywKICAgIC8vICAgICB1bml0cz1VSW50NjQoMCksCiAgICAvLyAgICAgcmVzZXJ2ZWRfdW5pdHM9VUludDY0KDApLAogICAgLy8gICAgIHN1c3BlbmRlZD1GYWxzZSwKICAgIC8vICAgICBzZXR0bGVkX2N1cnNvcj1VSW50NjQoMCksCiAgICAvLyAgICAgaW50ZXJlc3RfY2hlY2twb2ludD1VSW50NjQoMCksCiAgICAvLyAgICAgcHJpbmNpcGFsX2NoZWNrcG9pbnQ9VUludDY0KDApLAogICAgLy8gICAgIGNsYWltYWJsZV9pbnRlcmVzdD1VSW50NjQoMCksCiAgICAvLyAgICAgY2xhaW1hYmxlX3ByaW5jaXBhbD1VSW50NjQoMCksCiAgICAvLyApCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGJ5dGVjIDQwIC8vIDB4MDAKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjE0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHNlbGYuX25ld19hY2NvdW50X3Bvc2l0aW9uKHBheW1lbnRfYWRkcmVzcykKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTUKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjM4CiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIHVuY292ZXIgMwogICAgPT0KICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIzOQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDAKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQxCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MgPSBwYXltZW50X2FkZHJlc3MKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQyCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfZ2V0X3Bvc2l0aW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF9nZXRfcG9zaXRpb246CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNTkKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9jcmVhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9jcmVhdGU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDE5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAzMwogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IGFycmFuZ2VyCiAgICBieXRlYyAxOCAvLyAweDUyM2E0MTUyNTIyMwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMzQKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAxOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfY29uZmlnW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfY29uZmlnOgogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBsZW4KICAgIHB1c2hpbnQgMTA3CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLk5vcm1hbGl6ZWRBY3R1c1Rlcm1zCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgcHVzaGludCA3MgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5Jbml0aWFsS2VybmVsU3RhdGUKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBsZW4KICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIHR1cGxlIGVuY29kaW5nCiAgICBkdXAKICAgIHB1c2hpbnQgMzQKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCB0YWlsIHBvaW50ZXIgYXQgaW5kZXggMSBvZiAodWludDhbMzJdLChsZW4rdXRmOFtdKSkKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgY292ZXIgMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMzYKICAgICsKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuUHJvc3BlY3R1cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2NgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDY4LTEwNjkKICAgIC8vICMgQ29uZmlndXJlIENvbnRyYWN0CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPSB0ZXJtcy5jb250cmFjdF90eXBlLmFzX3VpbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgYnogY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUA3CiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIyMAogICAgLy8gVUludDY0KGVudW1zLkNUX0FOTiksCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIxCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfTkFNKSwKICAgIHB1c2hpbnQgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIyCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfTEFNKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIzCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfTEFYKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjI0CiAgICAvLyBVSW50NjQoZW51bXMuQ1RfQ0xNKSwKICAgIHB1c2hpbnQgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJ6IGNvbnRyYWN0X2NvbmZpZ19ib29sX2ZhbHNlQDgKCmNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANzoKICAgIGludGNfMSAvLyAxCgpjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUA5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjI5CiAgICAvLyBhc3NlcnQgc2VsZi5faXNfc3VwcG9ydGVkX2NvbnRyYWN0X3R5cGUoY29udHJhY3RfdHlwZSksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3MQogICAgLy8gc2VsZi5fc3RvcmVfY29udHJhY3RfY29uZmlnKHNlbGYuY29udHJhY3RfdHlwZSwgdGVybXMsIGluaXRpYWxfc3RhdGUpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgYnVyeSAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzI1CiAgICAvLyBhc3NlcnQgdGVybXMuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZGlnIDQKICAgIGR1cAogICAgcHVzaGludCAzMwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSA4CiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMjcKICAgIC8vIHRlcm1zLmRheV9jb3VudF9jb252ZW50aW9uLmFzX3VpbnQ2NCgpCiAgICBwdXNoaW50IDU3CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICBieiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDE2CiAgICBkaWcgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk5CiAgICAvLyBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI5Ny0zMDMKICAgIC8vIHJldHVybiBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzYwKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwSVNEQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjApLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDE2CiAgICBkaWcgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzAwCiAgICAvLyBVSW50NjQoZW51bXMuRENDX0EzNjUpLAogICAgcHVzaGludCAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyOTctMzAzCiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgID09CiAgICBibnogY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUAxNgogICAgZGlnIDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMwMQogICAgLy8gVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGRpZyA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDIKICAgIC8vIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICA9PQogICAgYnogY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAMTcKCmNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTY6CiAgICBpbnRjXzEgLy8gMQoKY29udHJhY3RfY29uZmlnX2Jvb2xfbWVyZ2VAMTg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDktMzExCiAgICAvLyBhc3NlcnQgc2VsZi5faXNfc3VwcG9ydGVkX2RheV9jb3VudF9jb252ZW50aW9uKAogICAgLy8gICAgIGRheV9jb3VudF9jb252ZW50aW9uCiAgICAvLyApLCBlcnIuSU5WQUxJRF9EQVlfQ09VTlRfQ09OVkVOVElPTgogICAgYXNzZXJ0IC8vIEludmFsaWQgZGF5LWNvdW50IGNvbnZlbnRpb24gSUQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMyOQogICAgLy8gaWYgY29udHJhY3RfdHlwZSAhPSBVSW50NjQoZW51bXMuQ1RfQU5OKToKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgICE9CiAgICBieiBjb250cmFjdF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzMwCiAgICAvLyBhc3NlcnQgbm90IHRlcm1zLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24sIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZGlnIDQKICAgIHB1c2hpbnQgNzg2CiAgICBnZXRiaXQKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KCmNvbnRyYWN0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDIwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODA3CiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIEQtQVNBIGFscmVhZHkgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODA4CiAgICAvLyBhc3NlcnQgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCA9PSBVSW50NjQoMCksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMCAvLyAiaW5pdGlhbF9leGNoYW5nZV9hbW91bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTAtODExCiAgICAvLyAjIFNldCBEZW5vbWluYXRpb24gQXNzZXQKICAgIC8vIHNlbGYuX2Fzc2VydF9kZW5vbWluYXRpb25fYXNzZXQodGVybXMuZGVub21pbmF0aW9uX2Fzc2V0X2lkKQogICAgZGlnIDQKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NzUtNzc2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIGRlbm9taW5hdGlvbiB3aXRoIEFTQQogICAgLy8gX2NyZWF0b3IsIGV4aXN0cyA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X2NyZWF0b3IoZGVub21pbmF0aW9uX2Fzc2V0X2lkKQogICAgZHVwCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q3JlYXRvcgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NzcKICAgIC8vIGFzc2VydCBleGlzdHMsIGVyci5JTlZBTElEX0RFTk9NSU5BVElPTgogICAgYXNzZXJ0IC8vIERlbm9taW5hdGlvbiBhc3NldCBpcyBub3QgcHJvcGVybHkgc2V0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODAKICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICBieXRlYyA0NCAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTQtODE1CiAgICAvLyAjIFNldCBTZXR0bGVtZW50IEFzc2V0CiAgICAvLyBzZWxmLl9hc3NlcnRfc2V0dGxlbWVudF9hc3NldCh0ZXJtcy5zZXR0bGVtZW50X2Fzc2V0X2lkKQogICAgZGlnIDEKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc4NQogICAgLy8gc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODMtNzg2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc2V0dGxlbWVudCBhc3NldCBpcyB0aGUgZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQgPT0gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIC8vICksIGVyci5JTlZBTElEX1NFVFRMRU1FTlRfQVNTRVQKICAgIGFzc2VydCAvLyBEaWZmZXJlbnQgc2V0dGxlbWVudCBhc3NldCBub3Qgc3VwcG9ydGVkLCBtdXN0IGJlIGVxdWFsIHRvIGRlbm9taW5hdGlvbiBhc3NldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Nzg5CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBzZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkwLTc5NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhc3NldF9hbW91bnQ9MCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Nzk1CiAgICAvLyBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkzCiAgICAvLyBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc5NAogICAgLy8gYXNzZXRfYW1vdW50PTAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkwLTc5MQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3OTAtNzk2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODE4LTgxOQogICAgLy8gIyBVbml0cwogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IHRlcm1zLnRvdGFsX3VuaXRzCiAgICBkdXAKICAgIHB1c2hpbnQgMTcKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODIwCiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID0gVUludDY0KDApCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgyMi04MjMKICAgIC8vICMgRGF5LUNvdW50IENvbnZlbnRpb25zCiAgICAvLyBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uID0gdGVybXMuZGF5X2NvdW50X2NvbnZlbnRpb24uYXNfdWludDY0KCkKICAgIGJ5dGVjIDQ2IC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGRpZyA4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODI1LTgyNgogICAgLy8gIyBUaW1lCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA9IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZQogICAgZHVwCiAgICBwdXNoaW50IDQxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMjcgLy8gImluaXRpYWxfZXhjaGFuZ2VfZGF0ZSIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODI3CiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSB0ZXJtcy5tYXR1cml0eV9kYXRlCiAgICBkaWcgMQogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDQ1IC8vICJtYXR1cml0eV9kYXRlIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MjgKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IGluaXRpYWxfc3RhdGUubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZGlnIDYKICAgIGR1cAogICAgY292ZXIgMgogICAgcHVzaGludCA0OAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzMC04MzEKICAgIC8vICMgUHJpbmNpcGFsCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID0gdGVybXMuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGRpZyAxMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzMgogICAgLy8gc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gdGVybXMuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZGlnIDMKICAgIHB1c2hpbnQgNzg2CiAgICBnZXRiaXQKICAgIGJ5dGVjIDM0IC8vICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzMwogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBpbml0aWFsX3N0YXRlLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZGlnIDEKICAgIHB1c2hpbnQgMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODM1LTgzNgogICAgLy8gIyBJbnRlcmVzdAogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ID0gaW5pdGlhbF9zdGF0ZS5hY2NydWVkX2ludGVyZXN0CiAgICBkaWcgMQogICAgcHVzaGludCA0MAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODM4LTgzOQogICAgLy8gIyBJbnRlcmVzdCBSYXRlCiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IGluaXRpYWxfc3RhdGUubm9taW5hbF9pbnRlcmVzdF9yYXRlCiAgICBkaWcgMQogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0MAogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gaW5pdGlhbF9zdGF0ZS5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlCiAgICBkaWcgMQogICAgcHVzaGludCAyNAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQxCiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkID0gdGVybXMucmF0ZV9yZXNldF9zcHJlYWQKICAgIGRpZyAzCiAgICBwdXNoaW50IDU4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzUgLy8gInJhdGVfcmVzZXRfc3ByZWFkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0MgogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIgPSB0ZXJtcy5yYXRlX3Jlc2V0X211bHRpcGxpZXIKICAgIGRpZyAzCiAgICBwdXNoaW50IDY2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzYgLy8gInJhdGVfcmVzZXRfbXVsdGlwbGllciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDMKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9mbG9vciA9IHRlcm1zLnJhdGVfcmVzZXRfZmxvb3IKICAgIGRpZyAzCiAgICBwdXNoaW50IDc0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzAgLy8gInJhdGVfcmVzZXRfZmxvb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQ0CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfY2FwID0gdGVybXMucmF0ZV9yZXNldF9jYXAKICAgIGRpZyAzCiAgICBwdXNoaW50IDgyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzEgLy8gInJhdGVfcmVzZXRfY2FwIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0NQogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X25leHQgPSB0ZXJtcy5yYXRlX3Jlc2V0X25leHQKICAgIGRpZyAzCiAgICBwdXNoaW50IDkwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzcgLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDYKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgPSB0ZXJtcy5oYXNfcmF0ZV9yZXNldF9mbG9vcgogICAgZGlnIDMKICAgIHB1c2hpbnQgNzg0CiAgICBnZXRiaXQKICAgIGJ5dGVjIDM4IC8vICJoYXNfcmF0ZV9yZXNldF9mbG9vciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDcKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwID0gdGVybXMuaGFzX3JhdGVfcmVzZXRfY2FwCiAgICBkaWcgMwogICAgcHVzaGludCA3ODUKICAgIGdldGJpdAogICAgYnl0ZWMgMzkgLy8gImhhc19yYXRlX3Jlc2V0X2NhcCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDktODUwCiAgICAvLyAjIFNjYWxpbmcKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgPSB0ZXJtcy5maXhlZF9wb2ludF9zY2FsZQogICAgdW5jb3ZlciAzCiAgICBwdXNoaW50IDk5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODUyLTg1MwogICAgLy8gIyBTY2hlZHVsZSBQcm9jZXNzaW5nCiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciA9IGluaXRpYWxfc3RhdGUuZXZlbnRfY3Vyc29yCiAgICBkaWcgMQogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU1LTg1NgogICAgLy8gIyBQZXItVW5pdCBGaXhlZC1Qb2ludCBJbmRleGVzCiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggPSBpbml0aWFsX3N0YXRlLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgKICAgIGRpZyAxCiAgICBwdXNoaW50IDU2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU3CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4ID0gaW5pdGlhbF9zdGF0ZS5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleAogICAgZGlnIDEKICAgIHB1c2hpbnQgNjQKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU5LTg2MAogICAgLy8gIyBSZXNlcnZlZCBBbW91bnQgKGZvciBleGVjdXRlZCBjYXNoZmxvd3MpCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0ID0gVUludDY0KDApCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2MQogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2MwogICAgLy8gYXNzZXJ0IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLCBlcnIuSU5WQUxJRF9JRUQKICAgIGRpZyAyCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICBhc3NlcnQgLy8gSUVEIG11c3QgYmUgc2V0IGluIHRoZSBmdXR1cmUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2NAogICAgLy8gYXNzZXJ0IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA+IGluaXRpYWxfc3RhdGUuc3RhdHVzX2RhdGUsIGVyci5JTlZBTElEX0lFRAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgPAogICAgYXNzZXJ0IC8vIElFRCBtdXN0IGJlIHNldCBpbiB0aGUgZnV0dXJlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NjUKICAgIC8vIGFzc2VydCB0ZXJtcy5pbml0aWFsX2V4Y2hhbmdlX2RhdGUgPCB0ZXJtcy5tYXR1cml0eV9kYXRlLCBlcnIuSU5WQUxJRF9JRUQKICAgIDwKICAgIGFzc2VydCAvLyBJRUQgbXVzdCBiZSBzZXQgaW4gdGhlIGZ1dHVyZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3My0xMDc0CiAgICAvLyAjIE5vdGFyaXplIHByb3NwZWN0dXMgKG9wdGlvbmFsKQogICAgLy8gc2VsZi5wcm9zcGVjdHVzX2hhc2ggPSBwcm9zcGVjdHVzLmhhc2guYnl0ZXMKICAgIGRpZyAyCiAgICBleHRyYWN0IDAgMzIKICAgIGJ5dGVjIDQyIC8vICJwcm9zcGVjdHVzX2hhc2giCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3NQogICAgLy8gc2VsZi5wcm9zcGVjdHVzX3VybCA9IHByb3NwZWN0dXMudXJsCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGVjIDQzIC8vICJwcm9zcGVjdHVzX3VybCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc2CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAMTc6CiAgICBpbnRjXzAgLy8gMAogICAgYiBjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUAxOAoKY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAODoKICAgIGludGNfMCAvLyAwCiAgICBiIGNvbnRyYWN0X2NvbmZpZ19ib29sX21lcmdlQDkKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9zY2hlZHVsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X3NjaGVkdWxlOgogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHN3YXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBkdXAKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgMgogICAgKwogICAgdW5jb3ZlciAyCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLkV4ZWN1dGlvblNjaGVkdWxlRW50cnk+CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTEwCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMTMKICAgIC8vIGNvbnRyYWN0X3R5cGU9c2VsZi5jb250cmFjdF90eXBlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGNvdmVyIDMKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4ODEKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4ODItODg0CiAgICAvLyBhc3NlcnQgc2NoZWR1bGVfcGFnZS5sZW5ndGggPD0gVUludDY0KAogICAgLy8gICAgIGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUKICAgIC8vICksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGR1cAogICAgcHVzaGludCAxNgogICAgPD0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg4NQogICAgLy8gYXNzZXJ0IHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPiBVSW50NjQoMCksIGVyci5URVJNU19OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSB0ZXJtcyBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODg3CiAgICAvLyBwYWdlX2N1cnNvciA9IHNjaGVkdWxlX3BhZ2VfaW5kZXggKiBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkKICAgIHN3YXAKICAgIHB1c2hpbnQgMTYKICAgICoKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg5NAogICAgLy8gKyBwYWdlX2xlbmd0aCAqIFVJbnQ2NChjc3QuT1BfVVBfQ09OVFJBQ1RfQ09ORklHX1BFUl9FTlRSWV9CVURHRVQpCiAgICBwdXNoaW50IDEwMAogICAgKgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODkzCiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19CQVNFX0JVREdFVCkKICAgIGludGMgNCAvLyAxNTAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTMtODk0CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19CQVNFX0JVREdFVCkKICAgIC8vICsgcGFnZV9sZW5ndGggKiBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19QRVJfRU5UUllfQlVER0VUKQogICAgKwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODg5LTg5NgogICAgLy8gIyBWYWxpZGF0aW9uIGNvc3QgZ3Jvd3Mgd2l0aCBwYWdlIGxlbmd0aCwgc28gY29uZmlndXJhdGlvbiBleHBsaWNpdGx5CiAgICAvLyAjIGJ1eXMgZXh0cmEgb3Bjb2RlIGJ1ZGdldCBmb3IgbGFyZ2VyIHVwbG9hZHMuCiAgICAvLyBlbnN1cmVfYnVkZ2V0KAogICAgLy8gICAgIHJlcXVpcmVkX2J1ZGdldD0oCiAgICAvLyAgICAgICAgIFVJbnQ2NChjc3QuT1BfVVBfQ09OVFJBQ1RfQ09ORklHX0JBU0VfQlVER0VUKQogICAgLy8gICAgICAgICArIHBhZ2VfbGVuZ3RoICogVUludDY0KGNzdC5PUF9VUF9DT05UUkFDVF9DT05GSUdfUEVSX0VOVFJZX0JVREdFVCkKICAgIC8vICAgICApLAogICAgLy8gKQogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODk3CiAgICAvLyBpbmRleCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKCmNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEAyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODk4CiAgICAvLyB3aGlsZSBpbmRleCA8IHBhZ2VfbGVuZ3RoOgogICAgZHVwCiAgICBkaWcgNAogICAgPAogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfd2hpbGVAMTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg5OS05MDAKICAgIC8vIGVudHJ5ID0gc2NoZWR1bGVfcGFnZVtpbmRleF0uY29weSgpCiAgICAvLyBlbnRyeV9ldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZGlnIDQKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGJ1cnkgMTIKICAgIGRpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgNjUKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTAwCiAgICAvLyBlbnRyeV9ldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTktOTAwCiAgICAvLyBlbnRyeSA9IHNjaGVkdWxlX3BhZ2VbaW5kZXhdLmNvcHkoKQogICAgLy8gZW50cnlfZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGludGNfMiAvLyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDAKICAgIC8vIGVudHJ5X2V2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBnZXRieXRlCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgMTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkwMQogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X2lkID09IHBhZ2VfY3Vyc29yICsgaW5kZXgsIGVyci5JTlZBTElEX0VWRU5UX0lECiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEzCiAgICBkaWcgNQogICAgdW5jb3ZlciA0CiAgICArCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDItOTA0CiAgICAvLyBzZWxmLl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBlbnRyeV9ldmVudF90eXBlCiAgICAvLyApCiAgICBkaWcgNQogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTA1CiAgICAvLyBhc3NlcnQgZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgc3dhcAogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDYKICAgIC8vIGlmIGVudHJ5LmV2ZW50X2lkID4gVUludDY0KDApOgogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDcKICAgIC8vIGlmIGluZGV4ID4gVUludDY0KDApOgogICAgZHVwCiAgICBieiBjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlANgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTA4CiAgICAvLyBwcmV2aW91c19lbnRyeSA9IHNjaGVkdWxlX3BhZ2VbaW5kZXggLSBVSW50NjQoMSldLmNvcHkoKQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgcHVzaGludCA2NQogICAgKgogICAgZGlnIDExCiAgICBzd2FwCiAgICBwdXNoaW50IDY1CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkyMwogICAgLy8gcHJldmlvdXNfZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gZW50cnkuc2NoZWR1bGVkX3RpbWUKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyA4CiAgICA8PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTIyLTkyNAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBwcmV2aW91c19lbnRyeS5zY2hlZHVsZWRfdGltZSA8PSBlbnRyeS5zY2hlZHVsZWRfdGltZQogICAgLy8gKSwgZXJyLklOVkFMSURfU09SVElORwogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIG11c3QgYmUgc29ydGVkIGluIHN0cmljdGx5IGFzY2VuZGluZyBvcmRlcgoKY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUA4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTI1CiAgICAvLyBpZiBlbnRyeS5ldmVudF9pZCA9PSBVSW50NjQoMCk6CiAgICBkaWcgOAogICAgYm56IGNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkyNi05MjgKICAgIC8vIGFzc2VydCBlbnRyeV9ldmVudF90eXBlID09IFVJbnQ2NCgKICAgIC8vICAgICBlbnVtcy5FVlRfSUVECiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGRpZyA5CiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjkKICAgIC8vIGluZGV4ICs9IFVJbnQ2NCgxKQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIGNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEAyCgpjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlANjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkxMC05MTIKICAgIC8vICMgVGhlIGZpcnN0IGVudHJ5IG9mIGEgcGFnZSBtdXN0IHN0aWxsIGJlIG9yZGVyZWQgYWZ0ZXIgdGhlCiAgICAvLyAjIGxhc3QgZW50cnkgb2YgdGhlIHByZXZpb3VzIHBhZ2UuCiAgICAvLyBhc3NlcnQgc2NoZWR1bGVfcGFnZV9pbmRleCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGRpZyA2CiAgICBkdXAKICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTMKICAgIC8vIHByZXZpb3VzX3BhZ2VfaW5kZXggPSBzY2hlZHVsZV9wYWdlX2luZGV4IC0gVUludDY0KDEpCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTE1CiAgICAvLyBwcmV2aW91c19wYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZQogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTQtOTE2CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHByZXZpb3VzX3BhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTctOTE4CiAgICAvLyBwcmV2aW91c19wYWdlID0gc2VsZi5zY2hlZHVsZV9wYWdlW3ByZXZpb3VzX3BhZ2VfaW5kZXhdLmNvcHkoKQogICAgLy8gYXNzZXJ0IHByZXZpb3VzX3BhZ2UubGVuZ3RoID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBwdXNoaW50IDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTgKICAgIC8vIGFzc2VydCBwcmV2aW91c19wYWdlLmxlbmd0aCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZHVwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjAKICAgIC8vIHByZXZpb3VzX3BhZ2UubGVuZ3RoIC0gVUludDY0KDEpCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTE5LTkyMQogICAgLy8gcHJldmlvdXNfZW50cnkgPSBwcmV2aW91c19wYWdlWwogICAgLy8gICAgIHByZXZpb3VzX3BhZ2UubGVuZ3RoIC0gVUludDY0KDEpCiAgICAvLyBdLmNvcHkoKQogICAgcHVzaGludCA2NQogICAgKgogICAgcHVzaGludCAyCiAgICArCiAgICBwdXNoaW50IDY1CiAgICBib3hfZXh0cmFjdAogICAgYiBjb250cmFjdF9zY2hlZHVsZV9hZnRlcl9pZl9lbHNlQDcKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX3doaWxlQDExOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjAwCiAgICAvLyBzZWxmLnNjaGVkdWxlX3BhZ2VbcGFnZV9pbmRleF0gPSBzY2hlZHVsZV9wYWdlLmNvcHkoKQogICAgZGlnIDYKICAgIGl0b2IKICAgIGJ5dGVjIDI0IC8vIDB4NTMyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgZGlnIDUKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzMgogICAgLy8gaWYgaXNfbGFzdF9wYWdlOgogICAgZGlnIDUKICAgIGJ6IGNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzNAogICAgLy8gc2NoZWR1bGVfcGFnZV9pbmRleCAqIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKSArIHBhZ2VfbGVuZ3RoCiAgICBkaWcgMQogICAgZGlnIDQKICAgICsKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzMwogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA9ICgKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTMzLTkzNQogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA9ICgKICAgIC8vICAgICBzY2hlZHVsZV9wYWdlX2luZGV4ICogVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpICsgcGFnZV9sZW5ndGgKICAgIC8vICkKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MzYKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgNTAKICAgIGFwcF9nbG9iYWxfcHV0Cgpjb250cmFjdF9zY2hlZHVsZV9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTExOAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9leGVjdXRlX2llZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X2V4ZWN1dGVfaWVkOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDMKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE0NAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDUKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTQ3CiAgICAvLyBhc3NlcnQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LCBlcnIuSU5WQUxJRF9FVkVOVF9DVVJTT1IKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgZGlnIDEKICAgID4KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGN1cnNvcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE0OAogICAgLy8gZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoc2VsZi5ldmVudF9jdXJzb3IpCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDkKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoZW51bXMuRVZUX0lFRCksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGR1cAogICAgZXh0cmFjdCA4IDEKICAgIGR1cAogICAgcHVzaGJ5dGVzIDB4MDEKICAgIGI9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1MwogICAgLy8gZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICBkaWcgMQogICAgZXh0cmFjdCAwIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTUKICAgIC8vIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgZGlnIDIKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTU2CiAgICAvLyBhY2NydWFsX2ZhY3Rvcj1lbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIGRpZyAzCiAgICBleHRyYWN0IDE3IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTcKICAgIC8vIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIGRpZyA0CiAgICBleHRyYWN0IDI1IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTkKICAgIC8vIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPWVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDUKICAgIGV4dHJhY3QgMzMgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE2MAogICAgLy8gbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgZGlnIDYKICAgIGV4dHJhY3QgNDEgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE2MQogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9ZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICBkaWcgNwogICAgZXh0cmFjdCA0OSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTYyCiAgICAvLyBmbGFncz1lbnRyeS5mbGFncywKICAgIGRpZyA4CiAgICBleHRyYWN0IDU3IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTItMTE2MwogICAgLy8gdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0KAogICAgLy8gICAgIGV2ZW50X2lkPWVudHJ5LmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1lbnRyeS5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1lbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPWVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9ZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPWVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGZsYWdzPWVudHJ5LmZsYWdzLAogICAgLy8gKSwKICAgIHVuY292ZXIgNwogICAgdW5jb3ZlciA4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNwogICAgY29uY2F0CiAgICB1bmNvdmVyIDYKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTgKICAgIC8vIG9ic2VydmVkX3JhdGU9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTItMTE2MwogICAgLy8gdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0KAogICAgLy8gICAgIGV2ZW50X2lkPWVudHJ5LmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1lbnRyeS5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1lbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPWVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9ZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPWVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGZsYWdzPWVudHJ5LmZsYWdzLAogICAgLy8gKSwKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTUwLTExNjQKICAgIC8vIHNlbGYuX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5KAogICAgLy8gICAgIGVudHJ5LAogICAgLy8gICAgIHR5cC5PYnNlcnZlZEV2ZW50UmVxdWVzdCgKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPWVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIG9ic2VydmVkX3JhdGU9VUludDY0KDApLAogICAgLy8gICAgICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1lbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1lbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICAgICAgZmxhZ3M9ZW50cnkuZmxhZ3MsCiAgICAvLyAgICAgKSwKICAgIC8vICkKICAgIGNhbGxzdWIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5CiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNjUKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEyMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuYXBwbHlfbm9uX2Nhc2hfZXZlbnRbcm91dGluZ10oKSAtPiB2b2lkOgphcHBseV9ub25fY2FzaF9ldmVudDoKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDQKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cG4gMgogICAgbGVuCiAgICBwdXNoaW50IDczCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLk9ic2VydmVkRXZlbnRSZXF1ZXN0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIwNAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMDUKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjA3CiAgICAvLyBpZiBwYXlsb2FkLmZsYWdzICYgVUludDY0KGVudW1zLkZMQUdfT0JTRVJWRURfRVZFTlQpOgogICAgcHVzaGludCA2NQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgcHVzaGludCA0CiAgICAmCiAgICBieiBhcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIzMwogICAgLy8gcmV0dXJuIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQ0xNKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICBwdXNoaW50IDUKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjA4CiAgICAvLyBhc3NlcnQgc2VsZi5fc3VwcG9ydHNfb2JzZXJ2ZWRfZXZlbnRzKCksIGVyci5PQlNFUlZFRF9FVkVOVF9SRVFVSVJFRAogICAgYXNzZXJ0IC8vIE9ic2VydmVkIGV2ZW50IHJlcXVpcmVkIHRvIGV4ZWN1dGUgdGhpcyBhY3Rpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMDkKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjMzCiAgICAvLyByZXR1cm4gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9DTE0pCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIGR1cAogICAgcHVzaGludCA1CiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQ1CiAgICAvLyBhc3NlcnQgc2VsZi5fc3VwcG9ydHNfb2JzZXJ2ZWRfZXZlbnRzKCksIGVyci5PQlNFUlZFRF9FVkVOVF9SRVFVSVJFRAogICAgYXNzZXJ0IC8vIE9ic2VydmVkIGV2ZW50IHJlcXVpcmVkIHRvIGV4ZWN1dGUgdGhpcyBhY3Rpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk0NgogICAgLy8gYXNzZXJ0IHBheWxvYWQuZXZlbnRfaWQgPT0gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGRpZyAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDcKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBpZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQ4CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUsIHBheWxvYWQuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgYnVyeSAxMgogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk0Ny05NDkKICAgIC8vIHNlbGYuX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIHNlbGYuY29udHJhY3RfdHlwZSwgcGF5bG9hZC5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICAvLyApCiAgICBjYWxsc3ViIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTUxCiAgICAvLyBwYWdlX2luZGV4ID0gc2VsZi5fc2NoZWR1bGVfcGFnZV9pbmRleChzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTkwCiAgICAvLyByZXR1cm4gZXZlbnRfaWQgLy8gVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpCiAgICBwdXNoaW50IDE2CiAgICAvCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTIKICAgIC8vIHBhZ2UgPSB0eXAuRXhlY3V0aW9uU2NoZWR1bGVQYWdlKCkKICAgIGJ5dGVjIDQ4IC8vIDB4MDAwMAogICAgYnVyeSA3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTMKICAgIC8vIGlmIHBhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlOgogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA5CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMjcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1NAogICAgLy8gcGFnZSA9IHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XS5jb3B5KCkKICAgIGRpZyA3CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidXJ5IDcKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX3BhZ2UgZW50cnkgZXhpc3RzCgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDI3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTU1CiAgICAvLyBhc3NlcnQgcGFnZS5sZW5ndGggPCBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGRpZyA1CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgMTYKICAgIDwKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2MAogICAgLy8gc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIGRpZyAzCiAgICBkdXAKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjEKICAgIC8vIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICBkaWcgMQogICAgZXh0cmFjdCAxNyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjIKICAgIC8vIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZGlnIDIKICAgIGV4dHJhY3QgMjUgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTYzCiAgICAvLyBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDMKICAgIGV4dHJhY3QgNDEgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTY0CiAgICAvLyBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIGRpZyA0CiAgICBleHRyYWN0IDQ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2NQogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIHVuY292ZXIgNQogICAgZXh0cmFjdCA1NyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTctOTY3CiAgICAvLyB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1wYXlsb2FkLmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9cGF5bG9hZC5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPXBheWxvYWQucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXBheWxvYWQubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICkKICAgIGRpZyAxMQogICAgaXRvYgogICAgZGlnIDE4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMwogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTYtOTY4CiAgICAvLyBwYWdlLmFwcGVuZCgKICAgIC8vICAgICB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9cGF5bG9hZC5ldmVudF9pZCwKICAgIC8vICAgICAgICAgZXZlbnRfdHlwZT1wYXlsb2FkLmV2ZW50X3R5cGUsCiAgICAvLyAgICAgICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIC8vICAgICAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICAgICApCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjkKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHBhZ2UuY29weSgpCiAgICBkaWcgOAogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk3MAogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjEyCiAgICAvLyBhc3NlcnQgZXZlbnRfaWQgPT0gc2VsZi5ldmVudF9jdXJzb3IsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBjdXJzb3IKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMTMKICAgIC8vIGVudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KGV2ZW50X2lkKQogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIxNQogICAgLy8gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgYnVyeSAxMAogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjQKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY1CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzYzLTM3MAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9SUiksCiAgICBwdXNoaW50IDEyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY3CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICBwdXNoaW50IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY4CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgcHVzaGludCAxOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzYzLTM3MAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBieiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX2ZhbHNlQDE2CgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX3RydWVAMTU6CiAgICBpbnRjXzEgLy8gMQoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9tZXJnZUAxNzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMTQtMTIxNgogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2lzX25vbl9jYXNoKAogICAgLy8gICAgIGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIC8vICksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IHR5cGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMTcKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlICE9IGFyYzQuVUludDgoZW51bXMuRVZUX0lFRCksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGRpZyA4CiAgICBwdXNoYnl0ZXMgMHgwMQogICAgYiE9CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCB0eXBlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNzQKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluIChVSW50NjQoZW51bXMuRVZUX1JSKSwgVUludDY0KGVudW1zLkVWVF9SUkYpKQogICAgZGlnIDQKICAgIHB1c2hpbnQgMTIKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDIxCiAgICBkaWcgNAogICAgcHVzaGludCAxMQogICAgPT0KICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfZmFsc2VAMjIKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAyMToKICAgIGludGNfMSAvLyAxCgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX21lcmdlQDIzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIxOAogICAgLy8gaWYgc2VsZi5fZXZlbnRfaXNfcmF0ZV9yZXNldChlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpKToKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Vsc2VfYm9keUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODAKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLm9ic2VydmVyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjUgLy8gMHg1MjNhNGQ0ZjQzMjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMjIKICAgIC8vIHNlbGYuX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5KGVudHJ5LCBwYXlsb2FkKQogICAgZGlnIDYKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeQogICAgcG9wbiAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjIzCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfZWxzZV9ib2R5QDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjIxCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIGIgYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYWZ0ZXJfaWZfZWxzZUA2CgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX2ZhbHNlQDIyOgogICAgaW50Y18wIC8vIDAKICAgIGIgYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9tZXJnZUAyMwoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9mYWxzZUAxNjoKICAgIGludGNfMCAvLyAwCiAgICBiIGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfbWVyZ2VAMTcKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5hcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50OgogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGxlbgogICAgcHVzaGludCA2NQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5PYnNlcnZlZENhc2hFdmVudFJlcXVlc3QKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjU0CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyNTUKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjU2CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIzMwogICAgLy8gcmV0dXJuIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQ0xNKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICBwdXNoaW50IDUKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5ODEKICAgIC8vIGFzc2VydCBzZWxmLl9zdXBwb3J0c19vYnNlcnZlZF9ldmVudHMoKSwgZXJyLk9CU0VSVkVEX0VWRU5UX1JFUVVJUkVECiAgICBhc3NlcnQgLy8gT2JzZXJ2ZWQgZXZlbnQgcmVxdWlyZWQgdG8gZXhlY3V0ZSB0aGlzIGFjdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTgyCiAgICAvLyBhc3NlcnQgcGF5bG9hZC5ldmVudF9pZCA9PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LCBlcnIuSU5WQUxJRF9FVkVOVF9JRAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgc3dhcAogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBpZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTgzCiAgICAvLyBhc3NlcnQgcGF5bG9hZC5ldmVudF90eXBlID09IGFyYzQuVUludDgoZW51bXMuRVZUX1BSKSwgZXJyLklOVkFMSURfRVZFTlRfVFlQRQogICAgZGlnIDEKICAgIGV4dHJhY3QgOCAxCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIHB1c2hieXRlcyAweDAzCiAgICBiPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IHR5cGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4NAogICAgLy8gYXNzZXJ0IHBheWxvYWQuZmxhZ3MgJiBVSW50NjQoZW51bXMuRkxBR19DQVNIX0VWRU5UKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBzd2FwCiAgICBwdXNoaW50IDU3CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzEgLy8gMQogICAgJgogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTg2CiAgICAvLyBpZiBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50ID4gVUludDY0KDApOgogICAgYnogYXBwZW5kX29ic2VydmVkX2Nhc2hfZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5ODgKICAgIC8vIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgLSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5ODctOTg5CiAgICAvLyBwcmV2aW91c19lbnRyeSA9IHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeSgKICAgIC8vICAgICBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IC0gVUludDY0KDEpCiAgICAvLyApCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5MQogICAgLy8gcHJldmlvdXNfZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gcGF5bG9hZC5zY2hlZHVsZWRfdGltZQogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDQKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIDw9CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OTAtOTkyCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHByZXZpb3VzX2VudHJ5LnNjaGVkdWxlZF90aW1lIDw9IHBheWxvYWQuc2NoZWR1bGVkX3RpbWUKICAgIC8vICksIGVyci5JTlZBTElEX1NPUlRJTkcKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBtdXN0IGJlIHNvcnRlZCBpbiBzdHJpY3RseSBhc2NlbmRpbmcgb3JkZXIKCmFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5NAogICAgLy8gcGFnZV9pbmRleCA9IHNlbGYuX3NjaGVkdWxlX3BhZ2VfaW5kZXgoc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE5MAogICAgLy8gcmV0dXJuIGV2ZW50X2lkIC8vIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKQogICAgcHVzaGludCAxNgogICAgLwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTk1CiAgICAvLyBwYWdlID0gdHlwLkV4ZWN1dGlvblNjaGVkdWxlUGFnZSgpCiAgICBieXRlYyA0OCAvLyAweDAwMDAKICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTk2CiAgICAvLyBpZiBwYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZToKICAgIGl0b2IKICAgIGJ5dGVjIDI0IC8vIDB4NTMyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgNwogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBhcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5NwogICAgLy8gcGFnZSA9IHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XS5jb3B5KCkKICAgIGRpZyA1CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidXJ5IDYKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX3BhZ2UgZW50cnkgZXhpc3RzCgphcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OTgKICAgIC8vIGFzc2VydCBwYWdlLmxlbmd0aCA8IFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZGlnIDQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgcHVzaGludCAxNgogICAgPAogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAwMwogICAgLy8gc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIGRpZyA1CiAgICBkdXAKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDA0CiAgICAvLyBhY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLmFjY3J1YWxfZmFjdG9yLAogICAgZGlnIDEKICAgIGV4dHJhY3QgMTcgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAwNQogICAgLy8gcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICBkaWcgMgogICAgZXh0cmFjdCAyNSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDA2CiAgICAvLyBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDMKICAgIGV4dHJhY3QgMzMgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAwNwogICAgLy8gbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1wYXlsb2FkLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICBkaWcgNAogICAgZXh0cmFjdCA0MSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDA4CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1wYXlsb2FkLm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgdW5jb3ZlciA1CiAgICBleHRyYWN0IDQ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMDAtMTAxMAogICAgLy8gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkoCiAgICAvLyAgICAgZXZlbnRfaWQ9cGF5bG9hZC5ldmVudF9pZCwKICAgIC8vICAgICBldmVudF90eXBlPXBheWxvYWQuZXZlbnRfdHlwZSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1wYXlsb2FkLnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9cGF5bG9hZC5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIC8vICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1wYXlsb2FkLm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGZsYWdzPXBheWxvYWQuZmxhZ3MsCiAgICAvLyApCiAgICBkaWcgMTAKICAgIGl0b2IKICAgIGRpZyAxMAogICAgY29uY2F0CiAgICB1bmNvdmVyIDYKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTk5LTEwMTEKICAgIC8vIHBhZ2UuYXBwZW5kKAogICAgLy8gICAgIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgICAgICBldmVudF9pZD1wYXlsb2FkLmV2ZW50X2lkLAogICAgLy8gICAgICAgICBldmVudF90eXBlPXBheWxvYWQuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICAgICAgYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPXBheWxvYWQubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1wYXlsb2FkLm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgICAgICBmbGFncz1wYXlsb2FkLmZsYWdzLAogICAgLy8gICAgICkKICAgIC8vICkKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMTIKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHBhZ2UuY29weSgpCiAgICBkaWcgNgogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMTMKICAgIC8vIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgKz0gVUludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI2MAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9nZXRfc3RhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9nZXRfc3RhdGU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGR1cAogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjc1CiAgICAvLyBjb250cmFjdF90eXBlPWFyYzQuVUludDgoc2VsZi5jb250cmFjdF90eXBlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgaXRvYgogICAgZHVwCiAgICBiaXRsZW4KICAgIGludGNfMiAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBleHRyYWN0IDcgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI3NwogICAgLy8gdG90YWxfdW5pdHM9c2VsZi50b3RhbF91bml0cywKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjc4CiAgICAvLyByZXNlcnZlZF91bml0c190b3RhbD1zZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyNzkKICAgIC8vIGluaXRpYWxfZXhjaGFuZ2VfYW1vdW50PXNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI4MAogICAgLy8gZXZlbnRfY3Vyc29yPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjgxCiAgICAvLyBzY2hlZHVsZV9lbnRyeV9jb3VudD1zZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI4MgogICAgLy8gb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjgzCiAgICAvLyBpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlPXNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjg0CiAgICAvLyBub21pbmFsX2ludGVyZXN0X3JhdGU9c2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyODUKICAgIC8vIGFjY3J1ZWRfaW50ZXJlc3Q9c2VsZi5hY2NydWVkX2ludGVyZXN0LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyODYKICAgIC8vIGN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXg9c2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjg3CiAgICAvLyBjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleD1zZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyODgKICAgIC8vIHJlc2VydmVkX2ludGVyZXN0PXNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX2ludGVyZXN0IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI4OQogICAgLy8gcmVzZXJ2ZWRfcHJpbmNpcGFsPXNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI3NC0xMjkwCiAgICAvLyByZXR1cm4gdHlwLktlcm5lbFN0YXRlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGU9YXJjNC5VSW50OChzZWxmLmNvbnRyYWN0X3R5cGUpLAogICAgLy8gICAgIHN0YXR1cz1zZWxmLnN0YXR1cywKICAgIC8vICAgICB0b3RhbF91bml0cz1zZWxmLnRvdGFsX3VuaXRzLAogICAgLy8gICAgIHJlc2VydmVkX3VuaXRzX3RvdGFsPXNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwsCiAgICAvLyAgICAgaW5pdGlhbF9leGNoYW5nZV9hbW91bnQ9c2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCwKICAgIC8vICAgICBldmVudF9jdXJzb3I9c2VsZi5ldmVudF9jdXJzb3IsCiAgICAvLyAgICAgc2NoZWR1bGVfZW50cnlfY291bnQ9c2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwKICAgIC8vICAgICBvdXRzdGFuZGluZ19wcmluY2lwYWw9c2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZT1zZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICAvLyAgICAgbm9taW5hbF9pbnRlcmVzdF9yYXRlPXNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIGFjY3J1ZWRfaW50ZXJlc3Q9c2VsZi5hY2NydWVkX2ludGVyZXN0LAogICAgLy8gICAgIGN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXg9c2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4LAogICAgLy8gICAgIGN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4PXNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgsCiAgICAvLyAgICAgcmVzZXJ2ZWRfaW50ZXJlc3Q9c2VsZi5yZXNlcnZlZF9pbnRlcmVzdCwKICAgIC8vICAgICByZXNlcnZlZF9wcmluY2lwYWw9c2VsZi5yZXNlcnZlZF9wcmluY2lwYWwsCiAgICAvLyApCiAgICB1bmNvdmVyIDE0CiAgICBpdG9iCiAgICB1bmNvdmVyIDE0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMgogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDExCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA5CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgOAogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDcKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyNjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzA0CiAgICAvLyBpZiBzZWxmLmV2ZW50X2N1cnNvciA+PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICA+PQogICAgYnogY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMwNgogICAgLy8gZXZlbnRfaWQ9c2VsZi5ldmVudF9jdXJzb3IsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMDUtMTMxNQogICAgLy8gcmV0dXJuIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgIGV2ZW50X2lkPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgLy8gICAgIGV2ZW50X3R5cGU9YXJjNC5VSW50OCgwKSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1VSW50NjQoMCksCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1VSW50NjQoMCksCiAgICAvLyAgICAgZmxhZ3M9VUludDY0KDApLAogICAgLy8gKQogICAgaXRvYgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMwNwogICAgLy8gZXZlbnRfdHlwZT1hcmM0LlVJbnQ4KDApLAogICAgYnl0ZWMgNDAgLy8gMHgwMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMwNS0xMzE1CiAgICAvLyByZXR1cm4gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkoCiAgICAvLyAgICAgZXZlbnRfaWQ9c2VsZi5ldmVudF9jdXJzb3IsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1hcmM0LlVJbnQ4KDApLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPVVJbnQ2NCgwKSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249VUludDY0KDApLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPVVJbnQ2NCgwKSwKICAgIC8vICAgICBmbGFncz1VSW50NjQoMCksCiAgICAvLyApCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMDgKICAgIC8vIHNjaGVkdWxlZF90aW1lPVVJbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzA1LTEzMTUKICAgIC8vIHJldHVybiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1zZWxmLmV2ZW50X2N1cnNvciwKICAgIC8vICAgICBldmVudF90eXBlPWFyYzQuVUludDgoMCksCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9VUludDY0KDApLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9VUludDY0KDApLAogICAgLy8gICAgIGZsYWdzPVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAoKY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50QDQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjkyCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzE2CiAgICAvLyByZXR1cm4gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KHNlbGYuZXZlbnRfY3Vyc29yKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyOTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiBjb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnRfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnRANAoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLmNvbnRyYWN0X3VwZGF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X3VwZGF0ZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTktMTYyCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gZ3JhbnRzIHRoZSB1cGRhdGUgcGVybWlzc2lvbnMgdG8gdGhlIEFycmFuZ2VyLgogICAgLy8gIyDimqDvuI8gV0FSTklORzogQXBwbGljYXRpb24gdXBkYXRlcyBtdXN0IGJlIGV4ZWN1dGVkIFZFUlkgY2FyZWZ1bGx5LCBhcyB0aGV5CiAgICAvLyAjIG1pZ2h0IGludHJvZHVjZSBicmVha2luZyBjaGFuZ2VzLgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19yb3RhdGVfYXJyYW5nZXJbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3JvdGF0ZV9hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTc4CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzkKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSBuZXdfYXJyYW5nZXIKICAgIGJ5dGVjIDE4IC8vIDB4NTIzYTQxNTI1MjIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4MAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTY0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3NldF9vcF9kYWVtb25bcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3NldF9vcF9kYWVtb246CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTgyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE5NgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTk3CiAgICAvLyBzZWxmLm9wX2RhZW1vbi52YWx1ZSA9IGFkZHJlc3MKICAgIGJ5dGVjIDI2IC8vIDB4NTIzYTRmNTA0NDIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE5OAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTgyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2Fzc2lnbl9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19hc3NpZ25fcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDE2CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLlJvbGVWYWxpZGl0eQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyMgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjIzCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNAogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgcHVzaGludCAyMAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTAzCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gcm9sZV9hZGRyZXNzCiAgICBieXRlYyAxOCAvLyAweDUyM2E0MTUyNTIyMwogICAgZGlnIDMKICAgIGFwcF9nbG9iYWxfcHV0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwNgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDQwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDcKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIzIC8vIDB4NTIzYTRkNGU0NzIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDgKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI1CiAgICAvLyBzZWxmLl9zZXRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIHZhbGlkaXR5KQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTAKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTEKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjIgLy8gMHg1MjNhNTA1OTQ0MjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMgogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNQogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE0CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpOgogICAgZHVwCiAgICBwdXNoaW50IDYwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTUKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAzMiAvLyAweDUyM2E1NDUyNTMyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE2CiAgICAvLyBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjUKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExOAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMSAvLyAweDUyM2E0MTU1NTQyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIwCiAgICAvLyBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNQogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgODAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIzCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI1IC8vIDB4NTIzYTRkNGY0MzIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjQKICAgIC8vIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfcmV2b2tlX3JvbGVbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3Jldm9rZV9yb2xlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0NwogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjQ4CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0OQogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjcKICAgIC8vIGFzc2VydCByb2xlX2lkICE9IFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwgZXJyLklOVkFMSURfUk9MRQogICAgZHVwCiAgICBwdXNoaW50IDIwCiAgICAhPQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI4CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICBwdXNoaW50IDQwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjkKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjMgLy8gMHg1MjNhNGQ0ZTQ3MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMAogICAgLy8gZGVsIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTEKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzMKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMiAvLyAweDUyM2E1MDU5NDQyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM0CiAgICAvLyBkZWwgc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTAKICAgIC8vIHNlbGYuX2RlbGV0ZV9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcykKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM2CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpOgogICAgZHVwCiAgICBwdXNoaW50IDYwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzcKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDMyIC8vIDB4NTIzYTU0NTI1MzIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzgKICAgIC8vIGRlbCBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjUwCiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDEKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hdXRob3JpdHksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjEgLy8gMHg1MjNhNDE1NTU0MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MgogICAgLy8gZGVsIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1MAogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDQKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDgwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI1IC8vIDB4NTIzYTRkNGY0MzIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDYKICAgIC8vIGRlbCBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19jb250cmFjdF9zdXNwZW5zaW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19jb250cmFjdF9zdXNwZW5zaW9uOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kICAjIFRPRE86IFVwZGF0ZSBzcGVjcyBhbmQgYWRkIHRlc3QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzcKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDIxIC8vIDB4NTIzYTQxNTU1NDIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjY5CiAgICAvLyBzZWxmLmFzc2V0X3N1c3BlbmRlZCA9IHN1c3BlbmRlZAogICAgYnl0ZWMgMzMgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjcwCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCAgIyBUT0RPOiBVcGRhdGUgc3BlY3MgYW5kIGFkZCB0ZXN0CiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYXJyYW5nZXJbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODMKICAgIC8vIHJldHVybiBzZWxmLmFycmFuZ2VyLnZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTggLy8gMHg1MjNhNDE1MjUyMjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcnJhbmdlciBleGlzdHMKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNzIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXNbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9hZGRyZXNzX3JvbGVzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDMKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDIzIC8vIDB4NTIzYTRkNGU0NzIzCiAgICBkaWcgMQogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDQKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYucHJpbWFyeV9kZWFsZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjIgLy8gMHg1MjNhNTA1OTQ0MjMKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwNQogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi50cnVzdGVlLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDMyIC8vIDB4NTIzYTU0NTI1MzIzCiAgICBkaWcgMwogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDYKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYXV0aG9yaXR5LCBhZGRyZXNzKSwKICAgIGJ5dGVjIDIxIC8vIDB4NTIzYTQxNTU1NDIzCiAgICBkaWcgNAogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDcKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYub2JzZXJ2ZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjUgLy8gMHg1MjNhNGQ0ZjQzMjMKICAgIHVuY292ZXIgNQogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWMgNDAgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgNgogICAgc2V0Yml0CiAgICBpbnRjXzEgLy8gMQogICAgdW5jb3ZlciA1CiAgICBzZXRiaXQKICAgIHB1c2hpbnQgMgogICAgdW5jb3ZlciA0CiAgICBzZXRiaXQKICAgIHB1c2hpbnQgMwogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIHB1c2hpbnQgNAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5W3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfcm9sZV92YWxpZGl0eToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjgKICAgIC8vIHJvbGUgPSByb2xlX2lkLmFzX3VpbnQ2NCgpCiAgICBidG9pCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI5CiAgICAvLyBzZWxmLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlKQogICAgZHVwCiAgICBjYWxsc3ViIF9hc3NlcnRfdmFsaWRfcm9sZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMzMQogICAgLy8gY2FzZSBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUik6CiAgICBwdXNoaW50cyAyMCA0MCA1MCA2MCA3MCA4MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMzMC0zNjEKICAgIC8vIG1hdGNoIHJvbGU6CiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUik6CiAgICAvLyAgICAgICAgIHJldHVybiB0eXAuUm9sZVZhbGlkaXR5KAogICAgLy8gICAgICAgICAgICAgcm9sZV92YWxpZGl0eV9zdGFydD1VSW50NjQoMCksIHJvbGVfdmFsaWRpdHlfZW5kPVVJbnQ2NCgwKQogICAgLy8gICAgICAgICApCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLmFjY291bnRfbWFuYWdlciwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLnByaW1hcnlfZGVhbGVyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLmF1dGhvcml0eSwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLm9ic2VydmVyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIF86CiAgICAvLyAgICAgICAgIG9wLmVycihlcnIuSU5WQUxJRF9ST0xFKQogICAgdW5jb3ZlciA2CiAgICBtYXRjaCByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzBAMiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzFAMyByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzJANCByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzNANSByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzRANiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzVANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM2MQogICAgLy8gb3AuZXJyKGVyci5JTlZBTElEX1JPTEUpCiAgICBlcnIgLy8gSW52YWxpZCByb2xlIGlkZW50aWZpZXIKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM1NwogICAgLy8gc2VsZi5vYnNlcnZlciwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAyNSAvLyAweDUyM2E0ZDRmNDMyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM1Ni0zNTgKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLm9ic2VydmVyLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTkKICAgIC8vIHJldHVybiBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV80QDY6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzUyCiAgICAvLyBzZWxmLmF1dGhvcml0eSwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAyMSAvLyAweDUyM2E0MTU1NTQyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM1MS0zNTMKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLmF1dGhvcml0eSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzU0CiAgICAvLyByZXR1cm4gc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8zQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzQ3CiAgICAvLyBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMzIgLy8gMHg1MjNhNTQ1MjUzMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNDYtMzQ4CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNDkKICAgIC8vIHJldHVybiBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8yQDQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzQyCiAgICAvLyBzZWxmLnByaW1hcnlfZGVhbGVyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDIyIC8vIDB4NTIzYTUwNTk0NDIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzQxLTM0MwogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM0NAogICAgLy8gcmV0dXJuIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8xQDM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzM3CiAgICAvLyBzZWxmLmFjY291bnRfbWFuYWdlciwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAyMyAvLyAweDUyM2E0ZDRlNDcyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMzNi0zMzgKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLmFjY291bnRfbWFuYWdlciwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzM5CiAgICAvLyByZXR1cm4gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8wQDI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzMyLTMzNAogICAgLy8gcmV0dXJuIHR5cC5Sb2xlVmFsaWRpdHkoCiAgICAvLyAgICAgcm9sZV92YWxpZGl0eV9zdGFydD1VSW50NjQoMCksIHJvbGVfdmFsaWRpdHlfZW5kPVVJbnQ2NCgwKQogICAgLy8gKQogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQoaG9sZGluZ19hZGRyZXNzOiBieXRlcykgLT4gdm9pZDoKX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQ6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjYKICAgIC8vIGRlZiBfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChzZWxmLCBob2xkaW5nX2FkZHJlc3M6IEFjY291bnQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyOAogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQsIGVyci5TVVNQRU5ERUQKICAgIGJ5dGVjIDggLy8gMHg0MTIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHB1c2hpbnQgMzg0CiAgICBnZXRiaXQKICAgICEKICAgIGFzc2VydCAvLyBTdXNwZW5kZWQgb3BlcmF0aW9ucwogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuX3NldHRsZV9wb3NpdGlvbihob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB1aW50NjQsIHVpbnQ2NDoKX3NldHRsZV9wb3NpdGlvbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo0NAogICAgLy8gZGVmIF9zZXR0bGVfcG9zaXRpb24oc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50KSAtPiB0dXBsZVtVSW50NjQsIFVJbnQ2NF06CiAgICBwcm90byAxIDIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo2MQogICAgLy8gcG9zaXRpb24gPSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jb3B5KCkKICAgIGR1cAogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NjMtNjUKICAgIC8vICMgQ29tcHV0ZSB0aGUgaW5jcmVtZW50YWwgcGVyLXVuaXQgZml4ZWQtcG9pbnQgaW50ZXJlc3QgYW5kIHByaW5jaXBhbCBhY2NydWVkCiAgICAvLyAjIHNpbmNlIHRoaXMgYWNjb3VudCdzIGxhc3QgY2hlY2twb2ludC4KICAgIC8vIGludGVyZXN0X2RlbHRhID0gc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IC0gcG9zaXRpb24uaW50ZXJlc3RfY2hlY2twb2ludAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggZXhpc3RzCiAgICBkaWcgMQogICAgcHVzaGludCA1NwogICAgZXh0cmFjdF91aW50NjQKICAgIC0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo2NwogICAgLy8gc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCAtIHBvc2l0aW9uLnByaW5jaXBhbF9jaGVja3BvaW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTcgLy8gImN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IGV4aXN0cwogICAgZGlnIDIKICAgIHB1c2hpbnQgNjUKICAgIGV4dHJhY3RfdWludDY0CiAgICAtCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzMKICAgIC8vIGludGVyZXN0X2RlbHRhLCBwb3NpdGlvbi51bml0cywgc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgZGlnIDIKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3MC03NAogICAgLy8gIyBDb252ZXJ0IHRoZSBwZXItdW5pdCBmaXhlZC1wb2ludCBkZWx0YXMgaW50byBhYnNvbHV0ZSBjbGFpbWFibGUgYW1vdW50cwogICAgLy8gIyB1c2luZyB0aGUgYWNjb3VudCdzIGFjdGl2ZSB1bml0cy4KICAgIC8vIGNsYWltYWJsZV9pbnRlcmVzdCA9IHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIGludGVyZXN0X2RlbHRhLCBwb3NpdGlvbi51bml0cywgc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgLy8gKQogICAgdW5jb3ZlciAzCiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojc2CiAgICAvLyBwcmluY2lwYWxfZGVsdGEsIHBvc2l0aW9uLnVuaXRzLCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzUtNzcKICAgIC8vIGNsYWltYWJsZV9wcmluY2lwYWwgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBwcmluY2lwYWxfZGVsdGEsIHBvc2l0aW9uLnVuaXRzLCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICAvLyApCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojc5LTgxCiAgICAvLyAjIEFjY3J1ZSB0aGUgY2xhaW1hYmxlIGFtb3VudHMgdG8gdGhlIGFjY291bnQgcG9zaXRpb24gYW5kIG1ha2UgdGhlbSBhdmFpbGFibGUKICAgIC8vICMgZm9yIHdpdGhkcmF3YWwuCiAgICAvLyBwb3NpdGlvbi5jbGFpbWFibGVfaW50ZXJlc3QgKz0gY2xhaW1hYmxlX2ludGVyZXN0CiAgICBkaWcgMgogICAgcHVzaGludCA3MwogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICArCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIHN3YXAKICAgIHJlcGxhY2UyIDczCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6ODIKICAgIC8vIHBvc2l0aW9uLmNsYWltYWJsZV9wcmluY2lwYWwgKz0gY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgZHVwCiAgICBwdXNoaW50IDgxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDIKICAgICsKICAgIGl0b2IKICAgIHJlcGxhY2UyIDgxCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6ODQtODYKICAgIC8vICMgQWR2YW5jZSB0aGUgYWNjb3VudCdzIHBlci11bml0IGZpeGVkLXBvaW50IGNoZWNrcG9pbnRzIHRvIHRoZSBjdXJyZW50IGdsb2JhbAogICAgLy8gIyBwZXItdW5pdCBmaXhlZC1wb2ludCBnbG9iYWwgaW5kaWNlcy4KICAgIC8vIHBvc2l0aW9uLmludGVyZXN0X2NoZWNrcG9pbnQgPSBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IGV4aXN0cwogICAgaXRvYgogICAgcmVwbGFjZTIgNTcKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo4NwogICAgLy8gcG9zaXRpb24ucHJpbmNpcGFsX2NoZWNrcG9pbnQgPSBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTcgLy8gImN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IGV4aXN0cwogICAgaXRvYgogICAgcmVwbGFjZTIgNjUKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo4OS05MAogICAgLy8gIyBBZHZhbmNlIHRoZSBhY2NvdW50J3MgZXZlbnQgY3Vyc29yIHRvIHRoZSBjdXJyZW50IGdsb2JhbCBldmVudCBjdXJzb3IuCiAgICAvLyBwb3NpdGlvbi5zZXR0bGVkX2N1cnNvciA9IHNlbGYuZXZlbnRfY3Vyc29yCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGl0b2IKICAgIHJlcGxhY2UyIDQ5CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6OTItOTQKICAgIC8vICMgVXBkYXRlIHRoZSBhY2NvdW50IHBvc2l0aW9uIGFuZCByZXR1cm4gdGhlIG5ld2x5IGFjY3J1ZWQgY2xhaW1hYmxlIGFtb3VudHMKICAgIC8vICMgYWRkZWQgdG8gdGhlIHRvdGFsIHBvc2l0aW9uJ3MgY2xhaW1hYmxlIGFtb3VudHMuCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHBvc2l0aW9uLmNvcHkoKQogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6OTUKICAgIC8vIHJldHVybiBjbGFpbWFibGVfaW50ZXJlc3QsIGNsYWltYWJsZV9wcmluY2lwYWwKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IHZvaWQ6Cl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojk3CiAgICAvLyBkZWYgX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQoc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg0MTIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwMAogICAgLy8gaWYgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCk6CiAgICBieiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZF9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDEKICAgIC8vIHJldHVybgogICAgcmV0c3ViCgpfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZF9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTAzCiAgICAvLyBwb3NpdGlvbiA9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNvcHkoKQogICAgZnJhbWVfZGlnIDIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwNAogICAgLy8gaWYgcG9zaXRpb24ucmVzZXJ2ZWRfdW5pdHMgPT0gVUludDY0KDApOgogICAgcHVzaGludCA0MAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICBibnogX2Vuc3VyZV91bml0c19hY3RpdmF0ZWRfYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA1CiAgICAvLyByZXR1cm4KICAgIHJldHN1YgoKX2Vuc3VyZV91bml0c19hY3RpdmF0ZWRfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwOAogICAgLy8gcG9zaXRpb24udW5pdHMgKz0gYWN0aXZhdGVkX3VuaXRzCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAzCiAgICArCiAgICBpdG9iCiAgICByZXBsYWNlMiAzMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwOQogICAgLy8gcG9zaXRpb24ucmVzZXJ2ZWRfdW5pdHMgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBpdG9iCiAgICByZXBsYWNlMiA0MAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExMAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSBwb3NpdGlvbi5jb3B5KCkKICAgIGZyYW1lX2RpZyAyCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTExCiAgICAvLyBhc3NlcnQgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCA+PSBhY3RpdmF0ZWRfdW5pdHMsIGVyci5PVkVSX0RJU1RSSUJVVElPTgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCBleGlzdHMKICAgIGR1cAogICAgZGlnIDIKICAgID49CiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IHJlbWFpbmluZyBELUFTQSB1bml0cwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExMgogICAgLy8gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCAtPSBhY3RpdmF0ZWRfdW5pdHMKICAgIHN3YXAKICAgIC0KICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fc2NhbGVkX211bF9kaXYobXVsdGlwbGljYW5kOiB1aW50NjQsIG11bHRpcGxpZXI6IHVpbnQ2NCwgZGl2aXNvcjogdWludDY0KSAtPiB1aW50NjQ6Cl9zY2FsZWRfbXVsX2RpdjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE1My0xNTUKICAgIC8vIGRlZiBfc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgc2VsZiwgbXVsdGlwbGljYW5kOiBVSW50NjQsIG11bHRpcGxpZXI6IFVJbnQ2NCwgZGl2aXNvcjogVUludDY0CiAgICAvLyApIC0+IFVJbnQ2NDoKICAgIHByb3RvIDMgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTU3CiAgICAvLyBpZiBtdWx0aXBsaWNhbmQgPT0gVUludDY0KDApIG9yIG11bHRpcGxpZXIgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0zCiAgICBieiBfc2NhbGVkX211bF9kaXZfaWZfYm9keUAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGJueiBfc2NhbGVkX211bF9kaXZfYWZ0ZXJfaWZfZWxzZUAzCgpfc2NhbGVkX211bF9kaXZfaWZfYm9keUAyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTU4CiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfc2NhbGVkX211bF9kaXZfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTU5CiAgICAvLyBoaWdoLCBsb3cgPSBvcC5tdWx3KG11bHRpcGxpY2FuZCwgbXVsdGlwbGllcikKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0yCiAgICBtdWx3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjAKICAgIC8vIHJldHVybiBvcC5kaXZ3KGhpZ2gsIGxvdywgZGl2aXNvcikKICAgIGZyYW1lX2RpZyAtMQogICAgZGl2dwogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Ftb3VudF90b19pbmRleF9kZWx0YShhbW91bnQ6IHVpbnQ2NCkgLT4gdWludDY0OgpfYW1vdW50X3RvX2luZGV4X2RlbHRhOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTYyCiAgICAvLyBkZWYgX2Ftb3VudF90b19pbmRleF9kZWx0YShzZWxmLCBhbW91bnQ6IFVJbnQ2NCkgLT4gVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjQKICAgIC8vIGlmIGFtb3VudCA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGJueiBfYW1vdW50X3RvX2luZGV4X2RlbHRhX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTY1CiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfYW1vdW50X3RvX2luZGV4X2RlbHRhX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2NgogICAgLy8gYXNzZXJ0IHNlbGYudG90YWxfdW5pdHMgPiBVSW50NjQoMCksIGVyci5OT19VTklUUwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIGR1cAogICAgYXNzZXJ0IC8vIE5vIEQtQVNBIHVuaXRzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjcKICAgIC8vIHJldHVybiBzZWxmLl9zY2FsZWRfbXVsX2RpdihhbW91bnQsIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsIHNlbGYudG90YWxfdW5pdHMpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9pbmRleF9kZWx0YV90b19hbW91bnQoaW5kZXhfZGVsdGE6IHVpbnQ2NCkgLT4gdWludDY0OgpfaW5kZXhfZGVsdGFfdG9fYW1vdW50OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTY5CiAgICAvLyBkZWYgX2luZGV4X2RlbHRhX3RvX2Ftb3VudChzZWxmLCBpbmRleF9kZWx0YTogVUludDY0KSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE3NgogICAgLy8gaWYgaW5kZXhfZGVsdGEgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0xCiAgICBibnogX2luZGV4X2RlbHRhX3RvX2Ftb3VudF9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE3NwogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKX2luZGV4X2RlbHRhX3RvX2Ftb3VudF9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNzkKICAgIC8vIHNlbGYudG90YWxfdW5pdHMsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTgxCiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTc4LTE4MgogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIHNlbGYudG90YWxfdW5pdHMsCiAgICAvLyAgICAgaW5kZXhfZGVsdGEsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9nZXRfc2NoZWR1bGVfZW50cnkoZXZlbnRfaWQ6IHVpbnQ2NCkgLT4gYnl0ZXM6Cl9nZXRfc2NoZWR1bGVfZW50cnk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMDIKICAgIC8vIGRlZiBfZ2V0X3NjaGVkdWxlX2VudHJ5KHNlbGYsIGV2ZW50X2lkOiBVSW50NjQpIC0+IHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5OgogICAgcHJvdG8gMSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMDQKICAgIC8vIGFzc2VydCBldmVudF9pZCA8IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQsIGVyci5JTlZBTElEX0VWRU5UX0lECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgID4KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxOTAKICAgIC8vIHJldHVybiBldmVudF9pZCAvLyBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAxNgogICAgLwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjA2CiAgICAvLyBhc3NlcnQgcGFnZV9pbmRleCBpbiBzZWxmLnNjaGVkdWxlX3BhZ2UsIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGl0b2IKICAgIGJ5dGVjIDI0IC8vIDB4NTMyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTk0CiAgICAvLyByZXR1cm4gZXZlbnRfaWQgJSBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAxNgogICAgJQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjA5CiAgICAvLyBhc3NlcnQgb2Zmc2V0IDwgcGFnZS5sZW5ndGgsIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGludCAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZGlnIDEKICAgID4KICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIxMAogICAgLy8gcmV0dXJuIHBhZ2Vbb2Zmc2V0XS5jb3B5KCkKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgMgogICAgKwogICAgcHVzaGludCA2NQogICAgYm94X2V4dHJhY3QKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZShjb250cmFjdF90eXBlOiB1aW50NjQsIGV2ZW50X3R5cGU6IHVpbnQ2NCkgLT4gdm9pZDoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzEzLTMxNQogICAgLy8gZGVmIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBzZWxmLCBjb250cmFjdF90eXBlOiBVSW50NjQsIGV2ZW50X3R5cGU6IFVJbnQ2NAogICAgLy8gKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjQ3CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lFRCksCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU0LTI1NQogICAgLy8gIyBDaGVjayBjb21tb24gZXZlbnRzIGZpcnN0CiAgICAvLyBpZiBldmVudF90eXBlIGluIGNvbW1vbl9ldmVudHM6CiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjQ4CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQKSwKICAgIGludGNfMiAvLyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNDkKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfTUQpLAogICAgcHVzaGludCAxOQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU0LTI1NQogICAgLy8gIyBDaGVjayBjb21tb24gZXZlbnRzIGZpcnN0CiAgICAvLyBpZiBldmVudF90eXBlIGluIGNvbW1vbl9ldmVudHM6CiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjUwCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIHB1c2hpbnQgMTIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1MQogICAgLy8gVUludDY0KGVudW1zLkVWVF9SUkYpLAogICAgcHVzaGludCAxMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU0LTI1NQogICAgLy8gIyBDaGVjayBjb21tb24gZXZlbnRzIGZpcnN0CiAgICAvLyBpZiBldmVudF90eXBlIGluIGNvbW1vbl9ldmVudHM6CiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VANwoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1NgogICAgLy8gcmV0dXJuIFRydWUKICAgIGludGNfMSAvLyAxCgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgcmV0c3ViCgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU4LTI1OQogICAgLy8gIyBDb250cmFjdC1zcGVjaWZpYyBhZGRpdGlvbmFsIGV2ZW50cwogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfUEFNKToKICAgIGZyYW1lX2RpZyAtMgogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2MC0yNjEKICAgIC8vICMgUEFNIG9ubHkgc3VwcG9ydHMgY29tbW9uIGV2ZW50cwogICAgLy8gcmV0dXJuIEZhbHNlCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjYzCiAgICAvLyBpZiBjb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9MQU0pIG9yIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDMKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNjMtMjY1CiAgICAvLyBpZiBjb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9MQU0pIG9yIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KAogICAgLy8gICAgIGVudW1zLkNUX05BTQogICAgLy8gKToKICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUAxMQogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDIKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAxNgoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlAMTE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNjYtMjcwCiAgICAvLyAjIExBTS9OQU0gYWRkOiBQUiwgSVBDQgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2OAogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUiksCiAgICBwdXNoaW50IDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2Ni0yNzAKICAgIC8vICMgTEFNL05BTSBhZGQ6IFBSLCBJUENCCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAxMwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNjkKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICBwdXNoaW50IDE4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNjYtMjcwCiAgICAvLyAjIExBTS9OQU0gYWRkOiBQUiwgSVBDQgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyApCiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMTQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMTM6CiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF9mYWxzZUAxNDoKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDE2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjcyCiAgICAvLyBpZiBjb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pOgogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDIzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzMtMjc4CiAgICAvLyAjIEFOTiBhZGRzOiBQUiwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3NQogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUiksCiAgICBwdXNoaW50IDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3My0yNzgKICAgIC8vICMgQU5OIGFkZHM6IFBSLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyMAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzYKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICBwdXNoaW50IDE4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzMtMjc4CiAgICAvLyAjIEFOTiBhZGRzOiBQUiwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjAKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjc3CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICBwdXNoaW50IDUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3My0yNzgKICAgIC8vICMgQU5OIGFkZHM6IFBSLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF9mYWxzZUAyMQoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyMDoKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDIxOgogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMjM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODAKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0xBWCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDMxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODEtMjg3CiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODMKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODEtMjg3CiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDI4CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4NAogICAgLy8gVUludDY0KGVudW1zLkVWVF9QSSksCiAgICBwdXNoaW50IDQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MS0yODcKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjgKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjg1CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgcHVzaGludCAxOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjgxLTI4NwogICAgLy8gIyBMQVggYWRkczogUFIsIFBJLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyOAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODYKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIHB1c2hpbnQgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjgxLTI4NwogICAgLy8gIyBMQVggYWRkczogUFIsIFBJLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF9mYWxzZUAyOQoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyODoKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDI5OgogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMzE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODkKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0NMTSk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDMzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyOTAtMjkxCiAgICAvLyAjIENMTSBhZGRzOiBQUgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QUikKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAzCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAzMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI5MwogICAgLy8gcmV0dXJuIEZhbHNlCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2lzX2R5bmFtaWNfYW5udWl0eSgpIC0+IHVpbnQ2NDoKX2lzX2R5bmFtaWNfYW5udWl0eToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMzNQogICAgLy8gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM1LTMzNgogICAgLy8gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICAvLyBhbmQgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBieiBfaXNfZHluYW1pY19hbm51aXR5X2Jvb2xfZmFsc2VAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM2CiAgICAvLyBhbmQgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzQgLy8gImR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMzNS0zMzYKICAgIC8vIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKQogICAgLy8gYW5kIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgYnogX2lzX2R5bmFtaWNfYW5udWl0eV9ib29sX2ZhbHNlQDMKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzQtMzM3CiAgICAvLyByZXR1cm4gKAogICAgLy8gICAgIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKQogICAgLy8gICAgIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIC8vICkKICAgIHJldHN1YgoKX2lzX2R5bmFtaWNfYW5udWl0eV9ib29sX2ZhbHNlQDM6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM0LTMzNwogICAgLy8gcmV0dXJuICgKICAgIC8vICAgICBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIC8vICAgICBhbmQgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICAvLyApCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfaW50ZXJlc3Rfc2VnbWVudChlbnRyeTogYnl0ZXMpIC0+IHVpbnQ2NCwgYnl0ZXM6Cl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzgwCiAgICAvLyBkZWYgX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoc2VsZiwgZW50cnk6IHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM4OQogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMTcKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM4OS0zOTEKICAgIC8vIGVudHJ5LmFjY3J1YWxfZmFjdG9yID09IFVJbnQ2NCgwKQogICAgLy8gb3Igc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPT0gVUludDY0KDApCiAgICBieiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudF9pZl9ib2R5QDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5MAogICAgLy8gb3Igc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPT0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM4OS0zOTEKICAgIC8vIGVudHJ5LmFjY3J1YWxfZmFjdG9yID09IFVJbnQ2NCgwKQogICAgLy8gb3Igc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPT0gVUludDY0KDApCiAgICBieiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudF9pZl9ib2R5QDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5MQogICAgLy8gb3Igc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID09IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM4OS0zOTEKICAgIC8vIGVudHJ5LmFjY3J1YWxfZmFjdG9yID09IFVJbnQ2NCgwKQogICAgLy8gb3Igc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPT0gVUludDY0KDApCiAgICBibnogX2VudHJ5X2ludGVyZXN0X3NlZ21lbnRfYWZ0ZXJfaWZfZWxzZUA0CgpfZW50cnlfaW50ZXJlc3Rfc2VnbWVudF9pZl9ib2R5QDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozOTMKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9kaWcgLTEKICAgIHVuY292ZXIgMgogICAgcmV0c3ViCgpfZW50cnlfaW50ZXJlc3Rfc2VnbWVudF9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozOTUKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozOTYKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozOTcKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozOTQtMzk4CiAgICAvLyBhY2NydWVkID0gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlLAogICAgLy8gICAgIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICAvLyApCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDAyCiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzk5LTQwMwogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIGFjY3J1ZWQsCiAgICAvLyAgICAgZW50cnkuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgZnJhbWVfZGlnIC0xCiAgICB1bmNvdmVyIDIKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcihkaXNjb3VudF9mYWN0b3I6IHVpbnQ2NCwgcmVkZW1wdGlvbl9mYWN0b3I6IHVpbnQ2NCkgLT4gdWludDY0OgpfZGlzY291bnRfYW5udWl0eV9mYWN0b3I6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NjItNDY2CiAgICAvLyBkZWYgX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yKAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgZGlzY291bnRfZmFjdG9yOiBVSW50NjQsCiAgICAvLyAgICAgcmVkZW1wdGlvbl9mYWN0b3I6IFVJbnQ2NCwKICAgIC8vICkgLT4gVUludDY0OgogICAgcHJvdG8gMiAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NjgKICAgIC8vIGlmIHJlZGVtcHRpb25fZmFjdG9yID09IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMQogICAgYm56IF9kaXNjb3VudF9hbm51aXR5X2ZhY3Rvcl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ2OQogICAgLy8gcmV0dXJuIGRpc2NvdW50X2ZhY3RvcgogICAgZnJhbWVfZGlnIC0yCiAgICByZXRzdWIKCl9kaXNjb3VudF9hbm51aXR5X2ZhY3Rvcl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzAKICAgIC8vIHBlcmlvZF9yYXRlID0gc2VsZi5maXhlZF9wb2ludF9zY2FsZSArIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDcxCiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDcwLTQ3NAogICAgLy8gcGVyaW9kX3JhdGUgPSBzZWxmLmZpeGVkX3BvaW50X3NjYWxlICsgc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgcmVkZW1wdGlvbl9mYWN0b3IsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgZGlnIDIKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICArCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzUKICAgIC8vIGFzc2VydCBwZXJpb2RfcmF0ZSA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBkdXAKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3OAogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3Ni00ODAKICAgIC8vIHJldHVybiBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBkaXNjb3VudF9mYWN0b3IsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICAgICBwZXJpb2RfcmF0ZSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5KGVudHJ5OiBieXRlcywgcGF5bG9hZDogYnl0ZXMpIC0+IGJ5dGVzLCBieXRlczoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjEzLTYxNQogICAgLy8gZGVmIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeSgKICAgIC8vICAgICBzZWxmLCBlbnRyeTogdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnksIHBheWxvYWQ6IHR5cC5PYnNlcnZlZEV2ZW50UmVxdWVzdAogICAgLy8gKSAtPiBOb25lOgogICAgcHJvdG8gMiAyCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYyMwogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X2lkID09IHNlbGYuZXZlbnRfY3Vyc29yLCBlcnIuSU5WQUxJRF9FVkVOVF9DVVJTT1IKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBjdXJzb3IKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYyNAogICAgLy8gYXNzZXJ0IGVudHJ5LnNjaGVkdWxlZF90aW1lIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLCBlcnIuTk9fRFVFX0NBU0hGTE9XCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIDw9CiAgICBhc3NlcnQgLy8gTm8gZHVlIGNhc2hmbG93IHRvIHBheQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjI2CiAgICAvLyBldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MjcKICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9JRUQpOgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBkdXAKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MjgtNjMwCiAgICAvLyAjIElFRCBmaW5hbGl6ZXMgaXNzdWFuY2U6IHJlc2VydmVkIHVuaXRzIGJlY29tZSBhY3RpdmF0YWJsZSBhbmQgdGhlCiAgICAvLyAjIHNjaGVkdWxlJ3MgaW5pdGlhbCBjb250cmFjdHVhbCBzdGF0ZSBiZWNvbWVzIGxpdmUuCiAgICAvLyBhc3NlcnQgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjMyCiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID09IHNlbGYudG90YWxfdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYzMS02MzMKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCA9PSBzZWxmLnRvdGFsX3VuaXRzCiAgICAvLyApLCBlcnIuUFJJTUFSWV9ESVNUUklCVVRJT05fSU5DT01QTEVURQogICAgYXNzZXJ0IC8vIFByaW1hcnkgZGlzdHJpYnV0aW9uIGlzIG5vdCBjb21wbGV0ZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM0CiAgICAvLyBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9IGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYzNQogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM2CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IGVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM3CiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYzOAogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gZW50cnkubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDQxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM5CiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NDAKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGVudW1zLlNUQVRVU19BQ1RJVkUpCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBwdXNoaW50IDEwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ1MQogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkgPT0gVUludDY0KGVudW1zLkVWVF9JRUQpLCBlcnIuTk9UX0VWVF9JRUQKICAgIGZyYW1lX2RpZyAxMQogICAgYXNzZXJ0IC8vIE5vdCBJRUQgZXZlbnQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ1MgogICAgLy8gcmV0dXJuIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMCAvLyAiaW5pdGlhbF9leGNoYW5nZV9hbW91bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NDEtNjQ1CiAgICAvLyBzZWxmLl9lbWl0X2V4ZWN1dGlvbl9ldmVudCgKICAgIC8vICAgICBlbnRyeT1lbnRyeSwKICAgIC8vICAgICBwYXlvZmY9c2VsZi5fZW50cnlfaWVkX2Ftb3VudChlbnRyeSksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NDQKICAgIC8vIHNldHRsZWRfYW1vdW50PVVJbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NDEtNjQ1CiAgICAvLyBzZWxmLl9lbWl0X2V4ZWN1dGlvbl9ldmVudCgKICAgIC8vICAgICBlbnRyeT1lbnRyeSwKICAgIC8vICAgICBwYXlvZmY9c2VsZi5fZW50cnlfaWVkX2Ftb3VudChlbnRyeSksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgY2FsbHN1YiBfZW1pdF9leGVjdXRpb25fZXZlbnQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAtMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjQ2CiAgICAvLyByZXR1cm4KICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfYnVyeSAxCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDcKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NDkKICAgIC8vIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCArPSBzZWxmLl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KGVudHJ5KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudAogICAgZnJhbWVfYnVyeSAtMgogICAgKwogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NTEKICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9SUik6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgMTIKICAgID09CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDEwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NTUKICAgIC8vIHBheWxvYWQub2JzZXJ2ZWRfcmF0ZSwKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAzMwogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1NgogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzYgLy8gInJhdGVfcmVzZXRfbXVsdGlwbGllciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NTcKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NTItNjU4CiAgICAvLyAjIFJSIGRlcml2ZXMgdGhlIG5leHQgcmF0ZSBmcm9tIGFuIG9ic2VydmVkIG9yYWNsZSB2YWx1ZSBwbHVzIHRoZQogICAgLy8gIyBjb250cmFjdCBzcHJlYWQgLyBtdWx0aXBsaWVyIHRlcm1zLCB0aGVuIGVuZm9yY2VzIGZsb29yIGFuZCBjYXAuCiAgICAvLyBvYnNlcnZlZF9yYXRlID0gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgcGF5bG9hZC5vYnNlcnZlZF9yYXRlLAogICAgLy8gICAgIHNlbGYucmF0ZV9yZXNldF9tdWx0aXBsaWVyLAogICAgLy8gICAgIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICAvLyApCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjYwCiAgICAvLyBvYnNlcnZlZF9yYXRlICsgc2VsZi5yYXRlX3Jlc2V0X3NwcmVhZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDM1IC8vICJyYXRlX3Jlc2V0X3NwcmVhZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X3NwcmVhZCBleGlzdHMKICAgICsKICAgIGZyYW1lX2J1cnkgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzQxCiAgICAvLyBpZiBzZWxmLmhhc19yYXRlX3Jlc2V0X2Zsb29yIGFuZCByYXRlIDwgc2VsZi5yYXRlX3Jlc2V0X2Zsb29yOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDM4IC8vICJoYXNfcmF0ZV9yZXNldF9mbG9vciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5oYXNfcmF0ZV9yZXNldF9mbG9vciBleGlzdHMKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU1CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzAgLy8gInJhdGVfcmVzZXRfZmxvb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9mbG9vciBleGlzdHMKICAgIGZyYW1lX2RpZyA2CiAgICA+CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1NQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzQyCiAgICAvLyByYXRlID0gc2VsZi5yYXRlX3Jlc2V0X2Zsb29yCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzAgLy8gInJhdGVfcmVzZXRfZmxvb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSA2CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X2Zsb29yIGV4aXN0cwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDMKICAgIC8vIGlmIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwIGFuZCByYXRlID4gc2VsZi5yYXRlX3Jlc2V0X2NhcDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzOSAvLyAiaGFzX3JhdGVfcmVzZXRfY2FwIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmhhc19yYXRlX3Jlc2V0X2NhcCBleGlzdHMKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU4CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzEgLy8gInJhdGVfcmVzZXRfY2FwIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfY2FwIGV4aXN0cwogICAgZnJhbWVfZGlnIDYKICAgIDwKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDQKICAgIC8vIHJhdGUgPSBzZWxmLnJhdGVfcmVzZXRfY2FwCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzEgLy8gInJhdGVfcmVzZXRfY2FwIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgNgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9jYXAgZXhpc3RzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1ODoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1OQogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPSBzZWxmLl9jbGFtcF9yYXRlKAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjU5LTY2MQogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPSBzZWxmLl9jbGFtcF9yYXRlKAogICAgLy8gICAgIG9ic2VydmVkX3JhdGUgKyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkCiAgICAvLyApCiAgICBmcmFtZV9kaWcgNgogICAgYXBwX2dsb2JhbF9wdXQKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjcxCiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUEkpOgogICAgZnJhbWVfZGlnIDEwCiAgICBwdXNoaW50IDQKICAgID09CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDIwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzIKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjczCiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAyMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY3OAogICAgLy8gaWYgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCk6CiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMjkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY3OQogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1BSRik6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgNQogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDMwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODMKICAgIC8vICsgKHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgLSBzZWxmLmV2ZW50X2N1cnNvcikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njg0CiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfUEVSX0VOVFJZX0JVREdFVCkKICAgIHB1c2hpbnQgMTAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODMtNjg0CiAgICAvLyArIChzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IC0gc2VsZi5ldmVudF9jdXJzb3IpCiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfUEVSX0VOVFJZX0JVREdFVCkKICAgICoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4MgogICAgLy8gVUludDY0KGNzdC5PUF9VUF9OT05fQ0FTSF9CQVNFX0JVREdFVCkKICAgIGludGMgNCAvLyAxNTAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODItNjg0CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX05PTl9DQVNIX0JBU0VfQlVER0VUKQogICAgLy8gKyAoc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCAtIHNlbGYuZXZlbnRfY3Vyc29yKQogICAgLy8gKiBVSW50NjQoY3N0Lk9QX1VQX05PTl9DQVNIX1BFUl9FTlRSWV9CVURHRVQpCiAgICArCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODAtNjg2CiAgICAvLyBlbnN1cmVfYnVkZ2V0KAogICAgLy8gICAgIHJlcXVpcmVkX2J1ZGdldD0oCiAgICAvLyAgICAgICAgIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfQkFTRV9CVURHRVQpCiAgICAvLyAgICAgICAgICsgKHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgLSBzZWxmLmV2ZW50X2N1cnNvcikKICAgIC8vICAgICAgICAgKiBVSW50NjQoY3N0Lk9QX1VQX05PTl9DQVNIX1BFUl9FTlRSWV9CVURHRVQpCiAgICAvLyAgICAgKSwKICAgIC8vICkKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5MAogICAgLy8gZGlzY291bnRfZmFjdG9yID0gc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0OTEKICAgIC8vIGRlbm9taW5hdG9yID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0OTIKICAgIC8vIHNraXBfZmlyc3RfcmVkZW1wdGlvbiA9IEZhbHNlCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSA3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0OTQKICAgIC8vIGlmIGVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IgPiBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMjUKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgOAogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMzUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5NS00OTkKICAgIC8vICMgQW4gaW5pdGlhbCBQUkYgbWF5IGRlc2NyaWJlIHRoZSBmaXJzdCByZWRlbXB0aW9uIHBlcmlvZCBkaXJlY3RseS4KICAgIC8vIGRpc2NvdW50X2ZhY3RvciA9IHNlbGYuX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yKAogICAgLy8gICAgIGRpc2NvdW50X2ZhY3RvciwKICAgIC8vICAgICBlbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyA4CiAgICBjYWxsc3ViIF9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwMQogICAgLy8gc2tpcF9maXJzdF9yZWRlbXB0aW9uID0gVHJ1ZQogICAgaW50Y18xIC8vIDEKICAgIGZyYW1lX2J1cnkgNwogICAgZnJhbWVfYnVyeSAxCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAzNToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwMwogICAgLy8gZnV0dXJlX2V2ZW50X2lkID0gc2VsZi5ldmVudF9jdXJzb3IgKyBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X3doaWxlX3RvcEAzNjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwNAogICAgLy8gd2hpbGUgZnV0dXJlX2V2ZW50X2lkIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGZyYW1lX2RpZyAzCiAgICA+CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfd2hpbGVANDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwNQogICAgLy8gZnV0dXJlX2VudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KGZ1dHVyZV9ldmVudF9pZCkKICAgIGZyYW1lX2RpZyAzCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MDYKICAgIC8vIGZ1dHVyZV9ldmVudF90eXBlID0gZnV0dXJlX2VudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA3LTUwOAogICAgLy8gIyBPbmx5IHJlZGVtcHRpb24tYmVhcmluZyBldmVudHMgY29udHJpYnV0ZSB0byB0aGUgYW5udWl0eSBkZW5vbWluYXRvci4KICAgIC8vIGlzX3JlZGVtcHRpb25fZXZlbnQgPSBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1BSKSBvciAoCiAgICBwdXNoaW50IDMKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MDctNTExCiAgICAvLyAjIE9ubHkgcmVkZW1wdGlvbi1iZWFyaW5nIGV2ZW50cyBjb250cmlidXRlIHRvIHRoZSBhbm51aXR5IGRlbm9taW5hdG9yLgogICAgLy8gaXNfcmVkZW1wdGlvbl9ldmVudCA9IGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpIG9yICgKICAgIC8vICAgICBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgLy8gICAgIGFuZCBmdXR1cmVfZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKQogICAgLy8gKQogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX3RydWVANDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwOQogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCkKICAgIGZyYW1lX2RpZyA0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA5LTUxMAogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCkKICAgIC8vIGFuZCBmdXR1cmVfZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUxMAogICAgLy8gYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICBmcmFtZV9kaWcgMAogICAgcHVzaGludCAyNQogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwOS01MTAKICAgIC8vIGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfTUQpCiAgICAvLyBhbmQgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IgPiBVSW50NjQoMCkKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX2ZhbHNlQDQxCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF90cnVlQDQwOgogICAgaW50Y18xIC8vIDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX21lcmdlQDQyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTEyCiAgICAvLyBpZiBpc19yZWRlbXB0aW9uX2V2ZW50OgogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANDcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUxMwogICAgLy8gaWYgc2tpcF9maXJzdF9yZWRlbXB0aW9uOgogICAgZnJhbWVfZGlnIDcKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlANDUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUxNAogICAgLy8gc2tpcF9maXJzdF9yZWRlbXB0aW9uID0gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDcKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDQ3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTIxCiAgICAvLyBmdXR1cmVfZXZlbnRfaWQgKz0gVUludDY0KDEpCiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMwogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfd2hpbGVfdG9wQDM2CgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDQ1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTE4CiAgICAvLyBmdXR1cmVfZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIGZyYW1lX2RpZyAwCiAgICBwdXNoaW50IDI1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTE2LTUxOQogICAgLy8gZGlzY291bnRfZmFjdG9yID0gc2VsZi5fZGlzY291bnRfYW5udWl0eV9mYWN0b3IoCiAgICAvLyAgICAgZGlzY291bnRfZmFjdG9yLAogICAgLy8gICAgIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDIKICAgIHN3YXAKICAgIGNhbGxzdWIgX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTIwCiAgICAvLyBkZW5vbWluYXRvciArPSBkaXNjb3VudF9mYWN0b3IKICAgIGZyYW1lX2RpZyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANDcKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX2ZhbHNlQDQxOgogICAgaW50Y18wIC8vIDAKICAgIGIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfbWVyZ2VANDIKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl93aGlsZUA0ODoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUyMwogICAgLy8gYXNzZXJ0IGRlbm9taW5hdG9yID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGZyYW1lX2RpZyAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjQKICAgIC8vIG51bWVyYXRvciA9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUyNQogICAgLy8gaWYgZW50cnkuZmxhZ3MgJiBVSW50NjQoZW51bXMuRkxBR19JTklUSUFMX1BSRikgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDU3CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18yIC8vIDgKICAgICYKICAgIGJueiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1MAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTI2LTUyNwogICAgLy8gIyBTdWJzZXF1ZW50IFBSRiBldmVudHMgYW1vcnRpemUgYm90aCBwcmluY2lwYWwgYW5kIGFscmVhZHkgYWNjcnVlZCBjYXJyeS4KICAgIC8vIG51bWVyYXRvciArPSBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICArCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1MDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUzMAogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUyOC01MzIKICAgIC8vIHJldHVybiBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBudW1lcmF0b3IsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICAgICBkZW5vbWluYXRvciwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAxCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njg3CiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBzZWxmLl9yZWNhbGN1bGF0ZV9hbm51aXR5X3BheW1lbnQoCiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4Ny02ODkKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IHNlbGYuX3JlY2FsY3VsYXRlX2FubnVpdHlfcGF5bWVudCgKICAgIC8vICAgICBlbnRyeQogICAgLy8gKQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDMwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjkyCiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OTMtNjk3CiAgICAvLyBzZWxmLl9lbWl0X2V4ZWN1dGlvbl9ldmVudCgKICAgIC8vICAgICBlbnRyeT1lbnRyeSwKICAgIC8vICAgICBwYXlvZmY9VUludDY0KDApLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njk1CiAgICAvLyBwYXlvZmY9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY5NgogICAgLy8gc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OTMtNjk3CiAgICAvLyBzZWxmLl9lbWl0X2V4ZWN1dGlvbl9ldmVudCgKICAgIC8vICAgICBlbnRyeT1lbnRyeSwKICAgIC8vICAgICBwYXlvZmY9VUludDY0KDApLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGNhbGxzdWIgX2VtaXRfZXhlY3V0aW9uX2V2ZW50CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfYnVyeSAxCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAyOToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY5MQogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gZW50cnkubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDQxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAzMAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAyMDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY3NAogICAgLy8gZWxpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfSVBDQik6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgMTgKICAgID09CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAyMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc1LTY3NgogICAgLy8gIyBJUENCIGtlZXBzIHByaW5jaXBhbCB1bmNoYW5nZWQgYW5kIG9ubHkgcmVzZXRzIHRoZSBpbnRlcmVzdCBiYXNlLgogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDIzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDEwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjYyCiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9SUkYpOgogICAgZnJhbWVfZGlnIDEwCiAgICBwdXNoaW50IDExCiAgICA9PQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAxNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjYzCiAgICAvLyBuZXh0X3JhdGUgPSBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZQogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2NAogICAgLy8gaWYgbmV4dF9yYXRlID09IFVJbnQ2NCgwKToKICAgIGJueiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAxMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY1CiAgICAvLyBuZXh0X3JhdGUgPSBzZWxmLnJhdGVfcmVzZXRfbmV4dAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDM3IC8vICJyYXRlX3Jlc2V0X25leHQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSA1CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X25leHQgZXhpc3RzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2NgogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPSBuZXh0X3JhdGUKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGZyYW1lX2RpZyA1CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAxOAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAxNDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2OAogICAgLy8gaWYgZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUgIT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDkKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjkKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGZyYW1lX2RpZyA5CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAxOAoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbWl0X2V4ZWN1dGlvbl9ldmVudChlbnRyeTogYnl0ZXMsIHBheW9mZjogdWludDY0LCBzZXR0bGVkX2Ftb3VudDogdWludDY0KSAtPiBieXRlczoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzAzLTcwOQogICAgLy8gZGVmIF9lbWl0X2V4ZWN1dGlvbl9ldmVudCgKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgICosCiAgICAvLyAgICAgZW50cnk6IHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5LAogICAgLy8gICAgIHBheW9mZjogVUludDY0LAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50OiBVSW50NjQsCiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAzIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxMwogICAgLy8gY29udHJhY3RfaWQ9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25faWQuaWQsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uSUQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxNAogICAgLy8gZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE1CiAgICAvLyBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICBmcmFtZV9kaWcgLTMKICAgIGV4dHJhY3QgOCAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTYKICAgIC8vIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgZnJhbWVfZGlnIC0zCiAgICBleHRyYWN0IDkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE3CiAgICAvLyBhcHBsaWVkX2F0PUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIwCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBmcmFtZV9kaWcgLTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxNQogICAgLy8gZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgaW50Y18yIC8vIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcyMAogICAgLy8gc2VsZi5fcGF5b2ZmX3NpZ24oZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSwgcGF5b2ZmKQogICAgZ2V0Ynl0ZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzQ5CiAgICAvLyBpZiBwYXlvZmYgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0yCiAgICBibnogX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzUwCiAgICAvLyByZXR1cm4gVUludDY0KGVudW1zLlBBWU9GRl9TSUdOX1BPU0lUSVZFKQogICAgaW50Y18xIC8vIDEKCl9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9wYXlvZmZfc2lnbkA3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE5LTcyMQogICAgLy8gcGF5b2ZmX3NpZ249YXJjNC5VSW50OCgKICAgIC8vICAgICBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICAvLyApLAogICAgaXRvYgogICAgZHVwCiAgICBiaXRsZW4KICAgIGludGNfMiAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBleHRyYWN0IDcgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIzCiAgICAvLyBjdXJyZW5jeV9pZD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcyNAogICAgLy8gc2VxdWVuY2U9ZW50cnkuZXZlbnRfaWQgKyBVSW50NjQoMSksCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzEyLTcyNQogICAgLy8gRXhlY3V0aW9uRXZlbnQoCiAgICAvLyAgICAgY29udHJhY3RfaWQ9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25faWQuaWQsCiAgICAvLyAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgcGF5b2ZmPXBheW9mZiwKICAgIC8vICAgICBwYXlvZmZfc2lnbj1hcmM0LlVJbnQ4KAogICAgLy8gICAgICAgICBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBzZXR0bGVkX2Ftb3VudD1zZXR0bGVkX2Ftb3VudCwKICAgIC8vICAgICBjdXJyZW5jeV9pZD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgc2VxdWVuY2U9ZW50cnkuZXZlbnRfaWQgKyBVSW50NjQoMSksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMAogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAyCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAzCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyA0CiAgICBpdG9iCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMgogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxMS03MjYKICAgIC8vIGFyYzQuZW1pdCgKICAgIC8vICAgICBFeGVjdXRpb25FdmVudCgKICAgIC8vICAgICAgICAgY29udHJhY3RfaWQ9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25faWQuaWQsCiAgICAvLyAgICAgICAgIGV2ZW50X2lkPWVudHJ5LmV2ZW50X2lkLAogICAgLy8gICAgICAgICBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICAvLyAgICAgICAgIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgICAgICBhcHBsaWVkX2F0PUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gICAgICAgICBwYXlvZmY9cGF5b2ZmLAogICAgLy8gICAgICAgICBwYXlvZmZfc2lnbj1hcmM0LlVJbnQ4KAogICAgLy8gICAgICAgICAgICAgc2VsZi5fcGF5b2ZmX3NpZ24oZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSwgcGF5b2ZmKQogICAgLy8gICAgICAgICApLAogICAgLy8gICAgICAgICBzZXR0bGVkX2Ftb3VudD1zZXR0bGVkX2Ftb3VudCwKICAgIC8vICAgICAgICAgY3VycmVuY3lfaWQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgICAgICBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIC8vICAgICApCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHg5YTMzMmI5NSAvLyBtZXRob2QgIkV4ZWN1dGlvbkV2ZW50KHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NTEKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gKFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwgVUludDY0KGVudW1zLkVWVF9QSSkpOgogICAgZnJhbWVfZGlnIDUKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYm56IF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9pZl9ib2R5QDUKICAgIGZyYW1lX2RpZyA1CiAgICBwdXNoaW50IDQKICAgID09CiAgICBieiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUA2CgpfZW1pdF9leGVjdXRpb25fZXZlbnRfaWZfYm9keUA1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzUyCiAgICAvLyByZXR1cm4gVUludDY0KGVudW1zLlBBWU9GRl9TSUdOX1BPU0lUSVZFKQogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcyMAogICAgLy8gc2VsZi5fcGF5b2ZmX3NpZ24oZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSwgcGF5b2ZmKQogICAgYiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fcGF5b2ZmX3NpZ25ANwoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc1MwogICAgLy8gcmV0dXJuIFVJbnQ2NChlbnVtcy5QQVlPRkZfU0lHTl9ORUdBVElWRSkKICAgIHB1c2hpbnQgMjU1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MjAKICAgIC8vIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIGIgX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX3BheW9mZl9zaWduQDcKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fcm9sZV9pc19hY3RpdmUocm9sZV9tYXA6IGJ5dGVzLCByb2xlX2FkZHJlc3M6IGJ5dGVzKSAtPiB1aW50NjQ6Cl9yb2xlX2lzX2FjdGl2ZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NwogICAgLy8gZGVmIF9yb2xlX2lzX2FjdGl2ZShzZWxmLCByb2xlX21hcDogdHlwLlJiYWNSb2xlLCByb2xlX2FkZHJlc3M6IEFjY291bnQpIC0+IGJvb2w6CiAgICBwcm90byAyIDEKICAgIHB1c2hieXRlcyAiIgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU4LTYyCiAgICAvLyByZXR1cm4gc2VsZi5faGFzX3JvbGUocm9sZV9tYXAsIHJvbGVfYWRkcmVzcykgYW5kICgKICAgIC8vICAgICByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICkKICAgIGJ6IF9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIEJveE1hcCBlbnRyeSBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYwCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MAogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgPD0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYxCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIEJveE1hcCBlbnRyeSBleGlzdHMKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYwLTYxCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDAKICAgID49CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTktNjEKICAgIC8vIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IF9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQKICAgIGludGNfMSAvLyAxCgpfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU4LTYyCiAgICAvLyByZXR1cm4gc2VsZi5faGFzX3JvbGUocm9sZV9tYXAsIHJvbGVfYWRkcmVzcykgYW5kICgKICAgIC8vICAgICByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICkKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgX3JvbGVfaXNfYWN0aXZlX2Jvb2xfbWVyZ2VANQoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkgLT4gdm9pZDoKX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjUKICAgIC8vIGFzc2VydCBzZWxmLl9pc19hcnJhbmdlcihUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjUyCiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzID09IHNlbGYuYXJyYW5nZXIudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOCAvLyAweDUyM2E0MTUyNTIyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgPT0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2NQogICAgLy8gYXNzZXJ0IHNlbGYuX2lzX2FycmFuZ2VyKFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpIC0+IHZvaWQ6Cl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4MwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFzc2V0X2RlZmF1bHRlZCwgZXJyLkRFRkFVTFRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQxIC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfZGVmYXVsdGVkIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIERlZmF1bHRlZAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkgLT4gdm9pZDoKX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg2CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYXNzZXRfc3VzcGVuZGVkLCBlcnIuU1VTUEVOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzMgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9zdXNwZW5kZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gU3VzcGVuZGVkIG9wZXJhdGlvbnMKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkOiB1aW50NjQpIC0+IHZvaWQ6Cl9hc3NlcnRfdmFsaWRfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OAogICAgLy8gZGVmIF9hc3NlcnRfdmFsaWRfcm9sZShzZWxmLCByb2xlX2lkOiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTAKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIHB1c2hpbnQgMjAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkxCiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgcHVzaGludCAyNQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTIKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICBwdXNoaW50IDQwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MwogICAgLy8gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgcHVzaGludCA1MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTQKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgcHVzaGludCA2MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTUKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICBwdXNoaW50IDcwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NgogICAgLy8gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgcHVzaGludCA4MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfZmFsc2VAOAoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3OgogICAgaW50Y18xIC8vIDEKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX21lcmdlQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgcmV0c3ViCgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9mYWxzZUA4OgogICAgaW50Y18wIC8vIDAKICAgIGIgX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfbWVyZ2VAOQo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" }, "byteCode": { - "approval": "DCAFAAEIINwLJjEEFR98dQZzdGF0dXMMZXZlbnRfY3Vyc29yFHNjaGVkdWxlX2VudHJ5X2NvdW50FW91dHN0YW5kaW5nX3ByaW5jaXBhbBFmaXhlZF9wb2ludF9zY2FsZRBhY2NydWVkX2ludGVyZXN0GWludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UKUiNBY2NvdW50IxVub21pbmFsX2ludGVyZXN0X3JhdGUNY29udHJhY3RfdHlwZRRyZXNlcnZlZF91bml0c190b3RhbBJyZXNlcnZlZF9wcmluY2lwYWwLdG90YWxfdW5pdHMZbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbhFyZXNlcnZlZF9pbnRlcmVzdBljdW11bGF0aXZlX2ludGVyZXN0X2luZGV4GmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4C1IjQXJyYW5nZXIjE3NldHRsZW1lbnRfYXNzZXRfaWQXaW5pdGlhbF9leGNoYW5nZV9hbW91bnQMUiNBdXRob3JpdHkjEFIjUHJpbWFyeURlYWxlciMRUiNBY2NvdW50TWFuYWdlciMCUyMLUiNPYnNlcnZlciMLUiNPcERhZW1vbiMVaW5pdGlhbF9leGNoYW5nZV9kYXRlFXRyYW5zZmVyX29wZW5pbmdfZGF0ZRV0cmFuc2Zlcl9jbG9zdXJlX2RhdGUQcmF0ZV9yZXNldF9mbG9vcg5yYXRlX3Jlc2V0X2NhcApSI1RydXN0ZWUjD2Fzc2V0X3N1c3BlbmRlZBxkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uEXJhdGVfcmVzZXRfc3ByZWFkFXJhdGVfcmVzZXRfbXVsdGlwbGllcg9yYXRlX3Jlc2V0X25leHQUaGFzX3JhdGVfcmVzZXRfZmxvb3ISaGFzX3JhdGVfcmVzZXRfY2FwAQAPYXNzZXRfZGVmYXVsdGVkD3Byb3NwZWN0dXNfaGFzaA5wcm9zcGVjdHVzX3VybBVkZW5vbWluYXRpb25fYXNzZXRfaWQNbWF0dXJpdHlfZGF0ZRRkYXlfY291bnRfY29udmVudGlvbgMGgQECAAAxGEAArScSMgNnJxoyA2cnISJnJykiZykiZycKImcnKoAAZycrgABnJywiZycTImcnGyJnJy0iZyccImcnHSJnJy4iZycNImcnCyJnJxQiZycEImcnDiJnJyIiZycHImcnBiJnJwkiZycjImcnJCJnJx4iZycfImcnJSJnJyYiZycnImcnDCJnJw8iZycQImcnESJnKiJnKyJnJwUiZzE1gQQSRDE0gSUSRDE3FEQxNhREgASRTwTrNhoAjgEAxzEZFEQxGEEAsIIYBLRGGMgE54MlKQSUOIcjBGyF4+4EvdGpRAR8DxgSBBT8EO8EdKcpfwQJ1P4UBJqb+oUEhe7TPQSrLA/EBNnyJawEmINQWgSOpudMBAKvVXoEgvcbLQTvBPXTBN80NVAEPb6AvQQePkjnBAEMgpkEdAas0gQacqLuNhoAjhgAVgMhBH0EpwUxBiEGWwazBuYHFAkICh8KmAwEDPYNiQ3ODeYN/g6zD0kPaA9zD70AgASVbXFWNhoAjgEG8QAxGYEEEjEYEERCDa6KAgCL/oEKCIsAMgwNQQAqsYEGshCBBbIZJy+yHicvsh+L/40CAAsABLNC/9syALIBQv/1IrIBQv/viSKAAEcNNhoBSRUkEkQXIillRESIFZ6IFaWIFaoiKWVEgTISFESIEgFBAAtJgWQLIQQIIoj/jyJFBSJFDiJFDUsESwEMQQJZIiplRCIrZUQMQQJNIiplRIgQ00lFEYEJW0lFAzIHDUACN0sPJFVJRRAkEklFBEAAEEsOgQMSQAAISw6BExJBAj8jQQIUSw8iWyIqZUQSREsBMgcOREsCQAHtSw6BExJAAeUiRQtLDyRVSUUQgQMSQAFlSw6BExJAAV0iRQZLD4ExW0UIiBFbQAD+SwdFCUsKiBAZSwaIEBRLAYgQLklOAkUPSYgQJUlFC0sCSwEISUUJMgoiJxNlRHAARCInD2VEIicMZURLAQhLAksBD0RPAkwJTwIPRE8DCCcPTGciJwxlRAgnDExnIicQZURPAggnEExnIicRZUQIJxFMZ0sPJFWBAxJBAHoiJwZlREsQiBDnRRIIJwZMZ4gQx0EACksPJFWBExJBAAlLD4EpWycOTGcnBEsIZycHSwlnIiplRCMIKkxnSw9XCAGAAROoQQARIicEZURAAAkpgcgBZycHImdLD0sESYgTVEhLDUsMCEUOSwxLBwhFDUsEIwhFBUL+dycGImdC/5BLDyRVSUUQgQMSQQAQIicEZURLBglJRQlFCUL+6UsOJBJBABMiJwRlTEUJRCInB2VMRQpEQv7PSw6BExJAAAdLB0UJQv7AIkUIIkUJQv63iBAIQQBWSw6BExJBAAoiJwRlREUGQv6OIicGZURLEIgP/0USCElFCyInDmVED0EABiJFBkL+byInDmVESwoJSUUIIicEZUQNQQAKIicEZURFBkL+UUsGRQZC/kpLD4ExWyInBGVESg5ETAlFBkL+NiInBmVESxCID6dFEghFC0L+DEsESURLDklLD0lOAwgyB08CFk8DFlBPAhZQTwIWUEwWUChMULAjQyJC/b6AAEcCNhoBRwIVJRJENhoCSSJZgQIISwEVEkRXAgBMIillREQnCExQSb1FAUQiJxplRDIDE0EAIjEAIicaZUQSQAAVMQBLAxJAAA0xAEsBvkRXACASQQEAI0SIEpaIEpsiKWVEgTISFERLAkmIDUuIDM5GAkm+REmBSVtJTgJFCEmBUVtJRQhPAghJRQZEVwAgIicTZURwAEUBQQC3Sb5EgYADU0AArSNBAHgyCiInE2VETEsBcABESwVJTgIPREsCSU4DvkRJVwAgsTIATwOyEkyyFE8CshGBBLIQsgGzSYFJW0lOAkUJSYFRW0lOA0UJIhZMSwFcSUxcUU8DTL8iJw9lRElLAg9EIicMZURLAw9ETAknD0xnIicMZURMCScMTGdLBUlLBklOAwgyB08CFk8DFlBPAhZQTBZQSwJJFRZXBgJMUEyAAgAiUExQKExQsCNDIkL/UCJC/v02GgFJFSQSRBc2GgJJFSQSRBeIEXhKDEQnHE8CZycdTGcyBxYoTFCwI0M2GgFJFSUSRDYaAkkVJBJEF0lOAiIpZUREJxYxAIgRD0SIEUmIEU4iKWVEgTISRCcISwJQSU4DvUUBREyIC2pJRCInC2VECCInDWVEDkQiJxtlREEACTIHIicbZUQOREcCvkSBKFtLA0lOAwgWgShMuyInC2VECCcLSwFnIicNZURMCRYoTFCwI0MiSTYaAUkVJRJENhoCSRUlEkQ2GgNHAhUkEkQXIillRESIEL+IEMQiKWVEgTISFEQiJxxlREEACSInHGVEMgcORCInHWVEQQAJMgciJx1lRAxEMQBLBElOAhJEJwhLAVBJRQhJvUUBRCcISwVJTgJQSUUJvUUBREsCiAqjSYgKn08CE0RLAUlETL5EJVsORCIqZUQiK2VED0AADiIqZUSIC7CBCVsyBw1ESwNJiAr7SwNJTgKICvOICnZGAogKcUYCSwVJvkQlW0sCSU4CSwEOREsBCRZPAiVPArtLBUm+RCVbTwIIFiVMuyhLAlCwI0M2GgFJFSUSRDYaAkkVIxJEIlMnFTEAiA+cRCcITwJQSb1FAURJgTAjuiJPA1SBMEy7MgcWKExQsCNDNhoBSRUlEkQ2GgJJFSUSRCcXMQCID2REIillRIHIARIURIgPlIgPmScITwJQSb1FARREIhZPAksBUEsBUCcoUEsBUEsBUEsBUEsBUExQvzIHFihMULAjQzYaAUkVJRJENhoCSRUlEkQnCEsCUEm9RQFEMQBPAxJEiA8+iA9DIk8CuzIHFihMULAjQzYaAUkVJRJEJwhMUEm9RQFEvkgoTFCwI0M2GgFJFSUSRCcSTGcyBxYoTFCwI0OAAEk2GgFHAhWBaxJENhoCSU4CFYFIEkQ2GgNJTgJJFUsBJVlJgSISRE8CTEsCUklOAyJZgSQIEkSIDroiVUknCksBZ0EAIkkjEkAAHEmBAhJAABVJgQMSQAAOSYEEEkAAB0mBBRJBAYcjRCInCmVMRQJESwRJgSFbSUUIRIE5VUlFCEEAH0sGIxJAABhLBoECEkAAEEsGgQMSQAAISwaBBBJBAUcjREkjE0EACEsEgZIGUxREIillRBREIicUZUQUREsESSNbSXELRQFEJyxLAWdLAYEJW0lPAhJEJxNLAWexMgAyCiKyErIUTLIRgQSyELIBs0mBEVsnDUxnJwsiZycuSwhnSYEpWycbSwFnSwGBMVsnLUsBZ0sGSU4CgTBbJw5MZycUSwpnSwOBkgZTJyJMZ0sBgRBbJwRMZ0sBgShbJwZMZ0sBJVsnCUxnSwGBGFsnB0xnSwOBOlsnI0xnSwOBQlsnJExnSwOBSlsnHkxnSwOBUlsnH0xnSwOBWlsnJUxnSwOBkAZTJyZMZ0sDgZEGUycnTGdPA4FjWycFTGdLASRbKkxnSwGBOFsnEExnSwGBQFsnEUxnJw8iZycMImdLAjIHDURMIltLAgxEDERLAlcAICcqTGdLAVcCACcrTGcyBxYoTFCwI0MiQv62IkL+diKAAEcCNhoBSRUkEkQXSTYaAkkVIxJEIlNMNhoDSU4CSSJZSU4DSYFBC4ECCE8CFRJEiAzNIicKZUxOA0QiKWVEFERJgRAORCInFGVEREyBEAtMgWQLIQQIIoj2tiJJSwQMQQCLSwRXAgBJRQxLAUlOAoFBC4FBWEkkVUlOAkUNSSJbSUUNSwVPBAhLARJESwVPA4gIGUyBCVtJRQpEQQAXSUEAJUkjCYFBC0sLTIFBWIEJW0sIDkRLCEAABUsJIxJESSMIRQFC/5RLBklEIwkWJxhMUEm9RQFESSKBAroXSUQjCYFBC4ECCIFBukL/wUsGFicYTFBJvEhLBb9LBUEADEsBSwQIK0xnKYEyZzIHFihMULAjQyIpZUREiAvjiAvqiAvvIiplRCIrZURLAQ1EiAdHSVcIAUmAAQGoREsBVwAISwJXCQhLA1cRCEsEVxkISwVXIQhLBlcpCEsHVzEISwhXOQhPB08IUE8HUE8GUE8FUCIWUE8EUE8DUE8CUExQiAh5RgIyBxYoTFCwI0MiRwSAAEk2GgFJFSQSRBc2GgJHAhWBSRJEIillRESIC1uIC2CBQVtJgQQaQQCwIicKZUSBBRJEiAs4IicKZURJgQUSREsCSSJbSUUHIitlRBJESVcIAUUMJFWIBsIiK2VEgRAKJzBFBxYnGExQSUUJvUUBQQAHSwe+TEUHREsFSSJZSYEQDERLA0lXCQhLAVcRCEsCVxkISwNXKQhLBFcxCE8FVzkISwsWSxJQTwZQTwVQTwRQTwNQTwJQTFBLAxZQTwJMUEwjCBZXBgJcAEsISbxITL8iK2VEIwgrTGciKmVESwNJTwISRIgF/0lFCElXCAFFCiRVSUUGIxJAAChLBIEEEkAAIEsEgQwSQAAYSwSBCxJAABBLBIESEkAACEsEgQUSQQBBI0RLCIABAalESwSBDBJAAAhLBIELEkEAJCNBABonGTEAiAnzREsGSwKIBxtGAjIHFihMULAjQ4gKEUL/6CJC/9kiQv+8Ikk2GgFHAhWBQRJEIillRESICfKICfmICf4iKWVEgTISFEQiJwplRIEFEkRJIltJTgIiK2VETEsBEkRLAVcIAUlOA4ABA6hETIE5W0lOAiMaREEAEyIrZUQjCYgFIYEJW0sEgQlbDkQiK2VEgRAKJzBFBhYnGExQSUUHvUUBQQAHSwW+TEUGREsESSJZSYEQDERLBUlXCQhLAVcRCEsCVxkISwNXIQhLBFcpCE8FVzEISwoWSwpQTwZQTwVQTwRQTwNQTwJQTFBLAxZQTwJMUEwjCBZXBgJcAEsGSbxITL8iK2VEIwgrTGcyBxYoTFCwI0MiKWVESUQiJwplRBZJkyQORFcHASInDWVEIicLZUQiJxRlRCIqZUQiK2VEIicEZUQiJwdlRCInCWVEIicGZUQiJxBlRCInEWVEIicPZUQiJwxlRE8OFk8OTFBPDRZQTwwWUE8LFlBPChZQTwkWUE8IFlBPBxZQTwYWUE8FFlBPBBZQTwMWUE8CFlBMFlAoTFCwI0MiKWVERCIqZUQiK2VED0EAJSIqZUQWJyhQIhZMSwFQSwFQSwFQSwFQSwFQSwFQTFAoTFCwI0MiKmVEiAO9Qv/wiAg+I0M2GgFJFSUSRIgIMScSTGcyBxYoTFCwI0M2GgFJFSUSRIgIGScaTGcyBxYoTFCwI0M2GgFJFSMSRDYaAklOAhUlEkQ2GgNJTgIVgRASRIgH7IgH8xdHAogH/YEUEkEADicSSwNnMgcWKExQsCNDSYEoEkEAEScXSwNQSb1FARRESwK/Qv/fSYEyEkEAEScWSwNQSb1FARRESwK/Qv/HSYE8EkEAEScgSwNQSb1FARRESwK/Qv+vSYFGEkEAEScVSwNQSb1FARRESwK/Qv+XSYFQEkH/kCcZSwNQSb1FARRESwK/Qv9/NhoBSRUjEkQ2GgJJTgIVJRJEiAdCiAdJF0cCiAdTSYEUE0SBKBJBABUnF0sCUEm9RQFEvEgyBxYoTFCwI0NJgTISQQAPJxZLAlBJvUUBRLxIQv/hSYE8EkEADycgSwJQSb1FAUS8SEL/y0mBRhJBAA8nFUsCUEm9RQFEvEhC/7VJgVASQf+uJxlLAlBJvUUBRLxIQv+fNhoBSRUjEkQiUycVMQCIBnxEJyFMZzIHFihMULAjQyInEmVEKExQsCNDNhoBSRUlEkQnF0sBiAZUJxZLAogGTScgSwOIBkYnFUsEiAY/JxlPBYgGOCcoIk8GVCNPBVSBAk8EVIEDTwNUgQRPAlQoTFCwI0M2GgFJFSMSRDYaAklOAhUlEkQXSYgGUIMGFCgyPEZQTwaOBgBPAEAAMQAiABMAAQAnGUsBUEm9RQFEvkgoTFCwI0MnFUsBUEm9RQFEvkhC/+snIEsBUEm9RQFEvkhC/9wnFksBUEm9RQFEvkhC/80nF0sBUEm9RQFEvkhC/76AEAAAAAAAAAAAAAAAAAAAAABC/6mKAQAnCIv/UL5EgYADUxREiYoBAicIi/9QSb1FAURJvkgiJxBlREsBgTlbCSInEWVESwKBQVsJSwIlWyInBWVETwNLAk8CiACYIicFZURPA08DTwKIAIpLAoFJW0sCCBZPA0xcSUmBUVtLAggWXFEiJxBlRBZcOSInEWVEFlxBIiplRBZcMU8DTL+JigEAIoAAJwiL/1BJvUUBRCIpZUSBMhJBAAGJiwK+TElOAowARIEoW0mMAUAAAYmLAEklW4sBSU4DCBZcICIWXCiLAky/IicLZURJSwIPREwJJwtMZ4mKAwGL/UEABYv+QAACIomL/Yv+HYv/l4mKAQGL/0AAAiKJIicNZURJRCInBWVEi/9MTwKI/8qJigEBi/9AAAIiiSInDWVEIicFZUSL/0yI/6+JigEBIitlRIv/DUSL/4EQChYnGExQSb1FAUSL/4EQGEsBIoECuhdLAQ1EgUELgQIIgUG6iYoCAIv/IxJAAB+L/yQSQAAYi/+BExJAABCL/4EMEkAACIv/gQsSQQADI0SJi/5AAAQiQv/1i/6BAxJAAAiL/oECEkEAGIv/gQMSQAAIi/+BEhJBAAQjQv/RIkL/zYv+IxJBACCL/4EDEkAAEIv/gRISQAAIi/+BBRJBAAQjQv+qIkL/pov+gQQSQQAoi/+BAxJAABiL/4EEEkAAEIv/gRISQAAIi/+BBRJBAAQjQv96IkL/dov+gQUSQQAIi/+BAxJC/2YiQv9iIicKZUQjEkEACiInImVEQQACI4kiiYoBAov/gRFbSUEAECInCWVEQQAIIicHZURAAAYii/9PAokiJwdlRCInCWVEIicFZUSI/mgiJwVlRIsATIj+XYv/TwKJigIBi/9AAAOL/okiJwVlRCInCWVEi/9LAoj+PAhJRCInBWVEi/5MTwKI/iyJigICIoAARwiL/iJbIiplRBJEi/6BCVsyBw5Ei/4kVUkjEklBAF4iKWVEgTISRCInC2VEIicNZUQSRIv+gTFbJwRLAWcnB0xni/6BIVsnCUxnJwYiZ4v+gSlbJw5MZyIqZUQjCCpMZymBZGeLC0QiJxRlRIv+TCKIAdpJjP6L/4wBjACJIillRIEyEhREIicGZUSL/oj++Iz+CCcGTGeLCoEMEkEBeIv/gSFbIickZUQiJwVlRIj9cyInI2VECIwGIicmZURBABMiJx5lRIsGDUEACCInHmVMjAZEIicnZURBABMiJx9lRIsGDEEACCInH2VMjAZEJwmLBmeLCoEEEkEBB4v+gTFbJwRLAWcnB0xniP5lQQDniwqBBRJBAMUiK2VEIiplRAmBZAshBAgiiOvjIicFZUyMAkQijAEijAeL/oEZW0mMCEEAD4sCiwiI/oFJjAIjjAeMASIqZUQjCIwDIitlRIsDDUEAUosDiP0MSYwAJFVJjASBAxJAABCLBIETEkEAM4sAgRlbQQArI0EACIsHQQAMIowHiwMjCIwDQv++iwCBGVuLAkyI/iRJjAKLAQiMAUL/4SJC/9KLAUQiJwRlRIv+gTlbJBpAAAYiJwZlRAgiJwVlRIsBiPxLJw5MZyIqZUQjCCpMZ4v+IkmIAGBJjP6L/4wBjACJi/6BKVsnDkxnQv/aiwqBEhJB/v8iJwRlRCcHTGdC/vOLCoELEkEAG4v+gSFbSYwFQAAIIiclZUyMBUQnCYsFZ0L+uov+gSFbSYwJQf6vJwmLCWdC/qeKAwEyCIv9IluL/VcIAYv9VwkIMgeL/SRVi/5AAEUjFkmTJA5EVwcBIicTZUSLAUkjCIsAFk8CFlCLAlCLA1CLBBZQi/4WUE8DUIv/FlBPAhZQTBZQgASaMyuVTFCwi/2MAImLBSMSQAAIiwWBBBJBAAQjQv+pgf8BQv+jigIBgACL/ov/UEm9RQFBAB+LAb5EIlsyB0mMAA5BABCLAb5EJFuLAA9BAAQjjACJIkL/+TEAIicSZUQSRIkiJyllRBREiSInIWVEFESJigEAi/+BFBJAADCL/4EZEkAAKIv/gSgSQAAgi/+BMhJAABiL/4E8EkAAEIv/gUYSQAAIi/+BUBJBAAMjRIkiQv/6", + "approval": "DCAFAAEIINwLJjEEFR98dQZzdGF0dXMMZXZlbnRfY3Vyc29yFHNjaGVkdWxlX2VudHJ5X2NvdW50FW91dHN0YW5kaW5nX3ByaW5jaXBhbBFmaXhlZF9wb2ludF9zY2FsZRBhY2NydWVkX2ludGVyZXN0GWludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UCQSMVbm9taW5hbF9pbnRlcmVzdF9yYXRlDWNvbnRyYWN0X3R5cGUUcmVzZXJ2ZWRfdW5pdHNfdG90YWwScmVzZXJ2ZWRfcHJpbmNpcGFsC3RvdGFsX3VuaXRzGW5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24RcmVzZXJ2ZWRfaW50ZXJlc3QZY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleBpjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleAZSOkFSUiMTc2V0dGxlbWVudF9hc3NldF9pZBdpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudAZSOkFVVCMGUjpQWUQjBlI6TU5HIwJTIwZSOk1PQyMGUjpPUEQjFWluaXRpYWxfZXhjaGFuZ2VfZGF0ZRV0cmFuc2Zlcl9vcGVuaW5nX2RhdGUVdHJhbnNmZXJfY2xvc3VyZV9kYXRlEHJhdGVfcmVzZXRfZmxvb3IOcmF0ZV9yZXNldF9jYXAGUjpUUlMjD2Fzc2V0X3N1c3BlbmRlZBxkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uEXJhdGVfcmVzZXRfc3ByZWFkFXJhdGVfcmVzZXRfbXVsdGlwbGllcg9yYXRlX3Jlc2V0X25leHQUaGFzX3JhdGVfcmVzZXRfZmxvb3ISaGFzX3JhdGVfcmVzZXRfY2FwAQAPYXNzZXRfZGVmYXVsdGVkD3Byb3NwZWN0dXNfaGFzaA5wcm9zcGVjdHVzX3VybBVkZW5vbWluYXRpb25fYXNzZXRfaWQNbWF0dXJpdHlfZGF0ZRRkYXlfY291bnRfY29udmVudGlvbgMGgQECAAAxGEAArScSMgNnJxoyA2cnISJnJykiZykiZycKImcnKoAAZycrgABnJywiZycTImcnGyJnJy0iZyccImcnHSJnJy4iZycNImcnCyJnJxQiZycEImcnDiJnJyIiZycHImcnBiJnJwkiZycjImcnJCJnJx4iZycfImcnJSJnJyYiZycnImcnDCJnJw8iZycQImcnESJnKiJnKyJnJwUiZzE1gQQSRDE0gSUSRDE3FEQxNhREgASRTwTrNhoAjgEAxzEZFEQxGEEAsIIYBLRGGMgE54MlKQSUOIcjBGyF4+4EvdGpRAR8DxgSBBT8EO8EdKcpfwQJ1P4UBJqb+oUEhe7TPQSrLA/EBNnyJawEmINQWgSOpudMBAKvVXoEgvcbLQTvBPXTBN80NVAEPb6AvQQePkjnBAEMgpkEdAas0gQacqLuNhoAjhgAVgMhBH0EpwUxBiEGWwazBuYHFAkICh8KmAwEDPYNiQ3ODeYN/g6zD0kPaA9zD70AgASVbXFWNhoAjgEG8QAxGYEEEjEYEERCDa6KAgCL/oEKCIsAMgwNQQAqsYEGshCBBbIZJy+yHicvsh+L/40CAAsABLNC/9syALIBQv/1IrIBQv/viSKAAEcNNhoBSRUkEkQXIillRESIFZ6IFaWIFaoiKWVEgTISFESIEgFBAAtJgWQLIQQIIoj/jyJFBSJFDiJFDUsESwEMQQJZIiplRCIrZUQMQQJNIiplRIgQ00lFEYEJW0lFAzIHDUACN0sPJFVJRRAkEklFBEAAEEsOgQMSQAAISw6BExJBAj8jQQIUSw8iWyIqZUQSREsBMgcOREsCQAHtSw6BExJAAeUiRQtLDyRVSUUQgQMSQAFlSw6BExJAAV0iRQZLD4ExW0UIiBFbQAD+SwdFCUsKiBAZSwaIEBRLAYgQLklOAkUPSYgQJUlFC0sCSwEISUUJMgoiJxNlRHAARCInD2VEIicMZURLAQhLAksBD0RPAkwJTwIPRE8DCCcPTGciJwxlRAgnDExnIicQZURPAggnEExnIicRZUQIJxFMZ0sPJFWBAxJBAHoiJwZlREsQiBDnRRIIJwZMZ4gQx0EACksPJFWBExJBAAlLD4EpWycOTGcnBEsIZycHSwlnIiplRCMIKkxnSw9XCAGAAROoQQARIicEZURAAAkpgcgBZycHImdLD0sESYgTVEhLDUsMCEUOSwxLBwhFDUsEIwhFBUL+dycGImdC/5BLDyRVSUUQgQMSQQAQIicEZURLBglJRQlFCUL+6UsOJBJBABMiJwRlTEUJRCInB2VMRQpEQv7PSw6BExJAAAdLB0UJQv7AIkUIIkUJQv63iBAIQQBWSw6BExJBAAoiJwRlREUGQv6OIicGZURLEIgP/0USCElFCyInDmVED0EABiJFBkL+byInDmVESwoJSUUIIicEZUQNQQAKIicEZURFBkL+UUsGRQZC/kpLD4ExWyInBGVESg5ETAlFBkL+NiInBmVESxCID6dFEghFC0L+DEsESURLDklLD0lOAwgyB08CFk8DFlBPAhZQTwIWUEwWUChMULAjQyJC/b6AAEcCNhoBRwIVJRJENhoCSSJZgQIISwEVEkRXAgBMIillREQnCExQSb1FAUQiJxplRDIDE0EAIjEAIicaZUQSQAAVMQBLAxJAAA0xAEsBvkRXACASQQEAI0SIEpaIEpsiKWVEgTISFERLAkmIDUuIDM5GAkm+REmBSVtJTgJFCEmBUVtJRQhPAghJRQZEVwAgIicTZURwAEUBQQC3Sb5EgYADU0AArSNBAHgyCiInE2VETEsBcABESwVJTgIPREsCSU4DvkRJVwAgsTIATwOyEkyyFE8CshGBBLIQsgGzSYFJW0lOAkUJSYFRW0lOA0UJIhZMSwFcSUxcUU8DTL8iJw9lRElLAg9EIicMZURLAw9ETAknD0xnIicMZURMCScMTGdLBUlLBklOAwgyB08CFk8DFlBPAhZQTBZQSwJJFRZXBgJMUEyAAgAiUExQKExQsCNDIkL/UCJC/v02GgFJFSQSRBc2GgJJFSQSRBeIEXhKDEQnHE8CZycdTGcyBxYoTFCwI0M2GgFJFSUSRDYaAkkVJBJEF0lOAiIpZUREJxYxAIgRD0SIEUmIEU4iKWVEgTISRCcISwJQSU4DvUUBREyIC2pJRCInC2VECCInDWVEDkQiJxtlREEACTIHIicbZUQOREcCvkSBKFtLA0lOAwgWgShMuyInC2VECCcLSwFnIicNZURMCRYoTFCwI0MiSTYaAUkVJRJENhoCSRUlEkQ2GgNHAhUkEkQXIillRESIEL+IEMQiKWVEgTISFEQiJxxlREEACSInHGVEMgcORCInHWVEQQAJMgciJx1lRAxEMQBLBElOAhJEJwhLAVBJRQhJvUUBRCcISwVJTgJQSUUJvUUBREsCiAqjSYgKn08CE0RLAUlETL5EJVsORCIqZUQiK2VED0AADiIqZUSIC7CBCVsyBw1ESwNJiAr7SwNJTgKICvOICnZGAogKcUYCSwVJvkQlW0sCSU4CSwEOREsBCRZPAiVPArtLBUm+RCVbTwIIFiVMuyhLAlCwI0M2GgFJFSUSRDYaAkkVIxJEIlMnFTEAiA+cRCcITwJQSb1FAURJgTAjuiJPA1SBMEy7MgcWKExQsCNDNhoBSRUlEkQ2GgJJFSUSRCcXMQCID2REIillRIHIARIURIgPlIgPmScITwJQSb1FARREIhZPAksBUEsBUCcoUEsBUEsBUEsBUEsBUExQvzIHFihMULAjQzYaAUkVJRJENhoCSRUlEkQnCEsCUEm9RQFEMQBPAxJEiA8+iA9DIk8CuzIHFihMULAjQzYaAUkVJRJEJwhMUEm9RQFEvkgoTFCwI0M2GgFJFSUSRCcSTGcyBxYoTFCwI0OAAEk2GgFHAhWBaxJENhoCSU4CFYFIEkQ2GgNJTgJJFUsBJVlJgSISRE8CTEsCUklOAyJZgSQIEkSIDroiVUknCksBZ0EAIkkjEkAAHEmBAhJAABVJgQMSQAAOSYEEEkAAB0mBBRJBAYcjRCInCmVMRQJESwRJgSFbSUUIRIE5VUlFCEEAH0sGIxJAABhLBoECEkAAEEsGgQMSQAAISwaBBBJBAUcjREkjE0EACEsEgZIGUxREIillRBREIicUZUQUREsESSNbSXELRQFEJyxLAWdLAYEJW0lPAhJEJxNLAWexMgAyCiKyErIUTLIRgQSyELIBs0mBEVsnDUxnJwsiZycuSwhnSYEpWycbSwFnSwGBMVsnLUsBZ0sGSU4CgTBbJw5MZycUSwpnSwOBkgZTJyJMZ0sBgRBbJwRMZ0sBgShbJwZMZ0sBJVsnCUxnSwGBGFsnB0xnSwOBOlsnI0xnSwOBQlsnJExnSwOBSlsnHkxnSwOBUlsnH0xnSwOBWlsnJUxnSwOBkAZTJyZMZ0sDgZEGUycnTGdPA4FjWycFTGdLASRbKkxnSwGBOFsnEExnSwGBQFsnEUxnJw8iZycMImdLAjIHDURMIltLAgxEDERLAlcAICcqTGdLAVcCACcrTGcyBxYoTFCwI0MiQv62IkL+diKAAEcCNhoBSRUkEkQXSTYaAkkVIxJEIlNMNhoDSU4CSSJZSU4DSYFBC4ECCE8CFRJEiAzNIicKZUxOA0QiKWVEFERJgRAORCInFGVEREyBEAtMgWQLIQQIIoj2tiJJSwQMQQCLSwRXAgBJRQxLAUlOAoFBC4FBWEkkVUlOAkUNSSJbSUUNSwVPBAhLARJESwVPA4gIGUyBCVtJRQpEQQAXSUEAJUkjCYFBC0sLTIFBWIEJW0sIDkRLCEAABUsJIxJESSMIRQFC/5RLBklEIwkWJxhMUEm9RQFESSKBAroXSUQjCYFBC4ECCIFBukL/wUsGFicYTFBJvEhLBb9LBUEADEsBSwQIK0xnKYEyZzIHFihMULAjQyIpZUREiAvjiAvqiAvvIiplRCIrZURLAQ1EiAdHSVcIAUmAAQGoREsBVwAISwJXCQhLA1cRCEsEVxkISwVXIQhLBlcpCEsHVzEISwhXOQhPB08IUE8HUE8GUE8FUCIWUE8EUE8DUE8CUExQiAh5RgIyBxYoTFCwI0MiRwSAAEk2GgFJFSQSRBc2GgJHAhWBSRJEIillRESIC1uIC2CBQVtJgQQaQQCwIicKZUSBBRJEiAs4IicKZURJgQUSREsCSSJbSUUHIitlRBJESVcIAUUMJFWIBsIiK2VEgRAKJzBFBxYnGExQSUUJvUUBQQAHSwe+TEUHREsFSSJZSYEQDERLA0lXCQhLAVcRCEsCVxkISwNXKQhLBFcxCE8FVzkISwsWSxJQTwZQTwVQTwRQTwNQTwJQTFBLAxZQTwJMUEwjCBZXBgJcAEsISbxITL8iK2VEIwgrTGciKmVESwNJTwISRIgF/0lFCElXCAFFCiRVSUUGIxJAAChLBIEEEkAAIEsEgQwSQAAYSwSBCxJAABBLBIESEkAACEsEgQUSQQBBI0RLCIABAalESwSBDBJAAAhLBIELEkEAJCNBABonGTEAiAnzREsGSwKIBxtGAjIHFihMULAjQ4gKEUL/6CJC/9kiQv+8Ikk2GgFHAhWBQRJEIillRESICfKICfmICf4iKWVEgTISFEQiJwplRIEFEkRJIltJTgIiK2VETEsBEkRLAVcIAUlOA4ABA6hETIE5W0lOAiMaREEAEyIrZUQjCYgFIYEJW0sEgQlbDkQiK2VEgRAKJzBFBhYnGExQSUUHvUUBQQAHSwW+TEUGREsESSJZSYEQDERLBUlXCQhLAVcRCEsCVxkISwNXIQhLBFcpCE8FVzEISwoWSwpQTwZQTwVQTwRQTwNQTwJQTFBLAxZQTwJMUEwjCBZXBgJcAEsGSbxITL8iK2VEIwgrTGcyBxYoTFCwI0MiKWVESUQiJwplRBZJkyQORFcHASInDWVEIicLZUQiJxRlRCIqZUQiK2VEIicEZUQiJwdlRCInCWVEIicGZUQiJxBlRCInEWVEIicPZUQiJwxlRE8OFk8OTFBPDRZQTwwWUE8LFlBPChZQTwkWUE8IFlBPBxZQTwYWUE8FFlBPBBZQTwMWUE8CFlBMFlAoTFCwI0MiKWVERCIqZUQiK2VED0EAJSIqZUQWJyhQIhZMSwFQSwFQSwFQSwFQSwFQSwFQTFAoTFCwI0MiKmVEiAO9Qv/wiAg+I0M2GgFJFSUSRIgIMScSTGcyBxYoTFCwI0M2GgFJFSUSRIgIGScaTGcyBxYoTFCwI0M2GgFJFSMSRDYaAklOAhUlEkQ2GgNJTgIVgRASRIgH7IgH8xdHAogH/YEUEkEADicSSwNnMgcWKExQsCNDSYEoEkEAEScXSwNQSb1FARRESwK/Qv/fSYEyEkEAEScWSwNQSb1FARRESwK/Qv/HSYE8EkEAEScgSwNQSb1FARRESwK/Qv+vSYFGEkEAEScVSwNQSb1FARRESwK/Qv+XSYFQEkH/kCcZSwNQSb1FARRESwK/Qv9/NhoBSRUjEkQ2GgJJTgIVJRJEiAdCiAdJF0cCiAdTSYEUE0SBKBJBABUnF0sCUEm9RQFEvEgyBxYoTFCwI0NJgTISQQAPJxZLAlBJvUUBRLxIQv/hSYE8EkEADycgSwJQSb1FAUS8SEL/y0mBRhJBAA8nFUsCUEm9RQFEvEhC/7VJgVASQf+uJxlLAlBJvUUBRLxIQv+fNhoBSRUjEkQiUycVMQCIBnxEJyFMZzIHFihMULAjQyInEmVEKExQsCNDNhoBSRUlEkQnF0sBiAZUJxZLAogGTScgSwOIBkYnFUsEiAY/JxlPBYgGOCcoIk8GVCNPBVSBAk8EVIEDTwNUgQRPAlQoTFCwI0M2GgFJFSMSRDYaAklOAhUlEkQXSYgGUIMGFCgyPEZQTwaOBgBPAEAAMQAiABMAAQAnGUsBUEm9RQFEvkgoTFCwI0MnFUsBUEm9RQFEvkhC/+snIEsBUEm9RQFEvkhC/9wnFksBUEm9RQFEvkhC/80nF0sBUEm9RQFEvkhC/76AEAAAAAAAAAAAAAAAAAAAAABC/6mKAQAnCIv/UL5EgYADUxREiYoBAicIi/9QSb1FAURJvkgiJxBlREsBgTlbCSInEWVESwKBQVsJSwIlWyInBWVETwNLAk8CiACYIicFZURPA08DTwKIAIpLAoFJW0sCCBZPA0xcSUmBUVtLAggWXFEiJxBlRBZcOSInEWVEFlxBIiplRBZcMU8DTL+JigEAIoAAJwiL/1BJvUUBRCIpZUSBMhJBAAGJiwK+TElOAowARIEoW0mMAUAAAYmLAEklW4sBSU4DCBZcICIWXCiLAky/IicLZURJSwIPREwJJwtMZ4mKAwGL/UEABYv+QAACIomL/Yv+HYv/l4mKAQGL/0AAAiKJIicNZURJRCInBWVEi/9MTwKI/8qJigEBi/9AAAIiiSInDWVEIicFZUSL/0yI/6+JigEBIitlRIv/DUSL/4EQChYnGExQSb1FAUSL/4EQGEsBIoECuhdLAQ1EgUELgQIIgUG6iYoCAIv/IxJAAB+L/yQSQAAYi/+BExJAABCL/4EMEkAACIv/gQsSQQADI0SJi/5AAAQiQv/1i/6BAxJAAAiL/oECEkEAGIv/gQMSQAAIi/+BEhJBAAQjQv/RIkL/zYv+IxJBACCL/4EDEkAAEIv/gRISQAAIi/+BBRJBAAQjQv+qIkL/pov+gQQSQQAoi/+BAxJAABiL/4EEEkAAEIv/gRISQAAIi/+BBRJBAAQjQv96IkL/dov+gQUSQQAIi/+BAxJC/2YiQv9iIicKZUQjEkEACiInImVEQQACI4kiiYoBAov/gRFbSUEAECInCWVEQQAIIicHZURAAAYii/9PAokiJwdlRCInCWVEIicFZUSI/mgiJwVlRIsATIj+XYv/TwKJigIBi/9AAAOL/okiJwVlRCInCWVEi/9LAoj+PAhJRCInBWVEi/5MTwKI/iyJigICIoAARwiL/iJbIiplRBJEi/6BCVsyBw5Ei/4kVUkjEklBAF4iKWVEgTISRCInC2VEIicNZUQSRIv+gTFbJwRLAWcnB0xni/6BIVsnCUxnJwYiZ4v+gSlbJw5MZyIqZUQjCCpMZymBZGeLC0QiJxRlRIv+TCKIAdpJjP6L/4wBjACJIillRIEyEhREIicGZUSL/oj++Iz+CCcGTGeLCoEMEkEBeIv/gSFbIickZUQiJwVlRIj9cyInI2VECIwGIicmZURBABMiJx5lRIsGDUEACCInHmVMjAZEIicnZURBABMiJx9lRIsGDEEACCInH2VMjAZEJwmLBmeLCoEEEkEBB4v+gTFbJwRLAWcnB0xniP5lQQDniwqBBRJBAMUiK2VEIiplRAmBZAshBAgiiOvjIicFZUyMAkQijAEijAeL/oEZW0mMCEEAD4sCiwiI/oFJjAIjjAeMASIqZUQjCIwDIitlRIsDDUEAUosDiP0MSYwAJFVJjASBAxJAABCLBIETEkEAM4sAgRlbQQArI0EACIsHQQAMIowHiwMjCIwDQv++iwCBGVuLAkyI/iRJjAKLAQiMAUL/4SJC/9KLAUQiJwRlRIv+gTlbJBpAAAYiJwZlRAgiJwVlRIsBiPxLJw5MZyIqZUQjCCpMZ4v+IkmIAGBJjP6L/4wBjACJi/6BKVsnDkxnQv/aiwqBEhJB/v8iJwRlRCcHTGdC/vOLCoELEkEAG4v+gSFbSYwFQAAIIiclZUyMBUQnCYsFZ0L+uov+gSFbSYwJQf6vJwmLCWdC/qeKAwEyCIv9IluL/VcIAYv9VwkIMgeL/SRVi/5AAEUjFkmTJA5EVwcBIicTZUSLAUkjCIsAFk8CFlCLAlCLA1CLBBZQi/4WUE8DUIv/FlBPAhZQTBZQgASaMyuVTFCwi/2MAImLBSMSQAAIiwWBBBJBAAQjQv+pgf8BQv+jigIBgACL/ov/UEm9RQFBAB+LAb5EIlsyB0mMAA5BABCLAb5EJFuLAA9BAAQjjACJIkL/+TEAIicSZUQSRIkiJyllRBREiSInIWVEFESJigEAi/+BFBJAADCL/4EZEkAAKIv/gSgSQAAgi/+BMhJAABiL/4E8EkAAEIv/gUYSQAAIi/+BUBJBAAMjRIkiQv/6", "clear": "DIEBQw==" }, "compilerInfo": { diff --git a/smart_contracts/artifacts/d_asa/dasa_client.py b/smart_contracts/artifacts/d_asa/dasa_client.py index 8522c1fd..2b4f38d6 100644 --- a/smart_contracts/artifacts/d_asa/dasa_client.py +++ b/smart_contracts/artifacts/d_asa/dasa_client.py @@ -19,7 +19,7 @@ import algokit_utils from algokit_utils import AlgorandClient as _AlgoKitAlgorandClient -_APP_SPEC_JSON = r"""{"arcs": [22, 28], "bareActions": {"call": [], "create": []}, "methods": [{"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "name": "max_event_count"}], "name": "fund_due_cashflows", "returns": {"type": "(uint64,uint64,uint64,uint64,uint64)", "struct": "CashFundingResult"}, "desc": "Reserve due ACTUS cash events into the escrow-style claim ledger.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "name": "holding_address"}, {"type": "byte[]", "name": "payment_info"}], "name": "claim_due_cashflows", "returns": {"type": "(uint64,uint64,uint64,uint64,byte[])", "struct": "CashClaimResult"}, "desc": "Withdraw the holder's already funded ACTUS cash entitlements.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "name": "open_date"}, {"type": "uint64", "name": "closure_date"}], "name": "transfer_set_schedule", "returns": {"type": "uint64"}, "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "name": "holding_address"}, {"type": "uint64", "name": "units"}], "name": "primary_distribution", "returns": {"type": "uint64"}, "desc": "Reserve units for a holder before IED finalizes issuance.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "name": "sender_holding_address"}, {"type": "address", "name": "receiver_holding_address"}, {"type": "uint64", "name": "units"}], "name": "transfer", "returns": {"type": "uint64"}, "desc": "Transfer active units after settling both counterparties to the current cursor.\nReturns the number of units moved. The ACTUS kernel no longer persists a nominal per-unit value on-chain, so transfer results are unit-based.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "bool", "desc": "Suspension status", "name": "suspended"}], "name": "account_suspension", "returns": {"type": "uint64", "desc": "Timestamp of the set account suspension status"}, "desc": "Set account suspension status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "address", "desc": "Account Payment Address", "name": "payment_address"}], "name": "account_open", "returns": {"type": "uint64", "desc": "Timestamp of the account opening"}, "desc": "Open a contract account with a new position and register its payment address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "address", "desc": "Account Payment Address", "name": "payment_address"}], "name": "account_update_payment_address", "returns": {"type": "uint64", "desc": "Timestamp of the account update"}, "desc": "Update the Payment Address of an account", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}], "name": "account_get_position", "returns": {"type": "(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64)", "desc": "Account position", "struct": "AccountPosition"}, "desc": "Get account position", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": [], "create": ["NoOp"]}, "args": [{"type": "address", "desc": "D-ASA Arranger Address", "name": "arranger"}], "name": "contract_create", "returns": {"type": "uint64", "desc": "UNIX timestamp of contract creation"}, "desc": "Create a new D-ASA contract and set the Arranger role", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64)", "desc": "Normalized ACTUS terms", "name": "terms", "struct": "NormalizedActusTerms"}, {"type": "(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "desc": "Initial kernel state (pre-IED)", "name": "initial_state", "struct": "InitialKernelState"}, {"type": "(byte[32],string)", "desc": "Prospectus (informational only)", "name": "prospectus", "struct": "Prospectus"}], "name": "contract_config", "returns": {"type": "uint64", "desc": "UNIX timestamp of contract configuration"}, "desc": "Partial contract configuration with: normalized ACTUS terms, initial kernel\nstate (pre-IED), prospectus (informational only). The contract stays inactive until all schedule pages are configured next.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "name": "schedule_page_index"}, {"type": "bool", "name": "is_last_page"}, {"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[]", "name": "schedule_page"}], "name": "contract_schedule", "returns": {"type": "uint64"}, "desc": "Upload one normalized schedule page.\nThe configuration operation is considered complete only when the last page is stored. At that point `schedule_entry_count` is finalized and the contract moves to `STATUS_PENDING_IED`.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "contract_execute_ied", "returns": {"type": "uint64"}, "desc": "Execute the first due `IED` entry and activate the contract.\n`IED` is the one non-cash event that moves the app from `STATUS_PENDING_IED` to `STATUS_ACTIVE`.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "name": "event_id"}, {"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "name": "payload", "struct": "ObservedEventRequest"}], "name": "apply_non_cash_event", "returns": {"type": "uint64"}, "desc": "Apply the next due non-cash event, optionally appending one first.\nObserved payloads are appended before execution when flagged. Rate reset events require the interest oracle because they can change the running nominal rate; other non-cash events stay arranger-controlled.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "name": "payload", "struct": "ObservedCashEventRequest"}], "name": "append_observed_cash_event", "returns": {"type": "uint64"}, "desc": "Append an arranger-authorized observed cash event to the schedule tail.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "contract_get_state", "returns": {"type": "(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "struct": "KernelState"}, "desc": "Return a readonly snapshot of the generic ACTUS kernel state.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "contract_get_next_due_event", "returns": {"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "struct": "ExecutionScheduleEntry"}, "desc": "Return the next boxed schedule entry, or a zeroed sentinel if ended.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["UpdateApplication"], "create": []}, "args": [], "name": "contract_update", "returns": {"type": "void"}, "desc": "Update D-ASA application.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "New Arranger address", "name": "new_arranger"}], "name": "rbac_rotate_arranger", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Rotate the Arranger address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Operation Daemon address", "name": "address"}], "name": "rbac_set_op_daemon", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Non-Normative: Set the Operation Daemon address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}, {"type": "(uint64,uint64)", "desc": "Role time validity", "name": "validity", "struct": "RoleValidity"}], "name": "rbac_assign_role", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Assign a role to an address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}], "name": "rbac_revoke_role", "returns": {"type": "uint64", "desc": "Timestamp of the role revocation"}, "desc": "Revoke a role from an address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Suspension status", "name": "suspended"}], "name": "rbac_contract_suspension", "returns": {"type": "uint64", "desc": "Timestamp of the set asset suspension status"}, "desc": "Set asset suspension status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "rbac_get_arranger", "returns": {"type": "address", "desc": "Arranger address"}, "desc": "Get Arranger address", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Address to get roles for", "name": "address"}], "name": "rbac_get_address_roles", "returns": {"type": "(bool,bool,bool,bool,bool)", "desc": "Roles mask: (Account Manager, Primary Dealer, Trustee, Authority, Observer)"}, "desc": "Non-normative - Get roles assigned to an address", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}], "name": "rbac_get_role_validity", "returns": {"type": "(uint64,uint64)", "desc": "Role validity", "struct": "RoleValidity"}, "desc": "Get role validity", "events": [], "readonly": true, "recommendations": {}}], "name": "DASA", "state": {"keys": {"box": {}, "global": {"arranger": {"key": "UiNBcnJhbmdlciM=", "keyType": "AVMBytes", "valueType": "address"}, "op_daemon": {"key": "UiNPcERhZW1vbiM=", "keyType": "AVMBytes", "valueType": "address"}, "asset_suspended": {"key": "YXNzZXRfc3VzcGVuZGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "asset_defaulted": {"key": "YXNzZXRfZGVmYXVsdGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "status": {"key": "c3RhdHVz", "keyType": "AVMString", "valueType": "AVMUint64"}, "contract_type": {"key": "Y29udHJhY3RfdHlwZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "prospectus_hash": {"key": "cHJvc3BlY3R1c19oYXNo", "keyType": "AVMString", "valueType": "AVMBytes"}, "prospectus_url": {"key": "cHJvc3BlY3R1c191cmw=", "keyType": "AVMString", "valueType": "AVMString"}, "denomination_asset_id": {"key": "ZGVub21pbmF0aW9uX2Fzc2V0X2lk", "keyType": "AVMString", "valueType": "AVMUint64"}, "settlement_asset_id": {"key": "c2V0dGxlbWVudF9hc3NldF9pZA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "initial_exchange_date": {"key": "aW5pdGlhbF9leGNoYW5nZV9kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "maturity_date": {"key": "bWF0dXJpdHlfZGF0ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "transfer_opening_date": {"key": "dHJhbnNmZXJfb3BlbmluZ19kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "transfer_closure_date": {"key": "dHJhbnNmZXJfY2xvc3VyZV9kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "day_count_convention": {"key": "ZGF5X2NvdW50X2NvbnZlbnRpb24=", "keyType": "AVMString", "valueType": "AVMUint64"}, "total_units": {"key": "dG90YWxfdW5pdHM=", "keyType": "AVMString", "valueType": "AVMUint64"}, "reserved_units_total": {"key": "cmVzZXJ2ZWRfdW5pdHNfdG90YWw=", "keyType": "AVMString", "valueType": "AVMUint64"}, "initial_exchange_amount": {"key": "aW5pdGlhbF9leGNoYW5nZV9hbW91bnQ=", "keyType": "AVMString", "valueType": "AVMUint64"}, "outstanding_principal": {"key": "b3V0c3RhbmRpbmdfcHJpbmNpcGFs", "keyType": "AVMString", "valueType": "AVMUint64"}, "next_principal_redemption": {"key": "bmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbg==", "keyType": "AVMString", "valueType": "AVMUint64"}, "dynamic_principal_redemption": {"key": "ZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbg==", "keyType": "AVMString", "valueType": "AVMUint64"}, "interest_calculation_base": {"key": "aW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "accrued_interest": {"key": "YWNjcnVlZF9pbnRlcmVzdA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "nominal_interest_rate": {"key": "bm9taW5hbF9pbnRlcmVzdF9yYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_spread": {"key": "cmF0ZV9yZXNldF9zcHJlYWQ=", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_multiplier": {"key": "cmF0ZV9yZXNldF9tdWx0aXBsaWVy", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_floor": {"key": "cmF0ZV9yZXNldF9mbG9vcg==", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_cap": {"key": "cmF0ZV9yZXNldF9jYXA=", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_next": {"key": "cmF0ZV9yZXNldF9uZXh0", "keyType": "AVMString", "valueType": "AVMUint64"}, "has_rate_reset_floor": {"key": "aGFzX3JhdGVfcmVzZXRfZmxvb3I=", "keyType": "AVMString", "valueType": "AVMUint64"}, "has_rate_reset_cap": {"key": "aGFzX3JhdGVfcmVzZXRfY2Fw", "keyType": "AVMString", "valueType": "AVMUint64"}, "reserved_principal": {"key": "cmVzZXJ2ZWRfcHJpbmNpcGFs", "keyType": "AVMString", "valueType": "AVMUint64"}, "reserved_interest": {"key": "cmVzZXJ2ZWRfaW50ZXJlc3Q=", "keyType": "AVMString", "valueType": "AVMUint64"}, "cumulative_interest_index": {"key": "Y3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "cumulative_principal_index": {"key": "Y3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXg=", "keyType": "AVMString", "valueType": "AVMUint64"}, "event_cursor": {"key": "ZXZlbnRfY3Vyc29y", "keyType": "AVMString", "valueType": "AVMUint64"}, "schedule_entry_count": {"key": "c2NoZWR1bGVfZW50cnlfY291bnQ=", "keyType": "AVMString", "valueType": "AVMUint64"}, "fixed_point_scale": {"key": "Zml4ZWRfcG9pbnRfc2NhbGU=", "keyType": "AVMString", "valueType": "AVMUint64"}}, "local": {}}, "maps": {"box": {"account_manager": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNBY2NvdW50TWFuYWdlciM="}, "primary_dealer": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNQcmltYXJ5RGVhbGVyIw=="}, "trustee": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNUcnVzdGVlIw=="}, "authority": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNBdXRob3JpdHkj"}, "observer": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNPYnNlcnZlciM="}, "schedule_page": {"keyType": "uint64", "valueType": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[]", "prefix": "UyM="}, "account": {"keyType": "address", "valueType": "AccountPosition", "prefix": "UiNBY2NvdW50Iw=="}}, "global": {}, "local": {}}, "schema": {"global": {"bytes": 4, "ints": 37}, "local": {"bytes": 0, "ints": 0}}}, "structs": {"AccountPosition": [{"name": "payment_address", "type": "address"}, {"name": "units", "type": "uint64"}, {"name": "reserved_units", "type": "uint64"}, {"name": "suspended", "type": "bool"}, {"name": "settled_cursor", "type": "uint64"}, {"name": "interest_checkpoint", "type": "uint64"}, {"name": "principal_checkpoint", "type": "uint64"}, {"name": "claimable_interest", "type": "uint64"}, {"name": "claimable_principal", "type": "uint64"}], "CashClaimResult": [{"name": "interest_amount", "type": "uint64"}, {"name": "principal_amount", "type": "uint64"}, {"name": "total_amount", "type": "uint64"}, {"name": "timestamp", "type": "uint64"}, {"name": "context", "type": "byte[]"}], "CashFundingResult": [{"name": "funded_interest", "type": "uint64"}, {"name": "funded_principal", "type": "uint64"}, {"name": "total_funded", "type": "uint64"}, {"name": "processed_events", "type": "uint64"}, {"name": "timestamp", "type": "uint64"}], "ExecutionScheduleEntry": [{"name": "event_id", "type": "uint64"}, {"name": "event_type", "type": "uint8"}, {"name": "scheduled_time", "type": "uint64"}, {"name": "accrual_factor", "type": "uint64"}, {"name": "redemption_accrual_factor", "type": "uint64"}, {"name": "next_nominal_interest_rate", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "next_outstanding_principal", "type": "uint64"}, {"name": "flags", "type": "uint64"}], "InitialKernelState": [{"name": "status_date", "type": "uint64"}, {"name": "event_cursor", "type": "uint64"}, {"name": "outstanding_principal", "type": "uint64"}, {"name": "interest_calculation_base", "type": "uint64"}, {"name": "nominal_interest_rate", "type": "uint64"}, {"name": "accrued_interest", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "cumulative_interest_index", "type": "uint64"}, {"name": "cumulative_principal_index", "type": "uint64"}], "KernelState": [{"name": "contract_type", "type": "uint8"}, {"name": "status", "type": "uint64"}, {"name": "total_units", "type": "uint64"}, {"name": "reserved_units_total", "type": "uint64"}, {"name": "initial_exchange_amount", "type": "uint64"}, {"name": "event_cursor", "type": "uint64"}, {"name": "schedule_entry_count", "type": "uint64"}, {"name": "outstanding_principal", "type": "uint64"}, {"name": "interest_calculation_base", "type": "uint64"}, {"name": "nominal_interest_rate", "type": "uint64"}, {"name": "accrued_interest", "type": "uint64"}, {"name": "cumulative_interest_index", "type": "uint64"}, {"name": "cumulative_principal_index", "type": "uint64"}, {"name": "reserved_interest", "type": "uint64"}, {"name": "reserved_principal", "type": "uint64"}], "NormalizedActusTerms": [{"name": "contract_type", "type": "uint8"}, {"name": "denomination_asset_id", "type": "uint64"}, {"name": "settlement_asset_id", "type": "uint64"}, {"name": "total_units", "type": "uint64"}, {"name": "notional_principal", "type": "uint64"}, {"name": "initial_exchange_amount", "type": "uint64"}, {"name": "initial_exchange_date", "type": "uint64"}, {"name": "maturity_date", "type": "uint64"}, {"name": "day_count_convention", "type": "uint8"}, {"name": "rate_reset_spread", "type": "uint64"}, {"name": "rate_reset_multiplier", "type": "uint64"}, {"name": "rate_reset_floor", "type": "uint64"}, {"name": "rate_reset_cap", "type": "uint64"}, {"name": "rate_reset_next", "type": "uint64"}, {"name": "has_rate_reset_floor", "type": "bool"}, {"name": "has_rate_reset_cap", "type": "bool"}, {"name": "dynamic_principal_redemption", "type": "bool"}, {"name": "fixed_point_scale", "type": "uint64"}], "ObservedCashEventRequest": [{"name": "event_id", "type": "uint64"}, {"name": "event_type", "type": "uint8"}, {"name": "scheduled_time", "type": "uint64"}, {"name": "accrual_factor", "type": "uint64"}, {"name": "redemption_accrual_factor", "type": "uint64"}, {"name": "next_nominal_interest_rate", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "next_outstanding_principal", "type": "uint64"}, {"name": "flags", "type": "uint64"}], "ObservedEventRequest": [{"name": "event_id", "type": "uint64"}, {"name": "event_type", "type": "uint8"}, {"name": "scheduled_time", "type": "uint64"}, {"name": "accrual_factor", "type": "uint64"}, {"name": "redemption_accrual_factor", "type": "uint64"}, {"name": "observed_rate", "type": "uint64"}, {"name": "next_nominal_interest_rate", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "next_outstanding_principal", "type": "uint64"}, {"name": "flags", "type": "uint64"}], "Prospectus": [{"name": "hash", "type": "byte[32]"}, {"name": "url", "type": "string"}], "RoleValidity": [{"name": "role_validity_start", "type": "uint64"}, {"name": "role_validity_end", "type": "uint64"}]}, "byteCode": {"approval": "DCAFAAEIINwLJjEEFR98dQZzdGF0dXMMZXZlbnRfY3Vyc29yFHNjaGVkdWxlX2VudHJ5X2NvdW50FW91dHN0YW5kaW5nX3ByaW5jaXBhbBFmaXhlZF9wb2ludF9zY2FsZRBhY2NydWVkX2ludGVyZXN0GWludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UKUiNBY2NvdW50IxVub21pbmFsX2ludGVyZXN0X3JhdGUNY29udHJhY3RfdHlwZRRyZXNlcnZlZF91bml0c190b3RhbBJyZXNlcnZlZF9wcmluY2lwYWwLdG90YWxfdW5pdHMZbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbhFyZXNlcnZlZF9pbnRlcmVzdBljdW11bGF0aXZlX2ludGVyZXN0X2luZGV4GmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4C1IjQXJyYW5nZXIjE3NldHRsZW1lbnRfYXNzZXRfaWQXaW5pdGlhbF9leGNoYW5nZV9hbW91bnQMUiNBdXRob3JpdHkjEFIjUHJpbWFyeURlYWxlciMRUiNBY2NvdW50TWFuYWdlciMCUyMLUiNPYnNlcnZlciMLUiNPcERhZW1vbiMVaW5pdGlhbF9leGNoYW5nZV9kYXRlFXRyYW5zZmVyX29wZW5pbmdfZGF0ZRV0cmFuc2Zlcl9jbG9zdXJlX2RhdGUQcmF0ZV9yZXNldF9mbG9vcg5yYXRlX3Jlc2V0X2NhcApSI1RydXN0ZWUjD2Fzc2V0X3N1c3BlbmRlZBxkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uEXJhdGVfcmVzZXRfc3ByZWFkFXJhdGVfcmVzZXRfbXVsdGlwbGllcg9yYXRlX3Jlc2V0X25leHQUaGFzX3JhdGVfcmVzZXRfZmxvb3ISaGFzX3JhdGVfcmVzZXRfY2FwAQAPYXNzZXRfZGVmYXVsdGVkD3Byb3NwZWN0dXNfaGFzaA5wcm9zcGVjdHVzX3VybBVkZW5vbWluYXRpb25fYXNzZXRfaWQNbWF0dXJpdHlfZGF0ZRRkYXlfY291bnRfY29udmVudGlvbgMGgQECAAAxGEAArScSMgNnJxoyA2cnISJnJykiZykiZycKImcnKoAAZycrgABnJywiZycTImcnGyJnJy0iZyccImcnHSJnJy4iZycNImcnCyJnJxQiZycEImcnDiJnJyIiZycHImcnBiJnJwkiZycjImcnJCJnJx4iZycfImcnJSJnJyYiZycnImcnDCJnJw8iZycQImcnESJnKiJnKyJnJwUiZzE1gQQSRDE0gSUSRDE3FEQxNhREgASRTwTrNhoAjgEAxzEZFEQxGEEAsIIYBLRGGMgE54MlKQSUOIcjBGyF4+4EvdGpRAR8DxgSBBT8EO8EdKcpfwQJ1P4UBJqb+oUEhe7TPQSrLA/EBNnyJawEmINQWgSOpudMBAKvVXoEgvcbLQTvBPXTBN80NVAEPb6AvQQePkjnBAEMgpkEdAas0gQacqLuNhoAjhgAVgMhBH0EpwUxBiEGWwazBuYHFAkICh8KmAwEDPYNiQ3ODeYN/g6zD0kPaA9zD70AgASVbXFWNhoAjgEG8QAxGYEEEjEYEERCDa6KAgCL/oEKCIsAMgwNQQAqsYEGshCBBbIZJy+yHicvsh+L/40CAAsABLNC/9syALIBQv/1IrIBQv/viSKAAEcNNhoBSRUkEkQXIillRESIFZ6IFaWIFaoiKWVEgTISFESIEgFBAAtJgWQLIQQIIoj/jyJFBSJFDiJFDUsESwEMQQJZIiplRCIrZUQMQQJNIiplRIgQ00lFEYEJW0lFAzIHDUACN0sPJFVJRRAkEklFBEAAEEsOgQMSQAAISw6BExJBAj8jQQIUSw8iWyIqZUQSREsBMgcOREsCQAHtSw6BExJAAeUiRQtLDyRVSUUQgQMSQAFlSw6BExJAAV0iRQZLD4ExW0UIiBFbQAD+SwdFCUsKiBAZSwaIEBRLAYgQLklOAkUPSYgQJUlFC0sCSwEISUUJMgoiJxNlRHAARCInD2VEIicMZURLAQhLAksBD0RPAkwJTwIPRE8DCCcPTGciJwxlRAgnDExnIicQZURPAggnEExnIicRZUQIJxFMZ0sPJFWBAxJBAHoiJwZlREsQiBDnRRIIJwZMZ4gQx0EACksPJFWBExJBAAlLD4EpWycOTGcnBEsIZycHSwlnIiplRCMIKkxnSw9XCAGAAROoQQARIicEZURAAAkpgcgBZycHImdLD0sESYgTVEhLDUsMCEUOSwxLBwhFDUsEIwhFBUL+dycGImdC/5BLDyRVSUUQgQMSQQAQIicEZURLBglJRQlFCUL+6UsOJBJBABMiJwRlTEUJRCInB2VMRQpEQv7PSw6BExJAAAdLB0UJQv7AIkUIIkUJQv63iBAIQQBWSw6BExJBAAoiJwRlREUGQv6OIicGZURLEIgP/0USCElFCyInDmVED0EABiJFBkL+byInDmVESwoJSUUIIicEZUQNQQAKIicEZURFBkL+UUsGRQZC/kpLD4ExWyInBGVESg5ETAlFBkL+NiInBmVESxCID6dFEghFC0L+DEsESURLDklLD0lOAwgyB08CFk8DFlBPAhZQTwIWUEwWUChMULAjQyJC/b6AAEcCNhoBRwIVJRJENhoCSSJZgQIISwEVEkRXAgBMIillREQnCExQSb1FAUQiJxplRDIDE0EAIjEAIicaZUQSQAAVMQBLAxJAAA0xAEsBvkRXACASQQEAI0SIEpaIEpsiKWVEgTISFERLAkmIDUuIDM5GAkm+REmBSVtJTgJFCEmBUVtJRQhPAghJRQZEVwAgIicTZURwAEUBQQC3Sb5EgYADU0AArSNBAHgyCiInE2VETEsBcABESwVJTgIPREsCSU4DvkRJVwAgsTIATwOyEkyyFE8CshGBBLIQsgGzSYFJW0lOAkUJSYFRW0lOA0UJIhZMSwFcSUxcUU8DTL8iJw9lRElLAg9EIicMZURLAw9ETAknD0xnIicMZURMCScMTGdLBUlLBklOAwgyB08CFk8DFlBPAhZQTBZQSwJJFRZXBgJMUEyAAgAiUExQKExQsCNDIkL/UCJC/v02GgFJFSQSRBc2GgJJFSQSRBeIEXhKDEQnHE8CZycdTGcyBxYoTFCwI0M2GgFJFSUSRDYaAkkVJBJEF0lOAiIpZUREJxYxAIgRD0SIEUmIEU4iKWVEgTISRCcISwJQSU4DvUUBREyIC2pJRCInC2VECCInDWVEDkQiJxtlREEACTIHIicbZUQOREcCvkSBKFtLA0lOAwgWgShMuyInC2VECCcLSwFnIicNZURMCRYoTFCwI0MiSTYaAUkVJRJENhoCSRUlEkQ2GgNHAhUkEkQXIillRESIEL+IEMQiKWVEgTISFEQiJxxlREEACSInHGVEMgcORCInHWVEQQAJMgciJx1lRAxEMQBLBElOAhJEJwhLAVBJRQhJvUUBRCcISwVJTgJQSUUJvUUBREsCiAqjSYgKn08CE0RLAUlETL5EJVsORCIqZUQiK2VED0AADiIqZUSIC7CBCVsyBw1ESwNJiAr7SwNJTgKICvOICnZGAogKcUYCSwVJvkQlW0sCSU4CSwEOREsBCRZPAiVPArtLBUm+RCVbTwIIFiVMuyhLAlCwI0M2GgFJFSUSRDYaAkkVIxJEIlMnFTEAiA+cRCcITwJQSb1FAURJgTAjuiJPA1SBMEy7MgcWKExQsCNDNhoBSRUlEkQ2GgJJFSUSRCcXMQCID2REIillRIHIARIURIgPlIgPmScITwJQSb1FARREIhZPAksBUEsBUCcoUEsBUEsBUEsBUEsBUExQvzIHFihMULAjQzYaAUkVJRJENhoCSRUlEkQnCEsCUEm9RQFEMQBPAxJEiA8+iA9DIk8CuzIHFihMULAjQzYaAUkVJRJEJwhMUEm9RQFEvkgoTFCwI0M2GgFJFSUSRCcSTGcyBxYoTFCwI0OAAEk2GgFHAhWBaxJENhoCSU4CFYFIEkQ2GgNJTgJJFUsBJVlJgSISRE8CTEsCUklOAyJZgSQIEkSIDroiVUknCksBZ0EAIkkjEkAAHEmBAhJAABVJgQMSQAAOSYEEEkAAB0mBBRJBAYcjRCInCmVMRQJESwRJgSFbSUUIRIE5VUlFCEEAH0sGIxJAABhLBoECEkAAEEsGgQMSQAAISwaBBBJBAUcjREkjE0EACEsEgZIGUxREIillRBREIicUZUQUREsESSNbSXELRQFEJyxLAWdLAYEJW0lPAhJEJxNLAWexMgAyCiKyErIUTLIRgQSyELIBs0mBEVsnDUxnJwsiZycuSwhnSYEpWycbSwFnSwGBMVsnLUsBZ0sGSU4CgTBbJw5MZycUSwpnSwOBkgZTJyJMZ0sBgRBbJwRMZ0sBgShbJwZMZ0sBJVsnCUxnSwGBGFsnB0xnSwOBOlsnI0xnSwOBQlsnJExnSwOBSlsnHkxnSwOBUlsnH0xnSwOBWlsnJUxnSwOBkAZTJyZMZ0sDgZEGUycnTGdPA4FjWycFTGdLASRbKkxnSwGBOFsnEExnSwGBQFsnEUxnJw8iZycMImdLAjIHDURMIltLAgxEDERLAlcAICcqTGdLAVcCACcrTGcyBxYoTFCwI0MiQv62IkL+diKAAEcCNhoBSRUkEkQXSTYaAkkVIxJEIlNMNhoDSU4CSSJZSU4DSYFBC4ECCE8CFRJEiAzNIicKZUxOA0QiKWVEFERJgRAORCInFGVEREyBEAtMgWQLIQQIIoj2tiJJSwQMQQCLSwRXAgBJRQxLAUlOAoFBC4FBWEkkVUlOAkUNSSJbSUUNSwVPBAhLARJESwVPA4gIGUyBCVtJRQpEQQAXSUEAJUkjCYFBC0sLTIFBWIEJW0sIDkRLCEAABUsJIxJESSMIRQFC/5RLBklEIwkWJxhMUEm9RQFESSKBAroXSUQjCYFBC4ECCIFBukL/wUsGFicYTFBJvEhLBb9LBUEADEsBSwQIK0xnKYEyZzIHFihMULAjQyIpZUREiAvjiAvqiAvvIiplRCIrZURLAQ1EiAdHSVcIAUmAAQGoREsBVwAISwJXCQhLA1cRCEsEVxkISwVXIQhLBlcpCEsHVzEISwhXOQhPB08IUE8HUE8GUE8FUCIWUE8EUE8DUE8CUExQiAh5RgIyBxYoTFCwI0MiRwSAAEk2GgFJFSQSRBc2GgJHAhWBSRJEIillRESIC1uIC2CBQVtJgQQaQQCwIicKZUSBBRJEiAs4IicKZURJgQUSREsCSSJbSUUHIitlRBJESVcIAUUMJFWIBsIiK2VEgRAKJzBFBxYnGExQSUUJvUUBQQAHSwe+TEUHREsFSSJZSYEQDERLA0lXCQhLAVcRCEsCVxkISwNXKQhLBFcxCE8FVzkISwsWSxJQTwZQTwVQTwRQTwNQTwJQTFBLAxZQTwJMUEwjCBZXBgJcAEsISbxITL8iK2VEIwgrTGciKmVESwNJTwISRIgF/0lFCElXCAFFCiRVSUUGIxJAAChLBIEEEkAAIEsEgQwSQAAYSwSBCxJAABBLBIESEkAACEsEgQUSQQBBI0RLCIABAalESwSBDBJAAAhLBIELEkEAJCNBABonGTEAiAnzREsGSwKIBxtGAjIHFihMULAjQ4gKEUL/6CJC/9kiQv+8Ikk2GgFHAhWBQRJEIillRESICfKICfmICf4iKWVEgTISFEQiJwplRIEFEkRJIltJTgIiK2VETEsBEkRLAVcIAUlOA4ABA6hETIE5W0lOAiMaREEAEyIrZUQjCYgFIYEJW0sEgQlbDkQiK2VEgRAKJzBFBhYnGExQSUUHvUUBQQAHSwW+TEUGREsESSJZSYEQDERLBUlXCQhLAVcRCEsCVxkISwNXIQhLBFcpCE8FVzEISwoWSwpQTwZQTwVQTwRQTwNQTwJQTFBLAxZQTwJMUEwjCBZXBgJcAEsGSbxITL8iK2VEIwgrTGcyBxYoTFCwI0MiKWVESUQiJwplRBZJkyQORFcHASInDWVEIicLZUQiJxRlRCIqZUQiK2VEIicEZUQiJwdlRCInCWVEIicGZUQiJxBlRCInEWVEIicPZUQiJwxlRE8OFk8OTFBPDRZQTwwWUE8LFlBPChZQTwkWUE8IFlBPBxZQTwYWUE8FFlBPBBZQTwMWUE8CFlBMFlAoTFCwI0MiKWVERCIqZUQiK2VED0EAJSIqZUQWJyhQIhZMSwFQSwFQSwFQSwFQSwFQSwFQTFAoTFCwI0MiKmVEiAO9Qv/wiAg+I0M2GgFJFSUSRIgIMScSTGcyBxYoTFCwI0M2GgFJFSUSRIgIGScaTGcyBxYoTFCwI0M2GgFJFSMSRDYaAklOAhUlEkQ2GgNJTgIVgRASRIgH7IgH8xdHAogH/YEUEkEADicSSwNnMgcWKExQsCNDSYEoEkEAEScXSwNQSb1FARRESwK/Qv/fSYEyEkEAEScWSwNQSb1FARRESwK/Qv/HSYE8EkEAEScgSwNQSb1FARRESwK/Qv+vSYFGEkEAEScVSwNQSb1FARRESwK/Qv+XSYFQEkH/kCcZSwNQSb1FARRESwK/Qv9/NhoBSRUjEkQ2GgJJTgIVJRJEiAdCiAdJF0cCiAdTSYEUE0SBKBJBABUnF0sCUEm9RQFEvEgyBxYoTFCwI0NJgTISQQAPJxZLAlBJvUUBRLxIQv/hSYE8EkEADycgSwJQSb1FAUS8SEL/y0mBRhJBAA8nFUsCUEm9RQFEvEhC/7VJgVASQf+uJxlLAlBJvUUBRLxIQv+fNhoBSRUjEkQiUycVMQCIBnxEJyFMZzIHFihMULAjQyInEmVEKExQsCNDNhoBSRUlEkQnF0sBiAZUJxZLAogGTScgSwOIBkYnFUsEiAY/JxlPBYgGOCcoIk8GVCNPBVSBAk8EVIEDTwNUgQRPAlQoTFCwI0M2GgFJFSMSRDYaAklOAhUlEkQXSYgGUIMGFCgyPEZQTwaOBgBPAEAAMQAiABMAAQAnGUsBUEm9RQFEvkgoTFCwI0MnFUsBUEm9RQFEvkhC/+snIEsBUEm9RQFEvkhC/9wnFksBUEm9RQFEvkhC/80nF0sBUEm9RQFEvkhC/76AEAAAAAAAAAAAAAAAAAAAAABC/6mKAQAnCIv/UL5EgYADUxREiYoBAicIi/9QSb1FAURJvkgiJxBlREsBgTlbCSInEWVESwKBQVsJSwIlWyInBWVETwNLAk8CiACYIicFZURPA08DTwKIAIpLAoFJW0sCCBZPA0xcSUmBUVtLAggWXFEiJxBlRBZcOSInEWVEFlxBIiplRBZcMU8DTL+JigEAIoAAJwiL/1BJvUUBRCIpZUSBMhJBAAGJiwK+TElOAowARIEoW0mMAUAAAYmLAEklW4sBSU4DCBZcICIWXCiLAky/IicLZURJSwIPREwJJwtMZ4mKAwGL/UEABYv+QAACIomL/Yv+HYv/l4mKAQGL/0AAAiKJIicNZURJRCInBWVEi/9MTwKI/8qJigEBi/9AAAIiiSInDWVEIicFZUSL/0yI/6+JigEBIitlRIv/DUSL/4EQChYnGExQSb1FAUSL/4EQGEsBIoECuhdLAQ1EgUELgQIIgUG6iYoCAIv/IxJAAB+L/yQSQAAYi/+BExJAABCL/4EMEkAACIv/gQsSQQADI0SJi/5AAAQiQv/1i/6BAxJAAAiL/oECEkEAGIv/gQMSQAAIi/+BEhJBAAQjQv/RIkL/zYv+IxJBACCL/4EDEkAAEIv/gRISQAAIi/+BBRJBAAQjQv+qIkL/pov+gQQSQQAoi/+BAxJAABiL/4EEEkAAEIv/gRISQAAIi/+BBRJBAAQjQv96IkL/dov+gQUSQQAIi/+BAxJC/2YiQv9iIicKZUQjEkEACiInImVEQQACI4kiiYoBAov/gRFbSUEAECInCWVEQQAIIicHZURAAAYii/9PAokiJwdlRCInCWVEIicFZUSI/mgiJwVlRIsATIj+XYv/TwKJigIBi/9AAAOL/okiJwVlRCInCWVEi/9LAoj+PAhJRCInBWVEi/5MTwKI/iyJigICIoAARwiL/iJbIiplRBJEi/6BCVsyBw5Ei/4kVUkjEklBAF4iKWVEgTISRCInC2VEIicNZUQSRIv+gTFbJwRLAWcnB0xni/6BIVsnCUxnJwYiZ4v+gSlbJw5MZyIqZUQjCCpMZymBZGeLC0QiJxRlRIv+TCKIAdpJjP6L/4wBjACJIillRIEyEhREIicGZUSL/oj++Iz+CCcGTGeLCoEMEkEBeIv/gSFbIickZUQiJwVlRIj9cyInI2VECIwGIicmZURBABMiJx5lRIsGDUEACCInHmVMjAZEIicnZURBABMiJx9lRIsGDEEACCInH2VMjAZEJwmLBmeLCoEEEkEBB4v+gTFbJwRLAWcnB0xniP5lQQDniwqBBRJBAMUiK2VEIiplRAmBZAshBAgiiOvjIicFZUyMAkQijAEijAeL/oEZW0mMCEEAD4sCiwiI/oFJjAIjjAeMASIqZUQjCIwDIitlRIsDDUEAUosDiP0MSYwAJFVJjASBAxJAABCLBIETEkEAM4sAgRlbQQArI0EACIsHQQAMIowHiwMjCIwDQv++iwCBGVuLAkyI/iRJjAKLAQiMAUL/4SJC/9KLAUQiJwRlRIv+gTlbJBpAAAYiJwZlRAgiJwVlRIsBiPxLJw5MZyIqZUQjCCpMZ4v+IkmIAGBJjP6L/4wBjACJi/6BKVsnDkxnQv/aiwqBEhJB/v8iJwRlRCcHTGdC/vOLCoELEkEAG4v+gSFbSYwFQAAIIiclZUyMBUQnCYsFZ0L+uov+gSFbSYwJQf6vJwmLCWdC/qeKAwEyCIv9IluL/VcIAYv9VwkIMgeL/SRVi/5AAEUjFkmTJA5EVwcBIicTZUSLAUkjCIsAFk8CFlCLAlCLA1CLBBZQi/4WUE8DUIv/FlBPAhZQTBZQgASaMyuVTFCwi/2MAImLBSMSQAAIiwWBBBJBAAQjQv+pgf8BQv+jigIBgACL/ov/UEm9RQFBAB+LAb5EIlsyB0mMAA5BABCLAb5EJFuLAA9BAAQjjACJIkL/+TEAIicSZUQSRIkiJyllRBREiSInIWVEFESJigEAi/+BFBJAADCL/4EZEkAAKIv/gSgSQAAgi/+BMhJAABiL/4E8EkAAEIv/gUYSQAAIi/+BUBJBAAMjRIkiQv/6", "clear": "DIEBQw=="}, "desc": "Debt Algorand Standard Application.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "networks": {}, "source": {"approval": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCAzMiAxNTAwCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUgInN0YXR1cyIgImV2ZW50X2N1cnNvciIgInNjaGVkdWxlX2VudHJ5X2NvdW50IiAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIiAiZml4ZWRfcG9pbnRfc2NhbGUiICJhY2NydWVkX2ludGVyZXN0IiAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIgMHg1MjIzNDE2MzYzNmY3NTZlNzQyMyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIiAiY29udHJhY3RfdHlwZSIgInJlc2VydmVkX3VuaXRzX3RvdGFsIiAicmVzZXJ2ZWRfcHJpbmNpcGFsIiAidG90YWxfdW5pdHMiICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIiAicmVzZXJ2ZWRfaW50ZXJlc3QiICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IiAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiIDB4NTIyMzQxNzI3MjYxNmU2NzY1NzIyMyAic2V0dGxlbWVudF9hc3NldF9pZCIgImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IiAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzIDB4NTIyMzQxNjM2MzZmNzU2ZTc0NGQ2MTZlNjE2NzY1NzIyMyAweDUzMjMgMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzIDB4NTIyMzRmNzA0NDYxNjU2ZDZmNmUyMyAiaW5pdGlhbF9leGNoYW5nZV9kYXRlIiAidHJhbnNmZXJfb3BlbmluZ19kYXRlIiAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIiAicmF0ZV9yZXNldF9mbG9vciIgInJhdGVfcmVzZXRfY2FwIiAweDUyMjM1NDcyNzU3Mzc0NjU2NTIzICJhc3NldF9zdXNwZW5kZWQiICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIiAicmF0ZV9yZXNldF9zcHJlYWQiICJyYXRlX3Jlc2V0X211bHRpcGxpZXIiICJyYXRlX3Jlc2V0X25leHQiICJoYXNfcmF0ZV9yZXNldF9mbG9vciIgImhhc19yYXRlX3Jlc2V0X2NhcCIgMHgwMCAiYXNzZXRfZGVmYXVsdGVkIiAicHJvc3BlY3R1c19oYXNoIiAicHJvc3BlY3R1c191cmwiICJkZW5vbWluYXRpb25fYXNzZXRfaWQiICJtYXR1cml0eV9kYXRlIiAiZGF5X2NvdW50X2NvbnZlbnRpb24iIDB4MDY4MTAxIDB4MDAwMAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4LTI5CiAgICAvLyAjIFJCQUMgUm9sZXMKICAgIC8vIHNlbGYuYXJyYW5nZXIgPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX0FSUkFOR0VSKQogICAgYnl0ZWMgMTggLy8gMHg1MjIzNDE3MjcyNjE2ZTY3NjU3MjIzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzAKICAgIC8vIHNlbGYub3BfZGFlbW9uID0gR2xvYmFsU3RhdGUoQWNjb3VudCgpLCBrZXk9Y3N0LlBSRUZJWF9JRF9PUF9EQUVNT04pCiAgICBieXRlYyAyNiAvLyAweDUyMjM0ZjcwNDQ2MTY1NmQ2ZjZlMjMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo0Ny00OAogICAgLy8gIyBELUFTQSBHb3Zlcm5hbmNlCiAgICAvLyBzZWxmLmFzc2V0X3N1c3BlbmRlZCA9IEZhbHNlCiAgICBieXRlYyAzMyAvLyAiYXNzZXRfc3VzcGVuZGVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NDkKICAgIC8vIHNlbGYuYXNzZXRfZGVmYXVsdGVkID0gRmFsc2UKICAgIGJ5dGVjIDQxIC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU2LTU3CiAgICAvLyAjIENvbnRyYWN0CiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwLTYxCiAgICAvLyAjIFByb3NwZWN0dXMgKEluZm9ybWF0aW9uYWwpCiAgICAvLyBzZWxmLnByb3NwZWN0dXNfaGFzaCA9IEJ5dGVzKCkKICAgIGJ5dGVjIDQyIC8vICJwcm9zcGVjdHVzX2hhc2giCiAgICBwdXNoYnl0ZXMgMHgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MgogICAgLy8gc2VsZi5wcm9zcGVjdHVzX3VybCA9IFN0cmluZygpCiAgICBieXRlYyA0MyAvLyAicHJvc3BlY3R1c191cmwiCiAgICBwdXNoYnl0ZXMgIiIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NC02NQogICAgLy8gIyBEZW5vbWluYXRpb24KICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gQXNzZXQoKQogICAgYnl0ZWMgNDQgLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjYKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCA9IEFzc2V0KCkKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OC02OQogICAgLy8gIyBUaW1lCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgMjcgLy8gImluaXRpYWxfZXhjaGFuZ2VfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzAKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgNDUgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxCiAgICAvLyBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgMjggLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIKICAgIC8vIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlID0gdHlwLlRpbWVTdGFtcCgpCiAgICBieXRlYyAyOSAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NC03NQogICAgLy8gIyBEYXkgQ291bnQgQ29udmVudGlvbgogICAgLy8gc2VsZi5kYXlfY291bnRfY29udmVudGlvbiA9IFVJbnQ2NCgpCiAgICBieXRlYyA0NiAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc3LTc4CiAgICAvLyAjIFVuaXRzCiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzID0gVUludDY0KCkKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPSBVSW50NjQoKQogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MS04MgogICAgLy8gIyBQcmluY2lwYWwKICAgIC8vIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPSBVSW50NjQoKQogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MwogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBVSW50NjQoKQogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NAogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gVUludDY0KCkKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NQogICAgLy8gc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gRmFsc2UKICAgIGJ5dGVjIDM0IC8vICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4Ny04OAogICAgLy8gIyBJbnRlcmVzdAogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gVUludDY0KCkKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg5CiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgPSBVSW50NjQoKQogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTEtOTIKICAgIC8vICMgSW50ZXJlc3QgUmF0ZXMKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTMKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQgPSBVSW50NjQoKQogICAgYnl0ZWMgMzUgLy8gInJhdGVfcmVzZXRfc3ByZWFkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NAogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIgPSBVSW50NjQoKQogICAgYnl0ZWMgMzYgLy8gInJhdGVfcmVzZXRfbXVsdGlwbGllciIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTUKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9mbG9vciA9IFVJbnQ2NCgpCiAgICBieXRlYyAzMCAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTYKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9jYXAgPSBVSW50NjQoKQogICAgYnl0ZWMgMzEgLy8gInJhdGVfcmVzZXRfY2FwIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NwogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X25leHQgPSBVSW50NjQoKQogICAgYnl0ZWMgMzcgLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTgKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgPSBGYWxzZQogICAgYnl0ZWMgMzggLy8gImhhc19yYXRlX3Jlc2V0X2Zsb29yIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OQogICAgLy8gc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgPSBGYWxzZQogICAgYnl0ZWMgMzkgLy8gImhhc19yYXRlX3Jlc2V0X2NhcCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAxLTEwMgogICAgLy8gIyBQcmltYXJ5IERpc3RyaWJ1dGlvbgogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgPSBVSW50NjQoKQogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAzCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0ID0gVUludDY0KCkKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA1LTEwNgogICAgLy8gIyBDdW11bGF0aXZlIFBlci1Vbml0IEZpeGVkLVBvaW50IEluZGV4ZXMKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4ID0gVUludDY0KCkKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1CiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciA9IFVJbnQ2NCgpCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNgogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA9IFVJbnQ2NCgpCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE4LTExOQogICAgLy8gIyBTY2FsaW5nCiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlID0gVUludDY0KCkKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6MjMKICAgIC8vIGFzc2VydCBUeG4uZ2xvYmFsX251bV9ieXRlX3NsaWNlID09IGNmZy5HTE9CQUxfQllURVMsIGVyci5XUk9OR19HTE9CQUxfQllURVMKICAgIHR4biBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgQnl0ZXMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjI0CiAgICAvLyBhc3NlcnQgVHhuLmdsb2JhbF9udW1fdWludCA9PSBjZmcuR0xPQkFMX1VJTlRTLCBlcnIuV1JPTkdfR0xPQkFMX1VJTlRTCiAgICB0eG4gR2xvYmFsTnVtVWludAogICAgcHVzaGludCAzNwogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgVUludHMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBhc3NlcnQgVHhuLmxvY2FsX251bV9ieXRlX3NsaWNlID09IGNmZy5MT0NBTF9CWVRFUywgZXJyLldST05HX0xPQ0FMX0JZVEVTCiAgICB0eG4gTG9jYWxOdW1CeXRlU2xpY2UKICAgICEKICAgIGFzc2VydCAvLyBXcm9uZyBMb2NhbCBCeXRlcyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6MjYKICAgIC8vIGFzc2VydCBUeG4ubG9jYWxfbnVtX3VpbnQgPT0gY2ZnLkxPQ0FMX1VJTlRTLCBlcnIuV1JPTkdfTE9DQUxfVUlOVFMKICAgIHR4biBMb2NhbE51bVVpbnQKICAgICEKICAgIGFzc2VydCAvLyBXcm9uZyBMb2NhbCBVSW50cyBhbGxvY2F0aW9uCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kX2FzYS9jb250cmFjdC5weTo4LTE4CiAgICAvLyBjbGFzcyBEQVNBKAogICAgLy8gICAgIFBheW1lbnRBZ2VudCwKICAgIC8vICAgICBUcmFuc2ZlckFnZW50LAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gICAgIGF2bV92ZXJzaW9uPTEyLAogICAgLy8gKToKICAgIHB1c2hieXRlcyAweDkxNGYwNGViIC8vIG1ldGhvZCAiY29udHJhY3RfdXBkYXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9jb250cmFjdF91cGRhdGVfcm91dGVANAoKbWFpbl9zd2l0Y2hfY2FzZV9uZXh0QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6OC0xOAogICAgLy8gY2xhc3MgREFTQSgKICAgIC8vICAgICBQYXltZW50QWdlbnQsCiAgICAvLyAgICAgVHJhbnNmZXJBZ2VudCwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBhdm1fdmVyc2lvbj0xMiwKICAgIC8vICk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBieiBtYWluX2NyZWF0ZV9Ob09wQDMyCiAgICBwdXNoYnl0ZXNzIDB4YjQ0NjE4YzggMHhlNzgzMjUyOSAweDk0Mzg4NzIzIDB4NmM4NWUzZWUgMHhiZGQxYTk0NCAweDdjMGYxODEyIDB4MTRmYzEwZWYgMHg3NGE3Mjk3ZiAweDA5ZDRmZTE0IDB4OWE5YmZhODUgMHg4NWVlZDMzZCAweGFiMmMwZmM0IDB4ZDlmMjI1YWMgMHg5ODgzNTA1YSAweDhlYTZlNzRjIDB4MDJhZjU1N2EgMHg4MmY3MWIyZCAweGVmMDRmNWQzIDB4ZGYzNDM1NTAgMHgzZGJlODBiZCAweDFlM2U0OGU3IDB4MDEwYzgyOTkgMHg3NDA2YWNkMiAweDFhNzJhMmVlIC8vIG1ldGhvZCAiZnVuZF9kdWVfY2FzaGZsb3dzKHVpbnQ2NCkodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImNsYWltX2R1ZV9jYXNoZmxvd3MoYWRkcmVzcyxieXRlW10pKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxieXRlW10pIiwgbWV0aG9kICJ0cmFuc2Zlcl9zZXRfc2NoZWR1bGUodWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInByaW1hcnlfZGlzdHJpYnV0aW9uKGFkZHJlc3MsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidHJhbnNmZXIoYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgImFjY291bnRfc3VzcGVuc2lvbihhZGRyZXNzLGJvb2wpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X29wZW4oYWRkcmVzcyxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAiYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzKGFkZHJlc3MsYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgImFjY291bnRfZ2V0X3Bvc2l0aW9uKGFkZHJlc3MpKGFkZHJlc3MsdWludDY0LHVpbnQ2NCxib29sLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJjb250cmFjdF9jb25maWcoKHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LGJvb2wsYm9vbCxib29sLHVpbnQ2NCksKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSwoYnl0ZVszMl0sc3RyaW5nKSl1aW50NjQiLCBtZXRob2QgImNvbnRyYWN0X3NjaGVkdWxlKHVpbnQ2NCxib29sLCh1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KVtdKXVpbnQ2NCIsIG1ldGhvZCAiY29udHJhY3RfZXhlY3V0ZV9pZWQoKXVpbnQ2NCIsIG1ldGhvZCAiYXBwbHlfbm9uX2Nhc2hfZXZlbnQodWludDY0LCh1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkpdWludDY0IiwgbWV0aG9kICJhcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudCgodWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkpdWludDY0IiwgbWV0aG9kICJjb250cmFjdF9nZXRfc3RhdGUoKSh1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAiY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50KCkodWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgInJiYWNfcm90YXRlX2FycmFuZ2VyKGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX3NldF9vcF9kYWVtb24oYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgInJiYWNfYXNzaWduX3JvbGUodWludDgsYWRkcmVzcywodWludDY0LHVpbnQ2NCkpdWludDY0IiwgbWV0aG9kICJyYmFjX3Jldm9rZV9yb2xlKHVpbnQ4LGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX2NvbnRyYWN0X3N1c3BlbnNpb24oYm9vbCl1aW50NjQiLCBtZXRob2QgInJiYWNfZ2V0X2FycmFuZ2VyKClhZGRyZXNzIiwgbWV0aG9kICJyYmFjX2dldF9hZGRyZXNzX3JvbGVzKGFkZHJlc3MpKGJvb2wsYm9vbCxib29sLGJvb2wsYm9vbCkiLCBtZXRob2QgInJiYWNfZ2V0X3JvbGVfdmFsaWRpdHkodWludDgsYWRkcmVzcykodWludDY0LHVpbnQ2NCkiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBmdW5kX2R1ZV9jYXNoZmxvd3MgY2xhaW1fZHVlX2Nhc2hmbG93cyB0cmFuc2Zlcl9zZXRfc2NoZWR1bGUgcHJpbWFyeV9kaXN0cmlidXRpb24gdHJhbnNmZXIgYWNjb3VudF9zdXNwZW5zaW9uIGFjY291bnRfb3BlbiBhY2NvdW50X3VwZGF0ZV9wYXltZW50X2FkZHJlc3MgYWNjb3VudF9nZXRfcG9zaXRpb24gY29udHJhY3RfY29uZmlnIGNvbnRyYWN0X3NjaGVkdWxlIGNvbnRyYWN0X2V4ZWN1dGVfaWVkIGFwcGx5X25vbl9jYXNoX2V2ZW50IGFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50IGNvbnRyYWN0X2dldF9zdGF0ZSBjb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnQgcmJhY19yb3RhdGVfYXJyYW5nZXIgcmJhY19zZXRfb3BfZGFlbW9uIHJiYWNfYXNzaWduX3JvbGUgcmJhY19yZXZva2Vfcm9sZSByYmFjX2NvbnRyYWN0X3N1c3BlbnNpb24gcmJhY19nZXRfYXJyYW5nZXIgcmJhY19nZXRfYWRkcmVzc19yb2xlcyByYmFjX2dldF9yb2xlX3ZhbGlkaXR5CiAgICBlcnIKCm1haW5fY3JlYXRlX05vT3BAMzI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6OC0xOAogICAgLy8gY2xhc3MgREFTQSgKICAgIC8vICAgICBQYXltZW50QWdlbnQsCiAgICAvLyAgICAgVHJhbnNmZXJBZ2VudCwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBhdm1fdmVyc2lvbj0xMiwKICAgIC8vICk6CiAgICBwdXNoYnl0ZXMgMHg5NTZkNzE1NiAvLyBtZXRob2QgImNvbnRyYWN0X2NyZWF0ZShhZGRyZXNzKXVpbnQ2NCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIGNvbnRyYWN0X2NyZWF0ZQogICAgZXJyCgptYWluX2NvbnRyYWN0X3VwZGF0ZV9yb3V0ZUA0OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgcHVzaGludCA0IC8vIFVwZGF0ZUFwcGxpY2F0aW9uCiAgICA9PQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICYmCiAgICBhc3NlcnQKICAgIGIgY29udHJhY3RfdXBkYXRlCgoKLy8gX3B1eWFfbGliLnV0aWwuZW5zdXJlX2J1ZGdldChyZXF1aXJlZF9idWRnZXQ6IHVpbnQ2NCwgZmVlX3NvdXJjZTogdWludDY0KSAtPiB2b2lkOgplbnN1cmVfYnVkZ2V0OgogICAgcHJvdG8gMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMTAKICAgICsKCmVuc3VyZV9idWRnZXRfd2hpbGVfdG9wQDE6CiAgICBmcmFtZV9kaWcgMAogICAgZ2xvYmFsIE9wY29kZUJ1ZGdldAogICAgPgogICAgYnogZW5zdXJlX2J1ZGdldF9hZnRlcl93aGlsZUA2CiAgICBpdHhuX2JlZ2luCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgYnl0ZWMgNDcgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtCiAgICBieXRlYyA0NyAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbQogICAgZnJhbWVfZGlnIC0xCiAgICBzd2l0Y2ggZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8wQDMgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8xQDQKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfbmV4dEA1OgogICAgaXR4bl9zdWJtaXQKICAgIGIgZW5zdXJlX2J1ZGdldF93aGlsZV90b3BAMQoKZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8xQDQ6CiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgYiBlbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX25leHRANQoKZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8wQDM6CiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGIgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV9uZXh0QDUKCmVuc3VyZV9idWRnZXRfYWZ0ZXJfd2hpbGVANjoKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucGF5bWVudF9hZ2VudC5QYXltZW50QWdlbnQuZnVuZF9kdWVfY2FzaGZsb3dzW3JvdXRpbmddKCkgLT4gdm9pZDoKZnVuZF9kdWVfY2FzaGZsb3dzOgogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAxMwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NTEKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjUyCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjUzCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo1NQogICAgLy8gaWYgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCk6CiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo1OS02MAogICAgLy8gKyBtYXhfZXZlbnRfY291bnQKICAgIC8vICogVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfUEVSX0VWRU5UX0JVREdFVCkKICAgIGR1cAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjYwCiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfRlVORF9EVUVfQ0FTSEZMT1dTX1BFUl9FVkVOVF9CVURHRVQpCiAgICBwdXNoaW50IDEwMAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjU5LTYwCiAgICAvLyArIG1heF9ldmVudF9jb3VudAogICAgLy8gKiBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19QRVJfRVZFTlRfQlVER0VUKQogICAgKgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjU4CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19CQVNFX0JVREdFVCkKICAgIGludGMgNCAvLyAxNTAwCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NTgtNjAKICAgIC8vIFVJbnQ2NChjc3QuT1BfVVBfRlVORF9EVUVfQ0FTSEZMT1dTX0JBU0VfQlVER0VUKQogICAgLy8gKyBtYXhfZXZlbnRfY291bnQKICAgIC8vICogVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfUEVSX0VWRU5UX0JVREdFVCkKICAgICsKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo1Ni02MgogICAgLy8gZW5zdXJlX2J1ZGdldCgKICAgIC8vICAgICByZXF1aXJlZF9idWRnZXQ9KAogICAgLy8gICAgICAgICBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19CQVNFX0JVREdFVCkKICAgIC8vICAgICAgICAgKyBtYXhfZXZlbnRfY291bnQKICAgIC8vICAgICAgICAgKiBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19QRVJfRVZFTlRfQlVER0VUKQogICAgLy8gICAgICksCiAgICAvLyApCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjY0CiAgICAvLyBwcm9jZXNzZWRfZXZlbnRzID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA1CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjUKICAgIC8vIGZ1bmRlZF9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2NgogICAgLy8gZnVuZGVkX3ByaW5jaXBhbCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTMKCmZ1bmRfZHVlX2Nhc2hmbG93c193aGlsZV90b3BANDoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2OQogICAgLy8gcHJvY2Vzc2VkX2V2ZW50cyA8IG1heF9ldmVudF9jb3VudAogICAgZGlnIDQKICAgIGRpZyAxCiAgICA8CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjktNzAKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgPCBtYXhfZXZlbnRfY291bnQKICAgIC8vIGFuZCBzZWxmLmV2ZW50X2N1cnNvciA8IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQKICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl93aGlsZUAxMQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjcwCiAgICAvLyBhbmQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIDwKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2OS03MAogICAgLy8gcHJvY2Vzc2VkX2V2ZW50cyA8IG1heF9ldmVudF9jb3VudAogICAgLy8gYW5kIHNlbGYuZXZlbnRfY3Vyc29yIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudAogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDExCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzIKICAgIC8vIGVudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KHNlbGYuZXZlbnRfY3Vyc29yKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIGR1cAogICAgYnVyeSAxNwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjczCiAgICAvLyBpZiBlbnRyeS5zY2hlZHVsZWRfdGltZSA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wOgogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDMKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgID4KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAMTEKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3NQogICAgLy8gaWYgbm90IHNlbGYuX2V2ZW50X2lzX2Nhc2goZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSk6CiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ1cnkgMTYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM1MQogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUCksCiAgICBpbnRjXzIgLy8gOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzUwLTM1NAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfTUQpLAogICAgLy8gKQogICAgPT0KICAgIGR1cAogICAgYnVyeSA0CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfdHJ1ZUA1MgogICAgZGlnIDE0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNTIKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNTAtMzU0CiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9NRCksCiAgICAvLyApCiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX3RydWVANTIKICAgIGRpZyAxNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzUzCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX01EKSwKICAgIHB1c2hpbnQgMTkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM1MC0zNTQKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX01EKSwKICAgIC8vICkKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUA1MwoKZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfdHJ1ZUA1MjoKICAgIGludGNfMSAvLyAxCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUA1NDoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3NQogICAgLy8gaWYgbm90IHNlbGYuX2V2ZW50X2lzX2Nhc2goZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSk6CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAMTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU0OAogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X2lkID09IHNlbGYuZXZlbnRfY3Vyc29yLCBlcnIuSU5WQUxJRF9FVkVOVF9DVVJTT1IKICAgIGRpZyAxNQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBjdXJzb3IKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU0OQogICAgLy8gYXNzZXJ0IGVudHJ5LnNjaGVkdWxlZF90aW1lIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLCBlcnIuTk9fRFVFX0NBU0hGTE9XCiAgICBkaWcgMQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPD0KICAgIGFzc2VydCAvLyBObyBkdWUgY2FzaGZsb3cgdG8gcGF5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MTMKICAgIC8vIGlmIGV2ZW50X3R5cGUgbm90IGluIChVSW50NjQoZW51bXMuRVZUX0lQKSwgVUludDY0KGVudW1zLkVWVF9NRCkpOgogICAgZGlnIDIKICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNQogICAgZGlnIDE0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MTQKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDExCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfaW50ZXJlc3RfYW1vdW50QDE2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDI2CiAgICAvLyBldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBidXJ5IDE2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MjcKICAgIC8vIGlmIGV2ZW50X3R5cGUgbm90IGluIChVSW50NjQoZW51bXMuRVZUX1BSKSwgVUludDY0KGVudW1zLkVWVF9NRCkpOgogICAgcHVzaGludCAzCiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE5CiAgICBkaWcgMTQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQyOAogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNgoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnRAMjg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTMKICAgIC8vIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGRpZyAxNQogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTU2CiAgICAvLyBpZiBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKToKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDI5CiAgICBkaWcgNwogICAgYnVyeSA5CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzODoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU3Mi01NzQKICAgIC8vICMgRnVuZGluZyB1c2VzIHBlci11bml0IGN1bXVsYXRpdmUgaW5kaWNlcyBzbyBlYWNoIGhvbGRlciBjYW4gc2V0dGxlCiAgICAvLyAjIGluZGVwZW5kZW50bHkgZnJvbSBpdHMgY3VycmVudCB1bml0IGJhbGFuY2UuCiAgICAvLyBpbnRlcmVzdF9pbmRleF9kZWx0YSA9IHNlbGYuX2Ftb3VudF90b19pbmRleF9kZWx0YShpbnRlcmVzdF9hbW91bnRfZHVlKQogICAgZGlnIDEwCiAgICBjYWxsc3ViIF9hbW91bnRfdG9faW5kZXhfZGVsdGEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU3NQogICAgLy8gcHJpbmNpcGFsX2luZGV4X2RlbHRhID0gc2VsZi5fYW1vdW50X3RvX2luZGV4X2RlbHRhKHByaW5jaXBhbF9hbW91bnRfZHVlKQogICAgZGlnIDYKICAgIGNhbGxzdWIgX2Ftb3VudF90b19pbmRleF9kZWx0YQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTc2CiAgICAvLyBpbnRlcmVzdF9hbW91bnQgPSBzZWxmLl9pbmRleF9kZWx0YV90b19hbW91bnQoaW50ZXJlc3RfaW5kZXhfZGVsdGEpCiAgICBkaWcgMQogICAgY2FsbHN1YiBfaW5kZXhfZGVsdGFfdG9fYW1vdW50CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgMTUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU3NwogICAgLy8gcHJpbmNpcGFsX2Ftb3VudCA9IHNlbGYuX2luZGV4X2RlbHRhX3RvX2Ftb3VudChwcmluY2lwYWxfaW5kZXhfZGVsdGEpCiAgICBkdXAKICAgIGNhbGxzdWIgX2luZGV4X2RlbHRhX3RvX2Ftb3VudAogICAgZHVwCiAgICBidXJ5IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzgKICAgIC8vIHJlcXVpcmVkX2Ftb3VudCA9IGludGVyZXN0X2Ftb3VudCArIHByaW5jaXBhbF9hbW91bnQKICAgIGRpZyAyCiAgICBkaWcgMQogICAgKwogICAgZHVwCiAgICBidXJ5IDkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjczNAogICAgLy8gYmFsYW5jZSA9IHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ1NgogICAgLy8gcmV0dXJuIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgKyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIGRpZyAxCiAgICArCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MzYKICAgIC8vIGFzc2VydCBiYWxhbmNlID49IHJlc2VydmVkX3RvdGFsLCBlcnIuTk9UX0VOT1VHSF9GVU5EUwogICAgZGlnIDIKICAgIGRpZyAxCiAgICA+PQogICAgYXNzZXJ0IC8vIE5vdCBlbm91Z2ggZnVuZHMgZm9yIHRoZSBwYXltZW50CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MzcKICAgIC8vIHJldHVybiBiYWxhbmNlIC0gcmVzZXJ2ZWRfdG90YWwKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTgwCiAgICAvLyBzZWxmLl9hdmFpbGFibGVfc2V0dGxlbWVudF9mdW5kcygpID49IHJlcXVpcmVkX2Ftb3VudAogICAgdW5jb3ZlciAyCiAgICA+PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTc5LTU4MQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLl9hdmFpbGFibGVfc2V0dGxlbWVudF9mdW5kcygpID49IHJlcXVpcmVkX2Ftb3VudAogICAgLy8gKSwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTgzCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0ICs9IGludGVyZXN0X2Ftb3VudAogICAgdW5jb3ZlciAzCiAgICArCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTg0CiAgICAvLyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCArPSBwcmluY2lwYWxfYW1vdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICArCiAgICBieXRlYyAxMiAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4NQogICAgLy8gc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4ICs9IGludGVyZXN0X2luZGV4X2RlbHRhCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCBleGlzdHMKICAgIHVuY292ZXIgMgogICAgKwogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTg2CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4ICs9IHByaW5jaXBhbF9pbmRleF9kZWx0YQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCBleGlzdHMKICAgICsKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1ODcKICAgIC8vIGlmIGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkgPT0gVUludDY0KGVudW1zLkVWVF9QUik6CiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBwdXNoaW50IDMKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDQwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1ODgtNTg5CiAgICAvLyAjIEZvciBQUiwgdGhlIHBlcmlvZCBpbnRlcmVzdCBzdGF5cyBhY2NydWVkIHVudGlsIGEgbGF0ZXIgSVAgb3IgTUQuCiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgKz0gc2VsZi5fZW50cnlfaW50ZXJlc3Rfc2VnbWVudChlbnRyeSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBkaWcgMTYKICAgIGNhbGxzdWIgX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQKICAgIGJ1cnkgMTgKICAgICsKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTIKICAgIC8vIGlmIG5vdCBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKSBvciBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NCgKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlANDMKICAgIGRpZyAxNQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5Mi01OTQKICAgIC8vIGlmIG5vdCBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKSBvciBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NCgKICAgIC8vICAgICBlbnVtcy5FVlRfTUQKICAgIC8vICk6CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDQKCmZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDQzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTk1CiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBkaWcgMTUKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0NDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5NgogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgZGlnIDgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTcKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IG5leHRfaW50ZXJlc3RfYmFzZQogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGRpZyA5CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTk4CiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MDAKICAgIC8vIGlmIGVudHJ5LmV2ZW50X3R5cGUgPT0gYXJjNC5VSW50OCgKICAgIGRpZyAxNQogICAgZXh0cmFjdCA4IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwMC02MDIKICAgIC8vIGlmIGVudHJ5LmV2ZW50X3R5cGUgPT0gYXJjNC5VSW50OCgKICAgIC8vICAgICBlbnVtcy5FVlRfTUQKICAgIC8vICkgYW5kIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID09IFVJbnQ2NCgwKToKICAgIHB1c2hieXRlcyAweDEzCiAgICBiPT0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQ3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MDIKICAgIC8vICkgYW5kIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID09IFVJbnQ2NCgwKToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAwLTYwMgogICAgLy8gaWYgZW50cnkuZXZlbnRfdHlwZSA9PSBhcmM0LlVJbnQ4KAogICAgLy8gICAgIGVudW1zLkVWVF9NRAogICAgLy8gKSBhbmQgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPT0gVUludDY0KDApOgogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQ3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MDMKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGVudW1zLlNUQVRVU19FTkRFRCkKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgMjAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjA0CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQ3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjA2LTYxMAogICAgLy8gc2VsZi5fZW1pdF9leGVjdXRpb25fZXZlbnQoCiAgICAvLyAgICAgZW50cnk9ZW50cnksCiAgICAvLyAgICAgcGF5b2ZmPWludGVyZXN0X2Ftb3VudCArIHByaW5jaXBhbF9hbW91bnQsCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9aW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudCwKICAgIC8vICkKICAgIGRpZyAxNQogICAgZGlnIDQKICAgIGR1cAogICAgY2FsbHN1YiBfZW1pdF9leGVjdXRpb25fZXZlbnQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojc5CiAgICAvLyBmdW5kZWRfaW50ZXJlc3QgKz0gaW50ZXJlc3RfYW1vdW50CiAgICBkaWcgMTMKICAgIGRpZyAxMgogICAgKwogICAgYnVyeSAxNAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjgwCiAgICAvLyBmdW5kZWRfcHJpbmNpcGFsICs9IHByaW5jaXBhbF9hbW91bnQKICAgIGRpZyAxMgogICAgZGlnIDcKICAgICsKICAgIGJ1cnkgMTMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4MQogICAgLy8gcHJvY2Vzc2VkX2V2ZW50cyArPSBVSW50NjQoMSkKICAgIGRpZyA0CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSA1CiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c193aGlsZV90b3BANAoKZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUA0MDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5MQogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ID0gVUludDY0KDApCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQxCgpmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUAyOToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1NwogICAgLy8gZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGRpZyAxNQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSAxNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTU4LTU2MAogICAgLy8gIyBEeW5hbWljIGFubnVpdGllcyBkZXJpdmUgbmV4dCBzdGF0ZSBmcm9tIHRoZSBwYXltZW50IGRlY29tcG9zaXRpb24sCiAgICAvLyAjIG5vdCBvbmx5IGZyb20gdGhlIHByZWNvbXB1dGVkIGBuZXh0XypgIGZpZWxkcy4KICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QUik6CiAgICBwdXNoaW50IDMKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDMxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjIKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIC0gcHJpbmNpcGFsX2Ftb3VudF9kdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgZGlnIDYKICAgIC0KICAgIGR1cAogICAgYnVyeSA5CiAgICBidXJ5IDkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzgKCmZ1bmRfZHVlX2Nhc2hmbG93c19lbHNlX2JvZHlAMzE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjUKICAgIC8vIGVsaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX0lQKToKICAgIGRpZyAxNAogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDMzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjYKICAgIC8vIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgYnVyeSA5CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjcKICAgIC8vIG5leHRfaW50ZXJlc3RfYmFzZSA9IHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgYnVyeSAxMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSBleGlzdHMKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzgKCmZ1bmRfZHVlX2Nhc2hmbG93c19lbHNlX2JvZHlAMzM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjgKICAgIC8vIGVsaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKToKICAgIGRpZyAxNAogICAgcHVzaGludCAxOQogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUAzNAogICAgZGlnIDcKICAgIGJ1cnkgOQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlAMzQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjkKICAgIC8vIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzAKICAgIC8vIG5leHRfaW50ZXJlc3RfYmFzZSA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgOQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MjkKICAgIC8vIGlmIHNlbGYuX2lzX2R5bmFtaWNfYW5udWl0eSgpOgogICAgY2FsbHN1YiBfaXNfZHluYW1pY19hbm51aXR5CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyNwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDMwCiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfTUQpOgogICAgZGlnIDE0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzMQogICAgLy8gcmV0dXJuIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTUyCiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzMgogICAgLy8gaW50ZXJlc3RfZHVlID0gc2VsZi5hY2NydWVkX2ludGVyZXN0ICsgc2VsZi5fZW50cnlfaW50ZXJlc3Rfc2VnbWVudChlbnRyeSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBkaWcgMTYKICAgIGNhbGxzdWIgX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQKICAgIGJ1cnkgMTgKICAgICsKICAgIGR1cAogICAgYnVyeSAxMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDMzCiAgICAvLyBpZiBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPD0gaW50ZXJlc3RfZHVlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gZXhpc3RzCiAgICA+PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzNAogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTUyCiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyNDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzNQogICAgLy8gcHJpbmNpcGFsX2Ftb3VudCA9IHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiAtIGludGVyZXN0X2R1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gZXhpc3RzCiAgICBkaWcgMTAKICAgIC0KICAgIGR1cAogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzYKICAgIC8vIGlmIHByaW5jaXBhbF9hbW91bnQgPiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgPgogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzNwogICAgLy8gcmV0dXJuIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTUyCiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyNjoKICAgIGRpZyA2CiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NDAKICAgIC8vIGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsIDw9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBkaWcgMTUKICAgIHB1c2hpbnQgNDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGR1cDIKICAgIDw9CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzktNDQxCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsIDw9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ0MgogICAgLy8gcmV0dXJuIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIC0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIHN3YXAKICAgIC0KICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTUyCiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQxNQogICAgLy8gcmV0dXJuIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCArIHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZGlnIDE2CiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBidXJ5IDE4CiAgICArCiAgICBidXJ5IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTEKICAgIC8vIGludGVyZXN0X2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9pbnRlcmVzdF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9pbnRlcmVzdF9hbW91bnRAMTYKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl93aGlsZUAxMToKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4MwogICAgLy8gYXNzZXJ0IHByb2Nlc3NlZF9ldmVudHMgPiBVSW50NjQoMCksIGVyci5OT19EVUVfQ0FTSEZMT1cKICAgIGRpZyA0CiAgICBkdXAKICAgIGFzc2VydCAvLyBObyBkdWUgY2FzaGZsb3cgdG8gcGF5CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODcKICAgIC8vIHRvdGFsX2Z1bmRlZD1mdW5kZWRfaW50ZXJlc3QgKyBmdW5kZWRfcHJpbmNpcGFsLAogICAgZGlnIDE0CiAgICBkdXAKICAgIGRpZyAxNQogICAgZHVwCiAgICBjb3ZlciAzCiAgICArCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODkKICAgIC8vIHRpbWVzdGFtcD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4NC05MAogICAgLy8gcmV0dXJuIHR5cC5DYXNoRnVuZGluZ1Jlc3VsdCgKICAgIC8vICAgICBmdW5kZWRfaW50ZXJlc3Q9ZnVuZGVkX2ludGVyZXN0LAogICAgLy8gICAgIGZ1bmRlZF9wcmluY2lwYWw9ZnVuZGVkX3ByaW5jaXBhbCwKICAgIC8vICAgICB0b3RhbF9mdW5kZWQ9ZnVuZGVkX2ludGVyZXN0ICsgZnVuZGVkX3ByaW5jaXBhbCwKICAgIC8vICAgICBwcm9jZXNzZWRfZXZlbnRzPXByb2Nlc3NlZF9ldmVudHMsCiAgICAvLyAgICAgdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUA1MzoKICAgIGludGNfMCAvLyAwCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDU0CgoKLy8gbW9kdWxlcy5wYXltZW50X2FnZW50LlBheW1lbnRBZ2VudC5jbGFpbV9kdWVfY2FzaGZsb3dzW3JvdXRpbmddKCkgLT4gdm9pZDoKY2xhaW1fZHVlX2Nhc2hmbG93czoKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6OTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNQogICAgLy8gaWYgc2VsZi5vcF9kYWVtb24udmFsdWUgIT0gR2xvYmFsLnplcm9fYWRkcmVzczoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNiAvLyAweDUyMjM0ZjcwNDQ2MTY1NmQ2ZjZlMjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcF9kYWVtb24gZXhpc3RzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBieiBjbGFpbV9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTcKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNwogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI2IC8vIDB4NTIyMzRmNzA0NDYxNjU2ZDZmNmUyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wX2RhZW1vbiBleGlzdHMKICAgID09CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTctMTkKICAgIC8vIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICAvLyBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgYm56IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDE0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTgKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNy0xOQogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICBibnogY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX3RydWVAMTQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxOQogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIHR4biBTZW5kZXIKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDMyCiAgICA9PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE3LTE5CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAxNQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX3RydWVAMTQ6CiAgICBpbnRjXzEgLy8gMQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDE2OgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE2LTIwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vICAgICBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gICAgIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICAvLyApLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNzoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMDMKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA0CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMDcKICAgIC8vIHNlbGYuX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQoaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDIKICAgIGR1cAogICAgY2FsbHN1YiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjEwOAogICAgLy8gc2VsZi5fc2V0dGxlX3Bvc2l0aW9uKGhvbGRpbmdfYWRkcmVzcykKICAgIGNhbGxzdWIgX3NldHRsZV9wb3NpdGlvbgogICAgcG9wbiAyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTE3CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jbGFpbWFibGVfaW50ZXJlc3QKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGR1cAogICAgcHVzaGludCA3MwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTE4CiAgICAvLyArIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNsYWltYWJsZV9wcmluY2lwYWwKICAgIGR1cAogICAgcHVzaGludCA4MQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTE3LTExOAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY2xhaW1hYmxlX2ludGVyZXN0CiAgICAvLyArIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNsYWltYWJsZV9wcmluY2lwYWwKICAgIHVuY292ZXIgMgogICAgKwogICAgZHVwCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMTAKICAgIC8vIGFzc2VydCB0b3RhbF9hbW91bnQgPiBVSW50NjQoMCksIGVyci5OT19EVUVfQ0FTSEZMT1cKICAgIGFzc2VydCAvLyBObyBkdWUgY2FzaGZsb3cgdG8gcGF5CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MjUKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5pc19vcHRlZF9pbigKICAgIGV4dHJhY3QgMCAzMgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI2CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI1LTI3CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MuaXNfb3B0ZWRfaW4oCiAgICAvLyAgICAgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkCiAgICAvLyApCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI1LTI4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MuaXNfb3B0ZWRfaW4oCiAgICAvLyAgICAgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkCiAgICAvLyApCiAgICAvLyBhbmQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZAogICAgYnogY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX2ZhbHNlQDI0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MjgKICAgIC8vIGFuZCBub3Qgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDM4NAogICAgZ2V0Yml0CiAgICBibnogY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX2ZhbHNlQDI0CiAgICBpbnRjXzEgLy8gMQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDI1OgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjExNQogICAgLy8gaWYgc2VsZi5faXNfcGF5bWVudF9leGVjdXRhYmxlKGhvbGRpbmdfYWRkcmVzcyk6CiAgICBieiBjbGFpbV9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjM0CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgc3dhcAogICAgZGlnIDEKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYXNzZXJ0IC8vIGFjY291bnQgb3B0ZWQgaW50byBhc3NldAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjM0LTM1CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgLy8gPj0gcGF5bWVudF9hbW91bnQKICAgIGRpZyA1CiAgICBkdXAKICAgIGNvdmVyIDIKICAgID49CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MzMtMzYKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIC8vICAgICA+PSBwYXltZW50X2Ftb3VudAogICAgLy8gKSwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjExNwogICAgLy8gc2VsZi5fcGF5KHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcywgdG90YWxfYW1vdW50KQogICAgZGlnIDIKICAgIGR1cAogICAgY292ZXIgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGR1cAogICAgZXh0cmFjdCAwIDMyCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NDAtNDUKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1yZWNlaXZlciwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9YW1vdW50LAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NDQKICAgIC8vIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICB1bmNvdmVyIDMKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgdW5jb3ZlciAyCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQwCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NDAtNDUKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1yZWNlaXZlciwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9YW1vdW50LAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEyNS0xMjYKICAgIC8vICMgR2V0IHRoZSBjbGFpbWFibGUgYW1vdW50cyBiZWZvcmUgcmVzZXQKICAgIC8vIGludGVyZXN0X2Ftb3VudCA9IHBvc2l0aW9uLmNsYWltYWJsZV9pbnRlcmVzdAogICAgZHVwCiAgICBwdXNoaW50IDczCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBidXJ5IDkKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMjcKICAgIC8vIHByaW5jaXBhbF9hbW91bnQgPSBwb3NpdGlvbi5jbGFpbWFibGVfcHJpbmNpcGFsCiAgICBkdXAKICAgIHB1c2hpbnQgODEKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGJ1cnkgOQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEyOS0xMzAKICAgIC8vICMgUmVzZXQgdGhlIHBvc2l0aW9uJ3MgY2xhaW1hYmxlIGFtb3VudHMKICAgIC8vIHBvc2l0aW9uLmNsYWltYWJsZV9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICByZXBsYWNlMiA3MwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzMQogICAgLy8gcG9zaXRpb24uY2xhaW1hYmxlX3ByaW5jaXBhbCA9IFVJbnQ2NCgwKQogICAgc3dhcAogICAgcmVwbGFjZTIgODEKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzIKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gcG9zaXRpb24uY29weSgpCiAgICB1bmNvdmVyIDMKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzQKICAgIC8vIGFzc2VydCBzZWxmLnJlc2VydmVkX2ludGVyZXN0ID49IGludGVyZXN0X2Ftb3VudCwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBkdXAKICAgIGRpZyAyCiAgICA+PQogICAgYXNzZXJ0IC8vIE5vdCBlbm91Z2ggZnVuZHMgZm9yIHRoZSBwYXltZW50CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTM1CiAgICAvLyBhc3NlcnQgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgPj0gcHJpbmNpcGFsX2Ftb3VudCwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIGRpZyAzCiAgICA+PQogICAgYXNzZXJ0IC8vIE5vdCBlbm91Z2ggZnVuZHMgZm9yIHRoZSBwYXltZW50CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTM3LTEzOAogICAgLy8gIyBVcGRhdGUgdGhlIGdsb2JhbCByZXNlcnZlZCBpbnRlcmVzdCBhbmQgcHJpbmNpcGFsIGFtb3VudHMKICAgIC8vIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgLT0gaW50ZXJlc3RfYW1vdW50CiAgICBzd2FwCiAgICAtCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzOQogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgLT0gcHJpbmNpcGFsX2Ftb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIGV4aXN0cwogICAgc3dhcAogICAgLQogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpjbGFpbV9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMjMKICAgIC8vIHRvdGFsX2Ftb3VudD1pbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50LAogICAgZGlnIDUKICAgIGR1cAogICAgZGlnIDYKICAgIGR1cAogICAgY292ZXIgMwogICAgKwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjEyNAogICAgLy8gdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjEyMC0xMjYKICAgIC8vIHJldHVybiB0eXAuQ2FzaENsYWltUmVzdWx0KAogICAgLy8gICAgIGludGVyZXN0X2Ftb3VudD1pbnRlcmVzdF9hbW91bnQsCiAgICAvLyAgICAgcHJpbmNpcGFsX2Ftb3VudD1wcmluY2lwYWxfYW1vdW50LAogICAgLy8gICAgIHRvdGFsX2Ftb3VudD1pbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50LAogICAgLy8gICAgIHRpbWVzdGFtcD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICBjb250ZXh0PXBheW1lbnRfaW5mbywKICAgIC8vICkKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyAyCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgcHVzaGJ5dGVzIDB4MDAyMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VAMjQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfbWVyZ2VAMjUKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAxNToKICAgIGludGNfMCAvLyAwCiAgICBiIGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUAxNgoKCi8vIG1vZHVsZXMudHJhbnNmZXJfYWdlbnQuVHJhbnNmZXJBZ2VudC50cmFuc2Zlcl9zZXRfc2NoZWR1bGVbcm91dGluZ10oKSAtPiB2b2lkOgp0cmFuc2Zlcl9zZXRfc2NoZWR1bGU6CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MjYKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToyNwogICAgLy8gYXNzZXJ0IG9wZW5fZGF0ZSA8IGNsb3N1cmVfZGF0ZSwgZXJyLklOVkFMSURfU09SVElORwogICAgZHVwMgogICAgPAogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIG11c3QgYmUgc29ydGVkIGluIHN0cmljdGx5IGFzY2VuZGluZyBvcmRlcgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToyOQogICAgLy8gc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgPSBvcGVuX2RhdGUKICAgIGJ5dGVjIDI4IC8vICJ0cmFuc2Zlcl9vcGVuaW5nX2RhdGUiCiAgICB1bmNvdmVyIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjMwCiAgICAvLyBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSA9IGNsb3N1cmVfZGF0ZQogICAgYnl0ZWMgMjkgLy8gInRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjMxCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMudHJhbnNmZXJfYWdlbnQuVHJhbnNmZXJBZ2VudC5wcmltYXJ5X2Rpc3RyaWJ1dGlvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnByaW1hcnlfZGlzdHJpYnV0aW9uOgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTozMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo3MQogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYucHJpbWFyeV9kZWFsZXIsIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyMiAvLyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQzCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo0NAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQ1CiAgICAvLyBhc3NlcnQgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TRUQKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBjbG9zZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDcKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQoaG9sZGluZ19hZGRyZXNzKQogICAgc3dhcAogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo0OAogICAgLy8gYXNzZXJ0IHVuaXRzID4gVUludDY0KDApLCBlcnIuWkVST19VTklUUwogICAgZHVwCiAgICBhc3NlcnQgLy8gQ2FuIG5vdCBkaXN0cmlidXRlIHplcm8gdW5pdHMKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NTAKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgKyB1bml0cyA8PSBzZWxmLnRvdGFsX3VuaXRzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIGV4aXN0cwogICAgKwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIDw9CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQ5LTUxCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgKyB1bml0cyA8PSBzZWxmLnRvdGFsX3VuaXRzCiAgICAvLyApLCBlcnIuT1ZFUl9ESVNUUklCVVRJT04KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgcmVtYWluaW5nIEQtQVNBIHVuaXRzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjUyCiAgICAvLyBpZiBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNyAvLyAiaW5pdGlhbF9leGNoYW5nZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSBleGlzdHMKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo1NAogICAgLy8gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPD0gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGUKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNyAvLyAiaW5pdGlhbF9leGNoYW5nZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSBleGlzdHMKICAgIDw9CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjUzLTU1CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDw9IHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlCiAgICAvLyApLCBlcnIuUFJJTUFSWV9ESVNUUklCVVRJT05fQ0xPU0VECiAgICBhc3NlcnQgLy8gUHJpbWFyeSBkaXN0cmlidXRpb24gaXMgY2xvc2VkCgpwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTQ4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5yZXNlcnZlZF91bml0cyArPSB1bml0cwogICAgZHVwbiAyCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCA0MAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAzCiAgICBkdXAKICAgIGNvdmVyIDMKICAgICsKICAgIGl0b2IKICAgIHB1c2hpbnQgNDAKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjU4CiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsICs9IHVuaXRzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIGV4aXN0cwogICAgKwogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjU5CiAgICAvLyByZXR1cm4gc2VsZi50b3RhbF91bml0cyAtIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICBzd2FwCiAgICAtCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnRyYW5zZmVyX2FnZW50LlRyYW5zZmVyQWdlbnQudHJhbnNmZXJbcm91dGluZ10oKSAtPiB2b2lkOgp0cmFuc2ZlcjoKICAgIGludGNfMCAvLyAwCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cG4gMgogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojc1CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo3NgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDcKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjEzCiAgICAvLyBpZiBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyOCAvLyAidHJhbnNmZXJfb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIGJ6IHRyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNQogICAgLy8gc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyOCAvLyAidHJhbnNmZXJfb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIDw9CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE0LTE2CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyApLCBlcnIuQ0xPU0VEX1RSQU5TRkVSCiAgICBhc3NlcnQgLy8gVHJhbnNmZXIgaXMgY2xvc2VkCgp0cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE3CiAgICAvLyBpZiBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyOSAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIGJ6IHRyYW5zZmVyX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxOQogICAgLy8gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI5IC8vICJ0cmFuc2Zlcl9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgPAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxOC0yMAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8IHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlCiAgICAvLyApLCBlcnIuQ0xPU0VEX1RSQU5TRkVSCiAgICBhc3NlcnQgLy8gVHJhbnNmZXIgaXMgY2xvc2VkCgp0cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjgwCiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBzZW5kZXJfaG9sZGluZ19hZGRyZXNzLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICBkaWcgNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQyMwogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDgKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBkaWcgNQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA5CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjgzCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBkaWcgMgogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4NAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBkdXAKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODUKICAgIC8vIGFzc2VydCBzZW5kZXJfaG9sZGluZ19hZGRyZXNzICE9IHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcywgZXJyLlNFTEZfVFJBTlNGRVIKICAgIHVuY292ZXIgMgogICAgIT0KICAgIGFzc2VydCAvLyBTZW5kZXIgYW5kIHJlY2VpdmVyIG11c3QgYmUgZGlmZmVyZW50CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojg2CiAgICAvLyBhc3NlcnQgdW5pdHMgPiBVSW50NjQoMCksIGVyci5OVUxMX1RSQU5TRkVSCiAgICBkaWcgMQogICAgZHVwCiAgICBhc3NlcnQgLy8gVHJhbnNmZXIgdW5pdHMgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4NwogICAgLy8gYXNzZXJ0IHVuaXRzIDw9IHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cywgZXJyLk9WRVJfVFJBTlNGRVIKICAgIHN3YXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICA8PQogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCBzZW5kZXIgdW5pdHMgdG8gdHJhbnNmZXIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc2MwogICAgLy8gaWYgc2VsZi5ldmVudF9jdXJzb3IgPj0gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgPj0KICAgIGJueiB0cmFuc2Zlcl9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9hc3NlcnRfbm9fZHVlX2V2ZW50X3BlbmRpbmdAMTAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc2NQogICAgLy8gbmV4dF9lbnRyeSA9IHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLmV2ZW50X2N1cnNvcikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NjcKICAgIC8vIG5leHRfZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzY2LTc2OAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBuZXh0X2VudHJ5LnNjaGVkdWxlZF90aW1lID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICksIGVyci5QRU5ESU5HX0FDVFVTX0VWRU5UCiAgICBhc3NlcnQgLy8gQUNUVVMgZXZlbnQgbm90IHlldCBleGVjdXRlZAoKdHJhbnNmZXJfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYXNzZXJ0X25vX2R1ZV9ldmVudF9wZW5kaW5nQDEwOgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo5MAogICAgLy8gc2VsZi5fZW5zdXJlX3VuaXRzX2FjdGl2YXRlZChzZW5kZXJfaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDMKICAgIGR1cAogICAgY2FsbHN1YiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo5MQogICAgLy8gc2VsZi5fZW5zdXJlX3VuaXRzX2FjdGl2YXRlZChyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBkaWcgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjYWxsc3ViIF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjkyCiAgICAvLyBzZWxmLl9zZXR0bGVfcG9zaXRpb24oc2VuZGVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGNhbGxzdWIgX3NldHRsZV9wb3NpdGlvbgogICAgcG9wbiAyCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjkzCiAgICAvLyBzZWxmLl9zZXR0bGVfcG9zaXRpb24ocmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzKQogICAgY2FsbHN1YiBfc2V0dGxlX3Bvc2l0aW9uCiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNTIKICAgIC8vIGFzc2VydCB1bml0cyA8PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cywgZXJyLk9WRVJfVFJBTlNGRVIKICAgIGRpZyA1CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkaWcgMQogICAgPD0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgc2VuZGVyIHVuaXRzIHRvIHRyYW5zZmVyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTUzCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyAtPSB1bml0cwogICAgZGlnIDEKICAgIC0KICAgIGl0b2IKICAgIHVuY292ZXIgMgogICAgaW50Y18zIC8vIDMyCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTQ0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyArPSB1bml0cwogICAgZGlnIDUKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIHVuY292ZXIgMgogICAgKwogICAgaXRvYgogICAgaW50Y18zIC8vIDMyCiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo2MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfc3VzcGVuc2lvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfc3VzcGVuc2lvbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojc3CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyMSAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxODUKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZCA9IHN1c3BlbmRlZAogICAgZHVwCiAgICBwdXNoaW50IDQ4CiAgICBpbnRjXzEgLy8gMQogICAgYm94X2V4dHJhY3QKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgcHVzaGludCA0OAogICAgc3dhcAogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxODYKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE2NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF9vcGVuW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF9vcGVuOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjY4CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hY2NvdW50X21hbmFnZXIsIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyMyAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzOQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfRU5ERUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgMjAwCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxMAogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfZW5kZWQoKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgIQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjExCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxMgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTMKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozNAogICAgLy8gdW5pdHM9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozMi00MgogICAgLy8gcmV0dXJuIHR5cC5BY2NvdW50UG9zaXRpb24oCiAgICAvLyAgICAgcGF5bWVudF9hZGRyZXNzPXBheW1lbnRfYWRkcmVzcywKICAgIC8vICAgICB1bml0cz1VSW50NjQoMCksCiAgICAvLyAgICAgcmVzZXJ2ZWRfdW5pdHM9VUludDY0KDApLAogICAgLy8gICAgIHN1c3BlbmRlZD1GYWxzZSwKICAgIC8vICAgICBzZXR0bGVkX2N1cnNvcj1VSW50NjQoMCksCiAgICAvLyAgICAgaW50ZXJlc3RfY2hlY2twb2ludD1VSW50NjQoMCksCiAgICAvLyAgICAgcHJpbmNpcGFsX2NoZWNrcG9pbnQ9VUludDY0KDApLAogICAgLy8gICAgIGNsYWltYWJsZV9pbnRlcmVzdD1VSW50NjQoMCksCiAgICAvLyAgICAgY2xhaW1hYmxlX3ByaW5jaXBhbD1VSW50NjQoMCksCiAgICAvLyApCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGJ5dGVjIDQwIC8vIDB4MDAKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjE0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHNlbGYuX25ld19hY2NvdW50X3Bvc2l0aW9uKHBheW1lbnRfYWRkcmVzcykKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTUKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIzOAogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICB1bmNvdmVyIDMKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMzkKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQwCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0MQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzID0gcGF5bWVudF9hZGRyZXNzCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0MgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5hY2NvdW50X2dldF9wb3NpdGlvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfZ2V0X3Bvc2l0aW9uOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI1OQogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmNvbnRyYWN0X2NyZWF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X2NyZWF0ZToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDMwCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gYXJyYW5nZXIKICAgIGJ5dGVjIDE4IC8vIDB4NTIyMzQxNzI3MjYxNmU2NzY1NzIyMwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMzEKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAxOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfY29uZmlnW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfY29uZmlnOgogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBsZW4KICAgIHB1c2hpbnQgMTA3CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLk5vcm1hbGl6ZWRBY3R1c1Rlcm1zCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgcHVzaGludCA3MgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5Jbml0aWFsS2VybmVsU3RhdGUKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBsZW4KICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIHR1cGxlIGVuY29kaW5nCiAgICBkdXAKICAgIHB1c2hpbnQgMzQKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCB0YWlsIHBvaW50ZXIgYXQgaW5kZXggMSBvZiAodWludDhbMzJdLChsZW4rdXRmOFtdKSkKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgY292ZXIgMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMzYKICAgICsKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuUHJvc3BlY3R1cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2MgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDY0LTEwNjUKICAgIC8vICMgQ29uZmlndXJlIENvbnRyYWN0CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPSB0ZXJtcy5jb250cmFjdF90eXBlLmFzX3VpbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgYnogY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUA3CiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIyMAogICAgLy8gVUludDY0KGVudW1zLkNUX0FOTiksCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIxCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfTkFNKSwKICAgIHB1c2hpbnQgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIyCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfTEFNKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIzCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfTEFYKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjI0CiAgICAvLyBVSW50NjQoZW51bXMuQ1RfQ0xNKSwKICAgIHB1c2hpbnQgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJ6IGNvbnRyYWN0X2NvbmZpZ19ib29sX2ZhbHNlQDgKCmNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANzoKICAgIGludGNfMSAvLyAxCgpjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUA5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjI5CiAgICAvLyBhc3NlcnQgc2VsZi5faXNfc3VwcG9ydGVkX2NvbnRyYWN0X3R5cGUoY29udHJhY3RfdHlwZSksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2NwogICAgLy8gc2VsZi5fc3RvcmVfY29udHJhY3RfY29uZmlnKHNlbGYuY29udHJhY3RfdHlwZSwgdGVybXMsIGluaXRpYWxfc3RhdGUpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgYnVyeSAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzI1CiAgICAvLyBhc3NlcnQgdGVybXMuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZGlnIDQKICAgIGR1cAogICAgcHVzaGludCAzMwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSA4CiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMjcKICAgIC8vIHRlcm1zLmRheV9jb3VudF9jb252ZW50aW9uLmFzX3VpbnQ2NCgpCiAgICBwdXNoaW50IDU3CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICBieiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDE2CiAgICBkaWcgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk5CiAgICAvLyBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI5Ny0zMDMKICAgIC8vIHJldHVybiBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzYwKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwSVNEQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjApLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDE2CiAgICBkaWcgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzAwCiAgICAvLyBVSW50NjQoZW51bXMuRENDX0EzNjUpLAogICAgcHVzaGludCAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyOTctMzAzCiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgID09CiAgICBibnogY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUAxNgogICAgZGlnIDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMwMQogICAgLy8gVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGRpZyA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDIKICAgIC8vIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICA9PQogICAgYnogY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAMTcKCmNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTY6CiAgICBpbnRjXzEgLy8gMQoKY29udHJhY3RfY29uZmlnX2Jvb2xfbWVyZ2VAMTg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDktMzExCiAgICAvLyBhc3NlcnQgc2VsZi5faXNfc3VwcG9ydGVkX2RheV9jb3VudF9jb252ZW50aW9uKAogICAgLy8gICAgIGRheV9jb3VudF9jb252ZW50aW9uCiAgICAvLyApLCBlcnIuSU5WQUxJRF9EQVlfQ09VTlRfQ09OVkVOVElPTgogICAgYXNzZXJ0IC8vIEludmFsaWQgZGF5LWNvdW50IGNvbnZlbnRpb24gSUQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMyOQogICAgLy8gaWYgY29udHJhY3RfdHlwZSAhPSBVSW50NjQoZW51bXMuQ1RfQU5OKToKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgICE9CiAgICBieiBjb250cmFjdF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzMwCiAgICAvLyBhc3NlcnQgbm90IHRlcm1zLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24sIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZGlnIDQKICAgIHB1c2hpbnQgNzg2CiAgICBnZXRiaXQKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KCmNvbnRyYWN0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDIwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODA3CiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIEQtQVNBIGFscmVhZHkgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODA4CiAgICAvLyBhc3NlcnQgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCA9PSBVSW50NjQoMCksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMCAvLyAiaW5pdGlhbF9leGNoYW5nZV9hbW91bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTAtODExCiAgICAvLyAjIFNldCBEZW5vbWluYXRpb24gQXNzZXQKICAgIC8vIHNlbGYuX2Fzc2VydF9kZW5vbWluYXRpb25fYXNzZXQodGVybXMuZGVub21pbmF0aW9uX2Fzc2V0X2lkKQogICAgZGlnIDQKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NzUtNzc2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIGRlbm9taW5hdGlvbiB3aXRoIEFTQQogICAgLy8gX2NyZWF0b3IsIGV4aXN0cyA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X2NyZWF0b3IoZGVub21pbmF0aW9uX2Fzc2V0X2lkKQogICAgZHVwCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q3JlYXRvcgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NzcKICAgIC8vIGFzc2VydCBleGlzdHMsIGVyci5JTlZBTElEX0RFTk9NSU5BVElPTgogICAgYXNzZXJ0IC8vIERlbm9taW5hdGlvbiBhc3NldCBpcyBub3QgcHJvcGVybHkgc2V0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODAKICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICBieXRlYyA0NCAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTQtODE1CiAgICAvLyAjIFNldCBTZXR0bGVtZW50IEFzc2V0CiAgICAvLyBzZWxmLl9hc3NlcnRfc2V0dGxlbWVudF9hc3NldCh0ZXJtcy5zZXR0bGVtZW50X2Fzc2V0X2lkKQogICAgZGlnIDEKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc4NQogICAgLy8gc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODMtNzg2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc2V0dGxlbWVudCBhc3NldCBpcyB0aGUgZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQgPT0gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIC8vICksIGVyci5JTlZBTElEX1NFVFRMRU1FTlRfQVNTRVQKICAgIGFzc2VydCAvLyBEaWZmZXJlbnQgc2V0dGxlbWVudCBhc3NldCBub3Qgc3VwcG9ydGVkLCBtdXN0IGJlIGVxdWFsIHRvIGRlbm9taW5hdGlvbiBhc3NldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Nzg5CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBzZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkwLTc5NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhc3NldF9hbW91bnQ9MCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Nzk1CiAgICAvLyBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkzCiAgICAvLyBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc5NAogICAgLy8gYXNzZXRfYW1vdW50PTAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkwLTc5MQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3OTAtNzk2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODE4LTgxOQogICAgLy8gIyBVbml0cwogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IHRlcm1zLnRvdGFsX3VuaXRzCiAgICBkdXAKICAgIHB1c2hpbnQgMTcKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODIwCiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID0gVUludDY0KDApCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgyMi04MjMKICAgIC8vICMgRGF5LUNvdW50IENvbnZlbnRpb25zCiAgICAvLyBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uID0gdGVybXMuZGF5X2NvdW50X2NvbnZlbnRpb24uYXNfdWludDY0KCkKICAgIGJ5dGVjIDQ2IC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGRpZyA4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODI1LTgyNgogICAgLy8gIyBUaW1lCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA9IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZQogICAgZHVwCiAgICBwdXNoaW50IDQxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMjcgLy8gImluaXRpYWxfZXhjaGFuZ2VfZGF0ZSIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODI3CiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSB0ZXJtcy5tYXR1cml0eV9kYXRlCiAgICBkaWcgMQogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDQ1IC8vICJtYXR1cml0eV9kYXRlIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MjgKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IGluaXRpYWxfc3RhdGUubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZGlnIDYKICAgIGR1cAogICAgY292ZXIgMgogICAgcHVzaGludCA0OAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzMC04MzEKICAgIC8vICMgUHJpbmNpcGFsCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID0gdGVybXMuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGRpZyAxMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzMgogICAgLy8gc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gdGVybXMuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZGlnIDMKICAgIHB1c2hpbnQgNzg2CiAgICBnZXRiaXQKICAgIGJ5dGVjIDM0IC8vICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzMwogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBpbml0aWFsX3N0YXRlLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZGlnIDEKICAgIHB1c2hpbnQgMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODM1LTgzNgogICAgLy8gIyBJbnRlcmVzdAogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ID0gaW5pdGlhbF9zdGF0ZS5hY2NydWVkX2ludGVyZXN0CiAgICBkaWcgMQogICAgcHVzaGludCA0MAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODM4LTgzOQogICAgLy8gIyBJbnRlcmVzdCBSYXRlCiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IGluaXRpYWxfc3RhdGUubm9taW5hbF9pbnRlcmVzdF9yYXRlCiAgICBkaWcgMQogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0MAogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gaW5pdGlhbF9zdGF0ZS5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlCiAgICBkaWcgMQogICAgcHVzaGludCAyNAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQxCiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkID0gdGVybXMucmF0ZV9yZXNldF9zcHJlYWQKICAgIGRpZyAzCiAgICBwdXNoaW50IDU4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzUgLy8gInJhdGVfcmVzZXRfc3ByZWFkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0MgogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIgPSB0ZXJtcy5yYXRlX3Jlc2V0X211bHRpcGxpZXIKICAgIGRpZyAzCiAgICBwdXNoaW50IDY2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzYgLy8gInJhdGVfcmVzZXRfbXVsdGlwbGllciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDMKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9mbG9vciA9IHRlcm1zLnJhdGVfcmVzZXRfZmxvb3IKICAgIGRpZyAzCiAgICBwdXNoaW50IDc0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzAgLy8gInJhdGVfcmVzZXRfZmxvb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQ0CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfY2FwID0gdGVybXMucmF0ZV9yZXNldF9jYXAKICAgIGRpZyAzCiAgICBwdXNoaW50IDgyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzEgLy8gInJhdGVfcmVzZXRfY2FwIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0NQogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X25leHQgPSB0ZXJtcy5yYXRlX3Jlc2V0X25leHQKICAgIGRpZyAzCiAgICBwdXNoaW50IDkwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzcgLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDYKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgPSB0ZXJtcy5oYXNfcmF0ZV9yZXNldF9mbG9vcgogICAgZGlnIDMKICAgIHB1c2hpbnQgNzg0CiAgICBnZXRiaXQKICAgIGJ5dGVjIDM4IC8vICJoYXNfcmF0ZV9yZXNldF9mbG9vciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDcKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwID0gdGVybXMuaGFzX3JhdGVfcmVzZXRfY2FwCiAgICBkaWcgMwogICAgcHVzaGludCA3ODUKICAgIGdldGJpdAogICAgYnl0ZWMgMzkgLy8gImhhc19yYXRlX3Jlc2V0X2NhcCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDktODUwCiAgICAvLyAjIFNjYWxpbmcKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgPSB0ZXJtcy5maXhlZF9wb2ludF9zY2FsZQogICAgdW5jb3ZlciAzCiAgICBwdXNoaW50IDk5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODUyLTg1MwogICAgLy8gIyBTY2hlZHVsZSBQcm9jZXNzaW5nCiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciA9IGluaXRpYWxfc3RhdGUuZXZlbnRfY3Vyc29yCiAgICBkaWcgMQogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU1LTg1NgogICAgLy8gIyBQZXItVW5pdCBGaXhlZC1Qb2ludCBJbmRleGVzCiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggPSBpbml0aWFsX3N0YXRlLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgKICAgIGRpZyAxCiAgICBwdXNoaW50IDU2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU3CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4ID0gaW5pdGlhbF9zdGF0ZS5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleAogICAgZGlnIDEKICAgIHB1c2hpbnQgNjQKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU5LTg2MAogICAgLy8gIyBSZXNlcnZlZCBBbW91bnQgKGZvciBleGVjdXRlZCBjYXNoZmxvd3MpCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0ID0gVUludDY0KDApCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2MQogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2MwogICAgLy8gYXNzZXJ0IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLCBlcnIuSU5WQUxJRF9JRUQKICAgIGRpZyAyCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICBhc3NlcnQgLy8gSUVEIG11c3QgYmUgc2V0IGluIHRoZSBmdXR1cmUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2NAogICAgLy8gYXNzZXJ0IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA+IGluaXRpYWxfc3RhdGUuc3RhdHVzX2RhdGUsIGVyci5JTlZBTElEX0lFRAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgPAogICAgYXNzZXJ0IC8vIElFRCBtdXN0IGJlIHNldCBpbiB0aGUgZnV0dXJlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NjUKICAgIC8vIGFzc2VydCB0ZXJtcy5pbml0aWFsX2V4Y2hhbmdlX2RhdGUgPCB0ZXJtcy5tYXR1cml0eV9kYXRlLCBlcnIuSU5WQUxJRF9JRUQKICAgIDwKICAgIGFzc2VydCAvLyBJRUQgbXVzdCBiZSBzZXQgaW4gdGhlIGZ1dHVyZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2OS0xMDcwCiAgICAvLyAjIE5vdGFyaXplIHByb3NwZWN0dXMgKG9wdGlvbmFsKQogICAgLy8gc2VsZi5wcm9zcGVjdHVzX2hhc2ggPSBwcm9zcGVjdHVzLmhhc2guYnl0ZXMKICAgIGRpZyAyCiAgICBleHRyYWN0IDAgMzIKICAgIGJ5dGVjIDQyIC8vICJwcm9zcGVjdHVzX2hhc2giCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3MQogICAgLy8gc2VsZi5wcm9zcGVjdHVzX3VybCA9IHByb3NwZWN0dXMudXJsCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGVjIDQzIC8vICJwcm9zcGVjdHVzX3VybCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDcyCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAMTc6CiAgICBpbnRjXzAgLy8gMAogICAgYiBjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUAxOAoKY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAODoKICAgIGludGNfMCAvLyAwCiAgICBiIGNvbnRyYWN0X2NvbmZpZ19ib29sX21lcmdlQDkKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9zY2hlZHVsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X3NjaGVkdWxlOgogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHN3YXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBkdXAKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgMgogICAgKwogICAgdW5jb3ZlciAyCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLkV4ZWN1dGlvblNjaGVkdWxlRW50cnk+CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDg5CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwOTIKICAgIC8vIGNvbnRyYWN0X3R5cGU9c2VsZi5jb250cmFjdF90eXBlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGNvdmVyIDMKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4ODEKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4ODItODg0CiAgICAvLyBhc3NlcnQgc2NoZWR1bGVfcGFnZS5sZW5ndGggPD0gVUludDY0KAogICAgLy8gICAgIGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUKICAgIC8vICksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGR1cAogICAgcHVzaGludCAxNgogICAgPD0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg4NQogICAgLy8gYXNzZXJ0IHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPiBVSW50NjQoMCksIGVyci5URVJNU19OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSB0ZXJtcyBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODg3CiAgICAvLyBwYWdlX2N1cnNvciA9IHNjaGVkdWxlX3BhZ2VfaW5kZXggKiBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkKICAgIHN3YXAKICAgIHB1c2hpbnQgMTYKICAgICoKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg5NAogICAgLy8gKyBwYWdlX2xlbmd0aCAqIFVJbnQ2NChjc3QuT1BfVVBfQ09OVFJBQ1RfQ09ORklHX1BFUl9FTlRSWV9CVURHRVQpCiAgICBwdXNoaW50IDEwMAogICAgKgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODkzCiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19CQVNFX0JVREdFVCkKICAgIGludGMgNCAvLyAxNTAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTMtODk0CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19CQVNFX0JVREdFVCkKICAgIC8vICsgcGFnZV9sZW5ndGggKiBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19QRVJfRU5UUllfQlVER0VUKQogICAgKwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODg5LTg5NgogICAgLy8gIyBWYWxpZGF0aW9uIGNvc3QgZ3Jvd3Mgd2l0aCBwYWdlIGxlbmd0aCwgc28gY29uZmlndXJhdGlvbiBleHBsaWNpdGx5CiAgICAvLyAjIGJ1eXMgZXh0cmEgb3Bjb2RlIGJ1ZGdldCBmb3IgbGFyZ2VyIHVwbG9hZHMuCiAgICAvLyBlbnN1cmVfYnVkZ2V0KAogICAgLy8gICAgIHJlcXVpcmVkX2J1ZGdldD0oCiAgICAvLyAgICAgICAgIFVJbnQ2NChjc3QuT1BfVVBfQ09OVFJBQ1RfQ09ORklHX0JBU0VfQlVER0VUKQogICAgLy8gICAgICAgICArIHBhZ2VfbGVuZ3RoICogVUludDY0KGNzdC5PUF9VUF9DT05UUkFDVF9DT05GSUdfUEVSX0VOVFJZX0JVREdFVCkKICAgIC8vICAgICApLAogICAgLy8gKQogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODk3CiAgICAvLyBpbmRleCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKCmNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEAyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODk4CiAgICAvLyB3aGlsZSBpbmRleCA8IHBhZ2VfbGVuZ3RoOgogICAgZHVwCiAgICBkaWcgNAogICAgPAogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfd2hpbGVAMTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg5OS05MDAKICAgIC8vIGVudHJ5ID0gc2NoZWR1bGVfcGFnZVtpbmRleF0uY29weSgpCiAgICAvLyBlbnRyeV9ldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZGlnIDQKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGJ1cnkgMTIKICAgIGRpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgNjUKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTAwCiAgICAvLyBlbnRyeV9ldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTktOTAwCiAgICAvLyBlbnRyeSA9IHNjaGVkdWxlX3BhZ2VbaW5kZXhdLmNvcHkoKQogICAgLy8gZW50cnlfZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGludGNfMiAvLyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDAKICAgIC8vIGVudHJ5X2V2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBnZXRieXRlCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgMTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkwMQogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X2lkID09IHBhZ2VfY3Vyc29yICsgaW5kZXgsIGVyci5JTlZBTElEX0VWRU5UX0lECiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEzCiAgICBkaWcgNQogICAgdW5jb3ZlciA0CiAgICArCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDItOTA0CiAgICAvLyBzZWxmLl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBlbnRyeV9ldmVudF90eXBlCiAgICAvLyApCiAgICBkaWcgNQogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTA1CiAgICAvLyBhc3NlcnQgZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgc3dhcAogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDYKICAgIC8vIGlmIGVudHJ5LmV2ZW50X2lkID4gVUludDY0KDApOgogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDcKICAgIC8vIGlmIGluZGV4ID4gVUludDY0KDApOgogICAgZHVwCiAgICBieiBjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlANgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTA4CiAgICAvLyBwcmV2aW91c19lbnRyeSA9IHNjaGVkdWxlX3BhZ2VbaW5kZXggLSBVSW50NjQoMSldLmNvcHkoKQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgcHVzaGludCA2NQogICAgKgogICAgZGlnIDExCiAgICBzd2FwCiAgICBwdXNoaW50IDY1CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkyMwogICAgLy8gcHJldmlvdXNfZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gZW50cnkuc2NoZWR1bGVkX3RpbWUKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyA4CiAgICA8PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTIyLTkyNAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBwcmV2aW91c19lbnRyeS5zY2hlZHVsZWRfdGltZSA8PSBlbnRyeS5zY2hlZHVsZWRfdGltZQogICAgLy8gKSwgZXJyLklOVkFMSURfU09SVElORwogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIG11c3QgYmUgc29ydGVkIGluIHN0cmljdGx5IGFzY2VuZGluZyBvcmRlcgoKY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUA4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTI1CiAgICAvLyBpZiBlbnRyeS5ldmVudF9pZCA9PSBVSW50NjQoMCk6CiAgICBkaWcgOAogICAgYm56IGNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkyNi05MjgKICAgIC8vIGFzc2VydCBlbnRyeV9ldmVudF90eXBlID09IFVJbnQ2NCgKICAgIC8vICAgICBlbnVtcy5FVlRfSUVECiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGRpZyA5CiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjkKICAgIC8vIGluZGV4ICs9IFVJbnQ2NCgxKQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIGNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEAyCgpjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlANjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkxMC05MTIKICAgIC8vICMgVGhlIGZpcnN0IGVudHJ5IG9mIGEgcGFnZSBtdXN0IHN0aWxsIGJlIG9yZGVyZWQgYWZ0ZXIgdGhlCiAgICAvLyAjIGxhc3QgZW50cnkgb2YgdGhlIHByZXZpb3VzIHBhZ2UuCiAgICAvLyBhc3NlcnQgc2NoZWR1bGVfcGFnZV9pbmRleCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGRpZyA2CiAgICBkdXAKICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTMKICAgIC8vIHByZXZpb3VzX3BhZ2VfaW5kZXggPSBzY2hlZHVsZV9wYWdlX2luZGV4IC0gVUludDY0KDEpCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTE1CiAgICAvLyBwcmV2aW91c19wYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZQogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTQtOTE2CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHByZXZpb3VzX3BhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTctOTE4CiAgICAvLyBwcmV2aW91c19wYWdlID0gc2VsZi5zY2hlZHVsZV9wYWdlW3ByZXZpb3VzX3BhZ2VfaW5kZXhdLmNvcHkoKQogICAgLy8gYXNzZXJ0IHByZXZpb3VzX3BhZ2UubGVuZ3RoID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBwdXNoaW50IDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTgKICAgIC8vIGFzc2VydCBwcmV2aW91c19wYWdlLmxlbmd0aCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZHVwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjAKICAgIC8vIHByZXZpb3VzX3BhZ2UubGVuZ3RoIC0gVUludDY0KDEpCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTE5LTkyMQogICAgLy8gcHJldmlvdXNfZW50cnkgPSBwcmV2aW91c19wYWdlWwogICAgLy8gICAgIHByZXZpb3VzX3BhZ2UubGVuZ3RoIC0gVUludDY0KDEpCiAgICAvLyBdLmNvcHkoKQogICAgcHVzaGludCA2NQogICAgKgogICAgcHVzaGludCAyCiAgICArCiAgICBwdXNoaW50IDY1CiAgICBib3hfZXh0cmFjdAogICAgYiBjb250cmFjdF9zY2hlZHVsZV9hZnRlcl9pZl9lbHNlQDcKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX3doaWxlQDExOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjAwCiAgICAvLyBzZWxmLnNjaGVkdWxlX3BhZ2VbcGFnZV9pbmRleF0gPSBzY2hlZHVsZV9wYWdlLmNvcHkoKQogICAgZGlnIDYKICAgIGl0b2IKICAgIGJ5dGVjIDI0IC8vIDB4NTMyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgZGlnIDUKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzMgogICAgLy8gaWYgaXNfbGFzdF9wYWdlOgogICAgZGlnIDUKICAgIGJ6IGNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzNAogICAgLy8gc2NoZWR1bGVfcGFnZV9pbmRleCAqIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKSArIHBhZ2VfbGVuZ3RoCiAgICBkaWcgMQogICAgZGlnIDQKICAgICsKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzMwogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA9ICgKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTMzLTkzNQogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA9ICgKICAgIC8vICAgICBzY2hlZHVsZV9wYWdlX2luZGV4ICogVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpICsgcGFnZV9sZW5ndGgKICAgIC8vICkKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MzYKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgNTAKICAgIGFwcF9nbG9iYWxfcHV0Cgpjb250cmFjdF9zY2hlZHVsZV9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA5NwogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9leGVjdXRlX2llZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X2V4ZWN1dGVfaWVkOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMDcKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEwOAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMDkKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTExCiAgICAvLyBhc3NlcnQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LCBlcnIuSU5WQUxJRF9FVkVOVF9DVVJTT1IKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgZGlnIDEKICAgID4KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGN1cnNvcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTExMgogICAgLy8gZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoc2VsZi5ldmVudF9jdXJzb3IpCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMTMKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoZW51bXMuRVZUX0lFRCksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGR1cAogICAgZXh0cmFjdCA4IDEKICAgIGR1cAogICAgcHVzaGJ5dGVzIDB4MDEKICAgIGI9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTExNwogICAgLy8gZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICBkaWcgMQogICAgZXh0cmFjdCAwIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMTkKICAgIC8vIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgZGlnIDIKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTIwCiAgICAvLyBhY2NydWFsX2ZhY3Rvcj1lbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIGRpZyAzCiAgICBleHRyYWN0IDE3IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMjEKICAgIC8vIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIGRpZyA0CiAgICBleHRyYWN0IDI1IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMjMKICAgIC8vIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPWVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDUKICAgIGV4dHJhY3QgMzMgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEyNAogICAgLy8gbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgZGlnIDYKICAgIGV4dHJhY3QgNDEgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEyNQogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9ZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICBkaWcgNwogICAgZXh0cmFjdCA0OSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTI2CiAgICAvLyBmbGFncz1lbnRyeS5mbGFncywKICAgIGRpZyA4CiAgICBleHRyYWN0IDU3IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMTYtMTEyNwogICAgLy8gdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0KAogICAgLy8gICAgIGV2ZW50X2lkPWVudHJ5LmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1lbnRyeS5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1lbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPWVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9ZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPWVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGZsYWdzPWVudHJ5LmZsYWdzLAogICAgLy8gKSwKICAgIHVuY292ZXIgNwogICAgdW5jb3ZlciA4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNwogICAgY29uY2F0CiAgICB1bmNvdmVyIDYKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMjIKICAgIC8vIG9ic2VydmVkX3JhdGU9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMTYtMTEyNwogICAgLy8gdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0KAogICAgLy8gICAgIGV2ZW50X2lkPWVudHJ5LmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1lbnRyeS5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1lbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPWVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9ZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPWVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGZsYWdzPWVudHJ5LmZsYWdzLAogICAgLy8gKSwKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTE0LTExMjgKICAgIC8vIHNlbGYuX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5KAogICAgLy8gICAgIGVudHJ5LAogICAgLy8gICAgIHR5cC5PYnNlcnZlZEV2ZW50UmVxdWVzdCgKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPWVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIG9ic2VydmVkX3JhdGU9VUludDY0KDApLAogICAgLy8gICAgICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1lbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1lbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICAgICAgZmxhZ3M9ZW50cnkuZmxhZ3MsCiAgICAvLyAgICAgKSwKICAgIC8vICkKICAgIGNhbGxzdWIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5CiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMjkKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA5OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuYXBwbHlfbm9uX2Nhc2hfZXZlbnRbcm91dGluZ10oKSAtPiB2b2lkOgphcHBseV9ub25fY2FzaF9ldmVudDoKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDQKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cG4gMgogICAgbGVuCiAgICBwdXNoaW50IDczCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLk9ic2VydmVkRXZlbnRSZXF1ZXN0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE0NQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDYKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTQ4CiAgICAvLyBpZiBwYXlsb2FkLmZsYWdzICYgVUludDY0KGVudW1zLkZMQUdfT0JTRVJWRURfRVZFTlQpOgogICAgcHVzaGludCA2NQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgcHVzaGludCA0CiAgICAmCiAgICBieiBhcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIzMwogICAgLy8gcmV0dXJuIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQ0xNKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICBwdXNoaW50IDUKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTQ5CiAgICAvLyBhc3NlcnQgc2VsZi5fc3VwcG9ydHNfb2JzZXJ2ZWRfZXZlbnRzKCksIGVyci5PQlNFUlZFRF9FVkVOVF9SRVFVSVJFRAogICAgYXNzZXJ0IC8vIE9ic2VydmVkIGV2ZW50IHJlcXVpcmVkIHRvIGV4ZWN1dGUgdGhpcyBhY3Rpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTAKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjMzCiAgICAvLyByZXR1cm4gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9DTE0pCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIGR1cAogICAgcHVzaGludCA1CiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQ1CiAgICAvLyBhc3NlcnQgc2VsZi5fc3VwcG9ydHNfb2JzZXJ2ZWRfZXZlbnRzKCksIGVyci5PQlNFUlZFRF9FVkVOVF9SRVFVSVJFRAogICAgYXNzZXJ0IC8vIE9ic2VydmVkIGV2ZW50IHJlcXVpcmVkIHRvIGV4ZWN1dGUgdGhpcyBhY3Rpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk0NgogICAgLy8gYXNzZXJ0IHBheWxvYWQuZXZlbnRfaWQgPT0gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGRpZyAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDcKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBpZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQ4CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUsIHBheWxvYWQuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgYnVyeSAxMgogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk0Ny05NDkKICAgIC8vIHNlbGYuX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIHNlbGYuY29udHJhY3RfdHlwZSwgcGF5bG9hZC5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICAvLyApCiAgICBjYWxsc3ViIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTUxCiAgICAvLyBwYWdlX2luZGV4ID0gc2VsZi5fc2NoZWR1bGVfcGFnZV9pbmRleChzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTkwCiAgICAvLyByZXR1cm4gZXZlbnRfaWQgLy8gVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpCiAgICBwdXNoaW50IDE2CiAgICAvCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTIKICAgIC8vIHBhZ2UgPSB0eXAuRXhlY3V0aW9uU2NoZWR1bGVQYWdlKCkKICAgIGJ5dGVjIDQ4IC8vIDB4MDAwMAogICAgYnVyeSA3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTMKICAgIC8vIGlmIHBhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlOgogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA5CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMjcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1NAogICAgLy8gcGFnZSA9IHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XS5jb3B5KCkKICAgIGRpZyA3CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidXJ5IDcKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX3BhZ2UgZW50cnkgZXhpc3RzCgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDI3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTU1CiAgICAvLyBhc3NlcnQgcGFnZS5sZW5ndGggPCBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGRpZyA1CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgMTYKICAgIDwKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2MAogICAgLy8gc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIGRpZyAzCiAgICBkdXAKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjEKICAgIC8vIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICBkaWcgMQogICAgZXh0cmFjdCAxNyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjIKICAgIC8vIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZGlnIDIKICAgIGV4dHJhY3QgMjUgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTYzCiAgICAvLyBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDMKICAgIGV4dHJhY3QgNDEgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTY0CiAgICAvLyBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIGRpZyA0CiAgICBleHRyYWN0IDQ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2NQogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIHVuY292ZXIgNQogICAgZXh0cmFjdCA1NyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTctOTY3CiAgICAvLyB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1wYXlsb2FkLmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9cGF5bG9hZC5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPXBheWxvYWQucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXBheWxvYWQubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICkKICAgIGRpZyAxMQogICAgaXRvYgogICAgZGlnIDE4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMwogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTYtOTY4CiAgICAvLyBwYWdlLmFwcGVuZCgKICAgIC8vICAgICB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9cGF5bG9hZC5ldmVudF9pZCwKICAgIC8vICAgICAgICAgZXZlbnRfdHlwZT1wYXlsb2FkLmV2ZW50X3R5cGUsCiAgICAvLyAgICAgICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIC8vICAgICAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICAgICApCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjkKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHBhZ2UuY29weSgpCiAgICBkaWcgOAogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk3MAogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTUzCiAgICAvLyBhc3NlcnQgZXZlbnRfaWQgPT0gc2VsZi5ldmVudF9jdXJzb3IsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBjdXJzb3IKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTQKICAgIC8vIGVudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KGV2ZW50X2lkKQogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1NgogICAgLy8gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgYnVyeSAxMAogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjQKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY1CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzYzLTM3MAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9SUiksCiAgICBwdXNoaW50IDEyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY3CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICBwdXNoaW50IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY4CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgcHVzaGludCAxOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzYzLTM3MAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBieiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX2ZhbHNlQDE2CgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX3RydWVAMTU6CiAgICBpbnRjXzEgLy8gMQoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9tZXJnZUAxNzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTUtMTE1NwogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2lzX25vbl9jYXNoKAogICAgLy8gICAgIGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIC8vICksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IHR5cGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTgKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlICE9IGFyYzQuVUludDgoZW51bXMuRVZUX0lFRCksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGRpZyA4CiAgICBwdXNoYnl0ZXMgMHgwMQogICAgYiE9CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCB0eXBlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNzQKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluIChVSW50NjQoZW51bXMuRVZUX1JSKSwgVUludDY0KGVudW1zLkVWVF9SUkYpKQogICAgZGlnIDQKICAgIHB1c2hpbnQgMTIKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDIxCiAgICBkaWcgNAogICAgcHVzaGludCAxMQogICAgPT0KICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfZmFsc2VAMjIKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAyMToKICAgIGludGNfMSAvLyAxCgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX21lcmdlQDIzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1OQogICAgLy8gaWYgc2VsZi5fZXZlbnRfaXNfcmF0ZV9yZXNldChlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpKToKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Vsc2VfYm9keUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODAKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLm9ic2VydmVyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjUgLy8gMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTYzCiAgICAvLyBzZWxmLl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeShlbnRyeSwgcGF5bG9hZCkKICAgIGRpZyA2CiAgICBkaWcgMgogICAgY2FsbHN1YiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkKICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE2NAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Vsc2VfYm9keUA1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE2MgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICBiIGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VANgoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9mYWxzZUAyMjoKICAgIGludGNfMCAvLyAwCiAgICBiIGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfbWVyZ2VAMjMKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfZmFsc2VAMTY6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX21lcmdlQDE3CgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuYXBwZW5kX29ic2VydmVkX2Nhc2hfZXZlbnRbcm91dGluZ10oKSAtPiB2b2lkOgphcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudDoKICAgIGludGNfMCAvLyAwCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBsZW4KICAgIHB1c2hpbnQgNjUKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuT2JzZXJ2ZWRDYXNoRXZlbnRSZXF1ZXN0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE3NAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTc1CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE3NgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDcKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMzMKICAgIC8vIHJldHVybiBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0NMTSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgcHVzaGludCA1CiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTgxCiAgICAvLyBhc3NlcnQgc2VsZi5fc3VwcG9ydHNfb2JzZXJ2ZWRfZXZlbnRzKCksIGVyci5PQlNFUlZFRF9FVkVOVF9SRVFVSVJFRAogICAgYXNzZXJ0IC8vIE9ic2VydmVkIGV2ZW50IHJlcXVpcmVkIHRvIGV4ZWN1dGUgdGhpcyBhY3Rpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4MgogICAgLy8gYXNzZXJ0IHBheWxvYWQuZXZlbnRfaWQgPT0gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIHN3YXAKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgaWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4MwogICAgLy8gYXNzZXJ0IHBheWxvYWQuZXZlbnRfdHlwZSA9PSBhcmM0LlVJbnQ4KGVudW1zLkVWVF9QUiksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGRpZyAxCiAgICBleHRyYWN0IDggMQogICAgZHVwCiAgICBjb3ZlciAzCiAgICBwdXNoYnl0ZXMgMHgwMwogICAgYj09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCB0eXBlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5ODQKICAgIC8vIGFzc2VydCBwYXlsb2FkLmZsYWdzICYgVUludDY0KGVudW1zLkZMQUdfQ0FTSF9FVkVOVCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgc3dhcAogICAgcHVzaGludCA1NwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18xIC8vIDEKICAgICYKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4NgogICAgLy8gaWYgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA+IFVJbnQ2NCgwKToKICAgIGJ6IGFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTg4CiAgICAvLyBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IC0gVUludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTg3LTk4OQogICAgLy8gcHJldmlvdXNfZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoCiAgICAvLyAgICAgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCAtIFVJbnQ2NCgxKQogICAgLy8gKQogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OTEKICAgIC8vIHByZXZpb3VzX2VudHJ5LnNjaGVkdWxlZF90aW1lIDw9IHBheWxvYWQuc2NoZWR1bGVkX3RpbWUKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyA0CiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICA8PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTkwLTk5MgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBwcmV2aW91c19lbnRyeS5zY2hlZHVsZWRfdGltZSA8PSBwYXlsb2FkLnNjaGVkdWxlZF90aW1lCiAgICAvLyApLCBlcnIuSU5WQUxJRF9TT1JUSU5HCiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbXVzdCBiZSBzb3J0ZWQgaW4gc3RyaWN0bHkgYXNjZW5kaW5nIG9yZGVyCgphcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OTQKICAgIC8vIHBhZ2VfaW5kZXggPSBzZWxmLl9zY2hlZHVsZV9wYWdlX2luZGV4KHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxOTAKICAgIC8vIHJldHVybiBldmVudF9pZCAvLyBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkKICAgIHB1c2hpbnQgMTYKICAgIC8KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5NQogICAgLy8gcGFnZSA9IHR5cC5FeGVjdXRpb25TY2hlZHVsZVBhZ2UoKQogICAgYnl0ZWMgNDggLy8gMHgwMDAwCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5NgogICAgLy8gaWYgcGFnZV9pbmRleCBpbiBzZWxmLnNjaGVkdWxlX3BhZ2U6CiAgICBpdG9iCiAgICBieXRlYyAyNCAvLyAweDUzMjMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDcKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogYXBwZW5kX29ic2VydmVkX2Nhc2hfZXZlbnRfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OTcKICAgIC8vIHBhZ2UgPSBzZWxmLnNjaGVkdWxlX3BhZ2VbcGFnZV9pbmRleF0uY29weSgpCiAgICBkaWcgNQogICAgYm94X2dldAogICAgc3dhcAogICAgYnVyeSA2CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9wYWdlIGVudHJ5IGV4aXN0cwoKYXBwZW5kX29ic2VydmVkX2Nhc2hfZXZlbnRfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTk4CiAgICAvLyBhc3NlcnQgcGFnZS5sZW5ndGggPCBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGRpZyA0CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgMTYKICAgIDwKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMDMKICAgIC8vIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICBkaWcgNQogICAgZHVwCiAgICBleHRyYWN0IDkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAwNAogICAgLy8gYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIGRpZyAxCiAgICBleHRyYWN0IDE3IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMDUKICAgIC8vIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZGlnIDIKICAgIGV4dHJhY3QgMjUgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAwNgogICAgLy8gbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9cGF5bG9hZC5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIGRpZyAzCiAgICBleHRyYWN0IDMzIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMDcKICAgIC8vIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgZGlnIDQKICAgIGV4dHJhY3QgNDEgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAwOAogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIHVuY292ZXIgNQogICAgZXh0cmFjdCA0OSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDAwLTEwMTAKICAgIC8vIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgIGV2ZW50X2lkPXBheWxvYWQuZXZlbnRfaWQsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1wYXlsb2FkLmV2ZW50X3R5cGUsCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPXBheWxvYWQubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1wYXlsb2FkLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICBmbGFncz1wYXlsb2FkLmZsYWdzLAogICAgLy8gKQogICAgZGlnIDEwCiAgICBpdG9iCiAgICBkaWcgMTAKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5OS0xMDExCiAgICAvLyBwYWdlLmFwcGVuZCgKICAgIC8vICAgICB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9cGF5bG9hZC5ldmVudF9pZCwKICAgIC8vICAgICAgICAgZXZlbnRfdHlwZT1wYXlsb2FkLmV2ZW50X3R5cGUsCiAgICAvLyAgICAgICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIC8vICAgICAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICAgICApCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDEyCiAgICAvLyBzZWxmLnNjaGVkdWxlX3BhZ2VbcGFnZV9pbmRleF0gPSBwYWdlLmNvcHkoKQogICAgZGlnIDYKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDEzCiAgICAvLyBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50ICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExODAKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfZ2V0X3N0YXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfZ2V0X3N0YXRlOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBkdXAKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE4NwogICAgLy8gY29udHJhY3RfdHlwZT1hcmM0LlVJbnQ4KHNlbGYuY29udHJhY3RfdHlwZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzIgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExODkKICAgIC8vIHRvdGFsX3VuaXRzPXNlbGYudG90YWxfdW5pdHMsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE5MAogICAgLy8gcmVzZXJ2ZWRfdW5pdHNfdG90YWw9c2VsZi5yZXNlcnZlZF91bml0c190b3RhbCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTkxCiAgICAvLyBpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudD1zZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExOTIKICAgIC8vIGV2ZW50X2N1cnNvcj1zZWxmLmV2ZW50X2N1cnNvciwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE5MwogICAgLy8gc2NoZWR1bGVfZW50cnlfY291bnQ9c2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExOTQKICAgIC8vIG91dHN0YW5kaW5nX3ByaW5jaXBhbD1zZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE5NQogICAgLy8gaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZT1zZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE5NgogICAgLy8gbm9taW5hbF9pbnRlcmVzdF9yYXRlPXNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTk3CiAgICAvLyBhY2NydWVkX2ludGVyZXN0PXNlbGYuYWNjcnVlZF9pbnRlcmVzdCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTk4CiAgICAvLyBjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4PXNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE5OQogICAgLy8gY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXg9c2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjAwCiAgICAvLyByZXNlcnZlZF9pbnRlcmVzdD1zZWxmLnJlc2VydmVkX2ludGVyZXN0LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMDEKICAgIC8vIHJlc2VydmVkX3ByaW5jaXBhbD1zZWxmLnJlc2VydmVkX3ByaW5jaXBhbCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExODYtMTIwMgogICAgLy8gcmV0dXJuIHR5cC5LZXJuZWxTdGF0ZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlPWFyYzQuVUludDgoc2VsZi5jb250cmFjdF90eXBlKSwKICAgIC8vICAgICBzdGF0dXM9c2VsZi5zdGF0dXMsCiAgICAvLyAgICAgdG90YWxfdW5pdHM9c2VsZi50b3RhbF91bml0cywKICAgIC8vICAgICByZXNlcnZlZF91bml0c190b3RhbD1zZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsLAogICAgLy8gICAgIGluaXRpYWxfZXhjaGFuZ2VfYW1vdW50PXNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQsCiAgICAvLyAgICAgZXZlbnRfY3Vyc29yPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgLy8gICAgIHNjaGVkdWxlX2VudHJ5X2NvdW50PXNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQsCiAgICAvLyAgICAgb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2U9c2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlLAogICAgLy8gICAgIG5vbWluYWxfaW50ZXJlc3RfcmF0ZT1zZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBhY2NydWVkX2ludGVyZXN0PXNlbGYuYWNjcnVlZF9pbnRlcmVzdCwKICAgIC8vICAgICBjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4PXNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCwKICAgIC8vICAgICBjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleD1zZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4LAogICAgLy8gICAgIHJlc2VydmVkX2ludGVyZXN0PXNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QsCiAgICAvLyAgICAgcmVzZXJ2ZWRfcHJpbmNpcGFsPXNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsLAogICAgLy8gKQogICAgdW5jb3ZlciAxNAogICAgaXRvYgogICAgdW5jb3ZlciAxNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDEzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDEwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgOQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDgKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTgyCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnRbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIwOAogICAgLy8gaWYgc2VsZi5ldmVudF9jdXJzb3IgPj0gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgPj0KICAgIGJ6IGNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMTAKICAgIC8vIGV2ZW50X2lkPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjA5LTEyMTkKICAgIC8vIHJldHVybiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1zZWxmLmV2ZW50X2N1cnNvciwKICAgIC8vICAgICBldmVudF90eXBlPWFyYzQuVUludDgoMCksCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9VUludDY0KDApLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9VUludDY0KDApLAogICAgLy8gICAgIGZsYWdzPVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGl0b2IKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMTEKICAgIC8vIGV2ZW50X3R5cGU9YXJjNC5VSW50OCgwKSwKICAgIGJ5dGVjIDQwIC8vIDB4MDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMDktMTIxOQogICAgLy8gcmV0dXJuIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgIGV2ZW50X2lkPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgLy8gICAgIGV2ZW50X3R5cGU9YXJjNC5VSW50OCgwKSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1VSW50NjQoMCksCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1VSW50NjQoMCksCiAgICAvLyAgICAgZmxhZ3M9VUludDY0KDApLAogICAgLy8gKQogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjEyCiAgICAvLyBzY2hlZHVsZWRfdGltZT1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIwOS0xMjE5CiAgICAvLyByZXR1cm4gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkoCiAgICAvLyAgICAgZXZlbnRfaWQ9c2VsZi5ldmVudF9jdXJzb3IsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1hcmM0LlVJbnQ4KDApLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPVVJbnQ2NCgwKSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249VUludDY0KDApLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPVVJbnQ2NCgwKSwKICAgIC8vICAgICBmbGFncz1VSW50NjQoMCksCiAgICAvLyApCiAgICBpdG9iCiAgICBzd2FwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKCmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudF9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudEA0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIwNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpjb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIyMAogICAgLy8gcmV0dXJuIHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLmV2ZW50X2N1cnNvcikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjA0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50QDQKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5jb250cmFjdF91cGRhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF91cGRhdGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTUzLTE1NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGdyYW50cyB0aGUgdXBkYXRlIHBlcm1pc3Npb25zIHRvIHRoZSBBcnJhbmdlci4KICAgIC8vICMg4pqg77iPIFdBUk5JTkc6IEFwcGxpY2F0aW9uIHVwZGF0ZXMgbXVzdCBiZSBleGVjdXRlZCBWRVJZIGNhcmVmdWxseSwgYXMgdGhleQogICAgLy8gIyBtaWdodCBpbnRyb2R1Y2UgYnJlYWtpbmcgY2hhbmdlcy4KICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfcm90YXRlX2FycmFuZ2VyW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19yb3RhdGVfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2OQogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTcwCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gbmV3X2FycmFuZ2VyCiAgICBieXRlYyAxOCAvLyAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTcxCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfc2V0X29wX2RhZW1vbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfc2V0X29wX2RhZW1vbjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTg0CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODUKICAgIC8vIHNlbGYub3BfZGFlbW9uLnZhbHVlID0gYWRkcmVzcwogICAgYnl0ZWMgMjYgLy8gMHg1MjIzNGY3MDQ0NjE2NTZkNmY2ZTIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4NgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTczCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2Fzc2lnbl9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19hc3NpZ25fcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDE2CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLlJvbGVWYWxpZGl0eQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjExCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMgogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgcHVzaGludCAyMAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTAzCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gcm9sZV9hZGRyZXNzCiAgICBieXRlYyAxOCAvLyAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMKICAgIGRpZyAzCiAgICBhcHBfZ2xvYmFsX3B1dAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTQKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDYKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIGR1cAogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnRfbWFuYWdlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMyAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDRkNjE2ZTYxNjc2NTcyMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwOAogICAgLy8gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMiAvLyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTIKICAgIC8vIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIGR1cAogICAgcHVzaGludCA2MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE1CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMzIgLy8gMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE2CiAgICAvLyBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExOAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMSAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIwCiAgICAvLyBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMwogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgODAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIzCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI1IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI0CiAgICAvLyBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3Jldm9rZV9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19yZXZva2Vfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzUKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzNgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzcKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCkpCiAgICBidG9pCiAgICBkdXBuIDIKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCAhPSBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksIGVyci5JTlZBTElEX1JPTEUKICAgIGR1cAogICAgcHVzaGludCAyMAogICAgIT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyOAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIzIC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0NGQ2MTZlNjE2NzY1NzIyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMwCiAgICAvLyBkZWwgc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzOQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjE2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIyIC8vIDB4NTIyMzUwNzI2OTZkNjE3Mjc5NDQ2NTYxNmM2NTcyMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNAogICAgLy8gZGVsIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjM4CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIGR1cAogICAgcHVzaGludCA2MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAzMiAvLyAweDUyMjM1NDcyNzU3Mzc0NjU2NTIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzgKICAgIC8vIGRlbCBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjM4CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDEKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hdXRob3JpdHksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjEgLy8gMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MgogICAgLy8gZGVsIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzOAogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDQKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDgwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI1IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ2CiAgICAvLyBkZWwgc2VsZi5vYnNlcnZlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfY29udHJhY3Rfc3VzcGVuc2lvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfY29udHJhY3Rfc3VzcGVuc2lvbjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCAgIyBUT0RPOiBVcGRhdGUgc3BlY3MgYW5kIGFkZCB0ZXN0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojc3CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyMSAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1NwogICAgLy8gc2VsZi5hc3NldF9zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGJ5dGVjIDMzIC8vICJhc3NldF9zdXNwZW5kZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1OAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QgICMgVE9ETzogVXBkYXRlIHNwZWNzIGFuZCBhZGQgdGVzdAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X2FycmFuZ2VyW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjY4CiAgICAvLyByZXR1cm4gc2VsZi5hcnJhbmdlci52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE4IC8vIDB4NTIyMzQxNzI3MjYxNmU2NzY1NzIyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI2MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYWRkcmVzc19yb2xlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjcwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4NAogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hY2NvdW50X21hbmFnZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjMgLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQ0ZDYxNmU2MTY3NjU3MjIzCiAgICBkaWcgMQogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODUKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYucHJpbWFyeV9kZWFsZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjIgLy8gMHg1MjIzNTA3MjY5NmQ2MTcyNzk0NDY1NjE2YzY1NzIyMwogICAgZGlnIDIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg2CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnRydXN0ZWUsIGFkZHJlc3MpLAogICAgYnl0ZWMgMzIgLy8gMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMwogICAgZGlnIDMKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg3CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgYWRkcmVzcyksCiAgICBieXRlYyAyMSAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgZGlnIDQKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg4CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLm9ic2VydmVyLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDI1IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgdW5jb3ZlciA1CiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlYyA0MCAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciA2CiAgICBzZXRiaXQKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDUKICAgIHNldGJpdAogICAgcHVzaGludCAyCiAgICB1bmNvdmVyIDQKICAgIHNldGJpdAogICAgcHVzaGludCAzCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgcHVzaGludCA0CiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwNQogICAgLy8gcm9sZSA9IHJvbGVfaWQuYXNfdWludDY0KCkKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDYKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGUpCiAgICBkdXAKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA4CiAgICAvLyBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKToKICAgIHB1c2hpbnRzIDIwIDQwIDUwIDYwIDcwIDgwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA3LTMzOAogICAgLy8gbWF0Y2ggcm9sZToKICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKToKICAgIC8vICAgICAgICAgcmV0dXJuIHR5cC5Sb2xlVmFsaWRpdHkoCiAgICAvLyAgICAgICAgICAgICByb2xlX3ZhbGlkaXR5X3N0YXJ0PVVJbnQ2NCgwKSwgcm9sZV92YWxpZGl0eV9lbmQ9VUludDY0KDApCiAgICAvLyAgICAgICAgICkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSk6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSk6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgXzoKICAgIC8vICAgICAgICAgb3AuZXJyKGVyci5JTlZBTElEX1JPTEUpCiAgICB1bmNvdmVyIDYKICAgIG1hdGNoIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMEAyIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMUAzIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMkA0IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfM0A1IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNEA2IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzM4CiAgICAvLyBvcC5lcnIoZXJyLklOVkFMSURfUk9MRSkKICAgIGVyciAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV81QDc6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzM0CiAgICAvLyBzZWxmLm9ic2VydmVyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDI1IC8vIDB4NTIyMzRmNjI3MzY1NzI3NjY1NzIyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMzMy0zMzUKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLm9ic2VydmVyLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzYKICAgIC8vIHJldHVybiBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV80QDY6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI5CiAgICAvLyBzZWxmLmF1dGhvcml0eSwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAyMSAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOC0zMzAKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLmF1dGhvcml0eSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzMxCiAgICAvLyByZXR1cm4gc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8zQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI0CiAgICAvLyBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMzIgLy8gMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMy0zMjUKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyNgogICAgLy8gcmV0dXJuIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzJANDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTkKICAgIC8vIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMjIgLy8gMHg1MjIzNTA3MjY5NmQ2MTcyNzk0NDY1NjE2YzY1NzIyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxOC0zMjAKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLnByaW1hcnlfZGVhbGVyLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjEKICAgIC8vIHJldHVybiBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMUAzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxNAogICAgLy8gc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMjMgLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQ0ZDYxNmU2MTY3NjU3MjIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEzLTMxNQogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTYKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzBAMjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDktMzExCiAgICAvLyByZXR1cm4gdHlwLlJvbGVWYWxpZGl0eSgKICAgIC8vICAgICByb2xlX3ZhbGlkaXR5X3N0YXJ0PVVJbnQ2NCgwKSwgcm9sZV92YWxpZGl0eV9lbmQ9VUludDY0KDApCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB2b2lkOgpfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZDoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNgogICAgLy8gZGVmIF9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHNlbGYsIGhvbGRpbmdfYWRkcmVzczogQWNjb3VudCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI4CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZCwgZXJyLlNVU1BFTkRFRAogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHB1c2hpbnQgMzg0CiAgICBnZXRiaXQKICAgICEKICAgIGFzc2VydCAvLyBTdXNwZW5kZWQgb3BlcmF0aW9ucwogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuX3NldHRsZV9wb3NpdGlvbihob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB1aW50NjQsIHVpbnQ2NDoKX3NldHRsZV9wb3NpdGlvbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo0NAogICAgLy8gZGVmIF9zZXR0bGVfcG9zaXRpb24oc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50KSAtPiB0dXBsZVtVSW50NjQsIFVJbnQ2NF06CiAgICBwcm90byAxIDIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDUyMjM0MTYzNjM2Zjc1NmU3NDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NjEKICAgIC8vIHBvc2l0aW9uID0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY29weSgpCiAgICBkdXAKICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjYzLTY1CiAgICAvLyAjIENvbXB1dGUgdGhlIGluY3JlbWVudGFsIHBlci11bml0IGZpeGVkLXBvaW50IGludGVyZXN0IGFuZCBwcmluY2lwYWwgYWNjcnVlZAogICAgLy8gIyBzaW5jZSB0aGlzIGFjY291bnQncyBsYXN0IGNoZWNrcG9pbnQuCiAgICAvLyBpbnRlcmVzdF9kZWx0YSA9IHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCAtIHBvc2l0aW9uLmludGVyZXN0X2NoZWNrcG9pbnQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IGV4aXN0cwogICAgZGlnIDEKICAgIHB1c2hpbnQgNTcKICAgIGV4dHJhY3RfdWludDY0CiAgICAtCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NjcKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggLSBwb3NpdGlvbi5wcmluY2lwYWxfY2hlY2twb2ludAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCBleGlzdHMKICAgIGRpZyAyCiAgICBwdXNoaW50IDY1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjczCiAgICAvLyBpbnRlcmVzdF9kZWx0YSwgcG9zaXRpb24udW5pdHMsIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUKICAgIGRpZyAyCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzAtNzQKICAgIC8vICMgQ29udmVydCB0aGUgcGVyLXVuaXQgZml4ZWQtcG9pbnQgZGVsdGFzIGludG8gYWJzb2x1dGUgY2xhaW1hYmxlIGFtb3VudHMKICAgIC8vICMgdXNpbmcgdGhlIGFjY291bnQncyBhY3RpdmUgdW5pdHMuCiAgICAvLyBjbGFpbWFibGVfaW50ZXJlc3QgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBpbnRlcmVzdF9kZWx0YSwgcG9zaXRpb24udW5pdHMsIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUKICAgIC8vICkKICAgIHVuY292ZXIgMwogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3NgogICAgLy8gcHJpbmNpcGFsX2RlbHRhLCBwb3NpdGlvbi51bml0cywgc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojc1LTc3CiAgICAvLyBjbGFpbWFibGVfcHJpbmNpcGFsID0gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgcHJpbmNpcGFsX2RlbHRhLCBwb3NpdGlvbi51bml0cywgc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgLy8gKQogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3OS04MQogICAgLy8gIyBBY2NydWUgdGhlIGNsYWltYWJsZSBhbW91bnRzIHRvIHRoZSBhY2NvdW50IHBvc2l0aW9uIGFuZCBtYWtlIHRoZW0gYXZhaWxhYmxlCiAgICAvLyAjIGZvciB3aXRoZHJhd2FsLgogICAgLy8gcG9zaXRpb24uY2xhaW1hYmxlX2ludGVyZXN0ICs9IGNsYWltYWJsZV9pbnRlcmVzdAogICAgZGlnIDIKICAgIHB1c2hpbnQgNzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgKwogICAgaXRvYgogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICByZXBsYWNlMiA3MwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjgyCiAgICAvLyBwb3NpdGlvbi5jbGFpbWFibGVfcHJpbmNpcGFsICs9IGNsYWltYWJsZV9wcmluY2lwYWwKICAgIGR1cAogICAgcHVzaGludCA4MQogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICArCiAgICBpdG9iCiAgICByZXBsYWNlMiA4MQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojg0LTg2CiAgICAvLyAjIEFkdmFuY2UgdGhlIGFjY291bnQncyBwZXItdW5pdCBmaXhlZC1wb2ludCBjaGVja3BvaW50cyB0byB0aGUgY3VycmVudCBnbG9iYWwKICAgIC8vICMgcGVyLXVuaXQgZml4ZWQtcG9pbnQgZ2xvYmFsIGluZGljZXMuCiAgICAvLyBwb3NpdGlvbi5pbnRlcmVzdF9jaGVja3BvaW50ID0gc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCBleGlzdHMKICAgIGl0b2IKICAgIHJlcGxhY2UyIDU3CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6ODcKICAgIC8vIHBvc2l0aW9uLnByaW5jaXBhbF9jaGVja3BvaW50ID0gc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCBleGlzdHMKICAgIGl0b2IKICAgIHJlcGxhY2UyIDY1CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6ODktOTAKICAgIC8vICMgQWR2YW5jZSB0aGUgYWNjb3VudCdzIGV2ZW50IGN1cnNvciB0byB0aGUgY3VycmVudCBnbG9iYWwgZXZlbnQgY3Vyc29yLgogICAgLy8gcG9zaXRpb24uc2V0dGxlZF9jdXJzb3IgPSBzZWxmLmV2ZW50X2N1cnNvcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpdG9iCiAgICByZXBsYWNlMiA0OQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjkyLTk0CiAgICAvLyAjIFVwZGF0ZSB0aGUgYWNjb3VudCBwb3NpdGlvbiBhbmQgcmV0dXJuIHRoZSBuZXdseSBhY2NydWVkIGNsYWltYWJsZSBhbW91bnRzCiAgICAvLyAjIGFkZGVkIHRvIHRoZSB0b3RhbCBwb3NpdGlvbidzIGNsYWltYWJsZSBhbW91bnRzLgogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSBwb3NpdGlvbi5jb3B5KCkKICAgIHVuY292ZXIgMwogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojk1CiAgICAvLyByZXR1cm4gY2xhaW1hYmxlX2ludGVyZXN0LCBjbGFpbWFibGVfcHJpbmNpcGFsCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5fZW5zdXJlX3VuaXRzX2FjdGl2YXRlZChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB2b2lkOgpfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZDoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo5NwogICAgLy8gZGVmIF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKHNlbGYsIGhvbGRpbmdfYWRkcmVzczogQWNjb3VudCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0MjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTAwCiAgICAvLyBpZiBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKToKICAgIGJ6IF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwMQogICAgLy8gcmV0dXJuCiAgICByZXRzdWIKCl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDMKICAgIC8vIHBvc2l0aW9uID0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY29weSgpCiAgICBmcmFtZV9kaWcgMgogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA0CiAgICAvLyBpZiBwb3NpdGlvbi5yZXNlcnZlZF91bml0cyA9PSBVSW50NjQoMCk6CiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIGJueiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZF9hZnRlcl9pZl9lbHNlQDQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDUKICAgIC8vIHJldHVybgogICAgcmV0c3ViCgpfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZF9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA4CiAgICAvLyBwb3NpdGlvbi51bml0cyArPSBhY3RpdmF0ZWRfdW5pdHMKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDMKICAgICsKICAgIGl0b2IKICAgIHJlcGxhY2UyIDMyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA5CiAgICAvLyBwb3NpdGlvbi5yZXNlcnZlZF91bml0cyA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGl0b2IKICAgIHJlcGxhY2UyIDQwCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTEwCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHBvc2l0aW9uLmNvcHkoKQogICAgZnJhbWVfZGlnIDIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTEKICAgIC8vIGFzc2VydCBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID49IGFjdGl2YXRlZF91bml0cywgZXJyLk9WRVJfRElTVFJJQlVUSU9OCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIGV4aXN0cwogICAgZHVwCiAgICBkaWcgMgogICAgPj0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgcmVtYWluaW5nIEQtQVNBIHVuaXRzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTEyCiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIC09IGFjdGl2YXRlZF91bml0cwogICAgc3dhcAogICAgLQogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9zY2FsZWRfbXVsX2RpdihtdWx0aXBsaWNhbmQ6IHVpbnQ2NCwgbXVsdGlwbGllcjogdWludDY0LCBkaXZpc29yOiB1aW50NjQpIC0+IHVpbnQ2NDoKX3NjYWxlZF9tdWxfZGl2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTUzLTE1NQogICAgLy8gZGVmIF9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLCBtdWx0aXBsaWNhbmQ6IFVJbnQ2NCwgbXVsdGlwbGllcjogVUludDY0LCBkaXZpc29yOiBVSW50NjQKICAgIC8vICkgLT4gVUludDY0OgogICAgcHJvdG8gMyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTcKICAgIC8vIGlmIG11bHRpcGxpY2FuZCA9PSBVSW50NjQoMCkgb3IgbXVsdGlwbGllciA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTMKICAgIGJ6IF9zY2FsZWRfbXVsX2Rpdl9pZl9ib2R5QDIKICAgIGZyYW1lX2RpZyAtMgogICAgYm56IF9zY2FsZWRfbXVsX2Rpdl9hZnRlcl9pZl9lbHNlQDMKCl9zY2FsZWRfbXVsX2Rpdl9pZl9ib2R5QDI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTgKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9zY2FsZWRfbXVsX2Rpdl9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTkKICAgIC8vIGhpZ2gsIGxvdyA9IG9wLm11bHcobXVsdGlwbGljYW5kLCBtdWx0aXBsaWVyKQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIG11bHcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2MAogICAgLy8gcmV0dXJuIG9wLmRpdncoaGlnaCwgbG93LCBkaXZpc29yKQogICAgZnJhbWVfZGlnIC0xCiAgICBkaXZ3CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYW1vdW50X3RvX2luZGV4X2RlbHRhKGFtb3VudDogdWludDY0KSAtPiB1aW50NjQ6Cl9hbW91bnRfdG9faW5kZXhfZGVsdGE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjIKICAgIC8vIGRlZiBfYW1vdW50X3RvX2luZGV4X2RlbHRhKHNlbGYsIGFtb3VudDogVUludDY0KSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2NAogICAgLy8gaWYgYW1vdW50ID09IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMQogICAgYm56IF9hbW91bnRfdG9faW5kZXhfZGVsdGFfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjUKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9hbW91bnRfdG9faW5kZXhfZGVsdGFfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTY2CiAgICAvLyBhc3NlcnQgc2VsZi50b3RhbF91bml0cyA+IFVJbnQ2NCgwKSwgZXJyLk5PX1VOSVRTCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgZHVwCiAgICBhc3NlcnQgLy8gTm8gRC1BU0EgdW5pdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2NwogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KGFtb3VudCwgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwgc2VsZi50b3RhbF91bml0cykKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2luZGV4X2RlbHRhX3RvX2Ftb3VudChpbmRleF9kZWx0YTogdWludDY0KSAtPiB1aW50NjQ6Cl9pbmRleF9kZWx0YV90b19hbW91bnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjkKICAgIC8vIGRlZiBfaW5kZXhfZGVsdGFfdG9fYW1vdW50KHNlbGYsIGluZGV4X2RlbHRhOiBVSW50NjQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTc2CiAgICAvLyBpZiBpbmRleF9kZWx0YSA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGJueiBfaW5kZXhfZGVsdGFfdG9fYW1vdW50X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTc3CiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfaW5kZXhfZGVsdGFfdG9fYW1vdW50X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE3OQogICAgLy8gc2VsZi50b3RhbF91bml0cywKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxODEKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNzgtMTgyCiAgICAvLyByZXR1cm4gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgc2VsZi50b3RhbF91bml0cywKICAgIC8vICAgICBpbmRleF9kZWx0YSwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2dldF9zY2hlZHVsZV9lbnRyeShldmVudF9pZDogdWludDY0KSAtPiBieXRlczoKX2dldF9zY2hlZHVsZV9lbnRyeToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIwMgogICAgLy8gZGVmIF9nZXRfc2NoZWR1bGVfZW50cnkoc2VsZiwgZXZlbnRfaWQ6IFVJbnQ2NCkgLT4gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnk6CiAgICBwcm90byAxIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIwNAogICAgLy8gYXNzZXJ0IGV2ZW50X2lkIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgPgogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgaWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE5MAogICAgLy8gcmV0dXJuIGV2ZW50X2lkIC8vIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDE2CiAgICAvCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMDYKICAgIC8vIGFzc2VydCBwYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxOTQKICAgIC8vIHJldHVybiBldmVudF9pZCAlIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDE2CiAgICAlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMDkKICAgIC8vIGFzc2VydCBvZmZzZXQgPCBwYWdlLmxlbmd0aCwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBwdXNoaW50IDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgMQogICAgPgogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjEwCiAgICAvLyByZXR1cm4gcGFnZVtvZmZzZXRdLmNvcHkoKQogICAgcHVzaGludCA2NQogICAgKgogICAgcHVzaGludCAyCiAgICArCiAgICBwdXNoaW50IDY1CiAgICBib3hfZXh0cmFjdAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKGNvbnRyYWN0X3R5cGU6IHVpbnQ2NCwgZXZlbnRfdHlwZTogdWludDY0KSAtPiB2b2lkOgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTMtMzE1CiAgICAvLyBkZWYgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIHNlbGYsIGNvbnRyYWN0X3R5cGU6IFVJbnQ2NCwgZXZlbnRfdHlwZTogVUludDY0CiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNDcKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNDgKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgaW50Y18yIC8vIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI0OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9NRCksCiAgICBwdXNoaW50IDE5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTAKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgcHVzaGludCAxMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU0LTI1NQogICAgLy8gIyBDaGVjayBjb21tb24gZXZlbnRzIGZpcnN0CiAgICAvLyBpZiBldmVudF90eXBlIGluIGNvbW1vbl9ldmVudHM6CiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjUxCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICBwdXNoaW50IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUA3CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU2CiAgICAvLyByZXR1cm4gVHJ1ZQogICAgaW50Y18xIC8vIDEKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICByZXRzdWIKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTgtMjU5CiAgICAvLyAjIENvbnRyYWN0LXNwZWNpZmljIGFkZGl0aW9uYWwgZXZlbnRzCiAgICAvLyBpZiBjb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9QQU0pOgogICAgZnJhbWVfZGlnIC0yCiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjYwLTI2MQogICAgLy8gIyBQQU0gb25seSBzdXBwb3J0cyBjb21tb24gZXZlbnRzCiAgICAvLyByZXR1cm4gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNjMKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0xBTSkgb3IgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2My0yNjUKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0xBTSkgb3IgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoCiAgICAvLyAgICAgZW51bXMuQ1RfTkFNCiAgICAvLyApOgogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDExCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMgogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDE2CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUAxMToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2Ni0yNzAKICAgIC8vICMgTEFNL05BTSBhZGQ6IFBSLCBJUENCCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjY4CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjY2LTI3MAogICAgLy8gIyBMQU0vTkFNIGFkZDogUFIsIElQQ0IKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDEzCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIHB1c2hpbnQgMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2Ni0yNzAKICAgIC8vICMgTEFNL05BTSBhZGQ6IFBSLCBJUENCCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICkKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF9mYWxzZUAxNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAxMzoKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDE0OgogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMTY6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzIKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTik6CiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMjMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3My0yNzgKICAgIC8vICMgQU5OIGFkZHM6IFBSLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjc1CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjczLTI3OAogICAgLy8gIyBBTk4gYWRkczogUFIsIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDIwCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIHB1c2hpbnQgMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3My0yNzgKICAgIC8vICMgQU5OIGFkZHM6IFBSLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyMAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzcKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIHB1c2hpbnQgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjczLTI3OAogICAgLy8gIyBBTk4gYWRkczogUFIsIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDIxCgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDIwOgogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMjE6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAyMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MAogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfTEFYKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA0CiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMzEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MS0yODcKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MwogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUiksCiAgICBwdXNoaW50IDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MS0yODcKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjgKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjg0CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjgxLTI4NwogICAgLy8gIyBMQVggYWRkczogUFIsIFBJLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyOAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODUKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICBwdXNoaW50IDE4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODEtMjg3CiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDI4CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODEtMjg3CiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDI5CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDI4OgogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMjk6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAzMToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4OQogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQ0xNKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA1CiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMzMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI5MC0yOTEKICAgIC8vICMgQ0xNIGFkZHM6IFBSCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1BSKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDMKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDMzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjkzCiAgICAvLyByZXR1cm4gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5faXNfZHluYW1pY19hbm51aXR5KCkgLT4gdWludDY0OgpfaXNfZHluYW1pY19hbm51aXR5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM1CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzUtMzM2CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIC8vIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGJ6IF9pc19keW5hbWljX2FubnVpdHlfYm9vbF9mYWxzZUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzYKICAgIC8vIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzNCAvLyAiZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM1LTMzNgogICAgLy8gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICAvLyBhbmQgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBieiBfaXNfZHluYW1pY19hbm51aXR5X2Jvb2xfZmFsc2VAMwogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMzNC0zMzcKICAgIC8vIHJldHVybiAoCiAgICAvLyAgICAgc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICAvLyAgICAgYW5kIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgLy8gKQogICAgcmV0c3ViCgpfaXNfZHluYW1pY19hbm51aXR5X2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzQtMzM3CiAgICAvLyByZXR1cm4gKAogICAgLy8gICAgIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKQogICAgLy8gICAgIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIC8vICkKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KGVudHJ5OiBieXRlcykgLT4gdWludDY0LCBieXRlczoKX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozODAKICAgIC8vIGRlZiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudChzZWxmLCBlbnRyeTogdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5CiAgICAvLyBlbnRyeS5hY2NydWFsX2ZhY3RvciA9PSBVSW50NjQoMCkKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAxNwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5LTM5MQogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGJ6IF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2lmX2JvZHlAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzkwCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5LTM5MQogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGJ6IF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2lmX2JvZHlAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzkxCiAgICAvLyBvciBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPT0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5LTM5MQogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGJueiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudF9hZnRlcl9pZl9lbHNlQDQKCl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2lmX2JvZHlAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5MwogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2RpZyAtMQogICAgdW5jb3ZlciAyCiAgICByZXRzdWIKCl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NQogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NgogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NC0zOTgKICAgIC8vIGFjY3J1ZWQgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICAvLyAgICAgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICkKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MDIKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozOTktNDAzCiAgICAvLyByZXR1cm4gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgYWNjcnVlZCwKICAgIC8vICAgICBlbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICBmcmFtZV9kaWcgLTEKICAgIHVuY292ZXIgMgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yKGRpc2NvdW50X2ZhY3RvcjogdWludDY0LCByZWRlbXB0aW9uX2ZhY3RvcjogdWludDY0KSAtPiB1aW50NjQ6Cl9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ2Mi00NjYKICAgIC8vIGRlZiBfZGlzY291bnRfYW5udWl0eV9mYWN0b3IoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBkaXNjb3VudF9mYWN0b3I6IFVJbnQ2NCwKICAgIC8vICAgICByZWRlbXB0aW9uX2ZhY3RvcjogVUludDY0LAogICAgLy8gKSAtPiBVSW50NjQ6CiAgICBwcm90byAyIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ2OAogICAgLy8gaWYgcmVkZW1wdGlvbl9mYWN0b3IgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0xCiAgICBibnogX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDY5CiAgICAvLyByZXR1cm4gZGlzY291bnRfZmFjdG9yCiAgICBmcmFtZV9kaWcgLTIKICAgIHJldHN1YgoKX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3MAogICAgLy8gcGVyaW9kX3JhdGUgPSBzZWxmLmZpeGVkX3BvaW50X3NjYWxlICsgc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzEKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzAtNDc0CiAgICAvLyBwZXJpb2RfcmF0ZSA9IHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgKyBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICByZWRlbXB0aW9uX2ZhY3RvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICBkaWcgMgogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgICsKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3NQogICAgLy8gYXNzZXJ0IHBlcmlvZF9yYXRlID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGR1cAogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDc4CiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDc2LTQ4MAogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIGRpc2NvdW50X2ZhY3RvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gICAgIHBlcmlvZF9yYXRlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkoZW50cnk6IGJ5dGVzLCBwYXlsb2FkOiBieXRlcykgLT4gYnl0ZXMsIGJ5dGVzOgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MTMtNjE1CiAgICAvLyBkZWYgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5KAogICAgLy8gICAgIHNlbGYsIGVudHJ5OiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSwgcGF5bG9hZDogdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0CiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAyIDIKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjIzCiAgICAvLyBhc3NlcnQgZW50cnkuZXZlbnRfaWQgPT0gc2VsZi5ldmVudF9jdXJzb3IsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGN1cnNvcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjI0CiAgICAvLyBhc3NlcnQgZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsIGVyci5OT19EVUVfQ0FTSEZMT1cKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPD0KICAgIGFzc2VydCAvLyBObyBkdWUgY2FzaGZsb3cgdG8gcGF5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MjYKICAgIC8vIGV2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYyNwogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX0lFRCk6CiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGR1cAogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYyOC02MzAKICAgIC8vICMgSUVEIGZpbmFsaXplcyBpc3N1YW5jZTogcmVzZXJ2ZWQgdW5pdHMgYmVjb21lIGFjdGl2YXRhYmxlIGFuZCB0aGUKICAgIC8vICMgc2NoZWR1bGUncyBpbml0aWFsIGNvbnRyYWN0dWFsIHN0YXRlIGJlY29tZXMgbGl2ZS4KICAgIC8vIGFzc2VydCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzIKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPT0gc2VsZi50b3RhbF91bml0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjMxLTYzMwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID09IHNlbGYudG90YWxfdW5pdHMKICAgIC8vICksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9JTkNPTVBMRVRFCiAgICBhc3NlcnQgLy8gUHJpbWFyeSBkaXN0cmlidXRpb24gaXMgbm90IGNvbXBsZXRlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzQKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM1CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzYKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAzMwogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzcKICAgIC8vIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM4CiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzkKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0MAogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX0FDVElWRSkKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgMTAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDUxCiAgICAvLyBhc3NlcnQgZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSA9PSBVSW50NjQoZW51bXMuRVZUX0lFRCksIGVyci5OT1RfRVZUX0lFRAogICAgZnJhbWVfZGlnIDExCiAgICBhc3NlcnQgLy8gTm90IElFRCBldmVudAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDUyCiAgICAvLyByZXR1cm4gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0MS02NDUKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1zZWxmLl9lbnRyeV9pZWRfYW1vdW50KGVudHJ5KSwKICAgIC8vICAgICBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0NAogICAgLy8gc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0MS02NDUKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1zZWxmLl9lbnRyeV9pZWRfYW1vdW50KGVudHJ5KSwKICAgIC8vICAgICBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICAvLyApCiAgICBjYWxsc3ViIF9lbWl0X2V4ZWN1dGlvbl9ldmVudAogICAgZHVwCiAgICBmcmFtZV9idXJ5IC0yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NDYKICAgIC8vIHJldHVybgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0OQogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ICs9IHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBmcmFtZV9idXJ5IC0yCiAgICArCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1MQogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1JSKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCAxMgogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMTAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1NQogICAgLy8gcGF5bG9hZC5vYnNlcnZlZF9yYXRlLAogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjU2CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzNiAvLyAicmF0ZV9yZXNldF9tdWx0aXBsaWVyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1NwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1Mi02NTgKICAgIC8vICMgUlIgZGVyaXZlcyB0aGUgbmV4dCByYXRlIGZyb20gYW4gb2JzZXJ2ZWQgb3JhY2xlIHZhbHVlIHBsdXMgdGhlCiAgICAvLyAjIGNvbnRyYWN0IHNwcmVhZCAvIG11bHRpcGxpZXIgdGVybXMsIHRoZW4gZW5mb3JjZXMgZmxvb3IgYW5kIGNhcC4KICAgIC8vIG9ic2VydmVkX3JhdGUgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBwYXlsb2FkLm9ic2VydmVkX3JhdGUsCiAgICAvLyAgICAgc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICkKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjAKICAgIC8vIG9ic2VydmVkX3JhdGUgKyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzUgLy8gInJhdGVfcmVzZXRfc3ByZWFkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkIGV4aXN0cwogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDEKICAgIC8vIGlmIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgYW5kIHJhdGUgPCBzZWxmLnJhdGVfcmVzZXRfZmxvb3I6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzggLy8gImhhc19yYXRlX3Jlc2V0X2Zsb29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmhhc19yYXRlX3Jlc2V0X2Zsb29yIGV4aXN0cwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMCAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X2Zsb29yIGV4aXN0cwogICAgZnJhbWVfZGlnIDYKICAgID4KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDIKICAgIC8vIHJhdGUgPSBzZWxmLnJhdGVfcmVzZXRfZmxvb3IKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMCAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDYKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfZmxvb3IgZXhpc3RzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1NToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc0MwogICAgLy8gaWYgc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgYW5kIHJhdGUgPiBzZWxmLnJhdGVfcmVzZXRfY2FwOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDM5IC8vICJoYXNfcmF0ZV9yZXNldF9jYXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwIGV4aXN0cwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTgKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMSAvLyAicmF0ZV9yZXNldF9jYXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9jYXAgZXhpc3RzCiAgICBmcmFtZV9kaWcgNgogICAgPAogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc0NAogICAgLy8gcmF0ZSA9IHNlbGYucmF0ZV9yZXNldF9jYXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMSAvLyAicmF0ZV9yZXNldF9jYXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSA2CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X2NhcCBleGlzdHMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjU5CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IHNlbGYuX2NsYW1wX3JhdGUoCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NTktNjYxCiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IHNlbGYuX2NsYW1wX3JhdGUoCiAgICAvLyAgICAgb2JzZXJ2ZWRfcmF0ZSArIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQKICAgIC8vICkKICAgIGZyYW1lX2RpZyA2CiAgICBhcHBfZ2xvYmFsX3B1dAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMTg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzEKICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QSSk6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMjAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY3MgogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzMKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDIzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc4CiAgICAvLyBpZiBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKToKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAyOQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc5CiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFJGKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCA1CiAgICA9PQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMzAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4MwogICAgLy8gKyAoc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCAtIHNlbGYuZXZlbnRfY3Vyc29yKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICAtCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODQKICAgIC8vICogVUludDY0KGNzdC5PUF9VUF9OT05fQ0FTSF9QRVJfRU5UUllfQlVER0VUKQogICAgcHVzaGludCAxMDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4My02ODQKICAgIC8vICsgKHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgLSBzZWxmLmV2ZW50X2N1cnNvcikKICAgIC8vICogVUludDY0KGNzdC5PUF9VUF9OT05fQ0FTSF9QRVJfRU5UUllfQlVER0VUKQogICAgKgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjgyCiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX05PTl9DQVNIX0JBU0VfQlVER0VUKQogICAgaW50YyA0IC8vIDE1MDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4Mi02ODQKICAgIC8vIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfQkFTRV9CVURHRVQpCiAgICAvLyArIChzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IC0gc2VsZi5ldmVudF9jdXJzb3IpCiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfUEVSX0VOVFJZX0JVREdFVCkKICAgICsKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4MC02ODYKICAgIC8vIGVuc3VyZV9idWRnZXQoCiAgICAvLyAgICAgcmVxdWlyZWRfYnVkZ2V0PSgKICAgIC8vICAgICAgICAgVUludDY0KGNzdC5PUF9VUF9OT05fQ0FTSF9CQVNFX0JVREdFVCkKICAgIC8vICAgICAgICAgKyAoc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCAtIHNlbGYuZXZlbnRfY3Vyc29yKQogICAgLy8gICAgICAgICAqIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfUEVSX0VOVFJZX0JVREdFVCkKICAgIC8vICAgICApLAogICAgLy8gKQogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDkwCiAgICAvLyBkaXNjb3VudF9mYWN0b3IgPSBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5MQogICAgLy8gZGVub21pbmF0b3IgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5MgogICAgLy8gc2tpcF9maXJzdF9yZWRlbXB0aW9uID0gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5NAogICAgLy8gaWYgZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAyNQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgZnJhbWVfYnVyeSA4CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAzNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDk1LTQ5OQogICAgLy8gIyBBbiBpbml0aWFsIFBSRiBtYXkgZGVzY3JpYmUgdGhlIGZpcnN0IHJlZGVtcHRpb24gcGVyaW9kIGRpcmVjdGx5LgogICAgLy8gZGlzY291bnRfZmFjdG9yID0gc2VsZi5fZGlzY291bnRfYW5udWl0eV9mYWN0b3IoCiAgICAvLyAgICAgZGlzY291bnRfZmFjdG9yLAogICAgLy8gICAgIGVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDgKICAgIGNhbGxzdWIgX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTAxCiAgICAvLyBza2lwX2ZpcnN0X3JlZGVtcHRpb24gPSBUcnVlCiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfYnVyeSA3CiAgICBmcmFtZV9idXJ5IDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDM1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTAzCiAgICAvLyBmdXR1cmVfZXZlbnRfaWQgPSBzZWxmLmV2ZW50X2N1cnNvciArIFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfd2hpbGVfdG9wQDM2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA0CiAgICAvLyB3aGlsZSBmdXR1cmVfZXZlbnRfaWQgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgZnJhbWVfZGlnIDMKICAgID4KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl93aGlsZUA0OAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA1CiAgICAvLyBmdXR1cmVfZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoZnV0dXJlX2V2ZW50X2lkKQogICAgZnJhbWVfZGlnIDMKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwNgogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPSBmdXR1cmVfZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MDctNTA4CiAgICAvLyAjIE9ubHkgcmVkZW1wdGlvbi1iZWFyaW5nIGV2ZW50cyBjb250cmlidXRlIHRvIHRoZSBhbm51aXR5IGRlbm9taW5hdG9yLgogICAgLy8gaXNfcmVkZW1wdGlvbl9ldmVudCA9IGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpIG9yICgKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwNy01MTEKICAgIC8vICMgT25seSByZWRlbXB0aW9uLWJlYXJpbmcgZXZlbnRzIGNvbnRyaWJ1dGUgdG8gdGhlIGFubnVpdHkgZGVub21pbmF0b3IuCiAgICAvLyBpc19yZWRlbXB0aW9uX2V2ZW50ID0gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QUikgb3IgKAogICAgLy8gICAgIGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfTUQpCiAgICAvLyAgICAgYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICAvLyApCiAgICBibnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfdHJ1ZUA0MAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA5CiAgICAvLyBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgZnJhbWVfZGlnIDQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MDktNTEwCiAgICAvLyBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgLy8gYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF9mYWxzZUA0MQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTEwCiAgICAvLyBhbmQgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IgPiBVSW50NjQoMCkKICAgIGZyYW1lX2RpZyAwCiAgICBwdXNoaW50IDI1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA5LTUxMAogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCkKICAgIC8vIGFuZCBmdXR1cmVfZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX3RydWVANDA6CiAgICBpbnRjXzEgLy8gMQoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfbWVyZ2VANDI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTIKICAgIC8vIGlmIGlzX3JlZGVtcHRpb25fZXZlbnQ6CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA0NwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTEzCiAgICAvLyBpZiBza2lwX2ZpcnN0X3JlZGVtcHRpb246CiAgICBmcmFtZV9kaWcgNwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUA0NQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTE0CiAgICAvLyBza2lwX2ZpcnN0X3JlZGVtcHRpb24gPSBGYWxzZQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgNwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANDc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjEKICAgIC8vIGZ1dHVyZV9ldmVudF9pZCArPSBVSW50NjQoMSkKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV93aGlsZV90b3BAMzYKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlANDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTgKICAgIC8vIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZnJhbWVfZGlnIDAKICAgIHB1c2hpbnQgMjUKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTYtNTE5CiAgICAvLyBkaXNjb3VudF9mYWN0b3IgPSBzZWxmLl9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcigKICAgIC8vICAgICBkaXNjb3VudF9mYWN0b3IsCiAgICAvLyAgICAgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMgogICAgc3dhcAogICAgY2FsbHN1YiBfZGlzY291bnRfYW5udWl0eV9mYWN0b3IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjAKICAgIC8vIGRlbm9taW5hdG9yICs9IGRpc2NvdW50X2ZhY3RvcgogICAgZnJhbWVfZGlnIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA0NwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDE6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF9tZXJnZUA0MgoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX3doaWxlQDQ4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTIzCiAgICAvLyBhc3NlcnQgZGVub21pbmF0b3IgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZnJhbWVfZGlnIDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUyNAogICAgLy8gbnVtZXJhdG9yID0gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTI1CiAgICAvLyBpZiBlbnRyeS5mbGFncyAmIFVJbnQ2NChlbnVtcy5GTEFHX0lOSVRJQUxfUFJGKSA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNTcKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gOAogICAgJgogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDUwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjYtNTI3CiAgICAvLyAjIFN1YnNlcXVlbnQgUFJGIGV2ZW50cyBhbW9ydGl6ZSBib3RoIHByaW5jaXBhbCBhbmQgYWxyZWFkeSBhY2NydWVkIGNhcnJ5LgogICAgLy8gbnVtZXJhdG9yICs9IHNlbGYuYWNjcnVlZF9pbnRlcmVzdAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgICsKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDUwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTMwCiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTI4LTUzMgogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIG51bWVyYXRvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gICAgIGRlbm9taW5hdG9yLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDEKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODcKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IHNlbGYuX3JlY2FsY3VsYXRlX2FubnVpdHlfcGF5bWVudCgKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njg3LTY4OQogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gc2VsZi5fcmVjYWxjdWxhdGVfYW5udWl0eV9wYXltZW50KAogICAgLy8gICAgIGVudHJ5CiAgICAvLyApCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMzA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OTIKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY5My02OTcKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1VSW50NjQoMCksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OTUKICAgIC8vIHBheW9mZj1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njk2CiAgICAvLyBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY5My02OTcKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1VSW50NjQoMCksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgY2FsbHN1YiBfZW1pdF9leGVjdXRpb25fZXZlbnQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDI5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjkxCiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDMwCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDIwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc0CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9JUENCKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCAxOAogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDIzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzUtNjc2CiAgICAvLyAjIElQQ0Iga2VlcHMgcHJpbmNpcGFsIHVuY2hhbmdlZCBhbmQgb25seSByZXNldHMgdGhlIGludGVyZXN0IGJhc2UuCiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIGIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMjMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMTA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjIKICAgIC8vIGVsaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1JSRik6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgMTEKICAgID09CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDE0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjMKICAgIC8vIG5leHRfcmF0ZSA9IGVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY0CiAgICAvLyBpZiBuZXh0X3JhdGUgPT0gVUludDY0KDApOgogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDEzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjUKICAgIC8vIG5leHRfcmF0ZSA9IHNlbGYucmF0ZV9yZXNldF9uZXh0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzcgLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDUKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfbmV4dCBleGlzdHMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY2CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IG5leHRfcmF0ZQogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgZnJhbWVfZGlnIDUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDE0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY4CiAgICAvLyBpZiBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSAhPSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgOQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2OQogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPSBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZQogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgZnJhbWVfZGlnIDkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KGVudHJ5OiBieXRlcywgcGF5b2ZmOiB1aW50NjQsIHNldHRsZWRfYW1vdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpfZW1pdF9leGVjdXRpb25fZXZlbnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MDMtNzA5CiAgICAvLyBkZWYgX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgKiwKICAgIC8vICAgICBlbnRyeTogdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnksCiAgICAvLyAgICAgcGF5b2ZmOiBVSW50NjQsCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ6IFVJbnQ2NCwKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDMgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzEzCiAgICAvLyBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25JRAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE0CiAgICAvLyBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIGZyYW1lX2RpZyAtMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTUKICAgIC8vIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIGZyYW1lX2RpZyAtMwogICAgZXh0cmFjdCA4IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxNgogICAgLy8gc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICBmcmFtZV9kaWcgLTMKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTcKICAgIC8vIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MjAKICAgIC8vIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIGZyYW1lX2RpZyAtMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE1CiAgICAvLyBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICBpbnRjXzIgLy8gOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIwCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBnZXRieXRlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDkKICAgIC8vIGlmIHBheW9mZiA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJueiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NTAKICAgIC8vIHJldHVybiBVSW50NjQoZW51bXMuUEFZT0ZGX1NJR05fUE9TSVRJVkUpCiAgICBpbnRjXzEgLy8gMQoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX3BheW9mZl9zaWduQDc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTktNzIxCiAgICAvLyBwYXlvZmZfc2lnbj1hcmM0LlVJbnQ4KAogICAgLy8gICAgIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIC8vICksCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgaW50Y18yIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MjMKICAgIC8vIGN1cnJlbmN5X2lkPXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzI0CiAgICAvLyBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTItNzI1CiAgICAvLyBFeGVjdXRpb25FdmVudCgKICAgIC8vICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIC8vICAgICBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYXBwbGllZF9hdD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICBwYXlvZmY9cGF5b2ZmLAogICAgLy8gICAgIHBheW9mZl9zaWduPWFyYzQuVUludDgoCiAgICAvLyAgICAgICAgIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIC8vICAgICApLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PXNldHRsZWRfYW1vdW50LAogICAgLy8gICAgIGN1cnJlbmN5X2lkPXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAwCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzExLTcyNgogICAgLy8gYXJjNC5lbWl0KAogICAgLy8gICAgIEV4ZWN1dGlvbkV2ZW50KAogICAgLy8gICAgICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgICAgIHBheW9mZj1wYXlvZmYsCiAgICAvLyAgICAgICAgIHBheW9mZl9zaWduPWFyYzQuVUludDgoCiAgICAvLyAgICAgICAgICAgICBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICAvLyAgICAgICAgICksCiAgICAvLyAgICAgICAgIHNldHRsZWRfYW1vdW50PXNldHRsZWRfYW1vdW50LAogICAgLy8gICAgICAgICBjdXJyZW5jeV9pZD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgICAgIHNlcXVlbmNlPWVudHJ5LmV2ZW50X2lkICsgVUludDY0KDEpLAogICAgLy8gICAgICkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDlhMzMyYjk1IC8vIG1ldGhvZCAiRXhlY3V0aW9uRXZlbnQodWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc1MQogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiAoVUludDY0KGVudW1zLkVWVF9JRUQpLCBVSW50NjQoZW51bXMuRVZUX1BJKSk6CiAgICBmcmFtZV9kaWcgNQogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBibnogX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2lmX2JvZHlANQogICAgZnJhbWVfZGlnIDUKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGJ6IF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pZl9lbHNlQDYKCl9lbWl0X2V4ZWN1dGlvbl9ldmVudF9pZl9ib2R5QDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NTIKICAgIC8vIHJldHVybiBVSW50NjQoZW51bXMuUEFZT0ZGX1NJR05fUE9TSVRJVkUpCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIwCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBiIF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9wYXlvZmZfc2lnbkA3CgpfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzUzCiAgICAvLyByZXR1cm4gVUludDY0KGVudW1zLlBBWU9GRl9TSUdOX05FR0FUSVZFKQogICAgcHVzaGludCAyNTUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcyMAogICAgLy8gc2VsZi5fcGF5b2ZmX3NpZ24oZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSwgcGF5b2ZmKQogICAgYiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fcGF5b2ZmX3NpZ25ANwoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9yb2xlX2lzX2FjdGl2ZShyb2xlX21hcDogYnl0ZXMsIHJvbGVfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NDoKX3JvbGVfaXNfYWN0aXZlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU3CiAgICAvLyBkZWYgX3JvbGVfaXNfYWN0aXZlKHNlbGYsIHJvbGVfbWFwOiB0eXAuUmJhY1JvbGUsIHJvbGVfYWRkcmVzczogQWNjb3VudCkgLT4gYm9vbDoKICAgIHByb3RvIDIgMQogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5CiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5LTYwCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5LTYxCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjEKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAtNjEKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgPj0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX21lcmdlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKSAtPiB2b2lkOgpfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2NQogICAgLy8gYXNzZXJ0IHNlbGYuX2lzX2FycmFuZ2VyKFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTIKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgPT0gc2VsZi5hcnJhbmdlci52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE4IC8vIDB4NTIyMzQxNzI3MjYxNmU2NzY1NzIyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgPT0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2NQogICAgLy8gYXNzZXJ0IHNlbGYuX2lzX2FycmFuZ2VyKFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpIC0+IHZvaWQ6Cl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4MwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFzc2V0X2RlZmF1bHRlZCwgZXJyLkRFRkFVTFRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQxIC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfZGVmYXVsdGVkIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIERlZmF1bHRlZAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkgLT4gdm9pZDoKX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg2CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYXNzZXRfc3VzcGVuZGVkLCBlcnIuU1VTUEVOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzMgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9zdXNwZW5kZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gU3VzcGVuZGVkIG9wZXJhdGlvbnMKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkOiB1aW50NjQpIC0+IHZvaWQ6Cl9hc3NlcnRfdmFsaWRfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OAogICAgLy8gZGVmIF9hc3NlcnRfdmFsaWRfcm9sZShzZWxmLCByb2xlX2lkOiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTAKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIHB1c2hpbnQgMjAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkxCiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgcHVzaGludCAyNQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTIKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICBwdXNoaW50IDQwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MwogICAgLy8gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgcHVzaGludCA1MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTQKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgcHVzaGludCA2MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTUKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICBwdXNoaW50IDcwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NgogICAgLy8gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgcHVzaGludCA4MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfZmFsc2VAOAoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3OgogICAgaW50Y18xIC8vIDEKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX21lcmdlQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgcmV0c3ViCgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9mYWxzZUA4OgogICAgaW50Y18wIC8vIDAKICAgIGIgX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfbWVyZ2VAOQo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="}, "sourceInfo": {"approval": {"pcOffsetMethod": "none", "sourceInfo": [{"pc": [2702], "errorMessage": "ACTUS event not yet executed"}, {"pc": [2460], "errorMessage": "Can not distribute zero units"}, {"pc": [3203, 3210, 3583], "errorMessage": "D-ASA already configured"}, {"pc": [1309, 2041, 2420, 2566, 3800, 3946, 4297, 4528, 4674], "errorMessage": "D-ASA not configured"}, {"pc": [3594], "errorMessage": "D-ASA terms not configured"}, {"pc": [6863], "errorMessage": "Defaulted"}, {"pc": [3221], "errorMessage": "Denomination asset is not properly set"}, {"pc": [3236], "errorMessage": "Different settlement asset not supported, must be equal to denomination asset"}, {"pc": [3472, 3479, 3481], "errorMessage": "IED must be set in the future"}, {"pc": [1327, 2110, 2581, 4315, 6215], "errorMessage": "IED not yet executed"}, {"pc": [2473, 5598], "errorMessage": "Insufficient remaining D-ASA units"}, {"pc": [2676, 2742], "errorMessage": "Insufficient sender units to transfer"}, {"pc": [1937, 3123, 3141, 3197, 3674, 3710, 4362, 5782, 6060, 6120, 6523], "errorMessage": "Invalid ACTUS configuration"}, {"pc": [2050, 2454, 2637, 2652, 2809, 2882, 2945, 2987, 5410, 5535], "errorMessage": "Invalid account holding address"}, {"pc": [4865, 4889, 4913, 4937, 4961, 5018, 5046, 5068, 5090, 5112, 5291, 5309, 5324, 5339, 5354], "errorMessage": "Invalid account role address"}, {"pc": [3183], "errorMessage": "Invalid day-count convention ID"}, {"pc": [1440, 3821, 4149, 6092], "errorMessage": "Invalid event cursor"}, {"pc": [3659, 3722, 3998, 4339, 5698], "errorMessage": "Invalid event id"}, {"pc": [3834, 4213, 4220, 4352], "errorMessage": "Invalid event type"}, {"pc": [5002, 5281, 6933], "errorMessage": "Invalid role identifier"}, {"pc": [3588, 3734, 3742, 4051, 4426, 5713, 5729], "errorMessage": "Invalid schedule page"}, {"pc": [5646], "errorMessage": "No D-ASA units"}, {"pc": [1446, 1966, 2147, 6101], "errorMessage": "No due cashflow to pay"}, {"pc": [6184], "errorMessage": "Not IED event"}, {"pc": [2095, 2428, 2624, 2799, 2855, 2865, 2951, 4248, 5135, 6855], "errorMessage": "Not authorized"}, {"pc": [1567, 1575, 2196, 2270, 2279], "errorMessage": "Not enough funds for the payment"}, {"pc": [3971, 3984, 4324], "errorMessage": "Observed event required to execute this action"}, {"pc": [2442, 2490], "errorMessage": "Primary distribution is closed"}, {"pc": [6132], "errorMessage": "Primary distribution is not complete"}, {"pc": [2665], "errorMessage": "Sender and receiver must be different"}, {"pc": [5396, 6871], "errorMessage": "Suspended operations"}, {"pc": [2377, 3700, 4384], "errorMessage": "Time events must be sorted in strictly ascending order"}, {"pc": [2598, 2615], "errorMessage": "Transfer is closed"}, {"pc": [2669], "errorMessage": "Transfer units must be greater than zero"}, {"pc": [993], "errorMessage": "Wrong Global Bytes allocation"}, {"pc": [999], "errorMessage": "Wrong Global UInts allocation"}, {"pc": [1003], "errorMessage": "Wrong Local Bytes allocation"}, {"pc": [1007], "errorMessage": "Wrong Local UInts allocation"}, {"pc": [1548, 2189], "errorMessage": "account opted into asset"}, {"pc": [6815, 6830], "errorMessage": "check BoxMap entry exists"}, {"pc": [2086, 2124, 2165, 2203, 2494, 2672, 2731, 2757, 5390, 5556], "errorMessage": "check self.account entry exists"}, {"pc": [1629, 1861, 1949, 4585, 6220, 6543], "errorMessage": "check self.accrued_interest exists"}, {"pc": [5153, 6853], "errorMessage": "check self.arranger exists"}, {"pc": [6861], "errorMessage": "check self.asset_defaulted exists"}, {"pc": [6869], "errorMessage": "check self.asset_suspended exists"}, {"pc": [3131, 3577, 3967, 3979, 4320, 4533, 5944], "errorMessage": "check self.contract_type exists"}, {"pc": [1597, 4590, 5418, 5496], "errorMessage": "check self.cumulative_interest_index exists"}, {"pc": [1609, 4595, 5429, 5504], "errorMessage": "check self.cumulative_principal_index exists"}, {"pc": [5954], "errorMessage": "check self.dynamic_principal_redemption exists"}, {"pc": [1365, 1377, 1438, 1680, 2680, 2692, 3813, 4142, 4561, 4678, 4690, 4727, 5511, 6090, 6172, 6369, 6424, 6562], "errorMessage": "check self.event_cursor exists"}, {"pc": [5444, 5458, 5651, 5680, 6010, 6018, 6045, 6065, 6255, 6388, 6549], "errorMessage": "check self.fixed_point_scale exists"}, {"pc": [6298], "errorMessage": "check self.has_rate_reset_cap exists"}, {"pc": [6271], "errorMessage": "check self.has_rate_reset_floor exists"}, {"pc": [3208, 3593, 4557, 6189], "errorMessage": "check self.initial_exchange_amount exists"}, {"pc": [2478, 2488], "errorMessage": "check self.initial_exchange_date exists"}, {"pc": [1805, 4575, 5986, 6000], "errorMessage": "check self.interest_calculation_base exists"}, {"pc": [1877, 1892], "errorMessage": "check self.next_principal_redemption exists"}, {"pc": [4580, 5978, 6005, 6050], "errorMessage": "check self.nominal_interest_rate exists"}, {"pc": [2055, 2068], "errorMessage": "check self.op_daemon exists"}, {"pc": [1702, 1771, 1797, 1851, 1903, 1912, 1934, 4570, 6528, 6609], "errorMessage": "check self.outstanding_principal exists"}, {"pc": [6306, 6320], "errorMessage": "check self.rate_reset_cap exists"}, {"pc": [6279, 6293], "errorMessage": "check self.rate_reset_floor exists"}, {"pc": [6250], "errorMessage": "check self.rate_reset_multiplier exists"}, {"pc": [6643], "errorMessage": "check self.rate_reset_next exists"}, {"pc": [6263], "errorMessage": "check self.rate_reset_spread exists"}, {"pc": [1553, 2265, 4600], "errorMessage": "check self.reserved_interest exists"}, {"pc": [1558, 1587, 2275, 2290, 4605], "errorMessage": "check self.reserved_principal exists"}, {"pc": [2465, 2513, 4552, 5593, 6125], "errorMessage": "check self.reserved_units_total exists"}, {"pc": [1369, 2684, 3817, 3996, 4013, 4133, 4334, 4369, 4388, 4508, 4565, 4682, 5694, 6365, 6432], "errorMessage": "check self.schedule_entry_count exists"}, {"pc": [4041, 4416], "errorMessage": "check self.schedule_page entry exists"}, {"pc": [1545, 2155, 2183, 6715], "errorMessage": "check self.settlement_asset_id exists"}, {"pc": [1308, 1322, 2040, 2105, 2419, 2438, 2565, 2576, 2859, 3201, 3581, 3799, 3945, 4296, 4310, 4526, 4673, 5539, 6116, 6210], "errorMessage": "check self.status exists"}, {"pc": [2471, 2524, 4547, 5644, 5675, 6130], "errorMessage": "check self.total_units exists"}, {"pc": [2603, 2613], "errorMessage": "check self.transfer_closure_date exists"}, {"pc": [2586, 2594], "errorMessage": "check self.transfer_opening_date exists"}, {"pc": [3636, 3693], "errorMessage": "index access is out of bounds"}, {"pc": [2024, 3068, 3551, 4046, 4421], "errorMessage": "invalid array length header"}, {"pc": [2789, 3539, 5125], "errorMessage": "invalid number of bytes for arc4.bool"}, {"pc": [2032], "errorMessage": "invalid number of bytes for arc4.dynamic_array"}, {"pc": [3566], "errorMessage": "invalid number of bytes for arc4.dynamic_array"}, {"pc": [2018, 2403, 2543, 2551, 2781, 2839, 2847, 2927, 2935, 2978, 3003, 4746, 4770, 4804, 4985, 5167, 5251], "errorMessage": "invalid number of bytes for arc4.static_array"}, {"pc": [1303, 2361, 2370, 2411, 2560, 3529, 3930], "errorMessage": "invalid number of bytes for arc4.uint64"}, {"pc": [4794, 4975, 5241], "errorMessage": "invalid number of bytes for arc4.uint8"}, {"pc": [3040], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.InitialKernelState"}, {"pc": [3029], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.NormalizedActusTerms"}, {"pc": [4292], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.ObservedCashEventRequest"}, {"pc": [3941], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.ObservedEventRequest"}, {"pc": [3073], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.Prospectus"}, {"pc": [4815], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.RoleValidity"}, {"pc": [3057], "errorMessage": "invalid tail pointer at index 1 of (uint8[32],(len+utf8[]))"}, {"pc": [3052], "errorMessage": "invalid tuple encoding"}, {"pc": [4113, 4488], "errorMessage": "max array length exceeded"}, {"pc": [4539, 6707], "errorMessage": "overflow"}]}, "clear": {"pcOffsetMethod": "none", "sourceInfo": []}}, "templateVariables": {}}""" +_APP_SPEC_JSON = r"""{"arcs": [22, 28], "bareActions": {"call": [], "create": []}, "methods": [{"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "desc": "Maximum number of due cash events to process in this call.", "name": "max_event_count"}], "name": "fund_due_cashflows", "returns": {"type": "(uint64,uint64,uint64,uint64,uint64)", "desc": "Funding result with reserved interest, reserved principal, and event count.", "struct": "CashFundingResult"}, "desc": "Reserve due ACTUS cash events into the escrow-style claim ledger.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Holder whose position should be settled and claimed.", "name": "holding_address"}, {"type": "byte[]", "desc": "Opaque settlement context returned in the result.", "name": "payment_info"}], "name": "claim_due_cashflows", "returns": {"type": "(uint64,uint64,uint64,uint64,byte[])", "desc": "Claim result with realized interest, principal, and passthrough context.", "struct": "CashClaimResult"}, "desc": "Withdraw the holder's already funded ACTUS cash entitlements.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "desc": "Inclusive UNIX timestamp at which transfers may start.", "name": "open_date"}, {"type": "uint64", "desc": "Exclusive UNIX timestamp at which transfers stop.", "name": "closure_date"}], "name": "transfer_set_schedule", "returns": {"type": "uint64", "desc": "UNIX timestamp of the schedule update."}, "desc": "Configure the secondary-market transfer window.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account receiving the reserved units.", "name": "holding_address"}, {"type": "uint64", "desc": "Number of units to reserve.", "name": "units"}], "name": "primary_distribution", "returns": {"type": "uint64", "desc": "Remaining undistributed unit balance."}, "desc": "Reserve units for a holder before the initial exchange activates issuance.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account debited for the transfer.", "name": "sender_holding_address"}, {"type": "address", "desc": "Account credited for the transfer.", "name": "receiver_holding_address"}, {"type": "uint64", "desc": "Number of active units to move.", "name": "units"}], "name": "transfer", "returns": {"type": "uint64", "desc": "Number of units transferred."}, "desc": "Transfer active units after settling both counterparties to the current cursor.\nReturns the number of units moved. The ACTUS kernel no longer persists a nominal per-unit value on-chain, so transfer results are unit-based.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account holding address.", "name": "holding_address"}, {"type": "bool", "desc": "Suspension status to apply.", "name": "suspended"}], "name": "account_suspension", "returns": {"type": "uint64", "desc": "UNIX timestamp of the suspension update."}, "desc": "Set the suspension status of one account.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account holding address.", "name": "holding_address"}, {"type": "address", "desc": "Account payment address.", "name": "payment_address"}], "name": "account_open", "returns": {"type": "uint64", "desc": "UNIX timestamp of the account opening."}, "desc": "Open a contract account with a new position and register its payment address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account holding address.", "name": "holding_address"}, {"type": "address", "desc": "New account payment address.", "name": "payment_address"}], "name": "account_update_payment_address", "returns": {"type": "uint64", "desc": "UNIX timestamp of the account update."}, "desc": "Update the payment address of an account.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account holding address.", "name": "holding_address"}], "name": "account_get_position", "returns": {"type": "(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64)", "desc": "Account position record.", "struct": "AccountPosition"}, "desc": "Get the full accounting position for one holder.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": [], "create": ["NoOp"]}, "args": [{"type": "address", "desc": "D-ASA arranger address.", "name": "arranger"}], "name": "contract_create", "returns": {"type": "uint64", "desc": "UNIX timestamp of contract creation."}, "desc": "Create a new D-ASA contract and set the arranger role.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64)", "desc": "Normalized ACTUS terms.", "name": "terms", "struct": "NormalizedActusTerms"}, {"type": "(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "desc": "Initial kernel state captured before `IED`.", "name": "initial_state", "struct": "InitialKernelState"}, {"type": "(byte[32],string)", "desc": "Prospectus metadata stored for reference only.", "name": "prospectus", "struct": "Prospectus"}], "name": "contract_config", "returns": {"type": "uint64", "desc": "UNIX timestamp of contract configuration."}, "desc": "Partial contract configuration with: normalized ACTUS terms, initial kernel\nstate (pre-IED), prospectus (informational only). The contract stays inactive until all schedule pages are configured next.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "desc": "Zero-based page index within the boxed schedule.", "name": "schedule_page_index"}, {"type": "bool", "desc": "Whether this page finalizes the schedule upload.", "name": "is_last_page"}, {"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[]", "desc": "Normalized schedule entries for the requested page.", "name": "schedule_page"}], "name": "contract_schedule", "returns": {"type": "uint64", "desc": "UNIX timestamp of the schedule upload."}, "desc": "Upload one normalized schedule page.\nThe configuration operation is considered complete only when the last page is stored. At that point `schedule_entry_count` is finalized and the contract moves to `STATUS_PENDING_IED`.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "contract_execute_ied", "returns": {"type": "uint64", "desc": "UNIX timestamp of the `IED` execution."}, "desc": "Execute the first due `IED` entry and activate the contract.\n`IED` is the one non-cash event that moves the app from `STATUS_PENDING_IED` to `STATUS_ACTIVE`.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "desc": "Expected global schedule event identifier at the current cursor.", "name": "event_id"}, {"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "desc": "Observed payload used for append-on-execute and/or rate resets.", "name": "payload", "struct": "ObservedEventRequest"}], "name": "apply_non_cash_event", "returns": {"type": "uint64", "desc": "UNIX timestamp of the non-cash event application."}, "desc": "Apply the next due non-cash event, optionally appending one first.\nObserved payloads are appended before execution when flagged. Rate reset events require the interest oracle because they can change the running nominal rate; other non-cash events stay arranger-controlled.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "desc": "Observed cash-event payload to append after the current tail.", "name": "payload", "struct": "ObservedCashEventRequest"}], "name": "append_observed_cash_event", "returns": {"type": "uint64", "desc": "UNIX timestamp of the append operation."}, "desc": "Append an arranger-authorized observed cash event to the schedule tail.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "contract_get_state", "returns": {"type": "(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "desc": "Current kernel state snapshot.", "struct": "KernelState"}, "desc": "Return a readonly snapshot of the generic ACTUS kernel state.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "contract_get_next_due_event", "returns": {"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "desc": "Next due schedule entry, or an all-zero sentinel if the contract ended.", "struct": "ExecutionScheduleEntry"}, "desc": "Return the next boxed schedule entry, or a zeroed sentinel if ended.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["UpdateApplication"], "create": []}, "args": [], "name": "contract_update", "returns": {"type": "void", "desc": "None."}, "desc": "Update D-ASA application.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "New arranger address.", "name": "new_arranger"}], "name": "rbac_rotate_arranger", "returns": {"type": "uint64", "desc": "UNIX timestamp of the role assignment."}, "desc": "Rotate the arranger address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Operation daemon address.", "name": "address"}], "name": "rbac_set_op_daemon", "returns": {"type": "uint64", "desc": "UNIX timestamp of the role assignment."}, "desc": "Non-normative helper to set the operation daemon address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role identifier.", "name": "role_id"}, {"type": "address", "desc": "Account role address.", "name": "role_address"}, {"type": "(uint64,uint64)", "desc": "Inclusive validity interval for the assignment.", "name": "validity", "struct": "RoleValidity"}], "name": "rbac_assign_role", "returns": {"type": "uint64", "desc": "UNIX timestamp of the role assignment."}, "desc": "Assign a role to an address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role identifier.", "name": "role_id"}, {"type": "address", "desc": "Account role address.", "name": "role_address"}], "name": "rbac_revoke_role", "returns": {"type": "uint64", "desc": "UNIX timestamp of the role revocation."}, "desc": "Revoke a role from an address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Suspension status to apply.", "name": "suspended"}], "name": "rbac_contract_suspension", "returns": {"type": "uint64", "desc": "UNIX timestamp of the suspension update."}, "desc": "Set the asset-wide suspension status.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "rbac_get_arranger", "returns": {"type": "address", "desc": "Current arranger address."}, "desc": "Get the arranger address.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Address to query.", "name": "address"}], "name": "rbac_get_address_roles", "returns": {"type": "(bool,bool,bool,bool,bool)", "desc": "Roles mask in the order: account manager, primary dealer, trustee, authority, observer."}, "desc": "Non-normative helper to get the active roles assigned to an address.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role identifier.", "name": "role_id"}, {"type": "address", "desc": "Account role address.", "name": "role_address"}], "name": "rbac_get_role_validity", "returns": {"type": "(uint64,uint64)", "desc": "Stored role validity interval.", "struct": "RoleValidity"}, "desc": "Get the stored validity interval for a role assignment.", "events": [], "readonly": true, "recommendations": {}}], "name": "DASA", "state": {"keys": {"box": {}, "global": {"arranger": {"key": "UjpBUlIj", "keyType": "AVMBytes", "valueType": "address"}, "op_daemon": {"key": "UjpPUEQj", "keyType": "AVMBytes", "valueType": "address"}, "asset_suspended": {"key": "YXNzZXRfc3VzcGVuZGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "asset_defaulted": {"key": "YXNzZXRfZGVmYXVsdGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "status": {"key": "c3RhdHVz", "keyType": "AVMString", "valueType": "AVMUint64"}, "contract_type": {"key": "Y29udHJhY3RfdHlwZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "prospectus_hash": {"key": "cHJvc3BlY3R1c19oYXNo", "keyType": "AVMString", "valueType": "AVMBytes"}, "prospectus_url": {"key": "cHJvc3BlY3R1c191cmw=", "keyType": "AVMString", "valueType": "AVMString"}, "denomination_asset_id": {"key": "ZGVub21pbmF0aW9uX2Fzc2V0X2lk", "keyType": "AVMString", "valueType": "AVMUint64"}, "settlement_asset_id": {"key": "c2V0dGxlbWVudF9hc3NldF9pZA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "initial_exchange_date": {"key": "aW5pdGlhbF9leGNoYW5nZV9kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "maturity_date": {"key": "bWF0dXJpdHlfZGF0ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "transfer_opening_date": {"key": "dHJhbnNmZXJfb3BlbmluZ19kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "transfer_closure_date": {"key": "dHJhbnNmZXJfY2xvc3VyZV9kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "day_count_convention": {"key": "ZGF5X2NvdW50X2NvbnZlbnRpb24=", "keyType": "AVMString", "valueType": "AVMUint64"}, "total_units": {"key": "dG90YWxfdW5pdHM=", "keyType": "AVMString", "valueType": "AVMUint64"}, "reserved_units_total": {"key": "cmVzZXJ2ZWRfdW5pdHNfdG90YWw=", "keyType": "AVMString", "valueType": "AVMUint64"}, "initial_exchange_amount": {"key": "aW5pdGlhbF9leGNoYW5nZV9hbW91bnQ=", "keyType": "AVMString", "valueType": "AVMUint64"}, "outstanding_principal": {"key": "b3V0c3RhbmRpbmdfcHJpbmNpcGFs", "keyType": "AVMString", "valueType": "AVMUint64"}, "next_principal_redemption": {"key": "bmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbg==", "keyType": "AVMString", "valueType": "AVMUint64"}, "dynamic_principal_redemption": {"key": "ZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbg==", "keyType": "AVMString", "valueType": "AVMUint64"}, "interest_calculation_base": {"key": "aW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "accrued_interest": {"key": "YWNjcnVlZF9pbnRlcmVzdA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "nominal_interest_rate": {"key": "bm9taW5hbF9pbnRlcmVzdF9yYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_spread": {"key": "cmF0ZV9yZXNldF9zcHJlYWQ=", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_multiplier": {"key": "cmF0ZV9yZXNldF9tdWx0aXBsaWVy", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_floor": {"key": "cmF0ZV9yZXNldF9mbG9vcg==", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_cap": {"key": "cmF0ZV9yZXNldF9jYXA=", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_next": {"key": "cmF0ZV9yZXNldF9uZXh0", "keyType": "AVMString", "valueType": "AVMUint64"}, "has_rate_reset_floor": {"key": "aGFzX3JhdGVfcmVzZXRfZmxvb3I=", "keyType": "AVMString", "valueType": "AVMUint64"}, "has_rate_reset_cap": {"key": "aGFzX3JhdGVfcmVzZXRfY2Fw", "keyType": "AVMString", "valueType": "AVMUint64"}, "reserved_principal": {"key": "cmVzZXJ2ZWRfcHJpbmNpcGFs", "keyType": "AVMString", "valueType": "AVMUint64"}, "reserved_interest": {"key": "cmVzZXJ2ZWRfaW50ZXJlc3Q=", "keyType": "AVMString", "valueType": "AVMUint64"}, "cumulative_interest_index": {"key": "Y3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "cumulative_principal_index": {"key": "Y3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXg=", "keyType": "AVMString", "valueType": "AVMUint64"}, "event_cursor": {"key": "ZXZlbnRfY3Vyc29y", "keyType": "AVMString", "valueType": "AVMUint64"}, "schedule_entry_count": {"key": "c2NoZWR1bGVfZW50cnlfY291bnQ=", "keyType": "AVMString", "valueType": "AVMUint64"}, "fixed_point_scale": {"key": "Zml4ZWRfcG9pbnRfc2NhbGU=", "keyType": "AVMString", "valueType": "AVMUint64"}}, "local": {}}, "maps": {"box": {"account_manager": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpNTkcj"}, "primary_dealer": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpQWUQj"}, "trustee": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpUUlMj"}, "authority": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpBVVQj"}, "observer": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpNT0Mj"}, "schedule_page": {"keyType": "uint64", "valueType": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[]", "prefix": "UyM="}, "account": {"keyType": "address", "valueType": "AccountPosition", "prefix": "QSM="}}, "global": {}, "local": {}}, "schema": {"global": {"bytes": 4, "ints": 37}, "local": {"bytes": 0, "ints": 0}}}, "structs": {"AccountPosition": [{"name": "payment_address", "type": "address"}, {"name": "units", "type": "uint64"}, {"name": "reserved_units", "type": "uint64"}, {"name": "suspended", "type": "bool"}, {"name": "settled_cursor", "type": "uint64"}, {"name": "interest_checkpoint", "type": "uint64"}, {"name": "principal_checkpoint", "type": "uint64"}, {"name": "claimable_interest", "type": "uint64"}, {"name": "claimable_principal", "type": "uint64"}], "CashClaimResult": [{"name": "interest_amount", "type": "uint64"}, {"name": "principal_amount", "type": "uint64"}, {"name": "total_amount", "type": "uint64"}, {"name": "timestamp", "type": "uint64"}, {"name": "context", "type": "byte[]"}], "CashFundingResult": [{"name": "funded_interest", "type": "uint64"}, {"name": "funded_principal", "type": "uint64"}, {"name": "total_funded", "type": "uint64"}, {"name": "processed_events", "type": "uint64"}, {"name": "timestamp", "type": "uint64"}], "ExecutionScheduleEntry": [{"name": "event_id", "type": "uint64"}, {"name": "event_type", "type": "uint8"}, {"name": "scheduled_time", "type": "uint64"}, {"name": "accrual_factor", "type": "uint64"}, {"name": "redemption_accrual_factor", "type": "uint64"}, {"name": "next_nominal_interest_rate", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "next_outstanding_principal", "type": "uint64"}, {"name": "flags", "type": "uint64"}], "InitialKernelState": [{"name": "status_date", "type": "uint64"}, {"name": "event_cursor", "type": "uint64"}, {"name": "outstanding_principal", "type": "uint64"}, {"name": "interest_calculation_base", "type": "uint64"}, {"name": "nominal_interest_rate", "type": "uint64"}, {"name": "accrued_interest", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "cumulative_interest_index", "type": "uint64"}, {"name": "cumulative_principal_index", "type": "uint64"}], "KernelState": [{"name": "contract_type", "type": "uint8"}, {"name": "status", "type": "uint64"}, {"name": "total_units", "type": "uint64"}, {"name": "reserved_units_total", "type": "uint64"}, {"name": "initial_exchange_amount", "type": "uint64"}, {"name": "event_cursor", "type": "uint64"}, {"name": "schedule_entry_count", "type": "uint64"}, {"name": "outstanding_principal", "type": "uint64"}, {"name": "interest_calculation_base", "type": "uint64"}, {"name": "nominal_interest_rate", "type": "uint64"}, {"name": "accrued_interest", "type": "uint64"}, {"name": "cumulative_interest_index", "type": "uint64"}, {"name": "cumulative_principal_index", "type": "uint64"}, {"name": "reserved_interest", "type": "uint64"}, {"name": "reserved_principal", "type": "uint64"}], "NormalizedActusTerms": [{"name": "contract_type", "type": "uint8"}, {"name": "denomination_asset_id", "type": "uint64"}, {"name": "settlement_asset_id", "type": "uint64"}, {"name": "total_units", "type": "uint64"}, {"name": "notional_principal", "type": "uint64"}, {"name": "initial_exchange_amount", "type": "uint64"}, {"name": "initial_exchange_date", "type": "uint64"}, {"name": "maturity_date", "type": "uint64"}, {"name": "day_count_convention", "type": "uint8"}, {"name": "rate_reset_spread", "type": "uint64"}, {"name": "rate_reset_multiplier", "type": "uint64"}, {"name": "rate_reset_floor", "type": "uint64"}, {"name": "rate_reset_cap", "type": "uint64"}, {"name": "rate_reset_next", "type": "uint64"}, {"name": "has_rate_reset_floor", "type": "bool"}, {"name": "has_rate_reset_cap", "type": "bool"}, {"name": "dynamic_principal_redemption", "type": "bool"}, {"name": "fixed_point_scale", "type": "uint64"}], "ObservedCashEventRequest": [{"name": "event_id", "type": "uint64"}, {"name": "event_type", "type": "uint8"}, {"name": "scheduled_time", "type": "uint64"}, {"name": "accrual_factor", "type": "uint64"}, {"name": "redemption_accrual_factor", "type": "uint64"}, {"name": "next_nominal_interest_rate", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "next_outstanding_principal", "type": "uint64"}, {"name": "flags", "type": "uint64"}], "ObservedEventRequest": [{"name": "event_id", "type": "uint64"}, {"name": "event_type", "type": "uint8"}, {"name": "scheduled_time", "type": "uint64"}, {"name": "accrual_factor", "type": "uint64"}, {"name": "redemption_accrual_factor", "type": "uint64"}, {"name": "observed_rate", "type": "uint64"}, {"name": "next_nominal_interest_rate", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "next_outstanding_principal", "type": "uint64"}, {"name": "flags", "type": "uint64"}], "Prospectus": [{"name": "hash", "type": "byte[32]"}, {"name": "url", "type": "string"}], "RoleValidity": [{"name": "role_validity_start", "type": "uint64"}, {"name": "role_validity_end", "type": "uint64"}]}, "byteCode": {"approval": "DCAFAAEIINwLJjEEFR98dQZzdGF0dXMMZXZlbnRfY3Vyc29yFHNjaGVkdWxlX2VudHJ5X2NvdW50FW91dHN0YW5kaW5nX3ByaW5jaXBhbBFmaXhlZF9wb2ludF9zY2FsZRBhY2NydWVkX2ludGVyZXN0GWludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UCQSMVbm9taW5hbF9pbnRlcmVzdF9yYXRlDWNvbnRyYWN0X3R5cGUUcmVzZXJ2ZWRfdW5pdHNfdG90YWwScmVzZXJ2ZWRfcHJpbmNpcGFsC3RvdGFsX3VuaXRzGW5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24RcmVzZXJ2ZWRfaW50ZXJlc3QZY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleBpjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleAZSOkFSUiMTc2V0dGxlbWVudF9hc3NldF9pZBdpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudAZSOkFVVCMGUjpQWUQjBlI6TU5HIwJTIwZSOk1PQyMGUjpPUEQjFWluaXRpYWxfZXhjaGFuZ2VfZGF0ZRV0cmFuc2Zlcl9vcGVuaW5nX2RhdGUVdHJhbnNmZXJfY2xvc3VyZV9kYXRlEHJhdGVfcmVzZXRfZmxvb3IOcmF0ZV9yZXNldF9jYXAGUjpUUlMjD2Fzc2V0X3N1c3BlbmRlZBxkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uEXJhdGVfcmVzZXRfc3ByZWFkFXJhdGVfcmVzZXRfbXVsdGlwbGllcg9yYXRlX3Jlc2V0X25leHQUaGFzX3JhdGVfcmVzZXRfZmxvb3ISaGFzX3JhdGVfcmVzZXRfY2FwAQAPYXNzZXRfZGVmYXVsdGVkD3Byb3NwZWN0dXNfaGFzaA5wcm9zcGVjdHVzX3VybBVkZW5vbWluYXRpb25fYXNzZXRfaWQNbWF0dXJpdHlfZGF0ZRRkYXlfY291bnRfY29udmVudGlvbgMGgQECAAAxGEAArScSMgNnJxoyA2cnISJnJykiZykiZycKImcnKoAAZycrgABnJywiZycTImcnGyJnJy0iZyccImcnHSJnJy4iZycNImcnCyJnJxQiZycEImcnDiJnJyIiZycHImcnBiJnJwkiZycjImcnJCJnJx4iZycfImcnJSJnJyYiZycnImcnDCJnJw8iZycQImcnESJnKiJnKyJnJwUiZzE1gQQSRDE0gSUSRDE3FEQxNhREgASRTwTrNhoAjgEAxzEZFEQxGEEAsIIYBLRGGMgE54MlKQSUOIcjBGyF4+4EvdGpRAR8DxgSBBT8EO8EdKcpfwQJ1P4UBJqb+oUEhe7TPQSrLA/EBNnyJawEmINQWgSOpudMBAKvVXoEgvcbLQTvBPXTBN80NVAEPb6AvQQePkjnBAEMgpkEdAas0gQacqLuNhoAjhgAVgMhBH0EpwUxBiEGWwazBuYHFAkICh8KmAwEDPYNiQ3ODeYN/g6zD0kPaA9zD70AgASVbXFWNhoAjgEG8QAxGYEEEjEYEERCDa6KAgCL/oEKCIsAMgwNQQAqsYEGshCBBbIZJy+yHicvsh+L/40CAAsABLNC/9syALIBQv/1IrIBQv/viSKAAEcNNhoBSRUkEkQXIillRESIFZ6IFaWIFaoiKWVEgTISFESIEgFBAAtJgWQLIQQIIoj/jyJFBSJFDiJFDUsESwEMQQJZIiplRCIrZUQMQQJNIiplRIgQ00lFEYEJW0lFAzIHDUACN0sPJFVJRRAkEklFBEAAEEsOgQMSQAAISw6BExJBAj8jQQIUSw8iWyIqZUQSREsBMgcOREsCQAHtSw6BExJAAeUiRQtLDyRVSUUQgQMSQAFlSw6BExJAAV0iRQZLD4ExW0UIiBFbQAD+SwdFCUsKiBAZSwaIEBRLAYgQLklOAkUPSYgQJUlFC0sCSwEISUUJMgoiJxNlRHAARCInD2VEIicMZURLAQhLAksBD0RPAkwJTwIPRE8DCCcPTGciJwxlRAgnDExnIicQZURPAggnEExnIicRZUQIJxFMZ0sPJFWBAxJBAHoiJwZlREsQiBDnRRIIJwZMZ4gQx0EACksPJFWBExJBAAlLD4EpWycOTGcnBEsIZycHSwlnIiplRCMIKkxnSw9XCAGAAROoQQARIicEZURAAAkpgcgBZycHImdLD0sESYgTVEhLDUsMCEUOSwxLBwhFDUsEIwhFBUL+dycGImdC/5BLDyRVSUUQgQMSQQAQIicEZURLBglJRQlFCUL+6UsOJBJBABMiJwRlTEUJRCInB2VMRQpEQv7PSw6BExJAAAdLB0UJQv7AIkUIIkUJQv63iBAIQQBWSw6BExJBAAoiJwRlREUGQv6OIicGZURLEIgP/0USCElFCyInDmVED0EABiJFBkL+byInDmVESwoJSUUIIicEZUQNQQAKIicEZURFBkL+UUsGRQZC/kpLD4ExWyInBGVESg5ETAlFBkL+NiInBmVESxCID6dFEghFC0L+DEsESURLDklLD0lOAwgyB08CFk8DFlBPAhZQTwIWUEwWUChMULAjQyJC/b6AAEcCNhoBRwIVJRJENhoCSSJZgQIISwEVEkRXAgBMIillREQnCExQSb1FAUQiJxplRDIDE0EAIjEAIicaZUQSQAAVMQBLAxJAAA0xAEsBvkRXACASQQEAI0SIEpaIEpsiKWVEgTISFERLAkmIDUuIDM5GAkm+REmBSVtJTgJFCEmBUVtJRQhPAghJRQZEVwAgIicTZURwAEUBQQC3Sb5EgYADU0AArSNBAHgyCiInE2VETEsBcABESwVJTgIPREsCSU4DvkRJVwAgsTIATwOyEkyyFE8CshGBBLIQsgGzSYFJW0lOAkUJSYFRW0lOA0UJIhZMSwFcSUxcUU8DTL8iJw9lRElLAg9EIicMZURLAw9ETAknD0xnIicMZURMCScMTGdLBUlLBklOAwgyB08CFk8DFlBPAhZQTBZQSwJJFRZXBgJMUEyAAgAiUExQKExQsCNDIkL/UCJC/v02GgFJFSQSRBc2GgJJFSQSRBeIEXhKDEQnHE8CZycdTGcyBxYoTFCwI0M2GgFJFSUSRDYaAkkVJBJEF0lOAiIpZUREJxYxAIgRD0SIEUmIEU4iKWVEgTISRCcISwJQSU4DvUUBREyIC2pJRCInC2VECCInDWVEDkQiJxtlREEACTIHIicbZUQOREcCvkSBKFtLA0lOAwgWgShMuyInC2VECCcLSwFnIicNZURMCRYoTFCwI0MiSTYaAUkVJRJENhoCSRUlEkQ2GgNHAhUkEkQXIillRESIEL+IEMQiKWVEgTISFEQiJxxlREEACSInHGVEMgcORCInHWVEQQAJMgciJx1lRAxEMQBLBElOAhJEJwhLAVBJRQhJvUUBRCcISwVJTgJQSUUJvUUBREsCiAqjSYgKn08CE0RLAUlETL5EJVsORCIqZUQiK2VED0AADiIqZUSIC7CBCVsyBw1ESwNJiAr7SwNJTgKICvOICnZGAogKcUYCSwVJvkQlW0sCSU4CSwEOREsBCRZPAiVPArtLBUm+RCVbTwIIFiVMuyhLAlCwI0M2GgFJFSUSRDYaAkkVIxJEIlMnFTEAiA+cRCcITwJQSb1FAURJgTAjuiJPA1SBMEy7MgcWKExQsCNDNhoBSRUlEkQ2GgJJFSUSRCcXMQCID2REIillRIHIARIURIgPlIgPmScITwJQSb1FARREIhZPAksBUEsBUCcoUEsBUEsBUEsBUEsBUExQvzIHFihMULAjQzYaAUkVJRJENhoCSRUlEkQnCEsCUEm9RQFEMQBPAxJEiA8+iA9DIk8CuzIHFihMULAjQzYaAUkVJRJEJwhMUEm9RQFEvkgoTFCwI0M2GgFJFSUSRCcSTGcyBxYoTFCwI0OAAEk2GgFHAhWBaxJENhoCSU4CFYFIEkQ2GgNJTgJJFUsBJVlJgSISRE8CTEsCUklOAyJZgSQIEkSIDroiVUknCksBZ0EAIkkjEkAAHEmBAhJAABVJgQMSQAAOSYEEEkAAB0mBBRJBAYcjRCInCmVMRQJESwRJgSFbSUUIRIE5VUlFCEEAH0sGIxJAABhLBoECEkAAEEsGgQMSQAAISwaBBBJBAUcjREkjE0EACEsEgZIGUxREIillRBREIicUZUQUREsESSNbSXELRQFEJyxLAWdLAYEJW0lPAhJEJxNLAWexMgAyCiKyErIUTLIRgQSyELIBs0mBEVsnDUxnJwsiZycuSwhnSYEpWycbSwFnSwGBMVsnLUsBZ0sGSU4CgTBbJw5MZycUSwpnSwOBkgZTJyJMZ0sBgRBbJwRMZ0sBgShbJwZMZ0sBJVsnCUxnSwGBGFsnB0xnSwOBOlsnI0xnSwOBQlsnJExnSwOBSlsnHkxnSwOBUlsnH0xnSwOBWlsnJUxnSwOBkAZTJyZMZ0sDgZEGUycnTGdPA4FjWycFTGdLASRbKkxnSwGBOFsnEExnSwGBQFsnEUxnJw8iZycMImdLAjIHDURMIltLAgxEDERLAlcAICcqTGdLAVcCACcrTGcyBxYoTFCwI0MiQv62IkL+diKAAEcCNhoBSRUkEkQXSTYaAkkVIxJEIlNMNhoDSU4CSSJZSU4DSYFBC4ECCE8CFRJEiAzNIicKZUxOA0QiKWVEFERJgRAORCInFGVEREyBEAtMgWQLIQQIIoj2tiJJSwQMQQCLSwRXAgBJRQxLAUlOAoFBC4FBWEkkVUlOAkUNSSJbSUUNSwVPBAhLARJESwVPA4gIGUyBCVtJRQpEQQAXSUEAJUkjCYFBC0sLTIFBWIEJW0sIDkRLCEAABUsJIxJESSMIRQFC/5RLBklEIwkWJxhMUEm9RQFESSKBAroXSUQjCYFBC4ECCIFBukL/wUsGFicYTFBJvEhLBb9LBUEADEsBSwQIK0xnKYEyZzIHFihMULAjQyIpZUREiAvjiAvqiAvvIiplRCIrZURLAQ1EiAdHSVcIAUmAAQGoREsBVwAISwJXCQhLA1cRCEsEVxkISwVXIQhLBlcpCEsHVzEISwhXOQhPB08IUE8HUE8GUE8FUCIWUE8EUE8DUE8CUExQiAh5RgIyBxYoTFCwI0MiRwSAAEk2GgFJFSQSRBc2GgJHAhWBSRJEIillRESIC1uIC2CBQVtJgQQaQQCwIicKZUSBBRJEiAs4IicKZURJgQUSREsCSSJbSUUHIitlRBJESVcIAUUMJFWIBsIiK2VEgRAKJzBFBxYnGExQSUUJvUUBQQAHSwe+TEUHREsFSSJZSYEQDERLA0lXCQhLAVcRCEsCVxkISwNXKQhLBFcxCE8FVzkISwsWSxJQTwZQTwVQTwRQTwNQTwJQTFBLAxZQTwJMUEwjCBZXBgJcAEsISbxITL8iK2VEIwgrTGciKmVESwNJTwISRIgF/0lFCElXCAFFCiRVSUUGIxJAAChLBIEEEkAAIEsEgQwSQAAYSwSBCxJAABBLBIESEkAACEsEgQUSQQBBI0RLCIABAalESwSBDBJAAAhLBIELEkEAJCNBABonGTEAiAnzREsGSwKIBxtGAjIHFihMULAjQ4gKEUL/6CJC/9kiQv+8Ikk2GgFHAhWBQRJEIillRESICfKICfmICf4iKWVEgTISFEQiJwplRIEFEkRJIltJTgIiK2VETEsBEkRLAVcIAUlOA4ABA6hETIE5W0lOAiMaREEAEyIrZUQjCYgFIYEJW0sEgQlbDkQiK2VEgRAKJzBFBhYnGExQSUUHvUUBQQAHSwW+TEUGREsESSJZSYEQDERLBUlXCQhLAVcRCEsCVxkISwNXIQhLBFcpCE8FVzEISwoWSwpQTwZQTwVQTwRQTwNQTwJQTFBLAxZQTwJMUEwjCBZXBgJcAEsGSbxITL8iK2VEIwgrTGcyBxYoTFCwI0MiKWVESUQiJwplRBZJkyQORFcHASInDWVEIicLZUQiJxRlRCIqZUQiK2VEIicEZUQiJwdlRCInCWVEIicGZUQiJxBlRCInEWVEIicPZUQiJwxlRE8OFk8OTFBPDRZQTwwWUE8LFlBPChZQTwkWUE8IFlBPBxZQTwYWUE8FFlBPBBZQTwMWUE8CFlBMFlAoTFCwI0MiKWVERCIqZUQiK2VED0EAJSIqZUQWJyhQIhZMSwFQSwFQSwFQSwFQSwFQSwFQTFAoTFCwI0MiKmVEiAO9Qv/wiAg+I0M2GgFJFSUSRIgIMScSTGcyBxYoTFCwI0M2GgFJFSUSRIgIGScaTGcyBxYoTFCwI0M2GgFJFSMSRDYaAklOAhUlEkQ2GgNJTgIVgRASRIgH7IgH8xdHAogH/YEUEkEADicSSwNnMgcWKExQsCNDSYEoEkEAEScXSwNQSb1FARRESwK/Qv/fSYEyEkEAEScWSwNQSb1FARRESwK/Qv/HSYE8EkEAEScgSwNQSb1FARRESwK/Qv+vSYFGEkEAEScVSwNQSb1FARRESwK/Qv+XSYFQEkH/kCcZSwNQSb1FARRESwK/Qv9/NhoBSRUjEkQ2GgJJTgIVJRJEiAdCiAdJF0cCiAdTSYEUE0SBKBJBABUnF0sCUEm9RQFEvEgyBxYoTFCwI0NJgTISQQAPJxZLAlBJvUUBRLxIQv/hSYE8EkEADycgSwJQSb1FAUS8SEL/y0mBRhJBAA8nFUsCUEm9RQFEvEhC/7VJgVASQf+uJxlLAlBJvUUBRLxIQv+fNhoBSRUjEkQiUycVMQCIBnxEJyFMZzIHFihMULAjQyInEmVEKExQsCNDNhoBSRUlEkQnF0sBiAZUJxZLAogGTScgSwOIBkYnFUsEiAY/JxlPBYgGOCcoIk8GVCNPBVSBAk8EVIEDTwNUgQRPAlQoTFCwI0M2GgFJFSMSRDYaAklOAhUlEkQXSYgGUIMGFCgyPEZQTwaOBgBPAEAAMQAiABMAAQAnGUsBUEm9RQFEvkgoTFCwI0MnFUsBUEm9RQFEvkhC/+snIEsBUEm9RQFEvkhC/9wnFksBUEm9RQFEvkhC/80nF0sBUEm9RQFEvkhC/76AEAAAAAAAAAAAAAAAAAAAAABC/6mKAQAnCIv/UL5EgYADUxREiYoBAicIi/9QSb1FAURJvkgiJxBlREsBgTlbCSInEWVESwKBQVsJSwIlWyInBWVETwNLAk8CiACYIicFZURPA08DTwKIAIpLAoFJW0sCCBZPA0xcSUmBUVtLAggWXFEiJxBlRBZcOSInEWVEFlxBIiplRBZcMU8DTL+JigEAIoAAJwiL/1BJvUUBRCIpZUSBMhJBAAGJiwK+TElOAowARIEoW0mMAUAAAYmLAEklW4sBSU4DCBZcICIWXCiLAky/IicLZURJSwIPREwJJwtMZ4mKAwGL/UEABYv+QAACIomL/Yv+HYv/l4mKAQGL/0AAAiKJIicNZURJRCInBWVEi/9MTwKI/8qJigEBi/9AAAIiiSInDWVEIicFZUSL/0yI/6+JigEBIitlRIv/DUSL/4EQChYnGExQSb1FAUSL/4EQGEsBIoECuhdLAQ1EgUELgQIIgUG6iYoCAIv/IxJAAB+L/yQSQAAYi/+BExJAABCL/4EMEkAACIv/gQsSQQADI0SJi/5AAAQiQv/1i/6BAxJAAAiL/oECEkEAGIv/gQMSQAAIi/+BEhJBAAQjQv/RIkL/zYv+IxJBACCL/4EDEkAAEIv/gRISQAAIi/+BBRJBAAQjQv+qIkL/pov+gQQSQQAoi/+BAxJAABiL/4EEEkAAEIv/gRISQAAIi/+BBRJBAAQjQv96IkL/dov+gQUSQQAIi/+BAxJC/2YiQv9iIicKZUQjEkEACiInImVEQQACI4kiiYoBAov/gRFbSUEAECInCWVEQQAIIicHZURAAAYii/9PAokiJwdlRCInCWVEIicFZUSI/mgiJwVlRIsATIj+XYv/TwKJigIBi/9AAAOL/okiJwVlRCInCWVEi/9LAoj+PAhJRCInBWVEi/5MTwKI/iyJigICIoAARwiL/iJbIiplRBJEi/6BCVsyBw5Ei/4kVUkjEklBAF4iKWVEgTISRCInC2VEIicNZUQSRIv+gTFbJwRLAWcnB0xni/6BIVsnCUxnJwYiZ4v+gSlbJw5MZyIqZUQjCCpMZymBZGeLC0QiJxRlRIv+TCKIAdpJjP6L/4wBjACJIillRIEyEhREIicGZUSL/oj++Iz+CCcGTGeLCoEMEkEBeIv/gSFbIickZUQiJwVlRIj9cyInI2VECIwGIicmZURBABMiJx5lRIsGDUEACCInHmVMjAZEIicnZURBABMiJx9lRIsGDEEACCInH2VMjAZEJwmLBmeLCoEEEkEBB4v+gTFbJwRLAWcnB0xniP5lQQDniwqBBRJBAMUiK2VEIiplRAmBZAshBAgiiOvjIicFZUyMAkQijAEijAeL/oEZW0mMCEEAD4sCiwiI/oFJjAIjjAeMASIqZUQjCIwDIitlRIsDDUEAUosDiP0MSYwAJFVJjASBAxJAABCLBIETEkEAM4sAgRlbQQArI0EACIsHQQAMIowHiwMjCIwDQv++iwCBGVuLAkyI/iRJjAKLAQiMAUL/4SJC/9KLAUQiJwRlRIv+gTlbJBpAAAYiJwZlRAgiJwVlRIsBiPxLJw5MZyIqZUQjCCpMZ4v+IkmIAGBJjP6L/4wBjACJi/6BKVsnDkxnQv/aiwqBEhJB/v8iJwRlRCcHTGdC/vOLCoELEkEAG4v+gSFbSYwFQAAIIiclZUyMBUQnCYsFZ0L+uov+gSFbSYwJQf6vJwmLCWdC/qeKAwEyCIv9IluL/VcIAYv9VwkIMgeL/SRVi/5AAEUjFkmTJA5EVwcBIicTZUSLAUkjCIsAFk8CFlCLAlCLA1CLBBZQi/4WUE8DUIv/FlBPAhZQTBZQgASaMyuVTFCwi/2MAImLBSMSQAAIiwWBBBJBAAQjQv+pgf8BQv+jigIBgACL/ov/UEm9RQFBAB+LAb5EIlsyB0mMAA5BABCLAb5EJFuLAA9BAAQjjACJIkL/+TEAIicSZUQSRIkiJyllRBREiSInIWVEFESJigEAi/+BFBJAADCL/4EZEkAAKIv/gSgSQAAgi/+BMhJAABiL/4E8EkAAEIv/gUYSQAAIi/+BUBJBAAMjRIkiQv/6", "clear": "DIEBQw=="}, "desc": "Debt Algorand Standard Application.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "networks": {}, "source": {"approval": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCAzMiAxNTAwCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUgInN0YXR1cyIgImV2ZW50X2N1cnNvciIgInNjaGVkdWxlX2VudHJ5X2NvdW50IiAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIiAiZml4ZWRfcG9pbnRfc2NhbGUiICJhY2NydWVkX2ludGVyZXN0IiAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIgMHg0MTIzICJub21pbmFsX2ludGVyZXN0X3JhdGUiICJjb250cmFjdF90eXBlIiAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiICJyZXNlcnZlZF9wcmluY2lwYWwiICJ0b3RhbF91bml0cyIgIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iICJyZXNlcnZlZF9pbnRlcmVzdCIgImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIgMHg1MjNhNDE1MjUyMjMgInNldHRsZW1lbnRfYXNzZXRfaWQiICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIgMHg1MjNhNDE1NTU0MjMgMHg1MjNhNTA1OTQ0MjMgMHg1MjNhNGQ0ZTQ3MjMgMHg1MzIzIDB4NTIzYTRkNGY0MzIzIDB4NTIzYTRmNTA0NDIzICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiICJ0cmFuc2Zlcl9vcGVuaW5nX2RhdGUiICJ0cmFuc2Zlcl9jbG9zdXJlX2RhdGUiICJyYXRlX3Jlc2V0X2Zsb29yIiAicmF0ZV9yZXNldF9jYXAiIDB4NTIzYTU0NTI1MzIzICJhc3NldF9zdXNwZW5kZWQiICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIiAicmF0ZV9yZXNldF9zcHJlYWQiICJyYXRlX3Jlc2V0X211bHRpcGxpZXIiICJyYXRlX3Jlc2V0X25leHQiICJoYXNfcmF0ZV9yZXNldF9mbG9vciIgImhhc19yYXRlX3Jlc2V0X2NhcCIgMHgwMCAiYXNzZXRfZGVmYXVsdGVkIiAicHJvc3BlY3R1c19oYXNoIiAicHJvc3BlY3R1c191cmwiICJkZW5vbWluYXRpb25fYXNzZXRfaWQiICJtYXR1cml0eV9kYXRlIiAiZGF5X2NvdW50X2NvbnZlbnRpb24iIDB4MDY4MTAxIDB4MDAwMAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4LTI5CiAgICAvLyAjIFJCQUMgUm9sZXMKICAgIC8vIHNlbGYuYXJyYW5nZXIgPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX0FSUkFOR0VSKQogICAgYnl0ZWMgMTggLy8gMHg1MjNhNDE1MjUyMjMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMAogICAgLy8gc2VsZi5vcF9kYWVtb24gPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX09QX0RBRU1PTikKICAgIGJ5dGVjIDI2IC8vIDB4NTIzYTRmNTA0NDIzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NDctNDgKICAgIC8vICMgRC1BU0EgR292ZXJuYW5jZQogICAgLy8gc2VsZi5hc3NldF9zdXNwZW5kZWQgPSBGYWxzZQogICAgYnl0ZWMgMzMgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjQ5CiAgICAvLyBzZWxmLmFzc2V0X2RlZmF1bHRlZCA9IEZhbHNlCiAgICBieXRlYyA0MSAvLyAiYXNzZXRfZGVmYXVsdGVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1Ni01NwogICAgLy8gIyBDb250cmFjdAogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKQogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OAogICAgLy8gc2VsZi5jb250cmFjdF90eXBlID0gVUludDY0KCkKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MC02MQogICAgLy8gIyBQcm9zcGVjdHVzIChJbmZvcm1hdGlvbmFsKQogICAgLy8gc2VsZi5wcm9zcGVjdHVzX2hhc2ggPSBCeXRlcygpCiAgICBieXRlYyA0MiAvLyAicHJvc3BlY3R1c19oYXNoIgogICAgcHVzaGJ5dGVzIDB4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjIKICAgIC8vIHNlbGYucHJvc3BlY3R1c191cmwgPSBTdHJpbmcoKQogICAgYnl0ZWMgNDMgLy8gInByb3NwZWN0dXNfdXJsIgogICAgcHVzaGJ5dGVzICIiCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjQtNjUKICAgIC8vICMgRGVub21pbmF0aW9uCiAgICAvLyBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCA9IEFzc2V0KCkKICAgIGJ5dGVjIDQ0IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBBc3NldCgpCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjgtNjkKICAgIC8vICMgVGltZQogICAgLy8gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGUgPSB0eXAuVGltZVN0YW1wKCkKICAgIGJ5dGVjIDI3IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcwCiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSB0eXAuVGltZVN0YW1wKCkKICAgIGJ5dGVjIDQ1IC8vICJtYXR1cml0eV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MQogICAgLy8gc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgPSB0eXAuVGltZVN0YW1wKCkKICAgIGJ5dGVjIDI4IC8vICJ0cmFuc2Zlcl9vcGVuaW5nX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcyCiAgICAvLyBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgMjkgLy8gInRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzQtNzUKICAgIC8vICMgRGF5IENvdW50IENvbnZlbnRpb24KICAgIC8vIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPSBVSW50NjQoKQogICAgYnl0ZWMgNDYgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3Ny03OAogICAgLy8gIyBVbml0cwogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IFVJbnQ2NCgpCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc5CiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID0gVUludDY0KCkKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODEtODIKICAgIC8vICMgUHJpbmNpcGFsCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID0gVUludDY0KCkKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODMKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gVUludDY0KCkKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODUKICAgIC8vIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiA9IEZhbHNlCiAgICBieXRlYyAzNCAvLyAiZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODctODgKICAgIC8vICMgSW50ZXJlc3QKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OQogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ID0gVUludDY0KCkKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkxLTkyCiAgICAvLyAjIEludGVyZXN0IFJhdGVzCiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzCiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkID0gVUludDY0KCkKICAgIGJ5dGVjIDM1IC8vICJyYXRlX3Jlc2V0X3NwcmVhZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9tdWx0aXBsaWVyID0gVUludDY0KCkKICAgIGJ5dGVjIDM2IC8vICJyYXRlX3Jlc2V0X211bHRpcGxpZXIiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfZmxvb3IgPSBVSW50NjQoKQogICAgYnl0ZWMgMzAgLy8gInJhdGVfcmVzZXRfZmxvb3IiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfY2FwID0gVUludDY0KCkKICAgIGJ5dGVjIDMxIC8vICJyYXRlX3Jlc2V0X2NhcCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTcKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9uZXh0ID0gVUludDY0KCkKICAgIGJ5dGVjIDM3IC8vICJyYXRlX3Jlc2V0X25leHQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4CiAgICAvLyBzZWxmLmhhc19yYXRlX3Jlc2V0X2Zsb29yID0gRmFsc2UKICAgIGJ5dGVjIDM4IC8vICJoYXNfcmF0ZV9yZXNldF9mbG9vciIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTkKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwID0gRmFsc2UKICAgIGJ5dGVjIDM5IC8vICJoYXNfcmF0ZV9yZXNldF9jYXAiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMS0xMDIKICAgIC8vICMgUHJpbWFyeSBEaXN0cmlidXRpb24KICAgIC8vIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsID0gVUludDY0KCkKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMwogICAgLy8gc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNS0xMDYKICAgIC8vICMgQ3VtdWxhdGl2ZSBQZXItVW5pdCBGaXhlZC1Qb2ludCBJbmRleGVzCiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggPSBVSW50NjQoKQogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNwogICAgLy8gc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNQogICAgLy8gc2VsZi5ldmVudF9jdXJzb3IgPSBVSW50NjQoKQogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTYKICAgIC8vIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgPSBVSW50NjQoKQogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExOC0xMTkKICAgIC8vICMgU2NhbGluZwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjIzCiAgICAvLyBhc3NlcnQgVHhuLmdsb2JhbF9udW1fYnl0ZV9zbGljZSA9PSBjZmcuR0xPQkFMX0JZVEVTLCBlcnIuV1JPTkdfR0xPQkFMX0JZVEVTCiAgICB0eG4gR2xvYmFsTnVtQnl0ZVNsaWNlCiAgICBwdXNoaW50IDQKICAgID09CiAgICBhc3NlcnQgLy8gV3JvbmcgR2xvYmFsIEJ5dGVzIGFsbG9jYXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kX2FzYS9jb250cmFjdC5weToyNAogICAgLy8gYXNzZXJ0IFR4bi5nbG9iYWxfbnVtX3VpbnQgPT0gY2ZnLkdMT0JBTF9VSU5UUywgZXJyLldST05HX0dMT0JBTF9VSU5UUwogICAgdHhuIEdsb2JhbE51bVVpbnQKICAgIHB1c2hpbnQgMzcKICAgID09CiAgICBhc3NlcnQgLy8gV3JvbmcgR2xvYmFsIFVJbnRzIGFsbG9jYXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kX2FzYS9jb250cmFjdC5weToyNQogICAgLy8gYXNzZXJ0IFR4bi5sb2NhbF9udW1fYnl0ZV9zbGljZSA9PSBjZmcuTE9DQUxfQllURVMsIGVyci5XUk9OR19MT0NBTF9CWVRFUwogICAgdHhuIExvY2FsTnVtQnl0ZVNsaWNlCiAgICAhCiAgICBhc3NlcnQgLy8gV3JvbmcgTG9jYWwgQnl0ZXMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBhc3NlcnQgVHhuLmxvY2FsX251bV91aW50ID09IGNmZy5MT0NBTF9VSU5UUywgZXJyLldST05HX0xPQ0FMX1VJTlRTCiAgICB0eG4gTG9jYWxOdW1VaW50CiAgICAhCiAgICBhc3NlcnQgLy8gV3JvbmcgTG9jYWwgVUludHMgYWxsb2NhdGlvbgoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6OC0xOAogICAgLy8gY2xhc3MgREFTQSgKICAgIC8vICAgICBQYXltZW50QWdlbnQsCiAgICAvLyAgICAgVHJhbnNmZXJBZ2VudCwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBhdm1fdmVyc2lvbj0xMiwKICAgIC8vICk6CiAgICBwdXNoYnl0ZXMgMHg5MTRmMDRlYiAvLyBtZXRob2QgImNvbnRyYWN0X3VwZGF0ZSgpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fY29udHJhY3RfdXBkYXRlX3JvdXRlQDQKCm1haW5fc3dpdGNoX2Nhc2VfbmV4dEA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjgtMTgKICAgIC8vIGNsYXNzIERBU0EoCiAgICAvLyAgICAgUGF5bWVudEFnZW50LAogICAgLy8gICAgIFRyYW5zZmVyQWdlbnQsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyAgICAgYXZtX3ZlcnNpb249MTIsCiAgICAvLyApOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYnogbWFpbl9jcmVhdGVfTm9PcEAzMgogICAgcHVzaGJ5dGVzcyAweGI0NDYxOGM4IDB4ZTc4MzI1MjkgMHg5NDM4ODcyMyAweDZjODVlM2VlIDB4YmRkMWE5NDQgMHg3YzBmMTgxMiAweDE0ZmMxMGVmIDB4NzRhNzI5N2YgMHgwOWQ0ZmUxNCAweDlhOWJmYTg1IDB4ODVlZWQzM2QgMHhhYjJjMGZjNCAweGQ5ZjIyNWFjIDB4OTg4MzUwNWEgMHg4ZWE2ZTc0YyAweDAyYWY1NTdhIDB4ODJmNzFiMmQgMHhlZjA0ZjVkMyAweGRmMzQzNTUwIDB4M2RiZTgwYmQgMHgxZTNlNDhlNyAweDAxMGM4Mjk5IDB4NzQwNmFjZDIgMHgxYTcyYTJlZSAvLyBtZXRob2QgImZ1bmRfZHVlX2Nhc2hmbG93cyh1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJjbGFpbV9kdWVfY2FzaGZsb3dzKGFkZHJlc3MsYnl0ZVtdKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYnl0ZVtdKSIsIG1ldGhvZCAidHJhbnNmZXJfc2V0X3NjaGVkdWxlKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbihhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInRyYW5zZmVyKGFkZHJlc3MsYWRkcmVzcyx1aW50NjQpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X3N1c3BlbnNpb24oYWRkcmVzcyxib29sKXVpbnQ2NCIsIG1ldGhvZCAiYWNjb3VudF9vcGVuKGFkZHJlc3MsYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgImFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzcyhhZGRyZXNzLGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X2dldF9wb3NpdGlvbihhZGRyZXNzKShhZGRyZXNzLHVpbnQ2NCx1aW50NjQsYm9vbCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAiY29udHJhY3RfY29uZmlnKCh1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxib29sLGJvb2wsYm9vbCx1aW50NjQpLCh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCksKGJ5dGVbMzJdLHN0cmluZykpdWludDY0IiwgbWV0aG9kICJjb250cmFjdF9zY2hlZHVsZSh1aW50NjQsYm9vbCwodWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NClbXSl1aW50NjQiLCBtZXRob2QgImNvbnRyYWN0X2V4ZWN1dGVfaWVkKCl1aW50NjQiLCBtZXRob2QgImFwcGx5X25vbl9jYXNoX2V2ZW50KHVpbnQ2NCwodWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIsIG1ldGhvZCAiYXBwZW5kX29ic2VydmVkX2Nhc2hfZXZlbnQoKHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIsIG1ldGhvZCAiY29udHJhY3RfZ2V0X3N0YXRlKCkodWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudCgpKHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJyYmFjX3JvdGF0ZV9hcnJhbmdlcihhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19zZXRfb3BfZGFlbW9uKGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX2Fzc2lnbl9yb2xlKHVpbnQ4LGFkZHJlc3MsKHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19yZXZva2Vfcm9sZSh1aW50OCxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19jb250cmFjdF9zdXNwZW5zaW9uKGJvb2wpdWludDY0IiwgbWV0aG9kICJyYmFjX2dldF9hcnJhbmdlcigpYWRkcmVzcyIsIG1ldGhvZCAicmJhY19nZXRfYWRkcmVzc19yb2xlcyhhZGRyZXNzKShib29sLGJvb2wsYm9vbCxib29sLGJvb2wpIiwgbWV0aG9kICJyYmFjX2dldF9yb2xlX3ZhbGlkaXR5KHVpbnQ4LGFkZHJlc3MpKHVpbnQ2NCx1aW50NjQpIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggZnVuZF9kdWVfY2FzaGZsb3dzIGNsYWltX2R1ZV9jYXNoZmxvd3MgdHJhbnNmZXJfc2V0X3NjaGVkdWxlIHByaW1hcnlfZGlzdHJpYnV0aW9uIHRyYW5zZmVyIGFjY291bnRfc3VzcGVuc2lvbiBhY2NvdW50X29wZW4gYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzIGFjY291bnRfZ2V0X3Bvc2l0aW9uIGNvbnRyYWN0X2NvbmZpZyBjb250cmFjdF9zY2hlZHVsZSBjb250cmFjdF9leGVjdXRlX2llZCBhcHBseV9ub25fY2FzaF9ldmVudCBhcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudCBjb250cmFjdF9nZXRfc3RhdGUgY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50IHJiYWNfcm90YXRlX2FycmFuZ2VyIHJiYWNfc2V0X29wX2RhZW1vbiByYmFjX2Fzc2lnbl9yb2xlIHJiYWNfcmV2b2tlX3JvbGUgcmJhY19jb250cmFjdF9zdXNwZW5zaW9uIHJiYWNfZ2V0X2FycmFuZ2VyIHJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXMgcmJhY19nZXRfcm9sZV92YWxpZGl0eQogICAgZXJyCgptYWluX2NyZWF0ZV9Ob09wQDMyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjgtMTgKICAgIC8vIGNsYXNzIERBU0EoCiAgICAvLyAgICAgUGF5bWVudEFnZW50LAogICAgLy8gICAgIFRyYW5zZmVyQWdlbnQsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyAgICAgYXZtX3ZlcnNpb249MTIsCiAgICAvLyApOgogICAgcHVzaGJ5dGVzIDB4OTU2ZDcxNTYgLy8gbWV0aG9kICJjb250cmFjdF9jcmVhdGUoYWRkcmVzcyl1aW50NjQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBjb250cmFjdF9jcmVhdGUKICAgIGVycgoKbWFpbl9jb250cmFjdF91cGRhdGVfcm91dGVANDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgNCAvLyBVcGRhdGVBcHBsaWNhdGlvbgogICAgPT0KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0CiAgICBiIGNvbnRyYWN0X3VwZGF0ZQoKCi8vIF9wdXlhX2xpYi51dGlsLmVuc3VyZV9idWRnZXQocmVxdWlyZWRfYnVkZ2V0OiB1aW50NjQsIGZlZV9zb3VyY2U6IHVpbnQ2NCkgLT4gdm9pZDoKZW5zdXJlX2J1ZGdldDoKICAgIHByb3RvIDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDEwCiAgICArCgplbnN1cmVfYnVkZ2V0X3doaWxlX3RvcEAxOgogICAgZnJhbWVfZGlnIDAKICAgIGdsb2JhbCBPcGNvZGVCdWRnZXQKICAgID4KICAgIGJ6IGVuc3VyZV9idWRnZXRfYWZ0ZXJfd2hpbGVANgogICAgaXR4bl9iZWdpbgogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGJ5dGVjIDQ3IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbQogICAgYnl0ZWMgNDcgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KICAgIGZyYW1lX2RpZyAtMQogICAgc3dpdGNoIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMEAzIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMUA0CgplbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX25leHRANToKICAgIGl0eG5fc3VibWl0CiAgICBiIGVuc3VyZV9idWRnZXRfd2hpbGVfdG9wQDEKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMUA0OgogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgaXR4bl9maWVsZCBGZWUKICAgIGIgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV9uZXh0QDUKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMEAzOgogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBiIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfbmV4dEA1CgplbnN1cmVfYnVkZ2V0X2FmdGVyX3doaWxlQDY6CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnBheW1lbnRfYWdlbnQuUGF5bWVudEFnZW50LmZ1bmRfZHVlX2Nhc2hmbG93c1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmZ1bmRfZHVlX2Nhc2hmbG93czoKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gMTMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjY4CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2OQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3MAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDcKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzIKICAgIC8vIGlmIHNlbGYuX2lzX2R5bmFtaWNfYW5udWl0eSgpOgogICAgY2FsbHN1YiBfaXNfZHluYW1pY19hbm51aXR5CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzYtNzcKICAgIC8vICsgbWF4X2V2ZW50X2NvdW50CiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfRlVORF9EVUVfQ0FTSEZMT1dTX1BFUl9FVkVOVF9CVURHRVQpCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3NwogICAgLy8gKiBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19QRVJfRVZFTlRfQlVER0VUKQogICAgcHVzaGludCAxMDAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3Ni03NwogICAgLy8gKyBtYXhfZXZlbnRfY291bnQKICAgIC8vICogVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfUEVSX0VWRU5UX0JVREdFVCkKICAgICoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3NQogICAgLy8gVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfQkFTRV9CVURHRVQpCiAgICBpbnRjIDQgLy8gMTUwMAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojc1LTc3CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19CQVNFX0JVREdFVCkKICAgIC8vICsgbWF4X2V2ZW50X2NvdW50CiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfRlVORF9EVUVfQ0FTSEZMT1dTX1BFUl9FVkVOVF9CVURHRVQpCiAgICArCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzMtNzkKICAgIC8vIGVuc3VyZV9idWRnZXQoCiAgICAvLyAgICAgcmVxdWlyZWRfYnVkZ2V0PSgKICAgIC8vICAgICAgICAgVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfQkFTRV9CVURHRVQpCiAgICAvLyAgICAgICAgICsgbWF4X2V2ZW50X2NvdW50CiAgICAvLyAgICAgICAgICogVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfUEVSX0VWRU5UX0JVREdFVCkKICAgIC8vICAgICApLAogICAgLy8gKQogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4MQogICAgLy8gcHJvY2Vzc2VkX2V2ZW50cyA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjgyCiAgICAvLyBmdW5kZWRfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDE0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODMKICAgIC8vIGZ1bmRlZF9wcmluY2lwYWwgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDEzCgpmdW5kX2R1ZV9jYXNoZmxvd3Nfd2hpbGVfdG9wQDQ6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODYKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgPCBtYXhfZXZlbnRfY291bnQKICAgIGRpZyA0CiAgICBkaWcgMQogICAgPAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojg2LTg3CiAgICAvLyBwcm9jZXNzZWRfZXZlbnRzIDwgbWF4X2V2ZW50X2NvdW50CiAgICAvLyBhbmQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAMTEKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4NwogICAgLy8gYW5kIHNlbGYuZXZlbnRfY3Vyc29yIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICA8CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODYtODcKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgPCBtYXhfZXZlbnRfY291bnQKICAgIC8vIGFuZCBzZWxmLmV2ZW50X2N1cnNvciA8IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQKICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl93aGlsZUAxMQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojg5CiAgICAvLyBlbnRyeSA9IHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLmV2ZW50X2N1cnNvcikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICBkdXAKICAgIGJ1cnkgMTcKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5MAogICAgLy8gaWYgZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcDoKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSAzCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDExCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6OTIKICAgIC8vIGlmIG5vdCBzZWxmLl9ldmVudF9pc19jYXNoKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkpOgogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBidXJ5IDE2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNTEKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgaW50Y18yIC8vIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM1MC0zNTQKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX01EKSwKICAgIC8vICkKICAgID09CiAgICBkdXAKICAgIGJ1cnkgNAogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX3RydWVANTIKICAgIGRpZyAxNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzUyCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzUwLTM1NAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfTUQpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDUyCiAgICBkaWcgMTQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM1MwogICAgLy8gVUludDY0KGVudW1zLkVWVF9NRCksCiAgICBwdXNoaW50IDE5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNTAtMzU0CiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9NRCksCiAgICAvLyApCiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VANTMKCmZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX3RydWVANTI6CiAgICBpbnRjXzEgLy8gMQoKZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfbWVyZ2VANTQ6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6OTIKICAgIC8vIGlmIG5vdCBzZWxmLl9ldmVudF9pc19jYXNoKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkpOgogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NDgKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF9pZCA9PSBzZWxmLmV2ZW50X2N1cnNvciwgZXJyLklOVkFMSURfRVZFTlRfQ1VSU09SCiAgICBkaWcgMTUKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgY3Vyc29yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NDkKICAgIC8vIGFzc2VydCBlbnRyeS5zY2hlZHVsZWRfdGltZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwgZXJyLk5PX0RVRV9DQVNIRkxPVwogICAgZGlnIDEKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIDw9CiAgICBhc3NlcnQgLy8gTm8gZHVlIGNhc2hmbG93IHRvIHBheQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDEzCiAgICAvLyBpZiBldmVudF90eXBlIG5vdCBpbiAoVUludDY0KGVudW1zLkVWVF9JUCksIFVJbnQ2NChlbnVtcy5FVlRfTUQpKToKICAgIGRpZyAyCiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTUKICAgIGRpZyAxNAogICAgcHVzaGludCAxOQogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDE0CiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAxMQoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X2ludGVyZXN0X2Ftb3VudEAxNjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQyNgogICAgLy8gZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGRpZyAxNQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSAxNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDI3CiAgICAvLyBpZiBldmVudF90eXBlIG5vdCBpbiAoVUludDY0KGVudW1zLkVWVF9QUiksIFVJbnQ2NChlbnVtcy5FVlRfTUQpKToKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxOQogICAgZGlnIDE0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MjgKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDYKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTUzCiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA9IGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBkaWcgMTUKICAgIHB1c2hpbnQgNDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBidXJ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1NgogICAgLy8gaWYgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCk6CiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUAyOQogICAgZGlnIDcKICAgIGJ1cnkgOQoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzItNTc0CiAgICAvLyAjIEZ1bmRpbmcgdXNlcyBwZXItdW5pdCBjdW11bGF0aXZlIGluZGljZXMgc28gZWFjaCBob2xkZXIgY2FuIHNldHRsZQogICAgLy8gIyBpbmRlcGVuZGVudGx5IGZyb20gaXRzIGN1cnJlbnQgdW5pdCBiYWxhbmNlLgogICAgLy8gaW50ZXJlc3RfaW5kZXhfZGVsdGEgPSBzZWxmLl9hbW91bnRfdG9faW5kZXhfZGVsdGEoaW50ZXJlc3RfYW1vdW50X2R1ZSkKICAgIGRpZyAxMAogICAgY2FsbHN1YiBfYW1vdW50X3RvX2luZGV4X2RlbHRhCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzUKICAgIC8vIHByaW5jaXBhbF9pbmRleF9kZWx0YSA9IHNlbGYuX2Ftb3VudF90b19pbmRleF9kZWx0YShwcmluY2lwYWxfYW1vdW50X2R1ZSkKICAgIGRpZyA2CiAgICBjYWxsc3ViIF9hbW91bnRfdG9faW5kZXhfZGVsdGEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU3NgogICAgLy8gaW50ZXJlc3RfYW1vdW50ID0gc2VsZi5faW5kZXhfZGVsdGFfdG9fYW1vdW50KGludGVyZXN0X2luZGV4X2RlbHRhKQogICAgZGlnIDEKICAgIGNhbGxzdWIgX2luZGV4X2RlbHRhX3RvX2Ftb3VudAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBidXJ5IDE1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzcKICAgIC8vIHByaW5jaXBhbF9hbW91bnQgPSBzZWxmLl9pbmRleF9kZWx0YV90b19hbW91bnQocHJpbmNpcGFsX2luZGV4X2RlbHRhKQogICAgZHVwCiAgICBjYWxsc3ViIF9pbmRleF9kZWx0YV90b19hbW91bnQKICAgIGR1cAogICAgYnVyeSAxMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTc4CiAgICAvLyByZXF1aXJlZF9hbW91bnQgPSBpbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50CiAgICBkaWcgMgogICAgZGlnIDEKICAgICsKICAgIGR1cAogICAgYnVyeSA5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MzQKICAgIC8vIGJhbGFuY2UgPSBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBvcHRlZCBpbnRvIGFzc2V0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NTYKICAgIC8vIHJldHVybiBzZWxmLnJlc2VydmVkX2ludGVyZXN0ICsgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICBkaWcgMQogICAgKwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzM2CiAgICAvLyBhc3NlcnQgYmFsYW5jZSA+PSByZXNlcnZlZF90b3RhbCwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGRpZyAyCiAgICBkaWcgMQogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzM3CiAgICAvLyByZXR1cm4gYmFsYW5jZSAtIHJlc2VydmVkX3RvdGFsCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIC0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4MAogICAgLy8gc2VsZi5fYXZhaWxhYmxlX3NldHRsZW1lbnRfZnVuZHMoKSA+PSByZXF1aXJlZF9hbW91bnQKICAgIHVuY292ZXIgMgogICAgPj0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU3OS01ODEKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5fYXZhaWxhYmxlX3NldHRsZW1lbnRfZnVuZHMoKSA+PSByZXF1aXJlZF9hbW91bnQKICAgIC8vICksIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcyBmb3IgdGhlIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4MwogICAgLy8gc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCArPSBpbnRlcmVzdF9hbW91bnQKICAgIHVuY292ZXIgMwogICAgKwogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4NAogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgKz0gcHJpbmNpcGFsX2Ftb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIGV4aXN0cwogICAgKwogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1ODUKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCArPSBpbnRlcmVzdF9pbmRleF9kZWx0YQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggZXhpc3RzCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4NgogICAgLy8gc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCArPSBwcmluY2lwYWxfaW5kZXhfZGVsdGEKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggZXhpc3RzCiAgICArCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTg3CiAgICAvLyBpZiBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpOgogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgcHVzaGludCAzCiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUA0MAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTg4LTU4OQogICAgLy8gIyBGb3IgUFIsIHRoZSBwZXJpb2QgaW50ZXJlc3Qgc3RheXMgYWNjcnVlZCB1bnRpbCBhIGxhdGVyIElQIG9yIE1ELgogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ICs9IHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZGlnIDE2CiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBidXJ5IDE4CiAgICArCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQxOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTkyCiAgICAvLyBpZiBub3Qgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCkgb3IgZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSA9PSBVSW50NjQoCiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDQzCiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTItNTk0CiAgICAvLyBpZiBub3Qgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCkgb3IgZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSA9PSBVSW50NjQoCiAgICAvLyAgICAgZW51bXMuRVZUX01ECiAgICAvLyApOgogICAgcHVzaGludCAxOQogICAgPT0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQ0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUA0MzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5NQogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gZW50cnkubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZGlnIDE1CiAgICBwdXNoaW50IDQxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTYKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGRpZyA4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTk3CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBuZXh0X2ludGVyZXN0X2Jhc2UKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBkaWcgOQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5OAogICAgLy8gc2VsZi5ldmVudF9jdXJzb3IgKz0gVUludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAwCiAgICAvLyBpZiBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoCiAgICBkaWcgMTUKICAgIGV4dHJhY3QgOCAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MDAtNjAyCiAgICAvLyBpZiBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoCiAgICAvLyAgICAgZW51bXMuRVZUX01ECiAgICAvLyApIGFuZCBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9PSBVSW50NjQoMCk6CiAgICBwdXNoYnl0ZXMgMHgxMwogICAgYj09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0NwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAyCiAgICAvLyApIGFuZCBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9PSBVSW50NjQoMCk6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwMC02MDIKICAgIC8vIGlmIGVudHJ5LmV2ZW50X3R5cGUgPT0gYXJjNC5VSW50OCgKICAgIC8vICAgICBlbnVtcy5FVlRfTUQKICAgIC8vICkgYW5kIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID09IFVJbnQ2NCgwKToKICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0NwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAzCiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbnVtcy5TVEFUVVNfRU5ERUQpCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBwdXNoaW50IDIwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwNAogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gVUludDY0KDApCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0NzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwNi02MTAKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1pbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50LAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PWludGVyZXN0X2Ftb3VudCArIHByaW5jaXBhbF9hbW91bnQsCiAgICAvLyApCiAgICBkaWcgMTUKICAgIGRpZyA0CiAgICBkdXAKICAgIGNhbGxzdWIgX2VtaXRfZXhlY3V0aW9uX2V2ZW50CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5NgogICAgLy8gZnVuZGVkX2ludGVyZXN0ICs9IGludGVyZXN0X2Ftb3VudAogICAgZGlnIDEzCiAgICBkaWcgMTIKICAgICsKICAgIGJ1cnkgMTQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5NwogICAgLy8gZnVuZGVkX3ByaW5jaXBhbCArPSBwcmluY2lwYWxfYW1vdW50CiAgICBkaWcgMTIKICAgIGRpZyA3CiAgICArCiAgICBidXJ5IDEzCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6OTgKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgKz0gVUludDY0KDEpCiAgICBkaWcgNAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgNQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3Nfd2hpbGVfdG9wQDQKCmZ1bmRfZHVlX2Nhc2hmbG93c19lbHNlX2JvZHlANDA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTEKICAgIC8vIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0MQoKZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlAMjk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTcKICAgIC8vIGV2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ1cnkgMTYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1OC01NjAKICAgIC8vICMgRHluYW1pYyBhbm51aXRpZXMgZGVyaXZlIG5leHQgc3RhdGUgZnJvbSB0aGUgcGF5bWVudCBkZWNvbXBvc2l0aW9uLAogICAgLy8gIyBub3Qgb25seSBmcm9tIHRoZSBwcmVjb21wdXRlZCBgbmV4dF8qYCBmaWVsZHMuCiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpOgogICAgcHVzaGludCAzCiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUAzMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTYyCiAgICAvLyBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCAtIHByaW5jaXBhbF9hbW91bnRfZHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGRpZyA2CiAgICAtCiAgICBkdXAKICAgIGJ1cnkgOQogICAgYnVyeSA5CiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDMxOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY1CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9JUCk6CiAgICBkaWcgMTQKICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUAzMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY2CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGJ1cnkgOQogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY3CiAgICAvLyBuZXh0X2ludGVyZXN0X2Jhc2UgPSBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGJ1cnkgMTAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgZXhpc3RzCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDMzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY4CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCk6CiAgICBkaWcgMTQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlAMzQKICAgIGRpZyA3CiAgICBidXJ5IDkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzgKCmZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDM0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY5CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTcwCiAgICAvLyBuZXh0X2ludGVyZXN0X2Jhc2UgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzgKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDI5CiAgICAvLyBpZiBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKToKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzMAogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKToKICAgIGRpZyAxNAogICAgcHVzaGludCAxOQogICAgPT0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDIyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzEKICAgIC8vIHJldHVybiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzIKICAgIC8vIGludGVyZXN0X2R1ZSA9IHNlbGYuYWNjcnVlZF9pbnRlcmVzdCArIHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZGlnIDE2CiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBidXJ5IDE4CiAgICArCiAgICBkdXAKICAgIGJ1cnkgMTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzMwogICAgLy8gaWYgc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIDw9IGludGVyZXN0X2R1ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIGV4aXN0cwogICAgPj0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDI0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzQKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzUKICAgIC8vIHByaW5jaXBhbF9hbW91bnQgPSBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gLSBpbnRlcmVzdF9kdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIGV4aXN0cwogICAgZGlnIDEwCiAgICAtCiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDM2CiAgICAvLyBpZiBwcmluY2lwYWxfYW1vdW50ID4gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWw6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgID4KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDI2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzcKICAgIC8vIHJldHVybiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjY6CiAgICBkaWcgNgogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTIKICAgIC8vIHByaW5jaXBhbF9hbW91bnRfZHVlID0gc2VsZi5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudChlbnRyeSkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnRAMjgKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDI3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDQwCiAgICAvLyBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA8PSBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZGlnIDE1CiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBkdXAyCiAgICA8PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDM5LTQ0MQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA8PSBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NDIKICAgIC8vIHJldHVybiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCAtIGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBzd2FwCiAgICAtCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MTUKICAgIC8vIHJldHVybiBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgKyBzZWxmLl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KGVudHJ5KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgIGRpZyAxNgogICAgY2FsbHN1YiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudAogICAgYnVyeSAxOAogICAgKwogICAgYnVyeSAxMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTUxCiAgICAvLyBpbnRlcmVzdF9hbW91bnRfZHVlID0gc2VsZi5fZW50cnlfaW50ZXJlc3RfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfaW50ZXJlc3RfYW1vdW50QDE2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAMTE6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTAwCiAgICAvLyBhc3NlcnQgcHJvY2Vzc2VkX2V2ZW50cyA+IFVJbnQ2NCgwKSwgZXJyLk5PX0RVRV9DQVNIRkxPVwogICAgZGlnIDQKICAgIGR1cAogICAgYXNzZXJ0IC8vIE5vIGR1ZSBjYXNoZmxvdyB0byBwYXkKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMDQKICAgIC8vIHRvdGFsX2Z1bmRlZD1mdW5kZWRfaW50ZXJlc3QgKyBmdW5kZWRfcHJpbmNpcGFsLAogICAgZGlnIDE0CiAgICBkdXAKICAgIGRpZyAxNQogICAgZHVwCiAgICBjb3ZlciAzCiAgICArCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA2CiAgICAvLyB0aW1lc3RhbXA9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTAxLTEwNwogICAgLy8gcmV0dXJuIHR5cC5DYXNoRnVuZGluZ1Jlc3VsdCgKICAgIC8vICAgICBmdW5kZWRfaW50ZXJlc3Q9ZnVuZGVkX2ludGVyZXN0LAogICAgLy8gICAgIGZ1bmRlZF9wcmluY2lwYWw9ZnVuZGVkX3ByaW5jaXBhbCwKICAgIC8vICAgICB0b3RhbF9mdW5kZWQ9ZnVuZGVkX2ludGVyZXN0ICsgZnVuZGVkX3ByaW5jaXBhbCwKICAgIC8vICAgICBwcm9jZXNzZWRfZXZlbnRzPXByb2Nlc3NlZF9ldmVudHMsCiAgICAvLyAgICAgdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUA1MzoKICAgIGludGNfMCAvLyAwCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDU0CgoKLy8gbW9kdWxlcy5wYXltZW50X2FnZW50LlBheW1lbnRBZ2VudC5jbGFpbV9kdWVfY2FzaGZsb3dzW3JvdXRpbmddKCkgLT4gdm9pZDoKY2xhaW1fZHVlX2Nhc2hmbG93czoKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cG4gMgogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNQogICAgLy8gaWYgc2VsZi5vcF9kYWVtb24udmFsdWUgIT0gR2xvYmFsLnplcm9fYWRkcmVzczoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNiAvLyAweDUyM2E0ZjUwNDQyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wX2RhZW1vbiBleGlzdHMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE3CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjYgLy8gMHg1MjNhNGY1MDQ0MjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcF9kYWVtb24gZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE3LTE5CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIGJueiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfdHJ1ZUAxNAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE4CiAgICAvLyBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgdHhuIFNlbmRlcgogICAgZGlnIDMKICAgID09CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTctMTkKICAgIC8vIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICAvLyBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgYm56IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDE0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTkKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCAzMgogICAgPT0KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNy0xOQogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICBieiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VAMTUKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDE0OgogICAgaW50Y18xIC8vIDEKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUAxNjoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNi0yMAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyAgICAgb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vICAgICBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgLy8gKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCgpjbGFpbV9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTc6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTM5CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE0MAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDcKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTQzCiAgICAvLyBzZWxmLl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKGhvbGRpbmdfYWRkcmVzcykKICAgIGRpZyAyCiAgICBkdXAKICAgIGNhbGxzdWIgX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNDQKICAgIC8vIHNlbGYuX3NldHRsZV9wb3NpdGlvbihob2xkaW5nX2FkZHJlc3MpCiAgICBjYWxsc3ViIF9zZXR0bGVfcG9zaXRpb24KICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExNwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY2xhaW1hYmxlX2ludGVyZXN0CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBkdXAKICAgIHB1c2hpbnQgNzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExOAogICAgLy8gKyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jbGFpbWFibGVfcHJpbmNpcGFsCiAgICBkdXAKICAgIHB1c2hpbnQgODEKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExNy0xMTgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNsYWltYWJsZV9pbnRlcmVzdAogICAgLy8gKyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jbGFpbWFibGVfcHJpbmNpcGFsCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTQ2CiAgICAvLyBhc3NlcnQgdG90YWxfYW1vdW50ID4gVUludDY0KDApLCBlcnIuTk9fRFVFX0NBU0hGTE9XCiAgICBhc3NlcnQgLy8gTm8gZHVlIGNhc2hmbG93IHRvIHBheQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI1CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MuaXNfb3B0ZWRfaW4oCiAgICBleHRyYWN0IDAgMzIKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNgogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNS0yNwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLmlzX29wdGVkX2luKAogICAgLy8gICAgIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZAogICAgLy8gKQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNS0yOAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLmlzX29wdGVkX2luKAogICAgLy8gICAgIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZAogICAgLy8gKQogICAgLy8gYW5kIG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQKICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAyNAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI4CiAgICAvLyBhbmQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCAzODQKICAgIGdldGJpdAogICAgYm56IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAyNAogICAgaW50Y18xIC8vIDEKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUAyNToKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNTEKICAgIC8vIGlmIHNlbGYuX2lzX3BheW1lbnRfZXhlY3V0YWJsZShob2xkaW5nX2FkZHJlc3MpOgogICAgYnogY2xhaW1fZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozNAogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIHN3YXAKICAgIGRpZyAxCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozNC0zNQogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIC8vID49IHBheW1lbnRfYW1vdW50CiAgICBkaWcgNQogICAgZHVwCiAgICBjb3ZlciAyCiAgICA+PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjMzLTM2CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICAvLyAgICAgPj0gcGF5bWVudF9hbW91bnQKICAgIC8vICksIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcyBmb3IgdGhlIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNTMKICAgIC8vIHNlbGYuX3BheShzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MsIHRvdGFsX2Ftb3VudCkKICAgIGRpZyAyCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBkdXAKICAgIGV4dHJhY3QgMCAzMgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQwLTQ1CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9cmVjZWl2ZXIsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWFtb3VudCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQ0CiAgICAvLyBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgdW5jb3ZlciAzCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIHVuY292ZXIgMgogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0MAogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgcHVzaGludCA0IC8vIGF4ZmVyCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQwLTQ1CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9cmVjZWl2ZXIsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWFtb3VudCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMjUtMTI2CiAgICAvLyAjIEdldCB0aGUgY2xhaW1hYmxlIGFtb3VudHMgYmVmb3JlIHJlc2V0CiAgICAvLyBpbnRlcmVzdF9hbW91bnQgPSBwb3NpdGlvbi5jbGFpbWFibGVfaW50ZXJlc3QKICAgIGR1cAogICAgcHVzaGludCA3MwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSA5CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTI3CiAgICAvLyBwcmluY2lwYWxfYW1vdW50ID0gcG9zaXRpb24uY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgZHVwCiAgICBwdXNoaW50IDgxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAzCiAgICBidXJ5IDkKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMjktMTMwCiAgICAvLyAjIFJlc2V0IHRoZSBwb3NpdGlvbidzIGNsYWltYWJsZSBhbW91bnRzCiAgICAvLyBwb3NpdGlvbi5jbGFpbWFibGVfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBpdG9iCiAgICBzd2FwCiAgICBkaWcgMQogICAgcmVwbGFjZTIgNzMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzEKICAgIC8vIHBvc2l0aW9uLmNsYWltYWJsZV9wcmluY2lwYWwgPSBVSW50NjQoMCkKICAgIHN3YXAKICAgIHJlcGxhY2UyIDgxCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTMyCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHBvc2l0aW9uLmNvcHkoKQogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTM0CiAgICAvLyBhc3NlcnQgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCA+PSBpbnRlcmVzdF9hbW91bnQsIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX2ludGVyZXN0IGV4aXN0cwogICAgZHVwCiAgICBkaWcgMgogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzNQogICAgLy8gYXNzZXJ0IHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsID49IHByaW5jaXBhbF9hbW91bnQsIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICBkaWcgMwogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzNy0xMzgKICAgIC8vICMgVXBkYXRlIHRoZSBnbG9iYWwgcmVzZXJ2ZWQgaW50ZXJlc3QgYW5kIHByaW5jaXBhbCBhbW91bnRzCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0IC09IGludGVyZXN0X2Ftb3VudAogICAgc3dhcAogICAgLQogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzkKICAgIC8vIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIC09IHByaW5jaXBhbF9hbW91bnQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIHN3YXAKICAgIC0KICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKY2xhaW1fZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTU5CiAgICAvLyB0b3RhbF9hbW91bnQ9aW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudCwKICAgIGRpZyA1CiAgICBkdXAKICAgIGRpZyA2CiAgICBkdXAKICAgIGNvdmVyIDMKICAgICsKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNjAKICAgIC8vIHRpbWVzdGFtcD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNTYtMTYyCiAgICAvLyByZXR1cm4gdHlwLkNhc2hDbGFpbVJlc3VsdCgKICAgIC8vICAgICBpbnRlcmVzdF9hbW91bnQ9aW50ZXJlc3RfYW1vdW50LAogICAgLy8gICAgIHByaW5jaXBhbF9hbW91bnQ9cHJpbmNpcGFsX2Ftb3VudCwKICAgIC8vICAgICB0b3RhbF9hbW91bnQ9aW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudCwKICAgIC8vICAgICB0aW1lc3RhbXA9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgY29udGV4dD1wYXltZW50X2luZm8sCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgMgogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIHB1c2hieXRlcyAweDAwMjIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAyNDoKICAgIGludGNfMCAvLyAwCiAgICBiIGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUAyNQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX2ZhbHNlQDE1OgogICAgaW50Y18wIC8vIDAKICAgIGIgY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDE2CgoKLy8gbW9kdWxlcy50cmFuc2Zlcl9hZ2VudC5UcmFuc2ZlckFnZW50LnRyYW5zZmVyX3NldF9zY2hlZHVsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRyYW5zZmVyX3NldF9zY2hlZHVsZToKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo0MAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQxCiAgICAvLyBhc3NlcnQgb3Blbl9kYXRlIDwgY2xvc3VyZV9kYXRlLCBlcnIuSU5WQUxJRF9TT1JUSU5HCiAgICBkdXAyCiAgICA8CiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbXVzdCBiZSBzb3J0ZWQgaW4gc3RyaWN0bHkgYXNjZW5kaW5nIG9yZGVyCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQzCiAgICAvLyBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA9IG9wZW5fZGF0ZQogICAgYnl0ZWMgMjggLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIHVuY292ZXIgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDQKICAgIC8vIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlID0gY2xvc3VyZV9kYXRlCiAgICBieXRlYyAyOSAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDUKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy50cmFuc2Zlcl9hZ2VudC5UcmFuc2ZlckFnZW50LnByaW1hcnlfZGlzdHJpYnV0aW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcHJpbWFyeV9kaXN0cmlidXRpb246CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjcxCiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5wcmltYXJ5X2RlYWxlciwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDIyIC8vIDB4NTIzYTUwNTk0NDIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojc2CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo3NwogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojc4CiAgICAvLyBhc3NlcnQgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TRUQKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBjbG9zZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgY292ZXIgMwogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4MAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChob2xkaW5nX2FkZHJlc3MpCiAgICBzd2FwCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjgxCiAgICAvLyBhc3NlcnQgdW5pdHMgPiBVSW50NjQoMCksIGVyci5aRVJPX1VOSVRTCiAgICBkdXAKICAgIGFzc2VydCAvLyBDYW4gbm90IGRpc3RyaWJ1dGUgemVybyB1bml0cwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4MwogICAgLy8gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCArIHVuaXRzIDw9IHNlbGYudG90YWxfdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICArCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgPD0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODItODQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCArIHVuaXRzIDw9IHNlbGYudG90YWxfdW5pdHMKICAgIC8vICksIGVyci5PVkVSX0RJU1RSSUJVVElPTgogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCByZW1haW5pbmcgRC1BU0EgdW5pdHMKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODUKICAgIC8vIGlmIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI3IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlIGV4aXN0cwogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojg3CiAgICAvLyBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8PSBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI3IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlIGV4aXN0cwogICAgPD0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODYtODgKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPD0gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGUKICAgIC8vICksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TRUQKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBjbG9zZWQKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNDgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnJlc2VydmVkX3VuaXRzICs9IHVuaXRzCiAgICBkdXBuIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDMKICAgIGR1cAogICAgY292ZXIgMwogICAgKwogICAgaXRvYgogICAgcHVzaGludCA0MAogICAgc3dhcAogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6OTEKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgKz0gdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICArCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6OTIKICAgIC8vIHJldHVybiBzZWxmLnRvdGFsX3VuaXRzIC0gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIHN3YXAKICAgIC0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMudHJhbnNmZXJfYWdlbnQuVHJhbnNmZXJBZ2VudC50cmFuc2Zlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnRyYW5zZmVyOgogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTMwCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxMzEKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQ3CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuX3N0YXR1c19pc19wZW5kaW5nX2llZCgpLCBlcnIuUEVORElOR19JRUQKICAgICEKICAgIGFzc2VydCAvLyBJRUQgbm90IHlldCBleGVjdXRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxMwogICAgLy8gaWYgc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjggLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICBieiB0cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTUKICAgIC8vIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjggLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNC0xNgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gKSwgZXJyLkNMT1NFRF9UUkFOU0ZFUgogICAgYXNzZXJ0IC8vIFRyYW5zZmVyIGlzIGNsb3NlZAoKdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNwogICAgLy8gaWYgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjkgLy8gInRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICBieiB0cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTkKICAgIC8vIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDwgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGUKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyOSAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIDwKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTgtMjAKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZQogICAgLy8gKSwgZXJyLkNMT1NFRF9UUkFOU0ZFUgogICAgYXNzZXJ0IC8vIFRyYW5zZmVyIGlzIGNsb3NlZAoKdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxMzUKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIGRpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA4CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIGJ5dGVjIDggLy8gMHg0MTIzCiAgICBkaWcgNQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA5CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjEzOAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChzZW5kZXJfaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDIKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTM5CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGR1cAogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNDAKICAgIC8vIGFzc2VydCBzZW5kZXJfaG9sZGluZ19hZGRyZXNzICE9IHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcywgZXJyLlNFTEZfVFJBTlNGRVIKICAgIHVuY292ZXIgMgogICAgIT0KICAgIGFzc2VydCAvLyBTZW5kZXIgYW5kIHJlY2VpdmVyIG11c3QgYmUgZGlmZmVyZW50CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE0MQogICAgLy8gYXNzZXJ0IHVuaXRzID4gVUludDY0KDApLCBlcnIuTlVMTF9UUkFOU0ZFUgogICAgZGlnIDEKICAgIGR1cAogICAgYXNzZXJ0IC8vIFRyYW5zZmVyIHVuaXRzIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTQyCiAgICAvLyBhc3NlcnQgdW5pdHMgPD0gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLCBlcnIuT1ZFUl9UUkFOU0ZFUgogICAgc3dhcAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIDw9CiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IHNlbmRlciB1bml0cyB0byB0cmFuc2ZlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzYzCiAgICAvLyBpZiBzZWxmLmV2ZW50X2N1cnNvciA+PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICA+PQogICAgYm56IHRyYW5zZmVyX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Fzc2VydF9ub19kdWVfZXZlbnRfcGVuZGluZ0AxMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzY1CiAgICAvLyBuZXh0X2VudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KHNlbGYuZXZlbnRfY3Vyc29yKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc2NwogICAgLy8gbmV4dF9lbnRyeS5zY2hlZHVsZWRfdGltZSA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NjYtNzY4CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIG5leHRfZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gKSwgZXJyLlBFTkRJTkdfQUNUVVNfRVZFTlQKICAgIGFzc2VydCAvLyBBQ1RVUyBldmVudCBub3QgeWV0IGV4ZWN1dGVkCgp0cmFuc2Zlcl9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9hc3NlcnRfbm9fZHVlX2V2ZW50X3BlbmRpbmdAMTA6CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE0NQogICAgLy8gc2VsZi5fZW5zdXJlX3VuaXRzX2FjdGl2YXRlZChzZW5kZXJfaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDMKICAgIGR1cAogICAgY2FsbHN1YiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNDYKICAgIC8vIHNlbGYuX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQocmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgY2FsbHN1YiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNDcKICAgIC8vIHNlbGYuX3NldHRsZV9wb3NpdGlvbihzZW5kZXJfaG9sZGluZ19hZGRyZXNzKQogICAgY2FsbHN1YiBfc2V0dGxlX3Bvc2l0aW9uCiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTQ4CiAgICAvLyBzZWxmLl9zZXR0bGVfcG9zaXRpb24ocmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzKQogICAgY2FsbHN1YiBfc2V0dGxlX3Bvc2l0aW9uCiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNTIKICAgIC8vIGFzc2VydCB1bml0cyA8PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cywgZXJyLk9WRVJfVFJBTlNGRVIKICAgIGRpZyA1CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkaWcgMQogICAgPD0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgc2VuZGVyIHVuaXRzIHRvIHRyYW5zZmVyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTUzCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyAtPSB1bml0cwogICAgZGlnIDEKICAgIC0KICAgIGl0b2IKICAgIHVuY292ZXIgMgogICAgaW50Y18zIC8vIDMyCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTQ0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyArPSB1bml0cwogICAgZGlnIDUKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIHVuY292ZXIgMgogICAgKwogICAgaXRvYgogICAgaW50Y18zIC8vIDMyCiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfc3VzcGVuc2lvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfc3VzcGVuc2lvbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojc3CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyMSAvLyAweDUyM2E0MTU1NTQyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE4NQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkID0gc3VzcGVuZGVkCiAgICBkdXAKICAgIHB1c2hpbnQgNDgKICAgIGludGNfMSAvLyAxCiAgICBib3hfZXh0cmFjdAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMwogICAgc2V0Yml0CiAgICBwdXNoaW50IDQ4CiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE4NgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTY1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5hY2NvdW50X29wZW5bcm91dGluZ10oKSAtPiB2b2lkOgphY2NvdW50X29wZW46CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjgKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmFjY291bnRfbWFuYWdlciwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDIzIC8vIDB4NTIzYTRkNGU0NzIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzkKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0VOREVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDIwMAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTAKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX2VuZGVkKCksIGVyci5VTkFVVEhPUklaRUQKICAgICEKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxMQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTIKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjEzCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozNAogICAgLy8gdW5pdHM9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozMi00MgogICAgLy8gcmV0dXJuIHR5cC5BY2NvdW50UG9zaXRpb24oCiAgICAvLyAgICAgcGF5bWVudF9hZGRyZXNzPXBheW1lbnRfYWRkcmVzcywKICAgIC8vICAgICB1bml0cz1VSW50NjQoMCksCiAgICAvLyAgICAgcmVzZXJ2ZWRfdW5pdHM9VUludDY0KDApLAogICAgLy8gICAgIHN1c3BlbmRlZD1GYWxzZSwKICAgIC8vICAgICBzZXR0bGVkX2N1cnNvcj1VSW50NjQoMCksCiAgICAvLyAgICAgaW50ZXJlc3RfY2hlY2twb2ludD1VSW50NjQoMCksCiAgICAvLyAgICAgcHJpbmNpcGFsX2NoZWNrcG9pbnQ9VUludDY0KDApLAogICAgLy8gICAgIGNsYWltYWJsZV9pbnRlcmVzdD1VSW50NjQoMCksCiAgICAvLyAgICAgY2xhaW1hYmxlX3ByaW5jaXBhbD1VSW50NjQoMCksCiAgICAvLyApCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGJ5dGVjIDQwIC8vIDB4MDAKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjE0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHNlbGYuX25ld19hY2NvdW50X3Bvc2l0aW9uKHBheW1lbnRfYWRkcmVzcykKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTUKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjM4CiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIHVuY292ZXIgMwogICAgPT0KICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIzOQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDAKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQxCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MgPSBwYXltZW50X2FkZHJlc3MKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQyCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfZ2V0X3Bvc2l0aW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF9nZXRfcG9zaXRpb246CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNTkKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9jcmVhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9jcmVhdGU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDE5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAzMwogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IGFycmFuZ2VyCiAgICBieXRlYyAxOCAvLyAweDUyM2E0MTUyNTIyMwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMzQKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAxOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfY29uZmlnW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfY29uZmlnOgogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBsZW4KICAgIHB1c2hpbnQgMTA3CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLk5vcm1hbGl6ZWRBY3R1c1Rlcm1zCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgcHVzaGludCA3MgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5Jbml0aWFsS2VybmVsU3RhdGUKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBsZW4KICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIHR1cGxlIGVuY29kaW5nCiAgICBkdXAKICAgIHB1c2hpbnQgMzQKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCB0YWlsIHBvaW50ZXIgYXQgaW5kZXggMSBvZiAodWludDhbMzJdLChsZW4rdXRmOFtdKSkKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgY292ZXIgMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMzYKICAgICsKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuUHJvc3BlY3R1cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2NgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDY4LTEwNjkKICAgIC8vICMgQ29uZmlndXJlIENvbnRyYWN0CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPSB0ZXJtcy5jb250cmFjdF90eXBlLmFzX3VpbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgYnogY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUA3CiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIyMAogICAgLy8gVUludDY0KGVudW1zLkNUX0FOTiksCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIxCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfTkFNKSwKICAgIHB1c2hpbnQgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIyCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfTEFNKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIzCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfTEFYKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjI0CiAgICAvLyBVSW50NjQoZW51bXMuQ1RfQ0xNKSwKICAgIHB1c2hpbnQgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJ6IGNvbnRyYWN0X2NvbmZpZ19ib29sX2ZhbHNlQDgKCmNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANzoKICAgIGludGNfMSAvLyAxCgpjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUA5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjI5CiAgICAvLyBhc3NlcnQgc2VsZi5faXNfc3VwcG9ydGVkX2NvbnRyYWN0X3R5cGUoY29udHJhY3RfdHlwZSksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3MQogICAgLy8gc2VsZi5fc3RvcmVfY29udHJhY3RfY29uZmlnKHNlbGYuY29udHJhY3RfdHlwZSwgdGVybXMsIGluaXRpYWxfc3RhdGUpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgYnVyeSAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzI1CiAgICAvLyBhc3NlcnQgdGVybXMuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZGlnIDQKICAgIGR1cAogICAgcHVzaGludCAzMwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSA4CiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMjcKICAgIC8vIHRlcm1zLmRheV9jb3VudF9jb252ZW50aW9uLmFzX3VpbnQ2NCgpCiAgICBwdXNoaW50IDU3CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICBieiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDE2CiAgICBkaWcgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk5CiAgICAvLyBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI5Ny0zMDMKICAgIC8vIHJldHVybiBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzYwKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwSVNEQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjApLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDE2CiAgICBkaWcgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzAwCiAgICAvLyBVSW50NjQoZW51bXMuRENDX0EzNjUpLAogICAgcHVzaGludCAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyOTctMzAzCiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgID09CiAgICBibnogY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUAxNgogICAgZGlnIDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMwMQogICAgLy8gVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGRpZyA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDIKICAgIC8vIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICA9PQogICAgYnogY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAMTcKCmNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTY6CiAgICBpbnRjXzEgLy8gMQoKY29udHJhY3RfY29uZmlnX2Jvb2xfbWVyZ2VAMTg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDktMzExCiAgICAvLyBhc3NlcnQgc2VsZi5faXNfc3VwcG9ydGVkX2RheV9jb3VudF9jb252ZW50aW9uKAogICAgLy8gICAgIGRheV9jb3VudF9jb252ZW50aW9uCiAgICAvLyApLCBlcnIuSU5WQUxJRF9EQVlfQ09VTlRfQ09OVkVOVElPTgogICAgYXNzZXJ0IC8vIEludmFsaWQgZGF5LWNvdW50IGNvbnZlbnRpb24gSUQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMyOQogICAgLy8gaWYgY29udHJhY3RfdHlwZSAhPSBVSW50NjQoZW51bXMuQ1RfQU5OKToKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgICE9CiAgICBieiBjb250cmFjdF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzMwCiAgICAvLyBhc3NlcnQgbm90IHRlcm1zLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24sIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZGlnIDQKICAgIHB1c2hpbnQgNzg2CiAgICBnZXRiaXQKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KCmNvbnRyYWN0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDIwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODA3CiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIEQtQVNBIGFscmVhZHkgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODA4CiAgICAvLyBhc3NlcnQgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCA9PSBVSW50NjQoMCksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMCAvLyAiaW5pdGlhbF9leGNoYW5nZV9hbW91bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTAtODExCiAgICAvLyAjIFNldCBEZW5vbWluYXRpb24gQXNzZXQKICAgIC8vIHNlbGYuX2Fzc2VydF9kZW5vbWluYXRpb25fYXNzZXQodGVybXMuZGVub21pbmF0aW9uX2Fzc2V0X2lkKQogICAgZGlnIDQKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NzUtNzc2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIGRlbm9taW5hdGlvbiB3aXRoIEFTQQogICAgLy8gX2NyZWF0b3IsIGV4aXN0cyA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X2NyZWF0b3IoZGVub21pbmF0aW9uX2Fzc2V0X2lkKQogICAgZHVwCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q3JlYXRvcgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NzcKICAgIC8vIGFzc2VydCBleGlzdHMsIGVyci5JTlZBTElEX0RFTk9NSU5BVElPTgogICAgYXNzZXJ0IC8vIERlbm9taW5hdGlvbiBhc3NldCBpcyBub3QgcHJvcGVybHkgc2V0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODAKICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICBieXRlYyA0NCAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTQtODE1CiAgICAvLyAjIFNldCBTZXR0bGVtZW50IEFzc2V0CiAgICAvLyBzZWxmLl9hc3NlcnRfc2V0dGxlbWVudF9hc3NldCh0ZXJtcy5zZXR0bGVtZW50X2Fzc2V0X2lkKQogICAgZGlnIDEKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc4NQogICAgLy8gc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODMtNzg2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc2V0dGxlbWVudCBhc3NldCBpcyB0aGUgZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQgPT0gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIC8vICksIGVyci5JTlZBTElEX1NFVFRMRU1FTlRfQVNTRVQKICAgIGFzc2VydCAvLyBEaWZmZXJlbnQgc2V0dGxlbWVudCBhc3NldCBub3Qgc3VwcG9ydGVkLCBtdXN0IGJlIGVxdWFsIHRvIGRlbm9taW5hdGlvbiBhc3NldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Nzg5CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBzZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkwLTc5NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhc3NldF9hbW91bnQ9MCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Nzk1CiAgICAvLyBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkzCiAgICAvLyBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc5NAogICAgLy8gYXNzZXRfYW1vdW50PTAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkwLTc5MQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3OTAtNzk2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODE4LTgxOQogICAgLy8gIyBVbml0cwogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IHRlcm1zLnRvdGFsX3VuaXRzCiAgICBkdXAKICAgIHB1c2hpbnQgMTcKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODIwCiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID0gVUludDY0KDApCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgyMi04MjMKICAgIC8vICMgRGF5LUNvdW50IENvbnZlbnRpb25zCiAgICAvLyBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uID0gdGVybXMuZGF5X2NvdW50X2NvbnZlbnRpb24uYXNfdWludDY0KCkKICAgIGJ5dGVjIDQ2IC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGRpZyA4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODI1LTgyNgogICAgLy8gIyBUaW1lCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA9IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZQogICAgZHVwCiAgICBwdXNoaW50IDQxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMjcgLy8gImluaXRpYWxfZXhjaGFuZ2VfZGF0ZSIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODI3CiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSB0ZXJtcy5tYXR1cml0eV9kYXRlCiAgICBkaWcgMQogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDQ1IC8vICJtYXR1cml0eV9kYXRlIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MjgKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IGluaXRpYWxfc3RhdGUubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZGlnIDYKICAgIGR1cAogICAgY292ZXIgMgogICAgcHVzaGludCA0OAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzMC04MzEKICAgIC8vICMgUHJpbmNpcGFsCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID0gdGVybXMuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGRpZyAxMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzMgogICAgLy8gc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gdGVybXMuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZGlnIDMKICAgIHB1c2hpbnQgNzg2CiAgICBnZXRiaXQKICAgIGJ5dGVjIDM0IC8vICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzMwogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBpbml0aWFsX3N0YXRlLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZGlnIDEKICAgIHB1c2hpbnQgMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODM1LTgzNgogICAgLy8gIyBJbnRlcmVzdAogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ID0gaW5pdGlhbF9zdGF0ZS5hY2NydWVkX2ludGVyZXN0CiAgICBkaWcgMQogICAgcHVzaGludCA0MAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODM4LTgzOQogICAgLy8gIyBJbnRlcmVzdCBSYXRlCiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IGluaXRpYWxfc3RhdGUubm9taW5hbF9pbnRlcmVzdF9yYXRlCiAgICBkaWcgMQogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0MAogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gaW5pdGlhbF9zdGF0ZS5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlCiAgICBkaWcgMQogICAgcHVzaGludCAyNAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQxCiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkID0gdGVybXMucmF0ZV9yZXNldF9zcHJlYWQKICAgIGRpZyAzCiAgICBwdXNoaW50IDU4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzUgLy8gInJhdGVfcmVzZXRfc3ByZWFkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0MgogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIgPSB0ZXJtcy5yYXRlX3Jlc2V0X211bHRpcGxpZXIKICAgIGRpZyAzCiAgICBwdXNoaW50IDY2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzYgLy8gInJhdGVfcmVzZXRfbXVsdGlwbGllciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDMKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9mbG9vciA9IHRlcm1zLnJhdGVfcmVzZXRfZmxvb3IKICAgIGRpZyAzCiAgICBwdXNoaW50IDc0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzAgLy8gInJhdGVfcmVzZXRfZmxvb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQ0CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfY2FwID0gdGVybXMucmF0ZV9yZXNldF9jYXAKICAgIGRpZyAzCiAgICBwdXNoaW50IDgyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzEgLy8gInJhdGVfcmVzZXRfY2FwIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0NQogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X25leHQgPSB0ZXJtcy5yYXRlX3Jlc2V0X25leHQKICAgIGRpZyAzCiAgICBwdXNoaW50IDkwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzcgLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDYKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgPSB0ZXJtcy5oYXNfcmF0ZV9yZXNldF9mbG9vcgogICAgZGlnIDMKICAgIHB1c2hpbnQgNzg0CiAgICBnZXRiaXQKICAgIGJ5dGVjIDM4IC8vICJoYXNfcmF0ZV9yZXNldF9mbG9vciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDcKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwID0gdGVybXMuaGFzX3JhdGVfcmVzZXRfY2FwCiAgICBkaWcgMwogICAgcHVzaGludCA3ODUKICAgIGdldGJpdAogICAgYnl0ZWMgMzkgLy8gImhhc19yYXRlX3Jlc2V0X2NhcCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDktODUwCiAgICAvLyAjIFNjYWxpbmcKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgPSB0ZXJtcy5maXhlZF9wb2ludF9zY2FsZQogICAgdW5jb3ZlciAzCiAgICBwdXNoaW50IDk5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODUyLTg1MwogICAgLy8gIyBTY2hlZHVsZSBQcm9jZXNzaW5nCiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciA9IGluaXRpYWxfc3RhdGUuZXZlbnRfY3Vyc29yCiAgICBkaWcgMQogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU1LTg1NgogICAgLy8gIyBQZXItVW5pdCBGaXhlZC1Qb2ludCBJbmRleGVzCiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggPSBpbml0aWFsX3N0YXRlLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgKICAgIGRpZyAxCiAgICBwdXNoaW50IDU2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU3CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4ID0gaW5pdGlhbF9zdGF0ZS5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleAogICAgZGlnIDEKICAgIHB1c2hpbnQgNjQKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU5LTg2MAogICAgLy8gIyBSZXNlcnZlZCBBbW91bnQgKGZvciBleGVjdXRlZCBjYXNoZmxvd3MpCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0ID0gVUludDY0KDApCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2MQogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2MwogICAgLy8gYXNzZXJ0IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLCBlcnIuSU5WQUxJRF9JRUQKICAgIGRpZyAyCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICBhc3NlcnQgLy8gSUVEIG11c3QgYmUgc2V0IGluIHRoZSBmdXR1cmUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2NAogICAgLy8gYXNzZXJ0IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA+IGluaXRpYWxfc3RhdGUuc3RhdHVzX2RhdGUsIGVyci5JTlZBTElEX0lFRAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgPAogICAgYXNzZXJ0IC8vIElFRCBtdXN0IGJlIHNldCBpbiB0aGUgZnV0dXJlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NjUKICAgIC8vIGFzc2VydCB0ZXJtcy5pbml0aWFsX2V4Y2hhbmdlX2RhdGUgPCB0ZXJtcy5tYXR1cml0eV9kYXRlLCBlcnIuSU5WQUxJRF9JRUQKICAgIDwKICAgIGFzc2VydCAvLyBJRUQgbXVzdCBiZSBzZXQgaW4gdGhlIGZ1dHVyZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3My0xMDc0CiAgICAvLyAjIE5vdGFyaXplIHByb3NwZWN0dXMgKG9wdGlvbmFsKQogICAgLy8gc2VsZi5wcm9zcGVjdHVzX2hhc2ggPSBwcm9zcGVjdHVzLmhhc2guYnl0ZXMKICAgIGRpZyAyCiAgICBleHRyYWN0IDAgMzIKICAgIGJ5dGVjIDQyIC8vICJwcm9zcGVjdHVzX2hhc2giCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3NQogICAgLy8gc2VsZi5wcm9zcGVjdHVzX3VybCA9IHByb3NwZWN0dXMudXJsCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGVjIDQzIC8vICJwcm9zcGVjdHVzX3VybCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc2CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAMTc6CiAgICBpbnRjXzAgLy8gMAogICAgYiBjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUAxOAoKY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAODoKICAgIGludGNfMCAvLyAwCiAgICBiIGNvbnRyYWN0X2NvbmZpZ19ib29sX21lcmdlQDkKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9zY2hlZHVsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X3NjaGVkdWxlOgogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHN3YXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBkdXAKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgMgogICAgKwogICAgdW5jb3ZlciAyCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLkV4ZWN1dGlvblNjaGVkdWxlRW50cnk+CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTEwCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMTMKICAgIC8vIGNvbnRyYWN0X3R5cGU9c2VsZi5jb250cmFjdF90eXBlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGNvdmVyIDMKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4ODEKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4ODItODg0CiAgICAvLyBhc3NlcnQgc2NoZWR1bGVfcGFnZS5sZW5ndGggPD0gVUludDY0KAogICAgLy8gICAgIGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUKICAgIC8vICksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGR1cAogICAgcHVzaGludCAxNgogICAgPD0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg4NQogICAgLy8gYXNzZXJ0IHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPiBVSW50NjQoMCksIGVyci5URVJNU19OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSB0ZXJtcyBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODg3CiAgICAvLyBwYWdlX2N1cnNvciA9IHNjaGVkdWxlX3BhZ2VfaW5kZXggKiBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkKICAgIHN3YXAKICAgIHB1c2hpbnQgMTYKICAgICoKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg5NAogICAgLy8gKyBwYWdlX2xlbmd0aCAqIFVJbnQ2NChjc3QuT1BfVVBfQ09OVFJBQ1RfQ09ORklHX1BFUl9FTlRSWV9CVURHRVQpCiAgICBwdXNoaW50IDEwMAogICAgKgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODkzCiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19CQVNFX0JVREdFVCkKICAgIGludGMgNCAvLyAxNTAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTMtODk0CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19CQVNFX0JVREdFVCkKICAgIC8vICsgcGFnZV9sZW5ndGggKiBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19QRVJfRU5UUllfQlVER0VUKQogICAgKwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODg5LTg5NgogICAgLy8gIyBWYWxpZGF0aW9uIGNvc3QgZ3Jvd3Mgd2l0aCBwYWdlIGxlbmd0aCwgc28gY29uZmlndXJhdGlvbiBleHBsaWNpdGx5CiAgICAvLyAjIGJ1eXMgZXh0cmEgb3Bjb2RlIGJ1ZGdldCBmb3IgbGFyZ2VyIHVwbG9hZHMuCiAgICAvLyBlbnN1cmVfYnVkZ2V0KAogICAgLy8gICAgIHJlcXVpcmVkX2J1ZGdldD0oCiAgICAvLyAgICAgICAgIFVJbnQ2NChjc3QuT1BfVVBfQ09OVFJBQ1RfQ09ORklHX0JBU0VfQlVER0VUKQogICAgLy8gICAgICAgICArIHBhZ2VfbGVuZ3RoICogVUludDY0KGNzdC5PUF9VUF9DT05UUkFDVF9DT05GSUdfUEVSX0VOVFJZX0JVREdFVCkKICAgIC8vICAgICApLAogICAgLy8gKQogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODk3CiAgICAvLyBpbmRleCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKCmNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEAyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODk4CiAgICAvLyB3aGlsZSBpbmRleCA8IHBhZ2VfbGVuZ3RoOgogICAgZHVwCiAgICBkaWcgNAogICAgPAogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfd2hpbGVAMTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg5OS05MDAKICAgIC8vIGVudHJ5ID0gc2NoZWR1bGVfcGFnZVtpbmRleF0uY29weSgpCiAgICAvLyBlbnRyeV9ldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZGlnIDQKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGJ1cnkgMTIKICAgIGRpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgNjUKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTAwCiAgICAvLyBlbnRyeV9ldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTktOTAwCiAgICAvLyBlbnRyeSA9IHNjaGVkdWxlX3BhZ2VbaW5kZXhdLmNvcHkoKQogICAgLy8gZW50cnlfZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGludGNfMiAvLyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDAKICAgIC8vIGVudHJ5X2V2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBnZXRieXRlCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgMTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkwMQogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X2lkID09IHBhZ2VfY3Vyc29yICsgaW5kZXgsIGVyci5JTlZBTElEX0VWRU5UX0lECiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEzCiAgICBkaWcgNQogICAgdW5jb3ZlciA0CiAgICArCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDItOTA0CiAgICAvLyBzZWxmLl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBlbnRyeV9ldmVudF90eXBlCiAgICAvLyApCiAgICBkaWcgNQogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTA1CiAgICAvLyBhc3NlcnQgZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgc3dhcAogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDYKICAgIC8vIGlmIGVudHJ5LmV2ZW50X2lkID4gVUludDY0KDApOgogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDcKICAgIC8vIGlmIGluZGV4ID4gVUludDY0KDApOgogICAgZHVwCiAgICBieiBjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlANgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTA4CiAgICAvLyBwcmV2aW91c19lbnRyeSA9IHNjaGVkdWxlX3BhZ2VbaW5kZXggLSBVSW50NjQoMSldLmNvcHkoKQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgcHVzaGludCA2NQogICAgKgogICAgZGlnIDExCiAgICBzd2FwCiAgICBwdXNoaW50IDY1CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkyMwogICAgLy8gcHJldmlvdXNfZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gZW50cnkuc2NoZWR1bGVkX3RpbWUKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyA4CiAgICA8PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTIyLTkyNAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBwcmV2aW91c19lbnRyeS5zY2hlZHVsZWRfdGltZSA8PSBlbnRyeS5zY2hlZHVsZWRfdGltZQogICAgLy8gKSwgZXJyLklOVkFMSURfU09SVElORwogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIG11c3QgYmUgc29ydGVkIGluIHN0cmljdGx5IGFzY2VuZGluZyBvcmRlcgoKY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUA4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTI1CiAgICAvLyBpZiBlbnRyeS5ldmVudF9pZCA9PSBVSW50NjQoMCk6CiAgICBkaWcgOAogICAgYm56IGNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkyNi05MjgKICAgIC8vIGFzc2VydCBlbnRyeV9ldmVudF90eXBlID09IFVJbnQ2NCgKICAgIC8vICAgICBlbnVtcy5FVlRfSUVECiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGRpZyA5CiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjkKICAgIC8vIGluZGV4ICs9IFVJbnQ2NCgxKQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIGNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEAyCgpjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlANjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkxMC05MTIKICAgIC8vICMgVGhlIGZpcnN0IGVudHJ5IG9mIGEgcGFnZSBtdXN0IHN0aWxsIGJlIG9yZGVyZWQgYWZ0ZXIgdGhlCiAgICAvLyAjIGxhc3QgZW50cnkgb2YgdGhlIHByZXZpb3VzIHBhZ2UuCiAgICAvLyBhc3NlcnQgc2NoZWR1bGVfcGFnZV9pbmRleCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGRpZyA2CiAgICBkdXAKICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTMKICAgIC8vIHByZXZpb3VzX3BhZ2VfaW5kZXggPSBzY2hlZHVsZV9wYWdlX2luZGV4IC0gVUludDY0KDEpCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTE1CiAgICAvLyBwcmV2aW91c19wYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZQogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTQtOTE2CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHByZXZpb3VzX3BhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTctOTE4CiAgICAvLyBwcmV2aW91c19wYWdlID0gc2VsZi5zY2hlZHVsZV9wYWdlW3ByZXZpb3VzX3BhZ2VfaW5kZXhdLmNvcHkoKQogICAgLy8gYXNzZXJ0IHByZXZpb3VzX3BhZ2UubGVuZ3RoID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBwdXNoaW50IDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTgKICAgIC8vIGFzc2VydCBwcmV2aW91c19wYWdlLmxlbmd0aCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZHVwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjAKICAgIC8vIHByZXZpb3VzX3BhZ2UubGVuZ3RoIC0gVUludDY0KDEpCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTE5LTkyMQogICAgLy8gcHJldmlvdXNfZW50cnkgPSBwcmV2aW91c19wYWdlWwogICAgLy8gICAgIHByZXZpb3VzX3BhZ2UubGVuZ3RoIC0gVUludDY0KDEpCiAgICAvLyBdLmNvcHkoKQogICAgcHVzaGludCA2NQogICAgKgogICAgcHVzaGludCAyCiAgICArCiAgICBwdXNoaW50IDY1CiAgICBib3hfZXh0cmFjdAogICAgYiBjb250cmFjdF9zY2hlZHVsZV9hZnRlcl9pZl9lbHNlQDcKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX3doaWxlQDExOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjAwCiAgICAvLyBzZWxmLnNjaGVkdWxlX3BhZ2VbcGFnZV9pbmRleF0gPSBzY2hlZHVsZV9wYWdlLmNvcHkoKQogICAgZGlnIDYKICAgIGl0b2IKICAgIGJ5dGVjIDI0IC8vIDB4NTMyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgZGlnIDUKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzMgogICAgLy8gaWYgaXNfbGFzdF9wYWdlOgogICAgZGlnIDUKICAgIGJ6IGNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzNAogICAgLy8gc2NoZWR1bGVfcGFnZV9pbmRleCAqIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKSArIHBhZ2VfbGVuZ3RoCiAgICBkaWcgMQogICAgZGlnIDQKICAgICsKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzMwogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA9ICgKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTMzLTkzNQogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA9ICgKICAgIC8vICAgICBzY2hlZHVsZV9wYWdlX2luZGV4ICogVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpICsgcGFnZV9sZW5ndGgKICAgIC8vICkKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MzYKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgNTAKICAgIGFwcF9nbG9iYWxfcHV0Cgpjb250cmFjdF9zY2hlZHVsZV9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTExOAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9leGVjdXRlX2llZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X2V4ZWN1dGVfaWVkOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDMKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE0NAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDUKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTQ3CiAgICAvLyBhc3NlcnQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LCBlcnIuSU5WQUxJRF9FVkVOVF9DVVJTT1IKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgZGlnIDEKICAgID4KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGN1cnNvcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE0OAogICAgLy8gZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoc2VsZi5ldmVudF9jdXJzb3IpCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDkKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoZW51bXMuRVZUX0lFRCksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGR1cAogICAgZXh0cmFjdCA4IDEKICAgIGR1cAogICAgcHVzaGJ5dGVzIDB4MDEKICAgIGI9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1MwogICAgLy8gZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICBkaWcgMQogICAgZXh0cmFjdCAwIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTUKICAgIC8vIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgZGlnIDIKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTU2CiAgICAvLyBhY2NydWFsX2ZhY3Rvcj1lbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIGRpZyAzCiAgICBleHRyYWN0IDE3IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTcKICAgIC8vIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIGRpZyA0CiAgICBleHRyYWN0IDI1IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTkKICAgIC8vIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPWVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDUKICAgIGV4dHJhY3QgMzMgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE2MAogICAgLy8gbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgZGlnIDYKICAgIGV4dHJhY3QgNDEgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE2MQogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9ZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICBkaWcgNwogICAgZXh0cmFjdCA0OSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTYyCiAgICAvLyBmbGFncz1lbnRyeS5mbGFncywKICAgIGRpZyA4CiAgICBleHRyYWN0IDU3IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTItMTE2MwogICAgLy8gdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0KAogICAgLy8gICAgIGV2ZW50X2lkPWVudHJ5LmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1lbnRyeS5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1lbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPWVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9ZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPWVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGZsYWdzPWVudHJ5LmZsYWdzLAogICAgLy8gKSwKICAgIHVuY292ZXIgNwogICAgdW5jb3ZlciA4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNwogICAgY29uY2F0CiAgICB1bmNvdmVyIDYKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTgKICAgIC8vIG9ic2VydmVkX3JhdGU9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTItMTE2MwogICAgLy8gdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0KAogICAgLy8gICAgIGV2ZW50X2lkPWVudHJ5LmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1lbnRyeS5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1lbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPWVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9ZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPWVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGZsYWdzPWVudHJ5LmZsYWdzLAogICAgLy8gKSwKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTUwLTExNjQKICAgIC8vIHNlbGYuX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5KAogICAgLy8gICAgIGVudHJ5LAogICAgLy8gICAgIHR5cC5PYnNlcnZlZEV2ZW50UmVxdWVzdCgKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPWVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIG9ic2VydmVkX3JhdGU9VUludDY0KDApLAogICAgLy8gICAgICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1lbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1lbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICAgICAgZmxhZ3M9ZW50cnkuZmxhZ3MsCiAgICAvLyAgICAgKSwKICAgIC8vICkKICAgIGNhbGxzdWIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5CiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNjUKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEyMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuYXBwbHlfbm9uX2Nhc2hfZXZlbnRbcm91dGluZ10oKSAtPiB2b2lkOgphcHBseV9ub25fY2FzaF9ldmVudDoKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDQKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cG4gMgogICAgbGVuCiAgICBwdXNoaW50IDczCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLk9ic2VydmVkRXZlbnRSZXF1ZXN0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIwNAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMDUKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjA3CiAgICAvLyBpZiBwYXlsb2FkLmZsYWdzICYgVUludDY0KGVudW1zLkZMQUdfT0JTRVJWRURfRVZFTlQpOgogICAgcHVzaGludCA2NQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgcHVzaGludCA0CiAgICAmCiAgICBieiBhcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIzMwogICAgLy8gcmV0dXJuIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQ0xNKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICBwdXNoaW50IDUKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjA4CiAgICAvLyBhc3NlcnQgc2VsZi5fc3VwcG9ydHNfb2JzZXJ2ZWRfZXZlbnRzKCksIGVyci5PQlNFUlZFRF9FVkVOVF9SRVFVSVJFRAogICAgYXNzZXJ0IC8vIE9ic2VydmVkIGV2ZW50IHJlcXVpcmVkIHRvIGV4ZWN1dGUgdGhpcyBhY3Rpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMDkKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjMzCiAgICAvLyByZXR1cm4gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9DTE0pCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIGR1cAogICAgcHVzaGludCA1CiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQ1CiAgICAvLyBhc3NlcnQgc2VsZi5fc3VwcG9ydHNfb2JzZXJ2ZWRfZXZlbnRzKCksIGVyci5PQlNFUlZFRF9FVkVOVF9SRVFVSVJFRAogICAgYXNzZXJ0IC8vIE9ic2VydmVkIGV2ZW50IHJlcXVpcmVkIHRvIGV4ZWN1dGUgdGhpcyBhY3Rpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk0NgogICAgLy8gYXNzZXJ0IHBheWxvYWQuZXZlbnRfaWQgPT0gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGRpZyAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDcKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBpZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQ4CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUsIHBheWxvYWQuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgYnVyeSAxMgogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk0Ny05NDkKICAgIC8vIHNlbGYuX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIHNlbGYuY29udHJhY3RfdHlwZSwgcGF5bG9hZC5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICAvLyApCiAgICBjYWxsc3ViIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTUxCiAgICAvLyBwYWdlX2luZGV4ID0gc2VsZi5fc2NoZWR1bGVfcGFnZV9pbmRleChzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTkwCiAgICAvLyByZXR1cm4gZXZlbnRfaWQgLy8gVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpCiAgICBwdXNoaW50IDE2CiAgICAvCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTIKICAgIC8vIHBhZ2UgPSB0eXAuRXhlY3V0aW9uU2NoZWR1bGVQYWdlKCkKICAgIGJ5dGVjIDQ4IC8vIDB4MDAwMAogICAgYnVyeSA3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTMKICAgIC8vIGlmIHBhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlOgogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA5CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMjcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1NAogICAgLy8gcGFnZSA9IHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XS5jb3B5KCkKICAgIGRpZyA3CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidXJ5IDcKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX3BhZ2UgZW50cnkgZXhpc3RzCgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDI3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTU1CiAgICAvLyBhc3NlcnQgcGFnZS5sZW5ndGggPCBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGRpZyA1CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgMTYKICAgIDwKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2MAogICAgLy8gc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIGRpZyAzCiAgICBkdXAKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjEKICAgIC8vIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICBkaWcgMQogICAgZXh0cmFjdCAxNyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjIKICAgIC8vIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZGlnIDIKICAgIGV4dHJhY3QgMjUgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTYzCiAgICAvLyBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDMKICAgIGV4dHJhY3QgNDEgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTY0CiAgICAvLyBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIGRpZyA0CiAgICBleHRyYWN0IDQ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2NQogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIHVuY292ZXIgNQogICAgZXh0cmFjdCA1NyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTctOTY3CiAgICAvLyB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1wYXlsb2FkLmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9cGF5bG9hZC5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPXBheWxvYWQucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXBheWxvYWQubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICkKICAgIGRpZyAxMQogICAgaXRvYgogICAgZGlnIDE4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMwogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTYtOTY4CiAgICAvLyBwYWdlLmFwcGVuZCgKICAgIC8vICAgICB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9cGF5bG9hZC5ldmVudF9pZCwKICAgIC8vICAgICAgICAgZXZlbnRfdHlwZT1wYXlsb2FkLmV2ZW50X3R5cGUsCiAgICAvLyAgICAgICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIC8vICAgICAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICAgICApCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjkKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHBhZ2UuY29weSgpCiAgICBkaWcgOAogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk3MAogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjEyCiAgICAvLyBhc3NlcnQgZXZlbnRfaWQgPT0gc2VsZi5ldmVudF9jdXJzb3IsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBjdXJzb3IKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMTMKICAgIC8vIGVudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KGV2ZW50X2lkKQogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIxNQogICAgLy8gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgYnVyeSAxMAogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjQKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY1CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzYzLTM3MAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9SUiksCiAgICBwdXNoaW50IDEyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY3CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICBwdXNoaW50IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY4CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgcHVzaGludCAxOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzYzLTM3MAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBieiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX2ZhbHNlQDE2CgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX3RydWVAMTU6CiAgICBpbnRjXzEgLy8gMQoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9tZXJnZUAxNzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMTQtMTIxNgogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2lzX25vbl9jYXNoKAogICAgLy8gICAgIGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIC8vICksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IHR5cGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMTcKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlICE9IGFyYzQuVUludDgoZW51bXMuRVZUX0lFRCksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGRpZyA4CiAgICBwdXNoYnl0ZXMgMHgwMQogICAgYiE9CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCB0eXBlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNzQKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluIChVSW50NjQoZW51bXMuRVZUX1JSKSwgVUludDY0KGVudW1zLkVWVF9SUkYpKQogICAgZGlnIDQKICAgIHB1c2hpbnQgMTIKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDIxCiAgICBkaWcgNAogICAgcHVzaGludCAxMQogICAgPT0KICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfZmFsc2VAMjIKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAyMToKICAgIGludGNfMSAvLyAxCgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX21lcmdlQDIzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIxOAogICAgLy8gaWYgc2VsZi5fZXZlbnRfaXNfcmF0ZV9yZXNldChlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpKToKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Vsc2VfYm9keUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODAKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLm9ic2VydmVyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjUgLy8gMHg1MjNhNGQ0ZjQzMjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMjIKICAgIC8vIHNlbGYuX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5KGVudHJ5LCBwYXlsb2FkKQogICAgZGlnIDYKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeQogICAgcG9wbiAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjIzCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfZWxzZV9ib2R5QDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjIxCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIGIgYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYWZ0ZXJfaWZfZWxzZUA2CgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX2ZhbHNlQDIyOgogICAgaW50Y18wIC8vIDAKICAgIGIgYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9tZXJnZUAyMwoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9mYWxzZUAxNjoKICAgIGludGNfMCAvLyAwCiAgICBiIGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfbWVyZ2VAMTcKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5hcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50OgogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGxlbgogICAgcHVzaGludCA2NQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5PYnNlcnZlZENhc2hFdmVudFJlcXVlc3QKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjU0CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyNTUKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjU2CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIzMwogICAgLy8gcmV0dXJuIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQ0xNKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICBwdXNoaW50IDUKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5ODEKICAgIC8vIGFzc2VydCBzZWxmLl9zdXBwb3J0c19vYnNlcnZlZF9ldmVudHMoKSwgZXJyLk9CU0VSVkVEX0VWRU5UX1JFUVVJUkVECiAgICBhc3NlcnQgLy8gT2JzZXJ2ZWQgZXZlbnQgcmVxdWlyZWQgdG8gZXhlY3V0ZSB0aGlzIGFjdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTgyCiAgICAvLyBhc3NlcnQgcGF5bG9hZC5ldmVudF9pZCA9PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LCBlcnIuSU5WQUxJRF9FVkVOVF9JRAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgc3dhcAogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBpZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTgzCiAgICAvLyBhc3NlcnQgcGF5bG9hZC5ldmVudF90eXBlID09IGFyYzQuVUludDgoZW51bXMuRVZUX1BSKSwgZXJyLklOVkFMSURfRVZFTlRfVFlQRQogICAgZGlnIDEKICAgIGV4dHJhY3QgOCAxCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIHB1c2hieXRlcyAweDAzCiAgICBiPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IHR5cGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4NAogICAgLy8gYXNzZXJ0IHBheWxvYWQuZmxhZ3MgJiBVSW50NjQoZW51bXMuRkxBR19DQVNIX0VWRU5UKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBzd2FwCiAgICBwdXNoaW50IDU3CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzEgLy8gMQogICAgJgogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTg2CiAgICAvLyBpZiBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50ID4gVUludDY0KDApOgogICAgYnogYXBwZW5kX29ic2VydmVkX2Nhc2hfZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5ODgKICAgIC8vIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgLSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5ODctOTg5CiAgICAvLyBwcmV2aW91c19lbnRyeSA9IHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeSgKICAgIC8vICAgICBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IC0gVUludDY0KDEpCiAgICAvLyApCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5MQogICAgLy8gcHJldmlvdXNfZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gcGF5bG9hZC5zY2hlZHVsZWRfdGltZQogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDQKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIDw9CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OTAtOTkyCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHByZXZpb3VzX2VudHJ5LnNjaGVkdWxlZF90aW1lIDw9IHBheWxvYWQuc2NoZWR1bGVkX3RpbWUKICAgIC8vICksIGVyci5JTlZBTElEX1NPUlRJTkcKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBtdXN0IGJlIHNvcnRlZCBpbiBzdHJpY3RseSBhc2NlbmRpbmcgb3JkZXIKCmFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5NAogICAgLy8gcGFnZV9pbmRleCA9IHNlbGYuX3NjaGVkdWxlX3BhZ2VfaW5kZXgoc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE5MAogICAgLy8gcmV0dXJuIGV2ZW50X2lkIC8vIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKQogICAgcHVzaGludCAxNgogICAgLwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTk1CiAgICAvLyBwYWdlID0gdHlwLkV4ZWN1dGlvblNjaGVkdWxlUGFnZSgpCiAgICBieXRlYyA0OCAvLyAweDAwMDAKICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTk2CiAgICAvLyBpZiBwYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZToKICAgIGl0b2IKICAgIGJ5dGVjIDI0IC8vIDB4NTMyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgNwogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBhcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5NwogICAgLy8gcGFnZSA9IHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XS5jb3B5KCkKICAgIGRpZyA1CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidXJ5IDYKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX3BhZ2UgZW50cnkgZXhpc3RzCgphcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OTgKICAgIC8vIGFzc2VydCBwYWdlLmxlbmd0aCA8IFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZGlnIDQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgcHVzaGludCAxNgogICAgPAogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAwMwogICAgLy8gc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIGRpZyA1CiAgICBkdXAKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDA0CiAgICAvLyBhY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLmFjY3J1YWxfZmFjdG9yLAogICAgZGlnIDEKICAgIGV4dHJhY3QgMTcgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAwNQogICAgLy8gcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICBkaWcgMgogICAgZXh0cmFjdCAyNSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDA2CiAgICAvLyBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDMKICAgIGV4dHJhY3QgMzMgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAwNwogICAgLy8gbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1wYXlsb2FkLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICBkaWcgNAogICAgZXh0cmFjdCA0MSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDA4CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1wYXlsb2FkLm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgdW5jb3ZlciA1CiAgICBleHRyYWN0IDQ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMDAtMTAxMAogICAgLy8gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkoCiAgICAvLyAgICAgZXZlbnRfaWQ9cGF5bG9hZC5ldmVudF9pZCwKICAgIC8vICAgICBldmVudF90eXBlPXBheWxvYWQuZXZlbnRfdHlwZSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1wYXlsb2FkLnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9cGF5bG9hZC5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIC8vICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1wYXlsb2FkLm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGZsYWdzPXBheWxvYWQuZmxhZ3MsCiAgICAvLyApCiAgICBkaWcgMTAKICAgIGl0b2IKICAgIGRpZyAxMAogICAgY29uY2F0CiAgICB1bmNvdmVyIDYKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTk5LTEwMTEKICAgIC8vIHBhZ2UuYXBwZW5kKAogICAgLy8gICAgIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgICAgICBldmVudF9pZD1wYXlsb2FkLmV2ZW50X2lkLAogICAgLy8gICAgICAgICBldmVudF90eXBlPXBheWxvYWQuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICAgICAgYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPXBheWxvYWQubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1wYXlsb2FkLm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgICAgICBmbGFncz1wYXlsb2FkLmZsYWdzLAogICAgLy8gICAgICkKICAgIC8vICkKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMTIKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHBhZ2UuY29weSgpCiAgICBkaWcgNgogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMTMKICAgIC8vIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgKz0gVUludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI2MAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9nZXRfc3RhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9nZXRfc3RhdGU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGR1cAogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjc1CiAgICAvLyBjb250cmFjdF90eXBlPWFyYzQuVUludDgoc2VsZi5jb250cmFjdF90eXBlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgaXRvYgogICAgZHVwCiAgICBiaXRsZW4KICAgIGludGNfMiAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBleHRyYWN0IDcgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI3NwogICAgLy8gdG90YWxfdW5pdHM9c2VsZi50b3RhbF91bml0cywKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjc4CiAgICAvLyByZXNlcnZlZF91bml0c190b3RhbD1zZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyNzkKICAgIC8vIGluaXRpYWxfZXhjaGFuZ2VfYW1vdW50PXNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI4MAogICAgLy8gZXZlbnRfY3Vyc29yPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjgxCiAgICAvLyBzY2hlZHVsZV9lbnRyeV9jb3VudD1zZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI4MgogICAgLy8gb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjgzCiAgICAvLyBpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlPXNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjg0CiAgICAvLyBub21pbmFsX2ludGVyZXN0X3JhdGU9c2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyODUKICAgIC8vIGFjY3J1ZWRfaW50ZXJlc3Q9c2VsZi5hY2NydWVkX2ludGVyZXN0LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyODYKICAgIC8vIGN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXg9c2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjg3CiAgICAvLyBjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleD1zZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyODgKICAgIC8vIHJlc2VydmVkX2ludGVyZXN0PXNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX2ludGVyZXN0IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI4OQogICAgLy8gcmVzZXJ2ZWRfcHJpbmNpcGFsPXNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI3NC0xMjkwCiAgICAvLyByZXR1cm4gdHlwLktlcm5lbFN0YXRlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGU9YXJjNC5VSW50OChzZWxmLmNvbnRyYWN0X3R5cGUpLAogICAgLy8gICAgIHN0YXR1cz1zZWxmLnN0YXR1cywKICAgIC8vICAgICB0b3RhbF91bml0cz1zZWxmLnRvdGFsX3VuaXRzLAogICAgLy8gICAgIHJlc2VydmVkX3VuaXRzX3RvdGFsPXNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwsCiAgICAvLyAgICAgaW5pdGlhbF9leGNoYW5nZV9hbW91bnQ9c2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCwKICAgIC8vICAgICBldmVudF9jdXJzb3I9c2VsZi5ldmVudF9jdXJzb3IsCiAgICAvLyAgICAgc2NoZWR1bGVfZW50cnlfY291bnQ9c2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwKICAgIC8vICAgICBvdXRzdGFuZGluZ19wcmluY2lwYWw9c2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZT1zZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICAvLyAgICAgbm9taW5hbF9pbnRlcmVzdF9yYXRlPXNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIGFjY3J1ZWRfaW50ZXJlc3Q9c2VsZi5hY2NydWVkX2ludGVyZXN0LAogICAgLy8gICAgIGN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXg9c2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4LAogICAgLy8gICAgIGN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4PXNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgsCiAgICAvLyAgICAgcmVzZXJ2ZWRfaW50ZXJlc3Q9c2VsZi5yZXNlcnZlZF9pbnRlcmVzdCwKICAgIC8vICAgICByZXNlcnZlZF9wcmluY2lwYWw9c2VsZi5yZXNlcnZlZF9wcmluY2lwYWwsCiAgICAvLyApCiAgICB1bmNvdmVyIDE0CiAgICBpdG9iCiAgICB1bmNvdmVyIDE0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMgogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDExCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA5CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgOAogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDcKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyNjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzA0CiAgICAvLyBpZiBzZWxmLmV2ZW50X2N1cnNvciA+PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICA+PQogICAgYnogY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMwNgogICAgLy8gZXZlbnRfaWQ9c2VsZi5ldmVudF9jdXJzb3IsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMDUtMTMxNQogICAgLy8gcmV0dXJuIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgIGV2ZW50X2lkPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgLy8gICAgIGV2ZW50X3R5cGU9YXJjNC5VSW50OCgwKSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1VSW50NjQoMCksCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1VSW50NjQoMCksCiAgICAvLyAgICAgZmxhZ3M9VUludDY0KDApLAogICAgLy8gKQogICAgaXRvYgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMwNwogICAgLy8gZXZlbnRfdHlwZT1hcmM0LlVJbnQ4KDApLAogICAgYnl0ZWMgNDAgLy8gMHgwMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMwNS0xMzE1CiAgICAvLyByZXR1cm4gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkoCiAgICAvLyAgICAgZXZlbnRfaWQ9c2VsZi5ldmVudF9jdXJzb3IsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1hcmM0LlVJbnQ4KDApLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPVVJbnQ2NCgwKSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249VUludDY0KDApLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPVVJbnQ2NCgwKSwKICAgIC8vICAgICBmbGFncz1VSW50NjQoMCksCiAgICAvLyApCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMDgKICAgIC8vIHNjaGVkdWxlZF90aW1lPVVJbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzA1LTEzMTUKICAgIC8vIHJldHVybiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1zZWxmLmV2ZW50X2N1cnNvciwKICAgIC8vICAgICBldmVudF90eXBlPWFyYzQuVUludDgoMCksCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9VUludDY0KDApLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9VUludDY0KDApLAogICAgLy8gICAgIGZsYWdzPVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAoKY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50QDQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjkyCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzE2CiAgICAvLyByZXR1cm4gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KHNlbGYuZXZlbnRfY3Vyc29yKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyOTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiBjb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnRfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnRANAoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLmNvbnRyYWN0X3VwZGF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X3VwZGF0ZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTktMTYyCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gZ3JhbnRzIHRoZSB1cGRhdGUgcGVybWlzc2lvbnMgdG8gdGhlIEFycmFuZ2VyLgogICAgLy8gIyDimqDvuI8gV0FSTklORzogQXBwbGljYXRpb24gdXBkYXRlcyBtdXN0IGJlIGV4ZWN1dGVkIFZFUlkgY2FyZWZ1bGx5LCBhcyB0aGV5CiAgICAvLyAjIG1pZ2h0IGludHJvZHVjZSBicmVha2luZyBjaGFuZ2VzLgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19yb3RhdGVfYXJyYW5nZXJbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3JvdGF0ZV9hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTc4CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzkKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSBuZXdfYXJyYW5nZXIKICAgIGJ5dGVjIDE4IC8vIDB4NTIzYTQxNTI1MjIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4MAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTY0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3NldF9vcF9kYWVtb25bcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3NldF9vcF9kYWVtb246CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTgyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE5NgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTk3CiAgICAvLyBzZWxmLm9wX2RhZW1vbi52YWx1ZSA9IGFkZHJlc3MKICAgIGJ5dGVjIDI2IC8vIDB4NTIzYTRmNTA0NDIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE5OAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTgyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2Fzc2lnbl9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19hc3NpZ25fcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDE2CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLlJvbGVWYWxpZGl0eQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyMgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjIzCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNAogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgcHVzaGludCAyMAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTAzCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gcm9sZV9hZGRyZXNzCiAgICBieXRlYyAxOCAvLyAweDUyM2E0MTUyNTIyMwogICAgZGlnIDMKICAgIGFwcF9nbG9iYWxfcHV0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwNgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDQwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDcKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIzIC8vIDB4NTIzYTRkNGU0NzIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDgKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI1CiAgICAvLyBzZWxmLl9zZXRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIHZhbGlkaXR5KQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTAKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTEKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjIgLy8gMHg1MjNhNTA1OTQ0MjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMgogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNQogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE0CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpOgogICAgZHVwCiAgICBwdXNoaW50IDYwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTUKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAzMiAvLyAweDUyM2E1NDUyNTMyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE2CiAgICAvLyBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjUKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExOAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMSAvLyAweDUyM2E0MTU1NTQyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIwCiAgICAvLyBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNQogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgODAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIzCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI1IC8vIDB4NTIzYTRkNGY0MzIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjQKICAgIC8vIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfcmV2b2tlX3JvbGVbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3Jldm9rZV9yb2xlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0NwogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjQ4CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0OQogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjcKICAgIC8vIGFzc2VydCByb2xlX2lkICE9IFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwgZXJyLklOVkFMSURfUk9MRQogICAgZHVwCiAgICBwdXNoaW50IDIwCiAgICAhPQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI4CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICBwdXNoaW50IDQwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjkKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjMgLy8gMHg1MjNhNGQ0ZTQ3MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMAogICAgLy8gZGVsIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTEKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzMKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMiAvLyAweDUyM2E1MDU5NDQyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM0CiAgICAvLyBkZWwgc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTAKICAgIC8vIHNlbGYuX2RlbGV0ZV9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcykKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM2CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpOgogICAgZHVwCiAgICBwdXNoaW50IDYwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzcKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDMyIC8vIDB4NTIzYTU0NTI1MzIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzgKICAgIC8vIGRlbCBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjUwCiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDEKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hdXRob3JpdHksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjEgLy8gMHg1MjNhNDE1NTU0MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MgogICAgLy8gZGVsIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1MAogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDQKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDgwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI1IC8vIDB4NTIzYTRkNGY0MzIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDYKICAgIC8vIGRlbCBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19jb250cmFjdF9zdXNwZW5zaW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19jb250cmFjdF9zdXNwZW5zaW9uOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kICAjIFRPRE86IFVwZGF0ZSBzcGVjcyBhbmQgYWRkIHRlc3QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzcKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDIxIC8vIDB4NTIzYTQxNTU1NDIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjY5CiAgICAvLyBzZWxmLmFzc2V0X3N1c3BlbmRlZCA9IHN1c3BlbmRlZAogICAgYnl0ZWMgMzMgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjcwCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCAgIyBUT0RPOiBVcGRhdGUgc3BlY3MgYW5kIGFkZCB0ZXN0CiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYXJyYW5nZXJbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODMKICAgIC8vIHJldHVybiBzZWxmLmFycmFuZ2VyLnZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTggLy8gMHg1MjNhNDE1MjUyMjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcnJhbmdlciBleGlzdHMKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNzIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXNbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9hZGRyZXNzX3JvbGVzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDMKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDIzIC8vIDB4NTIzYTRkNGU0NzIzCiAgICBkaWcgMQogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDQKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYucHJpbWFyeV9kZWFsZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjIgLy8gMHg1MjNhNTA1OTQ0MjMKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwNQogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi50cnVzdGVlLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDMyIC8vIDB4NTIzYTU0NTI1MzIzCiAgICBkaWcgMwogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDYKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYXV0aG9yaXR5LCBhZGRyZXNzKSwKICAgIGJ5dGVjIDIxIC8vIDB4NTIzYTQxNTU1NDIzCiAgICBkaWcgNAogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDcKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYub2JzZXJ2ZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjUgLy8gMHg1MjNhNGQ0ZjQzMjMKICAgIHVuY292ZXIgNQogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWMgNDAgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgNgogICAgc2V0Yml0CiAgICBpbnRjXzEgLy8gMQogICAgdW5jb3ZlciA1CiAgICBzZXRiaXQKICAgIHB1c2hpbnQgMgogICAgdW5jb3ZlciA0CiAgICBzZXRiaXQKICAgIHB1c2hpbnQgMwogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIHB1c2hpbnQgNAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5W3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfcm9sZV92YWxpZGl0eToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjgKICAgIC8vIHJvbGUgPSByb2xlX2lkLmFzX3VpbnQ2NCgpCiAgICBidG9pCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI5CiAgICAvLyBzZWxmLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlKQogICAgZHVwCiAgICBjYWxsc3ViIF9hc3NlcnRfdmFsaWRfcm9sZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMzMQogICAgLy8gY2FzZSBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUik6CiAgICBwdXNoaW50cyAyMCA0MCA1MCA2MCA3MCA4MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMzMC0zNjEKICAgIC8vIG1hdGNoIHJvbGU6CiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUik6CiAgICAvLyAgICAgICAgIHJldHVybiB0eXAuUm9sZVZhbGlkaXR5KAogICAgLy8gICAgICAgICAgICAgcm9sZV92YWxpZGl0eV9zdGFydD1VSW50NjQoMCksIHJvbGVfdmFsaWRpdHlfZW5kPVVJbnQ2NCgwKQogICAgLy8gICAgICAgICApCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLmFjY291bnRfbWFuYWdlciwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLnByaW1hcnlfZGVhbGVyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLmF1dGhvcml0eSwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLm9ic2VydmVyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIF86CiAgICAvLyAgICAgICAgIG9wLmVycihlcnIuSU5WQUxJRF9ST0xFKQogICAgdW5jb3ZlciA2CiAgICBtYXRjaCByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzBAMiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzFAMyByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzJANCByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzNANSByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzRANiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzVANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM2MQogICAgLy8gb3AuZXJyKGVyci5JTlZBTElEX1JPTEUpCiAgICBlcnIgLy8gSW52YWxpZCByb2xlIGlkZW50aWZpZXIKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM1NwogICAgLy8gc2VsZi5vYnNlcnZlciwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAyNSAvLyAweDUyM2E0ZDRmNDMyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM1Ni0zNTgKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLm9ic2VydmVyLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTkKICAgIC8vIHJldHVybiBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV80QDY6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzUyCiAgICAvLyBzZWxmLmF1dGhvcml0eSwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAyMSAvLyAweDUyM2E0MTU1NTQyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM1MS0zNTMKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLmF1dGhvcml0eSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzU0CiAgICAvLyByZXR1cm4gc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8zQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzQ3CiAgICAvLyBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMzIgLy8gMHg1MjNhNTQ1MjUzMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNDYtMzQ4CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNDkKICAgIC8vIHJldHVybiBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8yQDQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzQyCiAgICAvLyBzZWxmLnByaW1hcnlfZGVhbGVyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDIyIC8vIDB4NTIzYTUwNTk0NDIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzQxLTM0MwogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM0NAogICAgLy8gcmV0dXJuIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8xQDM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzM3CiAgICAvLyBzZWxmLmFjY291bnRfbWFuYWdlciwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAyMyAvLyAweDUyM2E0ZDRlNDcyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMzNi0zMzgKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLmFjY291bnRfbWFuYWdlciwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzM5CiAgICAvLyByZXR1cm4gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8wQDI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzMyLTMzNAogICAgLy8gcmV0dXJuIHR5cC5Sb2xlVmFsaWRpdHkoCiAgICAvLyAgICAgcm9sZV92YWxpZGl0eV9zdGFydD1VSW50NjQoMCksIHJvbGVfdmFsaWRpdHlfZW5kPVVJbnQ2NCgwKQogICAgLy8gKQogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQoaG9sZGluZ19hZGRyZXNzOiBieXRlcykgLT4gdm9pZDoKX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQ6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjYKICAgIC8vIGRlZiBfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChzZWxmLCBob2xkaW5nX2FkZHJlc3M6IEFjY291bnQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyOAogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQsIGVyci5TVVNQRU5ERUQKICAgIGJ5dGVjIDggLy8gMHg0MTIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHB1c2hpbnQgMzg0CiAgICBnZXRiaXQKICAgICEKICAgIGFzc2VydCAvLyBTdXNwZW5kZWQgb3BlcmF0aW9ucwogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuX3NldHRsZV9wb3NpdGlvbihob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB1aW50NjQsIHVpbnQ2NDoKX3NldHRsZV9wb3NpdGlvbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo0NAogICAgLy8gZGVmIF9zZXR0bGVfcG9zaXRpb24oc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50KSAtPiB0dXBsZVtVSW50NjQsIFVJbnQ2NF06CiAgICBwcm90byAxIDIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo2MQogICAgLy8gcG9zaXRpb24gPSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jb3B5KCkKICAgIGR1cAogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NjMtNjUKICAgIC8vICMgQ29tcHV0ZSB0aGUgaW5jcmVtZW50YWwgcGVyLXVuaXQgZml4ZWQtcG9pbnQgaW50ZXJlc3QgYW5kIHByaW5jaXBhbCBhY2NydWVkCiAgICAvLyAjIHNpbmNlIHRoaXMgYWNjb3VudCdzIGxhc3QgY2hlY2twb2ludC4KICAgIC8vIGludGVyZXN0X2RlbHRhID0gc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IC0gcG9zaXRpb24uaW50ZXJlc3RfY2hlY2twb2ludAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggZXhpc3RzCiAgICBkaWcgMQogICAgcHVzaGludCA1NwogICAgZXh0cmFjdF91aW50NjQKICAgIC0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo2NwogICAgLy8gc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCAtIHBvc2l0aW9uLnByaW5jaXBhbF9jaGVja3BvaW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTcgLy8gImN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IGV4aXN0cwogICAgZGlnIDIKICAgIHB1c2hpbnQgNjUKICAgIGV4dHJhY3RfdWludDY0CiAgICAtCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzMKICAgIC8vIGludGVyZXN0X2RlbHRhLCBwb3NpdGlvbi51bml0cywgc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgZGlnIDIKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3MC03NAogICAgLy8gIyBDb252ZXJ0IHRoZSBwZXItdW5pdCBmaXhlZC1wb2ludCBkZWx0YXMgaW50byBhYnNvbHV0ZSBjbGFpbWFibGUgYW1vdW50cwogICAgLy8gIyB1c2luZyB0aGUgYWNjb3VudCdzIGFjdGl2ZSB1bml0cy4KICAgIC8vIGNsYWltYWJsZV9pbnRlcmVzdCA9IHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIGludGVyZXN0X2RlbHRhLCBwb3NpdGlvbi51bml0cywgc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgLy8gKQogICAgdW5jb3ZlciAzCiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojc2CiAgICAvLyBwcmluY2lwYWxfZGVsdGEsIHBvc2l0aW9uLnVuaXRzLCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzUtNzcKICAgIC8vIGNsYWltYWJsZV9wcmluY2lwYWwgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBwcmluY2lwYWxfZGVsdGEsIHBvc2l0aW9uLnVuaXRzLCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICAvLyApCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojc5LTgxCiAgICAvLyAjIEFjY3J1ZSB0aGUgY2xhaW1hYmxlIGFtb3VudHMgdG8gdGhlIGFjY291bnQgcG9zaXRpb24gYW5kIG1ha2UgdGhlbSBhdmFpbGFibGUKICAgIC8vICMgZm9yIHdpdGhkcmF3YWwuCiAgICAvLyBwb3NpdGlvbi5jbGFpbWFibGVfaW50ZXJlc3QgKz0gY2xhaW1hYmxlX2ludGVyZXN0CiAgICBkaWcgMgogICAgcHVzaGludCA3MwogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICArCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIHN3YXAKICAgIHJlcGxhY2UyIDczCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6ODIKICAgIC8vIHBvc2l0aW9uLmNsYWltYWJsZV9wcmluY2lwYWwgKz0gY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgZHVwCiAgICBwdXNoaW50IDgxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDIKICAgICsKICAgIGl0b2IKICAgIHJlcGxhY2UyIDgxCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6ODQtODYKICAgIC8vICMgQWR2YW5jZSB0aGUgYWNjb3VudCdzIHBlci11bml0IGZpeGVkLXBvaW50IGNoZWNrcG9pbnRzIHRvIHRoZSBjdXJyZW50IGdsb2JhbAogICAgLy8gIyBwZXItdW5pdCBmaXhlZC1wb2ludCBnbG9iYWwgaW5kaWNlcy4KICAgIC8vIHBvc2l0aW9uLmludGVyZXN0X2NoZWNrcG9pbnQgPSBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IGV4aXN0cwogICAgaXRvYgogICAgcmVwbGFjZTIgNTcKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo4NwogICAgLy8gcG9zaXRpb24ucHJpbmNpcGFsX2NoZWNrcG9pbnQgPSBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTcgLy8gImN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IGV4aXN0cwogICAgaXRvYgogICAgcmVwbGFjZTIgNjUKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo4OS05MAogICAgLy8gIyBBZHZhbmNlIHRoZSBhY2NvdW50J3MgZXZlbnQgY3Vyc29yIHRvIHRoZSBjdXJyZW50IGdsb2JhbCBldmVudCBjdXJzb3IuCiAgICAvLyBwb3NpdGlvbi5zZXR0bGVkX2N1cnNvciA9IHNlbGYuZXZlbnRfY3Vyc29yCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGl0b2IKICAgIHJlcGxhY2UyIDQ5CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6OTItOTQKICAgIC8vICMgVXBkYXRlIHRoZSBhY2NvdW50IHBvc2l0aW9uIGFuZCByZXR1cm4gdGhlIG5ld2x5IGFjY3J1ZWQgY2xhaW1hYmxlIGFtb3VudHMKICAgIC8vICMgYWRkZWQgdG8gdGhlIHRvdGFsIHBvc2l0aW9uJ3MgY2xhaW1hYmxlIGFtb3VudHMuCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHBvc2l0aW9uLmNvcHkoKQogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6OTUKICAgIC8vIHJldHVybiBjbGFpbWFibGVfaW50ZXJlc3QsIGNsYWltYWJsZV9wcmluY2lwYWwKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IHZvaWQ6Cl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojk3CiAgICAvLyBkZWYgX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQoc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg0MTIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwMAogICAgLy8gaWYgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCk6CiAgICBieiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZF9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDEKICAgIC8vIHJldHVybgogICAgcmV0c3ViCgpfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZF9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTAzCiAgICAvLyBwb3NpdGlvbiA9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNvcHkoKQogICAgZnJhbWVfZGlnIDIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwNAogICAgLy8gaWYgcG9zaXRpb24ucmVzZXJ2ZWRfdW5pdHMgPT0gVUludDY0KDApOgogICAgcHVzaGludCA0MAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICBibnogX2Vuc3VyZV91bml0c19hY3RpdmF0ZWRfYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA1CiAgICAvLyByZXR1cm4KICAgIHJldHN1YgoKX2Vuc3VyZV91bml0c19hY3RpdmF0ZWRfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwOAogICAgLy8gcG9zaXRpb24udW5pdHMgKz0gYWN0aXZhdGVkX3VuaXRzCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAzCiAgICArCiAgICBpdG9iCiAgICByZXBsYWNlMiAzMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwOQogICAgLy8gcG9zaXRpb24ucmVzZXJ2ZWRfdW5pdHMgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBpdG9iCiAgICByZXBsYWNlMiA0MAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExMAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSBwb3NpdGlvbi5jb3B5KCkKICAgIGZyYW1lX2RpZyAyCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTExCiAgICAvLyBhc3NlcnQgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCA+PSBhY3RpdmF0ZWRfdW5pdHMsIGVyci5PVkVSX0RJU1RSSUJVVElPTgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCBleGlzdHMKICAgIGR1cAogICAgZGlnIDIKICAgID49CiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IHJlbWFpbmluZyBELUFTQSB1bml0cwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExMgogICAgLy8gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCAtPSBhY3RpdmF0ZWRfdW5pdHMKICAgIHN3YXAKICAgIC0KICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fc2NhbGVkX211bF9kaXYobXVsdGlwbGljYW5kOiB1aW50NjQsIG11bHRpcGxpZXI6IHVpbnQ2NCwgZGl2aXNvcjogdWludDY0KSAtPiB1aW50NjQ6Cl9zY2FsZWRfbXVsX2RpdjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE1My0xNTUKICAgIC8vIGRlZiBfc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgc2VsZiwgbXVsdGlwbGljYW5kOiBVSW50NjQsIG11bHRpcGxpZXI6IFVJbnQ2NCwgZGl2aXNvcjogVUludDY0CiAgICAvLyApIC0+IFVJbnQ2NDoKICAgIHByb3RvIDMgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTU3CiAgICAvLyBpZiBtdWx0aXBsaWNhbmQgPT0gVUludDY0KDApIG9yIG11bHRpcGxpZXIgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0zCiAgICBieiBfc2NhbGVkX211bF9kaXZfaWZfYm9keUAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGJueiBfc2NhbGVkX211bF9kaXZfYWZ0ZXJfaWZfZWxzZUAzCgpfc2NhbGVkX211bF9kaXZfaWZfYm9keUAyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTU4CiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfc2NhbGVkX211bF9kaXZfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTU5CiAgICAvLyBoaWdoLCBsb3cgPSBvcC5tdWx3KG11bHRpcGxpY2FuZCwgbXVsdGlwbGllcikKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0yCiAgICBtdWx3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjAKICAgIC8vIHJldHVybiBvcC5kaXZ3KGhpZ2gsIGxvdywgZGl2aXNvcikKICAgIGZyYW1lX2RpZyAtMQogICAgZGl2dwogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Ftb3VudF90b19pbmRleF9kZWx0YShhbW91bnQ6IHVpbnQ2NCkgLT4gdWludDY0OgpfYW1vdW50X3RvX2luZGV4X2RlbHRhOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTYyCiAgICAvLyBkZWYgX2Ftb3VudF90b19pbmRleF9kZWx0YShzZWxmLCBhbW91bnQ6IFVJbnQ2NCkgLT4gVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjQKICAgIC8vIGlmIGFtb3VudCA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGJueiBfYW1vdW50X3RvX2luZGV4X2RlbHRhX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTY1CiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfYW1vdW50X3RvX2luZGV4X2RlbHRhX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2NgogICAgLy8gYXNzZXJ0IHNlbGYudG90YWxfdW5pdHMgPiBVSW50NjQoMCksIGVyci5OT19VTklUUwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIGR1cAogICAgYXNzZXJ0IC8vIE5vIEQtQVNBIHVuaXRzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjcKICAgIC8vIHJldHVybiBzZWxmLl9zY2FsZWRfbXVsX2RpdihhbW91bnQsIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsIHNlbGYudG90YWxfdW5pdHMpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9pbmRleF9kZWx0YV90b19hbW91bnQoaW5kZXhfZGVsdGE6IHVpbnQ2NCkgLT4gdWludDY0OgpfaW5kZXhfZGVsdGFfdG9fYW1vdW50OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTY5CiAgICAvLyBkZWYgX2luZGV4X2RlbHRhX3RvX2Ftb3VudChzZWxmLCBpbmRleF9kZWx0YTogVUludDY0KSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE3NgogICAgLy8gaWYgaW5kZXhfZGVsdGEgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0xCiAgICBibnogX2luZGV4X2RlbHRhX3RvX2Ftb3VudF9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE3NwogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKX2luZGV4X2RlbHRhX3RvX2Ftb3VudF9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNzkKICAgIC8vIHNlbGYudG90YWxfdW5pdHMsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTgxCiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTc4LTE4MgogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIHNlbGYudG90YWxfdW5pdHMsCiAgICAvLyAgICAgaW5kZXhfZGVsdGEsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9nZXRfc2NoZWR1bGVfZW50cnkoZXZlbnRfaWQ6IHVpbnQ2NCkgLT4gYnl0ZXM6Cl9nZXRfc2NoZWR1bGVfZW50cnk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMDIKICAgIC8vIGRlZiBfZ2V0X3NjaGVkdWxlX2VudHJ5KHNlbGYsIGV2ZW50X2lkOiBVSW50NjQpIC0+IHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5OgogICAgcHJvdG8gMSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMDQKICAgIC8vIGFzc2VydCBldmVudF9pZCA8IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQsIGVyci5JTlZBTElEX0VWRU5UX0lECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgID4KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxOTAKICAgIC8vIHJldHVybiBldmVudF9pZCAvLyBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAxNgogICAgLwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjA2CiAgICAvLyBhc3NlcnQgcGFnZV9pbmRleCBpbiBzZWxmLnNjaGVkdWxlX3BhZ2UsIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGl0b2IKICAgIGJ5dGVjIDI0IC8vIDB4NTMyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTk0CiAgICAvLyByZXR1cm4gZXZlbnRfaWQgJSBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAxNgogICAgJQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjA5CiAgICAvLyBhc3NlcnQgb2Zmc2V0IDwgcGFnZS5sZW5ndGgsIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGludCAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZGlnIDEKICAgID4KICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIxMAogICAgLy8gcmV0dXJuIHBhZ2Vbb2Zmc2V0XS5jb3B5KCkKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgMgogICAgKwogICAgcHVzaGludCA2NQogICAgYm94X2V4dHJhY3QKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZShjb250cmFjdF90eXBlOiB1aW50NjQsIGV2ZW50X3R5cGU6IHVpbnQ2NCkgLT4gdm9pZDoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzEzLTMxNQogICAgLy8gZGVmIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBzZWxmLCBjb250cmFjdF90eXBlOiBVSW50NjQsIGV2ZW50X3R5cGU6IFVJbnQ2NAogICAgLy8gKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjQ3CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lFRCksCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU0LTI1NQogICAgLy8gIyBDaGVjayBjb21tb24gZXZlbnRzIGZpcnN0CiAgICAvLyBpZiBldmVudF90eXBlIGluIGNvbW1vbl9ldmVudHM6CiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjQ4CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQKSwKICAgIGludGNfMiAvLyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNDkKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfTUQpLAogICAgcHVzaGludCAxOQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU0LTI1NQogICAgLy8gIyBDaGVjayBjb21tb24gZXZlbnRzIGZpcnN0CiAgICAvLyBpZiBldmVudF90eXBlIGluIGNvbW1vbl9ldmVudHM6CiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjUwCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIHB1c2hpbnQgMTIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1MQogICAgLy8gVUludDY0KGVudW1zLkVWVF9SUkYpLAogICAgcHVzaGludCAxMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU0LTI1NQogICAgLy8gIyBDaGVjayBjb21tb24gZXZlbnRzIGZpcnN0CiAgICAvLyBpZiBldmVudF90eXBlIGluIGNvbW1vbl9ldmVudHM6CiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VANwoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1NgogICAgLy8gcmV0dXJuIFRydWUKICAgIGludGNfMSAvLyAxCgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgcmV0c3ViCgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU4LTI1OQogICAgLy8gIyBDb250cmFjdC1zcGVjaWZpYyBhZGRpdGlvbmFsIGV2ZW50cwogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfUEFNKToKICAgIGZyYW1lX2RpZyAtMgogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2MC0yNjEKICAgIC8vICMgUEFNIG9ubHkgc3VwcG9ydHMgY29tbW9uIGV2ZW50cwogICAgLy8gcmV0dXJuIEZhbHNlCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjYzCiAgICAvLyBpZiBjb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9MQU0pIG9yIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDMKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNjMtMjY1CiAgICAvLyBpZiBjb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9MQU0pIG9yIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KAogICAgLy8gICAgIGVudW1zLkNUX05BTQogICAgLy8gKToKICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUAxMQogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDIKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAxNgoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlAMTE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNjYtMjcwCiAgICAvLyAjIExBTS9OQU0gYWRkOiBQUiwgSVBDQgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2OAogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUiksCiAgICBwdXNoaW50IDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2Ni0yNzAKICAgIC8vICMgTEFNL05BTSBhZGQ6IFBSLCBJUENCCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAxMwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNjkKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICBwdXNoaW50IDE4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNjYtMjcwCiAgICAvLyAjIExBTS9OQU0gYWRkOiBQUiwgSVBDQgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyApCiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMTQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMTM6CiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF9mYWxzZUAxNDoKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDE2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjcyCiAgICAvLyBpZiBjb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pOgogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDIzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzMtMjc4CiAgICAvLyAjIEFOTiBhZGRzOiBQUiwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3NQogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUiksCiAgICBwdXNoaW50IDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3My0yNzgKICAgIC8vICMgQU5OIGFkZHM6IFBSLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyMAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzYKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICBwdXNoaW50IDE4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzMtMjc4CiAgICAvLyAjIEFOTiBhZGRzOiBQUiwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjAKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjc3CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICBwdXNoaW50IDUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3My0yNzgKICAgIC8vICMgQU5OIGFkZHM6IFBSLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF9mYWxzZUAyMQoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyMDoKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDIxOgogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMjM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODAKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0xBWCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDMxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODEtMjg3CiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODMKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODEtMjg3CiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDI4CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4NAogICAgLy8gVUludDY0KGVudW1zLkVWVF9QSSksCiAgICBwdXNoaW50IDQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MS0yODcKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjgKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjg1CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgcHVzaGludCAxOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjgxLTI4NwogICAgLy8gIyBMQVggYWRkczogUFIsIFBJLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyOAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODYKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIHB1c2hpbnQgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjgxLTI4NwogICAgLy8gIyBMQVggYWRkczogUFIsIFBJLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF9mYWxzZUAyOQoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyODoKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDI5OgogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMzE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODkKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0NMTSk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDMzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyOTAtMjkxCiAgICAvLyAjIENMTSBhZGRzOiBQUgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QUikKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAzCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAzMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI5MwogICAgLy8gcmV0dXJuIEZhbHNlCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2lzX2R5bmFtaWNfYW5udWl0eSgpIC0+IHVpbnQ2NDoKX2lzX2R5bmFtaWNfYW5udWl0eToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMzNQogICAgLy8gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM1LTMzNgogICAgLy8gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICAvLyBhbmQgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBieiBfaXNfZHluYW1pY19hbm51aXR5X2Jvb2xfZmFsc2VAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM2CiAgICAvLyBhbmQgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzQgLy8gImR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMzNS0zMzYKICAgIC8vIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKQogICAgLy8gYW5kIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgYnogX2lzX2R5bmFtaWNfYW5udWl0eV9ib29sX2ZhbHNlQDMKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzQtMzM3CiAgICAvLyByZXR1cm4gKAogICAgLy8gICAgIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKQogICAgLy8gICAgIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIC8vICkKICAgIHJldHN1YgoKX2lzX2R5bmFtaWNfYW5udWl0eV9ib29sX2ZhbHNlQDM6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM0LTMzNwogICAgLy8gcmV0dXJuICgKICAgIC8vICAgICBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIC8vICAgICBhbmQgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICAvLyApCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfaW50ZXJlc3Rfc2VnbWVudChlbnRyeTogYnl0ZXMpIC0+IHVpbnQ2NCwgYnl0ZXM6Cl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzgwCiAgICAvLyBkZWYgX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoc2VsZiwgZW50cnk6IHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM4OQogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMTcKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM4OS0zOTEKICAgIC8vIGVudHJ5LmFjY3J1YWxfZmFjdG9yID09IFVJbnQ2NCgwKQogICAgLy8gb3Igc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPT0gVUludDY0KDApCiAgICBieiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudF9pZl9ib2R5QDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5MAogICAgLy8gb3Igc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPT0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM4OS0zOTEKICAgIC8vIGVudHJ5LmFjY3J1YWxfZmFjdG9yID09IFVJbnQ2NCgwKQogICAgLy8gb3Igc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPT0gVUludDY0KDApCiAgICBieiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudF9pZl9ib2R5QDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5MQogICAgLy8gb3Igc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID09IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM4OS0zOTEKICAgIC8vIGVudHJ5LmFjY3J1YWxfZmFjdG9yID09IFVJbnQ2NCgwKQogICAgLy8gb3Igc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPT0gVUludDY0KDApCiAgICBibnogX2VudHJ5X2ludGVyZXN0X3NlZ21lbnRfYWZ0ZXJfaWZfZWxzZUA0CgpfZW50cnlfaW50ZXJlc3Rfc2VnbWVudF9pZl9ib2R5QDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozOTMKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9kaWcgLTEKICAgIHVuY292ZXIgMgogICAgcmV0c3ViCgpfZW50cnlfaW50ZXJlc3Rfc2VnbWVudF9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozOTUKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozOTYKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozOTcKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozOTQtMzk4CiAgICAvLyBhY2NydWVkID0gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlLAogICAgLy8gICAgIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICAvLyApCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDAyCiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzk5LTQwMwogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIGFjY3J1ZWQsCiAgICAvLyAgICAgZW50cnkuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgZnJhbWVfZGlnIC0xCiAgICB1bmNvdmVyIDIKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcihkaXNjb3VudF9mYWN0b3I6IHVpbnQ2NCwgcmVkZW1wdGlvbl9mYWN0b3I6IHVpbnQ2NCkgLT4gdWludDY0OgpfZGlzY291bnRfYW5udWl0eV9mYWN0b3I6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NjItNDY2CiAgICAvLyBkZWYgX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yKAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgZGlzY291bnRfZmFjdG9yOiBVSW50NjQsCiAgICAvLyAgICAgcmVkZW1wdGlvbl9mYWN0b3I6IFVJbnQ2NCwKICAgIC8vICkgLT4gVUludDY0OgogICAgcHJvdG8gMiAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NjgKICAgIC8vIGlmIHJlZGVtcHRpb25fZmFjdG9yID09IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMQogICAgYm56IF9kaXNjb3VudF9hbm51aXR5X2ZhY3Rvcl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ2OQogICAgLy8gcmV0dXJuIGRpc2NvdW50X2ZhY3RvcgogICAgZnJhbWVfZGlnIC0yCiAgICByZXRzdWIKCl9kaXNjb3VudF9hbm51aXR5X2ZhY3Rvcl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzAKICAgIC8vIHBlcmlvZF9yYXRlID0gc2VsZi5maXhlZF9wb2ludF9zY2FsZSArIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDcxCiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDcwLTQ3NAogICAgLy8gcGVyaW9kX3JhdGUgPSBzZWxmLmZpeGVkX3BvaW50X3NjYWxlICsgc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgcmVkZW1wdGlvbl9mYWN0b3IsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgZGlnIDIKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICArCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzUKICAgIC8vIGFzc2VydCBwZXJpb2RfcmF0ZSA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBkdXAKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3OAogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3Ni00ODAKICAgIC8vIHJldHVybiBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBkaXNjb3VudF9mYWN0b3IsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICAgICBwZXJpb2RfcmF0ZSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5KGVudHJ5OiBieXRlcywgcGF5bG9hZDogYnl0ZXMpIC0+IGJ5dGVzLCBieXRlczoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjEzLTYxNQogICAgLy8gZGVmIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeSgKICAgIC8vICAgICBzZWxmLCBlbnRyeTogdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnksIHBheWxvYWQ6IHR5cC5PYnNlcnZlZEV2ZW50UmVxdWVzdAogICAgLy8gKSAtPiBOb25lOgogICAgcHJvdG8gMiAyCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYyMwogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X2lkID09IHNlbGYuZXZlbnRfY3Vyc29yLCBlcnIuSU5WQUxJRF9FVkVOVF9DVVJTT1IKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBjdXJzb3IKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYyNAogICAgLy8gYXNzZXJ0IGVudHJ5LnNjaGVkdWxlZF90aW1lIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLCBlcnIuTk9fRFVFX0NBU0hGTE9XCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIDw9CiAgICBhc3NlcnQgLy8gTm8gZHVlIGNhc2hmbG93IHRvIHBheQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjI2CiAgICAvLyBldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MjcKICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9JRUQpOgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBkdXAKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MjgtNjMwCiAgICAvLyAjIElFRCBmaW5hbGl6ZXMgaXNzdWFuY2U6IHJlc2VydmVkIHVuaXRzIGJlY29tZSBhY3RpdmF0YWJsZSBhbmQgdGhlCiAgICAvLyAjIHNjaGVkdWxlJ3MgaW5pdGlhbCBjb250cmFjdHVhbCBzdGF0ZSBiZWNvbWVzIGxpdmUuCiAgICAvLyBhc3NlcnQgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjMyCiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID09IHNlbGYudG90YWxfdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYzMS02MzMKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCA9PSBzZWxmLnRvdGFsX3VuaXRzCiAgICAvLyApLCBlcnIuUFJJTUFSWV9ESVNUUklCVVRJT05fSU5DT01QTEVURQogICAgYXNzZXJ0IC8vIFByaW1hcnkgZGlzdHJpYnV0aW9uIGlzIG5vdCBjb21wbGV0ZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM0CiAgICAvLyBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9IGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYzNQogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM2CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IGVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM3CiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYzOAogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gZW50cnkubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDQxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM5CiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NDAKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGVudW1zLlNUQVRVU19BQ1RJVkUpCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBwdXNoaW50IDEwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ1MQogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkgPT0gVUludDY0KGVudW1zLkVWVF9JRUQpLCBlcnIuTk9UX0VWVF9JRUQKICAgIGZyYW1lX2RpZyAxMQogICAgYXNzZXJ0IC8vIE5vdCBJRUQgZXZlbnQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ1MgogICAgLy8gcmV0dXJuIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMCAvLyAiaW5pdGlhbF9leGNoYW5nZV9hbW91bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NDEtNjQ1CiAgICAvLyBzZWxmLl9lbWl0X2V4ZWN1dGlvbl9ldmVudCgKICAgIC8vICAgICBlbnRyeT1lbnRyeSwKICAgIC8vICAgICBwYXlvZmY9c2VsZi5fZW50cnlfaWVkX2Ftb3VudChlbnRyeSksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NDQKICAgIC8vIHNldHRsZWRfYW1vdW50PVVJbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NDEtNjQ1CiAgICAvLyBzZWxmLl9lbWl0X2V4ZWN1dGlvbl9ldmVudCgKICAgIC8vICAgICBlbnRyeT1lbnRyeSwKICAgIC8vICAgICBwYXlvZmY9c2VsZi5fZW50cnlfaWVkX2Ftb3VudChlbnRyeSksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgY2FsbHN1YiBfZW1pdF9leGVjdXRpb25fZXZlbnQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAtMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjQ2CiAgICAvLyByZXR1cm4KICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfYnVyeSAxCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDcKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NDkKICAgIC8vIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCArPSBzZWxmLl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KGVudHJ5KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudAogICAgZnJhbWVfYnVyeSAtMgogICAgKwogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NTEKICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9SUik6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgMTIKICAgID09CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDEwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NTUKICAgIC8vIHBheWxvYWQub2JzZXJ2ZWRfcmF0ZSwKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAzMwogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1NgogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzYgLy8gInJhdGVfcmVzZXRfbXVsdGlwbGllciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NTcKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NTItNjU4CiAgICAvLyAjIFJSIGRlcml2ZXMgdGhlIG5leHQgcmF0ZSBmcm9tIGFuIG9ic2VydmVkIG9yYWNsZSB2YWx1ZSBwbHVzIHRoZQogICAgLy8gIyBjb250cmFjdCBzcHJlYWQgLyBtdWx0aXBsaWVyIHRlcm1zLCB0aGVuIGVuZm9yY2VzIGZsb29yIGFuZCBjYXAuCiAgICAvLyBvYnNlcnZlZF9yYXRlID0gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgcGF5bG9hZC5vYnNlcnZlZF9yYXRlLAogICAgLy8gICAgIHNlbGYucmF0ZV9yZXNldF9tdWx0aXBsaWVyLAogICAgLy8gICAgIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICAvLyApCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjYwCiAgICAvLyBvYnNlcnZlZF9yYXRlICsgc2VsZi5yYXRlX3Jlc2V0X3NwcmVhZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDM1IC8vICJyYXRlX3Jlc2V0X3NwcmVhZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X3NwcmVhZCBleGlzdHMKICAgICsKICAgIGZyYW1lX2J1cnkgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzQxCiAgICAvLyBpZiBzZWxmLmhhc19yYXRlX3Jlc2V0X2Zsb29yIGFuZCByYXRlIDwgc2VsZi5yYXRlX3Jlc2V0X2Zsb29yOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDM4IC8vICJoYXNfcmF0ZV9yZXNldF9mbG9vciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5oYXNfcmF0ZV9yZXNldF9mbG9vciBleGlzdHMKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU1CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzAgLy8gInJhdGVfcmVzZXRfZmxvb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9mbG9vciBleGlzdHMKICAgIGZyYW1lX2RpZyA2CiAgICA+CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1NQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzQyCiAgICAvLyByYXRlID0gc2VsZi5yYXRlX3Jlc2V0X2Zsb29yCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzAgLy8gInJhdGVfcmVzZXRfZmxvb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSA2CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X2Zsb29yIGV4aXN0cwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDMKICAgIC8vIGlmIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwIGFuZCByYXRlID4gc2VsZi5yYXRlX3Jlc2V0X2NhcDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzOSAvLyAiaGFzX3JhdGVfcmVzZXRfY2FwIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmhhc19yYXRlX3Jlc2V0X2NhcCBleGlzdHMKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU4CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzEgLy8gInJhdGVfcmVzZXRfY2FwIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfY2FwIGV4aXN0cwogICAgZnJhbWVfZGlnIDYKICAgIDwKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDQKICAgIC8vIHJhdGUgPSBzZWxmLnJhdGVfcmVzZXRfY2FwCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzEgLy8gInJhdGVfcmVzZXRfY2FwIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgNgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9jYXAgZXhpc3RzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1ODoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1OQogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPSBzZWxmLl9jbGFtcF9yYXRlKAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjU5LTY2MQogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPSBzZWxmLl9jbGFtcF9yYXRlKAogICAgLy8gICAgIG9ic2VydmVkX3JhdGUgKyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkCiAgICAvLyApCiAgICBmcmFtZV9kaWcgNgogICAgYXBwX2dsb2JhbF9wdXQKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjcxCiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUEkpOgogICAgZnJhbWVfZGlnIDEwCiAgICBwdXNoaW50IDQKICAgID09CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDIwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzIKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjczCiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAyMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY3OAogICAgLy8gaWYgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCk6CiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMjkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY3OQogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1BSRik6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgNQogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDMwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODMKICAgIC8vICsgKHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgLSBzZWxmLmV2ZW50X2N1cnNvcikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njg0CiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfUEVSX0VOVFJZX0JVREdFVCkKICAgIHB1c2hpbnQgMTAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODMtNjg0CiAgICAvLyArIChzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IC0gc2VsZi5ldmVudF9jdXJzb3IpCiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfUEVSX0VOVFJZX0JVREdFVCkKICAgICoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4MgogICAgLy8gVUludDY0KGNzdC5PUF9VUF9OT05fQ0FTSF9CQVNFX0JVREdFVCkKICAgIGludGMgNCAvLyAxNTAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODItNjg0CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX05PTl9DQVNIX0JBU0VfQlVER0VUKQogICAgLy8gKyAoc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCAtIHNlbGYuZXZlbnRfY3Vyc29yKQogICAgLy8gKiBVSW50NjQoY3N0Lk9QX1VQX05PTl9DQVNIX1BFUl9FTlRSWV9CVURHRVQpCiAgICArCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODAtNjg2CiAgICAvLyBlbnN1cmVfYnVkZ2V0KAogICAgLy8gICAgIHJlcXVpcmVkX2J1ZGdldD0oCiAgICAvLyAgICAgICAgIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfQkFTRV9CVURHRVQpCiAgICAvLyAgICAgICAgICsgKHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgLSBzZWxmLmV2ZW50X2N1cnNvcikKICAgIC8vICAgICAgICAgKiBVSW50NjQoY3N0Lk9QX1VQX05PTl9DQVNIX1BFUl9FTlRSWV9CVURHRVQpCiAgICAvLyAgICAgKSwKICAgIC8vICkKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5MAogICAgLy8gZGlzY291bnRfZmFjdG9yID0gc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0OTEKICAgIC8vIGRlbm9taW5hdG9yID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0OTIKICAgIC8vIHNraXBfZmlyc3RfcmVkZW1wdGlvbiA9IEZhbHNlCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSA3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0OTQKICAgIC8vIGlmIGVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IgPiBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMjUKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgOAogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMzUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5NS00OTkKICAgIC8vICMgQW4gaW5pdGlhbCBQUkYgbWF5IGRlc2NyaWJlIHRoZSBmaXJzdCByZWRlbXB0aW9uIHBlcmlvZCBkaXJlY3RseS4KICAgIC8vIGRpc2NvdW50X2ZhY3RvciA9IHNlbGYuX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yKAogICAgLy8gICAgIGRpc2NvdW50X2ZhY3RvciwKICAgIC8vICAgICBlbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyA4CiAgICBjYWxsc3ViIF9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwMQogICAgLy8gc2tpcF9maXJzdF9yZWRlbXB0aW9uID0gVHJ1ZQogICAgaW50Y18xIC8vIDEKICAgIGZyYW1lX2J1cnkgNwogICAgZnJhbWVfYnVyeSAxCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAzNToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwMwogICAgLy8gZnV0dXJlX2V2ZW50X2lkID0gc2VsZi5ldmVudF9jdXJzb3IgKyBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X3doaWxlX3RvcEAzNjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwNAogICAgLy8gd2hpbGUgZnV0dXJlX2V2ZW50X2lkIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGZyYW1lX2RpZyAzCiAgICA+CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfd2hpbGVANDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwNQogICAgLy8gZnV0dXJlX2VudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KGZ1dHVyZV9ldmVudF9pZCkKICAgIGZyYW1lX2RpZyAzCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MDYKICAgIC8vIGZ1dHVyZV9ldmVudF90eXBlID0gZnV0dXJlX2VudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA3LTUwOAogICAgLy8gIyBPbmx5IHJlZGVtcHRpb24tYmVhcmluZyBldmVudHMgY29udHJpYnV0ZSB0byB0aGUgYW5udWl0eSBkZW5vbWluYXRvci4KICAgIC8vIGlzX3JlZGVtcHRpb25fZXZlbnQgPSBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1BSKSBvciAoCiAgICBwdXNoaW50IDMKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MDctNTExCiAgICAvLyAjIE9ubHkgcmVkZW1wdGlvbi1iZWFyaW5nIGV2ZW50cyBjb250cmlidXRlIHRvIHRoZSBhbm51aXR5IGRlbm9taW5hdG9yLgogICAgLy8gaXNfcmVkZW1wdGlvbl9ldmVudCA9IGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpIG9yICgKICAgIC8vICAgICBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgLy8gICAgIGFuZCBmdXR1cmVfZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKQogICAgLy8gKQogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX3RydWVANDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwOQogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCkKICAgIGZyYW1lX2RpZyA0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA5LTUxMAogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCkKICAgIC8vIGFuZCBmdXR1cmVfZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUxMAogICAgLy8gYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICBmcmFtZV9kaWcgMAogICAgcHVzaGludCAyNQogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwOS01MTAKICAgIC8vIGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfTUQpCiAgICAvLyBhbmQgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IgPiBVSW50NjQoMCkKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX2ZhbHNlQDQxCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF90cnVlQDQwOgogICAgaW50Y18xIC8vIDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX21lcmdlQDQyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTEyCiAgICAvLyBpZiBpc19yZWRlbXB0aW9uX2V2ZW50OgogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANDcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUxMwogICAgLy8gaWYgc2tpcF9maXJzdF9yZWRlbXB0aW9uOgogICAgZnJhbWVfZGlnIDcKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlANDUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUxNAogICAgLy8gc2tpcF9maXJzdF9yZWRlbXB0aW9uID0gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDcKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDQ3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTIxCiAgICAvLyBmdXR1cmVfZXZlbnRfaWQgKz0gVUludDY0KDEpCiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMwogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfd2hpbGVfdG9wQDM2CgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDQ1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTE4CiAgICAvLyBmdXR1cmVfZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIGZyYW1lX2RpZyAwCiAgICBwdXNoaW50IDI1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTE2LTUxOQogICAgLy8gZGlzY291bnRfZmFjdG9yID0gc2VsZi5fZGlzY291bnRfYW5udWl0eV9mYWN0b3IoCiAgICAvLyAgICAgZGlzY291bnRfZmFjdG9yLAogICAgLy8gICAgIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDIKICAgIHN3YXAKICAgIGNhbGxzdWIgX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTIwCiAgICAvLyBkZW5vbWluYXRvciArPSBkaXNjb3VudF9mYWN0b3IKICAgIGZyYW1lX2RpZyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANDcKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX2ZhbHNlQDQxOgogICAgaW50Y18wIC8vIDAKICAgIGIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfbWVyZ2VANDIKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl93aGlsZUA0ODoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUyMwogICAgLy8gYXNzZXJ0IGRlbm9taW5hdG9yID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGZyYW1lX2RpZyAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjQKICAgIC8vIG51bWVyYXRvciA9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUyNQogICAgLy8gaWYgZW50cnkuZmxhZ3MgJiBVSW50NjQoZW51bXMuRkxBR19JTklUSUFMX1BSRikgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDU3CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18yIC8vIDgKICAgICYKICAgIGJueiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1MAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTI2LTUyNwogICAgLy8gIyBTdWJzZXF1ZW50IFBSRiBldmVudHMgYW1vcnRpemUgYm90aCBwcmluY2lwYWwgYW5kIGFscmVhZHkgYWNjcnVlZCBjYXJyeS4KICAgIC8vIG51bWVyYXRvciArPSBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICArCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1MDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUzMAogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUyOC01MzIKICAgIC8vIHJldHVybiBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBudW1lcmF0b3IsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICAgICBkZW5vbWluYXRvciwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAxCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njg3CiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBzZWxmLl9yZWNhbGN1bGF0ZV9hbm51aXR5X3BheW1lbnQoCiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4Ny02ODkKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IHNlbGYuX3JlY2FsY3VsYXRlX2FubnVpdHlfcGF5bWVudCgKICAgIC8vICAgICBlbnRyeQogICAgLy8gKQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDMwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjkyCiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OTMtNjk3CiAgICAvLyBzZWxmLl9lbWl0X2V4ZWN1dGlvbl9ldmVudCgKICAgIC8vICAgICBlbnRyeT1lbnRyeSwKICAgIC8vICAgICBwYXlvZmY9VUludDY0KDApLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njk1CiAgICAvLyBwYXlvZmY9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY5NgogICAgLy8gc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OTMtNjk3CiAgICAvLyBzZWxmLl9lbWl0X2V4ZWN1dGlvbl9ldmVudCgKICAgIC8vICAgICBlbnRyeT1lbnRyeSwKICAgIC8vICAgICBwYXlvZmY9VUludDY0KDApLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGNhbGxzdWIgX2VtaXRfZXhlY3V0aW9uX2V2ZW50CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfYnVyeSAxCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAyOToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY5MQogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gZW50cnkubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDQxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAzMAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAyMDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY3NAogICAgLy8gZWxpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfSVBDQik6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgMTgKICAgID09CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAyMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc1LTY3NgogICAgLy8gIyBJUENCIGtlZXBzIHByaW5jaXBhbCB1bmNoYW5nZWQgYW5kIG9ubHkgcmVzZXRzIHRoZSBpbnRlcmVzdCBiYXNlLgogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDIzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDEwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjYyCiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9SUkYpOgogICAgZnJhbWVfZGlnIDEwCiAgICBwdXNoaW50IDExCiAgICA9PQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAxNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjYzCiAgICAvLyBuZXh0X3JhdGUgPSBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZQogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2NAogICAgLy8gaWYgbmV4dF9yYXRlID09IFVJbnQ2NCgwKToKICAgIGJueiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAxMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY1CiAgICAvLyBuZXh0X3JhdGUgPSBzZWxmLnJhdGVfcmVzZXRfbmV4dAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDM3IC8vICJyYXRlX3Jlc2V0X25leHQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSA1CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X25leHQgZXhpc3RzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2NgogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPSBuZXh0X3JhdGUKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGZyYW1lX2RpZyA1CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAxOAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAxNDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2OAogICAgLy8gaWYgZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUgIT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDkKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjkKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGZyYW1lX2RpZyA5CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAxOAoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbWl0X2V4ZWN1dGlvbl9ldmVudChlbnRyeTogYnl0ZXMsIHBheW9mZjogdWludDY0LCBzZXR0bGVkX2Ftb3VudDogdWludDY0KSAtPiBieXRlczoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzAzLTcwOQogICAgLy8gZGVmIF9lbWl0X2V4ZWN1dGlvbl9ldmVudCgKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgICosCiAgICAvLyAgICAgZW50cnk6IHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5LAogICAgLy8gICAgIHBheW9mZjogVUludDY0LAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50OiBVSW50NjQsCiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAzIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxMwogICAgLy8gY29udHJhY3RfaWQ9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25faWQuaWQsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uSUQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxNAogICAgLy8gZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE1CiAgICAvLyBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICBmcmFtZV9kaWcgLTMKICAgIGV4dHJhY3QgOCAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTYKICAgIC8vIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgZnJhbWVfZGlnIC0zCiAgICBleHRyYWN0IDkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE3CiAgICAvLyBhcHBsaWVkX2F0PUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIwCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBmcmFtZV9kaWcgLTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxNQogICAgLy8gZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgaW50Y18yIC8vIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcyMAogICAgLy8gc2VsZi5fcGF5b2ZmX3NpZ24oZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSwgcGF5b2ZmKQogICAgZ2V0Ynl0ZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzQ5CiAgICAvLyBpZiBwYXlvZmYgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0yCiAgICBibnogX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzUwCiAgICAvLyByZXR1cm4gVUludDY0KGVudW1zLlBBWU9GRl9TSUdOX1BPU0lUSVZFKQogICAgaW50Y18xIC8vIDEKCl9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9wYXlvZmZfc2lnbkA3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE5LTcyMQogICAgLy8gcGF5b2ZmX3NpZ249YXJjNC5VSW50OCgKICAgIC8vICAgICBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICAvLyApLAogICAgaXRvYgogICAgZHVwCiAgICBiaXRsZW4KICAgIGludGNfMiAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBleHRyYWN0IDcgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIzCiAgICAvLyBjdXJyZW5jeV9pZD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcyNAogICAgLy8gc2VxdWVuY2U9ZW50cnkuZXZlbnRfaWQgKyBVSW50NjQoMSksCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzEyLTcyNQogICAgLy8gRXhlY3V0aW9uRXZlbnQoCiAgICAvLyAgICAgY29udHJhY3RfaWQ9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25faWQuaWQsCiAgICAvLyAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgcGF5b2ZmPXBheW9mZiwKICAgIC8vICAgICBwYXlvZmZfc2lnbj1hcmM0LlVJbnQ4KAogICAgLy8gICAgICAgICBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBzZXR0bGVkX2Ftb3VudD1zZXR0bGVkX2Ftb3VudCwKICAgIC8vICAgICBjdXJyZW5jeV9pZD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgc2VxdWVuY2U9ZW50cnkuZXZlbnRfaWQgKyBVSW50NjQoMSksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMAogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAyCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAzCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyA0CiAgICBpdG9iCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMgogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxMS03MjYKICAgIC8vIGFyYzQuZW1pdCgKICAgIC8vICAgICBFeGVjdXRpb25FdmVudCgKICAgIC8vICAgICAgICAgY29udHJhY3RfaWQ9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25faWQuaWQsCiAgICAvLyAgICAgICAgIGV2ZW50X2lkPWVudHJ5LmV2ZW50X2lkLAogICAgLy8gICAgICAgICBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICAvLyAgICAgICAgIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgICAgICBhcHBsaWVkX2F0PUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gICAgICAgICBwYXlvZmY9cGF5b2ZmLAogICAgLy8gICAgICAgICBwYXlvZmZfc2lnbj1hcmM0LlVJbnQ4KAogICAgLy8gICAgICAgICAgICAgc2VsZi5fcGF5b2ZmX3NpZ24oZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSwgcGF5b2ZmKQogICAgLy8gICAgICAgICApLAogICAgLy8gICAgICAgICBzZXR0bGVkX2Ftb3VudD1zZXR0bGVkX2Ftb3VudCwKICAgIC8vICAgICAgICAgY3VycmVuY3lfaWQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgICAgICBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIC8vICAgICApCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHg5YTMzMmI5NSAvLyBtZXRob2QgIkV4ZWN1dGlvbkV2ZW50KHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NTEKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gKFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwgVUludDY0KGVudW1zLkVWVF9QSSkpOgogICAgZnJhbWVfZGlnIDUKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYm56IF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9pZl9ib2R5QDUKICAgIGZyYW1lX2RpZyA1CiAgICBwdXNoaW50IDQKICAgID09CiAgICBieiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUA2CgpfZW1pdF9leGVjdXRpb25fZXZlbnRfaWZfYm9keUA1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzUyCiAgICAvLyByZXR1cm4gVUludDY0KGVudW1zLlBBWU9GRl9TSUdOX1BPU0lUSVZFKQogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcyMAogICAgLy8gc2VsZi5fcGF5b2ZmX3NpZ24oZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSwgcGF5b2ZmKQogICAgYiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fcGF5b2ZmX3NpZ25ANwoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc1MwogICAgLy8gcmV0dXJuIFVJbnQ2NChlbnVtcy5QQVlPRkZfU0lHTl9ORUdBVElWRSkKICAgIHB1c2hpbnQgMjU1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MjAKICAgIC8vIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIGIgX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX3BheW9mZl9zaWduQDcKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fcm9sZV9pc19hY3RpdmUocm9sZV9tYXA6IGJ5dGVzLCByb2xlX2FkZHJlc3M6IGJ5dGVzKSAtPiB1aW50NjQ6Cl9yb2xlX2lzX2FjdGl2ZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NwogICAgLy8gZGVmIF9yb2xlX2lzX2FjdGl2ZShzZWxmLCByb2xlX21hcDogdHlwLlJiYWNSb2xlLCByb2xlX2FkZHJlc3M6IEFjY291bnQpIC0+IGJvb2w6CiAgICBwcm90byAyIDEKICAgIHB1c2hieXRlcyAiIgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU4LTYyCiAgICAvLyByZXR1cm4gc2VsZi5faGFzX3JvbGUocm9sZV9tYXAsIHJvbGVfYWRkcmVzcykgYW5kICgKICAgIC8vICAgICByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICkKICAgIGJ6IF9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIEJveE1hcCBlbnRyeSBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYwCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MAogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgPD0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYxCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIEJveE1hcCBlbnRyeSBleGlzdHMKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYwLTYxCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDAKICAgID49CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTktNjEKICAgIC8vIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IF9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQKICAgIGludGNfMSAvLyAxCgpfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU4LTYyCiAgICAvLyByZXR1cm4gc2VsZi5faGFzX3JvbGUocm9sZV9tYXAsIHJvbGVfYWRkcmVzcykgYW5kICgKICAgIC8vICAgICByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICkKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgX3JvbGVfaXNfYWN0aXZlX2Jvb2xfbWVyZ2VANQoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkgLT4gdm9pZDoKX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjUKICAgIC8vIGFzc2VydCBzZWxmLl9pc19hcnJhbmdlcihUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjUyCiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzID09IHNlbGYuYXJyYW5nZXIudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOCAvLyAweDUyM2E0MTUyNTIyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgPT0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2NQogICAgLy8gYXNzZXJ0IHNlbGYuX2lzX2FycmFuZ2VyKFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpIC0+IHZvaWQ6Cl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4MwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFzc2V0X2RlZmF1bHRlZCwgZXJyLkRFRkFVTFRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQxIC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfZGVmYXVsdGVkIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIERlZmF1bHRlZAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkgLT4gdm9pZDoKX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg2CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYXNzZXRfc3VzcGVuZGVkLCBlcnIuU1VTUEVOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzMgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9zdXNwZW5kZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gU3VzcGVuZGVkIG9wZXJhdGlvbnMKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkOiB1aW50NjQpIC0+IHZvaWQ6Cl9hc3NlcnRfdmFsaWRfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OAogICAgLy8gZGVmIF9hc3NlcnRfdmFsaWRfcm9sZShzZWxmLCByb2xlX2lkOiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTAKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIHB1c2hpbnQgMjAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkxCiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgcHVzaGludCAyNQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTIKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICBwdXNoaW50IDQwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MwogICAgLy8gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgcHVzaGludCA1MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTQKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgcHVzaGludCA2MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTUKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICBwdXNoaW50IDcwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NgogICAgLy8gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgcHVzaGludCA4MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfZmFsc2VAOAoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3OgogICAgaW50Y18xIC8vIDEKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX21lcmdlQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgcmV0c3ViCgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9mYWxzZUA4OgogICAgaW50Y18wIC8vIDAKICAgIGIgX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfbWVyZ2VAOQo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="}, "sourceInfo": {"approval": {"pcOffsetMethod": "none", "sourceInfo": [{"pc": [2648], "errorMessage": "ACTUS event not yet executed"}, {"pc": [2406], "errorMessage": "Can not distribute zero units"}, {"pc": [3149, 3156, 3529], "errorMessage": "D-ASA already configured"}, {"pc": [1255, 1987, 2366, 2512, 3746, 3892, 4243, 4474, 4620], "errorMessage": "D-ASA not configured"}, {"pc": [3540], "errorMessage": "D-ASA terms not configured"}, {"pc": [6809], "errorMessage": "Defaulted"}, {"pc": [3167], "errorMessage": "Denomination asset is not properly set"}, {"pc": [3182], "errorMessage": "Different settlement asset not supported, must be equal to denomination asset"}, {"pc": [3418, 3425, 3427], "errorMessage": "IED must be set in the future"}, {"pc": [1273, 2056, 2527, 4261, 6161], "errorMessage": "IED not yet executed"}, {"pc": [2419, 5544], "errorMessage": "Insufficient remaining D-ASA units"}, {"pc": [2622, 2688], "errorMessage": "Insufficient sender units to transfer"}, {"pc": [1883, 3069, 3087, 3143, 3620, 3656, 4308, 5728, 6006, 6066, 6469], "errorMessage": "Invalid ACTUS configuration"}, {"pc": [1996, 2400, 2583, 2598, 2755, 2828, 2891, 2933, 5356, 5481], "errorMessage": "Invalid account holding address"}, {"pc": [4811, 4835, 4859, 4883, 4907, 4964, 4992, 5014, 5036, 5058, 5237, 5255, 5270, 5285, 5300], "errorMessage": "Invalid account role address"}, {"pc": [3129], "errorMessage": "Invalid day-count convention ID"}, {"pc": [1386, 3767, 4095, 6038], "errorMessage": "Invalid event cursor"}, {"pc": [3605, 3668, 3944, 4285, 5644], "errorMessage": "Invalid event id"}, {"pc": [3780, 4159, 4166, 4298], "errorMessage": "Invalid event type"}, {"pc": [4948, 5227, 6879], "errorMessage": "Invalid role identifier"}, {"pc": [3534, 3680, 3688, 3997, 4372, 5659, 5675], "errorMessage": "Invalid schedule page"}, {"pc": [5592], "errorMessage": "No D-ASA units"}, {"pc": [1392, 1912, 2093, 6047], "errorMessage": "No due cashflow to pay"}, {"pc": [6130], "errorMessage": "Not IED event"}, {"pc": [2041, 2374, 2570, 2745, 2801, 2811, 2897, 4194, 5081, 6801], "errorMessage": "Not authorized"}, {"pc": [1513, 1521, 2142, 2216, 2225], "errorMessage": "Not enough funds for the payment"}, {"pc": [3917, 3930, 4270], "errorMessage": "Observed event required to execute this action"}, {"pc": [2388, 2436], "errorMessage": "Primary distribution is closed"}, {"pc": [6078], "errorMessage": "Primary distribution is not complete"}, {"pc": [2611], "errorMessage": "Sender and receiver must be different"}, {"pc": [5342, 6817], "errorMessage": "Suspended operations"}, {"pc": [2323, 3646, 4330], "errorMessage": "Time events must be sorted in strictly ascending order"}, {"pc": [2544, 2561], "errorMessage": "Transfer is closed"}, {"pc": [2615], "errorMessage": "Transfer units must be greater than zero"}, {"pc": [939], "errorMessage": "Wrong Global Bytes allocation"}, {"pc": [945], "errorMessage": "Wrong Global UInts allocation"}, {"pc": [949], "errorMessage": "Wrong Local Bytes allocation"}, {"pc": [953], "errorMessage": "Wrong Local UInts allocation"}, {"pc": [1494, 2135], "errorMessage": "account opted into asset"}, {"pc": [6761, 6776], "errorMessage": "check BoxMap entry exists"}, {"pc": [2032, 2070, 2111, 2149, 2440, 2618, 2677, 2703, 5336, 5502], "errorMessage": "check self.account entry exists"}, {"pc": [1575, 1807, 1895, 4531, 6166, 6489], "errorMessage": "check self.accrued_interest exists"}, {"pc": [5099, 6799], "errorMessage": "check self.arranger exists"}, {"pc": [6807], "errorMessage": "check self.asset_defaulted exists"}, {"pc": [6815], "errorMessage": "check self.asset_suspended exists"}, {"pc": [3077, 3523, 3913, 3925, 4266, 4479, 5890], "errorMessage": "check self.contract_type exists"}, {"pc": [1543, 4536, 5364, 5442], "errorMessage": "check self.cumulative_interest_index exists"}, {"pc": [1555, 4541, 5375, 5450], "errorMessage": "check self.cumulative_principal_index exists"}, {"pc": [5900], "errorMessage": "check self.dynamic_principal_redemption exists"}, {"pc": [1311, 1323, 1384, 1626, 2626, 2638, 3759, 4088, 4507, 4624, 4636, 4673, 5457, 6036, 6118, 6315, 6370, 6508], "errorMessage": "check self.event_cursor exists"}, {"pc": [5390, 5404, 5597, 5626, 5956, 5964, 5991, 6011, 6201, 6334, 6495], "errorMessage": "check self.fixed_point_scale exists"}, {"pc": [6244], "errorMessage": "check self.has_rate_reset_cap exists"}, {"pc": [6217], "errorMessage": "check self.has_rate_reset_floor exists"}, {"pc": [3154, 3539, 4503, 6135], "errorMessage": "check self.initial_exchange_amount exists"}, {"pc": [2424, 2434], "errorMessage": "check self.initial_exchange_date exists"}, {"pc": [1751, 4521, 5932, 5946], "errorMessage": "check self.interest_calculation_base exists"}, {"pc": [1823, 1838], "errorMessage": "check self.next_principal_redemption exists"}, {"pc": [4526, 5924, 5951, 5996], "errorMessage": "check self.nominal_interest_rate exists"}, {"pc": [2001, 2014], "errorMessage": "check self.op_daemon exists"}, {"pc": [1648, 1717, 1743, 1797, 1849, 1858, 1880, 4516, 6474, 6555], "errorMessage": "check self.outstanding_principal exists"}, {"pc": [6252, 6266], "errorMessage": "check self.rate_reset_cap exists"}, {"pc": [6225, 6239], "errorMessage": "check self.rate_reset_floor exists"}, {"pc": [6196], "errorMessage": "check self.rate_reset_multiplier exists"}, {"pc": [6589], "errorMessage": "check self.rate_reset_next exists"}, {"pc": [6209], "errorMessage": "check self.rate_reset_spread exists"}, {"pc": [1499, 2211, 4546], "errorMessage": "check self.reserved_interest exists"}, {"pc": [1504, 1533, 2221, 2236, 4551], "errorMessage": "check self.reserved_principal exists"}, {"pc": [2411, 2459, 4498, 5539, 6071], "errorMessage": "check self.reserved_units_total exists"}, {"pc": [1315, 2630, 3763, 3942, 3959, 4079, 4280, 4315, 4334, 4454, 4511, 4628, 5640, 6311, 6378], "errorMessage": "check self.schedule_entry_count exists"}, {"pc": [3987, 4362], "errorMessage": "check self.schedule_page entry exists"}, {"pc": [1491, 2101, 2129, 6661], "errorMessage": "check self.settlement_asset_id exists"}, {"pc": [1254, 1268, 1986, 2051, 2365, 2384, 2511, 2522, 2805, 3147, 3527, 3745, 3891, 4242, 4256, 4472, 4619, 5485, 6062, 6156], "errorMessage": "check self.status exists"}, {"pc": [2417, 2470, 4493, 5590, 5621, 6076], "errorMessage": "check self.total_units exists"}, {"pc": [2549, 2559], "errorMessage": "check self.transfer_closure_date exists"}, {"pc": [2532, 2540], "errorMessage": "check self.transfer_opening_date exists"}, {"pc": [3582, 3639], "errorMessage": "index access is out of bounds"}, {"pc": [1970, 3014, 3497, 3992, 4367], "errorMessage": "invalid array length header"}, {"pc": [2735, 3485, 5071], "errorMessage": "invalid number of bytes for arc4.bool"}, {"pc": [1978], "errorMessage": "invalid number of bytes for arc4.dynamic_array"}, {"pc": [3512], "errorMessage": "invalid number of bytes for arc4.dynamic_array"}, {"pc": [1964, 2349, 2489, 2497, 2727, 2785, 2793, 2873, 2881, 2924, 2949, 4692, 4716, 4750, 4931, 5113, 5197], "errorMessage": "invalid number of bytes for arc4.static_array"}, {"pc": [1249, 2307, 2316, 2357, 2506, 3475, 3876], "errorMessage": "invalid number of bytes for arc4.uint64"}, {"pc": [4740, 4921, 5187], "errorMessage": "invalid number of bytes for arc4.uint8"}, {"pc": [2986], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.InitialKernelState"}, {"pc": [2975], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.NormalizedActusTerms"}, {"pc": [4238], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.ObservedCashEventRequest"}, {"pc": [3887], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.ObservedEventRequest"}, {"pc": [3019], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.Prospectus"}, {"pc": [4761], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.RoleValidity"}, {"pc": [3003], "errorMessage": "invalid tail pointer at index 1 of (uint8[32],(len+utf8[]))"}, {"pc": [2998], "errorMessage": "invalid tuple encoding"}, {"pc": [4059, 4434], "errorMessage": "max array length exceeded"}, {"pc": [4485, 6653], "errorMessage": "overflow"}]}, "clear": {"pcOffsetMethod": "none", "sourceInfo": []}}, "templateVariables": {}}""" APP_SPEC = algokit_utils.Arc56Contract.from_json(_APP_SPEC_JSON) def _parse_abi_args(args: object | None = None) -> list[object] | None: diff --git a/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.approval.puya.map b/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.approval.puya.map index 4ccae3dc..ee7bfed4 100644 --- a/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.approval.puya.map +++ b/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.approval.puya.map @@ -4,7 +4,7 @@ "../../../modules/rbac.py", "../../mock_module_rbac/contract.py" ], - "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BmD;AAAf;;AAA5B;AAC4C;;AAAf;;AAA7B;AAkBA;;AAAuB;AAAvB;AACA;;AAAuB;AAAvB;AC3CR;;AAAA;;;AAAA;;;;;;AAAA;;;AAAA;;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;AAAA;AD8IK;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;;ACtIA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAEG;AAAsB;;AAAtB;AAFH;AAAA;AD8IG;;;AARH;AAAA;AAUA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAWG;;;AACA;AAAA;AAAA;AACO;;AAbV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAeA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAWG;;;AACA;;AAAA;AAAA;AACO;;AAbV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAeA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAsBG;;;AACA;;;AACwB;AAAA;;AAAxB;;;AA9Gc;AAAX;AAAX;;;AACY;AAAA;;AAAA;AA+GG;;AA1BV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAlFM;AAAW;;AAAX;AAAX;;;AACuC;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAyGJ;;;AAvGG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAqGJ;;;AAnGG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAiGJ;;;AA/FG;AAAW;;AAAX;AAAX;;;AACuC;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AA6FJ;;;AA3FG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;;;;AA4FP;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAmBG;;;AACA;;;AACwB;AAAA;;AAAxB;;;AA9GO;AAAW;AAAX;AAAP;AACc;;AAAX;AAAX;;;AACmC;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AA6GG;;AAvBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AApFM;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAwGJ;;;AAtGG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAoGJ;;;AAlGG;AAAW;;AAAX;AAAX;;;AACmC;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAgGJ;;;AA9FG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;;;;AA+FP;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AApK+B;AAAgB;;AAArC;;;AAAP;AAoLA;;AAAA;AAAA;AACO;;AAjBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BU;AAAA;AAAA;AAAA;AARV;AAAA;AAAA;AAAA;AAAA;AAAA;AAUA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAc4B;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AAlBP;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAcU;AACP;AAAA;;;AAES;AAIA;;;;;;;AALT;;AAAA;;;;;;;;;;;;;;AA+BQ;AAJI;;AAvRL;;AAAA;AAAA;AAAA;AAAA;;AAsRC;AAGO;AAAA;AA7ClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAsCe;AAlRL;;AAAA;AAAA;AAAA;AAAA;;AAiRC;AAGO;AAAA;AAxClB;;;AAiCe;;AA7QL;;AAAA;AAAA;AAAA;AAAA;;AA4QC;AAGO;AAAA;AAnClB;;;AA4Be;;AAxQL;;AAAA;AAAA;AAAA;AAAA;;AAuQC;AAGO;AAAA;AA9BlB;;;AAuBe;AAnQL;;AAAA;AAAA;AAAA;AAAA;;AAkQC;AAGO;AAAA;AAzBlB;;;AAkBkB;;;;;;;;;;;;;;;;;;AAlBlB;;;AA1OD;;;;;AAFW;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAGA;;;AACH;;AAAA;AAAA;AAAA;AAAA;AACG;;AAAA;AAAA;;AADH;AAAA;;;AAEG;;AAAA;AAAA;AAAA;;AAAA;AADA;;AAAA;AADH;;;;AADJ;;AAAA;;;;;AAOyB;;AAbF;AAAA;AAAA;AAAA;AAAhB;AAaP;;AAkBW;AAAA;;AAAA;AAAA;AAAJ;AAAP;;AAKJ;;;AACW;;AACH;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;AAAA;;AAMH;;AANG;AAAA;;;AAAA;;AAOH;;AAPG;AAAA;;;;AAAP;;;", + "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BmD;AAAf;;AAA5B;AAC4C;;AAAf;;AAA7B;AAkBA;;AAAuB;AAAvB;AACA;;AAAuB;AAAvB;AC3CR;;AAAA;;;AAAA;;;;;;AAAA;;;AAAA;;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;AAAA;AD8IK;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;;ACtIA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAEG;AAAsB;;AAAtB;AAFH;AAAA;ADoJG;;;AAdH;AAAA;AAgBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAcG;;;AACA;AAAA;AAAA;AACO;;AAhBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAcG;;;AACA;;AAAA;AAAA;AACO;;AAhBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAsBG;;;AACA;;;AACwB;AAAA;;AAAxB;;;AA1Hc;AAAX;AAAX;;;AACY;AAAA;;AAAA;AA2HG;;AA1BV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA9FM;AAAW;;AAAX;AAAX;;;AACuC;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAqHJ;;;AAnHG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAiHJ;;;AA/GG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AA6GJ;;;AA3GG;AAAW;;AAAX;AAAX;;;AACuC;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAyGJ;;;AAvGG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;;;;AAwGP;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAmBG;;;AACA;;;AACwB;AAAA;;AAAxB;;;AA1HO;AAAW;AAAX;AAAP;AACc;;AAAX;AAAX;;;AACmC;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAyHG;;AAvBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAhGM;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAoHJ;;;AAlHG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAgHJ;;;AA9GG;AAAW;;AAAX;AAAX;;;AACmC;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AA4GJ;;;AA1GG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;;;;AA2GP;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAhL+B;AAAgB;;AAArC;;;AAAP;AAgMA;;AAAA;AAAA;AACO;;AAjBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA8BU;AAAA;AAAA;AAAA;AAXV;AAAA;AAAA;AAAA;AAAA;AAAA;AAaA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAkB4B;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AAtBP;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAyBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAkBU;AACP;AAAA;;;AAES;AAIA;;;;;;;AALT;;AAAA;;;;;;;;;;;;;;AA+BQ;AAJI;;AA9SL;;AAAA;AAAA;AAAA;AAAA;;AA6SC;AAGO;AAAA;AAjDlB;AAAA;AAAA;AAAA;AAAA;AAAA;AA0Ce;AAzSL;;AAAA;AAAA;AAAA;AAAA;;AAwSC;AAGO;AAAA;AA5ClB;;;AAqCe;;AApSL;;AAAA;AAAA;AAAA;AAAA;;AAmSC;AAGO;AAAA;AAvClB;;;AAgCe;;AA/RL;;AAAA;AAAA;AAAA;AAAA;;AA8RC;AAGO;AAAA;AAlClB;;;AA2Be;AA1RL;;AAAA;AAAA;AAAA;AAAA;;AAyRC;AAGO;AAAA;AA7BlB;;;AAsBkB;;;;;;;;;;;;;;;;;;AAtBlB;;;AA7PD;;;;;AAFW;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAGA;;;AACH;;AAAA;AAAA;AAAA;AAAA;AACG;;AAAA;AAAA;;AADH;AAAA;;;AAEG;;AAAA;AAAA;AAAA;;AAAA;AADA;;AAAA;AADH;;;;AADJ;;AAAA;;;;;AAOyB;;AAbF;AAAA;AAAA;AAAA;AAAhB;AAaP;;AAkBW;AAAA;;AAAA;AAAA;AAAJ;AAAP;;AAKJ;;;AACW;;AACH;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;AAAA;;AAMH;;AANG;AAAA;;;AAAA;;AAOH;;AAPG;AAAA;;;;AAAP;;;", "op_pc_offset": 0, "pc_events": { "1": { @@ -15,9 +15,9 @@ "op": "intcblock 1 0 32 20" }, "7": { - "op": "bytecblock 0x151f7c75 0x5223417272616e67657223 0x5223417574686f7269747923 0x52234163636f756e744d616e6167657223 0x52235072696d6172794465616c657223 0x52235472757374656523 0x52234f6273657276657223 0x52234f704461656d6f6e23 \"asset_suspended\" \"asset_defaulted\"" + "op": "bytecblock 0x151f7c75 0x523a41525223 0x523a41555423 0x523a4d4e4723 0x523a50594423 0x523a54525323 0x523a4d4f4323 0x523a4f504423 \"asset_suspended\" \"asset_defaulted\"" }, - "141": { + "95": { "op": "txn ApplicationID", "defined_out": [ "tmp%0#0" @@ -26,59 +26,59 @@ "tmp%0#0" ] }, - "143": { + "97": { "op": "bnz main_after_if_else@2", "stack_out": [] }, - "146": { - "op": "bytec_1 // 0x5223417272616e67657223", + "100": { + "op": "bytec_1 // 0x523a41525223", "defined_out": [ - "0x5223417272616e67657223" + "0x523a41525223" ], "stack_out": [ - "0x5223417272616e67657223" + "0x523a41525223" ] }, - "147": { + "101": { "op": "global ZeroAddress", "defined_out": [ - "0x5223417272616e67657223", + "0x523a41525223", "tmp%0#2" ], "stack_out": [ - "0x5223417272616e67657223", + "0x523a41525223", "tmp%0#2" ] }, - "149": { + "103": { "op": "app_global_put", "stack_out": [] }, - "150": { - "op": "bytec 7 // 0x52234f704461656d6f6e23", + "104": { + "op": "bytec 7 // 0x523a4f504423", "defined_out": [ - "0x52234f704461656d6f6e23" + "0x523a4f504423" ], "stack_out": [ - "0x52234f704461656d6f6e23" + "0x523a4f504423" ] }, - "152": { + "106": { "op": "global ZeroAddress", "defined_out": [ - "0x52234f704461656d6f6e23", + "0x523a4f504423", "tmp%1#2" ], "stack_out": [ - "0x52234f704461656d6f6e23", + "0x523a4f504423", "tmp%1#2" ] }, - "154": { + "108": { "op": "app_global_put", "stack_out": [] }, - "155": { + "109": { "op": "bytec 8 // \"asset_suspended\"", "defined_out": [ "\"asset_suspended\"" @@ -87,7 +87,7 @@ "\"asset_suspended\"" ] }, - "157": { + "111": { "op": "intc_1 // 0", "defined_out": [ "\"asset_suspended\"", @@ -98,11 +98,11 @@ "0" ] }, - "158": { + "112": { "op": "app_global_put", "stack_out": [] }, - "159": { + "113": { "op": "bytec 9 // \"asset_defaulted\"", "defined_out": [ "\"asset_defaulted\"" @@ -111,18 +111,18 @@ "\"asset_defaulted\"" ] }, - "161": { + "115": { "op": "intc_1 // 0", "stack_out": [ "\"asset_defaulted\"", "0" ] }, - "162": { + "116": { "op": "app_global_put", "stack_out": [] }, - "163": { + "117": { "block": "main_after_if_else@2", "stack_in": [], "op": "txn NumAppArgs", @@ -133,11 +133,11 @@ "tmp%0#1" ] }, - "165": { + "119": { "op": "bz main_create@19", "stack_out": [] }, - "168": { + "122": { "op": "pushbytes 0x914f04eb // method \"contract_update()void\"", "defined_out": [ "Method(contract_update()void)" @@ -146,7 +146,7 @@ "Method(contract_update()void)" ] }, - "174": { + "128": { "op": "txna ApplicationArgs 0", "defined_out": [ "Method(contract_update()void)", @@ -157,11 +157,11 @@ "tmp%2#0" ] }, - "177": { + "131": { "op": "match main_contract_update_route@5", "stack_out": [] }, - "181": { + "135": { "block": "main_switch_case_next@6", "stack_in": [], "op": "txn OnCompletion", @@ -172,7 +172,7 @@ "tmp%8#0" ] }, - "183": { + "137": { "op": "!", "defined_out": [ "tmp%9#0" @@ -181,11 +181,11 @@ "tmp%9#0" ] }, - "184": { + "138": { "op": "assert", "stack_out": [] }, - "185": { + "139": { "op": "txn ApplicationID", "defined_out": [ "tmp%10#0" @@ -194,11 +194,11 @@ "tmp%10#0" ] }, - "187": { + "141": { "op": "assert", "stack_out": [] }, - "188": { + "142": { "op": "pushbytess 0x82f71b2d 0xef04f5d3 0xdf343550 0x3dbe80bd 0x1e3e48e7 0x010c8299 0x7406acd2 0x1a72a2ee // method \"rbac_rotate_arranger(address)uint64\", method \"rbac_set_op_daemon(address)uint64\", method \"rbac_assign_role(uint8,address,(uint64,uint64))uint64\", method \"rbac_revoke_role(uint8,address)uint64\", method \"rbac_contract_suspension(bool)uint64\", method \"rbac_get_arranger()address\", method \"rbac_get_address_roles(address)(bool,bool,bool,bool,bool)\", method \"rbac_get_role_validity(uint8,address)(uint64,uint64)\"", "defined_out": [ "Method(rbac_assign_role(uint8,address,(uint64,uint64))uint64)", @@ -221,7 +221,7 @@ "Method(rbac_get_role_validity(uint8,address)(uint64,uint64))" ] }, - "230": { + "184": { "op": "txna ApplicationArgs 0", "defined_out": [ "Method(rbac_assign_role(uint8,address,(uint64,uint64))uint64)", @@ -246,14 +246,14 @@ "tmp%12#0" ] }, - "233": { + "187": { "op": "match rbac_rotate_arranger rbac_set_op_daemon rbac_assign_role rbac_revoke_role rbac_contract_suspension rbac_get_arranger rbac_get_address_roles rbac_get_role_validity", "stack_out": [] }, - "251": { + "205": { "op": "err" }, - "252": { + "206": { "block": "main_contract_update_route@5", "stack_in": [], "op": "txn OnCompletion", @@ -264,7 +264,7 @@ "tmp%3#0" ] }, - "254": { + "208": { "op": "pushint 4 // UpdateApplication", "defined_out": [ "UpdateApplication", @@ -275,7 +275,7 @@ "UpdateApplication" ] }, - "256": { + "210": { "op": "==", "defined_out": [ "tmp%4#0" @@ -284,7 +284,7 @@ "tmp%4#0" ] }, - "257": { + "211": { "op": "txn ApplicationID", "defined_out": [ "tmp%4#0", @@ -295,7 +295,7 @@ "tmp%5#0" ] }, - "259": { + "213": { "op": "&&", "defined_out": [ "tmp%7#0" @@ -304,14 +304,14 @@ "tmp%7#0" ] }, - "260": { + "214": { "op": "assert", "stack_out": [] }, - "261": { + "215": { "op": "b contract_update" }, - "264": { + "218": { "block": "main_create@19", "stack_in": [], "op": "txn OnCompletion", @@ -322,7 +322,7 @@ "tmp%13#0" ] }, - "266": { + "220": { "op": "!", "defined_out": [ "tmp%14#0" @@ -331,7 +331,7 @@ "tmp%14#0" ] }, - "267": { + "221": { "op": "txn ApplicationID", "defined_out": [ "tmp%14#0", @@ -342,7 +342,7 @@ "tmp%15#0" ] }, - "269": { + "223": { "op": "!", "defined_out": [ "tmp%14#0", @@ -353,7 +353,7 @@ "tmp%16#0" ] }, - "270": { + "224": { "op": "&&", "defined_out": [ "tmp%17#0" @@ -362,35 +362,35 @@ "tmp%17#0" ] }, - "271": { + "225": { "op": "assert", "stack_out": [] }, - "272": { - "op": "bytec_1 // 0x5223417272616e67657223", + "226": { + "op": "bytec_1 // 0x523a41525223", "defined_out": [ - "0x5223417272616e67657223" + "0x523a41525223" ], "stack_out": [ - "0x5223417272616e67657223" + "0x523a41525223" ] }, - "273": { + "227": { "op": "txn Sender", "defined_out": [ - "0x5223417272616e67657223", + "0x523a41525223", "tmp%0#2" ], "stack_out": [ - "0x5223417272616e67657223", + "0x523a41525223", "tmp%0#2" ] }, - "275": { + "229": { "op": "app_global_put", "stack_out": [] }, - "276": { + "230": { "op": "intc_0 // 1", "defined_out": [ "1" @@ -399,11 +399,11 @@ "1" ] }, - "277": { + "231": { "op": "return", "stack_out": [] }, - "278": { + "232": { "subroutine": "modules.rbac.RbacModule.contract_update[routing]", "params": {}, "block": "contract_update", @@ -411,7 +411,7 @@ "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", "op": "callsub _assert_caller_is_arranger" }, - "281": { + "235": { "op": "intc_0 // 1", "defined_out": [ "1" @@ -420,11 +420,11 @@ "1" ] }, - "282": { + "236": { "op": "return", "stack_out": [] }, - "283": { + "237": { "subroutine": "modules.rbac.RbacModule.rbac_rotate_arranger[routing]", "params": {}, "block": "rbac_rotate_arranger", @@ -437,7 +437,7 @@ "new_arranger#0" ] }, - "286": { + "240": { "op": "dup", "defined_out": [ "new_arranger#0", @@ -448,7 +448,7 @@ "new_arranger#0 (copy)" ] }, - "287": { + "241": { "op": "len", "defined_out": [ "len%0#0", @@ -459,7 +459,7 @@ "len%0#0" ] }, - "288": { + "242": { "op": "intc_2 // 32", "defined_out": [ "32", @@ -472,7 +472,7 @@ "32" ] }, - "289": { + "243": { "op": "==", "defined_out": [ "eq%0#0", @@ -483,40 +483,40 @@ "eq%0#0" ] }, - "290": { + "244": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ "new_arranger#0" ] }, - "291": { + "245": { "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", "op": "callsub _assert_caller_is_arranger" }, - "294": { - "op": "bytec_1 // 0x5223417272616e67657223", + "248": { + "op": "bytec_1 // 0x523a41525223", "defined_out": [ - "0x5223417272616e67657223", + "0x523a41525223", "new_arranger#0" ], "stack_out": [ "new_arranger#0", - "0x5223417272616e67657223" + "0x523a41525223" ] }, - "295": { + "249": { "op": "swap", "stack_out": [ - "0x5223417272616e67657223", + "0x523a41525223", "new_arranger#0" ] }, - "296": { + "250": { "op": "app_global_put", "stack_out": [] }, - "297": { + "251": { "op": "global LatestTimestamp", "defined_out": [ "tmp%0#1" @@ -525,7 +525,7 @@ "tmp%0#1" ] }, - "299": { + "253": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0" @@ -534,7 +534,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "300": { + "254": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -545,14 +545,14 @@ "0x151f7c75" ] }, - "301": { + "255": { "op": "swap", "stack_out": [ "0x151f7c75", "aggregate%val_as_bytes%0#0" ] }, - "302": { + "256": { "op": "concat", "defined_out": [ "tmp%4#0" @@ -561,11 +561,11 @@ "tmp%4#0" ] }, - "303": { + "257": { "op": "log", "stack_out": [] }, - "304": { + "258": { "op": "intc_0 // 1", "defined_out": [ "1" @@ -574,11 +574,11 @@ "1" ] }, - "305": { + "259": { "op": "return", "stack_out": [] }, - "306": { + "260": { "subroutine": "modules.rbac.RbacModule.rbac_set_op_daemon[routing]", "params": {}, "block": "rbac_set_op_daemon", @@ -591,7 +591,7 @@ "address#0" ] }, - "309": { + "263": { "op": "dup", "defined_out": [ "address#0", @@ -602,7 +602,7 @@ "address#0 (copy)" ] }, - "310": { + "264": { "op": "len", "defined_out": [ "address#0", @@ -613,7 +613,7 @@ "len%0#0" ] }, - "311": { + "265": { "op": "intc_2 // 32", "defined_out": [ "32", @@ -626,7 +626,7 @@ "32" ] }, - "312": { + "266": { "op": "==", "defined_out": [ "address#0", @@ -637,40 +637,40 @@ "eq%0#0" ] }, - "313": { + "267": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ "address#0" ] }, - "314": { + "268": { "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", "op": "callsub _assert_caller_is_arranger" }, - "317": { - "op": "bytec 7 // 0x52234f704461656d6f6e23", + "271": { + "op": "bytec 7 // 0x523a4f504423", "defined_out": [ - "0x52234f704461656d6f6e23", + "0x523a4f504423", "address#0" ], "stack_out": [ "address#0", - "0x52234f704461656d6f6e23" + "0x523a4f504423" ] }, - "319": { + "273": { "op": "swap", "stack_out": [ - "0x52234f704461656d6f6e23", + "0x523a4f504423", "address#0" ] }, - "320": { + "274": { "op": "app_global_put", "stack_out": [] }, - "321": { + "275": { "op": "global LatestTimestamp", "defined_out": [ "tmp%0#1" @@ -679,7 +679,7 @@ "tmp%0#1" ] }, - "323": { + "277": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0" @@ -688,7 +688,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "324": { + "278": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -699,14 +699,14 @@ "0x151f7c75" ] }, - "325": { + "279": { "op": "swap", "stack_out": [ "0x151f7c75", "aggregate%val_as_bytes%0#0" ] }, - "326": { + "280": { "op": "concat", "defined_out": [ "tmp%4#0" @@ -715,11 +715,11 @@ "tmp%4#0" ] }, - "327": { + "281": { "op": "log", "stack_out": [] }, - "328": { + "282": { "op": "intc_0 // 1", "defined_out": [ "1" @@ -728,11 +728,11 @@ "1" ] }, - "329": { + "283": { "op": "return", "stack_out": [] }, - "330": { + "284": { "subroutine": "modules.rbac.RbacModule.rbac_assign_role[routing]", "params": {}, "block": "rbac_assign_role", @@ -745,7 +745,7 @@ "role_id#0" ] }, - "333": { + "287": { "op": "dup", "defined_out": [ "role_id#0", @@ -756,7 +756,7 @@ "role_id#0 (copy)" ] }, - "334": { + "288": { "op": "len", "defined_out": [ "len%0#0", @@ -767,7 +767,7 @@ "len%0#0" ] }, - "335": { + "289": { "op": "intc_0 // 1", "defined_out": [ "1", @@ -780,7 +780,7 @@ "1" ] }, - "336": { + "290": { "op": "==", "defined_out": [ "eq%0#0", @@ -791,17 +791,17 @@ "eq%0#0" ] }, - "337": { + "291": { "error": "invalid number of bytes for arc4.uint8", "op": "assert // invalid number of bytes for arc4.uint8", "stack_out": [ "role_id#0" ] }, - "338": { + "292": { "op": "txna ApplicationArgs 2" }, - "341": { + "295": { "op": "dup", "defined_out": [ "role_address#0", @@ -813,7 +813,7 @@ "role_address#0" ] }, - "342": { + "296": { "op": "cover 2", "defined_out": [ "role_address#0", @@ -825,7 +825,7 @@ "role_address#0" ] }, - "344": { + "298": { "op": "len", "defined_out": [ "len%1#0", @@ -838,7 +838,7 @@ "len%1#0" ] }, - "345": { + "299": { "op": "intc_2 // 32", "defined_out": [ "32", @@ -853,7 +853,7 @@ "32" ] }, - "346": { + "300": { "op": "==", "defined_out": [ "eq%1#0", @@ -866,7 +866,7 @@ "eq%1#0" ] }, - "347": { + "301": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ @@ -874,10 +874,10 @@ "role_id#0" ] }, - "348": { + "302": { "op": "txna ApplicationArgs 3" }, - "351": { + "305": { "op": "dup", "defined_out": [ "role_address#0", @@ -891,7 +891,7 @@ "validity#0" ] }, - "352": { + "306": { "op": "cover 2", "defined_out": [ "role_address#0", @@ -905,7 +905,7 @@ "validity#0" ] }, - "354": { + "308": { "op": "len", "defined_out": [ "len%2#0", @@ -920,7 +920,7 @@ "len%2#0" ] }, - "355": { + "309": { "op": "pushint 16", "defined_out": [ "16", @@ -937,7 +937,7 @@ "16" ] }, - "357": { + "311": { "op": "==", "defined_out": [ "eq%2#0", @@ -952,7 +952,7 @@ "eq%2#0" ] }, - "358": { + "312": { "error": "invalid number of bytes for smart_contracts.abi_types.RoleValidity", "op": "assert // invalid number of bytes for smart_contracts.abi_types.RoleValidity", "stack_out": [ @@ -961,15 +961,15 @@ "role_id#0" ] }, - "359": { + "313": { "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", "op": "callsub _assert_caller_is_arranger" }, - "362": { + "316": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", "op": "callsub _assert_is_not_asset_defaulted" }, - "365": { + "319": { "op": "btoi", "defined_out": [ "role_address#0", @@ -982,7 +982,7 @@ "role_id#1" ] }, - "366": { + "320": { "op": "dupn 2", "defined_out": [ "role_address#0", @@ -998,7 +998,7 @@ "role_id#1 (copy)" ] }, - "368": { + "322": { "callsub": "modules.rbac.RbacModule._assert_valid_role", "op": "callsub _assert_valid_role", "stack_out": [ @@ -1008,7 +1008,7 @@ "role_id#1" ] }, - "371": { + "325": { "op": "intc_3 // 20", "defined_out": [ "20", @@ -1024,7 +1024,7 @@ "20" ] }, - "372": { + "326": { "op": "==", "defined_out": [ "role_address#0", @@ -1039,7 +1039,7 @@ "tmp%0#2" ] }, - "373": { + "327": { "op": "bz rbac_assign_role_after_if_else@3", "stack_out": [ "role_address#0", @@ -1047,10 +1047,10 @@ "role_id#1" ] }, - "376": { - "op": "bytec_1 // 0x5223417272616e67657223", + "330": { + "op": "bytec_1 // 0x523a41525223", "defined_out": [ - "0x5223417272616e67657223", + "0x523a41525223", "role_address#0", "role_id#1", "validity#0" @@ -1059,20 +1059,20 @@ "role_address#0", "validity#0", "role_id#1", - "0x5223417272616e67657223" + "0x523a41525223" ] }, - "377": { + "331": { "op": "dig 3", "stack_out": [ "role_address#0", "validity#0", "role_id#1", - "0x5223417272616e67657223", + "0x523a41525223", "role_address#0" ] }, - "379": { + "333": { "op": "app_global_put", "stack_out": [ "role_address#0", @@ -1080,7 +1080,7 @@ "role_id#1" ] }, - "380": { + "334": { "block": "rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14", "stack_in": [ "role_address#0", @@ -1098,7 +1098,7 @@ "tmp%2#1" ] }, - "382": { + "336": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0" @@ -1110,7 +1110,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "383": { + "337": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -1124,7 +1124,7 @@ "0x151f7c75" ] }, - "384": { + "338": { "op": "swap", "stack_out": [ "role_address#0", @@ -1134,7 +1134,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "385": { + "339": { "op": "concat", "defined_out": [ "tmp%6#0" @@ -1146,7 +1146,7 @@ "tmp%6#0" ] }, - "386": { + "340": { "op": "log", "stack_out": [ "role_address#0", @@ -1154,7 +1154,7 @@ "role_id#1" ] }, - "387": { + "341": { "op": "intc_0 // 1", "defined_out": [ "1" @@ -1166,7 +1166,7 @@ "1" ] }, - "388": { + "342": { "op": "return", "stack_out": [ "role_address#0", @@ -1174,7 +1174,7 @@ "role_id#1" ] }, - "389": { + "343": { "block": "rbac_assign_role_after_if_else@3", "stack_in": [ "role_address#0", @@ -1192,7 +1192,7 @@ "role_id#1" ] }, - "390": { + "344": { "op": "pushint 40", "defined_out": [ "40", @@ -1206,7 +1206,7 @@ "40" ] }, - "392": { + "346": { "op": "==", "defined_out": [ "role_id#1", @@ -1219,7 +1219,7 @@ "tmp%1#1" ] }, - "393": { + "347": { "op": "bz rbac_assign_role_after_if_else@5", "stack_out": [ "role_address#0", @@ -1227,23 +1227,23 @@ "role_id#1" ] }, - "396": { - "op": "bytec_3 // 0x52234163636f756e744d616e6167657223", + "350": { + "op": "bytec_3 // 0x523a4d4e4723", "defined_out": [ - "0x52234163636f756e744d616e6167657223", + "0x523a4d4e4723", "role_id#1" ], "stack_out": [ "role_address#0", "validity#0", "role_id#1", - "0x52234163636f756e744d616e6167657223" + "0x523a4d4e4723" ] }, - "397": { + "351": { "op": "dig 3", "defined_out": [ - "0x52234163636f756e744d616e6167657223", + "0x523a4d4e4723", "role_address#0", "role_id#1" ], @@ -1251,11 +1251,11 @@ "role_address#0", "validity#0", "role_id#1", - "0x52234163636f756e744d616e6167657223", + "0x523a4d4e4723", "role_address#0" ] }, - "399": { + "353": { "op": "concat", "defined_out": [ "box_prefixed_key%0#0", @@ -1269,7 +1269,7 @@ "box_prefixed_key%0#0" ] }, - "400": { + "354": { "op": "dup", "defined_out": [ "box_prefixed_key%0#0", @@ -1285,7 +1285,7 @@ "box_prefixed_key%0#0 (copy)" ] }, - "401": { + "355": { "op": "box_len", "defined_out": [ "_%0#0", @@ -1303,7 +1303,7 @@ "maybe_exists%0#0" ] }, - "402": { + "356": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -1313,7 +1313,7 @@ "maybe_exists%0#0" ] }, - "404": { + "358": { "op": "!", "defined_out": [ "box_prefixed_key%0#0", @@ -1329,7 +1329,7 @@ "tmp%2#2" ] }, - "405": { + "359": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -1339,7 +1339,7 @@ "box_prefixed_key%0#0" ] }, - "406": { + "360": { "op": "dig 2", "defined_out": [ "box_prefixed_key%0#0", @@ -1355,7 +1355,7 @@ "validity#0" ] }, - "408": { + "362": { "op": "box_put", "stack_out": [ "role_address#0", @@ -1363,10 +1363,10 @@ "role_id#1" ] }, - "409": { + "363": { "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14" }, - "412": { + "366": { "block": "rbac_assign_role_after_if_else@5", "stack_in": [ "role_address#0", @@ -1384,7 +1384,7 @@ "role_id#1" ] }, - "413": { + "367": { "op": "pushint 50", "defined_out": [ "50", @@ -1398,7 +1398,7 @@ "50" ] }, - "415": { + "369": { "op": "==", "defined_out": [ "role_id#1", @@ -1411,7 +1411,7 @@ "tmp%3#0" ] }, - "416": { + "370": { "op": "bz rbac_assign_role_after_if_else@7", "stack_out": [ "role_address#0", @@ -1419,23 +1419,23 @@ "role_id#1" ] }, - "419": { - "op": "bytec 4 // 0x52235072696d6172794465616c657223", + "373": { + "op": "bytec 4 // 0x523a50594423", "defined_out": [ - "0x52235072696d6172794465616c657223", + "0x523a50594423", "role_id#1" ], "stack_out": [ "role_address#0", "validity#0", "role_id#1", - "0x52235072696d6172794465616c657223" + "0x523a50594423" ] }, - "421": { + "375": { "op": "dig 3", "defined_out": [ - "0x52235072696d6172794465616c657223", + "0x523a50594423", "role_address#0", "role_id#1" ], @@ -1443,11 +1443,11 @@ "role_address#0", "validity#0", "role_id#1", - "0x52235072696d6172794465616c657223", + "0x523a50594423", "role_address#0" ] }, - "423": { + "377": { "op": "concat", "defined_out": [ "box_prefixed_key%2#0", @@ -1461,7 +1461,7 @@ "box_prefixed_key%2#0" ] }, - "424": { + "378": { "op": "dup", "defined_out": [ "box_prefixed_key%2#0", @@ -1477,7 +1477,7 @@ "box_prefixed_key%2#0 (copy)" ] }, - "425": { + "379": { "op": "box_len", "defined_out": [ "_%1#0", @@ -1495,7 +1495,7 @@ "maybe_exists%1#0" ] }, - "426": { + "380": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -1505,7 +1505,7 @@ "maybe_exists%1#0" ] }, - "428": { + "382": { "op": "!", "defined_out": [ "box_prefixed_key%2#0", @@ -1521,7 +1521,7 @@ "tmp%4#0" ] }, - "429": { + "383": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -1531,7 +1531,7 @@ "box_prefixed_key%2#0" ] }, - "430": { + "384": { "op": "dig 2", "defined_out": [ "box_prefixed_key%2#0", @@ -1547,7 +1547,7 @@ "validity#0" ] }, - "432": { + "386": { "op": "box_put", "stack_out": [ "role_address#0", @@ -1555,10 +1555,10 @@ "role_id#1" ] }, - "433": { + "387": { "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14" }, - "436": { + "390": { "block": "rbac_assign_role_after_if_else@7", "stack_in": [ "role_address#0", @@ -1576,7 +1576,7 @@ "role_id#1" ] }, - "437": { + "391": { "op": "pushint 60", "defined_out": [ "60", @@ -1590,7 +1590,7 @@ "60" ] }, - "439": { + "393": { "op": "==", "defined_out": [ "role_id#1", @@ -1603,7 +1603,7 @@ "tmp%5#1" ] }, - "440": { + "394": { "op": "bz rbac_assign_role_after_if_else@9", "stack_out": [ "role_address#0", @@ -1611,23 +1611,23 @@ "role_id#1" ] }, - "443": { - "op": "bytec 5 // 0x52235472757374656523", + "397": { + "op": "bytec 5 // 0x523a54525323", "defined_out": [ - "0x52235472757374656523", + "0x523a54525323", "role_id#1" ], "stack_out": [ "role_address#0", "validity#0", "role_id#1", - "0x52235472757374656523" + "0x523a54525323" ] }, - "445": { + "399": { "op": "dig 3", "defined_out": [ - "0x52235472757374656523", + "0x523a54525323", "role_address#0", "role_id#1" ], @@ -1635,11 +1635,11 @@ "role_address#0", "validity#0", "role_id#1", - "0x52235472757374656523", + "0x523a54525323", "role_address#0" ] }, - "447": { + "401": { "op": "concat", "defined_out": [ "box_prefixed_key%4#0", @@ -1653,7 +1653,7 @@ "box_prefixed_key%4#0" ] }, - "448": { + "402": { "op": "dup", "defined_out": [ "box_prefixed_key%4#0", @@ -1669,7 +1669,7 @@ "box_prefixed_key%4#0 (copy)" ] }, - "449": { + "403": { "op": "box_len", "defined_out": [ "_%2#0", @@ -1687,7 +1687,7 @@ "maybe_exists%2#0" ] }, - "450": { + "404": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -1697,7 +1697,7 @@ "maybe_exists%2#0" ] }, - "452": { + "406": { "op": "!", "defined_out": [ "box_prefixed_key%4#0", @@ -1713,7 +1713,7 @@ "tmp%6#1" ] }, - "453": { + "407": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -1723,7 +1723,7 @@ "box_prefixed_key%4#0" ] }, - "454": { + "408": { "op": "dig 2", "defined_out": [ "box_prefixed_key%4#0", @@ -1739,7 +1739,7 @@ "validity#0" ] }, - "456": { + "410": { "op": "box_put", "stack_out": [ "role_address#0", @@ -1747,10 +1747,10 @@ "role_id#1" ] }, - "457": { + "411": { "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14" }, - "460": { + "414": { "block": "rbac_assign_role_after_if_else@9", "stack_in": [ "role_address#0", @@ -1768,7 +1768,7 @@ "role_id#1" ] }, - "461": { + "415": { "op": "pushint 70", "defined_out": [ "70", @@ -1782,7 +1782,7 @@ "70" ] }, - "463": { + "417": { "op": "==", "defined_out": [ "role_id#1", @@ -1795,7 +1795,7 @@ "tmp%7#0" ] }, - "464": { + "418": { "op": "bz rbac_assign_role_after_if_else@11", "stack_out": [ "role_address#0", @@ -1803,23 +1803,23 @@ "role_id#1" ] }, - "467": { - "op": "bytec_2 // 0x5223417574686f7269747923", + "421": { + "op": "bytec_2 // 0x523a41555423", "defined_out": [ - "0x5223417574686f7269747923", + "0x523a41555423", "role_id#1" ], "stack_out": [ "role_address#0", "validity#0", "role_id#1", - "0x5223417574686f7269747923" + "0x523a41555423" ] }, - "468": { + "422": { "op": "dig 3", "defined_out": [ - "0x5223417574686f7269747923", + "0x523a41555423", "role_address#0", "role_id#1" ], @@ -1827,11 +1827,11 @@ "role_address#0", "validity#0", "role_id#1", - "0x5223417574686f7269747923", + "0x523a41555423", "role_address#0" ] }, - "470": { + "424": { "op": "concat", "defined_out": [ "box_prefixed_key%6#0", @@ -1845,7 +1845,7 @@ "box_prefixed_key%6#0" ] }, - "471": { + "425": { "op": "dup", "defined_out": [ "box_prefixed_key%6#0", @@ -1861,7 +1861,7 @@ "box_prefixed_key%6#0 (copy)" ] }, - "472": { + "426": { "op": "box_len", "defined_out": [ "_%3#0", @@ -1879,7 +1879,7 @@ "maybe_exists%3#0" ] }, - "473": { + "427": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -1889,7 +1889,7 @@ "maybe_exists%3#0" ] }, - "475": { + "429": { "op": "!", "defined_out": [ "box_prefixed_key%6#0", @@ -1905,7 +1905,7 @@ "tmp%8#0" ] }, - "476": { + "430": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -1915,7 +1915,7 @@ "box_prefixed_key%6#0" ] }, - "477": { + "431": { "op": "dig 2", "defined_out": [ "box_prefixed_key%6#0", @@ -1931,7 +1931,7 @@ "validity#0" ] }, - "479": { + "433": { "op": "box_put", "stack_out": [ "role_address#0", @@ -1939,10 +1939,10 @@ "role_id#1" ] }, - "480": { + "434": { "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14" }, - "483": { + "437": { "block": "rbac_assign_role_after_if_else@11", "stack_in": [ "role_address#0", @@ -1960,7 +1960,7 @@ "role_id#1" ] }, - "484": { + "438": { "op": "pushint 80", "defined_out": [ "80", @@ -1974,7 +1974,7 @@ "80" ] }, - "486": { + "440": { "op": "==", "defined_out": [ "role_id#1", @@ -1987,7 +1987,7 @@ "tmp%9#0" ] }, - "487": { + "441": { "op": "bz rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14", "stack_out": [ "role_address#0", @@ -1995,23 +1995,23 @@ "role_id#1" ] }, - "490": { - "op": "bytec 6 // 0x52234f6273657276657223", + "444": { + "op": "bytec 6 // 0x523a4d4f4323", "defined_out": [ - "0x52234f6273657276657223", + "0x523a4d4f4323", "role_id#1" ], "stack_out": [ "role_address#0", "validity#0", "role_id#1", - "0x52234f6273657276657223" + "0x523a4d4f4323" ] }, - "492": { + "446": { "op": "dig 3", "defined_out": [ - "0x52234f6273657276657223", + "0x523a4d4f4323", "role_address#0", "role_id#1" ], @@ -2019,11 +2019,11 @@ "role_address#0", "validity#0", "role_id#1", - "0x52234f6273657276657223", + "0x523a4d4f4323", "role_address#0" ] }, - "494": { + "448": { "op": "concat", "defined_out": [ "box_prefixed_key%8#0", @@ -2037,7 +2037,7 @@ "box_prefixed_key%8#0" ] }, - "495": { + "449": { "op": "dup", "defined_out": [ "box_prefixed_key%8#0", @@ -2053,7 +2053,7 @@ "box_prefixed_key%8#0 (copy)" ] }, - "496": { + "450": { "op": "box_len", "defined_out": [ "_%4#0", @@ -2071,7 +2071,7 @@ "maybe_exists%4#0" ] }, - "497": { + "451": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -2081,7 +2081,7 @@ "maybe_exists%4#0" ] }, - "499": { + "453": { "op": "!", "defined_out": [ "box_prefixed_key%8#0", @@ -2097,7 +2097,7 @@ "tmp%10#0" ] }, - "500": { + "454": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -2107,7 +2107,7 @@ "box_prefixed_key%8#0" ] }, - "501": { + "455": { "op": "dig 2", "defined_out": [ "box_prefixed_key%8#0", @@ -2123,7 +2123,7 @@ "validity#0" ] }, - "503": { + "457": { "op": "box_put", "stack_out": [ "role_address#0", @@ -2131,10 +2131,10 @@ "role_id#1" ] }, - "504": { + "458": { "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14" }, - "507": { + "461": { "subroutine": "modules.rbac.RbacModule.rbac_revoke_role[routing]", "params": {}, "block": "rbac_revoke_role", @@ -2147,7 +2147,7 @@ "role_id#0" ] }, - "510": { + "464": { "op": "dup", "defined_out": [ "role_id#0", @@ -2158,7 +2158,7 @@ "role_id#0 (copy)" ] }, - "511": { + "465": { "op": "len", "defined_out": [ "len%0#0", @@ -2169,7 +2169,7 @@ "len%0#0" ] }, - "512": { + "466": { "op": "intc_0 // 1", "defined_out": [ "1", @@ -2182,7 +2182,7 @@ "1" ] }, - "513": { + "467": { "op": "==", "defined_out": [ "eq%0#0", @@ -2193,17 +2193,17 @@ "eq%0#0" ] }, - "514": { + "468": { "error": "invalid number of bytes for arc4.uint8", "op": "assert // invalid number of bytes for arc4.uint8", "stack_out": [ "role_id#0" ] }, - "515": { + "469": { "op": "txna ApplicationArgs 2" }, - "518": { + "472": { "op": "dup", "defined_out": [ "role_address#0", @@ -2215,7 +2215,7 @@ "role_address#0" ] }, - "519": { + "473": { "op": "cover 2", "defined_out": [ "role_address#0", @@ -2227,7 +2227,7 @@ "role_address#0" ] }, - "521": { + "475": { "op": "len", "defined_out": [ "len%1#0", @@ -2240,7 +2240,7 @@ "len%1#0" ] }, - "522": { + "476": { "op": "intc_2 // 32", "defined_out": [ "32", @@ -2255,7 +2255,7 @@ "32" ] }, - "523": { + "477": { "op": "==", "defined_out": [ "eq%1#0", @@ -2268,7 +2268,7 @@ "eq%1#0" ] }, - "524": { + "478": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ @@ -2276,15 +2276,15 @@ "role_id#0" ] }, - "525": { + "479": { "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", "op": "callsub _assert_caller_is_arranger" }, - "528": { + "482": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", "op": "callsub _assert_is_not_asset_defaulted" }, - "531": { + "485": { "op": "btoi", "defined_out": [ "role_address#0", @@ -2295,7 +2295,7 @@ "role_id#1" ] }, - "532": { + "486": { "op": "dupn 2", "defined_out": [ "role_address#0", @@ -2309,7 +2309,7 @@ "role_id#1 (copy)" ] }, - "534": { + "488": { "callsub": "modules.rbac.RbacModule._assert_valid_role", "op": "callsub _assert_valid_role", "stack_out": [ @@ -2318,7 +2318,7 @@ "role_id#1" ] }, - "537": { + "491": { "op": "dup", "stack_out": [ "role_address#0", @@ -2327,7 +2327,7 @@ "role_id#1 (copy)" ] }, - "538": { + "492": { "op": "intc_3 // 20", "defined_out": [ "20", @@ -2343,7 +2343,7 @@ "20" ] }, - "539": { + "493": { "op": "!=", "defined_out": [ "role_address#0", @@ -2357,7 +2357,7 @@ "tmp%0#2" ] }, - "540": { + "494": { "error": "Invalid role identifier", "op": "assert // Invalid role identifier", "stack_out": [ @@ -2366,7 +2366,7 @@ "role_id#1" ] }, - "541": { + "495": { "op": "pushint 40", "defined_out": [ "40", @@ -2380,7 +2380,7 @@ "40" ] }, - "543": { + "497": { "op": "==", "defined_out": [ "role_address#0", @@ -2393,36 +2393,36 @@ "tmp%1#1" ] }, - "544": { + "498": { "op": "bz rbac_revoke_role_after_if_else@3", "stack_out": [ "role_address#0", "role_id#1" ] }, - "547": { - "op": "bytec_3 // 0x52234163636f756e744d616e6167657223", + "501": { + "op": "bytec_3 // 0x523a4d4e4723", "defined_out": [ - "0x52234163636f756e744d616e6167657223", + "0x523a4d4e4723", "role_address#0", "role_id#1" ], "stack_out": [ "role_address#0", "role_id#1", - "0x52234163636f756e744d616e6167657223" + "0x523a4d4e4723" ] }, - "548": { + "502": { "op": "dig 2", "stack_out": [ "role_address#0", "role_id#1", - "0x52234163636f756e744d616e6167657223", + "0x523a4d4e4723", "role_address#0" ] }, - "550": { + "504": { "op": "concat", "defined_out": [ "box_prefixed_key%0#0", @@ -2435,7 +2435,7 @@ "box_prefixed_key%0#0" ] }, - "551": { + "505": { "op": "dup", "defined_out": [ "box_prefixed_key%0#0", @@ -2450,7 +2450,7 @@ "box_prefixed_key%0#0 (copy)" ] }, - "552": { + "506": { "op": "box_len", "defined_out": [ "_%0#0", @@ -2467,7 +2467,7 @@ "maybe_exists%0#0" ] }, - "553": { + "507": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -2476,7 +2476,7 @@ "maybe_exists%0#0" ] }, - "555": { + "509": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -2485,7 +2485,7 @@ "box_prefixed_key%0#0" ] }, - "556": { + "510": { "op": "box_del", "defined_out": [ "role_address#0", @@ -2498,14 +2498,14 @@ "{box_del}" ] }, - "557": { + "511": { "op": "pop", "stack_out": [ "role_address#0", "role_id#1" ] }, - "558": { + "512": { "block": "rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12", "stack_in": [ "role_address#0", @@ -2521,7 +2521,7 @@ "tmp%2#1" ] }, - "560": { + "514": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0" @@ -2532,7 +2532,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "561": { + "515": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -2545,7 +2545,7 @@ "0x151f7c75" ] }, - "562": { + "516": { "op": "swap", "stack_out": [ "role_address#0", @@ -2554,7 +2554,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "563": { + "517": { "op": "concat", "defined_out": [ "tmp%5#0" @@ -2565,14 +2565,14 @@ "tmp%5#0" ] }, - "564": { + "518": { "op": "log", "stack_out": [ "role_address#0", "role_id#1" ] }, - "565": { + "519": { "op": "intc_0 // 1", "defined_out": [ "1" @@ -2583,14 +2583,14 @@ "1" ] }, - "566": { + "520": { "op": "return", "stack_out": [ "role_address#0", "role_id#1" ] }, - "567": { + "521": { "block": "rbac_revoke_role_after_if_else@3", "stack_in": [ "role_address#0", @@ -2606,7 +2606,7 @@ "role_id#1" ] }, - "568": { + "522": { "op": "pushint 50", "defined_out": [ "50", @@ -2619,7 +2619,7 @@ "50" ] }, - "570": { + "524": { "op": "==", "defined_out": [ "role_id#1", @@ -2631,40 +2631,40 @@ "tmp%2#2" ] }, - "571": { + "525": { "op": "bz rbac_revoke_role_after_if_else@5", "stack_out": [ "role_address#0", "role_id#1" ] }, - "574": { - "op": "bytec 4 // 0x52235072696d6172794465616c657223", + "528": { + "op": "bytec 4 // 0x523a50594423", "defined_out": [ - "0x52235072696d6172794465616c657223", + "0x523a50594423", "role_id#1" ], "stack_out": [ "role_address#0", "role_id#1", - "0x52235072696d6172794465616c657223" + "0x523a50594423" ] }, - "576": { + "530": { "op": "dig 2", "defined_out": [ - "0x52235072696d6172794465616c657223", + "0x523a50594423", "role_address#0", "role_id#1" ], "stack_out": [ "role_address#0", "role_id#1", - "0x52235072696d6172794465616c657223", + "0x523a50594423", "role_address#0" ] }, - "578": { + "532": { "op": "concat", "defined_out": [ "box_prefixed_key%2#0", @@ -2677,7 +2677,7 @@ "box_prefixed_key%2#0" ] }, - "579": { + "533": { "op": "dup", "defined_out": [ "box_prefixed_key%2#0", @@ -2692,7 +2692,7 @@ "box_prefixed_key%2#0 (copy)" ] }, - "580": { + "534": { "op": "box_len", "defined_out": [ "_%1#0", @@ -2709,7 +2709,7 @@ "maybe_exists%1#0" ] }, - "581": { + "535": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -2718,7 +2718,7 @@ "maybe_exists%1#0" ] }, - "583": { + "537": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -2727,7 +2727,7 @@ "box_prefixed_key%2#0" ] }, - "584": { + "538": { "op": "box_del", "defined_out": [ "role_address#0", @@ -2740,17 +2740,17 @@ "{box_del}" ] }, - "585": { + "539": { "op": "pop", "stack_out": [ "role_address#0", "role_id#1" ] }, - "586": { + "540": { "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" }, - "589": { + "543": { "block": "rbac_revoke_role_after_if_else@5", "stack_in": [ "role_address#0", @@ -2766,7 +2766,7 @@ "role_id#1" ] }, - "590": { + "544": { "op": "pushint 60", "defined_out": [ "60", @@ -2779,7 +2779,7 @@ "60" ] }, - "592": { + "546": { "op": "==", "defined_out": [ "role_id#1", @@ -2791,40 +2791,40 @@ "tmp%3#0" ] }, - "593": { + "547": { "op": "bz rbac_revoke_role_after_if_else@7", "stack_out": [ "role_address#0", "role_id#1" ] }, - "596": { - "op": "bytec 5 // 0x52235472757374656523", + "550": { + "op": "bytec 5 // 0x523a54525323", "defined_out": [ - "0x52235472757374656523", + "0x523a54525323", "role_id#1" ], "stack_out": [ "role_address#0", "role_id#1", - "0x52235472757374656523" + "0x523a54525323" ] }, - "598": { + "552": { "op": "dig 2", "defined_out": [ - "0x52235472757374656523", + "0x523a54525323", "role_address#0", "role_id#1" ], "stack_out": [ "role_address#0", "role_id#1", - "0x52235472757374656523", + "0x523a54525323", "role_address#0" ] }, - "600": { + "554": { "op": "concat", "defined_out": [ "box_prefixed_key%4#0", @@ -2837,7 +2837,7 @@ "box_prefixed_key%4#0" ] }, - "601": { + "555": { "op": "dup", "defined_out": [ "box_prefixed_key%4#0", @@ -2852,7 +2852,7 @@ "box_prefixed_key%4#0 (copy)" ] }, - "602": { + "556": { "op": "box_len", "defined_out": [ "_%2#0", @@ -2869,7 +2869,7 @@ "maybe_exists%2#0" ] }, - "603": { + "557": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -2878,7 +2878,7 @@ "maybe_exists%2#0" ] }, - "605": { + "559": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -2887,7 +2887,7 @@ "box_prefixed_key%4#0" ] }, - "606": { + "560": { "op": "box_del", "defined_out": [ "role_address#0", @@ -2900,17 +2900,17 @@ "{box_del}" ] }, - "607": { + "561": { "op": "pop", "stack_out": [ "role_address#0", "role_id#1" ] }, - "608": { + "562": { "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" }, - "611": { + "565": { "block": "rbac_revoke_role_after_if_else@7", "stack_in": [ "role_address#0", @@ -2926,7 +2926,7 @@ "role_id#1" ] }, - "612": { + "566": { "op": "pushint 70", "defined_out": [ "70", @@ -2939,7 +2939,7 @@ "70" ] }, - "614": { + "568": { "op": "==", "defined_out": [ "role_id#1", @@ -2951,40 +2951,40 @@ "tmp%4#1" ] }, - "615": { + "569": { "op": "bz rbac_revoke_role_after_if_else@9", "stack_out": [ "role_address#0", "role_id#1" ] }, - "618": { - "op": "bytec_2 // 0x5223417574686f7269747923", + "572": { + "op": "bytec_2 // 0x523a41555423", "defined_out": [ - "0x5223417574686f7269747923", + "0x523a41555423", "role_id#1" ], "stack_out": [ "role_address#0", "role_id#1", - "0x5223417574686f7269747923" + "0x523a41555423" ] }, - "619": { + "573": { "op": "dig 2", "defined_out": [ - "0x5223417574686f7269747923", + "0x523a41555423", "role_address#0", "role_id#1" ], "stack_out": [ "role_address#0", "role_id#1", - "0x5223417574686f7269747923", + "0x523a41555423", "role_address#0" ] }, - "621": { + "575": { "op": "concat", "defined_out": [ "box_prefixed_key%6#0", @@ -2997,7 +2997,7 @@ "box_prefixed_key%6#0" ] }, - "622": { + "576": { "op": "dup", "defined_out": [ "box_prefixed_key%6#0", @@ -3012,7 +3012,7 @@ "box_prefixed_key%6#0 (copy)" ] }, - "623": { + "577": { "op": "box_len", "defined_out": [ "_%3#0", @@ -3029,7 +3029,7 @@ "maybe_exists%3#0" ] }, - "624": { + "578": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -3038,7 +3038,7 @@ "maybe_exists%3#0" ] }, - "626": { + "580": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -3047,7 +3047,7 @@ "box_prefixed_key%6#0" ] }, - "627": { + "581": { "op": "box_del", "defined_out": [ "role_address#0", @@ -3060,17 +3060,17 @@ "{box_del}" ] }, - "628": { + "582": { "op": "pop", "stack_out": [ "role_address#0", "role_id#1" ] }, - "629": { + "583": { "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" }, - "632": { + "586": { "block": "rbac_revoke_role_after_if_else@9", "stack_in": [ "role_address#0", @@ -3086,7 +3086,7 @@ "role_id#1" ] }, - "633": { + "587": { "op": "pushint 80", "defined_out": [ "80", @@ -3099,7 +3099,7 @@ "80" ] }, - "635": { + "589": { "op": "==", "defined_out": [ "role_id#1", @@ -3111,40 +3111,40 @@ "tmp%5#1" ] }, - "636": { + "590": { "op": "bz rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12", "stack_out": [ "role_address#0", "role_id#1" ] }, - "639": { - "op": "bytec 6 // 0x52234f6273657276657223", + "593": { + "op": "bytec 6 // 0x523a4d4f4323", "defined_out": [ - "0x52234f6273657276657223", + "0x523a4d4f4323", "role_id#1" ], "stack_out": [ "role_address#0", "role_id#1", - "0x52234f6273657276657223" + "0x523a4d4f4323" ] }, - "641": { + "595": { "op": "dig 2", "defined_out": [ - "0x52234f6273657276657223", + "0x523a4d4f4323", "role_address#0", "role_id#1" ], "stack_out": [ "role_address#0", "role_id#1", - "0x52234f6273657276657223", + "0x523a4d4f4323", "role_address#0" ] }, - "643": { + "597": { "op": "concat", "defined_out": [ "box_prefixed_key%8#0", @@ -3157,7 +3157,7 @@ "box_prefixed_key%8#0" ] }, - "644": { + "598": { "op": "dup", "defined_out": [ "box_prefixed_key%8#0", @@ -3172,7 +3172,7 @@ "box_prefixed_key%8#0 (copy)" ] }, - "645": { + "599": { "op": "box_len", "defined_out": [ "_%4#0", @@ -3189,7 +3189,7 @@ "maybe_exists%4#0" ] }, - "646": { + "600": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -3198,7 +3198,7 @@ "maybe_exists%4#0" ] }, - "648": { + "602": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -3207,7 +3207,7 @@ "box_prefixed_key%8#0" ] }, - "649": { + "603": { "op": "box_del", "defined_out": [ "role_address#0", @@ -3220,17 +3220,17 @@ "{box_del}" ] }, - "650": { + "604": { "op": "pop", "stack_out": [ "role_address#0", "role_id#1" ] }, - "651": { + "605": { "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" }, - "654": { + "608": { "subroutine": "modules.rbac.RbacModule.rbac_contract_suspension[routing]", "params": {}, "block": "rbac_contract_suspension", @@ -3243,7 +3243,7 @@ "tmp%0#0" ] }, - "657": { + "611": { "op": "dup", "defined_out": [ "tmp%0#0", @@ -3254,7 +3254,7 @@ "tmp%0#0 (copy)" ] }, - "658": { + "612": { "op": "len", "defined_out": [ "len%0#0", @@ -3265,7 +3265,7 @@ "len%0#0" ] }, - "659": { + "613": { "op": "intc_0 // 1", "defined_out": [ "1", @@ -3278,7 +3278,7 @@ "1" ] }, - "660": { + "614": { "op": "==", "defined_out": [ "eq%0#0", @@ -3289,14 +3289,14 @@ "eq%0#0" ] }, - "661": { + "615": { "error": "invalid number of bytes for arc4.bool", "op": "assert // invalid number of bytes for arc4.bool", "stack_out": [ "tmp%0#0" ] }, - "662": { + "616": { "op": "intc_1 // 0", "defined_out": [ "0", @@ -3307,7 +3307,7 @@ "0" ] }, - "663": { + "617": { "op": "getbit", "defined_out": [ "suspended#0" @@ -3316,31 +3316,31 @@ "suspended#0" ] }, - "664": { - "op": "bytec_2 // 0x5223417574686f7269747923", + "618": { + "op": "bytec_2 // 0x523a41555423", "defined_out": [ - "0x5223417574686f7269747923", + "0x523a41555423", "suspended#0" ], "stack_out": [ "suspended#0", - "0x5223417574686f7269747923" + "0x523a41555423" ] }, - "665": { + "619": { "op": "txn Sender", "defined_out": [ - "0x5223417574686f7269747923", + "0x523a41555423", "suspended#0", "tmp%0#2" ], "stack_out": [ "suspended#0", - "0x5223417574686f7269747923", + "0x523a41555423", "tmp%0#2" ] }, - "667": { + "621": { "callsub": "modules.rbac.RbacModule._role_is_active", "op": "callsub _role_is_active", "defined_out": [ @@ -3352,14 +3352,14 @@ "tmp%1#0" ] }, - "670": { + "624": { "error": "Not authorized", "op": "assert // Not authorized", "stack_out": [ "suspended#0" ] }, - "671": { + "625": { "op": "bytec 8 // \"asset_suspended\"", "defined_out": [ "\"asset_suspended\"", @@ -3370,18 +3370,18 @@ "\"asset_suspended\"" ] }, - "673": { + "627": { "op": "swap", "stack_out": [ "\"asset_suspended\"", "suspended#0" ] }, - "674": { + "628": { "op": "app_global_put", "stack_out": [] }, - "675": { + "629": { "op": "global LatestTimestamp", "defined_out": [ "tmp%0#1" @@ -3390,7 +3390,7 @@ "tmp%0#1" ] }, - "677": { + "631": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0" @@ -3399,7 +3399,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "678": { + "632": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -3410,14 +3410,14 @@ "0x151f7c75" ] }, - "679": { + "633": { "op": "swap", "stack_out": [ "0x151f7c75", "aggregate%val_as_bytes%0#0" ] }, - "680": { + "634": { "op": "concat", "defined_out": [ "tmp%4#0" @@ -3426,21 +3426,21 @@ "tmp%4#0" ] }, - "681": { + "635": { "op": "log", "stack_out": [] }, - "682": { + "636": { "op": "intc_0 // 1", "stack_out": [ "1" ] }, - "683": { + "637": { "op": "return", "stack_out": [] }, - "684": { + "638": { "subroutine": "modules.rbac.RbacModule.rbac_get_arranger[routing]", "params": {}, "block": "rbac_get_arranger", @@ -3453,18 +3453,18 @@ "0" ] }, - "685": { - "op": "bytec_1 // 0x5223417272616e67657223", + "639": { + "op": "bytec_1 // 0x523a41525223", "defined_out": [ "0", - "0x5223417272616e67657223" + "0x523a41525223" ], "stack_out": [ "0", - "0x5223417272616e67657223" + "0x523a41525223" ] }, - "686": { + "640": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -3475,14 +3475,14 @@ "maybe_exists%0#0" ] }, - "687": { + "641": { "error": "check self.arranger exists", "op": "assert // check self.arranger exists", "stack_out": [ "maybe_value%0#0" ] }, - "688": { + "642": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -3493,14 +3493,14 @@ "0x151f7c75" ] }, - "689": { + "643": { "op": "swap", "stack_out": [ "0x151f7c75", "maybe_value%0#0" ] }, - "690": { + "644": { "op": "concat", "defined_out": [ "tmp%2#0" @@ -3509,11 +3509,11 @@ "tmp%2#0" ] }, - "691": { + "645": { "op": "log", "stack_out": [] }, - "692": { + "646": { "op": "intc_0 // 1", "defined_out": [ "1" @@ -3522,11 +3522,11 @@ "1" ] }, - "693": { + "647": { "op": "return", "stack_out": [] }, - "694": { + "648": { "subroutine": "modules.rbac.RbacModule.rbac_get_address_roles[routing]", "params": {}, "block": "rbac_get_address_roles", @@ -3539,7 +3539,7 @@ "address#0" ] }, - "697": { + "651": { "op": "dup", "defined_out": [ "address#0", @@ -3550,7 +3550,7 @@ "address#0 (copy)" ] }, - "698": { + "652": { "op": "len", "defined_out": [ "address#0", @@ -3561,7 +3561,7 @@ "len%0#0" ] }, - "699": { + "653": { "op": "intc_2 // 32", "defined_out": [ "32", @@ -3574,7 +3574,7 @@ "32" ] }, - "700": { + "654": { "op": "==", "defined_out": [ "address#0", @@ -3585,33 +3585,33 @@ "eq%0#0" ] }, - "701": { + "655": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ "address#0" ] }, - "702": { - "op": "bytec_3 // 0x52234163636f756e744d616e6167657223", + "656": { + "op": "bytec_3 // 0x523a4d4e4723", "defined_out": [ - "0x52234163636f756e744d616e6167657223", + "0x523a4d4e4723", "address#0" ], "stack_out": [ "address#0", - "0x52234163636f756e744d616e6167657223" + "0x523a4d4e4723" ] }, - "703": { + "657": { "op": "dig 1", "stack_out": [ "address#0", - "0x52234163636f756e744d616e6167657223", + "0x523a4d4e4723", "address#0 (copy)" ] }, - "705": { + "659": { "callsub": "modules.rbac.RbacModule._role_is_active", "op": "callsub _role_is_active", "defined_out": [ @@ -3623,29 +3623,29 @@ "tmp%0#1" ] }, - "708": { - "op": "bytec 4 // 0x52235072696d6172794465616c657223", + "662": { + "op": "bytec 4 // 0x523a50594423", "defined_out": [ - "0x52235072696d6172794465616c657223", + "0x523a50594423", "address#0", "tmp%0#1" ], "stack_out": [ "address#0", "tmp%0#1", - "0x52235072696d6172794465616c657223" + "0x523a50594423" ] }, - "710": { + "664": { "op": "dig 2", "stack_out": [ "address#0", "tmp%0#1", - "0x52235072696d6172794465616c657223", + "0x523a50594423", "address#0 (copy)" ] }, - "712": { + "666": { "callsub": "modules.rbac.RbacModule._role_is_active", "op": "callsub _role_is_active", "defined_out": [ @@ -3659,10 +3659,10 @@ "tmp%1#1" ] }, - "715": { - "op": "bytec 5 // 0x52235472757374656523", + "669": { + "op": "bytec 5 // 0x523a54525323", "defined_out": [ - "0x52235472757374656523", + "0x523a54525323", "address#0", "tmp%0#1", "tmp%1#1" @@ -3671,20 +3671,20 @@ "address#0", "tmp%0#1", "tmp%1#1", - "0x52235472757374656523" + "0x523a54525323" ] }, - "717": { + "671": { "op": "dig 3", "stack_out": [ "address#0", "tmp%0#1", "tmp%1#1", - "0x52235472757374656523", + "0x523a54525323", "address#0 (copy)" ] }, - "719": { + "673": { "callsub": "modules.rbac.RbacModule._role_is_active", "op": "callsub _role_is_active", "defined_out": [ @@ -3700,10 +3700,10 @@ "tmp%2#1" ] }, - "722": { - "op": "bytec_2 // 0x5223417574686f7269747923", + "676": { + "op": "bytec_2 // 0x523a41555423", "defined_out": [ - "0x5223417574686f7269747923", + "0x523a41555423", "address#0", "tmp%0#1", "tmp%1#1", @@ -3714,21 +3714,21 @@ "tmp%0#1", "tmp%1#1", "tmp%2#1", - "0x5223417574686f7269747923" + "0x523a41555423" ] }, - "723": { + "677": { "op": "dig 4", "stack_out": [ "address#0", "tmp%0#1", "tmp%1#1", "tmp%2#1", - "0x5223417574686f7269747923", + "0x523a41555423", "address#0 (copy)" ] }, - "725": { + "679": { "callsub": "modules.rbac.RbacModule._role_is_active", "op": "callsub _role_is_active", "defined_out": [ @@ -3746,10 +3746,10 @@ "tmp%3#1" ] }, - "728": { - "op": "bytec 6 // 0x52234f6273657276657223", + "682": { + "op": "bytec 6 // 0x523a4d4f4323", "defined_out": [ - "0x52234f6273657276657223", + "0x523a4d4f4323", "address#0", "tmp%0#1", "tmp%1#1", @@ -3762,21 +3762,21 @@ "tmp%1#1", "tmp%2#1", "tmp%3#1", - "0x52234f6273657276657223" + "0x523a4d4f4323" ] }, - "730": { + "684": { "op": "uncover 5", "stack_out": [ "tmp%0#1", "tmp%1#1", "tmp%2#1", "tmp%3#1", - "0x52234f6273657276657223", + "0x523a4d4f4323", "address#0" ] }, - "732": { + "686": { "callsub": "modules.rbac.RbacModule._role_is_active", "op": "callsub _role_is_active", "defined_out": [ @@ -3794,7 +3794,7 @@ "tmp%4#1" ] }, - "735": { + "689": { "op": "pushbytes 0x00", "defined_out": [ "0x00", @@ -3813,7 +3813,7 @@ "0x00" ] }, - "738": { + "692": { "op": "intc_1 // 0", "defined_out": [ "0", @@ -3834,7 +3834,7 @@ "0" ] }, - "739": { + "693": { "op": "uncover 6", "stack_out": [ "tmp%1#1", @@ -3846,7 +3846,7 @@ "tmp%0#1" ] }, - "741": { + "695": { "op": "setbit", "defined_out": [ "aggregate%encoded_bool%0#0", @@ -3863,7 +3863,7 @@ "aggregate%encoded_bool%0#0" ] }, - "742": { + "696": { "op": "intc_0 // 1", "defined_out": [ "1", @@ -3882,7 +3882,7 @@ "1" ] }, - "743": { + "697": { "op": "uncover 5", "stack_out": [ "tmp%2#1", @@ -3893,7 +3893,7 @@ "tmp%1#1" ] }, - "745": { + "699": { "op": "setbit", "defined_out": [ "aggregate%set_bit%0#0", @@ -3908,7 +3908,7 @@ "aggregate%set_bit%0#0" ] }, - "746": { + "700": { "op": "pushint 2", "defined_out": [ "2", @@ -3925,7 +3925,7 @@ "2" ] }, - "748": { + "702": { "op": "uncover 4", "stack_out": [ "tmp%3#1", @@ -3935,7 +3935,7 @@ "tmp%2#1" ] }, - "750": { + "704": { "op": "setbit", "defined_out": [ "aggregate%set_bit%1#0", @@ -3948,7 +3948,7 @@ "aggregate%set_bit%1#0" ] }, - "751": { + "705": { "op": "pushint 3", "defined_out": [ "3", @@ -3963,7 +3963,7 @@ "3" ] }, - "753": { + "707": { "op": "uncover 3", "stack_out": [ "tmp%4#1", @@ -3972,7 +3972,7 @@ "tmp%3#1" ] }, - "755": { + "709": { "op": "setbit", "defined_out": [ "aggregate%set_bit%2#0", @@ -3983,7 +3983,7 @@ "aggregate%set_bit%2#0" ] }, - "756": { + "710": { "op": "pushint 4", "defined_out": [ "4", @@ -3996,7 +3996,7 @@ "4" ] }, - "758": { + "712": { "op": "uncover 2", "stack_out": [ "aggregate%set_bit%2#0", @@ -4004,7 +4004,7 @@ "tmp%4#1" ] }, - "760": { + "714": { "op": "setbit", "defined_out": [ "aggregate%set_bit%3#0" @@ -4013,7 +4013,7 @@ "aggregate%set_bit%3#0" ] }, - "761": { + "715": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -4024,14 +4024,14 @@ "0x151f7c75" ] }, - "762": { + "716": { "op": "swap", "stack_out": [ "0x151f7c75", "aggregate%set_bit%3#0" ] }, - "763": { + "717": { "op": "concat", "defined_out": [ "tmp%8#0" @@ -4040,21 +4040,21 @@ "tmp%8#0" ] }, - "764": { + "718": { "op": "log", "stack_out": [] }, - "765": { + "719": { "op": "intc_0 // 1", "stack_out": [ "1" ] }, - "766": { + "720": { "op": "return", "stack_out": [] }, - "767": { + "721": { "subroutine": "modules.rbac.RbacModule.rbac_get_role_validity[routing]", "params": {}, "block": "rbac_get_role_validity", @@ -4067,7 +4067,7 @@ "role_id#0" ] }, - "770": { + "724": { "op": "dup", "defined_out": [ "role_id#0", @@ -4078,7 +4078,7 @@ "role_id#0 (copy)" ] }, - "771": { + "725": { "op": "len", "defined_out": [ "len%0#0", @@ -4089,7 +4089,7 @@ "len%0#0" ] }, - "772": { + "726": { "op": "intc_0 // 1", "defined_out": [ "1", @@ -4102,7 +4102,7 @@ "1" ] }, - "773": { + "727": { "op": "==", "defined_out": [ "eq%0#0", @@ -4113,17 +4113,17 @@ "eq%0#0" ] }, - "774": { + "728": { "error": "invalid number of bytes for arc4.uint8", "op": "assert // invalid number of bytes for arc4.uint8", "stack_out": [ "role_id#0" ] }, - "775": { + "729": { "op": "txna ApplicationArgs 2" }, - "778": { + "732": { "op": "dup", "defined_out": [ "role_address#0", @@ -4135,7 +4135,7 @@ "role_address#0" ] }, - "779": { + "733": { "op": "cover 2", "defined_out": [ "role_address#0", @@ -4147,7 +4147,7 @@ "role_address#0" ] }, - "781": { + "735": { "op": "len", "defined_out": [ "len%1#0", @@ -4160,7 +4160,7 @@ "len%1#0" ] }, - "782": { + "736": { "op": "intc_2 // 32", "defined_out": [ "32", @@ -4175,7 +4175,7 @@ "32" ] }, - "783": { + "737": { "op": "==", "defined_out": [ "eq%1#0", @@ -4188,7 +4188,7 @@ "eq%1#0" ] }, - "784": { + "738": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ @@ -4196,7 +4196,7 @@ "role_id#0" ] }, - "785": { + "739": { "op": "btoi", "defined_out": [ "role#0", @@ -4207,7 +4207,7 @@ "role#0" ] }, - "786": { + "740": { "op": "dup", "defined_out": [ "role#0", @@ -4220,7 +4220,7 @@ "role#0 (copy)" ] }, - "787": { + "741": { "callsub": "modules.rbac.RbacModule._assert_valid_role", "op": "callsub _assert_valid_role", "stack_out": [ @@ -4228,7 +4228,7 @@ "role#0" ] }, - "790": { + "744": { "op": "intc_3 // 20", "defined_out": [ "20", @@ -4241,7 +4241,7 @@ "20" ] }, - "791": { + "745": { "op": "pushints 40 50 60 70 80", "defined_out": [ "20", @@ -4264,7 +4264,7 @@ "80" ] }, - "798": { + "752": { "op": "uncover 6", "stack_out": [ "role_address#0", @@ -4277,43 +4277,43 @@ "role#0" ] }, - "800": { + "754": { "op": "match rbac_get_role_validity_switch_case_0@2 rbac_get_role_validity_switch_case_1@3 rbac_get_role_validity_switch_case_2@4 rbac_get_role_validity_switch_case_3@5 rbac_get_role_validity_switch_case_4@6 rbac_get_role_validity_switch_case_5@7", "stack_out": [ "role_address#0" ] }, - "814": { + "768": { "error": "Invalid role identifier", "op": "err // Invalid role identifier" }, - "815": { + "769": { "block": "rbac_get_role_validity_switch_case_5@7", "stack_in": [ "role_address#0" ], - "op": "bytec 6 // 0x52234f6273657276657223", + "op": "bytec 6 // 0x523a4d4f4323", "defined_out": [ - "0x52234f6273657276657223" + "0x523a4d4f4323" ], "stack_out": [ "role_address#0", - "0x52234f6273657276657223" + "0x523a4d4f4323" ] }, - "817": { + "771": { "op": "dig 1", "defined_out": [ - "0x52234f6273657276657223", + "0x523a4d4f4323", "role_address#0" ], "stack_out": [ "role_address#0", - "0x52234f6273657276657223", + "0x523a4d4f4323", "role_address#0" ] }, - "819": { + "773": { "op": "concat", "defined_out": [ "box_prefixed_key%0#1", @@ -4324,7 +4324,7 @@ "box_prefixed_key%0#1" ] }, - "820": { + "774": { "op": "dup", "defined_out": [ "box_prefixed_key%0#1", @@ -4337,7 +4337,7 @@ "box_prefixed_key%0#1 (copy)" ] }, - "821": { + "775": { "op": "box_len", "defined_out": [ "_%0#0", @@ -4352,7 +4352,7 @@ "maybe_exists%0#0" ] }, - "822": { + "776": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -4360,7 +4360,7 @@ "maybe_exists%0#0" ] }, - "824": { + "778": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -4368,7 +4368,7 @@ "box_prefixed_key%0#1" ] }, - "825": { + "779": { "op": "box_get", "defined_out": [ "aggregate%box_get%8#0", @@ -4381,7 +4381,7 @@ "aggregate%box_get%9#0" ] }, - "826": { + "780": { "op": "pop", "defined_out": [ "role_address#0", @@ -4392,7 +4392,7 @@ "tmp%3#0" ] }, - "827": { + "781": { "block": "rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9", "stack_in": [ "role_address#0", @@ -4408,7 +4408,7 @@ "0x151f7c75" ] }, - "828": { + "782": { "op": "swap", "defined_out": [ "0x151f7c75", @@ -4420,7 +4420,7 @@ "tmp%3#0" ] }, - "829": { + "783": { "op": "concat", "defined_out": [ "tmp%4#0" @@ -4430,13 +4430,13 @@ "tmp%4#0" ] }, - "830": { + "784": { "op": "log", "stack_out": [ "role_address#0" ] }, - "831": { + "785": { "op": "intc_0 // 1", "defined_out": [ "1" @@ -4446,39 +4446,39 @@ "1" ] }, - "832": { + "786": { "op": "return", "stack_out": [ "role_address#0" ] }, - "833": { + "787": { "block": "rbac_get_role_validity_switch_case_4@6", "stack_in": [ "role_address#0" ], - "op": "bytec_2 // 0x5223417574686f7269747923", + "op": "bytec_2 // 0x523a41555423", "defined_out": [ - "0x5223417574686f7269747923" + "0x523a41555423" ], "stack_out": [ "role_address#0", - "0x5223417574686f7269747923" + "0x523a41555423" ] }, - "834": { + "788": { "op": "dig 1", "defined_out": [ - "0x5223417574686f7269747923", + "0x523a41555423", "role_address#0" ], "stack_out": [ "role_address#0", - "0x5223417574686f7269747923", + "0x523a41555423", "role_address#0" ] }, - "836": { + "790": { "op": "concat", "defined_out": [ "box_prefixed_key%0#1", @@ -4489,7 +4489,7 @@ "box_prefixed_key%0#1" ] }, - "837": { + "791": { "op": "dup", "defined_out": [ "box_prefixed_key%0#1", @@ -4502,7 +4502,7 @@ "box_prefixed_key%0#1 (copy)" ] }, - "838": { + "792": { "op": "box_len", "defined_out": [ "_%0#0", @@ -4517,7 +4517,7 @@ "maybe_exists%0#0" ] }, - "839": { + "793": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -4525,7 +4525,7 @@ "maybe_exists%0#0" ] }, - "841": { + "795": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -4533,7 +4533,7 @@ "box_prefixed_key%0#1" ] }, - "842": { + "796": { "op": "box_get", "defined_out": [ "aggregate%box_get%6#0", @@ -4546,7 +4546,7 @@ "aggregate%box_get%7#0" ] }, - "843": { + "797": { "op": "pop", "defined_out": [ "role_address#0", @@ -4557,36 +4557,36 @@ "tmp%3#0" ] }, - "844": { + "798": { "op": "b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9" }, - "847": { + "801": { "block": "rbac_get_role_validity_switch_case_3@5", "stack_in": [ "role_address#0" ], - "op": "bytec 5 // 0x52235472757374656523", + "op": "bytec 5 // 0x523a54525323", "defined_out": [ - "0x52235472757374656523" + "0x523a54525323" ], "stack_out": [ "role_address#0", - "0x52235472757374656523" + "0x523a54525323" ] }, - "849": { + "803": { "op": "dig 1", "defined_out": [ - "0x52235472757374656523", + "0x523a54525323", "role_address#0" ], "stack_out": [ "role_address#0", - "0x52235472757374656523", + "0x523a54525323", "role_address#0" ] }, - "851": { + "805": { "op": "concat", "defined_out": [ "box_prefixed_key%0#1", @@ -4597,7 +4597,7 @@ "box_prefixed_key%0#1" ] }, - "852": { + "806": { "op": "dup", "defined_out": [ "box_prefixed_key%0#1", @@ -4610,7 +4610,7 @@ "box_prefixed_key%0#1 (copy)" ] }, - "853": { + "807": { "op": "box_len", "defined_out": [ "_%0#0", @@ -4625,7 +4625,7 @@ "maybe_exists%0#0" ] }, - "854": { + "808": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -4633,7 +4633,7 @@ "maybe_exists%0#0" ] }, - "856": { + "810": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -4641,7 +4641,7 @@ "box_prefixed_key%0#1" ] }, - "857": { + "811": { "op": "box_get", "defined_out": [ "aggregate%box_get%4#0", @@ -4654,7 +4654,7 @@ "aggregate%box_get%5#0" ] }, - "858": { + "812": { "op": "pop", "defined_out": [ "role_address#0", @@ -4665,36 +4665,36 @@ "tmp%3#0" ] }, - "859": { + "813": { "op": "b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9" }, - "862": { + "816": { "block": "rbac_get_role_validity_switch_case_2@4", "stack_in": [ "role_address#0" ], - "op": "bytec 4 // 0x52235072696d6172794465616c657223", + "op": "bytec 4 // 0x523a50594423", "defined_out": [ - "0x52235072696d6172794465616c657223" + "0x523a50594423" ], "stack_out": [ "role_address#0", - "0x52235072696d6172794465616c657223" + "0x523a50594423" ] }, - "864": { + "818": { "op": "dig 1", "defined_out": [ - "0x52235072696d6172794465616c657223", + "0x523a50594423", "role_address#0" ], "stack_out": [ "role_address#0", - "0x52235072696d6172794465616c657223", + "0x523a50594423", "role_address#0" ] }, - "866": { + "820": { "op": "concat", "defined_out": [ "box_prefixed_key%0#1", @@ -4705,7 +4705,7 @@ "box_prefixed_key%0#1" ] }, - "867": { + "821": { "op": "dup", "defined_out": [ "box_prefixed_key%0#1", @@ -4718,7 +4718,7 @@ "box_prefixed_key%0#1 (copy)" ] }, - "868": { + "822": { "op": "box_len", "defined_out": [ "_%0#0", @@ -4733,7 +4733,7 @@ "maybe_exists%0#0" ] }, - "869": { + "823": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -4741,7 +4741,7 @@ "maybe_exists%0#0" ] }, - "871": { + "825": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -4749,7 +4749,7 @@ "box_prefixed_key%0#1" ] }, - "872": { + "826": { "op": "box_get", "defined_out": [ "aggregate%box_get%2#0", @@ -4762,7 +4762,7 @@ "aggregate%box_get%3#0" ] }, - "873": { + "827": { "op": "pop", "defined_out": [ "role_address#0", @@ -4773,36 +4773,36 @@ "tmp%3#0" ] }, - "874": { + "828": { "op": "b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9" }, - "877": { + "831": { "block": "rbac_get_role_validity_switch_case_1@3", "stack_in": [ "role_address#0" ], - "op": "bytec_3 // 0x52234163636f756e744d616e6167657223", + "op": "bytec_3 // 0x523a4d4e4723", "defined_out": [ - "0x52234163636f756e744d616e6167657223" + "0x523a4d4e4723" ], "stack_out": [ "role_address#0", - "0x52234163636f756e744d616e6167657223" + "0x523a4d4e4723" ] }, - "878": { + "832": { "op": "dig 1", "defined_out": [ - "0x52234163636f756e744d616e6167657223", + "0x523a4d4e4723", "role_address#0" ], "stack_out": [ "role_address#0", - "0x52234163636f756e744d616e6167657223", + "0x523a4d4e4723", "role_address#0" ] }, - "880": { + "834": { "op": "concat", "defined_out": [ "box_prefixed_key%0#1", @@ -4813,7 +4813,7 @@ "box_prefixed_key%0#1" ] }, - "881": { + "835": { "op": "dup", "defined_out": [ "box_prefixed_key%0#1", @@ -4826,7 +4826,7 @@ "box_prefixed_key%0#1 (copy)" ] }, - "882": { + "836": { "op": "box_len", "defined_out": [ "_%0#0", @@ -4841,7 +4841,7 @@ "maybe_exists%0#0" ] }, - "883": { + "837": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -4849,7 +4849,7 @@ "maybe_exists%0#0" ] }, - "885": { + "839": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -4857,7 +4857,7 @@ "box_prefixed_key%0#1" ] }, - "886": { + "840": { "op": "box_get", "defined_out": [ "aggregate%box_get%0#0", @@ -4870,7 +4870,7 @@ "aggregate%box_get%1#0" ] }, - "887": { + "841": { "op": "pop", "defined_out": [ "role_address#0", @@ -4881,10 +4881,10 @@ "tmp%3#0" ] }, - "888": { + "842": { "op": "b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9" }, - "891": { + "845": { "block": "rbac_get_role_validity_switch_case_0@2", "stack_in": [ "role_address#0" @@ -4898,10 +4898,10 @@ "tmp%3#0" ] }, - "909": { + "863": { "op": "b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9" }, - "912": { + "866": { "subroutine": "modules.rbac.RbacModule._role_is_active", "params": { "role_map#0": "bytes", @@ -4911,13 +4911,13 @@ "stack_in": [], "op": "proto 2 1" }, - "915": { + "869": { "op": "pushbytes \"\"", "stack_out": [ "awst_tmp%0#0" ] }, - "917": { + "871": { "op": "frame_dig -2", "defined_out": [ "role_map#0 (copy)" @@ -4927,7 +4927,7 @@ "role_map#0 (copy)" ] }, - "919": { + "873": { "op": "frame_dig -1", "defined_out": [ "role_address#0 (copy)", @@ -4939,7 +4939,7 @@ "role_address#0 (copy)" ] }, - "921": { + "875": { "op": "concat", "defined_out": [ "box_prefixed_key%0#1" @@ -4949,7 +4949,7 @@ "box_prefixed_key%0#1" ] }, - "922": { + "876": { "op": "dup", "defined_out": [ "box_prefixed_key%0#1" @@ -4960,7 +4960,7 @@ "box_prefixed_key%0#1" ] }, - "923": { + "877": { "op": "box_len", "defined_out": [ "_%0#0", @@ -4974,7 +4974,7 @@ "maybe_exists%0#0" ] }, - "924": { + "878": { "op": "bury 1", "stack_out": [ "awst_tmp%0#0", @@ -4982,14 +4982,14 @@ "maybe_exists%0#0" ] }, - "926": { + "880": { "op": "bz _role_is_active_bool_false@4", "stack_out": [ "awst_tmp%0#0", "box_prefixed_key%0#1" ] }, - "929": { + "883": { "op": "frame_dig 1", "stack_out": [ "awst_tmp%0#0", @@ -4997,7 +4997,7 @@ "box_prefixed_key%0#1" ] }, - "931": { + "885": { "op": "box_get", "defined_out": [ "aggregate%box_get%0#0", @@ -5011,7 +5011,7 @@ "aggregate%box_get%1#0" ] }, - "932": { + "886": { "error": "check BoxMap entry exists", "op": "assert // check BoxMap entry exists", "stack_out": [ @@ -5020,7 +5020,7 @@ "aggregate%box_get%0#0" ] }, - "933": { + "887": { "op": "intc_1 // 0", "stack_out": [ "awst_tmp%0#0", @@ -5029,7 +5029,7 @@ "0" ] }, - "934": { + "888": { "op": "extract_uint64", "defined_out": [ "box_prefixed_key%0#1", @@ -5041,10 +5041,10 @@ "values%0#0" ] }, - "935": { + "889": { "op": "global LatestTimestamp" }, - "937": { + "891": { "op": "dup", "defined_out": [ "awst_tmp%0#0", @@ -5059,7 +5059,7 @@ "awst_tmp%0#0" ] }, - "938": { + "892": { "op": "frame_bury 0", "defined_out": [ "awst_tmp%0#0", @@ -5073,7 +5073,7 @@ "awst_tmp%0#0" ] }, - "940": { + "894": { "op": "<=", "defined_out": [ "awst_tmp%0#0", @@ -5086,14 +5086,14 @@ "tmp%1#0" ] }, - "941": { + "895": { "op": "bz _role_is_active_bool_false@4", "stack_out": [ "awst_tmp%0#0", "box_prefixed_key%0#1" ] }, - "944": { + "898": { "op": "frame_dig 1", "stack_out": [ "awst_tmp%0#0", @@ -5101,7 +5101,7 @@ "box_prefixed_key%0#1" ] }, - "946": { + "900": { "op": "box_get", "defined_out": [ "aggregate%box_get%2#0", @@ -5116,7 +5116,7 @@ "aggregate%box_get%3#0" ] }, - "947": { + "901": { "error": "check BoxMap entry exists", "op": "assert // check BoxMap entry exists", "stack_out": [ @@ -5125,7 +5125,7 @@ "aggregate%box_get%2#0" ] }, - "948": { + "902": { "op": "pushint 8", "defined_out": [ "8", @@ -5140,7 +5140,7 @@ "8" ] }, - "950": { + "904": { "op": "extract_uint64", "defined_out": [ "awst_tmp%0#0", @@ -5153,7 +5153,7 @@ "values%1#0" ] }, - "951": { + "905": { "op": "frame_dig 0", "stack_out": [ "awst_tmp%0#0", @@ -5162,7 +5162,7 @@ "awst_tmp%0#0" ] }, - "953": { + "907": { "op": ">=", "defined_out": [ "awst_tmp%0#0", @@ -5175,14 +5175,14 @@ "tmp%2#0" ] }, - "954": { + "908": { "op": "bz _role_is_active_bool_false@4", "stack_out": [ "awst_tmp%0#0", "box_prefixed_key%0#1" ] }, - "957": { + "911": { "op": "intc_0 // 1", "defined_out": [ "and_result%0#0", @@ -5195,7 +5195,7 @@ "and_result%0#0" ] }, - "958": { + "912": { "block": "_role_is_active_bool_merge@5", "stack_in": [ "awst_tmp%0#0", @@ -5207,11 +5207,11 @@ "and_result%0#0" ] }, - "960": { + "914": { "retsub": true, "op": "retsub" }, - "961": { + "915": { "block": "_role_is_active_bool_false@4", "stack_in": [ "awst_tmp%0#0", @@ -5227,10 +5227,10 @@ "and_result%0#0" ] }, - "962": { + "916": { "op": "b _role_is_active_bool_merge@5" }, - "965": { + "919": { "subroutine": "modules.rbac.RbacModule._assert_caller_is_arranger", "params": {}, "block": "_assert_caller_is_arranger", @@ -5243,7 +5243,7 @@ "role_address#0" ] }, - "967": { + "921": { "op": "intc_1 // 0", "defined_out": [ "0", @@ -5254,20 +5254,20 @@ "0" ] }, - "968": { - "op": "bytec_1 // 0x5223417272616e67657223", + "922": { + "op": "bytec_1 // 0x523a41525223", "defined_out": [ "0", - "0x5223417272616e67657223", + "0x523a41525223", "role_address#0" ], "stack_out": [ "role_address#0", "0", - "0x5223417272616e67657223" + "0x523a41525223" ] }, - "969": { + "923": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -5280,7 +5280,7 @@ "maybe_exists%0#0" ] }, - "970": { + "924": { "error": "check self.arranger exists", "op": "assert // check self.arranger exists", "stack_out": [ @@ -5288,7 +5288,7 @@ "maybe_value%0#0" ] }, - "971": { + "925": { "op": "==", "defined_out": [ "tmp%0#1" @@ -5297,16 +5297,16 @@ "tmp%0#1" ] }, - "972": { + "926": { "error": "Not authorized", "op": "assert // Not authorized", "stack_out": [] }, - "973": { + "927": { "retsub": true, "op": "retsub" }, - "974": { + "928": { "subroutine": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", "params": {}, "block": "_assert_is_not_asset_defaulted", @@ -5319,7 +5319,7 @@ "0" ] }, - "975": { + "929": { "op": "bytec 9 // \"asset_defaulted\"", "defined_out": [ "\"asset_defaulted\"", @@ -5330,7 +5330,7 @@ "\"asset_defaulted\"" ] }, - "977": { + "931": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -5341,14 +5341,14 @@ "maybe_exists%0#0" ] }, - "978": { + "932": { "error": "check self.asset_defaulted exists", "op": "assert // check self.asset_defaulted exists", "stack_out": [ "maybe_value%0#0" ] }, - "979": { + "933": { "op": "!", "defined_out": [ "tmp%0#0" @@ -5357,16 +5357,16 @@ "tmp%0#0" ] }, - "980": { + "934": { "error": "Defaulted", "op": "assert // Defaulted", "stack_out": [] }, - "981": { + "935": { "retsub": true, "op": "retsub" }, - "982": { + "936": { "subroutine": "modules.rbac.RbacModule._assert_valid_role", "params": { "role_id#0": "uint64" @@ -5375,7 +5375,7 @@ "stack_in": [], "op": "proto 1 0" }, - "985": { + "939": { "op": "frame_dig -1", "defined_out": [ "role_id#0 (copy)" @@ -5384,7 +5384,7 @@ "role_id#0 (copy)" ] }, - "987": { + "941": { "op": "intc_3 // 20", "defined_out": [ "20", @@ -5395,7 +5395,7 @@ "20" ] }, - "988": { + "942": { "op": "==", "defined_out": [ "tmp%0#0" @@ -5404,17 +5404,17 @@ "tmp%0#0" ] }, - "989": { + "943": { "op": "bnz _assert_valid_role_bool_true@7", "stack_out": [] }, - "992": { + "946": { "op": "frame_dig -1", "stack_out": [ "role_id#0 (copy)" ] }, - "994": { + "948": { "op": "pushint 25", "defined_out": [ "25", @@ -5425,7 +5425,7 @@ "25" ] }, - "996": { + "950": { "op": "==", "defined_out": [ "tmp%1#0" @@ -5434,17 +5434,17 @@ "tmp%1#0" ] }, - "997": { + "951": { "op": "bnz _assert_valid_role_bool_true@7", "stack_out": [] }, - "1000": { + "954": { "op": "frame_dig -1", "stack_out": [ "role_id#0 (copy)" ] }, - "1002": { + "956": { "op": "pushint 40", "defined_out": [ "40", @@ -5455,7 +5455,7 @@ "40" ] }, - "1004": { + "958": { "op": "==", "defined_out": [ "tmp%2#0" @@ -5464,17 +5464,17 @@ "tmp%2#0" ] }, - "1005": { + "959": { "op": "bnz _assert_valid_role_bool_true@7", "stack_out": [] }, - "1008": { + "962": { "op": "frame_dig -1", "stack_out": [ "role_id#0 (copy)" ] }, - "1010": { + "964": { "op": "pushint 50", "defined_out": [ "50", @@ -5485,7 +5485,7 @@ "50" ] }, - "1012": { + "966": { "op": "==", "defined_out": [ "tmp%3#0" @@ -5494,17 +5494,17 @@ "tmp%3#0" ] }, - "1013": { + "967": { "op": "bnz _assert_valid_role_bool_true@7", "stack_out": [] }, - "1016": { + "970": { "op": "frame_dig -1", "stack_out": [ "role_id#0 (copy)" ] }, - "1018": { + "972": { "op": "pushint 60", "defined_out": [ "60", @@ -5515,7 +5515,7 @@ "60" ] }, - "1020": { + "974": { "op": "==", "defined_out": [ "tmp%4#0" @@ -5524,17 +5524,17 @@ "tmp%4#0" ] }, - "1021": { + "975": { "op": "bnz _assert_valid_role_bool_true@7", "stack_out": [] }, - "1024": { + "978": { "op": "frame_dig -1", "stack_out": [ "role_id#0 (copy)" ] }, - "1026": { + "980": { "op": "pushint 70", "defined_out": [ "70", @@ -5545,7 +5545,7 @@ "70" ] }, - "1028": { + "982": { "op": "==", "defined_out": [ "tmp%5#0" @@ -5554,17 +5554,17 @@ "tmp%5#0" ] }, - "1029": { + "983": { "op": "bnz _assert_valid_role_bool_true@7", "stack_out": [] }, - "1032": { + "986": { "op": "frame_dig -1", "stack_out": [ "role_id#0 (copy)" ] }, - "1034": { + "988": { "op": "pushint 80", "defined_out": [ "80", @@ -5575,7 +5575,7 @@ "80" ] }, - "1036": { + "990": { "op": "==", "defined_out": [ "tmp%6#0" @@ -5584,11 +5584,11 @@ "tmp%6#0" ] }, - "1037": { + "991": { "op": "bz _assert_valid_role_bool_false@8", "stack_out": [] }, - "1040": { + "994": { "block": "_assert_valid_role_bool_true@7", "stack_in": [], "op": "intc_0 // 1", @@ -5599,7 +5599,7 @@ "or_result%0#0" ] }, - "1041": { + "995": { "error": "Invalid role identifier", "block": "_assert_valid_role_bool_merge@9", "stack_in": [ @@ -5609,11 +5609,11 @@ "defined_out": [], "stack_out": [] }, - "1042": { + "996": { "retsub": true, "op": "retsub" }, - "1043": { + "997": { "block": "_assert_valid_role_bool_false@8", "stack_in": [], "op": "intc_1 // 0", @@ -5624,7 +5624,7 @@ "or_result%0#0" ] }, - "1044": { + "998": { "op": "b _assert_valid_role_bool_merge@9" } } diff --git a/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.approval.teal b/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.approval.teal index a2db463b..b0958e1f 100644 --- a/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.approval.teal +++ b/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.approval.teal @@ -4,18 +4,18 @@ // algopy.arc4.ARC4Contract.approval_program() -> uint64: main: intcblock 1 0 32 20 - bytecblock 0x151f7c75 0x5223417272616e67657223 0x5223417574686f7269747923 0x52234163636f756e744d616e6167657223 0x52235072696d6172794465616c657223 0x52235472757374656523 0x52234f6273657276657223 0x52234f704461656d6f6e23 "asset_suspended" "asset_defaulted" + bytecblock 0x151f7c75 0x523a41525223 0x523a41555423 0x523a4d4e4723 0x523a50594423 0x523a54525323 0x523a4d4f4323 0x523a4f504423 "asset_suspended" "asset_defaulted" txn ApplicationID bnz main_after_if_else@2 // modules/rbac.py:28-29 // # RBAC Roles // self.arranger = GlobalState(Account(), key=cst.PREFIX_ID_ARRANGER) - bytec_1 // 0x5223417272616e67657223 + bytec_1 // 0x523a41525223 global ZeroAddress app_global_put // modules/rbac.py:30 // self.op_daemon = GlobalState(Account(), key=cst.PREFIX_ID_OP_DAEMON) - bytec 7 // 0x52234f704461656d6f6e23 + bytec 7 // 0x523a4f504423 global ZeroAddress app_global_put // modules/rbac.py:47-48 @@ -74,7 +74,7 @@ main_create@19: assert // smart_contracts/mock_module_rbac/contract.py:16 // self.arranger.value = Txn.sender - bytec_1 // 0x5223417272616e67657223 + bytec_1 // 0x523a41525223 txn Sender app_global_put // smart_contracts/mock_module_rbac/contract.py:14 @@ -85,7 +85,7 @@ main_create@19: // modules.rbac.RbacModule.contract_update[routing]() -> void: contract_update: - // modules/rbac.py:153-156 + // modules/rbac.py:159-162 // # The reference implementation grants the update permissions to the Arranger. // # ⚠️ WARNING: Application updates must be executed VERY carefully, as they // # might introduce breaking changes. @@ -99,7 +99,7 @@ contract_update: // modules.rbac.RbacModule.rbac_rotate_arranger[routing]() -> void: rbac_rotate_arranger: - // modules/rbac.py:158 + // modules/rbac.py:164 // @arc4.abimethod txna ApplicationArgs 1 dup @@ -107,18 +107,18 @@ rbac_rotate_arranger: intc_2 // 32 == assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:169 + // modules/rbac.py:178 // self._assert_caller_is_arranger() callsub _assert_caller_is_arranger - // modules/rbac.py:170 + // modules/rbac.py:179 // self.arranger.value = new_arranger - bytec_1 // 0x5223417272616e67657223 + bytec_1 // 0x523a41525223 swap app_global_put - // modules/rbac.py:171 + // modules/rbac.py:180 // return Global.latest_timestamp global LatestTimestamp - // modules/rbac.py:158 + // modules/rbac.py:164 // @arc4.abimethod itob bytec_0 // 0x151f7c75 @@ -131,7 +131,7 @@ rbac_rotate_arranger: // modules.rbac.RbacModule.rbac_set_op_daemon[routing]() -> void: rbac_set_op_daemon: - // modules/rbac.py:173 + // modules/rbac.py:182 // @arc4.abimethod txna ApplicationArgs 1 dup @@ -139,18 +139,18 @@ rbac_set_op_daemon: intc_2 // 32 == assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:184 + // modules/rbac.py:196 // self._assert_caller_is_arranger() callsub _assert_caller_is_arranger - // modules/rbac.py:185 + // modules/rbac.py:197 // self.op_daemon.value = address - bytec 7 // 0x52234f704461656d6f6e23 + bytec 7 // 0x523a4f504423 swap app_global_put - // modules/rbac.py:186 + // modules/rbac.py:198 // return Global.latest_timestamp global LatestTimestamp - // modules/rbac.py:173 + // modules/rbac.py:182 // @arc4.abimethod itob bytec_0 // 0x151f7c75 @@ -163,7 +163,7 @@ rbac_set_op_daemon: // modules.rbac.RbacModule.rbac_assign_role[routing]() -> void: rbac_assign_role: - // modules/rbac.py:188 + // modules/rbac.py:200 // @arc4.abimethod txna ApplicationArgs 1 dup @@ -185,13 +185,13 @@ rbac_assign_role: pushint 16 == assert // invalid number of bytes for smart_contracts.abi_types.RoleValidity - // modules/rbac.py:210 + // modules/rbac.py:222 // self._assert_caller_is_arranger() callsub _assert_caller_is_arranger - // modules/rbac.py:211 + // modules/rbac.py:223 // self._assert_is_not_asset_defaulted() callsub _assert_is_not_asset_defaulted - // modules/rbac.py:212 + // modules/rbac.py:224 // self._assert_valid_role(role_id.as_uint64()) btoi dupn 2 @@ -203,15 +203,15 @@ rbac_assign_role: bz rbac_assign_role_after_if_else@3 // modules/rbac.py:103 // self.arranger.value = role_address - bytec_1 // 0x5223417272616e67657223 + bytec_1 // 0x523a41525223 dig 3 app_global_put rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14: - // modules/rbac.py:214 + // modules/rbac.py:226 // return Global.latest_timestamp global LatestTimestamp - // modules/rbac.py:188 + // modules/rbac.py:200 // @arc4.abimethod itob bytec_0 // 0x151f7c75 @@ -230,7 +230,7 @@ rbac_assign_role_after_if_else@3: bz rbac_assign_role_after_if_else@5 // modules/rbac.py:107 // assert role_address not in self.account_manager, err.INVALID_ROLE_ADDRESS - bytec_3 // 0x52234163636f756e744d616e6167657223 + bytec_3 // 0x523a4d4e4723 dig 3 concat dup @@ -242,7 +242,7 @@ rbac_assign_role_after_if_else@3: // self.account_manager[role_address] = validity.copy() dig 2 box_put - // modules/rbac.py:213 + // modules/rbac.py:225 // self._set_role(role_id.as_uint64(), role_address, validity) b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14 @@ -255,7 +255,7 @@ rbac_assign_role_after_if_else@5: bz rbac_assign_role_after_if_else@7 // modules/rbac.py:111 // assert role_address not in self.primary_dealer, err.INVALID_ROLE_ADDRESS - bytec 4 // 0x52235072696d6172794465616c657223 + bytec 4 // 0x523a50594423 dig 3 concat dup @@ -267,7 +267,7 @@ rbac_assign_role_after_if_else@5: // self.primary_dealer[role_address] = validity.copy() dig 2 box_put - // modules/rbac.py:213 + // modules/rbac.py:225 // self._set_role(role_id.as_uint64(), role_address, validity) b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14 @@ -280,7 +280,7 @@ rbac_assign_role_after_if_else@7: bz rbac_assign_role_after_if_else@9 // modules/rbac.py:115 // assert role_address not in self.trustee, err.INVALID_ROLE_ADDRESS - bytec 5 // 0x52235472757374656523 + bytec 5 // 0x523a54525323 dig 3 concat dup @@ -292,7 +292,7 @@ rbac_assign_role_after_if_else@7: // self.trustee[role_address] = validity.copy() dig 2 box_put - // modules/rbac.py:213 + // modules/rbac.py:225 // self._set_role(role_id.as_uint64(), role_address, validity) b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14 @@ -305,7 +305,7 @@ rbac_assign_role_after_if_else@9: bz rbac_assign_role_after_if_else@11 // modules/rbac.py:119 // assert role_address not in self.authority, err.INVALID_ROLE_ADDRESS - bytec_2 // 0x5223417574686f7269747923 + bytec_2 // 0x523a41555423 dig 3 concat dup @@ -317,7 +317,7 @@ rbac_assign_role_after_if_else@9: // self.authority[role_address] = validity.copy() dig 2 box_put - // modules/rbac.py:213 + // modules/rbac.py:225 // self._set_role(role_id.as_uint64(), role_address, validity) b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14 @@ -330,7 +330,7 @@ rbac_assign_role_after_if_else@11: bz rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14 // modules/rbac.py:123 // assert role_address not in self.observer, err.INVALID_ROLE_ADDRESS - bytec 6 // 0x52234f6273657276657223 + bytec 6 // 0x523a4d4f4323 dig 3 concat dup @@ -347,7 +347,7 @@ rbac_assign_role_after_if_else@11: // modules.rbac.RbacModule.rbac_revoke_role[routing]() -> void: rbac_revoke_role: - // modules/rbac.py:216 + // modules/rbac.py:228 // @arc4.abimethod txna ApplicationArgs 1 dup @@ -362,13 +362,13 @@ rbac_revoke_role: intc_2 // 32 == assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:235 + // modules/rbac.py:247 // self._assert_caller_is_arranger() callsub _assert_caller_is_arranger - // modules/rbac.py:236 + // modules/rbac.py:248 // self._assert_is_not_asset_defaulted() callsub _assert_is_not_asset_defaulted - // modules/rbac.py:237 + // modules/rbac.py:249 // self._assert_valid_role(role_id.as_uint64()) btoi dupn 2 @@ -386,7 +386,7 @@ rbac_revoke_role: bz rbac_revoke_role_after_if_else@3 // modules/rbac.py:129 // assert role_address in self.account_manager, err.INVALID_ROLE_ADDRESS - bytec_3 // 0x52234163636f756e744d616e6167657223 + bytec_3 // 0x523a4d4e4723 dig 2 concat dup @@ -399,10 +399,10 @@ rbac_revoke_role: pop rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12: - // modules/rbac.py:239 + // modules/rbac.py:251 // return Global.latest_timestamp global LatestTimestamp - // modules/rbac.py:216 + // modules/rbac.py:228 // @arc4.abimethod itob bytec_0 // 0x151f7c75 @@ -421,7 +421,7 @@ rbac_revoke_role_after_if_else@3: bz rbac_revoke_role_after_if_else@5 // modules/rbac.py:133 // assert role_address in self.primary_dealer, err.INVALID_ROLE_ADDRESS - bytec 4 // 0x52235072696d6172794465616c657223 + bytec 4 // 0x523a50594423 dig 2 concat dup @@ -432,7 +432,7 @@ rbac_revoke_role_after_if_else@3: // del self.primary_dealer[role_address] box_del pop - // modules/rbac.py:238 + // modules/rbac.py:250 // self._delete_role(role_id.as_uint64(), role_address) b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 @@ -445,7 +445,7 @@ rbac_revoke_role_after_if_else@5: bz rbac_revoke_role_after_if_else@7 // modules/rbac.py:137 // assert role_address in self.trustee, err.INVALID_ROLE_ADDRESS - bytec 5 // 0x52235472757374656523 + bytec 5 // 0x523a54525323 dig 2 concat dup @@ -456,7 +456,7 @@ rbac_revoke_role_after_if_else@5: // del self.trustee[role_address] box_del pop - // modules/rbac.py:238 + // modules/rbac.py:250 // self._delete_role(role_id.as_uint64(), role_address) b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 @@ -469,7 +469,7 @@ rbac_revoke_role_after_if_else@7: bz rbac_revoke_role_after_if_else@9 // modules/rbac.py:141 // assert role_address in self.authority, err.INVALID_ROLE_ADDRESS - bytec_2 // 0x5223417574686f7269747923 + bytec_2 // 0x523a41555423 dig 2 concat dup @@ -480,7 +480,7 @@ rbac_revoke_role_after_if_else@7: // del self.authority[role_address] box_del pop - // modules/rbac.py:238 + // modules/rbac.py:250 // self._delete_role(role_id.as_uint64(), role_address) b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 @@ -493,7 +493,7 @@ rbac_revoke_role_after_if_else@9: bz rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 // modules/rbac.py:145 // assert role_address in self.observer, err.INVALID_ROLE_ADDRESS - bytec 6 // 0x52234f6273657276657223 + bytec 6 // 0x523a4d4f4323 dig 2 concat dup @@ -509,7 +509,7 @@ rbac_revoke_role_after_if_else@9: // modules.rbac.RbacModule.rbac_contract_suspension[routing]() -> void: rbac_contract_suspension: - // modules/rbac.py:241 + // modules/rbac.py:253 // @arc4.abimethod # TODO: Update specs and add test txna ApplicationArgs 1 dup @@ -521,19 +521,19 @@ rbac_contract_suspension: getbit // modules/rbac.py:77 // assert self._role_is_active(self.authority, Txn.sender), err.UNAUTHORIZED - bytec_2 // 0x5223417574686f7269747923 + bytec_2 // 0x523a41555423 txn Sender callsub _role_is_active assert // Not authorized - // modules/rbac.py:257 + // modules/rbac.py:269 // self.asset_suspended = suspended bytec 8 // "asset_suspended" swap app_global_put - // modules/rbac.py:258 + // modules/rbac.py:270 // return Global.latest_timestamp global LatestTimestamp - // modules/rbac.py:241 + // modules/rbac.py:253 // @arc4.abimethod # TODO: Update specs and add test itob bytec_0 // 0x151f7c75 @@ -546,13 +546,13 @@ rbac_contract_suspension: // modules.rbac.RbacModule.rbac_get_arranger[routing]() -> void: rbac_get_arranger: - // modules/rbac.py:268 + // modules/rbac.py:283 // return self.arranger.value intc_1 // 0 - bytec_1 // 0x5223417272616e67657223 + bytec_1 // 0x523a41525223 app_global_get_ex assert // check self.arranger exists - // modules/rbac.py:260 + // modules/rbac.py:272 // @arc4.abimethod(readonly=True) bytec_0 // 0x151f7c75 swap @@ -564,7 +564,7 @@ rbac_get_arranger: // modules.rbac.RbacModule.rbac_get_address_roles[routing]() -> void: rbac_get_address_roles: - // modules/rbac.py:270 + // modules/rbac.py:285 // @arc4.abimethod(readonly=True) txna ApplicationArgs 1 dup @@ -572,32 +572,32 @@ rbac_get_address_roles: intc_2 // 32 == assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:284 + // modules/rbac.py:303 // self._role_is_active(self.account_manager, address), - bytec_3 // 0x52234163636f756e744d616e6167657223 + bytec_3 // 0x523a4d4e4723 dig 1 callsub _role_is_active - // modules/rbac.py:285 + // modules/rbac.py:304 // self._role_is_active(self.primary_dealer, address), - bytec 4 // 0x52235072696d6172794465616c657223 + bytec 4 // 0x523a50594423 dig 2 callsub _role_is_active - // modules/rbac.py:286 + // modules/rbac.py:305 // self._role_is_active(self.trustee, address), - bytec 5 // 0x52235472757374656523 + bytec 5 // 0x523a54525323 dig 3 callsub _role_is_active - // modules/rbac.py:287 + // modules/rbac.py:306 // self._role_is_active(self.authority, address), - bytec_2 // 0x5223417574686f7269747923 + bytec_2 // 0x523a41555423 dig 4 callsub _role_is_active - // modules/rbac.py:288 + // modules/rbac.py:307 // self._role_is_active(self.observer, address), - bytec 6 // 0x52234f6273657276657223 + bytec 6 // 0x523a4d4f4323 uncover 5 callsub _role_is_active - // modules/rbac.py:270 + // modules/rbac.py:285 // @arc4.abimethod(readonly=True) pushbytes 0x00 intc_1 // 0 @@ -625,7 +625,7 @@ rbac_get_address_roles: // modules.rbac.RbacModule.rbac_get_role_validity[routing]() -> void: rbac_get_role_validity: - // modules/rbac.py:291 + // modules/rbac.py:310 // @arc4.abimethod(readonly=True) txna ApplicationArgs 1 dup @@ -640,20 +640,20 @@ rbac_get_role_validity: intc_2 // 32 == assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:305 + // modules/rbac.py:328 // role = role_id.as_uint64() btoi - // modules/rbac.py:306 + // modules/rbac.py:329 // self._assert_valid_role(role) dup callsub _assert_valid_role - // modules/rbac.py:308 + // modules/rbac.py:331 // case UInt64(enums.ROLE_ARRANGER): intc_3 // 20 - // modules/rbac.py:312 + // modules/rbac.py:335 // case UInt64(enums.ROLE_ACCOUNT_MANAGER): pushints 40 50 60 70 80 - // modules/rbac.py:307-338 + // modules/rbac.py:330-361 // match role: // case UInt64(enums.ROLE_ARRANGER): // return typ.RoleValidity( @@ -688,14 +688,14 @@ rbac_get_role_validity: // op.err(err.INVALID_ROLE) uncover 6 match rbac_get_role_validity_switch_case_0@2 rbac_get_role_validity_switch_case_1@3 rbac_get_role_validity_switch_case_2@4 rbac_get_role_validity_switch_case_3@5 rbac_get_role_validity_switch_case_4@6 rbac_get_role_validity_switch_case_5@7 - // modules/rbac.py:338 + // modules/rbac.py:361 // op.err(err.INVALID_ROLE) err // Invalid role identifier rbac_get_role_validity_switch_case_5@7: - // modules/rbac.py:334 + // modules/rbac.py:357 // self.observer, role_address - bytec 6 // 0x52234f6273657276657223 + bytec 6 // 0x523a4d4f4323 // modules/rbac.py:55 // return role_address in role_map dig 1 @@ -703,18 +703,18 @@ rbac_get_role_validity_switch_case_5@7: dup box_len bury 1 - // modules/rbac.py:333-335 + // modules/rbac.py:356-358 // assert self._has_role( // self.observer, role_address // ), err.INVALID_ROLE_ADDRESS assert // Invalid account role address - // modules/rbac.py:336 + // modules/rbac.py:359 // return self.observer[role_address] box_get pop rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9: - // modules/rbac.py:291 + // modules/rbac.py:310 // @arc4.abimethod(readonly=True) bytec_0 // 0x151f7c75 swap @@ -724,9 +724,9 @@ rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_valid return rbac_get_role_validity_switch_case_4@6: - // modules/rbac.py:329 + // modules/rbac.py:352 // self.authority, role_address - bytec_2 // 0x5223417574686f7269747923 + bytec_2 // 0x523a41555423 // modules/rbac.py:55 // return role_address in role_map dig 1 @@ -734,23 +734,23 @@ rbac_get_role_validity_switch_case_4@6: dup box_len bury 1 - // modules/rbac.py:328-330 + // modules/rbac.py:351-353 // assert self._has_role( // self.authority, role_address // ), err.INVALID_ROLE_ADDRESS assert // Invalid account role address - // modules/rbac.py:331 + // modules/rbac.py:354 // return self.authority[role_address] box_get pop - // modules/rbac.py:291 + // modules/rbac.py:310 // @arc4.abimethod(readonly=True) b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9 rbac_get_role_validity_switch_case_3@5: - // modules/rbac.py:324 + // modules/rbac.py:347 // self.trustee, role_address - bytec 5 // 0x52235472757374656523 + bytec 5 // 0x523a54525323 // modules/rbac.py:55 // return role_address in role_map dig 1 @@ -758,23 +758,23 @@ rbac_get_role_validity_switch_case_3@5: dup box_len bury 1 - // modules/rbac.py:323-325 + // modules/rbac.py:346-348 // assert self._has_role( // self.trustee, role_address // ), err.INVALID_ROLE_ADDRESS assert // Invalid account role address - // modules/rbac.py:326 + // modules/rbac.py:349 // return self.trustee[role_address] box_get pop - // modules/rbac.py:291 + // modules/rbac.py:310 // @arc4.abimethod(readonly=True) b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9 rbac_get_role_validity_switch_case_2@4: - // modules/rbac.py:319 + // modules/rbac.py:342 // self.primary_dealer, role_address - bytec 4 // 0x52235072696d6172794465616c657223 + bytec 4 // 0x523a50594423 // modules/rbac.py:55 // return role_address in role_map dig 1 @@ -782,23 +782,23 @@ rbac_get_role_validity_switch_case_2@4: dup box_len bury 1 - // modules/rbac.py:318-320 + // modules/rbac.py:341-343 // assert self._has_role( // self.primary_dealer, role_address // ), err.INVALID_ROLE_ADDRESS assert // Invalid account role address - // modules/rbac.py:321 + // modules/rbac.py:344 // return self.primary_dealer[role_address] box_get pop - // modules/rbac.py:291 + // modules/rbac.py:310 // @arc4.abimethod(readonly=True) b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9 rbac_get_role_validity_switch_case_1@3: - // modules/rbac.py:314 + // modules/rbac.py:337 // self.account_manager, role_address - bytec_3 // 0x52234163636f756e744d616e6167657223 + bytec_3 // 0x523a4d4e4723 // modules/rbac.py:55 // return role_address in role_map dig 1 @@ -806,26 +806,26 @@ rbac_get_role_validity_switch_case_1@3: dup box_len bury 1 - // modules/rbac.py:313-315 + // modules/rbac.py:336-338 // assert self._has_role( // self.account_manager, role_address // ), err.INVALID_ROLE_ADDRESS assert // Invalid account role address - // modules/rbac.py:316 + // modules/rbac.py:339 // return self.account_manager[role_address] box_get pop - // modules/rbac.py:291 + // modules/rbac.py:310 // @arc4.abimethod(readonly=True) b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9 rbac_get_role_validity_switch_case_0@2: - // modules/rbac.py:309-311 + // modules/rbac.py:332-334 // return typ.RoleValidity( // role_validity_start=UInt64(0), role_validity_end=UInt64(0) // ) pushbytes 0x00000000000000000000000000000000 - // modules/rbac.py:291 + // modules/rbac.py:310 // @arc4.abimethod(readonly=True) b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9 @@ -914,7 +914,7 @@ _assert_caller_is_arranger: // modules/rbac.py:52 // return role_address == self.arranger.value intc_1 // 0 - bytec_1 // 0x5223417272616e67657223 + bytec_1 // 0x523a41525223 app_global_get_ex assert // check self.arranger exists == diff --git a/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.arc56.json b/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.arc56.json index 31cc74da..ec67d97f 100644 --- a/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.arc56.json +++ b/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.arc56.json @@ -17,7 +17,8 @@ "name": "contract_update", "args": [], "returns": { - "type": "void" + "type": "void", + "desc": "None." }, "actions": { "create": [], @@ -36,12 +37,12 @@ { "type": "address", "name": "new_arranger", - "desc": "New Arranger address" + "desc": "New arranger address." } ], "returns": { "type": "uint64", - "desc": "Timestamp of the role assignment" + "desc": "UNIX timestamp of the role assignment." }, "actions": { "create": [], @@ -50,7 +51,7 @@ ] }, "readonly": false, - "desc": "Rotate the Arranger address", + "desc": "Rotate the arranger address.", "events": [], "recommendations": {} }, @@ -60,12 +61,12 @@ { "type": "address", "name": "address", - "desc": "Operation Daemon address" + "desc": "Operation daemon address." } ], "returns": { "type": "uint64", - "desc": "Timestamp of the role assignment" + "desc": "UNIX timestamp of the role assignment." }, "actions": { "create": [], @@ -74,7 +75,7 @@ ] }, "readonly": false, - "desc": "Non-Normative: Set the Operation Daemon address", + "desc": "Non-normative helper to set the operation daemon address.", "events": [], "recommendations": {} }, @@ -84,23 +85,23 @@ { "type": "uint8", "name": "role_id", - "desc": "Role Identifier" + "desc": "Role identifier." }, { "type": "address", "name": "role_address", - "desc": "Account Role Address" + "desc": "Account role address." }, { "type": "(uint64,uint64)", "struct": "RoleValidity", "name": "validity", - "desc": "Role time validity" + "desc": "Inclusive validity interval for the assignment." } ], "returns": { "type": "uint64", - "desc": "Timestamp of the role assignment" + "desc": "UNIX timestamp of the role assignment." }, "actions": { "create": [], @@ -109,7 +110,7 @@ ] }, "readonly": false, - "desc": "Assign a role to an address", + "desc": "Assign a role to an address.", "events": [], "recommendations": {} }, @@ -119,17 +120,17 @@ { "type": "uint8", "name": "role_id", - "desc": "Role Identifier" + "desc": "Role identifier." }, { "type": "address", "name": "role_address", - "desc": "Account Role Address" + "desc": "Account role address." } ], "returns": { "type": "uint64", - "desc": "Timestamp of the role revocation" + "desc": "UNIX timestamp of the role revocation." }, "actions": { "create": [], @@ -138,7 +139,7 @@ ] }, "readonly": false, - "desc": "Revoke a role from an address", + "desc": "Revoke a role from an address.", "events": [], "recommendations": {} }, @@ -148,12 +149,12 @@ { "type": "bool", "name": "suspended", - "desc": "Suspension status" + "desc": "Suspension status to apply." } ], "returns": { "type": "uint64", - "desc": "Timestamp of the set asset suspension status" + "desc": "UNIX timestamp of the suspension update." }, "actions": { "create": [], @@ -162,7 +163,7 @@ ] }, "readonly": false, - "desc": "Set asset suspension status", + "desc": "Set the asset-wide suspension status.", "events": [], "recommendations": {} }, @@ -171,7 +172,7 @@ "args": [], "returns": { "type": "address", - "desc": "Arranger address" + "desc": "Current arranger address." }, "actions": { "create": [], @@ -180,7 +181,7 @@ ] }, "readonly": true, - "desc": "Get Arranger address", + "desc": "Get the arranger address.", "events": [], "recommendations": {} }, @@ -190,12 +191,12 @@ { "type": "address", "name": "address", - "desc": "Address to get roles for" + "desc": "Address to query." } ], "returns": { "type": "(bool,bool,bool,bool,bool)", - "desc": "Roles mask: (Account Manager, Primary Dealer, Trustee, Authority, Observer)" + "desc": "Roles mask in the order: account manager, primary dealer, trustee, authority, observer." }, "actions": { "create": [], @@ -204,7 +205,7 @@ ] }, "readonly": true, - "desc": "Non-normative - Get roles assigned to an address", + "desc": "Non-normative helper to get the active roles assigned to an address.", "events": [], "recommendations": {} }, @@ -214,18 +215,18 @@ { "type": "uint8", "name": "role_id", - "desc": "Role Identifier" + "desc": "Role identifier." }, { "type": "address", "name": "role_address", - "desc": "Account Role Address" + "desc": "Account role address." } ], "returns": { "type": "(uint64,uint64)", "struct": "RoleValidity", - "desc": "Role validity" + "desc": "Stored role validity interval." }, "actions": { "create": [], @@ -234,7 +235,7 @@ ] }, "readonly": true, - "desc": "Get role validity", + "desc": "Get the stored validity interval for a role assignment.", "events": [], "recommendations": {} } @@ -261,12 +262,12 @@ "arranger": { "keyType": "AVMBytes", "valueType": "address", - "key": "UiNBcnJhbmdlciM=" + "key": "UjpBUlIj" }, "op_daemon": { "keyType": "AVMBytes", "valueType": "address", - "key": "UiNPcERhZW1vbiM=" + "key": "UjpPUEQj" }, "asset_suspended": { "keyType": "AVMString", @@ -289,27 +290,27 @@ "account_manager": { "keyType": "address", "valueType": "RoleValidity", - "prefix": "UiNBY2NvdW50TWFuYWdlciM=" + "prefix": "UjpNTkcj" }, "primary_dealer": { "keyType": "address", "valueType": "RoleValidity", - "prefix": "UiNQcmltYXJ5RGVhbGVyIw==" + "prefix": "UjpQWUQj" }, "trustee": { "keyType": "address", "valueType": "RoleValidity", - "prefix": "UiNUcnVzdGVlIw==" + "prefix": "UjpUUlMj" }, "authority": { "keyType": "address", "valueType": "RoleValidity", - "prefix": "UiNBdXRob3JpdHkj" + "prefix": "UjpBVVQj" }, "observer": { "keyType": "address", "valueType": "RoleValidity", - "prefix": "UiNPYnNlcnZlciM=" + "prefix": "UjpNT0Mj" } } } @@ -325,93 +326,93 @@ "sourceInfo": [ { "pc": [ - 980 + 934 ], "errorMessage": "Defaulted" }, { "pc": [ - 405, - 429, - 453, - 476, - 500, - 555, - 583, - 605, - 626, - 648, - 824, - 841, - 856, - 871, - 885 + 359, + 383, + 407, + 430, + 454, + 509, + 537, + 559, + 580, + 602, + 778, + 795, + 810, + 825, + 839 ], "errorMessage": "Invalid account role address" }, { "pc": [ - 540, - 814, - 1041 + 494, + 768, + 995 ], "errorMessage": "Invalid role identifier" }, { "pc": [ - 670, - 972 + 624, + 926 ], "errorMessage": "Not authorized" }, { "pc": [ - 932, - 947 + 886, + 901 ], "errorMessage": "check BoxMap entry exists" }, { "pc": [ - 687, - 970 + 641, + 924 ], "errorMessage": "check self.arranger exists" }, { "pc": [ - 978 + 932 ], "errorMessage": "check self.asset_defaulted exists" }, { "pc": [ - 661 + 615 ], "errorMessage": "invalid number of bytes for arc4.bool" }, { "pc": [ - 290, - 313, - 347, - 524, - 701, - 784 + 244, + 267, + 301, + 478, + 655, + 738 ], "errorMessage": "invalid number of bytes for arc4.static_array" }, { "pc": [ - 337, - 514, - 774 + 291, + 468, + 728 ], "errorMessage": "invalid number of bytes for arc4.uint8" }, { "pc": [ - 358 + 312 ], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.RoleValidity" } @@ -424,11 +425,11 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMzIgMjAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMgMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMgMHg1MjIzNDE2MzYzNmY3NTZlNzQ0ZDYxNmU2MTY3NjU3MjIzIDB4NTIyMzUwNzI2OTZkNjE3Mjc5NDQ2NTYxNmM2NTcyMjMgMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMyAweDUyMjM0ZjYyNzM2NTcyNzY2NTcyMjMgMHg1MjIzNGY3MDQ0NjE2NTZkNmY2ZTIzICJhc3NldF9zdXNwZW5kZWQiICJhc3NldF9kZWZhdWx0ZWQiCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgtMjkKICAgIC8vICMgUkJBQyBSb2xlcwogICAgLy8gc2VsZi5hcnJhbmdlciA9IEdsb2JhbFN0YXRlKEFjY291bnQoKSwga2V5PWNzdC5QUkVGSVhfSURfQVJSQU5HRVIpCiAgICBieXRlY18xIC8vIDB4NTIyMzQxNzI3MjYxNmU2NzY1NzIyMwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwCiAgICAvLyBzZWxmLm9wX2RhZW1vbiA9IEdsb2JhbFN0YXRlKEFjY291bnQoKSwga2V5PWNzdC5QUkVGSVhfSURfT1BfREFFTU9OKQogICAgYnl0ZWMgNyAvLyAweDUyMjM0ZjcwNDQ2MTY1NmQ2ZjZlMjMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo0Ny00OAogICAgLy8gIyBELUFTQSBHb3Zlcm5hbmNlCiAgICAvLyBzZWxmLmFzc2V0X3N1c3BlbmRlZCA9IEZhbHNlCiAgICBieXRlYyA4IC8vICJhc3NldF9zdXNwZW5kZWQiCiAgICBpbnRjXzEgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo0OQogICAgLy8gc2VsZi5hc3NldF9kZWZhdWx0ZWQgPSBGYWxzZQogICAgYnl0ZWMgOSAvLyAiYXNzZXRfZGVmYXVsdGVkIgogICAgaW50Y18xIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tb2NrX21vZHVsZV9yYmFjL2NvbnRyYWN0LnB5OjYKICAgIC8vIGNsYXNzIE1vY2tSYmFjTW9kdWxlKFJiYWNNb2R1bGUpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fY3JlYXRlQDE5CiAgICBwdXNoYnl0ZXMgMHg5MTRmMDRlYiAvLyBtZXRob2QgImNvbnRyYWN0X3VwZGF0ZSgpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fY29udHJhY3RfdXBkYXRlX3JvdXRlQDUKCm1haW5fc3dpdGNoX2Nhc2VfbmV4dEA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL21vY2tfbW9kdWxlX3JiYWMvY29udHJhY3QucHk6NgogICAgLy8gY2xhc3MgTW9ja1JiYWNNb2R1bGUoUmJhY01vZHVsZSk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHg4MmY3MWIyZCAweGVmMDRmNWQzIDB4ZGYzNDM1NTAgMHgzZGJlODBiZCAweDFlM2U0OGU3IDB4MDEwYzgyOTkgMHg3NDA2YWNkMiAweDFhNzJhMmVlIC8vIG1ldGhvZCAicmJhY19yb3RhdGVfYXJyYW5nZXIoYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgInJiYWNfc2V0X29wX2RhZW1vbihhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19hc3NpZ25fcm9sZSh1aW50OCxhZGRyZXNzLCh1aW50NjQsdWludDY0KSl1aW50NjQiLCBtZXRob2QgInJiYWNfcmV2b2tlX3JvbGUodWludDgsYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgInJiYWNfY29udHJhY3Rfc3VzcGVuc2lvbihib29sKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19nZXRfYXJyYW5nZXIoKWFkZHJlc3MiLCBtZXRob2QgInJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXMoYWRkcmVzcykoYm9vbCxib29sLGJvb2wsYm9vbCxib29sKSIsIG1ldGhvZCAicmJhY19nZXRfcm9sZV92YWxpZGl0eSh1aW50OCxhZGRyZXNzKSh1aW50NjQsdWludDY0KSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIHJiYWNfcm90YXRlX2FycmFuZ2VyIHJiYWNfc2V0X29wX2RhZW1vbiByYmFjX2Fzc2lnbl9yb2xlIHJiYWNfcmV2b2tlX3JvbGUgcmJhY19jb250cmFjdF9zdXNwZW5zaW9uIHJiYWNfZ2V0X2FycmFuZ2VyIHJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXMgcmJhY19nZXRfcm9sZV92YWxpZGl0eQogICAgZXJyCgptYWluX2NvbnRyYWN0X3VwZGF0ZV9yb3V0ZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgcHVzaGludCA0IC8vIFVwZGF0ZUFwcGxpY2F0aW9uCiAgICA9PQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICYmCiAgICBhc3NlcnQKICAgIGIgY29udHJhY3RfdXBkYXRlCgptYWluX2NyZWF0ZUAxOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tb2NrX21vZHVsZV9yYmFjL2NvbnRyYWN0LnB5OjE0CiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIGFzc2VydAogICAgLy8gc21hcnRfY29udHJhY3RzL21vY2tfbW9kdWxlX3JiYWMvY29udHJhY3QucHk6MTYKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSBUeG4uc2VuZGVyCiAgICBieXRlY18xIC8vIDB4NTIyMzQxNzI3MjYxNmU2NzY1NzIyMwogICAgdHhuIFNlbmRlcgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tb2NrX21vZHVsZV9yYmFjL2NvbnRyYWN0LnB5OjE0CiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuY29udHJhY3RfdXBkYXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfdXBkYXRlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE1My0xNTYKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBncmFudHMgdGhlIHVwZGF0ZSBwZXJtaXNzaW9ucyB0byB0aGUgQXJyYW5nZXIuCiAgICAvLyAjIOKaoO+4jyBXQVJOSU5HOiBBcHBsaWNhdGlvbiB1cGRhdGVzIG11c3QgYmUgZXhlY3V0ZWQgVkVSWSBjYXJlZnVsbHksIGFzIHRoZXkKICAgIC8vICMgbWlnaHQgaW50cm9kdWNlIGJyZWFraW5nIGNoYW5nZXMuCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3JvdGF0ZV9hcnJhbmdlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfcm90YXRlX2FycmFuZ2VyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE1OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNjkKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE3MAogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IG5ld19hcnJhbmdlcgogICAgYnl0ZWNfMSAvLyAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTcxCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfc2V0X29wX2RhZW1vbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfc2V0X29wX2RhZW1vbjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTg0CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODUKICAgIC8vIHNlbGYub3BfZGFlbW9uLnZhbHVlID0gYWRkcmVzcwogICAgYnl0ZWMgNyAvLyAweDUyMjM0ZjcwNDQ2MTY1NmQ2ZjZlMjMKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTg2CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfYXNzaWduX3JvbGVbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2Fzc2lnbl9yb2xlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIHB1c2hpbnQgMTYKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuUm9sZVZhbGlkaXR5CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjEwCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTEKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjEyCiAgICAvLyBzZWxmLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpKQogICAgYnRvaQogICAgZHVwbiAyCiAgICBjYWxsc3ViIF9hc3NlcnRfdmFsaWRfcm9sZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwMgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUik6CiAgICBpbnRjXzMgLy8gMjAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwMwogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IHJvbGVfYWRkcmVzcwogICAgYnl0ZWNfMSAvLyAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMKICAgIGRpZyAzCiAgICBhcHBfZ2xvYmFsX3B1dAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTQKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDYKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIGR1cAogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnRfbWFuYWdlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlY18zIC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0NGQ2MTZlNjE2NzY1NzIyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA4CiAgICAvLyBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMwogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTEwCiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKToKICAgIGR1cAogICAgcHVzaGludCA1MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTExCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDQgLy8gMHg1MjIzNTA3MjY5NmQ2MTcyNzk0NDY1NjE2YzY1NzIyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTEyCiAgICAvLyBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjEzCiAgICAvLyBzZWxmLl9zZXRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIHZhbGlkaXR5KQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTQKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNjAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDUgLy8gMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE2CiAgICAvLyBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExOAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlY18yIC8vIDB4NTIyMzQxNzU3NDY4NmY3MjY5NzQ3OTIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjAKICAgIC8vIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjEzCiAgICAvLyBzZWxmLl9zZXRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIHZhbGlkaXR5KQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMTE6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIyCiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKToKICAgIGR1cAogICAgcHVzaGludCA4MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjMKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYub2JzZXJ2ZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgNiAvLyAweDUyMjM0ZjYyNzM2NTcyNzY2NTcyMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyNAogICAgLy8gc2VsZi5vYnNlcnZlcltyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19yZXZva2Vfcm9sZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfcmV2b2tlX3JvbGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjE2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjM1CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzYKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjM3CiAgICAvLyBzZWxmLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpKQogICAgYnRvaQogICAgZHVwbiAyCiAgICBjYWxsc3ViIF9hc3NlcnRfdmFsaWRfcm9sZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyNwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgIT0gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBkdXAKICAgIGludGNfMyAvLyAyMAogICAgIT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyOAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjXzMgLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQ0ZDYxNmU2MTY3NjU3MjIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzAKICAgIC8vIGRlbCBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjM5CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMyCiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKToKICAgIGR1cAogICAgcHVzaGludCA1MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMzCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgNCAvLyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzQKICAgIC8vIGRlbCBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzOAogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzYKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNjAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgNSAvLyAweDUyMjM1NDcyNzU3Mzc0NjU2NTIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzgKICAgIC8vIGRlbCBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjM4CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDEKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hdXRob3JpdHksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWNfMiAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQyCiAgICAvLyBkZWwgc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjM4CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgODAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ1CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYub2JzZXJ2ZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgNiAvLyAweDUyMjM0ZjYyNzM2NTcyNzY2NTcyMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NgogICAgLy8gZGVsIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2NvbnRyYWN0X3N1c3BlbnNpb25bcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2NvbnRyYWN0X3N1c3BlbnNpb246CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QgICMgVE9ETzogVXBkYXRlIHNwZWNzIGFuZCBhZGQgdGVzdAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMSAvLyAwCiAgICBnZXRiaXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo3NwogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYXV0aG9yaXR5LCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWNfMiAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1NwogICAgLy8gc2VsZi5hc3NldF9zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGJ5dGVjIDggLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU4CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCAgIyBUT0RPOiBVcGRhdGUgc3BlY3MgYW5kIGFkZCB0ZXN0CiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYXJyYW5nZXJbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNjgKICAgIC8vIHJldHVybiBzZWxmLmFycmFuZ2VyLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMSAvLyAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcnJhbmdlciBleGlzdHMKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNjAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXNbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9hZGRyZXNzX3JvbGVzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODQKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBhZGRyZXNzKSwKICAgIGJ5dGVjXzMgLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQ0ZDYxNmU2MTY3NjU3MjIzCiAgICBkaWcgMQogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODUKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYucHJpbWFyeV9kZWFsZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgNCAvLyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzCiAgICBkaWcgMgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODYKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYudHJ1c3RlZSwgYWRkcmVzcyksCiAgICBieXRlYyA1IC8vIDB4NTIyMzU0NzI3NTczNzQ2NTY1MjMKICAgIGRpZyAzCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4NwogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIGFkZHJlc3MpLAogICAgYnl0ZWNfMiAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgZGlnIDQKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg4CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLm9ic2VydmVyLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDYgLy8gMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzCiAgICB1bmNvdmVyIDUKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjcwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHB1c2hieXRlcyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciA2CiAgICBzZXRiaXQKICAgIGludGNfMCAvLyAxCiAgICB1bmNvdmVyIDUKICAgIHNldGJpdAogICAgcHVzaGludCAyCiAgICB1bmNvdmVyIDQKICAgIHNldGJpdAogICAgcHVzaGludCAzCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgcHVzaGludCA0CiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwNQogICAgLy8gcm9sZSA9IHJvbGVfaWQuYXNfdWludDY0KCkKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDYKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGUpCiAgICBkdXAKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA4CiAgICAvLyBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKToKICAgIGludGNfMyAvLyAyMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxMgogICAgLy8gY2FzZSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludHMgNDAgNTAgNjAgNzAgODAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDctMzM4CiAgICAvLyBtYXRjaCByb2xlOgogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgLy8gICAgICAgICByZXR1cm4gdHlwLlJvbGVWYWxpZGl0eSgKICAgIC8vICAgICAgICAgICAgIHJvbGVfdmFsaWRpdHlfc3RhcnQ9VUludDY0KDApLCByb2xlX3ZhbGlkaXR5X2VuZD1VSW50NjQoMCkKICAgIC8vICAgICAgICAgKQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5hdXRob3JpdHksIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5vYnNlcnZlciwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5vYnNlcnZlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBfOgogICAgLy8gICAgICAgICBvcC5lcnIoZXJyLklOVkFMSURfUk9MRSkKICAgIHVuY292ZXIgNgogICAgbWF0Y2ggcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8wQDIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8xQDMgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8yQDQgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8zQDUgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV80QDYgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV81QDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzgKICAgIC8vIG9wLmVycihlcnIuSU5WQUxJRF9ST0xFKQogICAgZXJyIC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzVANzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzQKICAgIC8vIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgNiAvLyAweDUyMjM0ZjYyNzM2NTcyNzY2NTcyMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzMtMzM1CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5vYnNlcnZlciwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzM2CiAgICAvLyByZXR1cm4gc2VsZi5vYnNlcnZlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNEA2OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOQogICAgLy8gc2VsZi5hdXRob3JpdHksIHJvbGVfYWRkcmVzcwogICAgYnl0ZWNfMiAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOC0zMzAKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLmF1dGhvcml0eSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzMxCiAgICAvLyByZXR1cm4gc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8zQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI0CiAgICAvLyBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgNSAvLyAweDUyMjM1NDcyNzU3Mzc0NjU2NTIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzIzLTMyNQogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI2CiAgICAvLyByZXR1cm4gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMkA0OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxOQogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyA0IC8vIDB4NTIyMzUwNzI2OTZkNjE3Mjc5NDQ2NTYxNmM2NTcyMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTgtMzIwCiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzIxCiAgICAvLyByZXR1cm4gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzFAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTQKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjXzMgLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQ0ZDYxNmU2MTY3NjU3MjIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEzLTMxNQogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTYKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzBAMjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDktMzExCiAgICAvLyByZXR1cm4gdHlwLlJvbGVWYWxpZGl0eSgKICAgIC8vICAgICByb2xlX3ZhbGlkaXR5X3N0YXJ0PVVJbnQ2NCgwKSwgcm9sZV92YWxpZGl0eV9lbmQ9VUludDY0KDApCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fcm9sZV9pc19hY3RpdmUocm9sZV9tYXA6IGJ5dGVzLCByb2xlX2FkZHJlc3M6IGJ5dGVzKSAtPiB1aW50NjQ6Cl9yb2xlX2lzX2FjdGl2ZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NwogICAgLy8gZGVmIF9yb2xlX2lzX2FjdGl2ZShzZWxmLCByb2xlX21hcDogdHlwLlJiYWNSb2xlLCByb2xlX2FkZHJlc3M6IEFjY291bnQpIC0+IGJvb2w6CiAgICBwcm90byAyIDEKICAgIHB1c2hieXRlcyAiIgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU4LTYyCiAgICAvLyByZXR1cm4gc2VsZi5faGFzX3JvbGUocm9sZV9tYXAsIHJvbGVfYWRkcmVzcykgYW5kICgKICAgIC8vICAgICByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICkKICAgIGJ6IF9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIEJveE1hcCBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYwCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MAogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgPD0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYxCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIEJveE1hcCBlbnRyeSBleGlzdHMKICAgIHB1c2hpbnQgOAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2MC02MQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAwCiAgICA+PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5LTYxCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0CiAgICBpbnRjXzAgLy8gMQoKX3JvbGVfaXNfYWN0aXZlX2Jvb2xfbWVyZ2VANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OC02MgogICAgLy8gcmV0dXJuIHNlbGYuX2hhc19yb2xlKHJvbGVfbWFwLCByb2xlX2FkZHJlc3MpIGFuZCAoCiAgICAvLyAgICAgcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICAvLyApCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANDoKICAgIGludGNfMSAvLyAwCiAgICBiIF9yb2xlX2lzX2FjdGl2ZV9ib29sX21lcmdlQDUKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpIC0+IHZvaWQ6Cl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjY1CiAgICAvLyBhc3NlcnQgc2VsZi5faXNfYXJyYW5nZXIoVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1MgogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyA9PSBzZWxmLmFycmFuZ2VyLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMSAvLyAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcnJhbmdlciBleGlzdHMKICAgID09CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjUKICAgIC8vIGFzc2VydCBzZWxmLl9pc19hcnJhbmdlcihUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKSAtPiB2b2lkOgpfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODMKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5hc3NldF9kZWZhdWx0ZWQsIGVyci5ERUZBVUxURUQKICAgIGludGNfMSAvLyAwCiAgICBieXRlYyA5IC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfZGVmYXVsdGVkIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIERlZmF1bHRlZAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGVfaWQ6IHVpbnQ2NCkgLT4gdm9pZDoKX2Fzc2VydF92YWxpZF9yb2xlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg4CiAgICAvLyBkZWYgX2Fzc2VydF92YWxpZF9yb2xlKHNlbGYsIHJvbGVfaWQ6IFVJbnQ2NCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MAogICAgLy8gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgaW50Y18zIC8vIDIwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MQogICAgLy8gVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIHB1c2hpbnQgMjUKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkyCiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgcHVzaGludCA0MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTMKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIHB1c2hpbnQgNTAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojk0CiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIHB1c2hpbnQgNjAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojk1CiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgcHVzaGludCA3MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTYKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIHB1c2hpbnQgODAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJ6IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX2ZhbHNlQDgKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANzoKICAgIGludGNfMCAvLyAxCgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9tZXJnZUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBhc3NlcnQgLy8gSW52YWxpZCByb2xlIGlkZW50aWZpZXIKICAgIHJldHN1YgoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfZmFsc2VAODoKICAgIGludGNfMSAvLyAwCiAgICBiIF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX21lcmdlQDkK", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMzIgMjAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAweDUyM2E0MTUyNTIyMyAweDUyM2E0MTU1NTQyMyAweDUyM2E0ZDRlNDcyMyAweDUyM2E1MDU5NDQyMyAweDUyM2E1NDUyNTMyMyAweDUyM2E0ZDRmNDMyMyAweDUyM2E0ZjUwNDQyMyAiYXNzZXRfc3VzcGVuZGVkIiAiYXNzZXRfZGVmYXVsdGVkIgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4LTI5CiAgICAvLyAjIFJCQUMgUm9sZXMKICAgIC8vIHNlbGYuYXJyYW5nZXIgPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX0FSUkFOR0VSKQogICAgYnl0ZWNfMSAvLyAweDUyM2E0MTUyNTIyMwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwCiAgICAvLyBzZWxmLm9wX2RhZW1vbiA9IEdsb2JhbFN0YXRlKEFjY291bnQoKSwga2V5PWNzdC5QUkVGSVhfSURfT1BfREFFTU9OKQogICAgYnl0ZWMgNyAvLyAweDUyM2E0ZjUwNDQyMwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjQ3LTQ4CiAgICAvLyAjIEQtQVNBIEdvdmVybmFuY2UKICAgIC8vIHNlbGYuYXNzZXRfc3VzcGVuZGVkID0gRmFsc2UKICAgIGJ5dGVjIDggLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIGludGNfMSAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjQ5CiAgICAvLyBzZWxmLmFzc2V0X2RlZmF1bHRlZCA9IEZhbHNlCiAgICBieXRlYyA5IC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBpbnRjXzEgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL21vY2tfbW9kdWxlX3JiYWMvY29udHJhY3QucHk6NgogICAgLy8gY2xhc3MgTW9ja1JiYWNNb2R1bGUoUmJhY01vZHVsZSk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9jcmVhdGVAMTkKICAgIHB1c2hieXRlcyAweDkxNGYwNGViIC8vIG1ldGhvZCAiY29udHJhY3RfdXBkYXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9jb250cmFjdF91cGRhdGVfcm91dGVANQoKbWFpbl9zd2l0Y2hfY2FzZV9uZXh0QDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbW9ja19tb2R1bGVfcmJhYy9jb250cmFjdC5weTo2CiAgICAvLyBjbGFzcyBNb2NrUmJhY01vZHVsZShSYmFjTW9kdWxlKToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweDgyZjcxYjJkIDB4ZWYwNGY1ZDMgMHhkZjM0MzU1MCAweDNkYmU4MGJkIDB4MWUzZTQ4ZTcgMHgwMTBjODI5OSAweDc0MDZhY2QyIDB4MWE3MmEyZWUgLy8gbWV0aG9kICJyYmFjX3JvdGF0ZV9hcnJhbmdlcihhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19zZXRfb3BfZGFlbW9uKGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX2Fzc2lnbl9yb2xlKHVpbnQ4LGFkZHJlc3MsKHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19yZXZva2Vfcm9sZSh1aW50OCxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19jb250cmFjdF9zdXNwZW5zaW9uKGJvb2wpdWludDY0IiwgbWV0aG9kICJyYmFjX2dldF9hcnJhbmdlcigpYWRkcmVzcyIsIG1ldGhvZCAicmJhY19nZXRfYWRkcmVzc19yb2xlcyhhZGRyZXNzKShib29sLGJvb2wsYm9vbCxib29sLGJvb2wpIiwgbWV0aG9kICJyYmFjX2dldF9yb2xlX3ZhbGlkaXR5KHVpbnQ4LGFkZHJlc3MpKHVpbnQ2NCx1aW50NjQpIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggcmJhY19yb3RhdGVfYXJyYW5nZXIgcmJhY19zZXRfb3BfZGFlbW9uIHJiYWNfYXNzaWduX3JvbGUgcmJhY19yZXZva2Vfcm9sZSByYmFjX2NvbnRyYWN0X3N1c3BlbnNpb24gcmJhY19nZXRfYXJyYW5nZXIgcmJhY19nZXRfYWRkcmVzc19yb2xlcyByYmFjX2dldF9yb2xlX3ZhbGlkaXR5CiAgICBlcnIKCm1haW5fY29udHJhY3RfdXBkYXRlX3JvdXRlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBwdXNoaW50IDQgLy8gVXBkYXRlQXBwbGljYXRpb24KICAgID09CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydAogICAgYiBjb250cmFjdF91cGRhdGUKCm1haW5fY3JlYXRlQDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL21vY2tfbW9kdWxlX3JiYWMvY29udHJhY3QucHk6MTQKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbW9ja19tb2R1bGVfcmJhYy9jb250cmFjdC5weToxNgogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IFR4bi5zZW5kZXIKICAgIGJ5dGVjXzEgLy8gMHg1MjNhNDE1MjUyMjMKICAgIHR4biBTZW5kZXIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbW9ja19tb2R1bGVfcmJhYy9jb250cmFjdC5weToxNAogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLmNvbnRyYWN0X3VwZGF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X3VwZGF0ZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTktMTYyCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gZ3JhbnRzIHRoZSB1cGRhdGUgcGVybWlzc2lvbnMgdG8gdGhlIEFycmFuZ2VyLgogICAgLy8gIyDimqDvuI8gV0FSTklORzogQXBwbGljYXRpb24gdXBkYXRlcyBtdXN0IGJlIGV4ZWN1dGVkIFZFUlkgY2FyZWZ1bGx5LCBhcyB0aGV5CiAgICAvLyAjIG1pZ2h0IGludHJvZHVjZSBicmVha2luZyBjaGFuZ2VzLgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19yb3RhdGVfYXJyYW5nZXJbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3JvdGF0ZV9hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTc4CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzkKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSBuZXdfYXJyYW5nZXIKICAgIGJ5dGVjXzEgLy8gMHg1MjNhNDE1MjUyMjMKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTgwCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfc2V0X29wX2RhZW1vbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfc2V0X29wX2RhZW1vbjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTk2CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxOTcKICAgIC8vIHNlbGYub3BfZGFlbW9uLnZhbHVlID0gYWRkcmVzcwogICAgYnl0ZWMgNyAvLyAweDUyM2E0ZjUwNDQyMwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxOTgKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19hc3NpZ25fcm9sZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfYXNzaWduX3JvbGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgcHVzaGludCAxNgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5Sb2xlVmFsaWRpdHkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjIKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyMwogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjQKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCkpCiAgICBidG9pCiAgICBkdXBuIDIKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTAyCiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKToKICAgIGludGNfMyAvLyAyMAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTAzCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gcm9sZV9hZGRyZXNzCiAgICBieXRlY18xIC8vIDB4NTIzYTQxNTI1MjIzCiAgICBkaWcgMwogICAgYXBwX2dsb2JhbF9wdXQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI2CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA2CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgNDAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwNwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWNfMyAvLyAweDUyM2E0ZDRlNDcyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA4CiAgICAvLyBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNQogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTEwCiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKToKICAgIGR1cAogICAgcHVzaGludCA1MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTExCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDQgLy8gMHg1MjNhNTA1OTQ0MjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMgogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNQogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE0CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpOgogICAgZHVwCiAgICBwdXNoaW50IDYwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTUKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyA1IC8vIDB4NTIzYTU0NTI1MzIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTYKICAgIC8vIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNQogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE4CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNzAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTkKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjXzIgLy8gMHg1MjNhNDE1NTU0MjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMAogICAgLy8gc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjUKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDgwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5vYnNlcnZlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyA2IC8vIDB4NTIzYTRkNGY0MzIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjQKICAgIC8vIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfcmV2b2tlX3JvbGVbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3Jldm9rZV9yb2xlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0NwogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjQ4CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0OQogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjcKICAgIC8vIGFzc2VydCByb2xlX2lkICE9IFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwgZXJyLklOVkFMSURfUk9MRQogICAgZHVwCiAgICBpbnRjXzMgLy8gMjAKICAgICE9CiAgICBhc3NlcnQgLy8gSW52YWxpZCByb2xlIGlkZW50aWZpZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjgKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIHB1c2hpbnQgNDAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyOQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmFjY291bnRfbWFuYWdlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlY18zIC8vIDB4NTIzYTRkNGU0NzIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzAKICAgIC8vIGRlbCBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjUxCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMyCiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKToKICAgIGR1cAogICAgcHVzaGludCA1MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMzCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgNCAvLyAweDUyM2E1MDU5NDQyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM0CiAgICAvLyBkZWwgc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTAKICAgIC8vIHNlbGYuX2RlbGV0ZV9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcykKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM2CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpOgogICAgZHVwCiAgICBwdXNoaW50IDYwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzcKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDUgLy8gMHg1MjNhNTQ1MjUzMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzOAogICAgLy8gZGVsIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTAKICAgIC8vIHNlbGYuX2RlbGV0ZV9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcykKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQwCiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNzAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlY18yIC8vIDB4NTIzYTQxNTU1NDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDIKICAgIC8vIGRlbCBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTAKICAgIC8vIHNlbGYuX2RlbGV0ZV9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcykKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ0CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKToKICAgIGR1cAogICAgcHVzaGludCA4MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDUKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5vYnNlcnZlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyA2IC8vIDB4NTIzYTRkNGY0MzIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDYKICAgIC8vIGRlbCBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19jb250cmFjdF9zdXNwZW5zaW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19jb250cmFjdF9zdXNwZW5zaW9uOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kICAjIFRPRE86IFVwZGF0ZSBzcGVjcyBhbmQgYWRkIHRlc3QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzEgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzcKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjXzIgLy8gMHg1MjNhNDE1NTU0MjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNjkKICAgIC8vIHNlbGYuYXNzZXRfc3VzcGVuZGVkID0gc3VzcGVuZGVkCiAgICBieXRlYyA4IC8vICJhc3NldF9zdXNwZW5kZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3MAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjUzCiAgICAvLyBAYXJjNC5hYmltZXRob2QgICMgVE9ETzogVXBkYXRlIHNwZWNzIGFuZCBhZGQgdGVzdAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X2FycmFuZ2VyW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgzCiAgICAvLyByZXR1cm4gc2VsZi5hcnJhbmdlci52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzEgLy8gMHg1MjNhNDE1MjUyMjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcnJhbmdlciBleGlzdHMKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNzIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXNbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9hZGRyZXNzX3JvbGVzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDMKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBhZGRyZXNzKSwKICAgIGJ5dGVjXzMgLy8gMHg1MjNhNGQ0ZTQ3MjMKICAgIGRpZyAxCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwNAogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5wcmltYXJ5X2RlYWxlciwgYWRkcmVzcyksCiAgICBieXRlYyA0IC8vIDB4NTIzYTUwNTk0NDIzCiAgICBkaWcgMgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDUKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYudHJ1c3RlZSwgYWRkcmVzcyksCiAgICBieXRlYyA1IC8vIDB4NTIzYTU0NTI1MzIzCiAgICBkaWcgMwogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDYKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYXV0aG9yaXR5LCBhZGRyZXNzKSwKICAgIGJ5dGVjXzIgLy8gMHg1MjNhNDE1NTU0MjMKICAgIGRpZyA0CiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwNwogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5vYnNlcnZlciwgYWRkcmVzcyksCiAgICBieXRlYyA2IC8vIDB4NTIzYTRkNGY0MzIzCiAgICB1bmNvdmVyIDUKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg1CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHB1c2hieXRlcyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciA2CiAgICBzZXRiaXQKICAgIGludGNfMCAvLyAxCiAgICB1bmNvdmVyIDUKICAgIHNldGJpdAogICAgcHVzaGludCAyCiAgICB1bmNvdmVyIDQKICAgIHNldGJpdAogICAgcHVzaGludCAzCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgcHVzaGludCA0CiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOAogICAgLy8gcm9sZSA9IHJvbGVfaWQuYXNfdWludDY0KCkKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjkKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGUpCiAgICBkdXAKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzMxCiAgICAvLyBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKToKICAgIGludGNfMyAvLyAyMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMzNQogICAgLy8gY2FzZSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludHMgNDAgNTAgNjAgNzAgODAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzAtMzYxCiAgICAvLyBtYXRjaCByb2xlOgogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgLy8gICAgICAgICByZXR1cm4gdHlwLlJvbGVWYWxpZGl0eSgKICAgIC8vICAgICAgICAgICAgIHJvbGVfdmFsaWRpdHlfc3RhcnQ9VUludDY0KDApLCByb2xlX3ZhbGlkaXR5X2VuZD1VSW50NjQoMCkKICAgIC8vICAgICAgICAgKQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5hdXRob3JpdHksIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5vYnNlcnZlciwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5vYnNlcnZlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBfOgogICAgLy8gICAgICAgICBvcC5lcnIoZXJyLklOVkFMSURfUk9MRSkKICAgIHVuY292ZXIgNgogICAgbWF0Y2ggcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8wQDIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8xQDMgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8yQDQgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8zQDUgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV80QDYgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV81QDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNjEKICAgIC8vIG9wLmVycihlcnIuSU5WQUxJRF9ST0xFKQogICAgZXJyIC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzVANzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTcKICAgIC8vIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgNiAvLyAweDUyM2E0ZDRmNDMyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM1Ni0zNTgKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLm9ic2VydmVyLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTkKICAgIC8vIHJldHVybiBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV80QDY6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzUyCiAgICAvLyBzZWxmLmF1dGhvcml0eSwgcm9sZV9hZGRyZXNzCiAgICBieXRlY18yIC8vIDB4NTIzYTQxNTU1NDIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzUxLTM1MwogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTQKICAgIC8vIHJldHVybiBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzNANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNDcKICAgIC8vIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyA1IC8vIDB4NTIzYTU0NTI1MzIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzQ2LTM0OAogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzQ5CiAgICAvLyByZXR1cm4gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMkA0OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM0MgogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyA0IC8vIDB4NTIzYTUwNTk0NDIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzQxLTM0MwogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM0NAogICAgLy8gcmV0dXJuIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8xQDM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzM3CiAgICAvLyBzZWxmLmFjY291bnRfbWFuYWdlciwgcm9sZV9hZGRyZXNzCiAgICBieXRlY18zIC8vIDB4NTIzYTRkNGU0NzIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzM2LTMzOAogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzkKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzBAMjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzItMzM0CiAgICAvLyByZXR1cm4gdHlwLlJvbGVWYWxpZGl0eSgKICAgIC8vICAgICByb2xlX3ZhbGlkaXR5X3N0YXJ0PVVJbnQ2NCgwKSwgcm9sZV92YWxpZGl0eV9lbmQ9VUludDY0KDApCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fcm9sZV9pc19hY3RpdmUocm9sZV9tYXA6IGJ5dGVzLCByb2xlX2FkZHJlc3M6IGJ5dGVzKSAtPiB1aW50NjQ6Cl9yb2xlX2lzX2FjdGl2ZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NwogICAgLy8gZGVmIF9yb2xlX2lzX2FjdGl2ZShzZWxmLCByb2xlX21hcDogdHlwLlJiYWNSb2xlLCByb2xlX2FkZHJlc3M6IEFjY291bnQpIC0+IGJvb2w6CiAgICBwcm90byAyIDEKICAgIHB1c2hieXRlcyAiIgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU4LTYyCiAgICAvLyByZXR1cm4gc2VsZi5faGFzX3JvbGUocm9sZV9tYXAsIHJvbGVfYWRkcmVzcykgYW5kICgKICAgIC8vICAgICByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICkKICAgIGJ6IF9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIEJveE1hcCBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYwCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MAogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgPD0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYxCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIEJveE1hcCBlbnRyeSBleGlzdHMKICAgIHB1c2hpbnQgOAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2MC02MQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAwCiAgICA+PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5LTYxCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0CiAgICBpbnRjXzAgLy8gMQoKX3JvbGVfaXNfYWN0aXZlX2Jvb2xfbWVyZ2VANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OC02MgogICAgLy8gcmV0dXJuIHNlbGYuX2hhc19yb2xlKHJvbGVfbWFwLCByb2xlX2FkZHJlc3MpIGFuZCAoCiAgICAvLyAgICAgcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICAvLyApCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANDoKICAgIGludGNfMSAvLyAwCiAgICBiIF9yb2xlX2lzX2FjdGl2ZV9ib29sX21lcmdlQDUKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpIC0+IHZvaWQ6Cl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjY1CiAgICAvLyBhc3NlcnQgc2VsZi5faXNfYXJyYW5nZXIoVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1MgogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyA9PSBzZWxmLmFycmFuZ2VyLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMSAvLyAweDUyM2E0MTUyNTIyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgPT0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2NQogICAgLy8gYXNzZXJ0IHNlbGYuX2lzX2FycmFuZ2VyKFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpIC0+IHZvaWQ6Cl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4MwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFzc2V0X2RlZmF1bHRlZCwgZXJyLkRFRkFVTFRFRAogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDkgLy8gImFzc2V0X2RlZmF1bHRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9kZWZhdWx0ZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRGVmYXVsdGVkCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZDogdWludDY0KSAtPiB2b2lkOgpfYXNzZXJ0X3ZhbGlkX3JvbGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODgKICAgIC8vIGRlZiBfYXNzZXJ0X3ZhbGlkX3JvbGUoc2VsZiwgcm9sZV9pZDogVUludDY0KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkwCiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICBpbnRjXzMgLy8gMjAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkxCiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgcHVzaGludCAyNQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTIKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICBwdXNoaW50IDQwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MwogICAgLy8gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgcHVzaGludCA1MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTQKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgcHVzaGludCA2MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTUKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICBwdXNoaW50IDcwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NgogICAgLy8gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgcHVzaGludCA4MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfZmFsc2VAOAoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3OgogICAgaW50Y18wIC8vIDEKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX21lcmdlQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgcmV0c3ViCgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9mYWxzZUA4OgogICAgaW50Y18xIC8vIDAKICAgIGIgX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfbWVyZ2VAOQo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" }, "byteCode": { - "approval": "CyAEAQAgFCYKBBUffHULUiNBcnJhbmdlciMMUiNBdXRob3JpdHkjEVIjQWNjb3VudE1hbmFnZXIjEFIjUHJpbWFyeURlYWxlciMKUiNUcnVzdGVlIwtSI09ic2VydmVyIwtSI09wRGFlbW9uIw9hc3NldF9zdXNwZW5kZWQPYXNzZXRfZGVmYXVsdGVkMRhAABEpMgNnJwcyA2cnCCNnJwkjZzEbQQBggASRTwTrNhoAjgEARzEZFEQxGESCCASC9xstBO8E9dME3zQ1UAQ9voC9BB4+SOcEAQyCmQR0BqzSBBpyou42GgCOCAAgADcATwEAAZMBsQG7AgQAMRmBBBIxGBBEQgAOMRkUMRgUEEQpMQBnIkOIAqwiQzYaAUkVJBJEiAKfKUxnMgcWKExQsCJDNhoBSRUkEkSIAognB0xnMgcWKExQsCJDNhoBSRUiEkQ2GgJJTgIVJBJENhoDSU4CFYEQEkSIAluIAmEXRwKIAmMlEkEADSlLA2cyBxYoTFCwIkNJgSgSQQAQK0sDUEm9RQEUREsCv0L/4EmBMhJBABEnBEsDUEm9RQEUREsCv0L/yEmBPBJBABEnBUsDUEm9RQEUREsCv0L/sEmBRhJBABAqSwNQSb1FARRESwK/Qv+ZSYFQEkH/kicGSwNQSb1FARRESwK/Qv+BNhoBSRUiEkQ2GgJJTgIVJBJEiAG1iAG7F0cCiAG9SSUTRIEoEkEAFCtLAlBJvUUBRLxIMgcWKExQsCJDSYEyEkEADycESwJQSb1FAUS8SEL/4UmBPBJBAA8nBUsCUEm9RQFEvEhC/8tJgUYSQQAOKksCUEm9RQFEvEhC/7ZJgVASQf+vJwZLAlBJvUUBRLxIQv+gNhoBSRUiEkQjUyoxAIgA8kQnCExnMgcWKExQsCJDIyllRChMULAiQzYaAUkVJBJEK0sBiADMJwRLAogAxScFSwOIAL4qSwSIALgnBk8FiACxgAEAI08GVCJPBVSBAk8EVIEDTwNUgQRPAlQoTFCwIkM2GgFJFSISRDYaAklOAhUkEkQXSYgAwCWDBSgyPEZQTwaOBgBNAD8AMAAhABMAAQAnBksBUEm9RQFEvkgoTFCwIkMqSwFQSb1FAUS+SEL/7CcFSwFQSb1FAUS+SEL/3ScESwFQSb1FAUS+SEL/zitLAVBJvUUBRL5IQv/AgBAAAAAAAAAAAAAAAAAAAAAAQv+rigIBgACL/ov/UEm9RQFBACCLAb5EI1syB0mMAA5BABGLAb5EgQhbiwAPQQAEIowAiSNC//kxACMpZUQSRIkjJwllRBREiYoBAIv/JRJAADCL/4EZEkAAKIv/gSgSQAAgi/+BMhJAABiL/4E8EkAAEIv/gUYSQAAIi/+BUBJBAAMiRIkjQv/6", + "approval": "CyAEAQAgFCYKBBUffHUGUjpBUlIjBlI6QVVUIwZSOk1ORyMGUjpQWUQjBlI6VFJTIwZSOk1PQyMGUjpPUEQjD2Fzc2V0X3N1c3BlbmRlZA9hc3NldF9kZWZhdWx0ZWQxGEAAESkyA2cnBzIDZycII2cnCSNnMRtBAGCABJFPBOs2GgCOAQBHMRkURDEYRIIIBIL3Gy0E7wT10wTfNDVQBD2+gL0EHj5I5wQBDIKZBHQGrNIEGnKi7jYaAI4IACAANwBPAQABkwGxAbsCBAAxGYEEEjEYEERCAA4xGRQxGBQQRCkxAGciQ4gCrCJDNhoBSRUkEkSIAp8pTGcyBxYoTFCwIkM2GgFJFSQSRIgCiCcHTGcyBxYoTFCwIkM2GgFJFSISRDYaAklOAhUkEkQ2GgNJTgIVgRASRIgCW4gCYRdHAogCYyUSQQANKUsDZzIHFihMULAiQ0mBKBJBABArSwNQSb1FARRESwK/Qv/gSYEyEkEAEScESwNQSb1FARRESwK/Qv/ISYE8EkEAEScFSwNQSb1FARRESwK/Qv+wSYFGEkEAECpLA1BJvUUBFERLAr9C/5lJgVASQf+SJwZLA1BJvUUBFERLAr9C/4E2GgFJFSISRDYaAklOAhUkEkSIAbWIAbsXRwKIAb1JJRNEgSgSQQAUK0sCUEm9RQFEvEgyBxYoTFCwIkNJgTISQQAPJwRLAlBJvUUBRLxIQv/hSYE8EkEADycFSwJQSb1FAUS8SEL/y0mBRhJBAA4qSwJQSb1FAUS8SEL/tkmBUBJB/68nBksCUEm9RQFEvEhC/6A2GgFJFSISRCNTKjEAiADyRCcITGcyBxYoTFCwIkMjKWVEKExQsCJDNhoBSRUkEkQrSwGIAMwnBEsCiADFJwVLA4gAvipLBIgAuCcGTwWIALGAAQAjTwZUIk8FVIECTwRUgQNPA1SBBE8CVChMULAiQzYaAUkVIhJENhoCSU4CFSQSRBdJiADAJYMFKDI8RlBPBo4GAE0APwAwACEAEwABACcGSwFQSb1FAUS+SChMULAiQypLAVBJvUUBRL5IQv/sJwVLAVBJvUUBRL5IQv/dJwRLAVBJvUUBRL5IQv/OK0sBUEm9RQFEvkhC/8CAEAAAAAAAAAAAAAAAAAAAAABC/6uKAgGAAIv+i/9QSb1FAUEAIIsBvkQjWzIHSYwADkEAEYsBvkSBCFuLAA9BAAQijACJI0L/+TEAIyllRBJEiSMnCWVEFESJigEAi/8lEkAAMIv/gRkSQAAoi/+BKBJAACCL/4EyEkAAGIv/gTwSQAAQi/+BRhJAAAiL/4FQEkEAAyJEiSNC//o=", "clear": "C4EBQw==" }, "compilerInfo": { diff --git a/smart_contracts/artifacts/mock_module_rbac/mock_rbac_module_client.py b/smart_contracts/artifacts/mock_module_rbac/mock_rbac_module_client.py index a938d1b1..f45425d1 100644 --- a/smart_contracts/artifacts/mock_module_rbac/mock_rbac_module_client.py +++ b/smart_contracts/artifacts/mock_module_rbac/mock_rbac_module_client.py @@ -19,7 +19,7 @@ import algokit_utils from algokit_utils import AlgorandClient as _AlgoKitAlgorandClient -_APP_SPEC_JSON = r"""{"arcs": [22, 28], "bareActions": {"call": [], "create": ["NoOp"]}, "methods": [{"actions": {"call": ["UpdateApplication"], "create": []}, "args": [], "name": "contract_update", "returns": {"type": "void"}, "desc": "Update D-ASA application.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "New Arranger address", "name": "new_arranger"}], "name": "rbac_rotate_arranger", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Rotate the Arranger address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Operation Daemon address", "name": "address"}], "name": "rbac_set_op_daemon", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Non-Normative: Set the Operation Daemon address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}, {"type": "(uint64,uint64)", "desc": "Role time validity", "name": "validity", "struct": "RoleValidity"}], "name": "rbac_assign_role", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Assign a role to an address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}], "name": "rbac_revoke_role", "returns": {"type": "uint64", "desc": "Timestamp of the role revocation"}, "desc": "Revoke a role from an address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Suspension status", "name": "suspended"}], "name": "rbac_contract_suspension", "returns": {"type": "uint64", "desc": "Timestamp of the set asset suspension status"}, "desc": "Set asset suspension status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "rbac_get_arranger", "returns": {"type": "address", "desc": "Arranger address"}, "desc": "Get Arranger address", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Address to get roles for", "name": "address"}], "name": "rbac_get_address_roles", "returns": {"type": "(bool,bool,bool,bool,bool)", "desc": "Roles mask: (Account Manager, Primary Dealer, Trustee, Authority, Observer)"}, "desc": "Non-normative - Get roles assigned to an address", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}], "name": "rbac_get_role_validity", "returns": {"type": "(uint64,uint64)", "desc": "Role validity", "struct": "RoleValidity"}, "desc": "Get role validity", "events": [], "readonly": true, "recommendations": {}}], "name": "MockRbacModule", "state": {"keys": {"box": {}, "global": {"arranger": {"key": "UiNBcnJhbmdlciM=", "keyType": "AVMBytes", "valueType": "address"}, "op_daemon": {"key": "UiNPcERhZW1vbiM=", "keyType": "AVMBytes", "valueType": "address"}, "asset_suspended": {"key": "YXNzZXRfc3VzcGVuZGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "asset_defaulted": {"key": "YXNzZXRfZGVmYXVsdGVk", "keyType": "AVMString", "valueType": "AVMUint64"}}, "local": {}}, "maps": {"box": {"account_manager": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNBY2NvdW50TWFuYWdlciM="}, "primary_dealer": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNQcmltYXJ5RGVhbGVyIw=="}, "trustee": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNUcnVzdGVlIw=="}, "authority": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNBdXRob3JpdHkj"}, "observer": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UiNPYnNlcnZlciM="}}, "global": {}, "local": {}}, "schema": {"global": {"bytes": 2, "ints": 2}, "local": {"bytes": 0, "ints": 0}}}, "structs": {"RoleValidity": [{"name": "role_validity_start", "type": "uint64"}, {"name": "role_validity_end", "type": "uint64"}]}, "byteCode": {"approval": "CyAEAQAgFCYKBBUffHULUiNBcnJhbmdlciMMUiNBdXRob3JpdHkjEVIjQWNjb3VudE1hbmFnZXIjEFIjUHJpbWFyeURlYWxlciMKUiNUcnVzdGVlIwtSI09ic2VydmVyIwtSI09wRGFlbW9uIw9hc3NldF9zdXNwZW5kZWQPYXNzZXRfZGVmYXVsdGVkMRhAABEpMgNnJwcyA2cnCCNnJwkjZzEbQQBggASRTwTrNhoAjgEARzEZFEQxGESCCASC9xstBO8E9dME3zQ1UAQ9voC9BB4+SOcEAQyCmQR0BqzSBBpyou42GgCOCAAgADcATwEAAZMBsQG7AgQAMRmBBBIxGBBEQgAOMRkUMRgUEEQpMQBnIkOIAqwiQzYaAUkVJBJEiAKfKUxnMgcWKExQsCJDNhoBSRUkEkSIAognB0xnMgcWKExQsCJDNhoBSRUiEkQ2GgJJTgIVJBJENhoDSU4CFYEQEkSIAluIAmEXRwKIAmMlEkEADSlLA2cyBxYoTFCwIkNJgSgSQQAQK0sDUEm9RQEUREsCv0L/4EmBMhJBABEnBEsDUEm9RQEUREsCv0L/yEmBPBJBABEnBUsDUEm9RQEUREsCv0L/sEmBRhJBABAqSwNQSb1FARRESwK/Qv+ZSYFQEkH/kicGSwNQSb1FARRESwK/Qv+BNhoBSRUiEkQ2GgJJTgIVJBJEiAG1iAG7F0cCiAG9SSUTRIEoEkEAFCtLAlBJvUUBRLxIMgcWKExQsCJDSYEyEkEADycESwJQSb1FAUS8SEL/4UmBPBJBAA8nBUsCUEm9RQFEvEhC/8tJgUYSQQAOKksCUEm9RQFEvEhC/7ZJgVASQf+vJwZLAlBJvUUBRLxIQv+gNhoBSRUiEkQjUyoxAIgA8kQnCExnMgcWKExQsCJDIyllRChMULAiQzYaAUkVJBJEK0sBiADMJwRLAogAxScFSwOIAL4qSwSIALgnBk8FiACxgAEAI08GVCJPBVSBAk8EVIEDTwNUgQRPAlQoTFCwIkM2GgFJFSISRDYaAklOAhUkEkQXSYgAwCWDBSgyPEZQTwaOBgBNAD8AMAAhABMAAQAnBksBUEm9RQFEvkgoTFCwIkMqSwFQSb1FAUS+SEL/7CcFSwFQSb1FAUS+SEL/3ScESwFQSb1FAUS+SEL/zitLAVBJvUUBRL5IQv/AgBAAAAAAAAAAAAAAAAAAAAAAQv+rigIBgACL/ov/UEm9RQFBACCLAb5EI1syB0mMAA5BABGLAb5EgQhbiwAPQQAEIowAiSNC//kxACMpZUQSRIkjJwllRBREiYoBAIv/JRJAADCL/4EZEkAAKIv/gSgSQAAgi/+BMhJAABiL/4E8EkAAEIv/gUYSQAAIi/+BUBJBAAMiRIkjQv/6", "clear": "C4EBQw=="}, "desc": "\n RBAC Module for testing\n ", "events": [], "networks": {}, "source": {"approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMzIgMjAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMgMHg1MjIzNDE3NTc0Njg2ZjcyNjk3NDc5MjMgMHg1MjIzNDE2MzYzNmY3NTZlNzQ0ZDYxNmU2MTY3NjU3MjIzIDB4NTIyMzUwNzI2OTZkNjE3Mjc5NDQ2NTYxNmM2NTcyMjMgMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMyAweDUyMjM0ZjYyNzM2NTcyNzY2NTcyMjMgMHg1MjIzNGY3MDQ0NjE2NTZkNmY2ZTIzICJhc3NldF9zdXNwZW5kZWQiICJhc3NldF9kZWZhdWx0ZWQiCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgtMjkKICAgIC8vICMgUkJBQyBSb2xlcwogICAgLy8gc2VsZi5hcnJhbmdlciA9IEdsb2JhbFN0YXRlKEFjY291bnQoKSwga2V5PWNzdC5QUkVGSVhfSURfQVJSQU5HRVIpCiAgICBieXRlY18xIC8vIDB4NTIyMzQxNzI3MjYxNmU2NzY1NzIyMwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwCiAgICAvLyBzZWxmLm9wX2RhZW1vbiA9IEdsb2JhbFN0YXRlKEFjY291bnQoKSwga2V5PWNzdC5QUkVGSVhfSURfT1BfREFFTU9OKQogICAgYnl0ZWMgNyAvLyAweDUyMjM0ZjcwNDQ2MTY1NmQ2ZjZlMjMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo0Ny00OAogICAgLy8gIyBELUFTQSBHb3Zlcm5hbmNlCiAgICAvLyBzZWxmLmFzc2V0X3N1c3BlbmRlZCA9IEZhbHNlCiAgICBieXRlYyA4IC8vICJhc3NldF9zdXNwZW5kZWQiCiAgICBpbnRjXzEgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo0OQogICAgLy8gc2VsZi5hc3NldF9kZWZhdWx0ZWQgPSBGYWxzZQogICAgYnl0ZWMgOSAvLyAiYXNzZXRfZGVmYXVsdGVkIgogICAgaW50Y18xIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tb2NrX21vZHVsZV9yYmFjL2NvbnRyYWN0LnB5OjYKICAgIC8vIGNsYXNzIE1vY2tSYmFjTW9kdWxlKFJiYWNNb2R1bGUpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fY3JlYXRlQDE5CiAgICBwdXNoYnl0ZXMgMHg5MTRmMDRlYiAvLyBtZXRob2QgImNvbnRyYWN0X3VwZGF0ZSgpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fY29udHJhY3RfdXBkYXRlX3JvdXRlQDUKCm1haW5fc3dpdGNoX2Nhc2VfbmV4dEA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL21vY2tfbW9kdWxlX3JiYWMvY29udHJhY3QucHk6NgogICAgLy8gY2xhc3MgTW9ja1JiYWNNb2R1bGUoUmJhY01vZHVsZSk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHg4MmY3MWIyZCAweGVmMDRmNWQzIDB4ZGYzNDM1NTAgMHgzZGJlODBiZCAweDFlM2U0OGU3IDB4MDEwYzgyOTkgMHg3NDA2YWNkMiAweDFhNzJhMmVlIC8vIG1ldGhvZCAicmJhY19yb3RhdGVfYXJyYW5nZXIoYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgInJiYWNfc2V0X29wX2RhZW1vbihhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19hc3NpZ25fcm9sZSh1aW50OCxhZGRyZXNzLCh1aW50NjQsdWludDY0KSl1aW50NjQiLCBtZXRob2QgInJiYWNfcmV2b2tlX3JvbGUodWludDgsYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgInJiYWNfY29udHJhY3Rfc3VzcGVuc2lvbihib29sKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19nZXRfYXJyYW5nZXIoKWFkZHJlc3MiLCBtZXRob2QgInJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXMoYWRkcmVzcykoYm9vbCxib29sLGJvb2wsYm9vbCxib29sKSIsIG1ldGhvZCAicmJhY19nZXRfcm9sZV92YWxpZGl0eSh1aW50OCxhZGRyZXNzKSh1aW50NjQsdWludDY0KSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIHJiYWNfcm90YXRlX2FycmFuZ2VyIHJiYWNfc2V0X29wX2RhZW1vbiByYmFjX2Fzc2lnbl9yb2xlIHJiYWNfcmV2b2tlX3JvbGUgcmJhY19jb250cmFjdF9zdXNwZW5zaW9uIHJiYWNfZ2V0X2FycmFuZ2VyIHJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXMgcmJhY19nZXRfcm9sZV92YWxpZGl0eQogICAgZXJyCgptYWluX2NvbnRyYWN0X3VwZGF0ZV9yb3V0ZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgcHVzaGludCA0IC8vIFVwZGF0ZUFwcGxpY2F0aW9uCiAgICA9PQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICYmCiAgICBhc3NlcnQKICAgIGIgY29udHJhY3RfdXBkYXRlCgptYWluX2NyZWF0ZUAxOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tb2NrX21vZHVsZV9yYmFjL2NvbnRyYWN0LnB5OjE0CiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIGFzc2VydAogICAgLy8gc21hcnRfY29udHJhY3RzL21vY2tfbW9kdWxlX3JiYWMvY29udHJhY3QucHk6MTYKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSBUeG4uc2VuZGVyCiAgICBieXRlY18xIC8vIDB4NTIyMzQxNzI3MjYxNmU2NzY1NzIyMwogICAgdHhuIFNlbmRlcgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tb2NrX21vZHVsZV9yYmFjL2NvbnRyYWN0LnB5OjE0CiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuY29udHJhY3RfdXBkYXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfdXBkYXRlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE1My0xNTYKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBncmFudHMgdGhlIHVwZGF0ZSBwZXJtaXNzaW9ucyB0byB0aGUgQXJyYW5nZXIuCiAgICAvLyAjIOKaoO+4jyBXQVJOSU5HOiBBcHBsaWNhdGlvbiB1cGRhdGVzIG11c3QgYmUgZXhlY3V0ZWQgVkVSWSBjYXJlZnVsbHksIGFzIHRoZXkKICAgIC8vICMgbWlnaHQgaW50cm9kdWNlIGJyZWFraW5nIGNoYW5nZXMuCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3JvdGF0ZV9hcnJhbmdlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfcm90YXRlX2FycmFuZ2VyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE1OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNjkKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE3MAogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IG5ld19hcnJhbmdlcgogICAgYnl0ZWNfMSAvLyAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTcxCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfc2V0X29wX2RhZW1vbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfc2V0X29wX2RhZW1vbjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTg0CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODUKICAgIC8vIHNlbGYub3BfZGFlbW9uLnZhbHVlID0gYWRkcmVzcwogICAgYnl0ZWMgNyAvLyAweDUyMjM0ZjcwNDQ2MTY1NmQ2ZjZlMjMKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTg2CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfYXNzaWduX3JvbGVbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2Fzc2lnbl9yb2xlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIHB1c2hpbnQgMTYKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuUm9sZVZhbGlkaXR5CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjEwCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTEKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjEyCiAgICAvLyBzZWxmLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpKQogICAgYnRvaQogICAgZHVwbiAyCiAgICBjYWxsc3ViIF9hc3NlcnRfdmFsaWRfcm9sZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwMgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUik6CiAgICBpbnRjXzMgLy8gMjAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwMwogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IHJvbGVfYWRkcmVzcwogICAgYnl0ZWNfMSAvLyAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMKICAgIGRpZyAzCiAgICBhcHBfZ2xvYmFsX3B1dAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTQKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDYKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIGR1cAogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnRfbWFuYWdlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlY18zIC8vIDB4NTIyMzQxNjM2MzZmNzU2ZTc0NGQ2MTZlNjE2NzY1NzIyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA4CiAgICAvLyBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIxMwogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTEwCiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKToKICAgIGR1cAogICAgcHVzaGludCA1MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTExCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDQgLy8gMHg1MjIzNTA3MjY5NmQ2MTcyNzk0NDY1NjE2YzY1NzIyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTEyCiAgICAvLyBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjEzCiAgICAvLyBzZWxmLl9zZXRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIHZhbGlkaXR5KQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTQKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNjAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDUgLy8gMHg1MjIzNTQ3Mjc1NzM3NDY1NjUyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE2CiAgICAvLyBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTMKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExOAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlY18yIC8vIDB4NTIyMzQxNzU3NDY4NmY3MjY5NzQ3OTIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjAKICAgIC8vIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjEzCiAgICAvLyBzZWxmLl9zZXRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIHZhbGlkaXR5KQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMTE6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIyCiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKToKICAgIGR1cAogICAgcHVzaGludCA4MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjMKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYub2JzZXJ2ZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgNiAvLyAweDUyMjM0ZjYyNzM2NTcyNzY2NTcyMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyNAogICAgLy8gc2VsZi5vYnNlcnZlcltyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19yZXZva2Vfcm9sZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfcmV2b2tlX3JvbGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjE2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjM1CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzYKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjM3CiAgICAvLyBzZWxmLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpKQogICAgYnRvaQogICAgZHVwbiAyCiAgICBjYWxsc3ViIF9hc3NlcnRfdmFsaWRfcm9sZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyNwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgIT0gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBkdXAKICAgIGludGNfMyAvLyAyMAogICAgIT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyOAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjXzMgLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQ0ZDYxNmU2MTY3NjU3MjIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzAKICAgIC8vIGRlbCBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjM5CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMyCiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKToKICAgIGR1cAogICAgcHVzaGludCA1MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMzCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgNCAvLyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzQKICAgIC8vIGRlbCBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzOAogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzYKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNjAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgNSAvLyAweDUyMjM1NDcyNzU3Mzc0NjU2NTIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzgKICAgIC8vIGRlbCBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjM4CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDEKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hdXRob3JpdHksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWNfMiAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQyCiAgICAvLyBkZWwgc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjM4CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgODAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ1CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYub2JzZXJ2ZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgNiAvLyAweDUyMjM0ZjYyNzM2NTcyNzY2NTcyMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NgogICAgLy8gZGVsIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2NvbnRyYWN0X3N1c3BlbnNpb25bcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2NvbnRyYWN0X3N1c3BlbnNpb246CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QgICMgVE9ETzogVXBkYXRlIHNwZWNzIGFuZCBhZGQgdGVzdAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMSAvLyAwCiAgICBnZXRiaXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo3NwogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYXV0aG9yaXR5LCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWNfMiAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1NwogICAgLy8gc2VsZi5hc3NldF9zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGJ5dGVjIDggLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU4CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCAgIyBUT0RPOiBVcGRhdGUgc3BlY3MgYW5kIGFkZCB0ZXN0CiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYXJyYW5nZXJbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNjgKICAgIC8vIHJldHVybiBzZWxmLmFycmFuZ2VyLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMSAvLyAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcnJhbmdlciBleGlzdHMKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNjAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXNbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9hZGRyZXNzX3JvbGVzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODQKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBhZGRyZXNzKSwKICAgIGJ5dGVjXzMgLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQ0ZDYxNmU2MTY3NjU3MjIzCiAgICBkaWcgMQogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODUKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYucHJpbWFyeV9kZWFsZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgNCAvLyAweDUyMjM1MDcyNjk2ZDYxNzI3OTQ0NjU2MTZjNjU3MjIzCiAgICBkaWcgMgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODYKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYudHJ1c3RlZSwgYWRkcmVzcyksCiAgICBieXRlYyA1IC8vIDB4NTIyMzU0NzI3NTczNzQ2NTY1MjMKICAgIGRpZyAzCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4NwogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIGFkZHJlc3MpLAogICAgYnl0ZWNfMiAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgZGlnIDQKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg4CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLm9ic2VydmVyLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDYgLy8gMHg1MjIzNGY2MjczNjU3Mjc2NjU3MjIzCiAgICB1bmNvdmVyIDUKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjcwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHB1c2hieXRlcyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciA2CiAgICBzZXRiaXQKICAgIGludGNfMCAvLyAxCiAgICB1bmNvdmVyIDUKICAgIHNldGJpdAogICAgcHVzaGludCAyCiAgICB1bmNvdmVyIDQKICAgIHNldGJpdAogICAgcHVzaGludCAzCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgcHVzaGludCA0CiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwNQogICAgLy8gcm9sZSA9IHJvbGVfaWQuYXNfdWludDY0KCkKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDYKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGUpCiAgICBkdXAKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA4CiAgICAvLyBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKToKICAgIGludGNfMyAvLyAyMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxMgogICAgLy8gY2FzZSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludHMgNDAgNTAgNjAgNzAgODAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDctMzM4CiAgICAvLyBtYXRjaCByb2xlOgogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgLy8gICAgICAgICByZXR1cm4gdHlwLlJvbGVWYWxpZGl0eSgKICAgIC8vICAgICAgICAgICAgIHJvbGVfdmFsaWRpdHlfc3RhcnQ9VUludDY0KDApLCByb2xlX3ZhbGlkaXR5X2VuZD1VSW50NjQoMCkKICAgIC8vICAgICAgICAgKQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5hdXRob3JpdHksIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5vYnNlcnZlciwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5vYnNlcnZlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBfOgogICAgLy8gICAgICAgICBvcC5lcnIoZXJyLklOVkFMSURfUk9MRSkKICAgIHVuY292ZXIgNgogICAgbWF0Y2ggcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8wQDIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8xQDMgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8yQDQgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8zQDUgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV80QDYgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV81QDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzgKICAgIC8vIG9wLmVycihlcnIuSU5WQUxJRF9ST0xFKQogICAgZXJyIC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzVANzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzQKICAgIC8vIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgNiAvLyAweDUyMjM0ZjYyNzM2NTcyNzY2NTcyMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzMtMzM1CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5vYnNlcnZlciwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzM2CiAgICAvLyByZXR1cm4gc2VsZi5vYnNlcnZlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNEA2OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOQogICAgLy8gc2VsZi5hdXRob3JpdHksIHJvbGVfYWRkcmVzcwogICAgYnl0ZWNfMiAvLyAweDUyMjM0MTc1NzQ2ODZmNzI2OTc0NzkyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOC0zMzAKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLmF1dGhvcml0eSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzMxCiAgICAvLyByZXR1cm4gc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8zQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI0CiAgICAvLyBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgNSAvLyAweDUyMjM1NDcyNzU3Mzc0NjU2NTIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzIzLTMyNQogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI2CiAgICAvLyByZXR1cm4gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMkA0OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxOQogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyA0IC8vIDB4NTIyMzUwNzI2OTZkNjE3Mjc5NDQ2NTYxNmM2NTcyMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTgtMzIwCiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzIxCiAgICAvLyByZXR1cm4gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzFAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTQKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjXzMgLy8gMHg1MjIzNDE2MzYzNmY3NTZlNzQ0ZDYxNmU2MTY3NjU3MjIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEzLTMxNQogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTYKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzBAMjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDktMzExCiAgICAvLyByZXR1cm4gdHlwLlJvbGVWYWxpZGl0eSgKICAgIC8vICAgICByb2xlX3ZhbGlkaXR5X3N0YXJ0PVVJbnQ2NCgwKSwgcm9sZV92YWxpZGl0eV9lbmQ9VUludDY0KDApCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fcm9sZV9pc19hY3RpdmUocm9sZV9tYXA6IGJ5dGVzLCByb2xlX2FkZHJlc3M6IGJ5dGVzKSAtPiB1aW50NjQ6Cl9yb2xlX2lzX2FjdGl2ZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NwogICAgLy8gZGVmIF9yb2xlX2lzX2FjdGl2ZShzZWxmLCByb2xlX21hcDogdHlwLlJiYWNSb2xlLCByb2xlX2FkZHJlc3M6IEFjY291bnQpIC0+IGJvb2w6CiAgICBwcm90byAyIDEKICAgIHB1c2hieXRlcyAiIgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU4LTYyCiAgICAvLyByZXR1cm4gc2VsZi5faGFzX3JvbGUocm9sZV9tYXAsIHJvbGVfYWRkcmVzcykgYW5kICgKICAgIC8vICAgICByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICkKICAgIGJ6IF9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIEJveE1hcCBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYwCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MAogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgPD0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYxCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIEJveE1hcCBlbnRyeSBleGlzdHMKICAgIHB1c2hpbnQgOAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2MC02MQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAwCiAgICA+PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5LTYxCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0CiAgICBpbnRjXzAgLy8gMQoKX3JvbGVfaXNfYWN0aXZlX2Jvb2xfbWVyZ2VANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OC02MgogICAgLy8gcmV0dXJuIHNlbGYuX2hhc19yb2xlKHJvbGVfbWFwLCByb2xlX2FkZHJlc3MpIGFuZCAoCiAgICAvLyAgICAgcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICAvLyApCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANDoKICAgIGludGNfMSAvLyAwCiAgICBiIF9yb2xlX2lzX2FjdGl2ZV9ib29sX21lcmdlQDUKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpIC0+IHZvaWQ6Cl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjY1CiAgICAvLyBhc3NlcnQgc2VsZi5faXNfYXJyYW5nZXIoVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1MgogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyA9PSBzZWxmLmFycmFuZ2VyLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMSAvLyAweDUyMjM0MTcyNzI2MTZlNjc2NTcyMjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcnJhbmdlciBleGlzdHMKICAgID09CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjUKICAgIC8vIGFzc2VydCBzZWxmLl9pc19hcnJhbmdlcihUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKSAtPiB2b2lkOgpfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODMKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5hc3NldF9kZWZhdWx0ZWQsIGVyci5ERUZBVUxURUQKICAgIGludGNfMSAvLyAwCiAgICBieXRlYyA5IC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfZGVmYXVsdGVkIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIERlZmF1bHRlZAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGVfaWQ6IHVpbnQ2NCkgLT4gdm9pZDoKX2Fzc2VydF92YWxpZF9yb2xlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg4CiAgICAvLyBkZWYgX2Fzc2VydF92YWxpZF9yb2xlKHNlbGYsIHJvbGVfaWQ6IFVJbnQ2NCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MAogICAgLy8gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgaW50Y18zIC8vIDIwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MQogICAgLy8gVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIHB1c2hpbnQgMjUKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkyCiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgcHVzaGludCA0MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTMKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIHB1c2hpbnQgNTAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojk0CiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIHB1c2hpbnQgNjAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojk1CiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgcHVzaGludCA3MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTYKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIHB1c2hpbnQgODAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJ6IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX2ZhbHNlQDgKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANzoKICAgIGludGNfMCAvLyAxCgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9tZXJnZUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBhc3NlcnQgLy8gSW52YWxpZCByb2xlIGlkZW50aWZpZXIKICAgIHJldHN1YgoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfZmFsc2VAODoKICAgIGludGNfMSAvLyAwCiAgICBiIF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX21lcmdlQDkK", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="}, "sourceInfo": {"approval": {"pcOffsetMethod": "none", "sourceInfo": [{"pc": [980], "errorMessage": "Defaulted"}, {"pc": [405, 429, 453, 476, 500, 555, 583, 605, 626, 648, 824, 841, 856, 871, 885], "errorMessage": "Invalid account role address"}, {"pc": [540, 814, 1041], "errorMessage": "Invalid role identifier"}, {"pc": [670, 972], "errorMessage": "Not authorized"}, {"pc": [932, 947], "errorMessage": "check BoxMap entry exists"}, {"pc": [687, 970], "errorMessage": "check self.arranger exists"}, {"pc": [978], "errorMessage": "check self.asset_defaulted exists"}, {"pc": [661], "errorMessage": "invalid number of bytes for arc4.bool"}, {"pc": [290, 313, 347, 524, 701, 784], "errorMessage": "invalid number of bytes for arc4.static_array"}, {"pc": [337, 514, 774], "errorMessage": "invalid number of bytes for arc4.uint8"}, {"pc": [358], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.RoleValidity"}]}, "clear": {"pcOffsetMethod": "none", "sourceInfo": []}}, "templateVariables": {}}""" +_APP_SPEC_JSON = r"""{"arcs": [22, 28], "bareActions": {"call": [], "create": ["NoOp"]}, "methods": [{"actions": {"call": ["UpdateApplication"], "create": []}, "args": [], "name": "contract_update", "returns": {"type": "void", "desc": "None."}, "desc": "Update D-ASA application.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "New arranger address.", "name": "new_arranger"}], "name": "rbac_rotate_arranger", "returns": {"type": "uint64", "desc": "UNIX timestamp of the role assignment."}, "desc": "Rotate the arranger address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Operation daemon address.", "name": "address"}], "name": "rbac_set_op_daemon", "returns": {"type": "uint64", "desc": "UNIX timestamp of the role assignment."}, "desc": "Non-normative helper to set the operation daemon address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role identifier.", "name": "role_id"}, {"type": "address", "desc": "Account role address.", "name": "role_address"}, {"type": "(uint64,uint64)", "desc": "Inclusive validity interval for the assignment.", "name": "validity", "struct": "RoleValidity"}], "name": "rbac_assign_role", "returns": {"type": "uint64", "desc": "UNIX timestamp of the role assignment."}, "desc": "Assign a role to an address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role identifier.", "name": "role_id"}, {"type": "address", "desc": "Account role address.", "name": "role_address"}], "name": "rbac_revoke_role", "returns": {"type": "uint64", "desc": "UNIX timestamp of the role revocation."}, "desc": "Revoke a role from an address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Suspension status to apply.", "name": "suspended"}], "name": "rbac_contract_suspension", "returns": {"type": "uint64", "desc": "UNIX timestamp of the suspension update."}, "desc": "Set the asset-wide suspension status.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "rbac_get_arranger", "returns": {"type": "address", "desc": "Current arranger address."}, "desc": "Get the arranger address.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Address to query.", "name": "address"}], "name": "rbac_get_address_roles", "returns": {"type": "(bool,bool,bool,bool,bool)", "desc": "Roles mask in the order: account manager, primary dealer, trustee, authority, observer."}, "desc": "Non-normative helper to get the active roles assigned to an address.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role identifier.", "name": "role_id"}, {"type": "address", "desc": "Account role address.", "name": "role_address"}], "name": "rbac_get_role_validity", "returns": {"type": "(uint64,uint64)", "desc": "Stored role validity interval.", "struct": "RoleValidity"}, "desc": "Get the stored validity interval for a role assignment.", "events": [], "readonly": true, "recommendations": {}}], "name": "MockRbacModule", "state": {"keys": {"box": {}, "global": {"arranger": {"key": "UjpBUlIj", "keyType": "AVMBytes", "valueType": "address"}, "op_daemon": {"key": "UjpPUEQj", "keyType": "AVMBytes", "valueType": "address"}, "asset_suspended": {"key": "YXNzZXRfc3VzcGVuZGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "asset_defaulted": {"key": "YXNzZXRfZGVmYXVsdGVk", "keyType": "AVMString", "valueType": "AVMUint64"}}, "local": {}}, "maps": {"box": {"account_manager": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpNTkcj"}, "primary_dealer": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpQWUQj"}, "trustee": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpUUlMj"}, "authority": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpBVVQj"}, "observer": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpNT0Mj"}}, "global": {}, "local": {}}, "schema": {"global": {"bytes": 2, "ints": 2}, "local": {"bytes": 0, "ints": 0}}}, "structs": {"RoleValidity": [{"name": "role_validity_start", "type": "uint64"}, {"name": "role_validity_end", "type": "uint64"}]}, "byteCode": {"approval": "CyAEAQAgFCYKBBUffHUGUjpBUlIjBlI6QVVUIwZSOk1ORyMGUjpQWUQjBlI6VFJTIwZSOk1PQyMGUjpPUEQjD2Fzc2V0X3N1c3BlbmRlZA9hc3NldF9kZWZhdWx0ZWQxGEAAESkyA2cnBzIDZycII2cnCSNnMRtBAGCABJFPBOs2GgCOAQBHMRkURDEYRIIIBIL3Gy0E7wT10wTfNDVQBD2+gL0EHj5I5wQBDIKZBHQGrNIEGnKi7jYaAI4IACAANwBPAQABkwGxAbsCBAAxGYEEEjEYEERCAA4xGRQxGBQQRCkxAGciQ4gCrCJDNhoBSRUkEkSIAp8pTGcyBxYoTFCwIkM2GgFJFSQSRIgCiCcHTGcyBxYoTFCwIkM2GgFJFSISRDYaAklOAhUkEkQ2GgNJTgIVgRASRIgCW4gCYRdHAogCYyUSQQANKUsDZzIHFihMULAiQ0mBKBJBABArSwNQSb1FARRESwK/Qv/gSYEyEkEAEScESwNQSb1FARRESwK/Qv/ISYE8EkEAEScFSwNQSb1FARRESwK/Qv+wSYFGEkEAECpLA1BJvUUBFERLAr9C/5lJgVASQf+SJwZLA1BJvUUBFERLAr9C/4E2GgFJFSISRDYaAklOAhUkEkSIAbWIAbsXRwKIAb1JJRNEgSgSQQAUK0sCUEm9RQFEvEgyBxYoTFCwIkNJgTISQQAPJwRLAlBJvUUBRLxIQv/hSYE8EkEADycFSwJQSb1FAUS8SEL/y0mBRhJBAA4qSwJQSb1FAUS8SEL/tkmBUBJB/68nBksCUEm9RQFEvEhC/6A2GgFJFSISRCNTKjEAiADyRCcITGcyBxYoTFCwIkMjKWVEKExQsCJDNhoBSRUkEkQrSwGIAMwnBEsCiADFJwVLA4gAvipLBIgAuCcGTwWIALGAAQAjTwZUIk8FVIECTwRUgQNPA1SBBE8CVChMULAiQzYaAUkVIhJENhoCSU4CFSQSRBdJiADAJYMFKDI8RlBPBo4GAE0APwAwACEAEwABACcGSwFQSb1FAUS+SChMULAiQypLAVBJvUUBRL5IQv/sJwVLAVBJvUUBRL5IQv/dJwRLAVBJvUUBRL5IQv/OK0sBUEm9RQFEvkhC/8CAEAAAAAAAAAAAAAAAAAAAAABC/6uKAgGAAIv+i/9QSb1FAUEAIIsBvkQjWzIHSYwADkEAEYsBvkSBCFuLAA9BAAQijACJI0L/+TEAIyllRBJEiSMnCWVEFESJigEAi/8lEkAAMIv/gRkSQAAoi/+BKBJAACCL/4EyEkAAGIv/gTwSQAAQi/+BRhJAAAiL/4FQEkEAAyJEiSNC//o=", "clear": "C4EBQw=="}, "desc": "\n RBAC Module for testing\n ", "events": [], "networks": {}, "source": {"approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMzIgMjAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAweDUyM2E0MTUyNTIyMyAweDUyM2E0MTU1NTQyMyAweDUyM2E0ZDRlNDcyMyAweDUyM2E1MDU5NDQyMyAweDUyM2E1NDUyNTMyMyAweDUyM2E0ZDRmNDMyMyAweDUyM2E0ZjUwNDQyMyAiYXNzZXRfc3VzcGVuZGVkIiAiYXNzZXRfZGVmYXVsdGVkIgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4LTI5CiAgICAvLyAjIFJCQUMgUm9sZXMKICAgIC8vIHNlbGYuYXJyYW5nZXIgPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX0FSUkFOR0VSKQogICAgYnl0ZWNfMSAvLyAweDUyM2E0MTUyNTIyMwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwCiAgICAvLyBzZWxmLm9wX2RhZW1vbiA9IEdsb2JhbFN0YXRlKEFjY291bnQoKSwga2V5PWNzdC5QUkVGSVhfSURfT1BfREFFTU9OKQogICAgYnl0ZWMgNyAvLyAweDUyM2E0ZjUwNDQyMwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjQ3LTQ4CiAgICAvLyAjIEQtQVNBIEdvdmVybmFuY2UKICAgIC8vIHNlbGYuYXNzZXRfc3VzcGVuZGVkID0gRmFsc2UKICAgIGJ5dGVjIDggLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIGludGNfMSAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjQ5CiAgICAvLyBzZWxmLmFzc2V0X2RlZmF1bHRlZCA9IEZhbHNlCiAgICBieXRlYyA5IC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBpbnRjXzEgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL21vY2tfbW9kdWxlX3JiYWMvY29udHJhY3QucHk6NgogICAgLy8gY2xhc3MgTW9ja1JiYWNNb2R1bGUoUmJhY01vZHVsZSk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9jcmVhdGVAMTkKICAgIHB1c2hieXRlcyAweDkxNGYwNGViIC8vIG1ldGhvZCAiY29udHJhY3RfdXBkYXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9jb250cmFjdF91cGRhdGVfcm91dGVANQoKbWFpbl9zd2l0Y2hfY2FzZV9uZXh0QDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbW9ja19tb2R1bGVfcmJhYy9jb250cmFjdC5weTo2CiAgICAvLyBjbGFzcyBNb2NrUmJhY01vZHVsZShSYmFjTW9kdWxlKToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweDgyZjcxYjJkIDB4ZWYwNGY1ZDMgMHhkZjM0MzU1MCAweDNkYmU4MGJkIDB4MWUzZTQ4ZTcgMHgwMTBjODI5OSAweDc0MDZhY2QyIDB4MWE3MmEyZWUgLy8gbWV0aG9kICJyYmFjX3JvdGF0ZV9hcnJhbmdlcihhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19zZXRfb3BfZGFlbW9uKGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX2Fzc2lnbl9yb2xlKHVpbnQ4LGFkZHJlc3MsKHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19yZXZva2Vfcm9sZSh1aW50OCxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19jb250cmFjdF9zdXNwZW5zaW9uKGJvb2wpdWludDY0IiwgbWV0aG9kICJyYmFjX2dldF9hcnJhbmdlcigpYWRkcmVzcyIsIG1ldGhvZCAicmJhY19nZXRfYWRkcmVzc19yb2xlcyhhZGRyZXNzKShib29sLGJvb2wsYm9vbCxib29sLGJvb2wpIiwgbWV0aG9kICJyYmFjX2dldF9yb2xlX3ZhbGlkaXR5KHVpbnQ4LGFkZHJlc3MpKHVpbnQ2NCx1aW50NjQpIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggcmJhY19yb3RhdGVfYXJyYW5nZXIgcmJhY19zZXRfb3BfZGFlbW9uIHJiYWNfYXNzaWduX3JvbGUgcmJhY19yZXZva2Vfcm9sZSByYmFjX2NvbnRyYWN0X3N1c3BlbnNpb24gcmJhY19nZXRfYXJyYW5nZXIgcmJhY19nZXRfYWRkcmVzc19yb2xlcyByYmFjX2dldF9yb2xlX3ZhbGlkaXR5CiAgICBlcnIKCm1haW5fY29udHJhY3RfdXBkYXRlX3JvdXRlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBwdXNoaW50IDQgLy8gVXBkYXRlQXBwbGljYXRpb24KICAgID09CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydAogICAgYiBjb250cmFjdF91cGRhdGUKCm1haW5fY3JlYXRlQDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL21vY2tfbW9kdWxlX3JiYWMvY29udHJhY3QucHk6MTQKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbW9ja19tb2R1bGVfcmJhYy9jb250cmFjdC5weToxNgogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IFR4bi5zZW5kZXIKICAgIGJ5dGVjXzEgLy8gMHg1MjNhNDE1MjUyMjMKICAgIHR4biBTZW5kZXIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbW9ja19tb2R1bGVfcmJhYy9jb250cmFjdC5weToxNAogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLmNvbnRyYWN0X3VwZGF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X3VwZGF0ZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTktMTYyCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gZ3JhbnRzIHRoZSB1cGRhdGUgcGVybWlzc2lvbnMgdG8gdGhlIEFycmFuZ2VyLgogICAgLy8gIyDimqDvuI8gV0FSTklORzogQXBwbGljYXRpb24gdXBkYXRlcyBtdXN0IGJlIGV4ZWN1dGVkIFZFUlkgY2FyZWZ1bGx5LCBhcyB0aGV5CiAgICAvLyAjIG1pZ2h0IGludHJvZHVjZSBicmVha2luZyBjaGFuZ2VzLgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19yb3RhdGVfYXJyYW5nZXJbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3JvdGF0ZV9hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTc4CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzkKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSBuZXdfYXJyYW5nZXIKICAgIGJ5dGVjXzEgLy8gMHg1MjNhNDE1MjUyMjMKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTgwCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfc2V0X29wX2RhZW1vbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfc2V0X29wX2RhZW1vbjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTk2CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxOTcKICAgIC8vIHNlbGYub3BfZGFlbW9uLnZhbHVlID0gYWRkcmVzcwogICAgYnl0ZWMgNyAvLyAweDUyM2E0ZjUwNDQyMwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxOTgKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19hc3NpZ25fcm9sZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfYXNzaWduX3JvbGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgcHVzaGludCAxNgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5Sb2xlVmFsaWRpdHkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjIKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyMwogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjQKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCkpCiAgICBidG9pCiAgICBkdXBuIDIKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTAyCiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKToKICAgIGludGNfMyAvLyAyMAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTAzCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gcm9sZV9hZGRyZXNzCiAgICBieXRlY18xIC8vIDB4NTIzYTQxNTI1MjIzCiAgICBkaWcgMwogICAgYXBwX2dsb2JhbF9wdXQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI2CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA2CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgNDAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwNwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWNfMyAvLyAweDUyM2E0ZDRlNDcyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA4CiAgICAvLyBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNQogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTEwCiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKToKICAgIGR1cAogICAgcHVzaGludCA1MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTExCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDQgLy8gMHg1MjNhNTA1OTQ0MjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMgogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNQogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE0CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpOgogICAgZHVwCiAgICBwdXNoaW50IDYwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTUKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyA1IC8vIDB4NTIzYTU0NTI1MzIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTYKICAgIC8vIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNQogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE4CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNzAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTkKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjXzIgLy8gMHg1MjNhNDE1NTU0MjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMAogICAgLy8gc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjUKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDgwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5vYnNlcnZlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyA2IC8vIDB4NTIzYTRkNGY0MzIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjQKICAgIC8vIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfcmV2b2tlX3JvbGVbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3Jldm9rZV9yb2xlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0NwogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjQ4CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0OQogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjcKICAgIC8vIGFzc2VydCByb2xlX2lkICE9IFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwgZXJyLklOVkFMSURfUk9MRQogICAgZHVwCiAgICBpbnRjXzMgLy8gMjAKICAgICE9CiAgICBhc3NlcnQgLy8gSW52YWxpZCByb2xlIGlkZW50aWZpZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjgKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIHB1c2hpbnQgNDAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyOQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmFjY291bnRfbWFuYWdlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlY18zIC8vIDB4NTIzYTRkNGU0NzIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzAKICAgIC8vIGRlbCBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjUxCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMyCiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKToKICAgIGR1cAogICAgcHVzaGludCA1MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMzCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgNCAvLyAweDUyM2E1MDU5NDQyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM0CiAgICAvLyBkZWwgc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTAKICAgIC8vIHNlbGYuX2RlbGV0ZV9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcykKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM2CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpOgogICAgZHVwCiAgICBwdXNoaW50IDYwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzcKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDUgLy8gMHg1MjNhNTQ1MjUzMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzOAogICAgLy8gZGVsIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTAKICAgIC8vIHNlbGYuX2RlbGV0ZV9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcykKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQwCiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNzAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlY18yIC8vIDB4NTIzYTQxNTU1NDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDIKICAgIC8vIGRlbCBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTAKICAgIC8vIHNlbGYuX2RlbGV0ZV9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcykKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ0CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKToKICAgIGR1cAogICAgcHVzaGludCA4MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDUKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5vYnNlcnZlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyA2IC8vIDB4NTIzYTRkNGY0MzIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDYKICAgIC8vIGRlbCBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19jb250cmFjdF9zdXNwZW5zaW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19jb250cmFjdF9zdXNwZW5zaW9uOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kICAjIFRPRE86IFVwZGF0ZSBzcGVjcyBhbmQgYWRkIHRlc3QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzEgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzcKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjXzIgLy8gMHg1MjNhNDE1NTU0MjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNjkKICAgIC8vIHNlbGYuYXNzZXRfc3VzcGVuZGVkID0gc3VzcGVuZGVkCiAgICBieXRlYyA4IC8vICJhc3NldF9zdXNwZW5kZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3MAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjUzCiAgICAvLyBAYXJjNC5hYmltZXRob2QgICMgVE9ETzogVXBkYXRlIHNwZWNzIGFuZCBhZGQgdGVzdAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X2FycmFuZ2VyW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgzCiAgICAvLyByZXR1cm4gc2VsZi5hcnJhbmdlci52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzEgLy8gMHg1MjNhNDE1MjUyMjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcnJhbmdlciBleGlzdHMKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNzIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXNbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9hZGRyZXNzX3JvbGVzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDMKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBhZGRyZXNzKSwKICAgIGJ5dGVjXzMgLy8gMHg1MjNhNGQ0ZTQ3MjMKICAgIGRpZyAxCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwNAogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5wcmltYXJ5X2RlYWxlciwgYWRkcmVzcyksCiAgICBieXRlYyA0IC8vIDB4NTIzYTUwNTk0NDIzCiAgICBkaWcgMgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDUKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYudHJ1c3RlZSwgYWRkcmVzcyksCiAgICBieXRlYyA1IC8vIDB4NTIzYTU0NTI1MzIzCiAgICBkaWcgMwogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDYKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYXV0aG9yaXR5LCBhZGRyZXNzKSwKICAgIGJ5dGVjXzIgLy8gMHg1MjNhNDE1NTU0MjMKICAgIGRpZyA0CiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwNwogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5vYnNlcnZlciwgYWRkcmVzcyksCiAgICBieXRlYyA2IC8vIDB4NTIzYTRkNGY0MzIzCiAgICB1bmNvdmVyIDUKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg1CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHB1c2hieXRlcyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciA2CiAgICBzZXRiaXQKICAgIGludGNfMCAvLyAxCiAgICB1bmNvdmVyIDUKICAgIHNldGJpdAogICAgcHVzaGludCAyCiAgICB1bmNvdmVyIDQKICAgIHNldGJpdAogICAgcHVzaGludCAzCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgcHVzaGludCA0CiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOAogICAgLy8gcm9sZSA9IHJvbGVfaWQuYXNfdWludDY0KCkKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjkKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGUpCiAgICBkdXAKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzMxCiAgICAvLyBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKToKICAgIGludGNfMyAvLyAyMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMzNQogICAgLy8gY2FzZSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludHMgNDAgNTAgNjAgNzAgODAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzAtMzYxCiAgICAvLyBtYXRjaCByb2xlOgogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgLy8gICAgICAgICByZXR1cm4gdHlwLlJvbGVWYWxpZGl0eSgKICAgIC8vICAgICAgICAgICAgIHJvbGVfdmFsaWRpdHlfc3RhcnQ9VUludDY0KDApLCByb2xlX3ZhbGlkaXR5X2VuZD1VSW50NjQoMCkKICAgIC8vICAgICAgICAgKQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5hdXRob3JpdHksIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5vYnNlcnZlciwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5vYnNlcnZlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBfOgogICAgLy8gICAgICAgICBvcC5lcnIoZXJyLklOVkFMSURfUk9MRSkKICAgIHVuY292ZXIgNgogICAgbWF0Y2ggcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8wQDIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8xQDMgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8yQDQgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8zQDUgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV80QDYgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV81QDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNjEKICAgIC8vIG9wLmVycihlcnIuSU5WQUxJRF9ST0xFKQogICAgZXJyIC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzVANzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTcKICAgIC8vIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgNiAvLyAweDUyM2E0ZDRmNDMyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM1Ni0zNTgKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLm9ic2VydmVyLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTkKICAgIC8vIHJldHVybiBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV80QDY6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzUyCiAgICAvLyBzZWxmLmF1dGhvcml0eSwgcm9sZV9hZGRyZXNzCiAgICBieXRlY18yIC8vIDB4NTIzYTQxNTU1NDIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzUxLTM1MwogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTQKICAgIC8vIHJldHVybiBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzNANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNDcKICAgIC8vIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyA1IC8vIDB4NTIzYTU0NTI1MzIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzQ2LTM0OAogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzQ5CiAgICAvLyByZXR1cm4gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMkA0OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM0MgogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyA0IC8vIDB4NTIzYTUwNTk0NDIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzQxLTM0MwogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM0NAogICAgLy8gcmV0dXJuIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8xQDM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzM3CiAgICAvLyBzZWxmLmFjY291bnRfbWFuYWdlciwgcm9sZV9hZGRyZXNzCiAgICBieXRlY18zIC8vIDB4NTIzYTRkNGU0NzIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzM2LTMzOAogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzkKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzBAMjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzItMzM0CiAgICAvLyByZXR1cm4gdHlwLlJvbGVWYWxpZGl0eSgKICAgIC8vICAgICByb2xlX3ZhbGlkaXR5X3N0YXJ0PVVJbnQ2NCgwKSwgcm9sZV92YWxpZGl0eV9lbmQ9VUludDY0KDApCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fcm9sZV9pc19hY3RpdmUocm9sZV9tYXA6IGJ5dGVzLCByb2xlX2FkZHJlc3M6IGJ5dGVzKSAtPiB1aW50NjQ6Cl9yb2xlX2lzX2FjdGl2ZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NwogICAgLy8gZGVmIF9yb2xlX2lzX2FjdGl2ZShzZWxmLCByb2xlX21hcDogdHlwLlJiYWNSb2xlLCByb2xlX2FkZHJlc3M6IEFjY291bnQpIC0+IGJvb2w6CiAgICBwcm90byAyIDEKICAgIHB1c2hieXRlcyAiIgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU4LTYyCiAgICAvLyByZXR1cm4gc2VsZi5faGFzX3JvbGUocm9sZV9tYXAsIHJvbGVfYWRkcmVzcykgYW5kICgKICAgIC8vICAgICByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICkKICAgIGJ6IF9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIEJveE1hcCBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYwCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MAogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgPD0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYxCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIEJveE1hcCBlbnRyeSBleGlzdHMKICAgIHB1c2hpbnQgOAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2MC02MQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAwCiAgICA+PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5LTYxCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0CiAgICBpbnRjXzAgLy8gMQoKX3JvbGVfaXNfYWN0aXZlX2Jvb2xfbWVyZ2VANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OC02MgogICAgLy8gcmV0dXJuIHNlbGYuX2hhc19yb2xlKHJvbGVfbWFwLCByb2xlX2FkZHJlc3MpIGFuZCAoCiAgICAvLyAgICAgcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICAvLyApCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANDoKICAgIGludGNfMSAvLyAwCiAgICBiIF9yb2xlX2lzX2FjdGl2ZV9ib29sX21lcmdlQDUKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpIC0+IHZvaWQ6Cl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjY1CiAgICAvLyBhc3NlcnQgc2VsZi5faXNfYXJyYW5nZXIoVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1MgogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyA9PSBzZWxmLmFycmFuZ2VyLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMSAvLyAweDUyM2E0MTUyNTIyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgPT0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2NQogICAgLy8gYXNzZXJ0IHNlbGYuX2lzX2FycmFuZ2VyKFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpIC0+IHZvaWQ6Cl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4MwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFzc2V0X2RlZmF1bHRlZCwgZXJyLkRFRkFVTFRFRAogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDkgLy8gImFzc2V0X2RlZmF1bHRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9kZWZhdWx0ZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRGVmYXVsdGVkCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZDogdWludDY0KSAtPiB2b2lkOgpfYXNzZXJ0X3ZhbGlkX3JvbGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODgKICAgIC8vIGRlZiBfYXNzZXJ0X3ZhbGlkX3JvbGUoc2VsZiwgcm9sZV9pZDogVUludDY0KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkwCiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICBpbnRjXzMgLy8gMjAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkxCiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgcHVzaGludCAyNQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTIKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICBwdXNoaW50IDQwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MwogICAgLy8gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgcHVzaGludCA1MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTQKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgcHVzaGludCA2MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTUKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICBwdXNoaW50IDcwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NgogICAgLy8gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgcHVzaGludCA4MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfZmFsc2VAOAoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3OgogICAgaW50Y18wIC8vIDEKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX21lcmdlQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgcmV0c3ViCgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9mYWxzZUA4OgogICAgaW50Y18xIC8vIDAKICAgIGIgX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfbWVyZ2VAOQo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="}, "sourceInfo": {"approval": {"pcOffsetMethod": "none", "sourceInfo": [{"pc": [934], "errorMessage": "Defaulted"}, {"pc": [359, 383, 407, 430, 454, 509, 537, 559, 580, 602, 778, 795, 810, 825, 839], "errorMessage": "Invalid account role address"}, {"pc": [494, 768, 995], "errorMessage": "Invalid role identifier"}, {"pc": [624, 926], "errorMessage": "Not authorized"}, {"pc": [886, 901], "errorMessage": "check BoxMap entry exists"}, {"pc": [641, 924], "errorMessage": "check self.arranger exists"}, {"pc": [932], "errorMessage": "check self.asset_defaulted exists"}, {"pc": [615], "errorMessage": "invalid number of bytes for arc4.bool"}, {"pc": [244, 267, 301, 478, 655, 738], "errorMessage": "invalid number of bytes for arc4.static_array"}, {"pc": [291, 468, 728], "errorMessage": "invalid number of bytes for arc4.uint8"}, {"pc": [312], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.RoleValidity"}]}, "clear": {"pcOffsetMethod": "none", "sourceInfo": []}}, "templateVariables": {}}""" APP_SPEC = algokit_utils.Arc56Contract.from_json(_APP_SPEC_JSON) def _parse_abi_args(args: object | None = None) -> list[object] | None: From 7f8f30fc4414556e624a894fc01d9eb81569c7e2 Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 14:32:38 +0100 Subject: [PATCH 159/244] chore: ignore mdbook-mermaid artifacts --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 5734bcbd..238c421e 100644 --- a/.gitignore +++ b/.gitignore @@ -95,3 +95,5 @@ debug_traces/ # mdBook book +mermaid-init.js +mermaid.min.js From 13a90f6c4dbd98bf329a9a66d368a4a7dbd56635 Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 14:32:52 +0100 Subject: [PATCH 160/244] chore: update role keys prefix --- smart_contracts/constants.py | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/smart_contracts/constants.py b/smart_contracts/constants.py index 2359e388..e943c79c 100644 --- a/smart_contracts/constants.py +++ b/smart_contracts/constants.py @@ -23,14 +23,18 @@ ################################################################################ # Role Keys Prefix ################################################################################ -PREFIX_ID_ARRANGER: Final[bytes] = b"R#Arranger#" -PREFIX_ID_OP_DAEMON: Final[bytes] = b"R#OpDaemon#" -PREFIX_ID_ACCOUNT_MANAGER: Final[bytes] = b"R#AccountManager#" -PREFIX_ID_ACCOUNT: Final[bytes] = b"R#Account#" -PREFIX_ID_PRIMARY_DEALER: Final[bytes] = b"R#PrimaryDealer#" -PREFIX_ID_TRUSTEE: Final[bytes] = b"R#Trustee#" -PREFIX_ID_AUTHORITY: Final[bytes] = b"R#Authority#" -PREFIX_ID_OBSERVER: Final[bytes] = b"R#Observer#" +PREFIX_ID_ARRANGER: Final[bytes] = b"R:ARR#" +PREFIX_ID_OP_DAEMON: Final[bytes] = b"R:OPD#" +PREFIX_ID_ACCOUNT_MANAGER: Final[bytes] = b"R:MNG#" +PREFIX_ID_PRIMARY_DEALER: Final[bytes] = b"R:PYD#" +PREFIX_ID_TRUSTEE: Final[bytes] = b"R:TRS#" +PREFIX_ID_AUTHORITY: Final[bytes] = b"R:AUT#" +PREFIX_ID_OBSERVER: Final[bytes] = b"R:MOC#" + +################################################################################ +# Accounting Prefix +################################################################################ +PREFIX_ID_ACCOUNT: Final[bytes] = b"A#" ################################################################################ # ACTUS Schedule Prefix From abec37ce65c6af21568f3067f67a0f0f33e817dd Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 14:36:00 +0100 Subject: [PATCH 161/244] ci: add mdbook-mermaid --- .github/actions/docs-ci/action.yaml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/actions/docs-ci/action.yaml b/.github/actions/docs-ci/action.yaml index 40d48544..72e5ffc8 100644 --- a/.github/actions/docs-ci/action.yaml +++ b/.github/actions/docs-ci/action.yaml @@ -8,6 +8,12 @@ runs: with: mdbook-version: '0.5.2' + - name: Install mdbook-mermaid + shell: bash + run: | + cargo install mdbook-mermaid --version 0.17.0 --locked + mdbook-mermaid install + - name: Test docs shell: bash run: mdbook test From 4814498b7bdf5f842fc6b600918a6b4c85430c96 Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 14:52:22 +0100 Subject: [PATCH 162/244] fix: typos --- docs/interfaces/rbac/overview.md | 2 +- docs/specs/accounting/account.md | 2 +- .../specs/contract/actus-compliance-profile.md | 8 ++++---- docs/specs/contract/attributes.md | 4 ++-- .../execution/payment-agent/payment-agent.md | 2 +- docs/specs/execution/transfer-agent/dvp.md | 2 +- .../execution/transfer-agent/transfer-agent.md | 2 +- docs/specs/rbac/roles.md | 18 +++++++++--------- 8 files changed, 20 insertions(+), 20 deletions(-) diff --git a/docs/interfaces/rbac/overview.md b/docs/interfaces/rbac/overview.md index 26406aa3..be4fe900 100644 --- a/docs/interfaces/rbac/overview.md +++ b/docs/interfaces/rbac/overview.md @@ -2,7 +2,7 @@ The RBAC interface manages privileged roles, suspension state, and application control. -Only the Arranger may call RBAC methods. +Only the Arranger may call RBAC methods, unless otherwise specified. ## `contract_update` diff --git a/docs/specs/accounting/account.md b/docs/specs/accounting/account.md index abcc0950..a0051f1e 100644 --- a/docs/specs/accounting/account.md +++ b/docs/specs/accounting/account.md @@ -13,7 +13,7 @@ The Payment Address **MAY** be different from the Holding Address. The Account is uniquely identified by the account key of the form: -`[A#||]` +`[A#||]` Where || denotes concatenation. diff --git a/docs/specs/contract/actus-compliance-profile.md b/docs/specs/contract/actus-compliance-profile.md index 5cb67f3c..f15c911c 100644 --- a/docs/specs/contract/actus-compliance-profile.md +++ b/docs/specs/contract/actus-compliance-profile.md @@ -7,8 +7,8 @@ > The ACTUS taxonomy reduces the majority of all financial contracts to a defined > set of 32 generalized cash flow exchange patterns, called contract types. -The D-ASA **MUST** be to classified with an ACTUS *contract type* \\( [CT] \\) -(`uint8`) (see the [ACTUS taxonomy](https://github.com/actusfrf/actus-dictionary/blob/master/actus-dictionary-taxonomy.json)). +The D-ASA **MUST** be classified with an ACTUS *contract type* \\( [CT] \\) (see +the [ACTUS taxonomy](https://github.com/actusfrf/actus-dictionary/blob/master/actus-dictionary-taxonomy.json)). The *contract type* **MUST** have the following properties: @@ -30,8 +30,8 @@ The current kernel supports the following ACTUS contract family identifiers: | ID | Contract Type | Description | Rate | Use case | |:---:|:-------------:|:---------------------------------------------------------------------------------------------------------------------------------------|:----------------------|:---------------------------------------------------------------| | `0` | `PAM` | Principal payment fully at \\( [IED] \\) and repaid at \\( [MD] \\). | Fix or variable rates | All kind of bonds, term deposits, bullet loans, mograges, etc. | -| `1` | `ANN` | Principal payment fully at \\( [IED] \\) and repaid periodically in constants amounts till \\( [MD] \\). | Fix or variable rates | Classical level payment morgages, leasing contracts, etc. | -| `2` | `NAM` | As `ANN`, when resetting reate total amount (principal + interest) stay constant. \\( [MD] \\) shifts. | Variable only | Adjustable rate morgages | +| `1` | `ANN` | Principal payment fully at \\( [IED] \\) and repaid periodically in constants amounts till \\( [MD] \\). | Fix or variable rates | Classical level payment mortgages, leasing contracts, etc. | +| `2` | `NAM` | As `ANN`, when resetting reate total amount (principal + interest) stay constant. \\( [MD] \\) shifts. | Variable only | Adjustable rate mortgages | | `3` | `LAM` | Principal payment fully at \\( [IED] \\) and repaid periodically in constants amounts till \\( [MD] \\), interest reduced accordingly. | Fix or variable | Amortizing loans | | `4` | `LAX` | Flexible version of `LAM`. | Fix or variable | Teaser rate loans | | `5` | `CLM` | Loans rolled over as long as they are not called. Once called, it has to be paid back after noticed period. | Fix or variable | Loans with call options | diff --git a/docs/specs/contract/attributes.md b/docs/specs/contract/attributes.md index 3339eb2a..ebd9441e 100644 --- a/docs/specs/contract/attributes.md +++ b/docs/specs/contract/attributes.md @@ -120,7 +120,7 @@ the **OPTIONAL** `set_early_repayment_option` method. > Debt instrument with a defined maturity date may terminate earlier if the full > principal redemption happens earlier than maturity. -An early repayment option could have different *prepayment effects* \\(v[PPEF]v\\): +An early repayment option could have different *prepayment effects* \\( [PPEF] \\): - It **MAY** repay the *principal* partially or totally before the *maturity date*; @@ -184,7 +184,7 @@ The D-ASA **MAY** define a *grace period* \\( [GRP] \\). > period. If payment happens after the delinquency period, then the counterparty > is in technical default. -The D-ASA **MAY** define a *delinquency period* \\( [DQP] \\)). +The D-ASA **MAY** define a *delinquency period* \\( [DQP] \\). ### Default diff --git a/docs/specs/execution/payment-agent/payment-agent.md b/docs/specs/execution/payment-agent/payment-agent.md index ee834796..8f04fc4d 100644 --- a/docs/specs/execution/payment-agent/payment-agent.md +++ b/docs/specs/execution/payment-agent/payment-agent.md @@ -59,7 +59,7 @@ restriction beyond the contract and account checks. ## Payment ordering > [!IMPORTANT] -> Algornad block proposers could order transactions in a block. In a *healthy network*, +> Algorand block proposers could order transactions in a block. In a *healthy network*, > block proposers are selected randomly by the Algorand consensus based on a Verifiable > Random Function (VRF). Therefore, the order of payments in a block is random and > unbiased, with no systematic advantage or precedence of a payee with respect to diff --git a/docs/specs/execution/transfer-agent/dvp.md b/docs/specs/execution/transfer-agent/dvp.md index a9ae7da0..f6681bf5 100644 --- a/docs/specs/execution/transfer-agent/dvp.md +++ b/docs/specs/execution/transfer-agent/dvp.md @@ -12,7 +12,7 @@ basis, meaning that either all transactions in the group are executed or none of them are. Therefore, D-ASA DvP ensures **no counterparty risk**, as the transfer of D-ASA -nits and the corresponding payment occur simultaneously. If either the transfer +units and the corresponding payment occur simultaneously. If either the transfer or the payment fails, the entire transaction group is rejected, preventing any party from being left in a vulnerable position. diff --git a/docs/specs/execution/transfer-agent/transfer-agent.md b/docs/specs/execution/transfer-agent/transfer-agent.md index e97c6a4a..16037810 100644 --- a/docs/specs/execution/transfer-agent/transfer-agent.md +++ b/docs/specs/execution/transfer-agent/transfer-agent.md @@ -30,5 +30,5 @@ nominal value or per-unit coupon status. The current reference implementation requires the holder to call `transfer` directly. -The method **MUST** reject calls from any other address. Transfers are therefor +The method **MUST** reject calls from any other address. Transfers are therefore direct holder actions, not transfer-agent proxy calls. diff --git a/docs/specs/rbac/roles.md b/docs/specs/rbac/roles.md index d1405a1e..4638733a 100644 --- a/docs/specs/rbac/roles.md +++ b/docs/specs/rbac/roles.md @@ -16,15 +16,15 @@ Where || denotes concatenation. The current reference implementation uses the following role set: -| Key | Role | Scope | -|:-----:|:----------------|:------------------------------------------------------------------------------| -| `ARR` | Arranger | Owns contract creation, configuration, schedule upload, and upgrade authority | -| `OPD` | Op Daemon | Optional automation address for payment execution workflows | -| `MNG` | Account Manager | Opens holder accounts | -| `PYD` | Primary Dealer | Allocates units during primary distribution | -| `TRS` | Trustee | Reserved for workout/default extensions; no dedicated ABI endpoint in v0.5 | -| `AUT` | Authority | Suspends the asset or individual accounts | -| `MOC` | Observer | Applies rate-reset events that depend on observed data | +| Key | ID | Role | Scope | +|:-----:|:----:|:----------------|:------------------------------------------------------------------------------| +| `ARR` | `20` | Arranger | Owns contract creation, configuration, schedule upload, and upgrade authority | +| `OPD` | `25` | Op Daemon | Optional automation address for payment execution workflows | +| `MNG` | `40` | Account Manager | Opens holder accounts | +| `PYD` | `50` | Primary Dealer | Allocates units during primary distribution | +| `TRS` | `60` | Trustee | Reserved for workout/default extensions; no dedicated ABI endpoint in v0.5 | +| `AUT` | `70` | Authority | Suspends the asset or individual accounts | +| `MOC` | `80` | Observer | Applies rate-reset events that depend on observed data | > [!TIP] > The Arranger with Algorand Address `XYZ` is identified as `R:ARR#XYZ`. From 9cfdcc55c41fd0fb49819470d14a3480e26d72b8 Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 15:02:04 +0100 Subject: [PATCH 163/244] fix: more typos --- docs/specs/contract/actus-compliance-profile.md | 4 ++-- docs/specs/contract/attributes.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/specs/contract/actus-compliance-profile.md b/docs/specs/contract/actus-compliance-profile.md index f15c911c..d15b3f6e 100644 --- a/docs/specs/contract/actus-compliance-profile.md +++ b/docs/specs/contract/actus-compliance-profile.md @@ -29,9 +29,9 @@ The current kernel supports the following ACTUS contract family identifiers: | ID | Contract Type | Description | Rate | Use case | |:---:|:-------------:|:---------------------------------------------------------------------------------------------------------------------------------------|:----------------------|:---------------------------------------------------------------| -| `0` | `PAM` | Principal payment fully at \\( [IED] \\) and repaid at \\( [MD] \\). | Fix or variable rates | All kind of bonds, term deposits, bullet loans, mograges, etc. | +| `0` | `PAM` | Principal payment fully at \\( [IED] \\) and repaid at \\( [MD] \\). | Fix or variable rates | All kind of bonds, term deposits, bullet loans, mortgages, etc. | | `1` | `ANN` | Principal payment fully at \\( [IED] \\) and repaid periodically in constants amounts till \\( [MD] \\). | Fix or variable rates | Classical level payment mortgages, leasing contracts, etc. | -| `2` | `NAM` | As `ANN`, when resetting reate total amount (principal + interest) stay constant. \\( [MD] \\) shifts. | Variable only | Adjustable rate mortgages | +| `2` | `NAM` | As `ANN`, when resetting rate total amount (principal + interest) stays constant. \\( [MD] \\) shifts. | Variable only | Adjustable rate mortgages | | `3` | `LAM` | Principal payment fully at \\( [IED] \\) and repaid periodically in constants amounts till \\( [MD] \\), interest reduced accordingly. | Fix or variable | Amortizing loans | | `4` | `LAX` | Flexible version of `LAM`. | Fix or variable | Teaser rate loans | | `5` | `CLM` | Loans rolled over as long as they are not called. Once called, it has to be paid back after noticed period. | Fix or variable | Loans with call options | diff --git a/docs/specs/contract/attributes.md b/docs/specs/contract/attributes.md index ebd9441e..753f259e 100644 --- a/docs/specs/contract/attributes.md +++ b/docs/specs/contract/attributes.md @@ -99,7 +99,7 @@ The D-ASA **MUST** have an *initial exchange date* \\( [IED] \\) (issuance). The D-ASA **MAY** have a *maturity date* \\( [MD] \\). -The *maturity date* **MAY** be updated in case or pre-payment options. +The *maturity date* **MAY** be updated in case of pre-payment options. ## Prepayment Options From c2ef2ca8cb56e8f9a932637c6697a5d9178228b6 Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 15:02:09 +0100 Subject: [PATCH 164/244] chore: nit --- .github/actions/docs-ci/action.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/docs-ci/action.yaml b/.github/actions/docs-ci/action.yaml index 72e5ffc8..6711ee0c 100644 --- a/.github/actions/docs-ci/action.yaml +++ b/.github/actions/docs-ci/action.yaml @@ -12,7 +12,7 @@ runs: shell: bash run: | cargo install mdbook-mermaid --version 0.17.0 --locked - mdbook-mermaid install + mdbook-mermaid install . - name: Test docs shell: bash From 0914db877d002cd063d3aaf2bc0f4f68ccce950d Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 15:14:42 +0100 Subject: [PATCH 165/244] chore: remove unused errors --- smart_contracts/errors.py | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/smart_contracts/errors.py b/smart_contracts/errors.py index aa00754f..9731d743 100644 --- a/smart_contracts/errors.py +++ b/smart_contracts/errors.py @@ -13,7 +13,7 @@ NOT_ENOUGH_FUNDS = "Not enough funds for the payment" NO_UNITS = "No D-ASA units" -# Asset Config +# Contract Config NOT_CONFIGURED = "D-ASA not configured" TERMS_NOT_CONFIGURED = "D-ASA terms not configured" ALREADY_CONFIGURED = "D-ASA already configured" @@ -40,11 +40,7 @@ # Cashflows NO_DUE_CASHFLOW = "No due cashflow to pay" -# Set Secondary Time Events -INVALID_SECONDARY_OPENING_DATE = "Invalid secondary market opening date" -INVALID_SECONDARY_CLOSURE_DATE = "Invalid secondary market closure date" - -# Open and Close Account +# RBAC INVALID_ROLE = "Invalid role identifier" INVALID_ROLE_ADDRESS = "Invalid account role address" @@ -54,11 +50,8 @@ PRIMARY_DISTRIBUTION_INCOMPLETE = "Primary distribution is not complete" PRIMARY_DISTRIBUTION_CLOSED = "Primary distribution is closed" -# Asset Transfer +# Transfer SELF_TRANSFER = "Sender and receiver must be different" NULL_TRANSFER = "Transfer units must be greater than zero" OVER_TRANSFER = "Insufficient sender units to transfer" CLOSED_TRANSFER = "Transfer is closed" - -# Get Account Units Current Value -NO_PRIMARY_DISTRIBUTION = "Primary distribution not yet executed" From 5fd69b542703124efc5ee2d3ce9963ced4157a85 Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 15:37:25 +0100 Subject: [PATCH 166/244] chore: move canonical artifacts in sdk --- .algokit.toml | 5 +- .github/workflows/d-asa-ci.yaml | 1 + README.md | 2 +- .../reference-implementation.md | 4 +- smart_contracts/__main__.py | 83 +++++++++++++++---- smart_contracts/d_asa/deploy_config.py | 28 +++---- src/__init__.py | 2 + .../d_asa => src/artifacts}/DASA.arc56.json | 0 src/artifacts/__init__.py | 1 + .../d_asa => src/artifacts}/dasa_client.py | 0 tests/conftest.py | 2 +- tests/conftest_helpers.py | 2 +- tests/pam/conftest.py | 2 +- tests/pam/fcb/test_pam_fixed_coupon_bond.py | 4 +- tests/pam/pam_test_support.py | 4 +- tests/pam/zcb/test_pam_zero_coupon_bond.py | 4 +- tests/utils.py | 21 +---- 17 files changed, 100 insertions(+), 65 deletions(-) rename {smart_contracts/artifacts/d_asa => src/artifacts}/DASA.arc56.json (100%) create mode 100644 src/artifacts/__init__.py rename {smart_contracts/artifacts/d_asa => src/artifacts}/dasa_client.py (100%) diff --git a/.algokit.toml b/.algokit.toml index f592ea60..a16aed15 100644 --- a/.algokit.toml +++ b/.algokit.toml @@ -48,5 +48,6 @@ audit-teal = { commands = [ # Commands intented for CI only, prefixed with `ci-` by convention ci-teal-diff = { commands = [ 'git add -N ./smart_contracts/artifacts', - 'git diff --exit-code --minimal ./smart_contracts/artifacts', -], description = 'Check TEAL files for differences' } + 'git add -N ./src/artifacts', + 'git diff --exit-code --minimal ./smart_contracts/artifacts ./src/artifacts', +], description = 'Check generated artifacts for differences' } diff --git a/.github/workflows/d-asa-ci.yaml b/.github/workflows/d-asa-ci.yaml index af99b581..aeb3e34b 100644 --- a/.github/workflows/d-asa-ci.yaml +++ b/.github/workflows/d-asa-ci.yaml @@ -91,6 +91,7 @@ jobs: filters: | pam: - 'smart_contracts/artifacts/d_asa/**' + - 'src/artifacts/**' - 'tests/conftest.py' - 'tests/conftest_helpers.py' - 'tests/pam/pam_test_support.py' diff --git a/README.md b/README.md index 76bdbee7..550d05d5 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ ACTUS contract -> AVM normalization -> AVM execution The canonical ABI artifact is: -- `smart_contracts/artifacts/d_asa/DASA.arc56.json` +- `src/artifacts/DASA.arc56.json` ## Local Setup and Tests diff --git a/docs/implementation/reference-implementation.md b/docs/implementation/reference-implementation.md index cb918f2c..deb22a8e 100644 --- a/docs/implementation/reference-implementation.md +++ b/docs/implementation/reference-implementation.md @@ -19,8 +19,8 @@ supports the kernel contract families `PAM`, `ANN`, `NAM`, `LAM`, `LAX`, and `CL The canonical artifacts are: -- `smart_contracts/artifacts/d_asa/DASA.arc56.json` -- `smart_contracts/artifacts/d_asa/dasa_client.py` +- `src/artifacts/DASA.arc56.json` +- `src/artifacts/dasa_client.py` The deployment helpers in `smart_contracts/d_asa/deploy_config.py` provide code-accurate demo normalization flows for: diff --git a/smart_contracts/__main__.py b/smart_contracts/__main__.py index 0ad0ca3d..dffd24c7 100644 --- a/smart_contracts/__main__.py +++ b/smart_contracts/__main__.py @@ -22,6 +22,11 @@ # Determine the root path based on this file's location. root_path = Path(__file__).parent +src_artifact_path = root_path.parent / "src" / "artifacts" +canonical_src_contract_name = "d_asa" +canonical_src_app_spec_name = "DASA.arc56.json" +canonical_src_client_name = "dasa_client.py" +generated_artifacts_init = '"""Generated client artifacts."""\n' # ----------------------- Contract Configuration ----------------------- # @@ -74,8 +79,12 @@ def has_contract_file(directory: Path) -> bool: deployment_extension = "py" -def _get_output_path(output_dir: Path, deployment_extension: str) -> Path: +def _get_output_path( + output_dir: Path, contract_name: str, deployment_extension: str +) -> Path: """Constructs the output path for the generated client file.""" + if contract_name == canonical_src_contract_name: + return src_artifact_path / canonical_src_client_name return output_dir / Path( "{contract_name}" + ("_client" if deployment_extension == "py" else "Client") @@ -83,7 +92,52 @@ def _get_output_path(output_dir: Path, deployment_extension: str) -> Path: ) -def build(output_dir: Path, contract_path: Path) -> Path: +def _get_app_spec_path(output_dir: Path, contract_name: str) -> Path | None: + """Gets the canonical ARC-56 path for a contract if it exists.""" + if contract_name == canonical_src_contract_name: + app_spec_path = src_artifact_path / canonical_src_app_spec_name + return app_spec_path if app_spec_path.exists() else None + + return next( + ( + file + for file in output_dir.iterdir() + if file.is_file() and file.suffixes == [".arc56", ".json"] + ), + None, + ) + + +def _reset_src_artifacts(contract_name: str) -> None: + """Clears and recreates the canonical generated artifact package.""" + if contract_name != canonical_src_contract_name: + return + + if src_artifact_path.exists(): + rmtree(src_artifact_path) + src_artifact_path.mkdir(parents=True, exist_ok=True) + (src_artifact_path / "__init__.py").write_text( + generated_artifacts_init, encoding="utf-8" + ) + + +def _sync_src_artifacts(output_dir: Path, contract_name: str) -> Path | None: + """Moves the canonical D-ASA artifacts into src/artifacts.""" + if contract_name != canonical_src_contract_name: + return None + + src_artifact_path.mkdir(parents=True, exist_ok=True) + + app_spec_path = output_dir / canonical_src_app_spec_name + if not app_spec_path.exists(): + raise Exception("Could not build contract, DASA.arc56.json file not found") + + canonical_app_spec_path = src_artifact_path / canonical_src_app_spec_name + app_spec_path.replace(canonical_app_spec_path) + return canonical_app_spec_path + + +def build(output_dir: Path, contract_name: str, contract_path: Path) -> Path: """ Builds the contract by exporting (compiling) its source and generating a client. If the output directory already exists, it is cleared. @@ -92,6 +146,7 @@ def build(output_dir: Path, contract_path: Path) -> Path: if output_dir.exists(): rmtree(output_dir) output_dir.mkdir(exist_ok=True, parents=True) + _reset_src_artifacts(contract_name) logger.info(f"Exporting {contract_path} to {output_dir}") build_result = subprocess.run( @@ -129,6 +184,10 @@ def build(output_dir: Path, contract_path: Path) -> Path: for file_name in app_spec_file_names: client_file = file_name print(file_name) + client_output_path = _get_output_path( + output_dir, contract_name, deployment_extension + ) + client_output_path.parent.mkdir(exist_ok=True, parents=True) generate_result = subprocess.run( [ "algokit", @@ -136,7 +195,7 @@ def build(output_dir: Path, contract_path: Path) -> Path: "client", str(output_dir), "--output", - str(_get_output_path(output_dir, deployment_extension)), + str(client_output_path), ], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, @@ -155,8 +214,9 @@ def build(output_dir: Path, contract_path: Path) -> Path: raise Exception( f"Could not generate typed client:\n{generate_result.stdout}" ) + canonical_app_spec_path = _sync_src_artifacts(output_dir, contract_name) if client_file: - return output_dir / client_file + return canonical_app_spec_path or output_dir / client_file return output_dir @@ -177,19 +237,12 @@ def main(action: str, contract_name: str | None = None) -> None: case "build": for contract in filtered_contracts: logger.info(f"Building app at {contract.path}") - build(artifact_path / contract.name, contract.path) + build(artifact_path / contract.name, contract.name, contract.path) case "deploy": for contract in filtered_contracts: output_dir = artifact_path / contract.name - app_spec_file_name = next( - ( - file.name - for file in output_dir.iterdir() - if file.is_file() and file.suffixes == [".arc56", ".json"] - ), - None, - ) - if app_spec_file_name is None: + app_spec_path = _get_app_spec_path(output_dir, contract.name) + if app_spec_path is None: raise Exception("Could not deploy app, .arc56.json file not found") if contract.deploy: logger.info(f"Deploying app {contract.name}") @@ -197,7 +250,7 @@ def main(action: str, contract_name: str | None = None) -> None: case "all": for contract in filtered_contracts: logger.info(f"Building app at {contract.path}") - build(artifact_path / contract.name, contract.path) + build(artifact_path / contract.name, contract.name, contract.path) if contract.deploy: logger.info(f"Deploying {contract.name}") contract.deploy() diff --git a/smart_contracts/d_asa/deploy_config.py b/smart_contracts/d_asa/deploy_config.py index cfc97545..4ed0d57c 100644 --- a/smart_contracts/d_asa/deploy_config.py +++ b/smart_contracts/d_asa/deploy_config.py @@ -19,26 +19,22 @@ from smart_contracts import constants as cst from smart_contracts import enums -from smart_contracts.artifacts.d_asa.dasa_client import ( +from src import ( + ExecutionScheduleEntry, + NormalizationResult, + normalize_contract_attributes, +) +from src.artifacts.dasa_client import ( ContractConfigArgs, ContractCreateArgs, ContractScheduleArgs, DasaClient, DasaFactory, DasaMethodCallCreateParams, + InitialKernelState, + NormalizedActusTerms, Prospectus, ) -from smart_contracts.artifacts.d_asa.dasa_client import ( - InitialKernelState as ClientInitialKernelState, -) -from smart_contracts.artifacts.d_asa.dasa_client import ( - NormalizedActusTerms as ClientNormalizedActusTerms, -) -from src import ( - ExecutionScheduleEntry, - NormalizationResult, - normalize_contract_attributes, -) from src.contracts import ( make_pam_fixed_coupon_bond_profile, make_pam_zero_coupon_bond, @@ -258,8 +254,8 @@ def build_zero_coupon_bond_demo(context: DemoDeploymentContext) -> DemoInstrumen ) -def _client_terms(result: NormalizationResult) -> ClientNormalizedActusTerms: - return ClientNormalizedActusTerms( +def _client_terms(result: NormalizationResult) -> NormalizedActusTerms: + return NormalizedActusTerms( contract_type=result.terms.contract_type, denomination_asset_id=result.terms.denomination_asset_id, settlement_asset_id=result.terms.denomination_asset_id, @@ -281,8 +277,8 @@ def _client_terms(result: NormalizationResult) -> ClientNormalizedActusTerms: ) -def _client_initial_state(result: NormalizationResult) -> ClientInitialKernelState: - return ClientInitialKernelState( +def _client_initial_state(result: NormalizationResult) -> InitialKernelState: + return InitialKernelState( status_date=result.initial_state.status_date, event_cursor=result.initial_state.event_cursor, outstanding_principal=result.initial_state.outstanding_principal, diff --git a/src/__init__.py b/src/__init__.py index 665ed20d..31e33e1c 100644 --- a/src/__init__.py +++ b/src/__init__.py @@ -1,3 +1,4 @@ +from .artifacts import dasa_client from .errors import ActusNormalizationError, UnsupportedActusFeatureError from .models import ( AccountPosition, @@ -22,5 +23,6 @@ "ObservedCashEventRequest", "ObservedEventRequest", "UnsupportedActusFeatureError", + "dasa_client", "normalize_contract_attributes", ] diff --git a/smart_contracts/artifacts/d_asa/DASA.arc56.json b/src/artifacts/DASA.arc56.json similarity index 100% rename from smart_contracts/artifacts/d_asa/DASA.arc56.json rename to src/artifacts/DASA.arc56.json diff --git a/src/artifacts/__init__.py b/src/artifacts/__init__.py new file mode 100644 index 00000000..33f0e674 --- /dev/null +++ b/src/artifacts/__init__.py @@ -0,0 +1 @@ +"""Generated client artifacts.""" diff --git a/smart_contracts/artifacts/d_asa/dasa_client.py b/src/artifacts/dasa_client.py similarity index 100% rename from smart_contracts/artifacts/d_asa/dasa_client.py rename to src/artifacts/dasa_client.py diff --git a/tests/conftest.py b/tests/conftest.py index a6ffde67..10340402 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -9,7 +9,7 @@ ) from algokit_utils.config import config -from smart_contracts.artifacts.d_asa.dasa_client import ( +from src.artifacts.dasa_client import ( ContractCreateArgs, DasaClient, DasaFactory, diff --git a/tests/conftest_helpers.py b/tests/conftest_helpers.py index 962945cc..4070aca2 100644 --- a/tests/conftest_helpers.py +++ b/tests/conftest_helpers.py @@ -5,7 +5,7 @@ SigningAccount, ) -from smart_contracts.artifacts.d_asa.dasa_client import ( +from src.artifacts.dasa_client import ( RbacAssignRoleArgs, RoleValidity, ) diff --git a/tests/pam/conftest.py b/tests/pam/conftest.py index df7f5b4e..9b83fd89 100644 --- a/tests/pam/conftest.py +++ b/tests/pam/conftest.py @@ -1,7 +1,7 @@ import pytest from algokit_utils import AlgorandClient -from smart_contracts.artifacts.d_asa.dasa_client import ( +from src.artifacts.dasa_client import ( DasaClient, ) from tests import conftest_helpers as helpers diff --git a/tests/pam/fcb/test_pam_fixed_coupon_bond.py b/tests/pam/fcb/test_pam_fixed_coupon_bond.py index de1ae480..6ea8a380 100644 --- a/tests/pam/fcb/test_pam_fixed_coupon_bond.py +++ b/tests/pam/fcb/test_pam_fixed_coupon_bond.py @@ -10,13 +10,13 @@ from smart_contracts import constants as cst from smart_contracts import enums -from smart_contracts.artifacts.d_asa.dasa_client import ( +from src import NormalizationResult, normalize_contract_attributes +from src.artifacts.dasa_client import ( AccountGetPositionArgs, ClaimDueCashflowsArgs, DasaClient, FundDueCashflowsArgs, ) -from src import NormalizationResult, normalize_contract_attributes from src.contracts import make_pam_fixed_coupon_bond_profile from src.registry import CONTRACT_TYPE_IDS, EVENT_TYPE_IDS from src.schedule import Cycle diff --git a/tests/pam/pam_test_support.py b/tests/pam/pam_test_support.py index e07844f2..0baa8a6c 100644 --- a/tests/pam/pam_test_support.py +++ b/tests/pam/pam_test_support.py @@ -16,7 +16,8 @@ from smart_contracts import constants as cst from smart_contracts import errors as err -from smart_contracts.artifacts.d_asa.dasa_client import ( +from src import NormalizationResult +from src.artifacts.dasa_client import ( AccountOpenArgs, ClaimDueCashflowsArgs, ContractConfigArgs, @@ -29,7 +30,6 @@ Prospectus, TransferArgs, ) -from src import NormalizationResult from src.registry import EVENT_TYPE_IDS from src.schedule import Cycle from tests import utils diff --git a/tests/pam/zcb/test_pam_zero_coupon_bond.py b/tests/pam/zcb/test_pam_zero_coupon_bond.py index 0bea6f1c..e12f5bbe 100644 --- a/tests/pam/zcb/test_pam_zero_coupon_bond.py +++ b/tests/pam/zcb/test_pam_zero_coupon_bond.py @@ -10,13 +10,13 @@ from smart_contracts import constants as cst from smart_contracts import enums -from smart_contracts.artifacts.d_asa.dasa_client import ( +from src import normalize_contract_attributes +from src.artifacts.dasa_client import ( AccountGetPositionArgs, ClaimDueCashflowsArgs, DasaClient, FundDueCashflowsArgs, ) -from src import normalize_contract_attributes from src.contracts import make_pam_zero_coupon_bond from src.registry import CONTRACT_TYPE_IDS, EVENT_TYPE_IDS from src.schedule import Cycle diff --git a/tests/utils.py b/tests/utils.py index de937bba..10929eee 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -1,4 +1,3 @@ -import math from base64 import b64decode from dataclasses import asdict, dataclass from typing import Any, TypeAlias @@ -10,16 +9,13 @@ SendAppTransactionResult, SigningAccount, ) -from algosdk.constants import min_txn_fee from algosdk.v2client.algod import AlgodClient from smart_contracts import enums -from smart_contracts.artifacts.d_asa.dasa_client import ( +from src.artifacts.dasa_client import ( AccountGetPositionArgs, ) -COUPON_PER_OP_UP_TXN = 10 # This parameter is empirical and depends on the complexity of `count_due_coupons` subroutine - CouponRates: TypeAlias = list[int] TimeEvents: TypeAlias = list[int] TimePeriods: TypeAlias = list[tuple[int, int]] @@ -168,21 +164,6 @@ def time_warp(to_timestamp: int) -> None: algorand_client.client.algod.set_timestamp_offset(0) -def max_fee_per_coupon(coupon_idx: int) -> AlgoAmount: - """ - Compute max fee credit for opcode budget, based on coupon index to process - - Args: - coupon_idx: coupon index to process - - Returns: - Max fee - """ - return AlgoAmount.from_micro_algo( - math.ceil(coupon_idx / COUPON_PER_OP_UP_TXN) * min_txn_fee - ) - - def get_event_from_call_result(call_result: SendAppTransactionResult) -> bytes: # Contract emits ACTUS events right before the ARC-4 (which is the last log) event = call_result.returns[0].tx_info["logs"][-2] From 3adee16d4b8de03599f99b2f20003fa18b997959 Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 15:59:21 +0100 Subject: [PATCH 167/244] feat: set default status --- modules/actus_kernel.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/modules/actus_kernel.py b/modules/actus_kernel.py index df6a611c..95f60355 100644 --- a/modules/actus_kernel.py +++ b/modules/actus_kernel.py @@ -115,6 +115,9 @@ def __init__(self) -> None: self.event_cursor = UInt64() self.schedule_entry_count = UInt64() + # Performance + self.defaulted = False + # Scaling self.fixed_point_scale = UInt64() @@ -1259,6 +1262,22 @@ def append_observed_cash_event( self._append_observed_cash_event(payload) return Global.latest_timestamp + @arc4.abimethod + def contract_set_default_status(self, *, defaulted: bool) -> UInt64: + """ + Set D-ASA default status + + Args: + defaulted: Default status + + Raises: + UNAUTHORIZED: Not authorized + """ + + self._assert_caller_is_trustee() + self.defaulted = defaulted + return Global.latest_timestamp + @arc4.abimethod(readonly=True) def contract_get_state(self) -> typ.KernelState: """ From b918834ac65f591d59f09ee7713c267c94c42fe9 Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 15:59:35 +0100 Subject: [PATCH 168/244] chore: build artifacts --- .../artifacts/d_asa/DASA.approval.puya.map | 8112 +++++++++-------- .../artifacts/d_asa/DASA.approval.teal | 1265 +-- src/artifacts/DASA.arc56.json | 738 +- src/artifacts/dasa_client.py | 107 +- 4 files changed, 5317 insertions(+), 4905 deletions(-) diff --git a/smart_contracts/artifacts/d_asa/DASA.approval.puya.map b/smart_contracts/artifacts/d_asa/DASA.approval.puya.map index a9e4bac4..d80b19a8 100644 --- a/smart_contracts/artifacts/d_asa/DASA.approval.puya.map +++ b/smart_contracts/artifacts/d_asa/DASA.approval.puya.map @@ -8,7 +8,7 @@ "../../../modules/transfer_agent.py", "../../d_asa/contract.py" ], - "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AG4BmD;;AAAf;;AAA5B;AAC4C;;AAAf;;AAA7B;AAkBA;;AAAuB;AAAvB;AACA;;AAAuB;AAAvB;AFQA;AAAc;AAAd;AACA;;AAAqB;AAArB;AAGA;;AAAuB;;AAAvB;AACA;;AAAsB;;AAAtB;AAGA;;AAA6B;AAA7B;AACA;;AAA2B;AAA3B;AAGA;;AAA6B;AAA7B;AACA;;AAAqB;AAArB;AACA;;AAA6B;AAA7B;AACA;;AAA6B;AAA7B;AAGA;;AAA4B;AAA5B;AAGA;;AAAmB;AAAnB;AACA;;AAA4B;AAA5B;AAGA;;AAA+B;AAA/B;AACA;;AAA6B;AAA7B;AACA;;AAAiC;AAAjC;AACA;;AAAoC;AAApC;AAGA;;AAAiC;AAAjC;AACA;;AAAwB;AAAxB;AAGA;;AAA6B;AAA7B;AACA;;AAAyB;AAAzB;AACA;;AAA6B;AAA7B;AACA;;AAAwB;AAAxB;AACA;;AAAsB;AAAtB;AACA;;AAAuB;AAAvB;AACA;;AAA4B;AAA5B;AACA;;AAA0B;AAA1B;AAGA;;AAA0B;AAA1B;AACA;;AAAyB;AAAzB;AAGA;;AAAiC;AAAjC;AACA;;AAAkC;AAAlC;AAQA;AAAoB;AAApB;AACA;AAA4B;AAA5B;AAGA;;AAAyB;AAAzB;AIhGO;;AAA6B;;AAA7B;AAAP;AACO;;AAAuB;;AAAvB;AAAP;AACO;;AAAA;AAAP;AACO;;AAAA;AAAP;AAlBR;;;;;;AAAA;;;AAAA;;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;;;;;;AAAA;;;AAAA;;;;AAAA;AF4IK;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ADrGA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ADgGU;AAAA;AAAA;AAAA;AAAP;AC3EA;;;AACA;;;AACA;;;ADiEO;AAAA;AAAA;AAAA;AAAe;;AAAf;AAYA;AAAP;AC3EG;;;AAAX;;;AAIsB;AACA;;AADA;AADF;;AAAA;AAFR;AAAA;;;AAQe;AAAnB;;AACkB;AAAlB;;AACmB;AAAnB;;AAGI;;AAAA;;AAAA;AAAA;;;AACI;AAAA;AAAA;AAAA;AAAoB;AAAA;AAAA;AAAA;AAApB;AADJ;;;AAGiC;AAAA;AAAA;AAAA;AAAzB;;;AAAA;AAAA;;AACL;;AAAA;AAAA;AAAA;;AAAuB;;AAAvB;AAAf;;;AAEuC;;AAAA;AAAA;AAAA;AAAA;;ADmQ3B;AADG;AAAA;AAAA;;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;;AClQA;;;ADwcA;;AAAA;AAAA;AAAkB;AAAA;AAAA;AAAA;AAAlB;AAAP;AACO;;AAAwB;;AAAxB;AAAP;AAxIG;;AAAA;;;AAAA;;AAAyC;;AAAzC;AAAA;;;AACQ;;;AAYE;;AAAA;AAAA;AAAA;AAAA;;AACS;;AAAnB;AAAA;;;AAAA;;AAAyC;;AAAzC;AAAA;;;AACQ;;;AA6HkB;;AAAA;;AAAA;AAAA;;AAG1B;;;AAAX;;;;;;;AAkB+B;;AAAA;;;AACC;;AAAA;;;AACN;;AAAA;;;AAAA;AAAA;;AAAA;;AACC;AAAA;;;AAAA;AAAA;;AACD;;AAAA;;AAAA;AAAA;AAAA;;AA4JyB;;AAAjC;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAtRH;AAAA;;AAAA;AAAA;AAAyB;AAAA;;AAAA;AAAA;AAAzB;;AAAA;AAwRA;;AAAA;;AAAA;AAAP;AACO;;AAAA;AAAA;AA7JH;;AAAA;AADJ;AAIA;;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AACG;;AAAA;AAAA;AAAgC;;AAAhC;AAAX;;;AAEY;AAAA;;AAAA;AAAA;AAAyB;;AAAA;;;AAAA;;AAAzB;AAAA;;AAAA;AAAA;AAGG;;;AAAJ;;;AAAkC;;AAAA;AAAA;AAAgC;;AAAhC;AAAlC;;;AAGkC;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;AACJ;;AAAA;;AAAA;AACA;;AAAA;;AAAA;AACA;AAAA;AAAA;AAAA;AAAqB;AAArB;AAAA;AAAA;AAAA;AAEG;;AAAA;;;AAAoB;;;AAApB;AAAA;;;AAEG;AAAA;;AAAA;AAAA;AAFH;;;AAGC;AAAc;;;AAAd;AACA;;AAAiC;AAAjC;AAEJ;;AAAA;;AAAA;AAAA;;;AAAA;AC9fI;;AAAA;;AAAA;AAAA;;AACA;;AAAA;;AAAA;AAAA;;AACA;;AAAoB;AAApB;AAAA;;;;;AD6eA;;AAAwB;AAAxB;;;;AAlCa;;AAAA;AAAA;AAAA;AAAA;;AAGI;;AAAd;AAAf;;;AAEoB;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;;;;;;AAGH;;AAAc;AAAd;AAAjB;;;AAC6C;AAAA;;AAAA;AAAA;AAAA;;AAAA;AACR;AAAA;;AAAA;AAAA;AAAA;;AAAA;;;;AACpB;;AAAc;;AAAd;AAAjB;;;;;;;AAAA;;;AAC6C;AAA7B;;AACqB;AAArB;;;;;AA7IL;;;AAAX;;;AACe;;AAAc;;AAAd;AAAf;;;AACuB;AAAA;;AAAA;AAAA;;;AAyHQ;;;AAxHJ;AAAA;;AAAA;AAAA;AAAwB;;AAAA;;;AAAA;;AAAxB;AAAA;AAAA;;AACZ;AAAA;;AAAA;AAAA;AAAA;AAAf;;;AACuB;;;AAsHQ;;;AArHA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AACG;AAAA;;AAAA;AAAA;AAAnB;AAAf;;;AACuB;AAAA;;AAAA;AAAA;;;AAmHQ;;;;;;;AAAA;;;AAhHnB;;AAAA;;AAAA;AAAoC;AAAA;;AAAA;AAAA;AAApC;AAAA;AADJ;AAGO;AAAA;;;AA8GgB;;;AAzIhB;AAAA;;AAAA;AAAA;AAAwB;;AAAA;;;AAAA;;AAAxB;;;AAwIe;;;ACnctB;;AAAA;AAAA;AAIiB;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAEH;;AALP;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAtDV;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;;;AA8DA;;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;ADkCU;AAAA;AAAA;AAAA;AAAP;ADvH0B;;AAAnB;AAAA;AAAA;AAAA;AAAA;;AAAP;AETG;AAAA;;AAAA;AAAA;AAAwB;;AAAxB;AAAX;;;AAEgB;;AAAc;AAAA;;AAAA;AAAA;AAAd;AAAA;;;AACG;;AAAA;;AAAA;AADH;;;AAEG;;AAAc;;AAAA;AAAA;AAAA;;;AAAd;AAFH;;;;AADJ;AA2HJ;;;AACA;;;ADLO;AAAA;AAAA;AAAA;AAAe;;AAAf;AAYA;AAAP;ACJA;;AAAA;AAAA;;;AACA;;;;;AF3BI;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AACE;AAAA;;AAAA;AAAA;AAAA;;AADF;;AAAA;AAAA;AAAA;;AE6BJ;AAzHI;;;AACI;AAAA;;AAAA;AAAA;AADJ;;AAAA;;AAAA;;;AAGQ;AAAA;AAAA;AAAA;;;AAAA;AAAJ;;;;AA2HhB;;;AArH6C;;AAAjC;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AADJ;AAwHc;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAjHd;AAIQ;;;;;;;;;;;;;AAJR;;;;;;AAAA;AFsFkB;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AACC;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAGW;AAA9B;AAAA;AAAA;;AAAA;;AACA;AAAA;;AACA;;AAAA;AAAA;AAEO;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACO;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAP;AAGA;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AEoBiB;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AACH;;AAJP;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;;;;AAAA;AAAA;AAAA;AA/CV;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;;;AEvFA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBG;;;AACO;AAAA;AAAP;AAEA;;AAAA;;AAAA;AACA;;AAAA;AAAA;AACO;;AAvBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAyBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AHgGU;AAAA;AAAA;AAAA;AAAP;AExE4B;;AAAqB;;AAA1C;;;AAAP;ACKA;;;AACA;;;AH0DO;AAAA;AAAA;AAAA;AAAe;;AAAf;AGzDP;AJtD0B;;AAAnB;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAP;AIwDA;AAAA;;;AACA;AAAA;AAEI;AAAA;;AAAA;AAAA;AAAA;AAAqC;AAAA;;AAAA;AAAA;AAArC;AADJ;AAGG;AAAA;;AAAA;AAAA;AAAX;;;AAEgB;;AAA2B;AAAA;;AAAA;AAAA;AAA3B;AADJ;AJ8DJ;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AIzDA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AACO;AAAA;;AAAA;AAAA;AAAA;AAAA;AA7CV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AA+CA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AHiDU;AAAA;AAAA;AAAA;AAAP;AGbA;;;AACA;;;AHIO;AAAA;AAAA;AAAA;AAAe;;AAAf;AAYA;AAAP;AGtIG;AAAA;;AAAA;AAAA;AAAX;;;AAEgB;AAAA;;AAAA;AAAA;AAA8B;;AAA9B;AADJ;AAGD;AAAA;;AAAA;AAAA;AAAX;;;AAEgB;;AAA0B;AAAA;;AAAA;AAAA;AAA1B;AADJ;AAqHG;;AAAA;;AAAA;AAAA;;AAAA;AAAP;AJ/G0B;;AAAnB;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAP;AAA0B;;AAAnB;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAP;AIkHA;;AAAA;;;AACA;AAAA;;;AACO;;AAAA;AAAP;AACA;;AAAA;AAAA;AACgB;AAAA;AAAA;AAAA;AAAA;AAAT;AAAP;AH6mBG;AAAA;AAAA;AAAA;AAAqB;AAAA;AAAA;AAAA;AAArB;AAAX;;;AAE8C;AAAA;AAAA;AAAA;AAAzB;;;AAET;;AAAA;AAA4B;;AAA5B;AADJ;AG7mBA;;AAAA;AAAA;;;AACA;;AAAA;AAAA;;AAAA;;;AACA;;;;;AACA;;;;;AJIgB;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAT;;AAAA;AAAA;;AAAA;;AAAA;AAAP;AACA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AATA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AIlDH;AAAA;;AAAA;AAAA;AAAA;AAAA;AJuEA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AGxF+B;;AAAgB;;AAArC;;;AAAP;AHrD0B;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAiKA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AACO;;AArBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AGxH+B;;AAAsB;;AAA3C;;;AAAP;AFuEO;AAAA;AAAA;AAAA;AAAe;;;AAAf;ADuEA;AAAP;AACA;;;AACA;;;AAC8B;;AAAvB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AAnLU;AAFH;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAsLP;AACO;;AA3BV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA6BA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAjM6B;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAsNO;;AAAA;;AAAA;AAAP;AACA;;;AACA;;;AACA;AAAA;;AAAA;AACO;;AAzBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA5N6B;;AAAnB;AAAA;AAAA;AAAA;AAAA;;AAAP;AA2OO;AAAA;AAfV;AAAA;AAAA;AAAA;AAAA;AAAA;ACuwBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAcG;;AAAA;AAAA;AACO;;AAfV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;AAiBA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AA8BG;;;AAGqB;AAAA;AAAA;AAArB;;AAAA;;AAAA;AAn1BO;;;AAAA;AAEH;AAFG;AAAA;;;AAAA;AAGH;;AAHG;AAAA;;;AAAA;AAIH;;AAJG;AAAA;;;AAAA;AAKH;;AALG;AAAA;;;AAAA;AAMH;;AANG;AAAA;;;;AAWP;AA00B4B;AAAA;;AAAA;AAAA;AAAA;;AAAA;AA1uBrB;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAP;AAEI;;AAAA;AAAA;AAAA;;AA9BG;;;AAAA;;AAEH;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;;AAYP;AAoBG;AAAiB;AAAjB;AAAX;;;AACuB;;AAAA;;;AAAA;AAAJ;AAAP;AA6dG;AAAA;AAAA;AAAA;AAAA;AAAP;AACO;AAAA;;AAAA;AAAA;AAAA;AAAP;AAGgC;;AAAA;AAAA;AAAA;AAnCb;AAAA;;AAAA;;AACnB;AAGA;;AAAA;;AAAA;AAmC8B;;AAAA;;AAAA;AA9B1B;AAAA;;AAAA;AADJ;AAKA;;AAAA;;AAAA;AAEA;AAIQ;;AAFW;;AACF;;;;;;;;AAHjB;;;;;;AAAA;AA4BmB;AAAA;;AAAA;AAAnB;;AAAA;AAAA;AACA;;AAA4B;AAA5B;AAGA;;AAAA;;AAAA;AAG6B;AAAA;;AAAA;AAA7B;;AAAA;;AAAA;AACqB;;AAAA;;AAAA;AAArB;;AAAA;;AAAA;AACiC;;AAAA;AAAA;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;AAGA;;AAAA;;AAAA;AACoC;;AAAA;;;AAAA;AAApC;;AAAA;AAAA;AAC6B;;AAAA;;AAAA;AAA7B;;AAAA;AAAA;AAGwB;;AAAA;;AAAA;AAAxB;;AAAA;AAAA;AAG6B;;AAAA;AAAA;AAA7B;;AAAA;AAAA;AACiC;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;AACyB;;AAAA;;AAAA;AAAzB;;AAAA;AAAA;AAC6B;;AAAA;;AAAA;AAA7B;;AAAA;AAAA;AACwB;;AAAA;;AAAA;AAAxB;;AAAA;AAAA;AACsB;;AAAA;;AAAA;AAAtB;;AAAA;AAAA;AACuB;;AAAA;;AAAA;AAAvB;;AAAA;AAAA;AAC4B;;AAAA;;;AAAA;AAA5B;;AAAA;AAAA;AAC0B;;AAAA;;;AAAA;AAA1B;;AAAA;AAAA;AAGyB;;AAAA;;AAAA;AAAzB;;AAAA;AAAA;AAGoB;;AAAA;AAAA;AAApB;AAAA;AAAA;AAGiC;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;AACkC;;AAAA;;AAAA;AAAlC;;AAAA;AAAA;AAGA;;AAAyB;AAAzB;AACA;;AAA0B;AAA1B;AAEO;;AAA8B;;AAA9B;AAAP;AACqC;AAAA;AAAA;AAA9B;;AAAA;AAAP;AACO;AAAP;AAiNuB;;AAAA;;;AAAvB;;AAAA;AAAA;AACsB;;AAAA;;;AAAtB;;AAAA;AAAA;AACO;;AAxCV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;;;;;;;;AA0CA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAgCG;;;AAGkB;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAxOX;AAAA;AAAA;AAAA;AAAA;AAAP;AACO;AAAwB;;AAAxB;AAAP;AAGO;AAAA;;AAAA;AAAA;AAAP;AAEc;AAAsB;;AAAtB;AAAA;AAOU;;AAAd;AADF;;AAAA;AAFR;AAAA;;;AAMQ;AACF;AAAA;;AAAA;AAAd;;;AACoB;;AAAA;;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AACW;AADX;AACW;AAAA;AAAA;;AAAA;;AACZ;AAAA;AAAA;AAAA;AAAA;;AAAkB;;AAAA;;AAAA;AAAlB;;AAAA;AAAP;AACA;;AAAA;;AAAA;;;AAGO;AAAA;;AAAA;AAAA;AAAA;;AAAP;AACZ;;;AACA;AAAA;;;AACmD;AAAQ;AAAR;AAAd;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAejB;;AAAA;AAAA;;AAAA;AADJ;AAGhB;;AAAA;;;AACuB;;AAAoB;AAApB;AAAP;AAGJ;AAAS;AAAT;AAAA;;;;;AAjBQ;;AAAA;AAAA;AAC4C;AAAtB;AAElB;AAAuB;;AAAvB;AAAA;AAAA;AAAA;AAAA;;AADJ;AAGgB;AAAA;AAAA;;AAAA;AAAA;AAChB;AAAA;AAE2B;AAAvB;AADa;;AAAA;AAAA;;AAAA;AAAA;;AAAA;;;;AA/sBV;;AAAA;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AA4tBR;;AAAA;;;AAEgB;;AAAA;;AAAA;AADJ;AAAA;AAAA;AAGA;AAAc;;AAAd;AAsLG;;AAxCV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAv6BU;AAAA;AAAA;AAAA;AAAP;AAw+BA;;;AACA;;;AACA;;;AAEO;AAAA;AAAA;AAAA;AAAoB;AAAA;AAAA;AAAA;AAApB;;AAAA;AAAP;AACQ;;;AACD;AAAA;;;AAAA;AAAoB;;;AAApB;AAAP;AAIiB;;AAAA;;;AAEM;;AAAA;;;AACA;;AAAA;;;AACW;;AAAA;;;AAEC;;AAAA;;;AACD;;AAAA;;;AACC;;AAAA;;;AACrB;;AAAA;;;AAVV;;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAMkB;AANlB;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAFJ;;;AAAA;;AAeO;;AA7CV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;AA+CA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAhgCU;AAAA;AAAA;AAAA;AAAP;AAqiCA;;;AACA;;;AAEG;;AAAA;AAAA;AAAgB;;AAAhB;AAAX;;;AA98Be;AAAA;;AAAA;AAAA;AAAsB;;AAAtB;AA+8BH;AACA;;;AAh9BG;AAAA;;AAAA;AAAA;AAAA;AAAsB;;AAAtB;AAwsBP;AACO;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAoB;AAAA;AAAA;AAAA;AAApB;AAAP;AAEwB;AAAA;;;AAAA;;AAAA;AAAA;AADxB;;;AAIuC;AAAA;AAAA;AAAA;AAzvBpB;;AAAZ;AA0vBA;;AAAA;;AACJ;AAAc;;AAAd;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAX;;;AACmB;;AAAA;AAAA;AAAA;;AAAA;AACJ;;AAAA;AAAA;AAAA;AAAA;AAAc;;AAAd;AAAP;AAKuB;;AAAA;AAAA;;;AACA;;AAAA;;;AACW;;AAAA;;;AACC;;AAAA;;;AACD;;AAAA;;;AACC;;AAAA;;;AAR/B;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AADJ;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAaA;;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAA6B;AAA7B;AAAA;AAAA;AAAA;AAkPmB;AAAA;AAAA;AAAA;AAAZ;;AAAA;AAAA;;AAAA;AAAP;AACQ;;;AAAA;AAAA;;AAEJ;AAAA;;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAn1BA;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;AAAA;;AAMH;;AANG;AAAA;;;;AAm1BP;AAGO;;AAAoB;;;AAApB;AAAP;AA30BO;;AAAe;;AAAf;AAAA;;;AAAA;;AAAqC;;AAArC;AAAA;;;;AA40Bf;;;AElnCoC;;AAAe;;AAApC;;;AAAP;AFsnCA;;AAAA;;AAAA;;;AAAA;;AACO;;AAxDV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsDO;;;;;;;;;;;;;;;;AAIP;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AA1jCU;AAAA;AAAA;AAAA;AAAP;AAulCA;;;AACA;;;AACA;;;AAjmCO;AAAA;AAAA;AAAA;AAAe;;AAAf;AAYA;AAAP;AAsFO;AAAA;;AAAA;AAAA;AAAsB;;AAAtB;AA4uBP;AACO;AAAA;AAAA;AAAA;AAAA;;AAAoB;AAAA;AAAA;AAAA;AAApB;AAAA;;AAAA;AAAP;AACO;;AAAA;;;AAAA;AAAA;;AAAsB;;;AAAtB;AAAP;AACO;AAAA;;AAAA;AAAA;AAAA;;AAAgB;AAAhB;AAAP;AAER;;;AAEgB;AAAA;AAAA;AAAA;AAA4B;AAA5B;AADa;;;AAIb;;AAAA;AAAiC;;AAAA;;AAAA;AAAjC;AADJ;AAImC;AAAA;AAAA;AAAA;AApyBpB;;AAAZ;AAqyBA;;AAAA;;AACJ;AAAc;;AAAd;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAX;;;AACmB;;AAAA;AAAA;AAAA;;AAAA;AACJ;;AAAA;AAAA;AAAA;AAAA;AAAc;;AAAd;AAAP;AAKuB;;AAAA;AAAA;;;AACA;;AAAA;;;AACW;;AAAA;;;AACC;;AAAA;;;AACD;;AAAA;;;AACC;;AAAA;;;AAR/B;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AADJ;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAaA;;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAA6B;AAA7B;AAAA;AAAA;AAAA;AAuPO;;AAnCV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA1jCU;AAAA;AAAA;AAAA;AAAP;AAAA;AA4mC6B;AAAA;;AAAA;AAAA;AAAX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAEF;AAAA;;AAAA;AAAA;AACS;AAAA;;AAAA;AAAA;AACG;AAAA;;AAAA;AAAA;AACX;AAAA;AAAA;AAAA;AACQ;AAAA;AAAA;AAAA;AACC;AAAA;;AAAA;AAAA;AACI;AAAA;;AAAA;AAAA;AACJ;AAAA;;AAAA;AAAA;AACL;AAAA;;AAAA;AAAA;AACS;AAAA;;AAAA;AAAA;AACC;AAAA;;AAAA;AAAA;AACT;AAAA;;AAAA;AAAA;AACC;AAAA;;AAAA;AAAA;AAfhB;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAZV;AAAA;AAAA;AAAA;AAAA;AAAA;AA/lCU;AAAA;AAAA;AAAA;AAAP;AAyoCG;AAAA;AAAA;AAAA;AAAqB;AAAA;AAAA;AAAA;AAArB;AAAX;;;AAEyB;AAAA;AAAA;AAAA;AADN;AAEQ;;AAFR;AAGY;AAHZ;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAbd;AAAA;AAAA;AAAA;AAAA;AAAA;AAwBmC;AAAA;AAAA;AAAA;AAAzB;;;AAxBV;;;AE1mCG;;;AAdH;AAAA;AAgBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAcG;;;AACA;;AAAA;AAAA;AACO;;AAhBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAcG;;;AACA;;AAAA;AAAA;AACO;;AAhBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAsBG;;;AACA;;;AACwB;AAAA;;AAAxB;;;AA1Hc;;AAAX;AAAX;;;AACY;;AAAA;;AAAA;AA2HG;;AA1BV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA9FM;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAqHJ;;;AAnHG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAiHJ;;;AA/GG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AA6GJ;;;AA3GG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAyGJ;;;AAvGG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;;;;AAwGP;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAmBG;;;AACA;;;AACwB;AAAA;;AAAxB;;;AA1HO;AAAW;;AAAX;AAAP;AACc;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAyHG;;AAvBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAhGM;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAoHJ;;;AAlHG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAgHJ;;;AA9GG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AA4GJ;;;AA1GG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;;;;AA2GP;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAhL+B;;AAAgB;;AAArC;;;AAAP;AAgMA;;AAAA;AAAA;AACO;;AAjBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA8BU;AAAA;;AAAA;AAAA;AAXV;AAAA;AAAA;AAAA;AAAA;AAAA;AAaA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAkB4B;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AAtBP;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAyBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAkBU;AACP;AAAA;;;AAES;;;;;;;;AADT;;AAAA;;;;;;;;;;;;;;AA+BQ;AAJI;;AA9SL;;AAAA;AAAA;AAAA;AAAA;;AA6SC;AAGO;AAAA;AAjDlB;AAAA;AAAA;AAAA;AAAA;AAAA;AA0Ce;;AAzSL;;AAAA;AAAA;AAAA;AAAA;;AAwSC;AAGO;AAAA;AA5ClB;;;AAqCe;;AApSL;;AAAA;AAAA;AAAA;AAAA;;AAmSC;AAGO;AAAA;AAvClB;;;AAgCe;;AA/RL;;AAAA;AAAA;AAAA;AAAA;;AA8RC;AAGO;AAAA;AAlClB;;;AA2Be;;AA1RL;;AAAA;AAAA;AAAA;AAAA;;AAyRC;AAGO;AAAA;AA7BlB;;;AAsBkB;;;;;;;;;;;;;;;;;;AAtBlB;;;AH5RD;;;AAEe;;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAJ;AAAP;;AAgBJ;;;AApB8B;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAqCW;AAAA;AAAA;AAIM;AAAA;;AAAA;AAAA;AAAiC;;AAAA;;AAAA;AAAjC;AAEb;AAAA;;AAAA;AAAA;AAAkC;;AAAA;;AAAA;AAAlC;AAMgB;;AAAA;AAAA;AAAgB;AAAA;;AAAA;AAAA;AADf;;AAAA;;AAAA;;AAAA;;;AAIgB;AAAA;;AAAA;AAAA;AADf;;AAAA;;AAAA;;AAAA;;;AAMtB;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAI+B;AAAA;;AAAA;AAAA;AAA/B;AAAA;;AACgC;AAAA;;AAAA;AAAA;AAAhC;AAAA;;AAG0B;AAAA;AAAA;AAAA;AAA1B;AAAA;;AAIA;;AAAA;AAAA;AACA;AAEJ;;;;;;AAzE8B;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AC+GO;AAAA;AAAA;AAAA;AAAe;;AAAf;ADnCf;;;AACY;AAEO;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AACR;;AAAA;AAAA;AAAA;;AAAX;;;AACY;AAGJ;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAC0B;AAA1B;AAAA;;AACA;;AAAA;AAAA;AACO;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;AAAA;AAAA;;AAAA;AAAA;;ACyCJ;;;AAIO;;AAAA;;;AAAA;;AAAA;;;AACQ;AAAP;AACQ;;AAAA;;AAAA;AACL;;AAAA;AAAP;AAEJ;;;AAEJ;;AAAA;;;AACmB;AAAP;AACG;AAAA;;AAAA;AAAA;AAAP;AAAA;AACoC;AAAA;;AAAA;AAAA;AAA7B;;AAAA;AAAA;;AAAA;;;AAAP;AAEJ;;;AAOJ;;AAAA;;;AACmB;AAAP;AAEA;AAAA;;AAAA;AAAA;AAEA;AAAA;;AAAA;AAAA;AAHG;;AAAA;AAAA;;;AAAP;AAwBJ;;;AAEsB;AAAA;AAAA;AAAA;AAAX;;AAAA;AAAP;AAdO;;AAAY;;AAAZ;AAgBA;AAAc;;AAAd;AAAA;AAAA;AAAA;AAAA;;AAAP;AAZO;;AAAW;;AAAX;AAeS;;AAAA;AAAA;;AAAA;AAAA;AAAT;;AAAA;AAAP;AACO;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAP;AAuGJ;;;AA1DO;;AARC;AAQD;AAAA;;;AAAA;;AAPC;AAOD;AAAA;;;AAAA;;AANC;;AAMD;AAAA;;;AAAA;;AALC;;AAKD;AAAA;;;AAAA;;AAJC;;AAID;AAAA;;;AACQ;AA6DX;;AA1DR;;AAAA;;;AAEmB;AAwDJ;;;AAtDJ;;AAAiB;;AAAjB;AAAA;;;AAAyC;;AAAiB;;AAAjB;AAAzC;;;AAIQ;;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;;AAkDJ;;;;AAAA;;;AA7CJ;;AAAiB;AAAjB;AAAX;;;AAEmB;;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;;AA2CJ;;;;AAAA;;;AArCJ;;AAAiB;;AAAjB;AAAX;;;AAEmB;;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;;AAmCJ;;;;AAAA;;;AA5BJ;;AAAiB;;AAAjB;AAAX;;;AAEmB;;AAAc;;AAAd;AA0BJ;;;AAxBA;AAwBA;;;AAkBH;AAAA;;AAAA;AAAA;AAAsB;AAAtB;AAAA;;;AACI;AAAA;;AAAA;AAAA;AADJ;;;;AADJ;;AAAA;AA8CJ;;;AASQ;;AAAA;;AAAA;AAAA;AAAA;;;AACG;AAAA;;AAAA;AAAA;AADH;;;AAEG;AAAA;;AAAA;AAAA;AAFH;;;AAIO;AAAP;;AAAA;;AAAA;AAEA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAHM;;;AAQN;AAAA;;AAAA;AAAA;AAHG;;AAAA;AAAA;;;AAAP;;AAAA;;AAAA;AA+DJ;;;AAMJ;;AAAA;;;AACY;;AAAA;AACU;AAAA;;AAAA;AAAA;AACV;AAAA;;AAAA;AAAA;AADmC;;AAAA;;AAAA;;;AAAzB;AAKd;AAAA;AAGI;AAAA;;AAAA;AAAA;AAFG;;AAAA;AAAA;;AAAA;;;AAAP;AAyIJ;;;;;;;;AAUW;;AAAA;AAAA;AAAkB;AAAA;AAAA;AAAA;AAAlB;AAAP;AACO;;AAAA;;AAAA;AAAwB;;AAAxB;AAAP;AAEa;;AAAA;AAAA;AAAA;AACI;AAAd;AAAA;AAAX;;;AA5ee;AAAA;AAAA;AAAA;AAAe;;AAAf;AA+eH;AAEI;AAAA;;AAAA;AAAA;AAA6B;AAAA;;AAAA;AAAA;AAA7B;AADJ;AAG6B;;AAAA;;AAAA;AAA7B;;AAAA;;AAAA;AACA;;AAAA;AAAA;AAC6B;;AAAA;;AAAA;AAA7B;;AAAA;AAAA;AACA;;AAAwB;AAAxB;AACiC;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAqB;AAArB;AAAA;AAAA;AAAA;AACA;AAAc;;AAAd;AA7LJ;;AAAA;AACO;AAAA;;AAAA;AAAA;AA6LH;;AAAA;AAGmB;AAHnB;;;;AAAA;;AAKA;;AAAA;;AAAA;;AAAA;AA/fG;AAAA;AAAA;AAAA;AAAe;;AAAf;AAYA;AAAP;AAsfA;AAAA;;AAAA;AAAA;AAAyB;;AAAA;;;AAAA;;AAAzB;AAAA;;AAAA;AAAA;AAEG;;AAAc;;AAAd;AAAX;;;AAIgB;;AAAA;;AAAA;AACA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAHY;;;AAMI;AAAA;;AAAA;AAAA;AAAhB;AAAA;;AAiFL;AAAA;;AAAA;AAAA;AAAA;;;AAAqC;AAAA;;AAAA;AAAA;AAAP;;AAAA;AAA9B;;;AACQ;AAAA;;AAAA;AAAA;AAAA;;AAAA;AACR;AAAA;;AAAA;AAAA;AAAA;;;AAAmC;AAAA;;AAAA;AAAA;AAAP;;AAAA;AAA5B;;;AACQ;AAAA;;AAAA;AAAA;AAAA;;AAAA;AArFP;;AAAA;;AAAA;AAYD;;AAAc;;AAAd;AAAX;;;AACyC;;AAAA;;AAAA;AAA7B;;AAAA;;AAAA;AACA;;AAAA;AAAA;AAKD;;;AAAX;;;AACe;;AAAc;;AAAd;AAAf;;;AAI2B;AAAA;AAAA;AAAA;AAA4B;AAAA;AAAA;AAAA;AAA5B;AACD;;AADA;AADF;;AAAA;AAFR;AAAA;;;AA9LU;AAAA;;AAAA;AAAA;AAAA;;AAAA;AACJ;AAAd;;AACwB;AAAxB;;AAEG;;AAAA;;AAAA;AAAA;AAAA;;AAAX;;;AAE8B;;AAAA;;AAAA;;;AAAA;AAAA;;AAKM;AAAxB;;;;AAEc;AAAA;AAAA;AAAA;AAAoB;AAApB;AAAA;;AACM;AAAA;AAAA;AAAA;AAAlB;;AAAA;AAAd;;;AAC2B;;AAAA;;;AAAA;AAAA;;AACK;AAAA;AAAA;AAAA;;AAEuB;;AAArB;AAAA;;;AAClB;;AAAqB;;AAArB;AAAA;;;AACI;;AAAA;;AAAA;AADJ;;;;AAGhB;;;AACA;;AAAA;;;AAC4C;AAAxB;;AAOR;;AAAmB;AAAnB;AAAA;;;;;AAHY;;AAAA;;AAAA;AAFc;;AAAA;AAAA;;;AAAA;AAAA;;AAIlB;;AAAA;AAAA;;;;;;;;;AAGZ;;AAAA;AACY;AAAA;;AAAA;AAAA;AACT;;AAAA;;AAAA;AAAc;AAAd;AAAX;;;AAEyB;AAAA;;AAAA;AAAA;AAAb;AAGA;AAAA;;AAAA;AAAA;AAFG;;AAAA;;;AA+JC;;AAAA;AAAA;AAKR;AAAA;AAAA;AAAA;AAAqB;AAArB;AAAA;AAAA;AAAA;AACA;;AAEW;AACQ;AAHnB;;;;AAAA;;;;;;;;;AAFqC;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;;;;AAjBC;;AAAc;;AAAd;AAAb;;;AAE6C;AAAA;;AAAA;AAAA;AAAjC;;AAAA;AAAA;;;;AAdC;;AAAc;;AAAd;AAAb;;;AACwB;;AAAA;;AAAA;AAAA;AAAA;;AACxB;;;AAC4B;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAChB;;AAAA;;AAAA;;;;AAEG;;AAAA;;AAAA;AAAA;AAAA;;AAAf;;;AACgB;;AAAA;;AAAA;;;;AAkCZ;;;AAUwB;;AACH;;AAAA;AAAA;AACE;;AAAA;;;AACI;;AAAA;;;AACJ;;AAGW;;AALX;AAKW;AA6BtC;;AAAA;;;AACmB;AA/BS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAIA;AAAA;;AAAA;AAAA;AACH;;AAAA;AAAiB;AAAjB;AAZb;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AADJ;;;;;;AAAA;AAAA;AAAA;;;;;;AAwCG;;AAAe;AAAf;AAAA;;;AAAA;;AAAsC;;AAAtC;AAAA;;;AACQ;AAhCC;;;AAiCL;;;AAjCK;;;AEvpBhB;;;;;AAFW;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAGA;;;AACH;;AAAA;AAAA;AAAA;AAAA;AACG;;AAAA;AAAA;;AADH;AAAA;;;AAEG;;AAAA;AAAA;AAAA;AAAA;AADA;;AAAA;AADH;;;;AADJ;;AAAA;;;;;AAOyB;;AAbF;AAAA;;AAAA;AAAA;AAAhB;AAaP;;AAkBW;AAAA;;AAAA;AAAA;AAAJ;AAAP;;AAGW;AAAA;;AAAA;AAAA;AAAJ;AAAP;;AAEJ;;;AACW;;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;AAAA;;AAMH;;AANG;AAAA;;;AAAA;;AAOH;;AAPG;AAAA;;;;AAAP;;;", + "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AG4BmD;;AAAf;;AAA5B;AAC4C;;AAAf;;AAA7B;AAkBA;;AAAuB;AAAvB;AACA;;AAAuB;AAAvB;AFQA;AAAc;AAAd;AACA;;AAAqB;AAArB;AAGA;;AAAuB;;AAAvB;AACA;;AAAsB;;AAAtB;AAGA;;AAA6B;AAA7B;AACA;;AAA2B;AAA3B;AAGA;;AAA6B;AAA7B;AACA;;AAAqB;AAArB;AACA;;AAA6B;AAA7B;AACA;;AAA6B;AAA7B;AAGA;;AAA4B;AAA5B;AAGA;;AAAmB;AAAnB;AACA;;AAA4B;AAA5B;AAGA;;AAA+B;AAA/B;AACA;;AAA6B;AAA7B;AACA;;AAAiC;AAAjC;AACA;;AAAoC;AAApC;AAGA;;AAAiC;AAAjC;AACA;;AAAwB;AAAxB;AAGA;;AAA6B;AAA7B;AACA;;AAAyB;AAAzB;AACA;;AAA6B;AAA7B;AACA;;AAAwB;AAAxB;AACA;;AAAsB;AAAtB;AACA;;AAAuB;AAAvB;AACA;;AAA4B;AAA5B;AACA;;AAA0B;AAA1B;AAGA;;AAA0B;AAA1B;AACA;;AAAyB;AAAzB;AAGA;;AAAiC;AAAjC;AACA;;AAAkC;AAAlC;AAQA;AAAoB;AAApB;AACA;AAA4B;AAA5B;AAGA;;AAAiB;AAAjB;AAGA;;AAAyB;AAAzB;AInGO;;AAA6B;;AAA7B;AAAP;AACO;;AAAuB;;AAAvB;AAAP;AACO;;AAAA;AAAP;AACO;;AAAA;AAAP;AAlBR;;;;;;AAAA;;;AAAA;;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;;;;;;AAAA;;;AAAA;;;;AAAA;AF4IK;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ADrGA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ADmGU;AAAA;AAAA;AAAA;AAAP;AC9EA;;;AACA;;;AACA;;;ADoEO;AAAA;AAAA;AAAA;AAAe;;AAAf;AAYA;AAAP;AC9EG;;;AAAX;;;AAIsB;AACA;;AADA;AADF;;AAAA;AAFR;AAAA;;;AAQe;AAAnB;;AACkB;AAAlB;;AACmB;AAAnB;;AAGI;;AAAA;;AAAA;AAAA;;;AACI;AAAA;AAAA;AAAA;AAAoB;AAAA;AAAA;AAAA;AAApB;AADJ;;;AAGiC;AAAA;AAAA;AAAA;AAAzB;;;AAAA;AAAA;;AACL;;AAAA;AAAA;AAAA;;AAAuB;;AAAvB;AAAf;;;AAEuC;;AAAA;AAAA;AAAA;AAAA;;ADsQ3B;AADG;AAAA;AAAA;;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;;ACrQA;;;AD2cA;;AAAA;AAAA;AAAkB;AAAA;AAAA;AAAA;AAAlB;AAAP;AACO;;AAAwB;;AAAxB;AAAP;AAxIG;;AAAA;;;AAAA;;AAAyC;;AAAzC;AAAA;;;AACQ;;;AAYE;;AAAA;AAAA;AAAA;AAAA;;AACS;;AAAnB;AAAA;;;AAAA;;AAAyC;;AAAzC;AAAA;;;AACQ;;;AA6HkB;;AAAA;;AAAA;AAAA;;AAG1B;;;AAAX;;;;;;;AAkB+B;;AAAA;;;AACC;;AAAA;;;AACN;;AAAA;;;AAAA;AAAA;;AAAA;;AACC;AAAA;;;AAAA;AAAA;;AACD;;AAAA;;AAAA;AAAA;AAAA;;AA4JyB;;AAAjC;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAtRH;AAAA;;AAAA;AAAA;AAAyB;AAAA;;AAAA;AAAA;AAAzB;;AAAA;AAwRA;;AAAA;;AAAA;AAAP;AACO;;AAAA;AAAA;AA7JH;;AAAA;AADJ;AAIA;;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AACG;;AAAA;AAAA;AAAgC;;AAAhC;AAAX;;;AAEY;AAAA;;AAAA;AAAA;AAAyB;;AAAA;;;AAAA;;AAAzB;AAAA;;AAAA;AAAA;AAGG;;;AAAJ;;;AAAkC;;AAAA;AAAA;AAAgC;;AAAhC;AAAlC;;;AAGkC;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;AACJ;;AAAA;;AAAA;AACA;;AAAA;;AAAA;AACA;AAAA;AAAA;AAAA;AAAqB;AAArB;AAAA;AAAA;AAAA;AAEG;;AAAA;;;AAAoB;;;AAApB;AAAA;;;AAEG;AAAA;;AAAA;AAAA;AAFH;;;AAGC;AAAc;;;AAAd;AACA;;AAAiC;AAAjC;AAEJ;;AAAA;;AAAA;AAAA;;;AAAA;ACjgBI;;AAAA;;AAAA;AAAA;;AACA;;AAAA;;AAAA;AAAA;;AACA;;AAAoB;AAApB;AAAA;;;;;ADgfA;;AAAwB;AAAxB;;;;AAlCa;;AAAA;AAAA;AAAA;AAAA;;AAGI;;AAAd;AAAf;;;AAEoB;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;;;;;;AAGH;;AAAc;AAAd;AAAjB;;;AAC6C;AAAA;;AAAA;AAAA;AAAA;;AAAA;AACR;AAAA;;AAAA;AAAA;AAAA;;AAAA;;;;AACpB;;AAAc;;AAAd;AAAjB;;;;;;;AAAA;;;AAC6C;AAA7B;;AACqB;AAArB;;;;;AA7IL;;;AAAX;;;AACe;;AAAc;;AAAd;AAAf;;;AACuB;AAAA;;AAAA;AAAA;;;AAyHQ;;;AAxHJ;AAAA;;AAAA;AAAA;AAAwB;;AAAA;;;AAAA;;AAAxB;AAAA;AAAA;;AACZ;AAAA;;AAAA;AAAA;AAAA;AAAf;;;AACuB;;;AAsHQ;;;AArHA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AACG;AAAA;;AAAA;AAAA;AAAnB;AAAf;;;AACuB;AAAA;;AAAA;AAAA;;;AAmHQ;;;;;;;AAAA;;;AAhHnB;;AAAA;;AAAA;AAAoC;AAAA;;AAAA;AAAA;AAApC;AAAA;AADJ;AAGO;AAAA;;;AA8GgB;;;AAzIhB;AAAA;;AAAA;AAAA;AAAwB;;AAAA;;;AAAA;;AAAxB;;;AAwIe;;;ACtctB;;AAAA;AAAA;AAIiB;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAEH;;AALP;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAtDV;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;;;AA8DA;;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;ADqCU;AAAA;AAAA;AAAA;AAAP;AD1H0B;;AAAnB;AAAA;AAAA;AAAA;AAAA;;AAAP;AETG;AAAA;;AAAA;AAAA;AAAwB;;AAAxB;AAAX;;;AAEgB;;AAAc;AAAA;;AAAA;AAAA;AAAd;AAAA;;;AACG;;AAAA;;AAAA;AADH;;;AAEG;;AAAc;;AAAA;AAAA;AAAA;;;AAAd;AAFH;;;;AADJ;AA2HJ;;;AACA;;;ADFO;AAAA;AAAA;AAAA;AAAe;;AAAf;AAYA;AAAP;ACPA;;AAAA;AAAA;;;AACA;;;;;AF3BI;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AACE;AAAA;;AAAA;AAAA;AAAA;;AADF;;AAAA;AAAA;AAAA;;AE6BJ;AAzHI;;;AACI;AAAA;;AAAA;AAAA;AADJ;;AAAA;;AAAA;;;AAGQ;AAAA;AAAA;AAAA;;;AAAA;AAAJ;;;;AA2HhB;;;AArH6C;;AAAjC;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AADJ;AAwHc;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAjHd;AAIQ;;;;;;;;;;;;;AAJR;;;;;;AAAA;AFsFkB;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AACC;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAGW;AAA9B;AAAA;AAAA;;AAAA;;AACA;AAAA;;AACA;;AAAA;AAAA;AAEO;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACO;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAP;AAGA;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AEoBiB;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AACH;;AAJP;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;;;;AAAA;AAAA;AAAA;AA/CV;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;;;AEvFA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBG;;;AACO;AAAA;AAAP;AAEA;;AAAA;;AAAA;AACA;;AAAA;AAAA;AACO;;AAvBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAyBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AHmGU;AAAA;AAAA;AAAA;AAAP;AE3E4B;;AAAqB;;AAA1C;;;AAAP;ACKA;;;AACA;;;AH6DO;AAAA;AAAA;AAAA;AAAe;;AAAf;AG5DP;AJtD0B;;AAAnB;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAP;AIwDA;AAAA;;;AACA;AAAA;AAEI;AAAA;;AAAA;AAAA;AAAA;AAAqC;AAAA;;AAAA;AAAA;AAArC;AADJ;AAGG;AAAA;;AAAA;AAAA;AAAX;;;AAEgB;;AAA2B;AAAA;;AAAA;AAAA;AAA3B;AADJ;AJ8DJ;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AIzDA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AACO;AAAA;;AAAA;AAAA;AAAA;AAAA;AA7CV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AA+CA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AHoDU;AAAA;AAAA;AAAA;AAAP;AGhBA;;;AACA;;;AHOO;AAAA;AAAA;AAAA;AAAe;;AAAf;AAYA;AAAP;AGzIG;AAAA;;AAAA;AAAA;AAAX;;;AAEgB;AAAA;;AAAA;AAAA;AAA8B;;AAA9B;AADJ;AAGD;AAAA;;AAAA;AAAA;AAAX;;;AAEgB;;AAA0B;AAAA;;AAAA;AAAA;AAA1B;AADJ;AAqHG;;AAAA;;AAAA;AAAA;;AAAA;AAAP;AJ/G0B;;AAAnB;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAP;AAA0B;;AAAnB;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAP;AIkHA;;AAAA;;;AACA;AAAA;;;AACO;;AAAA;AAAP;AACA;;AAAA;AAAA;AACgB;AAAA;AAAA;AAAA;AAAA;AAAT;AAAP;AHgnBG;AAAA;AAAA;AAAA;AAAqB;AAAA;AAAA;AAAA;AAArB;AAAX;;;AAE8C;AAAA;AAAA;AAAA;AAAzB;;;AAET;;AAAA;AAA4B;;AAA5B;AADJ;AGhnBA;;AAAA;AAAA;;;AACA;;AAAA;AAAA;;AAAA;;;AACA;;;;;AACA;;;;;AJIgB;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAT;;AAAA;AAAA;;AAAA;;AAAA;AAAP;AACA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AATA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AIlDH;AAAA;;AAAA;AAAA;AAAA;AAAA;AJuEA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AGxF+B;;AAAgB;;AAArC;;;AAAP;AHrD0B;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAiKA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AACO;;AArBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AGxH+B;;AAAsB;;AAA3C;;;AAAP;AF0EO;AAAA;AAAA;AAAA;AAAe;;;AAAf;ADoEA;AAAP;AACA;;;AACA;;;AAC8B;;AAAvB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AAnLU;AAFH;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAsLP;AACO;;AA3BV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA6BA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAjM6B;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAsNO;;AAAA;;AAAA;AAAP;AACA;;;AACA;;;AACA;AAAA;;AAAA;AACO;;AAzBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA5N6B;;AAAnB;AAAA;AAAA;AAAA;AAAA;;AAAP;AA2OO;AAAA;AAfV;AAAA;AAAA;AAAA;AAAA;AAAA;AC0wBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAcG;;AAAA;AAAA;AACO;;AAfV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;AAiBA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AA8BG;;;AAGqB;AAAA;AAAA;AAArB;;AAAA;;AAAA;AAn1BO;;;AAAA;AAEH;AAFG;AAAA;;;AAAA;AAGH;;AAHG;AAAA;;;AAAA;AAIH;;AAJG;AAAA;;;AAAA;AAKH;;AALG;AAAA;;;AAAA;AAMH;;AANG;AAAA;;;;AAWP;AA00B4B;AAAA;;AAAA;AAAA;AAAA;;AAAA;AA1uBrB;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAP;AAEI;;AAAA;AAAA;AAAA;;AA9BG;;;AAAA;;AAEH;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;;AAYP;AAoBG;AAAiB;AAAjB;AAAX;;;AACuB;;AAAA;;;AAAA;AAAJ;AAAP;AA6dG;AAAA;AAAA;AAAA;AAAA;AAAP;AACO;AAAA;;AAAA;AAAA;AAAA;AAAP;AAGgC;;AAAA;AAAA;AAAA;AAnCb;AAAA;;AAAA;;AACnB;AAGA;;AAAA;;AAAA;AAmC8B;;AAAA;;AAAA;AA9B1B;AAAA;;AAAA;AADJ;AAKA;;AAAA;;AAAA;AAEA;AAIQ;;AAFW;;AACF;;;;;;;;AAHjB;;;;;;AAAA;AA4BmB;AAAA;;AAAA;AAAnB;;AAAA;AAAA;AACA;;AAA4B;AAA5B;AAGA;;AAAA;;AAAA;AAG6B;AAAA;;AAAA;AAA7B;;AAAA;;AAAA;AACqB;;AAAA;;AAAA;AAArB;;AAAA;;AAAA;AACiC;;AAAA;AAAA;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;AAGA;;AAAA;;AAAA;AACoC;;AAAA;;;AAAA;AAApC;;AAAA;AAAA;AAC6B;;AAAA;;AAAA;AAA7B;;AAAA;AAAA;AAGwB;;AAAA;;AAAA;AAAxB;;AAAA;AAAA;AAG6B;;AAAA;AAAA;AAA7B;;AAAA;AAAA;AACiC;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;AACyB;;AAAA;;AAAA;AAAzB;;AAAA;AAAA;AAC6B;;AAAA;;AAAA;AAA7B;;AAAA;AAAA;AACwB;;AAAA;;AAAA;AAAxB;;AAAA;AAAA;AACsB;;AAAA;;AAAA;AAAtB;;AAAA;AAAA;AACuB;;AAAA;;AAAA;AAAvB;;AAAA;AAAA;AAC4B;;AAAA;;;AAAA;AAA5B;;AAAA;AAAA;AAC0B;;AAAA;;;AAAA;AAA1B;;AAAA;AAAA;AAGyB;;AAAA;;AAAA;AAAzB;;AAAA;AAAA;AAGoB;;AAAA;AAAA;AAApB;AAAA;AAAA;AAGiC;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;AACkC;;AAAA;;AAAA;AAAlC;;AAAA;AAAA;AAGA;;AAAyB;AAAzB;AACA;;AAA0B;AAA1B;AAEO;;AAA8B;;AAA9B;AAAP;AACqC;AAAA;AAAA;AAA9B;;AAAA;AAAP;AACO;AAAP;AAiNuB;;AAAA;;;AAAvB;;AAAA;AAAA;AACsB;;AAAA;;;AAAtB;;AAAA;AAAA;AACO;;AAxCV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;;;;;;;;AA0CA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAgCG;;;AAGkB;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAxOX;AAAA;AAAA;AAAA;AAAA;AAAP;AACO;AAAwB;;AAAxB;AAAP;AAGO;AAAA;;AAAA;AAAA;AAAP;AAEc;AAAsB;;AAAtB;AAAA;AAOU;;AAAd;AADF;;AAAA;AAFR;AAAA;;;AAMQ;AACF;AAAA;;AAAA;AAAd;;;AACoB;;AAAA;;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AACW;AADX;AACW;AAAA;AAAA;;AAAA;;AACZ;AAAA;AAAA;AAAA;AAAA;;AAAkB;;AAAA;;AAAA;AAAlB;;AAAA;AAAP;AACA;;AAAA;;AAAA;;;AAGO;AAAA;;AAAA;AAAA;AAAA;;AAAP;AACZ;;;AACA;AAAA;;;AACmD;AAAQ;AAAR;AAAd;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAejB;;AAAA;AAAA;;AAAA;AADJ;AAGhB;;AAAA;;;AACuB;;AAAoB;AAApB;AAAP;AAGJ;AAAS;AAAT;AAAA;;;;;AAjBQ;;AAAA;AAAA;AAC4C;AAAtB;AAElB;AAAuB;;AAAvB;AAAA;AAAA;AAAA;AAAA;;AADJ;AAGgB;AAAA;AAAA;;AAAA;AAAA;AAChB;AAAA;AAE2B;AAAvB;AADa;;AAAA;AAAA;;AAAA;AAAA;;AAAA;;;;AA/sBV;;AAAA;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AA4tBR;;AAAA;;;AAEgB;;AAAA;;AAAA;AADJ;AAAA;AAAA;AAGA;AAAc;;AAAd;AAsLG;;AAxCV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAv6BU;AAAA;AAAA;AAAA;AAAP;AAw+BA;;;AACA;;;AACA;;;AAEO;AAAA;AAAA;AAAA;AAAoB;AAAA;AAAA;AAAA;AAApB;;AAAA;AAAP;AACQ;;;AACD;AAAA;;;AAAA;AAAoB;;;AAApB;AAAP;AAIiB;;AAAA;;;AAEM;;AAAA;;;AACA;;AAAA;;;AACW;;AAAA;;;AAEC;;AAAA;;;AACD;;AAAA;;;AACC;;AAAA;;;AACrB;;AAAA;;;AAVV;;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAMkB;AANlB;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAFJ;;;AAAA;;AAeO;;AA7CV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;AA+CA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAhgCU;AAAA;AAAA;AAAA;AAAP;AAqiCA;;;AACA;;;AAEG;;AAAA;AAAA;AAAgB;;AAAhB;AAAX;;;AA98Be;AAAA;;AAAA;AAAA;AAAsB;;AAAtB;AA+8BH;AACA;;;AAh9BG;AAAA;;AAAA;AAAA;AAAA;AAAsB;;AAAtB;AAwsBP;AACO;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAoB;AAAA;AAAA;AAAA;AAApB;AAAP;AAEwB;AAAA;;;AAAA;;AAAA;AAAA;AADxB;;;AAIuC;AAAA;AAAA;AAAA;AAzvBpB;;AAAZ;AA0vBA;;AAAA;;AACJ;AAAc;;AAAd;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAX;;;AACmB;;AAAA;AAAA;AAAA;;AAAA;AACJ;;AAAA;AAAA;AAAA;AAAA;AAAc;;AAAd;AAAP;AAKuB;;AAAA;AAAA;;;AACA;;AAAA;;;AACW;;AAAA;;;AACC;;AAAA;;;AACD;;AAAA;;;AACC;;AAAA;;;AAR/B;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AADJ;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAaA;;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAA6B;AAA7B;AAAA;AAAA;AAAA;AAkPmB;AAAA;AAAA;AAAA;AAAZ;;AAAA;AAAA;;AAAA;AAAP;AACQ;;;AAAA;AAAA;;AAEJ;AAAA;;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAn1BA;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;AAAA;;AAMH;;AANG;AAAA;;;;AAm1BP;AAGO;;AAAoB;;;AAApB;AAAP;AA30BO;;AAAe;;AAAf;AAAA;;;AAAA;;AAAqC;;AAArC;AAAA;;;;AA40Bf;;;AErnCoC;;AAAe;;AAApC;;;AAAP;AFynCA;;AAAA;;AAAA;;;AAAA;;AACO;;AAxDV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsDO;;;;;;;;;;;;;;;;AAIP;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AA1jCU;AAAA;AAAA;AAAA;AAAP;AAulCA;;;AACA;;;AACA;;;AAjmCO;AAAA;AAAA;AAAA;AAAe;;AAAf;AAYA;AAAP;AAsFO;AAAA;;AAAA;AAAA;AAAsB;;AAAtB;AA4uBP;AACO;AAAA;AAAA;AAAA;AAAA;;AAAoB;AAAA;AAAA;AAAA;AAApB;AAAA;;AAAA;AAAP;AACO;;AAAA;;;AAAA;AAAA;;AAAsB;;;AAAtB;AAAP;AACO;AAAA;;AAAA;AAAA;AAAA;;AAAgB;AAAhB;AAAP;AAER;;;AAEgB;AAAA;AAAA;AAAA;AAA4B;AAA5B;AADa;;;AAIb;;AAAA;AAAiC;;AAAA;;AAAA;AAAjC;AADJ;AAImC;AAAA;AAAA;AAAA;AApyBpB;;AAAZ;AAqyBA;;AAAA;;AACJ;AAAc;;AAAd;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAX;;;AACmB;;AAAA;AAAA;AAAA;;AAAA;AACJ;;AAAA;AAAA;AAAA;AAAA;AAAc;;AAAd;AAAP;AAKuB;;AAAA;AAAA;;;AACA;;AAAA;;;AACW;;AAAA;;;AACC;;AAAA;;;AACD;;AAAA;;;AACC;;AAAA;;;AAR/B;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AADJ;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAaA;;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAA6B;AAA7B;AAAA;AAAA;AAAA;AAuPO;;AAnCV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqCA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AEvqC+B;;AAAc;;AAAnC;;;AAAP;AForCA;;AAAA;AAAA;AACO;;AAdV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA/lCU;AAAA;AAAA;AAAA;AAAP;AAAA;AA4nC6B;AAAA;;AAAA;AAAA;AAAX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAEF;AAAA;;AAAA;AAAA;AACS;AAAA;;AAAA;AAAA;AACG;AAAA;;AAAA;AAAA;AACX;AAAA;AAAA;AAAA;AACQ;AAAA;AAAA;AAAA;AACC;AAAA;;AAAA;AAAA;AACI;AAAA;;AAAA;AAAA;AACJ;AAAA;;AAAA;AAAA;AACL;AAAA;;AAAA;AAAA;AACS;AAAA;;AAAA;AAAA;AACC;AAAA;;AAAA;AAAA;AACT;AAAA;;AAAA;AAAA;AACC;AAAA;;AAAA;AAAA;AAfhB;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAZV;AAAA;AAAA;AAAA;AAAA;AAAA;AA/mCU;AAAA;AAAA;AAAA;AAAP;AAypCG;AAAA;AAAA;AAAA;AAAqB;AAAA;AAAA;AAAA;AAArB;AAAX;;;AAEyB;AAAA;AAAA;AAAA;AADN;AAEQ;;AAFR;AAGY;AAHZ;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAbd;AAAA;AAAA;AAAA;AAAA;AAAA;AAwBmC;AAAA;AAAA;AAAA;AAAzB;;;AAxBV;;;AE7nCG;;;AAdH;AAAA;AAgBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAcG;;;AACA;;AAAA;AAAA;AACO;;AAhBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAcG;;;AACA;;AAAA;AAAA;AACO;;AAhBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAsBG;;;AACA;;;AACwB;AAAA;;AAAxB;;;AA1Hc;;AAAX;AAAX;;;AACY;;AAAA;;AAAA;AA2HG;;AA1BV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA9FM;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAqHJ;;;AAnHG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAiHJ;;;AA/GG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AA6GJ;;;AA3GG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAyGJ;;;AAvGG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;;;;AAwGP;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAmBG;;;AACA;;;AACwB;AAAA;;AAAxB;;;AA1HO;AAAW;;AAAX;AAAP;AACc;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAyHG;;AAvBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAhGM;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAoHJ;;;AAlHG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAgHJ;;;AA9GG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AA4GJ;;;AA1GG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;;;;AA2GP;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAhL+B;;AAAgB;;AAArC;;;AAAP;AAgMA;;AAAA;AAAA;AACO;;AAjBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA8BU;AAAA;;AAAA;AAAA;AAXV;AAAA;AAAA;AAAA;AAAA;AAAA;AAaA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAkB4B;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AAtBP;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAyBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAkBU;AACP;AAAA;;;AAES;;;;;;;;AADT;;AAAA;;;;;;;;;;;;;;AA+BQ;AAJI;;AA9SL;;AAAA;AAAA;AAAA;AAAA;;AA6SC;AAGO;AAAA;AAjDlB;AAAA;AAAA;AAAA;AAAA;AAAA;AA0Ce;;AAzSL;;AAAA;AAAA;AAAA;AAAA;;AAwSC;AAGO;AAAA;AA5ClB;;;AAqCe;;AApSL;;AAAA;AAAA;AAAA;AAAA;;AAmSC;AAGO;AAAA;AAvClB;;;AAgCe;;AA/RL;;AAAA;AAAA;AAAA;AAAA;;AA8RC;AAGO;AAAA;AAlClB;;;AA2Be;;AA1RL;;AAAA;AAAA;AAAA;AAAA;;AAyRC;AAGO;AAAA;AA7BlB;;;AAsBkB;;;;;;;;;;;;;;;;;;AAtBlB;;;AH5RD;;;AAEe;;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAJ;AAAP;;AAgBJ;;;AApB8B;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAqCW;AAAA;AAAA;AAIM;AAAA;;AAAA;AAAA;AAAiC;;AAAA;;AAAA;AAAjC;AAEb;AAAA;;AAAA;AAAA;AAAkC;;AAAA;;AAAA;AAAlC;AAMgB;;AAAA;AAAA;AAAgB;AAAA;;AAAA;AAAA;AADf;;AAAA;;AAAA;;AAAA;;;AAIgB;AAAA;;AAAA;AAAA;AADf;;AAAA;;AAAA;;AAAA;;;AAMtB;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAI+B;AAAA;;AAAA;AAAA;AAA/B;AAAA;;AACgC;AAAA;;AAAA;AAAA;AAAhC;AAAA;;AAG0B;AAAA;AAAA;AAAA;AAA1B;AAAA;;AAIA;;AAAA;AAAA;AACA;AAEJ;;;;;;AAzE8B;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;ACkHO;AAAA;AAAA;AAAA;AAAe;;AAAf;ADtCf;;;AACY;AAEO;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AACR;;AAAA;AAAA;AAAA;;AAAX;;;AACY;AAGJ;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAC0B;AAA1B;AAAA;;AACA;;AAAA;AAAA;AACO;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;AAAA;AAAA;;AAAA;AAAA;;AC4CJ;;;AAIO;;AAAA;;;AAAA;;AAAA;;;AACQ;AAAP;AACQ;;AAAA;;AAAA;AACL;;AAAA;AAAP;AAEJ;;;AAEJ;;AAAA;;;AACmB;AAAP;AACG;AAAA;;AAAA;AAAA;AAAP;AAAA;AACoC;AAAA;;AAAA;AAAA;AAA7B;;AAAA;AAAA;;AAAA;;;AAAP;AAEJ;;;AAOJ;;AAAA;;;AACmB;AAAP;AAEA;AAAA;;AAAA;AAAA;AAEA;AAAA;;AAAA;AAAA;AAHG;;AAAA;AAAA;;;AAAP;AAwBJ;;;AAEsB;AAAA;AAAA;AAAA;AAAX;;AAAA;AAAP;AAdO;;AAAY;;AAAZ;AAgBA;AAAc;;AAAd;AAAA;AAAA;AAAA;AAAA;;AAAP;AAZO;;AAAW;;AAAX;AAeS;;AAAA;AAAA;;AAAA;AAAA;AAAT;;AAAA;AAAP;AACO;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAP;AAuGJ;;;AA1DO;;AARC;AAQD;AAAA;;;AAAA;;AAPC;AAOD;AAAA;;;AAAA;;AANC;;AAMD;AAAA;;;AAAA;;AALC;;AAKD;AAAA;;;AAAA;;AAJC;;AAID;AAAA;;;AACQ;AA6DX;;AA1DR;;AAAA;;;AAEmB;AAwDJ;;;AAtDJ;;AAAiB;;AAAjB;AAAA;;;AAAyC;;AAAiB;;AAAjB;AAAzC;;;AAIQ;;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;;AAkDJ;;;;AAAA;;;AA7CJ;;AAAiB;AAAjB;AAAX;;;AAEmB;;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;;AA2CJ;;;;AAAA;;;AArCJ;;AAAiB;;AAAjB;AAAX;;;AAEmB;;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;;AAmCJ;;;;AAAA;;;AA5BJ;;AAAiB;;AAAjB;AAAX;;;AAEmB;;AAAc;;AAAd;AA0BJ;;;AAxBA;AAwBA;;;AAkBH;AAAA;;AAAA;AAAA;AAAsB;AAAtB;AAAA;;;AACI;AAAA;;AAAA;AAAA;AADJ;;;;AADJ;;AAAA;AA8CJ;;;AASQ;;AAAA;;AAAA;AAAA;AAAA;;;AACG;AAAA;;AAAA;AAAA;AADH;;;AAEG;AAAA;;AAAA;AAAA;AAFH;;;AAIO;AAAP;;AAAA;;AAAA;AAEA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAHM;;;AAQN;AAAA;;AAAA;AAAA;AAHG;;AAAA;AAAA;;;AAAP;;AAAA;;AAAA;AA+DJ;;;AAMJ;;AAAA;;;AACY;;AAAA;AACU;AAAA;;AAAA;AAAA;AACV;AAAA;;AAAA;AAAA;AADmC;;AAAA;;AAAA;;;AAAzB;AAKd;AAAA;AAGI;AAAA;;AAAA;AAAA;AAFG;;AAAA;AAAA;;AAAA;;;AAAP;AAyIJ;;;;;;;;AAUW;;AAAA;AAAA;AAAkB;AAAA;AAAA;AAAA;AAAlB;AAAP;AACO;;AAAA;;AAAA;AAAwB;;AAAxB;AAAP;AAEa;;AAAA;AAAA;AAAA;AACI;AAAd;AAAA;AAAX;;;AA5ee;AAAA;AAAA;AAAA;AAAe;;AAAf;AA+eH;AAEI;AAAA;;AAAA;AAAA;AAA6B;AAAA;;AAAA;AAAA;AAA7B;AADJ;AAG6B;;AAAA;;AAAA;AAA7B;;AAAA;;AAAA;AACA;;AAAA;AAAA;AAC6B;;AAAA;;AAAA;AAA7B;;AAAA;AAAA;AACA;;AAAwB;AAAxB;AACiC;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAqB;AAArB;AAAA;AAAA;AAAA;AACA;AAAc;;AAAd;AA7LJ;;AAAA;AACO;AAAA;;AAAA;AAAA;AA6LH;;AAAA;AAGmB;AAHnB;;;;AAAA;;AAKA;;AAAA;;AAAA;;AAAA;AA/fG;AAAA;AAAA;AAAA;AAAe;;AAAf;AAYA;AAAP;AAsfA;AAAA;;AAAA;AAAA;AAAyB;;AAAA;;;AAAA;;AAAzB;AAAA;;AAAA;AAAA;AAEG;;AAAc;;AAAd;AAAX;;;AAIgB;;AAAA;;AAAA;AACA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAHY;;;AAMI;AAAA;;AAAA;AAAA;AAAhB;AAAA;;AAiFL;AAAA;;AAAA;AAAA;AAAA;;;AAAqC;AAAA;;AAAA;AAAA;AAAP;;AAAA;AAA9B;;;AACQ;AAAA;;AAAA;AAAA;AAAA;;AAAA;AACR;AAAA;;AAAA;AAAA;AAAA;;;AAAmC;AAAA;;AAAA;AAAA;AAAP;;AAAA;AAA5B;;;AACQ;AAAA;;AAAA;AAAA;AAAA;;AAAA;AArFP;;AAAA;;AAAA;AAYD;;AAAc;;AAAd;AAAX;;;AACyC;;AAAA;;AAAA;AAA7B;;AAAA;;AAAA;AACA;;AAAA;AAAA;AAKD;;;AAAX;;;AACe;;AAAc;;AAAd;AAAf;;;AAI2B;AAAA;AAAA;AAAA;AAA4B;AAAA;AAAA;AAAA;AAA5B;AACD;;AADA;AADF;;AAAA;AAFR;AAAA;;;AA9LU;AAAA;;AAAA;AAAA;AAAA;;AAAA;AACJ;AAAd;;AACwB;AAAxB;;AAEG;;AAAA;;AAAA;AAAA;AAAA;;AAAX;;;AAE8B;;AAAA;;AAAA;;;AAAA;AAAA;;AAKM;AAAxB;;;;AAEc;AAAA;AAAA;AAAA;AAAoB;AAApB;AAAA;;AACM;AAAA;AAAA;AAAA;AAAlB;;AAAA;AAAd;;;AAC2B;;AAAA;;;AAAA;AAAA;;AACK;AAAA;AAAA;AAAA;;AAEuB;;AAArB;AAAA;;;AAClB;;AAAqB;;AAArB;AAAA;;;AACI;;AAAA;;AAAA;AADJ;;;;AAGhB;;;AACA;;AAAA;;;AAC4C;AAAxB;;AAOR;;AAAmB;AAAnB;AAAA;;;;;AAHY;;AAAA;;AAAA;AAFc;;AAAA;AAAA;;;AAAA;AAAA;;AAIlB;;AAAA;AAAA;;;;;;;;;AAGZ;;AAAA;AACY;AAAA;;AAAA;AAAA;AACT;;AAAA;;AAAA;AAAc;AAAd;AAAX;;;AAEyB;AAAA;;AAAA;AAAA;AAAb;AAGA;AAAA;;AAAA;AAAA;AAFG;;AAAA;;;AA+JC;;AAAA;AAAA;AAKR;AAAA;AAAA;AAAA;AAAqB;AAArB;AAAA;AAAA;AAAA;AACA;;AAEW;AACQ;AAHnB;;;;AAAA;;;;;;;;;AAFqC;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;;;;AAjBC;;AAAc;;AAAd;AAAb;;;AAE6C;AAAA;;AAAA;AAAA;AAAjC;;AAAA;AAAA;;;;AAdC;;AAAc;;AAAd;AAAb;;;AACwB;;AAAA;;AAAA;AAAA;AAAA;;AACxB;;;AAC4B;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAChB;;AAAA;;AAAA;;;;AAEG;;AAAA;;AAAA;AAAA;AAAA;;AAAf;;;AACgB;;AAAA;;AAAA;;;;AAkCZ;;;AAUwB;;AACH;;AAAA;AAAA;AACE;;AAAA;;;AACI;;AAAA;;;AACJ;;AAGW;;AALX;AAKW;AA6BtC;;AAAA;;;AACmB;AA/BS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAIA;AAAA;;AAAA;AAAA;AACH;;AAAA;AAAiB;AAAjB;AAZb;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AADJ;;;;;;AAAA;AAAA;AAAA;;;;;;AAwCG;;AAAe;AAAf;AAAA;;;AAAA;;AAAsC;;AAAtC;AAAA;;;AACQ;AAhCC;;;AAiCL;;;AAjCK;;;AE1pBhB;;;;;AAFW;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAGA;;;AACH;;AAAA;AAAA;AAAA;AAAA;AACG;;AAAA;AAAA;;AADH;AAAA;;;AAEG;;AAAA;AAAA;AAAA;AAAA;AADA;;AAAA;AADH;;;;AADJ;;AAAA;;;;;AAOyB;;AAbF;AAAA;;AAAA;AAAA;AAAhB;AAaP;;AAkBW;AAAA;;AAAA;AAAA;AAAJ;AAAP;;AAGW;AAAA;;AAAA;AAAA;AAAJ;AAAP;;AAEJ;;;AACW;;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;AAAA;;AAMH;;AANG;AAAA;;;AAAA;;AAOH;;AAPG;AAAA;;;;AAAP;;;", "op_pc_offset": 0, "pc_events": { "1": { @@ -19,9 +19,9 @@ "op": "intcblock 0 1 8 32 1500" }, "9": { - "op": "bytecblock 0x151f7c75 \"status\" \"event_cursor\" \"schedule_entry_count\" \"outstanding_principal\" \"fixed_point_scale\" \"accrued_interest\" \"interest_calculation_base\" 0x4123 \"nominal_interest_rate\" \"contract_type\" \"reserved_units_total\" \"reserved_principal\" \"total_units\" \"next_principal_redemption\" \"reserved_interest\" \"cumulative_interest_index\" \"cumulative_principal_index\" 0x523a41525223 \"settlement_asset_id\" \"initial_exchange_amount\" 0x523a41555423 0x523a50594423 0x523a4d4e4723 0x5323 0x523a4d4f4323 0x523a4f504423 \"initial_exchange_date\" \"transfer_opening_date\" \"transfer_closure_date\" \"rate_reset_floor\" \"rate_reset_cap\" 0x523a54525323 \"asset_suspended\" \"dynamic_principal_redemption\" \"rate_reset_spread\" \"rate_reset_multiplier\" \"rate_reset_next\" \"has_rate_reset_floor\" \"has_rate_reset_cap\" 0x00 \"asset_defaulted\" \"prospectus_hash\" \"prospectus_url\" \"denomination_asset_id\" \"maturity_date\" \"day_count_convention\" 0x068101 0x0000" + "op": "bytecblock 0x151f7c75 \"status\" \"event_cursor\" \"schedule_entry_count\" \"outstanding_principal\" \"fixed_point_scale\" \"accrued_interest\" \"interest_calculation_base\" 0x4123 \"nominal_interest_rate\" \"contract_type\" \"reserved_units_total\" \"reserved_principal\" \"total_units\" \"next_principal_redemption\" \"reserved_interest\" \"cumulative_interest_index\" \"cumulative_principal_index\" 0x523a41525223 \"settlement_asset_id\" \"initial_exchange_amount\" 0x523a41555423 0x523a50594423 0x523a4d4e4723 0x5323 0x523a4d4f4323 0x523a54525323 0x523a4f504423 \"initial_exchange_date\" \"transfer_opening_date\" \"transfer_closure_date\" \"rate_reset_floor\" \"rate_reset_cap\" \"asset_suspended\" \"dynamic_principal_redemption\" \"rate_reset_spread\" \"rate_reset_multiplier\" \"rate_reset_next\" \"has_rate_reset_floor\" \"has_rate_reset_cap\" 0x00 \"asset_defaulted\" \"prospectus_hash\" \"prospectus_url\" \"denomination_asset_id\" \"maturity_date\" \"day_count_convention\" \"defaulted\" 0x068101 0x0000" }, - "776": { + "786": { "op": "txn ApplicationID", "defined_out": [ "tmp%0#0" @@ -30,11 +30,11 @@ "tmp%0#0" ] }, - "778": { + "788": { "op": "bnz main_after_if_else@2", "stack_out": [] }, - "781": { + "791": { "op": "bytec 18 // 0x523a41525223", "defined_out": [ "0x523a41525223" @@ -43,7 +43,7 @@ "0x523a41525223" ] }, - "783": { + "793": { "op": "global ZeroAddress", "defined_out": [ "0x523a41525223", @@ -54,12 +54,12 @@ "tmp%0#3" ] }, - "785": { + "795": { "op": "app_global_put", "stack_out": [] }, - "786": { - "op": "bytec 26 // 0x523a4f504423", + "796": { + "op": "bytec 27 // 0x523a4f504423", "defined_out": [ "0x523a4f504423" ], @@ -67,7 +67,7 @@ "0x523a4f504423" ] }, - "788": { + "798": { "op": "global ZeroAddress", "defined_out": [ "0x523a4f504423", @@ -78,11 +78,11 @@ "tmp%1#3" ] }, - "790": { + "800": { "op": "app_global_put", "stack_out": [] }, - "791": { + "801": { "op": "bytec 33 // \"asset_suspended\"", "defined_out": [ "\"asset_suspended\"" @@ -91,7 +91,7 @@ "\"asset_suspended\"" ] }, - "793": { + "803": { "op": "intc_0 // 0", "defined_out": [ "\"asset_suspended\"", @@ -102,11 +102,11 @@ "0" ] }, - "794": { + "804": { "op": "app_global_put", "stack_out": [] }, - "795": { + "805": { "op": "bytec 41 // \"asset_defaulted\"", "defined_out": [ "\"asset_defaulted\"" @@ -115,18 +115,18 @@ "\"asset_defaulted\"" ] }, - "797": { + "807": { "op": "intc_0 // 0", "stack_out": [ "\"asset_defaulted\"", "0" ] }, - "798": { + "808": { "op": "app_global_put", "stack_out": [] }, - "799": { + "809": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"" @@ -135,18 +135,18 @@ "\"status\"" ] }, - "800": { + "810": { "op": "intc_0 // 0", "stack_out": [ "\"status\"", "0" ] }, - "801": { + "811": { "op": "app_global_put", "stack_out": [] }, - "802": { + "812": { "op": "bytec 10 // \"contract_type\"", "defined_out": [ "\"contract_type\"" @@ -155,18 +155,18 @@ "\"contract_type\"" ] }, - "804": { + "814": { "op": "intc_0 // 0", "stack_out": [ "\"contract_type\"", "0" ] }, - "805": { + "815": { "op": "app_global_put", "stack_out": [] }, - "806": { + "816": { "op": "bytec 42 // \"prospectus_hash\"", "defined_out": [ "\"prospectus_hash\"" @@ -175,7 +175,7 @@ "\"prospectus_hash\"" ] }, - "808": { + "818": { "op": "pushbytes 0x", "defined_out": [ "\"prospectus_hash\"", @@ -186,11 +186,11 @@ "0x" ] }, - "810": { + "820": { "op": "app_global_put", "stack_out": [] }, - "811": { + "821": { "op": "bytec 43 // \"prospectus_url\"", "defined_out": [ "\"prospectus_url\"" @@ -199,7 +199,7 @@ "\"prospectus_url\"" ] }, - "813": { + "823": { "op": "pushbytes \"\"", "defined_out": [ "\"\"", @@ -210,11 +210,11 @@ "\"\"" ] }, - "815": { + "825": { "op": "app_global_put", "stack_out": [] }, - "816": { + "826": { "op": "bytec 44 // \"denomination_asset_id\"", "defined_out": [ "\"denomination_asset_id\"" @@ -223,18 +223,18 @@ "\"denomination_asset_id\"" ] }, - "818": { + "828": { "op": "intc_0 // 0", "stack_out": [ "\"denomination_asset_id\"", "0" ] }, - "819": { + "829": { "op": "app_global_put", "stack_out": [] }, - "820": { + "830": { "op": "bytec 19 // \"settlement_asset_id\"", "defined_out": [ "\"settlement_asset_id\"" @@ -243,19 +243,19 @@ "\"settlement_asset_id\"" ] }, - "822": { + "832": { "op": "intc_0 // 0", "stack_out": [ "\"settlement_asset_id\"", "0" ] }, - "823": { + "833": { "op": "app_global_put", "stack_out": [] }, - "824": { - "op": "bytec 27 // \"initial_exchange_date\"", + "834": { + "op": "bytec 28 // \"initial_exchange_date\"", "defined_out": [ "\"initial_exchange_date\"" ], @@ -263,18 +263,18 @@ "\"initial_exchange_date\"" ] }, - "826": { + "836": { "op": "intc_0 // 0", "stack_out": [ "\"initial_exchange_date\"", "0" ] }, - "827": { + "837": { "op": "app_global_put", "stack_out": [] }, - "828": { + "838": { "op": "bytec 45 // \"maturity_date\"", "defined_out": [ "\"maturity_date\"" @@ -283,19 +283,19 @@ "\"maturity_date\"" ] }, - "830": { + "840": { "op": "intc_0 // 0", "stack_out": [ "\"maturity_date\"", "0" ] }, - "831": { + "841": { "op": "app_global_put", "stack_out": [] }, - "832": { - "op": "bytec 28 // \"transfer_opening_date\"", + "842": { + "op": "bytec 29 // \"transfer_opening_date\"", "defined_out": [ "\"transfer_opening_date\"" ], @@ -303,19 +303,19 @@ "\"transfer_opening_date\"" ] }, - "834": { + "844": { "op": "intc_0 // 0", "stack_out": [ "\"transfer_opening_date\"", "0" ] }, - "835": { + "845": { "op": "app_global_put", "stack_out": [] }, - "836": { - "op": "bytec 29 // \"transfer_closure_date\"", + "846": { + "op": "bytec 30 // \"transfer_closure_date\"", "defined_out": [ "\"transfer_closure_date\"" ], @@ -323,18 +323,18 @@ "\"transfer_closure_date\"" ] }, - "838": { + "848": { "op": "intc_0 // 0", "stack_out": [ "\"transfer_closure_date\"", "0" ] }, - "839": { + "849": { "op": "app_global_put", "stack_out": [] }, - "840": { + "850": { "op": "bytec 46 // \"day_count_convention\"", "defined_out": [ "\"day_count_convention\"" @@ -343,18 +343,18 @@ "\"day_count_convention\"" ] }, - "842": { + "852": { "op": "intc_0 // 0", "stack_out": [ "\"day_count_convention\"", "0" ] }, - "843": { + "853": { "op": "app_global_put", "stack_out": [] }, - "844": { + "854": { "op": "bytec 13 // \"total_units\"", "defined_out": [ "\"total_units\"" @@ -363,18 +363,18 @@ "\"total_units\"" ] }, - "846": { + "856": { "op": "intc_0 // 0", "stack_out": [ "\"total_units\"", "0" ] }, - "847": { + "857": { "op": "app_global_put", "stack_out": [] }, - "848": { + "858": { "op": "bytec 11 // \"reserved_units_total\"", "defined_out": [ "\"reserved_units_total\"" @@ -383,18 +383,18 @@ "\"reserved_units_total\"" ] }, - "850": { + "860": { "op": "intc_0 // 0", "stack_out": [ "\"reserved_units_total\"", "0" ] }, - "851": { + "861": { "op": "app_global_put", "stack_out": [] }, - "852": { + "862": { "op": "bytec 20 // \"initial_exchange_amount\"", "defined_out": [ "\"initial_exchange_amount\"" @@ -403,18 +403,18 @@ "\"initial_exchange_amount\"" ] }, - "854": { + "864": { "op": "intc_0 // 0", "stack_out": [ "\"initial_exchange_amount\"", "0" ] }, - "855": { + "865": { "op": "app_global_put", "stack_out": [] }, - "856": { + "866": { "op": "bytec 4 // \"outstanding_principal\"", "defined_out": [ "\"outstanding_principal\"" @@ -423,18 +423,18 @@ "\"outstanding_principal\"" ] }, - "858": { + "868": { "op": "intc_0 // 0", "stack_out": [ "\"outstanding_principal\"", "0" ] }, - "859": { + "869": { "op": "app_global_put", "stack_out": [] }, - "860": { + "870": { "op": "bytec 14 // \"next_principal_redemption\"", "defined_out": [ "\"next_principal_redemption\"" @@ -443,18 +443,18 @@ "\"next_principal_redemption\"" ] }, - "862": { + "872": { "op": "intc_0 // 0", "stack_out": [ "\"next_principal_redemption\"", "0" ] }, - "863": { + "873": { "op": "app_global_put", "stack_out": [] }, - "864": { + "874": { "op": "bytec 34 // \"dynamic_principal_redemption\"", "defined_out": [ "\"dynamic_principal_redemption\"" @@ -463,18 +463,18 @@ "\"dynamic_principal_redemption\"" ] }, - "866": { + "876": { "op": "intc_0 // 0", "stack_out": [ "\"dynamic_principal_redemption\"", "0" ] }, - "867": { + "877": { "op": "app_global_put", "stack_out": [] }, - "868": { + "878": { "op": "bytec 7 // \"interest_calculation_base\"", "defined_out": [ "\"interest_calculation_base\"" @@ -483,18 +483,18 @@ "\"interest_calculation_base\"" ] }, - "870": { + "880": { "op": "intc_0 // 0", "stack_out": [ "\"interest_calculation_base\"", "0" ] }, - "871": { + "881": { "op": "app_global_put", "stack_out": [] }, - "872": { + "882": { "op": "bytec 6 // \"accrued_interest\"", "defined_out": [ "\"accrued_interest\"" @@ -503,18 +503,18 @@ "\"accrued_interest\"" ] }, - "874": { + "884": { "op": "intc_0 // 0", "stack_out": [ "\"accrued_interest\"", "0" ] }, - "875": { + "885": { "op": "app_global_put", "stack_out": [] }, - "876": { + "886": { "op": "bytec 9 // \"nominal_interest_rate\"", "defined_out": [ "\"nominal_interest_rate\"" @@ -523,18 +523,18 @@ "\"nominal_interest_rate\"" ] }, - "878": { + "888": { "op": "intc_0 // 0", "stack_out": [ "\"nominal_interest_rate\"", "0" ] }, - "879": { + "889": { "op": "app_global_put", "stack_out": [] }, - "880": { + "890": { "op": "bytec 35 // \"rate_reset_spread\"", "defined_out": [ "\"rate_reset_spread\"" @@ -543,18 +543,18 @@ "\"rate_reset_spread\"" ] }, - "882": { + "892": { "op": "intc_0 // 0", "stack_out": [ "\"rate_reset_spread\"", "0" ] }, - "883": { + "893": { "op": "app_global_put", "stack_out": [] }, - "884": { + "894": { "op": "bytec 36 // \"rate_reset_multiplier\"", "defined_out": [ "\"rate_reset_multiplier\"" @@ -563,19 +563,19 @@ "\"rate_reset_multiplier\"" ] }, - "886": { + "896": { "op": "intc_0 // 0", "stack_out": [ "\"rate_reset_multiplier\"", "0" ] }, - "887": { + "897": { "op": "app_global_put", "stack_out": [] }, - "888": { - "op": "bytec 30 // \"rate_reset_floor\"", + "898": { + "op": "bytec 31 // \"rate_reset_floor\"", "defined_out": [ "\"rate_reset_floor\"" ], @@ -583,19 +583,19 @@ "\"rate_reset_floor\"" ] }, - "890": { + "900": { "op": "intc_0 // 0", "stack_out": [ "\"rate_reset_floor\"", "0" ] }, - "891": { + "901": { "op": "app_global_put", "stack_out": [] }, - "892": { - "op": "bytec 31 // \"rate_reset_cap\"", + "902": { + "op": "bytec 32 // \"rate_reset_cap\"", "defined_out": [ "\"rate_reset_cap\"" ], @@ -603,18 +603,18 @@ "\"rate_reset_cap\"" ] }, - "894": { + "904": { "op": "intc_0 // 0", "stack_out": [ "\"rate_reset_cap\"", "0" ] }, - "895": { + "905": { "op": "app_global_put", "stack_out": [] }, - "896": { + "906": { "op": "bytec 37 // \"rate_reset_next\"", "defined_out": [ "\"rate_reset_next\"" @@ -623,18 +623,18 @@ "\"rate_reset_next\"" ] }, - "898": { + "908": { "op": "intc_0 // 0", "stack_out": [ "\"rate_reset_next\"", "0" ] }, - "899": { + "909": { "op": "app_global_put", "stack_out": [] }, - "900": { + "910": { "op": "bytec 38 // \"has_rate_reset_floor\"", "defined_out": [ "\"has_rate_reset_floor\"" @@ -643,18 +643,18 @@ "\"has_rate_reset_floor\"" ] }, - "902": { + "912": { "op": "intc_0 // 0", "stack_out": [ "\"has_rate_reset_floor\"", "0" ] }, - "903": { + "913": { "op": "app_global_put", "stack_out": [] }, - "904": { + "914": { "op": "bytec 39 // \"has_rate_reset_cap\"", "defined_out": [ "\"has_rate_reset_cap\"" @@ -663,18 +663,18 @@ "\"has_rate_reset_cap\"" ] }, - "906": { + "916": { "op": "intc_0 // 0", "stack_out": [ "\"has_rate_reset_cap\"", "0" ] }, - "907": { + "917": { "op": "app_global_put", "stack_out": [] }, - "908": { + "918": { "op": "bytec 12 // \"reserved_principal\"", "defined_out": [ "\"reserved_principal\"" @@ -683,18 +683,18 @@ "\"reserved_principal\"" ] }, - "910": { + "920": { "op": "intc_0 // 0", "stack_out": [ "\"reserved_principal\"", "0" ] }, - "911": { + "921": { "op": "app_global_put", "stack_out": [] }, - "912": { + "922": { "op": "bytec 15 // \"reserved_interest\"", "defined_out": [ "\"reserved_interest\"" @@ -703,18 +703,18 @@ "\"reserved_interest\"" ] }, - "914": { + "924": { "op": "intc_0 // 0", "stack_out": [ "\"reserved_interest\"", "0" ] }, - "915": { + "925": { "op": "app_global_put", "stack_out": [] }, - "916": { + "926": { "op": "bytec 16 // \"cumulative_interest_index\"", "defined_out": [ "\"cumulative_interest_index\"" @@ -723,18 +723,18 @@ "\"cumulative_interest_index\"" ] }, - "918": { + "928": { "op": "intc_0 // 0", "stack_out": [ "\"cumulative_interest_index\"", "0" ] }, - "919": { + "929": { "op": "app_global_put", "stack_out": [] }, - "920": { + "930": { "op": "bytec 17 // \"cumulative_principal_index\"", "defined_out": [ "\"cumulative_principal_index\"" @@ -743,18 +743,18 @@ "\"cumulative_principal_index\"" ] }, - "922": { + "932": { "op": "intc_0 // 0", "stack_out": [ "\"cumulative_principal_index\"", "0" ] }, - "923": { + "933": { "op": "app_global_put", "stack_out": [] }, - "924": { + "934": { "op": "bytec_2 // \"event_cursor\"", "defined_out": [ "\"event_cursor\"" @@ -763,18 +763,18 @@ "\"event_cursor\"" ] }, - "925": { + "935": { "op": "intc_0 // 0", "stack_out": [ "\"event_cursor\"", "0" ] }, - "926": { + "936": { "op": "app_global_put", "stack_out": [] }, - "927": { + "937": { "op": "bytec_3 // \"schedule_entry_count\"", "defined_out": [ "\"schedule_entry_count\"" @@ -783,18 +783,38 @@ "\"schedule_entry_count\"" ] }, - "928": { + "938": { "op": "intc_0 // 0", "stack_out": [ "\"schedule_entry_count\"", "0" ] }, - "929": { + "939": { "op": "app_global_put", "stack_out": [] }, - "930": { + "940": { + "op": "bytec 47 // \"defaulted\"", + "defined_out": [ + "\"defaulted\"" + ], + "stack_out": [ + "\"defaulted\"" + ] + }, + "942": { + "op": "intc_0 // 0", + "stack_out": [ + "\"defaulted\"", + "0" + ] + }, + "943": { + "op": "app_global_put", + "stack_out": [] + }, + "944": { "op": "bytec 5 // \"fixed_point_scale\"", "defined_out": [ "\"fixed_point_scale\"" @@ -803,18 +823,18 @@ "\"fixed_point_scale\"" ] }, - "932": { + "946": { "op": "intc_0 // 0", "stack_out": [ "\"fixed_point_scale\"", "0" ] }, - "933": { + "947": { "op": "app_global_put", "stack_out": [] }, - "934": { + "948": { "op": "txn GlobalNumByteSlice", "defined_out": [ "tmp%0#2" @@ -823,7 +843,7 @@ "tmp%0#2" ] }, - "936": { + "950": { "op": "pushint 4", "defined_out": [ "4", @@ -834,7 +854,7 @@ "4" ] }, - "938": { + "952": { "op": "==", "defined_out": [ "tmp%1#2" @@ -843,12 +863,12 @@ "tmp%1#2" ] }, - "939": { + "953": { "error": "Wrong Global Bytes allocation", "op": "assert // Wrong Global Bytes allocation", "stack_out": [] }, - "940": { + "954": { "op": "txn GlobalNumUint", "defined_out": [ "tmp%2#1" @@ -857,18 +877,18 @@ "tmp%2#1" ] }, - "942": { - "op": "pushint 37", + "956": { + "op": "pushint 38", "defined_out": [ - "37", + "38", "tmp%2#1" ], "stack_out": [ "tmp%2#1", - "37" + "38" ] }, - "944": { + "958": { "op": "==", "defined_out": [ "tmp%3#1" @@ -877,12 +897,12 @@ "tmp%3#1" ] }, - "945": { + "959": { "error": "Wrong Global UInts allocation", "op": "assert // Wrong Global UInts allocation", "stack_out": [] }, - "946": { + "960": { "op": "txn LocalNumByteSlice", "defined_out": [ "tmp%4#1" @@ -891,7 +911,7 @@ "tmp%4#1" ] }, - "948": { + "962": { "op": "!", "defined_out": [ "tmp%5#0" @@ -900,12 +920,12 @@ "tmp%5#0" ] }, - "949": { + "963": { "error": "Wrong Local Bytes allocation", "op": "assert // Wrong Local Bytes allocation", "stack_out": [] }, - "950": { + "964": { "op": "txn LocalNumUint", "defined_out": [ "tmp%6#0" @@ -914,7 +934,7 @@ "tmp%6#0" ] }, - "952": { + "966": { "op": "!", "defined_out": [ "tmp%7#0" @@ -923,12 +943,12 @@ "tmp%7#0" ] }, - "953": { + "967": { "error": "Wrong Local UInts allocation", "op": "assert // Wrong Local UInts allocation", "stack_out": [] }, - "954": { + "968": { "block": "main_after_if_else@2", "stack_in": [], "op": "pushbytes 0x914f04eb // method \"contract_update()void\"", @@ -939,7 +959,7 @@ "Method(contract_update()void)" ] }, - "960": { + "974": { "op": "txna ApplicationArgs 0", "defined_out": [ "Method(contract_update()void)", @@ -950,11 +970,11 @@ "tmp%0#1" ] }, - "963": { + "977": { "op": "match main_contract_update_route@4", "stack_out": [] }, - "967": { + "981": { "block": "main_switch_case_next@5", "stack_in": [], "op": "txn OnCompletion", @@ -965,7 +985,7 @@ "tmp%6#0" ] }, - "969": { + "983": { "op": "!", "defined_out": [ "tmp%7#0" @@ -974,11 +994,11 @@ "tmp%7#0" ] }, - "970": { + "984": { "op": "assert", "stack_out": [] }, - "971": { + "985": { "op": "txn ApplicationID", "defined_out": [ "tmp%8#0" @@ -987,12 +1007,12 @@ "tmp%8#0" ] }, - "973": { - "op": "bz main_create_NoOp@32", + "987": { + "op": "bz main_create_NoOp@33", "stack_out": [] }, - "976": { - "op": "pushbytess 0xb44618c8 0xe7832529 0x94388723 0x6c85e3ee 0xbdd1a944 0x7c0f1812 0x14fc10ef 0x74a7297f 0x09d4fe14 0x9a9bfa85 0x85eed33d 0xab2c0fc4 0xd9f225ac 0x9883505a 0x8ea6e74c 0x02af557a 0x82f71b2d 0xef04f5d3 0xdf343550 0x3dbe80bd 0x1e3e48e7 0x010c8299 0x7406acd2 0x1a72a2ee // method \"fund_due_cashflows(uint64)(uint64,uint64,uint64,uint64,uint64)\", method \"claim_due_cashflows(address,byte[])(uint64,uint64,uint64,uint64,byte[])\", method \"transfer_set_schedule(uint64,uint64)uint64\", method \"primary_distribution(address,uint64)uint64\", method \"transfer(address,address,uint64)uint64\", method \"account_suspension(address,bool)uint64\", method \"account_open(address,address)uint64\", method \"account_update_payment_address(address,address)uint64\", method \"account_get_position(address)(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64)\", method \"contract_config((uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64),(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64),(byte[32],string))uint64\", method \"contract_schedule(uint64,bool,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[])uint64\", method \"contract_execute_ied()uint64\", method \"apply_non_cash_event(uint64,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64\", method \"append_observed_cash_event((uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64\", method \"contract_get_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)\", method \"contract_get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)\", method \"rbac_rotate_arranger(address)uint64\", method \"rbac_set_op_daemon(address)uint64\", method \"rbac_assign_role(uint8,address,(uint64,uint64))uint64\", method \"rbac_revoke_role(uint8,address)uint64\", method \"rbac_contract_suspension(bool)uint64\", method \"rbac_get_arranger()address\", method \"rbac_get_address_roles(address)(bool,bool,bool,bool,bool)\", method \"rbac_get_role_validity(uint8,address)(uint64,uint64)\"", + "990": { + "op": "pushbytess 0xb44618c8 0xe7832529 0x94388723 0x6c85e3ee 0xbdd1a944 0x7c0f1812 0x14fc10ef 0x74a7297f 0x09d4fe14 0x9a9bfa85 0x85eed33d 0xab2c0fc4 0xd9f225ac 0x9883505a 0xfb4d4428 0x8ea6e74c 0x02af557a 0x82f71b2d 0xef04f5d3 0xdf343550 0x3dbe80bd 0x1e3e48e7 0x010c8299 0x7406acd2 0x1a72a2ee // method \"fund_due_cashflows(uint64)(uint64,uint64,uint64,uint64,uint64)\", method \"claim_due_cashflows(address,byte[])(uint64,uint64,uint64,uint64,byte[])\", method \"transfer_set_schedule(uint64,uint64)uint64\", method \"primary_distribution(address,uint64)uint64\", method \"transfer(address,address,uint64)uint64\", method \"account_suspension(address,bool)uint64\", method \"account_open(address,address)uint64\", method \"account_update_payment_address(address,address)uint64\", method \"account_get_position(address)(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64)\", method \"contract_config((uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64),(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64),(byte[32],string))uint64\", method \"contract_schedule(uint64,bool,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[])uint64\", method \"contract_execute_ied()uint64\", method \"apply_non_cash_event(uint64,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64\", method \"append_observed_cash_event((uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64\", method \"contract_set_default_status(bool)uint64\", method \"contract_get_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)\", method \"contract_get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)\", method \"rbac_rotate_arranger(address)uint64\", method \"rbac_set_op_daemon(address)uint64\", method \"rbac_assign_role(uint8,address,(uint64,uint64))uint64\", method \"rbac_revoke_role(uint8,address)uint64\", method \"rbac_contract_suspension(bool)uint64\", method \"rbac_get_arranger()address\", method \"rbac_get_address_roles(address)(bool,bool,bool,bool,bool)\", method \"rbac_get_role_validity(uint8,address)(uint64,uint64)\"", "defined_out": [ "Method(account_get_position(address)(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64))", "Method(account_open(address,address)uint64)", @@ -1006,6 +1026,7 @@ "Method(contract_get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64))", "Method(contract_get_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))", "Method(contract_schedule(uint64,bool,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[])uint64)", + "Method(contract_set_default_status(bool)uint64)", "Method(fund_due_cashflows(uint64)(uint64,uint64,uint64,uint64,uint64))", "Method(primary_distribution(address,uint64)uint64)", "Method(rbac_assign_role(uint8,address,(uint64,uint64))uint64)", @@ -1034,6 +1055,7 @@ "Method(contract_execute_ied()uint64)", "Method(apply_non_cash_event(uint64,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64)", "Method(append_observed_cash_event((uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64)", + "Method(contract_set_default_status(bool)uint64)", "Method(contract_get_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))", "Method(contract_get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64))", "Method(rbac_rotate_arranger(address)uint64)", @@ -1046,7 +1068,7 @@ "Method(rbac_get_role_validity(uint8,address)(uint64,uint64))" ] }, - "1098": { + "1117": { "op": "txna ApplicationArgs 0", "defined_out": [ "Method(account_get_position(address)(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64))", @@ -1061,6 +1083,7 @@ "Method(contract_get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64))", "Method(contract_get_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))", "Method(contract_schedule(uint64,bool,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[])uint64)", + "Method(contract_set_default_status(bool)uint64)", "Method(fund_due_cashflows(uint64)(uint64,uint64,uint64,uint64,uint64))", "Method(primary_distribution(address,uint64)uint64)", "Method(rbac_assign_role(uint8,address,(uint64,uint64))uint64)", @@ -1090,6 +1113,7 @@ "Method(contract_execute_ied()uint64)", "Method(apply_non_cash_event(uint64,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64)", "Method(append_observed_cash_event((uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64)", + "Method(contract_set_default_status(bool)uint64)", "Method(contract_get_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))", "Method(contract_get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64))", "Method(rbac_rotate_arranger(address)uint64)", @@ -1103,15 +1127,15 @@ "tmp%10#0" ] }, - "1101": { - "op": "match fund_due_cashflows claim_due_cashflows transfer_set_schedule primary_distribution transfer account_suspension account_open account_update_payment_address account_get_position contract_config contract_schedule contract_execute_ied apply_non_cash_event append_observed_cash_event contract_get_state contract_get_next_due_event rbac_rotate_arranger rbac_set_op_daemon rbac_assign_role rbac_revoke_role rbac_contract_suspension rbac_get_arranger rbac_get_address_roles rbac_get_role_validity", + "1120": { + "op": "match fund_due_cashflows claim_due_cashflows transfer_set_schedule primary_distribution transfer account_suspension account_open account_update_payment_address account_get_position contract_config contract_schedule contract_execute_ied apply_non_cash_event append_observed_cash_event contract_set_default_status contract_get_state contract_get_next_due_event rbac_rotate_arranger rbac_set_op_daemon rbac_assign_role rbac_revoke_role rbac_contract_suspension rbac_get_arranger rbac_get_address_roles rbac_get_role_validity", "stack_out": [] }, - "1151": { + "1172": { "op": "err" }, - "1152": { - "block": "main_create_NoOp@32", + "1173": { + "block": "main_create_NoOp@33", "stack_in": [], "op": "pushbytes 0x956d7156 // method \"contract_create(address)uint64\"", "defined_out": [ @@ -1121,7 +1145,7 @@ "Method(contract_create(address)uint64)" ] }, - "1158": { + "1179": { "op": "txna ApplicationArgs 0", "defined_out": [ "Method(contract_create(address)uint64)", @@ -1132,14 +1156,14 @@ "tmp%11#0" ] }, - "1161": { + "1182": { "op": "match contract_create", "stack_out": [] }, - "1165": { + "1186": { "op": "err" }, - "1166": { + "1187": { "block": "main_contract_update_route@4", "stack_in": [], "op": "txn OnCompletion", @@ -1150,7 +1174,7 @@ "tmp%1#1" ] }, - "1168": { + "1189": { "op": "pushint 4 // UpdateApplication", "defined_out": [ "UpdateApplication", @@ -1161,7 +1185,7 @@ "UpdateApplication" ] }, - "1170": { + "1191": { "op": "==", "defined_out": [ "tmp%2#0" @@ -1170,7 +1194,7 @@ "tmp%2#0" ] }, - "1171": { + "1192": { "op": "txn ApplicationID", "defined_out": [ "tmp%2#0", @@ -1181,7 +1205,7 @@ "tmp%3#0" ] }, - "1173": { + "1194": { "op": "&&", "defined_out": [ "tmp%5#0" @@ -1190,14 +1214,14 @@ "tmp%5#0" ] }, - "1174": { + "1195": { "op": "assert", "stack_out": [] }, - "1175": { + "1196": { "op": "b contract_update" }, - "1178": { + "1199": { "subroutine": "_puya_lib.util.ensure_budget", "params": { "required_budget#0": "uint64", @@ -1207,7 +1231,7 @@ "stack_in": [], "op": "proto 2 0" }, - "1181": { + "1202": { "op": "frame_dig -2", "defined_out": [ "required_budget#0 (copy)" @@ -1216,7 +1240,7 @@ "required_budget#0 (copy)" ] }, - "1183": { + "1204": { "op": "pushint 10", "defined_out": [ "10", @@ -1227,7 +1251,7 @@ "10" ] }, - "1185": { + "1206": { "op": "+", "defined_out": [ "required_budget_with_buffer#0" @@ -1236,7 +1260,7 @@ "required_budget_with_buffer#0" ] }, - "1186": { + "1207": { "block": "ensure_budget_while_top@1", "stack_in": [ "required_budget_with_buffer#0" @@ -1250,7 +1274,7 @@ "required_budget_with_buffer#0" ] }, - "1188": { + "1209": { "op": "global OpcodeBudget", "defined_out": [ "required_budget_with_buffer#0", @@ -1262,7 +1286,7 @@ "tmp%1#0" ] }, - "1190": { + "1211": { "op": ">", "defined_out": [ "required_budget_with_buffer#0", @@ -1273,16 +1297,16 @@ "tmp%2#0" ] }, - "1191": { + "1212": { "op": "bz ensure_budget_after_while@6", "stack_out": [ "required_budget_with_buffer#0" ] }, - "1194": { + "1215": { "op": "itxn_begin" }, - "1195": { + "1216": { "op": "pushint 6 // appl", "defined_out": [ "appl", @@ -1293,13 +1317,13 @@ "appl" ] }, - "1197": { + "1218": { "op": "itxn_field TypeEnum", "stack_out": [ "required_budget_with_buffer#0" ] }, - "1199": { + "1220": { "op": "pushint 5 // DeleteApplication", "defined_out": [ "DeleteApplication", @@ -1310,14 +1334,14 @@ "DeleteApplication" ] }, - "1201": { + "1222": { "op": "itxn_field OnCompletion", "stack_out": [ "required_budget_with_buffer#0" ] }, - "1203": { - "op": "bytec 47 // 0x068101", + "1224": { + "op": "bytec 48 // 0x068101", "defined_out": [ "0x068101", "required_budget_with_buffer#0" @@ -1327,26 +1351,26 @@ "0x068101" ] }, - "1205": { + "1226": { "op": "itxn_field ApprovalProgram", "stack_out": [ "required_budget_with_buffer#0" ] }, - "1207": { - "op": "bytec 47 // 0x068101", + "1228": { + "op": "bytec 48 // 0x068101", "stack_out": [ "required_budget_with_buffer#0", "0x068101" ] }, - "1209": { + "1230": { "op": "itxn_field ClearStateProgram", "stack_out": [ "required_budget_with_buffer#0" ] }, - "1211": { + "1232": { "op": "frame_dig -1", "defined_out": [ "fee_source#0 (copy)", @@ -1357,23 +1381,23 @@ "fee_source#0 (copy)" ] }, - "1213": { + "1234": { "op": "switch ensure_budget_switch_case_0@3 ensure_budget_switch_case_1@4", "stack_out": [ "required_budget_with_buffer#0" ] }, - "1219": { + "1240": { "block": "ensure_budget_switch_case_next@5", "stack_in": [ "required_budget_with_buffer#0" ], "op": "itxn_submit" }, - "1220": { + "1241": { "op": "b ensure_budget_while_top@1" }, - "1223": { + "1244": { "block": "ensure_budget_switch_case_1@4", "stack_in": [ "required_budget_with_buffer#0" @@ -1387,16 +1411,16 @@ "tmp%3#0" ] }, - "1225": { + "1246": { "op": "itxn_field Fee", "stack_out": [ "required_budget_with_buffer#0" ] }, - "1227": { + "1248": { "op": "b ensure_budget_switch_case_next@5" }, - "1230": { + "1251": { "block": "ensure_budget_switch_case_0@3", "stack_in": [ "required_budget_with_buffer#0" @@ -1410,16 +1434,16 @@ "0" ] }, - "1231": { + "1252": { "op": "itxn_field Fee", "stack_out": [ "required_budget_with_buffer#0" ] }, - "1233": { + "1254": { "op": "b ensure_budget_switch_case_next@5" }, - "1236": { + "1257": { "block": "ensure_budget_after_while@6", "stack_in": [ "required_budget_with_buffer#0" @@ -1427,7 +1451,7 @@ "retsub": true, "op": "retsub" }, - "1237": { + "1258": { "subroutine": "modules.payment_agent.PaymentAgent.fund_due_cashflows[routing]", "params": {}, "block": "fund_due_cashflows", @@ -1437,14 +1461,14 @@ "entry#0" ] }, - "1238": { + "1259": { "op": "pushbytes \"\"", "stack_out": [ "entry#0", "event_type#0" ] }, - "1240": { + "1261": { "op": "dupn 13", "stack_out": [ "entry#0", @@ -1464,7 +1488,7 @@ "values%0#0" ] }, - "1242": { + "1263": { "op": "txna ApplicationArgs 1", "defined_out": [ "tmp%0#0" @@ -1488,7 +1512,7 @@ "tmp%0#0" ] }, - "1245": { + "1266": { "op": "dup", "defined_out": [ "tmp%0#0", @@ -1514,7 +1538,7 @@ "tmp%0#0 (copy)" ] }, - "1246": { + "1267": { "op": "len", "defined_out": [ "len%0#0", @@ -1540,7 +1564,7 @@ "len%0#0" ] }, - "1247": { + "1268": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -1568,7 +1592,7 @@ "8" ] }, - "1248": { + "1269": { "op": "==", "defined_out": [ "eq%0#0", @@ -1594,7 +1618,7 @@ "eq%0#0" ] }, - "1249": { + "1270": { "error": "invalid number of bytes for arc4.uint64", "op": "assert // invalid number of bytes for arc4.uint64", "stack_out": [ @@ -1616,7 +1640,7 @@ "tmp%0#0" ] }, - "1250": { + "1271": { "op": "btoi", "defined_out": [ "max_event_count#0" @@ -1640,7 +1664,7 @@ "max_event_count#0" ] }, - "1251": { + "1272": { "op": "intc_0 // 0", "stack_out": [ "entry#0", @@ -1662,7 +1686,7 @@ "0" ] }, - "1252": { + "1273": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"", @@ -1690,7 +1714,7 @@ "\"status\"" ] }, - "1253": { + "1274": { "op": "app_global_get_ex", "defined_out": [ "max_event_count#0", @@ -1718,7 +1742,7 @@ "maybe_exists%0#0" ] }, - "1254": { + "1275": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ @@ -1741,7 +1765,7 @@ "maybe_value%0#0" ] }, - "1255": { + "1276": { "error": "D-ASA not configured", "op": "assert // D-ASA not configured", "stack_out": [ @@ -1763,19 +1787,19 @@ "max_event_count#0" ] }, - "1256": { + "1277": { "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", "op": "callsub _assert_caller_is_arranger" }, - "1259": { + "1280": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", "op": "callsub _assert_is_not_asset_defaulted" }, - "1262": { + "1283": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_suspended", "op": "callsub _assert_is_not_asset_suspended" }, - "1265": { + "1286": { "op": "intc_0 // 0", "stack_out": [ "entry#0", @@ -1797,7 +1821,7 @@ "0" ] }, - "1266": { + "1287": { "op": "bytec_1 // \"status\"", "stack_out": [ "entry#0", @@ -1820,7 +1844,7 @@ "\"status\"" ] }, - "1267": { + "1288": { "op": "app_global_get_ex", "stack_out": [ "entry#0", @@ -1843,7 +1867,7 @@ "maybe_exists%0#0" ] }, - "1268": { + "1289": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ @@ -1866,7 +1890,7 @@ "maybe_value%0#0" ] }, - "1269": { + "1290": { "op": "pushint 50", "defined_out": [ "50", @@ -1894,7 +1918,7 @@ "50" ] }, - "1271": { + "1292": { "op": "==", "defined_out": [ "max_event_count#0", @@ -1920,7 +1944,7 @@ "tmp%0#1" ] }, - "1272": { + "1293": { "op": "!", "defined_out": [ "max_event_count#0", @@ -1947,7 +1971,7 @@ "tmp%1#4" ] }, - "1273": { + "1294": { "error": "IED not yet executed", "op": "assert // IED not yet executed", "stack_out": [ @@ -1969,7 +1993,7 @@ "max_event_count#0" ] }, - "1274": { + "1295": { "callsub": "modules.actus_kernel.ActusKernelModule._is_dynamic_annuity", "op": "callsub _is_dynamic_annuity", "stack_out": [ @@ -1992,7 +2016,7 @@ "tmp%0#1" ] }, - "1277": { + "1298": { "op": "bz fund_due_cashflows_after_if_else@3", "stack_out": [ "entry#0", @@ -2013,7 +2037,7 @@ "max_event_count#0" ] }, - "1280": { + "1301": { "op": "dup", "stack_out": [ "entry#0", @@ -2035,7 +2059,7 @@ "max_event_count#0" ] }, - "1281": { + "1302": { "op": "pushint 100", "defined_out": [ "100", @@ -2063,7 +2087,7 @@ "100" ] }, - "1283": { + "1304": { "op": "*", "defined_out": [ "max_event_count#0", @@ -2090,7 +2114,7 @@ "tmp%1#1" ] }, - "1284": { + "1305": { "op": "intc 4 // 1500", "defined_out": [ "1500", @@ -2119,7 +2143,7 @@ "1500" ] }, - "1286": { + "1307": { "op": "+", "defined_out": [ "max_event_count#0", @@ -2146,7 +2170,7 @@ "tmp%2#1" ] }, - "1287": { + "1308": { "op": "intc_0 // 0", "stack_out": [ "entry#0", @@ -2169,7 +2193,7 @@ "0" ] }, - "1288": { + "1309": { "callsub": "_puya_lib.util.ensure_budget", "op": "callsub ensure_budget", "stack_out": [ @@ -2191,7 +2215,7 @@ "max_event_count#0" ] }, - "1291": { + "1312": { "block": "fund_due_cashflows_after_if_else@3", "stack_in": [ "entry#0", @@ -2235,7 +2259,7 @@ "processed_events#0" ] }, - "1292": { + "1313": { "op": "bury 5", "defined_out": [ "processed_events#0" @@ -2259,7 +2283,7 @@ "max_event_count#0" ] }, - "1294": { + "1315": { "op": "intc_0 // 0", "defined_out": [ "funded_interest#0", @@ -2285,7 +2309,7 @@ "funded_interest#0" ] }, - "1295": { + "1316": { "op": "bury 14", "defined_out": [ "funded_interest#0", @@ -2310,7 +2334,7 @@ "max_event_count#0" ] }, - "1297": { + "1318": { "op": "intc_0 // 0", "defined_out": [ "funded_interest#0", @@ -2337,7 +2361,7 @@ "funded_principal#0" ] }, - "1298": { + "1319": { "op": "bury 13", "defined_out": [ "funded_interest#0", @@ -2363,7 +2387,7 @@ "max_event_count#0" ] }, - "1300": { + "1321": { "block": "fund_due_cashflows_while_top@4", "stack_in": [ "entry#0", @@ -2407,7 +2431,7 @@ "processed_events#0" ] }, - "1302": { + "1323": { "op": "dig 1", "defined_out": [ "max_event_count#0", @@ -2434,7 +2458,7 @@ "max_event_count#0" ] }, - "1304": { + "1325": { "op": "<", "defined_out": [ "max_event_count#0", @@ -2461,7 +2485,7 @@ "tmp%3#1" ] }, - "1305": { + "1326": { "op": "bz fund_due_cashflows_after_while@11", "stack_out": [ "entry#0", @@ -2482,7 +2506,7 @@ "max_event_count#0" ] }, - "1308": { + "1329": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -2509,7 +2533,7 @@ "0" ] }, - "1309": { + "1330": { "op": "bytec_2 // \"event_cursor\"", "defined_out": [ "\"event_cursor\"", @@ -2538,7 +2562,7 @@ "\"event_cursor\"" ] }, - "1310": { + "1331": { "op": "app_global_get_ex", "defined_out": [ "max_event_count#0", @@ -2567,7 +2591,7 @@ "maybe_exists%0#0" ] }, - "1311": { + "1332": { "error": "check self.event_cursor exists", "op": "assert // check self.event_cursor exists", "stack_out": [ @@ -2590,7 +2614,7 @@ "maybe_value%0#0" ] }, - "1312": { + "1333": { "op": "intc_0 // 0", "stack_out": [ "entry#0", @@ -2613,7 +2637,7 @@ "0" ] }, - "1313": { + "1334": { "op": "bytec_3 // \"schedule_entry_count\"", "defined_out": [ "\"schedule_entry_count\"", @@ -2644,7 +2668,7 @@ "\"schedule_entry_count\"" ] }, - "1314": { + "1335": { "op": "app_global_get_ex", "defined_out": [ "max_event_count#0", @@ -2675,7 +2699,7 @@ "maybe_exists%1#0" ] }, - "1315": { + "1336": { "error": "check self.schedule_entry_count exists", "op": "assert // check self.schedule_entry_count exists", "stack_out": [ @@ -2699,7 +2723,7 @@ "maybe_value%1#0" ] }, - "1316": { + "1337": { "op": "<", "defined_out": [ "max_event_count#0", @@ -2726,7 +2750,7 @@ "tmp%4#0" ] }, - "1317": { + "1338": { "op": "bz fund_due_cashflows_after_while@11", "stack_out": [ "entry#0", @@ -2747,7 +2771,7 @@ "max_event_count#0" ] }, - "1320": { + "1341": { "op": "intc_0 // 0", "stack_out": [ "entry#0", @@ -2769,7 +2793,7 @@ "0" ] }, - "1321": { + "1342": { "op": "bytec_2 // \"event_cursor\"", "stack_out": [ "entry#0", @@ -2792,7 +2816,7 @@ "\"event_cursor\"" ] }, - "1322": { + "1343": { "op": "app_global_get_ex", "defined_out": [ "max_event_count#0", @@ -2821,7 +2845,7 @@ "maybe_exists%2#0" ] }, - "1323": { + "1344": { "error": "check self.event_cursor exists", "op": "assert // check self.event_cursor exists", "stack_out": [ @@ -2844,7 +2868,7 @@ "maybe_value%2#0" ] }, - "1324": { + "1345": { "callsub": "modules.actus_kernel.ActusKernelModule._get_schedule_entry", "op": "callsub _get_schedule_entry", "defined_out": [ @@ -2872,7 +2896,7 @@ "entry#0" ] }, - "1327": { + "1348": { "op": "dup", "stack_out": [ "entry#0", @@ -2895,7 +2919,7 @@ "entry#0" ] }, - "1328": { + "1349": { "op": "bury 17", "defined_out": [ "entry#0", @@ -2922,7 +2946,7 @@ "entry#0" ] }, - "1330": { + "1351": { "op": "pushint 9", "defined_out": [ "9", @@ -2951,7 +2975,7 @@ "9" ] }, - "1332": { + "1353": { "op": "extract_uint64", "defined_out": [ "entry#0", @@ -2979,7 +3003,7 @@ "values%0#0" ] }, - "1333": { + "1354": { "op": "dup", "stack_out": [ "entry#0", @@ -3002,7 +3026,7 @@ "values%0#0" ] }, - "1334": { + "1355": { "op": "bury 3", "defined_out": [ "entry#0", @@ -3030,7 +3054,7 @@ "values%0#0" ] }, - "1336": { + "1357": { "op": "global LatestTimestamp", "defined_out": [ "entry#0", @@ -3060,7 +3084,7 @@ "tmp%6#0" ] }, - "1338": { + "1359": { "op": ">", "defined_out": [ "entry#0", @@ -3089,7 +3113,7 @@ "tmp%7#0" ] }, - "1339": { + "1360": { "op": "bnz fund_due_cashflows_after_while@11", "stack_out": [ "entry#0", @@ -3110,7 +3134,7 @@ "max_event_count#0" ] }, - "1342": { + "1363": { "op": "dig 15", "stack_out": [ "entry#0", @@ -3132,7 +3156,7 @@ "entry#0" ] }, - "1344": { + "1365": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -3162,7 +3186,7 @@ "8" ] }, - "1345": { + "1366": { "op": "getbyte", "defined_out": [ "entry#0", @@ -3191,7 +3215,7 @@ "event_type#0" ] }, - "1346": { + "1367": { "op": "dup", "stack_out": [ "entry#0", @@ -3214,7 +3238,7 @@ "event_type#0" ] }, - "1347": { + "1368": { "op": "bury 16", "defined_out": [ "entry#0", @@ -3243,7 +3267,7 @@ "event_type#0" ] }, - "1349": { + "1370": { "op": "intc_2 // 8", "stack_out": [ "entry#0", @@ -3266,7 +3290,7 @@ "8" ] }, - "1350": { + "1371": { "op": "==", "defined_out": [ "entry#0", @@ -3296,7 +3320,7 @@ "tmp%0#1" ] }, - "1351": { + "1372": { "op": "dup", "stack_out": [ "entry#0", @@ -3319,7 +3343,7 @@ "tmp%0#1" ] }, - "1352": { + "1373": { "op": "bury 4", "defined_out": [ "entry#0", @@ -3349,7 +3373,7 @@ "tmp%0#1" ] }, - "1354": { + "1375": { "op": "bnz fund_due_cashflows_bool_true@52", "stack_out": [ "entry#0", @@ -3370,7 +3394,7 @@ "max_event_count#0" ] }, - "1357": { + "1378": { "op": "dig 14", "stack_out": [ "entry#0", @@ -3392,7 +3416,7 @@ "event_type#0" ] }, - "1359": { + "1380": { "op": "pushint 3", "defined_out": [ "3", @@ -3424,7 +3448,7 @@ "3" ] }, - "1361": { + "1382": { "op": "==", "defined_out": [ "entry#0", @@ -3455,7 +3479,7 @@ "tmp%1#4" ] }, - "1362": { + "1383": { "op": "bnz fund_due_cashflows_bool_true@52", "stack_out": [ "entry#0", @@ -3476,7 +3500,7 @@ "max_event_count#0" ] }, - "1365": { + "1386": { "op": "dig 14", "stack_out": [ "entry#0", @@ -3498,7 +3522,7 @@ "event_type#0" ] }, - "1367": { + "1388": { "op": "pushint 19", "defined_out": [ "19", @@ -3530,7 +3554,7 @@ "19" ] }, - "1369": { + "1390": { "op": "==", "defined_out": [ "entry#0", @@ -3561,7 +3585,7 @@ "tmp%2#2" ] }, - "1370": { + "1391": { "op": "bz fund_due_cashflows_bool_false@53", "stack_out": [ "entry#0", @@ -3582,7 +3606,7 @@ "max_event_count#0" ] }, - "1373": { + "1394": { "block": "fund_due_cashflows_bool_true@52", "stack_in": [ "entry#0", @@ -3626,7 +3650,7 @@ "or_result%0#0" ] }, - "1374": { + "1395": { "block": "fund_due_cashflows_bool_merge@54", "stack_in": [ "entry#0", @@ -3668,7 +3692,7 @@ "max_event_count#0" ] }, - "1377": { + "1398": { "op": "dig 15", "defined_out": [ "entry#0" @@ -3693,7 +3717,7 @@ "entry#0" ] }, - "1379": { + "1400": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -3720,7 +3744,7 @@ "0" ] }, - "1380": { + "1401": { "op": "extract_uint64", "defined_out": [ "entry#0", @@ -3746,7 +3770,7 @@ "values%0#1" ] }, - "1381": { + "1402": { "op": "intc_0 // 0", "stack_out": [ "entry#0", @@ -3769,7 +3793,7 @@ "0" ] }, - "1382": { + "1403": { "op": "bytec_2 // \"event_cursor\"", "defined_out": [ "\"event_cursor\"", @@ -3799,7 +3823,7 @@ "\"event_cursor\"" ] }, - "1383": { + "1404": { "op": "app_global_get_ex", "defined_out": [ "entry#0", @@ -3829,7 +3853,7 @@ "maybe_exists%0#0" ] }, - "1384": { + "1405": { "error": "check self.event_cursor exists", "op": "assert // check self.event_cursor exists", "stack_out": [ @@ -3853,7 +3877,7 @@ "maybe_value%0#0" ] }, - "1385": { + "1406": { "op": "==", "defined_out": [ "entry#0", @@ -3879,7 +3903,7 @@ "tmp%0#2" ] }, - "1386": { + "1407": { "error": "Invalid event cursor", "op": "assert // Invalid event cursor", "stack_out": [ @@ -3901,7 +3925,7 @@ "max_event_count#0" ] }, - "1387": { + "1408": { "op": "dig 1", "defined_out": [ "entry#0", @@ -3927,7 +3951,7 @@ "values%0#0" ] }, - "1389": { + "1410": { "op": "global LatestTimestamp", "defined_out": [ "entry#0", @@ -3955,7 +3979,7 @@ "tmp%1#1" ] }, - "1391": { + "1412": { "op": "<=", "defined_out": [ "entry#0", @@ -3982,7 +4006,7 @@ "tmp%2#2" ] }, - "1392": { + "1413": { "error": "No due cashflow to pay", "op": "assert // No due cashflow to pay", "stack_out": [ @@ -4004,7 +4028,7 @@ "max_event_count#0" ] }, - "1393": { + "1414": { "op": "dig 2", "defined_out": [ "entry#0", @@ -4031,7 +4055,7 @@ "tmp%0#1" ] }, - "1395": { + "1416": { "op": "bnz fund_due_cashflows_after_if_else@15", "stack_out": [ "entry#0", @@ -4052,7 +4076,7 @@ "max_event_count#0" ] }, - "1398": { + "1419": { "op": "dig 14", "defined_out": [ "entry#0", @@ -4080,7 +4104,7 @@ "event_type#0" ] }, - "1400": { + "1421": { "op": "pushint 19", "defined_out": [ "19", @@ -4110,7 +4134,7 @@ "19" ] }, - "1402": { + "1423": { "op": "==", "stack_out": [ "entry#0", @@ -4132,7 +4156,7 @@ "tmp%2#2" ] }, - "1403": { + "1424": { "op": "bnz fund_due_cashflows_after_if_else@15", "stack_out": [ "entry#0", @@ -4153,7 +4177,7 @@ "max_event_count#0" ] }, - "1406": { + "1427": { "op": "intc_0 // 0", "defined_out": [ "entry#0", @@ -4182,7 +4206,7 @@ "interest_amount_due#0" ] }, - "1407": { + "1428": { "op": "bury 11", "defined_out": [ "entry#0", @@ -4210,7 +4234,7 @@ "max_event_count#0" ] }, - "1409": { + "1430": { "block": "fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_interest_amount@16", "stack_in": [ "entry#0", @@ -4254,7 +4278,7 @@ "entry#0" ] }, - "1411": { + "1432": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -4281,7 +4305,7 @@ "8" ] }, - "1412": { + "1433": { "op": "getbyte", "defined_out": [ "entry#0", @@ -4307,7 +4331,7 @@ "event_type#0" ] }, - "1413": { + "1434": { "op": "dup", "stack_out": [ "entry#0", @@ -4330,7 +4354,7 @@ "event_type#0" ] }, - "1414": { + "1435": { "op": "bury 16", "defined_out": [ "entry#0", @@ -4356,7 +4380,7 @@ "event_type#0" ] }, - "1416": { + "1437": { "op": "pushint 3", "defined_out": [ "3", @@ -4384,7 +4408,7 @@ "3" ] }, - "1418": { + "1439": { "op": "==", "defined_out": [ "entry#0", @@ -4411,7 +4435,7 @@ "tmp%1#4" ] }, - "1419": { + "1440": { "op": "bnz fund_due_cashflows_after_if_else@19", "stack_out": [ "entry#0", @@ -4432,7 +4456,7 @@ "max_event_count#0" ] }, - "1422": { + "1443": { "op": "dig 14", "stack_out": [ "entry#0", @@ -4454,7 +4478,7 @@ "event_type#0" ] }, - "1424": { + "1445": { "op": "pushint 19", "defined_out": [ "19", @@ -4482,7 +4506,7 @@ "19" ] }, - "1426": { + "1447": { "op": "==", "defined_out": [ "entry#0", @@ -4509,7 +4533,7 @@ "tmp%2#2" ] }, - "1427": { + "1448": { "op": "bnz fund_due_cashflows_after_if_else@19", "stack_out": [ "entry#0", @@ -4530,7 +4554,7 @@ "max_event_count#0" ] }, - "1430": { + "1451": { "op": "intc_0 // 0", "defined_out": [ "entry#0", @@ -4557,7 +4581,7 @@ "principal_amount_due#0" ] }, - "1431": { + "1452": { "op": "bury 6", "defined_out": [ "entry#0", @@ -4583,7 +4607,7 @@ "max_event_count#0" ] }, - "1433": { + "1454": { "block": "fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@28", "stack_in": [ "entry#0", @@ -4627,7 +4651,7 @@ "entry#0" ] }, - "1435": { + "1456": { "op": "pushint 49", "defined_out": [ "49", @@ -4654,7 +4678,7 @@ "49" ] }, - "1437": { + "1458": { "op": "extract_uint64", "defined_out": [ "entry#0", @@ -4680,7 +4704,7 @@ "next_outstanding_principal#0" ] }, - "1438": { + "1459": { "op": "bury 8", "defined_out": [ "entry#0", @@ -4705,7 +4729,7 @@ "max_event_count#0" ] }, - "1440": { + "1461": { "callsub": "modules.actus_kernel.ActusKernelModule._is_dynamic_annuity", "op": "callsub _is_dynamic_annuity", "defined_out": [ @@ -4733,7 +4757,7 @@ "tmp%3#1" ] }, - "1443": { + "1464": { "op": "bnz fund_due_cashflows_if_body@29", "stack_out": [ "entry#0", @@ -4754,7 +4778,7 @@ "max_event_count#0" ] }, - "1446": { + "1467": { "op": "dig 7", "defined_out": [ "entry#0", @@ -4781,7 +4805,7 @@ "next_interest_base#2" ] }, - "1448": { + "1469": { "op": "bury 9", "defined_out": [ "entry#0", @@ -4807,7 +4831,7 @@ "max_event_count#0" ] }, - "1450": { + "1471": { "block": "fund_due_cashflows_after_if_else@38", "stack_in": [ "entry#0", @@ -4851,7 +4875,7 @@ "interest_amount_due#0" ] }, - "1452": { + "1473": { "callsub": "modules.actus_kernel.ActusKernelModule._amount_to_index_delta", "op": "callsub _amount_to_index_delta", "defined_out": [ @@ -4878,7 +4902,7 @@ "interest_index_delta#0" ] }, - "1455": { + "1476": { "op": "dig 6", "defined_out": [ "interest_amount_due#0", @@ -4906,7 +4930,7 @@ "principal_amount_due#0" ] }, - "1457": { + "1478": { "callsub": "modules.actus_kernel.ActusKernelModule._amount_to_index_delta", "op": "callsub _amount_to_index_delta", "defined_out": [ @@ -4936,7 +4960,7 @@ "principal_index_delta#0" ] }, - "1460": { + "1481": { "op": "dig 1", "defined_out": [ "interest_amount_due#0", @@ -4967,7 +4991,7 @@ "interest_index_delta#0 (copy)" ] }, - "1462": { + "1483": { "callsub": "modules.actus_kernel.ActusKernelModule._index_delta_to_amount", "op": "callsub _index_delta_to_amount", "defined_out": [ @@ -4999,7 +5023,7 @@ "interest_amount#1" ] }, - "1465": { + "1486": { "op": "dup", "stack_out": [ "entry#0", @@ -5024,7 +5048,7 @@ "interest_amount#1 (copy)" ] }, - "1466": { + "1487": { "op": "cover 2", "stack_out": [ "entry#0", @@ -5049,7 +5073,7 @@ "interest_amount#1" ] }, - "1468": { + "1489": { "op": "bury 15", "defined_out": [ "interest_amount#1", @@ -5080,7 +5104,7 @@ "principal_index_delta#0" ] }, - "1470": { + "1491": { "op": "dup", "defined_out": [ "interest_amount#1", @@ -5113,7 +5137,7 @@ "principal_index_delta#0 (copy)" ] }, - "1471": { + "1492": { "callsub": "modules.actus_kernel.ActusKernelModule._index_delta_to_amount", "op": "callsub _index_delta_to_amount", "defined_out": [ @@ -5147,7 +5171,7 @@ "principal_amount#1" ] }, - "1474": { + "1495": { "op": "dup", "stack_out": [ "entry#0", @@ -5173,7 +5197,7 @@ "principal_amount#1" ] }, - "1475": { + "1496": { "op": "bury 11", "defined_out": [ "interest_amount#1", @@ -5206,7 +5230,7 @@ "principal_amount#1" ] }, - "1477": { + "1498": { "op": "dig 2", "defined_out": [ "interest_amount#1", @@ -5241,7 +5265,7 @@ "interest_amount#1 (copy)" ] }, - "1479": { + "1500": { "op": "dig 1", "defined_out": [ "interest_amount#1", @@ -5278,7 +5302,7 @@ "principal_amount#1 (copy)" ] }, - "1481": { + "1502": { "op": "+", "defined_out": [ "interest_amount#1", @@ -5313,7 +5337,7 @@ "required_amount#0" ] }, - "1482": { + "1503": { "op": "dup", "stack_out": [ "entry#0", @@ -5340,7 +5364,7 @@ "required_amount#0" ] }, - "1483": { + "1504": { "op": "bury 9", "defined_out": [ "interest_amount#1", @@ -5375,7 +5399,7 @@ "required_amount#0" ] }, - "1485": { + "1506": { "op": "global CurrentApplicationAddress", "defined_out": [ "interest_amount#1", @@ -5412,7 +5436,7 @@ "tmp%0#3" ] }, - "1487": { + "1508": { "op": "intc_0 // 0", "stack_out": [ "entry#0", @@ -5440,7 +5464,7 @@ "0" ] }, - "1488": { + "1509": { "op": "bytec 19 // \"settlement_asset_id\"", "defined_out": [ "\"settlement_asset_id\"", @@ -5481,7 +5505,7 @@ "\"settlement_asset_id\"" ] }, - "1490": { + "1511": { "op": "app_global_get_ex", "defined_out": [ "interest_amount#1", @@ -5522,7 +5546,7 @@ "maybe_exists%0#0" ] }, - "1491": { + "1512": { "error": "check self.settlement_asset_id exists", "op": "assert // check self.settlement_asset_id exists", "stack_out": [ @@ -5551,7 +5575,7 @@ "maybe_value%0#0" ] }, - "1492": { + "1513": { "op": "asset_holding_get AssetBalance", "defined_out": [ "balance#0", @@ -5590,7 +5614,7 @@ "check%0#0" ] }, - "1494": { + "1515": { "error": "account opted into asset", "op": "assert // account opted into asset", "stack_out": [ @@ -5618,7 +5642,7 @@ "balance#0" ] }, - "1495": { + "1516": { "op": "intc_0 // 0", "stack_out": [ "entry#0", @@ -5646,7 +5670,7 @@ "0" ] }, - "1496": { + "1517": { "op": "bytec 15 // \"reserved_interest\"", "defined_out": [ "\"reserved_interest\"", @@ -5687,7 +5711,7 @@ "\"reserved_interest\"" ] }, - "1498": { + "1519": { "op": "app_global_get_ex", "stack_out": [ "entry#0", @@ -5716,7 +5740,7 @@ "maybe_exists%0#0" ] }, - "1499": { + "1520": { "error": "check self.reserved_interest exists", "op": "assert // check self.reserved_interest exists", "stack_out": [ @@ -5745,7 +5769,7 @@ "maybe_value%0#0" ] }, - "1500": { + "1521": { "op": "intc_0 // 0", "stack_out": [ "entry#0", @@ -5774,7 +5798,7 @@ "0" ] }, - "1501": { + "1522": { "op": "bytec 12 // \"reserved_principal\"", "defined_out": [ "\"reserved_principal\"", @@ -5817,7 +5841,7 @@ "\"reserved_principal\"" ] }, - "1503": { + "1524": { "op": "app_global_get_ex", "defined_out": [ "balance#0", @@ -5860,7 +5884,7 @@ "maybe_exists%1#0" ] }, - "1504": { + "1525": { "error": "check self.reserved_principal exists", "op": "assert // check self.reserved_principal exists", "stack_out": [ @@ -5890,7 +5914,7 @@ "maybe_value%1#0" ] }, - "1505": { + "1526": { "op": "dig 1", "defined_out": [ "balance#0", @@ -5933,7 +5957,7 @@ "maybe_value%0#0 (copy)" ] }, - "1507": { + "1528": { "op": "+", "defined_out": [ "balance#0", @@ -5974,7 +5998,7 @@ "reserved_total#0" ] }, - "1508": { + "1529": { "op": "dig 2", "defined_out": [ "balance#0", @@ -6017,7 +6041,7 @@ "balance#0 (copy)" ] }, - "1510": { + "1531": { "op": "dig 1", "defined_out": [ "balance#0", @@ -6062,7 +6086,7 @@ "reserved_total#0 (copy)" ] }, - "1512": { + "1533": { "op": ">=", "defined_out": [ "balance#0", @@ -6105,7 +6129,7 @@ "tmp%2#2" ] }, - "1513": { + "1534": { "error": "Not enough funds for the payment", "op": "assert // Not enough funds for the payment", "stack_out": [ @@ -6135,7 +6159,7 @@ "reserved_total#0" ] }, - "1514": { + "1535": { "op": "uncover 2", "stack_out": [ "entry#0", @@ -6164,7 +6188,7 @@ "balance#0" ] }, - "1516": { + "1537": { "op": "swap", "stack_out": [ "entry#0", @@ -6193,7 +6217,7 @@ "reserved_total#0" ] }, - "1517": { + "1538": { "op": "-", "defined_out": [ "interest_amount#1", @@ -6232,7 +6256,7 @@ "tmp%3#3" ] }, - "1518": { + "1539": { "op": "uncover 2", "stack_out": [ "entry#0", @@ -6260,7 +6284,7 @@ "required_amount#0" ] }, - "1520": { + "1541": { "op": ">=", "defined_out": [ "interest_amount#1", @@ -6298,7 +6322,7 @@ "tmp%15#1" ] }, - "1521": { + "1542": { "error": "Not enough funds for the payment", "op": "assert // Not enough funds for the payment", "stack_out": [ @@ -6325,7 +6349,7 @@ "maybe_value%0#0" ] }, - "1522": { + "1543": { "op": "uncover 3", "stack_out": [ "entry#0", @@ -6351,7 +6375,7 @@ "interest_amount#1" ] }, - "1524": { + "1545": { "op": "+", "defined_out": [ "interest_amount#1", @@ -6386,7 +6410,7 @@ "tmp%16#1" ] }, - "1525": { + "1546": { "op": "bytec 15 // \"reserved_interest\"", "stack_out": [ "entry#0", @@ -6412,7 +6436,7 @@ "\"reserved_interest\"" ] }, - "1527": { + "1548": { "op": "swap", "stack_out": [ "entry#0", @@ -6438,7 +6462,7 @@ "tmp%16#1" ] }, - "1528": { + "1549": { "op": "app_global_put", "stack_out": [ "entry#0", @@ -6462,7 +6486,7 @@ "principal_amount#1" ] }, - "1529": { + "1550": { "op": "intc_0 // 0", "stack_out": [ "entry#0", @@ -6487,7 +6511,7 @@ "0" ] }, - "1530": { + "1551": { "op": "bytec 12 // \"reserved_principal\"", "stack_out": [ "entry#0", @@ -6513,7 +6537,7 @@ "\"reserved_principal\"" ] }, - "1532": { + "1553": { "op": "app_global_get_ex", "defined_out": [ "interest_amount#1", @@ -6550,7 +6574,7 @@ "maybe_exists%5#0" ] }, - "1533": { + "1554": { "error": "check self.reserved_principal exists", "op": "assert // check self.reserved_principal exists", "stack_out": [ @@ -6576,7 +6600,7 @@ "maybe_value%5#0" ] }, - "1534": { + "1555": { "op": "+", "defined_out": [ "interest_amount#1", @@ -6610,7 +6634,7 @@ "tmp%17#0" ] }, - "1535": { + "1556": { "op": "bytec 12 // \"reserved_principal\"", "stack_out": [ "entry#0", @@ -6635,7 +6659,7 @@ "\"reserved_principal\"" ] }, - "1537": { + "1558": { "op": "swap", "stack_out": [ "entry#0", @@ -6660,7 +6684,7 @@ "tmp%17#0" ] }, - "1538": { + "1559": { "op": "app_global_put", "stack_out": [ "entry#0", @@ -6683,7 +6707,7 @@ "principal_index_delta#0" ] }, - "1539": { + "1560": { "op": "intc_0 // 0", "stack_out": [ "entry#0", @@ -6707,7 +6731,7 @@ "0" ] }, - "1540": { + "1561": { "op": "bytec 16 // \"cumulative_interest_index\"", "defined_out": [ "\"cumulative_interest_index\"", @@ -6743,7 +6767,7 @@ "\"cumulative_interest_index\"" ] }, - "1542": { + "1563": { "op": "app_global_get_ex", "defined_out": [ "interest_amount#1", @@ -6779,7 +6803,7 @@ "maybe_exists%6#0" ] }, - "1543": { + "1564": { "error": "check self.cumulative_interest_index exists", "op": "assert // check self.cumulative_interest_index exists", "stack_out": [ @@ -6804,7 +6828,7 @@ "maybe_value%6#0" ] }, - "1544": { + "1565": { "op": "uncover 2", "stack_out": [ "entry#0", @@ -6828,7 +6852,7 @@ "interest_index_delta#0" ] }, - "1546": { + "1567": { "op": "+", "defined_out": [ "interest_amount#1", @@ -6860,7 +6884,7 @@ "tmp%18#0" ] }, - "1547": { + "1568": { "op": "bytec 16 // \"cumulative_interest_index\"", "stack_out": [ "entry#0", @@ -6884,7 +6908,7 @@ "\"cumulative_interest_index\"" ] }, - "1549": { + "1570": { "op": "swap", "stack_out": [ "entry#0", @@ -6908,7 +6932,7 @@ "tmp%18#0" ] }, - "1550": { + "1571": { "op": "app_global_put", "stack_out": [ "entry#0", @@ -6930,7 +6954,7 @@ "principal_index_delta#0" ] }, - "1551": { + "1572": { "op": "intc_0 // 0", "stack_out": [ "entry#0", @@ -6953,7 +6977,7 @@ "0" ] }, - "1552": { + "1573": { "op": "bytec 17 // \"cumulative_principal_index\"", "defined_out": [ "\"cumulative_principal_index\"", @@ -6987,7 +7011,7 @@ "\"cumulative_principal_index\"" ] }, - "1554": { + "1575": { "op": "app_global_get_ex", "defined_out": [ "interest_amount#1", @@ -7021,7 +7045,7 @@ "maybe_exists%7#0" ] }, - "1555": { + "1576": { "error": "check self.cumulative_principal_index exists", "op": "assert // check self.cumulative_principal_index exists", "stack_out": [ @@ -7045,7 +7069,7 @@ "maybe_value%7#0" ] }, - "1556": { + "1577": { "op": "+", "defined_out": [ "interest_amount#1", @@ -7075,7 +7099,7 @@ "tmp%19#0" ] }, - "1557": { + "1578": { "op": "bytec 17 // \"cumulative_principal_index\"", "stack_out": [ "entry#0", @@ -7098,7 +7122,7 @@ "\"cumulative_principal_index\"" ] }, - "1559": { + "1580": { "op": "swap", "stack_out": [ "entry#0", @@ -7121,7 +7145,7 @@ "tmp%19#0" ] }, - "1560": { + "1581": { "op": "app_global_put", "stack_out": [ "entry#0", @@ -7142,7 +7166,7 @@ "max_event_count#0" ] }, - "1561": { + "1582": { "op": "dig 15", "defined_out": [ "entry#0", @@ -7172,7 +7196,7 @@ "entry#0" ] }, - "1563": { + "1584": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -7204,7 +7228,7 @@ "8" ] }, - "1564": { + "1585": { "op": "getbyte", "defined_out": [ "entry#0", @@ -7235,7 +7259,7 @@ "tmp%20#0" ] }, - "1565": { + "1586": { "op": "pushint 3", "defined_out": [ "3", @@ -7268,7 +7292,7 @@ "3" ] }, - "1567": { + "1588": { "op": "==", "defined_out": [ "entry#0", @@ -7299,7 +7323,7 @@ "tmp%21#0" ] }, - "1568": { + "1589": { "op": "bz fund_due_cashflows_else_body@40", "stack_out": [ "entry#0", @@ -7320,7 +7344,7 @@ "max_event_count#0" ] }, - "1571": { + "1592": { "op": "intc_0 // 0", "stack_out": [ "entry#0", @@ -7342,7 +7366,7 @@ "0" ] }, - "1572": { + "1593": { "op": "bytec 6 // \"accrued_interest\"", "defined_out": [ "\"accrued_interest\"", @@ -7375,7 +7399,7 @@ "\"accrued_interest\"" ] }, - "1574": { + "1595": { "op": "app_global_get_ex", "defined_out": [ "entry#0", @@ -7408,7 +7432,7 @@ "maybe_exists%8#0" ] }, - "1575": { + "1596": { "error": "check self.accrued_interest exists", "op": "assert // check self.accrued_interest exists", "stack_out": [ @@ -7431,7 +7455,7 @@ "maybe_value%8#0" ] }, - "1576": { + "1597": { "op": "dig 16", "stack_out": [ "entry#0", @@ -7454,7 +7478,7 @@ "entry#0" ] }, - "1578": { + "1599": { "callsub": "modules.actus_kernel.ActusKernelModule._entry_interest_segment", "op": "callsub _entry_interest_segment", "defined_out": [ @@ -7489,7 +7513,7 @@ "entry#0" ] }, - "1581": { + "1602": { "op": "bury 18", "defined_out": [ "_entry_interest_segment%0#0", @@ -7522,7 +7546,7 @@ "_entry_interest_segment%0#0" ] }, - "1583": { + "1604": { "op": "+", "defined_out": [ "entry#0", @@ -7553,7 +7577,7 @@ "tmp%22#0" ] }, - "1584": { + "1605": { "op": "bytec 6 // \"accrued_interest\"", "stack_out": [ "entry#0", @@ -7576,7 +7600,7 @@ "\"accrued_interest\"" ] }, - "1586": { + "1607": { "op": "swap", "stack_out": [ "entry#0", @@ -7599,7 +7623,7 @@ "tmp%22#0" ] }, - "1587": { + "1608": { "op": "app_global_put", "stack_out": [ "entry#0", @@ -7620,7 +7644,7 @@ "max_event_count#0" ] }, - "1588": { + "1609": { "block": "fund_due_cashflows_after_if_else@41", "stack_in": [ "entry#0", @@ -7665,7 +7689,7 @@ "tmp%23#0" ] }, - "1591": { + "1612": { "op": "bz fund_due_cashflows_if_body@43", "stack_out": [ "entry#0", @@ -7686,7 +7710,7 @@ "max_event_count#0" ] }, - "1594": { + "1615": { "op": "dig 15", "defined_out": [ "entry#0" @@ -7711,7 +7735,7 @@ "entry#0" ] }, - "1596": { + "1617": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -7738,7 +7762,7 @@ "8" ] }, - "1597": { + "1618": { "op": "getbyte", "defined_out": [ "entry#0", @@ -7764,7 +7788,7 @@ "tmp%24#0" ] }, - "1598": { + "1619": { "op": "pushint 19", "defined_out": [ "19", @@ -7792,7 +7816,7 @@ "19" ] }, - "1600": { + "1621": { "op": "==", "defined_out": [ "entry#0", @@ -7818,7 +7842,7 @@ "tmp%25#0" ] }, - "1601": { + "1622": { "op": "bz fund_due_cashflows_after_if_else@44", "stack_out": [ "entry#0", @@ -7839,7 +7863,7 @@ "max_event_count#0" ] }, - "1604": { + "1625": { "block": "fund_due_cashflows_if_body@43", "stack_in": [ "entry#0", @@ -7883,7 +7907,7 @@ "entry#0" ] }, - "1606": { + "1627": { "op": "pushint 41", "defined_out": [ "41", @@ -7910,7 +7934,7 @@ "41" ] }, - "1608": { + "1629": { "op": "extract_uint64", "defined_out": [ "entry#0", @@ -7936,7 +7960,7 @@ "values%4#0" ] }, - "1609": { + "1630": { "op": "bytec 14 // \"next_principal_redemption\"", "defined_out": [ "\"next_principal_redemption\"", @@ -7964,7 +7988,7 @@ "\"next_principal_redemption\"" ] }, - "1611": { + "1632": { "op": "swap", "stack_out": [ "entry#0", @@ -7987,7 +8011,7 @@ "values%4#0" ] }, - "1612": { + "1633": { "op": "app_global_put", "stack_out": [ "entry#0", @@ -8008,7 +8032,7 @@ "max_event_count#0" ] }, - "1613": { + "1634": { "block": "fund_due_cashflows_after_if_else@44", "stack_in": [ "entry#0", @@ -8052,7 +8076,7 @@ "\"outstanding_principal\"" ] }, - "1615": { + "1636": { "op": "dig 8", "defined_out": [ "\"outstanding_principal\"", @@ -8079,7 +8103,7 @@ "next_outstanding_principal#0" ] }, - "1617": { + "1638": { "op": "app_global_put", "stack_out": [ "entry#0", @@ -8100,7 +8124,7 @@ "max_event_count#0" ] }, - "1618": { + "1639": { "op": "bytec 7 // \"interest_calculation_base\"", "defined_out": [ "\"interest_calculation_base\"", @@ -8126,7 +8150,7 @@ "\"interest_calculation_base\"" ] }, - "1620": { + "1641": { "op": "dig 9", "defined_out": [ "\"interest_calculation_base\"", @@ -8154,7 +8178,7 @@ "next_interest_base#2" ] }, - "1622": { + "1643": { "op": "app_global_put", "stack_out": [ "entry#0", @@ -8175,7 +8199,7 @@ "max_event_count#0" ] }, - "1623": { + "1644": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -8202,7 +8226,7 @@ "0" ] }, - "1624": { + "1645": { "op": "bytec_2 // \"event_cursor\"", "defined_out": [ "\"event_cursor\"", @@ -8231,7 +8255,7 @@ "\"event_cursor\"" ] }, - "1625": { + "1646": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%9#0", @@ -8260,7 +8284,7 @@ "maybe_exists%9#0" ] }, - "1626": { + "1647": { "error": "check self.event_cursor exists", "op": "assert // check self.event_cursor exists", "stack_out": [ @@ -8283,7 +8307,7 @@ "maybe_value%9#0" ] }, - "1627": { + "1648": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -8312,7 +8336,7 @@ "1" ] }, - "1628": { + "1649": { "op": "+", "defined_out": [ "next_interest_base#2", @@ -8339,7 +8363,7 @@ "tmp%26#0" ] }, - "1629": { + "1650": { "op": "bytec_2 // \"event_cursor\"", "stack_out": [ "entry#0", @@ -8362,7 +8386,7 @@ "\"event_cursor\"" ] }, - "1630": { + "1651": { "op": "swap", "stack_out": [ "entry#0", @@ -8385,7 +8409,7 @@ "tmp%26#0" ] }, - "1631": { + "1652": { "op": "app_global_put", "stack_out": [ "entry#0", @@ -8406,7 +8430,7 @@ "max_event_count#0" ] }, - "1632": { + "1653": { "op": "dig 15", "defined_out": [ "entry#0", @@ -8433,7 +8457,7 @@ "entry#0" ] }, - "1634": { + "1655": { "op": "extract 8 1", "defined_out": [ "aggregate%extract%10#0", @@ -8461,7 +8485,7 @@ "aggregate%extract%10#0" ] }, - "1637": { + "1658": { "op": "pushbytes 0x13", "defined_out": [ "0x13", @@ -8491,7 +8515,7 @@ "0x13" ] }, - "1640": { + "1661": { "op": "b==", "defined_out": [ "entry#0", @@ -8519,7 +8543,7 @@ "tmp%27#0" ] }, - "1641": { + "1662": { "op": "bz fund_due_cashflows_after_if_else@47", "stack_out": [ "entry#0", @@ -8540,7 +8564,7 @@ "max_event_count#0" ] }, - "1644": { + "1665": { "op": "intc_0 // 0", "stack_out": [ "entry#0", @@ -8562,7 +8586,7 @@ "0" ] }, - "1645": { + "1666": { "op": "bytec 4 // \"outstanding_principal\"", "stack_out": [ "entry#0", @@ -8585,7 +8609,7 @@ "\"outstanding_principal\"" ] }, - "1647": { + "1668": { "op": "app_global_get_ex", "defined_out": [ "entry#0", @@ -8615,7 +8639,7 @@ "maybe_exists%10#0" ] }, - "1648": { + "1669": { "error": "check self.outstanding_principal exists", "op": "assert // check self.outstanding_principal exists", "stack_out": [ @@ -8638,7 +8662,7 @@ "maybe_value%10#0" ] }, - "1649": { + "1670": { "op": "bnz fund_due_cashflows_after_if_else@47", "stack_out": [ "entry#0", @@ -8659,7 +8683,7 @@ "max_event_count#0" ] }, - "1652": { + "1673": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"", @@ -8687,7 +8711,7 @@ "\"status\"" ] }, - "1653": { + "1674": { "op": "pushint 200", "defined_out": [ "\"status\"", @@ -8717,7 +8741,7 @@ "200" ] }, - "1656": { + "1677": { "op": "app_global_put", "stack_out": [ "entry#0", @@ -8738,7 +8762,7 @@ "max_event_count#0" ] }, - "1657": { + "1678": { "op": "bytec 7 // \"interest_calculation_base\"", "stack_out": [ "entry#0", @@ -8760,7 +8784,7 @@ "\"interest_calculation_base\"" ] }, - "1659": { + "1680": { "op": "intc_0 // 0", "stack_out": [ "entry#0", @@ -8783,7 +8807,7 @@ "0" ] }, - "1660": { + "1681": { "op": "app_global_put", "stack_out": [ "entry#0", @@ -8804,7 +8828,7 @@ "max_event_count#0" ] }, - "1661": { + "1682": { "block": "fund_due_cashflows_after_if_else@47", "stack_in": [ "entry#0", @@ -8848,7 +8872,7 @@ "entry#0" ] }, - "1663": { + "1684": { "op": "dig 4", "defined_out": [ "entry#0", @@ -8875,7 +8899,7 @@ "required_amount#0" ] }, - "1665": { + "1686": { "op": "dup", "defined_out": [ "entry#0", @@ -8904,7 +8928,7 @@ "required_amount#0" ] }, - "1666": { + "1687": { "callsub": "modules.actus_kernel.ActusKernelModule._emit_execution_event", "op": "callsub _emit_execution_event", "stack_out": [ @@ -8927,7 +8951,7 @@ "entry#0" ] }, - "1669": { + "1690": { "op": "pop", "stack_out": [ "entry#0", @@ -8948,7 +8972,7 @@ "max_event_count#0" ] }, - "1670": { + "1691": { "op": "dig 13", "defined_out": [ "entry#0", @@ -8975,7 +8999,7 @@ "funded_interest#0" ] }, - "1672": { + "1693": { "op": "dig 12", "defined_out": [ "entry#0", @@ -9004,7 +9028,7 @@ "interest_amount#1" ] }, - "1674": { + "1695": { "op": "+", "stack_out": [ "entry#0", @@ -9026,7 +9050,7 @@ "funded_interest#0" ] }, - "1675": { + "1696": { "op": "bury 14", "defined_out": [ "entry#0", @@ -9053,7 +9077,7 @@ "max_event_count#0" ] }, - "1677": { + "1698": { "op": "dig 12", "defined_out": [ "entry#0", @@ -9082,7 +9106,7 @@ "funded_principal#0" ] }, - "1679": { + "1700": { "op": "dig 7", "defined_out": [ "entry#0", @@ -9113,7 +9137,7 @@ "principal_amount#1" ] }, - "1681": { + "1702": { "op": "+", "stack_out": [ "entry#0", @@ -9135,7 +9159,7 @@ "funded_principal#0" ] }, - "1682": { + "1703": { "op": "bury 13", "defined_out": [ "entry#0", @@ -9164,7 +9188,7 @@ "max_event_count#0" ] }, - "1684": { + "1705": { "op": "dig 4", "defined_out": [ "entry#0", @@ -9195,7 +9219,7 @@ "processed_events#0" ] }, - "1686": { + "1707": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -9228,7 +9252,7 @@ "1" ] }, - "1687": { + "1708": { "op": "+", "stack_out": [ "entry#0", @@ -9250,7 +9274,7 @@ "processed_events#0" ] }, - "1688": { + "1709": { "op": "bury 5", "defined_out": [ "entry#0", @@ -9280,10 +9304,10 @@ "max_event_count#0" ] }, - "1690": { + "1711": { "op": "b fund_due_cashflows_while_top@4" }, - "1693": { + "1714": { "block": "fund_due_cashflows_else_body@40", "stack_in": [ "entry#0", @@ -9327,7 +9351,7 @@ "\"accrued_interest\"" ] }, - "1695": { + "1716": { "op": "intc_0 // 0", "defined_out": [ "\"accrued_interest\"", @@ -9354,7 +9378,7 @@ "0" ] }, - "1696": { + "1717": { "op": "app_global_put", "stack_out": [ "entry#0", @@ -9375,10 +9399,10 @@ "max_event_count#0" ] }, - "1697": { + "1718": { "op": "b fund_due_cashflows_after_if_else@41" }, - "1700": { + "1721": { "block": "fund_due_cashflows_if_body@29", "stack_in": [ "entry#0", @@ -9422,7 +9446,7 @@ "entry#0" ] }, - "1702": { + "1723": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -9449,7 +9473,7 @@ "8" ] }, - "1703": { + "1724": { "op": "getbyte", "defined_out": [ "entry#0", @@ -9475,7 +9499,7 @@ "event_type#0" ] }, - "1704": { + "1725": { "op": "dup", "stack_out": [ "entry#0", @@ -9498,7 +9522,7 @@ "event_type#0" ] }, - "1705": { + "1726": { "op": "bury 16", "defined_out": [ "entry#0", @@ -9524,7 +9548,7 @@ "event_type#0" ] }, - "1707": { + "1728": { "op": "pushint 3", "defined_out": [ "3", @@ -9552,7 +9576,7 @@ "3" ] }, - "1709": { + "1730": { "op": "==", "defined_out": [ "entry#0", @@ -9579,7 +9603,7 @@ "tmp%5#0" ] }, - "1710": { + "1731": { "op": "bz fund_due_cashflows_else_body@31", "stack_out": [ "entry#0", @@ -9600,7 +9624,7 @@ "max_event_count#0" ] }, - "1713": { + "1734": { "op": "intc_0 // 0", "stack_out": [ "entry#0", @@ -9622,7 +9646,7 @@ "0" ] }, - "1714": { + "1735": { "op": "bytec 4 // \"outstanding_principal\"", "defined_out": [ "\"outstanding_principal\"", @@ -9651,7 +9675,7 @@ "\"outstanding_principal\"" ] }, - "1716": { + "1737": { "op": "app_global_get_ex", "defined_out": [ "entry#0", @@ -9680,7 +9704,7 @@ "maybe_exists%1#0" ] }, - "1717": { + "1738": { "error": "check self.outstanding_principal exists", "op": "assert // check self.outstanding_principal exists", "stack_out": [ @@ -9703,7 +9727,7 @@ "maybe_value%1#0" ] }, - "1718": { + "1739": { "op": "dig 6", "defined_out": [ "entry#0", @@ -9732,7 +9756,7 @@ "principal_amount_due#0" ] }, - "1720": { + "1741": { "op": "-", "defined_out": [ "entry#0", @@ -9760,7 +9784,7 @@ "next_outstanding_principal#0" ] }, - "1721": { + "1742": { "op": "dup", "stack_out": [ "entry#0", @@ -9783,7 +9807,7 @@ "next_outstanding_principal#0" ] }, - "1722": { + "1743": { "op": "bury 9", "defined_out": [ "entry#0", @@ -9812,7 +9836,7 @@ "next_interest_base#2" ] }, - "1724": { + "1745": { "op": "bury 9", "defined_out": [ "entry#0", @@ -9840,10 +9864,10 @@ "max_event_count#0" ] }, - "1726": { + "1747": { "op": "b fund_due_cashflows_after_if_else@38" }, - "1729": { + "1750": { "block": "fund_due_cashflows_else_body@31", "stack_in": [ "entry#0", @@ -9887,7 +9911,7 @@ "event_type#0" ] }, - "1731": { + "1752": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -9914,7 +9938,7 @@ "8" ] }, - "1732": { + "1753": { "op": "==", "defined_out": [ "event_type#0", @@ -9940,7 +9964,7 @@ "tmp%7#0" ] }, - "1733": { + "1754": { "op": "bz fund_due_cashflows_else_body@33", "stack_out": [ "entry#0", @@ -9961,7 +9985,7 @@ "max_event_count#0" ] }, - "1736": { + "1757": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -9987,7 +10011,7 @@ "0" ] }, - "1737": { + "1758": { "op": "bytec 4 // \"outstanding_principal\"", "defined_out": [ "\"outstanding_principal\"", @@ -10015,7 +10039,7 @@ "\"outstanding_principal\"" ] }, - "1739": { + "1760": { "op": "app_global_get_ex", "defined_out": [ "event_type#0", @@ -10043,7 +10067,7 @@ "maybe_exists%2#0" ] }, - "1740": { + "1761": { "op": "swap", "stack_out": [ "entry#0", @@ -10066,7 +10090,7 @@ "next_outstanding_principal#0" ] }, - "1741": { + "1762": { "op": "bury 9", "defined_out": [ "event_type#0", @@ -10093,7 +10117,7 @@ "maybe_exists%2#0" ] }, - "1743": { + "1764": { "error": "check self.outstanding_principal exists", "op": "assert // check self.outstanding_principal exists", "stack_out": [ @@ -10115,7 +10139,7 @@ "max_event_count#0" ] }, - "1744": { + "1765": { "op": "intc_0 // 0", "stack_out": [ "entry#0", @@ -10137,7 +10161,7 @@ "0" ] }, - "1745": { + "1766": { "op": "bytec 7 // \"interest_calculation_base\"", "defined_out": [ "\"interest_calculation_base\"", @@ -10166,7 +10190,7 @@ "\"interest_calculation_base\"" ] }, - "1747": { + "1768": { "op": "app_global_get_ex", "defined_out": [ "event_type#0", @@ -10195,7 +10219,7 @@ "maybe_exists%3#0" ] }, - "1748": { + "1769": { "op": "swap", "stack_out": [ "entry#0", @@ -10218,7 +10242,7 @@ "next_interest_base#2" ] }, - "1749": { + "1770": { "op": "bury 10", "defined_out": [ "event_type#0", @@ -10246,7 +10270,7 @@ "maybe_exists%3#0" ] }, - "1751": { + "1772": { "error": "check self.interest_calculation_base exists", "op": "assert // check self.interest_calculation_base exists", "stack_out": [ @@ -10268,10 +10292,10 @@ "max_event_count#0" ] }, - "1752": { + "1773": { "op": "b fund_due_cashflows_after_if_else@38" }, - "1755": { + "1776": { "block": "fund_due_cashflows_else_body@33", "stack_in": [ "entry#0", @@ -10315,7 +10339,7 @@ "event_type#0" ] }, - "1757": { + "1778": { "op": "pushint 19", "defined_out": [ "19", @@ -10342,7 +10366,7 @@ "19" ] }, - "1759": { + "1780": { "op": "==", "defined_out": [ "event_type#0", @@ -10368,7 +10392,7 @@ "tmp%8#1" ] }, - "1760": { + "1781": { "op": "bnz fund_due_cashflows_if_body@34", "stack_out": [ "entry#0", @@ -10389,7 +10413,7 @@ "max_event_count#0" ] }, - "1763": { + "1784": { "op": "dig 7", "defined_out": [ "event_type#0", @@ -10415,7 +10439,7 @@ "next_interest_base#2" ] }, - "1765": { + "1786": { "op": "bury 9", "defined_out": [ "event_type#0", @@ -10440,10 +10464,10 @@ "max_event_count#0" ] }, - "1767": { + "1788": { "op": "b fund_due_cashflows_after_if_else@38" }, - "1770": { + "1791": { "block": "fund_due_cashflows_if_body@34", "stack_in": [ "entry#0", @@ -10487,7 +10511,7 @@ "next_outstanding_principal#0" ] }, - "1771": { + "1792": { "op": "bury 8", "defined_out": [ "next_outstanding_principal#0" @@ -10511,7 +10535,7 @@ "max_event_count#0" ] }, - "1773": { + "1794": { "op": "intc_0 // 0", "defined_out": [ "next_interest_base#2", @@ -10537,7 +10561,7 @@ "next_interest_base#2" ] }, - "1774": { + "1795": { "op": "bury 9", "defined_out": [ "next_interest_base#2", @@ -10562,10 +10586,10 @@ "max_event_count#0" ] }, - "1776": { + "1797": { "op": "b fund_due_cashflows_after_if_else@38" }, - "1779": { + "1800": { "block": "fund_due_cashflows_after_if_else@19", "stack_in": [ "entry#0", @@ -10610,7 +10634,7 @@ "tmp%3#1" ] }, - "1782": { + "1803": { "op": "bz fund_due_cashflows_after_if_else@27", "stack_out": [ "entry#0", @@ -10631,7 +10655,7 @@ "max_event_count#0" ] }, - "1785": { + "1806": { "op": "dig 14", "defined_out": [ "event_type#0" @@ -10656,7 +10680,7 @@ "event_type#0" ] }, - "1787": { + "1808": { "op": "pushint 19", "defined_out": [ "19", @@ -10683,7 +10707,7 @@ "19" ] }, - "1789": { + "1810": { "op": "==", "defined_out": [ "event_type#0", @@ -10709,7 +10733,7 @@ "tmp%4#0" ] }, - "1790": { + "1811": { "op": "bz fund_due_cashflows_after_if_else@22", "stack_out": [ "entry#0", @@ -10730,7 +10754,7 @@ "max_event_count#0" ] }, - "1793": { + "1814": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -10756,7 +10780,7 @@ "0" ] }, - "1794": { + "1815": { "op": "bytec 4 // \"outstanding_principal\"", "defined_out": [ "\"outstanding_principal\"", @@ -10784,7 +10808,7 @@ "\"outstanding_principal\"" ] }, - "1796": { + "1817": { "op": "app_global_get_ex", "defined_out": [ "event_type#0", @@ -10812,7 +10836,7 @@ "maybe_exists%0#0" ] }, - "1797": { + "1818": { "error": "check self.outstanding_principal exists", "op": "assert // check self.outstanding_principal exists", "defined_out": [ @@ -10839,7 +10863,7 @@ "principal_amount_due#0" ] }, - "1798": { + "1819": { "op": "bury 6", "defined_out": [ "event_type#0", @@ -10864,10 +10888,10 @@ "max_event_count#0" ] }, - "1800": { + "1821": { "op": "b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@28" }, - "1803": { + "1824": { "block": "fund_due_cashflows_after_if_else@22", "stack_in": [ "entry#0", @@ -10911,7 +10935,7 @@ "0" ] }, - "1804": { + "1825": { "op": "bytec 6 // \"accrued_interest\"", "defined_out": [ "\"accrued_interest\"", @@ -10938,7 +10962,7 @@ "\"accrued_interest\"" ] }, - "1806": { + "1827": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%1#0", @@ -10965,7 +10989,7 @@ "maybe_exists%1#0" ] }, - "1807": { + "1828": { "error": "check self.accrued_interest exists", "op": "assert // check self.accrued_interest exists", "stack_out": [ @@ -10988,7 +11012,7 @@ "maybe_value%1#0" ] }, - "1808": { + "1829": { "op": "dig 16", "defined_out": [ "entry#0", @@ -11015,7 +11039,7 @@ "entry#0" ] }, - "1810": { + "1831": { "callsub": "modules.actus_kernel.ActusKernelModule._entry_interest_segment", "op": "callsub _entry_interest_segment", "defined_out": [ @@ -11045,7 +11069,7 @@ "entry#0" ] }, - "1813": { + "1834": { "op": "bury 18", "defined_out": [ "_entry_interest_segment%0#0", @@ -11073,7 +11097,7 @@ "_entry_interest_segment%0#0" ] }, - "1815": { + "1836": { "op": "+", "defined_out": [ "entry#0", @@ -11099,7 +11123,7 @@ "interest_due#0" ] }, - "1816": { + "1837": { "op": "dup", "stack_out": [ "entry#0", @@ -11122,7 +11146,7 @@ "interest_due#0" ] }, - "1817": { + "1838": { "op": "bury 11", "defined_out": [ "entry#0", @@ -11148,7 +11172,7 @@ "interest_due#0" ] }, - "1819": { + "1840": { "op": "intc_0 // 0", "stack_out": [ "entry#0", @@ -11171,7 +11195,7 @@ "0" ] }, - "1820": { + "1841": { "op": "bytec 14 // \"next_principal_redemption\"", "defined_out": [ "\"next_principal_redemption\"", @@ -11201,7 +11225,7 @@ "\"next_principal_redemption\"" ] }, - "1822": { + "1843": { "op": "app_global_get_ex", "defined_out": [ "entry#0", @@ -11231,7 +11255,7 @@ "maybe_exists%2#0" ] }, - "1823": { + "1844": { "error": "check self.next_principal_redemption exists", "op": "assert // check self.next_principal_redemption exists", "stack_out": [ @@ -11255,7 +11279,7 @@ "maybe_value%2#0" ] }, - "1824": { + "1845": { "op": ">=", "defined_out": [ "entry#0", @@ -11282,7 +11306,7 @@ "tmp%6#2" ] }, - "1825": { + "1846": { "op": "bz fund_due_cashflows_after_if_else@24", "stack_out": [ "entry#0", @@ -11303,7 +11327,7 @@ "max_event_count#0" ] }, - "1828": { + "1849": { "op": "intc_0 // 0", "defined_out": [ "entry#0", @@ -11330,7 +11354,7 @@ "principal_amount_due#0" ] }, - "1829": { + "1850": { "op": "bury 6", "defined_out": [ "entry#0", @@ -11356,10 +11380,10 @@ "max_event_count#0" ] }, - "1831": { + "1852": { "op": "b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@28" }, - "1834": { + "1855": { "block": "fund_due_cashflows_after_if_else@24", "stack_in": [ "entry#0", @@ -11403,7 +11427,7 @@ "0" ] }, - "1835": { + "1856": { "op": "bytec 14 // \"next_principal_redemption\"", "defined_out": [ "\"next_principal_redemption\"", @@ -11430,7 +11454,7 @@ "\"next_principal_redemption\"" ] }, - "1837": { + "1858": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%3#0", @@ -11457,7 +11481,7 @@ "maybe_exists%3#0" ] }, - "1838": { + "1859": { "error": "check self.next_principal_redemption exists", "op": "assert // check self.next_principal_redemption exists", "stack_out": [ @@ -11480,7 +11504,7 @@ "maybe_value%3#1" ] }, - "1839": { + "1860": { "op": "dig 10", "defined_out": [ "interest_due#0", @@ -11507,7 +11531,7 @@ "interest_due#0" ] }, - "1841": { + "1862": { "op": "-", "defined_out": [ "interest_due#0", @@ -11533,7 +11557,7 @@ "principal_amount#1" ] }, - "1842": { + "1863": { "op": "dup", "stack_out": [ "entry#0", @@ -11556,7 +11580,7 @@ "principal_amount#1" ] }, - "1843": { + "1864": { "op": "bury 8", "defined_out": [ "interest_due#0", @@ -11582,7 +11606,7 @@ "principal_amount#1" ] }, - "1845": { + "1866": { "op": "intc_0 // 0", "stack_out": [ "entry#0", @@ -11605,7 +11629,7 @@ "0" ] }, - "1846": { + "1867": { "op": "bytec 4 // \"outstanding_principal\"", "defined_out": [ "\"outstanding_principal\"", @@ -11635,7 +11659,7 @@ "\"outstanding_principal\"" ] }, - "1848": { + "1869": { "op": "app_global_get_ex", "defined_out": [ "interest_due#0", @@ -11665,7 +11689,7 @@ "maybe_exists%4#1" ] }, - "1849": { + "1870": { "error": "check self.outstanding_principal exists", "op": "assert // check self.outstanding_principal exists", "stack_out": [ @@ -11689,7 +11713,7 @@ "maybe_value%4#1" ] }, - "1850": { + "1871": { "op": ">", "defined_out": [ "interest_due#0", @@ -11716,7 +11740,7 @@ "tmp%8#1" ] }, - "1851": { + "1872": { "op": "bz fund_due_cashflows_after_if_else@26", "stack_out": [ "entry#0", @@ -11737,7 +11761,7 @@ "max_event_count#0" ] }, - "1854": { + "1875": { "op": "intc_0 // 0", "stack_out": [ "entry#0", @@ -11759,7 +11783,7 @@ "0" ] }, - "1855": { + "1876": { "op": "bytec 4 // \"outstanding_principal\"", "stack_out": [ "entry#0", @@ -11782,7 +11806,7 @@ "\"outstanding_principal\"" ] }, - "1857": { + "1878": { "op": "app_global_get_ex", "defined_out": [ "interest_due#0", @@ -11811,7 +11835,7 @@ "maybe_exists%5#0" ] }, - "1858": { + "1879": { "error": "check self.outstanding_principal exists", "op": "assert // check self.outstanding_principal exists", "defined_out": [ @@ -11839,7 +11863,7 @@ "principal_amount_due#0" ] }, - "1859": { + "1880": { "op": "bury 6", "defined_out": [ "interest_due#0", @@ -11865,10 +11889,10 @@ "max_event_count#0" ] }, - "1861": { + "1882": { "op": "b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@28" }, - "1864": { + "1885": { "block": "fund_due_cashflows_after_if_else@26", "stack_in": [ "entry#0", @@ -11912,7 +11936,7 @@ "principal_amount_due#0" ] }, - "1866": { + "1887": { "op": "bury 6", "defined_out": [ "principal_amount_due#0" @@ -11936,10 +11960,10 @@ "max_event_count#0" ] }, - "1868": { + "1889": { "op": "b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@28" }, - "1871": { + "1892": { "block": "fund_due_cashflows_after_if_else@27", "stack_in": [ "entry#0", @@ -11983,7 +12007,7 @@ "entry#0" ] }, - "1873": { + "1894": { "op": "pushint 49", "defined_out": [ "49", @@ -12010,7 +12034,7 @@ "49" ] }, - "1875": { + "1896": { "op": "extract_uint64", "defined_out": [ "entry#0", @@ -12036,7 +12060,7 @@ "values%0#0" ] }, - "1876": { + "1897": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -12064,7 +12088,7 @@ "0" ] }, - "1877": { + "1898": { "op": "bytec 4 // \"outstanding_principal\"", "defined_out": [ "\"outstanding_principal\"", @@ -12094,7 +12118,7 @@ "\"outstanding_principal\"" ] }, - "1879": { + "1900": { "op": "app_global_get_ex", "defined_out": [ "entry#0", @@ -12124,7 +12148,7 @@ "maybe_exists%6#0" ] }, - "1880": { + "1901": { "error": "check self.outstanding_principal exists", "op": "assert // check self.outstanding_principal exists", "stack_out": [ @@ -12148,7 +12172,7 @@ "maybe_value%6#0" ] }, - "1881": { + "1902": { "op": "dup2", "defined_out": [ "entry#0", @@ -12180,7 +12204,7 @@ "maybe_value%6#0 (copy)" ] }, - "1882": { + "1903": { "op": "<=", "defined_out": [ "entry#0", @@ -12210,7 +12234,7 @@ "tmp%9#2" ] }, - "1883": { + "1904": { "error": "Invalid ACTUS configuration", "op": "assert // Invalid ACTUS configuration", "stack_out": [ @@ -12234,7 +12258,7 @@ "maybe_value%6#0" ] }, - "1884": { + "1905": { "op": "swap", "stack_out": [ "entry#0", @@ -12257,7 +12281,7 @@ "values%0#0" ] }, - "1885": { + "1906": { "op": "-", "defined_out": [ "entry#0", @@ -12284,7 +12308,7 @@ "principal_amount_due#0" ] }, - "1886": { + "1907": { "op": "bury 6", "defined_out": [ "entry#0", @@ -12310,10 +12334,10 @@ "max_event_count#0" ] }, - "1888": { + "1909": { "op": "b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@28" }, - "1891": { + "1912": { "block": "fund_due_cashflows_after_if_else@15", "stack_in": [ "entry#0", @@ -12357,7 +12381,7 @@ "0" ] }, - "1892": { + "1913": { "op": "bytec 6 // \"accrued_interest\"", "defined_out": [ "\"accrued_interest\"", @@ -12384,7 +12408,7 @@ "\"accrued_interest\"" ] }, - "1894": { + "1915": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -12411,7 +12435,7 @@ "maybe_exists%0#0" ] }, - "1895": { + "1916": { "error": "check self.accrued_interest exists", "op": "assert // check self.accrued_interest exists", "stack_out": [ @@ -12434,7 +12458,7 @@ "maybe_value%0#0" ] }, - "1896": { + "1917": { "op": "dig 16", "defined_out": [ "entry#0", @@ -12461,7 +12485,7 @@ "entry#0" ] }, - "1898": { + "1919": { "callsub": "modules.actus_kernel.ActusKernelModule._entry_interest_segment", "op": "callsub _entry_interest_segment", "defined_out": [ @@ -12491,7 +12515,7 @@ "entry#0" ] }, - "1901": { + "1922": { "op": "bury 18", "defined_out": [ "_entry_interest_segment%0#0", @@ -12519,7 +12543,7 @@ "_entry_interest_segment%0#0" ] }, - "1903": { + "1924": { "op": "+", "defined_out": [ "entry#0", @@ -12545,7 +12569,7 @@ "interest_amount_due#0" ] }, - "1904": { + "1925": { "op": "bury 11", "defined_out": [ "entry#0", @@ -12570,10 +12594,10 @@ "max_event_count#0" ] }, - "1906": { + "1927": { "op": "b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_interest_amount@16" }, - "1909": { + "1930": { "block": "fund_due_cashflows_after_while@11", "stack_in": [ "entry#0", @@ -12617,7 +12641,7 @@ "processed_events#0" ] }, - "1911": { + "1932": { "op": "dup", "defined_out": [ "processed_events#0", @@ -12644,7 +12668,7 @@ "processed_events#0 (copy)" ] }, - "1912": { + "1933": { "error": "No due cashflow to pay", "op": "assert // No due cashflow to pay", "stack_out": [ @@ -12667,7 +12691,7 @@ "processed_events#0" ] }, - "1913": { + "1934": { "op": "dig 14", "defined_out": [ "funded_interest#0", @@ -12694,7 +12718,7 @@ "funded_interest#0" ] }, - "1915": { + "1936": { "op": "dup", "defined_out": [ "funded_interest#0", @@ -12723,7 +12747,7 @@ "funded_interest#0 (copy)" ] }, - "1916": { + "1937": { "op": "dig 15", "defined_out": [ "funded_interest#0", @@ -12754,7 +12778,7 @@ "funded_principal#0" ] }, - "1918": { + "1939": { "op": "dup", "defined_out": [ "funded_interest#0", @@ -12787,7 +12811,7 @@ "funded_principal#0 (copy)" ] }, - "1919": { + "1940": { "op": "cover 3", "stack_out": [ "entry#0", @@ -12813,7 +12837,7 @@ "funded_principal#0 (copy)" ] }, - "1921": { + "1942": { "op": "+", "defined_out": [ "funded_interest#0", @@ -12844,7 +12868,7 @@ "tmp%14#0" ] }, - "1922": { + "1943": { "op": "global LatestTimestamp", "defined_out": [ "funded_interest#0", @@ -12877,7 +12901,7 @@ "tmp%15#0" ] }, - "1924": { + "1945": { "op": "uncover 2", "stack_out": [ "entry#0", @@ -12903,7 +12927,7 @@ "funded_interest#0" ] }, - "1926": { + "1947": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0", @@ -12937,7 +12961,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "1927": { + "1948": { "op": "uncover 3", "stack_out": [ "entry#0", @@ -12963,7 +12987,7 @@ "funded_principal#0" ] }, - "1929": { + "1950": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0", @@ -12998,7 +13022,7 @@ "aggregate%val_as_bytes%1#0" ] }, - "1930": { + "1951": { "op": "concat", "defined_out": [ "aggregate%head%1#0", @@ -13031,7 +13055,7 @@ "aggregate%head%1#0" ] }, - "1931": { + "1952": { "op": "uncover 2", "stack_out": [ "entry#0", @@ -13056,7 +13080,7 @@ "tmp%14#0" ] }, - "1933": { + "1954": { "op": "itob", "defined_out": [ "aggregate%head%1#0", @@ -13089,7 +13113,7 @@ "aggregate%val_as_bytes%2#0" ] }, - "1934": { + "1955": { "op": "concat", "defined_out": [ "aggregate%head%2#0", @@ -13120,7 +13144,7 @@ "aggregate%head%2#0" ] }, - "1935": { + "1956": { "op": "uncover 2", "stack_out": [ "entry#0", @@ -13144,7 +13168,7 @@ "processed_events#0" ] }, - "1937": { + "1958": { "op": "itob", "defined_out": [ "aggregate%head%2#0", @@ -13176,7 +13200,7 @@ "aggregate%val_as_bytes%3#0" ] }, - "1938": { + "1959": { "op": "concat", "defined_out": [ "aggregate%head%3#0", @@ -13206,7 +13230,7 @@ "aggregate%head%3#0" ] }, - "1939": { + "1960": { "op": "swap", "stack_out": [ "entry#0", @@ -13229,7 +13253,7 @@ "tmp%15#0" ] }, - "1940": { + "1961": { "op": "itob", "defined_out": [ "aggregate%head%3#0", @@ -13259,7 +13283,7 @@ "aggregate%val_as_bytes%4#0" ] }, - "1941": { + "1962": { "op": "concat", "defined_out": [ "aggregate%head%4#0", @@ -13287,7 +13311,7 @@ "aggregate%head%4#0" ] }, - "1942": { + "1963": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -13317,7 +13341,7 @@ "0x151f7c75" ] }, - "1943": { + "1964": { "op": "swap", "stack_out": [ "entry#0", @@ -13340,7 +13364,7 @@ "aggregate%head%4#0" ] }, - "1944": { + "1965": { "op": "concat", "defined_out": [ "funded_interest#0", @@ -13368,7 +13392,7 @@ "tmp%3#0" ] }, - "1945": { + "1966": { "op": "log", "stack_out": [ "entry#0", @@ -13389,7 +13413,7 @@ "max_event_count#0" ] }, - "1946": { + "1967": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -13417,7 +13441,7 @@ "1" ] }, - "1947": { + "1968": { "op": "return", "stack_out": [ "entry#0", @@ -13438,7 +13462,7 @@ "max_event_count#0" ] }, - "1948": { + "1969": { "block": "fund_due_cashflows_bool_false@53", "stack_in": [ "entry#0", @@ -13482,10 +13506,10 @@ "or_result%0#0" ] }, - "1949": { + "1970": { "op": "b fund_due_cashflows_bool_merge@54" }, - "1952": { + "1973": { "subroutine": "modules.payment_agent.PaymentAgent.claim_due_cashflows[routing]", "params": {}, "block": "claim_due_cashflows", @@ -13495,7 +13519,7 @@ "interest_amount#0" ] }, - "1954": { + "1975": { "op": "dupn 2", "stack_out": [ "interest_amount#0", @@ -13503,10 +13527,10 @@ "total_amount#0" ] }, - "1956": { + "1977": { "op": "txna ApplicationArgs 1" }, - "1959": { + "1980": { "op": "dupn 2", "defined_out": [ "holding_address#0", @@ -13521,7 +13545,7 @@ "holding_address#0 (copy)" ] }, - "1961": { + "1982": { "op": "len", "defined_out": [ "holding_address#0", @@ -13536,7 +13560,7 @@ "len%0#0" ] }, - "1962": { + "1983": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -13553,7 +13577,7 @@ "32" ] }, - "1963": { + "1984": { "op": "==", "defined_out": [ "eq%0#0", @@ -13568,7 +13592,7 @@ "eq%0#0" ] }, - "1964": { + "1985": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ @@ -13579,7 +13603,7 @@ "holding_address#0" ] }, - "1965": { + "1986": { "op": "txna ApplicationArgs 2", "defined_out": [ "holding_address#0", @@ -13594,7 +13618,7 @@ "tmp%2#0" ] }, - "1968": { + "1989": { "op": "dup", "defined_out": [ "holding_address#0", @@ -13611,7 +13635,7 @@ "tmp%2#0 (copy)" ] }, - "1969": { + "1990": { "op": "intc_0 // 0", "stack_out": [ "interest_amount#0", @@ -13624,7 +13648,7 @@ "0" ] }, - "1970": { + "1991": { "error": "invalid array length header", "op": "extract_uint16 // on error: invalid array length header", "defined_out": [ @@ -13642,7 +13666,7 @@ "aggregate%array_length%0#0" ] }, - "1971": { + "1992": { "op": "pushint 2", "defined_out": [ "2", @@ -13661,7 +13685,7 @@ "2" ] }, - "1973": { + "1994": { "op": "+", "defined_out": [ "add%0#0", @@ -13678,7 +13702,7 @@ "add%0#0" ] }, - "1974": { + "1995": { "op": "dig 1", "stack_out": [ "interest_amount#0", @@ -13691,7 +13715,7 @@ "tmp%2#0 (copy)" ] }, - "1976": { + "1997": { "op": "len", "defined_out": [ "add%0#0", @@ -13710,7 +13734,7 @@ "len%1#0" ] }, - "1977": { + "1998": { "op": "==", "defined_out": [ "eq%1#0", @@ -13727,7 +13751,7 @@ "eq%1#0" ] }, - "1978": { + "1999": { "error": "invalid number of bytes for arc4.dynamic_array", "op": "assert // invalid number of bytes for arc4.dynamic_array", "stack_out": [ @@ -13739,7 +13763,7 @@ "tmp%2#0" ] }, - "1979": { + "2000": { "op": "extract 2 0", "defined_out": [ "holding_address#0", @@ -13754,7 +13778,7 @@ "payment_info#0" ] }, - "1982": { + "2003": { "op": "swap", "defined_out": [ "holding_address#0", @@ -13769,7 +13793,7 @@ "holding_address#0" ] }, - "1983": { + "2004": { "op": "intc_0 // 0", "stack_out": [ "interest_amount#0", @@ -13781,7 +13805,7 @@ "0" ] }, - "1984": { + "2005": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"", @@ -13800,7 +13824,7 @@ "\"status\"" ] }, - "1985": { + "2006": { "op": "app_global_get_ex", "defined_out": [ "holding_address#0", @@ -13819,7 +13843,7 @@ "maybe_exists%0#0" ] }, - "1986": { + "2007": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ @@ -13832,7 +13856,7 @@ "maybe_value%0#0" ] }, - "1987": { + "2008": { "error": "D-ASA not configured", "op": "assert // D-ASA not configured", "stack_out": [ @@ -13844,7 +13868,7 @@ "holding_address#0" ] }, - "1988": { + "2009": { "op": "bytec 8 // 0x4123", "defined_out": [ "0x4123", @@ -13861,7 +13885,7 @@ "0x4123" ] }, - "1990": { + "2011": { "op": "swap", "stack_out": [ "interest_amount#0", @@ -13873,7 +13897,7 @@ "holding_address#0" ] }, - "1991": { + "2012": { "op": "concat", "defined_out": [ "box_prefixed_key%0#4", @@ -13889,7 +13913,7 @@ "box_prefixed_key%0#4" ] }, - "1992": { + "2013": { "op": "dup", "defined_out": [ "box_prefixed_key%0#4", @@ -13906,7 +13930,7 @@ "box_prefixed_key%0#4" ] }, - "1993": { + "2014": { "op": "box_len", "defined_out": [ "_%0#0", @@ -13926,7 +13950,7 @@ "maybe_exists%0#0" ] }, - "1994": { + "2015": { "op": "bury 1", "stack_out": [ "interest_amount#0", @@ -13938,7 +13962,7 @@ "maybe_exists%0#0" ] }, - "1996": { + "2017": { "error": "Invalid account holding address", "op": "assert // Invalid account holding address", "stack_out": [ @@ -13950,7 +13974,7 @@ "box_prefixed_key%0#4" ] }, - "1997": { + "2018": { "op": "intc_0 // 0", "stack_out": [ "interest_amount#0", @@ -13962,8 +13986,8 @@ "0" ] }, - "1998": { - "op": "bytec 26 // 0x523a4f504423", + "2019": { + "op": "bytec 27 // 0x523a4f504423", "defined_out": [ "0", "0x523a4f504423", @@ -13982,7 +14006,7 @@ "0x523a4f504423" ] }, - "2000": { + "2021": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#4", @@ -14002,7 +14026,7 @@ "maybe_exists%0#0" ] }, - "2001": { + "2022": { "error": "check self.op_daemon exists", "op": "assert // check self.op_daemon exists", "stack_out": [ @@ -14015,7 +14039,7 @@ "maybe_value%0#3" ] }, - "2002": { + "2023": { "op": "global ZeroAddress", "defined_out": [ "box_prefixed_key%0#4", @@ -14035,7 +14059,7 @@ "tmp%0#1" ] }, - "2004": { + "2025": { "op": "!=", "defined_out": [ "box_prefixed_key%0#4", @@ -14053,7 +14077,7 @@ "tmp%1#2" ] }, - "2005": { + "2026": { "op": "bz claim_due_cashflows_after_if_else@17", "stack_out": [ "interest_amount#0", @@ -14064,7 +14088,7 @@ "box_prefixed_key%0#4" ] }, - "2008": { + "2029": { "op": "txn Sender", "defined_out": [ "box_prefixed_key%0#4", @@ -14082,7 +14106,7 @@ "tmp%2#3" ] }, - "2010": { + "2031": { "op": "intc_0 // 0", "stack_out": [ "interest_amount#0", @@ -14095,8 +14119,8 @@ "0" ] }, - "2011": { - "op": "bytec 26 // 0x523a4f504423", + "2032": { + "op": "bytec 27 // 0x523a4f504423", "stack_out": [ "interest_amount#0", "principal_amount#0", @@ -14109,7 +14133,7 @@ "0x523a4f504423" ] }, - "2013": { + "2034": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#4", @@ -14131,7 +14155,7 @@ "maybe_exists%1#0" ] }, - "2014": { + "2035": { "error": "check self.op_daemon exists", "op": "assert // check self.op_daemon exists", "stack_out": [ @@ -14145,7 +14169,7 @@ "maybe_value%1#1" ] }, - "2015": { + "2036": { "op": "==", "defined_out": [ "box_prefixed_key%0#4", @@ -14163,7 +14187,7 @@ "tmp%3#1" ] }, - "2016": { + "2037": { "op": "bnz claim_due_cashflows_bool_true@14", "stack_out": [ "interest_amount#0", @@ -14174,7 +14198,7 @@ "box_prefixed_key%0#4" ] }, - "2019": { + "2040": { "op": "txn Sender", "defined_out": [ "box_prefixed_key%0#4", @@ -14192,7 +14216,7 @@ "tmp%4#0" ] }, - "2021": { + "2042": { "op": "dig 3", "stack_out": [ "interest_amount#0", @@ -14205,7 +14229,7 @@ "holding_address#0" ] }, - "2023": { + "2044": { "op": "==", "defined_out": [ "box_prefixed_key%0#4", @@ -14223,7 +14247,7 @@ "tmp%5#2" ] }, - "2024": { + "2045": { "op": "bnz claim_due_cashflows_bool_true@14", "stack_out": [ "interest_amount#0", @@ -14234,7 +14258,7 @@ "box_prefixed_key%0#4" ] }, - "2027": { + "2048": { "op": "txn Sender", "defined_out": [ "box_prefixed_key%0#4", @@ -14252,7 +14276,7 @@ "tmp%6#1" ] }, - "2029": { + "2050": { "op": "dig 1", "stack_out": [ "interest_amount#0", @@ -14265,7 +14289,7 @@ "box_prefixed_key%0#4" ] }, - "2031": { + "2052": { "op": "box_get", "defined_out": [ "aggregate%box_get%0#0", @@ -14287,7 +14311,7 @@ "aggregate%box_get%1#0" ] }, - "2032": { + "2053": { "error": "check self.account entry exists", "op": "assert // check self.account entry exists", "stack_out": [ @@ -14301,7 +14325,7 @@ "aggregate%box_get%0#0" ] }, - "2033": { + "2054": { "op": "extract 0 32", "defined_out": [ "aggregate%extract%0#0", @@ -14321,7 +14345,7 @@ "aggregate%extract%0#0" ] }, - "2036": { + "2057": { "op": "==", "defined_out": [ "box_prefixed_key%0#4", @@ -14339,7 +14363,7 @@ "tmp%7#1" ] }, - "2037": { + "2058": { "op": "bz claim_due_cashflows_bool_false@15", "stack_out": [ "interest_amount#0", @@ -14350,7 +14374,7 @@ "box_prefixed_key%0#4" ] }, - "2040": { + "2061": { "block": "claim_due_cashflows_bool_true@14", "stack_in": [ "interest_amount#0", @@ -14374,7 +14398,7 @@ "or_result%0#0" ] }, - "2041": { + "2062": { "error": "Not authorized", "block": "claim_due_cashflows_bool_merge@16", "stack_in": [ @@ -14397,7 +14421,7 @@ "box_prefixed_key%0#4" ] }, - "2042": { + "2063": { "block": "claim_due_cashflows_after_if_else@17", "stack_in": [ "interest_amount#0", @@ -14410,11 +14434,11 @@ "callsub": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", "op": "callsub _assert_is_not_asset_defaulted" }, - "2045": { + "2066": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_suspended", "op": "callsub _assert_is_not_asset_suspended" }, - "2048": { + "2069": { "op": "intc_0 // 0", "defined_out": [ "0" @@ -14429,7 +14453,7 @@ "0" ] }, - "2049": { + "2070": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"", @@ -14446,7 +14470,7 @@ "\"status\"" ] }, - "2050": { + "2071": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -14463,7 +14487,7 @@ "maybe_exists%0#0" ] }, - "2051": { + "2072": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ @@ -14476,7 +14500,7 @@ "maybe_value%0#0" ] }, - "2052": { + "2073": { "op": "pushint 50", "defined_out": [ "50", @@ -14493,7 +14517,7 @@ "50" ] }, - "2054": { + "2075": { "op": "==", "defined_out": [ "tmp%0#2" @@ -14508,7 +14532,7 @@ "tmp%0#2" ] }, - "2055": { + "2076": { "op": "!", "defined_out": [ "tmp%1#2" @@ -14523,7 +14547,7 @@ "tmp%1#2" ] }, - "2056": { + "2077": { "error": "IED not yet executed", "op": "assert // IED not yet executed", "stack_out": [ @@ -14535,7 +14559,7 @@ "box_prefixed_key%0#4" ] }, - "2057": { + "2078": { "op": "dig 2", "defined_out": [ "holding_address#0" @@ -14550,7 +14574,7 @@ "holding_address#0" ] }, - "2059": { + "2080": { "op": "dup", "defined_out": [ "holding_address#0", @@ -14567,7 +14591,7 @@ "holding_address#0 (copy)" ] }, - "2060": { + "2081": { "callsub": "modules.accounting.AccountingModule._ensure_units_activated", "op": "callsub _ensure_units_activated", "stack_out": [ @@ -14580,7 +14604,7 @@ "holding_address#0" ] }, - "2063": { + "2084": { "callsub": "modules.accounting.AccountingModule._settle_position", "op": "callsub _settle_position", "defined_out": [ @@ -14599,7 +14623,7 @@ "{_settle_position}.1" ] }, - "2066": { + "2087": { "op": "popn 2", "stack_out": [ "interest_amount#0", @@ -14610,7 +14634,7 @@ "box_prefixed_key%0#4" ] }, - "2068": { + "2089": { "op": "dup", "defined_out": [ "box_prefixed_key%0#4", @@ -14626,7 +14650,7 @@ "box_prefixed_key%0#4" ] }, - "2069": { + "2090": { "op": "box_get", "defined_out": [ "aggregate%box_get%2#0", @@ -14645,7 +14669,7 @@ "aggregate%box_get%3#0" ] }, - "2070": { + "2091": { "error": "check self.account entry exists", "op": "assert // check self.account entry exists", "stack_out": [ @@ -14658,7 +14682,7 @@ "aggregate%box_get%2#0" ] }, - "2071": { + "2092": { "op": "dup", "defined_out": [ "aggregate%box_get%2#0", @@ -14677,7 +14701,7 @@ "aggregate%box_get%2#0 (copy)" ] }, - "2072": { + "2093": { "op": "pushint 73", "defined_out": [ "73", @@ -14698,7 +14722,7 @@ "73" ] }, - "2074": { + "2095": { "op": "extract_uint64", "defined_out": [ "aggregate%box_get%2#0", @@ -14717,7 +14741,7 @@ "interest_amount#0" ] }, - "2075": { + "2096": { "op": "dup", "stack_out": [ "interest_amount#0", @@ -14731,7 +14755,7 @@ "interest_amount#0 (copy)" ] }, - "2076": { + "2097": { "op": "cover 2", "stack_out": [ "interest_amount#0", @@ -14745,7 +14769,7 @@ "interest_amount#0" ] }, - "2078": { + "2099": { "op": "bury 8", "defined_out": [ "aggregate%box_get%2#0", @@ -14764,7 +14788,7 @@ "aggregate%box_get%2#0" ] }, - "2080": { + "2101": { "op": "dup", "stack_out": [ "interest_amount#0", @@ -14778,7 +14802,7 @@ "aggregate%box_get%2#0 (copy)" ] }, - "2081": { + "2102": { "op": "pushint 81", "defined_out": [ "81", @@ -14801,7 +14825,7 @@ "81" ] }, - "2083": { + "2104": { "op": "extract_uint64", "defined_out": [ "aggregate%box_get%2#0", @@ -14822,7 +14846,7 @@ "principal_amount#0" ] }, - "2084": { + "2105": { "op": "dup", "stack_out": [ "interest_amount#0", @@ -14837,7 +14861,7 @@ "principal_amount#0" ] }, - "2085": { + "2106": { "op": "bury 8", "defined_out": [ "aggregate%box_get%2#0", @@ -14858,7 +14882,7 @@ "principal_amount#0" ] }, - "2087": { + "2108": { "op": "uncover 2", "stack_out": [ "interest_amount#0", @@ -14872,7 +14896,7 @@ "interest_amount#0" ] }, - "2089": { + "2110": { "op": "+", "defined_out": [ "aggregate%box_get%2#0", @@ -14893,7 +14917,7 @@ "total_amount#0" ] }, - "2090": { + "2111": { "op": "dup", "stack_out": [ "interest_amount#0", @@ -14907,7 +14931,7 @@ "total_amount#0" ] }, - "2091": { + "2112": { "op": "bury 6", "stack_out": [ "interest_amount#0", @@ -14920,7 +14944,7 @@ "total_amount#0" ] }, - "2093": { + "2114": { "error": "No due cashflow to pay", "op": "assert // No due cashflow to pay", "stack_out": [ @@ -14933,7 +14957,7 @@ "aggregate%box_get%2#0" ] }, - "2094": { + "2115": { "op": "extract 0 32", "defined_out": [ "aggregate%extract%5#0", @@ -14953,7 +14977,7 @@ "aggregate%extract%5#0" ] }, - "2097": { + "2118": { "op": "intc_0 // 0", "stack_out": [ "interest_amount#0", @@ -14966,7 +14990,7 @@ "0" ] }, - "2098": { + "2119": { "op": "bytec 19 // \"settlement_asset_id\"", "defined_out": [ "\"settlement_asset_id\"", @@ -14990,7 +15014,7 @@ "\"settlement_asset_id\"" ] }, - "2100": { + "2121": { "op": "app_global_get_ex", "stack_out": [ "interest_amount#0", @@ -15004,7 +15028,7 @@ "maybe_exists%0#0" ] }, - "2101": { + "2122": { "error": "check self.settlement_asset_id exists", "op": "assert // check self.settlement_asset_id exists", "stack_out": [ @@ -15018,7 +15042,7 @@ "maybe_value%0#0" ] }, - "2102": { + "2123": { "op": "asset_holding_get AssetBalance", "defined_out": [ "box_prefixed_key%0#4", @@ -15040,7 +15064,7 @@ "tmp%1#2" ] }, - "2104": { + "2125": { "op": "bury 1", "stack_out": [ "interest_amount#0", @@ -15052,7 +15076,7 @@ "tmp%1#2" ] }, - "2106": { + "2127": { "op": "bz claim_due_cashflows_bool_false@24", "stack_out": [ "interest_amount#0", @@ -15063,7 +15087,7 @@ "box_prefixed_key%0#4" ] }, - "2109": { + "2130": { "op": "dup", "stack_out": [ "interest_amount#0", @@ -15075,7 +15099,7 @@ "box_prefixed_key%0#4" ] }, - "2110": { + "2131": { "op": "box_get", "defined_out": [ "aggregate%box_get%12#0", @@ -15097,7 +15121,7 @@ "aggregate%box_get%13#0" ] }, - "2111": { + "2132": { "error": "check self.account entry exists", "op": "assert // check self.account entry exists", "stack_out": [ @@ -15110,7 +15134,7 @@ "aggregate%box_get%12#0" ] }, - "2112": { + "2133": { "op": "pushint 384", "defined_out": [ "384", @@ -15132,7 +15156,7 @@ "384" ] }, - "2115": { + "2136": { "op": "getbit", "defined_out": [ "aggregate%get_bit%0#0", @@ -15152,7 +15176,7 @@ "aggregate%get_bit%0#0" ] }, - "2116": { + "2137": { "op": "bnz claim_due_cashflows_bool_false@24", "stack_out": [ "interest_amount#0", @@ -15163,7 +15187,7 @@ "box_prefixed_key%0#4" ] }, - "2119": { + "2140": { "op": "intc_1 // 1", "defined_out": [ "and_result%0#0", @@ -15183,7 +15207,7 @@ "and_result%0#0" ] }, - "2120": { + "2141": { "block": "claim_due_cashflows_bool_merge@25", "stack_in": [ "interest_amount#0", @@ -15205,7 +15229,7 @@ "box_prefixed_key%0#4" ] }, - "2123": { + "2144": { "op": "global CurrentApplicationAddress", "defined_out": [ "tmp%0#1" @@ -15220,7 +15244,7 @@ "tmp%0#1" ] }, - "2125": { + "2146": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -15237,7 +15261,7 @@ "0" ] }, - "2126": { + "2147": { "op": "bytec 19 // \"settlement_asset_id\"", "defined_out": [ "\"settlement_asset_id\"", @@ -15256,7 +15280,7 @@ "\"settlement_asset_id\"" ] }, - "2128": { + "2149": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -15275,7 +15299,7 @@ "maybe_exists%0#0" ] }, - "2129": { + "2150": { "error": "check self.settlement_asset_id exists", "op": "assert // check self.settlement_asset_id exists", "stack_out": [ @@ -15289,7 +15313,7 @@ "maybe_value%0#0" ] }, - "2130": { + "2151": { "op": "swap", "stack_out": [ "interest_amount#0", @@ -15302,7 +15326,7 @@ "tmp%0#1" ] }, - "2131": { + "2152": { "op": "dig 1", "defined_out": [ "maybe_value%0#0", @@ -15321,7 +15345,7 @@ "maybe_value%0#0 (copy)" ] }, - "2133": { + "2154": { "op": "asset_holding_get AssetBalance", "defined_out": [ "check%0#0", @@ -15340,7 +15364,7 @@ "check%0#0" ] }, - "2135": { + "2156": { "error": "account opted into asset", "op": "assert // account opted into asset", "stack_out": [ @@ -15354,7 +15378,7 @@ "value%0#0" ] }, - "2136": { + "2157": { "op": "dig 5", "defined_out": [ "maybe_value%0#0", @@ -15373,7 +15397,7 @@ "total_amount#0" ] }, - "2138": { + "2159": { "op": "dup", "defined_out": [ "maybe_value%0#0", @@ -15394,7 +15418,7 @@ "total_amount#0 (copy)" ] }, - "2139": { + "2160": { "op": "cover 2", "stack_out": [ "interest_amount#0", @@ -15409,7 +15433,7 @@ "total_amount#0 (copy)" ] }, - "2141": { + "2162": { "op": ">=", "defined_out": [ "maybe_value%0#0", @@ -15428,7 +15452,7 @@ "tmp%1#2" ] }, - "2142": { + "2163": { "error": "Not enough funds for the payment", "op": "assert // Not enough funds for the payment", "stack_out": [ @@ -15442,7 +15466,7 @@ "total_amount#0" ] }, - "2143": { + "2164": { "op": "dig 2", "defined_out": [ "box_prefixed_key%0#4", @@ -15461,7 +15485,7 @@ "box_prefixed_key%0#4" ] }, - "2145": { + "2166": { "op": "dup", "defined_out": [ "box_prefixed_key%0#4", @@ -15482,7 +15506,7 @@ "box_prefixed_key%0#4 (copy)" ] }, - "2146": { + "2167": { "op": "cover 3", "stack_out": [ "interest_amount#0", @@ -15497,7 +15521,7 @@ "box_prefixed_key%0#4 (copy)" ] }, - "2148": { + "2169": { "op": "box_get", "defined_out": [ "aggregate%box_get%15#0", @@ -15520,7 +15544,7 @@ "aggregate%box_get%15#0" ] }, - "2149": { + "2170": { "error": "check self.account entry exists", "op": "assert // check self.account entry exists", "stack_out": [ @@ -15536,7 +15560,7 @@ "position#0" ] }, - "2150": { + "2171": { "op": "dup", "defined_out": [ "box_prefixed_key%0#4", @@ -15559,7 +15583,7 @@ "position#0 (copy)" ] }, - "2151": { + "2172": { "op": "extract 0 32", "defined_out": [ "box_prefixed_key%0#4", @@ -15582,10 +15606,10 @@ "receiver#0" ] }, - "2154": { + "2175": { "op": "itxn_begin" }, - "2155": { + "2176": { "op": "global MinTxnFee", "defined_out": [ "box_prefixed_key%0#4", @@ -15610,7 +15634,7 @@ "inner_txn_params%0%%param_Fee_idx_0#0" ] }, - "2157": { + "2178": { "op": "uncover 3", "stack_out": [ "interest_amount#0", @@ -15627,7 +15651,7 @@ "total_amount#0" ] }, - "2159": { + "2180": { "op": "itxn_field AssetAmount", "stack_out": [ "interest_amount#0", @@ -15643,7 +15667,7 @@ "inner_txn_params%0%%param_Fee_idx_0#0" ] }, - "2161": { + "2182": { "op": "swap", "stack_out": [ "interest_amount#0", @@ -15659,7 +15683,7 @@ "receiver#0" ] }, - "2162": { + "2183": { "op": "itxn_field AssetReceiver", "stack_out": [ "interest_amount#0", @@ -15674,7 +15698,7 @@ "inner_txn_params%0%%param_Fee_idx_0#0" ] }, - "2164": { + "2185": { "op": "uncover 2", "stack_out": [ "interest_amount#0", @@ -15689,7 +15713,7 @@ "maybe_value%0#0" ] }, - "2166": { + "2187": { "op": "itxn_field XferAsset", "stack_out": [ "interest_amount#0", @@ -15703,7 +15727,7 @@ "inner_txn_params%0%%param_Fee_idx_0#0" ] }, - "2168": { + "2189": { "op": "pushint 4 // axfer", "defined_out": [ "axfer", @@ -15725,7 +15749,7 @@ "axfer" ] }, - "2170": { + "2191": { "op": "itxn_field TypeEnum", "stack_out": [ "interest_amount#0", @@ -15739,7 +15763,7 @@ "inner_txn_params%0%%param_Fee_idx_0#0" ] }, - "2172": { + "2193": { "op": "itxn_field Fee", "stack_out": [ "interest_amount#0", @@ -15752,10 +15776,10 @@ "position#0" ] }, - "2174": { + "2195": { "op": "itxn_submit" }, - "2175": { + "2196": { "op": "dup", "stack_out": [ "interest_amount#0", @@ -15769,7 +15793,7 @@ "position#0 (copy)" ] }, - "2176": { + "2197": { "op": "pushint 73", "defined_out": [ "73", @@ -15791,7 +15815,7 @@ "73" ] }, - "2178": { + "2199": { "op": "extract_uint64", "defined_out": [ "box_prefixed_key%0#4", @@ -15811,7 +15835,7 @@ "interest_amount#0" ] }, - "2179": { + "2200": { "op": "dup", "stack_out": [ "interest_amount#0", @@ -15826,7 +15850,7 @@ "interest_amount#0 (copy)" ] }, - "2180": { + "2201": { "op": "cover 2", "stack_out": [ "interest_amount#0", @@ -15841,7 +15865,7 @@ "interest_amount#0" ] }, - "2182": { + "2203": { "op": "bury 9", "defined_out": [ "box_prefixed_key%0#4", @@ -15861,7 +15885,7 @@ "position#0" ] }, - "2184": { + "2205": { "op": "dup", "stack_out": [ "interest_amount#0", @@ -15876,7 +15900,7 @@ "position#0 (copy)" ] }, - "2185": { + "2206": { "op": "pushint 81", "defined_out": [ "81", @@ -15900,7 +15924,7 @@ "81" ] }, - "2187": { + "2208": { "op": "extract_uint64", "defined_out": [ "box_prefixed_key%0#4", @@ -15922,7 +15946,7 @@ "principal_amount#0" ] }, - "2188": { + "2209": { "op": "dup", "stack_out": [ "interest_amount#0", @@ -15938,7 +15962,7 @@ "principal_amount#0 (copy)" ] }, - "2189": { + "2210": { "op": "cover 3", "stack_out": [ "interest_amount#0", @@ -15954,7 +15978,7 @@ "principal_amount#0" ] }, - "2191": { + "2212": { "op": "bury 9", "defined_out": [ "box_prefixed_key%0#4", @@ -15976,7 +16000,7 @@ "position#0" ] }, - "2193": { + "2214": { "op": "intc_0 // 0", "stack_out": [ "interest_amount#0", @@ -15992,7 +16016,7 @@ "0" ] }, - "2194": { + "2215": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0", @@ -16016,7 +16040,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "2195": { + "2216": { "op": "swap", "stack_out": [ "interest_amount#0", @@ -16032,7 +16056,7 @@ "position#0" ] }, - "2196": { + "2217": { "op": "dig 1", "defined_out": [ "aggregate%val_as_bytes%0#0", @@ -16058,7 +16082,7 @@ "aggregate%val_as_bytes%0#0 (copy)" ] }, - "2198": { + "2219": { "op": "replace2 73", "stack_out": [ "interest_amount#0", @@ -16074,7 +16098,7 @@ "position#0" ] }, - "2200": { + "2221": { "op": "swap", "stack_out": [ "interest_amount#0", @@ -16090,7 +16114,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "2201": { + "2222": { "op": "replace2 81", "stack_out": [ "interest_amount#0", @@ -16105,7 +16129,7 @@ "position#0" ] }, - "2203": { + "2224": { "op": "uncover 3", "stack_out": [ "interest_amount#0", @@ -16120,7 +16144,7 @@ "box_prefixed_key%0#4" ] }, - "2205": { + "2226": { "op": "swap", "stack_out": [ "interest_amount#0", @@ -16135,7 +16159,7 @@ "position#0" ] }, - "2206": { + "2227": { "op": "box_put", "stack_out": [ "interest_amount#0", @@ -16148,7 +16172,7 @@ "interest_amount#0" ] }, - "2207": { + "2228": { "op": "intc_0 // 0", "stack_out": [ "interest_amount#0", @@ -16162,7 +16186,7 @@ "0" ] }, - "2208": { + "2229": { "op": "bytec 15 // \"reserved_interest\"", "defined_out": [ "\"reserved_interest\"", @@ -16185,7 +16209,7 @@ "\"reserved_interest\"" ] }, - "2210": { + "2231": { "op": "app_global_get_ex", "stack_out": [ "interest_amount#0", @@ -16200,7 +16224,7 @@ "maybe_exists%0#0" ] }, - "2211": { + "2232": { "error": "check self.reserved_interest exists", "op": "assert // check self.reserved_interest exists", "stack_out": [ @@ -16215,7 +16239,7 @@ "maybe_value%0#0" ] }, - "2212": { + "2233": { "op": "dup", "stack_out": [ "interest_amount#0", @@ -16230,7 +16254,7 @@ "maybe_value%0#0 (copy)" ] }, - "2213": { + "2234": { "op": "dig 2", "defined_out": [ "box_prefixed_key%0#4", @@ -16255,7 +16279,7 @@ "interest_amount#0 (copy)" ] }, - "2215": { + "2236": { "op": ">=", "defined_out": [ "box_prefixed_key%0#4", @@ -16278,7 +16302,7 @@ "tmp%0#2" ] }, - "2216": { + "2237": { "error": "Not enough funds for the payment", "op": "assert // Not enough funds for the payment", "stack_out": [ @@ -16293,7 +16317,7 @@ "maybe_value%0#0" ] }, - "2217": { + "2238": { "op": "intc_0 // 0", "stack_out": [ "interest_amount#0", @@ -16308,7 +16332,7 @@ "0" ] }, - "2218": { + "2239": { "op": "bytec 12 // \"reserved_principal\"", "defined_out": [ "\"reserved_principal\"", @@ -16333,7 +16357,7 @@ "\"reserved_principal\"" ] }, - "2220": { + "2241": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#4", @@ -16358,7 +16382,7 @@ "maybe_exists%1#0" ] }, - "2221": { + "2242": { "error": "check self.reserved_principal exists", "op": "assert // check self.reserved_principal exists", "stack_out": [ @@ -16374,7 +16398,7 @@ "maybe_value%1#0" ] }, - "2222": { + "2243": { "op": "dig 3", "defined_out": [ "box_prefixed_key%0#4", @@ -16399,7 +16423,7 @@ "principal_amount#0 (copy)" ] }, - "2224": { + "2245": { "op": ">=", "stack_out": [ "interest_amount#0", @@ -16414,7 +16438,7 @@ "tmp%1#2" ] }, - "2225": { + "2246": { "error": "Not enough funds for the payment", "op": "assert // Not enough funds for the payment", "stack_out": [ @@ -16429,7 +16453,7 @@ "maybe_value%0#0" ] }, - "2226": { + "2247": { "op": "swap", "stack_out": [ "interest_amount#0", @@ -16443,7 +16467,7 @@ "interest_amount#0" ] }, - "2227": { + "2248": { "op": "-", "defined_out": [ "box_prefixed_key%0#4", @@ -16463,7 +16487,7 @@ "tmp%2#2" ] }, - "2228": { + "2249": { "op": "bytec 15 // \"reserved_interest\"", "stack_out": [ "interest_amount#0", @@ -16477,7 +16501,7 @@ "\"reserved_interest\"" ] }, - "2230": { + "2251": { "op": "swap", "stack_out": [ "interest_amount#0", @@ -16491,7 +16515,7 @@ "tmp%2#2" ] }, - "2231": { + "2252": { "op": "app_global_put", "stack_out": [ "interest_amount#0", @@ -16503,7 +16527,7 @@ "principal_amount#0" ] }, - "2232": { + "2253": { "op": "intc_0 // 0", "stack_out": [ "interest_amount#0", @@ -16516,7 +16540,7 @@ "0" ] }, - "2233": { + "2254": { "op": "bytec 12 // \"reserved_principal\"", "stack_out": [ "interest_amount#0", @@ -16530,7 +16554,7 @@ "\"reserved_principal\"" ] }, - "2235": { + "2256": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#4", @@ -16552,7 +16576,7 @@ "maybe_exists%3#0" ] }, - "2236": { + "2257": { "error": "check self.reserved_principal exists", "op": "assert // check self.reserved_principal exists", "stack_out": [ @@ -16566,7 +16590,7 @@ "maybe_value%3#0" ] }, - "2237": { + "2258": { "op": "swap", "stack_out": [ "interest_amount#0", @@ -16579,7 +16603,7 @@ "principal_amount#0" ] }, - "2238": { + "2259": { "op": "-", "defined_out": [ "box_prefixed_key%0#4", @@ -16598,7 +16622,7 @@ "tmp%3#0" ] }, - "2239": { + "2260": { "op": "bytec 12 // \"reserved_principal\"", "stack_out": [ "interest_amount#0", @@ -16611,7 +16635,7 @@ "\"reserved_principal\"" ] }, - "2241": { + "2262": { "op": "swap", "stack_out": [ "interest_amount#0", @@ -16624,7 +16648,7 @@ "tmp%3#0" ] }, - "2242": { + "2263": { "op": "app_global_put", "stack_out": [ "interest_amount#0", @@ -16635,7 +16659,7 @@ "box_prefixed_key%0#4" ] }, - "2243": { + "2264": { "block": "claim_due_cashflows_after_if_else@3", "stack_in": [ "interest_amount#0", @@ -16659,7 +16683,7 @@ "interest_amount#0" ] }, - "2245": { + "2266": { "op": "dup", "defined_out": [ "interest_amount#0", @@ -16676,7 +16700,7 @@ "interest_amount#0 (copy)" ] }, - "2246": { + "2267": { "op": "dig 6", "defined_out": [ "interest_amount#0", @@ -16695,7 +16719,7 @@ "principal_amount#0" ] }, - "2248": { + "2269": { "op": "dup", "defined_out": [ "interest_amount#0", @@ -16716,7 +16740,7 @@ "principal_amount#0 (copy)" ] }, - "2249": { + "2270": { "op": "cover 3", "stack_out": [ "interest_amount#0", @@ -16731,7 +16755,7 @@ "principal_amount#0 (copy)" ] }, - "2251": { + "2272": { "op": "+", "defined_out": [ "interest_amount#0", @@ -16750,7 +16774,7 @@ "tmp%5#1" ] }, - "2252": { + "2273": { "op": "global LatestTimestamp", "defined_out": [ "interest_amount#0", @@ -16771,7 +16795,7 @@ "tmp%6#0" ] }, - "2254": { + "2275": { "op": "uncover 2", "stack_out": [ "interest_amount#0", @@ -16786,7 +16810,7 @@ "interest_amount#0" ] }, - "2256": { + "2277": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%1#0", @@ -16808,7 +16832,7 @@ "aggregate%val_as_bytes%1#0" ] }, - "2257": { + "2278": { "op": "uncover 3", "stack_out": [ "interest_amount#0", @@ -16823,7 +16847,7 @@ "principal_amount#0" ] }, - "2259": { + "2280": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%1#0", @@ -16846,7 +16870,7 @@ "aggregate%val_as_bytes%2#0" ] }, - "2260": { + "2281": { "op": "concat", "defined_out": [ "aggregate%head%1#0", @@ -16867,7 +16891,7 @@ "aggregate%head%1#0" ] }, - "2261": { + "2282": { "op": "uncover 2", "stack_out": [ "interest_amount#0", @@ -16881,7 +16905,7 @@ "tmp%5#1" ] }, - "2263": { + "2284": { "op": "itob", "defined_out": [ "aggregate%head%1#0", @@ -16902,7 +16926,7 @@ "aggregate%val_as_bytes%3#0" ] }, - "2264": { + "2285": { "op": "concat", "defined_out": [ "aggregate%head%2#0", @@ -16921,7 +16945,7 @@ "aggregate%head%2#0" ] }, - "2265": { + "2286": { "op": "swap", "stack_out": [ "interest_amount#0", @@ -16934,7 +16958,7 @@ "tmp%6#0" ] }, - "2266": { + "2287": { "op": "itob", "defined_out": [ "aggregate%head%2#0", @@ -16953,7 +16977,7 @@ "aggregate%val_as_bytes%4#0" ] }, - "2267": { + "2288": { "op": "concat", "defined_out": [ "aggregate%head%3#0", @@ -16970,7 +16994,7 @@ "aggregate%head%3#0" ] }, - "2268": { + "2289": { "op": "dig 2", "defined_out": [ "aggregate%head%3#0", @@ -16989,7 +17013,7 @@ "payment_info#0" ] }, - "2270": { + "2291": { "op": "dup", "defined_out": [ "aggregate%head%3#0", @@ -17010,7 +17034,7 @@ "payment_info#0 (copy)" ] }, - "2271": { + "2292": { "op": "len", "defined_out": [ "aggregate%head%3#0", @@ -17031,7 +17055,7 @@ "aggregate%length%0#0" ] }, - "2272": { + "2293": { "op": "itob", "defined_out": [ "aggregate%as_bytes%0#0", @@ -17052,7 +17076,7 @@ "aggregate%as_bytes%0#0" ] }, - "2273": { + "2294": { "op": "extract 6 2", "defined_out": [ "aggregate%head%3#0", @@ -17073,7 +17097,7 @@ "aggregate%length_uint16%0#0" ] }, - "2276": { + "2297": { "op": "swap", "stack_out": [ "interest_amount#0", @@ -17087,7 +17111,7 @@ "payment_info#0" ] }, - "2277": { + "2298": { "op": "concat", "defined_out": [ "aggregate%encoded_value%0#0", @@ -17107,7 +17131,7 @@ "aggregate%encoded_value%0#0" ] }, - "2278": { + "2299": { "op": "swap", "stack_out": [ "interest_amount#0", @@ -17120,7 +17144,7 @@ "aggregate%head%3#0" ] }, - "2279": { + "2300": { "op": "pushbytes 0x0022", "defined_out": [ "0x0022", @@ -17142,7 +17166,7 @@ "0x0022" ] }, - "2283": { + "2304": { "op": "concat", "defined_out": [ "aggregate%encoded_value%0#0", @@ -17162,7 +17186,7 @@ "aggregate%head%4#0" ] }, - "2284": { + "2305": { "op": "swap", "stack_out": [ "interest_amount#0", @@ -17175,7 +17199,7 @@ "aggregate%encoded_value%0#0" ] }, - "2285": { + "2306": { "op": "concat", "defined_out": [ "aggregate%concat%0#0", @@ -17193,7 +17217,7 @@ "aggregate%concat%0#0" ] }, - "2286": { + "2307": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -17213,7 +17237,7 @@ "0x151f7c75" ] }, - "2287": { + "2308": { "op": "swap", "stack_out": [ "interest_amount#0", @@ -17226,7 +17250,7 @@ "aggregate%concat%0#0" ] }, - "2288": { + "2309": { "op": "concat", "defined_out": [ "interest_amount#0", @@ -17244,7 +17268,7 @@ "tmp%5#0" ] }, - "2289": { + "2310": { "op": "log", "stack_out": [ "interest_amount#0", @@ -17255,7 +17279,7 @@ "box_prefixed_key%0#4" ] }, - "2290": { + "2311": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -17273,7 +17297,7 @@ "1" ] }, - "2291": { + "2312": { "op": "return", "stack_out": [ "interest_amount#0", @@ -17284,7 +17308,7 @@ "box_prefixed_key%0#4" ] }, - "2292": { + "2313": { "block": "claim_due_cashflows_bool_false@24", "stack_in": [ "interest_amount#0", @@ -17308,10 +17332,10 @@ "and_result%0#0" ] }, - "2293": { + "2314": { "op": "b claim_due_cashflows_bool_merge@25" }, - "2296": { + "2317": { "block": "claim_due_cashflows_bool_false@15", "stack_in": [ "interest_amount#0", @@ -17335,10 +17359,10 @@ "or_result%0#0" ] }, - "2297": { + "2318": { "op": "b claim_due_cashflows_bool_merge@16" }, - "2300": { + "2321": { "subroutine": "modules.transfer_agent.TransferAgent.transfer_set_schedule[routing]", "params": {}, "block": "transfer_set_schedule", @@ -17351,7 +17375,7 @@ "tmp%0#0" ] }, - "2303": { + "2324": { "op": "dup", "defined_out": [ "tmp%0#0", @@ -17362,7 +17386,7 @@ "tmp%0#0 (copy)" ] }, - "2304": { + "2325": { "op": "len", "defined_out": [ "len%0#0", @@ -17373,7 +17397,7 @@ "len%0#0" ] }, - "2305": { + "2326": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -17386,7 +17410,7 @@ "8" ] }, - "2306": { + "2327": { "op": "==", "defined_out": [ "eq%0#0", @@ -17397,14 +17421,14 @@ "eq%0#0" ] }, - "2307": { + "2328": { "error": "invalid number of bytes for arc4.uint64", "op": "assert // invalid number of bytes for arc4.uint64", "stack_out": [ "tmp%0#0" ] }, - "2308": { + "2329": { "op": "btoi", "defined_out": [ "open_date#0" @@ -17413,7 +17437,7 @@ "open_date#0" ] }, - "2309": { + "2330": { "op": "txna ApplicationArgs 2", "defined_out": [ "open_date#0", @@ -17424,7 +17448,7 @@ "tmp%2#0" ] }, - "2312": { + "2333": { "op": "dup", "defined_out": [ "open_date#0", @@ -17437,7 +17461,7 @@ "tmp%2#0 (copy)" ] }, - "2313": { + "2334": { "op": "len", "defined_out": [ "len%1#0", @@ -17450,7 +17474,7 @@ "len%1#0" ] }, - "2314": { + "2335": { "op": "intc_2 // 8", "stack_out": [ "open_date#0", @@ -17459,7 +17483,7 @@ "8" ] }, - "2315": { + "2336": { "op": "==", "defined_out": [ "eq%1#0", @@ -17472,7 +17496,7 @@ "eq%1#0" ] }, - "2316": { + "2337": { "error": "invalid number of bytes for arc4.uint64", "op": "assert // invalid number of bytes for arc4.uint64", "stack_out": [ @@ -17480,7 +17504,7 @@ "tmp%2#0" ] }, - "2317": { + "2338": { "op": "btoi", "defined_out": [ "closure_date#0", @@ -17491,11 +17515,11 @@ "closure_date#0" ] }, - "2318": { + "2339": { "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", "op": "callsub _assert_caller_is_arranger" }, - "2321": { + "2342": { "op": "dup2", "defined_out": [ "closure_date#0", @@ -17510,7 +17534,7 @@ "closure_date#0 (copy)" ] }, - "2322": { + "2343": { "op": "<", "defined_out": [ "closure_date#0", @@ -17523,7 +17547,7 @@ "tmp%0#1" ] }, - "2323": { + "2344": { "error": "Time events must be sorted in strictly ascending order", "op": "assert // Time events must be sorted in strictly ascending order", "stack_out": [ @@ -17531,8 +17555,8 @@ "closure_date#0" ] }, - "2324": { - "op": "bytec 28 // \"transfer_opening_date\"", + "2345": { + "op": "bytec 29 // \"transfer_opening_date\"", "defined_out": [ "\"transfer_opening_date\"", "closure_date#0", @@ -17544,7 +17568,7 @@ "\"transfer_opening_date\"" ] }, - "2326": { + "2347": { "op": "uncover 2", "stack_out": [ "closure_date#0", @@ -17552,14 +17576,14 @@ "open_date#0" ] }, - "2328": { + "2349": { "op": "app_global_put", "stack_out": [ "closure_date#0" ] }, - "2329": { - "op": "bytec 29 // \"transfer_closure_date\"", + "2350": { + "op": "bytec 30 // \"transfer_closure_date\"", "defined_out": [ "\"transfer_closure_date\"", "closure_date#0" @@ -17569,18 +17593,18 @@ "\"transfer_closure_date\"" ] }, - "2331": { + "2352": { "op": "swap", "stack_out": [ "\"transfer_closure_date\"", "closure_date#0" ] }, - "2332": { + "2353": { "op": "app_global_put", "stack_out": [] }, - "2333": { + "2354": { "op": "global LatestTimestamp", "defined_out": [ "tmp%1#1" @@ -17589,7 +17613,7 @@ "tmp%1#1" ] }, - "2335": { + "2356": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0" @@ -17598,7 +17622,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "2336": { + "2357": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -17609,14 +17633,14 @@ "0x151f7c75" ] }, - "2337": { + "2358": { "op": "swap", "stack_out": [ "0x151f7c75", "aggregate%val_as_bytes%0#0" ] }, - "2338": { + "2359": { "op": "concat", "defined_out": [ "tmp%6#0" @@ -17625,11 +17649,11 @@ "tmp%6#0" ] }, - "2339": { + "2360": { "op": "log", "stack_out": [] }, - "2340": { + "2361": { "op": "intc_1 // 1", "defined_out": [ "1" @@ -17638,11 +17662,11 @@ "1" ] }, - "2341": { + "2362": { "op": "return", "stack_out": [] }, - "2342": { + "2363": { "subroutine": "modules.transfer_agent.TransferAgent.primary_distribution[routing]", "params": {}, "block": "primary_distribution", @@ -17655,7 +17679,7 @@ "holding_address#0" ] }, - "2345": { + "2366": { "op": "dup", "defined_out": [ "holding_address#0", @@ -17666,7 +17690,7 @@ "holding_address#0 (copy)" ] }, - "2346": { + "2367": { "op": "len", "defined_out": [ "holding_address#0", @@ -17677,7 +17701,7 @@ "len%0#0" ] }, - "2347": { + "2368": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -17690,7 +17714,7 @@ "32" ] }, - "2348": { + "2369": { "op": "==", "defined_out": [ "eq%0#0", @@ -17701,14 +17725,14 @@ "eq%0#0" ] }, - "2349": { + "2370": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ "holding_address#0" ] }, - "2350": { + "2371": { "op": "txna ApplicationArgs 2", "defined_out": [ "holding_address#0", @@ -17719,7 +17743,7 @@ "tmp%2#0" ] }, - "2353": { + "2374": { "op": "dup", "defined_out": [ "holding_address#0", @@ -17732,7 +17756,7 @@ "tmp%2#0 (copy)" ] }, - "2354": { + "2375": { "op": "len", "defined_out": [ "holding_address#0", @@ -17745,7 +17769,7 @@ "len%1#0" ] }, - "2355": { + "2376": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -17760,7 +17784,7 @@ "8" ] }, - "2356": { + "2377": { "op": "==", "defined_out": [ "eq%1#0", @@ -17773,7 +17797,7 @@ "eq%1#0" ] }, - "2357": { + "2378": { "error": "invalid number of bytes for arc4.uint64", "op": "assert // invalid number of bytes for arc4.uint64", "stack_out": [ @@ -17781,7 +17805,7 @@ "tmp%2#0" ] }, - "2358": { + "2379": { "op": "btoi", "defined_out": [ "holding_address#0", @@ -17792,7 +17816,7 @@ "units#0" ] }, - "2359": { + "2380": { "op": "dup", "stack_out": [ "holding_address#0", @@ -17800,7 +17824,7 @@ "units#0" ] }, - "2360": { + "2381": { "op": "cover 2", "defined_out": [ "holding_address#0", @@ -17812,7 +17836,7 @@ "units#0" ] }, - "2362": { + "2383": { "op": "intc_0 // 0", "stack_out": [ "units#0", @@ -17821,7 +17845,7 @@ "0" ] }, - "2363": { + "2384": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"", @@ -17837,7 +17861,7 @@ "\"status\"" ] }, - "2364": { + "2385": { "op": "app_global_get_ex", "defined_out": [ "holding_address#0", @@ -17853,7 +17877,7 @@ "maybe_exists%0#0" ] }, - "2365": { + "2386": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ @@ -17863,7 +17887,7 @@ "maybe_value%0#0" ] }, - "2366": { + "2387": { "error": "D-ASA not configured", "op": "assert // D-ASA not configured", "stack_out": [ @@ -17872,7 +17896,7 @@ "units#0" ] }, - "2367": { + "2388": { "op": "bytec 22 // 0x523a50594423", "defined_out": [ "0x523a50594423", @@ -17886,7 +17910,7 @@ "0x523a50594423" ] }, - "2369": { + "2390": { "op": "txn Sender", "defined_out": [ "0x523a50594423", @@ -17902,7 +17926,7 @@ "tmp%0#3" ] }, - "2371": { + "2392": { "callsub": "modules.rbac.RbacModule._role_is_active", "op": "callsub _role_is_active", "defined_out": [ @@ -17917,7 +17941,7 @@ "tmp%1#2" ] }, - "2374": { + "2395": { "error": "Not authorized", "op": "assert // Not authorized", "stack_out": [ @@ -17926,15 +17950,15 @@ "units#0" ] }, - "2375": { + "2396": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", "op": "callsub _assert_is_not_asset_defaulted" }, - "2378": { + "2399": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_suspended", "op": "callsub _assert_is_not_asset_suspended" }, - "2381": { + "2402": { "op": "intc_0 // 0", "stack_out": [ "units#0", @@ -17943,7 +17967,7 @@ "0" ] }, - "2382": { + "2403": { "op": "bytec_1 // \"status\"", "stack_out": [ "units#0", @@ -17953,7 +17977,7 @@ "\"status\"" ] }, - "2383": { + "2404": { "op": "app_global_get_ex", "stack_out": [ "units#0", @@ -17963,7 +17987,7 @@ "maybe_exists%0#0" ] }, - "2384": { + "2405": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ @@ -17973,7 +17997,7 @@ "maybe_value%0#0" ] }, - "2385": { + "2406": { "op": "pushint 50", "defined_out": [ "50", @@ -17989,7 +18013,7 @@ "50" ] }, - "2387": { + "2408": { "op": "==", "defined_out": [ "holding_address#0", @@ -18003,7 +18027,7 @@ "tmp%0#4" ] }, - "2388": { + "2409": { "error": "Primary distribution is closed", "op": "assert // Primary distribution is closed", "stack_out": [ @@ -18012,7 +18036,7 @@ "units#0" ] }, - "2389": { + "2410": { "op": "bytec 8 // 0x4123", "defined_out": [ "0x4123", @@ -18026,7 +18050,7 @@ "0x4123" ] }, - "2391": { + "2412": { "op": "dig 2", "stack_out": [ "units#0", @@ -18036,7 +18060,7 @@ "holding_address#0 (copy)" ] }, - "2393": { + "2414": { "op": "concat", "defined_out": [ "box_prefixed_key%0#1", @@ -18050,7 +18074,7 @@ "box_prefixed_key%0#1" ] }, - "2394": { + "2415": { "op": "dup", "stack_out": [ "units#0", @@ -18060,7 +18084,7 @@ "box_prefixed_key%0#1" ] }, - "2395": { + "2416": { "op": "cover 3", "defined_out": [ "box_prefixed_key%0#1", @@ -18075,7 +18099,7 @@ "box_prefixed_key%0#1" ] }, - "2397": { + "2418": { "op": "box_len", "defined_out": [ "_%0#0", @@ -18093,7 +18117,7 @@ "maybe_exists%0#0" ] }, - "2398": { + "2419": { "op": "bury 1", "stack_out": [ "units#0", @@ -18103,7 +18127,7 @@ "maybe_exists%0#0" ] }, - "2400": { + "2421": { "error": "Invalid account holding address", "op": "assert // Invalid account holding address", "stack_out": [ @@ -18113,7 +18137,7 @@ "units#0" ] }, - "2401": { + "2422": { "op": "swap", "stack_out": [ "units#0", @@ -18122,7 +18146,7 @@ "holding_address#0" ] }, - "2402": { + "2423": { "callsub": "modules.accounting.AccountingModule._assert_is_not_account_suspended", "op": "callsub _assert_is_not_account_suspended", "stack_out": [ @@ -18131,7 +18155,7 @@ "units#0" ] }, - "2405": { + "2426": { "op": "dup", "defined_out": [ "box_prefixed_key%0#1", @@ -18145,7 +18169,7 @@ "units#0 (copy)" ] }, - "2406": { + "2427": { "error": "Can not distribute zero units", "op": "assert // Can not distribute zero units", "stack_out": [ @@ -18154,7 +18178,7 @@ "units#0" ] }, - "2407": { + "2428": { "op": "intc_0 // 0", "stack_out": [ "units#0", @@ -18163,7 +18187,7 @@ "0" ] }, - "2408": { + "2429": { "op": "bytec 11 // \"reserved_units_total\"", "defined_out": [ "\"reserved_units_total\"", @@ -18179,7 +18203,7 @@ "\"reserved_units_total\"" ] }, - "2410": { + "2431": { "op": "app_global_get_ex", "stack_out": [ "units#0", @@ -18189,7 +18213,7 @@ "maybe_exists%0#0" ] }, - "2411": { + "2432": { "error": "check self.reserved_units_total exists", "op": "assert // check self.reserved_units_total exists", "stack_out": [ @@ -18199,7 +18223,7 @@ "maybe_value%0#0" ] }, - "2412": { + "2433": { "op": "+", "defined_out": [ "box_prefixed_key%0#1", @@ -18212,7 +18236,7 @@ "tmp%2#1" ] }, - "2413": { + "2434": { "op": "intc_0 // 0", "stack_out": [ "units#0", @@ -18221,7 +18245,7 @@ "0" ] }, - "2414": { + "2435": { "op": "bytec 13 // \"total_units\"", "defined_out": [ "\"total_units\"", @@ -18238,7 +18262,7 @@ "\"total_units\"" ] }, - "2416": { + "2437": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#1", @@ -18255,7 +18279,7 @@ "maybe_exists%1#0" ] }, - "2417": { + "2438": { "error": "check self.total_units exists", "op": "assert // check self.total_units exists", "stack_out": [ @@ -18265,7 +18289,7 @@ "maybe_value%1#0" ] }, - "2418": { + "2439": { "op": "<=", "defined_out": [ "box_prefixed_key%0#1", @@ -18278,7 +18302,7 @@ "tmp%3#1" ] }, - "2419": { + "2440": { "error": "Insufficient remaining D-ASA units", "op": "assert // Insufficient remaining D-ASA units", "stack_out": [ @@ -18286,7 +18310,7 @@ "box_prefixed_key%0#1" ] }, - "2420": { + "2441": { "op": "intc_0 // 0", "stack_out": [ "units#0", @@ -18294,8 +18318,8 @@ "0" ] }, - "2421": { - "op": "bytec 27 // \"initial_exchange_date\"", + "2442": { + "op": "bytec 28 // \"initial_exchange_date\"", "defined_out": [ "\"initial_exchange_date\"", "0", @@ -18309,7 +18333,7 @@ "\"initial_exchange_date\"" ] }, - "2423": { + "2444": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#1", @@ -18324,7 +18348,7 @@ "maybe_exists%2#0" ] }, - "2424": { + "2445": { "error": "check self.initial_exchange_date exists", "op": "assert // check self.initial_exchange_date exists", "stack_out": [ @@ -18333,14 +18357,14 @@ "maybe_value%2#0" ] }, - "2425": { + "2446": { "op": "bz primary_distribution_after_if_else@3", "stack_out": [ "units#0", "box_prefixed_key%0#1" ] }, - "2428": { + "2449": { "op": "global LatestTimestamp", "defined_out": [ "box_prefixed_key%0#1", @@ -18353,7 +18377,7 @@ "tmp%5#1" ] }, - "2430": { + "2451": { "op": "intc_0 // 0", "stack_out": [ "units#0", @@ -18362,8 +18386,8 @@ "0" ] }, - "2431": { - "op": "bytec 27 // \"initial_exchange_date\"", + "2452": { + "op": "bytec 28 // \"initial_exchange_date\"", "stack_out": [ "units#0", "box_prefixed_key%0#1", @@ -18372,7 +18396,7 @@ "\"initial_exchange_date\"" ] }, - "2433": { + "2454": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#1", @@ -18389,7 +18413,7 @@ "maybe_exists%3#0" ] }, - "2434": { + "2455": { "error": "check self.initial_exchange_date exists", "op": "assert // check self.initial_exchange_date exists", "stack_out": [ @@ -18399,7 +18423,7 @@ "maybe_value%3#0" ] }, - "2435": { + "2456": { "op": "<=", "defined_out": [ "box_prefixed_key%0#1", @@ -18412,7 +18436,7 @@ "tmp%6#1" ] }, - "2436": { + "2457": { "error": "Primary distribution is closed", "op": "assert // Primary distribution is closed", "stack_out": [ @@ -18420,7 +18444,7 @@ "box_prefixed_key%0#1" ] }, - "2437": { + "2458": { "block": "primary_distribution_after_if_else@3", "stack_in": [ "units#0", @@ -18438,7 +18462,7 @@ "box_prefixed_key%0#1 (copy)" ] }, - "2439": { + "2460": { "op": "box_get", "defined_out": [ "aggregate%box_get%0#0", @@ -18453,7 +18477,7 @@ "aggregate%box_get%1#0" ] }, - "2440": { + "2461": { "error": "check self.account entry exists", "op": "assert // check self.account entry exists", "stack_out": [ @@ -18463,7 +18487,7 @@ "aggregate%box_get%0#0" ] }, - "2441": { + "2462": { "op": "pushint 40", "defined_out": [ "40", @@ -18478,7 +18502,7 @@ "40" ] }, - "2443": { + "2464": { "op": "extract_uint64", "defined_out": [ "box_prefixed_key%0#1", @@ -18491,7 +18515,7 @@ "values%0#0" ] }, - "2444": { + "2465": { "op": "dig 3", "defined_out": [ "box_prefixed_key%0#1", @@ -18506,7 +18530,7 @@ "units#0" ] }, - "2446": { + "2467": { "op": "dup", "defined_out": [ "box_prefixed_key%0#1", @@ -18523,7 +18547,7 @@ "units#0 (copy)" ] }, - "2447": { + "2468": { "op": "cover 3", "stack_out": [ "units#0", @@ -18534,7 +18558,7 @@ "units#0 (copy)" ] }, - "2449": { + "2470": { "op": "+", "defined_out": [ "box_prefixed_key%0#1", @@ -18549,7 +18573,7 @@ "tmp%0#2" ] }, - "2450": { + "2471": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0", @@ -18564,10 +18588,10 @@ "aggregate%val_as_bytes%0#0" ] }, - "2451": { + "2472": { "op": "pushint 40" }, - "2453": { + "2474": { "op": "swap", "stack_out": [ "units#0", @@ -18578,7 +18602,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "2454": { + "2475": { "op": "box_replace", "stack_out": [ "units#0", @@ -18586,7 +18610,7 @@ "units#0" ] }, - "2455": { + "2476": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -18600,7 +18624,7 @@ "0" ] }, - "2456": { + "2477": { "op": "bytec 11 // \"reserved_units_total\"", "defined_out": [ "\"reserved_units_total\"", @@ -18616,7 +18640,7 @@ "\"reserved_units_total\"" ] }, - "2458": { + "2479": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#1", @@ -18632,7 +18656,7 @@ "maybe_exists%4#0" ] }, - "2459": { + "2480": { "error": "check self.reserved_units_total exists", "op": "assert // check self.reserved_units_total exists", "stack_out": [ @@ -18642,7 +18666,7 @@ "maybe_value%4#0" ] }, - "2460": { + "2481": { "op": "+", "defined_out": [ "box_prefixed_key%0#1", @@ -18655,7 +18679,7 @@ "tmp%7#0" ] }, - "2461": { + "2482": { "op": "bytec 11 // \"reserved_units_total\"", "stack_out": [ "units#0", @@ -18664,7 +18688,7 @@ "\"reserved_units_total\"" ] }, - "2463": { + "2484": { "op": "dig 1", "defined_out": [ "\"reserved_units_total\"", @@ -18681,7 +18705,7 @@ "tmp%7#0 (copy)" ] }, - "2465": { + "2486": { "op": "app_global_put", "stack_out": [ "units#0", @@ -18689,7 +18713,7 @@ "tmp%7#0" ] }, - "2466": { + "2487": { "op": "intc_0 // 0", "stack_out": [ "units#0", @@ -18698,7 +18722,7 @@ "0" ] }, - "2467": { + "2488": { "op": "bytec 13 // \"total_units\"", "defined_out": [ "\"total_units\"", @@ -18715,7 +18739,7 @@ "\"total_units\"" ] }, - "2469": { + "2490": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#1", @@ -18732,7 +18756,7 @@ "maybe_exists%5#0" ] }, - "2470": { + "2491": { "error": "check self.total_units exists", "op": "assert // check self.total_units exists", "stack_out": [ @@ -18742,7 +18766,7 @@ "maybe_value%5#0" ] }, - "2471": { + "2492": { "op": "swap", "stack_out": [ "units#0", @@ -18751,7 +18775,7 @@ "tmp%7#0" ] }, - "2472": { + "2493": { "op": "-", "defined_out": [ "box_prefixed_key%0#1", @@ -18764,7 +18788,7 @@ "tmp%8#0" ] }, - "2473": { + "2494": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%1#0", @@ -18777,7 +18801,7 @@ "aggregate%val_as_bytes%1#0" ] }, - "2474": { + "2495": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -18792,7 +18816,7 @@ "0x151f7c75" ] }, - "2475": { + "2496": { "op": "swap", "stack_out": [ "units#0", @@ -18801,7 +18825,7 @@ "aggregate%val_as_bytes%1#0" ] }, - "2476": { + "2497": { "op": "concat", "defined_out": [ "box_prefixed_key%0#1", @@ -18814,14 +18838,14 @@ "tmp%6#0" ] }, - "2477": { + "2498": { "op": "log", "stack_out": [ "units#0", "box_prefixed_key%0#1" ] }, - "2478": { + "2499": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -18834,14 +18858,14 @@ "1" ] }, - "2479": { + "2500": { "op": "return", "stack_out": [ "units#0", "box_prefixed_key%0#1" ] }, - "2480": { + "2501": { "subroutine": "modules.transfer_agent.TransferAgent.transfer[routing]", "params": {}, "block": "transfer", @@ -18851,17 +18875,17 @@ "box_prefixed_key%0#3" ] }, - "2481": { + "2502": { "op": "dup", "stack_out": [ "box_prefixed_key%0#3", "box_prefixed_key%0#4" ] }, - "2482": { + "2503": { "op": "txna ApplicationArgs 1" }, - "2485": { + "2506": { "op": "dup", "defined_out": [ "sender_holding_address#0" @@ -18873,7 +18897,7 @@ "sender_holding_address#0" ] }, - "2486": { + "2507": { "op": "len", "defined_out": [ "len%0#0", @@ -18886,7 +18910,7 @@ "len%0#0" ] }, - "2487": { + "2508": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -18901,7 +18925,7 @@ "32" ] }, - "2488": { + "2509": { "op": "==", "defined_out": [ "eq%0#0", @@ -18914,7 +18938,7 @@ "eq%0#0" ] }, - "2489": { + "2510": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ @@ -18923,10 +18947,10 @@ "sender_holding_address#0" ] }, - "2490": { + "2511": { "op": "txna ApplicationArgs 2" }, - "2493": { + "2514": { "op": "dup", "defined_out": [ "receiver_holding_address#0", @@ -18940,7 +18964,7 @@ "receiver_holding_address#0" ] }, - "2494": { + "2515": { "op": "len", "defined_out": [ "len%1#0", @@ -18955,7 +18979,7 @@ "len%1#0" ] }, - "2495": { + "2516": { "op": "intc_3 // 32", "stack_out": [ "box_prefixed_key%0#3", @@ -18966,7 +18990,7 @@ "32" ] }, - "2496": { + "2517": { "op": "==", "defined_out": [ "eq%1#0", @@ -18981,7 +19005,7 @@ "eq%1#0" ] }, - "2497": { + "2518": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ @@ -18991,10 +19015,10 @@ "receiver_holding_address#0" ] }, - "2498": { + "2519": { "op": "txna ApplicationArgs 3" }, - "2501": { + "2522": { "op": "dupn 2", "defined_out": [ "receiver_holding_address#0", @@ -19012,7 +19036,7 @@ "tmp%4#0 (copy)" ] }, - "2503": { + "2524": { "op": "len", "defined_out": [ "len%2#0", @@ -19030,7 +19054,7 @@ "len%2#0" ] }, - "2504": { + "2525": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -19050,7 +19074,7 @@ "8" ] }, - "2505": { + "2526": { "op": "==", "defined_out": [ "eq%2#0", @@ -19068,7 +19092,7 @@ "eq%2#0" ] }, - "2506": { + "2527": { "error": "invalid number of bytes for arc4.uint64", "op": "assert // invalid number of bytes for arc4.uint64", "stack_out": [ @@ -19080,7 +19104,7 @@ "tmp%4#0" ] }, - "2507": { + "2528": { "op": "btoi", "defined_out": [ "receiver_holding_address#0", @@ -19097,7 +19121,7 @@ "units#0" ] }, - "2508": { + "2529": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#3", @@ -19109,7 +19133,7 @@ "0" ] }, - "2509": { + "2530": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"", @@ -19130,7 +19154,7 @@ "\"status\"" ] }, - "2510": { + "2531": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -19151,7 +19175,7 @@ "maybe_exists%0#0" ] }, - "2511": { + "2532": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ @@ -19164,7 +19188,7 @@ "maybe_value%0#0" ] }, - "2512": { + "2533": { "error": "D-ASA not configured", "op": "assert // D-ASA not configured", "stack_out": [ @@ -19176,15 +19200,15 @@ "units#0" ] }, - "2513": { + "2534": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", "op": "callsub _assert_is_not_asset_defaulted" }, - "2516": { + "2537": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_suspended", "op": "callsub _assert_is_not_asset_suspended" }, - "2519": { + "2540": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#3", @@ -19196,7 +19220,7 @@ "0" ] }, - "2520": { + "2541": { "op": "bytec_1 // \"status\"", "stack_out": [ "box_prefixed_key%0#3", @@ -19209,7 +19233,7 @@ "\"status\"" ] }, - "2521": { + "2542": { "op": "app_global_get_ex", "stack_out": [ "box_prefixed_key%0#3", @@ -19222,7 +19246,7 @@ "maybe_exists%0#0" ] }, - "2522": { + "2543": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ @@ -19235,7 +19259,7 @@ "maybe_value%0#0" ] }, - "2523": { + "2544": { "op": "pushint 50", "defined_out": [ "50", @@ -19256,7 +19280,7 @@ "50" ] }, - "2525": { + "2546": { "op": "==", "defined_out": [ "receiver_holding_address#0", @@ -19275,7 +19299,7 @@ "tmp%0#3" ] }, - "2526": { + "2547": { "op": "!", "defined_out": [ "receiver_holding_address#0", @@ -19294,7 +19318,7 @@ "tmp%1#1" ] }, - "2527": { + "2548": { "error": "IED not yet executed", "op": "assert // IED not yet executed", "stack_out": [ @@ -19306,7 +19330,7 @@ "units#0" ] }, - "2528": { + "2549": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#3", @@ -19318,8 +19342,8 @@ "0" ] }, - "2529": { - "op": "bytec 28 // \"transfer_opening_date\"", + "2550": { + "op": "bytec 29 // \"transfer_opening_date\"", "defined_out": [ "\"transfer_opening_date\"", "0", @@ -19339,7 +19363,7 @@ "\"transfer_opening_date\"" ] }, - "2531": { + "2552": { "op": "app_global_get_ex", "stack_out": [ "box_prefixed_key%0#3", @@ -19352,7 +19376,7 @@ "maybe_exists%0#0" ] }, - "2532": { + "2553": { "error": "check self.transfer_opening_date exists", "op": "assert // check self.transfer_opening_date exists", "stack_out": [ @@ -19365,7 +19389,7 @@ "maybe_value%0#0" ] }, - "2533": { + "2554": { "op": "bz transfer_after_if_else@3", "stack_out": [ "box_prefixed_key%0#3", @@ -19376,7 +19400,7 @@ "units#0" ] }, - "2536": { + "2557": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#3", @@ -19388,8 +19412,8 @@ "0" ] }, - "2537": { - "op": "bytec 28 // \"transfer_opening_date\"", + "2558": { + "op": "bytec 29 // \"transfer_opening_date\"", "stack_out": [ "box_prefixed_key%0#3", "box_prefixed_key%0#4", @@ -19401,7 +19425,7 @@ "\"transfer_opening_date\"" ] }, - "2539": { + "2560": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%1#0", @@ -19422,7 +19446,7 @@ "maybe_exists%1#0" ] }, - "2540": { + "2561": { "error": "check self.transfer_opening_date exists", "op": "assert // check self.transfer_opening_date exists", "stack_out": [ @@ -19435,7 +19459,7 @@ "maybe_value%1#0" ] }, - "2541": { + "2562": { "op": "global LatestTimestamp", "defined_out": [ "maybe_value%1#0", @@ -19456,7 +19480,7 @@ "tmp%1#2" ] }, - "2543": { + "2564": { "op": "<=", "defined_out": [ "receiver_holding_address#0", @@ -19475,7 +19499,7 @@ "tmp%2#1" ] }, - "2544": { + "2565": { "error": "Transfer is closed", "op": "assert // Transfer is closed", "stack_out": [ @@ -19487,7 +19511,7 @@ "units#0" ] }, - "2545": { + "2566": { "block": "transfer_after_if_else@3", "stack_in": [ "box_prefixed_key%0#3", @@ -19511,8 +19535,8 @@ "0" ] }, - "2546": { - "op": "bytec 29 // \"transfer_closure_date\"", + "2567": { + "op": "bytec 30 // \"transfer_closure_date\"", "defined_out": [ "\"transfer_closure_date\"", "0" @@ -19528,7 +19552,7 @@ "\"transfer_closure_date\"" ] }, - "2548": { + "2569": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%2#0", @@ -19545,7 +19569,7 @@ "maybe_exists%2#0" ] }, - "2549": { + "2570": { "error": "check self.transfer_closure_date exists", "op": "assert // check self.transfer_closure_date exists", "stack_out": [ @@ -19558,7 +19582,7 @@ "maybe_value%2#0" ] }, - "2550": { + "2571": { "op": "bz transfer_after_if_else@5", "stack_out": [ "box_prefixed_key%0#3", @@ -19569,7 +19593,7 @@ "units#0" ] }, - "2553": { + "2574": { "op": "global LatestTimestamp", "defined_out": [ "tmp%4#2" @@ -19584,7 +19608,7 @@ "tmp%4#2" ] }, - "2555": { + "2576": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#3", @@ -19597,8 +19621,8 @@ "0" ] }, - "2556": { - "op": "bytec 29 // \"transfer_closure_date\"", + "2577": { + "op": "bytec 30 // \"transfer_closure_date\"", "stack_out": [ "box_prefixed_key%0#3", "box_prefixed_key%0#4", @@ -19611,7 +19635,7 @@ "\"transfer_closure_date\"" ] }, - "2558": { + "2579": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%3#0", @@ -19630,7 +19654,7 @@ "maybe_exists%3#0" ] }, - "2559": { + "2580": { "error": "check self.transfer_closure_date exists", "op": "assert // check self.transfer_closure_date exists", "stack_out": [ @@ -19644,7 +19668,7 @@ "maybe_value%3#0" ] }, - "2560": { + "2581": { "op": "<", "defined_out": [ "tmp%5#0" @@ -19659,7 +19683,7 @@ "tmp%5#0" ] }, - "2561": { + "2582": { "error": "Transfer is closed", "op": "assert // Transfer is closed", "stack_out": [ @@ -19671,7 +19695,7 @@ "units#0" ] }, - "2562": { + "2583": { "block": "transfer_after_if_else@5", "stack_in": [ "box_prefixed_key%0#3", @@ -19695,7 +19719,7 @@ "tmp%0#1" ] }, - "2564": { + "2585": { "op": "dig 4", "defined_out": [ "sender_holding_address#0", @@ -19712,7 +19736,7 @@ "sender_holding_address#0" ] }, - "2566": { + "2587": { "op": "dup", "defined_out": [ "sender_holding_address#0", @@ -19731,7 +19755,7 @@ "sender_holding_address#0 (copy)" ] }, - "2567": { + "2588": { "op": "cover 2", "stack_out": [ "box_prefixed_key%0#3", @@ -19745,7 +19769,7 @@ "sender_holding_address#0 (copy)" ] }, - "2569": { + "2590": { "op": "==", "defined_out": [ "sender_holding_address#0", @@ -19762,7 +19786,7 @@ "tmp%1#1" ] }, - "2570": { + "2591": { "error": "Not authorized", "op": "assert // Not authorized", "stack_out": [ @@ -19775,7 +19799,7 @@ "sender_holding_address#0" ] }, - "2571": { + "2592": { "op": "bytec 8 // 0x4123", "defined_out": [ "0x4123", @@ -19792,7 +19816,7 @@ "0x4123" ] }, - "2573": { + "2594": { "op": "dig 1", "stack_out": [ "box_prefixed_key%0#3", @@ -19806,7 +19830,7 @@ "sender_holding_address#0 (copy)" ] }, - "2575": { + "2596": { "op": "concat", "defined_out": [ "box_prefixed_key%0#3", @@ -19823,7 +19847,7 @@ "box_prefixed_key%0#3" ] }, - "2576": { + "2597": { "op": "dup", "stack_out": [ "box_prefixed_key%0#3", @@ -19837,7 +19861,7 @@ "box_prefixed_key%0#3" ] }, - "2577": { + "2598": { "op": "bury 8", "defined_out": [ "box_prefixed_key%0#3", @@ -19854,7 +19878,7 @@ "box_prefixed_key%0#3" ] }, - "2579": { + "2600": { "op": "dup", "defined_out": [ "box_prefixed_key%0#3", @@ -19873,7 +19897,7 @@ "box_prefixed_key%0#3 (copy)" ] }, - "2580": { + "2601": { "op": "box_len", "defined_out": [ "_%0#0", @@ -19894,7 +19918,7 @@ "maybe_exists%0#0" ] }, - "2581": { + "2602": { "op": "bury 1", "stack_out": [ "box_prefixed_key%0#3", @@ -19908,7 +19932,7 @@ "maybe_exists%0#0" ] }, - "2583": { + "2604": { "error": "Invalid account holding address", "op": "assert // Invalid account holding address", "stack_out": [ @@ -19922,7 +19946,7 @@ "box_prefixed_key%0#3" ] }, - "2584": { + "2605": { "op": "bytec 8 // 0x4123", "stack_out": [ "box_prefixed_key%0#3", @@ -19936,7 +19960,7 @@ "0x4123" ] }, - "2586": { + "2607": { "op": "dig 5", "defined_out": [ "0x4123", @@ -19957,7 +19981,7 @@ "receiver_holding_address#0" ] }, - "2588": { + "2609": { "op": "dup", "defined_out": [ "0x4123", @@ -19980,7 +20004,7 @@ "receiver_holding_address#0 (copy)" ] }, - "2589": { + "2610": { "op": "cover 2", "stack_out": [ "box_prefixed_key%0#3", @@ -19996,7 +20020,7 @@ "receiver_holding_address#0 (copy)" ] }, - "2591": { + "2612": { "op": "concat", "defined_out": [ "box_prefixed_key%0#3", @@ -20017,7 +20041,7 @@ "box_prefixed_key%0#4" ] }, - "2592": { + "2613": { "op": "dup", "stack_out": [ "box_prefixed_key%0#3", @@ -20033,7 +20057,7 @@ "box_prefixed_key%0#4" ] }, - "2593": { + "2614": { "op": "bury 9", "defined_out": [ "box_prefixed_key%0#3", @@ -20054,7 +20078,7 @@ "box_prefixed_key%0#4" ] }, - "2595": { + "2616": { "op": "box_len", "stack_out": [ "box_prefixed_key%0#3", @@ -20070,7 +20094,7 @@ "maybe_exists%0#0" ] }, - "2596": { + "2617": { "op": "bury 1", "stack_out": [ "box_prefixed_key%0#3", @@ -20085,7 +20109,7 @@ "maybe_exists%0#0" ] }, - "2598": { + "2619": { "error": "Invalid account holding address", "op": "assert // Invalid account holding address", "stack_out": [ @@ -20100,7 +20124,7 @@ "receiver_holding_address#0" ] }, - "2599": { + "2620": { "op": "dig 2", "stack_out": [ "box_prefixed_key%0#3", @@ -20115,7 +20139,7 @@ "sender_holding_address#0 (copy)" ] }, - "2601": { + "2622": { "callsub": "modules.accounting.AccountingModule._assert_is_not_account_suspended", "op": "callsub _assert_is_not_account_suspended", "stack_out": [ @@ -20130,7 +20154,7 @@ "receiver_holding_address#0" ] }, - "2604": { + "2625": { "op": "dup", "stack_out": [ "box_prefixed_key%0#3", @@ -20145,7 +20169,7 @@ "receiver_holding_address#0 (copy)" ] }, - "2605": { + "2626": { "callsub": "modules.accounting.AccountingModule._assert_is_not_account_suspended", "op": "callsub _assert_is_not_account_suspended", "stack_out": [ @@ -20160,7 +20184,7 @@ "receiver_holding_address#0" ] }, - "2608": { + "2629": { "op": "uncover 2", "stack_out": [ "box_prefixed_key%0#3", @@ -20174,7 +20198,7 @@ "sender_holding_address#0" ] }, - "2610": { + "2631": { "op": "!=", "defined_out": [ "box_prefixed_key%0#3", @@ -20194,7 +20218,7 @@ "tmp%2#1" ] }, - "2611": { + "2632": { "error": "Sender and receiver must be different", "op": "assert // Sender and receiver must be different", "stack_out": [ @@ -20207,7 +20231,7 @@ "box_prefixed_key%0#3" ] }, - "2612": { + "2633": { "op": "dig 1", "defined_out": [ "box_prefixed_key%0#3", @@ -20227,7 +20251,7 @@ "units#0" ] }, - "2614": { + "2635": { "op": "dup", "defined_out": [ "box_prefixed_key%0#3", @@ -20249,7 +20273,7 @@ "units#0 (copy)" ] }, - "2615": { + "2636": { "error": "Transfer units must be greater than zero", "op": "assert // Transfer units must be greater than zero", "stack_out": [ @@ -20263,7 +20287,7 @@ "units#0" ] }, - "2616": { + "2637": { "op": "swap", "stack_out": [ "box_prefixed_key%0#3", @@ -20276,7 +20300,7 @@ "box_prefixed_key%0#3" ] }, - "2617": { + "2638": { "op": "box_get", "defined_out": [ "aggregate%box_get%0#0", @@ -20299,7 +20323,7 @@ "aggregate%box_get%1#0" ] }, - "2618": { + "2639": { "error": "check self.account entry exists", "op": "assert // check self.account entry exists", "stack_out": [ @@ -20313,7 +20337,7 @@ "aggregate%box_get%0#0" ] }, - "2619": { + "2640": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -20336,7 +20360,7 @@ "32" ] }, - "2620": { + "2641": { "op": "extract_uint64", "defined_out": [ "box_prefixed_key%0#3", @@ -20357,7 +20381,7 @@ "values%0#0" ] }, - "2621": { + "2642": { "op": "<=", "defined_out": [ "box_prefixed_key%0#3", @@ -20377,7 +20401,7 @@ "tmp%4#1" ] }, - "2622": { + "2643": { "error": "Insufficient sender units to transfer", "op": "assert // Insufficient sender units to transfer", "stack_out": [ @@ -20389,7 +20413,7 @@ "units#0" ] }, - "2623": { + "2644": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#3", @@ -20401,7 +20425,7 @@ "0" ] }, - "2624": { + "2645": { "op": "bytec_2 // \"event_cursor\"", "defined_out": [ "\"event_cursor\"", @@ -20423,7 +20447,7 @@ "\"event_cursor\"" ] }, - "2625": { + "2646": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#3", @@ -20445,7 +20469,7 @@ "maybe_exists%0#0" ] }, - "2626": { + "2647": { "error": "check self.event_cursor exists", "op": "assert // check self.event_cursor exists", "stack_out": [ @@ -20458,7 +20482,7 @@ "maybe_value%0#0" ] }, - "2627": { + "2648": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#3", @@ -20471,7 +20495,7 @@ "0" ] }, - "2628": { + "2649": { "op": "bytec_3 // \"schedule_entry_count\"", "defined_out": [ "\"schedule_entry_count\"", @@ -20495,7 +20519,7 @@ "\"schedule_entry_count\"" ] }, - "2629": { + "2650": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#3", @@ -20519,7 +20543,7 @@ "maybe_exists%1#0" ] }, - "2630": { + "2651": { "error": "check self.schedule_entry_count exists", "op": "assert // check self.schedule_entry_count exists", "stack_out": [ @@ -20533,7 +20557,7 @@ "maybe_value%1#0" ] }, - "2631": { + "2652": { "op": ">=", "defined_out": [ "box_prefixed_key%0#3", @@ -20553,7 +20577,7 @@ "tmp%0#3" ] }, - "2632": { + "2653": { "op": "bnz transfer_after_inlined_modules.actus_kernel.ActusKernelModule._assert_no_due_event_pending@10", "stack_out": [ "box_prefixed_key%0#3", @@ -20564,7 +20588,7 @@ "units#0" ] }, - "2635": { + "2656": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#3", @@ -20576,7 +20600,7 @@ "0" ] }, - "2636": { + "2657": { "op": "bytec_2 // \"event_cursor\"", "stack_out": [ "box_prefixed_key%0#3", @@ -20589,7 +20613,7 @@ "\"event_cursor\"" ] }, - "2637": { + "2658": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#3", @@ -20611,7 +20635,7 @@ "maybe_exists%2#0" ] }, - "2638": { + "2659": { "error": "check self.event_cursor exists", "op": "assert // check self.event_cursor exists", "stack_out": [ @@ -20624,7 +20648,7 @@ "maybe_value%2#0" ] }, - "2639": { + "2660": { "callsub": "modules.actus_kernel.ActusKernelModule._get_schedule_entry", "op": "callsub _get_schedule_entry", "defined_out": [ @@ -20645,7 +20669,7 @@ "next_entry#0" ] }, - "2642": { + "2663": { "op": "pushint 9", "defined_out": [ "9", @@ -20667,7 +20691,7 @@ "9" ] }, - "2644": { + "2665": { "op": "extract_uint64", "stack_out": [ "box_prefixed_key%0#3", @@ -20679,7 +20703,7 @@ "values%0#0" ] }, - "2645": { + "2666": { "op": "global LatestTimestamp", "defined_out": [ "box_prefixed_key%0#3", @@ -20701,7 +20725,7 @@ "tmp%2#3" ] }, - "2647": { + "2668": { "op": ">", "defined_out": [ "box_prefixed_key%0#3", @@ -20721,7 +20745,7 @@ "tmp%3#3" ] }, - "2648": { + "2669": { "error": "ACTUS event not yet executed", "op": "assert // ACTUS event not yet executed", "stack_out": [ @@ -20733,7 +20757,7 @@ "units#0" ] }, - "2649": { + "2670": { "block": "transfer_after_inlined_modules.actus_kernel.ActusKernelModule._assert_no_due_event_pending@10", "stack_in": [ "box_prefixed_key%0#3", @@ -20757,7 +20781,7 @@ "sender_holding_address#0" ] }, - "2651": { + "2672": { "op": "dup", "defined_out": [ "sender_holding_address#0", @@ -20774,7 +20798,7 @@ "sender_holding_address#0 (copy)" ] }, - "2652": { + "2673": { "callsub": "modules.accounting.AccountingModule._ensure_units_activated", "op": "callsub _ensure_units_activated", "stack_out": [ @@ -20787,7 +20811,7 @@ "sender_holding_address#0" ] }, - "2655": { + "2676": { "op": "dig 3", "defined_out": [ "receiver_holding_address#0", @@ -20804,7 +20828,7 @@ "receiver_holding_address#0" ] }, - "2657": { + "2678": { "op": "dup", "defined_out": [ "receiver_holding_address#0", @@ -20823,7 +20847,7 @@ "receiver_holding_address#0 (copy)" ] }, - "2658": { + "2679": { "op": "cover 2", "stack_out": [ "box_prefixed_key%0#3", @@ -20837,7 +20861,7 @@ "receiver_holding_address#0 (copy)" ] }, - "2660": { + "2681": { "callsub": "modules.accounting.AccountingModule._ensure_units_activated", "op": "callsub _ensure_units_activated", "stack_out": [ @@ -20851,7 +20875,7 @@ "sender_holding_address#0" ] }, - "2663": { + "2684": { "callsub": "modules.accounting.AccountingModule._settle_position", "op": "callsub _settle_position", "defined_out": [ @@ -20872,7 +20896,7 @@ "{_settle_position}.1" ] }, - "2666": { + "2687": { "op": "popn 2", "stack_out": [ "box_prefixed_key%0#3", @@ -20884,7 +20908,7 @@ "receiver_holding_address#0" ] }, - "2668": { + "2689": { "callsub": "modules.accounting.AccountingModule._settle_position", "op": "callsub _settle_position", "stack_out": [ @@ -20898,7 +20922,7 @@ "{_settle_position}.1" ] }, - "2671": { + "2692": { "op": "popn 2", "stack_out": [ "box_prefixed_key%0#3", @@ -20909,7 +20933,7 @@ "units#0" ] }, - "2673": { + "2694": { "op": "dig 5", "defined_out": [ "box_prefixed_key%0#3", @@ -20926,7 +20950,7 @@ "box_prefixed_key%0#3" ] }, - "2675": { + "2696": { "op": "dup", "defined_out": [ "box_prefixed_key%0#3", @@ -20945,7 +20969,7 @@ "box_prefixed_key%0#3 (copy)" ] }, - "2676": { + "2697": { "op": "box_get", "defined_out": [ "aggregate%box_get%2#0", @@ -20966,7 +20990,7 @@ "aggregate%box_get%3#0" ] }, - "2677": { + "2698": { "error": "check self.account entry exists", "op": "assert // check self.account entry exists", "stack_out": [ @@ -20980,7 +21004,7 @@ "aggregate%box_get%2#0" ] }, - "2678": { + "2699": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -21001,7 +21025,7 @@ "32" ] }, - "2679": { + "2700": { "op": "extract_uint64", "defined_out": [ "box_prefixed_key%0#3", @@ -21020,7 +21044,7 @@ "values%0#0" ] }, - "2680": { + "2701": { "op": "dig 2", "defined_out": [ "box_prefixed_key%0#3", @@ -21041,7 +21065,7 @@ "units#0" ] }, - "2682": { + "2703": { "op": "dup", "defined_out": [ "box_prefixed_key%0#3", @@ -21064,7 +21088,7 @@ "units#0 (copy)" ] }, - "2683": { + "2704": { "op": "cover 2", "stack_out": [ "box_prefixed_key%0#3", @@ -21079,7 +21103,7 @@ "units#0 (copy)" ] }, - "2685": { + "2706": { "op": "dig 1", "defined_out": [ "box_prefixed_key%0#3", @@ -21104,7 +21128,7 @@ "values%0#0 (copy)" ] }, - "2687": { + "2708": { "op": "<=", "defined_out": [ "box_prefixed_key%0#3", @@ -21127,7 +21151,7 @@ "tmp%0#3" ] }, - "2688": { + "2709": { "error": "Insufficient sender units to transfer", "op": "assert // Insufficient sender units to transfer", "stack_out": [ @@ -21142,7 +21166,7 @@ "values%0#0" ] }, - "2689": { + "2710": { "op": "dig 1", "stack_out": [ "box_prefixed_key%0#3", @@ -21157,7 +21181,7 @@ "units#0 (copy)" ] }, - "2691": { + "2712": { "op": "-", "defined_out": [ "box_prefixed_key%0#3", @@ -21178,7 +21202,7 @@ "tmp%1#2" ] }, - "2692": { + "2713": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0", @@ -21199,7 +21223,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "2693": { + "2714": { "op": "uncover 2", "stack_out": [ "box_prefixed_key%0#3", @@ -21213,7 +21237,7 @@ "box_prefixed_key%0#3" ] }, - "2695": { + "2716": { "op": "intc_3 // 32", "stack_out": [ "box_prefixed_key%0#3", @@ -21228,7 +21252,7 @@ "32" ] }, - "2696": { + "2717": { "op": "uncover 2", "stack_out": [ "box_prefixed_key%0#3", @@ -21243,7 +21267,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "2698": { + "2719": { "op": "box_replace", "stack_out": [ "box_prefixed_key%0#3", @@ -21255,7 +21279,7 @@ "units#0" ] }, - "2699": { + "2720": { "op": "dig 5", "defined_out": [ "box_prefixed_key%0#3", @@ -21275,7 +21299,7 @@ "box_prefixed_key%0#4" ] }, - "2701": { + "2722": { "op": "dup", "defined_out": [ "box_prefixed_key%0#3", @@ -21297,7 +21321,7 @@ "box_prefixed_key%0#4 (copy)" ] }, - "2702": { + "2723": { "op": "box_get", "defined_out": [ "aggregate%box_get%6#0", @@ -21321,7 +21345,7 @@ "aggregate%box_get%7#0" ] }, - "2703": { + "2724": { "error": "check self.account entry exists", "op": "assert // check self.account entry exists", "stack_out": [ @@ -21336,7 +21360,7 @@ "aggregate%box_get%6#0" ] }, - "2704": { + "2725": { "op": "intc_3 // 32", "stack_out": [ "box_prefixed_key%0#3", @@ -21351,7 +21375,7 @@ "32" ] }, - "2705": { + "2726": { "op": "extract_uint64", "stack_out": [ "box_prefixed_key%0#3", @@ -21365,7 +21389,7 @@ "values%0#0" ] }, - "2706": { + "2727": { "op": "uncover 2", "stack_out": [ "box_prefixed_key%0#3", @@ -21379,7 +21403,7 @@ "units#0" ] }, - "2708": { + "2729": { "op": "+", "defined_out": [ "box_prefixed_key%0#3", @@ -21400,7 +21424,7 @@ "tmp%0#5" ] }, - "2709": { + "2730": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%1#0", @@ -21421,10 +21445,10 @@ "aggregate%val_as_bytes%1#0" ] }, - "2710": { + "2731": { "op": "intc_3 // 32" }, - "2711": { + "2732": { "op": "swap", "stack_out": [ "box_prefixed_key%0#3", @@ -21438,7 +21462,7 @@ "aggregate%val_as_bytes%1#0" ] }, - "2712": { + "2733": { "op": "box_replace", "stack_out": [ "box_prefixed_key%0#3", @@ -21449,7 +21473,7 @@ "units#0" ] }, - "2713": { + "2734": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -21469,7 +21493,7 @@ "0x151f7c75" ] }, - "2714": { + "2735": { "op": "dig 2", "defined_out": [ "0x151f7c75", @@ -21491,7 +21515,7 @@ "tmp%4#0" ] }, - "2716": { + "2737": { "op": "concat", "defined_out": [ "box_prefixed_key%0#3", @@ -21512,7 +21536,7 @@ "tmp%8#0" ] }, - "2717": { + "2738": { "op": "log", "stack_out": [ "box_prefixed_key%0#3", @@ -21523,7 +21547,7 @@ "units#0" ] }, - "2718": { + "2739": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -21544,7 +21568,7 @@ "1" ] }, - "2719": { + "2740": { "op": "return", "stack_out": [ "box_prefixed_key%0#3", @@ -21555,7 +21579,7 @@ "units#0" ] }, - "2720": { + "2741": { "subroutine": "modules.accounting.AccountingModule.account_suspension[routing]", "params": {}, "block": "account_suspension", @@ -21568,7 +21592,7 @@ "holding_address#0" ] }, - "2723": { + "2744": { "op": "dup", "defined_out": [ "holding_address#0", @@ -21579,7 +21603,7 @@ "holding_address#0 (copy)" ] }, - "2724": { + "2745": { "op": "len", "defined_out": [ "holding_address#0", @@ -21590,7 +21614,7 @@ "len%0#0" ] }, - "2725": { + "2746": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -21603,7 +21627,7 @@ "32" ] }, - "2726": { + "2747": { "op": "==", "defined_out": [ "eq%0#0", @@ -21614,14 +21638,14 @@ "eq%0#0" ] }, - "2727": { + "2748": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ "holding_address#0" ] }, - "2728": { + "2749": { "op": "txna ApplicationArgs 2", "defined_out": [ "holding_address#0", @@ -21632,7 +21656,7 @@ "tmp%2#0" ] }, - "2731": { + "2752": { "op": "dup", "defined_out": [ "holding_address#0", @@ -21645,7 +21669,7 @@ "tmp%2#0 (copy)" ] }, - "2732": { + "2753": { "op": "len", "defined_out": [ "holding_address#0", @@ -21658,7 +21682,7 @@ "len%1#0" ] }, - "2733": { + "2754": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -21673,7 +21697,7 @@ "1" ] }, - "2734": { + "2755": { "op": "==", "defined_out": [ "eq%1#0", @@ -21686,7 +21710,7 @@ "eq%1#0" ] }, - "2735": { + "2756": { "error": "invalid number of bytes for arc4.bool", "op": "assert // invalid number of bytes for arc4.bool", "stack_out": [ @@ -21694,7 +21718,7 @@ "tmp%2#0" ] }, - "2736": { + "2757": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -21707,7 +21731,7 @@ "0" ] }, - "2737": { + "2758": { "op": "getbit", "defined_out": [ "holding_address#0", @@ -21718,7 +21742,7 @@ "suspended#0" ] }, - "2738": { + "2759": { "op": "bytec 21 // 0x523a41555423", "defined_out": [ "0x523a41555423", @@ -21731,7 +21755,7 @@ "0x523a41555423" ] }, - "2740": { + "2761": { "op": "txn Sender", "defined_out": [ "0x523a41555423", @@ -21746,7 +21770,7 @@ "tmp%0#2" ] }, - "2742": { + "2763": { "callsub": "modules.rbac.RbacModule._role_is_active", "op": "callsub _role_is_active", "defined_out": [ @@ -21760,7 +21784,7 @@ "tmp%1#0" ] }, - "2745": { + "2766": { "error": "Not authorized", "op": "assert // Not authorized", "stack_out": [ @@ -21768,7 +21792,7 @@ "suspended#0" ] }, - "2746": { + "2767": { "op": "bytec 8 // 0x4123", "defined_out": [ "0x4123", @@ -21781,7 +21805,7 @@ "0x4123" ] }, - "2748": { + "2769": { "op": "uncover 2", "stack_out": [ "suspended#0", @@ -21789,7 +21813,7 @@ "holding_address#0" ] }, - "2750": { + "2771": { "op": "concat", "defined_out": [ "box_prefixed_key%0#1", @@ -21800,7 +21824,7 @@ "box_prefixed_key%0#1" ] }, - "2751": { + "2772": { "op": "dup", "defined_out": [ "box_prefixed_key%0#1", @@ -21813,7 +21837,7 @@ "box_prefixed_key%0#1 (copy)" ] }, - "2752": { + "2773": { "op": "box_len", "defined_out": [ "_%0#0", @@ -21828,7 +21852,7 @@ "maybe_exists%0#0" ] }, - "2753": { + "2774": { "op": "bury 1", "stack_out": [ "suspended#0", @@ -21836,7 +21860,7 @@ "maybe_exists%0#0" ] }, - "2755": { + "2776": { "error": "Invalid account holding address", "op": "assert // Invalid account holding address", "stack_out": [ @@ -21844,7 +21868,7 @@ "box_prefixed_key%0#1" ] }, - "2756": { + "2777": { "op": "dup", "stack_out": [ "suspended#0", @@ -21852,7 +21876,7 @@ "box_prefixed_key%0#1 (copy)" ] }, - "2757": { + "2778": { "op": "pushint 48", "defined_out": [ "48", @@ -21867,7 +21891,7 @@ "48" ] }, - "2759": { + "2780": { "op": "intc_1 // 1", "stack_out": [ "suspended#0", @@ -21877,7 +21901,7 @@ "1" ] }, - "2760": { + "2781": { "op": "box_extract", "defined_out": [ "box%box_extract%0#0", @@ -21890,7 +21914,7 @@ "box%box_extract%0#0" ] }, - "2761": { + "2782": { "op": "intc_0 // 0", "stack_out": [ "suspended#0", @@ -21899,7 +21923,7 @@ "0" ] }, - "2762": { + "2783": { "op": "uncover 3", "stack_out": [ "box_prefixed_key%0#1", @@ -21908,7 +21932,7 @@ "suspended#0" ] }, - "2764": { + "2785": { "op": "setbit", "defined_out": [ "aggregate%updated_target%0#0", @@ -21919,10 +21943,10 @@ "aggregate%updated_target%0#0" ] }, - "2765": { + "2786": { "op": "pushint 48" }, - "2767": { + "2788": { "op": "swap", "stack_out": [ "box_prefixed_key%0#1", @@ -21930,11 +21954,11 @@ "aggregate%updated_target%0#0" ] }, - "2768": { + "2789": { "op": "box_replace", "stack_out": [] }, - "2769": { + "2790": { "op": "global LatestTimestamp", "defined_out": [ "tmp%0#1" @@ -21943,7 +21967,7 @@ "tmp%0#1" ] }, - "2771": { + "2792": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0" @@ -21952,7 +21976,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "2772": { + "2793": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -21963,14 +21987,14 @@ "0x151f7c75" ] }, - "2773": { + "2794": { "op": "swap", "stack_out": [ "0x151f7c75", "aggregate%val_as_bytes%0#0" ] }, - "2774": { + "2795": { "op": "concat", "defined_out": [ "tmp%6#0" @@ -21979,21 +22003,21 @@ "tmp%6#0" ] }, - "2775": { + "2796": { "op": "log", "stack_out": [] }, - "2776": { + "2797": { "op": "intc_1 // 1", "stack_out": [ "1" ] }, - "2777": { + "2798": { "op": "return", "stack_out": [] }, - "2778": { + "2799": { "subroutine": "modules.accounting.AccountingModule.account_open[routing]", "params": {}, "block": "account_open", @@ -22006,7 +22030,7 @@ "holding_address#0" ] }, - "2781": { + "2802": { "op": "dup", "defined_out": [ "holding_address#0", @@ -22017,7 +22041,7 @@ "holding_address#0 (copy)" ] }, - "2782": { + "2803": { "op": "len", "defined_out": [ "holding_address#0", @@ -22028,7 +22052,7 @@ "len%0#0" ] }, - "2783": { + "2804": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -22041,7 +22065,7 @@ "32" ] }, - "2784": { + "2805": { "op": "==", "defined_out": [ "eq%0#0", @@ -22052,14 +22076,14 @@ "eq%0#0" ] }, - "2785": { + "2806": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ "holding_address#0" ] }, - "2786": { + "2807": { "op": "txna ApplicationArgs 2", "defined_out": [ "holding_address#0", @@ -22070,7 +22094,7 @@ "payment_address#0" ] }, - "2789": { + "2810": { "op": "dup", "defined_out": [ "holding_address#0", @@ -22083,7 +22107,7 @@ "payment_address#0 (copy)" ] }, - "2790": { + "2811": { "op": "len", "defined_out": [ "holding_address#0", @@ -22096,7 +22120,7 @@ "len%1#0" ] }, - "2791": { + "2812": { "op": "intc_3 // 32", "stack_out": [ "holding_address#0", @@ -22105,7 +22129,7 @@ "32" ] }, - "2792": { + "2813": { "op": "==", "defined_out": [ "eq%1#0", @@ -22118,7 +22142,7 @@ "eq%1#0" ] }, - "2793": { + "2814": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ @@ -22126,7 +22150,7 @@ "payment_address#0" ] }, - "2794": { + "2815": { "op": "bytec 23 // 0x523a4d4e4723", "defined_out": [ "0x523a4d4e4723", @@ -22139,7 +22163,7 @@ "0x523a4d4e4723" ] }, - "2796": { + "2817": { "op": "txn Sender", "defined_out": [ "0x523a4d4e4723", @@ -22154,7 +22178,7 @@ "tmp%0#2" ] }, - "2798": { + "2819": { "callsub": "modules.rbac.RbacModule._role_is_active", "op": "callsub _role_is_active", "defined_out": [ @@ -22168,7 +22192,7 @@ "tmp%1#1" ] }, - "2801": { + "2822": { "error": "Not authorized", "op": "assert // Not authorized", "stack_out": [ @@ -22176,7 +22200,7 @@ "payment_address#0" ] }, - "2802": { + "2823": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -22189,7 +22213,7 @@ "0" ] }, - "2803": { + "2824": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"", @@ -22204,7 +22228,7 @@ "\"status\"" ] }, - "2804": { + "2825": { "op": "app_global_get_ex", "defined_out": [ "holding_address#0", @@ -22219,7 +22243,7 @@ "maybe_exists%0#0" ] }, - "2805": { + "2826": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ @@ -22228,7 +22252,7 @@ "maybe_value%0#0" ] }, - "2806": { + "2827": { "op": "pushint 200", "defined_out": [ "200", @@ -22243,7 +22267,7 @@ "200" ] }, - "2809": { + "2830": { "op": "==", "defined_out": [ "holding_address#0", @@ -22256,7 +22280,7 @@ "tmp%0#3" ] }, - "2810": { + "2831": { "op": "!", "stack_out": [ "holding_address#0", @@ -22264,7 +22288,7 @@ "tmp%1#1" ] }, - "2811": { + "2832": { "error": "Not authorized", "op": "assert // Not authorized", "stack_out": [ @@ -22272,15 +22296,15 @@ "payment_address#0" ] }, - "2812": { + "2833": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", "op": "callsub _assert_is_not_asset_defaulted" }, - "2815": { + "2836": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_suspended", "op": "callsub _assert_is_not_asset_suspended" }, - "2818": { + "2839": { "op": "bytec 8 // 0x4123", "defined_out": [ "0x4123", @@ -22293,7 +22317,7 @@ "0x4123" ] }, - "2820": { + "2841": { "op": "uncover 2", "stack_out": [ "payment_address#0", @@ -22301,7 +22325,7 @@ "holding_address#0" ] }, - "2822": { + "2843": { "op": "concat", "defined_out": [ "box_prefixed_key%0#0", @@ -22312,7 +22336,7 @@ "box_prefixed_key%0#0" ] }, - "2823": { + "2844": { "op": "dup", "defined_out": [ "box_prefixed_key%0#0", @@ -22325,7 +22349,7 @@ "box_prefixed_key%0#0 (copy)" ] }, - "2824": { + "2845": { "op": "box_len", "defined_out": [ "_%0#0", @@ -22340,7 +22364,7 @@ "maybe_exists%0#0" ] }, - "2825": { + "2846": { "op": "bury 1", "stack_out": [ "payment_address#0", @@ -22348,7 +22372,7 @@ "maybe_exists%0#0" ] }, - "2827": { + "2848": { "op": "!", "defined_out": [ "box_prefixed_key%0#0", @@ -22361,7 +22385,7 @@ "tmp%2#1" ] }, - "2828": { + "2849": { "error": "Invalid account holding address", "op": "assert // Invalid account holding address", "stack_out": [ @@ -22369,7 +22393,7 @@ "box_prefixed_key%0#0" ] }, - "2829": { + "2850": { "op": "intc_0 // 0", "stack_out": [ "payment_address#0", @@ -22377,7 +22401,7 @@ "0" ] }, - "2830": { + "2851": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0", @@ -22390,7 +22414,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "2831": { + "2852": { "op": "uncover 2", "stack_out": [ "box_prefixed_key%0#0", @@ -22398,7 +22422,7 @@ "payment_address#0" ] }, - "2833": { + "2854": { "op": "dig 1", "defined_out": [ "aggregate%val_as_bytes%0#0", @@ -22413,7 +22437,7 @@ "aggregate%val_as_bytes%0#0 (copy)" ] }, - "2835": { + "2856": { "op": "concat", "defined_out": [ "aggregate%head%1#0", @@ -22426,7 +22450,7 @@ "aggregate%head%1#0" ] }, - "2836": { + "2857": { "op": "dig 1", "stack_out": [ "box_prefixed_key%0#0", @@ -22435,7 +22459,7 @@ "aggregate%val_as_bytes%0#0 (copy)" ] }, - "2838": { + "2859": { "op": "concat", "defined_out": [ "aggregate%head%2#0", @@ -22448,7 +22472,7 @@ "aggregate%head%2#0" ] }, - "2839": { + "2860": { "op": "bytec 40 // 0x00", "defined_out": [ "0x00", @@ -22463,7 +22487,7 @@ "0x00" ] }, - "2841": { + "2862": { "op": "concat", "defined_out": [ "aggregate%head%3#0", @@ -22476,7 +22500,7 @@ "aggregate%head%3#0" ] }, - "2842": { + "2863": { "op": "dig 1", "stack_out": [ "box_prefixed_key%0#0", @@ -22485,7 +22509,7 @@ "aggregate%val_as_bytes%0#0 (copy)" ] }, - "2844": { + "2865": { "op": "concat", "defined_out": [ "aggregate%head%4#0", @@ -22498,7 +22522,7 @@ "aggregate%head%4#0" ] }, - "2845": { + "2866": { "op": "dig 1", "stack_out": [ "box_prefixed_key%0#0", @@ -22507,7 +22531,7 @@ "aggregate%val_as_bytes%0#0 (copy)" ] }, - "2847": { + "2868": { "op": "concat", "defined_out": [ "aggregate%head%5#0", @@ -22520,7 +22544,7 @@ "aggregate%head%5#0" ] }, - "2848": { + "2869": { "op": "dig 1", "stack_out": [ "box_prefixed_key%0#0", @@ -22529,7 +22553,7 @@ "aggregate%val_as_bytes%0#0 (copy)" ] }, - "2850": { + "2871": { "op": "concat", "defined_out": [ "aggregate%head%6#0", @@ -22542,7 +22566,7 @@ "aggregate%head%6#0" ] }, - "2851": { + "2872": { "op": "dig 1", "stack_out": [ "box_prefixed_key%0#0", @@ -22551,7 +22575,7 @@ "aggregate%val_as_bytes%0#0 (copy)" ] }, - "2853": { + "2874": { "op": "concat", "defined_out": [ "aggregate%head%7#0", @@ -22564,7 +22588,7 @@ "aggregate%head%7#0" ] }, - "2854": { + "2875": { "op": "swap", "stack_out": [ "box_prefixed_key%0#0", @@ -22572,7 +22596,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "2855": { + "2876": { "op": "concat", "defined_out": [ "aggregate%head%8#0", @@ -22583,11 +22607,11 @@ "aggregate%head%8#0" ] }, - "2856": { + "2877": { "op": "box_put", "stack_out": [] }, - "2857": { + "2878": { "op": "global LatestTimestamp", "defined_out": [ "tmp%4#1" @@ -22596,7 +22620,7 @@ "tmp%4#1" ] }, - "2859": { + "2880": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%7#0" @@ -22605,7 +22629,7 @@ "aggregate%val_as_bytes%7#0" ] }, - "2860": { + "2881": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -22616,14 +22640,14 @@ "0x151f7c75" ] }, - "2861": { + "2882": { "op": "swap", "stack_out": [ "0x151f7c75", "aggregate%val_as_bytes%7#0" ] }, - "2862": { + "2883": { "op": "concat", "defined_out": [ "tmp%6#0" @@ -22632,11 +22656,11 @@ "tmp%6#0" ] }, - "2863": { + "2884": { "op": "log", "stack_out": [] }, - "2864": { + "2885": { "op": "intc_1 // 1", "defined_out": [ "1" @@ -22645,11 +22669,11 @@ "1" ] }, - "2865": { + "2886": { "op": "return", "stack_out": [] }, - "2866": { + "2887": { "subroutine": "modules.accounting.AccountingModule.account_update_payment_address[routing]", "params": {}, "block": "account_update_payment_address", @@ -22662,7 +22686,7 @@ "holding_address#0" ] }, - "2869": { + "2890": { "op": "dup", "defined_out": [ "holding_address#0", @@ -22673,7 +22697,7 @@ "holding_address#0 (copy)" ] }, - "2870": { + "2891": { "op": "len", "defined_out": [ "holding_address#0", @@ -22684,7 +22708,7 @@ "len%0#0" ] }, - "2871": { + "2892": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -22697,7 +22721,7 @@ "32" ] }, - "2872": { + "2893": { "op": "==", "defined_out": [ "eq%0#0", @@ -22708,14 +22732,14 @@ "eq%0#0" ] }, - "2873": { + "2894": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ "holding_address#0" ] }, - "2874": { + "2895": { "op": "txna ApplicationArgs 2", "defined_out": [ "holding_address#0", @@ -22726,7 +22750,7 @@ "tmp%2#0" ] }, - "2877": { + "2898": { "op": "dup", "defined_out": [ "holding_address#0", @@ -22739,7 +22763,7 @@ "tmp%2#0 (copy)" ] }, - "2878": { + "2899": { "op": "len", "defined_out": [ "holding_address#0", @@ -22752,7 +22776,7 @@ "len%1#0" ] }, - "2879": { + "2900": { "op": "intc_3 // 32", "stack_out": [ "holding_address#0", @@ -22761,7 +22785,7 @@ "32" ] }, - "2880": { + "2901": { "op": "==", "defined_out": [ "eq%1#0", @@ -22774,7 +22798,7 @@ "eq%1#0" ] }, - "2881": { + "2902": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ @@ -22782,7 +22806,7 @@ "tmp%2#0" ] }, - "2882": { + "2903": { "op": "bytec 8 // 0x4123", "defined_out": [ "0x4123", @@ -22795,7 +22819,7 @@ "0x4123" ] }, - "2884": { + "2905": { "op": "dig 2", "stack_out": [ "holding_address#0", @@ -22804,7 +22828,7 @@ "holding_address#0 (copy)" ] }, - "2886": { + "2907": { "op": "concat", "defined_out": [ "box_prefixed_key%0#1", @@ -22817,7 +22841,7 @@ "box_prefixed_key%0#1" ] }, - "2887": { + "2908": { "op": "dup", "defined_out": [ "box_prefixed_key%0#1", @@ -22832,7 +22856,7 @@ "box_prefixed_key%0#1 (copy)" ] }, - "2888": { + "2909": { "op": "box_len", "defined_out": [ "_%0#0", @@ -22849,7 +22873,7 @@ "maybe_exists%0#0" ] }, - "2889": { + "2910": { "op": "bury 1", "stack_out": [ "holding_address#0", @@ -22858,7 +22882,7 @@ "maybe_exists%0#0" ] }, - "2891": { + "2912": { "error": "Invalid account holding address", "op": "assert // Invalid account holding address", "stack_out": [ @@ -22867,7 +22891,7 @@ "box_prefixed_key%0#1" ] }, - "2892": { + "2913": { "op": "txn Sender", "defined_out": [ "box_prefixed_key%0#1", @@ -22882,7 +22906,7 @@ "tmp%0#1" ] }, - "2894": { + "2915": { "op": "uncover 3", "stack_out": [ "tmp%2#0", @@ -22891,7 +22915,7 @@ "holding_address#0" ] }, - "2896": { + "2917": { "op": "==", "defined_out": [ "box_prefixed_key%0#1", @@ -22904,7 +22928,7 @@ "tmp%1#1" ] }, - "2897": { + "2918": { "error": "Not authorized", "op": "assert // Not authorized", "stack_out": [ @@ -22912,15 +22936,15 @@ "box_prefixed_key%0#1" ] }, - "2898": { + "2919": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", "op": "callsub _assert_is_not_asset_defaulted" }, - "2901": { + "2922": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_suspended", "op": "callsub _assert_is_not_asset_suspended" }, - "2904": { + "2925": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -22933,7 +22957,7 @@ "0" ] }, - "2905": { + "2926": { "op": "uncover 2", "stack_out": [ "box_prefixed_key%0#1", @@ -22941,11 +22965,11 @@ "tmp%2#0" ] }, - "2907": { + "2928": { "op": "box_replace", "stack_out": [] }, - "2908": { + "2929": { "op": "global LatestTimestamp", "defined_out": [ "tmp%2#1" @@ -22954,7 +22978,7 @@ "tmp%2#1" ] }, - "2910": { + "2931": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0" @@ -22963,7 +22987,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "2911": { + "2932": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -22974,14 +22998,14 @@ "0x151f7c75" ] }, - "2912": { + "2933": { "op": "swap", "stack_out": [ "0x151f7c75", "aggregate%val_as_bytes%0#0" ] }, - "2913": { + "2934": { "op": "concat", "defined_out": [ "tmp%6#0" @@ -22990,11 +23014,11 @@ "tmp%6#0" ] }, - "2914": { + "2935": { "op": "log", "stack_out": [] }, - "2915": { + "2936": { "op": "intc_1 // 1", "defined_out": [ "1" @@ -23003,11 +23027,11 @@ "1" ] }, - "2916": { + "2937": { "op": "return", "stack_out": [] }, - "2917": { + "2938": { "subroutine": "modules.accounting.AccountingModule.account_get_position[routing]", "params": {}, "block": "account_get_position", @@ -23020,7 +23044,7 @@ "holding_address#0" ] }, - "2920": { + "2941": { "op": "dup", "defined_out": [ "holding_address#0", @@ -23031,7 +23055,7 @@ "holding_address#0 (copy)" ] }, - "2921": { + "2942": { "op": "len", "defined_out": [ "holding_address#0", @@ -23042,7 +23066,7 @@ "len%0#0" ] }, - "2922": { + "2943": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -23055,7 +23079,7 @@ "32" ] }, - "2923": { + "2944": { "op": "==", "defined_out": [ "eq%0#0", @@ -23066,14 +23090,14 @@ "eq%0#0" ] }, - "2924": { + "2945": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ "holding_address#0" ] }, - "2925": { + "2946": { "op": "bytec 8 // 0x4123", "defined_out": [ "0x4123", @@ -23084,14 +23108,14 @@ "0x4123" ] }, - "2927": { + "2948": { "op": "swap", "stack_out": [ "0x4123", "holding_address#0" ] }, - "2928": { + "2949": { "op": "concat", "defined_out": [ "box_prefixed_key%0#1" @@ -23100,7 +23124,7 @@ "box_prefixed_key%0#1" ] }, - "2929": { + "2950": { "op": "dup", "defined_out": [ "box_prefixed_key%0#1", @@ -23111,7 +23135,7 @@ "box_prefixed_key%0#1 (copy)" ] }, - "2930": { + "2951": { "op": "box_len", "defined_out": [ "_%0#0", @@ -23124,21 +23148,21 @@ "maybe_exists%0#0" ] }, - "2931": { + "2952": { "op": "bury 1", "stack_out": [ "box_prefixed_key%0#1", "maybe_exists%0#0" ] }, - "2933": { + "2954": { "error": "Invalid account holding address", "op": "assert // Invalid account holding address", "stack_out": [ "box_prefixed_key%0#1" ] }, - "2934": { + "2955": { "op": "box_get", "defined_out": [ "aggregate%box_get%0#0", @@ -23149,13 +23173,13 @@ "aggregate%box_get%1#0" ] }, - "2935": { + "2956": { "op": "pop", "stack_out": [ "aggregate%box_get%0#0" ] }, - "2936": { + "2957": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -23166,14 +23190,14 @@ "0x151f7c75" ] }, - "2937": { + "2958": { "op": "swap", "stack_out": [ "0x151f7c75", "aggregate%box_get%0#0" ] }, - "2938": { + "2959": { "op": "concat", "defined_out": [ "tmp%3#0" @@ -23182,11 +23206,11 @@ "tmp%3#0" ] }, - "2939": { + "2960": { "op": "log", "stack_out": [] }, - "2940": { + "2961": { "op": "intc_1 // 1", "defined_out": [ "1" @@ -23195,11 +23219,11 @@ "1" ] }, - "2941": { + "2962": { "op": "return", "stack_out": [] }, - "2942": { + "2963": { "subroutine": "modules.actus_kernel.ActusKernelModule.contract_create[routing]", "params": {}, "block": "contract_create", @@ -23212,7 +23236,7 @@ "arranger#0" ] }, - "2945": { + "2966": { "op": "dup", "defined_out": [ "arranger#0", @@ -23223,7 +23247,7 @@ "arranger#0 (copy)" ] }, - "2946": { + "2967": { "op": "len", "defined_out": [ "arranger#0", @@ -23234,7 +23258,7 @@ "len%0#0" ] }, - "2947": { + "2968": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -23247,7 +23271,7 @@ "32" ] }, - "2948": { + "2969": { "op": "==", "defined_out": [ "arranger#0", @@ -23258,14 +23282,14 @@ "eq%0#0" ] }, - "2949": { + "2970": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ "arranger#0" ] }, - "2950": { + "2971": { "op": "bytec 18 // 0x523a41525223", "defined_out": [ "0x523a41525223", @@ -23276,18 +23300,18 @@ "0x523a41525223" ] }, - "2952": { + "2973": { "op": "swap", "stack_out": [ "0x523a41525223", "arranger#0" ] }, - "2953": { + "2974": { "op": "app_global_put", "stack_out": [] }, - "2954": { + "2975": { "op": "global LatestTimestamp", "defined_out": [ "tmp%0#1" @@ -23296,7 +23320,7 @@ "tmp%0#1" ] }, - "2956": { + "2977": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0" @@ -23305,7 +23329,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "2957": { + "2978": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -23316,14 +23340,14 @@ "0x151f7c75" ] }, - "2958": { + "2979": { "op": "swap", "stack_out": [ "0x151f7c75", "aggregate%val_as_bytes%0#0" ] }, - "2959": { + "2980": { "op": "concat", "defined_out": [ "tmp%4#0" @@ -23332,11 +23356,11 @@ "tmp%4#0" ] }, - "2960": { + "2981": { "op": "log", "stack_out": [] }, - "2961": { + "2982": { "op": "intc_1 // 1", "defined_out": [ "1" @@ -23345,11 +23369,11 @@ "1" ] }, - "2962": { + "2983": { "op": "return", "stack_out": [] }, - "2963": { + "2984": { "subroutine": "modules.actus_kernel.ActusKernelModule.contract_config[routing]", "params": {}, "block": "contract_config", @@ -23359,17 +23383,17 @@ "day_count_convention#0" ] }, - "2965": { + "2986": { "op": "dup", "stack_out": [ "day_count_convention#0", "values%0#2" ] }, - "2966": { + "2987": { "op": "txna ApplicationArgs 1" }, - "2969": { + "2990": { "op": "dupn 2", "defined_out": [ "terms#0", @@ -23383,7 +23407,7 @@ "terms#0 (copy)" ] }, - "2971": { + "2992": { "op": "len", "defined_out": [ "len%0#0", @@ -23397,7 +23421,7 @@ "len%0#0" ] }, - "2972": { + "2993": { "op": "pushint 107", "defined_out": [ "107", @@ -23413,7 +23437,7 @@ "107" ] }, - "2974": { + "2995": { "op": "==", "defined_out": [ "eq%0#0", @@ -23427,7 +23451,7 @@ "eq%0#0" ] }, - "2975": { + "2996": { "error": "invalid number of bytes for smart_contracts.abi_types.NormalizedActusTerms", "op": "assert // invalid number of bytes for smart_contracts.abi_types.NormalizedActusTerms", "stack_out": [ @@ -23437,10 +23461,10 @@ "terms#0" ] }, - "2976": { + "2997": { "op": "txna ApplicationArgs 2" }, - "2979": { + "3000": { "op": "dup", "defined_out": [ "initial_state#0", @@ -23455,7 +23479,7 @@ "initial_state#0" ] }, - "2980": { + "3001": { "op": "cover 2", "defined_out": [ "initial_state#0", @@ -23470,7 +23494,7 @@ "initial_state#0" ] }, - "2982": { + "3003": { "op": "len", "defined_out": [ "initial_state#0", @@ -23486,7 +23510,7 @@ "len%1#0" ] }, - "2983": { + "3004": { "op": "pushint 72", "defined_out": [ "72", @@ -23504,7 +23528,7 @@ "72" ] }, - "2985": { + "3006": { "op": "==", "defined_out": [ "eq%1#0", @@ -23520,7 +23544,7 @@ "eq%1#0" ] }, - "2986": { + "3007": { "error": "invalid number of bytes for smart_contracts.abi_types.InitialKernelState", "op": "assert // invalid number of bytes for smart_contracts.abi_types.InitialKernelState", "stack_out": [ @@ -23531,10 +23555,10 @@ "terms#0" ] }, - "2987": { + "3008": { "op": "txna ApplicationArgs 3" }, - "2990": { + "3011": { "op": "dup", "defined_out": [ "initial_state#0", @@ -23551,7 +23575,7 @@ "prospectus#0" ] }, - "2991": { + "3012": { "op": "cover 2", "defined_out": [ "initial_state#0", @@ -23568,7 +23592,7 @@ "prospectus#0" ] }, - "2993": { + "3014": { "op": "dup", "defined_out": [ "initial_state#0", @@ -23587,7 +23611,7 @@ "prospectus#0 (copy)" ] }, - "2994": { + "3015": { "op": "len", "defined_out": [ "initial_state#0", @@ -23606,7 +23630,7 @@ "tuple_len%0#0" ] }, - "2995": { + "3016": { "op": "dig 1", "stack_out": [ "day_count_convention#0", @@ -23620,7 +23644,7 @@ "prospectus#0 (copy)" ] }, - "2997": { + "3018": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -23643,7 +23667,7 @@ "32" ] }, - "2998": { + "3019": { "error": "invalid tuple encoding", "op": "extract_uint16 // on error: invalid tuple encoding", "defined_out": [ @@ -23665,7 +23689,7 @@ "extract_uint16%0#0" ] }, - "2999": { + "3020": { "op": "dup", "defined_out": [ "extract_uint16%0#0", @@ -23688,7 +23712,7 @@ "extract_uint16%0#0 (copy)" ] }, - "3000": { + "3021": { "op": "pushint 34", "defined_out": [ "34", @@ -23713,7 +23737,7 @@ "34" ] }, - "3002": { + "3023": { "op": "==", "defined_out": [ "eq%2#0", @@ -23736,7 +23760,7 @@ "eq%2#0" ] }, - "3003": { + "3024": { "error": "invalid tail pointer at index 1 of (uint8[32],(len+utf8[]))", "op": "assert // invalid tail pointer at index 1 of (uint8[32],(len+utf8[]))", "stack_out": [ @@ -23751,7 +23775,7 @@ "extract_uint16%0#0" ] }, - "3004": { + "3025": { "op": "uncover 2", "stack_out": [ "day_count_convention#0", @@ -23765,7 +23789,7 @@ "prospectus#0" ] }, - "3006": { + "3027": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -23779,7 +23803,7 @@ "extract_uint16%0#0" ] }, - "3007": { + "3028": { "op": "dig 2", "defined_out": [ "extract_uint16%0#0", @@ -23802,7 +23826,7 @@ "tuple_len%0#0 (copy)" ] }, - "3009": { + "3030": { "op": "substring3", "defined_out": [ "initial_state#0", @@ -23822,7 +23846,7 @@ "substring3%0#0" ] }, - "3010": { + "3031": { "op": "dup", "stack_out": [ "day_count_convention#0", @@ -23836,7 +23860,7 @@ "substring3%0#0" ] }, - "3011": { + "3032": { "op": "cover 3", "defined_out": [ "initial_state#0", @@ -23857,7 +23881,7 @@ "substring3%0#0" ] }, - "3013": { + "3034": { "op": "intc_0 // 0", "stack_out": [ "day_count_convention#0", @@ -23872,7 +23896,7 @@ "0" ] }, - "3014": { + "3035": { "error": "invalid array length header", "op": "extract_uint16 // on error: invalid array length header", "defined_out": [ @@ -23895,7 +23919,7 @@ "aggregate%array_length%0#0" ] }, - "3015": { + "3036": { "op": "pushint 36", "defined_out": [ "36", @@ -23919,7 +23943,7 @@ "36" ] }, - "3017": { + "3038": { "op": "+", "defined_out": [ "add%1#0", @@ -23941,7 +23965,7 @@ "add%1#0" ] }, - "3018": { + "3039": { "op": "==", "defined_out": [ "eq%3#0", @@ -23961,7 +23985,7 @@ "eq%3#0" ] }, - "3019": { + "3040": { "error": "invalid number of bytes for smart_contracts.abi_types.Prospectus", "op": "assert // invalid number of bytes for smart_contracts.abi_types.Prospectus", "stack_out": [ @@ -23974,11 +23998,11 @@ "terms#0" ] }, - "3020": { + "3041": { "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", "op": "callsub _assert_caller_is_arranger" }, - "3023": { + "3044": { "op": "intc_0 // 0", "stack_out": [ "day_count_convention#0", @@ -23991,7 +24015,7 @@ "0" ] }, - "3024": { + "3045": { "op": "getbyte", "defined_out": [ "contract_type#0", @@ -24010,7 +24034,7 @@ "contract_type#0" ] }, - "3025": { + "3046": { "op": "dup", "defined_out": [ "contract_type#0", @@ -24030,7 +24054,7 @@ "contract_type#0" ] }, - "3026": { + "3047": { "op": "bytec 10 // \"contract_type\"", "defined_out": [ "\"contract_type\"", @@ -24052,7 +24076,7 @@ "\"contract_type\"" ] }, - "3028": { + "3049": { "op": "dig 1", "defined_out": [ "\"contract_type\"", @@ -24076,7 +24100,7 @@ "contract_type#0 (copy)" ] }, - "3030": { + "3051": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -24089,7 +24113,7 @@ "contract_type#0" ] }, - "3031": { + "3052": { "op": "bz contract_config_bool_true@7", "stack_out": [ "day_count_convention#0", @@ -24101,7 +24125,7 @@ "contract_type#0" ] }, - "3034": { + "3055": { "op": "dup", "stack_out": [ "day_count_convention#0", @@ -24114,7 +24138,7 @@ "contract_type#0" ] }, - "3035": { + "3056": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -24136,7 +24160,7 @@ "1" ] }, - "3036": { + "3057": { "op": "==", "defined_out": [ "contract_type#0", @@ -24157,7 +24181,7 @@ "tmp%1#2" ] }, - "3037": { + "3058": { "op": "bnz contract_config_bool_true@7", "stack_out": [ "day_count_convention#0", @@ -24169,7 +24193,7 @@ "contract_type#0" ] }, - "3040": { + "3061": { "op": "dup", "stack_out": [ "day_count_convention#0", @@ -24182,7 +24206,7 @@ "contract_type#0" ] }, - "3041": { + "3062": { "op": "pushint 2", "defined_out": [ "2", @@ -24204,7 +24228,7 @@ "2" ] }, - "3043": { + "3064": { "op": "==", "defined_out": [ "contract_type#0", @@ -24225,7 +24249,7 @@ "tmp%2#0" ] }, - "3044": { + "3065": { "op": "bnz contract_config_bool_true@7", "stack_out": [ "day_count_convention#0", @@ -24237,7 +24261,7 @@ "contract_type#0" ] }, - "3047": { + "3068": { "op": "dup", "stack_out": [ "day_count_convention#0", @@ -24250,7 +24274,7 @@ "contract_type#0" ] }, - "3048": { + "3069": { "op": "pushint 3", "stack_out": [ "day_count_convention#0", @@ -24264,7 +24288,7 @@ "3" ] }, - "3050": { + "3071": { "op": "==", "defined_out": [ "contract_type#0", @@ -24285,7 +24309,7 @@ "tmp%3#0" ] }, - "3051": { + "3072": { "op": "bnz contract_config_bool_true@7", "stack_out": [ "day_count_convention#0", @@ -24297,7 +24321,7 @@ "contract_type#0" ] }, - "3054": { + "3075": { "op": "dup", "stack_out": [ "day_count_convention#0", @@ -24310,7 +24334,7 @@ "contract_type#0" ] }, - "3055": { + "3076": { "op": "pushint 4", "defined_out": [ "4", @@ -24332,7 +24356,7 @@ "4" ] }, - "3057": { + "3078": { "op": "==", "defined_out": [ "contract_type#0", @@ -24353,7 +24377,7 @@ "tmp%4#1" ] }, - "3058": { + "3079": { "op": "bnz contract_config_bool_true@7", "stack_out": [ "day_count_convention#0", @@ -24365,7 +24389,7 @@ "contract_type#0" ] }, - "3061": { + "3082": { "op": "dup", "stack_out": [ "day_count_convention#0", @@ -24378,7 +24402,7 @@ "contract_type#0" ] }, - "3062": { + "3083": { "op": "pushint 5", "defined_out": [ "5", @@ -24400,7 +24424,7 @@ "5" ] }, - "3064": { + "3085": { "op": "==", "defined_out": [ "contract_type#0", @@ -24421,7 +24445,7 @@ "tmp%5#1" ] }, - "3065": { + "3086": { "op": "bz contract_config_bool_false@8", "stack_out": [ "day_count_convention#0", @@ -24433,7 +24457,7 @@ "contract_type#0" ] }, - "3068": { + "3089": { "block": "contract_config_bool_true@7", "stack_in": [ "day_count_convention#0", @@ -24459,7 +24483,7 @@ "or_result%0#0" ] }, - "3069": { + "3090": { "error": "Invalid ACTUS configuration", "block": "contract_config_bool_merge@9", "stack_in": [ @@ -24484,7 +24508,7 @@ "contract_type#0" ] }, - "3070": { + "3091": { "op": "intc_0 // 0", "defined_out": [ "0" @@ -24500,7 +24524,7 @@ "0" ] }, - "3071": { + "3092": { "op": "bytec 10 // \"contract_type\"", "defined_out": [ "\"contract_type\"", @@ -24518,7 +24542,7 @@ "\"contract_type\"" ] }, - "3073": { + "3094": { "op": "app_global_get_ex", "defined_out": [ "contract_type#0", @@ -24536,7 +24560,7 @@ "maybe_exists%1#0" ] }, - "3074": { + "3095": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -24550,7 +24574,7 @@ "contract_type#0" ] }, - "3075": { + "3096": { "op": "bury 2", "defined_out": [ "contract_type#0", @@ -24567,7 +24591,7 @@ "maybe_exists%1#0" ] }, - "3077": { + "3098": { "error": "check self.contract_type exists", "op": "assert // check self.contract_type exists", "stack_out": [ @@ -24580,7 +24604,7 @@ "contract_type#0" ] }, - "3078": { + "3099": { "op": "dig 4", "defined_out": [ "contract_type#0", @@ -24597,7 +24621,7 @@ "terms#0" ] }, - "3080": { + "3101": { "op": "dup", "defined_out": [ "contract_type#0", @@ -24616,7 +24640,7 @@ "terms#0 (copy)" ] }, - "3081": { + "3102": { "op": "pushint 33", "defined_out": [ "33", @@ -24637,7 +24661,7 @@ "33" ] }, - "3083": { + "3104": { "op": "extract_uint64", "defined_out": [ "contract_type#0", @@ -24656,7 +24680,7 @@ "values%0#2" ] }, - "3084": { + "3105": { "op": "dup", "stack_out": [ "day_count_convention#0", @@ -24671,7 +24695,7 @@ "values%0#2" ] }, - "3085": { + "3106": { "op": "bury 8", "defined_out": [ "contract_type#0", @@ -24690,7 +24714,7 @@ "values%0#2" ] }, - "3087": { + "3108": { "error": "Invalid ACTUS configuration", "op": "assert // Invalid ACTUS configuration", "stack_out": [ @@ -24704,7 +24728,7 @@ "terms#0" ] }, - "3088": { + "3109": { "op": "pushint 57", "defined_out": [ "57", @@ -24724,7 +24748,7 @@ "57" ] }, - "3090": { + "3111": { "op": "getbyte", "defined_out": [ "contract_type#0", @@ -24743,7 +24767,7 @@ "day_count_convention#0" ] }, - "3091": { + "3112": { "op": "dup", "stack_out": [ "day_count_convention#0", @@ -24757,7 +24781,7 @@ "day_count_convention#0" ] }, - "3092": { + "3113": { "op": "bury 8", "defined_out": [ "contract_type#0", @@ -24776,7 +24800,7 @@ "day_count_convention#0" ] }, - "3094": { + "3115": { "op": "bz contract_config_bool_true@16", "stack_out": [ "day_count_convention#0", @@ -24788,7 +24812,7 @@ "contract_type#0" ] }, - "3097": { + "3118": { "op": "dig 6", "stack_out": [ "day_count_convention#0", @@ -24801,7 +24825,7 @@ "day_count_convention#0" ] }, - "3099": { + "3120": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -24822,7 +24846,7 @@ "1" ] }, - "3100": { + "3121": { "op": "==", "defined_out": [ "contract_type#0", @@ -24842,7 +24866,7 @@ "tmp%1#2" ] }, - "3101": { + "3122": { "op": "bnz contract_config_bool_true@16", "stack_out": [ "day_count_convention#0", @@ -24854,7 +24878,7 @@ "contract_type#0" ] }, - "3104": { + "3125": { "op": "dig 6", "stack_out": [ "day_count_convention#0", @@ -24867,7 +24891,7 @@ "day_count_convention#0" ] }, - "3106": { + "3127": { "op": "pushint 2", "stack_out": [ "day_count_convention#0", @@ -24881,7 +24905,7 @@ "2" ] }, - "3108": { + "3129": { "op": "==", "defined_out": [ "contract_type#0", @@ -24901,7 +24925,7 @@ "tmp%2#0" ] }, - "3109": { + "3130": { "op": "bnz contract_config_bool_true@16", "stack_out": [ "day_count_convention#0", @@ -24913,7 +24937,7 @@ "contract_type#0" ] }, - "3112": { + "3133": { "op": "dig 6", "stack_out": [ "day_count_convention#0", @@ -24926,7 +24950,7 @@ "day_count_convention#0" ] }, - "3114": { + "3135": { "op": "pushint 3", "defined_out": [ "3", @@ -24947,7 +24971,7 @@ "3" ] }, - "3116": { + "3137": { "op": "==", "defined_out": [ "contract_type#0", @@ -24967,7 +24991,7 @@ "tmp%3#0" ] }, - "3117": { + "3138": { "op": "bnz contract_config_bool_true@16", "stack_out": [ "day_count_convention#0", @@ -24979,7 +25003,7 @@ "contract_type#0" ] }, - "3120": { + "3141": { "op": "dig 6", "stack_out": [ "day_count_convention#0", @@ -24992,7 +25016,7 @@ "day_count_convention#0" ] }, - "3122": { + "3143": { "op": "pushint 4", "defined_out": [ "4", @@ -25013,7 +25037,7 @@ "4" ] }, - "3124": { + "3145": { "op": "==", "defined_out": [ "contract_type#0", @@ -25033,7 +25057,7 @@ "tmp%4#1" ] }, - "3125": { + "3146": { "op": "bz contract_config_bool_false@17", "stack_out": [ "day_count_convention#0", @@ -25045,7 +25069,7 @@ "contract_type#0" ] }, - "3128": { + "3149": { "block": "contract_config_bool_true@16", "stack_in": [ "day_count_convention#0", @@ -25071,7 +25095,7 @@ "or_result%0#0" ] }, - "3129": { + "3150": { "error": "Invalid day-count convention ID", "block": "contract_config_bool_merge@18", "stack_in": [ @@ -25096,7 +25120,7 @@ "contract_type#0" ] }, - "3130": { + "3151": { "op": "dup", "defined_out": [ "contract_type#0" @@ -25112,7 +25136,7 @@ "contract_type#0" ] }, - "3131": { + "3152": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -25130,7 +25154,7 @@ "1" ] }, - "3132": { + "3153": { "op": "!=", "defined_out": [ "contract_type#0", @@ -25147,7 +25171,7 @@ "tmp%2#0" ] }, - "3133": { + "3154": { "op": "bz contract_config_after_if_else@20", "stack_out": [ "day_count_convention#0", @@ -25159,7 +25183,7 @@ "contract_type#0" ] }, - "3136": { + "3157": { "op": "dig 4", "defined_out": [ "contract_type#0", @@ -25176,7 +25200,7 @@ "terms#0" ] }, - "3138": { + "3159": { "op": "pushint 786", "defined_out": [ "786", @@ -25195,7 +25219,7 @@ "786" ] }, - "3141": { + "3162": { "op": "getbit", "defined_out": [ "aggregate%get_bit%0#0", @@ -25213,7 +25237,7 @@ "aggregate%get_bit%0#0" ] }, - "3142": { + "3163": { "op": "!", "defined_out": [ "contract_type#0", @@ -25231,7 +25255,7 @@ "tmp%3#0" ] }, - "3143": { + "3164": { "error": "Invalid ACTUS configuration", "op": "assert // Invalid ACTUS configuration", "stack_out": [ @@ -25244,7 +25268,7 @@ "contract_type#0" ] }, - "3144": { + "3165": { "block": "contract_config_after_if_else@20", "stack_in": [ "day_count_convention#0", @@ -25270,7 +25294,7 @@ "0" ] }, - "3145": { + "3166": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"", @@ -25288,7 +25312,7 @@ "\"status\"" ] }, - "3146": { + "3167": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#1", @@ -25306,7 +25330,7 @@ "maybe_exists%0#1" ] }, - "3147": { + "3168": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ @@ -25320,7 +25344,7 @@ "maybe_value%0#1" ] }, - "3148": { + "3169": { "op": "!", "defined_out": [ "tmp%0#2" @@ -25336,7 +25360,7 @@ "tmp%0#2" ] }, - "3149": { + "3170": { "error": "D-ASA already configured", "op": "assert // D-ASA already configured", "stack_out": [ @@ -25349,7 +25373,7 @@ "contract_type#0" ] }, - "3150": { + "3171": { "op": "intc_0 // 0", "stack_out": [ "day_count_convention#0", @@ -25362,7 +25386,7 @@ "0" ] }, - "3151": { + "3172": { "op": "bytec 20 // \"initial_exchange_amount\"", "defined_out": [ "\"initial_exchange_amount\"", @@ -25380,7 +25404,7 @@ "\"initial_exchange_amount\"" ] }, - "3153": { + "3174": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%1#0", @@ -25398,7 +25422,7 @@ "maybe_exists%1#0" ] }, - "3154": { + "3175": { "error": "check self.initial_exchange_amount exists", "op": "assert // check self.initial_exchange_amount exists", "stack_out": [ @@ -25412,7 +25436,7 @@ "maybe_value%1#1" ] }, - "3155": { + "3176": { "op": "!", "defined_out": [ "tmp%1#2" @@ -25428,7 +25452,7 @@ "tmp%1#2" ] }, - "3156": { + "3177": { "error": "D-ASA already configured", "op": "assert // D-ASA already configured", "stack_out": [ @@ -25441,7 +25465,7 @@ "contract_type#0" ] }, - "3157": { + "3178": { "op": "dig 4", "defined_out": [ "terms#0" @@ -25457,7 +25481,7 @@ "terms#0" ] }, - "3159": { + "3180": { "op": "dup", "defined_out": [ "terms#0", @@ -25475,7 +25499,7 @@ "terms#0 (copy)" ] }, - "3160": { + "3181": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -25495,7 +25519,7 @@ "1" ] }, - "3161": { + "3182": { "op": "extract_uint64", "defined_out": [ "denomination_asset_id#0", @@ -25513,7 +25537,7 @@ "denomination_asset_id#0" ] }, - "3162": { + "3183": { "op": "dup", "defined_out": [ "denomination_asset_id#0", @@ -25533,7 +25557,7 @@ "denomination_asset_id#0 (copy)" ] }, - "3163": { + "3184": { "op": "asset_params_get AssetCreator", "defined_out": [ "_creator#0", @@ -25555,7 +25579,7 @@ "exists#0" ] }, - "3165": { + "3186": { "op": "bury 1", "stack_out": [ "day_count_convention#0", @@ -25570,7 +25594,7 @@ "exists#0" ] }, - "3167": { + "3188": { "error": "Denomination asset is not properly set", "op": "assert // Denomination asset is not properly set", "stack_out": [ @@ -25585,7 +25609,7 @@ "denomination_asset_id#0" ] }, - "3168": { + "3189": { "op": "bytec 44 // \"denomination_asset_id\"", "defined_out": [ "\"denomination_asset_id\"", @@ -25605,7 +25629,7 @@ "\"denomination_asset_id\"" ] }, - "3170": { + "3191": { "op": "dig 1", "stack_out": [ "day_count_convention#0", @@ -25621,7 +25645,7 @@ "denomination_asset_id#0 (copy)" ] }, - "3172": { + "3193": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -25635,7 +25659,7 @@ "denomination_asset_id#0" ] }, - "3173": { + "3194": { "op": "dig 1", "stack_out": [ "day_count_convention#0", @@ -25650,7 +25674,7 @@ "terms#0 (copy)" ] }, - "3175": { + "3196": { "op": "pushint 9", "defined_out": [ "9", @@ -25672,7 +25696,7 @@ "9" ] }, - "3177": { + "3198": { "op": "extract_uint64", "defined_out": [ "denomination_asset_id#0", @@ -25692,7 +25716,7 @@ "settlement_asset_id#0" ] }, - "3178": { + "3199": { "op": "dup", "defined_out": [ "denomination_asset_id#0", @@ -25714,7 +25738,7 @@ "settlement_asset_id#0 (copy)" ] }, - "3179": { + "3200": { "op": "uncover 2", "stack_out": [ "day_count_convention#0", @@ -25730,7 +25754,7 @@ "denomination_asset_id#0" ] }, - "3181": { + "3202": { "op": "==", "stack_out": [ "day_count_convention#0", @@ -25745,7 +25769,7 @@ "tmp%0#2" ] }, - "3182": { + "3203": { "error": "Different settlement asset not supported, must be equal to denomination asset", "op": "assert // Different settlement asset not supported, must be equal to denomination asset", "stack_out": [ @@ -25760,7 +25784,7 @@ "settlement_asset_id#0" ] }, - "3183": { + "3204": { "op": "bytec 19 // \"settlement_asset_id\"", "defined_out": [ "\"settlement_asset_id\"", @@ -25780,7 +25804,7 @@ "\"settlement_asset_id\"" ] }, - "3185": { + "3206": { "op": "dig 1", "stack_out": [ "day_count_convention#0", @@ -25796,7 +25820,7 @@ "settlement_asset_id#0 (copy)" ] }, - "3187": { + "3208": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -25810,10 +25834,10 @@ "settlement_asset_id#0" ] }, - "3188": { + "3209": { "op": "itxn_begin" }, - "3189": { + "3210": { "op": "global MinTxnFee", "defined_out": [ "inner_txn_params%0%%param_Fee_idx_0#0", @@ -25833,7 +25857,7 @@ "inner_txn_params%0%%param_Fee_idx_0#0" ] }, - "3191": { + "3212": { "op": "global CurrentApplicationAddress", "defined_out": [ "inner_txn_params%0%%param_AssetReceiver_idx_0#0", @@ -25855,7 +25879,7 @@ "inner_txn_params%0%%param_AssetReceiver_idx_0#0" ] }, - "3193": { + "3214": { "op": "intc_0 // 0", "stack_out": [ "day_count_convention#0", @@ -25872,7 +25896,7 @@ "0" ] }, - "3194": { + "3215": { "op": "itxn_field AssetAmount", "stack_out": [ "day_count_convention#0", @@ -25888,7 +25912,7 @@ "inner_txn_params%0%%param_AssetReceiver_idx_0#0" ] }, - "3196": { + "3217": { "op": "itxn_field AssetReceiver", "stack_out": [ "day_count_convention#0", @@ -25903,7 +25927,7 @@ "inner_txn_params%0%%param_Fee_idx_0#0" ] }, - "3198": { + "3219": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -25918,7 +25942,7 @@ "settlement_asset_id#0" ] }, - "3199": { + "3220": { "op": "itxn_field XferAsset", "stack_out": [ "day_count_convention#0", @@ -25932,7 +25956,7 @@ "inner_txn_params%0%%param_Fee_idx_0#0" ] }, - "3201": { + "3222": { "op": "pushint 4 // axfer", "defined_out": [ "axfer", @@ -25952,7 +25976,7 @@ "axfer" ] }, - "3203": { + "3224": { "op": "itxn_field TypeEnum", "stack_out": [ "day_count_convention#0", @@ -25966,7 +25990,7 @@ "inner_txn_params%0%%param_Fee_idx_0#0" ] }, - "3205": { + "3226": { "op": "itxn_field Fee", "stack_out": [ "day_count_convention#0", @@ -25979,10 +26003,10 @@ "terms#0" ] }, - "3207": { + "3228": { "op": "itxn_submit" }, - "3208": { + "3229": { "op": "dup", "stack_out": [ "day_count_convention#0", @@ -25996,7 +26020,7 @@ "terms#0 (copy)" ] }, - "3209": { + "3230": { "op": "pushint 17", "defined_out": [ "17", @@ -26016,7 +26040,7 @@ "17" ] }, - "3211": { + "3232": { "op": "extract_uint64", "defined_out": [ "terms#0", @@ -26034,7 +26058,7 @@ "values%4#0" ] }, - "3212": { + "3233": { "op": "bytec 13 // \"total_units\"", "defined_out": [ "\"total_units\"", @@ -26054,7 +26078,7 @@ "\"total_units\"" ] }, - "3214": { + "3235": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -26069,7 +26093,7 @@ "values%4#0" ] }, - "3215": { + "3236": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -26082,7 +26106,7 @@ "terms#0" ] }, - "3216": { + "3237": { "op": "bytec 11 // \"reserved_units_total\"", "defined_out": [ "\"reserved_units_total\"", @@ -26100,7 +26124,7 @@ "\"reserved_units_total\"" ] }, - "3218": { + "3239": { "op": "intc_0 // 0", "stack_out": [ "day_count_convention#0", @@ -26115,7 +26139,7 @@ "0" ] }, - "3219": { + "3240": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -26128,7 +26152,7 @@ "terms#0" ] }, - "3220": { + "3241": { "op": "bytec 46 // \"day_count_convention\"", "defined_out": [ "\"day_count_convention\"", @@ -26146,7 +26170,7 @@ "\"day_count_convention\"" ] }, - "3222": { + "3243": { "op": "dig 8", "defined_out": [ "\"day_count_convention\"", @@ -26166,7 +26190,7 @@ "day_count_convention#0" ] }, - "3224": { + "3245": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -26179,7 +26203,7 @@ "terms#0" ] }, - "3225": { + "3246": { "op": "dup", "stack_out": [ "day_count_convention#0", @@ -26193,7 +26217,7 @@ "terms#0 (copy)" ] }, - "3226": { + "3247": { "op": "pushint 41", "defined_out": [ "41", @@ -26214,7 +26238,7 @@ "41" ] }, - "3228": { + "3249": { "op": "extract_uint64", "defined_out": [ "day_count_convention#0", @@ -26233,8 +26257,8 @@ "values%5#0" ] }, - "3229": { - "op": "bytec 27 // \"initial_exchange_date\"", + "3250": { + "op": "bytec 28 // \"initial_exchange_date\"", "defined_out": [ "\"initial_exchange_date\"", "day_count_convention#0", @@ -26254,7 +26278,7 @@ "\"initial_exchange_date\"" ] }, - "3231": { + "3252": { "op": "dig 1", "defined_out": [ "\"initial_exchange_date\"", @@ -26277,7 +26301,7 @@ "values%5#0 (copy)" ] }, - "3233": { + "3254": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -26291,7 +26315,7 @@ "values%5#0" ] }, - "3234": { + "3255": { "op": "dig 1", "stack_out": [ "day_count_convention#0", @@ -26306,7 +26330,7 @@ "terms#0 (copy)" ] }, - "3236": { + "3257": { "op": "pushint 49", "defined_out": [ "49", @@ -26329,7 +26353,7 @@ "49" ] }, - "3238": { + "3259": { "op": "extract_uint64", "defined_out": [ "day_count_convention#0", @@ -26350,7 +26374,7 @@ "values%6#0" ] }, - "3239": { + "3260": { "op": "bytec 45 // \"maturity_date\"", "defined_out": [ "\"maturity_date\"", @@ -26373,7 +26397,7 @@ "\"maturity_date\"" ] }, - "3241": { + "3262": { "op": "dig 1", "defined_out": [ "\"maturity_date\"", @@ -26398,7 +26422,7 @@ "values%6#0 (copy)" ] }, - "3243": { + "3264": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -26413,7 +26437,7 @@ "values%6#0" ] }, - "3244": { + "3265": { "op": "dig 6", "defined_out": [ "day_count_convention#0", @@ -26436,7 +26460,7 @@ "initial_state#0" ] }, - "3246": { + "3267": { "op": "dup", "defined_out": [ "day_count_convention#0", @@ -26461,7 +26485,7 @@ "initial_state#0 (copy)" ] }, - "3247": { + "3268": { "op": "cover 2", "stack_out": [ "day_count_convention#0", @@ -26478,7 +26502,7 @@ "initial_state#0 (copy)" ] }, - "3249": { + "3270": { "op": "pushint 48", "defined_out": [ "48", @@ -26505,7 +26529,7 @@ "48" ] }, - "3251": { + "3272": { "op": "extract_uint64", "defined_out": [ "day_count_convention#0", @@ -26530,7 +26554,7 @@ "values%7#0" ] }, - "3252": { + "3273": { "op": "bytec 14 // \"next_principal_redemption\"", "defined_out": [ "\"next_principal_redemption\"", @@ -26557,7 +26581,7 @@ "\"next_principal_redemption\"" ] }, - "3254": { + "3275": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -26575,7 +26599,7 @@ "values%7#0" ] }, - "3255": { + "3276": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -26591,7 +26615,7 @@ "values%6#0" ] }, - "3256": { + "3277": { "op": "bytec 20 // \"initial_exchange_amount\"", "stack_out": [ "day_count_convention#0", @@ -26608,7 +26632,7 @@ "\"initial_exchange_amount\"" ] }, - "3258": { + "3279": { "op": "dig 10", "defined_out": [ "\"initial_exchange_amount\"", @@ -26635,7 +26659,7 @@ "values%0#2" ] }, - "3260": { + "3281": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -26651,7 +26675,7 @@ "values%6#0" ] }, - "3261": { + "3282": { "op": "dig 3", "stack_out": [ "day_count_convention#0", @@ -26668,7 +26692,7 @@ "terms#0 (copy)" ] }, - "3263": { + "3284": { "op": "pushint 786", "defined_out": [ "786", @@ -26696,7 +26720,7 @@ "786" ] }, - "3266": { + "3287": { "op": "getbit", "defined_out": [ "aggregate%get_bit%1#0", @@ -26722,7 +26746,7 @@ "aggregate%get_bit%1#0" ] }, - "3267": { + "3288": { "op": "bytec 34 // \"dynamic_principal_redemption\"", "defined_out": [ "\"dynamic_principal_redemption\"", @@ -26750,7 +26774,7 @@ "\"dynamic_principal_redemption\"" ] }, - "3269": { + "3290": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -26768,7 +26792,7 @@ "aggregate%get_bit%1#0" ] }, - "3270": { + "3291": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -26784,7 +26808,7 @@ "values%6#0" ] }, - "3271": { + "3292": { "op": "dig 1", "stack_out": [ "day_count_convention#0", @@ -26801,7 +26825,7 @@ "initial_state#0 (copy)" ] }, - "3273": { + "3294": { "op": "pushint 16", "defined_out": [ "16", @@ -26829,7 +26853,7 @@ "16" ] }, - "3275": { + "3296": { "op": "extract_uint64", "defined_out": [ "day_count_convention#0", @@ -26855,7 +26879,7 @@ "values%10#0" ] }, - "3276": { + "3297": { "op": "bytec 4 // \"outstanding_principal\"", "defined_out": [ "\"outstanding_principal\"", @@ -26883,7 +26907,7 @@ "\"outstanding_principal\"" ] }, - "3278": { + "3299": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -26901,7 +26925,7 @@ "values%10#0" ] }, - "3279": { + "3300": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -26917,7 +26941,7 @@ "values%6#0" ] }, - "3280": { + "3301": { "op": "dig 1", "stack_out": [ "day_count_convention#0", @@ -26934,7 +26958,7 @@ "initial_state#0 (copy)" ] }, - "3282": { + "3303": { "op": "pushint 40", "defined_out": [ "40", @@ -26962,7 +26986,7 @@ "40" ] }, - "3284": { + "3305": { "op": "extract_uint64", "defined_out": [ "day_count_convention#0", @@ -26988,7 +27012,7 @@ "values%11#0" ] }, - "3285": { + "3306": { "op": "bytec 6 // \"accrued_interest\"", "defined_out": [ "\"accrued_interest\"", @@ -27016,7 +27040,7 @@ "\"accrued_interest\"" ] }, - "3287": { + "3308": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -27034,7 +27058,7 @@ "values%11#0" ] }, - "3288": { + "3309": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -27050,7 +27074,7 @@ "values%6#0" ] }, - "3289": { + "3310": { "op": "dig 1", "stack_out": [ "day_count_convention#0", @@ -27067,7 +27091,7 @@ "initial_state#0 (copy)" ] }, - "3291": { + "3312": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -27095,7 +27119,7 @@ "32" ] }, - "3292": { + "3313": { "op": "extract_uint64", "defined_out": [ "day_count_convention#0", @@ -27121,7 +27145,7 @@ "values%12#0" ] }, - "3293": { + "3314": { "op": "bytec 9 // \"nominal_interest_rate\"", "defined_out": [ "\"nominal_interest_rate\"", @@ -27149,7 +27173,7 @@ "\"nominal_interest_rate\"" ] }, - "3295": { + "3316": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -27167,7 +27191,7 @@ "values%12#0" ] }, - "3296": { + "3317": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -27183,7 +27207,7 @@ "values%6#0" ] }, - "3297": { + "3318": { "op": "dig 1", "stack_out": [ "day_count_convention#0", @@ -27200,7 +27224,7 @@ "initial_state#0 (copy)" ] }, - "3299": { + "3320": { "op": "pushint 24", "defined_out": [ "24", @@ -27228,7 +27252,7 @@ "24" ] }, - "3301": { + "3322": { "op": "extract_uint64", "defined_out": [ "day_count_convention#0", @@ -27254,7 +27278,7 @@ "values%13#0" ] }, - "3302": { + "3323": { "op": "bytec 7 // \"interest_calculation_base\"", "defined_out": [ "\"interest_calculation_base\"", @@ -27282,7 +27306,7 @@ "\"interest_calculation_base\"" ] }, - "3304": { + "3325": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -27300,7 +27324,7 @@ "values%13#0" ] }, - "3305": { + "3326": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -27316,7 +27340,7 @@ "values%6#0" ] }, - "3306": { + "3327": { "op": "dig 3", "stack_out": [ "day_count_convention#0", @@ -27333,7 +27357,7 @@ "terms#0 (copy)" ] }, - "3308": { + "3329": { "op": "pushint 58", "defined_out": [ "58", @@ -27361,7 +27385,7 @@ "58" ] }, - "3310": { + "3331": { "op": "extract_uint64", "defined_out": [ "day_count_convention#0", @@ -27387,7 +27411,7 @@ "values%14#0" ] }, - "3311": { + "3332": { "op": "bytec 35 // \"rate_reset_spread\"", "defined_out": [ "\"rate_reset_spread\"", @@ -27415,7 +27439,7 @@ "\"rate_reset_spread\"" ] }, - "3313": { + "3334": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -27433,7 +27457,7 @@ "values%14#0" ] }, - "3314": { + "3335": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -27449,7 +27473,7 @@ "values%6#0" ] }, - "3315": { + "3336": { "op": "dig 3", "stack_out": [ "day_count_convention#0", @@ -27466,7 +27490,7 @@ "terms#0 (copy)" ] }, - "3317": { + "3338": { "op": "pushint 66", "defined_out": [ "66", @@ -27494,7 +27518,7 @@ "66" ] }, - "3319": { + "3340": { "op": "extract_uint64", "defined_out": [ "day_count_convention#0", @@ -27520,7 +27544,7 @@ "values%15#0" ] }, - "3320": { + "3341": { "op": "bytec 36 // \"rate_reset_multiplier\"", "defined_out": [ "\"rate_reset_multiplier\"", @@ -27548,7 +27572,7 @@ "\"rate_reset_multiplier\"" ] }, - "3322": { + "3343": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -27566,7 +27590,7 @@ "values%15#0" ] }, - "3323": { + "3344": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -27582,7 +27606,7 @@ "values%6#0" ] }, - "3324": { + "3345": { "op": "dig 3", "stack_out": [ "day_count_convention#0", @@ -27599,7 +27623,7 @@ "terms#0 (copy)" ] }, - "3326": { + "3347": { "op": "pushint 74", "defined_out": [ "74", @@ -27627,7 +27651,7 @@ "74" ] }, - "3328": { + "3349": { "op": "extract_uint64", "defined_out": [ "day_count_convention#0", @@ -27653,8 +27677,8 @@ "values%16#0" ] }, - "3329": { - "op": "bytec 30 // \"rate_reset_floor\"", + "3350": { + "op": "bytec 31 // \"rate_reset_floor\"", "defined_out": [ "\"rate_reset_floor\"", "day_count_convention#0", @@ -27681,7 +27705,7 @@ "\"rate_reset_floor\"" ] }, - "3331": { + "3352": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -27699,7 +27723,7 @@ "values%16#0" ] }, - "3332": { + "3353": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -27715,7 +27739,7 @@ "values%6#0" ] }, - "3333": { + "3354": { "op": "dig 3", "stack_out": [ "day_count_convention#0", @@ -27732,7 +27756,7 @@ "terms#0 (copy)" ] }, - "3335": { + "3356": { "op": "pushint 82", "defined_out": [ "82", @@ -27760,7 +27784,7 @@ "82" ] }, - "3337": { + "3358": { "op": "extract_uint64", "defined_out": [ "day_count_convention#0", @@ -27786,8 +27810,8 @@ "values%17#0" ] }, - "3338": { - "op": "bytec 31 // \"rate_reset_cap\"", + "3359": { + "op": "bytec 32 // \"rate_reset_cap\"", "defined_out": [ "\"rate_reset_cap\"", "day_count_convention#0", @@ -27814,7 +27838,7 @@ "\"rate_reset_cap\"" ] }, - "3340": { + "3361": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -27832,7 +27856,7 @@ "values%17#0" ] }, - "3341": { + "3362": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -27848,7 +27872,7 @@ "values%6#0" ] }, - "3342": { + "3363": { "op": "dig 3", "stack_out": [ "day_count_convention#0", @@ -27865,7 +27889,7 @@ "terms#0 (copy)" ] }, - "3344": { + "3365": { "op": "pushint 90", "defined_out": [ "90", @@ -27893,7 +27917,7 @@ "90" ] }, - "3346": { + "3367": { "op": "extract_uint64", "defined_out": [ "day_count_convention#0", @@ -27919,7 +27943,7 @@ "values%18#0" ] }, - "3347": { + "3368": { "op": "bytec 37 // \"rate_reset_next\"", "defined_out": [ "\"rate_reset_next\"", @@ -27947,7 +27971,7 @@ "\"rate_reset_next\"" ] }, - "3349": { + "3370": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -27965,7 +27989,7 @@ "values%18#0" ] }, - "3350": { + "3371": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -27981,7 +28005,7 @@ "values%6#0" ] }, - "3351": { + "3372": { "op": "dig 3", "stack_out": [ "day_count_convention#0", @@ -27998,7 +28022,7 @@ "terms#0 (copy)" ] }, - "3353": { + "3374": { "op": "pushint 784", "defined_out": [ "784", @@ -28026,7 +28050,7 @@ "784" ] }, - "3356": { + "3377": { "op": "getbit", "defined_out": [ "aggregate%get_bit%2#0", @@ -28052,7 +28076,7 @@ "aggregate%get_bit%2#0" ] }, - "3357": { + "3378": { "op": "bytec 38 // \"has_rate_reset_floor\"", "defined_out": [ "\"has_rate_reset_floor\"", @@ -28080,7 +28104,7 @@ "\"has_rate_reset_floor\"" ] }, - "3359": { + "3380": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -28098,7 +28122,7 @@ "aggregate%get_bit%2#0" ] }, - "3360": { + "3381": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -28114,7 +28138,7 @@ "values%6#0" ] }, - "3361": { + "3382": { "op": "dig 3", "stack_out": [ "day_count_convention#0", @@ -28131,7 +28155,7 @@ "terms#0 (copy)" ] }, - "3363": { + "3384": { "op": "pushint 785", "defined_out": [ "785", @@ -28159,7 +28183,7 @@ "785" ] }, - "3366": { + "3387": { "op": "getbit", "defined_out": [ "aggregate%get_bit%3#0", @@ -28185,7 +28209,7 @@ "aggregate%get_bit%3#0" ] }, - "3367": { + "3388": { "op": "bytec 39 // \"has_rate_reset_cap\"", "defined_out": [ "\"has_rate_reset_cap\"", @@ -28213,7 +28237,7 @@ "\"has_rate_reset_cap\"" ] }, - "3369": { + "3390": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -28231,7 +28255,7 @@ "aggregate%get_bit%3#0" ] }, - "3370": { + "3391": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -28247,7 +28271,7 @@ "values%6#0" ] }, - "3371": { + "3392": { "op": "uncover 3", "stack_out": [ "day_count_convention#0", @@ -28263,7 +28287,7 @@ "terms#0" ] }, - "3373": { + "3394": { "op": "pushint 99", "defined_out": [ "99", @@ -28289,7 +28313,7 @@ "99" ] }, - "3375": { + "3396": { "op": "extract_uint64", "defined_out": [ "day_count_convention#0", @@ -28314,7 +28338,7 @@ "values%21#0" ] }, - "3376": { + "3397": { "op": "bytec 5 // \"fixed_point_scale\"", "defined_out": [ "\"fixed_point_scale\"", @@ -28341,7 +28365,7 @@ "\"fixed_point_scale\"" ] }, - "3378": { + "3399": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -28358,7 +28382,7 @@ "values%21#0" ] }, - "3379": { + "3400": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -28373,7 +28397,7 @@ "values%6#0" ] }, - "3380": { + "3401": { "op": "dig 1", "stack_out": [ "day_count_convention#0", @@ -28389,7 +28413,7 @@ "initial_state#0 (copy)" ] }, - "3382": { + "3403": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -28416,7 +28440,7 @@ "8" ] }, - "3383": { + "3404": { "op": "extract_uint64", "defined_out": [ "day_count_convention#0", @@ -28441,7 +28465,7 @@ "values%22#0" ] }, - "3384": { + "3405": { "op": "bytec_2 // \"event_cursor\"", "defined_out": [ "\"event_cursor\"", @@ -28468,7 +28492,7 @@ "\"event_cursor\"" ] }, - "3385": { + "3406": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -28485,7 +28509,7 @@ "values%22#0" ] }, - "3386": { + "3407": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -28500,7 +28524,7 @@ "values%6#0" ] }, - "3387": { + "3408": { "op": "dig 1", "stack_out": [ "day_count_convention#0", @@ -28516,7 +28540,7 @@ "initial_state#0 (copy)" ] }, - "3389": { + "3410": { "op": "pushint 56", "defined_out": [ "56", @@ -28543,7 +28567,7 @@ "56" ] }, - "3391": { + "3412": { "op": "extract_uint64", "defined_out": [ "day_count_convention#0", @@ -28568,7 +28592,7 @@ "values%23#0" ] }, - "3392": { + "3413": { "op": "bytec 16 // \"cumulative_interest_index\"", "defined_out": [ "\"cumulative_interest_index\"", @@ -28595,7 +28619,7 @@ "\"cumulative_interest_index\"" ] }, - "3394": { + "3415": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -28612,7 +28636,7 @@ "values%23#0" ] }, - "3395": { + "3416": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -28627,7 +28651,7 @@ "values%6#0" ] }, - "3396": { + "3417": { "op": "dig 1", "stack_out": [ "day_count_convention#0", @@ -28643,7 +28667,7 @@ "initial_state#0 (copy)" ] }, - "3398": { + "3419": { "op": "pushint 64", "defined_out": [ "64", @@ -28670,7 +28694,7 @@ "64" ] }, - "3400": { + "3421": { "op": "extract_uint64", "defined_out": [ "day_count_convention#0", @@ -28695,7 +28719,7 @@ "values%24#0" ] }, - "3401": { + "3422": { "op": "bytec 17 // \"cumulative_principal_index\"", "defined_out": [ "\"cumulative_principal_index\"", @@ -28722,7 +28746,7 @@ "\"cumulative_principal_index\"" ] }, - "3403": { + "3424": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -28739,7 +28763,7 @@ "values%24#0" ] }, - "3404": { + "3425": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -28754,7 +28778,7 @@ "values%6#0" ] }, - "3405": { + "3426": { "op": "bytec 15 // \"reserved_interest\"", "defined_out": [ "\"reserved_interest\"", @@ -28779,7 +28803,7 @@ "\"reserved_interest\"" ] }, - "3407": { + "3428": { "op": "intc_0 // 0", "stack_out": [ "day_count_convention#0", @@ -28796,7 +28820,7 @@ "0" ] }, - "3408": { + "3429": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -28811,7 +28835,7 @@ "values%6#0" ] }, - "3409": { + "3430": { "op": "bytec 12 // \"reserved_principal\"", "defined_out": [ "\"reserved_principal\"", @@ -28836,7 +28860,7 @@ "\"reserved_principal\"" ] }, - "3411": { + "3432": { "op": "intc_0 // 0", "stack_out": [ "day_count_convention#0", @@ -28853,7 +28877,7 @@ "0" ] }, - "3412": { + "3433": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -28868,7 +28892,7 @@ "values%6#0" ] }, - "3413": { + "3434": { "op": "dig 2", "stack_out": [ "day_count_convention#0", @@ -28884,7 +28908,7 @@ "values%5#0 (copy)" ] }, - "3415": { + "3436": { "op": "global LatestTimestamp", "defined_out": [ "day_count_convention#0", @@ -28911,7 +28935,7 @@ "tmp%3#1" ] }, - "3417": { + "3438": { "op": ">", "defined_out": [ "day_count_convention#0", @@ -28936,7 +28960,7 @@ "tmp%4#1" ] }, - "3418": { + "3439": { "error": "IED must be set in the future", "op": "assert // IED must be set in the future", "stack_out": [ @@ -28952,7 +28976,7 @@ "values%6#0" ] }, - "3419": { + "3440": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -28967,7 +28991,7 @@ "initial_state#0" ] }, - "3420": { + "3441": { "op": "intc_0 // 0", "stack_out": [ "day_count_convention#0", @@ -28983,7 +29007,7 @@ "0" ] }, - "3421": { + "3442": { "op": "extract_uint64", "defined_out": [ "day_count_convention#0", @@ -29007,7 +29031,7 @@ "values%27#0" ] }, - "3422": { + "3443": { "op": "dig 2", "stack_out": [ "day_count_convention#0", @@ -29023,7 +29047,7 @@ "values%5#0 (copy)" ] }, - "3424": { + "3445": { "op": "<", "defined_out": [ "day_count_convention#0", @@ -29047,7 +29071,7 @@ "tmp%5#1" ] }, - "3425": { + "3446": { "error": "IED must be set in the future", "op": "assert // IED must be set in the future", "stack_out": [ @@ -29062,7 +29086,7 @@ "values%6#0" ] }, - "3426": { + "3447": { "op": "<", "defined_out": [ "day_count_convention#0", @@ -29082,7 +29106,7 @@ "tmp%6#0" ] }, - "3427": { + "3448": { "error": "IED must be set in the future", "op": "assert // IED must be set in the future", "stack_out": [ @@ -29095,7 +29119,7 @@ "contract_type#0" ] }, - "3428": { + "3449": { "op": "dig 2", "defined_out": [ "day_count_convention#0", @@ -29115,7 +29139,7 @@ "prospectus#0" ] }, - "3430": { + "3451": { "op": "extract 0 32", "defined_out": [ "aggregate%extract%23#0", @@ -29136,7 +29160,7 @@ "aggregate%extract%23#0" ] }, - "3433": { + "3454": { "op": "bytec 42 // \"prospectus_hash\"", "defined_out": [ "\"prospectus_hash\"", @@ -29159,7 +29183,7 @@ "\"prospectus_hash\"" ] }, - "3435": { + "3456": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -29173,7 +29197,7 @@ "aggregate%extract%23#0" ] }, - "3436": { + "3457": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -29185,7 +29209,7 @@ "contract_type#0" ] }, - "3437": { + "3458": { "op": "dig 1", "defined_out": [ "day_count_convention#0", @@ -29206,7 +29230,7 @@ "substring3%0#0" ] }, - "3439": { + "3460": { "op": "extract 2 0", "defined_out": [ "day_count_convention#0", @@ -29228,7 +29252,7 @@ "values%1#0" ] }, - "3442": { + "3463": { "op": "bytec 43 // \"prospectus_url\"", "defined_out": [ "\"prospectus_url\"", @@ -29252,7 +29276,7 @@ "\"prospectus_url\"" ] }, - "3444": { + "3465": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -29266,7 +29290,7 @@ "values%1#0" ] }, - "3445": { + "3466": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -29278,7 +29302,7 @@ "contract_type#0" ] }, - "3446": { + "3467": { "op": "global LatestTimestamp", "defined_out": [ "day_count_convention#0", @@ -29300,7 +29324,7 @@ "tmp%1#1" ] }, - "3448": { + "3469": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0", @@ -29322,7 +29346,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "3449": { + "3470": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -29346,7 +29370,7 @@ "0x151f7c75" ] }, - "3450": { + "3471": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -29360,7 +29384,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "3451": { + "3472": { "op": "concat", "defined_out": [ "day_count_convention#0", @@ -29382,7 +29406,7 @@ "tmp%5#0" ] }, - "3452": { + "3473": { "op": "log", "stack_out": [ "day_count_convention#0", @@ -29394,7 +29418,7 @@ "contract_type#0" ] }, - "3453": { + "3474": { "op": "intc_1 // 1", "stack_out": [ "day_count_convention#0", @@ -29407,7 +29431,7 @@ "1" ] }, - "3454": { + "3475": { "op": "return", "stack_out": [ "day_count_convention#0", @@ -29419,7 +29443,7 @@ "contract_type#0" ] }, - "3455": { + "3476": { "block": "contract_config_bool_false@17", "stack_in": [ "day_count_convention#0", @@ -29445,10 +29469,10 @@ "or_result%0#0" ] }, - "3456": { + "3477": { "op": "b contract_config_bool_merge@18" }, - "3459": { + "3480": { "block": "contract_config_bool_false@8", "stack_in": [ "day_count_convention#0", @@ -29474,10 +29498,10 @@ "or_result%0#0" ] }, - "3460": { + "3481": { "op": "b contract_config_bool_merge@9" }, - "3463": { + "3484": { "subroutine": "modules.actus_kernel.ActusKernelModule.contract_schedule[routing]", "params": {}, "block": "contract_schedule", @@ -29487,14 +29511,14 @@ "aggregate%array_trimmed%0#0" ] }, - "3464": { + "3485": { "op": "pushbytes \"\"", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0" ] }, - "3466": { + "3487": { "op": "dupn 2", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -29503,7 +29527,7 @@ "values%1#0" ] }, - "3468": { + "3489": { "op": "txna ApplicationArgs 1", "defined_out": [ "tmp%0#0" @@ -29516,7 +29540,7 @@ "tmp%0#0" ] }, - "3471": { + "3492": { "op": "dup", "defined_out": [ "tmp%0#0", @@ -29531,7 +29555,7 @@ "tmp%0#0 (copy)" ] }, - "3472": { + "3493": { "op": "len", "defined_out": [ "len%0#0", @@ -29546,7 +29570,7 @@ "len%0#0" ] }, - "3473": { + "3494": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -29563,7 +29587,7 @@ "8" ] }, - "3474": { + "3495": { "op": "==", "defined_out": [ "eq%0#0", @@ -29578,7 +29602,7 @@ "eq%0#0" ] }, - "3475": { + "3496": { "error": "invalid number of bytes for arc4.uint64", "op": "assert // invalid number of bytes for arc4.uint64", "stack_out": [ @@ -29589,7 +29613,7 @@ "tmp%0#0" ] }, - "3476": { + "3497": { "op": "btoi", "defined_out": [ "schedule_page_index#0" @@ -29602,7 +29626,7 @@ "schedule_page_index#0" ] }, - "3477": { + "3498": { "op": "dup", "defined_out": [ "schedule_page_index#0" @@ -29616,7 +29640,7 @@ "schedule_page_index#0" ] }, - "3478": { + "3499": { "op": "txna ApplicationArgs 2", "defined_out": [ "schedule_page_index#0", @@ -29632,7 +29656,7 @@ "tmp%2#0" ] }, - "3481": { + "3502": { "op": "dup", "defined_out": [ "schedule_page_index#0", @@ -29650,7 +29674,7 @@ "tmp%2#0 (copy)" ] }, - "3482": { + "3503": { "op": "len", "defined_out": [ "len%1#0", @@ -29668,7 +29692,7 @@ "len%1#0" ] }, - "3483": { + "3504": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -29688,7 +29712,7 @@ "1" ] }, - "3484": { + "3505": { "op": "==", "defined_out": [ "eq%1#0", @@ -29706,7 +29730,7 @@ "eq%1#0" ] }, - "3485": { + "3506": { "error": "invalid number of bytes for arc4.bool", "op": "assert // invalid number of bytes for arc4.bool", "stack_out": [ @@ -29719,7 +29743,7 @@ "tmp%2#0" ] }, - "3486": { + "3507": { "op": "intc_0 // 0", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -29732,7 +29756,7 @@ "0" ] }, - "3487": { + "3508": { "op": "getbit", "defined_out": [ "is_last_page#0", @@ -29748,7 +29772,7 @@ "is_last_page#0" ] }, - "3488": { + "3509": { "op": "swap", "defined_out": [ "is_last_page#0", @@ -29764,10 +29788,10 @@ "schedule_page_index#0" ] }, - "3489": { + "3510": { "op": "txna ApplicationArgs 3" }, - "3492": { + "3513": { "op": "dup", "defined_out": [ "is_last_page#0", @@ -29786,7 +29810,7 @@ "schedule_page#0" ] }, - "3493": { + "3514": { "op": "cover 2", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -29800,7 +29824,7 @@ "schedule_page#0" ] }, - "3495": { + "3516": { "op": "dup", "defined_out": [ "is_last_page#0", @@ -29821,7 +29845,7 @@ "schedule_page#0 (copy)" ] }, - "3496": { + "3517": { "op": "intc_0 // 0", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -29837,7 +29861,7 @@ "0" ] }, - "3497": { + "3518": { "error": "invalid array length header", "op": "extract_uint16 // on error: invalid array length header", "defined_out": [ @@ -29859,7 +29883,7 @@ "page_length#0" ] }, - "3498": { + "3519": { "op": "dup", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -29875,7 +29899,7 @@ "page_length#0" ] }, - "3499": { + "3520": { "op": "cover 3", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -29891,7 +29915,7 @@ "page_length#0" ] }, - "3501": { + "3522": { "op": "dup", "defined_out": [ "is_last_page#0", @@ -29915,7 +29939,7 @@ "page_length#0 (copy)" ] }, - "3502": { + "3523": { "op": "pushint 65", "defined_out": [ "65", @@ -29941,7 +29965,7 @@ "65" ] }, - "3504": { + "3525": { "op": "*", "defined_out": [ "is_last_page#0", @@ -29965,7 +29989,7 @@ "mul%0#0" ] }, - "3505": { + "3526": { "op": "pushint 2", "defined_out": [ "2", @@ -29991,7 +30015,7 @@ "2" ] }, - "3507": { + "3528": { "op": "+", "defined_out": [ "add%0#0", @@ -30015,7 +30039,7 @@ "add%0#0" ] }, - "3508": { + "3529": { "op": "uncover 2", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -30032,7 +30056,7 @@ "schedule_page#0" ] }, - "3510": { + "3531": { "op": "len", "defined_out": [ "add%0#0", @@ -30057,7 +30081,7 @@ "len%2#0" ] }, - "3511": { + "3532": { "op": "==", "defined_out": [ "eq%2#0", @@ -30080,7 +30104,7 @@ "eq%2#0" ] }, - "3512": { + "3533": { "error": "invalid number of bytes for arc4.dynamic_array", "op": "assert // invalid number of bytes for arc4.dynamic_array", "stack_out": [ @@ -30096,11 +30120,11 @@ "page_length#0" ] }, - "3513": { + "3534": { "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", "op": "callsub _assert_caller_is_arranger" }, - "3516": { + "3537": { "op": "intc_0 // 0", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -30116,7 +30140,7 @@ "0" ] }, - "3517": { + "3538": { "op": "bytec 10 // \"contract_type\"", "defined_out": [ "\"contract_type\"", @@ -30141,7 +30165,7 @@ "\"contract_type\"" ] }, - "3519": { + "3540": { "op": "app_global_get_ex", "defined_out": [ "contract_type#0", @@ -30166,7 +30190,7 @@ "maybe_exists%0#0" ] }, - "3520": { + "3541": { "op": "swap", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -30183,7 +30207,7 @@ "contract_type#0" ] }, - "3521": { + "3542": { "op": "cover 3", "defined_out": [ "contract_type#0", @@ -30208,7 +30232,7 @@ "maybe_exists%0#0" ] }, - "3523": { + "3544": { "error": "check self.contract_type exists", "op": "assert // check self.contract_type exists", "stack_out": [ @@ -30225,7 +30249,7 @@ "page_length#0" ] }, - "3524": { + "3545": { "op": "intc_0 // 0", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -30242,7 +30266,7 @@ "0" ] }, - "3525": { + "3546": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"", @@ -30269,7 +30293,7 @@ "\"status\"" ] }, - "3526": { + "3547": { "op": "app_global_get_ex", "defined_out": [ "contract_type#0", @@ -30296,7 +30320,7 @@ "maybe_exists%0#0" ] }, - "3527": { + "3548": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ @@ -30314,7 +30338,7 @@ "maybe_value%0#1" ] }, - "3528": { + "3549": { "op": "!", "defined_out": [ "contract_type#0", @@ -30339,7 +30363,7 @@ "tmp%0#2" ] }, - "3529": { + "3550": { "error": "D-ASA already configured", "op": "assert // D-ASA already configured", "stack_out": [ @@ -30356,7 +30380,7 @@ "page_length#0" ] }, - "3530": { + "3551": { "op": "dup", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -30373,7 +30397,7 @@ "page_length#0 (copy)" ] }, - "3531": { + "3552": { "op": "pushint 16", "defined_out": [ "16", @@ -30400,7 +30424,7 @@ "16" ] }, - "3533": { + "3554": { "op": "<=", "defined_out": [ "contract_type#0", @@ -30425,7 +30449,7 @@ "tmp%2#1" ] }, - "3534": { + "3555": { "error": "Invalid schedule page", "op": "assert // Invalid schedule page", "stack_out": [ @@ -30442,7 +30466,7 @@ "page_length#0" ] }, - "3535": { + "3556": { "op": "intc_0 // 0", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -30459,7 +30483,7 @@ "0" ] }, - "3536": { + "3557": { "op": "bytec 20 // \"initial_exchange_amount\"", "defined_out": [ "\"initial_exchange_amount\"", @@ -30486,7 +30510,7 @@ "\"initial_exchange_amount\"" ] }, - "3538": { + "3559": { "op": "app_global_get_ex", "defined_out": [ "contract_type#0", @@ -30513,7 +30537,7 @@ "maybe_exists%1#0" ] }, - "3539": { + "3560": { "error": "check self.initial_exchange_amount exists", "op": "assert // check self.initial_exchange_amount exists", "stack_out": [ @@ -30531,7 +30555,7 @@ "maybe_value%1#0" ] }, - "3540": { + "3561": { "error": "D-ASA terms not configured", "op": "assert // D-ASA terms not configured", "stack_out": [ @@ -30548,7 +30572,7 @@ "page_length#0" ] }, - "3541": { + "3562": { "op": "swap", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -30564,7 +30588,7 @@ "schedule_page_index#0" ] }, - "3542": { + "3563": { "op": "pushint 16", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -30581,7 +30605,7 @@ "16" ] }, - "3544": { + "3565": { "op": "*", "defined_out": [ "contract_type#0", @@ -30605,7 +30629,7 @@ "page_cursor#0" ] }, - "3545": { + "3566": { "op": "swap", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -30621,7 +30645,7 @@ "page_length#0" ] }, - "3546": { + "3567": { "op": "pushint 100", "defined_out": [ "100", @@ -30647,7 +30671,7 @@ "100" ] }, - "3548": { + "3569": { "op": "*", "defined_out": [ "contract_type#0", @@ -30672,7 +30696,7 @@ "tmp%6#1" ] }, - "3549": { + "3570": { "op": "intc 4 // 1500", "defined_out": [ "1500", @@ -30699,7 +30723,7 @@ "1500" ] }, - "3551": { + "3572": { "op": "+", "defined_out": [ "contract_type#0", @@ -30724,7 +30748,7 @@ "tmp%7#1" ] }, - "3552": { + "3573": { "op": "intc_0 // 0", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -30741,7 +30765,7 @@ "0" ] }, - "3553": { + "3574": { "callsub": "_puya_lib.util.ensure_budget", "op": "callsub ensure_budget", "stack_out": [ @@ -30757,7 +30781,7 @@ "page_cursor#0" ] }, - "3556": { + "3577": { "op": "intc_0 // 0", "defined_out": [ "contract_type#0", @@ -30782,7 +30806,7 @@ "index#0" ] }, - "3557": { + "3578": { "block": "contract_schedule_while_top@2", "stack_in": [ "aggregate%array_trimmed%0#0", @@ -30816,7 +30840,7 @@ "index#0" ] }, - "3558": { + "3579": { "op": "dig 4", "defined_out": [ "index#0", @@ -30838,7 +30862,7 @@ "page_length#0" ] }, - "3560": { + "3581": { "op": "<", "defined_out": [ "index#0", @@ -30860,7 +30884,7 @@ "tmp%8#0" ] }, - "3561": { + "3582": { "op": "bz contract_schedule_after_while@11", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -30876,7 +30900,7 @@ "index#0" ] }, - "3564": { + "3585": { "op": "dig 4", "defined_out": [ "index#0", @@ -30898,7 +30922,7 @@ "schedule_page#0" ] }, - "3566": { + "3587": { "op": "extract 2 0", "defined_out": [ "aggregate%array_trimmed%0#0", @@ -30921,7 +30945,7 @@ "aggregate%array_trimmed%0#0" ] }, - "3569": { + "3590": { "op": "dup", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -30939,7 +30963,7 @@ "aggregate%array_trimmed%0#0" ] }, - "3570": { + "3591": { "op": "bury 12", "defined_out": [ "aggregate%array_trimmed%0#0", @@ -30962,7 +30986,7 @@ "aggregate%array_trimmed%0#0" ] }, - "3572": { + "3593": { "op": "dig 1", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -30980,7 +31004,7 @@ "index#0" ] }, - "3574": { + "3595": { "op": "dup", "defined_out": [ "aggregate%array_trimmed%0#0", @@ -31006,7 +31030,7 @@ "index#0 (copy)" ] }, - "3575": { + "3596": { "op": "cover 2", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -31025,7 +31049,7 @@ "index#0 (copy)" ] }, - "3577": { + "3598": { "op": "pushint 65", "defined_out": [ "65", @@ -31053,7 +31077,7 @@ "65" ] }, - "3579": { + "3600": { "op": "*", "defined_out": [ "aggregate%array_trimmed%0#0", @@ -31079,7 +31103,7 @@ "aggregate%bytes_offset%0#0" ] }, - "3580": { + "3601": { "op": "pushint 65", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -31099,7 +31123,7 @@ "65" ] }, - "3582": { + "3603": { "error": "index access is out of bounds", "op": "extract3 // on error: index access is out of bounds", "defined_out": [ @@ -31125,7 +31149,7 @@ "aggregate%encoded_element%0#0" ] }, - "3583": { + "3604": { "op": "dup", "defined_out": [ "aggregate%array_trimmed%0#0", @@ -31152,7 +31176,7 @@ "aggregate%encoded_element%0#0 (copy)" ] }, - "3584": { + "3605": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -31181,7 +31205,7 @@ "8" ] }, - "3585": { + "3606": { "op": "getbyte", "defined_out": [ "aggregate%array_trimmed%0#0", @@ -31208,7 +31232,7 @@ "entry_event_type#0" ] }, - "3586": { + "3607": { "op": "dup", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -31228,7 +31252,7 @@ "entry_event_type#0 (copy)" ] }, - "3587": { + "3608": { "op": "cover 2", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -31248,7 +31272,7 @@ "entry_event_type#0" ] }, - "3589": { + "3610": { "op": "bury 13", "defined_out": [ "aggregate%array_trimmed%0#0", @@ -31275,7 +31299,7 @@ "aggregate%encoded_element%0#0" ] }, - "3591": { + "3612": { "op": "dup", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -31295,7 +31319,7 @@ "aggregate%encoded_element%0#0 (copy)" ] }, - "3592": { + "3613": { "op": "intc_0 // 0", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -31316,7 +31340,7 @@ "0" ] }, - "3593": { + "3614": { "op": "extract_uint64", "defined_out": [ "aggregate%array_trimmed%0#0", @@ -31345,7 +31369,7 @@ "values%0#0" ] }, - "3594": { + "3615": { "op": "dup", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -31366,7 +31390,7 @@ "values%0#0" ] }, - "3595": { + "3616": { "op": "bury 13", "defined_out": [ "aggregate%array_trimmed%0#0", @@ -31395,7 +31419,7 @@ "values%0#0" ] }, - "3597": { + "3618": { "op": "dig 5", "defined_out": [ "aggregate%array_trimmed%0#0", @@ -31426,7 +31450,7 @@ "page_cursor#0" ] }, - "3599": { + "3620": { "op": "uncover 4", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -31447,7 +31471,7 @@ "index#0" ] }, - "3601": { + "3622": { "op": "+", "defined_out": [ "aggregate%array_trimmed%0#0", @@ -31478,7 +31502,7 @@ "tmp%10#0" ] }, - "3602": { + "3623": { "op": "dig 1", "defined_out": [ "aggregate%array_trimmed%0#0", @@ -31511,7 +31535,7 @@ "values%0#0 (copy)" ] }, - "3604": { + "3625": { "op": "==", "defined_out": [ "aggregate%array_trimmed%0#0", @@ -31542,7 +31566,7 @@ "tmp%11#0" ] }, - "3605": { + "3626": { "error": "Invalid event id", "op": "assert // Invalid event id", "stack_out": [ @@ -31562,7 +31586,7 @@ "values%0#0" ] }, - "3606": { + "3627": { "op": "dig 5", "defined_out": [ "aggregate%array_trimmed%0#0", @@ -31593,7 +31617,7 @@ "contract_type#0" ] }, - "3608": { + "3629": { "op": "uncover 3", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -31613,7 +31637,7 @@ "entry_event_type#0" ] }, - "3610": { + "3631": { "callsub": "modules.actus_kernel.ActusKernelModule._assert_event_allowed_for_contract_type", "op": "callsub _assert_event_allowed_for_contract_type", "stack_out": [ @@ -31632,7 +31656,7 @@ "values%0#0" ] }, - "3613": { + "3634": { "op": "swap", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -31650,7 +31674,7 @@ "aggregate%encoded_element%0#0" ] }, - "3614": { + "3635": { "op": "pushint 9", "defined_out": [ "9", @@ -31681,7 +31705,7 @@ "9" ] }, - "3616": { + "3637": { "op": "extract_uint64", "defined_out": [ "aggregate%array_trimmed%0#0", @@ -31710,7 +31734,7 @@ "values%1#0" ] }, - "3617": { + "3638": { "op": "dup", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -31729,7 +31753,7 @@ "values%1#0" ] }, - "3618": { + "3639": { "op": "bury 10", "defined_out": [ "aggregate%array_trimmed%0#0", @@ -31758,7 +31782,7 @@ "values%1#0" ] }, - "3620": { + "3641": { "error": "Invalid ACTUS configuration", "op": "assert // Invalid ACTUS configuration", "stack_out": [ @@ -31776,7 +31800,7 @@ "values%0#0" ] }, - "3621": { + "3642": { "op": "bz contract_schedule_after_if_else@8", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -31792,7 +31816,7 @@ "index#0" ] }, - "3624": { + "3645": { "op": "dup", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -31809,7 +31833,7 @@ "index#0" ] }, - "3625": { + "3646": { "op": "bz contract_schedule_else_body@6", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -31825,7 +31849,7 @@ "index#0" ] }, - "3628": { + "3649": { "op": "dup", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -31842,7 +31866,7 @@ "index#0" ] }, - "3629": { + "3650": { "op": "intc_1 // 1", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -31860,7 +31884,7 @@ "1" ] }, - "3630": { + "3651": { "op": "-", "defined_out": [ "aggregate%array_trimmed%0#0", @@ -31889,7 +31913,7 @@ "tmp%15#0" ] }, - "3631": { + "3652": { "op": "pushint 65", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -31907,7 +31931,7 @@ "65" ] }, - "3633": { + "3654": { "op": "*", "defined_out": [ "aggregate%array_trimmed%0#0", @@ -31936,7 +31960,7 @@ "aggregate%bytes_offset%3#0" ] }, - "3634": { + "3655": { "op": "dig 11", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -31954,7 +31978,7 @@ "aggregate%array_trimmed%0#0" ] }, - "3636": { + "3657": { "op": "swap", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -31972,7 +31996,7 @@ "aggregate%bytes_offset%3#0" ] }, - "3637": { + "3658": { "op": "pushint 65", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -31991,7 +32015,7 @@ "65" ] }, - "3639": { + "3660": { "error": "index access is out of bounds", "op": "extract3 // on error: index access is out of bounds", "defined_out": [ @@ -32021,7 +32045,7 @@ "previous_entry#0" ] }, - "3640": { + "3661": { "block": "contract_schedule_after_if_else@7", "stack_in": [ "aggregate%array_trimmed%0#0", @@ -32058,7 +32082,7 @@ "9" ] }, - "3642": { + "3663": { "op": "extract_uint64", "defined_out": [ "values%3#0" @@ -32078,7 +32102,7 @@ "values%3#0" ] }, - "3643": { + "3664": { "op": "dig 8", "defined_out": [ "values%1#0", @@ -32100,7 +32124,7 @@ "values%1#0" ] }, - "3645": { + "3666": { "op": "<=", "defined_out": [ "tmp%22#0", @@ -32121,7 +32145,7 @@ "tmp%22#0" ] }, - "3646": { + "3667": { "error": "Time events must be sorted in strictly ascending order", "op": "assert // Time events must be sorted in strictly ascending order", "stack_out": [ @@ -32138,7 +32162,7 @@ "index#0" ] }, - "3647": { + "3668": { "block": "contract_schedule_after_if_else@8", "stack_in": [ "aggregate%array_trimmed%0#0", @@ -32172,7 +32196,7 @@ "values%0#0" ] }, - "3649": { + "3670": { "op": "bnz contract_schedule_after_if_else@10", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -32188,7 +32212,7 @@ "index#0" ] }, - "3652": { + "3673": { "op": "dig 9", "defined_out": [ "entry_event_type#0", @@ -32209,7 +32233,7 @@ "entry_event_type#0" ] }, - "3654": { + "3675": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -32232,7 +32256,7 @@ "1" ] }, - "3655": { + "3676": { "op": "==", "defined_out": [ "entry_event_type#0", @@ -32254,7 +32278,7 @@ "tmp%24#0" ] }, - "3656": { + "3677": { "error": "Invalid ACTUS configuration", "op": "assert // Invalid ACTUS configuration", "stack_out": [ @@ -32271,7 +32295,7 @@ "index#0" ] }, - "3657": { + "3678": { "block": "contract_schedule_after_if_else@10", "stack_in": [ "aggregate%array_trimmed%0#0", @@ -32305,7 +32329,7 @@ "index#0" ] }, - "3658": { + "3679": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -32327,7 +32351,7 @@ "1" ] }, - "3659": { + "3680": { "op": "+", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -32344,7 +32368,7 @@ "index#0" ] }, - "3660": { + "3681": { "op": "bury 1", "defined_out": [ "index#0" @@ -32363,10 +32387,10 @@ "index#0" ] }, - "3662": { + "3683": { "op": "b contract_schedule_while_top@2" }, - "3665": { + "3686": { "block": "contract_schedule_else_body@6", "stack_in": [ "aggregate%array_trimmed%0#0", @@ -32400,7 +32424,7 @@ "schedule_page_index#0" ] }, - "3667": { + "3688": { "op": "dup", "defined_out": [ "schedule_page_index#0", @@ -32422,7 +32446,7 @@ "schedule_page_index#0 (copy)" ] }, - "3668": { + "3689": { "error": "Invalid event id", "op": "assert // Invalid event id", "stack_out": [ @@ -32440,7 +32464,7 @@ "schedule_page_index#0" ] }, - "3669": { + "3690": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -32462,7 +32486,7 @@ "1" ] }, - "3670": { + "3691": { "op": "-", "defined_out": [ "previous_page_index#0", @@ -32483,7 +32507,7 @@ "previous_page_index#0" ] }, - "3671": { + "3692": { "op": "itob", "defined_out": [ "encoded_value%0#0", @@ -32504,7 +32528,7 @@ "encoded_value%0#0" ] }, - "3672": { + "3693": { "op": "bytec 24 // 0x5323", "defined_out": [ "0x5323", @@ -32527,7 +32551,7 @@ "0x5323" ] }, - "3674": { + "3695": { "op": "swap", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -32545,7 +32569,7 @@ "encoded_value%0#0" ] }, - "3675": { + "3696": { "op": "concat", "defined_out": [ "box_prefixed_key%0#0", @@ -32566,7 +32590,7 @@ "box_prefixed_key%0#0" ] }, - "3676": { + "3697": { "op": "dup", "defined_out": [ "box_prefixed_key%0#0", @@ -32589,7 +32613,7 @@ "box_prefixed_key%0#0 (copy)" ] }, - "3677": { + "3698": { "op": "box_len", "defined_out": [ "_%0#0", @@ -32614,7 +32638,7 @@ "maybe_exists%2#0" ] }, - "3678": { + "3699": { "op": "bury 1", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -32632,7 +32656,7 @@ "maybe_exists%2#0" ] }, - "3680": { + "3701": { "error": "Invalid schedule page", "op": "assert // Invalid schedule page", "stack_out": [ @@ -32650,7 +32674,7 @@ "box_prefixed_key%0#0" ] }, - "3681": { + "3702": { "op": "dup", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -32668,7 +32692,7 @@ "box_prefixed_key%0#0 (copy)" ] }, - "3682": { + "3703": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -32693,7 +32717,7 @@ "0" ] }, - "3683": { + "3704": { "op": "pushint 2", "defined_out": [ "0", @@ -32720,7 +32744,7 @@ "2" ] }, - "3685": { + "3706": { "op": "box_extract", "defined_out": [ "box%box_extract%0#0", @@ -32743,7 +32767,7 @@ "box%box_extract%0#0" ] }, - "3686": { + "3707": { "op": "btoi", "defined_out": [ "box%array_length%0#0", @@ -32766,7 +32790,7 @@ "box%array_length%0#0" ] }, - "3687": { + "3708": { "op": "dup", "defined_out": [ "box%array_length%0#0", @@ -32791,7 +32815,7 @@ "box%array_length%0#0 (copy)" ] }, - "3688": { + "3709": { "error": "Invalid schedule page", "op": "assert // Invalid schedule page", "stack_out": [ @@ -32810,7 +32834,7 @@ "box%array_length%0#0" ] }, - "3689": { + "3710": { "op": "intc_1 // 1", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -32829,7 +32853,7 @@ "1" ] }, - "3690": { + "3711": { "op": "-", "defined_out": [ "box_prefixed_key%0#0", @@ -32852,7 +32876,7 @@ "tmp%21#0" ] }, - "3691": { + "3712": { "op": "pushint 65", "defined_out": [ "65", @@ -32877,7 +32901,7 @@ "65" ] }, - "3693": { + "3714": { "op": "*", "defined_out": [ "box%element_offset%0#0", @@ -32900,7 +32924,7 @@ "box%element_offset%0#0" ] }, - "3694": { + "3715": { "op": "pushint 2", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -32919,7 +32943,7 @@ "2" ] }, - "3696": { + "3717": { "op": "+", "defined_out": [ "box%offset%0#0", @@ -32942,7 +32966,7 @@ "box%offset%0#0" ] }, - "3697": { + "3718": { "op": "pushint 65", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -32961,7 +32985,7 @@ "65" ] }, - "3699": { + "3720": { "op": "box_extract", "defined_out": [ "previous_entry#0", @@ -32982,10 +33006,10 @@ "previous_entry#0" ] }, - "3700": { + "3721": { "op": "b contract_schedule_after_if_else@7" }, - "3703": { + "3724": { "block": "contract_schedule_after_while@11", "stack_in": [ "aggregate%array_trimmed%0#0", @@ -33019,7 +33043,7 @@ "schedule_page_index#0" ] }, - "3705": { + "3726": { "op": "itob", "defined_out": [ "encoded_value%0#0", @@ -33040,7 +33064,7 @@ "encoded_value%0#0" ] }, - "3706": { + "3727": { "op": "bytec 24 // 0x5323", "defined_out": [ "0x5323", @@ -33063,7 +33087,7 @@ "0x5323" ] }, - "3708": { + "3729": { "op": "swap", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -33081,7 +33105,7 @@ "encoded_value%0#0" ] }, - "3709": { + "3730": { "op": "concat", "defined_out": [ "box_prefixed_key%0#0", @@ -33102,7 +33126,7 @@ "box_prefixed_key%0#0" ] }, - "3710": { + "3731": { "op": "dup", "defined_out": [ "box_prefixed_key%0#0", @@ -33125,7 +33149,7 @@ "box_prefixed_key%0#0 (copy)" ] }, - "3711": { + "3732": { "op": "box_del", "defined_out": [ "box_prefixed_key%0#0", @@ -33148,7 +33172,7 @@ "{box_del}" ] }, - "3712": { + "3733": { "op": "pop", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -33165,7 +33189,7 @@ "box_prefixed_key%0#0" ] }, - "3713": { + "3734": { "op": "dig 5", "defined_out": [ "box_prefixed_key%0#0", @@ -33188,7 +33212,7 @@ "schedule_page#0" ] }, - "3715": { + "3736": { "op": "box_put", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -33204,7 +33228,7 @@ "index#0" ] }, - "3716": { + "3737": { "op": "dig 5", "defined_out": [ "is_last_page#0", @@ -33226,7 +33250,7 @@ "is_last_page#0" ] }, - "3718": { + "3739": { "op": "bz contract_schedule_after_if_else@13", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -33242,7 +33266,7 @@ "index#0" ] }, - "3721": { + "3742": { "op": "dig 1", "defined_out": [ "is_last_page#0", @@ -33265,7 +33289,7 @@ "page_cursor#0" ] }, - "3723": { + "3744": { "op": "dig 4", "defined_out": [ "is_last_page#0", @@ -33290,7 +33314,7 @@ "page_length#0" ] }, - "3725": { + "3746": { "op": "+", "defined_out": [ "is_last_page#0", @@ -33315,7 +33339,7 @@ "tmp%27#0" ] }, - "3726": { + "3747": { "op": "bytec_3 // \"schedule_entry_count\"", "defined_out": [ "\"schedule_entry_count\"", @@ -33342,7 +33366,7 @@ "\"schedule_entry_count\"" ] }, - "3727": { + "3748": { "op": "swap", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -33360,7 +33384,7 @@ "tmp%27#0" ] }, - "3728": { + "3749": { "op": "app_global_put", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -33376,7 +33400,7 @@ "index#0" ] }, - "3729": { + "3750": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"", @@ -33401,7 +33425,7 @@ "\"status\"" ] }, - "3730": { + "3751": { "op": "pushint 50", "defined_out": [ "\"status\"", @@ -33428,7 +33452,7 @@ "50" ] }, - "3732": { + "3753": { "op": "app_global_put", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -33444,7 +33468,7 @@ "index#0" ] }, - "3733": { + "3754": { "block": "contract_schedule_after_if_else@13", "stack_in": [ "aggregate%array_trimmed%0#0", @@ -33478,7 +33502,7 @@ "tmp%0#1" ] }, - "3735": { + "3756": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0" @@ -33498,7 +33522,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "3736": { + "3757": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -33520,7 +33544,7 @@ "0x151f7c75" ] }, - "3737": { + "3758": { "op": "swap", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -33538,7 +33562,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "3738": { + "3759": { "op": "concat", "defined_out": [ "tmp%7#0" @@ -33558,7 +33582,7 @@ "tmp%7#0" ] }, - "3739": { + "3760": { "op": "log", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -33574,7 +33598,7 @@ "index#0" ] }, - "3740": { + "3761": { "op": "intc_1 // 1", "defined_out": [ "1" @@ -33594,7 +33618,7 @@ "1" ] }, - "3741": { + "3762": { "op": "return", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -33610,7 +33634,7 @@ "index#0" ] }, - "3742": { + "3763": { "subroutine": "modules.actus_kernel.ActusKernelModule.contract_execute_ied[routing]", "params": {}, "block": "contract_execute_ied", @@ -33623,7 +33647,7 @@ "0" ] }, - "3743": { + "3764": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"", @@ -33634,7 +33658,7 @@ "\"status\"" ] }, - "3744": { + "3765": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -33645,37 +33669,37 @@ "maybe_exists%0#0" ] }, - "3745": { + "3766": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ "maybe_value%0#0" ] }, - "3746": { + "3767": { "error": "D-ASA not configured", "op": "assert // D-ASA not configured", "stack_out": [] }, - "3747": { + "3768": { "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", "op": "callsub _assert_caller_is_arranger" }, - "3750": { + "3771": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", "op": "callsub _assert_is_not_asset_defaulted" }, - "3753": { + "3774": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_suspended", "op": "callsub _assert_is_not_asset_suspended" }, - "3756": { + "3777": { "op": "intc_0 // 0", "stack_out": [ "0" ] }, - "3757": { + "3778": { "op": "bytec_2 // \"event_cursor\"", "defined_out": [ "\"event_cursor\"", @@ -33686,28 +33710,28 @@ "\"event_cursor\"" ] }, - "3758": { + "3779": { "op": "app_global_get_ex", "stack_out": [ "maybe_value%0#0", "maybe_exists%0#0" ] }, - "3759": { + "3780": { "error": "check self.event_cursor exists", "op": "assert // check self.event_cursor exists", "stack_out": [ "maybe_value%0#0" ] }, - "3760": { + "3781": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#0", "0" ] }, - "3761": { + "3782": { "op": "bytec_3 // \"schedule_entry_count\"", "defined_out": [ "\"schedule_entry_count\"", @@ -33720,7 +33744,7 @@ "\"schedule_entry_count\"" ] }, - "3762": { + "3783": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%1#0", @@ -33733,7 +33757,7 @@ "maybe_exists%1#0" ] }, - "3763": { + "3784": { "error": "check self.schedule_entry_count exists", "op": "assert // check self.schedule_entry_count exists", "stack_out": [ @@ -33741,7 +33765,7 @@ "maybe_value%1#0" ] }, - "3764": { + "3785": { "op": "dig 1", "defined_out": [ "maybe_value%0#0", @@ -33754,7 +33778,7 @@ "maybe_value%0#0 (copy)" ] }, - "3766": { + "3787": { "op": ">", "defined_out": [ "maybe_value%0#0", @@ -33765,14 +33789,14 @@ "tmp%0#1" ] }, - "3767": { + "3788": { "error": "Invalid event cursor", "op": "assert // Invalid event cursor", "stack_out": [ "maybe_value%0#0" ] }, - "3768": { + "3789": { "callsub": "modules.actus_kernel.ActusKernelModule._get_schedule_entry", "op": "callsub _get_schedule_entry", "defined_out": [ @@ -33782,7 +33806,7 @@ "entry#0" ] }, - "3771": { + "3792": { "op": "dup", "defined_out": [ "entry#0", @@ -33793,7 +33817,7 @@ "entry#0 (copy)" ] }, - "3772": { + "3793": { "op": "extract 8 1", "defined_out": [ "aggregate%extract%0#0", @@ -33804,7 +33828,7 @@ "aggregate%extract%0#0" ] }, - "3775": { + "3796": { "op": "dup", "defined_out": [ "aggregate%extract%0#0", @@ -33817,7 +33841,7 @@ "aggregate%extract%0#0 (copy)" ] }, - "3776": { + "3797": { "op": "pushbytes 0x01", "defined_out": [ "0x01", @@ -33832,7 +33856,7 @@ "0x01" ] }, - "3779": { + "3800": { "op": "b==", "defined_out": [ "aggregate%extract%0#0", @@ -33845,7 +33869,7 @@ "tmp%2#1" ] }, - "3780": { + "3801": { "error": "Invalid event type", "op": "assert // Invalid event type", "stack_out": [ @@ -33853,7 +33877,7 @@ "aggregate%extract%0#0" ] }, - "3781": { + "3802": { "op": "dig 1", "stack_out": [ "entry#0", @@ -33861,7 +33885,7 @@ "entry#0 (copy)" ] }, - "3783": { + "3804": { "op": "extract 0 8", "defined_out": [ "aggregate%extract%0#0", @@ -33874,7 +33898,7 @@ "aggregate%extract%1#0" ] }, - "3786": { + "3807": { "op": "dig 2", "stack_out": [ "entry#0", @@ -33883,7 +33907,7 @@ "entry#0 (copy)" ] }, - "3788": { + "3809": { "op": "extract 9 8", "defined_out": [ "aggregate%extract%0#0", @@ -33898,7 +33922,7 @@ "aggregate%extract%2#0" ] }, - "3791": { + "3812": { "op": "dig 3", "stack_out": [ "entry#0", @@ -33908,7 +33932,7 @@ "entry#0 (copy)" ] }, - "3793": { + "3814": { "op": "extract 17 8", "defined_out": [ "aggregate%extract%0#0", @@ -33925,7 +33949,7 @@ "aggregate%extract%3#0" ] }, - "3796": { + "3817": { "op": "dig 4", "stack_out": [ "entry#0", @@ -33936,7 +33960,7 @@ "entry#0 (copy)" ] }, - "3798": { + "3819": { "op": "extract 25 8", "defined_out": [ "aggregate%extract%0#0", @@ -33955,7 +33979,7 @@ "aggregate%extract%4#0" ] }, - "3801": { + "3822": { "op": "dig 5", "stack_out": [ "entry#0", @@ -33967,7 +33991,7 @@ "entry#0 (copy)" ] }, - "3803": { + "3824": { "op": "extract 33 8", "defined_out": [ "aggregate%extract%0#0", @@ -33988,7 +34012,7 @@ "aggregate%extract%5#0" ] }, - "3806": { + "3827": { "op": "dig 6", "stack_out": [ "entry#0", @@ -34001,7 +34025,7 @@ "entry#0 (copy)" ] }, - "3808": { + "3829": { "op": "extract 41 8", "defined_out": [ "aggregate%extract%0#0", @@ -34024,7 +34048,7 @@ "aggregate%extract%6#0" ] }, - "3811": { + "3832": { "op": "dig 7", "stack_out": [ "entry#0", @@ -34038,7 +34062,7 @@ "entry#0 (copy)" ] }, - "3813": { + "3834": { "op": "extract 49 8", "defined_out": [ "aggregate%extract%0#0", @@ -34063,7 +34087,7 @@ "aggregate%extract%7#0" ] }, - "3816": { + "3837": { "op": "dig 8", "stack_out": [ "entry#0", @@ -34078,7 +34102,7 @@ "entry#0 (copy)" ] }, - "3818": { + "3839": { "op": "extract 57 8", "defined_out": [ "aggregate%extract%0#0", @@ -34105,7 +34129,7 @@ "aggregate%extract%8#0" ] }, - "3821": { + "3842": { "op": "uncover 7", "stack_out": [ "entry#0", @@ -34120,7 +34144,7 @@ "aggregate%extract%1#0" ] }, - "3823": { + "3844": { "op": "uncover 8", "stack_out": [ "entry#0", @@ -34135,7 +34159,7 @@ "aggregate%extract%0#0" ] }, - "3825": { + "3846": { "op": "concat", "defined_out": [ "aggregate%extract%2#0", @@ -34160,7 +34184,7 @@ "aggregate%head%1#0" ] }, - "3826": { + "3847": { "op": "uncover 7", "stack_out": [ "entry#0", @@ -34174,7 +34198,7 @@ "aggregate%extract%2#0" ] }, - "3828": { + "3849": { "op": "concat", "defined_out": [ "aggregate%extract%3#0", @@ -34197,7 +34221,7 @@ "aggregate%head%2#0" ] }, - "3829": { + "3850": { "op": "uncover 6", "stack_out": [ "entry#0", @@ -34210,7 +34234,7 @@ "aggregate%extract%3#0" ] }, - "3831": { + "3852": { "op": "concat", "defined_out": [ "aggregate%extract%4#0", @@ -34231,7 +34255,7 @@ "aggregate%head%3#0" ] }, - "3832": { + "3853": { "op": "uncover 5", "stack_out": [ "entry#0", @@ -34243,7 +34267,7 @@ "aggregate%extract%4#0" ] }, - "3834": { + "3855": { "op": "concat", "defined_out": [ "aggregate%extract%5#0", @@ -34262,7 +34286,7 @@ "aggregate%head%4#0" ] }, - "3835": { + "3856": { "op": "intc_0 // 0", "stack_out": [ "entry#0", @@ -34274,7 +34298,7 @@ "0" ] }, - "3836": { + "3857": { "op": "itob", "defined_out": [ "aggregate%extract%5#0", @@ -34295,7 +34319,7 @@ "aggregate%val_as_bytes%4#0" ] }, - "3837": { + "3858": { "op": "concat", "defined_out": [ "aggregate%extract%5#0", @@ -34314,7 +34338,7 @@ "aggregate%head%5#0" ] }, - "3838": { + "3859": { "op": "uncover 4", "stack_out": [ "entry#0", @@ -34325,7 +34349,7 @@ "aggregate%extract%5#0" ] }, - "3840": { + "3861": { "op": "concat", "defined_out": [ "aggregate%extract%6#0", @@ -34342,7 +34366,7 @@ "aggregate%head%6#0" ] }, - "3841": { + "3862": { "op": "uncover 3", "stack_out": [ "entry#0", @@ -34352,7 +34376,7 @@ "aggregate%extract%6#0" ] }, - "3843": { + "3864": { "op": "concat", "defined_out": [ "aggregate%extract%7#0", @@ -34367,7 +34391,7 @@ "aggregate%head%7#0" ] }, - "3844": { + "3865": { "op": "uncover 2", "stack_out": [ "entry#0", @@ -34376,7 +34400,7 @@ "aggregate%extract%7#0" ] }, - "3846": { + "3867": { "op": "concat", "defined_out": [ "aggregate%extract%8#0", @@ -34389,7 +34413,7 @@ "aggregate%head%8#0" ] }, - "3847": { + "3868": { "op": "swap", "stack_out": [ "entry#0", @@ -34397,7 +34421,7 @@ "aggregate%extract%8#0" ] }, - "3848": { + "3869": { "op": "concat", "defined_out": [ "aggregate%head%9#0", @@ -34408,7 +34432,7 @@ "aggregate%head%9#0" ] }, - "3849": { + "3870": { "callsub": "modules.actus_kernel.ActusKernelModule._apply_non_cash_schedule_entry", "op": "callsub _apply_non_cash_schedule_entry", "defined_out": [ @@ -34420,11 +34444,11 @@ "_apply_non_cash_schedule_entry%1#0" ] }, - "3852": { + "3873": { "op": "popn 2", "stack_out": [] }, - "3854": { + "3875": { "op": "global LatestTimestamp", "defined_out": [ "tmp%4#0" @@ -34433,7 +34457,7 @@ "tmp%4#0" ] }, - "3856": { + "3877": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%9#0" @@ -34442,7 +34466,7 @@ "aggregate%val_as_bytes%9#0" ] }, - "3857": { + "3878": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -34453,14 +34477,14 @@ "0x151f7c75" ] }, - "3858": { + "3879": { "op": "swap", "stack_out": [ "0x151f7c75", "aggregate%val_as_bytes%9#0" ] }, - "3859": { + "3880": { "op": "concat", "defined_out": [ "tmp%2#0" @@ -34469,11 +34493,11 @@ "tmp%2#0" ] }, - "3860": { + "3881": { "op": "log", "stack_out": [] }, - "3861": { + "3882": { "op": "intc_1 // 1", "defined_out": [ "1" @@ -34482,11 +34506,11 @@ "1" ] }, - "3862": { + "3883": { "op": "return", "stack_out": [] }, - "3863": { + "3884": { "subroutine": "modules.actus_kernel.ActusKernelModule.apply_non_cash_event[routing]", "params": {}, "block": "apply_non_cash_event", @@ -34496,7 +34520,7 @@ "aggregate%extract%2#0" ] }, - "3864": { + "3885": { "op": "dupn 4", "stack_out": [ "aggregate%extract%2#0", @@ -34506,7 +34530,7 @@ "page#0" ] }, - "3866": { + "3887": { "op": "pushbytes \"\"", "stack_out": [ "aggregate%extract%2#0", @@ -34517,7 +34541,7 @@ "event_type#0" ] }, - "3868": { + "3889": { "op": "dup", "stack_out": [ "aggregate%extract%2#0", @@ -34529,7 +34553,7 @@ "values%0#1" ] }, - "3869": { + "3890": { "op": "txna ApplicationArgs 1", "defined_out": [ "tmp%0#0" @@ -34545,7 +34569,7 @@ "tmp%0#0" ] }, - "3872": { + "3893": { "op": "dup", "defined_out": [ "tmp%0#0", @@ -34563,7 +34587,7 @@ "tmp%0#0 (copy)" ] }, - "3873": { + "3894": { "op": "len", "defined_out": [ "len%0#0", @@ -34581,7 +34605,7 @@ "len%0#0" ] }, - "3874": { + "3895": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -34601,7 +34625,7 @@ "8" ] }, - "3875": { + "3896": { "op": "==", "defined_out": [ "eq%0#0", @@ -34619,7 +34643,7 @@ "eq%0#0" ] }, - "3876": { + "3897": { "error": "invalid number of bytes for arc4.uint64", "op": "assert // invalid number of bytes for arc4.uint64", "stack_out": [ @@ -34633,7 +34657,7 @@ "tmp%0#0" ] }, - "3877": { + "3898": { "op": "btoi", "defined_out": [ "event_id#0" @@ -34649,10 +34673,10 @@ "event_id#0" ] }, - "3878": { + "3899": { "op": "txna ApplicationArgs 2" }, - "3881": { + "3902": { "op": "dupn 2", "defined_out": [ "event_id#0", @@ -34673,7 +34697,7 @@ "payload#0 (copy)" ] }, - "3883": { + "3904": { "op": "len", "defined_out": [ "event_id#0", @@ -34694,7 +34718,7 @@ "len%1#0" ] }, - "3884": { + "3905": { "op": "pushint 73", "defined_out": [ "73", @@ -34717,7 +34741,7 @@ "73" ] }, - "3886": { + "3907": { "op": "==", "defined_out": [ "eq%1#0", @@ -34738,7 +34762,7 @@ "eq%1#0" ] }, - "3887": { + "3908": { "error": "invalid number of bytes for smart_contracts.abi_types.ObservedEventRequest", "op": "assert // invalid number of bytes for smart_contracts.abi_types.ObservedEventRequest", "stack_out": [ @@ -34754,7 +34778,7 @@ "payload#0" ] }, - "3888": { + "3909": { "op": "intc_0 // 0", "stack_out": [ "aggregate%extract%2#0", @@ -34770,7 +34794,7 @@ "0" ] }, - "3889": { + "3910": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"", @@ -34793,7 +34817,7 @@ "\"status\"" ] }, - "3890": { + "3911": { "op": "app_global_get_ex", "defined_out": [ "event_id#0", @@ -34816,7 +34840,7 @@ "maybe_exists%0#0" ] }, - "3891": { + "3912": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ @@ -34833,7 +34857,7 @@ "maybe_value%0#0" ] }, - "3892": { + "3913": { "error": "D-ASA not configured", "op": "assert // D-ASA not configured", "stack_out": [ @@ -34849,15 +34873,15 @@ "payload#0" ] }, - "3893": { + "3914": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", "op": "callsub _assert_is_not_asset_defaulted" }, - "3896": { + "3917": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_suspended", "op": "callsub _assert_is_not_asset_suspended" }, - "3899": { + "3920": { "op": "pushint 65", "defined_out": [ "65", @@ -34878,7 +34902,7 @@ "65" ] }, - "3901": { + "3922": { "op": "extract_uint64", "defined_out": [ "event_id#0", @@ -34898,7 +34922,7 @@ "values%0#0" ] }, - "3902": { + "3923": { "op": "dup", "defined_out": [ "event_id#0", @@ -34919,7 +34943,7 @@ "values%0#0" ] }, - "3903": { + "3924": { "op": "pushint 4", "defined_out": [ "4", @@ -34942,7 +34966,7 @@ "4" ] }, - "3905": { + "3926": { "op": "&", "defined_out": [ "event_id#0", @@ -34964,7 +34988,7 @@ "tmp%0#1" ] }, - "3906": { + "3927": { "op": "bz apply_non_cash_event_after_if_else@3", "stack_out": [ "aggregate%extract%2#0", @@ -34979,7 +35003,7 @@ "values%0#0" ] }, - "3909": { + "3930": { "op": "intc_0 // 0", "stack_out": [ "aggregate%extract%2#0", @@ -34995,7 +35019,7 @@ "0" ] }, - "3910": { + "3931": { "op": "bytec 10 // \"contract_type\"", "defined_out": [ "\"contract_type\"", @@ -35019,7 +35043,7 @@ "\"contract_type\"" ] }, - "3912": { + "3933": { "op": "app_global_get_ex", "stack_out": [ "aggregate%extract%2#0", @@ -35036,7 +35060,7 @@ "maybe_exists%0#0" ] }, - "3913": { + "3934": { "error": "check self.contract_type exists", "op": "assert // check self.contract_type exists", "stack_out": [ @@ -35053,7 +35077,7 @@ "maybe_value%0#0" ] }, - "3914": { + "3935": { "op": "pushint 5", "defined_out": [ "5", @@ -35077,7 +35101,7 @@ "5" ] }, - "3916": { + "3937": { "op": "==", "defined_out": [ "event_id#0", @@ -35099,7 +35123,7 @@ "tmp%0#3" ] }, - "3917": { + "3938": { "error": "Observed event required to execute this action", "op": "assert // Observed event required to execute this action", "stack_out": [ @@ -35115,11 +35139,11 @@ "values%0#0" ] }, - "3918": { + "3939": { "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", "op": "callsub _assert_caller_is_arranger" }, - "3921": { + "3942": { "op": "intc_0 // 0", "stack_out": [ "aggregate%extract%2#0", @@ -35135,7 +35159,7 @@ "0" ] }, - "3922": { + "3943": { "op": "bytec 10 // \"contract_type\"", "stack_out": [ "aggregate%extract%2#0", @@ -35152,7 +35176,7 @@ "\"contract_type\"" ] }, - "3924": { + "3945": { "op": "app_global_get_ex", "stack_out": [ "aggregate%extract%2#0", @@ -35169,7 +35193,7 @@ "maybe_exists%0#0" ] }, - "3925": { + "3946": { "error": "check self.contract_type exists", "op": "assert // check self.contract_type exists", "stack_out": [ @@ -35186,7 +35210,7 @@ "maybe_value%0#0" ] }, - "3926": { + "3947": { "op": "dup", "defined_out": [ "event_id#0", @@ -35210,7 +35234,7 @@ "maybe_value%0#0 (copy)" ] }, - "3927": { + "3948": { "op": "pushint 5", "stack_out": [ "aggregate%extract%2#0", @@ -35228,7 +35252,7 @@ "5" ] }, - "3929": { + "3950": { "op": "==", "stack_out": [ "aggregate%extract%2#0", @@ -35245,7 +35269,7 @@ "tmp%0#3" ] }, - "3930": { + "3951": { "error": "Observed event required to execute this action", "op": "assert // Observed event required to execute this action", "stack_out": [ @@ -35262,7 +35286,7 @@ "maybe_value%0#0" ] }, - "3931": { + "3952": { "op": "dig 2", "stack_out": [ "aggregate%extract%2#0", @@ -35279,7 +35303,7 @@ "payload#0" ] }, - "3933": { + "3954": { "op": "dup", "stack_out": [ "aggregate%extract%2#0", @@ -35297,7 +35321,7 @@ "payload#0 (copy)" ] }, - "3934": { + "3955": { "op": "intc_0 // 0", "stack_out": [ "aggregate%extract%2#0", @@ -35316,7 +35340,7 @@ "0" ] }, - "3935": { + "3956": { "op": "extract_uint64", "defined_out": [ "event_id#0", @@ -35341,7 +35365,7 @@ "values%0#1" ] }, - "3936": { + "3957": { "op": "dup", "stack_out": [ "aggregate%extract%2#0", @@ -35360,7 +35384,7 @@ "values%0#1" ] }, - "3937": { + "3958": { "op": "bury 7", "defined_out": [ "event_id#0", @@ -35385,7 +35409,7 @@ "values%0#1" ] }, - "3939": { + "3960": { "op": "intc_0 // 0", "stack_out": [ "aggregate%extract%2#0", @@ -35404,7 +35428,7 @@ "0" ] }, - "3940": { + "3961": { "op": "bytec_3 // \"schedule_entry_count\"", "defined_out": [ "\"schedule_entry_count\"", @@ -35433,7 +35457,7 @@ "\"schedule_entry_count\"" ] }, - "3941": { + "3962": { "op": "app_global_get_ex", "defined_out": [ "event_id#0", @@ -35462,7 +35486,7 @@ "maybe_exists%0#0" ] }, - "3942": { + "3963": { "error": "check self.schedule_entry_count exists", "op": "assert // check self.schedule_entry_count exists", "stack_out": [ @@ -35482,7 +35506,7 @@ "maybe_value%0#1" ] }, - "3943": { + "3964": { "op": "==", "defined_out": [ "event_id#0", @@ -35508,7 +35532,7 @@ "tmp%1#2" ] }, - "3944": { + "3965": { "error": "Invalid event id", "op": "assert // Invalid event id", "stack_out": [ @@ -35526,7 +35550,7 @@ "payload#0" ] }, - "3945": { + "3966": { "op": "dup", "stack_out": [ "aggregate%extract%2#0", @@ -35544,7 +35568,7 @@ "payload#0 (copy)" ] }, - "3946": { + "3967": { "op": "extract 8 1", "defined_out": [ "aggregate%extract%2#0", @@ -35570,7 +35594,7 @@ "aggregate%extract%2#0" ] }, - "3949": { + "3970": { "op": "bury 12", "defined_out": [ "aggregate%extract%2#0", @@ -35595,7 +35619,7 @@ "payload#0" ] }, - "3951": { + "3972": { "op": "intc_2 // 8", "stack_out": [ "aggregate%extract%2#0", @@ -35613,7 +35637,7 @@ "8" ] }, - "3952": { + "3973": { "op": "getbyte", "defined_out": [ "aggregate%extract%2#0", @@ -35639,7 +35663,7 @@ "tmp%2#3" ] }, - "3953": { + "3974": { "callsub": "modules.actus_kernel.ActusKernelModule._assert_event_allowed_for_contract_type", "op": "callsub _assert_event_allowed_for_contract_type", "stack_out": [ @@ -35655,7 +35679,7 @@ "values%0#0" ] }, - "3956": { + "3977": { "op": "intc_0 // 0", "stack_out": [ "aggregate%extract%2#0", @@ -35671,7 +35695,7 @@ "0" ] }, - "3957": { + "3978": { "op": "bytec_3 // \"schedule_entry_count\"", "stack_out": [ "aggregate%extract%2#0", @@ -35688,7 +35712,7 @@ "\"schedule_entry_count\"" ] }, - "3958": { + "3979": { "op": "app_global_get_ex", "defined_out": [ "aggregate%extract%2#0", @@ -35714,7 +35738,7 @@ "maybe_exists%2#0" ] }, - "3959": { + "3980": { "error": "check self.schedule_entry_count exists", "op": "assert // check self.schedule_entry_count exists", "stack_out": [ @@ -35731,7 +35755,7 @@ "event_id#1" ] }, - "3960": { + "3981": { "op": "pushint 16", "defined_out": [ "16", @@ -35757,7 +35781,7 @@ "16" ] }, - "3962": { + "3983": { "op": "/", "defined_out": [ "aggregate%extract%2#0", @@ -35781,8 +35805,8 @@ "page_index#0" ] }, - "3963": { - "op": "bytec 48 // 0x0000", + "3984": { + "op": "bytec 49 // 0x0000", "defined_out": [ "aggregate%extract%2#0", "event_id#0", @@ -35807,7 +35831,7 @@ "page#0" ] }, - "3965": { + "3986": { "op": "bury 7", "stack_out": [ "aggregate%extract%2#0", @@ -35823,7 +35847,7 @@ "page_index#0" ] }, - "3967": { + "3988": { "op": "itob", "defined_out": [ "aggregate%extract%2#0", @@ -35848,7 +35872,7 @@ "encoded_value%0#0" ] }, - "3968": { + "3989": { "op": "bytec 24 // 0x5323", "defined_out": [ "0x5323", @@ -35875,7 +35899,7 @@ "0x5323" ] }, - "3970": { + "3991": { "op": "swap", "stack_out": [ "aggregate%extract%2#0", @@ -35892,7 +35916,7 @@ "encoded_value%0#0" ] }, - "3971": { + "3992": { "op": "concat", "defined_out": [ "aggregate%extract%2#0", @@ -35917,7 +35941,7 @@ "box_prefixed_key%0#0" ] }, - "3972": { + "3993": { "op": "dup", "stack_out": [ "aggregate%extract%2#0", @@ -35934,7 +35958,7 @@ "box_prefixed_key%0#0" ] }, - "3973": { + "3994": { "op": "bury 9", "defined_out": [ "aggregate%extract%2#0", @@ -35959,7 +35983,7 @@ "box_prefixed_key%0#0" ] }, - "3975": { + "3996": { "op": "box_len", "defined_out": [ "_%0#0", @@ -35987,7 +36011,7 @@ "maybe_exists%3#0" ] }, - "3976": { + "3997": { "op": "bury 1", "stack_out": [ "aggregate%extract%2#0", @@ -36003,7 +36027,7 @@ "maybe_exists%3#0" ] }, - "3978": { + "3999": { "op": "bz apply_non_cash_event_after_if_else@27", "stack_out": [ "aggregate%extract%2#0", @@ -36018,7 +36042,7 @@ "values%0#0" ] }, - "3981": { + "4002": { "op": "dig 7", "stack_out": [ "aggregate%extract%2#0", @@ -36034,7 +36058,7 @@ "box_prefixed_key%0#0" ] }, - "3983": { + "4004": { "op": "box_get", "defined_out": [ "aggregate%box_get%1#0", @@ -36061,7 +36085,7 @@ "aggregate%box_get%1#0" ] }, - "3984": { + "4005": { "op": "swap", "stack_out": [ "aggregate%extract%2#0", @@ -36078,7 +36102,7 @@ "page#0" ] }, - "3985": { + "4006": { "op": "bury 7", "stack_out": [ "aggregate%extract%2#0", @@ -36094,7 +36118,7 @@ "aggregate%box_get%1#0" ] }, - "3987": { + "4008": { "error": "check self.schedule_page entry exists", "op": "assert // check self.schedule_page entry exists", "stack_out": [ @@ -36110,7 +36134,7 @@ "values%0#0" ] }, - "3988": { + "4009": { "block": "apply_non_cash_event_after_if_else@27", "stack_in": [ "aggregate%extract%2#0", @@ -36142,7 +36166,7 @@ "page#0" ] }, - "3990": { + "4011": { "op": "dup", "defined_out": [ "page#0", @@ -36163,7 +36187,7 @@ "page#0 (copy)" ] }, - "3991": { + "4012": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -36186,7 +36210,7 @@ "0" ] }, - "3992": { + "4013": { "error": "invalid array length header", "op": "extract_uint16 // on error: invalid array length header", "defined_out": [ @@ -36208,7 +36232,7 @@ "aggregate%array_length%0#0" ] }, - "3993": { + "4014": { "op": "dup", "defined_out": [ "aggregate%array_length%0#0", @@ -36231,7 +36255,7 @@ "aggregate%array_length%0#0 (copy)" ] }, - "3994": { + "4015": { "op": "pushint 16", "defined_out": [ "16", @@ -36256,7 +36280,7 @@ "16" ] }, - "3996": { + "4017": { "op": "<", "defined_out": [ "aggregate%array_length%0#0", @@ -36279,7 +36303,7 @@ "tmp%5#2" ] }, - "3997": { + "4018": { "error": "Invalid schedule page", "op": "assert // Invalid schedule page", "stack_out": [ @@ -36297,7 +36321,7 @@ "aggregate%array_length%0#0" ] }, - "3998": { + "4019": { "op": "dig 3", "defined_out": [ "aggregate%array_length%0#0", @@ -36320,7 +36344,7 @@ "payload#0" ] }, - "4000": { + "4021": { "op": "dup", "defined_out": [ "aggregate%array_length%0#0", @@ -36345,7 +36369,7 @@ "payload#0 (copy)" ] }, - "4001": { + "4022": { "op": "extract 9 8", "defined_out": [ "aggregate%array_length%0#0", @@ -36370,7 +36394,7 @@ "aggregate%extract%3#0" ] }, - "4004": { + "4025": { "op": "dig 1", "stack_out": [ "aggregate%extract%2#0", @@ -36390,7 +36414,7 @@ "payload#0 (copy)" ] }, - "4006": { + "4027": { "op": "extract 17 8", "defined_out": [ "aggregate%array_length%0#0", @@ -36417,7 +36441,7 @@ "aggregate%extract%4#0" ] }, - "4009": { + "4030": { "op": "dig 2", "stack_out": [ "aggregate%extract%2#0", @@ -36438,7 +36462,7 @@ "payload#0 (copy)" ] }, - "4011": { + "4032": { "op": "extract 25 8", "defined_out": [ "aggregate%array_length%0#0", @@ -36467,7 +36491,7 @@ "aggregate%extract%5#0" ] }, - "4014": { + "4035": { "op": "dig 3", "stack_out": [ "aggregate%extract%2#0", @@ -36489,7 +36513,7 @@ "payload#0 (copy)" ] }, - "4016": { + "4037": { "op": "extract 41 8", "defined_out": [ "aggregate%array_length%0#0", @@ -36520,7 +36544,7 @@ "aggregate%extract%6#0" ] }, - "4019": { + "4040": { "op": "dig 4", "stack_out": [ "aggregate%extract%2#0", @@ -36543,7 +36567,7 @@ "payload#0 (copy)" ] }, - "4021": { + "4042": { "op": "extract 49 8", "defined_out": [ "aggregate%array_length%0#0", @@ -36576,7 +36600,7 @@ "aggregate%extract%7#0" ] }, - "4024": { + "4045": { "op": "uncover 5", "stack_out": [ "aggregate%extract%2#0", @@ -36599,7 +36623,7 @@ "payload#0" ] }, - "4026": { + "4047": { "op": "extract 57 8", "defined_out": [ "aggregate%array_length%0#0", @@ -36633,7 +36657,7 @@ "aggregate%extract%8#0" ] }, - "4029": { + "4050": { "op": "dig 11", "defined_out": [ "aggregate%array_length%0#0", @@ -36669,7 +36693,7 @@ "values%0#1" ] }, - "4031": { + "4052": { "op": "itob", "defined_out": [ "aggregate%array_length%0#0", @@ -36706,7 +36730,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "4032": { + "4053": { "op": "dig 18", "defined_out": [ "aggregate%array_length%0#0", @@ -36745,7 +36769,7 @@ "aggregate%extract%2#0" ] }, - "4034": { + "4055": { "op": "concat", "defined_out": [ "aggregate%array_length%0#0", @@ -36783,7 +36807,7 @@ "aggregate%head%1#0" ] }, - "4035": { + "4056": { "op": "uncover 6", "stack_out": [ "aggregate%extract%2#0", @@ -36807,7 +36831,7 @@ "aggregate%extract%3#0" ] }, - "4037": { + "4058": { "op": "concat", "defined_out": [ "aggregate%array_length%0#0", @@ -36843,7 +36867,7 @@ "aggregate%head%2#0" ] }, - "4038": { + "4059": { "op": "uncover 5", "stack_out": [ "aggregate%extract%2#0", @@ -36866,7 +36890,7 @@ "aggregate%extract%4#0" ] }, - "4040": { + "4061": { "op": "concat", "defined_out": [ "aggregate%array_length%0#0", @@ -36900,7 +36924,7 @@ "aggregate%head%3#0" ] }, - "4041": { + "4062": { "op": "uncover 4", "stack_out": [ "aggregate%extract%2#0", @@ -36922,7 +36946,7 @@ "aggregate%extract%5#0" ] }, - "4043": { + "4064": { "op": "concat", "defined_out": [ "aggregate%array_length%0#0", @@ -36954,7 +36978,7 @@ "aggregate%head%4#0" ] }, - "4044": { + "4065": { "op": "uncover 3", "stack_out": [ "aggregate%extract%2#0", @@ -36975,7 +36999,7 @@ "aggregate%extract%6#0" ] }, - "4046": { + "4067": { "op": "concat", "defined_out": [ "aggregate%array_length%0#0", @@ -37005,7 +37029,7 @@ "aggregate%head%5#0" ] }, - "4047": { + "4068": { "op": "uncover 2", "stack_out": [ "aggregate%extract%2#0", @@ -37025,7 +37049,7 @@ "aggregate%extract%7#0" ] }, - "4049": { + "4070": { "op": "concat", "defined_out": [ "aggregate%array_length%0#0", @@ -37053,7 +37077,7 @@ "aggregate%head%6#0" ] }, - "4050": { + "4071": { "op": "swap", "stack_out": [ "aggregate%extract%2#0", @@ -37072,7 +37096,7 @@ "aggregate%extract%8#0" ] }, - "4051": { + "4072": { "op": "concat", "defined_out": [ "aggregate%array_length%0#0", @@ -37098,7 +37122,7 @@ "aggregate%head%7#0" ] }, - "4052": { + "4073": { "op": "dig 3", "defined_out": [ "aggregate%array_length%0#0", @@ -37126,7 +37150,7 @@ "values%0#0" ] }, - "4054": { + "4075": { "op": "itob", "defined_out": [ "aggregate%array_length%0#0", @@ -37155,7 +37179,7 @@ "aggregate%val_as_bytes%7#0" ] }, - "4055": { + "4076": { "op": "concat", "defined_out": [ "aggregate%array_length%0#0", @@ -37182,7 +37206,7 @@ "aggregate%head%8#0" ] }, - "4056": { + "4077": { "op": "uncover 2", "stack_out": [ "aggregate%extract%2#0", @@ -37200,7 +37224,7 @@ "page#0" ] }, - "4058": { + "4079": { "op": "swap", "stack_out": [ "aggregate%extract%2#0", @@ -37218,7 +37242,7 @@ "aggregate%head%8#0" ] }, - "4059": { + "4080": { "error": "max array length exceeded", "op": "concat // on error: max array length exceeded", "defined_out": [ @@ -37245,7 +37269,7 @@ "concat%0#0" ] }, - "4060": { + "4081": { "op": "swap", "stack_out": [ "aggregate%extract%2#0", @@ -37262,7 +37286,7 @@ "aggregate%array_length%0#0" ] }, - "4061": { + "4082": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -37290,7 +37314,7 @@ "1" ] }, - "4062": { + "4083": { "op": "+", "defined_out": [ "add%0#0", @@ -37316,7 +37340,7 @@ "add%0#0" ] }, - "4063": { + "4084": { "op": "itob", "defined_out": [ "aggregate%extract%2#0", @@ -37342,7 +37366,7 @@ "as_bytes%0#0" ] }, - "4064": { + "4085": { "op": "extract 6 2", "defined_out": [ "aggregate%extract%2#0", @@ -37368,7 +37392,7 @@ "as_u16_bytes%0#0" ] }, - "4067": { + "4088": { "op": "replace2 0", "stack_out": [ "aggregate%extract%2#0", @@ -37384,7 +37408,7 @@ "page#0" ] }, - "4069": { + "4090": { "op": "dig 8", "defined_out": [ "aggregate%extract%2#0", @@ -37409,7 +37433,7 @@ "box_prefixed_key%0#0" ] }, - "4071": { + "4092": { "op": "dup", "defined_out": [ "aggregate%extract%2#0", @@ -37436,7 +37460,7 @@ "box_prefixed_key%0#0 (copy)" ] }, - "4072": { + "4093": { "op": "box_del", "defined_out": [ "aggregate%extract%2#0", @@ -37463,7 +37487,7 @@ "{box_del}" ] }, - "4073": { + "4094": { "op": "pop", "stack_out": [ "aggregate%extract%2#0", @@ -37480,7 +37504,7 @@ "box_prefixed_key%0#0" ] }, - "4074": { + "4095": { "op": "swap", "stack_out": [ "aggregate%extract%2#0", @@ -37497,7 +37521,7 @@ "page#0" ] }, - "4075": { + "4096": { "op": "box_put", "stack_out": [ "aggregate%extract%2#0", @@ -37512,7 +37536,7 @@ "values%0#0" ] }, - "4076": { + "4097": { "op": "intc_0 // 0", "stack_out": [ "aggregate%extract%2#0", @@ -37528,7 +37552,7 @@ "0" ] }, - "4077": { + "4098": { "op": "bytec_3 // \"schedule_entry_count\"", "defined_out": [ "\"schedule_entry_count\"", @@ -37555,7 +37579,7 @@ "\"schedule_entry_count\"" ] }, - "4078": { + "4099": { "op": "app_global_get_ex", "defined_out": [ "aggregate%extract%2#0", @@ -37582,7 +37606,7 @@ "maybe_exists%4#0" ] }, - "4079": { + "4100": { "error": "check self.schedule_entry_count exists", "op": "assert // check self.schedule_entry_count exists", "stack_out": [ @@ -37599,7 +37623,7 @@ "maybe_value%3#0" ] }, - "4080": { + "4101": { "op": "intc_1 // 1", "stack_out": [ "aggregate%extract%2#0", @@ -37616,7 +37640,7 @@ "1" ] }, - "4081": { + "4102": { "op": "+", "defined_out": [ "aggregate%extract%2#0", @@ -37641,7 +37665,7 @@ "tmp%8#0" ] }, - "4082": { + "4103": { "op": "bytec_3 // \"schedule_entry_count\"", "stack_out": [ "aggregate%extract%2#0", @@ -37658,7 +37682,7 @@ "\"schedule_entry_count\"" ] }, - "4083": { + "4104": { "op": "swap", "stack_out": [ "aggregate%extract%2#0", @@ -37675,7 +37699,7 @@ "tmp%8#0" ] }, - "4084": { + "4105": { "op": "app_global_put", "stack_out": [ "aggregate%extract%2#0", @@ -37690,7 +37714,7 @@ "values%0#0" ] }, - "4085": { + "4106": { "block": "apply_non_cash_event_after_if_else@3", "stack_in": [ "aggregate%extract%2#0", @@ -37722,7 +37746,7 @@ "0" ] }, - "4086": { + "4107": { "op": "bytec_2 // \"event_cursor\"", "defined_out": [ "\"event_cursor\"", @@ -37743,7 +37767,7 @@ "\"event_cursor\"" ] }, - "4087": { + "4108": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -37764,7 +37788,7 @@ "maybe_exists%0#0" ] }, - "4088": { + "4109": { "error": "check self.event_cursor exists", "op": "assert // check self.event_cursor exists", "stack_out": [ @@ -37781,7 +37805,7 @@ "maybe_value%0#0" ] }, - "4089": { + "4110": { "op": "dig 3", "defined_out": [ "event_id#0", @@ -37802,10 +37826,10 @@ "event_id#0" ] }, - "4091": { + "4112": { "op": "dup" }, - "4092": { + "4113": { "op": "uncover 2", "defined_out": [ "event_id#0", @@ -37828,7 +37852,7 @@ "maybe_value%0#0" ] }, - "4094": { + "4115": { "op": "==", "defined_out": [ "event_id#0", @@ -37849,7 +37873,7 @@ "tmp%3#1" ] }, - "4095": { + "4116": { "error": "Invalid event cursor", "op": "assert // Invalid event cursor", "stack_out": [ @@ -37866,7 +37890,7 @@ "event_id#0" ] }, - "4096": { + "4117": { "callsub": "modules.actus_kernel.ActusKernelModule._get_schedule_entry", "op": "callsub _get_schedule_entry", "defined_out": [ @@ -37887,7 +37911,7 @@ "entry#0" ] }, - "4099": { + "4120": { "op": "dup", "stack_out": [ "aggregate%extract%2#0", @@ -37904,7 +37928,7 @@ "entry#0" ] }, - "4100": { + "4121": { "op": "bury 8", "defined_out": [ "entry#0", @@ -37924,7 +37948,7 @@ "entry#0" ] }, - "4102": { + "4123": { "op": "dup", "defined_out": [ "entry#0", @@ -37946,7 +37970,7 @@ "entry#0 (copy)" ] }, - "4103": { + "4124": { "op": "extract 8 1", "defined_out": [ "aggregate%extract%9#0", @@ -37968,7 +37992,7 @@ "aggregate%extract%9#0" ] }, - "4106": { + "4127": { "op": "bury 10", "defined_out": [ "aggregate%extract%9#0", @@ -37989,7 +38013,7 @@ "entry#0" ] }, - "4108": { + "4129": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -38012,7 +38036,7 @@ "8" ] }, - "4109": { + "4130": { "op": "getbyte", "defined_out": [ "aggregate%extract%9#0", @@ -38034,7 +38058,7 @@ "event_type#0" ] }, - "4110": { + "4131": { "op": "dup", "stack_out": [ "aggregate%extract%2#0", @@ -38051,7 +38075,7 @@ "event_type#0" ] }, - "4111": { + "4132": { "op": "bury 6", "defined_out": [ "aggregate%extract%9#0", @@ -38073,7 +38097,7 @@ "event_type#0" ] }, - "4113": { + "4134": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -38097,7 +38121,7 @@ "1" ] }, - "4114": { + "4135": { "op": "==", "defined_out": [ "aggregate%extract%9#0", @@ -38120,7 +38144,7 @@ "tmp%0#3" ] }, - "4115": { + "4136": { "op": "bnz apply_non_cash_event_bool_true@15", "stack_out": [ "aggregate%extract%2#0", @@ -38135,7 +38159,7 @@ "values%0#0" ] }, - "4118": { + "4139": { "op": "dig 4", "stack_out": [ "aggregate%extract%2#0", @@ -38151,7 +38175,7 @@ "event_type#0" ] }, - "4120": { + "4141": { "op": "pushint 4", "defined_out": [ "4", @@ -38175,7 +38199,7 @@ "4" ] }, - "4122": { + "4143": { "op": "==", "defined_out": [ "aggregate%extract%9#0", @@ -38198,7 +38222,7 @@ "tmp%1#2" ] }, - "4123": { + "4144": { "op": "bnz apply_non_cash_event_bool_true@15", "stack_out": [ "aggregate%extract%2#0", @@ -38213,7 +38237,7 @@ "values%0#0" ] }, - "4126": { + "4147": { "op": "dig 4", "stack_out": [ "aggregate%extract%2#0", @@ -38229,7 +38253,7 @@ "event_type#0" ] }, - "4128": { + "4149": { "op": "pushint 12", "defined_out": [ "12", @@ -38253,7 +38277,7 @@ "12" ] }, - "4130": { + "4151": { "op": "==", "defined_out": [ "aggregate%extract%9#0", @@ -38276,7 +38300,7 @@ "tmp%2#2" ] }, - "4131": { + "4152": { "op": "bnz apply_non_cash_event_bool_true@15", "stack_out": [ "aggregate%extract%2#0", @@ -38291,7 +38315,7 @@ "values%0#0" ] }, - "4134": { + "4155": { "op": "dig 4", "stack_out": [ "aggregate%extract%2#0", @@ -38307,7 +38331,7 @@ "event_type#0" ] }, - "4136": { + "4157": { "op": "pushint 11", "defined_out": [ "11", @@ -38331,7 +38355,7 @@ "11" ] }, - "4138": { + "4159": { "op": "==", "stack_out": [ "aggregate%extract%2#0", @@ -38347,7 +38371,7 @@ "tmp%3#1" ] }, - "4139": { + "4160": { "op": "bnz apply_non_cash_event_bool_true@15", "stack_out": [ "aggregate%extract%2#0", @@ -38362,7 +38386,7 @@ "values%0#0" ] }, - "4142": { + "4163": { "op": "dig 4", "stack_out": [ "aggregate%extract%2#0", @@ -38378,7 +38402,7 @@ "event_type#0" ] }, - "4144": { + "4165": { "op": "pushint 18", "defined_out": [ "18", @@ -38402,7 +38426,7 @@ "18" ] }, - "4146": { + "4167": { "op": "==", "defined_out": [ "aggregate%extract%9#0", @@ -38425,7 +38449,7 @@ "tmp%4#1" ] }, - "4147": { + "4168": { "op": "bnz apply_non_cash_event_bool_true@15", "stack_out": [ "aggregate%extract%2#0", @@ -38440,7 +38464,7 @@ "values%0#0" ] }, - "4150": { + "4171": { "op": "dig 4", "stack_out": [ "aggregate%extract%2#0", @@ -38456,7 +38480,7 @@ "event_type#0" ] }, - "4152": { + "4173": { "op": "pushint 5", "defined_out": [ "5", @@ -38480,7 +38504,7 @@ "5" ] }, - "4154": { + "4175": { "op": "==", "defined_out": [ "aggregate%extract%9#0", @@ -38503,7 +38527,7 @@ "tmp%5#2" ] }, - "4155": { + "4176": { "op": "bz apply_non_cash_event_bool_false@16", "stack_out": [ "aggregate%extract%2#0", @@ -38518,7 +38542,7 @@ "values%0#0" ] }, - "4158": { + "4179": { "block": "apply_non_cash_event_bool_true@15", "stack_in": [ "aggregate%extract%2#0", @@ -38550,7 +38574,7 @@ "or_result%0#0" ] }, - "4159": { + "4180": { "error": "Invalid event type", "block": "apply_non_cash_event_bool_merge@17", "stack_in": [ @@ -38581,7 +38605,7 @@ "values%0#0" ] }, - "4160": { + "4181": { "op": "dig 8", "defined_out": [ "aggregate%extract%9#0" @@ -38600,7 +38624,7 @@ "aggregate%extract%9#0" ] }, - "4162": { + "4183": { "op": "pushbytes 0x01", "defined_out": [ "0x01", @@ -38621,7 +38645,7 @@ "0x01" ] }, - "4165": { + "4186": { "op": "b!=", "defined_out": [ "aggregate%extract%9#0", @@ -38641,7 +38665,7 @@ "tmp%7#0" ] }, - "4166": { + "4187": { "error": "Invalid event type", "op": "assert // Invalid event type", "stack_out": [ @@ -38657,7 +38681,7 @@ "values%0#0" ] }, - "4167": { + "4188": { "op": "dig 4", "defined_out": [ "aggregate%extract%9#0", @@ -38677,7 +38701,7 @@ "event_type#0" ] }, - "4169": { + "4190": { "op": "pushint 12", "defined_out": [ "12", @@ -38699,7 +38723,7 @@ "12" ] }, - "4171": { + "4192": { "op": "==", "defined_out": [ "aggregate%extract%9#0", @@ -38720,7 +38744,7 @@ "tmp%0#3" ] }, - "4172": { + "4193": { "op": "bnz apply_non_cash_event_bool_true@21", "stack_out": [ "aggregate%extract%2#0", @@ -38735,7 +38759,7 @@ "values%0#0" ] }, - "4175": { + "4196": { "op": "dig 4", "stack_out": [ "aggregate%extract%2#0", @@ -38751,7 +38775,7 @@ "event_type#0" ] }, - "4177": { + "4198": { "op": "pushint 11", "defined_out": [ "11", @@ -38773,7 +38797,7 @@ "11" ] }, - "4179": { + "4200": { "op": "==", "defined_out": [ "aggregate%extract%9#0", @@ -38794,7 +38818,7 @@ "tmp%1#2" ] }, - "4180": { + "4201": { "op": "bz apply_non_cash_event_bool_false@22", "stack_out": [ "aggregate%extract%2#0", @@ -38809,7 +38833,7 @@ "values%0#0" ] }, - "4183": { + "4204": { "block": "apply_non_cash_event_bool_true@21", "stack_in": [ "aggregate%extract%2#0", @@ -38841,7 +38865,7 @@ "or_result%0#0" ] }, - "4184": { + "4205": { "block": "apply_non_cash_event_bool_merge@23", "stack_in": [ "aggregate%extract%2#0", @@ -38871,7 +38895,7 @@ "values%0#0" ] }, - "4187": { + "4208": { "op": "bytec 25 // 0x523a4d4f4323", "defined_out": [ "0x523a4d4f4323" @@ -38890,7 +38914,7 @@ "0x523a4d4f4323" ] }, - "4189": { + "4210": { "op": "txn Sender", "defined_out": [ "0x523a4d4f4323", @@ -38911,7 +38935,7 @@ "tmp%0#2" ] }, - "4191": { + "4212": { "callsub": "modules.rbac.RbacModule._role_is_active", "op": "callsub _role_is_active", "defined_out": [ @@ -38931,7 +38955,7 @@ "tmp%1#2" ] }, - "4194": { + "4215": { "error": "Not authorized", "op": "assert // Not authorized", "stack_out": [ @@ -38947,7 +38971,7 @@ "values%0#0" ] }, - "4195": { + "4216": { "block": "apply_non_cash_event_after_if_else@6", "stack_in": [ "aggregate%extract%2#0", @@ -38979,7 +39003,7 @@ "entry#0" ] }, - "4197": { + "4218": { "op": "dig 2", "defined_out": [ "entry#0", @@ -39000,11 +39024,11 @@ "payload#0" ] }, - "4199": { + "4220": { "callsub": "modules.actus_kernel.ActusKernelModule._apply_non_cash_schedule_entry", "op": "callsub _apply_non_cash_schedule_entry" }, - "4202": { + "4223": { "op": "popn 2", "stack_out": [ "aggregate%extract%2#0", @@ -39019,7 +39043,7 @@ "values%0#0" ] }, - "4204": { + "4225": { "op": "global LatestTimestamp", "defined_out": [ "entry#0", @@ -39040,7 +39064,7 @@ "tmp%10#0" ] }, - "4206": { + "4227": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%8#0", @@ -39061,7 +39085,7 @@ "aggregate%val_as_bytes%8#0" ] }, - "4207": { + "4228": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -39084,7 +39108,7 @@ "0x151f7c75" ] }, - "4208": { + "4229": { "op": "swap", "stack_out": [ "aggregate%extract%2#0", @@ -39101,7 +39125,7 @@ "aggregate%val_as_bytes%8#0" ] }, - "4209": { + "4230": { "op": "concat", "defined_out": [ "entry#0", @@ -39122,7 +39146,7 @@ "tmp%5#0" ] }, - "4210": { + "4231": { "op": "log", "stack_out": [ "aggregate%extract%2#0", @@ -39137,7 +39161,7 @@ "values%0#0" ] }, - "4211": { + "4232": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -39158,7 +39182,7 @@ "1" ] }, - "4212": { + "4233": { "op": "return", "stack_out": [ "aggregate%extract%2#0", @@ -39173,7 +39197,7 @@ "values%0#0" ] }, - "4213": { + "4234": { "block": "apply_non_cash_event_else_body@5", "stack_in": [ "aggregate%extract%2#0", @@ -39190,10 +39214,10 @@ "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", "op": "callsub _assert_caller_is_arranger" }, - "4216": { + "4237": { "op": "b apply_non_cash_event_after_if_else@6" }, - "4219": { + "4240": { "block": "apply_non_cash_event_bool_false@22", "stack_in": [ "aggregate%extract%2#0", @@ -39225,10 +39249,10 @@ "or_result%0#0" ] }, - "4220": { + "4241": { "op": "b apply_non_cash_event_bool_merge@23" }, - "4223": { + "4244": { "block": "apply_non_cash_event_bool_false@16", "stack_in": [ "aggregate%extract%2#0", @@ -39260,10 +39284,10 @@ "or_result%0#0" ] }, - "4224": { + "4245": { "op": "b apply_non_cash_event_bool_merge@17" }, - "4227": { + "4248": { "subroutine": "modules.actus_kernel.ActusKernelModule.append_observed_cash_event[routing]", "params": {}, "block": "append_observed_cash_event", @@ -39273,17 +39297,17 @@ "box_prefixed_key%0#0" ] }, - "4228": { + "4249": { "op": "dup", "stack_out": [ "box_prefixed_key%0#0", "page#0" ] }, - "4229": { + "4250": { "op": "txna ApplicationArgs 1" }, - "4232": { + "4253": { "op": "dupn 2", "defined_out": [ "payload#0", @@ -39297,7 +39321,7 @@ "payload#0 (copy)" ] }, - "4234": { + "4255": { "op": "len", "defined_out": [ "len%0#0", @@ -39311,7 +39335,7 @@ "len%0#0" ] }, - "4235": { + "4256": { "op": "pushint 65", "defined_out": [ "65", @@ -39327,7 +39351,7 @@ "65" ] }, - "4237": { + "4258": { "op": "==", "defined_out": [ "eq%0#0", @@ -39341,7 +39365,7 @@ "eq%0#0" ] }, - "4238": { + "4259": { "error": "invalid number of bytes for smart_contracts.abi_types.ObservedCashEventRequest", "op": "assert // invalid number of bytes for smart_contracts.abi_types.ObservedCashEventRequest", "stack_out": [ @@ -39351,7 +39375,7 @@ "payload#0" ] }, - "4239": { + "4260": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#0", @@ -39361,7 +39385,7 @@ "0" ] }, - "4240": { + "4261": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"", @@ -39377,7 +39401,7 @@ "\"status\"" ] }, - "4241": { + "4262": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -39393,7 +39417,7 @@ "maybe_exists%0#0" ] }, - "4242": { + "4263": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ @@ -39404,7 +39428,7 @@ "maybe_value%0#0" ] }, - "4243": { + "4264": { "error": "D-ASA not configured", "op": "assert // D-ASA not configured", "stack_out": [ @@ -39414,19 +39438,19 @@ "payload#0" ] }, - "4244": { + "4265": { "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", "op": "callsub _assert_caller_is_arranger" }, - "4247": { + "4268": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", "op": "callsub _assert_is_not_asset_defaulted" }, - "4250": { + "4271": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_suspended", "op": "callsub _assert_is_not_asset_suspended" }, - "4253": { + "4274": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#0", @@ -39436,7 +39460,7 @@ "0" ] }, - "4254": { + "4275": { "op": "bytec_1 // \"status\"", "stack_out": [ "box_prefixed_key%0#0", @@ -39447,7 +39471,7 @@ "\"status\"" ] }, - "4255": { + "4276": { "op": "app_global_get_ex", "stack_out": [ "box_prefixed_key%0#0", @@ -39458,7 +39482,7 @@ "maybe_exists%0#0" ] }, - "4256": { + "4277": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ @@ -39469,7 +39493,7 @@ "maybe_value%0#0" ] }, - "4257": { + "4278": { "op": "pushint 50", "defined_out": [ "50", @@ -39485,7 +39509,7 @@ "50" ] }, - "4259": { + "4280": { "op": "==", "defined_out": [ "payload#0", @@ -39499,7 +39523,7 @@ "tmp%0#5" ] }, - "4260": { + "4281": { "op": "!", "defined_out": [ "payload#0", @@ -39513,7 +39537,7 @@ "tmp%1#0" ] }, - "4261": { + "4282": { "error": "IED not yet executed", "op": "assert // IED not yet executed", "stack_out": [ @@ -39523,7 +39547,7 @@ "payload#0" ] }, - "4262": { + "4283": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#0", @@ -39533,7 +39557,7 @@ "0" ] }, - "4263": { + "4284": { "op": "bytec 10 // \"contract_type\"", "defined_out": [ "\"contract_type\"", @@ -39549,7 +39573,7 @@ "\"contract_type\"" ] }, - "4265": { + "4286": { "op": "app_global_get_ex", "stack_out": [ "box_prefixed_key%0#0", @@ -39560,7 +39584,7 @@ "maybe_exists%0#0" ] }, - "4266": { + "4287": { "error": "check self.contract_type exists", "op": "assert // check self.contract_type exists", "stack_out": [ @@ -39571,7 +39595,7 @@ "maybe_value%0#0" ] }, - "4267": { + "4288": { "op": "pushint 5", "defined_out": [ "5", @@ -39587,7 +39611,7 @@ "5" ] }, - "4269": { + "4290": { "op": "==", "stack_out": [ "box_prefixed_key%0#0", @@ -39597,7 +39621,7 @@ "tmp%0#5" ] }, - "4270": { + "4291": { "error": "Observed event required to execute this action", "op": "assert // Observed event required to execute this action", "stack_out": [ @@ -39607,7 +39631,7 @@ "payload#0" ] }, - "4271": { + "4292": { "op": "dup", "stack_out": [ "box_prefixed_key%0#0", @@ -39617,7 +39641,7 @@ "payload#0 (copy)" ] }, - "4272": { + "4293": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#0", @@ -39628,7 +39652,7 @@ "0" ] }, - "4273": { + "4294": { "op": "extract_uint64", "defined_out": [ "payload#0", @@ -39642,7 +39666,7 @@ "values%0#0" ] }, - "4274": { + "4295": { "op": "dup", "stack_out": [ "box_prefixed_key%0#0", @@ -39653,7 +39677,7 @@ "values%0#0" ] }, - "4275": { + "4296": { "op": "cover 2", "defined_out": [ "payload#0", @@ -39668,7 +39692,7 @@ "values%0#0" ] }, - "4277": { + "4298": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#0", @@ -39680,7 +39704,7 @@ "0" ] }, - "4278": { + "4299": { "op": "bytec_3 // \"schedule_entry_count\"", "defined_out": [ "\"schedule_entry_count\"", @@ -39699,7 +39723,7 @@ "\"schedule_entry_count\"" ] }, - "4279": { + "4300": { "op": "app_global_get_ex", "stack_out": [ "box_prefixed_key%0#0", @@ -39712,7 +39736,7 @@ "maybe_exists%0#0" ] }, - "4280": { + "4301": { "error": "check self.schedule_entry_count exists", "op": "assert // check self.schedule_entry_count exists", "stack_out": [ @@ -39725,7 +39749,7 @@ "maybe_value%0#0" ] }, - "4281": { + "4302": { "op": "swap", "stack_out": [ "box_prefixed_key%0#0", @@ -39737,7 +39761,7 @@ "values%0#0" ] }, - "4282": { + "4303": { "op": "dig 1", "defined_out": [ "maybe_value%0#0", @@ -39756,7 +39780,7 @@ "maybe_value%0#0 (copy)" ] }, - "4284": { + "4305": { "op": "==", "stack_out": [ "box_prefixed_key%0#0", @@ -39768,7 +39792,7 @@ "tmp%1#0" ] }, - "4285": { + "4306": { "error": "Invalid event id", "op": "assert // Invalid event id", "stack_out": [ @@ -39780,7 +39804,7 @@ "maybe_value%0#0" ] }, - "4286": { + "4307": { "op": "dig 1", "stack_out": [ "box_prefixed_key%0#0", @@ -39792,7 +39816,7 @@ "payload#0 (copy)" ] }, - "4288": { + "4309": { "op": "extract 8 1", "defined_out": [ "aggregate%extract%1#0", @@ -39810,7 +39834,7 @@ "aggregate%extract%1#0" ] }, - "4291": { + "4312": { "op": "dup", "stack_out": [ "box_prefixed_key%0#0", @@ -39823,7 +39847,7 @@ "aggregate%extract%1#0" ] }, - "4292": { + "4313": { "op": "cover 3", "defined_out": [ "aggregate%extract%1#0", @@ -39842,7 +39866,7 @@ "aggregate%extract%1#0" ] }, - "4294": { + "4315": { "op": "pushbytes 0x03", "defined_out": [ "0x03", @@ -39863,7 +39887,7 @@ "0x03" ] }, - "4297": { + "4318": { "op": "b==", "defined_out": [ "aggregate%extract%1#0", @@ -39883,7 +39907,7 @@ "tmp%2#1" ] }, - "4298": { + "4319": { "error": "Invalid event type", "op": "assert // Invalid event type", "stack_out": [ @@ -39896,7 +39920,7 @@ "maybe_value%0#0" ] }, - "4299": { + "4320": { "op": "swap", "stack_out": [ "box_prefixed_key%0#0", @@ -39908,7 +39932,7 @@ "payload#0" ] }, - "4300": { + "4321": { "op": "pushint 57", "defined_out": [ "57", @@ -39928,7 +39952,7 @@ "57" ] }, - "4302": { + "4323": { "op": "extract_uint64", "defined_out": [ "aggregate%extract%1#0", @@ -39947,7 +39971,7 @@ "values%1#0" ] }, - "4303": { + "4324": { "op": "dup", "stack_out": [ "box_prefixed_key%0#0", @@ -39960,7 +39984,7 @@ "values%1#0" ] }, - "4304": { + "4325": { "op": "cover 2", "stack_out": [ "box_prefixed_key%0#0", @@ -39973,7 +39997,7 @@ "values%1#0" ] }, - "4306": { + "4327": { "op": "intc_1 // 1", "stack_out": [ "box_prefixed_key%0#0", @@ -39987,7 +40011,7 @@ "1" ] }, - "4307": { + "4328": { "op": "&", "defined_out": [ "aggregate%extract%1#0", @@ -40008,7 +40032,7 @@ "tmp%3#1" ] }, - "4308": { + "4329": { "error": "Invalid ACTUS configuration", "op": "assert // Invalid ACTUS configuration", "stack_out": [ @@ -40021,7 +40045,7 @@ "maybe_value%0#0" ] }, - "4309": { + "4330": { "op": "bz append_observed_cash_event_after_if_else@3", "stack_out": [ "box_prefixed_key%0#0", @@ -40032,7 +40056,7 @@ "values%1#0" ] }, - "4312": { + "4333": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#0", @@ -40044,7 +40068,7 @@ "0" ] }, - "4313": { + "4334": { "op": "bytec_3 // \"schedule_entry_count\"", "stack_out": [ "box_prefixed_key%0#0", @@ -40057,7 +40081,7 @@ "\"schedule_entry_count\"" ] }, - "4314": { + "4335": { "op": "app_global_get_ex", "defined_out": [ "aggregate%extract%1#0", @@ -40078,7 +40102,7 @@ "maybe_exists%2#0" ] }, - "4315": { + "4336": { "error": "check self.schedule_entry_count exists", "op": "assert // check self.schedule_entry_count exists", "stack_out": [ @@ -40091,7 +40115,7 @@ "maybe_value%2#0" ] }, - "4316": { + "4337": { "op": "intc_1 // 1", "stack_out": [ "box_prefixed_key%0#0", @@ -40104,7 +40128,7 @@ "1" ] }, - "4317": { + "4338": { "op": "-", "defined_out": [ "aggregate%extract%1#0", @@ -40123,7 +40147,7 @@ "tmp%6#0" ] }, - "4318": { + "4339": { "callsub": "modules.actus_kernel.ActusKernelModule._get_schedule_entry", "op": "callsub _get_schedule_entry", "defined_out": [ @@ -40143,7 +40167,7 @@ "previous_entry#0" ] }, - "4321": { + "4342": { "op": "pushint 9", "defined_out": [ "9", @@ -40164,7 +40188,7 @@ "9" ] }, - "4323": { + "4344": { "op": "extract_uint64", "defined_out": [ "aggregate%extract%1#0", @@ -40183,7 +40207,7 @@ "values%2#0" ] }, - "4324": { + "4345": { "op": "dig 4", "stack_out": [ "box_prefixed_key%0#0", @@ -40196,7 +40220,7 @@ "payload#0" ] }, - "4326": { + "4347": { "op": "pushint 9", "stack_out": [ "box_prefixed_key%0#0", @@ -40210,7 +40234,7 @@ "9" ] }, - "4328": { + "4349": { "op": "extract_uint64", "defined_out": [ "aggregate%extract%1#0", @@ -40231,7 +40255,7 @@ "values%3#0" ] }, - "4329": { + "4350": { "op": "<=", "defined_out": [ "aggregate%extract%1#0", @@ -40250,7 +40274,7 @@ "tmp%8#0" ] }, - "4330": { + "4351": { "error": "Time events must be sorted in strictly ascending order", "op": "assert // Time events must be sorted in strictly ascending order", "stack_out": [ @@ -40262,7 +40286,7 @@ "values%1#0" ] }, - "4331": { + "4352": { "block": "append_observed_cash_event_after_if_else@3", "stack_in": [ "box_prefixed_key%0#0", @@ -40286,7 +40310,7 @@ "0" ] }, - "4332": { + "4353": { "op": "bytec_3 // \"schedule_entry_count\"", "defined_out": [ "\"schedule_entry_count\"", @@ -40303,7 +40327,7 @@ "\"schedule_entry_count\"" ] }, - "4333": { + "4354": { "op": "app_global_get_ex", "defined_out": [ "event_id#0", @@ -40320,7 +40344,7 @@ "maybe_exists%3#0" ] }, - "4334": { + "4355": { "error": "check self.schedule_entry_count exists", "op": "assert // check self.schedule_entry_count exists", "stack_out": [ @@ -40333,7 +40357,7 @@ "event_id#0" ] }, - "4335": { + "4356": { "op": "pushint 16", "defined_out": [ "16", @@ -40350,7 +40374,7 @@ "16" ] }, - "4337": { + "4358": { "op": "/", "defined_out": [ "page_index#0" @@ -40365,8 +40389,8 @@ "page_index#0" ] }, - "4338": { - "op": "bytec 48 // 0x0000", + "4359": { + "op": "bytec 49 // 0x0000", "defined_out": [ "page#0", "page_index#0" @@ -40382,7 +40406,7 @@ "page#0" ] }, - "4340": { + "4361": { "op": "bury 6", "defined_out": [ "page#0", @@ -40398,7 +40422,7 @@ "page_index#0" ] }, - "4342": { + "4363": { "op": "itob", "defined_out": [ "encoded_value%0#0", @@ -40414,7 +40438,7 @@ "encoded_value%0#0" ] }, - "4343": { + "4364": { "op": "bytec 24 // 0x5323", "defined_out": [ "0x5323", @@ -40432,7 +40456,7 @@ "0x5323" ] }, - "4345": { + "4366": { "op": "swap", "stack_out": [ "box_prefixed_key%0#0", @@ -40445,7 +40469,7 @@ "encoded_value%0#0" ] }, - "4346": { + "4367": { "op": "concat", "defined_out": [ "box_prefixed_key%0#0", @@ -40461,7 +40485,7 @@ "box_prefixed_key%0#0" ] }, - "4347": { + "4368": { "op": "dup", "stack_out": [ "box_prefixed_key%0#0", @@ -40474,7 +40498,7 @@ "box_prefixed_key%0#0" ] }, - "4348": { + "4369": { "op": "bury 7", "defined_out": [ "box_prefixed_key%0#0", @@ -40490,7 +40514,7 @@ "box_prefixed_key%0#0" ] }, - "4350": { + "4371": { "op": "box_len", "defined_out": [ "_%0#0", @@ -40509,7 +40533,7 @@ "maybe_exists%4#0" ] }, - "4351": { + "4372": { "op": "bury 1", "stack_out": [ "box_prefixed_key%0#0", @@ -40521,7 +40545,7 @@ "maybe_exists%4#0" ] }, - "4353": { + "4374": { "op": "bz append_observed_cash_event_after_if_else@5", "stack_out": [ "box_prefixed_key%0#0", @@ -40532,7 +40556,7 @@ "values%1#0" ] }, - "4356": { + "4377": { "op": "dig 5", "stack_out": [ "box_prefixed_key%0#0", @@ -40544,7 +40568,7 @@ "box_prefixed_key%0#0" ] }, - "4358": { + "4379": { "op": "box_get", "defined_out": [ "aggregate%box_get%1#0", @@ -40562,7 +40586,7 @@ "aggregate%box_get%1#0" ] }, - "4359": { + "4380": { "op": "swap", "stack_out": [ "box_prefixed_key%0#0", @@ -40575,7 +40599,7 @@ "page#0" ] }, - "4360": { + "4381": { "op": "bury 6", "stack_out": [ "box_prefixed_key%0#0", @@ -40587,7 +40611,7 @@ "aggregate%box_get%1#0" ] }, - "4362": { + "4383": { "error": "check self.schedule_page entry exists", "op": "assert // check self.schedule_page entry exists", "stack_out": [ @@ -40599,7 +40623,7 @@ "values%1#0" ] }, - "4363": { + "4384": { "block": "append_observed_cash_event_after_if_else@5", "stack_in": [ "box_prefixed_key%0#0", @@ -40623,7 +40647,7 @@ "page#0" ] }, - "4365": { + "4386": { "op": "dup", "defined_out": [ "page#0", @@ -40640,7 +40664,7 @@ "page#0 (copy)" ] }, - "4366": { + "4387": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -40659,7 +40683,7 @@ "0" ] }, - "4367": { + "4388": { "error": "invalid array length header", "op": "extract_uint16 // on error: invalid array length header", "defined_out": [ @@ -40677,7 +40701,7 @@ "aggregate%array_length%0#0" ] }, - "4368": { + "4389": { "op": "dup", "defined_out": [ "aggregate%array_length%0#0", @@ -40696,7 +40720,7 @@ "aggregate%array_length%0#0 (copy)" ] }, - "4369": { + "4390": { "op": "pushint 16", "defined_out": [ "16", @@ -40717,7 +40741,7 @@ "16" ] }, - "4371": { + "4392": { "op": "<", "defined_out": [ "aggregate%array_length%0#0", @@ -40736,7 +40760,7 @@ "tmp%11#0" ] }, - "4372": { + "4393": { "error": "Invalid schedule page", "op": "assert // Invalid schedule page", "stack_out": [ @@ -40750,7 +40774,7 @@ "aggregate%array_length%0#0" ] }, - "4373": { + "4394": { "op": "dig 5", "defined_out": [ "aggregate%array_length%0#0", @@ -40769,7 +40793,7 @@ "payload#0" ] }, - "4375": { + "4396": { "op": "dup", "defined_out": [ "aggregate%array_length%0#0", @@ -40790,7 +40814,7 @@ "payload#0 (copy)" ] }, - "4376": { + "4397": { "op": "extract 9 8", "defined_out": [ "aggregate%array_length%0#0", @@ -40811,7 +40835,7 @@ "aggregate%extract%5#0" ] }, - "4379": { + "4400": { "op": "dig 1", "stack_out": [ "box_prefixed_key%0#0", @@ -40827,7 +40851,7 @@ "payload#0 (copy)" ] }, - "4381": { + "4402": { "op": "extract 17 8", "defined_out": [ "aggregate%array_length%0#0", @@ -40850,7 +40874,7 @@ "aggregate%extract%6#0" ] }, - "4384": { + "4405": { "op": "dig 2", "stack_out": [ "box_prefixed_key%0#0", @@ -40867,7 +40891,7 @@ "payload#0 (copy)" ] }, - "4386": { + "4407": { "op": "extract 25 8", "defined_out": [ "aggregate%array_length%0#0", @@ -40892,7 +40916,7 @@ "aggregate%extract%7#0" ] }, - "4389": { + "4410": { "op": "dig 3", "stack_out": [ "box_prefixed_key%0#0", @@ -40910,7 +40934,7 @@ "payload#0 (copy)" ] }, - "4391": { + "4412": { "op": "extract 33 8", "defined_out": [ "aggregate%array_length%0#0", @@ -40937,7 +40961,7 @@ "aggregate%extract%8#0" ] }, - "4394": { + "4415": { "op": "dig 4", "stack_out": [ "box_prefixed_key%0#0", @@ -40956,7 +40980,7 @@ "payload#0 (copy)" ] }, - "4396": { + "4417": { "op": "extract 41 8", "defined_out": [ "aggregate%array_length%0#0", @@ -40985,7 +41009,7 @@ "aggregate%extract%9#0" ] }, - "4399": { + "4420": { "op": "uncover 5", "stack_out": [ "box_prefixed_key%0#0", @@ -41004,7 +41028,7 @@ "payload#0" ] }, - "4401": { + "4422": { "op": "extract 49 8", "defined_out": [ "aggregate%array_length%0#0", @@ -41034,7 +41058,7 @@ "aggregate%extract%10#0" ] }, - "4404": { + "4425": { "op": "dig 10", "defined_out": [ "aggregate%array_length%0#0", @@ -41066,7 +41090,7 @@ "values%0#0" ] }, - "4406": { + "4427": { "op": "itob", "defined_out": [ "aggregate%array_length%0#0", @@ -41099,7 +41123,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "4407": { + "4428": { "op": "dig 10", "defined_out": [ "aggregate%array_length%0#0", @@ -41134,7 +41158,7 @@ "aggregate%extract%1#0" ] }, - "4409": { + "4430": { "op": "concat", "defined_out": [ "aggregate%array_length%0#0", @@ -41168,7 +41192,7 @@ "aggregate%head%1#0" ] }, - "4410": { + "4431": { "op": "uncover 6", "stack_out": [ "box_prefixed_key%0#0", @@ -41188,7 +41212,7 @@ "aggregate%extract%5#0" ] }, - "4412": { + "4433": { "op": "concat", "defined_out": [ "aggregate%array_length%0#0", @@ -41220,7 +41244,7 @@ "aggregate%head%2#0" ] }, - "4413": { + "4434": { "op": "uncover 5", "stack_out": [ "box_prefixed_key%0#0", @@ -41239,7 +41263,7 @@ "aggregate%extract%6#0" ] }, - "4415": { + "4436": { "op": "concat", "defined_out": [ "aggregate%array_length%0#0", @@ -41269,7 +41293,7 @@ "aggregate%head%3#0" ] }, - "4416": { + "4437": { "op": "uncover 4", "stack_out": [ "box_prefixed_key%0#0", @@ -41287,7 +41311,7 @@ "aggregate%extract%7#0" ] }, - "4418": { + "4439": { "op": "concat", "defined_out": [ "aggregate%array_length%0#0", @@ -41315,7 +41339,7 @@ "aggregate%head%4#0" ] }, - "4419": { + "4440": { "op": "uncover 3", "stack_out": [ "box_prefixed_key%0#0", @@ -41332,7 +41356,7 @@ "aggregate%extract%8#0" ] }, - "4421": { + "4442": { "op": "concat", "defined_out": [ "aggregate%array_length%0#0", @@ -41358,7 +41382,7 @@ "aggregate%head%5#0" ] }, - "4422": { + "4443": { "op": "uncover 2", "stack_out": [ "box_prefixed_key%0#0", @@ -41374,7 +41398,7 @@ "aggregate%extract%9#0" ] }, - "4424": { + "4445": { "op": "concat", "defined_out": [ "aggregate%array_length%0#0", @@ -41398,7 +41422,7 @@ "aggregate%head%6#0" ] }, - "4425": { + "4446": { "op": "swap", "stack_out": [ "box_prefixed_key%0#0", @@ -41413,7 +41437,7 @@ "aggregate%extract%10#0" ] }, - "4426": { + "4447": { "op": "concat", "defined_out": [ "aggregate%array_length%0#0", @@ -41435,7 +41459,7 @@ "aggregate%head%7#0" ] }, - "4427": { + "4448": { "op": "dig 3", "defined_out": [ "aggregate%array_length%0#0", @@ -41459,7 +41483,7 @@ "values%1#0" ] }, - "4429": { + "4450": { "op": "itob", "defined_out": [ "aggregate%array_length%0#0", @@ -41484,7 +41508,7 @@ "aggregate%val_as_bytes%7#0" ] }, - "4430": { + "4451": { "op": "concat", "defined_out": [ "aggregate%array_length%0#0", @@ -41507,7 +41531,7 @@ "aggregate%head%8#0" ] }, - "4431": { + "4452": { "op": "uncover 2", "stack_out": [ "box_prefixed_key%0#0", @@ -41521,7 +41545,7 @@ "page#0" ] }, - "4433": { + "4454": { "op": "swap", "stack_out": [ "box_prefixed_key%0#0", @@ -41535,7 +41559,7 @@ "aggregate%head%8#0" ] }, - "4434": { + "4455": { "error": "max array length exceeded", "op": "concat // on error: max array length exceeded", "defined_out": [ @@ -41558,7 +41582,7 @@ "concat%0#0" ] }, - "4435": { + "4456": { "op": "swap", "stack_out": [ "box_prefixed_key%0#0", @@ -41571,7 +41595,7 @@ "aggregate%array_length%0#0" ] }, - "4436": { + "4457": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -41595,7 +41619,7 @@ "1" ] }, - "4437": { + "4458": { "op": "+", "defined_out": [ "add%0#0", @@ -41617,7 +41641,7 @@ "add%0#0" ] }, - "4438": { + "4459": { "op": "itob", "defined_out": [ "aggregate%extract%1#0", @@ -41639,7 +41663,7 @@ "as_bytes%0#0" ] }, - "4439": { + "4460": { "op": "extract 6 2", "defined_out": [ "aggregate%extract%1#0", @@ -41661,7 +41685,7 @@ "as_u16_bytes%0#0" ] }, - "4442": { + "4463": { "op": "replace2 0", "stack_out": [ "box_prefixed_key%0#0", @@ -41673,7 +41697,7 @@ "page#0" ] }, - "4444": { + "4465": { "op": "dig 6", "defined_out": [ "aggregate%extract%1#0", @@ -41694,7 +41718,7 @@ "box_prefixed_key%0#0" ] }, - "4446": { + "4467": { "op": "dup", "defined_out": [ "aggregate%extract%1#0", @@ -41717,7 +41741,7 @@ "box_prefixed_key%0#0 (copy)" ] }, - "4447": { + "4468": { "op": "box_del", "defined_out": [ "aggregate%extract%1#0", @@ -41740,7 +41764,7 @@ "{box_del}" ] }, - "4448": { + "4469": { "op": "pop", "stack_out": [ "box_prefixed_key%0#0", @@ -41753,7 +41777,7 @@ "box_prefixed_key%0#0" ] }, - "4449": { + "4470": { "op": "swap", "stack_out": [ "box_prefixed_key%0#0", @@ -41766,7 +41790,7 @@ "page#0" ] }, - "4450": { + "4471": { "op": "box_put", "stack_out": [ "box_prefixed_key%0#0", @@ -41777,7 +41801,7 @@ "values%1#0" ] }, - "4451": { + "4472": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#0", @@ -41789,7 +41813,7 @@ "0" ] }, - "4452": { + "4473": { "op": "bytec_3 // \"schedule_entry_count\"", "defined_out": [ "\"schedule_entry_count\"", @@ -41812,7 +41836,7 @@ "\"schedule_entry_count\"" ] }, - "4453": { + "4474": { "op": "app_global_get_ex", "defined_out": [ "aggregate%extract%1#0", @@ -41835,7 +41859,7 @@ "maybe_exists%5#0" ] }, - "4454": { + "4475": { "error": "check self.schedule_entry_count exists", "op": "assert // check self.schedule_entry_count exists", "stack_out": [ @@ -41848,7 +41872,7 @@ "maybe_value%4#0" ] }, - "4455": { + "4476": { "op": "intc_1 // 1", "stack_out": [ "box_prefixed_key%0#0", @@ -41861,7 +41885,7 @@ "1" ] }, - "4456": { + "4477": { "op": "+", "defined_out": [ "aggregate%extract%1#0", @@ -41882,7 +41906,7 @@ "tmp%14#0" ] }, - "4457": { + "4478": { "op": "bytec_3 // \"schedule_entry_count\"", "stack_out": [ "box_prefixed_key%0#0", @@ -41895,7 +41919,7 @@ "\"schedule_entry_count\"" ] }, - "4458": { + "4479": { "op": "swap", "stack_out": [ "box_prefixed_key%0#0", @@ -41908,7 +41932,7 @@ "tmp%14#0" ] }, - "4459": { + "4480": { "op": "app_global_put", "stack_out": [ "box_prefixed_key%0#0", @@ -41919,7 +41943,7 @@ "values%1#0" ] }, - "4460": { + "4481": { "op": "global LatestTimestamp", "defined_out": [ "aggregate%extract%1#0", @@ -41940,7 +41964,7 @@ "tmp%0#1" ] }, - "4462": { + "4483": { "op": "itob", "defined_out": [ "aggregate%extract%1#0", @@ -41961,7 +41985,7 @@ "aggregate%val_as_bytes%8#0" ] }, - "4463": { + "4484": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -41984,7 +42008,7 @@ "0x151f7c75" ] }, - "4464": { + "4485": { "op": "swap", "stack_out": [ "box_prefixed_key%0#0", @@ -41997,7 +42021,7 @@ "aggregate%val_as_bytes%8#0" ] }, - "4465": { + "4486": { "op": "concat", "defined_out": [ "aggregate%extract%1#0", @@ -42018,7 +42042,7 @@ "tmp%3#0" ] }, - "4466": { + "4487": { "op": "log", "stack_out": [ "box_prefixed_key%0#0", @@ -42029,7 +42053,7 @@ "values%1#0" ] }, - "4467": { + "4488": { "op": "intc_1 // 1", "stack_out": [ "box_prefixed_key%0#0", @@ -42041,7 +42065,7 @@ "1" ] }, - "4468": { + "4489": { "op": "return", "stack_out": [ "box_prefixed_key%0#0", @@ -42052,7 +42076,217 @@ "values%1#0" ] }, - "4469": { + "4490": { + "subroutine": "modules.actus_kernel.ActusKernelModule.contract_set_default_status[routing]", + "params": {}, + "block": "contract_set_default_status", + "stack_in": [], + "op": "txna ApplicationArgs 1", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "4493": { + "op": "dup", + "defined_out": [ + "tmp%0#0", + "tmp%0#0 (copy)" + ], + "stack_out": [ + "tmp%0#0", + "tmp%0#0 (copy)" + ] + }, + "4494": { + "op": "len", + "defined_out": [ + "len%0#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "len%0#0" + ] + }, + "4495": { + "op": "intc_1 // 1", + "defined_out": [ + "1", + "len%0#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "len%0#0", + "1" + ] + }, + "4496": { + "op": "==", + "defined_out": [ + "eq%0#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "eq%0#0" + ] + }, + "4497": { + "error": "invalid number of bytes for arc4.bool", + "op": "assert // invalid number of bytes for arc4.bool", + "stack_out": [ + "tmp%0#0" + ] + }, + "4498": { + "op": "intc_0 // 0", + "defined_out": [ + "0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "0" + ] + }, + "4499": { + "op": "getbit", + "defined_out": [ + "defaulted#0" + ], + "stack_out": [ + "defaulted#0" + ] + }, + "4500": { + "op": "bytec 26 // 0x523a54525323", + "defined_out": [ + "0x523a54525323", + "defaulted#0" + ], + "stack_out": [ + "defaulted#0", + "0x523a54525323" + ] + }, + "4502": { + "op": "txn Sender", + "defined_out": [ + "0x523a54525323", + "defaulted#0", + "tmp%0#2" + ], + "stack_out": [ + "defaulted#0", + "0x523a54525323", + "tmp%0#2" + ] + }, + "4504": { + "callsub": "modules.rbac.RbacModule._role_is_active", + "op": "callsub _role_is_active", + "defined_out": [ + "defaulted#0", + "tmp%1#0" + ], + "stack_out": [ + "defaulted#0", + "tmp%1#0" + ] + }, + "4507": { + "error": "Not authorized", + "op": "assert // Not authorized", + "stack_out": [ + "defaulted#0" + ] + }, + "4508": { + "op": "bytec 47 // \"defaulted\"", + "defined_out": [ + "\"defaulted\"", + "defaulted#0" + ], + "stack_out": [ + "defaulted#0", + "\"defaulted\"" + ] + }, + "4510": { + "op": "swap", + "stack_out": [ + "\"defaulted\"", + "defaulted#0" + ] + }, + "4511": { + "op": "app_global_put", + "stack_out": [] + }, + "4512": { + "op": "global LatestTimestamp", + "defined_out": [ + "tmp%0#1" + ], + "stack_out": [ + "tmp%0#1" + ] + }, + "4514": { + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%0#0" + ], + "stack_out": [ + "aggregate%val_as_bytes%0#0" + ] + }, + "4515": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "aggregate%val_as_bytes%0#0" + ], + "stack_out": [ + "aggregate%val_as_bytes%0#0", + "0x151f7c75" + ] + }, + "4516": { + "op": "swap", + "stack_out": [ + "0x151f7c75", + "aggregate%val_as_bytes%0#0" + ] + }, + "4517": { + "op": "concat", + "defined_out": [ + "tmp%4#0" + ], + "stack_out": [ + "tmp%4#0" + ] + }, + "4518": { + "op": "log", + "stack_out": [] + }, + "4519": { + "op": "intc_1 // 1", + "stack_out": [ + "1" + ] + }, + "4520": { + "op": "return", + "stack_out": [] + }, + "4521": { "subroutine": "modules.actus_kernel.ActusKernelModule.contract_get_state[routing]", "params": {}, "block": "contract_get_state", @@ -42065,7 +42299,7 @@ "0" ] }, - "4470": { + "4522": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"", @@ -42076,7 +42310,7 @@ "\"status\"" ] }, - "4471": { + "4523": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -42087,14 +42321,14 @@ "maybe_exists%0#0" ] }, - "4472": { + "4524": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ "maybe_value%0#1" ] }, - "4473": { + "4525": { "op": "dup", "defined_out": [ "maybe_value%0#1", @@ -42105,21 +42339,21 @@ "maybe_value%0#1 (copy)" ] }, - "4474": { + "4526": { "error": "D-ASA not configured", "op": "assert // D-ASA not configured", "stack_out": [ "maybe_value%0#1" ] }, - "4475": { + "4527": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#1", "0" ] }, - "4476": { + "4528": { "op": "bytec 10 // \"contract_type\"", "defined_out": [ "\"contract_type\"", @@ -42132,7 +42366,7 @@ "\"contract_type\"" ] }, - "4478": { + "4530": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -42145,7 +42379,7 @@ "maybe_exists%0#0" ] }, - "4479": { + "4531": { "error": "check self.contract_type exists", "op": "assert // check self.contract_type exists", "stack_out": [ @@ -42153,7 +42387,7 @@ "maybe_value%0#0" ] }, - "4480": { + "4532": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0", @@ -42164,7 +42398,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "4481": { + "4533": { "op": "dup", "defined_out": [ "aggregate%val_as_bytes%0#0", @@ -42177,7 +42411,7 @@ "aggregate%val_as_bytes%0#0 (copy)" ] }, - "4482": { + "4534": { "op": "bitlen", "defined_out": [ "aggregate%bitlen%0#0", @@ -42190,7 +42424,7 @@ "aggregate%bitlen%0#0" ] }, - "4483": { + "4535": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -42205,7 +42439,7 @@ "8" ] }, - "4484": { + "4536": { "op": "<=", "defined_out": [ "aggregate%no_overflow%0#0", @@ -42218,7 +42452,7 @@ "aggregate%no_overflow%0#0" ] }, - "4485": { + "4537": { "error": "overflow", "op": "assert // overflow", "stack_out": [ @@ -42226,7 +42460,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "4486": { + "4538": { "op": "extract 7 1", "defined_out": [ "aggregate%uint8%0#0", @@ -42237,7 +42471,7 @@ "aggregate%uint8%0#0" ] }, - "4489": { + "4541": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#1", @@ -42245,7 +42479,7 @@ "0" ] }, - "4490": { + "4542": { "op": "bytec 13 // \"total_units\"", "defined_out": [ "\"total_units\"", @@ -42260,7 +42494,7 @@ "\"total_units\"" ] }, - "4492": { + "4544": { "op": "app_global_get_ex", "defined_out": [ "aggregate%uint8%0#0", @@ -42275,7 +42509,7 @@ "maybe_exists%2#0" ] }, - "4493": { + "4545": { "error": "check self.total_units exists", "op": "assert // check self.total_units exists", "stack_out": [ @@ -42284,7 +42518,7 @@ "maybe_value%2#0" ] }, - "4494": { + "4546": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#1", @@ -42293,7 +42527,7 @@ "0" ] }, - "4495": { + "4547": { "op": "bytec 11 // \"reserved_units_total\"", "defined_out": [ "\"reserved_units_total\"", @@ -42310,7 +42544,7 @@ "\"reserved_units_total\"" ] }, - "4497": { + "4549": { "op": "app_global_get_ex", "defined_out": [ "aggregate%uint8%0#0", @@ -42327,7 +42561,7 @@ "maybe_exists%3#0" ] }, - "4498": { + "4550": { "error": "check self.reserved_units_total exists", "op": "assert // check self.reserved_units_total exists", "stack_out": [ @@ -42337,7 +42571,7 @@ "maybe_value%3#0" ] }, - "4499": { + "4551": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#1", @@ -42347,7 +42581,7 @@ "0" ] }, - "4500": { + "4552": { "op": "bytec 20 // \"initial_exchange_amount\"", "defined_out": [ "\"initial_exchange_amount\"", @@ -42366,7 +42600,7 @@ "\"initial_exchange_amount\"" ] }, - "4502": { + "4554": { "op": "app_global_get_ex", "defined_out": [ "aggregate%uint8%0#0", @@ -42385,7 +42619,7 @@ "maybe_exists%4#0" ] }, - "4503": { + "4555": { "error": "check self.initial_exchange_amount exists", "op": "assert // check self.initial_exchange_amount exists", "stack_out": [ @@ -42396,7 +42630,7 @@ "maybe_value%4#0" ] }, - "4504": { + "4556": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#1", @@ -42407,7 +42641,7 @@ "0" ] }, - "4505": { + "4557": { "op": "bytec_2 // \"event_cursor\"", "defined_out": [ "\"event_cursor\"", @@ -42428,7 +42662,7 @@ "\"event_cursor\"" ] }, - "4506": { + "4558": { "op": "app_global_get_ex", "defined_out": [ "aggregate%uint8%0#0", @@ -42449,7 +42683,7 @@ "maybe_exists%5#0" ] }, - "4507": { + "4559": { "error": "check self.event_cursor exists", "op": "assert // check self.event_cursor exists", "stack_out": [ @@ -42461,7 +42695,7 @@ "maybe_value%5#0" ] }, - "4508": { + "4560": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#1", @@ -42473,7 +42707,7 @@ "0" ] }, - "4509": { + "4561": { "op": "bytec_3 // \"schedule_entry_count\"", "defined_out": [ "\"schedule_entry_count\"", @@ -42496,7 +42730,7 @@ "\"schedule_entry_count\"" ] }, - "4510": { + "4562": { "op": "app_global_get_ex", "defined_out": [ "aggregate%uint8%0#0", @@ -42519,7 +42753,7 @@ "maybe_exists%6#0" ] }, - "4511": { + "4563": { "error": "check self.schedule_entry_count exists", "op": "assert // check self.schedule_entry_count exists", "stack_out": [ @@ -42532,7 +42766,7 @@ "maybe_value%6#0" ] }, - "4512": { + "4564": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#1", @@ -42545,7 +42779,7 @@ "0" ] }, - "4513": { + "4565": { "op": "bytec 4 // \"outstanding_principal\"", "defined_out": [ "\"outstanding_principal\"", @@ -42570,7 +42804,7 @@ "\"outstanding_principal\"" ] }, - "4515": { + "4567": { "op": "app_global_get_ex", "defined_out": [ "aggregate%uint8%0#0", @@ -42595,7 +42829,7 @@ "maybe_exists%7#0" ] }, - "4516": { + "4568": { "error": "check self.outstanding_principal exists", "op": "assert // check self.outstanding_principal exists", "stack_out": [ @@ -42609,7 +42843,7 @@ "maybe_value%7#0" ] }, - "4517": { + "4569": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#1", @@ -42623,7 +42857,7 @@ "0" ] }, - "4518": { + "4570": { "op": "bytec 7 // \"interest_calculation_base\"", "defined_out": [ "\"interest_calculation_base\"", @@ -42650,7 +42884,7 @@ "\"interest_calculation_base\"" ] }, - "4520": { + "4572": { "op": "app_global_get_ex", "defined_out": [ "aggregate%uint8%0#0", @@ -42677,7 +42911,7 @@ "maybe_exists%8#0" ] }, - "4521": { + "4573": { "error": "check self.interest_calculation_base exists", "op": "assert // check self.interest_calculation_base exists", "stack_out": [ @@ -42692,7 +42926,7 @@ "maybe_value%8#0" ] }, - "4522": { + "4574": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#1", @@ -42707,7 +42941,7 @@ "0" ] }, - "4523": { + "4575": { "op": "bytec 9 // \"nominal_interest_rate\"", "defined_out": [ "\"nominal_interest_rate\"", @@ -42736,7 +42970,7 @@ "\"nominal_interest_rate\"" ] }, - "4525": { + "4577": { "op": "app_global_get_ex", "defined_out": [ "aggregate%uint8%0#0", @@ -42765,7 +42999,7 @@ "maybe_exists%9#0" ] }, - "4526": { + "4578": { "error": "check self.nominal_interest_rate exists", "op": "assert // check self.nominal_interest_rate exists", "stack_out": [ @@ -42781,7 +43015,7 @@ "maybe_value%9#0" ] }, - "4527": { + "4579": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#1", @@ -42797,7 +43031,7 @@ "0" ] }, - "4528": { + "4580": { "op": "bytec 6 // \"accrued_interest\"", "defined_out": [ "\"accrued_interest\"", @@ -42828,7 +43062,7 @@ "\"accrued_interest\"" ] }, - "4530": { + "4582": { "op": "app_global_get_ex", "defined_out": [ "aggregate%uint8%0#0", @@ -42859,7 +43093,7 @@ "maybe_exists%10#0" ] }, - "4531": { + "4583": { "error": "check self.accrued_interest exists", "op": "assert // check self.accrued_interest exists", "stack_out": [ @@ -42876,7 +43110,7 @@ "maybe_value%10#0" ] }, - "4532": { + "4584": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#1", @@ -42893,7 +43127,7 @@ "0" ] }, - "4533": { + "4585": { "op": "bytec 16 // \"cumulative_interest_index\"", "defined_out": [ "\"cumulative_interest_index\"", @@ -42926,7 +43160,7 @@ "\"cumulative_interest_index\"" ] }, - "4535": { + "4587": { "op": "app_global_get_ex", "defined_out": [ "aggregate%uint8%0#0", @@ -42959,7 +43193,7 @@ "maybe_exists%11#0" ] }, - "4536": { + "4588": { "error": "check self.cumulative_interest_index exists", "op": "assert // check self.cumulative_interest_index exists", "stack_out": [ @@ -42977,7 +43211,7 @@ "maybe_value%11#0" ] }, - "4537": { + "4589": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#1", @@ -42995,7 +43229,7 @@ "0" ] }, - "4538": { + "4590": { "op": "bytec 17 // \"cumulative_principal_index\"", "defined_out": [ "\"cumulative_principal_index\"", @@ -43030,7 +43264,7 @@ "\"cumulative_principal_index\"" ] }, - "4540": { + "4592": { "op": "app_global_get_ex", "defined_out": [ "aggregate%uint8%0#0", @@ -43065,7 +43299,7 @@ "maybe_exists%12#0" ] }, - "4541": { + "4593": { "error": "check self.cumulative_principal_index exists", "op": "assert // check self.cumulative_principal_index exists", "stack_out": [ @@ -43084,7 +43318,7 @@ "maybe_value%12#0" ] }, - "4542": { + "4594": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#1", @@ -43103,7 +43337,7 @@ "0" ] }, - "4543": { + "4595": { "op": "bytec 15 // \"reserved_interest\"", "defined_out": [ "\"reserved_interest\"", @@ -43140,7 +43374,7 @@ "\"reserved_interest\"" ] }, - "4545": { + "4597": { "op": "app_global_get_ex", "defined_out": [ "aggregate%uint8%0#0", @@ -43177,7 +43411,7 @@ "maybe_exists%13#0" ] }, - "4546": { + "4598": { "error": "check self.reserved_interest exists", "op": "assert // check self.reserved_interest exists", "stack_out": [ @@ -43197,7 +43431,7 @@ "maybe_value%13#0" ] }, - "4547": { + "4599": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#1", @@ -43217,7 +43451,7 @@ "0" ] }, - "4548": { + "4600": { "op": "bytec 12 // \"reserved_principal\"", "defined_out": [ "\"reserved_principal\"", @@ -43256,7 +43490,7 @@ "\"reserved_principal\"" ] }, - "4550": { + "4602": { "op": "app_global_get_ex", "defined_out": [ "aggregate%uint8%0#0", @@ -43295,7 +43529,7 @@ "maybe_exists%14#0" ] }, - "4551": { + "4603": { "error": "check self.reserved_principal exists", "op": "assert // check self.reserved_principal exists", "stack_out": [ @@ -43316,7 +43550,7 @@ "maybe_value%14#0" ] }, - "4552": { + "4604": { "op": "uncover 14", "stack_out": [ "aggregate%uint8%0#0", @@ -43336,7 +43570,7 @@ "maybe_value%0#1" ] }, - "4554": { + "4606": { "op": "itob", "defined_out": [ "aggregate%uint8%0#0", @@ -43373,7 +43607,7 @@ "aggregate%val_as_bytes%1#0" ] }, - "4555": { + "4607": { "op": "uncover 14", "stack_out": [ "maybe_value%2#0", @@ -43393,7 +43627,7 @@ "aggregate%uint8%0#0" ] }, - "4557": { + "4609": { "op": "swap", "stack_out": [ "maybe_value%2#0", @@ -43413,7 +43647,7 @@ "aggregate%val_as_bytes%1#0" ] }, - "4558": { + "4610": { "op": "concat", "defined_out": [ "aggregate%head%1#0", @@ -43448,7 +43682,7 @@ "aggregate%head%1#0" ] }, - "4559": { + "4611": { "op": "uncover 13", "stack_out": [ "maybe_value%3#0", @@ -43467,7 +43701,7 @@ "maybe_value%2#0" ] }, - "4561": { + "4613": { "op": "itob", "defined_out": [ "aggregate%head%1#0", @@ -43502,7 +43736,7 @@ "aggregate%val_as_bytes%2#0" ] }, - "4562": { + "4614": { "op": "concat", "defined_out": [ "aggregate%head%2#0", @@ -43535,7 +43769,7 @@ "aggregate%head%2#0" ] }, - "4563": { + "4615": { "op": "uncover 12", "stack_out": [ "maybe_value%4#0", @@ -43553,7 +43787,7 @@ "maybe_value%3#0" ] }, - "4565": { + "4617": { "op": "itob", "defined_out": [ "aggregate%head%2#0", @@ -43586,7 +43820,7 @@ "aggregate%val_as_bytes%3#0" ] }, - "4566": { + "4618": { "op": "concat", "defined_out": [ "aggregate%head%3#0", @@ -43617,7 +43851,7 @@ "aggregate%head%3#0" ] }, - "4567": { + "4619": { "op": "uncover 11", "stack_out": [ "maybe_value%5#0", @@ -43634,7 +43868,7 @@ "maybe_value%4#0" ] }, - "4569": { + "4621": { "op": "itob", "defined_out": [ "aggregate%head%3#0", @@ -43665,7 +43899,7 @@ "aggregate%val_as_bytes%4#0" ] }, - "4570": { + "4622": { "op": "concat", "defined_out": [ "aggregate%head%4#0", @@ -43694,7 +43928,7 @@ "aggregate%head%4#0" ] }, - "4571": { + "4623": { "op": "uncover 10", "stack_out": [ "maybe_value%6#0", @@ -43710,7 +43944,7 @@ "maybe_value%5#0" ] }, - "4573": { + "4625": { "op": "itob", "defined_out": [ "aggregate%head%4#0", @@ -43739,7 +43973,7 @@ "aggregate%val_as_bytes%5#0" ] }, - "4574": { + "4626": { "op": "concat", "defined_out": [ "aggregate%head%5#0", @@ -43766,7 +44000,7 @@ "aggregate%head%5#0" ] }, - "4575": { + "4627": { "op": "uncover 9", "stack_out": [ "maybe_value%7#0", @@ -43781,7 +44015,7 @@ "maybe_value%6#0" ] }, - "4577": { + "4629": { "op": "itob", "defined_out": [ "aggregate%head%5#0", @@ -43808,7 +44042,7 @@ "aggregate%val_as_bytes%6#0" ] }, - "4578": { + "4630": { "op": "concat", "defined_out": [ "aggregate%head%6#0", @@ -43833,7 +44067,7 @@ "aggregate%head%6#0" ] }, - "4579": { + "4631": { "op": "uncover 8", "stack_out": [ "maybe_value%8#0", @@ -43847,7 +44081,7 @@ "maybe_value%7#0" ] }, - "4581": { + "4633": { "op": "itob", "defined_out": [ "aggregate%head%6#0", @@ -43872,7 +44106,7 @@ "aggregate%val_as_bytes%7#0" ] }, - "4582": { + "4634": { "op": "concat", "defined_out": [ "aggregate%head%7#0", @@ -43895,7 +44129,7 @@ "aggregate%head%7#0" ] }, - "4583": { + "4635": { "op": "uncover 7", "stack_out": [ "maybe_value%9#0", @@ -43908,7 +44142,7 @@ "maybe_value%8#0" ] }, - "4585": { + "4637": { "op": "itob", "defined_out": [ "aggregate%head%7#0", @@ -43931,7 +44165,7 @@ "aggregate%val_as_bytes%8#0" ] }, - "4586": { + "4638": { "op": "concat", "defined_out": [ "aggregate%head%8#0", @@ -43952,7 +44186,7 @@ "aggregate%head%8#0" ] }, - "4587": { + "4639": { "op": "uncover 6", "stack_out": [ "maybe_value%10#0", @@ -43964,7 +44198,7 @@ "maybe_value%9#0" ] }, - "4589": { + "4641": { "op": "itob", "defined_out": [ "aggregate%head%8#0", @@ -43985,7 +44219,7 @@ "aggregate%val_as_bytes%9#0" ] }, - "4590": { + "4642": { "op": "concat", "defined_out": [ "aggregate%head%9#0", @@ -44004,7 +44238,7 @@ "aggregate%head%9#0" ] }, - "4591": { + "4643": { "op": "uncover 5", "stack_out": [ "maybe_value%11#0", @@ -44015,7 +44249,7 @@ "maybe_value%10#0" ] }, - "4593": { + "4645": { "op": "itob", "defined_out": [ "aggregate%head%9#0", @@ -44034,7 +44268,7 @@ "aggregate%val_as_bytes%10#0" ] }, - "4594": { + "4646": { "op": "concat", "defined_out": [ "aggregate%head%10#0", @@ -44051,7 +44285,7 @@ "aggregate%head%10#0" ] }, - "4595": { + "4647": { "op": "uncover 4", "stack_out": [ "maybe_value%12#0", @@ -44061,7 +44295,7 @@ "maybe_value%11#0" ] }, - "4597": { + "4649": { "op": "itob", "defined_out": [ "aggregate%head%10#0", @@ -44078,7 +44312,7 @@ "aggregate%val_as_bytes%11#0" ] }, - "4598": { + "4650": { "op": "concat", "defined_out": [ "aggregate%head%11#0", @@ -44093,7 +44327,7 @@ "aggregate%head%11#0" ] }, - "4599": { + "4651": { "op": "uncover 3", "stack_out": [ "maybe_value%13#0", @@ -44102,7 +44336,7 @@ "maybe_value%12#0" ] }, - "4601": { + "4653": { "op": "itob", "defined_out": [ "aggregate%head%11#0", @@ -44117,7 +44351,7 @@ "aggregate%val_as_bytes%12#0" ] }, - "4602": { + "4654": { "op": "concat", "defined_out": [ "aggregate%head%12#0", @@ -44130,7 +44364,7 @@ "aggregate%head%12#0" ] }, - "4603": { + "4655": { "op": "uncover 2", "stack_out": [ "maybe_value%14#0", @@ -44138,7 +44372,7 @@ "maybe_value%13#0" ] }, - "4605": { + "4657": { "op": "itob", "defined_out": [ "aggregate%head%12#0", @@ -44151,7 +44385,7 @@ "aggregate%val_as_bytes%13#0" ] }, - "4606": { + "4658": { "op": "concat", "defined_out": [ "aggregate%head%13#0", @@ -44162,14 +44396,14 @@ "aggregate%head%13#0" ] }, - "4607": { + "4659": { "op": "swap", "stack_out": [ "aggregate%head%13#0", "maybe_value%14#0" ] }, - "4608": { + "4660": { "op": "itob", "defined_out": [ "aggregate%head%13#0", @@ -44180,7 +44414,7 @@ "aggregate%val_as_bytes%14#0" ] }, - "4609": { + "4661": { "op": "concat", "defined_out": [ "aggregate%head%14#0" @@ -44189,7 +44423,7 @@ "aggregate%head%14#0" ] }, - "4610": { + "4662": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -44200,14 +44434,14 @@ "0x151f7c75" ] }, - "4611": { + "4663": { "op": "swap", "stack_out": [ "0x151f7c75", "aggregate%head%14#0" ] }, - "4612": { + "4664": { "op": "concat", "defined_out": [ "tmp%1#0" @@ -44216,11 +44450,11 @@ "tmp%1#0" ] }, - "4613": { + "4665": { "op": "log", "stack_out": [] }, - "4614": { + "4666": { "op": "intc_1 // 1", "defined_out": [ "1" @@ -44229,11 +44463,11 @@ "1" ] }, - "4615": { + "4667": { "op": "return", "stack_out": [] }, - "4616": { + "4668": { "subroutine": "modules.actus_kernel.ActusKernelModule.contract_get_next_due_event[routing]", "params": {}, "block": "contract_get_next_due_event", @@ -44246,7 +44480,7 @@ "0" ] }, - "4617": { + "4669": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"", @@ -44257,7 +44491,7 @@ "\"status\"" ] }, - "4618": { + "4670": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -44268,25 +44502,25 @@ "maybe_exists%0#0" ] }, - "4619": { + "4671": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ "maybe_value%0#0" ] }, - "4620": { + "4672": { "error": "D-ASA not configured", "op": "assert // D-ASA not configured", "stack_out": [] }, - "4621": { + "4673": { "op": "intc_0 // 0", "stack_out": [ "0" ] }, - "4622": { + "4674": { "op": "bytec_2 // \"event_cursor\"", "defined_out": [ "\"event_cursor\"", @@ -44297,28 +44531,28 @@ "\"event_cursor\"" ] }, - "4623": { + "4675": { "op": "app_global_get_ex", "stack_out": [ "maybe_value%0#0", "maybe_exists%0#0" ] }, - "4624": { + "4676": { "error": "check self.event_cursor exists", "op": "assert // check self.event_cursor exists", "stack_out": [ "maybe_value%0#0" ] }, - "4625": { + "4677": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#0", "0" ] }, - "4626": { + "4678": { "op": "bytec_3 // \"schedule_entry_count\"", "defined_out": [ "\"schedule_entry_count\"", @@ -44331,7 +44565,7 @@ "\"schedule_entry_count\"" ] }, - "4627": { + "4679": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%1#0", @@ -44344,7 +44578,7 @@ "maybe_exists%1#0" ] }, - "4628": { + "4680": { "error": "check self.schedule_entry_count exists", "op": "assert // check self.schedule_entry_count exists", "stack_out": [ @@ -44352,7 +44586,7 @@ "maybe_value%1#0" ] }, - "4629": { + "4681": { "op": ">=", "defined_out": [ "tmp%0#1" @@ -44361,24 +44595,24 @@ "tmp%0#1" ] }, - "4630": { + "4682": { "op": "bz contract_get_next_due_event_after_if_else@3", "stack_out": [] }, - "4633": { + "4685": { "op": "intc_0 // 0", "stack_out": [ "0" ] }, - "4634": { + "4686": { "op": "bytec_2 // \"event_cursor\"", "stack_out": [ "0", "\"event_cursor\"" ] }, - "4635": { + "4687": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%2#0", @@ -44389,14 +44623,14 @@ "maybe_exists%2#0" ] }, - "4636": { + "4688": { "error": "check self.event_cursor exists", "op": "assert // check self.event_cursor exists", "stack_out": [ "maybe_value%2#0" ] }, - "4637": { + "4689": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0" @@ -44405,7 +44639,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "4638": { + "4690": { "op": "bytec 40 // 0x00", "defined_out": [ "0x00", @@ -44416,7 +44650,7 @@ "0x00" ] }, - "4640": { + "4692": { "op": "concat", "defined_out": [ "aggregate%head%1#0" @@ -44425,14 +44659,14 @@ "aggregate%head%1#0" ] }, - "4641": { + "4693": { "op": "intc_0 // 0", "stack_out": [ "aggregate%head%1#0", "0" ] }, - "4642": { + "4694": { "op": "itob", "defined_out": [ "aggregate%head%1#0", @@ -44443,14 +44677,14 @@ "aggregate%val_as_bytes%1#0" ] }, - "4643": { + "4695": { "op": "swap", "stack_out": [ "aggregate%val_as_bytes%1#0", "aggregate%head%1#0" ] }, - "4644": { + "4696": { "op": "dig 1", "defined_out": [ "aggregate%head%1#0", @@ -44463,7 +44697,7 @@ "aggregate%val_as_bytes%1#0 (copy)" ] }, - "4646": { + "4698": { "op": "concat", "defined_out": [ "aggregate%head%2#0", @@ -44474,7 +44708,7 @@ "aggregate%head%2#0" ] }, - "4647": { + "4699": { "op": "dig 1", "stack_out": [ "aggregate%val_as_bytes%1#0", @@ -44482,7 +44716,7 @@ "aggregate%val_as_bytes%1#0 (copy)" ] }, - "4649": { + "4701": { "op": "concat", "defined_out": [ "aggregate%head%3#0", @@ -44493,7 +44727,7 @@ "aggregate%head%3#0" ] }, - "4650": { + "4702": { "op": "dig 1", "stack_out": [ "aggregate%val_as_bytes%1#0", @@ -44501,7 +44735,7 @@ "aggregate%val_as_bytes%1#0 (copy)" ] }, - "4652": { + "4704": { "op": "concat", "defined_out": [ "aggregate%head%4#0", @@ -44512,7 +44746,7 @@ "aggregate%head%4#0" ] }, - "4653": { + "4705": { "op": "dig 1", "stack_out": [ "aggregate%val_as_bytes%1#0", @@ -44520,7 +44754,7 @@ "aggregate%val_as_bytes%1#0 (copy)" ] }, - "4655": { + "4707": { "op": "concat", "defined_out": [ "aggregate%head%5#0", @@ -44531,7 +44765,7 @@ "aggregate%head%5#0" ] }, - "4656": { + "4708": { "op": "dig 1", "stack_out": [ "aggregate%val_as_bytes%1#0", @@ -44539,7 +44773,7 @@ "aggregate%val_as_bytes%1#0 (copy)" ] }, - "4658": { + "4710": { "op": "concat", "defined_out": [ "aggregate%head%6#0", @@ -44550,7 +44784,7 @@ "aggregate%head%6#0" ] }, - "4659": { + "4711": { "op": "dig 1", "stack_out": [ "aggregate%val_as_bytes%1#0", @@ -44558,7 +44792,7 @@ "aggregate%val_as_bytes%1#0 (copy)" ] }, - "4661": { + "4713": { "op": "concat", "defined_out": [ "aggregate%head%7#0", @@ -44569,14 +44803,14 @@ "aggregate%head%7#0" ] }, - "4662": { + "4714": { "op": "swap", "stack_out": [ "aggregate%head%7#0", "aggregate%val_as_bytes%1#0" ] }, - "4663": { + "4715": { "op": "concat", "defined_out": [ "tmp%0#0" @@ -44585,7 +44819,7 @@ "tmp%0#0" ] }, - "4664": { + "4716": { "block": "contract_get_next_due_event_after_inlined_modules.actus_kernel.ActusKernelModule.contract_get_next_due_event@4", "stack_in": [ "tmp%0#0" @@ -44599,7 +44833,7 @@ "0x151f7c75" ] }, - "4665": { + "4717": { "op": "swap", "defined_out": [ "0x151f7c75", @@ -44610,7 +44844,7 @@ "tmp%0#0" ] }, - "4666": { + "4718": { "op": "concat", "defined_out": [ "tmp%1#0" @@ -44619,11 +44853,11 @@ "tmp%1#0" ] }, - "4667": { + "4719": { "op": "log", "stack_out": [] }, - "4668": { + "4720": { "op": "intc_1 // 1", "defined_out": [ "1" @@ -44632,11 +44866,11 @@ "1" ] }, - "4669": { + "4721": { "op": "return", "stack_out": [] }, - "4670": { + "4722": { "block": "contract_get_next_due_event_after_if_else@3", "stack_in": [], "op": "intc_0 // 0", @@ -44647,7 +44881,7 @@ "0" ] }, - "4671": { + "4723": { "op": "bytec_2 // \"event_cursor\"", "defined_out": [ "\"event_cursor\"", @@ -44658,7 +44892,7 @@ "\"event_cursor\"" ] }, - "4672": { + "4724": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%3#0", @@ -44669,14 +44903,14 @@ "maybe_exists%3#0" ] }, - "4673": { + "4725": { "error": "check self.event_cursor exists", "op": "assert // check self.event_cursor exists", "stack_out": [ "maybe_value%3#0" ] }, - "4674": { + "4726": { "callsub": "modules.actus_kernel.ActusKernelModule._get_schedule_entry", "op": "callsub _get_schedule_entry", "defined_out": [ @@ -44686,10 +44920,10 @@ "tmp%0#0" ] }, - "4677": { + "4729": { "op": "b contract_get_next_due_event_after_inlined_modules.actus_kernel.ActusKernelModule.contract_get_next_due_event@4" }, - "4680": { + "4732": { "subroutine": "modules.rbac.RbacModule.contract_update[routing]", "params": {}, "block": "contract_update", @@ -44697,7 +44931,7 @@ "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", "op": "callsub _assert_caller_is_arranger" }, - "4683": { + "4735": { "op": "intc_1 // 1", "defined_out": [ "1" @@ -44706,11 +44940,11 @@ "1" ] }, - "4684": { + "4736": { "op": "return", "stack_out": [] }, - "4685": { + "4737": { "subroutine": "modules.rbac.RbacModule.rbac_rotate_arranger[routing]", "params": {}, "block": "rbac_rotate_arranger", @@ -44723,7 +44957,7 @@ "new_arranger#0" ] }, - "4688": { + "4740": { "op": "dup", "defined_out": [ "new_arranger#0", @@ -44734,7 +44968,7 @@ "new_arranger#0 (copy)" ] }, - "4689": { + "4741": { "op": "len", "defined_out": [ "len%0#0", @@ -44745,7 +44979,7 @@ "len%0#0" ] }, - "4690": { + "4742": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -44758,7 +44992,7 @@ "32" ] }, - "4691": { + "4743": { "op": "==", "defined_out": [ "eq%0#0", @@ -44769,18 +45003,18 @@ "eq%0#0" ] }, - "4692": { + "4744": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ "new_arranger#0" ] }, - "4693": { + "4745": { "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", "op": "callsub _assert_caller_is_arranger" }, - "4696": { + "4748": { "op": "bytec 18 // 0x523a41525223", "defined_out": [ "0x523a41525223", @@ -44791,18 +45025,18 @@ "0x523a41525223" ] }, - "4698": { + "4750": { "op": "swap", "stack_out": [ "0x523a41525223", "new_arranger#0" ] }, - "4699": { + "4751": { "op": "app_global_put", "stack_out": [] }, - "4700": { + "4752": { "op": "global LatestTimestamp", "defined_out": [ "tmp%0#1" @@ -44811,7 +45045,7 @@ "tmp%0#1" ] }, - "4702": { + "4754": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0" @@ -44820,7 +45054,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "4703": { + "4755": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -44831,14 +45065,14 @@ "0x151f7c75" ] }, - "4704": { + "4756": { "op": "swap", "stack_out": [ "0x151f7c75", "aggregate%val_as_bytes%0#0" ] }, - "4705": { + "4757": { "op": "concat", "defined_out": [ "tmp%4#0" @@ -44847,11 +45081,11 @@ "tmp%4#0" ] }, - "4706": { + "4758": { "op": "log", "stack_out": [] }, - "4707": { + "4759": { "op": "intc_1 // 1", "defined_out": [ "1" @@ -44860,11 +45094,11 @@ "1" ] }, - "4708": { + "4760": { "op": "return", "stack_out": [] }, - "4709": { + "4761": { "subroutine": "modules.rbac.RbacModule.rbac_set_op_daemon[routing]", "params": {}, "block": "rbac_set_op_daemon", @@ -44877,7 +45111,7 @@ "address#0" ] }, - "4712": { + "4764": { "op": "dup", "defined_out": [ "address#0", @@ -44888,7 +45122,7 @@ "address#0 (copy)" ] }, - "4713": { + "4765": { "op": "len", "defined_out": [ "address#0", @@ -44899,7 +45133,7 @@ "len%0#0" ] }, - "4714": { + "4766": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -44912,7 +45146,7 @@ "32" ] }, - "4715": { + "4767": { "op": "==", "defined_out": [ "address#0", @@ -44923,19 +45157,19 @@ "eq%0#0" ] }, - "4716": { + "4768": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ "address#0" ] }, - "4717": { + "4769": { "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", "op": "callsub _assert_caller_is_arranger" }, - "4720": { - "op": "bytec 26 // 0x523a4f504423", + "4772": { + "op": "bytec 27 // 0x523a4f504423", "defined_out": [ "0x523a4f504423", "address#0" @@ -44945,18 +45179,18 @@ "0x523a4f504423" ] }, - "4722": { + "4774": { "op": "swap", "stack_out": [ "0x523a4f504423", "address#0" ] }, - "4723": { + "4775": { "op": "app_global_put", "stack_out": [] }, - "4724": { + "4776": { "op": "global LatestTimestamp", "defined_out": [ "tmp%0#1" @@ -44965,7 +45199,7 @@ "tmp%0#1" ] }, - "4726": { + "4778": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0" @@ -44974,7 +45208,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "4727": { + "4779": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -44985,14 +45219,14 @@ "0x151f7c75" ] }, - "4728": { + "4780": { "op": "swap", "stack_out": [ "0x151f7c75", "aggregate%val_as_bytes%0#0" ] }, - "4729": { + "4781": { "op": "concat", "defined_out": [ "tmp%4#0" @@ -45001,11 +45235,11 @@ "tmp%4#0" ] }, - "4730": { + "4782": { "op": "log", "stack_out": [] }, - "4731": { + "4783": { "op": "intc_1 // 1", "defined_out": [ "1" @@ -45014,11 +45248,11 @@ "1" ] }, - "4732": { + "4784": { "op": "return", "stack_out": [] }, - "4733": { + "4785": { "subroutine": "modules.rbac.RbacModule.rbac_assign_role[routing]", "params": {}, "block": "rbac_assign_role", @@ -45031,7 +45265,7 @@ "role_id#0" ] }, - "4736": { + "4788": { "op": "dup", "defined_out": [ "role_id#0", @@ -45042,7 +45276,7 @@ "role_id#0 (copy)" ] }, - "4737": { + "4789": { "op": "len", "defined_out": [ "len%0#0", @@ -45053,7 +45287,7 @@ "len%0#0" ] }, - "4738": { + "4790": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -45066,7 +45300,7 @@ "1" ] }, - "4739": { + "4791": { "op": "==", "defined_out": [ "eq%0#0", @@ -45077,17 +45311,17 @@ "eq%0#0" ] }, - "4740": { + "4792": { "error": "invalid number of bytes for arc4.uint8", "op": "assert // invalid number of bytes for arc4.uint8", "stack_out": [ "role_id#0" ] }, - "4741": { + "4793": { "op": "txna ApplicationArgs 2" }, - "4744": { + "4796": { "op": "dup", "defined_out": [ "role_address#0", @@ -45099,7 +45333,7 @@ "role_address#0" ] }, - "4745": { + "4797": { "op": "cover 2", "defined_out": [ "role_address#0", @@ -45111,7 +45345,7 @@ "role_address#0" ] }, - "4747": { + "4799": { "op": "len", "defined_out": [ "len%1#0", @@ -45124,7 +45358,7 @@ "len%1#0" ] }, - "4748": { + "4800": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -45139,7 +45373,7 @@ "32" ] }, - "4749": { + "4801": { "op": "==", "defined_out": [ "eq%1#0", @@ -45152,7 +45386,7 @@ "eq%1#0" ] }, - "4750": { + "4802": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ @@ -45160,10 +45394,10 @@ "role_id#0" ] }, - "4751": { + "4803": { "op": "txna ApplicationArgs 3" }, - "4754": { + "4806": { "op": "dup", "defined_out": [ "role_address#0", @@ -45177,7 +45411,7 @@ "validity#0" ] }, - "4755": { + "4807": { "op": "cover 2", "defined_out": [ "role_address#0", @@ -45191,7 +45425,7 @@ "validity#0" ] }, - "4757": { + "4809": { "op": "len", "defined_out": [ "len%2#0", @@ -45206,7 +45440,7 @@ "len%2#0" ] }, - "4758": { + "4810": { "op": "pushint 16", "defined_out": [ "16", @@ -45223,7 +45457,7 @@ "16" ] }, - "4760": { + "4812": { "op": "==", "defined_out": [ "eq%2#0", @@ -45238,7 +45472,7 @@ "eq%2#0" ] }, - "4761": { + "4813": { "error": "invalid number of bytes for smart_contracts.abi_types.RoleValidity", "op": "assert // invalid number of bytes for smart_contracts.abi_types.RoleValidity", "stack_out": [ @@ -45247,15 +45481,15 @@ "role_id#0" ] }, - "4762": { + "4814": { "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", "op": "callsub _assert_caller_is_arranger" }, - "4765": { + "4817": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", "op": "callsub _assert_is_not_asset_defaulted" }, - "4768": { + "4820": { "op": "btoi", "defined_out": [ "role_address#0", @@ -45268,7 +45502,7 @@ "role_id#1" ] }, - "4769": { + "4821": { "op": "dupn 2", "defined_out": [ "role_address#0", @@ -45284,7 +45518,7 @@ "role_id#1 (copy)" ] }, - "4771": { + "4823": { "callsub": "modules.rbac.RbacModule._assert_valid_role", "op": "callsub _assert_valid_role", "stack_out": [ @@ -45294,7 +45528,7 @@ "role_id#1" ] }, - "4774": { + "4826": { "op": "pushint 20", "defined_out": [ "20", @@ -45310,7 +45544,7 @@ "20" ] }, - "4776": { + "4828": { "op": "==", "defined_out": [ "role_address#0", @@ -45325,7 +45559,7 @@ "tmp%0#2" ] }, - "4777": { + "4829": { "op": "bz rbac_assign_role_after_if_else@3", "stack_out": [ "role_address#0", @@ -45333,7 +45567,7 @@ "role_id#1" ] }, - "4780": { + "4832": { "op": "bytec 18 // 0x523a41525223", "defined_out": [ "0x523a41525223", @@ -45348,7 +45582,7 @@ "0x523a41525223" ] }, - "4782": { + "4834": { "op": "dig 3", "stack_out": [ "role_address#0", @@ -45358,7 +45592,7 @@ "role_address#0" ] }, - "4784": { + "4836": { "op": "app_global_put", "stack_out": [ "role_address#0", @@ -45366,7 +45600,7 @@ "role_id#1" ] }, - "4785": { + "4837": { "block": "rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14", "stack_in": [ "role_address#0", @@ -45384,7 +45618,7 @@ "tmp%2#1" ] }, - "4787": { + "4839": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0" @@ -45396,7 +45630,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "4788": { + "4840": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -45410,7 +45644,7 @@ "0x151f7c75" ] }, - "4789": { + "4841": { "op": "swap", "stack_out": [ "role_address#0", @@ -45420,7 +45654,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "4790": { + "4842": { "op": "concat", "defined_out": [ "tmp%6#0" @@ -45432,7 +45666,7 @@ "tmp%6#0" ] }, - "4791": { + "4843": { "op": "log", "stack_out": [ "role_address#0", @@ -45440,7 +45674,7 @@ "role_id#1" ] }, - "4792": { + "4844": { "op": "intc_1 // 1", "defined_out": [ "1" @@ -45452,7 +45686,7 @@ "1" ] }, - "4793": { + "4845": { "op": "return", "stack_out": [ "role_address#0", @@ -45460,7 +45694,7 @@ "role_id#1" ] }, - "4794": { + "4846": { "block": "rbac_assign_role_after_if_else@3", "stack_in": [ "role_address#0", @@ -45478,7 +45712,7 @@ "role_id#1" ] }, - "4795": { + "4847": { "op": "pushint 40", "defined_out": [ "40", @@ -45492,7 +45726,7 @@ "40" ] }, - "4797": { + "4849": { "op": "==", "defined_out": [ "role_id#1", @@ -45505,7 +45739,7 @@ "tmp%1#1" ] }, - "4798": { + "4850": { "op": "bz rbac_assign_role_after_if_else@5", "stack_out": [ "role_address#0", @@ -45513,7 +45747,7 @@ "role_id#1" ] }, - "4801": { + "4853": { "op": "bytec 23 // 0x523a4d4e4723", "defined_out": [ "0x523a4d4e4723", @@ -45526,7 +45760,7 @@ "0x523a4d4e4723" ] }, - "4803": { + "4855": { "op": "dig 3", "defined_out": [ "0x523a4d4e4723", @@ -45541,7 +45775,7 @@ "role_address#0" ] }, - "4805": { + "4857": { "op": "concat", "defined_out": [ "box_prefixed_key%0#0", @@ -45555,7 +45789,7 @@ "box_prefixed_key%0#0" ] }, - "4806": { + "4858": { "op": "dup", "defined_out": [ "box_prefixed_key%0#0", @@ -45571,7 +45805,7 @@ "box_prefixed_key%0#0 (copy)" ] }, - "4807": { + "4859": { "op": "box_len", "defined_out": [ "_%0#0", @@ -45589,7 +45823,7 @@ "maybe_exists%0#0" ] }, - "4808": { + "4860": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -45599,7 +45833,7 @@ "maybe_exists%0#0" ] }, - "4810": { + "4862": { "op": "!", "defined_out": [ "box_prefixed_key%0#0", @@ -45615,7 +45849,7 @@ "tmp%2#2" ] }, - "4811": { + "4863": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -45625,7 +45859,7 @@ "box_prefixed_key%0#0" ] }, - "4812": { + "4864": { "op": "dig 2", "defined_out": [ "box_prefixed_key%0#0", @@ -45641,7 +45875,7 @@ "validity#0" ] }, - "4814": { + "4866": { "op": "box_put", "stack_out": [ "role_address#0", @@ -45649,10 +45883,10 @@ "role_id#1" ] }, - "4815": { + "4867": { "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14" }, - "4818": { + "4870": { "block": "rbac_assign_role_after_if_else@5", "stack_in": [ "role_address#0", @@ -45670,7 +45904,7 @@ "role_id#1" ] }, - "4819": { + "4871": { "op": "pushint 50", "defined_out": [ "50", @@ -45684,7 +45918,7 @@ "50" ] }, - "4821": { + "4873": { "op": "==", "defined_out": [ "role_id#1", @@ -45697,7 +45931,7 @@ "tmp%3#0" ] }, - "4822": { + "4874": { "op": "bz rbac_assign_role_after_if_else@7", "stack_out": [ "role_address#0", @@ -45705,7 +45939,7 @@ "role_id#1" ] }, - "4825": { + "4877": { "op": "bytec 22 // 0x523a50594423", "defined_out": [ "0x523a50594423", @@ -45718,7 +45952,7 @@ "0x523a50594423" ] }, - "4827": { + "4879": { "op": "dig 3", "defined_out": [ "0x523a50594423", @@ -45733,7 +45967,7 @@ "role_address#0" ] }, - "4829": { + "4881": { "op": "concat", "defined_out": [ "box_prefixed_key%2#0", @@ -45747,7 +45981,7 @@ "box_prefixed_key%2#0" ] }, - "4830": { + "4882": { "op": "dup", "defined_out": [ "box_prefixed_key%2#0", @@ -45763,7 +45997,7 @@ "box_prefixed_key%2#0 (copy)" ] }, - "4831": { + "4883": { "op": "box_len", "defined_out": [ "_%1#0", @@ -45781,7 +46015,7 @@ "maybe_exists%1#0" ] }, - "4832": { + "4884": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -45791,7 +46025,7 @@ "maybe_exists%1#0" ] }, - "4834": { + "4886": { "op": "!", "defined_out": [ "box_prefixed_key%2#0", @@ -45807,7 +46041,7 @@ "tmp%4#0" ] }, - "4835": { + "4887": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -45817,7 +46051,7 @@ "box_prefixed_key%2#0" ] }, - "4836": { + "4888": { "op": "dig 2", "defined_out": [ "box_prefixed_key%2#0", @@ -45833,7 +46067,7 @@ "validity#0" ] }, - "4838": { + "4890": { "op": "box_put", "stack_out": [ "role_address#0", @@ -45841,10 +46075,10 @@ "role_id#1" ] }, - "4839": { + "4891": { "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14" }, - "4842": { + "4894": { "block": "rbac_assign_role_after_if_else@7", "stack_in": [ "role_address#0", @@ -45862,7 +46096,7 @@ "role_id#1" ] }, - "4843": { + "4895": { "op": "pushint 60", "defined_out": [ "60", @@ -45876,7 +46110,7 @@ "60" ] }, - "4845": { + "4897": { "op": "==", "defined_out": [ "role_id#1", @@ -45889,7 +46123,7 @@ "tmp%5#1" ] }, - "4846": { + "4898": { "op": "bz rbac_assign_role_after_if_else@9", "stack_out": [ "role_address#0", @@ -45897,8 +46131,8 @@ "role_id#1" ] }, - "4849": { - "op": "bytec 32 // 0x523a54525323", + "4901": { + "op": "bytec 26 // 0x523a54525323", "defined_out": [ "0x523a54525323", "role_id#1" @@ -45910,7 +46144,7 @@ "0x523a54525323" ] }, - "4851": { + "4903": { "op": "dig 3", "defined_out": [ "0x523a54525323", @@ -45925,7 +46159,7 @@ "role_address#0" ] }, - "4853": { + "4905": { "op": "concat", "defined_out": [ "box_prefixed_key%4#0", @@ -45939,7 +46173,7 @@ "box_prefixed_key%4#0" ] }, - "4854": { + "4906": { "op": "dup", "defined_out": [ "box_prefixed_key%4#0", @@ -45955,7 +46189,7 @@ "box_prefixed_key%4#0 (copy)" ] }, - "4855": { + "4907": { "op": "box_len", "defined_out": [ "_%2#0", @@ -45973,7 +46207,7 @@ "maybe_exists%2#0" ] }, - "4856": { + "4908": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -45983,7 +46217,7 @@ "maybe_exists%2#0" ] }, - "4858": { + "4910": { "op": "!", "defined_out": [ "box_prefixed_key%4#0", @@ -45999,7 +46233,7 @@ "tmp%6#1" ] }, - "4859": { + "4911": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -46009,7 +46243,7 @@ "box_prefixed_key%4#0" ] }, - "4860": { + "4912": { "op": "dig 2", "defined_out": [ "box_prefixed_key%4#0", @@ -46025,7 +46259,7 @@ "validity#0" ] }, - "4862": { + "4914": { "op": "box_put", "stack_out": [ "role_address#0", @@ -46033,10 +46267,10 @@ "role_id#1" ] }, - "4863": { + "4915": { "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14" }, - "4866": { + "4918": { "block": "rbac_assign_role_after_if_else@9", "stack_in": [ "role_address#0", @@ -46054,7 +46288,7 @@ "role_id#1" ] }, - "4867": { + "4919": { "op": "pushint 70", "defined_out": [ "70", @@ -46068,7 +46302,7 @@ "70" ] }, - "4869": { + "4921": { "op": "==", "defined_out": [ "role_id#1", @@ -46081,7 +46315,7 @@ "tmp%7#0" ] }, - "4870": { + "4922": { "op": "bz rbac_assign_role_after_if_else@11", "stack_out": [ "role_address#0", @@ -46089,7 +46323,7 @@ "role_id#1" ] }, - "4873": { + "4925": { "op": "bytec 21 // 0x523a41555423", "defined_out": [ "0x523a41555423", @@ -46102,7 +46336,7 @@ "0x523a41555423" ] }, - "4875": { + "4927": { "op": "dig 3", "defined_out": [ "0x523a41555423", @@ -46117,7 +46351,7 @@ "role_address#0" ] }, - "4877": { + "4929": { "op": "concat", "defined_out": [ "box_prefixed_key%6#0", @@ -46131,7 +46365,7 @@ "box_prefixed_key%6#0" ] }, - "4878": { + "4930": { "op": "dup", "defined_out": [ "box_prefixed_key%6#0", @@ -46147,7 +46381,7 @@ "box_prefixed_key%6#0 (copy)" ] }, - "4879": { + "4931": { "op": "box_len", "defined_out": [ "_%3#0", @@ -46165,7 +46399,7 @@ "maybe_exists%3#0" ] }, - "4880": { + "4932": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -46175,7 +46409,7 @@ "maybe_exists%3#0" ] }, - "4882": { + "4934": { "op": "!", "defined_out": [ "box_prefixed_key%6#0", @@ -46191,7 +46425,7 @@ "tmp%8#0" ] }, - "4883": { + "4935": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -46201,7 +46435,7 @@ "box_prefixed_key%6#0" ] }, - "4884": { + "4936": { "op": "dig 2", "defined_out": [ "box_prefixed_key%6#0", @@ -46217,7 +46451,7 @@ "validity#0" ] }, - "4886": { + "4938": { "op": "box_put", "stack_out": [ "role_address#0", @@ -46225,10 +46459,10 @@ "role_id#1" ] }, - "4887": { + "4939": { "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14" }, - "4890": { + "4942": { "block": "rbac_assign_role_after_if_else@11", "stack_in": [ "role_address#0", @@ -46246,7 +46480,7 @@ "role_id#1" ] }, - "4891": { + "4943": { "op": "pushint 80", "defined_out": [ "80", @@ -46260,7 +46494,7 @@ "80" ] }, - "4893": { + "4945": { "op": "==", "defined_out": [ "role_id#1", @@ -46273,7 +46507,7 @@ "tmp%9#0" ] }, - "4894": { + "4946": { "op": "bz rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14", "stack_out": [ "role_address#0", @@ -46281,7 +46515,7 @@ "role_id#1" ] }, - "4897": { + "4949": { "op": "bytec 25 // 0x523a4d4f4323", "defined_out": [ "0x523a4d4f4323", @@ -46294,7 +46528,7 @@ "0x523a4d4f4323" ] }, - "4899": { + "4951": { "op": "dig 3", "defined_out": [ "0x523a4d4f4323", @@ -46309,7 +46543,7 @@ "role_address#0" ] }, - "4901": { + "4953": { "op": "concat", "defined_out": [ "box_prefixed_key%8#0", @@ -46323,7 +46557,7 @@ "box_prefixed_key%8#0" ] }, - "4902": { + "4954": { "op": "dup", "defined_out": [ "box_prefixed_key%8#0", @@ -46339,7 +46573,7 @@ "box_prefixed_key%8#0 (copy)" ] }, - "4903": { + "4955": { "op": "box_len", "defined_out": [ "_%4#0", @@ -46357,7 +46591,7 @@ "maybe_exists%4#0" ] }, - "4904": { + "4956": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -46367,7 +46601,7 @@ "maybe_exists%4#0" ] }, - "4906": { + "4958": { "op": "!", "defined_out": [ "box_prefixed_key%8#0", @@ -46383,7 +46617,7 @@ "tmp%10#0" ] }, - "4907": { + "4959": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -46393,7 +46627,7 @@ "box_prefixed_key%8#0" ] }, - "4908": { + "4960": { "op": "dig 2", "defined_out": [ "box_prefixed_key%8#0", @@ -46409,7 +46643,7 @@ "validity#0" ] }, - "4910": { + "4962": { "op": "box_put", "stack_out": [ "role_address#0", @@ -46417,10 +46651,10 @@ "role_id#1" ] }, - "4911": { + "4963": { "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14" }, - "4914": { + "4966": { "subroutine": "modules.rbac.RbacModule.rbac_revoke_role[routing]", "params": {}, "block": "rbac_revoke_role", @@ -46433,7 +46667,7 @@ "role_id#0" ] }, - "4917": { + "4969": { "op": "dup", "defined_out": [ "role_id#0", @@ -46444,7 +46678,7 @@ "role_id#0 (copy)" ] }, - "4918": { + "4970": { "op": "len", "defined_out": [ "len%0#0", @@ -46455,7 +46689,7 @@ "len%0#0" ] }, - "4919": { + "4971": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -46468,7 +46702,7 @@ "1" ] }, - "4920": { + "4972": { "op": "==", "defined_out": [ "eq%0#0", @@ -46479,17 +46713,17 @@ "eq%0#0" ] }, - "4921": { + "4973": { "error": "invalid number of bytes for arc4.uint8", "op": "assert // invalid number of bytes for arc4.uint8", "stack_out": [ "role_id#0" ] }, - "4922": { + "4974": { "op": "txna ApplicationArgs 2" }, - "4925": { + "4977": { "op": "dup", "defined_out": [ "role_address#0", @@ -46501,7 +46735,7 @@ "role_address#0" ] }, - "4926": { + "4978": { "op": "cover 2", "defined_out": [ "role_address#0", @@ -46513,7 +46747,7 @@ "role_address#0" ] }, - "4928": { + "4980": { "op": "len", "defined_out": [ "len%1#0", @@ -46526,7 +46760,7 @@ "len%1#0" ] }, - "4929": { + "4981": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -46541,7 +46775,7 @@ "32" ] }, - "4930": { + "4982": { "op": "==", "defined_out": [ "eq%1#0", @@ -46554,7 +46788,7 @@ "eq%1#0" ] }, - "4931": { + "4983": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ @@ -46562,15 +46796,15 @@ "role_id#0" ] }, - "4932": { + "4984": { "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", "op": "callsub _assert_caller_is_arranger" }, - "4935": { + "4987": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", "op": "callsub _assert_is_not_asset_defaulted" }, - "4938": { + "4990": { "op": "btoi", "defined_out": [ "role_address#0", @@ -46581,7 +46815,7 @@ "role_id#1" ] }, - "4939": { + "4991": { "op": "dupn 2", "defined_out": [ "role_address#0", @@ -46595,7 +46829,7 @@ "role_id#1 (copy)" ] }, - "4941": { + "4993": { "callsub": "modules.rbac.RbacModule._assert_valid_role", "op": "callsub _assert_valid_role", "stack_out": [ @@ -46604,7 +46838,7 @@ "role_id#1" ] }, - "4944": { + "4996": { "op": "dup", "stack_out": [ "role_address#0", @@ -46613,7 +46847,7 @@ "role_id#1 (copy)" ] }, - "4945": { + "4997": { "op": "pushint 20", "defined_out": [ "20", @@ -46629,7 +46863,7 @@ "20" ] }, - "4947": { + "4999": { "op": "!=", "defined_out": [ "role_address#0", @@ -46643,7 +46877,7 @@ "tmp%0#2" ] }, - "4948": { + "5000": { "error": "Invalid role identifier", "op": "assert // Invalid role identifier", "stack_out": [ @@ -46652,7 +46886,7 @@ "role_id#1" ] }, - "4949": { + "5001": { "op": "pushint 40", "defined_out": [ "40", @@ -46666,7 +46900,7 @@ "40" ] }, - "4951": { + "5003": { "op": "==", "defined_out": [ "role_address#0", @@ -46679,14 +46913,14 @@ "tmp%1#1" ] }, - "4952": { + "5004": { "op": "bz rbac_revoke_role_after_if_else@3", "stack_out": [ "role_address#0", "role_id#1" ] }, - "4955": { + "5007": { "op": "bytec 23 // 0x523a4d4e4723", "defined_out": [ "0x523a4d4e4723", @@ -46699,7 +46933,7 @@ "0x523a4d4e4723" ] }, - "4957": { + "5009": { "op": "dig 2", "stack_out": [ "role_address#0", @@ -46708,7 +46942,7 @@ "role_address#0" ] }, - "4959": { + "5011": { "op": "concat", "defined_out": [ "box_prefixed_key%0#0", @@ -46721,7 +46955,7 @@ "box_prefixed_key%0#0" ] }, - "4960": { + "5012": { "op": "dup", "defined_out": [ "box_prefixed_key%0#0", @@ -46736,7 +46970,7 @@ "box_prefixed_key%0#0 (copy)" ] }, - "4961": { + "5013": { "op": "box_len", "defined_out": [ "_%0#0", @@ -46753,7 +46987,7 @@ "maybe_exists%0#0" ] }, - "4962": { + "5014": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -46762,7 +46996,7 @@ "maybe_exists%0#0" ] }, - "4964": { + "5016": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -46771,7 +47005,7 @@ "box_prefixed_key%0#0" ] }, - "4965": { + "5017": { "op": "box_del", "defined_out": [ "role_address#0", @@ -46784,14 +47018,14 @@ "{box_del}" ] }, - "4966": { + "5018": { "op": "pop", "stack_out": [ "role_address#0", "role_id#1" ] }, - "4967": { + "5019": { "block": "rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12", "stack_in": [ "role_address#0", @@ -46807,7 +47041,7 @@ "tmp%2#1" ] }, - "4969": { + "5021": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0" @@ -46818,7 +47052,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "4970": { + "5022": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -46831,7 +47065,7 @@ "0x151f7c75" ] }, - "4971": { + "5023": { "op": "swap", "stack_out": [ "role_address#0", @@ -46840,7 +47074,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "4972": { + "5024": { "op": "concat", "defined_out": [ "tmp%5#0" @@ -46851,14 +47085,14 @@ "tmp%5#0" ] }, - "4973": { + "5025": { "op": "log", "stack_out": [ "role_address#0", "role_id#1" ] }, - "4974": { + "5026": { "op": "intc_1 // 1", "defined_out": [ "1" @@ -46869,14 +47103,14 @@ "1" ] }, - "4975": { + "5027": { "op": "return", "stack_out": [ "role_address#0", "role_id#1" ] }, - "4976": { + "5028": { "block": "rbac_revoke_role_after_if_else@3", "stack_in": [ "role_address#0", @@ -46892,7 +47126,7 @@ "role_id#1" ] }, - "4977": { + "5029": { "op": "pushint 50", "defined_out": [ "50", @@ -46905,7 +47139,7 @@ "50" ] }, - "4979": { + "5031": { "op": "==", "defined_out": [ "role_id#1", @@ -46917,14 +47151,14 @@ "tmp%2#2" ] }, - "4980": { + "5032": { "op": "bz rbac_revoke_role_after_if_else@5", "stack_out": [ "role_address#0", "role_id#1" ] }, - "4983": { + "5035": { "op": "bytec 22 // 0x523a50594423", "defined_out": [ "0x523a50594423", @@ -46936,7 +47170,7 @@ "0x523a50594423" ] }, - "4985": { + "5037": { "op": "dig 2", "defined_out": [ "0x523a50594423", @@ -46950,7 +47184,7 @@ "role_address#0" ] }, - "4987": { + "5039": { "op": "concat", "defined_out": [ "box_prefixed_key%2#0", @@ -46963,7 +47197,7 @@ "box_prefixed_key%2#0" ] }, - "4988": { + "5040": { "op": "dup", "defined_out": [ "box_prefixed_key%2#0", @@ -46978,7 +47212,7 @@ "box_prefixed_key%2#0 (copy)" ] }, - "4989": { + "5041": { "op": "box_len", "defined_out": [ "_%1#0", @@ -46995,7 +47229,7 @@ "maybe_exists%1#0" ] }, - "4990": { + "5042": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -47004,7 +47238,7 @@ "maybe_exists%1#0" ] }, - "4992": { + "5044": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -47013,7 +47247,7 @@ "box_prefixed_key%2#0" ] }, - "4993": { + "5045": { "op": "box_del", "defined_out": [ "role_address#0", @@ -47026,17 +47260,17 @@ "{box_del}" ] }, - "4994": { + "5046": { "op": "pop", "stack_out": [ "role_address#0", "role_id#1" ] }, - "4995": { + "5047": { "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" }, - "4998": { + "5050": { "block": "rbac_revoke_role_after_if_else@5", "stack_in": [ "role_address#0", @@ -47052,7 +47286,7 @@ "role_id#1" ] }, - "4999": { + "5051": { "op": "pushint 60", "defined_out": [ "60", @@ -47065,7 +47299,7 @@ "60" ] }, - "5001": { + "5053": { "op": "==", "defined_out": [ "role_id#1", @@ -47077,15 +47311,15 @@ "tmp%3#0" ] }, - "5002": { + "5054": { "op": "bz rbac_revoke_role_after_if_else@7", "stack_out": [ "role_address#0", "role_id#1" ] }, - "5005": { - "op": "bytec 32 // 0x523a54525323", + "5057": { + "op": "bytec 26 // 0x523a54525323", "defined_out": [ "0x523a54525323", "role_id#1" @@ -47096,7 +47330,7 @@ "0x523a54525323" ] }, - "5007": { + "5059": { "op": "dig 2", "defined_out": [ "0x523a54525323", @@ -47110,7 +47344,7 @@ "role_address#0" ] }, - "5009": { + "5061": { "op": "concat", "defined_out": [ "box_prefixed_key%4#0", @@ -47123,7 +47357,7 @@ "box_prefixed_key%4#0" ] }, - "5010": { + "5062": { "op": "dup", "defined_out": [ "box_prefixed_key%4#0", @@ -47138,7 +47372,7 @@ "box_prefixed_key%4#0 (copy)" ] }, - "5011": { + "5063": { "op": "box_len", "defined_out": [ "_%2#0", @@ -47155,7 +47389,7 @@ "maybe_exists%2#0" ] }, - "5012": { + "5064": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -47164,7 +47398,7 @@ "maybe_exists%2#0" ] }, - "5014": { + "5066": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -47173,7 +47407,7 @@ "box_prefixed_key%4#0" ] }, - "5015": { + "5067": { "op": "box_del", "defined_out": [ "role_address#0", @@ -47186,17 +47420,17 @@ "{box_del}" ] }, - "5016": { + "5068": { "op": "pop", "stack_out": [ "role_address#0", "role_id#1" ] }, - "5017": { + "5069": { "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" }, - "5020": { + "5072": { "block": "rbac_revoke_role_after_if_else@7", "stack_in": [ "role_address#0", @@ -47212,7 +47446,7 @@ "role_id#1" ] }, - "5021": { + "5073": { "op": "pushint 70", "defined_out": [ "70", @@ -47225,7 +47459,7 @@ "70" ] }, - "5023": { + "5075": { "op": "==", "defined_out": [ "role_id#1", @@ -47237,14 +47471,14 @@ "tmp%4#1" ] }, - "5024": { + "5076": { "op": "bz rbac_revoke_role_after_if_else@9", "stack_out": [ "role_address#0", "role_id#1" ] }, - "5027": { + "5079": { "op": "bytec 21 // 0x523a41555423", "defined_out": [ "0x523a41555423", @@ -47256,7 +47490,7 @@ "0x523a41555423" ] }, - "5029": { + "5081": { "op": "dig 2", "defined_out": [ "0x523a41555423", @@ -47270,7 +47504,7 @@ "role_address#0" ] }, - "5031": { + "5083": { "op": "concat", "defined_out": [ "box_prefixed_key%6#0", @@ -47283,7 +47517,7 @@ "box_prefixed_key%6#0" ] }, - "5032": { + "5084": { "op": "dup", "defined_out": [ "box_prefixed_key%6#0", @@ -47298,7 +47532,7 @@ "box_prefixed_key%6#0 (copy)" ] }, - "5033": { + "5085": { "op": "box_len", "defined_out": [ "_%3#0", @@ -47315,7 +47549,7 @@ "maybe_exists%3#0" ] }, - "5034": { + "5086": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -47324,7 +47558,7 @@ "maybe_exists%3#0" ] }, - "5036": { + "5088": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -47333,7 +47567,7 @@ "box_prefixed_key%6#0" ] }, - "5037": { + "5089": { "op": "box_del", "defined_out": [ "role_address#0", @@ -47346,17 +47580,17 @@ "{box_del}" ] }, - "5038": { + "5090": { "op": "pop", "stack_out": [ "role_address#0", "role_id#1" ] }, - "5039": { + "5091": { "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" }, - "5042": { + "5094": { "block": "rbac_revoke_role_after_if_else@9", "stack_in": [ "role_address#0", @@ -47372,7 +47606,7 @@ "role_id#1" ] }, - "5043": { + "5095": { "op": "pushint 80", "defined_out": [ "80", @@ -47385,7 +47619,7 @@ "80" ] }, - "5045": { + "5097": { "op": "==", "defined_out": [ "role_id#1", @@ -47397,14 +47631,14 @@ "tmp%5#1" ] }, - "5046": { + "5098": { "op": "bz rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12", "stack_out": [ "role_address#0", "role_id#1" ] }, - "5049": { + "5101": { "op": "bytec 25 // 0x523a4d4f4323", "defined_out": [ "0x523a4d4f4323", @@ -47416,7 +47650,7 @@ "0x523a4d4f4323" ] }, - "5051": { + "5103": { "op": "dig 2", "defined_out": [ "0x523a4d4f4323", @@ -47430,7 +47664,7 @@ "role_address#0" ] }, - "5053": { + "5105": { "op": "concat", "defined_out": [ "box_prefixed_key%8#0", @@ -47443,7 +47677,7 @@ "box_prefixed_key%8#0" ] }, - "5054": { + "5106": { "op": "dup", "defined_out": [ "box_prefixed_key%8#0", @@ -47458,7 +47692,7 @@ "box_prefixed_key%8#0 (copy)" ] }, - "5055": { + "5107": { "op": "box_len", "defined_out": [ "_%4#0", @@ -47475,7 +47709,7 @@ "maybe_exists%4#0" ] }, - "5056": { + "5108": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -47484,7 +47718,7 @@ "maybe_exists%4#0" ] }, - "5058": { + "5110": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -47493,7 +47727,7 @@ "box_prefixed_key%8#0" ] }, - "5059": { + "5111": { "op": "box_del", "defined_out": [ "role_address#0", @@ -47506,17 +47740,17 @@ "{box_del}" ] }, - "5060": { + "5112": { "op": "pop", "stack_out": [ "role_address#0", "role_id#1" ] }, - "5061": { + "5113": { "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" }, - "5064": { + "5116": { "subroutine": "modules.rbac.RbacModule.rbac_contract_suspension[routing]", "params": {}, "block": "rbac_contract_suspension", @@ -47529,7 +47763,7 @@ "tmp%0#0" ] }, - "5067": { + "5119": { "op": "dup", "defined_out": [ "tmp%0#0", @@ -47540,7 +47774,7 @@ "tmp%0#0 (copy)" ] }, - "5068": { + "5120": { "op": "len", "defined_out": [ "len%0#0", @@ -47551,7 +47785,7 @@ "len%0#0" ] }, - "5069": { + "5121": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -47564,7 +47798,7 @@ "1" ] }, - "5070": { + "5122": { "op": "==", "defined_out": [ "eq%0#0", @@ -47575,14 +47809,14 @@ "eq%0#0" ] }, - "5071": { + "5123": { "error": "invalid number of bytes for arc4.bool", "op": "assert // invalid number of bytes for arc4.bool", "stack_out": [ "tmp%0#0" ] }, - "5072": { + "5124": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -47593,7 +47827,7 @@ "0" ] }, - "5073": { + "5125": { "op": "getbit", "defined_out": [ "suspended#0" @@ -47602,7 +47836,7 @@ "suspended#0" ] }, - "5074": { + "5126": { "op": "bytec 21 // 0x523a41555423", "defined_out": [ "0x523a41555423", @@ -47613,7 +47847,7 @@ "0x523a41555423" ] }, - "5076": { + "5128": { "op": "txn Sender", "defined_out": [ "0x523a41555423", @@ -47626,7 +47860,7 @@ "tmp%0#2" ] }, - "5078": { + "5130": { "callsub": "modules.rbac.RbacModule._role_is_active", "op": "callsub _role_is_active", "defined_out": [ @@ -47638,14 +47872,14 @@ "tmp%1#0" ] }, - "5081": { + "5133": { "error": "Not authorized", "op": "assert // Not authorized", "stack_out": [ "suspended#0" ] }, - "5082": { + "5134": { "op": "bytec 33 // \"asset_suspended\"", "defined_out": [ "\"asset_suspended\"", @@ -47656,18 +47890,18 @@ "\"asset_suspended\"" ] }, - "5084": { + "5136": { "op": "swap", "stack_out": [ "\"asset_suspended\"", "suspended#0" ] }, - "5085": { + "5137": { "op": "app_global_put", "stack_out": [] }, - "5086": { + "5138": { "op": "global LatestTimestamp", "defined_out": [ "tmp%0#1" @@ -47676,7 +47910,7 @@ "tmp%0#1" ] }, - "5088": { + "5140": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0" @@ -47685,7 +47919,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "5089": { + "5141": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -47696,14 +47930,14 @@ "0x151f7c75" ] }, - "5090": { + "5142": { "op": "swap", "stack_out": [ "0x151f7c75", "aggregate%val_as_bytes%0#0" ] }, - "5091": { + "5143": { "op": "concat", "defined_out": [ "tmp%4#0" @@ -47712,21 +47946,21 @@ "tmp%4#0" ] }, - "5092": { + "5144": { "op": "log", "stack_out": [] }, - "5093": { + "5145": { "op": "intc_1 // 1", "stack_out": [ "1" ] }, - "5094": { + "5146": { "op": "return", "stack_out": [] }, - "5095": { + "5147": { "subroutine": "modules.rbac.RbacModule.rbac_get_arranger[routing]", "params": {}, "block": "rbac_get_arranger", @@ -47739,7 +47973,7 @@ "0" ] }, - "5096": { + "5148": { "op": "bytec 18 // 0x523a41525223", "defined_out": [ "0", @@ -47750,7 +47984,7 @@ "0x523a41525223" ] }, - "5098": { + "5150": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -47761,14 +47995,14 @@ "maybe_exists%0#0" ] }, - "5099": { + "5151": { "error": "check self.arranger exists", "op": "assert // check self.arranger exists", "stack_out": [ "maybe_value%0#0" ] }, - "5100": { + "5152": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -47779,14 +48013,14 @@ "0x151f7c75" ] }, - "5101": { + "5153": { "op": "swap", "stack_out": [ "0x151f7c75", "maybe_value%0#0" ] }, - "5102": { + "5154": { "op": "concat", "defined_out": [ "tmp%2#0" @@ -47795,11 +48029,11 @@ "tmp%2#0" ] }, - "5103": { + "5155": { "op": "log", "stack_out": [] }, - "5104": { + "5156": { "op": "intc_1 // 1", "defined_out": [ "1" @@ -47808,11 +48042,11 @@ "1" ] }, - "5105": { + "5157": { "op": "return", "stack_out": [] }, - "5106": { + "5158": { "subroutine": "modules.rbac.RbacModule.rbac_get_address_roles[routing]", "params": {}, "block": "rbac_get_address_roles", @@ -47825,7 +48059,7 @@ "address#0" ] }, - "5109": { + "5161": { "op": "dup", "defined_out": [ "address#0", @@ -47836,7 +48070,7 @@ "address#0 (copy)" ] }, - "5110": { + "5162": { "op": "len", "defined_out": [ "address#0", @@ -47847,7 +48081,7 @@ "len%0#0" ] }, - "5111": { + "5163": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -47860,7 +48094,7 @@ "32" ] }, - "5112": { + "5164": { "op": "==", "defined_out": [ "address#0", @@ -47871,14 +48105,14 @@ "eq%0#0" ] }, - "5113": { + "5165": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ "address#0" ] }, - "5114": { + "5166": { "op": "bytec 23 // 0x523a4d4e4723", "defined_out": [ "0x523a4d4e4723", @@ -47889,7 +48123,7 @@ "0x523a4d4e4723" ] }, - "5116": { + "5168": { "op": "dig 1", "stack_out": [ "address#0", @@ -47897,7 +48131,7 @@ "address#0 (copy)" ] }, - "5118": { + "5170": { "callsub": "modules.rbac.RbacModule._role_is_active", "op": "callsub _role_is_active", "defined_out": [ @@ -47909,7 +48143,7 @@ "tmp%0#1" ] }, - "5121": { + "5173": { "op": "bytec 22 // 0x523a50594423", "defined_out": [ "0x523a50594423", @@ -47922,7 +48156,7 @@ "0x523a50594423" ] }, - "5123": { + "5175": { "op": "dig 2", "stack_out": [ "address#0", @@ -47931,7 +48165,7 @@ "address#0 (copy)" ] }, - "5125": { + "5177": { "callsub": "modules.rbac.RbacModule._role_is_active", "op": "callsub _role_is_active", "defined_out": [ @@ -47945,8 +48179,8 @@ "tmp%1#1" ] }, - "5128": { - "op": "bytec 32 // 0x523a54525323", + "5180": { + "op": "bytec 26 // 0x523a54525323", "defined_out": [ "0x523a54525323", "address#0", @@ -47960,7 +48194,7 @@ "0x523a54525323" ] }, - "5130": { + "5182": { "op": "dig 3", "stack_out": [ "address#0", @@ -47970,7 +48204,7 @@ "address#0 (copy)" ] }, - "5132": { + "5184": { "callsub": "modules.rbac.RbacModule._role_is_active", "op": "callsub _role_is_active", "defined_out": [ @@ -47986,7 +48220,7 @@ "tmp%2#1" ] }, - "5135": { + "5187": { "op": "bytec 21 // 0x523a41555423", "defined_out": [ "0x523a41555423", @@ -48003,7 +48237,7 @@ "0x523a41555423" ] }, - "5137": { + "5189": { "op": "dig 4", "stack_out": [ "address#0", @@ -48014,7 +48248,7 @@ "address#0 (copy)" ] }, - "5139": { + "5191": { "callsub": "modules.rbac.RbacModule._role_is_active", "op": "callsub _role_is_active", "defined_out": [ @@ -48032,7 +48266,7 @@ "tmp%3#1" ] }, - "5142": { + "5194": { "op": "bytec 25 // 0x523a4d4f4323", "defined_out": [ "0x523a4d4f4323", @@ -48051,7 +48285,7 @@ "0x523a4d4f4323" ] }, - "5144": { + "5196": { "op": "uncover 5", "stack_out": [ "tmp%0#1", @@ -48062,7 +48296,7 @@ "address#0" ] }, - "5146": { + "5198": { "callsub": "modules.rbac.RbacModule._role_is_active", "op": "callsub _role_is_active", "defined_out": [ @@ -48080,7 +48314,7 @@ "tmp%4#1" ] }, - "5149": { + "5201": { "op": "bytec 40 // 0x00", "defined_out": [ "0x00", @@ -48099,7 +48333,7 @@ "0x00" ] }, - "5151": { + "5203": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -48120,7 +48354,7 @@ "0" ] }, - "5152": { + "5204": { "op": "uncover 6", "stack_out": [ "tmp%1#1", @@ -48132,7 +48366,7 @@ "tmp%0#1" ] }, - "5154": { + "5206": { "op": "setbit", "defined_out": [ "aggregate%encoded_bool%0#0", @@ -48149,7 +48383,7 @@ "aggregate%encoded_bool%0#0" ] }, - "5155": { + "5207": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -48168,7 +48402,7 @@ "1" ] }, - "5156": { + "5208": { "op": "uncover 5", "stack_out": [ "tmp%2#1", @@ -48179,7 +48413,7 @@ "tmp%1#1" ] }, - "5158": { + "5210": { "op": "setbit", "defined_out": [ "aggregate%set_bit%0#0", @@ -48194,7 +48428,7 @@ "aggregate%set_bit%0#0" ] }, - "5159": { + "5211": { "op": "pushint 2", "defined_out": [ "2", @@ -48211,7 +48445,7 @@ "2" ] }, - "5161": { + "5213": { "op": "uncover 4", "stack_out": [ "tmp%3#1", @@ -48221,7 +48455,7 @@ "tmp%2#1" ] }, - "5163": { + "5215": { "op": "setbit", "defined_out": [ "aggregate%set_bit%1#0", @@ -48234,7 +48468,7 @@ "aggregate%set_bit%1#0" ] }, - "5164": { + "5216": { "op": "pushint 3", "defined_out": [ "3", @@ -48249,7 +48483,7 @@ "3" ] }, - "5166": { + "5218": { "op": "uncover 3", "stack_out": [ "tmp%4#1", @@ -48258,7 +48492,7 @@ "tmp%3#1" ] }, - "5168": { + "5220": { "op": "setbit", "defined_out": [ "aggregate%set_bit%2#0", @@ -48269,7 +48503,7 @@ "aggregate%set_bit%2#0" ] }, - "5169": { + "5221": { "op": "pushint 4", "defined_out": [ "4", @@ -48282,7 +48516,7 @@ "4" ] }, - "5171": { + "5223": { "op": "uncover 2", "stack_out": [ "aggregate%set_bit%2#0", @@ -48290,7 +48524,7 @@ "tmp%4#1" ] }, - "5173": { + "5225": { "op": "setbit", "defined_out": [ "aggregate%set_bit%3#0" @@ -48299,7 +48533,7 @@ "aggregate%set_bit%3#0" ] }, - "5174": { + "5226": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -48310,14 +48544,14 @@ "0x151f7c75" ] }, - "5175": { + "5227": { "op": "swap", "stack_out": [ "0x151f7c75", "aggregate%set_bit%3#0" ] }, - "5176": { + "5228": { "op": "concat", "defined_out": [ "tmp%8#0" @@ -48326,21 +48560,21 @@ "tmp%8#0" ] }, - "5177": { + "5229": { "op": "log", "stack_out": [] }, - "5178": { + "5230": { "op": "intc_1 // 1", "stack_out": [ "1" ] }, - "5179": { + "5231": { "op": "return", "stack_out": [] }, - "5180": { + "5232": { "subroutine": "modules.rbac.RbacModule.rbac_get_role_validity[routing]", "params": {}, "block": "rbac_get_role_validity", @@ -48353,7 +48587,7 @@ "role_id#0" ] }, - "5183": { + "5235": { "op": "dup", "defined_out": [ "role_id#0", @@ -48364,7 +48598,7 @@ "role_id#0 (copy)" ] }, - "5184": { + "5236": { "op": "len", "defined_out": [ "len%0#0", @@ -48375,7 +48609,7 @@ "len%0#0" ] }, - "5185": { + "5237": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -48388,7 +48622,7 @@ "1" ] }, - "5186": { + "5238": { "op": "==", "defined_out": [ "eq%0#0", @@ -48399,17 +48633,17 @@ "eq%0#0" ] }, - "5187": { + "5239": { "error": "invalid number of bytes for arc4.uint8", "op": "assert // invalid number of bytes for arc4.uint8", "stack_out": [ "role_id#0" ] }, - "5188": { + "5240": { "op": "txna ApplicationArgs 2" }, - "5191": { + "5243": { "op": "dup", "defined_out": [ "role_address#0", @@ -48421,7 +48655,7 @@ "role_address#0" ] }, - "5192": { + "5244": { "op": "cover 2", "defined_out": [ "role_address#0", @@ -48433,7 +48667,7 @@ "role_address#0" ] }, - "5194": { + "5246": { "op": "len", "defined_out": [ "len%1#0", @@ -48446,7 +48680,7 @@ "len%1#0" ] }, - "5195": { + "5247": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -48461,7 +48695,7 @@ "32" ] }, - "5196": { + "5248": { "op": "==", "defined_out": [ "eq%1#0", @@ -48474,7 +48708,7 @@ "eq%1#0" ] }, - "5197": { + "5249": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ @@ -48482,7 +48716,7 @@ "role_id#0" ] }, - "5198": { + "5250": { "op": "btoi", "defined_out": [ "role#0", @@ -48493,7 +48727,7 @@ "role#0" ] }, - "5199": { + "5251": { "op": "dup", "defined_out": [ "role#0", @@ -48506,7 +48740,7 @@ "role#0 (copy)" ] }, - "5200": { + "5252": { "callsub": "modules.rbac.RbacModule._assert_valid_role", "op": "callsub _assert_valid_role", "stack_out": [ @@ -48514,7 +48748,7 @@ "role#0" ] }, - "5203": { + "5255": { "op": "pushints 20 40 50 60 70 80", "defined_out": [ "20", @@ -48537,7 +48771,7 @@ "80" ] }, - "5211": { + "5263": { "op": "uncover 6", "stack_out": [ "role_address#0", @@ -48550,17 +48784,17 @@ "role#0" ] }, - "5213": { + "5265": { "op": "match rbac_get_role_validity_switch_case_0@2 rbac_get_role_validity_switch_case_1@3 rbac_get_role_validity_switch_case_2@4 rbac_get_role_validity_switch_case_3@5 rbac_get_role_validity_switch_case_4@6 rbac_get_role_validity_switch_case_5@7", "stack_out": [ "role_address#0" ] }, - "5227": { + "5279": { "error": "Invalid role identifier", "op": "err // Invalid role identifier" }, - "5228": { + "5280": { "block": "rbac_get_role_validity_switch_case_5@7", "stack_in": [ "role_address#0" @@ -48574,7 +48808,7 @@ "0x523a4d4f4323" ] }, - "5230": { + "5282": { "op": "dig 1", "defined_out": [ "0x523a4d4f4323", @@ -48586,7 +48820,7 @@ "role_address#0" ] }, - "5232": { + "5284": { "op": "concat", "defined_out": [ "box_prefixed_key%0#1", @@ -48597,7 +48831,7 @@ "box_prefixed_key%0#1" ] }, - "5233": { + "5285": { "op": "dup", "defined_out": [ "box_prefixed_key%0#1", @@ -48610,7 +48844,7 @@ "box_prefixed_key%0#1 (copy)" ] }, - "5234": { + "5286": { "op": "box_len", "defined_out": [ "_%0#0", @@ -48625,7 +48859,7 @@ "maybe_exists%0#0" ] }, - "5235": { + "5287": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -48633,7 +48867,7 @@ "maybe_exists%0#0" ] }, - "5237": { + "5289": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -48641,7 +48875,7 @@ "box_prefixed_key%0#1" ] }, - "5238": { + "5290": { "op": "box_get", "defined_out": [ "aggregate%box_get%8#0", @@ -48654,7 +48888,7 @@ "aggregate%box_get%9#0" ] }, - "5239": { + "5291": { "op": "pop", "defined_out": [ "role_address#0", @@ -48665,7 +48899,7 @@ "tmp%3#0" ] }, - "5240": { + "5292": { "block": "rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9", "stack_in": [ "role_address#0", @@ -48681,7 +48915,7 @@ "0x151f7c75" ] }, - "5241": { + "5293": { "op": "swap", "defined_out": [ "0x151f7c75", @@ -48693,7 +48927,7 @@ "tmp%3#0" ] }, - "5242": { + "5294": { "op": "concat", "defined_out": [ "tmp%4#0" @@ -48703,13 +48937,13 @@ "tmp%4#0" ] }, - "5243": { + "5295": { "op": "log", "stack_out": [ "role_address#0" ] }, - "5244": { + "5296": { "op": "intc_1 // 1", "defined_out": [ "1" @@ -48719,13 +48953,13 @@ "1" ] }, - "5245": { + "5297": { "op": "return", "stack_out": [ "role_address#0" ] }, - "5246": { + "5298": { "block": "rbac_get_role_validity_switch_case_4@6", "stack_in": [ "role_address#0" @@ -48739,7 +48973,7 @@ "0x523a41555423" ] }, - "5248": { + "5300": { "op": "dig 1", "defined_out": [ "0x523a41555423", @@ -48751,7 +48985,7 @@ "role_address#0" ] }, - "5250": { + "5302": { "op": "concat", "defined_out": [ "box_prefixed_key%0#1", @@ -48762,7 +48996,7 @@ "box_prefixed_key%0#1" ] }, - "5251": { + "5303": { "op": "dup", "defined_out": [ "box_prefixed_key%0#1", @@ -48775,7 +49009,7 @@ "box_prefixed_key%0#1 (copy)" ] }, - "5252": { + "5304": { "op": "box_len", "defined_out": [ "_%0#0", @@ -48790,7 +49024,7 @@ "maybe_exists%0#0" ] }, - "5253": { + "5305": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -48798,7 +49032,7 @@ "maybe_exists%0#0" ] }, - "5255": { + "5307": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -48806,7 +49040,7 @@ "box_prefixed_key%0#1" ] }, - "5256": { + "5308": { "op": "box_get", "defined_out": [ "aggregate%box_get%6#0", @@ -48819,7 +49053,7 @@ "aggregate%box_get%7#0" ] }, - "5257": { + "5309": { "op": "pop", "defined_out": [ "role_address#0", @@ -48830,15 +49064,15 @@ "tmp%3#0" ] }, - "5258": { + "5310": { "op": "b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9" }, - "5261": { + "5313": { "block": "rbac_get_role_validity_switch_case_3@5", "stack_in": [ "role_address#0" ], - "op": "bytec 32 // 0x523a54525323", + "op": "bytec 26 // 0x523a54525323", "defined_out": [ "0x523a54525323" ], @@ -48847,7 +49081,7 @@ "0x523a54525323" ] }, - "5263": { + "5315": { "op": "dig 1", "defined_out": [ "0x523a54525323", @@ -48859,7 +49093,7 @@ "role_address#0" ] }, - "5265": { + "5317": { "op": "concat", "defined_out": [ "box_prefixed_key%0#1", @@ -48870,7 +49104,7 @@ "box_prefixed_key%0#1" ] }, - "5266": { + "5318": { "op": "dup", "defined_out": [ "box_prefixed_key%0#1", @@ -48883,7 +49117,7 @@ "box_prefixed_key%0#1 (copy)" ] }, - "5267": { + "5319": { "op": "box_len", "defined_out": [ "_%0#0", @@ -48898,7 +49132,7 @@ "maybe_exists%0#0" ] }, - "5268": { + "5320": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -48906,7 +49140,7 @@ "maybe_exists%0#0" ] }, - "5270": { + "5322": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -48914,7 +49148,7 @@ "box_prefixed_key%0#1" ] }, - "5271": { + "5323": { "op": "box_get", "defined_out": [ "aggregate%box_get%4#0", @@ -48927,7 +49161,7 @@ "aggregate%box_get%5#0" ] }, - "5272": { + "5324": { "op": "pop", "defined_out": [ "role_address#0", @@ -48938,10 +49172,10 @@ "tmp%3#0" ] }, - "5273": { + "5325": { "op": "b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9" }, - "5276": { + "5328": { "block": "rbac_get_role_validity_switch_case_2@4", "stack_in": [ "role_address#0" @@ -48955,7 +49189,7 @@ "0x523a50594423" ] }, - "5278": { + "5330": { "op": "dig 1", "defined_out": [ "0x523a50594423", @@ -48967,7 +49201,7 @@ "role_address#0" ] }, - "5280": { + "5332": { "op": "concat", "defined_out": [ "box_prefixed_key%0#1", @@ -48978,7 +49212,7 @@ "box_prefixed_key%0#1" ] }, - "5281": { + "5333": { "op": "dup", "defined_out": [ "box_prefixed_key%0#1", @@ -48991,7 +49225,7 @@ "box_prefixed_key%0#1 (copy)" ] }, - "5282": { + "5334": { "op": "box_len", "defined_out": [ "_%0#0", @@ -49006,7 +49240,7 @@ "maybe_exists%0#0" ] }, - "5283": { + "5335": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -49014,7 +49248,7 @@ "maybe_exists%0#0" ] }, - "5285": { + "5337": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -49022,7 +49256,7 @@ "box_prefixed_key%0#1" ] }, - "5286": { + "5338": { "op": "box_get", "defined_out": [ "aggregate%box_get%2#0", @@ -49035,7 +49269,7 @@ "aggregate%box_get%3#0" ] }, - "5287": { + "5339": { "op": "pop", "defined_out": [ "role_address#0", @@ -49046,10 +49280,10 @@ "tmp%3#0" ] }, - "5288": { + "5340": { "op": "b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9" }, - "5291": { + "5343": { "block": "rbac_get_role_validity_switch_case_1@3", "stack_in": [ "role_address#0" @@ -49063,7 +49297,7 @@ "0x523a4d4e4723" ] }, - "5293": { + "5345": { "op": "dig 1", "defined_out": [ "0x523a4d4e4723", @@ -49075,7 +49309,7 @@ "role_address#0" ] }, - "5295": { + "5347": { "op": "concat", "defined_out": [ "box_prefixed_key%0#1", @@ -49086,7 +49320,7 @@ "box_prefixed_key%0#1" ] }, - "5296": { + "5348": { "op": "dup", "defined_out": [ "box_prefixed_key%0#1", @@ -49099,7 +49333,7 @@ "box_prefixed_key%0#1 (copy)" ] }, - "5297": { + "5349": { "op": "box_len", "defined_out": [ "_%0#0", @@ -49114,7 +49348,7 @@ "maybe_exists%0#0" ] }, - "5298": { + "5350": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -49122,7 +49356,7 @@ "maybe_exists%0#0" ] }, - "5300": { + "5352": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -49130,7 +49364,7 @@ "box_prefixed_key%0#1" ] }, - "5301": { + "5353": { "op": "box_get", "defined_out": [ "aggregate%box_get%0#0", @@ -49143,7 +49377,7 @@ "aggregate%box_get%1#0" ] }, - "5302": { + "5354": { "op": "pop", "defined_out": [ "role_address#0", @@ -49154,10 +49388,10 @@ "tmp%3#0" ] }, - "5303": { + "5355": { "op": "b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9" }, - "5306": { + "5358": { "block": "rbac_get_role_validity_switch_case_0@2", "stack_in": [ "role_address#0" @@ -49171,10 +49405,10 @@ "tmp%3#0" ] }, - "5324": { + "5376": { "op": "b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9" }, - "5327": { + "5379": { "subroutine": "modules.accounting.AccountingModule._assert_is_not_account_suspended", "params": { "holding_address#0": "bytes" @@ -49183,7 +49417,7 @@ "stack_in": [], "op": "proto 1 0" }, - "5330": { + "5382": { "op": "bytec 8 // 0x4123", "defined_out": [ "0x4123" @@ -49192,7 +49426,7 @@ "0x4123" ] }, - "5332": { + "5384": { "op": "frame_dig -1", "defined_out": [ "0x4123", @@ -49203,7 +49437,7 @@ "holding_address#0 (copy)" ] }, - "5334": { + "5386": { "op": "concat", "defined_out": [ "box_prefixed_key%0#0" @@ -49212,7 +49446,7 @@ "box_prefixed_key%0#0" ] }, - "5335": { + "5387": { "op": "box_get", "defined_out": [ "aggregate%box_get%0#0", @@ -49223,14 +49457,14 @@ "aggregate%box_get%1#0" ] }, - "5336": { + "5388": { "error": "check self.account entry exists", "op": "assert // check self.account entry exists", "stack_out": [ "aggregate%box_get%0#0" ] }, - "5337": { + "5389": { "op": "pushint 384", "defined_out": [ "384", @@ -49241,7 +49475,7 @@ "384" ] }, - "5340": { + "5392": { "op": "getbit", "defined_out": [ "aggregate%get_bit%0#0" @@ -49250,7 +49484,7 @@ "aggregate%get_bit%0#0" ] }, - "5341": { + "5393": { "op": "!", "defined_out": [ "tmp%0#0" @@ -49259,16 +49493,16 @@ "tmp%0#0" ] }, - "5342": { + "5394": { "error": "Suspended operations", "op": "assert // Suspended operations", "stack_out": [] }, - "5343": { + "5395": { "retsub": true, "op": "retsub" }, - "5344": { + "5396": { "subroutine": "modules.accounting.AccountingModule._settle_position", "params": { "holding_address#0": "bytes" @@ -49277,7 +49511,7 @@ "stack_in": [], "op": "proto 1 2" }, - "5347": { + "5399": { "op": "bytec 8 // 0x4123", "defined_out": [ "0x4123" @@ -49286,7 +49520,7 @@ "0x4123" ] }, - "5349": { + "5401": { "op": "frame_dig -1", "defined_out": [ "0x4123", @@ -49297,7 +49531,7 @@ "holding_address#0 (copy)" ] }, - "5351": { + "5403": { "op": "concat", "defined_out": [ "box_prefixed_key%0#1" @@ -49306,7 +49540,7 @@ "box_prefixed_key%0#1" ] }, - "5352": { + "5404": { "op": "dup", "defined_out": [ "box_prefixed_key%0#1", @@ -49317,7 +49551,7 @@ "box_prefixed_key%0#1 (copy)" ] }, - "5353": { + "5405": { "op": "box_len", "defined_out": [ "_%0#0", @@ -49330,28 +49564,28 @@ "maybe_exists%0#0" ] }, - "5354": { + "5406": { "op": "bury 1", "stack_out": [ "box_prefixed_key%0#1", "maybe_exists%0#0" ] }, - "5356": { + "5408": { "error": "Invalid account holding address", "op": "assert // Invalid account holding address", "stack_out": [ "box_prefixed_key%0#1" ] }, - "5357": { + "5409": { "op": "dup", "stack_out": [ "box_prefixed_key%0#1", "box_prefixed_key%0#1 (copy)" ] }, - "5358": { + "5410": { "op": "box_get", "defined_out": [ "aggregate%box_get%1#0", @@ -49364,14 +49598,14 @@ "aggregate%box_get%1#0" ] }, - "5359": { + "5411": { "op": "pop", "stack_out": [ "box_prefixed_key%0#1", "position#0" ] }, - "5360": { + "5412": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -49384,7 +49618,7 @@ "0" ] }, - "5361": { + "5413": { "op": "bytec 16 // \"cumulative_interest_index\"", "defined_out": [ "\"cumulative_interest_index\"", @@ -49399,7 +49633,7 @@ "\"cumulative_interest_index\"" ] }, - "5363": { + "5415": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#1", @@ -49414,7 +49648,7 @@ "maybe_exists%0#0" ] }, - "5364": { + "5416": { "error": "check self.cumulative_interest_index exists", "op": "assert // check self.cumulative_interest_index exists", "stack_out": [ @@ -49423,7 +49657,7 @@ "maybe_value%0#0" ] }, - "5365": { + "5417": { "op": "dig 1", "defined_out": [ "box_prefixed_key%0#1", @@ -49438,7 +49672,7 @@ "position#0 (copy)" ] }, - "5367": { + "5419": { "op": "pushint 57", "defined_out": [ "57", @@ -49455,7 +49689,7 @@ "57" ] }, - "5369": { + "5421": { "op": "extract_uint64", "defined_out": [ "box_prefixed_key%0#1", @@ -49470,7 +49704,7 @@ "values%0#0" ] }, - "5370": { + "5422": { "op": "-", "defined_out": [ "box_prefixed_key%0#1", @@ -49483,7 +49717,7 @@ "interest_delta#0" ] }, - "5371": { + "5423": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#1", @@ -49492,7 +49726,7 @@ "0" ] }, - "5372": { + "5424": { "op": "bytec 17 // \"cumulative_principal_index\"", "defined_out": [ "\"cumulative_principal_index\"", @@ -49509,7 +49743,7 @@ "\"cumulative_principal_index\"" ] }, - "5374": { + "5426": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#1", @@ -49526,7 +49760,7 @@ "maybe_exists%1#0" ] }, - "5375": { + "5427": { "error": "check self.cumulative_principal_index exists", "op": "assert // check self.cumulative_principal_index exists", "stack_out": [ @@ -49536,7 +49770,7 @@ "maybe_value%1#0" ] }, - "5376": { + "5428": { "op": "dig 2", "stack_out": [ "box_prefixed_key%0#1", @@ -49546,7 +49780,7 @@ "position#0 (copy)" ] }, - "5378": { + "5430": { "op": "pushint 65", "defined_out": [ "65", @@ -49565,7 +49799,7 @@ "65" ] }, - "5380": { + "5432": { "op": "extract_uint64", "defined_out": [ "box_prefixed_key%0#1", @@ -49582,7 +49816,7 @@ "values%1#0" ] }, - "5381": { + "5433": { "op": "-", "defined_out": [ "box_prefixed_key%0#1", @@ -49597,7 +49831,7 @@ "principal_delta#0" ] }, - "5382": { + "5434": { "op": "dig 2", "stack_out": [ "box_prefixed_key%0#1", @@ -49607,7 +49841,7 @@ "position#0 (copy)" ] }, - "5384": { + "5436": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -49626,7 +49860,7 @@ "32" ] }, - "5385": { + "5437": { "op": "extract_uint64", "defined_out": [ "box_prefixed_key%0#1", @@ -49643,7 +49877,7 @@ "values%2#0" ] }, - "5386": { + "5438": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#1", @@ -49654,7 +49888,7 @@ "0" ] }, - "5387": { + "5439": { "op": "bytec 5 // \"fixed_point_scale\"", "defined_out": [ "\"fixed_point_scale\"", @@ -49675,7 +49909,7 @@ "\"fixed_point_scale\"" ] }, - "5389": { + "5441": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#1", @@ -49696,7 +49930,7 @@ "maybe_exists%2#0" ] }, - "5390": { + "5442": { "error": "check self.fixed_point_scale exists", "op": "assert // check self.fixed_point_scale exists", "stack_out": [ @@ -49708,7 +49942,7 @@ "maybe_value%2#0" ] }, - "5391": { + "5443": { "op": "uncover 3", "stack_out": [ "box_prefixed_key%0#1", @@ -49719,7 +49953,7 @@ "interest_delta#0" ] }, - "5393": { + "5445": { "op": "dig 2", "defined_out": [ "box_prefixed_key%0#1", @@ -49740,7 +49974,7 @@ "values%2#0 (copy)" ] }, - "5395": { + "5447": { "op": "uncover 2", "stack_out": [ "box_prefixed_key%0#1", @@ -49752,7 +49986,7 @@ "maybe_value%2#0" ] }, - "5397": { + "5449": { "callsub": "modules.actus_kernel.ActusKernelModule._scaled_mul_div", "op": "callsub _scaled_mul_div", "defined_out": [ @@ -49770,7 +50004,7 @@ "claimable_interest#0" ] }, - "5400": { + "5452": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#1", @@ -49781,7 +50015,7 @@ "0" ] }, - "5401": { + "5453": { "op": "bytec 5 // \"fixed_point_scale\"", "stack_out": [ "box_prefixed_key%0#1", @@ -49793,7 +50027,7 @@ "\"fixed_point_scale\"" ] }, - "5403": { + "5455": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#1", @@ -49814,7 +50048,7 @@ "maybe_exists%3#0" ] }, - "5404": { + "5456": { "error": "check self.fixed_point_scale exists", "op": "assert // check self.fixed_point_scale exists", "stack_out": [ @@ -49826,7 +50060,7 @@ "maybe_value%3#0" ] }, - "5405": { + "5457": { "op": "uncover 3", "stack_out": [ "box_prefixed_key%0#1", @@ -49837,7 +50071,7 @@ "principal_delta#0" ] }, - "5407": { + "5459": { "op": "uncover 3", "stack_out": [ "box_prefixed_key%0#1", @@ -49848,7 +50082,7 @@ "values%2#0" ] }, - "5409": { + "5461": { "op": "uncover 2", "stack_out": [ "box_prefixed_key%0#1", @@ -49859,7 +50093,7 @@ "maybe_value%3#0" ] }, - "5411": { + "5463": { "callsub": "modules.actus_kernel.ActusKernelModule._scaled_mul_div", "op": "callsub _scaled_mul_div", "defined_out": [ @@ -49875,7 +50109,7 @@ "claimable_principal#0" ] }, - "5414": { + "5466": { "op": "dig 2", "stack_out": [ "box_prefixed_key%0#1", @@ -49885,7 +50119,7 @@ "position#0 (copy)" ] }, - "5416": { + "5468": { "op": "pushint 73", "defined_out": [ "73", @@ -49904,7 +50138,7 @@ "73" ] }, - "5418": { + "5470": { "op": "extract_uint64", "defined_out": [ "box_prefixed_key%0#1", @@ -49921,7 +50155,7 @@ "values%4#0" ] }, - "5419": { + "5471": { "op": "dig 2", "defined_out": [ "box_prefixed_key%0#1", @@ -49940,7 +50174,7 @@ "claimable_interest#0 (copy)" ] }, - "5421": { + "5473": { "op": "+", "defined_out": [ "box_prefixed_key%0#1", @@ -49957,7 +50191,7 @@ "tmp%4#0" ] }, - "5422": { + "5474": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0", @@ -49974,7 +50208,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "5423": { + "5475": { "op": "uncover 3", "stack_out": [ "box_prefixed_key%0#1", @@ -49984,7 +50218,7 @@ "position#0" ] }, - "5425": { + "5477": { "op": "swap", "stack_out": [ "box_prefixed_key%0#1", @@ -49994,7 +50228,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "5426": { + "5478": { "op": "replace2 73", "stack_out": [ "box_prefixed_key%0#1", @@ -50003,7 +50237,7 @@ "position#0" ] }, - "5428": { + "5480": { "op": "dup", "stack_out": [ "box_prefixed_key%0#1", @@ -50013,7 +50247,7 @@ "position#0 (copy)" ] }, - "5429": { + "5481": { "op": "pushint 81", "defined_out": [ "81", @@ -50032,7 +50266,7 @@ "81" ] }, - "5431": { + "5483": { "op": "extract_uint64", "defined_out": [ "box_prefixed_key%0#1", @@ -50049,7 +50283,7 @@ "values%5#0" ] }, - "5432": { + "5484": { "op": "dig 2", "defined_out": [ "box_prefixed_key%0#1", @@ -50068,7 +50302,7 @@ "claimable_principal#0 (copy)" ] }, - "5434": { + "5486": { "op": "+", "defined_out": [ "box_prefixed_key%0#1", @@ -50085,7 +50319,7 @@ "tmp%5#0" ] }, - "5435": { + "5487": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%1#0", @@ -50102,7 +50336,7 @@ "aggregate%val_as_bytes%1#0" ] }, - "5436": { + "5488": { "op": "replace2 81", "stack_out": [ "box_prefixed_key%0#1", @@ -50111,7 +50345,7 @@ "position#0" ] }, - "5438": { + "5490": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#1", @@ -50121,7 +50355,7 @@ "0" ] }, - "5439": { + "5491": { "op": "bytec 16 // \"cumulative_interest_index\"", "stack_out": [ "box_prefixed_key%0#1", @@ -50132,7 +50366,7 @@ "\"cumulative_interest_index\"" ] }, - "5441": { + "5493": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#1", @@ -50151,7 +50385,7 @@ "maybe_exists%4#0" ] }, - "5442": { + "5494": { "error": "check self.cumulative_interest_index exists", "op": "assert // check self.cumulative_interest_index exists", "stack_out": [ @@ -50162,7 +50396,7 @@ "maybe_value%4#0" ] }, - "5443": { + "5495": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%2#0", @@ -50179,7 +50413,7 @@ "aggregate%val_as_bytes%2#0" ] }, - "5444": { + "5496": { "op": "replace2 57", "stack_out": [ "box_prefixed_key%0#1", @@ -50188,7 +50422,7 @@ "position#0" ] }, - "5446": { + "5498": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#1", @@ -50198,7 +50432,7 @@ "0" ] }, - "5447": { + "5499": { "op": "bytec 17 // \"cumulative_principal_index\"", "stack_out": [ "box_prefixed_key%0#1", @@ -50209,7 +50443,7 @@ "\"cumulative_principal_index\"" ] }, - "5449": { + "5501": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#1", @@ -50228,7 +50462,7 @@ "maybe_exists%5#0" ] }, - "5450": { + "5502": { "error": "check self.cumulative_principal_index exists", "op": "assert // check self.cumulative_principal_index exists", "stack_out": [ @@ -50239,7 +50473,7 @@ "maybe_value%5#0" ] }, - "5451": { + "5503": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%3#0", @@ -50256,7 +50490,7 @@ "aggregate%val_as_bytes%3#0" ] }, - "5452": { + "5504": { "op": "replace2 65", "stack_out": [ "box_prefixed_key%0#1", @@ -50265,7 +50499,7 @@ "position#0" ] }, - "5454": { + "5506": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#1", @@ -50275,7 +50509,7 @@ "0" ] }, - "5455": { + "5507": { "op": "bytec_2 // \"event_cursor\"", "defined_out": [ "\"event_cursor\"", @@ -50294,7 +50528,7 @@ "\"event_cursor\"" ] }, - "5456": { + "5508": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#1", @@ -50313,7 +50547,7 @@ "maybe_exists%6#0" ] }, - "5457": { + "5509": { "error": "check self.event_cursor exists", "op": "assert // check self.event_cursor exists", "stack_out": [ @@ -50324,7 +50558,7 @@ "maybe_value%6#0" ] }, - "5458": { + "5510": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%4#0", @@ -50341,7 +50575,7 @@ "aggregate%val_as_bytes%4#0" ] }, - "5459": { + "5511": { "op": "replace2 49", "stack_out": [ "box_prefixed_key%0#1", @@ -50350,7 +50584,7 @@ "position#0" ] }, - "5461": { + "5513": { "op": "uncover 3", "stack_out": [ "claimable_interest#0", @@ -50359,7 +50593,7 @@ "box_prefixed_key%0#1" ] }, - "5463": { + "5515": { "op": "swap", "stack_out": [ "claimable_interest#0", @@ -50368,18 +50602,18 @@ "position#0" ] }, - "5464": { + "5516": { "op": "box_put", "stack_out": [ "claimable_interest#0", "claimable_principal#0" ] }, - "5465": { + "5517": { "retsub": true, "op": "retsub" }, - "5466": { + "5518": { "subroutine": "modules.accounting.AccountingModule._ensure_units_activated", "params": { "holding_address#0": "bytes" @@ -50388,20 +50622,20 @@ "stack_in": [], "op": "proto 1 0" }, - "5469": { + "5521": { "op": "intc_0 // 0", "stack_out": [ "position#0" ] }, - "5470": { + "5522": { "op": "pushbytes \"\"", "stack_out": [ "position#0", "activated_units#0" ] }, - "5472": { + "5524": { "op": "bytec 8 // 0x4123", "defined_out": [ "0x4123" @@ -50412,7 +50646,7 @@ "0x4123" ] }, - "5474": { + "5526": { "op": "frame_dig -1", "defined_out": [ "0x4123", @@ -50425,7 +50659,7 @@ "holding_address#0 (copy)" ] }, - "5476": { + "5528": { "op": "concat", "defined_out": [ "box_prefixed_key%0#1" @@ -50436,7 +50670,7 @@ "box_prefixed_key%0#1" ] }, - "5477": { + "5529": { "op": "dup", "defined_out": [ "box_prefixed_key%0#1" @@ -50448,7 +50682,7 @@ "box_prefixed_key%0#1" ] }, - "5478": { + "5530": { "op": "box_len", "defined_out": [ "_%0#0", @@ -50463,7 +50697,7 @@ "maybe_exists%0#0" ] }, - "5479": { + "5531": { "op": "bury 1", "stack_out": [ "position#0", @@ -50472,7 +50706,7 @@ "maybe_exists%0#0" ] }, - "5481": { + "5533": { "error": "Invalid account holding address", "op": "assert // Invalid account holding address", "stack_out": [ @@ -50481,7 +50715,7 @@ "box_prefixed_key%0#1" ] }, - "5482": { + "5534": { "op": "intc_0 // 0", "stack_out": [ "position#0", @@ -50490,7 +50724,7 @@ "0" ] }, - "5483": { + "5535": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"", @@ -50505,7 +50739,7 @@ "\"status\"" ] }, - "5484": { + "5536": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#1", @@ -50520,7 +50754,7 @@ "maybe_exists%0#0" ] }, - "5485": { + "5537": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ @@ -50530,7 +50764,7 @@ "maybe_value%0#0" ] }, - "5486": { + "5538": { "op": "pushint 50", "defined_out": [ "50", @@ -50545,7 +50779,7 @@ "50" ] }, - "5488": { + "5540": { "op": "==", "defined_out": [ "box_prefixed_key%0#1", @@ -50558,7 +50792,7 @@ "tmp%0#1" ] }, - "5489": { + "5541": { "op": "bz _ensure_units_activated_after_if_else@2", "stack_out": [ "position#0", @@ -50566,11 +50800,11 @@ "box_prefixed_key%0#1" ] }, - "5492": { + "5544": { "retsub": true, "op": "retsub" }, - "5493": { + "5545": { "block": "_ensure_units_activated_after_if_else@2", "stack_in": [ "position#0", @@ -50588,7 +50822,7 @@ "box_prefixed_key%0#1" ] }, - "5495": { + "5547": { "op": "box_get", "defined_out": [ "aggregate%box_get%1#0", @@ -50603,7 +50837,7 @@ "aggregate%box_get%1#0" ] }, - "5496": { + "5548": { "op": "swap", "stack_out": [ "position#0", @@ -50613,7 +50847,7 @@ "position#0" ] }, - "5497": { + "5549": { "op": "dup", "stack_out": [ "position#0", @@ -50624,7 +50858,7 @@ "position#0 (copy)" ] }, - "5498": { + "5550": { "op": "cover 2", "stack_out": [ "position#0", @@ -50635,7 +50869,7 @@ "position#0" ] }, - "5500": { + "5552": { "op": "frame_bury 0", "defined_out": [ "aggregate%box_get%1#0", @@ -50650,7 +50884,7 @@ "aggregate%box_get%1#0" ] }, - "5502": { + "5554": { "error": "check self.account entry exists", "op": "assert // check self.account entry exists", "stack_out": [ @@ -50660,7 +50894,7 @@ "position#0" ] }, - "5503": { + "5555": { "op": "pushint 40", "defined_out": [ "40", @@ -50675,7 +50909,7 @@ "40" ] }, - "5505": { + "5557": { "op": "extract_uint64", "defined_out": [ "activated_units#0", @@ -50689,7 +50923,7 @@ "activated_units#0" ] }, - "5506": { + "5558": { "op": "dup", "stack_out": [ "position#0", @@ -50699,7 +50933,7 @@ "activated_units#0" ] }, - "5507": { + "5559": { "op": "frame_bury 1", "defined_out": [ "activated_units#0", @@ -50713,7 +50947,7 @@ "activated_units#0" ] }, - "5509": { + "5561": { "op": "bnz _ensure_units_activated_after_if_else@4", "stack_out": [ "position#0", @@ -50721,11 +50955,11 @@ "box_prefixed_key%0#1" ] }, - "5512": { + "5564": { "retsub": true, "op": "retsub" }, - "5513": { + "5565": { "block": "_ensure_units_activated_after_if_else@4", "stack_in": [ "position#0", @@ -50743,7 +50977,7 @@ "position#0" ] }, - "5515": { + "5567": { "op": "dup", "defined_out": [ "position#0", @@ -50757,7 +50991,7 @@ "position#0 (copy)" ] }, - "5516": { + "5568": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -50773,7 +51007,7 @@ "32" ] }, - "5517": { + "5569": { "op": "extract_uint64", "defined_out": [ "position#0", @@ -50787,7 +51021,7 @@ "values%2#0" ] }, - "5518": { + "5570": { "op": "frame_dig 1", "defined_out": [ "activated_units#0", @@ -50803,7 +51037,7 @@ "activated_units#0" ] }, - "5520": { + "5572": { "op": "dup", "defined_out": [ "activated_units#0", @@ -50821,7 +51055,7 @@ "activated_units#0 (copy)" ] }, - "5521": { + "5573": { "op": "cover 3", "stack_out": [ "position#0", @@ -50833,7 +51067,7 @@ "activated_units#0 (copy)" ] }, - "5523": { + "5575": { "op": "+", "defined_out": [ "activated_units#0", @@ -50849,7 +51083,7 @@ "tmp%2#0" ] }, - "5524": { + "5576": { "op": "itob", "defined_out": [ "activated_units#0", @@ -50865,7 +51099,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "5525": { + "5577": { "op": "replace2 32", "stack_out": [ "position#0", @@ -50875,7 +51109,7 @@ "position#0" ] }, - "5527": { + "5579": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -50891,7 +51125,7 @@ "0" ] }, - "5528": { + "5580": { "op": "itob", "defined_out": [ "activated_units#0", @@ -50907,7 +51141,7 @@ "aggregate%val_as_bytes%1#0" ] }, - "5529": { + "5581": { "op": "replace2 40", "stack_out": [ "position#0", @@ -50917,7 +51151,7 @@ "position#0" ] }, - "5531": { + "5583": { "op": "frame_dig 2", "defined_out": [ "activated_units#0", @@ -50933,7 +51167,7 @@ "box_prefixed_key%0#1" ] }, - "5533": { + "5585": { "op": "swap", "stack_out": [ "position#0", @@ -50944,7 +51178,7 @@ "position#0" ] }, - "5534": { + "5586": { "op": "box_put", "stack_out": [ "position#0", @@ -50953,7 +51187,7 @@ "activated_units#0" ] }, - "5535": { + "5587": { "op": "intc_0 // 0", "stack_out": [ "position#0", @@ -50963,7 +51197,7 @@ "0" ] }, - "5536": { + "5588": { "op": "bytec 11 // \"reserved_units_total\"", "defined_out": [ "\"reserved_units_total\"", @@ -50981,7 +51215,7 @@ "\"reserved_units_total\"" ] }, - "5538": { + "5590": { "op": "app_global_get_ex", "defined_out": [ "activated_units#0", @@ -50999,7 +51233,7 @@ "maybe_exists%0#0" ] }, - "5539": { + "5591": { "error": "check self.reserved_units_total exists", "op": "assert // check self.reserved_units_total exists", "stack_out": [ @@ -51010,7 +51244,7 @@ "maybe_value%0#0" ] }, - "5540": { + "5592": { "op": "dup", "defined_out": [ "activated_units#0", @@ -51028,7 +51262,7 @@ "maybe_value%0#0 (copy)" ] }, - "5541": { + "5593": { "op": "dig 2", "stack_out": [ "position#0", @@ -51040,7 +51274,7 @@ "activated_units#0 (copy)" ] }, - "5543": { + "5595": { "op": ">=", "defined_out": [ "activated_units#0", @@ -51058,7 +51292,7 @@ "tmp%3#0" ] }, - "5544": { + "5596": { "error": "Insufficient remaining D-ASA units", "op": "assert // Insufficient remaining D-ASA units", "stack_out": [ @@ -51069,7 +51303,7 @@ "maybe_value%0#0" ] }, - "5545": { + "5597": { "op": "swap", "stack_out": [ "position#0", @@ -51079,7 +51313,7 @@ "activated_units#0" ] }, - "5546": { + "5598": { "op": "-", "defined_out": [ "activated_units#0", @@ -51094,7 +51328,7 @@ "tmp%4#0" ] }, - "5547": { + "5599": { "op": "bytec 11 // \"reserved_units_total\"", "stack_out": [ "position#0", @@ -51104,7 +51338,7 @@ "\"reserved_units_total\"" ] }, - "5549": { + "5601": { "op": "swap", "stack_out": [ "position#0", @@ -51114,7 +51348,7 @@ "tmp%4#0" ] }, - "5550": { + "5602": { "op": "app_global_put", "stack_out": [ "position#0", @@ -51122,11 +51356,11 @@ "box_prefixed_key%0#1" ] }, - "5551": { + "5603": { "retsub": true, "op": "retsub" }, - "5552": { + "5604": { "subroutine": "modules.actus_kernel.ActusKernelModule._scaled_mul_div", "params": { "multiplicand#0": "uint64", @@ -51137,7 +51371,7 @@ "stack_in": [], "op": "proto 3 1" }, - "5555": { + "5607": { "op": "frame_dig -3", "defined_out": [ "multiplicand#0 (copy)" @@ -51146,11 +51380,11 @@ "multiplicand#0 (copy)" ] }, - "5557": { + "5609": { "op": "bz _scaled_mul_div_if_body@2", "stack_out": [] }, - "5560": { + "5612": { "op": "frame_dig -2", "defined_out": [ "multiplier#0 (copy)" @@ -51159,11 +51393,11 @@ "multiplier#0 (copy)" ] }, - "5562": { + "5614": { "op": "bnz _scaled_mul_div_after_if_else@3", "stack_out": [] }, - "5565": { + "5617": { "block": "_scaled_mul_div_if_body@2", "stack_in": [], "op": "intc_0 // 0", @@ -51174,11 +51408,11 @@ "0" ] }, - "5566": { + "5618": { "retsub": true, "op": "retsub" }, - "5567": { + "5619": { "block": "_scaled_mul_div_after_if_else@3", "stack_in": [], "op": "frame_dig -3", @@ -51189,7 +51423,7 @@ "multiplicand#0 (copy)" ] }, - "5569": { + "5621": { "op": "frame_dig -2", "defined_out": [ "multiplicand#0 (copy)", @@ -51200,7 +51434,7 @@ "multiplier#0 (copy)" ] }, - "5571": { + "5623": { "op": "mulw", "defined_out": [ "high#0", @@ -51211,7 +51445,7 @@ "low#0" ] }, - "5572": { + "5624": { "op": "frame_dig -1", "defined_out": [ "divisor#0 (copy)", @@ -51224,7 +51458,7 @@ "divisor#0 (copy)" ] }, - "5574": { + "5626": { "op": "divw", "defined_out": [ "tmp%4#0" @@ -51233,11 +51467,11 @@ "tmp%4#0" ] }, - "5575": { + "5627": { "retsub": true, "op": "retsub" }, - "5576": { + "5628": { "subroutine": "modules.actus_kernel.ActusKernelModule._amount_to_index_delta", "params": { "amount#0": "uint64" @@ -51246,7 +51480,7 @@ "stack_in": [], "op": "proto 1 1" }, - "5579": { + "5631": { "op": "frame_dig -1", "defined_out": [ "amount#0 (copy)" @@ -51255,11 +51489,11 @@ "amount#0 (copy)" ] }, - "5581": { + "5633": { "op": "bnz _amount_to_index_delta_after_if_else@2", "stack_out": [] }, - "5584": { + "5636": { "op": "intc_0 // 0", "defined_out": [ "0" @@ -51268,11 +51502,11 @@ "0" ] }, - "5585": { + "5637": { "retsub": true, "op": "retsub" }, - "5586": { + "5638": { "block": "_amount_to_index_delta_after_if_else@2", "stack_in": [], "op": "intc_0 // 0", @@ -51283,7 +51517,7 @@ "0" ] }, - "5587": { + "5639": { "op": "bytec 13 // \"total_units\"", "defined_out": [ "\"total_units\"", @@ -51294,7 +51528,7 @@ "\"total_units\"" ] }, - "5589": { + "5641": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -51305,14 +51539,14 @@ "maybe_exists%0#0" ] }, - "5590": { + "5642": { "error": "check self.total_units exists", "op": "assert // check self.total_units exists", "stack_out": [ "maybe_value%0#0" ] }, - "5591": { + "5643": { "op": "dup", "defined_out": [ "maybe_value%0#0", @@ -51323,21 +51557,21 @@ "maybe_value%0#0 (copy)" ] }, - "5592": { + "5644": { "error": "No D-ASA units", "op": "assert // No D-ASA units", "stack_out": [ "maybe_value%0#0" ] }, - "5593": { + "5645": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#0", "0" ] }, - "5594": { + "5646": { "op": "bytec 5 // \"fixed_point_scale\"", "defined_out": [ "\"fixed_point_scale\"", @@ -51350,7 +51584,7 @@ "\"fixed_point_scale\"" ] }, - "5596": { + "5648": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%1#0", @@ -51363,7 +51597,7 @@ "maybe_exists%1#0" ] }, - "5597": { + "5649": { "error": "check self.fixed_point_scale exists", "op": "assert // check self.fixed_point_scale exists", "stack_out": [ @@ -51371,7 +51605,7 @@ "maybe_value%1#0" ] }, - "5598": { + "5650": { "op": "frame_dig -1", "defined_out": [ "amount#0 (copy)", @@ -51384,7 +51618,7 @@ "amount#0 (copy)" ] }, - "5600": { + "5652": { "op": "swap", "stack_out": [ "maybe_value%0#0", @@ -51392,7 +51626,7 @@ "maybe_value%1#0" ] }, - "5601": { + "5653": { "op": "uncover 2", "stack_out": [ "amount#0 (copy)", @@ -51400,7 +51634,7 @@ "maybe_value%0#0" ] }, - "5603": { + "5655": { "callsub": "modules.actus_kernel.ActusKernelModule._scaled_mul_div", "op": "callsub _scaled_mul_div", "defined_out": [ @@ -51410,11 +51644,11 @@ "tmp%2#0" ] }, - "5606": { + "5658": { "retsub": true, "op": "retsub" }, - "5607": { + "5659": { "subroutine": "modules.actus_kernel.ActusKernelModule._index_delta_to_amount", "params": { "index_delta#0": "uint64" @@ -51423,7 +51657,7 @@ "stack_in": [], "op": "proto 1 1" }, - "5610": { + "5662": { "op": "frame_dig -1", "defined_out": [ "index_delta#0 (copy)" @@ -51432,11 +51666,11 @@ "index_delta#0 (copy)" ] }, - "5612": { + "5664": { "op": "bnz _index_delta_to_amount_after_if_else@2", "stack_out": [] }, - "5615": { + "5667": { "op": "intc_0 // 0", "defined_out": [ "0" @@ -51445,11 +51679,11 @@ "0" ] }, - "5616": { + "5668": { "retsub": true, "op": "retsub" }, - "5617": { + "5669": { "block": "_index_delta_to_amount_after_if_else@2", "stack_in": [], "op": "intc_0 // 0", @@ -51460,7 +51694,7 @@ "0" ] }, - "5618": { + "5670": { "op": "bytec 13 // \"total_units\"", "defined_out": [ "\"total_units\"", @@ -51471,7 +51705,7 @@ "\"total_units\"" ] }, - "5620": { + "5672": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -51482,21 +51716,21 @@ "maybe_exists%0#0" ] }, - "5621": { + "5673": { "error": "check self.total_units exists", "op": "assert // check self.total_units exists", "stack_out": [ "maybe_value%0#0" ] }, - "5622": { + "5674": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#0", "0" ] }, - "5623": { + "5675": { "op": "bytec 5 // \"fixed_point_scale\"", "defined_out": [ "\"fixed_point_scale\"", @@ -51509,7 +51743,7 @@ "\"fixed_point_scale\"" ] }, - "5625": { + "5677": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%1#0", @@ -51522,7 +51756,7 @@ "maybe_exists%1#0" ] }, - "5626": { + "5678": { "error": "check self.fixed_point_scale exists", "op": "assert // check self.fixed_point_scale exists", "stack_out": [ @@ -51530,10 +51764,10 @@ "maybe_value%1#0" ] }, - "5627": { + "5679": { "op": "frame_dig -1" }, - "5629": { + "5681": { "op": "swap", "defined_out": [ "index_delta#0 (copy)", @@ -51546,7 +51780,7 @@ "maybe_value%1#0" ] }, - "5630": { + "5682": { "callsub": "modules.actus_kernel.ActusKernelModule._scaled_mul_div", "op": "callsub _scaled_mul_div", "defined_out": [ @@ -51556,11 +51790,11 @@ "tmp%1#0" ] }, - "5633": { + "5685": { "retsub": true, "op": "retsub" }, - "5634": { + "5686": { "subroutine": "modules.actus_kernel.ActusKernelModule._get_schedule_entry", "params": { "event_id#0": "uint64" @@ -51569,7 +51803,7 @@ "stack_in": [], "op": "proto 1 1" }, - "5637": { + "5689": { "op": "intc_0 // 0", "defined_out": [ "0" @@ -51578,7 +51812,7 @@ "0" ] }, - "5638": { + "5690": { "op": "bytec_3 // \"schedule_entry_count\"", "defined_out": [ "\"schedule_entry_count\"", @@ -51589,7 +51823,7 @@ "\"schedule_entry_count\"" ] }, - "5639": { + "5691": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -51600,14 +51834,14 @@ "maybe_exists%0#0" ] }, - "5640": { + "5692": { "error": "check self.schedule_entry_count exists", "op": "assert // check self.schedule_entry_count exists", "stack_out": [ "maybe_value%0#0" ] }, - "5641": { + "5693": { "op": "frame_dig -1", "defined_out": [ "event_id#0 (copy)", @@ -51618,7 +51852,7 @@ "event_id#0 (copy)" ] }, - "5643": { + "5695": { "op": ">", "defined_out": [ "tmp%0#0" @@ -51627,18 +51861,18 @@ "tmp%0#0" ] }, - "5644": { + "5696": { "error": "Invalid event id", "op": "assert // Invalid event id", "stack_out": [] }, - "5645": { + "5697": { "op": "frame_dig -1", "stack_out": [ "event_id#0 (copy)" ] }, - "5647": { + "5699": { "op": "pushint 16", "defined_out": [ "16", @@ -51649,7 +51883,7 @@ "16" ] }, - "5649": { + "5701": { "op": "/", "defined_out": [ "page_index#0" @@ -51658,7 +51892,7 @@ "page_index#0" ] }, - "5650": { + "5702": { "op": "itob", "defined_out": [ "encoded_value%0#0" @@ -51667,7 +51901,7 @@ "encoded_value%0#0" ] }, - "5651": { + "5703": { "op": "bytec 24 // 0x5323", "defined_out": [ "0x5323", @@ -51678,14 +51912,14 @@ "0x5323" ] }, - "5653": { + "5705": { "op": "swap", "stack_out": [ "0x5323", "encoded_value%0#0" ] }, - "5654": { + "5706": { "op": "concat", "defined_out": [ "box_prefixed_key%0#0" @@ -51694,7 +51928,7 @@ "box_prefixed_key%0#0" ] }, - "5655": { + "5707": { "op": "dup", "defined_out": [ "box_prefixed_key%0#0", @@ -51705,7 +51939,7 @@ "box_prefixed_key%0#0 (copy)" ] }, - "5656": { + "5708": { "op": "box_len", "defined_out": [ "_%0#0", @@ -51718,28 +51952,28 @@ "maybe_exists%1#0" ] }, - "5657": { + "5709": { "op": "bury 1", "stack_out": [ "box_prefixed_key%0#0", "maybe_exists%1#0" ] }, - "5659": { + "5711": { "error": "Invalid schedule page", "op": "assert // Invalid schedule page", "stack_out": [ "box_prefixed_key%0#0" ] }, - "5660": { + "5712": { "op": "frame_dig -1", "stack_out": [ "box_prefixed_key%0#0", "event_id#0 (copy)" ] }, - "5662": { + "5714": { "op": "pushint 16", "stack_out": [ "box_prefixed_key%0#0", @@ -51747,7 +51981,7 @@ "16" ] }, - "5664": { + "5716": { "op": "%", "defined_out": [ "box_prefixed_key%0#0", @@ -51758,7 +51992,7 @@ "offset#0" ] }, - "5665": { + "5717": { "op": "dig 1", "stack_out": [ "box_prefixed_key%0#0", @@ -51766,7 +52000,7 @@ "box_prefixed_key%0#0 (copy)" ] }, - "5667": { + "5719": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#0", @@ -51775,7 +52009,7 @@ "0" ] }, - "5668": { + "5720": { "op": "pushint 2", "defined_out": [ "0", @@ -51792,7 +52026,7 @@ "2" ] }, - "5670": { + "5722": { "op": "box_extract", "defined_out": [ "box%box_extract%0#0", @@ -51805,7 +52039,7 @@ "box%box_extract%0#0" ] }, - "5671": { + "5723": { "op": "btoi", "defined_out": [ "box%array_length%0#0", @@ -51818,7 +52052,7 @@ "box%array_length%0#0" ] }, - "5672": { + "5724": { "op": "dig 1", "defined_out": [ "box%array_length%0#0", @@ -51833,7 +52067,7 @@ "offset#0 (copy)" ] }, - "5674": { + "5726": { "op": ">", "defined_out": [ "box_prefixed_key%0#0", @@ -51846,7 +52080,7 @@ "tmp%4#0" ] }, - "5675": { + "5727": { "error": "Invalid schedule page", "op": "assert // Invalid schedule page", "stack_out": [ @@ -51854,7 +52088,7 @@ "offset#0" ] }, - "5676": { + "5728": { "op": "pushint 65", "defined_out": [ "65", @@ -51867,7 +52101,7 @@ "65" ] }, - "5678": { + "5730": { "op": "*", "defined_out": [ "box%element_offset%0#0", @@ -51878,7 +52112,7 @@ "box%element_offset%0#0" ] }, - "5679": { + "5731": { "op": "pushint 2", "stack_out": [ "box_prefixed_key%0#0", @@ -51886,7 +52120,7 @@ "2" ] }, - "5681": { + "5733": { "op": "+", "defined_out": [ "box%offset%0#0", @@ -51897,7 +52131,7 @@ "box%offset%0#0" ] }, - "5682": { + "5734": { "op": "pushint 65", "stack_out": [ "box_prefixed_key%0#0", @@ -51905,7 +52139,7 @@ "65" ] }, - "5684": { + "5736": { "op": "box_extract", "defined_out": [ "box%box_extract%1#0" @@ -51914,11 +52148,11 @@ "box%box_extract%1#0" ] }, - "5685": { + "5737": { "retsub": true, "op": "retsub" }, - "5686": { + "5738": { "subroutine": "modules.actus_kernel.ActusKernelModule._assert_event_allowed_for_contract_type", "params": { "contract_type#0": "uint64", @@ -51928,7 +52162,7 @@ "stack_in": [], "op": "proto 2 0" }, - "5689": { + "5741": { "op": "frame_dig -1", "defined_out": [ "event_type#0 (copy)" @@ -51937,7 +52171,7 @@ "event_type#0 (copy)" ] }, - "5691": { + "5743": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -51948,7 +52182,7 @@ "1" ] }, - "5692": { + "5744": { "op": "==", "defined_out": [ "tmp%0#0" @@ -51957,17 +52191,17 @@ "tmp%0#0" ] }, - "5693": { + "5745": { "op": "bnz _assert_event_allowed_for_contract_type_if_body@6", "stack_out": [] }, - "5696": { + "5748": { "op": "frame_dig -1", "stack_out": [ "event_type#0 (copy)" ] }, - "5698": { + "5750": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -51978,7 +52212,7 @@ "8" ] }, - "5699": { + "5751": { "op": "==", "defined_out": [ "tmp%1#0" @@ -51987,17 +52221,17 @@ "tmp%1#0" ] }, - "5700": { + "5752": { "op": "bnz _assert_event_allowed_for_contract_type_if_body@6", "stack_out": [] }, - "5703": { + "5755": { "op": "frame_dig -1", "stack_out": [ "event_type#0 (copy)" ] }, - "5705": { + "5757": { "op": "pushint 19", "defined_out": [ "19", @@ -52008,7 +52242,7 @@ "19" ] }, - "5707": { + "5759": { "op": "==", "defined_out": [ "tmp%2#0" @@ -52017,17 +52251,17 @@ "tmp%2#0" ] }, - "5708": { + "5760": { "op": "bnz _assert_event_allowed_for_contract_type_if_body@6", "stack_out": [] }, - "5711": { + "5763": { "op": "frame_dig -1", "stack_out": [ "event_type#0 (copy)" ] }, - "5713": { + "5765": { "op": "pushint 12", "defined_out": [ "12", @@ -52038,7 +52272,7 @@ "12" ] }, - "5715": { + "5767": { "op": "==", "defined_out": [ "tmp%3#0" @@ -52047,17 +52281,17 @@ "tmp%3#0" ] }, - "5716": { + "5768": { "op": "bnz _assert_event_allowed_for_contract_type_if_body@6", "stack_out": [] }, - "5719": { + "5771": { "op": "frame_dig -1", "stack_out": [ "event_type#0 (copy)" ] }, - "5721": { + "5773": { "op": "pushint 11", "defined_out": [ "11", @@ -52068,7 +52302,7 @@ "11" ] }, - "5723": { + "5775": { "op": "==", "defined_out": [ "tmp%4#0" @@ -52077,11 +52311,11 @@ "tmp%4#0" ] }, - "5724": { + "5776": { "op": "bz _assert_event_allowed_for_contract_type_after_if_else@7", "stack_out": [] }, - "5727": { + "5779": { "block": "_assert_event_allowed_for_contract_type_if_body@6", "stack_in": [], "op": "intc_1 // 1", @@ -52092,7 +52326,7 @@ "tmp%0#0" ] }, - "5728": { + "5780": { "error": "Invalid ACTUS configuration", "block": "_assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34", "stack_in": [ @@ -52102,11 +52336,11 @@ "defined_out": [], "stack_out": [] }, - "5729": { + "5781": { "retsub": true, "op": "retsub" }, - "5730": { + "5782": { "block": "_assert_event_allowed_for_contract_type_after_if_else@7", "stack_in": [], "op": "frame_dig -2", @@ -52117,11 +52351,11 @@ "contract_type#0 (copy)" ] }, - "5732": { + "5784": { "op": "bnz _assert_event_allowed_for_contract_type_after_if_else@9", "stack_out": [] }, - "5735": { + "5787": { "op": "intc_0 // 0", "defined_out": [ "tmp%0#0" @@ -52130,10 +52364,10 @@ "tmp%0#0" ] }, - "5736": { + "5788": { "op": "b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34" }, - "5739": { + "5791": { "block": "_assert_event_allowed_for_contract_type_after_if_else@9", "stack_in": [], "op": "frame_dig -2", @@ -52144,7 +52378,7 @@ "contract_type#0 (copy)" ] }, - "5741": { + "5793": { "op": "pushint 3", "defined_out": [ "3", @@ -52155,7 +52389,7 @@ "3" ] }, - "5743": { + "5795": { "op": "==", "defined_out": [ "tmp%6#0" @@ -52164,17 +52398,17 @@ "tmp%6#0" ] }, - "5744": { + "5796": { "op": "bnz _assert_event_allowed_for_contract_type_if_body@11", "stack_out": [] }, - "5747": { + "5799": { "op": "frame_dig -2", "stack_out": [ "contract_type#0 (copy)" ] }, - "5749": { + "5801": { "op": "pushint 2", "defined_out": [ "2", @@ -52185,7 +52419,7 @@ "2" ] }, - "5751": { + "5803": { "op": "==", "defined_out": [ "tmp%7#0" @@ -52194,11 +52428,11 @@ "tmp%7#0" ] }, - "5752": { + "5804": { "op": "bz _assert_event_allowed_for_contract_type_after_if_else@16", "stack_out": [] }, - "5755": { + "5807": { "block": "_assert_event_allowed_for_contract_type_if_body@11", "stack_in": [], "op": "frame_dig -1", @@ -52209,7 +52443,7 @@ "event_type#0 (copy)" ] }, - "5757": { + "5809": { "op": "pushint 3", "defined_out": [ "3", @@ -52220,7 +52454,7 @@ "3" ] }, - "5759": { + "5811": { "op": "==", "defined_out": [ "tmp%8#0" @@ -52229,17 +52463,17 @@ "tmp%8#0" ] }, - "5760": { + "5812": { "op": "bnz _assert_event_allowed_for_contract_type_bool_true@13", "stack_out": [] }, - "5763": { + "5815": { "op": "frame_dig -1", "stack_out": [ "event_type#0 (copy)" ] }, - "5765": { + "5817": { "op": "pushint 18", "defined_out": [ "18", @@ -52250,7 +52484,7 @@ "18" ] }, - "5767": { + "5819": { "op": "==", "defined_out": [ "tmp%9#0" @@ -52259,11 +52493,11 @@ "tmp%9#0" ] }, - "5768": { + "5820": { "op": "bz _assert_event_allowed_for_contract_type_bool_false@14", "stack_out": [] }, - "5771": { + "5823": { "block": "_assert_event_allowed_for_contract_type_bool_true@13", "stack_in": [], "op": "intc_1 // 1", @@ -52274,7 +52508,7 @@ "or_result%0#0" ] }, - "5772": { + "5824": { "op": "b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34", "defined_out": [ "tmp%0#0" @@ -52283,7 +52517,7 @@ "tmp%0#0" ] }, - "5775": { + "5827": { "block": "_assert_event_allowed_for_contract_type_bool_false@14", "stack_in": [], "op": "intc_0 // 0", @@ -52294,7 +52528,7 @@ "or_result%0#0" ] }, - "5776": { + "5828": { "op": "b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34", "defined_out": [ "tmp%0#0" @@ -52303,7 +52537,7 @@ "tmp%0#0" ] }, - "5779": { + "5831": { "block": "_assert_event_allowed_for_contract_type_after_if_else@16", "stack_in": [], "op": "frame_dig -2", @@ -52314,7 +52548,7 @@ "contract_type#0 (copy)" ] }, - "5781": { + "5833": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -52325,7 +52559,7 @@ "1" ] }, - "5782": { + "5834": { "op": "==", "defined_out": [ "tmp%10#0" @@ -52334,11 +52568,11 @@ "tmp%10#0" ] }, - "5783": { + "5835": { "op": "bz _assert_event_allowed_for_contract_type_after_if_else@23", "stack_out": [] }, - "5786": { + "5838": { "op": "frame_dig -1", "defined_out": [ "event_type#0 (copy)" @@ -52347,7 +52581,7 @@ "event_type#0 (copy)" ] }, - "5788": { + "5840": { "op": "pushint 3", "defined_out": [ "3", @@ -52358,7 +52592,7 @@ "3" ] }, - "5790": { + "5842": { "op": "==", "defined_out": [ "tmp%11#0" @@ -52367,17 +52601,17 @@ "tmp%11#0" ] }, - "5791": { + "5843": { "op": "bnz _assert_event_allowed_for_contract_type_bool_true@20", "stack_out": [] }, - "5794": { + "5846": { "op": "frame_dig -1", "stack_out": [ "event_type#0 (copy)" ] }, - "5796": { + "5848": { "op": "pushint 18", "defined_out": [ "18", @@ -52388,7 +52622,7 @@ "18" ] }, - "5798": { + "5850": { "op": "==", "defined_out": [ "tmp%12#0" @@ -52397,17 +52631,17 @@ "tmp%12#0" ] }, - "5799": { + "5851": { "op": "bnz _assert_event_allowed_for_contract_type_bool_true@20", "stack_out": [] }, - "5802": { + "5854": { "op": "frame_dig -1", "stack_out": [ "event_type#0 (copy)" ] }, - "5804": { + "5856": { "op": "pushint 5", "defined_out": [ "5", @@ -52418,7 +52652,7 @@ "5" ] }, - "5806": { + "5858": { "op": "==", "defined_out": [ "tmp%13#0" @@ -52427,11 +52661,11 @@ "tmp%13#0" ] }, - "5807": { + "5859": { "op": "bz _assert_event_allowed_for_contract_type_bool_false@21", "stack_out": [] }, - "5810": { + "5862": { "block": "_assert_event_allowed_for_contract_type_bool_true@20", "stack_in": [], "op": "intc_1 // 1", @@ -52442,7 +52676,7 @@ "or_result%1#0" ] }, - "5811": { + "5863": { "op": "b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34", "defined_out": [ "tmp%0#0" @@ -52451,7 +52685,7 @@ "tmp%0#0" ] }, - "5814": { + "5866": { "block": "_assert_event_allowed_for_contract_type_bool_false@21", "stack_in": [], "op": "intc_0 // 0", @@ -52462,7 +52696,7 @@ "or_result%1#0" ] }, - "5815": { + "5867": { "op": "b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34", "defined_out": [ "tmp%0#0" @@ -52471,7 +52705,7 @@ "tmp%0#0" ] }, - "5818": { + "5870": { "block": "_assert_event_allowed_for_contract_type_after_if_else@23", "stack_in": [], "op": "frame_dig -2", @@ -52482,7 +52716,7 @@ "contract_type#0 (copy)" ] }, - "5820": { + "5872": { "op": "pushint 4", "defined_out": [ "4", @@ -52493,7 +52727,7 @@ "4" ] }, - "5822": { + "5874": { "op": "==", "defined_out": [ "tmp%14#0" @@ -52502,11 +52736,11 @@ "tmp%14#0" ] }, - "5823": { + "5875": { "op": "bz _assert_event_allowed_for_contract_type_after_if_else@31", "stack_out": [] }, - "5826": { + "5878": { "op": "frame_dig -1", "defined_out": [ "event_type#0 (copy)" @@ -52515,7 +52749,7 @@ "event_type#0 (copy)" ] }, - "5828": { + "5880": { "op": "pushint 3", "defined_out": [ "3", @@ -52526,7 +52760,7 @@ "3" ] }, - "5830": { + "5882": { "op": "==", "defined_out": [ "tmp%15#0" @@ -52535,24 +52769,24 @@ "tmp%15#0" ] }, - "5831": { + "5883": { "op": "bnz _assert_event_allowed_for_contract_type_bool_true@28", "stack_out": [] }, - "5834": { + "5886": { "op": "frame_dig -1", "stack_out": [ "event_type#0 (copy)" ] }, - "5836": { + "5888": { "op": "pushint 4", "stack_out": [ "event_type#0 (copy)", "4" ] }, - "5838": { + "5890": { "op": "==", "defined_out": [ "tmp%16#0" @@ -52561,17 +52795,17 @@ "tmp%16#0" ] }, - "5839": { + "5891": { "op": "bnz _assert_event_allowed_for_contract_type_bool_true@28", "stack_out": [] }, - "5842": { + "5894": { "op": "frame_dig -1", "stack_out": [ "event_type#0 (copy)" ] }, - "5844": { + "5896": { "op": "pushint 18", "defined_out": [ "18", @@ -52582,7 +52816,7 @@ "18" ] }, - "5846": { + "5898": { "op": "==", "defined_out": [ "tmp%17#0" @@ -52591,17 +52825,17 @@ "tmp%17#0" ] }, - "5847": { + "5899": { "op": "bnz _assert_event_allowed_for_contract_type_bool_true@28", "stack_out": [] }, - "5850": { + "5902": { "op": "frame_dig -1", "stack_out": [ "event_type#0 (copy)" ] }, - "5852": { + "5904": { "op": "pushint 5", "defined_out": [ "5", @@ -52612,7 +52846,7 @@ "5" ] }, - "5854": { + "5906": { "op": "==", "defined_out": [ "tmp%18#0" @@ -52621,11 +52855,11 @@ "tmp%18#0" ] }, - "5855": { + "5907": { "op": "bz _assert_event_allowed_for_contract_type_bool_false@29", "stack_out": [] }, - "5858": { + "5910": { "block": "_assert_event_allowed_for_contract_type_bool_true@28", "stack_in": [], "op": "intc_1 // 1", @@ -52636,7 +52870,7 @@ "or_result%2#0" ] }, - "5859": { + "5911": { "op": "b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34", "defined_out": [ "tmp%0#0" @@ -52645,7 +52879,7 @@ "tmp%0#0" ] }, - "5862": { + "5914": { "block": "_assert_event_allowed_for_contract_type_bool_false@29", "stack_in": [], "op": "intc_0 // 0", @@ -52656,7 +52890,7 @@ "or_result%2#0" ] }, - "5863": { + "5915": { "op": "b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34", "defined_out": [ "tmp%0#0" @@ -52665,7 +52899,7 @@ "tmp%0#0" ] }, - "5866": { + "5918": { "block": "_assert_event_allowed_for_contract_type_after_if_else@31", "stack_in": [], "op": "frame_dig -2", @@ -52676,7 +52910,7 @@ "contract_type#0 (copy)" ] }, - "5868": { + "5920": { "op": "pushint 5", "defined_out": [ "5", @@ -52687,7 +52921,7 @@ "5" ] }, - "5870": { + "5922": { "op": "==", "defined_out": [ "tmp%19#0" @@ -52696,11 +52930,11 @@ "tmp%19#0" ] }, - "5871": { + "5923": { "op": "bz _assert_event_allowed_for_contract_type_after_if_else@33", "stack_out": [] }, - "5874": { + "5926": { "op": "frame_dig -1", "defined_out": [ "event_type#0 (copy)" @@ -52709,7 +52943,7 @@ "event_type#0 (copy)" ] }, - "5876": { + "5928": { "op": "pushint 3", "defined_out": [ "3", @@ -52720,7 +52954,7 @@ "3" ] }, - "5878": { + "5930": { "op": "==", "defined_out": [ "tmp%0#0" @@ -52729,10 +52963,10 @@ "tmp%0#0" ] }, - "5879": { + "5931": { "op": "b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34" }, - "5882": { + "5934": { "block": "_assert_event_allowed_for_contract_type_after_if_else@33", "stack_in": [], "op": "intc_0 // 0", @@ -52743,10 +52977,10 @@ "tmp%0#0" ] }, - "5883": { + "5935": { "op": "b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34" }, - "5886": { + "5938": { "subroutine": "modules.actus_kernel.ActusKernelModule._is_dynamic_annuity", "params": {}, "block": "_is_dynamic_annuity", @@ -52759,7 +52993,7 @@ "0" ] }, - "5887": { + "5939": { "op": "bytec 10 // \"contract_type\"", "defined_out": [ "\"contract_type\"", @@ -52770,7 +53004,7 @@ "\"contract_type\"" ] }, - "5889": { + "5941": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -52781,14 +53015,14 @@ "maybe_exists%0#0" ] }, - "5890": { + "5942": { "error": "check self.contract_type exists", "op": "assert // check self.contract_type exists", "stack_out": [ "maybe_value%0#0" ] }, - "5891": { + "5943": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -52799,7 +53033,7 @@ "1" ] }, - "5892": { + "5944": { "op": "==", "defined_out": [ "tmp%0#0" @@ -52808,17 +53042,17 @@ "tmp%0#0" ] }, - "5893": { + "5945": { "op": "bz _is_dynamic_annuity_bool_false@3", "stack_out": [] }, - "5896": { + "5948": { "op": "intc_0 // 0", "stack_out": [ "0" ] }, - "5897": { + "5949": { "op": "bytec 34 // \"dynamic_principal_redemption\"", "defined_out": [ "\"dynamic_principal_redemption\"", @@ -52829,7 +53063,7 @@ "\"dynamic_principal_redemption\"" ] }, - "5899": { + "5951": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%1#0", @@ -52840,18 +53074,18 @@ "maybe_exists%1#0" ] }, - "5900": { + "5952": { "error": "check self.dynamic_principal_redemption exists", "op": "assert // check self.dynamic_principal_redemption exists", "stack_out": [ "maybe_value%1#0" ] }, - "5901": { + "5953": { "op": "bz _is_dynamic_annuity_bool_false@3", "stack_out": [] }, - "5904": { + "5956": { "op": "intc_1 // 1", "defined_out": [ "and_result%0#0" @@ -52860,11 +53094,11 @@ "and_result%0#0" ] }, - "5905": { + "5957": { "retsub": true, "op": "retsub" }, - "5906": { + "5958": { "block": "_is_dynamic_annuity_bool_false@3", "stack_in": [], "op": "intc_0 // 0", @@ -52875,11 +53109,11 @@ "and_result%0#0" ] }, - "5907": { + "5959": { "retsub": true, "op": "retsub" }, - "5908": { + "5960": { "subroutine": "modules.actus_kernel.ActusKernelModule._entry_interest_segment", "params": { "entry#0": "bytes" @@ -52888,7 +53122,7 @@ "stack_in": [], "op": "proto 1 2" }, - "5911": { + "5963": { "op": "frame_dig -1", "defined_out": [ "entry#0 (copy)" @@ -52897,7 +53131,7 @@ "entry#0 (copy)" ] }, - "5913": { + "5965": { "op": "pushint 17", "defined_out": [ "17", @@ -52908,7 +53142,7 @@ "17" ] }, - "5915": { + "5967": { "op": "extract_uint64", "defined_out": [ "values%0#0" @@ -52917,7 +53151,7 @@ "values%0#0" ] }, - "5916": { + "5968": { "op": "dup", "defined_out": [ "values%0#0" @@ -52927,20 +53161,20 @@ "values%0#0" ] }, - "5917": { + "5969": { "op": "bz _entry_interest_segment_if_body@3", "stack_out": [ "values%0#0" ] }, - "5920": { + "5972": { "op": "intc_0 // 0", "stack_out": [ "values%0#0", "0" ] }, - "5921": { + "5973": { "op": "bytec 9 // \"nominal_interest_rate\"", "defined_out": [ "\"nominal_interest_rate\"", @@ -52953,7 +53187,7 @@ "\"nominal_interest_rate\"" ] }, - "5923": { + "5975": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -52966,7 +53200,7 @@ "maybe_exists%0#0" ] }, - "5924": { + "5976": { "error": "check self.nominal_interest_rate exists", "op": "assert // check self.nominal_interest_rate exists", "stack_out": [ @@ -52974,20 +53208,20 @@ "maybe_value%0#0" ] }, - "5925": { + "5977": { "op": "bz _entry_interest_segment_if_body@3", "stack_out": [ "values%0#0" ] }, - "5928": { + "5980": { "op": "intc_0 // 0", "stack_out": [ "values%0#0", "0" ] }, - "5929": { + "5981": { "op": "bytec 7 // \"interest_calculation_base\"", "defined_out": [ "\"interest_calculation_base\"", @@ -53000,7 +53234,7 @@ "\"interest_calculation_base\"" ] }, - "5931": { + "5983": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%1#0", @@ -53013,7 +53247,7 @@ "maybe_exists%1#0" ] }, - "5932": { + "5984": { "error": "check self.interest_calculation_base exists", "op": "assert // check self.interest_calculation_base exists", "stack_out": [ @@ -53021,13 +53255,13 @@ "maybe_value%1#0" ] }, - "5933": { + "5985": { "op": "bnz _entry_interest_segment_after_if_else@4", "stack_out": [ "values%0#0" ] }, - "5936": { + "5988": { "block": "_entry_interest_segment_if_body@3", "stack_in": [ "values%0#0" @@ -53041,7 +53275,7 @@ "0" ] }, - "5937": { + "5989": { "op": "frame_dig -1", "defined_out": [ "0", @@ -53053,14 +53287,14 @@ "entry#0 (copy)" ] }, - "5939": { + "5991": { "op": "uncover 2" }, - "5941": { + "5993": { "retsub": true, "op": "retsub" }, - "5942": { + "5994": { "block": "_entry_interest_segment_after_if_else@4", "stack_in": [ "values%0#0" @@ -53074,7 +53308,7 @@ "0" ] }, - "5943": { + "5995": { "op": "bytec 7 // \"interest_calculation_base\"", "defined_out": [ "\"interest_calculation_base\"", @@ -53086,7 +53320,7 @@ "\"interest_calculation_base\"" ] }, - "5945": { + "5997": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%2#0", @@ -53098,7 +53332,7 @@ "maybe_exists%2#0" ] }, - "5946": { + "5998": { "error": "check self.interest_calculation_base exists", "op": "assert // check self.interest_calculation_base exists", "stack_out": [ @@ -53106,7 +53340,7 @@ "maybe_value%2#0" ] }, - "5947": { + "5999": { "op": "intc_0 // 0", "stack_out": [ "values%0#0", @@ -53114,7 +53348,7 @@ "0" ] }, - "5948": { + "6000": { "op": "bytec 9 // \"nominal_interest_rate\"", "defined_out": [ "\"nominal_interest_rate\"", @@ -53128,7 +53362,7 @@ "\"nominal_interest_rate\"" ] }, - "5950": { + "6002": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%3#0", @@ -53142,7 +53376,7 @@ "maybe_exists%3#0" ] }, - "5951": { + "6003": { "error": "check self.nominal_interest_rate exists", "op": "assert // check self.nominal_interest_rate exists", "stack_out": [ @@ -53151,7 +53385,7 @@ "maybe_value%3#0" ] }, - "5952": { + "6004": { "op": "intc_0 // 0", "stack_out": [ "values%0#0", @@ -53160,7 +53394,7 @@ "0" ] }, - "5953": { + "6005": { "op": "bytec 5 // \"fixed_point_scale\"", "defined_out": [ "\"fixed_point_scale\"", @@ -53176,7 +53410,7 @@ "\"fixed_point_scale\"" ] }, - "5955": { + "6007": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%4#0", @@ -53192,7 +53426,7 @@ "maybe_exists%4#0" ] }, - "5956": { + "6008": { "error": "check self.fixed_point_scale exists", "op": "assert // check self.fixed_point_scale exists", "stack_out": [ @@ -53202,7 +53436,7 @@ "maybe_value%4#0" ] }, - "5957": { + "6009": { "callsub": "modules.actus_kernel.ActusKernelModule._scaled_mul_div", "op": "callsub _scaled_mul_div", "defined_out": [ @@ -53213,7 +53447,7 @@ "accrued#0" ] }, - "5960": { + "6012": { "op": "intc_0 // 0", "stack_out": [ "values%0#0", @@ -53221,7 +53455,7 @@ "0" ] }, - "5961": { + "6013": { "op": "bytec 5 // \"fixed_point_scale\"", "stack_out": [ "values%0#0", @@ -53230,7 +53464,7 @@ "\"fixed_point_scale\"" ] }, - "5963": { + "6015": { "op": "app_global_get_ex", "defined_out": [ "accrued#0", @@ -53244,7 +53478,7 @@ "maybe_exists%5#0" ] }, - "5964": { + "6016": { "error": "check self.fixed_point_scale exists", "op": "assert // check self.fixed_point_scale exists", "stack_out": [ @@ -53253,10 +53487,10 @@ "maybe_value%5#0" ] }, - "5965": { + "6017": { "op": "frame_dig 0" }, - "5967": { + "6019": { "op": "swap", "defined_out": [ "accrued#0", @@ -53270,7 +53504,7 @@ "maybe_value%5#0" ] }, - "5968": { + "6020": { "callsub": "modules.actus_kernel.ActusKernelModule._scaled_mul_div", "op": "callsub _scaled_mul_div", "defined_out": [ @@ -53282,7 +53516,7 @@ "tmp%4#0" ] }, - "5971": { + "6023": { "op": "frame_dig -1", "defined_out": [ "entry#0 (copy)", @@ -53295,14 +53529,14 @@ "entry#0 (copy)" ] }, - "5973": { + "6025": { "op": "uncover 2" }, - "5975": { + "6027": { "retsub": true, "op": "retsub" }, - "5976": { + "6028": { "subroutine": "modules.actus_kernel.ActusKernelModule._discount_annuity_factor", "params": { "discount_factor#0": "uint64", @@ -53312,7 +53546,7 @@ "stack_in": [], "op": "proto 2 1" }, - "5979": { + "6031": { "op": "frame_dig -1", "defined_out": [ "redemption_factor#0 (copy)" @@ -53321,11 +53555,11 @@ "redemption_factor#0 (copy)" ] }, - "5981": { + "6033": { "op": "bnz _discount_annuity_factor_after_if_else@2", "stack_out": [] }, - "5984": { + "6036": { "op": "frame_dig -2", "defined_out": [ "discount_factor#0 (copy)" @@ -53334,11 +53568,11 @@ "discount_factor#0 (copy)" ] }, - "5986": { + "6038": { "retsub": true, "op": "retsub" }, - "5987": { + "6039": { "block": "_discount_annuity_factor_after_if_else@2", "stack_in": [], "op": "intc_0 // 0", @@ -53349,7 +53583,7 @@ "0" ] }, - "5988": { + "6040": { "op": "bytec 5 // \"fixed_point_scale\"", "defined_out": [ "\"fixed_point_scale\"", @@ -53360,7 +53594,7 @@ "\"fixed_point_scale\"" ] }, - "5990": { + "6042": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -53371,21 +53605,21 @@ "maybe_exists%0#0" ] }, - "5991": { + "6043": { "error": "check self.fixed_point_scale exists", "op": "assert // check self.fixed_point_scale exists", "stack_out": [ "maybe_value%0#0" ] }, - "5992": { + "6044": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#0", "0" ] }, - "5993": { + "6045": { "op": "bytec 9 // \"nominal_interest_rate\"", "defined_out": [ "\"nominal_interest_rate\"", @@ -53398,7 +53632,7 @@ "\"nominal_interest_rate\"" ] }, - "5995": { + "6047": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%1#0", @@ -53411,7 +53645,7 @@ "maybe_exists%1#0" ] }, - "5996": { + "6048": { "error": "check self.nominal_interest_rate exists", "op": "assert // check self.nominal_interest_rate exists", "stack_out": [ @@ -53419,7 +53653,7 @@ "maybe_value%1#0" ] }, - "5997": { + "6049": { "op": "frame_dig -1", "defined_out": [ "maybe_value%0#0", @@ -53432,7 +53666,7 @@ "redemption_factor#0 (copy)" ] }, - "5999": { + "6051": { "op": "dig 2", "defined_out": [ "maybe_value%0#0", @@ -53447,7 +53681,7 @@ "maybe_value%0#0 (copy)" ] }, - "6001": { + "6053": { "callsub": "modules.actus_kernel.ActusKernelModule._scaled_mul_div", "op": "callsub _scaled_mul_div", "defined_out": [ @@ -53459,7 +53693,7 @@ "tmp%1#0" ] }, - "6004": { + "6056": { "op": "+", "defined_out": [ "period_rate#0" @@ -53468,7 +53702,7 @@ "period_rate#0" ] }, - "6005": { + "6057": { "op": "dup", "defined_out": [ "period_rate#0", @@ -53479,21 +53713,21 @@ "period_rate#0 (copy)" ] }, - "6006": { + "6058": { "error": "Invalid ACTUS configuration", "op": "assert // Invalid ACTUS configuration", "stack_out": [ "period_rate#0" ] }, - "6007": { + "6059": { "op": "intc_0 // 0", "stack_out": [ "period_rate#0", "0" ] }, - "6008": { + "6060": { "op": "bytec 5 // \"fixed_point_scale\"", "stack_out": [ "period_rate#0", @@ -53501,7 +53735,7 @@ "\"fixed_point_scale\"" ] }, - "6010": { + "6062": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%3#0", @@ -53514,7 +53748,7 @@ "maybe_exists%3#0" ] }, - "6011": { + "6063": { "error": "check self.fixed_point_scale exists", "op": "assert // check self.fixed_point_scale exists", "stack_out": [ @@ -53522,7 +53756,7 @@ "maybe_value%3#0" ] }, - "6012": { + "6064": { "op": "frame_dig -2", "defined_out": [ "discount_factor#0 (copy)", @@ -53535,7 +53769,7 @@ "discount_factor#0 (copy)" ] }, - "6014": { + "6066": { "op": "swap", "stack_out": [ "period_rate#0", @@ -53543,7 +53777,7 @@ "maybe_value%3#0" ] }, - "6015": { + "6067": { "op": "uncover 2", "stack_out": [ "discount_factor#0 (copy)", @@ -53551,7 +53785,7 @@ "period_rate#0" ] }, - "6017": { + "6069": { "callsub": "modules.actus_kernel.ActusKernelModule._scaled_mul_div", "op": "callsub _scaled_mul_div", "defined_out": [ @@ -53561,11 +53795,11 @@ "tmp%4#0" ] }, - "6020": { + "6072": { "retsub": true, "op": "retsub" }, - "6021": { + "6073": { "subroutine": "modules.actus_kernel.ActusKernelModule._apply_non_cash_schedule_entry", "params": { "entry#0": "bytes", @@ -53575,20 +53809,20 @@ "stack_in": [], "op": "proto 2 2" }, - "6024": { + "6076": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0" ] }, - "6025": { + "6077": { "op": "pushbytes \"\"", "stack_out": [ "future_entry#0", "denominator#0" ] }, - "6027": { + "6079": { "op": "dupn 8", "stack_out": [ "future_entry#0", @@ -53603,7 +53837,7 @@ "values%8#0" ] }, - "6029": { + "6081": { "op": "frame_dig -2", "defined_out": [ "entry#0 (copy)" @@ -53622,7 +53856,7 @@ "entry#0 (copy)" ] }, - "6031": { + "6083": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -53643,7 +53877,7 @@ "0" ] }, - "6032": { + "6084": { "op": "extract_uint64", "defined_out": [ "values%0#0" @@ -53662,7 +53896,7 @@ "values%0#0" ] }, - "6033": { + "6085": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -53679,7 +53913,7 @@ "0" ] }, - "6034": { + "6086": { "op": "bytec_2 // \"event_cursor\"", "defined_out": [ "\"event_cursor\"", @@ -53702,7 +53936,7 @@ "\"event_cursor\"" ] }, - "6035": { + "6087": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -53725,7 +53959,7 @@ "maybe_exists%0#0" ] }, - "6036": { + "6088": { "error": "check self.event_cursor exists", "op": "assert // check self.event_cursor exists", "stack_out": [ @@ -53743,7 +53977,7 @@ "maybe_value%0#0" ] }, - "6037": { + "6089": { "op": "==", "defined_out": [ "tmp%0#0", @@ -53763,7 +53997,7 @@ "tmp%0#0" ] }, - "6038": { + "6090": { "error": "Invalid event cursor", "op": "assert // Invalid event cursor", "stack_out": [ @@ -53779,7 +54013,7 @@ "values%8#0" ] }, - "6039": { + "6091": { "op": "frame_dig -2", "stack_out": [ "future_entry#0", @@ -53795,7 +54029,7 @@ "entry#0 (copy)" ] }, - "6041": { + "6093": { "op": "pushint 9", "defined_out": [ "9", @@ -53817,7 +54051,7 @@ "9" ] }, - "6043": { + "6095": { "op": "extract_uint64", "defined_out": [ "values%0#0", @@ -53837,7 +54071,7 @@ "values%1#0" ] }, - "6044": { + "6096": { "op": "global LatestTimestamp", "defined_out": [ "tmp%1#0", @@ -53859,7 +54093,7 @@ "tmp%1#0" ] }, - "6046": { + "6098": { "op": "<=", "defined_out": [ "tmp%2#0", @@ -53879,7 +54113,7 @@ "tmp%2#0" ] }, - "6047": { + "6099": { "error": "No due cashflow to pay", "op": "assert // No due cashflow to pay", "stack_out": [ @@ -53895,7 +54129,7 @@ "values%8#0" ] }, - "6048": { + "6100": { "op": "frame_dig -2", "stack_out": [ "future_entry#0", @@ -53911,7 +54145,7 @@ "entry#0 (copy)" ] }, - "6050": { + "6102": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -53933,7 +54167,7 @@ "8" ] }, - "6051": { + "6103": { "op": "getbyte", "defined_out": [ "event_type#0", @@ -53953,7 +54187,7 @@ "event_type#0" ] }, - "6052": { + "6104": { "op": "dup", "defined_out": [ "event_type#0", @@ -53974,7 +54208,7 @@ "event_type#0" ] }, - "6053": { + "6105": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -53997,7 +54231,7 @@ "1" ] }, - "6054": { + "6106": { "op": "==", "defined_out": [ "event_type#0", @@ -54019,7 +54253,7 @@ "tmp%4#0" ] }, - "6055": { + "6107": { "op": "dup", "defined_out": [ "event_type#0", @@ -54042,7 +54276,7 @@ "tmp%4#0" ] }, - "6056": { + "6108": { "op": "bz _apply_non_cash_schedule_entry_after_if_else@6", "stack_out": [ "future_entry#0", @@ -54059,7 +54293,7 @@ "tmp%4#0" ] }, - "6059": { + "6111": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -54077,7 +54311,7 @@ "0" ] }, - "6060": { + "6112": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"", @@ -54103,7 +54337,7 @@ "\"status\"" ] }, - "6061": { + "6113": { "op": "app_global_get_ex", "stack_out": [ "future_entry#0", @@ -54122,7 +54356,7 @@ "maybe_exists%0#0" ] }, - "6062": { + "6114": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ @@ -54141,7 +54375,7 @@ "maybe_value%0#0" ] }, - "6063": { + "6115": { "op": "pushint 50", "defined_out": [ "50", @@ -54167,7 +54401,7 @@ "50" ] }, - "6065": { + "6117": { "op": "==", "stack_out": [ "future_entry#0", @@ -54185,7 +54419,7 @@ "tmp%0#0" ] }, - "6066": { + "6118": { "error": "Invalid ACTUS configuration", "op": "assert // Invalid ACTUS configuration", "stack_out": [ @@ -54203,7 +54437,7 @@ "tmp%4#0" ] }, - "6067": { + "6119": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -54221,7 +54455,7 @@ "0" ] }, - "6068": { + "6120": { "op": "bytec 11 // \"reserved_units_total\"", "defined_out": [ "\"reserved_units_total\"", @@ -54247,7 +54481,7 @@ "\"reserved_units_total\"" ] }, - "6070": { + "6122": { "op": "app_global_get_ex", "defined_out": [ "event_type#0", @@ -54273,7 +54507,7 @@ "maybe_exists%1#0" ] }, - "6071": { + "6123": { "error": "check self.reserved_units_total exists", "op": "assert // check self.reserved_units_total exists", "stack_out": [ @@ -54292,7 +54526,7 @@ "maybe_value%1#0" ] }, - "6072": { + "6124": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -54311,7 +54545,7 @@ "0" ] }, - "6073": { + "6125": { "op": "bytec 13 // \"total_units\"", "defined_out": [ "\"total_units\"", @@ -54339,7 +54573,7 @@ "\"total_units\"" ] }, - "6075": { + "6127": { "op": "app_global_get_ex", "defined_out": [ "event_type#0", @@ -54367,7 +54601,7 @@ "maybe_exists%2#0" ] }, - "6076": { + "6128": { "error": "check self.total_units exists", "op": "assert // check self.total_units exists", "stack_out": [ @@ -54387,7 +54621,7 @@ "maybe_value%2#0" ] }, - "6077": { + "6129": { "op": "==", "defined_out": [ "event_type#0", @@ -54411,7 +54645,7 @@ "tmp%6#0" ] }, - "6078": { + "6130": { "error": "Primary distribution is not complete", "op": "assert // Primary distribution is not complete", "stack_out": [ @@ -54429,7 +54663,7 @@ "tmp%4#0" ] }, - "6079": { + "6131": { "op": "frame_dig -2", "stack_out": [ "future_entry#0", @@ -54447,7 +54681,7 @@ "entry#0 (copy)" ] }, - "6081": { + "6133": { "op": "pushint 49", "defined_out": [ "49", @@ -54473,7 +54707,7 @@ "49" ] }, - "6083": { + "6135": { "op": "extract_uint64", "defined_out": [ "event_type#0", @@ -54497,7 +54731,7 @@ "values%2#0" ] }, - "6084": { + "6136": { "op": "bytec 4 // \"outstanding_principal\"", "defined_out": [ "\"outstanding_principal\"", @@ -54523,7 +54757,7 @@ "\"outstanding_principal\"" ] }, - "6086": { + "6138": { "op": "dig 1", "defined_out": [ "\"outstanding_principal\"", @@ -54551,7 +54785,7 @@ "values%2#0 (copy)" ] }, - "6088": { + "6140": { "op": "app_global_put", "stack_out": [ "future_entry#0", @@ -54569,7 +54803,7 @@ "values%2#0" ] }, - "6089": { + "6141": { "op": "bytec 7 // \"interest_calculation_base\"", "defined_out": [ "\"interest_calculation_base\"", @@ -54595,7 +54829,7 @@ "\"interest_calculation_base\"" ] }, - "6091": { + "6143": { "op": "swap", "stack_out": [ "future_entry#0", @@ -54614,7 +54848,7 @@ "values%2#0" ] }, - "6092": { + "6144": { "op": "app_global_put", "stack_out": [ "future_entry#0", @@ -54631,7 +54865,7 @@ "tmp%4#0" ] }, - "6093": { + "6145": { "op": "frame_dig -2", "stack_out": [ "future_entry#0", @@ -54649,7 +54883,7 @@ "entry#0 (copy)" ] }, - "6095": { + "6147": { "op": "pushint 33", "defined_out": [ "33", @@ -54675,7 +54909,7 @@ "33" ] }, - "6097": { + "6149": { "op": "extract_uint64", "defined_out": [ "event_type#0", @@ -54699,7 +54933,7 @@ "values%4#0" ] }, - "6098": { + "6150": { "op": "bytec 9 // \"nominal_interest_rate\"", "defined_out": [ "\"nominal_interest_rate\"", @@ -54725,7 +54959,7 @@ "\"nominal_interest_rate\"" ] }, - "6100": { + "6152": { "op": "swap", "stack_out": [ "future_entry#0", @@ -54744,7 +54978,7 @@ "values%4#0" ] }, - "6101": { + "6153": { "op": "app_global_put", "stack_out": [ "future_entry#0", @@ -54761,7 +54995,7 @@ "tmp%4#0" ] }, - "6102": { + "6154": { "op": "bytec 6 // \"accrued_interest\"", "defined_out": [ "\"accrued_interest\"", @@ -54785,7 +55019,7 @@ "\"accrued_interest\"" ] }, - "6104": { + "6156": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -54804,7 +55038,7 @@ "0" ] }, - "6105": { + "6157": { "op": "app_global_put", "stack_out": [ "future_entry#0", @@ -54821,7 +55055,7 @@ "tmp%4#0" ] }, - "6106": { + "6158": { "op": "frame_dig -2", "stack_out": [ "future_entry#0", @@ -54839,7 +55073,7 @@ "entry#0 (copy)" ] }, - "6108": { + "6160": { "op": "pushint 41", "defined_out": [ "41", @@ -54865,7 +55099,7 @@ "41" ] }, - "6110": { + "6162": { "op": "extract_uint64", "defined_out": [ "event_type#0", @@ -54889,7 +55123,7 @@ "values%5#0" ] }, - "6111": { + "6163": { "op": "bytec 14 // \"next_principal_redemption\"", "defined_out": [ "\"next_principal_redemption\"", @@ -54915,7 +55149,7 @@ "\"next_principal_redemption\"" ] }, - "6113": { + "6165": { "op": "swap", "stack_out": [ "future_entry#0", @@ -54934,7 +55168,7 @@ "values%5#0" ] }, - "6114": { + "6166": { "op": "app_global_put", "stack_out": [ "future_entry#0", @@ -54951,7 +55185,7 @@ "tmp%4#0" ] }, - "6115": { + "6167": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -54969,7 +55203,7 @@ "0" ] }, - "6116": { + "6168": { "op": "bytec_2 // \"event_cursor\"", "stack_out": [ "future_entry#0", @@ -54988,7 +55222,7 @@ "\"event_cursor\"" ] }, - "6117": { + "6169": { "op": "app_global_get_ex", "defined_out": [ "event_type#0", @@ -55014,7 +55248,7 @@ "maybe_exists%3#0" ] }, - "6118": { + "6170": { "error": "check self.event_cursor exists", "op": "assert // check self.event_cursor exists", "stack_out": [ @@ -55033,7 +55267,7 @@ "maybe_value%3#0" ] }, - "6119": { + "6171": { "op": "intc_1 // 1", "stack_out": [ "future_entry#0", @@ -55052,7 +55286,7 @@ "1" ] }, - "6120": { + "6172": { "op": "+", "defined_out": [ "event_type#0", @@ -55076,7 +55310,7 @@ "tmp%7#0" ] }, - "6121": { + "6173": { "op": "bytec_2 // \"event_cursor\"", "stack_out": [ "future_entry#0", @@ -55095,7 +55329,7 @@ "\"event_cursor\"" ] }, - "6122": { + "6174": { "op": "swap", "stack_out": [ "future_entry#0", @@ -55114,7 +55348,7 @@ "tmp%7#0" ] }, - "6123": { + "6175": { "op": "app_global_put", "stack_out": [ "future_entry#0", @@ -55131,7 +55365,7 @@ "tmp%4#0" ] }, - "6124": { + "6176": { "op": "bytec_1 // \"status\"", "stack_out": [ "future_entry#0", @@ -55149,7 +55383,7 @@ "\"status\"" ] }, - "6125": { + "6177": { "op": "pushint 100", "defined_out": [ "\"status\"", @@ -55175,7 +55409,7 @@ "100" ] }, - "6127": { + "6179": { "op": "app_global_put", "stack_out": [ "future_entry#0", @@ -55192,7 +55426,7 @@ "tmp%4#0" ] }, - "6128": { + "6180": { "op": "frame_dig 11", "stack_out": [ "future_entry#0", @@ -55210,7 +55444,7 @@ "tmp%4#0" ] }, - "6130": { + "6182": { "error": "Not IED event", "op": "assert // Not IED event", "stack_out": [ @@ -55228,7 +55462,7 @@ "tmp%4#0" ] }, - "6131": { + "6183": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -55246,7 +55480,7 @@ "0" ] }, - "6132": { + "6184": { "op": "bytec 20 // \"initial_exchange_amount\"", "defined_out": [ "\"initial_exchange_amount\"", @@ -55272,7 +55506,7 @@ "\"initial_exchange_amount\"" ] }, - "6134": { + "6186": { "op": "app_global_get_ex", "stack_out": [ "future_entry#0", @@ -55291,7 +55525,7 @@ "maybe_exists%0#0" ] }, - "6135": { + "6187": { "error": "check self.initial_exchange_amount exists", "op": "assert // check self.initial_exchange_amount exists", "stack_out": [ @@ -55310,7 +55544,7 @@ "maybe_value%0#0" ] }, - "6136": { + "6188": { "op": "frame_dig -2", "stack_out": [ "future_entry#0", @@ -55329,7 +55563,7 @@ "entry#0 (copy)" ] }, - "6138": { + "6190": { "op": "swap", "stack_out": [ "future_entry#0", @@ -55348,7 +55582,7 @@ "maybe_value%0#0" ] }, - "6139": { + "6191": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -55368,7 +55602,7 @@ "0" ] }, - "6140": { + "6192": { "callsub": "modules.actus_kernel.ActusKernelModule._emit_execution_event", "op": "callsub _emit_execution_event", "defined_out": [ @@ -55393,10 +55627,10 @@ "entry#0" ] }, - "6143": { + "6195": { "op": "dup" }, - "6144": { + "6196": { "op": "frame_bury -2", "stack_out": [ "future_entry#0", @@ -55414,7 +55648,7 @@ "entry#0 (copy)" ] }, - "6146": { + "6198": { "op": "frame_dig -1", "defined_out": [ "entry#0 (copy)", @@ -55440,17 +55674,17 @@ "payload#0 (copy)" ] }, - "6148": { + "6200": { "op": "frame_bury 1" }, - "6150": { + "6202": { "op": "frame_bury 0" }, - "6152": { + "6204": { "retsub": true, "op": "retsub" }, - "6153": { + "6205": { "block": "_apply_non_cash_schedule_entry_after_if_else@6", "stack_in": [ "future_entry#0", @@ -55486,7 +55720,7 @@ "0" ] }, - "6154": { + "6206": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"", @@ -55509,7 +55743,7 @@ "\"status\"" ] }, - "6155": { + "6207": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -55532,7 +55766,7 @@ "maybe_exists%0#0" ] }, - "6156": { + "6208": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ @@ -55551,7 +55785,7 @@ "maybe_value%0#0" ] }, - "6157": { + "6209": { "op": "pushint 50", "defined_out": [ "50", @@ -55574,7 +55808,7 @@ "50" ] }, - "6159": { + "6211": { "op": "==", "defined_out": [ "tmp%0#0" @@ -55595,7 +55829,7 @@ "tmp%0#0" ] }, - "6160": { + "6212": { "op": "!", "defined_out": [ "tmp%1#1" @@ -55616,7 +55850,7 @@ "tmp%1#1" ] }, - "6161": { + "6213": { "error": "IED not yet executed", "op": "assert // IED not yet executed", "stack_out": [ @@ -55634,7 +55868,7 @@ "tmp%4#0" ] }, - "6162": { + "6214": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -55652,7 +55886,7 @@ "0" ] }, - "6163": { + "6215": { "op": "bytec 6 // \"accrued_interest\"", "defined_out": [ "\"accrued_interest\"", @@ -55675,7 +55909,7 @@ "\"accrued_interest\"" ] }, - "6165": { + "6217": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%4#0", @@ -55698,7 +55932,7 @@ "maybe_exists%4#0" ] }, - "6166": { + "6218": { "error": "check self.accrued_interest exists", "op": "assert // check self.accrued_interest exists", "stack_out": [ @@ -55717,7 +55951,7 @@ "maybe_value%4#0" ] }, - "6167": { + "6219": { "op": "frame_dig -2", "defined_out": [ "entry#0 (copy)", @@ -55740,7 +55974,7 @@ "entry#0 (copy)" ] }, - "6169": { + "6221": { "callsub": "modules.actus_kernel.ActusKernelModule._entry_interest_segment", "op": "callsub _entry_interest_segment", "defined_out": [ @@ -55766,7 +56000,7 @@ "entry#0" ] }, - "6172": { + "6224": { "op": "frame_bury -2", "stack_out": [ "future_entry#0", @@ -55785,7 +56019,7 @@ "_entry_interest_segment%0#0" ] }, - "6174": { + "6226": { "op": "+", "defined_out": [ "tmp%8#0" @@ -55806,7 +56040,7 @@ "tmp%8#0" ] }, - "6175": { + "6227": { "op": "bytec 6 // \"accrued_interest\"", "stack_out": [ "future_entry#0", @@ -55825,7 +56059,7 @@ "\"accrued_interest\"" ] }, - "6177": { + "6229": { "op": "swap", "stack_out": [ "future_entry#0", @@ -55844,7 +56078,7 @@ "tmp%8#0" ] }, - "6178": { + "6230": { "op": "app_global_put", "stack_out": [ "future_entry#0", @@ -55861,7 +56095,7 @@ "tmp%4#0" ] }, - "6179": { + "6231": { "op": "frame_dig 10", "defined_out": [ "event_type#0" @@ -55882,7 +56116,7 @@ "event_type#0" ] }, - "6181": { + "6233": { "op": "pushint 12", "defined_out": [ "12", @@ -55905,7 +56139,7 @@ "12" ] }, - "6183": { + "6235": { "op": "==", "defined_out": [ "event_type#0", @@ -55927,7 +56161,7 @@ "tmp%9#0" ] }, - "6184": { + "6236": { "op": "bz _apply_non_cash_schedule_entry_else_body@10", "stack_out": [ "future_entry#0", @@ -55944,7 +56178,7 @@ "tmp%4#0" ] }, - "6187": { + "6239": { "op": "frame_dig -1", "defined_out": [ "event_type#0", @@ -55966,7 +56200,7 @@ "payload#0 (copy)" ] }, - "6189": { + "6241": { "op": "pushint 33", "defined_out": [ "33", @@ -55990,7 +56224,7 @@ "33" ] }, - "6191": { + "6243": { "op": "extract_uint64", "defined_out": [ "event_type#0", @@ -56012,7 +56246,7 @@ "values%6#0" ] }, - "6192": { + "6244": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -56031,7 +56265,7 @@ "0" ] }, - "6193": { + "6245": { "op": "bytec 36 // \"rate_reset_multiplier\"", "defined_out": [ "\"rate_reset_multiplier\"", @@ -56057,7 +56291,7 @@ "\"rate_reset_multiplier\"" ] }, - "6195": { + "6247": { "op": "app_global_get_ex", "defined_out": [ "event_type#0", @@ -56083,7 +56317,7 @@ "maybe_exists%5#0" ] }, - "6196": { + "6248": { "error": "check self.rate_reset_multiplier exists", "op": "assert // check self.rate_reset_multiplier exists", "stack_out": [ @@ -56103,7 +56337,7 @@ "maybe_value%5#0" ] }, - "6197": { + "6249": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -56123,7 +56357,7 @@ "0" ] }, - "6198": { + "6250": { "op": "bytec 5 // \"fixed_point_scale\"", "defined_out": [ "\"fixed_point_scale\"", @@ -56151,7 +56385,7 @@ "\"fixed_point_scale\"" ] }, - "6200": { + "6252": { "op": "app_global_get_ex", "defined_out": [ "event_type#0", @@ -56179,7 +56413,7 @@ "maybe_exists%6#0" ] }, - "6201": { + "6253": { "error": "check self.fixed_point_scale exists", "op": "assert // check self.fixed_point_scale exists", "stack_out": [ @@ -56200,7 +56434,7 @@ "maybe_value%6#0" ] }, - "6202": { + "6254": { "callsub": "modules.actus_kernel.ActusKernelModule._scaled_mul_div", "op": "callsub _scaled_mul_div", "defined_out": [ @@ -56223,7 +56457,7 @@ "observed_rate#0" ] }, - "6205": { + "6257": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -56242,7 +56476,7 @@ "0" ] }, - "6206": { + "6258": { "op": "bytec 35 // \"rate_reset_spread\"", "defined_out": [ "\"rate_reset_spread\"", @@ -56268,7 +56502,7 @@ "\"rate_reset_spread\"" ] }, - "6208": { + "6260": { "op": "app_global_get_ex", "defined_out": [ "event_type#0", @@ -56294,7 +56528,7 @@ "maybe_exists%7#0" ] }, - "6209": { + "6261": { "error": "check self.rate_reset_spread exists", "op": "assert // check self.rate_reset_spread exists", "stack_out": [ @@ -56314,7 +56548,7 @@ "maybe_value%7#0" ] }, - "6210": { + "6262": { "op": "+", "defined_out": [ "event_type#0", @@ -56336,7 +56570,7 @@ "rate#0" ] }, - "6211": { + "6263": { "op": "frame_bury 6", "defined_out": [ "event_type#0", @@ -56357,7 +56591,7 @@ "tmp%4#0" ] }, - "6213": { + "6265": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -56375,7 +56609,7 @@ "0" ] }, - "6214": { + "6266": { "op": "bytec 38 // \"has_rate_reset_floor\"", "defined_out": [ "\"has_rate_reset_floor\"", @@ -56400,7 +56634,7 @@ "\"has_rate_reset_floor\"" ] }, - "6216": { + "6268": { "op": "app_global_get_ex", "stack_out": [ "future_entry#0", @@ -56419,7 +56653,7 @@ "maybe_exists%0#0" ] }, - "6217": { + "6269": { "error": "check self.has_rate_reset_floor exists", "op": "assert // check self.has_rate_reset_floor exists", "stack_out": [ @@ -56438,7 +56672,7 @@ "maybe_value%0#0" ] }, - "6218": { + "6270": { "op": "bz _apply_non_cash_schedule_entry_after_if_else@55", "stack_out": [ "future_entry#0", @@ -56455,7 +56689,7 @@ "tmp%4#0" ] }, - "6221": { + "6273": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -56473,8 +56707,8 @@ "0" ] }, - "6222": { - "op": "bytec 30 // \"rate_reset_floor\"", + "6274": { + "op": "bytec 31 // \"rate_reset_floor\"", "defined_out": [ "\"rate_reset_floor\"", "0", @@ -56498,7 +56732,7 @@ "\"rate_reset_floor\"" ] }, - "6224": { + "6276": { "op": "app_global_get_ex", "defined_out": [ "event_type#0", @@ -56523,7 +56757,7 @@ "maybe_exists%1#0" ] }, - "6225": { + "6277": { "error": "check self.rate_reset_floor exists", "op": "assert // check self.rate_reset_floor exists", "stack_out": [ @@ -56542,7 +56776,7 @@ "maybe_value%1#0" ] }, - "6226": { + "6278": { "op": "frame_dig 6", "stack_out": [ "future_entry#0", @@ -56561,7 +56795,7 @@ "rate#0" ] }, - "6228": { + "6280": { "op": ">", "stack_out": [ "future_entry#0", @@ -56579,7 +56813,7 @@ "tmp%0#0" ] }, - "6229": { + "6281": { "op": "bz _apply_non_cash_schedule_entry_after_if_else@55", "stack_out": [ "future_entry#0", @@ -56596,7 +56830,7 @@ "tmp%4#0" ] }, - "6232": { + "6284": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -56614,8 +56848,8 @@ "0" ] }, - "6233": { - "op": "bytec 30 // \"rate_reset_floor\"", + "6285": { + "op": "bytec 31 // \"rate_reset_floor\"", "stack_out": [ "future_entry#0", "denominator#0", @@ -56633,7 +56867,7 @@ "\"rate_reset_floor\"" ] }, - "6235": { + "6287": { "op": "app_global_get_ex", "defined_out": [ "event_type#0", @@ -56657,7 +56891,7 @@ "maybe_exists%2#0" ] }, - "6236": { + "6288": { "op": "swap", "stack_out": [ "future_entry#0", @@ -56676,7 +56910,7 @@ "rate#0" ] }, - "6237": { + "6289": { "op": "frame_bury 6", "stack_out": [ "future_entry#0", @@ -56694,7 +56928,7 @@ "maybe_exists%2#0" ] }, - "6239": { + "6291": { "error": "check self.rate_reset_floor exists", "op": "assert // check self.rate_reset_floor exists", "stack_out": [ @@ -56712,7 +56946,7 @@ "tmp%4#0" ] }, - "6240": { + "6292": { "block": "_apply_non_cash_schedule_entry_after_if_else@55", "stack_in": [ "future_entry#0", @@ -56748,7 +56982,7 @@ "0" ] }, - "6241": { + "6293": { "op": "bytec 39 // \"has_rate_reset_cap\"", "defined_out": [ "\"has_rate_reset_cap\"", @@ -56771,7 +57005,7 @@ "\"has_rate_reset_cap\"" ] }, - "6243": { + "6295": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%3#0", @@ -56794,7 +57028,7 @@ "maybe_exists%3#0" ] }, - "6244": { + "6296": { "error": "check self.has_rate_reset_cap exists", "op": "assert // check self.has_rate_reset_cap exists", "stack_out": [ @@ -56813,7 +57047,7 @@ "maybe_value%3#0" ] }, - "6245": { + "6297": { "op": "bz _apply_non_cash_schedule_entry_after_if_else@58", "stack_out": [ "future_entry#0", @@ -56830,7 +57064,7 @@ "tmp%4#0" ] }, - "6248": { + "6300": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -56848,8 +57082,8 @@ "0" ] }, - "6249": { - "op": "bytec 31 // \"rate_reset_cap\"", + "6301": { + "op": "bytec 32 // \"rate_reset_cap\"", "defined_out": [ "\"rate_reset_cap\"", "0" @@ -56871,7 +57105,7 @@ "\"rate_reset_cap\"" ] }, - "6251": { + "6303": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%4#0", @@ -56894,7 +57128,7 @@ "maybe_exists%4#0" ] }, - "6252": { + "6304": { "error": "check self.rate_reset_cap exists", "op": "assert // check self.rate_reset_cap exists", "stack_out": [ @@ -56913,7 +57147,7 @@ "maybe_value%4#0" ] }, - "6253": { + "6305": { "op": "frame_dig 6", "defined_out": [ "maybe_value%4#0", @@ -56936,7 +57170,7 @@ "rate#0" ] }, - "6255": { + "6307": { "op": "<", "defined_out": [ "rate#0", @@ -56958,7 +57192,7 @@ "tmp%1#1" ] }, - "6256": { + "6308": { "op": "bz _apply_non_cash_schedule_entry_after_if_else@58", "stack_out": [ "future_entry#0", @@ -56975,7 +57209,7 @@ "tmp%4#0" ] }, - "6259": { + "6311": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -56993,8 +57227,8 @@ "0" ] }, - "6260": { - "op": "bytec 31 // \"rate_reset_cap\"", + "6312": { + "op": "bytec 32 // \"rate_reset_cap\"", "stack_out": [ "future_entry#0", "denominator#0", @@ -57012,7 +57246,7 @@ "\"rate_reset_cap\"" ] }, - "6262": { + "6314": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%5#0", @@ -57035,7 +57269,7 @@ "maybe_exists%5#0" ] }, - "6263": { + "6315": { "op": "swap", "stack_out": [ "future_entry#0", @@ -57054,7 +57288,7 @@ "rate#0" ] }, - "6264": { + "6316": { "op": "frame_bury 6", "defined_out": [ "maybe_exists%5#0", @@ -57076,7 +57310,7 @@ "maybe_exists%5#0" ] }, - "6266": { + "6318": { "error": "check self.rate_reset_cap exists", "op": "assert // check self.rate_reset_cap exists", "stack_out": [ @@ -57094,7 +57328,7 @@ "tmp%4#0" ] }, - "6267": { + "6319": { "block": "_apply_non_cash_schedule_entry_after_if_else@58", "stack_in": [ "future_entry#0", @@ -57130,7 +57364,7 @@ "\"nominal_interest_rate\"" ] }, - "6269": { + "6321": { "op": "frame_dig 6", "defined_out": [ "\"nominal_interest_rate\"", @@ -57153,7 +57387,7 @@ "rate#0" ] }, - "6271": { + "6323": { "op": "app_global_put", "stack_out": [ "future_entry#0", @@ -57170,7 +57404,7 @@ "tmp%4#0" ] }, - "6272": { + "6324": { "block": "_apply_non_cash_schedule_entry_after_if_else@18", "stack_in": [ "future_entry#0", @@ -57206,7 +57440,7 @@ "event_type#0" ] }, - "6274": { + "6326": { "op": "pushint 4", "defined_out": [ "4", @@ -57229,7 +57463,7 @@ "4" ] }, - "6276": { + "6328": { "op": "==", "defined_out": [ "event_type#0", @@ -57251,7 +57485,7 @@ "tmp%16#0" ] }, - "6277": { + "6329": { "op": "bz _apply_non_cash_schedule_entry_else_body@20", "stack_out": [ "future_entry#0", @@ -57268,7 +57502,7 @@ "tmp%4#0" ] }, - "6280": { + "6332": { "op": "frame_dig -2", "defined_out": [ "entry#0 (copy)", @@ -57290,7 +57524,7 @@ "entry#0 (copy)" ] }, - "6282": { + "6334": { "op": "pushint 49", "defined_out": [ "49", @@ -57314,7 +57548,7 @@ "49" ] }, - "6284": { + "6336": { "op": "extract_uint64", "defined_out": [ "event_type#0", @@ -57336,7 +57570,7 @@ "values%10#0" ] }, - "6285": { + "6337": { "op": "bytec 4 // \"outstanding_principal\"", "defined_out": [ "\"outstanding_principal\"", @@ -57360,7 +57594,7 @@ "\"outstanding_principal\"" ] }, - "6287": { + "6339": { "op": "dig 1", "defined_out": [ "\"outstanding_principal\"", @@ -57386,7 +57620,7 @@ "values%10#0 (copy)" ] }, - "6289": { + "6341": { "op": "app_global_put", "stack_out": [ "future_entry#0", @@ -57404,7 +57638,7 @@ "values%10#0" ] }, - "6290": { + "6342": { "op": "bytec 7 // \"interest_calculation_base\"", "defined_out": [ "\"interest_calculation_base\"", @@ -57428,7 +57662,7 @@ "\"interest_calculation_base\"" ] }, - "6292": { + "6344": { "op": "swap", "stack_out": [ "future_entry#0", @@ -57447,7 +57681,7 @@ "values%10#0" ] }, - "6293": { + "6345": { "op": "app_global_put", "stack_out": [ "future_entry#0", @@ -57464,7 +57698,7 @@ "tmp%4#0" ] }, - "6294": { + "6346": { "block": "_apply_non_cash_schedule_entry_after_if_else@23", "stack_in": [ "future_entry#0", @@ -57501,7 +57735,7 @@ "tmp%18#0" ] }, - "6297": { + "6349": { "op": "bz _apply_non_cash_schedule_entry_else_body@29", "stack_out": [ "future_entry#0", @@ -57518,7 +57752,7 @@ "tmp%4#0" ] }, - "6300": { + "6352": { "op": "frame_dig 10", "defined_out": [ "event_type#0" @@ -57539,7 +57773,7 @@ "event_type#0" ] }, - "6302": { + "6354": { "op": "pushint 5", "defined_out": [ "5", @@ -57562,7 +57796,7 @@ "5" ] }, - "6304": { + "6356": { "op": "==", "defined_out": [ "event_type#0", @@ -57584,7 +57818,7 @@ "tmp%19#0" ] }, - "6305": { + "6357": { "op": "bz _apply_non_cash_schedule_entry_after_if_else@30", "stack_out": [ "future_entry#0", @@ -57601,7 +57835,7 @@ "tmp%4#0" ] }, - "6308": { + "6360": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -57623,7 +57857,7 @@ "0" ] }, - "6309": { + "6361": { "op": "bytec_3 // \"schedule_entry_count\"", "defined_out": [ "\"schedule_entry_count\"", @@ -57647,7 +57881,7 @@ "\"schedule_entry_count\"" ] }, - "6310": { + "6362": { "op": "app_global_get_ex", "defined_out": [ "event_type#0", @@ -57671,7 +57905,7 @@ "maybe_exists%10#0" ] }, - "6311": { + "6363": { "error": "check self.schedule_entry_count exists", "op": "assert // check self.schedule_entry_count exists", "stack_out": [ @@ -57690,7 +57924,7 @@ "maybe_value%10#0" ] }, - "6312": { + "6364": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -57709,7 +57943,7 @@ "0" ] }, - "6313": { + "6365": { "op": "bytec_2 // \"event_cursor\"", "defined_out": [ "\"event_cursor\"", @@ -57735,7 +57969,7 @@ "\"event_cursor\"" ] }, - "6314": { + "6366": { "op": "app_global_get_ex", "defined_out": [ "event_type#0", @@ -57761,7 +57995,7 @@ "maybe_exists%11#0" ] }, - "6315": { + "6367": { "error": "check self.event_cursor exists", "op": "assert // check self.event_cursor exists", "stack_out": [ @@ -57781,7 +58015,7 @@ "maybe_value%11#0" ] }, - "6316": { + "6368": { "op": "-", "defined_out": [ "event_type#0", @@ -57803,7 +58037,7 @@ "tmp%20#0" ] }, - "6317": { + "6369": { "op": "pushint 100", "defined_out": [ "100", @@ -57827,7 +58061,7 @@ "100" ] }, - "6319": { + "6371": { "op": "*", "defined_out": [ "event_type#0", @@ -57849,7 +58083,7 @@ "tmp%21#0" ] }, - "6320": { + "6372": { "op": "intc 4 // 1500", "defined_out": [ "1500", @@ -57873,7 +58107,7 @@ "1500" ] }, - "6322": { + "6374": { "op": "+", "defined_out": [ "event_type#0", @@ -57895,7 +58129,7 @@ "tmp%22#0" ] }, - "6323": { + "6375": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -57914,7 +58148,7 @@ "0" ] }, - "6324": { + "6376": { "callsub": "_puya_lib.util.ensure_budget", "op": "callsub ensure_budget", "stack_out": [ @@ -57932,7 +58166,7 @@ "tmp%4#0" ] }, - "6327": { + "6379": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -57950,7 +58184,7 @@ "0" ] }, - "6328": { + "6380": { "op": "bytec 5 // \"fixed_point_scale\"", "defined_out": [ "\"fixed_point_scale\"", @@ -57974,7 +58208,7 @@ "\"fixed_point_scale\"" ] }, - "6330": { + "6382": { "op": "app_global_get_ex", "defined_out": [ "discount_factor#0", @@ -57998,7 +58232,7 @@ "maybe_exists%0#0" ] }, - "6331": { + "6383": { "op": "swap", "stack_out": [ "future_entry#0", @@ -58017,7 +58251,7 @@ "discount_factor#0" ] }, - "6332": { + "6384": { "op": "frame_bury 2", "defined_out": [ "discount_factor#0", @@ -58040,7 +58274,7 @@ "maybe_exists%0#0" ] }, - "6334": { + "6386": { "error": "check self.fixed_point_scale exists", "op": "assert // check self.fixed_point_scale exists", "stack_out": [ @@ -58058,7 +58292,7 @@ "tmp%4#0" ] }, - "6335": { + "6387": { "op": "intc_0 // 0", "defined_out": [ "denominator#0", @@ -58081,7 +58315,7 @@ "denominator#0" ] }, - "6336": { + "6388": { "op": "frame_bury 1", "defined_out": [ "denominator#0", @@ -58103,7 +58337,7 @@ "tmp%4#0" ] }, - "6338": { + "6390": { "op": "intc_0 // 0", "defined_out": [ "denominator#0", @@ -58127,7 +58361,7 @@ "skip_first_redemption#0" ] }, - "6339": { + "6391": { "op": "frame_bury 7", "defined_out": [ "denominator#0", @@ -58150,7 +58384,7 @@ "tmp%4#0" ] }, - "6341": { + "6393": { "op": "frame_dig -2", "defined_out": [ "denominator#0", @@ -58175,7 +58409,7 @@ "entry#0 (copy)" ] }, - "6343": { + "6395": { "op": "pushint 25", "defined_out": [ "25", @@ -58202,7 +58436,7 @@ "25" ] }, - "6345": { + "6397": { "op": "extract_uint64", "defined_out": [ "denominator#0", @@ -58227,7 +58461,7 @@ "values%0#0" ] }, - "6346": { + "6398": { "op": "dup", "stack_out": [ "future_entry#0", @@ -58246,7 +58480,7 @@ "values%0#0" ] }, - "6347": { + "6399": { "op": "frame_bury 8", "defined_out": [ "denominator#0", @@ -58271,7 +58505,7 @@ "values%0#0" ] }, - "6349": { + "6401": { "op": "bz _apply_non_cash_schedule_entry_after_if_else@35", "stack_out": [ "future_entry#0", @@ -58288,7 +58522,7 @@ "tmp%4#0" ] }, - "6352": { + "6404": { "op": "frame_dig 2", "stack_out": [ "future_entry#0", @@ -58306,7 +58540,7 @@ "discount_factor#0" ] }, - "6354": { + "6406": { "op": "frame_dig 8", "stack_out": [ "future_entry#0", @@ -58325,7 +58559,7 @@ "values%0#0" ] }, - "6356": { + "6408": { "callsub": "modules.actus_kernel.ActusKernelModule._discount_annuity_factor", "op": "callsub _discount_annuity_factor", "stack_out": [ @@ -58344,7 +58578,7 @@ "discount_factor#0" ] }, - "6359": { + "6411": { "op": "dup", "stack_out": [ "future_entry#0", @@ -58363,7 +58597,7 @@ "discount_factor#0" ] }, - "6360": { + "6412": { "op": "frame_bury 2", "stack_out": [ "future_entry#0", @@ -58381,7 +58615,7 @@ "discount_factor#0" ] }, - "6362": { + "6414": { "op": "intc_1 // 1", "stack_out": [ "future_entry#0", @@ -58400,7 +58634,7 @@ "skip_first_redemption#0" ] }, - "6363": { + "6415": { "op": "frame_bury 7", "stack_out": [ "future_entry#0", @@ -58418,7 +58652,7 @@ "denominator#0" ] }, - "6365": { + "6417": { "op": "frame_bury 1", "stack_out": [ "future_entry#0", @@ -58435,7 +58669,7 @@ "tmp%4#0" ] }, - "6367": { + "6419": { "block": "_apply_non_cash_schedule_entry_after_if_else@35", "stack_in": [ "future_entry#0", @@ -58471,7 +58705,7 @@ "0" ] }, - "6368": { + "6420": { "op": "bytec_2 // \"event_cursor\"", "defined_out": [ "\"event_cursor\"", @@ -58494,7 +58728,7 @@ "\"event_cursor\"" ] }, - "6369": { + "6421": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%1#0", @@ -58517,7 +58751,7 @@ "maybe_exists%1#0" ] }, - "6370": { + "6422": { "error": "check self.event_cursor exists", "op": "assert // check self.event_cursor exists", "stack_out": [ @@ -58536,7 +58770,7 @@ "maybe_value%1#0" ] }, - "6371": { + "6423": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -58559,7 +58793,7 @@ "1" ] }, - "6372": { + "6424": { "op": "+", "defined_out": [ "future_event_id#0" @@ -58580,7 +58814,7 @@ "future_event_id#0" ] }, - "6373": { + "6425": { "op": "frame_bury 3", "defined_out": [ "future_event_id#0" @@ -58600,7 +58834,7 @@ "tmp%4#0" ] }, - "6375": { + "6427": { "block": "_apply_non_cash_schedule_entry_while_top@36", "stack_in": [ "future_entry#0", @@ -58636,7 +58870,7 @@ "0" ] }, - "6376": { + "6428": { "op": "bytec_3 // \"schedule_entry_count\"", "defined_out": [ "\"schedule_entry_count\"", @@ -58659,7 +58893,7 @@ "\"schedule_entry_count\"" ] }, - "6377": { + "6429": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%2#0", @@ -58682,7 +58916,7 @@ "maybe_exists%2#0" ] }, - "6378": { + "6430": { "error": "check self.schedule_entry_count exists", "op": "assert // check self.schedule_entry_count exists", "stack_out": [ @@ -58701,7 +58935,7 @@ "maybe_value%2#0" ] }, - "6379": { + "6431": { "op": "frame_dig 3", "defined_out": [ "future_event_id#0", @@ -58724,7 +58958,7 @@ "future_event_id#0" ] }, - "6381": { + "6433": { "op": ">", "defined_out": [ "future_event_id#0", @@ -58746,7 +58980,7 @@ "tmp%4#0" ] }, - "6382": { + "6434": { "op": "bz _apply_non_cash_schedule_entry_after_while@48", "stack_out": [ "future_entry#0", @@ -58763,7 +58997,7 @@ "tmp%4#0" ] }, - "6385": { + "6437": { "op": "frame_dig 3", "stack_out": [ "future_entry#0", @@ -58781,7 +59015,7 @@ "future_event_id#0" ] }, - "6387": { + "6439": { "callsub": "modules.actus_kernel.ActusKernelModule._get_schedule_entry", "op": "callsub _get_schedule_entry", "defined_out": [ @@ -58805,7 +59039,7 @@ "future_entry#0" ] }, - "6390": { + "6442": { "op": "dup", "stack_out": [ "future_entry#0", @@ -58824,7 +59058,7 @@ "future_entry#0" ] }, - "6391": { + "6443": { "op": "frame_bury 0", "defined_out": [ "future_entry#0", @@ -58847,7 +59081,7 @@ "future_entry#0" ] }, - "6393": { + "6445": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -58872,7 +59106,7 @@ "8" ] }, - "6394": { + "6446": { "op": "getbyte", "defined_out": [ "future_entry#0", @@ -58896,7 +59130,7 @@ "future_event_type#0" ] }, - "6395": { + "6447": { "op": "dup", "stack_out": [ "future_entry#0", @@ -58915,7 +59149,7 @@ "future_event_type#0" ] }, - "6396": { + "6448": { "op": "frame_bury 4", "defined_out": [ "future_entry#0", @@ -58939,7 +59173,7 @@ "future_event_type#0" ] }, - "6398": { + "6450": { "op": "pushint 3", "defined_out": [ "3", @@ -58965,7 +59199,7 @@ "3" ] }, - "6400": { + "6452": { "op": "==", "defined_out": [ "future_entry#0", @@ -58990,7 +59224,7 @@ "tmp%7#1" ] }, - "6401": { + "6453": { "op": "bnz _apply_non_cash_schedule_entry_bool_true@40", "stack_out": [ "future_entry#0", @@ -59007,7 +59241,7 @@ "tmp%4#0" ] }, - "6404": { + "6456": { "op": "frame_dig 4", "stack_out": [ "future_entry#0", @@ -59025,7 +59259,7 @@ "future_event_type#0" ] }, - "6406": { + "6458": { "op": "pushint 19", "defined_out": [ "19", @@ -59051,7 +59285,7 @@ "19" ] }, - "6408": { + "6460": { "op": "==", "defined_out": [ "future_entry#0", @@ -59076,7 +59310,7 @@ "tmp%8#1" ] }, - "6409": { + "6461": { "op": "bz _apply_non_cash_schedule_entry_bool_false@41", "stack_out": [ "future_entry#0", @@ -59093,7 +59327,7 @@ "tmp%4#0" ] }, - "6412": { + "6464": { "op": "frame_dig 0", "stack_out": [ "future_entry#0", @@ -59111,7 +59345,7 @@ "future_entry#0" ] }, - "6414": { + "6466": { "op": "pushint 25", "defined_out": [ "25", @@ -59137,7 +59371,7 @@ "25" ] }, - "6416": { + "6468": { "op": "extract_uint64", "defined_out": [ "future_entry#0", @@ -59162,7 +59396,7 @@ "values%2#0" ] }, - "6417": { + "6469": { "op": "bz _apply_non_cash_schedule_entry_bool_false@41", "stack_out": [ "future_entry#0", @@ -59179,7 +59413,7 @@ "tmp%4#0" ] }, - "6420": { + "6472": { "block": "_apply_non_cash_schedule_entry_bool_true@40", "stack_in": [ "future_entry#0", @@ -59215,7 +59449,7 @@ "is_redemption_event#0" ] }, - "6421": { + "6473": { "block": "_apply_non_cash_schedule_entry_bool_merge@42", "stack_in": [ "future_entry#0", @@ -59249,7 +59483,7 @@ "tmp%4#0" ] }, - "6424": { + "6476": { "op": "frame_dig 7", "defined_out": [ "skip_first_redemption#0" @@ -59270,7 +59504,7 @@ "skip_first_redemption#0" ] }, - "6426": { + "6478": { "op": "bz _apply_non_cash_schedule_entry_else_body@45", "stack_out": [ "future_entry#0", @@ -59287,7 +59521,7 @@ "tmp%4#0" ] }, - "6429": { + "6481": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -59305,7 +59539,7 @@ "skip_first_redemption#0" ] }, - "6430": { + "6482": { "op": "frame_bury 7", "defined_out": [ "skip_first_redemption#0" @@ -59325,7 +59559,7 @@ "tmp%4#0" ] }, - "6432": { + "6484": { "block": "_apply_non_cash_schedule_entry_after_if_else@47", "stack_in": [ "future_entry#0", @@ -59361,7 +59595,7 @@ "future_event_id#0" ] }, - "6434": { + "6486": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -59384,7 +59618,7 @@ "1" ] }, - "6435": { + "6487": { "op": "+", "stack_out": [ "future_entry#0", @@ -59402,7 +59636,7 @@ "future_event_id#0" ] }, - "6436": { + "6488": { "op": "frame_bury 3", "defined_out": [ "future_event_id#0" @@ -59422,10 +59656,10 @@ "tmp%4#0" ] }, - "6438": { + "6490": { "op": "b _apply_non_cash_schedule_entry_while_top@36" }, - "6441": { + "6493": { "block": "_apply_non_cash_schedule_entry_else_body@45", "stack_in": [ "future_entry#0", @@ -59461,7 +59695,7 @@ "future_entry#0" ] }, - "6443": { + "6495": { "op": "pushint 25", "defined_out": [ "25", @@ -59484,7 +59718,7 @@ "25" ] }, - "6445": { + "6497": { "op": "extract_uint64", "defined_out": [ "future_entry#0", @@ -59506,7 +59740,7 @@ "values%3#1" ] }, - "6446": { + "6498": { "op": "frame_dig 2", "defined_out": [ "discount_factor#0", @@ -59530,7 +59764,7 @@ "discount_factor#0" ] }, - "6448": { + "6500": { "op": "swap", "stack_out": [ "future_entry#0", @@ -59549,7 +59783,7 @@ "values%3#1" ] }, - "6449": { + "6501": { "callsub": "modules.actus_kernel.ActusKernelModule._discount_annuity_factor", "op": "callsub _discount_annuity_factor", "stack_out": [ @@ -59568,7 +59802,7 @@ "discount_factor#0" ] }, - "6452": { + "6504": { "op": "dup", "stack_out": [ "future_entry#0", @@ -59587,7 +59821,7 @@ "discount_factor#0" ] }, - "6453": { + "6505": { "op": "frame_bury 2", "defined_out": [ "discount_factor#0", @@ -59609,7 +59843,7 @@ "discount_factor#0" ] }, - "6455": { + "6507": { "op": "frame_dig 1", "defined_out": [ "denominator#0", @@ -59633,7 +59867,7 @@ "denominator#0" ] }, - "6457": { + "6509": { "op": "+", "stack_out": [ "future_entry#0", @@ -59651,7 +59885,7 @@ "denominator#0" ] }, - "6458": { + "6510": { "op": "frame_bury 1", "defined_out": [ "denominator#0", @@ -59673,10 +59907,10 @@ "tmp%4#0" ] }, - "6460": { + "6512": { "op": "b _apply_non_cash_schedule_entry_after_if_else@47" }, - "6463": { + "6515": { "block": "_apply_non_cash_schedule_entry_bool_false@41", "stack_in": [ "future_entry#0", @@ -59712,10 +59946,10 @@ "is_redemption_event#0" ] }, - "6464": { + "6516": { "op": "b _apply_non_cash_schedule_entry_bool_merge@42" }, - "6467": { + "6519": { "block": "_apply_non_cash_schedule_entry_after_while@48", "stack_in": [ "future_entry#0", @@ -59751,7 +59985,7 @@ "denominator#0" ] }, - "6469": { + "6521": { "error": "Invalid ACTUS configuration", "op": "assert // Invalid ACTUS configuration", "stack_out": [ @@ -59769,7 +60003,7 @@ "tmp%4#0" ] }, - "6470": { + "6522": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -59791,7 +60025,7 @@ "0" ] }, - "6471": { + "6523": { "op": "bytec 4 // \"outstanding_principal\"", "defined_out": [ "\"outstanding_principal\"", @@ -59815,7 +60049,7 @@ "\"outstanding_principal\"" ] }, - "6473": { + "6525": { "op": "app_global_get_ex", "defined_out": [ "denominator#0", @@ -59839,7 +60073,7 @@ "maybe_exists%3#0" ] }, - "6474": { + "6526": { "error": "check self.outstanding_principal exists", "op": "assert // check self.outstanding_principal exists", "stack_out": [ @@ -59858,7 +60092,7 @@ "numerator#0" ] }, - "6475": { + "6527": { "op": "frame_dig -2", "defined_out": [ "denominator#0", @@ -59882,7 +60116,7 @@ "entry#0 (copy)" ] }, - "6477": { + "6529": { "op": "pushint 57", "defined_out": [ "57", @@ -59908,7 +60142,7 @@ "57" ] }, - "6479": { + "6531": { "op": "extract_uint64", "defined_out": [ "denominator#0", @@ -59932,7 +60166,7 @@ "values%4#0" ] }, - "6480": { + "6532": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -59958,7 +60192,7 @@ "8" ] }, - "6481": { + "6533": { "op": "&", "defined_out": [ "denominator#0", @@ -59982,7 +60216,7 @@ "tmp%14#1" ] }, - "6482": { + "6534": { "op": "bnz _apply_non_cash_schedule_entry_after_if_else@50", "stack_out": [ "future_entry#0", @@ -60000,7 +60234,7 @@ "numerator#0" ] }, - "6485": { + "6537": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -60019,7 +60253,7 @@ "0" ] }, - "6486": { + "6538": { "op": "bytec 6 // \"accrued_interest\"", "defined_out": [ "\"accrued_interest\"", @@ -60045,7 +60279,7 @@ "\"accrued_interest\"" ] }, - "6488": { + "6540": { "op": "app_global_get_ex", "defined_out": [ "denominator#0", @@ -60071,7 +60305,7 @@ "maybe_exists%4#0" ] }, - "6489": { + "6541": { "error": "check self.accrued_interest exists", "op": "assert // check self.accrued_interest exists", "stack_out": [ @@ -60091,7 +60325,7 @@ "maybe_value%4#0" ] }, - "6490": { + "6542": { "op": "+", "stack_out": [ "future_entry#0", @@ -60109,7 +60343,7 @@ "numerator#0" ] }, - "6491": { + "6543": { "block": "_apply_non_cash_schedule_entry_after_if_else@50", "stack_in": [ "future_entry#0", @@ -60147,7 +60381,7 @@ "0" ] }, - "6492": { + "6544": { "op": "bytec 5 // \"fixed_point_scale\"", "defined_out": [ "\"fixed_point_scale\"", @@ -60171,7 +60405,7 @@ "\"fixed_point_scale\"" ] }, - "6494": { + "6546": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%5#0", @@ -60195,7 +60429,7 @@ "maybe_exists%5#0" ] }, - "6495": { + "6547": { "error": "check self.fixed_point_scale exists", "op": "assert // check self.fixed_point_scale exists", "defined_out": [ @@ -60219,7 +60453,7 @@ "maybe_value%5#0" ] }, - "6496": { + "6548": { "op": "frame_dig 1", "defined_out": [ "denominator#0", @@ -60244,7 +60478,7 @@ "denominator#0" ] }, - "6498": { + "6550": { "callsub": "modules.actus_kernel.ActusKernelModule._scaled_mul_div", "op": "callsub _scaled_mul_div", "defined_out": [ @@ -60267,7 +60501,7 @@ "tmp%17#1" ] }, - "6501": { + "6553": { "op": "bytec 14 // \"next_principal_redemption\"", "defined_out": [ "\"next_principal_redemption\"", @@ -60291,7 +60525,7 @@ "\"next_principal_redemption\"" ] }, - "6503": { + "6555": { "op": "swap", "stack_out": [ "future_entry#0", @@ -60310,7 +60544,7 @@ "tmp%17#1" ] }, - "6504": { + "6556": { "op": "app_global_put", "stack_out": [ "future_entry#0", @@ -60327,7 +60561,7 @@ "tmp%4#0" ] }, - "6505": { + "6557": { "block": "_apply_non_cash_schedule_entry_after_if_else@30", "stack_in": [ "future_entry#0", @@ -60363,7 +60597,7 @@ "0" ] }, - "6506": { + "6558": { "op": "bytec_2 // \"event_cursor\"", "defined_out": [ "\"event_cursor\"", @@ -60386,7 +60620,7 @@ "\"event_cursor\"" ] }, - "6507": { + "6559": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%12#0", @@ -60409,7 +60643,7 @@ "maybe_exists%12#0" ] }, - "6508": { + "6560": { "error": "check self.event_cursor exists", "op": "assert // check self.event_cursor exists", "stack_out": [ @@ -60428,7 +60662,7 @@ "maybe_value%12#0" ] }, - "6509": { + "6561": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -60451,7 +60685,7 @@ "1" ] }, - "6510": { + "6562": { "op": "+", "defined_out": [ "tmp%23#0" @@ -60472,7 +60706,7 @@ "tmp%23#0" ] }, - "6511": { + "6563": { "op": "bytec_2 // \"event_cursor\"", "stack_out": [ "future_entry#0", @@ -60491,7 +60725,7 @@ "\"event_cursor\"" ] }, - "6512": { + "6564": { "op": "swap", "stack_out": [ "future_entry#0", @@ -60510,7 +60744,7 @@ "tmp%23#0" ] }, - "6513": { + "6565": { "op": "app_global_put", "stack_out": [ "future_entry#0", @@ -60527,7 +60761,7 @@ "tmp%4#0" ] }, - "6514": { + "6566": { "op": "frame_dig -2", "defined_out": [ "entry#0 (copy)" @@ -60548,7 +60782,7 @@ "entry#0 (copy)" ] }, - "6516": { + "6568": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -60567,7 +60801,7 @@ "0" ] }, - "6517": { + "6569": { "op": "dup", "stack_out": [ "future_entry#0", @@ -60587,7 +60821,7 @@ "0" ] }, - "6518": { + "6570": { "callsub": "modules.actus_kernel.ActusKernelModule._emit_execution_event", "op": "callsub _emit_execution_event", "defined_out": [ @@ -60609,10 +60843,10 @@ "entry#0" ] }, - "6521": { + "6573": { "op": "dup" }, - "6522": { + "6574": { "op": "frame_bury -2", "stack_out": [ "future_entry#0", @@ -60630,7 +60864,7 @@ "entry#0 (copy)" ] }, - "6524": { + "6576": { "op": "frame_dig -1", "defined_out": [ "entry#0 (copy)", @@ -60653,17 +60887,17 @@ "payload#0 (copy)" ] }, - "6526": { + "6578": { "op": "frame_bury 1" }, - "6528": { + "6580": { "op": "frame_bury 0" }, - "6530": { + "6582": { "retsub": true, "op": "retsub" }, - "6531": { + "6583": { "block": "_apply_non_cash_schedule_entry_else_body@29", "stack_in": [ "future_entry#0", @@ -60699,7 +60933,7 @@ "entry#0 (copy)" ] }, - "6533": { + "6585": { "op": "pushint 41", "defined_out": [ "41", @@ -60722,7 +60956,7 @@ "41" ] }, - "6535": { + "6587": { "op": "extract_uint64", "defined_out": [ "values%12#0" @@ -60743,7 +60977,7 @@ "values%12#0" ] }, - "6536": { + "6588": { "op": "bytec 14 // \"next_principal_redemption\"", "defined_out": [ "\"next_principal_redemption\"", @@ -60766,7 +61000,7 @@ "\"next_principal_redemption\"" ] }, - "6538": { + "6590": { "op": "swap", "stack_out": [ "future_entry#0", @@ -60785,7 +61019,7 @@ "values%12#0" ] }, - "6539": { + "6591": { "op": "app_global_put", "stack_out": [ "future_entry#0", @@ -60802,10 +61036,10 @@ "tmp%4#0" ] }, - "6540": { + "6592": { "op": "b _apply_non_cash_schedule_entry_after_if_else@30" }, - "6543": { + "6595": { "block": "_apply_non_cash_schedule_entry_else_body@20", "stack_in": [ "future_entry#0", @@ -60841,7 +61075,7 @@ "event_type#0" ] }, - "6545": { + "6597": { "op": "pushint 18", "defined_out": [ "18", @@ -60864,7 +61098,7 @@ "18" ] }, - "6547": { + "6599": { "op": "==", "defined_out": [ "event_type#0", @@ -60886,7 +61120,7 @@ "tmp%17#0" ] }, - "6548": { + "6600": { "op": "bz _apply_non_cash_schedule_entry_after_if_else@23", "stack_out": [ "future_entry#0", @@ -60903,7 +61137,7 @@ "tmp%4#0" ] }, - "6551": { + "6603": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -60925,7 +61159,7 @@ "0" ] }, - "6552": { + "6604": { "op": "bytec 4 // \"outstanding_principal\"", "defined_out": [ "\"outstanding_principal\"", @@ -60949,7 +61183,7 @@ "\"outstanding_principal\"" ] }, - "6554": { + "6606": { "op": "app_global_get_ex", "defined_out": [ "event_type#0", @@ -60973,7 +61207,7 @@ "maybe_exists%9#0" ] }, - "6555": { + "6607": { "error": "check self.outstanding_principal exists", "op": "assert // check self.outstanding_principal exists", "stack_out": [ @@ -60992,7 +61226,7 @@ "maybe_value%9#0" ] }, - "6556": { + "6608": { "op": "bytec 7 // \"interest_calculation_base\"", "defined_out": [ "\"interest_calculation_base\"", @@ -61016,7 +61250,7 @@ "\"interest_calculation_base\"" ] }, - "6558": { + "6610": { "op": "swap", "stack_out": [ "future_entry#0", @@ -61035,7 +61269,7 @@ "maybe_value%9#0" ] }, - "6559": { + "6611": { "op": "app_global_put", "stack_out": [ "future_entry#0", @@ -61052,10 +61286,10 @@ "tmp%4#0" ] }, - "6560": { + "6612": { "op": "b _apply_non_cash_schedule_entry_after_if_else@23" }, - "6563": { + "6615": { "block": "_apply_non_cash_schedule_entry_else_body@10", "stack_in": [ "future_entry#0", @@ -61091,7 +61325,7 @@ "event_type#0" ] }, - "6565": { + "6617": { "op": "pushint 11", "defined_out": [ "11", @@ -61114,7 +61348,7 @@ "11" ] }, - "6567": { + "6619": { "op": "==", "defined_out": [ "event_type#0", @@ -61136,7 +61370,7 @@ "tmp%13#0" ] }, - "6568": { + "6620": { "op": "bz _apply_non_cash_schedule_entry_else_body@14", "stack_out": [ "future_entry#0", @@ -61153,7 +61387,7 @@ "tmp%4#0" ] }, - "6571": { + "6623": { "op": "frame_dig -2", "defined_out": [ "entry#0 (copy)", @@ -61175,7 +61409,7 @@ "entry#0 (copy)" ] }, - "6573": { + "6625": { "op": "pushint 33", "defined_out": [ "33", @@ -61199,7 +61433,7 @@ "33" ] }, - "6575": { + "6627": { "op": "extract_uint64", "defined_out": [ "event_type#0", @@ -61221,7 +61455,7 @@ "next_rate#0" ] }, - "6576": { + "6628": { "op": "dup", "stack_out": [ "future_entry#0", @@ -61240,7 +61474,7 @@ "next_rate#0" ] }, - "6577": { + "6629": { "op": "frame_bury 5", "defined_out": [ "event_type#0", @@ -61262,7 +61496,7 @@ "next_rate#0" ] }, - "6579": { + "6631": { "op": "bnz _apply_non_cash_schedule_entry_after_if_else@13", "stack_out": [ "future_entry#0", @@ -61279,7 +61513,7 @@ "tmp%4#0" ] }, - "6582": { + "6634": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -61297,7 +61531,7 @@ "0" ] }, - "6583": { + "6635": { "op": "bytec 37 // \"rate_reset_next\"", "defined_out": [ "\"rate_reset_next\"", @@ -61322,7 +61556,7 @@ "\"rate_reset_next\"" ] }, - "6585": { + "6637": { "op": "app_global_get_ex", "defined_out": [ "event_type#0", @@ -61346,7 +61580,7 @@ "maybe_exists%8#0" ] }, - "6586": { + "6638": { "op": "swap", "stack_out": [ "future_entry#0", @@ -61365,7 +61599,7 @@ "next_rate#0" ] }, - "6587": { + "6639": { "op": "frame_bury 5", "stack_out": [ "future_entry#0", @@ -61383,7 +61617,7 @@ "maybe_exists%8#0" ] }, - "6589": { + "6641": { "error": "check self.rate_reset_next exists", "op": "assert // check self.rate_reset_next exists", "stack_out": [ @@ -61401,7 +61635,7 @@ "tmp%4#0" ] }, - "6590": { + "6642": { "block": "_apply_non_cash_schedule_entry_after_if_else@13", "stack_in": [ "future_entry#0", @@ -61437,7 +61671,7 @@ "\"nominal_interest_rate\"" ] }, - "6592": { + "6644": { "op": "frame_dig 5", "defined_out": [ "\"nominal_interest_rate\"", @@ -61460,7 +61694,7 @@ "next_rate#0" ] }, - "6594": { + "6646": { "op": "app_global_put", "stack_out": [ "future_entry#0", @@ -61477,10 +61711,10 @@ "tmp%4#0" ] }, - "6595": { + "6647": { "op": "b _apply_non_cash_schedule_entry_after_if_else@18" }, - "6598": { + "6650": { "block": "_apply_non_cash_schedule_entry_else_body@14", "stack_in": [ "future_entry#0", @@ -61516,7 +61750,7 @@ "entry#0 (copy)" ] }, - "6600": { + "6652": { "op": "pushint 33", "defined_out": [ "33", @@ -61539,7 +61773,7 @@ "33" ] }, - "6602": { + "6654": { "op": "extract_uint64", "defined_out": [ "values%8#0" @@ -61560,7 +61794,7 @@ "values%8#0" ] }, - "6603": { + "6655": { "op": "dup", "stack_out": [ "future_entry#0", @@ -61579,7 +61813,7 @@ "values%8#0" ] }, - "6604": { + "6656": { "op": "frame_bury 9", "defined_out": [ "values%8#0" @@ -61600,7 +61834,7 @@ "values%8#0" ] }, - "6606": { + "6658": { "op": "bz _apply_non_cash_schedule_entry_after_if_else@18", "stack_out": [ "future_entry#0", @@ -61617,7 +61851,7 @@ "tmp%4#0" ] }, - "6609": { + "6661": { "op": "bytec 9 // \"nominal_interest_rate\"", "defined_out": [ "\"nominal_interest_rate\"", @@ -61639,7 +61873,7 @@ "\"nominal_interest_rate\"" ] }, - "6611": { + "6663": { "op": "frame_dig 9", "stack_out": [ "future_entry#0", @@ -61658,7 +61892,7 @@ "values%8#0" ] }, - "6613": { + "6665": { "op": "app_global_put", "stack_out": [ "future_entry#0", @@ -61675,10 +61909,10 @@ "tmp%4#0" ] }, - "6614": { + "6666": { "op": "b _apply_non_cash_schedule_entry_after_if_else@18" }, - "6617": { + "6669": { "subroutine": "modules.actus_kernel.ActusKernelModule._emit_execution_event", "params": { "entry#0": "bytes", @@ -61689,13 +61923,13 @@ "stack_in": [], "op": "proto 3 1" }, - "6620": { + "6672": { "op": "global CurrentApplicationID" }, - "6622": { + "6674": { "op": "frame_dig -3" }, - "6624": { + "6676": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -61708,7 +61942,7 @@ "0" ] }, - "6625": { + "6677": { "op": "extract_uint64", "defined_out": [ "tmp%0#0", @@ -61719,7 +61953,7 @@ "values%0#0" ] }, - "6626": { + "6678": { "op": "frame_dig -3", "stack_out": [ "tmp%0#0", @@ -61727,7 +61961,7 @@ "entry#0 (copy)" ] }, - "6628": { + "6680": { "op": "extract 8 1", "defined_out": [ "aggregate%extract%1#0", @@ -61740,7 +61974,7 @@ "aggregate%extract%1#0" ] }, - "6631": { + "6683": { "op": "frame_dig -3", "stack_out": [ "tmp%0#0", @@ -61749,7 +61983,7 @@ "entry#0 (copy)" ] }, - "6633": { + "6685": { "op": "extract 9 8", "defined_out": [ "aggregate%extract%1#0", @@ -61764,13 +61998,13 @@ "aggregate%extract%2#0" ] }, - "6636": { + "6688": { "op": "global LatestTimestamp" }, - "6638": { + "6690": { "op": "frame_dig -3" }, - "6640": { + "6692": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -61791,7 +62025,7 @@ "8" ] }, - "6641": { + "6693": { "op": "getbyte", "defined_out": [ "aggregate%extract%1#0", @@ -61810,7 +62044,7 @@ "event_type#0" ] }, - "6642": { + "6694": { "op": "frame_dig -2", "defined_out": [ "aggregate%extract%1#0", @@ -61831,7 +62065,7 @@ "payoff#0 (copy)" ] }, - "6644": { + "6696": { "op": "bnz _emit_execution_event_after_if_else@3", "stack_out": [ "tmp%0#0", @@ -61842,7 +62076,7 @@ "event_type#0" ] }, - "6647": { + "6699": { "op": "intc_1 // 1", "defined_out": [ "aggregate%extract%1#0", @@ -61863,7 +62097,7 @@ "tmp%3#0" ] }, - "6648": { + "6700": { "block": "_emit_execution_event_after_inlined_modules.actus_kernel.ActusKernelModule._payoff_sign@7", "stack_in": [ "tmp%0#0", @@ -61888,7 +62122,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "6649": { + "6701": { "op": "dup", "defined_out": [ "aggregate%val_as_bytes%0#0", @@ -61905,7 +62139,7 @@ "aggregate%val_as_bytes%0#0 (copy)" ] }, - "6650": { + "6702": { "op": "bitlen", "defined_out": [ "aggregate%bitlen%0#0", @@ -61922,7 +62156,7 @@ "aggregate%bitlen%0#0" ] }, - "6651": { + "6703": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -61941,7 +62175,7 @@ "8" ] }, - "6652": { + "6704": { "op": "<=", "defined_out": [ "aggregate%no_overflow%0#0", @@ -61958,7 +62192,7 @@ "aggregate%no_overflow%0#0" ] }, - "6653": { + "6705": { "error": "overflow", "op": "assert // overflow", "stack_out": [ @@ -61971,7 +62205,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "6654": { + "6706": { "op": "extract 7 1", "defined_out": [ "aggregate%uint8%0#0" @@ -61986,7 +62220,7 @@ "aggregate%uint8%0#0" ] }, - "6657": { + "6709": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -62003,7 +62237,7 @@ "0" ] }, - "6658": { + "6710": { "op": "bytec 19 // \"settlement_asset_id\"", "defined_out": [ "\"settlement_asset_id\"", @@ -62022,7 +62256,7 @@ "\"settlement_asset_id\"" ] }, - "6660": { + "6712": { "op": "app_global_get_ex", "defined_out": [ "aggregate%uint8%0#0", @@ -62041,7 +62275,7 @@ "maybe_exists%0#0" ] }, - "6661": { + "6713": { "error": "check self.settlement_asset_id exists", "op": "assert // check self.settlement_asset_id exists", "stack_out": [ @@ -62055,7 +62289,7 @@ "maybe_value%0#0" ] }, - "6662": { + "6714": { "op": "frame_dig 1", "defined_out": [ "aggregate%uint8%0#0", @@ -62074,7 +62308,7 @@ "values%0#0" ] }, - "6664": { + "6716": { "op": "dup", "defined_out": [ "aggregate%uint8%0#0", @@ -62095,7 +62329,7 @@ "values%0#0 (copy)" ] }, - "6665": { + "6717": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -62118,7 +62352,7 @@ "1" ] }, - "6666": { + "6718": { "op": "+", "defined_out": [ "aggregate%uint8%0#0", @@ -62139,7 +62373,7 @@ "tmp%5#0" ] }, - "6667": { + "6719": { "op": "frame_dig 0", "defined_out": [ "aggregate%uint8%0#0", @@ -62162,7 +62396,7 @@ "tmp%0#0" ] }, - "6669": { + "6721": { "op": "itob", "defined_out": [ "aggregate%uint8%0#0", @@ -62186,7 +62420,7 @@ "aggregate%val_as_bytes%1#0" ] }, - "6670": { + "6722": { "op": "uncover 2", "stack_out": [ "tmp%0#0", @@ -62202,7 +62436,7 @@ "values%0#0" ] }, - "6672": { + "6724": { "op": "itob", "defined_out": [ "aggregate%uint8%0#0", @@ -62227,7 +62461,7 @@ "aggregate%val_as_bytes%2#0" ] }, - "6673": { + "6725": { "op": "concat", "defined_out": [ "aggregate%head%1#0", @@ -62250,7 +62484,7 @@ "aggregate%head%1#0" ] }, - "6674": { + "6726": { "op": "frame_dig 2", "defined_out": [ "aggregate%extract%1#0", @@ -62275,7 +62509,7 @@ "aggregate%extract%1#0" ] }, - "6676": { + "6728": { "op": "concat", "defined_out": [ "aggregate%extract%1#0", @@ -62299,7 +62533,7 @@ "aggregate%head%2#0" ] }, - "6677": { + "6729": { "op": "frame_dig 3", "defined_out": [ "aggregate%extract%1#0", @@ -62325,7 +62559,7 @@ "aggregate%extract%2#0" ] }, - "6679": { + "6731": { "op": "concat", "defined_out": [ "aggregate%extract%1#0", @@ -62350,7 +62584,7 @@ "aggregate%head%3#0" ] }, - "6680": { + "6732": { "op": "frame_dig 4", "defined_out": [ "aggregate%extract%1#0", @@ -62377,7 +62611,7 @@ "tmp%1#0" ] }, - "6682": { + "6734": { "op": "itob", "defined_out": [ "aggregate%extract%1#0", @@ -62405,7 +62639,7 @@ "aggregate%val_as_bytes%4#0" ] }, - "6683": { + "6735": { "op": "concat", "defined_out": [ "aggregate%extract%1#0", @@ -62431,7 +62665,7 @@ "aggregate%head%4#0" ] }, - "6684": { + "6736": { "op": "frame_dig -2", "defined_out": [ "aggregate%extract%1#0", @@ -62459,7 +62693,7 @@ "payoff#0 (copy)" ] }, - "6686": { + "6738": { "op": "itob", "defined_out": [ "aggregate%extract%1#0", @@ -62487,7 +62721,7 @@ "aggregate%val_as_bytes%5#0" ] }, - "6687": { + "6739": { "op": "concat", "defined_out": [ "aggregate%extract%1#0", @@ -62513,7 +62747,7 @@ "aggregate%head%5#0" ] }, - "6688": { + "6740": { "op": "uncover 3", "stack_out": [ "tmp%0#0", @@ -62528,7 +62762,7 @@ "aggregate%uint8%0#0" ] }, - "6690": { + "6742": { "op": "concat", "defined_out": [ "aggregate%extract%1#0", @@ -62552,7 +62786,7 @@ "aggregate%head%6#0" ] }, - "6691": { + "6743": { "op": "frame_dig -1", "defined_out": [ "aggregate%extract%1#0", @@ -62578,7 +62812,7 @@ "settled_amount#0 (copy)" ] }, - "6693": { + "6745": { "op": "itob", "defined_out": [ "aggregate%extract%1#0", @@ -62604,7 +62838,7 @@ "aggregate%val_as_bytes%6#0" ] }, - "6694": { + "6746": { "op": "concat", "defined_out": [ "aggregate%extract%1#0", @@ -62628,7 +62862,7 @@ "aggregate%head%7#0" ] }, - "6695": { + "6747": { "op": "uncover 2", "stack_out": [ "tmp%0#0", @@ -62642,7 +62876,7 @@ "maybe_value%0#0" ] }, - "6697": { + "6749": { "op": "itob", "defined_out": [ "aggregate%extract%1#0", @@ -62666,7 +62900,7 @@ "aggregate%val_as_bytes%7#0" ] }, - "6698": { + "6750": { "op": "concat", "defined_out": [ "aggregate%extract%1#0", @@ -62688,7 +62922,7 @@ "aggregate%head%8#0" ] }, - "6699": { + "6751": { "op": "swap", "stack_out": [ "tmp%0#0", @@ -62701,7 +62935,7 @@ "tmp%5#0" ] }, - "6700": { + "6752": { "op": "itob", "defined_out": [ "aggregate%extract%1#0", @@ -62723,7 +62957,7 @@ "aggregate%val_as_bytes%8#0" ] }, - "6701": { + "6753": { "op": "concat", "defined_out": [ "aggregate%extract%1#0", @@ -62743,7 +62977,7 @@ "aggregate%head%9#0" ] }, - "6702": { + "6754": { "op": "pushbytes 0x9a332b95 // method \"ExecutionEvent(uint64,uint64,uint8,uint64,uint64,uint64,uint8,uint64,uint64,uint64)\"", "defined_out": [ "Method(ExecutionEvent(uint64,uint64,uint8,uint64,uint64,uint64,uint8,uint64,uint64,uint64))", @@ -62765,7 +62999,7 @@ "Method(ExecutionEvent(uint64,uint64,uint8,uint64,uint64,uint64,uint8,uint64,uint64,uint64))" ] }, - "6708": { + "6760": { "op": "swap", "stack_out": [ "tmp%0#0", @@ -62778,7 +63012,7 @@ "aggregate%head%9#0" ] }, - "6709": { + "6761": { "op": "concat", "defined_out": [ "aggregate%extract%1#0", @@ -62798,7 +63032,7 @@ "event%0#0" ] }, - "6710": { + "6762": { "op": "log", "stack_out": [ "tmp%0#0", @@ -62809,7 +63043,7 @@ "event_type#0" ] }, - "6711": { + "6763": { "op": "frame_dig -3", "defined_out": [ "aggregate%extract%1#0", @@ -62829,14 +63063,14 @@ "entry#0 (copy)" ] }, - "6713": { + "6765": { "op": "frame_bury 0" }, - "6715": { + "6767": { "retsub": true, "op": "retsub" }, - "6716": { + "6768": { "block": "_emit_execution_event_after_if_else@3", "stack_in": [ "tmp%0#0", @@ -62860,7 +63094,7 @@ "event_type#0" ] }, - "6718": { + "6770": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -62877,7 +63111,7 @@ "1" ] }, - "6719": { + "6771": { "op": "==", "defined_out": [ "event_type#0", @@ -62893,7 +63127,7 @@ "tmp%1#1" ] }, - "6720": { + "6772": { "op": "bnz _emit_execution_event_if_body@5", "stack_out": [ "tmp%0#0", @@ -62904,7 +63138,7 @@ "event_type#0" ] }, - "6723": { + "6775": { "op": "frame_dig 5", "stack_out": [ "tmp%0#0", @@ -62916,7 +63150,7 @@ "event_type#0" ] }, - "6725": { + "6777": { "op": "pushint 4", "defined_out": [ "4", @@ -62933,7 +63167,7 @@ "4" ] }, - "6727": { + "6779": { "op": "==", "defined_out": [ "event_type#0", @@ -62949,7 +63183,7 @@ "tmp%2#1" ] }, - "6728": { + "6780": { "op": "bz _emit_execution_event_after_if_else@6", "stack_out": [ "tmp%0#0", @@ -62960,7 +63194,7 @@ "event_type#0" ] }, - "6731": { + "6783": { "block": "_emit_execution_event_if_body@5", "stack_in": [ "tmp%0#0", @@ -62984,10 +63218,10 @@ "tmp%3#0" ] }, - "6732": { + "6784": { "op": "b _emit_execution_event_after_inlined_modules.actus_kernel.ActusKernelModule._payoff_sign@7" }, - "6735": { + "6787": { "block": "_emit_execution_event_after_if_else@6", "stack_in": [ "tmp%0#0", @@ -63011,10 +63245,10 @@ "tmp%3#0" ] }, - "6738": { + "6790": { "op": "b _emit_execution_event_after_inlined_modules.actus_kernel.ActusKernelModule._payoff_sign@7" }, - "6741": { + "6793": { "subroutine": "modules.rbac.RbacModule._role_is_active", "params": { "role_map#0": "bytes", @@ -63024,13 +63258,13 @@ "stack_in": [], "op": "proto 2 1" }, - "6744": { + "6796": { "op": "pushbytes \"\"", "stack_out": [ "awst_tmp%0#0" ] }, - "6746": { + "6798": { "op": "frame_dig -2", "defined_out": [ "role_map#0 (copy)" @@ -63040,7 +63274,7 @@ "role_map#0 (copy)" ] }, - "6748": { + "6800": { "op": "frame_dig -1", "defined_out": [ "role_address#0 (copy)", @@ -63052,7 +63286,7 @@ "role_address#0 (copy)" ] }, - "6750": { + "6802": { "op": "concat", "defined_out": [ "box_prefixed_key%0#1" @@ -63062,7 +63296,7 @@ "box_prefixed_key%0#1" ] }, - "6751": { + "6803": { "op": "dup", "defined_out": [ "box_prefixed_key%0#1" @@ -63073,7 +63307,7 @@ "box_prefixed_key%0#1" ] }, - "6752": { + "6804": { "op": "box_len", "defined_out": [ "_%0#0", @@ -63087,7 +63321,7 @@ "maybe_exists%0#0" ] }, - "6753": { + "6805": { "op": "bury 1", "stack_out": [ "awst_tmp%0#0", @@ -63095,14 +63329,14 @@ "maybe_exists%0#0" ] }, - "6755": { + "6807": { "op": "bz _role_is_active_bool_false@4", "stack_out": [ "awst_tmp%0#0", "box_prefixed_key%0#1" ] }, - "6758": { + "6810": { "op": "frame_dig 1", "stack_out": [ "awst_tmp%0#0", @@ -63110,7 +63344,7 @@ "box_prefixed_key%0#1" ] }, - "6760": { + "6812": { "op": "box_get", "defined_out": [ "aggregate%box_get%0#0", @@ -63124,7 +63358,7 @@ "aggregate%box_get%1#0" ] }, - "6761": { + "6813": { "error": "check BoxMap entry exists", "op": "assert // check BoxMap entry exists", "stack_out": [ @@ -63133,7 +63367,7 @@ "aggregate%box_get%0#0" ] }, - "6762": { + "6814": { "op": "intc_0 // 0", "stack_out": [ "awst_tmp%0#0", @@ -63142,7 +63376,7 @@ "0" ] }, - "6763": { + "6815": { "op": "extract_uint64", "defined_out": [ "box_prefixed_key%0#1", @@ -63154,10 +63388,10 @@ "values%0#0" ] }, - "6764": { + "6816": { "op": "global LatestTimestamp" }, - "6766": { + "6818": { "op": "dup", "defined_out": [ "awst_tmp%0#0", @@ -63172,7 +63406,7 @@ "awst_tmp%0#0" ] }, - "6767": { + "6819": { "op": "frame_bury 0", "defined_out": [ "awst_tmp%0#0", @@ -63186,7 +63420,7 @@ "awst_tmp%0#0" ] }, - "6769": { + "6821": { "op": "<=", "defined_out": [ "awst_tmp%0#0", @@ -63199,14 +63433,14 @@ "tmp%1#0" ] }, - "6770": { + "6822": { "op": "bz _role_is_active_bool_false@4", "stack_out": [ "awst_tmp%0#0", "box_prefixed_key%0#1" ] }, - "6773": { + "6825": { "op": "frame_dig 1", "stack_out": [ "awst_tmp%0#0", @@ -63214,7 +63448,7 @@ "box_prefixed_key%0#1" ] }, - "6775": { + "6827": { "op": "box_get", "defined_out": [ "aggregate%box_get%2#0", @@ -63229,7 +63463,7 @@ "aggregate%box_get%3#0" ] }, - "6776": { + "6828": { "error": "check BoxMap entry exists", "op": "assert // check BoxMap entry exists", "stack_out": [ @@ -63238,7 +63472,7 @@ "aggregate%box_get%2#0" ] }, - "6777": { + "6829": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -63253,7 +63487,7 @@ "8" ] }, - "6778": { + "6830": { "op": "extract_uint64", "defined_out": [ "awst_tmp%0#0", @@ -63266,7 +63500,7 @@ "values%1#0" ] }, - "6779": { + "6831": { "op": "frame_dig 0", "stack_out": [ "awst_tmp%0#0", @@ -63275,7 +63509,7 @@ "awst_tmp%0#0" ] }, - "6781": { + "6833": { "op": ">=", "defined_out": [ "awst_tmp%0#0", @@ -63288,14 +63522,14 @@ "tmp%2#0" ] }, - "6782": { + "6834": { "op": "bz _role_is_active_bool_false@4", "stack_out": [ "awst_tmp%0#0", "box_prefixed_key%0#1" ] }, - "6785": { + "6837": { "op": "intc_1 // 1", "defined_out": [ "and_result%0#0", @@ -63308,7 +63542,7 @@ "and_result%0#0" ] }, - "6786": { + "6838": { "block": "_role_is_active_bool_merge@5", "stack_in": [ "awst_tmp%0#0", @@ -63320,11 +63554,11 @@ "and_result%0#0" ] }, - "6788": { + "6840": { "retsub": true, "op": "retsub" }, - "6789": { + "6841": { "block": "_role_is_active_bool_false@4", "stack_in": [ "awst_tmp%0#0", @@ -63340,10 +63574,10 @@ "and_result%0#0" ] }, - "6790": { + "6842": { "op": "b _role_is_active_bool_merge@5" }, - "6793": { + "6845": { "subroutine": "modules.rbac.RbacModule._assert_caller_is_arranger", "params": {}, "block": "_assert_caller_is_arranger", @@ -63356,7 +63590,7 @@ "role_address#0" ] }, - "6795": { + "6847": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -63367,7 +63601,7 @@ "0" ] }, - "6796": { + "6848": { "op": "bytec 18 // 0x523a41525223", "defined_out": [ "0", @@ -63380,7 +63614,7 @@ "0x523a41525223" ] }, - "6798": { + "6850": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -63393,7 +63627,7 @@ "maybe_exists%0#0" ] }, - "6799": { + "6851": { "error": "check self.arranger exists", "op": "assert // check self.arranger exists", "stack_out": [ @@ -63401,7 +63635,7 @@ "maybe_value%0#0" ] }, - "6800": { + "6852": { "op": "==", "defined_out": [ "tmp%0#1" @@ -63410,16 +63644,16 @@ "tmp%0#1" ] }, - "6801": { + "6853": { "error": "Not authorized", "op": "assert // Not authorized", "stack_out": [] }, - "6802": { + "6854": { "retsub": true, "op": "retsub" }, - "6803": { + "6855": { "subroutine": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", "params": {}, "block": "_assert_is_not_asset_defaulted", @@ -63432,7 +63666,7 @@ "0" ] }, - "6804": { + "6856": { "op": "bytec 41 // \"asset_defaulted\"", "defined_out": [ "\"asset_defaulted\"", @@ -63443,7 +63677,7 @@ "\"asset_defaulted\"" ] }, - "6806": { + "6858": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -63454,14 +63688,14 @@ "maybe_exists%0#0" ] }, - "6807": { + "6859": { "error": "check self.asset_defaulted exists", "op": "assert // check self.asset_defaulted exists", "stack_out": [ "maybe_value%0#0" ] }, - "6808": { + "6860": { "op": "!", "defined_out": [ "tmp%0#0" @@ -63470,16 +63704,16 @@ "tmp%0#0" ] }, - "6809": { + "6861": { "error": "Defaulted", "op": "assert // Defaulted", "stack_out": [] }, - "6810": { + "6862": { "retsub": true, "op": "retsub" }, - "6811": { + "6863": { "subroutine": "modules.rbac.RbacModule._assert_is_not_asset_suspended", "params": {}, "block": "_assert_is_not_asset_suspended", @@ -63492,7 +63726,7 @@ "0" ] }, - "6812": { + "6864": { "op": "bytec 33 // \"asset_suspended\"", "defined_out": [ "\"asset_suspended\"", @@ -63503,7 +63737,7 @@ "\"asset_suspended\"" ] }, - "6814": { + "6866": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -63514,14 +63748,14 @@ "maybe_exists%0#0" ] }, - "6815": { + "6867": { "error": "check self.asset_suspended exists", "op": "assert // check self.asset_suspended exists", "stack_out": [ "maybe_value%0#0" ] }, - "6816": { + "6868": { "op": "!", "defined_out": [ "tmp%0#0" @@ -63530,16 +63764,16 @@ "tmp%0#0" ] }, - "6817": { + "6869": { "error": "Suspended operations", "op": "assert // Suspended operations", "stack_out": [] }, - "6818": { + "6870": { "retsub": true, "op": "retsub" }, - "6819": { + "6871": { "subroutine": "modules.rbac.RbacModule._assert_valid_role", "params": { "role_id#0": "uint64" @@ -63548,7 +63782,7 @@ "stack_in": [], "op": "proto 1 0" }, - "6822": { + "6874": { "op": "frame_dig -1", "defined_out": [ "role_id#0 (copy)" @@ -63557,7 +63791,7 @@ "role_id#0 (copy)" ] }, - "6824": { + "6876": { "op": "pushint 20", "defined_out": [ "20", @@ -63568,7 +63802,7 @@ "20" ] }, - "6826": { + "6878": { "op": "==", "defined_out": [ "tmp%0#0" @@ -63577,17 +63811,17 @@ "tmp%0#0" ] }, - "6827": { + "6879": { "op": "bnz _assert_valid_role_bool_true@7", "stack_out": [] }, - "6830": { + "6882": { "op": "frame_dig -1", "stack_out": [ "role_id#0 (copy)" ] }, - "6832": { + "6884": { "op": "pushint 25", "defined_out": [ "25", @@ -63598,7 +63832,7 @@ "25" ] }, - "6834": { + "6886": { "op": "==", "defined_out": [ "tmp%1#0" @@ -63607,17 +63841,17 @@ "tmp%1#0" ] }, - "6835": { + "6887": { "op": "bnz _assert_valid_role_bool_true@7", "stack_out": [] }, - "6838": { + "6890": { "op": "frame_dig -1", "stack_out": [ "role_id#0 (copy)" ] }, - "6840": { + "6892": { "op": "pushint 40", "defined_out": [ "40", @@ -63628,7 +63862,7 @@ "40" ] }, - "6842": { + "6894": { "op": "==", "defined_out": [ "tmp%2#0" @@ -63637,17 +63871,17 @@ "tmp%2#0" ] }, - "6843": { + "6895": { "op": "bnz _assert_valid_role_bool_true@7", "stack_out": [] }, - "6846": { + "6898": { "op": "frame_dig -1", "stack_out": [ "role_id#0 (copy)" ] }, - "6848": { + "6900": { "op": "pushint 50", "defined_out": [ "50", @@ -63658,7 +63892,7 @@ "50" ] }, - "6850": { + "6902": { "op": "==", "defined_out": [ "tmp%3#0" @@ -63667,17 +63901,17 @@ "tmp%3#0" ] }, - "6851": { + "6903": { "op": "bnz _assert_valid_role_bool_true@7", "stack_out": [] }, - "6854": { + "6906": { "op": "frame_dig -1", "stack_out": [ "role_id#0 (copy)" ] }, - "6856": { + "6908": { "op": "pushint 60", "defined_out": [ "60", @@ -63688,7 +63922,7 @@ "60" ] }, - "6858": { + "6910": { "op": "==", "defined_out": [ "tmp%4#0" @@ -63697,17 +63931,17 @@ "tmp%4#0" ] }, - "6859": { + "6911": { "op": "bnz _assert_valid_role_bool_true@7", "stack_out": [] }, - "6862": { + "6914": { "op": "frame_dig -1", "stack_out": [ "role_id#0 (copy)" ] }, - "6864": { + "6916": { "op": "pushint 70", "defined_out": [ "70", @@ -63718,7 +63952,7 @@ "70" ] }, - "6866": { + "6918": { "op": "==", "defined_out": [ "tmp%5#0" @@ -63727,17 +63961,17 @@ "tmp%5#0" ] }, - "6867": { + "6919": { "op": "bnz _assert_valid_role_bool_true@7", "stack_out": [] }, - "6870": { + "6922": { "op": "frame_dig -1", "stack_out": [ "role_id#0 (copy)" ] }, - "6872": { + "6924": { "op": "pushint 80", "defined_out": [ "80", @@ -63748,7 +63982,7 @@ "80" ] }, - "6874": { + "6926": { "op": "==", "defined_out": [ "tmp%6#0" @@ -63757,11 +63991,11 @@ "tmp%6#0" ] }, - "6875": { + "6927": { "op": "bz _assert_valid_role_bool_false@8", "stack_out": [] }, - "6878": { + "6930": { "block": "_assert_valid_role_bool_true@7", "stack_in": [], "op": "intc_1 // 1", @@ -63772,7 +64006,7 @@ "or_result%0#0" ] }, - "6879": { + "6931": { "error": "Invalid role identifier", "block": "_assert_valid_role_bool_merge@9", "stack_in": [ @@ -63782,11 +64016,11 @@ "defined_out": [], "stack_out": [] }, - "6880": { + "6932": { "retsub": true, "op": "retsub" }, - "6881": { + "6933": { "block": "_assert_valid_role_bool_false@8", "stack_in": [], "op": "intc_0 // 0", @@ -63797,7 +64031,7 @@ "or_result%0#0" ] }, - "6882": { + "6934": { "op": "b _assert_valid_role_bool_merge@9" } } diff --git a/smart_contracts/artifacts/d_asa/DASA.approval.teal b/smart_contracts/artifacts/d_asa/DASA.approval.teal index d5e016a1..362b1d6f 100644 --- a/smart_contracts/artifacts/d_asa/DASA.approval.teal +++ b/smart_contracts/artifacts/d_asa/DASA.approval.teal @@ -4,7 +4,7 @@ // algopy.arc4.ARC4Contract.approval_program() -> uint64: main: intcblock 0 1 8 32 1500 - bytecblock 0x151f7c75 "status" "event_cursor" "schedule_entry_count" "outstanding_principal" "fixed_point_scale" "accrued_interest" "interest_calculation_base" 0x4123 "nominal_interest_rate" "contract_type" "reserved_units_total" "reserved_principal" "total_units" "next_principal_redemption" "reserved_interest" "cumulative_interest_index" "cumulative_principal_index" 0x523a41525223 "settlement_asset_id" "initial_exchange_amount" 0x523a41555423 0x523a50594423 0x523a4d4e4723 0x5323 0x523a4d4f4323 0x523a4f504423 "initial_exchange_date" "transfer_opening_date" "transfer_closure_date" "rate_reset_floor" "rate_reset_cap" 0x523a54525323 "asset_suspended" "dynamic_principal_redemption" "rate_reset_spread" "rate_reset_multiplier" "rate_reset_next" "has_rate_reset_floor" "has_rate_reset_cap" 0x00 "asset_defaulted" "prospectus_hash" "prospectus_url" "denomination_asset_id" "maturity_date" "day_count_convention" 0x068101 0x0000 + bytecblock 0x151f7c75 "status" "event_cursor" "schedule_entry_count" "outstanding_principal" "fixed_point_scale" "accrued_interest" "interest_calculation_base" 0x4123 "nominal_interest_rate" "contract_type" "reserved_units_total" "reserved_principal" "total_units" "next_principal_redemption" "reserved_interest" "cumulative_interest_index" "cumulative_principal_index" 0x523a41525223 "settlement_asset_id" "initial_exchange_amount" 0x523a41555423 0x523a50594423 0x523a4d4e4723 0x5323 0x523a4d4f4323 0x523a54525323 0x523a4f504423 "initial_exchange_date" "transfer_opening_date" "transfer_closure_date" "rate_reset_floor" "rate_reset_cap" "asset_suspended" "dynamic_principal_redemption" "rate_reset_spread" "rate_reset_multiplier" "rate_reset_next" "has_rate_reset_floor" "has_rate_reset_cap" 0x00 "asset_defaulted" "prospectus_hash" "prospectus_url" "denomination_asset_id" "maturity_date" "day_count_convention" "defaulted" 0x068101 0x0000 txn ApplicationID bnz main_after_if_else@2 // modules/rbac.py:28-29 @@ -15,7 +15,7 @@ main: app_global_put // modules/rbac.py:30 // self.op_daemon = GlobalState(Account(), key=cst.PREFIX_ID_OP_DAEMON) - bytec 26 // 0x523a4f504423 + bytec 27 // 0x523a4f504423 global ZeroAddress app_global_put // modules/rbac.py:47-48 @@ -65,7 +65,7 @@ main: // modules/actus_kernel.py:68-69 // # Time // self.initial_exchange_date = typ.TimeStamp() - bytec 27 // "initial_exchange_date" + bytec 28 // "initial_exchange_date" intc_0 // 0 app_global_put // modules/actus_kernel.py:70 @@ -75,12 +75,12 @@ main: app_global_put // modules/actus_kernel.py:71 // self.transfer_opening_date = typ.TimeStamp() - bytec 28 // "transfer_opening_date" + bytec 29 // "transfer_opening_date" intc_0 // 0 app_global_put // modules/actus_kernel.py:72 // self.transfer_closure_date = typ.TimeStamp() - bytec 29 // "transfer_closure_date" + bytec 30 // "transfer_closure_date" intc_0 // 0 app_global_put // modules/actus_kernel.py:74-75 @@ -150,12 +150,12 @@ main: app_global_put // modules/actus_kernel.py:95 // self.rate_reset_floor = UInt64() - bytec 30 // "rate_reset_floor" + bytec 31 // "rate_reset_floor" intc_0 // 0 app_global_put // modules/actus_kernel.py:96 // self.rate_reset_cap = UInt64() - bytec 31 // "rate_reset_cap" + bytec 32 // "rate_reset_cap" intc_0 // 0 app_global_put // modules/actus_kernel.py:97 @@ -206,6 +206,12 @@ main: intc_0 // 0 app_global_put // modules/actus_kernel.py:118-119 + // # Performance + // self.defaulted = False + bytec 47 // "defaulted" + intc_0 // 0 + app_global_put + // modules/actus_kernel.py:121-122 // # Scaling // self.fixed_point_scale = UInt64() bytec 5 // "fixed_point_scale" @@ -220,7 +226,7 @@ main: // smart_contracts/d_asa/contract.py:24 // assert Txn.global_num_uint == cfg.GLOBAL_UINTS, err.WRONG_GLOBAL_UINTS txn GlobalNumUint - pushint 37 + pushint 38 == assert // Wrong Global UInts allocation // smart_contracts/d_asa/contract.py:25 @@ -268,13 +274,13 @@ main_switch_case_next@5: ! assert txn ApplicationID - bz main_create_NoOp@32 - pushbytess 0xb44618c8 0xe7832529 0x94388723 0x6c85e3ee 0xbdd1a944 0x7c0f1812 0x14fc10ef 0x74a7297f 0x09d4fe14 0x9a9bfa85 0x85eed33d 0xab2c0fc4 0xd9f225ac 0x9883505a 0x8ea6e74c 0x02af557a 0x82f71b2d 0xef04f5d3 0xdf343550 0x3dbe80bd 0x1e3e48e7 0x010c8299 0x7406acd2 0x1a72a2ee // method "fund_due_cashflows(uint64)(uint64,uint64,uint64,uint64,uint64)", method "claim_due_cashflows(address,byte[])(uint64,uint64,uint64,uint64,byte[])", method "transfer_set_schedule(uint64,uint64)uint64", method "primary_distribution(address,uint64)uint64", method "transfer(address,address,uint64)uint64", method "account_suspension(address,bool)uint64", method "account_open(address,address)uint64", method "account_update_payment_address(address,address)uint64", method "account_get_position(address)(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64)", method "contract_config((uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64),(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64),(byte[32],string))uint64", method "contract_schedule(uint64,bool,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[])uint64", method "contract_execute_ied()uint64", method "apply_non_cash_event(uint64,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64", method "append_observed_cash_event((uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64", method "contract_get_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", method "contract_get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", method "rbac_rotate_arranger(address)uint64", method "rbac_set_op_daemon(address)uint64", method "rbac_assign_role(uint8,address,(uint64,uint64))uint64", method "rbac_revoke_role(uint8,address)uint64", method "rbac_contract_suspension(bool)uint64", method "rbac_get_arranger()address", method "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", method "rbac_get_role_validity(uint8,address)(uint64,uint64)" + bz main_create_NoOp@33 + pushbytess 0xb44618c8 0xe7832529 0x94388723 0x6c85e3ee 0xbdd1a944 0x7c0f1812 0x14fc10ef 0x74a7297f 0x09d4fe14 0x9a9bfa85 0x85eed33d 0xab2c0fc4 0xd9f225ac 0x9883505a 0xfb4d4428 0x8ea6e74c 0x02af557a 0x82f71b2d 0xef04f5d3 0xdf343550 0x3dbe80bd 0x1e3e48e7 0x010c8299 0x7406acd2 0x1a72a2ee // method "fund_due_cashflows(uint64)(uint64,uint64,uint64,uint64,uint64)", method "claim_due_cashflows(address,byte[])(uint64,uint64,uint64,uint64,byte[])", method "transfer_set_schedule(uint64,uint64)uint64", method "primary_distribution(address,uint64)uint64", method "transfer(address,address,uint64)uint64", method "account_suspension(address,bool)uint64", method "account_open(address,address)uint64", method "account_update_payment_address(address,address)uint64", method "account_get_position(address)(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64)", method "contract_config((uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64),(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64),(byte[32],string))uint64", method "contract_schedule(uint64,bool,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[])uint64", method "contract_execute_ied()uint64", method "apply_non_cash_event(uint64,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64", method "append_observed_cash_event((uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64", method "contract_set_default_status(bool)uint64", method "contract_get_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", method "contract_get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", method "rbac_rotate_arranger(address)uint64", method "rbac_set_op_daemon(address)uint64", method "rbac_assign_role(uint8,address,(uint64,uint64))uint64", method "rbac_revoke_role(uint8,address)uint64", method "rbac_contract_suspension(bool)uint64", method "rbac_get_arranger()address", method "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", method "rbac_get_role_validity(uint8,address)(uint64,uint64)" txna ApplicationArgs 0 - match fund_due_cashflows claim_due_cashflows transfer_set_schedule primary_distribution transfer account_suspension account_open account_update_payment_address account_get_position contract_config contract_schedule contract_execute_ied apply_non_cash_event append_observed_cash_event contract_get_state contract_get_next_due_event rbac_rotate_arranger rbac_set_op_daemon rbac_assign_role rbac_revoke_role rbac_contract_suspension rbac_get_arranger rbac_get_address_roles rbac_get_role_validity + match fund_due_cashflows claim_due_cashflows transfer_set_schedule primary_distribution transfer account_suspension account_open account_update_payment_address account_get_position contract_config contract_schedule contract_execute_ied apply_non_cash_event append_observed_cash_event contract_set_default_status contract_get_state contract_get_next_due_event rbac_rotate_arranger rbac_set_op_daemon rbac_assign_role rbac_revoke_role rbac_contract_suspension rbac_get_arranger rbac_get_address_roles rbac_get_role_validity err -main_create_NoOp@32: +main_create_NoOp@33: // smart_contracts/d_asa/contract.py:8-18 // class DASA( // PaymentAgent, @@ -321,9 +327,9 @@ ensure_budget_while_top@1: itxn_field TypeEnum pushint 5 // DeleteApplication itxn_field OnCompletion - bytec 47 // 0x068101 + bytec 48 // 0x068101 itxn_field ApprovalProgram - bytec 47 // 0x068101 + bytec 48 // 0x068101 itxn_field ClearStateProgram frame_dig -1 switch ensure_budget_switch_case_0@3 ensure_budget_switch_case_1@4 @@ -360,7 +366,7 @@ fund_due_cashflows: == assert // invalid number of bytes for arc4.uint64 btoi - // modules/actus_kernel.py:143 + // modules/actus_kernel.py:146 // assert self.status != UInt64(enums.STATUS_INACTIVE), err.NOT_CONFIGURED intc_0 // 0 bytec_1 // "status" @@ -376,7 +382,7 @@ fund_due_cashflows: // modules/payment_agent.py:70 // self._assert_is_not_asset_suspended() callsub _assert_is_not_asset_suspended - // modules/actus_kernel.py:135 + // modules/actus_kernel.py:138 // return self.status == UInt64(enums.STATUS_PENDING_IED) intc_0 // 0 bytec_1 // "status" @@ -384,7 +390,7 @@ fund_due_cashflows: assert // check self.status exists pushint 50 == - // modules/actus_kernel.py:147 + // modules/actus_kernel.py:150 // assert not self._status_is_pending_ied(), err.PENDING_IED ! assert // IED not yet executed @@ -486,10 +492,10 @@ fund_due_cashflows_while_top@4: getbyte dup bury 16 - // modules/actus_kernel.py:351 + // modules/actus_kernel.py:354 // UInt64(enums.EVT_IP), intc_2 // 8 - // modules/actus_kernel.py:350-354 + // modules/actus_kernel.py:353-357 // return event_type in ( // UInt64(enums.EVT_IP), // UInt64(enums.EVT_PR), @@ -500,10 +506,10 @@ fund_due_cashflows_while_top@4: bury 4 bnz fund_due_cashflows_bool_true@52 dig 14 - // modules/actus_kernel.py:352 + // modules/actus_kernel.py:355 // UInt64(enums.EVT_PR), pushint 3 - // modules/actus_kernel.py:350-354 + // modules/actus_kernel.py:353-357 // return event_type in ( // UInt64(enums.EVT_IP), // UInt64(enums.EVT_PR), @@ -512,10 +518,10 @@ fund_due_cashflows_while_top@4: == bnz fund_due_cashflows_bool_true@52 dig 14 - // modules/actus_kernel.py:353 + // modules/actus_kernel.py:356 // UInt64(enums.EVT_MD), pushint 19 - // modules/actus_kernel.py:350-354 + // modules/actus_kernel.py:353-357 // return event_type in ( // UInt64(enums.EVT_IP), // UInt64(enums.EVT_PR), @@ -531,7 +537,7 @@ fund_due_cashflows_bool_merge@54: // modules/payment_agent.py:92 // if not self._event_is_cash(entry.event_type.as_uint64()): bz fund_due_cashflows_after_while@11 - // modules/actus_kernel.py:548 + // modules/actus_kernel.py:551 // assert entry.event_id == self.event_cursor, err.INVALID_EVENT_CURSOR dig 15 intc_0 // 0 @@ -542,13 +548,13 @@ fund_due_cashflows_bool_merge@54: assert // check self.event_cursor exists == assert // Invalid event cursor - // modules/actus_kernel.py:549 + // modules/actus_kernel.py:552 // assert entry.scheduled_time <= Global.latest_timestamp, err.NO_DUE_CASHFLOW dig 1 global LatestTimestamp <= assert // No due cashflow to pay - // modules/actus_kernel.py:413 + // modules/actus_kernel.py:416 // if event_type not in (UInt64(enums.EVT_IP), UInt64(enums.EVT_MD)): dig 2 bnz fund_due_cashflows_after_if_else@15 @@ -556,20 +562,20 @@ fund_due_cashflows_bool_merge@54: pushint 19 == bnz fund_due_cashflows_after_if_else@15 - // modules/actus_kernel.py:414 + // modules/actus_kernel.py:417 // return UInt64(0) intc_0 // 0 bury 11 fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_interest_amount@16: - // modules/actus_kernel.py:426 + // modules/actus_kernel.py:429 // event_type = entry.event_type.as_uint64() dig 15 intc_2 // 8 getbyte dup bury 16 - // modules/actus_kernel.py:427 + // modules/actus_kernel.py:430 // if event_type not in (UInt64(enums.EVT_PR), UInt64(enums.EVT_MD)): pushint 3 == @@ -578,19 +584,19 @@ fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_i pushint 19 == bnz fund_due_cashflows_after_if_else@19 - // modules/actus_kernel.py:428 + // modules/actus_kernel.py:431 // return UInt64(0) intc_0 // 0 bury 6 fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@28: - // modules/actus_kernel.py:553 + // modules/actus_kernel.py:556 // next_outstanding_principal = entry.next_outstanding_principal dig 15 pushint 49 extract_uint64 bury 8 - // modules/actus_kernel.py:556 + // modules/actus_kernel.py:559 // if self._is_dynamic_annuity(): callsub _is_dynamic_annuity bnz fund_due_cashflows_if_body@29 @@ -598,37 +604,37 @@ fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_p bury 9 fund_due_cashflows_after_if_else@38: - // modules/actus_kernel.py:572-574 + // modules/actus_kernel.py:575-577 // # Funding uses per-unit cumulative indices so each holder can settle // # independently from its current unit balance. // interest_index_delta = self._amount_to_index_delta(interest_amount_due) dig 10 callsub _amount_to_index_delta - // modules/actus_kernel.py:575 + // modules/actus_kernel.py:578 // principal_index_delta = self._amount_to_index_delta(principal_amount_due) dig 6 callsub _amount_to_index_delta - // modules/actus_kernel.py:576 + // modules/actus_kernel.py:579 // interest_amount = self._index_delta_to_amount(interest_index_delta) dig 1 callsub _index_delta_to_amount dup cover 2 bury 15 - // modules/actus_kernel.py:577 + // modules/actus_kernel.py:580 // principal_amount = self._index_delta_to_amount(principal_index_delta) dup callsub _index_delta_to_amount dup bury 11 - // modules/actus_kernel.py:578 + // modules/actus_kernel.py:581 // required_amount = interest_amount + principal_amount dig 2 dig 1 + dup bury 9 - // modules/actus_kernel.py:734 + // modules/actus_kernel.py:737 // balance = self.settlement_asset_id.balance(Global.current_application_address) global CurrentApplicationAddress intc_0 // 0 @@ -637,7 +643,7 @@ fund_due_cashflows_after_if_else@38: assert // check self.settlement_asset_id exists asset_holding_get AssetBalance assert // account opted into asset - // modules/actus_kernel.py:456 + // modules/actus_kernel.py:459 // return self.reserved_interest + self.reserved_principal intc_0 // 0 bytec 15 // "reserved_interest" @@ -649,34 +655,34 @@ fund_due_cashflows_after_if_else@38: assert // check self.reserved_principal exists dig 1 + - // modules/actus_kernel.py:736 + // modules/actus_kernel.py:739 // assert balance >= reserved_total, err.NOT_ENOUGH_FUNDS dig 2 dig 1 >= assert // Not enough funds for the payment - // modules/actus_kernel.py:737 + // modules/actus_kernel.py:740 // return balance - reserved_total uncover 2 swap - - // modules/actus_kernel.py:580 + // modules/actus_kernel.py:583 // self._available_settlement_funds() >= required_amount uncover 2 >= - // modules/actus_kernel.py:579-581 + // modules/actus_kernel.py:582-584 // assert ( // self._available_settlement_funds() >= required_amount // ), err.NOT_ENOUGH_FUNDS assert // Not enough funds for the payment - // modules/actus_kernel.py:583 + // modules/actus_kernel.py:586 // self.reserved_interest += interest_amount uncover 3 + bytec 15 // "reserved_interest" swap app_global_put - // modules/actus_kernel.py:584 + // modules/actus_kernel.py:587 // self.reserved_principal += principal_amount intc_0 // 0 bytec 12 // "reserved_principal" @@ -686,7 +692,7 @@ fund_due_cashflows_after_if_else@38: bytec 12 // "reserved_principal" swap app_global_put - // modules/actus_kernel.py:585 + // modules/actus_kernel.py:588 // self.cumulative_interest_index += interest_index_delta intc_0 // 0 bytec 16 // "cumulative_interest_index" @@ -697,7 +703,7 @@ fund_due_cashflows_after_if_else@38: bytec 16 // "cumulative_interest_index" swap app_global_put - // modules/actus_kernel.py:586 + // modules/actus_kernel.py:589 // self.cumulative_principal_index += principal_index_delta intc_0 // 0 bytec 17 // "cumulative_principal_index" @@ -707,7 +713,7 @@ fund_due_cashflows_after_if_else@38: bytec 17 // "cumulative_principal_index" swap app_global_put - // modules/actus_kernel.py:587 + // modules/actus_kernel.py:590 // if entry.event_type.as_uint64() == UInt64(enums.EVT_PR): dig 15 intc_2 // 8 @@ -715,7 +721,7 @@ fund_due_cashflows_after_if_else@38: pushint 3 == bz fund_due_cashflows_else_body@40 - // modules/actus_kernel.py:588-589 + // modules/actus_kernel.py:591-592 // # For PR, the period interest stays accrued until a later IP or MD. // self.accrued_interest += self._entry_interest_segment(entry) intc_0 // 0 @@ -731,14 +737,14 @@ fund_due_cashflows_after_if_else@38: app_global_put fund_due_cashflows_after_if_else@41: - // modules/actus_kernel.py:592 + // modules/actus_kernel.py:595 // if not self._is_dynamic_annuity() or entry.event_type.as_uint64() == UInt64( callsub _is_dynamic_annuity bz fund_due_cashflows_if_body@43 dig 15 intc_2 // 8 getbyte - // modules/actus_kernel.py:592-594 + // modules/actus_kernel.py:595-597 // if not self._is_dynamic_annuity() or entry.event_type.as_uint64() == UInt64( // enums.EVT_MD // ): @@ -747,7 +753,7 @@ fund_due_cashflows_after_if_else@41: bz fund_due_cashflows_after_if_else@44 fund_due_cashflows_if_body@43: - // modules/actus_kernel.py:595 + // modules/actus_kernel.py:598 // self.next_principal_redemption = entry.next_principal_redemption dig 15 pushint 41 @@ -757,17 +763,17 @@ fund_due_cashflows_if_body@43: app_global_put fund_due_cashflows_after_if_else@44: - // modules/actus_kernel.py:596 + // modules/actus_kernel.py:599 // self.outstanding_principal = next_outstanding_principal bytec 4 // "outstanding_principal" dig 8 app_global_put - // modules/actus_kernel.py:597 + // modules/actus_kernel.py:600 // self.interest_calculation_base = next_interest_base bytec 7 // "interest_calculation_base" dig 9 app_global_put - // modules/actus_kernel.py:598 + // modules/actus_kernel.py:601 // self.event_cursor += UInt64(1) intc_0 // 0 bytec_2 // "event_cursor" @@ -778,41 +784,41 @@ fund_due_cashflows_after_if_else@44: bytec_2 // "event_cursor" swap app_global_put - // modules/actus_kernel.py:600 + // modules/actus_kernel.py:603 // if entry.event_type == arc4.UInt8( dig 15 extract 8 1 - // modules/actus_kernel.py:600-602 + // modules/actus_kernel.py:603-605 // if entry.event_type == arc4.UInt8( // enums.EVT_MD // ) and self.outstanding_principal == UInt64(0): pushbytes 0x13 b== bz fund_due_cashflows_after_if_else@47 - // modules/actus_kernel.py:602 + // modules/actus_kernel.py:605 // ) and self.outstanding_principal == UInt64(0): intc_0 // 0 bytec 4 // "outstanding_principal" app_global_get_ex assert // check self.outstanding_principal exists - // modules/actus_kernel.py:600-602 + // modules/actus_kernel.py:603-605 // if entry.event_type == arc4.UInt8( // enums.EVT_MD // ) and self.outstanding_principal == UInt64(0): bnz fund_due_cashflows_after_if_else@47 - // modules/actus_kernel.py:603 + // modules/actus_kernel.py:606 // self.status = UInt64(enums.STATUS_ENDED) bytec_1 // "status" pushint 200 app_global_put - // modules/actus_kernel.py:604 + // modules/actus_kernel.py:607 // self.interest_calculation_base = UInt64(0) bytec 7 // "interest_calculation_base" intc_0 // 0 app_global_put fund_due_cashflows_after_if_else@47: - // modules/actus_kernel.py:606-610 + // modules/actus_kernel.py:609-613 // self._emit_execution_event( // entry=entry, // payoff=interest_amount + principal_amount, @@ -844,7 +850,7 @@ fund_due_cashflows_after_if_else@47: b fund_due_cashflows_while_top@4 fund_due_cashflows_else_body@40: - // modules/actus_kernel.py:591 + // modules/actus_kernel.py:594 // self.accrued_interest = UInt64(0) bytec 6 // "accrued_interest" intc_0 // 0 @@ -852,21 +858,21 @@ fund_due_cashflows_else_body@40: b fund_due_cashflows_after_if_else@41 fund_due_cashflows_if_body@29: - // modules/actus_kernel.py:557 + // modules/actus_kernel.py:560 // event_type = entry.event_type.as_uint64() dig 15 intc_2 // 8 getbyte dup bury 16 - // modules/actus_kernel.py:558-560 + // modules/actus_kernel.py:561-563 // # Dynamic annuities derive next state from the payment decomposition, // # not only from the precomputed `next_*` fields. // if event_type == UInt64(enums.EVT_PR): pushint 3 == bz fund_due_cashflows_else_body@31 - // modules/actus_kernel.py:562 + // modules/actus_kernel.py:565 // self.outstanding_principal - principal_amount_due intc_0 // 0 bytec 4 // "outstanding_principal" @@ -880,13 +886,13 @@ fund_due_cashflows_if_body@29: b fund_due_cashflows_after_if_else@38 fund_due_cashflows_else_body@31: - // modules/actus_kernel.py:565 + // modules/actus_kernel.py:568 // elif event_type == UInt64(enums.EVT_IP): dig 14 intc_2 // 8 == bz fund_due_cashflows_else_body@33 - // modules/actus_kernel.py:566 + // modules/actus_kernel.py:569 // next_outstanding_principal = self.outstanding_principal intc_0 // 0 bytec 4 // "outstanding_principal" @@ -894,7 +900,7 @@ fund_due_cashflows_else_body@31: swap bury 9 assert // check self.outstanding_principal exists - // modules/actus_kernel.py:567 + // modules/actus_kernel.py:570 // next_interest_base = self.interest_calculation_base intc_0 // 0 bytec 7 // "interest_calculation_base" @@ -905,7 +911,7 @@ fund_due_cashflows_else_body@31: b fund_due_cashflows_after_if_else@38 fund_due_cashflows_else_body@33: - // modules/actus_kernel.py:568 + // modules/actus_kernel.py:571 // elif event_type == UInt64(enums.EVT_MD): dig 14 pushint 19 @@ -916,40 +922,40 @@ fund_due_cashflows_else_body@33: b fund_due_cashflows_after_if_else@38 fund_due_cashflows_if_body@34: - // modules/actus_kernel.py:569 + // modules/actus_kernel.py:572 // next_outstanding_principal = UInt64(0) intc_0 // 0 bury 8 - // modules/actus_kernel.py:570 + // modules/actus_kernel.py:573 // next_interest_base = UInt64(0) intc_0 // 0 bury 9 b fund_due_cashflows_after_if_else@38 fund_due_cashflows_after_if_else@19: - // modules/actus_kernel.py:429 + // modules/actus_kernel.py:432 // if self._is_dynamic_annuity(): callsub _is_dynamic_annuity bz fund_due_cashflows_after_if_else@27 - // modules/actus_kernel.py:430 + // modules/actus_kernel.py:433 // if event_type == UInt64(enums.EVT_MD): dig 14 pushint 19 == bz fund_due_cashflows_after_if_else@22 - // modules/actus_kernel.py:431 + // modules/actus_kernel.py:434 // return self.outstanding_principal intc_0 // 0 bytec 4 // "outstanding_principal" app_global_get_ex assert // check self.outstanding_principal exists bury 6 - // modules/actus_kernel.py:552 + // modules/actus_kernel.py:555 // principal_amount_due = self._entry_principal_amount(entry) b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@28 fund_due_cashflows_after_if_else@22: - // modules/actus_kernel.py:432 + // modules/actus_kernel.py:435 // interest_due = self.accrued_interest + self._entry_interest_segment(entry) intc_0 // 0 bytec 6 // "accrued_interest" @@ -961,7 +967,7 @@ fund_due_cashflows_after_if_else@22: + dup bury 11 - // modules/actus_kernel.py:433 + // modules/actus_kernel.py:436 // if self.next_principal_redemption <= interest_due: intc_0 // 0 bytec 14 // "next_principal_redemption" @@ -969,16 +975,16 @@ fund_due_cashflows_after_if_else@22: assert // check self.next_principal_redemption exists >= bz fund_due_cashflows_after_if_else@24 - // modules/actus_kernel.py:434 + // modules/actus_kernel.py:437 // return UInt64(0) intc_0 // 0 bury 6 - // modules/actus_kernel.py:552 + // modules/actus_kernel.py:555 // principal_amount_due = self._entry_principal_amount(entry) b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@28 fund_due_cashflows_after_if_else@24: - // modules/actus_kernel.py:435 + // modules/actus_kernel.py:438 // principal_amount = self.next_principal_redemption - interest_due intc_0 // 0 bytec 14 // "next_principal_redemption" @@ -988,7 +994,7 @@ fund_due_cashflows_after_if_else@24: - dup bury 8 - // modules/actus_kernel.py:436 + // modules/actus_kernel.py:439 // if principal_amount > self.outstanding_principal: intc_0 // 0 bytec 4 // "outstanding_principal" @@ -996,26 +1002,26 @@ fund_due_cashflows_after_if_else@24: assert // check self.outstanding_principal exists > bz fund_due_cashflows_after_if_else@26 - // modules/actus_kernel.py:437 + // modules/actus_kernel.py:440 // return self.outstanding_principal intc_0 // 0 bytec 4 // "outstanding_principal" app_global_get_ex assert // check self.outstanding_principal exists bury 6 - // modules/actus_kernel.py:552 + // modules/actus_kernel.py:555 // principal_amount_due = self._entry_principal_amount(entry) b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@28 fund_due_cashflows_after_if_else@26: dig 6 bury 6 - // modules/actus_kernel.py:552 + // modules/actus_kernel.py:555 // principal_amount_due = self._entry_principal_amount(entry) b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@28 fund_due_cashflows_after_if_else@27: - // modules/actus_kernel.py:440 + // modules/actus_kernel.py:443 // entry.next_outstanding_principal <= self.outstanding_principal dig 15 pushint 49 @@ -1026,22 +1032,22 @@ fund_due_cashflows_after_if_else@27: assert // check self.outstanding_principal exists dup2 <= - // modules/actus_kernel.py:439-441 + // modules/actus_kernel.py:442-444 // assert ( // entry.next_outstanding_principal <= self.outstanding_principal // ), err.INVALID_ACTUS_CONFIG assert // Invalid ACTUS configuration - // modules/actus_kernel.py:442 + // modules/actus_kernel.py:445 // return self.outstanding_principal - entry.next_outstanding_principal swap - bury 6 - // modules/actus_kernel.py:552 + // modules/actus_kernel.py:555 // principal_amount_due = self._entry_principal_amount(entry) b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@28 fund_due_cashflows_after_if_else@15: - // modules/actus_kernel.py:415 + // modules/actus_kernel.py:418 // return self.accrued_interest + self._entry_interest_segment(entry) intc_0 // 0 bytec 6 // "accrued_interest" @@ -1052,7 +1058,7 @@ fund_due_cashflows_after_if_else@15: bury 18 + bury 11 - // modules/actus_kernel.py:551 + // modules/actus_kernel.py:554 // interest_amount_due = self._entry_interest_amount(entry) b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_interest_amount@16 @@ -1133,7 +1139,7 @@ claim_due_cashflows: assert // invalid number of bytes for arc4.dynamic_array extract 2 0 swap - // modules/actus_kernel.py:143 + // modules/actus_kernel.py:146 // assert self.status != UInt64(enums.STATUS_INACTIVE), err.NOT_CONFIGURED intc_0 // 0 bytec_1 // "status" @@ -1152,7 +1158,7 @@ claim_due_cashflows: // modules/payment_agent.py:15 // if self.op_daemon.value != Global.zero_address: intc_0 // 0 - bytec 26 // 0x523a4f504423 + bytec 27 // 0x523a4f504423 app_global_get_ex assert // check self.op_daemon exists global ZeroAddress @@ -1162,7 +1168,7 @@ claim_due_cashflows: // Txn.sender == self.op_daemon.value txn Sender intc_0 // 0 - bytec 26 // 0x523a4f504423 + bytec 27 // 0x523a4f504423 app_global_get_ex assert // check self.op_daemon exists == @@ -1214,7 +1220,7 @@ claim_due_cashflows_after_if_else@17: // modules/payment_agent.py:140 // self._assert_is_not_asset_suspended() callsub _assert_is_not_asset_suspended - // modules/actus_kernel.py:135 + // modules/actus_kernel.py:138 // return self.status == UInt64(enums.STATUS_PENDING_IED) intc_0 // 0 bytec_1 // "status" @@ -1222,7 +1228,7 @@ claim_due_cashflows_after_if_else@17: assert // check self.status exists pushint 50 == - // modules/actus_kernel.py:147 + // modules/actus_kernel.py:150 // assert not self._status_is_pending_ied(), err.PENDING_IED ! assert // IED not yet executed @@ -1523,12 +1529,12 @@ transfer_set_schedule: assert // Time events must be sorted in strictly ascending order // modules/transfer_agent.py:43 // self.transfer_opening_date = open_date - bytec 28 // "transfer_opening_date" + bytec 29 // "transfer_opening_date" uncover 2 app_global_put // modules/transfer_agent.py:44 // self.transfer_closure_date = closure_date - bytec 29 // "transfer_closure_date" + bytec 30 // "transfer_closure_date" swap app_global_put // modules/transfer_agent.py:45 @@ -1564,7 +1570,7 @@ primary_distribution: btoi dup cover 2 - // modules/actus_kernel.py:143 + // modules/actus_kernel.py:146 // assert self.status != UInt64(enums.STATUS_INACTIVE), err.NOT_CONFIGURED intc_0 // 0 bytec_1 // "status" @@ -1583,7 +1589,7 @@ primary_distribution: // modules/transfer_agent.py:77 // self._assert_is_not_asset_suspended() callsub _assert_is_not_asset_suspended - // modules/actus_kernel.py:135 + // modules/actus_kernel.py:138 // return self.status == UInt64(enums.STATUS_PENDING_IED) intc_0 // 0 bytec_1 // "status" @@ -1632,7 +1638,7 @@ primary_distribution: // modules/transfer_agent.py:85 // if self.initial_exchange_date: intc_0 // 0 - bytec 27 // "initial_exchange_date" + bytec 28 // "initial_exchange_date" app_global_get_ex assert // check self.initial_exchange_date exists bz primary_distribution_after_if_else@3 @@ -1640,7 +1646,7 @@ primary_distribution: // Global.latest_timestamp <= self.initial_exchange_date global LatestTimestamp intc_0 // 0 - bytec 27 // "initial_exchange_date" + bytec 28 // "initial_exchange_date" app_global_get_ex assert // check self.initial_exchange_date exists <= @@ -1720,7 +1726,7 @@ transfer: == assert // invalid number of bytes for arc4.uint64 btoi - // modules/actus_kernel.py:143 + // modules/actus_kernel.py:146 // assert self.status != UInt64(enums.STATUS_INACTIVE), err.NOT_CONFIGURED intc_0 // 0 bytec_1 // "status" @@ -1733,7 +1739,7 @@ transfer: // modules/transfer_agent.py:131 // self._assert_is_not_asset_suspended() callsub _assert_is_not_asset_suspended - // modules/actus_kernel.py:135 + // modules/actus_kernel.py:138 // return self.status == UInt64(enums.STATUS_PENDING_IED) intc_0 // 0 bytec_1 // "status" @@ -1741,21 +1747,21 @@ transfer: assert // check self.status exists pushint 50 == - // modules/actus_kernel.py:147 + // modules/actus_kernel.py:150 // assert not self._status_is_pending_ied(), err.PENDING_IED ! assert // IED not yet executed // modules/transfer_agent.py:13 // if self.transfer_opening_date: intc_0 // 0 - bytec 28 // "transfer_opening_date" + bytec 29 // "transfer_opening_date" app_global_get_ex assert // check self.transfer_opening_date exists bz transfer_after_if_else@3 // modules/transfer_agent.py:15 // self.transfer_opening_date <= Global.latest_timestamp intc_0 // 0 - bytec 28 // "transfer_opening_date" + bytec 29 // "transfer_opening_date" app_global_get_ex assert // check self.transfer_opening_date exists global LatestTimestamp @@ -1770,7 +1776,7 @@ transfer_after_if_else@3: // modules/transfer_agent.py:17 // if self.transfer_closure_date: intc_0 // 0 - bytec 29 // "transfer_closure_date" + bytec 30 // "transfer_closure_date" app_global_get_ex assert // check self.transfer_closure_date exists bz transfer_after_if_else@5 @@ -1778,7 +1784,7 @@ transfer_after_if_else@3: // Global.latest_timestamp < self.transfer_closure_date global LatestTimestamp intc_0 // 0 - bytec 29 // "transfer_closure_date" + bytec 30 // "transfer_closure_date" app_global_get_ex assert // check self.transfer_closure_date exists < @@ -1845,7 +1851,7 @@ transfer_after_if_else@5: extract_uint64 <= assert // Insufficient sender units to transfer - // modules/actus_kernel.py:763 + // modules/actus_kernel.py:766 // if self.event_cursor >= self.schedule_entry_count: intc_0 // 0 bytec_2 // "event_cursor" @@ -1857,20 +1863,20 @@ transfer_after_if_else@5: assert // check self.schedule_entry_count exists >= bnz transfer_after_inlined_modules.actus_kernel.ActusKernelModule._assert_no_due_event_pending@10 - // modules/actus_kernel.py:765 + // modules/actus_kernel.py:768 // next_entry = self._get_schedule_entry(self.event_cursor) intc_0 // 0 bytec_2 // "event_cursor" app_global_get_ex assert // check self.event_cursor exists callsub _get_schedule_entry - // modules/actus_kernel.py:767 + // modules/actus_kernel.py:770 // next_entry.scheduled_time > Global.latest_timestamp pushint 9 extract_uint64 global LatestTimestamp > - // modules/actus_kernel.py:766-768 + // modules/actus_kernel.py:769-771 // assert ( // next_entry.scheduled_time > Global.latest_timestamp // ), err.PENDING_ACTUS_EVENT @@ -2024,7 +2030,7 @@ account_open: txn Sender callsub _role_is_active assert // Not authorized - // modules/actus_kernel.py:139 + // modules/actus_kernel.py:142 // return self.status == UInt64(enums.STATUS_ENDED) intc_0 // 0 bytec_1 // "status" @@ -2193,7 +2199,7 @@ account_get_position: // modules.actus_kernel.ActusKernelModule.contract_create[routing]() -> void: contract_create: - // modules/actus_kernel.py:1019 + // modules/actus_kernel.py:1022 // @arc4.abimethod(create="require") txna ApplicationArgs 1 dup @@ -2201,15 +2207,15 @@ contract_create: intc_3 // 32 == assert // invalid number of bytes for arc4.static_array - // modules/actus_kernel.py:1033 + // modules/actus_kernel.py:1036 // self.arranger.value = arranger bytec 18 // 0x523a41525223 swap app_global_put - // modules/actus_kernel.py:1034 + // modules/actus_kernel.py:1037 // return Global.latest_timestamp global LatestTimestamp - // modules/actus_kernel.py:1019 + // modules/actus_kernel.py:1022 // @arc4.abimethod(create="require") itob bytec_0 // 0x151f7c75 @@ -2224,7 +2230,7 @@ contract_create: contract_config: pushbytes "" dup - // modules/actus_kernel.py:1036 + // modules/actus_kernel.py:1039 // @arc4.abimethod txna ApplicationArgs 1 dupn 2 @@ -2263,10 +2269,10 @@ contract_config: + == assert // invalid number of bytes for smart_contracts.abi_types.Prospectus - // modules/actus_kernel.py:1066 + // modules/actus_kernel.py:1069 // self._assert_caller_is_arranger() callsub _assert_caller_is_arranger - // modules/actus_kernel.py:1068-1069 + // modules/actus_kernel.py:1071-1072 // # Configure Contract // self.contract_type = terms.contract_type.as_uint64() intc_0 // 0 @@ -2275,7 +2281,7 @@ contract_config: bytec 10 // "contract_type" dig 1 app_global_put - // modules/actus_kernel.py:218-225 + // modules/actus_kernel.py:221-228 // return contract_type in ( // UInt64(enums.CT_PAM), // UInt64(enums.CT_ANN), @@ -2286,10 +2292,10 @@ contract_config: // ) bz contract_config_bool_true@7 dup - // modules/actus_kernel.py:220 + // modules/actus_kernel.py:223 // UInt64(enums.CT_ANN), intc_1 // 1 - // modules/actus_kernel.py:218-225 + // modules/actus_kernel.py:221-228 // return contract_type in ( // UInt64(enums.CT_PAM), // UInt64(enums.CT_ANN), @@ -2301,10 +2307,10 @@ contract_config: == bnz contract_config_bool_true@7 dup - // modules/actus_kernel.py:221 + // modules/actus_kernel.py:224 // UInt64(enums.CT_NAM), pushint 2 - // modules/actus_kernel.py:218-225 + // modules/actus_kernel.py:221-228 // return contract_type in ( // UInt64(enums.CT_PAM), // UInt64(enums.CT_ANN), @@ -2316,10 +2322,10 @@ contract_config: == bnz contract_config_bool_true@7 dup - // modules/actus_kernel.py:222 + // modules/actus_kernel.py:225 // UInt64(enums.CT_LAM), pushint 3 - // modules/actus_kernel.py:218-225 + // modules/actus_kernel.py:221-228 // return contract_type in ( // UInt64(enums.CT_PAM), // UInt64(enums.CT_ANN), @@ -2331,10 +2337,10 @@ contract_config: == bnz contract_config_bool_true@7 dup - // modules/actus_kernel.py:223 + // modules/actus_kernel.py:226 // UInt64(enums.CT_LAX), pushint 4 - // modules/actus_kernel.py:218-225 + // modules/actus_kernel.py:221-228 // return contract_type in ( // UInt64(enums.CT_PAM), // UInt64(enums.CT_ANN), @@ -2346,10 +2352,10 @@ contract_config: == bnz contract_config_bool_true@7 dup - // modules/actus_kernel.py:224 + // modules/actus_kernel.py:227 // UInt64(enums.CT_CLM), pushint 5 - // modules/actus_kernel.py:218-225 + // modules/actus_kernel.py:221-228 // return contract_type in ( // UInt64(enums.CT_PAM), // UInt64(enums.CT_ANN), @@ -2365,10 +2371,10 @@ contract_config_bool_true@7: intc_1 // 1 contract_config_bool_merge@9: - // modules/actus_kernel.py:229 + // modules/actus_kernel.py:232 // assert self._is_supported_contract_type(contract_type), err.INVALID_ACTUS_CONFIG assert // Invalid ACTUS configuration - // modules/actus_kernel.py:1071 + // modules/actus_kernel.py:1074 // self._store_contract_config(self.contract_type, terms, initial_state) intc_0 // 0 bytec 10 // "contract_type" @@ -2376,7 +2382,7 @@ contract_config_bool_merge@9: swap bury 2 assert // check self.contract_type exists - // modules/actus_kernel.py:325 + // modules/actus_kernel.py:328 // assert terms.initial_exchange_amount > UInt64(0), err.INVALID_ACTUS_CONFIG dig 4 dup @@ -2385,13 +2391,13 @@ contract_config_bool_merge@9: dup bury 8 assert // Invalid ACTUS configuration - // modules/actus_kernel.py:327 + // modules/actus_kernel.py:330 // terms.day_count_convention.as_uint64() pushint 57 getbyte dup bury 8 - // modules/actus_kernel.py:297-303 + // modules/actus_kernel.py:300-306 // return day_count_convention in ( // UInt64(enums.DCC_AA), // UInt64(enums.DCC_A360), @@ -2401,10 +2407,10 @@ contract_config_bool_merge@9: // ) bz contract_config_bool_true@16 dig 6 - // modules/actus_kernel.py:299 + // modules/actus_kernel.py:302 // UInt64(enums.DCC_A360), intc_1 // 1 - // modules/actus_kernel.py:297-303 + // modules/actus_kernel.py:300-306 // return day_count_convention in ( // UInt64(enums.DCC_AA), // UInt64(enums.DCC_A360), @@ -2415,10 +2421,10 @@ contract_config_bool_merge@9: == bnz contract_config_bool_true@16 dig 6 - // modules/actus_kernel.py:300 + // modules/actus_kernel.py:303 // UInt64(enums.DCC_A365), pushint 2 - // modules/actus_kernel.py:297-303 + // modules/actus_kernel.py:300-306 // return day_count_convention in ( // UInt64(enums.DCC_AA), // UInt64(enums.DCC_A360), @@ -2429,10 +2435,10 @@ contract_config_bool_merge@9: == bnz contract_config_bool_true@16 dig 6 - // modules/actus_kernel.py:301 + // modules/actus_kernel.py:304 // UInt64(enums.DCC_30E360ISDA), pushint 3 - // modules/actus_kernel.py:297-303 + // modules/actus_kernel.py:300-306 // return day_count_convention in ( // UInt64(enums.DCC_AA), // UInt64(enums.DCC_A360), @@ -2443,10 +2449,10 @@ contract_config_bool_merge@9: == bnz contract_config_bool_true@16 dig 6 - // modules/actus_kernel.py:302 + // modules/actus_kernel.py:305 // UInt64(enums.DCC_30E360), pushint 4 - // modules/actus_kernel.py:297-303 + // modules/actus_kernel.py:300-306 // return day_count_convention in ( // UInt64(enums.DCC_AA), // UInt64(enums.DCC_A360), @@ -2461,18 +2467,18 @@ contract_config_bool_true@16: intc_1 // 1 contract_config_bool_merge@18: - // modules/actus_kernel.py:309-311 + // modules/actus_kernel.py:312-314 // assert self._is_supported_day_count_convention( // day_count_convention // ), err.INVALID_DAY_COUNT_CONVENTION assert // Invalid day-count convention ID - // modules/actus_kernel.py:329 + // modules/actus_kernel.py:332 // if contract_type != UInt64(enums.CT_ANN): dup intc_1 // 1 != bz contract_config_after_if_else@20 - // modules/actus_kernel.py:330 + // modules/actus_kernel.py:333 // assert not terms.dynamic_principal_redemption, err.INVALID_ACTUS_CONFIG dig 4 pushint 786 @@ -2481,7 +2487,7 @@ contract_config_bool_merge@18: assert // Invalid ACTUS configuration contract_config_after_if_else@20: - // modules/actus_kernel.py:807 + // modules/actus_kernel.py:810 // assert self.status == UInt64(enums.STATUS_INACTIVE), err.ALREADY_CONFIGURED intc_0 // 0 bytec_1 // "status" @@ -2489,7 +2495,7 @@ contract_config_after_if_else@20: assert // check self.status exists ! assert // D-ASA already configured - // modules/actus_kernel.py:808 + // modules/actus_kernel.py:811 // assert self.initial_exchange_amount == UInt64(0), err.ALREADY_CONFIGURED intc_0 // 0 bytec 20 // "initial_exchange_amount" @@ -2497,50 +2503,50 @@ contract_config_after_if_else@20: assert // check self.initial_exchange_amount exists ! assert // D-ASA already configured - // modules/actus_kernel.py:810-811 + // modules/actus_kernel.py:813-814 // # Set Denomination Asset // self._assert_denomination_asset(terms.denomination_asset_id) dig 4 dup intc_1 // 1 extract_uint64 - // modules/actus_kernel.py:775-776 + // modules/actus_kernel.py:778-779 // # The reference implementation has on-chain denomination with ASA // _creator, exists = op.AssetParamsGet.asset_creator(denomination_asset_id) dup asset_params_get AssetCreator bury 1 - // modules/actus_kernel.py:777 + // modules/actus_kernel.py:780 // assert exists, err.INVALID_DENOMINATION assert // Denomination asset is not properly set - // modules/actus_kernel.py:780 + // modules/actus_kernel.py:783 // self.denomination_asset_id = denomination_asset_id bytec 44 // "denomination_asset_id" dig 1 app_global_put - // modules/actus_kernel.py:814-815 + // modules/actus_kernel.py:817-818 // # Set Settlement Asset // self._assert_settlement_asset(terms.settlement_asset_id) dig 1 pushint 9 extract_uint64 - // modules/actus_kernel.py:785 + // modules/actus_kernel.py:788 // settlement_asset_id == self.denomination_asset_id dup uncover 2 == - // modules/actus_kernel.py:783-786 + // modules/actus_kernel.py:786-789 // # The reference implementation settlement asset is the denomination asset // assert ( // settlement_asset_id == self.denomination_asset_id // ), err.INVALID_SETTLEMENT_ASSET assert // Different settlement asset not supported, must be equal to denomination asset - // modules/actus_kernel.py:789 + // modules/actus_kernel.py:792 // self.settlement_asset_id = settlement_asset_id bytec 19 // "settlement_asset_id" dig 1 app_global_put - // modules/actus_kernel.py:790-796 + // modules/actus_kernel.py:793-799 // # The reference implementation has on-chain settlement with ASA // itxn.AssetTransfer( // xfer_asset=self.settlement_asset_id, @@ -2549,26 +2555,26 @@ contract_config_after_if_else@20: // fee=Global.min_txn_fee, // ).submit() itxn_begin - // modules/actus_kernel.py:795 + // modules/actus_kernel.py:798 // fee=Global.min_txn_fee, global MinTxnFee - // modules/actus_kernel.py:793 + // modules/actus_kernel.py:796 // asset_receiver=Global.current_application_address, global CurrentApplicationAddress - // modules/actus_kernel.py:794 + // modules/actus_kernel.py:797 // asset_amount=0, intc_0 // 0 itxn_field AssetAmount itxn_field AssetReceiver swap itxn_field XferAsset - // modules/actus_kernel.py:790-791 + // modules/actus_kernel.py:793-794 // # The reference implementation has on-chain settlement with ASA // itxn.AssetTransfer( pushint 4 // axfer itxn_field TypeEnum itxn_field Fee - // modules/actus_kernel.py:790-796 + // modules/actus_kernel.py:793-799 // # The reference implementation has on-chain settlement with ASA // itxn.AssetTransfer( // xfer_asset=self.settlement_asset_id, @@ -2577,7 +2583,7 @@ contract_config_after_if_else@20: // fee=Global.min_txn_fee, // ).submit() itxn_submit - // modules/actus_kernel.py:818-819 + // modules/actus_kernel.py:821-822 // # Units // self.total_units = terms.total_units dup @@ -2586,27 +2592,27 @@ contract_config_after_if_else@20: bytec 13 // "total_units" swap app_global_put - // modules/actus_kernel.py:820 + // modules/actus_kernel.py:823 // self.reserved_units_total = UInt64(0) bytec 11 // "reserved_units_total" intc_0 // 0 app_global_put - // modules/actus_kernel.py:822-823 + // modules/actus_kernel.py:825-826 // # Day-Count Conventions // self.day_count_convention = terms.day_count_convention.as_uint64() bytec 46 // "day_count_convention" dig 8 app_global_put - // modules/actus_kernel.py:825-826 + // modules/actus_kernel.py:828-829 // # Time // self.initial_exchange_date = terms.initial_exchange_date dup pushint 41 extract_uint64 - bytec 27 // "initial_exchange_date" + bytec 28 // "initial_exchange_date" dig 1 app_global_put - // modules/actus_kernel.py:827 + // modules/actus_kernel.py:830 // self.maturity_date = terms.maturity_date dig 1 pushint 49 @@ -2614,7 +2620,7 @@ contract_config_after_if_else@20: bytec 45 // "maturity_date" dig 1 app_global_put - // modules/actus_kernel.py:828 + // modules/actus_kernel.py:831 // self.next_principal_redemption = initial_state.next_principal_redemption dig 6 dup @@ -2624,13 +2630,13 @@ contract_config_after_if_else@20: bytec 14 // "next_principal_redemption" swap app_global_put - // modules/actus_kernel.py:830-831 + // modules/actus_kernel.py:833-834 // # Principal // self.initial_exchange_amount = terms.initial_exchange_amount bytec 20 // "initial_exchange_amount" dig 10 app_global_put - // modules/actus_kernel.py:832 + // modules/actus_kernel.py:835 // self.dynamic_principal_redemption = terms.dynamic_principal_redemption dig 3 pushint 786 @@ -2638,7 +2644,7 @@ contract_config_after_if_else@20: bytec 34 // "dynamic_principal_redemption" swap app_global_put - // modules/actus_kernel.py:833 + // modules/actus_kernel.py:836 // self.outstanding_principal = initial_state.outstanding_principal dig 1 pushint 16 @@ -2646,7 +2652,7 @@ contract_config_after_if_else@20: bytec 4 // "outstanding_principal" swap app_global_put - // modules/actus_kernel.py:835-836 + // modules/actus_kernel.py:838-839 // # Interest // self.accrued_interest = initial_state.accrued_interest dig 1 @@ -2655,7 +2661,7 @@ contract_config_after_if_else@20: bytec 6 // "accrued_interest" swap app_global_put - // modules/actus_kernel.py:838-839 + // modules/actus_kernel.py:841-842 // # Interest Rate // self.nominal_interest_rate = initial_state.nominal_interest_rate dig 1 @@ -2664,7 +2670,7 @@ contract_config_after_if_else@20: bytec 9 // "nominal_interest_rate" swap app_global_put - // modules/actus_kernel.py:840 + // modules/actus_kernel.py:843 // self.interest_calculation_base = initial_state.interest_calculation_base dig 1 pushint 24 @@ -2672,7 +2678,7 @@ contract_config_after_if_else@20: bytec 7 // "interest_calculation_base" swap app_global_put - // modules/actus_kernel.py:841 + // modules/actus_kernel.py:844 // self.rate_reset_spread = terms.rate_reset_spread dig 3 pushint 58 @@ -2680,7 +2686,7 @@ contract_config_after_if_else@20: bytec 35 // "rate_reset_spread" swap app_global_put - // modules/actus_kernel.py:842 + // modules/actus_kernel.py:845 // self.rate_reset_multiplier = terms.rate_reset_multiplier dig 3 pushint 66 @@ -2688,23 +2694,23 @@ contract_config_after_if_else@20: bytec 36 // "rate_reset_multiplier" swap app_global_put - // modules/actus_kernel.py:843 + // modules/actus_kernel.py:846 // self.rate_reset_floor = terms.rate_reset_floor dig 3 pushint 74 extract_uint64 - bytec 30 // "rate_reset_floor" + bytec 31 // "rate_reset_floor" swap app_global_put - // modules/actus_kernel.py:844 + // modules/actus_kernel.py:847 // self.rate_reset_cap = terms.rate_reset_cap dig 3 pushint 82 extract_uint64 - bytec 31 // "rate_reset_cap" + bytec 32 // "rate_reset_cap" swap app_global_put - // modules/actus_kernel.py:845 + // modules/actus_kernel.py:848 // self.rate_reset_next = terms.rate_reset_next dig 3 pushint 90 @@ -2712,7 +2718,7 @@ contract_config_after_if_else@20: bytec 37 // "rate_reset_next" swap app_global_put - // modules/actus_kernel.py:846 + // modules/actus_kernel.py:849 // self.has_rate_reset_floor = terms.has_rate_reset_floor dig 3 pushint 784 @@ -2720,7 +2726,7 @@ contract_config_after_if_else@20: bytec 38 // "has_rate_reset_floor" swap app_global_put - // modules/actus_kernel.py:847 + // modules/actus_kernel.py:850 // self.has_rate_reset_cap = terms.has_rate_reset_cap dig 3 pushint 785 @@ -2728,7 +2734,7 @@ contract_config_after_if_else@20: bytec 39 // "has_rate_reset_cap" swap app_global_put - // modules/actus_kernel.py:849-850 + // modules/actus_kernel.py:852-853 // # Scaling // self.fixed_point_scale = terms.fixed_point_scale uncover 3 @@ -2737,7 +2743,7 @@ contract_config_after_if_else@20: bytec 5 // "fixed_point_scale" swap app_global_put - // modules/actus_kernel.py:852-853 + // modules/actus_kernel.py:855-856 // # Schedule Processing // self.event_cursor = initial_state.event_cursor dig 1 @@ -2746,7 +2752,7 @@ contract_config_after_if_else@20: bytec_2 // "event_cursor" swap app_global_put - // modules/actus_kernel.py:855-856 + // modules/actus_kernel.py:858-859 // # Per-Unit Fixed-Point Indexes // self.cumulative_interest_index = initial_state.cumulative_interest_index dig 1 @@ -2755,7 +2761,7 @@ contract_config_after_if_else@20: bytec 16 // "cumulative_interest_index" swap app_global_put - // modules/actus_kernel.py:857 + // modules/actus_kernel.py:860 // self.cumulative_principal_index = initial_state.cumulative_principal_index dig 1 pushint 64 @@ -2763,24 +2769,24 @@ contract_config_after_if_else@20: bytec 17 // "cumulative_principal_index" swap app_global_put - // modules/actus_kernel.py:859-860 + // modules/actus_kernel.py:862-863 // # Reserved Amount (for executed cashflows) // self.reserved_interest = UInt64(0) bytec 15 // "reserved_interest" intc_0 // 0 app_global_put - // modules/actus_kernel.py:861 + // modules/actus_kernel.py:864 // self.reserved_principal = UInt64(0) bytec 12 // "reserved_principal" intc_0 // 0 app_global_put - // modules/actus_kernel.py:863 + // modules/actus_kernel.py:866 // assert terms.initial_exchange_date > Global.latest_timestamp, err.INVALID_IED dig 2 global LatestTimestamp > assert // IED must be set in the future - // modules/actus_kernel.py:864 + // modules/actus_kernel.py:867 // assert terms.initial_exchange_date > initial_state.status_date, err.INVALID_IED swap intc_0 // 0 @@ -2788,11 +2794,11 @@ contract_config_after_if_else@20: dig 2 < assert // IED must be set in the future - // modules/actus_kernel.py:865 + // modules/actus_kernel.py:868 // assert terms.initial_exchange_date < terms.maturity_date, err.INVALID_IED < assert // IED must be set in the future - // modules/actus_kernel.py:1073-1074 + // modules/actus_kernel.py:1076-1077 // # Notarize prospectus (optional) // self.prospectus_hash = prospectus.hash.bytes dig 2 @@ -2800,17 +2806,17 @@ contract_config_after_if_else@20: bytec 42 // "prospectus_hash" swap app_global_put - // modules/actus_kernel.py:1075 + // modules/actus_kernel.py:1078 // self.prospectus_url = prospectus.url dig 1 extract 2 0 bytec 43 // "prospectus_url" swap app_global_put - // modules/actus_kernel.py:1076 + // modules/actus_kernel.py:1079 // return Global.latest_timestamp global LatestTimestamp - // modules/actus_kernel.py:1036 + // modules/actus_kernel.py:1039 // @arc4.abimethod itob bytec_0 // 0x151f7c75 @@ -2834,7 +2840,7 @@ contract_schedule: intc_0 // 0 pushbytes "" dupn 2 - // modules/actus_kernel.py:1078 + // modules/actus_kernel.py:1081 // @arc4.abimethod txna ApplicationArgs 1 dup @@ -2870,10 +2876,10 @@ contract_schedule: len == assert // invalid number of bytes for arc4.dynamic_array - // modules/actus_kernel.py:1110 + // modules/actus_kernel.py:1113 // self._assert_caller_is_arranger() callsub _assert_caller_is_arranger - // modules/actus_kernel.py:1113 + // modules/actus_kernel.py:1116 // contract_type=self.contract_type, intc_0 // 0 bytec 10 // "contract_type" @@ -2881,7 +2887,7 @@ contract_schedule: swap cover 3 assert // check self.contract_type exists - // modules/actus_kernel.py:881 + // modules/actus_kernel.py:884 // assert self.status == UInt64(enums.STATUS_INACTIVE), err.ALREADY_CONFIGURED intc_0 // 0 bytec_1 // "status" @@ -2889,7 +2895,7 @@ contract_schedule: assert // check self.status exists ! assert // D-ASA already configured - // modules/actus_kernel.py:882-884 + // modules/actus_kernel.py:885-887 // assert schedule_page.length <= UInt64( // cst.SCHEDULE_PAGE_SIZE // ), err.INVALID_SCHEDULE_PAGE @@ -2897,31 +2903,31 @@ contract_schedule: pushint 16 <= assert // Invalid schedule page - // modules/actus_kernel.py:885 + // modules/actus_kernel.py:888 // assert self.initial_exchange_amount > UInt64(0), err.TERMS_NOT_CONFIGURED intc_0 // 0 bytec 20 // "initial_exchange_amount" app_global_get_ex assert // check self.initial_exchange_amount exists assert // D-ASA terms not configured - // modules/actus_kernel.py:887 + // modules/actus_kernel.py:890 // page_cursor = schedule_page_index * UInt64(cst.SCHEDULE_PAGE_SIZE) swap pushint 16 * swap - // modules/actus_kernel.py:894 + // modules/actus_kernel.py:897 // + page_length * UInt64(cst.OP_UP_CONTRACT_CONFIG_PER_ENTRY_BUDGET) pushint 100 * - // modules/actus_kernel.py:893 + // modules/actus_kernel.py:896 // UInt64(cst.OP_UP_CONTRACT_CONFIG_BASE_BUDGET) intc 4 // 1500 - // modules/actus_kernel.py:893-894 + // modules/actus_kernel.py:896-897 // UInt64(cst.OP_UP_CONTRACT_CONFIG_BASE_BUDGET) // + page_length * UInt64(cst.OP_UP_CONTRACT_CONFIG_PER_ENTRY_BUDGET) + - // modules/actus_kernel.py:889-896 + // modules/actus_kernel.py:892-899 // # Validation cost grows with page length, so configuration explicitly // # buys extra opcode budget for larger uploads. // ensure_budget( @@ -2932,18 +2938,18 @@ contract_schedule: // ) intc_0 // 0 callsub ensure_budget - // modules/actus_kernel.py:897 + // modules/actus_kernel.py:900 // index = UInt64(0) intc_0 // 0 contract_schedule_while_top@2: - // modules/actus_kernel.py:898 + // modules/actus_kernel.py:901 // while index < page_length: dup dig 4 < bz contract_schedule_after_while@11 - // modules/actus_kernel.py:899-900 + // modules/actus_kernel.py:902-903 // entry = schedule_page[index].copy() // entry_event_type = entry.event_type.as_uint64() dig 4 @@ -2957,20 +2963,20 @@ contract_schedule_while_top@2: * pushint 65 extract3 // on error: index access is out of bounds - // modules/actus_kernel.py:900 + // modules/actus_kernel.py:903 // entry_event_type = entry.event_type.as_uint64() dup - // modules/actus_kernel.py:899-900 + // modules/actus_kernel.py:902-903 // entry = schedule_page[index].copy() // entry_event_type = entry.event_type.as_uint64() intc_2 // 8 - // modules/actus_kernel.py:900 + // modules/actus_kernel.py:903 // entry_event_type = entry.event_type.as_uint64() getbyte dup cover 2 bury 13 - // modules/actus_kernel.py:901 + // modules/actus_kernel.py:904 // assert entry.event_id == page_cursor + index, err.INVALID_EVENT_ID dup intc_0 // 0 @@ -2983,14 +2989,14 @@ contract_schedule_while_top@2: dig 1 == assert // Invalid event id - // modules/actus_kernel.py:902-904 + // modules/actus_kernel.py:905-907 // self._assert_event_allowed_for_contract_type( // contract_type, entry_event_type // ) dig 5 uncover 3 callsub _assert_event_allowed_for_contract_type - // modules/actus_kernel.py:905 + // modules/actus_kernel.py:908 // assert entry.scheduled_time > UInt64(0), err.INVALID_ACTUS_CONFIG swap pushint 9 @@ -2998,14 +3004,14 @@ contract_schedule_while_top@2: dup bury 10 assert // Invalid ACTUS configuration - // modules/actus_kernel.py:906 + // modules/actus_kernel.py:909 // if entry.event_id > UInt64(0): bz contract_schedule_after_if_else@8 - // modules/actus_kernel.py:907 + // modules/actus_kernel.py:910 // if index > UInt64(0): dup bz contract_schedule_else_body@6 - // modules/actus_kernel.py:908 + // modules/actus_kernel.py:911 // previous_entry = schedule_page[index - UInt64(1)].copy() dup intc_1 // 1 @@ -3018,24 +3024,24 @@ contract_schedule_while_top@2: extract3 // on error: index access is out of bounds contract_schedule_after_if_else@7: - // modules/actus_kernel.py:923 + // modules/actus_kernel.py:926 // previous_entry.scheduled_time <= entry.scheduled_time pushint 9 extract_uint64 dig 8 <= - // modules/actus_kernel.py:922-924 + // modules/actus_kernel.py:925-927 // assert ( // previous_entry.scheduled_time <= entry.scheduled_time // ), err.INVALID_SORTING assert // Time events must be sorted in strictly ascending order contract_schedule_after_if_else@8: - // modules/actus_kernel.py:925 + // modules/actus_kernel.py:928 // if entry.event_id == UInt64(0): dig 8 bnz contract_schedule_after_if_else@10 - // modules/actus_kernel.py:926-928 + // modules/actus_kernel.py:929-931 // assert entry_event_type == UInt64( // enums.EVT_IED // ), err.INVALID_ACTUS_CONFIG @@ -3045,7 +3051,7 @@ contract_schedule_after_if_else@8: assert // Invalid ACTUS configuration contract_schedule_after_if_else@10: - // modules/actus_kernel.py:929 + // modules/actus_kernel.py:932 // index += UInt64(1) dup intc_1 // 1 @@ -3054,18 +3060,18 @@ contract_schedule_after_if_else@10: b contract_schedule_while_top@2 contract_schedule_else_body@6: - // modules/actus_kernel.py:910-912 + // modules/actus_kernel.py:913-915 // # The first entry of a page must still be ordered after the // # last entry of the previous page. // assert schedule_page_index > UInt64(0), err.INVALID_EVENT_ID dig 6 dup assert // Invalid event id - // modules/actus_kernel.py:913 + // modules/actus_kernel.py:916 // previous_page_index = schedule_page_index - UInt64(1) intc_1 // 1 - - // modules/actus_kernel.py:915 + // modules/actus_kernel.py:918 // previous_page_index in self.schedule_page itob bytec 24 // 0x5323 @@ -3074,12 +3080,12 @@ contract_schedule_else_body@6: dup box_len bury 1 - // modules/actus_kernel.py:914-916 + // modules/actus_kernel.py:917-919 // assert ( // previous_page_index in self.schedule_page // ), err.INVALID_SCHEDULE_PAGE assert // Invalid schedule page - // modules/actus_kernel.py:917-918 + // modules/actus_kernel.py:920-921 // previous_page = self.schedule_page[previous_page_index].copy() // assert previous_page.length > UInt64(0), err.INVALID_SCHEDULE_PAGE dup @@ -3087,15 +3093,15 @@ contract_schedule_else_body@6: pushint 2 box_extract btoi - // modules/actus_kernel.py:918 + // modules/actus_kernel.py:921 // assert previous_page.length > UInt64(0), err.INVALID_SCHEDULE_PAGE dup assert // Invalid schedule page - // modules/actus_kernel.py:920 + // modules/actus_kernel.py:923 // previous_page.length - UInt64(1) intc_1 // 1 - - // modules/actus_kernel.py:919-921 + // modules/actus_kernel.py:922-924 // previous_entry = previous_page[ // previous_page.length - UInt64(1) // ].copy() @@ -3108,7 +3114,7 @@ contract_schedule_else_body@6: b contract_schedule_after_if_else@7 contract_schedule_after_while@11: - // modules/actus_kernel.py:200 + // modules/actus_kernel.py:203 // self.schedule_page[page_index] = schedule_page.copy() dig 6 itob @@ -3120,35 +3126,35 @@ contract_schedule_after_while@11: pop dig 5 box_put - // modules/actus_kernel.py:932 + // modules/actus_kernel.py:935 // if is_last_page: dig 5 bz contract_schedule_after_if_else@13 - // modules/actus_kernel.py:934 + // modules/actus_kernel.py:937 // schedule_page_index * UInt64(cst.SCHEDULE_PAGE_SIZE) + page_length dig 1 dig 4 + - // modules/actus_kernel.py:933 + // modules/actus_kernel.py:936 // self.schedule_entry_count = ( bytec_3 // "schedule_entry_count" - // modules/actus_kernel.py:933-935 + // modules/actus_kernel.py:936-938 // self.schedule_entry_count = ( // schedule_page_index * UInt64(cst.SCHEDULE_PAGE_SIZE) + page_length // ) swap app_global_put - // modules/actus_kernel.py:936 + // modules/actus_kernel.py:939 // self.status = UInt64(enums.STATUS_PENDING_IED) bytec_1 // "status" pushint 50 app_global_put contract_schedule_after_if_else@13: - // modules/actus_kernel.py:1118 + // modules/actus_kernel.py:1121 // return Global.latest_timestamp global LatestTimestamp - // modules/actus_kernel.py:1078 + // modules/actus_kernel.py:1081 // @arc4.abimethod itob bytec_0 // 0x151f7c75 @@ -3161,23 +3167,23 @@ contract_schedule_after_if_else@13: // modules.actus_kernel.ActusKernelModule.contract_execute_ied[routing]() -> void: contract_execute_ied: - // modules/actus_kernel.py:143 + // modules/actus_kernel.py:146 // assert self.status != UInt64(enums.STATUS_INACTIVE), err.NOT_CONFIGURED intc_0 // 0 bytec_1 // "status" app_global_get_ex assert // check self.status exists assert // D-ASA not configured - // modules/actus_kernel.py:1143 + // modules/actus_kernel.py:1146 // self._assert_caller_is_arranger() callsub _assert_caller_is_arranger - // modules/actus_kernel.py:1144 + // modules/actus_kernel.py:1147 // self._assert_is_not_asset_defaulted() callsub _assert_is_not_asset_defaulted - // modules/actus_kernel.py:1145 + // modules/actus_kernel.py:1148 // self._assert_is_not_asset_suspended() callsub _assert_is_not_asset_suspended - // modules/actus_kernel.py:1147 + // modules/actus_kernel.py:1150 // assert self.event_cursor < self.schedule_entry_count, err.INVALID_EVENT_CURSOR intc_0 // 0 bytec_2 // "event_cursor" @@ -3190,10 +3196,10 @@ contract_execute_ied: dig 1 > assert // Invalid event cursor - // modules/actus_kernel.py:1148 + // modules/actus_kernel.py:1151 // entry = self._get_schedule_entry(self.event_cursor) callsub _get_schedule_entry - // modules/actus_kernel.py:1149 + // modules/actus_kernel.py:1152 // assert entry.event_type == arc4.UInt8(enums.EVT_IED), err.INVALID_EVENT_TYPE dup extract 8 1 @@ -3201,39 +3207,39 @@ contract_execute_ied: pushbytes 0x01 b== assert // Invalid event type - // modules/actus_kernel.py:1153 + // modules/actus_kernel.py:1156 // event_id=entry.event_id, dig 1 extract 0 8 - // modules/actus_kernel.py:1155 + // modules/actus_kernel.py:1158 // scheduled_time=entry.scheduled_time, dig 2 extract 9 8 - // modules/actus_kernel.py:1156 + // modules/actus_kernel.py:1159 // accrual_factor=entry.accrual_factor, dig 3 extract 17 8 - // modules/actus_kernel.py:1157 + // modules/actus_kernel.py:1160 // redemption_accrual_factor=entry.redemption_accrual_factor, dig 4 extract 25 8 - // modules/actus_kernel.py:1159 + // modules/actus_kernel.py:1162 // next_nominal_interest_rate=entry.next_nominal_interest_rate, dig 5 extract 33 8 - // modules/actus_kernel.py:1160 + // modules/actus_kernel.py:1163 // next_principal_redemption=entry.next_principal_redemption, dig 6 extract 41 8 - // modules/actus_kernel.py:1161 + // modules/actus_kernel.py:1164 // next_outstanding_principal=entry.next_outstanding_principal, dig 7 extract 49 8 - // modules/actus_kernel.py:1162 + // modules/actus_kernel.py:1165 // flags=entry.flags, dig 8 extract 57 8 - // modules/actus_kernel.py:1152-1163 + // modules/actus_kernel.py:1155-1166 // typ.ObservedEventRequest( // event_id=entry.event_id, // event_type=entry.event_type, @@ -3255,10 +3261,10 @@ contract_execute_ied: concat uncover 5 concat - // modules/actus_kernel.py:1158 + // modules/actus_kernel.py:1161 // observed_rate=UInt64(0), intc_0 // 0 - // modules/actus_kernel.py:1152-1163 + // modules/actus_kernel.py:1155-1166 // typ.ObservedEventRequest( // event_id=entry.event_id, // event_type=entry.event_type, @@ -3281,7 +3287,7 @@ contract_execute_ied: concat swap concat - // modules/actus_kernel.py:1150-1164 + // modules/actus_kernel.py:1153-1167 // self._apply_non_cash_schedule_entry( // entry, // typ.ObservedEventRequest( @@ -3299,10 +3305,10 @@ contract_execute_ied: // ) callsub _apply_non_cash_schedule_entry popn 2 - // modules/actus_kernel.py:1165 + // modules/actus_kernel.py:1168 // return Global.latest_timestamp global LatestTimestamp - // modules/actus_kernel.py:1120 + // modules/actus_kernel.py:1123 // @arc4.abimethod itob bytec_0 // 0x151f7c75 @@ -3319,7 +3325,7 @@ apply_non_cash_event: dupn 4 pushbytes "" dup - // modules/actus_kernel.py:1167 + // modules/actus_kernel.py:1170 // @arc4.abimethod txna ApplicationArgs 1 dup @@ -3334,20 +3340,20 @@ apply_non_cash_event: pushint 73 == assert // invalid number of bytes for smart_contracts.abi_types.ObservedEventRequest - // modules/actus_kernel.py:143 + // modules/actus_kernel.py:146 // assert self.status != UInt64(enums.STATUS_INACTIVE), err.NOT_CONFIGURED intc_0 // 0 bytec_1 // "status" app_global_get_ex assert // check self.status exists assert // D-ASA not configured - // modules/actus_kernel.py:1204 + // modules/actus_kernel.py:1207 // self._assert_is_not_asset_defaulted() callsub _assert_is_not_asset_defaulted - // modules/actus_kernel.py:1205 + // modules/actus_kernel.py:1208 // self._assert_is_not_asset_suspended() callsub _assert_is_not_asset_suspended - // modules/actus_kernel.py:1207 + // modules/actus_kernel.py:1210 // if payload.flags & UInt64(enums.FLAG_OBSERVED_EVENT): pushint 65 extract_uint64 @@ -3355,7 +3361,7 @@ apply_non_cash_event: pushint 4 & bz apply_non_cash_event_after_if_else@3 - // modules/actus_kernel.py:233 + // modules/actus_kernel.py:236 // return self.contract_type == UInt64(enums.CT_CLM) intc_0 // 0 bytec 10 // "contract_type" @@ -3363,13 +3369,13 @@ apply_non_cash_event: assert // check self.contract_type exists pushint 5 == - // modules/actus_kernel.py:1208 + // modules/actus_kernel.py:1211 // assert self._supports_observed_events(), err.OBSERVED_EVENT_REQUIRED assert // Observed event required to execute this action - // modules/actus_kernel.py:1209 + // modules/actus_kernel.py:1212 // self._assert_caller_is_arranger() callsub _assert_caller_is_arranger - // modules/actus_kernel.py:233 + // modules/actus_kernel.py:236 // return self.contract_type == UInt64(enums.CT_CLM) intc_0 // 0 bytec 10 // "contract_type" @@ -3378,10 +3384,10 @@ apply_non_cash_event: dup pushint 5 == - // modules/actus_kernel.py:945 + // modules/actus_kernel.py:948 // assert self._supports_observed_events(), err.OBSERVED_EVENT_REQUIRED assert // Observed event required to execute this action - // modules/actus_kernel.py:946 + // modules/actus_kernel.py:949 // assert payload.event_id == self.schedule_entry_count, err.INVALID_EVENT_ID dig 2 dup @@ -3395,33 +3401,33 @@ apply_non_cash_event: assert // check self.schedule_entry_count exists == assert // Invalid event id - // modules/actus_kernel.py:948 + // modules/actus_kernel.py:951 // self.contract_type, payload.event_type.as_uint64() dup extract 8 1 bury 12 intc_2 // 8 getbyte - // modules/actus_kernel.py:947-949 + // modules/actus_kernel.py:950-952 // self._assert_event_allowed_for_contract_type( // self.contract_type, payload.event_type.as_uint64() // ) callsub _assert_event_allowed_for_contract_type - // modules/actus_kernel.py:951 + // modules/actus_kernel.py:954 // page_index = self._schedule_page_index(self.schedule_entry_count) intc_0 // 0 bytec_3 // "schedule_entry_count" app_global_get_ex assert // check self.schedule_entry_count exists - // modules/actus_kernel.py:190 + // modules/actus_kernel.py:193 // return event_id // UInt64(cst.SCHEDULE_PAGE_SIZE) pushint 16 / - // modules/actus_kernel.py:952 + // modules/actus_kernel.py:955 // page = typ.ExecutionSchedulePage() - bytec 48 // 0x0000 + bytec 49 // 0x0000 bury 7 - // modules/actus_kernel.py:953 + // modules/actus_kernel.py:956 // if page_index in self.schedule_page: itob bytec 24 // 0x5323 @@ -3432,7 +3438,7 @@ apply_non_cash_event: box_len bury 1 bz apply_non_cash_event_after_if_else@27 - // modules/actus_kernel.py:954 + // modules/actus_kernel.py:957 // page = self.schedule_page[page_index].copy() dig 7 box_get @@ -3441,7 +3447,7 @@ apply_non_cash_event: assert // check self.schedule_page entry exists apply_non_cash_event_after_if_else@27: - // modules/actus_kernel.py:955 + // modules/actus_kernel.py:958 // assert page.length < UInt64(cst.SCHEDULE_PAGE_SIZE), err.INVALID_SCHEDULE_PAGE dig 5 dup @@ -3451,32 +3457,32 @@ apply_non_cash_event_after_if_else@27: pushint 16 < assert // Invalid schedule page - // modules/actus_kernel.py:960 + // modules/actus_kernel.py:963 // scheduled_time=payload.scheduled_time, dig 3 dup extract 9 8 - // modules/actus_kernel.py:961 + // modules/actus_kernel.py:964 // accrual_factor=payload.accrual_factor, dig 1 extract 17 8 - // modules/actus_kernel.py:962 + // modules/actus_kernel.py:965 // redemption_accrual_factor=payload.redemption_accrual_factor, dig 2 extract 25 8 - // modules/actus_kernel.py:963 + // modules/actus_kernel.py:966 // next_nominal_interest_rate=payload.next_nominal_interest_rate, dig 3 extract 41 8 - // modules/actus_kernel.py:964 + // modules/actus_kernel.py:967 // next_principal_redemption=payload.next_principal_redemption, dig 4 extract 49 8 - // modules/actus_kernel.py:965 + // modules/actus_kernel.py:968 // next_outstanding_principal=payload.next_outstanding_principal, uncover 5 extract 57 8 - // modules/actus_kernel.py:957-967 + // modules/actus_kernel.py:960-970 // typ.ExecutionScheduleEntry( // event_id=payload.event_id, // event_type=payload.event_type, @@ -3507,7 +3513,7 @@ apply_non_cash_event_after_if_else@27: dig 3 itob concat - // modules/actus_kernel.py:956-968 + // modules/actus_kernel.py:959-971 // page.append( // typ.ExecutionScheduleEntry( // event_id=payload.event_id, @@ -3530,7 +3536,7 @@ apply_non_cash_event_after_if_else@27: itob extract 6 2 replace2 0 - // modules/actus_kernel.py:969 + // modules/actus_kernel.py:972 // self.schedule_page[page_index] = page.copy() dig 8 dup @@ -3538,7 +3544,7 @@ apply_non_cash_event_after_if_else@27: pop swap box_put - // modules/actus_kernel.py:970 + // modules/actus_kernel.py:973 // self.schedule_entry_count += UInt64(1) intc_0 // 0 bytec_3 // "schedule_entry_count" @@ -3551,7 +3557,7 @@ apply_non_cash_event_after_if_else@27: app_global_put apply_non_cash_event_after_if_else@3: - // modules/actus_kernel.py:1212 + // modules/actus_kernel.py:1215 // assert event_id == self.event_cursor, err.INVALID_EVENT_CURSOR intc_0 // 0 bytec_2 // "event_cursor" @@ -3562,12 +3568,12 @@ apply_non_cash_event_after_if_else@3: uncover 2 == assert // Invalid event cursor - // modules/actus_kernel.py:1213 + // modules/actus_kernel.py:1216 // entry = self._get_schedule_entry(event_id) callsub _get_schedule_entry dup bury 8 - // modules/actus_kernel.py:1215 + // modules/actus_kernel.py:1218 // entry.event_type.as_uint64() dup extract 8 1 @@ -3576,10 +3582,10 @@ apply_non_cash_event_after_if_else@3: getbyte dup bury 6 - // modules/actus_kernel.py:364 + // modules/actus_kernel.py:367 // UInt64(enums.EVT_IED), intc_1 // 1 - // modules/actus_kernel.py:363-370 + // modules/actus_kernel.py:366-373 // return event_type in ( // UInt64(enums.EVT_IED), // UInt64(enums.EVT_PI), @@ -3591,10 +3597,10 @@ apply_non_cash_event_after_if_else@3: == bnz apply_non_cash_event_bool_true@15 dig 4 - // modules/actus_kernel.py:365 + // modules/actus_kernel.py:368 // UInt64(enums.EVT_PI), pushint 4 - // modules/actus_kernel.py:363-370 + // modules/actus_kernel.py:366-373 // return event_type in ( // UInt64(enums.EVT_IED), // UInt64(enums.EVT_PI), @@ -3606,10 +3612,10 @@ apply_non_cash_event_after_if_else@3: == bnz apply_non_cash_event_bool_true@15 dig 4 - // modules/actus_kernel.py:366 + // modules/actus_kernel.py:369 // UInt64(enums.EVT_RR), pushint 12 - // modules/actus_kernel.py:363-370 + // modules/actus_kernel.py:366-373 // return event_type in ( // UInt64(enums.EVT_IED), // UInt64(enums.EVT_PI), @@ -3621,10 +3627,10 @@ apply_non_cash_event_after_if_else@3: == bnz apply_non_cash_event_bool_true@15 dig 4 - // modules/actus_kernel.py:367 + // modules/actus_kernel.py:370 // UInt64(enums.EVT_RRF), pushint 11 - // modules/actus_kernel.py:363-370 + // modules/actus_kernel.py:366-373 // return event_type in ( // UInt64(enums.EVT_IED), // UInt64(enums.EVT_PI), @@ -3636,10 +3642,10 @@ apply_non_cash_event_after_if_else@3: == bnz apply_non_cash_event_bool_true@15 dig 4 - // modules/actus_kernel.py:368 + // modules/actus_kernel.py:371 // UInt64(enums.EVT_IPCB), pushint 18 - // modules/actus_kernel.py:363-370 + // modules/actus_kernel.py:366-373 // return event_type in ( // UInt64(enums.EVT_IED), // UInt64(enums.EVT_PI), @@ -3651,10 +3657,10 @@ apply_non_cash_event_after_if_else@3: == bnz apply_non_cash_event_bool_true@15 dig 4 - // modules/actus_kernel.py:369 + // modules/actus_kernel.py:372 // UInt64(enums.EVT_PRF), pushint 5 - // modules/actus_kernel.py:363-370 + // modules/actus_kernel.py:366-373 // return event_type in ( // UInt64(enums.EVT_IED), // UInt64(enums.EVT_PI), @@ -3670,18 +3676,18 @@ apply_non_cash_event_bool_true@15: intc_1 // 1 apply_non_cash_event_bool_merge@17: - // modules/actus_kernel.py:1214-1216 + // modules/actus_kernel.py:1217-1219 // assert self._event_is_non_cash( // entry.event_type.as_uint64() // ), err.INVALID_EVENT_TYPE assert // Invalid event type - // modules/actus_kernel.py:1217 + // modules/actus_kernel.py:1220 // assert entry.event_type != arc4.UInt8(enums.EVT_IED), err.INVALID_EVENT_TYPE dig 8 pushbytes 0x01 b!= assert // Invalid event type - // modules/actus_kernel.py:374 + // modules/actus_kernel.py:377 // return event_type in (UInt64(enums.EVT_RR), UInt64(enums.EVT_RRF)) dig 4 pushint 12 @@ -3696,7 +3702,7 @@ apply_non_cash_event_bool_true@21: intc_1 // 1 apply_non_cash_event_bool_merge@23: - // modules/actus_kernel.py:1218 + // modules/actus_kernel.py:1221 // if self._event_is_rate_reset(entry.event_type.as_uint64()): bz apply_non_cash_event_else_body@5 // modules/rbac.py:80 @@ -3707,16 +3713,16 @@ apply_non_cash_event_bool_merge@23: assert // Not authorized apply_non_cash_event_after_if_else@6: - // modules/actus_kernel.py:1222 + // modules/actus_kernel.py:1225 // self._apply_non_cash_schedule_entry(entry, payload) dig 6 dig 2 callsub _apply_non_cash_schedule_entry popn 2 - // modules/actus_kernel.py:1223 + // modules/actus_kernel.py:1226 // return Global.latest_timestamp global LatestTimestamp - // modules/actus_kernel.py:1167 + // modules/actus_kernel.py:1170 // @arc4.abimethod itob bytec_0 // 0x151f7c75 @@ -3727,7 +3733,7 @@ apply_non_cash_event_after_if_else@6: return apply_non_cash_event_else_body@5: - // modules/actus_kernel.py:1221 + // modules/actus_kernel.py:1224 // self._assert_caller_is_arranger() callsub _assert_caller_is_arranger b apply_non_cash_event_after_if_else@6 @@ -3745,7 +3751,7 @@ apply_non_cash_event_bool_false@16: append_observed_cash_event: intc_0 // 0 dup - // modules/actus_kernel.py:1225 + // modules/actus_kernel.py:1228 // @arc4.abimethod txna ApplicationArgs 1 dupn 2 @@ -3753,23 +3759,23 @@ append_observed_cash_event: pushint 65 == assert // invalid number of bytes for smart_contracts.abi_types.ObservedCashEventRequest - // modules/actus_kernel.py:143 + // modules/actus_kernel.py:146 // assert self.status != UInt64(enums.STATUS_INACTIVE), err.NOT_CONFIGURED intc_0 // 0 bytec_1 // "status" app_global_get_ex assert // check self.status exists assert // D-ASA not configured - // modules/actus_kernel.py:1254 + // modules/actus_kernel.py:1257 // self._assert_caller_is_arranger() callsub _assert_caller_is_arranger - // modules/actus_kernel.py:1255 + // modules/actus_kernel.py:1258 // self._assert_is_not_asset_defaulted() callsub _assert_is_not_asset_defaulted - // modules/actus_kernel.py:1256 + // modules/actus_kernel.py:1259 // self._assert_is_not_asset_suspended() callsub _assert_is_not_asset_suspended - // modules/actus_kernel.py:135 + // modules/actus_kernel.py:138 // return self.status == UInt64(enums.STATUS_PENDING_IED) intc_0 // 0 bytec_1 // "status" @@ -3777,11 +3783,11 @@ append_observed_cash_event: assert // check self.status exists pushint 50 == - // modules/actus_kernel.py:147 + // modules/actus_kernel.py:150 // assert not self._status_is_pending_ied(), err.PENDING_IED ! assert // IED not yet executed - // modules/actus_kernel.py:233 + // modules/actus_kernel.py:236 // return self.contract_type == UInt64(enums.CT_CLM) intc_0 // 0 bytec 10 // "contract_type" @@ -3789,10 +3795,10 @@ append_observed_cash_event: assert // check self.contract_type exists pushint 5 == - // modules/actus_kernel.py:981 + // modules/actus_kernel.py:984 // assert self._supports_observed_events(), err.OBSERVED_EVENT_REQUIRED assert // Observed event required to execute this action - // modules/actus_kernel.py:982 + // modules/actus_kernel.py:985 // assert payload.event_id == self.schedule_entry_count, err.INVALID_EVENT_ID dup intc_0 // 0 @@ -3807,7 +3813,7 @@ append_observed_cash_event: dig 1 == assert // Invalid event id - // modules/actus_kernel.py:983 + // modules/actus_kernel.py:986 // assert payload.event_type == arc4.UInt8(enums.EVT_PR), err.INVALID_EVENT_TYPE dig 1 extract 8 1 @@ -3816,7 +3822,7 @@ append_observed_cash_event: pushbytes 0x03 b== assert // Invalid event type - // modules/actus_kernel.py:984 + // modules/actus_kernel.py:987 // assert payload.flags & UInt64(enums.FLAG_CASH_EVENT), err.INVALID_ACTUS_CONFIG swap pushint 57 @@ -3826,10 +3832,10 @@ append_observed_cash_event: intc_1 // 1 & assert // Invalid ACTUS configuration - // modules/actus_kernel.py:986 + // modules/actus_kernel.py:989 // if self.schedule_entry_count > UInt64(0): bz append_observed_cash_event_after_if_else@3 - // modules/actus_kernel.py:988 + // modules/actus_kernel.py:991 // self.schedule_entry_count - UInt64(1) intc_0 // 0 bytec_3 // "schedule_entry_count" @@ -3837,12 +3843,12 @@ append_observed_cash_event: assert // check self.schedule_entry_count exists intc_1 // 1 - - // modules/actus_kernel.py:987-989 + // modules/actus_kernel.py:990-992 // previous_entry = self._get_schedule_entry( // self.schedule_entry_count - UInt64(1) // ) callsub _get_schedule_entry - // modules/actus_kernel.py:991 + // modules/actus_kernel.py:994 // previous_entry.scheduled_time <= payload.scheduled_time pushint 9 extract_uint64 @@ -3850,28 +3856,28 @@ append_observed_cash_event: pushint 9 extract_uint64 <= - // modules/actus_kernel.py:990-992 + // modules/actus_kernel.py:993-995 // assert ( // previous_entry.scheduled_time <= payload.scheduled_time // ), err.INVALID_SORTING assert // Time events must be sorted in strictly ascending order append_observed_cash_event_after_if_else@3: - // modules/actus_kernel.py:994 + // modules/actus_kernel.py:997 // page_index = self._schedule_page_index(self.schedule_entry_count) intc_0 // 0 bytec_3 // "schedule_entry_count" app_global_get_ex assert // check self.schedule_entry_count exists - // modules/actus_kernel.py:190 + // modules/actus_kernel.py:193 // return event_id // UInt64(cst.SCHEDULE_PAGE_SIZE) pushint 16 / - // modules/actus_kernel.py:995 + // modules/actus_kernel.py:998 // page = typ.ExecutionSchedulePage() - bytec 48 // 0x0000 + bytec 49 // 0x0000 bury 6 - // modules/actus_kernel.py:996 + // modules/actus_kernel.py:999 // if page_index in self.schedule_page: itob bytec 24 // 0x5323 @@ -3882,7 +3888,7 @@ append_observed_cash_event_after_if_else@3: box_len bury 1 bz append_observed_cash_event_after_if_else@5 - // modules/actus_kernel.py:997 + // modules/actus_kernel.py:1000 // page = self.schedule_page[page_index].copy() dig 5 box_get @@ -3891,7 +3897,7 @@ append_observed_cash_event_after_if_else@3: assert // check self.schedule_page entry exists append_observed_cash_event_after_if_else@5: - // modules/actus_kernel.py:998 + // modules/actus_kernel.py:1001 // assert page.length < UInt64(cst.SCHEDULE_PAGE_SIZE), err.INVALID_SCHEDULE_PAGE dig 4 dup @@ -3901,32 +3907,32 @@ append_observed_cash_event_after_if_else@5: pushint 16 < assert // Invalid schedule page - // modules/actus_kernel.py:1003 + // modules/actus_kernel.py:1006 // scheduled_time=payload.scheduled_time, dig 5 dup extract 9 8 - // modules/actus_kernel.py:1004 + // modules/actus_kernel.py:1007 // accrual_factor=payload.accrual_factor, dig 1 extract 17 8 - // modules/actus_kernel.py:1005 + // modules/actus_kernel.py:1008 // redemption_accrual_factor=payload.redemption_accrual_factor, dig 2 extract 25 8 - // modules/actus_kernel.py:1006 + // modules/actus_kernel.py:1009 // next_nominal_interest_rate=payload.next_nominal_interest_rate, dig 3 extract 33 8 - // modules/actus_kernel.py:1007 + // modules/actus_kernel.py:1010 // next_principal_redemption=payload.next_principal_redemption, dig 4 extract 41 8 - // modules/actus_kernel.py:1008 + // modules/actus_kernel.py:1011 // next_outstanding_principal=payload.next_outstanding_principal, uncover 5 extract 49 8 - // modules/actus_kernel.py:1000-1010 + // modules/actus_kernel.py:1003-1013 // typ.ExecutionScheduleEntry( // event_id=payload.event_id, // event_type=payload.event_type, @@ -3957,7 +3963,7 @@ append_observed_cash_event_after_if_else@5: dig 3 itob concat - // modules/actus_kernel.py:999-1011 + // modules/actus_kernel.py:1002-1014 // page.append( // typ.ExecutionScheduleEntry( // event_id=payload.event_id, @@ -3980,7 +3986,7 @@ append_observed_cash_event_after_if_else@5: itob extract 6 2 replace2 0 - // modules/actus_kernel.py:1012 + // modules/actus_kernel.py:1015 // self.schedule_page[page_index] = page.copy() dig 6 dup @@ -3988,7 +3994,7 @@ append_observed_cash_event_after_if_else@5: pop swap box_put - // modules/actus_kernel.py:1013 + // modules/actus_kernel.py:1016 // self.schedule_entry_count += UInt64(1) intc_0 // 0 bytec_3 // "schedule_entry_count" @@ -3999,10 +4005,47 @@ append_observed_cash_event_after_if_else@5: bytec_3 // "schedule_entry_count" swap app_global_put - // modules/actus_kernel.py:1260 + // modules/actus_kernel.py:1263 // return Global.latest_timestamp global LatestTimestamp - // modules/actus_kernel.py:1225 + // modules/actus_kernel.py:1228 + // @arc4.abimethod + itob + bytec_0 // 0x151f7c75 + swap + concat + log + intc_1 // 1 + return + + +// modules.actus_kernel.ActusKernelModule.contract_set_default_status[routing]() -> void: +contract_set_default_status: + // modules/actus_kernel.py:1265 + // @arc4.abimethod + txna ApplicationArgs 1 + dup + len + intc_1 // 1 + == + assert // invalid number of bytes for arc4.bool + intc_0 // 0 + getbit + // modules/rbac.py:74 + // assert self._role_is_active(self.trustee, Txn.sender), err.UNAUTHORIZED + bytec 26 // 0x523a54525323 + txn Sender + callsub _role_is_active + assert // Not authorized + // modules/actus_kernel.py:1278 + // self.defaulted = defaulted + bytec 47 // "defaulted" + swap + app_global_put + // modules/actus_kernel.py:1279 + // return Global.latest_timestamp + global LatestTimestamp + // modules/actus_kernel.py:1265 // @arc4.abimethod itob bytec_0 // 0x151f7c75 @@ -4015,7 +4058,7 @@ append_observed_cash_event_after_if_else@5: // modules.actus_kernel.ActusKernelModule.contract_get_state[routing]() -> void: contract_get_state: - // modules/actus_kernel.py:143 + // modules/actus_kernel.py:146 // assert self.status != UInt64(enums.STATUS_INACTIVE), err.NOT_CONFIGURED intc_0 // 0 bytec_1 // "status" @@ -4023,7 +4066,7 @@ contract_get_state: assert // check self.status exists dup assert // D-ASA not configured - // modules/actus_kernel.py:1275 + // modules/actus_kernel.py:1294 // contract_type=arc4.UInt8(self.contract_type), intc_0 // 0 bytec 10 // "contract_type" @@ -4036,85 +4079,85 @@ contract_get_state: <= assert // overflow extract 7 1 - // modules/actus_kernel.py:1277 + // modules/actus_kernel.py:1296 // total_units=self.total_units, intc_0 // 0 bytec 13 // "total_units" app_global_get_ex assert // check self.total_units exists - // modules/actus_kernel.py:1278 + // modules/actus_kernel.py:1297 // reserved_units_total=self.reserved_units_total, intc_0 // 0 bytec 11 // "reserved_units_total" app_global_get_ex assert // check self.reserved_units_total exists - // modules/actus_kernel.py:1279 + // modules/actus_kernel.py:1298 // initial_exchange_amount=self.initial_exchange_amount, intc_0 // 0 bytec 20 // "initial_exchange_amount" app_global_get_ex assert // check self.initial_exchange_amount exists - // modules/actus_kernel.py:1280 + // modules/actus_kernel.py:1299 // event_cursor=self.event_cursor, intc_0 // 0 bytec_2 // "event_cursor" app_global_get_ex assert // check self.event_cursor exists - // modules/actus_kernel.py:1281 + // modules/actus_kernel.py:1300 // schedule_entry_count=self.schedule_entry_count, intc_0 // 0 bytec_3 // "schedule_entry_count" app_global_get_ex assert // check self.schedule_entry_count exists - // modules/actus_kernel.py:1282 + // modules/actus_kernel.py:1301 // outstanding_principal=self.outstanding_principal, intc_0 // 0 bytec 4 // "outstanding_principal" app_global_get_ex assert // check self.outstanding_principal exists - // modules/actus_kernel.py:1283 + // modules/actus_kernel.py:1302 // interest_calculation_base=self.interest_calculation_base, intc_0 // 0 bytec 7 // "interest_calculation_base" app_global_get_ex assert // check self.interest_calculation_base exists - // modules/actus_kernel.py:1284 + // modules/actus_kernel.py:1303 // nominal_interest_rate=self.nominal_interest_rate, intc_0 // 0 bytec 9 // "nominal_interest_rate" app_global_get_ex assert // check self.nominal_interest_rate exists - // modules/actus_kernel.py:1285 + // modules/actus_kernel.py:1304 // accrued_interest=self.accrued_interest, intc_0 // 0 bytec 6 // "accrued_interest" app_global_get_ex assert // check self.accrued_interest exists - // modules/actus_kernel.py:1286 + // modules/actus_kernel.py:1305 // cumulative_interest_index=self.cumulative_interest_index, intc_0 // 0 bytec 16 // "cumulative_interest_index" app_global_get_ex assert // check self.cumulative_interest_index exists - // modules/actus_kernel.py:1287 + // modules/actus_kernel.py:1306 // cumulative_principal_index=self.cumulative_principal_index, intc_0 // 0 bytec 17 // "cumulative_principal_index" app_global_get_ex assert // check self.cumulative_principal_index exists - // modules/actus_kernel.py:1288 + // modules/actus_kernel.py:1307 // reserved_interest=self.reserved_interest, intc_0 // 0 bytec 15 // "reserved_interest" app_global_get_ex assert // check self.reserved_interest exists - // modules/actus_kernel.py:1289 + // modules/actus_kernel.py:1308 // reserved_principal=self.reserved_principal, intc_0 // 0 bytec 12 // "reserved_principal" app_global_get_ex assert // check self.reserved_principal exists - // modules/actus_kernel.py:1274-1290 + // modules/actus_kernel.py:1293-1309 // return typ.KernelState( // contract_type=arc4.UInt8(self.contract_type), // status=self.status, @@ -4176,7 +4219,7 @@ contract_get_state: swap itob concat - // modules/actus_kernel.py:1262 + // modules/actus_kernel.py:1281 // @arc4.abimethod(readonly=True) bytec_0 // 0x151f7c75 swap @@ -4188,14 +4231,14 @@ contract_get_state: // modules.actus_kernel.ActusKernelModule.contract_get_next_due_event[routing]() -> void: contract_get_next_due_event: - // modules/actus_kernel.py:143 + // modules/actus_kernel.py:146 // assert self.status != UInt64(enums.STATUS_INACTIVE), err.NOT_CONFIGURED intc_0 // 0 bytec_1 // "status" app_global_get_ex assert // check self.status exists assert // D-ASA not configured - // modules/actus_kernel.py:1304 + // modules/actus_kernel.py:1323 // if self.event_cursor >= self.schedule_entry_count: intc_0 // 0 bytec_2 // "event_cursor" @@ -4207,13 +4250,13 @@ contract_get_next_due_event: assert // check self.schedule_entry_count exists >= bz contract_get_next_due_event_after_if_else@3 - // modules/actus_kernel.py:1306 + // modules/actus_kernel.py:1325 // event_id=self.event_cursor, intc_0 // 0 bytec_2 // "event_cursor" app_global_get_ex assert // check self.event_cursor exists - // modules/actus_kernel.py:1305-1315 + // modules/actus_kernel.py:1324-1334 // return typ.ExecutionScheduleEntry( // event_id=self.event_cursor, // event_type=arc4.UInt8(0), @@ -4226,10 +4269,10 @@ contract_get_next_due_event: // flags=UInt64(0), // ) itob - // modules/actus_kernel.py:1307 + // modules/actus_kernel.py:1326 // event_type=arc4.UInt8(0), bytec 40 // 0x00 - // modules/actus_kernel.py:1305-1315 + // modules/actus_kernel.py:1324-1334 // return typ.ExecutionScheduleEntry( // event_id=self.event_cursor, // event_type=arc4.UInt8(0), @@ -4242,10 +4285,10 @@ contract_get_next_due_event: // flags=UInt64(0), // ) concat - // modules/actus_kernel.py:1308 + // modules/actus_kernel.py:1327 // scheduled_time=UInt64(0), intc_0 // 0 - // modules/actus_kernel.py:1305-1315 + // modules/actus_kernel.py:1324-1334 // return typ.ExecutionScheduleEntry( // event_id=self.event_cursor, // event_type=arc4.UInt8(0), @@ -4275,7 +4318,7 @@ contract_get_next_due_event: concat contract_get_next_due_event_after_inlined_modules.actus_kernel.ActusKernelModule.contract_get_next_due_event@4: - // modules/actus_kernel.py:1292 + // modules/actus_kernel.py:1311 // @arc4.abimethod(readonly=True) bytec_0 // 0x151f7c75 swap @@ -4285,14 +4328,14 @@ contract_get_next_due_event_after_inlined_modules.actus_kernel.ActusKernelModule return contract_get_next_due_event_after_if_else@3: - // modules/actus_kernel.py:1316 + // modules/actus_kernel.py:1335 // return self._get_schedule_entry(self.event_cursor) intc_0 // 0 bytec_2 // "event_cursor" app_global_get_ex assert // check self.event_cursor exists callsub _get_schedule_entry - // modules/actus_kernel.py:1292 + // modules/actus_kernel.py:1311 // @arc4.abimethod(readonly=True) b contract_get_next_due_event_after_inlined_modules.actus_kernel.ActusKernelModule.contract_get_next_due_event@4 @@ -4358,7 +4401,7 @@ rbac_set_op_daemon: callsub _assert_caller_is_arranger // modules/rbac.py:197 // self.op_daemon.value = address - bytec 26 // 0x523a4f504423 + bytec 27 // 0x523a4f504423 swap app_global_put // modules/rbac.py:198 @@ -4494,7 +4537,7 @@ rbac_assign_role_after_if_else@7: bz rbac_assign_role_after_if_else@9 // modules/rbac.py:115 // assert role_address not in self.trustee, err.INVALID_ROLE_ADDRESS - bytec 32 // 0x523a54525323 + bytec 26 // 0x523a54525323 dig 3 concat dup @@ -4659,7 +4702,7 @@ rbac_revoke_role_after_if_else@5: bz rbac_revoke_role_after_if_else@7 // modules/rbac.py:137 // assert role_address in self.trustee, err.INVALID_ROLE_ADDRESS - bytec 32 // 0x523a54525323 + bytec 26 // 0x523a54525323 dig 2 concat dup @@ -4798,7 +4841,7 @@ rbac_get_address_roles: callsub _role_is_active // modules/rbac.py:305 // self._role_is_active(self.trustee, address), - bytec 32 // 0x523a54525323 + bytec 26 // 0x523a54525323 dig 3 callsub _role_is_active // modules/rbac.py:306 @@ -4961,7 +5004,7 @@ rbac_get_role_validity_switch_case_4@6: rbac_get_role_validity_switch_case_3@5: // modules/rbac.py:347 // self.trustee, role_address - bytec 32 // 0x523a54525323 + bytec 26 // 0x523a54525323 // modules/rbac.py:55 // return role_address in role_map dig 1 @@ -5211,7 +5254,7 @@ _ensure_units_activated: box_len bury 1 assert // Invalid account holding address - // modules/actus_kernel.py:135 + // modules/actus_kernel.py:138 // return self.status == UInt64(enums.STATUS_PENDING_IED) intc_0 // 0 bytec_1 // "status" @@ -5292,12 +5335,12 @@ _ensure_units_activated_after_if_else@4: // modules.actus_kernel.ActusKernelModule._scaled_mul_div(multiplicand: uint64, multiplier: uint64, divisor: uint64) -> uint64: _scaled_mul_div: - // modules/actus_kernel.py:153-155 + // modules/actus_kernel.py:156-158 // def _scaled_mul_div( // self, multiplicand: UInt64, multiplier: UInt64, divisor: UInt64 // ) -> UInt64: proto 3 1 - // modules/actus_kernel.py:157 + // modules/actus_kernel.py:160 // if multiplicand == UInt64(0) or multiplier == UInt64(0): frame_dig -3 bz _scaled_mul_div_if_body@2 @@ -5305,18 +5348,18 @@ _scaled_mul_div: bnz _scaled_mul_div_after_if_else@3 _scaled_mul_div_if_body@2: - // modules/actus_kernel.py:158 + // modules/actus_kernel.py:161 // return UInt64(0) intc_0 // 0 retsub _scaled_mul_div_after_if_else@3: - // modules/actus_kernel.py:159 + // modules/actus_kernel.py:162 // high, low = op.mulw(multiplicand, multiplier) frame_dig -3 frame_dig -2 mulw - // modules/actus_kernel.py:160 + // modules/actus_kernel.py:163 // return op.divw(high, low, divisor) frame_dig -1 divw @@ -5325,20 +5368,20 @@ _scaled_mul_div_after_if_else@3: // modules.actus_kernel.ActusKernelModule._amount_to_index_delta(amount: uint64) -> uint64: _amount_to_index_delta: - // modules/actus_kernel.py:162 + // modules/actus_kernel.py:165 // def _amount_to_index_delta(self, amount: UInt64) -> UInt64: proto 1 1 - // modules/actus_kernel.py:164 + // modules/actus_kernel.py:167 // if amount == UInt64(0): frame_dig -1 bnz _amount_to_index_delta_after_if_else@2 - // modules/actus_kernel.py:165 + // modules/actus_kernel.py:168 // return UInt64(0) intc_0 // 0 retsub _amount_to_index_delta_after_if_else@2: - // modules/actus_kernel.py:166 + // modules/actus_kernel.py:169 // assert self.total_units > UInt64(0), err.NO_UNITS intc_0 // 0 bytec 13 // "total_units" @@ -5346,7 +5389,7 @@ _amount_to_index_delta_after_if_else@2: assert // check self.total_units exists dup assert // No D-ASA units - // modules/actus_kernel.py:167 + // modules/actus_kernel.py:170 // return self._scaled_mul_div(amount, self.fixed_point_scale, self.total_units) intc_0 // 0 bytec 5 // "fixed_point_scale" @@ -5361,32 +5404,32 @@ _amount_to_index_delta_after_if_else@2: // modules.actus_kernel.ActusKernelModule._index_delta_to_amount(index_delta: uint64) -> uint64: _index_delta_to_amount: - // modules/actus_kernel.py:169 + // modules/actus_kernel.py:172 // def _index_delta_to_amount(self, index_delta: UInt64) -> UInt64: proto 1 1 - // modules/actus_kernel.py:176 + // modules/actus_kernel.py:179 // if index_delta == UInt64(0): frame_dig -1 bnz _index_delta_to_amount_after_if_else@2 - // modules/actus_kernel.py:177 + // modules/actus_kernel.py:180 // return UInt64(0) intc_0 // 0 retsub _index_delta_to_amount_after_if_else@2: - // modules/actus_kernel.py:179 + // modules/actus_kernel.py:182 // self.total_units, intc_0 // 0 bytec 13 // "total_units" app_global_get_ex assert // check self.total_units exists - // modules/actus_kernel.py:181 + // modules/actus_kernel.py:184 // self.fixed_point_scale, intc_0 // 0 bytec 5 // "fixed_point_scale" app_global_get_ex assert // check self.fixed_point_scale exists - // modules/actus_kernel.py:178-182 + // modules/actus_kernel.py:181-185 // return self._scaled_mul_div( // self.total_units, // index_delta, @@ -5400,10 +5443,10 @@ _index_delta_to_amount_after_if_else@2: // modules.actus_kernel.ActusKernelModule._get_schedule_entry(event_id: uint64) -> bytes: _get_schedule_entry: - // modules/actus_kernel.py:202 + // modules/actus_kernel.py:205 // def _get_schedule_entry(self, event_id: UInt64) -> typ.ExecutionScheduleEntry: proto 1 1 - // modules/actus_kernel.py:204 + // modules/actus_kernel.py:207 // assert event_id < self.schedule_entry_count, err.INVALID_EVENT_ID intc_0 // 0 bytec_3 // "schedule_entry_count" @@ -5412,12 +5455,12 @@ _get_schedule_entry: frame_dig -1 > assert // Invalid event id - // modules/actus_kernel.py:190 + // modules/actus_kernel.py:193 // return event_id // UInt64(cst.SCHEDULE_PAGE_SIZE) frame_dig -1 pushint 16 / - // modules/actus_kernel.py:206 + // modules/actus_kernel.py:209 // assert page_index in self.schedule_page, err.INVALID_SCHEDULE_PAGE itob bytec 24 // 0x5323 @@ -5427,12 +5470,12 @@ _get_schedule_entry: box_len bury 1 assert // Invalid schedule page - // modules/actus_kernel.py:194 + // modules/actus_kernel.py:197 // return event_id % UInt64(cst.SCHEDULE_PAGE_SIZE) frame_dig -1 pushint 16 % - // modules/actus_kernel.py:209 + // modules/actus_kernel.py:212 // assert offset < page.length, err.INVALID_SCHEDULE_PAGE dig 1 intc_0 // 0 @@ -5442,7 +5485,7 @@ _get_schedule_entry: dig 1 > assert // Invalid schedule page - // modules/actus_kernel.py:210 + // modules/actus_kernel.py:213 // return page[offset].copy() pushint 65 * @@ -5455,67 +5498,67 @@ _get_schedule_entry: // modules.actus_kernel.ActusKernelModule._assert_event_allowed_for_contract_type(contract_type: uint64, event_type: uint64) -> void: _assert_event_allowed_for_contract_type: - // modules/actus_kernel.py:313-315 + // modules/actus_kernel.py:316-318 // def _assert_event_allowed_for_contract_type( // self, contract_type: UInt64, event_type: UInt64 // ) -> None: proto 2 0 - // modules/actus_kernel.py:254-255 + // modules/actus_kernel.py:257-258 // # Check common events first // if event_type in common_events: frame_dig -1 - // modules/actus_kernel.py:247 + // modules/actus_kernel.py:250 // UInt64(enums.EVT_IED), intc_1 // 1 - // modules/actus_kernel.py:254-255 + // modules/actus_kernel.py:257-258 // # Check common events first // if event_type in common_events: == bnz _assert_event_allowed_for_contract_type_if_body@6 frame_dig -1 - // modules/actus_kernel.py:248 + // modules/actus_kernel.py:251 // UInt64(enums.EVT_IP), intc_2 // 8 - // modules/actus_kernel.py:254-255 + // modules/actus_kernel.py:257-258 // # Check common events first // if event_type in common_events: == bnz _assert_event_allowed_for_contract_type_if_body@6 frame_dig -1 - // modules/actus_kernel.py:249 + // modules/actus_kernel.py:252 // UInt64(enums.EVT_MD), pushint 19 - // modules/actus_kernel.py:254-255 + // modules/actus_kernel.py:257-258 // # Check common events first // if event_type in common_events: == bnz _assert_event_allowed_for_contract_type_if_body@6 frame_dig -1 - // modules/actus_kernel.py:250 + // modules/actus_kernel.py:253 // UInt64(enums.EVT_RR), pushint 12 - // modules/actus_kernel.py:254-255 + // modules/actus_kernel.py:257-258 // # Check common events first // if event_type in common_events: == bnz _assert_event_allowed_for_contract_type_if_body@6 frame_dig -1 - // modules/actus_kernel.py:251 + // modules/actus_kernel.py:254 // UInt64(enums.EVT_RRF), pushint 11 - // modules/actus_kernel.py:254-255 + // modules/actus_kernel.py:257-258 // # Check common events first // if event_type in common_events: == bz _assert_event_allowed_for_contract_type_after_if_else@7 _assert_event_allowed_for_contract_type_if_body@6: - // modules/actus_kernel.py:256 + // modules/actus_kernel.py:259 // return True intc_1 // 1 _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34: - // modules/actus_kernel.py:317-319 + // modules/actus_kernel.py:320-322 // assert self._event_allowed_for_contract_type( // contract_type, event_type // ), err.INVALID_ACTUS_CONFIG @@ -5523,28 +5566,28 @@ _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.Actus retsub _assert_event_allowed_for_contract_type_after_if_else@7: - // modules/actus_kernel.py:258-259 + // modules/actus_kernel.py:261-262 // # Contract-specific additional events // if contract_type == UInt64(enums.CT_PAM): frame_dig -2 bnz _assert_event_allowed_for_contract_type_after_if_else@9 - // modules/actus_kernel.py:260-261 + // modules/actus_kernel.py:263-264 // # PAM only supports common events // return False intc_0 // 0 - // modules/actus_kernel.py:317-319 + // modules/actus_kernel.py:320-322 // assert self._event_allowed_for_contract_type( // contract_type, event_type // ), err.INVALID_ACTUS_CONFIG b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34 _assert_event_allowed_for_contract_type_after_if_else@9: - // modules/actus_kernel.py:263 + // modules/actus_kernel.py:266 // if contract_type == UInt64(enums.CT_LAM) or contract_type == UInt64( frame_dig -2 pushint 3 == - // modules/actus_kernel.py:263-265 + // modules/actus_kernel.py:266-268 // if contract_type == UInt64(enums.CT_LAM) or contract_type == UInt64( // enums.CT_NAM // ): @@ -5555,17 +5598,17 @@ _assert_event_allowed_for_contract_type_after_if_else@9: bz _assert_event_allowed_for_contract_type_after_if_else@16 _assert_event_allowed_for_contract_type_if_body@11: - // modules/actus_kernel.py:266-270 + // modules/actus_kernel.py:269-273 // # LAM/NAM add: PR, IPCB // return event_type in ( // UInt64(enums.EVT_PR), // UInt64(enums.EVT_IPCB), // ) frame_dig -1 - // modules/actus_kernel.py:268 + // modules/actus_kernel.py:271 // UInt64(enums.EVT_PR), pushint 3 - // modules/actus_kernel.py:266-270 + // modules/actus_kernel.py:269-273 // # LAM/NAM add: PR, IPCB // return event_type in ( // UInt64(enums.EVT_PR), @@ -5574,10 +5617,10 @@ _assert_event_allowed_for_contract_type_if_body@11: == bnz _assert_event_allowed_for_contract_type_bool_true@13 frame_dig -1 - // modules/actus_kernel.py:269 + // modules/actus_kernel.py:272 // UInt64(enums.EVT_IPCB), pushint 18 - // modules/actus_kernel.py:266-270 + // modules/actus_kernel.py:269-273 // # LAM/NAM add: PR, IPCB // return event_type in ( // UInt64(enums.EVT_PR), @@ -5588,7 +5631,7 @@ _assert_event_allowed_for_contract_type_if_body@11: _assert_event_allowed_for_contract_type_bool_true@13: intc_1 // 1 - // modules/actus_kernel.py:317-319 + // modules/actus_kernel.py:320-322 // assert self._event_allowed_for_contract_type( // contract_type, event_type // ), err.INVALID_ACTUS_CONFIG @@ -5596,20 +5639,20 @@ _assert_event_allowed_for_contract_type_bool_true@13: _assert_event_allowed_for_contract_type_bool_false@14: intc_0 // 0 - // modules/actus_kernel.py:317-319 + // modules/actus_kernel.py:320-322 // assert self._event_allowed_for_contract_type( // contract_type, event_type // ), err.INVALID_ACTUS_CONFIG b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34 _assert_event_allowed_for_contract_type_after_if_else@16: - // modules/actus_kernel.py:272 + // modules/actus_kernel.py:275 // if contract_type == UInt64(enums.CT_ANN): frame_dig -2 intc_1 // 1 == bz _assert_event_allowed_for_contract_type_after_if_else@23 - // modules/actus_kernel.py:273-278 + // modules/actus_kernel.py:276-281 // # ANN adds: PR, IPCB, PRF // return event_type in ( // UInt64(enums.EVT_PR), @@ -5617,10 +5660,10 @@ _assert_event_allowed_for_contract_type_after_if_else@16: // UInt64(enums.EVT_PRF), // ) frame_dig -1 - // modules/actus_kernel.py:275 + // modules/actus_kernel.py:278 // UInt64(enums.EVT_PR), pushint 3 - // modules/actus_kernel.py:273-278 + // modules/actus_kernel.py:276-281 // # ANN adds: PR, IPCB, PRF // return event_type in ( // UInt64(enums.EVT_PR), @@ -5630,10 +5673,10 @@ _assert_event_allowed_for_contract_type_after_if_else@16: == bnz _assert_event_allowed_for_contract_type_bool_true@20 frame_dig -1 - // modules/actus_kernel.py:276 + // modules/actus_kernel.py:279 // UInt64(enums.EVT_IPCB), pushint 18 - // modules/actus_kernel.py:273-278 + // modules/actus_kernel.py:276-281 // # ANN adds: PR, IPCB, PRF // return event_type in ( // UInt64(enums.EVT_PR), @@ -5643,10 +5686,10 @@ _assert_event_allowed_for_contract_type_after_if_else@16: == bnz _assert_event_allowed_for_contract_type_bool_true@20 frame_dig -1 - // modules/actus_kernel.py:277 + // modules/actus_kernel.py:280 // UInt64(enums.EVT_PRF), pushint 5 - // modules/actus_kernel.py:273-278 + // modules/actus_kernel.py:276-281 // # ANN adds: PR, IPCB, PRF // return event_type in ( // UInt64(enums.EVT_PR), @@ -5658,7 +5701,7 @@ _assert_event_allowed_for_contract_type_after_if_else@16: _assert_event_allowed_for_contract_type_bool_true@20: intc_1 // 1 - // modules/actus_kernel.py:317-319 + // modules/actus_kernel.py:320-322 // assert self._event_allowed_for_contract_type( // contract_type, event_type // ), err.INVALID_ACTUS_CONFIG @@ -5666,20 +5709,20 @@ _assert_event_allowed_for_contract_type_bool_true@20: _assert_event_allowed_for_contract_type_bool_false@21: intc_0 // 0 - // modules/actus_kernel.py:317-319 + // modules/actus_kernel.py:320-322 // assert self._event_allowed_for_contract_type( // contract_type, event_type // ), err.INVALID_ACTUS_CONFIG b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34 _assert_event_allowed_for_contract_type_after_if_else@23: - // modules/actus_kernel.py:280 + // modules/actus_kernel.py:283 // if contract_type == UInt64(enums.CT_LAX): frame_dig -2 pushint 4 == bz _assert_event_allowed_for_contract_type_after_if_else@31 - // modules/actus_kernel.py:281-287 + // modules/actus_kernel.py:284-290 // # LAX adds: PR, PI, IPCB, PRF // return event_type in ( // UInt64(enums.EVT_PR), @@ -5688,10 +5731,10 @@ _assert_event_allowed_for_contract_type_after_if_else@23: // UInt64(enums.EVT_PRF), // ) frame_dig -1 - // modules/actus_kernel.py:283 + // modules/actus_kernel.py:286 // UInt64(enums.EVT_PR), pushint 3 - // modules/actus_kernel.py:281-287 + // modules/actus_kernel.py:284-290 // # LAX adds: PR, PI, IPCB, PRF // return event_type in ( // UInt64(enums.EVT_PR), @@ -5702,10 +5745,10 @@ _assert_event_allowed_for_contract_type_after_if_else@23: == bnz _assert_event_allowed_for_contract_type_bool_true@28 frame_dig -1 - // modules/actus_kernel.py:284 + // modules/actus_kernel.py:287 // UInt64(enums.EVT_PI), pushint 4 - // modules/actus_kernel.py:281-287 + // modules/actus_kernel.py:284-290 // # LAX adds: PR, PI, IPCB, PRF // return event_type in ( // UInt64(enums.EVT_PR), @@ -5716,10 +5759,10 @@ _assert_event_allowed_for_contract_type_after_if_else@23: == bnz _assert_event_allowed_for_contract_type_bool_true@28 frame_dig -1 - // modules/actus_kernel.py:285 + // modules/actus_kernel.py:288 // UInt64(enums.EVT_IPCB), pushint 18 - // modules/actus_kernel.py:281-287 + // modules/actus_kernel.py:284-290 // # LAX adds: PR, PI, IPCB, PRF // return event_type in ( // UInt64(enums.EVT_PR), @@ -5730,10 +5773,10 @@ _assert_event_allowed_for_contract_type_after_if_else@23: == bnz _assert_event_allowed_for_contract_type_bool_true@28 frame_dig -1 - // modules/actus_kernel.py:286 + // modules/actus_kernel.py:289 // UInt64(enums.EVT_PRF), pushint 5 - // modules/actus_kernel.py:281-287 + // modules/actus_kernel.py:284-290 // # LAX adds: PR, PI, IPCB, PRF // return event_type in ( // UInt64(enums.EVT_PR), @@ -5746,7 +5789,7 @@ _assert_event_allowed_for_contract_type_after_if_else@23: _assert_event_allowed_for_contract_type_bool_true@28: intc_1 // 1 - // modules/actus_kernel.py:317-319 + // modules/actus_kernel.py:320-322 // assert self._event_allowed_for_contract_type( // contract_type, event_type // ), err.INVALID_ACTUS_CONFIG @@ -5754,36 +5797,36 @@ _assert_event_allowed_for_contract_type_bool_true@28: _assert_event_allowed_for_contract_type_bool_false@29: intc_0 // 0 - // modules/actus_kernel.py:317-319 + // modules/actus_kernel.py:320-322 // assert self._event_allowed_for_contract_type( // contract_type, event_type // ), err.INVALID_ACTUS_CONFIG b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34 _assert_event_allowed_for_contract_type_after_if_else@31: - // modules/actus_kernel.py:289 + // modules/actus_kernel.py:292 // if contract_type == UInt64(enums.CT_CLM): frame_dig -2 pushint 5 == bz _assert_event_allowed_for_contract_type_after_if_else@33 - // modules/actus_kernel.py:290-291 + // modules/actus_kernel.py:293-294 // # CLM adds: PR // return event_type == UInt64(enums.EVT_PR) frame_dig -1 pushint 3 == - // modules/actus_kernel.py:317-319 + // modules/actus_kernel.py:320-322 // assert self._event_allowed_for_contract_type( // contract_type, event_type // ), err.INVALID_ACTUS_CONFIG b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34 _assert_event_allowed_for_contract_type_after_if_else@33: - // modules/actus_kernel.py:293 + // modules/actus_kernel.py:296 // return False intc_0 // 0 - // modules/actus_kernel.py:317-319 + // modules/actus_kernel.py:320-322 // assert self._event_allowed_for_contract_type( // contract_type, event_type // ), err.INVALID_ACTUS_CONFIG @@ -5792,7 +5835,7 @@ _assert_event_allowed_for_contract_type_after_if_else@33: // modules.actus_kernel.ActusKernelModule._is_dynamic_annuity() -> uint64: _is_dynamic_annuity: - // modules/actus_kernel.py:335 + // modules/actus_kernel.py:338 // self.contract_type == UInt64(enums.CT_ANN) intc_0 // 0 bytec 10 // "contract_type" @@ -5800,22 +5843,22 @@ _is_dynamic_annuity: assert // check self.contract_type exists intc_1 // 1 == - // modules/actus_kernel.py:335-336 + // modules/actus_kernel.py:338-339 // self.contract_type == UInt64(enums.CT_ANN) // and self.dynamic_principal_redemption bz _is_dynamic_annuity_bool_false@3 - // modules/actus_kernel.py:336 + // modules/actus_kernel.py:339 // and self.dynamic_principal_redemption intc_0 // 0 bytec 34 // "dynamic_principal_redemption" app_global_get_ex assert // check self.dynamic_principal_redemption exists - // modules/actus_kernel.py:335-336 + // modules/actus_kernel.py:338-339 // self.contract_type == UInt64(enums.CT_ANN) // and self.dynamic_principal_redemption bz _is_dynamic_annuity_bool_false@3 intc_1 // 1 - // modules/actus_kernel.py:334-337 + // modules/actus_kernel.py:337-340 // return ( // self.contract_type == UInt64(enums.CT_ANN) // and self.dynamic_principal_redemption @@ -5824,7 +5867,7 @@ _is_dynamic_annuity: _is_dynamic_annuity_bool_false@3: intc_0 // 0 - // modules/actus_kernel.py:334-337 + // modules/actus_kernel.py:337-340 // return ( // self.contract_type == UInt64(enums.CT_ANN) // and self.dynamic_principal_redemption @@ -5834,45 +5877,45 @@ _is_dynamic_annuity_bool_false@3: // modules.actus_kernel.ActusKernelModule._entry_interest_segment(entry: bytes) -> uint64, bytes: _entry_interest_segment: - // modules/actus_kernel.py:380 + // modules/actus_kernel.py:383 // def _entry_interest_segment(self, entry: typ.ExecutionScheduleEntry) -> UInt64: proto 1 2 - // modules/actus_kernel.py:389 + // modules/actus_kernel.py:392 // entry.accrual_factor == UInt64(0) frame_dig -1 pushint 17 extract_uint64 dup - // modules/actus_kernel.py:389-391 + // modules/actus_kernel.py:392-394 // entry.accrual_factor == UInt64(0) // or self.nominal_interest_rate == UInt64(0) // or self.interest_calculation_base == UInt64(0) bz _entry_interest_segment_if_body@3 - // modules/actus_kernel.py:390 + // modules/actus_kernel.py:393 // or self.nominal_interest_rate == UInt64(0) intc_0 // 0 bytec 9 // "nominal_interest_rate" app_global_get_ex assert // check self.nominal_interest_rate exists - // modules/actus_kernel.py:389-391 + // modules/actus_kernel.py:392-394 // entry.accrual_factor == UInt64(0) // or self.nominal_interest_rate == UInt64(0) // or self.interest_calculation_base == UInt64(0) bz _entry_interest_segment_if_body@3 - // modules/actus_kernel.py:391 + // modules/actus_kernel.py:394 // or self.interest_calculation_base == UInt64(0) intc_0 // 0 bytec 7 // "interest_calculation_base" app_global_get_ex assert // check self.interest_calculation_base exists - // modules/actus_kernel.py:389-391 + // modules/actus_kernel.py:392-394 // entry.accrual_factor == UInt64(0) // or self.nominal_interest_rate == UInt64(0) // or self.interest_calculation_base == UInt64(0) bnz _entry_interest_segment_after_if_else@4 _entry_interest_segment_if_body@3: - // modules/actus_kernel.py:393 + // modules/actus_kernel.py:396 // return UInt64(0) intc_0 // 0 frame_dig -1 @@ -5880,38 +5923,38 @@ _entry_interest_segment_if_body@3: retsub _entry_interest_segment_after_if_else@4: - // modules/actus_kernel.py:395 + // modules/actus_kernel.py:398 // self.interest_calculation_base, intc_0 // 0 bytec 7 // "interest_calculation_base" app_global_get_ex assert // check self.interest_calculation_base exists - // modules/actus_kernel.py:396 + // modules/actus_kernel.py:399 // self.nominal_interest_rate, intc_0 // 0 bytec 9 // "nominal_interest_rate" app_global_get_ex assert // check self.nominal_interest_rate exists - // modules/actus_kernel.py:397 + // modules/actus_kernel.py:400 // self.fixed_point_scale, intc_0 // 0 bytec 5 // "fixed_point_scale" app_global_get_ex assert // check self.fixed_point_scale exists - // modules/actus_kernel.py:394-398 + // modules/actus_kernel.py:397-401 // accrued = self._scaled_mul_div( // self.interest_calculation_base, // self.nominal_interest_rate, // self.fixed_point_scale, // ) callsub _scaled_mul_div - // modules/actus_kernel.py:402 + // modules/actus_kernel.py:405 // self.fixed_point_scale, intc_0 // 0 bytec 5 // "fixed_point_scale" app_global_get_ex assert // check self.fixed_point_scale exists - // modules/actus_kernel.py:399-403 + // modules/actus_kernel.py:402-406 // return self._scaled_mul_div( // accrued, // entry.accrual_factor, @@ -5927,36 +5970,36 @@ _entry_interest_segment_after_if_else@4: // modules.actus_kernel.ActusKernelModule._discount_annuity_factor(discount_factor: uint64, redemption_factor: uint64) -> uint64: _discount_annuity_factor: - // modules/actus_kernel.py:462-466 + // modules/actus_kernel.py:465-469 // def _discount_annuity_factor( // self, // discount_factor: UInt64, // redemption_factor: UInt64, // ) -> UInt64: proto 2 1 - // modules/actus_kernel.py:468 + // modules/actus_kernel.py:471 // if redemption_factor == UInt64(0): frame_dig -1 bnz _discount_annuity_factor_after_if_else@2 - // modules/actus_kernel.py:469 + // modules/actus_kernel.py:472 // return discount_factor frame_dig -2 retsub _discount_annuity_factor_after_if_else@2: - // modules/actus_kernel.py:470 + // modules/actus_kernel.py:473 // period_rate = self.fixed_point_scale + self._scaled_mul_div( intc_0 // 0 bytec 5 // "fixed_point_scale" app_global_get_ex assert // check self.fixed_point_scale exists - // modules/actus_kernel.py:471 + // modules/actus_kernel.py:474 // self.nominal_interest_rate, intc_0 // 0 bytec 9 // "nominal_interest_rate" app_global_get_ex assert // check self.nominal_interest_rate exists - // modules/actus_kernel.py:470-474 + // modules/actus_kernel.py:473-477 // period_rate = self.fixed_point_scale + self._scaled_mul_div( // self.nominal_interest_rate, // redemption_factor, @@ -5966,17 +6009,17 @@ _discount_annuity_factor_after_if_else@2: dig 2 callsub _scaled_mul_div + - // modules/actus_kernel.py:475 + // modules/actus_kernel.py:478 // assert period_rate > UInt64(0), err.INVALID_ACTUS_CONFIG dup assert // Invalid ACTUS configuration - // modules/actus_kernel.py:478 + // modules/actus_kernel.py:481 // self.fixed_point_scale, intc_0 // 0 bytec 5 // "fixed_point_scale" app_global_get_ex assert // check self.fixed_point_scale exists - // modules/actus_kernel.py:476-480 + // modules/actus_kernel.py:479-483 // return self._scaled_mul_div( // discount_factor, // self.fixed_point_scale, @@ -5991,7 +6034,7 @@ _discount_annuity_factor_after_if_else@2: // modules.actus_kernel.ActusKernelModule._apply_non_cash_schedule_entry(entry: bytes, payload: bytes) -> bytes, bytes: _apply_non_cash_schedule_entry: - // modules/actus_kernel.py:613-615 + // modules/actus_kernel.py:616-618 // def _apply_non_cash_schedule_entry( // self, entry: typ.ExecutionScheduleEntry, payload: typ.ObservedEventRequest // ) -> None: @@ -5999,7 +6042,7 @@ _apply_non_cash_schedule_entry: intc_0 // 0 pushbytes "" dupn 8 - // modules/actus_kernel.py:623 + // modules/actus_kernel.py:626 // assert entry.event_id == self.event_cursor, err.INVALID_EVENT_CURSOR frame_dig -2 intc_0 // 0 @@ -6010,7 +6053,7 @@ _apply_non_cash_schedule_entry: assert // check self.event_cursor exists == assert // Invalid event cursor - // modules/actus_kernel.py:624 + // modules/actus_kernel.py:627 // assert entry.scheduled_time <= Global.latest_timestamp, err.NO_DUE_CASHFLOW frame_dig -2 pushint 9 @@ -6018,19 +6061,19 @@ _apply_non_cash_schedule_entry: global LatestTimestamp <= assert // No due cashflow to pay - // modules/actus_kernel.py:626 + // modules/actus_kernel.py:629 // event_type = entry.event_type.as_uint64() frame_dig -2 intc_2 // 8 getbyte dup - // modules/actus_kernel.py:627 + // modules/actus_kernel.py:630 // if event_type == UInt64(enums.EVT_IED): intc_1 // 1 == dup bz _apply_non_cash_schedule_entry_after_if_else@6 - // modules/actus_kernel.py:135 + // modules/actus_kernel.py:138 // return self.status == UInt64(enums.STATUS_PENDING_IED) intc_0 // 0 bytec_1 // "status" @@ -6038,12 +6081,12 @@ _apply_non_cash_schedule_entry: assert // check self.status exists pushint 50 == - // modules/actus_kernel.py:628-630 + // modules/actus_kernel.py:631-633 // # IED finalizes issuance: reserved units become activatable and the // # schedule's initial contractual state becomes live. // assert self._status_is_pending_ied(), err.INVALID_ACTUS_CONFIG assert // Invalid ACTUS configuration - // modules/actus_kernel.py:632 + // modules/actus_kernel.py:635 // self.reserved_units_total == self.total_units intc_0 // 0 bytec 11 // "reserved_units_total" @@ -6054,12 +6097,12 @@ _apply_non_cash_schedule_entry: app_global_get_ex assert // check self.total_units exists == - // modules/actus_kernel.py:631-633 + // modules/actus_kernel.py:634-636 // assert ( // self.reserved_units_total == self.total_units // ), err.PRIMARY_DISTRIBUTION_INCOMPLETE assert // Primary distribution is not complete - // modules/actus_kernel.py:634 + // modules/actus_kernel.py:637 // self.outstanding_principal = entry.next_outstanding_principal frame_dig -2 pushint 49 @@ -6067,12 +6110,12 @@ _apply_non_cash_schedule_entry: bytec 4 // "outstanding_principal" dig 1 app_global_put - // modules/actus_kernel.py:635 + // modules/actus_kernel.py:638 // self.interest_calculation_base = entry.next_outstanding_principal bytec 7 // "interest_calculation_base" swap app_global_put - // modules/actus_kernel.py:636 + // modules/actus_kernel.py:639 // self.nominal_interest_rate = entry.next_nominal_interest_rate frame_dig -2 pushint 33 @@ -6080,12 +6123,12 @@ _apply_non_cash_schedule_entry: bytec 9 // "nominal_interest_rate" swap app_global_put - // modules/actus_kernel.py:637 + // modules/actus_kernel.py:640 // self.accrued_interest = UInt64(0) bytec 6 // "accrued_interest" intc_0 // 0 app_global_put - // modules/actus_kernel.py:638 + // modules/actus_kernel.py:641 // self.next_principal_redemption = entry.next_principal_redemption frame_dig -2 pushint 41 @@ -6093,7 +6136,7 @@ _apply_non_cash_schedule_entry: bytec 14 // "next_principal_redemption" swap app_global_put - // modules/actus_kernel.py:639 + // modules/actus_kernel.py:642 // self.event_cursor += UInt64(1) intc_0 // 0 bytec_2 // "event_cursor" @@ -6104,22 +6147,22 @@ _apply_non_cash_schedule_entry: bytec_2 // "event_cursor" swap app_global_put - // modules/actus_kernel.py:640 + // modules/actus_kernel.py:643 // self.status = UInt64(enums.STATUS_ACTIVE) bytec_1 // "status" pushint 100 app_global_put - // modules/actus_kernel.py:451 + // modules/actus_kernel.py:454 // assert entry.event_type.as_uint64() == UInt64(enums.EVT_IED), err.NOT_EVT_IED frame_dig 11 assert // Not IED event - // modules/actus_kernel.py:452 + // modules/actus_kernel.py:455 // return self.initial_exchange_amount intc_0 // 0 bytec 20 // "initial_exchange_amount" app_global_get_ex assert // check self.initial_exchange_amount exists - // modules/actus_kernel.py:641-645 + // modules/actus_kernel.py:644-648 // self._emit_execution_event( // entry=entry, // payoff=self._entry_ied_amount(entry), @@ -6127,10 +6170,10 @@ _apply_non_cash_schedule_entry: // ) frame_dig -2 swap - // modules/actus_kernel.py:644 + // modules/actus_kernel.py:647 // settled_amount=UInt64(0), intc_0 // 0 - // modules/actus_kernel.py:641-645 + // modules/actus_kernel.py:644-648 // self._emit_execution_event( // entry=entry, // payoff=self._entry_ied_amount(entry), @@ -6139,7 +6182,7 @@ _apply_non_cash_schedule_entry: callsub _emit_execution_event dup frame_bury -2 - // modules/actus_kernel.py:646 + // modules/actus_kernel.py:649 // return frame_dig -1 frame_bury 1 @@ -6147,7 +6190,7 @@ _apply_non_cash_schedule_entry: retsub _apply_non_cash_schedule_entry_after_if_else@6: - // modules/actus_kernel.py:135 + // modules/actus_kernel.py:138 // return self.status == UInt64(enums.STATUS_PENDING_IED) intc_0 // 0 bytec_1 // "status" @@ -6155,11 +6198,11 @@ _apply_non_cash_schedule_entry_after_if_else@6: assert // check self.status exists pushint 50 == - // modules/actus_kernel.py:147 + // modules/actus_kernel.py:150 // assert not self._status_is_pending_ied(), err.PENDING_IED ! assert // IED not yet executed - // modules/actus_kernel.py:649 + // modules/actus_kernel.py:652 // self.accrued_interest += self._entry_interest_segment(entry) intc_0 // 0 bytec 6 // "accrued_interest" @@ -6172,30 +6215,30 @@ _apply_non_cash_schedule_entry_after_if_else@6: bytec 6 // "accrued_interest" swap app_global_put - // modules/actus_kernel.py:651 + // modules/actus_kernel.py:654 // if event_type == UInt64(enums.EVT_RR): frame_dig 10 pushint 12 == bz _apply_non_cash_schedule_entry_else_body@10 - // modules/actus_kernel.py:655 + // modules/actus_kernel.py:658 // payload.observed_rate, frame_dig -1 pushint 33 extract_uint64 - // modules/actus_kernel.py:656 + // modules/actus_kernel.py:659 // self.rate_reset_multiplier, intc_0 // 0 bytec 36 // "rate_reset_multiplier" app_global_get_ex assert // check self.rate_reset_multiplier exists - // modules/actus_kernel.py:657 + // modules/actus_kernel.py:660 // self.fixed_point_scale, intc_0 // 0 bytec 5 // "fixed_point_scale" app_global_get_ex assert // check self.fixed_point_scale exists - // modules/actus_kernel.py:652-658 + // modules/actus_kernel.py:655-661 // # RR derives the next rate from an observed oracle value plus the // # contract spread / multiplier terms, then enforces floor and cap. // observed_rate = self._scaled_mul_div( @@ -6204,7 +6247,7 @@ _apply_non_cash_schedule_entry_after_if_else@6: // self.fixed_point_scale, // ) callsub _scaled_mul_div - // modules/actus_kernel.py:660 + // modules/actus_kernel.py:663 // observed_rate + self.rate_reset_spread intc_0 // 0 bytec 35 // "rate_reset_spread" @@ -6212,7 +6255,7 @@ _apply_non_cash_schedule_entry_after_if_else@6: assert // check self.rate_reset_spread exists + frame_bury 6 - // modules/actus_kernel.py:741 + // modules/actus_kernel.py:744 // if self.has_rate_reset_floor and rate < self.rate_reset_floor: intc_0 // 0 bytec 38 // "has_rate_reset_floor" @@ -6220,23 +6263,23 @@ _apply_non_cash_schedule_entry_after_if_else@6: assert // check self.has_rate_reset_floor exists bz _apply_non_cash_schedule_entry_after_if_else@55 intc_0 // 0 - bytec 30 // "rate_reset_floor" + bytec 31 // "rate_reset_floor" app_global_get_ex assert // check self.rate_reset_floor exists frame_dig 6 > bz _apply_non_cash_schedule_entry_after_if_else@55 - // modules/actus_kernel.py:742 + // modules/actus_kernel.py:745 // rate = self.rate_reset_floor intc_0 // 0 - bytec 30 // "rate_reset_floor" + bytec 31 // "rate_reset_floor" app_global_get_ex swap frame_bury 6 assert // check self.rate_reset_floor exists _apply_non_cash_schedule_entry_after_if_else@55: - // modules/actus_kernel.py:743 + // modules/actus_kernel.py:746 // if self.has_rate_reset_cap and rate > self.rate_reset_cap: intc_0 // 0 bytec 39 // "has_rate_reset_cap" @@ -6244,26 +6287,26 @@ _apply_non_cash_schedule_entry_after_if_else@55: assert // check self.has_rate_reset_cap exists bz _apply_non_cash_schedule_entry_after_if_else@58 intc_0 // 0 - bytec 31 // "rate_reset_cap" + bytec 32 // "rate_reset_cap" app_global_get_ex assert // check self.rate_reset_cap exists frame_dig 6 < bz _apply_non_cash_schedule_entry_after_if_else@58 - // modules/actus_kernel.py:744 + // modules/actus_kernel.py:747 // rate = self.rate_reset_cap intc_0 // 0 - bytec 31 // "rate_reset_cap" + bytec 32 // "rate_reset_cap" app_global_get_ex swap frame_bury 6 assert // check self.rate_reset_cap exists _apply_non_cash_schedule_entry_after_if_else@58: - // modules/actus_kernel.py:659 + // modules/actus_kernel.py:662 // self.nominal_interest_rate = self._clamp_rate( bytec 9 // "nominal_interest_rate" - // modules/actus_kernel.py:659-661 + // modules/actus_kernel.py:662-664 // self.nominal_interest_rate = self._clamp_rate( // observed_rate + self.rate_reset_spread // ) @@ -6271,13 +6314,13 @@ _apply_non_cash_schedule_entry_after_if_else@58: app_global_put _apply_non_cash_schedule_entry_after_if_else@18: - // modules/actus_kernel.py:671 + // modules/actus_kernel.py:674 // if event_type == UInt64(enums.EVT_PI): frame_dig 10 pushint 4 == bz _apply_non_cash_schedule_entry_else_body@20 - // modules/actus_kernel.py:672 + // modules/actus_kernel.py:675 // self.outstanding_principal = entry.next_outstanding_principal frame_dig -2 pushint 49 @@ -6285,24 +6328,24 @@ _apply_non_cash_schedule_entry_after_if_else@18: bytec 4 // "outstanding_principal" dig 1 app_global_put - // modules/actus_kernel.py:673 + // modules/actus_kernel.py:676 // self.interest_calculation_base = entry.next_outstanding_principal bytec 7 // "interest_calculation_base" swap app_global_put _apply_non_cash_schedule_entry_after_if_else@23: - // modules/actus_kernel.py:678 + // modules/actus_kernel.py:681 // if self._is_dynamic_annuity(): callsub _is_dynamic_annuity bz _apply_non_cash_schedule_entry_else_body@29 - // modules/actus_kernel.py:679 + // modules/actus_kernel.py:682 // if event_type == UInt64(enums.EVT_PRF): frame_dig 10 pushint 5 == bz _apply_non_cash_schedule_entry_after_if_else@30 - // modules/actus_kernel.py:683 + // modules/actus_kernel.py:686 // + (self.schedule_entry_count - self.event_cursor) intc_0 // 0 bytec_3 // "schedule_entry_count" @@ -6313,22 +6356,22 @@ _apply_non_cash_schedule_entry_after_if_else@23: app_global_get_ex assert // check self.event_cursor exists - - // modules/actus_kernel.py:684 + // modules/actus_kernel.py:687 // * UInt64(cst.OP_UP_NON_CASH_PER_ENTRY_BUDGET) pushint 100 - // modules/actus_kernel.py:683-684 + // modules/actus_kernel.py:686-687 // + (self.schedule_entry_count - self.event_cursor) // * UInt64(cst.OP_UP_NON_CASH_PER_ENTRY_BUDGET) * - // modules/actus_kernel.py:682 + // modules/actus_kernel.py:685 // UInt64(cst.OP_UP_NON_CASH_BASE_BUDGET) intc 4 // 1500 - // modules/actus_kernel.py:682-684 + // modules/actus_kernel.py:685-687 // UInt64(cst.OP_UP_NON_CASH_BASE_BUDGET) // + (self.schedule_entry_count - self.event_cursor) // * UInt64(cst.OP_UP_NON_CASH_PER_ENTRY_BUDGET) + - // modules/actus_kernel.py:680-686 + // modules/actus_kernel.py:683-689 // ensure_budget( // required_budget=( // UInt64(cst.OP_UP_NON_CASH_BASE_BUDGET) @@ -6338,7 +6381,7 @@ _apply_non_cash_schedule_entry_after_if_else@23: // ) intc_0 // 0 callsub ensure_budget - // modules/actus_kernel.py:490 + // modules/actus_kernel.py:493 // discount_factor = self.fixed_point_scale intc_0 // 0 bytec 5 // "fixed_point_scale" @@ -6346,15 +6389,15 @@ _apply_non_cash_schedule_entry_after_if_else@23: swap frame_bury 2 assert // check self.fixed_point_scale exists - // modules/actus_kernel.py:491 + // modules/actus_kernel.py:494 // denominator = UInt64(0) intc_0 // 0 frame_bury 1 - // modules/actus_kernel.py:492 + // modules/actus_kernel.py:495 // skip_first_redemption = False intc_0 // 0 frame_bury 7 - // modules/actus_kernel.py:494 + // modules/actus_kernel.py:497 // if entry.redemption_accrual_factor > UInt64(0): frame_dig -2 pushint 25 @@ -6362,7 +6405,7 @@ _apply_non_cash_schedule_entry_after_if_else@23: dup frame_bury 8 bz _apply_non_cash_schedule_entry_after_if_else@35 - // modules/actus_kernel.py:495-499 + // modules/actus_kernel.py:498-502 // # An initial PRF may describe the first redemption period directly. // discount_factor = self._discount_annuity_factor( // discount_factor, @@ -6373,14 +6416,14 @@ _apply_non_cash_schedule_entry_after_if_else@23: callsub _discount_annuity_factor dup frame_bury 2 - // modules/actus_kernel.py:501 + // modules/actus_kernel.py:504 // skip_first_redemption = True intc_1 // 1 frame_bury 7 frame_bury 1 _apply_non_cash_schedule_entry_after_if_else@35: - // modules/actus_kernel.py:503 + // modules/actus_kernel.py:506 // future_event_id = self.event_cursor + UInt64(1) intc_0 // 0 bytec_2 // "event_cursor" @@ -6391,7 +6434,7 @@ _apply_non_cash_schedule_entry_after_if_else@35: frame_bury 3 _apply_non_cash_schedule_entry_while_top@36: - // modules/actus_kernel.py:504 + // modules/actus_kernel.py:507 // while future_event_id < self.schedule_entry_count: intc_0 // 0 bytec_3 // "schedule_entry_count" @@ -6400,45 +6443,45 @@ _apply_non_cash_schedule_entry_while_top@36: frame_dig 3 > bz _apply_non_cash_schedule_entry_after_while@48 - // modules/actus_kernel.py:505 + // modules/actus_kernel.py:508 // future_entry = self._get_schedule_entry(future_event_id) frame_dig 3 callsub _get_schedule_entry dup frame_bury 0 - // modules/actus_kernel.py:506 + // modules/actus_kernel.py:509 // future_event_type = future_entry.event_type.as_uint64() intc_2 // 8 getbyte dup frame_bury 4 - // modules/actus_kernel.py:507-508 + // modules/actus_kernel.py:510-511 // # Only redemption-bearing events contribute to the annuity denominator. // is_redemption_event = future_event_type == UInt64(enums.EVT_PR) or ( pushint 3 == - // modules/actus_kernel.py:507-511 + // modules/actus_kernel.py:510-514 // # Only redemption-bearing events contribute to the annuity denominator. // is_redemption_event = future_event_type == UInt64(enums.EVT_PR) or ( // future_event_type == UInt64(enums.EVT_MD) // and future_entry.redemption_accrual_factor > UInt64(0) // ) bnz _apply_non_cash_schedule_entry_bool_true@40 - // modules/actus_kernel.py:509 + // modules/actus_kernel.py:512 // future_event_type == UInt64(enums.EVT_MD) frame_dig 4 pushint 19 == - // modules/actus_kernel.py:509-510 + // modules/actus_kernel.py:512-513 // future_event_type == UInt64(enums.EVT_MD) // and future_entry.redemption_accrual_factor > UInt64(0) bz _apply_non_cash_schedule_entry_bool_false@41 - // modules/actus_kernel.py:510 + // modules/actus_kernel.py:513 // and future_entry.redemption_accrual_factor > UInt64(0) frame_dig 0 pushint 25 extract_uint64 - // modules/actus_kernel.py:509-510 + // modules/actus_kernel.py:512-513 // future_event_type == UInt64(enums.EVT_MD) // and future_entry.redemption_accrual_factor > UInt64(0) bz _apply_non_cash_schedule_entry_bool_false@41 @@ -6447,20 +6490,20 @@ _apply_non_cash_schedule_entry_bool_true@40: intc_1 // 1 _apply_non_cash_schedule_entry_bool_merge@42: - // modules/actus_kernel.py:512 + // modules/actus_kernel.py:515 // if is_redemption_event: bz _apply_non_cash_schedule_entry_after_if_else@47 - // modules/actus_kernel.py:513 + // modules/actus_kernel.py:516 // if skip_first_redemption: frame_dig 7 bz _apply_non_cash_schedule_entry_else_body@45 - // modules/actus_kernel.py:514 + // modules/actus_kernel.py:517 // skip_first_redemption = False intc_0 // 0 frame_bury 7 _apply_non_cash_schedule_entry_after_if_else@47: - // modules/actus_kernel.py:521 + // modules/actus_kernel.py:524 // future_event_id += UInt64(1) frame_dig 3 intc_1 // 1 @@ -6469,12 +6512,12 @@ _apply_non_cash_schedule_entry_after_if_else@47: b _apply_non_cash_schedule_entry_while_top@36 _apply_non_cash_schedule_entry_else_body@45: - // modules/actus_kernel.py:518 + // modules/actus_kernel.py:521 // future_entry.redemption_accrual_factor, frame_dig 0 pushint 25 extract_uint64 - // modules/actus_kernel.py:516-519 + // modules/actus_kernel.py:519-522 // discount_factor = self._discount_annuity_factor( // discount_factor, // future_entry.redemption_accrual_factor, @@ -6484,7 +6527,7 @@ _apply_non_cash_schedule_entry_else_body@45: callsub _discount_annuity_factor dup frame_bury 2 - // modules/actus_kernel.py:520 + // modules/actus_kernel.py:523 // denominator += discount_factor frame_dig 1 + @@ -6496,17 +6539,17 @@ _apply_non_cash_schedule_entry_bool_false@41: b _apply_non_cash_schedule_entry_bool_merge@42 _apply_non_cash_schedule_entry_after_while@48: - // modules/actus_kernel.py:523 + // modules/actus_kernel.py:526 // assert denominator > UInt64(0), err.INVALID_ACTUS_CONFIG frame_dig 1 assert // Invalid ACTUS configuration - // modules/actus_kernel.py:524 + // modules/actus_kernel.py:527 // numerator = self.outstanding_principal intc_0 // 0 bytec 4 // "outstanding_principal" app_global_get_ex assert // check self.outstanding_principal exists - // modules/actus_kernel.py:525 + // modules/actus_kernel.py:528 // if entry.flags & UInt64(enums.FLAG_INITIAL_PRF) == UInt64(0): frame_dig -2 pushint 57 @@ -6514,7 +6557,7 @@ _apply_non_cash_schedule_entry_after_while@48: intc_2 // 8 & bnz _apply_non_cash_schedule_entry_after_if_else@50 - // modules/actus_kernel.py:526-527 + // modules/actus_kernel.py:529-530 // # Subsequent PRF events amortize both principal and already accrued carry. // numerator += self.accrued_interest intc_0 // 0 @@ -6524,13 +6567,13 @@ _apply_non_cash_schedule_entry_after_while@48: + _apply_non_cash_schedule_entry_after_if_else@50: - // modules/actus_kernel.py:530 + // modules/actus_kernel.py:533 // self.fixed_point_scale, intc_0 // 0 bytec 5 // "fixed_point_scale" app_global_get_ex assert // check self.fixed_point_scale exists - // modules/actus_kernel.py:528-532 + // modules/actus_kernel.py:531-535 // return self._scaled_mul_div( // numerator, // self.fixed_point_scale, @@ -6538,10 +6581,10 @@ _apply_non_cash_schedule_entry_after_if_else@50: // ) frame_dig 1 callsub _scaled_mul_div - // modules/actus_kernel.py:687 + // modules/actus_kernel.py:690 // self.next_principal_redemption = self._recalculate_annuity_payment( bytec 14 // "next_principal_redemption" - // modules/actus_kernel.py:687-689 + // modules/actus_kernel.py:690-692 // self.next_principal_redemption = self._recalculate_annuity_payment( // entry // ) @@ -6549,7 +6592,7 @@ _apply_non_cash_schedule_entry_after_if_else@50: app_global_put _apply_non_cash_schedule_entry_after_if_else@30: - // modules/actus_kernel.py:692 + // modules/actus_kernel.py:695 // self.event_cursor += UInt64(1) intc_0 // 0 bytec_2 // "event_cursor" @@ -6560,20 +6603,20 @@ _apply_non_cash_schedule_entry_after_if_else@30: bytec_2 // "event_cursor" swap app_global_put - // modules/actus_kernel.py:693-697 + // modules/actus_kernel.py:696-700 // self._emit_execution_event( // entry=entry, // payoff=UInt64(0), // settled_amount=UInt64(0), // ) frame_dig -2 - // modules/actus_kernel.py:695 + // modules/actus_kernel.py:698 // payoff=UInt64(0), intc_0 // 0 - // modules/actus_kernel.py:696 + // modules/actus_kernel.py:699 // settled_amount=UInt64(0), dup - // modules/actus_kernel.py:693-697 + // modules/actus_kernel.py:696-700 // self._emit_execution_event( // entry=entry, // payoff=UInt64(0), @@ -6588,7 +6631,7 @@ _apply_non_cash_schedule_entry_after_if_else@30: retsub _apply_non_cash_schedule_entry_else_body@29: - // modules/actus_kernel.py:691 + // modules/actus_kernel.py:694 // self.next_principal_redemption = entry.next_principal_redemption frame_dig -2 pushint 41 @@ -6599,13 +6642,13 @@ _apply_non_cash_schedule_entry_else_body@29: b _apply_non_cash_schedule_entry_after_if_else@30 _apply_non_cash_schedule_entry_else_body@20: - // modules/actus_kernel.py:674 + // modules/actus_kernel.py:677 // elif event_type == UInt64(enums.EVT_IPCB): frame_dig 10 pushint 18 == bz _apply_non_cash_schedule_entry_after_if_else@23 - // modules/actus_kernel.py:675-676 + // modules/actus_kernel.py:678-679 // # IPCB keeps principal unchanged and only resets the interest base. // self.interest_calculation_base = self.outstanding_principal intc_0 // 0 @@ -6618,23 +6661,23 @@ _apply_non_cash_schedule_entry_else_body@20: b _apply_non_cash_schedule_entry_after_if_else@23 _apply_non_cash_schedule_entry_else_body@10: - // modules/actus_kernel.py:662 + // modules/actus_kernel.py:665 // elif event_type == UInt64(enums.EVT_RRF): frame_dig 10 pushint 11 == bz _apply_non_cash_schedule_entry_else_body@14 - // modules/actus_kernel.py:663 + // modules/actus_kernel.py:666 // next_rate = entry.next_nominal_interest_rate frame_dig -2 pushint 33 extract_uint64 dup frame_bury 5 - // modules/actus_kernel.py:664 + // modules/actus_kernel.py:667 // if next_rate == UInt64(0): bnz _apply_non_cash_schedule_entry_after_if_else@13 - // modules/actus_kernel.py:665 + // modules/actus_kernel.py:668 // next_rate = self.rate_reset_next intc_0 // 0 bytec 37 // "rate_reset_next" @@ -6644,7 +6687,7 @@ _apply_non_cash_schedule_entry_else_body@10: assert // check self.rate_reset_next exists _apply_non_cash_schedule_entry_after_if_else@13: - // modules/actus_kernel.py:666 + // modules/actus_kernel.py:669 // self.nominal_interest_rate = next_rate bytec 9 // "nominal_interest_rate" frame_dig 5 @@ -6652,7 +6695,7 @@ _apply_non_cash_schedule_entry_after_if_else@13: b _apply_non_cash_schedule_entry_after_if_else@18 _apply_non_cash_schedule_entry_else_body@14: - // modules/actus_kernel.py:668 + // modules/actus_kernel.py:671 // if entry.next_nominal_interest_rate != UInt64(0): frame_dig -2 pushint 33 @@ -6660,7 +6703,7 @@ _apply_non_cash_schedule_entry_else_body@14: dup frame_bury 9 bz _apply_non_cash_schedule_entry_after_if_else@18 - // modules/actus_kernel.py:669 + // modules/actus_kernel.py:672 // self.nominal_interest_rate = entry.next_nominal_interest_rate bytec 9 // "nominal_interest_rate" frame_dig 9 @@ -6670,7 +6713,7 @@ _apply_non_cash_schedule_entry_else_body@14: // modules.actus_kernel.ActusKernelModule._emit_execution_event(entry: bytes, payoff: uint64, settled_amount: uint64) -> bytes: _emit_execution_event: - // modules/actus_kernel.py:703-709 + // modules/actus_kernel.py:706-712 // def _emit_execution_event( // self, // *, @@ -6679,44 +6722,44 @@ _emit_execution_event: // settled_amount: UInt64, // ) -> None: proto 3 1 - // modules/actus_kernel.py:713 + // modules/actus_kernel.py:716 // contract_id=Global.current_application_id.id, global CurrentApplicationID - // modules/actus_kernel.py:714 + // modules/actus_kernel.py:717 // event_id=entry.event_id, frame_dig -3 intc_0 // 0 extract_uint64 - // modules/actus_kernel.py:715 + // modules/actus_kernel.py:718 // event_type=entry.event_type, frame_dig -3 extract 8 1 - // modules/actus_kernel.py:716 + // modules/actus_kernel.py:719 // scheduled_time=entry.scheduled_time, frame_dig -3 extract 9 8 - // modules/actus_kernel.py:717 + // modules/actus_kernel.py:720 // applied_at=Global.latest_timestamp, global LatestTimestamp - // modules/actus_kernel.py:720 + // modules/actus_kernel.py:723 // self._payoff_sign(entry.event_type.as_uint64(), payoff) frame_dig -3 - // modules/actus_kernel.py:715 + // modules/actus_kernel.py:718 // event_type=entry.event_type, intc_2 // 8 - // modules/actus_kernel.py:720 + // modules/actus_kernel.py:723 // self._payoff_sign(entry.event_type.as_uint64(), payoff) getbyte - // modules/actus_kernel.py:749 + // modules/actus_kernel.py:752 // if payoff == UInt64(0): frame_dig -2 bnz _emit_execution_event_after_if_else@3 - // modules/actus_kernel.py:750 + // modules/actus_kernel.py:753 // return UInt64(enums.PAYOFF_SIGN_POSITIVE) intc_1 // 1 _emit_execution_event_after_inlined_modules.actus_kernel.ActusKernelModule._payoff_sign@7: - // modules/actus_kernel.py:719-721 + // modules/actus_kernel.py:722-724 // payoff_sign=arc4.UInt8( // self._payoff_sign(entry.event_type.as_uint64(), payoff) // ), @@ -6727,19 +6770,19 @@ _emit_execution_event_after_inlined_modules.actus_kernel.ActusKernelModule._payo <= assert // overflow extract 7 1 - // modules/actus_kernel.py:723 + // modules/actus_kernel.py:726 // currency_id=self.settlement_asset_id, intc_0 // 0 bytec 19 // "settlement_asset_id" app_global_get_ex assert // check self.settlement_asset_id exists - // modules/actus_kernel.py:724 + // modules/actus_kernel.py:727 // sequence=entry.event_id + UInt64(1), frame_dig 1 dup intc_1 // 1 + - // modules/actus_kernel.py:712-725 + // modules/actus_kernel.py:715-728 // ExecutionEvent( // contract_id=Global.current_application_id.id, // event_id=entry.event_id, @@ -6780,7 +6823,7 @@ _emit_execution_event_after_inlined_modules.actus_kernel.ActusKernelModule._payo swap itob concat - // modules/actus_kernel.py:711-726 + // modules/actus_kernel.py:714-729 // arc4.emit( // ExecutionEvent( // contract_id=Global.current_application_id.id, @@ -6806,7 +6849,7 @@ _emit_execution_event_after_inlined_modules.actus_kernel.ActusKernelModule._payo retsub _emit_execution_event_after_if_else@3: - // modules/actus_kernel.py:751 + // modules/actus_kernel.py:754 // if event_type in (UInt64(enums.EVT_IED), UInt64(enums.EVT_PI)): frame_dig 5 intc_1 // 1 @@ -6818,18 +6861,18 @@ _emit_execution_event_after_if_else@3: bz _emit_execution_event_after_if_else@6 _emit_execution_event_if_body@5: - // modules/actus_kernel.py:752 + // modules/actus_kernel.py:755 // return UInt64(enums.PAYOFF_SIGN_POSITIVE) intc_1 // 1 - // modules/actus_kernel.py:720 + // modules/actus_kernel.py:723 // self._payoff_sign(entry.event_type.as_uint64(), payoff) b _emit_execution_event_after_inlined_modules.actus_kernel.ActusKernelModule._payoff_sign@7 _emit_execution_event_after_if_else@6: - // modules/actus_kernel.py:753 + // modules/actus_kernel.py:756 // return UInt64(enums.PAYOFF_SIGN_NEGATIVE) pushint 255 - // modules/actus_kernel.py:720 + // modules/actus_kernel.py:723 // self._payoff_sign(entry.event_type.as_uint64(), payoff) b _emit_execution_event_after_inlined_modules.actus_kernel.ActusKernelModule._payoff_sign@7 diff --git a/src/artifacts/DASA.arc56.json b/src/artifacts/DASA.arc56.json index f45774cb..4e4c4c13 100644 --- a/src/artifacts/DASA.arc56.json +++ b/src/artifacts/DASA.arc56.json @@ -965,6 +965,29 @@ "events": [], "recommendations": {} }, + { + "name": "contract_set_default_status", + "args": [ + { + "type": "bool", + "name": "defaulted", + "desc": "Default status" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Set D-ASA default status", + "events": [], + "recommendations": {} + }, { "name": "contract_get_state", "args": [], @@ -1239,7 +1262,7 @@ "state": { "schema": { "global": { - "ints": 37, + "ints": 38, "bytes": 4 }, "local": { @@ -1434,6 +1457,11 @@ "valueType": "AVMUint64", "key": "c2NoZWR1bGVfZW50cnlfY291bnQ=" }, + "defaulted": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "ZGVmYXVsdGVk" + }, "fixed_point_scale": { "keyType": "AVMString", "valueType": "AVMUint64", @@ -1494,817 +1522,819 @@ "sourceInfo": [ { "pc": [ - 2648 + 2669 ], "errorMessage": "ACTUS event not yet executed" }, { "pc": [ - 2406 + 2427 ], "errorMessage": "Can not distribute zero units" }, { "pc": [ - 3149, - 3156, - 3529 + 3170, + 3177, + 3550 ], "errorMessage": "D-ASA already configured" }, { "pc": [ - 1255, - 1987, - 2366, - 2512, - 3746, - 3892, - 4243, - 4474, - 4620 + 1276, + 2008, + 2387, + 2533, + 3767, + 3913, + 4264, + 4526, + 4672 ], "errorMessage": "D-ASA not configured" }, { "pc": [ - 3540 + 3561 ], "errorMessage": "D-ASA terms not configured" }, { "pc": [ - 6809 + 6861 ], "errorMessage": "Defaulted" }, { "pc": [ - 3167 + 3188 ], "errorMessage": "Denomination asset is not properly set" }, { "pc": [ - 3182 + 3203 ], "errorMessage": "Different settlement asset not supported, must be equal to denomination asset" }, { "pc": [ - 3418, - 3425, - 3427 + 3439, + 3446, + 3448 ], "errorMessage": "IED must be set in the future" }, { "pc": [ - 1273, - 2056, - 2527, - 4261, - 6161 + 1294, + 2077, + 2548, + 4282, + 6213 ], "errorMessage": "IED not yet executed" }, { "pc": [ - 2419, - 5544 + 2440, + 5596 ], "errorMessage": "Insufficient remaining D-ASA units" }, { "pc": [ - 2622, - 2688 + 2643, + 2709 ], "errorMessage": "Insufficient sender units to transfer" }, { "pc": [ - 1883, - 3069, - 3087, - 3143, - 3620, - 3656, - 4308, - 5728, - 6006, - 6066, - 6469 + 1904, + 3090, + 3108, + 3164, + 3641, + 3677, + 4329, + 5780, + 6058, + 6118, + 6521 ], "errorMessage": "Invalid ACTUS configuration" }, { "pc": [ - 1996, - 2400, - 2583, - 2598, - 2755, - 2828, - 2891, - 2933, - 5356, - 5481 + 2017, + 2421, + 2604, + 2619, + 2776, + 2849, + 2912, + 2954, + 5408, + 5533 ], "errorMessage": "Invalid account holding address" }, { "pc": [ - 4811, - 4835, - 4859, - 4883, - 4907, - 4964, - 4992, - 5014, - 5036, - 5058, - 5237, - 5255, - 5270, - 5285, - 5300 + 4863, + 4887, + 4911, + 4935, + 4959, + 5016, + 5044, + 5066, + 5088, + 5110, + 5289, + 5307, + 5322, + 5337, + 5352 ], "errorMessage": "Invalid account role address" }, { "pc": [ - 3129 + 3150 ], "errorMessage": "Invalid day-count convention ID" }, { "pc": [ - 1386, - 3767, - 4095, - 6038 + 1407, + 3788, + 4116, + 6090 ], "errorMessage": "Invalid event cursor" }, { "pc": [ - 3605, - 3668, - 3944, - 4285, - 5644 + 3626, + 3689, + 3965, + 4306, + 5696 ], "errorMessage": "Invalid event id" }, { "pc": [ - 3780, - 4159, - 4166, - 4298 + 3801, + 4180, + 4187, + 4319 ], "errorMessage": "Invalid event type" }, { "pc": [ - 4948, - 5227, - 6879 + 5000, + 5279, + 6931 ], "errorMessage": "Invalid role identifier" }, { "pc": [ - 3534, - 3680, - 3688, - 3997, - 4372, - 5659, - 5675 + 3555, + 3701, + 3709, + 4018, + 4393, + 5711, + 5727 ], "errorMessage": "Invalid schedule page" }, { "pc": [ - 5592 + 5644 ], "errorMessage": "No D-ASA units" }, { "pc": [ - 1392, - 1912, - 2093, - 6047 + 1413, + 1933, + 2114, + 6099 ], "errorMessage": "No due cashflow to pay" }, { "pc": [ - 6130 + 6182 ], "errorMessage": "Not IED event" }, { "pc": [ - 2041, - 2374, - 2570, - 2745, - 2801, - 2811, - 2897, - 4194, - 5081, - 6801 + 2062, + 2395, + 2591, + 2766, + 2822, + 2832, + 2918, + 4215, + 4507, + 5133, + 6853 ], "errorMessage": "Not authorized" }, { "pc": [ - 1513, - 1521, - 2142, - 2216, - 2225 + 1534, + 1542, + 2163, + 2237, + 2246 ], "errorMessage": "Not enough funds for the payment" }, { "pc": [ - 3917, - 3930, - 4270 + 3938, + 3951, + 4291 ], "errorMessage": "Observed event required to execute this action" }, { "pc": [ - 2388, - 2436 + 2409, + 2457 ], "errorMessage": "Primary distribution is closed" }, { "pc": [ - 6078 + 6130 ], "errorMessage": "Primary distribution is not complete" }, { "pc": [ - 2611 + 2632 ], "errorMessage": "Sender and receiver must be different" }, { "pc": [ - 5342, - 6817 + 5394, + 6869 ], "errorMessage": "Suspended operations" }, { "pc": [ - 2323, - 3646, - 4330 + 2344, + 3667, + 4351 ], "errorMessage": "Time events must be sorted in strictly ascending order" }, { "pc": [ - 2544, - 2561 + 2565, + 2582 ], "errorMessage": "Transfer is closed" }, { "pc": [ - 2615 + 2636 ], "errorMessage": "Transfer units must be greater than zero" }, { "pc": [ - 939 + 953 ], "errorMessage": "Wrong Global Bytes allocation" }, { "pc": [ - 945 + 959 ], "errorMessage": "Wrong Global UInts allocation" }, { "pc": [ - 949 + 963 ], "errorMessage": "Wrong Local Bytes allocation" }, { "pc": [ - 953 + 967 ], "errorMessage": "Wrong Local UInts allocation" }, { "pc": [ - 1494, - 2135 + 1515, + 2156 ], "errorMessage": "account opted into asset" }, { "pc": [ - 6761, - 6776 + 6813, + 6828 ], "errorMessage": "check BoxMap entry exists" }, { "pc": [ - 2032, - 2070, - 2111, - 2149, - 2440, - 2618, - 2677, - 2703, - 5336, - 5502 + 2053, + 2091, + 2132, + 2170, + 2461, + 2639, + 2698, + 2724, + 5388, + 5554 ], "errorMessage": "check self.account entry exists" }, { "pc": [ - 1575, - 1807, - 1895, - 4531, - 6166, - 6489 + 1596, + 1828, + 1916, + 4583, + 6218, + 6541 ], "errorMessage": "check self.accrued_interest exists" }, { "pc": [ - 5099, - 6799 + 5151, + 6851 ], "errorMessage": "check self.arranger exists" }, { "pc": [ - 6807 + 6859 ], "errorMessage": "check self.asset_defaulted exists" }, { "pc": [ - 6815 + 6867 ], "errorMessage": "check self.asset_suspended exists" }, { "pc": [ - 3077, - 3523, - 3913, - 3925, - 4266, - 4479, - 5890 + 3098, + 3544, + 3934, + 3946, + 4287, + 4531, + 5942 ], "errorMessage": "check self.contract_type exists" }, { "pc": [ - 1543, - 4536, - 5364, - 5442 + 1564, + 4588, + 5416, + 5494 ], "errorMessage": "check self.cumulative_interest_index exists" }, { "pc": [ - 1555, - 4541, - 5375, - 5450 + 1576, + 4593, + 5427, + 5502 ], "errorMessage": "check self.cumulative_principal_index exists" }, { "pc": [ - 5900 + 5952 ], "errorMessage": "check self.dynamic_principal_redemption exists" }, { "pc": [ - 1311, - 1323, - 1384, - 1626, - 2626, - 2638, - 3759, - 4088, - 4507, - 4624, - 4636, - 4673, - 5457, - 6036, - 6118, - 6315, - 6370, - 6508 + 1332, + 1344, + 1405, + 1647, + 2647, + 2659, + 3780, + 4109, + 4559, + 4676, + 4688, + 4725, + 5509, + 6088, + 6170, + 6367, + 6422, + 6560 ], "errorMessage": "check self.event_cursor exists" }, { "pc": [ - 5390, - 5404, - 5597, - 5626, - 5956, - 5964, - 5991, - 6011, - 6201, - 6334, - 6495 + 5442, + 5456, + 5649, + 5678, + 6008, + 6016, + 6043, + 6063, + 6253, + 6386, + 6547 ], "errorMessage": "check self.fixed_point_scale exists" }, { "pc": [ - 6244 + 6296 ], "errorMessage": "check self.has_rate_reset_cap exists" }, { "pc": [ - 6217 + 6269 ], "errorMessage": "check self.has_rate_reset_floor exists" }, { "pc": [ - 3154, - 3539, - 4503, - 6135 + 3175, + 3560, + 4555, + 6187 ], "errorMessage": "check self.initial_exchange_amount exists" }, { "pc": [ - 2424, - 2434 + 2445, + 2455 ], "errorMessage": "check self.initial_exchange_date exists" }, { "pc": [ - 1751, - 4521, - 5932, - 5946 + 1772, + 4573, + 5984, + 5998 ], "errorMessage": "check self.interest_calculation_base exists" }, { "pc": [ - 1823, - 1838 + 1844, + 1859 ], "errorMessage": "check self.next_principal_redemption exists" }, { "pc": [ - 4526, - 5924, - 5951, - 5996 + 4578, + 5976, + 6003, + 6048 ], "errorMessage": "check self.nominal_interest_rate exists" }, { "pc": [ - 2001, - 2014 + 2022, + 2035 ], "errorMessage": "check self.op_daemon exists" }, { "pc": [ - 1648, - 1717, - 1743, - 1797, - 1849, - 1858, - 1880, - 4516, - 6474, - 6555 + 1669, + 1738, + 1764, + 1818, + 1870, + 1879, + 1901, + 4568, + 6526, + 6607 ], "errorMessage": "check self.outstanding_principal exists" }, { "pc": [ - 6252, - 6266 + 6304, + 6318 ], "errorMessage": "check self.rate_reset_cap exists" }, { "pc": [ - 6225, - 6239 + 6277, + 6291 ], "errorMessage": "check self.rate_reset_floor exists" }, { "pc": [ - 6196 + 6248 ], "errorMessage": "check self.rate_reset_multiplier exists" }, { "pc": [ - 6589 + 6641 ], "errorMessage": "check self.rate_reset_next exists" }, { "pc": [ - 6209 + 6261 ], "errorMessage": "check self.rate_reset_spread exists" }, { "pc": [ - 1499, - 2211, - 4546 + 1520, + 2232, + 4598 ], "errorMessage": "check self.reserved_interest exists" }, { "pc": [ - 1504, - 1533, - 2221, - 2236, - 4551 + 1525, + 1554, + 2242, + 2257, + 4603 ], "errorMessage": "check self.reserved_principal exists" }, { "pc": [ - 2411, - 2459, - 4498, - 5539, - 6071 + 2432, + 2480, + 4550, + 5591, + 6123 ], "errorMessage": "check self.reserved_units_total exists" }, { "pc": [ - 1315, - 2630, - 3763, - 3942, - 3959, - 4079, - 4280, - 4315, - 4334, - 4454, - 4511, - 4628, - 5640, - 6311, - 6378 + 1336, + 2651, + 3784, + 3963, + 3980, + 4100, + 4301, + 4336, + 4355, + 4475, + 4563, + 4680, + 5692, + 6363, + 6430 ], "errorMessage": "check self.schedule_entry_count exists" }, { "pc": [ - 3987, - 4362 + 4008, + 4383 ], "errorMessage": "check self.schedule_page entry exists" }, { "pc": [ - 1491, - 2101, - 2129, - 6661 + 1512, + 2122, + 2150, + 6713 ], "errorMessage": "check self.settlement_asset_id exists" }, { "pc": [ - 1254, - 1268, - 1986, - 2051, - 2365, - 2384, - 2511, - 2522, - 2805, - 3147, - 3527, - 3745, - 3891, - 4242, - 4256, - 4472, - 4619, - 5485, - 6062, - 6156 + 1275, + 1289, + 2007, + 2072, + 2386, + 2405, + 2532, + 2543, + 2826, + 3168, + 3548, + 3766, + 3912, + 4263, + 4277, + 4524, + 4671, + 5537, + 6114, + 6208 ], "errorMessage": "check self.status exists" }, { "pc": [ - 2417, - 2470, - 4493, - 5590, - 5621, - 6076 + 2438, + 2491, + 4545, + 5642, + 5673, + 6128 ], "errorMessage": "check self.total_units exists" }, { "pc": [ - 2549, - 2559 + 2570, + 2580 ], "errorMessage": "check self.transfer_closure_date exists" }, { "pc": [ - 2532, - 2540 + 2553, + 2561 ], "errorMessage": "check self.transfer_opening_date exists" }, { "pc": [ - 3582, - 3639 + 3603, + 3660 ], "errorMessage": "index access is out of bounds" }, { "pc": [ - 1970, - 3014, - 3497, - 3992, - 4367 + 1991, + 3035, + 3518, + 4013, + 4388 ], "errorMessage": "invalid array length header" }, { "pc": [ - 2735, - 3485, - 5071 + 2756, + 3506, + 4497, + 5123 ], "errorMessage": "invalid number of bytes for arc4.bool" }, { "pc": [ - 1978 + 1999 ], "errorMessage": "invalid number of bytes for arc4.dynamic_array" }, { "pc": [ - 3512 + 3533 ], "errorMessage": "invalid number of bytes for arc4.dynamic_array" }, { "pc": [ - 1964, - 2349, - 2489, - 2497, - 2727, - 2785, - 2793, - 2873, - 2881, - 2924, - 2949, - 4692, - 4716, - 4750, - 4931, - 5113, - 5197 + 1985, + 2370, + 2510, + 2518, + 2748, + 2806, + 2814, + 2894, + 2902, + 2945, + 2970, + 4744, + 4768, + 4802, + 4983, + 5165, + 5249 ], "errorMessage": "invalid number of bytes for arc4.static_array" }, { "pc": [ - 1249, - 2307, - 2316, - 2357, - 2506, - 3475, - 3876 + 1270, + 2328, + 2337, + 2378, + 2527, + 3496, + 3897 ], "errorMessage": "invalid number of bytes for arc4.uint64" }, { "pc": [ - 4740, - 4921, - 5187 + 4792, + 4973, + 5239 ], "errorMessage": "invalid number of bytes for arc4.uint8" }, { "pc": [ - 2986 + 3007 ], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.InitialKernelState" }, { "pc": [ - 2975 + 2996 ], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.NormalizedActusTerms" }, { "pc": [ - 4238 + 4259 ], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.ObservedCashEventRequest" }, { "pc": [ - 3887 + 3908 ], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.ObservedEventRequest" }, { "pc": [ - 3019 + 3040 ], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.Prospectus" }, { "pc": [ - 4761 + 4813 ], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.RoleValidity" }, { "pc": [ - 3003 + 3024 ], "errorMessage": "invalid tail pointer at index 1 of (uint8[32],(len+utf8[]))" }, { "pc": [ - 2998 + 3019 ], "errorMessage": "invalid tuple encoding" }, { "pc": [ - 4059, - 4434 + 4080, + 4455 ], "errorMessage": "max array length exceeded" }, { "pc": [ - 4485, - 6653 + 4537, + 6705 ], "errorMessage": "overflow" } @@ -2317,11 +2347,11 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCAzMiAxNTAwCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUgInN0YXR1cyIgImV2ZW50X2N1cnNvciIgInNjaGVkdWxlX2VudHJ5X2NvdW50IiAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIiAiZml4ZWRfcG9pbnRfc2NhbGUiICJhY2NydWVkX2ludGVyZXN0IiAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIgMHg0MTIzICJub21pbmFsX2ludGVyZXN0X3JhdGUiICJjb250cmFjdF90eXBlIiAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiICJyZXNlcnZlZF9wcmluY2lwYWwiICJ0b3RhbF91bml0cyIgIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iICJyZXNlcnZlZF9pbnRlcmVzdCIgImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIgMHg1MjNhNDE1MjUyMjMgInNldHRsZW1lbnRfYXNzZXRfaWQiICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIgMHg1MjNhNDE1NTU0MjMgMHg1MjNhNTA1OTQ0MjMgMHg1MjNhNGQ0ZTQ3MjMgMHg1MzIzIDB4NTIzYTRkNGY0MzIzIDB4NTIzYTRmNTA0NDIzICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiICJ0cmFuc2Zlcl9vcGVuaW5nX2RhdGUiICJ0cmFuc2Zlcl9jbG9zdXJlX2RhdGUiICJyYXRlX3Jlc2V0X2Zsb29yIiAicmF0ZV9yZXNldF9jYXAiIDB4NTIzYTU0NTI1MzIzICJhc3NldF9zdXNwZW5kZWQiICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIiAicmF0ZV9yZXNldF9zcHJlYWQiICJyYXRlX3Jlc2V0X211bHRpcGxpZXIiICJyYXRlX3Jlc2V0X25leHQiICJoYXNfcmF0ZV9yZXNldF9mbG9vciIgImhhc19yYXRlX3Jlc2V0X2NhcCIgMHgwMCAiYXNzZXRfZGVmYXVsdGVkIiAicHJvc3BlY3R1c19oYXNoIiAicHJvc3BlY3R1c191cmwiICJkZW5vbWluYXRpb25fYXNzZXRfaWQiICJtYXR1cml0eV9kYXRlIiAiZGF5X2NvdW50X2NvbnZlbnRpb24iIDB4MDY4MTAxIDB4MDAwMAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4LTI5CiAgICAvLyAjIFJCQUMgUm9sZXMKICAgIC8vIHNlbGYuYXJyYW5nZXIgPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX0FSUkFOR0VSKQogICAgYnl0ZWMgMTggLy8gMHg1MjNhNDE1MjUyMjMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMAogICAgLy8gc2VsZi5vcF9kYWVtb24gPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX09QX0RBRU1PTikKICAgIGJ5dGVjIDI2IC8vIDB4NTIzYTRmNTA0NDIzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NDctNDgKICAgIC8vICMgRC1BU0EgR292ZXJuYW5jZQogICAgLy8gc2VsZi5hc3NldF9zdXNwZW5kZWQgPSBGYWxzZQogICAgYnl0ZWMgMzMgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjQ5CiAgICAvLyBzZWxmLmFzc2V0X2RlZmF1bHRlZCA9IEZhbHNlCiAgICBieXRlYyA0MSAvLyAiYXNzZXRfZGVmYXVsdGVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1Ni01NwogICAgLy8gIyBDb250cmFjdAogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKQogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OAogICAgLy8gc2VsZi5jb250cmFjdF90eXBlID0gVUludDY0KCkKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MC02MQogICAgLy8gIyBQcm9zcGVjdHVzIChJbmZvcm1hdGlvbmFsKQogICAgLy8gc2VsZi5wcm9zcGVjdHVzX2hhc2ggPSBCeXRlcygpCiAgICBieXRlYyA0MiAvLyAicHJvc3BlY3R1c19oYXNoIgogICAgcHVzaGJ5dGVzIDB4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjIKICAgIC8vIHNlbGYucHJvc3BlY3R1c191cmwgPSBTdHJpbmcoKQogICAgYnl0ZWMgNDMgLy8gInByb3NwZWN0dXNfdXJsIgogICAgcHVzaGJ5dGVzICIiCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjQtNjUKICAgIC8vICMgRGVub21pbmF0aW9uCiAgICAvLyBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCA9IEFzc2V0KCkKICAgIGJ5dGVjIDQ0IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBBc3NldCgpCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjgtNjkKICAgIC8vICMgVGltZQogICAgLy8gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGUgPSB0eXAuVGltZVN0YW1wKCkKICAgIGJ5dGVjIDI3IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcwCiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSB0eXAuVGltZVN0YW1wKCkKICAgIGJ5dGVjIDQ1IC8vICJtYXR1cml0eV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MQogICAgLy8gc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgPSB0eXAuVGltZVN0YW1wKCkKICAgIGJ5dGVjIDI4IC8vICJ0cmFuc2Zlcl9vcGVuaW5nX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcyCiAgICAvLyBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgMjkgLy8gInRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzQtNzUKICAgIC8vICMgRGF5IENvdW50IENvbnZlbnRpb24KICAgIC8vIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPSBVSW50NjQoKQogICAgYnl0ZWMgNDYgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3Ny03OAogICAgLy8gIyBVbml0cwogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IFVJbnQ2NCgpCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc5CiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID0gVUludDY0KCkKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODEtODIKICAgIC8vICMgUHJpbmNpcGFsCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID0gVUludDY0KCkKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODMKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gVUludDY0KCkKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODUKICAgIC8vIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiA9IEZhbHNlCiAgICBieXRlYyAzNCAvLyAiZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODctODgKICAgIC8vICMgSW50ZXJlc3QKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OQogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ID0gVUludDY0KCkKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkxLTkyCiAgICAvLyAjIEludGVyZXN0IFJhdGVzCiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzCiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkID0gVUludDY0KCkKICAgIGJ5dGVjIDM1IC8vICJyYXRlX3Jlc2V0X3NwcmVhZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9tdWx0aXBsaWVyID0gVUludDY0KCkKICAgIGJ5dGVjIDM2IC8vICJyYXRlX3Jlc2V0X211bHRpcGxpZXIiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfZmxvb3IgPSBVSW50NjQoKQogICAgYnl0ZWMgMzAgLy8gInJhdGVfcmVzZXRfZmxvb3IiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfY2FwID0gVUludDY0KCkKICAgIGJ5dGVjIDMxIC8vICJyYXRlX3Jlc2V0X2NhcCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTcKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9uZXh0ID0gVUludDY0KCkKICAgIGJ5dGVjIDM3IC8vICJyYXRlX3Jlc2V0X25leHQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4CiAgICAvLyBzZWxmLmhhc19yYXRlX3Jlc2V0X2Zsb29yID0gRmFsc2UKICAgIGJ5dGVjIDM4IC8vICJoYXNfcmF0ZV9yZXNldF9mbG9vciIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTkKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwID0gRmFsc2UKICAgIGJ5dGVjIDM5IC8vICJoYXNfcmF0ZV9yZXNldF9jYXAiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMS0xMDIKICAgIC8vICMgUHJpbWFyeSBEaXN0cmlidXRpb24KICAgIC8vIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsID0gVUludDY0KCkKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMwogICAgLy8gc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNS0xMDYKICAgIC8vICMgQ3VtdWxhdGl2ZSBQZXItVW5pdCBGaXhlZC1Qb2ludCBJbmRleGVzCiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggPSBVSW50NjQoKQogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNwogICAgLy8gc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNQogICAgLy8gc2VsZi5ldmVudF9jdXJzb3IgPSBVSW50NjQoKQogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTYKICAgIC8vIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgPSBVSW50NjQoKQogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExOC0xMTkKICAgIC8vICMgU2NhbGluZwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjIzCiAgICAvLyBhc3NlcnQgVHhuLmdsb2JhbF9udW1fYnl0ZV9zbGljZSA9PSBjZmcuR0xPQkFMX0JZVEVTLCBlcnIuV1JPTkdfR0xPQkFMX0JZVEVTCiAgICB0eG4gR2xvYmFsTnVtQnl0ZVNsaWNlCiAgICBwdXNoaW50IDQKICAgID09CiAgICBhc3NlcnQgLy8gV3JvbmcgR2xvYmFsIEJ5dGVzIGFsbG9jYXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kX2FzYS9jb250cmFjdC5weToyNAogICAgLy8gYXNzZXJ0IFR4bi5nbG9iYWxfbnVtX3VpbnQgPT0gY2ZnLkdMT0JBTF9VSU5UUywgZXJyLldST05HX0dMT0JBTF9VSU5UUwogICAgdHhuIEdsb2JhbE51bVVpbnQKICAgIHB1c2hpbnQgMzcKICAgID09CiAgICBhc3NlcnQgLy8gV3JvbmcgR2xvYmFsIFVJbnRzIGFsbG9jYXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kX2FzYS9jb250cmFjdC5weToyNQogICAgLy8gYXNzZXJ0IFR4bi5sb2NhbF9udW1fYnl0ZV9zbGljZSA9PSBjZmcuTE9DQUxfQllURVMsIGVyci5XUk9OR19MT0NBTF9CWVRFUwogICAgdHhuIExvY2FsTnVtQnl0ZVNsaWNlCiAgICAhCiAgICBhc3NlcnQgLy8gV3JvbmcgTG9jYWwgQnl0ZXMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBhc3NlcnQgVHhuLmxvY2FsX251bV91aW50ID09IGNmZy5MT0NBTF9VSU5UUywgZXJyLldST05HX0xPQ0FMX1VJTlRTCiAgICB0eG4gTG9jYWxOdW1VaW50CiAgICAhCiAgICBhc3NlcnQgLy8gV3JvbmcgTG9jYWwgVUludHMgYWxsb2NhdGlvbgoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6OC0xOAogICAgLy8gY2xhc3MgREFTQSgKICAgIC8vICAgICBQYXltZW50QWdlbnQsCiAgICAvLyAgICAgVHJhbnNmZXJBZ2VudCwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBhdm1fdmVyc2lvbj0xMiwKICAgIC8vICk6CiAgICBwdXNoYnl0ZXMgMHg5MTRmMDRlYiAvLyBtZXRob2QgImNvbnRyYWN0X3VwZGF0ZSgpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fY29udHJhY3RfdXBkYXRlX3JvdXRlQDQKCm1haW5fc3dpdGNoX2Nhc2VfbmV4dEA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjgtMTgKICAgIC8vIGNsYXNzIERBU0EoCiAgICAvLyAgICAgUGF5bWVudEFnZW50LAogICAgLy8gICAgIFRyYW5zZmVyQWdlbnQsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyAgICAgYXZtX3ZlcnNpb249MTIsCiAgICAvLyApOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYnogbWFpbl9jcmVhdGVfTm9PcEAzMgogICAgcHVzaGJ5dGVzcyAweGI0NDYxOGM4IDB4ZTc4MzI1MjkgMHg5NDM4ODcyMyAweDZjODVlM2VlIDB4YmRkMWE5NDQgMHg3YzBmMTgxMiAweDE0ZmMxMGVmIDB4NzRhNzI5N2YgMHgwOWQ0ZmUxNCAweDlhOWJmYTg1IDB4ODVlZWQzM2QgMHhhYjJjMGZjNCAweGQ5ZjIyNWFjIDB4OTg4MzUwNWEgMHg4ZWE2ZTc0YyAweDAyYWY1NTdhIDB4ODJmNzFiMmQgMHhlZjA0ZjVkMyAweGRmMzQzNTUwIDB4M2RiZTgwYmQgMHgxZTNlNDhlNyAweDAxMGM4Mjk5IDB4NzQwNmFjZDIgMHgxYTcyYTJlZSAvLyBtZXRob2QgImZ1bmRfZHVlX2Nhc2hmbG93cyh1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJjbGFpbV9kdWVfY2FzaGZsb3dzKGFkZHJlc3MsYnl0ZVtdKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYnl0ZVtdKSIsIG1ldGhvZCAidHJhbnNmZXJfc2V0X3NjaGVkdWxlKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbihhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInRyYW5zZmVyKGFkZHJlc3MsYWRkcmVzcyx1aW50NjQpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X3N1c3BlbnNpb24oYWRkcmVzcyxib29sKXVpbnQ2NCIsIG1ldGhvZCAiYWNjb3VudF9vcGVuKGFkZHJlc3MsYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgImFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzcyhhZGRyZXNzLGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X2dldF9wb3NpdGlvbihhZGRyZXNzKShhZGRyZXNzLHVpbnQ2NCx1aW50NjQsYm9vbCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAiY29udHJhY3RfY29uZmlnKCh1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxib29sLGJvb2wsYm9vbCx1aW50NjQpLCh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCksKGJ5dGVbMzJdLHN0cmluZykpdWludDY0IiwgbWV0aG9kICJjb250cmFjdF9zY2hlZHVsZSh1aW50NjQsYm9vbCwodWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NClbXSl1aW50NjQiLCBtZXRob2QgImNvbnRyYWN0X2V4ZWN1dGVfaWVkKCl1aW50NjQiLCBtZXRob2QgImFwcGx5X25vbl9jYXNoX2V2ZW50KHVpbnQ2NCwodWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIsIG1ldGhvZCAiYXBwZW5kX29ic2VydmVkX2Nhc2hfZXZlbnQoKHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIsIG1ldGhvZCAiY29udHJhY3RfZ2V0X3N0YXRlKCkodWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudCgpKHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJyYmFjX3JvdGF0ZV9hcnJhbmdlcihhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19zZXRfb3BfZGFlbW9uKGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX2Fzc2lnbl9yb2xlKHVpbnQ4LGFkZHJlc3MsKHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19yZXZva2Vfcm9sZSh1aW50OCxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19jb250cmFjdF9zdXNwZW5zaW9uKGJvb2wpdWludDY0IiwgbWV0aG9kICJyYmFjX2dldF9hcnJhbmdlcigpYWRkcmVzcyIsIG1ldGhvZCAicmJhY19nZXRfYWRkcmVzc19yb2xlcyhhZGRyZXNzKShib29sLGJvb2wsYm9vbCxib29sLGJvb2wpIiwgbWV0aG9kICJyYmFjX2dldF9yb2xlX3ZhbGlkaXR5KHVpbnQ4LGFkZHJlc3MpKHVpbnQ2NCx1aW50NjQpIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggZnVuZF9kdWVfY2FzaGZsb3dzIGNsYWltX2R1ZV9jYXNoZmxvd3MgdHJhbnNmZXJfc2V0X3NjaGVkdWxlIHByaW1hcnlfZGlzdHJpYnV0aW9uIHRyYW5zZmVyIGFjY291bnRfc3VzcGVuc2lvbiBhY2NvdW50X29wZW4gYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzIGFjY291bnRfZ2V0X3Bvc2l0aW9uIGNvbnRyYWN0X2NvbmZpZyBjb250cmFjdF9zY2hlZHVsZSBjb250cmFjdF9leGVjdXRlX2llZCBhcHBseV9ub25fY2FzaF9ldmVudCBhcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudCBjb250cmFjdF9nZXRfc3RhdGUgY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50IHJiYWNfcm90YXRlX2FycmFuZ2VyIHJiYWNfc2V0X29wX2RhZW1vbiByYmFjX2Fzc2lnbl9yb2xlIHJiYWNfcmV2b2tlX3JvbGUgcmJhY19jb250cmFjdF9zdXNwZW5zaW9uIHJiYWNfZ2V0X2FycmFuZ2VyIHJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXMgcmJhY19nZXRfcm9sZV92YWxpZGl0eQogICAgZXJyCgptYWluX2NyZWF0ZV9Ob09wQDMyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjgtMTgKICAgIC8vIGNsYXNzIERBU0EoCiAgICAvLyAgICAgUGF5bWVudEFnZW50LAogICAgLy8gICAgIFRyYW5zZmVyQWdlbnQsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyAgICAgYXZtX3ZlcnNpb249MTIsCiAgICAvLyApOgogICAgcHVzaGJ5dGVzIDB4OTU2ZDcxNTYgLy8gbWV0aG9kICJjb250cmFjdF9jcmVhdGUoYWRkcmVzcyl1aW50NjQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBjb250cmFjdF9jcmVhdGUKICAgIGVycgoKbWFpbl9jb250cmFjdF91cGRhdGVfcm91dGVANDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgNCAvLyBVcGRhdGVBcHBsaWNhdGlvbgogICAgPT0KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0CiAgICBiIGNvbnRyYWN0X3VwZGF0ZQoKCi8vIF9wdXlhX2xpYi51dGlsLmVuc3VyZV9idWRnZXQocmVxdWlyZWRfYnVkZ2V0OiB1aW50NjQsIGZlZV9zb3VyY2U6IHVpbnQ2NCkgLT4gdm9pZDoKZW5zdXJlX2J1ZGdldDoKICAgIHByb3RvIDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDEwCiAgICArCgplbnN1cmVfYnVkZ2V0X3doaWxlX3RvcEAxOgogICAgZnJhbWVfZGlnIDAKICAgIGdsb2JhbCBPcGNvZGVCdWRnZXQKICAgID4KICAgIGJ6IGVuc3VyZV9idWRnZXRfYWZ0ZXJfd2hpbGVANgogICAgaXR4bl9iZWdpbgogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGJ5dGVjIDQ3IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbQogICAgYnl0ZWMgNDcgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KICAgIGZyYW1lX2RpZyAtMQogICAgc3dpdGNoIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMEAzIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMUA0CgplbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX25leHRANToKICAgIGl0eG5fc3VibWl0CiAgICBiIGVuc3VyZV9idWRnZXRfd2hpbGVfdG9wQDEKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMUA0OgogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgaXR4bl9maWVsZCBGZWUKICAgIGIgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV9uZXh0QDUKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMEAzOgogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBiIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfbmV4dEA1CgplbnN1cmVfYnVkZ2V0X2FmdGVyX3doaWxlQDY6CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnBheW1lbnRfYWdlbnQuUGF5bWVudEFnZW50LmZ1bmRfZHVlX2Nhc2hmbG93c1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmZ1bmRfZHVlX2Nhc2hmbG93czoKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gMTMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjY4CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2OQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3MAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDcKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzIKICAgIC8vIGlmIHNlbGYuX2lzX2R5bmFtaWNfYW5udWl0eSgpOgogICAgY2FsbHN1YiBfaXNfZHluYW1pY19hbm51aXR5CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzYtNzcKICAgIC8vICsgbWF4X2V2ZW50X2NvdW50CiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfRlVORF9EVUVfQ0FTSEZMT1dTX1BFUl9FVkVOVF9CVURHRVQpCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3NwogICAgLy8gKiBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19QRVJfRVZFTlRfQlVER0VUKQogICAgcHVzaGludCAxMDAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3Ni03NwogICAgLy8gKyBtYXhfZXZlbnRfY291bnQKICAgIC8vICogVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfUEVSX0VWRU5UX0JVREdFVCkKICAgICoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3NQogICAgLy8gVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfQkFTRV9CVURHRVQpCiAgICBpbnRjIDQgLy8gMTUwMAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojc1LTc3CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19CQVNFX0JVREdFVCkKICAgIC8vICsgbWF4X2V2ZW50X2NvdW50CiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfRlVORF9EVUVfQ0FTSEZMT1dTX1BFUl9FVkVOVF9CVURHRVQpCiAgICArCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzMtNzkKICAgIC8vIGVuc3VyZV9idWRnZXQoCiAgICAvLyAgICAgcmVxdWlyZWRfYnVkZ2V0PSgKICAgIC8vICAgICAgICAgVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfQkFTRV9CVURHRVQpCiAgICAvLyAgICAgICAgICsgbWF4X2V2ZW50X2NvdW50CiAgICAvLyAgICAgICAgICogVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfUEVSX0VWRU5UX0JVREdFVCkKICAgIC8vICAgICApLAogICAgLy8gKQogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4MQogICAgLy8gcHJvY2Vzc2VkX2V2ZW50cyA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjgyCiAgICAvLyBmdW5kZWRfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDE0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODMKICAgIC8vIGZ1bmRlZF9wcmluY2lwYWwgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDEzCgpmdW5kX2R1ZV9jYXNoZmxvd3Nfd2hpbGVfdG9wQDQ6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODYKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgPCBtYXhfZXZlbnRfY291bnQKICAgIGRpZyA0CiAgICBkaWcgMQogICAgPAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojg2LTg3CiAgICAvLyBwcm9jZXNzZWRfZXZlbnRzIDwgbWF4X2V2ZW50X2NvdW50CiAgICAvLyBhbmQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAMTEKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4NwogICAgLy8gYW5kIHNlbGYuZXZlbnRfY3Vyc29yIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICA8CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODYtODcKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgPCBtYXhfZXZlbnRfY291bnQKICAgIC8vIGFuZCBzZWxmLmV2ZW50X2N1cnNvciA8IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQKICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl93aGlsZUAxMQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojg5CiAgICAvLyBlbnRyeSA9IHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLmV2ZW50X2N1cnNvcikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICBkdXAKICAgIGJ1cnkgMTcKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5MAogICAgLy8gaWYgZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcDoKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSAzCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDExCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6OTIKICAgIC8vIGlmIG5vdCBzZWxmLl9ldmVudF9pc19jYXNoKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkpOgogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBidXJ5IDE2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNTEKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgaW50Y18yIC8vIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM1MC0zNTQKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX01EKSwKICAgIC8vICkKICAgID09CiAgICBkdXAKICAgIGJ1cnkgNAogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX3RydWVANTIKICAgIGRpZyAxNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzUyCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzUwLTM1NAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfTUQpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDUyCiAgICBkaWcgMTQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM1MwogICAgLy8gVUludDY0KGVudW1zLkVWVF9NRCksCiAgICBwdXNoaW50IDE5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNTAtMzU0CiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9NRCksCiAgICAvLyApCiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VANTMKCmZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX3RydWVANTI6CiAgICBpbnRjXzEgLy8gMQoKZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfbWVyZ2VANTQ6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6OTIKICAgIC8vIGlmIG5vdCBzZWxmLl9ldmVudF9pc19jYXNoKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkpOgogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NDgKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF9pZCA9PSBzZWxmLmV2ZW50X2N1cnNvciwgZXJyLklOVkFMSURfRVZFTlRfQ1VSU09SCiAgICBkaWcgMTUKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgY3Vyc29yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NDkKICAgIC8vIGFzc2VydCBlbnRyeS5zY2hlZHVsZWRfdGltZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwgZXJyLk5PX0RVRV9DQVNIRkxPVwogICAgZGlnIDEKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIDw9CiAgICBhc3NlcnQgLy8gTm8gZHVlIGNhc2hmbG93IHRvIHBheQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDEzCiAgICAvLyBpZiBldmVudF90eXBlIG5vdCBpbiAoVUludDY0KGVudW1zLkVWVF9JUCksIFVJbnQ2NChlbnVtcy5FVlRfTUQpKToKICAgIGRpZyAyCiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTUKICAgIGRpZyAxNAogICAgcHVzaGludCAxOQogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDE0CiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAxMQoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X2ludGVyZXN0X2Ftb3VudEAxNjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQyNgogICAgLy8gZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGRpZyAxNQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSAxNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDI3CiAgICAvLyBpZiBldmVudF90eXBlIG5vdCBpbiAoVUludDY0KGVudW1zLkVWVF9QUiksIFVJbnQ2NChlbnVtcy5FVlRfTUQpKToKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxOQogICAgZGlnIDE0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MjgKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDYKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTUzCiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA9IGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBkaWcgMTUKICAgIHB1c2hpbnQgNDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBidXJ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1NgogICAgLy8gaWYgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCk6CiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUAyOQogICAgZGlnIDcKICAgIGJ1cnkgOQoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzItNTc0CiAgICAvLyAjIEZ1bmRpbmcgdXNlcyBwZXItdW5pdCBjdW11bGF0aXZlIGluZGljZXMgc28gZWFjaCBob2xkZXIgY2FuIHNldHRsZQogICAgLy8gIyBpbmRlcGVuZGVudGx5IGZyb20gaXRzIGN1cnJlbnQgdW5pdCBiYWxhbmNlLgogICAgLy8gaW50ZXJlc3RfaW5kZXhfZGVsdGEgPSBzZWxmLl9hbW91bnRfdG9faW5kZXhfZGVsdGEoaW50ZXJlc3RfYW1vdW50X2R1ZSkKICAgIGRpZyAxMAogICAgY2FsbHN1YiBfYW1vdW50X3RvX2luZGV4X2RlbHRhCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzUKICAgIC8vIHByaW5jaXBhbF9pbmRleF9kZWx0YSA9IHNlbGYuX2Ftb3VudF90b19pbmRleF9kZWx0YShwcmluY2lwYWxfYW1vdW50X2R1ZSkKICAgIGRpZyA2CiAgICBjYWxsc3ViIF9hbW91bnRfdG9faW5kZXhfZGVsdGEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU3NgogICAgLy8gaW50ZXJlc3RfYW1vdW50ID0gc2VsZi5faW5kZXhfZGVsdGFfdG9fYW1vdW50KGludGVyZXN0X2luZGV4X2RlbHRhKQogICAgZGlnIDEKICAgIGNhbGxzdWIgX2luZGV4X2RlbHRhX3RvX2Ftb3VudAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBidXJ5IDE1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzcKICAgIC8vIHByaW5jaXBhbF9hbW91bnQgPSBzZWxmLl9pbmRleF9kZWx0YV90b19hbW91bnQocHJpbmNpcGFsX2luZGV4X2RlbHRhKQogICAgZHVwCiAgICBjYWxsc3ViIF9pbmRleF9kZWx0YV90b19hbW91bnQKICAgIGR1cAogICAgYnVyeSAxMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTc4CiAgICAvLyByZXF1aXJlZF9hbW91bnQgPSBpbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50CiAgICBkaWcgMgogICAgZGlnIDEKICAgICsKICAgIGR1cAogICAgYnVyeSA5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MzQKICAgIC8vIGJhbGFuY2UgPSBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBvcHRlZCBpbnRvIGFzc2V0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NTYKICAgIC8vIHJldHVybiBzZWxmLnJlc2VydmVkX2ludGVyZXN0ICsgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICBkaWcgMQogICAgKwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzM2CiAgICAvLyBhc3NlcnQgYmFsYW5jZSA+PSByZXNlcnZlZF90b3RhbCwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGRpZyAyCiAgICBkaWcgMQogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzM3CiAgICAvLyByZXR1cm4gYmFsYW5jZSAtIHJlc2VydmVkX3RvdGFsCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIC0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4MAogICAgLy8gc2VsZi5fYXZhaWxhYmxlX3NldHRsZW1lbnRfZnVuZHMoKSA+PSByZXF1aXJlZF9hbW91bnQKICAgIHVuY292ZXIgMgogICAgPj0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU3OS01ODEKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5fYXZhaWxhYmxlX3NldHRsZW1lbnRfZnVuZHMoKSA+PSByZXF1aXJlZF9hbW91bnQKICAgIC8vICksIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcyBmb3IgdGhlIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4MwogICAgLy8gc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCArPSBpbnRlcmVzdF9hbW91bnQKICAgIHVuY292ZXIgMwogICAgKwogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4NAogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgKz0gcHJpbmNpcGFsX2Ftb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIGV4aXN0cwogICAgKwogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1ODUKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCArPSBpbnRlcmVzdF9pbmRleF9kZWx0YQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggZXhpc3RzCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4NgogICAgLy8gc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCArPSBwcmluY2lwYWxfaW5kZXhfZGVsdGEKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggZXhpc3RzCiAgICArCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTg3CiAgICAvLyBpZiBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpOgogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgcHVzaGludCAzCiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUA0MAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTg4LTU4OQogICAgLy8gIyBGb3IgUFIsIHRoZSBwZXJpb2QgaW50ZXJlc3Qgc3RheXMgYWNjcnVlZCB1bnRpbCBhIGxhdGVyIElQIG9yIE1ELgogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ICs9IHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZGlnIDE2CiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBidXJ5IDE4CiAgICArCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQxOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTkyCiAgICAvLyBpZiBub3Qgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCkgb3IgZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSA9PSBVSW50NjQoCiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDQzCiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTItNTk0CiAgICAvLyBpZiBub3Qgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCkgb3IgZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSA9PSBVSW50NjQoCiAgICAvLyAgICAgZW51bXMuRVZUX01ECiAgICAvLyApOgogICAgcHVzaGludCAxOQogICAgPT0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQ0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUA0MzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5NQogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gZW50cnkubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZGlnIDE1CiAgICBwdXNoaW50IDQxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTYKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGRpZyA4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTk3CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBuZXh0X2ludGVyZXN0X2Jhc2UKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBkaWcgOQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5OAogICAgLy8gc2VsZi5ldmVudF9jdXJzb3IgKz0gVUludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAwCiAgICAvLyBpZiBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoCiAgICBkaWcgMTUKICAgIGV4dHJhY3QgOCAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MDAtNjAyCiAgICAvLyBpZiBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoCiAgICAvLyAgICAgZW51bXMuRVZUX01ECiAgICAvLyApIGFuZCBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9PSBVSW50NjQoMCk6CiAgICBwdXNoYnl0ZXMgMHgxMwogICAgYj09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0NwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAyCiAgICAvLyApIGFuZCBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9PSBVSW50NjQoMCk6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwMC02MDIKICAgIC8vIGlmIGVudHJ5LmV2ZW50X3R5cGUgPT0gYXJjNC5VSW50OCgKICAgIC8vICAgICBlbnVtcy5FVlRfTUQKICAgIC8vICkgYW5kIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID09IFVJbnQ2NCgwKToKICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0NwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAzCiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbnVtcy5TVEFUVVNfRU5ERUQpCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBwdXNoaW50IDIwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwNAogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gVUludDY0KDApCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0NzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwNi02MTAKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1pbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50LAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PWludGVyZXN0X2Ftb3VudCArIHByaW5jaXBhbF9hbW91bnQsCiAgICAvLyApCiAgICBkaWcgMTUKICAgIGRpZyA0CiAgICBkdXAKICAgIGNhbGxzdWIgX2VtaXRfZXhlY3V0aW9uX2V2ZW50CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5NgogICAgLy8gZnVuZGVkX2ludGVyZXN0ICs9IGludGVyZXN0X2Ftb3VudAogICAgZGlnIDEzCiAgICBkaWcgMTIKICAgICsKICAgIGJ1cnkgMTQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5NwogICAgLy8gZnVuZGVkX3ByaW5jaXBhbCArPSBwcmluY2lwYWxfYW1vdW50CiAgICBkaWcgMTIKICAgIGRpZyA3CiAgICArCiAgICBidXJ5IDEzCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6OTgKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgKz0gVUludDY0KDEpCiAgICBkaWcgNAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgNQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3Nfd2hpbGVfdG9wQDQKCmZ1bmRfZHVlX2Nhc2hmbG93c19lbHNlX2JvZHlANDA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTEKICAgIC8vIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0MQoKZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlAMjk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTcKICAgIC8vIGV2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ1cnkgMTYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1OC01NjAKICAgIC8vICMgRHluYW1pYyBhbm51aXRpZXMgZGVyaXZlIG5leHQgc3RhdGUgZnJvbSB0aGUgcGF5bWVudCBkZWNvbXBvc2l0aW9uLAogICAgLy8gIyBub3Qgb25seSBmcm9tIHRoZSBwcmVjb21wdXRlZCBgbmV4dF8qYCBmaWVsZHMuCiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpOgogICAgcHVzaGludCAzCiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUAzMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTYyCiAgICAvLyBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCAtIHByaW5jaXBhbF9hbW91bnRfZHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGRpZyA2CiAgICAtCiAgICBkdXAKICAgIGJ1cnkgOQogICAgYnVyeSA5CiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDMxOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY1CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9JUCk6CiAgICBkaWcgMTQKICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUAzMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY2CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGJ1cnkgOQogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY3CiAgICAvLyBuZXh0X2ludGVyZXN0X2Jhc2UgPSBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGJ1cnkgMTAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgZXhpc3RzCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDMzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY4CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCk6CiAgICBkaWcgMTQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlAMzQKICAgIGRpZyA3CiAgICBidXJ5IDkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzgKCmZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDM0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY5CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTcwCiAgICAvLyBuZXh0X2ludGVyZXN0X2Jhc2UgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzgKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDI5CiAgICAvLyBpZiBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKToKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzMAogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKToKICAgIGRpZyAxNAogICAgcHVzaGludCAxOQogICAgPT0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDIyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzEKICAgIC8vIHJldHVybiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzIKICAgIC8vIGludGVyZXN0X2R1ZSA9IHNlbGYuYWNjcnVlZF9pbnRlcmVzdCArIHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZGlnIDE2CiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBidXJ5IDE4CiAgICArCiAgICBkdXAKICAgIGJ1cnkgMTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzMwogICAgLy8gaWYgc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIDw9IGludGVyZXN0X2R1ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIGV4aXN0cwogICAgPj0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDI0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzQKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzUKICAgIC8vIHByaW5jaXBhbF9hbW91bnQgPSBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gLSBpbnRlcmVzdF9kdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIGV4aXN0cwogICAgZGlnIDEwCiAgICAtCiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDM2CiAgICAvLyBpZiBwcmluY2lwYWxfYW1vdW50ID4gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWw6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgID4KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDI2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzcKICAgIC8vIHJldHVybiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjY6CiAgICBkaWcgNgogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTIKICAgIC8vIHByaW5jaXBhbF9hbW91bnRfZHVlID0gc2VsZi5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudChlbnRyeSkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnRAMjgKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDI3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDQwCiAgICAvLyBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA8PSBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZGlnIDE1CiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBkdXAyCiAgICA8PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDM5LTQ0MQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA8PSBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NDIKICAgIC8vIHJldHVybiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCAtIGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBzd2FwCiAgICAtCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MTUKICAgIC8vIHJldHVybiBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgKyBzZWxmLl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KGVudHJ5KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgIGRpZyAxNgogICAgY2FsbHN1YiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudAogICAgYnVyeSAxOAogICAgKwogICAgYnVyeSAxMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTUxCiAgICAvLyBpbnRlcmVzdF9hbW91bnRfZHVlID0gc2VsZi5fZW50cnlfaW50ZXJlc3RfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfaW50ZXJlc3RfYW1vdW50QDE2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAMTE6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTAwCiAgICAvLyBhc3NlcnQgcHJvY2Vzc2VkX2V2ZW50cyA+IFVJbnQ2NCgwKSwgZXJyLk5PX0RVRV9DQVNIRkxPVwogICAgZGlnIDQKICAgIGR1cAogICAgYXNzZXJ0IC8vIE5vIGR1ZSBjYXNoZmxvdyB0byBwYXkKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMDQKICAgIC8vIHRvdGFsX2Z1bmRlZD1mdW5kZWRfaW50ZXJlc3QgKyBmdW5kZWRfcHJpbmNpcGFsLAogICAgZGlnIDE0CiAgICBkdXAKICAgIGRpZyAxNQogICAgZHVwCiAgICBjb3ZlciAzCiAgICArCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA2CiAgICAvLyB0aW1lc3RhbXA9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTAxLTEwNwogICAgLy8gcmV0dXJuIHR5cC5DYXNoRnVuZGluZ1Jlc3VsdCgKICAgIC8vICAgICBmdW5kZWRfaW50ZXJlc3Q9ZnVuZGVkX2ludGVyZXN0LAogICAgLy8gICAgIGZ1bmRlZF9wcmluY2lwYWw9ZnVuZGVkX3ByaW5jaXBhbCwKICAgIC8vICAgICB0b3RhbF9mdW5kZWQ9ZnVuZGVkX2ludGVyZXN0ICsgZnVuZGVkX3ByaW5jaXBhbCwKICAgIC8vICAgICBwcm9jZXNzZWRfZXZlbnRzPXByb2Nlc3NlZF9ldmVudHMsCiAgICAvLyAgICAgdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUA1MzoKICAgIGludGNfMCAvLyAwCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDU0CgoKLy8gbW9kdWxlcy5wYXltZW50X2FnZW50LlBheW1lbnRBZ2VudC5jbGFpbV9kdWVfY2FzaGZsb3dzW3JvdXRpbmddKCkgLT4gdm9pZDoKY2xhaW1fZHVlX2Nhc2hmbG93czoKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cG4gMgogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNQogICAgLy8gaWYgc2VsZi5vcF9kYWVtb24udmFsdWUgIT0gR2xvYmFsLnplcm9fYWRkcmVzczoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNiAvLyAweDUyM2E0ZjUwNDQyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wX2RhZW1vbiBleGlzdHMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE3CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjYgLy8gMHg1MjNhNGY1MDQ0MjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcF9kYWVtb24gZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE3LTE5CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIGJueiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfdHJ1ZUAxNAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE4CiAgICAvLyBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgdHhuIFNlbmRlcgogICAgZGlnIDMKICAgID09CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTctMTkKICAgIC8vIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICAvLyBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgYm56IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDE0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTkKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCAzMgogICAgPT0KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNy0xOQogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICBieiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VAMTUKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDE0OgogICAgaW50Y18xIC8vIDEKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUAxNjoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNi0yMAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyAgICAgb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vICAgICBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgLy8gKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCgpjbGFpbV9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTc6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTM5CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE0MAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDcKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTQzCiAgICAvLyBzZWxmLl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKGhvbGRpbmdfYWRkcmVzcykKICAgIGRpZyAyCiAgICBkdXAKICAgIGNhbGxzdWIgX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNDQKICAgIC8vIHNlbGYuX3NldHRsZV9wb3NpdGlvbihob2xkaW5nX2FkZHJlc3MpCiAgICBjYWxsc3ViIF9zZXR0bGVfcG9zaXRpb24KICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExNwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY2xhaW1hYmxlX2ludGVyZXN0CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBkdXAKICAgIHB1c2hpbnQgNzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExOAogICAgLy8gKyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jbGFpbWFibGVfcHJpbmNpcGFsCiAgICBkdXAKICAgIHB1c2hpbnQgODEKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExNy0xMTgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNsYWltYWJsZV9pbnRlcmVzdAogICAgLy8gKyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jbGFpbWFibGVfcHJpbmNpcGFsCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTQ2CiAgICAvLyBhc3NlcnQgdG90YWxfYW1vdW50ID4gVUludDY0KDApLCBlcnIuTk9fRFVFX0NBU0hGTE9XCiAgICBhc3NlcnQgLy8gTm8gZHVlIGNhc2hmbG93IHRvIHBheQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI1CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MuaXNfb3B0ZWRfaW4oCiAgICBleHRyYWN0IDAgMzIKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNgogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNS0yNwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLmlzX29wdGVkX2luKAogICAgLy8gICAgIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZAogICAgLy8gKQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNS0yOAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLmlzX29wdGVkX2luKAogICAgLy8gICAgIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZAogICAgLy8gKQogICAgLy8gYW5kIG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQKICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAyNAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI4CiAgICAvLyBhbmQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCAzODQKICAgIGdldGJpdAogICAgYm56IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAyNAogICAgaW50Y18xIC8vIDEKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUAyNToKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNTEKICAgIC8vIGlmIHNlbGYuX2lzX3BheW1lbnRfZXhlY3V0YWJsZShob2xkaW5nX2FkZHJlc3MpOgogICAgYnogY2xhaW1fZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozNAogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIHN3YXAKICAgIGRpZyAxCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozNC0zNQogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIC8vID49IHBheW1lbnRfYW1vdW50CiAgICBkaWcgNQogICAgZHVwCiAgICBjb3ZlciAyCiAgICA+PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjMzLTM2CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICAvLyAgICAgPj0gcGF5bWVudF9hbW91bnQKICAgIC8vICksIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcyBmb3IgdGhlIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNTMKICAgIC8vIHNlbGYuX3BheShzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MsIHRvdGFsX2Ftb3VudCkKICAgIGRpZyAyCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBkdXAKICAgIGV4dHJhY3QgMCAzMgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQwLTQ1CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9cmVjZWl2ZXIsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWFtb3VudCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQ0CiAgICAvLyBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgdW5jb3ZlciAzCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIHVuY292ZXIgMgogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0MAogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgcHVzaGludCA0IC8vIGF4ZmVyCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQwLTQ1CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9cmVjZWl2ZXIsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWFtb3VudCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMjUtMTI2CiAgICAvLyAjIEdldCB0aGUgY2xhaW1hYmxlIGFtb3VudHMgYmVmb3JlIHJlc2V0CiAgICAvLyBpbnRlcmVzdF9hbW91bnQgPSBwb3NpdGlvbi5jbGFpbWFibGVfaW50ZXJlc3QKICAgIGR1cAogICAgcHVzaGludCA3MwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSA5CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTI3CiAgICAvLyBwcmluY2lwYWxfYW1vdW50ID0gcG9zaXRpb24uY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgZHVwCiAgICBwdXNoaW50IDgxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAzCiAgICBidXJ5IDkKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMjktMTMwCiAgICAvLyAjIFJlc2V0IHRoZSBwb3NpdGlvbidzIGNsYWltYWJsZSBhbW91bnRzCiAgICAvLyBwb3NpdGlvbi5jbGFpbWFibGVfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBpdG9iCiAgICBzd2FwCiAgICBkaWcgMQogICAgcmVwbGFjZTIgNzMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzEKICAgIC8vIHBvc2l0aW9uLmNsYWltYWJsZV9wcmluY2lwYWwgPSBVSW50NjQoMCkKICAgIHN3YXAKICAgIHJlcGxhY2UyIDgxCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTMyCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHBvc2l0aW9uLmNvcHkoKQogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTM0CiAgICAvLyBhc3NlcnQgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCA+PSBpbnRlcmVzdF9hbW91bnQsIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX2ludGVyZXN0IGV4aXN0cwogICAgZHVwCiAgICBkaWcgMgogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzNQogICAgLy8gYXNzZXJ0IHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsID49IHByaW5jaXBhbF9hbW91bnQsIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICBkaWcgMwogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzNy0xMzgKICAgIC8vICMgVXBkYXRlIHRoZSBnbG9iYWwgcmVzZXJ2ZWQgaW50ZXJlc3QgYW5kIHByaW5jaXBhbCBhbW91bnRzCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0IC09IGludGVyZXN0X2Ftb3VudAogICAgc3dhcAogICAgLQogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzkKICAgIC8vIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIC09IHByaW5jaXBhbF9hbW91bnQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIHN3YXAKICAgIC0KICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKY2xhaW1fZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTU5CiAgICAvLyB0b3RhbF9hbW91bnQ9aW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudCwKICAgIGRpZyA1CiAgICBkdXAKICAgIGRpZyA2CiAgICBkdXAKICAgIGNvdmVyIDMKICAgICsKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNjAKICAgIC8vIHRpbWVzdGFtcD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNTYtMTYyCiAgICAvLyByZXR1cm4gdHlwLkNhc2hDbGFpbVJlc3VsdCgKICAgIC8vICAgICBpbnRlcmVzdF9hbW91bnQ9aW50ZXJlc3RfYW1vdW50LAogICAgLy8gICAgIHByaW5jaXBhbF9hbW91bnQ9cHJpbmNpcGFsX2Ftb3VudCwKICAgIC8vICAgICB0b3RhbF9hbW91bnQ9aW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudCwKICAgIC8vICAgICB0aW1lc3RhbXA9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgY29udGV4dD1wYXltZW50X2luZm8sCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgMgogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIHB1c2hieXRlcyAweDAwMjIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAyNDoKICAgIGludGNfMCAvLyAwCiAgICBiIGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUAyNQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX2ZhbHNlQDE1OgogICAgaW50Y18wIC8vIDAKICAgIGIgY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDE2CgoKLy8gbW9kdWxlcy50cmFuc2Zlcl9hZ2VudC5UcmFuc2ZlckFnZW50LnRyYW5zZmVyX3NldF9zY2hlZHVsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRyYW5zZmVyX3NldF9zY2hlZHVsZToKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo0MAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQxCiAgICAvLyBhc3NlcnQgb3Blbl9kYXRlIDwgY2xvc3VyZV9kYXRlLCBlcnIuSU5WQUxJRF9TT1JUSU5HCiAgICBkdXAyCiAgICA8CiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbXVzdCBiZSBzb3J0ZWQgaW4gc3RyaWN0bHkgYXNjZW5kaW5nIG9yZGVyCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQzCiAgICAvLyBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA9IG9wZW5fZGF0ZQogICAgYnl0ZWMgMjggLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIHVuY292ZXIgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDQKICAgIC8vIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlID0gY2xvc3VyZV9kYXRlCiAgICBieXRlYyAyOSAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDUKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy50cmFuc2Zlcl9hZ2VudC5UcmFuc2ZlckFnZW50LnByaW1hcnlfZGlzdHJpYnV0aW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcHJpbWFyeV9kaXN0cmlidXRpb246CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjcxCiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5wcmltYXJ5X2RlYWxlciwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDIyIC8vIDB4NTIzYTUwNTk0NDIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojc2CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo3NwogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojc4CiAgICAvLyBhc3NlcnQgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TRUQKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBjbG9zZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgY292ZXIgMwogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4MAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChob2xkaW5nX2FkZHJlc3MpCiAgICBzd2FwCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjgxCiAgICAvLyBhc3NlcnQgdW5pdHMgPiBVSW50NjQoMCksIGVyci5aRVJPX1VOSVRTCiAgICBkdXAKICAgIGFzc2VydCAvLyBDYW4gbm90IGRpc3RyaWJ1dGUgemVybyB1bml0cwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4MwogICAgLy8gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCArIHVuaXRzIDw9IHNlbGYudG90YWxfdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICArCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgPD0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODItODQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCArIHVuaXRzIDw9IHNlbGYudG90YWxfdW5pdHMKICAgIC8vICksIGVyci5PVkVSX0RJU1RSSUJVVElPTgogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCByZW1haW5pbmcgRC1BU0EgdW5pdHMKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODUKICAgIC8vIGlmIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI3IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlIGV4aXN0cwogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojg3CiAgICAvLyBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8PSBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI3IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlIGV4aXN0cwogICAgPD0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODYtODgKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPD0gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGUKICAgIC8vICksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TRUQKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBjbG9zZWQKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNDgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnJlc2VydmVkX3VuaXRzICs9IHVuaXRzCiAgICBkdXBuIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDMKICAgIGR1cAogICAgY292ZXIgMwogICAgKwogICAgaXRvYgogICAgcHVzaGludCA0MAogICAgc3dhcAogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6OTEKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgKz0gdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICArCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6OTIKICAgIC8vIHJldHVybiBzZWxmLnRvdGFsX3VuaXRzIC0gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIHN3YXAKICAgIC0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMudHJhbnNmZXJfYWdlbnQuVHJhbnNmZXJBZ2VudC50cmFuc2Zlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnRyYW5zZmVyOgogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTMwCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxMzEKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQ3CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuX3N0YXR1c19pc19wZW5kaW5nX2llZCgpLCBlcnIuUEVORElOR19JRUQKICAgICEKICAgIGFzc2VydCAvLyBJRUQgbm90IHlldCBleGVjdXRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxMwogICAgLy8gaWYgc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjggLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICBieiB0cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTUKICAgIC8vIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjggLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNC0xNgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gKSwgZXJyLkNMT1NFRF9UUkFOU0ZFUgogICAgYXNzZXJ0IC8vIFRyYW5zZmVyIGlzIGNsb3NlZAoKdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNwogICAgLy8gaWYgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjkgLy8gInRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICBieiB0cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTkKICAgIC8vIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDwgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGUKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyOSAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIDwKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTgtMjAKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZQogICAgLy8gKSwgZXJyLkNMT1NFRF9UUkFOU0ZFUgogICAgYXNzZXJ0IC8vIFRyYW5zZmVyIGlzIGNsb3NlZAoKdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxMzUKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIGRpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA4CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIGJ5dGVjIDggLy8gMHg0MTIzCiAgICBkaWcgNQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA5CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjEzOAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChzZW5kZXJfaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDIKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTM5CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGR1cAogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNDAKICAgIC8vIGFzc2VydCBzZW5kZXJfaG9sZGluZ19hZGRyZXNzICE9IHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcywgZXJyLlNFTEZfVFJBTlNGRVIKICAgIHVuY292ZXIgMgogICAgIT0KICAgIGFzc2VydCAvLyBTZW5kZXIgYW5kIHJlY2VpdmVyIG11c3QgYmUgZGlmZmVyZW50CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE0MQogICAgLy8gYXNzZXJ0IHVuaXRzID4gVUludDY0KDApLCBlcnIuTlVMTF9UUkFOU0ZFUgogICAgZGlnIDEKICAgIGR1cAogICAgYXNzZXJ0IC8vIFRyYW5zZmVyIHVuaXRzIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTQyCiAgICAvLyBhc3NlcnQgdW5pdHMgPD0gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLCBlcnIuT1ZFUl9UUkFOU0ZFUgogICAgc3dhcAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIDw9CiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IHNlbmRlciB1bml0cyB0byB0cmFuc2ZlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzYzCiAgICAvLyBpZiBzZWxmLmV2ZW50X2N1cnNvciA+PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICA+PQogICAgYm56IHRyYW5zZmVyX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Fzc2VydF9ub19kdWVfZXZlbnRfcGVuZGluZ0AxMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzY1CiAgICAvLyBuZXh0X2VudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KHNlbGYuZXZlbnRfY3Vyc29yKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc2NwogICAgLy8gbmV4dF9lbnRyeS5zY2hlZHVsZWRfdGltZSA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NjYtNzY4CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIG5leHRfZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gKSwgZXJyLlBFTkRJTkdfQUNUVVNfRVZFTlQKICAgIGFzc2VydCAvLyBBQ1RVUyBldmVudCBub3QgeWV0IGV4ZWN1dGVkCgp0cmFuc2Zlcl9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9hc3NlcnRfbm9fZHVlX2V2ZW50X3BlbmRpbmdAMTA6CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE0NQogICAgLy8gc2VsZi5fZW5zdXJlX3VuaXRzX2FjdGl2YXRlZChzZW5kZXJfaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDMKICAgIGR1cAogICAgY2FsbHN1YiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNDYKICAgIC8vIHNlbGYuX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQocmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgY2FsbHN1YiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNDcKICAgIC8vIHNlbGYuX3NldHRsZV9wb3NpdGlvbihzZW5kZXJfaG9sZGluZ19hZGRyZXNzKQogICAgY2FsbHN1YiBfc2V0dGxlX3Bvc2l0aW9uCiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTQ4CiAgICAvLyBzZWxmLl9zZXR0bGVfcG9zaXRpb24ocmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzKQogICAgY2FsbHN1YiBfc2V0dGxlX3Bvc2l0aW9uCiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNTIKICAgIC8vIGFzc2VydCB1bml0cyA8PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cywgZXJyLk9WRVJfVFJBTlNGRVIKICAgIGRpZyA1CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkaWcgMQogICAgPD0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgc2VuZGVyIHVuaXRzIHRvIHRyYW5zZmVyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTUzCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyAtPSB1bml0cwogICAgZGlnIDEKICAgIC0KICAgIGl0b2IKICAgIHVuY292ZXIgMgogICAgaW50Y18zIC8vIDMyCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTQ0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyArPSB1bml0cwogICAgZGlnIDUKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIHVuY292ZXIgMgogICAgKwogICAgaXRvYgogICAgaW50Y18zIC8vIDMyCiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfc3VzcGVuc2lvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfc3VzcGVuc2lvbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojc3CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyMSAvLyAweDUyM2E0MTU1NTQyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE4NQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkID0gc3VzcGVuZGVkCiAgICBkdXAKICAgIHB1c2hpbnQgNDgKICAgIGludGNfMSAvLyAxCiAgICBib3hfZXh0cmFjdAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMwogICAgc2V0Yml0CiAgICBwdXNoaW50IDQ4CiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE4NgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTY1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5hY2NvdW50X29wZW5bcm91dGluZ10oKSAtPiB2b2lkOgphY2NvdW50X29wZW46CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjgKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmFjY291bnRfbWFuYWdlciwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDIzIC8vIDB4NTIzYTRkNGU0NzIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzkKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0VOREVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDIwMAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTAKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX2VuZGVkKCksIGVyci5VTkFVVEhPUklaRUQKICAgICEKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxMQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTIKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjEzCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozNAogICAgLy8gdW5pdHM9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozMi00MgogICAgLy8gcmV0dXJuIHR5cC5BY2NvdW50UG9zaXRpb24oCiAgICAvLyAgICAgcGF5bWVudF9hZGRyZXNzPXBheW1lbnRfYWRkcmVzcywKICAgIC8vICAgICB1bml0cz1VSW50NjQoMCksCiAgICAvLyAgICAgcmVzZXJ2ZWRfdW5pdHM9VUludDY0KDApLAogICAgLy8gICAgIHN1c3BlbmRlZD1GYWxzZSwKICAgIC8vICAgICBzZXR0bGVkX2N1cnNvcj1VSW50NjQoMCksCiAgICAvLyAgICAgaW50ZXJlc3RfY2hlY2twb2ludD1VSW50NjQoMCksCiAgICAvLyAgICAgcHJpbmNpcGFsX2NoZWNrcG9pbnQ9VUludDY0KDApLAogICAgLy8gICAgIGNsYWltYWJsZV9pbnRlcmVzdD1VSW50NjQoMCksCiAgICAvLyAgICAgY2xhaW1hYmxlX3ByaW5jaXBhbD1VSW50NjQoMCksCiAgICAvLyApCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGJ5dGVjIDQwIC8vIDB4MDAKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjE0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHNlbGYuX25ld19hY2NvdW50X3Bvc2l0aW9uKHBheW1lbnRfYWRkcmVzcykKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTUKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjM4CiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIHVuY292ZXIgMwogICAgPT0KICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIzOQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDAKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQxCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MgPSBwYXltZW50X2FkZHJlc3MKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQyCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfZ2V0X3Bvc2l0aW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF9nZXRfcG9zaXRpb246CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNTkKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9jcmVhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9jcmVhdGU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDE5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAzMwogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IGFycmFuZ2VyCiAgICBieXRlYyAxOCAvLyAweDUyM2E0MTUyNTIyMwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMzQKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAxOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfY29uZmlnW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfY29uZmlnOgogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBsZW4KICAgIHB1c2hpbnQgMTA3CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLk5vcm1hbGl6ZWRBY3R1c1Rlcm1zCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgcHVzaGludCA3MgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5Jbml0aWFsS2VybmVsU3RhdGUKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBsZW4KICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIHR1cGxlIGVuY29kaW5nCiAgICBkdXAKICAgIHB1c2hpbnQgMzQKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCB0YWlsIHBvaW50ZXIgYXQgaW5kZXggMSBvZiAodWludDhbMzJdLChsZW4rdXRmOFtdKSkKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgY292ZXIgMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMzYKICAgICsKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuUHJvc3BlY3R1cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2NgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDY4LTEwNjkKICAgIC8vICMgQ29uZmlndXJlIENvbnRyYWN0CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPSB0ZXJtcy5jb250cmFjdF90eXBlLmFzX3VpbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgYnogY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUA3CiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIyMAogICAgLy8gVUludDY0KGVudW1zLkNUX0FOTiksCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIxCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfTkFNKSwKICAgIHB1c2hpbnQgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIyCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfTEFNKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIzCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfTEFYKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjI0CiAgICAvLyBVSW50NjQoZW51bXMuQ1RfQ0xNKSwKICAgIHB1c2hpbnQgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJ6IGNvbnRyYWN0X2NvbmZpZ19ib29sX2ZhbHNlQDgKCmNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANzoKICAgIGludGNfMSAvLyAxCgpjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUA5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjI5CiAgICAvLyBhc3NlcnQgc2VsZi5faXNfc3VwcG9ydGVkX2NvbnRyYWN0X3R5cGUoY29udHJhY3RfdHlwZSksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3MQogICAgLy8gc2VsZi5fc3RvcmVfY29udHJhY3RfY29uZmlnKHNlbGYuY29udHJhY3RfdHlwZSwgdGVybXMsIGluaXRpYWxfc3RhdGUpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgYnVyeSAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzI1CiAgICAvLyBhc3NlcnQgdGVybXMuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZGlnIDQKICAgIGR1cAogICAgcHVzaGludCAzMwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSA4CiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMjcKICAgIC8vIHRlcm1zLmRheV9jb3VudF9jb252ZW50aW9uLmFzX3VpbnQ2NCgpCiAgICBwdXNoaW50IDU3CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICBieiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDE2CiAgICBkaWcgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk5CiAgICAvLyBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI5Ny0zMDMKICAgIC8vIHJldHVybiBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzYwKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwSVNEQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjApLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDE2CiAgICBkaWcgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzAwCiAgICAvLyBVSW50NjQoZW51bXMuRENDX0EzNjUpLAogICAgcHVzaGludCAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyOTctMzAzCiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgID09CiAgICBibnogY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUAxNgogICAgZGlnIDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMwMQogICAgLy8gVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGRpZyA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDIKICAgIC8vIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICA9PQogICAgYnogY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAMTcKCmNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTY6CiAgICBpbnRjXzEgLy8gMQoKY29udHJhY3RfY29uZmlnX2Jvb2xfbWVyZ2VAMTg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDktMzExCiAgICAvLyBhc3NlcnQgc2VsZi5faXNfc3VwcG9ydGVkX2RheV9jb3VudF9jb252ZW50aW9uKAogICAgLy8gICAgIGRheV9jb3VudF9jb252ZW50aW9uCiAgICAvLyApLCBlcnIuSU5WQUxJRF9EQVlfQ09VTlRfQ09OVkVOVElPTgogICAgYXNzZXJ0IC8vIEludmFsaWQgZGF5LWNvdW50IGNvbnZlbnRpb24gSUQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMyOQogICAgLy8gaWYgY29udHJhY3RfdHlwZSAhPSBVSW50NjQoZW51bXMuQ1RfQU5OKToKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgICE9CiAgICBieiBjb250cmFjdF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzMwCiAgICAvLyBhc3NlcnQgbm90IHRlcm1zLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24sIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZGlnIDQKICAgIHB1c2hpbnQgNzg2CiAgICBnZXRiaXQKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KCmNvbnRyYWN0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDIwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODA3CiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIEQtQVNBIGFscmVhZHkgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODA4CiAgICAvLyBhc3NlcnQgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCA9PSBVSW50NjQoMCksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMCAvLyAiaW5pdGlhbF9leGNoYW5nZV9hbW91bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTAtODExCiAgICAvLyAjIFNldCBEZW5vbWluYXRpb24gQXNzZXQKICAgIC8vIHNlbGYuX2Fzc2VydF9kZW5vbWluYXRpb25fYXNzZXQodGVybXMuZGVub21pbmF0aW9uX2Fzc2V0X2lkKQogICAgZGlnIDQKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NzUtNzc2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIGRlbm9taW5hdGlvbiB3aXRoIEFTQQogICAgLy8gX2NyZWF0b3IsIGV4aXN0cyA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X2NyZWF0b3IoZGVub21pbmF0aW9uX2Fzc2V0X2lkKQogICAgZHVwCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q3JlYXRvcgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NzcKICAgIC8vIGFzc2VydCBleGlzdHMsIGVyci5JTlZBTElEX0RFTk9NSU5BVElPTgogICAgYXNzZXJ0IC8vIERlbm9taW5hdGlvbiBhc3NldCBpcyBub3QgcHJvcGVybHkgc2V0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODAKICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICBieXRlYyA0NCAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTQtODE1CiAgICAvLyAjIFNldCBTZXR0bGVtZW50IEFzc2V0CiAgICAvLyBzZWxmLl9hc3NlcnRfc2V0dGxlbWVudF9hc3NldCh0ZXJtcy5zZXR0bGVtZW50X2Fzc2V0X2lkKQogICAgZGlnIDEKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc4NQogICAgLy8gc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODMtNzg2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc2V0dGxlbWVudCBhc3NldCBpcyB0aGUgZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQgPT0gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIC8vICksIGVyci5JTlZBTElEX1NFVFRMRU1FTlRfQVNTRVQKICAgIGFzc2VydCAvLyBEaWZmZXJlbnQgc2V0dGxlbWVudCBhc3NldCBub3Qgc3VwcG9ydGVkLCBtdXN0IGJlIGVxdWFsIHRvIGRlbm9taW5hdGlvbiBhc3NldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Nzg5CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBzZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkwLTc5NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhc3NldF9hbW91bnQ9MCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Nzk1CiAgICAvLyBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkzCiAgICAvLyBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc5NAogICAgLy8gYXNzZXRfYW1vdW50PTAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkwLTc5MQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3OTAtNzk2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODE4LTgxOQogICAgLy8gIyBVbml0cwogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IHRlcm1zLnRvdGFsX3VuaXRzCiAgICBkdXAKICAgIHB1c2hpbnQgMTcKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODIwCiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID0gVUludDY0KDApCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgyMi04MjMKICAgIC8vICMgRGF5LUNvdW50IENvbnZlbnRpb25zCiAgICAvLyBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uID0gdGVybXMuZGF5X2NvdW50X2NvbnZlbnRpb24uYXNfdWludDY0KCkKICAgIGJ5dGVjIDQ2IC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGRpZyA4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODI1LTgyNgogICAgLy8gIyBUaW1lCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA9IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZQogICAgZHVwCiAgICBwdXNoaW50IDQxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMjcgLy8gImluaXRpYWxfZXhjaGFuZ2VfZGF0ZSIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODI3CiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSB0ZXJtcy5tYXR1cml0eV9kYXRlCiAgICBkaWcgMQogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDQ1IC8vICJtYXR1cml0eV9kYXRlIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MjgKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IGluaXRpYWxfc3RhdGUubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZGlnIDYKICAgIGR1cAogICAgY292ZXIgMgogICAgcHVzaGludCA0OAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzMC04MzEKICAgIC8vICMgUHJpbmNpcGFsCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID0gdGVybXMuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGRpZyAxMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzMgogICAgLy8gc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gdGVybXMuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZGlnIDMKICAgIHB1c2hpbnQgNzg2CiAgICBnZXRiaXQKICAgIGJ5dGVjIDM0IC8vICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzMwogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBpbml0aWFsX3N0YXRlLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZGlnIDEKICAgIHB1c2hpbnQgMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODM1LTgzNgogICAgLy8gIyBJbnRlcmVzdAogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ID0gaW5pdGlhbF9zdGF0ZS5hY2NydWVkX2ludGVyZXN0CiAgICBkaWcgMQogICAgcHVzaGludCA0MAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODM4LTgzOQogICAgLy8gIyBJbnRlcmVzdCBSYXRlCiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IGluaXRpYWxfc3RhdGUubm9taW5hbF9pbnRlcmVzdF9yYXRlCiAgICBkaWcgMQogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0MAogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gaW5pdGlhbF9zdGF0ZS5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlCiAgICBkaWcgMQogICAgcHVzaGludCAyNAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQxCiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkID0gdGVybXMucmF0ZV9yZXNldF9zcHJlYWQKICAgIGRpZyAzCiAgICBwdXNoaW50IDU4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzUgLy8gInJhdGVfcmVzZXRfc3ByZWFkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0MgogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIgPSB0ZXJtcy5yYXRlX3Jlc2V0X211bHRpcGxpZXIKICAgIGRpZyAzCiAgICBwdXNoaW50IDY2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzYgLy8gInJhdGVfcmVzZXRfbXVsdGlwbGllciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDMKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9mbG9vciA9IHRlcm1zLnJhdGVfcmVzZXRfZmxvb3IKICAgIGRpZyAzCiAgICBwdXNoaW50IDc0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzAgLy8gInJhdGVfcmVzZXRfZmxvb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQ0CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfY2FwID0gdGVybXMucmF0ZV9yZXNldF9jYXAKICAgIGRpZyAzCiAgICBwdXNoaW50IDgyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzEgLy8gInJhdGVfcmVzZXRfY2FwIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0NQogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X25leHQgPSB0ZXJtcy5yYXRlX3Jlc2V0X25leHQKICAgIGRpZyAzCiAgICBwdXNoaW50IDkwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzcgLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDYKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgPSB0ZXJtcy5oYXNfcmF0ZV9yZXNldF9mbG9vcgogICAgZGlnIDMKICAgIHB1c2hpbnQgNzg0CiAgICBnZXRiaXQKICAgIGJ5dGVjIDM4IC8vICJoYXNfcmF0ZV9yZXNldF9mbG9vciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDcKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwID0gdGVybXMuaGFzX3JhdGVfcmVzZXRfY2FwCiAgICBkaWcgMwogICAgcHVzaGludCA3ODUKICAgIGdldGJpdAogICAgYnl0ZWMgMzkgLy8gImhhc19yYXRlX3Jlc2V0X2NhcCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDktODUwCiAgICAvLyAjIFNjYWxpbmcKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgPSB0ZXJtcy5maXhlZF9wb2ludF9zY2FsZQogICAgdW5jb3ZlciAzCiAgICBwdXNoaW50IDk5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODUyLTg1MwogICAgLy8gIyBTY2hlZHVsZSBQcm9jZXNzaW5nCiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciA9IGluaXRpYWxfc3RhdGUuZXZlbnRfY3Vyc29yCiAgICBkaWcgMQogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU1LTg1NgogICAgLy8gIyBQZXItVW5pdCBGaXhlZC1Qb2ludCBJbmRleGVzCiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggPSBpbml0aWFsX3N0YXRlLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgKICAgIGRpZyAxCiAgICBwdXNoaW50IDU2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU3CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4ID0gaW5pdGlhbF9zdGF0ZS5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleAogICAgZGlnIDEKICAgIHB1c2hpbnQgNjQKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU5LTg2MAogICAgLy8gIyBSZXNlcnZlZCBBbW91bnQgKGZvciBleGVjdXRlZCBjYXNoZmxvd3MpCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0ID0gVUludDY0KDApCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2MQogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2MwogICAgLy8gYXNzZXJ0IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLCBlcnIuSU5WQUxJRF9JRUQKICAgIGRpZyAyCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICBhc3NlcnQgLy8gSUVEIG11c3QgYmUgc2V0IGluIHRoZSBmdXR1cmUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2NAogICAgLy8gYXNzZXJ0IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA+IGluaXRpYWxfc3RhdGUuc3RhdHVzX2RhdGUsIGVyci5JTlZBTElEX0lFRAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgPAogICAgYXNzZXJ0IC8vIElFRCBtdXN0IGJlIHNldCBpbiB0aGUgZnV0dXJlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NjUKICAgIC8vIGFzc2VydCB0ZXJtcy5pbml0aWFsX2V4Y2hhbmdlX2RhdGUgPCB0ZXJtcy5tYXR1cml0eV9kYXRlLCBlcnIuSU5WQUxJRF9JRUQKICAgIDwKICAgIGFzc2VydCAvLyBJRUQgbXVzdCBiZSBzZXQgaW4gdGhlIGZ1dHVyZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3My0xMDc0CiAgICAvLyAjIE5vdGFyaXplIHByb3NwZWN0dXMgKG9wdGlvbmFsKQogICAgLy8gc2VsZi5wcm9zcGVjdHVzX2hhc2ggPSBwcm9zcGVjdHVzLmhhc2guYnl0ZXMKICAgIGRpZyAyCiAgICBleHRyYWN0IDAgMzIKICAgIGJ5dGVjIDQyIC8vICJwcm9zcGVjdHVzX2hhc2giCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3NQogICAgLy8gc2VsZi5wcm9zcGVjdHVzX3VybCA9IHByb3NwZWN0dXMudXJsCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGVjIDQzIC8vICJwcm9zcGVjdHVzX3VybCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc2CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAMTc6CiAgICBpbnRjXzAgLy8gMAogICAgYiBjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUAxOAoKY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAODoKICAgIGludGNfMCAvLyAwCiAgICBiIGNvbnRyYWN0X2NvbmZpZ19ib29sX21lcmdlQDkKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9zY2hlZHVsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X3NjaGVkdWxlOgogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHN3YXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBkdXAKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgMgogICAgKwogICAgdW5jb3ZlciAyCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLkV4ZWN1dGlvblNjaGVkdWxlRW50cnk+CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTEwCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMTMKICAgIC8vIGNvbnRyYWN0X3R5cGU9c2VsZi5jb250cmFjdF90eXBlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGNvdmVyIDMKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4ODEKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4ODItODg0CiAgICAvLyBhc3NlcnQgc2NoZWR1bGVfcGFnZS5sZW5ndGggPD0gVUludDY0KAogICAgLy8gICAgIGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUKICAgIC8vICksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGR1cAogICAgcHVzaGludCAxNgogICAgPD0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg4NQogICAgLy8gYXNzZXJ0IHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPiBVSW50NjQoMCksIGVyci5URVJNU19OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSB0ZXJtcyBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODg3CiAgICAvLyBwYWdlX2N1cnNvciA9IHNjaGVkdWxlX3BhZ2VfaW5kZXggKiBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkKICAgIHN3YXAKICAgIHB1c2hpbnQgMTYKICAgICoKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg5NAogICAgLy8gKyBwYWdlX2xlbmd0aCAqIFVJbnQ2NChjc3QuT1BfVVBfQ09OVFJBQ1RfQ09ORklHX1BFUl9FTlRSWV9CVURHRVQpCiAgICBwdXNoaW50IDEwMAogICAgKgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODkzCiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19CQVNFX0JVREdFVCkKICAgIGludGMgNCAvLyAxNTAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTMtODk0CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19CQVNFX0JVREdFVCkKICAgIC8vICsgcGFnZV9sZW5ndGggKiBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19QRVJfRU5UUllfQlVER0VUKQogICAgKwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODg5LTg5NgogICAgLy8gIyBWYWxpZGF0aW9uIGNvc3QgZ3Jvd3Mgd2l0aCBwYWdlIGxlbmd0aCwgc28gY29uZmlndXJhdGlvbiBleHBsaWNpdGx5CiAgICAvLyAjIGJ1eXMgZXh0cmEgb3Bjb2RlIGJ1ZGdldCBmb3IgbGFyZ2VyIHVwbG9hZHMuCiAgICAvLyBlbnN1cmVfYnVkZ2V0KAogICAgLy8gICAgIHJlcXVpcmVkX2J1ZGdldD0oCiAgICAvLyAgICAgICAgIFVJbnQ2NChjc3QuT1BfVVBfQ09OVFJBQ1RfQ09ORklHX0JBU0VfQlVER0VUKQogICAgLy8gICAgICAgICArIHBhZ2VfbGVuZ3RoICogVUludDY0KGNzdC5PUF9VUF9DT05UUkFDVF9DT05GSUdfUEVSX0VOVFJZX0JVREdFVCkKICAgIC8vICAgICApLAogICAgLy8gKQogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODk3CiAgICAvLyBpbmRleCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKCmNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEAyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODk4CiAgICAvLyB3aGlsZSBpbmRleCA8IHBhZ2VfbGVuZ3RoOgogICAgZHVwCiAgICBkaWcgNAogICAgPAogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfd2hpbGVAMTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg5OS05MDAKICAgIC8vIGVudHJ5ID0gc2NoZWR1bGVfcGFnZVtpbmRleF0uY29weSgpCiAgICAvLyBlbnRyeV9ldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZGlnIDQKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGJ1cnkgMTIKICAgIGRpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgNjUKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTAwCiAgICAvLyBlbnRyeV9ldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTktOTAwCiAgICAvLyBlbnRyeSA9IHNjaGVkdWxlX3BhZ2VbaW5kZXhdLmNvcHkoKQogICAgLy8gZW50cnlfZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGludGNfMiAvLyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDAKICAgIC8vIGVudHJ5X2V2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBnZXRieXRlCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgMTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkwMQogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X2lkID09IHBhZ2VfY3Vyc29yICsgaW5kZXgsIGVyci5JTlZBTElEX0VWRU5UX0lECiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEzCiAgICBkaWcgNQogICAgdW5jb3ZlciA0CiAgICArCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDItOTA0CiAgICAvLyBzZWxmLl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBlbnRyeV9ldmVudF90eXBlCiAgICAvLyApCiAgICBkaWcgNQogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTA1CiAgICAvLyBhc3NlcnQgZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgc3dhcAogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDYKICAgIC8vIGlmIGVudHJ5LmV2ZW50X2lkID4gVUludDY0KDApOgogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDcKICAgIC8vIGlmIGluZGV4ID4gVUludDY0KDApOgogICAgZHVwCiAgICBieiBjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlANgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTA4CiAgICAvLyBwcmV2aW91c19lbnRyeSA9IHNjaGVkdWxlX3BhZ2VbaW5kZXggLSBVSW50NjQoMSldLmNvcHkoKQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgcHVzaGludCA2NQogICAgKgogICAgZGlnIDExCiAgICBzd2FwCiAgICBwdXNoaW50IDY1CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkyMwogICAgLy8gcHJldmlvdXNfZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gZW50cnkuc2NoZWR1bGVkX3RpbWUKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyA4CiAgICA8PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTIyLTkyNAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBwcmV2aW91c19lbnRyeS5zY2hlZHVsZWRfdGltZSA8PSBlbnRyeS5zY2hlZHVsZWRfdGltZQogICAgLy8gKSwgZXJyLklOVkFMSURfU09SVElORwogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIG11c3QgYmUgc29ydGVkIGluIHN0cmljdGx5IGFzY2VuZGluZyBvcmRlcgoKY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUA4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTI1CiAgICAvLyBpZiBlbnRyeS5ldmVudF9pZCA9PSBVSW50NjQoMCk6CiAgICBkaWcgOAogICAgYm56IGNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkyNi05MjgKICAgIC8vIGFzc2VydCBlbnRyeV9ldmVudF90eXBlID09IFVJbnQ2NCgKICAgIC8vICAgICBlbnVtcy5FVlRfSUVECiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGRpZyA5CiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjkKICAgIC8vIGluZGV4ICs9IFVJbnQ2NCgxKQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIGNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEAyCgpjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlANjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkxMC05MTIKICAgIC8vICMgVGhlIGZpcnN0IGVudHJ5IG9mIGEgcGFnZSBtdXN0IHN0aWxsIGJlIG9yZGVyZWQgYWZ0ZXIgdGhlCiAgICAvLyAjIGxhc3QgZW50cnkgb2YgdGhlIHByZXZpb3VzIHBhZ2UuCiAgICAvLyBhc3NlcnQgc2NoZWR1bGVfcGFnZV9pbmRleCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGRpZyA2CiAgICBkdXAKICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTMKICAgIC8vIHByZXZpb3VzX3BhZ2VfaW5kZXggPSBzY2hlZHVsZV9wYWdlX2luZGV4IC0gVUludDY0KDEpCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTE1CiAgICAvLyBwcmV2aW91c19wYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZQogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTQtOTE2CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHByZXZpb3VzX3BhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTctOTE4CiAgICAvLyBwcmV2aW91c19wYWdlID0gc2VsZi5zY2hlZHVsZV9wYWdlW3ByZXZpb3VzX3BhZ2VfaW5kZXhdLmNvcHkoKQogICAgLy8gYXNzZXJ0IHByZXZpb3VzX3BhZ2UubGVuZ3RoID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBwdXNoaW50IDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTgKICAgIC8vIGFzc2VydCBwcmV2aW91c19wYWdlLmxlbmd0aCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZHVwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjAKICAgIC8vIHByZXZpb3VzX3BhZ2UubGVuZ3RoIC0gVUludDY0KDEpCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTE5LTkyMQogICAgLy8gcHJldmlvdXNfZW50cnkgPSBwcmV2aW91c19wYWdlWwogICAgLy8gICAgIHByZXZpb3VzX3BhZ2UubGVuZ3RoIC0gVUludDY0KDEpCiAgICAvLyBdLmNvcHkoKQogICAgcHVzaGludCA2NQogICAgKgogICAgcHVzaGludCAyCiAgICArCiAgICBwdXNoaW50IDY1CiAgICBib3hfZXh0cmFjdAogICAgYiBjb250cmFjdF9zY2hlZHVsZV9hZnRlcl9pZl9lbHNlQDcKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX3doaWxlQDExOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjAwCiAgICAvLyBzZWxmLnNjaGVkdWxlX3BhZ2VbcGFnZV9pbmRleF0gPSBzY2hlZHVsZV9wYWdlLmNvcHkoKQogICAgZGlnIDYKICAgIGl0b2IKICAgIGJ5dGVjIDI0IC8vIDB4NTMyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgZGlnIDUKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzMgogICAgLy8gaWYgaXNfbGFzdF9wYWdlOgogICAgZGlnIDUKICAgIGJ6IGNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzNAogICAgLy8gc2NoZWR1bGVfcGFnZV9pbmRleCAqIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKSArIHBhZ2VfbGVuZ3RoCiAgICBkaWcgMQogICAgZGlnIDQKICAgICsKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzMwogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA9ICgKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTMzLTkzNQogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA9ICgKICAgIC8vICAgICBzY2hlZHVsZV9wYWdlX2luZGV4ICogVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpICsgcGFnZV9sZW5ndGgKICAgIC8vICkKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MzYKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgNTAKICAgIGFwcF9nbG9iYWxfcHV0Cgpjb250cmFjdF9zY2hlZHVsZV9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTExOAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9leGVjdXRlX2llZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X2V4ZWN1dGVfaWVkOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDMKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE0NAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDUKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTQ3CiAgICAvLyBhc3NlcnQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LCBlcnIuSU5WQUxJRF9FVkVOVF9DVVJTT1IKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgZGlnIDEKICAgID4KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGN1cnNvcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE0OAogICAgLy8gZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoc2VsZi5ldmVudF9jdXJzb3IpCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDkKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoZW51bXMuRVZUX0lFRCksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGR1cAogICAgZXh0cmFjdCA4IDEKICAgIGR1cAogICAgcHVzaGJ5dGVzIDB4MDEKICAgIGI9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1MwogICAgLy8gZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICBkaWcgMQogICAgZXh0cmFjdCAwIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTUKICAgIC8vIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgZGlnIDIKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTU2CiAgICAvLyBhY2NydWFsX2ZhY3Rvcj1lbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIGRpZyAzCiAgICBleHRyYWN0IDE3IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTcKICAgIC8vIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIGRpZyA0CiAgICBleHRyYWN0IDI1IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTkKICAgIC8vIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPWVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDUKICAgIGV4dHJhY3QgMzMgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE2MAogICAgLy8gbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgZGlnIDYKICAgIGV4dHJhY3QgNDEgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE2MQogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9ZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICBkaWcgNwogICAgZXh0cmFjdCA0OSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTYyCiAgICAvLyBmbGFncz1lbnRyeS5mbGFncywKICAgIGRpZyA4CiAgICBleHRyYWN0IDU3IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTItMTE2MwogICAgLy8gdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0KAogICAgLy8gICAgIGV2ZW50X2lkPWVudHJ5LmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1lbnRyeS5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1lbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPWVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9ZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPWVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGZsYWdzPWVudHJ5LmZsYWdzLAogICAgLy8gKSwKICAgIHVuY292ZXIgNwogICAgdW5jb3ZlciA4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNwogICAgY29uY2F0CiAgICB1bmNvdmVyIDYKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTgKICAgIC8vIG9ic2VydmVkX3JhdGU9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTItMTE2MwogICAgLy8gdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0KAogICAgLy8gICAgIGV2ZW50X2lkPWVudHJ5LmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1lbnRyeS5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1lbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPWVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9ZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPWVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGZsYWdzPWVudHJ5LmZsYWdzLAogICAgLy8gKSwKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTUwLTExNjQKICAgIC8vIHNlbGYuX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5KAogICAgLy8gICAgIGVudHJ5LAogICAgLy8gICAgIHR5cC5PYnNlcnZlZEV2ZW50UmVxdWVzdCgKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPWVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIG9ic2VydmVkX3JhdGU9VUludDY0KDApLAogICAgLy8gICAgICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1lbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1lbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICAgICAgZmxhZ3M9ZW50cnkuZmxhZ3MsCiAgICAvLyAgICAgKSwKICAgIC8vICkKICAgIGNhbGxzdWIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5CiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNjUKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEyMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuYXBwbHlfbm9uX2Nhc2hfZXZlbnRbcm91dGluZ10oKSAtPiB2b2lkOgphcHBseV9ub25fY2FzaF9ldmVudDoKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDQKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cG4gMgogICAgbGVuCiAgICBwdXNoaW50IDczCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLk9ic2VydmVkRXZlbnRSZXF1ZXN0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIwNAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMDUKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjA3CiAgICAvLyBpZiBwYXlsb2FkLmZsYWdzICYgVUludDY0KGVudW1zLkZMQUdfT0JTRVJWRURfRVZFTlQpOgogICAgcHVzaGludCA2NQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgcHVzaGludCA0CiAgICAmCiAgICBieiBhcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIzMwogICAgLy8gcmV0dXJuIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQ0xNKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICBwdXNoaW50IDUKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjA4CiAgICAvLyBhc3NlcnQgc2VsZi5fc3VwcG9ydHNfb2JzZXJ2ZWRfZXZlbnRzKCksIGVyci5PQlNFUlZFRF9FVkVOVF9SRVFVSVJFRAogICAgYXNzZXJ0IC8vIE9ic2VydmVkIGV2ZW50IHJlcXVpcmVkIHRvIGV4ZWN1dGUgdGhpcyBhY3Rpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMDkKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjMzCiAgICAvLyByZXR1cm4gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9DTE0pCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIGR1cAogICAgcHVzaGludCA1CiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQ1CiAgICAvLyBhc3NlcnQgc2VsZi5fc3VwcG9ydHNfb2JzZXJ2ZWRfZXZlbnRzKCksIGVyci5PQlNFUlZFRF9FVkVOVF9SRVFVSVJFRAogICAgYXNzZXJ0IC8vIE9ic2VydmVkIGV2ZW50IHJlcXVpcmVkIHRvIGV4ZWN1dGUgdGhpcyBhY3Rpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk0NgogICAgLy8gYXNzZXJ0IHBheWxvYWQuZXZlbnRfaWQgPT0gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGRpZyAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDcKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBpZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQ4CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUsIHBheWxvYWQuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgYnVyeSAxMgogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk0Ny05NDkKICAgIC8vIHNlbGYuX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIHNlbGYuY29udHJhY3RfdHlwZSwgcGF5bG9hZC5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICAvLyApCiAgICBjYWxsc3ViIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTUxCiAgICAvLyBwYWdlX2luZGV4ID0gc2VsZi5fc2NoZWR1bGVfcGFnZV9pbmRleChzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTkwCiAgICAvLyByZXR1cm4gZXZlbnRfaWQgLy8gVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpCiAgICBwdXNoaW50IDE2CiAgICAvCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTIKICAgIC8vIHBhZ2UgPSB0eXAuRXhlY3V0aW9uU2NoZWR1bGVQYWdlKCkKICAgIGJ5dGVjIDQ4IC8vIDB4MDAwMAogICAgYnVyeSA3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTMKICAgIC8vIGlmIHBhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlOgogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA5CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMjcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1NAogICAgLy8gcGFnZSA9IHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XS5jb3B5KCkKICAgIGRpZyA3CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidXJ5IDcKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX3BhZ2UgZW50cnkgZXhpc3RzCgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDI3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTU1CiAgICAvLyBhc3NlcnQgcGFnZS5sZW5ndGggPCBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGRpZyA1CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgMTYKICAgIDwKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2MAogICAgLy8gc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIGRpZyAzCiAgICBkdXAKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjEKICAgIC8vIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICBkaWcgMQogICAgZXh0cmFjdCAxNyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjIKICAgIC8vIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZGlnIDIKICAgIGV4dHJhY3QgMjUgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTYzCiAgICAvLyBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDMKICAgIGV4dHJhY3QgNDEgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTY0CiAgICAvLyBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIGRpZyA0CiAgICBleHRyYWN0IDQ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2NQogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIHVuY292ZXIgNQogICAgZXh0cmFjdCA1NyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTctOTY3CiAgICAvLyB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1wYXlsb2FkLmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9cGF5bG9hZC5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPXBheWxvYWQucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXBheWxvYWQubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICkKICAgIGRpZyAxMQogICAgaXRvYgogICAgZGlnIDE4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMwogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTYtOTY4CiAgICAvLyBwYWdlLmFwcGVuZCgKICAgIC8vICAgICB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9cGF5bG9hZC5ldmVudF9pZCwKICAgIC8vICAgICAgICAgZXZlbnRfdHlwZT1wYXlsb2FkLmV2ZW50X3R5cGUsCiAgICAvLyAgICAgICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIC8vICAgICAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICAgICApCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjkKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHBhZ2UuY29weSgpCiAgICBkaWcgOAogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk3MAogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjEyCiAgICAvLyBhc3NlcnQgZXZlbnRfaWQgPT0gc2VsZi5ldmVudF9jdXJzb3IsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBjdXJzb3IKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMTMKICAgIC8vIGVudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KGV2ZW50X2lkKQogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIxNQogICAgLy8gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgYnVyeSAxMAogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjQKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY1CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzYzLTM3MAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9SUiksCiAgICBwdXNoaW50IDEyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY3CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICBwdXNoaW50IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY4CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgcHVzaGludCAxOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzYzLTM3MAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBieiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX2ZhbHNlQDE2CgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX3RydWVAMTU6CiAgICBpbnRjXzEgLy8gMQoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9tZXJnZUAxNzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMTQtMTIxNgogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2lzX25vbl9jYXNoKAogICAgLy8gICAgIGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIC8vICksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IHR5cGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMTcKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlICE9IGFyYzQuVUludDgoZW51bXMuRVZUX0lFRCksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGRpZyA4CiAgICBwdXNoYnl0ZXMgMHgwMQogICAgYiE9CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCB0eXBlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNzQKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluIChVSW50NjQoZW51bXMuRVZUX1JSKSwgVUludDY0KGVudW1zLkVWVF9SUkYpKQogICAgZGlnIDQKICAgIHB1c2hpbnQgMTIKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDIxCiAgICBkaWcgNAogICAgcHVzaGludCAxMQogICAgPT0KICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfZmFsc2VAMjIKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAyMToKICAgIGludGNfMSAvLyAxCgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX21lcmdlQDIzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIxOAogICAgLy8gaWYgc2VsZi5fZXZlbnRfaXNfcmF0ZV9yZXNldChlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpKToKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Vsc2VfYm9keUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODAKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLm9ic2VydmVyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjUgLy8gMHg1MjNhNGQ0ZjQzMjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMjIKICAgIC8vIHNlbGYuX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5KGVudHJ5LCBwYXlsb2FkKQogICAgZGlnIDYKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeQogICAgcG9wbiAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjIzCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfZWxzZV9ib2R5QDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjIxCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIGIgYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYWZ0ZXJfaWZfZWxzZUA2CgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX2ZhbHNlQDIyOgogICAgaW50Y18wIC8vIDAKICAgIGIgYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9tZXJnZUAyMwoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9mYWxzZUAxNjoKICAgIGludGNfMCAvLyAwCiAgICBiIGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfbWVyZ2VAMTcKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5hcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50OgogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGxlbgogICAgcHVzaGludCA2NQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5PYnNlcnZlZENhc2hFdmVudFJlcXVlc3QKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjU0CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyNTUKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjU2CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIzMwogICAgLy8gcmV0dXJuIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQ0xNKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICBwdXNoaW50IDUKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5ODEKICAgIC8vIGFzc2VydCBzZWxmLl9zdXBwb3J0c19vYnNlcnZlZF9ldmVudHMoKSwgZXJyLk9CU0VSVkVEX0VWRU5UX1JFUVVJUkVECiAgICBhc3NlcnQgLy8gT2JzZXJ2ZWQgZXZlbnQgcmVxdWlyZWQgdG8gZXhlY3V0ZSB0aGlzIGFjdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTgyCiAgICAvLyBhc3NlcnQgcGF5bG9hZC5ldmVudF9pZCA9PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LCBlcnIuSU5WQUxJRF9FVkVOVF9JRAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgc3dhcAogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBpZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTgzCiAgICAvLyBhc3NlcnQgcGF5bG9hZC5ldmVudF90eXBlID09IGFyYzQuVUludDgoZW51bXMuRVZUX1BSKSwgZXJyLklOVkFMSURfRVZFTlRfVFlQRQogICAgZGlnIDEKICAgIGV4dHJhY3QgOCAxCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIHB1c2hieXRlcyAweDAzCiAgICBiPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IHR5cGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4NAogICAgLy8gYXNzZXJ0IHBheWxvYWQuZmxhZ3MgJiBVSW50NjQoZW51bXMuRkxBR19DQVNIX0VWRU5UKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBzd2FwCiAgICBwdXNoaW50IDU3CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzEgLy8gMQogICAgJgogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTg2CiAgICAvLyBpZiBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50ID4gVUludDY0KDApOgogICAgYnogYXBwZW5kX29ic2VydmVkX2Nhc2hfZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5ODgKICAgIC8vIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgLSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5ODctOTg5CiAgICAvLyBwcmV2aW91c19lbnRyeSA9IHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeSgKICAgIC8vICAgICBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IC0gVUludDY0KDEpCiAgICAvLyApCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5MQogICAgLy8gcHJldmlvdXNfZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gcGF5bG9hZC5zY2hlZHVsZWRfdGltZQogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDQKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIDw9CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OTAtOTkyCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHByZXZpb3VzX2VudHJ5LnNjaGVkdWxlZF90aW1lIDw9IHBheWxvYWQuc2NoZWR1bGVkX3RpbWUKICAgIC8vICksIGVyci5JTlZBTElEX1NPUlRJTkcKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBtdXN0IGJlIHNvcnRlZCBpbiBzdHJpY3RseSBhc2NlbmRpbmcgb3JkZXIKCmFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5NAogICAgLy8gcGFnZV9pbmRleCA9IHNlbGYuX3NjaGVkdWxlX3BhZ2VfaW5kZXgoc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE5MAogICAgLy8gcmV0dXJuIGV2ZW50X2lkIC8vIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKQogICAgcHVzaGludCAxNgogICAgLwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTk1CiAgICAvLyBwYWdlID0gdHlwLkV4ZWN1dGlvblNjaGVkdWxlUGFnZSgpCiAgICBieXRlYyA0OCAvLyAweDAwMDAKICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTk2CiAgICAvLyBpZiBwYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZToKICAgIGl0b2IKICAgIGJ5dGVjIDI0IC8vIDB4NTMyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgNwogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBhcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5NwogICAgLy8gcGFnZSA9IHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XS5jb3B5KCkKICAgIGRpZyA1CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidXJ5IDYKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX3BhZ2UgZW50cnkgZXhpc3RzCgphcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OTgKICAgIC8vIGFzc2VydCBwYWdlLmxlbmd0aCA8IFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZGlnIDQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgcHVzaGludCAxNgogICAgPAogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAwMwogICAgLy8gc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIGRpZyA1CiAgICBkdXAKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDA0CiAgICAvLyBhY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLmFjY3J1YWxfZmFjdG9yLAogICAgZGlnIDEKICAgIGV4dHJhY3QgMTcgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAwNQogICAgLy8gcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICBkaWcgMgogICAgZXh0cmFjdCAyNSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDA2CiAgICAvLyBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDMKICAgIGV4dHJhY3QgMzMgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAwNwogICAgLy8gbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1wYXlsb2FkLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICBkaWcgNAogICAgZXh0cmFjdCA0MSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDA4CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1wYXlsb2FkLm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgdW5jb3ZlciA1CiAgICBleHRyYWN0IDQ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMDAtMTAxMAogICAgLy8gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkoCiAgICAvLyAgICAgZXZlbnRfaWQ9cGF5bG9hZC5ldmVudF9pZCwKICAgIC8vICAgICBldmVudF90eXBlPXBheWxvYWQuZXZlbnRfdHlwZSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1wYXlsb2FkLnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9cGF5bG9hZC5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIC8vICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1wYXlsb2FkLm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGZsYWdzPXBheWxvYWQuZmxhZ3MsCiAgICAvLyApCiAgICBkaWcgMTAKICAgIGl0b2IKICAgIGRpZyAxMAogICAgY29uY2F0CiAgICB1bmNvdmVyIDYKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTk5LTEwMTEKICAgIC8vIHBhZ2UuYXBwZW5kKAogICAgLy8gICAgIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgICAgICBldmVudF9pZD1wYXlsb2FkLmV2ZW50X2lkLAogICAgLy8gICAgICAgICBldmVudF90eXBlPXBheWxvYWQuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICAgICAgYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPXBheWxvYWQubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1wYXlsb2FkLm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgICAgICBmbGFncz1wYXlsb2FkLmZsYWdzLAogICAgLy8gICAgICkKICAgIC8vICkKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMTIKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHBhZ2UuY29weSgpCiAgICBkaWcgNgogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMTMKICAgIC8vIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgKz0gVUludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI2MAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9nZXRfc3RhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9nZXRfc3RhdGU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGR1cAogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjc1CiAgICAvLyBjb250cmFjdF90eXBlPWFyYzQuVUludDgoc2VsZi5jb250cmFjdF90eXBlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgaXRvYgogICAgZHVwCiAgICBiaXRsZW4KICAgIGludGNfMiAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBleHRyYWN0IDcgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI3NwogICAgLy8gdG90YWxfdW5pdHM9c2VsZi50b3RhbF91bml0cywKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjc4CiAgICAvLyByZXNlcnZlZF91bml0c190b3RhbD1zZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyNzkKICAgIC8vIGluaXRpYWxfZXhjaGFuZ2VfYW1vdW50PXNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI4MAogICAgLy8gZXZlbnRfY3Vyc29yPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjgxCiAgICAvLyBzY2hlZHVsZV9lbnRyeV9jb3VudD1zZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI4MgogICAgLy8gb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjgzCiAgICAvLyBpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlPXNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjg0CiAgICAvLyBub21pbmFsX2ludGVyZXN0X3JhdGU9c2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyODUKICAgIC8vIGFjY3J1ZWRfaW50ZXJlc3Q9c2VsZi5hY2NydWVkX2ludGVyZXN0LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyODYKICAgIC8vIGN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXg9c2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjg3CiAgICAvLyBjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleD1zZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyODgKICAgIC8vIHJlc2VydmVkX2ludGVyZXN0PXNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX2ludGVyZXN0IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI4OQogICAgLy8gcmVzZXJ2ZWRfcHJpbmNpcGFsPXNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI3NC0xMjkwCiAgICAvLyByZXR1cm4gdHlwLktlcm5lbFN0YXRlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGU9YXJjNC5VSW50OChzZWxmLmNvbnRyYWN0X3R5cGUpLAogICAgLy8gICAgIHN0YXR1cz1zZWxmLnN0YXR1cywKICAgIC8vICAgICB0b3RhbF91bml0cz1zZWxmLnRvdGFsX3VuaXRzLAogICAgLy8gICAgIHJlc2VydmVkX3VuaXRzX3RvdGFsPXNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwsCiAgICAvLyAgICAgaW5pdGlhbF9leGNoYW5nZV9hbW91bnQ9c2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCwKICAgIC8vICAgICBldmVudF9jdXJzb3I9c2VsZi5ldmVudF9jdXJzb3IsCiAgICAvLyAgICAgc2NoZWR1bGVfZW50cnlfY291bnQ9c2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwKICAgIC8vICAgICBvdXRzdGFuZGluZ19wcmluY2lwYWw9c2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZT1zZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICAvLyAgICAgbm9taW5hbF9pbnRlcmVzdF9yYXRlPXNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIGFjY3J1ZWRfaW50ZXJlc3Q9c2VsZi5hY2NydWVkX2ludGVyZXN0LAogICAgLy8gICAgIGN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXg9c2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4LAogICAgLy8gICAgIGN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4PXNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgsCiAgICAvLyAgICAgcmVzZXJ2ZWRfaW50ZXJlc3Q9c2VsZi5yZXNlcnZlZF9pbnRlcmVzdCwKICAgIC8vICAgICByZXNlcnZlZF9wcmluY2lwYWw9c2VsZi5yZXNlcnZlZF9wcmluY2lwYWwsCiAgICAvLyApCiAgICB1bmNvdmVyIDE0CiAgICBpdG9iCiAgICB1bmNvdmVyIDE0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMgogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDExCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA5CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgOAogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDcKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyNjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzA0CiAgICAvLyBpZiBzZWxmLmV2ZW50X2N1cnNvciA+PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICA+PQogICAgYnogY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMwNgogICAgLy8gZXZlbnRfaWQ9c2VsZi5ldmVudF9jdXJzb3IsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMDUtMTMxNQogICAgLy8gcmV0dXJuIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgIGV2ZW50X2lkPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgLy8gICAgIGV2ZW50X3R5cGU9YXJjNC5VSW50OCgwKSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1VSW50NjQoMCksCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1VSW50NjQoMCksCiAgICAvLyAgICAgZmxhZ3M9VUludDY0KDApLAogICAgLy8gKQogICAgaXRvYgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMwNwogICAgLy8gZXZlbnRfdHlwZT1hcmM0LlVJbnQ4KDApLAogICAgYnl0ZWMgNDAgLy8gMHgwMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMwNS0xMzE1CiAgICAvLyByZXR1cm4gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkoCiAgICAvLyAgICAgZXZlbnRfaWQ9c2VsZi5ldmVudF9jdXJzb3IsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1hcmM0LlVJbnQ4KDApLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPVVJbnQ2NCgwKSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249VUludDY0KDApLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPVVJbnQ2NCgwKSwKICAgIC8vICAgICBmbGFncz1VSW50NjQoMCksCiAgICAvLyApCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMDgKICAgIC8vIHNjaGVkdWxlZF90aW1lPVVJbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzA1LTEzMTUKICAgIC8vIHJldHVybiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1zZWxmLmV2ZW50X2N1cnNvciwKICAgIC8vICAgICBldmVudF90eXBlPWFyYzQuVUludDgoMCksCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9VUludDY0KDApLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9VUludDY0KDApLAogICAgLy8gICAgIGZsYWdzPVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAoKY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50QDQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjkyCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzE2CiAgICAvLyByZXR1cm4gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KHNlbGYuZXZlbnRfY3Vyc29yKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyOTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiBjb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnRfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnRANAoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLmNvbnRyYWN0X3VwZGF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X3VwZGF0ZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTktMTYyCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gZ3JhbnRzIHRoZSB1cGRhdGUgcGVybWlzc2lvbnMgdG8gdGhlIEFycmFuZ2VyLgogICAgLy8gIyDimqDvuI8gV0FSTklORzogQXBwbGljYXRpb24gdXBkYXRlcyBtdXN0IGJlIGV4ZWN1dGVkIFZFUlkgY2FyZWZ1bGx5LCBhcyB0aGV5CiAgICAvLyAjIG1pZ2h0IGludHJvZHVjZSBicmVha2luZyBjaGFuZ2VzLgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19yb3RhdGVfYXJyYW5nZXJbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3JvdGF0ZV9hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTc4CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzkKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSBuZXdfYXJyYW5nZXIKICAgIGJ5dGVjIDE4IC8vIDB4NTIzYTQxNTI1MjIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4MAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTY0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3NldF9vcF9kYWVtb25bcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3NldF9vcF9kYWVtb246CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTgyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE5NgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTk3CiAgICAvLyBzZWxmLm9wX2RhZW1vbi52YWx1ZSA9IGFkZHJlc3MKICAgIGJ5dGVjIDI2IC8vIDB4NTIzYTRmNTA0NDIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE5OAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTgyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2Fzc2lnbl9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19hc3NpZ25fcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDE2CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLlJvbGVWYWxpZGl0eQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyMgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjIzCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNAogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgcHVzaGludCAyMAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTAzCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gcm9sZV9hZGRyZXNzCiAgICBieXRlYyAxOCAvLyAweDUyM2E0MTUyNTIyMwogICAgZGlnIDMKICAgIGFwcF9nbG9iYWxfcHV0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwNgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDQwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDcKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIzIC8vIDB4NTIzYTRkNGU0NzIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDgKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI1CiAgICAvLyBzZWxmLl9zZXRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIHZhbGlkaXR5KQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTAKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTEKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjIgLy8gMHg1MjNhNTA1OTQ0MjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMgogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNQogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE0CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpOgogICAgZHVwCiAgICBwdXNoaW50IDYwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTUKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAzMiAvLyAweDUyM2E1NDUyNTMyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE2CiAgICAvLyBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjUKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExOAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMSAvLyAweDUyM2E0MTU1NTQyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIwCiAgICAvLyBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNQogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgODAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIzCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI1IC8vIDB4NTIzYTRkNGY0MzIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjQKICAgIC8vIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfcmV2b2tlX3JvbGVbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3Jldm9rZV9yb2xlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0NwogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjQ4CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0OQogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjcKICAgIC8vIGFzc2VydCByb2xlX2lkICE9IFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwgZXJyLklOVkFMSURfUk9MRQogICAgZHVwCiAgICBwdXNoaW50IDIwCiAgICAhPQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI4CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICBwdXNoaW50IDQwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjkKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjMgLy8gMHg1MjNhNGQ0ZTQ3MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMAogICAgLy8gZGVsIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTEKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzMKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMiAvLyAweDUyM2E1MDU5NDQyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM0CiAgICAvLyBkZWwgc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTAKICAgIC8vIHNlbGYuX2RlbGV0ZV9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcykKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM2CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpOgogICAgZHVwCiAgICBwdXNoaW50IDYwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzcKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDMyIC8vIDB4NTIzYTU0NTI1MzIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzgKICAgIC8vIGRlbCBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjUwCiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDEKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hdXRob3JpdHksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjEgLy8gMHg1MjNhNDE1NTU0MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MgogICAgLy8gZGVsIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1MAogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDQKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDgwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI1IC8vIDB4NTIzYTRkNGY0MzIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDYKICAgIC8vIGRlbCBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19jb250cmFjdF9zdXNwZW5zaW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19jb250cmFjdF9zdXNwZW5zaW9uOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kICAjIFRPRE86IFVwZGF0ZSBzcGVjcyBhbmQgYWRkIHRlc3QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzcKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDIxIC8vIDB4NTIzYTQxNTU1NDIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjY5CiAgICAvLyBzZWxmLmFzc2V0X3N1c3BlbmRlZCA9IHN1c3BlbmRlZAogICAgYnl0ZWMgMzMgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjcwCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCAgIyBUT0RPOiBVcGRhdGUgc3BlY3MgYW5kIGFkZCB0ZXN0CiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYXJyYW5nZXJbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODMKICAgIC8vIHJldHVybiBzZWxmLmFycmFuZ2VyLnZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTggLy8gMHg1MjNhNDE1MjUyMjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcnJhbmdlciBleGlzdHMKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNzIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXNbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9hZGRyZXNzX3JvbGVzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDMKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDIzIC8vIDB4NTIzYTRkNGU0NzIzCiAgICBkaWcgMQogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDQKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYucHJpbWFyeV9kZWFsZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjIgLy8gMHg1MjNhNTA1OTQ0MjMKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwNQogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi50cnVzdGVlLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDMyIC8vIDB4NTIzYTU0NTI1MzIzCiAgICBkaWcgMwogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDYKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYXV0aG9yaXR5LCBhZGRyZXNzKSwKICAgIGJ5dGVjIDIxIC8vIDB4NTIzYTQxNTU1NDIzCiAgICBkaWcgNAogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDcKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYub2JzZXJ2ZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjUgLy8gMHg1MjNhNGQ0ZjQzMjMKICAgIHVuY292ZXIgNQogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWMgNDAgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgNgogICAgc2V0Yml0CiAgICBpbnRjXzEgLy8gMQogICAgdW5jb3ZlciA1CiAgICBzZXRiaXQKICAgIHB1c2hpbnQgMgogICAgdW5jb3ZlciA0CiAgICBzZXRiaXQKICAgIHB1c2hpbnQgMwogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIHB1c2hpbnQgNAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5W3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfcm9sZV92YWxpZGl0eToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjgKICAgIC8vIHJvbGUgPSByb2xlX2lkLmFzX3VpbnQ2NCgpCiAgICBidG9pCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI5CiAgICAvLyBzZWxmLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlKQogICAgZHVwCiAgICBjYWxsc3ViIF9hc3NlcnRfdmFsaWRfcm9sZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMzMQogICAgLy8gY2FzZSBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUik6CiAgICBwdXNoaW50cyAyMCA0MCA1MCA2MCA3MCA4MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMzMC0zNjEKICAgIC8vIG1hdGNoIHJvbGU6CiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUik6CiAgICAvLyAgICAgICAgIHJldHVybiB0eXAuUm9sZVZhbGlkaXR5KAogICAgLy8gICAgICAgICAgICAgcm9sZV92YWxpZGl0eV9zdGFydD1VSW50NjQoMCksIHJvbGVfdmFsaWRpdHlfZW5kPVVJbnQ2NCgwKQogICAgLy8gICAgICAgICApCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLmFjY291bnRfbWFuYWdlciwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLnByaW1hcnlfZGVhbGVyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLmF1dGhvcml0eSwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLm9ic2VydmVyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIF86CiAgICAvLyAgICAgICAgIG9wLmVycihlcnIuSU5WQUxJRF9ST0xFKQogICAgdW5jb3ZlciA2CiAgICBtYXRjaCByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzBAMiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzFAMyByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzJANCByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzNANSByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzRANiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzVANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM2MQogICAgLy8gb3AuZXJyKGVyci5JTlZBTElEX1JPTEUpCiAgICBlcnIgLy8gSW52YWxpZCByb2xlIGlkZW50aWZpZXIKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM1NwogICAgLy8gc2VsZi5vYnNlcnZlciwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAyNSAvLyAweDUyM2E0ZDRmNDMyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM1Ni0zNTgKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLm9ic2VydmVyLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTkKICAgIC8vIHJldHVybiBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV80QDY6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzUyCiAgICAvLyBzZWxmLmF1dGhvcml0eSwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAyMSAvLyAweDUyM2E0MTU1NTQyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM1MS0zNTMKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLmF1dGhvcml0eSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzU0CiAgICAvLyByZXR1cm4gc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8zQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzQ3CiAgICAvLyBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMzIgLy8gMHg1MjNhNTQ1MjUzMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNDYtMzQ4CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNDkKICAgIC8vIHJldHVybiBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8yQDQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzQyCiAgICAvLyBzZWxmLnByaW1hcnlfZGVhbGVyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDIyIC8vIDB4NTIzYTUwNTk0NDIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzQxLTM0MwogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM0NAogICAgLy8gcmV0dXJuIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8xQDM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzM3CiAgICAvLyBzZWxmLmFjY291bnRfbWFuYWdlciwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAyMyAvLyAweDUyM2E0ZDRlNDcyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMzNi0zMzgKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLmFjY291bnRfbWFuYWdlciwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzM5CiAgICAvLyByZXR1cm4gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8wQDI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzMyLTMzNAogICAgLy8gcmV0dXJuIHR5cC5Sb2xlVmFsaWRpdHkoCiAgICAvLyAgICAgcm9sZV92YWxpZGl0eV9zdGFydD1VSW50NjQoMCksIHJvbGVfdmFsaWRpdHlfZW5kPVVJbnQ2NCgwKQogICAgLy8gKQogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQoaG9sZGluZ19hZGRyZXNzOiBieXRlcykgLT4gdm9pZDoKX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQ6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjYKICAgIC8vIGRlZiBfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChzZWxmLCBob2xkaW5nX2FkZHJlc3M6IEFjY291bnQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyOAogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQsIGVyci5TVVNQRU5ERUQKICAgIGJ5dGVjIDggLy8gMHg0MTIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHB1c2hpbnQgMzg0CiAgICBnZXRiaXQKICAgICEKICAgIGFzc2VydCAvLyBTdXNwZW5kZWQgb3BlcmF0aW9ucwogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuX3NldHRsZV9wb3NpdGlvbihob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB1aW50NjQsIHVpbnQ2NDoKX3NldHRsZV9wb3NpdGlvbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo0NAogICAgLy8gZGVmIF9zZXR0bGVfcG9zaXRpb24oc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50KSAtPiB0dXBsZVtVSW50NjQsIFVJbnQ2NF06CiAgICBwcm90byAxIDIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo2MQogICAgLy8gcG9zaXRpb24gPSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jb3B5KCkKICAgIGR1cAogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NjMtNjUKICAgIC8vICMgQ29tcHV0ZSB0aGUgaW5jcmVtZW50YWwgcGVyLXVuaXQgZml4ZWQtcG9pbnQgaW50ZXJlc3QgYW5kIHByaW5jaXBhbCBhY2NydWVkCiAgICAvLyAjIHNpbmNlIHRoaXMgYWNjb3VudCdzIGxhc3QgY2hlY2twb2ludC4KICAgIC8vIGludGVyZXN0X2RlbHRhID0gc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IC0gcG9zaXRpb24uaW50ZXJlc3RfY2hlY2twb2ludAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggZXhpc3RzCiAgICBkaWcgMQogICAgcHVzaGludCA1NwogICAgZXh0cmFjdF91aW50NjQKICAgIC0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo2NwogICAgLy8gc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCAtIHBvc2l0aW9uLnByaW5jaXBhbF9jaGVja3BvaW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTcgLy8gImN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IGV4aXN0cwogICAgZGlnIDIKICAgIHB1c2hpbnQgNjUKICAgIGV4dHJhY3RfdWludDY0CiAgICAtCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzMKICAgIC8vIGludGVyZXN0X2RlbHRhLCBwb3NpdGlvbi51bml0cywgc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgZGlnIDIKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3MC03NAogICAgLy8gIyBDb252ZXJ0IHRoZSBwZXItdW5pdCBmaXhlZC1wb2ludCBkZWx0YXMgaW50byBhYnNvbHV0ZSBjbGFpbWFibGUgYW1vdW50cwogICAgLy8gIyB1c2luZyB0aGUgYWNjb3VudCdzIGFjdGl2ZSB1bml0cy4KICAgIC8vIGNsYWltYWJsZV9pbnRlcmVzdCA9IHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIGludGVyZXN0X2RlbHRhLCBwb3NpdGlvbi51bml0cywgc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgLy8gKQogICAgdW5jb3ZlciAzCiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojc2CiAgICAvLyBwcmluY2lwYWxfZGVsdGEsIHBvc2l0aW9uLnVuaXRzLCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzUtNzcKICAgIC8vIGNsYWltYWJsZV9wcmluY2lwYWwgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBwcmluY2lwYWxfZGVsdGEsIHBvc2l0aW9uLnVuaXRzLCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICAvLyApCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojc5LTgxCiAgICAvLyAjIEFjY3J1ZSB0aGUgY2xhaW1hYmxlIGFtb3VudHMgdG8gdGhlIGFjY291bnQgcG9zaXRpb24gYW5kIG1ha2UgdGhlbSBhdmFpbGFibGUKICAgIC8vICMgZm9yIHdpdGhkcmF3YWwuCiAgICAvLyBwb3NpdGlvbi5jbGFpbWFibGVfaW50ZXJlc3QgKz0gY2xhaW1hYmxlX2ludGVyZXN0CiAgICBkaWcgMgogICAgcHVzaGludCA3MwogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICArCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIHN3YXAKICAgIHJlcGxhY2UyIDczCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6ODIKICAgIC8vIHBvc2l0aW9uLmNsYWltYWJsZV9wcmluY2lwYWwgKz0gY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgZHVwCiAgICBwdXNoaW50IDgxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDIKICAgICsKICAgIGl0b2IKICAgIHJlcGxhY2UyIDgxCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6ODQtODYKICAgIC8vICMgQWR2YW5jZSB0aGUgYWNjb3VudCdzIHBlci11bml0IGZpeGVkLXBvaW50IGNoZWNrcG9pbnRzIHRvIHRoZSBjdXJyZW50IGdsb2JhbAogICAgLy8gIyBwZXItdW5pdCBmaXhlZC1wb2ludCBnbG9iYWwgaW5kaWNlcy4KICAgIC8vIHBvc2l0aW9uLmludGVyZXN0X2NoZWNrcG9pbnQgPSBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IGV4aXN0cwogICAgaXRvYgogICAgcmVwbGFjZTIgNTcKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo4NwogICAgLy8gcG9zaXRpb24ucHJpbmNpcGFsX2NoZWNrcG9pbnQgPSBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTcgLy8gImN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IGV4aXN0cwogICAgaXRvYgogICAgcmVwbGFjZTIgNjUKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo4OS05MAogICAgLy8gIyBBZHZhbmNlIHRoZSBhY2NvdW50J3MgZXZlbnQgY3Vyc29yIHRvIHRoZSBjdXJyZW50IGdsb2JhbCBldmVudCBjdXJzb3IuCiAgICAvLyBwb3NpdGlvbi5zZXR0bGVkX2N1cnNvciA9IHNlbGYuZXZlbnRfY3Vyc29yCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGl0b2IKICAgIHJlcGxhY2UyIDQ5CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6OTItOTQKICAgIC8vICMgVXBkYXRlIHRoZSBhY2NvdW50IHBvc2l0aW9uIGFuZCByZXR1cm4gdGhlIG5ld2x5IGFjY3J1ZWQgY2xhaW1hYmxlIGFtb3VudHMKICAgIC8vICMgYWRkZWQgdG8gdGhlIHRvdGFsIHBvc2l0aW9uJ3MgY2xhaW1hYmxlIGFtb3VudHMuCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHBvc2l0aW9uLmNvcHkoKQogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6OTUKICAgIC8vIHJldHVybiBjbGFpbWFibGVfaW50ZXJlc3QsIGNsYWltYWJsZV9wcmluY2lwYWwKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IHZvaWQ6Cl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojk3CiAgICAvLyBkZWYgX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQoc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg0MTIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwMAogICAgLy8gaWYgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCk6CiAgICBieiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZF9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDEKICAgIC8vIHJldHVybgogICAgcmV0c3ViCgpfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZF9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTAzCiAgICAvLyBwb3NpdGlvbiA9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNvcHkoKQogICAgZnJhbWVfZGlnIDIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwNAogICAgLy8gaWYgcG9zaXRpb24ucmVzZXJ2ZWRfdW5pdHMgPT0gVUludDY0KDApOgogICAgcHVzaGludCA0MAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICBibnogX2Vuc3VyZV91bml0c19hY3RpdmF0ZWRfYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA1CiAgICAvLyByZXR1cm4KICAgIHJldHN1YgoKX2Vuc3VyZV91bml0c19hY3RpdmF0ZWRfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwOAogICAgLy8gcG9zaXRpb24udW5pdHMgKz0gYWN0aXZhdGVkX3VuaXRzCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAzCiAgICArCiAgICBpdG9iCiAgICByZXBsYWNlMiAzMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwOQogICAgLy8gcG9zaXRpb24ucmVzZXJ2ZWRfdW5pdHMgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBpdG9iCiAgICByZXBsYWNlMiA0MAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExMAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSBwb3NpdGlvbi5jb3B5KCkKICAgIGZyYW1lX2RpZyAyCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTExCiAgICAvLyBhc3NlcnQgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCA+PSBhY3RpdmF0ZWRfdW5pdHMsIGVyci5PVkVSX0RJU1RSSUJVVElPTgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCBleGlzdHMKICAgIGR1cAogICAgZGlnIDIKICAgID49CiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IHJlbWFpbmluZyBELUFTQSB1bml0cwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExMgogICAgLy8gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCAtPSBhY3RpdmF0ZWRfdW5pdHMKICAgIHN3YXAKICAgIC0KICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fc2NhbGVkX211bF9kaXYobXVsdGlwbGljYW5kOiB1aW50NjQsIG11bHRpcGxpZXI6IHVpbnQ2NCwgZGl2aXNvcjogdWludDY0KSAtPiB1aW50NjQ6Cl9zY2FsZWRfbXVsX2RpdjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE1My0xNTUKICAgIC8vIGRlZiBfc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgc2VsZiwgbXVsdGlwbGljYW5kOiBVSW50NjQsIG11bHRpcGxpZXI6IFVJbnQ2NCwgZGl2aXNvcjogVUludDY0CiAgICAvLyApIC0+IFVJbnQ2NDoKICAgIHByb3RvIDMgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTU3CiAgICAvLyBpZiBtdWx0aXBsaWNhbmQgPT0gVUludDY0KDApIG9yIG11bHRpcGxpZXIgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0zCiAgICBieiBfc2NhbGVkX211bF9kaXZfaWZfYm9keUAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGJueiBfc2NhbGVkX211bF9kaXZfYWZ0ZXJfaWZfZWxzZUAzCgpfc2NhbGVkX211bF9kaXZfaWZfYm9keUAyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTU4CiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfc2NhbGVkX211bF9kaXZfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTU5CiAgICAvLyBoaWdoLCBsb3cgPSBvcC5tdWx3KG11bHRpcGxpY2FuZCwgbXVsdGlwbGllcikKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0yCiAgICBtdWx3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjAKICAgIC8vIHJldHVybiBvcC5kaXZ3KGhpZ2gsIGxvdywgZGl2aXNvcikKICAgIGZyYW1lX2RpZyAtMQogICAgZGl2dwogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Ftb3VudF90b19pbmRleF9kZWx0YShhbW91bnQ6IHVpbnQ2NCkgLT4gdWludDY0OgpfYW1vdW50X3RvX2luZGV4X2RlbHRhOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTYyCiAgICAvLyBkZWYgX2Ftb3VudF90b19pbmRleF9kZWx0YShzZWxmLCBhbW91bnQ6IFVJbnQ2NCkgLT4gVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjQKICAgIC8vIGlmIGFtb3VudCA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGJueiBfYW1vdW50X3RvX2luZGV4X2RlbHRhX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTY1CiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfYW1vdW50X3RvX2luZGV4X2RlbHRhX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2NgogICAgLy8gYXNzZXJ0IHNlbGYudG90YWxfdW5pdHMgPiBVSW50NjQoMCksIGVyci5OT19VTklUUwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIGR1cAogICAgYXNzZXJ0IC8vIE5vIEQtQVNBIHVuaXRzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjcKICAgIC8vIHJldHVybiBzZWxmLl9zY2FsZWRfbXVsX2RpdihhbW91bnQsIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsIHNlbGYudG90YWxfdW5pdHMpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9pbmRleF9kZWx0YV90b19hbW91bnQoaW5kZXhfZGVsdGE6IHVpbnQ2NCkgLT4gdWludDY0OgpfaW5kZXhfZGVsdGFfdG9fYW1vdW50OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTY5CiAgICAvLyBkZWYgX2luZGV4X2RlbHRhX3RvX2Ftb3VudChzZWxmLCBpbmRleF9kZWx0YTogVUludDY0KSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE3NgogICAgLy8gaWYgaW5kZXhfZGVsdGEgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0xCiAgICBibnogX2luZGV4X2RlbHRhX3RvX2Ftb3VudF9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE3NwogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKX2luZGV4X2RlbHRhX3RvX2Ftb3VudF9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNzkKICAgIC8vIHNlbGYudG90YWxfdW5pdHMsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTgxCiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTc4LTE4MgogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIHNlbGYudG90YWxfdW5pdHMsCiAgICAvLyAgICAgaW5kZXhfZGVsdGEsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9nZXRfc2NoZWR1bGVfZW50cnkoZXZlbnRfaWQ6IHVpbnQ2NCkgLT4gYnl0ZXM6Cl9nZXRfc2NoZWR1bGVfZW50cnk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMDIKICAgIC8vIGRlZiBfZ2V0X3NjaGVkdWxlX2VudHJ5KHNlbGYsIGV2ZW50X2lkOiBVSW50NjQpIC0+IHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5OgogICAgcHJvdG8gMSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMDQKICAgIC8vIGFzc2VydCBldmVudF9pZCA8IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQsIGVyci5JTlZBTElEX0VWRU5UX0lECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgID4KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxOTAKICAgIC8vIHJldHVybiBldmVudF9pZCAvLyBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAxNgogICAgLwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjA2CiAgICAvLyBhc3NlcnQgcGFnZV9pbmRleCBpbiBzZWxmLnNjaGVkdWxlX3BhZ2UsIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGl0b2IKICAgIGJ5dGVjIDI0IC8vIDB4NTMyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTk0CiAgICAvLyByZXR1cm4gZXZlbnRfaWQgJSBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAxNgogICAgJQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjA5CiAgICAvLyBhc3NlcnQgb2Zmc2V0IDwgcGFnZS5sZW5ndGgsIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGludCAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZGlnIDEKICAgID4KICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIxMAogICAgLy8gcmV0dXJuIHBhZ2Vbb2Zmc2V0XS5jb3B5KCkKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgMgogICAgKwogICAgcHVzaGludCA2NQogICAgYm94X2V4dHJhY3QKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZShjb250cmFjdF90eXBlOiB1aW50NjQsIGV2ZW50X3R5cGU6IHVpbnQ2NCkgLT4gdm9pZDoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzEzLTMxNQogICAgLy8gZGVmIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBzZWxmLCBjb250cmFjdF90eXBlOiBVSW50NjQsIGV2ZW50X3R5cGU6IFVJbnQ2NAogICAgLy8gKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjQ3CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lFRCksCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU0LTI1NQogICAgLy8gIyBDaGVjayBjb21tb24gZXZlbnRzIGZpcnN0CiAgICAvLyBpZiBldmVudF90eXBlIGluIGNvbW1vbl9ldmVudHM6CiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjQ4CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQKSwKICAgIGludGNfMiAvLyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNDkKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfTUQpLAogICAgcHVzaGludCAxOQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU0LTI1NQogICAgLy8gIyBDaGVjayBjb21tb24gZXZlbnRzIGZpcnN0CiAgICAvLyBpZiBldmVudF90eXBlIGluIGNvbW1vbl9ldmVudHM6CiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjUwCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIHB1c2hpbnQgMTIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1MQogICAgLy8gVUludDY0KGVudW1zLkVWVF9SUkYpLAogICAgcHVzaGludCAxMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU0LTI1NQogICAgLy8gIyBDaGVjayBjb21tb24gZXZlbnRzIGZpcnN0CiAgICAvLyBpZiBldmVudF90eXBlIGluIGNvbW1vbl9ldmVudHM6CiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VANwoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1NgogICAgLy8gcmV0dXJuIFRydWUKICAgIGludGNfMSAvLyAxCgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgcmV0c3ViCgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU4LTI1OQogICAgLy8gIyBDb250cmFjdC1zcGVjaWZpYyBhZGRpdGlvbmFsIGV2ZW50cwogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfUEFNKToKICAgIGZyYW1lX2RpZyAtMgogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2MC0yNjEKICAgIC8vICMgUEFNIG9ubHkgc3VwcG9ydHMgY29tbW9uIGV2ZW50cwogICAgLy8gcmV0dXJuIEZhbHNlCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjYzCiAgICAvLyBpZiBjb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9MQU0pIG9yIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDMKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNjMtMjY1CiAgICAvLyBpZiBjb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9MQU0pIG9yIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KAogICAgLy8gICAgIGVudW1zLkNUX05BTQogICAgLy8gKToKICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUAxMQogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDIKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAxNgoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlAMTE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNjYtMjcwCiAgICAvLyAjIExBTS9OQU0gYWRkOiBQUiwgSVBDQgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2OAogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUiksCiAgICBwdXNoaW50IDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2Ni0yNzAKICAgIC8vICMgTEFNL05BTSBhZGQ6IFBSLCBJUENCCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAxMwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNjkKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICBwdXNoaW50IDE4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNjYtMjcwCiAgICAvLyAjIExBTS9OQU0gYWRkOiBQUiwgSVBDQgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyApCiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMTQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMTM6CiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF9mYWxzZUAxNDoKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDE2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjcyCiAgICAvLyBpZiBjb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pOgogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDIzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzMtMjc4CiAgICAvLyAjIEFOTiBhZGRzOiBQUiwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3NQogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUiksCiAgICBwdXNoaW50IDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3My0yNzgKICAgIC8vICMgQU5OIGFkZHM6IFBSLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyMAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzYKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICBwdXNoaW50IDE4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzMtMjc4CiAgICAvLyAjIEFOTiBhZGRzOiBQUiwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjAKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjc3CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICBwdXNoaW50IDUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3My0yNzgKICAgIC8vICMgQU5OIGFkZHM6IFBSLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF9mYWxzZUAyMQoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyMDoKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDIxOgogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMjM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODAKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0xBWCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDMxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODEtMjg3CiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODMKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODEtMjg3CiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDI4CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4NAogICAgLy8gVUludDY0KGVudW1zLkVWVF9QSSksCiAgICBwdXNoaW50IDQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MS0yODcKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjgKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjg1CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgcHVzaGludCAxOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjgxLTI4NwogICAgLy8gIyBMQVggYWRkczogUFIsIFBJLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyOAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODYKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIHB1c2hpbnQgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjgxLTI4NwogICAgLy8gIyBMQVggYWRkczogUFIsIFBJLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF9mYWxzZUAyOQoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyODoKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDI5OgogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMzE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODkKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0NMTSk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDMzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyOTAtMjkxCiAgICAvLyAjIENMTSBhZGRzOiBQUgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QUikKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAzCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAzMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI5MwogICAgLy8gcmV0dXJuIEZhbHNlCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2lzX2R5bmFtaWNfYW5udWl0eSgpIC0+IHVpbnQ2NDoKX2lzX2R5bmFtaWNfYW5udWl0eToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMzNQogICAgLy8gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM1LTMzNgogICAgLy8gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICAvLyBhbmQgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBieiBfaXNfZHluYW1pY19hbm51aXR5X2Jvb2xfZmFsc2VAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM2CiAgICAvLyBhbmQgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzQgLy8gImR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMzNS0zMzYKICAgIC8vIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKQogICAgLy8gYW5kIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgYnogX2lzX2R5bmFtaWNfYW5udWl0eV9ib29sX2ZhbHNlQDMKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzQtMzM3CiAgICAvLyByZXR1cm4gKAogICAgLy8gICAgIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKQogICAgLy8gICAgIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIC8vICkKICAgIHJldHN1YgoKX2lzX2R5bmFtaWNfYW5udWl0eV9ib29sX2ZhbHNlQDM6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM0LTMzNwogICAgLy8gcmV0dXJuICgKICAgIC8vICAgICBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIC8vICAgICBhbmQgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICAvLyApCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfaW50ZXJlc3Rfc2VnbWVudChlbnRyeTogYnl0ZXMpIC0+IHVpbnQ2NCwgYnl0ZXM6Cl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzgwCiAgICAvLyBkZWYgX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoc2VsZiwgZW50cnk6IHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM4OQogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMTcKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM4OS0zOTEKICAgIC8vIGVudHJ5LmFjY3J1YWxfZmFjdG9yID09IFVJbnQ2NCgwKQogICAgLy8gb3Igc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPT0gVUludDY0KDApCiAgICBieiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudF9pZl9ib2R5QDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5MAogICAgLy8gb3Igc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPT0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM4OS0zOTEKICAgIC8vIGVudHJ5LmFjY3J1YWxfZmFjdG9yID09IFVJbnQ2NCgwKQogICAgLy8gb3Igc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPT0gVUludDY0KDApCiAgICBieiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudF9pZl9ib2R5QDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5MQogICAgLy8gb3Igc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID09IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM4OS0zOTEKICAgIC8vIGVudHJ5LmFjY3J1YWxfZmFjdG9yID09IFVJbnQ2NCgwKQogICAgLy8gb3Igc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPT0gVUludDY0KDApCiAgICBibnogX2VudHJ5X2ludGVyZXN0X3NlZ21lbnRfYWZ0ZXJfaWZfZWxzZUA0CgpfZW50cnlfaW50ZXJlc3Rfc2VnbWVudF9pZl9ib2R5QDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozOTMKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9kaWcgLTEKICAgIHVuY292ZXIgMgogICAgcmV0c3ViCgpfZW50cnlfaW50ZXJlc3Rfc2VnbWVudF9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozOTUKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozOTYKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozOTcKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozOTQtMzk4CiAgICAvLyBhY2NydWVkID0gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlLAogICAgLy8gICAgIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICAvLyApCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDAyCiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzk5LTQwMwogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIGFjY3J1ZWQsCiAgICAvLyAgICAgZW50cnkuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgZnJhbWVfZGlnIC0xCiAgICB1bmNvdmVyIDIKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcihkaXNjb3VudF9mYWN0b3I6IHVpbnQ2NCwgcmVkZW1wdGlvbl9mYWN0b3I6IHVpbnQ2NCkgLT4gdWludDY0OgpfZGlzY291bnRfYW5udWl0eV9mYWN0b3I6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NjItNDY2CiAgICAvLyBkZWYgX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yKAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgZGlzY291bnRfZmFjdG9yOiBVSW50NjQsCiAgICAvLyAgICAgcmVkZW1wdGlvbl9mYWN0b3I6IFVJbnQ2NCwKICAgIC8vICkgLT4gVUludDY0OgogICAgcHJvdG8gMiAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NjgKICAgIC8vIGlmIHJlZGVtcHRpb25fZmFjdG9yID09IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMQogICAgYm56IF9kaXNjb3VudF9hbm51aXR5X2ZhY3Rvcl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ2OQogICAgLy8gcmV0dXJuIGRpc2NvdW50X2ZhY3RvcgogICAgZnJhbWVfZGlnIC0yCiAgICByZXRzdWIKCl9kaXNjb3VudF9hbm51aXR5X2ZhY3Rvcl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzAKICAgIC8vIHBlcmlvZF9yYXRlID0gc2VsZi5maXhlZF9wb2ludF9zY2FsZSArIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDcxCiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDcwLTQ3NAogICAgLy8gcGVyaW9kX3JhdGUgPSBzZWxmLmZpeGVkX3BvaW50X3NjYWxlICsgc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgcmVkZW1wdGlvbl9mYWN0b3IsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgZGlnIDIKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICArCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzUKICAgIC8vIGFzc2VydCBwZXJpb2RfcmF0ZSA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBkdXAKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3OAogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3Ni00ODAKICAgIC8vIHJldHVybiBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBkaXNjb3VudF9mYWN0b3IsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICAgICBwZXJpb2RfcmF0ZSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5KGVudHJ5OiBieXRlcywgcGF5bG9hZDogYnl0ZXMpIC0+IGJ5dGVzLCBieXRlczoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjEzLTYxNQogICAgLy8gZGVmIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeSgKICAgIC8vICAgICBzZWxmLCBlbnRyeTogdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnksIHBheWxvYWQ6IHR5cC5PYnNlcnZlZEV2ZW50UmVxdWVzdAogICAgLy8gKSAtPiBOb25lOgogICAgcHJvdG8gMiAyCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYyMwogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X2lkID09IHNlbGYuZXZlbnRfY3Vyc29yLCBlcnIuSU5WQUxJRF9FVkVOVF9DVVJTT1IKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBjdXJzb3IKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYyNAogICAgLy8gYXNzZXJ0IGVudHJ5LnNjaGVkdWxlZF90aW1lIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLCBlcnIuTk9fRFVFX0NBU0hGTE9XCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIDw9CiAgICBhc3NlcnQgLy8gTm8gZHVlIGNhc2hmbG93IHRvIHBheQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjI2CiAgICAvLyBldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MjcKICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9JRUQpOgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBkdXAKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MjgtNjMwCiAgICAvLyAjIElFRCBmaW5hbGl6ZXMgaXNzdWFuY2U6IHJlc2VydmVkIHVuaXRzIGJlY29tZSBhY3RpdmF0YWJsZSBhbmQgdGhlCiAgICAvLyAjIHNjaGVkdWxlJ3MgaW5pdGlhbCBjb250cmFjdHVhbCBzdGF0ZSBiZWNvbWVzIGxpdmUuCiAgICAvLyBhc3NlcnQgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjMyCiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID09IHNlbGYudG90YWxfdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYzMS02MzMKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCA9PSBzZWxmLnRvdGFsX3VuaXRzCiAgICAvLyApLCBlcnIuUFJJTUFSWV9ESVNUUklCVVRJT05fSU5DT01QTEVURQogICAgYXNzZXJ0IC8vIFByaW1hcnkgZGlzdHJpYnV0aW9uIGlzIG5vdCBjb21wbGV0ZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM0CiAgICAvLyBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9IGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYzNQogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM2CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IGVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM3CiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYzOAogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gZW50cnkubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDQxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM5CiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NDAKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGVudW1zLlNUQVRVU19BQ1RJVkUpCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBwdXNoaW50IDEwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ1MQogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkgPT0gVUludDY0KGVudW1zLkVWVF9JRUQpLCBlcnIuTk9UX0VWVF9JRUQKICAgIGZyYW1lX2RpZyAxMQogICAgYXNzZXJ0IC8vIE5vdCBJRUQgZXZlbnQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ1MgogICAgLy8gcmV0dXJuIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMCAvLyAiaW5pdGlhbF9leGNoYW5nZV9hbW91bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NDEtNjQ1CiAgICAvLyBzZWxmLl9lbWl0X2V4ZWN1dGlvbl9ldmVudCgKICAgIC8vICAgICBlbnRyeT1lbnRyeSwKICAgIC8vICAgICBwYXlvZmY9c2VsZi5fZW50cnlfaWVkX2Ftb3VudChlbnRyeSksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NDQKICAgIC8vIHNldHRsZWRfYW1vdW50PVVJbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NDEtNjQ1CiAgICAvLyBzZWxmLl9lbWl0X2V4ZWN1dGlvbl9ldmVudCgKICAgIC8vICAgICBlbnRyeT1lbnRyeSwKICAgIC8vICAgICBwYXlvZmY9c2VsZi5fZW50cnlfaWVkX2Ftb3VudChlbnRyeSksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgY2FsbHN1YiBfZW1pdF9leGVjdXRpb25fZXZlbnQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAtMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjQ2CiAgICAvLyByZXR1cm4KICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfYnVyeSAxCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDcKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NDkKICAgIC8vIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCArPSBzZWxmLl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KGVudHJ5KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudAogICAgZnJhbWVfYnVyeSAtMgogICAgKwogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NTEKICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9SUik6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgMTIKICAgID09CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDEwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NTUKICAgIC8vIHBheWxvYWQub2JzZXJ2ZWRfcmF0ZSwKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAzMwogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1NgogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzYgLy8gInJhdGVfcmVzZXRfbXVsdGlwbGllciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NTcKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NTItNjU4CiAgICAvLyAjIFJSIGRlcml2ZXMgdGhlIG5leHQgcmF0ZSBmcm9tIGFuIG9ic2VydmVkIG9yYWNsZSB2YWx1ZSBwbHVzIHRoZQogICAgLy8gIyBjb250cmFjdCBzcHJlYWQgLyBtdWx0aXBsaWVyIHRlcm1zLCB0aGVuIGVuZm9yY2VzIGZsb29yIGFuZCBjYXAuCiAgICAvLyBvYnNlcnZlZF9yYXRlID0gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgcGF5bG9hZC5vYnNlcnZlZF9yYXRlLAogICAgLy8gICAgIHNlbGYucmF0ZV9yZXNldF9tdWx0aXBsaWVyLAogICAgLy8gICAgIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICAvLyApCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjYwCiAgICAvLyBvYnNlcnZlZF9yYXRlICsgc2VsZi5yYXRlX3Jlc2V0X3NwcmVhZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDM1IC8vICJyYXRlX3Jlc2V0X3NwcmVhZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X3NwcmVhZCBleGlzdHMKICAgICsKICAgIGZyYW1lX2J1cnkgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzQxCiAgICAvLyBpZiBzZWxmLmhhc19yYXRlX3Jlc2V0X2Zsb29yIGFuZCByYXRlIDwgc2VsZi5yYXRlX3Jlc2V0X2Zsb29yOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDM4IC8vICJoYXNfcmF0ZV9yZXNldF9mbG9vciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5oYXNfcmF0ZV9yZXNldF9mbG9vciBleGlzdHMKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU1CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzAgLy8gInJhdGVfcmVzZXRfZmxvb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9mbG9vciBleGlzdHMKICAgIGZyYW1lX2RpZyA2CiAgICA+CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1NQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzQyCiAgICAvLyByYXRlID0gc2VsZi5yYXRlX3Jlc2V0X2Zsb29yCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzAgLy8gInJhdGVfcmVzZXRfZmxvb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSA2CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X2Zsb29yIGV4aXN0cwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDMKICAgIC8vIGlmIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwIGFuZCByYXRlID4gc2VsZi5yYXRlX3Jlc2V0X2NhcDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzOSAvLyAiaGFzX3JhdGVfcmVzZXRfY2FwIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmhhc19yYXRlX3Jlc2V0X2NhcCBleGlzdHMKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU4CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzEgLy8gInJhdGVfcmVzZXRfY2FwIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfY2FwIGV4aXN0cwogICAgZnJhbWVfZGlnIDYKICAgIDwKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDQKICAgIC8vIHJhdGUgPSBzZWxmLnJhdGVfcmVzZXRfY2FwCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzEgLy8gInJhdGVfcmVzZXRfY2FwIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgNgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9jYXAgZXhpc3RzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1ODoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1OQogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPSBzZWxmLl9jbGFtcF9yYXRlKAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjU5LTY2MQogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPSBzZWxmLl9jbGFtcF9yYXRlKAogICAgLy8gICAgIG9ic2VydmVkX3JhdGUgKyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkCiAgICAvLyApCiAgICBmcmFtZV9kaWcgNgogICAgYXBwX2dsb2JhbF9wdXQKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjcxCiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUEkpOgogICAgZnJhbWVfZGlnIDEwCiAgICBwdXNoaW50IDQKICAgID09CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDIwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzIKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjczCiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAyMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY3OAogICAgLy8gaWYgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCk6CiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMjkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY3OQogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1BSRik6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgNQogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDMwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODMKICAgIC8vICsgKHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgLSBzZWxmLmV2ZW50X2N1cnNvcikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njg0CiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfUEVSX0VOVFJZX0JVREdFVCkKICAgIHB1c2hpbnQgMTAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODMtNjg0CiAgICAvLyArIChzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IC0gc2VsZi5ldmVudF9jdXJzb3IpCiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfUEVSX0VOVFJZX0JVREdFVCkKICAgICoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4MgogICAgLy8gVUludDY0KGNzdC5PUF9VUF9OT05fQ0FTSF9CQVNFX0JVREdFVCkKICAgIGludGMgNCAvLyAxNTAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODItNjg0CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX05PTl9DQVNIX0JBU0VfQlVER0VUKQogICAgLy8gKyAoc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCAtIHNlbGYuZXZlbnRfY3Vyc29yKQogICAgLy8gKiBVSW50NjQoY3N0Lk9QX1VQX05PTl9DQVNIX1BFUl9FTlRSWV9CVURHRVQpCiAgICArCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODAtNjg2CiAgICAvLyBlbnN1cmVfYnVkZ2V0KAogICAgLy8gICAgIHJlcXVpcmVkX2J1ZGdldD0oCiAgICAvLyAgICAgICAgIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfQkFTRV9CVURHRVQpCiAgICAvLyAgICAgICAgICsgKHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgLSBzZWxmLmV2ZW50X2N1cnNvcikKICAgIC8vICAgICAgICAgKiBVSW50NjQoY3N0Lk9QX1VQX05PTl9DQVNIX1BFUl9FTlRSWV9CVURHRVQpCiAgICAvLyAgICAgKSwKICAgIC8vICkKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5MAogICAgLy8gZGlzY291bnRfZmFjdG9yID0gc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0OTEKICAgIC8vIGRlbm9taW5hdG9yID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0OTIKICAgIC8vIHNraXBfZmlyc3RfcmVkZW1wdGlvbiA9IEZhbHNlCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSA3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0OTQKICAgIC8vIGlmIGVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IgPiBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMjUKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgOAogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMzUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5NS00OTkKICAgIC8vICMgQW4gaW5pdGlhbCBQUkYgbWF5IGRlc2NyaWJlIHRoZSBmaXJzdCByZWRlbXB0aW9uIHBlcmlvZCBkaXJlY3RseS4KICAgIC8vIGRpc2NvdW50X2ZhY3RvciA9IHNlbGYuX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yKAogICAgLy8gICAgIGRpc2NvdW50X2ZhY3RvciwKICAgIC8vICAgICBlbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyA4CiAgICBjYWxsc3ViIF9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwMQogICAgLy8gc2tpcF9maXJzdF9yZWRlbXB0aW9uID0gVHJ1ZQogICAgaW50Y18xIC8vIDEKICAgIGZyYW1lX2J1cnkgNwogICAgZnJhbWVfYnVyeSAxCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAzNToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwMwogICAgLy8gZnV0dXJlX2V2ZW50X2lkID0gc2VsZi5ldmVudF9jdXJzb3IgKyBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X3doaWxlX3RvcEAzNjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwNAogICAgLy8gd2hpbGUgZnV0dXJlX2V2ZW50X2lkIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGZyYW1lX2RpZyAzCiAgICA+CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfd2hpbGVANDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwNQogICAgLy8gZnV0dXJlX2VudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KGZ1dHVyZV9ldmVudF9pZCkKICAgIGZyYW1lX2RpZyAzCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MDYKICAgIC8vIGZ1dHVyZV9ldmVudF90eXBlID0gZnV0dXJlX2VudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA3LTUwOAogICAgLy8gIyBPbmx5IHJlZGVtcHRpb24tYmVhcmluZyBldmVudHMgY29udHJpYnV0ZSB0byB0aGUgYW5udWl0eSBkZW5vbWluYXRvci4KICAgIC8vIGlzX3JlZGVtcHRpb25fZXZlbnQgPSBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1BSKSBvciAoCiAgICBwdXNoaW50IDMKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MDctNTExCiAgICAvLyAjIE9ubHkgcmVkZW1wdGlvbi1iZWFyaW5nIGV2ZW50cyBjb250cmlidXRlIHRvIHRoZSBhbm51aXR5IGRlbm9taW5hdG9yLgogICAgLy8gaXNfcmVkZW1wdGlvbl9ldmVudCA9IGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpIG9yICgKICAgIC8vICAgICBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgLy8gICAgIGFuZCBmdXR1cmVfZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKQogICAgLy8gKQogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX3RydWVANDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwOQogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCkKICAgIGZyYW1lX2RpZyA0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA5LTUxMAogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCkKICAgIC8vIGFuZCBmdXR1cmVfZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUxMAogICAgLy8gYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICBmcmFtZV9kaWcgMAogICAgcHVzaGludCAyNQogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwOS01MTAKICAgIC8vIGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfTUQpCiAgICAvLyBhbmQgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IgPiBVSW50NjQoMCkKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX2ZhbHNlQDQxCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF90cnVlQDQwOgogICAgaW50Y18xIC8vIDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX21lcmdlQDQyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTEyCiAgICAvLyBpZiBpc19yZWRlbXB0aW9uX2V2ZW50OgogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANDcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUxMwogICAgLy8gaWYgc2tpcF9maXJzdF9yZWRlbXB0aW9uOgogICAgZnJhbWVfZGlnIDcKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlANDUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUxNAogICAgLy8gc2tpcF9maXJzdF9yZWRlbXB0aW9uID0gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDcKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDQ3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTIxCiAgICAvLyBmdXR1cmVfZXZlbnRfaWQgKz0gVUludDY0KDEpCiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMwogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfd2hpbGVfdG9wQDM2CgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDQ1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTE4CiAgICAvLyBmdXR1cmVfZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIGZyYW1lX2RpZyAwCiAgICBwdXNoaW50IDI1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTE2LTUxOQogICAgLy8gZGlzY291bnRfZmFjdG9yID0gc2VsZi5fZGlzY291bnRfYW5udWl0eV9mYWN0b3IoCiAgICAvLyAgICAgZGlzY291bnRfZmFjdG9yLAogICAgLy8gICAgIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDIKICAgIHN3YXAKICAgIGNhbGxzdWIgX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTIwCiAgICAvLyBkZW5vbWluYXRvciArPSBkaXNjb3VudF9mYWN0b3IKICAgIGZyYW1lX2RpZyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANDcKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX2ZhbHNlQDQxOgogICAgaW50Y18wIC8vIDAKICAgIGIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfbWVyZ2VANDIKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl93aGlsZUA0ODoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUyMwogICAgLy8gYXNzZXJ0IGRlbm9taW5hdG9yID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGZyYW1lX2RpZyAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjQKICAgIC8vIG51bWVyYXRvciA9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUyNQogICAgLy8gaWYgZW50cnkuZmxhZ3MgJiBVSW50NjQoZW51bXMuRkxBR19JTklUSUFMX1BSRikgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDU3CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18yIC8vIDgKICAgICYKICAgIGJueiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1MAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTI2LTUyNwogICAgLy8gIyBTdWJzZXF1ZW50IFBSRiBldmVudHMgYW1vcnRpemUgYm90aCBwcmluY2lwYWwgYW5kIGFscmVhZHkgYWNjcnVlZCBjYXJyeS4KICAgIC8vIG51bWVyYXRvciArPSBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICArCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1MDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUzMAogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUyOC01MzIKICAgIC8vIHJldHVybiBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBudW1lcmF0b3IsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICAgICBkZW5vbWluYXRvciwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAxCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njg3CiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBzZWxmLl9yZWNhbGN1bGF0ZV9hbm51aXR5X3BheW1lbnQoCiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4Ny02ODkKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IHNlbGYuX3JlY2FsY3VsYXRlX2FubnVpdHlfcGF5bWVudCgKICAgIC8vICAgICBlbnRyeQogICAgLy8gKQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDMwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjkyCiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OTMtNjk3CiAgICAvLyBzZWxmLl9lbWl0X2V4ZWN1dGlvbl9ldmVudCgKICAgIC8vICAgICBlbnRyeT1lbnRyeSwKICAgIC8vICAgICBwYXlvZmY9VUludDY0KDApLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njk1CiAgICAvLyBwYXlvZmY9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY5NgogICAgLy8gc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OTMtNjk3CiAgICAvLyBzZWxmLl9lbWl0X2V4ZWN1dGlvbl9ldmVudCgKICAgIC8vICAgICBlbnRyeT1lbnRyeSwKICAgIC8vICAgICBwYXlvZmY9VUludDY0KDApLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGNhbGxzdWIgX2VtaXRfZXhlY3V0aW9uX2V2ZW50CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfYnVyeSAxCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAyOToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY5MQogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gZW50cnkubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDQxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAzMAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAyMDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY3NAogICAgLy8gZWxpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfSVBDQik6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgMTgKICAgID09CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAyMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc1LTY3NgogICAgLy8gIyBJUENCIGtlZXBzIHByaW5jaXBhbCB1bmNoYW5nZWQgYW5kIG9ubHkgcmVzZXRzIHRoZSBpbnRlcmVzdCBiYXNlLgogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDIzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDEwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjYyCiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9SUkYpOgogICAgZnJhbWVfZGlnIDEwCiAgICBwdXNoaW50IDExCiAgICA9PQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAxNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjYzCiAgICAvLyBuZXh0X3JhdGUgPSBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZQogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2NAogICAgLy8gaWYgbmV4dF9yYXRlID09IFVJbnQ2NCgwKToKICAgIGJueiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAxMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY1CiAgICAvLyBuZXh0X3JhdGUgPSBzZWxmLnJhdGVfcmVzZXRfbmV4dAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDM3IC8vICJyYXRlX3Jlc2V0X25leHQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSA1CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X25leHQgZXhpc3RzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2NgogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPSBuZXh0X3JhdGUKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGZyYW1lX2RpZyA1CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAxOAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAxNDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2OAogICAgLy8gaWYgZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUgIT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDkKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjkKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGZyYW1lX2RpZyA5CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAxOAoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbWl0X2V4ZWN1dGlvbl9ldmVudChlbnRyeTogYnl0ZXMsIHBheW9mZjogdWludDY0LCBzZXR0bGVkX2Ftb3VudDogdWludDY0KSAtPiBieXRlczoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzAzLTcwOQogICAgLy8gZGVmIF9lbWl0X2V4ZWN1dGlvbl9ldmVudCgKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgICosCiAgICAvLyAgICAgZW50cnk6IHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5LAogICAgLy8gICAgIHBheW9mZjogVUludDY0LAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50OiBVSW50NjQsCiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAzIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxMwogICAgLy8gY29udHJhY3RfaWQ9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25faWQuaWQsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uSUQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxNAogICAgLy8gZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE1CiAgICAvLyBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICBmcmFtZV9kaWcgLTMKICAgIGV4dHJhY3QgOCAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTYKICAgIC8vIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgZnJhbWVfZGlnIC0zCiAgICBleHRyYWN0IDkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE3CiAgICAvLyBhcHBsaWVkX2F0PUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIwCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBmcmFtZV9kaWcgLTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxNQogICAgLy8gZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgaW50Y18yIC8vIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcyMAogICAgLy8gc2VsZi5fcGF5b2ZmX3NpZ24oZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSwgcGF5b2ZmKQogICAgZ2V0Ynl0ZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzQ5CiAgICAvLyBpZiBwYXlvZmYgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0yCiAgICBibnogX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzUwCiAgICAvLyByZXR1cm4gVUludDY0KGVudW1zLlBBWU9GRl9TSUdOX1BPU0lUSVZFKQogICAgaW50Y18xIC8vIDEKCl9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9wYXlvZmZfc2lnbkA3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE5LTcyMQogICAgLy8gcGF5b2ZmX3NpZ249YXJjNC5VSW50OCgKICAgIC8vICAgICBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICAvLyApLAogICAgaXRvYgogICAgZHVwCiAgICBiaXRsZW4KICAgIGludGNfMiAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBleHRyYWN0IDcgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIzCiAgICAvLyBjdXJyZW5jeV9pZD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcyNAogICAgLy8gc2VxdWVuY2U9ZW50cnkuZXZlbnRfaWQgKyBVSW50NjQoMSksCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzEyLTcyNQogICAgLy8gRXhlY3V0aW9uRXZlbnQoCiAgICAvLyAgICAgY29udHJhY3RfaWQ9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25faWQuaWQsCiAgICAvLyAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgcGF5b2ZmPXBheW9mZiwKICAgIC8vICAgICBwYXlvZmZfc2lnbj1hcmM0LlVJbnQ4KAogICAgLy8gICAgICAgICBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBzZXR0bGVkX2Ftb3VudD1zZXR0bGVkX2Ftb3VudCwKICAgIC8vICAgICBjdXJyZW5jeV9pZD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgc2VxdWVuY2U9ZW50cnkuZXZlbnRfaWQgKyBVSW50NjQoMSksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMAogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAyCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAzCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyA0CiAgICBpdG9iCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMgogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxMS03MjYKICAgIC8vIGFyYzQuZW1pdCgKICAgIC8vICAgICBFeGVjdXRpb25FdmVudCgKICAgIC8vICAgICAgICAgY29udHJhY3RfaWQ9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25faWQuaWQsCiAgICAvLyAgICAgICAgIGV2ZW50X2lkPWVudHJ5LmV2ZW50X2lkLAogICAgLy8gICAgICAgICBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICAvLyAgICAgICAgIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgICAgICBhcHBsaWVkX2F0PUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gICAgICAgICBwYXlvZmY9cGF5b2ZmLAogICAgLy8gICAgICAgICBwYXlvZmZfc2lnbj1hcmM0LlVJbnQ4KAogICAgLy8gICAgICAgICAgICAgc2VsZi5fcGF5b2ZmX3NpZ24oZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSwgcGF5b2ZmKQogICAgLy8gICAgICAgICApLAogICAgLy8gICAgICAgICBzZXR0bGVkX2Ftb3VudD1zZXR0bGVkX2Ftb3VudCwKICAgIC8vICAgICAgICAgY3VycmVuY3lfaWQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgICAgICBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIC8vICAgICApCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHg5YTMzMmI5NSAvLyBtZXRob2QgIkV4ZWN1dGlvbkV2ZW50KHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NTEKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gKFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwgVUludDY0KGVudW1zLkVWVF9QSSkpOgogICAgZnJhbWVfZGlnIDUKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYm56IF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9pZl9ib2R5QDUKICAgIGZyYW1lX2RpZyA1CiAgICBwdXNoaW50IDQKICAgID09CiAgICBieiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUA2CgpfZW1pdF9leGVjdXRpb25fZXZlbnRfaWZfYm9keUA1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzUyCiAgICAvLyByZXR1cm4gVUludDY0KGVudW1zLlBBWU9GRl9TSUdOX1BPU0lUSVZFKQogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcyMAogICAgLy8gc2VsZi5fcGF5b2ZmX3NpZ24oZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSwgcGF5b2ZmKQogICAgYiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fcGF5b2ZmX3NpZ25ANwoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc1MwogICAgLy8gcmV0dXJuIFVJbnQ2NChlbnVtcy5QQVlPRkZfU0lHTl9ORUdBVElWRSkKICAgIHB1c2hpbnQgMjU1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MjAKICAgIC8vIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIGIgX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX3BheW9mZl9zaWduQDcKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fcm9sZV9pc19hY3RpdmUocm9sZV9tYXA6IGJ5dGVzLCByb2xlX2FkZHJlc3M6IGJ5dGVzKSAtPiB1aW50NjQ6Cl9yb2xlX2lzX2FjdGl2ZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NwogICAgLy8gZGVmIF9yb2xlX2lzX2FjdGl2ZShzZWxmLCByb2xlX21hcDogdHlwLlJiYWNSb2xlLCByb2xlX2FkZHJlc3M6IEFjY291bnQpIC0+IGJvb2w6CiAgICBwcm90byAyIDEKICAgIHB1c2hieXRlcyAiIgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU4LTYyCiAgICAvLyByZXR1cm4gc2VsZi5faGFzX3JvbGUocm9sZV9tYXAsIHJvbGVfYWRkcmVzcykgYW5kICgKICAgIC8vICAgICByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICkKICAgIGJ6IF9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIEJveE1hcCBlbnRyeSBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYwCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MAogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgPD0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYxCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIEJveE1hcCBlbnRyeSBleGlzdHMKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYwLTYxCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDAKICAgID49CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTktNjEKICAgIC8vIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IF9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQKICAgIGludGNfMSAvLyAxCgpfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU4LTYyCiAgICAvLyByZXR1cm4gc2VsZi5faGFzX3JvbGUocm9sZV9tYXAsIHJvbGVfYWRkcmVzcykgYW5kICgKICAgIC8vICAgICByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICkKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgX3JvbGVfaXNfYWN0aXZlX2Jvb2xfbWVyZ2VANQoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkgLT4gdm9pZDoKX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjUKICAgIC8vIGFzc2VydCBzZWxmLl9pc19hcnJhbmdlcihUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjUyCiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzID09IHNlbGYuYXJyYW5nZXIudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOCAvLyAweDUyM2E0MTUyNTIyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgPT0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2NQogICAgLy8gYXNzZXJ0IHNlbGYuX2lzX2FycmFuZ2VyKFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpIC0+IHZvaWQ6Cl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4MwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFzc2V0X2RlZmF1bHRlZCwgZXJyLkRFRkFVTFRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQxIC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfZGVmYXVsdGVkIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIERlZmF1bHRlZAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkgLT4gdm9pZDoKX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg2CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYXNzZXRfc3VzcGVuZGVkLCBlcnIuU1VTUEVOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzMgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9zdXNwZW5kZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gU3VzcGVuZGVkIG9wZXJhdGlvbnMKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkOiB1aW50NjQpIC0+IHZvaWQ6Cl9hc3NlcnRfdmFsaWRfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OAogICAgLy8gZGVmIF9hc3NlcnRfdmFsaWRfcm9sZShzZWxmLCByb2xlX2lkOiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTAKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIHB1c2hpbnQgMjAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkxCiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgcHVzaGludCAyNQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTIKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICBwdXNoaW50IDQwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MwogICAgLy8gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgcHVzaGludCA1MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTQKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgcHVzaGludCA2MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTUKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICBwdXNoaW50IDcwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NgogICAgLy8gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgcHVzaGludCA4MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfZmFsc2VAOAoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3OgogICAgaW50Y18xIC8vIDEKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX21lcmdlQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgcmV0c3ViCgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9mYWxzZUA4OgogICAgaW50Y18wIC8vIDAKICAgIGIgX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfbWVyZ2VAOQo=", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCAzMiAxNTAwCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUgInN0YXR1cyIgImV2ZW50X2N1cnNvciIgInNjaGVkdWxlX2VudHJ5X2NvdW50IiAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIiAiZml4ZWRfcG9pbnRfc2NhbGUiICJhY2NydWVkX2ludGVyZXN0IiAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIgMHg0MTIzICJub21pbmFsX2ludGVyZXN0X3JhdGUiICJjb250cmFjdF90eXBlIiAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiICJyZXNlcnZlZF9wcmluY2lwYWwiICJ0b3RhbF91bml0cyIgIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iICJyZXNlcnZlZF9pbnRlcmVzdCIgImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIgMHg1MjNhNDE1MjUyMjMgInNldHRsZW1lbnRfYXNzZXRfaWQiICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIgMHg1MjNhNDE1NTU0MjMgMHg1MjNhNTA1OTQ0MjMgMHg1MjNhNGQ0ZTQ3MjMgMHg1MzIzIDB4NTIzYTRkNGY0MzIzIDB4NTIzYTU0NTI1MzIzIDB4NTIzYTRmNTA0NDIzICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiICJ0cmFuc2Zlcl9vcGVuaW5nX2RhdGUiICJ0cmFuc2Zlcl9jbG9zdXJlX2RhdGUiICJyYXRlX3Jlc2V0X2Zsb29yIiAicmF0ZV9yZXNldF9jYXAiICJhc3NldF9zdXNwZW5kZWQiICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIiAicmF0ZV9yZXNldF9zcHJlYWQiICJyYXRlX3Jlc2V0X211bHRpcGxpZXIiICJyYXRlX3Jlc2V0X25leHQiICJoYXNfcmF0ZV9yZXNldF9mbG9vciIgImhhc19yYXRlX3Jlc2V0X2NhcCIgMHgwMCAiYXNzZXRfZGVmYXVsdGVkIiAicHJvc3BlY3R1c19oYXNoIiAicHJvc3BlY3R1c191cmwiICJkZW5vbWluYXRpb25fYXNzZXRfaWQiICJtYXR1cml0eV9kYXRlIiAiZGF5X2NvdW50X2NvbnZlbnRpb24iICJkZWZhdWx0ZWQiIDB4MDY4MTAxIDB4MDAwMAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4LTI5CiAgICAvLyAjIFJCQUMgUm9sZXMKICAgIC8vIHNlbGYuYXJyYW5nZXIgPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX0FSUkFOR0VSKQogICAgYnl0ZWMgMTggLy8gMHg1MjNhNDE1MjUyMjMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMAogICAgLy8gc2VsZi5vcF9kYWVtb24gPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX09QX0RBRU1PTikKICAgIGJ5dGVjIDI3IC8vIDB4NTIzYTRmNTA0NDIzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NDctNDgKICAgIC8vICMgRC1BU0EgR292ZXJuYW5jZQogICAgLy8gc2VsZi5hc3NldF9zdXNwZW5kZWQgPSBGYWxzZQogICAgYnl0ZWMgMzMgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjQ5CiAgICAvLyBzZWxmLmFzc2V0X2RlZmF1bHRlZCA9IEZhbHNlCiAgICBieXRlYyA0MSAvLyAiYXNzZXRfZGVmYXVsdGVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1Ni01NwogICAgLy8gIyBDb250cmFjdAogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKQogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OAogICAgLy8gc2VsZi5jb250cmFjdF90eXBlID0gVUludDY0KCkKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MC02MQogICAgLy8gIyBQcm9zcGVjdHVzIChJbmZvcm1hdGlvbmFsKQogICAgLy8gc2VsZi5wcm9zcGVjdHVzX2hhc2ggPSBCeXRlcygpCiAgICBieXRlYyA0MiAvLyAicHJvc3BlY3R1c19oYXNoIgogICAgcHVzaGJ5dGVzIDB4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjIKICAgIC8vIHNlbGYucHJvc3BlY3R1c191cmwgPSBTdHJpbmcoKQogICAgYnl0ZWMgNDMgLy8gInByb3NwZWN0dXNfdXJsIgogICAgcHVzaGJ5dGVzICIiCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjQtNjUKICAgIC8vICMgRGVub21pbmF0aW9uCiAgICAvLyBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCA9IEFzc2V0KCkKICAgIGJ5dGVjIDQ0IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBBc3NldCgpCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjgtNjkKICAgIC8vICMgVGltZQogICAgLy8gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGUgPSB0eXAuVGltZVN0YW1wKCkKICAgIGJ5dGVjIDI4IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcwCiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSB0eXAuVGltZVN0YW1wKCkKICAgIGJ5dGVjIDQ1IC8vICJtYXR1cml0eV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MQogICAgLy8gc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgPSB0eXAuVGltZVN0YW1wKCkKICAgIGJ5dGVjIDI5IC8vICJ0cmFuc2Zlcl9vcGVuaW5nX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcyCiAgICAvLyBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgMzAgLy8gInRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzQtNzUKICAgIC8vICMgRGF5IENvdW50IENvbnZlbnRpb24KICAgIC8vIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPSBVSW50NjQoKQogICAgYnl0ZWMgNDYgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3Ny03OAogICAgLy8gIyBVbml0cwogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IFVJbnQ2NCgpCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc5CiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID0gVUludDY0KCkKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODEtODIKICAgIC8vICMgUHJpbmNpcGFsCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID0gVUludDY0KCkKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODMKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gVUludDY0KCkKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODUKICAgIC8vIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiA9IEZhbHNlCiAgICBieXRlYyAzNCAvLyAiZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODctODgKICAgIC8vICMgSW50ZXJlc3QKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OQogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ID0gVUludDY0KCkKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkxLTkyCiAgICAvLyAjIEludGVyZXN0IFJhdGVzCiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzCiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkID0gVUludDY0KCkKICAgIGJ5dGVjIDM1IC8vICJyYXRlX3Jlc2V0X3NwcmVhZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9tdWx0aXBsaWVyID0gVUludDY0KCkKICAgIGJ5dGVjIDM2IC8vICJyYXRlX3Jlc2V0X211bHRpcGxpZXIiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfZmxvb3IgPSBVSW50NjQoKQogICAgYnl0ZWMgMzEgLy8gInJhdGVfcmVzZXRfZmxvb3IiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfY2FwID0gVUludDY0KCkKICAgIGJ5dGVjIDMyIC8vICJyYXRlX3Jlc2V0X2NhcCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTcKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9uZXh0ID0gVUludDY0KCkKICAgIGJ5dGVjIDM3IC8vICJyYXRlX3Jlc2V0X25leHQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4CiAgICAvLyBzZWxmLmhhc19yYXRlX3Jlc2V0X2Zsb29yID0gRmFsc2UKICAgIGJ5dGVjIDM4IC8vICJoYXNfcmF0ZV9yZXNldF9mbG9vciIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTkKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwID0gRmFsc2UKICAgIGJ5dGVjIDM5IC8vICJoYXNfcmF0ZV9yZXNldF9jYXAiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMS0xMDIKICAgIC8vICMgUHJpbWFyeSBEaXN0cmlidXRpb24KICAgIC8vIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsID0gVUludDY0KCkKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMwogICAgLy8gc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNS0xMDYKICAgIC8vICMgQ3VtdWxhdGl2ZSBQZXItVW5pdCBGaXhlZC1Qb2ludCBJbmRleGVzCiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggPSBVSW50NjQoKQogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNwogICAgLy8gc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNQogICAgLy8gc2VsZi5ldmVudF9jdXJzb3IgPSBVSW50NjQoKQogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTYKICAgIC8vIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgPSBVSW50NjQoKQogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExOC0xMTkKICAgIC8vICMgUGVyZm9ybWFuY2UKICAgIC8vIHNlbGYuZGVmYXVsdGVkID0gRmFsc2UKICAgIGJ5dGVjIDQ3IC8vICJkZWZhdWx0ZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMS0xMjIKICAgIC8vICMgU2NhbGluZwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjIzCiAgICAvLyBhc3NlcnQgVHhuLmdsb2JhbF9udW1fYnl0ZV9zbGljZSA9PSBjZmcuR0xPQkFMX0JZVEVTLCBlcnIuV1JPTkdfR0xPQkFMX0JZVEVTCiAgICB0eG4gR2xvYmFsTnVtQnl0ZVNsaWNlCiAgICBwdXNoaW50IDQKICAgID09CiAgICBhc3NlcnQgLy8gV3JvbmcgR2xvYmFsIEJ5dGVzIGFsbG9jYXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kX2FzYS9jb250cmFjdC5weToyNAogICAgLy8gYXNzZXJ0IFR4bi5nbG9iYWxfbnVtX3VpbnQgPT0gY2ZnLkdMT0JBTF9VSU5UUywgZXJyLldST05HX0dMT0JBTF9VSU5UUwogICAgdHhuIEdsb2JhbE51bVVpbnQKICAgIHB1c2hpbnQgMzgKICAgID09CiAgICBhc3NlcnQgLy8gV3JvbmcgR2xvYmFsIFVJbnRzIGFsbG9jYXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kX2FzYS9jb250cmFjdC5weToyNQogICAgLy8gYXNzZXJ0IFR4bi5sb2NhbF9udW1fYnl0ZV9zbGljZSA9PSBjZmcuTE9DQUxfQllURVMsIGVyci5XUk9OR19MT0NBTF9CWVRFUwogICAgdHhuIExvY2FsTnVtQnl0ZVNsaWNlCiAgICAhCiAgICBhc3NlcnQgLy8gV3JvbmcgTG9jYWwgQnl0ZXMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBhc3NlcnQgVHhuLmxvY2FsX251bV91aW50ID09IGNmZy5MT0NBTF9VSU5UUywgZXJyLldST05HX0xPQ0FMX1VJTlRTCiAgICB0eG4gTG9jYWxOdW1VaW50CiAgICAhCiAgICBhc3NlcnQgLy8gV3JvbmcgTG9jYWwgVUludHMgYWxsb2NhdGlvbgoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6OC0xOAogICAgLy8gY2xhc3MgREFTQSgKICAgIC8vICAgICBQYXltZW50QWdlbnQsCiAgICAvLyAgICAgVHJhbnNmZXJBZ2VudCwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBhdm1fdmVyc2lvbj0xMiwKICAgIC8vICk6CiAgICBwdXNoYnl0ZXMgMHg5MTRmMDRlYiAvLyBtZXRob2QgImNvbnRyYWN0X3VwZGF0ZSgpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fY29udHJhY3RfdXBkYXRlX3JvdXRlQDQKCm1haW5fc3dpdGNoX2Nhc2VfbmV4dEA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjgtMTgKICAgIC8vIGNsYXNzIERBU0EoCiAgICAvLyAgICAgUGF5bWVudEFnZW50LAogICAgLy8gICAgIFRyYW5zZmVyQWdlbnQsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyAgICAgYXZtX3ZlcnNpb249MTIsCiAgICAvLyApOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYnogbWFpbl9jcmVhdGVfTm9PcEAzMwogICAgcHVzaGJ5dGVzcyAweGI0NDYxOGM4IDB4ZTc4MzI1MjkgMHg5NDM4ODcyMyAweDZjODVlM2VlIDB4YmRkMWE5NDQgMHg3YzBmMTgxMiAweDE0ZmMxMGVmIDB4NzRhNzI5N2YgMHgwOWQ0ZmUxNCAweDlhOWJmYTg1IDB4ODVlZWQzM2QgMHhhYjJjMGZjNCAweGQ5ZjIyNWFjIDB4OTg4MzUwNWEgMHhmYjRkNDQyOCAweDhlYTZlNzRjIDB4MDJhZjU1N2EgMHg4MmY3MWIyZCAweGVmMDRmNWQzIDB4ZGYzNDM1NTAgMHgzZGJlODBiZCAweDFlM2U0OGU3IDB4MDEwYzgyOTkgMHg3NDA2YWNkMiAweDFhNzJhMmVlIC8vIG1ldGhvZCAiZnVuZF9kdWVfY2FzaGZsb3dzKHVpbnQ2NCkodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImNsYWltX2R1ZV9jYXNoZmxvd3MoYWRkcmVzcyxieXRlW10pKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxieXRlW10pIiwgbWV0aG9kICJ0cmFuc2Zlcl9zZXRfc2NoZWR1bGUodWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInByaW1hcnlfZGlzdHJpYnV0aW9uKGFkZHJlc3MsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidHJhbnNmZXIoYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgImFjY291bnRfc3VzcGVuc2lvbihhZGRyZXNzLGJvb2wpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X29wZW4oYWRkcmVzcyxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAiYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzKGFkZHJlc3MsYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgImFjY291bnRfZ2V0X3Bvc2l0aW9uKGFkZHJlc3MpKGFkZHJlc3MsdWludDY0LHVpbnQ2NCxib29sLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJjb250cmFjdF9jb25maWcoKHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LGJvb2wsYm9vbCxib29sLHVpbnQ2NCksKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSwoYnl0ZVszMl0sc3RyaW5nKSl1aW50NjQiLCBtZXRob2QgImNvbnRyYWN0X3NjaGVkdWxlKHVpbnQ2NCxib29sLCh1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KVtdKXVpbnQ2NCIsIG1ldGhvZCAiY29udHJhY3RfZXhlY3V0ZV9pZWQoKXVpbnQ2NCIsIG1ldGhvZCAiYXBwbHlfbm9uX2Nhc2hfZXZlbnQodWludDY0LCh1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkpdWludDY0IiwgbWV0aG9kICJhcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudCgodWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkpdWludDY0IiwgbWV0aG9kICJjb250cmFjdF9zZXRfZGVmYXVsdF9zdGF0dXMoYm9vbCl1aW50NjQiLCBtZXRob2QgImNvbnRyYWN0X2dldF9zdGF0ZSgpKHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJjb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnQoKSh1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAicmJhY19yb3RhdGVfYXJyYW5nZXIoYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgInJiYWNfc2V0X29wX2RhZW1vbihhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19hc3NpZ25fcm9sZSh1aW50OCxhZGRyZXNzLCh1aW50NjQsdWludDY0KSl1aW50NjQiLCBtZXRob2QgInJiYWNfcmV2b2tlX3JvbGUodWludDgsYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgInJiYWNfY29udHJhY3Rfc3VzcGVuc2lvbihib29sKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19nZXRfYXJyYW5nZXIoKWFkZHJlc3MiLCBtZXRob2QgInJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXMoYWRkcmVzcykoYm9vbCxib29sLGJvb2wsYm9vbCxib29sKSIsIG1ldGhvZCAicmJhY19nZXRfcm9sZV92YWxpZGl0eSh1aW50OCxhZGRyZXNzKSh1aW50NjQsdWludDY0KSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIGZ1bmRfZHVlX2Nhc2hmbG93cyBjbGFpbV9kdWVfY2FzaGZsb3dzIHRyYW5zZmVyX3NldF9zY2hlZHVsZSBwcmltYXJ5X2Rpc3RyaWJ1dGlvbiB0cmFuc2ZlciBhY2NvdW50X3N1c3BlbnNpb24gYWNjb3VudF9vcGVuIGFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzcyBhY2NvdW50X2dldF9wb3NpdGlvbiBjb250cmFjdF9jb25maWcgY29udHJhY3Rfc2NoZWR1bGUgY29udHJhY3RfZXhlY3V0ZV9pZWQgYXBwbHlfbm9uX2Nhc2hfZXZlbnQgYXBwZW5kX29ic2VydmVkX2Nhc2hfZXZlbnQgY29udHJhY3Rfc2V0X2RlZmF1bHRfc3RhdHVzIGNvbnRyYWN0X2dldF9zdGF0ZSBjb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnQgcmJhY19yb3RhdGVfYXJyYW5nZXIgcmJhY19zZXRfb3BfZGFlbW9uIHJiYWNfYXNzaWduX3JvbGUgcmJhY19yZXZva2Vfcm9sZSByYmFjX2NvbnRyYWN0X3N1c3BlbnNpb24gcmJhY19nZXRfYXJyYW5nZXIgcmJhY19nZXRfYWRkcmVzc19yb2xlcyByYmFjX2dldF9yb2xlX3ZhbGlkaXR5CiAgICBlcnIKCm1haW5fY3JlYXRlX05vT3BAMzM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6OC0xOAogICAgLy8gY2xhc3MgREFTQSgKICAgIC8vICAgICBQYXltZW50QWdlbnQsCiAgICAvLyAgICAgVHJhbnNmZXJBZ2VudCwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBhdm1fdmVyc2lvbj0xMiwKICAgIC8vICk6CiAgICBwdXNoYnl0ZXMgMHg5NTZkNzE1NiAvLyBtZXRob2QgImNvbnRyYWN0X2NyZWF0ZShhZGRyZXNzKXVpbnQ2NCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIGNvbnRyYWN0X2NyZWF0ZQogICAgZXJyCgptYWluX2NvbnRyYWN0X3VwZGF0ZV9yb3V0ZUA0OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgcHVzaGludCA0IC8vIFVwZGF0ZUFwcGxpY2F0aW9uCiAgICA9PQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICYmCiAgICBhc3NlcnQKICAgIGIgY29udHJhY3RfdXBkYXRlCgoKLy8gX3B1eWFfbGliLnV0aWwuZW5zdXJlX2J1ZGdldChyZXF1aXJlZF9idWRnZXQ6IHVpbnQ2NCwgZmVlX3NvdXJjZTogdWludDY0KSAtPiB2b2lkOgplbnN1cmVfYnVkZ2V0OgogICAgcHJvdG8gMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMTAKICAgICsKCmVuc3VyZV9idWRnZXRfd2hpbGVfdG9wQDE6CiAgICBmcmFtZV9kaWcgMAogICAgZ2xvYmFsIE9wY29kZUJ1ZGdldAogICAgPgogICAgYnogZW5zdXJlX2J1ZGdldF9hZnRlcl93aGlsZUA2CiAgICBpdHhuX2JlZ2luCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgYnl0ZWMgNDggLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtCiAgICBieXRlYyA0OCAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbQogICAgZnJhbWVfZGlnIC0xCiAgICBzd2l0Y2ggZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8wQDMgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8xQDQKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfbmV4dEA1OgogICAgaXR4bl9zdWJtaXQKICAgIGIgZW5zdXJlX2J1ZGdldF93aGlsZV90b3BAMQoKZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8xQDQ6CiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgYiBlbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX25leHRANQoKZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8wQDM6CiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGIgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV9uZXh0QDUKCmVuc3VyZV9idWRnZXRfYWZ0ZXJfd2hpbGVANjoKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucGF5bWVudF9hZ2VudC5QYXltZW50QWdlbnQuZnVuZF9kdWVfY2FzaGZsb3dzW3JvdXRpbmddKCkgLT4gdm9pZDoKZnVuZF9kdWVfY2FzaGZsb3dzOgogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAxMwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NgogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjgKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjY5CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjcwCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM4CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE1MAogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3MgogICAgLy8gaWYgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCk6CiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3Ni03NwogICAgLy8gKyBtYXhfZXZlbnRfY291bnQKICAgIC8vICogVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfUEVSX0VWRU5UX0JVREdFVCkKICAgIGR1cAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojc3CiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfRlVORF9EVUVfQ0FTSEZMT1dTX1BFUl9FVkVOVF9CVURHRVQpCiAgICBwdXNoaW50IDEwMAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojc2LTc3CiAgICAvLyArIG1heF9ldmVudF9jb3VudAogICAgLy8gKiBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19QRVJfRVZFTlRfQlVER0VUKQogICAgKgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojc1CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19CQVNFX0JVREdFVCkKICAgIGludGMgNCAvLyAxNTAwCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzUtNzcKICAgIC8vIFVJbnQ2NChjc3QuT1BfVVBfRlVORF9EVUVfQ0FTSEZMT1dTX0JBU0VfQlVER0VUKQogICAgLy8gKyBtYXhfZXZlbnRfY291bnQKICAgIC8vICogVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfUEVSX0VWRU5UX0JVREdFVCkKICAgICsKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3My03OQogICAgLy8gZW5zdXJlX2J1ZGdldCgKICAgIC8vICAgICByZXF1aXJlZF9idWRnZXQ9KAogICAgLy8gICAgICAgICBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19CQVNFX0JVREdFVCkKICAgIC8vICAgICAgICAgKyBtYXhfZXZlbnRfY291bnQKICAgIC8vICAgICAgICAgKiBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19QRVJfRVZFTlRfQlVER0VUKQogICAgLy8gICAgICksCiAgICAvLyApCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjgxCiAgICAvLyBwcm9jZXNzZWRfZXZlbnRzID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA1CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODIKICAgIC8vIGZ1bmRlZF9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4MwogICAgLy8gZnVuZGVkX3ByaW5jaXBhbCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTMKCmZ1bmRfZHVlX2Nhc2hmbG93c193aGlsZV90b3BANDoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4NgogICAgLy8gcHJvY2Vzc2VkX2V2ZW50cyA8IG1heF9ldmVudF9jb3VudAogICAgZGlnIDQKICAgIGRpZyAxCiAgICA8CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODYtODcKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgPCBtYXhfZXZlbnRfY291bnQKICAgIC8vIGFuZCBzZWxmLmV2ZW50X2N1cnNvciA8IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQKICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl93aGlsZUAxMQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojg3CiAgICAvLyBhbmQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIDwKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4Ni04NwogICAgLy8gcHJvY2Vzc2VkX2V2ZW50cyA8IG1heF9ldmVudF9jb3VudAogICAgLy8gYW5kIHNlbGYuZXZlbnRfY3Vyc29yIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudAogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDExCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODkKICAgIC8vIGVudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KHNlbGYuZXZlbnRfY3Vyc29yKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIGR1cAogICAgYnVyeSAxNwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjkwCiAgICAvLyBpZiBlbnRyeS5zY2hlZHVsZWRfdGltZSA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wOgogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDMKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgID4KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAMTEKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5MgogICAgLy8gaWYgbm90IHNlbGYuX2V2ZW50X2lzX2Nhc2goZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSk6CiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ1cnkgMTYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM1NAogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUCksCiAgICBpbnRjXzIgLy8gOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzUzLTM1NwogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfTUQpLAogICAgLy8gKQogICAgPT0KICAgIGR1cAogICAgYnVyeSA0CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfdHJ1ZUA1MgogICAgZGlnIDE0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNTUKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNTMtMzU3CiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9NRCksCiAgICAvLyApCiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX3RydWVANTIKICAgIGRpZyAxNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzU2CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX01EKSwKICAgIHB1c2hpbnQgMTkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM1My0zNTcKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX01EKSwKICAgIC8vICkKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUA1MwoKZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfdHJ1ZUA1MjoKICAgIGludGNfMSAvLyAxCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUA1NDoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5MgogICAgLy8gaWYgbm90IHNlbGYuX2V2ZW50X2lzX2Nhc2goZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSk6CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAMTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MQogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X2lkID09IHNlbGYuZXZlbnRfY3Vyc29yLCBlcnIuSU5WQUxJRF9FVkVOVF9DVVJTT1IKICAgIGRpZyAxNQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBjdXJzb3IKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MgogICAgLy8gYXNzZXJ0IGVudHJ5LnNjaGVkdWxlZF90aW1lIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLCBlcnIuTk9fRFVFX0NBU0hGTE9XCiAgICBkaWcgMQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPD0KICAgIGFzc2VydCAvLyBObyBkdWUgY2FzaGZsb3cgdG8gcGF5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MTYKICAgIC8vIGlmIGV2ZW50X3R5cGUgbm90IGluIChVSW50NjQoZW51bXMuRVZUX0lQKSwgVUludDY0KGVudW1zLkVWVF9NRCkpOgogICAgZGlnIDIKICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNQogICAgZGlnIDE0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MTcKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDExCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfaW50ZXJlc3RfYW1vdW50QDE2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDI5CiAgICAvLyBldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBidXJ5IDE2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzAKICAgIC8vIGlmIGV2ZW50X3R5cGUgbm90IGluIChVSW50NjQoZW51bXMuRVZUX1BSKSwgVUludDY0KGVudW1zLkVWVF9NRCkpOgogICAgcHVzaGludCAzCiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE5CiAgICBkaWcgMTQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzMQogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNgoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnRAMjg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTYKICAgIC8vIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGRpZyAxNQogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTU5CiAgICAvLyBpZiBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKToKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDI5CiAgICBkaWcgNwogICAgYnVyeSA5CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzODoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU3NS01NzcKICAgIC8vICMgRnVuZGluZyB1c2VzIHBlci11bml0IGN1bXVsYXRpdmUgaW5kaWNlcyBzbyBlYWNoIGhvbGRlciBjYW4gc2V0dGxlCiAgICAvLyAjIGluZGVwZW5kZW50bHkgZnJvbSBpdHMgY3VycmVudCB1bml0IGJhbGFuY2UuCiAgICAvLyBpbnRlcmVzdF9pbmRleF9kZWx0YSA9IHNlbGYuX2Ftb3VudF90b19pbmRleF9kZWx0YShpbnRlcmVzdF9hbW91bnRfZHVlKQogICAgZGlnIDEwCiAgICBjYWxsc3ViIF9hbW91bnRfdG9faW5kZXhfZGVsdGEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU3OAogICAgLy8gcHJpbmNpcGFsX2luZGV4X2RlbHRhID0gc2VsZi5fYW1vdW50X3RvX2luZGV4X2RlbHRhKHByaW5jaXBhbF9hbW91bnRfZHVlKQogICAgZGlnIDYKICAgIGNhbGxzdWIgX2Ftb3VudF90b19pbmRleF9kZWx0YQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTc5CiAgICAvLyBpbnRlcmVzdF9hbW91bnQgPSBzZWxmLl9pbmRleF9kZWx0YV90b19hbW91bnQoaW50ZXJlc3RfaW5kZXhfZGVsdGEpCiAgICBkaWcgMQogICAgY2FsbHN1YiBfaW5kZXhfZGVsdGFfdG9fYW1vdW50CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgMTUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4MAogICAgLy8gcHJpbmNpcGFsX2Ftb3VudCA9IHNlbGYuX2luZGV4X2RlbHRhX3RvX2Ftb3VudChwcmluY2lwYWxfaW5kZXhfZGVsdGEpCiAgICBkdXAKICAgIGNhbGxzdWIgX2luZGV4X2RlbHRhX3RvX2Ftb3VudAogICAgZHVwCiAgICBidXJ5IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1ODEKICAgIC8vIHJlcXVpcmVkX2Ftb3VudCA9IGludGVyZXN0X2Ftb3VudCArIHByaW5jaXBhbF9hbW91bnQKICAgIGRpZyAyCiAgICBkaWcgMQogICAgKwogICAgZHVwCiAgICBidXJ5IDkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjczNwogICAgLy8gYmFsYW5jZSA9IHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ1OQogICAgLy8gcmV0dXJuIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgKyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIGRpZyAxCiAgICArCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MzkKICAgIC8vIGFzc2VydCBiYWxhbmNlID49IHJlc2VydmVkX3RvdGFsLCBlcnIuTk9UX0VOT1VHSF9GVU5EUwogICAgZGlnIDIKICAgIGRpZyAxCiAgICA+PQogICAgYXNzZXJ0IC8vIE5vdCBlbm91Z2ggZnVuZHMgZm9yIHRoZSBwYXltZW50CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDAKICAgIC8vIHJldHVybiBiYWxhbmNlIC0gcmVzZXJ2ZWRfdG90YWwKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTgzCiAgICAvLyBzZWxmLl9hdmFpbGFibGVfc2V0dGxlbWVudF9mdW5kcygpID49IHJlcXVpcmVkX2Ftb3VudAogICAgdW5jb3ZlciAyCiAgICA+PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTgyLTU4NAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLl9hdmFpbGFibGVfc2V0dGxlbWVudF9mdW5kcygpID49IHJlcXVpcmVkX2Ftb3VudAogICAgLy8gKSwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTg2CiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0ICs9IGludGVyZXN0X2Ftb3VudAogICAgdW5jb3ZlciAzCiAgICArCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTg3CiAgICAvLyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCArPSBwcmluY2lwYWxfYW1vdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICArCiAgICBieXRlYyAxMiAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4OAogICAgLy8gc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4ICs9IGludGVyZXN0X2luZGV4X2RlbHRhCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCBleGlzdHMKICAgIHVuY292ZXIgMgogICAgKwogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTg5CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4ICs9IHByaW5jaXBhbF9pbmRleF9kZWx0YQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCBleGlzdHMKICAgICsKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTAKICAgIC8vIGlmIGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkgPT0gVUludDY0KGVudW1zLkVWVF9QUik6CiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBwdXNoaW50IDMKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDQwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTEtNTkyCiAgICAvLyAjIEZvciBQUiwgdGhlIHBlcmlvZCBpbnRlcmVzdCBzdGF5cyBhY2NydWVkIHVudGlsIGEgbGF0ZXIgSVAgb3IgTUQuCiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgKz0gc2VsZi5fZW50cnlfaW50ZXJlc3Rfc2VnbWVudChlbnRyeSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBkaWcgMTYKICAgIGNhbGxzdWIgX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQKICAgIGJ1cnkgMTgKICAgICsKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTUKICAgIC8vIGlmIG5vdCBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKSBvciBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NCgKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlANDMKICAgIGRpZyAxNQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5NS01OTcKICAgIC8vIGlmIG5vdCBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKSBvciBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NCgKICAgIC8vICAgICBlbnVtcy5FVlRfTUQKICAgIC8vICk6CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDQKCmZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDQzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTk4CiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBkaWcgMTUKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0NDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5OQogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgZGlnIDgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MDAKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IG5leHRfaW50ZXJlc3RfYmFzZQogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGRpZyA5CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAxCiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MDMKICAgIC8vIGlmIGVudHJ5LmV2ZW50X3R5cGUgPT0gYXJjNC5VSW50OCgKICAgIGRpZyAxNQogICAgZXh0cmFjdCA4IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwMy02MDUKICAgIC8vIGlmIGVudHJ5LmV2ZW50X3R5cGUgPT0gYXJjNC5VSW50OCgKICAgIC8vICAgICBlbnVtcy5FVlRfTUQKICAgIC8vICkgYW5kIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID09IFVJbnQ2NCgwKToKICAgIHB1c2hieXRlcyAweDEzCiAgICBiPT0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQ3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MDUKICAgIC8vICkgYW5kIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID09IFVJbnQ2NCgwKToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAzLTYwNQogICAgLy8gaWYgZW50cnkuZXZlbnRfdHlwZSA9PSBhcmM0LlVJbnQ4KAogICAgLy8gICAgIGVudW1zLkVWVF9NRAogICAgLy8gKSBhbmQgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPT0gVUludDY0KDApOgogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQ3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MDYKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGVudW1zLlNUQVRVU19FTkRFRCkKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgMjAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjA3CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQ3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjA5LTYxMwogICAgLy8gc2VsZi5fZW1pdF9leGVjdXRpb25fZXZlbnQoCiAgICAvLyAgICAgZW50cnk9ZW50cnksCiAgICAvLyAgICAgcGF5b2ZmPWludGVyZXN0X2Ftb3VudCArIHByaW5jaXBhbF9hbW91bnQsCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9aW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudCwKICAgIC8vICkKICAgIGRpZyAxNQogICAgZGlnIDQKICAgIGR1cAogICAgY2FsbHN1YiBfZW1pdF9leGVjdXRpb25fZXZlbnQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojk2CiAgICAvLyBmdW5kZWRfaW50ZXJlc3QgKz0gaW50ZXJlc3RfYW1vdW50CiAgICBkaWcgMTMKICAgIGRpZyAxMgogICAgKwogICAgYnVyeSAxNAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojk3CiAgICAvLyBmdW5kZWRfcHJpbmNpcGFsICs9IHByaW5jaXBhbF9hbW91bnQKICAgIGRpZyAxMgogICAgZGlnIDcKICAgICsKICAgIGJ1cnkgMTMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5OAogICAgLy8gcHJvY2Vzc2VkX2V2ZW50cyArPSBVSW50NjQoMSkKICAgIGRpZyA0CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSA1CiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c193aGlsZV90b3BANAoKZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUA0MDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5NAogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ID0gVUludDY0KDApCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQxCgpmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUAyOToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU2MAogICAgLy8gZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGRpZyAxNQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSAxNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTYxLTU2MwogICAgLy8gIyBEeW5hbWljIGFubnVpdGllcyBkZXJpdmUgbmV4dCBzdGF0ZSBmcm9tIHRoZSBwYXltZW50IGRlY29tcG9zaXRpb24sCiAgICAvLyAjIG5vdCBvbmx5IGZyb20gdGhlIHByZWNvbXB1dGVkIGBuZXh0XypgIGZpZWxkcy4KICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QUik6CiAgICBwdXNoaW50IDMKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDMxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjUKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIC0gcHJpbmNpcGFsX2Ftb3VudF9kdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgZGlnIDYKICAgIC0KICAgIGR1cAogICAgYnVyeSA5CiAgICBidXJ5IDkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzgKCmZ1bmRfZHVlX2Nhc2hmbG93c19lbHNlX2JvZHlAMzE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjgKICAgIC8vIGVsaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX0lQKToKICAgIGRpZyAxNAogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDMzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjkKICAgIC8vIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgYnVyeSA5CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzAKICAgIC8vIG5leHRfaW50ZXJlc3RfYmFzZSA9IHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgYnVyeSAxMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSBleGlzdHMKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzgKCmZ1bmRfZHVlX2Nhc2hmbG93c19lbHNlX2JvZHlAMzM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzEKICAgIC8vIGVsaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKToKICAgIGRpZyAxNAogICAgcHVzaGludCAxOQogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUAzNAogICAgZGlnIDcKICAgIGJ1cnkgOQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlAMzQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzIKICAgIC8vIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzMKICAgIC8vIG5leHRfaW50ZXJlc3RfYmFzZSA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgOQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzIKICAgIC8vIGlmIHNlbGYuX2lzX2R5bmFtaWNfYW5udWl0eSgpOgogICAgY2FsbHN1YiBfaXNfZHluYW1pY19hbm51aXR5CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyNwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDMzCiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfTUQpOgogICAgZGlnIDE0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzNAogICAgLy8gcmV0dXJuIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTU1CiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzNQogICAgLy8gaW50ZXJlc3RfZHVlID0gc2VsZi5hY2NydWVkX2ludGVyZXN0ICsgc2VsZi5fZW50cnlfaW50ZXJlc3Rfc2VnbWVudChlbnRyeSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBkaWcgMTYKICAgIGNhbGxzdWIgX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQKICAgIGJ1cnkgMTgKICAgICsKICAgIGR1cAogICAgYnVyeSAxMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDM2CiAgICAvLyBpZiBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPD0gaW50ZXJlc3RfZHVlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gZXhpc3RzCiAgICA+PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzNwogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTU1CiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyNDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzOAogICAgLy8gcHJpbmNpcGFsX2Ftb3VudCA9IHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiAtIGludGVyZXN0X2R1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gZXhpc3RzCiAgICBkaWcgMTAKICAgIC0KICAgIGR1cAogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzkKICAgIC8vIGlmIHByaW5jaXBhbF9hbW91bnQgPiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgPgogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ0MAogICAgLy8gcmV0dXJuIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTU1CiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyNjoKICAgIGRpZyA2CiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1NQogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NDMKICAgIC8vIGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsIDw9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBkaWcgMTUKICAgIHB1c2hpbnQgNDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGR1cDIKICAgIDw9CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NDItNDQ0CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsIDw9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ0NQogICAgLy8gcmV0dXJuIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIC0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIHN3YXAKICAgIC0KICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTU1CiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQxOAogICAgLy8gcmV0dXJuIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCArIHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZGlnIDE2CiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBidXJ5IDE4CiAgICArCiAgICBidXJ5IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTQKICAgIC8vIGludGVyZXN0X2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9pbnRlcmVzdF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9pbnRlcmVzdF9hbW91bnRAMTYKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl93aGlsZUAxMToKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMDAKICAgIC8vIGFzc2VydCBwcm9jZXNzZWRfZXZlbnRzID4gVUludDY0KDApLCBlcnIuTk9fRFVFX0NBU0hGTE9XCiAgICBkaWcgNAogICAgZHVwCiAgICBhc3NlcnQgLy8gTm8gZHVlIGNhc2hmbG93IHRvIHBheQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjEwNAogICAgLy8gdG90YWxfZnVuZGVkPWZ1bmRlZF9pbnRlcmVzdCArIGZ1bmRlZF9wcmluY2lwYWwsCiAgICBkaWcgMTQKICAgIGR1cAogICAgZGlnIDE1CiAgICBkdXAKICAgIGNvdmVyIDMKICAgICsKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMDYKICAgIC8vIHRpbWVzdGFtcD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMDEtMTA3CiAgICAvLyByZXR1cm4gdHlwLkNhc2hGdW5kaW5nUmVzdWx0KAogICAgLy8gICAgIGZ1bmRlZF9pbnRlcmVzdD1mdW5kZWRfaW50ZXJlc3QsCiAgICAvLyAgICAgZnVuZGVkX3ByaW5jaXBhbD1mdW5kZWRfcHJpbmNpcGFsLAogICAgLy8gICAgIHRvdGFsX2Z1bmRlZD1mdW5kZWRfaW50ZXJlc3QgKyBmdW5kZWRfcHJpbmNpcGFsLAogICAgLy8gICAgIHByb2Nlc3NlZF9ldmVudHM9cHJvY2Vzc2VkX2V2ZW50cywKICAgIC8vICAgICB0aW1lc3RhbXA9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX2ZhbHNlQDUzOgogICAgaW50Y18wIC8vIDAKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfbWVyZ2VANTQKCgovLyBtb2R1bGVzLnBheW1lbnRfYWdlbnQuUGF5bWVudEFnZW50LmNsYWltX2R1ZV9jYXNoZmxvd3Nbcm91dGluZ10oKSAtPiB2b2lkOgpjbGFpbV9kdWVfY2FzaGZsb3dzOgogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDIKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NgogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg0MTIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE1CiAgICAvLyBpZiBzZWxmLm9wX2RhZW1vbi52YWx1ZSAhPSBHbG9iYWwuemVyb19hZGRyZXNzOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI3IC8vIDB4NTIzYTRmNTA0NDIzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BfZGFlbW9uIGV4aXN0cwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgYnogY2xhaW1fZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE3CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTcKICAgIC8vIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNyAvLyAweDUyM2E0ZjUwNDQyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wX2RhZW1vbiBleGlzdHMKICAgID09CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTctMTkKICAgIC8vIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICAvLyBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgYm56IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDE0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTgKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNy0xOQogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICBibnogY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX3RydWVAMTQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxOQogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIHR4biBTZW5kZXIKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDMyCiAgICA9PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE3LTE5CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAxNQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX3RydWVAMTQ6CiAgICBpbnRjXzEgLy8gMQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDE2OgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE2LTIwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vICAgICBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gICAgIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICAvLyApLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNzoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMzkKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTQwCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM4CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE1MAogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNDMKICAgIC8vIHNlbGYuX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQoaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDIKICAgIGR1cAogICAgY2FsbHN1YiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE0NAogICAgLy8gc2VsZi5fc2V0dGxlX3Bvc2l0aW9uKGhvbGRpbmdfYWRkcmVzcykKICAgIGNhbGxzdWIgX3NldHRsZV9wb3NpdGlvbgogICAgcG9wbiAyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTE3CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jbGFpbWFibGVfaW50ZXJlc3QKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGR1cAogICAgcHVzaGludCA3MwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTE4CiAgICAvLyArIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNsYWltYWJsZV9wcmluY2lwYWwKICAgIGR1cAogICAgcHVzaGludCA4MQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTE3LTExOAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY2xhaW1hYmxlX2ludGVyZXN0CiAgICAvLyArIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNsYWltYWJsZV9wcmluY2lwYWwKICAgIHVuY292ZXIgMgogICAgKwogICAgZHVwCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNDYKICAgIC8vIGFzc2VydCB0b3RhbF9hbW91bnQgPiBVSW50NjQoMCksIGVyci5OT19EVUVfQ0FTSEZMT1cKICAgIGFzc2VydCAvLyBObyBkdWUgY2FzaGZsb3cgdG8gcGF5CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MjUKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5pc19vcHRlZF9pbigKICAgIGV4dHJhY3QgMCAzMgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI2CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI1LTI3CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MuaXNfb3B0ZWRfaW4oCiAgICAvLyAgICAgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkCiAgICAvLyApCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI1LTI4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MuaXNfb3B0ZWRfaW4oCiAgICAvLyAgICAgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkCiAgICAvLyApCiAgICAvLyBhbmQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZAogICAgYnogY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX2ZhbHNlQDI0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MjgKICAgIC8vIGFuZCBub3Qgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDM4NAogICAgZ2V0Yml0CiAgICBibnogY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX2ZhbHNlQDI0CiAgICBpbnRjXzEgLy8gMQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDI1OgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE1MQogICAgLy8gaWYgc2VsZi5faXNfcGF5bWVudF9leGVjdXRhYmxlKGhvbGRpbmdfYWRkcmVzcyk6CiAgICBieiBjbGFpbV9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjM0CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgc3dhcAogICAgZGlnIDEKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYXNzZXJ0IC8vIGFjY291bnQgb3B0ZWQgaW50byBhc3NldAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjM0LTM1CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgLy8gPj0gcGF5bWVudF9hbW91bnQKICAgIGRpZyA1CiAgICBkdXAKICAgIGNvdmVyIDIKICAgID49CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MzMtMzYKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIC8vICAgICA+PSBwYXltZW50X2Ftb3VudAogICAgLy8gKSwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE1MwogICAgLy8gc2VsZi5fcGF5KHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcywgdG90YWxfYW1vdW50KQogICAgZGlnIDIKICAgIGR1cAogICAgY292ZXIgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGR1cAogICAgZXh0cmFjdCAwIDMyCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NDAtNDUKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1yZWNlaXZlciwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9YW1vdW50LAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NDQKICAgIC8vIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICB1bmNvdmVyIDMKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgdW5jb3ZlciAyCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQwCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NDAtNDUKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1yZWNlaXZlciwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9YW1vdW50LAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEyNS0xMjYKICAgIC8vICMgR2V0IHRoZSBjbGFpbWFibGUgYW1vdW50cyBiZWZvcmUgcmVzZXQKICAgIC8vIGludGVyZXN0X2Ftb3VudCA9IHBvc2l0aW9uLmNsYWltYWJsZV9pbnRlcmVzdAogICAgZHVwCiAgICBwdXNoaW50IDczCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBidXJ5IDkKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMjcKICAgIC8vIHByaW5jaXBhbF9hbW91bnQgPSBwb3NpdGlvbi5jbGFpbWFibGVfcHJpbmNpcGFsCiAgICBkdXAKICAgIHB1c2hpbnQgODEKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGJ1cnkgOQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEyOS0xMzAKICAgIC8vICMgUmVzZXQgdGhlIHBvc2l0aW9uJ3MgY2xhaW1hYmxlIGFtb3VudHMKICAgIC8vIHBvc2l0aW9uLmNsYWltYWJsZV9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICByZXBsYWNlMiA3MwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzMQogICAgLy8gcG9zaXRpb24uY2xhaW1hYmxlX3ByaW5jaXBhbCA9IFVJbnQ2NCgwKQogICAgc3dhcAogICAgcmVwbGFjZTIgODEKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzIKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gcG9zaXRpb24uY29weSgpCiAgICB1bmNvdmVyIDMKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzQKICAgIC8vIGFzc2VydCBzZWxmLnJlc2VydmVkX2ludGVyZXN0ID49IGludGVyZXN0X2Ftb3VudCwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBkdXAKICAgIGRpZyAyCiAgICA+PQogICAgYXNzZXJ0IC8vIE5vdCBlbm91Z2ggZnVuZHMgZm9yIHRoZSBwYXltZW50CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTM1CiAgICAvLyBhc3NlcnQgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgPj0gcHJpbmNpcGFsX2Ftb3VudCwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIGRpZyAzCiAgICA+PQogICAgYXNzZXJ0IC8vIE5vdCBlbm91Z2ggZnVuZHMgZm9yIHRoZSBwYXltZW50CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTM3LTEzOAogICAgLy8gIyBVcGRhdGUgdGhlIGdsb2JhbCByZXNlcnZlZCBpbnRlcmVzdCBhbmQgcHJpbmNpcGFsIGFtb3VudHMKICAgIC8vIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgLT0gaW50ZXJlc3RfYW1vdW50CiAgICBzd2FwCiAgICAtCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzOQogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgLT0gcHJpbmNpcGFsX2Ftb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIGV4aXN0cwogICAgc3dhcAogICAgLQogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpjbGFpbV9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNTkKICAgIC8vIHRvdGFsX2Ftb3VudD1pbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50LAogICAgZGlnIDUKICAgIGR1cAogICAgZGlnIDYKICAgIGR1cAogICAgY292ZXIgMwogICAgKwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE2MAogICAgLy8gdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE1Ni0xNjIKICAgIC8vIHJldHVybiB0eXAuQ2FzaENsYWltUmVzdWx0KAogICAgLy8gICAgIGludGVyZXN0X2Ftb3VudD1pbnRlcmVzdF9hbW91bnQsCiAgICAvLyAgICAgcHJpbmNpcGFsX2Ftb3VudD1wcmluY2lwYWxfYW1vdW50LAogICAgLy8gICAgIHRvdGFsX2Ftb3VudD1pbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50LAogICAgLy8gICAgIHRpbWVzdGFtcD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICBjb250ZXh0PXBheW1lbnRfaW5mbywKICAgIC8vICkKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyAyCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgcHVzaGJ5dGVzIDB4MDAyMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX2ZhbHNlQDI0OgogICAgaW50Y18wIC8vIDAKICAgIGIgY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDI1CgpjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VAMTU6CiAgICBpbnRjXzAgLy8gMAogICAgYiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfbWVyZ2VAMTYKCgovLyBtb2R1bGVzLnRyYW5zZmVyX2FnZW50LlRyYW5zZmVyQWdlbnQudHJhbnNmZXJfc2V0X3NjaGVkdWxlW3JvdXRpbmddKCkgLT4gdm9pZDoKdHJhbnNmZXJfc2V0X3NjaGVkdWxlOgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQwCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDEKICAgIC8vIGFzc2VydCBvcGVuX2RhdGUgPCBjbG9zdXJlX2RhdGUsIGVyci5JTlZBTElEX1NPUlRJTkcKICAgIGR1cDIKICAgIDwKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBtdXN0IGJlIHNvcnRlZCBpbiBzdHJpY3RseSBhc2NlbmRpbmcgb3JkZXIKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDMKICAgIC8vIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlID0gb3Blbl9kYXRlCiAgICBieXRlYyAyOSAvLyAidHJhbnNmZXJfb3BlbmluZ19kYXRlIgogICAgdW5jb3ZlciAyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo0NAogICAgLy8gc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGUgPSBjbG9zdXJlX2RhdGUKICAgIGJ5dGVjIDMwIC8vICJ0cmFuc2Zlcl9jbG9zdXJlX2RhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo0NQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnRyYW5zZmVyX2FnZW50LlRyYW5zZmVyQWdlbnQucHJpbWFyeV9kaXN0cmlidXRpb25bcm91dGluZ10oKSAtPiB2b2lkOgpwcmltYXJ5X2Rpc3RyaWJ1dGlvbjoKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NgogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzEKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnByaW1hcnlfZGVhbGVyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjIgLy8gMHg1MjNhNTA1OTQ0MjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NzYKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojc3CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM4CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NzgKICAgIC8vIGFzc2VydCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBSSU1BUllfRElTVFJJQlVUSU9OX0NMT1NFRAogICAgYXNzZXJ0IC8vIFByaW1hcnkgZGlzdHJpYnV0aW9uIGlzIGNsb3NlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBjb3ZlciAzCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjgwCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKGhvbGRpbmdfYWRkcmVzcykKICAgIHN3YXAKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODEKICAgIC8vIGFzc2VydCB1bml0cyA+IFVJbnQ2NCgwKSwgZXJyLlpFUk9fVU5JVFMKICAgIGR1cAogICAgYXNzZXJ0IC8vIENhbiBub3QgZGlzdHJpYnV0ZSB6ZXJvIHVuaXRzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjgzCiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsICsgdW5pdHMgPD0gc2VsZi50b3RhbF91bml0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCBleGlzdHMKICAgICsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICA8PQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4Mi04NAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsICsgdW5pdHMgPD0gc2VsZi50b3RhbF91bml0cwogICAgLy8gKSwgZXJyLk9WRVJfRElTVFJJQlVUSU9OCiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IHJlbWFpbmluZyBELUFTQSB1bml0cwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4NQogICAgLy8gaWYgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjggLy8gImluaXRpYWxfZXhjaGFuZ2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGUgZXhpc3RzCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODcKICAgIC8vIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDw9IHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjggLy8gImluaXRpYWxfZXhjaGFuZ2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGUgZXhpc3RzCiAgICA8PQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4Ni04OAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8PSBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZQogICAgLy8gKSwgZXJyLlBSSU1BUllfRElTVFJJQlVUSU9OX0NMT1NFRAogICAgYXNzZXJ0IC8vIFByaW1hcnkgZGlzdHJpYnV0aW9uIGlzIGNsb3NlZAoKcHJpbWFyeV9kaXN0cmlidXRpb25fYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE0OAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucmVzZXJ2ZWRfdW5pdHMgKz0gdW5pdHMKICAgIGR1cG4gMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHB1c2hpbnQgNDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMwogICAgZHVwCiAgICBjb3ZlciAzCiAgICArCiAgICBpdG9iCiAgICBwdXNoaW50IDQwCiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo5MQogICAgLy8gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCArPSB1bml0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCBleGlzdHMKICAgICsKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo5MgogICAgLy8gcmV0dXJuIHNlbGYudG90YWxfdW5pdHMgLSBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgc3dhcAogICAgLQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy50cmFuc2Zlcl9hZ2VudC5UcmFuc2ZlckFnZW50LnRyYW5zZmVyW3JvdXRpbmddKCkgLT4gdm9pZDoKdHJhbnNmZXI6CiAgICBpbnRjXzAgLy8gMAogICAgZHVwCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojk0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXBuIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDYKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxMzAKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjEzMQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzOAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTAKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjEzCiAgICAvLyBpZiBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyOSAvLyAidHJhbnNmZXJfb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIGJ6IHRyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNQogICAgLy8gc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyOSAvLyAidHJhbnNmZXJfb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIDw9CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE0LTE2CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyApLCBlcnIuQ0xPU0VEX1RSQU5TRkVSCiAgICBhc3NlcnQgLy8gVHJhbnNmZXIgaXMgY2xvc2VkCgp0cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE3CiAgICAvLyBpZiBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMCAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIGJ6IHRyYW5zZmVyX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxOQogICAgLy8gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDMwIC8vICJ0cmFuc2Zlcl9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgPAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxOC0yMAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8IHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlCiAgICAvLyApLCBlcnIuQ0xPU0VEX1RSQU5TRkVSCiAgICBhc3NlcnQgLy8gVHJhbnNmZXIgaXMgY2xvc2VkCgp0cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjEzNQogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gc2VuZGVyX2hvbGRpbmdfYWRkcmVzcywgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDgKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIGRpZyA1CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDkKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTM4CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBkaWcgMgogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxMzkKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQocmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzKQogICAgZHVwCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE0MAogICAgLy8gYXNzZXJ0IHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MgIT0gcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzLCBlcnIuU0VMRl9UUkFOU0ZFUgogICAgdW5jb3ZlciAyCiAgICAhPQogICAgYXNzZXJ0IC8vIFNlbmRlciBhbmQgcmVjZWl2ZXIgbXVzdCBiZSBkaWZmZXJlbnQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTQxCiAgICAvLyBhc3NlcnQgdW5pdHMgPiBVSW50NjQoMCksIGVyci5OVUxMX1RSQU5TRkVSCiAgICBkaWcgMQogICAgZHVwCiAgICBhc3NlcnQgLy8gVHJhbnNmZXIgdW5pdHMgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNDIKICAgIC8vIGFzc2VydCB1bml0cyA8PSBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMsIGVyci5PVkVSX1RSQU5TRkVSCiAgICBzd2FwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgPD0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgc2VuZGVyIHVuaXRzIHRvIHRyYW5zZmVyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NjYKICAgIC8vIGlmIHNlbGYuZXZlbnRfY3Vyc29yID49IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQ6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgID49CiAgICBibnogdHJhbnNmZXJfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYXNzZXJ0X25vX2R1ZV9ldmVudF9wZW5kaW5nQDEwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NjgKICAgIC8vIG5leHRfZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoc2VsZi5ldmVudF9jdXJzb3IpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzcwCiAgICAvLyBuZXh0X2VudHJ5LnNjaGVkdWxlZF90aW1lID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgID4KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc2OS03NzEKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgbmV4dF9lbnRyeS5zY2hlZHVsZWRfdGltZSA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyApLCBlcnIuUEVORElOR19BQ1RVU19FVkVOVAogICAgYXNzZXJ0IC8vIEFDVFVTIGV2ZW50IG5vdCB5ZXQgZXhlY3V0ZWQKCnRyYW5zZmVyX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Fzc2VydF9ub19kdWVfZXZlbnRfcGVuZGluZ0AxMDoKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTQ1CiAgICAvLyBzZWxmLl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBkaWcgMwogICAgZHVwCiAgICBjYWxsc3ViIF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE0NgogICAgLy8gc2VsZi5fZW5zdXJlX3VuaXRzX2FjdGl2YXRlZChyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBkaWcgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjYWxsc3ViIF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE0NwogICAgLy8gc2VsZi5fc2V0dGxlX3Bvc2l0aW9uKHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBjYWxsc3ViIF9zZXR0bGVfcG9zaXRpb24KICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNDgKICAgIC8vIHNlbGYuX3NldHRsZV9wb3NpdGlvbihyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBjYWxsc3ViIF9zZXR0bGVfcG9zaXRpb24KICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE1MgogICAgLy8gYXNzZXJ0IHVuaXRzIDw9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLCBlcnIuT1ZFUl9UUkFOU0ZFUgogICAgZGlnIDUKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGRpZyAxCiAgICA8PQogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCBzZW5kZXIgdW5pdHMgdG8gdHJhbnNmZXIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNTMKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzIC09IHVuaXRzCiAgICBkaWcgMQogICAgLQogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBpbnRjXzMgLy8gMzIKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNDQKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzICs9IHVuaXRzCiAgICBkaWcgNQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgdW5jb3ZlciAyCiAgICArCiAgICBpdG9iCiAgICBpbnRjXzMgLy8gMzIKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojk0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgZGlnIDIKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF9zdXNwZW5zaW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF9zdXNwZW5zaW9uOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE2NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzcKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDIxIC8vIDB4NTIzYTQxNTU1NDIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg0MTIzCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTg1CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGR1cAogICAgcHVzaGludCA0OAogICAgaW50Y18xIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIHB1c2hpbnQgNDgKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTg2CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfb3Blbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfb3BlbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2OAogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjMgLy8gMHg1MjNhNGQ0ZTQ3MjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0MgogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfRU5ERUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgMjAwCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxMAogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfZW5kZWQoKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgIQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjExCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxMgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTMKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjM0CiAgICAvLyB1bml0cz1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjMyLTQyCiAgICAvLyByZXR1cm4gdHlwLkFjY291bnRQb3NpdGlvbigKICAgIC8vICAgICBwYXltZW50X2FkZHJlc3M9cGF5bWVudF9hZGRyZXNzLAogICAgLy8gICAgIHVuaXRzPVVJbnQ2NCgwKSwKICAgIC8vICAgICByZXNlcnZlZF91bml0cz1VSW50NjQoMCksCiAgICAvLyAgICAgc3VzcGVuZGVkPUZhbHNlLAogICAgLy8gICAgIHNldHRsZWRfY3Vyc29yPVVJbnQ2NCgwKSwKICAgIC8vICAgICBpbnRlcmVzdF9jaGVja3BvaW50PVVJbnQ2NCgwKSwKICAgIC8vICAgICBwcmluY2lwYWxfY2hlY2twb2ludD1VSW50NjQoMCksCiAgICAvLyAgICAgY2xhaW1hYmxlX2ludGVyZXN0PVVJbnQ2NCgwKSwKICAgIC8vICAgICBjbGFpbWFibGVfcHJpbmNpcGFsPVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGl0b2IKICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgYnl0ZWMgNDAgLy8gMHgwMAogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTQKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gc2VsZi5fbmV3X2FjY291bnRfcG9zaXRpb24ocGF5bWVudF9hZGRyZXNzKQogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxNQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5hY2NvdW50X3VwZGF0ZV9wYXltZW50X2FkZHJlc3Nbcm91dGluZ10oKSAtPiB2b2lkOgphY2NvdW50X3VwZGF0ZV9wYXltZW50X2FkZHJlc3M6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg0MTIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMzgKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcywgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgdW5jb3ZlciAzCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjM5CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0MAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDEKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcyA9IHBheW1lbnRfYWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDIKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF9nZXRfcG9zaXRpb25bcm91dGluZ10oKSAtPiB2b2lkOgphY2NvdW50X2dldF9wb3NpdGlvbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg0MTIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI1OQogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmNvbnRyYWN0X2NyZWF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X2NyZWF0ZToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDM2CiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gYXJyYW5nZXIKICAgIGJ5dGVjIDE4IC8vIDB4NTIzYTQxNTI1MjIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAzNwogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9jb25maWdbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9jb25maWc6CiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAzOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGxlbgogICAgcHVzaGludCAxMDcKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuTm9ybWFsaXplZEFjdHVzVGVybXMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDcyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLkluaXRpYWxLZXJuZWxTdGF0ZQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIGxlbgogICAgZGlnIDEKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgdHVwbGUgZW5jb2RpbmcKICAgIGR1cAogICAgcHVzaGludCAzNAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHRhaWwgcG9pbnRlciBhdCBpbmRleCAxIG9mICh1aW50OFszMl0sKGxlbit1dGY4W10pKQogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBjb3ZlciAzCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAzNgogICAgKwogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5Qcm9zcGVjdHVzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDY5CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNzEtMTA3MgogICAgLy8gIyBDb25maWd1cmUgQ29udHJhY3QKICAgIC8vIHNlbGYuY29udHJhY3RfdHlwZSA9IHRlcm1zLmNvbnRyYWN0X3R5cGUuYXNfdWludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjEtMjI4CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICBieiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIzCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfQU5OKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjEtMjI4CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjQKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgcHVzaGludCAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjEtMjI4CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjUKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjEtMjI4CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjYKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgcHVzaGludCA0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjEtMjI4CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjcKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjEtMjI4CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYnogY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAOAoKY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUA3OgogICAgaW50Y18xIC8vIDEKCmNvbnRyYWN0X2NvbmZpZ19ib29sX21lcmdlQDk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMzIKICAgIC8vIGFzc2VydCBzZWxmLl9pc19zdXBwb3J0ZWRfY29udHJhY3RfdHlwZShjb250cmFjdF90eXBlKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc0CiAgICAvLyBzZWxmLl9zdG9yZV9jb250cmFjdF9jb25maWcoc2VsZi5jb250cmFjdF90eXBlLCB0ZXJtcywgaW5pdGlhbF9zdGF0ZSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBidXJ5IDIKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMjgKICAgIC8vIGFzc2VydCB0ZXJtcy5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBkaWcgNAogICAgZHVwCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDgKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMzMAogICAgLy8gdGVybXMuZGF5X2NvdW50X2NvbnZlbnRpb24uYXNfdWludDY0KCkKICAgIHB1c2hpbnQgNTcKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDAtMzA2CiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgIGJ6IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGRpZyA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDIKICAgIC8vIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzAwLTMwNgogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGRpZyA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDMKICAgIC8vIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICBwdXNoaW50IDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMwMC0zMDYKICAgIC8vIHJldHVybiBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzYwKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwSVNEQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjApLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDE2CiAgICBkaWcgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzA0CiAgICAvLyBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDAtMzA2CiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgID09CiAgICBibnogY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUAxNgogICAgZGlnIDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMwNQogICAgLy8gVUludDY0KGVudW1zLkRDQ18zMEUzNjApLAogICAgcHVzaGludCA0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDAtMzA2CiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgID09CiAgICBieiBjb250cmFjdF9jb25maWdfYm9vbF9mYWxzZUAxNwoKY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUAxNjoKICAgIGludGNfMSAvLyAxCgpjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUAxODoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxMi0zMTQKICAgIC8vIGFzc2VydCBzZWxmLl9pc19zdXBwb3J0ZWRfZGF5X2NvdW50X2NvbnZlbnRpb24oCiAgICAvLyAgICAgZGF5X2NvdW50X2NvbnZlbnRpb24KICAgIC8vICksIGVyci5JTlZBTElEX0RBWV9DT1VOVF9DT05WRU5USU9OCiAgICBhc3NlcnQgLy8gSW52YWxpZCBkYXktY291bnQgY29udmVudGlvbiBJRAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzMyCiAgICAvLyBpZiBjb250cmFjdF90eXBlICE9IFVJbnQ2NChlbnVtcy5DVF9BTk4pOgogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgIT0KICAgIGJ6IGNvbnRyYWN0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDIwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzMKICAgIC8vIGFzc2VydCBub3QgdGVybXMuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBkaWcgNAogICAgcHVzaGludCA3ODYKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgoKY29udHJhY3RfY29uZmlnX2FmdGVyX2lmX2Vsc2VAMjA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTAKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTEKICAgIC8vIGFzc2VydCBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID09IFVJbnQ2NCgwKSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBELUFTQSBhbHJlYWR5IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgxMy04MTQKICAgIC8vICMgU2V0IERlbm9taW5hdGlvbiBBc3NldAogICAgLy8gc2VsZi5fYXNzZXJ0X2Rlbm9taW5hdGlvbl9hc3NldCh0ZXJtcy5kZW5vbWluYXRpb25fYXNzZXRfaWQpCiAgICBkaWcgNAogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc3OC03NzkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gZGVub21pbmF0aW9uIHdpdGggQVNBCiAgICAvLyBfY3JlYXRvciwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfY3JlYXRvcihkZW5vbWluYXRpb25fYXNzZXRfaWQpCiAgICBkdXAKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc4MAogICAgLy8gYXNzZXJ0IGV4aXN0cywgZXJyLklOVkFMSURfREVOT01JTkFUSU9OCiAgICBhc3NlcnQgLy8gRGVub21pbmF0aW9uIGFzc2V0IGlzIG5vdCBwcm9wZXJseSBzZXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc4MwogICAgLy8gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgPSBkZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIGJ5dGVjIDQ0IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgxNy04MTgKICAgIC8vICMgU2V0IFNldHRsZW1lbnQgQXNzZXQKICAgIC8vIHNlbGYuX2Fzc2VydF9zZXR0bGVtZW50X2Fzc2V0KHRlcm1zLnNldHRsZW1lbnRfYXNzZXRfaWQpCiAgICBkaWcgMQogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Nzg4CiAgICAvLyBzZXR0bGVtZW50X2Fzc2V0X2lkID09IHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc4Ni03ODkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzZXR0bGVtZW50IGFzc2V0IGlzIHRoZSBkZW5vbWluYXRpb24gYXNzZXQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgLy8gKSwgZXJyLklOVkFMSURfU0VUVExFTUVOVF9BU1NFVAogICAgYXNzZXJ0IC8vIERpZmZlcmVudCBzZXR0bGVtZW50IGFzc2V0IG5vdCBzdXBwb3J0ZWQsIG11c3QgYmUgZXF1YWwgdG8gZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3OTIKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCA9IHNldHRsZW1lbnRfYXNzZXRfaWQKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3OTMtNzk5CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3OTgKICAgIC8vIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3OTYKICAgIC8vIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Nzk3CiAgICAvLyBhc3NldF9hbW91bnQ9MCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3OTMtNzk0CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc5My03OTkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gc2V0dGxlbWVudCB3aXRoIEFTQQogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PTAsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MjEtODIyCiAgICAvLyAjIFVuaXRzCiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzID0gdGVybXMudG90YWxfdW5pdHMKICAgIGR1cAogICAgcHVzaGludCAxNwogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MjMKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODI1LTgyNgogICAgLy8gIyBEYXktQ291bnQgQ29udmVudGlvbnMKICAgIC8vIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPSB0ZXJtcy5kYXlfY291bnRfY29udmVudGlvbi5hc191aW50NjQoKQogICAgYnl0ZWMgNDYgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgZGlnIDgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MjgtODI5CiAgICAvLyAjIFRpbWUKICAgIC8vIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlID0gdGVybXMuaW5pdGlhbF9leGNoYW5nZV9kYXRlCiAgICBkdXAKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAyOCAvLyAiaW5pdGlhbF9leGNoYW5nZV9kYXRlIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MzAKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IHRlcm1zLm1hdHVyaXR5X2RhdGUKICAgIGRpZyAxCiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNDUgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzMQogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gaW5pdGlhbF9zdGF0ZS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBkaWcgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBwdXNoaW50IDQ4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODMzLTgzNAogICAgLy8gIyBQcmluY2lwYWwKICAgIC8vIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPSB0ZXJtcy5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudAogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgZGlnIDEwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODM1CiAgICAvLyBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSB0ZXJtcy5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBkaWcgMwogICAgcHVzaGludCA3ODYKICAgIGdldGJpdAogICAgYnl0ZWMgMzQgLy8gImR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODM2CiAgICAvLyBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9IGluaXRpYWxfc3RhdGUub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBkaWcgMQogICAgcHVzaGludCAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MzgtODM5CiAgICAvLyAjIEludGVyZXN0CiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgPSBpbml0aWFsX3N0YXRlLmFjY3J1ZWRfaW50ZXJlc3QKICAgIGRpZyAxCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDEtODQyCiAgICAvLyAjIEludGVyZXN0IFJhdGUKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gaW5pdGlhbF9zdGF0ZS5ub21pbmFsX2ludGVyZXN0X3JhdGUKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQzCiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBpbml0aWFsX3N0YXRlLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UKICAgIGRpZyAxCiAgICBwdXNoaW50IDI0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDQKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQgPSB0ZXJtcy5yYXRlX3Jlc2V0X3NwcmVhZAogICAgZGlnIDMKICAgIHB1c2hpbnQgNTgKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzNSAvLyAicmF0ZV9yZXNldF9zcHJlYWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQ1CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciA9IHRlcm1zLnJhdGVfcmVzZXRfbXVsdGlwbGllcgogICAgZGlnIDMKICAgIHB1c2hpbnQgNjYKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzNiAvLyAicmF0ZV9yZXNldF9tdWx0aXBsaWVyIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0NgogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X2Zsb29yID0gdGVybXMucmF0ZV9yZXNldF9mbG9vcgogICAgZGlnIDMKICAgIHB1c2hpbnQgNzQKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzMSAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDcKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9jYXAgPSB0ZXJtcy5yYXRlX3Jlc2V0X2NhcAogICAgZGlnIDMKICAgIHB1c2hpbnQgODIKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzMiAvLyAicmF0ZV9yZXNldF9jYXAiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQ4CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfbmV4dCA9IHRlcm1zLnJhdGVfcmVzZXRfbmV4dAogICAgZGlnIDMKICAgIHB1c2hpbnQgOTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzNyAvLyAicmF0ZV9yZXNldF9uZXh0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0OQogICAgLy8gc2VsZi5oYXNfcmF0ZV9yZXNldF9mbG9vciA9IHRlcm1zLmhhc19yYXRlX3Jlc2V0X2Zsb29yCiAgICBkaWcgMwogICAgcHVzaGludCA3ODQKICAgIGdldGJpdAogICAgYnl0ZWMgMzggLy8gImhhc19yYXRlX3Jlc2V0X2Zsb29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg1MAogICAgLy8gc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgPSB0ZXJtcy5oYXNfcmF0ZV9yZXNldF9jYXAKICAgIGRpZyAzCiAgICBwdXNoaW50IDc4NQogICAgZ2V0Yml0CiAgICBieXRlYyAzOSAvLyAiaGFzX3JhdGVfcmVzZXRfY2FwIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg1Mi04NTMKICAgIC8vICMgU2NhbGluZwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSA9IHRlcm1zLmZpeGVkX3BvaW50X3NjYWxlCiAgICB1bmNvdmVyIDMKICAgIHB1c2hpbnQgOTkKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NTUtODU2CiAgICAvLyAjIFNjaGVkdWxlIFByb2Nlc3NpbmcKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yID0gaW5pdGlhbF9zdGF0ZS5ldmVudF9jdXJzb3IKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NTgtODU5CiAgICAvLyAjIFBlci1Vbml0IEZpeGVkLVBvaW50IEluZGV4ZXMKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCA9IGluaXRpYWxfc3RhdGUuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleAogICAgZGlnIDEKICAgIHB1c2hpbnQgNTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NjAKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggPSBpbml0aWFsX3N0YXRlLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4CiAgICBkaWcgMQogICAgcHVzaGludCA2NAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NjItODYzCiAgICAvLyAjIFJlc2VydmVkIEFtb3VudCAoZm9yIGV4ZWN1dGVkIGNhc2hmbG93cykKICAgIC8vIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODY0CiAgICAvLyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODY2CiAgICAvLyBhc3NlcnQgdGVybXMuaW5pdGlhbF9leGNoYW5nZV9kYXRlID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsIGVyci5JTlZBTElEX0lFRAogICAgZGlnIDIKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgID4KICAgIGFzc2VydCAvLyBJRUQgbXVzdCBiZSBzZXQgaW4gdGhlIGZ1dHVyZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODY3CiAgICAvLyBhc3NlcnQgdGVybXMuaW5pdGlhbF9leGNoYW5nZV9kYXRlID4gaW5pdGlhbF9zdGF0ZS5zdGF0dXNfZGF0ZSwgZXJyLklOVkFMSURfSUVECiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICA8CiAgICBhc3NlcnQgLy8gSUVEIG11c3QgYmUgc2V0IGluIHRoZSBmdXR1cmUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2OAogICAgLy8gYXNzZXJ0IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA8IHRlcm1zLm1hdHVyaXR5X2RhdGUsIGVyci5JTlZBTElEX0lFRAogICAgPAogICAgYXNzZXJ0IC8vIElFRCBtdXN0IGJlIHNldCBpbiB0aGUgZnV0dXJlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc2LTEwNzcKICAgIC8vICMgTm90YXJpemUgcHJvc3BlY3R1cyAob3B0aW9uYWwpCiAgICAvLyBzZWxmLnByb3NwZWN0dXNfaGFzaCA9IHByb3NwZWN0dXMuaGFzaC5ieXRlcwogICAgZGlnIDIKICAgIGV4dHJhY3QgMCAzMgogICAgYnl0ZWMgNDIgLy8gInByb3NwZWN0dXNfaGFzaCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc4CiAgICAvLyBzZWxmLnByb3NwZWN0dXNfdXJsID0gcHJvc3BlY3R1cy51cmwKICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgYnl0ZWMgNDMgLy8gInByb3NwZWN0dXNfdXJsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNzkKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAzOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpjb250cmFjdF9jb25maWdfYm9vbF9mYWxzZUAxNzoKICAgIGludGNfMCAvLyAwCiAgICBiIGNvbnRyYWN0X2NvbmZpZ19ib29sX21lcmdlQDE4Cgpjb250cmFjdF9jb25maWdfYm9vbF9mYWxzZUA4OgogICAgaW50Y18wIC8vIDAKICAgIGIgY29udHJhY3RfY29uZmlnX2Jvb2xfbWVyZ2VAOQoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmNvbnRyYWN0X3NjaGVkdWxlW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3Rfc2NoZWR1bGU6CiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwODEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgc3dhcAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGR1cAogICAgcHVzaGludCA2NQogICAgKgogICAgcHVzaGludCAyCiAgICArCiAgICB1bmNvdmVyIDIKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeT4KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMTMKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTExNgogICAgLy8gY29udHJhY3RfdHlwZT1zZWxmLmNvbnRyYWN0X3R5cGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgY292ZXIgMwogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg4NAogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuQUxSRUFEWV9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBELUFTQSBhbHJlYWR5IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg4NS04ODcKICAgIC8vIGFzc2VydCBzY2hlZHVsZV9wYWdlLmxlbmd0aCA8PSBVSW50NjQoCiAgICAvLyAgICAgY3N0LlNDSEVEVUxFX1BBR0VfU0laRQogICAgLy8gKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZHVwCiAgICBwdXNoaW50IDE2CiAgICA8PQogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODg4CiAgICAvLyBhc3NlcnQgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCA+IFVJbnQ2NCgwKSwgZXJyLlRFUk1TX05PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIHRlcm1zIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTAKICAgIC8vIHBhZ2VfY3Vyc29yID0gc2NoZWR1bGVfcGFnZV9pbmRleCAqIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKQogICAgc3dhcAogICAgcHVzaGludCAxNgogICAgKgogICAgc3dhcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODk3CiAgICAvLyArIHBhZ2VfbGVuZ3RoICogVUludDY0KGNzdC5PUF9VUF9DT05UUkFDVF9DT05GSUdfUEVSX0VOVFJZX0JVREdFVCkKICAgIHB1c2hpbnQgMTAwCiAgICAqCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTYKICAgIC8vIFVJbnQ2NChjc3QuT1BfVVBfQ09OVFJBQ1RfQ09ORklHX0JBU0VfQlVER0VUKQogICAgaW50YyA0IC8vIDE1MDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg5Ni04OTcKICAgIC8vIFVJbnQ2NChjc3QuT1BfVVBfQ09OVFJBQ1RfQ09ORklHX0JBU0VfQlVER0VUKQogICAgLy8gKyBwYWdlX2xlbmd0aCAqIFVJbnQ2NChjc3QuT1BfVVBfQ09OVFJBQ1RfQ09ORklHX1BFUl9FTlRSWV9CVURHRVQpCiAgICArCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTItODk5CiAgICAvLyAjIFZhbGlkYXRpb24gY29zdCBncm93cyB3aXRoIHBhZ2UgbGVuZ3RoLCBzbyBjb25maWd1cmF0aW9uIGV4cGxpY2l0bHkKICAgIC8vICMgYnV5cyBleHRyYSBvcGNvZGUgYnVkZ2V0IGZvciBsYXJnZXIgdXBsb2Fkcy4KICAgIC8vIGVuc3VyZV9idWRnZXQoCiAgICAvLyAgICAgcmVxdWlyZWRfYnVkZ2V0PSgKICAgIC8vICAgICAgICAgVUludDY0KGNzdC5PUF9VUF9DT05UUkFDVF9DT05GSUdfQkFTRV9CVURHRVQpCiAgICAvLyAgICAgICAgICsgcGFnZV9sZW5ndGggKiBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19QRVJfRU5UUllfQlVER0VUKQogICAgLy8gICAgICksCiAgICAvLyApCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDAKICAgIC8vIGluZGV4ID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAoKY29udHJhY3Rfc2NoZWR1bGVfd2hpbGVfdG9wQDI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDEKICAgIC8vIHdoaWxlIGluZGV4IDwgcGFnZV9sZW5ndGg6CiAgICBkdXAKICAgIGRpZyA0CiAgICA8CiAgICBieiBjb250cmFjdF9zY2hlZHVsZV9hZnRlcl93aGlsZUAxMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTAyLTkwMwogICAgLy8gZW50cnkgPSBzY2hlZHVsZV9wYWdlW2luZGV4XS5jb3B5KCkKICAgIC8vIGVudHJ5X2V2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBkaWcgNAogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgYnVyeSAxMgogICAgZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgcHVzaGludCA2NQogICAgKgogICAgcHVzaGludCA2NQogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDMKICAgIC8vIGVudHJ5X2V2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkwMi05MDMKICAgIC8vIGVudHJ5ID0gc2NoZWR1bGVfcGFnZVtpbmRleF0uY29weSgpCiAgICAvLyBlbnRyeV9ldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgaW50Y18yIC8vIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkwMwogICAgLy8gZW50cnlfZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGdldGJ5dGUKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSAxMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTA0CiAgICAvLyBhc3NlcnQgZW50cnkuZXZlbnRfaWQgPT0gcGFnZV9jdXJzb3IgKyBpbmRleCwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgMTMKICAgIGRpZyA1CiAgICB1bmNvdmVyIDQKICAgICsKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgaWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkwNS05MDcKICAgIC8vIHNlbGYuX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGVudHJ5X2V2ZW50X3R5cGUKICAgIC8vICkKICAgIGRpZyA1CiAgICB1bmNvdmVyIDMKICAgIGNhbGxzdWIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDgKICAgIC8vIGFzc2VydCBlbnRyeS5zY2hlZHVsZWRfdGltZSA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBzd2FwCiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgMTAKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkwOQogICAgLy8gaWYgZW50cnkuZXZlbnRfaWQgPiBVSW50NjQoMCk6CiAgICBieiBjb250cmFjdF9zY2hlZHVsZV9hZnRlcl9pZl9lbHNlQDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkxMAogICAgLy8gaWYgaW5kZXggPiBVSW50NjQoMCk6CiAgICBkdXAKICAgIGJ6IGNvbnRyYWN0X3NjaGVkdWxlX2Vsc2VfYm9keUA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTEKICAgIC8vIHByZXZpb3VzX2VudHJ5ID0gc2NoZWR1bGVfcGFnZVtpbmRleCAtIFVJbnQ2NCgxKV0uY29weSgpCiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBwdXNoaW50IDY1CiAgICAqCiAgICBkaWcgMTEKICAgIHN3YXAKICAgIHB1c2hpbnQgNjUKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwoKY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTI2CiAgICAvLyBwcmV2aW91c19lbnRyeS5zY2hlZHVsZWRfdGltZSA8PSBlbnRyeS5zY2hlZHVsZWRfdGltZQogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDgKICAgIDw9CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjUtOTI3CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHByZXZpb3VzX2VudHJ5LnNjaGVkdWxlZF90aW1lIDw9IGVudHJ5LnNjaGVkdWxlZF90aW1lCiAgICAvLyApLCBlcnIuSU5WQUxJRF9TT1JUSU5HCiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbXVzdCBiZSBzb3J0ZWQgaW4gc3RyaWN0bHkgYXNjZW5kaW5nIG9yZGVyCgpjb250cmFjdF9zY2hlZHVsZV9hZnRlcl9pZl9lbHNlQDg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjgKICAgIC8vIGlmIGVudHJ5LmV2ZW50X2lkID09IFVJbnQ2NCgwKToKICAgIGRpZyA4CiAgICBibnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTI5LTkzMQogICAgLy8gYXNzZXJ0IGVudHJ5X2V2ZW50X3R5cGUgPT0gVUludDY0KAogICAgLy8gICAgIGVudW1zLkVWVF9JRUQKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZGlnIDkKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgoKY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzMgogICAgLy8gaW5kZXggKz0gVUludDY0KDEpCiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgY29udHJhY3Rfc2NoZWR1bGVfd2hpbGVfdG9wQDIKCmNvbnRyYWN0X3NjaGVkdWxlX2Vsc2VfYm9keUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTEzLTkxNQogICAgLy8gIyBUaGUgZmlyc3QgZW50cnkgb2YgYSBwYWdlIG11c3Qgc3RpbGwgYmUgb3JkZXJlZCBhZnRlciB0aGUKICAgIC8vICMgbGFzdCBlbnRyeSBvZiB0aGUgcHJldmlvdXMgcGFnZS4KICAgIC8vIGFzc2VydCBzY2hlZHVsZV9wYWdlX2luZGV4ID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9FVkVOVF9JRAogICAgZGlnIDYKICAgIGR1cAogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgaWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkxNgogICAgLy8gcHJldmlvdXNfcGFnZV9pbmRleCA9IHNjaGVkdWxlX3BhZ2VfaW5kZXggLSBVSW50NjQoMSkKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTgKICAgIC8vIHByZXZpb3VzX3BhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlCiAgICBpdG9iCiAgICBieXRlYyAyNCAvLyAweDUzMjMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkxNy05MTkKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgcHJldmlvdXNfcGFnZV9pbmRleCBpbiBzZWxmLnNjaGVkdWxlX3BhZ2UKICAgIC8vICksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkyMC05MjEKICAgIC8vIHByZXZpb3VzX3BhZ2UgPSBzZWxmLnNjaGVkdWxlX3BhZ2VbcHJldmlvdXNfcGFnZV9pbmRleF0uY29weSgpCiAgICAvLyBhc3NlcnQgcHJldmlvdXNfcGFnZS5sZW5ndGggPiBVSW50NjQoMCksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIHB1c2hpbnQgMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkyMQogICAgLy8gYXNzZXJ0IHByZXZpb3VzX3BhZ2UubGVuZ3RoID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBkdXAKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkyMwogICAgLy8gcHJldmlvdXNfcGFnZS5sZW5ndGggLSBVSW50NjQoMSkKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjItOTI0CiAgICAvLyBwcmV2aW91c19lbnRyeSA9IHByZXZpb3VzX3BhZ2VbCiAgICAvLyAgICAgcHJldmlvdXNfcGFnZS5sZW5ndGggLSBVSW50NjQoMSkKICAgIC8vIF0uY29weSgpCiAgICBwdXNoaW50IDY1CiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIHB1c2hpbnQgNjUKICAgIGJveF9leHRyYWN0CiAgICBiIGNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VANwoKY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfd2hpbGVAMTE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMDMKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHNjaGVkdWxlX3BhZ2UuY29weSgpCiAgICBkaWcgNgogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBkaWcgNQogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTM1CiAgICAvLyBpZiBpc19sYXN0X3BhZ2U6CiAgICBkaWcgNQogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTM3CiAgICAvLyBzY2hlZHVsZV9wYWdlX2luZGV4ICogVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpICsgcGFnZV9sZW5ndGgKICAgIGRpZyAxCiAgICBkaWcgNAogICAgKwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTM2CiAgICAvLyBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50ID0gKAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MzYtOTM4CiAgICAvLyBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50ID0gKAogICAgLy8gICAgIHNjaGVkdWxlX3BhZ2VfaW5kZXggKiBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkgKyBwYWdlX2xlbmd0aAogICAgLy8gKQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzOQogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgcHVzaGludCA1MAogICAgYXBwX2dsb2JhbF9wdXQKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTIxCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwODEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmNvbnRyYWN0X2V4ZWN1dGVfaWVkW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfZXhlY3V0ZV9pZWQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDYKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE0NgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTQ3CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE0OAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTAKICAgIC8vIGFzc2VydCBzZWxmLmV2ZW50X2N1cnNvciA8IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICBkaWcgMQogICAgPgogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgY3Vyc29yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTUxCiAgICAvLyBlbnRyeSA9IHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLmV2ZW50X2N1cnNvcikKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1MgogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X3R5cGUgPT0gYXJjNC5VSW50OChlbnVtcy5FVlRfSUVEKSwgZXJyLklOVkFMSURfRVZFTlRfVFlQRQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgZHVwCiAgICBwdXNoYnl0ZXMgMHgwMQogICAgYj09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCB0eXBlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTU2CiAgICAvLyBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIGRpZyAxCiAgICBleHRyYWN0IDAgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1OAogICAgLy8gc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICBkaWcgMgogICAgZXh0cmFjdCA5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTkKICAgIC8vIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgZGlnIDMKICAgIGV4dHJhY3QgMTcgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE2MAogICAgLy8gcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZGlnIDQKICAgIGV4dHJhY3QgMjUgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE2MgogICAgLy8gbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9ZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBkaWcgNQogICAgZXh0cmFjdCAzMyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTYzCiAgICAvLyBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICBkaWcgNgogICAgZXh0cmFjdCA0MSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTY0CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1lbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIGRpZyA3CiAgICBleHRyYWN0IDQ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNjUKICAgIC8vIGZsYWdzPWVudHJ5LmZsYWdzLAogICAgZGlnIDgKICAgIGV4dHJhY3QgNTcgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1NS0xMTY2CiAgICAvLyB0eXAuT2JzZXJ2ZWRFdmVudFJlcXVlc3QoCiAgICAvLyAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBvYnNlcnZlZF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1lbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9ZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9ZW50cnkuZmxhZ3MsCiAgICAvLyApLAogICAgdW5jb3ZlciA3CiAgICB1bmNvdmVyIDgKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE2MQogICAgLy8gb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1NS0xMTY2CiAgICAvLyB0eXAuT2JzZXJ2ZWRFdmVudFJlcXVlc3QoCiAgICAvLyAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBvYnNlcnZlZF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1lbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9ZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9ZW50cnkuZmxhZ3MsCiAgICAvLyApLAogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTMtMTE2NwogICAgLy8gc2VsZi5fYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkoCiAgICAvLyAgICAgZW50cnksCiAgICAvLyAgICAgdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0KAogICAgLy8gICAgICAgICBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIC8vICAgICAgICAgZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgLy8gICAgICAgICBzY2hlZHVsZWRfdGltZT1lbnRyeS5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICAgICAgYWNjcnVhbF9mYWN0b3I9ZW50cnkuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICAgICAgb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPWVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPWVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgICAgICBmbGFncz1lbnRyeS5mbGFncywKICAgIC8vICAgICApLAogICAgLy8gKQogICAgY2FsbHN1YiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkKICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE2OAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTIzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5hcHBseV9ub25fY2FzaF9ldmVudFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFwcGx5X25vbl9jYXNoX2V2ZW50OgogICAgaW50Y18wIC8vIDAKICAgIGR1cG4gNAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwbiAyCiAgICBsZW4KICAgIHB1c2hpbnQgNzMKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuT2JzZXJ2ZWRFdmVudFJlcXVlc3QKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NgogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjA3CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIwOAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMTAKICAgIC8vIGlmIHBheWxvYWQuZmxhZ3MgJiBVSW50NjQoZW51bXMuRkxBR19PQlNFUlZFRF9FVkVOVCk6CiAgICBwdXNoaW50IDY1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBwdXNoaW50IDQKICAgICYKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjM2CiAgICAvLyByZXR1cm4gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9DTE0pCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIHB1c2hpbnQgNQogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMTEKICAgIC8vIGFzc2VydCBzZWxmLl9zdXBwb3J0c19vYnNlcnZlZF9ldmVudHMoKSwgZXJyLk9CU0VSVkVEX0VWRU5UX1JFUVVJUkVECiAgICBhc3NlcnQgLy8gT2JzZXJ2ZWQgZXZlbnQgcmVxdWlyZWQgdG8gZXhlY3V0ZSB0aGlzIGFjdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIxMgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMzYKICAgIC8vIHJldHVybiBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0NMTSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgZHVwCiAgICBwdXNoaW50IDUKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NDgKICAgIC8vIGFzc2VydCBzZWxmLl9zdXBwb3J0c19vYnNlcnZlZF9ldmVudHMoKSwgZXJyLk9CU0VSVkVEX0VWRU5UX1JFUVVJUkVECiAgICBhc3NlcnQgLy8gT2JzZXJ2ZWQgZXZlbnQgcmVxdWlyZWQgdG8gZXhlY3V0ZSB0aGlzIGFjdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQ5CiAgICAvLyBhc3NlcnQgcGF5bG9hZC5ldmVudF9pZCA9PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LCBlcnIuSU5WQUxJRF9FVkVOVF9JRAogICAgZGlnIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgNwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTEKICAgIC8vIHNlbGYuY29udHJhY3RfdHlwZSwgcGF5bG9hZC5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBkdXAKICAgIGV4dHJhY3QgOCAxCiAgICBidXJ5IDEyCiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTUwLTk1MgogICAgLy8gc2VsZi5fYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgc2VsZi5jb250cmFjdF90eXBlLCBwYXlsb2FkLmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIC8vICkKICAgIGNhbGxzdWIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTQKICAgIC8vIHBhZ2VfaW5kZXggPSBzZWxmLl9zY2hlZHVsZV9wYWdlX2luZGV4KHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxOTMKICAgIC8vIHJldHVybiBldmVudF9pZCAvLyBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkKICAgIHB1c2hpbnQgMTYKICAgIC8KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1NQogICAgLy8gcGFnZSA9IHR5cC5FeGVjdXRpb25TY2hlZHVsZVBhZ2UoKQogICAgYnl0ZWMgNDkgLy8gMHgwMDAwCiAgICBidXJ5IDcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1NgogICAgLy8gaWYgcGFnZV9pbmRleCBpbiBzZWxmLnNjaGVkdWxlX3BhZ2U6CiAgICBpdG9iCiAgICBieXRlYyAyNCAvLyAweDUzMjMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDkKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYWZ0ZXJfaWZfZWxzZUAyNwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTU3CiAgICAvLyBwYWdlID0gc2VsZi5zY2hlZHVsZV9wYWdlW3BhZ2VfaW5kZXhdLmNvcHkoKQogICAgZGlnIDcKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGJ1cnkgNwogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfcGFnZSBlbnRyeSBleGlzdHMKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMjc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTgKICAgIC8vIGFzc2VydCBwYWdlLmxlbmd0aCA8IFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZGlnIDUKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgcHVzaGludCAxNgogICAgPAogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTYzCiAgICAvLyBzY2hlZHVsZWRfdGltZT1wYXlsb2FkLnNjaGVkdWxlZF90aW1lLAogICAgZGlnIDMKICAgIGR1cAogICAgZXh0cmFjdCA5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2NAogICAgLy8gYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIGRpZyAxCiAgICBleHRyYWN0IDE3IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2NQogICAgLy8gcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICBkaWcgMgogICAgZXh0cmFjdCAyNSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjYKICAgIC8vIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPXBheWxvYWQubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBkaWcgMwogICAgZXh0cmFjdCA0MSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjcKICAgIC8vIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgZGlnIDQKICAgIGV4dHJhY3QgNDkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTY4CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1wYXlsb2FkLm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgdW5jb3ZlciA1CiAgICBleHRyYWN0IDU3IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2MC05NzAKICAgIC8vIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgIGV2ZW50X2lkPXBheWxvYWQuZXZlbnRfaWQsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1wYXlsb2FkLmV2ZW50X3R5cGUsCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPXBheWxvYWQubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1wYXlsb2FkLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICBmbGFncz1wYXlsb2FkLmZsYWdzLAogICAgLy8gKQogICAgZGlnIDExCiAgICBpdG9iCiAgICBkaWcgMTgKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1OS05NzEKICAgIC8vIHBhZ2UuYXBwZW5kKAogICAgLy8gICAgIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgICAgICBldmVudF9pZD1wYXlsb2FkLmV2ZW50X2lkLAogICAgLy8gICAgICAgICBldmVudF90eXBlPXBheWxvYWQuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICAgICAgYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPXBheWxvYWQubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1wYXlsb2FkLm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgICAgICBmbGFncz1wYXlsb2FkLmZsYWdzLAogICAgLy8gICAgICkKICAgIC8vICkKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk3MgogICAgLy8gc2VsZi5zY2hlZHVsZV9wYWdlW3BhZ2VfaW5kZXhdID0gcGFnZS5jb3B5KCkKICAgIGRpZyA4CiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTczCiAgICAvLyBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50ICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMTUKICAgIC8vIGFzc2VydCBldmVudF9pZCA9PSBzZWxmLmV2ZW50X2N1cnNvciwgZXJyLklOVkFMSURfRVZFTlRfQ1VSU09SCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGRpZyAzCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGN1cnNvcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIxNgogICAgLy8gZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoZXZlbnRfaWQpCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIGR1cAogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjE4CiAgICAvLyBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBkdXAKICAgIGV4dHJhY3QgOCAxCiAgICBidXJ5IDEwCiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2NwogICAgLy8gVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2Ni0zNzMKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lFRCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9SUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9SUkYpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX3RydWVAMTUKICAgIGRpZyA0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjgKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgcHVzaGludCA0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjYtMzczCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY5CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIHB1c2hpbnQgMTIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2Ni0zNzMKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lFRCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9SUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9SUkYpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX3RydWVAMTUKICAgIGRpZyA0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNzAKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIHB1c2hpbnQgMTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2Ni0zNzMKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lFRCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9SUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9SUkYpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX3RydWVAMTUKICAgIGRpZyA0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNzEKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICBwdXNoaW50IDE4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjYtMzczCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzcyCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICBwdXNoaW50IDUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2Ni0zNzMKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lFRCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9SUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9SUkYpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfZmFsc2VAMTYKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNToKICAgIGludGNfMSAvLyAxCgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX21lcmdlQDE3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIxNy0xMjE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfaXNfbm9uX2Nhc2goCiAgICAvLyAgICAgZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgLy8gKSwgZXJyLklOVkFMSURfRVZFTlRfVFlQRQogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIyMAogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X3R5cGUgIT0gYXJjNC5VSW50OChlbnVtcy5FVlRfSUVEKSwgZXJyLklOVkFMSURfRVZFTlRfVFlQRQogICAgZGlnIDgKICAgIHB1c2hieXRlcyAweDAxCiAgICBiIT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IHR5cGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM3NwogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKFVJbnQ2NChlbnVtcy5FVlRfUlIpLCBVSW50NjQoZW51bXMuRVZUX1JSRikpCiAgICBkaWcgNAogICAgcHVzaGludCAxMgogICAgPT0KICAgIGJueiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX3RydWVAMjEKICAgIGRpZyA0CiAgICBwdXNoaW50IDExCiAgICA9PQogICAgYnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9mYWxzZUAyMgoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDIxOgogICAgaW50Y18xIC8vIDEKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfbWVyZ2VAMjM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjIxCiAgICAvLyBpZiBzZWxmLl9ldmVudF9pc19yYXRlX3Jlc2V0KGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkpOgogICAgYnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfZWxzZV9ib2R5QDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4MAogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYub2JzZXJ2ZXIsIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyNSAvLyAweDUyM2E0ZDRmNDMyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIyNQogICAgLy8gc2VsZi5fYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkoZW50cnksIHBheWxvYWQpCiAgICBkaWcgNgogICAgZGlnIDIKICAgIGNhbGxzdWIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5CiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMjYKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE3MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgphcHBseV9ub25fY2FzaF9ldmVudF9lbHNlX2JvZHlANToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMjQKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgYiBhcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDYKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfZmFsc2VAMjI6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX21lcmdlQDIzCgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX2ZhbHNlQDE2OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9tZXJnZUAxNwoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50W3JvdXRpbmddKCkgLT4gdm9pZDoKYXBwZW5kX29ic2VydmVkX2Nhc2hfZXZlbnQ6CiAgICBpbnRjXzAgLy8gMAogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjI4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cG4gMgogICAgbGVuCiAgICBwdXNoaW50IDY1CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLk9ic2VydmVkQ2FzaEV2ZW50UmVxdWVzdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQ2CiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyNTcKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI1OAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyNTkKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzgKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTUwCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuX3N0YXR1c19pc19wZW5kaW5nX2llZCgpLCBlcnIuUEVORElOR19JRUQKICAgICEKICAgIGFzc2VydCAvLyBJRUQgbm90IHlldCBleGVjdXRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjM2CiAgICAvLyByZXR1cm4gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9DTE0pCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIHB1c2hpbnQgNQogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4NAogICAgLy8gYXNzZXJ0IHNlbGYuX3N1cHBvcnRzX29ic2VydmVkX2V2ZW50cygpLCBlcnIuT0JTRVJWRURfRVZFTlRfUkVRVUlSRUQKICAgIGFzc2VydCAvLyBPYnNlcnZlZCBldmVudCByZXF1aXJlZCB0byBleGVjdXRlIHRoaXMgYWN0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5ODUKICAgIC8vIGFzc2VydCBwYXlsb2FkLmV2ZW50X2lkID09IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQsIGVyci5JTlZBTElEX0VWRU5UX0lECiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICBzd2FwCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5ODYKICAgIC8vIGFzc2VydCBwYXlsb2FkLmV2ZW50X3R5cGUgPT0gYXJjNC5VSW50OChlbnVtcy5FVlRfUFIpLCBlcnIuSU5WQUxJRF9FVkVOVF9UWVBFCiAgICBkaWcgMQogICAgZXh0cmFjdCA4IDEKICAgIGR1cAogICAgY292ZXIgMwogICAgcHVzaGJ5dGVzIDB4MDMKICAgIGI9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTg3CiAgICAvLyBhc3NlcnQgcGF5bG9hZC5mbGFncyAmIFVJbnQ2NChlbnVtcy5GTEFHX0NBU0hfRVZFTlQpLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIHN3YXAKICAgIHB1c2hpbnQgNTcKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMSAvLyAxCiAgICAmCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5ODkKICAgIC8vIGlmIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgPiBVSW50NjQoMCk6CiAgICBieiBhcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5MQogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCAtIFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5MC05OTIKICAgIC8vIHByZXZpb3VzX2VudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KAogICAgLy8gICAgIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgLSBVSW50NjQoMSkKICAgIC8vICkKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTk0CiAgICAvLyBwcmV2aW91c19lbnRyeS5zY2hlZHVsZWRfdGltZSA8PSBwYXlsb2FkLnNjaGVkdWxlZF90aW1lCiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgNAogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgPD0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5My05OTUKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgcHJldmlvdXNfZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gcGF5bG9hZC5zY2hlZHVsZWRfdGltZQogICAgLy8gKSwgZXJyLklOVkFMSURfU09SVElORwogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIG11c3QgYmUgc29ydGVkIGluIHN0cmljdGx5IGFzY2VuZGluZyBvcmRlcgoKYXBwZW5kX29ic2VydmVkX2Nhc2hfZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTk3CiAgICAvLyBwYWdlX2luZGV4ID0gc2VsZi5fc2NoZWR1bGVfcGFnZV9pbmRleChzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTkzCiAgICAvLyByZXR1cm4gZXZlbnRfaWQgLy8gVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpCiAgICBwdXNoaW50IDE2CiAgICAvCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OTgKICAgIC8vIHBhZ2UgPSB0eXAuRXhlY3V0aW9uU2NoZWR1bGVQYWdlKCkKICAgIGJ5dGVjIDQ5IC8vIDB4MDAwMAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OTkKICAgIC8vIGlmIHBhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlOgogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA3CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VANQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAwMAogICAgLy8gcGFnZSA9IHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XS5jb3B5KCkKICAgIGRpZyA1CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidXJ5IDYKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX3BhZ2UgZW50cnkgZXhpc3RzCgphcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDAxCiAgICAvLyBhc3NlcnQgcGFnZS5sZW5ndGggPCBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGRpZyA0CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgMTYKICAgIDwKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMDYKICAgIC8vIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICBkaWcgNQogICAgZHVwCiAgICBleHRyYWN0IDkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAwNwogICAgLy8gYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIGRpZyAxCiAgICBleHRyYWN0IDE3IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMDgKICAgIC8vIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZGlnIDIKICAgIGV4dHJhY3QgMjUgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAwOQogICAgLy8gbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9cGF5bG9hZC5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIGRpZyAzCiAgICBleHRyYWN0IDMzIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMTAKICAgIC8vIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgZGlnIDQKICAgIGV4dHJhY3QgNDEgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAxMQogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIHVuY292ZXIgNQogICAgZXh0cmFjdCA0OSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDAzLTEwMTMKICAgIC8vIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgIGV2ZW50X2lkPXBheWxvYWQuZXZlbnRfaWQsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1wYXlsb2FkLmV2ZW50X3R5cGUsCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPXBheWxvYWQubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1wYXlsb2FkLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICBmbGFncz1wYXlsb2FkLmZsYWdzLAogICAgLy8gKQogICAgZGlnIDEwCiAgICBpdG9iCiAgICBkaWcgMTAKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMDItMTAxNAogICAgLy8gcGFnZS5hcHBlbmQoCiAgICAvLyAgICAgdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkoCiAgICAvLyAgICAgICAgIGV2ZW50X2lkPXBheWxvYWQuZXZlbnRfaWQsCiAgICAvLyAgICAgICAgIGV2ZW50X3R5cGU9cGF5bG9hZC5ldmVudF90eXBlLAogICAgLy8gICAgICAgICBzY2hlZHVsZWRfdGltZT1wYXlsb2FkLnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgICAgICBhY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPXBheWxvYWQucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9cGF5bG9hZC5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1wYXlsb2FkLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXBheWxvYWQubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgICAgIGZsYWdzPXBheWxvYWQuZmxhZ3MsCiAgICAvLyAgICAgKQogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAxNQogICAgLy8gc2VsZi5zY2hlZHVsZV9wYWdlW3BhZ2VfaW5kZXhdID0gcGFnZS5jb3B5KCkKICAgIGRpZyA2CiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAxNgogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjYzCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmNvbnRyYWN0X3NldF9kZWZhdWx0X3N0YXR1c1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X3NldF9kZWZhdWx0X3N0YXR1czoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyNjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo3NAogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYudHJ1c3RlZSwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDI2IC8vIDB4NTIzYTU0NTI1MzIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjc4CiAgICAvLyBzZWxmLmRlZmF1bHRlZCA9IGRlZmF1bHRlZAogICAgYnl0ZWMgNDcgLy8gImRlZmF1bHRlZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjc5CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyNjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmNvbnRyYWN0X2dldF9zdGF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X2dldF9zdGF0ZToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NgogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgZHVwCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyOTQKICAgIC8vIGNvbnRyYWN0X3R5cGU9YXJjNC5VSW50OChzZWxmLmNvbnRyYWN0X3R5cGUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgaW50Y18yIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjk2CiAgICAvLyB0b3RhbF91bml0cz1zZWxmLnRvdGFsX3VuaXRzLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyOTcKICAgIC8vIHJlc2VydmVkX3VuaXRzX3RvdGFsPXNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI5OAogICAgLy8gaW5pdGlhbF9leGNoYW5nZV9hbW91bnQ9c2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMCAvLyAiaW5pdGlhbF9leGNoYW5nZV9hbW91bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjk5CiAgICAvLyBldmVudF9jdXJzb3I9c2VsZi5ldmVudF9jdXJzb3IsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMDAKICAgIC8vIHNjaGVkdWxlX2VudHJ5X2NvdW50PXNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzAxCiAgICAvLyBvdXRzdGFuZGluZ19wcmluY2lwYWw9c2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMDIKICAgIC8vIGludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2U9c2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMDMKICAgIC8vIG5vbWluYWxfaW50ZXJlc3RfcmF0ZT1zZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMwNAogICAgLy8gYWNjcnVlZF9pbnRlcmVzdD1zZWxmLmFjY3J1ZWRfaW50ZXJlc3QsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMwNQogICAgLy8gY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleD1zZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMDYKICAgIC8vIGN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4PXNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTcgLy8gImN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMwNwogICAgLy8gcmVzZXJ2ZWRfaW50ZXJlc3Q9c2VsZi5yZXNlcnZlZF9pbnRlcmVzdCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzA4CiAgICAvLyByZXNlcnZlZF9wcmluY2lwYWw9c2VsZi5yZXNlcnZlZF9wcmluY2lwYWwsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjkzLTEzMDkKICAgIC8vIHJldHVybiB0eXAuS2VybmVsU3RhdGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZT1hcmM0LlVJbnQ4KHNlbGYuY29udHJhY3RfdHlwZSksCiAgICAvLyAgICAgc3RhdHVzPXNlbGYuc3RhdHVzLAogICAgLy8gICAgIHRvdGFsX3VuaXRzPXNlbGYudG90YWxfdW5pdHMsCiAgICAvLyAgICAgcmVzZXJ2ZWRfdW5pdHNfdG90YWw9c2VsZi5yZXNlcnZlZF91bml0c190b3RhbCwKICAgIC8vICAgICBpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudD1zZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50LAogICAgLy8gICAgIGV2ZW50X2N1cnNvcj1zZWxmLmV2ZW50X2N1cnNvciwKICAgIC8vICAgICBzY2hlZHVsZV9lbnRyeV9jb3VudD1zZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LAogICAgLy8gICAgIG91dHN0YW5kaW5nX3ByaW5jaXBhbD1zZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICBpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlPXNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSwKICAgIC8vICAgICBub21pbmFsX2ludGVyZXN0X3JhdGU9c2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgYWNjcnVlZF9pbnRlcmVzdD1zZWxmLmFjY3J1ZWRfaW50ZXJlc3QsCiAgICAvLyAgICAgY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleD1zZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgsCiAgICAvLyAgICAgY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXg9c2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCwKICAgIC8vICAgICByZXNlcnZlZF9pbnRlcmVzdD1zZWxmLnJlc2VydmVkX2ludGVyZXN0LAogICAgLy8gICAgIHJlc2VydmVkX3ByaW5jaXBhbD1zZWxmLnJlc2VydmVkX3ByaW5jaXBhbCwKICAgIC8vICkKICAgIHVuY292ZXIgMTQKICAgIGl0b2IKICAgIHVuY292ZXIgMTQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDEyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTEKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMAogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDkKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA4CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDYKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNAogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI4MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50W3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQ2CiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMjMKICAgIC8vIGlmIHNlbGYuZXZlbnRfY3Vyc29yID49IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQ6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgID49CiAgICBieiBjb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzI1CiAgICAvLyBldmVudF9pZD1zZWxmLmV2ZW50X2N1cnNvciwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMyNC0xMzM0CiAgICAvLyByZXR1cm4gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkoCiAgICAvLyAgICAgZXZlbnRfaWQ9c2VsZi5ldmVudF9jdXJzb3IsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1hcmM0LlVJbnQ4KDApLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPVVJbnQ2NCgwKSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249VUludDY0KDApLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPVVJbnQ2NCgwKSwKICAgIC8vICAgICBmbGFncz1VSW50NjQoMCksCiAgICAvLyApCiAgICBpdG9iCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzI2CiAgICAvLyBldmVudF90eXBlPWFyYzQuVUludDgoMCksCiAgICBieXRlYyA0MCAvLyAweDAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzI0LTEzMzQKICAgIC8vIHJldHVybiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1zZWxmLmV2ZW50X2N1cnNvciwKICAgIC8vICAgICBldmVudF90eXBlPWFyYzQuVUludDgoMCksCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9VUludDY0KDApLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9VUludDY0KDApLAogICAgLy8gICAgIGZsYWdzPVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMyNwogICAgLy8gc2NoZWR1bGVkX3RpbWU9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMjQtMTMzNAogICAgLy8gcmV0dXJuIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgIGV2ZW50X2lkPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgLy8gICAgIGV2ZW50X3R5cGU9YXJjNC5VSW50OCgwKSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1VSW50NjQoMCksCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1VSW50NjQoMCksCiAgICAvLyAgICAgZmxhZ3M9VUludDY0KDApLAogICAgLy8gKQogICAgaXRvYgogICAgc3dhcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0Cgpjb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnRfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnRANDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMzUKICAgIC8vIHJldHVybiBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoc2VsZi5ldmVudF9jdXJzb3IpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMxMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIGNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudF9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudEA0CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuY29udHJhY3RfdXBkYXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfdXBkYXRlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE1OS0xNjIKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBncmFudHMgdGhlIHVwZGF0ZSBwZXJtaXNzaW9ucyB0byB0aGUgQXJyYW5nZXIuCiAgICAvLyAjIOKaoO+4jyBXQVJOSU5HOiBBcHBsaWNhdGlvbiB1cGRhdGVzIG11c3QgYmUgZXhlY3V0ZWQgVkVSWSBjYXJlZnVsbHksIGFzIHRoZXkKICAgIC8vICMgbWlnaHQgaW50cm9kdWNlIGJyZWFraW5nIGNoYW5nZXMuCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3JvdGF0ZV9hcnJhbmdlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfcm90YXRlX2FycmFuZ2VyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzgKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE3OQogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IG5ld19hcnJhbmdlcgogICAgYnl0ZWMgMTggLy8gMHg1MjNhNDE1MjUyMjMKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTgwCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfc2V0X29wX2RhZW1vbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfc2V0X29wX2RhZW1vbjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTk2CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxOTcKICAgIC8vIHNlbGYub3BfZGFlbW9uLnZhbHVlID0gYWRkcmVzcwogICAgYnl0ZWMgMjcgLy8gMHg1MjNhNGY1MDQ0MjMKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTk4CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfYXNzaWduX3JvbGVbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2Fzc2lnbl9yb2xlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIHB1c2hpbnQgMTYKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuUm9sZVZhbGlkaXR5CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjIyCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjMKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI0CiAgICAvLyBzZWxmLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpKQogICAgYnRvaQogICAgZHVwbiAyCiAgICBjYWxsc3ViIF9hc3NlcnRfdmFsaWRfcm9sZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwMgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUik6CiAgICBwdXNoaW50IDIwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDMKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDE4IC8vIDB4NTIzYTQxNTI1MjIzCiAgICBkaWcgMwogICAgYXBwX2dsb2JhbF9wdXQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI2CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA2CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgNDAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwNwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjMgLy8gMHg1MjNhNGQ0ZTQ3MjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwOAogICAgLy8gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjUKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMiAvLyAweDUyM2E1MDU5NDQyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTEyCiAgICAvLyBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI1CiAgICAvLyBzZWxmLl9zZXRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIHZhbGlkaXR5KQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTQKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNjAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI2IC8vIDB4NTIzYTU0NTI1MzIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTYKICAgIC8vIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNQogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE4CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNzAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTkKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIxIC8vIDB4NTIzYTQxNTU1NDIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjAKICAgIC8vIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI1CiAgICAvLyBzZWxmLl9zZXRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIHZhbGlkaXR5KQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMTE6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIyCiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKToKICAgIGR1cAogICAgcHVzaGludCA4MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjMKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYub2JzZXJ2ZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjUgLy8gMHg1MjNhNGQ0ZjQzMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyNAogICAgLy8gc2VsZi5vYnNlcnZlcltyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19yZXZva2Vfcm9sZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfcmV2b2tlX3JvbGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjQ3CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNDgKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjQ5CiAgICAvLyBzZWxmLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpKQogICAgYnRvaQogICAgZHVwbiAyCiAgICBjYWxsc3ViIF9hc3NlcnRfdmFsaWRfcm9sZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyNwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgIT0gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBkdXAKICAgIHB1c2hpbnQgMjAKICAgICE9CiAgICBhc3NlcnQgLy8gSW52YWxpZCByb2xlIGlkZW50aWZpZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjgKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIHB1c2hpbnQgNDAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyOQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmFjY291bnRfbWFuYWdlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMyAvLyAweDUyM2E0ZDRlNDcyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMwCiAgICAvLyBkZWwgc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1MQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIyIC8vIDB4NTIzYTUwNTk0NDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzQKICAgIC8vIGRlbCBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1MAogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzYKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNjAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjYgLy8gMHg1MjNhNTQ1MjUzMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzOAogICAgLy8gZGVsIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTAKICAgIC8vIHNlbGYuX2RlbGV0ZV9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcykKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQwCiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNzAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMSAvLyAweDUyM2E0MTU1NTQyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQyCiAgICAvLyBkZWwgc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjUwCiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgODAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ1CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYub2JzZXJ2ZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjUgLy8gMHg1MjNhNGQ0ZjQzMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NgogICAgLy8gZGVsIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2NvbnRyYWN0X3N1c3BlbnNpb25bcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2NvbnRyYWN0X3N1c3BlbnNpb246CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjUzCiAgICAvLyBAYXJjNC5hYmltZXRob2QgICMgVE9ETzogVXBkYXRlIHNwZWNzIGFuZCBhZGQgdGVzdAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo3NwogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYXV0aG9yaXR5LCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjEgLy8gMHg1MjNhNDE1NTU0MjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNjkKICAgIC8vIHNlbGYuYXNzZXRfc3VzcGVuZGVkID0gc3VzcGVuZGVkCiAgICBieXRlYyAzMyAvLyAiYXNzZXRfc3VzcGVuZGVkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNzAKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kICAjIFRPRE86IFVwZGF0ZSBzcGVjcyBhbmQgYWRkIHRlc3QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9hcnJhbmdlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X2FycmFuZ2VyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4MwogICAgLy8gcmV0dXJuIHNlbGYuYXJyYW5nZXIudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOCAvLyAweDUyM2E0MTUyNTIyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYWRkcmVzc19yb2xlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg1CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwMwogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hY2NvdW50X21hbmFnZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjMgLy8gMHg1MjNhNGQ0ZTQ3MjMKICAgIGRpZyAxCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwNAogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5wcmltYXJ5X2RlYWxlciwgYWRkcmVzcyksCiAgICBieXRlYyAyMiAvLyAweDUyM2E1MDU5NDQyMwogICAgZGlnIDIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA1CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnRydXN0ZWUsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjYgLy8gMHg1MjNhNTQ1MjUzMjMKICAgIGRpZyAzCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwNgogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIGFkZHJlc3MpLAogICAgYnl0ZWMgMjEgLy8gMHg1MjNhNDE1NTU0MjMKICAgIGRpZyA0CiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwNwogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5vYnNlcnZlciwgYWRkcmVzcyksCiAgICBieXRlYyAyNSAvLyAweDUyM2E0ZDRmNDMyMwogICAgdW5jb3ZlciA1CiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlYyA0MCAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciA2CiAgICBzZXRiaXQKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDUKICAgIHNldGJpdAogICAgcHVzaGludCAyCiAgICB1bmNvdmVyIDQKICAgIHNldGJpdAogICAgcHVzaGludCAzCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgcHVzaGludCA0CiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOAogICAgLy8gcm9sZSA9IHJvbGVfaWQuYXNfdWludDY0KCkKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjkKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGUpCiAgICBkdXAKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzMxCiAgICAvLyBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKToKICAgIHB1c2hpbnRzIDIwIDQwIDUwIDYwIDcwIDgwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzMwLTM2MQogICAgLy8gbWF0Y2ggcm9sZToKICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKToKICAgIC8vICAgICAgICAgcmV0dXJuIHR5cC5Sb2xlVmFsaWRpdHkoCiAgICAvLyAgICAgICAgICAgICByb2xlX3ZhbGlkaXR5X3N0YXJ0PVVJbnQ2NCgwKSwgcm9sZV92YWxpZGl0eV9lbmQ9VUludDY0KDApCiAgICAvLyAgICAgICAgICkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSk6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSk6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgXzoKICAgIC8vICAgICAgICAgb3AuZXJyKGVyci5JTlZBTElEX1JPTEUpCiAgICB1bmNvdmVyIDYKICAgIG1hdGNoIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMEAyIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMUAzIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMkA0IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfM0A1IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNEA2IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzYxCiAgICAvLyBvcC5lcnIoZXJyLklOVkFMSURfUk9MRSkKICAgIGVyciAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV81QDc6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzU3CiAgICAvLyBzZWxmLm9ic2VydmVyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDI1IC8vIDB4NTIzYTRkNGY0MzIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzU2LTM1OAogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM1OQogICAgLy8gcmV0dXJuIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzRANjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTIKICAgIC8vIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDIxIC8vIDB4NTIzYTQxNTU1NDIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzUxLTM1MwogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTQKICAgIC8vIHJldHVybiBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzNANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNDcKICAgIC8vIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAyNiAvLyAweDUyM2E1NDUyNTMyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM0Ni0zNDgKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM0OQogICAgLy8gcmV0dXJuIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzJANDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNDIKICAgIC8vIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMjIgLy8gMHg1MjNhNTA1OTQ0MjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNDEtMzQzCiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzQ0CiAgICAvLyByZXR1cm4gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzFAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzcKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDIzIC8vIDB4NTIzYTRkNGU0NzIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzM2LTMzOAogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzkKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzBAMjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzItMzM0CiAgICAvLyByZXR1cm4gdHlwLlJvbGVWYWxpZGl0eSgKICAgIC8vICAgICByb2xlX3ZhbGlkaXR5X3N0YXJ0PVVJbnQ2NCgwKSwgcm9sZV92YWxpZGl0eV9lbmQ9VUludDY0KDApCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB2b2lkOgpfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZDoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNgogICAgLy8gZGVmIF9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHNlbGYsIGhvbGRpbmdfYWRkcmVzczogQWNjb3VudCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI4CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZCwgZXJyLlNVU1BFTkRFRAogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCAzODQKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIFN1c3BlbmRlZCBvcGVyYXRpb25zCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5fc2V0dGxlX3Bvc2l0aW9uKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NCwgdWludDY0Ogpfc2V0dGxlX3Bvc2l0aW9uOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjQ0CiAgICAvLyBkZWYgX3NldHRsZV9wb3NpdGlvbihzZWxmLCBob2xkaW5nX2FkZHJlc3M6IEFjY291bnQpIC0+IHR1cGxlW1VJbnQ2NCwgVUludDY0XToKICAgIHByb3RvIDEgMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjYxCiAgICAvLyBwb3NpdGlvbiA9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNvcHkoKQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo2My02NQogICAgLy8gIyBDb21wdXRlIHRoZSBpbmNyZW1lbnRhbCBwZXItdW5pdCBmaXhlZC1wb2ludCBpbnRlcmVzdCBhbmQgcHJpbmNpcGFsIGFjY3J1ZWQKICAgIC8vICMgc2luY2UgdGhpcyBhY2NvdW50J3MgbGFzdCBjaGVja3BvaW50LgogICAgLy8gaW50ZXJlc3RfZGVsdGEgPSBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggLSBwb3NpdGlvbi5pbnRlcmVzdF9jaGVja3BvaW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCBleGlzdHMKICAgIGRpZyAxCiAgICBwdXNoaW50IDU3CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjY3CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IC0gcG9zaXRpb24ucHJpbmNpcGFsX2NoZWNrcG9pbnQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggZXhpc3RzCiAgICBkaWcgMgogICAgcHVzaGludCA2NQogICAgZXh0cmFjdF91aW50NjQKICAgIC0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3MwogICAgLy8gaW50ZXJlc3RfZGVsdGEsIHBvc2l0aW9uLnVuaXRzLCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICBkaWcgMgogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjcwLTc0CiAgICAvLyAjIENvbnZlcnQgdGhlIHBlci11bml0IGZpeGVkLXBvaW50IGRlbHRhcyBpbnRvIGFic29sdXRlIGNsYWltYWJsZSBhbW91bnRzCiAgICAvLyAjIHVzaW5nIHRoZSBhY2NvdW50J3MgYWN0aXZlIHVuaXRzLgogICAgLy8gY2xhaW1hYmxlX2ludGVyZXN0ID0gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgaW50ZXJlc3RfZGVsdGEsIHBvc2l0aW9uLnVuaXRzLCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICAvLyApCiAgICB1bmNvdmVyIDMKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzYKICAgIC8vIHByaW5jaXBhbF9kZWx0YSwgcG9zaXRpb24udW5pdHMsIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3NS03NwogICAgLy8gY2xhaW1hYmxlX3ByaW5jaXBhbCA9IHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIHByaW5jaXBhbF9kZWx0YSwgcG9zaXRpb24udW5pdHMsIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUKICAgIC8vICkKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzktODEKICAgIC8vICMgQWNjcnVlIHRoZSBjbGFpbWFibGUgYW1vdW50cyB0byB0aGUgYWNjb3VudCBwb3NpdGlvbiBhbmQgbWFrZSB0aGVtIGF2YWlsYWJsZQogICAgLy8gIyBmb3Igd2l0aGRyYXdhbC4KICAgIC8vIHBvc2l0aW9uLmNsYWltYWJsZV9pbnRlcmVzdCArPSBjbGFpbWFibGVfaW50ZXJlc3QKICAgIGRpZyAyCiAgICBwdXNoaW50IDczCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDIKICAgICsKICAgIGl0b2IKICAgIHVuY292ZXIgMwogICAgc3dhcAogICAgcmVwbGFjZTIgNzMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo4MgogICAgLy8gcG9zaXRpb24uY2xhaW1hYmxlX3ByaW5jaXBhbCArPSBjbGFpbWFibGVfcHJpbmNpcGFsCiAgICBkdXAKICAgIHB1c2hpbnQgODEKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgKwogICAgaXRvYgogICAgcmVwbGFjZTIgODEKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo4NC04NgogICAgLy8gIyBBZHZhbmNlIHRoZSBhY2NvdW50J3MgcGVyLXVuaXQgZml4ZWQtcG9pbnQgY2hlY2twb2ludHMgdG8gdGhlIGN1cnJlbnQgZ2xvYmFsCiAgICAvLyAjIHBlci11bml0IGZpeGVkLXBvaW50IGdsb2JhbCBpbmRpY2VzLgogICAgLy8gcG9zaXRpb24uaW50ZXJlc3RfY2hlY2twb2ludCA9IHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggZXhpc3RzCiAgICBpdG9iCiAgICByZXBsYWNlMiA1NwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojg3CiAgICAvLyBwb3NpdGlvbi5wcmluY2lwYWxfY2hlY2twb2ludCA9IHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggZXhpc3RzCiAgICBpdG9iCiAgICByZXBsYWNlMiA2NQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojg5LTkwCiAgICAvLyAjIEFkdmFuY2UgdGhlIGFjY291bnQncyBldmVudCBjdXJzb3IgdG8gdGhlIGN1cnJlbnQgZ2xvYmFsIGV2ZW50IGN1cnNvci4KICAgIC8vIHBvc2l0aW9uLnNldHRsZWRfY3Vyc29yID0gc2VsZi5ldmVudF9jdXJzb3IKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaXRvYgogICAgcmVwbGFjZTIgNDkKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo5Mi05NAogICAgLy8gIyBVcGRhdGUgdGhlIGFjY291bnQgcG9zaXRpb24gYW5kIHJldHVybiB0aGUgbmV3bHkgYWNjcnVlZCBjbGFpbWFibGUgYW1vdW50cwogICAgLy8gIyBhZGRlZCB0byB0aGUgdG90YWwgcG9zaXRpb24ncyBjbGFpbWFibGUgYW1vdW50cy4KICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gcG9zaXRpb24uY29weSgpCiAgICB1bmNvdmVyIDMKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo5NQogICAgLy8gcmV0dXJuIGNsYWltYWJsZV9pbnRlcmVzdCwgY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQoaG9sZGluZ19hZGRyZXNzOiBieXRlcykgLT4gdm9pZDoKX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQ6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6OTcKICAgIC8vIGRlZiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZChzZWxmLCBob2xkaW5nX2FkZHJlc3M6IEFjY291bnQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzOAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTAwCiAgICAvLyBpZiBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKToKICAgIGJ6IF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwMQogICAgLy8gcmV0dXJuCiAgICByZXRzdWIKCl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDMKICAgIC8vIHBvc2l0aW9uID0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY29weSgpCiAgICBmcmFtZV9kaWcgMgogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA0CiAgICAvLyBpZiBwb3NpdGlvbi5yZXNlcnZlZF91bml0cyA9PSBVSW50NjQoMCk6CiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIGJueiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZF9hZnRlcl9pZl9lbHNlQDQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDUKICAgIC8vIHJldHVybgogICAgcmV0c3ViCgpfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZF9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA4CiAgICAvLyBwb3NpdGlvbi51bml0cyArPSBhY3RpdmF0ZWRfdW5pdHMKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDMKICAgICsKICAgIGl0b2IKICAgIHJlcGxhY2UyIDMyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA5CiAgICAvLyBwb3NpdGlvbi5yZXNlcnZlZF91bml0cyA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGl0b2IKICAgIHJlcGxhY2UyIDQwCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTEwCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHBvc2l0aW9uLmNvcHkoKQogICAgZnJhbWVfZGlnIDIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTEKICAgIC8vIGFzc2VydCBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID49IGFjdGl2YXRlZF91bml0cywgZXJyLk9WRVJfRElTVFJJQlVUSU9OCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIGV4aXN0cwogICAgZHVwCiAgICBkaWcgMgogICAgPj0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgcmVtYWluaW5nIEQtQVNBIHVuaXRzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTEyCiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIC09IGFjdGl2YXRlZF91bml0cwogICAgc3dhcAogICAgLQogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9zY2FsZWRfbXVsX2RpdihtdWx0aXBsaWNhbmQ6IHVpbnQ2NCwgbXVsdGlwbGllcjogdWludDY0LCBkaXZpc29yOiB1aW50NjQpIC0+IHVpbnQ2NDoKX3NjYWxlZF9tdWxfZGl2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTU2LTE1OAogICAgLy8gZGVmIF9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLCBtdWx0aXBsaWNhbmQ6IFVJbnQ2NCwgbXVsdGlwbGllcjogVUludDY0LCBkaXZpc29yOiBVSW50NjQKICAgIC8vICkgLT4gVUludDY0OgogICAgcHJvdG8gMyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjAKICAgIC8vIGlmIG11bHRpcGxpY2FuZCA9PSBVSW50NjQoMCkgb3IgbXVsdGlwbGllciA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTMKICAgIGJ6IF9zY2FsZWRfbXVsX2Rpdl9pZl9ib2R5QDIKICAgIGZyYW1lX2RpZyAtMgogICAgYm56IF9zY2FsZWRfbXVsX2Rpdl9hZnRlcl9pZl9lbHNlQDMKCl9zY2FsZWRfbXVsX2Rpdl9pZl9ib2R5QDI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjEKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9zY2FsZWRfbXVsX2Rpdl9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjIKICAgIC8vIGhpZ2gsIGxvdyA9IG9wLm11bHcobXVsdGlwbGljYW5kLCBtdWx0aXBsaWVyKQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIG11bHcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2MwogICAgLy8gcmV0dXJuIG9wLmRpdncoaGlnaCwgbG93LCBkaXZpc29yKQogICAgZnJhbWVfZGlnIC0xCiAgICBkaXZ3CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYW1vdW50X3RvX2luZGV4X2RlbHRhKGFtb3VudDogdWludDY0KSAtPiB1aW50NjQ6Cl9hbW91bnRfdG9faW5kZXhfZGVsdGE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjUKICAgIC8vIGRlZiBfYW1vdW50X3RvX2luZGV4X2RlbHRhKHNlbGYsIGFtb3VudDogVUludDY0KSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2NwogICAgLy8gaWYgYW1vdW50ID09IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMQogICAgYm56IF9hbW91bnRfdG9faW5kZXhfZGVsdGFfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjgKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9hbW91bnRfdG9faW5kZXhfZGVsdGFfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTY5CiAgICAvLyBhc3NlcnQgc2VsZi50b3RhbF91bml0cyA+IFVJbnQ2NCgwKSwgZXJyLk5PX1VOSVRTCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgZHVwCiAgICBhc3NlcnQgLy8gTm8gRC1BU0EgdW5pdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE3MAogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KGFtb3VudCwgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwgc2VsZi50b3RhbF91bml0cykKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2luZGV4X2RlbHRhX3RvX2Ftb3VudChpbmRleF9kZWx0YTogdWludDY0KSAtPiB1aW50NjQ6Cl9pbmRleF9kZWx0YV90b19hbW91bnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNzIKICAgIC8vIGRlZiBfaW5kZXhfZGVsdGFfdG9fYW1vdW50KHNlbGYsIGluZGV4X2RlbHRhOiBVSW50NjQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTc5CiAgICAvLyBpZiBpbmRleF9kZWx0YSA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGJueiBfaW5kZXhfZGVsdGFfdG9fYW1vdW50X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTgwCiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfaW5kZXhfZGVsdGFfdG9fYW1vdW50X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE4MgogICAgLy8gc2VsZi50b3RhbF91bml0cywKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxODQKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxODEtMTg1CiAgICAvLyByZXR1cm4gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgc2VsZi50b3RhbF91bml0cywKICAgIC8vICAgICBpbmRleF9kZWx0YSwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2dldF9zY2hlZHVsZV9lbnRyeShldmVudF9pZDogdWludDY0KSAtPiBieXRlczoKX2dldF9zY2hlZHVsZV9lbnRyeToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIwNQogICAgLy8gZGVmIF9nZXRfc2NoZWR1bGVfZW50cnkoc2VsZiwgZXZlbnRfaWQ6IFVJbnQ2NCkgLT4gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnk6CiAgICBwcm90byAxIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIwNwogICAgLy8gYXNzZXJ0IGV2ZW50X2lkIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgPgogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgaWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE5MwogICAgLy8gcmV0dXJuIGV2ZW50X2lkIC8vIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDE2CiAgICAvCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMDkKICAgIC8vIGFzc2VydCBwYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxOTcKICAgIC8vIHJldHVybiBldmVudF9pZCAlIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDE2CiAgICAlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMTIKICAgIC8vIGFzc2VydCBvZmZzZXQgPCBwYWdlLmxlbmd0aCwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBwdXNoaW50IDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgMQogICAgPgogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjEzCiAgICAvLyByZXR1cm4gcGFnZVtvZmZzZXRdLmNvcHkoKQogICAgcHVzaGludCA2NQogICAgKgogICAgcHVzaGludCAyCiAgICArCiAgICBwdXNoaW50IDY1CiAgICBib3hfZXh0cmFjdAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKGNvbnRyYWN0X3R5cGU6IHVpbnQ2NCwgZXZlbnRfdHlwZTogdWludDY0KSAtPiB2b2lkOgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTYtMzE4CiAgICAvLyBkZWYgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIHNlbGYsIGNvbnRyYWN0X3R5cGU6IFVJbnQ2NCwgZXZlbnRfdHlwZTogVUludDY0CiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1Ny0yNTgKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTAKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTctMjU4CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTEKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgaW50Y18yIC8vIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1Ny0yNTgKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1MgogICAgLy8gVUludDY0KGVudW1zLkVWVF9NRCksCiAgICBwdXNoaW50IDE5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTctMjU4CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTMKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgcHVzaGludCAxMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU3LTI1OAogICAgLy8gIyBDaGVjayBjb21tb24gZXZlbnRzIGZpcnN0CiAgICAvLyBpZiBldmVudF90eXBlIGluIGNvbW1vbl9ldmVudHM6CiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU0CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICBwdXNoaW50IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTctMjU4CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUA3CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU5CiAgICAvLyByZXR1cm4gVHJ1ZQogICAgaW50Y18xIC8vIDEKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzIwLTMyMgogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICByZXRzdWIKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNjEtMjYyCiAgICAvLyAjIENvbnRyYWN0LXNwZWNpZmljIGFkZGl0aW9uYWwgZXZlbnRzCiAgICAvLyBpZiBjb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9QQU0pOgogICAgZnJhbWVfZGlnIC0yCiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjYzLTI2NAogICAgLy8gIyBQQU0gb25seSBzdXBwb3J0cyBjb21tb24gZXZlbnRzCiAgICAvLyByZXR1cm4gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMjAtMzIyCiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNjYKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0xBTSkgb3IgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2Ni0yNjgKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0xBTSkgb3IgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoCiAgICAvLyAgICAgZW51bXMuQ1RfTkFNCiAgICAvLyApOgogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDExCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMgogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDE2CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUAxMToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2OS0yNzMKICAgIC8vICMgTEFNL05BTSBhZGQ6IFBSLCBJUENCCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjcxCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjY5LTI3MwogICAgLy8gIyBMQU0vTkFNIGFkZDogUFIsIElQQ0IKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDEzCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3MgogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIHB1c2hpbnQgMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2OS0yNzMKICAgIC8vICMgTEFNL05BTSBhZGQ6IFBSLCBJUENCCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICkKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF9mYWxzZUAxNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAxMzoKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMjAtMzIyCiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDE0OgogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMyMC0zMjIKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMTY6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzUKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTik6CiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMjMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3Ni0yODEKICAgIC8vICMgQU5OIGFkZHM6IFBSLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjc4CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjc2LTI4MQogICAgLy8gIyBBTk4gYWRkczogUFIsIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDIwCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIHB1c2hpbnQgMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3Ni0yODEKICAgIC8vICMgQU5OIGFkZHM6IFBSLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyMAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODAKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIHB1c2hpbnQgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjc2LTI4MQogICAgLy8gIyBBTk4gYWRkczogUFIsIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDIxCgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDIwOgogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMyMC0zMjIKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMjE6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzIwLTMyMgogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAyMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MwogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfTEFYKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA0CiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMzEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4NC0yOTAKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUiksCiAgICBwdXNoaW50IDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4NC0yOTAKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjgKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjg3CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjg0LTI5MAogICAgLy8gIyBMQVggYWRkczogUFIsIFBJLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyOAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODgKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICBwdXNoaW50IDE4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODQtMjkwCiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDI4CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODQtMjkwCiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDI5CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDI4OgogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMyMC0zMjIKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMjk6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzIwLTMyMgogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAzMToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI5MgogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQ0xNKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA1CiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMzMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI5My0yOTQKICAgIC8vICMgQ0xNIGFkZHM6IFBSCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1BSKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDMKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMjAtMzIyCiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDMzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk2CiAgICAvLyByZXR1cm4gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMjAtMzIyCiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5faXNfZHluYW1pY19hbm51aXR5KCkgLT4gdWludDY0OgpfaXNfZHluYW1pY19hbm51aXR5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM4CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzgtMzM5CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIC8vIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGJ6IF9pc19keW5hbWljX2FubnVpdHlfYm9vbF9mYWxzZUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzkKICAgIC8vIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzNCAvLyAiZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM4LTMzOQogICAgLy8gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICAvLyBhbmQgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBieiBfaXNfZHluYW1pY19hbm51aXR5X2Jvb2xfZmFsc2VAMwogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMzNy0zNDAKICAgIC8vIHJldHVybiAoCiAgICAvLyAgICAgc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICAvLyAgICAgYW5kIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgLy8gKQogICAgcmV0c3ViCgpfaXNfZHluYW1pY19hbm51aXR5X2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzctMzQwCiAgICAvLyByZXR1cm4gKAogICAgLy8gICAgIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKQogICAgLy8gICAgIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIC8vICkKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KGVudHJ5OiBieXRlcykgLT4gdWludDY0LCBieXRlczoKX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozODMKICAgIC8vIGRlZiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudChzZWxmLCBlbnRyeTogdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzkyCiAgICAvLyBlbnRyeS5hY2NydWFsX2ZhY3RvciA9PSBVSW50NjQoMCkKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAxNwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzkyLTM5NAogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGJ6IF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2lmX2JvZHlAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzkzCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzkyLTM5NAogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGJ6IF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2lmX2JvZHlAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzk0CiAgICAvLyBvciBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPT0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzkyLTM5NAogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGJueiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudF9hZnRlcl9pZl9lbHNlQDQKCl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2lmX2JvZHlAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NgogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2RpZyAtMQogICAgdW5jb3ZlciAyCiAgICByZXRzdWIKCl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5OAogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5OQogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQwMAogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5Ny00MDEKICAgIC8vIGFjY3J1ZWQgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICAvLyAgICAgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICkKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MDUKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MDItNDA2CiAgICAvLyByZXR1cm4gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgYWNjcnVlZCwKICAgIC8vICAgICBlbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICBmcmFtZV9kaWcgLTEKICAgIHVuY292ZXIgMgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yKGRpc2NvdW50X2ZhY3RvcjogdWludDY0LCByZWRlbXB0aW9uX2ZhY3RvcjogdWludDY0KSAtPiB1aW50NjQ6Cl9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ2NS00NjkKICAgIC8vIGRlZiBfZGlzY291bnRfYW5udWl0eV9mYWN0b3IoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBkaXNjb3VudF9mYWN0b3I6IFVJbnQ2NCwKICAgIC8vICAgICByZWRlbXB0aW9uX2ZhY3RvcjogVUludDY0LAogICAgLy8gKSAtPiBVSW50NjQ6CiAgICBwcm90byAyIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3MQogICAgLy8gaWYgcmVkZW1wdGlvbl9mYWN0b3IgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0xCiAgICBibnogX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDcyCiAgICAvLyByZXR1cm4gZGlzY291bnRfZmFjdG9yCiAgICBmcmFtZV9kaWcgLTIKICAgIHJldHN1YgoKX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3MwogICAgLy8gcGVyaW9kX3JhdGUgPSBzZWxmLmZpeGVkX3BvaW50X3NjYWxlICsgc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzQKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzMtNDc3CiAgICAvLyBwZXJpb2RfcmF0ZSA9IHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgKyBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICByZWRlbXB0aW9uX2ZhY3RvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICBkaWcgMgogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgICsKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3OAogICAgLy8gYXNzZXJ0IHBlcmlvZF9yYXRlID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGR1cAogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDgxCiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDc5LTQ4MwogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIGRpc2NvdW50X2ZhY3RvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gICAgIHBlcmlvZF9yYXRlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkoZW50cnk6IGJ5dGVzLCBwYXlsb2FkOiBieXRlcykgLT4gYnl0ZXMsIGJ5dGVzOgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MTYtNjE4CiAgICAvLyBkZWYgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5KAogICAgLy8gICAgIHNlbGYsIGVudHJ5OiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSwgcGF5bG9hZDogdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0CiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAyIDIKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjI2CiAgICAvLyBhc3NlcnQgZW50cnkuZXZlbnRfaWQgPT0gc2VsZi5ldmVudF9jdXJzb3IsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGN1cnNvcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjI3CiAgICAvLyBhc3NlcnQgZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsIGVyci5OT19EVUVfQ0FTSEZMT1cKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPD0KICAgIGFzc2VydCAvLyBObyBkdWUgY2FzaGZsb3cgdG8gcGF5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MjkKICAgIC8vIGV2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYzMAogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX0lFRCk6CiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGR1cAogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM4CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYzMS02MzMKICAgIC8vICMgSUVEIGZpbmFsaXplcyBpc3N1YW5jZTogcmVzZXJ2ZWQgdW5pdHMgYmVjb21lIGFjdGl2YXRhYmxlIGFuZCB0aGUKICAgIC8vICMgc2NoZWR1bGUncyBpbml0aWFsIGNvbnRyYWN0dWFsIHN0YXRlIGJlY29tZXMgbGl2ZS4KICAgIC8vIGFzc2VydCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzUKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPT0gc2VsZi50b3RhbF91bml0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM0LTYzNgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID09IHNlbGYudG90YWxfdW5pdHMKICAgIC8vICksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9JTkNPTVBMRVRFCiAgICBhc3NlcnQgLy8gUHJpbWFyeSBkaXN0cmlidXRpb24gaXMgbm90IGNvbXBsZXRlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzcKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM4CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzkKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAzMwogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NDAKICAgIC8vIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjQxCiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NDIKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0MwogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX0FDVElWRSkKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgMTAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDU0CiAgICAvLyBhc3NlcnQgZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSA9PSBVSW50NjQoZW51bXMuRVZUX0lFRCksIGVyci5OT1RfRVZUX0lFRAogICAgZnJhbWVfZGlnIDExCiAgICBhc3NlcnQgLy8gTm90IElFRCBldmVudAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDU1CiAgICAvLyByZXR1cm4gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0NC02NDgKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1zZWxmLl9lbnRyeV9pZWRfYW1vdW50KGVudHJ5KSwKICAgIC8vICAgICBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0NwogICAgLy8gc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0NC02NDgKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1zZWxmLl9lbnRyeV9pZWRfYW1vdW50KGVudHJ5KSwKICAgIC8vICAgICBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICAvLyApCiAgICBjYWxsc3ViIF9lbWl0X2V4ZWN1dGlvbl9ldmVudAogICAgZHVwCiAgICBmcmFtZV9idXJ5IC0yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NDkKICAgIC8vIHJldHVybgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM4CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE1MAogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1MgogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ICs9IHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBmcmFtZV9idXJ5IC0yCiAgICArCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1NAogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1JSKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCAxMgogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMTAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1OAogICAgLy8gcGF5bG9hZC5vYnNlcnZlZF9yYXRlLAogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjU5CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzNiAvLyAicmF0ZV9yZXNldF9tdWx0aXBsaWVyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2MAogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1NS02NjEKICAgIC8vICMgUlIgZGVyaXZlcyB0aGUgbmV4dCByYXRlIGZyb20gYW4gb2JzZXJ2ZWQgb3JhY2xlIHZhbHVlIHBsdXMgdGhlCiAgICAvLyAjIGNvbnRyYWN0IHNwcmVhZCAvIG11bHRpcGxpZXIgdGVybXMsIHRoZW4gZW5mb3JjZXMgZmxvb3IgYW5kIGNhcC4KICAgIC8vIG9ic2VydmVkX3JhdGUgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBwYXlsb2FkLm9ic2VydmVkX3JhdGUsCiAgICAvLyAgICAgc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICkKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjMKICAgIC8vIG9ic2VydmVkX3JhdGUgKyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzUgLy8gInJhdGVfcmVzZXRfc3ByZWFkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkIGV4aXN0cwogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDQKICAgIC8vIGlmIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgYW5kIHJhdGUgPCBzZWxmLnJhdGVfcmVzZXRfZmxvb3I6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzggLy8gImhhc19yYXRlX3Jlc2V0X2Zsb29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmhhc19yYXRlX3Jlc2V0X2Zsb29yIGV4aXN0cwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMSAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X2Zsb29yIGV4aXN0cwogICAgZnJhbWVfZGlnIDYKICAgID4KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDUKICAgIC8vIHJhdGUgPSBzZWxmLnJhdGVfcmVzZXRfZmxvb3IKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMSAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDYKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfZmxvb3IgZXhpc3RzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1NToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc0NgogICAgLy8gaWYgc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgYW5kIHJhdGUgPiBzZWxmLnJhdGVfcmVzZXRfY2FwOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDM5IC8vICJoYXNfcmF0ZV9yZXNldF9jYXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwIGV4aXN0cwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTgKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMiAvLyAicmF0ZV9yZXNldF9jYXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9jYXAgZXhpc3RzCiAgICBmcmFtZV9kaWcgNgogICAgPAogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc0NwogICAgLy8gcmF0ZSA9IHNlbGYucmF0ZV9yZXNldF9jYXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMiAvLyAicmF0ZV9yZXNldF9jYXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSA2CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X2NhcCBleGlzdHMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjYyCiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IHNlbGYuX2NsYW1wX3JhdGUoCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjItNjY0CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IHNlbGYuX2NsYW1wX3JhdGUoCiAgICAvLyAgICAgb2JzZXJ2ZWRfcmF0ZSArIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQKICAgIC8vICkKICAgIGZyYW1lX2RpZyA2CiAgICBhcHBfZ2xvYmFsX3B1dAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMTg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzQKICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QSSk6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMjAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY3NQogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzYKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDIzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjgxCiAgICAvLyBpZiBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKToKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAyOQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjgyCiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFJGKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCA1CiAgICA9PQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMzAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4NgogICAgLy8gKyAoc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCAtIHNlbGYuZXZlbnRfY3Vyc29yKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICAtCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODcKICAgIC8vICogVUludDY0KGNzdC5PUF9VUF9OT05fQ0FTSF9QRVJfRU5UUllfQlVER0VUKQogICAgcHVzaGludCAxMDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4Ni02ODcKICAgIC8vICsgKHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgLSBzZWxmLmV2ZW50X2N1cnNvcikKICAgIC8vICogVUludDY0KGNzdC5PUF9VUF9OT05fQ0FTSF9QRVJfRU5UUllfQlVER0VUKQogICAgKgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njg1CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX05PTl9DQVNIX0JBU0VfQlVER0VUKQogICAgaW50YyA0IC8vIDE1MDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4NS02ODcKICAgIC8vIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfQkFTRV9CVURHRVQpCiAgICAvLyArIChzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IC0gc2VsZi5ldmVudF9jdXJzb3IpCiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfUEVSX0VOVFJZX0JVREdFVCkKICAgICsKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4My02ODkKICAgIC8vIGVuc3VyZV9idWRnZXQoCiAgICAvLyAgICAgcmVxdWlyZWRfYnVkZ2V0PSgKICAgIC8vICAgICAgICAgVUludDY0KGNzdC5PUF9VUF9OT05fQ0FTSF9CQVNFX0JVREdFVCkKICAgIC8vICAgICAgICAgKyAoc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCAtIHNlbGYuZXZlbnRfY3Vyc29yKQogICAgLy8gICAgICAgICAqIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfUEVSX0VOVFJZX0JVREdFVCkKICAgIC8vICAgICApLAogICAgLy8gKQogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDkzCiAgICAvLyBkaXNjb3VudF9mYWN0b3IgPSBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5NAogICAgLy8gZGVub21pbmF0b3IgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5NQogICAgLy8gc2tpcF9maXJzdF9yZWRlbXB0aW9uID0gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5NwogICAgLy8gaWYgZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAyNQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgZnJhbWVfYnVyeSA4CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAzNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDk4LTUwMgogICAgLy8gIyBBbiBpbml0aWFsIFBSRiBtYXkgZGVzY3JpYmUgdGhlIGZpcnN0IHJlZGVtcHRpb24gcGVyaW9kIGRpcmVjdGx5LgogICAgLy8gZGlzY291bnRfZmFjdG9yID0gc2VsZi5fZGlzY291bnRfYW5udWl0eV9mYWN0b3IoCiAgICAvLyAgICAgZGlzY291bnRfZmFjdG9yLAogICAgLy8gICAgIGVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDgKICAgIGNhbGxzdWIgX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA0CiAgICAvLyBza2lwX2ZpcnN0X3JlZGVtcHRpb24gPSBUcnVlCiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfYnVyeSA3CiAgICBmcmFtZV9idXJ5IDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDM1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA2CiAgICAvLyBmdXR1cmVfZXZlbnRfaWQgPSBzZWxmLmV2ZW50X2N1cnNvciArIFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfd2hpbGVfdG9wQDM2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA3CiAgICAvLyB3aGlsZSBmdXR1cmVfZXZlbnRfaWQgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgZnJhbWVfZGlnIDMKICAgID4KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl93aGlsZUA0OAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA4CiAgICAvLyBmdXR1cmVfZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoZnV0dXJlX2V2ZW50X2lkKQogICAgZnJhbWVfZGlnIDMKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwOQogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPSBmdXR1cmVfZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTAtNTExCiAgICAvLyAjIE9ubHkgcmVkZW1wdGlvbi1iZWFyaW5nIGV2ZW50cyBjb250cmlidXRlIHRvIHRoZSBhbm51aXR5IGRlbm9taW5hdG9yLgogICAgLy8gaXNfcmVkZW1wdGlvbl9ldmVudCA9IGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpIG9yICgKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUxMC01MTQKICAgIC8vICMgT25seSByZWRlbXB0aW9uLWJlYXJpbmcgZXZlbnRzIGNvbnRyaWJ1dGUgdG8gdGhlIGFubnVpdHkgZGVub21pbmF0b3IuCiAgICAvLyBpc19yZWRlbXB0aW9uX2V2ZW50ID0gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QUikgb3IgKAogICAgLy8gICAgIGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfTUQpCiAgICAvLyAgICAgYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICAvLyApCiAgICBibnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfdHJ1ZUA0MAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTEyCiAgICAvLyBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgZnJhbWVfZGlnIDQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTItNTEzCiAgICAvLyBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgLy8gYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF9mYWxzZUA0MQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTEzCiAgICAvLyBhbmQgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IgPiBVSW50NjQoMCkKICAgIGZyYW1lX2RpZyAwCiAgICBwdXNoaW50IDI1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTEyLTUxMwogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCkKICAgIC8vIGFuZCBmdXR1cmVfZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX3RydWVANDA6CiAgICBpbnRjXzEgLy8gMQoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfbWVyZ2VANDI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTUKICAgIC8vIGlmIGlzX3JlZGVtcHRpb25fZXZlbnQ6CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA0NwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTE2CiAgICAvLyBpZiBza2lwX2ZpcnN0X3JlZGVtcHRpb246CiAgICBmcmFtZV9kaWcgNwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUA0NQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTE3CiAgICAvLyBza2lwX2ZpcnN0X3JlZGVtcHRpb24gPSBGYWxzZQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgNwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANDc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjQKICAgIC8vIGZ1dHVyZV9ldmVudF9pZCArPSBVSW50NjQoMSkKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV93aGlsZV90b3BAMzYKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlANDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjEKICAgIC8vIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZnJhbWVfZGlnIDAKICAgIHB1c2hpbnQgMjUKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTktNTIyCiAgICAvLyBkaXNjb3VudF9mYWN0b3IgPSBzZWxmLl9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcigKICAgIC8vICAgICBkaXNjb3VudF9mYWN0b3IsCiAgICAvLyAgICAgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMgogICAgc3dhcAogICAgY2FsbHN1YiBfZGlzY291bnRfYW5udWl0eV9mYWN0b3IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjMKICAgIC8vIGRlbm9taW5hdG9yICs9IGRpc2NvdW50X2ZhY3RvcgogICAgZnJhbWVfZGlnIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA0NwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDE6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF9tZXJnZUA0MgoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX3doaWxlQDQ4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTI2CiAgICAvLyBhc3NlcnQgZGVub21pbmF0b3IgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZnJhbWVfZGlnIDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUyNwogICAgLy8gbnVtZXJhdG9yID0gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTI4CiAgICAvLyBpZiBlbnRyeS5mbGFncyAmIFVJbnQ2NChlbnVtcy5GTEFHX0lOSVRJQUxfUFJGKSA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNTcKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gOAogICAgJgogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDUwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjktNTMwCiAgICAvLyAjIFN1YnNlcXVlbnQgUFJGIGV2ZW50cyBhbW9ydGl6ZSBib3RoIHByaW5jaXBhbCBhbmQgYWxyZWFkeSBhY2NydWVkIGNhcnJ5LgogICAgLy8gbnVtZXJhdG9yICs9IHNlbGYuYWNjcnVlZF9pbnRlcmVzdAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgICsKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDUwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTMzCiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTMxLTUzNQogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIG51bWVyYXRvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gICAgIGRlbm9taW5hdG9yLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDEKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OTAKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IHNlbGYuX3JlY2FsY3VsYXRlX2FubnVpdHlfcGF5bWVudCgKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjkwLTY5MgogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gc2VsZi5fcmVjYWxjdWxhdGVfYW5udWl0eV9wYXltZW50KAogICAgLy8gICAgIGVudHJ5CiAgICAvLyApCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMzA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OTUKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY5Ni03MDAKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1VSW50NjQoMCksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OTgKICAgIC8vIHBheW9mZj1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njk5CiAgICAvLyBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY5Ni03MDAKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1VSW50NjQoMCksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgY2FsbHN1YiBfZW1pdF9leGVjdXRpb25fZXZlbnQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDI5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njk0CiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDMwCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDIwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc3CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9JUENCKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCAxOAogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDIzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzgtNjc5CiAgICAvLyAjIElQQ0Iga2VlcHMgcHJpbmNpcGFsIHVuY2hhbmdlZCBhbmQgb25seSByZXNldHMgdGhlIGludGVyZXN0IGJhc2UuCiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIGIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMjMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMTA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjUKICAgIC8vIGVsaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1JSRik6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgMTEKICAgID09CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDE0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjYKICAgIC8vIG5leHRfcmF0ZSA9IGVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY3CiAgICAvLyBpZiBuZXh0X3JhdGUgPT0gVUludDY0KDApOgogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDEzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjgKICAgIC8vIG5leHRfcmF0ZSA9IHNlbGYucmF0ZV9yZXNldF9uZXh0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzcgLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDUKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfbmV4dCBleGlzdHMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY5CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IG5leHRfcmF0ZQogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgZnJhbWVfZGlnIDUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDE0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjcxCiAgICAvLyBpZiBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSAhPSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgOQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY3MgogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPSBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZQogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgZnJhbWVfZGlnIDkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KGVudHJ5OiBieXRlcywgcGF5b2ZmOiB1aW50NjQsIHNldHRsZWRfYW1vdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpfZW1pdF9leGVjdXRpb25fZXZlbnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MDYtNzEyCiAgICAvLyBkZWYgX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgKiwKICAgIC8vICAgICBlbnRyeTogdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnksCiAgICAvLyAgICAgcGF5b2ZmOiBVSW50NjQsCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ6IFVJbnQ2NCwKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDMgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE2CiAgICAvLyBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25JRAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE3CiAgICAvLyBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIGZyYW1lX2RpZyAtMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTgKICAgIC8vIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIGZyYW1lX2RpZyAtMwogICAgZXh0cmFjdCA4IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxOQogICAgLy8gc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICBmcmFtZV9kaWcgLTMKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MjAKICAgIC8vIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MjMKICAgIC8vIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIGZyYW1lX2RpZyAtMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE4CiAgICAvLyBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICBpbnRjXzIgLy8gOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIzCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBnZXRieXRlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NTIKICAgIC8vIGlmIHBheW9mZiA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJueiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NTMKICAgIC8vIHJldHVybiBVSW50NjQoZW51bXMuUEFZT0ZGX1NJR05fUE9TSVRJVkUpCiAgICBpbnRjXzEgLy8gMQoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX3BheW9mZl9zaWduQDc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MjItNzI0CiAgICAvLyBwYXlvZmZfc2lnbj1hcmM0LlVJbnQ4KAogICAgLy8gICAgIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIC8vICksCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgaW50Y18yIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MjYKICAgIC8vIGN1cnJlbmN5X2lkPXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzI3CiAgICAvLyBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTUtNzI4CiAgICAvLyBFeGVjdXRpb25FdmVudCgKICAgIC8vICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIC8vICAgICBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYXBwbGllZF9hdD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICBwYXlvZmY9cGF5b2ZmLAogICAgLy8gICAgIHBheW9mZl9zaWduPWFyYzQuVUludDgoCiAgICAvLyAgICAgICAgIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIC8vICAgICApLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PXNldHRsZWRfYW1vdW50LAogICAgLy8gICAgIGN1cnJlbmN5X2lkPXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAwCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE0LTcyOQogICAgLy8gYXJjNC5lbWl0KAogICAgLy8gICAgIEV4ZWN1dGlvbkV2ZW50KAogICAgLy8gICAgICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgICAgIHBheW9mZj1wYXlvZmYsCiAgICAvLyAgICAgICAgIHBheW9mZl9zaWduPWFyYzQuVUludDgoCiAgICAvLyAgICAgICAgICAgICBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICAvLyAgICAgICAgICksCiAgICAvLyAgICAgICAgIHNldHRsZWRfYW1vdW50PXNldHRsZWRfYW1vdW50LAogICAgLy8gICAgICAgICBjdXJyZW5jeV9pZD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgICAgIHNlcXVlbmNlPWVudHJ5LmV2ZW50X2lkICsgVUludDY0KDEpLAogICAgLy8gICAgICkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDlhMzMyYjk1IC8vIG1ldGhvZCAiRXhlY3V0aW9uRXZlbnQodWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc1NAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiAoVUludDY0KGVudW1zLkVWVF9JRUQpLCBVSW50NjQoZW51bXMuRVZUX1BJKSk6CiAgICBmcmFtZV9kaWcgNQogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBibnogX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2lmX2JvZHlANQogICAgZnJhbWVfZGlnIDUKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGJ6IF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pZl9lbHNlQDYKCl9lbWl0X2V4ZWN1dGlvbl9ldmVudF9pZl9ib2R5QDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NTUKICAgIC8vIHJldHVybiBVSW50NjQoZW51bXMuUEFZT0ZGX1NJR05fUE9TSVRJVkUpCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIzCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBiIF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9wYXlvZmZfc2lnbkA3CgpfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzU2CiAgICAvLyByZXR1cm4gVUludDY0KGVudW1zLlBBWU9GRl9TSUdOX05FR0FUSVZFKQogICAgcHVzaGludCAyNTUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcyMwogICAgLy8gc2VsZi5fcGF5b2ZmX3NpZ24oZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSwgcGF5b2ZmKQogICAgYiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fcGF5b2ZmX3NpZ25ANwoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9yb2xlX2lzX2FjdGl2ZShyb2xlX21hcDogYnl0ZXMsIHJvbGVfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NDoKX3JvbGVfaXNfYWN0aXZlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU3CiAgICAvLyBkZWYgX3JvbGVfaXNfYWN0aXZlKHNlbGYsIHJvbGVfbWFwOiB0eXAuUmJhY1JvbGUsIHJvbGVfYWRkcmVzczogQWNjb3VudCkgLT4gYm9vbDoKICAgIHByb3RvIDIgMQogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5CiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5LTYwCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5LTYxCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjEKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAtNjEKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgPj0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX21lcmdlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKSAtPiB2b2lkOgpfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2NQogICAgLy8gYXNzZXJ0IHNlbGYuX2lzX2FycmFuZ2VyKFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTIKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgPT0gc2VsZi5hcnJhbmdlci52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE4IC8vIDB4NTIzYTQxNTI1MjIzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJyYW5nZXIgZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjY1CiAgICAvLyBhc3NlcnQgc2VsZi5faXNfYXJyYW5nZXIoVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkgLT4gdm9pZDoKX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjgzCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYXNzZXRfZGVmYXVsdGVkLCBlcnIuREVGQVVMVEVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNDEgLy8gImFzc2V0X2RlZmF1bHRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9kZWZhdWx0ZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRGVmYXVsdGVkCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKSAtPiB2b2lkOgpfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODYKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5hc3NldF9zdXNwZW5kZWQsIGVyci5TVVNQRU5ERUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMyAvLyAiYXNzZXRfc3VzcGVuZGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X3N1c3BlbmRlZCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBTdXNwZW5kZWQgb3BlcmF0aW9ucwogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGVfaWQ6IHVpbnQ2NCkgLT4gdm9pZDoKX2Fzc2VydF92YWxpZF9yb2xlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg4CiAgICAvLyBkZWYgX2Fzc2VydF92YWxpZF9yb2xlKHNlbGYsIHJvbGVfaWQ6IFVJbnQ2NCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MAogICAgLy8gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgcHVzaGludCAyMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICBwdXNoaW50IDI1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MgogICAgLy8gVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIHB1c2hpbnQgNDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkzCiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICBwdXNoaW50IDUwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NAogICAgLy8gVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICBwdXNoaW50IDYwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NQogICAgLy8gVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIHB1c2hpbnQgNzAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojk2CiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICBwdXNoaW50IDgwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBieiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9mYWxzZUA4CgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDc6CiAgICBpbnRjXzEgLy8gMQoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfbWVyZ2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICByZXRzdWIKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX2ZhbHNlQDg6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9tZXJnZUA5Cg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" }, "byteCode": { - "approval": "DCAFAAEIINwLJjEEFR98dQZzdGF0dXMMZXZlbnRfY3Vyc29yFHNjaGVkdWxlX2VudHJ5X2NvdW50FW91dHN0YW5kaW5nX3ByaW5jaXBhbBFmaXhlZF9wb2ludF9zY2FsZRBhY2NydWVkX2ludGVyZXN0GWludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UCQSMVbm9taW5hbF9pbnRlcmVzdF9yYXRlDWNvbnRyYWN0X3R5cGUUcmVzZXJ2ZWRfdW5pdHNfdG90YWwScmVzZXJ2ZWRfcHJpbmNpcGFsC3RvdGFsX3VuaXRzGW5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24RcmVzZXJ2ZWRfaW50ZXJlc3QZY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleBpjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleAZSOkFSUiMTc2V0dGxlbWVudF9hc3NldF9pZBdpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudAZSOkFVVCMGUjpQWUQjBlI6TU5HIwJTIwZSOk1PQyMGUjpPUEQjFWluaXRpYWxfZXhjaGFuZ2VfZGF0ZRV0cmFuc2Zlcl9vcGVuaW5nX2RhdGUVdHJhbnNmZXJfY2xvc3VyZV9kYXRlEHJhdGVfcmVzZXRfZmxvb3IOcmF0ZV9yZXNldF9jYXAGUjpUUlMjD2Fzc2V0X3N1c3BlbmRlZBxkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uEXJhdGVfcmVzZXRfc3ByZWFkFXJhdGVfcmVzZXRfbXVsdGlwbGllcg9yYXRlX3Jlc2V0X25leHQUaGFzX3JhdGVfcmVzZXRfZmxvb3ISaGFzX3JhdGVfcmVzZXRfY2FwAQAPYXNzZXRfZGVmYXVsdGVkD3Byb3NwZWN0dXNfaGFzaA5wcm9zcGVjdHVzX3VybBVkZW5vbWluYXRpb25fYXNzZXRfaWQNbWF0dXJpdHlfZGF0ZRRkYXlfY291bnRfY29udmVudGlvbgMGgQECAAAxGEAArScSMgNnJxoyA2cnISJnJykiZykiZycKImcnKoAAZycrgABnJywiZycTImcnGyJnJy0iZyccImcnHSJnJy4iZycNImcnCyJnJxQiZycEImcnDiJnJyIiZycHImcnBiJnJwkiZycjImcnJCJnJx4iZycfImcnJSJnJyYiZycnImcnDCJnJw8iZycQImcnESJnKiJnKyJnJwUiZzE1gQQSRDE0gSUSRDE3FEQxNhREgASRTwTrNhoAjgEAxzEZFEQxGEEAsIIYBLRGGMgE54MlKQSUOIcjBGyF4+4EvdGpRAR8DxgSBBT8EO8EdKcpfwQJ1P4UBJqb+oUEhe7TPQSrLA/EBNnyJawEmINQWgSOpudMBAKvVXoEgvcbLQTvBPXTBN80NVAEPb6AvQQePkjnBAEMgpkEdAas0gQacqLuNhoAjhgAVgMhBH0EpwUxBiEGWwazBuYHFAkICh8KmAwEDPYNiQ3ODeYN/g6zD0kPaA9zD70AgASVbXFWNhoAjgEG8QAxGYEEEjEYEERCDa6KAgCL/oEKCIsAMgwNQQAqsYEGshCBBbIZJy+yHicvsh+L/40CAAsABLNC/9syALIBQv/1IrIBQv/viSKAAEcNNhoBSRUkEkQXIillRESIFZ6IFaWIFaoiKWVEgTISFESIEgFBAAtJgWQLIQQIIoj/jyJFBSJFDiJFDUsESwEMQQJZIiplRCIrZUQMQQJNIiplRIgQ00lFEYEJW0lFAzIHDUACN0sPJFVJRRAkEklFBEAAEEsOgQMSQAAISw6BExJBAj8jQQIUSw8iWyIqZUQSREsBMgcOREsCQAHtSw6BExJAAeUiRQtLDyRVSUUQgQMSQAFlSw6BExJAAV0iRQZLD4ExW0UIiBFbQAD+SwdFCUsKiBAZSwaIEBRLAYgQLklOAkUPSYgQJUlFC0sCSwEISUUJMgoiJxNlRHAARCInD2VEIicMZURLAQhLAksBD0RPAkwJTwIPRE8DCCcPTGciJwxlRAgnDExnIicQZURPAggnEExnIicRZUQIJxFMZ0sPJFWBAxJBAHoiJwZlREsQiBDnRRIIJwZMZ4gQx0EACksPJFWBExJBAAlLD4EpWycOTGcnBEsIZycHSwlnIiplRCMIKkxnSw9XCAGAAROoQQARIicEZURAAAkpgcgBZycHImdLD0sESYgTVEhLDUsMCEUOSwxLBwhFDUsEIwhFBUL+dycGImdC/5BLDyRVSUUQgQMSQQAQIicEZURLBglJRQlFCUL+6UsOJBJBABMiJwRlTEUJRCInB2VMRQpEQv7PSw6BExJAAAdLB0UJQv7AIkUIIkUJQv63iBAIQQBWSw6BExJBAAoiJwRlREUGQv6OIicGZURLEIgP/0USCElFCyInDmVED0EABiJFBkL+byInDmVESwoJSUUIIicEZUQNQQAKIicEZURFBkL+UUsGRQZC/kpLD4ExWyInBGVESg5ETAlFBkL+NiInBmVESxCID6dFEghFC0L+DEsESURLDklLD0lOAwgyB08CFk8DFlBPAhZQTwIWUEwWUChMULAjQyJC/b6AAEcCNhoBRwIVJRJENhoCSSJZgQIISwEVEkRXAgBMIillREQnCExQSb1FAUQiJxplRDIDE0EAIjEAIicaZUQSQAAVMQBLAxJAAA0xAEsBvkRXACASQQEAI0SIEpaIEpsiKWVEgTISFERLAkmIDUuIDM5GAkm+REmBSVtJTgJFCEmBUVtJRQhPAghJRQZEVwAgIicTZURwAEUBQQC3Sb5EgYADU0AArSNBAHgyCiInE2VETEsBcABESwVJTgIPREsCSU4DvkRJVwAgsTIATwOyEkyyFE8CshGBBLIQsgGzSYFJW0lOAkUJSYFRW0lOA0UJIhZMSwFcSUxcUU8DTL8iJw9lRElLAg9EIicMZURLAw9ETAknD0xnIicMZURMCScMTGdLBUlLBklOAwgyB08CFk8DFlBPAhZQTBZQSwJJFRZXBgJMUEyAAgAiUExQKExQsCNDIkL/UCJC/v02GgFJFSQSRBc2GgJJFSQSRBeIEXhKDEQnHE8CZycdTGcyBxYoTFCwI0M2GgFJFSUSRDYaAkkVJBJEF0lOAiIpZUREJxYxAIgRD0SIEUmIEU4iKWVEgTISRCcISwJQSU4DvUUBREyIC2pJRCInC2VECCInDWVEDkQiJxtlREEACTIHIicbZUQOREcCvkSBKFtLA0lOAwgWgShMuyInC2VECCcLSwFnIicNZURMCRYoTFCwI0MiSTYaAUkVJRJENhoCSRUlEkQ2GgNHAhUkEkQXIillRESIEL+IEMQiKWVEgTISFEQiJxxlREEACSInHGVEMgcORCInHWVEQQAJMgciJx1lRAxEMQBLBElOAhJEJwhLAVBJRQhJvUUBRCcISwVJTgJQSUUJvUUBREsCiAqjSYgKn08CE0RLAUlETL5EJVsORCIqZUQiK2VED0AADiIqZUSIC7CBCVsyBw1ESwNJiAr7SwNJTgKICvOICnZGAogKcUYCSwVJvkQlW0sCSU4CSwEOREsBCRZPAiVPArtLBUm+RCVbTwIIFiVMuyhLAlCwI0M2GgFJFSUSRDYaAkkVIxJEIlMnFTEAiA+cRCcITwJQSb1FAURJgTAjuiJPA1SBMEy7MgcWKExQsCNDNhoBSRUlEkQ2GgJJFSUSRCcXMQCID2REIillRIHIARIURIgPlIgPmScITwJQSb1FARREIhZPAksBUEsBUCcoUEsBUEsBUEsBUEsBUExQvzIHFihMULAjQzYaAUkVJRJENhoCSRUlEkQnCEsCUEm9RQFEMQBPAxJEiA8+iA9DIk8CuzIHFihMULAjQzYaAUkVJRJEJwhMUEm9RQFEvkgoTFCwI0M2GgFJFSUSRCcSTGcyBxYoTFCwI0OAAEk2GgFHAhWBaxJENhoCSU4CFYFIEkQ2GgNJTgJJFUsBJVlJgSISRE8CTEsCUklOAyJZgSQIEkSIDroiVUknCksBZ0EAIkkjEkAAHEmBAhJAABVJgQMSQAAOSYEEEkAAB0mBBRJBAYcjRCInCmVMRQJESwRJgSFbSUUIRIE5VUlFCEEAH0sGIxJAABhLBoECEkAAEEsGgQMSQAAISwaBBBJBAUcjREkjE0EACEsEgZIGUxREIillRBREIicUZUQUREsESSNbSXELRQFEJyxLAWdLAYEJW0lPAhJEJxNLAWexMgAyCiKyErIUTLIRgQSyELIBs0mBEVsnDUxnJwsiZycuSwhnSYEpWycbSwFnSwGBMVsnLUsBZ0sGSU4CgTBbJw5MZycUSwpnSwOBkgZTJyJMZ0sBgRBbJwRMZ0sBgShbJwZMZ0sBJVsnCUxnSwGBGFsnB0xnSwOBOlsnI0xnSwOBQlsnJExnSwOBSlsnHkxnSwOBUlsnH0xnSwOBWlsnJUxnSwOBkAZTJyZMZ0sDgZEGUycnTGdPA4FjWycFTGdLASRbKkxnSwGBOFsnEExnSwGBQFsnEUxnJw8iZycMImdLAjIHDURMIltLAgxEDERLAlcAICcqTGdLAVcCACcrTGcyBxYoTFCwI0MiQv62IkL+diKAAEcCNhoBSRUkEkQXSTYaAkkVIxJEIlNMNhoDSU4CSSJZSU4DSYFBC4ECCE8CFRJEiAzNIicKZUxOA0QiKWVEFERJgRAORCInFGVEREyBEAtMgWQLIQQIIoj2tiJJSwQMQQCLSwRXAgBJRQxLAUlOAoFBC4FBWEkkVUlOAkUNSSJbSUUNSwVPBAhLARJESwVPA4gIGUyBCVtJRQpEQQAXSUEAJUkjCYFBC0sLTIFBWIEJW0sIDkRLCEAABUsJIxJESSMIRQFC/5RLBklEIwkWJxhMUEm9RQFESSKBAroXSUQjCYFBC4ECCIFBukL/wUsGFicYTFBJvEhLBb9LBUEADEsBSwQIK0xnKYEyZzIHFihMULAjQyIpZUREiAvjiAvqiAvvIiplRCIrZURLAQ1EiAdHSVcIAUmAAQGoREsBVwAISwJXCQhLA1cRCEsEVxkISwVXIQhLBlcpCEsHVzEISwhXOQhPB08IUE8HUE8GUE8FUCIWUE8EUE8DUE8CUExQiAh5RgIyBxYoTFCwI0MiRwSAAEk2GgFJFSQSRBc2GgJHAhWBSRJEIillRESIC1uIC2CBQVtJgQQaQQCwIicKZUSBBRJEiAs4IicKZURJgQUSREsCSSJbSUUHIitlRBJESVcIAUUMJFWIBsIiK2VEgRAKJzBFBxYnGExQSUUJvUUBQQAHSwe+TEUHREsFSSJZSYEQDERLA0lXCQhLAVcRCEsCVxkISwNXKQhLBFcxCE8FVzkISwsWSxJQTwZQTwVQTwRQTwNQTwJQTFBLAxZQTwJMUEwjCBZXBgJcAEsISbxITL8iK2VEIwgrTGciKmVESwNJTwISRIgF/0lFCElXCAFFCiRVSUUGIxJAAChLBIEEEkAAIEsEgQwSQAAYSwSBCxJAABBLBIESEkAACEsEgQUSQQBBI0RLCIABAalESwSBDBJAAAhLBIELEkEAJCNBABonGTEAiAnzREsGSwKIBxtGAjIHFihMULAjQ4gKEUL/6CJC/9kiQv+8Ikk2GgFHAhWBQRJEIillRESICfKICfmICf4iKWVEgTISFEQiJwplRIEFEkRJIltJTgIiK2VETEsBEkRLAVcIAUlOA4ABA6hETIE5W0lOAiMaREEAEyIrZUQjCYgFIYEJW0sEgQlbDkQiK2VEgRAKJzBFBhYnGExQSUUHvUUBQQAHSwW+TEUGREsESSJZSYEQDERLBUlXCQhLAVcRCEsCVxkISwNXIQhLBFcpCE8FVzEISwoWSwpQTwZQTwVQTwRQTwNQTwJQTFBLAxZQTwJMUEwjCBZXBgJcAEsGSbxITL8iK2VEIwgrTGcyBxYoTFCwI0MiKWVESUQiJwplRBZJkyQORFcHASInDWVEIicLZUQiJxRlRCIqZUQiK2VEIicEZUQiJwdlRCInCWVEIicGZUQiJxBlRCInEWVEIicPZUQiJwxlRE8OFk8OTFBPDRZQTwwWUE8LFlBPChZQTwkWUE8IFlBPBxZQTwYWUE8FFlBPBBZQTwMWUE8CFlBMFlAoTFCwI0MiKWVERCIqZUQiK2VED0EAJSIqZUQWJyhQIhZMSwFQSwFQSwFQSwFQSwFQSwFQTFAoTFCwI0MiKmVEiAO9Qv/wiAg+I0M2GgFJFSUSRIgIMScSTGcyBxYoTFCwI0M2GgFJFSUSRIgIGScaTGcyBxYoTFCwI0M2GgFJFSMSRDYaAklOAhUlEkQ2GgNJTgIVgRASRIgH7IgH8xdHAogH/YEUEkEADicSSwNnMgcWKExQsCNDSYEoEkEAEScXSwNQSb1FARRESwK/Qv/fSYEyEkEAEScWSwNQSb1FARRESwK/Qv/HSYE8EkEAEScgSwNQSb1FARRESwK/Qv+vSYFGEkEAEScVSwNQSb1FARRESwK/Qv+XSYFQEkH/kCcZSwNQSb1FARRESwK/Qv9/NhoBSRUjEkQ2GgJJTgIVJRJEiAdCiAdJF0cCiAdTSYEUE0SBKBJBABUnF0sCUEm9RQFEvEgyBxYoTFCwI0NJgTISQQAPJxZLAlBJvUUBRLxIQv/hSYE8EkEADycgSwJQSb1FAUS8SEL/y0mBRhJBAA8nFUsCUEm9RQFEvEhC/7VJgVASQf+uJxlLAlBJvUUBRLxIQv+fNhoBSRUjEkQiUycVMQCIBnxEJyFMZzIHFihMULAjQyInEmVEKExQsCNDNhoBSRUlEkQnF0sBiAZUJxZLAogGTScgSwOIBkYnFUsEiAY/JxlPBYgGOCcoIk8GVCNPBVSBAk8EVIEDTwNUgQRPAlQoTFCwI0M2GgFJFSMSRDYaAklOAhUlEkQXSYgGUIMGFCgyPEZQTwaOBgBPAEAAMQAiABMAAQAnGUsBUEm9RQFEvkgoTFCwI0MnFUsBUEm9RQFEvkhC/+snIEsBUEm9RQFEvkhC/9wnFksBUEm9RQFEvkhC/80nF0sBUEm9RQFEvkhC/76AEAAAAAAAAAAAAAAAAAAAAABC/6mKAQAnCIv/UL5EgYADUxREiYoBAicIi/9QSb1FAURJvkgiJxBlREsBgTlbCSInEWVESwKBQVsJSwIlWyInBWVETwNLAk8CiACYIicFZURPA08DTwKIAIpLAoFJW0sCCBZPA0xcSUmBUVtLAggWXFEiJxBlRBZcOSInEWVEFlxBIiplRBZcMU8DTL+JigEAIoAAJwiL/1BJvUUBRCIpZUSBMhJBAAGJiwK+TElOAowARIEoW0mMAUAAAYmLAEklW4sBSU4DCBZcICIWXCiLAky/IicLZURJSwIPREwJJwtMZ4mKAwGL/UEABYv+QAACIomL/Yv+HYv/l4mKAQGL/0AAAiKJIicNZURJRCInBWVEi/9MTwKI/8qJigEBi/9AAAIiiSInDWVEIicFZUSL/0yI/6+JigEBIitlRIv/DUSL/4EQChYnGExQSb1FAUSL/4EQGEsBIoECuhdLAQ1EgUELgQIIgUG6iYoCAIv/IxJAAB+L/yQSQAAYi/+BExJAABCL/4EMEkAACIv/gQsSQQADI0SJi/5AAAQiQv/1i/6BAxJAAAiL/oECEkEAGIv/gQMSQAAIi/+BEhJBAAQjQv/RIkL/zYv+IxJBACCL/4EDEkAAEIv/gRISQAAIi/+BBRJBAAQjQv+qIkL/pov+gQQSQQAoi/+BAxJAABiL/4EEEkAAEIv/gRISQAAIi/+BBRJBAAQjQv96IkL/dov+gQUSQQAIi/+BAxJC/2YiQv9iIicKZUQjEkEACiInImVEQQACI4kiiYoBAov/gRFbSUEAECInCWVEQQAIIicHZURAAAYii/9PAokiJwdlRCInCWVEIicFZUSI/mgiJwVlRIsATIj+XYv/TwKJigIBi/9AAAOL/okiJwVlRCInCWVEi/9LAoj+PAhJRCInBWVEi/5MTwKI/iyJigICIoAARwiL/iJbIiplRBJEi/6BCVsyBw5Ei/4kVUkjEklBAF4iKWVEgTISRCInC2VEIicNZUQSRIv+gTFbJwRLAWcnB0xni/6BIVsnCUxnJwYiZ4v+gSlbJw5MZyIqZUQjCCpMZymBZGeLC0QiJxRlRIv+TCKIAdpJjP6L/4wBjACJIillRIEyEhREIicGZUSL/oj++Iz+CCcGTGeLCoEMEkEBeIv/gSFbIickZUQiJwVlRIj9cyInI2VECIwGIicmZURBABMiJx5lRIsGDUEACCInHmVMjAZEIicnZURBABMiJx9lRIsGDEEACCInH2VMjAZEJwmLBmeLCoEEEkEBB4v+gTFbJwRLAWcnB0xniP5lQQDniwqBBRJBAMUiK2VEIiplRAmBZAshBAgiiOvjIicFZUyMAkQijAEijAeL/oEZW0mMCEEAD4sCiwiI/oFJjAIjjAeMASIqZUQjCIwDIitlRIsDDUEAUosDiP0MSYwAJFVJjASBAxJAABCLBIETEkEAM4sAgRlbQQArI0EACIsHQQAMIowHiwMjCIwDQv++iwCBGVuLAkyI/iRJjAKLAQiMAUL/4SJC/9KLAUQiJwRlRIv+gTlbJBpAAAYiJwZlRAgiJwVlRIsBiPxLJw5MZyIqZUQjCCpMZ4v+IkmIAGBJjP6L/4wBjACJi/6BKVsnDkxnQv/aiwqBEhJB/v8iJwRlRCcHTGdC/vOLCoELEkEAG4v+gSFbSYwFQAAIIiclZUyMBUQnCYsFZ0L+uov+gSFbSYwJQf6vJwmLCWdC/qeKAwEyCIv9IluL/VcIAYv9VwkIMgeL/SRVi/5AAEUjFkmTJA5EVwcBIicTZUSLAUkjCIsAFk8CFlCLAlCLA1CLBBZQi/4WUE8DUIv/FlBPAhZQTBZQgASaMyuVTFCwi/2MAImLBSMSQAAIiwWBBBJBAAQjQv+pgf8BQv+jigIBgACL/ov/UEm9RQFBAB+LAb5EIlsyB0mMAA5BABCLAb5EJFuLAA9BAAQjjACJIkL/+TEAIicSZUQSRIkiJyllRBREiSInIWVEFESJigEAi/+BFBJAADCL/4EZEkAAKIv/gSgSQAAgi/+BMhJAABiL/4E8EkAAEIv/gUYSQAAIi/+BUBJBAAMjRIkiQv/6", + "approval": "DCAFAAEIINwLJjIEFR98dQZzdGF0dXMMZXZlbnRfY3Vyc29yFHNjaGVkdWxlX2VudHJ5X2NvdW50FW91dHN0YW5kaW5nX3ByaW5jaXBhbBFmaXhlZF9wb2ludF9zY2FsZRBhY2NydWVkX2ludGVyZXN0GWludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UCQSMVbm9taW5hbF9pbnRlcmVzdF9yYXRlDWNvbnRyYWN0X3R5cGUUcmVzZXJ2ZWRfdW5pdHNfdG90YWwScmVzZXJ2ZWRfcHJpbmNpcGFsC3RvdGFsX3VuaXRzGW5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24RcmVzZXJ2ZWRfaW50ZXJlc3QZY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleBpjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleAZSOkFSUiMTc2V0dGxlbWVudF9hc3NldF9pZBdpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudAZSOkFVVCMGUjpQWUQjBlI6TU5HIwJTIwZSOk1PQyMGUjpUUlMjBlI6T1BEIxVpbml0aWFsX2V4Y2hhbmdlX2RhdGUVdHJhbnNmZXJfb3BlbmluZ19kYXRlFXRyYW5zZmVyX2Nsb3N1cmVfZGF0ZRByYXRlX3Jlc2V0X2Zsb29yDnJhdGVfcmVzZXRfY2FwD2Fzc2V0X3N1c3BlbmRlZBxkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uEXJhdGVfcmVzZXRfc3ByZWFkFXJhdGVfcmVzZXRfbXVsdGlwbGllcg9yYXRlX3Jlc2V0X25leHQUaGFzX3JhdGVfcmVzZXRfZmxvb3ISaGFzX3JhdGVfcmVzZXRfY2FwAQAPYXNzZXRfZGVmYXVsdGVkD3Byb3NwZWN0dXNfaGFzaA5wcm9zcGVjdHVzX3VybBVkZW5vbWluYXRpb25fYXNzZXRfaWQNbWF0dXJpdHlfZGF0ZRRkYXlfY291bnRfY29udmVudGlvbglkZWZhdWx0ZWQDBoEBAgAAMRhAALEnEjIDZycbMgNnJyEiZycpImcpImcnCiJnJyqAAGcnK4AAZycsImcnEyJnJxwiZyctImcnHSJnJx4iZycuImcnDSJnJwsiZycUImcnBCJnJw4iZyciImcnByJnJwYiZycJImcnIyJnJyQiZycfImcnICJnJyUiZycmImcnJyJnJwwiZycPImcnECJnJxEiZyoiZysiZycvImcnBSJnMTWBBBJEMTSBJhJEMTcURDE2FESABJFPBOs2GgCOAQDOMRkURDEYQQC3ghkEtEYYyATngyUpBJQ4hyMEbIXj7gS90alEBHwPGBIEFPwQ7wR0pyl/BAnU/hQEmpv6hQSF7tM9BKssD8QE2fIlrASYg1BaBPtNRCgEjqbnTAQCr1V6BIL3Gy0E7wT10wTfNDVQBD2+gL0EHj5I5wQBDIKZBHQGrNIEGnKi7jYaAI4ZAFYDIQR9BKcFMQYhBlsGswbmBxQJCAofCpgMBAz2DRUNqA3tDgUOHQ7SD2gPhw+SD9wAgASVbXFWNhoAjgEG8QAxGYEEEjEYEERCDc2KAgCL/oEKCIsAMgwNQQAqsYEGshCBBbIZJzCyHicwsh+L/40CAAsABLNC/9syALIBQv/1IrIBQv/viSKAAEcNNhoBSRUkEkQXIillRESIFb2IFcSIFckiKWVEgTISFESIEiBBAAtJgWQLIQQIIoj/jyJFBSJFDiJFDUsESwEMQQJZIiplRCIrZUQMQQJNIiplRIgQ8klFEYEJW0lFAzIHDUACN0sPJFVJRRAkEklFBEAAEEsOgQMSQAAISw6BExJBAj8jQQIUSw8iWyIqZUQSREsBMgcOREsCQAHtSw6BExJAAeUiRQtLDyRVSUUQgQMSQAFlSw6BExJAAV0iRQZLD4ExW0UIiBF6QAD+SwdFCUsKiBA4SwaIEDNLAYgQTUlOAkUPSYgQRElFC0sCSwEISUUJMgoiJxNlRHAARCInD2VEIicMZURLAQhLAksBD0RPAkwJTwIPRE8DCCcPTGciJwxlRAgnDExnIicQZURPAggnEExnIicRZUQIJxFMZ0sPJFWBAxJBAHoiJwZlREsQiBEGRRIIJwZMZ4gQ5kEACksPJFWBExJBAAlLD4EpWycOTGcnBEsIZycHSwlnIiplRCMIKkxnSw9XCAGAAROoQQARIicEZURAAAkpgcgBZycHImdLD0sESYgTc0hLDUsMCEUOSwxLBwhFDUsEIwhFBUL+dycGImdC/5BLDyRVSUUQgQMSQQAQIicEZURLBglJRQlFCUL+6UsOJBJBABMiJwRlTEUJRCInB2VMRQpEQv7PSw6BExJAAAdLB0UJQv7AIkUIIkUJQv63iBAnQQBWSw6BExJBAAoiJwRlREUGQv6OIicGZURLEIgQHkUSCElFCyInDmVED0EABiJFBkL+byInDmVESwoJSUUIIicEZUQNQQAKIicEZURFBkL+UUsGRQZC/kpLD4ExWyInBGVESg5ETAlFBkL+NiInBmVESxCID8ZFEghFC0L+DEsESURLDklLD0lOAwgyB08CFk8DFlBPAhZQTwIWUEwWUChMULAjQyJC/b6AAEcCNhoBRwIVJRJENhoCSSJZgQIISwEVEkRXAgBMIillREQnCExQSb1FAUQiJxtlRDIDE0EAIjEAIicbZUQSQAAVMQBLAxJAAA0xAEsBvkRXACASQQEAI0SIErWIEroiKWVEgTISFERLAkmIDWqIDO1GAkm+REmBSVtJTgJFCEmBUVtJRQhPAghJRQZEVwAgIicTZURwAEUBQQC3Sb5EgYADU0AArSNBAHgyCiInE2VETEsBcABESwVJTgIPREsCSU4DvkRJVwAgsTIATwOyEkyyFE8CshGBBLIQsgGzSYFJW0lOAkUJSYFRW0lOA0UJIhZMSwFcSUxcUU8DTL8iJw9lRElLAg9EIicMZURLAw9ETAknD0xnIicMZURMCScMTGdLBUlLBklOAwgyB08CFk8DFlBPAhZQTBZQSwJJFRZXBgJMUEyAAgAiUExQKExQsCNDIkL/UCJC/v02GgFJFSQSRBc2GgJJFSQSRBeIEZdKDEQnHU8CZyceTGcyBxYoTFCwI0M2GgFJFSUSRDYaAkkVJBJEF0lOAiIpZUREJxYxAIgRLkSIEWiIEW0iKWVEgTISRCcISwJQSU4DvUUBREyIC4lJRCInC2VECCInDWVEDkQiJxxlREEACTIHIiccZUQOREcCvkSBKFtLA0lOAwgWgShMuyInC2VECCcLSwFnIicNZURMCRYoTFCwI0MiSTYaAUkVJRJENhoCSRUlEkQ2GgNHAhUkEkQXIillRESIEN6IEOMiKWVEgTISFEQiJx1lREEACSInHWVEMgcORCInHmVEQQAJMgciJx5lRAxEMQBLBElOAhJEJwhLAVBJRQhJvUUBRCcISwVJTgJQSUUJvUUBREsCiArCSYgKvk8CE0RLAUlETL5EJVsORCIqZUQiK2VED0AADiIqZUSIC8+BCVsyBw1ESwNJiAsaSwNJTgKICxKICpVGAogKkEYCSwVJvkQlW0sCSU4CSwEOREsBCRZPAiVPArtLBUm+RCVbTwIIFiVMuyhLAlCwI0M2GgFJFSUSRDYaAkkVIxJEIlMnFTEAiA+7RCcITwJQSb1FAURJgTAjuiJPA1SBMEy7MgcWKExQsCNDNhoBSRUlEkQ2GgJJFSUSRCcXMQCID4NEIillRIHIARIURIgPs4gPuCcITwJQSb1FARREIhZPAksBUEsBUCcoUEsBUEsBUEsBUEsBUExQvzIHFihMULAjQzYaAUkVJRJENhoCSRUlEkQnCEsCUEm9RQFEMQBPAxJEiA9diA9iIk8CuzIHFihMULAjQzYaAUkVJRJEJwhMUEm9RQFEvkgoTFCwI0M2GgFJFSUSRCcSTGcyBxYoTFCwI0OAAEk2GgFHAhWBaxJENhoCSU4CFYFIEkQ2GgNJTgJJFUsBJVlJgSISRE8CTEsCUklOAyJZgSQIEkSIDtkiVUknCksBZ0EAIkkjEkAAHEmBAhJAABVJgQMSQAAOSYEEEkAAB0mBBRJBAYcjRCInCmVMRQJESwRJgSFbSUUIRIE5VUlFCEEAH0sGIxJAABhLBoECEkAAEEsGgQMSQAAISwaBBBJBAUcjREkjE0EACEsEgZIGUxREIillRBREIicUZUQUREsESSNbSXELRQFEJyxLAWdLAYEJW0lPAhJEJxNLAWexMgAyCiKyErIUTLIRgQSyELIBs0mBEVsnDUxnJwsiZycuSwhnSYEpWyccSwFnSwGBMVsnLUsBZ0sGSU4CgTBbJw5MZycUSwpnSwOBkgZTJyJMZ0sBgRBbJwRMZ0sBgShbJwZMZ0sBJVsnCUxnSwGBGFsnB0xnSwOBOlsnI0xnSwOBQlsnJExnSwOBSlsnH0xnSwOBUlsnIExnSwOBWlsnJUxnSwOBkAZTJyZMZ0sDgZEGUycnTGdPA4FjWycFTGdLASRbKkxnSwGBOFsnEExnSwGBQFsnEUxnJw8iZycMImdLAjIHDURMIltLAgxEDERLAlcAICcqTGdLAVcCACcrTGcyBxYoTFCwI0MiQv62IkL+diKAAEcCNhoBSRUkEkQXSTYaAkkVIxJEIlNMNhoDSU4CSSJZSU4DSYFBC4ECCE8CFRJEiAzsIicKZUxOA0QiKWVEFERJgRAORCInFGVEREyBEAtMgWQLIQQIIoj2tiJJSwQMQQCLSwRXAgBJRQxLAUlOAoFBC4FBWEkkVUlOAkUNSSJbSUUNSwVPBAhLARJESwVPA4gIOEyBCVtJRQpEQQAXSUEAJUkjCYFBC0sLTIFBWIEJW0sIDkRLCEAABUsJIxJESSMIRQFC/5RLBklEIwkWJxhMUEm9RQFESSKBAroXSUQjCYFBC4ECCIFBukL/wUsGFicYTFBJvEhLBb9LBUEADEsBSwQIK0xnKYEyZzIHFihMULAjQyIpZUREiAwCiAwJiAwOIiplRCIrZURLAQ1EiAdmSVcIAUmAAQGoREsBVwAISwJXCQhLA1cRCEsEVxkISwVXIQhLBlcpCEsHVzEISwhXOQhPB08IUE8HUE8GUE8FUCIWUE8EUE8DUE8CUExQiAiYRgIyBxYoTFCwI0MiRwSAAEk2GgFJFSQSRBc2GgJHAhWBSRJEIillRESIC3qIC3+BQVtJgQQaQQCwIicKZUSBBRJEiAtXIicKZURJgQUSREsCSSJbSUUHIitlRBJESVcIAUUMJFWIBuEiK2VEgRAKJzFFBxYnGExQSUUJvUUBQQAHSwe+TEUHREsFSSJZSYEQDERLA0lXCQhLAVcRCEsCVxkISwNXKQhLBFcxCE8FVzkISwsWSxJQTwZQTwVQTwRQTwNQTwJQTFBLAxZQTwJMUEwjCBZXBgJcAEsISbxITL8iK2VEIwgrTGciKmVESwNJTwISRIgGHklFCElXCAFFCiRVSUUGIxJAAChLBIEEEkAAIEsEgQwSQAAYSwSBCxJAABBLBIESEkAACEsEgQUSQQBBI0RLCIABAalESwSBDBJAAAhLBIELEkEAJCNBABonGTEAiAoSREsGSwKIBzpGAjIHFihMULAjQ4gKMEL/6CJC/9kiQv+8Ikk2GgFHAhWBQRJEIillRESIChGIChiICh0iKWVEgTISFEQiJwplRIEFEkRJIltJTgIiK2VETEsBEkRLAVcIAUlOA4ABA6hETIE5W0lOAiMaREEAEyIrZUQjCYgFQIEJW0sEgQlbDkQiK2VEgRAKJzFFBhYnGExQSUUHvUUBQQAHSwW+TEUGREsESSJZSYEQDERLBUlXCQhLAVcRCEsCVxkISwNXIQhLBFcpCE8FVzEISwoWSwpQTwZQTwVQTwRQTwNQTwJQTFBLAxZQTwJMUEwjCBZXBgJcAEsGSbxITL8iK2VEIwgrTGcyBxYoTFCwI0M2GgFJFSMSRCJTJxoxAIgI7kQnL0xnMgcWKExQsCNDIillRElEIicKZUQWSZMkDkRXBwEiJw1lRCInC2VEIicUZUQiKmVEIitlRCInBGVEIicHZUQiJwllRCInBmVEIicQZUQiJxFlRCInD2VEIicMZURPDhZPDkxQTw0WUE8MFlBPCxZQTwoWUE8JFlBPCBZQTwcWUE8GFlBPBRZQTwQWUE8DFlBPAhZQTBZQKExQsCNDIillREQiKmVEIitlRA9BACUiKmVEFicoUCIWTEsBUEsBUEsBUEsBUEsBUEsBUExQKExQsCNDIiplRIgDvUL/8IgIPiNDNhoBSRUlEkSICDEnEkxnMgcWKExQsCNDNhoBSRUlEkSICBknG0xnMgcWKExQsCNDNhoBSRUjEkQ2GgJJTgIVJRJENhoDSU4CFYEQEkSIB+yIB/MXRwKIB/2BFBJBAA4nEksDZzIHFihMULAjQ0mBKBJBABEnF0sDUEm9RQEUREsCv0L/30mBMhJBABEnFksDUEm9RQEUREsCv0L/x0mBPBJBABEnGksDUEm9RQEUREsCv0L/r0mBRhJBABEnFUsDUEm9RQEUREsCv0L/l0mBUBJB/5AnGUsDUEm9RQEUREsCv0L/fzYaAUkVIxJENhoCSU4CFSUSRIgHQogHSRdHAogHU0mBFBNEgSgSQQAVJxdLAlBJvUUBRLxIMgcWKExQsCNDSYEyEkEADycWSwJQSb1FAUS8SEL/4UmBPBJBAA8nGksCUEm9RQFEvEhC/8tJgUYSQQAPJxVLAlBJvUUBRLxIQv+1SYFQEkH/ricZSwJQSb1FAUS8SEL/nzYaAUkVIxJEIlMnFTEAiAZ8RCchTGcyBxYoTFCwI0MiJxJlRChMULAjQzYaAUkVJRJEJxdLAYgGVCcWSwKIBk0nGksDiAZGJxVLBIgGPycZTwWIBjgnKCJPBlQjTwVUgQJPBFSBA08DVIEETwJUKExQsCNDNhoBSRUjEkQ2GgJJTgIVJRJEF0mIBlCDBhQoMjxGUE8GjgYATwBAADEAIgATAAEAJxlLAVBJvUUBRL5IKExQsCNDJxVLAVBJvUUBRL5IQv/rJxpLAVBJvUUBRL5IQv/cJxZLAVBJvUUBRL5IQv/NJxdLAVBJvUUBRL5IQv++gBAAAAAAAAAAAAAAAAAAAAAAQv+pigEAJwiL/1C+RIGAA1MURImKAQInCIv/UEm9RQFESb5IIicQZURLAYE5WwkiJxFlREsCgUFbCUsCJVsiJwVlRE8DSwJPAogAmCInBWVETwNPA08CiACKSwKBSVtLAggWTwNMXElJgVFbSwIIFlxRIicQZUQWXDkiJxFlRBZcQSIqZUQWXDFPA0y/iYoBACKAACcIi/9QSb1FAUQiKWVEgTISQQABiYsCvkxJTgKMAESBKFtJjAFAAAGJiwBJJVuLAUlOAwgWXCAiFlwoiwJMvyInC2VESUsCD0RMCScLTGeJigMBi/1BAAWL/kAAAiKJi/2L/h2L/5eJigEBi/9AAAIiiSInDWVESUQiJwVlRIv/TE8CiP/KiYoBAYv/QAACIokiJw1lRCInBWVEi/9MiP+viYoBASIrZUSL/w1Ei/+BEAoWJxhMUEm9RQFEi/+BEBhLASKBAroXSwENRIFBC4ECCIFBuomKAgCL/yMSQAAfi/8kEkAAGIv/gRMSQAAQi/+BDBJAAAiL/4ELEkEAAyNEiYv+QAAEIkL/9Yv+gQMSQAAIi/6BAhJBABiL/4EDEkAACIv/gRISQQAEI0L/0SJC/82L/iMSQQAgi/+BAxJAABCL/4ESEkAACIv/gQUSQQAEI0L/qiJC/6aL/oEEEkEAKIv/gQMSQAAYi/+BBBJAABCL/4ESEkAACIv/gQUSQQAEI0L/eiJC/3aL/oEFEkEACIv/gQMSQv9mIkL/YiInCmVEIxJBAAoiJyJlREEAAiOJIomKAQKL/4ERW0lBABAiJwllREEACCInB2VEQAAGIov/TwKJIicHZUQiJwllRCInBWVEiP5oIicFZUSLAEyI/l2L/08CiYoCAYv/QAADi/6JIicFZUQiJwllRIv/SwKI/jwISUQiJwVlRIv+TE8CiP4siYoCAiKAAEcIi/4iWyIqZUQSRIv+gQlbMgcORIv+JFVJIxJJQQBeIillRIEyEkQiJwtlRCInDWVEEkSL/oExWycESwFnJwdMZ4v+gSFbJwlMZycGImeL/oEpWycOTGciKmVEIwgqTGcpgWRniwtEIicUZUSL/kwiiAHaSYz+i/+MAYwAiSIpZUSBMhIURCInBmVEi/6I/viM/ggnBkxniwqBDBJBAXiL/4EhWyInJGVEIicFZUSI/XMiJyNlRAiMBiInJmVEQQATIicfZUSLBg1BAAgiJx9lTIwGRCInJ2VEQQATIicgZUSLBgxBAAgiJyBlTIwGRCcJiwZniwqBBBJBAQeL/oExWycESwFnJwdMZ4j+ZUEA54sKgQUSQQDFIitlRCIqZUQJgWQLIQQIIojrxCInBWVMjAJEIowBIowHi/6BGVtJjAhBAA+LAosIiP6BSYwCI4wHjAEiKmVEIwiMAyIrZUSLAw1BAFKLA4j9DEmMACRVSYwEgQMSQAAQiwSBExJBADOLAIEZW0EAKyNBAAiLB0EADCKMB4sDIwiMA0L/vosAgRlbiwJMiP4kSYwCiwEIjAFC/+EiQv/SiwFEIicEZUSL/oE5WyQaQAAGIicGZUQIIicFZUSLAYj8SycOTGciKmVEIwgqTGeL/iJJiABgSYz+i/+MAYwAiYv+gSlbJw5MZ0L/2osKgRISQf7/IicEZUQnB0xnQv7ziwqBCxJBABuL/oEhW0mMBUAACCInJWVMjAVEJwmLBWdC/rqL/oEhW0mMCUH+rycJiwlnQv6nigMBMgiL/SJbi/1XCAGL/VcJCDIHi/0kVYv+QABFIxZJkyQORFcHASInE2VEiwFJIwiLABZPAhZQiwJQiwNQiwQWUIv+FlBPA1CL/xZQTwIWUEwWUIAEmjMrlUxQsIv9jACJiwUjEkAACIsFgQQSQQAEI0L/qYH/AUL/o4oCAYAAi/6L/1BJvUUBQQAfiwG+RCJbMgdJjAAOQQAQiwG+RCRbiwAPQQAEI4wAiSJC//kxACInEmVEEkSJIicpZUQURIkiJyFlRBREiYoBAIv/gRQSQAAwi/+BGRJAACiL/4EoEkAAIIv/gTISQAAYi/+BPBJAABCL/4FGEkAACIv/gVASQQADI0SJIkL/+g==", "clear": "DIEBQw==" }, "compilerInfo": { diff --git a/src/artifacts/dasa_client.py b/src/artifacts/dasa_client.py index 2b4f38d6..58837ffe 100644 --- a/src/artifacts/dasa_client.py +++ b/src/artifacts/dasa_client.py @@ -19,7 +19,7 @@ import algokit_utils from algokit_utils import AlgorandClient as _AlgoKitAlgorandClient -_APP_SPEC_JSON = r"""{"arcs": [22, 28], "bareActions": {"call": [], "create": []}, "methods": [{"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "desc": "Maximum number of due cash events to process in this call.", "name": "max_event_count"}], "name": "fund_due_cashflows", "returns": {"type": "(uint64,uint64,uint64,uint64,uint64)", "desc": "Funding result with reserved interest, reserved principal, and event count.", "struct": "CashFundingResult"}, "desc": "Reserve due ACTUS cash events into the escrow-style claim ledger.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Holder whose position should be settled and claimed.", "name": "holding_address"}, {"type": "byte[]", "desc": "Opaque settlement context returned in the result.", "name": "payment_info"}], "name": "claim_due_cashflows", "returns": {"type": "(uint64,uint64,uint64,uint64,byte[])", "desc": "Claim result with realized interest, principal, and passthrough context.", "struct": "CashClaimResult"}, "desc": "Withdraw the holder's already funded ACTUS cash entitlements.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "desc": "Inclusive UNIX timestamp at which transfers may start.", "name": "open_date"}, {"type": "uint64", "desc": "Exclusive UNIX timestamp at which transfers stop.", "name": "closure_date"}], "name": "transfer_set_schedule", "returns": {"type": "uint64", "desc": "UNIX timestamp of the schedule update."}, "desc": "Configure the secondary-market transfer window.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account receiving the reserved units.", "name": "holding_address"}, {"type": "uint64", "desc": "Number of units to reserve.", "name": "units"}], "name": "primary_distribution", "returns": {"type": "uint64", "desc": "Remaining undistributed unit balance."}, "desc": "Reserve units for a holder before the initial exchange activates issuance.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account debited for the transfer.", "name": "sender_holding_address"}, {"type": "address", "desc": "Account credited for the transfer.", "name": "receiver_holding_address"}, {"type": "uint64", "desc": "Number of active units to move.", "name": "units"}], "name": "transfer", "returns": {"type": "uint64", "desc": "Number of units transferred."}, "desc": "Transfer active units after settling both counterparties to the current cursor.\nReturns the number of units moved. The ACTUS kernel no longer persists a nominal per-unit value on-chain, so transfer results are unit-based.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account holding address.", "name": "holding_address"}, {"type": "bool", "desc": "Suspension status to apply.", "name": "suspended"}], "name": "account_suspension", "returns": {"type": "uint64", "desc": "UNIX timestamp of the suspension update."}, "desc": "Set the suspension status of one account.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account holding address.", "name": "holding_address"}, {"type": "address", "desc": "Account payment address.", "name": "payment_address"}], "name": "account_open", "returns": {"type": "uint64", "desc": "UNIX timestamp of the account opening."}, "desc": "Open a contract account with a new position and register its payment address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account holding address.", "name": "holding_address"}, {"type": "address", "desc": "New account payment address.", "name": "payment_address"}], "name": "account_update_payment_address", "returns": {"type": "uint64", "desc": "UNIX timestamp of the account update."}, "desc": "Update the payment address of an account.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account holding address.", "name": "holding_address"}], "name": "account_get_position", "returns": {"type": "(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64)", "desc": "Account position record.", "struct": "AccountPosition"}, "desc": "Get the full accounting position for one holder.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": [], "create": ["NoOp"]}, "args": [{"type": "address", "desc": "D-ASA arranger address.", "name": "arranger"}], "name": "contract_create", "returns": {"type": "uint64", "desc": "UNIX timestamp of contract creation."}, "desc": "Create a new D-ASA contract and set the arranger role.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64)", "desc": "Normalized ACTUS terms.", "name": "terms", "struct": "NormalizedActusTerms"}, {"type": "(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "desc": "Initial kernel state captured before `IED`.", "name": "initial_state", "struct": "InitialKernelState"}, {"type": "(byte[32],string)", "desc": "Prospectus metadata stored for reference only.", "name": "prospectus", "struct": "Prospectus"}], "name": "contract_config", "returns": {"type": "uint64", "desc": "UNIX timestamp of contract configuration."}, "desc": "Partial contract configuration with: normalized ACTUS terms, initial kernel\nstate (pre-IED), prospectus (informational only). The contract stays inactive until all schedule pages are configured next.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "desc": "Zero-based page index within the boxed schedule.", "name": "schedule_page_index"}, {"type": "bool", "desc": "Whether this page finalizes the schedule upload.", "name": "is_last_page"}, {"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[]", "desc": "Normalized schedule entries for the requested page.", "name": "schedule_page"}], "name": "contract_schedule", "returns": {"type": "uint64", "desc": "UNIX timestamp of the schedule upload."}, "desc": "Upload one normalized schedule page.\nThe configuration operation is considered complete only when the last page is stored. At that point `schedule_entry_count` is finalized and the contract moves to `STATUS_PENDING_IED`.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "contract_execute_ied", "returns": {"type": "uint64", "desc": "UNIX timestamp of the `IED` execution."}, "desc": "Execute the first due `IED` entry and activate the contract.\n`IED` is the one non-cash event that moves the app from `STATUS_PENDING_IED` to `STATUS_ACTIVE`.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "desc": "Expected global schedule event identifier at the current cursor.", "name": "event_id"}, {"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "desc": "Observed payload used for append-on-execute and/or rate resets.", "name": "payload", "struct": "ObservedEventRequest"}], "name": "apply_non_cash_event", "returns": {"type": "uint64", "desc": "UNIX timestamp of the non-cash event application."}, "desc": "Apply the next due non-cash event, optionally appending one first.\nObserved payloads are appended before execution when flagged. Rate reset events require the interest oracle because they can change the running nominal rate; other non-cash events stay arranger-controlled.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "desc": "Observed cash-event payload to append after the current tail.", "name": "payload", "struct": "ObservedCashEventRequest"}], "name": "append_observed_cash_event", "returns": {"type": "uint64", "desc": "UNIX timestamp of the append operation."}, "desc": "Append an arranger-authorized observed cash event to the schedule tail.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "contract_get_state", "returns": {"type": "(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "desc": "Current kernel state snapshot.", "struct": "KernelState"}, "desc": "Return a readonly snapshot of the generic ACTUS kernel state.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "contract_get_next_due_event", "returns": {"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "desc": "Next due schedule entry, or an all-zero sentinel if the contract ended.", "struct": "ExecutionScheduleEntry"}, "desc": "Return the next boxed schedule entry, or a zeroed sentinel if ended.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["UpdateApplication"], "create": []}, "args": [], "name": "contract_update", "returns": {"type": "void", "desc": "None."}, "desc": "Update D-ASA application.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "New arranger address.", "name": "new_arranger"}], "name": "rbac_rotate_arranger", "returns": {"type": "uint64", "desc": "UNIX timestamp of the role assignment."}, "desc": "Rotate the arranger address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Operation daemon address.", "name": "address"}], "name": "rbac_set_op_daemon", "returns": {"type": "uint64", "desc": "UNIX timestamp of the role assignment."}, "desc": "Non-normative helper to set the operation daemon address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role identifier.", "name": "role_id"}, {"type": "address", "desc": "Account role address.", "name": "role_address"}, {"type": "(uint64,uint64)", "desc": "Inclusive validity interval for the assignment.", "name": "validity", "struct": "RoleValidity"}], "name": "rbac_assign_role", "returns": {"type": "uint64", "desc": "UNIX timestamp of the role assignment."}, "desc": "Assign a role to an address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role identifier.", "name": "role_id"}, {"type": "address", "desc": "Account role address.", "name": "role_address"}], "name": "rbac_revoke_role", "returns": {"type": "uint64", "desc": "UNIX timestamp of the role revocation."}, "desc": "Revoke a role from an address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Suspension status to apply.", "name": "suspended"}], "name": "rbac_contract_suspension", "returns": {"type": "uint64", "desc": "UNIX timestamp of the suspension update."}, "desc": "Set the asset-wide suspension status.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "rbac_get_arranger", "returns": {"type": "address", "desc": "Current arranger address."}, "desc": "Get the arranger address.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Address to query.", "name": "address"}], "name": "rbac_get_address_roles", "returns": {"type": "(bool,bool,bool,bool,bool)", "desc": "Roles mask in the order: account manager, primary dealer, trustee, authority, observer."}, "desc": "Non-normative helper to get the active roles assigned to an address.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role identifier.", "name": "role_id"}, {"type": "address", "desc": "Account role address.", "name": "role_address"}], "name": "rbac_get_role_validity", "returns": {"type": "(uint64,uint64)", "desc": "Stored role validity interval.", "struct": "RoleValidity"}, "desc": "Get the stored validity interval for a role assignment.", "events": [], "readonly": true, "recommendations": {}}], "name": "DASA", "state": {"keys": {"box": {}, "global": {"arranger": {"key": "UjpBUlIj", "keyType": "AVMBytes", "valueType": "address"}, "op_daemon": {"key": "UjpPUEQj", "keyType": "AVMBytes", "valueType": "address"}, "asset_suspended": {"key": "YXNzZXRfc3VzcGVuZGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "asset_defaulted": {"key": "YXNzZXRfZGVmYXVsdGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "status": {"key": "c3RhdHVz", "keyType": "AVMString", "valueType": "AVMUint64"}, "contract_type": {"key": "Y29udHJhY3RfdHlwZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "prospectus_hash": {"key": "cHJvc3BlY3R1c19oYXNo", "keyType": "AVMString", "valueType": "AVMBytes"}, "prospectus_url": {"key": "cHJvc3BlY3R1c191cmw=", "keyType": "AVMString", "valueType": "AVMString"}, "denomination_asset_id": {"key": "ZGVub21pbmF0aW9uX2Fzc2V0X2lk", "keyType": "AVMString", "valueType": "AVMUint64"}, "settlement_asset_id": {"key": "c2V0dGxlbWVudF9hc3NldF9pZA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "initial_exchange_date": {"key": "aW5pdGlhbF9leGNoYW5nZV9kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "maturity_date": {"key": "bWF0dXJpdHlfZGF0ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "transfer_opening_date": {"key": "dHJhbnNmZXJfb3BlbmluZ19kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "transfer_closure_date": {"key": "dHJhbnNmZXJfY2xvc3VyZV9kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "day_count_convention": {"key": "ZGF5X2NvdW50X2NvbnZlbnRpb24=", "keyType": "AVMString", "valueType": "AVMUint64"}, "total_units": {"key": "dG90YWxfdW5pdHM=", "keyType": "AVMString", "valueType": "AVMUint64"}, "reserved_units_total": {"key": "cmVzZXJ2ZWRfdW5pdHNfdG90YWw=", "keyType": "AVMString", "valueType": "AVMUint64"}, "initial_exchange_amount": {"key": "aW5pdGlhbF9leGNoYW5nZV9hbW91bnQ=", "keyType": "AVMString", "valueType": "AVMUint64"}, "outstanding_principal": {"key": "b3V0c3RhbmRpbmdfcHJpbmNpcGFs", "keyType": "AVMString", "valueType": "AVMUint64"}, "next_principal_redemption": {"key": "bmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbg==", "keyType": "AVMString", "valueType": "AVMUint64"}, "dynamic_principal_redemption": {"key": "ZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbg==", "keyType": "AVMString", "valueType": "AVMUint64"}, "interest_calculation_base": {"key": "aW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "accrued_interest": {"key": "YWNjcnVlZF9pbnRlcmVzdA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "nominal_interest_rate": {"key": "bm9taW5hbF9pbnRlcmVzdF9yYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_spread": {"key": "cmF0ZV9yZXNldF9zcHJlYWQ=", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_multiplier": {"key": "cmF0ZV9yZXNldF9tdWx0aXBsaWVy", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_floor": {"key": "cmF0ZV9yZXNldF9mbG9vcg==", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_cap": {"key": "cmF0ZV9yZXNldF9jYXA=", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_next": {"key": "cmF0ZV9yZXNldF9uZXh0", "keyType": "AVMString", "valueType": "AVMUint64"}, "has_rate_reset_floor": {"key": "aGFzX3JhdGVfcmVzZXRfZmxvb3I=", "keyType": "AVMString", "valueType": "AVMUint64"}, "has_rate_reset_cap": {"key": "aGFzX3JhdGVfcmVzZXRfY2Fw", "keyType": "AVMString", "valueType": "AVMUint64"}, "reserved_principal": {"key": "cmVzZXJ2ZWRfcHJpbmNpcGFs", "keyType": "AVMString", "valueType": "AVMUint64"}, "reserved_interest": {"key": "cmVzZXJ2ZWRfaW50ZXJlc3Q=", "keyType": "AVMString", "valueType": "AVMUint64"}, "cumulative_interest_index": {"key": "Y3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "cumulative_principal_index": {"key": "Y3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXg=", "keyType": "AVMString", "valueType": "AVMUint64"}, "event_cursor": {"key": "ZXZlbnRfY3Vyc29y", "keyType": "AVMString", "valueType": "AVMUint64"}, "schedule_entry_count": {"key": "c2NoZWR1bGVfZW50cnlfY291bnQ=", "keyType": "AVMString", "valueType": "AVMUint64"}, "fixed_point_scale": {"key": "Zml4ZWRfcG9pbnRfc2NhbGU=", "keyType": "AVMString", "valueType": "AVMUint64"}}, "local": {}}, "maps": {"box": {"account_manager": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpNTkcj"}, "primary_dealer": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpQWUQj"}, "trustee": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpUUlMj"}, "authority": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpBVVQj"}, "observer": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpNT0Mj"}, "schedule_page": {"keyType": "uint64", "valueType": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[]", "prefix": "UyM="}, "account": {"keyType": "address", "valueType": "AccountPosition", "prefix": "QSM="}}, "global": {}, "local": {}}, "schema": {"global": {"bytes": 4, "ints": 37}, "local": {"bytes": 0, "ints": 0}}}, "structs": {"AccountPosition": [{"name": "payment_address", "type": "address"}, {"name": "units", "type": "uint64"}, {"name": "reserved_units", "type": "uint64"}, {"name": "suspended", "type": "bool"}, {"name": "settled_cursor", "type": "uint64"}, {"name": "interest_checkpoint", "type": "uint64"}, {"name": "principal_checkpoint", "type": "uint64"}, {"name": "claimable_interest", "type": "uint64"}, {"name": "claimable_principal", "type": "uint64"}], "CashClaimResult": [{"name": "interest_amount", "type": "uint64"}, {"name": "principal_amount", "type": "uint64"}, {"name": "total_amount", "type": "uint64"}, {"name": "timestamp", "type": "uint64"}, {"name": "context", "type": "byte[]"}], "CashFundingResult": [{"name": "funded_interest", "type": "uint64"}, {"name": "funded_principal", "type": "uint64"}, {"name": "total_funded", "type": "uint64"}, {"name": "processed_events", "type": "uint64"}, {"name": "timestamp", "type": "uint64"}], "ExecutionScheduleEntry": [{"name": "event_id", "type": "uint64"}, {"name": "event_type", "type": "uint8"}, {"name": "scheduled_time", "type": "uint64"}, {"name": "accrual_factor", "type": "uint64"}, {"name": "redemption_accrual_factor", "type": "uint64"}, {"name": "next_nominal_interest_rate", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "next_outstanding_principal", "type": "uint64"}, {"name": "flags", "type": "uint64"}], "InitialKernelState": [{"name": "status_date", "type": "uint64"}, {"name": "event_cursor", "type": "uint64"}, {"name": "outstanding_principal", "type": "uint64"}, {"name": "interest_calculation_base", "type": "uint64"}, {"name": "nominal_interest_rate", "type": "uint64"}, {"name": "accrued_interest", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "cumulative_interest_index", "type": "uint64"}, {"name": "cumulative_principal_index", "type": "uint64"}], "KernelState": [{"name": "contract_type", "type": "uint8"}, {"name": "status", "type": "uint64"}, {"name": "total_units", "type": "uint64"}, {"name": "reserved_units_total", "type": "uint64"}, {"name": "initial_exchange_amount", "type": "uint64"}, {"name": "event_cursor", "type": "uint64"}, {"name": "schedule_entry_count", "type": "uint64"}, {"name": "outstanding_principal", "type": "uint64"}, {"name": "interest_calculation_base", "type": "uint64"}, {"name": "nominal_interest_rate", "type": "uint64"}, {"name": "accrued_interest", "type": "uint64"}, {"name": "cumulative_interest_index", "type": "uint64"}, {"name": "cumulative_principal_index", "type": "uint64"}, {"name": "reserved_interest", "type": "uint64"}, {"name": "reserved_principal", "type": "uint64"}], "NormalizedActusTerms": [{"name": "contract_type", "type": "uint8"}, {"name": "denomination_asset_id", "type": "uint64"}, {"name": "settlement_asset_id", "type": "uint64"}, {"name": "total_units", "type": "uint64"}, {"name": "notional_principal", "type": "uint64"}, {"name": "initial_exchange_amount", "type": "uint64"}, {"name": "initial_exchange_date", "type": "uint64"}, {"name": "maturity_date", "type": "uint64"}, {"name": "day_count_convention", "type": "uint8"}, {"name": "rate_reset_spread", "type": "uint64"}, {"name": "rate_reset_multiplier", "type": "uint64"}, {"name": "rate_reset_floor", "type": "uint64"}, {"name": "rate_reset_cap", "type": "uint64"}, {"name": "rate_reset_next", "type": "uint64"}, {"name": "has_rate_reset_floor", "type": "bool"}, {"name": "has_rate_reset_cap", "type": "bool"}, {"name": "dynamic_principal_redemption", "type": "bool"}, {"name": "fixed_point_scale", "type": "uint64"}], "ObservedCashEventRequest": [{"name": "event_id", "type": "uint64"}, {"name": "event_type", "type": "uint8"}, {"name": "scheduled_time", "type": "uint64"}, {"name": "accrual_factor", "type": "uint64"}, {"name": "redemption_accrual_factor", "type": "uint64"}, {"name": "next_nominal_interest_rate", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "next_outstanding_principal", "type": "uint64"}, {"name": "flags", "type": "uint64"}], "ObservedEventRequest": [{"name": "event_id", "type": "uint64"}, {"name": "event_type", "type": "uint8"}, {"name": "scheduled_time", "type": "uint64"}, {"name": "accrual_factor", "type": "uint64"}, {"name": "redemption_accrual_factor", "type": "uint64"}, {"name": "observed_rate", "type": "uint64"}, {"name": "next_nominal_interest_rate", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "next_outstanding_principal", "type": "uint64"}, {"name": "flags", "type": "uint64"}], "Prospectus": [{"name": "hash", "type": "byte[32]"}, {"name": "url", "type": "string"}], "RoleValidity": [{"name": "role_validity_start", "type": "uint64"}, {"name": "role_validity_end", "type": "uint64"}]}, "byteCode": {"approval": "DCAFAAEIINwLJjEEFR98dQZzdGF0dXMMZXZlbnRfY3Vyc29yFHNjaGVkdWxlX2VudHJ5X2NvdW50FW91dHN0YW5kaW5nX3ByaW5jaXBhbBFmaXhlZF9wb2ludF9zY2FsZRBhY2NydWVkX2ludGVyZXN0GWludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UCQSMVbm9taW5hbF9pbnRlcmVzdF9yYXRlDWNvbnRyYWN0X3R5cGUUcmVzZXJ2ZWRfdW5pdHNfdG90YWwScmVzZXJ2ZWRfcHJpbmNpcGFsC3RvdGFsX3VuaXRzGW5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24RcmVzZXJ2ZWRfaW50ZXJlc3QZY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleBpjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleAZSOkFSUiMTc2V0dGxlbWVudF9hc3NldF9pZBdpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudAZSOkFVVCMGUjpQWUQjBlI6TU5HIwJTIwZSOk1PQyMGUjpPUEQjFWluaXRpYWxfZXhjaGFuZ2VfZGF0ZRV0cmFuc2Zlcl9vcGVuaW5nX2RhdGUVdHJhbnNmZXJfY2xvc3VyZV9kYXRlEHJhdGVfcmVzZXRfZmxvb3IOcmF0ZV9yZXNldF9jYXAGUjpUUlMjD2Fzc2V0X3N1c3BlbmRlZBxkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uEXJhdGVfcmVzZXRfc3ByZWFkFXJhdGVfcmVzZXRfbXVsdGlwbGllcg9yYXRlX3Jlc2V0X25leHQUaGFzX3JhdGVfcmVzZXRfZmxvb3ISaGFzX3JhdGVfcmVzZXRfY2FwAQAPYXNzZXRfZGVmYXVsdGVkD3Byb3NwZWN0dXNfaGFzaA5wcm9zcGVjdHVzX3VybBVkZW5vbWluYXRpb25fYXNzZXRfaWQNbWF0dXJpdHlfZGF0ZRRkYXlfY291bnRfY29udmVudGlvbgMGgQECAAAxGEAArScSMgNnJxoyA2cnISJnJykiZykiZycKImcnKoAAZycrgABnJywiZycTImcnGyJnJy0iZyccImcnHSJnJy4iZycNImcnCyJnJxQiZycEImcnDiJnJyIiZycHImcnBiJnJwkiZycjImcnJCJnJx4iZycfImcnJSJnJyYiZycnImcnDCJnJw8iZycQImcnESJnKiJnKyJnJwUiZzE1gQQSRDE0gSUSRDE3FEQxNhREgASRTwTrNhoAjgEAxzEZFEQxGEEAsIIYBLRGGMgE54MlKQSUOIcjBGyF4+4EvdGpRAR8DxgSBBT8EO8EdKcpfwQJ1P4UBJqb+oUEhe7TPQSrLA/EBNnyJawEmINQWgSOpudMBAKvVXoEgvcbLQTvBPXTBN80NVAEPb6AvQQePkjnBAEMgpkEdAas0gQacqLuNhoAjhgAVgMhBH0EpwUxBiEGWwazBuYHFAkICh8KmAwEDPYNiQ3ODeYN/g6zD0kPaA9zD70AgASVbXFWNhoAjgEG8QAxGYEEEjEYEERCDa6KAgCL/oEKCIsAMgwNQQAqsYEGshCBBbIZJy+yHicvsh+L/40CAAsABLNC/9syALIBQv/1IrIBQv/viSKAAEcNNhoBSRUkEkQXIillRESIFZ6IFaWIFaoiKWVEgTISFESIEgFBAAtJgWQLIQQIIoj/jyJFBSJFDiJFDUsESwEMQQJZIiplRCIrZUQMQQJNIiplRIgQ00lFEYEJW0lFAzIHDUACN0sPJFVJRRAkEklFBEAAEEsOgQMSQAAISw6BExJBAj8jQQIUSw8iWyIqZUQSREsBMgcOREsCQAHtSw6BExJAAeUiRQtLDyRVSUUQgQMSQAFlSw6BExJAAV0iRQZLD4ExW0UIiBFbQAD+SwdFCUsKiBAZSwaIEBRLAYgQLklOAkUPSYgQJUlFC0sCSwEISUUJMgoiJxNlRHAARCInD2VEIicMZURLAQhLAksBD0RPAkwJTwIPRE8DCCcPTGciJwxlRAgnDExnIicQZURPAggnEExnIicRZUQIJxFMZ0sPJFWBAxJBAHoiJwZlREsQiBDnRRIIJwZMZ4gQx0EACksPJFWBExJBAAlLD4EpWycOTGcnBEsIZycHSwlnIiplRCMIKkxnSw9XCAGAAROoQQARIicEZURAAAkpgcgBZycHImdLD0sESYgTVEhLDUsMCEUOSwxLBwhFDUsEIwhFBUL+dycGImdC/5BLDyRVSUUQgQMSQQAQIicEZURLBglJRQlFCUL+6UsOJBJBABMiJwRlTEUJRCInB2VMRQpEQv7PSw6BExJAAAdLB0UJQv7AIkUIIkUJQv63iBAIQQBWSw6BExJBAAoiJwRlREUGQv6OIicGZURLEIgP/0USCElFCyInDmVED0EABiJFBkL+byInDmVESwoJSUUIIicEZUQNQQAKIicEZURFBkL+UUsGRQZC/kpLD4ExWyInBGVESg5ETAlFBkL+NiInBmVESxCID6dFEghFC0L+DEsESURLDklLD0lOAwgyB08CFk8DFlBPAhZQTwIWUEwWUChMULAjQyJC/b6AAEcCNhoBRwIVJRJENhoCSSJZgQIISwEVEkRXAgBMIillREQnCExQSb1FAUQiJxplRDIDE0EAIjEAIicaZUQSQAAVMQBLAxJAAA0xAEsBvkRXACASQQEAI0SIEpaIEpsiKWVEgTISFERLAkmIDUuIDM5GAkm+REmBSVtJTgJFCEmBUVtJRQhPAghJRQZEVwAgIicTZURwAEUBQQC3Sb5EgYADU0AArSNBAHgyCiInE2VETEsBcABESwVJTgIPREsCSU4DvkRJVwAgsTIATwOyEkyyFE8CshGBBLIQsgGzSYFJW0lOAkUJSYFRW0lOA0UJIhZMSwFcSUxcUU8DTL8iJw9lRElLAg9EIicMZURLAw9ETAknD0xnIicMZURMCScMTGdLBUlLBklOAwgyB08CFk8DFlBPAhZQTBZQSwJJFRZXBgJMUEyAAgAiUExQKExQsCNDIkL/UCJC/v02GgFJFSQSRBc2GgJJFSQSRBeIEXhKDEQnHE8CZycdTGcyBxYoTFCwI0M2GgFJFSUSRDYaAkkVJBJEF0lOAiIpZUREJxYxAIgRD0SIEUmIEU4iKWVEgTISRCcISwJQSU4DvUUBREyIC2pJRCInC2VECCInDWVEDkQiJxtlREEACTIHIicbZUQOREcCvkSBKFtLA0lOAwgWgShMuyInC2VECCcLSwFnIicNZURMCRYoTFCwI0MiSTYaAUkVJRJENhoCSRUlEkQ2GgNHAhUkEkQXIillRESIEL+IEMQiKWVEgTISFEQiJxxlREEACSInHGVEMgcORCInHWVEQQAJMgciJx1lRAxEMQBLBElOAhJEJwhLAVBJRQhJvUUBRCcISwVJTgJQSUUJvUUBREsCiAqjSYgKn08CE0RLAUlETL5EJVsORCIqZUQiK2VED0AADiIqZUSIC7CBCVsyBw1ESwNJiAr7SwNJTgKICvOICnZGAogKcUYCSwVJvkQlW0sCSU4CSwEOREsBCRZPAiVPArtLBUm+RCVbTwIIFiVMuyhLAlCwI0M2GgFJFSUSRDYaAkkVIxJEIlMnFTEAiA+cRCcITwJQSb1FAURJgTAjuiJPA1SBMEy7MgcWKExQsCNDNhoBSRUlEkQ2GgJJFSUSRCcXMQCID2REIillRIHIARIURIgPlIgPmScITwJQSb1FARREIhZPAksBUEsBUCcoUEsBUEsBUEsBUEsBUExQvzIHFihMULAjQzYaAUkVJRJENhoCSRUlEkQnCEsCUEm9RQFEMQBPAxJEiA8+iA9DIk8CuzIHFihMULAjQzYaAUkVJRJEJwhMUEm9RQFEvkgoTFCwI0M2GgFJFSUSRCcSTGcyBxYoTFCwI0OAAEk2GgFHAhWBaxJENhoCSU4CFYFIEkQ2GgNJTgJJFUsBJVlJgSISRE8CTEsCUklOAyJZgSQIEkSIDroiVUknCksBZ0EAIkkjEkAAHEmBAhJAABVJgQMSQAAOSYEEEkAAB0mBBRJBAYcjRCInCmVMRQJESwRJgSFbSUUIRIE5VUlFCEEAH0sGIxJAABhLBoECEkAAEEsGgQMSQAAISwaBBBJBAUcjREkjE0EACEsEgZIGUxREIillRBREIicUZUQUREsESSNbSXELRQFEJyxLAWdLAYEJW0lPAhJEJxNLAWexMgAyCiKyErIUTLIRgQSyELIBs0mBEVsnDUxnJwsiZycuSwhnSYEpWycbSwFnSwGBMVsnLUsBZ0sGSU4CgTBbJw5MZycUSwpnSwOBkgZTJyJMZ0sBgRBbJwRMZ0sBgShbJwZMZ0sBJVsnCUxnSwGBGFsnB0xnSwOBOlsnI0xnSwOBQlsnJExnSwOBSlsnHkxnSwOBUlsnH0xnSwOBWlsnJUxnSwOBkAZTJyZMZ0sDgZEGUycnTGdPA4FjWycFTGdLASRbKkxnSwGBOFsnEExnSwGBQFsnEUxnJw8iZycMImdLAjIHDURMIltLAgxEDERLAlcAICcqTGdLAVcCACcrTGcyBxYoTFCwI0MiQv62IkL+diKAAEcCNhoBSRUkEkQXSTYaAkkVIxJEIlNMNhoDSU4CSSJZSU4DSYFBC4ECCE8CFRJEiAzNIicKZUxOA0QiKWVEFERJgRAORCInFGVEREyBEAtMgWQLIQQIIoj2tiJJSwQMQQCLSwRXAgBJRQxLAUlOAoFBC4FBWEkkVUlOAkUNSSJbSUUNSwVPBAhLARJESwVPA4gIGUyBCVtJRQpEQQAXSUEAJUkjCYFBC0sLTIFBWIEJW0sIDkRLCEAABUsJIxJESSMIRQFC/5RLBklEIwkWJxhMUEm9RQFESSKBAroXSUQjCYFBC4ECCIFBukL/wUsGFicYTFBJvEhLBb9LBUEADEsBSwQIK0xnKYEyZzIHFihMULAjQyIpZUREiAvjiAvqiAvvIiplRCIrZURLAQ1EiAdHSVcIAUmAAQGoREsBVwAISwJXCQhLA1cRCEsEVxkISwVXIQhLBlcpCEsHVzEISwhXOQhPB08IUE8HUE8GUE8FUCIWUE8EUE8DUE8CUExQiAh5RgIyBxYoTFCwI0MiRwSAAEk2GgFJFSQSRBc2GgJHAhWBSRJEIillRESIC1uIC2CBQVtJgQQaQQCwIicKZUSBBRJEiAs4IicKZURJgQUSREsCSSJbSUUHIitlRBJESVcIAUUMJFWIBsIiK2VEgRAKJzBFBxYnGExQSUUJvUUBQQAHSwe+TEUHREsFSSJZSYEQDERLA0lXCQhLAVcRCEsCVxkISwNXKQhLBFcxCE8FVzkISwsWSxJQTwZQTwVQTwRQTwNQTwJQTFBLAxZQTwJMUEwjCBZXBgJcAEsISbxITL8iK2VEIwgrTGciKmVESwNJTwISRIgF/0lFCElXCAFFCiRVSUUGIxJAAChLBIEEEkAAIEsEgQwSQAAYSwSBCxJAABBLBIESEkAACEsEgQUSQQBBI0RLCIABAalESwSBDBJAAAhLBIELEkEAJCNBABonGTEAiAnzREsGSwKIBxtGAjIHFihMULAjQ4gKEUL/6CJC/9kiQv+8Ikk2GgFHAhWBQRJEIillRESICfKICfmICf4iKWVEgTISFEQiJwplRIEFEkRJIltJTgIiK2VETEsBEkRLAVcIAUlOA4ABA6hETIE5W0lOAiMaREEAEyIrZUQjCYgFIYEJW0sEgQlbDkQiK2VEgRAKJzBFBhYnGExQSUUHvUUBQQAHSwW+TEUGREsESSJZSYEQDERLBUlXCQhLAVcRCEsCVxkISwNXIQhLBFcpCE8FVzEISwoWSwpQTwZQTwVQTwRQTwNQTwJQTFBLAxZQTwJMUEwjCBZXBgJcAEsGSbxITL8iK2VEIwgrTGcyBxYoTFCwI0MiKWVESUQiJwplRBZJkyQORFcHASInDWVEIicLZUQiJxRlRCIqZUQiK2VEIicEZUQiJwdlRCInCWVEIicGZUQiJxBlRCInEWVEIicPZUQiJwxlRE8OFk8OTFBPDRZQTwwWUE8LFlBPChZQTwkWUE8IFlBPBxZQTwYWUE8FFlBPBBZQTwMWUE8CFlBMFlAoTFCwI0MiKWVERCIqZUQiK2VED0EAJSIqZUQWJyhQIhZMSwFQSwFQSwFQSwFQSwFQSwFQTFAoTFCwI0MiKmVEiAO9Qv/wiAg+I0M2GgFJFSUSRIgIMScSTGcyBxYoTFCwI0M2GgFJFSUSRIgIGScaTGcyBxYoTFCwI0M2GgFJFSMSRDYaAklOAhUlEkQ2GgNJTgIVgRASRIgH7IgH8xdHAogH/YEUEkEADicSSwNnMgcWKExQsCNDSYEoEkEAEScXSwNQSb1FARRESwK/Qv/fSYEyEkEAEScWSwNQSb1FARRESwK/Qv/HSYE8EkEAEScgSwNQSb1FARRESwK/Qv+vSYFGEkEAEScVSwNQSb1FARRESwK/Qv+XSYFQEkH/kCcZSwNQSb1FARRESwK/Qv9/NhoBSRUjEkQ2GgJJTgIVJRJEiAdCiAdJF0cCiAdTSYEUE0SBKBJBABUnF0sCUEm9RQFEvEgyBxYoTFCwI0NJgTISQQAPJxZLAlBJvUUBRLxIQv/hSYE8EkEADycgSwJQSb1FAUS8SEL/y0mBRhJBAA8nFUsCUEm9RQFEvEhC/7VJgVASQf+uJxlLAlBJvUUBRLxIQv+fNhoBSRUjEkQiUycVMQCIBnxEJyFMZzIHFihMULAjQyInEmVEKExQsCNDNhoBSRUlEkQnF0sBiAZUJxZLAogGTScgSwOIBkYnFUsEiAY/JxlPBYgGOCcoIk8GVCNPBVSBAk8EVIEDTwNUgQRPAlQoTFCwI0M2GgFJFSMSRDYaAklOAhUlEkQXSYgGUIMGFCgyPEZQTwaOBgBPAEAAMQAiABMAAQAnGUsBUEm9RQFEvkgoTFCwI0MnFUsBUEm9RQFEvkhC/+snIEsBUEm9RQFEvkhC/9wnFksBUEm9RQFEvkhC/80nF0sBUEm9RQFEvkhC/76AEAAAAAAAAAAAAAAAAAAAAABC/6mKAQAnCIv/UL5EgYADUxREiYoBAicIi/9QSb1FAURJvkgiJxBlREsBgTlbCSInEWVESwKBQVsJSwIlWyInBWVETwNLAk8CiACYIicFZURPA08DTwKIAIpLAoFJW0sCCBZPA0xcSUmBUVtLAggWXFEiJxBlRBZcOSInEWVEFlxBIiplRBZcMU8DTL+JigEAIoAAJwiL/1BJvUUBRCIpZUSBMhJBAAGJiwK+TElOAowARIEoW0mMAUAAAYmLAEklW4sBSU4DCBZcICIWXCiLAky/IicLZURJSwIPREwJJwtMZ4mKAwGL/UEABYv+QAACIomL/Yv+HYv/l4mKAQGL/0AAAiKJIicNZURJRCInBWVEi/9MTwKI/8qJigEBi/9AAAIiiSInDWVEIicFZUSL/0yI/6+JigEBIitlRIv/DUSL/4EQChYnGExQSb1FAUSL/4EQGEsBIoECuhdLAQ1EgUELgQIIgUG6iYoCAIv/IxJAAB+L/yQSQAAYi/+BExJAABCL/4EMEkAACIv/gQsSQQADI0SJi/5AAAQiQv/1i/6BAxJAAAiL/oECEkEAGIv/gQMSQAAIi/+BEhJBAAQjQv/RIkL/zYv+IxJBACCL/4EDEkAAEIv/gRISQAAIi/+BBRJBAAQjQv+qIkL/pov+gQQSQQAoi/+BAxJAABiL/4EEEkAAEIv/gRISQAAIi/+BBRJBAAQjQv96IkL/dov+gQUSQQAIi/+BAxJC/2YiQv9iIicKZUQjEkEACiInImVEQQACI4kiiYoBAov/gRFbSUEAECInCWVEQQAIIicHZURAAAYii/9PAokiJwdlRCInCWVEIicFZUSI/mgiJwVlRIsATIj+XYv/TwKJigIBi/9AAAOL/okiJwVlRCInCWVEi/9LAoj+PAhJRCInBWVEi/5MTwKI/iyJigICIoAARwiL/iJbIiplRBJEi/6BCVsyBw5Ei/4kVUkjEklBAF4iKWVEgTISRCInC2VEIicNZUQSRIv+gTFbJwRLAWcnB0xni/6BIVsnCUxnJwYiZ4v+gSlbJw5MZyIqZUQjCCpMZymBZGeLC0QiJxRlRIv+TCKIAdpJjP6L/4wBjACJIillRIEyEhREIicGZUSL/oj++Iz+CCcGTGeLCoEMEkEBeIv/gSFbIickZUQiJwVlRIj9cyInI2VECIwGIicmZURBABMiJx5lRIsGDUEACCInHmVMjAZEIicnZURBABMiJx9lRIsGDEEACCInH2VMjAZEJwmLBmeLCoEEEkEBB4v+gTFbJwRLAWcnB0xniP5lQQDniwqBBRJBAMUiK2VEIiplRAmBZAshBAgiiOvjIicFZUyMAkQijAEijAeL/oEZW0mMCEEAD4sCiwiI/oFJjAIjjAeMASIqZUQjCIwDIitlRIsDDUEAUosDiP0MSYwAJFVJjASBAxJAABCLBIETEkEAM4sAgRlbQQArI0EACIsHQQAMIowHiwMjCIwDQv++iwCBGVuLAkyI/iRJjAKLAQiMAUL/4SJC/9KLAUQiJwRlRIv+gTlbJBpAAAYiJwZlRAgiJwVlRIsBiPxLJw5MZyIqZUQjCCpMZ4v+IkmIAGBJjP6L/4wBjACJi/6BKVsnDkxnQv/aiwqBEhJB/v8iJwRlRCcHTGdC/vOLCoELEkEAG4v+gSFbSYwFQAAIIiclZUyMBUQnCYsFZ0L+uov+gSFbSYwJQf6vJwmLCWdC/qeKAwEyCIv9IluL/VcIAYv9VwkIMgeL/SRVi/5AAEUjFkmTJA5EVwcBIicTZUSLAUkjCIsAFk8CFlCLAlCLA1CLBBZQi/4WUE8DUIv/FlBPAhZQTBZQgASaMyuVTFCwi/2MAImLBSMSQAAIiwWBBBJBAAQjQv+pgf8BQv+jigIBgACL/ov/UEm9RQFBAB+LAb5EIlsyB0mMAA5BABCLAb5EJFuLAA9BAAQjjACJIkL/+TEAIicSZUQSRIkiJyllRBREiSInIWVEFESJigEAi/+BFBJAADCL/4EZEkAAKIv/gSgSQAAgi/+BMhJAABiL/4E8EkAAEIv/gUYSQAAIi/+BUBJBAAMjRIkiQv/6", "clear": "DIEBQw=="}, "desc": "Debt Algorand Standard Application.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "networks": {}, "source": {"approval": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCAzMiAxNTAwCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUgInN0YXR1cyIgImV2ZW50X2N1cnNvciIgInNjaGVkdWxlX2VudHJ5X2NvdW50IiAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIiAiZml4ZWRfcG9pbnRfc2NhbGUiICJhY2NydWVkX2ludGVyZXN0IiAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIgMHg0MTIzICJub21pbmFsX2ludGVyZXN0X3JhdGUiICJjb250cmFjdF90eXBlIiAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiICJyZXNlcnZlZF9wcmluY2lwYWwiICJ0b3RhbF91bml0cyIgIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iICJyZXNlcnZlZF9pbnRlcmVzdCIgImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIgMHg1MjNhNDE1MjUyMjMgInNldHRsZW1lbnRfYXNzZXRfaWQiICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIgMHg1MjNhNDE1NTU0MjMgMHg1MjNhNTA1OTQ0MjMgMHg1MjNhNGQ0ZTQ3MjMgMHg1MzIzIDB4NTIzYTRkNGY0MzIzIDB4NTIzYTRmNTA0NDIzICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiICJ0cmFuc2Zlcl9vcGVuaW5nX2RhdGUiICJ0cmFuc2Zlcl9jbG9zdXJlX2RhdGUiICJyYXRlX3Jlc2V0X2Zsb29yIiAicmF0ZV9yZXNldF9jYXAiIDB4NTIzYTU0NTI1MzIzICJhc3NldF9zdXNwZW5kZWQiICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIiAicmF0ZV9yZXNldF9zcHJlYWQiICJyYXRlX3Jlc2V0X211bHRpcGxpZXIiICJyYXRlX3Jlc2V0X25leHQiICJoYXNfcmF0ZV9yZXNldF9mbG9vciIgImhhc19yYXRlX3Jlc2V0X2NhcCIgMHgwMCAiYXNzZXRfZGVmYXVsdGVkIiAicHJvc3BlY3R1c19oYXNoIiAicHJvc3BlY3R1c191cmwiICJkZW5vbWluYXRpb25fYXNzZXRfaWQiICJtYXR1cml0eV9kYXRlIiAiZGF5X2NvdW50X2NvbnZlbnRpb24iIDB4MDY4MTAxIDB4MDAwMAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4LTI5CiAgICAvLyAjIFJCQUMgUm9sZXMKICAgIC8vIHNlbGYuYXJyYW5nZXIgPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX0FSUkFOR0VSKQogICAgYnl0ZWMgMTggLy8gMHg1MjNhNDE1MjUyMjMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMAogICAgLy8gc2VsZi5vcF9kYWVtb24gPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX09QX0RBRU1PTikKICAgIGJ5dGVjIDI2IC8vIDB4NTIzYTRmNTA0NDIzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NDctNDgKICAgIC8vICMgRC1BU0EgR292ZXJuYW5jZQogICAgLy8gc2VsZi5hc3NldF9zdXNwZW5kZWQgPSBGYWxzZQogICAgYnl0ZWMgMzMgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjQ5CiAgICAvLyBzZWxmLmFzc2V0X2RlZmF1bHRlZCA9IEZhbHNlCiAgICBieXRlYyA0MSAvLyAiYXNzZXRfZGVmYXVsdGVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1Ni01NwogICAgLy8gIyBDb250cmFjdAogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKQogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OAogICAgLy8gc2VsZi5jb250cmFjdF90eXBlID0gVUludDY0KCkKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MC02MQogICAgLy8gIyBQcm9zcGVjdHVzIChJbmZvcm1hdGlvbmFsKQogICAgLy8gc2VsZi5wcm9zcGVjdHVzX2hhc2ggPSBCeXRlcygpCiAgICBieXRlYyA0MiAvLyAicHJvc3BlY3R1c19oYXNoIgogICAgcHVzaGJ5dGVzIDB4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjIKICAgIC8vIHNlbGYucHJvc3BlY3R1c191cmwgPSBTdHJpbmcoKQogICAgYnl0ZWMgNDMgLy8gInByb3NwZWN0dXNfdXJsIgogICAgcHVzaGJ5dGVzICIiCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjQtNjUKICAgIC8vICMgRGVub21pbmF0aW9uCiAgICAvLyBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCA9IEFzc2V0KCkKICAgIGJ5dGVjIDQ0IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBBc3NldCgpCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjgtNjkKICAgIC8vICMgVGltZQogICAgLy8gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGUgPSB0eXAuVGltZVN0YW1wKCkKICAgIGJ5dGVjIDI3IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcwCiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSB0eXAuVGltZVN0YW1wKCkKICAgIGJ5dGVjIDQ1IC8vICJtYXR1cml0eV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MQogICAgLy8gc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgPSB0eXAuVGltZVN0YW1wKCkKICAgIGJ5dGVjIDI4IC8vICJ0cmFuc2Zlcl9vcGVuaW5nX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcyCiAgICAvLyBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgMjkgLy8gInRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzQtNzUKICAgIC8vICMgRGF5IENvdW50IENvbnZlbnRpb24KICAgIC8vIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPSBVSW50NjQoKQogICAgYnl0ZWMgNDYgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3Ny03OAogICAgLy8gIyBVbml0cwogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IFVJbnQ2NCgpCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc5CiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID0gVUludDY0KCkKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODEtODIKICAgIC8vICMgUHJpbmNpcGFsCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID0gVUludDY0KCkKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODMKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gVUludDY0KCkKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODUKICAgIC8vIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiA9IEZhbHNlCiAgICBieXRlYyAzNCAvLyAiZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODctODgKICAgIC8vICMgSW50ZXJlc3QKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OQogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ID0gVUludDY0KCkKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkxLTkyCiAgICAvLyAjIEludGVyZXN0IFJhdGVzCiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzCiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkID0gVUludDY0KCkKICAgIGJ5dGVjIDM1IC8vICJyYXRlX3Jlc2V0X3NwcmVhZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9tdWx0aXBsaWVyID0gVUludDY0KCkKICAgIGJ5dGVjIDM2IC8vICJyYXRlX3Jlc2V0X211bHRpcGxpZXIiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfZmxvb3IgPSBVSW50NjQoKQogICAgYnl0ZWMgMzAgLy8gInJhdGVfcmVzZXRfZmxvb3IiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfY2FwID0gVUludDY0KCkKICAgIGJ5dGVjIDMxIC8vICJyYXRlX3Jlc2V0X2NhcCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTcKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9uZXh0ID0gVUludDY0KCkKICAgIGJ5dGVjIDM3IC8vICJyYXRlX3Jlc2V0X25leHQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4CiAgICAvLyBzZWxmLmhhc19yYXRlX3Jlc2V0X2Zsb29yID0gRmFsc2UKICAgIGJ5dGVjIDM4IC8vICJoYXNfcmF0ZV9yZXNldF9mbG9vciIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTkKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwID0gRmFsc2UKICAgIGJ5dGVjIDM5IC8vICJoYXNfcmF0ZV9yZXNldF9jYXAiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMS0xMDIKICAgIC8vICMgUHJpbWFyeSBEaXN0cmlidXRpb24KICAgIC8vIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsID0gVUludDY0KCkKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMwogICAgLy8gc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNS0xMDYKICAgIC8vICMgQ3VtdWxhdGl2ZSBQZXItVW5pdCBGaXhlZC1Qb2ludCBJbmRleGVzCiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggPSBVSW50NjQoKQogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNwogICAgLy8gc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNQogICAgLy8gc2VsZi5ldmVudF9jdXJzb3IgPSBVSW50NjQoKQogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTYKICAgIC8vIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgPSBVSW50NjQoKQogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExOC0xMTkKICAgIC8vICMgU2NhbGluZwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjIzCiAgICAvLyBhc3NlcnQgVHhuLmdsb2JhbF9udW1fYnl0ZV9zbGljZSA9PSBjZmcuR0xPQkFMX0JZVEVTLCBlcnIuV1JPTkdfR0xPQkFMX0JZVEVTCiAgICB0eG4gR2xvYmFsTnVtQnl0ZVNsaWNlCiAgICBwdXNoaW50IDQKICAgID09CiAgICBhc3NlcnQgLy8gV3JvbmcgR2xvYmFsIEJ5dGVzIGFsbG9jYXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kX2FzYS9jb250cmFjdC5weToyNAogICAgLy8gYXNzZXJ0IFR4bi5nbG9iYWxfbnVtX3VpbnQgPT0gY2ZnLkdMT0JBTF9VSU5UUywgZXJyLldST05HX0dMT0JBTF9VSU5UUwogICAgdHhuIEdsb2JhbE51bVVpbnQKICAgIHB1c2hpbnQgMzcKICAgID09CiAgICBhc3NlcnQgLy8gV3JvbmcgR2xvYmFsIFVJbnRzIGFsbG9jYXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kX2FzYS9jb250cmFjdC5weToyNQogICAgLy8gYXNzZXJ0IFR4bi5sb2NhbF9udW1fYnl0ZV9zbGljZSA9PSBjZmcuTE9DQUxfQllURVMsIGVyci5XUk9OR19MT0NBTF9CWVRFUwogICAgdHhuIExvY2FsTnVtQnl0ZVNsaWNlCiAgICAhCiAgICBhc3NlcnQgLy8gV3JvbmcgTG9jYWwgQnl0ZXMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBhc3NlcnQgVHhuLmxvY2FsX251bV91aW50ID09IGNmZy5MT0NBTF9VSU5UUywgZXJyLldST05HX0xPQ0FMX1VJTlRTCiAgICB0eG4gTG9jYWxOdW1VaW50CiAgICAhCiAgICBhc3NlcnQgLy8gV3JvbmcgTG9jYWwgVUludHMgYWxsb2NhdGlvbgoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6OC0xOAogICAgLy8gY2xhc3MgREFTQSgKICAgIC8vICAgICBQYXltZW50QWdlbnQsCiAgICAvLyAgICAgVHJhbnNmZXJBZ2VudCwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBhdm1fdmVyc2lvbj0xMiwKICAgIC8vICk6CiAgICBwdXNoYnl0ZXMgMHg5MTRmMDRlYiAvLyBtZXRob2QgImNvbnRyYWN0X3VwZGF0ZSgpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fY29udHJhY3RfdXBkYXRlX3JvdXRlQDQKCm1haW5fc3dpdGNoX2Nhc2VfbmV4dEA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjgtMTgKICAgIC8vIGNsYXNzIERBU0EoCiAgICAvLyAgICAgUGF5bWVudEFnZW50LAogICAgLy8gICAgIFRyYW5zZmVyQWdlbnQsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyAgICAgYXZtX3ZlcnNpb249MTIsCiAgICAvLyApOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYnogbWFpbl9jcmVhdGVfTm9PcEAzMgogICAgcHVzaGJ5dGVzcyAweGI0NDYxOGM4IDB4ZTc4MzI1MjkgMHg5NDM4ODcyMyAweDZjODVlM2VlIDB4YmRkMWE5NDQgMHg3YzBmMTgxMiAweDE0ZmMxMGVmIDB4NzRhNzI5N2YgMHgwOWQ0ZmUxNCAweDlhOWJmYTg1IDB4ODVlZWQzM2QgMHhhYjJjMGZjNCAweGQ5ZjIyNWFjIDB4OTg4MzUwNWEgMHg4ZWE2ZTc0YyAweDAyYWY1NTdhIDB4ODJmNzFiMmQgMHhlZjA0ZjVkMyAweGRmMzQzNTUwIDB4M2RiZTgwYmQgMHgxZTNlNDhlNyAweDAxMGM4Mjk5IDB4NzQwNmFjZDIgMHgxYTcyYTJlZSAvLyBtZXRob2QgImZ1bmRfZHVlX2Nhc2hmbG93cyh1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJjbGFpbV9kdWVfY2FzaGZsb3dzKGFkZHJlc3MsYnl0ZVtdKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYnl0ZVtdKSIsIG1ldGhvZCAidHJhbnNmZXJfc2V0X3NjaGVkdWxlKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbihhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInRyYW5zZmVyKGFkZHJlc3MsYWRkcmVzcyx1aW50NjQpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X3N1c3BlbnNpb24oYWRkcmVzcyxib29sKXVpbnQ2NCIsIG1ldGhvZCAiYWNjb3VudF9vcGVuKGFkZHJlc3MsYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgImFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzcyhhZGRyZXNzLGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X2dldF9wb3NpdGlvbihhZGRyZXNzKShhZGRyZXNzLHVpbnQ2NCx1aW50NjQsYm9vbCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAiY29udHJhY3RfY29uZmlnKCh1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxib29sLGJvb2wsYm9vbCx1aW50NjQpLCh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCksKGJ5dGVbMzJdLHN0cmluZykpdWludDY0IiwgbWV0aG9kICJjb250cmFjdF9zY2hlZHVsZSh1aW50NjQsYm9vbCwodWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NClbXSl1aW50NjQiLCBtZXRob2QgImNvbnRyYWN0X2V4ZWN1dGVfaWVkKCl1aW50NjQiLCBtZXRob2QgImFwcGx5X25vbl9jYXNoX2V2ZW50KHVpbnQ2NCwodWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIsIG1ldGhvZCAiYXBwZW5kX29ic2VydmVkX2Nhc2hfZXZlbnQoKHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIsIG1ldGhvZCAiY29udHJhY3RfZ2V0X3N0YXRlKCkodWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudCgpKHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJyYmFjX3JvdGF0ZV9hcnJhbmdlcihhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19zZXRfb3BfZGFlbW9uKGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX2Fzc2lnbl9yb2xlKHVpbnQ4LGFkZHJlc3MsKHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19yZXZva2Vfcm9sZSh1aW50OCxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19jb250cmFjdF9zdXNwZW5zaW9uKGJvb2wpdWludDY0IiwgbWV0aG9kICJyYmFjX2dldF9hcnJhbmdlcigpYWRkcmVzcyIsIG1ldGhvZCAicmJhY19nZXRfYWRkcmVzc19yb2xlcyhhZGRyZXNzKShib29sLGJvb2wsYm9vbCxib29sLGJvb2wpIiwgbWV0aG9kICJyYmFjX2dldF9yb2xlX3ZhbGlkaXR5KHVpbnQ4LGFkZHJlc3MpKHVpbnQ2NCx1aW50NjQpIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggZnVuZF9kdWVfY2FzaGZsb3dzIGNsYWltX2R1ZV9jYXNoZmxvd3MgdHJhbnNmZXJfc2V0X3NjaGVkdWxlIHByaW1hcnlfZGlzdHJpYnV0aW9uIHRyYW5zZmVyIGFjY291bnRfc3VzcGVuc2lvbiBhY2NvdW50X29wZW4gYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzIGFjY291bnRfZ2V0X3Bvc2l0aW9uIGNvbnRyYWN0X2NvbmZpZyBjb250cmFjdF9zY2hlZHVsZSBjb250cmFjdF9leGVjdXRlX2llZCBhcHBseV9ub25fY2FzaF9ldmVudCBhcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudCBjb250cmFjdF9nZXRfc3RhdGUgY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50IHJiYWNfcm90YXRlX2FycmFuZ2VyIHJiYWNfc2V0X29wX2RhZW1vbiByYmFjX2Fzc2lnbl9yb2xlIHJiYWNfcmV2b2tlX3JvbGUgcmJhY19jb250cmFjdF9zdXNwZW5zaW9uIHJiYWNfZ2V0X2FycmFuZ2VyIHJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXMgcmJhY19nZXRfcm9sZV92YWxpZGl0eQogICAgZXJyCgptYWluX2NyZWF0ZV9Ob09wQDMyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjgtMTgKICAgIC8vIGNsYXNzIERBU0EoCiAgICAvLyAgICAgUGF5bWVudEFnZW50LAogICAgLy8gICAgIFRyYW5zZmVyQWdlbnQsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyAgICAgYXZtX3ZlcnNpb249MTIsCiAgICAvLyApOgogICAgcHVzaGJ5dGVzIDB4OTU2ZDcxNTYgLy8gbWV0aG9kICJjb250cmFjdF9jcmVhdGUoYWRkcmVzcyl1aW50NjQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBjb250cmFjdF9jcmVhdGUKICAgIGVycgoKbWFpbl9jb250cmFjdF91cGRhdGVfcm91dGVANDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgNCAvLyBVcGRhdGVBcHBsaWNhdGlvbgogICAgPT0KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0CiAgICBiIGNvbnRyYWN0X3VwZGF0ZQoKCi8vIF9wdXlhX2xpYi51dGlsLmVuc3VyZV9idWRnZXQocmVxdWlyZWRfYnVkZ2V0OiB1aW50NjQsIGZlZV9zb3VyY2U6IHVpbnQ2NCkgLT4gdm9pZDoKZW5zdXJlX2J1ZGdldDoKICAgIHByb3RvIDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDEwCiAgICArCgplbnN1cmVfYnVkZ2V0X3doaWxlX3RvcEAxOgogICAgZnJhbWVfZGlnIDAKICAgIGdsb2JhbCBPcGNvZGVCdWRnZXQKICAgID4KICAgIGJ6IGVuc3VyZV9idWRnZXRfYWZ0ZXJfd2hpbGVANgogICAgaXR4bl9iZWdpbgogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGJ5dGVjIDQ3IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbQogICAgYnl0ZWMgNDcgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KICAgIGZyYW1lX2RpZyAtMQogICAgc3dpdGNoIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMEAzIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMUA0CgplbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX25leHRANToKICAgIGl0eG5fc3VibWl0CiAgICBiIGVuc3VyZV9idWRnZXRfd2hpbGVfdG9wQDEKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMUA0OgogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgaXR4bl9maWVsZCBGZWUKICAgIGIgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV9uZXh0QDUKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMEAzOgogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBiIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfbmV4dEA1CgplbnN1cmVfYnVkZ2V0X2FmdGVyX3doaWxlQDY6CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnBheW1lbnRfYWdlbnQuUGF5bWVudEFnZW50LmZ1bmRfZHVlX2Nhc2hmbG93c1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmZ1bmRfZHVlX2Nhc2hmbG93czoKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gMTMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjY4CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2OQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3MAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDcKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzIKICAgIC8vIGlmIHNlbGYuX2lzX2R5bmFtaWNfYW5udWl0eSgpOgogICAgY2FsbHN1YiBfaXNfZHluYW1pY19hbm51aXR5CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzYtNzcKICAgIC8vICsgbWF4X2V2ZW50X2NvdW50CiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfRlVORF9EVUVfQ0FTSEZMT1dTX1BFUl9FVkVOVF9CVURHRVQpCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3NwogICAgLy8gKiBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19QRVJfRVZFTlRfQlVER0VUKQogICAgcHVzaGludCAxMDAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3Ni03NwogICAgLy8gKyBtYXhfZXZlbnRfY291bnQKICAgIC8vICogVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfUEVSX0VWRU5UX0JVREdFVCkKICAgICoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3NQogICAgLy8gVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfQkFTRV9CVURHRVQpCiAgICBpbnRjIDQgLy8gMTUwMAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojc1LTc3CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19CQVNFX0JVREdFVCkKICAgIC8vICsgbWF4X2V2ZW50X2NvdW50CiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfRlVORF9EVUVfQ0FTSEZMT1dTX1BFUl9FVkVOVF9CVURHRVQpCiAgICArCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzMtNzkKICAgIC8vIGVuc3VyZV9idWRnZXQoCiAgICAvLyAgICAgcmVxdWlyZWRfYnVkZ2V0PSgKICAgIC8vICAgICAgICAgVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfQkFTRV9CVURHRVQpCiAgICAvLyAgICAgICAgICsgbWF4X2V2ZW50X2NvdW50CiAgICAvLyAgICAgICAgICogVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfUEVSX0VWRU5UX0JVREdFVCkKICAgIC8vICAgICApLAogICAgLy8gKQogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4MQogICAgLy8gcHJvY2Vzc2VkX2V2ZW50cyA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjgyCiAgICAvLyBmdW5kZWRfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDE0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODMKICAgIC8vIGZ1bmRlZF9wcmluY2lwYWwgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDEzCgpmdW5kX2R1ZV9jYXNoZmxvd3Nfd2hpbGVfdG9wQDQ6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODYKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgPCBtYXhfZXZlbnRfY291bnQKICAgIGRpZyA0CiAgICBkaWcgMQogICAgPAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojg2LTg3CiAgICAvLyBwcm9jZXNzZWRfZXZlbnRzIDwgbWF4X2V2ZW50X2NvdW50CiAgICAvLyBhbmQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAMTEKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4NwogICAgLy8gYW5kIHNlbGYuZXZlbnRfY3Vyc29yIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICA8CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODYtODcKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgPCBtYXhfZXZlbnRfY291bnQKICAgIC8vIGFuZCBzZWxmLmV2ZW50X2N1cnNvciA8IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQKICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl93aGlsZUAxMQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojg5CiAgICAvLyBlbnRyeSA9IHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLmV2ZW50X2N1cnNvcikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICBkdXAKICAgIGJ1cnkgMTcKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5MAogICAgLy8gaWYgZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcDoKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSAzCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDExCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6OTIKICAgIC8vIGlmIG5vdCBzZWxmLl9ldmVudF9pc19jYXNoKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkpOgogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBidXJ5IDE2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNTEKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgaW50Y18yIC8vIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM1MC0zNTQKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX01EKSwKICAgIC8vICkKICAgID09CiAgICBkdXAKICAgIGJ1cnkgNAogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX3RydWVANTIKICAgIGRpZyAxNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzUyCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzUwLTM1NAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfTUQpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDUyCiAgICBkaWcgMTQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM1MwogICAgLy8gVUludDY0KGVudW1zLkVWVF9NRCksCiAgICBwdXNoaW50IDE5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNTAtMzU0CiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9NRCksCiAgICAvLyApCiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VANTMKCmZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX3RydWVANTI6CiAgICBpbnRjXzEgLy8gMQoKZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfbWVyZ2VANTQ6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6OTIKICAgIC8vIGlmIG5vdCBzZWxmLl9ldmVudF9pc19jYXNoKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkpOgogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NDgKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF9pZCA9PSBzZWxmLmV2ZW50X2N1cnNvciwgZXJyLklOVkFMSURfRVZFTlRfQ1VSU09SCiAgICBkaWcgMTUKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgY3Vyc29yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NDkKICAgIC8vIGFzc2VydCBlbnRyeS5zY2hlZHVsZWRfdGltZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwgZXJyLk5PX0RVRV9DQVNIRkxPVwogICAgZGlnIDEKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIDw9CiAgICBhc3NlcnQgLy8gTm8gZHVlIGNhc2hmbG93IHRvIHBheQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDEzCiAgICAvLyBpZiBldmVudF90eXBlIG5vdCBpbiAoVUludDY0KGVudW1zLkVWVF9JUCksIFVJbnQ2NChlbnVtcy5FVlRfTUQpKToKICAgIGRpZyAyCiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTUKICAgIGRpZyAxNAogICAgcHVzaGludCAxOQogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDE0CiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAxMQoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X2ludGVyZXN0X2Ftb3VudEAxNjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQyNgogICAgLy8gZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGRpZyAxNQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSAxNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDI3CiAgICAvLyBpZiBldmVudF90eXBlIG5vdCBpbiAoVUludDY0KGVudW1zLkVWVF9QUiksIFVJbnQ2NChlbnVtcy5FVlRfTUQpKToKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxOQogICAgZGlnIDE0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MjgKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDYKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTUzCiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA9IGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBkaWcgMTUKICAgIHB1c2hpbnQgNDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBidXJ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1NgogICAgLy8gaWYgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCk6CiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUAyOQogICAgZGlnIDcKICAgIGJ1cnkgOQoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzItNTc0CiAgICAvLyAjIEZ1bmRpbmcgdXNlcyBwZXItdW5pdCBjdW11bGF0aXZlIGluZGljZXMgc28gZWFjaCBob2xkZXIgY2FuIHNldHRsZQogICAgLy8gIyBpbmRlcGVuZGVudGx5IGZyb20gaXRzIGN1cnJlbnQgdW5pdCBiYWxhbmNlLgogICAgLy8gaW50ZXJlc3RfaW5kZXhfZGVsdGEgPSBzZWxmLl9hbW91bnRfdG9faW5kZXhfZGVsdGEoaW50ZXJlc3RfYW1vdW50X2R1ZSkKICAgIGRpZyAxMAogICAgY2FsbHN1YiBfYW1vdW50X3RvX2luZGV4X2RlbHRhCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzUKICAgIC8vIHByaW5jaXBhbF9pbmRleF9kZWx0YSA9IHNlbGYuX2Ftb3VudF90b19pbmRleF9kZWx0YShwcmluY2lwYWxfYW1vdW50X2R1ZSkKICAgIGRpZyA2CiAgICBjYWxsc3ViIF9hbW91bnRfdG9faW5kZXhfZGVsdGEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU3NgogICAgLy8gaW50ZXJlc3RfYW1vdW50ID0gc2VsZi5faW5kZXhfZGVsdGFfdG9fYW1vdW50KGludGVyZXN0X2luZGV4X2RlbHRhKQogICAgZGlnIDEKICAgIGNhbGxzdWIgX2luZGV4X2RlbHRhX3RvX2Ftb3VudAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBidXJ5IDE1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzcKICAgIC8vIHByaW5jaXBhbF9hbW91bnQgPSBzZWxmLl9pbmRleF9kZWx0YV90b19hbW91bnQocHJpbmNpcGFsX2luZGV4X2RlbHRhKQogICAgZHVwCiAgICBjYWxsc3ViIF9pbmRleF9kZWx0YV90b19hbW91bnQKICAgIGR1cAogICAgYnVyeSAxMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTc4CiAgICAvLyByZXF1aXJlZF9hbW91bnQgPSBpbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50CiAgICBkaWcgMgogICAgZGlnIDEKICAgICsKICAgIGR1cAogICAgYnVyeSA5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MzQKICAgIC8vIGJhbGFuY2UgPSBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBvcHRlZCBpbnRvIGFzc2V0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NTYKICAgIC8vIHJldHVybiBzZWxmLnJlc2VydmVkX2ludGVyZXN0ICsgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICBkaWcgMQogICAgKwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzM2CiAgICAvLyBhc3NlcnQgYmFsYW5jZSA+PSByZXNlcnZlZF90b3RhbCwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGRpZyAyCiAgICBkaWcgMQogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzM3CiAgICAvLyByZXR1cm4gYmFsYW5jZSAtIHJlc2VydmVkX3RvdGFsCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIC0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4MAogICAgLy8gc2VsZi5fYXZhaWxhYmxlX3NldHRsZW1lbnRfZnVuZHMoKSA+PSByZXF1aXJlZF9hbW91bnQKICAgIHVuY292ZXIgMgogICAgPj0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU3OS01ODEKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5fYXZhaWxhYmxlX3NldHRsZW1lbnRfZnVuZHMoKSA+PSByZXF1aXJlZF9hbW91bnQKICAgIC8vICksIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcyBmb3IgdGhlIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4MwogICAgLy8gc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCArPSBpbnRlcmVzdF9hbW91bnQKICAgIHVuY292ZXIgMwogICAgKwogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4NAogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgKz0gcHJpbmNpcGFsX2Ftb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIGV4aXN0cwogICAgKwogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1ODUKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCArPSBpbnRlcmVzdF9pbmRleF9kZWx0YQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggZXhpc3RzCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4NgogICAgLy8gc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCArPSBwcmluY2lwYWxfaW5kZXhfZGVsdGEKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggZXhpc3RzCiAgICArCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTg3CiAgICAvLyBpZiBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpOgogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgcHVzaGludCAzCiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUA0MAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTg4LTU4OQogICAgLy8gIyBGb3IgUFIsIHRoZSBwZXJpb2QgaW50ZXJlc3Qgc3RheXMgYWNjcnVlZCB1bnRpbCBhIGxhdGVyIElQIG9yIE1ELgogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ICs9IHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZGlnIDE2CiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBidXJ5IDE4CiAgICArCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQxOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTkyCiAgICAvLyBpZiBub3Qgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCkgb3IgZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSA9PSBVSW50NjQoCiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDQzCiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTItNTk0CiAgICAvLyBpZiBub3Qgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCkgb3IgZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSA9PSBVSW50NjQoCiAgICAvLyAgICAgZW51bXMuRVZUX01ECiAgICAvLyApOgogICAgcHVzaGludCAxOQogICAgPT0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQ0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUA0MzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5NQogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gZW50cnkubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZGlnIDE1CiAgICBwdXNoaW50IDQxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTYKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGRpZyA4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTk3CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBuZXh0X2ludGVyZXN0X2Jhc2UKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBkaWcgOQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5OAogICAgLy8gc2VsZi5ldmVudF9jdXJzb3IgKz0gVUludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAwCiAgICAvLyBpZiBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoCiAgICBkaWcgMTUKICAgIGV4dHJhY3QgOCAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MDAtNjAyCiAgICAvLyBpZiBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoCiAgICAvLyAgICAgZW51bXMuRVZUX01ECiAgICAvLyApIGFuZCBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9PSBVSW50NjQoMCk6CiAgICBwdXNoYnl0ZXMgMHgxMwogICAgYj09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0NwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAyCiAgICAvLyApIGFuZCBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9PSBVSW50NjQoMCk6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwMC02MDIKICAgIC8vIGlmIGVudHJ5LmV2ZW50X3R5cGUgPT0gYXJjNC5VSW50OCgKICAgIC8vICAgICBlbnVtcy5FVlRfTUQKICAgIC8vICkgYW5kIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID09IFVJbnQ2NCgwKToKICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0NwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAzCiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbnVtcy5TVEFUVVNfRU5ERUQpCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBwdXNoaW50IDIwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwNAogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gVUludDY0KDApCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0NzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwNi02MTAKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1pbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50LAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PWludGVyZXN0X2Ftb3VudCArIHByaW5jaXBhbF9hbW91bnQsCiAgICAvLyApCiAgICBkaWcgMTUKICAgIGRpZyA0CiAgICBkdXAKICAgIGNhbGxzdWIgX2VtaXRfZXhlY3V0aW9uX2V2ZW50CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5NgogICAgLy8gZnVuZGVkX2ludGVyZXN0ICs9IGludGVyZXN0X2Ftb3VudAogICAgZGlnIDEzCiAgICBkaWcgMTIKICAgICsKICAgIGJ1cnkgMTQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5NwogICAgLy8gZnVuZGVkX3ByaW5jaXBhbCArPSBwcmluY2lwYWxfYW1vdW50CiAgICBkaWcgMTIKICAgIGRpZyA3CiAgICArCiAgICBidXJ5IDEzCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6OTgKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgKz0gVUludDY0KDEpCiAgICBkaWcgNAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgNQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3Nfd2hpbGVfdG9wQDQKCmZ1bmRfZHVlX2Nhc2hmbG93c19lbHNlX2JvZHlANDA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTEKICAgIC8vIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0MQoKZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlAMjk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTcKICAgIC8vIGV2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ1cnkgMTYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1OC01NjAKICAgIC8vICMgRHluYW1pYyBhbm51aXRpZXMgZGVyaXZlIG5leHQgc3RhdGUgZnJvbSB0aGUgcGF5bWVudCBkZWNvbXBvc2l0aW9uLAogICAgLy8gIyBub3Qgb25seSBmcm9tIHRoZSBwcmVjb21wdXRlZCBgbmV4dF8qYCBmaWVsZHMuCiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpOgogICAgcHVzaGludCAzCiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUAzMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTYyCiAgICAvLyBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCAtIHByaW5jaXBhbF9hbW91bnRfZHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGRpZyA2CiAgICAtCiAgICBkdXAKICAgIGJ1cnkgOQogICAgYnVyeSA5CiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDMxOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY1CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9JUCk6CiAgICBkaWcgMTQKICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUAzMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY2CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGJ1cnkgOQogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY3CiAgICAvLyBuZXh0X2ludGVyZXN0X2Jhc2UgPSBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGJ1cnkgMTAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgZXhpc3RzCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDMzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY4CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCk6CiAgICBkaWcgMTQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlAMzQKICAgIGRpZyA3CiAgICBidXJ5IDkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzgKCmZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDM0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY5CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTcwCiAgICAvLyBuZXh0X2ludGVyZXN0X2Jhc2UgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzgKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDI5CiAgICAvLyBpZiBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKToKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzMAogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKToKICAgIGRpZyAxNAogICAgcHVzaGludCAxOQogICAgPT0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDIyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzEKICAgIC8vIHJldHVybiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzIKICAgIC8vIGludGVyZXN0X2R1ZSA9IHNlbGYuYWNjcnVlZF9pbnRlcmVzdCArIHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZGlnIDE2CiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBidXJ5IDE4CiAgICArCiAgICBkdXAKICAgIGJ1cnkgMTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzMwogICAgLy8gaWYgc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIDw9IGludGVyZXN0X2R1ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIGV4aXN0cwogICAgPj0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDI0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzQKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzUKICAgIC8vIHByaW5jaXBhbF9hbW91bnQgPSBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gLSBpbnRlcmVzdF9kdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIGV4aXN0cwogICAgZGlnIDEwCiAgICAtCiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDM2CiAgICAvLyBpZiBwcmluY2lwYWxfYW1vdW50ID4gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWw6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgID4KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDI2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzcKICAgIC8vIHJldHVybiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjY6CiAgICBkaWcgNgogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTIKICAgIC8vIHByaW5jaXBhbF9hbW91bnRfZHVlID0gc2VsZi5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudChlbnRyeSkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnRAMjgKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDI3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDQwCiAgICAvLyBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA8PSBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZGlnIDE1CiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBkdXAyCiAgICA8PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDM5LTQ0MQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA8PSBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NDIKICAgIC8vIHJldHVybiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCAtIGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBzd2FwCiAgICAtCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MTUKICAgIC8vIHJldHVybiBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgKyBzZWxmLl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KGVudHJ5KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgIGRpZyAxNgogICAgY2FsbHN1YiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudAogICAgYnVyeSAxOAogICAgKwogICAgYnVyeSAxMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTUxCiAgICAvLyBpbnRlcmVzdF9hbW91bnRfZHVlID0gc2VsZi5fZW50cnlfaW50ZXJlc3RfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfaW50ZXJlc3RfYW1vdW50QDE2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAMTE6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTAwCiAgICAvLyBhc3NlcnQgcHJvY2Vzc2VkX2V2ZW50cyA+IFVJbnQ2NCgwKSwgZXJyLk5PX0RVRV9DQVNIRkxPVwogICAgZGlnIDQKICAgIGR1cAogICAgYXNzZXJ0IC8vIE5vIGR1ZSBjYXNoZmxvdyB0byBwYXkKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMDQKICAgIC8vIHRvdGFsX2Z1bmRlZD1mdW5kZWRfaW50ZXJlc3QgKyBmdW5kZWRfcHJpbmNpcGFsLAogICAgZGlnIDE0CiAgICBkdXAKICAgIGRpZyAxNQogICAgZHVwCiAgICBjb3ZlciAzCiAgICArCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA2CiAgICAvLyB0aW1lc3RhbXA9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTAxLTEwNwogICAgLy8gcmV0dXJuIHR5cC5DYXNoRnVuZGluZ1Jlc3VsdCgKICAgIC8vICAgICBmdW5kZWRfaW50ZXJlc3Q9ZnVuZGVkX2ludGVyZXN0LAogICAgLy8gICAgIGZ1bmRlZF9wcmluY2lwYWw9ZnVuZGVkX3ByaW5jaXBhbCwKICAgIC8vICAgICB0b3RhbF9mdW5kZWQ9ZnVuZGVkX2ludGVyZXN0ICsgZnVuZGVkX3ByaW5jaXBhbCwKICAgIC8vICAgICBwcm9jZXNzZWRfZXZlbnRzPXByb2Nlc3NlZF9ldmVudHMsCiAgICAvLyAgICAgdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUA1MzoKICAgIGludGNfMCAvLyAwCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDU0CgoKLy8gbW9kdWxlcy5wYXltZW50X2FnZW50LlBheW1lbnRBZ2VudC5jbGFpbV9kdWVfY2FzaGZsb3dzW3JvdXRpbmddKCkgLT4gdm9pZDoKY2xhaW1fZHVlX2Nhc2hmbG93czoKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cG4gMgogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNQogICAgLy8gaWYgc2VsZi5vcF9kYWVtb24udmFsdWUgIT0gR2xvYmFsLnplcm9fYWRkcmVzczoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNiAvLyAweDUyM2E0ZjUwNDQyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wX2RhZW1vbiBleGlzdHMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE3CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjYgLy8gMHg1MjNhNGY1MDQ0MjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcF9kYWVtb24gZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE3LTE5CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIGJueiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfdHJ1ZUAxNAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE4CiAgICAvLyBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgdHhuIFNlbmRlcgogICAgZGlnIDMKICAgID09CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTctMTkKICAgIC8vIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICAvLyBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgYm56IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDE0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTkKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCAzMgogICAgPT0KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNy0xOQogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICBieiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VAMTUKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDE0OgogICAgaW50Y18xIC8vIDEKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUAxNjoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNi0yMAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyAgICAgb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vICAgICBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgLy8gKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCgpjbGFpbV9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTc6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTM5CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE0MAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDcKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTQzCiAgICAvLyBzZWxmLl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKGhvbGRpbmdfYWRkcmVzcykKICAgIGRpZyAyCiAgICBkdXAKICAgIGNhbGxzdWIgX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNDQKICAgIC8vIHNlbGYuX3NldHRsZV9wb3NpdGlvbihob2xkaW5nX2FkZHJlc3MpCiAgICBjYWxsc3ViIF9zZXR0bGVfcG9zaXRpb24KICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExNwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY2xhaW1hYmxlX2ludGVyZXN0CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBkdXAKICAgIHB1c2hpbnQgNzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExOAogICAgLy8gKyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jbGFpbWFibGVfcHJpbmNpcGFsCiAgICBkdXAKICAgIHB1c2hpbnQgODEKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExNy0xMTgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNsYWltYWJsZV9pbnRlcmVzdAogICAgLy8gKyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jbGFpbWFibGVfcHJpbmNpcGFsCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTQ2CiAgICAvLyBhc3NlcnQgdG90YWxfYW1vdW50ID4gVUludDY0KDApLCBlcnIuTk9fRFVFX0NBU0hGTE9XCiAgICBhc3NlcnQgLy8gTm8gZHVlIGNhc2hmbG93IHRvIHBheQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI1CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MuaXNfb3B0ZWRfaW4oCiAgICBleHRyYWN0IDAgMzIKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNgogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNS0yNwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLmlzX29wdGVkX2luKAogICAgLy8gICAgIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZAogICAgLy8gKQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNS0yOAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLmlzX29wdGVkX2luKAogICAgLy8gICAgIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZAogICAgLy8gKQogICAgLy8gYW5kIG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQKICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAyNAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI4CiAgICAvLyBhbmQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCAzODQKICAgIGdldGJpdAogICAgYm56IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAyNAogICAgaW50Y18xIC8vIDEKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUAyNToKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNTEKICAgIC8vIGlmIHNlbGYuX2lzX3BheW1lbnRfZXhlY3V0YWJsZShob2xkaW5nX2FkZHJlc3MpOgogICAgYnogY2xhaW1fZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozNAogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIHN3YXAKICAgIGRpZyAxCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozNC0zNQogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIC8vID49IHBheW1lbnRfYW1vdW50CiAgICBkaWcgNQogICAgZHVwCiAgICBjb3ZlciAyCiAgICA+PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjMzLTM2CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICAvLyAgICAgPj0gcGF5bWVudF9hbW91bnQKICAgIC8vICksIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcyBmb3IgdGhlIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNTMKICAgIC8vIHNlbGYuX3BheShzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MsIHRvdGFsX2Ftb3VudCkKICAgIGRpZyAyCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBkdXAKICAgIGV4dHJhY3QgMCAzMgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQwLTQ1CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9cmVjZWl2ZXIsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWFtb3VudCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQ0CiAgICAvLyBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgdW5jb3ZlciAzCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIHVuY292ZXIgMgogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0MAogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgcHVzaGludCA0IC8vIGF4ZmVyCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQwLTQ1CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9cmVjZWl2ZXIsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWFtb3VudCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMjUtMTI2CiAgICAvLyAjIEdldCB0aGUgY2xhaW1hYmxlIGFtb3VudHMgYmVmb3JlIHJlc2V0CiAgICAvLyBpbnRlcmVzdF9hbW91bnQgPSBwb3NpdGlvbi5jbGFpbWFibGVfaW50ZXJlc3QKICAgIGR1cAogICAgcHVzaGludCA3MwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSA5CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTI3CiAgICAvLyBwcmluY2lwYWxfYW1vdW50ID0gcG9zaXRpb24uY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgZHVwCiAgICBwdXNoaW50IDgxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAzCiAgICBidXJ5IDkKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMjktMTMwCiAgICAvLyAjIFJlc2V0IHRoZSBwb3NpdGlvbidzIGNsYWltYWJsZSBhbW91bnRzCiAgICAvLyBwb3NpdGlvbi5jbGFpbWFibGVfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBpdG9iCiAgICBzd2FwCiAgICBkaWcgMQogICAgcmVwbGFjZTIgNzMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzEKICAgIC8vIHBvc2l0aW9uLmNsYWltYWJsZV9wcmluY2lwYWwgPSBVSW50NjQoMCkKICAgIHN3YXAKICAgIHJlcGxhY2UyIDgxCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTMyCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHBvc2l0aW9uLmNvcHkoKQogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTM0CiAgICAvLyBhc3NlcnQgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCA+PSBpbnRlcmVzdF9hbW91bnQsIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX2ludGVyZXN0IGV4aXN0cwogICAgZHVwCiAgICBkaWcgMgogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzNQogICAgLy8gYXNzZXJ0IHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsID49IHByaW5jaXBhbF9hbW91bnQsIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICBkaWcgMwogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzNy0xMzgKICAgIC8vICMgVXBkYXRlIHRoZSBnbG9iYWwgcmVzZXJ2ZWQgaW50ZXJlc3QgYW5kIHByaW5jaXBhbCBhbW91bnRzCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0IC09IGludGVyZXN0X2Ftb3VudAogICAgc3dhcAogICAgLQogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzkKICAgIC8vIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIC09IHByaW5jaXBhbF9hbW91bnQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIHN3YXAKICAgIC0KICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKY2xhaW1fZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTU5CiAgICAvLyB0b3RhbF9hbW91bnQ9aW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudCwKICAgIGRpZyA1CiAgICBkdXAKICAgIGRpZyA2CiAgICBkdXAKICAgIGNvdmVyIDMKICAgICsKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNjAKICAgIC8vIHRpbWVzdGFtcD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNTYtMTYyCiAgICAvLyByZXR1cm4gdHlwLkNhc2hDbGFpbVJlc3VsdCgKICAgIC8vICAgICBpbnRlcmVzdF9hbW91bnQ9aW50ZXJlc3RfYW1vdW50LAogICAgLy8gICAgIHByaW5jaXBhbF9hbW91bnQ9cHJpbmNpcGFsX2Ftb3VudCwKICAgIC8vICAgICB0b3RhbF9hbW91bnQ9aW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudCwKICAgIC8vICAgICB0aW1lc3RhbXA9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgY29udGV4dD1wYXltZW50X2luZm8sCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgMgogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIHB1c2hieXRlcyAweDAwMjIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAyNDoKICAgIGludGNfMCAvLyAwCiAgICBiIGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUAyNQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX2ZhbHNlQDE1OgogICAgaW50Y18wIC8vIDAKICAgIGIgY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDE2CgoKLy8gbW9kdWxlcy50cmFuc2Zlcl9hZ2VudC5UcmFuc2ZlckFnZW50LnRyYW5zZmVyX3NldF9zY2hlZHVsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRyYW5zZmVyX3NldF9zY2hlZHVsZToKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo0MAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQxCiAgICAvLyBhc3NlcnQgb3Blbl9kYXRlIDwgY2xvc3VyZV9kYXRlLCBlcnIuSU5WQUxJRF9TT1JUSU5HCiAgICBkdXAyCiAgICA8CiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbXVzdCBiZSBzb3J0ZWQgaW4gc3RyaWN0bHkgYXNjZW5kaW5nIG9yZGVyCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQzCiAgICAvLyBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA9IG9wZW5fZGF0ZQogICAgYnl0ZWMgMjggLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIHVuY292ZXIgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDQKICAgIC8vIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlID0gY2xvc3VyZV9kYXRlCiAgICBieXRlYyAyOSAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDUKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy50cmFuc2Zlcl9hZ2VudC5UcmFuc2ZlckFnZW50LnByaW1hcnlfZGlzdHJpYnV0aW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcHJpbWFyeV9kaXN0cmlidXRpb246CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjcxCiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5wcmltYXJ5X2RlYWxlciwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDIyIC8vIDB4NTIzYTUwNTk0NDIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojc2CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo3NwogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojc4CiAgICAvLyBhc3NlcnQgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TRUQKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBjbG9zZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgY292ZXIgMwogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4MAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChob2xkaW5nX2FkZHJlc3MpCiAgICBzd2FwCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjgxCiAgICAvLyBhc3NlcnQgdW5pdHMgPiBVSW50NjQoMCksIGVyci5aRVJPX1VOSVRTCiAgICBkdXAKICAgIGFzc2VydCAvLyBDYW4gbm90IGRpc3RyaWJ1dGUgemVybyB1bml0cwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4MwogICAgLy8gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCArIHVuaXRzIDw9IHNlbGYudG90YWxfdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICArCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgPD0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODItODQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCArIHVuaXRzIDw9IHNlbGYudG90YWxfdW5pdHMKICAgIC8vICksIGVyci5PVkVSX0RJU1RSSUJVVElPTgogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCByZW1haW5pbmcgRC1BU0EgdW5pdHMKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODUKICAgIC8vIGlmIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI3IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlIGV4aXN0cwogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojg3CiAgICAvLyBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8PSBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI3IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlIGV4aXN0cwogICAgPD0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODYtODgKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPD0gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGUKICAgIC8vICksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TRUQKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBjbG9zZWQKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNDgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnJlc2VydmVkX3VuaXRzICs9IHVuaXRzCiAgICBkdXBuIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDMKICAgIGR1cAogICAgY292ZXIgMwogICAgKwogICAgaXRvYgogICAgcHVzaGludCA0MAogICAgc3dhcAogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6OTEKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgKz0gdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICArCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6OTIKICAgIC8vIHJldHVybiBzZWxmLnRvdGFsX3VuaXRzIC0gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIHN3YXAKICAgIC0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMudHJhbnNmZXJfYWdlbnQuVHJhbnNmZXJBZ2VudC50cmFuc2Zlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnRyYW5zZmVyOgogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTMwCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxMzEKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQ3CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuX3N0YXR1c19pc19wZW5kaW5nX2llZCgpLCBlcnIuUEVORElOR19JRUQKICAgICEKICAgIGFzc2VydCAvLyBJRUQgbm90IHlldCBleGVjdXRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxMwogICAgLy8gaWYgc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjggLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICBieiB0cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTUKICAgIC8vIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjggLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNC0xNgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gKSwgZXJyLkNMT1NFRF9UUkFOU0ZFUgogICAgYXNzZXJ0IC8vIFRyYW5zZmVyIGlzIGNsb3NlZAoKdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNwogICAgLy8gaWYgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjkgLy8gInRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICBieiB0cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTkKICAgIC8vIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDwgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGUKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyOSAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIDwKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTgtMjAKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZQogICAgLy8gKSwgZXJyLkNMT1NFRF9UUkFOU0ZFUgogICAgYXNzZXJ0IC8vIFRyYW5zZmVyIGlzIGNsb3NlZAoKdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxMzUKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIGRpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA4CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIGJ5dGVjIDggLy8gMHg0MTIzCiAgICBkaWcgNQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA5CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjEzOAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChzZW5kZXJfaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDIKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTM5CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGR1cAogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNDAKICAgIC8vIGFzc2VydCBzZW5kZXJfaG9sZGluZ19hZGRyZXNzICE9IHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcywgZXJyLlNFTEZfVFJBTlNGRVIKICAgIHVuY292ZXIgMgogICAgIT0KICAgIGFzc2VydCAvLyBTZW5kZXIgYW5kIHJlY2VpdmVyIG11c3QgYmUgZGlmZmVyZW50CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE0MQogICAgLy8gYXNzZXJ0IHVuaXRzID4gVUludDY0KDApLCBlcnIuTlVMTF9UUkFOU0ZFUgogICAgZGlnIDEKICAgIGR1cAogICAgYXNzZXJ0IC8vIFRyYW5zZmVyIHVuaXRzIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTQyCiAgICAvLyBhc3NlcnQgdW5pdHMgPD0gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLCBlcnIuT1ZFUl9UUkFOU0ZFUgogICAgc3dhcAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIDw9CiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IHNlbmRlciB1bml0cyB0byB0cmFuc2ZlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzYzCiAgICAvLyBpZiBzZWxmLmV2ZW50X2N1cnNvciA+PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICA+PQogICAgYm56IHRyYW5zZmVyX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Fzc2VydF9ub19kdWVfZXZlbnRfcGVuZGluZ0AxMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzY1CiAgICAvLyBuZXh0X2VudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KHNlbGYuZXZlbnRfY3Vyc29yKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc2NwogICAgLy8gbmV4dF9lbnRyeS5zY2hlZHVsZWRfdGltZSA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NjYtNzY4CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIG5leHRfZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gKSwgZXJyLlBFTkRJTkdfQUNUVVNfRVZFTlQKICAgIGFzc2VydCAvLyBBQ1RVUyBldmVudCBub3QgeWV0IGV4ZWN1dGVkCgp0cmFuc2Zlcl9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9hc3NlcnRfbm9fZHVlX2V2ZW50X3BlbmRpbmdAMTA6CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE0NQogICAgLy8gc2VsZi5fZW5zdXJlX3VuaXRzX2FjdGl2YXRlZChzZW5kZXJfaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDMKICAgIGR1cAogICAgY2FsbHN1YiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNDYKICAgIC8vIHNlbGYuX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQocmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgY2FsbHN1YiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNDcKICAgIC8vIHNlbGYuX3NldHRsZV9wb3NpdGlvbihzZW5kZXJfaG9sZGluZ19hZGRyZXNzKQogICAgY2FsbHN1YiBfc2V0dGxlX3Bvc2l0aW9uCiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTQ4CiAgICAvLyBzZWxmLl9zZXR0bGVfcG9zaXRpb24ocmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzKQogICAgY2FsbHN1YiBfc2V0dGxlX3Bvc2l0aW9uCiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNTIKICAgIC8vIGFzc2VydCB1bml0cyA8PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cywgZXJyLk9WRVJfVFJBTlNGRVIKICAgIGRpZyA1CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkaWcgMQogICAgPD0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgc2VuZGVyIHVuaXRzIHRvIHRyYW5zZmVyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTUzCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyAtPSB1bml0cwogICAgZGlnIDEKICAgIC0KICAgIGl0b2IKICAgIHVuY292ZXIgMgogICAgaW50Y18zIC8vIDMyCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTQ0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyArPSB1bml0cwogICAgZGlnIDUKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIHVuY292ZXIgMgogICAgKwogICAgaXRvYgogICAgaW50Y18zIC8vIDMyCiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfc3VzcGVuc2lvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfc3VzcGVuc2lvbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojc3CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyMSAvLyAweDUyM2E0MTU1NTQyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE4NQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkID0gc3VzcGVuZGVkCiAgICBkdXAKICAgIHB1c2hpbnQgNDgKICAgIGludGNfMSAvLyAxCiAgICBib3hfZXh0cmFjdAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMwogICAgc2V0Yml0CiAgICBwdXNoaW50IDQ4CiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE4NgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTY1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5hY2NvdW50X29wZW5bcm91dGluZ10oKSAtPiB2b2lkOgphY2NvdW50X29wZW46CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjgKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmFjY291bnRfbWFuYWdlciwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDIzIC8vIDB4NTIzYTRkNGU0NzIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzkKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0VOREVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDIwMAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTAKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX2VuZGVkKCksIGVyci5VTkFVVEhPUklaRUQKICAgICEKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxMQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTIKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjEzCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozNAogICAgLy8gdW5pdHM9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozMi00MgogICAgLy8gcmV0dXJuIHR5cC5BY2NvdW50UG9zaXRpb24oCiAgICAvLyAgICAgcGF5bWVudF9hZGRyZXNzPXBheW1lbnRfYWRkcmVzcywKICAgIC8vICAgICB1bml0cz1VSW50NjQoMCksCiAgICAvLyAgICAgcmVzZXJ2ZWRfdW5pdHM9VUludDY0KDApLAogICAgLy8gICAgIHN1c3BlbmRlZD1GYWxzZSwKICAgIC8vICAgICBzZXR0bGVkX2N1cnNvcj1VSW50NjQoMCksCiAgICAvLyAgICAgaW50ZXJlc3RfY2hlY2twb2ludD1VSW50NjQoMCksCiAgICAvLyAgICAgcHJpbmNpcGFsX2NoZWNrcG9pbnQ9VUludDY0KDApLAogICAgLy8gICAgIGNsYWltYWJsZV9pbnRlcmVzdD1VSW50NjQoMCksCiAgICAvLyAgICAgY2xhaW1hYmxlX3ByaW5jaXBhbD1VSW50NjQoMCksCiAgICAvLyApCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGJ5dGVjIDQwIC8vIDB4MDAKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjE0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHNlbGYuX25ld19hY2NvdW50X3Bvc2l0aW9uKHBheW1lbnRfYWRkcmVzcykKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTUKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjM4CiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIHVuY292ZXIgMwogICAgPT0KICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIzOQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDAKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQxCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MgPSBwYXltZW50X2FkZHJlc3MKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQyCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfZ2V0X3Bvc2l0aW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF9nZXRfcG9zaXRpb246CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNTkKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9jcmVhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9jcmVhdGU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDE5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAzMwogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IGFycmFuZ2VyCiAgICBieXRlYyAxOCAvLyAweDUyM2E0MTUyNTIyMwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMzQKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAxOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfY29uZmlnW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfY29uZmlnOgogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBsZW4KICAgIHB1c2hpbnQgMTA3CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLk5vcm1hbGl6ZWRBY3R1c1Rlcm1zCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgcHVzaGludCA3MgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5Jbml0aWFsS2VybmVsU3RhdGUKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBsZW4KICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIHR1cGxlIGVuY29kaW5nCiAgICBkdXAKICAgIHB1c2hpbnQgMzQKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCB0YWlsIHBvaW50ZXIgYXQgaW5kZXggMSBvZiAodWludDhbMzJdLChsZW4rdXRmOFtdKSkKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgY292ZXIgMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMzYKICAgICsKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuUHJvc3BlY3R1cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2NgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDY4LTEwNjkKICAgIC8vICMgQ29uZmlndXJlIENvbnRyYWN0CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPSB0ZXJtcy5jb250cmFjdF90eXBlLmFzX3VpbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgYnogY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUA3CiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIyMAogICAgLy8gVUludDY0KGVudW1zLkNUX0FOTiksCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIxCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfTkFNKSwKICAgIHB1c2hpbnQgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIyCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfTEFNKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIzCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfTEFYKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjI0CiAgICAvLyBVSW50NjQoZW51bXMuQ1RfQ0xNKSwKICAgIHB1c2hpbnQgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJ6IGNvbnRyYWN0X2NvbmZpZ19ib29sX2ZhbHNlQDgKCmNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANzoKICAgIGludGNfMSAvLyAxCgpjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUA5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjI5CiAgICAvLyBhc3NlcnQgc2VsZi5faXNfc3VwcG9ydGVkX2NvbnRyYWN0X3R5cGUoY29udHJhY3RfdHlwZSksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3MQogICAgLy8gc2VsZi5fc3RvcmVfY29udHJhY3RfY29uZmlnKHNlbGYuY29udHJhY3RfdHlwZSwgdGVybXMsIGluaXRpYWxfc3RhdGUpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgYnVyeSAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzI1CiAgICAvLyBhc3NlcnQgdGVybXMuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZGlnIDQKICAgIGR1cAogICAgcHVzaGludCAzMwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSA4CiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMjcKICAgIC8vIHRlcm1zLmRheV9jb3VudF9jb252ZW50aW9uLmFzX3VpbnQ2NCgpCiAgICBwdXNoaW50IDU3CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICBieiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDE2CiAgICBkaWcgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk5CiAgICAvLyBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI5Ny0zMDMKICAgIC8vIHJldHVybiBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzYwKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwSVNEQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjApLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDE2CiAgICBkaWcgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzAwCiAgICAvLyBVSW50NjQoZW51bXMuRENDX0EzNjUpLAogICAgcHVzaGludCAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyOTctMzAzCiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgID09CiAgICBibnogY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUAxNgogICAgZGlnIDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMwMQogICAgLy8gVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGRpZyA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDIKICAgIC8vIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICA9PQogICAgYnogY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAMTcKCmNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTY6CiAgICBpbnRjXzEgLy8gMQoKY29udHJhY3RfY29uZmlnX2Jvb2xfbWVyZ2VAMTg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDktMzExCiAgICAvLyBhc3NlcnQgc2VsZi5faXNfc3VwcG9ydGVkX2RheV9jb3VudF9jb252ZW50aW9uKAogICAgLy8gICAgIGRheV9jb3VudF9jb252ZW50aW9uCiAgICAvLyApLCBlcnIuSU5WQUxJRF9EQVlfQ09VTlRfQ09OVkVOVElPTgogICAgYXNzZXJ0IC8vIEludmFsaWQgZGF5LWNvdW50IGNvbnZlbnRpb24gSUQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMyOQogICAgLy8gaWYgY29udHJhY3RfdHlwZSAhPSBVSW50NjQoZW51bXMuQ1RfQU5OKToKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgICE9CiAgICBieiBjb250cmFjdF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzMwCiAgICAvLyBhc3NlcnQgbm90IHRlcm1zLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24sIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZGlnIDQKICAgIHB1c2hpbnQgNzg2CiAgICBnZXRiaXQKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KCmNvbnRyYWN0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDIwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODA3CiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIEQtQVNBIGFscmVhZHkgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODA4CiAgICAvLyBhc3NlcnQgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCA9PSBVSW50NjQoMCksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMCAvLyAiaW5pdGlhbF9leGNoYW5nZV9hbW91bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTAtODExCiAgICAvLyAjIFNldCBEZW5vbWluYXRpb24gQXNzZXQKICAgIC8vIHNlbGYuX2Fzc2VydF9kZW5vbWluYXRpb25fYXNzZXQodGVybXMuZGVub21pbmF0aW9uX2Fzc2V0X2lkKQogICAgZGlnIDQKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NzUtNzc2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIGRlbm9taW5hdGlvbiB3aXRoIEFTQQogICAgLy8gX2NyZWF0b3IsIGV4aXN0cyA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X2NyZWF0b3IoZGVub21pbmF0aW9uX2Fzc2V0X2lkKQogICAgZHVwCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q3JlYXRvcgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NzcKICAgIC8vIGFzc2VydCBleGlzdHMsIGVyci5JTlZBTElEX0RFTk9NSU5BVElPTgogICAgYXNzZXJ0IC8vIERlbm9taW5hdGlvbiBhc3NldCBpcyBub3QgcHJvcGVybHkgc2V0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODAKICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICBieXRlYyA0NCAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTQtODE1CiAgICAvLyAjIFNldCBTZXR0bGVtZW50IEFzc2V0CiAgICAvLyBzZWxmLl9hc3NlcnRfc2V0dGxlbWVudF9hc3NldCh0ZXJtcy5zZXR0bGVtZW50X2Fzc2V0X2lkKQogICAgZGlnIDEKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc4NQogICAgLy8gc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODMtNzg2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc2V0dGxlbWVudCBhc3NldCBpcyB0aGUgZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQgPT0gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIC8vICksIGVyci5JTlZBTElEX1NFVFRMRU1FTlRfQVNTRVQKICAgIGFzc2VydCAvLyBEaWZmZXJlbnQgc2V0dGxlbWVudCBhc3NldCBub3Qgc3VwcG9ydGVkLCBtdXN0IGJlIGVxdWFsIHRvIGRlbm9taW5hdGlvbiBhc3NldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Nzg5CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBzZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkwLTc5NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhc3NldF9hbW91bnQ9MCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Nzk1CiAgICAvLyBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkzCiAgICAvLyBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc5NAogICAgLy8gYXNzZXRfYW1vdW50PTAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkwLTc5MQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3OTAtNzk2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODE4LTgxOQogICAgLy8gIyBVbml0cwogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IHRlcm1zLnRvdGFsX3VuaXRzCiAgICBkdXAKICAgIHB1c2hpbnQgMTcKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODIwCiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID0gVUludDY0KDApCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgyMi04MjMKICAgIC8vICMgRGF5LUNvdW50IENvbnZlbnRpb25zCiAgICAvLyBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uID0gdGVybXMuZGF5X2NvdW50X2NvbnZlbnRpb24uYXNfdWludDY0KCkKICAgIGJ5dGVjIDQ2IC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGRpZyA4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODI1LTgyNgogICAgLy8gIyBUaW1lCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA9IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZQogICAgZHVwCiAgICBwdXNoaW50IDQxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMjcgLy8gImluaXRpYWxfZXhjaGFuZ2VfZGF0ZSIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODI3CiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSB0ZXJtcy5tYXR1cml0eV9kYXRlCiAgICBkaWcgMQogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDQ1IC8vICJtYXR1cml0eV9kYXRlIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MjgKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IGluaXRpYWxfc3RhdGUubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZGlnIDYKICAgIGR1cAogICAgY292ZXIgMgogICAgcHVzaGludCA0OAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzMC04MzEKICAgIC8vICMgUHJpbmNpcGFsCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID0gdGVybXMuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGRpZyAxMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzMgogICAgLy8gc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gdGVybXMuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZGlnIDMKICAgIHB1c2hpbnQgNzg2CiAgICBnZXRiaXQKICAgIGJ5dGVjIDM0IC8vICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzMwogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBpbml0aWFsX3N0YXRlLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZGlnIDEKICAgIHB1c2hpbnQgMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODM1LTgzNgogICAgLy8gIyBJbnRlcmVzdAogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ID0gaW5pdGlhbF9zdGF0ZS5hY2NydWVkX2ludGVyZXN0CiAgICBkaWcgMQogICAgcHVzaGludCA0MAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODM4LTgzOQogICAgLy8gIyBJbnRlcmVzdCBSYXRlCiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IGluaXRpYWxfc3RhdGUubm9taW5hbF9pbnRlcmVzdF9yYXRlCiAgICBkaWcgMQogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0MAogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gaW5pdGlhbF9zdGF0ZS5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlCiAgICBkaWcgMQogICAgcHVzaGludCAyNAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQxCiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkID0gdGVybXMucmF0ZV9yZXNldF9zcHJlYWQKICAgIGRpZyAzCiAgICBwdXNoaW50IDU4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzUgLy8gInJhdGVfcmVzZXRfc3ByZWFkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0MgogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIgPSB0ZXJtcy5yYXRlX3Jlc2V0X211bHRpcGxpZXIKICAgIGRpZyAzCiAgICBwdXNoaW50IDY2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzYgLy8gInJhdGVfcmVzZXRfbXVsdGlwbGllciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDMKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9mbG9vciA9IHRlcm1zLnJhdGVfcmVzZXRfZmxvb3IKICAgIGRpZyAzCiAgICBwdXNoaW50IDc0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzAgLy8gInJhdGVfcmVzZXRfZmxvb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQ0CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfY2FwID0gdGVybXMucmF0ZV9yZXNldF9jYXAKICAgIGRpZyAzCiAgICBwdXNoaW50IDgyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzEgLy8gInJhdGVfcmVzZXRfY2FwIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0NQogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X25leHQgPSB0ZXJtcy5yYXRlX3Jlc2V0X25leHQKICAgIGRpZyAzCiAgICBwdXNoaW50IDkwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzcgLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDYKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgPSB0ZXJtcy5oYXNfcmF0ZV9yZXNldF9mbG9vcgogICAgZGlnIDMKICAgIHB1c2hpbnQgNzg0CiAgICBnZXRiaXQKICAgIGJ5dGVjIDM4IC8vICJoYXNfcmF0ZV9yZXNldF9mbG9vciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDcKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwID0gdGVybXMuaGFzX3JhdGVfcmVzZXRfY2FwCiAgICBkaWcgMwogICAgcHVzaGludCA3ODUKICAgIGdldGJpdAogICAgYnl0ZWMgMzkgLy8gImhhc19yYXRlX3Jlc2V0X2NhcCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDktODUwCiAgICAvLyAjIFNjYWxpbmcKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgPSB0ZXJtcy5maXhlZF9wb2ludF9zY2FsZQogICAgdW5jb3ZlciAzCiAgICBwdXNoaW50IDk5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODUyLTg1MwogICAgLy8gIyBTY2hlZHVsZSBQcm9jZXNzaW5nCiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciA9IGluaXRpYWxfc3RhdGUuZXZlbnRfY3Vyc29yCiAgICBkaWcgMQogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU1LTg1NgogICAgLy8gIyBQZXItVW5pdCBGaXhlZC1Qb2ludCBJbmRleGVzCiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggPSBpbml0aWFsX3N0YXRlLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgKICAgIGRpZyAxCiAgICBwdXNoaW50IDU2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU3CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4ID0gaW5pdGlhbF9zdGF0ZS5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleAogICAgZGlnIDEKICAgIHB1c2hpbnQgNjQKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU5LTg2MAogICAgLy8gIyBSZXNlcnZlZCBBbW91bnQgKGZvciBleGVjdXRlZCBjYXNoZmxvd3MpCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0ID0gVUludDY0KDApCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2MQogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2MwogICAgLy8gYXNzZXJ0IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLCBlcnIuSU5WQUxJRF9JRUQKICAgIGRpZyAyCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICBhc3NlcnQgLy8gSUVEIG11c3QgYmUgc2V0IGluIHRoZSBmdXR1cmUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2NAogICAgLy8gYXNzZXJ0IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA+IGluaXRpYWxfc3RhdGUuc3RhdHVzX2RhdGUsIGVyci5JTlZBTElEX0lFRAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgPAogICAgYXNzZXJ0IC8vIElFRCBtdXN0IGJlIHNldCBpbiB0aGUgZnV0dXJlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NjUKICAgIC8vIGFzc2VydCB0ZXJtcy5pbml0aWFsX2V4Y2hhbmdlX2RhdGUgPCB0ZXJtcy5tYXR1cml0eV9kYXRlLCBlcnIuSU5WQUxJRF9JRUQKICAgIDwKICAgIGFzc2VydCAvLyBJRUQgbXVzdCBiZSBzZXQgaW4gdGhlIGZ1dHVyZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3My0xMDc0CiAgICAvLyAjIE5vdGFyaXplIHByb3NwZWN0dXMgKG9wdGlvbmFsKQogICAgLy8gc2VsZi5wcm9zcGVjdHVzX2hhc2ggPSBwcm9zcGVjdHVzLmhhc2guYnl0ZXMKICAgIGRpZyAyCiAgICBleHRyYWN0IDAgMzIKICAgIGJ5dGVjIDQyIC8vICJwcm9zcGVjdHVzX2hhc2giCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3NQogICAgLy8gc2VsZi5wcm9zcGVjdHVzX3VybCA9IHByb3NwZWN0dXMudXJsCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGVjIDQzIC8vICJwcm9zcGVjdHVzX3VybCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc2CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAMTc6CiAgICBpbnRjXzAgLy8gMAogICAgYiBjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUAxOAoKY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAODoKICAgIGludGNfMCAvLyAwCiAgICBiIGNvbnRyYWN0X2NvbmZpZ19ib29sX21lcmdlQDkKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9zY2hlZHVsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X3NjaGVkdWxlOgogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHN3YXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBkdXAKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgMgogICAgKwogICAgdW5jb3ZlciAyCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLkV4ZWN1dGlvblNjaGVkdWxlRW50cnk+CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTEwCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMTMKICAgIC8vIGNvbnRyYWN0X3R5cGU9c2VsZi5jb250cmFjdF90eXBlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGNvdmVyIDMKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4ODEKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4ODItODg0CiAgICAvLyBhc3NlcnQgc2NoZWR1bGVfcGFnZS5sZW5ndGggPD0gVUludDY0KAogICAgLy8gICAgIGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUKICAgIC8vICksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGR1cAogICAgcHVzaGludCAxNgogICAgPD0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg4NQogICAgLy8gYXNzZXJ0IHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPiBVSW50NjQoMCksIGVyci5URVJNU19OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSB0ZXJtcyBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODg3CiAgICAvLyBwYWdlX2N1cnNvciA9IHNjaGVkdWxlX3BhZ2VfaW5kZXggKiBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkKICAgIHN3YXAKICAgIHB1c2hpbnQgMTYKICAgICoKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg5NAogICAgLy8gKyBwYWdlX2xlbmd0aCAqIFVJbnQ2NChjc3QuT1BfVVBfQ09OVFJBQ1RfQ09ORklHX1BFUl9FTlRSWV9CVURHRVQpCiAgICBwdXNoaW50IDEwMAogICAgKgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODkzCiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19CQVNFX0JVREdFVCkKICAgIGludGMgNCAvLyAxNTAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTMtODk0CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19CQVNFX0JVREdFVCkKICAgIC8vICsgcGFnZV9sZW5ndGggKiBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19QRVJfRU5UUllfQlVER0VUKQogICAgKwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODg5LTg5NgogICAgLy8gIyBWYWxpZGF0aW9uIGNvc3QgZ3Jvd3Mgd2l0aCBwYWdlIGxlbmd0aCwgc28gY29uZmlndXJhdGlvbiBleHBsaWNpdGx5CiAgICAvLyAjIGJ1eXMgZXh0cmEgb3Bjb2RlIGJ1ZGdldCBmb3IgbGFyZ2VyIHVwbG9hZHMuCiAgICAvLyBlbnN1cmVfYnVkZ2V0KAogICAgLy8gICAgIHJlcXVpcmVkX2J1ZGdldD0oCiAgICAvLyAgICAgICAgIFVJbnQ2NChjc3QuT1BfVVBfQ09OVFJBQ1RfQ09ORklHX0JBU0VfQlVER0VUKQogICAgLy8gICAgICAgICArIHBhZ2VfbGVuZ3RoICogVUludDY0KGNzdC5PUF9VUF9DT05UUkFDVF9DT05GSUdfUEVSX0VOVFJZX0JVREdFVCkKICAgIC8vICAgICApLAogICAgLy8gKQogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODk3CiAgICAvLyBpbmRleCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKCmNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEAyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODk4CiAgICAvLyB3aGlsZSBpbmRleCA8IHBhZ2VfbGVuZ3RoOgogICAgZHVwCiAgICBkaWcgNAogICAgPAogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfd2hpbGVAMTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg5OS05MDAKICAgIC8vIGVudHJ5ID0gc2NoZWR1bGVfcGFnZVtpbmRleF0uY29weSgpCiAgICAvLyBlbnRyeV9ldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZGlnIDQKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGJ1cnkgMTIKICAgIGRpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgNjUKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTAwCiAgICAvLyBlbnRyeV9ldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTktOTAwCiAgICAvLyBlbnRyeSA9IHNjaGVkdWxlX3BhZ2VbaW5kZXhdLmNvcHkoKQogICAgLy8gZW50cnlfZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGludGNfMiAvLyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDAKICAgIC8vIGVudHJ5X2V2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBnZXRieXRlCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgMTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkwMQogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X2lkID09IHBhZ2VfY3Vyc29yICsgaW5kZXgsIGVyci5JTlZBTElEX0VWRU5UX0lECiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEzCiAgICBkaWcgNQogICAgdW5jb3ZlciA0CiAgICArCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDItOTA0CiAgICAvLyBzZWxmLl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBlbnRyeV9ldmVudF90eXBlCiAgICAvLyApCiAgICBkaWcgNQogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTA1CiAgICAvLyBhc3NlcnQgZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgc3dhcAogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDYKICAgIC8vIGlmIGVudHJ5LmV2ZW50X2lkID4gVUludDY0KDApOgogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDcKICAgIC8vIGlmIGluZGV4ID4gVUludDY0KDApOgogICAgZHVwCiAgICBieiBjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlANgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTA4CiAgICAvLyBwcmV2aW91c19lbnRyeSA9IHNjaGVkdWxlX3BhZ2VbaW5kZXggLSBVSW50NjQoMSldLmNvcHkoKQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgcHVzaGludCA2NQogICAgKgogICAgZGlnIDExCiAgICBzd2FwCiAgICBwdXNoaW50IDY1CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkyMwogICAgLy8gcHJldmlvdXNfZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gZW50cnkuc2NoZWR1bGVkX3RpbWUKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyA4CiAgICA8PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTIyLTkyNAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBwcmV2aW91c19lbnRyeS5zY2hlZHVsZWRfdGltZSA8PSBlbnRyeS5zY2hlZHVsZWRfdGltZQogICAgLy8gKSwgZXJyLklOVkFMSURfU09SVElORwogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIG11c3QgYmUgc29ydGVkIGluIHN0cmljdGx5IGFzY2VuZGluZyBvcmRlcgoKY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUA4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTI1CiAgICAvLyBpZiBlbnRyeS5ldmVudF9pZCA9PSBVSW50NjQoMCk6CiAgICBkaWcgOAogICAgYm56IGNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkyNi05MjgKICAgIC8vIGFzc2VydCBlbnRyeV9ldmVudF90eXBlID09IFVJbnQ2NCgKICAgIC8vICAgICBlbnVtcy5FVlRfSUVECiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGRpZyA5CiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjkKICAgIC8vIGluZGV4ICs9IFVJbnQ2NCgxKQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIGNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEAyCgpjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlANjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkxMC05MTIKICAgIC8vICMgVGhlIGZpcnN0IGVudHJ5IG9mIGEgcGFnZSBtdXN0IHN0aWxsIGJlIG9yZGVyZWQgYWZ0ZXIgdGhlCiAgICAvLyAjIGxhc3QgZW50cnkgb2YgdGhlIHByZXZpb3VzIHBhZ2UuCiAgICAvLyBhc3NlcnQgc2NoZWR1bGVfcGFnZV9pbmRleCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGRpZyA2CiAgICBkdXAKICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTMKICAgIC8vIHByZXZpb3VzX3BhZ2VfaW5kZXggPSBzY2hlZHVsZV9wYWdlX2luZGV4IC0gVUludDY0KDEpCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTE1CiAgICAvLyBwcmV2aW91c19wYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZQogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTQtOTE2CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHByZXZpb3VzX3BhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTctOTE4CiAgICAvLyBwcmV2aW91c19wYWdlID0gc2VsZi5zY2hlZHVsZV9wYWdlW3ByZXZpb3VzX3BhZ2VfaW5kZXhdLmNvcHkoKQogICAgLy8gYXNzZXJ0IHByZXZpb3VzX3BhZ2UubGVuZ3RoID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBwdXNoaW50IDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTgKICAgIC8vIGFzc2VydCBwcmV2aW91c19wYWdlLmxlbmd0aCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZHVwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjAKICAgIC8vIHByZXZpb3VzX3BhZ2UubGVuZ3RoIC0gVUludDY0KDEpCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTE5LTkyMQogICAgLy8gcHJldmlvdXNfZW50cnkgPSBwcmV2aW91c19wYWdlWwogICAgLy8gICAgIHByZXZpb3VzX3BhZ2UubGVuZ3RoIC0gVUludDY0KDEpCiAgICAvLyBdLmNvcHkoKQogICAgcHVzaGludCA2NQogICAgKgogICAgcHVzaGludCAyCiAgICArCiAgICBwdXNoaW50IDY1CiAgICBib3hfZXh0cmFjdAogICAgYiBjb250cmFjdF9zY2hlZHVsZV9hZnRlcl9pZl9lbHNlQDcKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX3doaWxlQDExOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjAwCiAgICAvLyBzZWxmLnNjaGVkdWxlX3BhZ2VbcGFnZV9pbmRleF0gPSBzY2hlZHVsZV9wYWdlLmNvcHkoKQogICAgZGlnIDYKICAgIGl0b2IKICAgIGJ5dGVjIDI0IC8vIDB4NTMyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgZGlnIDUKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzMgogICAgLy8gaWYgaXNfbGFzdF9wYWdlOgogICAgZGlnIDUKICAgIGJ6IGNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzNAogICAgLy8gc2NoZWR1bGVfcGFnZV9pbmRleCAqIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKSArIHBhZ2VfbGVuZ3RoCiAgICBkaWcgMQogICAgZGlnIDQKICAgICsKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzMwogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA9ICgKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTMzLTkzNQogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA9ICgKICAgIC8vICAgICBzY2hlZHVsZV9wYWdlX2luZGV4ICogVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpICsgcGFnZV9sZW5ndGgKICAgIC8vICkKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MzYKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgNTAKICAgIGFwcF9nbG9iYWxfcHV0Cgpjb250cmFjdF9zY2hlZHVsZV9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTExOAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9leGVjdXRlX2llZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X2V4ZWN1dGVfaWVkOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDMKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE0NAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDUKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTQ3CiAgICAvLyBhc3NlcnQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LCBlcnIuSU5WQUxJRF9FVkVOVF9DVVJTT1IKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgZGlnIDEKICAgID4KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGN1cnNvcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE0OAogICAgLy8gZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoc2VsZi5ldmVudF9jdXJzb3IpCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDkKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoZW51bXMuRVZUX0lFRCksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGR1cAogICAgZXh0cmFjdCA4IDEKICAgIGR1cAogICAgcHVzaGJ5dGVzIDB4MDEKICAgIGI9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1MwogICAgLy8gZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICBkaWcgMQogICAgZXh0cmFjdCAwIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTUKICAgIC8vIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgZGlnIDIKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTU2CiAgICAvLyBhY2NydWFsX2ZhY3Rvcj1lbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIGRpZyAzCiAgICBleHRyYWN0IDE3IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTcKICAgIC8vIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIGRpZyA0CiAgICBleHRyYWN0IDI1IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTkKICAgIC8vIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPWVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDUKICAgIGV4dHJhY3QgMzMgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE2MAogICAgLy8gbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgZGlnIDYKICAgIGV4dHJhY3QgNDEgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE2MQogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9ZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICBkaWcgNwogICAgZXh0cmFjdCA0OSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTYyCiAgICAvLyBmbGFncz1lbnRyeS5mbGFncywKICAgIGRpZyA4CiAgICBleHRyYWN0IDU3IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTItMTE2MwogICAgLy8gdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0KAogICAgLy8gICAgIGV2ZW50X2lkPWVudHJ5LmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1lbnRyeS5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1lbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPWVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9ZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPWVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGZsYWdzPWVudHJ5LmZsYWdzLAogICAgLy8gKSwKICAgIHVuY292ZXIgNwogICAgdW5jb3ZlciA4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNwogICAgY29uY2F0CiAgICB1bmNvdmVyIDYKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTgKICAgIC8vIG9ic2VydmVkX3JhdGU9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTItMTE2MwogICAgLy8gdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0KAogICAgLy8gICAgIGV2ZW50X2lkPWVudHJ5LmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1lbnRyeS5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1lbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPWVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9ZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPWVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGZsYWdzPWVudHJ5LmZsYWdzLAogICAgLy8gKSwKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTUwLTExNjQKICAgIC8vIHNlbGYuX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5KAogICAgLy8gICAgIGVudHJ5LAogICAgLy8gICAgIHR5cC5PYnNlcnZlZEV2ZW50UmVxdWVzdCgKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPWVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIG9ic2VydmVkX3JhdGU9VUludDY0KDApLAogICAgLy8gICAgICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1lbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1lbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICAgICAgZmxhZ3M9ZW50cnkuZmxhZ3MsCiAgICAvLyAgICAgKSwKICAgIC8vICkKICAgIGNhbGxzdWIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5CiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNjUKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEyMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuYXBwbHlfbm9uX2Nhc2hfZXZlbnRbcm91dGluZ10oKSAtPiB2b2lkOgphcHBseV9ub25fY2FzaF9ldmVudDoKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDQKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cG4gMgogICAgbGVuCiAgICBwdXNoaW50IDczCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLk9ic2VydmVkRXZlbnRSZXF1ZXN0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIwNAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMDUKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjA3CiAgICAvLyBpZiBwYXlsb2FkLmZsYWdzICYgVUludDY0KGVudW1zLkZMQUdfT0JTRVJWRURfRVZFTlQpOgogICAgcHVzaGludCA2NQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgcHVzaGludCA0CiAgICAmCiAgICBieiBhcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIzMwogICAgLy8gcmV0dXJuIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQ0xNKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICBwdXNoaW50IDUKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjA4CiAgICAvLyBhc3NlcnQgc2VsZi5fc3VwcG9ydHNfb2JzZXJ2ZWRfZXZlbnRzKCksIGVyci5PQlNFUlZFRF9FVkVOVF9SRVFVSVJFRAogICAgYXNzZXJ0IC8vIE9ic2VydmVkIGV2ZW50IHJlcXVpcmVkIHRvIGV4ZWN1dGUgdGhpcyBhY3Rpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMDkKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjMzCiAgICAvLyByZXR1cm4gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9DTE0pCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIGR1cAogICAgcHVzaGludCA1CiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQ1CiAgICAvLyBhc3NlcnQgc2VsZi5fc3VwcG9ydHNfb2JzZXJ2ZWRfZXZlbnRzKCksIGVyci5PQlNFUlZFRF9FVkVOVF9SRVFVSVJFRAogICAgYXNzZXJ0IC8vIE9ic2VydmVkIGV2ZW50IHJlcXVpcmVkIHRvIGV4ZWN1dGUgdGhpcyBhY3Rpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk0NgogICAgLy8gYXNzZXJ0IHBheWxvYWQuZXZlbnRfaWQgPT0gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGRpZyAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDcKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBpZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQ4CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUsIHBheWxvYWQuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgYnVyeSAxMgogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk0Ny05NDkKICAgIC8vIHNlbGYuX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIHNlbGYuY29udHJhY3RfdHlwZSwgcGF5bG9hZC5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICAvLyApCiAgICBjYWxsc3ViIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTUxCiAgICAvLyBwYWdlX2luZGV4ID0gc2VsZi5fc2NoZWR1bGVfcGFnZV9pbmRleChzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTkwCiAgICAvLyByZXR1cm4gZXZlbnRfaWQgLy8gVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpCiAgICBwdXNoaW50IDE2CiAgICAvCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTIKICAgIC8vIHBhZ2UgPSB0eXAuRXhlY3V0aW9uU2NoZWR1bGVQYWdlKCkKICAgIGJ5dGVjIDQ4IC8vIDB4MDAwMAogICAgYnVyeSA3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTMKICAgIC8vIGlmIHBhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlOgogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA5CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMjcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1NAogICAgLy8gcGFnZSA9IHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XS5jb3B5KCkKICAgIGRpZyA3CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidXJ5IDcKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX3BhZ2UgZW50cnkgZXhpc3RzCgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDI3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTU1CiAgICAvLyBhc3NlcnQgcGFnZS5sZW5ndGggPCBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGRpZyA1CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgMTYKICAgIDwKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2MAogICAgLy8gc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIGRpZyAzCiAgICBkdXAKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjEKICAgIC8vIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICBkaWcgMQogICAgZXh0cmFjdCAxNyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjIKICAgIC8vIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZGlnIDIKICAgIGV4dHJhY3QgMjUgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTYzCiAgICAvLyBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDMKICAgIGV4dHJhY3QgNDEgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTY0CiAgICAvLyBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIGRpZyA0CiAgICBleHRyYWN0IDQ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2NQogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIHVuY292ZXIgNQogICAgZXh0cmFjdCA1NyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTctOTY3CiAgICAvLyB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1wYXlsb2FkLmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9cGF5bG9hZC5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPXBheWxvYWQucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXBheWxvYWQubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICkKICAgIGRpZyAxMQogICAgaXRvYgogICAgZGlnIDE4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMwogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTYtOTY4CiAgICAvLyBwYWdlLmFwcGVuZCgKICAgIC8vICAgICB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9cGF5bG9hZC5ldmVudF9pZCwKICAgIC8vICAgICAgICAgZXZlbnRfdHlwZT1wYXlsb2FkLmV2ZW50X3R5cGUsCiAgICAvLyAgICAgICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIC8vICAgICAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICAgICApCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjkKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHBhZ2UuY29weSgpCiAgICBkaWcgOAogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk3MAogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjEyCiAgICAvLyBhc3NlcnQgZXZlbnRfaWQgPT0gc2VsZi5ldmVudF9jdXJzb3IsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBjdXJzb3IKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMTMKICAgIC8vIGVudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KGV2ZW50X2lkKQogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIxNQogICAgLy8gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgYnVyeSAxMAogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjQKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY1CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzYzLTM3MAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9SUiksCiAgICBwdXNoaW50IDEyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY3CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICBwdXNoaW50IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY4CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgcHVzaGludCAxOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzYzLTM3MAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBieiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX2ZhbHNlQDE2CgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX3RydWVAMTU6CiAgICBpbnRjXzEgLy8gMQoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9tZXJnZUAxNzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMTQtMTIxNgogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2lzX25vbl9jYXNoKAogICAgLy8gICAgIGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIC8vICksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IHR5cGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMTcKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlICE9IGFyYzQuVUludDgoZW51bXMuRVZUX0lFRCksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGRpZyA4CiAgICBwdXNoYnl0ZXMgMHgwMQogICAgYiE9CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCB0eXBlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNzQKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluIChVSW50NjQoZW51bXMuRVZUX1JSKSwgVUludDY0KGVudW1zLkVWVF9SUkYpKQogICAgZGlnIDQKICAgIHB1c2hpbnQgMTIKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDIxCiAgICBkaWcgNAogICAgcHVzaGludCAxMQogICAgPT0KICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfZmFsc2VAMjIKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAyMToKICAgIGludGNfMSAvLyAxCgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX21lcmdlQDIzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIxOAogICAgLy8gaWYgc2VsZi5fZXZlbnRfaXNfcmF0ZV9yZXNldChlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpKToKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Vsc2VfYm9keUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODAKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLm9ic2VydmVyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjUgLy8gMHg1MjNhNGQ0ZjQzMjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMjIKICAgIC8vIHNlbGYuX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5KGVudHJ5LCBwYXlsb2FkKQogICAgZGlnIDYKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeQogICAgcG9wbiAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjIzCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfZWxzZV9ib2R5QDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjIxCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIGIgYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYWZ0ZXJfaWZfZWxzZUA2CgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX2ZhbHNlQDIyOgogICAgaW50Y18wIC8vIDAKICAgIGIgYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9tZXJnZUAyMwoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9mYWxzZUAxNjoKICAgIGludGNfMCAvLyAwCiAgICBiIGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfbWVyZ2VAMTcKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5hcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50OgogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGxlbgogICAgcHVzaGludCA2NQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5PYnNlcnZlZENhc2hFdmVudFJlcXVlc3QKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjU0CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyNTUKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjU2CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIzMwogICAgLy8gcmV0dXJuIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQ0xNKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICBwdXNoaW50IDUKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5ODEKICAgIC8vIGFzc2VydCBzZWxmLl9zdXBwb3J0c19vYnNlcnZlZF9ldmVudHMoKSwgZXJyLk9CU0VSVkVEX0VWRU5UX1JFUVVJUkVECiAgICBhc3NlcnQgLy8gT2JzZXJ2ZWQgZXZlbnQgcmVxdWlyZWQgdG8gZXhlY3V0ZSB0aGlzIGFjdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTgyCiAgICAvLyBhc3NlcnQgcGF5bG9hZC5ldmVudF9pZCA9PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LCBlcnIuSU5WQUxJRF9FVkVOVF9JRAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgc3dhcAogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBpZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTgzCiAgICAvLyBhc3NlcnQgcGF5bG9hZC5ldmVudF90eXBlID09IGFyYzQuVUludDgoZW51bXMuRVZUX1BSKSwgZXJyLklOVkFMSURfRVZFTlRfVFlQRQogICAgZGlnIDEKICAgIGV4dHJhY3QgOCAxCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIHB1c2hieXRlcyAweDAzCiAgICBiPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IHR5cGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4NAogICAgLy8gYXNzZXJ0IHBheWxvYWQuZmxhZ3MgJiBVSW50NjQoZW51bXMuRkxBR19DQVNIX0VWRU5UKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBzd2FwCiAgICBwdXNoaW50IDU3CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzEgLy8gMQogICAgJgogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTg2CiAgICAvLyBpZiBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50ID4gVUludDY0KDApOgogICAgYnogYXBwZW5kX29ic2VydmVkX2Nhc2hfZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5ODgKICAgIC8vIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgLSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5ODctOTg5CiAgICAvLyBwcmV2aW91c19lbnRyeSA9IHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeSgKICAgIC8vICAgICBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IC0gVUludDY0KDEpCiAgICAvLyApCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5MQogICAgLy8gcHJldmlvdXNfZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gcGF5bG9hZC5zY2hlZHVsZWRfdGltZQogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDQKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIDw9CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OTAtOTkyCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHByZXZpb3VzX2VudHJ5LnNjaGVkdWxlZF90aW1lIDw9IHBheWxvYWQuc2NoZWR1bGVkX3RpbWUKICAgIC8vICksIGVyci5JTlZBTElEX1NPUlRJTkcKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBtdXN0IGJlIHNvcnRlZCBpbiBzdHJpY3RseSBhc2NlbmRpbmcgb3JkZXIKCmFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5NAogICAgLy8gcGFnZV9pbmRleCA9IHNlbGYuX3NjaGVkdWxlX3BhZ2VfaW5kZXgoc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE5MAogICAgLy8gcmV0dXJuIGV2ZW50X2lkIC8vIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKQogICAgcHVzaGludCAxNgogICAgLwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTk1CiAgICAvLyBwYWdlID0gdHlwLkV4ZWN1dGlvblNjaGVkdWxlUGFnZSgpCiAgICBieXRlYyA0OCAvLyAweDAwMDAKICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTk2CiAgICAvLyBpZiBwYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZToKICAgIGl0b2IKICAgIGJ5dGVjIDI0IC8vIDB4NTMyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgNwogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBhcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5NwogICAgLy8gcGFnZSA9IHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XS5jb3B5KCkKICAgIGRpZyA1CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidXJ5IDYKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX3BhZ2UgZW50cnkgZXhpc3RzCgphcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OTgKICAgIC8vIGFzc2VydCBwYWdlLmxlbmd0aCA8IFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZGlnIDQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgcHVzaGludCAxNgogICAgPAogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAwMwogICAgLy8gc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIGRpZyA1CiAgICBkdXAKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDA0CiAgICAvLyBhY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLmFjY3J1YWxfZmFjdG9yLAogICAgZGlnIDEKICAgIGV4dHJhY3QgMTcgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAwNQogICAgLy8gcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICBkaWcgMgogICAgZXh0cmFjdCAyNSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDA2CiAgICAvLyBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDMKICAgIGV4dHJhY3QgMzMgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAwNwogICAgLy8gbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1wYXlsb2FkLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICBkaWcgNAogICAgZXh0cmFjdCA0MSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDA4CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1wYXlsb2FkLm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgdW5jb3ZlciA1CiAgICBleHRyYWN0IDQ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMDAtMTAxMAogICAgLy8gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkoCiAgICAvLyAgICAgZXZlbnRfaWQ9cGF5bG9hZC5ldmVudF9pZCwKICAgIC8vICAgICBldmVudF90eXBlPXBheWxvYWQuZXZlbnRfdHlwZSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1wYXlsb2FkLnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9cGF5bG9hZC5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIC8vICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1wYXlsb2FkLm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGZsYWdzPXBheWxvYWQuZmxhZ3MsCiAgICAvLyApCiAgICBkaWcgMTAKICAgIGl0b2IKICAgIGRpZyAxMAogICAgY29uY2F0CiAgICB1bmNvdmVyIDYKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTk5LTEwMTEKICAgIC8vIHBhZ2UuYXBwZW5kKAogICAgLy8gICAgIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgICAgICBldmVudF9pZD1wYXlsb2FkLmV2ZW50X2lkLAogICAgLy8gICAgICAgICBldmVudF90eXBlPXBheWxvYWQuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICAgICAgYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPXBheWxvYWQubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1wYXlsb2FkLm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgICAgICBmbGFncz1wYXlsb2FkLmZsYWdzLAogICAgLy8gICAgICkKICAgIC8vICkKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMTIKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHBhZ2UuY29weSgpCiAgICBkaWcgNgogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMTMKICAgIC8vIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgKz0gVUludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI2MAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9nZXRfc3RhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9nZXRfc3RhdGU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGR1cAogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjc1CiAgICAvLyBjb250cmFjdF90eXBlPWFyYzQuVUludDgoc2VsZi5jb250cmFjdF90eXBlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgaXRvYgogICAgZHVwCiAgICBiaXRsZW4KICAgIGludGNfMiAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBleHRyYWN0IDcgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI3NwogICAgLy8gdG90YWxfdW5pdHM9c2VsZi50b3RhbF91bml0cywKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjc4CiAgICAvLyByZXNlcnZlZF91bml0c190b3RhbD1zZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyNzkKICAgIC8vIGluaXRpYWxfZXhjaGFuZ2VfYW1vdW50PXNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI4MAogICAgLy8gZXZlbnRfY3Vyc29yPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjgxCiAgICAvLyBzY2hlZHVsZV9lbnRyeV9jb3VudD1zZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI4MgogICAgLy8gb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjgzCiAgICAvLyBpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlPXNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjg0CiAgICAvLyBub21pbmFsX2ludGVyZXN0X3JhdGU9c2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyODUKICAgIC8vIGFjY3J1ZWRfaW50ZXJlc3Q9c2VsZi5hY2NydWVkX2ludGVyZXN0LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyODYKICAgIC8vIGN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXg9c2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjg3CiAgICAvLyBjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleD1zZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyODgKICAgIC8vIHJlc2VydmVkX2ludGVyZXN0PXNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX2ludGVyZXN0IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI4OQogICAgLy8gcmVzZXJ2ZWRfcHJpbmNpcGFsPXNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI3NC0xMjkwCiAgICAvLyByZXR1cm4gdHlwLktlcm5lbFN0YXRlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGU9YXJjNC5VSW50OChzZWxmLmNvbnRyYWN0X3R5cGUpLAogICAgLy8gICAgIHN0YXR1cz1zZWxmLnN0YXR1cywKICAgIC8vICAgICB0b3RhbF91bml0cz1zZWxmLnRvdGFsX3VuaXRzLAogICAgLy8gICAgIHJlc2VydmVkX3VuaXRzX3RvdGFsPXNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwsCiAgICAvLyAgICAgaW5pdGlhbF9leGNoYW5nZV9hbW91bnQ9c2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCwKICAgIC8vICAgICBldmVudF9jdXJzb3I9c2VsZi5ldmVudF9jdXJzb3IsCiAgICAvLyAgICAgc2NoZWR1bGVfZW50cnlfY291bnQ9c2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwKICAgIC8vICAgICBvdXRzdGFuZGluZ19wcmluY2lwYWw9c2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZT1zZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICAvLyAgICAgbm9taW5hbF9pbnRlcmVzdF9yYXRlPXNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIGFjY3J1ZWRfaW50ZXJlc3Q9c2VsZi5hY2NydWVkX2ludGVyZXN0LAogICAgLy8gICAgIGN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXg9c2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4LAogICAgLy8gICAgIGN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4PXNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgsCiAgICAvLyAgICAgcmVzZXJ2ZWRfaW50ZXJlc3Q9c2VsZi5yZXNlcnZlZF9pbnRlcmVzdCwKICAgIC8vICAgICByZXNlcnZlZF9wcmluY2lwYWw9c2VsZi5yZXNlcnZlZF9wcmluY2lwYWwsCiAgICAvLyApCiAgICB1bmNvdmVyIDE0CiAgICBpdG9iCiAgICB1bmNvdmVyIDE0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMgogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDExCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA5CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgOAogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDcKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyNjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzA0CiAgICAvLyBpZiBzZWxmLmV2ZW50X2N1cnNvciA+PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICA+PQogICAgYnogY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMwNgogICAgLy8gZXZlbnRfaWQ9c2VsZi5ldmVudF9jdXJzb3IsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMDUtMTMxNQogICAgLy8gcmV0dXJuIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgIGV2ZW50X2lkPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgLy8gICAgIGV2ZW50X3R5cGU9YXJjNC5VSW50OCgwKSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1VSW50NjQoMCksCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1VSW50NjQoMCksCiAgICAvLyAgICAgZmxhZ3M9VUludDY0KDApLAogICAgLy8gKQogICAgaXRvYgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMwNwogICAgLy8gZXZlbnRfdHlwZT1hcmM0LlVJbnQ4KDApLAogICAgYnl0ZWMgNDAgLy8gMHgwMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMwNS0xMzE1CiAgICAvLyByZXR1cm4gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkoCiAgICAvLyAgICAgZXZlbnRfaWQ9c2VsZi5ldmVudF9jdXJzb3IsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1hcmM0LlVJbnQ4KDApLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPVVJbnQ2NCgwKSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249VUludDY0KDApLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPVVJbnQ2NCgwKSwKICAgIC8vICAgICBmbGFncz1VSW50NjQoMCksCiAgICAvLyApCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMDgKICAgIC8vIHNjaGVkdWxlZF90aW1lPVVJbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzA1LTEzMTUKICAgIC8vIHJldHVybiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1zZWxmLmV2ZW50X2N1cnNvciwKICAgIC8vICAgICBldmVudF90eXBlPWFyYzQuVUludDgoMCksCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9VUludDY0KDApLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9VUludDY0KDApLAogICAgLy8gICAgIGZsYWdzPVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAoKY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50QDQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjkyCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzE2CiAgICAvLyByZXR1cm4gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KHNlbGYuZXZlbnRfY3Vyc29yKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyOTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiBjb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnRfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnRANAoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLmNvbnRyYWN0X3VwZGF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X3VwZGF0ZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTktMTYyCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gZ3JhbnRzIHRoZSB1cGRhdGUgcGVybWlzc2lvbnMgdG8gdGhlIEFycmFuZ2VyLgogICAgLy8gIyDimqDvuI8gV0FSTklORzogQXBwbGljYXRpb24gdXBkYXRlcyBtdXN0IGJlIGV4ZWN1dGVkIFZFUlkgY2FyZWZ1bGx5LCBhcyB0aGV5CiAgICAvLyAjIG1pZ2h0IGludHJvZHVjZSBicmVha2luZyBjaGFuZ2VzLgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19yb3RhdGVfYXJyYW5nZXJbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3JvdGF0ZV9hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTc4CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzkKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSBuZXdfYXJyYW5nZXIKICAgIGJ5dGVjIDE4IC8vIDB4NTIzYTQxNTI1MjIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4MAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTY0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3NldF9vcF9kYWVtb25bcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3NldF9vcF9kYWVtb246CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTgyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE5NgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTk3CiAgICAvLyBzZWxmLm9wX2RhZW1vbi52YWx1ZSA9IGFkZHJlc3MKICAgIGJ5dGVjIDI2IC8vIDB4NTIzYTRmNTA0NDIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE5OAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTgyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2Fzc2lnbl9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19hc3NpZ25fcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDE2CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLlJvbGVWYWxpZGl0eQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyMgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjIzCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNAogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgcHVzaGludCAyMAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTAzCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gcm9sZV9hZGRyZXNzCiAgICBieXRlYyAxOCAvLyAweDUyM2E0MTUyNTIyMwogICAgZGlnIDMKICAgIGFwcF9nbG9iYWxfcHV0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwNgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDQwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDcKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIzIC8vIDB4NTIzYTRkNGU0NzIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDgKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI1CiAgICAvLyBzZWxmLl9zZXRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIHZhbGlkaXR5KQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTAKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTEKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjIgLy8gMHg1MjNhNTA1OTQ0MjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMgogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNQogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE0CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpOgogICAgZHVwCiAgICBwdXNoaW50IDYwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTUKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAzMiAvLyAweDUyM2E1NDUyNTMyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE2CiAgICAvLyBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjUKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExOAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMSAvLyAweDUyM2E0MTU1NTQyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIwCiAgICAvLyBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNQogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgODAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIzCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI1IC8vIDB4NTIzYTRkNGY0MzIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjQKICAgIC8vIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfcmV2b2tlX3JvbGVbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3Jldm9rZV9yb2xlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0NwogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjQ4CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0OQogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjcKICAgIC8vIGFzc2VydCByb2xlX2lkICE9IFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwgZXJyLklOVkFMSURfUk9MRQogICAgZHVwCiAgICBwdXNoaW50IDIwCiAgICAhPQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI4CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICBwdXNoaW50IDQwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjkKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjMgLy8gMHg1MjNhNGQ0ZTQ3MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMAogICAgLy8gZGVsIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTEKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzMKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMiAvLyAweDUyM2E1MDU5NDQyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM0CiAgICAvLyBkZWwgc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTAKICAgIC8vIHNlbGYuX2RlbGV0ZV9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcykKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM2CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpOgogICAgZHVwCiAgICBwdXNoaW50IDYwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzcKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDMyIC8vIDB4NTIzYTU0NTI1MzIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzgKICAgIC8vIGRlbCBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjUwCiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDEKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hdXRob3JpdHksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjEgLy8gMHg1MjNhNDE1NTU0MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MgogICAgLy8gZGVsIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1MAogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDQKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDgwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI1IC8vIDB4NTIzYTRkNGY0MzIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDYKICAgIC8vIGRlbCBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19jb250cmFjdF9zdXNwZW5zaW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19jb250cmFjdF9zdXNwZW5zaW9uOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kICAjIFRPRE86IFVwZGF0ZSBzcGVjcyBhbmQgYWRkIHRlc3QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzcKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDIxIC8vIDB4NTIzYTQxNTU1NDIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjY5CiAgICAvLyBzZWxmLmFzc2V0X3N1c3BlbmRlZCA9IHN1c3BlbmRlZAogICAgYnl0ZWMgMzMgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjcwCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCAgIyBUT0RPOiBVcGRhdGUgc3BlY3MgYW5kIGFkZCB0ZXN0CiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYXJyYW5nZXJbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODMKICAgIC8vIHJldHVybiBzZWxmLmFycmFuZ2VyLnZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTggLy8gMHg1MjNhNDE1MjUyMjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcnJhbmdlciBleGlzdHMKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNzIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXNbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9hZGRyZXNzX3JvbGVzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDMKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDIzIC8vIDB4NTIzYTRkNGU0NzIzCiAgICBkaWcgMQogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDQKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYucHJpbWFyeV9kZWFsZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjIgLy8gMHg1MjNhNTA1OTQ0MjMKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwNQogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi50cnVzdGVlLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDMyIC8vIDB4NTIzYTU0NTI1MzIzCiAgICBkaWcgMwogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDYKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYXV0aG9yaXR5LCBhZGRyZXNzKSwKICAgIGJ5dGVjIDIxIC8vIDB4NTIzYTQxNTU1NDIzCiAgICBkaWcgNAogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDcKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYub2JzZXJ2ZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjUgLy8gMHg1MjNhNGQ0ZjQzMjMKICAgIHVuY292ZXIgNQogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWMgNDAgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgNgogICAgc2V0Yml0CiAgICBpbnRjXzEgLy8gMQogICAgdW5jb3ZlciA1CiAgICBzZXRiaXQKICAgIHB1c2hpbnQgMgogICAgdW5jb3ZlciA0CiAgICBzZXRiaXQKICAgIHB1c2hpbnQgMwogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIHB1c2hpbnQgNAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5W3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfcm9sZV92YWxpZGl0eToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjgKICAgIC8vIHJvbGUgPSByb2xlX2lkLmFzX3VpbnQ2NCgpCiAgICBidG9pCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI5CiAgICAvLyBzZWxmLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlKQogICAgZHVwCiAgICBjYWxsc3ViIF9hc3NlcnRfdmFsaWRfcm9sZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMzMQogICAgLy8gY2FzZSBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUik6CiAgICBwdXNoaW50cyAyMCA0MCA1MCA2MCA3MCA4MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMzMC0zNjEKICAgIC8vIG1hdGNoIHJvbGU6CiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUik6CiAgICAvLyAgICAgICAgIHJldHVybiB0eXAuUm9sZVZhbGlkaXR5KAogICAgLy8gICAgICAgICAgICAgcm9sZV92YWxpZGl0eV9zdGFydD1VSW50NjQoMCksIHJvbGVfdmFsaWRpdHlfZW5kPVVJbnQ2NCgwKQogICAgLy8gICAgICAgICApCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLmFjY291bnRfbWFuYWdlciwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLnByaW1hcnlfZGVhbGVyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLmF1dGhvcml0eSwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLm9ic2VydmVyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIF86CiAgICAvLyAgICAgICAgIG9wLmVycihlcnIuSU5WQUxJRF9ST0xFKQogICAgdW5jb3ZlciA2CiAgICBtYXRjaCByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzBAMiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzFAMyByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzJANCByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzNANSByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzRANiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzVANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM2MQogICAgLy8gb3AuZXJyKGVyci5JTlZBTElEX1JPTEUpCiAgICBlcnIgLy8gSW52YWxpZCByb2xlIGlkZW50aWZpZXIKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM1NwogICAgLy8gc2VsZi5vYnNlcnZlciwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAyNSAvLyAweDUyM2E0ZDRmNDMyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM1Ni0zNTgKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLm9ic2VydmVyLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTkKICAgIC8vIHJldHVybiBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV80QDY6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzUyCiAgICAvLyBzZWxmLmF1dGhvcml0eSwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAyMSAvLyAweDUyM2E0MTU1NTQyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM1MS0zNTMKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLmF1dGhvcml0eSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzU0CiAgICAvLyByZXR1cm4gc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8zQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzQ3CiAgICAvLyBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMzIgLy8gMHg1MjNhNTQ1MjUzMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNDYtMzQ4CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNDkKICAgIC8vIHJldHVybiBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8yQDQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzQyCiAgICAvLyBzZWxmLnByaW1hcnlfZGVhbGVyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDIyIC8vIDB4NTIzYTUwNTk0NDIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzQxLTM0MwogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM0NAogICAgLy8gcmV0dXJuIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8xQDM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzM3CiAgICAvLyBzZWxmLmFjY291bnRfbWFuYWdlciwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAyMyAvLyAweDUyM2E0ZDRlNDcyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMzNi0zMzgKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLmFjY291bnRfbWFuYWdlciwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzM5CiAgICAvLyByZXR1cm4gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8wQDI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzMyLTMzNAogICAgLy8gcmV0dXJuIHR5cC5Sb2xlVmFsaWRpdHkoCiAgICAvLyAgICAgcm9sZV92YWxpZGl0eV9zdGFydD1VSW50NjQoMCksIHJvbGVfdmFsaWRpdHlfZW5kPVVJbnQ2NCgwKQogICAgLy8gKQogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQoaG9sZGluZ19hZGRyZXNzOiBieXRlcykgLT4gdm9pZDoKX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQ6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjYKICAgIC8vIGRlZiBfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChzZWxmLCBob2xkaW5nX2FkZHJlc3M6IEFjY291bnQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyOAogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQsIGVyci5TVVNQRU5ERUQKICAgIGJ5dGVjIDggLy8gMHg0MTIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHB1c2hpbnQgMzg0CiAgICBnZXRiaXQKICAgICEKICAgIGFzc2VydCAvLyBTdXNwZW5kZWQgb3BlcmF0aW9ucwogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuX3NldHRsZV9wb3NpdGlvbihob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB1aW50NjQsIHVpbnQ2NDoKX3NldHRsZV9wb3NpdGlvbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo0NAogICAgLy8gZGVmIF9zZXR0bGVfcG9zaXRpb24oc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50KSAtPiB0dXBsZVtVSW50NjQsIFVJbnQ2NF06CiAgICBwcm90byAxIDIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo2MQogICAgLy8gcG9zaXRpb24gPSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jb3B5KCkKICAgIGR1cAogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NjMtNjUKICAgIC8vICMgQ29tcHV0ZSB0aGUgaW5jcmVtZW50YWwgcGVyLXVuaXQgZml4ZWQtcG9pbnQgaW50ZXJlc3QgYW5kIHByaW5jaXBhbCBhY2NydWVkCiAgICAvLyAjIHNpbmNlIHRoaXMgYWNjb3VudCdzIGxhc3QgY2hlY2twb2ludC4KICAgIC8vIGludGVyZXN0X2RlbHRhID0gc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IC0gcG9zaXRpb24uaW50ZXJlc3RfY2hlY2twb2ludAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggZXhpc3RzCiAgICBkaWcgMQogICAgcHVzaGludCA1NwogICAgZXh0cmFjdF91aW50NjQKICAgIC0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo2NwogICAgLy8gc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCAtIHBvc2l0aW9uLnByaW5jaXBhbF9jaGVja3BvaW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTcgLy8gImN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IGV4aXN0cwogICAgZGlnIDIKICAgIHB1c2hpbnQgNjUKICAgIGV4dHJhY3RfdWludDY0CiAgICAtCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzMKICAgIC8vIGludGVyZXN0X2RlbHRhLCBwb3NpdGlvbi51bml0cywgc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgZGlnIDIKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3MC03NAogICAgLy8gIyBDb252ZXJ0IHRoZSBwZXItdW5pdCBmaXhlZC1wb2ludCBkZWx0YXMgaW50byBhYnNvbHV0ZSBjbGFpbWFibGUgYW1vdW50cwogICAgLy8gIyB1c2luZyB0aGUgYWNjb3VudCdzIGFjdGl2ZSB1bml0cy4KICAgIC8vIGNsYWltYWJsZV9pbnRlcmVzdCA9IHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIGludGVyZXN0X2RlbHRhLCBwb3NpdGlvbi51bml0cywgc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgLy8gKQogICAgdW5jb3ZlciAzCiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojc2CiAgICAvLyBwcmluY2lwYWxfZGVsdGEsIHBvc2l0aW9uLnVuaXRzLCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzUtNzcKICAgIC8vIGNsYWltYWJsZV9wcmluY2lwYWwgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBwcmluY2lwYWxfZGVsdGEsIHBvc2l0aW9uLnVuaXRzLCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICAvLyApCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojc5LTgxCiAgICAvLyAjIEFjY3J1ZSB0aGUgY2xhaW1hYmxlIGFtb3VudHMgdG8gdGhlIGFjY291bnQgcG9zaXRpb24gYW5kIG1ha2UgdGhlbSBhdmFpbGFibGUKICAgIC8vICMgZm9yIHdpdGhkcmF3YWwuCiAgICAvLyBwb3NpdGlvbi5jbGFpbWFibGVfaW50ZXJlc3QgKz0gY2xhaW1hYmxlX2ludGVyZXN0CiAgICBkaWcgMgogICAgcHVzaGludCA3MwogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICArCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIHN3YXAKICAgIHJlcGxhY2UyIDczCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6ODIKICAgIC8vIHBvc2l0aW9uLmNsYWltYWJsZV9wcmluY2lwYWwgKz0gY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgZHVwCiAgICBwdXNoaW50IDgxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDIKICAgICsKICAgIGl0b2IKICAgIHJlcGxhY2UyIDgxCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6ODQtODYKICAgIC8vICMgQWR2YW5jZSB0aGUgYWNjb3VudCdzIHBlci11bml0IGZpeGVkLXBvaW50IGNoZWNrcG9pbnRzIHRvIHRoZSBjdXJyZW50IGdsb2JhbAogICAgLy8gIyBwZXItdW5pdCBmaXhlZC1wb2ludCBnbG9iYWwgaW5kaWNlcy4KICAgIC8vIHBvc2l0aW9uLmludGVyZXN0X2NoZWNrcG9pbnQgPSBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IGV4aXN0cwogICAgaXRvYgogICAgcmVwbGFjZTIgNTcKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo4NwogICAgLy8gcG9zaXRpb24ucHJpbmNpcGFsX2NoZWNrcG9pbnQgPSBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTcgLy8gImN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IGV4aXN0cwogICAgaXRvYgogICAgcmVwbGFjZTIgNjUKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo4OS05MAogICAgLy8gIyBBZHZhbmNlIHRoZSBhY2NvdW50J3MgZXZlbnQgY3Vyc29yIHRvIHRoZSBjdXJyZW50IGdsb2JhbCBldmVudCBjdXJzb3IuCiAgICAvLyBwb3NpdGlvbi5zZXR0bGVkX2N1cnNvciA9IHNlbGYuZXZlbnRfY3Vyc29yCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGl0b2IKICAgIHJlcGxhY2UyIDQ5CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6OTItOTQKICAgIC8vICMgVXBkYXRlIHRoZSBhY2NvdW50IHBvc2l0aW9uIGFuZCByZXR1cm4gdGhlIG5ld2x5IGFjY3J1ZWQgY2xhaW1hYmxlIGFtb3VudHMKICAgIC8vICMgYWRkZWQgdG8gdGhlIHRvdGFsIHBvc2l0aW9uJ3MgY2xhaW1hYmxlIGFtb3VudHMuCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHBvc2l0aW9uLmNvcHkoKQogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6OTUKICAgIC8vIHJldHVybiBjbGFpbWFibGVfaW50ZXJlc3QsIGNsYWltYWJsZV9wcmluY2lwYWwKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IHZvaWQ6Cl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojk3CiAgICAvLyBkZWYgX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQoc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg0MTIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwMAogICAgLy8gaWYgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCk6CiAgICBieiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZF9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDEKICAgIC8vIHJldHVybgogICAgcmV0c3ViCgpfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZF9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTAzCiAgICAvLyBwb3NpdGlvbiA9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNvcHkoKQogICAgZnJhbWVfZGlnIDIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwNAogICAgLy8gaWYgcG9zaXRpb24ucmVzZXJ2ZWRfdW5pdHMgPT0gVUludDY0KDApOgogICAgcHVzaGludCA0MAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICBibnogX2Vuc3VyZV91bml0c19hY3RpdmF0ZWRfYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA1CiAgICAvLyByZXR1cm4KICAgIHJldHN1YgoKX2Vuc3VyZV91bml0c19hY3RpdmF0ZWRfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwOAogICAgLy8gcG9zaXRpb24udW5pdHMgKz0gYWN0aXZhdGVkX3VuaXRzCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAzCiAgICArCiAgICBpdG9iCiAgICByZXBsYWNlMiAzMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwOQogICAgLy8gcG9zaXRpb24ucmVzZXJ2ZWRfdW5pdHMgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBpdG9iCiAgICByZXBsYWNlMiA0MAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExMAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSBwb3NpdGlvbi5jb3B5KCkKICAgIGZyYW1lX2RpZyAyCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTExCiAgICAvLyBhc3NlcnQgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCA+PSBhY3RpdmF0ZWRfdW5pdHMsIGVyci5PVkVSX0RJU1RSSUJVVElPTgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCBleGlzdHMKICAgIGR1cAogICAgZGlnIDIKICAgID49CiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IHJlbWFpbmluZyBELUFTQSB1bml0cwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExMgogICAgLy8gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCAtPSBhY3RpdmF0ZWRfdW5pdHMKICAgIHN3YXAKICAgIC0KICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fc2NhbGVkX211bF9kaXYobXVsdGlwbGljYW5kOiB1aW50NjQsIG11bHRpcGxpZXI6IHVpbnQ2NCwgZGl2aXNvcjogdWludDY0KSAtPiB1aW50NjQ6Cl9zY2FsZWRfbXVsX2RpdjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE1My0xNTUKICAgIC8vIGRlZiBfc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgc2VsZiwgbXVsdGlwbGljYW5kOiBVSW50NjQsIG11bHRpcGxpZXI6IFVJbnQ2NCwgZGl2aXNvcjogVUludDY0CiAgICAvLyApIC0+IFVJbnQ2NDoKICAgIHByb3RvIDMgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTU3CiAgICAvLyBpZiBtdWx0aXBsaWNhbmQgPT0gVUludDY0KDApIG9yIG11bHRpcGxpZXIgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0zCiAgICBieiBfc2NhbGVkX211bF9kaXZfaWZfYm9keUAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGJueiBfc2NhbGVkX211bF9kaXZfYWZ0ZXJfaWZfZWxzZUAzCgpfc2NhbGVkX211bF9kaXZfaWZfYm9keUAyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTU4CiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfc2NhbGVkX211bF9kaXZfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTU5CiAgICAvLyBoaWdoLCBsb3cgPSBvcC5tdWx3KG11bHRpcGxpY2FuZCwgbXVsdGlwbGllcikKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0yCiAgICBtdWx3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjAKICAgIC8vIHJldHVybiBvcC5kaXZ3KGhpZ2gsIGxvdywgZGl2aXNvcikKICAgIGZyYW1lX2RpZyAtMQogICAgZGl2dwogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Ftb3VudF90b19pbmRleF9kZWx0YShhbW91bnQ6IHVpbnQ2NCkgLT4gdWludDY0OgpfYW1vdW50X3RvX2luZGV4X2RlbHRhOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTYyCiAgICAvLyBkZWYgX2Ftb3VudF90b19pbmRleF9kZWx0YShzZWxmLCBhbW91bnQ6IFVJbnQ2NCkgLT4gVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjQKICAgIC8vIGlmIGFtb3VudCA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGJueiBfYW1vdW50X3RvX2luZGV4X2RlbHRhX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTY1CiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfYW1vdW50X3RvX2luZGV4X2RlbHRhX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2NgogICAgLy8gYXNzZXJ0IHNlbGYudG90YWxfdW5pdHMgPiBVSW50NjQoMCksIGVyci5OT19VTklUUwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIGR1cAogICAgYXNzZXJ0IC8vIE5vIEQtQVNBIHVuaXRzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjcKICAgIC8vIHJldHVybiBzZWxmLl9zY2FsZWRfbXVsX2RpdihhbW91bnQsIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsIHNlbGYudG90YWxfdW5pdHMpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9pbmRleF9kZWx0YV90b19hbW91bnQoaW5kZXhfZGVsdGE6IHVpbnQ2NCkgLT4gdWludDY0OgpfaW5kZXhfZGVsdGFfdG9fYW1vdW50OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTY5CiAgICAvLyBkZWYgX2luZGV4X2RlbHRhX3RvX2Ftb3VudChzZWxmLCBpbmRleF9kZWx0YTogVUludDY0KSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE3NgogICAgLy8gaWYgaW5kZXhfZGVsdGEgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0xCiAgICBibnogX2luZGV4X2RlbHRhX3RvX2Ftb3VudF9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE3NwogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKX2luZGV4X2RlbHRhX3RvX2Ftb3VudF9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNzkKICAgIC8vIHNlbGYudG90YWxfdW5pdHMsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTgxCiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTc4LTE4MgogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIHNlbGYudG90YWxfdW5pdHMsCiAgICAvLyAgICAgaW5kZXhfZGVsdGEsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9nZXRfc2NoZWR1bGVfZW50cnkoZXZlbnRfaWQ6IHVpbnQ2NCkgLT4gYnl0ZXM6Cl9nZXRfc2NoZWR1bGVfZW50cnk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMDIKICAgIC8vIGRlZiBfZ2V0X3NjaGVkdWxlX2VudHJ5KHNlbGYsIGV2ZW50X2lkOiBVSW50NjQpIC0+IHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5OgogICAgcHJvdG8gMSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMDQKICAgIC8vIGFzc2VydCBldmVudF9pZCA8IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQsIGVyci5JTlZBTElEX0VWRU5UX0lECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgID4KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxOTAKICAgIC8vIHJldHVybiBldmVudF9pZCAvLyBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAxNgogICAgLwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjA2CiAgICAvLyBhc3NlcnQgcGFnZV9pbmRleCBpbiBzZWxmLnNjaGVkdWxlX3BhZ2UsIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGl0b2IKICAgIGJ5dGVjIDI0IC8vIDB4NTMyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTk0CiAgICAvLyByZXR1cm4gZXZlbnRfaWQgJSBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAxNgogICAgJQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjA5CiAgICAvLyBhc3NlcnQgb2Zmc2V0IDwgcGFnZS5sZW5ndGgsIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGludCAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZGlnIDEKICAgID4KICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIxMAogICAgLy8gcmV0dXJuIHBhZ2Vbb2Zmc2V0XS5jb3B5KCkKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgMgogICAgKwogICAgcHVzaGludCA2NQogICAgYm94X2V4dHJhY3QKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZShjb250cmFjdF90eXBlOiB1aW50NjQsIGV2ZW50X3R5cGU6IHVpbnQ2NCkgLT4gdm9pZDoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzEzLTMxNQogICAgLy8gZGVmIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBzZWxmLCBjb250cmFjdF90eXBlOiBVSW50NjQsIGV2ZW50X3R5cGU6IFVJbnQ2NAogICAgLy8gKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjQ3CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lFRCksCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU0LTI1NQogICAgLy8gIyBDaGVjayBjb21tb24gZXZlbnRzIGZpcnN0CiAgICAvLyBpZiBldmVudF90eXBlIGluIGNvbW1vbl9ldmVudHM6CiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjQ4CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQKSwKICAgIGludGNfMiAvLyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNDkKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfTUQpLAogICAgcHVzaGludCAxOQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU0LTI1NQogICAgLy8gIyBDaGVjayBjb21tb24gZXZlbnRzIGZpcnN0CiAgICAvLyBpZiBldmVudF90eXBlIGluIGNvbW1vbl9ldmVudHM6CiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjUwCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIHB1c2hpbnQgMTIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1MQogICAgLy8gVUludDY0KGVudW1zLkVWVF9SUkYpLAogICAgcHVzaGludCAxMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU0LTI1NQogICAgLy8gIyBDaGVjayBjb21tb24gZXZlbnRzIGZpcnN0CiAgICAvLyBpZiBldmVudF90eXBlIGluIGNvbW1vbl9ldmVudHM6CiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VANwoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1NgogICAgLy8gcmV0dXJuIFRydWUKICAgIGludGNfMSAvLyAxCgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgcmV0c3ViCgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU4LTI1OQogICAgLy8gIyBDb250cmFjdC1zcGVjaWZpYyBhZGRpdGlvbmFsIGV2ZW50cwogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfUEFNKToKICAgIGZyYW1lX2RpZyAtMgogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2MC0yNjEKICAgIC8vICMgUEFNIG9ubHkgc3VwcG9ydHMgY29tbW9uIGV2ZW50cwogICAgLy8gcmV0dXJuIEZhbHNlCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjYzCiAgICAvLyBpZiBjb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9MQU0pIG9yIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDMKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNjMtMjY1CiAgICAvLyBpZiBjb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9MQU0pIG9yIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KAogICAgLy8gICAgIGVudW1zLkNUX05BTQogICAgLy8gKToKICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUAxMQogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDIKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAxNgoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlAMTE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNjYtMjcwCiAgICAvLyAjIExBTS9OQU0gYWRkOiBQUiwgSVBDQgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2OAogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUiksCiAgICBwdXNoaW50IDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2Ni0yNzAKICAgIC8vICMgTEFNL05BTSBhZGQ6IFBSLCBJUENCCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAxMwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNjkKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICBwdXNoaW50IDE4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNjYtMjcwCiAgICAvLyAjIExBTS9OQU0gYWRkOiBQUiwgSVBDQgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyApCiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMTQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMTM6CiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF9mYWxzZUAxNDoKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDE2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjcyCiAgICAvLyBpZiBjb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pOgogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDIzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzMtMjc4CiAgICAvLyAjIEFOTiBhZGRzOiBQUiwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3NQogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUiksCiAgICBwdXNoaW50IDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3My0yNzgKICAgIC8vICMgQU5OIGFkZHM6IFBSLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyMAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzYKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICBwdXNoaW50IDE4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzMtMjc4CiAgICAvLyAjIEFOTiBhZGRzOiBQUiwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjAKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjc3CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICBwdXNoaW50IDUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3My0yNzgKICAgIC8vICMgQU5OIGFkZHM6IFBSLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF9mYWxzZUAyMQoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyMDoKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDIxOgogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMjM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODAKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0xBWCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDMxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODEtMjg3CiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODMKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODEtMjg3CiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDI4CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4NAogICAgLy8gVUludDY0KGVudW1zLkVWVF9QSSksCiAgICBwdXNoaW50IDQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MS0yODcKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjgKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjg1CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgcHVzaGludCAxOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjgxLTI4NwogICAgLy8gIyBMQVggYWRkczogUFIsIFBJLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyOAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODYKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIHB1c2hpbnQgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjgxLTI4NwogICAgLy8gIyBMQVggYWRkczogUFIsIFBJLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF9mYWxzZUAyOQoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyODoKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDI5OgogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMzE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODkKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0NMTSk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDMzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyOTAtMjkxCiAgICAvLyAjIENMTSBhZGRzOiBQUgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QUikKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAzCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAzMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI5MwogICAgLy8gcmV0dXJuIEZhbHNlCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2lzX2R5bmFtaWNfYW5udWl0eSgpIC0+IHVpbnQ2NDoKX2lzX2R5bmFtaWNfYW5udWl0eToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMzNQogICAgLy8gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM1LTMzNgogICAgLy8gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICAvLyBhbmQgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBieiBfaXNfZHluYW1pY19hbm51aXR5X2Jvb2xfZmFsc2VAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM2CiAgICAvLyBhbmQgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzQgLy8gImR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMzNS0zMzYKICAgIC8vIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKQogICAgLy8gYW5kIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgYnogX2lzX2R5bmFtaWNfYW5udWl0eV9ib29sX2ZhbHNlQDMKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzQtMzM3CiAgICAvLyByZXR1cm4gKAogICAgLy8gICAgIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKQogICAgLy8gICAgIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIC8vICkKICAgIHJldHN1YgoKX2lzX2R5bmFtaWNfYW5udWl0eV9ib29sX2ZhbHNlQDM6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM0LTMzNwogICAgLy8gcmV0dXJuICgKICAgIC8vICAgICBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIC8vICAgICBhbmQgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICAvLyApCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfaW50ZXJlc3Rfc2VnbWVudChlbnRyeTogYnl0ZXMpIC0+IHVpbnQ2NCwgYnl0ZXM6Cl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzgwCiAgICAvLyBkZWYgX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoc2VsZiwgZW50cnk6IHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM4OQogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMTcKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM4OS0zOTEKICAgIC8vIGVudHJ5LmFjY3J1YWxfZmFjdG9yID09IFVJbnQ2NCgwKQogICAgLy8gb3Igc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPT0gVUludDY0KDApCiAgICBieiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudF9pZl9ib2R5QDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5MAogICAgLy8gb3Igc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPT0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM4OS0zOTEKICAgIC8vIGVudHJ5LmFjY3J1YWxfZmFjdG9yID09IFVJbnQ2NCgwKQogICAgLy8gb3Igc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPT0gVUludDY0KDApCiAgICBieiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudF9pZl9ib2R5QDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5MQogICAgLy8gb3Igc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID09IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM4OS0zOTEKICAgIC8vIGVudHJ5LmFjY3J1YWxfZmFjdG9yID09IFVJbnQ2NCgwKQogICAgLy8gb3Igc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPT0gVUludDY0KDApCiAgICBibnogX2VudHJ5X2ludGVyZXN0X3NlZ21lbnRfYWZ0ZXJfaWZfZWxzZUA0CgpfZW50cnlfaW50ZXJlc3Rfc2VnbWVudF9pZl9ib2R5QDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozOTMKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9kaWcgLTEKICAgIHVuY292ZXIgMgogICAgcmV0c3ViCgpfZW50cnlfaW50ZXJlc3Rfc2VnbWVudF9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozOTUKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozOTYKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozOTcKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozOTQtMzk4CiAgICAvLyBhY2NydWVkID0gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlLAogICAgLy8gICAgIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICAvLyApCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDAyCiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzk5LTQwMwogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIGFjY3J1ZWQsCiAgICAvLyAgICAgZW50cnkuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgZnJhbWVfZGlnIC0xCiAgICB1bmNvdmVyIDIKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcihkaXNjb3VudF9mYWN0b3I6IHVpbnQ2NCwgcmVkZW1wdGlvbl9mYWN0b3I6IHVpbnQ2NCkgLT4gdWludDY0OgpfZGlzY291bnRfYW5udWl0eV9mYWN0b3I6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NjItNDY2CiAgICAvLyBkZWYgX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yKAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgZGlzY291bnRfZmFjdG9yOiBVSW50NjQsCiAgICAvLyAgICAgcmVkZW1wdGlvbl9mYWN0b3I6IFVJbnQ2NCwKICAgIC8vICkgLT4gVUludDY0OgogICAgcHJvdG8gMiAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NjgKICAgIC8vIGlmIHJlZGVtcHRpb25fZmFjdG9yID09IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMQogICAgYm56IF9kaXNjb3VudF9hbm51aXR5X2ZhY3Rvcl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ2OQogICAgLy8gcmV0dXJuIGRpc2NvdW50X2ZhY3RvcgogICAgZnJhbWVfZGlnIC0yCiAgICByZXRzdWIKCl9kaXNjb3VudF9hbm51aXR5X2ZhY3Rvcl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzAKICAgIC8vIHBlcmlvZF9yYXRlID0gc2VsZi5maXhlZF9wb2ludF9zY2FsZSArIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDcxCiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDcwLTQ3NAogICAgLy8gcGVyaW9kX3JhdGUgPSBzZWxmLmZpeGVkX3BvaW50X3NjYWxlICsgc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgcmVkZW1wdGlvbl9mYWN0b3IsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgZGlnIDIKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICArCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzUKICAgIC8vIGFzc2VydCBwZXJpb2RfcmF0ZSA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBkdXAKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3OAogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3Ni00ODAKICAgIC8vIHJldHVybiBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBkaXNjb3VudF9mYWN0b3IsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICAgICBwZXJpb2RfcmF0ZSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5KGVudHJ5OiBieXRlcywgcGF5bG9hZDogYnl0ZXMpIC0+IGJ5dGVzLCBieXRlczoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjEzLTYxNQogICAgLy8gZGVmIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeSgKICAgIC8vICAgICBzZWxmLCBlbnRyeTogdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnksIHBheWxvYWQ6IHR5cC5PYnNlcnZlZEV2ZW50UmVxdWVzdAogICAgLy8gKSAtPiBOb25lOgogICAgcHJvdG8gMiAyCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYyMwogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X2lkID09IHNlbGYuZXZlbnRfY3Vyc29yLCBlcnIuSU5WQUxJRF9FVkVOVF9DVVJTT1IKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBjdXJzb3IKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYyNAogICAgLy8gYXNzZXJ0IGVudHJ5LnNjaGVkdWxlZF90aW1lIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLCBlcnIuTk9fRFVFX0NBU0hGTE9XCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIDw9CiAgICBhc3NlcnQgLy8gTm8gZHVlIGNhc2hmbG93IHRvIHBheQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjI2CiAgICAvLyBldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MjcKICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9JRUQpOgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBkdXAKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MjgtNjMwCiAgICAvLyAjIElFRCBmaW5hbGl6ZXMgaXNzdWFuY2U6IHJlc2VydmVkIHVuaXRzIGJlY29tZSBhY3RpdmF0YWJsZSBhbmQgdGhlCiAgICAvLyAjIHNjaGVkdWxlJ3MgaW5pdGlhbCBjb250cmFjdHVhbCBzdGF0ZSBiZWNvbWVzIGxpdmUuCiAgICAvLyBhc3NlcnQgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjMyCiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID09IHNlbGYudG90YWxfdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYzMS02MzMKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCA9PSBzZWxmLnRvdGFsX3VuaXRzCiAgICAvLyApLCBlcnIuUFJJTUFSWV9ESVNUUklCVVRJT05fSU5DT01QTEVURQogICAgYXNzZXJ0IC8vIFByaW1hcnkgZGlzdHJpYnV0aW9uIGlzIG5vdCBjb21wbGV0ZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM0CiAgICAvLyBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9IGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYzNQogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM2CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IGVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM3CiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYzOAogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gZW50cnkubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDQxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM5CiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NDAKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGVudW1zLlNUQVRVU19BQ1RJVkUpCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBwdXNoaW50IDEwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ1MQogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkgPT0gVUludDY0KGVudW1zLkVWVF9JRUQpLCBlcnIuTk9UX0VWVF9JRUQKICAgIGZyYW1lX2RpZyAxMQogICAgYXNzZXJ0IC8vIE5vdCBJRUQgZXZlbnQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ1MgogICAgLy8gcmV0dXJuIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMCAvLyAiaW5pdGlhbF9leGNoYW5nZV9hbW91bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NDEtNjQ1CiAgICAvLyBzZWxmLl9lbWl0X2V4ZWN1dGlvbl9ldmVudCgKICAgIC8vICAgICBlbnRyeT1lbnRyeSwKICAgIC8vICAgICBwYXlvZmY9c2VsZi5fZW50cnlfaWVkX2Ftb3VudChlbnRyeSksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NDQKICAgIC8vIHNldHRsZWRfYW1vdW50PVVJbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NDEtNjQ1CiAgICAvLyBzZWxmLl9lbWl0X2V4ZWN1dGlvbl9ldmVudCgKICAgIC8vICAgICBlbnRyeT1lbnRyeSwKICAgIC8vICAgICBwYXlvZmY9c2VsZi5fZW50cnlfaWVkX2Ftb3VudChlbnRyeSksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgY2FsbHN1YiBfZW1pdF9leGVjdXRpb25fZXZlbnQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAtMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjQ2CiAgICAvLyByZXR1cm4KICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfYnVyeSAxCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDcKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NDkKICAgIC8vIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCArPSBzZWxmLl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KGVudHJ5KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudAogICAgZnJhbWVfYnVyeSAtMgogICAgKwogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NTEKICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9SUik6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgMTIKICAgID09CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDEwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NTUKICAgIC8vIHBheWxvYWQub2JzZXJ2ZWRfcmF0ZSwKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAzMwogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1NgogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzYgLy8gInJhdGVfcmVzZXRfbXVsdGlwbGllciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NTcKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NTItNjU4CiAgICAvLyAjIFJSIGRlcml2ZXMgdGhlIG5leHQgcmF0ZSBmcm9tIGFuIG9ic2VydmVkIG9yYWNsZSB2YWx1ZSBwbHVzIHRoZQogICAgLy8gIyBjb250cmFjdCBzcHJlYWQgLyBtdWx0aXBsaWVyIHRlcm1zLCB0aGVuIGVuZm9yY2VzIGZsb29yIGFuZCBjYXAuCiAgICAvLyBvYnNlcnZlZF9yYXRlID0gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgcGF5bG9hZC5vYnNlcnZlZF9yYXRlLAogICAgLy8gICAgIHNlbGYucmF0ZV9yZXNldF9tdWx0aXBsaWVyLAogICAgLy8gICAgIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICAvLyApCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjYwCiAgICAvLyBvYnNlcnZlZF9yYXRlICsgc2VsZi5yYXRlX3Jlc2V0X3NwcmVhZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDM1IC8vICJyYXRlX3Jlc2V0X3NwcmVhZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X3NwcmVhZCBleGlzdHMKICAgICsKICAgIGZyYW1lX2J1cnkgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzQxCiAgICAvLyBpZiBzZWxmLmhhc19yYXRlX3Jlc2V0X2Zsb29yIGFuZCByYXRlIDwgc2VsZi5yYXRlX3Jlc2V0X2Zsb29yOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDM4IC8vICJoYXNfcmF0ZV9yZXNldF9mbG9vciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5oYXNfcmF0ZV9yZXNldF9mbG9vciBleGlzdHMKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU1CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzAgLy8gInJhdGVfcmVzZXRfZmxvb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9mbG9vciBleGlzdHMKICAgIGZyYW1lX2RpZyA2CiAgICA+CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1NQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzQyCiAgICAvLyByYXRlID0gc2VsZi5yYXRlX3Jlc2V0X2Zsb29yCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzAgLy8gInJhdGVfcmVzZXRfZmxvb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSA2CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X2Zsb29yIGV4aXN0cwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDMKICAgIC8vIGlmIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwIGFuZCByYXRlID4gc2VsZi5yYXRlX3Jlc2V0X2NhcDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzOSAvLyAiaGFzX3JhdGVfcmVzZXRfY2FwIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmhhc19yYXRlX3Jlc2V0X2NhcCBleGlzdHMKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU4CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzEgLy8gInJhdGVfcmVzZXRfY2FwIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfY2FwIGV4aXN0cwogICAgZnJhbWVfZGlnIDYKICAgIDwKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDQKICAgIC8vIHJhdGUgPSBzZWxmLnJhdGVfcmVzZXRfY2FwCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzEgLy8gInJhdGVfcmVzZXRfY2FwIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgNgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9jYXAgZXhpc3RzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1ODoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1OQogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPSBzZWxmLl9jbGFtcF9yYXRlKAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjU5LTY2MQogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPSBzZWxmLl9jbGFtcF9yYXRlKAogICAgLy8gICAgIG9ic2VydmVkX3JhdGUgKyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkCiAgICAvLyApCiAgICBmcmFtZV9kaWcgNgogICAgYXBwX2dsb2JhbF9wdXQKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjcxCiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUEkpOgogICAgZnJhbWVfZGlnIDEwCiAgICBwdXNoaW50IDQKICAgID09CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDIwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzIKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjczCiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAyMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY3OAogICAgLy8gaWYgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCk6CiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMjkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY3OQogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1BSRik6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgNQogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDMwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODMKICAgIC8vICsgKHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgLSBzZWxmLmV2ZW50X2N1cnNvcikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njg0CiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfUEVSX0VOVFJZX0JVREdFVCkKICAgIHB1c2hpbnQgMTAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODMtNjg0CiAgICAvLyArIChzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IC0gc2VsZi5ldmVudF9jdXJzb3IpCiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfUEVSX0VOVFJZX0JVREdFVCkKICAgICoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4MgogICAgLy8gVUludDY0KGNzdC5PUF9VUF9OT05fQ0FTSF9CQVNFX0JVREdFVCkKICAgIGludGMgNCAvLyAxNTAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODItNjg0CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX05PTl9DQVNIX0JBU0VfQlVER0VUKQogICAgLy8gKyAoc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCAtIHNlbGYuZXZlbnRfY3Vyc29yKQogICAgLy8gKiBVSW50NjQoY3N0Lk9QX1VQX05PTl9DQVNIX1BFUl9FTlRSWV9CVURHRVQpCiAgICArCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODAtNjg2CiAgICAvLyBlbnN1cmVfYnVkZ2V0KAogICAgLy8gICAgIHJlcXVpcmVkX2J1ZGdldD0oCiAgICAvLyAgICAgICAgIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfQkFTRV9CVURHRVQpCiAgICAvLyAgICAgICAgICsgKHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgLSBzZWxmLmV2ZW50X2N1cnNvcikKICAgIC8vICAgICAgICAgKiBVSW50NjQoY3N0Lk9QX1VQX05PTl9DQVNIX1BFUl9FTlRSWV9CVURHRVQpCiAgICAvLyAgICAgKSwKICAgIC8vICkKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5MAogICAgLy8gZGlzY291bnRfZmFjdG9yID0gc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0OTEKICAgIC8vIGRlbm9taW5hdG9yID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0OTIKICAgIC8vIHNraXBfZmlyc3RfcmVkZW1wdGlvbiA9IEZhbHNlCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSA3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0OTQKICAgIC8vIGlmIGVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IgPiBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMjUKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgOAogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMzUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5NS00OTkKICAgIC8vICMgQW4gaW5pdGlhbCBQUkYgbWF5IGRlc2NyaWJlIHRoZSBmaXJzdCByZWRlbXB0aW9uIHBlcmlvZCBkaXJlY3RseS4KICAgIC8vIGRpc2NvdW50X2ZhY3RvciA9IHNlbGYuX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yKAogICAgLy8gICAgIGRpc2NvdW50X2ZhY3RvciwKICAgIC8vICAgICBlbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyA4CiAgICBjYWxsc3ViIF9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwMQogICAgLy8gc2tpcF9maXJzdF9yZWRlbXB0aW9uID0gVHJ1ZQogICAgaW50Y18xIC8vIDEKICAgIGZyYW1lX2J1cnkgNwogICAgZnJhbWVfYnVyeSAxCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAzNToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwMwogICAgLy8gZnV0dXJlX2V2ZW50X2lkID0gc2VsZi5ldmVudF9jdXJzb3IgKyBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X3doaWxlX3RvcEAzNjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwNAogICAgLy8gd2hpbGUgZnV0dXJlX2V2ZW50X2lkIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGZyYW1lX2RpZyAzCiAgICA+CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfd2hpbGVANDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwNQogICAgLy8gZnV0dXJlX2VudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KGZ1dHVyZV9ldmVudF9pZCkKICAgIGZyYW1lX2RpZyAzCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MDYKICAgIC8vIGZ1dHVyZV9ldmVudF90eXBlID0gZnV0dXJlX2VudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA3LTUwOAogICAgLy8gIyBPbmx5IHJlZGVtcHRpb24tYmVhcmluZyBldmVudHMgY29udHJpYnV0ZSB0byB0aGUgYW5udWl0eSBkZW5vbWluYXRvci4KICAgIC8vIGlzX3JlZGVtcHRpb25fZXZlbnQgPSBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1BSKSBvciAoCiAgICBwdXNoaW50IDMKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MDctNTExCiAgICAvLyAjIE9ubHkgcmVkZW1wdGlvbi1iZWFyaW5nIGV2ZW50cyBjb250cmlidXRlIHRvIHRoZSBhbm51aXR5IGRlbm9taW5hdG9yLgogICAgLy8gaXNfcmVkZW1wdGlvbl9ldmVudCA9IGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpIG9yICgKICAgIC8vICAgICBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgLy8gICAgIGFuZCBmdXR1cmVfZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKQogICAgLy8gKQogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX3RydWVANDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwOQogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCkKICAgIGZyYW1lX2RpZyA0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA5LTUxMAogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCkKICAgIC8vIGFuZCBmdXR1cmVfZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUxMAogICAgLy8gYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICBmcmFtZV9kaWcgMAogICAgcHVzaGludCAyNQogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwOS01MTAKICAgIC8vIGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfTUQpCiAgICAvLyBhbmQgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IgPiBVSW50NjQoMCkKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX2ZhbHNlQDQxCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF90cnVlQDQwOgogICAgaW50Y18xIC8vIDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX21lcmdlQDQyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTEyCiAgICAvLyBpZiBpc19yZWRlbXB0aW9uX2V2ZW50OgogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANDcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUxMwogICAgLy8gaWYgc2tpcF9maXJzdF9yZWRlbXB0aW9uOgogICAgZnJhbWVfZGlnIDcKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlANDUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUxNAogICAgLy8gc2tpcF9maXJzdF9yZWRlbXB0aW9uID0gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDcKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDQ3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTIxCiAgICAvLyBmdXR1cmVfZXZlbnRfaWQgKz0gVUludDY0KDEpCiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMwogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfd2hpbGVfdG9wQDM2CgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDQ1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTE4CiAgICAvLyBmdXR1cmVfZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIGZyYW1lX2RpZyAwCiAgICBwdXNoaW50IDI1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTE2LTUxOQogICAgLy8gZGlzY291bnRfZmFjdG9yID0gc2VsZi5fZGlzY291bnRfYW5udWl0eV9mYWN0b3IoCiAgICAvLyAgICAgZGlzY291bnRfZmFjdG9yLAogICAgLy8gICAgIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDIKICAgIHN3YXAKICAgIGNhbGxzdWIgX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTIwCiAgICAvLyBkZW5vbWluYXRvciArPSBkaXNjb3VudF9mYWN0b3IKICAgIGZyYW1lX2RpZyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANDcKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX2ZhbHNlQDQxOgogICAgaW50Y18wIC8vIDAKICAgIGIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfbWVyZ2VANDIKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl93aGlsZUA0ODoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUyMwogICAgLy8gYXNzZXJ0IGRlbm9taW5hdG9yID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGZyYW1lX2RpZyAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjQKICAgIC8vIG51bWVyYXRvciA9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUyNQogICAgLy8gaWYgZW50cnkuZmxhZ3MgJiBVSW50NjQoZW51bXMuRkxBR19JTklUSUFMX1BSRikgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDU3CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18yIC8vIDgKICAgICYKICAgIGJueiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1MAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTI2LTUyNwogICAgLy8gIyBTdWJzZXF1ZW50IFBSRiBldmVudHMgYW1vcnRpemUgYm90aCBwcmluY2lwYWwgYW5kIGFscmVhZHkgYWNjcnVlZCBjYXJyeS4KICAgIC8vIG51bWVyYXRvciArPSBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICArCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1MDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUzMAogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUyOC01MzIKICAgIC8vIHJldHVybiBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBudW1lcmF0b3IsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICAgICBkZW5vbWluYXRvciwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAxCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njg3CiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBzZWxmLl9yZWNhbGN1bGF0ZV9hbm51aXR5X3BheW1lbnQoCiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4Ny02ODkKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IHNlbGYuX3JlY2FsY3VsYXRlX2FubnVpdHlfcGF5bWVudCgKICAgIC8vICAgICBlbnRyeQogICAgLy8gKQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDMwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjkyCiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OTMtNjk3CiAgICAvLyBzZWxmLl9lbWl0X2V4ZWN1dGlvbl9ldmVudCgKICAgIC8vICAgICBlbnRyeT1lbnRyeSwKICAgIC8vICAgICBwYXlvZmY9VUludDY0KDApLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njk1CiAgICAvLyBwYXlvZmY9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY5NgogICAgLy8gc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OTMtNjk3CiAgICAvLyBzZWxmLl9lbWl0X2V4ZWN1dGlvbl9ldmVudCgKICAgIC8vICAgICBlbnRyeT1lbnRyeSwKICAgIC8vICAgICBwYXlvZmY9VUludDY0KDApLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGNhbGxzdWIgX2VtaXRfZXhlY3V0aW9uX2V2ZW50CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfYnVyeSAxCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAyOToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY5MQogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gZW50cnkubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDQxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAzMAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAyMDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY3NAogICAgLy8gZWxpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfSVBDQik6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgMTgKICAgID09CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAyMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc1LTY3NgogICAgLy8gIyBJUENCIGtlZXBzIHByaW5jaXBhbCB1bmNoYW5nZWQgYW5kIG9ubHkgcmVzZXRzIHRoZSBpbnRlcmVzdCBiYXNlLgogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDIzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDEwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjYyCiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9SUkYpOgogICAgZnJhbWVfZGlnIDEwCiAgICBwdXNoaW50IDExCiAgICA9PQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAxNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjYzCiAgICAvLyBuZXh0X3JhdGUgPSBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZQogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2NAogICAgLy8gaWYgbmV4dF9yYXRlID09IFVJbnQ2NCgwKToKICAgIGJueiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAxMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY1CiAgICAvLyBuZXh0X3JhdGUgPSBzZWxmLnJhdGVfcmVzZXRfbmV4dAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDM3IC8vICJyYXRlX3Jlc2V0X25leHQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSA1CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X25leHQgZXhpc3RzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2NgogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPSBuZXh0X3JhdGUKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGZyYW1lX2RpZyA1CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAxOAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAxNDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2OAogICAgLy8gaWYgZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUgIT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDkKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjkKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGZyYW1lX2RpZyA5CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAxOAoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbWl0X2V4ZWN1dGlvbl9ldmVudChlbnRyeTogYnl0ZXMsIHBheW9mZjogdWludDY0LCBzZXR0bGVkX2Ftb3VudDogdWludDY0KSAtPiBieXRlczoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzAzLTcwOQogICAgLy8gZGVmIF9lbWl0X2V4ZWN1dGlvbl9ldmVudCgKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgICosCiAgICAvLyAgICAgZW50cnk6IHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5LAogICAgLy8gICAgIHBheW9mZjogVUludDY0LAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50OiBVSW50NjQsCiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAzIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxMwogICAgLy8gY29udHJhY3RfaWQ9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25faWQuaWQsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uSUQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxNAogICAgLy8gZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE1CiAgICAvLyBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICBmcmFtZV9kaWcgLTMKICAgIGV4dHJhY3QgOCAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTYKICAgIC8vIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgZnJhbWVfZGlnIC0zCiAgICBleHRyYWN0IDkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE3CiAgICAvLyBhcHBsaWVkX2F0PUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIwCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBmcmFtZV9kaWcgLTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxNQogICAgLy8gZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgaW50Y18yIC8vIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcyMAogICAgLy8gc2VsZi5fcGF5b2ZmX3NpZ24oZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSwgcGF5b2ZmKQogICAgZ2V0Ynl0ZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzQ5CiAgICAvLyBpZiBwYXlvZmYgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0yCiAgICBibnogX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzUwCiAgICAvLyByZXR1cm4gVUludDY0KGVudW1zLlBBWU9GRl9TSUdOX1BPU0lUSVZFKQogICAgaW50Y18xIC8vIDEKCl9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9wYXlvZmZfc2lnbkA3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE5LTcyMQogICAgLy8gcGF5b2ZmX3NpZ249YXJjNC5VSW50OCgKICAgIC8vICAgICBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICAvLyApLAogICAgaXRvYgogICAgZHVwCiAgICBiaXRsZW4KICAgIGludGNfMiAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBleHRyYWN0IDcgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIzCiAgICAvLyBjdXJyZW5jeV9pZD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcyNAogICAgLy8gc2VxdWVuY2U9ZW50cnkuZXZlbnRfaWQgKyBVSW50NjQoMSksCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzEyLTcyNQogICAgLy8gRXhlY3V0aW9uRXZlbnQoCiAgICAvLyAgICAgY29udHJhY3RfaWQ9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25faWQuaWQsCiAgICAvLyAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgcGF5b2ZmPXBheW9mZiwKICAgIC8vICAgICBwYXlvZmZfc2lnbj1hcmM0LlVJbnQ4KAogICAgLy8gICAgICAgICBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBzZXR0bGVkX2Ftb3VudD1zZXR0bGVkX2Ftb3VudCwKICAgIC8vICAgICBjdXJyZW5jeV9pZD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgc2VxdWVuY2U9ZW50cnkuZXZlbnRfaWQgKyBVSW50NjQoMSksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMAogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAyCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAzCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyA0CiAgICBpdG9iCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMgogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxMS03MjYKICAgIC8vIGFyYzQuZW1pdCgKICAgIC8vICAgICBFeGVjdXRpb25FdmVudCgKICAgIC8vICAgICAgICAgY29udHJhY3RfaWQ9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25faWQuaWQsCiAgICAvLyAgICAgICAgIGV2ZW50X2lkPWVudHJ5LmV2ZW50X2lkLAogICAgLy8gICAgICAgICBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICAvLyAgICAgICAgIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgICAgICBhcHBsaWVkX2F0PUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gICAgICAgICBwYXlvZmY9cGF5b2ZmLAogICAgLy8gICAgICAgICBwYXlvZmZfc2lnbj1hcmM0LlVJbnQ4KAogICAgLy8gICAgICAgICAgICAgc2VsZi5fcGF5b2ZmX3NpZ24oZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSwgcGF5b2ZmKQogICAgLy8gICAgICAgICApLAogICAgLy8gICAgICAgICBzZXR0bGVkX2Ftb3VudD1zZXR0bGVkX2Ftb3VudCwKICAgIC8vICAgICAgICAgY3VycmVuY3lfaWQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgICAgICBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIC8vICAgICApCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHg5YTMzMmI5NSAvLyBtZXRob2QgIkV4ZWN1dGlvbkV2ZW50KHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NTEKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gKFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwgVUludDY0KGVudW1zLkVWVF9QSSkpOgogICAgZnJhbWVfZGlnIDUKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYm56IF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9pZl9ib2R5QDUKICAgIGZyYW1lX2RpZyA1CiAgICBwdXNoaW50IDQKICAgID09CiAgICBieiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUA2CgpfZW1pdF9leGVjdXRpb25fZXZlbnRfaWZfYm9keUA1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzUyCiAgICAvLyByZXR1cm4gVUludDY0KGVudW1zLlBBWU9GRl9TSUdOX1BPU0lUSVZFKQogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcyMAogICAgLy8gc2VsZi5fcGF5b2ZmX3NpZ24oZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSwgcGF5b2ZmKQogICAgYiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fcGF5b2ZmX3NpZ25ANwoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc1MwogICAgLy8gcmV0dXJuIFVJbnQ2NChlbnVtcy5QQVlPRkZfU0lHTl9ORUdBVElWRSkKICAgIHB1c2hpbnQgMjU1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MjAKICAgIC8vIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIGIgX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX3BheW9mZl9zaWduQDcKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fcm9sZV9pc19hY3RpdmUocm9sZV9tYXA6IGJ5dGVzLCByb2xlX2FkZHJlc3M6IGJ5dGVzKSAtPiB1aW50NjQ6Cl9yb2xlX2lzX2FjdGl2ZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NwogICAgLy8gZGVmIF9yb2xlX2lzX2FjdGl2ZShzZWxmLCByb2xlX21hcDogdHlwLlJiYWNSb2xlLCByb2xlX2FkZHJlc3M6IEFjY291bnQpIC0+IGJvb2w6CiAgICBwcm90byAyIDEKICAgIHB1c2hieXRlcyAiIgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU4LTYyCiAgICAvLyByZXR1cm4gc2VsZi5faGFzX3JvbGUocm9sZV9tYXAsIHJvbGVfYWRkcmVzcykgYW5kICgKICAgIC8vICAgICByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICkKICAgIGJ6IF9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIEJveE1hcCBlbnRyeSBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYwCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MAogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgPD0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYxCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIEJveE1hcCBlbnRyeSBleGlzdHMKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYwLTYxCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDAKICAgID49CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTktNjEKICAgIC8vIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IF9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQKICAgIGludGNfMSAvLyAxCgpfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU4LTYyCiAgICAvLyByZXR1cm4gc2VsZi5faGFzX3JvbGUocm9sZV9tYXAsIHJvbGVfYWRkcmVzcykgYW5kICgKICAgIC8vICAgICByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICkKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgX3JvbGVfaXNfYWN0aXZlX2Jvb2xfbWVyZ2VANQoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkgLT4gdm9pZDoKX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjUKICAgIC8vIGFzc2VydCBzZWxmLl9pc19hcnJhbmdlcihUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjUyCiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzID09IHNlbGYuYXJyYW5nZXIudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOCAvLyAweDUyM2E0MTUyNTIyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgPT0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2NQogICAgLy8gYXNzZXJ0IHNlbGYuX2lzX2FycmFuZ2VyKFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpIC0+IHZvaWQ6Cl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4MwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFzc2V0X2RlZmF1bHRlZCwgZXJyLkRFRkFVTFRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQxIC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfZGVmYXVsdGVkIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIERlZmF1bHRlZAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkgLT4gdm9pZDoKX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg2CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYXNzZXRfc3VzcGVuZGVkLCBlcnIuU1VTUEVOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzMgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9zdXNwZW5kZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gU3VzcGVuZGVkIG9wZXJhdGlvbnMKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkOiB1aW50NjQpIC0+IHZvaWQ6Cl9hc3NlcnRfdmFsaWRfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OAogICAgLy8gZGVmIF9hc3NlcnRfdmFsaWRfcm9sZShzZWxmLCByb2xlX2lkOiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTAKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIHB1c2hpbnQgMjAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkxCiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgcHVzaGludCAyNQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTIKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICBwdXNoaW50IDQwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MwogICAgLy8gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgcHVzaGludCA1MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTQKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgcHVzaGludCA2MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTUKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICBwdXNoaW50IDcwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NgogICAgLy8gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgcHVzaGludCA4MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfZmFsc2VAOAoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3OgogICAgaW50Y18xIC8vIDEKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX21lcmdlQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgcmV0c3ViCgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9mYWxzZUA4OgogICAgaW50Y18wIC8vIDAKICAgIGIgX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfbWVyZ2VAOQo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="}, "sourceInfo": {"approval": {"pcOffsetMethod": "none", "sourceInfo": [{"pc": [2648], "errorMessage": "ACTUS event not yet executed"}, {"pc": [2406], "errorMessage": "Can not distribute zero units"}, {"pc": [3149, 3156, 3529], "errorMessage": "D-ASA already configured"}, {"pc": [1255, 1987, 2366, 2512, 3746, 3892, 4243, 4474, 4620], "errorMessage": "D-ASA not configured"}, {"pc": [3540], "errorMessage": "D-ASA terms not configured"}, {"pc": [6809], "errorMessage": "Defaulted"}, {"pc": [3167], "errorMessage": "Denomination asset is not properly set"}, {"pc": [3182], "errorMessage": "Different settlement asset not supported, must be equal to denomination asset"}, {"pc": [3418, 3425, 3427], "errorMessage": "IED must be set in the future"}, {"pc": [1273, 2056, 2527, 4261, 6161], "errorMessage": "IED not yet executed"}, {"pc": [2419, 5544], "errorMessage": "Insufficient remaining D-ASA units"}, {"pc": [2622, 2688], "errorMessage": "Insufficient sender units to transfer"}, {"pc": [1883, 3069, 3087, 3143, 3620, 3656, 4308, 5728, 6006, 6066, 6469], "errorMessage": "Invalid ACTUS configuration"}, {"pc": [1996, 2400, 2583, 2598, 2755, 2828, 2891, 2933, 5356, 5481], "errorMessage": "Invalid account holding address"}, {"pc": [4811, 4835, 4859, 4883, 4907, 4964, 4992, 5014, 5036, 5058, 5237, 5255, 5270, 5285, 5300], "errorMessage": "Invalid account role address"}, {"pc": [3129], "errorMessage": "Invalid day-count convention ID"}, {"pc": [1386, 3767, 4095, 6038], "errorMessage": "Invalid event cursor"}, {"pc": [3605, 3668, 3944, 4285, 5644], "errorMessage": "Invalid event id"}, {"pc": [3780, 4159, 4166, 4298], "errorMessage": "Invalid event type"}, {"pc": [4948, 5227, 6879], "errorMessage": "Invalid role identifier"}, {"pc": [3534, 3680, 3688, 3997, 4372, 5659, 5675], "errorMessage": "Invalid schedule page"}, {"pc": [5592], "errorMessage": "No D-ASA units"}, {"pc": [1392, 1912, 2093, 6047], "errorMessage": "No due cashflow to pay"}, {"pc": [6130], "errorMessage": "Not IED event"}, {"pc": [2041, 2374, 2570, 2745, 2801, 2811, 2897, 4194, 5081, 6801], "errorMessage": "Not authorized"}, {"pc": [1513, 1521, 2142, 2216, 2225], "errorMessage": "Not enough funds for the payment"}, {"pc": [3917, 3930, 4270], "errorMessage": "Observed event required to execute this action"}, {"pc": [2388, 2436], "errorMessage": "Primary distribution is closed"}, {"pc": [6078], "errorMessage": "Primary distribution is not complete"}, {"pc": [2611], "errorMessage": "Sender and receiver must be different"}, {"pc": [5342, 6817], "errorMessage": "Suspended operations"}, {"pc": [2323, 3646, 4330], "errorMessage": "Time events must be sorted in strictly ascending order"}, {"pc": [2544, 2561], "errorMessage": "Transfer is closed"}, {"pc": [2615], "errorMessage": "Transfer units must be greater than zero"}, {"pc": [939], "errorMessage": "Wrong Global Bytes allocation"}, {"pc": [945], "errorMessage": "Wrong Global UInts allocation"}, {"pc": [949], "errorMessage": "Wrong Local Bytes allocation"}, {"pc": [953], "errorMessage": "Wrong Local UInts allocation"}, {"pc": [1494, 2135], "errorMessage": "account opted into asset"}, {"pc": [6761, 6776], "errorMessage": "check BoxMap entry exists"}, {"pc": [2032, 2070, 2111, 2149, 2440, 2618, 2677, 2703, 5336, 5502], "errorMessage": "check self.account entry exists"}, {"pc": [1575, 1807, 1895, 4531, 6166, 6489], "errorMessage": "check self.accrued_interest exists"}, {"pc": [5099, 6799], "errorMessage": "check self.arranger exists"}, {"pc": [6807], "errorMessage": "check self.asset_defaulted exists"}, {"pc": [6815], "errorMessage": "check self.asset_suspended exists"}, {"pc": [3077, 3523, 3913, 3925, 4266, 4479, 5890], "errorMessage": "check self.contract_type exists"}, {"pc": [1543, 4536, 5364, 5442], "errorMessage": "check self.cumulative_interest_index exists"}, {"pc": [1555, 4541, 5375, 5450], "errorMessage": "check self.cumulative_principal_index exists"}, {"pc": [5900], "errorMessage": "check self.dynamic_principal_redemption exists"}, {"pc": [1311, 1323, 1384, 1626, 2626, 2638, 3759, 4088, 4507, 4624, 4636, 4673, 5457, 6036, 6118, 6315, 6370, 6508], "errorMessage": "check self.event_cursor exists"}, {"pc": [5390, 5404, 5597, 5626, 5956, 5964, 5991, 6011, 6201, 6334, 6495], "errorMessage": "check self.fixed_point_scale exists"}, {"pc": [6244], "errorMessage": "check self.has_rate_reset_cap exists"}, {"pc": [6217], "errorMessage": "check self.has_rate_reset_floor exists"}, {"pc": [3154, 3539, 4503, 6135], "errorMessage": "check self.initial_exchange_amount exists"}, {"pc": [2424, 2434], "errorMessage": "check self.initial_exchange_date exists"}, {"pc": [1751, 4521, 5932, 5946], "errorMessage": "check self.interest_calculation_base exists"}, {"pc": [1823, 1838], "errorMessage": "check self.next_principal_redemption exists"}, {"pc": [4526, 5924, 5951, 5996], "errorMessage": "check self.nominal_interest_rate exists"}, {"pc": [2001, 2014], "errorMessage": "check self.op_daemon exists"}, {"pc": [1648, 1717, 1743, 1797, 1849, 1858, 1880, 4516, 6474, 6555], "errorMessage": "check self.outstanding_principal exists"}, {"pc": [6252, 6266], "errorMessage": "check self.rate_reset_cap exists"}, {"pc": [6225, 6239], "errorMessage": "check self.rate_reset_floor exists"}, {"pc": [6196], "errorMessage": "check self.rate_reset_multiplier exists"}, {"pc": [6589], "errorMessage": "check self.rate_reset_next exists"}, {"pc": [6209], "errorMessage": "check self.rate_reset_spread exists"}, {"pc": [1499, 2211, 4546], "errorMessage": "check self.reserved_interest exists"}, {"pc": [1504, 1533, 2221, 2236, 4551], "errorMessage": "check self.reserved_principal exists"}, {"pc": [2411, 2459, 4498, 5539, 6071], "errorMessage": "check self.reserved_units_total exists"}, {"pc": [1315, 2630, 3763, 3942, 3959, 4079, 4280, 4315, 4334, 4454, 4511, 4628, 5640, 6311, 6378], "errorMessage": "check self.schedule_entry_count exists"}, {"pc": [3987, 4362], "errorMessage": "check self.schedule_page entry exists"}, {"pc": [1491, 2101, 2129, 6661], "errorMessage": "check self.settlement_asset_id exists"}, {"pc": [1254, 1268, 1986, 2051, 2365, 2384, 2511, 2522, 2805, 3147, 3527, 3745, 3891, 4242, 4256, 4472, 4619, 5485, 6062, 6156], "errorMessage": "check self.status exists"}, {"pc": [2417, 2470, 4493, 5590, 5621, 6076], "errorMessage": "check self.total_units exists"}, {"pc": [2549, 2559], "errorMessage": "check self.transfer_closure_date exists"}, {"pc": [2532, 2540], "errorMessage": "check self.transfer_opening_date exists"}, {"pc": [3582, 3639], "errorMessage": "index access is out of bounds"}, {"pc": [1970, 3014, 3497, 3992, 4367], "errorMessage": "invalid array length header"}, {"pc": [2735, 3485, 5071], "errorMessage": "invalid number of bytes for arc4.bool"}, {"pc": [1978], "errorMessage": "invalid number of bytes for arc4.dynamic_array"}, {"pc": [3512], "errorMessage": "invalid number of bytes for arc4.dynamic_array"}, {"pc": [1964, 2349, 2489, 2497, 2727, 2785, 2793, 2873, 2881, 2924, 2949, 4692, 4716, 4750, 4931, 5113, 5197], "errorMessage": "invalid number of bytes for arc4.static_array"}, {"pc": [1249, 2307, 2316, 2357, 2506, 3475, 3876], "errorMessage": "invalid number of bytes for arc4.uint64"}, {"pc": [4740, 4921, 5187], "errorMessage": "invalid number of bytes for arc4.uint8"}, {"pc": [2986], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.InitialKernelState"}, {"pc": [2975], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.NormalizedActusTerms"}, {"pc": [4238], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.ObservedCashEventRequest"}, {"pc": [3887], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.ObservedEventRequest"}, {"pc": [3019], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.Prospectus"}, {"pc": [4761], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.RoleValidity"}, {"pc": [3003], "errorMessage": "invalid tail pointer at index 1 of (uint8[32],(len+utf8[]))"}, {"pc": [2998], "errorMessage": "invalid tuple encoding"}, {"pc": [4059, 4434], "errorMessage": "max array length exceeded"}, {"pc": [4485, 6653], "errorMessage": "overflow"}]}, "clear": {"pcOffsetMethod": "none", "sourceInfo": []}}, "templateVariables": {}}""" +_APP_SPEC_JSON = r"""{"arcs": [22, 28], "bareActions": {"call": [], "create": []}, "methods": [{"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "desc": "Maximum number of due cash events to process in this call.", "name": "max_event_count"}], "name": "fund_due_cashflows", "returns": {"type": "(uint64,uint64,uint64,uint64,uint64)", "desc": "Funding result with reserved interest, reserved principal, and event count.", "struct": "CashFundingResult"}, "desc": "Reserve due ACTUS cash events into the escrow-style claim ledger.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Holder whose position should be settled and claimed.", "name": "holding_address"}, {"type": "byte[]", "desc": "Opaque settlement context returned in the result.", "name": "payment_info"}], "name": "claim_due_cashflows", "returns": {"type": "(uint64,uint64,uint64,uint64,byte[])", "desc": "Claim result with realized interest, principal, and passthrough context.", "struct": "CashClaimResult"}, "desc": "Withdraw the holder's already funded ACTUS cash entitlements.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "desc": "Inclusive UNIX timestamp at which transfers may start.", "name": "open_date"}, {"type": "uint64", "desc": "Exclusive UNIX timestamp at which transfers stop.", "name": "closure_date"}], "name": "transfer_set_schedule", "returns": {"type": "uint64", "desc": "UNIX timestamp of the schedule update."}, "desc": "Configure the secondary-market transfer window.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account receiving the reserved units.", "name": "holding_address"}, {"type": "uint64", "desc": "Number of units to reserve.", "name": "units"}], "name": "primary_distribution", "returns": {"type": "uint64", "desc": "Remaining undistributed unit balance."}, "desc": "Reserve units for a holder before the initial exchange activates issuance.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account debited for the transfer.", "name": "sender_holding_address"}, {"type": "address", "desc": "Account credited for the transfer.", "name": "receiver_holding_address"}, {"type": "uint64", "desc": "Number of active units to move.", "name": "units"}], "name": "transfer", "returns": {"type": "uint64", "desc": "Number of units transferred."}, "desc": "Transfer active units after settling both counterparties to the current cursor.\nReturns the number of units moved. The ACTUS kernel no longer persists a nominal per-unit value on-chain, so transfer results are unit-based.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account holding address.", "name": "holding_address"}, {"type": "bool", "desc": "Suspension status to apply.", "name": "suspended"}], "name": "account_suspension", "returns": {"type": "uint64", "desc": "UNIX timestamp of the suspension update."}, "desc": "Set the suspension status of one account.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account holding address.", "name": "holding_address"}, {"type": "address", "desc": "Account payment address.", "name": "payment_address"}], "name": "account_open", "returns": {"type": "uint64", "desc": "UNIX timestamp of the account opening."}, "desc": "Open a contract account with a new position and register its payment address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account holding address.", "name": "holding_address"}, {"type": "address", "desc": "New account payment address.", "name": "payment_address"}], "name": "account_update_payment_address", "returns": {"type": "uint64", "desc": "UNIX timestamp of the account update."}, "desc": "Update the payment address of an account.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account holding address.", "name": "holding_address"}], "name": "account_get_position", "returns": {"type": "(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64)", "desc": "Account position record.", "struct": "AccountPosition"}, "desc": "Get the full accounting position for one holder.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": [], "create": ["NoOp"]}, "args": [{"type": "address", "desc": "D-ASA arranger address.", "name": "arranger"}], "name": "contract_create", "returns": {"type": "uint64", "desc": "UNIX timestamp of contract creation."}, "desc": "Create a new D-ASA contract and set the arranger role.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64)", "desc": "Normalized ACTUS terms.", "name": "terms", "struct": "NormalizedActusTerms"}, {"type": "(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "desc": "Initial kernel state captured before `IED`.", "name": "initial_state", "struct": "InitialKernelState"}, {"type": "(byte[32],string)", "desc": "Prospectus metadata stored for reference only.", "name": "prospectus", "struct": "Prospectus"}], "name": "contract_config", "returns": {"type": "uint64", "desc": "UNIX timestamp of contract configuration."}, "desc": "Partial contract configuration with: normalized ACTUS terms, initial kernel\nstate (pre-IED), prospectus (informational only). The contract stays inactive until all schedule pages are configured next.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "desc": "Zero-based page index within the boxed schedule.", "name": "schedule_page_index"}, {"type": "bool", "desc": "Whether this page finalizes the schedule upload.", "name": "is_last_page"}, {"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[]", "desc": "Normalized schedule entries for the requested page.", "name": "schedule_page"}], "name": "contract_schedule", "returns": {"type": "uint64", "desc": "UNIX timestamp of the schedule upload."}, "desc": "Upload one normalized schedule page.\nThe configuration operation is considered complete only when the last page is stored. At that point `schedule_entry_count` is finalized and the contract moves to `STATUS_PENDING_IED`.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "contract_execute_ied", "returns": {"type": "uint64", "desc": "UNIX timestamp of the `IED` execution."}, "desc": "Execute the first due `IED` entry and activate the contract.\n`IED` is the one non-cash event that moves the app from `STATUS_PENDING_IED` to `STATUS_ACTIVE`.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "desc": "Expected global schedule event identifier at the current cursor.", "name": "event_id"}, {"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "desc": "Observed payload used for append-on-execute and/or rate resets.", "name": "payload", "struct": "ObservedEventRequest"}], "name": "apply_non_cash_event", "returns": {"type": "uint64", "desc": "UNIX timestamp of the non-cash event application."}, "desc": "Apply the next due non-cash event, optionally appending one first.\nObserved payloads are appended before execution when flagged. Rate reset events require the interest oracle because they can change the running nominal rate; other non-cash events stay arranger-controlled.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "desc": "Observed cash-event payload to append after the current tail.", "name": "payload", "struct": "ObservedCashEventRequest"}], "name": "append_observed_cash_event", "returns": {"type": "uint64", "desc": "UNIX timestamp of the append operation."}, "desc": "Append an arranger-authorized observed cash event to the schedule tail.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Default status", "name": "defaulted"}], "name": "contract_set_default_status", "returns": {"type": "uint64"}, "desc": "Set D-ASA default status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "contract_get_state", "returns": {"type": "(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "desc": "Current kernel state snapshot.", "struct": "KernelState"}, "desc": "Return a readonly snapshot of the generic ACTUS kernel state.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "contract_get_next_due_event", "returns": {"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "desc": "Next due schedule entry, or an all-zero sentinel if the contract ended.", "struct": "ExecutionScheduleEntry"}, "desc": "Return the next boxed schedule entry, or a zeroed sentinel if ended.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["UpdateApplication"], "create": []}, "args": [], "name": "contract_update", "returns": {"type": "void", "desc": "None."}, "desc": "Update D-ASA application.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "New arranger address.", "name": "new_arranger"}], "name": "rbac_rotate_arranger", "returns": {"type": "uint64", "desc": "UNIX timestamp of the role assignment."}, "desc": "Rotate the arranger address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Operation daemon address.", "name": "address"}], "name": "rbac_set_op_daemon", "returns": {"type": "uint64", "desc": "UNIX timestamp of the role assignment."}, "desc": "Non-normative helper to set the operation daemon address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role identifier.", "name": "role_id"}, {"type": "address", "desc": "Account role address.", "name": "role_address"}, {"type": "(uint64,uint64)", "desc": "Inclusive validity interval for the assignment.", "name": "validity", "struct": "RoleValidity"}], "name": "rbac_assign_role", "returns": {"type": "uint64", "desc": "UNIX timestamp of the role assignment."}, "desc": "Assign a role to an address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role identifier.", "name": "role_id"}, {"type": "address", "desc": "Account role address.", "name": "role_address"}], "name": "rbac_revoke_role", "returns": {"type": "uint64", "desc": "UNIX timestamp of the role revocation."}, "desc": "Revoke a role from an address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Suspension status to apply.", "name": "suspended"}], "name": "rbac_contract_suspension", "returns": {"type": "uint64", "desc": "UNIX timestamp of the suspension update."}, "desc": "Set the asset-wide suspension status.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "rbac_get_arranger", "returns": {"type": "address", "desc": "Current arranger address."}, "desc": "Get the arranger address.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Address to query.", "name": "address"}], "name": "rbac_get_address_roles", "returns": {"type": "(bool,bool,bool,bool,bool)", "desc": "Roles mask in the order: account manager, primary dealer, trustee, authority, observer."}, "desc": "Non-normative helper to get the active roles assigned to an address.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role identifier.", "name": "role_id"}, {"type": "address", "desc": "Account role address.", "name": "role_address"}], "name": "rbac_get_role_validity", "returns": {"type": "(uint64,uint64)", "desc": "Stored role validity interval.", "struct": "RoleValidity"}, "desc": "Get the stored validity interval for a role assignment.", "events": [], "readonly": true, "recommendations": {}}], "name": "DASA", "state": {"keys": {"box": {}, "global": {"arranger": {"key": "UjpBUlIj", "keyType": "AVMBytes", "valueType": "address"}, "op_daemon": {"key": "UjpPUEQj", "keyType": "AVMBytes", "valueType": "address"}, "asset_suspended": {"key": "YXNzZXRfc3VzcGVuZGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "asset_defaulted": {"key": "YXNzZXRfZGVmYXVsdGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "status": {"key": "c3RhdHVz", "keyType": "AVMString", "valueType": "AVMUint64"}, "contract_type": {"key": "Y29udHJhY3RfdHlwZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "prospectus_hash": {"key": "cHJvc3BlY3R1c19oYXNo", "keyType": "AVMString", "valueType": "AVMBytes"}, "prospectus_url": {"key": "cHJvc3BlY3R1c191cmw=", "keyType": "AVMString", "valueType": "AVMString"}, "denomination_asset_id": {"key": "ZGVub21pbmF0aW9uX2Fzc2V0X2lk", "keyType": "AVMString", "valueType": "AVMUint64"}, "settlement_asset_id": {"key": "c2V0dGxlbWVudF9hc3NldF9pZA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "initial_exchange_date": {"key": "aW5pdGlhbF9leGNoYW5nZV9kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "maturity_date": {"key": "bWF0dXJpdHlfZGF0ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "transfer_opening_date": {"key": "dHJhbnNmZXJfb3BlbmluZ19kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "transfer_closure_date": {"key": "dHJhbnNmZXJfY2xvc3VyZV9kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "day_count_convention": {"key": "ZGF5X2NvdW50X2NvbnZlbnRpb24=", "keyType": "AVMString", "valueType": "AVMUint64"}, "total_units": {"key": "dG90YWxfdW5pdHM=", "keyType": "AVMString", "valueType": "AVMUint64"}, "reserved_units_total": {"key": "cmVzZXJ2ZWRfdW5pdHNfdG90YWw=", "keyType": "AVMString", "valueType": "AVMUint64"}, "initial_exchange_amount": {"key": "aW5pdGlhbF9leGNoYW5nZV9hbW91bnQ=", "keyType": "AVMString", "valueType": "AVMUint64"}, "outstanding_principal": {"key": "b3V0c3RhbmRpbmdfcHJpbmNpcGFs", "keyType": "AVMString", "valueType": "AVMUint64"}, "next_principal_redemption": {"key": "bmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbg==", "keyType": "AVMString", "valueType": "AVMUint64"}, "dynamic_principal_redemption": {"key": "ZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbg==", "keyType": "AVMString", "valueType": "AVMUint64"}, "interest_calculation_base": {"key": "aW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "accrued_interest": {"key": "YWNjcnVlZF9pbnRlcmVzdA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "nominal_interest_rate": {"key": "bm9taW5hbF9pbnRlcmVzdF9yYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_spread": {"key": "cmF0ZV9yZXNldF9zcHJlYWQ=", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_multiplier": {"key": "cmF0ZV9yZXNldF9tdWx0aXBsaWVy", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_floor": {"key": "cmF0ZV9yZXNldF9mbG9vcg==", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_cap": {"key": "cmF0ZV9yZXNldF9jYXA=", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_next": {"key": "cmF0ZV9yZXNldF9uZXh0", "keyType": "AVMString", "valueType": "AVMUint64"}, "has_rate_reset_floor": {"key": "aGFzX3JhdGVfcmVzZXRfZmxvb3I=", "keyType": "AVMString", "valueType": "AVMUint64"}, "has_rate_reset_cap": {"key": "aGFzX3JhdGVfcmVzZXRfY2Fw", "keyType": "AVMString", "valueType": "AVMUint64"}, "reserved_principal": {"key": "cmVzZXJ2ZWRfcHJpbmNpcGFs", "keyType": "AVMString", "valueType": "AVMUint64"}, "reserved_interest": {"key": "cmVzZXJ2ZWRfaW50ZXJlc3Q=", "keyType": "AVMString", "valueType": "AVMUint64"}, "cumulative_interest_index": {"key": "Y3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "cumulative_principal_index": {"key": "Y3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXg=", "keyType": "AVMString", "valueType": "AVMUint64"}, "event_cursor": {"key": "ZXZlbnRfY3Vyc29y", "keyType": "AVMString", "valueType": "AVMUint64"}, "schedule_entry_count": {"key": "c2NoZWR1bGVfZW50cnlfY291bnQ=", "keyType": "AVMString", "valueType": "AVMUint64"}, "defaulted": {"key": "ZGVmYXVsdGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "fixed_point_scale": {"key": "Zml4ZWRfcG9pbnRfc2NhbGU=", "keyType": "AVMString", "valueType": "AVMUint64"}}, "local": {}}, "maps": {"box": {"account_manager": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpNTkcj"}, "primary_dealer": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpQWUQj"}, "trustee": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpUUlMj"}, "authority": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpBVVQj"}, "observer": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpNT0Mj"}, "schedule_page": {"keyType": "uint64", "valueType": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[]", "prefix": "UyM="}, "account": {"keyType": "address", "valueType": "AccountPosition", "prefix": "QSM="}}, "global": {}, "local": {}}, "schema": {"global": {"bytes": 4, "ints": 38}, "local": {"bytes": 0, "ints": 0}}}, "structs": {"AccountPosition": [{"name": "payment_address", "type": "address"}, {"name": "units", "type": "uint64"}, {"name": "reserved_units", "type": "uint64"}, {"name": "suspended", "type": "bool"}, {"name": "settled_cursor", "type": "uint64"}, {"name": "interest_checkpoint", "type": "uint64"}, {"name": "principal_checkpoint", "type": "uint64"}, {"name": "claimable_interest", "type": "uint64"}, {"name": "claimable_principal", "type": "uint64"}], "CashClaimResult": [{"name": "interest_amount", "type": "uint64"}, {"name": "principal_amount", "type": "uint64"}, {"name": "total_amount", "type": "uint64"}, {"name": "timestamp", "type": "uint64"}, {"name": "context", "type": "byte[]"}], "CashFundingResult": [{"name": "funded_interest", "type": "uint64"}, {"name": "funded_principal", "type": "uint64"}, {"name": "total_funded", "type": "uint64"}, {"name": "processed_events", "type": "uint64"}, {"name": "timestamp", "type": "uint64"}], "ExecutionScheduleEntry": [{"name": "event_id", "type": "uint64"}, {"name": "event_type", "type": "uint8"}, {"name": "scheduled_time", "type": "uint64"}, {"name": "accrual_factor", "type": "uint64"}, {"name": "redemption_accrual_factor", "type": "uint64"}, {"name": "next_nominal_interest_rate", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "next_outstanding_principal", "type": "uint64"}, {"name": "flags", "type": "uint64"}], "InitialKernelState": [{"name": "status_date", "type": "uint64"}, {"name": "event_cursor", "type": "uint64"}, {"name": "outstanding_principal", "type": "uint64"}, {"name": "interest_calculation_base", "type": "uint64"}, {"name": "nominal_interest_rate", "type": "uint64"}, {"name": "accrued_interest", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "cumulative_interest_index", "type": "uint64"}, {"name": "cumulative_principal_index", "type": "uint64"}], "KernelState": [{"name": "contract_type", "type": "uint8"}, {"name": "status", "type": "uint64"}, {"name": "total_units", "type": "uint64"}, {"name": "reserved_units_total", "type": "uint64"}, {"name": "initial_exchange_amount", "type": "uint64"}, {"name": "event_cursor", "type": "uint64"}, {"name": "schedule_entry_count", "type": "uint64"}, {"name": "outstanding_principal", "type": "uint64"}, {"name": "interest_calculation_base", "type": "uint64"}, {"name": "nominal_interest_rate", "type": "uint64"}, {"name": "accrued_interest", "type": "uint64"}, {"name": "cumulative_interest_index", "type": "uint64"}, {"name": "cumulative_principal_index", "type": "uint64"}, {"name": "reserved_interest", "type": "uint64"}, {"name": "reserved_principal", "type": "uint64"}], "NormalizedActusTerms": [{"name": "contract_type", "type": "uint8"}, {"name": "denomination_asset_id", "type": "uint64"}, {"name": "settlement_asset_id", "type": "uint64"}, {"name": "total_units", "type": "uint64"}, {"name": "notional_principal", "type": "uint64"}, {"name": "initial_exchange_amount", "type": "uint64"}, {"name": "initial_exchange_date", "type": "uint64"}, {"name": "maturity_date", "type": "uint64"}, {"name": "day_count_convention", "type": "uint8"}, {"name": "rate_reset_spread", "type": "uint64"}, {"name": "rate_reset_multiplier", "type": "uint64"}, {"name": "rate_reset_floor", "type": "uint64"}, {"name": "rate_reset_cap", "type": "uint64"}, {"name": "rate_reset_next", "type": "uint64"}, {"name": "has_rate_reset_floor", "type": "bool"}, {"name": "has_rate_reset_cap", "type": "bool"}, {"name": "dynamic_principal_redemption", "type": "bool"}, {"name": "fixed_point_scale", "type": "uint64"}], "ObservedCashEventRequest": [{"name": "event_id", "type": "uint64"}, {"name": "event_type", "type": "uint8"}, {"name": "scheduled_time", "type": "uint64"}, {"name": "accrual_factor", "type": "uint64"}, {"name": "redemption_accrual_factor", "type": "uint64"}, {"name": "next_nominal_interest_rate", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "next_outstanding_principal", "type": "uint64"}, {"name": "flags", "type": "uint64"}], "ObservedEventRequest": [{"name": "event_id", "type": "uint64"}, {"name": "event_type", "type": "uint8"}, {"name": "scheduled_time", "type": "uint64"}, {"name": "accrual_factor", "type": "uint64"}, {"name": "redemption_accrual_factor", "type": "uint64"}, {"name": "observed_rate", "type": "uint64"}, {"name": "next_nominal_interest_rate", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "next_outstanding_principal", "type": "uint64"}, {"name": "flags", "type": "uint64"}], "Prospectus": [{"name": "hash", "type": "byte[32]"}, {"name": "url", "type": "string"}], "RoleValidity": [{"name": "role_validity_start", "type": "uint64"}, {"name": "role_validity_end", "type": "uint64"}]}, "byteCode": {"approval": "DCAFAAEIINwLJjIEFR98dQZzdGF0dXMMZXZlbnRfY3Vyc29yFHNjaGVkdWxlX2VudHJ5X2NvdW50FW91dHN0YW5kaW5nX3ByaW5jaXBhbBFmaXhlZF9wb2ludF9zY2FsZRBhY2NydWVkX2ludGVyZXN0GWludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UCQSMVbm9taW5hbF9pbnRlcmVzdF9yYXRlDWNvbnRyYWN0X3R5cGUUcmVzZXJ2ZWRfdW5pdHNfdG90YWwScmVzZXJ2ZWRfcHJpbmNpcGFsC3RvdGFsX3VuaXRzGW5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24RcmVzZXJ2ZWRfaW50ZXJlc3QZY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleBpjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleAZSOkFSUiMTc2V0dGxlbWVudF9hc3NldF9pZBdpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudAZSOkFVVCMGUjpQWUQjBlI6TU5HIwJTIwZSOk1PQyMGUjpUUlMjBlI6T1BEIxVpbml0aWFsX2V4Y2hhbmdlX2RhdGUVdHJhbnNmZXJfb3BlbmluZ19kYXRlFXRyYW5zZmVyX2Nsb3N1cmVfZGF0ZRByYXRlX3Jlc2V0X2Zsb29yDnJhdGVfcmVzZXRfY2FwD2Fzc2V0X3N1c3BlbmRlZBxkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uEXJhdGVfcmVzZXRfc3ByZWFkFXJhdGVfcmVzZXRfbXVsdGlwbGllcg9yYXRlX3Jlc2V0X25leHQUaGFzX3JhdGVfcmVzZXRfZmxvb3ISaGFzX3JhdGVfcmVzZXRfY2FwAQAPYXNzZXRfZGVmYXVsdGVkD3Byb3NwZWN0dXNfaGFzaA5wcm9zcGVjdHVzX3VybBVkZW5vbWluYXRpb25fYXNzZXRfaWQNbWF0dXJpdHlfZGF0ZRRkYXlfY291bnRfY29udmVudGlvbglkZWZhdWx0ZWQDBoEBAgAAMRhAALEnEjIDZycbMgNnJyEiZycpImcpImcnCiJnJyqAAGcnK4AAZycsImcnEyJnJxwiZyctImcnHSJnJx4iZycuImcnDSJnJwsiZycUImcnBCJnJw4iZyciImcnByJnJwYiZycJImcnIyJnJyQiZycfImcnICJnJyUiZycmImcnJyJnJwwiZycPImcnECJnJxEiZyoiZysiZycvImcnBSJnMTWBBBJEMTSBJhJEMTcURDE2FESABJFPBOs2GgCOAQDOMRkURDEYQQC3ghkEtEYYyATngyUpBJQ4hyMEbIXj7gS90alEBHwPGBIEFPwQ7wR0pyl/BAnU/hQEmpv6hQSF7tM9BKssD8QE2fIlrASYg1BaBPtNRCgEjqbnTAQCr1V6BIL3Gy0E7wT10wTfNDVQBD2+gL0EHj5I5wQBDIKZBHQGrNIEGnKi7jYaAI4ZAFYDIQR9BKcFMQYhBlsGswbmBxQJCAofCpgMBAz2DRUNqA3tDgUOHQ7SD2gPhw+SD9wAgASVbXFWNhoAjgEG8QAxGYEEEjEYEERCDc2KAgCL/oEKCIsAMgwNQQAqsYEGshCBBbIZJzCyHicwsh+L/40CAAsABLNC/9syALIBQv/1IrIBQv/viSKAAEcNNhoBSRUkEkQXIillRESIFb2IFcSIFckiKWVEgTISFESIEiBBAAtJgWQLIQQIIoj/jyJFBSJFDiJFDUsESwEMQQJZIiplRCIrZUQMQQJNIiplRIgQ8klFEYEJW0lFAzIHDUACN0sPJFVJRRAkEklFBEAAEEsOgQMSQAAISw6BExJBAj8jQQIUSw8iWyIqZUQSREsBMgcOREsCQAHtSw6BExJAAeUiRQtLDyRVSUUQgQMSQAFlSw6BExJAAV0iRQZLD4ExW0UIiBF6QAD+SwdFCUsKiBA4SwaIEDNLAYgQTUlOAkUPSYgQRElFC0sCSwEISUUJMgoiJxNlRHAARCInD2VEIicMZURLAQhLAksBD0RPAkwJTwIPRE8DCCcPTGciJwxlRAgnDExnIicQZURPAggnEExnIicRZUQIJxFMZ0sPJFWBAxJBAHoiJwZlREsQiBEGRRIIJwZMZ4gQ5kEACksPJFWBExJBAAlLD4EpWycOTGcnBEsIZycHSwlnIiplRCMIKkxnSw9XCAGAAROoQQARIicEZURAAAkpgcgBZycHImdLD0sESYgTc0hLDUsMCEUOSwxLBwhFDUsEIwhFBUL+dycGImdC/5BLDyRVSUUQgQMSQQAQIicEZURLBglJRQlFCUL+6UsOJBJBABMiJwRlTEUJRCInB2VMRQpEQv7PSw6BExJAAAdLB0UJQv7AIkUIIkUJQv63iBAnQQBWSw6BExJBAAoiJwRlREUGQv6OIicGZURLEIgQHkUSCElFCyInDmVED0EABiJFBkL+byInDmVESwoJSUUIIicEZUQNQQAKIicEZURFBkL+UUsGRQZC/kpLD4ExWyInBGVESg5ETAlFBkL+NiInBmVESxCID8ZFEghFC0L+DEsESURLDklLD0lOAwgyB08CFk8DFlBPAhZQTwIWUEwWUChMULAjQyJC/b6AAEcCNhoBRwIVJRJENhoCSSJZgQIISwEVEkRXAgBMIillREQnCExQSb1FAUQiJxtlRDIDE0EAIjEAIicbZUQSQAAVMQBLAxJAAA0xAEsBvkRXACASQQEAI0SIErWIEroiKWVEgTISFERLAkmIDWqIDO1GAkm+REmBSVtJTgJFCEmBUVtJRQhPAghJRQZEVwAgIicTZURwAEUBQQC3Sb5EgYADU0AArSNBAHgyCiInE2VETEsBcABESwVJTgIPREsCSU4DvkRJVwAgsTIATwOyEkyyFE8CshGBBLIQsgGzSYFJW0lOAkUJSYFRW0lOA0UJIhZMSwFcSUxcUU8DTL8iJw9lRElLAg9EIicMZURLAw9ETAknD0xnIicMZURMCScMTGdLBUlLBklOAwgyB08CFk8DFlBPAhZQTBZQSwJJFRZXBgJMUEyAAgAiUExQKExQsCNDIkL/UCJC/v02GgFJFSQSRBc2GgJJFSQSRBeIEZdKDEQnHU8CZyceTGcyBxYoTFCwI0M2GgFJFSUSRDYaAkkVJBJEF0lOAiIpZUREJxYxAIgRLkSIEWiIEW0iKWVEgTISRCcISwJQSU4DvUUBREyIC4lJRCInC2VECCInDWVEDkQiJxxlREEACTIHIiccZUQOREcCvkSBKFtLA0lOAwgWgShMuyInC2VECCcLSwFnIicNZURMCRYoTFCwI0MiSTYaAUkVJRJENhoCSRUlEkQ2GgNHAhUkEkQXIillRESIEN6IEOMiKWVEgTISFEQiJx1lREEACSInHWVEMgcORCInHmVEQQAJMgciJx5lRAxEMQBLBElOAhJEJwhLAVBJRQhJvUUBRCcISwVJTgJQSUUJvUUBREsCiArCSYgKvk8CE0RLAUlETL5EJVsORCIqZUQiK2VED0AADiIqZUSIC8+BCVsyBw1ESwNJiAsaSwNJTgKICxKICpVGAogKkEYCSwVJvkQlW0sCSU4CSwEOREsBCRZPAiVPArtLBUm+RCVbTwIIFiVMuyhLAlCwI0M2GgFJFSUSRDYaAkkVIxJEIlMnFTEAiA+7RCcITwJQSb1FAURJgTAjuiJPA1SBMEy7MgcWKExQsCNDNhoBSRUlEkQ2GgJJFSUSRCcXMQCID4NEIillRIHIARIURIgPs4gPuCcITwJQSb1FARREIhZPAksBUEsBUCcoUEsBUEsBUEsBUEsBUExQvzIHFihMULAjQzYaAUkVJRJENhoCSRUlEkQnCEsCUEm9RQFEMQBPAxJEiA9diA9iIk8CuzIHFihMULAjQzYaAUkVJRJEJwhMUEm9RQFEvkgoTFCwI0M2GgFJFSUSRCcSTGcyBxYoTFCwI0OAAEk2GgFHAhWBaxJENhoCSU4CFYFIEkQ2GgNJTgJJFUsBJVlJgSISRE8CTEsCUklOAyJZgSQIEkSIDtkiVUknCksBZ0EAIkkjEkAAHEmBAhJAABVJgQMSQAAOSYEEEkAAB0mBBRJBAYcjRCInCmVMRQJESwRJgSFbSUUIRIE5VUlFCEEAH0sGIxJAABhLBoECEkAAEEsGgQMSQAAISwaBBBJBAUcjREkjE0EACEsEgZIGUxREIillRBREIicUZUQUREsESSNbSXELRQFEJyxLAWdLAYEJW0lPAhJEJxNLAWexMgAyCiKyErIUTLIRgQSyELIBs0mBEVsnDUxnJwsiZycuSwhnSYEpWyccSwFnSwGBMVsnLUsBZ0sGSU4CgTBbJw5MZycUSwpnSwOBkgZTJyJMZ0sBgRBbJwRMZ0sBgShbJwZMZ0sBJVsnCUxnSwGBGFsnB0xnSwOBOlsnI0xnSwOBQlsnJExnSwOBSlsnH0xnSwOBUlsnIExnSwOBWlsnJUxnSwOBkAZTJyZMZ0sDgZEGUycnTGdPA4FjWycFTGdLASRbKkxnSwGBOFsnEExnSwGBQFsnEUxnJw8iZycMImdLAjIHDURMIltLAgxEDERLAlcAICcqTGdLAVcCACcrTGcyBxYoTFCwI0MiQv62IkL+diKAAEcCNhoBSRUkEkQXSTYaAkkVIxJEIlNMNhoDSU4CSSJZSU4DSYFBC4ECCE8CFRJEiAzsIicKZUxOA0QiKWVEFERJgRAORCInFGVEREyBEAtMgWQLIQQIIoj2tiJJSwQMQQCLSwRXAgBJRQxLAUlOAoFBC4FBWEkkVUlOAkUNSSJbSUUNSwVPBAhLARJESwVPA4gIOEyBCVtJRQpEQQAXSUEAJUkjCYFBC0sLTIFBWIEJW0sIDkRLCEAABUsJIxJESSMIRQFC/5RLBklEIwkWJxhMUEm9RQFESSKBAroXSUQjCYFBC4ECCIFBukL/wUsGFicYTFBJvEhLBb9LBUEADEsBSwQIK0xnKYEyZzIHFihMULAjQyIpZUREiAwCiAwJiAwOIiplRCIrZURLAQ1EiAdmSVcIAUmAAQGoREsBVwAISwJXCQhLA1cRCEsEVxkISwVXIQhLBlcpCEsHVzEISwhXOQhPB08IUE8HUE8GUE8FUCIWUE8EUE8DUE8CUExQiAiYRgIyBxYoTFCwI0MiRwSAAEk2GgFJFSQSRBc2GgJHAhWBSRJEIillRESIC3qIC3+BQVtJgQQaQQCwIicKZUSBBRJEiAtXIicKZURJgQUSREsCSSJbSUUHIitlRBJESVcIAUUMJFWIBuEiK2VEgRAKJzFFBxYnGExQSUUJvUUBQQAHSwe+TEUHREsFSSJZSYEQDERLA0lXCQhLAVcRCEsCVxkISwNXKQhLBFcxCE8FVzkISwsWSxJQTwZQTwVQTwRQTwNQTwJQTFBLAxZQTwJMUEwjCBZXBgJcAEsISbxITL8iK2VEIwgrTGciKmVESwNJTwISRIgGHklFCElXCAFFCiRVSUUGIxJAAChLBIEEEkAAIEsEgQwSQAAYSwSBCxJAABBLBIESEkAACEsEgQUSQQBBI0RLCIABAalESwSBDBJAAAhLBIELEkEAJCNBABonGTEAiAoSREsGSwKIBzpGAjIHFihMULAjQ4gKMEL/6CJC/9kiQv+8Ikk2GgFHAhWBQRJEIillRESIChGIChiICh0iKWVEgTISFEQiJwplRIEFEkRJIltJTgIiK2VETEsBEkRLAVcIAUlOA4ABA6hETIE5W0lOAiMaREEAEyIrZUQjCYgFQIEJW0sEgQlbDkQiK2VEgRAKJzFFBhYnGExQSUUHvUUBQQAHSwW+TEUGREsESSJZSYEQDERLBUlXCQhLAVcRCEsCVxkISwNXIQhLBFcpCE8FVzEISwoWSwpQTwZQTwVQTwRQTwNQTwJQTFBLAxZQTwJMUEwjCBZXBgJcAEsGSbxITL8iK2VEIwgrTGcyBxYoTFCwI0M2GgFJFSMSRCJTJxoxAIgI7kQnL0xnMgcWKExQsCNDIillRElEIicKZUQWSZMkDkRXBwEiJw1lRCInC2VEIicUZUQiKmVEIitlRCInBGVEIicHZUQiJwllRCInBmVEIicQZUQiJxFlRCInD2VEIicMZURPDhZPDkxQTw0WUE8MFlBPCxZQTwoWUE8JFlBPCBZQTwcWUE8GFlBPBRZQTwQWUE8DFlBPAhZQTBZQKExQsCNDIillREQiKmVEIitlRA9BACUiKmVEFicoUCIWTEsBUEsBUEsBUEsBUEsBUEsBUExQKExQsCNDIiplRIgDvUL/8IgIPiNDNhoBSRUlEkSICDEnEkxnMgcWKExQsCNDNhoBSRUlEkSICBknG0xnMgcWKExQsCNDNhoBSRUjEkQ2GgJJTgIVJRJENhoDSU4CFYEQEkSIB+yIB/MXRwKIB/2BFBJBAA4nEksDZzIHFihMULAjQ0mBKBJBABEnF0sDUEm9RQEUREsCv0L/30mBMhJBABEnFksDUEm9RQEUREsCv0L/x0mBPBJBABEnGksDUEm9RQEUREsCv0L/r0mBRhJBABEnFUsDUEm9RQEUREsCv0L/l0mBUBJB/5AnGUsDUEm9RQEUREsCv0L/fzYaAUkVIxJENhoCSU4CFSUSRIgHQogHSRdHAogHU0mBFBNEgSgSQQAVJxdLAlBJvUUBRLxIMgcWKExQsCNDSYEyEkEADycWSwJQSb1FAUS8SEL/4UmBPBJBAA8nGksCUEm9RQFEvEhC/8tJgUYSQQAPJxVLAlBJvUUBRLxIQv+1SYFQEkH/ricZSwJQSb1FAUS8SEL/nzYaAUkVIxJEIlMnFTEAiAZ8RCchTGcyBxYoTFCwI0MiJxJlRChMULAjQzYaAUkVJRJEJxdLAYgGVCcWSwKIBk0nGksDiAZGJxVLBIgGPycZTwWIBjgnKCJPBlQjTwVUgQJPBFSBA08DVIEETwJUKExQsCNDNhoBSRUjEkQ2GgJJTgIVJRJEF0mIBlCDBhQoMjxGUE8GjgYATwBAADEAIgATAAEAJxlLAVBJvUUBRL5IKExQsCNDJxVLAVBJvUUBRL5IQv/rJxpLAVBJvUUBRL5IQv/cJxZLAVBJvUUBRL5IQv/NJxdLAVBJvUUBRL5IQv++gBAAAAAAAAAAAAAAAAAAAAAAQv+pigEAJwiL/1C+RIGAA1MURImKAQInCIv/UEm9RQFESb5IIicQZURLAYE5WwkiJxFlREsCgUFbCUsCJVsiJwVlRE8DSwJPAogAmCInBWVETwNPA08CiACKSwKBSVtLAggWTwNMXElJgVFbSwIIFlxRIicQZUQWXDkiJxFlRBZcQSIqZUQWXDFPA0y/iYoBACKAACcIi/9QSb1FAUQiKWVEgTISQQABiYsCvkxJTgKMAESBKFtJjAFAAAGJiwBJJVuLAUlOAwgWXCAiFlwoiwJMvyInC2VESUsCD0RMCScLTGeJigMBi/1BAAWL/kAAAiKJi/2L/h2L/5eJigEBi/9AAAIiiSInDWVESUQiJwVlRIv/TE8CiP/KiYoBAYv/QAACIokiJw1lRCInBWVEi/9MiP+viYoBASIrZUSL/w1Ei/+BEAoWJxhMUEm9RQFEi/+BEBhLASKBAroXSwENRIFBC4ECCIFBuomKAgCL/yMSQAAfi/8kEkAAGIv/gRMSQAAQi/+BDBJAAAiL/4ELEkEAAyNEiYv+QAAEIkL/9Yv+gQMSQAAIi/6BAhJBABiL/4EDEkAACIv/gRISQQAEI0L/0SJC/82L/iMSQQAgi/+BAxJAABCL/4ESEkAACIv/gQUSQQAEI0L/qiJC/6aL/oEEEkEAKIv/gQMSQAAYi/+BBBJAABCL/4ESEkAACIv/gQUSQQAEI0L/eiJC/3aL/oEFEkEACIv/gQMSQv9mIkL/YiInCmVEIxJBAAoiJyJlREEAAiOJIomKAQKL/4ERW0lBABAiJwllREEACCInB2VEQAAGIov/TwKJIicHZUQiJwllRCInBWVEiP5oIicFZUSLAEyI/l2L/08CiYoCAYv/QAADi/6JIicFZUQiJwllRIv/SwKI/jwISUQiJwVlRIv+TE8CiP4siYoCAiKAAEcIi/4iWyIqZUQSRIv+gQlbMgcORIv+JFVJIxJJQQBeIillRIEyEkQiJwtlRCInDWVEEkSL/oExWycESwFnJwdMZ4v+gSFbJwlMZycGImeL/oEpWycOTGciKmVEIwgqTGcpgWRniwtEIicUZUSL/kwiiAHaSYz+i/+MAYwAiSIpZUSBMhIURCInBmVEi/6I/viM/ggnBkxniwqBDBJBAXiL/4EhWyInJGVEIicFZUSI/XMiJyNlRAiMBiInJmVEQQATIicfZUSLBg1BAAgiJx9lTIwGRCInJ2VEQQATIicgZUSLBgxBAAgiJyBlTIwGRCcJiwZniwqBBBJBAQeL/oExWycESwFnJwdMZ4j+ZUEA54sKgQUSQQDFIitlRCIqZUQJgWQLIQQIIojrxCInBWVMjAJEIowBIowHi/6BGVtJjAhBAA+LAosIiP6BSYwCI4wHjAEiKmVEIwiMAyIrZUSLAw1BAFKLA4j9DEmMACRVSYwEgQMSQAAQiwSBExJBADOLAIEZW0EAKyNBAAiLB0EADCKMB4sDIwiMA0L/vosAgRlbiwJMiP4kSYwCiwEIjAFC/+EiQv/SiwFEIicEZUSL/oE5WyQaQAAGIicGZUQIIicFZUSLAYj8SycOTGciKmVEIwgqTGeL/iJJiABgSYz+i/+MAYwAiYv+gSlbJw5MZ0L/2osKgRISQf7/IicEZUQnB0xnQv7ziwqBCxJBABuL/oEhW0mMBUAACCInJWVMjAVEJwmLBWdC/rqL/oEhW0mMCUH+rycJiwlnQv6nigMBMgiL/SJbi/1XCAGL/VcJCDIHi/0kVYv+QABFIxZJkyQORFcHASInE2VEiwFJIwiLABZPAhZQiwJQiwNQiwQWUIv+FlBPA1CL/xZQTwIWUEwWUIAEmjMrlUxQsIv9jACJiwUjEkAACIsFgQQSQQAEI0L/qYH/AUL/o4oCAYAAi/6L/1BJvUUBQQAfiwG+RCJbMgdJjAAOQQAQiwG+RCRbiwAPQQAEI4wAiSJC//kxACInEmVEEkSJIicpZUQURIkiJyFlRBREiYoBAIv/gRQSQAAwi/+BGRJAACiL/4EoEkAAIIv/gTISQAAYi/+BPBJAABCL/4FGEkAACIv/gVASQQADI0SJIkL/+g==", "clear": "DIEBQw=="}, "desc": "Debt Algorand Standard Application.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "networks": {}, "source": {"approval": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCAzMiAxNTAwCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUgInN0YXR1cyIgImV2ZW50X2N1cnNvciIgInNjaGVkdWxlX2VudHJ5X2NvdW50IiAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIiAiZml4ZWRfcG9pbnRfc2NhbGUiICJhY2NydWVkX2ludGVyZXN0IiAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIgMHg0MTIzICJub21pbmFsX2ludGVyZXN0X3JhdGUiICJjb250cmFjdF90eXBlIiAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiICJyZXNlcnZlZF9wcmluY2lwYWwiICJ0b3RhbF91bml0cyIgIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iICJyZXNlcnZlZF9pbnRlcmVzdCIgImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIgMHg1MjNhNDE1MjUyMjMgInNldHRsZW1lbnRfYXNzZXRfaWQiICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIgMHg1MjNhNDE1NTU0MjMgMHg1MjNhNTA1OTQ0MjMgMHg1MjNhNGQ0ZTQ3MjMgMHg1MzIzIDB4NTIzYTRkNGY0MzIzIDB4NTIzYTU0NTI1MzIzIDB4NTIzYTRmNTA0NDIzICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiICJ0cmFuc2Zlcl9vcGVuaW5nX2RhdGUiICJ0cmFuc2Zlcl9jbG9zdXJlX2RhdGUiICJyYXRlX3Jlc2V0X2Zsb29yIiAicmF0ZV9yZXNldF9jYXAiICJhc3NldF9zdXNwZW5kZWQiICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIiAicmF0ZV9yZXNldF9zcHJlYWQiICJyYXRlX3Jlc2V0X211bHRpcGxpZXIiICJyYXRlX3Jlc2V0X25leHQiICJoYXNfcmF0ZV9yZXNldF9mbG9vciIgImhhc19yYXRlX3Jlc2V0X2NhcCIgMHgwMCAiYXNzZXRfZGVmYXVsdGVkIiAicHJvc3BlY3R1c19oYXNoIiAicHJvc3BlY3R1c191cmwiICJkZW5vbWluYXRpb25fYXNzZXRfaWQiICJtYXR1cml0eV9kYXRlIiAiZGF5X2NvdW50X2NvbnZlbnRpb24iICJkZWZhdWx0ZWQiIDB4MDY4MTAxIDB4MDAwMAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4LTI5CiAgICAvLyAjIFJCQUMgUm9sZXMKICAgIC8vIHNlbGYuYXJyYW5nZXIgPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX0FSUkFOR0VSKQogICAgYnl0ZWMgMTggLy8gMHg1MjNhNDE1MjUyMjMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMAogICAgLy8gc2VsZi5vcF9kYWVtb24gPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX09QX0RBRU1PTikKICAgIGJ5dGVjIDI3IC8vIDB4NTIzYTRmNTA0NDIzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NDctNDgKICAgIC8vICMgRC1BU0EgR292ZXJuYW5jZQogICAgLy8gc2VsZi5hc3NldF9zdXNwZW5kZWQgPSBGYWxzZQogICAgYnl0ZWMgMzMgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjQ5CiAgICAvLyBzZWxmLmFzc2V0X2RlZmF1bHRlZCA9IEZhbHNlCiAgICBieXRlYyA0MSAvLyAiYXNzZXRfZGVmYXVsdGVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1Ni01NwogICAgLy8gIyBDb250cmFjdAogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKQogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OAogICAgLy8gc2VsZi5jb250cmFjdF90eXBlID0gVUludDY0KCkKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MC02MQogICAgLy8gIyBQcm9zcGVjdHVzIChJbmZvcm1hdGlvbmFsKQogICAgLy8gc2VsZi5wcm9zcGVjdHVzX2hhc2ggPSBCeXRlcygpCiAgICBieXRlYyA0MiAvLyAicHJvc3BlY3R1c19oYXNoIgogICAgcHVzaGJ5dGVzIDB4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjIKICAgIC8vIHNlbGYucHJvc3BlY3R1c191cmwgPSBTdHJpbmcoKQogICAgYnl0ZWMgNDMgLy8gInByb3NwZWN0dXNfdXJsIgogICAgcHVzaGJ5dGVzICIiCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjQtNjUKICAgIC8vICMgRGVub21pbmF0aW9uCiAgICAvLyBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCA9IEFzc2V0KCkKICAgIGJ5dGVjIDQ0IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBBc3NldCgpCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjgtNjkKICAgIC8vICMgVGltZQogICAgLy8gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGUgPSB0eXAuVGltZVN0YW1wKCkKICAgIGJ5dGVjIDI4IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcwCiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSB0eXAuVGltZVN0YW1wKCkKICAgIGJ5dGVjIDQ1IC8vICJtYXR1cml0eV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MQogICAgLy8gc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgPSB0eXAuVGltZVN0YW1wKCkKICAgIGJ5dGVjIDI5IC8vICJ0cmFuc2Zlcl9vcGVuaW5nX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcyCiAgICAvLyBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgMzAgLy8gInRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzQtNzUKICAgIC8vICMgRGF5IENvdW50IENvbnZlbnRpb24KICAgIC8vIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPSBVSW50NjQoKQogICAgYnl0ZWMgNDYgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3Ny03OAogICAgLy8gIyBVbml0cwogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IFVJbnQ2NCgpCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc5CiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID0gVUludDY0KCkKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODEtODIKICAgIC8vICMgUHJpbmNpcGFsCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID0gVUludDY0KCkKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODMKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gVUludDY0KCkKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODUKICAgIC8vIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiA9IEZhbHNlCiAgICBieXRlYyAzNCAvLyAiZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODctODgKICAgIC8vICMgSW50ZXJlc3QKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OQogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ID0gVUludDY0KCkKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkxLTkyCiAgICAvLyAjIEludGVyZXN0IFJhdGVzCiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzCiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkID0gVUludDY0KCkKICAgIGJ5dGVjIDM1IC8vICJyYXRlX3Jlc2V0X3NwcmVhZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9tdWx0aXBsaWVyID0gVUludDY0KCkKICAgIGJ5dGVjIDM2IC8vICJyYXRlX3Jlc2V0X211bHRpcGxpZXIiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfZmxvb3IgPSBVSW50NjQoKQogICAgYnl0ZWMgMzEgLy8gInJhdGVfcmVzZXRfZmxvb3IiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfY2FwID0gVUludDY0KCkKICAgIGJ5dGVjIDMyIC8vICJyYXRlX3Jlc2V0X2NhcCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTcKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9uZXh0ID0gVUludDY0KCkKICAgIGJ5dGVjIDM3IC8vICJyYXRlX3Jlc2V0X25leHQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4CiAgICAvLyBzZWxmLmhhc19yYXRlX3Jlc2V0X2Zsb29yID0gRmFsc2UKICAgIGJ5dGVjIDM4IC8vICJoYXNfcmF0ZV9yZXNldF9mbG9vciIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTkKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwID0gRmFsc2UKICAgIGJ5dGVjIDM5IC8vICJoYXNfcmF0ZV9yZXNldF9jYXAiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMS0xMDIKICAgIC8vICMgUHJpbWFyeSBEaXN0cmlidXRpb24KICAgIC8vIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsID0gVUludDY0KCkKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMwogICAgLy8gc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNS0xMDYKICAgIC8vICMgQ3VtdWxhdGl2ZSBQZXItVW5pdCBGaXhlZC1Qb2ludCBJbmRleGVzCiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggPSBVSW50NjQoKQogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNwogICAgLy8gc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNQogICAgLy8gc2VsZi5ldmVudF9jdXJzb3IgPSBVSW50NjQoKQogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTYKICAgIC8vIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgPSBVSW50NjQoKQogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExOC0xMTkKICAgIC8vICMgUGVyZm9ybWFuY2UKICAgIC8vIHNlbGYuZGVmYXVsdGVkID0gRmFsc2UKICAgIGJ5dGVjIDQ3IC8vICJkZWZhdWx0ZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMS0xMjIKICAgIC8vICMgU2NhbGluZwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjIzCiAgICAvLyBhc3NlcnQgVHhuLmdsb2JhbF9udW1fYnl0ZV9zbGljZSA9PSBjZmcuR0xPQkFMX0JZVEVTLCBlcnIuV1JPTkdfR0xPQkFMX0JZVEVTCiAgICB0eG4gR2xvYmFsTnVtQnl0ZVNsaWNlCiAgICBwdXNoaW50IDQKICAgID09CiAgICBhc3NlcnQgLy8gV3JvbmcgR2xvYmFsIEJ5dGVzIGFsbG9jYXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kX2FzYS9jb250cmFjdC5weToyNAogICAgLy8gYXNzZXJ0IFR4bi5nbG9iYWxfbnVtX3VpbnQgPT0gY2ZnLkdMT0JBTF9VSU5UUywgZXJyLldST05HX0dMT0JBTF9VSU5UUwogICAgdHhuIEdsb2JhbE51bVVpbnQKICAgIHB1c2hpbnQgMzgKICAgID09CiAgICBhc3NlcnQgLy8gV3JvbmcgR2xvYmFsIFVJbnRzIGFsbG9jYXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kX2FzYS9jb250cmFjdC5weToyNQogICAgLy8gYXNzZXJ0IFR4bi5sb2NhbF9udW1fYnl0ZV9zbGljZSA9PSBjZmcuTE9DQUxfQllURVMsIGVyci5XUk9OR19MT0NBTF9CWVRFUwogICAgdHhuIExvY2FsTnVtQnl0ZVNsaWNlCiAgICAhCiAgICBhc3NlcnQgLy8gV3JvbmcgTG9jYWwgQnl0ZXMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBhc3NlcnQgVHhuLmxvY2FsX251bV91aW50ID09IGNmZy5MT0NBTF9VSU5UUywgZXJyLldST05HX0xPQ0FMX1VJTlRTCiAgICB0eG4gTG9jYWxOdW1VaW50CiAgICAhCiAgICBhc3NlcnQgLy8gV3JvbmcgTG9jYWwgVUludHMgYWxsb2NhdGlvbgoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6OC0xOAogICAgLy8gY2xhc3MgREFTQSgKICAgIC8vICAgICBQYXltZW50QWdlbnQsCiAgICAvLyAgICAgVHJhbnNmZXJBZ2VudCwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBhdm1fdmVyc2lvbj0xMiwKICAgIC8vICk6CiAgICBwdXNoYnl0ZXMgMHg5MTRmMDRlYiAvLyBtZXRob2QgImNvbnRyYWN0X3VwZGF0ZSgpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fY29udHJhY3RfdXBkYXRlX3JvdXRlQDQKCm1haW5fc3dpdGNoX2Nhc2VfbmV4dEA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjgtMTgKICAgIC8vIGNsYXNzIERBU0EoCiAgICAvLyAgICAgUGF5bWVudEFnZW50LAogICAgLy8gICAgIFRyYW5zZmVyQWdlbnQsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyAgICAgYXZtX3ZlcnNpb249MTIsCiAgICAvLyApOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYnogbWFpbl9jcmVhdGVfTm9PcEAzMwogICAgcHVzaGJ5dGVzcyAweGI0NDYxOGM4IDB4ZTc4MzI1MjkgMHg5NDM4ODcyMyAweDZjODVlM2VlIDB4YmRkMWE5NDQgMHg3YzBmMTgxMiAweDE0ZmMxMGVmIDB4NzRhNzI5N2YgMHgwOWQ0ZmUxNCAweDlhOWJmYTg1IDB4ODVlZWQzM2QgMHhhYjJjMGZjNCAweGQ5ZjIyNWFjIDB4OTg4MzUwNWEgMHhmYjRkNDQyOCAweDhlYTZlNzRjIDB4MDJhZjU1N2EgMHg4MmY3MWIyZCAweGVmMDRmNWQzIDB4ZGYzNDM1NTAgMHgzZGJlODBiZCAweDFlM2U0OGU3IDB4MDEwYzgyOTkgMHg3NDA2YWNkMiAweDFhNzJhMmVlIC8vIG1ldGhvZCAiZnVuZF9kdWVfY2FzaGZsb3dzKHVpbnQ2NCkodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImNsYWltX2R1ZV9jYXNoZmxvd3MoYWRkcmVzcyxieXRlW10pKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxieXRlW10pIiwgbWV0aG9kICJ0cmFuc2Zlcl9zZXRfc2NoZWR1bGUodWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInByaW1hcnlfZGlzdHJpYnV0aW9uKGFkZHJlc3MsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidHJhbnNmZXIoYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgImFjY291bnRfc3VzcGVuc2lvbihhZGRyZXNzLGJvb2wpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X29wZW4oYWRkcmVzcyxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAiYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzKGFkZHJlc3MsYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgImFjY291bnRfZ2V0X3Bvc2l0aW9uKGFkZHJlc3MpKGFkZHJlc3MsdWludDY0LHVpbnQ2NCxib29sLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJjb250cmFjdF9jb25maWcoKHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LGJvb2wsYm9vbCxib29sLHVpbnQ2NCksKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSwoYnl0ZVszMl0sc3RyaW5nKSl1aW50NjQiLCBtZXRob2QgImNvbnRyYWN0X3NjaGVkdWxlKHVpbnQ2NCxib29sLCh1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KVtdKXVpbnQ2NCIsIG1ldGhvZCAiY29udHJhY3RfZXhlY3V0ZV9pZWQoKXVpbnQ2NCIsIG1ldGhvZCAiYXBwbHlfbm9uX2Nhc2hfZXZlbnQodWludDY0LCh1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkpdWludDY0IiwgbWV0aG9kICJhcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudCgodWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkpdWludDY0IiwgbWV0aG9kICJjb250cmFjdF9zZXRfZGVmYXVsdF9zdGF0dXMoYm9vbCl1aW50NjQiLCBtZXRob2QgImNvbnRyYWN0X2dldF9zdGF0ZSgpKHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJjb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnQoKSh1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAicmJhY19yb3RhdGVfYXJyYW5nZXIoYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgInJiYWNfc2V0X29wX2RhZW1vbihhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19hc3NpZ25fcm9sZSh1aW50OCxhZGRyZXNzLCh1aW50NjQsdWludDY0KSl1aW50NjQiLCBtZXRob2QgInJiYWNfcmV2b2tlX3JvbGUodWludDgsYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgInJiYWNfY29udHJhY3Rfc3VzcGVuc2lvbihib29sKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19nZXRfYXJyYW5nZXIoKWFkZHJlc3MiLCBtZXRob2QgInJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXMoYWRkcmVzcykoYm9vbCxib29sLGJvb2wsYm9vbCxib29sKSIsIG1ldGhvZCAicmJhY19nZXRfcm9sZV92YWxpZGl0eSh1aW50OCxhZGRyZXNzKSh1aW50NjQsdWludDY0KSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIGZ1bmRfZHVlX2Nhc2hmbG93cyBjbGFpbV9kdWVfY2FzaGZsb3dzIHRyYW5zZmVyX3NldF9zY2hlZHVsZSBwcmltYXJ5X2Rpc3RyaWJ1dGlvbiB0cmFuc2ZlciBhY2NvdW50X3N1c3BlbnNpb24gYWNjb3VudF9vcGVuIGFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzcyBhY2NvdW50X2dldF9wb3NpdGlvbiBjb250cmFjdF9jb25maWcgY29udHJhY3Rfc2NoZWR1bGUgY29udHJhY3RfZXhlY3V0ZV9pZWQgYXBwbHlfbm9uX2Nhc2hfZXZlbnQgYXBwZW5kX29ic2VydmVkX2Nhc2hfZXZlbnQgY29udHJhY3Rfc2V0X2RlZmF1bHRfc3RhdHVzIGNvbnRyYWN0X2dldF9zdGF0ZSBjb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnQgcmJhY19yb3RhdGVfYXJyYW5nZXIgcmJhY19zZXRfb3BfZGFlbW9uIHJiYWNfYXNzaWduX3JvbGUgcmJhY19yZXZva2Vfcm9sZSByYmFjX2NvbnRyYWN0X3N1c3BlbnNpb24gcmJhY19nZXRfYXJyYW5nZXIgcmJhY19nZXRfYWRkcmVzc19yb2xlcyByYmFjX2dldF9yb2xlX3ZhbGlkaXR5CiAgICBlcnIKCm1haW5fY3JlYXRlX05vT3BAMzM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6OC0xOAogICAgLy8gY2xhc3MgREFTQSgKICAgIC8vICAgICBQYXltZW50QWdlbnQsCiAgICAvLyAgICAgVHJhbnNmZXJBZ2VudCwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBhdm1fdmVyc2lvbj0xMiwKICAgIC8vICk6CiAgICBwdXNoYnl0ZXMgMHg5NTZkNzE1NiAvLyBtZXRob2QgImNvbnRyYWN0X2NyZWF0ZShhZGRyZXNzKXVpbnQ2NCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIGNvbnRyYWN0X2NyZWF0ZQogICAgZXJyCgptYWluX2NvbnRyYWN0X3VwZGF0ZV9yb3V0ZUA0OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgcHVzaGludCA0IC8vIFVwZGF0ZUFwcGxpY2F0aW9uCiAgICA9PQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICYmCiAgICBhc3NlcnQKICAgIGIgY29udHJhY3RfdXBkYXRlCgoKLy8gX3B1eWFfbGliLnV0aWwuZW5zdXJlX2J1ZGdldChyZXF1aXJlZF9idWRnZXQ6IHVpbnQ2NCwgZmVlX3NvdXJjZTogdWludDY0KSAtPiB2b2lkOgplbnN1cmVfYnVkZ2V0OgogICAgcHJvdG8gMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMTAKICAgICsKCmVuc3VyZV9idWRnZXRfd2hpbGVfdG9wQDE6CiAgICBmcmFtZV9kaWcgMAogICAgZ2xvYmFsIE9wY29kZUJ1ZGdldAogICAgPgogICAgYnogZW5zdXJlX2J1ZGdldF9hZnRlcl93aGlsZUA2CiAgICBpdHhuX2JlZ2luCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgYnl0ZWMgNDggLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtCiAgICBieXRlYyA0OCAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbQogICAgZnJhbWVfZGlnIC0xCiAgICBzd2l0Y2ggZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8wQDMgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8xQDQKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfbmV4dEA1OgogICAgaXR4bl9zdWJtaXQKICAgIGIgZW5zdXJlX2J1ZGdldF93aGlsZV90b3BAMQoKZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8xQDQ6CiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgYiBlbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX25leHRANQoKZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8wQDM6CiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGIgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV9uZXh0QDUKCmVuc3VyZV9idWRnZXRfYWZ0ZXJfd2hpbGVANjoKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucGF5bWVudF9hZ2VudC5QYXltZW50QWdlbnQuZnVuZF9kdWVfY2FzaGZsb3dzW3JvdXRpbmddKCkgLT4gdm9pZDoKZnVuZF9kdWVfY2FzaGZsb3dzOgogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAxMwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NgogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjgKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjY5CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjcwCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM4CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE1MAogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3MgogICAgLy8gaWYgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCk6CiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3Ni03NwogICAgLy8gKyBtYXhfZXZlbnRfY291bnQKICAgIC8vICogVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfUEVSX0VWRU5UX0JVREdFVCkKICAgIGR1cAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojc3CiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfRlVORF9EVUVfQ0FTSEZMT1dTX1BFUl9FVkVOVF9CVURHRVQpCiAgICBwdXNoaW50IDEwMAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojc2LTc3CiAgICAvLyArIG1heF9ldmVudF9jb3VudAogICAgLy8gKiBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19QRVJfRVZFTlRfQlVER0VUKQogICAgKgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojc1CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19CQVNFX0JVREdFVCkKICAgIGludGMgNCAvLyAxNTAwCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzUtNzcKICAgIC8vIFVJbnQ2NChjc3QuT1BfVVBfRlVORF9EVUVfQ0FTSEZMT1dTX0JBU0VfQlVER0VUKQogICAgLy8gKyBtYXhfZXZlbnRfY291bnQKICAgIC8vICogVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfUEVSX0VWRU5UX0JVREdFVCkKICAgICsKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3My03OQogICAgLy8gZW5zdXJlX2J1ZGdldCgKICAgIC8vICAgICByZXF1aXJlZF9idWRnZXQ9KAogICAgLy8gICAgICAgICBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19CQVNFX0JVREdFVCkKICAgIC8vICAgICAgICAgKyBtYXhfZXZlbnRfY291bnQKICAgIC8vICAgICAgICAgKiBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19QRVJfRVZFTlRfQlVER0VUKQogICAgLy8gICAgICksCiAgICAvLyApCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjgxCiAgICAvLyBwcm9jZXNzZWRfZXZlbnRzID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA1CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODIKICAgIC8vIGZ1bmRlZF9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4MwogICAgLy8gZnVuZGVkX3ByaW5jaXBhbCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTMKCmZ1bmRfZHVlX2Nhc2hmbG93c193aGlsZV90b3BANDoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4NgogICAgLy8gcHJvY2Vzc2VkX2V2ZW50cyA8IG1heF9ldmVudF9jb3VudAogICAgZGlnIDQKICAgIGRpZyAxCiAgICA8CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODYtODcKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgPCBtYXhfZXZlbnRfY291bnQKICAgIC8vIGFuZCBzZWxmLmV2ZW50X2N1cnNvciA8IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQKICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl93aGlsZUAxMQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojg3CiAgICAvLyBhbmQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIDwKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4Ni04NwogICAgLy8gcHJvY2Vzc2VkX2V2ZW50cyA8IG1heF9ldmVudF9jb3VudAogICAgLy8gYW5kIHNlbGYuZXZlbnRfY3Vyc29yIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudAogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDExCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODkKICAgIC8vIGVudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KHNlbGYuZXZlbnRfY3Vyc29yKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIGR1cAogICAgYnVyeSAxNwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjkwCiAgICAvLyBpZiBlbnRyeS5zY2hlZHVsZWRfdGltZSA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wOgogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDMKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgID4KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAMTEKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5MgogICAgLy8gaWYgbm90IHNlbGYuX2V2ZW50X2lzX2Nhc2goZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSk6CiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ1cnkgMTYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM1NAogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUCksCiAgICBpbnRjXzIgLy8gOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzUzLTM1NwogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfTUQpLAogICAgLy8gKQogICAgPT0KICAgIGR1cAogICAgYnVyeSA0CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfdHJ1ZUA1MgogICAgZGlnIDE0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNTUKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNTMtMzU3CiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9NRCksCiAgICAvLyApCiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX3RydWVANTIKICAgIGRpZyAxNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzU2CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX01EKSwKICAgIHB1c2hpbnQgMTkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM1My0zNTcKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX01EKSwKICAgIC8vICkKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUA1MwoKZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfdHJ1ZUA1MjoKICAgIGludGNfMSAvLyAxCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUA1NDoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5MgogICAgLy8gaWYgbm90IHNlbGYuX2V2ZW50X2lzX2Nhc2goZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSk6CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAMTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MQogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X2lkID09IHNlbGYuZXZlbnRfY3Vyc29yLCBlcnIuSU5WQUxJRF9FVkVOVF9DVVJTT1IKICAgIGRpZyAxNQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBjdXJzb3IKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MgogICAgLy8gYXNzZXJ0IGVudHJ5LnNjaGVkdWxlZF90aW1lIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLCBlcnIuTk9fRFVFX0NBU0hGTE9XCiAgICBkaWcgMQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPD0KICAgIGFzc2VydCAvLyBObyBkdWUgY2FzaGZsb3cgdG8gcGF5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MTYKICAgIC8vIGlmIGV2ZW50X3R5cGUgbm90IGluIChVSW50NjQoZW51bXMuRVZUX0lQKSwgVUludDY0KGVudW1zLkVWVF9NRCkpOgogICAgZGlnIDIKICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNQogICAgZGlnIDE0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MTcKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDExCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfaW50ZXJlc3RfYW1vdW50QDE2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDI5CiAgICAvLyBldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBidXJ5IDE2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzAKICAgIC8vIGlmIGV2ZW50X3R5cGUgbm90IGluIChVSW50NjQoZW51bXMuRVZUX1BSKSwgVUludDY0KGVudW1zLkVWVF9NRCkpOgogICAgcHVzaGludCAzCiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE5CiAgICBkaWcgMTQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzMQogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNgoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnRAMjg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTYKICAgIC8vIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGRpZyAxNQogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTU5CiAgICAvLyBpZiBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKToKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDI5CiAgICBkaWcgNwogICAgYnVyeSA5CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzODoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU3NS01NzcKICAgIC8vICMgRnVuZGluZyB1c2VzIHBlci11bml0IGN1bXVsYXRpdmUgaW5kaWNlcyBzbyBlYWNoIGhvbGRlciBjYW4gc2V0dGxlCiAgICAvLyAjIGluZGVwZW5kZW50bHkgZnJvbSBpdHMgY3VycmVudCB1bml0IGJhbGFuY2UuCiAgICAvLyBpbnRlcmVzdF9pbmRleF9kZWx0YSA9IHNlbGYuX2Ftb3VudF90b19pbmRleF9kZWx0YShpbnRlcmVzdF9hbW91bnRfZHVlKQogICAgZGlnIDEwCiAgICBjYWxsc3ViIF9hbW91bnRfdG9faW5kZXhfZGVsdGEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU3OAogICAgLy8gcHJpbmNpcGFsX2luZGV4X2RlbHRhID0gc2VsZi5fYW1vdW50X3RvX2luZGV4X2RlbHRhKHByaW5jaXBhbF9hbW91bnRfZHVlKQogICAgZGlnIDYKICAgIGNhbGxzdWIgX2Ftb3VudF90b19pbmRleF9kZWx0YQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTc5CiAgICAvLyBpbnRlcmVzdF9hbW91bnQgPSBzZWxmLl9pbmRleF9kZWx0YV90b19hbW91bnQoaW50ZXJlc3RfaW5kZXhfZGVsdGEpCiAgICBkaWcgMQogICAgY2FsbHN1YiBfaW5kZXhfZGVsdGFfdG9fYW1vdW50CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgMTUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4MAogICAgLy8gcHJpbmNpcGFsX2Ftb3VudCA9IHNlbGYuX2luZGV4X2RlbHRhX3RvX2Ftb3VudChwcmluY2lwYWxfaW5kZXhfZGVsdGEpCiAgICBkdXAKICAgIGNhbGxzdWIgX2luZGV4X2RlbHRhX3RvX2Ftb3VudAogICAgZHVwCiAgICBidXJ5IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1ODEKICAgIC8vIHJlcXVpcmVkX2Ftb3VudCA9IGludGVyZXN0X2Ftb3VudCArIHByaW5jaXBhbF9hbW91bnQKICAgIGRpZyAyCiAgICBkaWcgMQogICAgKwogICAgZHVwCiAgICBidXJ5IDkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjczNwogICAgLy8gYmFsYW5jZSA9IHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ1OQogICAgLy8gcmV0dXJuIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgKyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIGRpZyAxCiAgICArCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MzkKICAgIC8vIGFzc2VydCBiYWxhbmNlID49IHJlc2VydmVkX3RvdGFsLCBlcnIuTk9UX0VOT1VHSF9GVU5EUwogICAgZGlnIDIKICAgIGRpZyAxCiAgICA+PQogICAgYXNzZXJ0IC8vIE5vdCBlbm91Z2ggZnVuZHMgZm9yIHRoZSBwYXltZW50CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDAKICAgIC8vIHJldHVybiBiYWxhbmNlIC0gcmVzZXJ2ZWRfdG90YWwKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTgzCiAgICAvLyBzZWxmLl9hdmFpbGFibGVfc2V0dGxlbWVudF9mdW5kcygpID49IHJlcXVpcmVkX2Ftb3VudAogICAgdW5jb3ZlciAyCiAgICA+PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTgyLTU4NAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLl9hdmFpbGFibGVfc2V0dGxlbWVudF9mdW5kcygpID49IHJlcXVpcmVkX2Ftb3VudAogICAgLy8gKSwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTg2CiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0ICs9IGludGVyZXN0X2Ftb3VudAogICAgdW5jb3ZlciAzCiAgICArCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTg3CiAgICAvLyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCArPSBwcmluY2lwYWxfYW1vdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICArCiAgICBieXRlYyAxMiAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4OAogICAgLy8gc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4ICs9IGludGVyZXN0X2luZGV4X2RlbHRhCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCBleGlzdHMKICAgIHVuY292ZXIgMgogICAgKwogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTg5CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4ICs9IHByaW5jaXBhbF9pbmRleF9kZWx0YQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCBleGlzdHMKICAgICsKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTAKICAgIC8vIGlmIGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkgPT0gVUludDY0KGVudW1zLkVWVF9QUik6CiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBwdXNoaW50IDMKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDQwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTEtNTkyCiAgICAvLyAjIEZvciBQUiwgdGhlIHBlcmlvZCBpbnRlcmVzdCBzdGF5cyBhY2NydWVkIHVudGlsIGEgbGF0ZXIgSVAgb3IgTUQuCiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgKz0gc2VsZi5fZW50cnlfaW50ZXJlc3Rfc2VnbWVudChlbnRyeSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBkaWcgMTYKICAgIGNhbGxzdWIgX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQKICAgIGJ1cnkgMTgKICAgICsKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTUKICAgIC8vIGlmIG5vdCBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKSBvciBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NCgKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlANDMKICAgIGRpZyAxNQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5NS01OTcKICAgIC8vIGlmIG5vdCBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKSBvciBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NCgKICAgIC8vICAgICBlbnVtcy5FVlRfTUQKICAgIC8vICk6CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDQKCmZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDQzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTk4CiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBkaWcgMTUKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0NDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5OQogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgZGlnIDgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MDAKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IG5leHRfaW50ZXJlc3RfYmFzZQogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGRpZyA5CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAxCiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MDMKICAgIC8vIGlmIGVudHJ5LmV2ZW50X3R5cGUgPT0gYXJjNC5VSW50OCgKICAgIGRpZyAxNQogICAgZXh0cmFjdCA4IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwMy02MDUKICAgIC8vIGlmIGVudHJ5LmV2ZW50X3R5cGUgPT0gYXJjNC5VSW50OCgKICAgIC8vICAgICBlbnVtcy5FVlRfTUQKICAgIC8vICkgYW5kIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID09IFVJbnQ2NCgwKToKICAgIHB1c2hieXRlcyAweDEzCiAgICBiPT0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQ3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MDUKICAgIC8vICkgYW5kIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID09IFVJbnQ2NCgwKToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAzLTYwNQogICAgLy8gaWYgZW50cnkuZXZlbnRfdHlwZSA9PSBhcmM0LlVJbnQ4KAogICAgLy8gICAgIGVudW1zLkVWVF9NRAogICAgLy8gKSBhbmQgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPT0gVUludDY0KDApOgogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQ3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MDYKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGVudW1zLlNUQVRVU19FTkRFRCkKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgMjAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjA3CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQ3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjA5LTYxMwogICAgLy8gc2VsZi5fZW1pdF9leGVjdXRpb25fZXZlbnQoCiAgICAvLyAgICAgZW50cnk9ZW50cnksCiAgICAvLyAgICAgcGF5b2ZmPWludGVyZXN0X2Ftb3VudCArIHByaW5jaXBhbF9hbW91bnQsCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9aW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudCwKICAgIC8vICkKICAgIGRpZyAxNQogICAgZGlnIDQKICAgIGR1cAogICAgY2FsbHN1YiBfZW1pdF9leGVjdXRpb25fZXZlbnQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojk2CiAgICAvLyBmdW5kZWRfaW50ZXJlc3QgKz0gaW50ZXJlc3RfYW1vdW50CiAgICBkaWcgMTMKICAgIGRpZyAxMgogICAgKwogICAgYnVyeSAxNAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojk3CiAgICAvLyBmdW5kZWRfcHJpbmNpcGFsICs9IHByaW5jaXBhbF9hbW91bnQKICAgIGRpZyAxMgogICAgZGlnIDcKICAgICsKICAgIGJ1cnkgMTMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5OAogICAgLy8gcHJvY2Vzc2VkX2V2ZW50cyArPSBVSW50NjQoMSkKICAgIGRpZyA0CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSA1CiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c193aGlsZV90b3BANAoKZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUA0MDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5NAogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ID0gVUludDY0KDApCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQxCgpmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUAyOToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU2MAogICAgLy8gZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGRpZyAxNQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSAxNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTYxLTU2MwogICAgLy8gIyBEeW5hbWljIGFubnVpdGllcyBkZXJpdmUgbmV4dCBzdGF0ZSBmcm9tIHRoZSBwYXltZW50IGRlY29tcG9zaXRpb24sCiAgICAvLyAjIG5vdCBvbmx5IGZyb20gdGhlIHByZWNvbXB1dGVkIGBuZXh0XypgIGZpZWxkcy4KICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QUik6CiAgICBwdXNoaW50IDMKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDMxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjUKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIC0gcHJpbmNpcGFsX2Ftb3VudF9kdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgZGlnIDYKICAgIC0KICAgIGR1cAogICAgYnVyeSA5CiAgICBidXJ5IDkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzgKCmZ1bmRfZHVlX2Nhc2hmbG93c19lbHNlX2JvZHlAMzE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjgKICAgIC8vIGVsaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX0lQKToKICAgIGRpZyAxNAogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDMzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjkKICAgIC8vIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgYnVyeSA5CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzAKICAgIC8vIG5leHRfaW50ZXJlc3RfYmFzZSA9IHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgYnVyeSAxMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSBleGlzdHMKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzgKCmZ1bmRfZHVlX2Nhc2hmbG93c19lbHNlX2JvZHlAMzM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzEKICAgIC8vIGVsaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKToKICAgIGRpZyAxNAogICAgcHVzaGludCAxOQogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUAzNAogICAgZGlnIDcKICAgIGJ1cnkgOQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlAMzQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzIKICAgIC8vIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzMKICAgIC8vIG5leHRfaW50ZXJlc3RfYmFzZSA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgOQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzIKICAgIC8vIGlmIHNlbGYuX2lzX2R5bmFtaWNfYW5udWl0eSgpOgogICAgY2FsbHN1YiBfaXNfZHluYW1pY19hbm51aXR5CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyNwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDMzCiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfTUQpOgogICAgZGlnIDE0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzNAogICAgLy8gcmV0dXJuIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTU1CiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzNQogICAgLy8gaW50ZXJlc3RfZHVlID0gc2VsZi5hY2NydWVkX2ludGVyZXN0ICsgc2VsZi5fZW50cnlfaW50ZXJlc3Rfc2VnbWVudChlbnRyeSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBkaWcgMTYKICAgIGNhbGxzdWIgX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQKICAgIGJ1cnkgMTgKICAgICsKICAgIGR1cAogICAgYnVyeSAxMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDM2CiAgICAvLyBpZiBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPD0gaW50ZXJlc3RfZHVlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gZXhpc3RzCiAgICA+PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzNwogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTU1CiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyNDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzOAogICAgLy8gcHJpbmNpcGFsX2Ftb3VudCA9IHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiAtIGludGVyZXN0X2R1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gZXhpc3RzCiAgICBkaWcgMTAKICAgIC0KICAgIGR1cAogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzkKICAgIC8vIGlmIHByaW5jaXBhbF9hbW91bnQgPiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgPgogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ0MAogICAgLy8gcmV0dXJuIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTU1CiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyNjoKICAgIGRpZyA2CiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1NQogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NDMKICAgIC8vIGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsIDw9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBkaWcgMTUKICAgIHB1c2hpbnQgNDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGR1cDIKICAgIDw9CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NDItNDQ0CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsIDw9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ0NQogICAgLy8gcmV0dXJuIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIC0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIHN3YXAKICAgIC0KICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTU1CiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQxOAogICAgLy8gcmV0dXJuIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCArIHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZGlnIDE2CiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBidXJ5IDE4CiAgICArCiAgICBidXJ5IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTQKICAgIC8vIGludGVyZXN0X2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9pbnRlcmVzdF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9pbnRlcmVzdF9hbW91bnRAMTYKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl93aGlsZUAxMToKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMDAKICAgIC8vIGFzc2VydCBwcm9jZXNzZWRfZXZlbnRzID4gVUludDY0KDApLCBlcnIuTk9fRFVFX0NBU0hGTE9XCiAgICBkaWcgNAogICAgZHVwCiAgICBhc3NlcnQgLy8gTm8gZHVlIGNhc2hmbG93IHRvIHBheQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjEwNAogICAgLy8gdG90YWxfZnVuZGVkPWZ1bmRlZF9pbnRlcmVzdCArIGZ1bmRlZF9wcmluY2lwYWwsCiAgICBkaWcgMTQKICAgIGR1cAogICAgZGlnIDE1CiAgICBkdXAKICAgIGNvdmVyIDMKICAgICsKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMDYKICAgIC8vIHRpbWVzdGFtcD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMDEtMTA3CiAgICAvLyByZXR1cm4gdHlwLkNhc2hGdW5kaW5nUmVzdWx0KAogICAgLy8gICAgIGZ1bmRlZF9pbnRlcmVzdD1mdW5kZWRfaW50ZXJlc3QsCiAgICAvLyAgICAgZnVuZGVkX3ByaW5jaXBhbD1mdW5kZWRfcHJpbmNpcGFsLAogICAgLy8gICAgIHRvdGFsX2Z1bmRlZD1mdW5kZWRfaW50ZXJlc3QgKyBmdW5kZWRfcHJpbmNpcGFsLAogICAgLy8gICAgIHByb2Nlc3NlZF9ldmVudHM9cHJvY2Vzc2VkX2V2ZW50cywKICAgIC8vICAgICB0aW1lc3RhbXA9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX2ZhbHNlQDUzOgogICAgaW50Y18wIC8vIDAKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfbWVyZ2VANTQKCgovLyBtb2R1bGVzLnBheW1lbnRfYWdlbnQuUGF5bWVudEFnZW50LmNsYWltX2R1ZV9jYXNoZmxvd3Nbcm91dGluZ10oKSAtPiB2b2lkOgpjbGFpbV9kdWVfY2FzaGZsb3dzOgogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDIKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NgogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg0MTIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE1CiAgICAvLyBpZiBzZWxmLm9wX2RhZW1vbi52YWx1ZSAhPSBHbG9iYWwuemVyb19hZGRyZXNzOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI3IC8vIDB4NTIzYTRmNTA0NDIzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BfZGFlbW9uIGV4aXN0cwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgYnogY2xhaW1fZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE3CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTcKICAgIC8vIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNyAvLyAweDUyM2E0ZjUwNDQyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wX2RhZW1vbiBleGlzdHMKICAgID09CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTctMTkKICAgIC8vIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICAvLyBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgYm56IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDE0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTgKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNy0xOQogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICBibnogY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX3RydWVAMTQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxOQogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIHR4biBTZW5kZXIKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDMyCiAgICA9PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE3LTE5CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAxNQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX3RydWVAMTQ6CiAgICBpbnRjXzEgLy8gMQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDE2OgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE2LTIwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vICAgICBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gICAgIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICAvLyApLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNzoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMzkKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTQwCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM4CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE1MAogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNDMKICAgIC8vIHNlbGYuX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQoaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDIKICAgIGR1cAogICAgY2FsbHN1YiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE0NAogICAgLy8gc2VsZi5fc2V0dGxlX3Bvc2l0aW9uKGhvbGRpbmdfYWRkcmVzcykKICAgIGNhbGxzdWIgX3NldHRsZV9wb3NpdGlvbgogICAgcG9wbiAyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTE3CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jbGFpbWFibGVfaW50ZXJlc3QKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGR1cAogICAgcHVzaGludCA3MwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTE4CiAgICAvLyArIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNsYWltYWJsZV9wcmluY2lwYWwKICAgIGR1cAogICAgcHVzaGludCA4MQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTE3LTExOAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY2xhaW1hYmxlX2ludGVyZXN0CiAgICAvLyArIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNsYWltYWJsZV9wcmluY2lwYWwKICAgIHVuY292ZXIgMgogICAgKwogICAgZHVwCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNDYKICAgIC8vIGFzc2VydCB0b3RhbF9hbW91bnQgPiBVSW50NjQoMCksIGVyci5OT19EVUVfQ0FTSEZMT1cKICAgIGFzc2VydCAvLyBObyBkdWUgY2FzaGZsb3cgdG8gcGF5CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MjUKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5pc19vcHRlZF9pbigKICAgIGV4dHJhY3QgMCAzMgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI2CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI1LTI3CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MuaXNfb3B0ZWRfaW4oCiAgICAvLyAgICAgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkCiAgICAvLyApCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI1LTI4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MuaXNfb3B0ZWRfaW4oCiAgICAvLyAgICAgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkCiAgICAvLyApCiAgICAvLyBhbmQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZAogICAgYnogY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX2ZhbHNlQDI0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MjgKICAgIC8vIGFuZCBub3Qgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDM4NAogICAgZ2V0Yml0CiAgICBibnogY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX2ZhbHNlQDI0CiAgICBpbnRjXzEgLy8gMQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDI1OgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE1MQogICAgLy8gaWYgc2VsZi5faXNfcGF5bWVudF9leGVjdXRhYmxlKGhvbGRpbmdfYWRkcmVzcyk6CiAgICBieiBjbGFpbV9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjM0CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgc3dhcAogICAgZGlnIDEKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYXNzZXJ0IC8vIGFjY291bnQgb3B0ZWQgaW50byBhc3NldAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjM0LTM1CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgLy8gPj0gcGF5bWVudF9hbW91bnQKICAgIGRpZyA1CiAgICBkdXAKICAgIGNvdmVyIDIKICAgID49CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MzMtMzYKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIC8vICAgICA+PSBwYXltZW50X2Ftb3VudAogICAgLy8gKSwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE1MwogICAgLy8gc2VsZi5fcGF5KHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcywgdG90YWxfYW1vdW50KQogICAgZGlnIDIKICAgIGR1cAogICAgY292ZXIgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGR1cAogICAgZXh0cmFjdCAwIDMyCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NDAtNDUKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1yZWNlaXZlciwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9YW1vdW50LAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NDQKICAgIC8vIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICB1bmNvdmVyIDMKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgdW5jb3ZlciAyCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQwCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NDAtNDUKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1yZWNlaXZlciwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9YW1vdW50LAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEyNS0xMjYKICAgIC8vICMgR2V0IHRoZSBjbGFpbWFibGUgYW1vdW50cyBiZWZvcmUgcmVzZXQKICAgIC8vIGludGVyZXN0X2Ftb3VudCA9IHBvc2l0aW9uLmNsYWltYWJsZV9pbnRlcmVzdAogICAgZHVwCiAgICBwdXNoaW50IDczCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBidXJ5IDkKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMjcKICAgIC8vIHByaW5jaXBhbF9hbW91bnQgPSBwb3NpdGlvbi5jbGFpbWFibGVfcHJpbmNpcGFsCiAgICBkdXAKICAgIHB1c2hpbnQgODEKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGJ1cnkgOQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEyOS0xMzAKICAgIC8vICMgUmVzZXQgdGhlIHBvc2l0aW9uJ3MgY2xhaW1hYmxlIGFtb3VudHMKICAgIC8vIHBvc2l0aW9uLmNsYWltYWJsZV9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICByZXBsYWNlMiA3MwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzMQogICAgLy8gcG9zaXRpb24uY2xhaW1hYmxlX3ByaW5jaXBhbCA9IFVJbnQ2NCgwKQogICAgc3dhcAogICAgcmVwbGFjZTIgODEKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzIKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gcG9zaXRpb24uY29weSgpCiAgICB1bmNvdmVyIDMKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzQKICAgIC8vIGFzc2VydCBzZWxmLnJlc2VydmVkX2ludGVyZXN0ID49IGludGVyZXN0X2Ftb3VudCwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBkdXAKICAgIGRpZyAyCiAgICA+PQogICAgYXNzZXJ0IC8vIE5vdCBlbm91Z2ggZnVuZHMgZm9yIHRoZSBwYXltZW50CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTM1CiAgICAvLyBhc3NlcnQgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgPj0gcHJpbmNpcGFsX2Ftb3VudCwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIGRpZyAzCiAgICA+PQogICAgYXNzZXJ0IC8vIE5vdCBlbm91Z2ggZnVuZHMgZm9yIHRoZSBwYXltZW50CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTM3LTEzOAogICAgLy8gIyBVcGRhdGUgdGhlIGdsb2JhbCByZXNlcnZlZCBpbnRlcmVzdCBhbmQgcHJpbmNpcGFsIGFtb3VudHMKICAgIC8vIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgLT0gaW50ZXJlc3RfYW1vdW50CiAgICBzd2FwCiAgICAtCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzOQogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgLT0gcHJpbmNpcGFsX2Ftb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIGV4aXN0cwogICAgc3dhcAogICAgLQogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpjbGFpbV9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNTkKICAgIC8vIHRvdGFsX2Ftb3VudD1pbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50LAogICAgZGlnIDUKICAgIGR1cAogICAgZGlnIDYKICAgIGR1cAogICAgY292ZXIgMwogICAgKwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE2MAogICAgLy8gdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE1Ni0xNjIKICAgIC8vIHJldHVybiB0eXAuQ2FzaENsYWltUmVzdWx0KAogICAgLy8gICAgIGludGVyZXN0X2Ftb3VudD1pbnRlcmVzdF9hbW91bnQsCiAgICAvLyAgICAgcHJpbmNpcGFsX2Ftb3VudD1wcmluY2lwYWxfYW1vdW50LAogICAgLy8gICAgIHRvdGFsX2Ftb3VudD1pbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50LAogICAgLy8gICAgIHRpbWVzdGFtcD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICBjb250ZXh0PXBheW1lbnRfaW5mbywKICAgIC8vICkKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyAyCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgcHVzaGJ5dGVzIDB4MDAyMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX2ZhbHNlQDI0OgogICAgaW50Y18wIC8vIDAKICAgIGIgY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDI1CgpjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VAMTU6CiAgICBpbnRjXzAgLy8gMAogICAgYiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfbWVyZ2VAMTYKCgovLyBtb2R1bGVzLnRyYW5zZmVyX2FnZW50LlRyYW5zZmVyQWdlbnQudHJhbnNmZXJfc2V0X3NjaGVkdWxlW3JvdXRpbmddKCkgLT4gdm9pZDoKdHJhbnNmZXJfc2V0X3NjaGVkdWxlOgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQwCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDEKICAgIC8vIGFzc2VydCBvcGVuX2RhdGUgPCBjbG9zdXJlX2RhdGUsIGVyci5JTlZBTElEX1NPUlRJTkcKICAgIGR1cDIKICAgIDwKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBtdXN0IGJlIHNvcnRlZCBpbiBzdHJpY3RseSBhc2NlbmRpbmcgb3JkZXIKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDMKICAgIC8vIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlID0gb3Blbl9kYXRlCiAgICBieXRlYyAyOSAvLyAidHJhbnNmZXJfb3BlbmluZ19kYXRlIgogICAgdW5jb3ZlciAyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo0NAogICAgLy8gc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGUgPSBjbG9zdXJlX2RhdGUKICAgIGJ5dGVjIDMwIC8vICJ0cmFuc2Zlcl9jbG9zdXJlX2RhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo0NQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnRyYW5zZmVyX2FnZW50LlRyYW5zZmVyQWdlbnQucHJpbWFyeV9kaXN0cmlidXRpb25bcm91dGluZ10oKSAtPiB2b2lkOgpwcmltYXJ5X2Rpc3RyaWJ1dGlvbjoKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NgogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzEKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnByaW1hcnlfZGVhbGVyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjIgLy8gMHg1MjNhNTA1OTQ0MjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NzYKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojc3CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM4CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NzgKICAgIC8vIGFzc2VydCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBSSU1BUllfRElTVFJJQlVUSU9OX0NMT1NFRAogICAgYXNzZXJ0IC8vIFByaW1hcnkgZGlzdHJpYnV0aW9uIGlzIGNsb3NlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBjb3ZlciAzCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjgwCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKGhvbGRpbmdfYWRkcmVzcykKICAgIHN3YXAKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODEKICAgIC8vIGFzc2VydCB1bml0cyA+IFVJbnQ2NCgwKSwgZXJyLlpFUk9fVU5JVFMKICAgIGR1cAogICAgYXNzZXJ0IC8vIENhbiBub3QgZGlzdHJpYnV0ZSB6ZXJvIHVuaXRzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjgzCiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsICsgdW5pdHMgPD0gc2VsZi50b3RhbF91bml0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCBleGlzdHMKICAgICsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICA8PQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4Mi04NAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsICsgdW5pdHMgPD0gc2VsZi50b3RhbF91bml0cwogICAgLy8gKSwgZXJyLk9WRVJfRElTVFJJQlVUSU9OCiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IHJlbWFpbmluZyBELUFTQSB1bml0cwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4NQogICAgLy8gaWYgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjggLy8gImluaXRpYWxfZXhjaGFuZ2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGUgZXhpc3RzCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODcKICAgIC8vIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDw9IHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjggLy8gImluaXRpYWxfZXhjaGFuZ2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGUgZXhpc3RzCiAgICA8PQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4Ni04OAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8PSBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZQogICAgLy8gKSwgZXJyLlBSSU1BUllfRElTVFJJQlVUSU9OX0NMT1NFRAogICAgYXNzZXJ0IC8vIFByaW1hcnkgZGlzdHJpYnV0aW9uIGlzIGNsb3NlZAoKcHJpbWFyeV9kaXN0cmlidXRpb25fYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE0OAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucmVzZXJ2ZWRfdW5pdHMgKz0gdW5pdHMKICAgIGR1cG4gMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHB1c2hpbnQgNDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMwogICAgZHVwCiAgICBjb3ZlciAzCiAgICArCiAgICBpdG9iCiAgICBwdXNoaW50IDQwCiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo5MQogICAgLy8gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCArPSB1bml0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCBleGlzdHMKICAgICsKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo5MgogICAgLy8gcmV0dXJuIHNlbGYudG90YWxfdW5pdHMgLSBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgc3dhcAogICAgLQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy50cmFuc2Zlcl9hZ2VudC5UcmFuc2ZlckFnZW50LnRyYW5zZmVyW3JvdXRpbmddKCkgLT4gdm9pZDoKdHJhbnNmZXI6CiAgICBpbnRjXzAgLy8gMAogICAgZHVwCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojk0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXBuIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDYKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxMzAKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjEzMQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzOAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTAKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjEzCiAgICAvLyBpZiBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyOSAvLyAidHJhbnNmZXJfb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIGJ6IHRyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNQogICAgLy8gc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyOSAvLyAidHJhbnNmZXJfb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIDw9CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE0LTE2CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyApLCBlcnIuQ0xPU0VEX1RSQU5TRkVSCiAgICBhc3NlcnQgLy8gVHJhbnNmZXIgaXMgY2xvc2VkCgp0cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE3CiAgICAvLyBpZiBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMCAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIGJ6IHRyYW5zZmVyX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxOQogICAgLy8gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDMwIC8vICJ0cmFuc2Zlcl9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgPAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxOC0yMAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8IHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlCiAgICAvLyApLCBlcnIuQ0xPU0VEX1RSQU5TRkVSCiAgICBhc3NlcnQgLy8gVHJhbnNmZXIgaXMgY2xvc2VkCgp0cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjEzNQogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gc2VuZGVyX2hvbGRpbmdfYWRkcmVzcywgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDgKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIGRpZyA1CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDkKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTM4CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBkaWcgMgogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxMzkKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQocmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzKQogICAgZHVwCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE0MAogICAgLy8gYXNzZXJ0IHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MgIT0gcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzLCBlcnIuU0VMRl9UUkFOU0ZFUgogICAgdW5jb3ZlciAyCiAgICAhPQogICAgYXNzZXJ0IC8vIFNlbmRlciBhbmQgcmVjZWl2ZXIgbXVzdCBiZSBkaWZmZXJlbnQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTQxCiAgICAvLyBhc3NlcnQgdW5pdHMgPiBVSW50NjQoMCksIGVyci5OVUxMX1RSQU5TRkVSCiAgICBkaWcgMQogICAgZHVwCiAgICBhc3NlcnQgLy8gVHJhbnNmZXIgdW5pdHMgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNDIKICAgIC8vIGFzc2VydCB1bml0cyA8PSBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMsIGVyci5PVkVSX1RSQU5TRkVSCiAgICBzd2FwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgPD0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgc2VuZGVyIHVuaXRzIHRvIHRyYW5zZmVyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NjYKICAgIC8vIGlmIHNlbGYuZXZlbnRfY3Vyc29yID49IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQ6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgID49CiAgICBibnogdHJhbnNmZXJfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYXNzZXJ0X25vX2R1ZV9ldmVudF9wZW5kaW5nQDEwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NjgKICAgIC8vIG5leHRfZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoc2VsZi5ldmVudF9jdXJzb3IpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzcwCiAgICAvLyBuZXh0X2VudHJ5LnNjaGVkdWxlZF90aW1lID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgID4KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc2OS03NzEKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgbmV4dF9lbnRyeS5zY2hlZHVsZWRfdGltZSA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyApLCBlcnIuUEVORElOR19BQ1RVU19FVkVOVAogICAgYXNzZXJ0IC8vIEFDVFVTIGV2ZW50IG5vdCB5ZXQgZXhlY3V0ZWQKCnRyYW5zZmVyX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Fzc2VydF9ub19kdWVfZXZlbnRfcGVuZGluZ0AxMDoKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTQ1CiAgICAvLyBzZWxmLl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBkaWcgMwogICAgZHVwCiAgICBjYWxsc3ViIF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE0NgogICAgLy8gc2VsZi5fZW5zdXJlX3VuaXRzX2FjdGl2YXRlZChyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBkaWcgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjYWxsc3ViIF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE0NwogICAgLy8gc2VsZi5fc2V0dGxlX3Bvc2l0aW9uKHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBjYWxsc3ViIF9zZXR0bGVfcG9zaXRpb24KICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNDgKICAgIC8vIHNlbGYuX3NldHRsZV9wb3NpdGlvbihyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBjYWxsc3ViIF9zZXR0bGVfcG9zaXRpb24KICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE1MgogICAgLy8gYXNzZXJ0IHVuaXRzIDw9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLCBlcnIuT1ZFUl9UUkFOU0ZFUgogICAgZGlnIDUKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGRpZyAxCiAgICA8PQogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCBzZW5kZXIgdW5pdHMgdG8gdHJhbnNmZXIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNTMKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzIC09IHVuaXRzCiAgICBkaWcgMQogICAgLQogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBpbnRjXzMgLy8gMzIKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNDQKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzICs9IHVuaXRzCiAgICBkaWcgNQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgdW5jb3ZlciAyCiAgICArCiAgICBpdG9iCiAgICBpbnRjXzMgLy8gMzIKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojk0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgZGlnIDIKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF9zdXNwZW5zaW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF9zdXNwZW5zaW9uOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE2NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzcKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDIxIC8vIDB4NTIzYTQxNTU1NDIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg0MTIzCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTg1CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGR1cAogICAgcHVzaGludCA0OAogICAgaW50Y18xIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIHB1c2hpbnQgNDgKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTg2CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfb3Blbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfb3BlbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2OAogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjMgLy8gMHg1MjNhNGQ0ZTQ3MjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0MgogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfRU5ERUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgMjAwCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxMAogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfZW5kZWQoKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgIQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjExCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxMgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTMKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjM0CiAgICAvLyB1bml0cz1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjMyLTQyCiAgICAvLyByZXR1cm4gdHlwLkFjY291bnRQb3NpdGlvbigKICAgIC8vICAgICBwYXltZW50X2FkZHJlc3M9cGF5bWVudF9hZGRyZXNzLAogICAgLy8gICAgIHVuaXRzPVVJbnQ2NCgwKSwKICAgIC8vICAgICByZXNlcnZlZF91bml0cz1VSW50NjQoMCksCiAgICAvLyAgICAgc3VzcGVuZGVkPUZhbHNlLAogICAgLy8gICAgIHNldHRsZWRfY3Vyc29yPVVJbnQ2NCgwKSwKICAgIC8vICAgICBpbnRlcmVzdF9jaGVja3BvaW50PVVJbnQ2NCgwKSwKICAgIC8vICAgICBwcmluY2lwYWxfY2hlY2twb2ludD1VSW50NjQoMCksCiAgICAvLyAgICAgY2xhaW1hYmxlX2ludGVyZXN0PVVJbnQ2NCgwKSwKICAgIC8vICAgICBjbGFpbWFibGVfcHJpbmNpcGFsPVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGl0b2IKICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgYnl0ZWMgNDAgLy8gMHgwMAogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTQKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gc2VsZi5fbmV3X2FjY291bnRfcG9zaXRpb24ocGF5bWVudF9hZGRyZXNzKQogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxNQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5hY2NvdW50X3VwZGF0ZV9wYXltZW50X2FkZHJlc3Nbcm91dGluZ10oKSAtPiB2b2lkOgphY2NvdW50X3VwZGF0ZV9wYXltZW50X2FkZHJlc3M6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg0MTIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMzgKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcywgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgdW5jb3ZlciAzCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjM5CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0MAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDEKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcyA9IHBheW1lbnRfYWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDIKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF9nZXRfcG9zaXRpb25bcm91dGluZ10oKSAtPiB2b2lkOgphY2NvdW50X2dldF9wb3NpdGlvbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg0MTIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI1OQogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmNvbnRyYWN0X2NyZWF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X2NyZWF0ZToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDM2CiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gYXJyYW5nZXIKICAgIGJ5dGVjIDE4IC8vIDB4NTIzYTQxNTI1MjIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAzNwogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9jb25maWdbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9jb25maWc6CiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAzOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGxlbgogICAgcHVzaGludCAxMDcKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuTm9ybWFsaXplZEFjdHVzVGVybXMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDcyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLkluaXRpYWxLZXJuZWxTdGF0ZQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIGxlbgogICAgZGlnIDEKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgdHVwbGUgZW5jb2RpbmcKICAgIGR1cAogICAgcHVzaGludCAzNAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHRhaWwgcG9pbnRlciBhdCBpbmRleCAxIG9mICh1aW50OFszMl0sKGxlbit1dGY4W10pKQogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBjb3ZlciAzCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAzNgogICAgKwogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5Qcm9zcGVjdHVzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDY5CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNzEtMTA3MgogICAgLy8gIyBDb25maWd1cmUgQ29udHJhY3QKICAgIC8vIHNlbGYuY29udHJhY3RfdHlwZSA9IHRlcm1zLmNvbnRyYWN0X3R5cGUuYXNfdWludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjEtMjI4CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICBieiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIzCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfQU5OKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjEtMjI4CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjQKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgcHVzaGludCAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjEtMjI4CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjUKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjEtMjI4CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjYKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgcHVzaGludCA0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjEtMjI4CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjcKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjEtMjI4CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYnogY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAOAoKY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUA3OgogICAgaW50Y18xIC8vIDEKCmNvbnRyYWN0X2NvbmZpZ19ib29sX21lcmdlQDk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMzIKICAgIC8vIGFzc2VydCBzZWxmLl9pc19zdXBwb3J0ZWRfY29udHJhY3RfdHlwZShjb250cmFjdF90eXBlKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc0CiAgICAvLyBzZWxmLl9zdG9yZV9jb250cmFjdF9jb25maWcoc2VsZi5jb250cmFjdF90eXBlLCB0ZXJtcywgaW5pdGlhbF9zdGF0ZSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBidXJ5IDIKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMjgKICAgIC8vIGFzc2VydCB0ZXJtcy5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBkaWcgNAogICAgZHVwCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDgKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMzMAogICAgLy8gdGVybXMuZGF5X2NvdW50X2NvbnZlbnRpb24uYXNfdWludDY0KCkKICAgIHB1c2hpbnQgNTcKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDAtMzA2CiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgIGJ6IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGRpZyA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDIKICAgIC8vIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzAwLTMwNgogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGRpZyA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDMKICAgIC8vIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICBwdXNoaW50IDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMwMC0zMDYKICAgIC8vIHJldHVybiBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzYwKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwSVNEQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjApLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDE2CiAgICBkaWcgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzA0CiAgICAvLyBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDAtMzA2CiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgID09CiAgICBibnogY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUAxNgogICAgZGlnIDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMwNQogICAgLy8gVUludDY0KGVudW1zLkRDQ18zMEUzNjApLAogICAgcHVzaGludCA0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDAtMzA2CiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgID09CiAgICBieiBjb250cmFjdF9jb25maWdfYm9vbF9mYWxzZUAxNwoKY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUAxNjoKICAgIGludGNfMSAvLyAxCgpjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUAxODoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxMi0zMTQKICAgIC8vIGFzc2VydCBzZWxmLl9pc19zdXBwb3J0ZWRfZGF5X2NvdW50X2NvbnZlbnRpb24oCiAgICAvLyAgICAgZGF5X2NvdW50X2NvbnZlbnRpb24KICAgIC8vICksIGVyci5JTlZBTElEX0RBWV9DT1VOVF9DT05WRU5USU9OCiAgICBhc3NlcnQgLy8gSW52YWxpZCBkYXktY291bnQgY29udmVudGlvbiBJRAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzMyCiAgICAvLyBpZiBjb250cmFjdF90eXBlICE9IFVJbnQ2NChlbnVtcy5DVF9BTk4pOgogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgIT0KICAgIGJ6IGNvbnRyYWN0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDIwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzMKICAgIC8vIGFzc2VydCBub3QgdGVybXMuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBkaWcgNAogICAgcHVzaGludCA3ODYKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgoKY29udHJhY3RfY29uZmlnX2FmdGVyX2lmX2Vsc2VAMjA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTAKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTEKICAgIC8vIGFzc2VydCBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID09IFVJbnQ2NCgwKSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBELUFTQSBhbHJlYWR5IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgxMy04MTQKICAgIC8vICMgU2V0IERlbm9taW5hdGlvbiBBc3NldAogICAgLy8gc2VsZi5fYXNzZXJ0X2Rlbm9taW5hdGlvbl9hc3NldCh0ZXJtcy5kZW5vbWluYXRpb25fYXNzZXRfaWQpCiAgICBkaWcgNAogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc3OC03NzkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gZGVub21pbmF0aW9uIHdpdGggQVNBCiAgICAvLyBfY3JlYXRvciwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfY3JlYXRvcihkZW5vbWluYXRpb25fYXNzZXRfaWQpCiAgICBkdXAKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc4MAogICAgLy8gYXNzZXJ0IGV4aXN0cywgZXJyLklOVkFMSURfREVOT01JTkFUSU9OCiAgICBhc3NlcnQgLy8gRGVub21pbmF0aW9uIGFzc2V0IGlzIG5vdCBwcm9wZXJseSBzZXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc4MwogICAgLy8gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgPSBkZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIGJ5dGVjIDQ0IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgxNy04MTgKICAgIC8vICMgU2V0IFNldHRsZW1lbnQgQXNzZXQKICAgIC8vIHNlbGYuX2Fzc2VydF9zZXR0bGVtZW50X2Fzc2V0KHRlcm1zLnNldHRsZW1lbnRfYXNzZXRfaWQpCiAgICBkaWcgMQogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Nzg4CiAgICAvLyBzZXR0bGVtZW50X2Fzc2V0X2lkID09IHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc4Ni03ODkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzZXR0bGVtZW50IGFzc2V0IGlzIHRoZSBkZW5vbWluYXRpb24gYXNzZXQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgLy8gKSwgZXJyLklOVkFMSURfU0VUVExFTUVOVF9BU1NFVAogICAgYXNzZXJ0IC8vIERpZmZlcmVudCBzZXR0bGVtZW50IGFzc2V0IG5vdCBzdXBwb3J0ZWQsIG11c3QgYmUgZXF1YWwgdG8gZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3OTIKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCA9IHNldHRsZW1lbnRfYXNzZXRfaWQKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3OTMtNzk5CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3OTgKICAgIC8vIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3OTYKICAgIC8vIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Nzk3CiAgICAvLyBhc3NldF9hbW91bnQ9MCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3OTMtNzk0CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc5My03OTkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gc2V0dGxlbWVudCB3aXRoIEFTQQogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PTAsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MjEtODIyCiAgICAvLyAjIFVuaXRzCiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzID0gdGVybXMudG90YWxfdW5pdHMKICAgIGR1cAogICAgcHVzaGludCAxNwogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MjMKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODI1LTgyNgogICAgLy8gIyBEYXktQ291bnQgQ29udmVudGlvbnMKICAgIC8vIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPSB0ZXJtcy5kYXlfY291bnRfY29udmVudGlvbi5hc191aW50NjQoKQogICAgYnl0ZWMgNDYgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgZGlnIDgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MjgtODI5CiAgICAvLyAjIFRpbWUKICAgIC8vIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlID0gdGVybXMuaW5pdGlhbF9leGNoYW5nZV9kYXRlCiAgICBkdXAKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAyOCAvLyAiaW5pdGlhbF9leGNoYW5nZV9kYXRlIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MzAKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IHRlcm1zLm1hdHVyaXR5X2RhdGUKICAgIGRpZyAxCiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNDUgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzMQogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gaW5pdGlhbF9zdGF0ZS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBkaWcgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBwdXNoaW50IDQ4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODMzLTgzNAogICAgLy8gIyBQcmluY2lwYWwKICAgIC8vIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPSB0ZXJtcy5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudAogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgZGlnIDEwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODM1CiAgICAvLyBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSB0ZXJtcy5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBkaWcgMwogICAgcHVzaGludCA3ODYKICAgIGdldGJpdAogICAgYnl0ZWMgMzQgLy8gImR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODM2CiAgICAvLyBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9IGluaXRpYWxfc3RhdGUub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBkaWcgMQogICAgcHVzaGludCAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MzgtODM5CiAgICAvLyAjIEludGVyZXN0CiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgPSBpbml0aWFsX3N0YXRlLmFjY3J1ZWRfaW50ZXJlc3QKICAgIGRpZyAxCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDEtODQyCiAgICAvLyAjIEludGVyZXN0IFJhdGUKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gaW5pdGlhbF9zdGF0ZS5ub21pbmFsX2ludGVyZXN0X3JhdGUKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQzCiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBpbml0aWFsX3N0YXRlLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UKICAgIGRpZyAxCiAgICBwdXNoaW50IDI0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDQKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQgPSB0ZXJtcy5yYXRlX3Jlc2V0X3NwcmVhZAogICAgZGlnIDMKICAgIHB1c2hpbnQgNTgKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzNSAvLyAicmF0ZV9yZXNldF9zcHJlYWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQ1CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciA9IHRlcm1zLnJhdGVfcmVzZXRfbXVsdGlwbGllcgogICAgZGlnIDMKICAgIHB1c2hpbnQgNjYKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzNiAvLyAicmF0ZV9yZXNldF9tdWx0aXBsaWVyIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0NgogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X2Zsb29yID0gdGVybXMucmF0ZV9yZXNldF9mbG9vcgogICAgZGlnIDMKICAgIHB1c2hpbnQgNzQKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzMSAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDcKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9jYXAgPSB0ZXJtcy5yYXRlX3Jlc2V0X2NhcAogICAgZGlnIDMKICAgIHB1c2hpbnQgODIKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzMiAvLyAicmF0ZV9yZXNldF9jYXAiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQ4CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfbmV4dCA9IHRlcm1zLnJhdGVfcmVzZXRfbmV4dAogICAgZGlnIDMKICAgIHB1c2hpbnQgOTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzNyAvLyAicmF0ZV9yZXNldF9uZXh0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0OQogICAgLy8gc2VsZi5oYXNfcmF0ZV9yZXNldF9mbG9vciA9IHRlcm1zLmhhc19yYXRlX3Jlc2V0X2Zsb29yCiAgICBkaWcgMwogICAgcHVzaGludCA3ODQKICAgIGdldGJpdAogICAgYnl0ZWMgMzggLy8gImhhc19yYXRlX3Jlc2V0X2Zsb29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg1MAogICAgLy8gc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgPSB0ZXJtcy5oYXNfcmF0ZV9yZXNldF9jYXAKICAgIGRpZyAzCiAgICBwdXNoaW50IDc4NQogICAgZ2V0Yml0CiAgICBieXRlYyAzOSAvLyAiaGFzX3JhdGVfcmVzZXRfY2FwIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg1Mi04NTMKICAgIC8vICMgU2NhbGluZwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSA9IHRlcm1zLmZpeGVkX3BvaW50X3NjYWxlCiAgICB1bmNvdmVyIDMKICAgIHB1c2hpbnQgOTkKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NTUtODU2CiAgICAvLyAjIFNjaGVkdWxlIFByb2Nlc3NpbmcKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yID0gaW5pdGlhbF9zdGF0ZS5ldmVudF9jdXJzb3IKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NTgtODU5CiAgICAvLyAjIFBlci1Vbml0IEZpeGVkLVBvaW50IEluZGV4ZXMKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCA9IGluaXRpYWxfc3RhdGUuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleAogICAgZGlnIDEKICAgIHB1c2hpbnQgNTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NjAKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggPSBpbml0aWFsX3N0YXRlLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4CiAgICBkaWcgMQogICAgcHVzaGludCA2NAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NjItODYzCiAgICAvLyAjIFJlc2VydmVkIEFtb3VudCAoZm9yIGV4ZWN1dGVkIGNhc2hmbG93cykKICAgIC8vIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODY0CiAgICAvLyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODY2CiAgICAvLyBhc3NlcnQgdGVybXMuaW5pdGlhbF9leGNoYW5nZV9kYXRlID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsIGVyci5JTlZBTElEX0lFRAogICAgZGlnIDIKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgID4KICAgIGFzc2VydCAvLyBJRUQgbXVzdCBiZSBzZXQgaW4gdGhlIGZ1dHVyZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODY3CiAgICAvLyBhc3NlcnQgdGVybXMuaW5pdGlhbF9leGNoYW5nZV9kYXRlID4gaW5pdGlhbF9zdGF0ZS5zdGF0dXNfZGF0ZSwgZXJyLklOVkFMSURfSUVECiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICA8CiAgICBhc3NlcnQgLy8gSUVEIG11c3QgYmUgc2V0IGluIHRoZSBmdXR1cmUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2OAogICAgLy8gYXNzZXJ0IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA8IHRlcm1zLm1hdHVyaXR5X2RhdGUsIGVyci5JTlZBTElEX0lFRAogICAgPAogICAgYXNzZXJ0IC8vIElFRCBtdXN0IGJlIHNldCBpbiB0aGUgZnV0dXJlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc2LTEwNzcKICAgIC8vICMgTm90YXJpemUgcHJvc3BlY3R1cyAob3B0aW9uYWwpCiAgICAvLyBzZWxmLnByb3NwZWN0dXNfaGFzaCA9IHByb3NwZWN0dXMuaGFzaC5ieXRlcwogICAgZGlnIDIKICAgIGV4dHJhY3QgMCAzMgogICAgYnl0ZWMgNDIgLy8gInByb3NwZWN0dXNfaGFzaCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc4CiAgICAvLyBzZWxmLnByb3NwZWN0dXNfdXJsID0gcHJvc3BlY3R1cy51cmwKICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgYnl0ZWMgNDMgLy8gInByb3NwZWN0dXNfdXJsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNzkKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAzOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpjb250cmFjdF9jb25maWdfYm9vbF9mYWxzZUAxNzoKICAgIGludGNfMCAvLyAwCiAgICBiIGNvbnRyYWN0X2NvbmZpZ19ib29sX21lcmdlQDE4Cgpjb250cmFjdF9jb25maWdfYm9vbF9mYWxzZUA4OgogICAgaW50Y18wIC8vIDAKICAgIGIgY29udHJhY3RfY29uZmlnX2Jvb2xfbWVyZ2VAOQoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmNvbnRyYWN0X3NjaGVkdWxlW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3Rfc2NoZWR1bGU6CiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwODEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgc3dhcAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGR1cAogICAgcHVzaGludCA2NQogICAgKgogICAgcHVzaGludCAyCiAgICArCiAgICB1bmNvdmVyIDIKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeT4KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMTMKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTExNgogICAgLy8gY29udHJhY3RfdHlwZT1zZWxmLmNvbnRyYWN0X3R5cGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgY292ZXIgMwogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg4NAogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuQUxSRUFEWV9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBELUFTQSBhbHJlYWR5IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg4NS04ODcKICAgIC8vIGFzc2VydCBzY2hlZHVsZV9wYWdlLmxlbmd0aCA8PSBVSW50NjQoCiAgICAvLyAgICAgY3N0LlNDSEVEVUxFX1BBR0VfU0laRQogICAgLy8gKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZHVwCiAgICBwdXNoaW50IDE2CiAgICA8PQogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODg4CiAgICAvLyBhc3NlcnQgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCA+IFVJbnQ2NCgwKSwgZXJyLlRFUk1TX05PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIHRlcm1zIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTAKICAgIC8vIHBhZ2VfY3Vyc29yID0gc2NoZWR1bGVfcGFnZV9pbmRleCAqIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKQogICAgc3dhcAogICAgcHVzaGludCAxNgogICAgKgogICAgc3dhcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODk3CiAgICAvLyArIHBhZ2VfbGVuZ3RoICogVUludDY0KGNzdC5PUF9VUF9DT05UUkFDVF9DT05GSUdfUEVSX0VOVFJZX0JVREdFVCkKICAgIHB1c2hpbnQgMTAwCiAgICAqCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTYKICAgIC8vIFVJbnQ2NChjc3QuT1BfVVBfQ09OVFJBQ1RfQ09ORklHX0JBU0VfQlVER0VUKQogICAgaW50YyA0IC8vIDE1MDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg5Ni04OTcKICAgIC8vIFVJbnQ2NChjc3QuT1BfVVBfQ09OVFJBQ1RfQ09ORklHX0JBU0VfQlVER0VUKQogICAgLy8gKyBwYWdlX2xlbmd0aCAqIFVJbnQ2NChjc3QuT1BfVVBfQ09OVFJBQ1RfQ09ORklHX1BFUl9FTlRSWV9CVURHRVQpCiAgICArCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTItODk5CiAgICAvLyAjIFZhbGlkYXRpb24gY29zdCBncm93cyB3aXRoIHBhZ2UgbGVuZ3RoLCBzbyBjb25maWd1cmF0aW9uIGV4cGxpY2l0bHkKICAgIC8vICMgYnV5cyBleHRyYSBvcGNvZGUgYnVkZ2V0IGZvciBsYXJnZXIgdXBsb2Fkcy4KICAgIC8vIGVuc3VyZV9idWRnZXQoCiAgICAvLyAgICAgcmVxdWlyZWRfYnVkZ2V0PSgKICAgIC8vICAgICAgICAgVUludDY0KGNzdC5PUF9VUF9DT05UUkFDVF9DT05GSUdfQkFTRV9CVURHRVQpCiAgICAvLyAgICAgICAgICsgcGFnZV9sZW5ndGggKiBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19QRVJfRU5UUllfQlVER0VUKQogICAgLy8gICAgICksCiAgICAvLyApCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDAKICAgIC8vIGluZGV4ID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAoKY29udHJhY3Rfc2NoZWR1bGVfd2hpbGVfdG9wQDI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDEKICAgIC8vIHdoaWxlIGluZGV4IDwgcGFnZV9sZW5ndGg6CiAgICBkdXAKICAgIGRpZyA0CiAgICA8CiAgICBieiBjb250cmFjdF9zY2hlZHVsZV9hZnRlcl93aGlsZUAxMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTAyLTkwMwogICAgLy8gZW50cnkgPSBzY2hlZHVsZV9wYWdlW2luZGV4XS5jb3B5KCkKICAgIC8vIGVudHJ5X2V2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBkaWcgNAogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgYnVyeSAxMgogICAgZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgcHVzaGludCA2NQogICAgKgogICAgcHVzaGludCA2NQogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDMKICAgIC8vIGVudHJ5X2V2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkwMi05MDMKICAgIC8vIGVudHJ5ID0gc2NoZWR1bGVfcGFnZVtpbmRleF0uY29weSgpCiAgICAvLyBlbnRyeV9ldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgaW50Y18yIC8vIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkwMwogICAgLy8gZW50cnlfZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGdldGJ5dGUKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSAxMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTA0CiAgICAvLyBhc3NlcnQgZW50cnkuZXZlbnRfaWQgPT0gcGFnZV9jdXJzb3IgKyBpbmRleCwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgMTMKICAgIGRpZyA1CiAgICB1bmNvdmVyIDQKICAgICsKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgaWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkwNS05MDcKICAgIC8vIHNlbGYuX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGVudHJ5X2V2ZW50X3R5cGUKICAgIC8vICkKICAgIGRpZyA1CiAgICB1bmNvdmVyIDMKICAgIGNhbGxzdWIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDgKICAgIC8vIGFzc2VydCBlbnRyeS5zY2hlZHVsZWRfdGltZSA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBzd2FwCiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgMTAKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkwOQogICAgLy8gaWYgZW50cnkuZXZlbnRfaWQgPiBVSW50NjQoMCk6CiAgICBieiBjb250cmFjdF9zY2hlZHVsZV9hZnRlcl9pZl9lbHNlQDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkxMAogICAgLy8gaWYgaW5kZXggPiBVSW50NjQoMCk6CiAgICBkdXAKICAgIGJ6IGNvbnRyYWN0X3NjaGVkdWxlX2Vsc2VfYm9keUA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTEKICAgIC8vIHByZXZpb3VzX2VudHJ5ID0gc2NoZWR1bGVfcGFnZVtpbmRleCAtIFVJbnQ2NCgxKV0uY29weSgpCiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBwdXNoaW50IDY1CiAgICAqCiAgICBkaWcgMTEKICAgIHN3YXAKICAgIHB1c2hpbnQgNjUKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwoKY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTI2CiAgICAvLyBwcmV2aW91c19lbnRyeS5zY2hlZHVsZWRfdGltZSA8PSBlbnRyeS5zY2hlZHVsZWRfdGltZQogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDgKICAgIDw9CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjUtOTI3CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHByZXZpb3VzX2VudHJ5LnNjaGVkdWxlZF90aW1lIDw9IGVudHJ5LnNjaGVkdWxlZF90aW1lCiAgICAvLyApLCBlcnIuSU5WQUxJRF9TT1JUSU5HCiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbXVzdCBiZSBzb3J0ZWQgaW4gc3RyaWN0bHkgYXNjZW5kaW5nIG9yZGVyCgpjb250cmFjdF9zY2hlZHVsZV9hZnRlcl9pZl9lbHNlQDg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjgKICAgIC8vIGlmIGVudHJ5LmV2ZW50X2lkID09IFVJbnQ2NCgwKToKICAgIGRpZyA4CiAgICBibnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTI5LTkzMQogICAgLy8gYXNzZXJ0IGVudHJ5X2V2ZW50X3R5cGUgPT0gVUludDY0KAogICAgLy8gICAgIGVudW1zLkVWVF9JRUQKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZGlnIDkKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgoKY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzMgogICAgLy8gaW5kZXggKz0gVUludDY0KDEpCiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgY29udHJhY3Rfc2NoZWR1bGVfd2hpbGVfdG9wQDIKCmNvbnRyYWN0X3NjaGVkdWxlX2Vsc2VfYm9keUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTEzLTkxNQogICAgLy8gIyBUaGUgZmlyc3QgZW50cnkgb2YgYSBwYWdlIG11c3Qgc3RpbGwgYmUgb3JkZXJlZCBhZnRlciB0aGUKICAgIC8vICMgbGFzdCBlbnRyeSBvZiB0aGUgcHJldmlvdXMgcGFnZS4KICAgIC8vIGFzc2VydCBzY2hlZHVsZV9wYWdlX2luZGV4ID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9FVkVOVF9JRAogICAgZGlnIDYKICAgIGR1cAogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgaWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkxNgogICAgLy8gcHJldmlvdXNfcGFnZV9pbmRleCA9IHNjaGVkdWxlX3BhZ2VfaW5kZXggLSBVSW50NjQoMSkKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTgKICAgIC8vIHByZXZpb3VzX3BhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlCiAgICBpdG9iCiAgICBieXRlYyAyNCAvLyAweDUzMjMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkxNy05MTkKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgcHJldmlvdXNfcGFnZV9pbmRleCBpbiBzZWxmLnNjaGVkdWxlX3BhZ2UKICAgIC8vICksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkyMC05MjEKICAgIC8vIHByZXZpb3VzX3BhZ2UgPSBzZWxmLnNjaGVkdWxlX3BhZ2VbcHJldmlvdXNfcGFnZV9pbmRleF0uY29weSgpCiAgICAvLyBhc3NlcnQgcHJldmlvdXNfcGFnZS5sZW5ndGggPiBVSW50NjQoMCksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIHB1c2hpbnQgMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkyMQogICAgLy8gYXNzZXJ0IHByZXZpb3VzX3BhZ2UubGVuZ3RoID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBkdXAKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkyMwogICAgLy8gcHJldmlvdXNfcGFnZS5sZW5ndGggLSBVSW50NjQoMSkKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjItOTI0CiAgICAvLyBwcmV2aW91c19lbnRyeSA9IHByZXZpb3VzX3BhZ2VbCiAgICAvLyAgICAgcHJldmlvdXNfcGFnZS5sZW5ndGggLSBVSW50NjQoMSkKICAgIC8vIF0uY29weSgpCiAgICBwdXNoaW50IDY1CiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIHB1c2hpbnQgNjUKICAgIGJveF9leHRyYWN0CiAgICBiIGNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VANwoKY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfd2hpbGVAMTE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMDMKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHNjaGVkdWxlX3BhZ2UuY29weSgpCiAgICBkaWcgNgogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBkaWcgNQogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTM1CiAgICAvLyBpZiBpc19sYXN0X3BhZ2U6CiAgICBkaWcgNQogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTM3CiAgICAvLyBzY2hlZHVsZV9wYWdlX2luZGV4ICogVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpICsgcGFnZV9sZW5ndGgKICAgIGRpZyAxCiAgICBkaWcgNAogICAgKwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTM2CiAgICAvLyBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50ID0gKAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MzYtOTM4CiAgICAvLyBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50ID0gKAogICAgLy8gICAgIHNjaGVkdWxlX3BhZ2VfaW5kZXggKiBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkgKyBwYWdlX2xlbmd0aAogICAgLy8gKQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzOQogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgcHVzaGludCA1MAogICAgYXBwX2dsb2JhbF9wdXQKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTIxCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwODEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmNvbnRyYWN0X2V4ZWN1dGVfaWVkW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfZXhlY3V0ZV9pZWQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDYKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE0NgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTQ3CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE0OAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTAKICAgIC8vIGFzc2VydCBzZWxmLmV2ZW50X2N1cnNvciA8IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICBkaWcgMQogICAgPgogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgY3Vyc29yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTUxCiAgICAvLyBlbnRyeSA9IHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLmV2ZW50X2N1cnNvcikKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1MgogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X3R5cGUgPT0gYXJjNC5VSW50OChlbnVtcy5FVlRfSUVEKSwgZXJyLklOVkFMSURfRVZFTlRfVFlQRQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgZHVwCiAgICBwdXNoYnl0ZXMgMHgwMQogICAgYj09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCB0eXBlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTU2CiAgICAvLyBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIGRpZyAxCiAgICBleHRyYWN0IDAgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1OAogICAgLy8gc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICBkaWcgMgogICAgZXh0cmFjdCA5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTkKICAgIC8vIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgZGlnIDMKICAgIGV4dHJhY3QgMTcgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE2MAogICAgLy8gcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZGlnIDQKICAgIGV4dHJhY3QgMjUgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE2MgogICAgLy8gbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9ZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBkaWcgNQogICAgZXh0cmFjdCAzMyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTYzCiAgICAvLyBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICBkaWcgNgogICAgZXh0cmFjdCA0MSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTY0CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1lbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIGRpZyA3CiAgICBleHRyYWN0IDQ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNjUKICAgIC8vIGZsYWdzPWVudHJ5LmZsYWdzLAogICAgZGlnIDgKICAgIGV4dHJhY3QgNTcgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1NS0xMTY2CiAgICAvLyB0eXAuT2JzZXJ2ZWRFdmVudFJlcXVlc3QoCiAgICAvLyAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBvYnNlcnZlZF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1lbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9ZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9ZW50cnkuZmxhZ3MsCiAgICAvLyApLAogICAgdW5jb3ZlciA3CiAgICB1bmNvdmVyIDgKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE2MQogICAgLy8gb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1NS0xMTY2CiAgICAvLyB0eXAuT2JzZXJ2ZWRFdmVudFJlcXVlc3QoCiAgICAvLyAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBvYnNlcnZlZF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1lbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9ZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9ZW50cnkuZmxhZ3MsCiAgICAvLyApLAogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTMtMTE2NwogICAgLy8gc2VsZi5fYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkoCiAgICAvLyAgICAgZW50cnksCiAgICAvLyAgICAgdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0KAogICAgLy8gICAgICAgICBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIC8vICAgICAgICAgZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgLy8gICAgICAgICBzY2hlZHVsZWRfdGltZT1lbnRyeS5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICAgICAgYWNjcnVhbF9mYWN0b3I9ZW50cnkuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICAgICAgb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPWVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPWVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgICAgICBmbGFncz1lbnRyeS5mbGFncywKICAgIC8vICAgICApLAogICAgLy8gKQogICAgY2FsbHN1YiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkKICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE2OAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTIzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5hcHBseV9ub25fY2FzaF9ldmVudFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFwcGx5X25vbl9jYXNoX2V2ZW50OgogICAgaW50Y18wIC8vIDAKICAgIGR1cG4gNAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwbiAyCiAgICBsZW4KICAgIHB1c2hpbnQgNzMKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuT2JzZXJ2ZWRFdmVudFJlcXVlc3QKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NgogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjA3CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIwOAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMTAKICAgIC8vIGlmIHBheWxvYWQuZmxhZ3MgJiBVSW50NjQoZW51bXMuRkxBR19PQlNFUlZFRF9FVkVOVCk6CiAgICBwdXNoaW50IDY1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBwdXNoaW50IDQKICAgICYKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjM2CiAgICAvLyByZXR1cm4gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9DTE0pCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIHB1c2hpbnQgNQogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMTEKICAgIC8vIGFzc2VydCBzZWxmLl9zdXBwb3J0c19vYnNlcnZlZF9ldmVudHMoKSwgZXJyLk9CU0VSVkVEX0VWRU5UX1JFUVVJUkVECiAgICBhc3NlcnQgLy8gT2JzZXJ2ZWQgZXZlbnQgcmVxdWlyZWQgdG8gZXhlY3V0ZSB0aGlzIGFjdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIxMgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMzYKICAgIC8vIHJldHVybiBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0NMTSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgZHVwCiAgICBwdXNoaW50IDUKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NDgKICAgIC8vIGFzc2VydCBzZWxmLl9zdXBwb3J0c19vYnNlcnZlZF9ldmVudHMoKSwgZXJyLk9CU0VSVkVEX0VWRU5UX1JFUVVJUkVECiAgICBhc3NlcnQgLy8gT2JzZXJ2ZWQgZXZlbnQgcmVxdWlyZWQgdG8gZXhlY3V0ZSB0aGlzIGFjdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQ5CiAgICAvLyBhc3NlcnQgcGF5bG9hZC5ldmVudF9pZCA9PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LCBlcnIuSU5WQUxJRF9FVkVOVF9JRAogICAgZGlnIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgNwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTEKICAgIC8vIHNlbGYuY29udHJhY3RfdHlwZSwgcGF5bG9hZC5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBkdXAKICAgIGV4dHJhY3QgOCAxCiAgICBidXJ5IDEyCiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTUwLTk1MgogICAgLy8gc2VsZi5fYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgc2VsZi5jb250cmFjdF90eXBlLCBwYXlsb2FkLmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIC8vICkKICAgIGNhbGxzdWIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTQKICAgIC8vIHBhZ2VfaW5kZXggPSBzZWxmLl9zY2hlZHVsZV9wYWdlX2luZGV4KHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxOTMKICAgIC8vIHJldHVybiBldmVudF9pZCAvLyBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkKICAgIHB1c2hpbnQgMTYKICAgIC8KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1NQogICAgLy8gcGFnZSA9IHR5cC5FeGVjdXRpb25TY2hlZHVsZVBhZ2UoKQogICAgYnl0ZWMgNDkgLy8gMHgwMDAwCiAgICBidXJ5IDcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1NgogICAgLy8gaWYgcGFnZV9pbmRleCBpbiBzZWxmLnNjaGVkdWxlX3BhZ2U6CiAgICBpdG9iCiAgICBieXRlYyAyNCAvLyAweDUzMjMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDkKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYWZ0ZXJfaWZfZWxzZUAyNwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTU3CiAgICAvLyBwYWdlID0gc2VsZi5zY2hlZHVsZV9wYWdlW3BhZ2VfaW5kZXhdLmNvcHkoKQogICAgZGlnIDcKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGJ1cnkgNwogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfcGFnZSBlbnRyeSBleGlzdHMKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMjc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTgKICAgIC8vIGFzc2VydCBwYWdlLmxlbmd0aCA8IFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZGlnIDUKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgcHVzaGludCAxNgogICAgPAogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTYzCiAgICAvLyBzY2hlZHVsZWRfdGltZT1wYXlsb2FkLnNjaGVkdWxlZF90aW1lLAogICAgZGlnIDMKICAgIGR1cAogICAgZXh0cmFjdCA5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2NAogICAgLy8gYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIGRpZyAxCiAgICBleHRyYWN0IDE3IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2NQogICAgLy8gcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICBkaWcgMgogICAgZXh0cmFjdCAyNSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjYKICAgIC8vIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPXBheWxvYWQubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBkaWcgMwogICAgZXh0cmFjdCA0MSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjcKICAgIC8vIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgZGlnIDQKICAgIGV4dHJhY3QgNDkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTY4CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1wYXlsb2FkLm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgdW5jb3ZlciA1CiAgICBleHRyYWN0IDU3IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2MC05NzAKICAgIC8vIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgIGV2ZW50X2lkPXBheWxvYWQuZXZlbnRfaWQsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1wYXlsb2FkLmV2ZW50X3R5cGUsCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPXBheWxvYWQubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1wYXlsb2FkLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICBmbGFncz1wYXlsb2FkLmZsYWdzLAogICAgLy8gKQogICAgZGlnIDExCiAgICBpdG9iCiAgICBkaWcgMTgKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1OS05NzEKICAgIC8vIHBhZ2UuYXBwZW5kKAogICAgLy8gICAgIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgICAgICBldmVudF9pZD1wYXlsb2FkLmV2ZW50X2lkLAogICAgLy8gICAgICAgICBldmVudF90eXBlPXBheWxvYWQuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICAgICAgYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPXBheWxvYWQubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1wYXlsb2FkLm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgICAgICBmbGFncz1wYXlsb2FkLmZsYWdzLAogICAgLy8gICAgICkKICAgIC8vICkKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk3MgogICAgLy8gc2VsZi5zY2hlZHVsZV9wYWdlW3BhZ2VfaW5kZXhdID0gcGFnZS5jb3B5KCkKICAgIGRpZyA4CiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTczCiAgICAvLyBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50ICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMTUKICAgIC8vIGFzc2VydCBldmVudF9pZCA9PSBzZWxmLmV2ZW50X2N1cnNvciwgZXJyLklOVkFMSURfRVZFTlRfQ1VSU09SCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGRpZyAzCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGN1cnNvcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIxNgogICAgLy8gZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoZXZlbnRfaWQpCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIGR1cAogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjE4CiAgICAvLyBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBkdXAKICAgIGV4dHJhY3QgOCAxCiAgICBidXJ5IDEwCiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2NwogICAgLy8gVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2Ni0zNzMKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lFRCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9SUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9SUkYpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX3RydWVAMTUKICAgIGRpZyA0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjgKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgcHVzaGludCA0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjYtMzczCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY5CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIHB1c2hpbnQgMTIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2Ni0zNzMKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lFRCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9SUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9SUkYpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX3RydWVAMTUKICAgIGRpZyA0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNzAKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIHB1c2hpbnQgMTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2Ni0zNzMKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lFRCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9SUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9SUkYpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX3RydWVAMTUKICAgIGRpZyA0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNzEKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICBwdXNoaW50IDE4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjYtMzczCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzcyCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICBwdXNoaW50IDUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2Ni0zNzMKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lFRCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9SUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9SUkYpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfZmFsc2VAMTYKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNToKICAgIGludGNfMSAvLyAxCgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX21lcmdlQDE3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIxNy0xMjE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfaXNfbm9uX2Nhc2goCiAgICAvLyAgICAgZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgLy8gKSwgZXJyLklOVkFMSURfRVZFTlRfVFlQRQogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIyMAogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X3R5cGUgIT0gYXJjNC5VSW50OChlbnVtcy5FVlRfSUVEKSwgZXJyLklOVkFMSURfRVZFTlRfVFlQRQogICAgZGlnIDgKICAgIHB1c2hieXRlcyAweDAxCiAgICBiIT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IHR5cGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM3NwogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKFVJbnQ2NChlbnVtcy5FVlRfUlIpLCBVSW50NjQoZW51bXMuRVZUX1JSRikpCiAgICBkaWcgNAogICAgcHVzaGludCAxMgogICAgPT0KICAgIGJueiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX3RydWVAMjEKICAgIGRpZyA0CiAgICBwdXNoaW50IDExCiAgICA9PQogICAgYnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9mYWxzZUAyMgoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDIxOgogICAgaW50Y18xIC8vIDEKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfbWVyZ2VAMjM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjIxCiAgICAvLyBpZiBzZWxmLl9ldmVudF9pc19yYXRlX3Jlc2V0KGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkpOgogICAgYnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfZWxzZV9ib2R5QDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4MAogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYub2JzZXJ2ZXIsIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyNSAvLyAweDUyM2E0ZDRmNDMyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIyNQogICAgLy8gc2VsZi5fYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkoZW50cnksIHBheWxvYWQpCiAgICBkaWcgNgogICAgZGlnIDIKICAgIGNhbGxzdWIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5CiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMjYKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE3MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgphcHBseV9ub25fY2FzaF9ldmVudF9lbHNlX2JvZHlANToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMjQKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgYiBhcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDYKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfZmFsc2VAMjI6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX21lcmdlQDIzCgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX2ZhbHNlQDE2OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9tZXJnZUAxNwoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50W3JvdXRpbmddKCkgLT4gdm9pZDoKYXBwZW5kX29ic2VydmVkX2Nhc2hfZXZlbnQ6CiAgICBpbnRjXzAgLy8gMAogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjI4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cG4gMgogICAgbGVuCiAgICBwdXNoaW50IDY1CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLk9ic2VydmVkQ2FzaEV2ZW50UmVxdWVzdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQ2CiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyNTcKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI1OAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyNTkKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzgKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTUwCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuX3N0YXR1c19pc19wZW5kaW5nX2llZCgpLCBlcnIuUEVORElOR19JRUQKICAgICEKICAgIGFzc2VydCAvLyBJRUQgbm90IHlldCBleGVjdXRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjM2CiAgICAvLyByZXR1cm4gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9DTE0pCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIHB1c2hpbnQgNQogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4NAogICAgLy8gYXNzZXJ0IHNlbGYuX3N1cHBvcnRzX29ic2VydmVkX2V2ZW50cygpLCBlcnIuT0JTRVJWRURfRVZFTlRfUkVRVUlSRUQKICAgIGFzc2VydCAvLyBPYnNlcnZlZCBldmVudCByZXF1aXJlZCB0byBleGVjdXRlIHRoaXMgYWN0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5ODUKICAgIC8vIGFzc2VydCBwYXlsb2FkLmV2ZW50X2lkID09IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQsIGVyci5JTlZBTElEX0VWRU5UX0lECiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICBzd2FwCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5ODYKICAgIC8vIGFzc2VydCBwYXlsb2FkLmV2ZW50X3R5cGUgPT0gYXJjNC5VSW50OChlbnVtcy5FVlRfUFIpLCBlcnIuSU5WQUxJRF9FVkVOVF9UWVBFCiAgICBkaWcgMQogICAgZXh0cmFjdCA4IDEKICAgIGR1cAogICAgY292ZXIgMwogICAgcHVzaGJ5dGVzIDB4MDMKICAgIGI9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTg3CiAgICAvLyBhc3NlcnQgcGF5bG9hZC5mbGFncyAmIFVJbnQ2NChlbnVtcy5GTEFHX0NBU0hfRVZFTlQpLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIHN3YXAKICAgIHB1c2hpbnQgNTcKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMSAvLyAxCiAgICAmCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5ODkKICAgIC8vIGlmIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgPiBVSW50NjQoMCk6CiAgICBieiBhcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5MQogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCAtIFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5MC05OTIKICAgIC8vIHByZXZpb3VzX2VudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KAogICAgLy8gICAgIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgLSBVSW50NjQoMSkKICAgIC8vICkKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTk0CiAgICAvLyBwcmV2aW91c19lbnRyeS5zY2hlZHVsZWRfdGltZSA8PSBwYXlsb2FkLnNjaGVkdWxlZF90aW1lCiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgNAogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgPD0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5My05OTUKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgcHJldmlvdXNfZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gcGF5bG9hZC5zY2hlZHVsZWRfdGltZQogICAgLy8gKSwgZXJyLklOVkFMSURfU09SVElORwogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIG11c3QgYmUgc29ydGVkIGluIHN0cmljdGx5IGFzY2VuZGluZyBvcmRlcgoKYXBwZW5kX29ic2VydmVkX2Nhc2hfZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTk3CiAgICAvLyBwYWdlX2luZGV4ID0gc2VsZi5fc2NoZWR1bGVfcGFnZV9pbmRleChzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTkzCiAgICAvLyByZXR1cm4gZXZlbnRfaWQgLy8gVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpCiAgICBwdXNoaW50IDE2CiAgICAvCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OTgKICAgIC8vIHBhZ2UgPSB0eXAuRXhlY3V0aW9uU2NoZWR1bGVQYWdlKCkKICAgIGJ5dGVjIDQ5IC8vIDB4MDAwMAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OTkKICAgIC8vIGlmIHBhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlOgogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA3CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VANQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAwMAogICAgLy8gcGFnZSA9IHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XS5jb3B5KCkKICAgIGRpZyA1CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidXJ5IDYKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX3BhZ2UgZW50cnkgZXhpc3RzCgphcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDAxCiAgICAvLyBhc3NlcnQgcGFnZS5sZW5ndGggPCBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGRpZyA0CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgMTYKICAgIDwKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMDYKICAgIC8vIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICBkaWcgNQogICAgZHVwCiAgICBleHRyYWN0IDkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAwNwogICAgLy8gYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIGRpZyAxCiAgICBleHRyYWN0IDE3IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMDgKICAgIC8vIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZGlnIDIKICAgIGV4dHJhY3QgMjUgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAwOQogICAgLy8gbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9cGF5bG9hZC5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIGRpZyAzCiAgICBleHRyYWN0IDMzIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMTAKICAgIC8vIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgZGlnIDQKICAgIGV4dHJhY3QgNDEgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAxMQogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIHVuY292ZXIgNQogICAgZXh0cmFjdCA0OSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDAzLTEwMTMKICAgIC8vIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgIGV2ZW50X2lkPXBheWxvYWQuZXZlbnRfaWQsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1wYXlsb2FkLmV2ZW50X3R5cGUsCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPXBheWxvYWQubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1wYXlsb2FkLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICBmbGFncz1wYXlsb2FkLmZsYWdzLAogICAgLy8gKQogICAgZGlnIDEwCiAgICBpdG9iCiAgICBkaWcgMTAKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMDItMTAxNAogICAgLy8gcGFnZS5hcHBlbmQoCiAgICAvLyAgICAgdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkoCiAgICAvLyAgICAgICAgIGV2ZW50X2lkPXBheWxvYWQuZXZlbnRfaWQsCiAgICAvLyAgICAgICAgIGV2ZW50X3R5cGU9cGF5bG9hZC5ldmVudF90eXBlLAogICAgLy8gICAgICAgICBzY2hlZHVsZWRfdGltZT1wYXlsb2FkLnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgICAgICBhY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPXBheWxvYWQucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9cGF5bG9hZC5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1wYXlsb2FkLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXBheWxvYWQubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgICAgIGZsYWdzPXBheWxvYWQuZmxhZ3MsCiAgICAvLyAgICAgKQogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAxNQogICAgLy8gc2VsZi5zY2hlZHVsZV9wYWdlW3BhZ2VfaW5kZXhdID0gcGFnZS5jb3B5KCkKICAgIGRpZyA2CiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAxNgogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjYzCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmNvbnRyYWN0X3NldF9kZWZhdWx0X3N0YXR1c1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X3NldF9kZWZhdWx0X3N0YXR1czoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyNjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo3NAogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYudHJ1c3RlZSwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDI2IC8vIDB4NTIzYTU0NTI1MzIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjc4CiAgICAvLyBzZWxmLmRlZmF1bHRlZCA9IGRlZmF1bHRlZAogICAgYnl0ZWMgNDcgLy8gImRlZmF1bHRlZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjc5CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyNjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmNvbnRyYWN0X2dldF9zdGF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X2dldF9zdGF0ZToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NgogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgZHVwCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyOTQKICAgIC8vIGNvbnRyYWN0X3R5cGU9YXJjNC5VSW50OChzZWxmLmNvbnRyYWN0X3R5cGUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgaW50Y18yIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjk2CiAgICAvLyB0b3RhbF91bml0cz1zZWxmLnRvdGFsX3VuaXRzLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyOTcKICAgIC8vIHJlc2VydmVkX3VuaXRzX3RvdGFsPXNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI5OAogICAgLy8gaW5pdGlhbF9leGNoYW5nZV9hbW91bnQ9c2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMCAvLyAiaW5pdGlhbF9leGNoYW5nZV9hbW91bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjk5CiAgICAvLyBldmVudF9jdXJzb3I9c2VsZi5ldmVudF9jdXJzb3IsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMDAKICAgIC8vIHNjaGVkdWxlX2VudHJ5X2NvdW50PXNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzAxCiAgICAvLyBvdXRzdGFuZGluZ19wcmluY2lwYWw9c2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMDIKICAgIC8vIGludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2U9c2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMDMKICAgIC8vIG5vbWluYWxfaW50ZXJlc3RfcmF0ZT1zZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMwNAogICAgLy8gYWNjcnVlZF9pbnRlcmVzdD1zZWxmLmFjY3J1ZWRfaW50ZXJlc3QsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMwNQogICAgLy8gY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleD1zZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMDYKICAgIC8vIGN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4PXNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTcgLy8gImN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMwNwogICAgLy8gcmVzZXJ2ZWRfaW50ZXJlc3Q9c2VsZi5yZXNlcnZlZF9pbnRlcmVzdCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzA4CiAgICAvLyByZXNlcnZlZF9wcmluY2lwYWw9c2VsZi5yZXNlcnZlZF9wcmluY2lwYWwsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjkzLTEzMDkKICAgIC8vIHJldHVybiB0eXAuS2VybmVsU3RhdGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZT1hcmM0LlVJbnQ4KHNlbGYuY29udHJhY3RfdHlwZSksCiAgICAvLyAgICAgc3RhdHVzPXNlbGYuc3RhdHVzLAogICAgLy8gICAgIHRvdGFsX3VuaXRzPXNlbGYudG90YWxfdW5pdHMsCiAgICAvLyAgICAgcmVzZXJ2ZWRfdW5pdHNfdG90YWw9c2VsZi5yZXNlcnZlZF91bml0c190b3RhbCwKICAgIC8vICAgICBpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudD1zZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50LAogICAgLy8gICAgIGV2ZW50X2N1cnNvcj1zZWxmLmV2ZW50X2N1cnNvciwKICAgIC8vICAgICBzY2hlZHVsZV9lbnRyeV9jb3VudD1zZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LAogICAgLy8gICAgIG91dHN0YW5kaW5nX3ByaW5jaXBhbD1zZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICBpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlPXNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSwKICAgIC8vICAgICBub21pbmFsX2ludGVyZXN0X3JhdGU9c2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgYWNjcnVlZF9pbnRlcmVzdD1zZWxmLmFjY3J1ZWRfaW50ZXJlc3QsCiAgICAvLyAgICAgY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleD1zZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgsCiAgICAvLyAgICAgY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXg9c2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCwKICAgIC8vICAgICByZXNlcnZlZF9pbnRlcmVzdD1zZWxmLnJlc2VydmVkX2ludGVyZXN0LAogICAgLy8gICAgIHJlc2VydmVkX3ByaW5jaXBhbD1zZWxmLnJlc2VydmVkX3ByaW5jaXBhbCwKICAgIC8vICkKICAgIHVuY292ZXIgMTQKICAgIGl0b2IKICAgIHVuY292ZXIgMTQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDEyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTEKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMAogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDkKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA4CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDYKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNAogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI4MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50W3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQ2CiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMjMKICAgIC8vIGlmIHNlbGYuZXZlbnRfY3Vyc29yID49IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQ6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgID49CiAgICBieiBjb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzI1CiAgICAvLyBldmVudF9pZD1zZWxmLmV2ZW50X2N1cnNvciwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMyNC0xMzM0CiAgICAvLyByZXR1cm4gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkoCiAgICAvLyAgICAgZXZlbnRfaWQ9c2VsZi5ldmVudF9jdXJzb3IsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1hcmM0LlVJbnQ4KDApLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPVVJbnQ2NCgwKSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249VUludDY0KDApLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPVVJbnQ2NCgwKSwKICAgIC8vICAgICBmbGFncz1VSW50NjQoMCksCiAgICAvLyApCiAgICBpdG9iCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzI2CiAgICAvLyBldmVudF90eXBlPWFyYzQuVUludDgoMCksCiAgICBieXRlYyA0MCAvLyAweDAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzI0LTEzMzQKICAgIC8vIHJldHVybiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1zZWxmLmV2ZW50X2N1cnNvciwKICAgIC8vICAgICBldmVudF90eXBlPWFyYzQuVUludDgoMCksCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9VUludDY0KDApLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9VUludDY0KDApLAogICAgLy8gICAgIGZsYWdzPVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMyNwogICAgLy8gc2NoZWR1bGVkX3RpbWU9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMjQtMTMzNAogICAgLy8gcmV0dXJuIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgIGV2ZW50X2lkPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgLy8gICAgIGV2ZW50X3R5cGU9YXJjNC5VSW50OCgwKSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1VSW50NjQoMCksCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1VSW50NjQoMCksCiAgICAvLyAgICAgZmxhZ3M9VUludDY0KDApLAogICAgLy8gKQogICAgaXRvYgogICAgc3dhcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0Cgpjb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnRfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnRANDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMzUKICAgIC8vIHJldHVybiBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoc2VsZi5ldmVudF9jdXJzb3IpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMxMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIGNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudF9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudEA0CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuY29udHJhY3RfdXBkYXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfdXBkYXRlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE1OS0xNjIKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBncmFudHMgdGhlIHVwZGF0ZSBwZXJtaXNzaW9ucyB0byB0aGUgQXJyYW5nZXIuCiAgICAvLyAjIOKaoO+4jyBXQVJOSU5HOiBBcHBsaWNhdGlvbiB1cGRhdGVzIG11c3QgYmUgZXhlY3V0ZWQgVkVSWSBjYXJlZnVsbHksIGFzIHRoZXkKICAgIC8vICMgbWlnaHQgaW50cm9kdWNlIGJyZWFraW5nIGNoYW5nZXMuCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3JvdGF0ZV9hcnJhbmdlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfcm90YXRlX2FycmFuZ2VyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzgKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE3OQogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IG5ld19hcnJhbmdlcgogICAgYnl0ZWMgMTggLy8gMHg1MjNhNDE1MjUyMjMKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTgwCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfc2V0X29wX2RhZW1vbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfc2V0X29wX2RhZW1vbjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTk2CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxOTcKICAgIC8vIHNlbGYub3BfZGFlbW9uLnZhbHVlID0gYWRkcmVzcwogICAgYnl0ZWMgMjcgLy8gMHg1MjNhNGY1MDQ0MjMKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTk4CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfYXNzaWduX3JvbGVbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2Fzc2lnbl9yb2xlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIHB1c2hpbnQgMTYKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuUm9sZVZhbGlkaXR5CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjIyCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjMKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI0CiAgICAvLyBzZWxmLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpKQogICAgYnRvaQogICAgZHVwbiAyCiAgICBjYWxsc3ViIF9hc3NlcnRfdmFsaWRfcm9sZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwMgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUik6CiAgICBwdXNoaW50IDIwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDMKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDE4IC8vIDB4NTIzYTQxNTI1MjIzCiAgICBkaWcgMwogICAgYXBwX2dsb2JhbF9wdXQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI2CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA2CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgNDAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwNwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjMgLy8gMHg1MjNhNGQ0ZTQ3MjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwOAogICAgLy8gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjUKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMiAvLyAweDUyM2E1MDU5NDQyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTEyCiAgICAvLyBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI1CiAgICAvLyBzZWxmLl9zZXRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIHZhbGlkaXR5KQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTQKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNjAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI2IC8vIDB4NTIzYTU0NTI1MzIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTYKICAgIC8vIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNQogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE4CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNzAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTkKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIxIC8vIDB4NTIzYTQxNTU1NDIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjAKICAgIC8vIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI1CiAgICAvLyBzZWxmLl9zZXRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIHZhbGlkaXR5KQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMTE6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIyCiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKToKICAgIGR1cAogICAgcHVzaGludCA4MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjMKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYub2JzZXJ2ZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjUgLy8gMHg1MjNhNGQ0ZjQzMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyNAogICAgLy8gc2VsZi5vYnNlcnZlcltyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19yZXZva2Vfcm9sZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfcmV2b2tlX3JvbGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjQ3CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNDgKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjQ5CiAgICAvLyBzZWxmLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpKQogICAgYnRvaQogICAgZHVwbiAyCiAgICBjYWxsc3ViIF9hc3NlcnRfdmFsaWRfcm9sZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyNwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgIT0gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBkdXAKICAgIHB1c2hpbnQgMjAKICAgICE9CiAgICBhc3NlcnQgLy8gSW52YWxpZCByb2xlIGlkZW50aWZpZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjgKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIHB1c2hpbnQgNDAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyOQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmFjY291bnRfbWFuYWdlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMyAvLyAweDUyM2E0ZDRlNDcyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMwCiAgICAvLyBkZWwgc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1MQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIyIC8vIDB4NTIzYTUwNTk0NDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzQKICAgIC8vIGRlbCBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1MAogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzYKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNjAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjYgLy8gMHg1MjNhNTQ1MjUzMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzOAogICAgLy8gZGVsIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTAKICAgIC8vIHNlbGYuX2RlbGV0ZV9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcykKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQwCiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNzAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMSAvLyAweDUyM2E0MTU1NTQyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQyCiAgICAvLyBkZWwgc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjUwCiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgODAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ1CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYub2JzZXJ2ZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjUgLy8gMHg1MjNhNGQ0ZjQzMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NgogICAgLy8gZGVsIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2NvbnRyYWN0X3N1c3BlbnNpb25bcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2NvbnRyYWN0X3N1c3BlbnNpb246CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjUzCiAgICAvLyBAYXJjNC5hYmltZXRob2QgICMgVE9ETzogVXBkYXRlIHNwZWNzIGFuZCBhZGQgdGVzdAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo3NwogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYXV0aG9yaXR5LCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjEgLy8gMHg1MjNhNDE1NTU0MjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNjkKICAgIC8vIHNlbGYuYXNzZXRfc3VzcGVuZGVkID0gc3VzcGVuZGVkCiAgICBieXRlYyAzMyAvLyAiYXNzZXRfc3VzcGVuZGVkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNzAKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kICAjIFRPRE86IFVwZGF0ZSBzcGVjcyBhbmQgYWRkIHRlc3QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9hcnJhbmdlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X2FycmFuZ2VyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4MwogICAgLy8gcmV0dXJuIHNlbGYuYXJyYW5nZXIudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOCAvLyAweDUyM2E0MTUyNTIyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYWRkcmVzc19yb2xlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg1CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwMwogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hY2NvdW50X21hbmFnZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjMgLy8gMHg1MjNhNGQ0ZTQ3MjMKICAgIGRpZyAxCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwNAogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5wcmltYXJ5X2RlYWxlciwgYWRkcmVzcyksCiAgICBieXRlYyAyMiAvLyAweDUyM2E1MDU5NDQyMwogICAgZGlnIDIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA1CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnRydXN0ZWUsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjYgLy8gMHg1MjNhNTQ1MjUzMjMKICAgIGRpZyAzCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwNgogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIGFkZHJlc3MpLAogICAgYnl0ZWMgMjEgLy8gMHg1MjNhNDE1NTU0MjMKICAgIGRpZyA0CiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwNwogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5vYnNlcnZlciwgYWRkcmVzcyksCiAgICBieXRlYyAyNSAvLyAweDUyM2E0ZDRmNDMyMwogICAgdW5jb3ZlciA1CiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlYyA0MCAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciA2CiAgICBzZXRiaXQKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDUKICAgIHNldGJpdAogICAgcHVzaGludCAyCiAgICB1bmNvdmVyIDQKICAgIHNldGJpdAogICAgcHVzaGludCAzCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgcHVzaGludCA0CiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOAogICAgLy8gcm9sZSA9IHJvbGVfaWQuYXNfdWludDY0KCkKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjkKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGUpCiAgICBkdXAKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzMxCiAgICAvLyBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKToKICAgIHB1c2hpbnRzIDIwIDQwIDUwIDYwIDcwIDgwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzMwLTM2MQogICAgLy8gbWF0Y2ggcm9sZToKICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKToKICAgIC8vICAgICAgICAgcmV0dXJuIHR5cC5Sb2xlVmFsaWRpdHkoCiAgICAvLyAgICAgICAgICAgICByb2xlX3ZhbGlkaXR5X3N0YXJ0PVVJbnQ2NCgwKSwgcm9sZV92YWxpZGl0eV9lbmQ9VUludDY0KDApCiAgICAvLyAgICAgICAgICkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSk6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSk6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgXzoKICAgIC8vICAgICAgICAgb3AuZXJyKGVyci5JTlZBTElEX1JPTEUpCiAgICB1bmNvdmVyIDYKICAgIG1hdGNoIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMEAyIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMUAzIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMkA0IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfM0A1IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNEA2IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzYxCiAgICAvLyBvcC5lcnIoZXJyLklOVkFMSURfUk9MRSkKICAgIGVyciAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV81QDc6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzU3CiAgICAvLyBzZWxmLm9ic2VydmVyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDI1IC8vIDB4NTIzYTRkNGY0MzIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzU2LTM1OAogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM1OQogICAgLy8gcmV0dXJuIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzRANjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTIKICAgIC8vIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDIxIC8vIDB4NTIzYTQxNTU1NDIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzUxLTM1MwogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTQKICAgIC8vIHJldHVybiBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzNANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNDcKICAgIC8vIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAyNiAvLyAweDUyM2E1NDUyNTMyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM0Ni0zNDgKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM0OQogICAgLy8gcmV0dXJuIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzJANDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNDIKICAgIC8vIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMjIgLy8gMHg1MjNhNTA1OTQ0MjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNDEtMzQzCiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzQ0CiAgICAvLyByZXR1cm4gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzFAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzcKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDIzIC8vIDB4NTIzYTRkNGU0NzIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzM2LTMzOAogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzkKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzBAMjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzItMzM0CiAgICAvLyByZXR1cm4gdHlwLlJvbGVWYWxpZGl0eSgKICAgIC8vICAgICByb2xlX3ZhbGlkaXR5X3N0YXJ0PVVJbnQ2NCgwKSwgcm9sZV92YWxpZGl0eV9lbmQ9VUludDY0KDApCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB2b2lkOgpfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZDoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNgogICAgLy8gZGVmIF9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHNlbGYsIGhvbGRpbmdfYWRkcmVzczogQWNjb3VudCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI4CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZCwgZXJyLlNVU1BFTkRFRAogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCAzODQKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIFN1c3BlbmRlZCBvcGVyYXRpb25zCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5fc2V0dGxlX3Bvc2l0aW9uKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NCwgdWludDY0Ogpfc2V0dGxlX3Bvc2l0aW9uOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjQ0CiAgICAvLyBkZWYgX3NldHRsZV9wb3NpdGlvbihzZWxmLCBob2xkaW5nX2FkZHJlc3M6IEFjY291bnQpIC0+IHR1cGxlW1VJbnQ2NCwgVUludDY0XToKICAgIHByb3RvIDEgMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjYxCiAgICAvLyBwb3NpdGlvbiA9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNvcHkoKQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo2My02NQogICAgLy8gIyBDb21wdXRlIHRoZSBpbmNyZW1lbnRhbCBwZXItdW5pdCBmaXhlZC1wb2ludCBpbnRlcmVzdCBhbmQgcHJpbmNpcGFsIGFjY3J1ZWQKICAgIC8vICMgc2luY2UgdGhpcyBhY2NvdW50J3MgbGFzdCBjaGVja3BvaW50LgogICAgLy8gaW50ZXJlc3RfZGVsdGEgPSBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggLSBwb3NpdGlvbi5pbnRlcmVzdF9jaGVja3BvaW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCBleGlzdHMKICAgIGRpZyAxCiAgICBwdXNoaW50IDU3CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjY3CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IC0gcG9zaXRpb24ucHJpbmNpcGFsX2NoZWNrcG9pbnQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggZXhpc3RzCiAgICBkaWcgMgogICAgcHVzaGludCA2NQogICAgZXh0cmFjdF91aW50NjQKICAgIC0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3MwogICAgLy8gaW50ZXJlc3RfZGVsdGEsIHBvc2l0aW9uLnVuaXRzLCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICBkaWcgMgogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjcwLTc0CiAgICAvLyAjIENvbnZlcnQgdGhlIHBlci11bml0IGZpeGVkLXBvaW50IGRlbHRhcyBpbnRvIGFic29sdXRlIGNsYWltYWJsZSBhbW91bnRzCiAgICAvLyAjIHVzaW5nIHRoZSBhY2NvdW50J3MgYWN0aXZlIHVuaXRzLgogICAgLy8gY2xhaW1hYmxlX2ludGVyZXN0ID0gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgaW50ZXJlc3RfZGVsdGEsIHBvc2l0aW9uLnVuaXRzLCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICAvLyApCiAgICB1bmNvdmVyIDMKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzYKICAgIC8vIHByaW5jaXBhbF9kZWx0YSwgcG9zaXRpb24udW5pdHMsIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3NS03NwogICAgLy8gY2xhaW1hYmxlX3ByaW5jaXBhbCA9IHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIHByaW5jaXBhbF9kZWx0YSwgcG9zaXRpb24udW5pdHMsIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUKICAgIC8vICkKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzktODEKICAgIC8vICMgQWNjcnVlIHRoZSBjbGFpbWFibGUgYW1vdW50cyB0byB0aGUgYWNjb3VudCBwb3NpdGlvbiBhbmQgbWFrZSB0aGVtIGF2YWlsYWJsZQogICAgLy8gIyBmb3Igd2l0aGRyYXdhbC4KICAgIC8vIHBvc2l0aW9uLmNsYWltYWJsZV9pbnRlcmVzdCArPSBjbGFpbWFibGVfaW50ZXJlc3QKICAgIGRpZyAyCiAgICBwdXNoaW50IDczCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDIKICAgICsKICAgIGl0b2IKICAgIHVuY292ZXIgMwogICAgc3dhcAogICAgcmVwbGFjZTIgNzMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo4MgogICAgLy8gcG9zaXRpb24uY2xhaW1hYmxlX3ByaW5jaXBhbCArPSBjbGFpbWFibGVfcHJpbmNpcGFsCiAgICBkdXAKICAgIHB1c2hpbnQgODEKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgKwogICAgaXRvYgogICAgcmVwbGFjZTIgODEKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo4NC04NgogICAgLy8gIyBBZHZhbmNlIHRoZSBhY2NvdW50J3MgcGVyLXVuaXQgZml4ZWQtcG9pbnQgY2hlY2twb2ludHMgdG8gdGhlIGN1cnJlbnQgZ2xvYmFsCiAgICAvLyAjIHBlci11bml0IGZpeGVkLXBvaW50IGdsb2JhbCBpbmRpY2VzLgogICAgLy8gcG9zaXRpb24uaW50ZXJlc3RfY2hlY2twb2ludCA9IHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggZXhpc3RzCiAgICBpdG9iCiAgICByZXBsYWNlMiA1NwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojg3CiAgICAvLyBwb3NpdGlvbi5wcmluY2lwYWxfY2hlY2twb2ludCA9IHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggZXhpc3RzCiAgICBpdG9iCiAgICByZXBsYWNlMiA2NQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojg5LTkwCiAgICAvLyAjIEFkdmFuY2UgdGhlIGFjY291bnQncyBldmVudCBjdXJzb3IgdG8gdGhlIGN1cnJlbnQgZ2xvYmFsIGV2ZW50IGN1cnNvci4KICAgIC8vIHBvc2l0aW9uLnNldHRsZWRfY3Vyc29yID0gc2VsZi5ldmVudF9jdXJzb3IKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaXRvYgogICAgcmVwbGFjZTIgNDkKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo5Mi05NAogICAgLy8gIyBVcGRhdGUgdGhlIGFjY291bnQgcG9zaXRpb24gYW5kIHJldHVybiB0aGUgbmV3bHkgYWNjcnVlZCBjbGFpbWFibGUgYW1vdW50cwogICAgLy8gIyBhZGRlZCB0byB0aGUgdG90YWwgcG9zaXRpb24ncyBjbGFpbWFibGUgYW1vdW50cy4KICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gcG9zaXRpb24uY29weSgpCiAgICB1bmNvdmVyIDMKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo5NQogICAgLy8gcmV0dXJuIGNsYWltYWJsZV9pbnRlcmVzdCwgY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQoaG9sZGluZ19hZGRyZXNzOiBieXRlcykgLT4gdm9pZDoKX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQ6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6OTcKICAgIC8vIGRlZiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZChzZWxmLCBob2xkaW5nX2FkZHJlc3M6IEFjY291bnQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzOAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTAwCiAgICAvLyBpZiBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKToKICAgIGJ6IF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwMQogICAgLy8gcmV0dXJuCiAgICByZXRzdWIKCl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDMKICAgIC8vIHBvc2l0aW9uID0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY29weSgpCiAgICBmcmFtZV9kaWcgMgogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA0CiAgICAvLyBpZiBwb3NpdGlvbi5yZXNlcnZlZF91bml0cyA9PSBVSW50NjQoMCk6CiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIGJueiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZF9hZnRlcl9pZl9lbHNlQDQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDUKICAgIC8vIHJldHVybgogICAgcmV0c3ViCgpfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZF9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA4CiAgICAvLyBwb3NpdGlvbi51bml0cyArPSBhY3RpdmF0ZWRfdW5pdHMKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDMKICAgICsKICAgIGl0b2IKICAgIHJlcGxhY2UyIDMyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA5CiAgICAvLyBwb3NpdGlvbi5yZXNlcnZlZF91bml0cyA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGl0b2IKICAgIHJlcGxhY2UyIDQwCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTEwCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHBvc2l0aW9uLmNvcHkoKQogICAgZnJhbWVfZGlnIDIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTEKICAgIC8vIGFzc2VydCBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID49IGFjdGl2YXRlZF91bml0cywgZXJyLk9WRVJfRElTVFJJQlVUSU9OCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIGV4aXN0cwogICAgZHVwCiAgICBkaWcgMgogICAgPj0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgcmVtYWluaW5nIEQtQVNBIHVuaXRzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTEyCiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIC09IGFjdGl2YXRlZF91bml0cwogICAgc3dhcAogICAgLQogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9zY2FsZWRfbXVsX2RpdihtdWx0aXBsaWNhbmQ6IHVpbnQ2NCwgbXVsdGlwbGllcjogdWludDY0LCBkaXZpc29yOiB1aW50NjQpIC0+IHVpbnQ2NDoKX3NjYWxlZF9tdWxfZGl2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTU2LTE1OAogICAgLy8gZGVmIF9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLCBtdWx0aXBsaWNhbmQ6IFVJbnQ2NCwgbXVsdGlwbGllcjogVUludDY0LCBkaXZpc29yOiBVSW50NjQKICAgIC8vICkgLT4gVUludDY0OgogICAgcHJvdG8gMyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjAKICAgIC8vIGlmIG11bHRpcGxpY2FuZCA9PSBVSW50NjQoMCkgb3IgbXVsdGlwbGllciA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTMKICAgIGJ6IF9zY2FsZWRfbXVsX2Rpdl9pZl9ib2R5QDIKICAgIGZyYW1lX2RpZyAtMgogICAgYm56IF9zY2FsZWRfbXVsX2Rpdl9hZnRlcl9pZl9lbHNlQDMKCl9zY2FsZWRfbXVsX2Rpdl9pZl9ib2R5QDI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjEKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9zY2FsZWRfbXVsX2Rpdl9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjIKICAgIC8vIGhpZ2gsIGxvdyA9IG9wLm11bHcobXVsdGlwbGljYW5kLCBtdWx0aXBsaWVyKQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIG11bHcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2MwogICAgLy8gcmV0dXJuIG9wLmRpdncoaGlnaCwgbG93LCBkaXZpc29yKQogICAgZnJhbWVfZGlnIC0xCiAgICBkaXZ3CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYW1vdW50X3RvX2luZGV4X2RlbHRhKGFtb3VudDogdWludDY0KSAtPiB1aW50NjQ6Cl9hbW91bnRfdG9faW5kZXhfZGVsdGE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjUKICAgIC8vIGRlZiBfYW1vdW50X3RvX2luZGV4X2RlbHRhKHNlbGYsIGFtb3VudDogVUludDY0KSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2NwogICAgLy8gaWYgYW1vdW50ID09IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMQogICAgYm56IF9hbW91bnRfdG9faW5kZXhfZGVsdGFfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjgKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9hbW91bnRfdG9faW5kZXhfZGVsdGFfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTY5CiAgICAvLyBhc3NlcnQgc2VsZi50b3RhbF91bml0cyA+IFVJbnQ2NCgwKSwgZXJyLk5PX1VOSVRTCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgZHVwCiAgICBhc3NlcnQgLy8gTm8gRC1BU0EgdW5pdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE3MAogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KGFtb3VudCwgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwgc2VsZi50b3RhbF91bml0cykKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2luZGV4X2RlbHRhX3RvX2Ftb3VudChpbmRleF9kZWx0YTogdWludDY0KSAtPiB1aW50NjQ6Cl9pbmRleF9kZWx0YV90b19hbW91bnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNzIKICAgIC8vIGRlZiBfaW5kZXhfZGVsdGFfdG9fYW1vdW50KHNlbGYsIGluZGV4X2RlbHRhOiBVSW50NjQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTc5CiAgICAvLyBpZiBpbmRleF9kZWx0YSA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGJueiBfaW5kZXhfZGVsdGFfdG9fYW1vdW50X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTgwCiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfaW5kZXhfZGVsdGFfdG9fYW1vdW50X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE4MgogICAgLy8gc2VsZi50b3RhbF91bml0cywKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxODQKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxODEtMTg1CiAgICAvLyByZXR1cm4gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgc2VsZi50b3RhbF91bml0cywKICAgIC8vICAgICBpbmRleF9kZWx0YSwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2dldF9zY2hlZHVsZV9lbnRyeShldmVudF9pZDogdWludDY0KSAtPiBieXRlczoKX2dldF9zY2hlZHVsZV9lbnRyeToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIwNQogICAgLy8gZGVmIF9nZXRfc2NoZWR1bGVfZW50cnkoc2VsZiwgZXZlbnRfaWQ6IFVJbnQ2NCkgLT4gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnk6CiAgICBwcm90byAxIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIwNwogICAgLy8gYXNzZXJ0IGV2ZW50X2lkIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgPgogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgaWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE5MwogICAgLy8gcmV0dXJuIGV2ZW50X2lkIC8vIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDE2CiAgICAvCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMDkKICAgIC8vIGFzc2VydCBwYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxOTcKICAgIC8vIHJldHVybiBldmVudF9pZCAlIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDE2CiAgICAlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMTIKICAgIC8vIGFzc2VydCBvZmZzZXQgPCBwYWdlLmxlbmd0aCwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBwdXNoaW50IDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgMQogICAgPgogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjEzCiAgICAvLyByZXR1cm4gcGFnZVtvZmZzZXRdLmNvcHkoKQogICAgcHVzaGludCA2NQogICAgKgogICAgcHVzaGludCAyCiAgICArCiAgICBwdXNoaW50IDY1CiAgICBib3hfZXh0cmFjdAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKGNvbnRyYWN0X3R5cGU6IHVpbnQ2NCwgZXZlbnRfdHlwZTogdWludDY0KSAtPiB2b2lkOgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTYtMzE4CiAgICAvLyBkZWYgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIHNlbGYsIGNvbnRyYWN0X3R5cGU6IFVJbnQ2NCwgZXZlbnRfdHlwZTogVUludDY0CiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1Ny0yNTgKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTAKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTctMjU4CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTEKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgaW50Y18yIC8vIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1Ny0yNTgKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1MgogICAgLy8gVUludDY0KGVudW1zLkVWVF9NRCksCiAgICBwdXNoaW50IDE5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTctMjU4CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTMKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgcHVzaGludCAxMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU3LTI1OAogICAgLy8gIyBDaGVjayBjb21tb24gZXZlbnRzIGZpcnN0CiAgICAvLyBpZiBldmVudF90eXBlIGluIGNvbW1vbl9ldmVudHM6CiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU0CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICBwdXNoaW50IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTctMjU4CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUA3CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU5CiAgICAvLyByZXR1cm4gVHJ1ZQogICAgaW50Y18xIC8vIDEKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzIwLTMyMgogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICByZXRzdWIKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNjEtMjYyCiAgICAvLyAjIENvbnRyYWN0LXNwZWNpZmljIGFkZGl0aW9uYWwgZXZlbnRzCiAgICAvLyBpZiBjb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9QQU0pOgogICAgZnJhbWVfZGlnIC0yCiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjYzLTI2NAogICAgLy8gIyBQQU0gb25seSBzdXBwb3J0cyBjb21tb24gZXZlbnRzCiAgICAvLyByZXR1cm4gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMjAtMzIyCiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNjYKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0xBTSkgb3IgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2Ni0yNjgKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0xBTSkgb3IgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoCiAgICAvLyAgICAgZW51bXMuQ1RfTkFNCiAgICAvLyApOgogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDExCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMgogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDE2CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUAxMToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2OS0yNzMKICAgIC8vICMgTEFNL05BTSBhZGQ6IFBSLCBJUENCCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjcxCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjY5LTI3MwogICAgLy8gIyBMQU0vTkFNIGFkZDogUFIsIElQQ0IKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDEzCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3MgogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIHB1c2hpbnQgMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2OS0yNzMKICAgIC8vICMgTEFNL05BTSBhZGQ6IFBSLCBJUENCCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICkKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF9mYWxzZUAxNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAxMzoKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMjAtMzIyCiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDE0OgogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMyMC0zMjIKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMTY6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzUKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTik6CiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMjMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3Ni0yODEKICAgIC8vICMgQU5OIGFkZHM6IFBSLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjc4CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjc2LTI4MQogICAgLy8gIyBBTk4gYWRkczogUFIsIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDIwCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIHB1c2hpbnQgMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3Ni0yODEKICAgIC8vICMgQU5OIGFkZHM6IFBSLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyMAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODAKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIHB1c2hpbnQgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjc2LTI4MQogICAgLy8gIyBBTk4gYWRkczogUFIsIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDIxCgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDIwOgogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMyMC0zMjIKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMjE6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzIwLTMyMgogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAyMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MwogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfTEFYKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA0CiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMzEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4NC0yOTAKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUiksCiAgICBwdXNoaW50IDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4NC0yOTAKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjgKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjg3CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjg0LTI5MAogICAgLy8gIyBMQVggYWRkczogUFIsIFBJLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyOAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODgKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICBwdXNoaW50IDE4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODQtMjkwCiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDI4CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODQtMjkwCiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDI5CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDI4OgogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMyMC0zMjIKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMjk6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzIwLTMyMgogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAzMToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI5MgogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQ0xNKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA1CiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMzMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI5My0yOTQKICAgIC8vICMgQ0xNIGFkZHM6IFBSCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1BSKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDMKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMjAtMzIyCiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDMzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk2CiAgICAvLyByZXR1cm4gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMjAtMzIyCiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5faXNfZHluYW1pY19hbm51aXR5KCkgLT4gdWludDY0OgpfaXNfZHluYW1pY19hbm51aXR5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM4CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzgtMzM5CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIC8vIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGJ6IF9pc19keW5hbWljX2FubnVpdHlfYm9vbF9mYWxzZUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzkKICAgIC8vIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzNCAvLyAiZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM4LTMzOQogICAgLy8gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICAvLyBhbmQgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBieiBfaXNfZHluYW1pY19hbm51aXR5X2Jvb2xfZmFsc2VAMwogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMzNy0zNDAKICAgIC8vIHJldHVybiAoCiAgICAvLyAgICAgc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICAvLyAgICAgYW5kIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgLy8gKQogICAgcmV0c3ViCgpfaXNfZHluYW1pY19hbm51aXR5X2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzctMzQwCiAgICAvLyByZXR1cm4gKAogICAgLy8gICAgIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKQogICAgLy8gICAgIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIC8vICkKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KGVudHJ5OiBieXRlcykgLT4gdWludDY0LCBieXRlczoKX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozODMKICAgIC8vIGRlZiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudChzZWxmLCBlbnRyeTogdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzkyCiAgICAvLyBlbnRyeS5hY2NydWFsX2ZhY3RvciA9PSBVSW50NjQoMCkKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAxNwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzkyLTM5NAogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGJ6IF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2lmX2JvZHlAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzkzCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzkyLTM5NAogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGJ6IF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2lmX2JvZHlAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzk0CiAgICAvLyBvciBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPT0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzkyLTM5NAogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGJueiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudF9hZnRlcl9pZl9lbHNlQDQKCl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2lmX2JvZHlAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NgogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2RpZyAtMQogICAgdW5jb3ZlciAyCiAgICByZXRzdWIKCl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5OAogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5OQogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQwMAogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5Ny00MDEKICAgIC8vIGFjY3J1ZWQgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICAvLyAgICAgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICkKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MDUKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MDItNDA2CiAgICAvLyByZXR1cm4gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgYWNjcnVlZCwKICAgIC8vICAgICBlbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICBmcmFtZV9kaWcgLTEKICAgIHVuY292ZXIgMgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yKGRpc2NvdW50X2ZhY3RvcjogdWludDY0LCByZWRlbXB0aW9uX2ZhY3RvcjogdWludDY0KSAtPiB1aW50NjQ6Cl9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ2NS00NjkKICAgIC8vIGRlZiBfZGlzY291bnRfYW5udWl0eV9mYWN0b3IoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBkaXNjb3VudF9mYWN0b3I6IFVJbnQ2NCwKICAgIC8vICAgICByZWRlbXB0aW9uX2ZhY3RvcjogVUludDY0LAogICAgLy8gKSAtPiBVSW50NjQ6CiAgICBwcm90byAyIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3MQogICAgLy8gaWYgcmVkZW1wdGlvbl9mYWN0b3IgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0xCiAgICBibnogX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDcyCiAgICAvLyByZXR1cm4gZGlzY291bnRfZmFjdG9yCiAgICBmcmFtZV9kaWcgLTIKICAgIHJldHN1YgoKX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3MwogICAgLy8gcGVyaW9kX3JhdGUgPSBzZWxmLmZpeGVkX3BvaW50X3NjYWxlICsgc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzQKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzMtNDc3CiAgICAvLyBwZXJpb2RfcmF0ZSA9IHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgKyBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICByZWRlbXB0aW9uX2ZhY3RvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICBkaWcgMgogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgICsKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3OAogICAgLy8gYXNzZXJ0IHBlcmlvZF9yYXRlID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGR1cAogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDgxCiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDc5LTQ4MwogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIGRpc2NvdW50X2ZhY3RvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gICAgIHBlcmlvZF9yYXRlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkoZW50cnk6IGJ5dGVzLCBwYXlsb2FkOiBieXRlcykgLT4gYnl0ZXMsIGJ5dGVzOgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MTYtNjE4CiAgICAvLyBkZWYgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5KAogICAgLy8gICAgIHNlbGYsIGVudHJ5OiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSwgcGF5bG9hZDogdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0CiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAyIDIKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjI2CiAgICAvLyBhc3NlcnQgZW50cnkuZXZlbnRfaWQgPT0gc2VsZi5ldmVudF9jdXJzb3IsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGN1cnNvcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjI3CiAgICAvLyBhc3NlcnQgZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsIGVyci5OT19EVUVfQ0FTSEZMT1cKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPD0KICAgIGFzc2VydCAvLyBObyBkdWUgY2FzaGZsb3cgdG8gcGF5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MjkKICAgIC8vIGV2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYzMAogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX0lFRCk6CiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGR1cAogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM4CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYzMS02MzMKICAgIC8vICMgSUVEIGZpbmFsaXplcyBpc3N1YW5jZTogcmVzZXJ2ZWQgdW5pdHMgYmVjb21lIGFjdGl2YXRhYmxlIGFuZCB0aGUKICAgIC8vICMgc2NoZWR1bGUncyBpbml0aWFsIGNvbnRyYWN0dWFsIHN0YXRlIGJlY29tZXMgbGl2ZS4KICAgIC8vIGFzc2VydCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzUKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPT0gc2VsZi50b3RhbF91bml0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM0LTYzNgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID09IHNlbGYudG90YWxfdW5pdHMKICAgIC8vICksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9JTkNPTVBMRVRFCiAgICBhc3NlcnQgLy8gUHJpbWFyeSBkaXN0cmlidXRpb24gaXMgbm90IGNvbXBsZXRlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzcKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM4CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzkKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAzMwogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NDAKICAgIC8vIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjQxCiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NDIKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0MwogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX0FDVElWRSkKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgMTAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDU0CiAgICAvLyBhc3NlcnQgZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSA9PSBVSW50NjQoZW51bXMuRVZUX0lFRCksIGVyci5OT1RfRVZUX0lFRAogICAgZnJhbWVfZGlnIDExCiAgICBhc3NlcnQgLy8gTm90IElFRCBldmVudAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDU1CiAgICAvLyByZXR1cm4gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0NC02NDgKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1zZWxmLl9lbnRyeV9pZWRfYW1vdW50KGVudHJ5KSwKICAgIC8vICAgICBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0NwogICAgLy8gc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0NC02NDgKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1zZWxmLl9lbnRyeV9pZWRfYW1vdW50KGVudHJ5KSwKICAgIC8vICAgICBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICAvLyApCiAgICBjYWxsc3ViIF9lbWl0X2V4ZWN1dGlvbl9ldmVudAogICAgZHVwCiAgICBmcmFtZV9idXJ5IC0yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NDkKICAgIC8vIHJldHVybgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM4CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE1MAogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1MgogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ICs9IHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBmcmFtZV9idXJ5IC0yCiAgICArCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1NAogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1JSKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCAxMgogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMTAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1OAogICAgLy8gcGF5bG9hZC5vYnNlcnZlZF9yYXRlLAogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjU5CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzNiAvLyAicmF0ZV9yZXNldF9tdWx0aXBsaWVyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2MAogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1NS02NjEKICAgIC8vICMgUlIgZGVyaXZlcyB0aGUgbmV4dCByYXRlIGZyb20gYW4gb2JzZXJ2ZWQgb3JhY2xlIHZhbHVlIHBsdXMgdGhlCiAgICAvLyAjIGNvbnRyYWN0IHNwcmVhZCAvIG11bHRpcGxpZXIgdGVybXMsIHRoZW4gZW5mb3JjZXMgZmxvb3IgYW5kIGNhcC4KICAgIC8vIG9ic2VydmVkX3JhdGUgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBwYXlsb2FkLm9ic2VydmVkX3JhdGUsCiAgICAvLyAgICAgc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICkKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjMKICAgIC8vIG9ic2VydmVkX3JhdGUgKyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzUgLy8gInJhdGVfcmVzZXRfc3ByZWFkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkIGV4aXN0cwogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDQKICAgIC8vIGlmIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgYW5kIHJhdGUgPCBzZWxmLnJhdGVfcmVzZXRfZmxvb3I6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzggLy8gImhhc19yYXRlX3Jlc2V0X2Zsb29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmhhc19yYXRlX3Jlc2V0X2Zsb29yIGV4aXN0cwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMSAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X2Zsb29yIGV4aXN0cwogICAgZnJhbWVfZGlnIDYKICAgID4KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDUKICAgIC8vIHJhdGUgPSBzZWxmLnJhdGVfcmVzZXRfZmxvb3IKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMSAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDYKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfZmxvb3IgZXhpc3RzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1NToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc0NgogICAgLy8gaWYgc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgYW5kIHJhdGUgPiBzZWxmLnJhdGVfcmVzZXRfY2FwOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDM5IC8vICJoYXNfcmF0ZV9yZXNldF9jYXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwIGV4aXN0cwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTgKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMiAvLyAicmF0ZV9yZXNldF9jYXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9jYXAgZXhpc3RzCiAgICBmcmFtZV9kaWcgNgogICAgPAogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc0NwogICAgLy8gcmF0ZSA9IHNlbGYucmF0ZV9yZXNldF9jYXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMiAvLyAicmF0ZV9yZXNldF9jYXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSA2CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X2NhcCBleGlzdHMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjYyCiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IHNlbGYuX2NsYW1wX3JhdGUoCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjItNjY0CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IHNlbGYuX2NsYW1wX3JhdGUoCiAgICAvLyAgICAgb2JzZXJ2ZWRfcmF0ZSArIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQKICAgIC8vICkKICAgIGZyYW1lX2RpZyA2CiAgICBhcHBfZ2xvYmFsX3B1dAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMTg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzQKICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QSSk6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMjAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY3NQogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzYKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDIzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjgxCiAgICAvLyBpZiBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKToKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAyOQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjgyCiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFJGKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCA1CiAgICA9PQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMzAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4NgogICAgLy8gKyAoc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCAtIHNlbGYuZXZlbnRfY3Vyc29yKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICAtCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODcKICAgIC8vICogVUludDY0KGNzdC5PUF9VUF9OT05fQ0FTSF9QRVJfRU5UUllfQlVER0VUKQogICAgcHVzaGludCAxMDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4Ni02ODcKICAgIC8vICsgKHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgLSBzZWxmLmV2ZW50X2N1cnNvcikKICAgIC8vICogVUludDY0KGNzdC5PUF9VUF9OT05fQ0FTSF9QRVJfRU5UUllfQlVER0VUKQogICAgKgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njg1CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX05PTl9DQVNIX0JBU0VfQlVER0VUKQogICAgaW50YyA0IC8vIDE1MDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4NS02ODcKICAgIC8vIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfQkFTRV9CVURHRVQpCiAgICAvLyArIChzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IC0gc2VsZi5ldmVudF9jdXJzb3IpCiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfUEVSX0VOVFJZX0JVREdFVCkKICAgICsKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4My02ODkKICAgIC8vIGVuc3VyZV9idWRnZXQoCiAgICAvLyAgICAgcmVxdWlyZWRfYnVkZ2V0PSgKICAgIC8vICAgICAgICAgVUludDY0KGNzdC5PUF9VUF9OT05fQ0FTSF9CQVNFX0JVREdFVCkKICAgIC8vICAgICAgICAgKyAoc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCAtIHNlbGYuZXZlbnRfY3Vyc29yKQogICAgLy8gICAgICAgICAqIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfUEVSX0VOVFJZX0JVREdFVCkKICAgIC8vICAgICApLAogICAgLy8gKQogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDkzCiAgICAvLyBkaXNjb3VudF9mYWN0b3IgPSBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5NAogICAgLy8gZGVub21pbmF0b3IgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5NQogICAgLy8gc2tpcF9maXJzdF9yZWRlbXB0aW9uID0gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5NwogICAgLy8gaWYgZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAyNQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgZnJhbWVfYnVyeSA4CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAzNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDk4LTUwMgogICAgLy8gIyBBbiBpbml0aWFsIFBSRiBtYXkgZGVzY3JpYmUgdGhlIGZpcnN0IHJlZGVtcHRpb24gcGVyaW9kIGRpcmVjdGx5LgogICAgLy8gZGlzY291bnRfZmFjdG9yID0gc2VsZi5fZGlzY291bnRfYW5udWl0eV9mYWN0b3IoCiAgICAvLyAgICAgZGlzY291bnRfZmFjdG9yLAogICAgLy8gICAgIGVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDgKICAgIGNhbGxzdWIgX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA0CiAgICAvLyBza2lwX2ZpcnN0X3JlZGVtcHRpb24gPSBUcnVlCiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfYnVyeSA3CiAgICBmcmFtZV9idXJ5IDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDM1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA2CiAgICAvLyBmdXR1cmVfZXZlbnRfaWQgPSBzZWxmLmV2ZW50X2N1cnNvciArIFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfd2hpbGVfdG9wQDM2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA3CiAgICAvLyB3aGlsZSBmdXR1cmVfZXZlbnRfaWQgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgZnJhbWVfZGlnIDMKICAgID4KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl93aGlsZUA0OAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA4CiAgICAvLyBmdXR1cmVfZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoZnV0dXJlX2V2ZW50X2lkKQogICAgZnJhbWVfZGlnIDMKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwOQogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPSBmdXR1cmVfZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTAtNTExCiAgICAvLyAjIE9ubHkgcmVkZW1wdGlvbi1iZWFyaW5nIGV2ZW50cyBjb250cmlidXRlIHRvIHRoZSBhbm51aXR5IGRlbm9taW5hdG9yLgogICAgLy8gaXNfcmVkZW1wdGlvbl9ldmVudCA9IGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpIG9yICgKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUxMC01MTQKICAgIC8vICMgT25seSByZWRlbXB0aW9uLWJlYXJpbmcgZXZlbnRzIGNvbnRyaWJ1dGUgdG8gdGhlIGFubnVpdHkgZGVub21pbmF0b3IuCiAgICAvLyBpc19yZWRlbXB0aW9uX2V2ZW50ID0gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QUikgb3IgKAogICAgLy8gICAgIGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfTUQpCiAgICAvLyAgICAgYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICAvLyApCiAgICBibnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfdHJ1ZUA0MAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTEyCiAgICAvLyBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgZnJhbWVfZGlnIDQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTItNTEzCiAgICAvLyBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgLy8gYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF9mYWxzZUA0MQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTEzCiAgICAvLyBhbmQgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IgPiBVSW50NjQoMCkKICAgIGZyYW1lX2RpZyAwCiAgICBwdXNoaW50IDI1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTEyLTUxMwogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCkKICAgIC8vIGFuZCBmdXR1cmVfZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX3RydWVANDA6CiAgICBpbnRjXzEgLy8gMQoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfbWVyZ2VANDI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTUKICAgIC8vIGlmIGlzX3JlZGVtcHRpb25fZXZlbnQ6CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA0NwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTE2CiAgICAvLyBpZiBza2lwX2ZpcnN0X3JlZGVtcHRpb246CiAgICBmcmFtZV9kaWcgNwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUA0NQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTE3CiAgICAvLyBza2lwX2ZpcnN0X3JlZGVtcHRpb24gPSBGYWxzZQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgNwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANDc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjQKICAgIC8vIGZ1dHVyZV9ldmVudF9pZCArPSBVSW50NjQoMSkKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV93aGlsZV90b3BAMzYKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlANDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjEKICAgIC8vIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZnJhbWVfZGlnIDAKICAgIHB1c2hpbnQgMjUKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTktNTIyCiAgICAvLyBkaXNjb3VudF9mYWN0b3IgPSBzZWxmLl9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcigKICAgIC8vICAgICBkaXNjb3VudF9mYWN0b3IsCiAgICAvLyAgICAgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMgogICAgc3dhcAogICAgY2FsbHN1YiBfZGlzY291bnRfYW5udWl0eV9mYWN0b3IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjMKICAgIC8vIGRlbm9taW5hdG9yICs9IGRpc2NvdW50X2ZhY3RvcgogICAgZnJhbWVfZGlnIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA0NwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDE6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF9tZXJnZUA0MgoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX3doaWxlQDQ4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTI2CiAgICAvLyBhc3NlcnQgZGVub21pbmF0b3IgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZnJhbWVfZGlnIDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUyNwogICAgLy8gbnVtZXJhdG9yID0gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTI4CiAgICAvLyBpZiBlbnRyeS5mbGFncyAmIFVJbnQ2NChlbnVtcy5GTEFHX0lOSVRJQUxfUFJGKSA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNTcKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gOAogICAgJgogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDUwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjktNTMwCiAgICAvLyAjIFN1YnNlcXVlbnQgUFJGIGV2ZW50cyBhbW9ydGl6ZSBib3RoIHByaW5jaXBhbCBhbmQgYWxyZWFkeSBhY2NydWVkIGNhcnJ5LgogICAgLy8gbnVtZXJhdG9yICs9IHNlbGYuYWNjcnVlZF9pbnRlcmVzdAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgICsKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDUwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTMzCiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTMxLTUzNQogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIG51bWVyYXRvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gICAgIGRlbm9taW5hdG9yLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDEKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OTAKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IHNlbGYuX3JlY2FsY3VsYXRlX2FubnVpdHlfcGF5bWVudCgKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjkwLTY5MgogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gc2VsZi5fcmVjYWxjdWxhdGVfYW5udWl0eV9wYXltZW50KAogICAgLy8gICAgIGVudHJ5CiAgICAvLyApCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMzA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OTUKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY5Ni03MDAKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1VSW50NjQoMCksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OTgKICAgIC8vIHBheW9mZj1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njk5CiAgICAvLyBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY5Ni03MDAKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1VSW50NjQoMCksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgY2FsbHN1YiBfZW1pdF9leGVjdXRpb25fZXZlbnQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDI5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njk0CiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDMwCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDIwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc3CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9JUENCKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCAxOAogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDIzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzgtNjc5CiAgICAvLyAjIElQQ0Iga2VlcHMgcHJpbmNpcGFsIHVuY2hhbmdlZCBhbmQgb25seSByZXNldHMgdGhlIGludGVyZXN0IGJhc2UuCiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIGIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMjMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMTA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjUKICAgIC8vIGVsaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1JSRik6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgMTEKICAgID09CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDE0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjYKICAgIC8vIG5leHRfcmF0ZSA9IGVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY3CiAgICAvLyBpZiBuZXh0X3JhdGUgPT0gVUludDY0KDApOgogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDEzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjgKICAgIC8vIG5leHRfcmF0ZSA9IHNlbGYucmF0ZV9yZXNldF9uZXh0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzcgLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDUKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfbmV4dCBleGlzdHMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY5CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IG5leHRfcmF0ZQogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgZnJhbWVfZGlnIDUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDE0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjcxCiAgICAvLyBpZiBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSAhPSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgOQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY3MgogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPSBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZQogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgZnJhbWVfZGlnIDkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KGVudHJ5OiBieXRlcywgcGF5b2ZmOiB1aW50NjQsIHNldHRsZWRfYW1vdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpfZW1pdF9leGVjdXRpb25fZXZlbnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MDYtNzEyCiAgICAvLyBkZWYgX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgKiwKICAgIC8vICAgICBlbnRyeTogdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnksCiAgICAvLyAgICAgcGF5b2ZmOiBVSW50NjQsCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ6IFVJbnQ2NCwKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDMgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE2CiAgICAvLyBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25JRAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE3CiAgICAvLyBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIGZyYW1lX2RpZyAtMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTgKICAgIC8vIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIGZyYW1lX2RpZyAtMwogICAgZXh0cmFjdCA4IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxOQogICAgLy8gc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICBmcmFtZV9kaWcgLTMKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MjAKICAgIC8vIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MjMKICAgIC8vIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIGZyYW1lX2RpZyAtMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE4CiAgICAvLyBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICBpbnRjXzIgLy8gOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIzCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBnZXRieXRlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NTIKICAgIC8vIGlmIHBheW9mZiA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJueiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NTMKICAgIC8vIHJldHVybiBVSW50NjQoZW51bXMuUEFZT0ZGX1NJR05fUE9TSVRJVkUpCiAgICBpbnRjXzEgLy8gMQoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX3BheW9mZl9zaWduQDc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MjItNzI0CiAgICAvLyBwYXlvZmZfc2lnbj1hcmM0LlVJbnQ4KAogICAgLy8gICAgIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIC8vICksCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgaW50Y18yIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MjYKICAgIC8vIGN1cnJlbmN5X2lkPXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzI3CiAgICAvLyBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTUtNzI4CiAgICAvLyBFeGVjdXRpb25FdmVudCgKICAgIC8vICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIC8vICAgICBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYXBwbGllZF9hdD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICBwYXlvZmY9cGF5b2ZmLAogICAgLy8gICAgIHBheW9mZl9zaWduPWFyYzQuVUludDgoCiAgICAvLyAgICAgICAgIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIC8vICAgICApLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PXNldHRsZWRfYW1vdW50LAogICAgLy8gICAgIGN1cnJlbmN5X2lkPXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAwCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE0LTcyOQogICAgLy8gYXJjNC5lbWl0KAogICAgLy8gICAgIEV4ZWN1dGlvbkV2ZW50KAogICAgLy8gICAgICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgICAgIHBheW9mZj1wYXlvZmYsCiAgICAvLyAgICAgICAgIHBheW9mZl9zaWduPWFyYzQuVUludDgoCiAgICAvLyAgICAgICAgICAgICBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICAvLyAgICAgICAgICksCiAgICAvLyAgICAgICAgIHNldHRsZWRfYW1vdW50PXNldHRsZWRfYW1vdW50LAogICAgLy8gICAgICAgICBjdXJyZW5jeV9pZD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgICAgIHNlcXVlbmNlPWVudHJ5LmV2ZW50X2lkICsgVUludDY0KDEpLAogICAgLy8gICAgICkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDlhMzMyYjk1IC8vIG1ldGhvZCAiRXhlY3V0aW9uRXZlbnQodWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc1NAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiAoVUludDY0KGVudW1zLkVWVF9JRUQpLCBVSW50NjQoZW51bXMuRVZUX1BJKSk6CiAgICBmcmFtZV9kaWcgNQogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBibnogX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2lmX2JvZHlANQogICAgZnJhbWVfZGlnIDUKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGJ6IF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pZl9lbHNlQDYKCl9lbWl0X2V4ZWN1dGlvbl9ldmVudF9pZl9ib2R5QDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NTUKICAgIC8vIHJldHVybiBVSW50NjQoZW51bXMuUEFZT0ZGX1NJR05fUE9TSVRJVkUpCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIzCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBiIF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9wYXlvZmZfc2lnbkA3CgpfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzU2CiAgICAvLyByZXR1cm4gVUludDY0KGVudW1zLlBBWU9GRl9TSUdOX05FR0FUSVZFKQogICAgcHVzaGludCAyNTUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcyMwogICAgLy8gc2VsZi5fcGF5b2ZmX3NpZ24oZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSwgcGF5b2ZmKQogICAgYiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fcGF5b2ZmX3NpZ25ANwoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9yb2xlX2lzX2FjdGl2ZShyb2xlX21hcDogYnl0ZXMsIHJvbGVfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NDoKX3JvbGVfaXNfYWN0aXZlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU3CiAgICAvLyBkZWYgX3JvbGVfaXNfYWN0aXZlKHNlbGYsIHJvbGVfbWFwOiB0eXAuUmJhY1JvbGUsIHJvbGVfYWRkcmVzczogQWNjb3VudCkgLT4gYm9vbDoKICAgIHByb3RvIDIgMQogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5CiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5LTYwCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5LTYxCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjEKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAtNjEKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgPj0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX21lcmdlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKSAtPiB2b2lkOgpfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2NQogICAgLy8gYXNzZXJ0IHNlbGYuX2lzX2FycmFuZ2VyKFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTIKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgPT0gc2VsZi5hcnJhbmdlci52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE4IC8vIDB4NTIzYTQxNTI1MjIzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJyYW5nZXIgZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjY1CiAgICAvLyBhc3NlcnQgc2VsZi5faXNfYXJyYW5nZXIoVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkgLT4gdm9pZDoKX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjgzCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYXNzZXRfZGVmYXVsdGVkLCBlcnIuREVGQVVMVEVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNDEgLy8gImFzc2V0X2RlZmF1bHRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9kZWZhdWx0ZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRGVmYXVsdGVkCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKSAtPiB2b2lkOgpfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODYKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5hc3NldF9zdXNwZW5kZWQsIGVyci5TVVNQRU5ERUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMyAvLyAiYXNzZXRfc3VzcGVuZGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X3N1c3BlbmRlZCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBTdXNwZW5kZWQgb3BlcmF0aW9ucwogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGVfaWQ6IHVpbnQ2NCkgLT4gdm9pZDoKX2Fzc2VydF92YWxpZF9yb2xlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg4CiAgICAvLyBkZWYgX2Fzc2VydF92YWxpZF9yb2xlKHNlbGYsIHJvbGVfaWQ6IFVJbnQ2NCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MAogICAgLy8gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgcHVzaGludCAyMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICBwdXNoaW50IDI1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MgogICAgLy8gVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIHB1c2hpbnQgNDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkzCiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICBwdXNoaW50IDUwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NAogICAgLy8gVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICBwdXNoaW50IDYwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NQogICAgLy8gVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIHB1c2hpbnQgNzAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojk2CiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICBwdXNoaW50IDgwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBieiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9mYWxzZUA4CgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDc6CiAgICBpbnRjXzEgLy8gMQoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfbWVyZ2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICByZXRzdWIKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX2ZhbHNlQDg6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9tZXJnZUA5Cg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="}, "sourceInfo": {"approval": {"pcOffsetMethod": "none", "sourceInfo": [{"pc": [2669], "errorMessage": "ACTUS event not yet executed"}, {"pc": [2427], "errorMessage": "Can not distribute zero units"}, {"pc": [3170, 3177, 3550], "errorMessage": "D-ASA already configured"}, {"pc": [1276, 2008, 2387, 2533, 3767, 3913, 4264, 4526, 4672], "errorMessage": "D-ASA not configured"}, {"pc": [3561], "errorMessage": "D-ASA terms not configured"}, {"pc": [6861], "errorMessage": "Defaulted"}, {"pc": [3188], "errorMessage": "Denomination asset is not properly set"}, {"pc": [3203], "errorMessage": "Different settlement asset not supported, must be equal to denomination asset"}, {"pc": [3439, 3446, 3448], "errorMessage": "IED must be set in the future"}, {"pc": [1294, 2077, 2548, 4282, 6213], "errorMessage": "IED not yet executed"}, {"pc": [2440, 5596], "errorMessage": "Insufficient remaining D-ASA units"}, {"pc": [2643, 2709], "errorMessage": "Insufficient sender units to transfer"}, {"pc": [1904, 3090, 3108, 3164, 3641, 3677, 4329, 5780, 6058, 6118, 6521], "errorMessage": "Invalid ACTUS configuration"}, {"pc": [2017, 2421, 2604, 2619, 2776, 2849, 2912, 2954, 5408, 5533], "errorMessage": "Invalid account holding address"}, {"pc": [4863, 4887, 4911, 4935, 4959, 5016, 5044, 5066, 5088, 5110, 5289, 5307, 5322, 5337, 5352], "errorMessage": "Invalid account role address"}, {"pc": [3150], "errorMessage": "Invalid day-count convention ID"}, {"pc": [1407, 3788, 4116, 6090], "errorMessage": "Invalid event cursor"}, {"pc": [3626, 3689, 3965, 4306, 5696], "errorMessage": "Invalid event id"}, {"pc": [3801, 4180, 4187, 4319], "errorMessage": "Invalid event type"}, {"pc": [5000, 5279, 6931], "errorMessage": "Invalid role identifier"}, {"pc": [3555, 3701, 3709, 4018, 4393, 5711, 5727], "errorMessage": "Invalid schedule page"}, {"pc": [5644], "errorMessage": "No D-ASA units"}, {"pc": [1413, 1933, 2114, 6099], "errorMessage": "No due cashflow to pay"}, {"pc": [6182], "errorMessage": "Not IED event"}, {"pc": [2062, 2395, 2591, 2766, 2822, 2832, 2918, 4215, 4507, 5133, 6853], "errorMessage": "Not authorized"}, {"pc": [1534, 1542, 2163, 2237, 2246], "errorMessage": "Not enough funds for the payment"}, {"pc": [3938, 3951, 4291], "errorMessage": "Observed event required to execute this action"}, {"pc": [2409, 2457], "errorMessage": "Primary distribution is closed"}, {"pc": [6130], "errorMessage": "Primary distribution is not complete"}, {"pc": [2632], "errorMessage": "Sender and receiver must be different"}, {"pc": [5394, 6869], "errorMessage": "Suspended operations"}, {"pc": [2344, 3667, 4351], "errorMessage": "Time events must be sorted in strictly ascending order"}, {"pc": [2565, 2582], "errorMessage": "Transfer is closed"}, {"pc": [2636], "errorMessage": "Transfer units must be greater than zero"}, {"pc": [953], "errorMessage": "Wrong Global Bytes allocation"}, {"pc": [959], "errorMessage": "Wrong Global UInts allocation"}, {"pc": [963], "errorMessage": "Wrong Local Bytes allocation"}, {"pc": [967], "errorMessage": "Wrong Local UInts allocation"}, {"pc": [1515, 2156], "errorMessage": "account opted into asset"}, {"pc": [6813, 6828], "errorMessage": "check BoxMap entry exists"}, {"pc": [2053, 2091, 2132, 2170, 2461, 2639, 2698, 2724, 5388, 5554], "errorMessage": "check self.account entry exists"}, {"pc": [1596, 1828, 1916, 4583, 6218, 6541], "errorMessage": "check self.accrued_interest exists"}, {"pc": [5151, 6851], "errorMessage": "check self.arranger exists"}, {"pc": [6859], "errorMessage": "check self.asset_defaulted exists"}, {"pc": [6867], "errorMessage": "check self.asset_suspended exists"}, {"pc": [3098, 3544, 3934, 3946, 4287, 4531, 5942], "errorMessage": "check self.contract_type exists"}, {"pc": [1564, 4588, 5416, 5494], "errorMessage": "check self.cumulative_interest_index exists"}, {"pc": [1576, 4593, 5427, 5502], "errorMessage": "check self.cumulative_principal_index exists"}, {"pc": [5952], "errorMessage": "check self.dynamic_principal_redemption exists"}, {"pc": [1332, 1344, 1405, 1647, 2647, 2659, 3780, 4109, 4559, 4676, 4688, 4725, 5509, 6088, 6170, 6367, 6422, 6560], "errorMessage": "check self.event_cursor exists"}, {"pc": [5442, 5456, 5649, 5678, 6008, 6016, 6043, 6063, 6253, 6386, 6547], "errorMessage": "check self.fixed_point_scale exists"}, {"pc": [6296], "errorMessage": "check self.has_rate_reset_cap exists"}, {"pc": [6269], "errorMessage": "check self.has_rate_reset_floor exists"}, {"pc": [3175, 3560, 4555, 6187], "errorMessage": "check self.initial_exchange_amount exists"}, {"pc": [2445, 2455], "errorMessage": "check self.initial_exchange_date exists"}, {"pc": [1772, 4573, 5984, 5998], "errorMessage": "check self.interest_calculation_base exists"}, {"pc": [1844, 1859], "errorMessage": "check self.next_principal_redemption exists"}, {"pc": [4578, 5976, 6003, 6048], "errorMessage": "check self.nominal_interest_rate exists"}, {"pc": [2022, 2035], "errorMessage": "check self.op_daemon exists"}, {"pc": [1669, 1738, 1764, 1818, 1870, 1879, 1901, 4568, 6526, 6607], "errorMessage": "check self.outstanding_principal exists"}, {"pc": [6304, 6318], "errorMessage": "check self.rate_reset_cap exists"}, {"pc": [6277, 6291], "errorMessage": "check self.rate_reset_floor exists"}, {"pc": [6248], "errorMessage": "check self.rate_reset_multiplier exists"}, {"pc": [6641], "errorMessage": "check self.rate_reset_next exists"}, {"pc": [6261], "errorMessage": "check self.rate_reset_spread exists"}, {"pc": [1520, 2232, 4598], "errorMessage": "check self.reserved_interest exists"}, {"pc": [1525, 1554, 2242, 2257, 4603], "errorMessage": "check self.reserved_principal exists"}, {"pc": [2432, 2480, 4550, 5591, 6123], "errorMessage": "check self.reserved_units_total exists"}, {"pc": [1336, 2651, 3784, 3963, 3980, 4100, 4301, 4336, 4355, 4475, 4563, 4680, 5692, 6363, 6430], "errorMessage": "check self.schedule_entry_count exists"}, {"pc": [4008, 4383], "errorMessage": "check self.schedule_page entry exists"}, {"pc": [1512, 2122, 2150, 6713], "errorMessage": "check self.settlement_asset_id exists"}, {"pc": [1275, 1289, 2007, 2072, 2386, 2405, 2532, 2543, 2826, 3168, 3548, 3766, 3912, 4263, 4277, 4524, 4671, 5537, 6114, 6208], "errorMessage": "check self.status exists"}, {"pc": [2438, 2491, 4545, 5642, 5673, 6128], "errorMessage": "check self.total_units exists"}, {"pc": [2570, 2580], "errorMessage": "check self.transfer_closure_date exists"}, {"pc": [2553, 2561], "errorMessage": "check self.transfer_opening_date exists"}, {"pc": [3603, 3660], "errorMessage": "index access is out of bounds"}, {"pc": [1991, 3035, 3518, 4013, 4388], "errorMessage": "invalid array length header"}, {"pc": [2756, 3506, 4497, 5123], "errorMessage": "invalid number of bytes for arc4.bool"}, {"pc": [1999], "errorMessage": "invalid number of bytes for arc4.dynamic_array"}, {"pc": [3533], "errorMessage": "invalid number of bytes for arc4.dynamic_array"}, {"pc": [1985, 2370, 2510, 2518, 2748, 2806, 2814, 2894, 2902, 2945, 2970, 4744, 4768, 4802, 4983, 5165, 5249], "errorMessage": "invalid number of bytes for arc4.static_array"}, {"pc": [1270, 2328, 2337, 2378, 2527, 3496, 3897], "errorMessage": "invalid number of bytes for arc4.uint64"}, {"pc": [4792, 4973, 5239], "errorMessage": "invalid number of bytes for arc4.uint8"}, {"pc": [3007], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.InitialKernelState"}, {"pc": [2996], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.NormalizedActusTerms"}, {"pc": [4259], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.ObservedCashEventRequest"}, {"pc": [3908], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.ObservedEventRequest"}, {"pc": [3040], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.Prospectus"}, {"pc": [4813], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.RoleValidity"}, {"pc": [3024], "errorMessage": "invalid tail pointer at index 1 of (uint8[32],(len+utf8[]))"}, {"pc": [3019], "errorMessage": "invalid tuple encoding"}, {"pc": [4080, 4455], "errorMessage": "max array length exceeded"}, {"pc": [4537, 6705], "errorMessage": "overflow"}]}, "clear": {"pcOffsetMethod": "none", "sourceInfo": []}}, "templateVariables": {}}""" APP_SPEC = algokit_utils.Arc56Contract.from_json(_APP_SPEC_JSON) def _parse_abi_args(args: object | None = None) -> list[object] | None: @@ -332,6 +332,15 @@ class AppendObservedCashEventArgs: def abi_method_signature(self) -> str: return "append_observed_cash_event((uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64" +@dataclasses.dataclass(frozen=True, kw_only=True) +class ContractSetDefaultStatusArgs: + """Dataclass for contract_set_default_status arguments""" + defaulted: bool + + @property + def abi_method_signature(self) -> str: + return "contract_set_default_status(bool)uint64" + @dataclasses.dataclass(frozen=True, kw_only=True) class RbacRotateArrangerArgs: """Dataclass for rbac_rotate_arranger arguments""" @@ -615,6 +624,19 @@ def append_observed_cash_event( "args": method_args, })) + def contract_set_default_status( + self, + args: tuple[bool] | ContractSetDefaultStatusArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.AppCallMethodCallParams: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "contract_set_default_status(bool)uint64", + "args": method_args, + })) + def contract_get_state( self, params: algokit_utils.CommonAppCallParams | None = None @@ -969,6 +991,19 @@ def append_observed_cash_event( "args": method_args, })) + def contract_set_default_status( + self, + args: tuple[bool] | ContractSetDefaultStatusArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.BuiltTransactions: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "contract_set_default_status(bool)uint64", + "args": method_args, + })) + def contract_get_state( self, params: algokit_utils.CommonAppCallParams | None = None @@ -1368,6 +1403,22 @@ def append_observed_cash_event( parsed_response = response return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) + def contract_set_default_status( + self, + args: tuple[bool] | ContractSetDefaultStatusArgs, + params: algokit_utils.CommonAppCallParams | None = None, + send_params: algokit_utils.SendParams | None = None + ) -> algokit_utils.SendAppTransactionResult[int]: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "contract_set_default_status(bool)uint64", + "args": method_args, + }), send_params=send_params) + parsed_response = response + return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) + def contract_get_state( self, params: algokit_utils.CommonAppCallParams | None = None, @@ -1588,6 +1639,7 @@ class GlobalStateValue(typing.TypedDict): cumulative_principal_index: int event_cursor: int schedule_entry_count: int + defaulted: int fixed_point_scale: int class DasaState: @@ -1929,6 +1981,14 @@ def schedule_entry_count(self) -> int: return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore return typing.cast(int, value) + @property + def defaulted(self) -> int: + """Get the current value of the defaulted key in global_state state""" + value = self.app_client.state.global_state.get_value("defaulted") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore + return typing.cast(int, value) + @property def fixed_point_scale(self) -> int: """Get the current value of the fixed_point_scale key in global_state state""" @@ -2289,6 +2349,12 @@ def decode_return_value( return_value: algokit_utils.ABIReturn | None ) -> int | None: ... @typing.overload + def decode_return_value( + self, + method: typing.Literal["contract_set_default_status(bool)uint64"], + return_value: algokit_utils.ABIReturn | None + ) -> int | None: ... + @typing.overload def decode_return_value( self, method: typing.Literal["contract_get_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)"], @@ -2855,6 +2921,26 @@ def append_observed_cash_event( compilation_params=compilation_params ) + def contract_set_default_status( + self, + args: tuple[bool] | ContractSetDefaultStatusArgs, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.AppCreateMethodCallParams: + """Creates a new instance using the contract_set_default_status(bool)uint64 ABI method""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.create( + algokit_utils.AppFactoryCreateMethodCallParams( + **{ + **dataclasses.asdict(params), + "method": "contract_set_default_status(bool)uint64", + "args": _parse_abi_args(args), + } + ), + compilation_params=compilation_params + ) + def contract_get_state( self, *, @@ -3522,6 +3608,25 @@ def append_observed_cash_event( ) return self + def contract_set_default_status( + self, + args: tuple[bool] | ContractSetDefaultStatusArgs, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> "DasaComposer": + self._composer.add_app_call_method_call( + self.client.params.contract_set_default_status( + args=args, + params=params, + ) + ) + self._result_mappers.append( + lambda v: self.client.decode_return_value( + "contract_set_default_status(bool)uint64", v + ) + ) + return self + def contract_get_state( self, params: algokit_utils.CommonAppCallParams | None = None, From 1797eab2c1096968f50201c1bedbadd10e985ccc Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 16:01:56 +0100 Subject: [PATCH 169/244] docs: set default status --- docs/implementation/architecture.md | 16 ++++++------ docs/interfaces/contract/overview.md | 25 ++++++++++++++++++- docs/interfaces/types.md | 3 +++ docs/specs/contract/attributes.md | 7 +++--- .../contract/kernel-state-and-schedule.md | 13 ++++++++++ .../normalization-and-configuration.md | 6 +++++ docs/specs/rbac/rbac.md | 7 ++++++ docs/specs/rbac/roles.md | 9 ++++--- 8 files changed, 70 insertions(+), 16 deletions(-) diff --git a/docs/implementation/architecture.md b/docs/implementation/architecture.md index f97dffa9..26858036 100644 --- a/docs/implementation/architecture.md +++ b/docs/implementation/architecture.md @@ -33,7 +33,7 @@ This separation is intentional: - `RbacModule`: role assignment, suspension, and application-control methods. - `ActusKernelModule`: normalized-term validation, schedule storage, event cursor, -state transitions, and generic ACTUS getters. +state transitions, contract-performance default tracking, and generic ACTUS getters. - `AccountingModule`: holder positions, unit activation, checkpoints, and claim ledgers. @@ -44,13 +44,13 @@ ledgers. ## Public API by layer -| Layer | Public methods | -|:---------------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| RBAC | `contract_update`, `rbac_rotate_arranger`, `rbac_set_op_daemon`, `rbac_assign_role`, `rbac_revoke_role`, `rbac_contract_suspension`, `rbac_get_arranger`, `rbac_get_address_roles`, `rbac_get_role_validity` | -| Accounting | `account_suspension`, `account_open`, `account_update_payment_address`, `account_get_position` | -| ACTUS Kernel | `contract_create`, `contract_config`, `contract_schedule`, `contract_execute_ied`, `apply_non_cash_event`, `append_observed_cash_event`, `contract_get_state`, `contract_get_next_due_event` | -| Payment Agent | `fund_due_cashflows`, `claim_due_cashflows` | -| Transfer Agent | `transfer_set_schedule`, `primary_distribution`, `transfer` | +| Layer | Public methods | +|:---------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| RBAC | `contract_update`, `rbac_rotate_arranger`, `rbac_set_op_daemon`, `rbac_assign_role`, `rbac_revoke_role`, `rbac_contract_suspension`, `rbac_get_arranger`, `rbac_get_address_roles`, `rbac_get_role_validity` | +| Accounting | `account_suspension`, `account_open`, `account_update_payment_address`, `account_get_position` | +| ACTUS Kernel | `contract_create`, `contract_config`, `contract_schedule`, `contract_execute_ied`, `apply_non_cash_event`, `append_observed_cash_event`, `contract_set_default_status`, `contract_get_state`, `contract_get_next_due_event` | +| Payment Agent | `fund_due_cashflows`, `claim_due_cashflows` | +| Transfer Agent | `transfer_set_schedule`, `primary_distribution`, `transfer` | ## Execution flows diff --git a/docs/interfaces/contract/overview.md b/docs/interfaces/contract/overview.md index ac527136..6d48c926 100644 --- a/docs/interfaces/contract/overview.md +++ b/docs/interfaces/contract/overview.md @@ -1,7 +1,8 @@ # ACTUS Kernel Interface The ACTUS Kernel interface configures the normalized contract, stores the execution -schedule, and advances non-cash lifecycle events. +schedule, records the contract-performance default flag, and advances non-cash +lifecycle events. ## `contract_create` @@ -151,6 +152,25 @@ Only the Arranger may call this method. } ``` +## `contract_set_default_status` + +```json +{ + "name": "contract_set_default_status", + "readonly": false, + "args": [ + { "name": "defaulted", "type": "bool" } + ], + "returns": { "type": "uint64", "desc": "UNIX timestamp of the default-status update" }, + "errors": ["UNAUTHORIZED"] +} +``` + +Only an active Trustee may call this method. + +It sets or clears the contract-level `defaulted` performance flag. This flag is +distinct from the kernel lifecycle `status`. + ## `contract_get_state` ```json @@ -163,6 +183,9 @@ Only the Arranger may call this method. } ``` +`KernelState` does not include the separate `defaulted` performance flag. Clients +that need that value must read the dedicated global-state key. + ## `contract_get_next_due_event` ```json diff --git a/docs/interfaces/types.md b/docs/interfaces/types.md index 226d438f..7d798466 100644 --- a/docs/interfaces/types.md +++ b/docs/interfaces/types.md @@ -148,6 +148,9 @@ Readonly snapshot returned by `contract_get_state`. | `reserved_interest` | `uint64` | Reserved interest balance | | `reserved_principal` | `uint64` | Reserved principal balance | +The contract-level `defaulted` performance flag is stored separately in global +state and is not part of `KernelState`. + ## `AccountPosition` Accounting position returned by `account_get_position`. diff --git a/docs/specs/contract/attributes.md b/docs/specs/contract/attributes.md index 753f259e..0d6aa112 100644 --- a/docs/specs/contract/attributes.md +++ b/docs/specs/contract/attributes.md @@ -168,8 +168,9 @@ enumerated IDs: | `5` | Terminated | \\( [TE] \\) | Contract has been terminated | > [!NOTE] -> The current version of D-ASA reference implementation does not support contract -> performance and its attributes defined below. +> The current reference implementation supports manual default-performance tracking +> through a boolean `defaulted` flag. It does not yet model the full `PRF` lifecycle +> enum or automatic grace-period and delinquency transitions on chain. ### Grace Period @@ -202,7 +203,7 @@ The D-ASA **MAY** disable all non-administrative methods on *default* status. > The D-ASA default can be called either automatically (based on program conditions) > or manually (based on the decision of a trustee). -The *default* status **MAY** be set by the Trustee with the `set_default_status` +The *Trustee* **MAY** set the default status with the `contract_set_default_status` method. > [!TIP] diff --git a/docs/specs/contract/kernel-state-and-schedule.md b/docs/specs/contract/kernel-state-and-schedule.md index 48ec7b80..68a45aaf 100644 --- a/docs/specs/contract/kernel-state-and-schedule.md +++ b/docs/specs/contract/kernel-state-and-schedule.md @@ -121,6 +121,19 @@ stateDiagram-v2 state "ENDED (200)
Terminal state reached" as ENDED ``` +## Performance default flag + +Kernel lifecycle `status` and contract performance are distinct concepts. + +In addition to `status`, the reference implementation stores a boolean global-state +flag, `defaulted`, to record manual contract default performance. + +An active Trustee **MAY** update this flag by calling `contract_set_default_status` +with a boolean `defaulted` argument. + +`defaulted` is not part of `InitialKernelState` and is not returned by `contract_get_state`. +Clients that need it **MUST** read the dedicated global-state key. + ## Due-event execution The kernel advances the schedule through explicit ABI calls: diff --git a/docs/specs/contract/normalization-and-configuration.md b/docs/specs/contract/normalization-and-configuration.md index 9bba8db3..598b222b 100644 --- a/docs/specs/contract/normalization-and-configuration.md +++ b/docs/specs/contract/normalization-and-configuration.md @@ -88,3 +88,9 @@ preserve: `transfer_set_schedule` is separate from kernel configuration. Secondary-market dates are not part of the on-chain `NormalizedActusTerms` struct in the current ABI and, if enforced, **MUST** be configured separately at the execution layer. + +## Performance state + +The contract-level `defaulted` performance flag is not part of normalization or +`InitialKernelState`. If used, it is updated separately at execution time through +`contract_set_default_status`. diff --git a/docs/specs/rbac/rbac.md b/docs/specs/rbac/rbac.md index 593a3ccc..2631cb7e 100644 --- a/docs/specs/rbac/rbac.md +++ b/docs/specs/rbac/rbac.md @@ -62,6 +62,13 @@ When an account is suspended, the implementation **MUST** reject: - transfers from or to that account; - on-chain cashflow execution to that account while the suspension remains in force. +## Trustee-controlled default + +`contract_set_default_status` **MUST** be restricted to the Trustee role. + +In the current reference implementation, this method sets or clears the contract-level +`defaulted` performance flag. It does not change the kernel lifecycle `status`. + ## Observer-controlled events The Observer role **MUST** authorize due `RR` and `RRF` event application through diff --git a/docs/specs/rbac/roles.md b/docs/specs/rbac/roles.md index 4638733a..dc87add0 100644 --- a/docs/specs/rbac/roles.md +++ b/docs/specs/rbac/roles.md @@ -22,7 +22,7 @@ The current reference implementation uses the following role set: | `OPD` | `25` | Op Daemon | Optional automation address for payment execution workflows | | `MNG` | `40` | Account Manager | Opens holder accounts | | `PYD` | `50` | Primary Dealer | Allocates units during primary distribution | -| `TRS` | `60` | Trustee | Reserved for workout/default extensions; no dedicated ABI endpoint in v0.5 | +| `TRS` | `60` | Trustee | Sets or clears the contract default-performance flag | | `AUT` | `70` | Authority | Suspends the asset or individual accounts | | `MOC` | `80` | Observer | Applies rate-reset events that depend on observed data | @@ -94,9 +94,10 @@ before `IED`. The Trustee role **MUST** control the contract performance \\( [PRF] \\) (see [Performance](../contract/attributes.md#performance) section for further details). -The Trustee role is reserved by the ABI and state layout. The current reference -implementation exposes no trustee-only method, but the role identifier remains -part of the role model. +In the current reference implementation, an active Trustee can set or clear the +contract-level `defaulted` performance flag with `contract_set_default_status`. + +This performance flag is distinct from the kernel lifecycle `status`. ### Authority From ae7bd3d6765b716d64dbfc9ec70138aa53ac187d Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 16:02:03 +0100 Subject: [PATCH 170/244] chore: lint --- docs/specs/contract/actus-compliance-profile.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/specs/contract/actus-compliance-profile.md b/docs/specs/contract/actus-compliance-profile.md index d15b3f6e..2ea2e41b 100644 --- a/docs/specs/contract/actus-compliance-profile.md +++ b/docs/specs/contract/actus-compliance-profile.md @@ -27,14 +27,14 @@ that can be normalized and executed on the AVM. The current kernel supports the following ACTUS contract family identifiers: -| ID | Contract Type | Description | Rate | Use case | -|:---:|:-------------:|:---------------------------------------------------------------------------------------------------------------------------------------|:----------------------|:---------------------------------------------------------------| +| ID | Contract Type | Description | Rate | Use case | +|:---:|:-------------:|:---------------------------------------------------------------------------------------------------------------------------------------|:----------------------|:----------------------------------------------------------------| | `0` | `PAM` | Principal payment fully at \\( [IED] \\) and repaid at \\( [MD] \\). | Fix or variable rates | All kind of bonds, term deposits, bullet loans, mortgages, etc. | -| `1` | `ANN` | Principal payment fully at \\( [IED] \\) and repaid periodically in constants amounts till \\( [MD] \\). | Fix or variable rates | Classical level payment mortgages, leasing contracts, etc. | -| `2` | `NAM` | As `ANN`, when resetting rate total amount (principal + interest) stays constant. \\( [MD] \\) shifts. | Variable only | Adjustable rate mortgages | -| `3` | `LAM` | Principal payment fully at \\( [IED] \\) and repaid periodically in constants amounts till \\( [MD] \\), interest reduced accordingly. | Fix or variable | Amortizing loans | -| `4` | `LAX` | Flexible version of `LAM`. | Fix or variable | Teaser rate loans | -| `5` | `CLM` | Loans rolled over as long as they are not called. Once called, it has to be paid back after noticed period. | Fix or variable | Loans with call options | +| `1` | `ANN` | Principal payment fully at \\( [IED] \\) and repaid periodically in constants amounts till \\( [MD] \\). | Fix or variable rates | Classical level payment mortgages, leasing contracts, etc. | +| `2` | `NAM` | As `ANN`, when resetting rate total amount (principal + interest) stays constant. \\( [MD] \\) shifts. | Variable only | Adjustable rate mortgages | +| `3` | `LAM` | Principal payment fully at \\( [IED] \\) and repaid periodically in constants amounts till \\( [MD] \\), interest reduced accordingly. | Fix or variable | Amortizing loans | +| `4` | `LAX` | Flexible version of `LAM`. | Fix or variable | Teaser rate loans | +| `5` | `CLM` | Loans rolled over as long as they are not called. Once called, it has to be paid back after noticed period. | Fix or variable | Loans with call options | > Non-normative subtypes such as `PAM:ZCB` and `PAM:FCB` are resolved before normalization. > The AVM kernel stores only the normalized family identifier. From fa42dcd0b655e2178c830a0d79e20fd5d1d746a9 Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 16:12:52 +0100 Subject: [PATCH 171/244] chore: spare state schema --- smart_contracts/config.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/smart_contracts/config.py b/smart_contracts/config.py index 5a0369b6..e024ae5e 100644 --- a/smart_contracts/config.py +++ b/smart_contracts/config.py @@ -1,7 +1,7 @@ from typing import Final -# State Schema -GLOBAL_BYTES: Final[int] = 4 -GLOBAL_UINTS: Final[int] = 37 +# State Schema (actual + spare for updates) +GLOBAL_BYTES: Final[int] = 4 + 6 +GLOBAL_UINTS: Final[int] = 35 + 19 LOCAL_BYTES: Final[int] = 0 LOCAL_UINTS: Final[int] = 0 From ac32ddfc9bb7bcf7751cd132257c0cae2bf19970 Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 16:13:01 +0100 Subject: [PATCH 172/244] chore: build artifacts --- .../artifacts/d_asa/DASA.approval.puya.map | 12 ++++++------ smart_contracts/artifacts/d_asa/DASA.approval.teal | 4 ++-- src/artifacts/DASA.arc56.json | 8 ++++---- src/artifacts/dasa_client.py | 2 +- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/smart_contracts/artifacts/d_asa/DASA.approval.puya.map b/smart_contracts/artifacts/d_asa/DASA.approval.puya.map index d80b19a8..6b831bd3 100644 --- a/smart_contracts/artifacts/d_asa/DASA.approval.puya.map +++ b/smart_contracts/artifacts/d_asa/DASA.approval.puya.map @@ -844,14 +844,14 @@ ] }, "950": { - "op": "pushint 4", + "op": "pushint 10", "defined_out": [ - "4", + "10", "tmp%0#2" ], "stack_out": [ "tmp%0#2", - "4" + "10" ] }, "952": { @@ -878,14 +878,14 @@ ] }, "956": { - "op": "pushint 38", + "op": "pushint 54", "defined_out": [ - "38", + "54", "tmp%2#1" ], "stack_out": [ "tmp%2#1", - "38" + "54" ] }, "958": { diff --git a/smart_contracts/artifacts/d_asa/DASA.approval.teal b/smart_contracts/artifacts/d_asa/DASA.approval.teal index 362b1d6f..c9c114c3 100644 --- a/smart_contracts/artifacts/d_asa/DASA.approval.teal +++ b/smart_contracts/artifacts/d_asa/DASA.approval.teal @@ -220,13 +220,13 @@ main: // smart_contracts/d_asa/contract.py:23 // assert Txn.global_num_byte_slice == cfg.GLOBAL_BYTES, err.WRONG_GLOBAL_BYTES txn GlobalNumByteSlice - pushint 4 + pushint 10 == assert // Wrong Global Bytes allocation // smart_contracts/d_asa/contract.py:24 // assert Txn.global_num_uint == cfg.GLOBAL_UINTS, err.WRONG_GLOBAL_UINTS txn GlobalNumUint - pushint 38 + pushint 54 == assert // Wrong Global UInts allocation // smart_contracts/d_asa/contract.py:25 diff --git a/src/artifacts/DASA.arc56.json b/src/artifacts/DASA.arc56.json index 4e4c4c13..adbca205 100644 --- a/src/artifacts/DASA.arc56.json +++ b/src/artifacts/DASA.arc56.json @@ -1262,8 +1262,8 @@ "state": { "schema": { "global": { - "ints": 38, - "bytes": 4 + "ints": 54, + "bytes": 10 }, "local": { "ints": 0, @@ -2347,11 +2347,11 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCAzMiAxNTAwCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUgInN0YXR1cyIgImV2ZW50X2N1cnNvciIgInNjaGVkdWxlX2VudHJ5X2NvdW50IiAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIiAiZml4ZWRfcG9pbnRfc2NhbGUiICJhY2NydWVkX2ludGVyZXN0IiAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIgMHg0MTIzICJub21pbmFsX2ludGVyZXN0X3JhdGUiICJjb250cmFjdF90eXBlIiAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiICJyZXNlcnZlZF9wcmluY2lwYWwiICJ0b3RhbF91bml0cyIgIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iICJyZXNlcnZlZF9pbnRlcmVzdCIgImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIgMHg1MjNhNDE1MjUyMjMgInNldHRsZW1lbnRfYXNzZXRfaWQiICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIgMHg1MjNhNDE1NTU0MjMgMHg1MjNhNTA1OTQ0MjMgMHg1MjNhNGQ0ZTQ3MjMgMHg1MzIzIDB4NTIzYTRkNGY0MzIzIDB4NTIzYTU0NTI1MzIzIDB4NTIzYTRmNTA0NDIzICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiICJ0cmFuc2Zlcl9vcGVuaW5nX2RhdGUiICJ0cmFuc2Zlcl9jbG9zdXJlX2RhdGUiICJyYXRlX3Jlc2V0X2Zsb29yIiAicmF0ZV9yZXNldF9jYXAiICJhc3NldF9zdXNwZW5kZWQiICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIiAicmF0ZV9yZXNldF9zcHJlYWQiICJyYXRlX3Jlc2V0X211bHRpcGxpZXIiICJyYXRlX3Jlc2V0X25leHQiICJoYXNfcmF0ZV9yZXNldF9mbG9vciIgImhhc19yYXRlX3Jlc2V0X2NhcCIgMHgwMCAiYXNzZXRfZGVmYXVsdGVkIiAicHJvc3BlY3R1c19oYXNoIiAicHJvc3BlY3R1c191cmwiICJkZW5vbWluYXRpb25fYXNzZXRfaWQiICJtYXR1cml0eV9kYXRlIiAiZGF5X2NvdW50X2NvbnZlbnRpb24iICJkZWZhdWx0ZWQiIDB4MDY4MTAxIDB4MDAwMAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4LTI5CiAgICAvLyAjIFJCQUMgUm9sZXMKICAgIC8vIHNlbGYuYXJyYW5nZXIgPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX0FSUkFOR0VSKQogICAgYnl0ZWMgMTggLy8gMHg1MjNhNDE1MjUyMjMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMAogICAgLy8gc2VsZi5vcF9kYWVtb24gPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX09QX0RBRU1PTikKICAgIGJ5dGVjIDI3IC8vIDB4NTIzYTRmNTA0NDIzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NDctNDgKICAgIC8vICMgRC1BU0EgR292ZXJuYW5jZQogICAgLy8gc2VsZi5hc3NldF9zdXNwZW5kZWQgPSBGYWxzZQogICAgYnl0ZWMgMzMgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjQ5CiAgICAvLyBzZWxmLmFzc2V0X2RlZmF1bHRlZCA9IEZhbHNlCiAgICBieXRlYyA0MSAvLyAiYXNzZXRfZGVmYXVsdGVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1Ni01NwogICAgLy8gIyBDb250cmFjdAogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKQogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OAogICAgLy8gc2VsZi5jb250cmFjdF90eXBlID0gVUludDY0KCkKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MC02MQogICAgLy8gIyBQcm9zcGVjdHVzIChJbmZvcm1hdGlvbmFsKQogICAgLy8gc2VsZi5wcm9zcGVjdHVzX2hhc2ggPSBCeXRlcygpCiAgICBieXRlYyA0MiAvLyAicHJvc3BlY3R1c19oYXNoIgogICAgcHVzaGJ5dGVzIDB4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjIKICAgIC8vIHNlbGYucHJvc3BlY3R1c191cmwgPSBTdHJpbmcoKQogICAgYnl0ZWMgNDMgLy8gInByb3NwZWN0dXNfdXJsIgogICAgcHVzaGJ5dGVzICIiCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjQtNjUKICAgIC8vICMgRGVub21pbmF0aW9uCiAgICAvLyBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCA9IEFzc2V0KCkKICAgIGJ5dGVjIDQ0IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBBc3NldCgpCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjgtNjkKICAgIC8vICMgVGltZQogICAgLy8gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGUgPSB0eXAuVGltZVN0YW1wKCkKICAgIGJ5dGVjIDI4IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcwCiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSB0eXAuVGltZVN0YW1wKCkKICAgIGJ5dGVjIDQ1IC8vICJtYXR1cml0eV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MQogICAgLy8gc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgPSB0eXAuVGltZVN0YW1wKCkKICAgIGJ5dGVjIDI5IC8vICJ0cmFuc2Zlcl9vcGVuaW5nX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcyCiAgICAvLyBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgMzAgLy8gInRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzQtNzUKICAgIC8vICMgRGF5IENvdW50IENvbnZlbnRpb24KICAgIC8vIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPSBVSW50NjQoKQogICAgYnl0ZWMgNDYgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3Ny03OAogICAgLy8gIyBVbml0cwogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IFVJbnQ2NCgpCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc5CiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID0gVUludDY0KCkKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODEtODIKICAgIC8vICMgUHJpbmNpcGFsCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID0gVUludDY0KCkKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODMKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gVUludDY0KCkKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODUKICAgIC8vIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiA9IEZhbHNlCiAgICBieXRlYyAzNCAvLyAiZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODctODgKICAgIC8vICMgSW50ZXJlc3QKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OQogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ID0gVUludDY0KCkKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkxLTkyCiAgICAvLyAjIEludGVyZXN0IFJhdGVzCiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzCiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkID0gVUludDY0KCkKICAgIGJ5dGVjIDM1IC8vICJyYXRlX3Jlc2V0X3NwcmVhZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9tdWx0aXBsaWVyID0gVUludDY0KCkKICAgIGJ5dGVjIDM2IC8vICJyYXRlX3Jlc2V0X211bHRpcGxpZXIiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfZmxvb3IgPSBVSW50NjQoKQogICAgYnl0ZWMgMzEgLy8gInJhdGVfcmVzZXRfZmxvb3IiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfY2FwID0gVUludDY0KCkKICAgIGJ5dGVjIDMyIC8vICJyYXRlX3Jlc2V0X2NhcCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTcKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9uZXh0ID0gVUludDY0KCkKICAgIGJ5dGVjIDM3IC8vICJyYXRlX3Jlc2V0X25leHQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4CiAgICAvLyBzZWxmLmhhc19yYXRlX3Jlc2V0X2Zsb29yID0gRmFsc2UKICAgIGJ5dGVjIDM4IC8vICJoYXNfcmF0ZV9yZXNldF9mbG9vciIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTkKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwID0gRmFsc2UKICAgIGJ5dGVjIDM5IC8vICJoYXNfcmF0ZV9yZXNldF9jYXAiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMS0xMDIKICAgIC8vICMgUHJpbWFyeSBEaXN0cmlidXRpb24KICAgIC8vIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsID0gVUludDY0KCkKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMwogICAgLy8gc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNS0xMDYKICAgIC8vICMgQ3VtdWxhdGl2ZSBQZXItVW5pdCBGaXhlZC1Qb2ludCBJbmRleGVzCiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggPSBVSW50NjQoKQogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNwogICAgLy8gc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNQogICAgLy8gc2VsZi5ldmVudF9jdXJzb3IgPSBVSW50NjQoKQogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTYKICAgIC8vIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgPSBVSW50NjQoKQogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExOC0xMTkKICAgIC8vICMgUGVyZm9ybWFuY2UKICAgIC8vIHNlbGYuZGVmYXVsdGVkID0gRmFsc2UKICAgIGJ5dGVjIDQ3IC8vICJkZWZhdWx0ZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMS0xMjIKICAgIC8vICMgU2NhbGluZwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjIzCiAgICAvLyBhc3NlcnQgVHhuLmdsb2JhbF9udW1fYnl0ZV9zbGljZSA9PSBjZmcuR0xPQkFMX0JZVEVTLCBlcnIuV1JPTkdfR0xPQkFMX0JZVEVTCiAgICB0eG4gR2xvYmFsTnVtQnl0ZVNsaWNlCiAgICBwdXNoaW50IDQKICAgID09CiAgICBhc3NlcnQgLy8gV3JvbmcgR2xvYmFsIEJ5dGVzIGFsbG9jYXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kX2FzYS9jb250cmFjdC5weToyNAogICAgLy8gYXNzZXJ0IFR4bi5nbG9iYWxfbnVtX3VpbnQgPT0gY2ZnLkdMT0JBTF9VSU5UUywgZXJyLldST05HX0dMT0JBTF9VSU5UUwogICAgdHhuIEdsb2JhbE51bVVpbnQKICAgIHB1c2hpbnQgMzgKICAgID09CiAgICBhc3NlcnQgLy8gV3JvbmcgR2xvYmFsIFVJbnRzIGFsbG9jYXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kX2FzYS9jb250cmFjdC5weToyNQogICAgLy8gYXNzZXJ0IFR4bi5sb2NhbF9udW1fYnl0ZV9zbGljZSA9PSBjZmcuTE9DQUxfQllURVMsIGVyci5XUk9OR19MT0NBTF9CWVRFUwogICAgdHhuIExvY2FsTnVtQnl0ZVNsaWNlCiAgICAhCiAgICBhc3NlcnQgLy8gV3JvbmcgTG9jYWwgQnl0ZXMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBhc3NlcnQgVHhuLmxvY2FsX251bV91aW50ID09IGNmZy5MT0NBTF9VSU5UUywgZXJyLldST05HX0xPQ0FMX1VJTlRTCiAgICB0eG4gTG9jYWxOdW1VaW50CiAgICAhCiAgICBhc3NlcnQgLy8gV3JvbmcgTG9jYWwgVUludHMgYWxsb2NhdGlvbgoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6OC0xOAogICAgLy8gY2xhc3MgREFTQSgKICAgIC8vICAgICBQYXltZW50QWdlbnQsCiAgICAvLyAgICAgVHJhbnNmZXJBZ2VudCwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBhdm1fdmVyc2lvbj0xMiwKICAgIC8vICk6CiAgICBwdXNoYnl0ZXMgMHg5MTRmMDRlYiAvLyBtZXRob2QgImNvbnRyYWN0X3VwZGF0ZSgpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fY29udHJhY3RfdXBkYXRlX3JvdXRlQDQKCm1haW5fc3dpdGNoX2Nhc2VfbmV4dEA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjgtMTgKICAgIC8vIGNsYXNzIERBU0EoCiAgICAvLyAgICAgUGF5bWVudEFnZW50LAogICAgLy8gICAgIFRyYW5zZmVyQWdlbnQsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyAgICAgYXZtX3ZlcnNpb249MTIsCiAgICAvLyApOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYnogbWFpbl9jcmVhdGVfTm9PcEAzMwogICAgcHVzaGJ5dGVzcyAweGI0NDYxOGM4IDB4ZTc4MzI1MjkgMHg5NDM4ODcyMyAweDZjODVlM2VlIDB4YmRkMWE5NDQgMHg3YzBmMTgxMiAweDE0ZmMxMGVmIDB4NzRhNzI5N2YgMHgwOWQ0ZmUxNCAweDlhOWJmYTg1IDB4ODVlZWQzM2QgMHhhYjJjMGZjNCAweGQ5ZjIyNWFjIDB4OTg4MzUwNWEgMHhmYjRkNDQyOCAweDhlYTZlNzRjIDB4MDJhZjU1N2EgMHg4MmY3MWIyZCAweGVmMDRmNWQzIDB4ZGYzNDM1NTAgMHgzZGJlODBiZCAweDFlM2U0OGU3IDB4MDEwYzgyOTkgMHg3NDA2YWNkMiAweDFhNzJhMmVlIC8vIG1ldGhvZCAiZnVuZF9kdWVfY2FzaGZsb3dzKHVpbnQ2NCkodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImNsYWltX2R1ZV9jYXNoZmxvd3MoYWRkcmVzcyxieXRlW10pKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxieXRlW10pIiwgbWV0aG9kICJ0cmFuc2Zlcl9zZXRfc2NoZWR1bGUodWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInByaW1hcnlfZGlzdHJpYnV0aW9uKGFkZHJlc3MsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidHJhbnNmZXIoYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgImFjY291bnRfc3VzcGVuc2lvbihhZGRyZXNzLGJvb2wpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X29wZW4oYWRkcmVzcyxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAiYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzKGFkZHJlc3MsYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgImFjY291bnRfZ2V0X3Bvc2l0aW9uKGFkZHJlc3MpKGFkZHJlc3MsdWludDY0LHVpbnQ2NCxib29sLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJjb250cmFjdF9jb25maWcoKHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LGJvb2wsYm9vbCxib29sLHVpbnQ2NCksKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSwoYnl0ZVszMl0sc3RyaW5nKSl1aW50NjQiLCBtZXRob2QgImNvbnRyYWN0X3NjaGVkdWxlKHVpbnQ2NCxib29sLCh1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KVtdKXVpbnQ2NCIsIG1ldGhvZCAiY29udHJhY3RfZXhlY3V0ZV9pZWQoKXVpbnQ2NCIsIG1ldGhvZCAiYXBwbHlfbm9uX2Nhc2hfZXZlbnQodWludDY0LCh1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkpdWludDY0IiwgbWV0aG9kICJhcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudCgodWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkpdWludDY0IiwgbWV0aG9kICJjb250cmFjdF9zZXRfZGVmYXVsdF9zdGF0dXMoYm9vbCl1aW50NjQiLCBtZXRob2QgImNvbnRyYWN0X2dldF9zdGF0ZSgpKHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJjb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnQoKSh1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAicmJhY19yb3RhdGVfYXJyYW5nZXIoYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgInJiYWNfc2V0X29wX2RhZW1vbihhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19hc3NpZ25fcm9sZSh1aW50OCxhZGRyZXNzLCh1aW50NjQsdWludDY0KSl1aW50NjQiLCBtZXRob2QgInJiYWNfcmV2b2tlX3JvbGUodWludDgsYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgInJiYWNfY29udHJhY3Rfc3VzcGVuc2lvbihib29sKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19nZXRfYXJyYW5nZXIoKWFkZHJlc3MiLCBtZXRob2QgInJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXMoYWRkcmVzcykoYm9vbCxib29sLGJvb2wsYm9vbCxib29sKSIsIG1ldGhvZCAicmJhY19nZXRfcm9sZV92YWxpZGl0eSh1aW50OCxhZGRyZXNzKSh1aW50NjQsdWludDY0KSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIGZ1bmRfZHVlX2Nhc2hmbG93cyBjbGFpbV9kdWVfY2FzaGZsb3dzIHRyYW5zZmVyX3NldF9zY2hlZHVsZSBwcmltYXJ5X2Rpc3RyaWJ1dGlvbiB0cmFuc2ZlciBhY2NvdW50X3N1c3BlbnNpb24gYWNjb3VudF9vcGVuIGFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzcyBhY2NvdW50X2dldF9wb3NpdGlvbiBjb250cmFjdF9jb25maWcgY29udHJhY3Rfc2NoZWR1bGUgY29udHJhY3RfZXhlY3V0ZV9pZWQgYXBwbHlfbm9uX2Nhc2hfZXZlbnQgYXBwZW5kX29ic2VydmVkX2Nhc2hfZXZlbnQgY29udHJhY3Rfc2V0X2RlZmF1bHRfc3RhdHVzIGNvbnRyYWN0X2dldF9zdGF0ZSBjb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnQgcmJhY19yb3RhdGVfYXJyYW5nZXIgcmJhY19zZXRfb3BfZGFlbW9uIHJiYWNfYXNzaWduX3JvbGUgcmJhY19yZXZva2Vfcm9sZSByYmFjX2NvbnRyYWN0X3N1c3BlbnNpb24gcmJhY19nZXRfYXJyYW5nZXIgcmJhY19nZXRfYWRkcmVzc19yb2xlcyByYmFjX2dldF9yb2xlX3ZhbGlkaXR5CiAgICBlcnIKCm1haW5fY3JlYXRlX05vT3BAMzM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6OC0xOAogICAgLy8gY2xhc3MgREFTQSgKICAgIC8vICAgICBQYXltZW50QWdlbnQsCiAgICAvLyAgICAgVHJhbnNmZXJBZ2VudCwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBhdm1fdmVyc2lvbj0xMiwKICAgIC8vICk6CiAgICBwdXNoYnl0ZXMgMHg5NTZkNzE1NiAvLyBtZXRob2QgImNvbnRyYWN0X2NyZWF0ZShhZGRyZXNzKXVpbnQ2NCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIGNvbnRyYWN0X2NyZWF0ZQogICAgZXJyCgptYWluX2NvbnRyYWN0X3VwZGF0ZV9yb3V0ZUA0OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgcHVzaGludCA0IC8vIFVwZGF0ZUFwcGxpY2F0aW9uCiAgICA9PQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICYmCiAgICBhc3NlcnQKICAgIGIgY29udHJhY3RfdXBkYXRlCgoKLy8gX3B1eWFfbGliLnV0aWwuZW5zdXJlX2J1ZGdldChyZXF1aXJlZF9idWRnZXQ6IHVpbnQ2NCwgZmVlX3NvdXJjZTogdWludDY0KSAtPiB2b2lkOgplbnN1cmVfYnVkZ2V0OgogICAgcHJvdG8gMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMTAKICAgICsKCmVuc3VyZV9idWRnZXRfd2hpbGVfdG9wQDE6CiAgICBmcmFtZV9kaWcgMAogICAgZ2xvYmFsIE9wY29kZUJ1ZGdldAogICAgPgogICAgYnogZW5zdXJlX2J1ZGdldF9hZnRlcl93aGlsZUA2CiAgICBpdHhuX2JlZ2luCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgYnl0ZWMgNDggLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtCiAgICBieXRlYyA0OCAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbQogICAgZnJhbWVfZGlnIC0xCiAgICBzd2l0Y2ggZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8wQDMgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8xQDQKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfbmV4dEA1OgogICAgaXR4bl9zdWJtaXQKICAgIGIgZW5zdXJlX2J1ZGdldF93aGlsZV90b3BAMQoKZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8xQDQ6CiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgYiBlbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX25leHRANQoKZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8wQDM6CiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGIgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV9uZXh0QDUKCmVuc3VyZV9idWRnZXRfYWZ0ZXJfd2hpbGVANjoKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucGF5bWVudF9hZ2VudC5QYXltZW50QWdlbnQuZnVuZF9kdWVfY2FzaGZsb3dzW3JvdXRpbmddKCkgLT4gdm9pZDoKZnVuZF9kdWVfY2FzaGZsb3dzOgogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAxMwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NgogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjgKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjY5CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjcwCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM4CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE1MAogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3MgogICAgLy8gaWYgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCk6CiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3Ni03NwogICAgLy8gKyBtYXhfZXZlbnRfY291bnQKICAgIC8vICogVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfUEVSX0VWRU5UX0JVREdFVCkKICAgIGR1cAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojc3CiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfRlVORF9EVUVfQ0FTSEZMT1dTX1BFUl9FVkVOVF9CVURHRVQpCiAgICBwdXNoaW50IDEwMAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojc2LTc3CiAgICAvLyArIG1heF9ldmVudF9jb3VudAogICAgLy8gKiBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19QRVJfRVZFTlRfQlVER0VUKQogICAgKgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojc1CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19CQVNFX0JVREdFVCkKICAgIGludGMgNCAvLyAxNTAwCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzUtNzcKICAgIC8vIFVJbnQ2NChjc3QuT1BfVVBfRlVORF9EVUVfQ0FTSEZMT1dTX0JBU0VfQlVER0VUKQogICAgLy8gKyBtYXhfZXZlbnRfY291bnQKICAgIC8vICogVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfUEVSX0VWRU5UX0JVREdFVCkKICAgICsKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3My03OQogICAgLy8gZW5zdXJlX2J1ZGdldCgKICAgIC8vICAgICByZXF1aXJlZF9idWRnZXQ9KAogICAgLy8gICAgICAgICBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19CQVNFX0JVREdFVCkKICAgIC8vICAgICAgICAgKyBtYXhfZXZlbnRfY291bnQKICAgIC8vICAgICAgICAgKiBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19QRVJfRVZFTlRfQlVER0VUKQogICAgLy8gICAgICksCiAgICAvLyApCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjgxCiAgICAvLyBwcm9jZXNzZWRfZXZlbnRzID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA1CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODIKICAgIC8vIGZ1bmRlZF9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4MwogICAgLy8gZnVuZGVkX3ByaW5jaXBhbCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTMKCmZ1bmRfZHVlX2Nhc2hmbG93c193aGlsZV90b3BANDoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4NgogICAgLy8gcHJvY2Vzc2VkX2V2ZW50cyA8IG1heF9ldmVudF9jb3VudAogICAgZGlnIDQKICAgIGRpZyAxCiAgICA8CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODYtODcKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgPCBtYXhfZXZlbnRfY291bnQKICAgIC8vIGFuZCBzZWxmLmV2ZW50X2N1cnNvciA8IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQKICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl93aGlsZUAxMQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojg3CiAgICAvLyBhbmQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIDwKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4Ni04NwogICAgLy8gcHJvY2Vzc2VkX2V2ZW50cyA8IG1heF9ldmVudF9jb3VudAogICAgLy8gYW5kIHNlbGYuZXZlbnRfY3Vyc29yIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudAogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDExCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODkKICAgIC8vIGVudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KHNlbGYuZXZlbnRfY3Vyc29yKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIGR1cAogICAgYnVyeSAxNwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjkwCiAgICAvLyBpZiBlbnRyeS5zY2hlZHVsZWRfdGltZSA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wOgogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDMKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgID4KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAMTEKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5MgogICAgLy8gaWYgbm90IHNlbGYuX2V2ZW50X2lzX2Nhc2goZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSk6CiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ1cnkgMTYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM1NAogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUCksCiAgICBpbnRjXzIgLy8gOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzUzLTM1NwogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfTUQpLAogICAgLy8gKQogICAgPT0KICAgIGR1cAogICAgYnVyeSA0CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfdHJ1ZUA1MgogICAgZGlnIDE0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNTUKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNTMtMzU3CiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9NRCksCiAgICAvLyApCiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX3RydWVANTIKICAgIGRpZyAxNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzU2CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX01EKSwKICAgIHB1c2hpbnQgMTkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM1My0zNTcKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX01EKSwKICAgIC8vICkKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUA1MwoKZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfdHJ1ZUA1MjoKICAgIGludGNfMSAvLyAxCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUA1NDoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5MgogICAgLy8gaWYgbm90IHNlbGYuX2V2ZW50X2lzX2Nhc2goZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSk6CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAMTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MQogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X2lkID09IHNlbGYuZXZlbnRfY3Vyc29yLCBlcnIuSU5WQUxJRF9FVkVOVF9DVVJTT1IKICAgIGRpZyAxNQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBjdXJzb3IKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MgogICAgLy8gYXNzZXJ0IGVudHJ5LnNjaGVkdWxlZF90aW1lIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLCBlcnIuTk9fRFVFX0NBU0hGTE9XCiAgICBkaWcgMQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPD0KICAgIGFzc2VydCAvLyBObyBkdWUgY2FzaGZsb3cgdG8gcGF5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MTYKICAgIC8vIGlmIGV2ZW50X3R5cGUgbm90IGluIChVSW50NjQoZW51bXMuRVZUX0lQKSwgVUludDY0KGVudW1zLkVWVF9NRCkpOgogICAgZGlnIDIKICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNQogICAgZGlnIDE0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MTcKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDExCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfaW50ZXJlc3RfYW1vdW50QDE2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDI5CiAgICAvLyBldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBidXJ5IDE2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzAKICAgIC8vIGlmIGV2ZW50X3R5cGUgbm90IGluIChVSW50NjQoZW51bXMuRVZUX1BSKSwgVUludDY0KGVudW1zLkVWVF9NRCkpOgogICAgcHVzaGludCAzCiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE5CiAgICBkaWcgMTQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzMQogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNgoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnRAMjg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTYKICAgIC8vIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGRpZyAxNQogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTU5CiAgICAvLyBpZiBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKToKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDI5CiAgICBkaWcgNwogICAgYnVyeSA5CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzODoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU3NS01NzcKICAgIC8vICMgRnVuZGluZyB1c2VzIHBlci11bml0IGN1bXVsYXRpdmUgaW5kaWNlcyBzbyBlYWNoIGhvbGRlciBjYW4gc2V0dGxlCiAgICAvLyAjIGluZGVwZW5kZW50bHkgZnJvbSBpdHMgY3VycmVudCB1bml0IGJhbGFuY2UuCiAgICAvLyBpbnRlcmVzdF9pbmRleF9kZWx0YSA9IHNlbGYuX2Ftb3VudF90b19pbmRleF9kZWx0YShpbnRlcmVzdF9hbW91bnRfZHVlKQogICAgZGlnIDEwCiAgICBjYWxsc3ViIF9hbW91bnRfdG9faW5kZXhfZGVsdGEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU3OAogICAgLy8gcHJpbmNpcGFsX2luZGV4X2RlbHRhID0gc2VsZi5fYW1vdW50X3RvX2luZGV4X2RlbHRhKHByaW5jaXBhbF9hbW91bnRfZHVlKQogICAgZGlnIDYKICAgIGNhbGxzdWIgX2Ftb3VudF90b19pbmRleF9kZWx0YQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTc5CiAgICAvLyBpbnRlcmVzdF9hbW91bnQgPSBzZWxmLl9pbmRleF9kZWx0YV90b19hbW91bnQoaW50ZXJlc3RfaW5kZXhfZGVsdGEpCiAgICBkaWcgMQogICAgY2FsbHN1YiBfaW5kZXhfZGVsdGFfdG9fYW1vdW50CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgMTUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4MAogICAgLy8gcHJpbmNpcGFsX2Ftb3VudCA9IHNlbGYuX2luZGV4X2RlbHRhX3RvX2Ftb3VudChwcmluY2lwYWxfaW5kZXhfZGVsdGEpCiAgICBkdXAKICAgIGNhbGxzdWIgX2luZGV4X2RlbHRhX3RvX2Ftb3VudAogICAgZHVwCiAgICBidXJ5IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1ODEKICAgIC8vIHJlcXVpcmVkX2Ftb3VudCA9IGludGVyZXN0X2Ftb3VudCArIHByaW5jaXBhbF9hbW91bnQKICAgIGRpZyAyCiAgICBkaWcgMQogICAgKwogICAgZHVwCiAgICBidXJ5IDkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjczNwogICAgLy8gYmFsYW5jZSA9IHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ1OQogICAgLy8gcmV0dXJuIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgKyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIGRpZyAxCiAgICArCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MzkKICAgIC8vIGFzc2VydCBiYWxhbmNlID49IHJlc2VydmVkX3RvdGFsLCBlcnIuTk9UX0VOT1VHSF9GVU5EUwogICAgZGlnIDIKICAgIGRpZyAxCiAgICA+PQogICAgYXNzZXJ0IC8vIE5vdCBlbm91Z2ggZnVuZHMgZm9yIHRoZSBwYXltZW50CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDAKICAgIC8vIHJldHVybiBiYWxhbmNlIC0gcmVzZXJ2ZWRfdG90YWwKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTgzCiAgICAvLyBzZWxmLl9hdmFpbGFibGVfc2V0dGxlbWVudF9mdW5kcygpID49IHJlcXVpcmVkX2Ftb3VudAogICAgdW5jb3ZlciAyCiAgICA+PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTgyLTU4NAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLl9hdmFpbGFibGVfc2V0dGxlbWVudF9mdW5kcygpID49IHJlcXVpcmVkX2Ftb3VudAogICAgLy8gKSwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTg2CiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0ICs9IGludGVyZXN0X2Ftb3VudAogICAgdW5jb3ZlciAzCiAgICArCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTg3CiAgICAvLyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCArPSBwcmluY2lwYWxfYW1vdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICArCiAgICBieXRlYyAxMiAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4OAogICAgLy8gc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4ICs9IGludGVyZXN0X2luZGV4X2RlbHRhCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCBleGlzdHMKICAgIHVuY292ZXIgMgogICAgKwogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTg5CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4ICs9IHByaW5jaXBhbF9pbmRleF9kZWx0YQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCBleGlzdHMKICAgICsKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTAKICAgIC8vIGlmIGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkgPT0gVUludDY0KGVudW1zLkVWVF9QUik6CiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBwdXNoaW50IDMKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDQwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTEtNTkyCiAgICAvLyAjIEZvciBQUiwgdGhlIHBlcmlvZCBpbnRlcmVzdCBzdGF5cyBhY2NydWVkIHVudGlsIGEgbGF0ZXIgSVAgb3IgTUQuCiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgKz0gc2VsZi5fZW50cnlfaW50ZXJlc3Rfc2VnbWVudChlbnRyeSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBkaWcgMTYKICAgIGNhbGxzdWIgX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQKICAgIGJ1cnkgMTgKICAgICsKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTUKICAgIC8vIGlmIG5vdCBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKSBvciBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NCgKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlANDMKICAgIGRpZyAxNQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5NS01OTcKICAgIC8vIGlmIG5vdCBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKSBvciBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NCgKICAgIC8vICAgICBlbnVtcy5FVlRfTUQKICAgIC8vICk6CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDQKCmZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDQzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTk4CiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBkaWcgMTUKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0NDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5OQogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgZGlnIDgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MDAKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IG5leHRfaW50ZXJlc3RfYmFzZQogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGRpZyA5CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAxCiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MDMKICAgIC8vIGlmIGVudHJ5LmV2ZW50X3R5cGUgPT0gYXJjNC5VSW50OCgKICAgIGRpZyAxNQogICAgZXh0cmFjdCA4IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwMy02MDUKICAgIC8vIGlmIGVudHJ5LmV2ZW50X3R5cGUgPT0gYXJjNC5VSW50OCgKICAgIC8vICAgICBlbnVtcy5FVlRfTUQKICAgIC8vICkgYW5kIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID09IFVJbnQ2NCgwKToKICAgIHB1c2hieXRlcyAweDEzCiAgICBiPT0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQ3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MDUKICAgIC8vICkgYW5kIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID09IFVJbnQ2NCgwKToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAzLTYwNQogICAgLy8gaWYgZW50cnkuZXZlbnRfdHlwZSA9PSBhcmM0LlVJbnQ4KAogICAgLy8gICAgIGVudW1zLkVWVF9NRAogICAgLy8gKSBhbmQgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPT0gVUludDY0KDApOgogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQ3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MDYKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGVudW1zLlNUQVRVU19FTkRFRCkKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgMjAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjA3CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQ3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjA5LTYxMwogICAgLy8gc2VsZi5fZW1pdF9leGVjdXRpb25fZXZlbnQoCiAgICAvLyAgICAgZW50cnk9ZW50cnksCiAgICAvLyAgICAgcGF5b2ZmPWludGVyZXN0X2Ftb3VudCArIHByaW5jaXBhbF9hbW91bnQsCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9aW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudCwKICAgIC8vICkKICAgIGRpZyAxNQogICAgZGlnIDQKICAgIGR1cAogICAgY2FsbHN1YiBfZW1pdF9leGVjdXRpb25fZXZlbnQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojk2CiAgICAvLyBmdW5kZWRfaW50ZXJlc3QgKz0gaW50ZXJlc3RfYW1vdW50CiAgICBkaWcgMTMKICAgIGRpZyAxMgogICAgKwogICAgYnVyeSAxNAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojk3CiAgICAvLyBmdW5kZWRfcHJpbmNpcGFsICs9IHByaW5jaXBhbF9hbW91bnQKICAgIGRpZyAxMgogICAgZGlnIDcKICAgICsKICAgIGJ1cnkgMTMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5OAogICAgLy8gcHJvY2Vzc2VkX2V2ZW50cyArPSBVSW50NjQoMSkKICAgIGRpZyA0CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSA1CiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c193aGlsZV90b3BANAoKZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUA0MDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5NAogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ID0gVUludDY0KDApCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQxCgpmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUAyOToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU2MAogICAgLy8gZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGRpZyAxNQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSAxNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTYxLTU2MwogICAgLy8gIyBEeW5hbWljIGFubnVpdGllcyBkZXJpdmUgbmV4dCBzdGF0ZSBmcm9tIHRoZSBwYXltZW50IGRlY29tcG9zaXRpb24sCiAgICAvLyAjIG5vdCBvbmx5IGZyb20gdGhlIHByZWNvbXB1dGVkIGBuZXh0XypgIGZpZWxkcy4KICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QUik6CiAgICBwdXNoaW50IDMKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDMxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjUKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIC0gcHJpbmNpcGFsX2Ftb3VudF9kdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgZGlnIDYKICAgIC0KICAgIGR1cAogICAgYnVyeSA5CiAgICBidXJ5IDkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzgKCmZ1bmRfZHVlX2Nhc2hmbG93c19lbHNlX2JvZHlAMzE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjgKICAgIC8vIGVsaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX0lQKToKICAgIGRpZyAxNAogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDMzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjkKICAgIC8vIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgYnVyeSA5CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzAKICAgIC8vIG5leHRfaW50ZXJlc3RfYmFzZSA9IHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgYnVyeSAxMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSBleGlzdHMKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzgKCmZ1bmRfZHVlX2Nhc2hmbG93c19lbHNlX2JvZHlAMzM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzEKICAgIC8vIGVsaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKToKICAgIGRpZyAxNAogICAgcHVzaGludCAxOQogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUAzNAogICAgZGlnIDcKICAgIGJ1cnkgOQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlAMzQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzIKICAgIC8vIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzMKICAgIC8vIG5leHRfaW50ZXJlc3RfYmFzZSA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgOQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzIKICAgIC8vIGlmIHNlbGYuX2lzX2R5bmFtaWNfYW5udWl0eSgpOgogICAgY2FsbHN1YiBfaXNfZHluYW1pY19hbm51aXR5CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyNwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDMzCiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfTUQpOgogICAgZGlnIDE0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzNAogICAgLy8gcmV0dXJuIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTU1CiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzNQogICAgLy8gaW50ZXJlc3RfZHVlID0gc2VsZi5hY2NydWVkX2ludGVyZXN0ICsgc2VsZi5fZW50cnlfaW50ZXJlc3Rfc2VnbWVudChlbnRyeSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBkaWcgMTYKICAgIGNhbGxzdWIgX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQKICAgIGJ1cnkgMTgKICAgICsKICAgIGR1cAogICAgYnVyeSAxMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDM2CiAgICAvLyBpZiBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPD0gaW50ZXJlc3RfZHVlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gZXhpc3RzCiAgICA+PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzNwogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTU1CiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyNDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzOAogICAgLy8gcHJpbmNpcGFsX2Ftb3VudCA9IHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiAtIGludGVyZXN0X2R1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gZXhpc3RzCiAgICBkaWcgMTAKICAgIC0KICAgIGR1cAogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzkKICAgIC8vIGlmIHByaW5jaXBhbF9hbW91bnQgPiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgPgogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ0MAogICAgLy8gcmV0dXJuIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTU1CiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyNjoKICAgIGRpZyA2CiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1NQogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NDMKICAgIC8vIGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsIDw9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBkaWcgMTUKICAgIHB1c2hpbnQgNDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGR1cDIKICAgIDw9CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NDItNDQ0CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsIDw9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ0NQogICAgLy8gcmV0dXJuIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIC0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIHN3YXAKICAgIC0KICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTU1CiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQxOAogICAgLy8gcmV0dXJuIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCArIHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZGlnIDE2CiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBidXJ5IDE4CiAgICArCiAgICBidXJ5IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTQKICAgIC8vIGludGVyZXN0X2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9pbnRlcmVzdF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9pbnRlcmVzdF9hbW91bnRAMTYKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl93aGlsZUAxMToKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMDAKICAgIC8vIGFzc2VydCBwcm9jZXNzZWRfZXZlbnRzID4gVUludDY0KDApLCBlcnIuTk9fRFVFX0NBU0hGTE9XCiAgICBkaWcgNAogICAgZHVwCiAgICBhc3NlcnQgLy8gTm8gZHVlIGNhc2hmbG93IHRvIHBheQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjEwNAogICAgLy8gdG90YWxfZnVuZGVkPWZ1bmRlZF9pbnRlcmVzdCArIGZ1bmRlZF9wcmluY2lwYWwsCiAgICBkaWcgMTQKICAgIGR1cAogICAgZGlnIDE1CiAgICBkdXAKICAgIGNvdmVyIDMKICAgICsKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMDYKICAgIC8vIHRpbWVzdGFtcD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMDEtMTA3CiAgICAvLyByZXR1cm4gdHlwLkNhc2hGdW5kaW5nUmVzdWx0KAogICAgLy8gICAgIGZ1bmRlZF9pbnRlcmVzdD1mdW5kZWRfaW50ZXJlc3QsCiAgICAvLyAgICAgZnVuZGVkX3ByaW5jaXBhbD1mdW5kZWRfcHJpbmNpcGFsLAogICAgLy8gICAgIHRvdGFsX2Z1bmRlZD1mdW5kZWRfaW50ZXJlc3QgKyBmdW5kZWRfcHJpbmNpcGFsLAogICAgLy8gICAgIHByb2Nlc3NlZF9ldmVudHM9cHJvY2Vzc2VkX2V2ZW50cywKICAgIC8vICAgICB0aW1lc3RhbXA9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX2ZhbHNlQDUzOgogICAgaW50Y18wIC8vIDAKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfbWVyZ2VANTQKCgovLyBtb2R1bGVzLnBheW1lbnRfYWdlbnQuUGF5bWVudEFnZW50LmNsYWltX2R1ZV9jYXNoZmxvd3Nbcm91dGluZ10oKSAtPiB2b2lkOgpjbGFpbV9kdWVfY2FzaGZsb3dzOgogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDIKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NgogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg0MTIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE1CiAgICAvLyBpZiBzZWxmLm9wX2RhZW1vbi52YWx1ZSAhPSBHbG9iYWwuemVyb19hZGRyZXNzOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI3IC8vIDB4NTIzYTRmNTA0NDIzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BfZGFlbW9uIGV4aXN0cwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgYnogY2xhaW1fZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE3CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTcKICAgIC8vIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNyAvLyAweDUyM2E0ZjUwNDQyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wX2RhZW1vbiBleGlzdHMKICAgID09CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTctMTkKICAgIC8vIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICAvLyBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgYm56IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDE0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTgKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNy0xOQogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICBibnogY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX3RydWVAMTQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxOQogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIHR4biBTZW5kZXIKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDMyCiAgICA9PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE3LTE5CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAxNQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX3RydWVAMTQ6CiAgICBpbnRjXzEgLy8gMQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDE2OgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE2LTIwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vICAgICBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gICAgIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICAvLyApLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNzoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMzkKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTQwCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM4CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE1MAogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNDMKICAgIC8vIHNlbGYuX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQoaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDIKICAgIGR1cAogICAgY2FsbHN1YiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE0NAogICAgLy8gc2VsZi5fc2V0dGxlX3Bvc2l0aW9uKGhvbGRpbmdfYWRkcmVzcykKICAgIGNhbGxzdWIgX3NldHRsZV9wb3NpdGlvbgogICAgcG9wbiAyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTE3CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jbGFpbWFibGVfaW50ZXJlc3QKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGR1cAogICAgcHVzaGludCA3MwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTE4CiAgICAvLyArIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNsYWltYWJsZV9wcmluY2lwYWwKICAgIGR1cAogICAgcHVzaGludCA4MQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTE3LTExOAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY2xhaW1hYmxlX2ludGVyZXN0CiAgICAvLyArIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNsYWltYWJsZV9wcmluY2lwYWwKICAgIHVuY292ZXIgMgogICAgKwogICAgZHVwCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNDYKICAgIC8vIGFzc2VydCB0b3RhbF9hbW91bnQgPiBVSW50NjQoMCksIGVyci5OT19EVUVfQ0FTSEZMT1cKICAgIGFzc2VydCAvLyBObyBkdWUgY2FzaGZsb3cgdG8gcGF5CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MjUKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5pc19vcHRlZF9pbigKICAgIGV4dHJhY3QgMCAzMgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI2CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI1LTI3CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MuaXNfb3B0ZWRfaW4oCiAgICAvLyAgICAgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkCiAgICAvLyApCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI1LTI4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MuaXNfb3B0ZWRfaW4oCiAgICAvLyAgICAgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkCiAgICAvLyApCiAgICAvLyBhbmQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZAogICAgYnogY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX2ZhbHNlQDI0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MjgKICAgIC8vIGFuZCBub3Qgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDM4NAogICAgZ2V0Yml0CiAgICBibnogY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX2ZhbHNlQDI0CiAgICBpbnRjXzEgLy8gMQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDI1OgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE1MQogICAgLy8gaWYgc2VsZi5faXNfcGF5bWVudF9leGVjdXRhYmxlKGhvbGRpbmdfYWRkcmVzcyk6CiAgICBieiBjbGFpbV9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjM0CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgc3dhcAogICAgZGlnIDEKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYXNzZXJ0IC8vIGFjY291bnQgb3B0ZWQgaW50byBhc3NldAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjM0LTM1CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgLy8gPj0gcGF5bWVudF9hbW91bnQKICAgIGRpZyA1CiAgICBkdXAKICAgIGNvdmVyIDIKICAgID49CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MzMtMzYKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIC8vICAgICA+PSBwYXltZW50X2Ftb3VudAogICAgLy8gKSwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE1MwogICAgLy8gc2VsZi5fcGF5KHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcywgdG90YWxfYW1vdW50KQogICAgZGlnIDIKICAgIGR1cAogICAgY292ZXIgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGR1cAogICAgZXh0cmFjdCAwIDMyCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NDAtNDUKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1yZWNlaXZlciwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9YW1vdW50LAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NDQKICAgIC8vIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICB1bmNvdmVyIDMKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgdW5jb3ZlciAyCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQwCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NDAtNDUKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1yZWNlaXZlciwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9YW1vdW50LAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEyNS0xMjYKICAgIC8vICMgR2V0IHRoZSBjbGFpbWFibGUgYW1vdW50cyBiZWZvcmUgcmVzZXQKICAgIC8vIGludGVyZXN0X2Ftb3VudCA9IHBvc2l0aW9uLmNsYWltYWJsZV9pbnRlcmVzdAogICAgZHVwCiAgICBwdXNoaW50IDczCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBidXJ5IDkKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMjcKICAgIC8vIHByaW5jaXBhbF9hbW91bnQgPSBwb3NpdGlvbi5jbGFpbWFibGVfcHJpbmNpcGFsCiAgICBkdXAKICAgIHB1c2hpbnQgODEKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGJ1cnkgOQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEyOS0xMzAKICAgIC8vICMgUmVzZXQgdGhlIHBvc2l0aW9uJ3MgY2xhaW1hYmxlIGFtb3VudHMKICAgIC8vIHBvc2l0aW9uLmNsYWltYWJsZV9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICByZXBsYWNlMiA3MwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzMQogICAgLy8gcG9zaXRpb24uY2xhaW1hYmxlX3ByaW5jaXBhbCA9IFVJbnQ2NCgwKQogICAgc3dhcAogICAgcmVwbGFjZTIgODEKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzIKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gcG9zaXRpb24uY29weSgpCiAgICB1bmNvdmVyIDMKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzQKICAgIC8vIGFzc2VydCBzZWxmLnJlc2VydmVkX2ludGVyZXN0ID49IGludGVyZXN0X2Ftb3VudCwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBkdXAKICAgIGRpZyAyCiAgICA+PQogICAgYXNzZXJ0IC8vIE5vdCBlbm91Z2ggZnVuZHMgZm9yIHRoZSBwYXltZW50CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTM1CiAgICAvLyBhc3NlcnQgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgPj0gcHJpbmNpcGFsX2Ftb3VudCwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIGRpZyAzCiAgICA+PQogICAgYXNzZXJ0IC8vIE5vdCBlbm91Z2ggZnVuZHMgZm9yIHRoZSBwYXltZW50CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTM3LTEzOAogICAgLy8gIyBVcGRhdGUgdGhlIGdsb2JhbCByZXNlcnZlZCBpbnRlcmVzdCBhbmQgcHJpbmNpcGFsIGFtb3VudHMKICAgIC8vIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgLT0gaW50ZXJlc3RfYW1vdW50CiAgICBzd2FwCiAgICAtCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzOQogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgLT0gcHJpbmNpcGFsX2Ftb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIGV4aXN0cwogICAgc3dhcAogICAgLQogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpjbGFpbV9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNTkKICAgIC8vIHRvdGFsX2Ftb3VudD1pbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50LAogICAgZGlnIDUKICAgIGR1cAogICAgZGlnIDYKICAgIGR1cAogICAgY292ZXIgMwogICAgKwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE2MAogICAgLy8gdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE1Ni0xNjIKICAgIC8vIHJldHVybiB0eXAuQ2FzaENsYWltUmVzdWx0KAogICAgLy8gICAgIGludGVyZXN0X2Ftb3VudD1pbnRlcmVzdF9hbW91bnQsCiAgICAvLyAgICAgcHJpbmNpcGFsX2Ftb3VudD1wcmluY2lwYWxfYW1vdW50LAogICAgLy8gICAgIHRvdGFsX2Ftb3VudD1pbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50LAogICAgLy8gICAgIHRpbWVzdGFtcD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICBjb250ZXh0PXBheW1lbnRfaW5mbywKICAgIC8vICkKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyAyCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgcHVzaGJ5dGVzIDB4MDAyMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX2ZhbHNlQDI0OgogICAgaW50Y18wIC8vIDAKICAgIGIgY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDI1CgpjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VAMTU6CiAgICBpbnRjXzAgLy8gMAogICAgYiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfbWVyZ2VAMTYKCgovLyBtb2R1bGVzLnRyYW5zZmVyX2FnZW50LlRyYW5zZmVyQWdlbnQudHJhbnNmZXJfc2V0X3NjaGVkdWxlW3JvdXRpbmddKCkgLT4gdm9pZDoKdHJhbnNmZXJfc2V0X3NjaGVkdWxlOgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQwCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDEKICAgIC8vIGFzc2VydCBvcGVuX2RhdGUgPCBjbG9zdXJlX2RhdGUsIGVyci5JTlZBTElEX1NPUlRJTkcKICAgIGR1cDIKICAgIDwKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBtdXN0IGJlIHNvcnRlZCBpbiBzdHJpY3RseSBhc2NlbmRpbmcgb3JkZXIKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDMKICAgIC8vIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlID0gb3Blbl9kYXRlCiAgICBieXRlYyAyOSAvLyAidHJhbnNmZXJfb3BlbmluZ19kYXRlIgogICAgdW5jb3ZlciAyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo0NAogICAgLy8gc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGUgPSBjbG9zdXJlX2RhdGUKICAgIGJ5dGVjIDMwIC8vICJ0cmFuc2Zlcl9jbG9zdXJlX2RhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo0NQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnRyYW5zZmVyX2FnZW50LlRyYW5zZmVyQWdlbnQucHJpbWFyeV9kaXN0cmlidXRpb25bcm91dGluZ10oKSAtPiB2b2lkOgpwcmltYXJ5X2Rpc3RyaWJ1dGlvbjoKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NgogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzEKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnByaW1hcnlfZGVhbGVyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjIgLy8gMHg1MjNhNTA1OTQ0MjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NzYKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojc3CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM4CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NzgKICAgIC8vIGFzc2VydCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBSSU1BUllfRElTVFJJQlVUSU9OX0NMT1NFRAogICAgYXNzZXJ0IC8vIFByaW1hcnkgZGlzdHJpYnV0aW9uIGlzIGNsb3NlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBjb3ZlciAzCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjgwCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKGhvbGRpbmdfYWRkcmVzcykKICAgIHN3YXAKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODEKICAgIC8vIGFzc2VydCB1bml0cyA+IFVJbnQ2NCgwKSwgZXJyLlpFUk9fVU5JVFMKICAgIGR1cAogICAgYXNzZXJ0IC8vIENhbiBub3QgZGlzdHJpYnV0ZSB6ZXJvIHVuaXRzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjgzCiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsICsgdW5pdHMgPD0gc2VsZi50b3RhbF91bml0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCBleGlzdHMKICAgICsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICA8PQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4Mi04NAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsICsgdW5pdHMgPD0gc2VsZi50b3RhbF91bml0cwogICAgLy8gKSwgZXJyLk9WRVJfRElTVFJJQlVUSU9OCiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IHJlbWFpbmluZyBELUFTQSB1bml0cwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4NQogICAgLy8gaWYgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjggLy8gImluaXRpYWxfZXhjaGFuZ2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGUgZXhpc3RzCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODcKICAgIC8vIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDw9IHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjggLy8gImluaXRpYWxfZXhjaGFuZ2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGUgZXhpc3RzCiAgICA8PQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4Ni04OAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8PSBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZQogICAgLy8gKSwgZXJyLlBSSU1BUllfRElTVFJJQlVUSU9OX0NMT1NFRAogICAgYXNzZXJ0IC8vIFByaW1hcnkgZGlzdHJpYnV0aW9uIGlzIGNsb3NlZAoKcHJpbWFyeV9kaXN0cmlidXRpb25fYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE0OAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucmVzZXJ2ZWRfdW5pdHMgKz0gdW5pdHMKICAgIGR1cG4gMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHB1c2hpbnQgNDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMwogICAgZHVwCiAgICBjb3ZlciAzCiAgICArCiAgICBpdG9iCiAgICBwdXNoaW50IDQwCiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo5MQogICAgLy8gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCArPSB1bml0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCBleGlzdHMKICAgICsKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo5MgogICAgLy8gcmV0dXJuIHNlbGYudG90YWxfdW5pdHMgLSBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgc3dhcAogICAgLQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy50cmFuc2Zlcl9hZ2VudC5UcmFuc2ZlckFnZW50LnRyYW5zZmVyW3JvdXRpbmddKCkgLT4gdm9pZDoKdHJhbnNmZXI6CiAgICBpbnRjXzAgLy8gMAogICAgZHVwCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojk0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXBuIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDYKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxMzAKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjEzMQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzOAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTAKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjEzCiAgICAvLyBpZiBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyOSAvLyAidHJhbnNmZXJfb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIGJ6IHRyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNQogICAgLy8gc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyOSAvLyAidHJhbnNmZXJfb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIDw9CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE0LTE2CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyApLCBlcnIuQ0xPU0VEX1RSQU5TRkVSCiAgICBhc3NlcnQgLy8gVHJhbnNmZXIgaXMgY2xvc2VkCgp0cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE3CiAgICAvLyBpZiBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMCAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIGJ6IHRyYW5zZmVyX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxOQogICAgLy8gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDMwIC8vICJ0cmFuc2Zlcl9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgPAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxOC0yMAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8IHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlCiAgICAvLyApLCBlcnIuQ0xPU0VEX1RSQU5TRkVSCiAgICBhc3NlcnQgLy8gVHJhbnNmZXIgaXMgY2xvc2VkCgp0cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjEzNQogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gc2VuZGVyX2hvbGRpbmdfYWRkcmVzcywgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDgKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIGRpZyA1CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDkKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTM4CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBkaWcgMgogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxMzkKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQocmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzKQogICAgZHVwCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE0MAogICAgLy8gYXNzZXJ0IHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MgIT0gcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzLCBlcnIuU0VMRl9UUkFOU0ZFUgogICAgdW5jb3ZlciAyCiAgICAhPQogICAgYXNzZXJ0IC8vIFNlbmRlciBhbmQgcmVjZWl2ZXIgbXVzdCBiZSBkaWZmZXJlbnQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTQxCiAgICAvLyBhc3NlcnQgdW5pdHMgPiBVSW50NjQoMCksIGVyci5OVUxMX1RSQU5TRkVSCiAgICBkaWcgMQogICAgZHVwCiAgICBhc3NlcnQgLy8gVHJhbnNmZXIgdW5pdHMgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNDIKICAgIC8vIGFzc2VydCB1bml0cyA8PSBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMsIGVyci5PVkVSX1RSQU5TRkVSCiAgICBzd2FwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgPD0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgc2VuZGVyIHVuaXRzIHRvIHRyYW5zZmVyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NjYKICAgIC8vIGlmIHNlbGYuZXZlbnRfY3Vyc29yID49IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQ6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgID49CiAgICBibnogdHJhbnNmZXJfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYXNzZXJ0X25vX2R1ZV9ldmVudF9wZW5kaW5nQDEwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NjgKICAgIC8vIG5leHRfZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoc2VsZi5ldmVudF9jdXJzb3IpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzcwCiAgICAvLyBuZXh0X2VudHJ5LnNjaGVkdWxlZF90aW1lID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgID4KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc2OS03NzEKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgbmV4dF9lbnRyeS5zY2hlZHVsZWRfdGltZSA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyApLCBlcnIuUEVORElOR19BQ1RVU19FVkVOVAogICAgYXNzZXJ0IC8vIEFDVFVTIGV2ZW50IG5vdCB5ZXQgZXhlY3V0ZWQKCnRyYW5zZmVyX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Fzc2VydF9ub19kdWVfZXZlbnRfcGVuZGluZ0AxMDoKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTQ1CiAgICAvLyBzZWxmLl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBkaWcgMwogICAgZHVwCiAgICBjYWxsc3ViIF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE0NgogICAgLy8gc2VsZi5fZW5zdXJlX3VuaXRzX2FjdGl2YXRlZChyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBkaWcgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjYWxsc3ViIF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE0NwogICAgLy8gc2VsZi5fc2V0dGxlX3Bvc2l0aW9uKHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBjYWxsc3ViIF9zZXR0bGVfcG9zaXRpb24KICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNDgKICAgIC8vIHNlbGYuX3NldHRsZV9wb3NpdGlvbihyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBjYWxsc3ViIF9zZXR0bGVfcG9zaXRpb24KICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE1MgogICAgLy8gYXNzZXJ0IHVuaXRzIDw9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLCBlcnIuT1ZFUl9UUkFOU0ZFUgogICAgZGlnIDUKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGRpZyAxCiAgICA8PQogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCBzZW5kZXIgdW5pdHMgdG8gdHJhbnNmZXIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNTMKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzIC09IHVuaXRzCiAgICBkaWcgMQogICAgLQogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBpbnRjXzMgLy8gMzIKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNDQKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzICs9IHVuaXRzCiAgICBkaWcgNQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgdW5jb3ZlciAyCiAgICArCiAgICBpdG9iCiAgICBpbnRjXzMgLy8gMzIKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojk0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgZGlnIDIKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF9zdXNwZW5zaW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF9zdXNwZW5zaW9uOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE2NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzcKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDIxIC8vIDB4NTIzYTQxNTU1NDIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg0MTIzCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTg1CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGR1cAogICAgcHVzaGludCA0OAogICAgaW50Y18xIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIHB1c2hpbnQgNDgKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTg2CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfb3Blbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfb3BlbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2OAogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjMgLy8gMHg1MjNhNGQ0ZTQ3MjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0MgogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfRU5ERUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgMjAwCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxMAogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfZW5kZWQoKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgIQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjExCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxMgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTMKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjM0CiAgICAvLyB1bml0cz1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjMyLTQyCiAgICAvLyByZXR1cm4gdHlwLkFjY291bnRQb3NpdGlvbigKICAgIC8vICAgICBwYXltZW50X2FkZHJlc3M9cGF5bWVudF9hZGRyZXNzLAogICAgLy8gICAgIHVuaXRzPVVJbnQ2NCgwKSwKICAgIC8vICAgICByZXNlcnZlZF91bml0cz1VSW50NjQoMCksCiAgICAvLyAgICAgc3VzcGVuZGVkPUZhbHNlLAogICAgLy8gICAgIHNldHRsZWRfY3Vyc29yPVVJbnQ2NCgwKSwKICAgIC8vICAgICBpbnRlcmVzdF9jaGVja3BvaW50PVVJbnQ2NCgwKSwKICAgIC8vICAgICBwcmluY2lwYWxfY2hlY2twb2ludD1VSW50NjQoMCksCiAgICAvLyAgICAgY2xhaW1hYmxlX2ludGVyZXN0PVVJbnQ2NCgwKSwKICAgIC8vICAgICBjbGFpbWFibGVfcHJpbmNpcGFsPVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGl0b2IKICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgYnl0ZWMgNDAgLy8gMHgwMAogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTQKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gc2VsZi5fbmV3X2FjY291bnRfcG9zaXRpb24ocGF5bWVudF9hZGRyZXNzKQogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxNQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5hY2NvdW50X3VwZGF0ZV9wYXltZW50X2FkZHJlc3Nbcm91dGluZ10oKSAtPiB2b2lkOgphY2NvdW50X3VwZGF0ZV9wYXltZW50X2FkZHJlc3M6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg0MTIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMzgKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcywgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgdW5jb3ZlciAzCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjM5CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0MAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDEKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcyA9IHBheW1lbnRfYWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDIKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF9nZXRfcG9zaXRpb25bcm91dGluZ10oKSAtPiB2b2lkOgphY2NvdW50X2dldF9wb3NpdGlvbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg0MTIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI1OQogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmNvbnRyYWN0X2NyZWF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X2NyZWF0ZToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDM2CiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gYXJyYW5nZXIKICAgIGJ5dGVjIDE4IC8vIDB4NTIzYTQxNTI1MjIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAzNwogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9jb25maWdbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9jb25maWc6CiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAzOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGxlbgogICAgcHVzaGludCAxMDcKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuTm9ybWFsaXplZEFjdHVzVGVybXMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDcyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLkluaXRpYWxLZXJuZWxTdGF0ZQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIGxlbgogICAgZGlnIDEKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgdHVwbGUgZW5jb2RpbmcKICAgIGR1cAogICAgcHVzaGludCAzNAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHRhaWwgcG9pbnRlciBhdCBpbmRleCAxIG9mICh1aW50OFszMl0sKGxlbit1dGY4W10pKQogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBjb3ZlciAzCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAzNgogICAgKwogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5Qcm9zcGVjdHVzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDY5CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNzEtMTA3MgogICAgLy8gIyBDb25maWd1cmUgQ29udHJhY3QKICAgIC8vIHNlbGYuY29udHJhY3RfdHlwZSA9IHRlcm1zLmNvbnRyYWN0X3R5cGUuYXNfdWludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjEtMjI4CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICBieiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIzCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfQU5OKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjEtMjI4CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjQKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgcHVzaGludCAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjEtMjI4CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjUKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjEtMjI4CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjYKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgcHVzaGludCA0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjEtMjI4CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjcKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjEtMjI4CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYnogY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAOAoKY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUA3OgogICAgaW50Y18xIC8vIDEKCmNvbnRyYWN0X2NvbmZpZ19ib29sX21lcmdlQDk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMzIKICAgIC8vIGFzc2VydCBzZWxmLl9pc19zdXBwb3J0ZWRfY29udHJhY3RfdHlwZShjb250cmFjdF90eXBlKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc0CiAgICAvLyBzZWxmLl9zdG9yZV9jb250cmFjdF9jb25maWcoc2VsZi5jb250cmFjdF90eXBlLCB0ZXJtcywgaW5pdGlhbF9zdGF0ZSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBidXJ5IDIKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMjgKICAgIC8vIGFzc2VydCB0ZXJtcy5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBkaWcgNAogICAgZHVwCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDgKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMzMAogICAgLy8gdGVybXMuZGF5X2NvdW50X2NvbnZlbnRpb24uYXNfdWludDY0KCkKICAgIHB1c2hpbnQgNTcKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDAtMzA2CiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgIGJ6IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGRpZyA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDIKICAgIC8vIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzAwLTMwNgogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGRpZyA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDMKICAgIC8vIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICBwdXNoaW50IDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMwMC0zMDYKICAgIC8vIHJldHVybiBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzYwKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwSVNEQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjApLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDE2CiAgICBkaWcgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzA0CiAgICAvLyBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDAtMzA2CiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgID09CiAgICBibnogY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUAxNgogICAgZGlnIDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMwNQogICAgLy8gVUludDY0KGVudW1zLkRDQ18zMEUzNjApLAogICAgcHVzaGludCA0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDAtMzA2CiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgID09CiAgICBieiBjb250cmFjdF9jb25maWdfYm9vbF9mYWxzZUAxNwoKY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUAxNjoKICAgIGludGNfMSAvLyAxCgpjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUAxODoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxMi0zMTQKICAgIC8vIGFzc2VydCBzZWxmLl9pc19zdXBwb3J0ZWRfZGF5X2NvdW50X2NvbnZlbnRpb24oCiAgICAvLyAgICAgZGF5X2NvdW50X2NvbnZlbnRpb24KICAgIC8vICksIGVyci5JTlZBTElEX0RBWV9DT1VOVF9DT05WRU5USU9OCiAgICBhc3NlcnQgLy8gSW52YWxpZCBkYXktY291bnQgY29udmVudGlvbiBJRAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzMyCiAgICAvLyBpZiBjb250cmFjdF90eXBlICE9IFVJbnQ2NChlbnVtcy5DVF9BTk4pOgogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgIT0KICAgIGJ6IGNvbnRyYWN0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDIwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzMKICAgIC8vIGFzc2VydCBub3QgdGVybXMuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBkaWcgNAogICAgcHVzaGludCA3ODYKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgoKY29udHJhY3RfY29uZmlnX2FmdGVyX2lmX2Vsc2VAMjA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTAKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTEKICAgIC8vIGFzc2VydCBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID09IFVJbnQ2NCgwKSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBELUFTQSBhbHJlYWR5IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgxMy04MTQKICAgIC8vICMgU2V0IERlbm9taW5hdGlvbiBBc3NldAogICAgLy8gc2VsZi5fYXNzZXJ0X2Rlbm9taW5hdGlvbl9hc3NldCh0ZXJtcy5kZW5vbWluYXRpb25fYXNzZXRfaWQpCiAgICBkaWcgNAogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc3OC03NzkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gZGVub21pbmF0aW9uIHdpdGggQVNBCiAgICAvLyBfY3JlYXRvciwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfY3JlYXRvcihkZW5vbWluYXRpb25fYXNzZXRfaWQpCiAgICBkdXAKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc4MAogICAgLy8gYXNzZXJ0IGV4aXN0cywgZXJyLklOVkFMSURfREVOT01JTkFUSU9OCiAgICBhc3NlcnQgLy8gRGVub21pbmF0aW9uIGFzc2V0IGlzIG5vdCBwcm9wZXJseSBzZXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc4MwogICAgLy8gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgPSBkZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIGJ5dGVjIDQ0IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgxNy04MTgKICAgIC8vICMgU2V0IFNldHRsZW1lbnQgQXNzZXQKICAgIC8vIHNlbGYuX2Fzc2VydF9zZXR0bGVtZW50X2Fzc2V0KHRlcm1zLnNldHRsZW1lbnRfYXNzZXRfaWQpCiAgICBkaWcgMQogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Nzg4CiAgICAvLyBzZXR0bGVtZW50X2Fzc2V0X2lkID09IHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc4Ni03ODkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzZXR0bGVtZW50IGFzc2V0IGlzIHRoZSBkZW5vbWluYXRpb24gYXNzZXQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgLy8gKSwgZXJyLklOVkFMSURfU0VUVExFTUVOVF9BU1NFVAogICAgYXNzZXJ0IC8vIERpZmZlcmVudCBzZXR0bGVtZW50IGFzc2V0IG5vdCBzdXBwb3J0ZWQsIG11c3QgYmUgZXF1YWwgdG8gZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3OTIKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCA9IHNldHRsZW1lbnRfYXNzZXRfaWQKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3OTMtNzk5CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3OTgKICAgIC8vIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3OTYKICAgIC8vIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Nzk3CiAgICAvLyBhc3NldF9hbW91bnQ9MCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3OTMtNzk0CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc5My03OTkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gc2V0dGxlbWVudCB3aXRoIEFTQQogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PTAsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MjEtODIyCiAgICAvLyAjIFVuaXRzCiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzID0gdGVybXMudG90YWxfdW5pdHMKICAgIGR1cAogICAgcHVzaGludCAxNwogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MjMKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODI1LTgyNgogICAgLy8gIyBEYXktQ291bnQgQ29udmVudGlvbnMKICAgIC8vIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPSB0ZXJtcy5kYXlfY291bnRfY29udmVudGlvbi5hc191aW50NjQoKQogICAgYnl0ZWMgNDYgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgZGlnIDgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MjgtODI5CiAgICAvLyAjIFRpbWUKICAgIC8vIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlID0gdGVybXMuaW5pdGlhbF9leGNoYW5nZV9kYXRlCiAgICBkdXAKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAyOCAvLyAiaW5pdGlhbF9leGNoYW5nZV9kYXRlIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MzAKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IHRlcm1zLm1hdHVyaXR5X2RhdGUKICAgIGRpZyAxCiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNDUgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzMQogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gaW5pdGlhbF9zdGF0ZS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBkaWcgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBwdXNoaW50IDQ4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODMzLTgzNAogICAgLy8gIyBQcmluY2lwYWwKICAgIC8vIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPSB0ZXJtcy5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudAogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgZGlnIDEwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODM1CiAgICAvLyBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSB0ZXJtcy5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBkaWcgMwogICAgcHVzaGludCA3ODYKICAgIGdldGJpdAogICAgYnl0ZWMgMzQgLy8gImR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODM2CiAgICAvLyBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9IGluaXRpYWxfc3RhdGUub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBkaWcgMQogICAgcHVzaGludCAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MzgtODM5CiAgICAvLyAjIEludGVyZXN0CiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgPSBpbml0aWFsX3N0YXRlLmFjY3J1ZWRfaW50ZXJlc3QKICAgIGRpZyAxCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDEtODQyCiAgICAvLyAjIEludGVyZXN0IFJhdGUKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gaW5pdGlhbF9zdGF0ZS5ub21pbmFsX2ludGVyZXN0X3JhdGUKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQzCiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBpbml0aWFsX3N0YXRlLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UKICAgIGRpZyAxCiAgICBwdXNoaW50IDI0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDQKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQgPSB0ZXJtcy5yYXRlX3Jlc2V0X3NwcmVhZAogICAgZGlnIDMKICAgIHB1c2hpbnQgNTgKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzNSAvLyAicmF0ZV9yZXNldF9zcHJlYWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQ1CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciA9IHRlcm1zLnJhdGVfcmVzZXRfbXVsdGlwbGllcgogICAgZGlnIDMKICAgIHB1c2hpbnQgNjYKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzNiAvLyAicmF0ZV9yZXNldF9tdWx0aXBsaWVyIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0NgogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X2Zsb29yID0gdGVybXMucmF0ZV9yZXNldF9mbG9vcgogICAgZGlnIDMKICAgIHB1c2hpbnQgNzQKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzMSAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDcKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9jYXAgPSB0ZXJtcy5yYXRlX3Jlc2V0X2NhcAogICAgZGlnIDMKICAgIHB1c2hpbnQgODIKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzMiAvLyAicmF0ZV9yZXNldF9jYXAiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQ4CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfbmV4dCA9IHRlcm1zLnJhdGVfcmVzZXRfbmV4dAogICAgZGlnIDMKICAgIHB1c2hpbnQgOTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzNyAvLyAicmF0ZV9yZXNldF9uZXh0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0OQogICAgLy8gc2VsZi5oYXNfcmF0ZV9yZXNldF9mbG9vciA9IHRlcm1zLmhhc19yYXRlX3Jlc2V0X2Zsb29yCiAgICBkaWcgMwogICAgcHVzaGludCA3ODQKICAgIGdldGJpdAogICAgYnl0ZWMgMzggLy8gImhhc19yYXRlX3Jlc2V0X2Zsb29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg1MAogICAgLy8gc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgPSB0ZXJtcy5oYXNfcmF0ZV9yZXNldF9jYXAKICAgIGRpZyAzCiAgICBwdXNoaW50IDc4NQogICAgZ2V0Yml0CiAgICBieXRlYyAzOSAvLyAiaGFzX3JhdGVfcmVzZXRfY2FwIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg1Mi04NTMKICAgIC8vICMgU2NhbGluZwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSA9IHRlcm1zLmZpeGVkX3BvaW50X3NjYWxlCiAgICB1bmNvdmVyIDMKICAgIHB1c2hpbnQgOTkKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NTUtODU2CiAgICAvLyAjIFNjaGVkdWxlIFByb2Nlc3NpbmcKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yID0gaW5pdGlhbF9zdGF0ZS5ldmVudF9jdXJzb3IKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NTgtODU5CiAgICAvLyAjIFBlci1Vbml0IEZpeGVkLVBvaW50IEluZGV4ZXMKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCA9IGluaXRpYWxfc3RhdGUuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleAogICAgZGlnIDEKICAgIHB1c2hpbnQgNTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NjAKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggPSBpbml0aWFsX3N0YXRlLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4CiAgICBkaWcgMQogICAgcHVzaGludCA2NAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NjItODYzCiAgICAvLyAjIFJlc2VydmVkIEFtb3VudCAoZm9yIGV4ZWN1dGVkIGNhc2hmbG93cykKICAgIC8vIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODY0CiAgICAvLyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODY2CiAgICAvLyBhc3NlcnQgdGVybXMuaW5pdGlhbF9leGNoYW5nZV9kYXRlID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsIGVyci5JTlZBTElEX0lFRAogICAgZGlnIDIKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgID4KICAgIGFzc2VydCAvLyBJRUQgbXVzdCBiZSBzZXQgaW4gdGhlIGZ1dHVyZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODY3CiAgICAvLyBhc3NlcnQgdGVybXMuaW5pdGlhbF9leGNoYW5nZV9kYXRlID4gaW5pdGlhbF9zdGF0ZS5zdGF0dXNfZGF0ZSwgZXJyLklOVkFMSURfSUVECiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICA8CiAgICBhc3NlcnQgLy8gSUVEIG11c3QgYmUgc2V0IGluIHRoZSBmdXR1cmUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2OAogICAgLy8gYXNzZXJ0IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA8IHRlcm1zLm1hdHVyaXR5X2RhdGUsIGVyci5JTlZBTElEX0lFRAogICAgPAogICAgYXNzZXJ0IC8vIElFRCBtdXN0IGJlIHNldCBpbiB0aGUgZnV0dXJlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc2LTEwNzcKICAgIC8vICMgTm90YXJpemUgcHJvc3BlY3R1cyAob3B0aW9uYWwpCiAgICAvLyBzZWxmLnByb3NwZWN0dXNfaGFzaCA9IHByb3NwZWN0dXMuaGFzaC5ieXRlcwogICAgZGlnIDIKICAgIGV4dHJhY3QgMCAzMgogICAgYnl0ZWMgNDIgLy8gInByb3NwZWN0dXNfaGFzaCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc4CiAgICAvLyBzZWxmLnByb3NwZWN0dXNfdXJsID0gcHJvc3BlY3R1cy51cmwKICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgYnl0ZWMgNDMgLy8gInByb3NwZWN0dXNfdXJsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNzkKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAzOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpjb250cmFjdF9jb25maWdfYm9vbF9mYWxzZUAxNzoKICAgIGludGNfMCAvLyAwCiAgICBiIGNvbnRyYWN0X2NvbmZpZ19ib29sX21lcmdlQDE4Cgpjb250cmFjdF9jb25maWdfYm9vbF9mYWxzZUA4OgogICAgaW50Y18wIC8vIDAKICAgIGIgY29udHJhY3RfY29uZmlnX2Jvb2xfbWVyZ2VAOQoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmNvbnRyYWN0X3NjaGVkdWxlW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3Rfc2NoZWR1bGU6CiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwODEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgc3dhcAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGR1cAogICAgcHVzaGludCA2NQogICAgKgogICAgcHVzaGludCAyCiAgICArCiAgICB1bmNvdmVyIDIKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeT4KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMTMKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTExNgogICAgLy8gY29udHJhY3RfdHlwZT1zZWxmLmNvbnRyYWN0X3R5cGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgY292ZXIgMwogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg4NAogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuQUxSRUFEWV9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBELUFTQSBhbHJlYWR5IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg4NS04ODcKICAgIC8vIGFzc2VydCBzY2hlZHVsZV9wYWdlLmxlbmd0aCA8PSBVSW50NjQoCiAgICAvLyAgICAgY3N0LlNDSEVEVUxFX1BBR0VfU0laRQogICAgLy8gKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZHVwCiAgICBwdXNoaW50IDE2CiAgICA8PQogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODg4CiAgICAvLyBhc3NlcnQgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCA+IFVJbnQ2NCgwKSwgZXJyLlRFUk1TX05PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIHRlcm1zIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTAKICAgIC8vIHBhZ2VfY3Vyc29yID0gc2NoZWR1bGVfcGFnZV9pbmRleCAqIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKQogICAgc3dhcAogICAgcHVzaGludCAxNgogICAgKgogICAgc3dhcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODk3CiAgICAvLyArIHBhZ2VfbGVuZ3RoICogVUludDY0KGNzdC5PUF9VUF9DT05UUkFDVF9DT05GSUdfUEVSX0VOVFJZX0JVREdFVCkKICAgIHB1c2hpbnQgMTAwCiAgICAqCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTYKICAgIC8vIFVJbnQ2NChjc3QuT1BfVVBfQ09OVFJBQ1RfQ09ORklHX0JBU0VfQlVER0VUKQogICAgaW50YyA0IC8vIDE1MDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg5Ni04OTcKICAgIC8vIFVJbnQ2NChjc3QuT1BfVVBfQ09OVFJBQ1RfQ09ORklHX0JBU0VfQlVER0VUKQogICAgLy8gKyBwYWdlX2xlbmd0aCAqIFVJbnQ2NChjc3QuT1BfVVBfQ09OVFJBQ1RfQ09ORklHX1BFUl9FTlRSWV9CVURHRVQpCiAgICArCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTItODk5CiAgICAvLyAjIFZhbGlkYXRpb24gY29zdCBncm93cyB3aXRoIHBhZ2UgbGVuZ3RoLCBzbyBjb25maWd1cmF0aW9uIGV4cGxpY2l0bHkKICAgIC8vICMgYnV5cyBleHRyYSBvcGNvZGUgYnVkZ2V0IGZvciBsYXJnZXIgdXBsb2Fkcy4KICAgIC8vIGVuc3VyZV9idWRnZXQoCiAgICAvLyAgICAgcmVxdWlyZWRfYnVkZ2V0PSgKICAgIC8vICAgICAgICAgVUludDY0KGNzdC5PUF9VUF9DT05UUkFDVF9DT05GSUdfQkFTRV9CVURHRVQpCiAgICAvLyAgICAgICAgICsgcGFnZV9sZW5ndGggKiBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19QRVJfRU5UUllfQlVER0VUKQogICAgLy8gICAgICksCiAgICAvLyApCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDAKICAgIC8vIGluZGV4ID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAoKY29udHJhY3Rfc2NoZWR1bGVfd2hpbGVfdG9wQDI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDEKICAgIC8vIHdoaWxlIGluZGV4IDwgcGFnZV9sZW5ndGg6CiAgICBkdXAKICAgIGRpZyA0CiAgICA8CiAgICBieiBjb250cmFjdF9zY2hlZHVsZV9hZnRlcl93aGlsZUAxMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTAyLTkwMwogICAgLy8gZW50cnkgPSBzY2hlZHVsZV9wYWdlW2luZGV4XS5jb3B5KCkKICAgIC8vIGVudHJ5X2V2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBkaWcgNAogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgYnVyeSAxMgogICAgZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgcHVzaGludCA2NQogICAgKgogICAgcHVzaGludCA2NQogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDMKICAgIC8vIGVudHJ5X2V2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkwMi05MDMKICAgIC8vIGVudHJ5ID0gc2NoZWR1bGVfcGFnZVtpbmRleF0uY29weSgpCiAgICAvLyBlbnRyeV9ldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgaW50Y18yIC8vIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkwMwogICAgLy8gZW50cnlfZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGdldGJ5dGUKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSAxMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTA0CiAgICAvLyBhc3NlcnQgZW50cnkuZXZlbnRfaWQgPT0gcGFnZV9jdXJzb3IgKyBpbmRleCwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgMTMKICAgIGRpZyA1CiAgICB1bmNvdmVyIDQKICAgICsKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgaWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkwNS05MDcKICAgIC8vIHNlbGYuX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGVudHJ5X2V2ZW50X3R5cGUKICAgIC8vICkKICAgIGRpZyA1CiAgICB1bmNvdmVyIDMKICAgIGNhbGxzdWIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDgKICAgIC8vIGFzc2VydCBlbnRyeS5zY2hlZHVsZWRfdGltZSA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBzd2FwCiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgMTAKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkwOQogICAgLy8gaWYgZW50cnkuZXZlbnRfaWQgPiBVSW50NjQoMCk6CiAgICBieiBjb250cmFjdF9zY2hlZHVsZV9hZnRlcl9pZl9lbHNlQDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkxMAogICAgLy8gaWYgaW5kZXggPiBVSW50NjQoMCk6CiAgICBkdXAKICAgIGJ6IGNvbnRyYWN0X3NjaGVkdWxlX2Vsc2VfYm9keUA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTEKICAgIC8vIHByZXZpb3VzX2VudHJ5ID0gc2NoZWR1bGVfcGFnZVtpbmRleCAtIFVJbnQ2NCgxKV0uY29weSgpCiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBwdXNoaW50IDY1CiAgICAqCiAgICBkaWcgMTEKICAgIHN3YXAKICAgIHB1c2hpbnQgNjUKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwoKY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTI2CiAgICAvLyBwcmV2aW91c19lbnRyeS5zY2hlZHVsZWRfdGltZSA8PSBlbnRyeS5zY2hlZHVsZWRfdGltZQogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDgKICAgIDw9CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjUtOTI3CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHByZXZpb3VzX2VudHJ5LnNjaGVkdWxlZF90aW1lIDw9IGVudHJ5LnNjaGVkdWxlZF90aW1lCiAgICAvLyApLCBlcnIuSU5WQUxJRF9TT1JUSU5HCiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbXVzdCBiZSBzb3J0ZWQgaW4gc3RyaWN0bHkgYXNjZW5kaW5nIG9yZGVyCgpjb250cmFjdF9zY2hlZHVsZV9hZnRlcl9pZl9lbHNlQDg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjgKICAgIC8vIGlmIGVudHJ5LmV2ZW50X2lkID09IFVJbnQ2NCgwKToKICAgIGRpZyA4CiAgICBibnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTI5LTkzMQogICAgLy8gYXNzZXJ0IGVudHJ5X2V2ZW50X3R5cGUgPT0gVUludDY0KAogICAgLy8gICAgIGVudW1zLkVWVF9JRUQKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZGlnIDkKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgoKY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzMgogICAgLy8gaW5kZXggKz0gVUludDY0KDEpCiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgY29udHJhY3Rfc2NoZWR1bGVfd2hpbGVfdG9wQDIKCmNvbnRyYWN0X3NjaGVkdWxlX2Vsc2VfYm9keUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTEzLTkxNQogICAgLy8gIyBUaGUgZmlyc3QgZW50cnkgb2YgYSBwYWdlIG11c3Qgc3RpbGwgYmUgb3JkZXJlZCBhZnRlciB0aGUKICAgIC8vICMgbGFzdCBlbnRyeSBvZiB0aGUgcHJldmlvdXMgcGFnZS4KICAgIC8vIGFzc2VydCBzY2hlZHVsZV9wYWdlX2luZGV4ID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9FVkVOVF9JRAogICAgZGlnIDYKICAgIGR1cAogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgaWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkxNgogICAgLy8gcHJldmlvdXNfcGFnZV9pbmRleCA9IHNjaGVkdWxlX3BhZ2VfaW5kZXggLSBVSW50NjQoMSkKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTgKICAgIC8vIHByZXZpb3VzX3BhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlCiAgICBpdG9iCiAgICBieXRlYyAyNCAvLyAweDUzMjMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkxNy05MTkKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgcHJldmlvdXNfcGFnZV9pbmRleCBpbiBzZWxmLnNjaGVkdWxlX3BhZ2UKICAgIC8vICksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkyMC05MjEKICAgIC8vIHByZXZpb3VzX3BhZ2UgPSBzZWxmLnNjaGVkdWxlX3BhZ2VbcHJldmlvdXNfcGFnZV9pbmRleF0uY29weSgpCiAgICAvLyBhc3NlcnQgcHJldmlvdXNfcGFnZS5sZW5ndGggPiBVSW50NjQoMCksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIHB1c2hpbnQgMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkyMQogICAgLy8gYXNzZXJ0IHByZXZpb3VzX3BhZ2UubGVuZ3RoID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBkdXAKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkyMwogICAgLy8gcHJldmlvdXNfcGFnZS5sZW5ndGggLSBVSW50NjQoMSkKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjItOTI0CiAgICAvLyBwcmV2aW91c19lbnRyeSA9IHByZXZpb3VzX3BhZ2VbCiAgICAvLyAgICAgcHJldmlvdXNfcGFnZS5sZW5ndGggLSBVSW50NjQoMSkKICAgIC8vIF0uY29weSgpCiAgICBwdXNoaW50IDY1CiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIHB1c2hpbnQgNjUKICAgIGJveF9leHRyYWN0CiAgICBiIGNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VANwoKY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfd2hpbGVAMTE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMDMKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHNjaGVkdWxlX3BhZ2UuY29weSgpCiAgICBkaWcgNgogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBkaWcgNQogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTM1CiAgICAvLyBpZiBpc19sYXN0X3BhZ2U6CiAgICBkaWcgNQogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTM3CiAgICAvLyBzY2hlZHVsZV9wYWdlX2luZGV4ICogVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpICsgcGFnZV9sZW5ndGgKICAgIGRpZyAxCiAgICBkaWcgNAogICAgKwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTM2CiAgICAvLyBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50ID0gKAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MzYtOTM4CiAgICAvLyBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50ID0gKAogICAgLy8gICAgIHNjaGVkdWxlX3BhZ2VfaW5kZXggKiBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkgKyBwYWdlX2xlbmd0aAogICAgLy8gKQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzOQogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgcHVzaGludCA1MAogICAgYXBwX2dsb2JhbF9wdXQKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTIxCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwODEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmNvbnRyYWN0X2V4ZWN1dGVfaWVkW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfZXhlY3V0ZV9pZWQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDYKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE0NgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTQ3CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE0OAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTAKICAgIC8vIGFzc2VydCBzZWxmLmV2ZW50X2N1cnNvciA8IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICBkaWcgMQogICAgPgogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgY3Vyc29yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTUxCiAgICAvLyBlbnRyeSA9IHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLmV2ZW50X2N1cnNvcikKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1MgogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X3R5cGUgPT0gYXJjNC5VSW50OChlbnVtcy5FVlRfSUVEKSwgZXJyLklOVkFMSURfRVZFTlRfVFlQRQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgZHVwCiAgICBwdXNoYnl0ZXMgMHgwMQogICAgYj09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCB0eXBlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTU2CiAgICAvLyBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIGRpZyAxCiAgICBleHRyYWN0IDAgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1OAogICAgLy8gc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICBkaWcgMgogICAgZXh0cmFjdCA5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTkKICAgIC8vIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgZGlnIDMKICAgIGV4dHJhY3QgMTcgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE2MAogICAgLy8gcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZGlnIDQKICAgIGV4dHJhY3QgMjUgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE2MgogICAgLy8gbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9ZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBkaWcgNQogICAgZXh0cmFjdCAzMyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTYzCiAgICAvLyBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICBkaWcgNgogICAgZXh0cmFjdCA0MSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTY0CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1lbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIGRpZyA3CiAgICBleHRyYWN0IDQ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNjUKICAgIC8vIGZsYWdzPWVudHJ5LmZsYWdzLAogICAgZGlnIDgKICAgIGV4dHJhY3QgNTcgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1NS0xMTY2CiAgICAvLyB0eXAuT2JzZXJ2ZWRFdmVudFJlcXVlc3QoCiAgICAvLyAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBvYnNlcnZlZF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1lbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9ZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9ZW50cnkuZmxhZ3MsCiAgICAvLyApLAogICAgdW5jb3ZlciA3CiAgICB1bmNvdmVyIDgKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE2MQogICAgLy8gb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1NS0xMTY2CiAgICAvLyB0eXAuT2JzZXJ2ZWRFdmVudFJlcXVlc3QoCiAgICAvLyAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBvYnNlcnZlZF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1lbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9ZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9ZW50cnkuZmxhZ3MsCiAgICAvLyApLAogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTMtMTE2NwogICAgLy8gc2VsZi5fYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkoCiAgICAvLyAgICAgZW50cnksCiAgICAvLyAgICAgdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0KAogICAgLy8gICAgICAgICBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIC8vICAgICAgICAgZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgLy8gICAgICAgICBzY2hlZHVsZWRfdGltZT1lbnRyeS5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICAgICAgYWNjcnVhbF9mYWN0b3I9ZW50cnkuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICAgICAgb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPWVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPWVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgICAgICBmbGFncz1lbnRyeS5mbGFncywKICAgIC8vICAgICApLAogICAgLy8gKQogICAgY2FsbHN1YiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkKICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE2OAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTIzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5hcHBseV9ub25fY2FzaF9ldmVudFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFwcGx5X25vbl9jYXNoX2V2ZW50OgogICAgaW50Y18wIC8vIDAKICAgIGR1cG4gNAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwbiAyCiAgICBsZW4KICAgIHB1c2hpbnQgNzMKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuT2JzZXJ2ZWRFdmVudFJlcXVlc3QKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NgogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjA3CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIwOAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMTAKICAgIC8vIGlmIHBheWxvYWQuZmxhZ3MgJiBVSW50NjQoZW51bXMuRkxBR19PQlNFUlZFRF9FVkVOVCk6CiAgICBwdXNoaW50IDY1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBwdXNoaW50IDQKICAgICYKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjM2CiAgICAvLyByZXR1cm4gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9DTE0pCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIHB1c2hpbnQgNQogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMTEKICAgIC8vIGFzc2VydCBzZWxmLl9zdXBwb3J0c19vYnNlcnZlZF9ldmVudHMoKSwgZXJyLk9CU0VSVkVEX0VWRU5UX1JFUVVJUkVECiAgICBhc3NlcnQgLy8gT2JzZXJ2ZWQgZXZlbnQgcmVxdWlyZWQgdG8gZXhlY3V0ZSB0aGlzIGFjdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIxMgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMzYKICAgIC8vIHJldHVybiBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0NMTSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgZHVwCiAgICBwdXNoaW50IDUKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NDgKICAgIC8vIGFzc2VydCBzZWxmLl9zdXBwb3J0c19vYnNlcnZlZF9ldmVudHMoKSwgZXJyLk9CU0VSVkVEX0VWRU5UX1JFUVVJUkVECiAgICBhc3NlcnQgLy8gT2JzZXJ2ZWQgZXZlbnQgcmVxdWlyZWQgdG8gZXhlY3V0ZSB0aGlzIGFjdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQ5CiAgICAvLyBhc3NlcnQgcGF5bG9hZC5ldmVudF9pZCA9PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LCBlcnIuSU5WQUxJRF9FVkVOVF9JRAogICAgZGlnIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgNwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTEKICAgIC8vIHNlbGYuY29udHJhY3RfdHlwZSwgcGF5bG9hZC5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBkdXAKICAgIGV4dHJhY3QgOCAxCiAgICBidXJ5IDEyCiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTUwLTk1MgogICAgLy8gc2VsZi5fYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgc2VsZi5jb250cmFjdF90eXBlLCBwYXlsb2FkLmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIC8vICkKICAgIGNhbGxzdWIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTQKICAgIC8vIHBhZ2VfaW5kZXggPSBzZWxmLl9zY2hlZHVsZV9wYWdlX2luZGV4KHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxOTMKICAgIC8vIHJldHVybiBldmVudF9pZCAvLyBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkKICAgIHB1c2hpbnQgMTYKICAgIC8KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1NQogICAgLy8gcGFnZSA9IHR5cC5FeGVjdXRpb25TY2hlZHVsZVBhZ2UoKQogICAgYnl0ZWMgNDkgLy8gMHgwMDAwCiAgICBidXJ5IDcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1NgogICAgLy8gaWYgcGFnZV9pbmRleCBpbiBzZWxmLnNjaGVkdWxlX3BhZ2U6CiAgICBpdG9iCiAgICBieXRlYyAyNCAvLyAweDUzMjMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDkKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYWZ0ZXJfaWZfZWxzZUAyNwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTU3CiAgICAvLyBwYWdlID0gc2VsZi5zY2hlZHVsZV9wYWdlW3BhZ2VfaW5kZXhdLmNvcHkoKQogICAgZGlnIDcKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGJ1cnkgNwogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfcGFnZSBlbnRyeSBleGlzdHMKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMjc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTgKICAgIC8vIGFzc2VydCBwYWdlLmxlbmd0aCA8IFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZGlnIDUKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgcHVzaGludCAxNgogICAgPAogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTYzCiAgICAvLyBzY2hlZHVsZWRfdGltZT1wYXlsb2FkLnNjaGVkdWxlZF90aW1lLAogICAgZGlnIDMKICAgIGR1cAogICAgZXh0cmFjdCA5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2NAogICAgLy8gYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIGRpZyAxCiAgICBleHRyYWN0IDE3IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2NQogICAgLy8gcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICBkaWcgMgogICAgZXh0cmFjdCAyNSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjYKICAgIC8vIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPXBheWxvYWQubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBkaWcgMwogICAgZXh0cmFjdCA0MSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjcKICAgIC8vIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgZGlnIDQKICAgIGV4dHJhY3QgNDkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTY4CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1wYXlsb2FkLm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgdW5jb3ZlciA1CiAgICBleHRyYWN0IDU3IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2MC05NzAKICAgIC8vIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgIGV2ZW50X2lkPXBheWxvYWQuZXZlbnRfaWQsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1wYXlsb2FkLmV2ZW50X3R5cGUsCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPXBheWxvYWQubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1wYXlsb2FkLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICBmbGFncz1wYXlsb2FkLmZsYWdzLAogICAgLy8gKQogICAgZGlnIDExCiAgICBpdG9iCiAgICBkaWcgMTgKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1OS05NzEKICAgIC8vIHBhZ2UuYXBwZW5kKAogICAgLy8gICAgIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgICAgICBldmVudF9pZD1wYXlsb2FkLmV2ZW50X2lkLAogICAgLy8gICAgICAgICBldmVudF90eXBlPXBheWxvYWQuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICAgICAgYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPXBheWxvYWQubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1wYXlsb2FkLm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgICAgICBmbGFncz1wYXlsb2FkLmZsYWdzLAogICAgLy8gICAgICkKICAgIC8vICkKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk3MgogICAgLy8gc2VsZi5zY2hlZHVsZV9wYWdlW3BhZ2VfaW5kZXhdID0gcGFnZS5jb3B5KCkKICAgIGRpZyA4CiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTczCiAgICAvLyBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50ICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMTUKICAgIC8vIGFzc2VydCBldmVudF9pZCA9PSBzZWxmLmV2ZW50X2N1cnNvciwgZXJyLklOVkFMSURfRVZFTlRfQ1VSU09SCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGRpZyAzCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGN1cnNvcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIxNgogICAgLy8gZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoZXZlbnRfaWQpCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIGR1cAogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjE4CiAgICAvLyBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBkdXAKICAgIGV4dHJhY3QgOCAxCiAgICBidXJ5IDEwCiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2NwogICAgLy8gVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2Ni0zNzMKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lFRCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9SUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9SUkYpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX3RydWVAMTUKICAgIGRpZyA0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjgKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgcHVzaGludCA0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjYtMzczCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY5CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIHB1c2hpbnQgMTIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2Ni0zNzMKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lFRCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9SUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9SUkYpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX3RydWVAMTUKICAgIGRpZyA0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNzAKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIHB1c2hpbnQgMTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2Ni0zNzMKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lFRCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9SUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9SUkYpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX3RydWVAMTUKICAgIGRpZyA0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNzEKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICBwdXNoaW50IDE4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjYtMzczCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzcyCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICBwdXNoaW50IDUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2Ni0zNzMKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lFRCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9SUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9SUkYpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfZmFsc2VAMTYKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNToKICAgIGludGNfMSAvLyAxCgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX21lcmdlQDE3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIxNy0xMjE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfaXNfbm9uX2Nhc2goCiAgICAvLyAgICAgZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgLy8gKSwgZXJyLklOVkFMSURfRVZFTlRfVFlQRQogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIyMAogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X3R5cGUgIT0gYXJjNC5VSW50OChlbnVtcy5FVlRfSUVEKSwgZXJyLklOVkFMSURfRVZFTlRfVFlQRQogICAgZGlnIDgKICAgIHB1c2hieXRlcyAweDAxCiAgICBiIT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IHR5cGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM3NwogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKFVJbnQ2NChlbnVtcy5FVlRfUlIpLCBVSW50NjQoZW51bXMuRVZUX1JSRikpCiAgICBkaWcgNAogICAgcHVzaGludCAxMgogICAgPT0KICAgIGJueiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX3RydWVAMjEKICAgIGRpZyA0CiAgICBwdXNoaW50IDExCiAgICA9PQogICAgYnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9mYWxzZUAyMgoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDIxOgogICAgaW50Y18xIC8vIDEKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfbWVyZ2VAMjM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjIxCiAgICAvLyBpZiBzZWxmLl9ldmVudF9pc19yYXRlX3Jlc2V0KGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkpOgogICAgYnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfZWxzZV9ib2R5QDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4MAogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYub2JzZXJ2ZXIsIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyNSAvLyAweDUyM2E0ZDRmNDMyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIyNQogICAgLy8gc2VsZi5fYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkoZW50cnksIHBheWxvYWQpCiAgICBkaWcgNgogICAgZGlnIDIKICAgIGNhbGxzdWIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5CiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMjYKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE3MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgphcHBseV9ub25fY2FzaF9ldmVudF9lbHNlX2JvZHlANToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMjQKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgYiBhcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDYKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfZmFsc2VAMjI6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX21lcmdlQDIzCgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX2ZhbHNlQDE2OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9tZXJnZUAxNwoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50W3JvdXRpbmddKCkgLT4gdm9pZDoKYXBwZW5kX29ic2VydmVkX2Nhc2hfZXZlbnQ6CiAgICBpbnRjXzAgLy8gMAogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjI4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cG4gMgogICAgbGVuCiAgICBwdXNoaW50IDY1CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLk9ic2VydmVkQ2FzaEV2ZW50UmVxdWVzdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQ2CiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyNTcKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI1OAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyNTkKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzgKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTUwCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuX3N0YXR1c19pc19wZW5kaW5nX2llZCgpLCBlcnIuUEVORElOR19JRUQKICAgICEKICAgIGFzc2VydCAvLyBJRUQgbm90IHlldCBleGVjdXRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjM2CiAgICAvLyByZXR1cm4gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9DTE0pCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIHB1c2hpbnQgNQogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4NAogICAgLy8gYXNzZXJ0IHNlbGYuX3N1cHBvcnRzX29ic2VydmVkX2V2ZW50cygpLCBlcnIuT0JTRVJWRURfRVZFTlRfUkVRVUlSRUQKICAgIGFzc2VydCAvLyBPYnNlcnZlZCBldmVudCByZXF1aXJlZCB0byBleGVjdXRlIHRoaXMgYWN0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5ODUKICAgIC8vIGFzc2VydCBwYXlsb2FkLmV2ZW50X2lkID09IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQsIGVyci5JTlZBTElEX0VWRU5UX0lECiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICBzd2FwCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5ODYKICAgIC8vIGFzc2VydCBwYXlsb2FkLmV2ZW50X3R5cGUgPT0gYXJjNC5VSW50OChlbnVtcy5FVlRfUFIpLCBlcnIuSU5WQUxJRF9FVkVOVF9UWVBFCiAgICBkaWcgMQogICAgZXh0cmFjdCA4IDEKICAgIGR1cAogICAgY292ZXIgMwogICAgcHVzaGJ5dGVzIDB4MDMKICAgIGI9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTg3CiAgICAvLyBhc3NlcnQgcGF5bG9hZC5mbGFncyAmIFVJbnQ2NChlbnVtcy5GTEFHX0NBU0hfRVZFTlQpLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIHN3YXAKICAgIHB1c2hpbnQgNTcKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMSAvLyAxCiAgICAmCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5ODkKICAgIC8vIGlmIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgPiBVSW50NjQoMCk6CiAgICBieiBhcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5MQogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCAtIFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5MC05OTIKICAgIC8vIHByZXZpb3VzX2VudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KAogICAgLy8gICAgIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgLSBVSW50NjQoMSkKICAgIC8vICkKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTk0CiAgICAvLyBwcmV2aW91c19lbnRyeS5zY2hlZHVsZWRfdGltZSA8PSBwYXlsb2FkLnNjaGVkdWxlZF90aW1lCiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgNAogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgPD0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5My05OTUKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgcHJldmlvdXNfZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gcGF5bG9hZC5zY2hlZHVsZWRfdGltZQogICAgLy8gKSwgZXJyLklOVkFMSURfU09SVElORwogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIG11c3QgYmUgc29ydGVkIGluIHN0cmljdGx5IGFzY2VuZGluZyBvcmRlcgoKYXBwZW5kX29ic2VydmVkX2Nhc2hfZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTk3CiAgICAvLyBwYWdlX2luZGV4ID0gc2VsZi5fc2NoZWR1bGVfcGFnZV9pbmRleChzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTkzCiAgICAvLyByZXR1cm4gZXZlbnRfaWQgLy8gVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpCiAgICBwdXNoaW50IDE2CiAgICAvCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OTgKICAgIC8vIHBhZ2UgPSB0eXAuRXhlY3V0aW9uU2NoZWR1bGVQYWdlKCkKICAgIGJ5dGVjIDQ5IC8vIDB4MDAwMAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OTkKICAgIC8vIGlmIHBhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlOgogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA3CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VANQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAwMAogICAgLy8gcGFnZSA9IHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XS5jb3B5KCkKICAgIGRpZyA1CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidXJ5IDYKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX3BhZ2UgZW50cnkgZXhpc3RzCgphcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDAxCiAgICAvLyBhc3NlcnQgcGFnZS5sZW5ndGggPCBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGRpZyA0CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgMTYKICAgIDwKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMDYKICAgIC8vIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICBkaWcgNQogICAgZHVwCiAgICBleHRyYWN0IDkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAwNwogICAgLy8gYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIGRpZyAxCiAgICBleHRyYWN0IDE3IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMDgKICAgIC8vIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZGlnIDIKICAgIGV4dHJhY3QgMjUgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAwOQogICAgLy8gbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9cGF5bG9hZC5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIGRpZyAzCiAgICBleHRyYWN0IDMzIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMTAKICAgIC8vIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgZGlnIDQKICAgIGV4dHJhY3QgNDEgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAxMQogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIHVuY292ZXIgNQogICAgZXh0cmFjdCA0OSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDAzLTEwMTMKICAgIC8vIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgIGV2ZW50X2lkPXBheWxvYWQuZXZlbnRfaWQsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1wYXlsb2FkLmV2ZW50X3R5cGUsCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPXBheWxvYWQubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1wYXlsb2FkLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICBmbGFncz1wYXlsb2FkLmZsYWdzLAogICAgLy8gKQogICAgZGlnIDEwCiAgICBpdG9iCiAgICBkaWcgMTAKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMDItMTAxNAogICAgLy8gcGFnZS5hcHBlbmQoCiAgICAvLyAgICAgdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkoCiAgICAvLyAgICAgICAgIGV2ZW50X2lkPXBheWxvYWQuZXZlbnRfaWQsCiAgICAvLyAgICAgICAgIGV2ZW50X3R5cGU9cGF5bG9hZC5ldmVudF90eXBlLAogICAgLy8gICAgICAgICBzY2hlZHVsZWRfdGltZT1wYXlsb2FkLnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgICAgICBhY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPXBheWxvYWQucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9cGF5bG9hZC5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1wYXlsb2FkLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXBheWxvYWQubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgICAgIGZsYWdzPXBheWxvYWQuZmxhZ3MsCiAgICAvLyAgICAgKQogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAxNQogICAgLy8gc2VsZi5zY2hlZHVsZV9wYWdlW3BhZ2VfaW5kZXhdID0gcGFnZS5jb3B5KCkKICAgIGRpZyA2CiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAxNgogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjYzCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmNvbnRyYWN0X3NldF9kZWZhdWx0X3N0YXR1c1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X3NldF9kZWZhdWx0X3N0YXR1czoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyNjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo3NAogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYudHJ1c3RlZSwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDI2IC8vIDB4NTIzYTU0NTI1MzIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjc4CiAgICAvLyBzZWxmLmRlZmF1bHRlZCA9IGRlZmF1bHRlZAogICAgYnl0ZWMgNDcgLy8gImRlZmF1bHRlZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjc5CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyNjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmNvbnRyYWN0X2dldF9zdGF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X2dldF9zdGF0ZToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NgogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgZHVwCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyOTQKICAgIC8vIGNvbnRyYWN0X3R5cGU9YXJjNC5VSW50OChzZWxmLmNvbnRyYWN0X3R5cGUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgaW50Y18yIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjk2CiAgICAvLyB0b3RhbF91bml0cz1zZWxmLnRvdGFsX3VuaXRzLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyOTcKICAgIC8vIHJlc2VydmVkX3VuaXRzX3RvdGFsPXNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI5OAogICAgLy8gaW5pdGlhbF9leGNoYW5nZV9hbW91bnQ9c2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMCAvLyAiaW5pdGlhbF9leGNoYW5nZV9hbW91bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjk5CiAgICAvLyBldmVudF9jdXJzb3I9c2VsZi5ldmVudF9jdXJzb3IsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMDAKICAgIC8vIHNjaGVkdWxlX2VudHJ5X2NvdW50PXNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzAxCiAgICAvLyBvdXRzdGFuZGluZ19wcmluY2lwYWw9c2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMDIKICAgIC8vIGludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2U9c2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMDMKICAgIC8vIG5vbWluYWxfaW50ZXJlc3RfcmF0ZT1zZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMwNAogICAgLy8gYWNjcnVlZF9pbnRlcmVzdD1zZWxmLmFjY3J1ZWRfaW50ZXJlc3QsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMwNQogICAgLy8gY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleD1zZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMDYKICAgIC8vIGN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4PXNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTcgLy8gImN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMwNwogICAgLy8gcmVzZXJ2ZWRfaW50ZXJlc3Q9c2VsZi5yZXNlcnZlZF9pbnRlcmVzdCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzA4CiAgICAvLyByZXNlcnZlZF9wcmluY2lwYWw9c2VsZi5yZXNlcnZlZF9wcmluY2lwYWwsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjkzLTEzMDkKICAgIC8vIHJldHVybiB0eXAuS2VybmVsU3RhdGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZT1hcmM0LlVJbnQ4KHNlbGYuY29udHJhY3RfdHlwZSksCiAgICAvLyAgICAgc3RhdHVzPXNlbGYuc3RhdHVzLAogICAgLy8gICAgIHRvdGFsX3VuaXRzPXNlbGYudG90YWxfdW5pdHMsCiAgICAvLyAgICAgcmVzZXJ2ZWRfdW5pdHNfdG90YWw9c2VsZi5yZXNlcnZlZF91bml0c190b3RhbCwKICAgIC8vICAgICBpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudD1zZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50LAogICAgLy8gICAgIGV2ZW50X2N1cnNvcj1zZWxmLmV2ZW50X2N1cnNvciwKICAgIC8vICAgICBzY2hlZHVsZV9lbnRyeV9jb3VudD1zZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LAogICAgLy8gICAgIG91dHN0YW5kaW5nX3ByaW5jaXBhbD1zZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICBpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlPXNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSwKICAgIC8vICAgICBub21pbmFsX2ludGVyZXN0X3JhdGU9c2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgYWNjcnVlZF9pbnRlcmVzdD1zZWxmLmFjY3J1ZWRfaW50ZXJlc3QsCiAgICAvLyAgICAgY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleD1zZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgsCiAgICAvLyAgICAgY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXg9c2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCwKICAgIC8vICAgICByZXNlcnZlZF9pbnRlcmVzdD1zZWxmLnJlc2VydmVkX2ludGVyZXN0LAogICAgLy8gICAgIHJlc2VydmVkX3ByaW5jaXBhbD1zZWxmLnJlc2VydmVkX3ByaW5jaXBhbCwKICAgIC8vICkKICAgIHVuY292ZXIgMTQKICAgIGl0b2IKICAgIHVuY292ZXIgMTQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDEyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTEKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMAogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDkKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA4CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDYKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNAogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI4MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50W3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQ2CiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMjMKICAgIC8vIGlmIHNlbGYuZXZlbnRfY3Vyc29yID49IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQ6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgID49CiAgICBieiBjb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzI1CiAgICAvLyBldmVudF9pZD1zZWxmLmV2ZW50X2N1cnNvciwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMyNC0xMzM0CiAgICAvLyByZXR1cm4gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkoCiAgICAvLyAgICAgZXZlbnRfaWQ9c2VsZi5ldmVudF9jdXJzb3IsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1hcmM0LlVJbnQ4KDApLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPVVJbnQ2NCgwKSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249VUludDY0KDApLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPVVJbnQ2NCgwKSwKICAgIC8vICAgICBmbGFncz1VSW50NjQoMCksCiAgICAvLyApCiAgICBpdG9iCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzI2CiAgICAvLyBldmVudF90eXBlPWFyYzQuVUludDgoMCksCiAgICBieXRlYyA0MCAvLyAweDAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzI0LTEzMzQKICAgIC8vIHJldHVybiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1zZWxmLmV2ZW50X2N1cnNvciwKICAgIC8vICAgICBldmVudF90eXBlPWFyYzQuVUludDgoMCksCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9VUludDY0KDApLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9VUludDY0KDApLAogICAgLy8gICAgIGZsYWdzPVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMyNwogICAgLy8gc2NoZWR1bGVkX3RpbWU9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMjQtMTMzNAogICAgLy8gcmV0dXJuIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgIGV2ZW50X2lkPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgLy8gICAgIGV2ZW50X3R5cGU9YXJjNC5VSW50OCgwKSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1VSW50NjQoMCksCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1VSW50NjQoMCksCiAgICAvLyAgICAgZmxhZ3M9VUludDY0KDApLAogICAgLy8gKQogICAgaXRvYgogICAgc3dhcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0Cgpjb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnRfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnRANDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMzUKICAgIC8vIHJldHVybiBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoc2VsZi5ldmVudF9jdXJzb3IpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMxMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIGNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudF9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudEA0CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuY29udHJhY3RfdXBkYXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfdXBkYXRlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE1OS0xNjIKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBncmFudHMgdGhlIHVwZGF0ZSBwZXJtaXNzaW9ucyB0byB0aGUgQXJyYW5nZXIuCiAgICAvLyAjIOKaoO+4jyBXQVJOSU5HOiBBcHBsaWNhdGlvbiB1cGRhdGVzIG11c3QgYmUgZXhlY3V0ZWQgVkVSWSBjYXJlZnVsbHksIGFzIHRoZXkKICAgIC8vICMgbWlnaHQgaW50cm9kdWNlIGJyZWFraW5nIGNoYW5nZXMuCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3JvdGF0ZV9hcnJhbmdlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfcm90YXRlX2FycmFuZ2VyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzgKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE3OQogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IG5ld19hcnJhbmdlcgogICAgYnl0ZWMgMTggLy8gMHg1MjNhNDE1MjUyMjMKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTgwCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfc2V0X29wX2RhZW1vbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfc2V0X29wX2RhZW1vbjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTk2CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxOTcKICAgIC8vIHNlbGYub3BfZGFlbW9uLnZhbHVlID0gYWRkcmVzcwogICAgYnl0ZWMgMjcgLy8gMHg1MjNhNGY1MDQ0MjMKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTk4CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfYXNzaWduX3JvbGVbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2Fzc2lnbl9yb2xlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIHB1c2hpbnQgMTYKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuUm9sZVZhbGlkaXR5CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjIyCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjMKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI0CiAgICAvLyBzZWxmLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpKQogICAgYnRvaQogICAgZHVwbiAyCiAgICBjYWxsc3ViIF9hc3NlcnRfdmFsaWRfcm9sZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwMgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUik6CiAgICBwdXNoaW50IDIwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDMKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDE4IC8vIDB4NTIzYTQxNTI1MjIzCiAgICBkaWcgMwogICAgYXBwX2dsb2JhbF9wdXQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI2CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA2CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgNDAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwNwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjMgLy8gMHg1MjNhNGQ0ZTQ3MjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwOAogICAgLy8gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjUKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMiAvLyAweDUyM2E1MDU5NDQyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTEyCiAgICAvLyBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI1CiAgICAvLyBzZWxmLl9zZXRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIHZhbGlkaXR5KQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTQKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNjAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI2IC8vIDB4NTIzYTU0NTI1MzIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTYKICAgIC8vIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNQogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE4CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNzAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTkKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIxIC8vIDB4NTIzYTQxNTU1NDIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjAKICAgIC8vIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI1CiAgICAvLyBzZWxmLl9zZXRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIHZhbGlkaXR5KQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMTE6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIyCiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKToKICAgIGR1cAogICAgcHVzaGludCA4MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjMKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYub2JzZXJ2ZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjUgLy8gMHg1MjNhNGQ0ZjQzMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyNAogICAgLy8gc2VsZi5vYnNlcnZlcltyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19yZXZva2Vfcm9sZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfcmV2b2tlX3JvbGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjQ3CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNDgKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjQ5CiAgICAvLyBzZWxmLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpKQogICAgYnRvaQogICAgZHVwbiAyCiAgICBjYWxsc3ViIF9hc3NlcnRfdmFsaWRfcm9sZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyNwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgIT0gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBkdXAKICAgIHB1c2hpbnQgMjAKICAgICE9CiAgICBhc3NlcnQgLy8gSW52YWxpZCByb2xlIGlkZW50aWZpZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjgKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIHB1c2hpbnQgNDAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyOQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmFjY291bnRfbWFuYWdlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMyAvLyAweDUyM2E0ZDRlNDcyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMwCiAgICAvLyBkZWwgc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1MQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIyIC8vIDB4NTIzYTUwNTk0NDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzQKICAgIC8vIGRlbCBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1MAogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzYKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNjAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjYgLy8gMHg1MjNhNTQ1MjUzMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzOAogICAgLy8gZGVsIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTAKICAgIC8vIHNlbGYuX2RlbGV0ZV9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcykKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQwCiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNzAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMSAvLyAweDUyM2E0MTU1NTQyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQyCiAgICAvLyBkZWwgc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjUwCiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgODAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ1CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYub2JzZXJ2ZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjUgLy8gMHg1MjNhNGQ0ZjQzMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NgogICAgLy8gZGVsIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2NvbnRyYWN0X3N1c3BlbnNpb25bcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2NvbnRyYWN0X3N1c3BlbnNpb246CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjUzCiAgICAvLyBAYXJjNC5hYmltZXRob2QgICMgVE9ETzogVXBkYXRlIHNwZWNzIGFuZCBhZGQgdGVzdAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo3NwogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYXV0aG9yaXR5LCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjEgLy8gMHg1MjNhNDE1NTU0MjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNjkKICAgIC8vIHNlbGYuYXNzZXRfc3VzcGVuZGVkID0gc3VzcGVuZGVkCiAgICBieXRlYyAzMyAvLyAiYXNzZXRfc3VzcGVuZGVkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNzAKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kICAjIFRPRE86IFVwZGF0ZSBzcGVjcyBhbmQgYWRkIHRlc3QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9hcnJhbmdlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X2FycmFuZ2VyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4MwogICAgLy8gcmV0dXJuIHNlbGYuYXJyYW5nZXIudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOCAvLyAweDUyM2E0MTUyNTIyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYWRkcmVzc19yb2xlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg1CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwMwogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hY2NvdW50X21hbmFnZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjMgLy8gMHg1MjNhNGQ0ZTQ3MjMKICAgIGRpZyAxCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwNAogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5wcmltYXJ5X2RlYWxlciwgYWRkcmVzcyksCiAgICBieXRlYyAyMiAvLyAweDUyM2E1MDU5NDQyMwogICAgZGlnIDIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA1CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnRydXN0ZWUsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjYgLy8gMHg1MjNhNTQ1MjUzMjMKICAgIGRpZyAzCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwNgogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIGFkZHJlc3MpLAogICAgYnl0ZWMgMjEgLy8gMHg1MjNhNDE1NTU0MjMKICAgIGRpZyA0CiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwNwogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5vYnNlcnZlciwgYWRkcmVzcyksCiAgICBieXRlYyAyNSAvLyAweDUyM2E0ZDRmNDMyMwogICAgdW5jb3ZlciA1CiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlYyA0MCAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciA2CiAgICBzZXRiaXQKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDUKICAgIHNldGJpdAogICAgcHVzaGludCAyCiAgICB1bmNvdmVyIDQKICAgIHNldGJpdAogICAgcHVzaGludCAzCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgcHVzaGludCA0CiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOAogICAgLy8gcm9sZSA9IHJvbGVfaWQuYXNfdWludDY0KCkKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjkKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGUpCiAgICBkdXAKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzMxCiAgICAvLyBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKToKICAgIHB1c2hpbnRzIDIwIDQwIDUwIDYwIDcwIDgwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzMwLTM2MQogICAgLy8gbWF0Y2ggcm9sZToKICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKToKICAgIC8vICAgICAgICAgcmV0dXJuIHR5cC5Sb2xlVmFsaWRpdHkoCiAgICAvLyAgICAgICAgICAgICByb2xlX3ZhbGlkaXR5X3N0YXJ0PVVJbnQ2NCgwKSwgcm9sZV92YWxpZGl0eV9lbmQ9VUludDY0KDApCiAgICAvLyAgICAgICAgICkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSk6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSk6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgXzoKICAgIC8vICAgICAgICAgb3AuZXJyKGVyci5JTlZBTElEX1JPTEUpCiAgICB1bmNvdmVyIDYKICAgIG1hdGNoIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMEAyIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMUAzIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMkA0IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfM0A1IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNEA2IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzYxCiAgICAvLyBvcC5lcnIoZXJyLklOVkFMSURfUk9MRSkKICAgIGVyciAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV81QDc6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzU3CiAgICAvLyBzZWxmLm9ic2VydmVyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDI1IC8vIDB4NTIzYTRkNGY0MzIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzU2LTM1OAogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM1OQogICAgLy8gcmV0dXJuIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzRANjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTIKICAgIC8vIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDIxIC8vIDB4NTIzYTQxNTU1NDIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzUxLTM1MwogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTQKICAgIC8vIHJldHVybiBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzNANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNDcKICAgIC8vIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAyNiAvLyAweDUyM2E1NDUyNTMyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM0Ni0zNDgKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM0OQogICAgLy8gcmV0dXJuIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzJANDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNDIKICAgIC8vIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMjIgLy8gMHg1MjNhNTA1OTQ0MjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNDEtMzQzCiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzQ0CiAgICAvLyByZXR1cm4gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzFAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzcKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDIzIC8vIDB4NTIzYTRkNGU0NzIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzM2LTMzOAogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzkKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzBAMjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzItMzM0CiAgICAvLyByZXR1cm4gdHlwLlJvbGVWYWxpZGl0eSgKICAgIC8vICAgICByb2xlX3ZhbGlkaXR5X3N0YXJ0PVVJbnQ2NCgwKSwgcm9sZV92YWxpZGl0eV9lbmQ9VUludDY0KDApCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB2b2lkOgpfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZDoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNgogICAgLy8gZGVmIF9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHNlbGYsIGhvbGRpbmdfYWRkcmVzczogQWNjb3VudCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI4CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZCwgZXJyLlNVU1BFTkRFRAogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCAzODQKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIFN1c3BlbmRlZCBvcGVyYXRpb25zCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5fc2V0dGxlX3Bvc2l0aW9uKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NCwgdWludDY0Ogpfc2V0dGxlX3Bvc2l0aW9uOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjQ0CiAgICAvLyBkZWYgX3NldHRsZV9wb3NpdGlvbihzZWxmLCBob2xkaW5nX2FkZHJlc3M6IEFjY291bnQpIC0+IHR1cGxlW1VJbnQ2NCwgVUludDY0XToKICAgIHByb3RvIDEgMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjYxCiAgICAvLyBwb3NpdGlvbiA9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNvcHkoKQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo2My02NQogICAgLy8gIyBDb21wdXRlIHRoZSBpbmNyZW1lbnRhbCBwZXItdW5pdCBmaXhlZC1wb2ludCBpbnRlcmVzdCBhbmQgcHJpbmNpcGFsIGFjY3J1ZWQKICAgIC8vICMgc2luY2UgdGhpcyBhY2NvdW50J3MgbGFzdCBjaGVja3BvaW50LgogICAgLy8gaW50ZXJlc3RfZGVsdGEgPSBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggLSBwb3NpdGlvbi5pbnRlcmVzdF9jaGVja3BvaW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCBleGlzdHMKICAgIGRpZyAxCiAgICBwdXNoaW50IDU3CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjY3CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IC0gcG9zaXRpb24ucHJpbmNpcGFsX2NoZWNrcG9pbnQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggZXhpc3RzCiAgICBkaWcgMgogICAgcHVzaGludCA2NQogICAgZXh0cmFjdF91aW50NjQKICAgIC0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3MwogICAgLy8gaW50ZXJlc3RfZGVsdGEsIHBvc2l0aW9uLnVuaXRzLCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICBkaWcgMgogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjcwLTc0CiAgICAvLyAjIENvbnZlcnQgdGhlIHBlci11bml0IGZpeGVkLXBvaW50IGRlbHRhcyBpbnRvIGFic29sdXRlIGNsYWltYWJsZSBhbW91bnRzCiAgICAvLyAjIHVzaW5nIHRoZSBhY2NvdW50J3MgYWN0aXZlIHVuaXRzLgogICAgLy8gY2xhaW1hYmxlX2ludGVyZXN0ID0gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgaW50ZXJlc3RfZGVsdGEsIHBvc2l0aW9uLnVuaXRzLCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICAvLyApCiAgICB1bmNvdmVyIDMKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzYKICAgIC8vIHByaW5jaXBhbF9kZWx0YSwgcG9zaXRpb24udW5pdHMsIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3NS03NwogICAgLy8gY2xhaW1hYmxlX3ByaW5jaXBhbCA9IHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIHByaW5jaXBhbF9kZWx0YSwgcG9zaXRpb24udW5pdHMsIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUKICAgIC8vICkKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzktODEKICAgIC8vICMgQWNjcnVlIHRoZSBjbGFpbWFibGUgYW1vdW50cyB0byB0aGUgYWNjb3VudCBwb3NpdGlvbiBhbmQgbWFrZSB0aGVtIGF2YWlsYWJsZQogICAgLy8gIyBmb3Igd2l0aGRyYXdhbC4KICAgIC8vIHBvc2l0aW9uLmNsYWltYWJsZV9pbnRlcmVzdCArPSBjbGFpbWFibGVfaW50ZXJlc3QKICAgIGRpZyAyCiAgICBwdXNoaW50IDczCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDIKICAgICsKICAgIGl0b2IKICAgIHVuY292ZXIgMwogICAgc3dhcAogICAgcmVwbGFjZTIgNzMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo4MgogICAgLy8gcG9zaXRpb24uY2xhaW1hYmxlX3ByaW5jaXBhbCArPSBjbGFpbWFibGVfcHJpbmNpcGFsCiAgICBkdXAKICAgIHB1c2hpbnQgODEKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgKwogICAgaXRvYgogICAgcmVwbGFjZTIgODEKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo4NC04NgogICAgLy8gIyBBZHZhbmNlIHRoZSBhY2NvdW50J3MgcGVyLXVuaXQgZml4ZWQtcG9pbnQgY2hlY2twb2ludHMgdG8gdGhlIGN1cnJlbnQgZ2xvYmFsCiAgICAvLyAjIHBlci11bml0IGZpeGVkLXBvaW50IGdsb2JhbCBpbmRpY2VzLgogICAgLy8gcG9zaXRpb24uaW50ZXJlc3RfY2hlY2twb2ludCA9IHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggZXhpc3RzCiAgICBpdG9iCiAgICByZXBsYWNlMiA1NwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojg3CiAgICAvLyBwb3NpdGlvbi5wcmluY2lwYWxfY2hlY2twb2ludCA9IHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggZXhpc3RzCiAgICBpdG9iCiAgICByZXBsYWNlMiA2NQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojg5LTkwCiAgICAvLyAjIEFkdmFuY2UgdGhlIGFjY291bnQncyBldmVudCBjdXJzb3IgdG8gdGhlIGN1cnJlbnQgZ2xvYmFsIGV2ZW50IGN1cnNvci4KICAgIC8vIHBvc2l0aW9uLnNldHRsZWRfY3Vyc29yID0gc2VsZi5ldmVudF9jdXJzb3IKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaXRvYgogICAgcmVwbGFjZTIgNDkKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo5Mi05NAogICAgLy8gIyBVcGRhdGUgdGhlIGFjY291bnQgcG9zaXRpb24gYW5kIHJldHVybiB0aGUgbmV3bHkgYWNjcnVlZCBjbGFpbWFibGUgYW1vdW50cwogICAgLy8gIyBhZGRlZCB0byB0aGUgdG90YWwgcG9zaXRpb24ncyBjbGFpbWFibGUgYW1vdW50cy4KICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gcG9zaXRpb24uY29weSgpCiAgICB1bmNvdmVyIDMKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo5NQogICAgLy8gcmV0dXJuIGNsYWltYWJsZV9pbnRlcmVzdCwgY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQoaG9sZGluZ19hZGRyZXNzOiBieXRlcykgLT4gdm9pZDoKX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQ6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6OTcKICAgIC8vIGRlZiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZChzZWxmLCBob2xkaW5nX2FkZHJlc3M6IEFjY291bnQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzOAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTAwCiAgICAvLyBpZiBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKToKICAgIGJ6IF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwMQogICAgLy8gcmV0dXJuCiAgICByZXRzdWIKCl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDMKICAgIC8vIHBvc2l0aW9uID0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY29weSgpCiAgICBmcmFtZV9kaWcgMgogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA0CiAgICAvLyBpZiBwb3NpdGlvbi5yZXNlcnZlZF91bml0cyA9PSBVSW50NjQoMCk6CiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIGJueiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZF9hZnRlcl9pZl9lbHNlQDQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDUKICAgIC8vIHJldHVybgogICAgcmV0c3ViCgpfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZF9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA4CiAgICAvLyBwb3NpdGlvbi51bml0cyArPSBhY3RpdmF0ZWRfdW5pdHMKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDMKICAgICsKICAgIGl0b2IKICAgIHJlcGxhY2UyIDMyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA5CiAgICAvLyBwb3NpdGlvbi5yZXNlcnZlZF91bml0cyA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGl0b2IKICAgIHJlcGxhY2UyIDQwCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTEwCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHBvc2l0aW9uLmNvcHkoKQogICAgZnJhbWVfZGlnIDIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTEKICAgIC8vIGFzc2VydCBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID49IGFjdGl2YXRlZF91bml0cywgZXJyLk9WRVJfRElTVFJJQlVUSU9OCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIGV4aXN0cwogICAgZHVwCiAgICBkaWcgMgogICAgPj0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgcmVtYWluaW5nIEQtQVNBIHVuaXRzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTEyCiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIC09IGFjdGl2YXRlZF91bml0cwogICAgc3dhcAogICAgLQogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9zY2FsZWRfbXVsX2RpdihtdWx0aXBsaWNhbmQ6IHVpbnQ2NCwgbXVsdGlwbGllcjogdWludDY0LCBkaXZpc29yOiB1aW50NjQpIC0+IHVpbnQ2NDoKX3NjYWxlZF9tdWxfZGl2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTU2LTE1OAogICAgLy8gZGVmIF9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLCBtdWx0aXBsaWNhbmQ6IFVJbnQ2NCwgbXVsdGlwbGllcjogVUludDY0LCBkaXZpc29yOiBVSW50NjQKICAgIC8vICkgLT4gVUludDY0OgogICAgcHJvdG8gMyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjAKICAgIC8vIGlmIG11bHRpcGxpY2FuZCA9PSBVSW50NjQoMCkgb3IgbXVsdGlwbGllciA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTMKICAgIGJ6IF9zY2FsZWRfbXVsX2Rpdl9pZl9ib2R5QDIKICAgIGZyYW1lX2RpZyAtMgogICAgYm56IF9zY2FsZWRfbXVsX2Rpdl9hZnRlcl9pZl9lbHNlQDMKCl9zY2FsZWRfbXVsX2Rpdl9pZl9ib2R5QDI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjEKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9zY2FsZWRfbXVsX2Rpdl9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjIKICAgIC8vIGhpZ2gsIGxvdyA9IG9wLm11bHcobXVsdGlwbGljYW5kLCBtdWx0aXBsaWVyKQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIG11bHcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2MwogICAgLy8gcmV0dXJuIG9wLmRpdncoaGlnaCwgbG93LCBkaXZpc29yKQogICAgZnJhbWVfZGlnIC0xCiAgICBkaXZ3CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYW1vdW50X3RvX2luZGV4X2RlbHRhKGFtb3VudDogdWludDY0KSAtPiB1aW50NjQ6Cl9hbW91bnRfdG9faW5kZXhfZGVsdGE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjUKICAgIC8vIGRlZiBfYW1vdW50X3RvX2luZGV4X2RlbHRhKHNlbGYsIGFtb3VudDogVUludDY0KSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2NwogICAgLy8gaWYgYW1vdW50ID09IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMQogICAgYm56IF9hbW91bnRfdG9faW5kZXhfZGVsdGFfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjgKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9hbW91bnRfdG9faW5kZXhfZGVsdGFfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTY5CiAgICAvLyBhc3NlcnQgc2VsZi50b3RhbF91bml0cyA+IFVJbnQ2NCgwKSwgZXJyLk5PX1VOSVRTCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgZHVwCiAgICBhc3NlcnQgLy8gTm8gRC1BU0EgdW5pdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE3MAogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KGFtb3VudCwgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwgc2VsZi50b3RhbF91bml0cykKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2luZGV4X2RlbHRhX3RvX2Ftb3VudChpbmRleF9kZWx0YTogdWludDY0KSAtPiB1aW50NjQ6Cl9pbmRleF9kZWx0YV90b19hbW91bnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNzIKICAgIC8vIGRlZiBfaW5kZXhfZGVsdGFfdG9fYW1vdW50KHNlbGYsIGluZGV4X2RlbHRhOiBVSW50NjQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTc5CiAgICAvLyBpZiBpbmRleF9kZWx0YSA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGJueiBfaW5kZXhfZGVsdGFfdG9fYW1vdW50X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTgwCiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfaW5kZXhfZGVsdGFfdG9fYW1vdW50X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE4MgogICAgLy8gc2VsZi50b3RhbF91bml0cywKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxODQKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxODEtMTg1CiAgICAvLyByZXR1cm4gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgc2VsZi50b3RhbF91bml0cywKICAgIC8vICAgICBpbmRleF9kZWx0YSwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2dldF9zY2hlZHVsZV9lbnRyeShldmVudF9pZDogdWludDY0KSAtPiBieXRlczoKX2dldF9zY2hlZHVsZV9lbnRyeToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIwNQogICAgLy8gZGVmIF9nZXRfc2NoZWR1bGVfZW50cnkoc2VsZiwgZXZlbnRfaWQ6IFVJbnQ2NCkgLT4gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnk6CiAgICBwcm90byAxIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIwNwogICAgLy8gYXNzZXJ0IGV2ZW50X2lkIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgPgogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgaWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE5MwogICAgLy8gcmV0dXJuIGV2ZW50X2lkIC8vIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDE2CiAgICAvCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMDkKICAgIC8vIGFzc2VydCBwYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxOTcKICAgIC8vIHJldHVybiBldmVudF9pZCAlIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDE2CiAgICAlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMTIKICAgIC8vIGFzc2VydCBvZmZzZXQgPCBwYWdlLmxlbmd0aCwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBwdXNoaW50IDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgMQogICAgPgogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjEzCiAgICAvLyByZXR1cm4gcGFnZVtvZmZzZXRdLmNvcHkoKQogICAgcHVzaGludCA2NQogICAgKgogICAgcHVzaGludCAyCiAgICArCiAgICBwdXNoaW50IDY1CiAgICBib3hfZXh0cmFjdAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKGNvbnRyYWN0X3R5cGU6IHVpbnQ2NCwgZXZlbnRfdHlwZTogdWludDY0KSAtPiB2b2lkOgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTYtMzE4CiAgICAvLyBkZWYgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIHNlbGYsIGNvbnRyYWN0X3R5cGU6IFVJbnQ2NCwgZXZlbnRfdHlwZTogVUludDY0CiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1Ny0yNTgKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTAKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTctMjU4CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTEKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgaW50Y18yIC8vIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1Ny0yNTgKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1MgogICAgLy8gVUludDY0KGVudW1zLkVWVF9NRCksCiAgICBwdXNoaW50IDE5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTctMjU4CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTMKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgcHVzaGludCAxMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU3LTI1OAogICAgLy8gIyBDaGVjayBjb21tb24gZXZlbnRzIGZpcnN0CiAgICAvLyBpZiBldmVudF90eXBlIGluIGNvbW1vbl9ldmVudHM6CiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU0CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICBwdXNoaW50IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTctMjU4CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUA3CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU5CiAgICAvLyByZXR1cm4gVHJ1ZQogICAgaW50Y18xIC8vIDEKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzIwLTMyMgogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICByZXRzdWIKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNjEtMjYyCiAgICAvLyAjIENvbnRyYWN0LXNwZWNpZmljIGFkZGl0aW9uYWwgZXZlbnRzCiAgICAvLyBpZiBjb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9QQU0pOgogICAgZnJhbWVfZGlnIC0yCiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjYzLTI2NAogICAgLy8gIyBQQU0gb25seSBzdXBwb3J0cyBjb21tb24gZXZlbnRzCiAgICAvLyByZXR1cm4gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMjAtMzIyCiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNjYKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0xBTSkgb3IgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2Ni0yNjgKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0xBTSkgb3IgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoCiAgICAvLyAgICAgZW51bXMuQ1RfTkFNCiAgICAvLyApOgogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDExCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMgogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDE2CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUAxMToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2OS0yNzMKICAgIC8vICMgTEFNL05BTSBhZGQ6IFBSLCBJUENCCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjcxCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjY5LTI3MwogICAgLy8gIyBMQU0vTkFNIGFkZDogUFIsIElQQ0IKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDEzCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3MgogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIHB1c2hpbnQgMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2OS0yNzMKICAgIC8vICMgTEFNL05BTSBhZGQ6IFBSLCBJUENCCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICkKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF9mYWxzZUAxNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAxMzoKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMjAtMzIyCiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDE0OgogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMyMC0zMjIKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMTY6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzUKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTik6CiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMjMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3Ni0yODEKICAgIC8vICMgQU5OIGFkZHM6IFBSLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjc4CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjc2LTI4MQogICAgLy8gIyBBTk4gYWRkczogUFIsIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDIwCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIHB1c2hpbnQgMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3Ni0yODEKICAgIC8vICMgQU5OIGFkZHM6IFBSLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyMAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODAKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIHB1c2hpbnQgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjc2LTI4MQogICAgLy8gIyBBTk4gYWRkczogUFIsIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDIxCgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDIwOgogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMyMC0zMjIKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMjE6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzIwLTMyMgogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAyMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MwogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfTEFYKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA0CiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMzEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4NC0yOTAKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUiksCiAgICBwdXNoaW50IDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4NC0yOTAKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjgKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjg3CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjg0LTI5MAogICAgLy8gIyBMQVggYWRkczogUFIsIFBJLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyOAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODgKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICBwdXNoaW50IDE4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODQtMjkwCiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDI4CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODQtMjkwCiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDI5CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDI4OgogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMyMC0zMjIKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMjk6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzIwLTMyMgogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAzMToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI5MgogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQ0xNKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA1CiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMzMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI5My0yOTQKICAgIC8vICMgQ0xNIGFkZHM6IFBSCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1BSKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDMKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMjAtMzIyCiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDMzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk2CiAgICAvLyByZXR1cm4gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMjAtMzIyCiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5faXNfZHluYW1pY19hbm51aXR5KCkgLT4gdWludDY0OgpfaXNfZHluYW1pY19hbm51aXR5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM4CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzgtMzM5CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIC8vIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGJ6IF9pc19keW5hbWljX2FubnVpdHlfYm9vbF9mYWxzZUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzkKICAgIC8vIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzNCAvLyAiZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM4LTMzOQogICAgLy8gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICAvLyBhbmQgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBieiBfaXNfZHluYW1pY19hbm51aXR5X2Jvb2xfZmFsc2VAMwogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMzNy0zNDAKICAgIC8vIHJldHVybiAoCiAgICAvLyAgICAgc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICAvLyAgICAgYW5kIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgLy8gKQogICAgcmV0c3ViCgpfaXNfZHluYW1pY19hbm51aXR5X2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzctMzQwCiAgICAvLyByZXR1cm4gKAogICAgLy8gICAgIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKQogICAgLy8gICAgIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIC8vICkKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KGVudHJ5OiBieXRlcykgLT4gdWludDY0LCBieXRlczoKX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozODMKICAgIC8vIGRlZiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudChzZWxmLCBlbnRyeTogdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzkyCiAgICAvLyBlbnRyeS5hY2NydWFsX2ZhY3RvciA9PSBVSW50NjQoMCkKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAxNwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzkyLTM5NAogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGJ6IF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2lmX2JvZHlAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzkzCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzkyLTM5NAogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGJ6IF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2lmX2JvZHlAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzk0CiAgICAvLyBvciBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPT0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzkyLTM5NAogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGJueiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudF9hZnRlcl9pZl9lbHNlQDQKCl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2lmX2JvZHlAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NgogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2RpZyAtMQogICAgdW5jb3ZlciAyCiAgICByZXRzdWIKCl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5OAogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5OQogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQwMAogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5Ny00MDEKICAgIC8vIGFjY3J1ZWQgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICAvLyAgICAgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICkKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MDUKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MDItNDA2CiAgICAvLyByZXR1cm4gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgYWNjcnVlZCwKICAgIC8vICAgICBlbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICBmcmFtZV9kaWcgLTEKICAgIHVuY292ZXIgMgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yKGRpc2NvdW50X2ZhY3RvcjogdWludDY0LCByZWRlbXB0aW9uX2ZhY3RvcjogdWludDY0KSAtPiB1aW50NjQ6Cl9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ2NS00NjkKICAgIC8vIGRlZiBfZGlzY291bnRfYW5udWl0eV9mYWN0b3IoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBkaXNjb3VudF9mYWN0b3I6IFVJbnQ2NCwKICAgIC8vICAgICByZWRlbXB0aW9uX2ZhY3RvcjogVUludDY0LAogICAgLy8gKSAtPiBVSW50NjQ6CiAgICBwcm90byAyIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3MQogICAgLy8gaWYgcmVkZW1wdGlvbl9mYWN0b3IgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0xCiAgICBibnogX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDcyCiAgICAvLyByZXR1cm4gZGlzY291bnRfZmFjdG9yCiAgICBmcmFtZV9kaWcgLTIKICAgIHJldHN1YgoKX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3MwogICAgLy8gcGVyaW9kX3JhdGUgPSBzZWxmLmZpeGVkX3BvaW50X3NjYWxlICsgc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzQKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzMtNDc3CiAgICAvLyBwZXJpb2RfcmF0ZSA9IHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgKyBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICByZWRlbXB0aW9uX2ZhY3RvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICBkaWcgMgogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgICsKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3OAogICAgLy8gYXNzZXJ0IHBlcmlvZF9yYXRlID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGR1cAogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDgxCiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDc5LTQ4MwogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIGRpc2NvdW50X2ZhY3RvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gICAgIHBlcmlvZF9yYXRlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkoZW50cnk6IGJ5dGVzLCBwYXlsb2FkOiBieXRlcykgLT4gYnl0ZXMsIGJ5dGVzOgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MTYtNjE4CiAgICAvLyBkZWYgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5KAogICAgLy8gICAgIHNlbGYsIGVudHJ5OiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSwgcGF5bG9hZDogdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0CiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAyIDIKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjI2CiAgICAvLyBhc3NlcnQgZW50cnkuZXZlbnRfaWQgPT0gc2VsZi5ldmVudF9jdXJzb3IsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGN1cnNvcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjI3CiAgICAvLyBhc3NlcnQgZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsIGVyci5OT19EVUVfQ0FTSEZMT1cKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPD0KICAgIGFzc2VydCAvLyBObyBkdWUgY2FzaGZsb3cgdG8gcGF5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MjkKICAgIC8vIGV2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYzMAogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX0lFRCk6CiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGR1cAogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM4CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYzMS02MzMKICAgIC8vICMgSUVEIGZpbmFsaXplcyBpc3N1YW5jZTogcmVzZXJ2ZWQgdW5pdHMgYmVjb21lIGFjdGl2YXRhYmxlIGFuZCB0aGUKICAgIC8vICMgc2NoZWR1bGUncyBpbml0aWFsIGNvbnRyYWN0dWFsIHN0YXRlIGJlY29tZXMgbGl2ZS4KICAgIC8vIGFzc2VydCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzUKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPT0gc2VsZi50b3RhbF91bml0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM0LTYzNgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID09IHNlbGYudG90YWxfdW5pdHMKICAgIC8vICksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9JTkNPTVBMRVRFCiAgICBhc3NlcnQgLy8gUHJpbWFyeSBkaXN0cmlidXRpb24gaXMgbm90IGNvbXBsZXRlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzcKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM4CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzkKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAzMwogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NDAKICAgIC8vIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjQxCiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NDIKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0MwogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX0FDVElWRSkKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgMTAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDU0CiAgICAvLyBhc3NlcnQgZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSA9PSBVSW50NjQoZW51bXMuRVZUX0lFRCksIGVyci5OT1RfRVZUX0lFRAogICAgZnJhbWVfZGlnIDExCiAgICBhc3NlcnQgLy8gTm90IElFRCBldmVudAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDU1CiAgICAvLyByZXR1cm4gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0NC02NDgKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1zZWxmLl9lbnRyeV9pZWRfYW1vdW50KGVudHJ5KSwKICAgIC8vICAgICBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0NwogICAgLy8gc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0NC02NDgKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1zZWxmLl9lbnRyeV9pZWRfYW1vdW50KGVudHJ5KSwKICAgIC8vICAgICBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICAvLyApCiAgICBjYWxsc3ViIF9lbWl0X2V4ZWN1dGlvbl9ldmVudAogICAgZHVwCiAgICBmcmFtZV9idXJ5IC0yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NDkKICAgIC8vIHJldHVybgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM4CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE1MAogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1MgogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ICs9IHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBmcmFtZV9idXJ5IC0yCiAgICArCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1NAogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1JSKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCAxMgogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMTAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1OAogICAgLy8gcGF5bG9hZC5vYnNlcnZlZF9yYXRlLAogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjU5CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzNiAvLyAicmF0ZV9yZXNldF9tdWx0aXBsaWVyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2MAogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1NS02NjEKICAgIC8vICMgUlIgZGVyaXZlcyB0aGUgbmV4dCByYXRlIGZyb20gYW4gb2JzZXJ2ZWQgb3JhY2xlIHZhbHVlIHBsdXMgdGhlCiAgICAvLyAjIGNvbnRyYWN0IHNwcmVhZCAvIG11bHRpcGxpZXIgdGVybXMsIHRoZW4gZW5mb3JjZXMgZmxvb3IgYW5kIGNhcC4KICAgIC8vIG9ic2VydmVkX3JhdGUgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBwYXlsb2FkLm9ic2VydmVkX3JhdGUsCiAgICAvLyAgICAgc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICkKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjMKICAgIC8vIG9ic2VydmVkX3JhdGUgKyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzUgLy8gInJhdGVfcmVzZXRfc3ByZWFkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkIGV4aXN0cwogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDQKICAgIC8vIGlmIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgYW5kIHJhdGUgPCBzZWxmLnJhdGVfcmVzZXRfZmxvb3I6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzggLy8gImhhc19yYXRlX3Jlc2V0X2Zsb29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmhhc19yYXRlX3Jlc2V0X2Zsb29yIGV4aXN0cwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMSAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X2Zsb29yIGV4aXN0cwogICAgZnJhbWVfZGlnIDYKICAgID4KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDUKICAgIC8vIHJhdGUgPSBzZWxmLnJhdGVfcmVzZXRfZmxvb3IKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMSAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDYKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfZmxvb3IgZXhpc3RzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1NToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc0NgogICAgLy8gaWYgc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgYW5kIHJhdGUgPiBzZWxmLnJhdGVfcmVzZXRfY2FwOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDM5IC8vICJoYXNfcmF0ZV9yZXNldF9jYXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwIGV4aXN0cwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTgKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMiAvLyAicmF0ZV9yZXNldF9jYXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9jYXAgZXhpc3RzCiAgICBmcmFtZV9kaWcgNgogICAgPAogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc0NwogICAgLy8gcmF0ZSA9IHNlbGYucmF0ZV9yZXNldF9jYXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMiAvLyAicmF0ZV9yZXNldF9jYXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSA2CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X2NhcCBleGlzdHMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjYyCiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IHNlbGYuX2NsYW1wX3JhdGUoCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjItNjY0CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IHNlbGYuX2NsYW1wX3JhdGUoCiAgICAvLyAgICAgb2JzZXJ2ZWRfcmF0ZSArIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQKICAgIC8vICkKICAgIGZyYW1lX2RpZyA2CiAgICBhcHBfZ2xvYmFsX3B1dAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMTg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzQKICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QSSk6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMjAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY3NQogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzYKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDIzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjgxCiAgICAvLyBpZiBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKToKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAyOQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjgyCiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFJGKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCA1CiAgICA9PQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMzAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4NgogICAgLy8gKyAoc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCAtIHNlbGYuZXZlbnRfY3Vyc29yKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICAtCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODcKICAgIC8vICogVUludDY0KGNzdC5PUF9VUF9OT05fQ0FTSF9QRVJfRU5UUllfQlVER0VUKQogICAgcHVzaGludCAxMDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4Ni02ODcKICAgIC8vICsgKHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgLSBzZWxmLmV2ZW50X2N1cnNvcikKICAgIC8vICogVUludDY0KGNzdC5PUF9VUF9OT05fQ0FTSF9QRVJfRU5UUllfQlVER0VUKQogICAgKgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njg1CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX05PTl9DQVNIX0JBU0VfQlVER0VUKQogICAgaW50YyA0IC8vIDE1MDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4NS02ODcKICAgIC8vIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfQkFTRV9CVURHRVQpCiAgICAvLyArIChzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IC0gc2VsZi5ldmVudF9jdXJzb3IpCiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfUEVSX0VOVFJZX0JVREdFVCkKICAgICsKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4My02ODkKICAgIC8vIGVuc3VyZV9idWRnZXQoCiAgICAvLyAgICAgcmVxdWlyZWRfYnVkZ2V0PSgKICAgIC8vICAgICAgICAgVUludDY0KGNzdC5PUF9VUF9OT05fQ0FTSF9CQVNFX0JVREdFVCkKICAgIC8vICAgICAgICAgKyAoc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCAtIHNlbGYuZXZlbnRfY3Vyc29yKQogICAgLy8gICAgICAgICAqIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfUEVSX0VOVFJZX0JVREdFVCkKICAgIC8vICAgICApLAogICAgLy8gKQogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDkzCiAgICAvLyBkaXNjb3VudF9mYWN0b3IgPSBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5NAogICAgLy8gZGVub21pbmF0b3IgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5NQogICAgLy8gc2tpcF9maXJzdF9yZWRlbXB0aW9uID0gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5NwogICAgLy8gaWYgZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAyNQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgZnJhbWVfYnVyeSA4CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAzNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDk4LTUwMgogICAgLy8gIyBBbiBpbml0aWFsIFBSRiBtYXkgZGVzY3JpYmUgdGhlIGZpcnN0IHJlZGVtcHRpb24gcGVyaW9kIGRpcmVjdGx5LgogICAgLy8gZGlzY291bnRfZmFjdG9yID0gc2VsZi5fZGlzY291bnRfYW5udWl0eV9mYWN0b3IoCiAgICAvLyAgICAgZGlzY291bnRfZmFjdG9yLAogICAgLy8gICAgIGVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDgKICAgIGNhbGxzdWIgX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA0CiAgICAvLyBza2lwX2ZpcnN0X3JlZGVtcHRpb24gPSBUcnVlCiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfYnVyeSA3CiAgICBmcmFtZV9idXJ5IDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDM1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA2CiAgICAvLyBmdXR1cmVfZXZlbnRfaWQgPSBzZWxmLmV2ZW50X2N1cnNvciArIFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfd2hpbGVfdG9wQDM2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA3CiAgICAvLyB3aGlsZSBmdXR1cmVfZXZlbnRfaWQgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgZnJhbWVfZGlnIDMKICAgID4KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl93aGlsZUA0OAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA4CiAgICAvLyBmdXR1cmVfZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoZnV0dXJlX2V2ZW50X2lkKQogICAgZnJhbWVfZGlnIDMKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwOQogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPSBmdXR1cmVfZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTAtNTExCiAgICAvLyAjIE9ubHkgcmVkZW1wdGlvbi1iZWFyaW5nIGV2ZW50cyBjb250cmlidXRlIHRvIHRoZSBhbm51aXR5IGRlbm9taW5hdG9yLgogICAgLy8gaXNfcmVkZW1wdGlvbl9ldmVudCA9IGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpIG9yICgKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUxMC01MTQKICAgIC8vICMgT25seSByZWRlbXB0aW9uLWJlYXJpbmcgZXZlbnRzIGNvbnRyaWJ1dGUgdG8gdGhlIGFubnVpdHkgZGVub21pbmF0b3IuCiAgICAvLyBpc19yZWRlbXB0aW9uX2V2ZW50ID0gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QUikgb3IgKAogICAgLy8gICAgIGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfTUQpCiAgICAvLyAgICAgYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICAvLyApCiAgICBibnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfdHJ1ZUA0MAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTEyCiAgICAvLyBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgZnJhbWVfZGlnIDQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTItNTEzCiAgICAvLyBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgLy8gYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF9mYWxzZUA0MQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTEzCiAgICAvLyBhbmQgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IgPiBVSW50NjQoMCkKICAgIGZyYW1lX2RpZyAwCiAgICBwdXNoaW50IDI1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTEyLTUxMwogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCkKICAgIC8vIGFuZCBmdXR1cmVfZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX3RydWVANDA6CiAgICBpbnRjXzEgLy8gMQoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfbWVyZ2VANDI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTUKICAgIC8vIGlmIGlzX3JlZGVtcHRpb25fZXZlbnQ6CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA0NwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTE2CiAgICAvLyBpZiBza2lwX2ZpcnN0X3JlZGVtcHRpb246CiAgICBmcmFtZV9kaWcgNwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUA0NQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTE3CiAgICAvLyBza2lwX2ZpcnN0X3JlZGVtcHRpb24gPSBGYWxzZQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgNwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANDc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjQKICAgIC8vIGZ1dHVyZV9ldmVudF9pZCArPSBVSW50NjQoMSkKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV93aGlsZV90b3BAMzYKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlANDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjEKICAgIC8vIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZnJhbWVfZGlnIDAKICAgIHB1c2hpbnQgMjUKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTktNTIyCiAgICAvLyBkaXNjb3VudF9mYWN0b3IgPSBzZWxmLl9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcigKICAgIC8vICAgICBkaXNjb3VudF9mYWN0b3IsCiAgICAvLyAgICAgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMgogICAgc3dhcAogICAgY2FsbHN1YiBfZGlzY291bnRfYW5udWl0eV9mYWN0b3IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjMKICAgIC8vIGRlbm9taW5hdG9yICs9IGRpc2NvdW50X2ZhY3RvcgogICAgZnJhbWVfZGlnIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA0NwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDE6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF9tZXJnZUA0MgoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX3doaWxlQDQ4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTI2CiAgICAvLyBhc3NlcnQgZGVub21pbmF0b3IgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZnJhbWVfZGlnIDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUyNwogICAgLy8gbnVtZXJhdG9yID0gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTI4CiAgICAvLyBpZiBlbnRyeS5mbGFncyAmIFVJbnQ2NChlbnVtcy5GTEFHX0lOSVRJQUxfUFJGKSA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNTcKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gOAogICAgJgogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDUwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjktNTMwCiAgICAvLyAjIFN1YnNlcXVlbnQgUFJGIGV2ZW50cyBhbW9ydGl6ZSBib3RoIHByaW5jaXBhbCBhbmQgYWxyZWFkeSBhY2NydWVkIGNhcnJ5LgogICAgLy8gbnVtZXJhdG9yICs9IHNlbGYuYWNjcnVlZF9pbnRlcmVzdAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgICsKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDUwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTMzCiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTMxLTUzNQogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIG51bWVyYXRvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gICAgIGRlbm9taW5hdG9yLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDEKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OTAKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IHNlbGYuX3JlY2FsY3VsYXRlX2FubnVpdHlfcGF5bWVudCgKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjkwLTY5MgogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gc2VsZi5fcmVjYWxjdWxhdGVfYW5udWl0eV9wYXltZW50KAogICAgLy8gICAgIGVudHJ5CiAgICAvLyApCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMzA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OTUKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY5Ni03MDAKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1VSW50NjQoMCksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OTgKICAgIC8vIHBheW9mZj1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njk5CiAgICAvLyBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY5Ni03MDAKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1VSW50NjQoMCksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgY2FsbHN1YiBfZW1pdF9leGVjdXRpb25fZXZlbnQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDI5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njk0CiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDMwCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDIwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc3CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9JUENCKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCAxOAogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDIzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzgtNjc5CiAgICAvLyAjIElQQ0Iga2VlcHMgcHJpbmNpcGFsIHVuY2hhbmdlZCBhbmQgb25seSByZXNldHMgdGhlIGludGVyZXN0IGJhc2UuCiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIGIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMjMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMTA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjUKICAgIC8vIGVsaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1JSRik6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgMTEKICAgID09CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDE0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjYKICAgIC8vIG5leHRfcmF0ZSA9IGVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY3CiAgICAvLyBpZiBuZXh0X3JhdGUgPT0gVUludDY0KDApOgogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDEzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjgKICAgIC8vIG5leHRfcmF0ZSA9IHNlbGYucmF0ZV9yZXNldF9uZXh0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzcgLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDUKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfbmV4dCBleGlzdHMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY5CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IG5leHRfcmF0ZQogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgZnJhbWVfZGlnIDUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDE0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjcxCiAgICAvLyBpZiBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSAhPSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgOQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY3MgogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPSBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZQogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgZnJhbWVfZGlnIDkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KGVudHJ5OiBieXRlcywgcGF5b2ZmOiB1aW50NjQsIHNldHRsZWRfYW1vdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpfZW1pdF9leGVjdXRpb25fZXZlbnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MDYtNzEyCiAgICAvLyBkZWYgX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgKiwKICAgIC8vICAgICBlbnRyeTogdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnksCiAgICAvLyAgICAgcGF5b2ZmOiBVSW50NjQsCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ6IFVJbnQ2NCwKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDMgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE2CiAgICAvLyBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25JRAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE3CiAgICAvLyBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIGZyYW1lX2RpZyAtMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTgKICAgIC8vIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIGZyYW1lX2RpZyAtMwogICAgZXh0cmFjdCA4IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxOQogICAgLy8gc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICBmcmFtZV9kaWcgLTMKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MjAKICAgIC8vIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MjMKICAgIC8vIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIGZyYW1lX2RpZyAtMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE4CiAgICAvLyBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICBpbnRjXzIgLy8gOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIzCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBnZXRieXRlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NTIKICAgIC8vIGlmIHBheW9mZiA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJueiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NTMKICAgIC8vIHJldHVybiBVSW50NjQoZW51bXMuUEFZT0ZGX1NJR05fUE9TSVRJVkUpCiAgICBpbnRjXzEgLy8gMQoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX3BheW9mZl9zaWduQDc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MjItNzI0CiAgICAvLyBwYXlvZmZfc2lnbj1hcmM0LlVJbnQ4KAogICAgLy8gICAgIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIC8vICksCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgaW50Y18yIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MjYKICAgIC8vIGN1cnJlbmN5X2lkPXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzI3CiAgICAvLyBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTUtNzI4CiAgICAvLyBFeGVjdXRpb25FdmVudCgKICAgIC8vICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIC8vICAgICBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYXBwbGllZF9hdD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICBwYXlvZmY9cGF5b2ZmLAogICAgLy8gICAgIHBheW9mZl9zaWduPWFyYzQuVUludDgoCiAgICAvLyAgICAgICAgIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIC8vICAgICApLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PXNldHRsZWRfYW1vdW50LAogICAgLy8gICAgIGN1cnJlbmN5X2lkPXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAwCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE0LTcyOQogICAgLy8gYXJjNC5lbWl0KAogICAgLy8gICAgIEV4ZWN1dGlvbkV2ZW50KAogICAgLy8gICAgICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgICAgIHBheW9mZj1wYXlvZmYsCiAgICAvLyAgICAgICAgIHBheW9mZl9zaWduPWFyYzQuVUludDgoCiAgICAvLyAgICAgICAgICAgICBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICAvLyAgICAgICAgICksCiAgICAvLyAgICAgICAgIHNldHRsZWRfYW1vdW50PXNldHRsZWRfYW1vdW50LAogICAgLy8gICAgICAgICBjdXJyZW5jeV9pZD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgICAgIHNlcXVlbmNlPWVudHJ5LmV2ZW50X2lkICsgVUludDY0KDEpLAogICAgLy8gICAgICkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDlhMzMyYjk1IC8vIG1ldGhvZCAiRXhlY3V0aW9uRXZlbnQodWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc1NAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiAoVUludDY0KGVudW1zLkVWVF9JRUQpLCBVSW50NjQoZW51bXMuRVZUX1BJKSk6CiAgICBmcmFtZV9kaWcgNQogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBibnogX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2lmX2JvZHlANQogICAgZnJhbWVfZGlnIDUKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGJ6IF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pZl9lbHNlQDYKCl9lbWl0X2V4ZWN1dGlvbl9ldmVudF9pZl9ib2R5QDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NTUKICAgIC8vIHJldHVybiBVSW50NjQoZW51bXMuUEFZT0ZGX1NJR05fUE9TSVRJVkUpCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIzCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBiIF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9wYXlvZmZfc2lnbkA3CgpfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzU2CiAgICAvLyByZXR1cm4gVUludDY0KGVudW1zLlBBWU9GRl9TSUdOX05FR0FUSVZFKQogICAgcHVzaGludCAyNTUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcyMwogICAgLy8gc2VsZi5fcGF5b2ZmX3NpZ24oZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSwgcGF5b2ZmKQogICAgYiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fcGF5b2ZmX3NpZ25ANwoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9yb2xlX2lzX2FjdGl2ZShyb2xlX21hcDogYnl0ZXMsIHJvbGVfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NDoKX3JvbGVfaXNfYWN0aXZlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU3CiAgICAvLyBkZWYgX3JvbGVfaXNfYWN0aXZlKHNlbGYsIHJvbGVfbWFwOiB0eXAuUmJhY1JvbGUsIHJvbGVfYWRkcmVzczogQWNjb3VudCkgLT4gYm9vbDoKICAgIHByb3RvIDIgMQogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5CiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5LTYwCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5LTYxCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjEKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAtNjEKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgPj0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX21lcmdlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKSAtPiB2b2lkOgpfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2NQogICAgLy8gYXNzZXJ0IHNlbGYuX2lzX2FycmFuZ2VyKFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTIKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgPT0gc2VsZi5hcnJhbmdlci52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE4IC8vIDB4NTIzYTQxNTI1MjIzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJyYW5nZXIgZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjY1CiAgICAvLyBhc3NlcnQgc2VsZi5faXNfYXJyYW5nZXIoVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkgLT4gdm9pZDoKX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjgzCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYXNzZXRfZGVmYXVsdGVkLCBlcnIuREVGQVVMVEVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNDEgLy8gImFzc2V0X2RlZmF1bHRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9kZWZhdWx0ZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRGVmYXVsdGVkCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKSAtPiB2b2lkOgpfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODYKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5hc3NldF9zdXNwZW5kZWQsIGVyci5TVVNQRU5ERUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMyAvLyAiYXNzZXRfc3VzcGVuZGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X3N1c3BlbmRlZCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBTdXNwZW5kZWQgb3BlcmF0aW9ucwogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGVfaWQ6IHVpbnQ2NCkgLT4gdm9pZDoKX2Fzc2VydF92YWxpZF9yb2xlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg4CiAgICAvLyBkZWYgX2Fzc2VydF92YWxpZF9yb2xlKHNlbGYsIHJvbGVfaWQ6IFVJbnQ2NCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MAogICAgLy8gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgcHVzaGludCAyMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICBwdXNoaW50IDI1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MgogICAgLy8gVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIHB1c2hpbnQgNDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkzCiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICBwdXNoaW50IDUwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NAogICAgLy8gVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICBwdXNoaW50IDYwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NQogICAgLy8gVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIHB1c2hpbnQgNzAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojk2CiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICBwdXNoaW50IDgwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBieiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9mYWxzZUA4CgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDc6CiAgICBpbnRjXzEgLy8gMQoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfbWVyZ2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICByZXRzdWIKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX2ZhbHNlQDg6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9tZXJnZUA5Cg==", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCAzMiAxNTAwCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUgInN0YXR1cyIgImV2ZW50X2N1cnNvciIgInNjaGVkdWxlX2VudHJ5X2NvdW50IiAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIiAiZml4ZWRfcG9pbnRfc2NhbGUiICJhY2NydWVkX2ludGVyZXN0IiAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIgMHg0MTIzICJub21pbmFsX2ludGVyZXN0X3JhdGUiICJjb250cmFjdF90eXBlIiAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiICJyZXNlcnZlZF9wcmluY2lwYWwiICJ0b3RhbF91bml0cyIgIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iICJyZXNlcnZlZF9pbnRlcmVzdCIgImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIgMHg1MjNhNDE1MjUyMjMgInNldHRsZW1lbnRfYXNzZXRfaWQiICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIgMHg1MjNhNDE1NTU0MjMgMHg1MjNhNTA1OTQ0MjMgMHg1MjNhNGQ0ZTQ3MjMgMHg1MzIzIDB4NTIzYTRkNGY0MzIzIDB4NTIzYTU0NTI1MzIzIDB4NTIzYTRmNTA0NDIzICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiICJ0cmFuc2Zlcl9vcGVuaW5nX2RhdGUiICJ0cmFuc2Zlcl9jbG9zdXJlX2RhdGUiICJyYXRlX3Jlc2V0X2Zsb29yIiAicmF0ZV9yZXNldF9jYXAiICJhc3NldF9zdXNwZW5kZWQiICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIiAicmF0ZV9yZXNldF9zcHJlYWQiICJyYXRlX3Jlc2V0X211bHRpcGxpZXIiICJyYXRlX3Jlc2V0X25leHQiICJoYXNfcmF0ZV9yZXNldF9mbG9vciIgImhhc19yYXRlX3Jlc2V0X2NhcCIgMHgwMCAiYXNzZXRfZGVmYXVsdGVkIiAicHJvc3BlY3R1c19oYXNoIiAicHJvc3BlY3R1c191cmwiICJkZW5vbWluYXRpb25fYXNzZXRfaWQiICJtYXR1cml0eV9kYXRlIiAiZGF5X2NvdW50X2NvbnZlbnRpb24iICJkZWZhdWx0ZWQiIDB4MDY4MTAxIDB4MDAwMAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4LTI5CiAgICAvLyAjIFJCQUMgUm9sZXMKICAgIC8vIHNlbGYuYXJyYW5nZXIgPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX0FSUkFOR0VSKQogICAgYnl0ZWMgMTggLy8gMHg1MjNhNDE1MjUyMjMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMAogICAgLy8gc2VsZi5vcF9kYWVtb24gPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX09QX0RBRU1PTikKICAgIGJ5dGVjIDI3IC8vIDB4NTIzYTRmNTA0NDIzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NDctNDgKICAgIC8vICMgRC1BU0EgR292ZXJuYW5jZQogICAgLy8gc2VsZi5hc3NldF9zdXNwZW5kZWQgPSBGYWxzZQogICAgYnl0ZWMgMzMgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjQ5CiAgICAvLyBzZWxmLmFzc2V0X2RlZmF1bHRlZCA9IEZhbHNlCiAgICBieXRlYyA0MSAvLyAiYXNzZXRfZGVmYXVsdGVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1Ni01NwogICAgLy8gIyBDb250cmFjdAogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKQogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OAogICAgLy8gc2VsZi5jb250cmFjdF90eXBlID0gVUludDY0KCkKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MC02MQogICAgLy8gIyBQcm9zcGVjdHVzIChJbmZvcm1hdGlvbmFsKQogICAgLy8gc2VsZi5wcm9zcGVjdHVzX2hhc2ggPSBCeXRlcygpCiAgICBieXRlYyA0MiAvLyAicHJvc3BlY3R1c19oYXNoIgogICAgcHVzaGJ5dGVzIDB4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjIKICAgIC8vIHNlbGYucHJvc3BlY3R1c191cmwgPSBTdHJpbmcoKQogICAgYnl0ZWMgNDMgLy8gInByb3NwZWN0dXNfdXJsIgogICAgcHVzaGJ5dGVzICIiCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjQtNjUKICAgIC8vICMgRGVub21pbmF0aW9uCiAgICAvLyBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCA9IEFzc2V0KCkKICAgIGJ5dGVjIDQ0IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBBc3NldCgpCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjgtNjkKICAgIC8vICMgVGltZQogICAgLy8gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGUgPSB0eXAuVGltZVN0YW1wKCkKICAgIGJ5dGVjIDI4IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcwCiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSB0eXAuVGltZVN0YW1wKCkKICAgIGJ5dGVjIDQ1IC8vICJtYXR1cml0eV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MQogICAgLy8gc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgPSB0eXAuVGltZVN0YW1wKCkKICAgIGJ5dGVjIDI5IC8vICJ0cmFuc2Zlcl9vcGVuaW5nX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcyCiAgICAvLyBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgMzAgLy8gInRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzQtNzUKICAgIC8vICMgRGF5IENvdW50IENvbnZlbnRpb24KICAgIC8vIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPSBVSW50NjQoKQogICAgYnl0ZWMgNDYgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3Ny03OAogICAgLy8gIyBVbml0cwogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IFVJbnQ2NCgpCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc5CiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID0gVUludDY0KCkKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODEtODIKICAgIC8vICMgUHJpbmNpcGFsCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID0gVUludDY0KCkKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODMKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gVUludDY0KCkKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODUKICAgIC8vIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiA9IEZhbHNlCiAgICBieXRlYyAzNCAvLyAiZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODctODgKICAgIC8vICMgSW50ZXJlc3QKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OQogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ID0gVUludDY0KCkKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkxLTkyCiAgICAvLyAjIEludGVyZXN0IFJhdGVzCiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzCiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkID0gVUludDY0KCkKICAgIGJ5dGVjIDM1IC8vICJyYXRlX3Jlc2V0X3NwcmVhZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9tdWx0aXBsaWVyID0gVUludDY0KCkKICAgIGJ5dGVjIDM2IC8vICJyYXRlX3Jlc2V0X211bHRpcGxpZXIiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfZmxvb3IgPSBVSW50NjQoKQogICAgYnl0ZWMgMzEgLy8gInJhdGVfcmVzZXRfZmxvb3IiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfY2FwID0gVUludDY0KCkKICAgIGJ5dGVjIDMyIC8vICJyYXRlX3Jlc2V0X2NhcCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTcKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9uZXh0ID0gVUludDY0KCkKICAgIGJ5dGVjIDM3IC8vICJyYXRlX3Jlc2V0X25leHQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4CiAgICAvLyBzZWxmLmhhc19yYXRlX3Jlc2V0X2Zsb29yID0gRmFsc2UKICAgIGJ5dGVjIDM4IC8vICJoYXNfcmF0ZV9yZXNldF9mbG9vciIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTkKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwID0gRmFsc2UKICAgIGJ5dGVjIDM5IC8vICJoYXNfcmF0ZV9yZXNldF9jYXAiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMS0xMDIKICAgIC8vICMgUHJpbWFyeSBEaXN0cmlidXRpb24KICAgIC8vIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsID0gVUludDY0KCkKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMwogICAgLy8gc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNS0xMDYKICAgIC8vICMgQ3VtdWxhdGl2ZSBQZXItVW5pdCBGaXhlZC1Qb2ludCBJbmRleGVzCiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggPSBVSW50NjQoKQogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNwogICAgLy8gc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNQogICAgLy8gc2VsZi5ldmVudF9jdXJzb3IgPSBVSW50NjQoKQogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTYKICAgIC8vIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgPSBVSW50NjQoKQogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExOC0xMTkKICAgIC8vICMgUGVyZm9ybWFuY2UKICAgIC8vIHNlbGYuZGVmYXVsdGVkID0gRmFsc2UKICAgIGJ5dGVjIDQ3IC8vICJkZWZhdWx0ZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMS0xMjIKICAgIC8vICMgU2NhbGluZwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjIzCiAgICAvLyBhc3NlcnQgVHhuLmdsb2JhbF9udW1fYnl0ZV9zbGljZSA9PSBjZmcuR0xPQkFMX0JZVEVTLCBlcnIuV1JPTkdfR0xPQkFMX0JZVEVTCiAgICB0eG4gR2xvYmFsTnVtQnl0ZVNsaWNlCiAgICBwdXNoaW50IDEwCiAgICA9PQogICAgYXNzZXJ0IC8vIFdyb25nIEdsb2JhbCBCeXRlcyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6MjQKICAgIC8vIGFzc2VydCBUeG4uZ2xvYmFsX251bV91aW50ID09IGNmZy5HTE9CQUxfVUlOVFMsIGVyci5XUk9OR19HTE9CQUxfVUlOVFMKICAgIHR4biBHbG9iYWxOdW1VaW50CiAgICBwdXNoaW50IDU0CiAgICA9PQogICAgYXNzZXJ0IC8vIFdyb25nIEdsb2JhbCBVSW50cyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6MjUKICAgIC8vIGFzc2VydCBUeG4ubG9jYWxfbnVtX2J5dGVfc2xpY2UgPT0gY2ZnLkxPQ0FMX0JZVEVTLCBlcnIuV1JPTkdfTE9DQUxfQllURVMKICAgIHR4biBMb2NhbE51bUJ5dGVTbGljZQogICAgIQogICAgYXNzZXJ0IC8vIFdyb25nIExvY2FsIEJ5dGVzIGFsbG9jYXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kX2FzYS9jb250cmFjdC5weToyNgogICAgLy8gYXNzZXJ0IFR4bi5sb2NhbF9udW1fdWludCA9PSBjZmcuTE9DQUxfVUlOVFMsIGVyci5XUk9OR19MT0NBTF9VSU5UUwogICAgdHhuIExvY2FsTnVtVWludAogICAgIQogICAgYXNzZXJ0IC8vIFdyb25nIExvY2FsIFVJbnRzIGFsbG9jYXRpb24KCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjgtMTgKICAgIC8vIGNsYXNzIERBU0EoCiAgICAvLyAgICAgUGF5bWVudEFnZW50LAogICAgLy8gICAgIFRyYW5zZmVyQWdlbnQsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyAgICAgYXZtX3ZlcnNpb249MTIsCiAgICAvLyApOgogICAgcHVzaGJ5dGVzIDB4OTE0ZjA0ZWIgLy8gbWV0aG9kICJjb250cmFjdF91cGRhdGUoKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX2NvbnRyYWN0X3VwZGF0ZV9yb3V0ZUA0CgptYWluX3N3aXRjaF9jYXNlX25leHRANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kX2FzYS9jb250cmFjdC5weTo4LTE4CiAgICAvLyBjbGFzcyBEQVNBKAogICAgLy8gICAgIFBheW1lbnRBZ2VudCwKICAgIC8vICAgICBUcmFuc2ZlckFnZW50LAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gICAgIGF2bV92ZXJzaW9uPTEyLAogICAgLy8gKToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJ6IG1haW5fY3JlYXRlX05vT3BAMzMKICAgIHB1c2hieXRlc3MgMHhiNDQ2MThjOCAweGU3ODMyNTI5IDB4OTQzODg3MjMgMHg2Yzg1ZTNlZSAweGJkZDFhOTQ0IDB4N2MwZjE4MTIgMHgxNGZjMTBlZiAweDc0YTcyOTdmIDB4MDlkNGZlMTQgMHg5YTliZmE4NSAweDg1ZWVkMzNkIDB4YWIyYzBmYzQgMHhkOWYyMjVhYyAweDk4ODM1MDVhIDB4ZmI0ZDQ0MjggMHg4ZWE2ZTc0YyAweDAyYWY1NTdhIDB4ODJmNzFiMmQgMHhlZjA0ZjVkMyAweGRmMzQzNTUwIDB4M2RiZTgwYmQgMHgxZTNlNDhlNyAweDAxMGM4Mjk5IDB4NzQwNmFjZDIgMHgxYTcyYTJlZSAvLyBtZXRob2QgImZ1bmRfZHVlX2Nhc2hmbG93cyh1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJjbGFpbV9kdWVfY2FzaGZsb3dzKGFkZHJlc3MsYnl0ZVtdKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYnl0ZVtdKSIsIG1ldGhvZCAidHJhbnNmZXJfc2V0X3NjaGVkdWxlKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbihhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInRyYW5zZmVyKGFkZHJlc3MsYWRkcmVzcyx1aW50NjQpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X3N1c3BlbnNpb24oYWRkcmVzcyxib29sKXVpbnQ2NCIsIG1ldGhvZCAiYWNjb3VudF9vcGVuKGFkZHJlc3MsYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgImFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzcyhhZGRyZXNzLGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X2dldF9wb3NpdGlvbihhZGRyZXNzKShhZGRyZXNzLHVpbnQ2NCx1aW50NjQsYm9vbCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAiY29udHJhY3RfY29uZmlnKCh1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxib29sLGJvb2wsYm9vbCx1aW50NjQpLCh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCksKGJ5dGVbMzJdLHN0cmluZykpdWludDY0IiwgbWV0aG9kICJjb250cmFjdF9zY2hlZHVsZSh1aW50NjQsYm9vbCwodWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NClbXSl1aW50NjQiLCBtZXRob2QgImNvbnRyYWN0X2V4ZWN1dGVfaWVkKCl1aW50NjQiLCBtZXRob2QgImFwcGx5X25vbl9jYXNoX2V2ZW50KHVpbnQ2NCwodWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIsIG1ldGhvZCAiYXBwZW5kX29ic2VydmVkX2Nhc2hfZXZlbnQoKHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIsIG1ldGhvZCAiY29udHJhY3Rfc2V0X2RlZmF1bHRfc3RhdHVzKGJvb2wpdWludDY0IiwgbWV0aG9kICJjb250cmFjdF9nZXRfc3RhdGUoKSh1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAiY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50KCkodWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgInJiYWNfcm90YXRlX2FycmFuZ2VyKGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX3NldF9vcF9kYWVtb24oYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgInJiYWNfYXNzaWduX3JvbGUodWludDgsYWRkcmVzcywodWludDY0LHVpbnQ2NCkpdWludDY0IiwgbWV0aG9kICJyYmFjX3Jldm9rZV9yb2xlKHVpbnQ4LGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX2NvbnRyYWN0X3N1c3BlbnNpb24oYm9vbCl1aW50NjQiLCBtZXRob2QgInJiYWNfZ2V0X2FycmFuZ2VyKClhZGRyZXNzIiwgbWV0aG9kICJyYmFjX2dldF9hZGRyZXNzX3JvbGVzKGFkZHJlc3MpKGJvb2wsYm9vbCxib29sLGJvb2wsYm9vbCkiLCBtZXRob2QgInJiYWNfZ2V0X3JvbGVfdmFsaWRpdHkodWludDgsYWRkcmVzcykodWludDY0LHVpbnQ2NCkiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBmdW5kX2R1ZV9jYXNoZmxvd3MgY2xhaW1fZHVlX2Nhc2hmbG93cyB0cmFuc2Zlcl9zZXRfc2NoZWR1bGUgcHJpbWFyeV9kaXN0cmlidXRpb24gdHJhbnNmZXIgYWNjb3VudF9zdXNwZW5zaW9uIGFjY291bnRfb3BlbiBhY2NvdW50X3VwZGF0ZV9wYXltZW50X2FkZHJlc3MgYWNjb3VudF9nZXRfcG9zaXRpb24gY29udHJhY3RfY29uZmlnIGNvbnRyYWN0X3NjaGVkdWxlIGNvbnRyYWN0X2V4ZWN1dGVfaWVkIGFwcGx5X25vbl9jYXNoX2V2ZW50IGFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50IGNvbnRyYWN0X3NldF9kZWZhdWx0X3N0YXR1cyBjb250cmFjdF9nZXRfc3RhdGUgY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50IHJiYWNfcm90YXRlX2FycmFuZ2VyIHJiYWNfc2V0X29wX2RhZW1vbiByYmFjX2Fzc2lnbl9yb2xlIHJiYWNfcmV2b2tlX3JvbGUgcmJhY19jb250cmFjdF9zdXNwZW5zaW9uIHJiYWNfZ2V0X2FycmFuZ2VyIHJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXMgcmJhY19nZXRfcm9sZV92YWxpZGl0eQogICAgZXJyCgptYWluX2NyZWF0ZV9Ob09wQDMzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjgtMTgKICAgIC8vIGNsYXNzIERBU0EoCiAgICAvLyAgICAgUGF5bWVudEFnZW50LAogICAgLy8gICAgIFRyYW5zZmVyQWdlbnQsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyAgICAgYXZtX3ZlcnNpb249MTIsCiAgICAvLyApOgogICAgcHVzaGJ5dGVzIDB4OTU2ZDcxNTYgLy8gbWV0aG9kICJjb250cmFjdF9jcmVhdGUoYWRkcmVzcyl1aW50NjQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBjb250cmFjdF9jcmVhdGUKICAgIGVycgoKbWFpbl9jb250cmFjdF91cGRhdGVfcm91dGVANDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgNCAvLyBVcGRhdGVBcHBsaWNhdGlvbgogICAgPT0KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0CiAgICBiIGNvbnRyYWN0X3VwZGF0ZQoKCi8vIF9wdXlhX2xpYi51dGlsLmVuc3VyZV9idWRnZXQocmVxdWlyZWRfYnVkZ2V0OiB1aW50NjQsIGZlZV9zb3VyY2U6IHVpbnQ2NCkgLT4gdm9pZDoKZW5zdXJlX2J1ZGdldDoKICAgIHByb3RvIDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDEwCiAgICArCgplbnN1cmVfYnVkZ2V0X3doaWxlX3RvcEAxOgogICAgZnJhbWVfZGlnIDAKICAgIGdsb2JhbCBPcGNvZGVCdWRnZXQKICAgID4KICAgIGJ6IGVuc3VyZV9idWRnZXRfYWZ0ZXJfd2hpbGVANgogICAgaXR4bl9iZWdpbgogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGJ5dGVjIDQ4IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbQogICAgYnl0ZWMgNDggLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KICAgIGZyYW1lX2RpZyAtMQogICAgc3dpdGNoIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMEAzIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMUA0CgplbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX25leHRANToKICAgIGl0eG5fc3VibWl0CiAgICBiIGVuc3VyZV9idWRnZXRfd2hpbGVfdG9wQDEKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMUA0OgogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgaXR4bl9maWVsZCBGZWUKICAgIGIgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV9uZXh0QDUKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMEAzOgogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBiIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfbmV4dEA1CgplbnN1cmVfYnVkZ2V0X2FmdGVyX3doaWxlQDY6CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnBheW1lbnRfYWdlbnQuUGF5bWVudEFnZW50LmZ1bmRfZHVlX2Nhc2hmbG93c1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmZ1bmRfZHVlX2Nhc2hmbG93czoKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gMTMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDYKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjY4CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2OQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3MAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzOAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTAKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzIKICAgIC8vIGlmIHNlbGYuX2lzX2R5bmFtaWNfYW5udWl0eSgpOgogICAgY2FsbHN1YiBfaXNfZHluYW1pY19hbm51aXR5CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzYtNzcKICAgIC8vICsgbWF4X2V2ZW50X2NvdW50CiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfRlVORF9EVUVfQ0FTSEZMT1dTX1BFUl9FVkVOVF9CVURHRVQpCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3NwogICAgLy8gKiBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19QRVJfRVZFTlRfQlVER0VUKQogICAgcHVzaGludCAxMDAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3Ni03NwogICAgLy8gKyBtYXhfZXZlbnRfY291bnQKICAgIC8vICogVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfUEVSX0VWRU5UX0JVREdFVCkKICAgICoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3NQogICAgLy8gVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfQkFTRV9CVURHRVQpCiAgICBpbnRjIDQgLy8gMTUwMAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojc1LTc3CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19CQVNFX0JVREdFVCkKICAgIC8vICsgbWF4X2V2ZW50X2NvdW50CiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfRlVORF9EVUVfQ0FTSEZMT1dTX1BFUl9FVkVOVF9CVURHRVQpCiAgICArCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzMtNzkKICAgIC8vIGVuc3VyZV9idWRnZXQoCiAgICAvLyAgICAgcmVxdWlyZWRfYnVkZ2V0PSgKICAgIC8vICAgICAgICAgVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfQkFTRV9CVURHRVQpCiAgICAvLyAgICAgICAgICsgbWF4X2V2ZW50X2NvdW50CiAgICAvLyAgICAgICAgICogVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfUEVSX0VWRU5UX0JVREdFVCkKICAgIC8vICAgICApLAogICAgLy8gKQogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4MQogICAgLy8gcHJvY2Vzc2VkX2V2ZW50cyA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjgyCiAgICAvLyBmdW5kZWRfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDE0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODMKICAgIC8vIGZ1bmRlZF9wcmluY2lwYWwgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDEzCgpmdW5kX2R1ZV9jYXNoZmxvd3Nfd2hpbGVfdG9wQDQ6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODYKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgPCBtYXhfZXZlbnRfY291bnQKICAgIGRpZyA0CiAgICBkaWcgMQogICAgPAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojg2LTg3CiAgICAvLyBwcm9jZXNzZWRfZXZlbnRzIDwgbWF4X2V2ZW50X2NvdW50CiAgICAvLyBhbmQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAMTEKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4NwogICAgLy8gYW5kIHNlbGYuZXZlbnRfY3Vyc29yIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICA8CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODYtODcKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgPCBtYXhfZXZlbnRfY291bnQKICAgIC8vIGFuZCBzZWxmLmV2ZW50X2N1cnNvciA8IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQKICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl93aGlsZUAxMQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojg5CiAgICAvLyBlbnRyeSA9IHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLmV2ZW50X2N1cnNvcikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICBkdXAKICAgIGJ1cnkgMTcKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5MAogICAgLy8gaWYgZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcDoKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSAzCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDExCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6OTIKICAgIC8vIGlmIG5vdCBzZWxmLl9ldmVudF9pc19jYXNoKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkpOgogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBidXJ5IDE2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNTQKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgaW50Y18yIC8vIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM1My0zNTcKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX01EKSwKICAgIC8vICkKICAgID09CiAgICBkdXAKICAgIGJ1cnkgNAogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX3RydWVANTIKICAgIGRpZyAxNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzU1CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzUzLTM1NwogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfTUQpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDUyCiAgICBkaWcgMTQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM1NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9NRCksCiAgICBwdXNoaW50IDE5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNTMtMzU3CiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9NRCksCiAgICAvLyApCiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VANTMKCmZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX3RydWVANTI6CiAgICBpbnRjXzEgLy8gMQoKZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfbWVyZ2VANTQ6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6OTIKICAgIC8vIGlmIG5vdCBzZWxmLl9ldmVudF9pc19jYXNoKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkpOgogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTEKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF9pZCA9PSBzZWxmLmV2ZW50X2N1cnNvciwgZXJyLklOVkFMSURfRVZFTlRfQ1VSU09SCiAgICBkaWcgMTUKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgY3Vyc29yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTIKICAgIC8vIGFzc2VydCBlbnRyeS5zY2hlZHVsZWRfdGltZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwgZXJyLk5PX0RVRV9DQVNIRkxPVwogICAgZGlnIDEKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIDw9CiAgICBhc3NlcnQgLy8gTm8gZHVlIGNhc2hmbG93IHRvIHBheQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDE2CiAgICAvLyBpZiBldmVudF90eXBlIG5vdCBpbiAoVUludDY0KGVudW1zLkVWVF9JUCksIFVJbnQ2NChlbnVtcy5FVlRfTUQpKToKICAgIGRpZyAyCiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTUKICAgIGRpZyAxNAogICAgcHVzaGludCAxOQogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDE3CiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAxMQoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X2ludGVyZXN0X2Ftb3VudEAxNjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQyOQogICAgLy8gZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGRpZyAxNQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSAxNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDMwCiAgICAvLyBpZiBldmVudF90eXBlIG5vdCBpbiAoVUludDY0KGVudW1zLkVWVF9QUiksIFVJbnQ2NChlbnVtcy5FVlRfTUQpKToKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxOQogICAgZGlnIDE0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzEKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDYKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTU2CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA9IGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBkaWcgMTUKICAgIHB1c2hpbnQgNDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBidXJ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1OQogICAgLy8gaWYgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCk6CiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUAyOQogICAgZGlnIDcKICAgIGJ1cnkgOQoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzUtNTc3CiAgICAvLyAjIEZ1bmRpbmcgdXNlcyBwZXItdW5pdCBjdW11bGF0aXZlIGluZGljZXMgc28gZWFjaCBob2xkZXIgY2FuIHNldHRsZQogICAgLy8gIyBpbmRlcGVuZGVudGx5IGZyb20gaXRzIGN1cnJlbnQgdW5pdCBiYWxhbmNlLgogICAgLy8gaW50ZXJlc3RfaW5kZXhfZGVsdGEgPSBzZWxmLl9hbW91bnRfdG9faW5kZXhfZGVsdGEoaW50ZXJlc3RfYW1vdW50X2R1ZSkKICAgIGRpZyAxMAogICAgY2FsbHN1YiBfYW1vdW50X3RvX2luZGV4X2RlbHRhCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzgKICAgIC8vIHByaW5jaXBhbF9pbmRleF9kZWx0YSA9IHNlbGYuX2Ftb3VudF90b19pbmRleF9kZWx0YShwcmluY2lwYWxfYW1vdW50X2R1ZSkKICAgIGRpZyA2CiAgICBjYWxsc3ViIF9hbW91bnRfdG9faW5kZXhfZGVsdGEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU3OQogICAgLy8gaW50ZXJlc3RfYW1vdW50ID0gc2VsZi5faW5kZXhfZGVsdGFfdG9fYW1vdW50KGludGVyZXN0X2luZGV4X2RlbHRhKQogICAgZGlnIDEKICAgIGNhbGxzdWIgX2luZGV4X2RlbHRhX3RvX2Ftb3VudAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBidXJ5IDE1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1ODAKICAgIC8vIHByaW5jaXBhbF9hbW91bnQgPSBzZWxmLl9pbmRleF9kZWx0YV90b19hbW91bnQocHJpbmNpcGFsX2luZGV4X2RlbHRhKQogICAgZHVwCiAgICBjYWxsc3ViIF9pbmRleF9kZWx0YV90b19hbW91bnQKICAgIGR1cAogICAgYnVyeSAxMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTgxCiAgICAvLyByZXF1aXJlZF9hbW91bnQgPSBpbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50CiAgICBkaWcgMgogICAgZGlnIDEKICAgICsKICAgIGR1cAogICAgYnVyeSA5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MzcKICAgIC8vIGJhbGFuY2UgPSBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBvcHRlZCBpbnRvIGFzc2V0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NTkKICAgIC8vIHJldHVybiBzZWxmLnJlc2VydmVkX2ludGVyZXN0ICsgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICBkaWcgMQogICAgKwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzM5CiAgICAvLyBhc3NlcnQgYmFsYW5jZSA+PSByZXNlcnZlZF90b3RhbCwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGRpZyAyCiAgICBkaWcgMQogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzQwCiAgICAvLyByZXR1cm4gYmFsYW5jZSAtIHJlc2VydmVkX3RvdGFsCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIC0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4MwogICAgLy8gc2VsZi5fYXZhaWxhYmxlX3NldHRsZW1lbnRfZnVuZHMoKSA+PSByZXF1aXJlZF9hbW91bnQKICAgIHVuY292ZXIgMgogICAgPj0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4Mi01ODQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5fYXZhaWxhYmxlX3NldHRsZW1lbnRfZnVuZHMoKSA+PSByZXF1aXJlZF9hbW91bnQKICAgIC8vICksIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcyBmb3IgdGhlIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4NgogICAgLy8gc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCArPSBpbnRlcmVzdF9hbW91bnQKICAgIHVuY292ZXIgMwogICAgKwogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4NwogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgKz0gcHJpbmNpcGFsX2Ftb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIGV4aXN0cwogICAgKwogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1ODgKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCArPSBpbnRlcmVzdF9pbmRleF9kZWx0YQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggZXhpc3RzCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4OQogICAgLy8gc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCArPSBwcmluY2lwYWxfaW5kZXhfZGVsdGEKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggZXhpc3RzCiAgICArCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTkwCiAgICAvLyBpZiBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpOgogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgcHVzaGludCAzCiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUA0MAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTkxLTU5MgogICAgLy8gIyBGb3IgUFIsIHRoZSBwZXJpb2QgaW50ZXJlc3Qgc3RheXMgYWNjcnVlZCB1bnRpbCBhIGxhdGVyIElQIG9yIE1ELgogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ICs9IHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZGlnIDE2CiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBidXJ5IDE4CiAgICArCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQxOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTk1CiAgICAvLyBpZiBub3Qgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCkgb3IgZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSA9PSBVSW50NjQoCiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDQzCiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTUtNTk3CiAgICAvLyBpZiBub3Qgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCkgb3IgZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSA9PSBVSW50NjQoCiAgICAvLyAgICAgZW51bXMuRVZUX01ECiAgICAvLyApOgogICAgcHVzaGludCAxOQogICAgPT0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQ0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUA0MzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5OAogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gZW50cnkubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZGlnIDE1CiAgICBwdXNoaW50IDQxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTkKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGRpZyA4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAwCiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBuZXh0X2ludGVyZXN0X2Jhc2UKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBkaWcgOQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwMQogICAgLy8gc2VsZi5ldmVudF9jdXJzb3IgKz0gVUludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAzCiAgICAvLyBpZiBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoCiAgICBkaWcgMTUKICAgIGV4dHJhY3QgOCAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MDMtNjA1CiAgICAvLyBpZiBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoCiAgICAvLyAgICAgZW51bXMuRVZUX01ECiAgICAvLyApIGFuZCBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9PSBVSW50NjQoMCk6CiAgICBwdXNoYnl0ZXMgMHgxMwogICAgYj09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0NwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjA1CiAgICAvLyApIGFuZCBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9PSBVSW50NjQoMCk6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwMy02MDUKICAgIC8vIGlmIGVudHJ5LmV2ZW50X3R5cGUgPT0gYXJjNC5VSW50OCgKICAgIC8vICAgICBlbnVtcy5FVlRfTUQKICAgIC8vICkgYW5kIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID09IFVJbnQ2NCgwKToKICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0NwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjA2CiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbnVtcy5TVEFUVVNfRU5ERUQpCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBwdXNoaW50IDIwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwNwogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gVUludDY0KDApCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0NzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwOS02MTMKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1pbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50LAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PWludGVyZXN0X2Ftb3VudCArIHByaW5jaXBhbF9hbW91bnQsCiAgICAvLyApCiAgICBkaWcgMTUKICAgIGRpZyA0CiAgICBkdXAKICAgIGNhbGxzdWIgX2VtaXRfZXhlY3V0aW9uX2V2ZW50CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5NgogICAgLy8gZnVuZGVkX2ludGVyZXN0ICs9IGludGVyZXN0X2Ftb3VudAogICAgZGlnIDEzCiAgICBkaWcgMTIKICAgICsKICAgIGJ1cnkgMTQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5NwogICAgLy8gZnVuZGVkX3ByaW5jaXBhbCArPSBwcmluY2lwYWxfYW1vdW50CiAgICBkaWcgMTIKICAgIGRpZyA3CiAgICArCiAgICBidXJ5IDEzCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6OTgKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgKz0gVUludDY0KDEpCiAgICBkaWcgNAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgNQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3Nfd2hpbGVfdG9wQDQKCmZ1bmRfZHVlX2Nhc2hmbG93c19lbHNlX2JvZHlANDA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTQKICAgIC8vIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0MQoKZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlAMjk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjAKICAgIC8vIGV2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ1cnkgMTYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU2MS01NjMKICAgIC8vICMgRHluYW1pYyBhbm51aXRpZXMgZGVyaXZlIG5leHQgc3RhdGUgZnJvbSB0aGUgcGF5bWVudCBkZWNvbXBvc2l0aW9uLAogICAgLy8gIyBub3Qgb25seSBmcm9tIHRoZSBwcmVjb21wdXRlZCBgbmV4dF8qYCBmaWVsZHMuCiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpOgogICAgcHVzaGludCAzCiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUAzMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY1CiAgICAvLyBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCAtIHByaW5jaXBhbF9hbW91bnRfZHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGRpZyA2CiAgICAtCiAgICBkdXAKICAgIGJ1cnkgOQogICAgYnVyeSA5CiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDMxOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY4CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9JUCk6CiAgICBkaWcgMTQKICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUAzMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY5CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGJ1cnkgOQogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTcwCiAgICAvLyBuZXh0X2ludGVyZXN0X2Jhc2UgPSBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGJ1cnkgMTAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgZXhpc3RzCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDMzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTcxCiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCk6CiAgICBkaWcgMTQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlAMzQKICAgIGRpZyA3CiAgICBidXJ5IDkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzgKCmZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDM0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTcyCiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTczCiAgICAvLyBuZXh0X2ludGVyZXN0X2Jhc2UgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzgKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDMyCiAgICAvLyBpZiBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKToKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzMwogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKToKICAgIGRpZyAxNAogICAgcHVzaGludCAxOQogICAgPT0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDIyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzQKICAgIC8vIHJldHVybiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1NQogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzUKICAgIC8vIGludGVyZXN0X2R1ZSA9IHNlbGYuYWNjcnVlZF9pbnRlcmVzdCArIHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZGlnIDE2CiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBidXJ5IDE4CiAgICArCiAgICBkdXAKICAgIGJ1cnkgMTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzNgogICAgLy8gaWYgc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIDw9IGludGVyZXN0X2R1ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIGV4aXN0cwogICAgPj0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDI0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzcKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1NQogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzgKICAgIC8vIHByaW5jaXBhbF9hbW91bnQgPSBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gLSBpbnRlcmVzdF9kdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIGV4aXN0cwogICAgZGlnIDEwCiAgICAtCiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDM5CiAgICAvLyBpZiBwcmluY2lwYWxfYW1vdW50ID4gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWw6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgID4KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDI2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NDAKICAgIC8vIHJldHVybiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1NQogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjY6CiAgICBkaWcgNgogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTUKICAgIC8vIHByaW5jaXBhbF9hbW91bnRfZHVlID0gc2VsZi5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudChlbnRyeSkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnRAMjgKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDI3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDQzCiAgICAvLyBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA8PSBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZGlnIDE1CiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBkdXAyCiAgICA8PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDQyLTQ0NAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA8PSBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NDUKICAgIC8vIHJldHVybiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCAtIGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBzd2FwCiAgICAtCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1NQogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MTgKICAgIC8vIHJldHVybiBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgKyBzZWxmLl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KGVudHJ5KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgIGRpZyAxNgogICAgY2FsbHN1YiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudAogICAgYnVyeSAxOAogICAgKwogICAgYnVyeSAxMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTU0CiAgICAvLyBpbnRlcmVzdF9hbW91bnRfZHVlID0gc2VsZi5fZW50cnlfaW50ZXJlc3RfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfaW50ZXJlc3RfYW1vdW50QDE2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAMTE6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTAwCiAgICAvLyBhc3NlcnQgcHJvY2Vzc2VkX2V2ZW50cyA+IFVJbnQ2NCgwKSwgZXJyLk5PX0RVRV9DQVNIRkxPVwogICAgZGlnIDQKICAgIGR1cAogICAgYXNzZXJ0IC8vIE5vIGR1ZSBjYXNoZmxvdyB0byBwYXkKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMDQKICAgIC8vIHRvdGFsX2Z1bmRlZD1mdW5kZWRfaW50ZXJlc3QgKyBmdW5kZWRfcHJpbmNpcGFsLAogICAgZGlnIDE0CiAgICBkdXAKICAgIGRpZyAxNQogICAgZHVwCiAgICBjb3ZlciAzCiAgICArCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA2CiAgICAvLyB0aW1lc3RhbXA9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTAxLTEwNwogICAgLy8gcmV0dXJuIHR5cC5DYXNoRnVuZGluZ1Jlc3VsdCgKICAgIC8vICAgICBmdW5kZWRfaW50ZXJlc3Q9ZnVuZGVkX2ludGVyZXN0LAogICAgLy8gICAgIGZ1bmRlZF9wcmluY2lwYWw9ZnVuZGVkX3ByaW5jaXBhbCwKICAgIC8vICAgICB0b3RhbF9mdW5kZWQ9ZnVuZGVkX2ludGVyZXN0ICsgZnVuZGVkX3ByaW5jaXBhbCwKICAgIC8vICAgICBwcm9jZXNzZWRfZXZlbnRzPXByb2Nlc3NlZF9ldmVudHMsCiAgICAvLyAgICAgdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUA1MzoKICAgIGludGNfMCAvLyAwCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDU0CgoKLy8gbW9kdWxlcy5wYXltZW50X2FnZW50LlBheW1lbnRBZ2VudC5jbGFpbV9kdWVfY2FzaGZsb3dzW3JvdXRpbmddKCkgLT4gdm9pZDoKY2xhaW1fZHVlX2Nhc2hmbG93czoKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cG4gMgogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDYKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNQogICAgLy8gaWYgc2VsZi5vcF9kYWVtb24udmFsdWUgIT0gR2xvYmFsLnplcm9fYWRkcmVzczoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNyAvLyAweDUyM2E0ZjUwNDQyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wX2RhZW1vbiBleGlzdHMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE3CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjcgLy8gMHg1MjNhNGY1MDQ0MjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcF9kYWVtb24gZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE3LTE5CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIGJueiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfdHJ1ZUAxNAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE4CiAgICAvLyBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgdHhuIFNlbmRlcgogICAgZGlnIDMKICAgID09CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTctMTkKICAgIC8vIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICAvLyBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgYm56IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDE0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTkKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCAzMgogICAgPT0KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNy0xOQogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICBieiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VAMTUKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDE0OgogICAgaW50Y18xIC8vIDEKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUAxNjoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNi0yMAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyAgICAgb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vICAgICBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgLy8gKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCgpjbGFpbV9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTc6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTM5CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE0MAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzOAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTAKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTQzCiAgICAvLyBzZWxmLl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKGhvbGRpbmdfYWRkcmVzcykKICAgIGRpZyAyCiAgICBkdXAKICAgIGNhbGxzdWIgX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNDQKICAgIC8vIHNlbGYuX3NldHRsZV9wb3NpdGlvbihob2xkaW5nX2FkZHJlc3MpCiAgICBjYWxsc3ViIF9zZXR0bGVfcG9zaXRpb24KICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExNwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY2xhaW1hYmxlX2ludGVyZXN0CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBkdXAKICAgIHB1c2hpbnQgNzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExOAogICAgLy8gKyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jbGFpbWFibGVfcHJpbmNpcGFsCiAgICBkdXAKICAgIHB1c2hpbnQgODEKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExNy0xMTgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNsYWltYWJsZV9pbnRlcmVzdAogICAgLy8gKyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jbGFpbWFibGVfcHJpbmNpcGFsCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTQ2CiAgICAvLyBhc3NlcnQgdG90YWxfYW1vdW50ID4gVUludDY0KDApLCBlcnIuTk9fRFVFX0NBU0hGTE9XCiAgICBhc3NlcnQgLy8gTm8gZHVlIGNhc2hmbG93IHRvIHBheQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI1CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MuaXNfb3B0ZWRfaW4oCiAgICBleHRyYWN0IDAgMzIKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNgogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNS0yNwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLmlzX29wdGVkX2luKAogICAgLy8gICAgIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZAogICAgLy8gKQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNS0yOAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLmlzX29wdGVkX2luKAogICAgLy8gICAgIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZAogICAgLy8gKQogICAgLy8gYW5kIG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQKICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAyNAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI4CiAgICAvLyBhbmQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCAzODQKICAgIGdldGJpdAogICAgYm56IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAyNAogICAgaW50Y18xIC8vIDEKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUAyNToKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNTEKICAgIC8vIGlmIHNlbGYuX2lzX3BheW1lbnRfZXhlY3V0YWJsZShob2xkaW5nX2FkZHJlc3MpOgogICAgYnogY2xhaW1fZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozNAogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIHN3YXAKICAgIGRpZyAxCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozNC0zNQogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIC8vID49IHBheW1lbnRfYW1vdW50CiAgICBkaWcgNQogICAgZHVwCiAgICBjb3ZlciAyCiAgICA+PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjMzLTM2CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICAvLyAgICAgPj0gcGF5bWVudF9hbW91bnQKICAgIC8vICksIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcyBmb3IgdGhlIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNTMKICAgIC8vIHNlbGYuX3BheShzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MsIHRvdGFsX2Ftb3VudCkKICAgIGRpZyAyCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBkdXAKICAgIGV4dHJhY3QgMCAzMgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQwLTQ1CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9cmVjZWl2ZXIsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWFtb3VudCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQ0CiAgICAvLyBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgdW5jb3ZlciAzCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIHVuY292ZXIgMgogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0MAogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgcHVzaGludCA0IC8vIGF4ZmVyCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQwLTQ1CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9cmVjZWl2ZXIsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWFtb3VudCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMjUtMTI2CiAgICAvLyAjIEdldCB0aGUgY2xhaW1hYmxlIGFtb3VudHMgYmVmb3JlIHJlc2V0CiAgICAvLyBpbnRlcmVzdF9hbW91bnQgPSBwb3NpdGlvbi5jbGFpbWFibGVfaW50ZXJlc3QKICAgIGR1cAogICAgcHVzaGludCA3MwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSA5CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTI3CiAgICAvLyBwcmluY2lwYWxfYW1vdW50ID0gcG9zaXRpb24uY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgZHVwCiAgICBwdXNoaW50IDgxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAzCiAgICBidXJ5IDkKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMjktMTMwCiAgICAvLyAjIFJlc2V0IHRoZSBwb3NpdGlvbidzIGNsYWltYWJsZSBhbW91bnRzCiAgICAvLyBwb3NpdGlvbi5jbGFpbWFibGVfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBpdG9iCiAgICBzd2FwCiAgICBkaWcgMQogICAgcmVwbGFjZTIgNzMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzEKICAgIC8vIHBvc2l0aW9uLmNsYWltYWJsZV9wcmluY2lwYWwgPSBVSW50NjQoMCkKICAgIHN3YXAKICAgIHJlcGxhY2UyIDgxCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTMyCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHBvc2l0aW9uLmNvcHkoKQogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTM0CiAgICAvLyBhc3NlcnQgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCA+PSBpbnRlcmVzdF9hbW91bnQsIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX2ludGVyZXN0IGV4aXN0cwogICAgZHVwCiAgICBkaWcgMgogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzNQogICAgLy8gYXNzZXJ0IHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsID49IHByaW5jaXBhbF9hbW91bnQsIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICBkaWcgMwogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzNy0xMzgKICAgIC8vICMgVXBkYXRlIHRoZSBnbG9iYWwgcmVzZXJ2ZWQgaW50ZXJlc3QgYW5kIHByaW5jaXBhbCBhbW91bnRzCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0IC09IGludGVyZXN0X2Ftb3VudAogICAgc3dhcAogICAgLQogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzkKICAgIC8vIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIC09IHByaW5jaXBhbF9hbW91bnQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIHN3YXAKICAgIC0KICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKY2xhaW1fZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTU5CiAgICAvLyB0b3RhbF9hbW91bnQ9aW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudCwKICAgIGRpZyA1CiAgICBkdXAKICAgIGRpZyA2CiAgICBkdXAKICAgIGNvdmVyIDMKICAgICsKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNjAKICAgIC8vIHRpbWVzdGFtcD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNTYtMTYyCiAgICAvLyByZXR1cm4gdHlwLkNhc2hDbGFpbVJlc3VsdCgKICAgIC8vICAgICBpbnRlcmVzdF9hbW91bnQ9aW50ZXJlc3RfYW1vdW50LAogICAgLy8gICAgIHByaW5jaXBhbF9hbW91bnQ9cHJpbmNpcGFsX2Ftb3VudCwKICAgIC8vICAgICB0b3RhbF9hbW91bnQ9aW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudCwKICAgIC8vICAgICB0aW1lc3RhbXA9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgY29udGV4dD1wYXltZW50X2luZm8sCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgMgogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIHB1c2hieXRlcyAweDAwMjIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAyNDoKICAgIGludGNfMCAvLyAwCiAgICBiIGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUAyNQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX2ZhbHNlQDE1OgogICAgaW50Y18wIC8vIDAKICAgIGIgY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDE2CgoKLy8gbW9kdWxlcy50cmFuc2Zlcl9hZ2VudC5UcmFuc2ZlckFnZW50LnRyYW5zZmVyX3NldF9zY2hlZHVsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRyYW5zZmVyX3NldF9zY2hlZHVsZToKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo0MAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQxCiAgICAvLyBhc3NlcnQgb3Blbl9kYXRlIDwgY2xvc3VyZV9kYXRlLCBlcnIuSU5WQUxJRF9TT1JUSU5HCiAgICBkdXAyCiAgICA8CiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbXVzdCBiZSBzb3J0ZWQgaW4gc3RyaWN0bHkgYXNjZW5kaW5nIG9yZGVyCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQzCiAgICAvLyBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA9IG9wZW5fZGF0ZQogICAgYnl0ZWMgMjkgLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIHVuY292ZXIgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDQKICAgIC8vIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlID0gY2xvc3VyZV9kYXRlCiAgICBieXRlYyAzMCAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDUKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy50cmFuc2Zlcl9hZ2VudC5UcmFuc2ZlckFnZW50LnByaW1hcnlfZGlzdHJpYnV0aW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcHJpbWFyeV9kaXN0cmlidXRpb246CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDYKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjcxCiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5wcmltYXJ5X2RlYWxlciwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDIyIC8vIDB4NTIzYTUwNTk0NDIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojc2CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo3NwogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzOAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojc4CiAgICAvLyBhc3NlcnQgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TRUQKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBjbG9zZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgY292ZXIgMwogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4MAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChob2xkaW5nX2FkZHJlc3MpCiAgICBzd2FwCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjgxCiAgICAvLyBhc3NlcnQgdW5pdHMgPiBVSW50NjQoMCksIGVyci5aRVJPX1VOSVRTCiAgICBkdXAKICAgIGFzc2VydCAvLyBDYW4gbm90IGRpc3RyaWJ1dGUgemVybyB1bml0cwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4MwogICAgLy8gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCArIHVuaXRzIDw9IHNlbGYudG90YWxfdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICArCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgPD0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODItODQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCArIHVuaXRzIDw9IHNlbGYudG90YWxfdW5pdHMKICAgIC8vICksIGVyci5PVkVSX0RJU1RSSUJVVElPTgogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCByZW1haW5pbmcgRC1BU0EgdW5pdHMKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODUKICAgIC8vIGlmIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI4IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlIGV4aXN0cwogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojg3CiAgICAvLyBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8PSBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI4IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlIGV4aXN0cwogICAgPD0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODYtODgKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPD0gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGUKICAgIC8vICksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TRUQKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBjbG9zZWQKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNDgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnJlc2VydmVkX3VuaXRzICs9IHVuaXRzCiAgICBkdXBuIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDMKICAgIGR1cAogICAgY292ZXIgMwogICAgKwogICAgaXRvYgogICAgcHVzaGludCA0MAogICAgc3dhcAogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6OTEKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgKz0gdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICArCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6OTIKICAgIC8vIHJldHVybiBzZWxmLnRvdGFsX3VuaXRzIC0gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIHN3YXAKICAgIC0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMudHJhbnNmZXJfYWdlbnQuVHJhbnNmZXJBZ2VudC50cmFuc2Zlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnRyYW5zZmVyOgogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQ2CiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTMwCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxMzEKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzgKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTUwCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuX3N0YXR1c19pc19wZW5kaW5nX2llZCgpLCBlcnIuUEVORElOR19JRUQKICAgICEKICAgIGFzc2VydCAvLyBJRUQgbm90IHlldCBleGVjdXRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxMwogICAgLy8gaWYgc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjkgLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICBieiB0cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTUKICAgIC8vIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjkgLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNC0xNgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gKSwgZXJyLkNMT1NFRF9UUkFOU0ZFUgogICAgYXNzZXJ0IC8vIFRyYW5zZmVyIGlzIGNsb3NlZAoKdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNwogICAgLy8gaWYgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzAgLy8gInRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICBieiB0cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTkKICAgIC8vIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDwgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGUKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMCAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIDwKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTgtMjAKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZQogICAgLy8gKSwgZXJyLkNMT1NFRF9UUkFOU0ZFUgogICAgYXNzZXJ0IC8vIFRyYW5zZmVyIGlzIGNsb3NlZAoKdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxMzUKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIGRpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA4CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIGJ5dGVjIDggLy8gMHg0MTIzCiAgICBkaWcgNQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA5CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjEzOAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChzZW5kZXJfaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDIKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTM5CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGR1cAogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNDAKICAgIC8vIGFzc2VydCBzZW5kZXJfaG9sZGluZ19hZGRyZXNzICE9IHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcywgZXJyLlNFTEZfVFJBTlNGRVIKICAgIHVuY292ZXIgMgogICAgIT0KICAgIGFzc2VydCAvLyBTZW5kZXIgYW5kIHJlY2VpdmVyIG11c3QgYmUgZGlmZmVyZW50CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE0MQogICAgLy8gYXNzZXJ0IHVuaXRzID4gVUludDY0KDApLCBlcnIuTlVMTF9UUkFOU0ZFUgogICAgZGlnIDEKICAgIGR1cAogICAgYXNzZXJ0IC8vIFRyYW5zZmVyIHVuaXRzIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTQyCiAgICAvLyBhc3NlcnQgdW5pdHMgPD0gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLCBlcnIuT1ZFUl9UUkFOU0ZFUgogICAgc3dhcAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIDw9CiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IHNlbmRlciB1bml0cyB0byB0cmFuc2ZlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzY2CiAgICAvLyBpZiBzZWxmLmV2ZW50X2N1cnNvciA+PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICA+PQogICAgYm56IHRyYW5zZmVyX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Fzc2VydF9ub19kdWVfZXZlbnRfcGVuZGluZ0AxMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzY4CiAgICAvLyBuZXh0X2VudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KHNlbGYuZXZlbnRfY3Vyc29yKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc3MAogICAgLy8gbmV4dF9lbnRyeS5zY2hlZHVsZWRfdGltZSA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NjktNzcxCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIG5leHRfZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gKSwgZXJyLlBFTkRJTkdfQUNUVVNfRVZFTlQKICAgIGFzc2VydCAvLyBBQ1RVUyBldmVudCBub3QgeWV0IGV4ZWN1dGVkCgp0cmFuc2Zlcl9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9hc3NlcnRfbm9fZHVlX2V2ZW50X3BlbmRpbmdAMTA6CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE0NQogICAgLy8gc2VsZi5fZW5zdXJlX3VuaXRzX2FjdGl2YXRlZChzZW5kZXJfaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDMKICAgIGR1cAogICAgY2FsbHN1YiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNDYKICAgIC8vIHNlbGYuX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQocmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgY2FsbHN1YiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNDcKICAgIC8vIHNlbGYuX3NldHRsZV9wb3NpdGlvbihzZW5kZXJfaG9sZGluZ19hZGRyZXNzKQogICAgY2FsbHN1YiBfc2V0dGxlX3Bvc2l0aW9uCiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTQ4CiAgICAvLyBzZWxmLl9zZXR0bGVfcG9zaXRpb24ocmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzKQogICAgY2FsbHN1YiBfc2V0dGxlX3Bvc2l0aW9uCiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNTIKICAgIC8vIGFzc2VydCB1bml0cyA8PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cywgZXJyLk9WRVJfVFJBTlNGRVIKICAgIGRpZyA1CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkaWcgMQogICAgPD0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgc2VuZGVyIHVuaXRzIHRvIHRyYW5zZmVyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTUzCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyAtPSB1bml0cwogICAgZGlnIDEKICAgIC0KICAgIGl0b2IKICAgIHVuY292ZXIgMgogICAgaW50Y18zIC8vIDMyCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTQ0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyArPSB1bml0cwogICAgZGlnIDUKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIHVuY292ZXIgMgogICAgKwogICAgaXRvYgogICAgaW50Y18zIC8vIDMyCiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfc3VzcGVuc2lvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfc3VzcGVuc2lvbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojc3CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyMSAvLyAweDUyM2E0MTU1NTQyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE4NQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkID0gc3VzcGVuZGVkCiAgICBkdXAKICAgIHB1c2hpbnQgNDgKICAgIGludGNfMSAvLyAxCiAgICBib3hfZXh0cmFjdAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMwogICAgc2V0Yml0CiAgICBwdXNoaW50IDQ4CiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE4NgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTY1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5hY2NvdW50X29wZW5bcm91dGluZ10oKSAtPiB2b2lkOgphY2NvdW50X29wZW46CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjgKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmFjY291bnRfbWFuYWdlciwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDIzIC8vIDB4NTIzYTRkNGU0NzIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDIKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0VOREVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDIwMAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTAKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX2VuZGVkKCksIGVyci5VTkFVVEhPUklaRUQKICAgICEKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxMQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTIKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjEzCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozNAogICAgLy8gdW5pdHM9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozMi00MgogICAgLy8gcmV0dXJuIHR5cC5BY2NvdW50UG9zaXRpb24oCiAgICAvLyAgICAgcGF5bWVudF9hZGRyZXNzPXBheW1lbnRfYWRkcmVzcywKICAgIC8vICAgICB1bml0cz1VSW50NjQoMCksCiAgICAvLyAgICAgcmVzZXJ2ZWRfdW5pdHM9VUludDY0KDApLAogICAgLy8gICAgIHN1c3BlbmRlZD1GYWxzZSwKICAgIC8vICAgICBzZXR0bGVkX2N1cnNvcj1VSW50NjQoMCksCiAgICAvLyAgICAgaW50ZXJlc3RfY2hlY2twb2ludD1VSW50NjQoMCksCiAgICAvLyAgICAgcHJpbmNpcGFsX2NoZWNrcG9pbnQ9VUludDY0KDApLAogICAgLy8gICAgIGNsYWltYWJsZV9pbnRlcmVzdD1VSW50NjQoMCksCiAgICAvLyAgICAgY2xhaW1hYmxlX3ByaW5jaXBhbD1VSW50NjQoMCksCiAgICAvLyApCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGJ5dGVjIDQwIC8vIDB4MDAKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjE0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHNlbGYuX25ld19hY2NvdW50X3Bvc2l0aW9uKHBheW1lbnRfYWRkcmVzcykKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTUKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjM4CiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIHVuY292ZXIgMwogICAgPT0KICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIzOQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDAKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQxCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MgPSBwYXltZW50X2FkZHJlc3MKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQyCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfZ2V0X3Bvc2l0aW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF9nZXRfcG9zaXRpb246CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNTkKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9jcmVhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9jcmVhdGU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAzNgogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IGFycmFuZ2VyCiAgICBieXRlYyAxOCAvLyAweDUyM2E0MTUyNTIyMwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMzcKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfY29uZmlnW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfY29uZmlnOgogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBsZW4KICAgIHB1c2hpbnQgMTA3CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLk5vcm1hbGl6ZWRBY3R1c1Rlcm1zCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgcHVzaGludCA3MgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5Jbml0aWFsS2VybmVsU3RhdGUKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBsZW4KICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIHR1cGxlIGVuY29kaW5nCiAgICBkdXAKICAgIHB1c2hpbnQgMzQKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCB0YWlsIHBvaW50ZXIgYXQgaW5kZXggMSBvZiAodWludDhbMzJdLChsZW4rdXRmOFtdKSkKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgY292ZXIgMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMzYKICAgICsKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuUHJvc3BlY3R1cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2OQogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDcxLTEwNzIKICAgIC8vICMgQ29uZmlndXJlIENvbnRyYWN0CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPSB0ZXJtcy5jb250cmFjdF90eXBlLmFzX3VpbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIxLTIyOAogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgYnogY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUA3CiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIyMwogICAgLy8gVUludDY0KGVudW1zLkNUX0FOTiksCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIxLTIyOAogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjI0CiAgICAvLyBVSW50NjQoZW51bXMuQ1RfTkFNKSwKICAgIHB1c2hpbnQgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIxLTIyOAogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjI1CiAgICAvLyBVSW50NjQoZW51bXMuQ1RfTEFNKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIxLTIyOAogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjI2CiAgICAvLyBVSW50NjQoZW51bXMuQ1RfTEFYKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIxLTIyOAogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjI3CiAgICAvLyBVSW50NjQoZW51bXMuQ1RfQ0xNKSwKICAgIHB1c2hpbnQgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIxLTIyOAogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJ6IGNvbnRyYWN0X2NvbmZpZ19ib29sX2ZhbHNlQDgKCmNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANzoKICAgIGludGNfMSAvLyAxCgpjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUA5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjMyCiAgICAvLyBhc3NlcnQgc2VsZi5faXNfc3VwcG9ydGVkX2NvbnRyYWN0X3R5cGUoY29udHJhY3RfdHlwZSksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3NAogICAgLy8gc2VsZi5fc3RvcmVfY29udHJhY3RfY29uZmlnKHNlbGYuY29udHJhY3RfdHlwZSwgdGVybXMsIGluaXRpYWxfc3RhdGUpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgYnVyeSAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzI4CiAgICAvLyBhc3NlcnQgdGVybXMuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZGlnIDQKICAgIGR1cAogICAgcHVzaGludCAzMwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSA4CiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzAKICAgIC8vIHRlcm1zLmRheV9jb3VudF9jb252ZW50aW9uLmFzX3VpbnQ2NCgpCiAgICBwdXNoaW50IDU3CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzAwLTMwNgogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICBieiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDE2CiAgICBkaWcgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzAyCiAgICAvLyBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMwMC0zMDYKICAgIC8vIHJldHVybiBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzYwKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwSVNEQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjApLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDE2CiAgICBkaWcgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzAzCiAgICAvLyBVSW50NjQoZW51bXMuRENDX0EzNjUpLAogICAgcHVzaGludCAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDAtMzA2CiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgID09CiAgICBibnogY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUAxNgogICAgZGlnIDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMwNAogICAgLy8gVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzAwLTMwNgogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGRpZyA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDUKICAgIC8vIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzAwLTMwNgogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICA9PQogICAgYnogY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAMTcKCmNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTY6CiAgICBpbnRjXzEgLy8gMQoKY29udHJhY3RfY29uZmlnX2Jvb2xfbWVyZ2VAMTg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTItMzE0CiAgICAvLyBhc3NlcnQgc2VsZi5faXNfc3VwcG9ydGVkX2RheV9jb3VudF9jb252ZW50aW9uKAogICAgLy8gICAgIGRheV9jb3VudF9jb252ZW50aW9uCiAgICAvLyApLCBlcnIuSU5WQUxJRF9EQVlfQ09VTlRfQ09OVkVOVElPTgogICAgYXNzZXJ0IC8vIEludmFsaWQgZGF5LWNvdW50IGNvbnZlbnRpb24gSUQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMzMgogICAgLy8gaWYgY29udHJhY3RfdHlwZSAhPSBVSW50NjQoZW51bXMuQ1RfQU5OKToKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgICE9CiAgICBieiBjb250cmFjdF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzMzCiAgICAvLyBhc3NlcnQgbm90IHRlcm1zLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24sIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZGlnIDQKICAgIHB1c2hpbnQgNzg2CiAgICBnZXRiaXQKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KCmNvbnRyYWN0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDIwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODEwCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIEQtQVNBIGFscmVhZHkgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODExCiAgICAvLyBhc3NlcnQgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCA9PSBVSW50NjQoMCksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMCAvLyAiaW5pdGlhbF9leGNoYW5nZV9hbW91bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTMtODE0CiAgICAvLyAjIFNldCBEZW5vbWluYXRpb24gQXNzZXQKICAgIC8vIHNlbGYuX2Fzc2VydF9kZW5vbWluYXRpb25fYXNzZXQodGVybXMuZGVub21pbmF0aW9uX2Fzc2V0X2lkKQogICAgZGlnIDQKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NzgtNzc5CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIGRlbm9taW5hdGlvbiB3aXRoIEFTQQogICAgLy8gX2NyZWF0b3IsIGV4aXN0cyA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X2NyZWF0b3IoZGVub21pbmF0aW9uX2Fzc2V0X2lkKQogICAgZHVwCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q3JlYXRvcgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODAKICAgIC8vIGFzc2VydCBleGlzdHMsIGVyci5JTlZBTElEX0RFTk9NSU5BVElPTgogICAgYXNzZXJ0IC8vIERlbm9taW5hdGlvbiBhc3NldCBpcyBub3QgcHJvcGVybHkgc2V0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODMKICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICBieXRlYyA0NCAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTctODE4CiAgICAvLyAjIFNldCBTZXR0bGVtZW50IEFzc2V0CiAgICAvLyBzZWxmLl9hc3NlcnRfc2V0dGxlbWVudF9hc3NldCh0ZXJtcy5zZXR0bGVtZW50X2Fzc2V0X2lkKQogICAgZGlnIDEKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc4OAogICAgLy8gc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODYtNzg5CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc2V0dGxlbWVudCBhc3NldCBpcyB0aGUgZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQgPT0gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIC8vICksIGVyci5JTlZBTElEX1NFVFRMRU1FTlRfQVNTRVQKICAgIGFzc2VydCAvLyBEaWZmZXJlbnQgc2V0dGxlbWVudCBhc3NldCBub3Qgc3VwcG9ydGVkLCBtdXN0IGJlIGVxdWFsIHRvIGRlbm9taW5hdGlvbiBhc3NldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkyCiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBzZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkzLTc5OQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhc3NldF9hbW91bnQ9MCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Nzk4CiAgICAvLyBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Nzk2CiAgICAvLyBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc5NwogICAgLy8gYXNzZXRfYW1vdW50PTAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkzLTc5NAogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3OTMtNzk5CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODIxLTgyMgogICAgLy8gIyBVbml0cwogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IHRlcm1zLnRvdGFsX3VuaXRzCiAgICBkdXAKICAgIHB1c2hpbnQgMTcKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODIzCiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID0gVUludDY0KDApCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgyNS04MjYKICAgIC8vICMgRGF5LUNvdW50IENvbnZlbnRpb25zCiAgICAvLyBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uID0gdGVybXMuZGF5X2NvdW50X2NvbnZlbnRpb24uYXNfdWludDY0KCkKICAgIGJ5dGVjIDQ2IC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGRpZyA4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODI4LTgyOQogICAgLy8gIyBUaW1lCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA9IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZQogICAgZHVwCiAgICBwdXNoaW50IDQxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMjggLy8gImluaXRpYWxfZXhjaGFuZ2VfZGF0ZSIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODMwCiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSB0ZXJtcy5tYXR1cml0eV9kYXRlCiAgICBkaWcgMQogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDQ1IC8vICJtYXR1cml0eV9kYXRlIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MzEKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IGluaXRpYWxfc3RhdGUubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZGlnIDYKICAgIGR1cAogICAgY292ZXIgMgogICAgcHVzaGludCA0OAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzMy04MzQKICAgIC8vICMgUHJpbmNpcGFsCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID0gdGVybXMuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGRpZyAxMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzNQogICAgLy8gc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gdGVybXMuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZGlnIDMKICAgIHB1c2hpbnQgNzg2CiAgICBnZXRiaXQKICAgIGJ5dGVjIDM0IC8vICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzNgogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBpbml0aWFsX3N0YXRlLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZGlnIDEKICAgIHB1c2hpbnQgMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODM4LTgzOQogICAgLy8gIyBJbnRlcmVzdAogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ID0gaW5pdGlhbF9zdGF0ZS5hY2NydWVkX2ludGVyZXN0CiAgICBkaWcgMQogICAgcHVzaGludCA0MAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQxLTg0MgogICAgLy8gIyBJbnRlcmVzdCBSYXRlCiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IGluaXRpYWxfc3RhdGUubm9taW5hbF9pbnRlcmVzdF9yYXRlCiAgICBkaWcgMQogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0MwogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gaW5pdGlhbF9zdGF0ZS5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlCiAgICBkaWcgMQogICAgcHVzaGludCAyNAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQ0CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkID0gdGVybXMucmF0ZV9yZXNldF9zcHJlYWQKICAgIGRpZyAzCiAgICBwdXNoaW50IDU4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzUgLy8gInJhdGVfcmVzZXRfc3ByZWFkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0NQogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIgPSB0ZXJtcy5yYXRlX3Jlc2V0X211bHRpcGxpZXIKICAgIGRpZyAzCiAgICBwdXNoaW50IDY2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzYgLy8gInJhdGVfcmVzZXRfbXVsdGlwbGllciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDYKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9mbG9vciA9IHRlcm1zLnJhdGVfcmVzZXRfZmxvb3IKICAgIGRpZyAzCiAgICBwdXNoaW50IDc0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzEgLy8gInJhdGVfcmVzZXRfZmxvb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQ3CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfY2FwID0gdGVybXMucmF0ZV9yZXNldF9jYXAKICAgIGRpZyAzCiAgICBwdXNoaW50IDgyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzIgLy8gInJhdGVfcmVzZXRfY2FwIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0OAogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X25leHQgPSB0ZXJtcy5yYXRlX3Jlc2V0X25leHQKICAgIGRpZyAzCiAgICBwdXNoaW50IDkwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzcgLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDkKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgPSB0ZXJtcy5oYXNfcmF0ZV9yZXNldF9mbG9vcgogICAgZGlnIDMKICAgIHB1c2hpbnQgNzg0CiAgICBnZXRiaXQKICAgIGJ5dGVjIDM4IC8vICJoYXNfcmF0ZV9yZXNldF9mbG9vciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NTAKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwID0gdGVybXMuaGFzX3JhdGVfcmVzZXRfY2FwCiAgICBkaWcgMwogICAgcHVzaGludCA3ODUKICAgIGdldGJpdAogICAgYnl0ZWMgMzkgLy8gImhhc19yYXRlX3Jlc2V0X2NhcCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NTItODUzCiAgICAvLyAjIFNjYWxpbmcKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgPSB0ZXJtcy5maXhlZF9wb2ludF9zY2FsZQogICAgdW5jb3ZlciAzCiAgICBwdXNoaW50IDk5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU1LTg1NgogICAgLy8gIyBTY2hlZHVsZSBQcm9jZXNzaW5nCiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciA9IGluaXRpYWxfc3RhdGUuZXZlbnRfY3Vyc29yCiAgICBkaWcgMQogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU4LTg1OQogICAgLy8gIyBQZXItVW5pdCBGaXhlZC1Qb2ludCBJbmRleGVzCiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggPSBpbml0aWFsX3N0YXRlLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgKICAgIGRpZyAxCiAgICBwdXNoaW50IDU2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODYwCiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4ID0gaW5pdGlhbF9zdGF0ZS5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleAogICAgZGlnIDEKICAgIHB1c2hpbnQgNjQKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODYyLTg2MwogICAgLy8gIyBSZXNlcnZlZCBBbW91bnQgKGZvciBleGVjdXRlZCBjYXNoZmxvd3MpCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0ID0gVUludDY0KDApCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2NAogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2NgogICAgLy8gYXNzZXJ0IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLCBlcnIuSU5WQUxJRF9JRUQKICAgIGRpZyAyCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICBhc3NlcnQgLy8gSUVEIG11c3QgYmUgc2V0IGluIHRoZSBmdXR1cmUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2NwogICAgLy8gYXNzZXJ0IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA+IGluaXRpYWxfc3RhdGUuc3RhdHVzX2RhdGUsIGVyci5JTlZBTElEX0lFRAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgPAogICAgYXNzZXJ0IC8vIElFRCBtdXN0IGJlIHNldCBpbiB0aGUgZnV0dXJlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NjgKICAgIC8vIGFzc2VydCB0ZXJtcy5pbml0aWFsX2V4Y2hhbmdlX2RhdGUgPCB0ZXJtcy5tYXR1cml0eV9kYXRlLCBlcnIuSU5WQUxJRF9JRUQKICAgIDwKICAgIGFzc2VydCAvLyBJRUQgbXVzdCBiZSBzZXQgaW4gdGhlIGZ1dHVyZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3Ni0xMDc3CiAgICAvLyAjIE5vdGFyaXplIHByb3NwZWN0dXMgKG9wdGlvbmFsKQogICAgLy8gc2VsZi5wcm9zcGVjdHVzX2hhc2ggPSBwcm9zcGVjdHVzLmhhc2guYnl0ZXMKICAgIGRpZyAyCiAgICBleHRyYWN0IDAgMzIKICAgIGJ5dGVjIDQyIC8vICJwcm9zcGVjdHVzX2hhc2giCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3OAogICAgLy8gc2VsZi5wcm9zcGVjdHVzX3VybCA9IHByb3NwZWN0dXMudXJsCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGVjIDQzIC8vICJwcm9zcGVjdHVzX3VybCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc5CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAMTc6CiAgICBpbnRjXzAgLy8gMAogICAgYiBjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUAxOAoKY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAODoKICAgIGludGNfMCAvLyAwCiAgICBiIGNvbnRyYWN0X2NvbmZpZ19ib29sX21lcmdlQDkKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9zY2hlZHVsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X3NjaGVkdWxlOgogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDgxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHN3YXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBkdXAKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgMgogICAgKwogICAgdW5jb3ZlciAyCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLkV4ZWN1dGlvblNjaGVkdWxlRW50cnk+CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTEzCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMTYKICAgIC8vIGNvbnRyYWN0X3R5cGU9c2VsZi5jb250cmFjdF90eXBlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGNvdmVyIDMKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4ODQKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4ODUtODg3CiAgICAvLyBhc3NlcnQgc2NoZWR1bGVfcGFnZS5sZW5ndGggPD0gVUludDY0KAogICAgLy8gICAgIGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUKICAgIC8vICksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGR1cAogICAgcHVzaGludCAxNgogICAgPD0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg4OAogICAgLy8gYXNzZXJ0IHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPiBVSW50NjQoMCksIGVyci5URVJNU19OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSB0ZXJtcyBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODkwCiAgICAvLyBwYWdlX2N1cnNvciA9IHNjaGVkdWxlX3BhZ2VfaW5kZXggKiBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkKICAgIHN3YXAKICAgIHB1c2hpbnQgMTYKICAgICoKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg5NwogICAgLy8gKyBwYWdlX2xlbmd0aCAqIFVJbnQ2NChjc3QuT1BfVVBfQ09OVFJBQ1RfQ09ORklHX1BFUl9FTlRSWV9CVURHRVQpCiAgICBwdXNoaW50IDEwMAogICAgKgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODk2CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19CQVNFX0JVREdFVCkKICAgIGludGMgNCAvLyAxNTAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTYtODk3CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19CQVNFX0JVREdFVCkKICAgIC8vICsgcGFnZV9sZW5ndGggKiBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19QRVJfRU5UUllfQlVER0VUKQogICAgKwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODkyLTg5OQogICAgLy8gIyBWYWxpZGF0aW9uIGNvc3QgZ3Jvd3Mgd2l0aCBwYWdlIGxlbmd0aCwgc28gY29uZmlndXJhdGlvbiBleHBsaWNpdGx5CiAgICAvLyAjIGJ1eXMgZXh0cmEgb3Bjb2RlIGJ1ZGdldCBmb3IgbGFyZ2VyIHVwbG9hZHMuCiAgICAvLyBlbnN1cmVfYnVkZ2V0KAogICAgLy8gICAgIHJlcXVpcmVkX2J1ZGdldD0oCiAgICAvLyAgICAgICAgIFVJbnQ2NChjc3QuT1BfVVBfQ09OVFJBQ1RfQ09ORklHX0JBU0VfQlVER0VUKQogICAgLy8gICAgICAgICArIHBhZ2VfbGVuZ3RoICogVUludDY0KGNzdC5PUF9VUF9DT05UUkFDVF9DT05GSUdfUEVSX0VOVFJZX0JVREdFVCkKICAgIC8vICAgICApLAogICAgLy8gKQogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTAwCiAgICAvLyBpbmRleCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKCmNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEAyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTAxCiAgICAvLyB3aGlsZSBpbmRleCA8IHBhZ2VfbGVuZ3RoOgogICAgZHVwCiAgICBkaWcgNAogICAgPAogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfd2hpbGVAMTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkwMi05MDMKICAgIC8vIGVudHJ5ID0gc2NoZWR1bGVfcGFnZVtpbmRleF0uY29weSgpCiAgICAvLyBlbnRyeV9ldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZGlnIDQKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGJ1cnkgMTIKICAgIGRpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgNjUKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTAzCiAgICAvLyBlbnRyeV9ldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDItOTAzCiAgICAvLyBlbnRyeSA9IHNjaGVkdWxlX3BhZ2VbaW5kZXhdLmNvcHkoKQogICAgLy8gZW50cnlfZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGludGNfMiAvLyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDMKICAgIC8vIGVudHJ5X2V2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBnZXRieXRlCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgMTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkwNAogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X2lkID09IHBhZ2VfY3Vyc29yICsgaW5kZXgsIGVyci5JTlZBTElEX0VWRU5UX0lECiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEzCiAgICBkaWcgNQogICAgdW5jb3ZlciA0CiAgICArCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDUtOTA3CiAgICAvLyBzZWxmLl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBlbnRyeV9ldmVudF90eXBlCiAgICAvLyApCiAgICBkaWcgNQogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTA4CiAgICAvLyBhc3NlcnQgZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgc3dhcAogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDkKICAgIC8vIGlmIGVudHJ5LmV2ZW50X2lkID4gVUludDY0KDApOgogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTAKICAgIC8vIGlmIGluZGV4ID4gVUludDY0KDApOgogICAgZHVwCiAgICBieiBjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlANgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTExCiAgICAvLyBwcmV2aW91c19lbnRyeSA9IHNjaGVkdWxlX3BhZ2VbaW5kZXggLSBVSW50NjQoMSldLmNvcHkoKQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgcHVzaGludCA2NQogICAgKgogICAgZGlnIDExCiAgICBzd2FwCiAgICBwdXNoaW50IDY1CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkyNgogICAgLy8gcHJldmlvdXNfZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gZW50cnkuc2NoZWR1bGVkX3RpbWUKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyA4CiAgICA8PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTI1LTkyNwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBwcmV2aW91c19lbnRyeS5zY2hlZHVsZWRfdGltZSA8PSBlbnRyeS5zY2hlZHVsZWRfdGltZQogICAgLy8gKSwgZXJyLklOVkFMSURfU09SVElORwogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIG11c3QgYmUgc29ydGVkIGluIHN0cmljdGx5IGFzY2VuZGluZyBvcmRlcgoKY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUA4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTI4CiAgICAvLyBpZiBlbnRyeS5ldmVudF9pZCA9PSBVSW50NjQoMCk6CiAgICBkaWcgOAogICAgYm56IGNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkyOS05MzEKICAgIC8vIGFzc2VydCBlbnRyeV9ldmVudF90eXBlID09IFVJbnQ2NCgKICAgIC8vICAgICBlbnVtcy5FVlRfSUVECiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGRpZyA5CiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MzIKICAgIC8vIGluZGV4ICs9IFVJbnQ2NCgxKQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIGNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEAyCgpjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlANjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkxMy05MTUKICAgIC8vICMgVGhlIGZpcnN0IGVudHJ5IG9mIGEgcGFnZSBtdXN0IHN0aWxsIGJlIG9yZGVyZWQgYWZ0ZXIgdGhlCiAgICAvLyAjIGxhc3QgZW50cnkgb2YgdGhlIHByZXZpb3VzIHBhZ2UuCiAgICAvLyBhc3NlcnQgc2NoZWR1bGVfcGFnZV9pbmRleCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGRpZyA2CiAgICBkdXAKICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTYKICAgIC8vIHByZXZpb3VzX3BhZ2VfaW5kZXggPSBzY2hlZHVsZV9wYWdlX2luZGV4IC0gVUludDY0KDEpCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTE4CiAgICAvLyBwcmV2aW91c19wYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZQogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTctOTE5CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHByZXZpb3VzX3BhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjAtOTIxCiAgICAvLyBwcmV2aW91c19wYWdlID0gc2VsZi5zY2hlZHVsZV9wYWdlW3ByZXZpb3VzX3BhZ2VfaW5kZXhdLmNvcHkoKQogICAgLy8gYXNzZXJ0IHByZXZpb3VzX3BhZ2UubGVuZ3RoID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBwdXNoaW50IDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjEKICAgIC8vIGFzc2VydCBwcmV2aW91c19wYWdlLmxlbmd0aCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZHVwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjMKICAgIC8vIHByZXZpb3VzX3BhZ2UubGVuZ3RoIC0gVUludDY0KDEpCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTIyLTkyNAogICAgLy8gcHJldmlvdXNfZW50cnkgPSBwcmV2aW91c19wYWdlWwogICAgLy8gICAgIHByZXZpb3VzX3BhZ2UubGVuZ3RoIC0gVUludDY0KDEpCiAgICAvLyBdLmNvcHkoKQogICAgcHVzaGludCA2NQogICAgKgogICAgcHVzaGludCAyCiAgICArCiAgICBwdXNoaW50IDY1CiAgICBib3hfZXh0cmFjdAogICAgYiBjb250cmFjdF9zY2hlZHVsZV9hZnRlcl9pZl9lbHNlQDcKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX3doaWxlQDExOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjAzCiAgICAvLyBzZWxmLnNjaGVkdWxlX3BhZ2VbcGFnZV9pbmRleF0gPSBzY2hlZHVsZV9wYWdlLmNvcHkoKQogICAgZGlnIDYKICAgIGl0b2IKICAgIGJ5dGVjIDI0IC8vIDB4NTMyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgZGlnIDUKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzNQogICAgLy8gaWYgaXNfbGFzdF9wYWdlOgogICAgZGlnIDUKICAgIGJ6IGNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzNwogICAgLy8gc2NoZWR1bGVfcGFnZV9pbmRleCAqIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKSArIHBhZ2VfbGVuZ3RoCiAgICBkaWcgMQogICAgZGlnIDQKICAgICsKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzNgogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA9ICgKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTM2LTkzOAogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA9ICgKICAgIC8vICAgICBzY2hlZHVsZV9wYWdlX2luZGV4ICogVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpICsgcGFnZV9sZW5ndGgKICAgIC8vICkKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MzkKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgNTAKICAgIGFwcF9nbG9iYWxfcHV0Cgpjb250cmFjdF9zY2hlZHVsZV9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEyMQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDgxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9leGVjdXRlX2llZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X2V4ZWN1dGVfaWVkOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQ2CiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDYKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE0NwogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDgKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTUwCiAgICAvLyBhc3NlcnQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LCBlcnIuSU5WQUxJRF9FVkVOVF9DVVJTT1IKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgZGlnIDEKICAgID4KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGN1cnNvcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1MQogICAgLy8gZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoc2VsZi5ldmVudF9jdXJzb3IpCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTIKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoZW51bXMuRVZUX0lFRCksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGR1cAogICAgZXh0cmFjdCA4IDEKICAgIGR1cAogICAgcHVzaGJ5dGVzIDB4MDEKICAgIGI9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1NgogICAgLy8gZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICBkaWcgMQogICAgZXh0cmFjdCAwIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTgKICAgIC8vIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgZGlnIDIKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTU5CiAgICAvLyBhY2NydWFsX2ZhY3Rvcj1lbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIGRpZyAzCiAgICBleHRyYWN0IDE3IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNjAKICAgIC8vIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIGRpZyA0CiAgICBleHRyYWN0IDI1IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNjIKICAgIC8vIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPWVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDUKICAgIGV4dHJhY3QgMzMgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE2MwogICAgLy8gbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgZGlnIDYKICAgIGV4dHJhY3QgNDEgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE2NAogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9ZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICBkaWcgNwogICAgZXh0cmFjdCA0OSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTY1CiAgICAvLyBmbGFncz1lbnRyeS5mbGFncywKICAgIGRpZyA4CiAgICBleHRyYWN0IDU3IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTUtMTE2NgogICAgLy8gdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0KAogICAgLy8gICAgIGV2ZW50X2lkPWVudHJ5LmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1lbnRyeS5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1lbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPWVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9ZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPWVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGZsYWdzPWVudHJ5LmZsYWdzLAogICAgLy8gKSwKICAgIHVuY292ZXIgNwogICAgdW5jb3ZlciA4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNwogICAgY29uY2F0CiAgICB1bmNvdmVyIDYKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNjEKICAgIC8vIG9ic2VydmVkX3JhdGU9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTUtMTE2NgogICAgLy8gdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0KAogICAgLy8gICAgIGV2ZW50X2lkPWVudHJ5LmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1lbnRyeS5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1lbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPWVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9ZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPWVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGZsYWdzPWVudHJ5LmZsYWdzLAogICAgLy8gKSwKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTUzLTExNjcKICAgIC8vIHNlbGYuX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5KAogICAgLy8gICAgIGVudHJ5LAogICAgLy8gICAgIHR5cC5PYnNlcnZlZEV2ZW50UmVxdWVzdCgKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPWVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIG9ic2VydmVkX3JhdGU9VUludDY0KDApLAogICAgLy8gICAgICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1lbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1lbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICAgICAgZmxhZ3M9ZW50cnkuZmxhZ3MsCiAgICAvLyAgICAgKSwKICAgIC8vICkKICAgIGNhbGxzdWIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5CiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNjgKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEyMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuYXBwbHlfbm9uX2Nhc2hfZXZlbnRbcm91dGluZ10oKSAtPiB2b2lkOgphcHBseV9ub25fY2FzaF9ldmVudDoKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDQKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTcwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cG4gMgogICAgbGVuCiAgICBwdXNoaW50IDczCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLk9ic2VydmVkRXZlbnRSZXF1ZXN0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDYKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIwNwogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMDgKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjEwCiAgICAvLyBpZiBwYXlsb2FkLmZsYWdzICYgVUludDY0KGVudW1zLkZMQUdfT0JTRVJWRURfRVZFTlQpOgogICAgcHVzaGludCA2NQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgcHVzaGludCA0CiAgICAmCiAgICBieiBhcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIzNgogICAgLy8gcmV0dXJuIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQ0xNKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICBwdXNoaW50IDUKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjExCiAgICAvLyBhc3NlcnQgc2VsZi5fc3VwcG9ydHNfb2JzZXJ2ZWRfZXZlbnRzKCksIGVyci5PQlNFUlZFRF9FVkVOVF9SRVFVSVJFRAogICAgYXNzZXJ0IC8vIE9ic2VydmVkIGV2ZW50IHJlcXVpcmVkIHRvIGV4ZWN1dGUgdGhpcyBhY3Rpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMTIKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjM2CiAgICAvLyByZXR1cm4gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9DTE0pCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIGR1cAogICAgcHVzaGludCA1CiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQ4CiAgICAvLyBhc3NlcnQgc2VsZi5fc3VwcG9ydHNfb2JzZXJ2ZWRfZXZlbnRzKCksIGVyci5PQlNFUlZFRF9FVkVOVF9SRVFVSVJFRAogICAgYXNzZXJ0IC8vIE9ic2VydmVkIGV2ZW50IHJlcXVpcmVkIHRvIGV4ZWN1dGUgdGhpcyBhY3Rpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk0OQogICAgLy8gYXNzZXJ0IHBheWxvYWQuZXZlbnRfaWQgPT0gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGRpZyAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDcKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBpZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTUxCiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUsIHBheWxvYWQuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgYnVyeSAxMgogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1MC05NTIKICAgIC8vIHNlbGYuX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIHNlbGYuY29udHJhY3RfdHlwZSwgcGF5bG9hZC5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICAvLyApCiAgICBjYWxsc3ViIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTU0CiAgICAvLyBwYWdlX2luZGV4ID0gc2VsZi5fc2NoZWR1bGVfcGFnZV9pbmRleChzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTkzCiAgICAvLyByZXR1cm4gZXZlbnRfaWQgLy8gVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpCiAgICBwdXNoaW50IDE2CiAgICAvCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTUKICAgIC8vIHBhZ2UgPSB0eXAuRXhlY3V0aW9uU2NoZWR1bGVQYWdlKCkKICAgIGJ5dGVjIDQ5IC8vIDB4MDAwMAogICAgYnVyeSA3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTYKICAgIC8vIGlmIHBhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlOgogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA5CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMjcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1NwogICAgLy8gcGFnZSA9IHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XS5jb3B5KCkKICAgIGRpZyA3CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidXJ5IDcKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX3BhZ2UgZW50cnkgZXhpc3RzCgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDI3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTU4CiAgICAvLyBhc3NlcnQgcGFnZS5sZW5ndGggPCBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGRpZyA1CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgMTYKICAgIDwKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2MwogICAgLy8gc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIGRpZyAzCiAgICBkdXAKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjQKICAgIC8vIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICBkaWcgMQogICAgZXh0cmFjdCAxNyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjUKICAgIC8vIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZGlnIDIKICAgIGV4dHJhY3QgMjUgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTY2CiAgICAvLyBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDMKICAgIGV4dHJhY3QgNDEgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTY3CiAgICAvLyBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIGRpZyA0CiAgICBleHRyYWN0IDQ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2OAogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIHVuY292ZXIgNQogICAgZXh0cmFjdCA1NyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjAtOTcwCiAgICAvLyB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1wYXlsb2FkLmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9cGF5bG9hZC5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPXBheWxvYWQucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXBheWxvYWQubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICkKICAgIGRpZyAxMQogICAgaXRvYgogICAgZGlnIDE4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMwogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTktOTcxCiAgICAvLyBwYWdlLmFwcGVuZCgKICAgIC8vICAgICB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9cGF5bG9hZC5ldmVudF9pZCwKICAgIC8vICAgICAgICAgZXZlbnRfdHlwZT1wYXlsb2FkLmV2ZW50X3R5cGUsCiAgICAvLyAgICAgICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIC8vICAgICAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICAgICApCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NzIKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHBhZ2UuY29weSgpCiAgICBkaWcgOAogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk3MwogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjE1CiAgICAvLyBhc3NlcnQgZXZlbnRfaWQgPT0gc2VsZi5ldmVudF9jdXJzb3IsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBjdXJzb3IKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMTYKICAgIC8vIGVudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KGV2ZW50X2lkKQogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIxOAogICAgLy8gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgYnVyeSAxMAogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjcKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjYtMzczCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY4CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY2LTM3MwogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9SUiksCiAgICBwdXNoaW50IDEyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjYtMzczCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzcwCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICBwdXNoaW50IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjYtMzczCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzcxCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgcHVzaGludCAxOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY2LTM3MwogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM3MgogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjYtMzczCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBieiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX2ZhbHNlQDE2CgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX3RydWVAMTU6CiAgICBpbnRjXzEgLy8gMQoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9tZXJnZUAxNzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMTctMTIxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2lzX25vbl9jYXNoKAogICAgLy8gICAgIGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIC8vICksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IHR5cGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMjAKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlICE9IGFyYzQuVUludDgoZW51bXMuRVZUX0lFRCksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGRpZyA4CiAgICBwdXNoYnl0ZXMgMHgwMQogICAgYiE9CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCB0eXBlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNzcKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluIChVSW50NjQoZW51bXMuRVZUX1JSKSwgVUludDY0KGVudW1zLkVWVF9SUkYpKQogICAgZGlnIDQKICAgIHB1c2hpbnQgMTIKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDIxCiAgICBkaWcgNAogICAgcHVzaGludCAxMQogICAgPT0KICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfZmFsc2VAMjIKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAyMToKICAgIGludGNfMSAvLyAxCgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX21lcmdlQDIzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIyMQogICAgLy8gaWYgc2VsZi5fZXZlbnRfaXNfcmF0ZV9yZXNldChlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpKToKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Vsc2VfYm9keUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODAKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLm9ic2VydmVyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjUgLy8gMHg1MjNhNGQ0ZjQzMjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMjUKICAgIC8vIHNlbGYuX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5KGVudHJ5LCBwYXlsb2FkKQogICAgZGlnIDYKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeQogICAgcG9wbiAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjI2CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfZWxzZV9ib2R5QDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjI0CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIGIgYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYWZ0ZXJfaWZfZWxzZUA2CgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX2ZhbHNlQDIyOgogICAgaW50Y18wIC8vIDAKICAgIGIgYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9tZXJnZUAyMwoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9mYWxzZUAxNjoKICAgIGludGNfMCAvLyAwCiAgICBiIGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfbWVyZ2VAMTcKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5hcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50OgogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGxlbgogICAgcHVzaGludCA2NQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5PYnNlcnZlZENhc2hFdmVudFJlcXVlc3QKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NgogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjU3CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyNTgKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjU5CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM4CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE1MAogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIzNgogICAgLy8gcmV0dXJuIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQ0xNKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICBwdXNoaW50IDUKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5ODQKICAgIC8vIGFzc2VydCBzZWxmLl9zdXBwb3J0c19vYnNlcnZlZF9ldmVudHMoKSwgZXJyLk9CU0VSVkVEX0VWRU5UX1JFUVVJUkVECiAgICBhc3NlcnQgLy8gT2JzZXJ2ZWQgZXZlbnQgcmVxdWlyZWQgdG8gZXhlY3V0ZSB0aGlzIGFjdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTg1CiAgICAvLyBhc3NlcnQgcGF5bG9hZC5ldmVudF9pZCA9PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LCBlcnIuSU5WQUxJRF9FVkVOVF9JRAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgc3dhcAogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBpZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTg2CiAgICAvLyBhc3NlcnQgcGF5bG9hZC5ldmVudF90eXBlID09IGFyYzQuVUludDgoZW51bXMuRVZUX1BSKSwgZXJyLklOVkFMSURfRVZFTlRfVFlQRQogICAgZGlnIDEKICAgIGV4dHJhY3QgOCAxCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIHB1c2hieXRlcyAweDAzCiAgICBiPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IHR5cGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4NwogICAgLy8gYXNzZXJ0IHBheWxvYWQuZmxhZ3MgJiBVSW50NjQoZW51bXMuRkxBR19DQVNIX0VWRU5UKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBzd2FwCiAgICBwdXNoaW50IDU3CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzEgLy8gMQogICAgJgogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTg5CiAgICAvLyBpZiBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50ID4gVUludDY0KDApOgogICAgYnogYXBwZW5kX29ic2VydmVkX2Nhc2hfZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OTEKICAgIC8vIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgLSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OTAtOTkyCiAgICAvLyBwcmV2aW91c19lbnRyeSA9IHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeSgKICAgIC8vICAgICBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IC0gVUludDY0KDEpCiAgICAvLyApCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5NAogICAgLy8gcHJldmlvdXNfZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gcGF5bG9hZC5zY2hlZHVsZWRfdGltZQogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDQKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIDw9CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OTMtOTk1CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHByZXZpb3VzX2VudHJ5LnNjaGVkdWxlZF90aW1lIDw9IHBheWxvYWQuc2NoZWR1bGVkX3RpbWUKICAgIC8vICksIGVyci5JTlZBTElEX1NPUlRJTkcKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBtdXN0IGJlIHNvcnRlZCBpbiBzdHJpY3RseSBhc2NlbmRpbmcgb3JkZXIKCmFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5NwogICAgLy8gcGFnZV9pbmRleCA9IHNlbGYuX3NjaGVkdWxlX3BhZ2VfaW5kZXgoc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE5MwogICAgLy8gcmV0dXJuIGV2ZW50X2lkIC8vIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKQogICAgcHVzaGludCAxNgogICAgLwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTk4CiAgICAvLyBwYWdlID0gdHlwLkV4ZWN1dGlvblNjaGVkdWxlUGFnZSgpCiAgICBieXRlYyA0OSAvLyAweDAwMDAKICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTk5CiAgICAvLyBpZiBwYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZToKICAgIGl0b2IKICAgIGJ5dGVjIDI0IC8vIDB4NTMyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgNwogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBhcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMDAKICAgIC8vIHBhZ2UgPSBzZWxmLnNjaGVkdWxlX3BhZ2VbcGFnZV9pbmRleF0uY29weSgpCiAgICBkaWcgNQogICAgYm94X2dldAogICAgc3dhcAogICAgYnVyeSA2CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9wYWdlIGVudHJ5IGV4aXN0cwoKYXBwZW5kX29ic2VydmVkX2Nhc2hfZXZlbnRfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAwMQogICAgLy8gYXNzZXJ0IHBhZ2UubGVuZ3RoIDwgVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBkaWcgNAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBwdXNoaW50IDE2CiAgICA8CiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDA2CiAgICAvLyBzY2hlZHVsZWRfdGltZT1wYXlsb2FkLnNjaGVkdWxlZF90aW1lLAogICAgZGlnIDUKICAgIGR1cAogICAgZXh0cmFjdCA5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMDcKICAgIC8vIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICBkaWcgMQogICAgZXh0cmFjdCAxNyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDA4CiAgICAvLyByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPXBheWxvYWQucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIGRpZyAyCiAgICBleHRyYWN0IDI1IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMDkKICAgIC8vIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPXBheWxvYWQubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBkaWcgMwogICAgZXh0cmFjdCAzMyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDEwCiAgICAvLyBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIGRpZyA0CiAgICBleHRyYWN0IDQxIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMTEKICAgIC8vIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXBheWxvYWQubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICB1bmNvdmVyIDUKICAgIGV4dHJhY3QgNDkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAwMy0xMDEzCiAgICAvLyB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1wYXlsb2FkLmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9cGF5bG9hZC5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPXBheWxvYWQucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXBheWxvYWQubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICkKICAgIGRpZyAxMAogICAgaXRvYgogICAgZGlnIDEwCiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMwogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDAyLTEwMTQKICAgIC8vIHBhZ2UuYXBwZW5kKAogICAgLy8gICAgIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgICAgICBldmVudF9pZD1wYXlsb2FkLmV2ZW50X2lkLAogICAgLy8gICAgICAgICBldmVudF90eXBlPXBheWxvYWQuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICAgICAgYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPXBheWxvYWQubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1wYXlsb2FkLm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgICAgICBmbGFncz1wYXlsb2FkLmZsYWdzLAogICAgLy8gICAgICkKICAgIC8vICkKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMTUKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHBhZ2UuY29weSgpCiAgICBkaWcgNgogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMTYKICAgIC8vIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgKz0gVUludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI2MwogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjI4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9zZXRfZGVmYXVsdF9zdGF0dXNbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9zZXRfZGVmYXVsdF9zdGF0dXM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjY1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzQKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnRydXN0ZWUsIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyNiAvLyAweDUyM2E1NDUyNTMyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI3OAogICAgLy8gc2VsZi5kZWZhdWx0ZWQgPSBkZWZhdWx0ZWQKICAgIGJ5dGVjIDQ3IC8vICJkZWZhdWx0ZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI3OQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjY1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9nZXRfc3RhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9nZXRfc3RhdGU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDYKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGR1cAogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjk0CiAgICAvLyBjb250cmFjdF90eXBlPWFyYzQuVUludDgoc2VsZi5jb250cmFjdF90eXBlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgaXRvYgogICAgZHVwCiAgICBiaXRsZW4KICAgIGludGNfMiAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBleHRyYWN0IDcgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI5NgogICAgLy8gdG90YWxfdW5pdHM9c2VsZi50b3RhbF91bml0cywKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjk3CiAgICAvLyByZXNlcnZlZF91bml0c190b3RhbD1zZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyOTgKICAgIC8vIGluaXRpYWxfZXhjaGFuZ2VfYW1vdW50PXNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI5OQogICAgLy8gZXZlbnRfY3Vyc29yPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzAwCiAgICAvLyBzY2hlZHVsZV9lbnRyeV9jb3VudD1zZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMwMQogICAgLy8gb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzAyCiAgICAvLyBpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlPXNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzAzCiAgICAvLyBub21pbmFsX2ludGVyZXN0X3JhdGU9c2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMDQKICAgIC8vIGFjY3J1ZWRfaW50ZXJlc3Q9c2VsZi5hY2NydWVkX2ludGVyZXN0LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMDUKICAgIC8vIGN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXg9c2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzA2CiAgICAvLyBjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleD1zZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMDcKICAgIC8vIHJlc2VydmVkX2ludGVyZXN0PXNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX2ludGVyZXN0IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMwOAogICAgLy8gcmVzZXJ2ZWRfcHJpbmNpcGFsPXNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI5My0xMzA5CiAgICAvLyByZXR1cm4gdHlwLktlcm5lbFN0YXRlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGU9YXJjNC5VSW50OChzZWxmLmNvbnRyYWN0X3R5cGUpLAogICAgLy8gICAgIHN0YXR1cz1zZWxmLnN0YXR1cywKICAgIC8vICAgICB0b3RhbF91bml0cz1zZWxmLnRvdGFsX3VuaXRzLAogICAgLy8gICAgIHJlc2VydmVkX3VuaXRzX3RvdGFsPXNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwsCiAgICAvLyAgICAgaW5pdGlhbF9leGNoYW5nZV9hbW91bnQ9c2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCwKICAgIC8vICAgICBldmVudF9jdXJzb3I9c2VsZi5ldmVudF9jdXJzb3IsCiAgICAvLyAgICAgc2NoZWR1bGVfZW50cnlfY291bnQ9c2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwKICAgIC8vICAgICBvdXRzdGFuZGluZ19wcmluY2lwYWw9c2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZT1zZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICAvLyAgICAgbm9taW5hbF9pbnRlcmVzdF9yYXRlPXNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIGFjY3J1ZWRfaW50ZXJlc3Q9c2VsZi5hY2NydWVkX2ludGVyZXN0LAogICAgLy8gICAgIGN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXg9c2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4LAogICAgLy8gICAgIGN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4PXNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgsCiAgICAvLyAgICAgcmVzZXJ2ZWRfaW50ZXJlc3Q9c2VsZi5yZXNlcnZlZF9pbnRlcmVzdCwKICAgIC8vICAgICByZXNlcnZlZF9wcmluY2lwYWw9c2VsZi5yZXNlcnZlZF9wcmluY2lwYWwsCiAgICAvLyApCiAgICB1bmNvdmVyIDE0CiAgICBpdG9iCiAgICB1bmNvdmVyIDE0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMgogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDExCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA5CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgOAogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDcKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyODEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NgogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzIzCiAgICAvLyBpZiBzZWxmLmV2ZW50X2N1cnNvciA+PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICA+PQogICAgYnogY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMyNQogICAgLy8gZXZlbnRfaWQ9c2VsZi5ldmVudF9jdXJzb3IsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMjQtMTMzNAogICAgLy8gcmV0dXJuIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgIGV2ZW50X2lkPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgLy8gICAgIGV2ZW50X3R5cGU9YXJjNC5VSW50OCgwKSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1VSW50NjQoMCksCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1VSW50NjQoMCksCiAgICAvLyAgICAgZmxhZ3M9VUludDY0KDApLAogICAgLy8gKQogICAgaXRvYgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMyNgogICAgLy8gZXZlbnRfdHlwZT1hcmM0LlVJbnQ4KDApLAogICAgYnl0ZWMgNDAgLy8gMHgwMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMyNC0xMzM0CiAgICAvLyByZXR1cm4gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkoCiAgICAvLyAgICAgZXZlbnRfaWQ9c2VsZi5ldmVudF9jdXJzb3IsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1hcmM0LlVJbnQ4KDApLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPVVJbnQ2NCgwKSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249VUludDY0KDApLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPVVJbnQ2NCgwKSwKICAgIC8vICAgICBmbGFncz1VSW50NjQoMCksCiAgICAvLyApCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMjcKICAgIC8vIHNjaGVkdWxlZF90aW1lPVVJbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzI0LTEzMzQKICAgIC8vIHJldHVybiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1zZWxmLmV2ZW50X2N1cnNvciwKICAgIC8vICAgICBldmVudF90eXBlPWFyYzQuVUludDgoMCksCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9VUludDY0KDApLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9VUludDY0KDApLAogICAgLy8gICAgIGZsYWdzPVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAoKY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50QDQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzExCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzM1CiAgICAvLyByZXR1cm4gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KHNlbGYuZXZlbnRfY3Vyc29yKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiBjb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnRfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnRANAoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLmNvbnRyYWN0X3VwZGF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X3VwZGF0ZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTktMTYyCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gZ3JhbnRzIHRoZSB1cGRhdGUgcGVybWlzc2lvbnMgdG8gdGhlIEFycmFuZ2VyLgogICAgLy8gIyDimqDvuI8gV0FSTklORzogQXBwbGljYXRpb24gdXBkYXRlcyBtdXN0IGJlIGV4ZWN1dGVkIFZFUlkgY2FyZWZ1bGx5LCBhcyB0aGV5CiAgICAvLyAjIG1pZ2h0IGludHJvZHVjZSBicmVha2luZyBjaGFuZ2VzLgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19yb3RhdGVfYXJyYW5nZXJbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3JvdGF0ZV9hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTc4CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzkKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSBuZXdfYXJyYW5nZXIKICAgIGJ5dGVjIDE4IC8vIDB4NTIzYTQxNTI1MjIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4MAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTY0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3NldF9vcF9kYWVtb25bcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3NldF9vcF9kYWVtb246CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTgyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE5NgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTk3CiAgICAvLyBzZWxmLm9wX2RhZW1vbi52YWx1ZSA9IGFkZHJlc3MKICAgIGJ5dGVjIDI3IC8vIDB4NTIzYTRmNTA0NDIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE5OAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTgyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2Fzc2lnbl9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19hc3NpZ25fcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDE2CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLlJvbGVWYWxpZGl0eQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyMgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjIzCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNAogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgcHVzaGludCAyMAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTAzCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gcm9sZV9hZGRyZXNzCiAgICBieXRlYyAxOCAvLyAweDUyM2E0MTUyNTIyMwogICAgZGlnIDMKICAgIGFwcF9nbG9iYWxfcHV0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwNgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDQwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDcKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIzIC8vIDB4NTIzYTRkNGU0NzIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDgKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI1CiAgICAvLyBzZWxmLl9zZXRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIHZhbGlkaXR5KQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTAKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTEKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjIgLy8gMHg1MjNhNTA1OTQ0MjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMgogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNQogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE0CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpOgogICAgZHVwCiAgICBwdXNoaW50IDYwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTUKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyNiAvLyAweDUyM2E1NDUyNTMyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE2CiAgICAvLyBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjUKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExOAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMSAvLyAweDUyM2E0MTU1NTQyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIwCiAgICAvLyBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNQogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgODAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIzCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI1IC8vIDB4NTIzYTRkNGY0MzIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjQKICAgIC8vIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfcmV2b2tlX3JvbGVbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3Jldm9rZV9yb2xlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0NwogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjQ4CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0OQogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjcKICAgIC8vIGFzc2VydCByb2xlX2lkICE9IFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwgZXJyLklOVkFMSURfUk9MRQogICAgZHVwCiAgICBwdXNoaW50IDIwCiAgICAhPQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI4CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICBwdXNoaW50IDQwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjkKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjMgLy8gMHg1MjNhNGQ0ZTQ3MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMAogICAgLy8gZGVsIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTEKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzMKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMiAvLyAweDUyM2E1MDU5NDQyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM0CiAgICAvLyBkZWwgc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTAKICAgIC8vIHNlbGYuX2RlbGV0ZV9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcykKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM2CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpOgogICAgZHVwCiAgICBwdXNoaW50IDYwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzcKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI2IC8vIDB4NTIzYTU0NTI1MzIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzgKICAgIC8vIGRlbCBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjUwCiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDEKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hdXRob3JpdHksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjEgLy8gMHg1MjNhNDE1NTU0MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MgogICAgLy8gZGVsIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1MAogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDQKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDgwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI1IC8vIDB4NTIzYTRkNGY0MzIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDYKICAgIC8vIGRlbCBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19jb250cmFjdF9zdXNwZW5zaW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19jb250cmFjdF9zdXNwZW5zaW9uOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kICAjIFRPRE86IFVwZGF0ZSBzcGVjcyBhbmQgYWRkIHRlc3QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzcKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDIxIC8vIDB4NTIzYTQxNTU1NDIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjY5CiAgICAvLyBzZWxmLmFzc2V0X3N1c3BlbmRlZCA9IHN1c3BlbmRlZAogICAgYnl0ZWMgMzMgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjcwCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCAgIyBUT0RPOiBVcGRhdGUgc3BlY3MgYW5kIGFkZCB0ZXN0CiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYXJyYW5nZXJbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODMKICAgIC8vIHJldHVybiBzZWxmLmFycmFuZ2VyLnZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTggLy8gMHg1MjNhNDE1MjUyMjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcnJhbmdlciBleGlzdHMKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNzIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXNbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9hZGRyZXNzX3JvbGVzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDMKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDIzIC8vIDB4NTIzYTRkNGU0NzIzCiAgICBkaWcgMQogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDQKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYucHJpbWFyeV9kZWFsZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjIgLy8gMHg1MjNhNTA1OTQ0MjMKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwNQogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi50cnVzdGVlLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDI2IC8vIDB4NTIzYTU0NTI1MzIzCiAgICBkaWcgMwogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDYKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYXV0aG9yaXR5LCBhZGRyZXNzKSwKICAgIGJ5dGVjIDIxIC8vIDB4NTIzYTQxNTU1NDIzCiAgICBkaWcgNAogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDcKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYub2JzZXJ2ZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjUgLy8gMHg1MjNhNGQ0ZjQzMjMKICAgIHVuY292ZXIgNQogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWMgNDAgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgNgogICAgc2V0Yml0CiAgICBpbnRjXzEgLy8gMQogICAgdW5jb3ZlciA1CiAgICBzZXRiaXQKICAgIHB1c2hpbnQgMgogICAgdW5jb3ZlciA0CiAgICBzZXRiaXQKICAgIHB1c2hpbnQgMwogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIHB1c2hpbnQgNAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5W3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfcm9sZV92YWxpZGl0eToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjgKICAgIC8vIHJvbGUgPSByb2xlX2lkLmFzX3VpbnQ2NCgpCiAgICBidG9pCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI5CiAgICAvLyBzZWxmLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlKQogICAgZHVwCiAgICBjYWxsc3ViIF9hc3NlcnRfdmFsaWRfcm9sZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMzMQogICAgLy8gY2FzZSBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUik6CiAgICBwdXNoaW50cyAyMCA0MCA1MCA2MCA3MCA4MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMzMC0zNjEKICAgIC8vIG1hdGNoIHJvbGU6CiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUik6CiAgICAvLyAgICAgICAgIHJldHVybiB0eXAuUm9sZVZhbGlkaXR5KAogICAgLy8gICAgICAgICAgICAgcm9sZV92YWxpZGl0eV9zdGFydD1VSW50NjQoMCksIHJvbGVfdmFsaWRpdHlfZW5kPVVJbnQ2NCgwKQogICAgLy8gICAgICAgICApCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLmFjY291bnRfbWFuYWdlciwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLnByaW1hcnlfZGVhbGVyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLmF1dGhvcml0eSwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLm9ic2VydmVyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIF86CiAgICAvLyAgICAgICAgIG9wLmVycihlcnIuSU5WQUxJRF9ST0xFKQogICAgdW5jb3ZlciA2CiAgICBtYXRjaCByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzBAMiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzFAMyByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzJANCByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzNANSByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzRANiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzVANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM2MQogICAgLy8gb3AuZXJyKGVyci5JTlZBTElEX1JPTEUpCiAgICBlcnIgLy8gSW52YWxpZCByb2xlIGlkZW50aWZpZXIKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM1NwogICAgLy8gc2VsZi5vYnNlcnZlciwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAyNSAvLyAweDUyM2E0ZDRmNDMyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM1Ni0zNTgKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLm9ic2VydmVyLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTkKICAgIC8vIHJldHVybiBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV80QDY6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzUyCiAgICAvLyBzZWxmLmF1dGhvcml0eSwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAyMSAvLyAweDUyM2E0MTU1NTQyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM1MS0zNTMKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLmF1dGhvcml0eSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzU0CiAgICAvLyByZXR1cm4gc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8zQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzQ3CiAgICAvLyBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMjYgLy8gMHg1MjNhNTQ1MjUzMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNDYtMzQ4CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNDkKICAgIC8vIHJldHVybiBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8yQDQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzQyCiAgICAvLyBzZWxmLnByaW1hcnlfZGVhbGVyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDIyIC8vIDB4NTIzYTUwNTk0NDIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzQxLTM0MwogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM0NAogICAgLy8gcmV0dXJuIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8xQDM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzM3CiAgICAvLyBzZWxmLmFjY291bnRfbWFuYWdlciwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAyMyAvLyAweDUyM2E0ZDRlNDcyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMzNi0zMzgKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLmFjY291bnRfbWFuYWdlciwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzM5CiAgICAvLyByZXR1cm4gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8wQDI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzMyLTMzNAogICAgLy8gcmV0dXJuIHR5cC5Sb2xlVmFsaWRpdHkoCiAgICAvLyAgICAgcm9sZV92YWxpZGl0eV9zdGFydD1VSW50NjQoMCksIHJvbGVfdmFsaWRpdHlfZW5kPVVJbnQ2NCgwKQogICAgLy8gKQogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQoaG9sZGluZ19hZGRyZXNzOiBieXRlcykgLT4gdm9pZDoKX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQ6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjYKICAgIC8vIGRlZiBfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChzZWxmLCBob2xkaW5nX2FkZHJlc3M6IEFjY291bnQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyOAogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQsIGVyci5TVVNQRU5ERUQKICAgIGJ5dGVjIDggLy8gMHg0MTIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHB1c2hpbnQgMzg0CiAgICBnZXRiaXQKICAgICEKICAgIGFzc2VydCAvLyBTdXNwZW5kZWQgb3BlcmF0aW9ucwogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuX3NldHRsZV9wb3NpdGlvbihob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB1aW50NjQsIHVpbnQ2NDoKX3NldHRsZV9wb3NpdGlvbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo0NAogICAgLy8gZGVmIF9zZXR0bGVfcG9zaXRpb24oc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50KSAtPiB0dXBsZVtVSW50NjQsIFVJbnQ2NF06CiAgICBwcm90byAxIDIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo2MQogICAgLy8gcG9zaXRpb24gPSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jb3B5KCkKICAgIGR1cAogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NjMtNjUKICAgIC8vICMgQ29tcHV0ZSB0aGUgaW5jcmVtZW50YWwgcGVyLXVuaXQgZml4ZWQtcG9pbnQgaW50ZXJlc3QgYW5kIHByaW5jaXBhbCBhY2NydWVkCiAgICAvLyAjIHNpbmNlIHRoaXMgYWNjb3VudCdzIGxhc3QgY2hlY2twb2ludC4KICAgIC8vIGludGVyZXN0X2RlbHRhID0gc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IC0gcG9zaXRpb24uaW50ZXJlc3RfY2hlY2twb2ludAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggZXhpc3RzCiAgICBkaWcgMQogICAgcHVzaGludCA1NwogICAgZXh0cmFjdF91aW50NjQKICAgIC0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo2NwogICAgLy8gc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCAtIHBvc2l0aW9uLnByaW5jaXBhbF9jaGVja3BvaW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTcgLy8gImN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IGV4aXN0cwogICAgZGlnIDIKICAgIHB1c2hpbnQgNjUKICAgIGV4dHJhY3RfdWludDY0CiAgICAtCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzMKICAgIC8vIGludGVyZXN0X2RlbHRhLCBwb3NpdGlvbi51bml0cywgc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgZGlnIDIKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3MC03NAogICAgLy8gIyBDb252ZXJ0IHRoZSBwZXItdW5pdCBmaXhlZC1wb2ludCBkZWx0YXMgaW50byBhYnNvbHV0ZSBjbGFpbWFibGUgYW1vdW50cwogICAgLy8gIyB1c2luZyB0aGUgYWNjb3VudCdzIGFjdGl2ZSB1bml0cy4KICAgIC8vIGNsYWltYWJsZV9pbnRlcmVzdCA9IHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIGludGVyZXN0X2RlbHRhLCBwb3NpdGlvbi51bml0cywgc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgLy8gKQogICAgdW5jb3ZlciAzCiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojc2CiAgICAvLyBwcmluY2lwYWxfZGVsdGEsIHBvc2l0aW9uLnVuaXRzLCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzUtNzcKICAgIC8vIGNsYWltYWJsZV9wcmluY2lwYWwgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBwcmluY2lwYWxfZGVsdGEsIHBvc2l0aW9uLnVuaXRzLCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICAvLyApCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojc5LTgxCiAgICAvLyAjIEFjY3J1ZSB0aGUgY2xhaW1hYmxlIGFtb3VudHMgdG8gdGhlIGFjY291bnQgcG9zaXRpb24gYW5kIG1ha2UgdGhlbSBhdmFpbGFibGUKICAgIC8vICMgZm9yIHdpdGhkcmF3YWwuCiAgICAvLyBwb3NpdGlvbi5jbGFpbWFibGVfaW50ZXJlc3QgKz0gY2xhaW1hYmxlX2ludGVyZXN0CiAgICBkaWcgMgogICAgcHVzaGludCA3MwogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICArCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIHN3YXAKICAgIHJlcGxhY2UyIDczCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6ODIKICAgIC8vIHBvc2l0aW9uLmNsYWltYWJsZV9wcmluY2lwYWwgKz0gY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgZHVwCiAgICBwdXNoaW50IDgxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDIKICAgICsKICAgIGl0b2IKICAgIHJlcGxhY2UyIDgxCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6ODQtODYKICAgIC8vICMgQWR2YW5jZSB0aGUgYWNjb3VudCdzIHBlci11bml0IGZpeGVkLXBvaW50IGNoZWNrcG9pbnRzIHRvIHRoZSBjdXJyZW50IGdsb2JhbAogICAgLy8gIyBwZXItdW5pdCBmaXhlZC1wb2ludCBnbG9iYWwgaW5kaWNlcy4KICAgIC8vIHBvc2l0aW9uLmludGVyZXN0X2NoZWNrcG9pbnQgPSBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IGV4aXN0cwogICAgaXRvYgogICAgcmVwbGFjZTIgNTcKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo4NwogICAgLy8gcG9zaXRpb24ucHJpbmNpcGFsX2NoZWNrcG9pbnQgPSBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTcgLy8gImN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IGV4aXN0cwogICAgaXRvYgogICAgcmVwbGFjZTIgNjUKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo4OS05MAogICAgLy8gIyBBZHZhbmNlIHRoZSBhY2NvdW50J3MgZXZlbnQgY3Vyc29yIHRvIHRoZSBjdXJyZW50IGdsb2JhbCBldmVudCBjdXJzb3IuCiAgICAvLyBwb3NpdGlvbi5zZXR0bGVkX2N1cnNvciA9IHNlbGYuZXZlbnRfY3Vyc29yCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGl0b2IKICAgIHJlcGxhY2UyIDQ5CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6OTItOTQKICAgIC8vICMgVXBkYXRlIHRoZSBhY2NvdW50IHBvc2l0aW9uIGFuZCByZXR1cm4gdGhlIG5ld2x5IGFjY3J1ZWQgY2xhaW1hYmxlIGFtb3VudHMKICAgIC8vICMgYWRkZWQgdG8gdGhlIHRvdGFsIHBvc2l0aW9uJ3MgY2xhaW1hYmxlIGFtb3VudHMuCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHBvc2l0aW9uLmNvcHkoKQogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6OTUKICAgIC8vIHJldHVybiBjbGFpbWFibGVfaW50ZXJlc3QsIGNsYWltYWJsZV9wcmluY2lwYWwKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IHZvaWQ6Cl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojk3CiAgICAvLyBkZWYgX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQoc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg0MTIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzgKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwMAogICAgLy8gaWYgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCk6CiAgICBieiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZF9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDEKICAgIC8vIHJldHVybgogICAgcmV0c3ViCgpfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZF9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTAzCiAgICAvLyBwb3NpdGlvbiA9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNvcHkoKQogICAgZnJhbWVfZGlnIDIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwNAogICAgLy8gaWYgcG9zaXRpb24ucmVzZXJ2ZWRfdW5pdHMgPT0gVUludDY0KDApOgogICAgcHVzaGludCA0MAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICBibnogX2Vuc3VyZV91bml0c19hY3RpdmF0ZWRfYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA1CiAgICAvLyByZXR1cm4KICAgIHJldHN1YgoKX2Vuc3VyZV91bml0c19hY3RpdmF0ZWRfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwOAogICAgLy8gcG9zaXRpb24udW5pdHMgKz0gYWN0aXZhdGVkX3VuaXRzCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAzCiAgICArCiAgICBpdG9iCiAgICByZXBsYWNlMiAzMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwOQogICAgLy8gcG9zaXRpb24ucmVzZXJ2ZWRfdW5pdHMgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBpdG9iCiAgICByZXBsYWNlMiA0MAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExMAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSBwb3NpdGlvbi5jb3B5KCkKICAgIGZyYW1lX2RpZyAyCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTExCiAgICAvLyBhc3NlcnQgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCA+PSBhY3RpdmF0ZWRfdW5pdHMsIGVyci5PVkVSX0RJU1RSSUJVVElPTgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCBleGlzdHMKICAgIGR1cAogICAgZGlnIDIKICAgID49CiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IHJlbWFpbmluZyBELUFTQSB1bml0cwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExMgogICAgLy8gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCAtPSBhY3RpdmF0ZWRfdW5pdHMKICAgIHN3YXAKICAgIC0KICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fc2NhbGVkX211bF9kaXYobXVsdGlwbGljYW5kOiB1aW50NjQsIG11bHRpcGxpZXI6IHVpbnQ2NCwgZGl2aXNvcjogdWludDY0KSAtPiB1aW50NjQ6Cl9zY2FsZWRfbXVsX2RpdjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE1Ni0xNTgKICAgIC8vIGRlZiBfc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgc2VsZiwgbXVsdGlwbGljYW5kOiBVSW50NjQsIG11bHRpcGxpZXI6IFVJbnQ2NCwgZGl2aXNvcjogVUludDY0CiAgICAvLyApIC0+IFVJbnQ2NDoKICAgIHByb3RvIDMgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTYwCiAgICAvLyBpZiBtdWx0aXBsaWNhbmQgPT0gVUludDY0KDApIG9yIG11bHRpcGxpZXIgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0zCiAgICBieiBfc2NhbGVkX211bF9kaXZfaWZfYm9keUAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGJueiBfc2NhbGVkX211bF9kaXZfYWZ0ZXJfaWZfZWxzZUAzCgpfc2NhbGVkX211bF9kaXZfaWZfYm9keUAyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTYxCiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfc2NhbGVkX211bF9kaXZfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTYyCiAgICAvLyBoaWdoLCBsb3cgPSBvcC5tdWx3KG11bHRpcGxpY2FuZCwgbXVsdGlwbGllcikKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0yCiAgICBtdWx3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjMKICAgIC8vIHJldHVybiBvcC5kaXZ3KGhpZ2gsIGxvdywgZGl2aXNvcikKICAgIGZyYW1lX2RpZyAtMQogICAgZGl2dwogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Ftb3VudF90b19pbmRleF9kZWx0YShhbW91bnQ6IHVpbnQ2NCkgLT4gdWludDY0OgpfYW1vdW50X3RvX2luZGV4X2RlbHRhOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTY1CiAgICAvLyBkZWYgX2Ftb3VudF90b19pbmRleF9kZWx0YShzZWxmLCBhbW91bnQ6IFVJbnQ2NCkgLT4gVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjcKICAgIC8vIGlmIGFtb3VudCA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGJueiBfYW1vdW50X3RvX2luZGV4X2RlbHRhX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTY4CiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfYW1vdW50X3RvX2luZGV4X2RlbHRhX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2OQogICAgLy8gYXNzZXJ0IHNlbGYudG90YWxfdW5pdHMgPiBVSW50NjQoMCksIGVyci5OT19VTklUUwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIGR1cAogICAgYXNzZXJ0IC8vIE5vIEQtQVNBIHVuaXRzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNzAKICAgIC8vIHJldHVybiBzZWxmLl9zY2FsZWRfbXVsX2RpdihhbW91bnQsIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsIHNlbGYudG90YWxfdW5pdHMpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9pbmRleF9kZWx0YV90b19hbW91bnQoaW5kZXhfZGVsdGE6IHVpbnQ2NCkgLT4gdWludDY0OgpfaW5kZXhfZGVsdGFfdG9fYW1vdW50OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTcyCiAgICAvLyBkZWYgX2luZGV4X2RlbHRhX3RvX2Ftb3VudChzZWxmLCBpbmRleF9kZWx0YTogVUludDY0KSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE3OQogICAgLy8gaWYgaW5kZXhfZGVsdGEgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0xCiAgICBibnogX2luZGV4X2RlbHRhX3RvX2Ftb3VudF9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE4MAogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKX2luZGV4X2RlbHRhX3RvX2Ftb3VudF9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxODIKICAgIC8vIHNlbGYudG90YWxfdW5pdHMsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTg0CiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTgxLTE4NQogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIHNlbGYudG90YWxfdW5pdHMsCiAgICAvLyAgICAgaW5kZXhfZGVsdGEsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9nZXRfc2NoZWR1bGVfZW50cnkoZXZlbnRfaWQ6IHVpbnQ2NCkgLT4gYnl0ZXM6Cl9nZXRfc2NoZWR1bGVfZW50cnk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMDUKICAgIC8vIGRlZiBfZ2V0X3NjaGVkdWxlX2VudHJ5KHNlbGYsIGV2ZW50X2lkOiBVSW50NjQpIC0+IHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5OgogICAgcHJvdG8gMSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMDcKICAgIC8vIGFzc2VydCBldmVudF9pZCA8IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQsIGVyci5JTlZBTElEX0VWRU5UX0lECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgID4KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxOTMKICAgIC8vIHJldHVybiBldmVudF9pZCAvLyBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAxNgogICAgLwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjA5CiAgICAvLyBhc3NlcnQgcGFnZV9pbmRleCBpbiBzZWxmLnNjaGVkdWxlX3BhZ2UsIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGl0b2IKICAgIGJ5dGVjIDI0IC8vIDB4NTMyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTk3CiAgICAvLyByZXR1cm4gZXZlbnRfaWQgJSBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAxNgogICAgJQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjEyCiAgICAvLyBhc3NlcnQgb2Zmc2V0IDwgcGFnZS5sZW5ndGgsIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGludCAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZGlnIDEKICAgID4KICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIxMwogICAgLy8gcmV0dXJuIHBhZ2Vbb2Zmc2V0XS5jb3B5KCkKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgMgogICAgKwogICAgcHVzaGludCA2NQogICAgYm94X2V4dHJhY3QKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZShjb250cmFjdF90eXBlOiB1aW50NjQsIGV2ZW50X3R5cGU6IHVpbnQ2NCkgLT4gdm9pZDoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE2LTMxOAogICAgLy8gZGVmIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBzZWxmLCBjb250cmFjdF90eXBlOiBVSW50NjQsIGV2ZW50X3R5cGU6IFVJbnQ2NAogICAgLy8gKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTctMjU4CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjUwCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lFRCksCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU3LTI1OAogICAgLy8gIyBDaGVjayBjb21tb24gZXZlbnRzIGZpcnN0CiAgICAvLyBpZiBldmVudF90eXBlIGluIGNvbW1vbl9ldmVudHM6CiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjUxCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQKSwKICAgIGludGNfMiAvLyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTctMjU4CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTIKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfTUQpLAogICAgcHVzaGludCAxOQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU3LTI1OAogICAgLy8gIyBDaGVjayBjb21tb24gZXZlbnRzIGZpcnN0CiAgICAvLyBpZiBldmVudF90eXBlIGluIGNvbW1vbl9ldmVudHM6CiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjUzCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIHB1c2hpbnQgMTIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1Ny0yNTgKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1NAogICAgLy8gVUludDY0KGVudW1zLkVWVF9SUkYpLAogICAgcHVzaGludCAxMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU3LTI1OAogICAgLy8gIyBDaGVjayBjb21tb24gZXZlbnRzIGZpcnN0CiAgICAvLyBpZiBldmVudF90eXBlIGluIGNvbW1vbl9ldmVudHM6CiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VANwoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1OQogICAgLy8gcmV0dXJuIFRydWUKICAgIGludGNfMSAvLyAxCgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMyMC0zMjIKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgcmV0c3ViCgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjYxLTI2MgogICAgLy8gIyBDb250cmFjdC1zcGVjaWZpYyBhZGRpdGlvbmFsIGV2ZW50cwogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfUEFNKToKICAgIGZyYW1lX2RpZyAtMgogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2My0yNjQKICAgIC8vICMgUEFNIG9ubHkgc3VwcG9ydHMgY29tbW9uIGV2ZW50cwogICAgLy8gcmV0dXJuIEZhbHNlCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzIwLTMyMgogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjY2CiAgICAvLyBpZiBjb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9MQU0pIG9yIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDMKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNjYtMjY4CiAgICAvLyBpZiBjb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9MQU0pIG9yIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KAogICAgLy8gICAgIGVudW1zLkNUX05BTQogICAgLy8gKToKICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUAxMQogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDIKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAxNgoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlAMTE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNjktMjczCiAgICAvLyAjIExBTS9OQU0gYWRkOiBQUiwgSVBDQgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3MQogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUiksCiAgICBwdXNoaW50IDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2OS0yNzMKICAgIC8vICMgTEFNL05BTSBhZGQ6IFBSLCBJUENCCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAxMwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzIKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICBwdXNoaW50IDE4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNjktMjczCiAgICAvLyAjIExBTS9OQU0gYWRkOiBQUiwgSVBDQgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyApCiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMTQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMTM6CiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzIwLTMyMgogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF9mYWxzZUAxNDoKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMjAtMzIyCiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDE2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjc1CiAgICAvLyBpZiBjb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pOgogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDIzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzYtMjgxCiAgICAvLyAjIEFOTiBhZGRzOiBQUiwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3OAogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUiksCiAgICBwdXNoaW50IDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3Ni0yODEKICAgIC8vICMgQU5OIGFkZHM6IFBSLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyMAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzkKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICBwdXNoaW50IDE4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzYtMjgxCiAgICAvLyAjIEFOTiBhZGRzOiBQUiwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjAKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjgwCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICBwdXNoaW50IDUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3Ni0yODEKICAgIC8vICMgQU5OIGFkZHM6IFBSLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF9mYWxzZUAyMQoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyMDoKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMjAtMzIyCiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDIxOgogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMyMC0zMjIKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMjM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODMKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0xBWCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDMxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODQtMjkwCiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODYKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODQtMjkwCiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDI4CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4NwogICAgLy8gVUludDY0KGVudW1zLkVWVF9QSSksCiAgICBwdXNoaW50IDQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4NC0yOTAKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjgKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjg4CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgcHVzaGludCAxOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjg0LTI5MAogICAgLy8gIyBMQVggYWRkczogUFIsIFBJLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyOAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODkKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIHB1c2hpbnQgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjg0LTI5MAogICAgLy8gIyBMQVggYWRkczogUFIsIFBJLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF9mYWxzZUAyOQoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyODoKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMjAtMzIyCiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDI5OgogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMyMC0zMjIKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMzE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyOTIKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0NMTSk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDMzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyOTMtMjk0CiAgICAvLyAjIENMTSBhZGRzOiBQUgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QUikKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAzCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzIwLTMyMgogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAzMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI5NgogICAgLy8gcmV0dXJuIEZhbHNlCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzIwLTMyMgogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2lzX2R5bmFtaWNfYW5udWl0eSgpIC0+IHVpbnQ2NDoKX2lzX2R5bmFtaWNfYW5udWl0eToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMzOAogICAgLy8gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM4LTMzOQogICAgLy8gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICAvLyBhbmQgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBieiBfaXNfZHluYW1pY19hbm51aXR5X2Jvb2xfZmFsc2VAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM5CiAgICAvLyBhbmQgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzQgLy8gImR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMzOC0zMzkKICAgIC8vIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKQogICAgLy8gYW5kIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgYnogX2lzX2R5bmFtaWNfYW5udWl0eV9ib29sX2ZhbHNlQDMKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzctMzQwCiAgICAvLyByZXR1cm4gKAogICAgLy8gICAgIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKQogICAgLy8gICAgIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIC8vICkKICAgIHJldHN1YgoKX2lzX2R5bmFtaWNfYW5udWl0eV9ib29sX2ZhbHNlQDM6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM3LTM0MAogICAgLy8gcmV0dXJuICgKICAgIC8vICAgICBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIC8vICAgICBhbmQgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICAvLyApCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfaW50ZXJlc3Rfc2VnbWVudChlbnRyeTogYnl0ZXMpIC0+IHVpbnQ2NCwgYnl0ZXM6Cl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzgzCiAgICAvLyBkZWYgX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoc2VsZiwgZW50cnk6IHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5MgogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMTcKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5Mi0zOTQKICAgIC8vIGVudHJ5LmFjY3J1YWxfZmFjdG9yID09IFVJbnQ2NCgwKQogICAgLy8gb3Igc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPT0gVUludDY0KDApCiAgICBieiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudF9pZl9ib2R5QDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5MwogICAgLy8gb3Igc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPT0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5Mi0zOTQKICAgIC8vIGVudHJ5LmFjY3J1YWxfZmFjdG9yID09IFVJbnQ2NCgwKQogICAgLy8gb3Igc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPT0gVUludDY0KDApCiAgICBieiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudF9pZl9ib2R5QDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NAogICAgLy8gb3Igc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID09IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5Mi0zOTQKICAgIC8vIGVudHJ5LmFjY3J1YWxfZmFjdG9yID09IFVJbnQ2NCgwKQogICAgLy8gb3Igc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPT0gVUludDY0KDApCiAgICBibnogX2VudHJ5X2ludGVyZXN0X3NlZ21lbnRfYWZ0ZXJfaWZfZWxzZUA0CgpfZW50cnlfaW50ZXJlc3Rfc2VnbWVudF9pZl9ib2R5QDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozOTYKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9kaWcgLTEKICAgIHVuY292ZXIgMgogICAgcmV0c3ViCgpfZW50cnlfaW50ZXJlc3Rfc2VnbWVudF9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozOTgKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozOTkKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MDAKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozOTctNDAxCiAgICAvLyBhY2NydWVkID0gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlLAogICAgLy8gICAgIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICAvLyApCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDA1CiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDAyLTQwNgogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIGFjY3J1ZWQsCiAgICAvLyAgICAgZW50cnkuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgZnJhbWVfZGlnIC0xCiAgICB1bmNvdmVyIDIKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcihkaXNjb3VudF9mYWN0b3I6IHVpbnQ2NCwgcmVkZW1wdGlvbl9mYWN0b3I6IHVpbnQ2NCkgLT4gdWludDY0OgpfZGlzY291bnRfYW5udWl0eV9mYWN0b3I6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NjUtNDY5CiAgICAvLyBkZWYgX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yKAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgZGlzY291bnRfZmFjdG9yOiBVSW50NjQsCiAgICAvLyAgICAgcmVkZW1wdGlvbl9mYWN0b3I6IFVJbnQ2NCwKICAgIC8vICkgLT4gVUludDY0OgogICAgcHJvdG8gMiAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzEKICAgIC8vIGlmIHJlZGVtcHRpb25fZmFjdG9yID09IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMQogICAgYm56IF9kaXNjb3VudF9hbm51aXR5X2ZhY3Rvcl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3MgogICAgLy8gcmV0dXJuIGRpc2NvdW50X2ZhY3RvcgogICAgZnJhbWVfZGlnIC0yCiAgICByZXRzdWIKCl9kaXNjb3VudF9hbm51aXR5X2ZhY3Rvcl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzMKICAgIC8vIHBlcmlvZF9yYXRlID0gc2VsZi5maXhlZF9wb2ludF9zY2FsZSArIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDc0CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDczLTQ3NwogICAgLy8gcGVyaW9kX3JhdGUgPSBzZWxmLmZpeGVkX3BvaW50X3NjYWxlICsgc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgcmVkZW1wdGlvbl9mYWN0b3IsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgZGlnIDIKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICArCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzgKICAgIC8vIGFzc2VydCBwZXJpb2RfcmF0ZSA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBkdXAKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ4MQogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3OS00ODMKICAgIC8vIHJldHVybiBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBkaXNjb3VudF9mYWN0b3IsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICAgICBwZXJpb2RfcmF0ZSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5KGVudHJ5OiBieXRlcywgcGF5bG9hZDogYnl0ZXMpIC0+IGJ5dGVzLCBieXRlczoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjE2LTYxOAogICAgLy8gZGVmIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeSgKICAgIC8vICAgICBzZWxmLCBlbnRyeTogdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnksIHBheWxvYWQ6IHR5cC5PYnNlcnZlZEV2ZW50UmVxdWVzdAogICAgLy8gKSAtPiBOb25lOgogICAgcHJvdG8gMiAyCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYyNgogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X2lkID09IHNlbGYuZXZlbnRfY3Vyc29yLCBlcnIuSU5WQUxJRF9FVkVOVF9DVVJTT1IKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBjdXJzb3IKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYyNwogICAgLy8gYXNzZXJ0IGVudHJ5LnNjaGVkdWxlZF90aW1lIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLCBlcnIuTk9fRFVFX0NBU0hGTE9XCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIDw9CiAgICBhc3NlcnQgLy8gTm8gZHVlIGNhc2hmbG93IHRvIHBheQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjI5CiAgICAvLyBldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzAKICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9JRUQpOgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBkdXAKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzOAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzEtNjMzCiAgICAvLyAjIElFRCBmaW5hbGl6ZXMgaXNzdWFuY2U6IHJlc2VydmVkIHVuaXRzIGJlY29tZSBhY3RpdmF0YWJsZSBhbmQgdGhlCiAgICAvLyAjIHNjaGVkdWxlJ3MgaW5pdGlhbCBjb250cmFjdHVhbCBzdGF0ZSBiZWNvbWVzIGxpdmUuCiAgICAvLyBhc3NlcnQgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM1CiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID09IHNlbGYudG90YWxfdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYzNC02MzYKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCA9PSBzZWxmLnRvdGFsX3VuaXRzCiAgICAvLyApLCBlcnIuUFJJTUFSWV9ESVNUUklCVVRJT05fSU5DT01QTEVURQogICAgYXNzZXJ0IC8vIFByaW1hcnkgZGlzdHJpYnV0aW9uIGlzIG5vdCBjb21wbGV0ZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM3CiAgICAvLyBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9IGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYzOAogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM5CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IGVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjQwCiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0MQogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gZW50cnkubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDQxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjQyCiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NDMKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGVudW1zLlNUQVRVU19BQ1RJVkUpCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBwdXNoaW50IDEwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ1NAogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkgPT0gVUludDY0KGVudW1zLkVWVF9JRUQpLCBlcnIuTk9UX0VWVF9JRUQKICAgIGZyYW1lX2RpZyAxMQogICAgYXNzZXJ0IC8vIE5vdCBJRUQgZXZlbnQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ1NQogICAgLy8gcmV0dXJuIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMCAvLyAiaW5pdGlhbF9leGNoYW5nZV9hbW91bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NDQtNjQ4CiAgICAvLyBzZWxmLl9lbWl0X2V4ZWN1dGlvbl9ldmVudCgKICAgIC8vICAgICBlbnRyeT1lbnRyeSwKICAgIC8vICAgICBwYXlvZmY9c2VsZi5fZW50cnlfaWVkX2Ftb3VudChlbnRyeSksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NDcKICAgIC8vIHNldHRsZWRfYW1vdW50PVVJbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NDQtNjQ4CiAgICAvLyBzZWxmLl9lbWl0X2V4ZWN1dGlvbl9ldmVudCgKICAgIC8vICAgICBlbnRyeT1lbnRyeSwKICAgIC8vICAgICBwYXlvZmY9c2VsZi5fZW50cnlfaWVkX2Ftb3VudChlbnRyeSksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgY2FsbHN1YiBfZW1pdF9leGVjdXRpb25fZXZlbnQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAtMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjQ5CiAgICAvLyByZXR1cm4KICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfYnVyeSAxCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzOAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTAKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NTIKICAgIC8vIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCArPSBzZWxmLl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KGVudHJ5KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudAogICAgZnJhbWVfYnVyeSAtMgogICAgKwogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NTQKICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9SUik6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgMTIKICAgID09CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDEwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NTgKICAgIC8vIHBheWxvYWQub2JzZXJ2ZWRfcmF0ZSwKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAzMwogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1OQogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzYgLy8gInJhdGVfcmVzZXRfbXVsdGlwbGllciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjAKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NTUtNjYxCiAgICAvLyAjIFJSIGRlcml2ZXMgdGhlIG5leHQgcmF0ZSBmcm9tIGFuIG9ic2VydmVkIG9yYWNsZSB2YWx1ZSBwbHVzIHRoZQogICAgLy8gIyBjb250cmFjdCBzcHJlYWQgLyBtdWx0aXBsaWVyIHRlcm1zLCB0aGVuIGVuZm9yY2VzIGZsb29yIGFuZCBjYXAuCiAgICAvLyBvYnNlcnZlZF9yYXRlID0gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgcGF5bG9hZC5vYnNlcnZlZF9yYXRlLAogICAgLy8gICAgIHNlbGYucmF0ZV9yZXNldF9tdWx0aXBsaWVyLAogICAgLy8gICAgIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICAvLyApCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjYzCiAgICAvLyBvYnNlcnZlZF9yYXRlICsgc2VsZi5yYXRlX3Jlc2V0X3NwcmVhZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDM1IC8vICJyYXRlX3Jlc2V0X3NwcmVhZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X3NwcmVhZCBleGlzdHMKICAgICsKICAgIGZyYW1lX2J1cnkgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzQ0CiAgICAvLyBpZiBzZWxmLmhhc19yYXRlX3Jlc2V0X2Zsb29yIGFuZCByYXRlIDwgc2VsZi5yYXRlX3Jlc2V0X2Zsb29yOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDM4IC8vICJoYXNfcmF0ZV9yZXNldF9mbG9vciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5oYXNfcmF0ZV9yZXNldF9mbG9vciBleGlzdHMKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU1CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzEgLy8gInJhdGVfcmVzZXRfZmxvb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9mbG9vciBleGlzdHMKICAgIGZyYW1lX2RpZyA2CiAgICA+CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1NQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzQ1CiAgICAvLyByYXRlID0gc2VsZi5yYXRlX3Jlc2V0X2Zsb29yCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzEgLy8gInJhdGVfcmVzZXRfZmxvb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSA2CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X2Zsb29yIGV4aXN0cwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDYKICAgIC8vIGlmIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwIGFuZCByYXRlID4gc2VsZi5yYXRlX3Jlc2V0X2NhcDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzOSAvLyAiaGFzX3JhdGVfcmVzZXRfY2FwIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmhhc19yYXRlX3Jlc2V0X2NhcCBleGlzdHMKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU4CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzIgLy8gInJhdGVfcmVzZXRfY2FwIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfY2FwIGV4aXN0cwogICAgZnJhbWVfZGlnIDYKICAgIDwKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDcKICAgIC8vIHJhdGUgPSBzZWxmLnJhdGVfcmVzZXRfY2FwCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzIgLy8gInJhdGVfcmVzZXRfY2FwIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgNgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9jYXAgZXhpc3RzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1ODoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2MgogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPSBzZWxmLl9jbGFtcF9yYXRlKAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjYyLTY2NAogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPSBzZWxmLl9jbGFtcF9yYXRlKAogICAgLy8gICAgIG9ic2VydmVkX3JhdGUgKyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkCiAgICAvLyApCiAgICBmcmFtZV9kaWcgNgogICAgYXBwX2dsb2JhbF9wdXQKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc0CiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUEkpOgogICAgZnJhbWVfZGlnIDEwCiAgICBwdXNoaW50IDQKICAgID09CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDIwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzUKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc2CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAyMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4MQogICAgLy8gaWYgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCk6CiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMjkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4MgogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1BSRik6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgNQogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDMwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODYKICAgIC8vICsgKHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgLSBzZWxmLmV2ZW50X2N1cnNvcikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njg3CiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfUEVSX0VOVFJZX0JVREdFVCkKICAgIHB1c2hpbnQgMTAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODYtNjg3CiAgICAvLyArIChzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IC0gc2VsZi5ldmVudF9jdXJzb3IpCiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfUEVSX0VOVFJZX0JVREdFVCkKICAgICoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4NQogICAgLy8gVUludDY0KGNzdC5PUF9VUF9OT05fQ0FTSF9CQVNFX0JVREdFVCkKICAgIGludGMgNCAvLyAxNTAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODUtNjg3CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX05PTl9DQVNIX0JBU0VfQlVER0VUKQogICAgLy8gKyAoc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCAtIHNlbGYuZXZlbnRfY3Vyc29yKQogICAgLy8gKiBVSW50NjQoY3N0Lk9QX1VQX05PTl9DQVNIX1BFUl9FTlRSWV9CVURHRVQpCiAgICArCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODMtNjg5CiAgICAvLyBlbnN1cmVfYnVkZ2V0KAogICAgLy8gICAgIHJlcXVpcmVkX2J1ZGdldD0oCiAgICAvLyAgICAgICAgIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfQkFTRV9CVURHRVQpCiAgICAvLyAgICAgICAgICsgKHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgLSBzZWxmLmV2ZW50X2N1cnNvcikKICAgIC8vICAgICAgICAgKiBVSW50NjQoY3N0Lk9QX1VQX05PTl9DQVNIX1BFUl9FTlRSWV9CVURHRVQpCiAgICAvLyAgICAgKSwKICAgIC8vICkKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5MwogICAgLy8gZGlzY291bnRfZmFjdG9yID0gc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0OTQKICAgIC8vIGRlbm9taW5hdG9yID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0OTUKICAgIC8vIHNraXBfZmlyc3RfcmVkZW1wdGlvbiA9IEZhbHNlCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSA3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0OTcKICAgIC8vIGlmIGVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IgPiBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMjUKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgOAogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMzUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5OC01MDIKICAgIC8vICMgQW4gaW5pdGlhbCBQUkYgbWF5IGRlc2NyaWJlIHRoZSBmaXJzdCByZWRlbXB0aW9uIHBlcmlvZCBkaXJlY3RseS4KICAgIC8vIGRpc2NvdW50X2ZhY3RvciA9IHNlbGYuX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yKAogICAgLy8gICAgIGRpc2NvdW50X2ZhY3RvciwKICAgIC8vICAgICBlbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyA4CiAgICBjYWxsc3ViIF9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwNAogICAgLy8gc2tpcF9maXJzdF9yZWRlbXB0aW9uID0gVHJ1ZQogICAgaW50Y18xIC8vIDEKICAgIGZyYW1lX2J1cnkgNwogICAgZnJhbWVfYnVyeSAxCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAzNToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwNgogICAgLy8gZnV0dXJlX2V2ZW50X2lkID0gc2VsZi5ldmVudF9jdXJzb3IgKyBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X3doaWxlX3RvcEAzNjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwNwogICAgLy8gd2hpbGUgZnV0dXJlX2V2ZW50X2lkIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGZyYW1lX2RpZyAzCiAgICA+CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfd2hpbGVANDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwOAogICAgLy8gZnV0dXJlX2VudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KGZ1dHVyZV9ldmVudF9pZCkKICAgIGZyYW1lX2RpZyAzCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MDkKICAgIC8vIGZ1dHVyZV9ldmVudF90eXBlID0gZnV0dXJlX2VudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTEwLTUxMQogICAgLy8gIyBPbmx5IHJlZGVtcHRpb24tYmVhcmluZyBldmVudHMgY29udHJpYnV0ZSB0byB0aGUgYW5udWl0eSBkZW5vbWluYXRvci4KICAgIC8vIGlzX3JlZGVtcHRpb25fZXZlbnQgPSBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1BSKSBvciAoCiAgICBwdXNoaW50IDMKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTAtNTE0CiAgICAvLyAjIE9ubHkgcmVkZW1wdGlvbi1iZWFyaW5nIGV2ZW50cyBjb250cmlidXRlIHRvIHRoZSBhbm51aXR5IGRlbm9taW5hdG9yLgogICAgLy8gaXNfcmVkZW1wdGlvbl9ldmVudCA9IGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpIG9yICgKICAgIC8vICAgICBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgLy8gICAgIGFuZCBmdXR1cmVfZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKQogICAgLy8gKQogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX3RydWVANDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUxMgogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCkKICAgIGZyYW1lX2RpZyA0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTEyLTUxMwogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCkKICAgIC8vIGFuZCBmdXR1cmVfZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUxMwogICAgLy8gYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICBmcmFtZV9kaWcgMAogICAgcHVzaGludCAyNQogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUxMi01MTMKICAgIC8vIGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfTUQpCiAgICAvLyBhbmQgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IgPiBVSW50NjQoMCkKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX2ZhbHNlQDQxCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF90cnVlQDQwOgogICAgaW50Y18xIC8vIDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX21lcmdlQDQyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTE1CiAgICAvLyBpZiBpc19yZWRlbXB0aW9uX2V2ZW50OgogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANDcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUxNgogICAgLy8gaWYgc2tpcF9maXJzdF9yZWRlbXB0aW9uOgogICAgZnJhbWVfZGlnIDcKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlANDUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUxNwogICAgLy8gc2tpcF9maXJzdF9yZWRlbXB0aW9uID0gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDcKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDQ3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTI0CiAgICAvLyBmdXR1cmVfZXZlbnRfaWQgKz0gVUludDY0KDEpCiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMwogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfd2hpbGVfdG9wQDM2CgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDQ1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTIxCiAgICAvLyBmdXR1cmVfZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIGZyYW1lX2RpZyAwCiAgICBwdXNoaW50IDI1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTE5LTUyMgogICAgLy8gZGlzY291bnRfZmFjdG9yID0gc2VsZi5fZGlzY291bnRfYW5udWl0eV9mYWN0b3IoCiAgICAvLyAgICAgZGlzY291bnRfZmFjdG9yLAogICAgLy8gICAgIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDIKICAgIHN3YXAKICAgIGNhbGxzdWIgX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTIzCiAgICAvLyBkZW5vbWluYXRvciArPSBkaXNjb3VudF9mYWN0b3IKICAgIGZyYW1lX2RpZyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANDcKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX2ZhbHNlQDQxOgogICAgaW50Y18wIC8vIDAKICAgIGIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfbWVyZ2VANDIKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl93aGlsZUA0ODoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUyNgogICAgLy8gYXNzZXJ0IGRlbm9taW5hdG9yID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGZyYW1lX2RpZyAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjcKICAgIC8vIG51bWVyYXRvciA9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUyOAogICAgLy8gaWYgZW50cnkuZmxhZ3MgJiBVSW50NjQoZW51bXMuRkxBR19JTklUSUFMX1BSRikgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDU3CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18yIC8vIDgKICAgICYKICAgIGJueiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1MAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTI5LTUzMAogICAgLy8gIyBTdWJzZXF1ZW50IFBSRiBldmVudHMgYW1vcnRpemUgYm90aCBwcmluY2lwYWwgYW5kIGFscmVhZHkgYWNjcnVlZCBjYXJyeS4KICAgIC8vIG51bWVyYXRvciArPSBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICArCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1MDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUzMwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUzMS01MzUKICAgIC8vIHJldHVybiBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBudW1lcmF0b3IsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICAgICBkZW5vbWluYXRvciwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAxCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjkwCiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBzZWxmLl9yZWNhbGN1bGF0ZV9hbm51aXR5X3BheW1lbnQoCiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY5MC02OTIKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IHNlbGYuX3JlY2FsY3VsYXRlX2FubnVpdHlfcGF5bWVudCgKICAgIC8vICAgICBlbnRyeQogICAgLy8gKQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDMwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njk1CiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OTYtNzAwCiAgICAvLyBzZWxmLl9lbWl0X2V4ZWN1dGlvbl9ldmVudCgKICAgIC8vICAgICBlbnRyeT1lbnRyeSwKICAgIC8vICAgICBwYXlvZmY9VUludDY0KDApLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njk4CiAgICAvLyBwYXlvZmY9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY5OQogICAgLy8gc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OTYtNzAwCiAgICAvLyBzZWxmLl9lbWl0X2V4ZWN1dGlvbl9ldmVudCgKICAgIC8vICAgICBlbnRyeT1lbnRyeSwKICAgIC8vICAgICBwYXlvZmY9VUludDY0KDApLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGNhbGxzdWIgX2VtaXRfZXhlY3V0aW9uX2V2ZW50CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfYnVyeSAxCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAyOToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY5NAogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gZW50cnkubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDQxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAzMAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAyMDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY3NwogICAgLy8gZWxpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfSVBDQik6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgMTgKICAgID09CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAyMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc4LTY3OQogICAgLy8gIyBJUENCIGtlZXBzIHByaW5jaXBhbCB1bmNoYW5nZWQgYW5kIG9ubHkgcmVzZXRzIHRoZSBpbnRlcmVzdCBiYXNlLgogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDIzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDEwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY1CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9SUkYpOgogICAgZnJhbWVfZGlnIDEwCiAgICBwdXNoaW50IDExCiAgICA9PQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAxNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY2CiAgICAvLyBuZXh0X3JhdGUgPSBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZQogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2NwogICAgLy8gaWYgbmV4dF9yYXRlID09IFVJbnQ2NCgwKToKICAgIGJueiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAxMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY4CiAgICAvLyBuZXh0X3JhdGUgPSBzZWxmLnJhdGVfcmVzZXRfbmV4dAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDM3IC8vICJyYXRlX3Jlc2V0X25leHQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSA1CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X25leHQgZXhpc3RzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2OQogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPSBuZXh0X3JhdGUKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGZyYW1lX2RpZyA1CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAxOAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAxNDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY3MQogICAgLy8gaWYgZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUgIT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDkKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzIKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGZyYW1lX2RpZyA5CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAxOAoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbWl0X2V4ZWN1dGlvbl9ldmVudChlbnRyeTogYnl0ZXMsIHBheW9mZjogdWludDY0LCBzZXR0bGVkX2Ftb3VudDogdWludDY0KSAtPiBieXRlczoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzA2LTcxMgogICAgLy8gZGVmIF9lbWl0X2V4ZWN1dGlvbl9ldmVudCgKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgICosCiAgICAvLyAgICAgZW50cnk6IHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5LAogICAgLy8gICAgIHBheW9mZjogVUludDY0LAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50OiBVSW50NjQsCiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAzIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxNgogICAgLy8gY29udHJhY3RfaWQ9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25faWQuaWQsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uSUQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxNwogICAgLy8gZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE4CiAgICAvLyBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICBmcmFtZV9kaWcgLTMKICAgIGV4dHJhY3QgOCAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTkKICAgIC8vIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgZnJhbWVfZGlnIC0zCiAgICBleHRyYWN0IDkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIwCiAgICAvLyBhcHBsaWVkX2F0PUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIzCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBmcmFtZV9kaWcgLTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxOAogICAgLy8gZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgaW50Y18yIC8vIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcyMwogICAgLy8gc2VsZi5fcGF5b2ZmX3NpZ24oZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSwgcGF5b2ZmKQogICAgZ2V0Ynl0ZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzUyCiAgICAvLyBpZiBwYXlvZmYgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0yCiAgICBibnogX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzUzCiAgICAvLyByZXR1cm4gVUludDY0KGVudW1zLlBBWU9GRl9TSUdOX1BPU0lUSVZFKQogICAgaW50Y18xIC8vIDEKCl9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9wYXlvZmZfc2lnbkA3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIyLTcyNAogICAgLy8gcGF5b2ZmX3NpZ249YXJjNC5VSW50OCgKICAgIC8vICAgICBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICAvLyApLAogICAgaXRvYgogICAgZHVwCiAgICBiaXRsZW4KICAgIGludGNfMiAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBleHRyYWN0IDcgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzI2CiAgICAvLyBjdXJyZW5jeV9pZD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcyNwogICAgLy8gc2VxdWVuY2U9ZW50cnkuZXZlbnRfaWQgKyBVSW50NjQoMSksCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE1LTcyOAogICAgLy8gRXhlY3V0aW9uRXZlbnQoCiAgICAvLyAgICAgY29udHJhY3RfaWQ9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25faWQuaWQsCiAgICAvLyAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgcGF5b2ZmPXBheW9mZiwKICAgIC8vICAgICBwYXlvZmZfc2lnbj1hcmM0LlVJbnQ4KAogICAgLy8gICAgICAgICBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBzZXR0bGVkX2Ftb3VudD1zZXR0bGVkX2Ftb3VudCwKICAgIC8vICAgICBjdXJyZW5jeV9pZD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgc2VxdWVuY2U9ZW50cnkuZXZlbnRfaWQgKyBVSW50NjQoMSksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMAogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAyCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAzCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyA0CiAgICBpdG9iCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMgogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxNC03MjkKICAgIC8vIGFyYzQuZW1pdCgKICAgIC8vICAgICBFeGVjdXRpb25FdmVudCgKICAgIC8vICAgICAgICAgY29udHJhY3RfaWQ9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25faWQuaWQsCiAgICAvLyAgICAgICAgIGV2ZW50X2lkPWVudHJ5LmV2ZW50X2lkLAogICAgLy8gICAgICAgICBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICAvLyAgICAgICAgIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgICAgICBhcHBsaWVkX2F0PUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gICAgICAgICBwYXlvZmY9cGF5b2ZmLAogICAgLy8gICAgICAgICBwYXlvZmZfc2lnbj1hcmM0LlVJbnQ4KAogICAgLy8gICAgICAgICAgICAgc2VsZi5fcGF5b2ZmX3NpZ24oZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSwgcGF5b2ZmKQogICAgLy8gICAgICAgICApLAogICAgLy8gICAgICAgICBzZXR0bGVkX2Ftb3VudD1zZXR0bGVkX2Ftb3VudCwKICAgIC8vICAgICAgICAgY3VycmVuY3lfaWQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgICAgICBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIC8vICAgICApCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHg5YTMzMmI5NSAvLyBtZXRob2QgIkV4ZWN1dGlvbkV2ZW50KHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NTQKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gKFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwgVUludDY0KGVudW1zLkVWVF9QSSkpOgogICAgZnJhbWVfZGlnIDUKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYm56IF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9pZl9ib2R5QDUKICAgIGZyYW1lX2RpZyA1CiAgICBwdXNoaW50IDQKICAgID09CiAgICBieiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUA2CgpfZW1pdF9leGVjdXRpb25fZXZlbnRfaWZfYm9keUA1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzU1CiAgICAvLyByZXR1cm4gVUludDY0KGVudW1zLlBBWU9GRl9TSUdOX1BPU0lUSVZFKQogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcyMwogICAgLy8gc2VsZi5fcGF5b2ZmX3NpZ24oZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSwgcGF5b2ZmKQogICAgYiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fcGF5b2ZmX3NpZ25ANwoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc1NgogICAgLy8gcmV0dXJuIFVJbnQ2NChlbnVtcy5QQVlPRkZfU0lHTl9ORUdBVElWRSkKICAgIHB1c2hpbnQgMjU1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MjMKICAgIC8vIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIGIgX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX3BheW9mZl9zaWduQDcKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fcm9sZV9pc19hY3RpdmUocm9sZV9tYXA6IGJ5dGVzLCByb2xlX2FkZHJlc3M6IGJ5dGVzKSAtPiB1aW50NjQ6Cl9yb2xlX2lzX2FjdGl2ZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NwogICAgLy8gZGVmIF9yb2xlX2lzX2FjdGl2ZShzZWxmLCByb2xlX21hcDogdHlwLlJiYWNSb2xlLCByb2xlX2FkZHJlc3M6IEFjY291bnQpIC0+IGJvb2w6CiAgICBwcm90byAyIDEKICAgIHB1c2hieXRlcyAiIgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU4LTYyCiAgICAvLyByZXR1cm4gc2VsZi5faGFzX3JvbGUocm9sZV9tYXAsIHJvbGVfYWRkcmVzcykgYW5kICgKICAgIC8vICAgICByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICkKICAgIGJ6IF9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIEJveE1hcCBlbnRyeSBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYwCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MAogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgPD0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYxCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIEJveE1hcCBlbnRyeSBleGlzdHMKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYwLTYxCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDAKICAgID49CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTktNjEKICAgIC8vIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IF9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQKICAgIGludGNfMSAvLyAxCgpfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU4LTYyCiAgICAvLyByZXR1cm4gc2VsZi5faGFzX3JvbGUocm9sZV9tYXAsIHJvbGVfYWRkcmVzcykgYW5kICgKICAgIC8vICAgICByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICkKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgX3JvbGVfaXNfYWN0aXZlX2Jvb2xfbWVyZ2VANQoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkgLT4gdm9pZDoKX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjUKICAgIC8vIGFzc2VydCBzZWxmLl9pc19hcnJhbmdlcihUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjUyCiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzID09IHNlbGYuYXJyYW5nZXIudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOCAvLyAweDUyM2E0MTUyNTIyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgPT0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2NQogICAgLy8gYXNzZXJ0IHNlbGYuX2lzX2FycmFuZ2VyKFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpIC0+IHZvaWQ6Cl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4MwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFzc2V0X2RlZmF1bHRlZCwgZXJyLkRFRkFVTFRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQxIC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfZGVmYXVsdGVkIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIERlZmF1bHRlZAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkgLT4gdm9pZDoKX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg2CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYXNzZXRfc3VzcGVuZGVkLCBlcnIuU1VTUEVOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzMgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9zdXNwZW5kZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gU3VzcGVuZGVkIG9wZXJhdGlvbnMKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkOiB1aW50NjQpIC0+IHZvaWQ6Cl9hc3NlcnRfdmFsaWRfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OAogICAgLy8gZGVmIF9hc3NlcnRfdmFsaWRfcm9sZShzZWxmLCByb2xlX2lkOiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTAKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIHB1c2hpbnQgMjAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkxCiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgcHVzaGludCAyNQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTIKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICBwdXNoaW50IDQwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MwogICAgLy8gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgcHVzaGludCA1MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTQKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgcHVzaGludCA2MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTUKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICBwdXNoaW50IDcwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NgogICAgLy8gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgcHVzaGludCA4MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfZmFsc2VAOAoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3OgogICAgaW50Y18xIC8vIDEKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX21lcmdlQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgcmV0c3ViCgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9mYWxzZUA4OgogICAgaW50Y18wIC8vIDAKICAgIGIgX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfbWVyZ2VAOQo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" }, "byteCode": { - "approval": "DCAFAAEIINwLJjIEFR98dQZzdGF0dXMMZXZlbnRfY3Vyc29yFHNjaGVkdWxlX2VudHJ5X2NvdW50FW91dHN0YW5kaW5nX3ByaW5jaXBhbBFmaXhlZF9wb2ludF9zY2FsZRBhY2NydWVkX2ludGVyZXN0GWludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UCQSMVbm9taW5hbF9pbnRlcmVzdF9yYXRlDWNvbnRyYWN0X3R5cGUUcmVzZXJ2ZWRfdW5pdHNfdG90YWwScmVzZXJ2ZWRfcHJpbmNpcGFsC3RvdGFsX3VuaXRzGW5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24RcmVzZXJ2ZWRfaW50ZXJlc3QZY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleBpjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleAZSOkFSUiMTc2V0dGxlbWVudF9hc3NldF9pZBdpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudAZSOkFVVCMGUjpQWUQjBlI6TU5HIwJTIwZSOk1PQyMGUjpUUlMjBlI6T1BEIxVpbml0aWFsX2V4Y2hhbmdlX2RhdGUVdHJhbnNmZXJfb3BlbmluZ19kYXRlFXRyYW5zZmVyX2Nsb3N1cmVfZGF0ZRByYXRlX3Jlc2V0X2Zsb29yDnJhdGVfcmVzZXRfY2FwD2Fzc2V0X3N1c3BlbmRlZBxkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uEXJhdGVfcmVzZXRfc3ByZWFkFXJhdGVfcmVzZXRfbXVsdGlwbGllcg9yYXRlX3Jlc2V0X25leHQUaGFzX3JhdGVfcmVzZXRfZmxvb3ISaGFzX3JhdGVfcmVzZXRfY2FwAQAPYXNzZXRfZGVmYXVsdGVkD3Byb3NwZWN0dXNfaGFzaA5wcm9zcGVjdHVzX3VybBVkZW5vbWluYXRpb25fYXNzZXRfaWQNbWF0dXJpdHlfZGF0ZRRkYXlfY291bnRfY29udmVudGlvbglkZWZhdWx0ZWQDBoEBAgAAMRhAALEnEjIDZycbMgNnJyEiZycpImcpImcnCiJnJyqAAGcnK4AAZycsImcnEyJnJxwiZyctImcnHSJnJx4iZycuImcnDSJnJwsiZycUImcnBCJnJw4iZyciImcnByJnJwYiZycJImcnIyJnJyQiZycfImcnICJnJyUiZycmImcnJyJnJwwiZycPImcnECJnJxEiZyoiZysiZycvImcnBSJnMTWBBBJEMTSBJhJEMTcURDE2FESABJFPBOs2GgCOAQDOMRkURDEYQQC3ghkEtEYYyATngyUpBJQ4hyMEbIXj7gS90alEBHwPGBIEFPwQ7wR0pyl/BAnU/hQEmpv6hQSF7tM9BKssD8QE2fIlrASYg1BaBPtNRCgEjqbnTAQCr1V6BIL3Gy0E7wT10wTfNDVQBD2+gL0EHj5I5wQBDIKZBHQGrNIEGnKi7jYaAI4ZAFYDIQR9BKcFMQYhBlsGswbmBxQJCAofCpgMBAz2DRUNqA3tDgUOHQ7SD2gPhw+SD9wAgASVbXFWNhoAjgEG8QAxGYEEEjEYEERCDc2KAgCL/oEKCIsAMgwNQQAqsYEGshCBBbIZJzCyHicwsh+L/40CAAsABLNC/9syALIBQv/1IrIBQv/viSKAAEcNNhoBSRUkEkQXIillRESIFb2IFcSIFckiKWVEgTISFESIEiBBAAtJgWQLIQQIIoj/jyJFBSJFDiJFDUsESwEMQQJZIiplRCIrZUQMQQJNIiplRIgQ8klFEYEJW0lFAzIHDUACN0sPJFVJRRAkEklFBEAAEEsOgQMSQAAISw6BExJBAj8jQQIUSw8iWyIqZUQSREsBMgcOREsCQAHtSw6BExJAAeUiRQtLDyRVSUUQgQMSQAFlSw6BExJAAV0iRQZLD4ExW0UIiBF6QAD+SwdFCUsKiBA4SwaIEDNLAYgQTUlOAkUPSYgQRElFC0sCSwEISUUJMgoiJxNlRHAARCInD2VEIicMZURLAQhLAksBD0RPAkwJTwIPRE8DCCcPTGciJwxlRAgnDExnIicQZURPAggnEExnIicRZUQIJxFMZ0sPJFWBAxJBAHoiJwZlREsQiBEGRRIIJwZMZ4gQ5kEACksPJFWBExJBAAlLD4EpWycOTGcnBEsIZycHSwlnIiplRCMIKkxnSw9XCAGAAROoQQARIicEZURAAAkpgcgBZycHImdLD0sESYgTc0hLDUsMCEUOSwxLBwhFDUsEIwhFBUL+dycGImdC/5BLDyRVSUUQgQMSQQAQIicEZURLBglJRQlFCUL+6UsOJBJBABMiJwRlTEUJRCInB2VMRQpEQv7PSw6BExJAAAdLB0UJQv7AIkUIIkUJQv63iBAnQQBWSw6BExJBAAoiJwRlREUGQv6OIicGZURLEIgQHkUSCElFCyInDmVED0EABiJFBkL+byInDmVESwoJSUUIIicEZUQNQQAKIicEZURFBkL+UUsGRQZC/kpLD4ExWyInBGVESg5ETAlFBkL+NiInBmVESxCID8ZFEghFC0L+DEsESURLDklLD0lOAwgyB08CFk8DFlBPAhZQTwIWUEwWUChMULAjQyJC/b6AAEcCNhoBRwIVJRJENhoCSSJZgQIISwEVEkRXAgBMIillREQnCExQSb1FAUQiJxtlRDIDE0EAIjEAIicbZUQSQAAVMQBLAxJAAA0xAEsBvkRXACASQQEAI0SIErWIEroiKWVEgTISFERLAkmIDWqIDO1GAkm+REmBSVtJTgJFCEmBUVtJRQhPAghJRQZEVwAgIicTZURwAEUBQQC3Sb5EgYADU0AArSNBAHgyCiInE2VETEsBcABESwVJTgIPREsCSU4DvkRJVwAgsTIATwOyEkyyFE8CshGBBLIQsgGzSYFJW0lOAkUJSYFRW0lOA0UJIhZMSwFcSUxcUU8DTL8iJw9lRElLAg9EIicMZURLAw9ETAknD0xnIicMZURMCScMTGdLBUlLBklOAwgyB08CFk8DFlBPAhZQTBZQSwJJFRZXBgJMUEyAAgAiUExQKExQsCNDIkL/UCJC/v02GgFJFSQSRBc2GgJJFSQSRBeIEZdKDEQnHU8CZyceTGcyBxYoTFCwI0M2GgFJFSUSRDYaAkkVJBJEF0lOAiIpZUREJxYxAIgRLkSIEWiIEW0iKWVEgTISRCcISwJQSU4DvUUBREyIC4lJRCInC2VECCInDWVEDkQiJxxlREEACTIHIiccZUQOREcCvkSBKFtLA0lOAwgWgShMuyInC2VECCcLSwFnIicNZURMCRYoTFCwI0MiSTYaAUkVJRJENhoCSRUlEkQ2GgNHAhUkEkQXIillRESIEN6IEOMiKWVEgTISFEQiJx1lREEACSInHWVEMgcORCInHmVEQQAJMgciJx5lRAxEMQBLBElOAhJEJwhLAVBJRQhJvUUBRCcISwVJTgJQSUUJvUUBREsCiArCSYgKvk8CE0RLAUlETL5EJVsORCIqZUQiK2VED0AADiIqZUSIC8+BCVsyBw1ESwNJiAsaSwNJTgKICxKICpVGAogKkEYCSwVJvkQlW0sCSU4CSwEOREsBCRZPAiVPArtLBUm+RCVbTwIIFiVMuyhLAlCwI0M2GgFJFSUSRDYaAkkVIxJEIlMnFTEAiA+7RCcITwJQSb1FAURJgTAjuiJPA1SBMEy7MgcWKExQsCNDNhoBSRUlEkQ2GgJJFSUSRCcXMQCID4NEIillRIHIARIURIgPs4gPuCcITwJQSb1FARREIhZPAksBUEsBUCcoUEsBUEsBUEsBUEsBUExQvzIHFihMULAjQzYaAUkVJRJENhoCSRUlEkQnCEsCUEm9RQFEMQBPAxJEiA9diA9iIk8CuzIHFihMULAjQzYaAUkVJRJEJwhMUEm9RQFEvkgoTFCwI0M2GgFJFSUSRCcSTGcyBxYoTFCwI0OAAEk2GgFHAhWBaxJENhoCSU4CFYFIEkQ2GgNJTgJJFUsBJVlJgSISRE8CTEsCUklOAyJZgSQIEkSIDtkiVUknCksBZ0EAIkkjEkAAHEmBAhJAABVJgQMSQAAOSYEEEkAAB0mBBRJBAYcjRCInCmVMRQJESwRJgSFbSUUIRIE5VUlFCEEAH0sGIxJAABhLBoECEkAAEEsGgQMSQAAISwaBBBJBAUcjREkjE0EACEsEgZIGUxREIillRBREIicUZUQUREsESSNbSXELRQFEJyxLAWdLAYEJW0lPAhJEJxNLAWexMgAyCiKyErIUTLIRgQSyELIBs0mBEVsnDUxnJwsiZycuSwhnSYEpWyccSwFnSwGBMVsnLUsBZ0sGSU4CgTBbJw5MZycUSwpnSwOBkgZTJyJMZ0sBgRBbJwRMZ0sBgShbJwZMZ0sBJVsnCUxnSwGBGFsnB0xnSwOBOlsnI0xnSwOBQlsnJExnSwOBSlsnH0xnSwOBUlsnIExnSwOBWlsnJUxnSwOBkAZTJyZMZ0sDgZEGUycnTGdPA4FjWycFTGdLASRbKkxnSwGBOFsnEExnSwGBQFsnEUxnJw8iZycMImdLAjIHDURMIltLAgxEDERLAlcAICcqTGdLAVcCACcrTGcyBxYoTFCwI0MiQv62IkL+diKAAEcCNhoBSRUkEkQXSTYaAkkVIxJEIlNMNhoDSU4CSSJZSU4DSYFBC4ECCE8CFRJEiAzsIicKZUxOA0QiKWVEFERJgRAORCInFGVEREyBEAtMgWQLIQQIIoj2tiJJSwQMQQCLSwRXAgBJRQxLAUlOAoFBC4FBWEkkVUlOAkUNSSJbSUUNSwVPBAhLARJESwVPA4gIOEyBCVtJRQpEQQAXSUEAJUkjCYFBC0sLTIFBWIEJW0sIDkRLCEAABUsJIxJESSMIRQFC/5RLBklEIwkWJxhMUEm9RQFESSKBAroXSUQjCYFBC4ECCIFBukL/wUsGFicYTFBJvEhLBb9LBUEADEsBSwQIK0xnKYEyZzIHFihMULAjQyIpZUREiAwCiAwJiAwOIiplRCIrZURLAQ1EiAdmSVcIAUmAAQGoREsBVwAISwJXCQhLA1cRCEsEVxkISwVXIQhLBlcpCEsHVzEISwhXOQhPB08IUE8HUE8GUE8FUCIWUE8EUE8DUE8CUExQiAiYRgIyBxYoTFCwI0MiRwSAAEk2GgFJFSQSRBc2GgJHAhWBSRJEIillRESIC3qIC3+BQVtJgQQaQQCwIicKZUSBBRJEiAtXIicKZURJgQUSREsCSSJbSUUHIitlRBJESVcIAUUMJFWIBuEiK2VEgRAKJzFFBxYnGExQSUUJvUUBQQAHSwe+TEUHREsFSSJZSYEQDERLA0lXCQhLAVcRCEsCVxkISwNXKQhLBFcxCE8FVzkISwsWSxJQTwZQTwVQTwRQTwNQTwJQTFBLAxZQTwJMUEwjCBZXBgJcAEsISbxITL8iK2VEIwgrTGciKmVESwNJTwISRIgGHklFCElXCAFFCiRVSUUGIxJAAChLBIEEEkAAIEsEgQwSQAAYSwSBCxJAABBLBIESEkAACEsEgQUSQQBBI0RLCIABAalESwSBDBJAAAhLBIELEkEAJCNBABonGTEAiAoSREsGSwKIBzpGAjIHFihMULAjQ4gKMEL/6CJC/9kiQv+8Ikk2GgFHAhWBQRJEIillRESIChGIChiICh0iKWVEgTISFEQiJwplRIEFEkRJIltJTgIiK2VETEsBEkRLAVcIAUlOA4ABA6hETIE5W0lOAiMaREEAEyIrZUQjCYgFQIEJW0sEgQlbDkQiK2VEgRAKJzFFBhYnGExQSUUHvUUBQQAHSwW+TEUGREsESSJZSYEQDERLBUlXCQhLAVcRCEsCVxkISwNXIQhLBFcpCE8FVzEISwoWSwpQTwZQTwVQTwRQTwNQTwJQTFBLAxZQTwJMUEwjCBZXBgJcAEsGSbxITL8iK2VEIwgrTGcyBxYoTFCwI0M2GgFJFSMSRCJTJxoxAIgI7kQnL0xnMgcWKExQsCNDIillRElEIicKZUQWSZMkDkRXBwEiJw1lRCInC2VEIicUZUQiKmVEIitlRCInBGVEIicHZUQiJwllRCInBmVEIicQZUQiJxFlRCInD2VEIicMZURPDhZPDkxQTw0WUE8MFlBPCxZQTwoWUE8JFlBPCBZQTwcWUE8GFlBPBRZQTwQWUE8DFlBPAhZQTBZQKExQsCNDIillREQiKmVEIitlRA9BACUiKmVEFicoUCIWTEsBUEsBUEsBUEsBUEsBUEsBUExQKExQsCNDIiplRIgDvUL/8IgIPiNDNhoBSRUlEkSICDEnEkxnMgcWKExQsCNDNhoBSRUlEkSICBknG0xnMgcWKExQsCNDNhoBSRUjEkQ2GgJJTgIVJRJENhoDSU4CFYEQEkSIB+yIB/MXRwKIB/2BFBJBAA4nEksDZzIHFihMULAjQ0mBKBJBABEnF0sDUEm9RQEUREsCv0L/30mBMhJBABEnFksDUEm9RQEUREsCv0L/x0mBPBJBABEnGksDUEm9RQEUREsCv0L/r0mBRhJBABEnFUsDUEm9RQEUREsCv0L/l0mBUBJB/5AnGUsDUEm9RQEUREsCv0L/fzYaAUkVIxJENhoCSU4CFSUSRIgHQogHSRdHAogHU0mBFBNEgSgSQQAVJxdLAlBJvUUBRLxIMgcWKExQsCNDSYEyEkEADycWSwJQSb1FAUS8SEL/4UmBPBJBAA8nGksCUEm9RQFEvEhC/8tJgUYSQQAPJxVLAlBJvUUBRLxIQv+1SYFQEkH/ricZSwJQSb1FAUS8SEL/nzYaAUkVIxJEIlMnFTEAiAZ8RCchTGcyBxYoTFCwI0MiJxJlRChMULAjQzYaAUkVJRJEJxdLAYgGVCcWSwKIBk0nGksDiAZGJxVLBIgGPycZTwWIBjgnKCJPBlQjTwVUgQJPBFSBA08DVIEETwJUKExQsCNDNhoBSRUjEkQ2GgJJTgIVJRJEF0mIBlCDBhQoMjxGUE8GjgYATwBAADEAIgATAAEAJxlLAVBJvUUBRL5IKExQsCNDJxVLAVBJvUUBRL5IQv/rJxpLAVBJvUUBRL5IQv/cJxZLAVBJvUUBRL5IQv/NJxdLAVBJvUUBRL5IQv++gBAAAAAAAAAAAAAAAAAAAAAAQv+pigEAJwiL/1C+RIGAA1MURImKAQInCIv/UEm9RQFESb5IIicQZURLAYE5WwkiJxFlREsCgUFbCUsCJVsiJwVlRE8DSwJPAogAmCInBWVETwNPA08CiACKSwKBSVtLAggWTwNMXElJgVFbSwIIFlxRIicQZUQWXDkiJxFlRBZcQSIqZUQWXDFPA0y/iYoBACKAACcIi/9QSb1FAUQiKWVEgTISQQABiYsCvkxJTgKMAESBKFtJjAFAAAGJiwBJJVuLAUlOAwgWXCAiFlwoiwJMvyInC2VESUsCD0RMCScLTGeJigMBi/1BAAWL/kAAAiKJi/2L/h2L/5eJigEBi/9AAAIiiSInDWVESUQiJwVlRIv/TE8CiP/KiYoBAYv/QAACIokiJw1lRCInBWVEi/9MiP+viYoBASIrZUSL/w1Ei/+BEAoWJxhMUEm9RQFEi/+BEBhLASKBAroXSwENRIFBC4ECCIFBuomKAgCL/yMSQAAfi/8kEkAAGIv/gRMSQAAQi/+BDBJAAAiL/4ELEkEAAyNEiYv+QAAEIkL/9Yv+gQMSQAAIi/6BAhJBABiL/4EDEkAACIv/gRISQQAEI0L/0SJC/82L/iMSQQAgi/+BAxJAABCL/4ESEkAACIv/gQUSQQAEI0L/qiJC/6aL/oEEEkEAKIv/gQMSQAAYi/+BBBJAABCL/4ESEkAACIv/gQUSQQAEI0L/eiJC/3aL/oEFEkEACIv/gQMSQv9mIkL/YiInCmVEIxJBAAoiJyJlREEAAiOJIomKAQKL/4ERW0lBABAiJwllREEACCInB2VEQAAGIov/TwKJIicHZUQiJwllRCInBWVEiP5oIicFZUSLAEyI/l2L/08CiYoCAYv/QAADi/6JIicFZUQiJwllRIv/SwKI/jwISUQiJwVlRIv+TE8CiP4siYoCAiKAAEcIi/4iWyIqZUQSRIv+gQlbMgcORIv+JFVJIxJJQQBeIillRIEyEkQiJwtlRCInDWVEEkSL/oExWycESwFnJwdMZ4v+gSFbJwlMZycGImeL/oEpWycOTGciKmVEIwgqTGcpgWRniwtEIicUZUSL/kwiiAHaSYz+i/+MAYwAiSIpZUSBMhIURCInBmVEi/6I/viM/ggnBkxniwqBDBJBAXiL/4EhWyInJGVEIicFZUSI/XMiJyNlRAiMBiInJmVEQQATIicfZUSLBg1BAAgiJx9lTIwGRCInJ2VEQQATIicgZUSLBgxBAAgiJyBlTIwGRCcJiwZniwqBBBJBAQeL/oExWycESwFnJwdMZ4j+ZUEA54sKgQUSQQDFIitlRCIqZUQJgWQLIQQIIojrxCInBWVMjAJEIowBIowHi/6BGVtJjAhBAA+LAosIiP6BSYwCI4wHjAEiKmVEIwiMAyIrZUSLAw1BAFKLA4j9DEmMACRVSYwEgQMSQAAQiwSBExJBADOLAIEZW0EAKyNBAAiLB0EADCKMB4sDIwiMA0L/vosAgRlbiwJMiP4kSYwCiwEIjAFC/+EiQv/SiwFEIicEZUSL/oE5WyQaQAAGIicGZUQIIicFZUSLAYj8SycOTGciKmVEIwgqTGeL/iJJiABgSYz+i/+MAYwAiYv+gSlbJw5MZ0L/2osKgRISQf7/IicEZUQnB0xnQv7ziwqBCxJBABuL/oEhW0mMBUAACCInJWVMjAVEJwmLBWdC/rqL/oEhW0mMCUH+rycJiwlnQv6nigMBMgiL/SJbi/1XCAGL/VcJCDIHi/0kVYv+QABFIxZJkyQORFcHASInE2VEiwFJIwiLABZPAhZQiwJQiwNQiwQWUIv+FlBPA1CL/xZQTwIWUEwWUIAEmjMrlUxQsIv9jACJiwUjEkAACIsFgQQSQQAEI0L/qYH/AUL/o4oCAYAAi/6L/1BJvUUBQQAfiwG+RCJbMgdJjAAOQQAQiwG+RCRbiwAPQQAEI4wAiSJC//kxACInEmVEEkSJIicpZUQURIkiJyFlRBREiYoBAIv/gRQSQAAwi/+BGRJAACiL/4EoEkAAIIv/gTISQAAYi/+BPBJAABCL/4FGEkAACIv/gVASQQADI0SJIkL/+g==", + "approval": "DCAFAAEIINwLJjIEFR98dQZzdGF0dXMMZXZlbnRfY3Vyc29yFHNjaGVkdWxlX2VudHJ5X2NvdW50FW91dHN0YW5kaW5nX3ByaW5jaXBhbBFmaXhlZF9wb2ludF9zY2FsZRBhY2NydWVkX2ludGVyZXN0GWludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UCQSMVbm9taW5hbF9pbnRlcmVzdF9yYXRlDWNvbnRyYWN0X3R5cGUUcmVzZXJ2ZWRfdW5pdHNfdG90YWwScmVzZXJ2ZWRfcHJpbmNpcGFsC3RvdGFsX3VuaXRzGW5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24RcmVzZXJ2ZWRfaW50ZXJlc3QZY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleBpjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleAZSOkFSUiMTc2V0dGxlbWVudF9hc3NldF9pZBdpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudAZSOkFVVCMGUjpQWUQjBlI6TU5HIwJTIwZSOk1PQyMGUjpUUlMjBlI6T1BEIxVpbml0aWFsX2V4Y2hhbmdlX2RhdGUVdHJhbnNmZXJfb3BlbmluZ19kYXRlFXRyYW5zZmVyX2Nsb3N1cmVfZGF0ZRByYXRlX3Jlc2V0X2Zsb29yDnJhdGVfcmVzZXRfY2FwD2Fzc2V0X3N1c3BlbmRlZBxkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uEXJhdGVfcmVzZXRfc3ByZWFkFXJhdGVfcmVzZXRfbXVsdGlwbGllcg9yYXRlX3Jlc2V0X25leHQUaGFzX3JhdGVfcmVzZXRfZmxvb3ISaGFzX3JhdGVfcmVzZXRfY2FwAQAPYXNzZXRfZGVmYXVsdGVkD3Byb3NwZWN0dXNfaGFzaA5wcm9zcGVjdHVzX3VybBVkZW5vbWluYXRpb25fYXNzZXRfaWQNbWF0dXJpdHlfZGF0ZRRkYXlfY291bnRfY29udmVudGlvbglkZWZhdWx0ZWQDBoEBAgAAMRhAALEnEjIDZycbMgNnJyEiZycpImcpImcnCiJnJyqAAGcnK4AAZycsImcnEyJnJxwiZyctImcnHSJnJx4iZycuImcnDSJnJwsiZycUImcnBCJnJw4iZyciImcnByJnJwYiZycJImcnIyJnJyQiZycfImcnICJnJyUiZycmImcnJyJnJwwiZycPImcnECJnJxEiZyoiZysiZycvImcnBSJnMTWBChJEMTSBNhJEMTcURDE2FESABJFPBOs2GgCOAQDOMRkURDEYQQC3ghkEtEYYyATngyUpBJQ4hyMEbIXj7gS90alEBHwPGBIEFPwQ7wR0pyl/BAnU/hQEmpv6hQSF7tM9BKssD8QE2fIlrASYg1BaBPtNRCgEjqbnTAQCr1V6BIL3Gy0E7wT10wTfNDVQBD2+gL0EHj5I5wQBDIKZBHQGrNIEGnKi7jYaAI4ZAFYDIQR9BKcFMQYhBlsGswbmBxQJCAofCpgMBAz2DRUNqA3tDgUOHQ7SD2gPhw+SD9wAgASVbXFWNhoAjgEG8QAxGYEEEjEYEERCDc2KAgCL/oEKCIsAMgwNQQAqsYEGshCBBbIZJzCyHicwsh+L/40CAAsABLNC/9syALIBQv/1IrIBQv/viSKAAEcNNhoBSRUkEkQXIillRESIFb2IFcSIFckiKWVEgTISFESIEiBBAAtJgWQLIQQIIoj/jyJFBSJFDiJFDUsESwEMQQJZIiplRCIrZUQMQQJNIiplRIgQ8klFEYEJW0lFAzIHDUACN0sPJFVJRRAkEklFBEAAEEsOgQMSQAAISw6BExJBAj8jQQIUSw8iWyIqZUQSREsBMgcOREsCQAHtSw6BExJAAeUiRQtLDyRVSUUQgQMSQAFlSw6BExJAAV0iRQZLD4ExW0UIiBF6QAD+SwdFCUsKiBA4SwaIEDNLAYgQTUlOAkUPSYgQRElFC0sCSwEISUUJMgoiJxNlRHAARCInD2VEIicMZURLAQhLAksBD0RPAkwJTwIPRE8DCCcPTGciJwxlRAgnDExnIicQZURPAggnEExnIicRZUQIJxFMZ0sPJFWBAxJBAHoiJwZlREsQiBEGRRIIJwZMZ4gQ5kEACksPJFWBExJBAAlLD4EpWycOTGcnBEsIZycHSwlnIiplRCMIKkxnSw9XCAGAAROoQQARIicEZURAAAkpgcgBZycHImdLD0sESYgTc0hLDUsMCEUOSwxLBwhFDUsEIwhFBUL+dycGImdC/5BLDyRVSUUQgQMSQQAQIicEZURLBglJRQlFCUL+6UsOJBJBABMiJwRlTEUJRCInB2VMRQpEQv7PSw6BExJAAAdLB0UJQv7AIkUIIkUJQv63iBAnQQBWSw6BExJBAAoiJwRlREUGQv6OIicGZURLEIgQHkUSCElFCyInDmVED0EABiJFBkL+byInDmVESwoJSUUIIicEZUQNQQAKIicEZURFBkL+UUsGRQZC/kpLD4ExWyInBGVESg5ETAlFBkL+NiInBmVESxCID8ZFEghFC0L+DEsESURLDklLD0lOAwgyB08CFk8DFlBPAhZQTwIWUEwWUChMULAjQyJC/b6AAEcCNhoBRwIVJRJENhoCSSJZgQIISwEVEkRXAgBMIillREQnCExQSb1FAUQiJxtlRDIDE0EAIjEAIicbZUQSQAAVMQBLAxJAAA0xAEsBvkRXACASQQEAI0SIErWIEroiKWVEgTISFERLAkmIDWqIDO1GAkm+REmBSVtJTgJFCEmBUVtJRQhPAghJRQZEVwAgIicTZURwAEUBQQC3Sb5EgYADU0AArSNBAHgyCiInE2VETEsBcABESwVJTgIPREsCSU4DvkRJVwAgsTIATwOyEkyyFE8CshGBBLIQsgGzSYFJW0lOAkUJSYFRW0lOA0UJIhZMSwFcSUxcUU8DTL8iJw9lRElLAg9EIicMZURLAw9ETAknD0xnIicMZURMCScMTGdLBUlLBklOAwgyB08CFk8DFlBPAhZQTBZQSwJJFRZXBgJMUEyAAgAiUExQKExQsCNDIkL/UCJC/v02GgFJFSQSRBc2GgJJFSQSRBeIEZdKDEQnHU8CZyceTGcyBxYoTFCwI0M2GgFJFSUSRDYaAkkVJBJEF0lOAiIpZUREJxYxAIgRLkSIEWiIEW0iKWVEgTISRCcISwJQSU4DvUUBREyIC4lJRCInC2VECCInDWVEDkQiJxxlREEACTIHIiccZUQOREcCvkSBKFtLA0lOAwgWgShMuyInC2VECCcLSwFnIicNZURMCRYoTFCwI0MiSTYaAUkVJRJENhoCSRUlEkQ2GgNHAhUkEkQXIillRESIEN6IEOMiKWVEgTISFEQiJx1lREEACSInHWVEMgcORCInHmVEQQAJMgciJx5lRAxEMQBLBElOAhJEJwhLAVBJRQhJvUUBRCcISwVJTgJQSUUJvUUBREsCiArCSYgKvk8CE0RLAUlETL5EJVsORCIqZUQiK2VED0AADiIqZUSIC8+BCVsyBw1ESwNJiAsaSwNJTgKICxKICpVGAogKkEYCSwVJvkQlW0sCSU4CSwEOREsBCRZPAiVPArtLBUm+RCVbTwIIFiVMuyhLAlCwI0M2GgFJFSUSRDYaAkkVIxJEIlMnFTEAiA+7RCcITwJQSb1FAURJgTAjuiJPA1SBMEy7MgcWKExQsCNDNhoBSRUlEkQ2GgJJFSUSRCcXMQCID4NEIillRIHIARIURIgPs4gPuCcITwJQSb1FARREIhZPAksBUEsBUCcoUEsBUEsBUEsBUEsBUExQvzIHFihMULAjQzYaAUkVJRJENhoCSRUlEkQnCEsCUEm9RQFEMQBPAxJEiA9diA9iIk8CuzIHFihMULAjQzYaAUkVJRJEJwhMUEm9RQFEvkgoTFCwI0M2GgFJFSUSRCcSTGcyBxYoTFCwI0OAAEk2GgFHAhWBaxJENhoCSU4CFYFIEkQ2GgNJTgJJFUsBJVlJgSISRE8CTEsCUklOAyJZgSQIEkSIDtkiVUknCksBZ0EAIkkjEkAAHEmBAhJAABVJgQMSQAAOSYEEEkAAB0mBBRJBAYcjRCInCmVMRQJESwRJgSFbSUUIRIE5VUlFCEEAH0sGIxJAABhLBoECEkAAEEsGgQMSQAAISwaBBBJBAUcjREkjE0EACEsEgZIGUxREIillRBREIicUZUQUREsESSNbSXELRQFEJyxLAWdLAYEJW0lPAhJEJxNLAWexMgAyCiKyErIUTLIRgQSyELIBs0mBEVsnDUxnJwsiZycuSwhnSYEpWyccSwFnSwGBMVsnLUsBZ0sGSU4CgTBbJw5MZycUSwpnSwOBkgZTJyJMZ0sBgRBbJwRMZ0sBgShbJwZMZ0sBJVsnCUxnSwGBGFsnB0xnSwOBOlsnI0xnSwOBQlsnJExnSwOBSlsnH0xnSwOBUlsnIExnSwOBWlsnJUxnSwOBkAZTJyZMZ0sDgZEGUycnTGdPA4FjWycFTGdLASRbKkxnSwGBOFsnEExnSwGBQFsnEUxnJw8iZycMImdLAjIHDURMIltLAgxEDERLAlcAICcqTGdLAVcCACcrTGcyBxYoTFCwI0MiQv62IkL+diKAAEcCNhoBSRUkEkQXSTYaAkkVIxJEIlNMNhoDSU4CSSJZSU4DSYFBC4ECCE8CFRJEiAzsIicKZUxOA0QiKWVEFERJgRAORCInFGVEREyBEAtMgWQLIQQIIoj2tiJJSwQMQQCLSwRXAgBJRQxLAUlOAoFBC4FBWEkkVUlOAkUNSSJbSUUNSwVPBAhLARJESwVPA4gIOEyBCVtJRQpEQQAXSUEAJUkjCYFBC0sLTIFBWIEJW0sIDkRLCEAABUsJIxJESSMIRQFC/5RLBklEIwkWJxhMUEm9RQFESSKBAroXSUQjCYFBC4ECCIFBukL/wUsGFicYTFBJvEhLBb9LBUEADEsBSwQIK0xnKYEyZzIHFihMULAjQyIpZUREiAwCiAwJiAwOIiplRCIrZURLAQ1EiAdmSVcIAUmAAQGoREsBVwAISwJXCQhLA1cRCEsEVxkISwVXIQhLBlcpCEsHVzEISwhXOQhPB08IUE8HUE8GUE8FUCIWUE8EUE8DUE8CUExQiAiYRgIyBxYoTFCwI0MiRwSAAEk2GgFJFSQSRBc2GgJHAhWBSRJEIillRESIC3qIC3+BQVtJgQQaQQCwIicKZUSBBRJEiAtXIicKZURJgQUSREsCSSJbSUUHIitlRBJESVcIAUUMJFWIBuEiK2VEgRAKJzFFBxYnGExQSUUJvUUBQQAHSwe+TEUHREsFSSJZSYEQDERLA0lXCQhLAVcRCEsCVxkISwNXKQhLBFcxCE8FVzkISwsWSxJQTwZQTwVQTwRQTwNQTwJQTFBLAxZQTwJMUEwjCBZXBgJcAEsISbxITL8iK2VEIwgrTGciKmVESwNJTwISRIgGHklFCElXCAFFCiRVSUUGIxJAAChLBIEEEkAAIEsEgQwSQAAYSwSBCxJAABBLBIESEkAACEsEgQUSQQBBI0RLCIABAalESwSBDBJAAAhLBIELEkEAJCNBABonGTEAiAoSREsGSwKIBzpGAjIHFihMULAjQ4gKMEL/6CJC/9kiQv+8Ikk2GgFHAhWBQRJEIillRESIChGIChiICh0iKWVEgTISFEQiJwplRIEFEkRJIltJTgIiK2VETEsBEkRLAVcIAUlOA4ABA6hETIE5W0lOAiMaREEAEyIrZUQjCYgFQIEJW0sEgQlbDkQiK2VEgRAKJzFFBhYnGExQSUUHvUUBQQAHSwW+TEUGREsESSJZSYEQDERLBUlXCQhLAVcRCEsCVxkISwNXIQhLBFcpCE8FVzEISwoWSwpQTwZQTwVQTwRQTwNQTwJQTFBLAxZQTwJMUEwjCBZXBgJcAEsGSbxITL8iK2VEIwgrTGcyBxYoTFCwI0M2GgFJFSMSRCJTJxoxAIgI7kQnL0xnMgcWKExQsCNDIillRElEIicKZUQWSZMkDkRXBwEiJw1lRCInC2VEIicUZUQiKmVEIitlRCInBGVEIicHZUQiJwllRCInBmVEIicQZUQiJxFlRCInD2VEIicMZURPDhZPDkxQTw0WUE8MFlBPCxZQTwoWUE8JFlBPCBZQTwcWUE8GFlBPBRZQTwQWUE8DFlBPAhZQTBZQKExQsCNDIillREQiKmVEIitlRA9BACUiKmVEFicoUCIWTEsBUEsBUEsBUEsBUEsBUEsBUExQKExQsCNDIiplRIgDvUL/8IgIPiNDNhoBSRUlEkSICDEnEkxnMgcWKExQsCNDNhoBSRUlEkSICBknG0xnMgcWKExQsCNDNhoBSRUjEkQ2GgJJTgIVJRJENhoDSU4CFYEQEkSIB+yIB/MXRwKIB/2BFBJBAA4nEksDZzIHFihMULAjQ0mBKBJBABEnF0sDUEm9RQEUREsCv0L/30mBMhJBABEnFksDUEm9RQEUREsCv0L/x0mBPBJBABEnGksDUEm9RQEUREsCv0L/r0mBRhJBABEnFUsDUEm9RQEUREsCv0L/l0mBUBJB/5AnGUsDUEm9RQEUREsCv0L/fzYaAUkVIxJENhoCSU4CFSUSRIgHQogHSRdHAogHU0mBFBNEgSgSQQAVJxdLAlBJvUUBRLxIMgcWKExQsCNDSYEyEkEADycWSwJQSb1FAUS8SEL/4UmBPBJBAA8nGksCUEm9RQFEvEhC/8tJgUYSQQAPJxVLAlBJvUUBRLxIQv+1SYFQEkH/ricZSwJQSb1FAUS8SEL/nzYaAUkVIxJEIlMnFTEAiAZ8RCchTGcyBxYoTFCwI0MiJxJlRChMULAjQzYaAUkVJRJEJxdLAYgGVCcWSwKIBk0nGksDiAZGJxVLBIgGPycZTwWIBjgnKCJPBlQjTwVUgQJPBFSBA08DVIEETwJUKExQsCNDNhoBSRUjEkQ2GgJJTgIVJRJEF0mIBlCDBhQoMjxGUE8GjgYATwBAADEAIgATAAEAJxlLAVBJvUUBRL5IKExQsCNDJxVLAVBJvUUBRL5IQv/rJxpLAVBJvUUBRL5IQv/cJxZLAVBJvUUBRL5IQv/NJxdLAVBJvUUBRL5IQv++gBAAAAAAAAAAAAAAAAAAAAAAQv+pigEAJwiL/1C+RIGAA1MURImKAQInCIv/UEm9RQFESb5IIicQZURLAYE5WwkiJxFlREsCgUFbCUsCJVsiJwVlRE8DSwJPAogAmCInBWVETwNPA08CiACKSwKBSVtLAggWTwNMXElJgVFbSwIIFlxRIicQZUQWXDkiJxFlRBZcQSIqZUQWXDFPA0y/iYoBACKAACcIi/9QSb1FAUQiKWVEgTISQQABiYsCvkxJTgKMAESBKFtJjAFAAAGJiwBJJVuLAUlOAwgWXCAiFlwoiwJMvyInC2VESUsCD0RMCScLTGeJigMBi/1BAAWL/kAAAiKJi/2L/h2L/5eJigEBi/9AAAIiiSInDWVESUQiJwVlRIv/TE8CiP/KiYoBAYv/QAACIokiJw1lRCInBWVEi/9MiP+viYoBASIrZUSL/w1Ei/+BEAoWJxhMUEm9RQFEi/+BEBhLASKBAroXSwENRIFBC4ECCIFBuomKAgCL/yMSQAAfi/8kEkAAGIv/gRMSQAAQi/+BDBJAAAiL/4ELEkEAAyNEiYv+QAAEIkL/9Yv+gQMSQAAIi/6BAhJBABiL/4EDEkAACIv/gRISQQAEI0L/0SJC/82L/iMSQQAgi/+BAxJAABCL/4ESEkAACIv/gQUSQQAEI0L/qiJC/6aL/oEEEkEAKIv/gQMSQAAYi/+BBBJAABCL/4ESEkAACIv/gQUSQQAEI0L/eiJC/3aL/oEFEkEACIv/gQMSQv9mIkL/YiInCmVEIxJBAAoiJyJlREEAAiOJIomKAQKL/4ERW0lBABAiJwllREEACCInB2VEQAAGIov/TwKJIicHZUQiJwllRCInBWVEiP5oIicFZUSLAEyI/l2L/08CiYoCAYv/QAADi/6JIicFZUQiJwllRIv/SwKI/jwISUQiJwVlRIv+TE8CiP4siYoCAiKAAEcIi/4iWyIqZUQSRIv+gQlbMgcORIv+JFVJIxJJQQBeIillRIEyEkQiJwtlRCInDWVEEkSL/oExWycESwFnJwdMZ4v+gSFbJwlMZycGImeL/oEpWycOTGciKmVEIwgqTGcpgWRniwtEIicUZUSL/kwiiAHaSYz+i/+MAYwAiSIpZUSBMhIURCInBmVEi/6I/viM/ggnBkxniwqBDBJBAXiL/4EhWyInJGVEIicFZUSI/XMiJyNlRAiMBiInJmVEQQATIicfZUSLBg1BAAgiJx9lTIwGRCInJ2VEQQATIicgZUSLBgxBAAgiJyBlTIwGRCcJiwZniwqBBBJBAQeL/oExWycESwFnJwdMZ4j+ZUEA54sKgQUSQQDFIitlRCIqZUQJgWQLIQQIIojrxCInBWVMjAJEIowBIowHi/6BGVtJjAhBAA+LAosIiP6BSYwCI4wHjAEiKmVEIwiMAyIrZUSLAw1BAFKLA4j9DEmMACRVSYwEgQMSQAAQiwSBExJBADOLAIEZW0EAKyNBAAiLB0EADCKMB4sDIwiMA0L/vosAgRlbiwJMiP4kSYwCiwEIjAFC/+EiQv/SiwFEIicEZUSL/oE5WyQaQAAGIicGZUQIIicFZUSLAYj8SycOTGciKmVEIwgqTGeL/iJJiABgSYz+i/+MAYwAiYv+gSlbJw5MZ0L/2osKgRISQf7/IicEZUQnB0xnQv7ziwqBCxJBABuL/oEhW0mMBUAACCInJWVMjAVEJwmLBWdC/rqL/oEhW0mMCUH+rycJiwlnQv6nigMBMgiL/SJbi/1XCAGL/VcJCDIHi/0kVYv+QABFIxZJkyQORFcHASInE2VEiwFJIwiLABZPAhZQiwJQiwNQiwQWUIv+FlBPA1CL/xZQTwIWUEwWUIAEmjMrlUxQsIv9jACJiwUjEkAACIsFgQQSQQAEI0L/qYH/AUL/o4oCAYAAi/6L/1BJvUUBQQAfiwG+RCJbMgdJjAAOQQAQiwG+RCRbiwAPQQAEI4wAiSJC//kxACInEmVEEkSJIicpZUQURIkiJyFlRBREiYoBAIv/gRQSQAAwi/+BGRJAACiL/4EoEkAAIIv/gTISQAAYi/+BPBJAABCL/4FGEkAACIv/gVASQQADI0SJIkL/+g==", "clear": "DIEBQw==" }, "compilerInfo": { diff --git a/src/artifacts/dasa_client.py b/src/artifacts/dasa_client.py index 58837ffe..54c30e8a 100644 --- a/src/artifacts/dasa_client.py +++ b/src/artifacts/dasa_client.py @@ -19,7 +19,7 @@ import algokit_utils from algokit_utils import AlgorandClient as _AlgoKitAlgorandClient -_APP_SPEC_JSON = r"""{"arcs": [22, 28], "bareActions": {"call": [], "create": []}, "methods": [{"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "desc": "Maximum number of due cash events to process in this call.", "name": "max_event_count"}], "name": "fund_due_cashflows", "returns": {"type": "(uint64,uint64,uint64,uint64,uint64)", "desc": "Funding result with reserved interest, reserved principal, and event count.", "struct": "CashFundingResult"}, "desc": "Reserve due ACTUS cash events into the escrow-style claim ledger.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Holder whose position should be settled and claimed.", "name": "holding_address"}, {"type": "byte[]", "desc": "Opaque settlement context returned in the result.", "name": "payment_info"}], "name": "claim_due_cashflows", "returns": {"type": "(uint64,uint64,uint64,uint64,byte[])", "desc": "Claim result with realized interest, principal, and passthrough context.", "struct": "CashClaimResult"}, "desc": "Withdraw the holder's already funded ACTUS cash entitlements.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "desc": "Inclusive UNIX timestamp at which transfers may start.", "name": "open_date"}, {"type": "uint64", "desc": "Exclusive UNIX timestamp at which transfers stop.", "name": "closure_date"}], "name": "transfer_set_schedule", "returns": {"type": "uint64", "desc": "UNIX timestamp of the schedule update."}, "desc": "Configure the secondary-market transfer window.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account receiving the reserved units.", "name": "holding_address"}, {"type": "uint64", "desc": "Number of units to reserve.", "name": "units"}], "name": "primary_distribution", "returns": {"type": "uint64", "desc": "Remaining undistributed unit balance."}, "desc": "Reserve units for a holder before the initial exchange activates issuance.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account debited for the transfer.", "name": "sender_holding_address"}, {"type": "address", "desc": "Account credited for the transfer.", "name": "receiver_holding_address"}, {"type": "uint64", "desc": "Number of active units to move.", "name": "units"}], "name": "transfer", "returns": {"type": "uint64", "desc": "Number of units transferred."}, "desc": "Transfer active units after settling both counterparties to the current cursor.\nReturns the number of units moved. The ACTUS kernel no longer persists a nominal per-unit value on-chain, so transfer results are unit-based.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account holding address.", "name": "holding_address"}, {"type": "bool", "desc": "Suspension status to apply.", "name": "suspended"}], "name": "account_suspension", "returns": {"type": "uint64", "desc": "UNIX timestamp of the suspension update."}, "desc": "Set the suspension status of one account.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account holding address.", "name": "holding_address"}, {"type": "address", "desc": "Account payment address.", "name": "payment_address"}], "name": "account_open", "returns": {"type": "uint64", "desc": "UNIX timestamp of the account opening."}, "desc": "Open a contract account with a new position and register its payment address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account holding address.", "name": "holding_address"}, {"type": "address", "desc": "New account payment address.", "name": "payment_address"}], "name": "account_update_payment_address", "returns": {"type": "uint64", "desc": "UNIX timestamp of the account update."}, "desc": "Update the payment address of an account.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account holding address.", "name": "holding_address"}], "name": "account_get_position", "returns": {"type": "(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64)", "desc": "Account position record.", "struct": "AccountPosition"}, "desc": "Get the full accounting position for one holder.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": [], "create": ["NoOp"]}, "args": [{"type": "address", "desc": "D-ASA arranger address.", "name": "arranger"}], "name": "contract_create", "returns": {"type": "uint64", "desc": "UNIX timestamp of contract creation."}, "desc": "Create a new D-ASA contract and set the arranger role.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64)", "desc": "Normalized ACTUS terms.", "name": "terms", "struct": "NormalizedActusTerms"}, {"type": "(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "desc": "Initial kernel state captured before `IED`.", "name": "initial_state", "struct": "InitialKernelState"}, {"type": "(byte[32],string)", "desc": "Prospectus metadata stored for reference only.", "name": "prospectus", "struct": "Prospectus"}], "name": "contract_config", "returns": {"type": "uint64", "desc": "UNIX timestamp of contract configuration."}, "desc": "Partial contract configuration with: normalized ACTUS terms, initial kernel\nstate (pre-IED), prospectus (informational only). The contract stays inactive until all schedule pages are configured next.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "desc": "Zero-based page index within the boxed schedule.", "name": "schedule_page_index"}, {"type": "bool", "desc": "Whether this page finalizes the schedule upload.", "name": "is_last_page"}, {"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[]", "desc": "Normalized schedule entries for the requested page.", "name": "schedule_page"}], "name": "contract_schedule", "returns": {"type": "uint64", "desc": "UNIX timestamp of the schedule upload."}, "desc": "Upload one normalized schedule page.\nThe configuration operation is considered complete only when the last page is stored. At that point `schedule_entry_count` is finalized and the contract moves to `STATUS_PENDING_IED`.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "contract_execute_ied", "returns": {"type": "uint64", "desc": "UNIX timestamp of the `IED` execution."}, "desc": "Execute the first due `IED` entry and activate the contract.\n`IED` is the one non-cash event that moves the app from `STATUS_PENDING_IED` to `STATUS_ACTIVE`.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "desc": "Expected global schedule event identifier at the current cursor.", "name": "event_id"}, {"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "desc": "Observed payload used for append-on-execute and/or rate resets.", "name": "payload", "struct": "ObservedEventRequest"}], "name": "apply_non_cash_event", "returns": {"type": "uint64", "desc": "UNIX timestamp of the non-cash event application."}, "desc": "Apply the next due non-cash event, optionally appending one first.\nObserved payloads are appended before execution when flagged. Rate reset events require the interest oracle because they can change the running nominal rate; other non-cash events stay arranger-controlled.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "desc": "Observed cash-event payload to append after the current tail.", "name": "payload", "struct": "ObservedCashEventRequest"}], "name": "append_observed_cash_event", "returns": {"type": "uint64", "desc": "UNIX timestamp of the append operation."}, "desc": "Append an arranger-authorized observed cash event to the schedule tail.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Default status", "name": "defaulted"}], "name": "contract_set_default_status", "returns": {"type": "uint64"}, "desc": "Set D-ASA default status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "contract_get_state", "returns": {"type": "(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "desc": "Current kernel state snapshot.", "struct": "KernelState"}, "desc": "Return a readonly snapshot of the generic ACTUS kernel state.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "contract_get_next_due_event", "returns": {"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "desc": "Next due schedule entry, or an all-zero sentinel if the contract ended.", "struct": "ExecutionScheduleEntry"}, "desc": "Return the next boxed schedule entry, or a zeroed sentinel if ended.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["UpdateApplication"], "create": []}, "args": [], "name": "contract_update", "returns": {"type": "void", "desc": "None."}, "desc": "Update D-ASA application.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "New arranger address.", "name": "new_arranger"}], "name": "rbac_rotate_arranger", "returns": {"type": "uint64", "desc": "UNIX timestamp of the role assignment."}, "desc": "Rotate the arranger address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Operation daemon address.", "name": "address"}], "name": "rbac_set_op_daemon", "returns": {"type": "uint64", "desc": "UNIX timestamp of the role assignment."}, "desc": "Non-normative helper to set the operation daemon address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role identifier.", "name": "role_id"}, {"type": "address", "desc": "Account role address.", "name": "role_address"}, {"type": "(uint64,uint64)", "desc": "Inclusive validity interval for the assignment.", "name": "validity", "struct": "RoleValidity"}], "name": "rbac_assign_role", "returns": {"type": "uint64", "desc": "UNIX timestamp of the role assignment."}, "desc": "Assign a role to an address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role identifier.", "name": "role_id"}, {"type": "address", "desc": "Account role address.", "name": "role_address"}], "name": "rbac_revoke_role", "returns": {"type": "uint64", "desc": "UNIX timestamp of the role revocation."}, "desc": "Revoke a role from an address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Suspension status to apply.", "name": "suspended"}], "name": "rbac_contract_suspension", "returns": {"type": "uint64", "desc": "UNIX timestamp of the suspension update."}, "desc": "Set the asset-wide suspension status.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "rbac_get_arranger", "returns": {"type": "address", "desc": "Current arranger address."}, "desc": "Get the arranger address.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Address to query.", "name": "address"}], "name": "rbac_get_address_roles", "returns": {"type": "(bool,bool,bool,bool,bool)", "desc": "Roles mask in the order: account manager, primary dealer, trustee, authority, observer."}, "desc": "Non-normative helper to get the active roles assigned to an address.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role identifier.", "name": "role_id"}, {"type": "address", "desc": "Account role address.", "name": "role_address"}], "name": "rbac_get_role_validity", "returns": {"type": "(uint64,uint64)", "desc": "Stored role validity interval.", "struct": "RoleValidity"}, "desc": "Get the stored validity interval for a role assignment.", "events": [], "readonly": true, "recommendations": {}}], "name": "DASA", "state": {"keys": {"box": {}, "global": {"arranger": {"key": "UjpBUlIj", "keyType": "AVMBytes", "valueType": "address"}, "op_daemon": {"key": "UjpPUEQj", "keyType": "AVMBytes", "valueType": "address"}, "asset_suspended": {"key": "YXNzZXRfc3VzcGVuZGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "asset_defaulted": {"key": "YXNzZXRfZGVmYXVsdGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "status": {"key": "c3RhdHVz", "keyType": "AVMString", "valueType": "AVMUint64"}, "contract_type": {"key": "Y29udHJhY3RfdHlwZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "prospectus_hash": {"key": "cHJvc3BlY3R1c19oYXNo", "keyType": "AVMString", "valueType": "AVMBytes"}, "prospectus_url": {"key": "cHJvc3BlY3R1c191cmw=", "keyType": "AVMString", "valueType": "AVMString"}, "denomination_asset_id": {"key": "ZGVub21pbmF0aW9uX2Fzc2V0X2lk", "keyType": "AVMString", "valueType": "AVMUint64"}, "settlement_asset_id": {"key": "c2V0dGxlbWVudF9hc3NldF9pZA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "initial_exchange_date": {"key": "aW5pdGlhbF9leGNoYW5nZV9kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "maturity_date": {"key": "bWF0dXJpdHlfZGF0ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "transfer_opening_date": {"key": "dHJhbnNmZXJfb3BlbmluZ19kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "transfer_closure_date": {"key": "dHJhbnNmZXJfY2xvc3VyZV9kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "day_count_convention": {"key": "ZGF5X2NvdW50X2NvbnZlbnRpb24=", "keyType": "AVMString", "valueType": "AVMUint64"}, "total_units": {"key": "dG90YWxfdW5pdHM=", "keyType": "AVMString", "valueType": "AVMUint64"}, "reserved_units_total": {"key": "cmVzZXJ2ZWRfdW5pdHNfdG90YWw=", "keyType": "AVMString", "valueType": "AVMUint64"}, "initial_exchange_amount": {"key": "aW5pdGlhbF9leGNoYW5nZV9hbW91bnQ=", "keyType": "AVMString", "valueType": "AVMUint64"}, "outstanding_principal": {"key": "b3V0c3RhbmRpbmdfcHJpbmNpcGFs", "keyType": "AVMString", "valueType": "AVMUint64"}, "next_principal_redemption": {"key": "bmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbg==", "keyType": "AVMString", "valueType": "AVMUint64"}, "dynamic_principal_redemption": {"key": "ZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbg==", "keyType": "AVMString", "valueType": "AVMUint64"}, "interest_calculation_base": {"key": "aW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "accrued_interest": {"key": "YWNjcnVlZF9pbnRlcmVzdA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "nominal_interest_rate": {"key": "bm9taW5hbF9pbnRlcmVzdF9yYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_spread": {"key": "cmF0ZV9yZXNldF9zcHJlYWQ=", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_multiplier": {"key": "cmF0ZV9yZXNldF9tdWx0aXBsaWVy", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_floor": {"key": "cmF0ZV9yZXNldF9mbG9vcg==", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_cap": {"key": "cmF0ZV9yZXNldF9jYXA=", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_next": {"key": "cmF0ZV9yZXNldF9uZXh0", "keyType": "AVMString", "valueType": "AVMUint64"}, "has_rate_reset_floor": {"key": "aGFzX3JhdGVfcmVzZXRfZmxvb3I=", "keyType": "AVMString", "valueType": "AVMUint64"}, "has_rate_reset_cap": {"key": "aGFzX3JhdGVfcmVzZXRfY2Fw", "keyType": "AVMString", "valueType": "AVMUint64"}, "reserved_principal": {"key": "cmVzZXJ2ZWRfcHJpbmNpcGFs", "keyType": "AVMString", "valueType": "AVMUint64"}, "reserved_interest": {"key": "cmVzZXJ2ZWRfaW50ZXJlc3Q=", "keyType": "AVMString", "valueType": "AVMUint64"}, "cumulative_interest_index": {"key": "Y3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "cumulative_principal_index": {"key": "Y3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXg=", "keyType": "AVMString", "valueType": "AVMUint64"}, "event_cursor": {"key": "ZXZlbnRfY3Vyc29y", "keyType": "AVMString", "valueType": "AVMUint64"}, "schedule_entry_count": {"key": "c2NoZWR1bGVfZW50cnlfY291bnQ=", "keyType": "AVMString", "valueType": "AVMUint64"}, "defaulted": {"key": "ZGVmYXVsdGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "fixed_point_scale": {"key": "Zml4ZWRfcG9pbnRfc2NhbGU=", "keyType": "AVMString", "valueType": "AVMUint64"}}, "local": {}}, "maps": {"box": {"account_manager": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpNTkcj"}, "primary_dealer": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpQWUQj"}, "trustee": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpUUlMj"}, "authority": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpBVVQj"}, "observer": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpNT0Mj"}, "schedule_page": {"keyType": "uint64", "valueType": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[]", "prefix": "UyM="}, "account": {"keyType": "address", "valueType": "AccountPosition", "prefix": "QSM="}}, "global": {}, "local": {}}, "schema": {"global": {"bytes": 4, "ints": 38}, "local": {"bytes": 0, "ints": 0}}}, "structs": {"AccountPosition": [{"name": "payment_address", "type": "address"}, {"name": "units", "type": "uint64"}, {"name": "reserved_units", "type": "uint64"}, {"name": "suspended", "type": "bool"}, {"name": "settled_cursor", "type": "uint64"}, {"name": "interest_checkpoint", "type": "uint64"}, {"name": "principal_checkpoint", "type": "uint64"}, {"name": "claimable_interest", "type": "uint64"}, {"name": "claimable_principal", "type": "uint64"}], "CashClaimResult": [{"name": "interest_amount", "type": "uint64"}, {"name": "principal_amount", "type": "uint64"}, {"name": "total_amount", "type": "uint64"}, {"name": "timestamp", "type": "uint64"}, {"name": "context", "type": "byte[]"}], "CashFundingResult": [{"name": "funded_interest", "type": "uint64"}, {"name": "funded_principal", "type": "uint64"}, {"name": "total_funded", "type": "uint64"}, {"name": "processed_events", "type": "uint64"}, {"name": "timestamp", "type": "uint64"}], "ExecutionScheduleEntry": [{"name": "event_id", "type": "uint64"}, {"name": "event_type", "type": "uint8"}, {"name": "scheduled_time", "type": "uint64"}, {"name": "accrual_factor", "type": "uint64"}, {"name": "redemption_accrual_factor", "type": "uint64"}, {"name": "next_nominal_interest_rate", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "next_outstanding_principal", "type": "uint64"}, {"name": "flags", "type": "uint64"}], "InitialKernelState": [{"name": "status_date", "type": "uint64"}, {"name": "event_cursor", "type": "uint64"}, {"name": "outstanding_principal", "type": "uint64"}, {"name": "interest_calculation_base", "type": "uint64"}, {"name": "nominal_interest_rate", "type": "uint64"}, {"name": "accrued_interest", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "cumulative_interest_index", "type": "uint64"}, {"name": "cumulative_principal_index", "type": "uint64"}], "KernelState": [{"name": "contract_type", "type": "uint8"}, {"name": "status", "type": "uint64"}, {"name": "total_units", "type": "uint64"}, {"name": "reserved_units_total", "type": "uint64"}, {"name": "initial_exchange_amount", "type": "uint64"}, {"name": "event_cursor", "type": "uint64"}, {"name": "schedule_entry_count", "type": "uint64"}, {"name": "outstanding_principal", "type": "uint64"}, {"name": "interest_calculation_base", "type": "uint64"}, {"name": "nominal_interest_rate", "type": "uint64"}, {"name": "accrued_interest", "type": "uint64"}, {"name": "cumulative_interest_index", "type": "uint64"}, {"name": "cumulative_principal_index", "type": "uint64"}, {"name": "reserved_interest", "type": "uint64"}, {"name": "reserved_principal", "type": "uint64"}], "NormalizedActusTerms": [{"name": "contract_type", "type": "uint8"}, {"name": "denomination_asset_id", "type": "uint64"}, {"name": "settlement_asset_id", "type": "uint64"}, {"name": "total_units", "type": "uint64"}, {"name": "notional_principal", "type": "uint64"}, {"name": "initial_exchange_amount", "type": "uint64"}, {"name": "initial_exchange_date", "type": "uint64"}, {"name": "maturity_date", "type": "uint64"}, {"name": "day_count_convention", "type": "uint8"}, {"name": "rate_reset_spread", "type": "uint64"}, {"name": "rate_reset_multiplier", "type": "uint64"}, {"name": "rate_reset_floor", "type": "uint64"}, {"name": "rate_reset_cap", "type": "uint64"}, {"name": "rate_reset_next", "type": "uint64"}, {"name": "has_rate_reset_floor", "type": "bool"}, {"name": "has_rate_reset_cap", "type": "bool"}, {"name": "dynamic_principal_redemption", "type": "bool"}, {"name": "fixed_point_scale", "type": "uint64"}], "ObservedCashEventRequest": [{"name": "event_id", "type": "uint64"}, {"name": "event_type", "type": "uint8"}, {"name": "scheduled_time", "type": "uint64"}, {"name": "accrual_factor", "type": "uint64"}, {"name": "redemption_accrual_factor", "type": "uint64"}, {"name": "next_nominal_interest_rate", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "next_outstanding_principal", "type": "uint64"}, {"name": "flags", "type": "uint64"}], "ObservedEventRequest": [{"name": "event_id", "type": "uint64"}, {"name": "event_type", "type": "uint8"}, {"name": "scheduled_time", "type": "uint64"}, {"name": "accrual_factor", "type": "uint64"}, {"name": "redemption_accrual_factor", "type": "uint64"}, {"name": "observed_rate", "type": "uint64"}, {"name": "next_nominal_interest_rate", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "next_outstanding_principal", "type": "uint64"}, {"name": "flags", "type": "uint64"}], "Prospectus": [{"name": "hash", "type": "byte[32]"}, {"name": "url", "type": "string"}], "RoleValidity": [{"name": "role_validity_start", "type": "uint64"}, {"name": "role_validity_end", "type": "uint64"}]}, "byteCode": {"approval": "DCAFAAEIINwLJjIEFR98dQZzdGF0dXMMZXZlbnRfY3Vyc29yFHNjaGVkdWxlX2VudHJ5X2NvdW50FW91dHN0YW5kaW5nX3ByaW5jaXBhbBFmaXhlZF9wb2ludF9zY2FsZRBhY2NydWVkX2ludGVyZXN0GWludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UCQSMVbm9taW5hbF9pbnRlcmVzdF9yYXRlDWNvbnRyYWN0X3R5cGUUcmVzZXJ2ZWRfdW5pdHNfdG90YWwScmVzZXJ2ZWRfcHJpbmNpcGFsC3RvdGFsX3VuaXRzGW5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24RcmVzZXJ2ZWRfaW50ZXJlc3QZY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleBpjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleAZSOkFSUiMTc2V0dGxlbWVudF9hc3NldF9pZBdpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudAZSOkFVVCMGUjpQWUQjBlI6TU5HIwJTIwZSOk1PQyMGUjpUUlMjBlI6T1BEIxVpbml0aWFsX2V4Y2hhbmdlX2RhdGUVdHJhbnNmZXJfb3BlbmluZ19kYXRlFXRyYW5zZmVyX2Nsb3N1cmVfZGF0ZRByYXRlX3Jlc2V0X2Zsb29yDnJhdGVfcmVzZXRfY2FwD2Fzc2V0X3N1c3BlbmRlZBxkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uEXJhdGVfcmVzZXRfc3ByZWFkFXJhdGVfcmVzZXRfbXVsdGlwbGllcg9yYXRlX3Jlc2V0X25leHQUaGFzX3JhdGVfcmVzZXRfZmxvb3ISaGFzX3JhdGVfcmVzZXRfY2FwAQAPYXNzZXRfZGVmYXVsdGVkD3Byb3NwZWN0dXNfaGFzaA5wcm9zcGVjdHVzX3VybBVkZW5vbWluYXRpb25fYXNzZXRfaWQNbWF0dXJpdHlfZGF0ZRRkYXlfY291bnRfY29udmVudGlvbglkZWZhdWx0ZWQDBoEBAgAAMRhAALEnEjIDZycbMgNnJyEiZycpImcpImcnCiJnJyqAAGcnK4AAZycsImcnEyJnJxwiZyctImcnHSJnJx4iZycuImcnDSJnJwsiZycUImcnBCJnJw4iZyciImcnByJnJwYiZycJImcnIyJnJyQiZycfImcnICJnJyUiZycmImcnJyJnJwwiZycPImcnECJnJxEiZyoiZysiZycvImcnBSJnMTWBBBJEMTSBJhJEMTcURDE2FESABJFPBOs2GgCOAQDOMRkURDEYQQC3ghkEtEYYyATngyUpBJQ4hyMEbIXj7gS90alEBHwPGBIEFPwQ7wR0pyl/BAnU/hQEmpv6hQSF7tM9BKssD8QE2fIlrASYg1BaBPtNRCgEjqbnTAQCr1V6BIL3Gy0E7wT10wTfNDVQBD2+gL0EHj5I5wQBDIKZBHQGrNIEGnKi7jYaAI4ZAFYDIQR9BKcFMQYhBlsGswbmBxQJCAofCpgMBAz2DRUNqA3tDgUOHQ7SD2gPhw+SD9wAgASVbXFWNhoAjgEG8QAxGYEEEjEYEERCDc2KAgCL/oEKCIsAMgwNQQAqsYEGshCBBbIZJzCyHicwsh+L/40CAAsABLNC/9syALIBQv/1IrIBQv/viSKAAEcNNhoBSRUkEkQXIillRESIFb2IFcSIFckiKWVEgTISFESIEiBBAAtJgWQLIQQIIoj/jyJFBSJFDiJFDUsESwEMQQJZIiplRCIrZUQMQQJNIiplRIgQ8klFEYEJW0lFAzIHDUACN0sPJFVJRRAkEklFBEAAEEsOgQMSQAAISw6BExJBAj8jQQIUSw8iWyIqZUQSREsBMgcOREsCQAHtSw6BExJAAeUiRQtLDyRVSUUQgQMSQAFlSw6BExJAAV0iRQZLD4ExW0UIiBF6QAD+SwdFCUsKiBA4SwaIEDNLAYgQTUlOAkUPSYgQRElFC0sCSwEISUUJMgoiJxNlRHAARCInD2VEIicMZURLAQhLAksBD0RPAkwJTwIPRE8DCCcPTGciJwxlRAgnDExnIicQZURPAggnEExnIicRZUQIJxFMZ0sPJFWBAxJBAHoiJwZlREsQiBEGRRIIJwZMZ4gQ5kEACksPJFWBExJBAAlLD4EpWycOTGcnBEsIZycHSwlnIiplRCMIKkxnSw9XCAGAAROoQQARIicEZURAAAkpgcgBZycHImdLD0sESYgTc0hLDUsMCEUOSwxLBwhFDUsEIwhFBUL+dycGImdC/5BLDyRVSUUQgQMSQQAQIicEZURLBglJRQlFCUL+6UsOJBJBABMiJwRlTEUJRCInB2VMRQpEQv7PSw6BExJAAAdLB0UJQv7AIkUIIkUJQv63iBAnQQBWSw6BExJBAAoiJwRlREUGQv6OIicGZURLEIgQHkUSCElFCyInDmVED0EABiJFBkL+byInDmVESwoJSUUIIicEZUQNQQAKIicEZURFBkL+UUsGRQZC/kpLD4ExWyInBGVESg5ETAlFBkL+NiInBmVESxCID8ZFEghFC0L+DEsESURLDklLD0lOAwgyB08CFk8DFlBPAhZQTwIWUEwWUChMULAjQyJC/b6AAEcCNhoBRwIVJRJENhoCSSJZgQIISwEVEkRXAgBMIillREQnCExQSb1FAUQiJxtlRDIDE0EAIjEAIicbZUQSQAAVMQBLAxJAAA0xAEsBvkRXACASQQEAI0SIErWIEroiKWVEgTISFERLAkmIDWqIDO1GAkm+REmBSVtJTgJFCEmBUVtJRQhPAghJRQZEVwAgIicTZURwAEUBQQC3Sb5EgYADU0AArSNBAHgyCiInE2VETEsBcABESwVJTgIPREsCSU4DvkRJVwAgsTIATwOyEkyyFE8CshGBBLIQsgGzSYFJW0lOAkUJSYFRW0lOA0UJIhZMSwFcSUxcUU8DTL8iJw9lRElLAg9EIicMZURLAw9ETAknD0xnIicMZURMCScMTGdLBUlLBklOAwgyB08CFk8DFlBPAhZQTBZQSwJJFRZXBgJMUEyAAgAiUExQKExQsCNDIkL/UCJC/v02GgFJFSQSRBc2GgJJFSQSRBeIEZdKDEQnHU8CZyceTGcyBxYoTFCwI0M2GgFJFSUSRDYaAkkVJBJEF0lOAiIpZUREJxYxAIgRLkSIEWiIEW0iKWVEgTISRCcISwJQSU4DvUUBREyIC4lJRCInC2VECCInDWVEDkQiJxxlREEACTIHIiccZUQOREcCvkSBKFtLA0lOAwgWgShMuyInC2VECCcLSwFnIicNZURMCRYoTFCwI0MiSTYaAUkVJRJENhoCSRUlEkQ2GgNHAhUkEkQXIillRESIEN6IEOMiKWVEgTISFEQiJx1lREEACSInHWVEMgcORCInHmVEQQAJMgciJx5lRAxEMQBLBElOAhJEJwhLAVBJRQhJvUUBRCcISwVJTgJQSUUJvUUBREsCiArCSYgKvk8CE0RLAUlETL5EJVsORCIqZUQiK2VED0AADiIqZUSIC8+BCVsyBw1ESwNJiAsaSwNJTgKICxKICpVGAogKkEYCSwVJvkQlW0sCSU4CSwEOREsBCRZPAiVPArtLBUm+RCVbTwIIFiVMuyhLAlCwI0M2GgFJFSUSRDYaAkkVIxJEIlMnFTEAiA+7RCcITwJQSb1FAURJgTAjuiJPA1SBMEy7MgcWKExQsCNDNhoBSRUlEkQ2GgJJFSUSRCcXMQCID4NEIillRIHIARIURIgPs4gPuCcITwJQSb1FARREIhZPAksBUEsBUCcoUEsBUEsBUEsBUEsBUExQvzIHFihMULAjQzYaAUkVJRJENhoCSRUlEkQnCEsCUEm9RQFEMQBPAxJEiA9diA9iIk8CuzIHFihMULAjQzYaAUkVJRJEJwhMUEm9RQFEvkgoTFCwI0M2GgFJFSUSRCcSTGcyBxYoTFCwI0OAAEk2GgFHAhWBaxJENhoCSU4CFYFIEkQ2GgNJTgJJFUsBJVlJgSISRE8CTEsCUklOAyJZgSQIEkSIDtkiVUknCksBZ0EAIkkjEkAAHEmBAhJAABVJgQMSQAAOSYEEEkAAB0mBBRJBAYcjRCInCmVMRQJESwRJgSFbSUUIRIE5VUlFCEEAH0sGIxJAABhLBoECEkAAEEsGgQMSQAAISwaBBBJBAUcjREkjE0EACEsEgZIGUxREIillRBREIicUZUQUREsESSNbSXELRQFEJyxLAWdLAYEJW0lPAhJEJxNLAWexMgAyCiKyErIUTLIRgQSyELIBs0mBEVsnDUxnJwsiZycuSwhnSYEpWyccSwFnSwGBMVsnLUsBZ0sGSU4CgTBbJw5MZycUSwpnSwOBkgZTJyJMZ0sBgRBbJwRMZ0sBgShbJwZMZ0sBJVsnCUxnSwGBGFsnB0xnSwOBOlsnI0xnSwOBQlsnJExnSwOBSlsnH0xnSwOBUlsnIExnSwOBWlsnJUxnSwOBkAZTJyZMZ0sDgZEGUycnTGdPA4FjWycFTGdLASRbKkxnSwGBOFsnEExnSwGBQFsnEUxnJw8iZycMImdLAjIHDURMIltLAgxEDERLAlcAICcqTGdLAVcCACcrTGcyBxYoTFCwI0MiQv62IkL+diKAAEcCNhoBSRUkEkQXSTYaAkkVIxJEIlNMNhoDSU4CSSJZSU4DSYFBC4ECCE8CFRJEiAzsIicKZUxOA0QiKWVEFERJgRAORCInFGVEREyBEAtMgWQLIQQIIoj2tiJJSwQMQQCLSwRXAgBJRQxLAUlOAoFBC4FBWEkkVUlOAkUNSSJbSUUNSwVPBAhLARJESwVPA4gIOEyBCVtJRQpEQQAXSUEAJUkjCYFBC0sLTIFBWIEJW0sIDkRLCEAABUsJIxJESSMIRQFC/5RLBklEIwkWJxhMUEm9RQFESSKBAroXSUQjCYFBC4ECCIFBukL/wUsGFicYTFBJvEhLBb9LBUEADEsBSwQIK0xnKYEyZzIHFihMULAjQyIpZUREiAwCiAwJiAwOIiplRCIrZURLAQ1EiAdmSVcIAUmAAQGoREsBVwAISwJXCQhLA1cRCEsEVxkISwVXIQhLBlcpCEsHVzEISwhXOQhPB08IUE8HUE8GUE8FUCIWUE8EUE8DUE8CUExQiAiYRgIyBxYoTFCwI0MiRwSAAEk2GgFJFSQSRBc2GgJHAhWBSRJEIillRESIC3qIC3+BQVtJgQQaQQCwIicKZUSBBRJEiAtXIicKZURJgQUSREsCSSJbSUUHIitlRBJESVcIAUUMJFWIBuEiK2VEgRAKJzFFBxYnGExQSUUJvUUBQQAHSwe+TEUHREsFSSJZSYEQDERLA0lXCQhLAVcRCEsCVxkISwNXKQhLBFcxCE8FVzkISwsWSxJQTwZQTwVQTwRQTwNQTwJQTFBLAxZQTwJMUEwjCBZXBgJcAEsISbxITL8iK2VEIwgrTGciKmVESwNJTwISRIgGHklFCElXCAFFCiRVSUUGIxJAAChLBIEEEkAAIEsEgQwSQAAYSwSBCxJAABBLBIESEkAACEsEgQUSQQBBI0RLCIABAalESwSBDBJAAAhLBIELEkEAJCNBABonGTEAiAoSREsGSwKIBzpGAjIHFihMULAjQ4gKMEL/6CJC/9kiQv+8Ikk2GgFHAhWBQRJEIillRESIChGIChiICh0iKWVEgTISFEQiJwplRIEFEkRJIltJTgIiK2VETEsBEkRLAVcIAUlOA4ABA6hETIE5W0lOAiMaREEAEyIrZUQjCYgFQIEJW0sEgQlbDkQiK2VEgRAKJzFFBhYnGExQSUUHvUUBQQAHSwW+TEUGREsESSJZSYEQDERLBUlXCQhLAVcRCEsCVxkISwNXIQhLBFcpCE8FVzEISwoWSwpQTwZQTwVQTwRQTwNQTwJQTFBLAxZQTwJMUEwjCBZXBgJcAEsGSbxITL8iK2VEIwgrTGcyBxYoTFCwI0M2GgFJFSMSRCJTJxoxAIgI7kQnL0xnMgcWKExQsCNDIillRElEIicKZUQWSZMkDkRXBwEiJw1lRCInC2VEIicUZUQiKmVEIitlRCInBGVEIicHZUQiJwllRCInBmVEIicQZUQiJxFlRCInD2VEIicMZURPDhZPDkxQTw0WUE8MFlBPCxZQTwoWUE8JFlBPCBZQTwcWUE8GFlBPBRZQTwQWUE8DFlBPAhZQTBZQKExQsCNDIillREQiKmVEIitlRA9BACUiKmVEFicoUCIWTEsBUEsBUEsBUEsBUEsBUEsBUExQKExQsCNDIiplRIgDvUL/8IgIPiNDNhoBSRUlEkSICDEnEkxnMgcWKExQsCNDNhoBSRUlEkSICBknG0xnMgcWKExQsCNDNhoBSRUjEkQ2GgJJTgIVJRJENhoDSU4CFYEQEkSIB+yIB/MXRwKIB/2BFBJBAA4nEksDZzIHFihMULAjQ0mBKBJBABEnF0sDUEm9RQEUREsCv0L/30mBMhJBABEnFksDUEm9RQEUREsCv0L/x0mBPBJBABEnGksDUEm9RQEUREsCv0L/r0mBRhJBABEnFUsDUEm9RQEUREsCv0L/l0mBUBJB/5AnGUsDUEm9RQEUREsCv0L/fzYaAUkVIxJENhoCSU4CFSUSRIgHQogHSRdHAogHU0mBFBNEgSgSQQAVJxdLAlBJvUUBRLxIMgcWKExQsCNDSYEyEkEADycWSwJQSb1FAUS8SEL/4UmBPBJBAA8nGksCUEm9RQFEvEhC/8tJgUYSQQAPJxVLAlBJvUUBRLxIQv+1SYFQEkH/ricZSwJQSb1FAUS8SEL/nzYaAUkVIxJEIlMnFTEAiAZ8RCchTGcyBxYoTFCwI0MiJxJlRChMULAjQzYaAUkVJRJEJxdLAYgGVCcWSwKIBk0nGksDiAZGJxVLBIgGPycZTwWIBjgnKCJPBlQjTwVUgQJPBFSBA08DVIEETwJUKExQsCNDNhoBSRUjEkQ2GgJJTgIVJRJEF0mIBlCDBhQoMjxGUE8GjgYATwBAADEAIgATAAEAJxlLAVBJvUUBRL5IKExQsCNDJxVLAVBJvUUBRL5IQv/rJxpLAVBJvUUBRL5IQv/cJxZLAVBJvUUBRL5IQv/NJxdLAVBJvUUBRL5IQv++gBAAAAAAAAAAAAAAAAAAAAAAQv+pigEAJwiL/1C+RIGAA1MURImKAQInCIv/UEm9RQFESb5IIicQZURLAYE5WwkiJxFlREsCgUFbCUsCJVsiJwVlRE8DSwJPAogAmCInBWVETwNPA08CiACKSwKBSVtLAggWTwNMXElJgVFbSwIIFlxRIicQZUQWXDkiJxFlRBZcQSIqZUQWXDFPA0y/iYoBACKAACcIi/9QSb1FAUQiKWVEgTISQQABiYsCvkxJTgKMAESBKFtJjAFAAAGJiwBJJVuLAUlOAwgWXCAiFlwoiwJMvyInC2VESUsCD0RMCScLTGeJigMBi/1BAAWL/kAAAiKJi/2L/h2L/5eJigEBi/9AAAIiiSInDWVESUQiJwVlRIv/TE8CiP/KiYoBAYv/QAACIokiJw1lRCInBWVEi/9MiP+viYoBASIrZUSL/w1Ei/+BEAoWJxhMUEm9RQFEi/+BEBhLASKBAroXSwENRIFBC4ECCIFBuomKAgCL/yMSQAAfi/8kEkAAGIv/gRMSQAAQi/+BDBJAAAiL/4ELEkEAAyNEiYv+QAAEIkL/9Yv+gQMSQAAIi/6BAhJBABiL/4EDEkAACIv/gRISQQAEI0L/0SJC/82L/iMSQQAgi/+BAxJAABCL/4ESEkAACIv/gQUSQQAEI0L/qiJC/6aL/oEEEkEAKIv/gQMSQAAYi/+BBBJAABCL/4ESEkAACIv/gQUSQQAEI0L/eiJC/3aL/oEFEkEACIv/gQMSQv9mIkL/YiInCmVEIxJBAAoiJyJlREEAAiOJIomKAQKL/4ERW0lBABAiJwllREEACCInB2VEQAAGIov/TwKJIicHZUQiJwllRCInBWVEiP5oIicFZUSLAEyI/l2L/08CiYoCAYv/QAADi/6JIicFZUQiJwllRIv/SwKI/jwISUQiJwVlRIv+TE8CiP4siYoCAiKAAEcIi/4iWyIqZUQSRIv+gQlbMgcORIv+JFVJIxJJQQBeIillRIEyEkQiJwtlRCInDWVEEkSL/oExWycESwFnJwdMZ4v+gSFbJwlMZycGImeL/oEpWycOTGciKmVEIwgqTGcpgWRniwtEIicUZUSL/kwiiAHaSYz+i/+MAYwAiSIpZUSBMhIURCInBmVEi/6I/viM/ggnBkxniwqBDBJBAXiL/4EhWyInJGVEIicFZUSI/XMiJyNlRAiMBiInJmVEQQATIicfZUSLBg1BAAgiJx9lTIwGRCInJ2VEQQATIicgZUSLBgxBAAgiJyBlTIwGRCcJiwZniwqBBBJBAQeL/oExWycESwFnJwdMZ4j+ZUEA54sKgQUSQQDFIitlRCIqZUQJgWQLIQQIIojrxCInBWVMjAJEIowBIowHi/6BGVtJjAhBAA+LAosIiP6BSYwCI4wHjAEiKmVEIwiMAyIrZUSLAw1BAFKLA4j9DEmMACRVSYwEgQMSQAAQiwSBExJBADOLAIEZW0EAKyNBAAiLB0EADCKMB4sDIwiMA0L/vosAgRlbiwJMiP4kSYwCiwEIjAFC/+EiQv/SiwFEIicEZUSL/oE5WyQaQAAGIicGZUQIIicFZUSLAYj8SycOTGciKmVEIwgqTGeL/iJJiABgSYz+i/+MAYwAiYv+gSlbJw5MZ0L/2osKgRISQf7/IicEZUQnB0xnQv7ziwqBCxJBABuL/oEhW0mMBUAACCInJWVMjAVEJwmLBWdC/rqL/oEhW0mMCUH+rycJiwlnQv6nigMBMgiL/SJbi/1XCAGL/VcJCDIHi/0kVYv+QABFIxZJkyQORFcHASInE2VEiwFJIwiLABZPAhZQiwJQiwNQiwQWUIv+FlBPA1CL/xZQTwIWUEwWUIAEmjMrlUxQsIv9jACJiwUjEkAACIsFgQQSQQAEI0L/qYH/AUL/o4oCAYAAi/6L/1BJvUUBQQAfiwG+RCJbMgdJjAAOQQAQiwG+RCRbiwAPQQAEI4wAiSJC//kxACInEmVEEkSJIicpZUQURIkiJyFlRBREiYoBAIv/gRQSQAAwi/+BGRJAACiL/4EoEkAAIIv/gTISQAAYi/+BPBJAABCL/4FGEkAACIv/gVASQQADI0SJIkL/+g==", "clear": "DIEBQw=="}, "desc": "Debt Algorand Standard Application.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "networks": {}, "source": {"approval": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCAzMiAxNTAwCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUgInN0YXR1cyIgImV2ZW50X2N1cnNvciIgInNjaGVkdWxlX2VudHJ5X2NvdW50IiAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIiAiZml4ZWRfcG9pbnRfc2NhbGUiICJhY2NydWVkX2ludGVyZXN0IiAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIgMHg0MTIzICJub21pbmFsX2ludGVyZXN0X3JhdGUiICJjb250cmFjdF90eXBlIiAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiICJyZXNlcnZlZF9wcmluY2lwYWwiICJ0b3RhbF91bml0cyIgIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iICJyZXNlcnZlZF9pbnRlcmVzdCIgImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIgMHg1MjNhNDE1MjUyMjMgInNldHRsZW1lbnRfYXNzZXRfaWQiICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIgMHg1MjNhNDE1NTU0MjMgMHg1MjNhNTA1OTQ0MjMgMHg1MjNhNGQ0ZTQ3MjMgMHg1MzIzIDB4NTIzYTRkNGY0MzIzIDB4NTIzYTU0NTI1MzIzIDB4NTIzYTRmNTA0NDIzICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiICJ0cmFuc2Zlcl9vcGVuaW5nX2RhdGUiICJ0cmFuc2Zlcl9jbG9zdXJlX2RhdGUiICJyYXRlX3Jlc2V0X2Zsb29yIiAicmF0ZV9yZXNldF9jYXAiICJhc3NldF9zdXNwZW5kZWQiICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIiAicmF0ZV9yZXNldF9zcHJlYWQiICJyYXRlX3Jlc2V0X211bHRpcGxpZXIiICJyYXRlX3Jlc2V0X25leHQiICJoYXNfcmF0ZV9yZXNldF9mbG9vciIgImhhc19yYXRlX3Jlc2V0X2NhcCIgMHgwMCAiYXNzZXRfZGVmYXVsdGVkIiAicHJvc3BlY3R1c19oYXNoIiAicHJvc3BlY3R1c191cmwiICJkZW5vbWluYXRpb25fYXNzZXRfaWQiICJtYXR1cml0eV9kYXRlIiAiZGF5X2NvdW50X2NvbnZlbnRpb24iICJkZWZhdWx0ZWQiIDB4MDY4MTAxIDB4MDAwMAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4LTI5CiAgICAvLyAjIFJCQUMgUm9sZXMKICAgIC8vIHNlbGYuYXJyYW5nZXIgPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX0FSUkFOR0VSKQogICAgYnl0ZWMgMTggLy8gMHg1MjNhNDE1MjUyMjMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMAogICAgLy8gc2VsZi5vcF9kYWVtb24gPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX09QX0RBRU1PTikKICAgIGJ5dGVjIDI3IC8vIDB4NTIzYTRmNTA0NDIzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NDctNDgKICAgIC8vICMgRC1BU0EgR292ZXJuYW5jZQogICAgLy8gc2VsZi5hc3NldF9zdXNwZW5kZWQgPSBGYWxzZQogICAgYnl0ZWMgMzMgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjQ5CiAgICAvLyBzZWxmLmFzc2V0X2RlZmF1bHRlZCA9IEZhbHNlCiAgICBieXRlYyA0MSAvLyAiYXNzZXRfZGVmYXVsdGVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1Ni01NwogICAgLy8gIyBDb250cmFjdAogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKQogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OAogICAgLy8gc2VsZi5jb250cmFjdF90eXBlID0gVUludDY0KCkKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MC02MQogICAgLy8gIyBQcm9zcGVjdHVzIChJbmZvcm1hdGlvbmFsKQogICAgLy8gc2VsZi5wcm9zcGVjdHVzX2hhc2ggPSBCeXRlcygpCiAgICBieXRlYyA0MiAvLyAicHJvc3BlY3R1c19oYXNoIgogICAgcHVzaGJ5dGVzIDB4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjIKICAgIC8vIHNlbGYucHJvc3BlY3R1c191cmwgPSBTdHJpbmcoKQogICAgYnl0ZWMgNDMgLy8gInByb3NwZWN0dXNfdXJsIgogICAgcHVzaGJ5dGVzICIiCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjQtNjUKICAgIC8vICMgRGVub21pbmF0aW9uCiAgICAvLyBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCA9IEFzc2V0KCkKICAgIGJ5dGVjIDQ0IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBBc3NldCgpCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjgtNjkKICAgIC8vICMgVGltZQogICAgLy8gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGUgPSB0eXAuVGltZVN0YW1wKCkKICAgIGJ5dGVjIDI4IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcwCiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSB0eXAuVGltZVN0YW1wKCkKICAgIGJ5dGVjIDQ1IC8vICJtYXR1cml0eV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MQogICAgLy8gc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgPSB0eXAuVGltZVN0YW1wKCkKICAgIGJ5dGVjIDI5IC8vICJ0cmFuc2Zlcl9vcGVuaW5nX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcyCiAgICAvLyBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgMzAgLy8gInRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzQtNzUKICAgIC8vICMgRGF5IENvdW50IENvbnZlbnRpb24KICAgIC8vIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPSBVSW50NjQoKQogICAgYnl0ZWMgNDYgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3Ny03OAogICAgLy8gIyBVbml0cwogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IFVJbnQ2NCgpCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc5CiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID0gVUludDY0KCkKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODEtODIKICAgIC8vICMgUHJpbmNpcGFsCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID0gVUludDY0KCkKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODMKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gVUludDY0KCkKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODUKICAgIC8vIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiA9IEZhbHNlCiAgICBieXRlYyAzNCAvLyAiZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODctODgKICAgIC8vICMgSW50ZXJlc3QKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OQogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ID0gVUludDY0KCkKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkxLTkyCiAgICAvLyAjIEludGVyZXN0IFJhdGVzCiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzCiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkID0gVUludDY0KCkKICAgIGJ5dGVjIDM1IC8vICJyYXRlX3Jlc2V0X3NwcmVhZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9tdWx0aXBsaWVyID0gVUludDY0KCkKICAgIGJ5dGVjIDM2IC8vICJyYXRlX3Jlc2V0X211bHRpcGxpZXIiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfZmxvb3IgPSBVSW50NjQoKQogICAgYnl0ZWMgMzEgLy8gInJhdGVfcmVzZXRfZmxvb3IiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfY2FwID0gVUludDY0KCkKICAgIGJ5dGVjIDMyIC8vICJyYXRlX3Jlc2V0X2NhcCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTcKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9uZXh0ID0gVUludDY0KCkKICAgIGJ5dGVjIDM3IC8vICJyYXRlX3Jlc2V0X25leHQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4CiAgICAvLyBzZWxmLmhhc19yYXRlX3Jlc2V0X2Zsb29yID0gRmFsc2UKICAgIGJ5dGVjIDM4IC8vICJoYXNfcmF0ZV9yZXNldF9mbG9vciIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTkKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwID0gRmFsc2UKICAgIGJ5dGVjIDM5IC8vICJoYXNfcmF0ZV9yZXNldF9jYXAiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMS0xMDIKICAgIC8vICMgUHJpbWFyeSBEaXN0cmlidXRpb24KICAgIC8vIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsID0gVUludDY0KCkKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMwogICAgLy8gc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNS0xMDYKICAgIC8vICMgQ3VtdWxhdGl2ZSBQZXItVW5pdCBGaXhlZC1Qb2ludCBJbmRleGVzCiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggPSBVSW50NjQoKQogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNwogICAgLy8gc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNQogICAgLy8gc2VsZi5ldmVudF9jdXJzb3IgPSBVSW50NjQoKQogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTYKICAgIC8vIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgPSBVSW50NjQoKQogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExOC0xMTkKICAgIC8vICMgUGVyZm9ybWFuY2UKICAgIC8vIHNlbGYuZGVmYXVsdGVkID0gRmFsc2UKICAgIGJ5dGVjIDQ3IC8vICJkZWZhdWx0ZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMS0xMjIKICAgIC8vICMgU2NhbGluZwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjIzCiAgICAvLyBhc3NlcnQgVHhuLmdsb2JhbF9udW1fYnl0ZV9zbGljZSA9PSBjZmcuR0xPQkFMX0JZVEVTLCBlcnIuV1JPTkdfR0xPQkFMX0JZVEVTCiAgICB0eG4gR2xvYmFsTnVtQnl0ZVNsaWNlCiAgICBwdXNoaW50IDQKICAgID09CiAgICBhc3NlcnQgLy8gV3JvbmcgR2xvYmFsIEJ5dGVzIGFsbG9jYXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kX2FzYS9jb250cmFjdC5weToyNAogICAgLy8gYXNzZXJ0IFR4bi5nbG9iYWxfbnVtX3VpbnQgPT0gY2ZnLkdMT0JBTF9VSU5UUywgZXJyLldST05HX0dMT0JBTF9VSU5UUwogICAgdHhuIEdsb2JhbE51bVVpbnQKICAgIHB1c2hpbnQgMzgKICAgID09CiAgICBhc3NlcnQgLy8gV3JvbmcgR2xvYmFsIFVJbnRzIGFsbG9jYXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kX2FzYS9jb250cmFjdC5weToyNQogICAgLy8gYXNzZXJ0IFR4bi5sb2NhbF9udW1fYnl0ZV9zbGljZSA9PSBjZmcuTE9DQUxfQllURVMsIGVyci5XUk9OR19MT0NBTF9CWVRFUwogICAgdHhuIExvY2FsTnVtQnl0ZVNsaWNlCiAgICAhCiAgICBhc3NlcnQgLy8gV3JvbmcgTG9jYWwgQnl0ZXMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBhc3NlcnQgVHhuLmxvY2FsX251bV91aW50ID09IGNmZy5MT0NBTF9VSU5UUywgZXJyLldST05HX0xPQ0FMX1VJTlRTCiAgICB0eG4gTG9jYWxOdW1VaW50CiAgICAhCiAgICBhc3NlcnQgLy8gV3JvbmcgTG9jYWwgVUludHMgYWxsb2NhdGlvbgoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6OC0xOAogICAgLy8gY2xhc3MgREFTQSgKICAgIC8vICAgICBQYXltZW50QWdlbnQsCiAgICAvLyAgICAgVHJhbnNmZXJBZ2VudCwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBhdm1fdmVyc2lvbj0xMiwKICAgIC8vICk6CiAgICBwdXNoYnl0ZXMgMHg5MTRmMDRlYiAvLyBtZXRob2QgImNvbnRyYWN0X3VwZGF0ZSgpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fY29udHJhY3RfdXBkYXRlX3JvdXRlQDQKCm1haW5fc3dpdGNoX2Nhc2VfbmV4dEA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjgtMTgKICAgIC8vIGNsYXNzIERBU0EoCiAgICAvLyAgICAgUGF5bWVudEFnZW50LAogICAgLy8gICAgIFRyYW5zZmVyQWdlbnQsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyAgICAgYXZtX3ZlcnNpb249MTIsCiAgICAvLyApOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYnogbWFpbl9jcmVhdGVfTm9PcEAzMwogICAgcHVzaGJ5dGVzcyAweGI0NDYxOGM4IDB4ZTc4MzI1MjkgMHg5NDM4ODcyMyAweDZjODVlM2VlIDB4YmRkMWE5NDQgMHg3YzBmMTgxMiAweDE0ZmMxMGVmIDB4NzRhNzI5N2YgMHgwOWQ0ZmUxNCAweDlhOWJmYTg1IDB4ODVlZWQzM2QgMHhhYjJjMGZjNCAweGQ5ZjIyNWFjIDB4OTg4MzUwNWEgMHhmYjRkNDQyOCAweDhlYTZlNzRjIDB4MDJhZjU1N2EgMHg4MmY3MWIyZCAweGVmMDRmNWQzIDB4ZGYzNDM1NTAgMHgzZGJlODBiZCAweDFlM2U0OGU3IDB4MDEwYzgyOTkgMHg3NDA2YWNkMiAweDFhNzJhMmVlIC8vIG1ldGhvZCAiZnVuZF9kdWVfY2FzaGZsb3dzKHVpbnQ2NCkodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImNsYWltX2R1ZV9jYXNoZmxvd3MoYWRkcmVzcyxieXRlW10pKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxieXRlW10pIiwgbWV0aG9kICJ0cmFuc2Zlcl9zZXRfc2NoZWR1bGUodWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInByaW1hcnlfZGlzdHJpYnV0aW9uKGFkZHJlc3MsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidHJhbnNmZXIoYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgImFjY291bnRfc3VzcGVuc2lvbihhZGRyZXNzLGJvb2wpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X29wZW4oYWRkcmVzcyxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAiYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzKGFkZHJlc3MsYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgImFjY291bnRfZ2V0X3Bvc2l0aW9uKGFkZHJlc3MpKGFkZHJlc3MsdWludDY0LHVpbnQ2NCxib29sLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJjb250cmFjdF9jb25maWcoKHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LGJvb2wsYm9vbCxib29sLHVpbnQ2NCksKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSwoYnl0ZVszMl0sc3RyaW5nKSl1aW50NjQiLCBtZXRob2QgImNvbnRyYWN0X3NjaGVkdWxlKHVpbnQ2NCxib29sLCh1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KVtdKXVpbnQ2NCIsIG1ldGhvZCAiY29udHJhY3RfZXhlY3V0ZV9pZWQoKXVpbnQ2NCIsIG1ldGhvZCAiYXBwbHlfbm9uX2Nhc2hfZXZlbnQodWludDY0LCh1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkpdWludDY0IiwgbWV0aG9kICJhcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudCgodWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkpdWludDY0IiwgbWV0aG9kICJjb250cmFjdF9zZXRfZGVmYXVsdF9zdGF0dXMoYm9vbCl1aW50NjQiLCBtZXRob2QgImNvbnRyYWN0X2dldF9zdGF0ZSgpKHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJjb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnQoKSh1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAicmJhY19yb3RhdGVfYXJyYW5nZXIoYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgInJiYWNfc2V0X29wX2RhZW1vbihhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19hc3NpZ25fcm9sZSh1aW50OCxhZGRyZXNzLCh1aW50NjQsdWludDY0KSl1aW50NjQiLCBtZXRob2QgInJiYWNfcmV2b2tlX3JvbGUodWludDgsYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgInJiYWNfY29udHJhY3Rfc3VzcGVuc2lvbihib29sKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19nZXRfYXJyYW5nZXIoKWFkZHJlc3MiLCBtZXRob2QgInJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXMoYWRkcmVzcykoYm9vbCxib29sLGJvb2wsYm9vbCxib29sKSIsIG1ldGhvZCAicmJhY19nZXRfcm9sZV92YWxpZGl0eSh1aW50OCxhZGRyZXNzKSh1aW50NjQsdWludDY0KSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIGZ1bmRfZHVlX2Nhc2hmbG93cyBjbGFpbV9kdWVfY2FzaGZsb3dzIHRyYW5zZmVyX3NldF9zY2hlZHVsZSBwcmltYXJ5X2Rpc3RyaWJ1dGlvbiB0cmFuc2ZlciBhY2NvdW50X3N1c3BlbnNpb24gYWNjb3VudF9vcGVuIGFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzcyBhY2NvdW50X2dldF9wb3NpdGlvbiBjb250cmFjdF9jb25maWcgY29udHJhY3Rfc2NoZWR1bGUgY29udHJhY3RfZXhlY3V0ZV9pZWQgYXBwbHlfbm9uX2Nhc2hfZXZlbnQgYXBwZW5kX29ic2VydmVkX2Nhc2hfZXZlbnQgY29udHJhY3Rfc2V0X2RlZmF1bHRfc3RhdHVzIGNvbnRyYWN0X2dldF9zdGF0ZSBjb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnQgcmJhY19yb3RhdGVfYXJyYW5nZXIgcmJhY19zZXRfb3BfZGFlbW9uIHJiYWNfYXNzaWduX3JvbGUgcmJhY19yZXZva2Vfcm9sZSByYmFjX2NvbnRyYWN0X3N1c3BlbnNpb24gcmJhY19nZXRfYXJyYW5nZXIgcmJhY19nZXRfYWRkcmVzc19yb2xlcyByYmFjX2dldF9yb2xlX3ZhbGlkaXR5CiAgICBlcnIKCm1haW5fY3JlYXRlX05vT3BAMzM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6OC0xOAogICAgLy8gY2xhc3MgREFTQSgKICAgIC8vICAgICBQYXltZW50QWdlbnQsCiAgICAvLyAgICAgVHJhbnNmZXJBZ2VudCwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBhdm1fdmVyc2lvbj0xMiwKICAgIC8vICk6CiAgICBwdXNoYnl0ZXMgMHg5NTZkNzE1NiAvLyBtZXRob2QgImNvbnRyYWN0X2NyZWF0ZShhZGRyZXNzKXVpbnQ2NCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIGNvbnRyYWN0X2NyZWF0ZQogICAgZXJyCgptYWluX2NvbnRyYWN0X3VwZGF0ZV9yb3V0ZUA0OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgcHVzaGludCA0IC8vIFVwZGF0ZUFwcGxpY2F0aW9uCiAgICA9PQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICYmCiAgICBhc3NlcnQKICAgIGIgY29udHJhY3RfdXBkYXRlCgoKLy8gX3B1eWFfbGliLnV0aWwuZW5zdXJlX2J1ZGdldChyZXF1aXJlZF9idWRnZXQ6IHVpbnQ2NCwgZmVlX3NvdXJjZTogdWludDY0KSAtPiB2b2lkOgplbnN1cmVfYnVkZ2V0OgogICAgcHJvdG8gMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMTAKICAgICsKCmVuc3VyZV9idWRnZXRfd2hpbGVfdG9wQDE6CiAgICBmcmFtZV9kaWcgMAogICAgZ2xvYmFsIE9wY29kZUJ1ZGdldAogICAgPgogICAgYnogZW5zdXJlX2J1ZGdldF9hZnRlcl93aGlsZUA2CiAgICBpdHhuX2JlZ2luCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgYnl0ZWMgNDggLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtCiAgICBieXRlYyA0OCAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbQogICAgZnJhbWVfZGlnIC0xCiAgICBzd2l0Y2ggZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8wQDMgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8xQDQKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfbmV4dEA1OgogICAgaXR4bl9zdWJtaXQKICAgIGIgZW5zdXJlX2J1ZGdldF93aGlsZV90b3BAMQoKZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8xQDQ6CiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgYiBlbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX25leHRANQoKZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8wQDM6CiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGIgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV9uZXh0QDUKCmVuc3VyZV9idWRnZXRfYWZ0ZXJfd2hpbGVANjoKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucGF5bWVudF9hZ2VudC5QYXltZW50QWdlbnQuZnVuZF9kdWVfY2FzaGZsb3dzW3JvdXRpbmddKCkgLT4gdm9pZDoKZnVuZF9kdWVfY2FzaGZsb3dzOgogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAxMwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NgogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NjgKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjY5CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjcwCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM4CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE1MAogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3MgogICAgLy8gaWYgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCk6CiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3Ni03NwogICAgLy8gKyBtYXhfZXZlbnRfY291bnQKICAgIC8vICogVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfUEVSX0VWRU5UX0JVREdFVCkKICAgIGR1cAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojc3CiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfRlVORF9EVUVfQ0FTSEZMT1dTX1BFUl9FVkVOVF9CVURHRVQpCiAgICBwdXNoaW50IDEwMAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojc2LTc3CiAgICAvLyArIG1heF9ldmVudF9jb3VudAogICAgLy8gKiBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19QRVJfRVZFTlRfQlVER0VUKQogICAgKgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojc1CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19CQVNFX0JVREdFVCkKICAgIGludGMgNCAvLyAxNTAwCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzUtNzcKICAgIC8vIFVJbnQ2NChjc3QuT1BfVVBfRlVORF9EVUVfQ0FTSEZMT1dTX0JBU0VfQlVER0VUKQogICAgLy8gKyBtYXhfZXZlbnRfY291bnQKICAgIC8vICogVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfUEVSX0VWRU5UX0JVREdFVCkKICAgICsKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3My03OQogICAgLy8gZW5zdXJlX2J1ZGdldCgKICAgIC8vICAgICByZXF1aXJlZF9idWRnZXQ9KAogICAgLy8gICAgICAgICBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19CQVNFX0JVREdFVCkKICAgIC8vICAgICAgICAgKyBtYXhfZXZlbnRfY291bnQKICAgIC8vICAgICAgICAgKiBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19QRVJfRVZFTlRfQlVER0VUKQogICAgLy8gICAgICksCiAgICAvLyApCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjgxCiAgICAvLyBwcm9jZXNzZWRfZXZlbnRzID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA1CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODIKICAgIC8vIGZ1bmRlZF9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4MwogICAgLy8gZnVuZGVkX3ByaW5jaXBhbCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTMKCmZ1bmRfZHVlX2Nhc2hmbG93c193aGlsZV90b3BANDoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4NgogICAgLy8gcHJvY2Vzc2VkX2V2ZW50cyA8IG1heF9ldmVudF9jb3VudAogICAgZGlnIDQKICAgIGRpZyAxCiAgICA8CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODYtODcKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgPCBtYXhfZXZlbnRfY291bnQKICAgIC8vIGFuZCBzZWxmLmV2ZW50X2N1cnNvciA8IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQKICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl93aGlsZUAxMQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojg3CiAgICAvLyBhbmQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIDwKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4Ni04NwogICAgLy8gcHJvY2Vzc2VkX2V2ZW50cyA8IG1heF9ldmVudF9jb3VudAogICAgLy8gYW5kIHNlbGYuZXZlbnRfY3Vyc29yIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudAogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDExCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODkKICAgIC8vIGVudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KHNlbGYuZXZlbnRfY3Vyc29yKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIGR1cAogICAgYnVyeSAxNwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjkwCiAgICAvLyBpZiBlbnRyeS5zY2hlZHVsZWRfdGltZSA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wOgogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDMKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgID4KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAMTEKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5MgogICAgLy8gaWYgbm90IHNlbGYuX2V2ZW50X2lzX2Nhc2goZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSk6CiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ1cnkgMTYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM1NAogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUCksCiAgICBpbnRjXzIgLy8gOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzUzLTM1NwogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfTUQpLAogICAgLy8gKQogICAgPT0KICAgIGR1cAogICAgYnVyeSA0CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfdHJ1ZUA1MgogICAgZGlnIDE0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNTUKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNTMtMzU3CiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9NRCksCiAgICAvLyApCiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX3RydWVANTIKICAgIGRpZyAxNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzU2CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX01EKSwKICAgIHB1c2hpbnQgMTkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM1My0zNTcKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX01EKSwKICAgIC8vICkKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUA1MwoKZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfdHJ1ZUA1MjoKICAgIGludGNfMSAvLyAxCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUA1NDoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5MgogICAgLy8gaWYgbm90IHNlbGYuX2V2ZW50X2lzX2Nhc2goZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSk6CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAMTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MQogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X2lkID09IHNlbGYuZXZlbnRfY3Vyc29yLCBlcnIuSU5WQUxJRF9FVkVOVF9DVVJTT1IKICAgIGRpZyAxNQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBjdXJzb3IKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MgogICAgLy8gYXNzZXJ0IGVudHJ5LnNjaGVkdWxlZF90aW1lIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLCBlcnIuTk9fRFVFX0NBU0hGTE9XCiAgICBkaWcgMQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPD0KICAgIGFzc2VydCAvLyBObyBkdWUgY2FzaGZsb3cgdG8gcGF5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MTYKICAgIC8vIGlmIGV2ZW50X3R5cGUgbm90IGluIChVSW50NjQoZW51bXMuRVZUX0lQKSwgVUludDY0KGVudW1zLkVWVF9NRCkpOgogICAgZGlnIDIKICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNQogICAgZGlnIDE0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MTcKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDExCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfaW50ZXJlc3RfYW1vdW50QDE2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDI5CiAgICAvLyBldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBidXJ5IDE2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzAKICAgIC8vIGlmIGV2ZW50X3R5cGUgbm90IGluIChVSW50NjQoZW51bXMuRVZUX1BSKSwgVUludDY0KGVudW1zLkVWVF9NRCkpOgogICAgcHVzaGludCAzCiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE5CiAgICBkaWcgMTQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzMQogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNgoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnRAMjg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTYKICAgIC8vIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGRpZyAxNQogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTU5CiAgICAvLyBpZiBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKToKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDI5CiAgICBkaWcgNwogICAgYnVyeSA5CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzODoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU3NS01NzcKICAgIC8vICMgRnVuZGluZyB1c2VzIHBlci11bml0IGN1bXVsYXRpdmUgaW5kaWNlcyBzbyBlYWNoIGhvbGRlciBjYW4gc2V0dGxlCiAgICAvLyAjIGluZGVwZW5kZW50bHkgZnJvbSBpdHMgY3VycmVudCB1bml0IGJhbGFuY2UuCiAgICAvLyBpbnRlcmVzdF9pbmRleF9kZWx0YSA9IHNlbGYuX2Ftb3VudF90b19pbmRleF9kZWx0YShpbnRlcmVzdF9hbW91bnRfZHVlKQogICAgZGlnIDEwCiAgICBjYWxsc3ViIF9hbW91bnRfdG9faW5kZXhfZGVsdGEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU3OAogICAgLy8gcHJpbmNpcGFsX2luZGV4X2RlbHRhID0gc2VsZi5fYW1vdW50X3RvX2luZGV4X2RlbHRhKHByaW5jaXBhbF9hbW91bnRfZHVlKQogICAgZGlnIDYKICAgIGNhbGxzdWIgX2Ftb3VudF90b19pbmRleF9kZWx0YQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTc5CiAgICAvLyBpbnRlcmVzdF9hbW91bnQgPSBzZWxmLl9pbmRleF9kZWx0YV90b19hbW91bnQoaW50ZXJlc3RfaW5kZXhfZGVsdGEpCiAgICBkaWcgMQogICAgY2FsbHN1YiBfaW5kZXhfZGVsdGFfdG9fYW1vdW50CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgMTUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4MAogICAgLy8gcHJpbmNpcGFsX2Ftb3VudCA9IHNlbGYuX2luZGV4X2RlbHRhX3RvX2Ftb3VudChwcmluY2lwYWxfaW5kZXhfZGVsdGEpCiAgICBkdXAKICAgIGNhbGxzdWIgX2luZGV4X2RlbHRhX3RvX2Ftb3VudAogICAgZHVwCiAgICBidXJ5IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1ODEKICAgIC8vIHJlcXVpcmVkX2Ftb3VudCA9IGludGVyZXN0X2Ftb3VudCArIHByaW5jaXBhbF9hbW91bnQKICAgIGRpZyAyCiAgICBkaWcgMQogICAgKwogICAgZHVwCiAgICBidXJ5IDkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjczNwogICAgLy8gYmFsYW5jZSA9IHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ1OQogICAgLy8gcmV0dXJuIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgKyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIGRpZyAxCiAgICArCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MzkKICAgIC8vIGFzc2VydCBiYWxhbmNlID49IHJlc2VydmVkX3RvdGFsLCBlcnIuTk9UX0VOT1VHSF9GVU5EUwogICAgZGlnIDIKICAgIGRpZyAxCiAgICA+PQogICAgYXNzZXJ0IC8vIE5vdCBlbm91Z2ggZnVuZHMgZm9yIHRoZSBwYXltZW50CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDAKICAgIC8vIHJldHVybiBiYWxhbmNlIC0gcmVzZXJ2ZWRfdG90YWwKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTgzCiAgICAvLyBzZWxmLl9hdmFpbGFibGVfc2V0dGxlbWVudF9mdW5kcygpID49IHJlcXVpcmVkX2Ftb3VudAogICAgdW5jb3ZlciAyCiAgICA+PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTgyLTU4NAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLl9hdmFpbGFibGVfc2V0dGxlbWVudF9mdW5kcygpID49IHJlcXVpcmVkX2Ftb3VudAogICAgLy8gKSwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTg2CiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0ICs9IGludGVyZXN0X2Ftb3VudAogICAgdW5jb3ZlciAzCiAgICArCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTg3CiAgICAvLyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCArPSBwcmluY2lwYWxfYW1vdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICArCiAgICBieXRlYyAxMiAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4OAogICAgLy8gc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4ICs9IGludGVyZXN0X2luZGV4X2RlbHRhCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCBleGlzdHMKICAgIHVuY292ZXIgMgogICAgKwogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTg5CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4ICs9IHByaW5jaXBhbF9pbmRleF9kZWx0YQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCBleGlzdHMKICAgICsKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTAKICAgIC8vIGlmIGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkgPT0gVUludDY0KGVudW1zLkVWVF9QUik6CiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBwdXNoaW50IDMKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDQwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTEtNTkyCiAgICAvLyAjIEZvciBQUiwgdGhlIHBlcmlvZCBpbnRlcmVzdCBzdGF5cyBhY2NydWVkIHVudGlsIGEgbGF0ZXIgSVAgb3IgTUQuCiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgKz0gc2VsZi5fZW50cnlfaW50ZXJlc3Rfc2VnbWVudChlbnRyeSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBkaWcgMTYKICAgIGNhbGxzdWIgX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQKICAgIGJ1cnkgMTgKICAgICsKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTUKICAgIC8vIGlmIG5vdCBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKSBvciBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NCgKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlANDMKICAgIGRpZyAxNQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5NS01OTcKICAgIC8vIGlmIG5vdCBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKSBvciBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NCgKICAgIC8vICAgICBlbnVtcy5FVlRfTUQKICAgIC8vICk6CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDQKCmZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDQzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTk4CiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBkaWcgMTUKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0NDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5OQogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgZGlnIDgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MDAKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IG5leHRfaW50ZXJlc3RfYmFzZQogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGRpZyA5CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAxCiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MDMKICAgIC8vIGlmIGVudHJ5LmV2ZW50X3R5cGUgPT0gYXJjNC5VSW50OCgKICAgIGRpZyAxNQogICAgZXh0cmFjdCA4IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwMy02MDUKICAgIC8vIGlmIGVudHJ5LmV2ZW50X3R5cGUgPT0gYXJjNC5VSW50OCgKICAgIC8vICAgICBlbnVtcy5FVlRfTUQKICAgIC8vICkgYW5kIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID09IFVJbnQ2NCgwKToKICAgIHB1c2hieXRlcyAweDEzCiAgICBiPT0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQ3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MDUKICAgIC8vICkgYW5kIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID09IFVJbnQ2NCgwKToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAzLTYwNQogICAgLy8gaWYgZW50cnkuZXZlbnRfdHlwZSA9PSBhcmM0LlVJbnQ4KAogICAgLy8gICAgIGVudW1zLkVWVF9NRAogICAgLy8gKSBhbmQgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPT0gVUludDY0KDApOgogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQ3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MDYKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGVudW1zLlNUQVRVU19FTkRFRCkKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgMjAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjA3CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQ3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjA5LTYxMwogICAgLy8gc2VsZi5fZW1pdF9leGVjdXRpb25fZXZlbnQoCiAgICAvLyAgICAgZW50cnk9ZW50cnksCiAgICAvLyAgICAgcGF5b2ZmPWludGVyZXN0X2Ftb3VudCArIHByaW5jaXBhbF9hbW91bnQsCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9aW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudCwKICAgIC8vICkKICAgIGRpZyAxNQogICAgZGlnIDQKICAgIGR1cAogICAgY2FsbHN1YiBfZW1pdF9leGVjdXRpb25fZXZlbnQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojk2CiAgICAvLyBmdW5kZWRfaW50ZXJlc3QgKz0gaW50ZXJlc3RfYW1vdW50CiAgICBkaWcgMTMKICAgIGRpZyAxMgogICAgKwogICAgYnVyeSAxNAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojk3CiAgICAvLyBmdW5kZWRfcHJpbmNpcGFsICs9IHByaW5jaXBhbF9hbW91bnQKICAgIGRpZyAxMgogICAgZGlnIDcKICAgICsKICAgIGJ1cnkgMTMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5OAogICAgLy8gcHJvY2Vzc2VkX2V2ZW50cyArPSBVSW50NjQoMSkKICAgIGRpZyA0CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSA1CiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c193aGlsZV90b3BANAoKZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUA0MDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5NAogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ID0gVUludDY0KDApCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQxCgpmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUAyOToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU2MAogICAgLy8gZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGRpZyAxNQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSAxNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTYxLTU2MwogICAgLy8gIyBEeW5hbWljIGFubnVpdGllcyBkZXJpdmUgbmV4dCBzdGF0ZSBmcm9tIHRoZSBwYXltZW50IGRlY29tcG9zaXRpb24sCiAgICAvLyAjIG5vdCBvbmx5IGZyb20gdGhlIHByZWNvbXB1dGVkIGBuZXh0XypgIGZpZWxkcy4KICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QUik6CiAgICBwdXNoaW50IDMKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDMxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjUKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIC0gcHJpbmNpcGFsX2Ftb3VudF9kdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgZGlnIDYKICAgIC0KICAgIGR1cAogICAgYnVyeSA5CiAgICBidXJ5IDkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzgKCmZ1bmRfZHVlX2Nhc2hmbG93c19lbHNlX2JvZHlAMzE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjgKICAgIC8vIGVsaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX0lQKToKICAgIGRpZyAxNAogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDMzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjkKICAgIC8vIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgYnVyeSA5CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzAKICAgIC8vIG5leHRfaW50ZXJlc3RfYmFzZSA9IHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgYnVyeSAxMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSBleGlzdHMKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzgKCmZ1bmRfZHVlX2Nhc2hmbG93c19lbHNlX2JvZHlAMzM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzEKICAgIC8vIGVsaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKToKICAgIGRpZyAxNAogICAgcHVzaGludCAxOQogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUAzNAogICAgZGlnIDcKICAgIGJ1cnkgOQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlAMzQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzIKICAgIC8vIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzMKICAgIC8vIG5leHRfaW50ZXJlc3RfYmFzZSA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgOQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzIKICAgIC8vIGlmIHNlbGYuX2lzX2R5bmFtaWNfYW5udWl0eSgpOgogICAgY2FsbHN1YiBfaXNfZHluYW1pY19hbm51aXR5CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyNwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDMzCiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfTUQpOgogICAgZGlnIDE0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzNAogICAgLy8gcmV0dXJuIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTU1CiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzNQogICAgLy8gaW50ZXJlc3RfZHVlID0gc2VsZi5hY2NydWVkX2ludGVyZXN0ICsgc2VsZi5fZW50cnlfaW50ZXJlc3Rfc2VnbWVudChlbnRyeSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBkaWcgMTYKICAgIGNhbGxzdWIgX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQKICAgIGJ1cnkgMTgKICAgICsKICAgIGR1cAogICAgYnVyeSAxMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDM2CiAgICAvLyBpZiBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPD0gaW50ZXJlc3RfZHVlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gZXhpc3RzCiAgICA+PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzNwogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTU1CiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyNDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzOAogICAgLy8gcHJpbmNpcGFsX2Ftb3VudCA9IHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiAtIGludGVyZXN0X2R1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gZXhpc3RzCiAgICBkaWcgMTAKICAgIC0KICAgIGR1cAogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzkKICAgIC8vIGlmIHByaW5jaXBhbF9hbW91bnQgPiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgPgogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ0MAogICAgLy8gcmV0dXJuIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTU1CiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAyNjoKICAgIGRpZyA2CiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1NQogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NDMKICAgIC8vIGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsIDw9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBkaWcgMTUKICAgIHB1c2hpbnQgNDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGR1cDIKICAgIDw9CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NDItNDQ0CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsIDw9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ0NQogICAgLy8gcmV0dXJuIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIC0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIHN3YXAKICAgIC0KICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTU1CiAgICAvLyBwcmluY2lwYWxfYW1vdW50X2R1ZSA9IHNlbGYuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQxOAogICAgLy8gcmV0dXJuIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCArIHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZGlnIDE2CiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBidXJ5IDE4CiAgICArCiAgICBidXJ5IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTQKICAgIC8vIGludGVyZXN0X2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9pbnRlcmVzdF9hbW91bnQoZW50cnkpCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9pbnRlcmVzdF9hbW91bnRAMTYKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl93aGlsZUAxMToKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMDAKICAgIC8vIGFzc2VydCBwcm9jZXNzZWRfZXZlbnRzID4gVUludDY0KDApLCBlcnIuTk9fRFVFX0NBU0hGTE9XCiAgICBkaWcgNAogICAgZHVwCiAgICBhc3NlcnQgLy8gTm8gZHVlIGNhc2hmbG93IHRvIHBheQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjEwNAogICAgLy8gdG90YWxfZnVuZGVkPWZ1bmRlZF9pbnRlcmVzdCArIGZ1bmRlZF9wcmluY2lwYWwsCiAgICBkaWcgMTQKICAgIGR1cAogICAgZGlnIDE1CiAgICBkdXAKICAgIGNvdmVyIDMKICAgICsKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMDYKICAgIC8vIHRpbWVzdGFtcD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMDEtMTA3CiAgICAvLyByZXR1cm4gdHlwLkNhc2hGdW5kaW5nUmVzdWx0KAogICAgLy8gICAgIGZ1bmRlZF9pbnRlcmVzdD1mdW5kZWRfaW50ZXJlc3QsCiAgICAvLyAgICAgZnVuZGVkX3ByaW5jaXBhbD1mdW5kZWRfcHJpbmNpcGFsLAogICAgLy8gICAgIHRvdGFsX2Z1bmRlZD1mdW5kZWRfaW50ZXJlc3QgKyBmdW5kZWRfcHJpbmNpcGFsLAogICAgLy8gICAgIHByb2Nlc3NlZF9ldmVudHM9cHJvY2Vzc2VkX2V2ZW50cywKICAgIC8vICAgICB0aW1lc3RhbXA9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX2ZhbHNlQDUzOgogICAgaW50Y18wIC8vIDAKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfbWVyZ2VANTQKCgovLyBtb2R1bGVzLnBheW1lbnRfYWdlbnQuUGF5bWVudEFnZW50LmNsYWltX2R1ZV9jYXNoZmxvd3Nbcm91dGluZ10oKSAtPiB2b2lkOgpjbGFpbV9kdWVfY2FzaGZsb3dzOgogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDIKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NgogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg0MTIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE1CiAgICAvLyBpZiBzZWxmLm9wX2RhZW1vbi52YWx1ZSAhPSBHbG9iYWwuemVyb19hZGRyZXNzOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI3IC8vIDB4NTIzYTRmNTA0NDIzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BfZGFlbW9uIGV4aXN0cwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgYnogY2xhaW1fZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE3CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTcKICAgIC8vIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNyAvLyAweDUyM2E0ZjUwNDQyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wX2RhZW1vbiBleGlzdHMKICAgID09CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTctMTkKICAgIC8vIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICAvLyBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgYm56IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDE0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTgKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNy0xOQogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICBibnogY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX3RydWVAMTQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxOQogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIHR4biBTZW5kZXIKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDMyCiAgICA9PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE3LTE5CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAxNQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX3RydWVAMTQ6CiAgICBpbnRjXzEgLy8gMQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDE2OgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE2LTIwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vICAgICBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gICAgIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICAvLyApLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNzoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMzkKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTQwCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM4CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE1MAogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNDMKICAgIC8vIHNlbGYuX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQoaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDIKICAgIGR1cAogICAgY2FsbHN1YiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE0NAogICAgLy8gc2VsZi5fc2V0dGxlX3Bvc2l0aW9uKGhvbGRpbmdfYWRkcmVzcykKICAgIGNhbGxzdWIgX3NldHRsZV9wb3NpdGlvbgogICAgcG9wbiAyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTE3CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jbGFpbWFibGVfaW50ZXJlc3QKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGR1cAogICAgcHVzaGludCA3MwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTE4CiAgICAvLyArIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNsYWltYWJsZV9wcmluY2lwYWwKICAgIGR1cAogICAgcHVzaGludCA4MQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTE3LTExOAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY2xhaW1hYmxlX2ludGVyZXN0CiAgICAvLyArIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNsYWltYWJsZV9wcmluY2lwYWwKICAgIHVuY292ZXIgMgogICAgKwogICAgZHVwCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNDYKICAgIC8vIGFzc2VydCB0b3RhbF9hbW91bnQgPiBVSW50NjQoMCksIGVyci5OT19EVUVfQ0FTSEZMT1cKICAgIGFzc2VydCAvLyBObyBkdWUgY2FzaGZsb3cgdG8gcGF5CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MjUKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5pc19vcHRlZF9pbigKICAgIGV4dHJhY3QgMCAzMgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI2CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI1LTI3CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MuaXNfb3B0ZWRfaW4oCiAgICAvLyAgICAgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkCiAgICAvLyApCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI1LTI4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MuaXNfb3B0ZWRfaW4oCiAgICAvLyAgICAgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkCiAgICAvLyApCiAgICAvLyBhbmQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZAogICAgYnogY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX2ZhbHNlQDI0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MjgKICAgIC8vIGFuZCBub3Qgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDM4NAogICAgZ2V0Yml0CiAgICBibnogY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX2ZhbHNlQDI0CiAgICBpbnRjXzEgLy8gMQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDI1OgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE1MQogICAgLy8gaWYgc2VsZi5faXNfcGF5bWVudF9leGVjdXRhYmxlKGhvbGRpbmdfYWRkcmVzcyk6CiAgICBieiBjbGFpbV9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjM0CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgc3dhcAogICAgZGlnIDEKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYXNzZXJ0IC8vIGFjY291bnQgb3B0ZWQgaW50byBhc3NldAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjM0LTM1CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgLy8gPj0gcGF5bWVudF9hbW91bnQKICAgIGRpZyA1CiAgICBkdXAKICAgIGNvdmVyIDIKICAgID49CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MzMtMzYKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIC8vICAgICA+PSBwYXltZW50X2Ftb3VudAogICAgLy8gKSwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE1MwogICAgLy8gc2VsZi5fcGF5KHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcywgdG90YWxfYW1vdW50KQogICAgZGlnIDIKICAgIGR1cAogICAgY292ZXIgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGR1cAogICAgZXh0cmFjdCAwIDMyCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NDAtNDUKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1yZWNlaXZlciwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9YW1vdW50LAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NDQKICAgIC8vIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICB1bmNvdmVyIDMKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgdW5jb3ZlciAyCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQwCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NDAtNDUKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1yZWNlaXZlciwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9YW1vdW50LAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEyNS0xMjYKICAgIC8vICMgR2V0IHRoZSBjbGFpbWFibGUgYW1vdW50cyBiZWZvcmUgcmVzZXQKICAgIC8vIGludGVyZXN0X2Ftb3VudCA9IHBvc2l0aW9uLmNsYWltYWJsZV9pbnRlcmVzdAogICAgZHVwCiAgICBwdXNoaW50IDczCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBidXJ5IDkKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMjcKICAgIC8vIHByaW5jaXBhbF9hbW91bnQgPSBwb3NpdGlvbi5jbGFpbWFibGVfcHJpbmNpcGFsCiAgICBkdXAKICAgIHB1c2hpbnQgODEKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGJ1cnkgOQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEyOS0xMzAKICAgIC8vICMgUmVzZXQgdGhlIHBvc2l0aW9uJ3MgY2xhaW1hYmxlIGFtb3VudHMKICAgIC8vIHBvc2l0aW9uLmNsYWltYWJsZV9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICByZXBsYWNlMiA3MwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzMQogICAgLy8gcG9zaXRpb24uY2xhaW1hYmxlX3ByaW5jaXBhbCA9IFVJbnQ2NCgwKQogICAgc3dhcAogICAgcmVwbGFjZTIgODEKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzIKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gcG9zaXRpb24uY29weSgpCiAgICB1bmNvdmVyIDMKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzQKICAgIC8vIGFzc2VydCBzZWxmLnJlc2VydmVkX2ludGVyZXN0ID49IGludGVyZXN0X2Ftb3VudCwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBkdXAKICAgIGRpZyAyCiAgICA+PQogICAgYXNzZXJ0IC8vIE5vdCBlbm91Z2ggZnVuZHMgZm9yIHRoZSBwYXltZW50CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTM1CiAgICAvLyBhc3NlcnQgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgPj0gcHJpbmNpcGFsX2Ftb3VudCwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIGRpZyAzCiAgICA+PQogICAgYXNzZXJ0IC8vIE5vdCBlbm91Z2ggZnVuZHMgZm9yIHRoZSBwYXltZW50CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTM3LTEzOAogICAgLy8gIyBVcGRhdGUgdGhlIGdsb2JhbCByZXNlcnZlZCBpbnRlcmVzdCBhbmQgcHJpbmNpcGFsIGFtb3VudHMKICAgIC8vIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgLT0gaW50ZXJlc3RfYW1vdW50CiAgICBzd2FwCiAgICAtCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzOQogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgLT0gcHJpbmNpcGFsX2Ftb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIGV4aXN0cwogICAgc3dhcAogICAgLQogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpjbGFpbV9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNTkKICAgIC8vIHRvdGFsX2Ftb3VudD1pbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50LAogICAgZGlnIDUKICAgIGR1cAogICAgZGlnIDYKICAgIGR1cAogICAgY292ZXIgMwogICAgKwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE2MAogICAgLy8gdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE1Ni0xNjIKICAgIC8vIHJldHVybiB0eXAuQ2FzaENsYWltUmVzdWx0KAogICAgLy8gICAgIGludGVyZXN0X2Ftb3VudD1pbnRlcmVzdF9hbW91bnQsCiAgICAvLyAgICAgcHJpbmNpcGFsX2Ftb3VudD1wcmluY2lwYWxfYW1vdW50LAogICAgLy8gICAgIHRvdGFsX2Ftb3VudD1pbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50LAogICAgLy8gICAgIHRpbWVzdGFtcD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICBjb250ZXh0PXBheW1lbnRfaW5mbywKICAgIC8vICkKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyAyCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgcHVzaGJ5dGVzIDB4MDAyMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX2ZhbHNlQDI0OgogICAgaW50Y18wIC8vIDAKICAgIGIgY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDI1CgpjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VAMTU6CiAgICBpbnRjXzAgLy8gMAogICAgYiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfbWVyZ2VAMTYKCgovLyBtb2R1bGVzLnRyYW5zZmVyX2FnZW50LlRyYW5zZmVyQWdlbnQudHJhbnNmZXJfc2V0X3NjaGVkdWxlW3JvdXRpbmddKCkgLT4gdm9pZDoKdHJhbnNmZXJfc2V0X3NjaGVkdWxlOgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQwCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDEKICAgIC8vIGFzc2VydCBvcGVuX2RhdGUgPCBjbG9zdXJlX2RhdGUsIGVyci5JTlZBTElEX1NPUlRJTkcKICAgIGR1cDIKICAgIDwKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBtdXN0IGJlIHNvcnRlZCBpbiBzdHJpY3RseSBhc2NlbmRpbmcgb3JkZXIKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDMKICAgIC8vIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlID0gb3Blbl9kYXRlCiAgICBieXRlYyAyOSAvLyAidHJhbnNmZXJfb3BlbmluZ19kYXRlIgogICAgdW5jb3ZlciAyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo0NAogICAgLy8gc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGUgPSBjbG9zdXJlX2RhdGUKICAgIGJ5dGVjIDMwIC8vICJ0cmFuc2Zlcl9jbG9zdXJlX2RhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo0NQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnRyYW5zZmVyX2FnZW50LlRyYW5zZmVyQWdlbnQucHJpbWFyeV9kaXN0cmlidXRpb25bcm91dGluZ10oKSAtPiB2b2lkOgpwcmltYXJ5X2Rpc3RyaWJ1dGlvbjoKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NgogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzEKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnByaW1hcnlfZGVhbGVyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjIgLy8gMHg1MjNhNTA1OTQ0MjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NzYKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojc3CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM4CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NzgKICAgIC8vIGFzc2VydCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBSSU1BUllfRElTVFJJQlVUSU9OX0NMT1NFRAogICAgYXNzZXJ0IC8vIFByaW1hcnkgZGlzdHJpYnV0aW9uIGlzIGNsb3NlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBjb3ZlciAzCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjgwCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKGhvbGRpbmdfYWRkcmVzcykKICAgIHN3YXAKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODEKICAgIC8vIGFzc2VydCB1bml0cyA+IFVJbnQ2NCgwKSwgZXJyLlpFUk9fVU5JVFMKICAgIGR1cAogICAgYXNzZXJ0IC8vIENhbiBub3QgZGlzdHJpYnV0ZSB6ZXJvIHVuaXRzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjgzCiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsICsgdW5pdHMgPD0gc2VsZi50b3RhbF91bml0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCBleGlzdHMKICAgICsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICA8PQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4Mi04NAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsICsgdW5pdHMgPD0gc2VsZi50b3RhbF91bml0cwogICAgLy8gKSwgZXJyLk9WRVJfRElTVFJJQlVUSU9OCiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IHJlbWFpbmluZyBELUFTQSB1bml0cwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4NQogICAgLy8gaWYgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjggLy8gImluaXRpYWxfZXhjaGFuZ2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGUgZXhpc3RzCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODcKICAgIC8vIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDw9IHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjggLy8gImluaXRpYWxfZXhjaGFuZ2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGUgZXhpc3RzCiAgICA8PQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4Ni04OAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8PSBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZQogICAgLy8gKSwgZXJyLlBSSU1BUllfRElTVFJJQlVUSU9OX0NMT1NFRAogICAgYXNzZXJ0IC8vIFByaW1hcnkgZGlzdHJpYnV0aW9uIGlzIGNsb3NlZAoKcHJpbWFyeV9kaXN0cmlidXRpb25fYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE0OAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucmVzZXJ2ZWRfdW5pdHMgKz0gdW5pdHMKICAgIGR1cG4gMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHB1c2hpbnQgNDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMwogICAgZHVwCiAgICBjb3ZlciAzCiAgICArCiAgICBpdG9iCiAgICBwdXNoaW50IDQwCiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo5MQogICAgLy8gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCArPSB1bml0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCBleGlzdHMKICAgICsKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo5MgogICAgLy8gcmV0dXJuIHNlbGYudG90YWxfdW5pdHMgLSBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgc3dhcAogICAgLQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy50cmFuc2Zlcl9hZ2VudC5UcmFuc2ZlckFnZW50LnRyYW5zZmVyW3JvdXRpbmddKCkgLT4gdm9pZDoKdHJhbnNmZXI6CiAgICBpbnRjXzAgLy8gMAogICAgZHVwCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojk0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXBuIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDYKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxMzAKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjEzMQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzOAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTAKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjEzCiAgICAvLyBpZiBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyOSAvLyAidHJhbnNmZXJfb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIGJ6IHRyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNQogICAgLy8gc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyOSAvLyAidHJhbnNmZXJfb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIDw9CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE0LTE2CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyApLCBlcnIuQ0xPU0VEX1RSQU5TRkVSCiAgICBhc3NlcnQgLy8gVHJhbnNmZXIgaXMgY2xvc2VkCgp0cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE3CiAgICAvLyBpZiBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMCAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIGJ6IHRyYW5zZmVyX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxOQogICAgLy8gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDMwIC8vICJ0cmFuc2Zlcl9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgPAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxOC0yMAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8IHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlCiAgICAvLyApLCBlcnIuQ0xPU0VEX1RSQU5TRkVSCiAgICBhc3NlcnQgLy8gVHJhbnNmZXIgaXMgY2xvc2VkCgp0cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjEzNQogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gc2VuZGVyX2hvbGRpbmdfYWRkcmVzcywgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDgKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIGRpZyA1CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDkKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTM4CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBkaWcgMgogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxMzkKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQocmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzKQogICAgZHVwCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE0MAogICAgLy8gYXNzZXJ0IHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MgIT0gcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzLCBlcnIuU0VMRl9UUkFOU0ZFUgogICAgdW5jb3ZlciAyCiAgICAhPQogICAgYXNzZXJ0IC8vIFNlbmRlciBhbmQgcmVjZWl2ZXIgbXVzdCBiZSBkaWZmZXJlbnQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTQxCiAgICAvLyBhc3NlcnQgdW5pdHMgPiBVSW50NjQoMCksIGVyci5OVUxMX1RSQU5TRkVSCiAgICBkaWcgMQogICAgZHVwCiAgICBhc3NlcnQgLy8gVHJhbnNmZXIgdW5pdHMgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNDIKICAgIC8vIGFzc2VydCB1bml0cyA8PSBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMsIGVyci5PVkVSX1RSQU5TRkVSCiAgICBzd2FwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgPD0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgc2VuZGVyIHVuaXRzIHRvIHRyYW5zZmVyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NjYKICAgIC8vIGlmIHNlbGYuZXZlbnRfY3Vyc29yID49IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQ6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgID49CiAgICBibnogdHJhbnNmZXJfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYXNzZXJ0X25vX2R1ZV9ldmVudF9wZW5kaW5nQDEwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NjgKICAgIC8vIG5leHRfZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoc2VsZi5ldmVudF9jdXJzb3IpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzcwCiAgICAvLyBuZXh0X2VudHJ5LnNjaGVkdWxlZF90aW1lID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgID4KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc2OS03NzEKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgbmV4dF9lbnRyeS5zY2hlZHVsZWRfdGltZSA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyApLCBlcnIuUEVORElOR19BQ1RVU19FVkVOVAogICAgYXNzZXJ0IC8vIEFDVFVTIGV2ZW50IG5vdCB5ZXQgZXhlY3V0ZWQKCnRyYW5zZmVyX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Fzc2VydF9ub19kdWVfZXZlbnRfcGVuZGluZ0AxMDoKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTQ1CiAgICAvLyBzZWxmLl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBkaWcgMwogICAgZHVwCiAgICBjYWxsc3ViIF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE0NgogICAgLy8gc2VsZi5fZW5zdXJlX3VuaXRzX2FjdGl2YXRlZChyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBkaWcgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjYWxsc3ViIF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE0NwogICAgLy8gc2VsZi5fc2V0dGxlX3Bvc2l0aW9uKHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBjYWxsc3ViIF9zZXR0bGVfcG9zaXRpb24KICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNDgKICAgIC8vIHNlbGYuX3NldHRsZV9wb3NpdGlvbihyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBjYWxsc3ViIF9zZXR0bGVfcG9zaXRpb24KICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE1MgogICAgLy8gYXNzZXJ0IHVuaXRzIDw9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLCBlcnIuT1ZFUl9UUkFOU0ZFUgogICAgZGlnIDUKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGRpZyAxCiAgICA8PQogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCBzZW5kZXIgdW5pdHMgdG8gdHJhbnNmZXIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNTMKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzIC09IHVuaXRzCiAgICBkaWcgMQogICAgLQogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBpbnRjXzMgLy8gMzIKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNDQKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzICs9IHVuaXRzCiAgICBkaWcgNQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgdW5jb3ZlciAyCiAgICArCiAgICBpdG9iCiAgICBpbnRjXzMgLy8gMzIKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojk0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgZGlnIDIKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF9zdXNwZW5zaW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF9zdXNwZW5zaW9uOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE2NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzcKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDIxIC8vIDB4NTIzYTQxNTU1NDIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg0MTIzCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTg1CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGR1cAogICAgcHVzaGludCA0OAogICAgaW50Y18xIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIHB1c2hpbnQgNDgKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTg2CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfb3Blbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfb3BlbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2OAogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjMgLy8gMHg1MjNhNGQ0ZTQ3MjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0MgogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfRU5ERUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgMjAwCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxMAogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfZW5kZWQoKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgIQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjExCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxMgogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTMKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjM0CiAgICAvLyB1bml0cz1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjMyLTQyCiAgICAvLyByZXR1cm4gdHlwLkFjY291bnRQb3NpdGlvbigKICAgIC8vICAgICBwYXltZW50X2FkZHJlc3M9cGF5bWVudF9hZGRyZXNzLAogICAgLy8gICAgIHVuaXRzPVVJbnQ2NCgwKSwKICAgIC8vICAgICByZXNlcnZlZF91bml0cz1VSW50NjQoMCksCiAgICAvLyAgICAgc3VzcGVuZGVkPUZhbHNlLAogICAgLy8gICAgIHNldHRsZWRfY3Vyc29yPVVJbnQ2NCgwKSwKICAgIC8vICAgICBpbnRlcmVzdF9jaGVja3BvaW50PVVJbnQ2NCgwKSwKICAgIC8vICAgICBwcmluY2lwYWxfY2hlY2twb2ludD1VSW50NjQoMCksCiAgICAvLyAgICAgY2xhaW1hYmxlX2ludGVyZXN0PVVJbnQ2NCgwKSwKICAgIC8vICAgICBjbGFpbWFibGVfcHJpbmNpcGFsPVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGl0b2IKICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgYnl0ZWMgNDAgLy8gMHgwMAogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTQKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gc2VsZi5fbmV3X2FjY291bnRfcG9zaXRpb24ocGF5bWVudF9hZGRyZXNzKQogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxNQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5hY2NvdW50X3VwZGF0ZV9wYXltZW50X2FkZHJlc3Nbcm91dGluZ10oKSAtPiB2b2lkOgphY2NvdW50X3VwZGF0ZV9wYXltZW50X2FkZHJlc3M6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg0MTIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMzgKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcywgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgdW5jb3ZlciAzCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjM5CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0MAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDEKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcyA9IHBheW1lbnRfYWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDIKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF9nZXRfcG9zaXRpb25bcm91dGluZ10oKSAtPiB2b2lkOgphY2NvdW50X2dldF9wb3NpdGlvbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg0MTIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI1OQogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmNvbnRyYWN0X2NyZWF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X2NyZWF0ZToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDM2CiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gYXJyYW5nZXIKICAgIGJ5dGVjIDE4IC8vIDB4NTIzYTQxNTI1MjIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAzNwogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9jb25maWdbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9jb25maWc6CiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAzOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGxlbgogICAgcHVzaGludCAxMDcKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuTm9ybWFsaXplZEFjdHVzVGVybXMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDcyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLkluaXRpYWxLZXJuZWxTdGF0ZQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIGxlbgogICAgZGlnIDEKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgdHVwbGUgZW5jb2RpbmcKICAgIGR1cAogICAgcHVzaGludCAzNAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHRhaWwgcG9pbnRlciBhdCBpbmRleCAxIG9mICh1aW50OFszMl0sKGxlbit1dGY4W10pKQogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBjb3ZlciAzCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAzNgogICAgKwogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5Qcm9zcGVjdHVzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDY5CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNzEtMTA3MgogICAgLy8gIyBDb25maWd1cmUgQ29udHJhY3QKICAgIC8vIHNlbGYuY29udHJhY3RfdHlwZSA9IHRlcm1zLmNvbnRyYWN0X3R5cGUuYXNfdWludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjEtMjI4CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICBieiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIzCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfQU5OKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjEtMjI4CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjQKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgcHVzaGludCAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjEtMjI4CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjUKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjEtMjI4CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjYKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgcHVzaGludCA0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjEtMjI4CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANwogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjcKICAgIC8vIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMjEtMjI4CiAgICAvLyByZXR1cm4gY29udHJhY3RfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX1BBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0FOTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX05BTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBTSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0xBWCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkNUX0NMTSksCiAgICAvLyApCiAgICA9PQogICAgYnogY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAOAoKY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUA3OgogICAgaW50Y18xIC8vIDEKCmNvbnRyYWN0X2NvbmZpZ19ib29sX21lcmdlQDk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMzIKICAgIC8vIGFzc2VydCBzZWxmLl9pc19zdXBwb3J0ZWRfY29udHJhY3RfdHlwZShjb250cmFjdF90eXBlKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc0CiAgICAvLyBzZWxmLl9zdG9yZV9jb250cmFjdF9jb25maWcoc2VsZi5jb250cmFjdF90eXBlLCB0ZXJtcywgaW5pdGlhbF9zdGF0ZSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBidXJ5IDIKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMjgKICAgIC8vIGFzc2VydCB0ZXJtcy5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBkaWcgNAogICAgZHVwCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDgKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMzMAogICAgLy8gdGVybXMuZGF5X2NvdW50X2NvbnZlbnRpb24uYXNfdWludDY0KCkKICAgIHB1c2hpbnQgNTcKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDAtMzA2CiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgIGJ6IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGRpZyA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDIKICAgIC8vIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzAwLTMwNgogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGRpZyA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDMKICAgIC8vIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICBwdXNoaW50IDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMwMC0zMDYKICAgIC8vIHJldHVybiBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzYwKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwSVNEQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjApLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDE2CiAgICBkaWcgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzA0CiAgICAvLyBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDAtMzA2CiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgID09CiAgICBibnogY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUAxNgogICAgZGlnIDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMwNQogICAgLy8gVUludDY0KGVudW1zLkRDQ18zMEUzNjApLAogICAgcHVzaGludCA0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDAtMzA2CiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgID09CiAgICBieiBjb250cmFjdF9jb25maWdfYm9vbF9mYWxzZUAxNwoKY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUAxNjoKICAgIGludGNfMSAvLyAxCgpjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUAxODoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxMi0zMTQKICAgIC8vIGFzc2VydCBzZWxmLl9pc19zdXBwb3J0ZWRfZGF5X2NvdW50X2NvbnZlbnRpb24oCiAgICAvLyAgICAgZGF5X2NvdW50X2NvbnZlbnRpb24KICAgIC8vICksIGVyci5JTlZBTElEX0RBWV9DT1VOVF9DT05WRU5USU9OCiAgICBhc3NlcnQgLy8gSW52YWxpZCBkYXktY291bnQgY29udmVudGlvbiBJRAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzMyCiAgICAvLyBpZiBjb250cmFjdF90eXBlICE9IFVJbnQ2NChlbnVtcy5DVF9BTk4pOgogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgIT0KICAgIGJ6IGNvbnRyYWN0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDIwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzMKICAgIC8vIGFzc2VydCBub3QgdGVybXMuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBkaWcgNAogICAgcHVzaGludCA3ODYKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgoKY29udHJhY3RfY29uZmlnX2FmdGVyX2lmX2Vsc2VAMjA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTAKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTEKICAgIC8vIGFzc2VydCBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID09IFVJbnQ2NCgwKSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBELUFTQSBhbHJlYWR5IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgxMy04MTQKICAgIC8vICMgU2V0IERlbm9taW5hdGlvbiBBc3NldAogICAgLy8gc2VsZi5fYXNzZXJ0X2Rlbm9taW5hdGlvbl9hc3NldCh0ZXJtcy5kZW5vbWluYXRpb25fYXNzZXRfaWQpCiAgICBkaWcgNAogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc3OC03NzkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gZGVub21pbmF0aW9uIHdpdGggQVNBCiAgICAvLyBfY3JlYXRvciwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfY3JlYXRvcihkZW5vbWluYXRpb25fYXNzZXRfaWQpCiAgICBkdXAKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc4MAogICAgLy8gYXNzZXJ0IGV4aXN0cywgZXJyLklOVkFMSURfREVOT01JTkFUSU9OCiAgICBhc3NlcnQgLy8gRGVub21pbmF0aW9uIGFzc2V0IGlzIG5vdCBwcm9wZXJseSBzZXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc4MwogICAgLy8gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgPSBkZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIGJ5dGVjIDQ0IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgxNy04MTgKICAgIC8vICMgU2V0IFNldHRsZW1lbnQgQXNzZXQKICAgIC8vIHNlbGYuX2Fzc2VydF9zZXR0bGVtZW50X2Fzc2V0KHRlcm1zLnNldHRsZW1lbnRfYXNzZXRfaWQpCiAgICBkaWcgMQogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Nzg4CiAgICAvLyBzZXR0bGVtZW50X2Fzc2V0X2lkID09IHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc4Ni03ODkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzZXR0bGVtZW50IGFzc2V0IGlzIHRoZSBkZW5vbWluYXRpb24gYXNzZXQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgLy8gKSwgZXJyLklOVkFMSURfU0VUVExFTUVOVF9BU1NFVAogICAgYXNzZXJ0IC8vIERpZmZlcmVudCBzZXR0bGVtZW50IGFzc2V0IG5vdCBzdXBwb3J0ZWQsIG11c3QgYmUgZXF1YWwgdG8gZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3OTIKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCA9IHNldHRsZW1lbnRfYXNzZXRfaWQKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3OTMtNzk5CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3OTgKICAgIC8vIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3OTYKICAgIC8vIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Nzk3CiAgICAvLyBhc3NldF9hbW91bnQ9MCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3OTMtNzk0CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc5My03OTkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gc2V0dGxlbWVudCB3aXRoIEFTQQogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PTAsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MjEtODIyCiAgICAvLyAjIFVuaXRzCiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzID0gdGVybXMudG90YWxfdW5pdHMKICAgIGR1cAogICAgcHVzaGludCAxNwogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MjMKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODI1LTgyNgogICAgLy8gIyBEYXktQ291bnQgQ29udmVudGlvbnMKICAgIC8vIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPSB0ZXJtcy5kYXlfY291bnRfY29udmVudGlvbi5hc191aW50NjQoKQogICAgYnl0ZWMgNDYgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgZGlnIDgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MjgtODI5CiAgICAvLyAjIFRpbWUKICAgIC8vIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlID0gdGVybXMuaW5pdGlhbF9leGNoYW5nZV9kYXRlCiAgICBkdXAKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAyOCAvLyAiaW5pdGlhbF9leGNoYW5nZV9kYXRlIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MzAKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IHRlcm1zLm1hdHVyaXR5X2RhdGUKICAgIGRpZyAxCiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNDUgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzMQogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gaW5pdGlhbF9zdGF0ZS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBkaWcgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBwdXNoaW50IDQ4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODMzLTgzNAogICAgLy8gIyBQcmluY2lwYWwKICAgIC8vIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPSB0ZXJtcy5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudAogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgZGlnIDEwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODM1CiAgICAvLyBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSB0ZXJtcy5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBkaWcgMwogICAgcHVzaGludCA3ODYKICAgIGdldGJpdAogICAgYnl0ZWMgMzQgLy8gImR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODM2CiAgICAvLyBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9IGluaXRpYWxfc3RhdGUub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBkaWcgMQogICAgcHVzaGludCAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MzgtODM5CiAgICAvLyAjIEludGVyZXN0CiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgPSBpbml0aWFsX3N0YXRlLmFjY3J1ZWRfaW50ZXJlc3QKICAgIGRpZyAxCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDEtODQyCiAgICAvLyAjIEludGVyZXN0IFJhdGUKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gaW5pdGlhbF9zdGF0ZS5ub21pbmFsX2ludGVyZXN0X3JhdGUKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQzCiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBpbml0aWFsX3N0YXRlLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UKICAgIGRpZyAxCiAgICBwdXNoaW50IDI0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDQKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQgPSB0ZXJtcy5yYXRlX3Jlc2V0X3NwcmVhZAogICAgZGlnIDMKICAgIHB1c2hpbnQgNTgKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzNSAvLyAicmF0ZV9yZXNldF9zcHJlYWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQ1CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciA9IHRlcm1zLnJhdGVfcmVzZXRfbXVsdGlwbGllcgogICAgZGlnIDMKICAgIHB1c2hpbnQgNjYKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzNiAvLyAicmF0ZV9yZXNldF9tdWx0aXBsaWVyIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0NgogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X2Zsb29yID0gdGVybXMucmF0ZV9yZXNldF9mbG9vcgogICAgZGlnIDMKICAgIHB1c2hpbnQgNzQKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzMSAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDcKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9jYXAgPSB0ZXJtcy5yYXRlX3Jlc2V0X2NhcAogICAgZGlnIDMKICAgIHB1c2hpbnQgODIKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzMiAvLyAicmF0ZV9yZXNldF9jYXAiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQ4CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfbmV4dCA9IHRlcm1zLnJhdGVfcmVzZXRfbmV4dAogICAgZGlnIDMKICAgIHB1c2hpbnQgOTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAzNyAvLyAicmF0ZV9yZXNldF9uZXh0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0OQogICAgLy8gc2VsZi5oYXNfcmF0ZV9yZXNldF9mbG9vciA9IHRlcm1zLmhhc19yYXRlX3Jlc2V0X2Zsb29yCiAgICBkaWcgMwogICAgcHVzaGludCA3ODQKICAgIGdldGJpdAogICAgYnl0ZWMgMzggLy8gImhhc19yYXRlX3Jlc2V0X2Zsb29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg1MAogICAgLy8gc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgPSB0ZXJtcy5oYXNfcmF0ZV9yZXNldF9jYXAKICAgIGRpZyAzCiAgICBwdXNoaW50IDc4NQogICAgZ2V0Yml0CiAgICBieXRlYyAzOSAvLyAiaGFzX3JhdGVfcmVzZXRfY2FwIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg1Mi04NTMKICAgIC8vICMgU2NhbGluZwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSA9IHRlcm1zLmZpeGVkX3BvaW50X3NjYWxlCiAgICB1bmNvdmVyIDMKICAgIHB1c2hpbnQgOTkKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NTUtODU2CiAgICAvLyAjIFNjaGVkdWxlIFByb2Nlc3NpbmcKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yID0gaW5pdGlhbF9zdGF0ZS5ldmVudF9jdXJzb3IKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NTgtODU5CiAgICAvLyAjIFBlci1Vbml0IEZpeGVkLVBvaW50IEluZGV4ZXMKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCA9IGluaXRpYWxfc3RhdGUuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleAogICAgZGlnIDEKICAgIHB1c2hpbnQgNTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NjAKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggPSBpbml0aWFsX3N0YXRlLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4CiAgICBkaWcgMQogICAgcHVzaGludCA2NAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NjItODYzCiAgICAvLyAjIFJlc2VydmVkIEFtb3VudCAoZm9yIGV4ZWN1dGVkIGNhc2hmbG93cykKICAgIC8vIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDE1IC8vICJyZXNlcnZlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODY0CiAgICAvLyBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODY2CiAgICAvLyBhc3NlcnQgdGVybXMuaW5pdGlhbF9leGNoYW5nZV9kYXRlID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsIGVyci5JTlZBTElEX0lFRAogICAgZGlnIDIKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgID4KICAgIGFzc2VydCAvLyBJRUQgbXVzdCBiZSBzZXQgaW4gdGhlIGZ1dHVyZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODY3CiAgICAvLyBhc3NlcnQgdGVybXMuaW5pdGlhbF9leGNoYW5nZV9kYXRlID4gaW5pdGlhbF9zdGF0ZS5zdGF0dXNfZGF0ZSwgZXJyLklOVkFMSURfSUVECiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICA8CiAgICBhc3NlcnQgLy8gSUVEIG11c3QgYmUgc2V0IGluIHRoZSBmdXR1cmUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2OAogICAgLy8gYXNzZXJ0IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA8IHRlcm1zLm1hdHVyaXR5X2RhdGUsIGVyci5JTlZBTElEX0lFRAogICAgPAogICAgYXNzZXJ0IC8vIElFRCBtdXN0IGJlIHNldCBpbiB0aGUgZnV0dXJlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc2LTEwNzcKICAgIC8vICMgTm90YXJpemUgcHJvc3BlY3R1cyAob3B0aW9uYWwpCiAgICAvLyBzZWxmLnByb3NwZWN0dXNfaGFzaCA9IHByb3NwZWN0dXMuaGFzaC5ieXRlcwogICAgZGlnIDIKICAgIGV4dHJhY3QgMCAzMgogICAgYnl0ZWMgNDIgLy8gInByb3NwZWN0dXNfaGFzaCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc4CiAgICAvLyBzZWxmLnByb3NwZWN0dXNfdXJsID0gcHJvc3BlY3R1cy51cmwKICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgYnl0ZWMgNDMgLy8gInByb3NwZWN0dXNfdXJsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNzkKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAzOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpjb250cmFjdF9jb25maWdfYm9vbF9mYWxzZUAxNzoKICAgIGludGNfMCAvLyAwCiAgICBiIGNvbnRyYWN0X2NvbmZpZ19ib29sX21lcmdlQDE4Cgpjb250cmFjdF9jb25maWdfYm9vbF9mYWxzZUA4OgogICAgaW50Y18wIC8vIDAKICAgIGIgY29udHJhY3RfY29uZmlnX2Jvb2xfbWVyZ2VAOQoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmNvbnRyYWN0X3NjaGVkdWxlW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3Rfc2NoZWR1bGU6CiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwODEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgc3dhcAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGR1cAogICAgcHVzaGludCA2NQogICAgKgogICAgcHVzaGludCAyCiAgICArCiAgICB1bmNvdmVyIDIKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeT4KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMTMKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTExNgogICAgLy8gY29udHJhY3RfdHlwZT1zZWxmLmNvbnRyYWN0X3R5cGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgY292ZXIgMwogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg4NAogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuQUxSRUFEWV9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBELUFTQSBhbHJlYWR5IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg4NS04ODcKICAgIC8vIGFzc2VydCBzY2hlZHVsZV9wYWdlLmxlbmd0aCA8PSBVSW50NjQoCiAgICAvLyAgICAgY3N0LlNDSEVEVUxFX1BBR0VfU0laRQogICAgLy8gKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZHVwCiAgICBwdXNoaW50IDE2CiAgICA8PQogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODg4CiAgICAvLyBhc3NlcnQgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCA+IFVJbnQ2NCgwKSwgZXJyLlRFUk1TX05PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIHRlcm1zIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTAKICAgIC8vIHBhZ2VfY3Vyc29yID0gc2NoZWR1bGVfcGFnZV9pbmRleCAqIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKQogICAgc3dhcAogICAgcHVzaGludCAxNgogICAgKgogICAgc3dhcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODk3CiAgICAvLyArIHBhZ2VfbGVuZ3RoICogVUludDY0KGNzdC5PUF9VUF9DT05UUkFDVF9DT05GSUdfUEVSX0VOVFJZX0JVREdFVCkKICAgIHB1c2hpbnQgMTAwCiAgICAqCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTYKICAgIC8vIFVJbnQ2NChjc3QuT1BfVVBfQ09OVFJBQ1RfQ09ORklHX0JBU0VfQlVER0VUKQogICAgaW50YyA0IC8vIDE1MDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg5Ni04OTcKICAgIC8vIFVJbnQ2NChjc3QuT1BfVVBfQ09OVFJBQ1RfQ09ORklHX0JBU0VfQlVER0VUKQogICAgLy8gKyBwYWdlX2xlbmd0aCAqIFVJbnQ2NChjc3QuT1BfVVBfQ09OVFJBQ1RfQ09ORklHX1BFUl9FTlRSWV9CVURHRVQpCiAgICArCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTItODk5CiAgICAvLyAjIFZhbGlkYXRpb24gY29zdCBncm93cyB3aXRoIHBhZ2UgbGVuZ3RoLCBzbyBjb25maWd1cmF0aW9uIGV4cGxpY2l0bHkKICAgIC8vICMgYnV5cyBleHRyYSBvcGNvZGUgYnVkZ2V0IGZvciBsYXJnZXIgdXBsb2Fkcy4KICAgIC8vIGVuc3VyZV9idWRnZXQoCiAgICAvLyAgICAgcmVxdWlyZWRfYnVkZ2V0PSgKICAgIC8vICAgICAgICAgVUludDY0KGNzdC5PUF9VUF9DT05UUkFDVF9DT05GSUdfQkFTRV9CVURHRVQpCiAgICAvLyAgICAgICAgICsgcGFnZV9sZW5ndGggKiBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19QRVJfRU5UUllfQlVER0VUKQogICAgLy8gICAgICksCiAgICAvLyApCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDAKICAgIC8vIGluZGV4ID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAoKY29udHJhY3Rfc2NoZWR1bGVfd2hpbGVfdG9wQDI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDEKICAgIC8vIHdoaWxlIGluZGV4IDwgcGFnZV9sZW5ndGg6CiAgICBkdXAKICAgIGRpZyA0CiAgICA8CiAgICBieiBjb250cmFjdF9zY2hlZHVsZV9hZnRlcl93aGlsZUAxMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTAyLTkwMwogICAgLy8gZW50cnkgPSBzY2hlZHVsZV9wYWdlW2luZGV4XS5jb3B5KCkKICAgIC8vIGVudHJ5X2V2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBkaWcgNAogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgYnVyeSAxMgogICAgZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgcHVzaGludCA2NQogICAgKgogICAgcHVzaGludCA2NQogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDMKICAgIC8vIGVudHJ5X2V2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkwMi05MDMKICAgIC8vIGVudHJ5ID0gc2NoZWR1bGVfcGFnZVtpbmRleF0uY29weSgpCiAgICAvLyBlbnRyeV9ldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgaW50Y18yIC8vIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkwMwogICAgLy8gZW50cnlfZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGdldGJ5dGUKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSAxMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTA0CiAgICAvLyBhc3NlcnQgZW50cnkuZXZlbnRfaWQgPT0gcGFnZV9jdXJzb3IgKyBpbmRleCwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgMTMKICAgIGRpZyA1CiAgICB1bmNvdmVyIDQKICAgICsKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgaWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkwNS05MDcKICAgIC8vIHNlbGYuX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGVudHJ5X2V2ZW50X3R5cGUKICAgIC8vICkKICAgIGRpZyA1CiAgICB1bmNvdmVyIDMKICAgIGNhbGxzdWIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDgKICAgIC8vIGFzc2VydCBlbnRyeS5zY2hlZHVsZWRfdGltZSA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBzd2FwCiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgMTAKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkwOQogICAgLy8gaWYgZW50cnkuZXZlbnRfaWQgPiBVSW50NjQoMCk6CiAgICBieiBjb250cmFjdF9zY2hlZHVsZV9hZnRlcl9pZl9lbHNlQDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkxMAogICAgLy8gaWYgaW5kZXggPiBVSW50NjQoMCk6CiAgICBkdXAKICAgIGJ6IGNvbnRyYWN0X3NjaGVkdWxlX2Vsc2VfYm9keUA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTEKICAgIC8vIHByZXZpb3VzX2VudHJ5ID0gc2NoZWR1bGVfcGFnZVtpbmRleCAtIFVJbnQ2NCgxKV0uY29weSgpCiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBwdXNoaW50IDY1CiAgICAqCiAgICBkaWcgMTEKICAgIHN3YXAKICAgIHB1c2hpbnQgNjUKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwoKY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTI2CiAgICAvLyBwcmV2aW91c19lbnRyeS5zY2hlZHVsZWRfdGltZSA8PSBlbnRyeS5zY2hlZHVsZWRfdGltZQogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDgKICAgIDw9CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjUtOTI3CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHByZXZpb3VzX2VudHJ5LnNjaGVkdWxlZF90aW1lIDw9IGVudHJ5LnNjaGVkdWxlZF90aW1lCiAgICAvLyApLCBlcnIuSU5WQUxJRF9TT1JUSU5HCiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbXVzdCBiZSBzb3J0ZWQgaW4gc3RyaWN0bHkgYXNjZW5kaW5nIG9yZGVyCgpjb250cmFjdF9zY2hlZHVsZV9hZnRlcl9pZl9lbHNlQDg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjgKICAgIC8vIGlmIGVudHJ5LmV2ZW50X2lkID09IFVJbnQ2NCgwKToKICAgIGRpZyA4CiAgICBibnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTI5LTkzMQogICAgLy8gYXNzZXJ0IGVudHJ5X2V2ZW50X3R5cGUgPT0gVUludDY0KAogICAgLy8gICAgIGVudW1zLkVWVF9JRUQKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZGlnIDkKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgoKY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzMgogICAgLy8gaW5kZXggKz0gVUludDY0KDEpCiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgY29udHJhY3Rfc2NoZWR1bGVfd2hpbGVfdG9wQDIKCmNvbnRyYWN0X3NjaGVkdWxlX2Vsc2VfYm9keUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTEzLTkxNQogICAgLy8gIyBUaGUgZmlyc3QgZW50cnkgb2YgYSBwYWdlIG11c3Qgc3RpbGwgYmUgb3JkZXJlZCBhZnRlciB0aGUKICAgIC8vICMgbGFzdCBlbnRyeSBvZiB0aGUgcHJldmlvdXMgcGFnZS4KICAgIC8vIGFzc2VydCBzY2hlZHVsZV9wYWdlX2luZGV4ID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9FVkVOVF9JRAogICAgZGlnIDYKICAgIGR1cAogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgaWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkxNgogICAgLy8gcHJldmlvdXNfcGFnZV9pbmRleCA9IHNjaGVkdWxlX3BhZ2VfaW5kZXggLSBVSW50NjQoMSkKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTgKICAgIC8vIHByZXZpb3VzX3BhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlCiAgICBpdG9iCiAgICBieXRlYyAyNCAvLyAweDUzMjMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkxNy05MTkKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgcHJldmlvdXNfcGFnZV9pbmRleCBpbiBzZWxmLnNjaGVkdWxlX3BhZ2UKICAgIC8vICksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkyMC05MjEKICAgIC8vIHByZXZpb3VzX3BhZ2UgPSBzZWxmLnNjaGVkdWxlX3BhZ2VbcHJldmlvdXNfcGFnZV9pbmRleF0uY29weSgpCiAgICAvLyBhc3NlcnQgcHJldmlvdXNfcGFnZS5sZW5ndGggPiBVSW50NjQoMCksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIHB1c2hpbnQgMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkyMQogICAgLy8gYXNzZXJ0IHByZXZpb3VzX3BhZ2UubGVuZ3RoID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBkdXAKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkyMwogICAgLy8gcHJldmlvdXNfcGFnZS5sZW5ndGggLSBVSW50NjQoMSkKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjItOTI0CiAgICAvLyBwcmV2aW91c19lbnRyeSA9IHByZXZpb3VzX3BhZ2VbCiAgICAvLyAgICAgcHJldmlvdXNfcGFnZS5sZW5ndGggLSBVSW50NjQoMSkKICAgIC8vIF0uY29weSgpCiAgICBwdXNoaW50IDY1CiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIHB1c2hpbnQgNjUKICAgIGJveF9leHRyYWN0CiAgICBiIGNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VANwoKY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfd2hpbGVAMTE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMDMKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHNjaGVkdWxlX3BhZ2UuY29weSgpCiAgICBkaWcgNgogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBkaWcgNQogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTM1CiAgICAvLyBpZiBpc19sYXN0X3BhZ2U6CiAgICBkaWcgNQogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUAxMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTM3CiAgICAvLyBzY2hlZHVsZV9wYWdlX2luZGV4ICogVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpICsgcGFnZV9sZW5ndGgKICAgIGRpZyAxCiAgICBkaWcgNAogICAgKwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTM2CiAgICAvLyBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50ID0gKAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MzYtOTM4CiAgICAvLyBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50ID0gKAogICAgLy8gICAgIHNjaGVkdWxlX3BhZ2VfaW5kZXggKiBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkgKyBwYWdlX2xlbmd0aAogICAgLy8gKQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzOQogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgcHVzaGludCA1MAogICAgYXBwX2dsb2JhbF9wdXQKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTIxCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwODEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmNvbnRyYWN0X2V4ZWN1dGVfaWVkW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfZXhlY3V0ZV9pZWQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDYKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE0NgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTQ3CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE0OAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTAKICAgIC8vIGFzc2VydCBzZWxmLmV2ZW50X2N1cnNvciA8IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICBkaWcgMQogICAgPgogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgY3Vyc29yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTUxCiAgICAvLyBlbnRyeSA9IHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLmV2ZW50X2N1cnNvcikKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1MgogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X3R5cGUgPT0gYXJjNC5VSW50OChlbnVtcy5FVlRfSUVEKSwgZXJyLklOVkFMSURfRVZFTlRfVFlQRQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgZHVwCiAgICBwdXNoYnl0ZXMgMHgwMQogICAgYj09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCB0eXBlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTU2CiAgICAvLyBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIGRpZyAxCiAgICBleHRyYWN0IDAgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1OAogICAgLy8gc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICBkaWcgMgogICAgZXh0cmFjdCA5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTkKICAgIC8vIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgZGlnIDMKICAgIGV4dHJhY3QgMTcgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE2MAogICAgLy8gcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZGlnIDQKICAgIGV4dHJhY3QgMjUgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE2MgogICAgLy8gbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9ZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBkaWcgNQogICAgZXh0cmFjdCAzMyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTYzCiAgICAvLyBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICBkaWcgNgogICAgZXh0cmFjdCA0MSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTY0CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1lbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIGRpZyA3CiAgICBleHRyYWN0IDQ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNjUKICAgIC8vIGZsYWdzPWVudHJ5LmZsYWdzLAogICAgZGlnIDgKICAgIGV4dHJhY3QgNTcgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1NS0xMTY2CiAgICAvLyB0eXAuT2JzZXJ2ZWRFdmVudFJlcXVlc3QoCiAgICAvLyAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBvYnNlcnZlZF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1lbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9ZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9ZW50cnkuZmxhZ3MsCiAgICAvLyApLAogICAgdW5jb3ZlciA3CiAgICB1bmNvdmVyIDgKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE2MQogICAgLy8gb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1NS0xMTY2CiAgICAvLyB0eXAuT2JzZXJ2ZWRFdmVudFJlcXVlc3QoCiAgICAvLyAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBvYnNlcnZlZF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1lbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9ZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9ZW50cnkuZmxhZ3MsCiAgICAvLyApLAogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTMtMTE2NwogICAgLy8gc2VsZi5fYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkoCiAgICAvLyAgICAgZW50cnksCiAgICAvLyAgICAgdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0KAogICAgLy8gICAgICAgICBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIC8vICAgICAgICAgZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgLy8gICAgICAgICBzY2hlZHVsZWRfdGltZT1lbnRyeS5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICAgICAgYWNjcnVhbF9mYWN0b3I9ZW50cnkuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICAgICAgb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPWVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPWVudHJ5Lm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPWVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgICAgICBmbGFncz1lbnRyeS5mbGFncywKICAgIC8vICAgICApLAogICAgLy8gKQogICAgY2FsbHN1YiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkKICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE2OAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTIzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5hcHBseV9ub25fY2FzaF9ldmVudFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFwcGx5X25vbl9jYXNoX2V2ZW50OgogICAgaW50Y18wIC8vIDAKICAgIGR1cG4gNAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwbiAyCiAgICBsZW4KICAgIHB1c2hpbnQgNzMKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuT2JzZXJ2ZWRFdmVudFJlcXVlc3QKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NgogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjA3CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIwOAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMTAKICAgIC8vIGlmIHBheWxvYWQuZmxhZ3MgJiBVSW50NjQoZW51bXMuRkxBR19PQlNFUlZFRF9FVkVOVCk6CiAgICBwdXNoaW50IDY1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBwdXNoaW50IDQKICAgICYKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjM2CiAgICAvLyByZXR1cm4gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9DTE0pCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIHB1c2hpbnQgNQogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMTEKICAgIC8vIGFzc2VydCBzZWxmLl9zdXBwb3J0c19vYnNlcnZlZF9ldmVudHMoKSwgZXJyLk9CU0VSVkVEX0VWRU5UX1JFUVVJUkVECiAgICBhc3NlcnQgLy8gT2JzZXJ2ZWQgZXZlbnQgcmVxdWlyZWQgdG8gZXhlY3V0ZSB0aGlzIGFjdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIxMgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMzYKICAgIC8vIHJldHVybiBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0NMTSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgZHVwCiAgICBwdXNoaW50IDUKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NDgKICAgIC8vIGFzc2VydCBzZWxmLl9zdXBwb3J0c19vYnNlcnZlZF9ldmVudHMoKSwgZXJyLk9CU0VSVkVEX0VWRU5UX1JFUVVJUkVECiAgICBhc3NlcnQgLy8gT2JzZXJ2ZWQgZXZlbnQgcmVxdWlyZWQgdG8gZXhlY3V0ZSB0aGlzIGFjdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQ5CiAgICAvLyBhc3NlcnQgcGF5bG9hZC5ldmVudF9pZCA9PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LCBlcnIuSU5WQUxJRF9FVkVOVF9JRAogICAgZGlnIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgNwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTEKICAgIC8vIHNlbGYuY29udHJhY3RfdHlwZSwgcGF5bG9hZC5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBkdXAKICAgIGV4dHJhY3QgOCAxCiAgICBidXJ5IDEyCiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTUwLTk1MgogICAgLy8gc2VsZi5fYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgc2VsZi5jb250cmFjdF90eXBlLCBwYXlsb2FkLmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIC8vICkKICAgIGNhbGxzdWIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTQKICAgIC8vIHBhZ2VfaW5kZXggPSBzZWxmLl9zY2hlZHVsZV9wYWdlX2luZGV4KHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxOTMKICAgIC8vIHJldHVybiBldmVudF9pZCAvLyBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkKICAgIHB1c2hpbnQgMTYKICAgIC8KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1NQogICAgLy8gcGFnZSA9IHR5cC5FeGVjdXRpb25TY2hlZHVsZVBhZ2UoKQogICAgYnl0ZWMgNDkgLy8gMHgwMDAwCiAgICBidXJ5IDcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1NgogICAgLy8gaWYgcGFnZV9pbmRleCBpbiBzZWxmLnNjaGVkdWxlX3BhZ2U6CiAgICBpdG9iCiAgICBieXRlYyAyNCAvLyAweDUzMjMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDkKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYWZ0ZXJfaWZfZWxzZUAyNwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTU3CiAgICAvLyBwYWdlID0gc2VsZi5zY2hlZHVsZV9wYWdlW3BhZ2VfaW5kZXhdLmNvcHkoKQogICAgZGlnIDcKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGJ1cnkgNwogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfcGFnZSBlbnRyeSBleGlzdHMKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMjc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTgKICAgIC8vIGFzc2VydCBwYWdlLmxlbmd0aCA8IFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZGlnIDUKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgcHVzaGludCAxNgogICAgPAogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTYzCiAgICAvLyBzY2hlZHVsZWRfdGltZT1wYXlsb2FkLnNjaGVkdWxlZF90aW1lLAogICAgZGlnIDMKICAgIGR1cAogICAgZXh0cmFjdCA5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2NAogICAgLy8gYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIGRpZyAxCiAgICBleHRyYWN0IDE3IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2NQogICAgLy8gcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICBkaWcgMgogICAgZXh0cmFjdCAyNSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjYKICAgIC8vIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPXBheWxvYWQubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBkaWcgMwogICAgZXh0cmFjdCA0MSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjcKICAgIC8vIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgZGlnIDQKICAgIGV4dHJhY3QgNDkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTY4CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1wYXlsb2FkLm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgdW5jb3ZlciA1CiAgICBleHRyYWN0IDU3IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2MC05NzAKICAgIC8vIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgIGV2ZW50X2lkPXBheWxvYWQuZXZlbnRfaWQsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1wYXlsb2FkLmV2ZW50X3R5cGUsCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPXBheWxvYWQubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1wYXlsb2FkLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICBmbGFncz1wYXlsb2FkLmZsYWdzLAogICAgLy8gKQogICAgZGlnIDExCiAgICBpdG9iCiAgICBkaWcgMTgKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1OS05NzEKICAgIC8vIHBhZ2UuYXBwZW5kKAogICAgLy8gICAgIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgICAgICBldmVudF9pZD1wYXlsb2FkLmV2ZW50X2lkLAogICAgLy8gICAgICAgICBldmVudF90eXBlPXBheWxvYWQuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICAgICAgYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPXBheWxvYWQubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1wYXlsb2FkLm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgICAgICBmbGFncz1wYXlsb2FkLmZsYWdzLAogICAgLy8gICAgICkKICAgIC8vICkKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk3MgogICAgLy8gc2VsZi5zY2hlZHVsZV9wYWdlW3BhZ2VfaW5kZXhdID0gcGFnZS5jb3B5KCkKICAgIGRpZyA4CiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTczCiAgICAvLyBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50ICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMTUKICAgIC8vIGFzc2VydCBldmVudF9pZCA9PSBzZWxmLmV2ZW50X2N1cnNvciwgZXJyLklOVkFMSURfRVZFTlRfQ1VSU09SCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGRpZyAzCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGN1cnNvcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIxNgogICAgLy8gZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoZXZlbnRfaWQpCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIGR1cAogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjE4CiAgICAvLyBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBkdXAKICAgIGV4dHJhY3QgOCAxCiAgICBidXJ5IDEwCiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2NwogICAgLy8gVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2Ni0zNzMKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lFRCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9SUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9SUkYpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX3RydWVAMTUKICAgIGRpZyA0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjgKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgcHVzaGludCA0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjYtMzczCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY5CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIHB1c2hpbnQgMTIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2Ni0zNzMKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lFRCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9SUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9SUkYpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX3RydWVAMTUKICAgIGRpZyA0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNzAKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIHB1c2hpbnQgMTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2Ni0zNzMKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lFRCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9SUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9SUkYpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX3RydWVAMTUKICAgIGRpZyA0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNzEKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICBwdXNoaW50IDE4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjYtMzczCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzcyCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICBwdXNoaW50IDUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2Ni0zNzMKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lFRCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9SUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9SUkYpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfZmFsc2VAMTYKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNToKICAgIGludGNfMSAvLyAxCgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX21lcmdlQDE3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIxNy0xMjE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfaXNfbm9uX2Nhc2goCiAgICAvLyAgICAgZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgLy8gKSwgZXJyLklOVkFMSURfRVZFTlRfVFlQRQogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIyMAogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X3R5cGUgIT0gYXJjNC5VSW50OChlbnVtcy5FVlRfSUVEKSwgZXJyLklOVkFMSURfRVZFTlRfVFlQRQogICAgZGlnIDgKICAgIHB1c2hieXRlcyAweDAxCiAgICBiIT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IHR5cGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM3NwogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKFVJbnQ2NChlbnVtcy5FVlRfUlIpLCBVSW50NjQoZW51bXMuRVZUX1JSRikpCiAgICBkaWcgNAogICAgcHVzaGludCAxMgogICAgPT0KICAgIGJueiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX3RydWVAMjEKICAgIGRpZyA0CiAgICBwdXNoaW50IDExCiAgICA9PQogICAgYnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9mYWxzZUAyMgoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDIxOgogICAgaW50Y18xIC8vIDEKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfbWVyZ2VAMjM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjIxCiAgICAvLyBpZiBzZWxmLl9ldmVudF9pc19yYXRlX3Jlc2V0KGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkpOgogICAgYnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfZWxzZV9ib2R5QDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4MAogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYub2JzZXJ2ZXIsIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyNSAvLyAweDUyM2E0ZDRmNDMyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIyNQogICAgLy8gc2VsZi5fYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkoZW50cnksIHBheWxvYWQpCiAgICBkaWcgNgogICAgZGlnIDIKICAgIGNhbGxzdWIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5CiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMjYKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE3MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgphcHBseV9ub25fY2FzaF9ldmVudF9lbHNlX2JvZHlANToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMjQKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgYiBhcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDYKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfZmFsc2VAMjI6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX21lcmdlQDIzCgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX2ZhbHNlQDE2OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9tZXJnZUAxNwoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50W3JvdXRpbmddKCkgLT4gdm9pZDoKYXBwZW5kX29ic2VydmVkX2Nhc2hfZXZlbnQ6CiAgICBpbnRjXzAgLy8gMAogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjI4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cG4gMgogICAgbGVuCiAgICBwdXNoaW50IDY1CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLk9ic2VydmVkQ2FzaEV2ZW50UmVxdWVzdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQ2CiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyNTcKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI1OAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyNTkKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzgKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTUwCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuX3N0YXR1c19pc19wZW5kaW5nX2llZCgpLCBlcnIuUEVORElOR19JRUQKICAgICEKICAgIGFzc2VydCAvLyBJRUQgbm90IHlldCBleGVjdXRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjM2CiAgICAvLyByZXR1cm4gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9DTE0pCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIHB1c2hpbnQgNQogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4NAogICAgLy8gYXNzZXJ0IHNlbGYuX3N1cHBvcnRzX29ic2VydmVkX2V2ZW50cygpLCBlcnIuT0JTRVJWRURfRVZFTlRfUkVRVUlSRUQKICAgIGFzc2VydCAvLyBPYnNlcnZlZCBldmVudCByZXF1aXJlZCB0byBleGVjdXRlIHRoaXMgYWN0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5ODUKICAgIC8vIGFzc2VydCBwYXlsb2FkLmV2ZW50X2lkID09IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQsIGVyci5JTlZBTElEX0VWRU5UX0lECiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICBzd2FwCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5ODYKICAgIC8vIGFzc2VydCBwYXlsb2FkLmV2ZW50X3R5cGUgPT0gYXJjNC5VSW50OChlbnVtcy5FVlRfUFIpLCBlcnIuSU5WQUxJRF9FVkVOVF9UWVBFCiAgICBkaWcgMQogICAgZXh0cmFjdCA4IDEKICAgIGR1cAogICAgY292ZXIgMwogICAgcHVzaGJ5dGVzIDB4MDMKICAgIGI9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTg3CiAgICAvLyBhc3NlcnQgcGF5bG9hZC5mbGFncyAmIFVJbnQ2NChlbnVtcy5GTEFHX0NBU0hfRVZFTlQpLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIHN3YXAKICAgIHB1c2hpbnQgNTcKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMSAvLyAxCiAgICAmCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5ODkKICAgIC8vIGlmIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgPiBVSW50NjQoMCk6CiAgICBieiBhcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5MQogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCAtIFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5MC05OTIKICAgIC8vIHByZXZpb3VzX2VudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KAogICAgLy8gICAgIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgLSBVSW50NjQoMSkKICAgIC8vICkKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTk0CiAgICAvLyBwcmV2aW91c19lbnRyeS5zY2hlZHVsZWRfdGltZSA8PSBwYXlsb2FkLnNjaGVkdWxlZF90aW1lCiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgNAogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgPD0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5My05OTUKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgcHJldmlvdXNfZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gcGF5bG9hZC5zY2hlZHVsZWRfdGltZQogICAgLy8gKSwgZXJyLklOVkFMSURfU09SVElORwogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIG11c3QgYmUgc29ydGVkIGluIHN0cmljdGx5IGFzY2VuZGluZyBvcmRlcgoKYXBwZW5kX29ic2VydmVkX2Nhc2hfZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTk3CiAgICAvLyBwYWdlX2luZGV4ID0gc2VsZi5fc2NoZWR1bGVfcGFnZV9pbmRleChzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTkzCiAgICAvLyByZXR1cm4gZXZlbnRfaWQgLy8gVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpCiAgICBwdXNoaW50IDE2CiAgICAvCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OTgKICAgIC8vIHBhZ2UgPSB0eXAuRXhlY3V0aW9uU2NoZWR1bGVQYWdlKCkKICAgIGJ5dGVjIDQ5IC8vIDB4MDAwMAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OTkKICAgIC8vIGlmIHBhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlOgogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA3CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VANQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAwMAogICAgLy8gcGFnZSA9IHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XS5jb3B5KCkKICAgIGRpZyA1CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidXJ5IDYKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX3BhZ2UgZW50cnkgZXhpc3RzCgphcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDAxCiAgICAvLyBhc3NlcnQgcGFnZS5sZW5ndGggPCBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGRpZyA0CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgMTYKICAgIDwKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMDYKICAgIC8vIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICBkaWcgNQogICAgZHVwCiAgICBleHRyYWN0IDkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAwNwogICAgLy8gYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIGRpZyAxCiAgICBleHRyYWN0IDE3IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMDgKICAgIC8vIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZGlnIDIKICAgIGV4dHJhY3QgMjUgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAwOQogICAgLy8gbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9cGF5bG9hZC5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIGRpZyAzCiAgICBleHRyYWN0IDMzIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMTAKICAgIC8vIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgZGlnIDQKICAgIGV4dHJhY3QgNDEgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAxMQogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIHVuY292ZXIgNQogICAgZXh0cmFjdCA0OSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDAzLTEwMTMKICAgIC8vIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgIGV2ZW50X2lkPXBheWxvYWQuZXZlbnRfaWQsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1wYXlsb2FkLmV2ZW50X3R5cGUsCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPXBheWxvYWQubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1wYXlsb2FkLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICBmbGFncz1wYXlsb2FkLmZsYWdzLAogICAgLy8gKQogICAgZGlnIDEwCiAgICBpdG9iCiAgICBkaWcgMTAKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMDItMTAxNAogICAgLy8gcGFnZS5hcHBlbmQoCiAgICAvLyAgICAgdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkoCiAgICAvLyAgICAgICAgIGV2ZW50X2lkPXBheWxvYWQuZXZlbnRfaWQsCiAgICAvLyAgICAgICAgIGV2ZW50X3R5cGU9cGF5bG9hZC5ldmVudF90eXBlLAogICAgLy8gICAgICAgICBzY2hlZHVsZWRfdGltZT1wYXlsb2FkLnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgICAgICBhY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPXBheWxvYWQucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9cGF5bG9hZC5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1wYXlsb2FkLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICAvLyAgICAgICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXBheWxvYWQubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgICAgIGZsYWdzPXBheWxvYWQuZmxhZ3MsCiAgICAvLyAgICAgKQogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAxNQogICAgLy8gc2VsZi5zY2hlZHVsZV9wYWdlW3BhZ2VfaW5kZXhdID0gcGFnZS5jb3B5KCkKICAgIGRpZyA2CiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAxNgogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjYzCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmNvbnRyYWN0X3NldF9kZWZhdWx0X3N0YXR1c1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X3NldF9kZWZhdWx0X3N0YXR1czoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyNjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo3NAogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYudHJ1c3RlZSwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDI2IC8vIDB4NTIzYTU0NTI1MzIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjc4CiAgICAvLyBzZWxmLmRlZmF1bHRlZCA9IGRlZmF1bHRlZAogICAgYnl0ZWMgNDcgLy8gImRlZmF1bHRlZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjc5CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyNjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmNvbnRyYWN0X2dldF9zdGF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X2dldF9zdGF0ZToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NgogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgZHVwCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyOTQKICAgIC8vIGNvbnRyYWN0X3R5cGU9YXJjNC5VSW50OChzZWxmLmNvbnRyYWN0X3R5cGUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgaW50Y18yIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjk2CiAgICAvLyB0b3RhbF91bml0cz1zZWxmLnRvdGFsX3VuaXRzLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyOTcKICAgIC8vIHJlc2VydmVkX3VuaXRzX3RvdGFsPXNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI5OAogICAgLy8gaW5pdGlhbF9leGNoYW5nZV9hbW91bnQ9c2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMCAvLyAiaW5pdGlhbF9leGNoYW5nZV9hbW91bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjk5CiAgICAvLyBldmVudF9jdXJzb3I9c2VsZi5ldmVudF9jdXJzb3IsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMDAKICAgIC8vIHNjaGVkdWxlX2VudHJ5X2NvdW50PXNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzAxCiAgICAvLyBvdXRzdGFuZGluZ19wcmluY2lwYWw9c2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMDIKICAgIC8vIGludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2U9c2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMDMKICAgIC8vIG5vbWluYWxfaW50ZXJlc3RfcmF0ZT1zZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMwNAogICAgLy8gYWNjcnVlZF9pbnRlcmVzdD1zZWxmLmFjY3J1ZWRfaW50ZXJlc3QsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMwNQogICAgLy8gY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleD1zZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMDYKICAgIC8vIGN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4PXNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTcgLy8gImN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMwNwogICAgLy8gcmVzZXJ2ZWRfaW50ZXJlc3Q9c2VsZi5yZXNlcnZlZF9pbnRlcmVzdCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzA4CiAgICAvLyByZXNlcnZlZF9wcmluY2lwYWw9c2VsZi5yZXNlcnZlZF9wcmluY2lwYWwsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjkzLTEzMDkKICAgIC8vIHJldHVybiB0eXAuS2VybmVsU3RhdGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZT1hcmM0LlVJbnQ4KHNlbGYuY29udHJhY3RfdHlwZSksCiAgICAvLyAgICAgc3RhdHVzPXNlbGYuc3RhdHVzLAogICAgLy8gICAgIHRvdGFsX3VuaXRzPXNlbGYudG90YWxfdW5pdHMsCiAgICAvLyAgICAgcmVzZXJ2ZWRfdW5pdHNfdG90YWw9c2VsZi5yZXNlcnZlZF91bml0c190b3RhbCwKICAgIC8vICAgICBpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudD1zZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50LAogICAgLy8gICAgIGV2ZW50X2N1cnNvcj1zZWxmLmV2ZW50X2N1cnNvciwKICAgIC8vICAgICBzY2hlZHVsZV9lbnRyeV9jb3VudD1zZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LAogICAgLy8gICAgIG91dHN0YW5kaW5nX3ByaW5jaXBhbD1zZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICBpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlPXNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSwKICAgIC8vICAgICBub21pbmFsX2ludGVyZXN0X3JhdGU9c2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgYWNjcnVlZF9pbnRlcmVzdD1zZWxmLmFjY3J1ZWRfaW50ZXJlc3QsCiAgICAvLyAgICAgY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleD1zZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgsCiAgICAvLyAgICAgY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXg9c2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCwKICAgIC8vICAgICByZXNlcnZlZF9pbnRlcmVzdD1zZWxmLnJlc2VydmVkX2ludGVyZXN0LAogICAgLy8gICAgIHJlc2VydmVkX3ByaW5jaXBhbD1zZWxmLnJlc2VydmVkX3ByaW5jaXBhbCwKICAgIC8vICkKICAgIHVuY292ZXIgMTQKICAgIGl0b2IKICAgIHVuY292ZXIgMTQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDEyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTEKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMAogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDkKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA4CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDYKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNAogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI4MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50W3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQ2CiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMjMKICAgIC8vIGlmIHNlbGYuZXZlbnRfY3Vyc29yID49IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQ6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgID49CiAgICBieiBjb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzI1CiAgICAvLyBldmVudF9pZD1zZWxmLmV2ZW50X2N1cnNvciwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMyNC0xMzM0CiAgICAvLyByZXR1cm4gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkoCiAgICAvLyAgICAgZXZlbnRfaWQ9c2VsZi5ldmVudF9jdXJzb3IsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1hcmM0LlVJbnQ4KDApLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPVVJbnQ2NCgwKSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249VUludDY0KDApLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPVVJbnQ2NCgwKSwKICAgIC8vICAgICBmbGFncz1VSW50NjQoMCksCiAgICAvLyApCiAgICBpdG9iCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzI2CiAgICAvLyBldmVudF90eXBlPWFyYzQuVUludDgoMCksCiAgICBieXRlYyA0MCAvLyAweDAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzI0LTEzMzQKICAgIC8vIHJldHVybiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1zZWxmLmV2ZW50X2N1cnNvciwKICAgIC8vICAgICBldmVudF90eXBlPWFyYzQuVUludDgoMCksCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9VUludDY0KDApLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9VUludDY0KDApLAogICAgLy8gICAgIGZsYWdzPVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMyNwogICAgLy8gc2NoZWR1bGVkX3RpbWU9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMjQtMTMzNAogICAgLy8gcmV0dXJuIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgIGV2ZW50X2lkPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgLy8gICAgIGV2ZW50X3R5cGU9YXJjNC5VSW50OCgwKSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1VSW50NjQoMCksCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1VSW50NjQoMCksCiAgICAvLyAgICAgZmxhZ3M9VUludDY0KDApLAogICAgLy8gKQogICAgaXRvYgogICAgc3dhcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0Cgpjb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnRfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnRANDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMzUKICAgIC8vIHJldHVybiBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoc2VsZi5ldmVudF9jdXJzb3IpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMxMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIGNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudF9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudEA0CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuY29udHJhY3RfdXBkYXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfdXBkYXRlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE1OS0xNjIKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBncmFudHMgdGhlIHVwZGF0ZSBwZXJtaXNzaW9ucyB0byB0aGUgQXJyYW5nZXIuCiAgICAvLyAjIOKaoO+4jyBXQVJOSU5HOiBBcHBsaWNhdGlvbiB1cGRhdGVzIG11c3QgYmUgZXhlY3V0ZWQgVkVSWSBjYXJlZnVsbHksIGFzIHRoZXkKICAgIC8vICMgbWlnaHQgaW50cm9kdWNlIGJyZWFraW5nIGNoYW5nZXMuCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3JvdGF0ZV9hcnJhbmdlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfcm90YXRlX2FycmFuZ2VyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzgKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE3OQogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IG5ld19hcnJhbmdlcgogICAgYnl0ZWMgMTggLy8gMHg1MjNhNDE1MjUyMjMKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTgwCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfc2V0X29wX2RhZW1vbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfc2V0X29wX2RhZW1vbjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTk2CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxOTcKICAgIC8vIHNlbGYub3BfZGFlbW9uLnZhbHVlID0gYWRkcmVzcwogICAgYnl0ZWMgMjcgLy8gMHg1MjNhNGY1MDQ0MjMKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTk4CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfYXNzaWduX3JvbGVbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2Fzc2lnbl9yb2xlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIHB1c2hpbnQgMTYKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuUm9sZVZhbGlkaXR5CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjIyCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjMKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI0CiAgICAvLyBzZWxmLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpKQogICAgYnRvaQogICAgZHVwbiAyCiAgICBjYWxsc3ViIF9hc3NlcnRfdmFsaWRfcm9sZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwMgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUik6CiAgICBwdXNoaW50IDIwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDMKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDE4IC8vIDB4NTIzYTQxNTI1MjIzCiAgICBkaWcgMwogICAgYXBwX2dsb2JhbF9wdXQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI2CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA2CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgNDAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwNwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjMgLy8gMHg1MjNhNGQ0ZTQ3MjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwOAogICAgLy8gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjUKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMiAvLyAweDUyM2E1MDU5NDQyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTEyCiAgICAvLyBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI1CiAgICAvLyBzZWxmLl9zZXRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIHZhbGlkaXR5KQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTQKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNjAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI2IC8vIDB4NTIzYTU0NTI1MzIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTYKICAgIC8vIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNQogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE4CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNzAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTkKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIxIC8vIDB4NTIzYTQxNTU1NDIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjAKICAgIC8vIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI1CiAgICAvLyBzZWxmLl9zZXRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIHZhbGlkaXR5KQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMTE6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIyCiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKToKICAgIGR1cAogICAgcHVzaGludCA4MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjMKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYub2JzZXJ2ZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjUgLy8gMHg1MjNhNGQ0ZjQzMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyNAogICAgLy8gc2VsZi5vYnNlcnZlcltyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19yZXZva2Vfcm9sZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfcmV2b2tlX3JvbGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjQ3CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNDgKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjQ5CiAgICAvLyBzZWxmLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpKQogICAgYnRvaQogICAgZHVwbiAyCiAgICBjYWxsc3ViIF9hc3NlcnRfdmFsaWRfcm9sZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyNwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgIT0gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBkdXAKICAgIHB1c2hpbnQgMjAKICAgICE9CiAgICBhc3NlcnQgLy8gSW52YWxpZCByb2xlIGlkZW50aWZpZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjgKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIHB1c2hpbnQgNDAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyOQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmFjY291bnRfbWFuYWdlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMyAvLyAweDUyM2E0ZDRlNDcyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMwCiAgICAvLyBkZWwgc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1MQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIyIC8vIDB4NTIzYTUwNTk0NDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzQKICAgIC8vIGRlbCBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1MAogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzYKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNjAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjYgLy8gMHg1MjNhNTQ1MjUzMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzOAogICAgLy8gZGVsIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTAKICAgIC8vIHNlbGYuX2RlbGV0ZV9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcykKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQwCiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNzAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMSAvLyAweDUyM2E0MTU1NTQyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQyCiAgICAvLyBkZWwgc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjUwCiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgODAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ1CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYub2JzZXJ2ZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjUgLy8gMHg1MjNhNGQ0ZjQzMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NgogICAgLy8gZGVsIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2NvbnRyYWN0X3N1c3BlbnNpb25bcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2NvbnRyYWN0X3N1c3BlbnNpb246CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjUzCiAgICAvLyBAYXJjNC5hYmltZXRob2QgICMgVE9ETzogVXBkYXRlIHNwZWNzIGFuZCBhZGQgdGVzdAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo3NwogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYXV0aG9yaXR5LCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjEgLy8gMHg1MjNhNDE1NTU0MjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNjkKICAgIC8vIHNlbGYuYXNzZXRfc3VzcGVuZGVkID0gc3VzcGVuZGVkCiAgICBieXRlYyAzMyAvLyAiYXNzZXRfc3VzcGVuZGVkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNzAKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kICAjIFRPRE86IFVwZGF0ZSBzcGVjcyBhbmQgYWRkIHRlc3QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9hcnJhbmdlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X2FycmFuZ2VyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4MwogICAgLy8gcmV0dXJuIHNlbGYuYXJyYW5nZXIudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOCAvLyAweDUyM2E0MTUyNTIyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYWRkcmVzc19yb2xlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg1CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwMwogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hY2NvdW50X21hbmFnZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjMgLy8gMHg1MjNhNGQ0ZTQ3MjMKICAgIGRpZyAxCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwNAogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5wcmltYXJ5X2RlYWxlciwgYWRkcmVzcyksCiAgICBieXRlYyAyMiAvLyAweDUyM2E1MDU5NDQyMwogICAgZGlnIDIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA1CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnRydXN0ZWUsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjYgLy8gMHg1MjNhNTQ1MjUzMjMKICAgIGRpZyAzCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwNgogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIGFkZHJlc3MpLAogICAgYnl0ZWMgMjEgLy8gMHg1MjNhNDE1NTU0MjMKICAgIGRpZyA0CiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwNwogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5vYnNlcnZlciwgYWRkcmVzcyksCiAgICBieXRlYyAyNSAvLyAweDUyM2E0ZDRmNDMyMwogICAgdW5jb3ZlciA1CiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlYyA0MCAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciA2CiAgICBzZXRiaXQKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDUKICAgIHNldGJpdAogICAgcHVzaGludCAyCiAgICB1bmNvdmVyIDQKICAgIHNldGJpdAogICAgcHVzaGludCAzCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgcHVzaGludCA0CiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOAogICAgLy8gcm9sZSA9IHJvbGVfaWQuYXNfdWludDY0KCkKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjkKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGUpCiAgICBkdXAKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzMxCiAgICAvLyBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKToKICAgIHB1c2hpbnRzIDIwIDQwIDUwIDYwIDcwIDgwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzMwLTM2MQogICAgLy8gbWF0Y2ggcm9sZToKICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKToKICAgIC8vICAgICAgICAgcmV0dXJuIHR5cC5Sb2xlVmFsaWRpdHkoCiAgICAvLyAgICAgICAgICAgICByb2xlX3ZhbGlkaXR5X3N0YXJ0PVVJbnQ2NCgwKSwgcm9sZV92YWxpZGl0eV9lbmQ9VUludDY0KDApCiAgICAvLyAgICAgICAgICkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSk6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSk6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgXzoKICAgIC8vICAgICAgICAgb3AuZXJyKGVyci5JTlZBTElEX1JPTEUpCiAgICB1bmNvdmVyIDYKICAgIG1hdGNoIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMEAyIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMUAzIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMkA0IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfM0A1IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNEA2IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzYxCiAgICAvLyBvcC5lcnIoZXJyLklOVkFMSURfUk9MRSkKICAgIGVyciAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV81QDc6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzU3CiAgICAvLyBzZWxmLm9ic2VydmVyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDI1IC8vIDB4NTIzYTRkNGY0MzIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzU2LTM1OAogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM1OQogICAgLy8gcmV0dXJuIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzRANjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTIKICAgIC8vIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDIxIC8vIDB4NTIzYTQxNTU1NDIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzUxLTM1MwogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTQKICAgIC8vIHJldHVybiBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzNANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNDcKICAgIC8vIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAyNiAvLyAweDUyM2E1NDUyNTMyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM0Ni0zNDgKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM0OQogICAgLy8gcmV0dXJuIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzJANDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNDIKICAgIC8vIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMjIgLy8gMHg1MjNhNTA1OTQ0MjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNDEtMzQzCiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzQ0CiAgICAvLyByZXR1cm4gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzFAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzcKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDIzIC8vIDB4NTIzYTRkNGU0NzIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzM2LTMzOAogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzkKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzBAMjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzItMzM0CiAgICAvLyByZXR1cm4gdHlwLlJvbGVWYWxpZGl0eSgKICAgIC8vICAgICByb2xlX3ZhbGlkaXR5X3N0YXJ0PVVJbnQ2NCgwKSwgcm9sZV92YWxpZGl0eV9lbmQ9VUludDY0KDApCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB2b2lkOgpfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZDoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNgogICAgLy8gZGVmIF9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHNlbGYsIGhvbGRpbmdfYWRkcmVzczogQWNjb3VudCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI4CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZCwgZXJyLlNVU1BFTkRFRAogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCAzODQKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIFN1c3BlbmRlZCBvcGVyYXRpb25zCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5fc2V0dGxlX3Bvc2l0aW9uKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NCwgdWludDY0Ogpfc2V0dGxlX3Bvc2l0aW9uOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjQ0CiAgICAvLyBkZWYgX3NldHRsZV9wb3NpdGlvbihzZWxmLCBob2xkaW5nX2FkZHJlc3M6IEFjY291bnQpIC0+IHR1cGxlW1VJbnQ2NCwgVUludDY0XToKICAgIHByb3RvIDEgMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjYxCiAgICAvLyBwb3NpdGlvbiA9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNvcHkoKQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo2My02NQogICAgLy8gIyBDb21wdXRlIHRoZSBpbmNyZW1lbnRhbCBwZXItdW5pdCBmaXhlZC1wb2ludCBpbnRlcmVzdCBhbmQgcHJpbmNpcGFsIGFjY3J1ZWQKICAgIC8vICMgc2luY2UgdGhpcyBhY2NvdW50J3MgbGFzdCBjaGVja3BvaW50LgogICAgLy8gaW50ZXJlc3RfZGVsdGEgPSBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggLSBwb3NpdGlvbi5pbnRlcmVzdF9jaGVja3BvaW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCBleGlzdHMKICAgIGRpZyAxCiAgICBwdXNoaW50IDU3CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjY3CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IC0gcG9zaXRpb24ucHJpbmNpcGFsX2NoZWNrcG9pbnQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggZXhpc3RzCiAgICBkaWcgMgogICAgcHVzaGludCA2NQogICAgZXh0cmFjdF91aW50NjQKICAgIC0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3MwogICAgLy8gaW50ZXJlc3RfZGVsdGEsIHBvc2l0aW9uLnVuaXRzLCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICBkaWcgMgogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjcwLTc0CiAgICAvLyAjIENvbnZlcnQgdGhlIHBlci11bml0IGZpeGVkLXBvaW50IGRlbHRhcyBpbnRvIGFic29sdXRlIGNsYWltYWJsZSBhbW91bnRzCiAgICAvLyAjIHVzaW5nIHRoZSBhY2NvdW50J3MgYWN0aXZlIHVuaXRzLgogICAgLy8gY2xhaW1hYmxlX2ludGVyZXN0ID0gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgaW50ZXJlc3RfZGVsdGEsIHBvc2l0aW9uLnVuaXRzLCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICAvLyApCiAgICB1bmNvdmVyIDMKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzYKICAgIC8vIHByaW5jaXBhbF9kZWx0YSwgcG9zaXRpb24udW5pdHMsIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3NS03NwogICAgLy8gY2xhaW1hYmxlX3ByaW5jaXBhbCA9IHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIHByaW5jaXBhbF9kZWx0YSwgcG9zaXRpb24udW5pdHMsIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUKICAgIC8vICkKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzktODEKICAgIC8vICMgQWNjcnVlIHRoZSBjbGFpbWFibGUgYW1vdW50cyB0byB0aGUgYWNjb3VudCBwb3NpdGlvbiBhbmQgbWFrZSB0aGVtIGF2YWlsYWJsZQogICAgLy8gIyBmb3Igd2l0aGRyYXdhbC4KICAgIC8vIHBvc2l0aW9uLmNsYWltYWJsZV9pbnRlcmVzdCArPSBjbGFpbWFibGVfaW50ZXJlc3QKICAgIGRpZyAyCiAgICBwdXNoaW50IDczCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDIKICAgICsKICAgIGl0b2IKICAgIHVuY292ZXIgMwogICAgc3dhcAogICAgcmVwbGFjZTIgNzMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo4MgogICAgLy8gcG9zaXRpb24uY2xhaW1hYmxlX3ByaW5jaXBhbCArPSBjbGFpbWFibGVfcHJpbmNpcGFsCiAgICBkdXAKICAgIHB1c2hpbnQgODEKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgKwogICAgaXRvYgogICAgcmVwbGFjZTIgODEKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo4NC04NgogICAgLy8gIyBBZHZhbmNlIHRoZSBhY2NvdW50J3MgcGVyLXVuaXQgZml4ZWQtcG9pbnQgY2hlY2twb2ludHMgdG8gdGhlIGN1cnJlbnQgZ2xvYmFsCiAgICAvLyAjIHBlci11bml0IGZpeGVkLXBvaW50IGdsb2JhbCBpbmRpY2VzLgogICAgLy8gcG9zaXRpb24uaW50ZXJlc3RfY2hlY2twb2ludCA9IHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggZXhpc3RzCiAgICBpdG9iCiAgICByZXBsYWNlMiA1NwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojg3CiAgICAvLyBwb3NpdGlvbi5wcmluY2lwYWxfY2hlY2twb2ludCA9IHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggZXhpc3RzCiAgICBpdG9iCiAgICByZXBsYWNlMiA2NQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojg5LTkwCiAgICAvLyAjIEFkdmFuY2UgdGhlIGFjY291bnQncyBldmVudCBjdXJzb3IgdG8gdGhlIGN1cnJlbnQgZ2xvYmFsIGV2ZW50IGN1cnNvci4KICAgIC8vIHBvc2l0aW9uLnNldHRsZWRfY3Vyc29yID0gc2VsZi5ldmVudF9jdXJzb3IKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaXRvYgogICAgcmVwbGFjZTIgNDkKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo5Mi05NAogICAgLy8gIyBVcGRhdGUgdGhlIGFjY291bnQgcG9zaXRpb24gYW5kIHJldHVybiB0aGUgbmV3bHkgYWNjcnVlZCBjbGFpbWFibGUgYW1vdW50cwogICAgLy8gIyBhZGRlZCB0byB0aGUgdG90YWwgcG9zaXRpb24ncyBjbGFpbWFibGUgYW1vdW50cy4KICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gcG9zaXRpb24uY29weSgpCiAgICB1bmNvdmVyIDMKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo5NQogICAgLy8gcmV0dXJuIGNsYWltYWJsZV9pbnRlcmVzdCwgY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQoaG9sZGluZ19hZGRyZXNzOiBieXRlcykgLT4gdm9pZDoKX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQ6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6OTcKICAgIC8vIGRlZiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZChzZWxmLCBob2xkaW5nX2FkZHJlc3M6IEFjY291bnQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzOAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTAwCiAgICAvLyBpZiBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKToKICAgIGJ6IF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwMQogICAgLy8gcmV0dXJuCiAgICByZXRzdWIKCl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDMKICAgIC8vIHBvc2l0aW9uID0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY29weSgpCiAgICBmcmFtZV9kaWcgMgogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA0CiAgICAvLyBpZiBwb3NpdGlvbi5yZXNlcnZlZF91bml0cyA9PSBVSW50NjQoMCk6CiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIGJueiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZF9hZnRlcl9pZl9lbHNlQDQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDUKICAgIC8vIHJldHVybgogICAgcmV0c3ViCgpfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZF9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA4CiAgICAvLyBwb3NpdGlvbi51bml0cyArPSBhY3RpdmF0ZWRfdW5pdHMKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDMKICAgICsKICAgIGl0b2IKICAgIHJlcGxhY2UyIDMyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA5CiAgICAvLyBwb3NpdGlvbi5yZXNlcnZlZF91bml0cyA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGl0b2IKICAgIHJlcGxhY2UyIDQwCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTEwCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHBvc2l0aW9uLmNvcHkoKQogICAgZnJhbWVfZGlnIDIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTEKICAgIC8vIGFzc2VydCBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID49IGFjdGl2YXRlZF91bml0cywgZXJyLk9WRVJfRElTVFJJQlVUSU9OCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIGV4aXN0cwogICAgZHVwCiAgICBkaWcgMgogICAgPj0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgcmVtYWluaW5nIEQtQVNBIHVuaXRzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTEyCiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIC09IGFjdGl2YXRlZF91bml0cwogICAgc3dhcAogICAgLQogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9zY2FsZWRfbXVsX2RpdihtdWx0aXBsaWNhbmQ6IHVpbnQ2NCwgbXVsdGlwbGllcjogdWludDY0LCBkaXZpc29yOiB1aW50NjQpIC0+IHVpbnQ2NDoKX3NjYWxlZF9tdWxfZGl2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTU2LTE1OAogICAgLy8gZGVmIF9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLCBtdWx0aXBsaWNhbmQ6IFVJbnQ2NCwgbXVsdGlwbGllcjogVUludDY0LCBkaXZpc29yOiBVSW50NjQKICAgIC8vICkgLT4gVUludDY0OgogICAgcHJvdG8gMyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjAKICAgIC8vIGlmIG11bHRpcGxpY2FuZCA9PSBVSW50NjQoMCkgb3IgbXVsdGlwbGllciA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTMKICAgIGJ6IF9zY2FsZWRfbXVsX2Rpdl9pZl9ib2R5QDIKICAgIGZyYW1lX2RpZyAtMgogICAgYm56IF9zY2FsZWRfbXVsX2Rpdl9hZnRlcl9pZl9lbHNlQDMKCl9zY2FsZWRfbXVsX2Rpdl9pZl9ib2R5QDI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjEKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9zY2FsZWRfbXVsX2Rpdl9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjIKICAgIC8vIGhpZ2gsIGxvdyA9IG9wLm11bHcobXVsdGlwbGljYW5kLCBtdWx0aXBsaWVyKQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIG11bHcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2MwogICAgLy8gcmV0dXJuIG9wLmRpdncoaGlnaCwgbG93LCBkaXZpc29yKQogICAgZnJhbWVfZGlnIC0xCiAgICBkaXZ3CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYW1vdW50X3RvX2luZGV4X2RlbHRhKGFtb3VudDogdWludDY0KSAtPiB1aW50NjQ6Cl9hbW91bnRfdG9faW5kZXhfZGVsdGE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjUKICAgIC8vIGRlZiBfYW1vdW50X3RvX2luZGV4X2RlbHRhKHNlbGYsIGFtb3VudDogVUludDY0KSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2NwogICAgLy8gaWYgYW1vdW50ID09IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMQogICAgYm56IF9hbW91bnRfdG9faW5kZXhfZGVsdGFfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjgKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9hbW91bnRfdG9faW5kZXhfZGVsdGFfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTY5CiAgICAvLyBhc3NlcnQgc2VsZi50b3RhbF91bml0cyA+IFVJbnQ2NCgwKSwgZXJyLk5PX1VOSVRTCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgZHVwCiAgICBhc3NlcnQgLy8gTm8gRC1BU0EgdW5pdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE3MAogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KGFtb3VudCwgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwgc2VsZi50b3RhbF91bml0cykKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2luZGV4X2RlbHRhX3RvX2Ftb3VudChpbmRleF9kZWx0YTogdWludDY0KSAtPiB1aW50NjQ6Cl9pbmRleF9kZWx0YV90b19hbW91bnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNzIKICAgIC8vIGRlZiBfaW5kZXhfZGVsdGFfdG9fYW1vdW50KHNlbGYsIGluZGV4X2RlbHRhOiBVSW50NjQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTc5CiAgICAvLyBpZiBpbmRleF9kZWx0YSA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGJueiBfaW5kZXhfZGVsdGFfdG9fYW1vdW50X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTgwCiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfaW5kZXhfZGVsdGFfdG9fYW1vdW50X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE4MgogICAgLy8gc2VsZi50b3RhbF91bml0cywKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxODQKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxODEtMTg1CiAgICAvLyByZXR1cm4gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgc2VsZi50b3RhbF91bml0cywKICAgIC8vICAgICBpbmRleF9kZWx0YSwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2dldF9zY2hlZHVsZV9lbnRyeShldmVudF9pZDogdWludDY0KSAtPiBieXRlczoKX2dldF9zY2hlZHVsZV9lbnRyeToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIwNQogICAgLy8gZGVmIF9nZXRfc2NoZWR1bGVfZW50cnkoc2VsZiwgZXZlbnRfaWQ6IFVJbnQ2NCkgLT4gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnk6CiAgICBwcm90byAxIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIwNwogICAgLy8gYXNzZXJ0IGV2ZW50X2lkIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgPgogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgaWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE5MwogICAgLy8gcmV0dXJuIGV2ZW50X2lkIC8vIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDE2CiAgICAvCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMDkKICAgIC8vIGFzc2VydCBwYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxOTcKICAgIC8vIHJldHVybiBldmVudF9pZCAlIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDE2CiAgICAlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMTIKICAgIC8vIGFzc2VydCBvZmZzZXQgPCBwYWdlLmxlbmd0aCwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBwdXNoaW50IDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgMQogICAgPgogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjEzCiAgICAvLyByZXR1cm4gcGFnZVtvZmZzZXRdLmNvcHkoKQogICAgcHVzaGludCA2NQogICAgKgogICAgcHVzaGludCAyCiAgICArCiAgICBwdXNoaW50IDY1CiAgICBib3hfZXh0cmFjdAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKGNvbnRyYWN0X3R5cGU6IHVpbnQ2NCwgZXZlbnRfdHlwZTogdWludDY0KSAtPiB2b2lkOgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTYtMzE4CiAgICAvLyBkZWYgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIHNlbGYsIGNvbnRyYWN0X3R5cGU6IFVJbnQ2NCwgZXZlbnRfdHlwZTogVUludDY0CiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1Ny0yNTgKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTAKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTctMjU4CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTEKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgaW50Y18yIC8vIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1Ny0yNTgKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1MgogICAgLy8gVUludDY0KGVudW1zLkVWVF9NRCksCiAgICBwdXNoaW50IDE5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTctMjU4CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTMKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgcHVzaGludCAxMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU3LTI1OAogICAgLy8gIyBDaGVjayBjb21tb24gZXZlbnRzIGZpcnN0CiAgICAvLyBpZiBldmVudF90eXBlIGluIGNvbW1vbl9ldmVudHM6CiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU0CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICBwdXNoaW50IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTctMjU4CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUA3CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU5CiAgICAvLyByZXR1cm4gVHJ1ZQogICAgaW50Y18xIC8vIDEKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzIwLTMyMgogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICByZXRzdWIKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNjEtMjYyCiAgICAvLyAjIENvbnRyYWN0LXNwZWNpZmljIGFkZGl0aW9uYWwgZXZlbnRzCiAgICAvLyBpZiBjb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9QQU0pOgogICAgZnJhbWVfZGlnIC0yCiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjYzLTI2NAogICAgLy8gIyBQQU0gb25seSBzdXBwb3J0cyBjb21tb24gZXZlbnRzCiAgICAvLyByZXR1cm4gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMjAtMzIyCiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNjYKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0xBTSkgb3IgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2Ni0yNjgKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0xBTSkgb3IgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoCiAgICAvLyAgICAgZW51bXMuQ1RfTkFNCiAgICAvLyApOgogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDExCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMgogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDE2CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUAxMToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2OS0yNzMKICAgIC8vICMgTEFNL05BTSBhZGQ6IFBSLCBJUENCCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjcxCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjY5LTI3MwogICAgLy8gIyBMQU0vTkFNIGFkZDogUFIsIElQQ0IKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDEzCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3MgogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIHB1c2hpbnQgMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2OS0yNzMKICAgIC8vICMgTEFNL05BTSBhZGQ6IFBSLCBJUENCCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICkKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF9mYWxzZUAxNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAxMzoKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMjAtMzIyCiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDE0OgogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMyMC0zMjIKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMTY6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzUKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTik6CiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMjMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3Ni0yODEKICAgIC8vICMgQU5OIGFkZHM6IFBSLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjc4CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjc2LTI4MQogICAgLy8gIyBBTk4gYWRkczogUFIsIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDIwCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIHB1c2hpbnQgMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3Ni0yODEKICAgIC8vICMgQU5OIGFkZHM6IFBSLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyMAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODAKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIHB1c2hpbnQgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjc2LTI4MQogICAgLy8gIyBBTk4gYWRkczogUFIsIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDIxCgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDIwOgogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMyMC0zMjIKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMjE6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzIwLTMyMgogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAyMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MwogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfTEFYKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA0CiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMzEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4NC0yOTAKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUiksCiAgICBwdXNoaW50IDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4NC0yOTAKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjgKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjg3CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjg0LTI5MAogICAgLy8gIyBMQVggYWRkczogUFIsIFBJLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyOAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODgKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICBwdXNoaW50IDE4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODQtMjkwCiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDI4CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODQtMjkwCiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDI5CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDI4OgogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMyMC0zMjIKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMjk6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzIwLTMyMgogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAzMToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI5MgogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQ0xNKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA1CiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMzMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI5My0yOTQKICAgIC8vICMgQ0xNIGFkZHM6IFBSCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1BSKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDMKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMjAtMzIyCiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDMzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk2CiAgICAvLyByZXR1cm4gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMjAtMzIyCiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5faXNfZHluYW1pY19hbm51aXR5KCkgLT4gdWludDY0OgpfaXNfZHluYW1pY19hbm51aXR5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM4CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzgtMzM5CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIC8vIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGJ6IF9pc19keW5hbWljX2FubnVpdHlfYm9vbF9mYWxzZUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzkKICAgIC8vIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzNCAvLyAiZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM4LTMzOQogICAgLy8gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICAvLyBhbmQgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBieiBfaXNfZHluYW1pY19hbm51aXR5X2Jvb2xfZmFsc2VAMwogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMzNy0zNDAKICAgIC8vIHJldHVybiAoCiAgICAvLyAgICAgc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICAvLyAgICAgYW5kIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgLy8gKQogICAgcmV0c3ViCgpfaXNfZHluYW1pY19hbm51aXR5X2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzctMzQwCiAgICAvLyByZXR1cm4gKAogICAgLy8gICAgIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKQogICAgLy8gICAgIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIC8vICkKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KGVudHJ5OiBieXRlcykgLT4gdWludDY0LCBieXRlczoKX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozODMKICAgIC8vIGRlZiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudChzZWxmLCBlbnRyeTogdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzkyCiAgICAvLyBlbnRyeS5hY2NydWFsX2ZhY3RvciA9PSBVSW50NjQoMCkKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAxNwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzkyLTM5NAogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGJ6IF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2lmX2JvZHlAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzkzCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzkyLTM5NAogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGJ6IF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2lmX2JvZHlAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzk0CiAgICAvLyBvciBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPT0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzkyLTM5NAogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGJueiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudF9hZnRlcl9pZl9lbHNlQDQKCl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2lmX2JvZHlAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NgogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2RpZyAtMQogICAgdW5jb3ZlciAyCiAgICByZXRzdWIKCl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5OAogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5OQogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQwMAogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5Ny00MDEKICAgIC8vIGFjY3J1ZWQgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICAvLyAgICAgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICkKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MDUKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MDItNDA2CiAgICAvLyByZXR1cm4gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgYWNjcnVlZCwKICAgIC8vICAgICBlbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICBmcmFtZV9kaWcgLTEKICAgIHVuY292ZXIgMgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yKGRpc2NvdW50X2ZhY3RvcjogdWludDY0LCByZWRlbXB0aW9uX2ZhY3RvcjogdWludDY0KSAtPiB1aW50NjQ6Cl9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ2NS00NjkKICAgIC8vIGRlZiBfZGlzY291bnRfYW5udWl0eV9mYWN0b3IoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBkaXNjb3VudF9mYWN0b3I6IFVJbnQ2NCwKICAgIC8vICAgICByZWRlbXB0aW9uX2ZhY3RvcjogVUludDY0LAogICAgLy8gKSAtPiBVSW50NjQ6CiAgICBwcm90byAyIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3MQogICAgLy8gaWYgcmVkZW1wdGlvbl9mYWN0b3IgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0xCiAgICBibnogX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDcyCiAgICAvLyByZXR1cm4gZGlzY291bnRfZmFjdG9yCiAgICBmcmFtZV9kaWcgLTIKICAgIHJldHN1YgoKX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3MwogICAgLy8gcGVyaW9kX3JhdGUgPSBzZWxmLmZpeGVkX3BvaW50X3NjYWxlICsgc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzQKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzMtNDc3CiAgICAvLyBwZXJpb2RfcmF0ZSA9IHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgKyBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICByZWRlbXB0aW9uX2ZhY3RvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICBkaWcgMgogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgICsKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3OAogICAgLy8gYXNzZXJ0IHBlcmlvZF9yYXRlID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGR1cAogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDgxCiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDc5LTQ4MwogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIGRpc2NvdW50X2ZhY3RvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gICAgIHBlcmlvZF9yYXRlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkoZW50cnk6IGJ5dGVzLCBwYXlsb2FkOiBieXRlcykgLT4gYnl0ZXMsIGJ5dGVzOgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MTYtNjE4CiAgICAvLyBkZWYgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5KAogICAgLy8gICAgIHNlbGYsIGVudHJ5OiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSwgcGF5bG9hZDogdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0CiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAyIDIKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjI2CiAgICAvLyBhc3NlcnQgZW50cnkuZXZlbnRfaWQgPT0gc2VsZi5ldmVudF9jdXJzb3IsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGN1cnNvcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjI3CiAgICAvLyBhc3NlcnQgZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsIGVyci5OT19EVUVfQ0FTSEZMT1cKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPD0KICAgIGFzc2VydCAvLyBObyBkdWUgY2FzaGZsb3cgdG8gcGF5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MjkKICAgIC8vIGV2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYzMAogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX0lFRCk6CiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGR1cAogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM4CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYzMS02MzMKICAgIC8vICMgSUVEIGZpbmFsaXplcyBpc3N1YW5jZTogcmVzZXJ2ZWQgdW5pdHMgYmVjb21lIGFjdGl2YXRhYmxlIGFuZCB0aGUKICAgIC8vICMgc2NoZWR1bGUncyBpbml0aWFsIGNvbnRyYWN0dWFsIHN0YXRlIGJlY29tZXMgbGl2ZS4KICAgIC8vIGFzc2VydCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzUKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPT0gc2VsZi50b3RhbF91bml0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM0LTYzNgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID09IHNlbGYudG90YWxfdW5pdHMKICAgIC8vICksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9JTkNPTVBMRVRFCiAgICBhc3NlcnQgLy8gUHJpbWFyeSBkaXN0cmlidXRpb24gaXMgbm90IGNvbXBsZXRlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzcKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM4CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzkKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAzMwogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NDAKICAgIC8vIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjQxCiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NDIKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0MwogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX0FDVElWRSkKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgMTAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDU0CiAgICAvLyBhc3NlcnQgZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSA9PSBVSW50NjQoZW51bXMuRVZUX0lFRCksIGVyci5OT1RfRVZUX0lFRAogICAgZnJhbWVfZGlnIDExCiAgICBhc3NlcnQgLy8gTm90IElFRCBldmVudAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDU1CiAgICAvLyByZXR1cm4gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0NC02NDgKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1zZWxmLl9lbnRyeV9pZWRfYW1vdW50KGVudHJ5KSwKICAgIC8vICAgICBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0NwogICAgLy8gc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0NC02NDgKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1zZWxmLl9lbnRyeV9pZWRfYW1vdW50KGVudHJ5KSwKICAgIC8vICAgICBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICAvLyApCiAgICBjYWxsc3ViIF9lbWl0X2V4ZWN1dGlvbl9ldmVudAogICAgZHVwCiAgICBmcmFtZV9idXJ5IC0yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NDkKICAgIC8vIHJldHVybgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM4CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE1MAogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1MgogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ICs9IHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBmcmFtZV9idXJ5IC0yCiAgICArCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1NAogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1JSKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCAxMgogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMTAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1OAogICAgLy8gcGF5bG9hZC5vYnNlcnZlZF9yYXRlLAogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjU5CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzNiAvLyAicmF0ZV9yZXNldF9tdWx0aXBsaWVyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2MAogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1NS02NjEKICAgIC8vICMgUlIgZGVyaXZlcyB0aGUgbmV4dCByYXRlIGZyb20gYW4gb2JzZXJ2ZWQgb3JhY2xlIHZhbHVlIHBsdXMgdGhlCiAgICAvLyAjIGNvbnRyYWN0IHNwcmVhZCAvIG11bHRpcGxpZXIgdGVybXMsIHRoZW4gZW5mb3JjZXMgZmxvb3IgYW5kIGNhcC4KICAgIC8vIG9ic2VydmVkX3JhdGUgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBwYXlsb2FkLm9ic2VydmVkX3JhdGUsCiAgICAvLyAgICAgc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICkKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjMKICAgIC8vIG9ic2VydmVkX3JhdGUgKyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzUgLy8gInJhdGVfcmVzZXRfc3ByZWFkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkIGV4aXN0cwogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDQKICAgIC8vIGlmIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgYW5kIHJhdGUgPCBzZWxmLnJhdGVfcmVzZXRfZmxvb3I6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzggLy8gImhhc19yYXRlX3Jlc2V0X2Zsb29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmhhc19yYXRlX3Jlc2V0X2Zsb29yIGV4aXN0cwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMSAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X2Zsb29yIGV4aXN0cwogICAgZnJhbWVfZGlnIDYKICAgID4KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDUKICAgIC8vIHJhdGUgPSBzZWxmLnJhdGVfcmVzZXRfZmxvb3IKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMSAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDYKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfZmxvb3IgZXhpc3RzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1NToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc0NgogICAgLy8gaWYgc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgYW5kIHJhdGUgPiBzZWxmLnJhdGVfcmVzZXRfY2FwOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDM5IC8vICJoYXNfcmF0ZV9yZXNldF9jYXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwIGV4aXN0cwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTgKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMiAvLyAicmF0ZV9yZXNldF9jYXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9jYXAgZXhpc3RzCiAgICBmcmFtZV9kaWcgNgogICAgPAogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc0NwogICAgLy8gcmF0ZSA9IHNlbGYucmF0ZV9yZXNldF9jYXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMiAvLyAicmF0ZV9yZXNldF9jYXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSA2CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X2NhcCBleGlzdHMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjYyCiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IHNlbGYuX2NsYW1wX3JhdGUoCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjItNjY0CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IHNlbGYuX2NsYW1wX3JhdGUoCiAgICAvLyAgICAgb2JzZXJ2ZWRfcmF0ZSArIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQKICAgIC8vICkKICAgIGZyYW1lX2RpZyA2CiAgICBhcHBfZ2xvYmFsX3B1dAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMTg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzQKICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QSSk6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMjAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY3NQogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzYKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDIzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjgxCiAgICAvLyBpZiBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKToKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAyOQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjgyCiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFJGKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCA1CiAgICA9PQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMzAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4NgogICAgLy8gKyAoc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCAtIHNlbGYuZXZlbnRfY3Vyc29yKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICAtCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODcKICAgIC8vICogVUludDY0KGNzdC5PUF9VUF9OT05fQ0FTSF9QRVJfRU5UUllfQlVER0VUKQogICAgcHVzaGludCAxMDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4Ni02ODcKICAgIC8vICsgKHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgLSBzZWxmLmV2ZW50X2N1cnNvcikKICAgIC8vICogVUludDY0KGNzdC5PUF9VUF9OT05fQ0FTSF9QRVJfRU5UUllfQlVER0VUKQogICAgKgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njg1CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX05PTl9DQVNIX0JBU0VfQlVER0VUKQogICAgaW50YyA0IC8vIDE1MDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4NS02ODcKICAgIC8vIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfQkFTRV9CVURHRVQpCiAgICAvLyArIChzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IC0gc2VsZi5ldmVudF9jdXJzb3IpCiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfUEVSX0VOVFJZX0JVREdFVCkKICAgICsKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4My02ODkKICAgIC8vIGVuc3VyZV9idWRnZXQoCiAgICAvLyAgICAgcmVxdWlyZWRfYnVkZ2V0PSgKICAgIC8vICAgICAgICAgVUludDY0KGNzdC5PUF9VUF9OT05fQ0FTSF9CQVNFX0JVREdFVCkKICAgIC8vICAgICAgICAgKyAoc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCAtIHNlbGYuZXZlbnRfY3Vyc29yKQogICAgLy8gICAgICAgICAqIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfUEVSX0VOVFJZX0JVREdFVCkKICAgIC8vICAgICApLAogICAgLy8gKQogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDkzCiAgICAvLyBkaXNjb3VudF9mYWN0b3IgPSBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5NAogICAgLy8gZGVub21pbmF0b3IgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5NQogICAgLy8gc2tpcF9maXJzdF9yZWRlbXB0aW9uID0gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5NwogICAgLy8gaWYgZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAyNQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgZnJhbWVfYnVyeSA4CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAzNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDk4LTUwMgogICAgLy8gIyBBbiBpbml0aWFsIFBSRiBtYXkgZGVzY3JpYmUgdGhlIGZpcnN0IHJlZGVtcHRpb24gcGVyaW9kIGRpcmVjdGx5LgogICAgLy8gZGlzY291bnRfZmFjdG9yID0gc2VsZi5fZGlzY291bnRfYW5udWl0eV9mYWN0b3IoCiAgICAvLyAgICAgZGlzY291bnRfZmFjdG9yLAogICAgLy8gICAgIGVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDgKICAgIGNhbGxzdWIgX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA0CiAgICAvLyBza2lwX2ZpcnN0X3JlZGVtcHRpb24gPSBUcnVlCiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfYnVyeSA3CiAgICBmcmFtZV9idXJ5IDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDM1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA2CiAgICAvLyBmdXR1cmVfZXZlbnRfaWQgPSBzZWxmLmV2ZW50X2N1cnNvciArIFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfd2hpbGVfdG9wQDM2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA3CiAgICAvLyB3aGlsZSBmdXR1cmVfZXZlbnRfaWQgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgZnJhbWVfZGlnIDMKICAgID4KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl93aGlsZUA0OAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA4CiAgICAvLyBmdXR1cmVfZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoZnV0dXJlX2V2ZW50X2lkKQogICAgZnJhbWVfZGlnIDMKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwOQogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPSBmdXR1cmVfZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTAtNTExCiAgICAvLyAjIE9ubHkgcmVkZW1wdGlvbi1iZWFyaW5nIGV2ZW50cyBjb250cmlidXRlIHRvIHRoZSBhbm51aXR5IGRlbm9taW5hdG9yLgogICAgLy8gaXNfcmVkZW1wdGlvbl9ldmVudCA9IGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpIG9yICgKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUxMC01MTQKICAgIC8vICMgT25seSByZWRlbXB0aW9uLWJlYXJpbmcgZXZlbnRzIGNvbnRyaWJ1dGUgdG8gdGhlIGFubnVpdHkgZGVub21pbmF0b3IuCiAgICAvLyBpc19yZWRlbXB0aW9uX2V2ZW50ID0gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QUikgb3IgKAogICAgLy8gICAgIGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfTUQpCiAgICAvLyAgICAgYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICAvLyApCiAgICBibnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfdHJ1ZUA0MAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTEyCiAgICAvLyBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgZnJhbWVfZGlnIDQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTItNTEzCiAgICAvLyBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgLy8gYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF9mYWxzZUA0MQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTEzCiAgICAvLyBhbmQgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IgPiBVSW50NjQoMCkKICAgIGZyYW1lX2RpZyAwCiAgICBwdXNoaW50IDI1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTEyLTUxMwogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCkKICAgIC8vIGFuZCBmdXR1cmVfZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX3RydWVANDA6CiAgICBpbnRjXzEgLy8gMQoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfbWVyZ2VANDI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTUKICAgIC8vIGlmIGlzX3JlZGVtcHRpb25fZXZlbnQ6CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA0NwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTE2CiAgICAvLyBpZiBza2lwX2ZpcnN0X3JlZGVtcHRpb246CiAgICBmcmFtZV9kaWcgNwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUA0NQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTE3CiAgICAvLyBza2lwX2ZpcnN0X3JlZGVtcHRpb24gPSBGYWxzZQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgNwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANDc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjQKICAgIC8vIGZ1dHVyZV9ldmVudF9pZCArPSBVSW50NjQoMSkKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV93aGlsZV90b3BAMzYKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlANDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjEKICAgIC8vIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZnJhbWVfZGlnIDAKICAgIHB1c2hpbnQgMjUKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTktNTIyCiAgICAvLyBkaXNjb3VudF9mYWN0b3IgPSBzZWxmLl9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcigKICAgIC8vICAgICBkaXNjb3VudF9mYWN0b3IsCiAgICAvLyAgICAgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMgogICAgc3dhcAogICAgY2FsbHN1YiBfZGlzY291bnRfYW5udWl0eV9mYWN0b3IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjMKICAgIC8vIGRlbm9taW5hdG9yICs9IGRpc2NvdW50X2ZhY3RvcgogICAgZnJhbWVfZGlnIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA0NwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDE6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF9tZXJnZUA0MgoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX3doaWxlQDQ4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTI2CiAgICAvLyBhc3NlcnQgZGVub21pbmF0b3IgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZnJhbWVfZGlnIDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUyNwogICAgLy8gbnVtZXJhdG9yID0gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTI4CiAgICAvLyBpZiBlbnRyeS5mbGFncyAmIFVJbnQ2NChlbnVtcy5GTEFHX0lOSVRJQUxfUFJGKSA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNTcKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gOAogICAgJgogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDUwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjktNTMwCiAgICAvLyAjIFN1YnNlcXVlbnQgUFJGIGV2ZW50cyBhbW9ydGl6ZSBib3RoIHByaW5jaXBhbCBhbmQgYWxyZWFkeSBhY2NydWVkIGNhcnJ5LgogICAgLy8gbnVtZXJhdG9yICs9IHNlbGYuYWNjcnVlZF9pbnRlcmVzdAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgICsKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDUwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTMzCiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTMxLTUzNQogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIG51bWVyYXRvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gICAgIGRlbm9taW5hdG9yLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDEKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OTAKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IHNlbGYuX3JlY2FsY3VsYXRlX2FubnVpdHlfcGF5bWVudCgKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjkwLTY5MgogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gc2VsZi5fcmVjYWxjdWxhdGVfYW5udWl0eV9wYXltZW50KAogICAgLy8gICAgIGVudHJ5CiAgICAvLyApCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMzA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OTUKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY5Ni03MDAKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1VSW50NjQoMCksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OTgKICAgIC8vIHBheW9mZj1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njk5CiAgICAvLyBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY5Ni03MDAKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1VSW50NjQoMCksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgY2FsbHN1YiBfZW1pdF9leGVjdXRpb25fZXZlbnQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDI5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njk0CiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDMwCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDIwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc3CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9JUENCKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCAxOAogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDIzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzgtNjc5CiAgICAvLyAjIElQQ0Iga2VlcHMgcHJpbmNpcGFsIHVuY2hhbmdlZCBhbmQgb25seSByZXNldHMgdGhlIGludGVyZXN0IGJhc2UuCiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIGIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMjMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMTA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjUKICAgIC8vIGVsaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1JSRik6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgMTEKICAgID09CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDE0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjYKICAgIC8vIG5leHRfcmF0ZSA9IGVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY3CiAgICAvLyBpZiBuZXh0X3JhdGUgPT0gVUludDY0KDApOgogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDEzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjgKICAgIC8vIG5leHRfcmF0ZSA9IHNlbGYucmF0ZV9yZXNldF9uZXh0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzcgLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDUKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfbmV4dCBleGlzdHMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY5CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IG5leHRfcmF0ZQogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgZnJhbWVfZGlnIDUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDE0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjcxCiAgICAvLyBpZiBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSAhPSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgOQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY3MgogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPSBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZQogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgZnJhbWVfZGlnIDkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KGVudHJ5OiBieXRlcywgcGF5b2ZmOiB1aW50NjQsIHNldHRsZWRfYW1vdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpfZW1pdF9leGVjdXRpb25fZXZlbnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MDYtNzEyCiAgICAvLyBkZWYgX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgKiwKICAgIC8vICAgICBlbnRyeTogdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnksCiAgICAvLyAgICAgcGF5b2ZmOiBVSW50NjQsCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ6IFVJbnQ2NCwKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDMgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE2CiAgICAvLyBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25JRAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE3CiAgICAvLyBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIGZyYW1lX2RpZyAtMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTgKICAgIC8vIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIGZyYW1lX2RpZyAtMwogICAgZXh0cmFjdCA4IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxOQogICAgLy8gc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICBmcmFtZV9kaWcgLTMKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MjAKICAgIC8vIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MjMKICAgIC8vIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIGZyYW1lX2RpZyAtMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE4CiAgICAvLyBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICBpbnRjXzIgLy8gOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIzCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBnZXRieXRlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NTIKICAgIC8vIGlmIHBheW9mZiA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJueiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NTMKICAgIC8vIHJldHVybiBVSW50NjQoZW51bXMuUEFZT0ZGX1NJR05fUE9TSVRJVkUpCiAgICBpbnRjXzEgLy8gMQoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX3BheW9mZl9zaWduQDc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MjItNzI0CiAgICAvLyBwYXlvZmZfc2lnbj1hcmM0LlVJbnQ4KAogICAgLy8gICAgIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIC8vICksCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgaW50Y18yIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MjYKICAgIC8vIGN1cnJlbmN5X2lkPXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzI3CiAgICAvLyBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTUtNzI4CiAgICAvLyBFeGVjdXRpb25FdmVudCgKICAgIC8vICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIC8vICAgICBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYXBwbGllZF9hdD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICBwYXlvZmY9cGF5b2ZmLAogICAgLy8gICAgIHBheW9mZl9zaWduPWFyYzQuVUludDgoCiAgICAvLyAgICAgICAgIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIC8vICAgICApLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PXNldHRsZWRfYW1vdW50LAogICAgLy8gICAgIGN1cnJlbmN5X2lkPXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAwCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE0LTcyOQogICAgLy8gYXJjNC5lbWl0KAogICAgLy8gICAgIEV4ZWN1dGlvbkV2ZW50KAogICAgLy8gICAgICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgICAgIHBheW9mZj1wYXlvZmYsCiAgICAvLyAgICAgICAgIHBheW9mZl9zaWduPWFyYzQuVUludDgoCiAgICAvLyAgICAgICAgICAgICBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICAvLyAgICAgICAgICksCiAgICAvLyAgICAgICAgIHNldHRsZWRfYW1vdW50PXNldHRsZWRfYW1vdW50LAogICAgLy8gICAgICAgICBjdXJyZW5jeV9pZD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgICAgIHNlcXVlbmNlPWVudHJ5LmV2ZW50X2lkICsgVUludDY0KDEpLAogICAgLy8gICAgICkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDlhMzMyYjk1IC8vIG1ldGhvZCAiRXhlY3V0aW9uRXZlbnQodWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc1NAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiAoVUludDY0KGVudW1zLkVWVF9JRUQpLCBVSW50NjQoZW51bXMuRVZUX1BJKSk6CiAgICBmcmFtZV9kaWcgNQogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBibnogX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2lmX2JvZHlANQogICAgZnJhbWVfZGlnIDUKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGJ6IF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pZl9lbHNlQDYKCl9lbWl0X2V4ZWN1dGlvbl9ldmVudF9pZl9ib2R5QDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NTUKICAgIC8vIHJldHVybiBVSW50NjQoZW51bXMuUEFZT0ZGX1NJR05fUE9TSVRJVkUpCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIzCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBiIF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9wYXlvZmZfc2lnbkA3CgpfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzU2CiAgICAvLyByZXR1cm4gVUludDY0KGVudW1zLlBBWU9GRl9TSUdOX05FR0FUSVZFKQogICAgcHVzaGludCAyNTUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcyMwogICAgLy8gc2VsZi5fcGF5b2ZmX3NpZ24oZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSwgcGF5b2ZmKQogICAgYiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fcGF5b2ZmX3NpZ25ANwoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9yb2xlX2lzX2FjdGl2ZShyb2xlX21hcDogYnl0ZXMsIHJvbGVfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NDoKX3JvbGVfaXNfYWN0aXZlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU3CiAgICAvLyBkZWYgX3JvbGVfaXNfYWN0aXZlKHNlbGYsIHJvbGVfbWFwOiB0eXAuUmJhY1JvbGUsIHJvbGVfYWRkcmVzczogQWNjb3VudCkgLT4gYm9vbDoKICAgIHByb3RvIDIgMQogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5CiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5LTYwCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5LTYxCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjEKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAtNjEKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgPj0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX21lcmdlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKSAtPiB2b2lkOgpfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2NQogICAgLy8gYXNzZXJ0IHNlbGYuX2lzX2FycmFuZ2VyKFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTIKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgPT0gc2VsZi5hcnJhbmdlci52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE4IC8vIDB4NTIzYTQxNTI1MjIzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJyYW5nZXIgZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjY1CiAgICAvLyBhc3NlcnQgc2VsZi5faXNfYXJyYW5nZXIoVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkgLT4gdm9pZDoKX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjgzCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYXNzZXRfZGVmYXVsdGVkLCBlcnIuREVGQVVMVEVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNDEgLy8gImFzc2V0X2RlZmF1bHRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9kZWZhdWx0ZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRGVmYXVsdGVkCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKSAtPiB2b2lkOgpfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODYKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5hc3NldF9zdXNwZW5kZWQsIGVyci5TVVNQRU5ERUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMyAvLyAiYXNzZXRfc3VzcGVuZGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X3N1c3BlbmRlZCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBTdXNwZW5kZWQgb3BlcmF0aW9ucwogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGVfaWQ6IHVpbnQ2NCkgLT4gdm9pZDoKX2Fzc2VydF92YWxpZF9yb2xlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg4CiAgICAvLyBkZWYgX2Fzc2VydF92YWxpZF9yb2xlKHNlbGYsIHJvbGVfaWQ6IFVJbnQ2NCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MAogICAgLy8gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgcHVzaGludCAyMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICBwdXNoaW50IDI1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MgogICAgLy8gVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIHB1c2hpbnQgNDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkzCiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICBwdXNoaW50IDUwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NAogICAgLy8gVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICBwdXNoaW50IDYwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NQogICAgLy8gVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIHB1c2hpbnQgNzAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojk2CiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICBwdXNoaW50IDgwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBieiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9mYWxzZUA4CgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDc6CiAgICBpbnRjXzEgLy8gMQoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfbWVyZ2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICByZXRzdWIKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX2ZhbHNlQDg6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9tZXJnZUA5Cg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="}, "sourceInfo": {"approval": {"pcOffsetMethod": "none", "sourceInfo": [{"pc": [2669], "errorMessage": "ACTUS event not yet executed"}, {"pc": [2427], "errorMessage": "Can not distribute zero units"}, {"pc": [3170, 3177, 3550], "errorMessage": "D-ASA already configured"}, {"pc": [1276, 2008, 2387, 2533, 3767, 3913, 4264, 4526, 4672], "errorMessage": "D-ASA not configured"}, {"pc": [3561], "errorMessage": "D-ASA terms not configured"}, {"pc": [6861], "errorMessage": "Defaulted"}, {"pc": [3188], "errorMessage": "Denomination asset is not properly set"}, {"pc": [3203], "errorMessage": "Different settlement asset not supported, must be equal to denomination asset"}, {"pc": [3439, 3446, 3448], "errorMessage": "IED must be set in the future"}, {"pc": [1294, 2077, 2548, 4282, 6213], "errorMessage": "IED not yet executed"}, {"pc": [2440, 5596], "errorMessage": "Insufficient remaining D-ASA units"}, {"pc": [2643, 2709], "errorMessage": "Insufficient sender units to transfer"}, {"pc": [1904, 3090, 3108, 3164, 3641, 3677, 4329, 5780, 6058, 6118, 6521], "errorMessage": "Invalid ACTUS configuration"}, {"pc": [2017, 2421, 2604, 2619, 2776, 2849, 2912, 2954, 5408, 5533], "errorMessage": "Invalid account holding address"}, {"pc": [4863, 4887, 4911, 4935, 4959, 5016, 5044, 5066, 5088, 5110, 5289, 5307, 5322, 5337, 5352], "errorMessage": "Invalid account role address"}, {"pc": [3150], "errorMessage": "Invalid day-count convention ID"}, {"pc": [1407, 3788, 4116, 6090], "errorMessage": "Invalid event cursor"}, {"pc": [3626, 3689, 3965, 4306, 5696], "errorMessage": "Invalid event id"}, {"pc": [3801, 4180, 4187, 4319], "errorMessage": "Invalid event type"}, {"pc": [5000, 5279, 6931], "errorMessage": "Invalid role identifier"}, {"pc": [3555, 3701, 3709, 4018, 4393, 5711, 5727], "errorMessage": "Invalid schedule page"}, {"pc": [5644], "errorMessage": "No D-ASA units"}, {"pc": [1413, 1933, 2114, 6099], "errorMessage": "No due cashflow to pay"}, {"pc": [6182], "errorMessage": "Not IED event"}, {"pc": [2062, 2395, 2591, 2766, 2822, 2832, 2918, 4215, 4507, 5133, 6853], "errorMessage": "Not authorized"}, {"pc": [1534, 1542, 2163, 2237, 2246], "errorMessage": "Not enough funds for the payment"}, {"pc": [3938, 3951, 4291], "errorMessage": "Observed event required to execute this action"}, {"pc": [2409, 2457], "errorMessage": "Primary distribution is closed"}, {"pc": [6130], "errorMessage": "Primary distribution is not complete"}, {"pc": [2632], "errorMessage": "Sender and receiver must be different"}, {"pc": [5394, 6869], "errorMessage": "Suspended operations"}, {"pc": [2344, 3667, 4351], "errorMessage": "Time events must be sorted in strictly ascending order"}, {"pc": [2565, 2582], "errorMessage": "Transfer is closed"}, {"pc": [2636], "errorMessage": "Transfer units must be greater than zero"}, {"pc": [953], "errorMessage": "Wrong Global Bytes allocation"}, {"pc": [959], "errorMessage": "Wrong Global UInts allocation"}, {"pc": [963], "errorMessage": "Wrong Local Bytes allocation"}, {"pc": [967], "errorMessage": "Wrong Local UInts allocation"}, {"pc": [1515, 2156], "errorMessage": "account opted into asset"}, {"pc": [6813, 6828], "errorMessage": "check BoxMap entry exists"}, {"pc": [2053, 2091, 2132, 2170, 2461, 2639, 2698, 2724, 5388, 5554], "errorMessage": "check self.account entry exists"}, {"pc": [1596, 1828, 1916, 4583, 6218, 6541], "errorMessage": "check self.accrued_interest exists"}, {"pc": [5151, 6851], "errorMessage": "check self.arranger exists"}, {"pc": [6859], "errorMessage": "check self.asset_defaulted exists"}, {"pc": [6867], "errorMessage": "check self.asset_suspended exists"}, {"pc": [3098, 3544, 3934, 3946, 4287, 4531, 5942], "errorMessage": "check self.contract_type exists"}, {"pc": [1564, 4588, 5416, 5494], "errorMessage": "check self.cumulative_interest_index exists"}, {"pc": [1576, 4593, 5427, 5502], "errorMessage": "check self.cumulative_principal_index exists"}, {"pc": [5952], "errorMessage": "check self.dynamic_principal_redemption exists"}, {"pc": [1332, 1344, 1405, 1647, 2647, 2659, 3780, 4109, 4559, 4676, 4688, 4725, 5509, 6088, 6170, 6367, 6422, 6560], "errorMessage": "check self.event_cursor exists"}, {"pc": [5442, 5456, 5649, 5678, 6008, 6016, 6043, 6063, 6253, 6386, 6547], "errorMessage": "check self.fixed_point_scale exists"}, {"pc": [6296], "errorMessage": "check self.has_rate_reset_cap exists"}, {"pc": [6269], "errorMessage": "check self.has_rate_reset_floor exists"}, {"pc": [3175, 3560, 4555, 6187], "errorMessage": "check self.initial_exchange_amount exists"}, {"pc": [2445, 2455], "errorMessage": "check self.initial_exchange_date exists"}, {"pc": [1772, 4573, 5984, 5998], "errorMessage": "check self.interest_calculation_base exists"}, {"pc": [1844, 1859], "errorMessage": "check self.next_principal_redemption exists"}, {"pc": [4578, 5976, 6003, 6048], "errorMessage": "check self.nominal_interest_rate exists"}, {"pc": [2022, 2035], "errorMessage": "check self.op_daemon exists"}, {"pc": [1669, 1738, 1764, 1818, 1870, 1879, 1901, 4568, 6526, 6607], "errorMessage": "check self.outstanding_principal exists"}, {"pc": [6304, 6318], "errorMessage": "check self.rate_reset_cap exists"}, {"pc": [6277, 6291], "errorMessage": "check self.rate_reset_floor exists"}, {"pc": [6248], "errorMessage": "check self.rate_reset_multiplier exists"}, {"pc": [6641], "errorMessage": "check self.rate_reset_next exists"}, {"pc": [6261], "errorMessage": "check self.rate_reset_spread exists"}, {"pc": [1520, 2232, 4598], "errorMessage": "check self.reserved_interest exists"}, {"pc": [1525, 1554, 2242, 2257, 4603], "errorMessage": "check self.reserved_principal exists"}, {"pc": [2432, 2480, 4550, 5591, 6123], "errorMessage": "check self.reserved_units_total exists"}, {"pc": [1336, 2651, 3784, 3963, 3980, 4100, 4301, 4336, 4355, 4475, 4563, 4680, 5692, 6363, 6430], "errorMessage": "check self.schedule_entry_count exists"}, {"pc": [4008, 4383], "errorMessage": "check self.schedule_page entry exists"}, {"pc": [1512, 2122, 2150, 6713], "errorMessage": "check self.settlement_asset_id exists"}, {"pc": [1275, 1289, 2007, 2072, 2386, 2405, 2532, 2543, 2826, 3168, 3548, 3766, 3912, 4263, 4277, 4524, 4671, 5537, 6114, 6208], "errorMessage": "check self.status exists"}, {"pc": [2438, 2491, 4545, 5642, 5673, 6128], "errorMessage": "check self.total_units exists"}, {"pc": [2570, 2580], "errorMessage": "check self.transfer_closure_date exists"}, {"pc": [2553, 2561], "errorMessage": "check self.transfer_opening_date exists"}, {"pc": [3603, 3660], "errorMessage": "index access is out of bounds"}, {"pc": [1991, 3035, 3518, 4013, 4388], "errorMessage": "invalid array length header"}, {"pc": [2756, 3506, 4497, 5123], "errorMessage": "invalid number of bytes for arc4.bool"}, {"pc": [1999], "errorMessage": "invalid number of bytes for arc4.dynamic_array"}, {"pc": [3533], "errorMessage": "invalid number of bytes for arc4.dynamic_array"}, {"pc": [1985, 2370, 2510, 2518, 2748, 2806, 2814, 2894, 2902, 2945, 2970, 4744, 4768, 4802, 4983, 5165, 5249], "errorMessage": "invalid number of bytes for arc4.static_array"}, {"pc": [1270, 2328, 2337, 2378, 2527, 3496, 3897], "errorMessage": "invalid number of bytes for arc4.uint64"}, {"pc": [4792, 4973, 5239], "errorMessage": "invalid number of bytes for arc4.uint8"}, {"pc": [3007], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.InitialKernelState"}, {"pc": [2996], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.NormalizedActusTerms"}, {"pc": [4259], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.ObservedCashEventRequest"}, {"pc": [3908], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.ObservedEventRequest"}, {"pc": [3040], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.Prospectus"}, {"pc": [4813], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.RoleValidity"}, {"pc": [3024], "errorMessage": "invalid tail pointer at index 1 of (uint8[32],(len+utf8[]))"}, {"pc": [3019], "errorMessage": "invalid tuple encoding"}, {"pc": [4080, 4455], "errorMessage": "max array length exceeded"}, {"pc": [4537, 6705], "errorMessage": "overflow"}]}, "clear": {"pcOffsetMethod": "none", "sourceInfo": []}}, "templateVariables": {}}""" +_APP_SPEC_JSON = r"""{"arcs": [22, 28], "bareActions": {"call": [], "create": []}, "methods": [{"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "desc": "Maximum number of due cash events to process in this call.", "name": "max_event_count"}], "name": "fund_due_cashflows", "returns": {"type": "(uint64,uint64,uint64,uint64,uint64)", "desc": "Funding result with reserved interest, reserved principal, and event count.", "struct": "CashFundingResult"}, "desc": "Reserve due ACTUS cash events into the escrow-style claim ledger.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Holder whose position should be settled and claimed.", "name": "holding_address"}, {"type": "byte[]", "desc": "Opaque settlement context returned in the result.", "name": "payment_info"}], "name": "claim_due_cashflows", "returns": {"type": "(uint64,uint64,uint64,uint64,byte[])", "desc": "Claim result with realized interest, principal, and passthrough context.", "struct": "CashClaimResult"}, "desc": "Withdraw the holder's already funded ACTUS cash entitlements.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "desc": "Inclusive UNIX timestamp at which transfers may start.", "name": "open_date"}, {"type": "uint64", "desc": "Exclusive UNIX timestamp at which transfers stop.", "name": "closure_date"}], "name": "transfer_set_schedule", "returns": {"type": "uint64", "desc": "UNIX timestamp of the schedule update."}, "desc": "Configure the secondary-market transfer window.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account receiving the reserved units.", "name": "holding_address"}, {"type": "uint64", "desc": "Number of units to reserve.", "name": "units"}], "name": "primary_distribution", "returns": {"type": "uint64", "desc": "Remaining undistributed unit balance."}, "desc": "Reserve units for a holder before the initial exchange activates issuance.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account debited for the transfer.", "name": "sender_holding_address"}, {"type": "address", "desc": "Account credited for the transfer.", "name": "receiver_holding_address"}, {"type": "uint64", "desc": "Number of active units to move.", "name": "units"}], "name": "transfer", "returns": {"type": "uint64", "desc": "Number of units transferred."}, "desc": "Transfer active units after settling both counterparties to the current cursor.\nReturns the number of units moved. The ACTUS kernel no longer persists a nominal per-unit value on-chain, so transfer results are unit-based.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account holding address.", "name": "holding_address"}, {"type": "bool", "desc": "Suspension status to apply.", "name": "suspended"}], "name": "account_suspension", "returns": {"type": "uint64", "desc": "UNIX timestamp of the suspension update."}, "desc": "Set the suspension status of one account.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account holding address.", "name": "holding_address"}, {"type": "address", "desc": "Account payment address.", "name": "payment_address"}], "name": "account_open", "returns": {"type": "uint64", "desc": "UNIX timestamp of the account opening."}, "desc": "Open a contract account with a new position and register its payment address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account holding address.", "name": "holding_address"}, {"type": "address", "desc": "New account payment address.", "name": "payment_address"}], "name": "account_update_payment_address", "returns": {"type": "uint64", "desc": "UNIX timestamp of the account update."}, "desc": "Update the payment address of an account.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account holding address.", "name": "holding_address"}], "name": "account_get_position", "returns": {"type": "(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64)", "desc": "Account position record.", "struct": "AccountPosition"}, "desc": "Get the full accounting position for one holder.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": [], "create": ["NoOp"]}, "args": [{"type": "address", "desc": "D-ASA arranger address.", "name": "arranger"}], "name": "contract_create", "returns": {"type": "uint64", "desc": "UNIX timestamp of contract creation."}, "desc": "Create a new D-ASA contract and set the arranger role.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64)", "desc": "Normalized ACTUS terms.", "name": "terms", "struct": "NormalizedActusTerms"}, {"type": "(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "desc": "Initial kernel state captured before `IED`.", "name": "initial_state", "struct": "InitialKernelState"}, {"type": "(byte[32],string)", "desc": "Prospectus metadata stored for reference only.", "name": "prospectus", "struct": "Prospectus"}], "name": "contract_config", "returns": {"type": "uint64", "desc": "UNIX timestamp of contract configuration."}, "desc": "Partial contract configuration with: normalized ACTUS terms, initial kernel\nstate (pre-IED), prospectus (informational only). The contract stays inactive until all schedule pages are configured next.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "desc": "Zero-based page index within the boxed schedule.", "name": "schedule_page_index"}, {"type": "bool", "desc": "Whether this page finalizes the schedule upload.", "name": "is_last_page"}, {"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[]", "desc": "Normalized schedule entries for the requested page.", "name": "schedule_page"}], "name": "contract_schedule", "returns": {"type": "uint64", "desc": "UNIX timestamp of the schedule upload."}, "desc": "Upload one normalized schedule page.\nThe configuration operation is considered complete only when the last page is stored. At that point `schedule_entry_count` is finalized and the contract moves to `STATUS_PENDING_IED`.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "contract_execute_ied", "returns": {"type": "uint64", "desc": "UNIX timestamp of the `IED` execution."}, "desc": "Execute the first due `IED` entry and activate the contract.\n`IED` is the one non-cash event that moves the app from `STATUS_PENDING_IED` to `STATUS_ACTIVE`.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "desc": "Expected global schedule event identifier at the current cursor.", "name": "event_id"}, {"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "desc": "Observed payload used for append-on-execute and/or rate resets.", "name": "payload", "struct": "ObservedEventRequest"}], "name": "apply_non_cash_event", "returns": {"type": "uint64", "desc": "UNIX timestamp of the non-cash event application."}, "desc": "Apply the next due non-cash event, optionally appending one first.\nObserved payloads are appended before execution when flagged. Rate reset events require the interest oracle because they can change the running nominal rate; other non-cash events stay arranger-controlled.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "desc": "Observed cash-event payload to append after the current tail.", "name": "payload", "struct": "ObservedCashEventRequest"}], "name": "append_observed_cash_event", "returns": {"type": "uint64", "desc": "UNIX timestamp of the append operation."}, "desc": "Append an arranger-authorized observed cash event to the schedule tail.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Default status", "name": "defaulted"}], "name": "contract_set_default_status", "returns": {"type": "uint64"}, "desc": "Set D-ASA default status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "contract_get_state", "returns": {"type": "(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "desc": "Current kernel state snapshot.", "struct": "KernelState"}, "desc": "Return a readonly snapshot of the generic ACTUS kernel state.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "contract_get_next_due_event", "returns": {"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "desc": "Next due schedule entry, or an all-zero sentinel if the contract ended.", "struct": "ExecutionScheduleEntry"}, "desc": "Return the next boxed schedule entry, or a zeroed sentinel if ended.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["UpdateApplication"], "create": []}, "args": [], "name": "contract_update", "returns": {"type": "void", "desc": "None."}, "desc": "Update D-ASA application.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "New arranger address.", "name": "new_arranger"}], "name": "rbac_rotate_arranger", "returns": {"type": "uint64", "desc": "UNIX timestamp of the role assignment."}, "desc": "Rotate the arranger address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Operation daemon address.", "name": "address"}], "name": "rbac_set_op_daemon", "returns": {"type": "uint64", "desc": "UNIX timestamp of the role assignment."}, "desc": "Non-normative helper to set the operation daemon address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role identifier.", "name": "role_id"}, {"type": "address", "desc": "Account role address.", "name": "role_address"}, {"type": "(uint64,uint64)", "desc": "Inclusive validity interval for the assignment.", "name": "validity", "struct": "RoleValidity"}], "name": "rbac_assign_role", "returns": {"type": "uint64", "desc": "UNIX timestamp of the role assignment."}, "desc": "Assign a role to an address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role identifier.", "name": "role_id"}, {"type": "address", "desc": "Account role address.", "name": "role_address"}], "name": "rbac_revoke_role", "returns": {"type": "uint64", "desc": "UNIX timestamp of the role revocation."}, "desc": "Revoke a role from an address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Suspension status to apply.", "name": "suspended"}], "name": "rbac_contract_suspension", "returns": {"type": "uint64", "desc": "UNIX timestamp of the suspension update."}, "desc": "Set the asset-wide suspension status.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "rbac_get_arranger", "returns": {"type": "address", "desc": "Current arranger address."}, "desc": "Get the arranger address.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Address to query.", "name": "address"}], "name": "rbac_get_address_roles", "returns": {"type": "(bool,bool,bool,bool,bool)", "desc": "Roles mask in the order: account manager, primary dealer, trustee, authority, observer."}, "desc": "Non-normative helper to get the active roles assigned to an address.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role identifier.", "name": "role_id"}, {"type": "address", "desc": "Account role address.", "name": "role_address"}], "name": "rbac_get_role_validity", "returns": {"type": "(uint64,uint64)", "desc": "Stored role validity interval.", "struct": "RoleValidity"}, "desc": "Get the stored validity interval for a role assignment.", "events": [], "readonly": true, "recommendations": {}}], "name": "DASA", "state": {"keys": {"box": {}, "global": {"arranger": {"key": "UjpBUlIj", "keyType": "AVMBytes", "valueType": "address"}, "op_daemon": {"key": "UjpPUEQj", "keyType": "AVMBytes", "valueType": "address"}, "asset_suspended": {"key": "YXNzZXRfc3VzcGVuZGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "asset_defaulted": {"key": "YXNzZXRfZGVmYXVsdGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "status": {"key": "c3RhdHVz", "keyType": "AVMString", "valueType": "AVMUint64"}, "contract_type": {"key": "Y29udHJhY3RfdHlwZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "prospectus_hash": {"key": "cHJvc3BlY3R1c19oYXNo", "keyType": "AVMString", "valueType": "AVMBytes"}, "prospectus_url": {"key": "cHJvc3BlY3R1c191cmw=", "keyType": "AVMString", "valueType": "AVMString"}, "denomination_asset_id": {"key": "ZGVub21pbmF0aW9uX2Fzc2V0X2lk", "keyType": "AVMString", "valueType": "AVMUint64"}, "settlement_asset_id": {"key": "c2V0dGxlbWVudF9hc3NldF9pZA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "initial_exchange_date": {"key": "aW5pdGlhbF9leGNoYW5nZV9kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "maturity_date": {"key": "bWF0dXJpdHlfZGF0ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "transfer_opening_date": {"key": "dHJhbnNmZXJfb3BlbmluZ19kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "transfer_closure_date": {"key": "dHJhbnNmZXJfY2xvc3VyZV9kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "day_count_convention": {"key": "ZGF5X2NvdW50X2NvbnZlbnRpb24=", "keyType": "AVMString", "valueType": "AVMUint64"}, "total_units": {"key": "dG90YWxfdW5pdHM=", "keyType": "AVMString", "valueType": "AVMUint64"}, "reserved_units_total": {"key": "cmVzZXJ2ZWRfdW5pdHNfdG90YWw=", "keyType": "AVMString", "valueType": "AVMUint64"}, "initial_exchange_amount": {"key": "aW5pdGlhbF9leGNoYW5nZV9hbW91bnQ=", "keyType": "AVMString", "valueType": "AVMUint64"}, "outstanding_principal": {"key": "b3V0c3RhbmRpbmdfcHJpbmNpcGFs", "keyType": "AVMString", "valueType": "AVMUint64"}, "next_principal_redemption": {"key": "bmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbg==", "keyType": "AVMString", "valueType": "AVMUint64"}, "dynamic_principal_redemption": {"key": "ZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbg==", "keyType": "AVMString", "valueType": "AVMUint64"}, "interest_calculation_base": {"key": "aW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "accrued_interest": {"key": "YWNjcnVlZF9pbnRlcmVzdA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "nominal_interest_rate": {"key": "bm9taW5hbF9pbnRlcmVzdF9yYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_spread": {"key": "cmF0ZV9yZXNldF9zcHJlYWQ=", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_multiplier": {"key": "cmF0ZV9yZXNldF9tdWx0aXBsaWVy", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_floor": {"key": "cmF0ZV9yZXNldF9mbG9vcg==", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_cap": {"key": "cmF0ZV9yZXNldF9jYXA=", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_next": {"key": "cmF0ZV9yZXNldF9uZXh0", "keyType": "AVMString", "valueType": "AVMUint64"}, "has_rate_reset_floor": {"key": "aGFzX3JhdGVfcmVzZXRfZmxvb3I=", "keyType": "AVMString", "valueType": "AVMUint64"}, "has_rate_reset_cap": {"key": "aGFzX3JhdGVfcmVzZXRfY2Fw", "keyType": "AVMString", "valueType": "AVMUint64"}, "reserved_principal": {"key": "cmVzZXJ2ZWRfcHJpbmNpcGFs", "keyType": "AVMString", "valueType": "AVMUint64"}, "reserved_interest": {"key": "cmVzZXJ2ZWRfaW50ZXJlc3Q=", "keyType": "AVMString", "valueType": "AVMUint64"}, "cumulative_interest_index": {"key": "Y3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "cumulative_principal_index": {"key": "Y3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXg=", "keyType": "AVMString", "valueType": "AVMUint64"}, "event_cursor": {"key": "ZXZlbnRfY3Vyc29y", "keyType": "AVMString", "valueType": "AVMUint64"}, "schedule_entry_count": {"key": "c2NoZWR1bGVfZW50cnlfY291bnQ=", "keyType": "AVMString", "valueType": "AVMUint64"}, "defaulted": {"key": "ZGVmYXVsdGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "fixed_point_scale": {"key": "Zml4ZWRfcG9pbnRfc2NhbGU=", "keyType": "AVMString", "valueType": "AVMUint64"}}, "local": {}}, "maps": {"box": {"account_manager": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpNTkcj"}, "primary_dealer": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpQWUQj"}, "trustee": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpUUlMj"}, "authority": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpBVVQj"}, "observer": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpNT0Mj"}, "schedule_page": {"keyType": "uint64", "valueType": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[]", "prefix": "UyM="}, "account": {"keyType": "address", "valueType": "AccountPosition", "prefix": "QSM="}}, "global": {}, "local": {}}, "schema": {"global": {"bytes": 10, "ints": 54}, "local": {"bytes": 0, "ints": 0}}}, "structs": {"AccountPosition": [{"name": "payment_address", "type": "address"}, {"name": "units", "type": "uint64"}, {"name": "reserved_units", "type": "uint64"}, {"name": "suspended", "type": "bool"}, {"name": "settled_cursor", "type": "uint64"}, {"name": "interest_checkpoint", "type": "uint64"}, {"name": "principal_checkpoint", "type": "uint64"}, {"name": "claimable_interest", "type": "uint64"}, {"name": "claimable_principal", "type": "uint64"}], "CashClaimResult": [{"name": "interest_amount", "type": "uint64"}, {"name": "principal_amount", "type": "uint64"}, {"name": "total_amount", "type": "uint64"}, {"name": "timestamp", "type": "uint64"}, {"name": "context", "type": "byte[]"}], "CashFundingResult": [{"name": "funded_interest", "type": "uint64"}, {"name": "funded_principal", "type": "uint64"}, {"name": "total_funded", "type": "uint64"}, {"name": "processed_events", "type": "uint64"}, {"name": "timestamp", "type": "uint64"}], "ExecutionScheduleEntry": [{"name": "event_id", "type": "uint64"}, {"name": "event_type", "type": "uint8"}, {"name": "scheduled_time", "type": "uint64"}, {"name": "accrual_factor", "type": "uint64"}, {"name": "redemption_accrual_factor", "type": "uint64"}, {"name": "next_nominal_interest_rate", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "next_outstanding_principal", "type": "uint64"}, {"name": "flags", "type": "uint64"}], "InitialKernelState": [{"name": "status_date", "type": "uint64"}, {"name": "event_cursor", "type": "uint64"}, {"name": "outstanding_principal", "type": "uint64"}, {"name": "interest_calculation_base", "type": "uint64"}, {"name": "nominal_interest_rate", "type": "uint64"}, {"name": "accrued_interest", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "cumulative_interest_index", "type": "uint64"}, {"name": "cumulative_principal_index", "type": "uint64"}], "KernelState": [{"name": "contract_type", "type": "uint8"}, {"name": "status", "type": "uint64"}, {"name": "total_units", "type": "uint64"}, {"name": "reserved_units_total", "type": "uint64"}, {"name": "initial_exchange_amount", "type": "uint64"}, {"name": "event_cursor", "type": "uint64"}, {"name": "schedule_entry_count", "type": "uint64"}, {"name": "outstanding_principal", "type": "uint64"}, {"name": "interest_calculation_base", "type": "uint64"}, {"name": "nominal_interest_rate", "type": "uint64"}, {"name": "accrued_interest", "type": "uint64"}, {"name": "cumulative_interest_index", "type": "uint64"}, {"name": "cumulative_principal_index", "type": "uint64"}, {"name": "reserved_interest", "type": "uint64"}, {"name": "reserved_principal", "type": "uint64"}], "NormalizedActusTerms": [{"name": "contract_type", "type": "uint8"}, {"name": "denomination_asset_id", "type": "uint64"}, {"name": "settlement_asset_id", "type": "uint64"}, {"name": "total_units", "type": "uint64"}, {"name": "notional_principal", "type": "uint64"}, {"name": "initial_exchange_amount", "type": "uint64"}, {"name": "initial_exchange_date", "type": "uint64"}, {"name": "maturity_date", "type": "uint64"}, {"name": "day_count_convention", "type": "uint8"}, {"name": "rate_reset_spread", "type": "uint64"}, {"name": "rate_reset_multiplier", "type": "uint64"}, {"name": "rate_reset_floor", "type": "uint64"}, {"name": "rate_reset_cap", "type": "uint64"}, {"name": "rate_reset_next", "type": "uint64"}, {"name": "has_rate_reset_floor", "type": "bool"}, {"name": "has_rate_reset_cap", "type": "bool"}, {"name": "dynamic_principal_redemption", "type": "bool"}, {"name": "fixed_point_scale", "type": "uint64"}], "ObservedCashEventRequest": [{"name": "event_id", "type": "uint64"}, {"name": "event_type", "type": "uint8"}, {"name": "scheduled_time", "type": "uint64"}, {"name": "accrual_factor", "type": "uint64"}, {"name": "redemption_accrual_factor", "type": "uint64"}, {"name": "next_nominal_interest_rate", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "next_outstanding_principal", "type": "uint64"}, {"name": "flags", "type": "uint64"}], "ObservedEventRequest": [{"name": "event_id", "type": "uint64"}, {"name": "event_type", "type": "uint8"}, {"name": "scheduled_time", "type": "uint64"}, {"name": "accrual_factor", "type": "uint64"}, {"name": "redemption_accrual_factor", "type": "uint64"}, {"name": "observed_rate", "type": "uint64"}, {"name": "next_nominal_interest_rate", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "next_outstanding_principal", "type": "uint64"}, {"name": "flags", "type": "uint64"}], "Prospectus": [{"name": "hash", "type": "byte[32]"}, {"name": "url", "type": "string"}], "RoleValidity": [{"name": "role_validity_start", "type": "uint64"}, {"name": "role_validity_end", "type": "uint64"}]}, "byteCode": {"approval": "DCAFAAEIINwLJjIEFR98dQZzdGF0dXMMZXZlbnRfY3Vyc29yFHNjaGVkdWxlX2VudHJ5X2NvdW50FW91dHN0YW5kaW5nX3ByaW5jaXBhbBFmaXhlZF9wb2ludF9zY2FsZRBhY2NydWVkX2ludGVyZXN0GWludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UCQSMVbm9taW5hbF9pbnRlcmVzdF9yYXRlDWNvbnRyYWN0X3R5cGUUcmVzZXJ2ZWRfdW5pdHNfdG90YWwScmVzZXJ2ZWRfcHJpbmNpcGFsC3RvdGFsX3VuaXRzGW5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24RcmVzZXJ2ZWRfaW50ZXJlc3QZY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleBpjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleAZSOkFSUiMTc2V0dGxlbWVudF9hc3NldF9pZBdpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudAZSOkFVVCMGUjpQWUQjBlI6TU5HIwJTIwZSOk1PQyMGUjpUUlMjBlI6T1BEIxVpbml0aWFsX2V4Y2hhbmdlX2RhdGUVdHJhbnNmZXJfb3BlbmluZ19kYXRlFXRyYW5zZmVyX2Nsb3N1cmVfZGF0ZRByYXRlX3Jlc2V0X2Zsb29yDnJhdGVfcmVzZXRfY2FwD2Fzc2V0X3N1c3BlbmRlZBxkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uEXJhdGVfcmVzZXRfc3ByZWFkFXJhdGVfcmVzZXRfbXVsdGlwbGllcg9yYXRlX3Jlc2V0X25leHQUaGFzX3JhdGVfcmVzZXRfZmxvb3ISaGFzX3JhdGVfcmVzZXRfY2FwAQAPYXNzZXRfZGVmYXVsdGVkD3Byb3NwZWN0dXNfaGFzaA5wcm9zcGVjdHVzX3VybBVkZW5vbWluYXRpb25fYXNzZXRfaWQNbWF0dXJpdHlfZGF0ZRRkYXlfY291bnRfY29udmVudGlvbglkZWZhdWx0ZWQDBoEBAgAAMRhAALEnEjIDZycbMgNnJyEiZycpImcpImcnCiJnJyqAAGcnK4AAZycsImcnEyJnJxwiZyctImcnHSJnJx4iZycuImcnDSJnJwsiZycUImcnBCJnJw4iZyciImcnByJnJwYiZycJImcnIyJnJyQiZycfImcnICJnJyUiZycmImcnJyJnJwwiZycPImcnECJnJxEiZyoiZysiZycvImcnBSJnMTWBChJEMTSBNhJEMTcURDE2FESABJFPBOs2GgCOAQDOMRkURDEYQQC3ghkEtEYYyATngyUpBJQ4hyMEbIXj7gS90alEBHwPGBIEFPwQ7wR0pyl/BAnU/hQEmpv6hQSF7tM9BKssD8QE2fIlrASYg1BaBPtNRCgEjqbnTAQCr1V6BIL3Gy0E7wT10wTfNDVQBD2+gL0EHj5I5wQBDIKZBHQGrNIEGnKi7jYaAI4ZAFYDIQR9BKcFMQYhBlsGswbmBxQJCAofCpgMBAz2DRUNqA3tDgUOHQ7SD2gPhw+SD9wAgASVbXFWNhoAjgEG8QAxGYEEEjEYEERCDc2KAgCL/oEKCIsAMgwNQQAqsYEGshCBBbIZJzCyHicwsh+L/40CAAsABLNC/9syALIBQv/1IrIBQv/viSKAAEcNNhoBSRUkEkQXIillRESIFb2IFcSIFckiKWVEgTISFESIEiBBAAtJgWQLIQQIIoj/jyJFBSJFDiJFDUsESwEMQQJZIiplRCIrZUQMQQJNIiplRIgQ8klFEYEJW0lFAzIHDUACN0sPJFVJRRAkEklFBEAAEEsOgQMSQAAISw6BExJBAj8jQQIUSw8iWyIqZUQSREsBMgcOREsCQAHtSw6BExJAAeUiRQtLDyRVSUUQgQMSQAFlSw6BExJAAV0iRQZLD4ExW0UIiBF6QAD+SwdFCUsKiBA4SwaIEDNLAYgQTUlOAkUPSYgQRElFC0sCSwEISUUJMgoiJxNlRHAARCInD2VEIicMZURLAQhLAksBD0RPAkwJTwIPRE8DCCcPTGciJwxlRAgnDExnIicQZURPAggnEExnIicRZUQIJxFMZ0sPJFWBAxJBAHoiJwZlREsQiBEGRRIIJwZMZ4gQ5kEACksPJFWBExJBAAlLD4EpWycOTGcnBEsIZycHSwlnIiplRCMIKkxnSw9XCAGAAROoQQARIicEZURAAAkpgcgBZycHImdLD0sESYgTc0hLDUsMCEUOSwxLBwhFDUsEIwhFBUL+dycGImdC/5BLDyRVSUUQgQMSQQAQIicEZURLBglJRQlFCUL+6UsOJBJBABMiJwRlTEUJRCInB2VMRQpEQv7PSw6BExJAAAdLB0UJQv7AIkUIIkUJQv63iBAnQQBWSw6BExJBAAoiJwRlREUGQv6OIicGZURLEIgQHkUSCElFCyInDmVED0EABiJFBkL+byInDmVESwoJSUUIIicEZUQNQQAKIicEZURFBkL+UUsGRQZC/kpLD4ExWyInBGVESg5ETAlFBkL+NiInBmVESxCID8ZFEghFC0L+DEsESURLDklLD0lOAwgyB08CFk8DFlBPAhZQTwIWUEwWUChMULAjQyJC/b6AAEcCNhoBRwIVJRJENhoCSSJZgQIISwEVEkRXAgBMIillREQnCExQSb1FAUQiJxtlRDIDE0EAIjEAIicbZUQSQAAVMQBLAxJAAA0xAEsBvkRXACASQQEAI0SIErWIEroiKWVEgTISFERLAkmIDWqIDO1GAkm+REmBSVtJTgJFCEmBUVtJRQhPAghJRQZEVwAgIicTZURwAEUBQQC3Sb5EgYADU0AArSNBAHgyCiInE2VETEsBcABESwVJTgIPREsCSU4DvkRJVwAgsTIATwOyEkyyFE8CshGBBLIQsgGzSYFJW0lOAkUJSYFRW0lOA0UJIhZMSwFcSUxcUU8DTL8iJw9lRElLAg9EIicMZURLAw9ETAknD0xnIicMZURMCScMTGdLBUlLBklOAwgyB08CFk8DFlBPAhZQTBZQSwJJFRZXBgJMUEyAAgAiUExQKExQsCNDIkL/UCJC/v02GgFJFSQSRBc2GgJJFSQSRBeIEZdKDEQnHU8CZyceTGcyBxYoTFCwI0M2GgFJFSUSRDYaAkkVJBJEF0lOAiIpZUREJxYxAIgRLkSIEWiIEW0iKWVEgTISRCcISwJQSU4DvUUBREyIC4lJRCInC2VECCInDWVEDkQiJxxlREEACTIHIiccZUQOREcCvkSBKFtLA0lOAwgWgShMuyInC2VECCcLSwFnIicNZURMCRYoTFCwI0MiSTYaAUkVJRJENhoCSRUlEkQ2GgNHAhUkEkQXIillRESIEN6IEOMiKWVEgTISFEQiJx1lREEACSInHWVEMgcORCInHmVEQQAJMgciJx5lRAxEMQBLBElOAhJEJwhLAVBJRQhJvUUBRCcISwVJTgJQSUUJvUUBREsCiArCSYgKvk8CE0RLAUlETL5EJVsORCIqZUQiK2VED0AADiIqZUSIC8+BCVsyBw1ESwNJiAsaSwNJTgKICxKICpVGAogKkEYCSwVJvkQlW0sCSU4CSwEOREsBCRZPAiVPArtLBUm+RCVbTwIIFiVMuyhLAlCwI0M2GgFJFSUSRDYaAkkVIxJEIlMnFTEAiA+7RCcITwJQSb1FAURJgTAjuiJPA1SBMEy7MgcWKExQsCNDNhoBSRUlEkQ2GgJJFSUSRCcXMQCID4NEIillRIHIARIURIgPs4gPuCcITwJQSb1FARREIhZPAksBUEsBUCcoUEsBUEsBUEsBUEsBUExQvzIHFihMULAjQzYaAUkVJRJENhoCSRUlEkQnCEsCUEm9RQFEMQBPAxJEiA9diA9iIk8CuzIHFihMULAjQzYaAUkVJRJEJwhMUEm9RQFEvkgoTFCwI0M2GgFJFSUSRCcSTGcyBxYoTFCwI0OAAEk2GgFHAhWBaxJENhoCSU4CFYFIEkQ2GgNJTgJJFUsBJVlJgSISRE8CTEsCUklOAyJZgSQIEkSIDtkiVUknCksBZ0EAIkkjEkAAHEmBAhJAABVJgQMSQAAOSYEEEkAAB0mBBRJBAYcjRCInCmVMRQJESwRJgSFbSUUIRIE5VUlFCEEAH0sGIxJAABhLBoECEkAAEEsGgQMSQAAISwaBBBJBAUcjREkjE0EACEsEgZIGUxREIillRBREIicUZUQUREsESSNbSXELRQFEJyxLAWdLAYEJW0lPAhJEJxNLAWexMgAyCiKyErIUTLIRgQSyELIBs0mBEVsnDUxnJwsiZycuSwhnSYEpWyccSwFnSwGBMVsnLUsBZ0sGSU4CgTBbJw5MZycUSwpnSwOBkgZTJyJMZ0sBgRBbJwRMZ0sBgShbJwZMZ0sBJVsnCUxnSwGBGFsnB0xnSwOBOlsnI0xnSwOBQlsnJExnSwOBSlsnH0xnSwOBUlsnIExnSwOBWlsnJUxnSwOBkAZTJyZMZ0sDgZEGUycnTGdPA4FjWycFTGdLASRbKkxnSwGBOFsnEExnSwGBQFsnEUxnJw8iZycMImdLAjIHDURMIltLAgxEDERLAlcAICcqTGdLAVcCACcrTGcyBxYoTFCwI0MiQv62IkL+diKAAEcCNhoBSRUkEkQXSTYaAkkVIxJEIlNMNhoDSU4CSSJZSU4DSYFBC4ECCE8CFRJEiAzsIicKZUxOA0QiKWVEFERJgRAORCInFGVEREyBEAtMgWQLIQQIIoj2tiJJSwQMQQCLSwRXAgBJRQxLAUlOAoFBC4FBWEkkVUlOAkUNSSJbSUUNSwVPBAhLARJESwVPA4gIOEyBCVtJRQpEQQAXSUEAJUkjCYFBC0sLTIFBWIEJW0sIDkRLCEAABUsJIxJESSMIRQFC/5RLBklEIwkWJxhMUEm9RQFESSKBAroXSUQjCYFBC4ECCIFBukL/wUsGFicYTFBJvEhLBb9LBUEADEsBSwQIK0xnKYEyZzIHFihMULAjQyIpZUREiAwCiAwJiAwOIiplRCIrZURLAQ1EiAdmSVcIAUmAAQGoREsBVwAISwJXCQhLA1cRCEsEVxkISwVXIQhLBlcpCEsHVzEISwhXOQhPB08IUE8HUE8GUE8FUCIWUE8EUE8DUE8CUExQiAiYRgIyBxYoTFCwI0MiRwSAAEk2GgFJFSQSRBc2GgJHAhWBSRJEIillRESIC3qIC3+BQVtJgQQaQQCwIicKZUSBBRJEiAtXIicKZURJgQUSREsCSSJbSUUHIitlRBJESVcIAUUMJFWIBuEiK2VEgRAKJzFFBxYnGExQSUUJvUUBQQAHSwe+TEUHREsFSSJZSYEQDERLA0lXCQhLAVcRCEsCVxkISwNXKQhLBFcxCE8FVzkISwsWSxJQTwZQTwVQTwRQTwNQTwJQTFBLAxZQTwJMUEwjCBZXBgJcAEsISbxITL8iK2VEIwgrTGciKmVESwNJTwISRIgGHklFCElXCAFFCiRVSUUGIxJAAChLBIEEEkAAIEsEgQwSQAAYSwSBCxJAABBLBIESEkAACEsEgQUSQQBBI0RLCIABAalESwSBDBJAAAhLBIELEkEAJCNBABonGTEAiAoSREsGSwKIBzpGAjIHFihMULAjQ4gKMEL/6CJC/9kiQv+8Ikk2GgFHAhWBQRJEIillRESIChGIChiICh0iKWVEgTISFEQiJwplRIEFEkRJIltJTgIiK2VETEsBEkRLAVcIAUlOA4ABA6hETIE5W0lOAiMaREEAEyIrZUQjCYgFQIEJW0sEgQlbDkQiK2VEgRAKJzFFBhYnGExQSUUHvUUBQQAHSwW+TEUGREsESSJZSYEQDERLBUlXCQhLAVcRCEsCVxkISwNXIQhLBFcpCE8FVzEISwoWSwpQTwZQTwVQTwRQTwNQTwJQTFBLAxZQTwJMUEwjCBZXBgJcAEsGSbxITL8iK2VEIwgrTGcyBxYoTFCwI0M2GgFJFSMSRCJTJxoxAIgI7kQnL0xnMgcWKExQsCNDIillRElEIicKZUQWSZMkDkRXBwEiJw1lRCInC2VEIicUZUQiKmVEIitlRCInBGVEIicHZUQiJwllRCInBmVEIicQZUQiJxFlRCInD2VEIicMZURPDhZPDkxQTw0WUE8MFlBPCxZQTwoWUE8JFlBPCBZQTwcWUE8GFlBPBRZQTwQWUE8DFlBPAhZQTBZQKExQsCNDIillREQiKmVEIitlRA9BACUiKmVEFicoUCIWTEsBUEsBUEsBUEsBUEsBUEsBUExQKExQsCNDIiplRIgDvUL/8IgIPiNDNhoBSRUlEkSICDEnEkxnMgcWKExQsCNDNhoBSRUlEkSICBknG0xnMgcWKExQsCNDNhoBSRUjEkQ2GgJJTgIVJRJENhoDSU4CFYEQEkSIB+yIB/MXRwKIB/2BFBJBAA4nEksDZzIHFihMULAjQ0mBKBJBABEnF0sDUEm9RQEUREsCv0L/30mBMhJBABEnFksDUEm9RQEUREsCv0L/x0mBPBJBABEnGksDUEm9RQEUREsCv0L/r0mBRhJBABEnFUsDUEm9RQEUREsCv0L/l0mBUBJB/5AnGUsDUEm9RQEUREsCv0L/fzYaAUkVIxJENhoCSU4CFSUSRIgHQogHSRdHAogHU0mBFBNEgSgSQQAVJxdLAlBJvUUBRLxIMgcWKExQsCNDSYEyEkEADycWSwJQSb1FAUS8SEL/4UmBPBJBAA8nGksCUEm9RQFEvEhC/8tJgUYSQQAPJxVLAlBJvUUBRLxIQv+1SYFQEkH/ricZSwJQSb1FAUS8SEL/nzYaAUkVIxJEIlMnFTEAiAZ8RCchTGcyBxYoTFCwI0MiJxJlRChMULAjQzYaAUkVJRJEJxdLAYgGVCcWSwKIBk0nGksDiAZGJxVLBIgGPycZTwWIBjgnKCJPBlQjTwVUgQJPBFSBA08DVIEETwJUKExQsCNDNhoBSRUjEkQ2GgJJTgIVJRJEF0mIBlCDBhQoMjxGUE8GjgYATwBAADEAIgATAAEAJxlLAVBJvUUBRL5IKExQsCNDJxVLAVBJvUUBRL5IQv/rJxpLAVBJvUUBRL5IQv/cJxZLAVBJvUUBRL5IQv/NJxdLAVBJvUUBRL5IQv++gBAAAAAAAAAAAAAAAAAAAAAAQv+pigEAJwiL/1C+RIGAA1MURImKAQInCIv/UEm9RQFESb5IIicQZURLAYE5WwkiJxFlREsCgUFbCUsCJVsiJwVlRE8DSwJPAogAmCInBWVETwNPA08CiACKSwKBSVtLAggWTwNMXElJgVFbSwIIFlxRIicQZUQWXDkiJxFlRBZcQSIqZUQWXDFPA0y/iYoBACKAACcIi/9QSb1FAUQiKWVEgTISQQABiYsCvkxJTgKMAESBKFtJjAFAAAGJiwBJJVuLAUlOAwgWXCAiFlwoiwJMvyInC2VESUsCD0RMCScLTGeJigMBi/1BAAWL/kAAAiKJi/2L/h2L/5eJigEBi/9AAAIiiSInDWVESUQiJwVlRIv/TE8CiP/KiYoBAYv/QAACIokiJw1lRCInBWVEi/9MiP+viYoBASIrZUSL/w1Ei/+BEAoWJxhMUEm9RQFEi/+BEBhLASKBAroXSwENRIFBC4ECCIFBuomKAgCL/yMSQAAfi/8kEkAAGIv/gRMSQAAQi/+BDBJAAAiL/4ELEkEAAyNEiYv+QAAEIkL/9Yv+gQMSQAAIi/6BAhJBABiL/4EDEkAACIv/gRISQQAEI0L/0SJC/82L/iMSQQAgi/+BAxJAABCL/4ESEkAACIv/gQUSQQAEI0L/qiJC/6aL/oEEEkEAKIv/gQMSQAAYi/+BBBJAABCL/4ESEkAACIv/gQUSQQAEI0L/eiJC/3aL/oEFEkEACIv/gQMSQv9mIkL/YiInCmVEIxJBAAoiJyJlREEAAiOJIomKAQKL/4ERW0lBABAiJwllREEACCInB2VEQAAGIov/TwKJIicHZUQiJwllRCInBWVEiP5oIicFZUSLAEyI/l2L/08CiYoCAYv/QAADi/6JIicFZUQiJwllRIv/SwKI/jwISUQiJwVlRIv+TE8CiP4siYoCAiKAAEcIi/4iWyIqZUQSRIv+gQlbMgcORIv+JFVJIxJJQQBeIillRIEyEkQiJwtlRCInDWVEEkSL/oExWycESwFnJwdMZ4v+gSFbJwlMZycGImeL/oEpWycOTGciKmVEIwgqTGcpgWRniwtEIicUZUSL/kwiiAHaSYz+i/+MAYwAiSIpZUSBMhIURCInBmVEi/6I/viM/ggnBkxniwqBDBJBAXiL/4EhWyInJGVEIicFZUSI/XMiJyNlRAiMBiInJmVEQQATIicfZUSLBg1BAAgiJx9lTIwGRCInJ2VEQQATIicgZUSLBgxBAAgiJyBlTIwGRCcJiwZniwqBBBJBAQeL/oExWycESwFnJwdMZ4j+ZUEA54sKgQUSQQDFIitlRCIqZUQJgWQLIQQIIojrxCInBWVMjAJEIowBIowHi/6BGVtJjAhBAA+LAosIiP6BSYwCI4wHjAEiKmVEIwiMAyIrZUSLAw1BAFKLA4j9DEmMACRVSYwEgQMSQAAQiwSBExJBADOLAIEZW0EAKyNBAAiLB0EADCKMB4sDIwiMA0L/vosAgRlbiwJMiP4kSYwCiwEIjAFC/+EiQv/SiwFEIicEZUSL/oE5WyQaQAAGIicGZUQIIicFZUSLAYj8SycOTGciKmVEIwgqTGeL/iJJiABgSYz+i/+MAYwAiYv+gSlbJw5MZ0L/2osKgRISQf7/IicEZUQnB0xnQv7ziwqBCxJBABuL/oEhW0mMBUAACCInJWVMjAVEJwmLBWdC/rqL/oEhW0mMCUH+rycJiwlnQv6nigMBMgiL/SJbi/1XCAGL/VcJCDIHi/0kVYv+QABFIxZJkyQORFcHASInE2VEiwFJIwiLABZPAhZQiwJQiwNQiwQWUIv+FlBPA1CL/xZQTwIWUEwWUIAEmjMrlUxQsIv9jACJiwUjEkAACIsFgQQSQQAEI0L/qYH/AUL/o4oCAYAAi/6L/1BJvUUBQQAfiwG+RCJbMgdJjAAOQQAQiwG+RCRbiwAPQQAEI4wAiSJC//kxACInEmVEEkSJIicpZUQURIkiJyFlRBREiYoBAIv/gRQSQAAwi/+BGRJAACiL/4EoEkAAIIv/gTISQAAYi/+BPBJAABCL/4FGEkAACIv/gVASQQADI0SJIkL/+g==", "clear": "DIEBQw=="}, "desc": "Debt Algorand Standard Application.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "networks": {}, "source": {"approval": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCAzMiAxNTAwCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUgInN0YXR1cyIgImV2ZW50X2N1cnNvciIgInNjaGVkdWxlX2VudHJ5X2NvdW50IiAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIiAiZml4ZWRfcG9pbnRfc2NhbGUiICJhY2NydWVkX2ludGVyZXN0IiAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIgMHg0MTIzICJub21pbmFsX2ludGVyZXN0X3JhdGUiICJjb250cmFjdF90eXBlIiAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiICJyZXNlcnZlZF9wcmluY2lwYWwiICJ0b3RhbF91bml0cyIgIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iICJyZXNlcnZlZF9pbnRlcmVzdCIgImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIgMHg1MjNhNDE1MjUyMjMgInNldHRsZW1lbnRfYXNzZXRfaWQiICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIgMHg1MjNhNDE1NTU0MjMgMHg1MjNhNTA1OTQ0MjMgMHg1MjNhNGQ0ZTQ3MjMgMHg1MzIzIDB4NTIzYTRkNGY0MzIzIDB4NTIzYTU0NTI1MzIzIDB4NTIzYTRmNTA0NDIzICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiICJ0cmFuc2Zlcl9vcGVuaW5nX2RhdGUiICJ0cmFuc2Zlcl9jbG9zdXJlX2RhdGUiICJyYXRlX3Jlc2V0X2Zsb29yIiAicmF0ZV9yZXNldF9jYXAiICJhc3NldF9zdXNwZW5kZWQiICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIiAicmF0ZV9yZXNldF9zcHJlYWQiICJyYXRlX3Jlc2V0X211bHRpcGxpZXIiICJyYXRlX3Jlc2V0X25leHQiICJoYXNfcmF0ZV9yZXNldF9mbG9vciIgImhhc19yYXRlX3Jlc2V0X2NhcCIgMHgwMCAiYXNzZXRfZGVmYXVsdGVkIiAicHJvc3BlY3R1c19oYXNoIiAicHJvc3BlY3R1c191cmwiICJkZW5vbWluYXRpb25fYXNzZXRfaWQiICJtYXR1cml0eV9kYXRlIiAiZGF5X2NvdW50X2NvbnZlbnRpb24iICJkZWZhdWx0ZWQiIDB4MDY4MTAxIDB4MDAwMAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4LTI5CiAgICAvLyAjIFJCQUMgUm9sZXMKICAgIC8vIHNlbGYuYXJyYW5nZXIgPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX0FSUkFOR0VSKQogICAgYnl0ZWMgMTggLy8gMHg1MjNhNDE1MjUyMjMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMAogICAgLy8gc2VsZi5vcF9kYWVtb24gPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX09QX0RBRU1PTikKICAgIGJ5dGVjIDI3IC8vIDB4NTIzYTRmNTA0NDIzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NDctNDgKICAgIC8vICMgRC1BU0EgR292ZXJuYW5jZQogICAgLy8gc2VsZi5hc3NldF9zdXNwZW5kZWQgPSBGYWxzZQogICAgYnl0ZWMgMzMgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjQ5CiAgICAvLyBzZWxmLmFzc2V0X2RlZmF1bHRlZCA9IEZhbHNlCiAgICBieXRlYyA0MSAvLyAiYXNzZXRfZGVmYXVsdGVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1Ni01NwogICAgLy8gIyBDb250cmFjdAogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKQogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OAogICAgLy8gc2VsZi5jb250cmFjdF90eXBlID0gVUludDY0KCkKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MC02MQogICAgLy8gIyBQcm9zcGVjdHVzIChJbmZvcm1hdGlvbmFsKQogICAgLy8gc2VsZi5wcm9zcGVjdHVzX2hhc2ggPSBCeXRlcygpCiAgICBieXRlYyA0MiAvLyAicHJvc3BlY3R1c19oYXNoIgogICAgcHVzaGJ5dGVzIDB4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjIKICAgIC8vIHNlbGYucHJvc3BlY3R1c191cmwgPSBTdHJpbmcoKQogICAgYnl0ZWMgNDMgLy8gInByb3NwZWN0dXNfdXJsIgogICAgcHVzaGJ5dGVzICIiCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjQtNjUKICAgIC8vICMgRGVub21pbmF0aW9uCiAgICAvLyBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCA9IEFzc2V0KCkKICAgIGJ5dGVjIDQ0IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBBc3NldCgpCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjgtNjkKICAgIC8vICMgVGltZQogICAgLy8gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGUgPSB0eXAuVGltZVN0YW1wKCkKICAgIGJ5dGVjIDI4IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcwCiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSB0eXAuVGltZVN0YW1wKCkKICAgIGJ5dGVjIDQ1IC8vICJtYXR1cml0eV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MQogICAgLy8gc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgPSB0eXAuVGltZVN0YW1wKCkKICAgIGJ5dGVjIDI5IC8vICJ0cmFuc2Zlcl9vcGVuaW5nX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcyCiAgICAvLyBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgMzAgLy8gInRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzQtNzUKICAgIC8vICMgRGF5IENvdW50IENvbnZlbnRpb24KICAgIC8vIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPSBVSW50NjQoKQogICAgYnl0ZWMgNDYgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3Ny03OAogICAgLy8gIyBVbml0cwogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IFVJbnQ2NCgpCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc5CiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID0gVUludDY0KCkKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODEtODIKICAgIC8vICMgUHJpbmNpcGFsCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID0gVUludDY0KCkKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODMKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gVUludDY0KCkKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODUKICAgIC8vIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiA9IEZhbHNlCiAgICBieXRlYyAzNCAvLyAiZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODctODgKICAgIC8vICMgSW50ZXJlc3QKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OQogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ID0gVUludDY0KCkKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkxLTkyCiAgICAvLyAjIEludGVyZXN0IFJhdGVzCiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzCiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkID0gVUludDY0KCkKICAgIGJ5dGVjIDM1IC8vICJyYXRlX3Jlc2V0X3NwcmVhZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9tdWx0aXBsaWVyID0gVUludDY0KCkKICAgIGJ5dGVjIDM2IC8vICJyYXRlX3Jlc2V0X211bHRpcGxpZXIiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfZmxvb3IgPSBVSW50NjQoKQogICAgYnl0ZWMgMzEgLy8gInJhdGVfcmVzZXRfZmxvb3IiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfY2FwID0gVUludDY0KCkKICAgIGJ5dGVjIDMyIC8vICJyYXRlX3Jlc2V0X2NhcCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTcKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9uZXh0ID0gVUludDY0KCkKICAgIGJ5dGVjIDM3IC8vICJyYXRlX3Jlc2V0X25leHQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4CiAgICAvLyBzZWxmLmhhc19yYXRlX3Jlc2V0X2Zsb29yID0gRmFsc2UKICAgIGJ5dGVjIDM4IC8vICJoYXNfcmF0ZV9yZXNldF9mbG9vciIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTkKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwID0gRmFsc2UKICAgIGJ5dGVjIDM5IC8vICJoYXNfcmF0ZV9yZXNldF9jYXAiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMS0xMDIKICAgIC8vICMgUHJpbWFyeSBEaXN0cmlidXRpb24KICAgIC8vIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsID0gVUludDY0KCkKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMwogICAgLy8gc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNS0xMDYKICAgIC8vICMgQ3VtdWxhdGl2ZSBQZXItVW5pdCBGaXhlZC1Qb2ludCBJbmRleGVzCiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggPSBVSW50NjQoKQogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNwogICAgLy8gc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNQogICAgLy8gc2VsZi5ldmVudF9jdXJzb3IgPSBVSW50NjQoKQogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTYKICAgIC8vIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgPSBVSW50NjQoKQogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExOC0xMTkKICAgIC8vICMgUGVyZm9ybWFuY2UKICAgIC8vIHNlbGYuZGVmYXVsdGVkID0gRmFsc2UKICAgIGJ5dGVjIDQ3IC8vICJkZWZhdWx0ZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMS0xMjIKICAgIC8vICMgU2NhbGluZwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjIzCiAgICAvLyBhc3NlcnQgVHhuLmdsb2JhbF9udW1fYnl0ZV9zbGljZSA9PSBjZmcuR0xPQkFMX0JZVEVTLCBlcnIuV1JPTkdfR0xPQkFMX0JZVEVTCiAgICB0eG4gR2xvYmFsTnVtQnl0ZVNsaWNlCiAgICBwdXNoaW50IDEwCiAgICA9PQogICAgYXNzZXJ0IC8vIFdyb25nIEdsb2JhbCBCeXRlcyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6MjQKICAgIC8vIGFzc2VydCBUeG4uZ2xvYmFsX251bV91aW50ID09IGNmZy5HTE9CQUxfVUlOVFMsIGVyci5XUk9OR19HTE9CQUxfVUlOVFMKICAgIHR4biBHbG9iYWxOdW1VaW50CiAgICBwdXNoaW50IDU0CiAgICA9PQogICAgYXNzZXJ0IC8vIFdyb25nIEdsb2JhbCBVSW50cyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6MjUKICAgIC8vIGFzc2VydCBUeG4ubG9jYWxfbnVtX2J5dGVfc2xpY2UgPT0gY2ZnLkxPQ0FMX0JZVEVTLCBlcnIuV1JPTkdfTE9DQUxfQllURVMKICAgIHR4biBMb2NhbE51bUJ5dGVTbGljZQogICAgIQogICAgYXNzZXJ0IC8vIFdyb25nIExvY2FsIEJ5dGVzIGFsbG9jYXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kX2FzYS9jb250cmFjdC5weToyNgogICAgLy8gYXNzZXJ0IFR4bi5sb2NhbF9udW1fdWludCA9PSBjZmcuTE9DQUxfVUlOVFMsIGVyci5XUk9OR19MT0NBTF9VSU5UUwogICAgdHhuIExvY2FsTnVtVWludAogICAgIQogICAgYXNzZXJ0IC8vIFdyb25nIExvY2FsIFVJbnRzIGFsbG9jYXRpb24KCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjgtMTgKICAgIC8vIGNsYXNzIERBU0EoCiAgICAvLyAgICAgUGF5bWVudEFnZW50LAogICAgLy8gICAgIFRyYW5zZmVyQWdlbnQsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyAgICAgYXZtX3ZlcnNpb249MTIsCiAgICAvLyApOgogICAgcHVzaGJ5dGVzIDB4OTE0ZjA0ZWIgLy8gbWV0aG9kICJjb250cmFjdF91cGRhdGUoKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX2NvbnRyYWN0X3VwZGF0ZV9yb3V0ZUA0CgptYWluX3N3aXRjaF9jYXNlX25leHRANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kX2FzYS9jb250cmFjdC5weTo4LTE4CiAgICAvLyBjbGFzcyBEQVNBKAogICAgLy8gICAgIFBheW1lbnRBZ2VudCwKICAgIC8vICAgICBUcmFuc2ZlckFnZW50LAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gICAgIGF2bV92ZXJzaW9uPTEyLAogICAgLy8gKToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJ6IG1haW5fY3JlYXRlX05vT3BAMzMKICAgIHB1c2hieXRlc3MgMHhiNDQ2MThjOCAweGU3ODMyNTI5IDB4OTQzODg3MjMgMHg2Yzg1ZTNlZSAweGJkZDFhOTQ0IDB4N2MwZjE4MTIgMHgxNGZjMTBlZiAweDc0YTcyOTdmIDB4MDlkNGZlMTQgMHg5YTliZmE4NSAweDg1ZWVkMzNkIDB4YWIyYzBmYzQgMHhkOWYyMjVhYyAweDk4ODM1MDVhIDB4ZmI0ZDQ0MjggMHg4ZWE2ZTc0YyAweDAyYWY1NTdhIDB4ODJmNzFiMmQgMHhlZjA0ZjVkMyAweGRmMzQzNTUwIDB4M2RiZTgwYmQgMHgxZTNlNDhlNyAweDAxMGM4Mjk5IDB4NzQwNmFjZDIgMHgxYTcyYTJlZSAvLyBtZXRob2QgImZ1bmRfZHVlX2Nhc2hmbG93cyh1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJjbGFpbV9kdWVfY2FzaGZsb3dzKGFkZHJlc3MsYnl0ZVtdKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYnl0ZVtdKSIsIG1ldGhvZCAidHJhbnNmZXJfc2V0X3NjaGVkdWxlKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbihhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInRyYW5zZmVyKGFkZHJlc3MsYWRkcmVzcyx1aW50NjQpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X3N1c3BlbnNpb24oYWRkcmVzcyxib29sKXVpbnQ2NCIsIG1ldGhvZCAiYWNjb3VudF9vcGVuKGFkZHJlc3MsYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgImFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzcyhhZGRyZXNzLGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X2dldF9wb3NpdGlvbihhZGRyZXNzKShhZGRyZXNzLHVpbnQ2NCx1aW50NjQsYm9vbCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAiY29udHJhY3RfY29uZmlnKCh1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxib29sLGJvb2wsYm9vbCx1aW50NjQpLCh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCksKGJ5dGVbMzJdLHN0cmluZykpdWludDY0IiwgbWV0aG9kICJjb250cmFjdF9zY2hlZHVsZSh1aW50NjQsYm9vbCwodWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NClbXSl1aW50NjQiLCBtZXRob2QgImNvbnRyYWN0X2V4ZWN1dGVfaWVkKCl1aW50NjQiLCBtZXRob2QgImFwcGx5X25vbl9jYXNoX2V2ZW50KHVpbnQ2NCwodWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIsIG1ldGhvZCAiYXBwZW5kX29ic2VydmVkX2Nhc2hfZXZlbnQoKHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIsIG1ldGhvZCAiY29udHJhY3Rfc2V0X2RlZmF1bHRfc3RhdHVzKGJvb2wpdWludDY0IiwgbWV0aG9kICJjb250cmFjdF9nZXRfc3RhdGUoKSh1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAiY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50KCkodWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgInJiYWNfcm90YXRlX2FycmFuZ2VyKGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX3NldF9vcF9kYWVtb24oYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgInJiYWNfYXNzaWduX3JvbGUodWludDgsYWRkcmVzcywodWludDY0LHVpbnQ2NCkpdWludDY0IiwgbWV0aG9kICJyYmFjX3Jldm9rZV9yb2xlKHVpbnQ4LGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX2NvbnRyYWN0X3N1c3BlbnNpb24oYm9vbCl1aW50NjQiLCBtZXRob2QgInJiYWNfZ2V0X2FycmFuZ2VyKClhZGRyZXNzIiwgbWV0aG9kICJyYmFjX2dldF9hZGRyZXNzX3JvbGVzKGFkZHJlc3MpKGJvb2wsYm9vbCxib29sLGJvb2wsYm9vbCkiLCBtZXRob2QgInJiYWNfZ2V0X3JvbGVfdmFsaWRpdHkodWludDgsYWRkcmVzcykodWludDY0LHVpbnQ2NCkiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBmdW5kX2R1ZV9jYXNoZmxvd3MgY2xhaW1fZHVlX2Nhc2hmbG93cyB0cmFuc2Zlcl9zZXRfc2NoZWR1bGUgcHJpbWFyeV9kaXN0cmlidXRpb24gdHJhbnNmZXIgYWNjb3VudF9zdXNwZW5zaW9uIGFjY291bnRfb3BlbiBhY2NvdW50X3VwZGF0ZV9wYXltZW50X2FkZHJlc3MgYWNjb3VudF9nZXRfcG9zaXRpb24gY29udHJhY3RfY29uZmlnIGNvbnRyYWN0X3NjaGVkdWxlIGNvbnRyYWN0X2V4ZWN1dGVfaWVkIGFwcGx5X25vbl9jYXNoX2V2ZW50IGFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50IGNvbnRyYWN0X3NldF9kZWZhdWx0X3N0YXR1cyBjb250cmFjdF9nZXRfc3RhdGUgY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50IHJiYWNfcm90YXRlX2FycmFuZ2VyIHJiYWNfc2V0X29wX2RhZW1vbiByYmFjX2Fzc2lnbl9yb2xlIHJiYWNfcmV2b2tlX3JvbGUgcmJhY19jb250cmFjdF9zdXNwZW5zaW9uIHJiYWNfZ2V0X2FycmFuZ2VyIHJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXMgcmJhY19nZXRfcm9sZV92YWxpZGl0eQogICAgZXJyCgptYWluX2NyZWF0ZV9Ob09wQDMzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjgtMTgKICAgIC8vIGNsYXNzIERBU0EoCiAgICAvLyAgICAgUGF5bWVudEFnZW50LAogICAgLy8gICAgIFRyYW5zZmVyQWdlbnQsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyAgICAgYXZtX3ZlcnNpb249MTIsCiAgICAvLyApOgogICAgcHVzaGJ5dGVzIDB4OTU2ZDcxNTYgLy8gbWV0aG9kICJjb250cmFjdF9jcmVhdGUoYWRkcmVzcyl1aW50NjQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBjb250cmFjdF9jcmVhdGUKICAgIGVycgoKbWFpbl9jb250cmFjdF91cGRhdGVfcm91dGVANDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgNCAvLyBVcGRhdGVBcHBsaWNhdGlvbgogICAgPT0KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0CiAgICBiIGNvbnRyYWN0X3VwZGF0ZQoKCi8vIF9wdXlhX2xpYi51dGlsLmVuc3VyZV9idWRnZXQocmVxdWlyZWRfYnVkZ2V0OiB1aW50NjQsIGZlZV9zb3VyY2U6IHVpbnQ2NCkgLT4gdm9pZDoKZW5zdXJlX2J1ZGdldDoKICAgIHByb3RvIDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDEwCiAgICArCgplbnN1cmVfYnVkZ2V0X3doaWxlX3RvcEAxOgogICAgZnJhbWVfZGlnIDAKICAgIGdsb2JhbCBPcGNvZGVCdWRnZXQKICAgID4KICAgIGJ6IGVuc3VyZV9idWRnZXRfYWZ0ZXJfd2hpbGVANgogICAgaXR4bl9iZWdpbgogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGJ5dGVjIDQ4IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbQogICAgYnl0ZWMgNDggLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KICAgIGZyYW1lX2RpZyAtMQogICAgc3dpdGNoIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMEAzIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMUA0CgplbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX25leHRANToKICAgIGl0eG5fc3VibWl0CiAgICBiIGVuc3VyZV9idWRnZXRfd2hpbGVfdG9wQDEKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMUA0OgogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgaXR4bl9maWVsZCBGZWUKICAgIGIgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV9uZXh0QDUKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMEAzOgogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBiIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfbmV4dEA1CgplbnN1cmVfYnVkZ2V0X2FmdGVyX3doaWxlQDY6CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnBheW1lbnRfYWdlbnQuUGF5bWVudEFnZW50LmZ1bmRfZHVlX2Nhc2hmbG93c1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmZ1bmRfZHVlX2Nhc2hmbG93czoKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gMTMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDYKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjY4CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2OQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3MAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzOAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTAKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzIKICAgIC8vIGlmIHNlbGYuX2lzX2R5bmFtaWNfYW5udWl0eSgpOgogICAgY2FsbHN1YiBfaXNfZHluYW1pY19hbm51aXR5CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzYtNzcKICAgIC8vICsgbWF4X2V2ZW50X2NvdW50CiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfRlVORF9EVUVfQ0FTSEZMT1dTX1BFUl9FVkVOVF9CVURHRVQpCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3NwogICAgLy8gKiBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19QRVJfRVZFTlRfQlVER0VUKQogICAgcHVzaGludCAxMDAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3Ni03NwogICAgLy8gKyBtYXhfZXZlbnRfY291bnQKICAgIC8vICogVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfUEVSX0VWRU5UX0JVREdFVCkKICAgICoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3NQogICAgLy8gVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfQkFTRV9CVURHRVQpCiAgICBpbnRjIDQgLy8gMTUwMAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojc1LTc3CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19CQVNFX0JVREdFVCkKICAgIC8vICsgbWF4X2V2ZW50X2NvdW50CiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfRlVORF9EVUVfQ0FTSEZMT1dTX1BFUl9FVkVOVF9CVURHRVQpCiAgICArCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzMtNzkKICAgIC8vIGVuc3VyZV9idWRnZXQoCiAgICAvLyAgICAgcmVxdWlyZWRfYnVkZ2V0PSgKICAgIC8vICAgICAgICAgVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfQkFTRV9CVURHRVQpCiAgICAvLyAgICAgICAgICsgbWF4X2V2ZW50X2NvdW50CiAgICAvLyAgICAgICAgICogVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfUEVSX0VWRU5UX0JVREdFVCkKICAgIC8vICAgICApLAogICAgLy8gKQogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4MQogICAgLy8gcHJvY2Vzc2VkX2V2ZW50cyA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjgyCiAgICAvLyBmdW5kZWRfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDE0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODMKICAgIC8vIGZ1bmRlZF9wcmluY2lwYWwgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDEzCgpmdW5kX2R1ZV9jYXNoZmxvd3Nfd2hpbGVfdG9wQDQ6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODYKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgPCBtYXhfZXZlbnRfY291bnQKICAgIGRpZyA0CiAgICBkaWcgMQogICAgPAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojg2LTg3CiAgICAvLyBwcm9jZXNzZWRfZXZlbnRzIDwgbWF4X2V2ZW50X2NvdW50CiAgICAvLyBhbmQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAMTEKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4NwogICAgLy8gYW5kIHNlbGYuZXZlbnRfY3Vyc29yIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICA8CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODYtODcKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgPCBtYXhfZXZlbnRfY291bnQKICAgIC8vIGFuZCBzZWxmLmV2ZW50X2N1cnNvciA8IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQKICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl93aGlsZUAxMQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojg5CiAgICAvLyBlbnRyeSA9IHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLmV2ZW50X2N1cnNvcikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICBkdXAKICAgIGJ1cnkgMTcKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5MAogICAgLy8gaWYgZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcDoKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSAzCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDExCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6OTIKICAgIC8vIGlmIG5vdCBzZWxmLl9ldmVudF9pc19jYXNoKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkpOgogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBidXJ5IDE2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNTQKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgaW50Y18yIC8vIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM1My0zNTcKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX01EKSwKICAgIC8vICkKICAgID09CiAgICBkdXAKICAgIGJ1cnkgNAogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX3RydWVANTIKICAgIGRpZyAxNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzU1CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzUzLTM1NwogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfTUQpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDUyCiAgICBkaWcgMTQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM1NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9NRCksCiAgICBwdXNoaW50IDE5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNTMtMzU3CiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9NRCksCiAgICAvLyApCiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VANTMKCmZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX3RydWVANTI6CiAgICBpbnRjXzEgLy8gMQoKZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfbWVyZ2VANTQ6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6OTIKICAgIC8vIGlmIG5vdCBzZWxmLl9ldmVudF9pc19jYXNoKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkpOgogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTEKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF9pZCA9PSBzZWxmLmV2ZW50X2N1cnNvciwgZXJyLklOVkFMSURfRVZFTlRfQ1VSU09SCiAgICBkaWcgMTUKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgY3Vyc29yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTIKICAgIC8vIGFzc2VydCBlbnRyeS5zY2hlZHVsZWRfdGltZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwgZXJyLk5PX0RVRV9DQVNIRkxPVwogICAgZGlnIDEKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIDw9CiAgICBhc3NlcnQgLy8gTm8gZHVlIGNhc2hmbG93IHRvIHBheQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDE2CiAgICAvLyBpZiBldmVudF90eXBlIG5vdCBpbiAoVUludDY0KGVudW1zLkVWVF9JUCksIFVJbnQ2NChlbnVtcy5FVlRfTUQpKToKICAgIGRpZyAyCiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTUKICAgIGRpZyAxNAogICAgcHVzaGludCAxOQogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDE3CiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAxMQoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X2ludGVyZXN0X2Ftb3VudEAxNjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQyOQogICAgLy8gZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGRpZyAxNQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSAxNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDMwCiAgICAvLyBpZiBldmVudF90eXBlIG5vdCBpbiAoVUludDY0KGVudW1zLkVWVF9QUiksIFVJbnQ2NChlbnVtcy5FVlRfTUQpKToKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxOQogICAgZGlnIDE0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzEKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDYKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTU2CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA9IGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBkaWcgMTUKICAgIHB1c2hpbnQgNDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBidXJ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1OQogICAgLy8gaWYgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCk6CiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUAyOQogICAgZGlnIDcKICAgIGJ1cnkgOQoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzUtNTc3CiAgICAvLyAjIEZ1bmRpbmcgdXNlcyBwZXItdW5pdCBjdW11bGF0aXZlIGluZGljZXMgc28gZWFjaCBob2xkZXIgY2FuIHNldHRsZQogICAgLy8gIyBpbmRlcGVuZGVudGx5IGZyb20gaXRzIGN1cnJlbnQgdW5pdCBiYWxhbmNlLgogICAgLy8gaW50ZXJlc3RfaW5kZXhfZGVsdGEgPSBzZWxmLl9hbW91bnRfdG9faW5kZXhfZGVsdGEoaW50ZXJlc3RfYW1vdW50X2R1ZSkKICAgIGRpZyAxMAogICAgY2FsbHN1YiBfYW1vdW50X3RvX2luZGV4X2RlbHRhCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzgKICAgIC8vIHByaW5jaXBhbF9pbmRleF9kZWx0YSA9IHNlbGYuX2Ftb3VudF90b19pbmRleF9kZWx0YShwcmluY2lwYWxfYW1vdW50X2R1ZSkKICAgIGRpZyA2CiAgICBjYWxsc3ViIF9hbW91bnRfdG9faW5kZXhfZGVsdGEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU3OQogICAgLy8gaW50ZXJlc3RfYW1vdW50ID0gc2VsZi5faW5kZXhfZGVsdGFfdG9fYW1vdW50KGludGVyZXN0X2luZGV4X2RlbHRhKQogICAgZGlnIDEKICAgIGNhbGxzdWIgX2luZGV4X2RlbHRhX3RvX2Ftb3VudAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBidXJ5IDE1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1ODAKICAgIC8vIHByaW5jaXBhbF9hbW91bnQgPSBzZWxmLl9pbmRleF9kZWx0YV90b19hbW91bnQocHJpbmNpcGFsX2luZGV4X2RlbHRhKQogICAgZHVwCiAgICBjYWxsc3ViIF9pbmRleF9kZWx0YV90b19hbW91bnQKICAgIGR1cAogICAgYnVyeSAxMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTgxCiAgICAvLyByZXF1aXJlZF9hbW91bnQgPSBpbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50CiAgICBkaWcgMgogICAgZGlnIDEKICAgICsKICAgIGR1cAogICAgYnVyeSA5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MzcKICAgIC8vIGJhbGFuY2UgPSBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBvcHRlZCBpbnRvIGFzc2V0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NTkKICAgIC8vIHJldHVybiBzZWxmLnJlc2VydmVkX2ludGVyZXN0ICsgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICBkaWcgMQogICAgKwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzM5CiAgICAvLyBhc3NlcnQgYmFsYW5jZSA+PSByZXNlcnZlZF90b3RhbCwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGRpZyAyCiAgICBkaWcgMQogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzQwCiAgICAvLyByZXR1cm4gYmFsYW5jZSAtIHJlc2VydmVkX3RvdGFsCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIC0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4MwogICAgLy8gc2VsZi5fYXZhaWxhYmxlX3NldHRsZW1lbnRfZnVuZHMoKSA+PSByZXF1aXJlZF9hbW91bnQKICAgIHVuY292ZXIgMgogICAgPj0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4Mi01ODQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5fYXZhaWxhYmxlX3NldHRsZW1lbnRfZnVuZHMoKSA+PSByZXF1aXJlZF9hbW91bnQKICAgIC8vICksIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcyBmb3IgdGhlIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4NgogICAgLy8gc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCArPSBpbnRlcmVzdF9hbW91bnQKICAgIHVuY292ZXIgMwogICAgKwogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4NwogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgKz0gcHJpbmNpcGFsX2Ftb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIGV4aXN0cwogICAgKwogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1ODgKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCArPSBpbnRlcmVzdF9pbmRleF9kZWx0YQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggZXhpc3RzCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4OQogICAgLy8gc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCArPSBwcmluY2lwYWxfaW5kZXhfZGVsdGEKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggZXhpc3RzCiAgICArCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTkwCiAgICAvLyBpZiBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpOgogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgcHVzaGludCAzCiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUA0MAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTkxLTU5MgogICAgLy8gIyBGb3IgUFIsIHRoZSBwZXJpb2QgaW50ZXJlc3Qgc3RheXMgYWNjcnVlZCB1bnRpbCBhIGxhdGVyIElQIG9yIE1ELgogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ICs9IHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZGlnIDE2CiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBidXJ5IDE4CiAgICArCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQxOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTk1CiAgICAvLyBpZiBub3Qgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCkgb3IgZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSA9PSBVSW50NjQoCiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDQzCiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTUtNTk3CiAgICAvLyBpZiBub3Qgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCkgb3IgZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSA9PSBVSW50NjQoCiAgICAvLyAgICAgZW51bXMuRVZUX01ECiAgICAvLyApOgogICAgcHVzaGludCAxOQogICAgPT0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQ0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUA0MzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5OAogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gZW50cnkubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZGlnIDE1CiAgICBwdXNoaW50IDQxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTkKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGRpZyA4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAwCiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBuZXh0X2ludGVyZXN0X2Jhc2UKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBkaWcgOQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwMQogICAgLy8gc2VsZi5ldmVudF9jdXJzb3IgKz0gVUludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAzCiAgICAvLyBpZiBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoCiAgICBkaWcgMTUKICAgIGV4dHJhY3QgOCAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MDMtNjA1CiAgICAvLyBpZiBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoCiAgICAvLyAgICAgZW51bXMuRVZUX01ECiAgICAvLyApIGFuZCBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9PSBVSW50NjQoMCk6CiAgICBwdXNoYnl0ZXMgMHgxMwogICAgYj09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0NwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjA1CiAgICAvLyApIGFuZCBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9PSBVSW50NjQoMCk6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwMy02MDUKICAgIC8vIGlmIGVudHJ5LmV2ZW50X3R5cGUgPT0gYXJjNC5VSW50OCgKICAgIC8vICAgICBlbnVtcy5FVlRfTUQKICAgIC8vICkgYW5kIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID09IFVJbnQ2NCgwKToKICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0NwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjA2CiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbnVtcy5TVEFUVVNfRU5ERUQpCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBwdXNoaW50IDIwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwNwogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gVUludDY0KDApCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0NzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwOS02MTMKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1pbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50LAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PWludGVyZXN0X2Ftb3VudCArIHByaW5jaXBhbF9hbW91bnQsCiAgICAvLyApCiAgICBkaWcgMTUKICAgIGRpZyA0CiAgICBkdXAKICAgIGNhbGxzdWIgX2VtaXRfZXhlY3V0aW9uX2V2ZW50CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5NgogICAgLy8gZnVuZGVkX2ludGVyZXN0ICs9IGludGVyZXN0X2Ftb3VudAogICAgZGlnIDEzCiAgICBkaWcgMTIKICAgICsKICAgIGJ1cnkgMTQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5NwogICAgLy8gZnVuZGVkX3ByaW5jaXBhbCArPSBwcmluY2lwYWxfYW1vdW50CiAgICBkaWcgMTIKICAgIGRpZyA3CiAgICArCiAgICBidXJ5IDEzCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6OTgKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgKz0gVUludDY0KDEpCiAgICBkaWcgNAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgNQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3Nfd2hpbGVfdG9wQDQKCmZ1bmRfZHVlX2Nhc2hmbG93c19lbHNlX2JvZHlANDA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTQKICAgIC8vIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0MQoKZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlAMjk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjAKICAgIC8vIGV2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ1cnkgMTYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU2MS01NjMKICAgIC8vICMgRHluYW1pYyBhbm51aXRpZXMgZGVyaXZlIG5leHQgc3RhdGUgZnJvbSB0aGUgcGF5bWVudCBkZWNvbXBvc2l0aW9uLAogICAgLy8gIyBub3Qgb25seSBmcm9tIHRoZSBwcmVjb21wdXRlZCBgbmV4dF8qYCBmaWVsZHMuCiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpOgogICAgcHVzaGludCAzCiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUAzMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY1CiAgICAvLyBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCAtIHByaW5jaXBhbF9hbW91bnRfZHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGRpZyA2CiAgICAtCiAgICBkdXAKICAgIGJ1cnkgOQogICAgYnVyeSA5CiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDMxOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY4CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9JUCk6CiAgICBkaWcgMTQKICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUAzMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY5CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGJ1cnkgOQogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTcwCiAgICAvLyBuZXh0X2ludGVyZXN0X2Jhc2UgPSBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGJ1cnkgMTAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgZXhpc3RzCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDMzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTcxCiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCk6CiAgICBkaWcgMTQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlAMzQKICAgIGRpZyA3CiAgICBidXJ5IDkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzgKCmZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDM0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTcyCiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTczCiAgICAvLyBuZXh0X2ludGVyZXN0X2Jhc2UgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzgKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDMyCiAgICAvLyBpZiBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKToKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzMwogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKToKICAgIGRpZyAxNAogICAgcHVzaGludCAxOQogICAgPT0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDIyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzQKICAgIC8vIHJldHVybiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1NQogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzUKICAgIC8vIGludGVyZXN0X2R1ZSA9IHNlbGYuYWNjcnVlZF9pbnRlcmVzdCArIHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZGlnIDE2CiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBidXJ5IDE4CiAgICArCiAgICBkdXAKICAgIGJ1cnkgMTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzNgogICAgLy8gaWYgc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIDw9IGludGVyZXN0X2R1ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIGV4aXN0cwogICAgPj0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDI0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzcKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1NQogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzgKICAgIC8vIHByaW5jaXBhbF9hbW91bnQgPSBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gLSBpbnRlcmVzdF9kdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIGV4aXN0cwogICAgZGlnIDEwCiAgICAtCiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDM5CiAgICAvLyBpZiBwcmluY2lwYWxfYW1vdW50ID4gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWw6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgID4KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDI2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NDAKICAgIC8vIHJldHVybiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1NQogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjY6CiAgICBkaWcgNgogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTUKICAgIC8vIHByaW5jaXBhbF9hbW91bnRfZHVlID0gc2VsZi5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudChlbnRyeSkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnRAMjgKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDI3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDQzCiAgICAvLyBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA8PSBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZGlnIDE1CiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBkdXAyCiAgICA8PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDQyLTQ0NAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA8PSBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NDUKICAgIC8vIHJldHVybiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCAtIGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBzd2FwCiAgICAtCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1NQogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MTgKICAgIC8vIHJldHVybiBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgKyBzZWxmLl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KGVudHJ5KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgIGRpZyAxNgogICAgY2FsbHN1YiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudAogICAgYnVyeSAxOAogICAgKwogICAgYnVyeSAxMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTU0CiAgICAvLyBpbnRlcmVzdF9hbW91bnRfZHVlID0gc2VsZi5fZW50cnlfaW50ZXJlc3RfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfaW50ZXJlc3RfYW1vdW50QDE2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAMTE6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTAwCiAgICAvLyBhc3NlcnQgcHJvY2Vzc2VkX2V2ZW50cyA+IFVJbnQ2NCgwKSwgZXJyLk5PX0RVRV9DQVNIRkxPVwogICAgZGlnIDQKICAgIGR1cAogICAgYXNzZXJ0IC8vIE5vIGR1ZSBjYXNoZmxvdyB0byBwYXkKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMDQKICAgIC8vIHRvdGFsX2Z1bmRlZD1mdW5kZWRfaW50ZXJlc3QgKyBmdW5kZWRfcHJpbmNpcGFsLAogICAgZGlnIDE0CiAgICBkdXAKICAgIGRpZyAxNQogICAgZHVwCiAgICBjb3ZlciAzCiAgICArCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA2CiAgICAvLyB0aW1lc3RhbXA9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTAxLTEwNwogICAgLy8gcmV0dXJuIHR5cC5DYXNoRnVuZGluZ1Jlc3VsdCgKICAgIC8vICAgICBmdW5kZWRfaW50ZXJlc3Q9ZnVuZGVkX2ludGVyZXN0LAogICAgLy8gICAgIGZ1bmRlZF9wcmluY2lwYWw9ZnVuZGVkX3ByaW5jaXBhbCwKICAgIC8vICAgICB0b3RhbF9mdW5kZWQ9ZnVuZGVkX2ludGVyZXN0ICsgZnVuZGVkX3ByaW5jaXBhbCwKICAgIC8vICAgICBwcm9jZXNzZWRfZXZlbnRzPXByb2Nlc3NlZF9ldmVudHMsCiAgICAvLyAgICAgdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUA1MzoKICAgIGludGNfMCAvLyAwCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDU0CgoKLy8gbW9kdWxlcy5wYXltZW50X2FnZW50LlBheW1lbnRBZ2VudC5jbGFpbV9kdWVfY2FzaGZsb3dzW3JvdXRpbmddKCkgLT4gdm9pZDoKY2xhaW1fZHVlX2Nhc2hmbG93czoKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cG4gMgogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDYKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNQogICAgLy8gaWYgc2VsZi5vcF9kYWVtb24udmFsdWUgIT0gR2xvYmFsLnplcm9fYWRkcmVzczoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNyAvLyAweDUyM2E0ZjUwNDQyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wX2RhZW1vbiBleGlzdHMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE3CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjcgLy8gMHg1MjNhNGY1MDQ0MjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcF9kYWVtb24gZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE3LTE5CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIGJueiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfdHJ1ZUAxNAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE4CiAgICAvLyBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgdHhuIFNlbmRlcgogICAgZGlnIDMKICAgID09CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTctMTkKICAgIC8vIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICAvLyBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgYm56IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDE0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTkKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCAzMgogICAgPT0KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNy0xOQogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICBieiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VAMTUKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDE0OgogICAgaW50Y18xIC8vIDEKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUAxNjoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNi0yMAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyAgICAgb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vICAgICBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgLy8gKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCgpjbGFpbV9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTc6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTM5CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE0MAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzOAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTAKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTQzCiAgICAvLyBzZWxmLl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKGhvbGRpbmdfYWRkcmVzcykKICAgIGRpZyAyCiAgICBkdXAKICAgIGNhbGxzdWIgX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNDQKICAgIC8vIHNlbGYuX3NldHRsZV9wb3NpdGlvbihob2xkaW5nX2FkZHJlc3MpCiAgICBjYWxsc3ViIF9zZXR0bGVfcG9zaXRpb24KICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExNwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY2xhaW1hYmxlX2ludGVyZXN0CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBkdXAKICAgIHB1c2hpbnQgNzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExOAogICAgLy8gKyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jbGFpbWFibGVfcHJpbmNpcGFsCiAgICBkdXAKICAgIHB1c2hpbnQgODEKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExNy0xMTgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNsYWltYWJsZV9pbnRlcmVzdAogICAgLy8gKyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jbGFpbWFibGVfcHJpbmNpcGFsCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTQ2CiAgICAvLyBhc3NlcnQgdG90YWxfYW1vdW50ID4gVUludDY0KDApLCBlcnIuTk9fRFVFX0NBU0hGTE9XCiAgICBhc3NlcnQgLy8gTm8gZHVlIGNhc2hmbG93IHRvIHBheQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI1CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MuaXNfb3B0ZWRfaW4oCiAgICBleHRyYWN0IDAgMzIKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNgogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNS0yNwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLmlzX29wdGVkX2luKAogICAgLy8gICAgIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZAogICAgLy8gKQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNS0yOAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLmlzX29wdGVkX2luKAogICAgLy8gICAgIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZAogICAgLy8gKQogICAgLy8gYW5kIG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQKICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAyNAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI4CiAgICAvLyBhbmQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCAzODQKICAgIGdldGJpdAogICAgYm56IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAyNAogICAgaW50Y18xIC8vIDEKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUAyNToKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNTEKICAgIC8vIGlmIHNlbGYuX2lzX3BheW1lbnRfZXhlY3V0YWJsZShob2xkaW5nX2FkZHJlc3MpOgogICAgYnogY2xhaW1fZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozNAogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIHN3YXAKICAgIGRpZyAxCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozNC0zNQogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIC8vID49IHBheW1lbnRfYW1vdW50CiAgICBkaWcgNQogICAgZHVwCiAgICBjb3ZlciAyCiAgICA+PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjMzLTM2CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICAvLyAgICAgPj0gcGF5bWVudF9hbW91bnQKICAgIC8vICksIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcyBmb3IgdGhlIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNTMKICAgIC8vIHNlbGYuX3BheShzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MsIHRvdGFsX2Ftb3VudCkKICAgIGRpZyAyCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBkdXAKICAgIGV4dHJhY3QgMCAzMgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQwLTQ1CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9cmVjZWl2ZXIsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWFtb3VudCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQ0CiAgICAvLyBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgdW5jb3ZlciAzCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIHVuY292ZXIgMgogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0MAogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgcHVzaGludCA0IC8vIGF4ZmVyCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQwLTQ1CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9cmVjZWl2ZXIsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWFtb3VudCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMjUtMTI2CiAgICAvLyAjIEdldCB0aGUgY2xhaW1hYmxlIGFtb3VudHMgYmVmb3JlIHJlc2V0CiAgICAvLyBpbnRlcmVzdF9hbW91bnQgPSBwb3NpdGlvbi5jbGFpbWFibGVfaW50ZXJlc3QKICAgIGR1cAogICAgcHVzaGludCA3MwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSA5CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTI3CiAgICAvLyBwcmluY2lwYWxfYW1vdW50ID0gcG9zaXRpb24uY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgZHVwCiAgICBwdXNoaW50IDgxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAzCiAgICBidXJ5IDkKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMjktMTMwCiAgICAvLyAjIFJlc2V0IHRoZSBwb3NpdGlvbidzIGNsYWltYWJsZSBhbW91bnRzCiAgICAvLyBwb3NpdGlvbi5jbGFpbWFibGVfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBpdG9iCiAgICBzd2FwCiAgICBkaWcgMQogICAgcmVwbGFjZTIgNzMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzEKICAgIC8vIHBvc2l0aW9uLmNsYWltYWJsZV9wcmluY2lwYWwgPSBVSW50NjQoMCkKICAgIHN3YXAKICAgIHJlcGxhY2UyIDgxCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTMyCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHBvc2l0aW9uLmNvcHkoKQogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTM0CiAgICAvLyBhc3NlcnQgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCA+PSBpbnRlcmVzdF9hbW91bnQsIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX2ludGVyZXN0IGV4aXN0cwogICAgZHVwCiAgICBkaWcgMgogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzNQogICAgLy8gYXNzZXJ0IHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsID49IHByaW5jaXBhbF9hbW91bnQsIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICBkaWcgMwogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzNy0xMzgKICAgIC8vICMgVXBkYXRlIHRoZSBnbG9iYWwgcmVzZXJ2ZWQgaW50ZXJlc3QgYW5kIHByaW5jaXBhbCBhbW91bnRzCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0IC09IGludGVyZXN0X2Ftb3VudAogICAgc3dhcAogICAgLQogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzkKICAgIC8vIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIC09IHByaW5jaXBhbF9hbW91bnQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIHN3YXAKICAgIC0KICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKY2xhaW1fZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTU5CiAgICAvLyB0b3RhbF9hbW91bnQ9aW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudCwKICAgIGRpZyA1CiAgICBkdXAKICAgIGRpZyA2CiAgICBkdXAKICAgIGNvdmVyIDMKICAgICsKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNjAKICAgIC8vIHRpbWVzdGFtcD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNTYtMTYyCiAgICAvLyByZXR1cm4gdHlwLkNhc2hDbGFpbVJlc3VsdCgKICAgIC8vICAgICBpbnRlcmVzdF9hbW91bnQ9aW50ZXJlc3RfYW1vdW50LAogICAgLy8gICAgIHByaW5jaXBhbF9hbW91bnQ9cHJpbmNpcGFsX2Ftb3VudCwKICAgIC8vICAgICB0b3RhbF9hbW91bnQ9aW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudCwKICAgIC8vICAgICB0aW1lc3RhbXA9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgY29udGV4dD1wYXltZW50X2luZm8sCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgMgogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIHB1c2hieXRlcyAweDAwMjIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAyNDoKICAgIGludGNfMCAvLyAwCiAgICBiIGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUAyNQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX2ZhbHNlQDE1OgogICAgaW50Y18wIC8vIDAKICAgIGIgY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDE2CgoKLy8gbW9kdWxlcy50cmFuc2Zlcl9hZ2VudC5UcmFuc2ZlckFnZW50LnRyYW5zZmVyX3NldF9zY2hlZHVsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRyYW5zZmVyX3NldF9zY2hlZHVsZToKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo0MAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQxCiAgICAvLyBhc3NlcnQgb3Blbl9kYXRlIDwgY2xvc3VyZV9kYXRlLCBlcnIuSU5WQUxJRF9TT1JUSU5HCiAgICBkdXAyCiAgICA8CiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbXVzdCBiZSBzb3J0ZWQgaW4gc3RyaWN0bHkgYXNjZW5kaW5nIG9yZGVyCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQzCiAgICAvLyBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA9IG9wZW5fZGF0ZQogICAgYnl0ZWMgMjkgLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIHVuY292ZXIgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDQKICAgIC8vIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlID0gY2xvc3VyZV9kYXRlCiAgICBieXRlYyAzMCAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDUKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy50cmFuc2Zlcl9hZ2VudC5UcmFuc2ZlckFnZW50LnByaW1hcnlfZGlzdHJpYnV0aW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcHJpbWFyeV9kaXN0cmlidXRpb246CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDYKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjcxCiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5wcmltYXJ5X2RlYWxlciwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDIyIC8vIDB4NTIzYTUwNTk0NDIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojc2CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo3NwogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzOAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojc4CiAgICAvLyBhc3NlcnQgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TRUQKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBjbG9zZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgY292ZXIgMwogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4MAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChob2xkaW5nX2FkZHJlc3MpCiAgICBzd2FwCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjgxCiAgICAvLyBhc3NlcnQgdW5pdHMgPiBVSW50NjQoMCksIGVyci5aRVJPX1VOSVRTCiAgICBkdXAKICAgIGFzc2VydCAvLyBDYW4gbm90IGRpc3RyaWJ1dGUgemVybyB1bml0cwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4MwogICAgLy8gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCArIHVuaXRzIDw9IHNlbGYudG90YWxfdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICArCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgPD0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODItODQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCArIHVuaXRzIDw9IHNlbGYudG90YWxfdW5pdHMKICAgIC8vICksIGVyci5PVkVSX0RJU1RSSUJVVElPTgogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCByZW1haW5pbmcgRC1BU0EgdW5pdHMKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODUKICAgIC8vIGlmIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI4IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlIGV4aXN0cwogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojg3CiAgICAvLyBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8PSBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI4IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlIGV4aXN0cwogICAgPD0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODYtODgKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPD0gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGUKICAgIC8vICksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TRUQKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBjbG9zZWQKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNDgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnJlc2VydmVkX3VuaXRzICs9IHVuaXRzCiAgICBkdXBuIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDMKICAgIGR1cAogICAgY292ZXIgMwogICAgKwogICAgaXRvYgogICAgcHVzaGludCA0MAogICAgc3dhcAogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6OTEKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgKz0gdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICArCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6OTIKICAgIC8vIHJldHVybiBzZWxmLnRvdGFsX3VuaXRzIC0gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIHN3YXAKICAgIC0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMudHJhbnNmZXJfYWdlbnQuVHJhbnNmZXJBZ2VudC50cmFuc2Zlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnRyYW5zZmVyOgogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQ2CiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTMwCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxMzEKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzgKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTUwCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuX3N0YXR1c19pc19wZW5kaW5nX2llZCgpLCBlcnIuUEVORElOR19JRUQKICAgICEKICAgIGFzc2VydCAvLyBJRUQgbm90IHlldCBleGVjdXRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxMwogICAgLy8gaWYgc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjkgLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICBieiB0cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTUKICAgIC8vIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjkgLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNC0xNgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gKSwgZXJyLkNMT1NFRF9UUkFOU0ZFUgogICAgYXNzZXJ0IC8vIFRyYW5zZmVyIGlzIGNsb3NlZAoKdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNwogICAgLy8gaWYgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzAgLy8gInRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICBieiB0cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTkKICAgIC8vIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDwgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGUKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMCAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIDwKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTgtMjAKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZQogICAgLy8gKSwgZXJyLkNMT1NFRF9UUkFOU0ZFUgogICAgYXNzZXJ0IC8vIFRyYW5zZmVyIGlzIGNsb3NlZAoKdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxMzUKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIGRpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA4CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIGJ5dGVjIDggLy8gMHg0MTIzCiAgICBkaWcgNQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA5CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjEzOAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChzZW5kZXJfaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDIKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTM5CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGR1cAogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNDAKICAgIC8vIGFzc2VydCBzZW5kZXJfaG9sZGluZ19hZGRyZXNzICE9IHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcywgZXJyLlNFTEZfVFJBTlNGRVIKICAgIHVuY292ZXIgMgogICAgIT0KICAgIGFzc2VydCAvLyBTZW5kZXIgYW5kIHJlY2VpdmVyIG11c3QgYmUgZGlmZmVyZW50CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE0MQogICAgLy8gYXNzZXJ0IHVuaXRzID4gVUludDY0KDApLCBlcnIuTlVMTF9UUkFOU0ZFUgogICAgZGlnIDEKICAgIGR1cAogICAgYXNzZXJ0IC8vIFRyYW5zZmVyIHVuaXRzIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTQyCiAgICAvLyBhc3NlcnQgdW5pdHMgPD0gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLCBlcnIuT1ZFUl9UUkFOU0ZFUgogICAgc3dhcAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIDw9CiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IHNlbmRlciB1bml0cyB0byB0cmFuc2ZlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzY2CiAgICAvLyBpZiBzZWxmLmV2ZW50X2N1cnNvciA+PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICA+PQogICAgYm56IHRyYW5zZmVyX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Fzc2VydF9ub19kdWVfZXZlbnRfcGVuZGluZ0AxMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzY4CiAgICAvLyBuZXh0X2VudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KHNlbGYuZXZlbnRfY3Vyc29yKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc3MAogICAgLy8gbmV4dF9lbnRyeS5zY2hlZHVsZWRfdGltZSA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NjktNzcxCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIG5leHRfZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gKSwgZXJyLlBFTkRJTkdfQUNUVVNfRVZFTlQKICAgIGFzc2VydCAvLyBBQ1RVUyBldmVudCBub3QgeWV0IGV4ZWN1dGVkCgp0cmFuc2Zlcl9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9hc3NlcnRfbm9fZHVlX2V2ZW50X3BlbmRpbmdAMTA6CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE0NQogICAgLy8gc2VsZi5fZW5zdXJlX3VuaXRzX2FjdGl2YXRlZChzZW5kZXJfaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDMKICAgIGR1cAogICAgY2FsbHN1YiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNDYKICAgIC8vIHNlbGYuX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQocmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgY2FsbHN1YiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNDcKICAgIC8vIHNlbGYuX3NldHRsZV9wb3NpdGlvbihzZW5kZXJfaG9sZGluZ19hZGRyZXNzKQogICAgY2FsbHN1YiBfc2V0dGxlX3Bvc2l0aW9uCiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTQ4CiAgICAvLyBzZWxmLl9zZXR0bGVfcG9zaXRpb24ocmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzKQogICAgY2FsbHN1YiBfc2V0dGxlX3Bvc2l0aW9uCiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNTIKICAgIC8vIGFzc2VydCB1bml0cyA8PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cywgZXJyLk9WRVJfVFJBTlNGRVIKICAgIGRpZyA1CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkaWcgMQogICAgPD0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgc2VuZGVyIHVuaXRzIHRvIHRyYW5zZmVyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTUzCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyAtPSB1bml0cwogICAgZGlnIDEKICAgIC0KICAgIGl0b2IKICAgIHVuY292ZXIgMgogICAgaW50Y18zIC8vIDMyCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTQ0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyArPSB1bml0cwogICAgZGlnIDUKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIHVuY292ZXIgMgogICAgKwogICAgaXRvYgogICAgaW50Y18zIC8vIDMyCiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfc3VzcGVuc2lvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfc3VzcGVuc2lvbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojc3CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyMSAvLyAweDUyM2E0MTU1NTQyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE4NQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkID0gc3VzcGVuZGVkCiAgICBkdXAKICAgIHB1c2hpbnQgNDgKICAgIGludGNfMSAvLyAxCiAgICBib3hfZXh0cmFjdAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMwogICAgc2V0Yml0CiAgICBwdXNoaW50IDQ4CiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE4NgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTY1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5hY2NvdW50X29wZW5bcm91dGluZ10oKSAtPiB2b2lkOgphY2NvdW50X29wZW46CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjgKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmFjY291bnRfbWFuYWdlciwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDIzIC8vIDB4NTIzYTRkNGU0NzIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDIKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0VOREVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDIwMAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTAKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX2VuZGVkKCksIGVyci5VTkFVVEhPUklaRUQKICAgICEKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxMQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTIKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjEzCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozNAogICAgLy8gdW5pdHM9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozMi00MgogICAgLy8gcmV0dXJuIHR5cC5BY2NvdW50UG9zaXRpb24oCiAgICAvLyAgICAgcGF5bWVudF9hZGRyZXNzPXBheW1lbnRfYWRkcmVzcywKICAgIC8vICAgICB1bml0cz1VSW50NjQoMCksCiAgICAvLyAgICAgcmVzZXJ2ZWRfdW5pdHM9VUludDY0KDApLAogICAgLy8gICAgIHN1c3BlbmRlZD1GYWxzZSwKICAgIC8vICAgICBzZXR0bGVkX2N1cnNvcj1VSW50NjQoMCksCiAgICAvLyAgICAgaW50ZXJlc3RfY2hlY2twb2ludD1VSW50NjQoMCksCiAgICAvLyAgICAgcHJpbmNpcGFsX2NoZWNrcG9pbnQ9VUludDY0KDApLAogICAgLy8gICAgIGNsYWltYWJsZV9pbnRlcmVzdD1VSW50NjQoMCksCiAgICAvLyAgICAgY2xhaW1hYmxlX3ByaW5jaXBhbD1VSW50NjQoMCksCiAgICAvLyApCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGJ5dGVjIDQwIC8vIDB4MDAKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjE0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHNlbGYuX25ld19hY2NvdW50X3Bvc2l0aW9uKHBheW1lbnRfYWRkcmVzcykKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTUKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjM4CiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIHVuY292ZXIgMwogICAgPT0KICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIzOQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDAKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQxCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MgPSBwYXltZW50X2FkZHJlc3MKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQyCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfZ2V0X3Bvc2l0aW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF9nZXRfcG9zaXRpb246CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNTkKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9jcmVhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9jcmVhdGU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAzNgogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IGFycmFuZ2VyCiAgICBieXRlYyAxOCAvLyAweDUyM2E0MTUyNTIyMwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMzcKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfY29uZmlnW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfY29uZmlnOgogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBsZW4KICAgIHB1c2hpbnQgMTA3CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLk5vcm1hbGl6ZWRBY3R1c1Rlcm1zCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgcHVzaGludCA3MgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5Jbml0aWFsS2VybmVsU3RhdGUKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBsZW4KICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIHR1cGxlIGVuY29kaW5nCiAgICBkdXAKICAgIHB1c2hpbnQgMzQKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCB0YWlsIHBvaW50ZXIgYXQgaW5kZXggMSBvZiAodWludDhbMzJdLChsZW4rdXRmOFtdKSkKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgY292ZXIgMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMzYKICAgICsKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuUHJvc3BlY3R1cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2OQogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDcxLTEwNzIKICAgIC8vICMgQ29uZmlndXJlIENvbnRyYWN0CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPSB0ZXJtcy5jb250cmFjdF90eXBlLmFzX3VpbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIxLTIyOAogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgYnogY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUA3CiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIyMwogICAgLy8gVUludDY0KGVudW1zLkNUX0FOTiksCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIxLTIyOAogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjI0CiAgICAvLyBVSW50NjQoZW51bXMuQ1RfTkFNKSwKICAgIHB1c2hpbnQgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIxLTIyOAogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjI1CiAgICAvLyBVSW50NjQoZW51bXMuQ1RfTEFNKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIxLTIyOAogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjI2CiAgICAvLyBVSW50NjQoZW51bXMuQ1RfTEFYKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIxLTIyOAogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjI3CiAgICAvLyBVSW50NjQoZW51bXMuQ1RfQ0xNKSwKICAgIHB1c2hpbnQgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIxLTIyOAogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJ6IGNvbnRyYWN0X2NvbmZpZ19ib29sX2ZhbHNlQDgKCmNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANzoKICAgIGludGNfMSAvLyAxCgpjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUA5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjMyCiAgICAvLyBhc3NlcnQgc2VsZi5faXNfc3VwcG9ydGVkX2NvbnRyYWN0X3R5cGUoY29udHJhY3RfdHlwZSksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3NAogICAgLy8gc2VsZi5fc3RvcmVfY29udHJhY3RfY29uZmlnKHNlbGYuY29udHJhY3RfdHlwZSwgdGVybXMsIGluaXRpYWxfc3RhdGUpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgYnVyeSAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzI4CiAgICAvLyBhc3NlcnQgdGVybXMuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZGlnIDQKICAgIGR1cAogICAgcHVzaGludCAzMwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSA4CiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzAKICAgIC8vIHRlcm1zLmRheV9jb3VudF9jb252ZW50aW9uLmFzX3VpbnQ2NCgpCiAgICBwdXNoaW50IDU3CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzAwLTMwNgogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICBieiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDE2CiAgICBkaWcgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzAyCiAgICAvLyBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMwMC0zMDYKICAgIC8vIHJldHVybiBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzYwKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwSVNEQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjApLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDE2CiAgICBkaWcgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzAzCiAgICAvLyBVSW50NjQoZW51bXMuRENDX0EzNjUpLAogICAgcHVzaGludCAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDAtMzA2CiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgID09CiAgICBibnogY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUAxNgogICAgZGlnIDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMwNAogICAgLy8gVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzAwLTMwNgogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGRpZyA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDUKICAgIC8vIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzAwLTMwNgogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICA9PQogICAgYnogY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAMTcKCmNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTY6CiAgICBpbnRjXzEgLy8gMQoKY29udHJhY3RfY29uZmlnX2Jvb2xfbWVyZ2VAMTg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTItMzE0CiAgICAvLyBhc3NlcnQgc2VsZi5faXNfc3VwcG9ydGVkX2RheV9jb3VudF9jb252ZW50aW9uKAogICAgLy8gICAgIGRheV9jb3VudF9jb252ZW50aW9uCiAgICAvLyApLCBlcnIuSU5WQUxJRF9EQVlfQ09VTlRfQ09OVkVOVElPTgogICAgYXNzZXJ0IC8vIEludmFsaWQgZGF5LWNvdW50IGNvbnZlbnRpb24gSUQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMzMgogICAgLy8gaWYgY29udHJhY3RfdHlwZSAhPSBVSW50NjQoZW51bXMuQ1RfQU5OKToKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgICE9CiAgICBieiBjb250cmFjdF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzMzCiAgICAvLyBhc3NlcnQgbm90IHRlcm1zLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24sIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZGlnIDQKICAgIHB1c2hpbnQgNzg2CiAgICBnZXRiaXQKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KCmNvbnRyYWN0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDIwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODEwCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIEQtQVNBIGFscmVhZHkgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODExCiAgICAvLyBhc3NlcnQgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCA9PSBVSW50NjQoMCksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMCAvLyAiaW5pdGlhbF9leGNoYW5nZV9hbW91bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTMtODE0CiAgICAvLyAjIFNldCBEZW5vbWluYXRpb24gQXNzZXQKICAgIC8vIHNlbGYuX2Fzc2VydF9kZW5vbWluYXRpb25fYXNzZXQodGVybXMuZGVub21pbmF0aW9uX2Fzc2V0X2lkKQogICAgZGlnIDQKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NzgtNzc5CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIGRlbm9taW5hdGlvbiB3aXRoIEFTQQogICAgLy8gX2NyZWF0b3IsIGV4aXN0cyA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X2NyZWF0b3IoZGVub21pbmF0aW9uX2Fzc2V0X2lkKQogICAgZHVwCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q3JlYXRvcgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODAKICAgIC8vIGFzc2VydCBleGlzdHMsIGVyci5JTlZBTElEX0RFTk9NSU5BVElPTgogICAgYXNzZXJ0IC8vIERlbm9taW5hdGlvbiBhc3NldCBpcyBub3QgcHJvcGVybHkgc2V0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODMKICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICBieXRlYyA0NCAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTctODE4CiAgICAvLyAjIFNldCBTZXR0bGVtZW50IEFzc2V0CiAgICAvLyBzZWxmLl9hc3NlcnRfc2V0dGxlbWVudF9hc3NldCh0ZXJtcy5zZXR0bGVtZW50X2Fzc2V0X2lkKQogICAgZGlnIDEKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc4OAogICAgLy8gc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODYtNzg5CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc2V0dGxlbWVudCBhc3NldCBpcyB0aGUgZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQgPT0gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIC8vICksIGVyci5JTlZBTElEX1NFVFRMRU1FTlRfQVNTRVQKICAgIGFzc2VydCAvLyBEaWZmZXJlbnQgc2V0dGxlbWVudCBhc3NldCBub3Qgc3VwcG9ydGVkLCBtdXN0IGJlIGVxdWFsIHRvIGRlbm9taW5hdGlvbiBhc3NldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkyCiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBzZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkzLTc5OQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhc3NldF9hbW91bnQ9MCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Nzk4CiAgICAvLyBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Nzk2CiAgICAvLyBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc5NwogICAgLy8gYXNzZXRfYW1vdW50PTAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkzLTc5NAogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3OTMtNzk5CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODIxLTgyMgogICAgLy8gIyBVbml0cwogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IHRlcm1zLnRvdGFsX3VuaXRzCiAgICBkdXAKICAgIHB1c2hpbnQgMTcKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODIzCiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID0gVUludDY0KDApCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgyNS04MjYKICAgIC8vICMgRGF5LUNvdW50IENvbnZlbnRpb25zCiAgICAvLyBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uID0gdGVybXMuZGF5X2NvdW50X2NvbnZlbnRpb24uYXNfdWludDY0KCkKICAgIGJ5dGVjIDQ2IC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGRpZyA4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODI4LTgyOQogICAgLy8gIyBUaW1lCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA9IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZQogICAgZHVwCiAgICBwdXNoaW50IDQxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMjggLy8gImluaXRpYWxfZXhjaGFuZ2VfZGF0ZSIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODMwCiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSB0ZXJtcy5tYXR1cml0eV9kYXRlCiAgICBkaWcgMQogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDQ1IC8vICJtYXR1cml0eV9kYXRlIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MzEKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IGluaXRpYWxfc3RhdGUubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZGlnIDYKICAgIGR1cAogICAgY292ZXIgMgogICAgcHVzaGludCA0OAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzMy04MzQKICAgIC8vICMgUHJpbmNpcGFsCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID0gdGVybXMuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGRpZyAxMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzNQogICAgLy8gc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gdGVybXMuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZGlnIDMKICAgIHB1c2hpbnQgNzg2CiAgICBnZXRiaXQKICAgIGJ5dGVjIDM0IC8vICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzNgogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBpbml0aWFsX3N0YXRlLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZGlnIDEKICAgIHB1c2hpbnQgMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODM4LTgzOQogICAgLy8gIyBJbnRlcmVzdAogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ID0gaW5pdGlhbF9zdGF0ZS5hY2NydWVkX2ludGVyZXN0CiAgICBkaWcgMQogICAgcHVzaGludCA0MAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQxLTg0MgogICAgLy8gIyBJbnRlcmVzdCBSYXRlCiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IGluaXRpYWxfc3RhdGUubm9taW5hbF9pbnRlcmVzdF9yYXRlCiAgICBkaWcgMQogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0MwogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gaW5pdGlhbF9zdGF0ZS5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlCiAgICBkaWcgMQogICAgcHVzaGludCAyNAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQ0CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkID0gdGVybXMucmF0ZV9yZXNldF9zcHJlYWQKICAgIGRpZyAzCiAgICBwdXNoaW50IDU4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzUgLy8gInJhdGVfcmVzZXRfc3ByZWFkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0NQogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIgPSB0ZXJtcy5yYXRlX3Jlc2V0X211bHRpcGxpZXIKICAgIGRpZyAzCiAgICBwdXNoaW50IDY2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzYgLy8gInJhdGVfcmVzZXRfbXVsdGlwbGllciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDYKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9mbG9vciA9IHRlcm1zLnJhdGVfcmVzZXRfZmxvb3IKICAgIGRpZyAzCiAgICBwdXNoaW50IDc0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzEgLy8gInJhdGVfcmVzZXRfZmxvb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQ3CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfY2FwID0gdGVybXMucmF0ZV9yZXNldF9jYXAKICAgIGRpZyAzCiAgICBwdXNoaW50IDgyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzIgLy8gInJhdGVfcmVzZXRfY2FwIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0OAogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X25leHQgPSB0ZXJtcy5yYXRlX3Jlc2V0X25leHQKICAgIGRpZyAzCiAgICBwdXNoaW50IDkwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzcgLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDkKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgPSB0ZXJtcy5oYXNfcmF0ZV9yZXNldF9mbG9vcgogICAgZGlnIDMKICAgIHB1c2hpbnQgNzg0CiAgICBnZXRiaXQKICAgIGJ5dGVjIDM4IC8vICJoYXNfcmF0ZV9yZXNldF9mbG9vciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NTAKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwID0gdGVybXMuaGFzX3JhdGVfcmVzZXRfY2FwCiAgICBkaWcgMwogICAgcHVzaGludCA3ODUKICAgIGdldGJpdAogICAgYnl0ZWMgMzkgLy8gImhhc19yYXRlX3Jlc2V0X2NhcCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NTItODUzCiAgICAvLyAjIFNjYWxpbmcKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgPSB0ZXJtcy5maXhlZF9wb2ludF9zY2FsZQogICAgdW5jb3ZlciAzCiAgICBwdXNoaW50IDk5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU1LTg1NgogICAgLy8gIyBTY2hlZHVsZSBQcm9jZXNzaW5nCiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciA9IGluaXRpYWxfc3RhdGUuZXZlbnRfY3Vyc29yCiAgICBkaWcgMQogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU4LTg1OQogICAgLy8gIyBQZXItVW5pdCBGaXhlZC1Qb2ludCBJbmRleGVzCiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggPSBpbml0aWFsX3N0YXRlLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgKICAgIGRpZyAxCiAgICBwdXNoaW50IDU2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODYwCiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4ID0gaW5pdGlhbF9zdGF0ZS5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleAogICAgZGlnIDEKICAgIHB1c2hpbnQgNjQKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODYyLTg2MwogICAgLy8gIyBSZXNlcnZlZCBBbW91bnQgKGZvciBleGVjdXRlZCBjYXNoZmxvd3MpCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0ID0gVUludDY0KDApCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2NAogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2NgogICAgLy8gYXNzZXJ0IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLCBlcnIuSU5WQUxJRF9JRUQKICAgIGRpZyAyCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICBhc3NlcnQgLy8gSUVEIG11c3QgYmUgc2V0IGluIHRoZSBmdXR1cmUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2NwogICAgLy8gYXNzZXJ0IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA+IGluaXRpYWxfc3RhdGUuc3RhdHVzX2RhdGUsIGVyci5JTlZBTElEX0lFRAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgPAogICAgYXNzZXJ0IC8vIElFRCBtdXN0IGJlIHNldCBpbiB0aGUgZnV0dXJlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NjgKICAgIC8vIGFzc2VydCB0ZXJtcy5pbml0aWFsX2V4Y2hhbmdlX2RhdGUgPCB0ZXJtcy5tYXR1cml0eV9kYXRlLCBlcnIuSU5WQUxJRF9JRUQKICAgIDwKICAgIGFzc2VydCAvLyBJRUQgbXVzdCBiZSBzZXQgaW4gdGhlIGZ1dHVyZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3Ni0xMDc3CiAgICAvLyAjIE5vdGFyaXplIHByb3NwZWN0dXMgKG9wdGlvbmFsKQogICAgLy8gc2VsZi5wcm9zcGVjdHVzX2hhc2ggPSBwcm9zcGVjdHVzLmhhc2guYnl0ZXMKICAgIGRpZyAyCiAgICBleHRyYWN0IDAgMzIKICAgIGJ5dGVjIDQyIC8vICJwcm9zcGVjdHVzX2hhc2giCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3OAogICAgLy8gc2VsZi5wcm9zcGVjdHVzX3VybCA9IHByb3NwZWN0dXMudXJsCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGVjIDQzIC8vICJwcm9zcGVjdHVzX3VybCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc5CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAMTc6CiAgICBpbnRjXzAgLy8gMAogICAgYiBjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUAxOAoKY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAODoKICAgIGludGNfMCAvLyAwCiAgICBiIGNvbnRyYWN0X2NvbmZpZ19ib29sX21lcmdlQDkKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9zY2hlZHVsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X3NjaGVkdWxlOgogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDgxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHN3YXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBkdXAKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgMgogICAgKwogICAgdW5jb3ZlciAyCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLkV4ZWN1dGlvblNjaGVkdWxlRW50cnk+CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTEzCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMTYKICAgIC8vIGNvbnRyYWN0X3R5cGU9c2VsZi5jb250cmFjdF90eXBlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGNvdmVyIDMKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4ODQKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4ODUtODg3CiAgICAvLyBhc3NlcnQgc2NoZWR1bGVfcGFnZS5sZW5ndGggPD0gVUludDY0KAogICAgLy8gICAgIGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUKICAgIC8vICksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGR1cAogICAgcHVzaGludCAxNgogICAgPD0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg4OAogICAgLy8gYXNzZXJ0IHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPiBVSW50NjQoMCksIGVyci5URVJNU19OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSB0ZXJtcyBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODkwCiAgICAvLyBwYWdlX2N1cnNvciA9IHNjaGVkdWxlX3BhZ2VfaW5kZXggKiBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkKICAgIHN3YXAKICAgIHB1c2hpbnQgMTYKICAgICoKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg5NwogICAgLy8gKyBwYWdlX2xlbmd0aCAqIFVJbnQ2NChjc3QuT1BfVVBfQ09OVFJBQ1RfQ09ORklHX1BFUl9FTlRSWV9CVURHRVQpCiAgICBwdXNoaW50IDEwMAogICAgKgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODk2CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19CQVNFX0JVREdFVCkKICAgIGludGMgNCAvLyAxNTAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTYtODk3CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19CQVNFX0JVREdFVCkKICAgIC8vICsgcGFnZV9sZW5ndGggKiBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19QRVJfRU5UUllfQlVER0VUKQogICAgKwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODkyLTg5OQogICAgLy8gIyBWYWxpZGF0aW9uIGNvc3QgZ3Jvd3Mgd2l0aCBwYWdlIGxlbmd0aCwgc28gY29uZmlndXJhdGlvbiBleHBsaWNpdGx5CiAgICAvLyAjIGJ1eXMgZXh0cmEgb3Bjb2RlIGJ1ZGdldCBmb3IgbGFyZ2VyIHVwbG9hZHMuCiAgICAvLyBlbnN1cmVfYnVkZ2V0KAogICAgLy8gICAgIHJlcXVpcmVkX2J1ZGdldD0oCiAgICAvLyAgICAgICAgIFVJbnQ2NChjc3QuT1BfVVBfQ09OVFJBQ1RfQ09ORklHX0JBU0VfQlVER0VUKQogICAgLy8gICAgICAgICArIHBhZ2VfbGVuZ3RoICogVUludDY0KGNzdC5PUF9VUF9DT05UUkFDVF9DT05GSUdfUEVSX0VOVFJZX0JVREdFVCkKICAgIC8vICAgICApLAogICAgLy8gKQogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTAwCiAgICAvLyBpbmRleCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKCmNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEAyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTAxCiAgICAvLyB3aGlsZSBpbmRleCA8IHBhZ2VfbGVuZ3RoOgogICAgZHVwCiAgICBkaWcgNAogICAgPAogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfd2hpbGVAMTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkwMi05MDMKICAgIC8vIGVudHJ5ID0gc2NoZWR1bGVfcGFnZVtpbmRleF0uY29weSgpCiAgICAvLyBlbnRyeV9ldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZGlnIDQKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGJ1cnkgMTIKICAgIGRpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgNjUKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTAzCiAgICAvLyBlbnRyeV9ldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDItOTAzCiAgICAvLyBlbnRyeSA9IHNjaGVkdWxlX3BhZ2VbaW5kZXhdLmNvcHkoKQogICAgLy8gZW50cnlfZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGludGNfMiAvLyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDMKICAgIC8vIGVudHJ5X2V2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBnZXRieXRlCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgMTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkwNAogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X2lkID09IHBhZ2VfY3Vyc29yICsgaW5kZXgsIGVyci5JTlZBTElEX0VWRU5UX0lECiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEzCiAgICBkaWcgNQogICAgdW5jb3ZlciA0CiAgICArCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDUtOTA3CiAgICAvLyBzZWxmLl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBlbnRyeV9ldmVudF90eXBlCiAgICAvLyApCiAgICBkaWcgNQogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTA4CiAgICAvLyBhc3NlcnQgZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgc3dhcAogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDkKICAgIC8vIGlmIGVudHJ5LmV2ZW50X2lkID4gVUludDY0KDApOgogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTAKICAgIC8vIGlmIGluZGV4ID4gVUludDY0KDApOgogICAgZHVwCiAgICBieiBjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlANgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTExCiAgICAvLyBwcmV2aW91c19lbnRyeSA9IHNjaGVkdWxlX3BhZ2VbaW5kZXggLSBVSW50NjQoMSldLmNvcHkoKQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgcHVzaGludCA2NQogICAgKgogICAgZGlnIDExCiAgICBzd2FwCiAgICBwdXNoaW50IDY1CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkyNgogICAgLy8gcHJldmlvdXNfZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gZW50cnkuc2NoZWR1bGVkX3RpbWUKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyA4CiAgICA8PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTI1LTkyNwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBwcmV2aW91c19lbnRyeS5zY2hlZHVsZWRfdGltZSA8PSBlbnRyeS5zY2hlZHVsZWRfdGltZQogICAgLy8gKSwgZXJyLklOVkFMSURfU09SVElORwogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIG11c3QgYmUgc29ydGVkIGluIHN0cmljdGx5IGFzY2VuZGluZyBvcmRlcgoKY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUA4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTI4CiAgICAvLyBpZiBlbnRyeS5ldmVudF9pZCA9PSBVSW50NjQoMCk6CiAgICBkaWcgOAogICAgYm56IGNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkyOS05MzEKICAgIC8vIGFzc2VydCBlbnRyeV9ldmVudF90eXBlID09IFVJbnQ2NCgKICAgIC8vICAgICBlbnVtcy5FVlRfSUVECiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGRpZyA5CiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MzIKICAgIC8vIGluZGV4ICs9IFVJbnQ2NCgxKQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIGNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEAyCgpjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlANjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkxMy05MTUKICAgIC8vICMgVGhlIGZpcnN0IGVudHJ5IG9mIGEgcGFnZSBtdXN0IHN0aWxsIGJlIG9yZGVyZWQgYWZ0ZXIgdGhlCiAgICAvLyAjIGxhc3QgZW50cnkgb2YgdGhlIHByZXZpb3VzIHBhZ2UuCiAgICAvLyBhc3NlcnQgc2NoZWR1bGVfcGFnZV9pbmRleCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGRpZyA2CiAgICBkdXAKICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTYKICAgIC8vIHByZXZpb3VzX3BhZ2VfaW5kZXggPSBzY2hlZHVsZV9wYWdlX2luZGV4IC0gVUludDY0KDEpCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTE4CiAgICAvLyBwcmV2aW91c19wYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZQogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTctOTE5CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHByZXZpb3VzX3BhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjAtOTIxCiAgICAvLyBwcmV2aW91c19wYWdlID0gc2VsZi5zY2hlZHVsZV9wYWdlW3ByZXZpb3VzX3BhZ2VfaW5kZXhdLmNvcHkoKQogICAgLy8gYXNzZXJ0IHByZXZpb3VzX3BhZ2UubGVuZ3RoID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBwdXNoaW50IDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjEKICAgIC8vIGFzc2VydCBwcmV2aW91c19wYWdlLmxlbmd0aCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZHVwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjMKICAgIC8vIHByZXZpb3VzX3BhZ2UubGVuZ3RoIC0gVUludDY0KDEpCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTIyLTkyNAogICAgLy8gcHJldmlvdXNfZW50cnkgPSBwcmV2aW91c19wYWdlWwogICAgLy8gICAgIHByZXZpb3VzX3BhZ2UubGVuZ3RoIC0gVUludDY0KDEpCiAgICAvLyBdLmNvcHkoKQogICAgcHVzaGludCA2NQogICAgKgogICAgcHVzaGludCAyCiAgICArCiAgICBwdXNoaW50IDY1CiAgICBib3hfZXh0cmFjdAogICAgYiBjb250cmFjdF9zY2hlZHVsZV9hZnRlcl9pZl9lbHNlQDcKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX3doaWxlQDExOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjAzCiAgICAvLyBzZWxmLnNjaGVkdWxlX3BhZ2VbcGFnZV9pbmRleF0gPSBzY2hlZHVsZV9wYWdlLmNvcHkoKQogICAgZGlnIDYKICAgIGl0b2IKICAgIGJ5dGVjIDI0IC8vIDB4NTMyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgZGlnIDUKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzNQogICAgLy8gaWYgaXNfbGFzdF9wYWdlOgogICAgZGlnIDUKICAgIGJ6IGNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzNwogICAgLy8gc2NoZWR1bGVfcGFnZV9pbmRleCAqIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKSArIHBhZ2VfbGVuZ3RoCiAgICBkaWcgMQogICAgZGlnIDQKICAgICsKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzNgogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA9ICgKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTM2LTkzOAogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA9ICgKICAgIC8vICAgICBzY2hlZHVsZV9wYWdlX2luZGV4ICogVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpICsgcGFnZV9sZW5ndGgKICAgIC8vICkKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MzkKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgNTAKICAgIGFwcF9nbG9iYWxfcHV0Cgpjb250cmFjdF9zY2hlZHVsZV9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEyMQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDgxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9leGVjdXRlX2llZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X2V4ZWN1dGVfaWVkOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQ2CiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDYKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE0NwogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDgKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTUwCiAgICAvLyBhc3NlcnQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LCBlcnIuSU5WQUxJRF9FVkVOVF9DVVJTT1IKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgZGlnIDEKICAgID4KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGN1cnNvcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1MQogICAgLy8gZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoc2VsZi5ldmVudF9jdXJzb3IpCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTIKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoZW51bXMuRVZUX0lFRCksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGR1cAogICAgZXh0cmFjdCA4IDEKICAgIGR1cAogICAgcHVzaGJ5dGVzIDB4MDEKICAgIGI9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1NgogICAgLy8gZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICBkaWcgMQogICAgZXh0cmFjdCAwIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTgKICAgIC8vIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgZGlnIDIKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTU5CiAgICAvLyBhY2NydWFsX2ZhY3Rvcj1lbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIGRpZyAzCiAgICBleHRyYWN0IDE3IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNjAKICAgIC8vIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIGRpZyA0CiAgICBleHRyYWN0IDI1IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNjIKICAgIC8vIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPWVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDUKICAgIGV4dHJhY3QgMzMgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE2MwogICAgLy8gbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgZGlnIDYKICAgIGV4dHJhY3QgNDEgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE2NAogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9ZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICBkaWcgNwogICAgZXh0cmFjdCA0OSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTY1CiAgICAvLyBmbGFncz1lbnRyeS5mbGFncywKICAgIGRpZyA4CiAgICBleHRyYWN0IDU3IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTUtMTE2NgogICAgLy8gdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0KAogICAgLy8gICAgIGV2ZW50X2lkPWVudHJ5LmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1lbnRyeS5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1lbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPWVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9ZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPWVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGZsYWdzPWVudHJ5LmZsYWdzLAogICAgLy8gKSwKICAgIHVuY292ZXIgNwogICAgdW5jb3ZlciA4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNwogICAgY29uY2F0CiAgICB1bmNvdmVyIDYKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNjEKICAgIC8vIG9ic2VydmVkX3JhdGU9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTUtMTE2NgogICAgLy8gdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0KAogICAgLy8gICAgIGV2ZW50X2lkPWVudHJ5LmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1lbnRyeS5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1lbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPWVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9ZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPWVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGZsYWdzPWVudHJ5LmZsYWdzLAogICAgLy8gKSwKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTUzLTExNjcKICAgIC8vIHNlbGYuX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5KAogICAgLy8gICAgIGVudHJ5LAogICAgLy8gICAgIHR5cC5PYnNlcnZlZEV2ZW50UmVxdWVzdCgKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPWVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIG9ic2VydmVkX3JhdGU9VUludDY0KDApLAogICAgLy8gICAgICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1lbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1lbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICAgICAgZmxhZ3M9ZW50cnkuZmxhZ3MsCiAgICAvLyAgICAgKSwKICAgIC8vICkKICAgIGNhbGxzdWIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5CiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNjgKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEyMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuYXBwbHlfbm9uX2Nhc2hfZXZlbnRbcm91dGluZ10oKSAtPiB2b2lkOgphcHBseV9ub25fY2FzaF9ldmVudDoKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDQKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTcwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cG4gMgogICAgbGVuCiAgICBwdXNoaW50IDczCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLk9ic2VydmVkRXZlbnRSZXF1ZXN0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDYKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIwNwogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMDgKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjEwCiAgICAvLyBpZiBwYXlsb2FkLmZsYWdzICYgVUludDY0KGVudW1zLkZMQUdfT0JTRVJWRURfRVZFTlQpOgogICAgcHVzaGludCA2NQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgcHVzaGludCA0CiAgICAmCiAgICBieiBhcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIzNgogICAgLy8gcmV0dXJuIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQ0xNKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICBwdXNoaW50IDUKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjExCiAgICAvLyBhc3NlcnQgc2VsZi5fc3VwcG9ydHNfb2JzZXJ2ZWRfZXZlbnRzKCksIGVyci5PQlNFUlZFRF9FVkVOVF9SRVFVSVJFRAogICAgYXNzZXJ0IC8vIE9ic2VydmVkIGV2ZW50IHJlcXVpcmVkIHRvIGV4ZWN1dGUgdGhpcyBhY3Rpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMTIKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjM2CiAgICAvLyByZXR1cm4gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9DTE0pCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIGR1cAogICAgcHVzaGludCA1CiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQ4CiAgICAvLyBhc3NlcnQgc2VsZi5fc3VwcG9ydHNfb2JzZXJ2ZWRfZXZlbnRzKCksIGVyci5PQlNFUlZFRF9FVkVOVF9SRVFVSVJFRAogICAgYXNzZXJ0IC8vIE9ic2VydmVkIGV2ZW50IHJlcXVpcmVkIHRvIGV4ZWN1dGUgdGhpcyBhY3Rpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk0OQogICAgLy8gYXNzZXJ0IHBheWxvYWQuZXZlbnRfaWQgPT0gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGRpZyAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDcKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBpZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTUxCiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUsIHBheWxvYWQuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgYnVyeSAxMgogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1MC05NTIKICAgIC8vIHNlbGYuX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIHNlbGYuY29udHJhY3RfdHlwZSwgcGF5bG9hZC5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICAvLyApCiAgICBjYWxsc3ViIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTU0CiAgICAvLyBwYWdlX2luZGV4ID0gc2VsZi5fc2NoZWR1bGVfcGFnZV9pbmRleChzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTkzCiAgICAvLyByZXR1cm4gZXZlbnRfaWQgLy8gVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpCiAgICBwdXNoaW50IDE2CiAgICAvCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTUKICAgIC8vIHBhZ2UgPSB0eXAuRXhlY3V0aW9uU2NoZWR1bGVQYWdlKCkKICAgIGJ5dGVjIDQ5IC8vIDB4MDAwMAogICAgYnVyeSA3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTYKICAgIC8vIGlmIHBhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlOgogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA5CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMjcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1NwogICAgLy8gcGFnZSA9IHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XS5jb3B5KCkKICAgIGRpZyA3CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidXJ5IDcKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX3BhZ2UgZW50cnkgZXhpc3RzCgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDI3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTU4CiAgICAvLyBhc3NlcnQgcGFnZS5sZW5ndGggPCBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGRpZyA1CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgMTYKICAgIDwKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2MwogICAgLy8gc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIGRpZyAzCiAgICBkdXAKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjQKICAgIC8vIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICBkaWcgMQogICAgZXh0cmFjdCAxNyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjUKICAgIC8vIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZGlnIDIKICAgIGV4dHJhY3QgMjUgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTY2CiAgICAvLyBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDMKICAgIGV4dHJhY3QgNDEgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTY3CiAgICAvLyBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIGRpZyA0CiAgICBleHRyYWN0IDQ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2OAogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIHVuY292ZXIgNQogICAgZXh0cmFjdCA1NyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjAtOTcwCiAgICAvLyB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1wYXlsb2FkLmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9cGF5bG9hZC5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPXBheWxvYWQucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXBheWxvYWQubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICkKICAgIGRpZyAxMQogICAgaXRvYgogICAgZGlnIDE4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMwogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTktOTcxCiAgICAvLyBwYWdlLmFwcGVuZCgKICAgIC8vICAgICB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9cGF5bG9hZC5ldmVudF9pZCwKICAgIC8vICAgICAgICAgZXZlbnRfdHlwZT1wYXlsb2FkLmV2ZW50X3R5cGUsCiAgICAvLyAgICAgICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIC8vICAgICAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICAgICApCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NzIKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHBhZ2UuY29weSgpCiAgICBkaWcgOAogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk3MwogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjE1CiAgICAvLyBhc3NlcnQgZXZlbnRfaWQgPT0gc2VsZi5ldmVudF9jdXJzb3IsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBjdXJzb3IKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMTYKICAgIC8vIGVudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KGV2ZW50X2lkKQogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIxOAogICAgLy8gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgYnVyeSAxMAogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjcKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjYtMzczCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY4CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY2LTM3MwogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9SUiksCiAgICBwdXNoaW50IDEyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjYtMzczCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzcwCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICBwdXNoaW50IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjYtMzczCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzcxCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgcHVzaGludCAxOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY2LTM3MwogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM3MgogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjYtMzczCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBieiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX2ZhbHNlQDE2CgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX3RydWVAMTU6CiAgICBpbnRjXzEgLy8gMQoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9tZXJnZUAxNzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMTctMTIxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2lzX25vbl9jYXNoKAogICAgLy8gICAgIGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIC8vICksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IHR5cGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMjAKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlICE9IGFyYzQuVUludDgoZW51bXMuRVZUX0lFRCksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGRpZyA4CiAgICBwdXNoYnl0ZXMgMHgwMQogICAgYiE9CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCB0eXBlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNzcKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluIChVSW50NjQoZW51bXMuRVZUX1JSKSwgVUludDY0KGVudW1zLkVWVF9SUkYpKQogICAgZGlnIDQKICAgIHB1c2hpbnQgMTIKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDIxCiAgICBkaWcgNAogICAgcHVzaGludCAxMQogICAgPT0KICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfZmFsc2VAMjIKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAyMToKICAgIGludGNfMSAvLyAxCgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX21lcmdlQDIzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIyMQogICAgLy8gaWYgc2VsZi5fZXZlbnRfaXNfcmF0ZV9yZXNldChlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpKToKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Vsc2VfYm9keUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODAKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLm9ic2VydmVyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjUgLy8gMHg1MjNhNGQ0ZjQzMjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMjUKICAgIC8vIHNlbGYuX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5KGVudHJ5LCBwYXlsb2FkKQogICAgZGlnIDYKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeQogICAgcG9wbiAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjI2CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfZWxzZV9ib2R5QDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjI0CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIGIgYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYWZ0ZXJfaWZfZWxzZUA2CgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX2ZhbHNlQDIyOgogICAgaW50Y18wIC8vIDAKICAgIGIgYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9tZXJnZUAyMwoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9mYWxzZUAxNjoKICAgIGludGNfMCAvLyAwCiAgICBiIGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfbWVyZ2VAMTcKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5hcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50OgogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGxlbgogICAgcHVzaGludCA2NQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5PYnNlcnZlZENhc2hFdmVudFJlcXVlc3QKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NgogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjU3CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyNTgKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjU5CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM4CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE1MAogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIzNgogICAgLy8gcmV0dXJuIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQ0xNKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICBwdXNoaW50IDUKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5ODQKICAgIC8vIGFzc2VydCBzZWxmLl9zdXBwb3J0c19vYnNlcnZlZF9ldmVudHMoKSwgZXJyLk9CU0VSVkVEX0VWRU5UX1JFUVVJUkVECiAgICBhc3NlcnQgLy8gT2JzZXJ2ZWQgZXZlbnQgcmVxdWlyZWQgdG8gZXhlY3V0ZSB0aGlzIGFjdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTg1CiAgICAvLyBhc3NlcnQgcGF5bG9hZC5ldmVudF9pZCA9PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LCBlcnIuSU5WQUxJRF9FVkVOVF9JRAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgc3dhcAogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBpZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTg2CiAgICAvLyBhc3NlcnQgcGF5bG9hZC5ldmVudF90eXBlID09IGFyYzQuVUludDgoZW51bXMuRVZUX1BSKSwgZXJyLklOVkFMSURfRVZFTlRfVFlQRQogICAgZGlnIDEKICAgIGV4dHJhY3QgOCAxCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIHB1c2hieXRlcyAweDAzCiAgICBiPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IHR5cGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4NwogICAgLy8gYXNzZXJ0IHBheWxvYWQuZmxhZ3MgJiBVSW50NjQoZW51bXMuRkxBR19DQVNIX0VWRU5UKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBzd2FwCiAgICBwdXNoaW50IDU3CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzEgLy8gMQogICAgJgogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTg5CiAgICAvLyBpZiBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50ID4gVUludDY0KDApOgogICAgYnogYXBwZW5kX29ic2VydmVkX2Nhc2hfZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OTEKICAgIC8vIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgLSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OTAtOTkyCiAgICAvLyBwcmV2aW91c19lbnRyeSA9IHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeSgKICAgIC8vICAgICBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IC0gVUludDY0KDEpCiAgICAvLyApCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5NAogICAgLy8gcHJldmlvdXNfZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gcGF5bG9hZC5zY2hlZHVsZWRfdGltZQogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDQKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIDw9CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OTMtOTk1CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHByZXZpb3VzX2VudHJ5LnNjaGVkdWxlZF90aW1lIDw9IHBheWxvYWQuc2NoZWR1bGVkX3RpbWUKICAgIC8vICksIGVyci5JTlZBTElEX1NPUlRJTkcKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBtdXN0IGJlIHNvcnRlZCBpbiBzdHJpY3RseSBhc2NlbmRpbmcgb3JkZXIKCmFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5NwogICAgLy8gcGFnZV9pbmRleCA9IHNlbGYuX3NjaGVkdWxlX3BhZ2VfaW5kZXgoc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE5MwogICAgLy8gcmV0dXJuIGV2ZW50X2lkIC8vIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKQogICAgcHVzaGludCAxNgogICAgLwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTk4CiAgICAvLyBwYWdlID0gdHlwLkV4ZWN1dGlvblNjaGVkdWxlUGFnZSgpCiAgICBieXRlYyA0OSAvLyAweDAwMDAKICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTk5CiAgICAvLyBpZiBwYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZToKICAgIGl0b2IKICAgIGJ5dGVjIDI0IC8vIDB4NTMyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgNwogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBhcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMDAKICAgIC8vIHBhZ2UgPSBzZWxmLnNjaGVkdWxlX3BhZ2VbcGFnZV9pbmRleF0uY29weSgpCiAgICBkaWcgNQogICAgYm94X2dldAogICAgc3dhcAogICAgYnVyeSA2CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9wYWdlIGVudHJ5IGV4aXN0cwoKYXBwZW5kX29ic2VydmVkX2Nhc2hfZXZlbnRfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAwMQogICAgLy8gYXNzZXJ0IHBhZ2UubGVuZ3RoIDwgVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBkaWcgNAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBwdXNoaW50IDE2CiAgICA8CiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDA2CiAgICAvLyBzY2hlZHVsZWRfdGltZT1wYXlsb2FkLnNjaGVkdWxlZF90aW1lLAogICAgZGlnIDUKICAgIGR1cAogICAgZXh0cmFjdCA5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMDcKICAgIC8vIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICBkaWcgMQogICAgZXh0cmFjdCAxNyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDA4CiAgICAvLyByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPXBheWxvYWQucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIGRpZyAyCiAgICBleHRyYWN0IDI1IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMDkKICAgIC8vIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPXBheWxvYWQubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBkaWcgMwogICAgZXh0cmFjdCAzMyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDEwCiAgICAvLyBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIGRpZyA0CiAgICBleHRyYWN0IDQxIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMTEKICAgIC8vIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXBheWxvYWQubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICB1bmNvdmVyIDUKICAgIGV4dHJhY3QgNDkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAwMy0xMDEzCiAgICAvLyB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1wYXlsb2FkLmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9cGF5bG9hZC5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPXBheWxvYWQucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXBheWxvYWQubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICkKICAgIGRpZyAxMAogICAgaXRvYgogICAgZGlnIDEwCiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMwogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDAyLTEwMTQKICAgIC8vIHBhZ2UuYXBwZW5kKAogICAgLy8gICAgIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgICAgICBldmVudF9pZD1wYXlsb2FkLmV2ZW50X2lkLAogICAgLy8gICAgICAgICBldmVudF90eXBlPXBheWxvYWQuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICAgICAgYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPXBheWxvYWQubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1wYXlsb2FkLm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgICAgICBmbGFncz1wYXlsb2FkLmZsYWdzLAogICAgLy8gICAgICkKICAgIC8vICkKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMTUKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHBhZ2UuY29weSgpCiAgICBkaWcgNgogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMTYKICAgIC8vIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgKz0gVUludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI2MwogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjI4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9zZXRfZGVmYXVsdF9zdGF0dXNbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9zZXRfZGVmYXVsdF9zdGF0dXM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjY1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzQKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnRydXN0ZWUsIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyNiAvLyAweDUyM2E1NDUyNTMyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI3OAogICAgLy8gc2VsZi5kZWZhdWx0ZWQgPSBkZWZhdWx0ZWQKICAgIGJ5dGVjIDQ3IC8vICJkZWZhdWx0ZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI3OQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjY1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9nZXRfc3RhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9nZXRfc3RhdGU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDYKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGR1cAogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjk0CiAgICAvLyBjb250cmFjdF90eXBlPWFyYzQuVUludDgoc2VsZi5jb250cmFjdF90eXBlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgaXRvYgogICAgZHVwCiAgICBiaXRsZW4KICAgIGludGNfMiAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBleHRyYWN0IDcgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI5NgogICAgLy8gdG90YWxfdW5pdHM9c2VsZi50b3RhbF91bml0cywKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjk3CiAgICAvLyByZXNlcnZlZF91bml0c190b3RhbD1zZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyOTgKICAgIC8vIGluaXRpYWxfZXhjaGFuZ2VfYW1vdW50PXNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI5OQogICAgLy8gZXZlbnRfY3Vyc29yPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzAwCiAgICAvLyBzY2hlZHVsZV9lbnRyeV9jb3VudD1zZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMwMQogICAgLy8gb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzAyCiAgICAvLyBpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlPXNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzAzCiAgICAvLyBub21pbmFsX2ludGVyZXN0X3JhdGU9c2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMDQKICAgIC8vIGFjY3J1ZWRfaW50ZXJlc3Q9c2VsZi5hY2NydWVkX2ludGVyZXN0LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMDUKICAgIC8vIGN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXg9c2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzA2CiAgICAvLyBjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleD1zZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMDcKICAgIC8vIHJlc2VydmVkX2ludGVyZXN0PXNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX2ludGVyZXN0IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMwOAogICAgLy8gcmVzZXJ2ZWRfcHJpbmNpcGFsPXNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI5My0xMzA5CiAgICAvLyByZXR1cm4gdHlwLktlcm5lbFN0YXRlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGU9YXJjNC5VSW50OChzZWxmLmNvbnRyYWN0X3R5cGUpLAogICAgLy8gICAgIHN0YXR1cz1zZWxmLnN0YXR1cywKICAgIC8vICAgICB0b3RhbF91bml0cz1zZWxmLnRvdGFsX3VuaXRzLAogICAgLy8gICAgIHJlc2VydmVkX3VuaXRzX3RvdGFsPXNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwsCiAgICAvLyAgICAgaW5pdGlhbF9leGNoYW5nZV9hbW91bnQ9c2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCwKICAgIC8vICAgICBldmVudF9jdXJzb3I9c2VsZi5ldmVudF9jdXJzb3IsCiAgICAvLyAgICAgc2NoZWR1bGVfZW50cnlfY291bnQ9c2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwKICAgIC8vICAgICBvdXRzdGFuZGluZ19wcmluY2lwYWw9c2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZT1zZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICAvLyAgICAgbm9taW5hbF9pbnRlcmVzdF9yYXRlPXNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIGFjY3J1ZWRfaW50ZXJlc3Q9c2VsZi5hY2NydWVkX2ludGVyZXN0LAogICAgLy8gICAgIGN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXg9c2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4LAogICAgLy8gICAgIGN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4PXNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgsCiAgICAvLyAgICAgcmVzZXJ2ZWRfaW50ZXJlc3Q9c2VsZi5yZXNlcnZlZF9pbnRlcmVzdCwKICAgIC8vICAgICByZXNlcnZlZF9wcmluY2lwYWw9c2VsZi5yZXNlcnZlZF9wcmluY2lwYWwsCiAgICAvLyApCiAgICB1bmNvdmVyIDE0CiAgICBpdG9iCiAgICB1bmNvdmVyIDE0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMgogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDExCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA5CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgOAogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDcKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyODEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NgogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzIzCiAgICAvLyBpZiBzZWxmLmV2ZW50X2N1cnNvciA+PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICA+PQogICAgYnogY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMyNQogICAgLy8gZXZlbnRfaWQ9c2VsZi5ldmVudF9jdXJzb3IsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMjQtMTMzNAogICAgLy8gcmV0dXJuIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgIGV2ZW50X2lkPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgLy8gICAgIGV2ZW50X3R5cGU9YXJjNC5VSW50OCgwKSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1VSW50NjQoMCksCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1VSW50NjQoMCksCiAgICAvLyAgICAgZmxhZ3M9VUludDY0KDApLAogICAgLy8gKQogICAgaXRvYgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMyNgogICAgLy8gZXZlbnRfdHlwZT1hcmM0LlVJbnQ4KDApLAogICAgYnl0ZWMgNDAgLy8gMHgwMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMyNC0xMzM0CiAgICAvLyByZXR1cm4gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkoCiAgICAvLyAgICAgZXZlbnRfaWQ9c2VsZi5ldmVudF9jdXJzb3IsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1hcmM0LlVJbnQ4KDApLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPVVJbnQ2NCgwKSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249VUludDY0KDApLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPVVJbnQ2NCgwKSwKICAgIC8vICAgICBmbGFncz1VSW50NjQoMCksCiAgICAvLyApCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMjcKICAgIC8vIHNjaGVkdWxlZF90aW1lPVVJbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzI0LTEzMzQKICAgIC8vIHJldHVybiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1zZWxmLmV2ZW50X2N1cnNvciwKICAgIC8vICAgICBldmVudF90eXBlPWFyYzQuVUludDgoMCksCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9VUludDY0KDApLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9VUludDY0KDApLAogICAgLy8gICAgIGZsYWdzPVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAoKY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50QDQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzExCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzM1CiAgICAvLyByZXR1cm4gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KHNlbGYuZXZlbnRfY3Vyc29yKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiBjb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnRfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnRANAoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLmNvbnRyYWN0X3VwZGF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X3VwZGF0ZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTktMTYyCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gZ3JhbnRzIHRoZSB1cGRhdGUgcGVybWlzc2lvbnMgdG8gdGhlIEFycmFuZ2VyLgogICAgLy8gIyDimqDvuI8gV0FSTklORzogQXBwbGljYXRpb24gdXBkYXRlcyBtdXN0IGJlIGV4ZWN1dGVkIFZFUlkgY2FyZWZ1bGx5LCBhcyB0aGV5CiAgICAvLyAjIG1pZ2h0IGludHJvZHVjZSBicmVha2luZyBjaGFuZ2VzLgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19yb3RhdGVfYXJyYW5nZXJbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3JvdGF0ZV9hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTc4CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzkKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSBuZXdfYXJyYW5nZXIKICAgIGJ5dGVjIDE4IC8vIDB4NTIzYTQxNTI1MjIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4MAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTY0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3NldF9vcF9kYWVtb25bcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3NldF9vcF9kYWVtb246CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTgyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE5NgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTk3CiAgICAvLyBzZWxmLm9wX2RhZW1vbi52YWx1ZSA9IGFkZHJlc3MKICAgIGJ5dGVjIDI3IC8vIDB4NTIzYTRmNTA0NDIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE5OAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTgyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2Fzc2lnbl9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19hc3NpZ25fcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDE2CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLlJvbGVWYWxpZGl0eQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyMgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjIzCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNAogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgcHVzaGludCAyMAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTAzCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gcm9sZV9hZGRyZXNzCiAgICBieXRlYyAxOCAvLyAweDUyM2E0MTUyNTIyMwogICAgZGlnIDMKICAgIGFwcF9nbG9iYWxfcHV0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwNgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDQwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDcKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIzIC8vIDB4NTIzYTRkNGU0NzIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDgKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI1CiAgICAvLyBzZWxmLl9zZXRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIHZhbGlkaXR5KQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTAKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTEKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjIgLy8gMHg1MjNhNTA1OTQ0MjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMgogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNQogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE0CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpOgogICAgZHVwCiAgICBwdXNoaW50IDYwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTUKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyNiAvLyAweDUyM2E1NDUyNTMyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE2CiAgICAvLyBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjUKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExOAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMSAvLyAweDUyM2E0MTU1NTQyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIwCiAgICAvLyBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNQogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgODAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIzCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI1IC8vIDB4NTIzYTRkNGY0MzIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjQKICAgIC8vIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfcmV2b2tlX3JvbGVbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3Jldm9rZV9yb2xlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0NwogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjQ4CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0OQogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjcKICAgIC8vIGFzc2VydCByb2xlX2lkICE9IFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwgZXJyLklOVkFMSURfUk9MRQogICAgZHVwCiAgICBwdXNoaW50IDIwCiAgICAhPQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI4CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICBwdXNoaW50IDQwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjkKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjMgLy8gMHg1MjNhNGQ0ZTQ3MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMAogICAgLy8gZGVsIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTEKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzMKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMiAvLyAweDUyM2E1MDU5NDQyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM0CiAgICAvLyBkZWwgc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTAKICAgIC8vIHNlbGYuX2RlbGV0ZV9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcykKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM2CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpOgogICAgZHVwCiAgICBwdXNoaW50IDYwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzcKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI2IC8vIDB4NTIzYTU0NTI1MzIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzgKICAgIC8vIGRlbCBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjUwCiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDEKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hdXRob3JpdHksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjEgLy8gMHg1MjNhNDE1NTU0MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MgogICAgLy8gZGVsIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1MAogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDQKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDgwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI1IC8vIDB4NTIzYTRkNGY0MzIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDYKICAgIC8vIGRlbCBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19jb250cmFjdF9zdXNwZW5zaW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19jb250cmFjdF9zdXNwZW5zaW9uOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kICAjIFRPRE86IFVwZGF0ZSBzcGVjcyBhbmQgYWRkIHRlc3QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzcKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDIxIC8vIDB4NTIzYTQxNTU1NDIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjY5CiAgICAvLyBzZWxmLmFzc2V0X3N1c3BlbmRlZCA9IHN1c3BlbmRlZAogICAgYnl0ZWMgMzMgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjcwCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCAgIyBUT0RPOiBVcGRhdGUgc3BlY3MgYW5kIGFkZCB0ZXN0CiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYXJyYW5nZXJbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODMKICAgIC8vIHJldHVybiBzZWxmLmFycmFuZ2VyLnZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTggLy8gMHg1MjNhNDE1MjUyMjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcnJhbmdlciBleGlzdHMKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNzIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXNbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9hZGRyZXNzX3JvbGVzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDMKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDIzIC8vIDB4NTIzYTRkNGU0NzIzCiAgICBkaWcgMQogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDQKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYucHJpbWFyeV9kZWFsZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjIgLy8gMHg1MjNhNTA1OTQ0MjMKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwNQogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi50cnVzdGVlLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDI2IC8vIDB4NTIzYTU0NTI1MzIzCiAgICBkaWcgMwogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDYKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYXV0aG9yaXR5LCBhZGRyZXNzKSwKICAgIGJ5dGVjIDIxIC8vIDB4NTIzYTQxNTU1NDIzCiAgICBkaWcgNAogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDcKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYub2JzZXJ2ZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjUgLy8gMHg1MjNhNGQ0ZjQzMjMKICAgIHVuY292ZXIgNQogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWMgNDAgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgNgogICAgc2V0Yml0CiAgICBpbnRjXzEgLy8gMQogICAgdW5jb3ZlciA1CiAgICBzZXRiaXQKICAgIHB1c2hpbnQgMgogICAgdW5jb3ZlciA0CiAgICBzZXRiaXQKICAgIHB1c2hpbnQgMwogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIHB1c2hpbnQgNAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5W3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfcm9sZV92YWxpZGl0eToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjgKICAgIC8vIHJvbGUgPSByb2xlX2lkLmFzX3VpbnQ2NCgpCiAgICBidG9pCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI5CiAgICAvLyBzZWxmLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlKQogICAgZHVwCiAgICBjYWxsc3ViIF9hc3NlcnRfdmFsaWRfcm9sZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMzMQogICAgLy8gY2FzZSBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUik6CiAgICBwdXNoaW50cyAyMCA0MCA1MCA2MCA3MCA4MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMzMC0zNjEKICAgIC8vIG1hdGNoIHJvbGU6CiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUik6CiAgICAvLyAgICAgICAgIHJldHVybiB0eXAuUm9sZVZhbGlkaXR5KAogICAgLy8gICAgICAgICAgICAgcm9sZV92YWxpZGl0eV9zdGFydD1VSW50NjQoMCksIHJvbGVfdmFsaWRpdHlfZW5kPVVJbnQ2NCgwKQogICAgLy8gICAgICAgICApCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLmFjY291bnRfbWFuYWdlciwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLnByaW1hcnlfZGVhbGVyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLmF1dGhvcml0eSwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLm9ic2VydmVyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIF86CiAgICAvLyAgICAgICAgIG9wLmVycihlcnIuSU5WQUxJRF9ST0xFKQogICAgdW5jb3ZlciA2CiAgICBtYXRjaCByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzBAMiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzFAMyByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzJANCByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzNANSByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzRANiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzVANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM2MQogICAgLy8gb3AuZXJyKGVyci5JTlZBTElEX1JPTEUpCiAgICBlcnIgLy8gSW52YWxpZCByb2xlIGlkZW50aWZpZXIKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM1NwogICAgLy8gc2VsZi5vYnNlcnZlciwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAyNSAvLyAweDUyM2E0ZDRmNDMyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM1Ni0zNTgKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLm9ic2VydmVyLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTkKICAgIC8vIHJldHVybiBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV80QDY6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzUyCiAgICAvLyBzZWxmLmF1dGhvcml0eSwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAyMSAvLyAweDUyM2E0MTU1NTQyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM1MS0zNTMKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLmF1dGhvcml0eSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzU0CiAgICAvLyByZXR1cm4gc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8zQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzQ3CiAgICAvLyBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMjYgLy8gMHg1MjNhNTQ1MjUzMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNDYtMzQ4CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNDkKICAgIC8vIHJldHVybiBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8yQDQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzQyCiAgICAvLyBzZWxmLnByaW1hcnlfZGVhbGVyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDIyIC8vIDB4NTIzYTUwNTk0NDIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzQxLTM0MwogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM0NAogICAgLy8gcmV0dXJuIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8xQDM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzM3CiAgICAvLyBzZWxmLmFjY291bnRfbWFuYWdlciwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAyMyAvLyAweDUyM2E0ZDRlNDcyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMzNi0zMzgKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLmFjY291bnRfbWFuYWdlciwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzM5CiAgICAvLyByZXR1cm4gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8wQDI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzMyLTMzNAogICAgLy8gcmV0dXJuIHR5cC5Sb2xlVmFsaWRpdHkoCiAgICAvLyAgICAgcm9sZV92YWxpZGl0eV9zdGFydD1VSW50NjQoMCksIHJvbGVfdmFsaWRpdHlfZW5kPVVJbnQ2NCgwKQogICAgLy8gKQogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQoaG9sZGluZ19hZGRyZXNzOiBieXRlcykgLT4gdm9pZDoKX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQ6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjYKICAgIC8vIGRlZiBfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChzZWxmLCBob2xkaW5nX2FkZHJlc3M6IEFjY291bnQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyOAogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQsIGVyci5TVVNQRU5ERUQKICAgIGJ5dGVjIDggLy8gMHg0MTIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHB1c2hpbnQgMzg0CiAgICBnZXRiaXQKICAgICEKICAgIGFzc2VydCAvLyBTdXNwZW5kZWQgb3BlcmF0aW9ucwogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuX3NldHRsZV9wb3NpdGlvbihob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB1aW50NjQsIHVpbnQ2NDoKX3NldHRsZV9wb3NpdGlvbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo0NAogICAgLy8gZGVmIF9zZXR0bGVfcG9zaXRpb24oc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50KSAtPiB0dXBsZVtVSW50NjQsIFVJbnQ2NF06CiAgICBwcm90byAxIDIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo2MQogICAgLy8gcG9zaXRpb24gPSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jb3B5KCkKICAgIGR1cAogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NjMtNjUKICAgIC8vICMgQ29tcHV0ZSB0aGUgaW5jcmVtZW50YWwgcGVyLXVuaXQgZml4ZWQtcG9pbnQgaW50ZXJlc3QgYW5kIHByaW5jaXBhbCBhY2NydWVkCiAgICAvLyAjIHNpbmNlIHRoaXMgYWNjb3VudCdzIGxhc3QgY2hlY2twb2ludC4KICAgIC8vIGludGVyZXN0X2RlbHRhID0gc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IC0gcG9zaXRpb24uaW50ZXJlc3RfY2hlY2twb2ludAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggZXhpc3RzCiAgICBkaWcgMQogICAgcHVzaGludCA1NwogICAgZXh0cmFjdF91aW50NjQKICAgIC0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo2NwogICAgLy8gc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCAtIHBvc2l0aW9uLnByaW5jaXBhbF9jaGVja3BvaW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTcgLy8gImN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IGV4aXN0cwogICAgZGlnIDIKICAgIHB1c2hpbnQgNjUKICAgIGV4dHJhY3RfdWludDY0CiAgICAtCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzMKICAgIC8vIGludGVyZXN0X2RlbHRhLCBwb3NpdGlvbi51bml0cywgc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgZGlnIDIKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3MC03NAogICAgLy8gIyBDb252ZXJ0IHRoZSBwZXItdW5pdCBmaXhlZC1wb2ludCBkZWx0YXMgaW50byBhYnNvbHV0ZSBjbGFpbWFibGUgYW1vdW50cwogICAgLy8gIyB1c2luZyB0aGUgYWNjb3VudCdzIGFjdGl2ZSB1bml0cy4KICAgIC8vIGNsYWltYWJsZV9pbnRlcmVzdCA9IHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIGludGVyZXN0X2RlbHRhLCBwb3NpdGlvbi51bml0cywgc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgLy8gKQogICAgdW5jb3ZlciAzCiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojc2CiAgICAvLyBwcmluY2lwYWxfZGVsdGEsIHBvc2l0aW9uLnVuaXRzLCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzUtNzcKICAgIC8vIGNsYWltYWJsZV9wcmluY2lwYWwgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBwcmluY2lwYWxfZGVsdGEsIHBvc2l0aW9uLnVuaXRzLCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICAvLyApCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojc5LTgxCiAgICAvLyAjIEFjY3J1ZSB0aGUgY2xhaW1hYmxlIGFtb3VudHMgdG8gdGhlIGFjY291bnQgcG9zaXRpb24gYW5kIG1ha2UgdGhlbSBhdmFpbGFibGUKICAgIC8vICMgZm9yIHdpdGhkcmF3YWwuCiAgICAvLyBwb3NpdGlvbi5jbGFpbWFibGVfaW50ZXJlc3QgKz0gY2xhaW1hYmxlX2ludGVyZXN0CiAgICBkaWcgMgogICAgcHVzaGludCA3MwogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICArCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIHN3YXAKICAgIHJlcGxhY2UyIDczCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6ODIKICAgIC8vIHBvc2l0aW9uLmNsYWltYWJsZV9wcmluY2lwYWwgKz0gY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgZHVwCiAgICBwdXNoaW50IDgxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDIKICAgICsKICAgIGl0b2IKICAgIHJlcGxhY2UyIDgxCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6ODQtODYKICAgIC8vICMgQWR2YW5jZSB0aGUgYWNjb3VudCdzIHBlci11bml0IGZpeGVkLXBvaW50IGNoZWNrcG9pbnRzIHRvIHRoZSBjdXJyZW50IGdsb2JhbAogICAgLy8gIyBwZXItdW5pdCBmaXhlZC1wb2ludCBnbG9iYWwgaW5kaWNlcy4KICAgIC8vIHBvc2l0aW9uLmludGVyZXN0X2NoZWNrcG9pbnQgPSBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IGV4aXN0cwogICAgaXRvYgogICAgcmVwbGFjZTIgNTcKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo4NwogICAgLy8gcG9zaXRpb24ucHJpbmNpcGFsX2NoZWNrcG9pbnQgPSBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTcgLy8gImN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IGV4aXN0cwogICAgaXRvYgogICAgcmVwbGFjZTIgNjUKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo4OS05MAogICAgLy8gIyBBZHZhbmNlIHRoZSBhY2NvdW50J3MgZXZlbnQgY3Vyc29yIHRvIHRoZSBjdXJyZW50IGdsb2JhbCBldmVudCBjdXJzb3IuCiAgICAvLyBwb3NpdGlvbi5zZXR0bGVkX2N1cnNvciA9IHNlbGYuZXZlbnRfY3Vyc29yCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGl0b2IKICAgIHJlcGxhY2UyIDQ5CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6OTItOTQKICAgIC8vICMgVXBkYXRlIHRoZSBhY2NvdW50IHBvc2l0aW9uIGFuZCByZXR1cm4gdGhlIG5ld2x5IGFjY3J1ZWQgY2xhaW1hYmxlIGFtb3VudHMKICAgIC8vICMgYWRkZWQgdG8gdGhlIHRvdGFsIHBvc2l0aW9uJ3MgY2xhaW1hYmxlIGFtb3VudHMuCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHBvc2l0aW9uLmNvcHkoKQogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6OTUKICAgIC8vIHJldHVybiBjbGFpbWFibGVfaW50ZXJlc3QsIGNsYWltYWJsZV9wcmluY2lwYWwKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IHZvaWQ6Cl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojk3CiAgICAvLyBkZWYgX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQoc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg0MTIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzgKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwMAogICAgLy8gaWYgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCk6CiAgICBieiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZF9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDEKICAgIC8vIHJldHVybgogICAgcmV0c3ViCgpfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZF9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTAzCiAgICAvLyBwb3NpdGlvbiA9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNvcHkoKQogICAgZnJhbWVfZGlnIDIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwNAogICAgLy8gaWYgcG9zaXRpb24ucmVzZXJ2ZWRfdW5pdHMgPT0gVUludDY0KDApOgogICAgcHVzaGludCA0MAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICBibnogX2Vuc3VyZV91bml0c19hY3RpdmF0ZWRfYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA1CiAgICAvLyByZXR1cm4KICAgIHJldHN1YgoKX2Vuc3VyZV91bml0c19hY3RpdmF0ZWRfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwOAogICAgLy8gcG9zaXRpb24udW5pdHMgKz0gYWN0aXZhdGVkX3VuaXRzCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAzCiAgICArCiAgICBpdG9iCiAgICByZXBsYWNlMiAzMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwOQogICAgLy8gcG9zaXRpb24ucmVzZXJ2ZWRfdW5pdHMgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBpdG9iCiAgICByZXBsYWNlMiA0MAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExMAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSBwb3NpdGlvbi5jb3B5KCkKICAgIGZyYW1lX2RpZyAyCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTExCiAgICAvLyBhc3NlcnQgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCA+PSBhY3RpdmF0ZWRfdW5pdHMsIGVyci5PVkVSX0RJU1RSSUJVVElPTgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCBleGlzdHMKICAgIGR1cAogICAgZGlnIDIKICAgID49CiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IHJlbWFpbmluZyBELUFTQSB1bml0cwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExMgogICAgLy8gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCAtPSBhY3RpdmF0ZWRfdW5pdHMKICAgIHN3YXAKICAgIC0KICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fc2NhbGVkX211bF9kaXYobXVsdGlwbGljYW5kOiB1aW50NjQsIG11bHRpcGxpZXI6IHVpbnQ2NCwgZGl2aXNvcjogdWludDY0KSAtPiB1aW50NjQ6Cl9zY2FsZWRfbXVsX2RpdjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE1Ni0xNTgKICAgIC8vIGRlZiBfc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgc2VsZiwgbXVsdGlwbGljYW5kOiBVSW50NjQsIG11bHRpcGxpZXI6IFVJbnQ2NCwgZGl2aXNvcjogVUludDY0CiAgICAvLyApIC0+IFVJbnQ2NDoKICAgIHByb3RvIDMgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTYwCiAgICAvLyBpZiBtdWx0aXBsaWNhbmQgPT0gVUludDY0KDApIG9yIG11bHRpcGxpZXIgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0zCiAgICBieiBfc2NhbGVkX211bF9kaXZfaWZfYm9keUAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGJueiBfc2NhbGVkX211bF9kaXZfYWZ0ZXJfaWZfZWxzZUAzCgpfc2NhbGVkX211bF9kaXZfaWZfYm9keUAyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTYxCiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfc2NhbGVkX211bF9kaXZfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTYyCiAgICAvLyBoaWdoLCBsb3cgPSBvcC5tdWx3KG11bHRpcGxpY2FuZCwgbXVsdGlwbGllcikKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0yCiAgICBtdWx3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjMKICAgIC8vIHJldHVybiBvcC5kaXZ3KGhpZ2gsIGxvdywgZGl2aXNvcikKICAgIGZyYW1lX2RpZyAtMQogICAgZGl2dwogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Ftb3VudF90b19pbmRleF9kZWx0YShhbW91bnQ6IHVpbnQ2NCkgLT4gdWludDY0OgpfYW1vdW50X3RvX2luZGV4X2RlbHRhOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTY1CiAgICAvLyBkZWYgX2Ftb3VudF90b19pbmRleF9kZWx0YShzZWxmLCBhbW91bnQ6IFVJbnQ2NCkgLT4gVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjcKICAgIC8vIGlmIGFtb3VudCA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGJueiBfYW1vdW50X3RvX2luZGV4X2RlbHRhX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTY4CiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfYW1vdW50X3RvX2luZGV4X2RlbHRhX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2OQogICAgLy8gYXNzZXJ0IHNlbGYudG90YWxfdW5pdHMgPiBVSW50NjQoMCksIGVyci5OT19VTklUUwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIGR1cAogICAgYXNzZXJ0IC8vIE5vIEQtQVNBIHVuaXRzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNzAKICAgIC8vIHJldHVybiBzZWxmLl9zY2FsZWRfbXVsX2RpdihhbW91bnQsIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsIHNlbGYudG90YWxfdW5pdHMpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9pbmRleF9kZWx0YV90b19hbW91bnQoaW5kZXhfZGVsdGE6IHVpbnQ2NCkgLT4gdWludDY0OgpfaW5kZXhfZGVsdGFfdG9fYW1vdW50OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTcyCiAgICAvLyBkZWYgX2luZGV4X2RlbHRhX3RvX2Ftb3VudChzZWxmLCBpbmRleF9kZWx0YTogVUludDY0KSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE3OQogICAgLy8gaWYgaW5kZXhfZGVsdGEgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0xCiAgICBibnogX2luZGV4X2RlbHRhX3RvX2Ftb3VudF9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE4MAogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKX2luZGV4X2RlbHRhX3RvX2Ftb3VudF9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxODIKICAgIC8vIHNlbGYudG90YWxfdW5pdHMsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTg0CiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTgxLTE4NQogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIHNlbGYudG90YWxfdW5pdHMsCiAgICAvLyAgICAgaW5kZXhfZGVsdGEsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9nZXRfc2NoZWR1bGVfZW50cnkoZXZlbnRfaWQ6IHVpbnQ2NCkgLT4gYnl0ZXM6Cl9nZXRfc2NoZWR1bGVfZW50cnk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMDUKICAgIC8vIGRlZiBfZ2V0X3NjaGVkdWxlX2VudHJ5KHNlbGYsIGV2ZW50X2lkOiBVSW50NjQpIC0+IHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5OgogICAgcHJvdG8gMSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMDcKICAgIC8vIGFzc2VydCBldmVudF9pZCA8IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQsIGVyci5JTlZBTElEX0VWRU5UX0lECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgID4KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxOTMKICAgIC8vIHJldHVybiBldmVudF9pZCAvLyBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAxNgogICAgLwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjA5CiAgICAvLyBhc3NlcnQgcGFnZV9pbmRleCBpbiBzZWxmLnNjaGVkdWxlX3BhZ2UsIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGl0b2IKICAgIGJ5dGVjIDI0IC8vIDB4NTMyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTk3CiAgICAvLyByZXR1cm4gZXZlbnRfaWQgJSBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAxNgogICAgJQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjEyCiAgICAvLyBhc3NlcnQgb2Zmc2V0IDwgcGFnZS5sZW5ndGgsIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGludCAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZGlnIDEKICAgID4KICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIxMwogICAgLy8gcmV0dXJuIHBhZ2Vbb2Zmc2V0XS5jb3B5KCkKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgMgogICAgKwogICAgcHVzaGludCA2NQogICAgYm94X2V4dHJhY3QKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZShjb250cmFjdF90eXBlOiB1aW50NjQsIGV2ZW50X3R5cGU6IHVpbnQ2NCkgLT4gdm9pZDoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE2LTMxOAogICAgLy8gZGVmIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBzZWxmLCBjb250cmFjdF90eXBlOiBVSW50NjQsIGV2ZW50X3R5cGU6IFVJbnQ2NAogICAgLy8gKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTctMjU4CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjUwCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lFRCksCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU3LTI1OAogICAgLy8gIyBDaGVjayBjb21tb24gZXZlbnRzIGZpcnN0CiAgICAvLyBpZiBldmVudF90eXBlIGluIGNvbW1vbl9ldmVudHM6CiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjUxCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQKSwKICAgIGludGNfMiAvLyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTctMjU4CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTIKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfTUQpLAogICAgcHVzaGludCAxOQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU3LTI1OAogICAgLy8gIyBDaGVjayBjb21tb24gZXZlbnRzIGZpcnN0CiAgICAvLyBpZiBldmVudF90eXBlIGluIGNvbW1vbl9ldmVudHM6CiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjUzCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIHB1c2hpbnQgMTIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1Ny0yNTgKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1NAogICAgLy8gVUludDY0KGVudW1zLkVWVF9SUkYpLAogICAgcHVzaGludCAxMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU3LTI1OAogICAgLy8gIyBDaGVjayBjb21tb24gZXZlbnRzIGZpcnN0CiAgICAvLyBpZiBldmVudF90eXBlIGluIGNvbW1vbl9ldmVudHM6CiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VANwoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1OQogICAgLy8gcmV0dXJuIFRydWUKICAgIGludGNfMSAvLyAxCgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMyMC0zMjIKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgcmV0c3ViCgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjYxLTI2MgogICAgLy8gIyBDb250cmFjdC1zcGVjaWZpYyBhZGRpdGlvbmFsIGV2ZW50cwogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfUEFNKToKICAgIGZyYW1lX2RpZyAtMgogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2My0yNjQKICAgIC8vICMgUEFNIG9ubHkgc3VwcG9ydHMgY29tbW9uIGV2ZW50cwogICAgLy8gcmV0dXJuIEZhbHNlCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzIwLTMyMgogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjY2CiAgICAvLyBpZiBjb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9MQU0pIG9yIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDMKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNjYtMjY4CiAgICAvLyBpZiBjb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9MQU0pIG9yIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KAogICAgLy8gICAgIGVudW1zLkNUX05BTQogICAgLy8gKToKICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUAxMQogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDIKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAxNgoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlAMTE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNjktMjczCiAgICAvLyAjIExBTS9OQU0gYWRkOiBQUiwgSVBDQgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3MQogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUiksCiAgICBwdXNoaW50IDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2OS0yNzMKICAgIC8vICMgTEFNL05BTSBhZGQ6IFBSLCBJUENCCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAxMwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzIKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICBwdXNoaW50IDE4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNjktMjczCiAgICAvLyAjIExBTS9OQU0gYWRkOiBQUiwgSVBDQgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyApCiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMTQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMTM6CiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzIwLTMyMgogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF9mYWxzZUAxNDoKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMjAtMzIyCiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDE2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjc1CiAgICAvLyBpZiBjb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pOgogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDIzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzYtMjgxCiAgICAvLyAjIEFOTiBhZGRzOiBQUiwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3OAogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUiksCiAgICBwdXNoaW50IDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3Ni0yODEKICAgIC8vICMgQU5OIGFkZHM6IFBSLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyMAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzkKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICBwdXNoaW50IDE4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzYtMjgxCiAgICAvLyAjIEFOTiBhZGRzOiBQUiwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjAKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjgwCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICBwdXNoaW50IDUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3Ni0yODEKICAgIC8vICMgQU5OIGFkZHM6IFBSLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF9mYWxzZUAyMQoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyMDoKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMjAtMzIyCiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDIxOgogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMyMC0zMjIKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMjM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODMKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0xBWCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDMxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODQtMjkwCiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODYKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODQtMjkwCiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDI4CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4NwogICAgLy8gVUludDY0KGVudW1zLkVWVF9QSSksCiAgICBwdXNoaW50IDQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4NC0yOTAKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjgKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjg4CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgcHVzaGludCAxOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjg0LTI5MAogICAgLy8gIyBMQVggYWRkczogUFIsIFBJLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyOAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODkKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIHB1c2hpbnQgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjg0LTI5MAogICAgLy8gIyBMQVggYWRkczogUFIsIFBJLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF9mYWxzZUAyOQoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyODoKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMjAtMzIyCiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDI5OgogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMyMC0zMjIKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMzE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyOTIKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0NMTSk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDMzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyOTMtMjk0CiAgICAvLyAjIENMTSBhZGRzOiBQUgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QUikKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAzCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzIwLTMyMgogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAzMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI5NgogICAgLy8gcmV0dXJuIEZhbHNlCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzIwLTMyMgogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2lzX2R5bmFtaWNfYW5udWl0eSgpIC0+IHVpbnQ2NDoKX2lzX2R5bmFtaWNfYW5udWl0eToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMzOAogICAgLy8gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM4LTMzOQogICAgLy8gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICAvLyBhbmQgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBieiBfaXNfZHluYW1pY19hbm51aXR5X2Jvb2xfZmFsc2VAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM5CiAgICAvLyBhbmQgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzQgLy8gImR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMzOC0zMzkKICAgIC8vIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKQogICAgLy8gYW5kIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgYnogX2lzX2R5bmFtaWNfYW5udWl0eV9ib29sX2ZhbHNlQDMKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzctMzQwCiAgICAvLyByZXR1cm4gKAogICAgLy8gICAgIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKQogICAgLy8gICAgIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIC8vICkKICAgIHJldHN1YgoKX2lzX2R5bmFtaWNfYW5udWl0eV9ib29sX2ZhbHNlQDM6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM3LTM0MAogICAgLy8gcmV0dXJuICgKICAgIC8vICAgICBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIC8vICAgICBhbmQgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICAvLyApCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfaW50ZXJlc3Rfc2VnbWVudChlbnRyeTogYnl0ZXMpIC0+IHVpbnQ2NCwgYnl0ZXM6Cl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzgzCiAgICAvLyBkZWYgX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoc2VsZiwgZW50cnk6IHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5MgogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMTcKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5Mi0zOTQKICAgIC8vIGVudHJ5LmFjY3J1YWxfZmFjdG9yID09IFVJbnQ2NCgwKQogICAgLy8gb3Igc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPT0gVUludDY0KDApCiAgICBieiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudF9pZl9ib2R5QDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5MwogICAgLy8gb3Igc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPT0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5Mi0zOTQKICAgIC8vIGVudHJ5LmFjY3J1YWxfZmFjdG9yID09IFVJbnQ2NCgwKQogICAgLy8gb3Igc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPT0gVUludDY0KDApCiAgICBieiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudF9pZl9ib2R5QDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NAogICAgLy8gb3Igc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID09IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5Mi0zOTQKICAgIC8vIGVudHJ5LmFjY3J1YWxfZmFjdG9yID09IFVJbnQ2NCgwKQogICAgLy8gb3Igc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPT0gVUludDY0KDApCiAgICBibnogX2VudHJ5X2ludGVyZXN0X3NlZ21lbnRfYWZ0ZXJfaWZfZWxzZUA0CgpfZW50cnlfaW50ZXJlc3Rfc2VnbWVudF9pZl9ib2R5QDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozOTYKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9kaWcgLTEKICAgIHVuY292ZXIgMgogICAgcmV0c3ViCgpfZW50cnlfaW50ZXJlc3Rfc2VnbWVudF9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozOTgKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozOTkKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MDAKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozOTctNDAxCiAgICAvLyBhY2NydWVkID0gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlLAogICAgLy8gICAgIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICAvLyApCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDA1CiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDAyLTQwNgogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIGFjY3J1ZWQsCiAgICAvLyAgICAgZW50cnkuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgZnJhbWVfZGlnIC0xCiAgICB1bmNvdmVyIDIKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcihkaXNjb3VudF9mYWN0b3I6IHVpbnQ2NCwgcmVkZW1wdGlvbl9mYWN0b3I6IHVpbnQ2NCkgLT4gdWludDY0OgpfZGlzY291bnRfYW5udWl0eV9mYWN0b3I6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NjUtNDY5CiAgICAvLyBkZWYgX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yKAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgZGlzY291bnRfZmFjdG9yOiBVSW50NjQsCiAgICAvLyAgICAgcmVkZW1wdGlvbl9mYWN0b3I6IFVJbnQ2NCwKICAgIC8vICkgLT4gVUludDY0OgogICAgcHJvdG8gMiAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzEKICAgIC8vIGlmIHJlZGVtcHRpb25fZmFjdG9yID09IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMQogICAgYm56IF9kaXNjb3VudF9hbm51aXR5X2ZhY3Rvcl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3MgogICAgLy8gcmV0dXJuIGRpc2NvdW50X2ZhY3RvcgogICAgZnJhbWVfZGlnIC0yCiAgICByZXRzdWIKCl9kaXNjb3VudF9hbm51aXR5X2ZhY3Rvcl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzMKICAgIC8vIHBlcmlvZF9yYXRlID0gc2VsZi5maXhlZF9wb2ludF9zY2FsZSArIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDc0CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDczLTQ3NwogICAgLy8gcGVyaW9kX3JhdGUgPSBzZWxmLmZpeGVkX3BvaW50X3NjYWxlICsgc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgcmVkZW1wdGlvbl9mYWN0b3IsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgZGlnIDIKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICArCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzgKICAgIC8vIGFzc2VydCBwZXJpb2RfcmF0ZSA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBkdXAKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ4MQogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3OS00ODMKICAgIC8vIHJldHVybiBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBkaXNjb3VudF9mYWN0b3IsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICAgICBwZXJpb2RfcmF0ZSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5KGVudHJ5OiBieXRlcywgcGF5bG9hZDogYnl0ZXMpIC0+IGJ5dGVzLCBieXRlczoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjE2LTYxOAogICAgLy8gZGVmIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeSgKICAgIC8vICAgICBzZWxmLCBlbnRyeTogdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnksIHBheWxvYWQ6IHR5cC5PYnNlcnZlZEV2ZW50UmVxdWVzdAogICAgLy8gKSAtPiBOb25lOgogICAgcHJvdG8gMiAyCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYyNgogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X2lkID09IHNlbGYuZXZlbnRfY3Vyc29yLCBlcnIuSU5WQUxJRF9FVkVOVF9DVVJTT1IKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBjdXJzb3IKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYyNwogICAgLy8gYXNzZXJ0IGVudHJ5LnNjaGVkdWxlZF90aW1lIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLCBlcnIuTk9fRFVFX0NBU0hGTE9XCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIDw9CiAgICBhc3NlcnQgLy8gTm8gZHVlIGNhc2hmbG93IHRvIHBheQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjI5CiAgICAvLyBldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzAKICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9JRUQpOgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBkdXAKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzOAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzEtNjMzCiAgICAvLyAjIElFRCBmaW5hbGl6ZXMgaXNzdWFuY2U6IHJlc2VydmVkIHVuaXRzIGJlY29tZSBhY3RpdmF0YWJsZSBhbmQgdGhlCiAgICAvLyAjIHNjaGVkdWxlJ3MgaW5pdGlhbCBjb250cmFjdHVhbCBzdGF0ZSBiZWNvbWVzIGxpdmUuCiAgICAvLyBhc3NlcnQgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM1CiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID09IHNlbGYudG90YWxfdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYzNC02MzYKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCA9PSBzZWxmLnRvdGFsX3VuaXRzCiAgICAvLyApLCBlcnIuUFJJTUFSWV9ESVNUUklCVVRJT05fSU5DT01QTEVURQogICAgYXNzZXJ0IC8vIFByaW1hcnkgZGlzdHJpYnV0aW9uIGlzIG5vdCBjb21wbGV0ZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM3CiAgICAvLyBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9IGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYzOAogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM5CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IGVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjQwCiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0MQogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gZW50cnkubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDQxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjQyCiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NDMKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGVudW1zLlNUQVRVU19BQ1RJVkUpCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBwdXNoaW50IDEwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ1NAogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkgPT0gVUludDY0KGVudW1zLkVWVF9JRUQpLCBlcnIuTk9UX0VWVF9JRUQKICAgIGZyYW1lX2RpZyAxMQogICAgYXNzZXJ0IC8vIE5vdCBJRUQgZXZlbnQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ1NQogICAgLy8gcmV0dXJuIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMCAvLyAiaW5pdGlhbF9leGNoYW5nZV9hbW91bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NDQtNjQ4CiAgICAvLyBzZWxmLl9lbWl0X2V4ZWN1dGlvbl9ldmVudCgKICAgIC8vICAgICBlbnRyeT1lbnRyeSwKICAgIC8vICAgICBwYXlvZmY9c2VsZi5fZW50cnlfaWVkX2Ftb3VudChlbnRyeSksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NDcKICAgIC8vIHNldHRsZWRfYW1vdW50PVVJbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NDQtNjQ4CiAgICAvLyBzZWxmLl9lbWl0X2V4ZWN1dGlvbl9ldmVudCgKICAgIC8vICAgICBlbnRyeT1lbnRyeSwKICAgIC8vICAgICBwYXlvZmY9c2VsZi5fZW50cnlfaWVkX2Ftb3VudChlbnRyeSksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgY2FsbHN1YiBfZW1pdF9leGVjdXRpb25fZXZlbnQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAtMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjQ5CiAgICAvLyByZXR1cm4KICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfYnVyeSAxCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzOAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTAKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NTIKICAgIC8vIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCArPSBzZWxmLl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KGVudHJ5KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudAogICAgZnJhbWVfYnVyeSAtMgogICAgKwogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NTQKICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9SUik6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgMTIKICAgID09CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDEwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NTgKICAgIC8vIHBheWxvYWQub2JzZXJ2ZWRfcmF0ZSwKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAzMwogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1OQogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzYgLy8gInJhdGVfcmVzZXRfbXVsdGlwbGllciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjAKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NTUtNjYxCiAgICAvLyAjIFJSIGRlcml2ZXMgdGhlIG5leHQgcmF0ZSBmcm9tIGFuIG9ic2VydmVkIG9yYWNsZSB2YWx1ZSBwbHVzIHRoZQogICAgLy8gIyBjb250cmFjdCBzcHJlYWQgLyBtdWx0aXBsaWVyIHRlcm1zLCB0aGVuIGVuZm9yY2VzIGZsb29yIGFuZCBjYXAuCiAgICAvLyBvYnNlcnZlZF9yYXRlID0gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgcGF5bG9hZC5vYnNlcnZlZF9yYXRlLAogICAgLy8gICAgIHNlbGYucmF0ZV9yZXNldF9tdWx0aXBsaWVyLAogICAgLy8gICAgIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICAvLyApCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjYzCiAgICAvLyBvYnNlcnZlZF9yYXRlICsgc2VsZi5yYXRlX3Jlc2V0X3NwcmVhZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDM1IC8vICJyYXRlX3Jlc2V0X3NwcmVhZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X3NwcmVhZCBleGlzdHMKICAgICsKICAgIGZyYW1lX2J1cnkgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzQ0CiAgICAvLyBpZiBzZWxmLmhhc19yYXRlX3Jlc2V0X2Zsb29yIGFuZCByYXRlIDwgc2VsZi5yYXRlX3Jlc2V0X2Zsb29yOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDM4IC8vICJoYXNfcmF0ZV9yZXNldF9mbG9vciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5oYXNfcmF0ZV9yZXNldF9mbG9vciBleGlzdHMKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU1CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzEgLy8gInJhdGVfcmVzZXRfZmxvb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9mbG9vciBleGlzdHMKICAgIGZyYW1lX2RpZyA2CiAgICA+CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1NQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzQ1CiAgICAvLyByYXRlID0gc2VsZi5yYXRlX3Jlc2V0X2Zsb29yCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzEgLy8gInJhdGVfcmVzZXRfZmxvb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSA2CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X2Zsb29yIGV4aXN0cwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDYKICAgIC8vIGlmIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwIGFuZCByYXRlID4gc2VsZi5yYXRlX3Jlc2V0X2NhcDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzOSAvLyAiaGFzX3JhdGVfcmVzZXRfY2FwIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmhhc19yYXRlX3Jlc2V0X2NhcCBleGlzdHMKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU4CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzIgLy8gInJhdGVfcmVzZXRfY2FwIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfY2FwIGV4aXN0cwogICAgZnJhbWVfZGlnIDYKICAgIDwKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDcKICAgIC8vIHJhdGUgPSBzZWxmLnJhdGVfcmVzZXRfY2FwCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzIgLy8gInJhdGVfcmVzZXRfY2FwIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgNgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9jYXAgZXhpc3RzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1ODoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2MgogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPSBzZWxmLl9jbGFtcF9yYXRlKAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjYyLTY2NAogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPSBzZWxmLl9jbGFtcF9yYXRlKAogICAgLy8gICAgIG9ic2VydmVkX3JhdGUgKyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkCiAgICAvLyApCiAgICBmcmFtZV9kaWcgNgogICAgYXBwX2dsb2JhbF9wdXQKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc0CiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUEkpOgogICAgZnJhbWVfZGlnIDEwCiAgICBwdXNoaW50IDQKICAgID09CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDIwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzUKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc2CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAyMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4MQogICAgLy8gaWYgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCk6CiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMjkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4MgogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1BSRik6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgNQogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDMwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODYKICAgIC8vICsgKHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgLSBzZWxmLmV2ZW50X2N1cnNvcikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njg3CiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfUEVSX0VOVFJZX0JVREdFVCkKICAgIHB1c2hpbnQgMTAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODYtNjg3CiAgICAvLyArIChzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IC0gc2VsZi5ldmVudF9jdXJzb3IpCiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfUEVSX0VOVFJZX0JVREdFVCkKICAgICoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4NQogICAgLy8gVUludDY0KGNzdC5PUF9VUF9OT05fQ0FTSF9CQVNFX0JVREdFVCkKICAgIGludGMgNCAvLyAxNTAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODUtNjg3CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX05PTl9DQVNIX0JBU0VfQlVER0VUKQogICAgLy8gKyAoc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCAtIHNlbGYuZXZlbnRfY3Vyc29yKQogICAgLy8gKiBVSW50NjQoY3N0Lk9QX1VQX05PTl9DQVNIX1BFUl9FTlRSWV9CVURHRVQpCiAgICArCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODMtNjg5CiAgICAvLyBlbnN1cmVfYnVkZ2V0KAogICAgLy8gICAgIHJlcXVpcmVkX2J1ZGdldD0oCiAgICAvLyAgICAgICAgIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfQkFTRV9CVURHRVQpCiAgICAvLyAgICAgICAgICsgKHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgLSBzZWxmLmV2ZW50X2N1cnNvcikKICAgIC8vICAgICAgICAgKiBVSW50NjQoY3N0Lk9QX1VQX05PTl9DQVNIX1BFUl9FTlRSWV9CVURHRVQpCiAgICAvLyAgICAgKSwKICAgIC8vICkKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5MwogICAgLy8gZGlzY291bnRfZmFjdG9yID0gc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0OTQKICAgIC8vIGRlbm9taW5hdG9yID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0OTUKICAgIC8vIHNraXBfZmlyc3RfcmVkZW1wdGlvbiA9IEZhbHNlCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSA3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0OTcKICAgIC8vIGlmIGVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IgPiBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMjUKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgOAogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMzUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5OC01MDIKICAgIC8vICMgQW4gaW5pdGlhbCBQUkYgbWF5IGRlc2NyaWJlIHRoZSBmaXJzdCByZWRlbXB0aW9uIHBlcmlvZCBkaXJlY3RseS4KICAgIC8vIGRpc2NvdW50X2ZhY3RvciA9IHNlbGYuX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yKAogICAgLy8gICAgIGRpc2NvdW50X2ZhY3RvciwKICAgIC8vICAgICBlbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyA4CiAgICBjYWxsc3ViIF9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwNAogICAgLy8gc2tpcF9maXJzdF9yZWRlbXB0aW9uID0gVHJ1ZQogICAgaW50Y18xIC8vIDEKICAgIGZyYW1lX2J1cnkgNwogICAgZnJhbWVfYnVyeSAxCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAzNToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwNgogICAgLy8gZnV0dXJlX2V2ZW50X2lkID0gc2VsZi5ldmVudF9jdXJzb3IgKyBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X3doaWxlX3RvcEAzNjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwNwogICAgLy8gd2hpbGUgZnV0dXJlX2V2ZW50X2lkIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGZyYW1lX2RpZyAzCiAgICA+CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfd2hpbGVANDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwOAogICAgLy8gZnV0dXJlX2VudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KGZ1dHVyZV9ldmVudF9pZCkKICAgIGZyYW1lX2RpZyAzCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MDkKICAgIC8vIGZ1dHVyZV9ldmVudF90eXBlID0gZnV0dXJlX2VudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTEwLTUxMQogICAgLy8gIyBPbmx5IHJlZGVtcHRpb24tYmVhcmluZyBldmVudHMgY29udHJpYnV0ZSB0byB0aGUgYW5udWl0eSBkZW5vbWluYXRvci4KICAgIC8vIGlzX3JlZGVtcHRpb25fZXZlbnQgPSBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1BSKSBvciAoCiAgICBwdXNoaW50IDMKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTAtNTE0CiAgICAvLyAjIE9ubHkgcmVkZW1wdGlvbi1iZWFyaW5nIGV2ZW50cyBjb250cmlidXRlIHRvIHRoZSBhbm51aXR5IGRlbm9taW5hdG9yLgogICAgLy8gaXNfcmVkZW1wdGlvbl9ldmVudCA9IGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpIG9yICgKICAgIC8vICAgICBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgLy8gICAgIGFuZCBmdXR1cmVfZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKQogICAgLy8gKQogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX3RydWVANDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUxMgogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCkKICAgIGZyYW1lX2RpZyA0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTEyLTUxMwogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCkKICAgIC8vIGFuZCBmdXR1cmVfZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUxMwogICAgLy8gYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICBmcmFtZV9kaWcgMAogICAgcHVzaGludCAyNQogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUxMi01MTMKICAgIC8vIGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfTUQpCiAgICAvLyBhbmQgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IgPiBVSW50NjQoMCkKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX2ZhbHNlQDQxCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF90cnVlQDQwOgogICAgaW50Y18xIC8vIDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX21lcmdlQDQyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTE1CiAgICAvLyBpZiBpc19yZWRlbXB0aW9uX2V2ZW50OgogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANDcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUxNgogICAgLy8gaWYgc2tpcF9maXJzdF9yZWRlbXB0aW9uOgogICAgZnJhbWVfZGlnIDcKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlANDUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUxNwogICAgLy8gc2tpcF9maXJzdF9yZWRlbXB0aW9uID0gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDcKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDQ3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTI0CiAgICAvLyBmdXR1cmVfZXZlbnRfaWQgKz0gVUludDY0KDEpCiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMwogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfd2hpbGVfdG9wQDM2CgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDQ1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTIxCiAgICAvLyBmdXR1cmVfZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIGZyYW1lX2RpZyAwCiAgICBwdXNoaW50IDI1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTE5LTUyMgogICAgLy8gZGlzY291bnRfZmFjdG9yID0gc2VsZi5fZGlzY291bnRfYW5udWl0eV9mYWN0b3IoCiAgICAvLyAgICAgZGlzY291bnRfZmFjdG9yLAogICAgLy8gICAgIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDIKICAgIHN3YXAKICAgIGNhbGxzdWIgX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTIzCiAgICAvLyBkZW5vbWluYXRvciArPSBkaXNjb3VudF9mYWN0b3IKICAgIGZyYW1lX2RpZyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANDcKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX2ZhbHNlQDQxOgogICAgaW50Y18wIC8vIDAKICAgIGIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfbWVyZ2VANDIKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl93aGlsZUA0ODoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUyNgogICAgLy8gYXNzZXJ0IGRlbm9taW5hdG9yID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGZyYW1lX2RpZyAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjcKICAgIC8vIG51bWVyYXRvciA9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUyOAogICAgLy8gaWYgZW50cnkuZmxhZ3MgJiBVSW50NjQoZW51bXMuRkxBR19JTklUSUFMX1BSRikgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDU3CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18yIC8vIDgKICAgICYKICAgIGJueiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1MAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTI5LTUzMAogICAgLy8gIyBTdWJzZXF1ZW50IFBSRiBldmVudHMgYW1vcnRpemUgYm90aCBwcmluY2lwYWwgYW5kIGFscmVhZHkgYWNjcnVlZCBjYXJyeS4KICAgIC8vIG51bWVyYXRvciArPSBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICArCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1MDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUzMwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUzMS01MzUKICAgIC8vIHJldHVybiBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBudW1lcmF0b3IsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICAgICBkZW5vbWluYXRvciwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAxCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjkwCiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBzZWxmLl9yZWNhbGN1bGF0ZV9hbm51aXR5X3BheW1lbnQoCiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY5MC02OTIKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IHNlbGYuX3JlY2FsY3VsYXRlX2FubnVpdHlfcGF5bWVudCgKICAgIC8vICAgICBlbnRyeQogICAgLy8gKQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDMwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njk1CiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OTYtNzAwCiAgICAvLyBzZWxmLl9lbWl0X2V4ZWN1dGlvbl9ldmVudCgKICAgIC8vICAgICBlbnRyeT1lbnRyeSwKICAgIC8vICAgICBwYXlvZmY9VUludDY0KDApLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njk4CiAgICAvLyBwYXlvZmY9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY5OQogICAgLy8gc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OTYtNzAwCiAgICAvLyBzZWxmLl9lbWl0X2V4ZWN1dGlvbl9ldmVudCgKICAgIC8vICAgICBlbnRyeT1lbnRyeSwKICAgIC8vICAgICBwYXlvZmY9VUludDY0KDApLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGNhbGxzdWIgX2VtaXRfZXhlY3V0aW9uX2V2ZW50CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfYnVyeSAxCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAyOToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY5NAogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gZW50cnkubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDQxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAzMAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAyMDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY3NwogICAgLy8gZWxpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfSVBDQik6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgMTgKICAgID09CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAyMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc4LTY3OQogICAgLy8gIyBJUENCIGtlZXBzIHByaW5jaXBhbCB1bmNoYW5nZWQgYW5kIG9ubHkgcmVzZXRzIHRoZSBpbnRlcmVzdCBiYXNlLgogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDIzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDEwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY1CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9SUkYpOgogICAgZnJhbWVfZGlnIDEwCiAgICBwdXNoaW50IDExCiAgICA9PQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAxNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY2CiAgICAvLyBuZXh0X3JhdGUgPSBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZQogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2NwogICAgLy8gaWYgbmV4dF9yYXRlID09IFVJbnQ2NCgwKToKICAgIGJueiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAxMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY4CiAgICAvLyBuZXh0X3JhdGUgPSBzZWxmLnJhdGVfcmVzZXRfbmV4dAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDM3IC8vICJyYXRlX3Jlc2V0X25leHQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSA1CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X25leHQgZXhpc3RzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2OQogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPSBuZXh0X3JhdGUKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGZyYW1lX2RpZyA1CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAxOAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAxNDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY3MQogICAgLy8gaWYgZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUgIT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDkKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzIKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGZyYW1lX2RpZyA5CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAxOAoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbWl0X2V4ZWN1dGlvbl9ldmVudChlbnRyeTogYnl0ZXMsIHBheW9mZjogdWludDY0LCBzZXR0bGVkX2Ftb3VudDogdWludDY0KSAtPiBieXRlczoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzA2LTcxMgogICAgLy8gZGVmIF9lbWl0X2V4ZWN1dGlvbl9ldmVudCgKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgICosCiAgICAvLyAgICAgZW50cnk6IHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5LAogICAgLy8gICAgIHBheW9mZjogVUludDY0LAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50OiBVSW50NjQsCiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAzIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxNgogICAgLy8gY29udHJhY3RfaWQ9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25faWQuaWQsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uSUQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxNwogICAgLy8gZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE4CiAgICAvLyBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICBmcmFtZV9kaWcgLTMKICAgIGV4dHJhY3QgOCAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTkKICAgIC8vIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgZnJhbWVfZGlnIC0zCiAgICBleHRyYWN0IDkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIwCiAgICAvLyBhcHBsaWVkX2F0PUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIzCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBmcmFtZV9kaWcgLTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxOAogICAgLy8gZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgaW50Y18yIC8vIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcyMwogICAgLy8gc2VsZi5fcGF5b2ZmX3NpZ24oZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSwgcGF5b2ZmKQogICAgZ2V0Ynl0ZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzUyCiAgICAvLyBpZiBwYXlvZmYgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0yCiAgICBibnogX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzUzCiAgICAvLyByZXR1cm4gVUludDY0KGVudW1zLlBBWU9GRl9TSUdOX1BPU0lUSVZFKQogICAgaW50Y18xIC8vIDEKCl9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9wYXlvZmZfc2lnbkA3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIyLTcyNAogICAgLy8gcGF5b2ZmX3NpZ249YXJjNC5VSW50OCgKICAgIC8vICAgICBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICAvLyApLAogICAgaXRvYgogICAgZHVwCiAgICBiaXRsZW4KICAgIGludGNfMiAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBleHRyYWN0IDcgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzI2CiAgICAvLyBjdXJyZW5jeV9pZD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcyNwogICAgLy8gc2VxdWVuY2U9ZW50cnkuZXZlbnRfaWQgKyBVSW50NjQoMSksCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE1LTcyOAogICAgLy8gRXhlY3V0aW9uRXZlbnQoCiAgICAvLyAgICAgY29udHJhY3RfaWQ9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25faWQuaWQsCiAgICAvLyAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgcGF5b2ZmPXBheW9mZiwKICAgIC8vICAgICBwYXlvZmZfc2lnbj1hcmM0LlVJbnQ4KAogICAgLy8gICAgICAgICBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBzZXR0bGVkX2Ftb3VudD1zZXR0bGVkX2Ftb3VudCwKICAgIC8vICAgICBjdXJyZW5jeV9pZD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgc2VxdWVuY2U9ZW50cnkuZXZlbnRfaWQgKyBVSW50NjQoMSksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMAogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAyCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAzCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyA0CiAgICBpdG9iCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMgogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxNC03MjkKICAgIC8vIGFyYzQuZW1pdCgKICAgIC8vICAgICBFeGVjdXRpb25FdmVudCgKICAgIC8vICAgICAgICAgY29udHJhY3RfaWQ9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25faWQuaWQsCiAgICAvLyAgICAgICAgIGV2ZW50X2lkPWVudHJ5LmV2ZW50X2lkLAogICAgLy8gICAgICAgICBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICAvLyAgICAgICAgIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgICAgICBhcHBsaWVkX2F0PUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gICAgICAgICBwYXlvZmY9cGF5b2ZmLAogICAgLy8gICAgICAgICBwYXlvZmZfc2lnbj1hcmM0LlVJbnQ4KAogICAgLy8gICAgICAgICAgICAgc2VsZi5fcGF5b2ZmX3NpZ24oZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSwgcGF5b2ZmKQogICAgLy8gICAgICAgICApLAogICAgLy8gICAgICAgICBzZXR0bGVkX2Ftb3VudD1zZXR0bGVkX2Ftb3VudCwKICAgIC8vICAgICAgICAgY3VycmVuY3lfaWQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgICAgICBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIC8vICAgICApCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHg5YTMzMmI5NSAvLyBtZXRob2QgIkV4ZWN1dGlvbkV2ZW50KHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NTQKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gKFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwgVUludDY0KGVudW1zLkVWVF9QSSkpOgogICAgZnJhbWVfZGlnIDUKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYm56IF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9pZl9ib2R5QDUKICAgIGZyYW1lX2RpZyA1CiAgICBwdXNoaW50IDQKICAgID09CiAgICBieiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUA2CgpfZW1pdF9leGVjdXRpb25fZXZlbnRfaWZfYm9keUA1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzU1CiAgICAvLyByZXR1cm4gVUludDY0KGVudW1zLlBBWU9GRl9TSUdOX1BPU0lUSVZFKQogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcyMwogICAgLy8gc2VsZi5fcGF5b2ZmX3NpZ24oZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSwgcGF5b2ZmKQogICAgYiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fcGF5b2ZmX3NpZ25ANwoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc1NgogICAgLy8gcmV0dXJuIFVJbnQ2NChlbnVtcy5QQVlPRkZfU0lHTl9ORUdBVElWRSkKICAgIHB1c2hpbnQgMjU1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MjMKICAgIC8vIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIGIgX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX3BheW9mZl9zaWduQDcKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fcm9sZV9pc19hY3RpdmUocm9sZV9tYXA6IGJ5dGVzLCByb2xlX2FkZHJlc3M6IGJ5dGVzKSAtPiB1aW50NjQ6Cl9yb2xlX2lzX2FjdGl2ZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NwogICAgLy8gZGVmIF9yb2xlX2lzX2FjdGl2ZShzZWxmLCByb2xlX21hcDogdHlwLlJiYWNSb2xlLCByb2xlX2FkZHJlc3M6IEFjY291bnQpIC0+IGJvb2w6CiAgICBwcm90byAyIDEKICAgIHB1c2hieXRlcyAiIgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU4LTYyCiAgICAvLyByZXR1cm4gc2VsZi5faGFzX3JvbGUocm9sZV9tYXAsIHJvbGVfYWRkcmVzcykgYW5kICgKICAgIC8vICAgICByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICkKICAgIGJ6IF9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIEJveE1hcCBlbnRyeSBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYwCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MAogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgPD0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYxCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIEJveE1hcCBlbnRyeSBleGlzdHMKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYwLTYxCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDAKICAgID49CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTktNjEKICAgIC8vIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IF9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQKICAgIGludGNfMSAvLyAxCgpfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU4LTYyCiAgICAvLyByZXR1cm4gc2VsZi5faGFzX3JvbGUocm9sZV9tYXAsIHJvbGVfYWRkcmVzcykgYW5kICgKICAgIC8vICAgICByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICkKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgX3JvbGVfaXNfYWN0aXZlX2Jvb2xfbWVyZ2VANQoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkgLT4gdm9pZDoKX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjUKICAgIC8vIGFzc2VydCBzZWxmLl9pc19hcnJhbmdlcihUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjUyCiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzID09IHNlbGYuYXJyYW5nZXIudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOCAvLyAweDUyM2E0MTUyNTIyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgPT0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2NQogICAgLy8gYXNzZXJ0IHNlbGYuX2lzX2FycmFuZ2VyKFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpIC0+IHZvaWQ6Cl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4MwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFzc2V0X2RlZmF1bHRlZCwgZXJyLkRFRkFVTFRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQxIC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfZGVmYXVsdGVkIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIERlZmF1bHRlZAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkgLT4gdm9pZDoKX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg2CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYXNzZXRfc3VzcGVuZGVkLCBlcnIuU1VTUEVOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzMgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9zdXNwZW5kZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gU3VzcGVuZGVkIG9wZXJhdGlvbnMKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkOiB1aW50NjQpIC0+IHZvaWQ6Cl9hc3NlcnRfdmFsaWRfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OAogICAgLy8gZGVmIF9hc3NlcnRfdmFsaWRfcm9sZShzZWxmLCByb2xlX2lkOiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTAKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIHB1c2hpbnQgMjAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkxCiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgcHVzaGludCAyNQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTIKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICBwdXNoaW50IDQwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MwogICAgLy8gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgcHVzaGludCA1MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTQKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgcHVzaGludCA2MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTUKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICBwdXNoaW50IDcwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NgogICAgLy8gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgcHVzaGludCA4MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfZmFsc2VAOAoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3OgogICAgaW50Y18xIC8vIDEKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX21lcmdlQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgcmV0c3ViCgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9mYWxzZUA4OgogICAgaW50Y18wIC8vIDAKICAgIGIgX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfbWVyZ2VAOQo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="}, "sourceInfo": {"approval": {"pcOffsetMethod": "none", "sourceInfo": [{"pc": [2669], "errorMessage": "ACTUS event not yet executed"}, {"pc": [2427], "errorMessage": "Can not distribute zero units"}, {"pc": [3170, 3177, 3550], "errorMessage": "D-ASA already configured"}, {"pc": [1276, 2008, 2387, 2533, 3767, 3913, 4264, 4526, 4672], "errorMessage": "D-ASA not configured"}, {"pc": [3561], "errorMessage": "D-ASA terms not configured"}, {"pc": [6861], "errorMessage": "Defaulted"}, {"pc": [3188], "errorMessage": "Denomination asset is not properly set"}, {"pc": [3203], "errorMessage": "Different settlement asset not supported, must be equal to denomination asset"}, {"pc": [3439, 3446, 3448], "errorMessage": "IED must be set in the future"}, {"pc": [1294, 2077, 2548, 4282, 6213], "errorMessage": "IED not yet executed"}, {"pc": [2440, 5596], "errorMessage": "Insufficient remaining D-ASA units"}, {"pc": [2643, 2709], "errorMessage": "Insufficient sender units to transfer"}, {"pc": [1904, 3090, 3108, 3164, 3641, 3677, 4329, 5780, 6058, 6118, 6521], "errorMessage": "Invalid ACTUS configuration"}, {"pc": [2017, 2421, 2604, 2619, 2776, 2849, 2912, 2954, 5408, 5533], "errorMessage": "Invalid account holding address"}, {"pc": [4863, 4887, 4911, 4935, 4959, 5016, 5044, 5066, 5088, 5110, 5289, 5307, 5322, 5337, 5352], "errorMessage": "Invalid account role address"}, {"pc": [3150], "errorMessage": "Invalid day-count convention ID"}, {"pc": [1407, 3788, 4116, 6090], "errorMessage": "Invalid event cursor"}, {"pc": [3626, 3689, 3965, 4306, 5696], "errorMessage": "Invalid event id"}, {"pc": [3801, 4180, 4187, 4319], "errorMessage": "Invalid event type"}, {"pc": [5000, 5279, 6931], "errorMessage": "Invalid role identifier"}, {"pc": [3555, 3701, 3709, 4018, 4393, 5711, 5727], "errorMessage": "Invalid schedule page"}, {"pc": [5644], "errorMessage": "No D-ASA units"}, {"pc": [1413, 1933, 2114, 6099], "errorMessage": "No due cashflow to pay"}, {"pc": [6182], "errorMessage": "Not IED event"}, {"pc": [2062, 2395, 2591, 2766, 2822, 2832, 2918, 4215, 4507, 5133, 6853], "errorMessage": "Not authorized"}, {"pc": [1534, 1542, 2163, 2237, 2246], "errorMessage": "Not enough funds for the payment"}, {"pc": [3938, 3951, 4291], "errorMessage": "Observed event required to execute this action"}, {"pc": [2409, 2457], "errorMessage": "Primary distribution is closed"}, {"pc": [6130], "errorMessage": "Primary distribution is not complete"}, {"pc": [2632], "errorMessage": "Sender and receiver must be different"}, {"pc": [5394, 6869], "errorMessage": "Suspended operations"}, {"pc": [2344, 3667, 4351], "errorMessage": "Time events must be sorted in strictly ascending order"}, {"pc": [2565, 2582], "errorMessage": "Transfer is closed"}, {"pc": [2636], "errorMessage": "Transfer units must be greater than zero"}, {"pc": [953], "errorMessage": "Wrong Global Bytes allocation"}, {"pc": [959], "errorMessage": "Wrong Global UInts allocation"}, {"pc": [963], "errorMessage": "Wrong Local Bytes allocation"}, {"pc": [967], "errorMessage": "Wrong Local UInts allocation"}, {"pc": [1515, 2156], "errorMessage": "account opted into asset"}, {"pc": [6813, 6828], "errorMessage": "check BoxMap entry exists"}, {"pc": [2053, 2091, 2132, 2170, 2461, 2639, 2698, 2724, 5388, 5554], "errorMessage": "check self.account entry exists"}, {"pc": [1596, 1828, 1916, 4583, 6218, 6541], "errorMessage": "check self.accrued_interest exists"}, {"pc": [5151, 6851], "errorMessage": "check self.arranger exists"}, {"pc": [6859], "errorMessage": "check self.asset_defaulted exists"}, {"pc": [6867], "errorMessage": "check self.asset_suspended exists"}, {"pc": [3098, 3544, 3934, 3946, 4287, 4531, 5942], "errorMessage": "check self.contract_type exists"}, {"pc": [1564, 4588, 5416, 5494], "errorMessage": "check self.cumulative_interest_index exists"}, {"pc": [1576, 4593, 5427, 5502], "errorMessage": "check self.cumulative_principal_index exists"}, {"pc": [5952], "errorMessage": "check self.dynamic_principal_redemption exists"}, {"pc": [1332, 1344, 1405, 1647, 2647, 2659, 3780, 4109, 4559, 4676, 4688, 4725, 5509, 6088, 6170, 6367, 6422, 6560], "errorMessage": "check self.event_cursor exists"}, {"pc": [5442, 5456, 5649, 5678, 6008, 6016, 6043, 6063, 6253, 6386, 6547], "errorMessage": "check self.fixed_point_scale exists"}, {"pc": [6296], "errorMessage": "check self.has_rate_reset_cap exists"}, {"pc": [6269], "errorMessage": "check self.has_rate_reset_floor exists"}, {"pc": [3175, 3560, 4555, 6187], "errorMessage": "check self.initial_exchange_amount exists"}, {"pc": [2445, 2455], "errorMessage": "check self.initial_exchange_date exists"}, {"pc": [1772, 4573, 5984, 5998], "errorMessage": "check self.interest_calculation_base exists"}, {"pc": [1844, 1859], "errorMessage": "check self.next_principal_redemption exists"}, {"pc": [4578, 5976, 6003, 6048], "errorMessage": "check self.nominal_interest_rate exists"}, {"pc": [2022, 2035], "errorMessage": "check self.op_daemon exists"}, {"pc": [1669, 1738, 1764, 1818, 1870, 1879, 1901, 4568, 6526, 6607], "errorMessage": "check self.outstanding_principal exists"}, {"pc": [6304, 6318], "errorMessage": "check self.rate_reset_cap exists"}, {"pc": [6277, 6291], "errorMessage": "check self.rate_reset_floor exists"}, {"pc": [6248], "errorMessage": "check self.rate_reset_multiplier exists"}, {"pc": [6641], "errorMessage": "check self.rate_reset_next exists"}, {"pc": [6261], "errorMessage": "check self.rate_reset_spread exists"}, {"pc": [1520, 2232, 4598], "errorMessage": "check self.reserved_interest exists"}, {"pc": [1525, 1554, 2242, 2257, 4603], "errorMessage": "check self.reserved_principal exists"}, {"pc": [2432, 2480, 4550, 5591, 6123], "errorMessage": "check self.reserved_units_total exists"}, {"pc": [1336, 2651, 3784, 3963, 3980, 4100, 4301, 4336, 4355, 4475, 4563, 4680, 5692, 6363, 6430], "errorMessage": "check self.schedule_entry_count exists"}, {"pc": [4008, 4383], "errorMessage": "check self.schedule_page entry exists"}, {"pc": [1512, 2122, 2150, 6713], "errorMessage": "check self.settlement_asset_id exists"}, {"pc": [1275, 1289, 2007, 2072, 2386, 2405, 2532, 2543, 2826, 3168, 3548, 3766, 3912, 4263, 4277, 4524, 4671, 5537, 6114, 6208], "errorMessage": "check self.status exists"}, {"pc": [2438, 2491, 4545, 5642, 5673, 6128], "errorMessage": "check self.total_units exists"}, {"pc": [2570, 2580], "errorMessage": "check self.transfer_closure_date exists"}, {"pc": [2553, 2561], "errorMessage": "check self.transfer_opening_date exists"}, {"pc": [3603, 3660], "errorMessage": "index access is out of bounds"}, {"pc": [1991, 3035, 3518, 4013, 4388], "errorMessage": "invalid array length header"}, {"pc": [2756, 3506, 4497, 5123], "errorMessage": "invalid number of bytes for arc4.bool"}, {"pc": [1999], "errorMessage": "invalid number of bytes for arc4.dynamic_array"}, {"pc": [3533], "errorMessage": "invalid number of bytes for arc4.dynamic_array"}, {"pc": [1985, 2370, 2510, 2518, 2748, 2806, 2814, 2894, 2902, 2945, 2970, 4744, 4768, 4802, 4983, 5165, 5249], "errorMessage": "invalid number of bytes for arc4.static_array"}, {"pc": [1270, 2328, 2337, 2378, 2527, 3496, 3897], "errorMessage": "invalid number of bytes for arc4.uint64"}, {"pc": [4792, 4973, 5239], "errorMessage": "invalid number of bytes for arc4.uint8"}, {"pc": [3007], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.InitialKernelState"}, {"pc": [2996], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.NormalizedActusTerms"}, {"pc": [4259], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.ObservedCashEventRequest"}, {"pc": [3908], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.ObservedEventRequest"}, {"pc": [3040], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.Prospectus"}, {"pc": [4813], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.RoleValidity"}, {"pc": [3024], "errorMessage": "invalid tail pointer at index 1 of (uint8[32],(len+utf8[]))"}, {"pc": [3019], "errorMessage": "invalid tuple encoding"}, {"pc": [4080, 4455], "errorMessage": "max array length exceeded"}, {"pc": [4537, 6705], "errorMessage": "overflow"}]}, "clear": {"pcOffsetMethod": "none", "sourceInfo": []}}, "templateVariables": {}}""" APP_SPEC = algokit_utils.Arc56Contract.from_json(_APP_SPEC_JSON) def _parse_abi_args(args: object | None = None) -> list[object] | None: From 8527e9a085e34adb32512e03a7c908f0f7b5f50d Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 16:28:55 +0100 Subject: [PATCH 173/244] chore: move contract defaulted to rbac module --- modules/actus_kernel.py | 19 ------------------- modules/rbac.py | 32 +++++++++++++++++++++++++------- 2 files changed, 25 insertions(+), 26 deletions(-) diff --git a/modules/actus_kernel.py b/modules/actus_kernel.py index 95f60355..df6a611c 100644 --- a/modules/actus_kernel.py +++ b/modules/actus_kernel.py @@ -115,9 +115,6 @@ def __init__(self) -> None: self.event_cursor = UInt64() self.schedule_entry_count = UInt64() - # Performance - self.defaulted = False - # Scaling self.fixed_point_scale = UInt64() @@ -1262,22 +1259,6 @@ def append_observed_cash_event( self._append_observed_cash_event(payload) return Global.latest_timestamp - @arc4.abimethod - def contract_set_default_status(self, *, defaulted: bool) -> UInt64: - """ - Set D-ASA default status - - Args: - defaulted: Default status - - Raises: - UNAUTHORIZED: Not authorized - """ - - self._assert_caller_is_trustee() - self.defaulted = defaulted - return Global.latest_timestamp - @arc4.abimethod(readonly=True) def contract_get_state(self) -> typ.KernelState: """ diff --git a/modules/rbac.py b/modules/rbac.py index 3936824f..740a5091 100644 --- a/modules/rbac.py +++ b/modules/rbac.py @@ -44,9 +44,11 @@ def __init__(self) -> None: Account, typ.RoleValidity, key_prefix=cst.PREFIX_ID_OBSERVER ) - # D-ASA Governance - self.asset_suspended = False - self.asset_defaulted = False + # Contract Governance + self.contract_suspended = False + + # Contract Performance + self.defaulted = False def _is_arranger(self, role_address: Account) -> bool: return role_address == self.arranger.value @@ -80,10 +82,10 @@ def _assert_caller_is_observer(self) -> None: assert self._role_is_active(self.observer, Txn.sender), err.UNAUTHORIZED def _assert_is_not_asset_defaulted(self) -> None: - assert not self.asset_defaulted, err.DEFAULTED + assert not self.defaulted, err.DEFAULTED def _assert_is_not_asset_suspended(self) -> None: - assert not self.asset_suspended, err.SUSPENDED + assert not self.contract_suspended, err.SUSPENDED def _assert_valid_role(self, role_id: UInt64) -> None: assert role_id in ( @@ -250,7 +252,7 @@ def rbac_revoke_role(self, *, role_id: arc4.UInt8, role_address: Account) -> UIn self._delete_role(role_id.as_uint64(), role_address) return Global.latest_timestamp - @arc4.abimethod # TODO: Update specs and add test + @arc4.abimethod def rbac_contract_suspension(self, *, suspended: bool) -> UInt64: """ Set the asset-wide suspension status. @@ -266,7 +268,23 @@ def rbac_contract_suspension(self, *, suspended: bool) -> UInt64: """ self._assert_caller_is_authority() - self.asset_suspended = suspended + self.contract_suspended = suspended + return Global.latest_timestamp + + @arc4.abimethod + def rbac_contract_default(self, *, defaulted: bool) -> UInt64: + """ + Set D-ASA default status + + Args: + defaulted: Default status + + Raises: + UNAUTHORIZED: Not authorized + """ + + self._assert_caller_is_trustee() + self.defaulted = defaulted return Global.latest_timestamp @arc4.abimethod(readonly=True) From f51c7eca029720a700b1a77fc66c97ffc31596ea Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 16:29:12 +0100 Subject: [PATCH 174/244] chore: build artifacts --- .../artifacts/d_asa/DASA.approval.puya.map | 8626 ++++++++--------- .../artifacts/d_asa/DASA.approval.teal | 1613 ++- .../MockRbacModule.approval.puya.map | 1384 +-- .../MockRbacModule.approval.teal | 402 +- .../MockRbacModule.arc56.json | 113 +- .../mock_rbac_module_client.py | 114 +- src/artifacts/DASA.arc56.json | 771 +- src/artifacts/dasa_client.py | 219 +- 8 files changed, 6788 insertions(+), 6454 deletions(-) diff --git a/smart_contracts/artifacts/d_asa/DASA.approval.puya.map b/smart_contracts/artifacts/d_asa/DASA.approval.puya.map index 6b831bd3..55881272 100644 --- a/smart_contracts/artifacts/d_asa/DASA.approval.puya.map +++ b/smart_contracts/artifacts/d_asa/DASA.approval.puya.map @@ -8,7 +8,7 @@ "../../../modules/transfer_agent.py", "../../d_asa/contract.py" ], - "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AG4BmD;;AAAf;;AAA5B;AAC4C;;AAAf;;AAA7B;AAkBA;;AAAuB;AAAvB;AACA;;AAAuB;AAAvB;AFQA;AAAc;AAAd;AACA;;AAAqB;AAArB;AAGA;;AAAuB;;AAAvB;AACA;;AAAsB;;AAAtB;AAGA;;AAA6B;AAA7B;AACA;;AAA2B;AAA3B;AAGA;;AAA6B;AAA7B;AACA;;AAAqB;AAArB;AACA;;AAA6B;AAA7B;AACA;;AAA6B;AAA7B;AAGA;;AAA4B;AAA5B;AAGA;;AAAmB;AAAnB;AACA;;AAA4B;AAA5B;AAGA;;AAA+B;AAA/B;AACA;;AAA6B;AAA7B;AACA;;AAAiC;AAAjC;AACA;;AAAoC;AAApC;AAGA;;AAAiC;AAAjC;AACA;;AAAwB;AAAxB;AAGA;;AAA6B;AAA7B;AACA;;AAAyB;AAAzB;AACA;;AAA6B;AAA7B;AACA;;AAAwB;AAAxB;AACA;;AAAsB;AAAtB;AACA;;AAAuB;AAAvB;AACA;;AAA4B;AAA5B;AACA;;AAA0B;AAA1B;AAGA;;AAA0B;AAA1B;AACA;;AAAyB;AAAzB;AAGA;;AAAiC;AAAjC;AACA;;AAAkC;AAAlC;AAQA;AAAoB;AAApB;AACA;AAA4B;AAA5B;AAGA;;AAAiB;AAAjB;AAGA;;AAAyB;AAAzB;AInGO;;AAA6B;;AAA7B;AAAP;AACO;;AAAuB;;AAAvB;AAAP;AACO;;AAAA;AAAP;AACO;;AAAA;AAAP;AAlBR;;;;;;AAAA;;;AAAA;;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;;;;;;AAAA;;;AAAA;;;;AAAA;AF4IK;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ADrGA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ADmGU;AAAA;AAAA;AAAA;AAAP;AC9EA;;;AACA;;;AACA;;;ADoEO;AAAA;AAAA;AAAA;AAAe;;AAAf;AAYA;AAAP;AC9EG;;;AAAX;;;AAIsB;AACA;;AADA;AADF;;AAAA;AAFR;AAAA;;;AAQe;AAAnB;;AACkB;AAAlB;;AACmB;AAAnB;;AAGI;;AAAA;;AAAA;AAAA;;;AACI;AAAA;AAAA;AAAA;AAAoB;AAAA;AAAA;AAAA;AAApB;AADJ;;;AAGiC;AAAA;AAAA;AAAA;AAAzB;;;AAAA;AAAA;;AACL;;AAAA;AAAA;AAAA;;AAAuB;;AAAvB;AAAf;;;AAEuC;;AAAA;AAAA;AAAA;AAAA;;ADsQ3B;AADG;AAAA;AAAA;;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;;ACrQA;;;AD2cA;;AAAA;AAAA;AAAkB;AAAA;AAAA;AAAA;AAAlB;AAAP;AACO;;AAAwB;;AAAxB;AAAP;AAxIG;;AAAA;;;AAAA;;AAAyC;;AAAzC;AAAA;;;AACQ;;;AAYE;;AAAA;AAAA;AAAA;AAAA;;AACS;;AAAnB;AAAA;;;AAAA;;AAAyC;;AAAzC;AAAA;;;AACQ;;;AA6HkB;;AAAA;;AAAA;AAAA;;AAG1B;;;AAAX;;;;;;;AAkB+B;;AAAA;;;AACC;;AAAA;;;AACN;;AAAA;;;AAAA;AAAA;;AAAA;;AACC;AAAA;;;AAAA;AAAA;;AACD;;AAAA;;AAAA;AAAA;AAAA;;AA4JyB;;AAAjC;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAtRH;AAAA;;AAAA;AAAA;AAAyB;AAAA;;AAAA;AAAA;AAAzB;;AAAA;AAwRA;;AAAA;;AAAA;AAAP;AACO;;AAAA;AAAA;AA7JH;;AAAA;AADJ;AAIA;;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AACG;;AAAA;AAAA;AAAgC;;AAAhC;AAAX;;;AAEY;AAAA;;AAAA;AAAA;AAAyB;;AAAA;;;AAAA;;AAAzB;AAAA;;AAAA;AAAA;AAGG;;;AAAJ;;;AAAkC;;AAAA;AAAA;AAAgC;;AAAhC;AAAlC;;;AAGkC;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;AACJ;;AAAA;;AAAA;AACA;;AAAA;;AAAA;AACA;AAAA;AAAA;AAAA;AAAqB;AAArB;AAAA;AAAA;AAAA;AAEG;;AAAA;;;AAAoB;;;AAApB;AAAA;;;AAEG;AAAA;;AAAA;AAAA;AAFH;;;AAGC;AAAc;;;AAAd;AACA;;AAAiC;AAAjC;AAEJ;;AAAA;;AAAA;AAAA;;;AAAA;ACjgBI;;AAAA;;AAAA;AAAA;;AACA;;AAAA;;AAAA;AAAA;;AACA;;AAAoB;AAApB;AAAA;;;;;ADgfA;;AAAwB;AAAxB;;;;AAlCa;;AAAA;AAAA;AAAA;AAAA;;AAGI;;AAAd;AAAf;;;AAEoB;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;;;;;;AAGH;;AAAc;AAAd;AAAjB;;;AAC6C;AAAA;;AAAA;AAAA;AAAA;;AAAA;AACR;AAAA;;AAAA;AAAA;AAAA;;AAAA;;;;AACpB;;AAAc;;AAAd;AAAjB;;;;;;;AAAA;;;AAC6C;AAA7B;;AACqB;AAArB;;;;;AA7IL;;;AAAX;;;AACe;;AAAc;;AAAd;AAAf;;;AACuB;AAAA;;AAAA;AAAA;;;AAyHQ;;;AAxHJ;AAAA;;AAAA;AAAA;AAAwB;;AAAA;;;AAAA;;AAAxB;AAAA;AAAA;;AACZ;AAAA;;AAAA;AAAA;AAAA;AAAf;;;AACuB;;;AAsHQ;;;AArHA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AACG;AAAA;;AAAA;AAAA;AAAnB;AAAf;;;AACuB;AAAA;;AAAA;AAAA;;;AAmHQ;;;;;;;AAAA;;;AAhHnB;;AAAA;;AAAA;AAAoC;AAAA;;AAAA;AAAA;AAApC;AAAA;AADJ;AAGO;AAAA;;;AA8GgB;;;AAzIhB;AAAA;;AAAA;AAAA;AAAwB;;AAAA;;;AAAA;;AAAxB;;;AAwIe;;;ACtctB;;AAAA;AAAA;AAIiB;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAEH;;AALP;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAtDV;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;;;AA8DA;;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;ADqCU;AAAA;AAAA;AAAA;AAAP;AD1H0B;;AAAnB;AAAA;AAAA;AAAA;AAAA;;AAAP;AETG;AAAA;;AAAA;AAAA;AAAwB;;AAAxB;AAAX;;;AAEgB;;AAAc;AAAA;;AAAA;AAAA;AAAd;AAAA;;;AACG;;AAAA;;AAAA;AADH;;;AAEG;;AAAc;;AAAA;AAAA;AAAA;;;AAAd;AAFH;;;;AADJ;AA2HJ;;;AACA;;;ADFO;AAAA;AAAA;AAAA;AAAe;;AAAf;AAYA;AAAP;ACPA;;AAAA;AAAA;;;AACA;;;;;AF3BI;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AACE;AAAA;;AAAA;AAAA;AAAA;;AADF;;AAAA;AAAA;AAAA;;AE6BJ;AAzHI;;;AACI;AAAA;;AAAA;AAAA;AADJ;;AAAA;;AAAA;;;AAGQ;AAAA;AAAA;AAAA;;;AAAA;AAAJ;;;;AA2HhB;;;AArH6C;;AAAjC;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AADJ;AAwHc;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAjHd;AAIQ;;;;;;;;;;;;;AAJR;;;;;;AAAA;AFsFkB;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AACC;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAGW;AAA9B;AAAA;AAAA;;AAAA;;AACA;AAAA;;AACA;;AAAA;AAAA;AAEO;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACO;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAP;AAGA;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AEoBiB;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AACH;;AAJP;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;;;;AAAA;AAAA;AAAA;AA/CV;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;;;AEvFA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBG;;;AACO;AAAA;AAAP;AAEA;;AAAA;;AAAA;AACA;;AAAA;AAAA;AACO;;AAvBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAyBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AHmGU;AAAA;AAAA;AAAA;AAAP;AE3E4B;;AAAqB;;AAA1C;;;AAAP;ACKA;;;AACA;;;AH6DO;AAAA;AAAA;AAAA;AAAe;;AAAf;AG5DP;AJtD0B;;AAAnB;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAP;AIwDA;AAAA;;;AACA;AAAA;AAEI;AAAA;;AAAA;AAAA;AAAA;AAAqC;AAAA;;AAAA;AAAA;AAArC;AADJ;AAGG;AAAA;;AAAA;AAAA;AAAX;;;AAEgB;;AAA2B;AAAA;;AAAA;AAAA;AAA3B;AADJ;AJ8DJ;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AIzDA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AACO;AAAA;;AAAA;AAAA;AAAA;AAAA;AA7CV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AA+CA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AHoDU;AAAA;AAAA;AAAA;AAAP;AGhBA;;;AACA;;;AHOO;AAAA;AAAA;AAAA;AAAe;;AAAf;AAYA;AAAP;AGzIG;AAAA;;AAAA;AAAA;AAAX;;;AAEgB;AAAA;;AAAA;AAAA;AAA8B;;AAA9B;AADJ;AAGD;AAAA;;AAAA;AAAA;AAAX;;;AAEgB;;AAA0B;AAAA;;AAAA;AAAA;AAA1B;AADJ;AAqHG;;AAAA;;AAAA;AAAA;;AAAA;AAAP;AJ/G0B;;AAAnB;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAP;AAA0B;;AAAnB;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAP;AIkHA;;AAAA;;;AACA;AAAA;;;AACO;;AAAA;AAAP;AACA;;AAAA;AAAA;AACgB;AAAA;AAAA;AAAA;AAAA;AAAT;AAAP;AHgnBG;AAAA;AAAA;AAAA;AAAqB;AAAA;AAAA;AAAA;AAArB;AAAX;;;AAE8C;AAAA;AAAA;AAAA;AAAzB;;;AAET;;AAAA;AAA4B;;AAA5B;AADJ;AGhnBA;;AAAA;AAAA;;;AACA;;AAAA;AAAA;;AAAA;;;AACA;;;;;AACA;;;;;AJIgB;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAT;;AAAA;AAAA;;AAAA;;AAAA;AAAP;AACA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AATA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AIlDH;AAAA;;AAAA;AAAA;AAAA;AAAA;AJuEA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AGxF+B;;AAAgB;;AAArC;;;AAAP;AHrD0B;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAiKA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AACO;;AArBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AGxH+B;;AAAsB;;AAA3C;;;AAAP;AF0EO;AAAA;AAAA;AAAA;AAAe;;;AAAf;ADoEA;AAAP;AACA;;;AACA;;;AAC8B;;AAAvB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AAnLU;AAFH;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAsLP;AACO;;AA3BV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA6BA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAjM6B;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAsNO;;AAAA;;AAAA;AAAP;AACA;;;AACA;;;AACA;AAAA;;AAAA;AACO;;AAzBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA5N6B;;AAAnB;AAAA;AAAA;AAAA;AAAA;;AAAP;AA2OO;AAAA;AAfV;AAAA;AAAA;AAAA;AAAA;AAAA;AC0wBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAcG;;AAAA;AAAA;AACO;;AAfV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;AAiBA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AA8BG;;;AAGqB;AAAA;AAAA;AAArB;;AAAA;;AAAA;AAn1BO;;;AAAA;AAEH;AAFG;AAAA;;;AAAA;AAGH;;AAHG;AAAA;;;AAAA;AAIH;;AAJG;AAAA;;;AAAA;AAKH;;AALG;AAAA;;;AAAA;AAMH;;AANG;AAAA;;;;AAWP;AA00B4B;AAAA;;AAAA;AAAA;AAAA;;AAAA;AA1uBrB;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAP;AAEI;;AAAA;AAAA;AAAA;;AA9BG;;;AAAA;;AAEH;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;;AAYP;AAoBG;AAAiB;AAAjB;AAAX;;;AACuB;;AAAA;;;AAAA;AAAJ;AAAP;AA6dG;AAAA;AAAA;AAAA;AAAA;AAAP;AACO;AAAA;;AAAA;AAAA;AAAA;AAAP;AAGgC;;AAAA;AAAA;AAAA;AAnCb;AAAA;;AAAA;;AACnB;AAGA;;AAAA;;AAAA;AAmC8B;;AAAA;;AAAA;AA9B1B;AAAA;;AAAA;AADJ;AAKA;;AAAA;;AAAA;AAEA;AAIQ;;AAFW;;AACF;;;;;;;;AAHjB;;;;;;AAAA;AA4BmB;AAAA;;AAAA;AAAnB;;AAAA;AAAA;AACA;;AAA4B;AAA5B;AAGA;;AAAA;;AAAA;AAG6B;AAAA;;AAAA;AAA7B;;AAAA;;AAAA;AACqB;;AAAA;;AAAA;AAArB;;AAAA;;AAAA;AACiC;;AAAA;AAAA;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;AAGA;;AAAA;;AAAA;AACoC;;AAAA;;;AAAA;AAApC;;AAAA;AAAA;AAC6B;;AAAA;;AAAA;AAA7B;;AAAA;AAAA;AAGwB;;AAAA;;AAAA;AAAxB;;AAAA;AAAA;AAG6B;;AAAA;AAAA;AAA7B;;AAAA;AAAA;AACiC;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;AACyB;;AAAA;;AAAA;AAAzB;;AAAA;AAAA;AAC6B;;AAAA;;AAAA;AAA7B;;AAAA;AAAA;AACwB;;AAAA;;AAAA;AAAxB;;AAAA;AAAA;AACsB;;AAAA;;AAAA;AAAtB;;AAAA;AAAA;AACuB;;AAAA;;AAAA;AAAvB;;AAAA;AAAA;AAC4B;;AAAA;;;AAAA;AAA5B;;AAAA;AAAA;AAC0B;;AAAA;;;AAAA;AAA1B;;AAAA;AAAA;AAGyB;;AAAA;;AAAA;AAAzB;;AAAA;AAAA;AAGoB;;AAAA;AAAA;AAApB;AAAA;AAAA;AAGiC;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;AACkC;;AAAA;;AAAA;AAAlC;;AAAA;AAAA;AAGA;;AAAyB;AAAzB;AACA;;AAA0B;AAA1B;AAEO;;AAA8B;;AAA9B;AAAP;AACqC;AAAA;AAAA;AAA9B;;AAAA;AAAP;AACO;AAAP;AAiNuB;;AAAA;;;AAAvB;;AAAA;AAAA;AACsB;;AAAA;;;AAAtB;;AAAA;AAAA;AACO;;AAxCV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;;;;;;;;AA0CA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAgCG;;;AAGkB;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAxOX;AAAA;AAAA;AAAA;AAAA;AAAP;AACO;AAAwB;;AAAxB;AAAP;AAGO;AAAA;;AAAA;AAAA;AAAP;AAEc;AAAsB;;AAAtB;AAAA;AAOU;;AAAd;AADF;;AAAA;AAFR;AAAA;;;AAMQ;AACF;AAAA;;AAAA;AAAd;;;AACoB;;AAAA;;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AACW;AADX;AACW;AAAA;AAAA;;AAAA;;AACZ;AAAA;AAAA;AAAA;AAAA;;AAAkB;;AAAA;;AAAA;AAAlB;;AAAA;AAAP;AACA;;AAAA;;AAAA;;;AAGO;AAAA;;AAAA;AAAA;AAAA;;AAAP;AACZ;;;AACA;AAAA;;;AACmD;AAAQ;AAAR;AAAd;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAejB;;AAAA;AAAA;;AAAA;AADJ;AAGhB;;AAAA;;;AACuB;;AAAoB;AAApB;AAAP;AAGJ;AAAS;AAAT;AAAA;;;;;AAjBQ;;AAAA;AAAA;AAC4C;AAAtB;AAElB;AAAuB;;AAAvB;AAAA;AAAA;AAAA;AAAA;;AADJ;AAGgB;AAAA;AAAA;;AAAA;AAAA;AAChB;AAAA;AAE2B;AAAvB;AADa;;AAAA;AAAA;;AAAA;AAAA;;AAAA;;;;AA/sBV;;AAAA;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AA4tBR;;AAAA;;;AAEgB;;AAAA;;AAAA;AADJ;AAAA;AAAA;AAGA;AAAc;;AAAd;AAsLG;;AAxCV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAv6BU;AAAA;AAAA;AAAA;AAAP;AAw+BA;;;AACA;;;AACA;;;AAEO;AAAA;AAAA;AAAA;AAAoB;AAAA;AAAA;AAAA;AAApB;;AAAA;AAAP;AACQ;;;AACD;AAAA;;;AAAA;AAAoB;;;AAApB;AAAP;AAIiB;;AAAA;;;AAEM;;AAAA;;;AACA;;AAAA;;;AACW;;AAAA;;;AAEC;;AAAA;;;AACD;;AAAA;;;AACC;;AAAA;;;AACrB;;AAAA;;;AAVV;;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAMkB;AANlB;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAFJ;;;AAAA;;AAeO;;AA7CV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;AA+CA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAhgCU;AAAA;AAAA;AAAA;AAAP;AAqiCA;;;AACA;;;AAEG;;AAAA;AAAA;AAAgB;;AAAhB;AAAX;;;AA98Be;AAAA;;AAAA;AAAA;AAAsB;;AAAtB;AA+8BH;AACA;;;AAh9BG;AAAA;;AAAA;AAAA;AAAA;AAAsB;;AAAtB;AAwsBP;AACO;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAoB;AAAA;AAAA;AAAA;AAApB;AAAP;AAEwB;AAAA;;;AAAA;;AAAA;AAAA;AADxB;;;AAIuC;AAAA;AAAA;AAAA;AAzvBpB;;AAAZ;AA0vBA;;AAAA;;AACJ;AAAc;;AAAd;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAX;;;AACmB;;AAAA;AAAA;AAAA;;AAAA;AACJ;;AAAA;AAAA;AAAA;AAAA;AAAc;;AAAd;AAAP;AAKuB;;AAAA;AAAA;;;AACA;;AAAA;;;AACW;;AAAA;;;AACC;;AAAA;;;AACD;;AAAA;;;AACC;;AAAA;;;AAR/B;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AADJ;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAaA;;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAA6B;AAA7B;AAAA;AAAA;AAAA;AAkPmB;AAAA;AAAA;AAAA;AAAZ;;AAAA;AAAA;;AAAA;AAAP;AACQ;;;AAAA;AAAA;;AAEJ;AAAA;;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAn1BA;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;AAAA;;AAMH;;AANG;AAAA;;;;AAm1BP;AAGO;;AAAoB;;;AAApB;AAAP;AA30BO;;AAAe;;AAAf;AAAA;;;AAAA;;AAAqC;;AAArC;AAAA;;;;AA40Bf;;;AErnCoC;;AAAe;;AAApC;;;AAAP;AFynCA;;AAAA;;AAAA;;;AAAA;;AACO;;AAxDV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsDO;;;;;;;;;;;;;;;;AAIP;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AA1jCU;AAAA;AAAA;AAAA;AAAP;AAulCA;;;AACA;;;AACA;;;AAjmCO;AAAA;AAAA;AAAA;AAAe;;AAAf;AAYA;AAAP;AAsFO;AAAA;;AAAA;AAAA;AAAsB;;AAAtB;AA4uBP;AACO;AAAA;AAAA;AAAA;AAAA;;AAAoB;AAAA;AAAA;AAAA;AAApB;AAAA;;AAAA;AAAP;AACO;;AAAA;;;AAAA;AAAA;;AAAsB;;;AAAtB;AAAP;AACO;AAAA;;AAAA;AAAA;AAAA;;AAAgB;AAAhB;AAAP;AAER;;;AAEgB;AAAA;AAAA;AAAA;AAA4B;AAA5B;AADa;;;AAIb;;AAAA;AAAiC;;AAAA;;AAAA;AAAjC;AADJ;AAImC;AAAA;AAAA;AAAA;AApyBpB;;AAAZ;AAqyBA;;AAAA;;AACJ;AAAc;;AAAd;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAX;;;AACmB;;AAAA;AAAA;AAAA;;AAAA;AACJ;;AAAA;AAAA;AAAA;AAAA;AAAc;;AAAd;AAAP;AAKuB;;AAAA;AAAA;;;AACA;;AAAA;;;AACW;;AAAA;;;AACC;;AAAA;;;AACD;;AAAA;;;AACC;;AAAA;;;AAR/B;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AADJ;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAaA;;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAA6B;AAA7B;AAAA;AAAA;AAAA;AAuPO;;AAnCV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqCA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AEvqC+B;;AAAc;;AAAnC;;;AAAP;AForCA;;AAAA;AAAA;AACO;;AAdV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA/lCU;AAAA;AAAA;AAAA;AAAP;AAAA;AA4nC6B;AAAA;;AAAA;AAAA;AAAX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAEF;AAAA;;AAAA;AAAA;AACS;AAAA;;AAAA;AAAA;AACG;AAAA;;AAAA;AAAA;AACX;AAAA;AAAA;AAAA;AACQ;AAAA;AAAA;AAAA;AACC;AAAA;;AAAA;AAAA;AACI;AAAA;;AAAA;AAAA;AACJ;AAAA;;AAAA;AAAA;AACL;AAAA;;AAAA;AAAA;AACS;AAAA;;AAAA;AAAA;AACC;AAAA;;AAAA;AAAA;AACT;AAAA;;AAAA;AAAA;AACC;AAAA;;AAAA;AAAA;AAfhB;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAZV;AAAA;AAAA;AAAA;AAAA;AAAA;AA/mCU;AAAA;AAAA;AAAA;AAAP;AAypCG;AAAA;AAAA;AAAA;AAAqB;AAAA;AAAA;AAAA;AAArB;AAAX;;;AAEyB;AAAA;AAAA;AAAA;AADN;AAEQ;;AAFR;AAGY;AAHZ;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAbd;AAAA;AAAA;AAAA;AAAA;AAAA;AAwBmC;AAAA;AAAA;AAAA;AAAzB;;;AAxBV;;;AE7nCG;;;AAdH;AAAA;AAgBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAcG;;;AACA;;AAAA;AAAA;AACO;;AAhBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAcG;;;AACA;;AAAA;AAAA;AACO;;AAhBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAsBG;;;AACA;;;AACwB;AAAA;;AAAxB;;;AA1Hc;;AAAX;AAAX;;;AACY;;AAAA;;AAAA;AA2HG;;AA1BV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA9FM;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAqHJ;;;AAnHG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAiHJ;;;AA/GG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AA6GJ;;;AA3GG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAyGJ;;;AAvGG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;;;;AAwGP;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAmBG;;;AACA;;;AACwB;AAAA;;AAAxB;;;AA1HO;AAAW;;AAAX;AAAP;AACc;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAyHG;;AAvBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAhGM;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAoHJ;;;AAlHG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAgHJ;;;AA9GG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AA4GJ;;;AA1GG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;;;;AA2GP;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAhL+B;;AAAgB;;AAArC;;;AAAP;AAgMA;;AAAA;AAAA;AACO;;AAjBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA8BU;AAAA;;AAAA;AAAA;AAXV;AAAA;AAAA;AAAA;AAAA;AAAA;AAaA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAkB4B;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AAtBP;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAyBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAkBU;AACP;AAAA;;;AAES;;;;;;;;AADT;;AAAA;;;;;;;;;;;;;;AA+BQ;AAJI;;AA9SL;;AAAA;AAAA;AAAA;AAAA;;AA6SC;AAGO;AAAA;AAjDlB;AAAA;AAAA;AAAA;AAAA;AAAA;AA0Ce;;AAzSL;;AAAA;AAAA;AAAA;AAAA;;AAwSC;AAGO;AAAA;AA5ClB;;;AAqCe;;AApSL;;AAAA;AAAA;AAAA;AAAA;;AAmSC;AAGO;AAAA;AAvClB;;;AAgCe;;AA/RL;;AAAA;AAAA;AAAA;AAAA;;AA8RC;AAGO;AAAA;AAlClB;;;AA2Be;;AA1RL;;AAAA;AAAA;AAAA;AAAA;;AAyRC;AAGO;AAAA;AA7BlB;;;AAsBkB;;;;;;;;;;;;;;;;;;AAtBlB;;;AH5RD;;;AAEe;;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAJ;AAAP;;AAgBJ;;;AApB8B;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAqCW;AAAA;AAAA;AAIM;AAAA;;AAAA;AAAA;AAAiC;;AAAA;;AAAA;AAAjC;AAEb;AAAA;;AAAA;AAAA;AAAkC;;AAAA;;AAAA;AAAlC;AAMgB;;AAAA;AAAA;AAAgB;AAAA;;AAAA;AAAA;AADf;;AAAA;;AAAA;;AAAA;;;AAIgB;AAAA;;AAAA;AAAA;AADf;;AAAA;;AAAA;;AAAA;;;AAMtB;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAI+B;AAAA;;AAAA;AAAA;AAA/B;AAAA;;AACgC;AAAA;;AAAA;AAAA;AAAhC;AAAA;;AAG0B;AAAA;AAAA;AAAA;AAA1B;AAAA;;AAIA;;AAAA;AAAA;AACA;AAEJ;;;;;;AAzE8B;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;ACkHO;AAAA;AAAA;AAAA;AAAe;;AAAf;ADtCf;;;AACY;AAEO;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AACR;;AAAA;AAAA;AAAA;;AAAX;;;AACY;AAGJ;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAC0B;AAA1B;AAAA;;AACA;;AAAA;AAAA;AACO;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;AAAA;AAAA;;AAAA;AAAA;;AC4CJ;;;AAIO;;AAAA;;;AAAA;;AAAA;;;AACQ;AAAP;AACQ;;AAAA;;AAAA;AACL;;AAAA;AAAP;AAEJ;;;AAEJ;;AAAA;;;AACmB;AAAP;AACG;AAAA;;AAAA;AAAA;AAAP;AAAA;AACoC;AAAA;;AAAA;AAAA;AAA7B;;AAAA;AAAA;;AAAA;;;AAAP;AAEJ;;;AAOJ;;AAAA;;;AACmB;AAAP;AAEA;AAAA;;AAAA;AAAA;AAEA;AAAA;;AAAA;AAAA;AAHG;;AAAA;AAAA;;;AAAP;AAwBJ;;;AAEsB;AAAA;AAAA;AAAA;AAAX;;AAAA;AAAP;AAdO;;AAAY;;AAAZ;AAgBA;AAAc;;AAAd;AAAA;AAAA;AAAA;AAAA;;AAAP;AAZO;;AAAW;;AAAX;AAeS;;AAAA;AAAA;;AAAA;AAAA;AAAT;;AAAA;AAAP;AACO;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAP;AAuGJ;;;AA1DO;;AARC;AAQD;AAAA;;;AAAA;;AAPC;AAOD;AAAA;;;AAAA;;AANC;;AAMD;AAAA;;;AAAA;;AALC;;AAKD;AAAA;;;AAAA;;AAJC;;AAID;AAAA;;;AACQ;AA6DX;;AA1DR;;AAAA;;;AAEmB;AAwDJ;;;AAtDJ;;AAAiB;;AAAjB;AAAA;;;AAAyC;;AAAiB;;AAAjB;AAAzC;;;AAIQ;;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;;AAkDJ;;;;AAAA;;;AA7CJ;;AAAiB;AAAjB;AAAX;;;AAEmB;;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;;AA2CJ;;;;AAAA;;;AArCJ;;AAAiB;;AAAjB;AAAX;;;AAEmB;;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;;AAmCJ;;;;AAAA;;;AA5BJ;;AAAiB;;AAAjB;AAAX;;;AAEmB;;AAAc;;AAAd;AA0BJ;;;AAxBA;AAwBA;;;AAkBH;AAAA;;AAAA;AAAA;AAAsB;AAAtB;AAAA;;;AACI;AAAA;;AAAA;AAAA;AADJ;;;;AADJ;;AAAA;AA8CJ;;;AASQ;;AAAA;;AAAA;AAAA;AAAA;;;AACG;AAAA;;AAAA;AAAA;AADH;;;AAEG;AAAA;;AAAA;AAAA;AAFH;;;AAIO;AAAP;;AAAA;;AAAA;AAEA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAHM;;;AAQN;AAAA;;AAAA;AAAA;AAHG;;AAAA;AAAA;;;AAAP;;AAAA;;AAAA;AA+DJ;;;AAMJ;;AAAA;;;AACY;;AAAA;AACU;AAAA;;AAAA;AAAA;AACV;AAAA;;AAAA;AAAA;AADmC;;AAAA;;AAAA;;;AAAzB;AAKd;AAAA;AAGI;AAAA;;AAAA;AAAA;AAFG;;AAAA;AAAA;;AAAA;;;AAAP;AAyIJ;;;;;;;;AAUW;;AAAA;AAAA;AAAkB;AAAA;AAAA;AAAA;AAAlB;AAAP;AACO;;AAAA;;AAAA;AAAwB;;AAAxB;AAAP;AAEa;;AAAA;AAAA;AAAA;AACI;AAAd;AAAA;AAAX;;;AA5ee;AAAA;AAAA;AAAA;AAAe;;AAAf;AA+eH;AAEI;AAAA;;AAAA;AAAA;AAA6B;AAAA;;AAAA;AAAA;AAA7B;AADJ;AAG6B;;AAAA;;AAAA;AAA7B;;AAAA;;AAAA;AACA;;AAAA;AAAA;AAC6B;;AAAA;;AAAA;AAA7B;;AAAA;AAAA;AACA;;AAAwB;AAAxB;AACiC;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAqB;AAArB;AAAA;AAAA;AAAA;AACA;AAAc;;AAAd;AA7LJ;;AAAA;AACO;AAAA;;AAAA;AAAA;AA6LH;;AAAA;AAGmB;AAHnB;;;;AAAA;;AAKA;;AAAA;;AAAA;;AAAA;AA/fG;AAAA;AAAA;AAAA;AAAe;;AAAf;AAYA;AAAP;AAsfA;AAAA;;AAAA;AAAA;AAAyB;;AAAA;;;AAAA;;AAAzB;AAAA;;AAAA;AAAA;AAEG;;AAAc;;AAAd;AAAX;;;AAIgB;;AAAA;;AAAA;AACA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAHY;;;AAMI;AAAA;;AAAA;AAAA;AAAhB;AAAA;;AAiFL;AAAA;;AAAA;AAAA;AAAA;;;AAAqC;AAAA;;AAAA;AAAA;AAAP;;AAAA;AAA9B;;;AACQ;AAAA;;AAAA;AAAA;AAAA;;AAAA;AACR;AAAA;;AAAA;AAAA;AAAA;;;AAAmC;AAAA;;AAAA;AAAA;AAAP;;AAAA;AAA5B;;;AACQ;AAAA;;AAAA;AAAA;AAAA;;AAAA;AArFP;;AAAA;;AAAA;AAYD;;AAAc;;AAAd;AAAX;;;AACyC;;AAAA;;AAAA;AAA7B;;AAAA;;AAAA;AACA;;AAAA;AAAA;AAKD;;;AAAX;;;AACe;;AAAc;;AAAd;AAAf;;;AAI2B;AAAA;AAAA;AAAA;AAA4B;AAAA;AAAA;AAAA;AAA5B;AACD;;AADA;AADF;;AAAA;AAFR;AAAA;;;AA9LU;AAAA;;AAAA;AAAA;AAAA;;AAAA;AACJ;AAAd;;AACwB;AAAxB;;AAEG;;AAAA;;AAAA;AAAA;AAAA;;AAAX;;;AAE8B;;AAAA;;AAAA;;;AAAA;AAAA;;AAKM;AAAxB;;;;AAEc;AAAA;AAAA;AAAA;AAAoB;AAApB;AAAA;;AACM;AAAA;AAAA;AAAA;AAAlB;;AAAA;AAAd;;;AAC2B;;AAAA;;;AAAA;AAAA;;AACK;AAAA;AAAA;AAAA;;AAEuB;;AAArB;AAAA;;;AAClB;;AAAqB;;AAArB;AAAA;;;AACI;;AAAA;;AAAA;AADJ;;;;AAGhB;;;AACA;;AAAA;;;AAC4C;AAAxB;;AAOR;;AAAmB;AAAnB;AAAA;;;;;AAHY;;AAAA;;AAAA;AAFc;;AAAA;AAAA;;;AAAA;AAAA;;AAIlB;;AAAA;AAAA;;;;;;;;;AAGZ;;AAAA;AACY;AAAA;;AAAA;AAAA;AACT;;AAAA;;AAAA;AAAc;AAAd;AAAX;;;AAEyB;AAAA;;AAAA;AAAA;AAAb;AAGA;AAAA;;AAAA;AAAA;AAFG;;AAAA;;;AA+JC;;AAAA;AAAA;AAKR;AAAA;AAAA;AAAA;AAAqB;AAArB;AAAA;AAAA;AAAA;AACA;;AAEW;AACQ;AAHnB;;;;AAAA;;;;;;;;;AAFqC;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;;;;AAjBC;;AAAc;;AAAd;AAAb;;;AAE6C;AAAA;;AAAA;AAAA;AAAjC;;AAAA;AAAA;;;;AAdC;;AAAc;;AAAd;AAAb;;;AACwB;;AAAA;;AAAA;AAAA;AAAA;;AACxB;;;AAC4B;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAChB;;AAAA;;AAAA;;;;AAEG;;AAAA;;AAAA;AAAA;AAAA;;AAAf;;;AACgB;;AAAA;;AAAA;;;;AAkCZ;;;AAUwB;;AACH;;AAAA;AAAA;AACE;;AAAA;;;AACI;;AAAA;;;AACJ;;AAGW;;AALX;AAKW;AA6BtC;;AAAA;;;AACmB;AA/BS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAIA;AAAA;;AAAA;AAAA;AACH;;AAAA;AAAiB;AAAjB;AAZb;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AADJ;;;;;;AAAA;AAAA;AAAA;;;;;;AAwCG;;AAAe;AAAf;AAAA;;;AAAA;;AAAsC;;AAAtC;AAAA;;;AACQ;AAhCC;;;AAiCL;;;AAjCK;;;AE1pBhB;;;;;AAFW;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAGA;;;AACH;;AAAA;AAAA;AAAA;AAAA;AACG;;AAAA;AAAA;;AADH;AAAA;;;AAEG;;AAAA;AAAA;AAAA;AAAA;AADA;;AAAA;AADH;;;;AADJ;;AAAA;;;;;AAOyB;;AAbF;AAAA;;AAAA;AAAA;AAAhB;AAaP;;AAkBW;AAAA;;AAAA;AAAA;AAAJ;AAAP;;AAGW;AAAA;;AAAA;AAAA;AAAJ;AAAP;;AAEJ;;;AACW;;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;AAAA;;AAMH;;AANG;AAAA;;;AAAA;;AAOH;;AAPG;AAAA;;;;AAAP;;;", + "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AG4BmD;;AAAf;;AAA5B;AAC4C;;AAAf;;AAA7B;AAkBA;;AAA0B;AAA1B;AAGA;;AAAiB;AAAjB;AFMA;AAAc;AAAd;AACA;;AAAqB;AAArB;AAGA;;AAAuB;;AAAvB;AACA;;AAAsB;;AAAtB;AAGA;;AAA6B;AAA7B;AACA;;AAA2B;AAA3B;AAGA;;AAA6B;AAA7B;AACA;;AAAqB;AAArB;AACA;;AAA6B;AAA7B;AACA;;AAA6B;AAA7B;AAGA;;AAA4B;AAA5B;AAGA;;AAAmB;AAAnB;AACA;;AAA4B;AAA5B;AAGA;;AAA+B;AAA/B;AACA;;AAA6B;AAA7B;AACA;;AAAiC;AAAjC;AACA;;AAAoC;AAApC;AAGA;;AAAiC;AAAjC;AACA;;AAAwB;AAAxB;AAGA;;AAA6B;AAA7B;AACA;;AAAyB;AAAzB;AACA;;AAA6B;AAA7B;AACA;;AAAwB;AAAxB;AACA;;AAAsB;AAAtB;AACA;;AAAuB;AAAvB;AACA;;AAA4B;AAA5B;AACA;;AAA0B;AAA1B;AAGA;;AAA0B;AAA1B;AACA;;AAAyB;AAAzB;AAGA;;AAAiC;AAAjC;AACA;;AAAkC;AAAlC;AAQA;AAAoB;AAApB;AACA;AAA4B;AAA5B;AAGA;;AAAyB;AAAzB;AIhGO;;AAA6B;;AAA7B;AAAP;AACO;;AAAuB;;AAAvB;AAAP;AACO;;AAAA;AAAP;AACO;;AAAA;AAAP;AAlBR;;;;;;AAAA;;;AAAA;;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;;;;;;AAAA;;;AAAA;;;;AAAA;AF8IK;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ADvGA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ADgGU;AAAA;AAAA;AAAA;AAAP;AC3EA;;;AACA;;;AACA;;;ADiEO;AAAA;AAAA;AAAA;AAAe;;AAAf;AAYA;AAAP;AC3EG;;;AAAX;;;AAIsB;AACA;;AADA;AADF;;AAAA;AAFR;AAAA;;;AAQe;AAAnB;;AACkB;AAAlB;;AACmB;AAAnB;;AAGI;;AAAA;;AAAA;AAAA;;;AACI;AAAA;AAAA;AAAA;AAAoB;AAAA;AAAA;AAAA;AAApB;AADJ;;;AAGiC;AAAA;AAAA;AAAA;AAAzB;;;AAAA;AAAA;;AACL;;AAAA;AAAA;AAAA;;AAAuB;;AAAvB;AAAf;;;AAEuC;;AAAA;AAAA;AAAA;AAAA;;ADmQ3B;AADG;AAAA;AAAA;;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;;AClQA;;;ADwcA;;AAAA;AAAA;AAAkB;AAAA;AAAA;AAAA;AAAlB;AAAP;AACO;;AAAwB;;AAAxB;AAAP;AAxIG;;AAAA;;;AAAA;;AAAyC;;AAAzC;AAAA;;;AACQ;;;AAYE;;AAAA;AAAA;AAAA;AAAA;;AACS;;AAAnB;AAAA;;;AAAA;;AAAyC;;AAAzC;AAAA;;;AACQ;;;AA6HkB;;AAAA;;AAAA;AAAA;;AAG1B;;;AAAX;;;;;;;AAkB+B;;AAAA;;;AACC;;AAAA;;;AACN;;AAAA;;;AAAA;AAAA;;AAAA;;AACC;AAAA;;;AAAA;AAAA;;AACD;;AAAA;;AAAA;AAAA;AAAA;;AA4JyB;;AAAjC;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAtRH;AAAA;;AAAA;AAAA;AAAyB;AAAA;;AAAA;AAAA;AAAzB;;AAAA;AAwRA;;AAAA;;AAAA;AAAP;AACO;;AAAA;AAAA;AA7JH;;AAAA;AADJ;AAIA;;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AACG;;AAAA;AAAA;AAAgC;;AAAhC;AAAX;;;AAEY;AAAA;;AAAA;AAAA;AAAyB;;AAAA;;;AAAA;;AAAzB;AAAA;;AAAA;AAAA;AAGG;;;AAAJ;;;AAAkC;;AAAA;AAAA;AAAgC;;AAAhC;AAAlC;;;AAGkC;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;AACJ;;AAAA;;AAAA;AACA;;AAAA;;AAAA;AACA;AAAA;AAAA;AAAA;AAAqB;AAArB;AAAA;AAAA;AAAA;AAEG;;AAAA;;;AAAoB;;;AAApB;AAAA;;;AAEG;AAAA;;AAAA;AAAA;AAFH;;;AAGC;AAAc;;;AAAd;AACA;;AAAiC;AAAjC;AAEJ;;AAAA;;AAAA;AAAA;;;AAAA;AC9fI;;AAAA;;AAAA;AAAA;;AACA;;AAAA;;AAAA;AAAA;;AACA;;AAAoB;AAApB;AAAA;;;;;AD6eA;;AAAwB;AAAxB;;;;AAlCa;;AAAA;AAAA;AAAA;AAAA;;AAGI;;AAAd;AAAf;;;AAEoB;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;;;;;;AAGH;;AAAc;AAAd;AAAjB;;;AAC6C;AAAA;;AAAA;AAAA;AAAA;;AAAA;AACR;AAAA;;AAAA;AAAA;AAAA;;AAAA;;;;AACpB;;AAAc;;AAAd;AAAjB;;;;;;;AAAA;;;AAC6C;AAA7B;;AACqB;AAArB;;;;;AA7IL;;;AAAX;;;AACe;;AAAc;;AAAd;AAAf;;;AACuB;AAAA;;AAAA;AAAA;;;AAyHQ;;;AAxHJ;AAAA;;AAAA;AAAA;AAAwB;;AAAA;;;AAAA;;AAAxB;AAAA;AAAA;;AACZ;AAAA;;AAAA;AAAA;AAAA;AAAf;;;AACuB;;;AAsHQ;;;AArHA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AACG;AAAA;;AAAA;AAAA;AAAnB;AAAf;;;AACuB;AAAA;;AAAA;AAAA;;;AAmHQ;;;;;;;AAAA;;;AAhHnB;;AAAA;;AAAA;AAAoC;AAAA;;AAAA;AAAA;AAApC;AAAA;AADJ;AAGO;AAAA;;;AA8GgB;;;AAzIhB;AAAA;;AAAA;AAAA;AAAwB;;AAAA;;;AAAA;;AAAxB;;;AAwIe;;;ACnctB;;AAAA;AAAA;AAIiB;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAEH;;AALP;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAtDV;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;;;AA8DA;;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;ADkCU;AAAA;AAAA;AAAA;AAAP;ADvH0B;;AAAnB;AAAA;AAAA;AAAA;AAAA;;AAAP;AETG;AAAA;;AAAA;AAAA;AAAwB;;AAAxB;AAAX;;;AAEgB;;AAAc;AAAA;;AAAA;AAAA;AAAd;AAAA;;;AACG;;AAAA;;AAAA;AADH;;;AAEG;;AAAc;;AAAA;AAAA;AAAA;;;AAAd;AAFH;;;;AADJ;AA2HJ;;;AACA;;;ADLO;AAAA;AAAA;AAAA;AAAe;;AAAf;AAYA;AAAP;ACJA;;AAAA;AAAA;;;AACA;;;;;AF3BI;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AACE;AAAA;;AAAA;AAAA;AAAA;;AADF;;AAAA;AAAA;AAAA;;AE6BJ;AAzHI;;;AACI;AAAA;;AAAA;AAAA;AADJ;;AAAA;;AAAA;;;AAGQ;AAAA;AAAA;AAAA;;;AAAA;AAAJ;;;;AA2HhB;;;AArH6C;;AAAjC;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AADJ;AAwHc;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAjHd;AAIQ;;;;;;;;;;;;;AAJR;;;;;;AAAA;AFsFkB;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AACC;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAGW;AAA9B;AAAA;AAAA;;AAAA;;AACA;AAAA;;AACA;;AAAA;AAAA;AAEO;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACO;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAP;AAGA;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AEoBiB;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AACH;;AAJP;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;;;;AAAA;AAAA;AAAA;AA/CV;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;;;AEvFA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBG;;;AACO;AAAA;AAAP;AAEA;;AAAA;;AAAA;AACA;;AAAA;AAAA;AACO;;AAvBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAyBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AHgGU;AAAA;AAAA;AAAA;AAAP;AEtE4B;;AAAqB;;AAA1C;;;AAAP;ACGA;;;AACA;;;AH0DO;AAAA;AAAA;AAAA;AAAe;;AAAf;AGzDP;AJtD0B;;AAAnB;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAP;AIwDA;AAAA;;;AACA;AAAA;AAEI;AAAA;;AAAA;AAAA;AAAA;AAAqC;AAAA;;AAAA;AAAA;AAArC;AADJ;AAGG;AAAA;;AAAA;AAAA;AAAX;;;AAEgB;;AAA2B;AAAA;;AAAA;AAAA;AAA3B;AADJ;AJ8DJ;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AIzDA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AACO;AAAA;;AAAA;AAAA;AAAA;AAAA;AA7CV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AA+CA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AHiDU;AAAA;AAAA;AAAA;AAAP;AGbA;;;AACA;;;AHIO;AAAA;AAAA;AAAA;AAAe;;AAAf;AAYA;AAAP;AGtIG;AAAA;;AAAA;AAAA;AAAX;;;AAEgB;AAAA;;AAAA;AAAA;AAA8B;;AAA9B;AADJ;AAGD;AAAA;;AAAA;AAAA;AAAX;;;AAEgB;;AAA0B;AAAA;;AAAA;AAAA;AAA1B;AADJ;AAqHG;;AAAA;;AAAA;AAAA;;AAAA;AAAP;AJ/G0B;;AAAnB;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAP;AAA0B;;AAAnB;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAP;AIkHA;;AAAA;;;AACA;AAAA;;;AACO;;AAAA;AAAP;AACA;;AAAA;AAAA;AACgB;AAAA;AAAA;AAAA;AAAA;AAAT;AAAP;AH6mBG;AAAA;AAAA;AAAA;AAAqB;AAAA;AAAA;AAAA;AAArB;AAAX;;;AAE8C;AAAA;AAAA;AAAA;AAAzB;;;AAET;;AAAA;AAA4B;;AAA5B;AADJ;AG7mBA;;AAAA;AAAA;;;AACA;;AAAA;AAAA;;AAAA;;;AACA;;;;;AACA;;;;;AJIgB;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAT;;AAAA;AAAA;;AAAA;;AAAA;AAAP;AACA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AATA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AIlDH;AAAA;;AAAA;AAAA;AAAA;AAAA;AJuEA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AGtF+B;;AAAgB;;AAArC;;;AAAP;AHvD0B;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAiKA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AACO;;AArBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AGtH+B;;AAAsB;;AAA3C;;;AAAP;AFqEO;AAAA;AAAA;AAAA;AAAe;;;AAAf;ADuEA;AAAP;AACA;;;AACA;;;AAC8B;;AAAvB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AAnLU;AAFH;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAsLP;AACO;;AA3BV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA6BA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAjM6B;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAsNO;;AAAA;;AAAA;AAAP;AACA;;;AACA;;;AACA;AAAA;;AAAA;AACO;;AAzBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA5N6B;;AAAnB;AAAA;AAAA;AAAA;AAAA;;AAAP;AA2OO;AAAA;AAfV;AAAA;AAAA;AAAA;AAAA;AAAA;ACuwBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAcG;;AAAA;AAAA;AACO;;AAfV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;AAiBA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AA8BG;;;AAGqB;AAAA;AAAA;AAArB;;AAAA;;AAAA;AAn1BO;;;AAAA;AAEH;AAFG;AAAA;;;AAAA;AAGH;;AAHG;AAAA;;;AAAA;AAIH;;AAJG;AAAA;;;AAAA;AAKH;;AALG;AAAA;;;AAAA;AAMH;;AANG;AAAA;;;;AAWP;AA00B4B;AAAA;;AAAA;AAAA;AAAA;;AAAA;AA1uBrB;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAP;AAEI;;AAAA;AAAA;AAAA;;AA9BG;;;AAAA;;AAEH;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;;AAYP;AAoBG;AAAiB;AAAjB;AAAX;;;AACuB;;AAAA;;;AAAA;AAAJ;AAAP;AA6dG;AAAA;AAAA;AAAA;AAAA;AAAP;AACO;AAAA;;AAAA;AAAA;AAAA;AAAP;AAGgC;;AAAA;AAAA;AAAA;AAnCb;AAAA;;AAAA;;AACnB;AAGA;;AAAA;;AAAA;AAmC8B;;AAAA;;AAAA;AA9B1B;AAAA;;AAAA;AADJ;AAKA;;AAAA;;AAAA;AAEA;AAIQ;;AAFW;;AACF;;;;;;;;AAHjB;;;;;;AAAA;AA4BmB;AAAA;;AAAA;AAAnB;;AAAA;AAAA;AACA;;AAA4B;AAA5B;AAGA;;AAAA;;AAAA;AAG6B;AAAA;;AAAA;AAA7B;;AAAA;;AAAA;AACqB;;AAAA;;AAAA;AAArB;;AAAA;;AAAA;AACiC;;AAAA;AAAA;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;AAGA;;AAAA;;AAAA;AACoC;;AAAA;;;AAAA;AAApC;;AAAA;AAAA;AAC6B;;AAAA;;AAAA;AAA7B;;AAAA;AAAA;AAGwB;;AAAA;;AAAA;AAAxB;;AAAA;AAAA;AAG6B;;AAAA;AAAA;AAA7B;;AAAA;AAAA;AACiC;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;AACyB;;AAAA;;AAAA;AAAzB;;AAAA;AAAA;AAC6B;;AAAA;;AAAA;AAA7B;;AAAA;AAAA;AACwB;;AAAA;;AAAA;AAAxB;;AAAA;AAAA;AACsB;;AAAA;;AAAA;AAAtB;;AAAA;AAAA;AACuB;;AAAA;;AAAA;AAAvB;;AAAA;AAAA;AAC4B;;AAAA;;;AAAA;AAA5B;;AAAA;AAAA;AAC0B;;AAAA;;;AAAA;AAA1B;;AAAA;AAAA;AAGyB;;AAAA;;AAAA;AAAzB;;AAAA;AAAA;AAGoB;;AAAA;AAAA;AAApB;AAAA;AAAA;AAGiC;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;AACkC;;AAAA;;AAAA;AAAlC;;AAAA;AAAA;AAGA;;AAAyB;AAAzB;AACA;;AAA0B;AAA1B;AAEO;;AAA8B;;AAA9B;AAAP;AACqC;AAAA;AAAA;AAA9B;;AAAA;AAAP;AACO;AAAP;AAiNuB;;AAAA;;;AAAvB;;AAAA;AAAA;AACsB;;AAAA;;;AAAtB;;AAAA;AAAA;AACO;;AAxCV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;;;;;;;;AA0CA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAgCG;;;AAGkB;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAxOX;AAAA;AAAA;AAAA;AAAA;AAAP;AACO;AAAwB;;AAAxB;AAAP;AAGO;AAAA;;AAAA;AAAA;AAAP;AAEc;AAAsB;;AAAtB;AAAA;AAOU;;AAAd;AADF;;AAAA;AAFR;AAAA;;;AAMQ;AACF;AAAA;;AAAA;AAAd;;;AACoB;;AAAA;;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AACW;AADX;AACW;AAAA;AAAA;;AAAA;;AACZ;AAAA;AAAA;AAAA;AAAA;;AAAkB;;AAAA;;AAAA;AAAlB;;AAAA;AAAP;AACA;;AAAA;;AAAA;;;AAGO;AAAA;;AAAA;AAAA;AAAA;;AAAP;AACZ;;;AACA;AAAA;;;AACmD;AAAQ;AAAR;AAAd;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAejB;;AAAA;AAAA;;AAAA;AADJ;AAGhB;;AAAA;;;AACuB;;AAAoB;AAApB;AAAP;AAGJ;AAAS;AAAT;AAAA;;;;;AAjBQ;;AAAA;AAAA;AAC4C;AAAtB;AAElB;AAAuB;;AAAvB;AAAA;AAAA;AAAA;AAAA;;AADJ;AAGgB;AAAA;AAAA;;AAAA;AAAA;AAChB;AAAA;AAE2B;AAAvB;AADa;;AAAA;AAAA;;AAAA;AAAA;;AAAA;;;;AA/sBV;;AAAA;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AA4tBR;;AAAA;;;AAEgB;;AAAA;;AAAA;AADJ;AAAA;AAAA;AAGA;AAAc;;AAAd;AAsLG;;AAxCV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAv6BU;AAAA;AAAA;AAAA;AAAP;AAw+BA;;;AACA;;;AACA;;;AAEO;AAAA;AAAA;AAAA;AAAoB;AAAA;AAAA;AAAA;AAApB;;AAAA;AAAP;AACQ;;;AACD;AAAA;;;AAAA;AAAoB;;;AAApB;AAAP;AAIiB;;AAAA;;;AAEM;;AAAA;;;AACA;;AAAA;;;AACW;;AAAA;;;AAEC;;AAAA;;;AACD;;AAAA;;;AACC;;AAAA;;;AACrB;;AAAA;;;AAVV;;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAMkB;AANlB;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAFJ;;;AAAA;;AAeO;;AA7CV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;AA+CA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAhgCU;AAAA;AAAA;AAAA;AAAP;AAqiCA;;;AACA;;;AAEG;;AAAA;AAAA;AAAgB;;AAAhB;AAAX;;;AA98Be;AAAA;;AAAA;AAAA;AAAsB;;AAAtB;AA+8BH;AACA;;;AAh9BG;AAAA;;AAAA;AAAA;AAAA;AAAsB;;AAAtB;AAwsBP;AACO;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAoB;AAAA;AAAA;AAAA;AAApB;AAAP;AAEwB;AAAA;;;AAAA;;AAAA;AAAA;AADxB;;;AAIuC;AAAA;AAAA;AAAA;AAzvBpB;;AAAZ;AA0vBA;;AAAA;;AACJ;AAAc;;AAAd;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAX;;;AACmB;;AAAA;AAAA;AAAA;;AAAA;AACJ;;AAAA;AAAA;AAAA;AAAA;AAAc;;AAAd;AAAP;AAKuB;;AAAA;AAAA;;;AACA;;AAAA;;;AACW;;AAAA;;;AACC;;AAAA;;;AACD;;AAAA;;;AACC;;AAAA;;;AAR/B;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AADJ;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAaA;;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAA6B;AAA7B;AAAA;AAAA;AAAA;AAkPmB;AAAA;AAAA;AAAA;AAAZ;;AAAA;AAAA;;AAAA;AAAP;AACQ;;;AAAA;AAAA;;AAEJ;AAAA;;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAn1BA;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;AAAA;;AAMH;;AANG;AAAA;;;;AAm1BP;AAGO;;AAAoB;;;AAApB;AAAP;AA30BO;;AAAe;;AAAf;AAAA;;;AAAA;;AAAqC;;AAArC;AAAA;;;;AA40Bf;;;AEhnCoC;;AAAe;;AAApC;;;AAAP;AFonCA;;AAAA;;AAAA;;;AAAA;;AACO;;AAxDV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsDO;;;;;;;;;;;;;;;;AAIP;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AA1jCU;AAAA;AAAA;AAAA;AAAP;AAulCA;;;AACA;;;AACA;;;AAjmCO;AAAA;AAAA;AAAA;AAAe;;AAAf;AAYA;AAAP;AAsFO;AAAA;;AAAA;AAAA;AAAsB;;AAAtB;AA4uBP;AACO;AAAA;AAAA;AAAA;AAAA;;AAAoB;AAAA;AAAA;AAAA;AAApB;AAAA;;AAAA;AAAP;AACO;;AAAA;;;AAAA;AAAA;;AAAsB;;;AAAtB;AAAP;AACO;AAAA;;AAAA;AAAA;AAAA;;AAAgB;AAAhB;AAAP;AAER;;;AAEgB;AAAA;AAAA;AAAA;AAA4B;AAA5B;AADa;;;AAIb;;AAAA;AAAiC;;AAAA;;AAAA;AAAjC;AADJ;AAImC;AAAA;AAAA;AAAA;AApyBpB;;AAAZ;AAqyBA;;AAAA;;AACJ;AAAc;;AAAd;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAX;;;AACmB;;AAAA;AAAA;AAAA;;AAAA;AACJ;;AAAA;AAAA;AAAA;AAAA;AAAc;;AAAd;AAAP;AAKuB;;AAAA;AAAA;;;AACA;;AAAA;;;AACW;;AAAA;;;AACC;;AAAA;;;AACD;;AAAA;;;AACC;;AAAA;;;AAR/B;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AADJ;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAaA;;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAA6B;AAA7B;AAAA;AAAA;AAAA;AAuPO;;AAnCV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA1jCU;AAAA;AAAA;AAAA;AAAP;AAAA;AA4mC6B;AAAA;;AAAA;AAAA;AAAX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAEF;AAAA;;AAAA;AAAA;AACS;AAAA;;AAAA;AAAA;AACG;AAAA;;AAAA;AAAA;AACX;AAAA;AAAA;AAAA;AACQ;AAAA;AAAA;AAAA;AACC;AAAA;;AAAA;AAAA;AACI;AAAA;;AAAA;AAAA;AACJ;AAAA;;AAAA;AAAA;AACL;AAAA;;AAAA;AAAA;AACS;AAAA;;AAAA;AAAA;AACC;AAAA;;AAAA;AAAA;AACT;AAAA;;AAAA;AAAA;AACC;AAAA;;AAAA;AAAA;AAfhB;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAZV;AAAA;AAAA;AAAA;AAAA;AAAA;AA/lCU;AAAA;AAAA;AAAA;AAAP;AAyoCG;AAAA;AAAA;AAAA;AAAqB;AAAA;AAAA;AAAA;AAArB;AAAX;;;AAEyB;AAAA;AAAA;AAAA;AADN;AAEQ;;AAFR;AAGY;AAHZ;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAbd;AAAA;AAAA;AAAA;AAAA;AAAA;AAwBmC;AAAA;AAAA;AAAA;AAAzB;;;AAxBV;;;AExmCG;;;AAdH;AAAA;AAgBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAcG;;;AACA;;AAAA;AAAA;AACO;;AAhBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAcG;;;AACA;;AAAA;AAAA;AACO;;AAhBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAsBG;;;AACA;;;AACwB;AAAA;;AAAxB;;;AA1Hc;;AAAX;AAAX;;;AACY;;AAAA;;AAAA;AA2HG;;AA1BV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA9FM;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAqHJ;;;AAnHG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAiHJ;;;AA/GG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AA6GJ;;;AA3GG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAyGJ;;;AAvGG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;;;;AAwGP;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAmBG;;;AACA;;;AACwB;AAAA;;AAAxB;;;AA1HO;AAAW;;AAAX;AAAP;AACc;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAyHG;;AAvBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAhGM;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAoHJ;;;AAlHG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAgHJ;;;AA9GG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AA4GJ;;;AA1GG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;;;;AA2GP;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAhL+B;;AAAgB;;AAArC;;;AAAP;AAgMA;;AAAA;AAAA;AACO;;AAjBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAtM+B;;AAAc;;AAAnC;;;AAAP;AAmNA;;AAAA;AAAA;AACO;;AAdV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BU;AAAA;;AAAA;AAAA;AAXV;AAAA;AAAA;AAAA;AAAA;AAAA;AAaA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAkB4B;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AAtBP;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAyBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAkBU;AACP;AAAA;;;AAES;;;;;;;;AADT;;AAAA;;;;;;;;;;;;;;AA+BQ;AAJI;;AA9TL;;AAAA;AAAA;AAAA;AAAA;;AA6TC;AAGO;AAAA;AAjDlB;AAAA;AAAA;AAAA;AAAA;AAAA;AA0Ce;;AAzTL;;AAAA;AAAA;AAAA;AAAA;;AAwTC;AAGO;AAAA;AA5ClB;;;AAqCe;;AApTL;;AAAA;AAAA;AAAA;AAAA;;AAmTC;AAGO;AAAA;AAvClB;;;AAgCe;;AA/SL;;AAAA;AAAA;AAAA;AAAA;;AA8SC;AAGO;AAAA;AAlClB;;;AA2Be;;AA1SL;;AAAA;AAAA;AAAA;AAAA;;AAySC;AAGO;AAAA;AA7BlB;;;AAsBkB;;;;;;;;;;;;;;;;;;AAtBlB;;;AH9SD;;;AAEe;;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAJ;AAAP;;AAgBJ;;;AApB8B;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAqCW;AAAA;AAAA;AAIM;AAAA;;AAAA;AAAA;AAAiC;;AAAA;;AAAA;AAAjC;AAEb;AAAA;;AAAA;AAAA;AAAkC;;AAAA;;AAAA;AAAlC;AAMgB;;AAAA;AAAA;AAAgB;AAAA;;AAAA;AAAA;AADf;;AAAA;;AAAA;;AAAA;;;AAIgB;AAAA;;AAAA;AAAA;AADf;;AAAA;;AAAA;;AAAA;;;AAMtB;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAI+B;AAAA;;AAAA;AAAA;AAA/B;AAAA;;AACgC;AAAA;;AAAA;AAAA;AAAhC;AAAA;;AAG0B;AAAA;AAAA;AAAA;AAA1B;AAAA;;AAIA;;AAAA;AAAA;AACA;AAEJ;;;;;;AAzE8B;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AC+GO;AAAA;AAAA;AAAA;AAAe;;AAAf;ADnCf;;;AACY;AAEO;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AACR;;AAAA;AAAA;AAAA;;AAAX;;;AACY;AAGJ;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAC0B;AAA1B;AAAA;;AACA;;AAAA;AAAA;AACO;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;AAAA;AAAA;;AAAA;AAAA;;ACyCJ;;;AAIO;;AAAA;;;AAAA;;AAAA;;;AACQ;AAAP;AACQ;;AAAA;;AAAA;AACL;;AAAA;AAAP;AAEJ;;;AAEJ;;AAAA;;;AACmB;AAAP;AACG;AAAA;;AAAA;AAAA;AAAP;AAAA;AACoC;AAAA;;AAAA;AAAA;AAA7B;;AAAA;AAAA;;AAAA;;;AAAP;AAEJ;;;AAOJ;;AAAA;;;AACmB;AAAP;AAEA;AAAA;;AAAA;AAAA;AAEA;AAAA;;AAAA;AAAA;AAHG;;AAAA;AAAA;;;AAAP;AAwBJ;;;AAEsB;AAAA;AAAA;AAAA;AAAX;;AAAA;AAAP;AAdO;;AAAY;;AAAZ;AAgBA;AAAc;;AAAd;AAAA;AAAA;AAAA;AAAA;;AAAP;AAZO;;AAAW;;AAAX;AAeS;;AAAA;AAAA;;AAAA;AAAA;AAAT;;AAAA;AAAP;AACO;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAP;AAuGJ;;;AA1DO;;AARC;AAQD;AAAA;;;AAAA;;AAPC;AAOD;AAAA;;;AAAA;;AANC;;AAMD;AAAA;;;AAAA;;AALC;;AAKD;AAAA;;;AAAA;;AAJC;;AAID;AAAA;;;AACQ;AA6DX;;AA1DR;;AAAA;;;AAEmB;AAwDJ;;;AAtDJ;;AAAiB;;AAAjB;AAAA;;;AAAyC;;AAAiB;;AAAjB;AAAzC;;;AAIQ;;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;;AAkDJ;;;;AAAA;;;AA7CJ;;AAAiB;AAAjB;AAAX;;;AAEmB;;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;;AA2CJ;;;;AAAA;;;AArCJ;;AAAiB;;AAAjB;AAAX;;;AAEmB;;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;;AAmCJ;;;;AAAA;;;AA5BJ;;AAAiB;;AAAjB;AAAX;;;AAEmB;;AAAc;;AAAd;AA0BJ;;;AAxBA;AAwBA;;;AAkBH;AAAA;;AAAA;AAAA;AAAsB;AAAtB;AAAA;;;AACI;AAAA;;AAAA;AAAA;AADJ;;;;AADJ;;AAAA;AA8CJ;;;AASQ;;AAAA;;AAAA;AAAA;AAAA;;;AACG;AAAA;;AAAA;AAAA;AADH;;;AAEG;AAAA;;AAAA;AAAA;AAFH;;;AAIO;AAAP;;AAAA;;AAAA;AAEA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAHM;;;AAQN;AAAA;;AAAA;AAAA;AAHG;;AAAA;AAAA;;;AAAP;;AAAA;;AAAA;AA+DJ;;;AAMJ;;AAAA;;;AACY;;AAAA;AACU;AAAA;;AAAA;AAAA;AACV;AAAA;;AAAA;AAAA;AADmC;;AAAA;;AAAA;;;AAAzB;AAKd;AAAA;AAGI;AAAA;;AAAA;AAAA;AAFG;;AAAA;AAAA;;AAAA;;;AAAP;AAyIJ;;;;;;;;AAUW;;AAAA;AAAA;AAAkB;AAAA;AAAA;AAAA;AAAlB;AAAP;AACO;;AAAA;;AAAA;AAAwB;;AAAxB;AAAP;AAEa;;AAAA;AAAA;AAAA;AACI;AAAd;AAAA;AAAX;;;AA5ee;AAAA;AAAA;AAAA;AAAe;;AAAf;AA+eH;AAEI;AAAA;;AAAA;AAAA;AAA6B;AAAA;;AAAA;AAAA;AAA7B;AADJ;AAG6B;;AAAA;;AAAA;AAA7B;;AAAA;;AAAA;AACA;;AAAA;AAAA;AAC6B;;AAAA;;AAAA;AAA7B;;AAAA;AAAA;AACA;;AAAwB;AAAxB;AACiC;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAqB;AAArB;AAAA;AAAA;AAAA;AACA;AAAc;;AAAd;AA7LJ;;AAAA;AACO;AAAA;;AAAA;AAAA;AA6LH;;AAAA;AAGmB;AAHnB;;;;AAAA;;AAKA;;AAAA;;AAAA;;AAAA;AA/fG;AAAA;AAAA;AAAA;AAAe;;AAAf;AAYA;AAAP;AAsfA;AAAA;;AAAA;AAAA;AAAyB;;AAAA;;;AAAA;;AAAzB;AAAA;;AAAA;AAAA;AAEG;;AAAc;;AAAd;AAAX;;;AAIgB;;AAAA;;AAAA;AACA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAHY;;;AAMI;AAAA;;AAAA;AAAA;AAAhB;AAAA;;AAiFL;AAAA;;AAAA;AAAA;AAAA;;;AAAqC;AAAA;;AAAA;AAAA;AAAP;;AAAA;AAA9B;;;AACQ;AAAA;;AAAA;AAAA;AAAA;;AAAA;AACR;AAAA;;AAAA;AAAA;AAAA;;;AAAmC;AAAA;;AAAA;AAAA;AAAP;;AAAA;AAA5B;;;AACQ;AAAA;;AAAA;AAAA;AAAA;;AAAA;AArFP;;AAAA;;AAAA;AAYD;;AAAc;;AAAd;AAAX;;;AACyC;;AAAA;;AAAA;AAA7B;;AAAA;;AAAA;AACA;;AAAA;AAAA;AAKD;;;AAAX;;;AACe;;AAAc;;AAAd;AAAf;;;AAI2B;AAAA;AAAA;AAAA;AAA4B;AAAA;AAAA;AAAA;AAA5B;AACD;;AADA;AADF;;AAAA;AAFR;AAAA;;;AA9LU;AAAA;;AAAA;AAAA;AAAA;;AAAA;AACJ;AAAd;;AACwB;AAAxB;;AAEG;;AAAA;;AAAA;AAAA;AAAA;;AAAX;;;AAE8B;;AAAA;;AAAA;;;AAAA;AAAA;;AAKM;AAAxB;;;;AAEc;AAAA;AAAA;AAAA;AAAoB;AAApB;AAAA;;AACM;AAAA;AAAA;AAAA;AAAlB;;AAAA;AAAd;;;AAC2B;;AAAA;;;AAAA;AAAA;;AACK;AAAA;AAAA;AAAA;;AAEuB;;AAArB;AAAA;;;AAClB;;AAAqB;;AAArB;AAAA;;;AACI;;AAAA;;AAAA;AADJ;;;;AAGhB;;;AACA;;AAAA;;;AAC4C;AAAxB;;AAOR;;AAAmB;AAAnB;AAAA;;;;;AAHY;;AAAA;;AAAA;AAFc;;AAAA;AAAA;;;AAAA;AAAA;;AAIlB;;AAAA;AAAA;;;;;;;;;AAGZ;;AAAA;AACY;AAAA;;AAAA;AAAA;AACT;;AAAA;;AAAA;AAAc;AAAd;AAAX;;;AAEyB;AAAA;;AAAA;AAAA;AAAb;AAGA;AAAA;;AAAA;AAAA;AAFG;;AAAA;;;AA+JC;;AAAA;AAAA;AAKR;AAAA;AAAA;AAAA;AAAqB;AAArB;AAAA;AAAA;AAAA;AACA;;AAEW;AACQ;AAHnB;;;;AAAA;;;;;;;;;AAFqC;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;;;;AAjBC;;AAAc;;AAAd;AAAb;;;AAE6C;AAAA;;AAAA;AAAA;AAAjC;;AAAA;AAAA;;;;AAdC;;AAAc;;AAAd;AAAb;;;AACwB;;AAAA;;AAAA;AAAA;AAAA;;AACxB;;;AAC4B;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAChB;;AAAA;;AAAA;;;;AAEG;;AAAA;;AAAA;AAAA;AAAA;;AAAf;;;AACgB;;AAAA;;AAAA;;;;AAkCZ;;;AAUwB;;AACH;;AAAA;AAAA;AACE;;AAAA;;;AACI;;AAAA;;;AACJ;;AAGW;;AALX;AAKW;AA6BtC;;AAAA;;;AACmB;AA/BS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAIA;AAAA;;AAAA;AAAA;AACH;;AAAA;AAAiB;AAAjB;AAZb;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AADJ;;;;;;AAAA;AAAA;AAAA;;;;;;AAwCG;;AAAe;AAAf;AAAA;;;AAAA;;AAAsC;;AAAtC;AAAA;;;AACQ;AAhCC;;;AAiCL;;;AAjCK;;;AErpBhB;;;;;AAFW;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAGA;;;AACH;;AAAA;AAAA;AAAA;AAAA;AACG;;AAAA;AAAA;;AADH;AAAA;;;AAEG;;AAAA;AAAA;AAAA;AAAA;AADA;;AAAA;AADH;;;;AADJ;;AAAA;;;;;AAOyB;;AAbF;AAAA;;AAAA;AAAA;AAAhB;AAaP;;AAkBW;AAAA;;AAAA;AAAA;AAAJ;AAAP;;AAGW;AAAA;;AAAA;AAAA;AAAJ;AAAP;;AAEJ;;;AACW;;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;AAAA;;AAMH;;AANG;AAAA;;;AAAA;;AAOH;;AAPG;AAAA;;;;AAAP;;;", "op_pc_offset": 0, "pc_events": { "1": { @@ -19,9 +19,9 @@ "op": "intcblock 0 1 8 32 1500" }, "9": { - "op": "bytecblock 0x151f7c75 \"status\" \"event_cursor\" \"schedule_entry_count\" \"outstanding_principal\" \"fixed_point_scale\" \"accrued_interest\" \"interest_calculation_base\" 0x4123 \"nominal_interest_rate\" \"contract_type\" \"reserved_units_total\" \"reserved_principal\" \"total_units\" \"next_principal_redemption\" \"reserved_interest\" \"cumulative_interest_index\" \"cumulative_principal_index\" 0x523a41525223 \"settlement_asset_id\" \"initial_exchange_amount\" 0x523a41555423 0x523a50594423 0x523a4d4e4723 0x5323 0x523a4d4f4323 0x523a54525323 0x523a4f504423 \"initial_exchange_date\" \"transfer_opening_date\" \"transfer_closure_date\" \"rate_reset_floor\" \"rate_reset_cap\" \"asset_suspended\" \"dynamic_principal_redemption\" \"rate_reset_spread\" \"rate_reset_multiplier\" \"rate_reset_next\" \"has_rate_reset_floor\" \"has_rate_reset_cap\" 0x00 \"asset_defaulted\" \"prospectus_hash\" \"prospectus_url\" \"denomination_asset_id\" \"maturity_date\" \"day_count_convention\" \"defaulted\" 0x068101 0x0000" + "op": "bytecblock 0x151f7c75 \"status\" \"event_cursor\" \"schedule_entry_count\" \"outstanding_principal\" \"fixed_point_scale\" \"accrued_interest\" \"interest_calculation_base\" 0x4123 \"nominal_interest_rate\" \"contract_type\" \"reserved_units_total\" \"reserved_principal\" \"total_units\" \"next_principal_redemption\" \"reserved_interest\" \"cumulative_interest_index\" \"cumulative_principal_index\" 0x523a41525223 \"settlement_asset_id\" \"initial_exchange_amount\" 0x523a41555423 0x523a50594423 0x523a4d4e4723 0x5323 0x523a4d4f4323 0x523a54525323 0x523a4f504423 \"initial_exchange_date\" \"transfer_opening_date\" \"transfer_closure_date\" \"rate_reset_floor\" \"rate_reset_cap\" \"contract_suspended\" \"defaulted\" \"dynamic_principal_redemption\" \"rate_reset_spread\" \"rate_reset_multiplier\" \"rate_reset_next\" \"has_rate_reset_floor\" \"has_rate_reset_cap\" 0x00 \"prospectus_hash\" \"prospectus_url\" \"denomination_asset_id\" \"maturity_date\" \"day_count_convention\" 0x068101 0x0000" }, - "786": { + "773": { "op": "txn ApplicationID", "defined_out": [ "tmp%0#0" @@ -30,11 +30,11 @@ "tmp%0#0" ] }, - "788": { + "775": { "op": "bnz main_after_if_else@2", "stack_out": [] }, - "791": { + "778": { "op": "bytec 18 // 0x523a41525223", "defined_out": [ "0x523a41525223" @@ -43,7 +43,7 @@ "0x523a41525223" ] }, - "793": { + "780": { "op": "global ZeroAddress", "defined_out": [ "0x523a41525223", @@ -54,11 +54,11 @@ "tmp%0#3" ] }, - "795": { + "782": { "op": "app_global_put", "stack_out": [] }, - "796": { + "783": { "op": "bytec 27 // 0x523a4f504423", "defined_out": [ "0x523a4f504423" @@ -67,7 +67,7 @@ "0x523a4f504423" ] }, - "798": { + "785": { "op": "global ZeroAddress", "defined_out": [ "0x523a4f504423", @@ -78,55 +78,55 @@ "tmp%1#3" ] }, - "800": { + "787": { "op": "app_global_put", "stack_out": [] }, - "801": { - "op": "bytec 33 // \"asset_suspended\"", + "788": { + "op": "bytec 33 // \"contract_suspended\"", "defined_out": [ - "\"asset_suspended\"" + "\"contract_suspended\"" ], "stack_out": [ - "\"asset_suspended\"" + "\"contract_suspended\"" ] }, - "803": { + "790": { "op": "intc_0 // 0", "defined_out": [ - "\"asset_suspended\"", + "\"contract_suspended\"", "0" ], "stack_out": [ - "\"asset_suspended\"", + "\"contract_suspended\"", "0" ] }, - "804": { + "791": { "op": "app_global_put", "stack_out": [] }, - "805": { - "op": "bytec 41 // \"asset_defaulted\"", + "792": { + "op": "bytec 34 // \"defaulted\"", "defined_out": [ - "\"asset_defaulted\"" + "\"defaulted\"" ], "stack_out": [ - "\"asset_defaulted\"" + "\"defaulted\"" ] }, - "807": { + "794": { "op": "intc_0 // 0", "stack_out": [ - "\"asset_defaulted\"", + "\"defaulted\"", "0" ] }, - "808": { + "795": { "op": "app_global_put", "stack_out": [] }, - "809": { + "796": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"" @@ -135,18 +135,18 @@ "\"status\"" ] }, - "810": { + "797": { "op": "intc_0 // 0", "stack_out": [ "\"status\"", "0" ] }, - "811": { + "798": { "op": "app_global_put", "stack_out": [] }, - "812": { + "799": { "op": "bytec 10 // \"contract_type\"", "defined_out": [ "\"contract_type\"" @@ -155,18 +155,18 @@ "\"contract_type\"" ] }, - "814": { + "801": { "op": "intc_0 // 0", "stack_out": [ "\"contract_type\"", "0" ] }, - "815": { + "802": { "op": "app_global_put", "stack_out": [] }, - "816": { + "803": { "op": "bytec 42 // \"prospectus_hash\"", "defined_out": [ "\"prospectus_hash\"" @@ -175,7 +175,7 @@ "\"prospectus_hash\"" ] }, - "818": { + "805": { "op": "pushbytes 0x", "defined_out": [ "\"prospectus_hash\"", @@ -186,11 +186,11 @@ "0x" ] }, - "820": { + "807": { "op": "app_global_put", "stack_out": [] }, - "821": { + "808": { "op": "bytec 43 // \"prospectus_url\"", "defined_out": [ "\"prospectus_url\"" @@ -199,7 +199,7 @@ "\"prospectus_url\"" ] }, - "823": { + "810": { "op": "pushbytes \"\"", "defined_out": [ "\"\"", @@ -210,11 +210,11 @@ "\"\"" ] }, - "825": { + "812": { "op": "app_global_put", "stack_out": [] }, - "826": { + "813": { "op": "bytec 44 // \"denomination_asset_id\"", "defined_out": [ "\"denomination_asset_id\"" @@ -223,18 +223,18 @@ "\"denomination_asset_id\"" ] }, - "828": { + "815": { "op": "intc_0 // 0", "stack_out": [ "\"denomination_asset_id\"", "0" ] }, - "829": { + "816": { "op": "app_global_put", "stack_out": [] }, - "830": { + "817": { "op": "bytec 19 // \"settlement_asset_id\"", "defined_out": [ "\"settlement_asset_id\"" @@ -243,18 +243,18 @@ "\"settlement_asset_id\"" ] }, - "832": { + "819": { "op": "intc_0 // 0", "stack_out": [ "\"settlement_asset_id\"", "0" ] }, - "833": { + "820": { "op": "app_global_put", "stack_out": [] }, - "834": { + "821": { "op": "bytec 28 // \"initial_exchange_date\"", "defined_out": [ "\"initial_exchange_date\"" @@ -263,18 +263,18 @@ "\"initial_exchange_date\"" ] }, - "836": { + "823": { "op": "intc_0 // 0", "stack_out": [ "\"initial_exchange_date\"", "0" ] }, - "837": { + "824": { "op": "app_global_put", "stack_out": [] }, - "838": { + "825": { "op": "bytec 45 // \"maturity_date\"", "defined_out": [ "\"maturity_date\"" @@ -283,18 +283,18 @@ "\"maturity_date\"" ] }, - "840": { + "827": { "op": "intc_0 // 0", "stack_out": [ "\"maturity_date\"", "0" ] }, - "841": { + "828": { "op": "app_global_put", "stack_out": [] }, - "842": { + "829": { "op": "bytec 29 // \"transfer_opening_date\"", "defined_out": [ "\"transfer_opening_date\"" @@ -303,18 +303,18 @@ "\"transfer_opening_date\"" ] }, - "844": { + "831": { "op": "intc_0 // 0", "stack_out": [ "\"transfer_opening_date\"", "0" ] }, - "845": { + "832": { "op": "app_global_put", "stack_out": [] }, - "846": { + "833": { "op": "bytec 30 // \"transfer_closure_date\"", "defined_out": [ "\"transfer_closure_date\"" @@ -323,18 +323,18 @@ "\"transfer_closure_date\"" ] }, - "848": { + "835": { "op": "intc_0 // 0", "stack_out": [ "\"transfer_closure_date\"", "0" ] }, - "849": { + "836": { "op": "app_global_put", "stack_out": [] }, - "850": { + "837": { "op": "bytec 46 // \"day_count_convention\"", "defined_out": [ "\"day_count_convention\"" @@ -343,18 +343,18 @@ "\"day_count_convention\"" ] }, - "852": { + "839": { "op": "intc_0 // 0", "stack_out": [ "\"day_count_convention\"", "0" ] }, - "853": { + "840": { "op": "app_global_put", "stack_out": [] }, - "854": { + "841": { "op": "bytec 13 // \"total_units\"", "defined_out": [ "\"total_units\"" @@ -363,18 +363,18 @@ "\"total_units\"" ] }, - "856": { + "843": { "op": "intc_0 // 0", "stack_out": [ "\"total_units\"", "0" ] }, - "857": { + "844": { "op": "app_global_put", "stack_out": [] }, - "858": { + "845": { "op": "bytec 11 // \"reserved_units_total\"", "defined_out": [ "\"reserved_units_total\"" @@ -383,18 +383,18 @@ "\"reserved_units_total\"" ] }, - "860": { + "847": { "op": "intc_0 // 0", "stack_out": [ "\"reserved_units_total\"", "0" ] }, - "861": { + "848": { "op": "app_global_put", "stack_out": [] }, - "862": { + "849": { "op": "bytec 20 // \"initial_exchange_amount\"", "defined_out": [ "\"initial_exchange_amount\"" @@ -403,18 +403,18 @@ "\"initial_exchange_amount\"" ] }, - "864": { + "851": { "op": "intc_0 // 0", "stack_out": [ "\"initial_exchange_amount\"", "0" ] }, - "865": { + "852": { "op": "app_global_put", "stack_out": [] }, - "866": { + "853": { "op": "bytec 4 // \"outstanding_principal\"", "defined_out": [ "\"outstanding_principal\"" @@ -423,18 +423,18 @@ "\"outstanding_principal\"" ] }, - "868": { + "855": { "op": "intc_0 // 0", "stack_out": [ "\"outstanding_principal\"", "0" ] }, - "869": { + "856": { "op": "app_global_put", "stack_out": [] }, - "870": { + "857": { "op": "bytec 14 // \"next_principal_redemption\"", "defined_out": [ "\"next_principal_redemption\"" @@ -443,19 +443,19 @@ "\"next_principal_redemption\"" ] }, - "872": { + "859": { "op": "intc_0 // 0", "stack_out": [ "\"next_principal_redemption\"", "0" ] }, - "873": { + "860": { "op": "app_global_put", "stack_out": [] }, - "874": { - "op": "bytec 34 // \"dynamic_principal_redemption\"", + "861": { + "op": "bytec 35 // \"dynamic_principal_redemption\"", "defined_out": [ "\"dynamic_principal_redemption\"" ], @@ -463,18 +463,18 @@ "\"dynamic_principal_redemption\"" ] }, - "876": { + "863": { "op": "intc_0 // 0", "stack_out": [ "\"dynamic_principal_redemption\"", "0" ] }, - "877": { + "864": { "op": "app_global_put", "stack_out": [] }, - "878": { + "865": { "op": "bytec 7 // \"interest_calculation_base\"", "defined_out": [ "\"interest_calculation_base\"" @@ -483,18 +483,18 @@ "\"interest_calculation_base\"" ] }, - "880": { + "867": { "op": "intc_0 // 0", "stack_out": [ "\"interest_calculation_base\"", "0" ] }, - "881": { + "868": { "op": "app_global_put", "stack_out": [] }, - "882": { + "869": { "op": "bytec 6 // \"accrued_interest\"", "defined_out": [ "\"accrued_interest\"" @@ -503,18 +503,18 @@ "\"accrued_interest\"" ] }, - "884": { + "871": { "op": "intc_0 // 0", "stack_out": [ "\"accrued_interest\"", "0" ] }, - "885": { + "872": { "op": "app_global_put", "stack_out": [] }, - "886": { + "873": { "op": "bytec 9 // \"nominal_interest_rate\"", "defined_out": [ "\"nominal_interest_rate\"" @@ -523,19 +523,19 @@ "\"nominal_interest_rate\"" ] }, - "888": { + "875": { "op": "intc_0 // 0", "stack_out": [ "\"nominal_interest_rate\"", "0" ] }, - "889": { + "876": { "op": "app_global_put", "stack_out": [] }, - "890": { - "op": "bytec 35 // \"rate_reset_spread\"", + "877": { + "op": "bytec 36 // \"rate_reset_spread\"", "defined_out": [ "\"rate_reset_spread\"" ], @@ -543,19 +543,19 @@ "\"rate_reset_spread\"" ] }, - "892": { + "879": { "op": "intc_0 // 0", "stack_out": [ "\"rate_reset_spread\"", "0" ] }, - "893": { + "880": { "op": "app_global_put", "stack_out": [] }, - "894": { - "op": "bytec 36 // \"rate_reset_multiplier\"", + "881": { + "op": "bytec 37 // \"rate_reset_multiplier\"", "defined_out": [ "\"rate_reset_multiplier\"" ], @@ -563,18 +563,18 @@ "\"rate_reset_multiplier\"" ] }, - "896": { + "883": { "op": "intc_0 // 0", "stack_out": [ "\"rate_reset_multiplier\"", "0" ] }, - "897": { + "884": { "op": "app_global_put", "stack_out": [] }, - "898": { + "885": { "op": "bytec 31 // \"rate_reset_floor\"", "defined_out": [ "\"rate_reset_floor\"" @@ -583,18 +583,18 @@ "\"rate_reset_floor\"" ] }, - "900": { + "887": { "op": "intc_0 // 0", "stack_out": [ "\"rate_reset_floor\"", "0" ] }, - "901": { + "888": { "op": "app_global_put", "stack_out": [] }, - "902": { + "889": { "op": "bytec 32 // \"rate_reset_cap\"", "defined_out": [ "\"rate_reset_cap\"" @@ -603,19 +603,19 @@ "\"rate_reset_cap\"" ] }, - "904": { + "891": { "op": "intc_0 // 0", "stack_out": [ "\"rate_reset_cap\"", "0" ] }, - "905": { + "892": { "op": "app_global_put", "stack_out": [] }, - "906": { - "op": "bytec 37 // \"rate_reset_next\"", + "893": { + "op": "bytec 38 // \"rate_reset_next\"", "defined_out": [ "\"rate_reset_next\"" ], @@ -623,19 +623,19 @@ "\"rate_reset_next\"" ] }, - "908": { + "895": { "op": "intc_0 // 0", "stack_out": [ "\"rate_reset_next\"", "0" ] }, - "909": { + "896": { "op": "app_global_put", "stack_out": [] }, - "910": { - "op": "bytec 38 // \"has_rate_reset_floor\"", + "897": { + "op": "bytec 39 // \"has_rate_reset_floor\"", "defined_out": [ "\"has_rate_reset_floor\"" ], @@ -643,19 +643,19 @@ "\"has_rate_reset_floor\"" ] }, - "912": { + "899": { "op": "intc_0 // 0", "stack_out": [ "\"has_rate_reset_floor\"", "0" ] }, - "913": { + "900": { "op": "app_global_put", "stack_out": [] }, - "914": { - "op": "bytec 39 // \"has_rate_reset_cap\"", + "901": { + "op": "bytec 40 // \"has_rate_reset_cap\"", "defined_out": [ "\"has_rate_reset_cap\"" ], @@ -663,18 +663,18 @@ "\"has_rate_reset_cap\"" ] }, - "916": { + "903": { "op": "intc_0 // 0", "stack_out": [ "\"has_rate_reset_cap\"", "0" ] }, - "917": { + "904": { "op": "app_global_put", "stack_out": [] }, - "918": { + "905": { "op": "bytec 12 // \"reserved_principal\"", "defined_out": [ "\"reserved_principal\"" @@ -683,18 +683,18 @@ "\"reserved_principal\"" ] }, - "920": { + "907": { "op": "intc_0 // 0", "stack_out": [ "\"reserved_principal\"", "0" ] }, - "921": { + "908": { "op": "app_global_put", "stack_out": [] }, - "922": { + "909": { "op": "bytec 15 // \"reserved_interest\"", "defined_out": [ "\"reserved_interest\"" @@ -703,18 +703,18 @@ "\"reserved_interest\"" ] }, - "924": { + "911": { "op": "intc_0 // 0", "stack_out": [ "\"reserved_interest\"", "0" ] }, - "925": { + "912": { "op": "app_global_put", "stack_out": [] }, - "926": { + "913": { "op": "bytec 16 // \"cumulative_interest_index\"", "defined_out": [ "\"cumulative_interest_index\"" @@ -723,18 +723,18 @@ "\"cumulative_interest_index\"" ] }, - "928": { + "915": { "op": "intc_0 // 0", "stack_out": [ "\"cumulative_interest_index\"", "0" ] }, - "929": { + "916": { "op": "app_global_put", "stack_out": [] }, - "930": { + "917": { "op": "bytec 17 // \"cumulative_principal_index\"", "defined_out": [ "\"cumulative_principal_index\"" @@ -743,18 +743,18 @@ "\"cumulative_principal_index\"" ] }, - "932": { + "919": { "op": "intc_0 // 0", "stack_out": [ "\"cumulative_principal_index\"", "0" ] }, - "933": { + "920": { "op": "app_global_put", "stack_out": [] }, - "934": { + "921": { "op": "bytec_2 // \"event_cursor\"", "defined_out": [ "\"event_cursor\"" @@ -763,18 +763,18 @@ "\"event_cursor\"" ] }, - "935": { + "922": { "op": "intc_0 // 0", "stack_out": [ "\"event_cursor\"", "0" ] }, - "936": { + "923": { "op": "app_global_put", "stack_out": [] }, - "937": { + "924": { "op": "bytec_3 // \"schedule_entry_count\"", "defined_out": [ "\"schedule_entry_count\"" @@ -783,38 +783,18 @@ "\"schedule_entry_count\"" ] }, - "938": { + "925": { "op": "intc_0 // 0", "stack_out": [ "\"schedule_entry_count\"", "0" ] }, - "939": { - "op": "app_global_put", - "stack_out": [] - }, - "940": { - "op": "bytec 47 // \"defaulted\"", - "defined_out": [ - "\"defaulted\"" - ], - "stack_out": [ - "\"defaulted\"" - ] - }, - "942": { - "op": "intc_0 // 0", - "stack_out": [ - "\"defaulted\"", - "0" - ] - }, - "943": { + "926": { "op": "app_global_put", "stack_out": [] }, - "944": { + "927": { "op": "bytec 5 // \"fixed_point_scale\"", "defined_out": [ "\"fixed_point_scale\"" @@ -823,18 +803,18 @@ "\"fixed_point_scale\"" ] }, - "946": { + "929": { "op": "intc_0 // 0", "stack_out": [ "\"fixed_point_scale\"", "0" ] }, - "947": { + "930": { "op": "app_global_put", "stack_out": [] }, - "948": { + "931": { "op": "txn GlobalNumByteSlice", "defined_out": [ "tmp%0#2" @@ -843,7 +823,7 @@ "tmp%0#2" ] }, - "950": { + "933": { "op": "pushint 10", "defined_out": [ "10", @@ -854,7 +834,7 @@ "10" ] }, - "952": { + "935": { "op": "==", "defined_out": [ "tmp%1#2" @@ -863,12 +843,12 @@ "tmp%1#2" ] }, - "953": { + "936": { "error": "Wrong Global Bytes allocation", "op": "assert // Wrong Global Bytes allocation", "stack_out": [] }, - "954": { + "937": { "op": "txn GlobalNumUint", "defined_out": [ "tmp%2#1" @@ -877,7 +857,7 @@ "tmp%2#1" ] }, - "956": { + "939": { "op": "pushint 54", "defined_out": [ "54", @@ -888,7 +868,7 @@ "54" ] }, - "958": { + "941": { "op": "==", "defined_out": [ "tmp%3#1" @@ -897,12 +877,12 @@ "tmp%3#1" ] }, - "959": { + "942": { "error": "Wrong Global UInts allocation", "op": "assert // Wrong Global UInts allocation", "stack_out": [] }, - "960": { + "943": { "op": "txn LocalNumByteSlice", "defined_out": [ "tmp%4#1" @@ -911,7 +891,7 @@ "tmp%4#1" ] }, - "962": { + "945": { "op": "!", "defined_out": [ "tmp%5#0" @@ -920,12 +900,12 @@ "tmp%5#0" ] }, - "963": { + "946": { "error": "Wrong Local Bytes allocation", "op": "assert // Wrong Local Bytes allocation", "stack_out": [] }, - "964": { + "947": { "op": "txn LocalNumUint", "defined_out": [ "tmp%6#0" @@ -934,7 +914,7 @@ "tmp%6#0" ] }, - "966": { + "949": { "op": "!", "defined_out": [ "tmp%7#0" @@ -943,12 +923,12 @@ "tmp%7#0" ] }, - "967": { + "950": { "error": "Wrong Local UInts allocation", "op": "assert // Wrong Local UInts allocation", "stack_out": [] }, - "968": { + "951": { "block": "main_after_if_else@2", "stack_in": [], "op": "pushbytes 0x914f04eb // method \"contract_update()void\"", @@ -959,7 +939,7 @@ "Method(contract_update()void)" ] }, - "974": { + "957": { "op": "txna ApplicationArgs 0", "defined_out": [ "Method(contract_update()void)", @@ -970,11 +950,11 @@ "tmp%0#1" ] }, - "977": { + "960": { "op": "match main_contract_update_route@4", "stack_out": [] }, - "981": { + "964": { "block": "main_switch_case_next@5", "stack_in": [], "op": "txn OnCompletion", @@ -985,7 +965,7 @@ "tmp%6#0" ] }, - "983": { + "966": { "op": "!", "defined_out": [ "tmp%7#0" @@ -994,11 +974,11 @@ "tmp%7#0" ] }, - "984": { + "967": { "op": "assert", "stack_out": [] }, - "985": { + "968": { "op": "txn ApplicationID", "defined_out": [ "tmp%8#0" @@ -1007,12 +987,12 @@ "tmp%8#0" ] }, - "987": { + "970": { "op": "bz main_create_NoOp@33", "stack_out": [] }, - "990": { - "op": "pushbytess 0xb44618c8 0xe7832529 0x94388723 0x6c85e3ee 0xbdd1a944 0x7c0f1812 0x14fc10ef 0x74a7297f 0x09d4fe14 0x9a9bfa85 0x85eed33d 0xab2c0fc4 0xd9f225ac 0x9883505a 0xfb4d4428 0x8ea6e74c 0x02af557a 0x82f71b2d 0xef04f5d3 0xdf343550 0x3dbe80bd 0x1e3e48e7 0x010c8299 0x7406acd2 0x1a72a2ee // method \"fund_due_cashflows(uint64)(uint64,uint64,uint64,uint64,uint64)\", method \"claim_due_cashflows(address,byte[])(uint64,uint64,uint64,uint64,byte[])\", method \"transfer_set_schedule(uint64,uint64)uint64\", method \"primary_distribution(address,uint64)uint64\", method \"transfer(address,address,uint64)uint64\", method \"account_suspension(address,bool)uint64\", method \"account_open(address,address)uint64\", method \"account_update_payment_address(address,address)uint64\", method \"account_get_position(address)(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64)\", method \"contract_config((uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64),(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64),(byte[32],string))uint64\", method \"contract_schedule(uint64,bool,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[])uint64\", method \"contract_execute_ied()uint64\", method \"apply_non_cash_event(uint64,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64\", method \"append_observed_cash_event((uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64\", method \"contract_set_default_status(bool)uint64\", method \"contract_get_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)\", method \"contract_get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)\", method \"rbac_rotate_arranger(address)uint64\", method \"rbac_set_op_daemon(address)uint64\", method \"rbac_assign_role(uint8,address,(uint64,uint64))uint64\", method \"rbac_revoke_role(uint8,address)uint64\", method \"rbac_contract_suspension(bool)uint64\", method \"rbac_get_arranger()address\", method \"rbac_get_address_roles(address)(bool,bool,bool,bool,bool)\", method \"rbac_get_role_validity(uint8,address)(uint64,uint64)\"", + "973": { + "op": "pushbytess 0xb44618c8 0xe7832529 0x94388723 0x6c85e3ee 0xbdd1a944 0x7c0f1812 0x14fc10ef 0x74a7297f 0x09d4fe14 0x9a9bfa85 0x85eed33d 0xab2c0fc4 0xd9f225ac 0x9883505a 0x8ea6e74c 0x02af557a 0x82f71b2d 0xef04f5d3 0xdf343550 0x3dbe80bd 0x1e3e48e7 0x39241fa3 0x010c8299 0x7406acd2 0x1a72a2ee // method \"fund_due_cashflows(uint64)(uint64,uint64,uint64,uint64,uint64)\", method \"claim_due_cashflows(address,byte[])(uint64,uint64,uint64,uint64,byte[])\", method \"transfer_set_schedule(uint64,uint64)uint64\", method \"primary_distribution(address,uint64)uint64\", method \"transfer(address,address,uint64)uint64\", method \"account_suspension(address,bool)uint64\", method \"account_open(address,address)uint64\", method \"account_update_payment_address(address,address)uint64\", method \"account_get_position(address)(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64)\", method \"contract_config((uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64),(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64),(byte[32],string))uint64\", method \"contract_schedule(uint64,bool,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[])uint64\", method \"contract_execute_ied()uint64\", method \"apply_non_cash_event(uint64,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64\", method \"append_observed_cash_event((uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64\", method \"contract_get_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)\", method \"contract_get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)\", method \"rbac_rotate_arranger(address)uint64\", method \"rbac_set_op_daemon(address)uint64\", method \"rbac_assign_role(uint8,address,(uint64,uint64))uint64\", method \"rbac_revoke_role(uint8,address)uint64\", method \"rbac_contract_suspension(bool)uint64\", method \"rbac_contract_default(bool)uint64\", method \"rbac_get_arranger()address\", method \"rbac_get_address_roles(address)(bool,bool,bool,bool,bool)\", method \"rbac_get_role_validity(uint8,address)(uint64,uint64)\"", "defined_out": [ "Method(account_get_position(address)(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64))", "Method(account_open(address,address)uint64)", @@ -1026,10 +1006,10 @@ "Method(contract_get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64))", "Method(contract_get_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))", "Method(contract_schedule(uint64,bool,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[])uint64)", - "Method(contract_set_default_status(bool)uint64)", "Method(fund_due_cashflows(uint64)(uint64,uint64,uint64,uint64,uint64))", "Method(primary_distribution(address,uint64)uint64)", "Method(rbac_assign_role(uint8,address,(uint64,uint64))uint64)", + "Method(rbac_contract_default(bool)uint64)", "Method(rbac_contract_suspension(bool)uint64)", "Method(rbac_get_address_roles(address)(bool,bool,bool,bool,bool))", "Method(rbac_get_arranger()address)", @@ -1055,7 +1035,6 @@ "Method(contract_execute_ied()uint64)", "Method(apply_non_cash_event(uint64,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64)", "Method(append_observed_cash_event((uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64)", - "Method(contract_set_default_status(bool)uint64)", "Method(contract_get_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))", "Method(contract_get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64))", "Method(rbac_rotate_arranger(address)uint64)", @@ -1063,12 +1042,13 @@ "Method(rbac_assign_role(uint8,address,(uint64,uint64))uint64)", "Method(rbac_revoke_role(uint8,address)uint64)", "Method(rbac_contract_suspension(bool)uint64)", + "Method(rbac_contract_default(bool)uint64)", "Method(rbac_get_arranger()address)", "Method(rbac_get_address_roles(address)(bool,bool,bool,bool,bool))", "Method(rbac_get_role_validity(uint8,address)(uint64,uint64))" ] }, - "1117": { + "1100": { "op": "txna ApplicationArgs 0", "defined_out": [ "Method(account_get_position(address)(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64))", @@ -1083,10 +1063,10 @@ "Method(contract_get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64))", "Method(contract_get_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))", "Method(contract_schedule(uint64,bool,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[])uint64)", - "Method(contract_set_default_status(bool)uint64)", "Method(fund_due_cashflows(uint64)(uint64,uint64,uint64,uint64,uint64))", "Method(primary_distribution(address,uint64)uint64)", "Method(rbac_assign_role(uint8,address,(uint64,uint64))uint64)", + "Method(rbac_contract_default(bool)uint64)", "Method(rbac_contract_suspension(bool)uint64)", "Method(rbac_get_address_roles(address)(bool,bool,bool,bool,bool))", "Method(rbac_get_arranger()address)", @@ -1113,7 +1093,6 @@ "Method(contract_execute_ied()uint64)", "Method(apply_non_cash_event(uint64,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64)", "Method(append_observed_cash_event((uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64)", - "Method(contract_set_default_status(bool)uint64)", "Method(contract_get_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))", "Method(contract_get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64))", "Method(rbac_rotate_arranger(address)uint64)", @@ -1121,20 +1100,21 @@ "Method(rbac_assign_role(uint8,address,(uint64,uint64))uint64)", "Method(rbac_revoke_role(uint8,address)uint64)", "Method(rbac_contract_suspension(bool)uint64)", + "Method(rbac_contract_default(bool)uint64)", "Method(rbac_get_arranger()address)", "Method(rbac_get_address_roles(address)(bool,bool,bool,bool,bool))", "Method(rbac_get_role_validity(uint8,address)(uint64,uint64))", "tmp%10#0" ] }, - "1120": { - "op": "match fund_due_cashflows claim_due_cashflows transfer_set_schedule primary_distribution transfer account_suspension account_open account_update_payment_address account_get_position contract_config contract_schedule contract_execute_ied apply_non_cash_event append_observed_cash_event contract_set_default_status contract_get_state contract_get_next_due_event rbac_rotate_arranger rbac_set_op_daemon rbac_assign_role rbac_revoke_role rbac_contract_suspension rbac_get_arranger rbac_get_address_roles rbac_get_role_validity", + "1103": { + "op": "match fund_due_cashflows claim_due_cashflows transfer_set_schedule primary_distribution transfer account_suspension account_open account_update_payment_address account_get_position contract_config contract_schedule contract_execute_ied apply_non_cash_event append_observed_cash_event contract_get_state contract_get_next_due_event rbac_rotate_arranger rbac_set_op_daemon rbac_assign_role rbac_revoke_role rbac_contract_suspension rbac_contract_default rbac_get_arranger rbac_get_address_roles rbac_get_role_validity", "stack_out": [] }, - "1172": { + "1155": { "op": "err" }, - "1173": { + "1156": { "block": "main_create_NoOp@33", "stack_in": [], "op": "pushbytes 0x956d7156 // method \"contract_create(address)uint64\"", @@ -1145,7 +1125,7 @@ "Method(contract_create(address)uint64)" ] }, - "1179": { + "1162": { "op": "txna ApplicationArgs 0", "defined_out": [ "Method(contract_create(address)uint64)", @@ -1156,14 +1136,14 @@ "tmp%11#0" ] }, - "1182": { + "1165": { "op": "match contract_create", "stack_out": [] }, - "1186": { + "1169": { "op": "err" }, - "1187": { + "1170": { "block": "main_contract_update_route@4", "stack_in": [], "op": "txn OnCompletion", @@ -1174,7 +1154,7 @@ "tmp%1#1" ] }, - "1189": { + "1172": { "op": "pushint 4 // UpdateApplication", "defined_out": [ "UpdateApplication", @@ -1185,7 +1165,7 @@ "UpdateApplication" ] }, - "1191": { + "1174": { "op": "==", "defined_out": [ "tmp%2#0" @@ -1194,7 +1174,7 @@ "tmp%2#0" ] }, - "1192": { + "1175": { "op": "txn ApplicationID", "defined_out": [ "tmp%2#0", @@ -1205,7 +1185,7 @@ "tmp%3#0" ] }, - "1194": { + "1177": { "op": "&&", "defined_out": [ "tmp%5#0" @@ -1214,14 +1194,14 @@ "tmp%5#0" ] }, - "1195": { + "1178": { "op": "assert", "stack_out": [] }, - "1196": { + "1179": { "op": "b contract_update" }, - "1199": { + "1182": { "subroutine": "_puya_lib.util.ensure_budget", "params": { "required_budget#0": "uint64", @@ -1231,7 +1211,7 @@ "stack_in": [], "op": "proto 2 0" }, - "1202": { + "1185": { "op": "frame_dig -2", "defined_out": [ "required_budget#0 (copy)" @@ -1240,7 +1220,7 @@ "required_budget#0 (copy)" ] }, - "1204": { + "1187": { "op": "pushint 10", "defined_out": [ "10", @@ -1251,7 +1231,7 @@ "10" ] }, - "1206": { + "1189": { "op": "+", "defined_out": [ "required_budget_with_buffer#0" @@ -1260,7 +1240,7 @@ "required_budget_with_buffer#0" ] }, - "1207": { + "1190": { "block": "ensure_budget_while_top@1", "stack_in": [ "required_budget_with_buffer#0" @@ -1274,7 +1254,7 @@ "required_budget_with_buffer#0" ] }, - "1209": { + "1192": { "op": "global OpcodeBudget", "defined_out": [ "required_budget_with_buffer#0", @@ -1286,7 +1266,7 @@ "tmp%1#0" ] }, - "1211": { + "1194": { "op": ">", "defined_out": [ "required_budget_with_buffer#0", @@ -1297,16 +1277,16 @@ "tmp%2#0" ] }, - "1212": { + "1195": { "op": "bz ensure_budget_after_while@6", "stack_out": [ "required_budget_with_buffer#0" ] }, - "1215": { + "1198": { "op": "itxn_begin" }, - "1216": { + "1199": { "op": "pushint 6 // appl", "defined_out": [ "appl", @@ -1317,13 +1297,13 @@ "appl" ] }, - "1218": { + "1201": { "op": "itxn_field TypeEnum", "stack_out": [ "required_budget_with_buffer#0" ] }, - "1220": { + "1203": { "op": "pushint 5 // DeleteApplication", "defined_out": [ "DeleteApplication", @@ -1334,14 +1314,14 @@ "DeleteApplication" ] }, - "1222": { + "1205": { "op": "itxn_field OnCompletion", "stack_out": [ "required_budget_with_buffer#0" ] }, - "1224": { - "op": "bytec 48 // 0x068101", + "1207": { + "op": "bytec 47 // 0x068101", "defined_out": [ "0x068101", "required_budget_with_buffer#0" @@ -1351,26 +1331,26 @@ "0x068101" ] }, - "1226": { + "1209": { "op": "itxn_field ApprovalProgram", "stack_out": [ "required_budget_with_buffer#0" ] }, - "1228": { - "op": "bytec 48 // 0x068101", + "1211": { + "op": "bytec 47 // 0x068101", "stack_out": [ "required_budget_with_buffer#0", "0x068101" ] }, - "1230": { + "1213": { "op": "itxn_field ClearStateProgram", "stack_out": [ "required_budget_with_buffer#0" ] }, - "1232": { + "1215": { "op": "frame_dig -1", "defined_out": [ "fee_source#0 (copy)", @@ -1381,23 +1361,23 @@ "fee_source#0 (copy)" ] }, - "1234": { + "1217": { "op": "switch ensure_budget_switch_case_0@3 ensure_budget_switch_case_1@4", "stack_out": [ "required_budget_with_buffer#0" ] }, - "1240": { + "1223": { "block": "ensure_budget_switch_case_next@5", "stack_in": [ "required_budget_with_buffer#0" ], "op": "itxn_submit" }, - "1241": { + "1224": { "op": "b ensure_budget_while_top@1" }, - "1244": { + "1227": { "block": "ensure_budget_switch_case_1@4", "stack_in": [ "required_budget_with_buffer#0" @@ -1411,16 +1391,16 @@ "tmp%3#0" ] }, - "1246": { + "1229": { "op": "itxn_field Fee", "stack_out": [ "required_budget_with_buffer#0" ] }, - "1248": { + "1231": { "op": "b ensure_budget_switch_case_next@5" }, - "1251": { + "1234": { "block": "ensure_budget_switch_case_0@3", "stack_in": [ "required_budget_with_buffer#0" @@ -1434,16 +1414,16 @@ "0" ] }, - "1252": { + "1235": { "op": "itxn_field Fee", "stack_out": [ "required_budget_with_buffer#0" ] }, - "1254": { + "1237": { "op": "b ensure_budget_switch_case_next@5" }, - "1257": { + "1240": { "block": "ensure_budget_after_while@6", "stack_in": [ "required_budget_with_buffer#0" @@ -1451,7 +1431,7 @@ "retsub": true, "op": "retsub" }, - "1258": { + "1241": { "subroutine": "modules.payment_agent.PaymentAgent.fund_due_cashflows[routing]", "params": {}, "block": "fund_due_cashflows", @@ -1461,14 +1441,14 @@ "entry#0" ] }, - "1259": { + "1242": { "op": "pushbytes \"\"", "stack_out": [ "entry#0", "event_type#0" ] }, - "1261": { + "1244": { "op": "dupn 13", "stack_out": [ "entry#0", @@ -1488,7 +1468,7 @@ "values%0#0" ] }, - "1263": { + "1246": { "op": "txna ApplicationArgs 1", "defined_out": [ "tmp%0#0" @@ -1512,7 +1492,7 @@ "tmp%0#0" ] }, - "1266": { + "1249": { "op": "dup", "defined_out": [ "tmp%0#0", @@ -1538,7 +1518,7 @@ "tmp%0#0 (copy)" ] }, - "1267": { + "1250": { "op": "len", "defined_out": [ "len%0#0", @@ -1564,7 +1544,7 @@ "len%0#0" ] }, - "1268": { + "1251": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -1592,7 +1572,7 @@ "8" ] }, - "1269": { + "1252": { "op": "==", "defined_out": [ "eq%0#0", @@ -1618,7 +1598,7 @@ "eq%0#0" ] }, - "1270": { + "1253": { "error": "invalid number of bytes for arc4.uint64", "op": "assert // invalid number of bytes for arc4.uint64", "stack_out": [ @@ -1640,7 +1620,7 @@ "tmp%0#0" ] }, - "1271": { + "1254": { "op": "btoi", "defined_out": [ "max_event_count#0" @@ -1664,7 +1644,7 @@ "max_event_count#0" ] }, - "1272": { + "1255": { "op": "intc_0 // 0", "stack_out": [ "entry#0", @@ -1686,7 +1666,7 @@ "0" ] }, - "1273": { + "1256": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"", @@ -1714,7 +1694,7 @@ "\"status\"" ] }, - "1274": { + "1257": { "op": "app_global_get_ex", "defined_out": [ "max_event_count#0", @@ -1742,7 +1722,7 @@ "maybe_exists%0#0" ] }, - "1275": { + "1258": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ @@ -1765,7 +1745,7 @@ "maybe_value%0#0" ] }, - "1276": { + "1259": { "error": "D-ASA not configured", "op": "assert // D-ASA not configured", "stack_out": [ @@ -1787,19 +1767,19 @@ "max_event_count#0" ] }, - "1277": { + "1260": { "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", "op": "callsub _assert_caller_is_arranger" }, - "1280": { + "1263": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", "op": "callsub _assert_is_not_asset_defaulted" }, - "1283": { + "1266": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_suspended", "op": "callsub _assert_is_not_asset_suspended" }, - "1286": { + "1269": { "op": "intc_0 // 0", "stack_out": [ "entry#0", @@ -1821,7 +1801,7 @@ "0" ] }, - "1287": { + "1270": { "op": "bytec_1 // \"status\"", "stack_out": [ "entry#0", @@ -1844,7 +1824,7 @@ "\"status\"" ] }, - "1288": { + "1271": { "op": "app_global_get_ex", "stack_out": [ "entry#0", @@ -1867,7 +1847,7 @@ "maybe_exists%0#0" ] }, - "1289": { + "1272": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ @@ -1890,7 +1870,7 @@ "maybe_value%0#0" ] }, - "1290": { + "1273": { "op": "pushint 50", "defined_out": [ "50", @@ -1918,7 +1898,7 @@ "50" ] }, - "1292": { + "1275": { "op": "==", "defined_out": [ "max_event_count#0", @@ -1944,7 +1924,7 @@ "tmp%0#1" ] }, - "1293": { + "1276": { "op": "!", "defined_out": [ "max_event_count#0", @@ -1971,7 +1951,7 @@ "tmp%1#4" ] }, - "1294": { + "1277": { "error": "IED not yet executed", "op": "assert // IED not yet executed", "stack_out": [ @@ -1993,7 +1973,7 @@ "max_event_count#0" ] }, - "1295": { + "1278": { "callsub": "modules.actus_kernel.ActusKernelModule._is_dynamic_annuity", "op": "callsub _is_dynamic_annuity", "stack_out": [ @@ -2016,7 +1996,7 @@ "tmp%0#1" ] }, - "1298": { + "1281": { "op": "bz fund_due_cashflows_after_if_else@3", "stack_out": [ "entry#0", @@ -2037,7 +2017,7 @@ "max_event_count#0" ] }, - "1301": { + "1284": { "op": "dup", "stack_out": [ "entry#0", @@ -2059,7 +2039,7 @@ "max_event_count#0" ] }, - "1302": { + "1285": { "op": "pushint 100", "defined_out": [ "100", @@ -2087,7 +2067,7 @@ "100" ] }, - "1304": { + "1287": { "op": "*", "defined_out": [ "max_event_count#0", @@ -2114,7 +2094,7 @@ "tmp%1#1" ] }, - "1305": { + "1288": { "op": "intc 4 // 1500", "defined_out": [ "1500", @@ -2143,7 +2123,7 @@ "1500" ] }, - "1307": { + "1290": { "op": "+", "defined_out": [ "max_event_count#0", @@ -2170,7 +2150,7 @@ "tmp%2#1" ] }, - "1308": { + "1291": { "op": "intc_0 // 0", "stack_out": [ "entry#0", @@ -2193,7 +2173,7 @@ "0" ] }, - "1309": { + "1292": { "callsub": "_puya_lib.util.ensure_budget", "op": "callsub ensure_budget", "stack_out": [ @@ -2215,7 +2195,7 @@ "max_event_count#0" ] }, - "1312": { + "1295": { "block": "fund_due_cashflows_after_if_else@3", "stack_in": [ "entry#0", @@ -2259,7 +2239,7 @@ "processed_events#0" ] }, - "1313": { + "1296": { "op": "bury 5", "defined_out": [ "processed_events#0" @@ -2283,7 +2263,7 @@ "max_event_count#0" ] }, - "1315": { + "1298": { "op": "intc_0 // 0", "defined_out": [ "funded_interest#0", @@ -2309,7 +2289,7 @@ "funded_interest#0" ] }, - "1316": { + "1299": { "op": "bury 14", "defined_out": [ "funded_interest#0", @@ -2334,7 +2314,7 @@ "max_event_count#0" ] }, - "1318": { + "1301": { "op": "intc_0 // 0", "defined_out": [ "funded_interest#0", @@ -2361,7 +2341,7 @@ "funded_principal#0" ] }, - "1319": { + "1302": { "op": "bury 13", "defined_out": [ "funded_interest#0", @@ -2387,7 +2367,7 @@ "max_event_count#0" ] }, - "1321": { + "1304": { "block": "fund_due_cashflows_while_top@4", "stack_in": [ "entry#0", @@ -2431,7 +2411,7 @@ "processed_events#0" ] }, - "1323": { + "1306": { "op": "dig 1", "defined_out": [ "max_event_count#0", @@ -2458,7 +2438,7 @@ "max_event_count#0" ] }, - "1325": { + "1308": { "op": "<", "defined_out": [ "max_event_count#0", @@ -2485,7 +2465,7 @@ "tmp%3#1" ] }, - "1326": { + "1309": { "op": "bz fund_due_cashflows_after_while@11", "stack_out": [ "entry#0", @@ -2506,7 +2486,7 @@ "max_event_count#0" ] }, - "1329": { + "1312": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -2533,7 +2513,7 @@ "0" ] }, - "1330": { + "1313": { "op": "bytec_2 // \"event_cursor\"", "defined_out": [ "\"event_cursor\"", @@ -2562,7 +2542,7 @@ "\"event_cursor\"" ] }, - "1331": { + "1314": { "op": "app_global_get_ex", "defined_out": [ "max_event_count#0", @@ -2591,7 +2571,7 @@ "maybe_exists%0#0" ] }, - "1332": { + "1315": { "error": "check self.event_cursor exists", "op": "assert // check self.event_cursor exists", "stack_out": [ @@ -2614,7 +2594,7 @@ "maybe_value%0#0" ] }, - "1333": { + "1316": { "op": "intc_0 // 0", "stack_out": [ "entry#0", @@ -2637,7 +2617,7 @@ "0" ] }, - "1334": { + "1317": { "op": "bytec_3 // \"schedule_entry_count\"", "defined_out": [ "\"schedule_entry_count\"", @@ -2668,7 +2648,7 @@ "\"schedule_entry_count\"" ] }, - "1335": { + "1318": { "op": "app_global_get_ex", "defined_out": [ "max_event_count#0", @@ -2699,7 +2679,7 @@ "maybe_exists%1#0" ] }, - "1336": { + "1319": { "error": "check self.schedule_entry_count exists", "op": "assert // check self.schedule_entry_count exists", "stack_out": [ @@ -2723,7 +2703,7 @@ "maybe_value%1#0" ] }, - "1337": { + "1320": { "op": "<", "defined_out": [ "max_event_count#0", @@ -2750,7 +2730,7 @@ "tmp%4#0" ] }, - "1338": { + "1321": { "op": "bz fund_due_cashflows_after_while@11", "stack_out": [ "entry#0", @@ -2771,7 +2751,7 @@ "max_event_count#0" ] }, - "1341": { + "1324": { "op": "intc_0 // 0", "stack_out": [ "entry#0", @@ -2793,7 +2773,7 @@ "0" ] }, - "1342": { + "1325": { "op": "bytec_2 // \"event_cursor\"", "stack_out": [ "entry#0", @@ -2816,7 +2796,7 @@ "\"event_cursor\"" ] }, - "1343": { + "1326": { "op": "app_global_get_ex", "defined_out": [ "max_event_count#0", @@ -2845,7 +2825,7 @@ "maybe_exists%2#0" ] }, - "1344": { + "1327": { "error": "check self.event_cursor exists", "op": "assert // check self.event_cursor exists", "stack_out": [ @@ -2868,7 +2848,7 @@ "maybe_value%2#0" ] }, - "1345": { + "1328": { "callsub": "modules.actus_kernel.ActusKernelModule._get_schedule_entry", "op": "callsub _get_schedule_entry", "defined_out": [ @@ -2896,7 +2876,7 @@ "entry#0" ] }, - "1348": { + "1331": { "op": "dup", "stack_out": [ "entry#0", @@ -2919,7 +2899,7 @@ "entry#0" ] }, - "1349": { + "1332": { "op": "bury 17", "defined_out": [ "entry#0", @@ -2946,7 +2926,7 @@ "entry#0" ] }, - "1351": { + "1334": { "op": "pushint 9", "defined_out": [ "9", @@ -2975,7 +2955,7 @@ "9" ] }, - "1353": { + "1336": { "op": "extract_uint64", "defined_out": [ "entry#0", @@ -3003,7 +2983,7 @@ "values%0#0" ] }, - "1354": { + "1337": { "op": "dup", "stack_out": [ "entry#0", @@ -3026,7 +3006,7 @@ "values%0#0" ] }, - "1355": { + "1338": { "op": "bury 3", "defined_out": [ "entry#0", @@ -3054,7 +3034,7 @@ "values%0#0" ] }, - "1357": { + "1340": { "op": "global LatestTimestamp", "defined_out": [ "entry#0", @@ -3084,7 +3064,7 @@ "tmp%6#0" ] }, - "1359": { + "1342": { "op": ">", "defined_out": [ "entry#0", @@ -3113,7 +3093,7 @@ "tmp%7#0" ] }, - "1360": { + "1343": { "op": "bnz fund_due_cashflows_after_while@11", "stack_out": [ "entry#0", @@ -3134,7 +3114,7 @@ "max_event_count#0" ] }, - "1363": { + "1346": { "op": "dig 15", "stack_out": [ "entry#0", @@ -3156,7 +3136,7 @@ "entry#0" ] }, - "1365": { + "1348": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -3186,7 +3166,7 @@ "8" ] }, - "1366": { + "1349": { "op": "getbyte", "defined_out": [ "entry#0", @@ -3215,7 +3195,7 @@ "event_type#0" ] }, - "1367": { + "1350": { "op": "dup", "stack_out": [ "entry#0", @@ -3238,7 +3218,7 @@ "event_type#0" ] }, - "1368": { + "1351": { "op": "bury 16", "defined_out": [ "entry#0", @@ -3267,7 +3247,7 @@ "event_type#0" ] }, - "1370": { + "1353": { "op": "intc_2 // 8", "stack_out": [ "entry#0", @@ -3290,7 +3270,7 @@ "8" ] }, - "1371": { + "1354": { "op": "==", "defined_out": [ "entry#0", @@ -3320,7 +3300,7 @@ "tmp%0#1" ] }, - "1372": { + "1355": { "op": "dup", "stack_out": [ "entry#0", @@ -3343,7 +3323,7 @@ "tmp%0#1" ] }, - "1373": { + "1356": { "op": "bury 4", "defined_out": [ "entry#0", @@ -3373,7 +3353,7 @@ "tmp%0#1" ] }, - "1375": { + "1358": { "op": "bnz fund_due_cashflows_bool_true@52", "stack_out": [ "entry#0", @@ -3394,7 +3374,7 @@ "max_event_count#0" ] }, - "1378": { + "1361": { "op": "dig 14", "stack_out": [ "entry#0", @@ -3416,7 +3396,7 @@ "event_type#0" ] }, - "1380": { + "1363": { "op": "pushint 3", "defined_out": [ "3", @@ -3448,7 +3428,7 @@ "3" ] }, - "1382": { + "1365": { "op": "==", "defined_out": [ "entry#0", @@ -3479,7 +3459,7 @@ "tmp%1#4" ] }, - "1383": { + "1366": { "op": "bnz fund_due_cashflows_bool_true@52", "stack_out": [ "entry#0", @@ -3500,7 +3480,7 @@ "max_event_count#0" ] }, - "1386": { + "1369": { "op": "dig 14", "stack_out": [ "entry#0", @@ -3522,7 +3502,7 @@ "event_type#0" ] }, - "1388": { + "1371": { "op": "pushint 19", "defined_out": [ "19", @@ -3554,7 +3534,7 @@ "19" ] }, - "1390": { + "1373": { "op": "==", "defined_out": [ "entry#0", @@ -3585,7 +3565,7 @@ "tmp%2#2" ] }, - "1391": { + "1374": { "op": "bz fund_due_cashflows_bool_false@53", "stack_out": [ "entry#0", @@ -3606,7 +3586,7 @@ "max_event_count#0" ] }, - "1394": { + "1377": { "block": "fund_due_cashflows_bool_true@52", "stack_in": [ "entry#0", @@ -3650,7 +3630,7 @@ "or_result%0#0" ] }, - "1395": { + "1378": { "block": "fund_due_cashflows_bool_merge@54", "stack_in": [ "entry#0", @@ -3692,7 +3672,7 @@ "max_event_count#0" ] }, - "1398": { + "1381": { "op": "dig 15", "defined_out": [ "entry#0" @@ -3717,7 +3697,7 @@ "entry#0" ] }, - "1400": { + "1383": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -3744,7 +3724,7 @@ "0" ] }, - "1401": { + "1384": { "op": "extract_uint64", "defined_out": [ "entry#0", @@ -3770,7 +3750,7 @@ "values%0#1" ] }, - "1402": { + "1385": { "op": "intc_0 // 0", "stack_out": [ "entry#0", @@ -3793,7 +3773,7 @@ "0" ] }, - "1403": { + "1386": { "op": "bytec_2 // \"event_cursor\"", "defined_out": [ "\"event_cursor\"", @@ -3823,7 +3803,7 @@ "\"event_cursor\"" ] }, - "1404": { + "1387": { "op": "app_global_get_ex", "defined_out": [ "entry#0", @@ -3853,7 +3833,7 @@ "maybe_exists%0#0" ] }, - "1405": { + "1388": { "error": "check self.event_cursor exists", "op": "assert // check self.event_cursor exists", "stack_out": [ @@ -3877,7 +3857,7 @@ "maybe_value%0#0" ] }, - "1406": { + "1389": { "op": "==", "defined_out": [ "entry#0", @@ -3903,7 +3883,7 @@ "tmp%0#2" ] }, - "1407": { + "1390": { "error": "Invalid event cursor", "op": "assert // Invalid event cursor", "stack_out": [ @@ -3925,7 +3905,7 @@ "max_event_count#0" ] }, - "1408": { + "1391": { "op": "dig 1", "defined_out": [ "entry#0", @@ -3951,7 +3931,7 @@ "values%0#0" ] }, - "1410": { + "1393": { "op": "global LatestTimestamp", "defined_out": [ "entry#0", @@ -3979,7 +3959,7 @@ "tmp%1#1" ] }, - "1412": { + "1395": { "op": "<=", "defined_out": [ "entry#0", @@ -4006,7 +3986,7 @@ "tmp%2#2" ] }, - "1413": { + "1396": { "error": "No due cashflow to pay", "op": "assert // No due cashflow to pay", "stack_out": [ @@ -4028,7 +4008,7 @@ "max_event_count#0" ] }, - "1414": { + "1397": { "op": "dig 2", "defined_out": [ "entry#0", @@ -4055,7 +4035,7 @@ "tmp%0#1" ] }, - "1416": { + "1399": { "op": "bnz fund_due_cashflows_after_if_else@15", "stack_out": [ "entry#0", @@ -4076,7 +4056,7 @@ "max_event_count#0" ] }, - "1419": { + "1402": { "op": "dig 14", "defined_out": [ "entry#0", @@ -4104,7 +4084,7 @@ "event_type#0" ] }, - "1421": { + "1404": { "op": "pushint 19", "defined_out": [ "19", @@ -4134,7 +4114,7 @@ "19" ] }, - "1423": { + "1406": { "op": "==", "stack_out": [ "entry#0", @@ -4156,7 +4136,7 @@ "tmp%2#2" ] }, - "1424": { + "1407": { "op": "bnz fund_due_cashflows_after_if_else@15", "stack_out": [ "entry#0", @@ -4177,7 +4157,7 @@ "max_event_count#0" ] }, - "1427": { + "1410": { "op": "intc_0 // 0", "defined_out": [ "entry#0", @@ -4206,7 +4186,7 @@ "interest_amount_due#0" ] }, - "1428": { + "1411": { "op": "bury 11", "defined_out": [ "entry#0", @@ -4234,7 +4214,7 @@ "max_event_count#0" ] }, - "1430": { + "1413": { "block": "fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_interest_amount@16", "stack_in": [ "entry#0", @@ -4278,7 +4258,7 @@ "entry#0" ] }, - "1432": { + "1415": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -4305,7 +4285,7 @@ "8" ] }, - "1433": { + "1416": { "op": "getbyte", "defined_out": [ "entry#0", @@ -4331,7 +4311,7 @@ "event_type#0" ] }, - "1434": { + "1417": { "op": "dup", "stack_out": [ "entry#0", @@ -4354,7 +4334,7 @@ "event_type#0" ] }, - "1435": { + "1418": { "op": "bury 16", "defined_out": [ "entry#0", @@ -4380,7 +4360,7 @@ "event_type#0" ] }, - "1437": { + "1420": { "op": "pushint 3", "defined_out": [ "3", @@ -4408,7 +4388,7 @@ "3" ] }, - "1439": { + "1422": { "op": "==", "defined_out": [ "entry#0", @@ -4435,7 +4415,7 @@ "tmp%1#4" ] }, - "1440": { + "1423": { "op": "bnz fund_due_cashflows_after_if_else@19", "stack_out": [ "entry#0", @@ -4456,7 +4436,7 @@ "max_event_count#0" ] }, - "1443": { + "1426": { "op": "dig 14", "stack_out": [ "entry#0", @@ -4478,7 +4458,7 @@ "event_type#0" ] }, - "1445": { + "1428": { "op": "pushint 19", "defined_out": [ "19", @@ -4506,7 +4486,7 @@ "19" ] }, - "1447": { + "1430": { "op": "==", "defined_out": [ "entry#0", @@ -4533,7 +4513,7 @@ "tmp%2#2" ] }, - "1448": { + "1431": { "op": "bnz fund_due_cashflows_after_if_else@19", "stack_out": [ "entry#0", @@ -4554,7 +4534,7 @@ "max_event_count#0" ] }, - "1451": { + "1434": { "op": "intc_0 // 0", "defined_out": [ "entry#0", @@ -4581,7 +4561,7 @@ "principal_amount_due#0" ] }, - "1452": { + "1435": { "op": "bury 6", "defined_out": [ "entry#0", @@ -4607,7 +4587,7 @@ "max_event_count#0" ] }, - "1454": { + "1437": { "block": "fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@28", "stack_in": [ "entry#0", @@ -4651,7 +4631,7 @@ "entry#0" ] }, - "1456": { + "1439": { "op": "pushint 49", "defined_out": [ "49", @@ -4678,7 +4658,7 @@ "49" ] }, - "1458": { + "1441": { "op": "extract_uint64", "defined_out": [ "entry#0", @@ -4704,7 +4684,7 @@ "next_outstanding_principal#0" ] }, - "1459": { + "1442": { "op": "bury 8", "defined_out": [ "entry#0", @@ -4729,7 +4709,7 @@ "max_event_count#0" ] }, - "1461": { + "1444": { "callsub": "modules.actus_kernel.ActusKernelModule._is_dynamic_annuity", "op": "callsub _is_dynamic_annuity", "defined_out": [ @@ -4757,7 +4737,7 @@ "tmp%3#1" ] }, - "1464": { + "1447": { "op": "bnz fund_due_cashflows_if_body@29", "stack_out": [ "entry#0", @@ -4778,7 +4758,7 @@ "max_event_count#0" ] }, - "1467": { + "1450": { "op": "dig 7", "defined_out": [ "entry#0", @@ -4805,7 +4785,7 @@ "next_interest_base#2" ] }, - "1469": { + "1452": { "op": "bury 9", "defined_out": [ "entry#0", @@ -4831,7 +4811,7 @@ "max_event_count#0" ] }, - "1471": { + "1454": { "block": "fund_due_cashflows_after_if_else@38", "stack_in": [ "entry#0", @@ -4875,7 +4855,7 @@ "interest_amount_due#0" ] }, - "1473": { + "1456": { "callsub": "modules.actus_kernel.ActusKernelModule._amount_to_index_delta", "op": "callsub _amount_to_index_delta", "defined_out": [ @@ -4902,7 +4882,7 @@ "interest_index_delta#0" ] }, - "1476": { + "1459": { "op": "dig 6", "defined_out": [ "interest_amount_due#0", @@ -4930,7 +4910,7 @@ "principal_amount_due#0" ] }, - "1478": { + "1461": { "callsub": "modules.actus_kernel.ActusKernelModule._amount_to_index_delta", "op": "callsub _amount_to_index_delta", "defined_out": [ @@ -4960,7 +4940,7 @@ "principal_index_delta#0" ] }, - "1481": { + "1464": { "op": "dig 1", "defined_out": [ "interest_amount_due#0", @@ -4991,7 +4971,7 @@ "interest_index_delta#0 (copy)" ] }, - "1483": { + "1466": { "callsub": "modules.actus_kernel.ActusKernelModule._index_delta_to_amount", "op": "callsub _index_delta_to_amount", "defined_out": [ @@ -5023,7 +5003,7 @@ "interest_amount#1" ] }, - "1486": { + "1469": { "op": "dup", "stack_out": [ "entry#0", @@ -5048,7 +5028,7 @@ "interest_amount#1 (copy)" ] }, - "1487": { + "1470": { "op": "cover 2", "stack_out": [ "entry#0", @@ -5073,7 +5053,7 @@ "interest_amount#1" ] }, - "1489": { + "1472": { "op": "bury 15", "defined_out": [ "interest_amount#1", @@ -5104,7 +5084,7 @@ "principal_index_delta#0" ] }, - "1491": { + "1474": { "op": "dup", "defined_out": [ "interest_amount#1", @@ -5137,7 +5117,7 @@ "principal_index_delta#0 (copy)" ] }, - "1492": { + "1475": { "callsub": "modules.actus_kernel.ActusKernelModule._index_delta_to_amount", "op": "callsub _index_delta_to_amount", "defined_out": [ @@ -5171,7 +5151,7 @@ "principal_amount#1" ] }, - "1495": { + "1478": { "op": "dup", "stack_out": [ "entry#0", @@ -5197,7 +5177,7 @@ "principal_amount#1" ] }, - "1496": { + "1479": { "op": "bury 11", "defined_out": [ "interest_amount#1", @@ -5230,7 +5210,7 @@ "principal_amount#1" ] }, - "1498": { + "1481": { "op": "dig 2", "defined_out": [ "interest_amount#1", @@ -5265,7 +5245,7 @@ "interest_amount#1 (copy)" ] }, - "1500": { + "1483": { "op": "dig 1", "defined_out": [ "interest_amount#1", @@ -5302,7 +5282,7 @@ "principal_amount#1 (copy)" ] }, - "1502": { + "1485": { "op": "+", "defined_out": [ "interest_amount#1", @@ -5337,7 +5317,7 @@ "required_amount#0" ] }, - "1503": { + "1486": { "op": "dup", "stack_out": [ "entry#0", @@ -5364,7 +5344,7 @@ "required_amount#0" ] }, - "1504": { + "1487": { "op": "bury 9", "defined_out": [ "interest_amount#1", @@ -5399,7 +5379,7 @@ "required_amount#0" ] }, - "1506": { + "1489": { "op": "global CurrentApplicationAddress", "defined_out": [ "interest_amount#1", @@ -5436,7 +5416,7 @@ "tmp%0#3" ] }, - "1508": { + "1491": { "op": "intc_0 // 0", "stack_out": [ "entry#0", @@ -5464,7 +5444,7 @@ "0" ] }, - "1509": { + "1492": { "op": "bytec 19 // \"settlement_asset_id\"", "defined_out": [ "\"settlement_asset_id\"", @@ -5505,7 +5485,7 @@ "\"settlement_asset_id\"" ] }, - "1511": { + "1494": { "op": "app_global_get_ex", "defined_out": [ "interest_amount#1", @@ -5546,7 +5526,7 @@ "maybe_exists%0#0" ] }, - "1512": { + "1495": { "error": "check self.settlement_asset_id exists", "op": "assert // check self.settlement_asset_id exists", "stack_out": [ @@ -5575,7 +5555,7 @@ "maybe_value%0#0" ] }, - "1513": { + "1496": { "op": "asset_holding_get AssetBalance", "defined_out": [ "balance#0", @@ -5614,7 +5594,7 @@ "check%0#0" ] }, - "1515": { + "1498": { "error": "account opted into asset", "op": "assert // account opted into asset", "stack_out": [ @@ -5642,7 +5622,7 @@ "balance#0" ] }, - "1516": { + "1499": { "op": "intc_0 // 0", "stack_out": [ "entry#0", @@ -5670,7 +5650,7 @@ "0" ] }, - "1517": { + "1500": { "op": "bytec 15 // \"reserved_interest\"", "defined_out": [ "\"reserved_interest\"", @@ -5711,7 +5691,7 @@ "\"reserved_interest\"" ] }, - "1519": { + "1502": { "op": "app_global_get_ex", "stack_out": [ "entry#0", @@ -5740,7 +5720,7 @@ "maybe_exists%0#0" ] }, - "1520": { + "1503": { "error": "check self.reserved_interest exists", "op": "assert // check self.reserved_interest exists", "stack_out": [ @@ -5769,7 +5749,7 @@ "maybe_value%0#0" ] }, - "1521": { + "1504": { "op": "intc_0 // 0", "stack_out": [ "entry#0", @@ -5798,7 +5778,7 @@ "0" ] }, - "1522": { + "1505": { "op": "bytec 12 // \"reserved_principal\"", "defined_out": [ "\"reserved_principal\"", @@ -5841,7 +5821,7 @@ "\"reserved_principal\"" ] }, - "1524": { + "1507": { "op": "app_global_get_ex", "defined_out": [ "balance#0", @@ -5884,7 +5864,7 @@ "maybe_exists%1#0" ] }, - "1525": { + "1508": { "error": "check self.reserved_principal exists", "op": "assert // check self.reserved_principal exists", "stack_out": [ @@ -5914,7 +5894,7 @@ "maybe_value%1#0" ] }, - "1526": { + "1509": { "op": "dig 1", "defined_out": [ "balance#0", @@ -5957,7 +5937,7 @@ "maybe_value%0#0 (copy)" ] }, - "1528": { + "1511": { "op": "+", "defined_out": [ "balance#0", @@ -5998,7 +5978,7 @@ "reserved_total#0" ] }, - "1529": { + "1512": { "op": "dig 2", "defined_out": [ "balance#0", @@ -6041,7 +6021,7 @@ "balance#0 (copy)" ] }, - "1531": { + "1514": { "op": "dig 1", "defined_out": [ "balance#0", @@ -6086,7 +6066,7 @@ "reserved_total#0 (copy)" ] }, - "1533": { + "1516": { "op": ">=", "defined_out": [ "balance#0", @@ -6129,7 +6109,7 @@ "tmp%2#2" ] }, - "1534": { + "1517": { "error": "Not enough funds for the payment", "op": "assert // Not enough funds for the payment", "stack_out": [ @@ -6159,7 +6139,7 @@ "reserved_total#0" ] }, - "1535": { + "1518": { "op": "uncover 2", "stack_out": [ "entry#0", @@ -6188,7 +6168,7 @@ "balance#0" ] }, - "1537": { + "1520": { "op": "swap", "stack_out": [ "entry#0", @@ -6217,7 +6197,7 @@ "reserved_total#0" ] }, - "1538": { + "1521": { "op": "-", "defined_out": [ "interest_amount#1", @@ -6256,7 +6236,7 @@ "tmp%3#3" ] }, - "1539": { + "1522": { "op": "uncover 2", "stack_out": [ "entry#0", @@ -6284,7 +6264,7 @@ "required_amount#0" ] }, - "1541": { + "1524": { "op": ">=", "defined_out": [ "interest_amount#1", @@ -6322,7 +6302,7 @@ "tmp%15#1" ] }, - "1542": { + "1525": { "error": "Not enough funds for the payment", "op": "assert // Not enough funds for the payment", "stack_out": [ @@ -6349,7 +6329,7 @@ "maybe_value%0#0" ] }, - "1543": { + "1526": { "op": "uncover 3", "stack_out": [ "entry#0", @@ -6375,7 +6355,7 @@ "interest_amount#1" ] }, - "1545": { + "1528": { "op": "+", "defined_out": [ "interest_amount#1", @@ -6410,7 +6390,7 @@ "tmp%16#1" ] }, - "1546": { + "1529": { "op": "bytec 15 // \"reserved_interest\"", "stack_out": [ "entry#0", @@ -6436,7 +6416,7 @@ "\"reserved_interest\"" ] }, - "1548": { + "1531": { "op": "swap", "stack_out": [ "entry#0", @@ -6462,7 +6442,7 @@ "tmp%16#1" ] }, - "1549": { + "1532": { "op": "app_global_put", "stack_out": [ "entry#0", @@ -6486,7 +6466,7 @@ "principal_amount#1" ] }, - "1550": { + "1533": { "op": "intc_0 // 0", "stack_out": [ "entry#0", @@ -6511,7 +6491,7 @@ "0" ] }, - "1551": { + "1534": { "op": "bytec 12 // \"reserved_principal\"", "stack_out": [ "entry#0", @@ -6537,7 +6517,7 @@ "\"reserved_principal\"" ] }, - "1553": { + "1536": { "op": "app_global_get_ex", "defined_out": [ "interest_amount#1", @@ -6574,7 +6554,7 @@ "maybe_exists%5#0" ] }, - "1554": { + "1537": { "error": "check self.reserved_principal exists", "op": "assert // check self.reserved_principal exists", "stack_out": [ @@ -6600,7 +6580,7 @@ "maybe_value%5#0" ] }, - "1555": { + "1538": { "op": "+", "defined_out": [ "interest_amount#1", @@ -6634,7 +6614,7 @@ "tmp%17#0" ] }, - "1556": { + "1539": { "op": "bytec 12 // \"reserved_principal\"", "stack_out": [ "entry#0", @@ -6659,7 +6639,7 @@ "\"reserved_principal\"" ] }, - "1558": { + "1541": { "op": "swap", "stack_out": [ "entry#0", @@ -6684,7 +6664,7 @@ "tmp%17#0" ] }, - "1559": { + "1542": { "op": "app_global_put", "stack_out": [ "entry#0", @@ -6707,7 +6687,7 @@ "principal_index_delta#0" ] }, - "1560": { + "1543": { "op": "intc_0 // 0", "stack_out": [ "entry#0", @@ -6731,7 +6711,7 @@ "0" ] }, - "1561": { + "1544": { "op": "bytec 16 // \"cumulative_interest_index\"", "defined_out": [ "\"cumulative_interest_index\"", @@ -6767,7 +6747,7 @@ "\"cumulative_interest_index\"" ] }, - "1563": { + "1546": { "op": "app_global_get_ex", "defined_out": [ "interest_amount#1", @@ -6803,7 +6783,7 @@ "maybe_exists%6#0" ] }, - "1564": { + "1547": { "error": "check self.cumulative_interest_index exists", "op": "assert // check self.cumulative_interest_index exists", "stack_out": [ @@ -6828,7 +6808,7 @@ "maybe_value%6#0" ] }, - "1565": { + "1548": { "op": "uncover 2", "stack_out": [ "entry#0", @@ -6852,7 +6832,7 @@ "interest_index_delta#0" ] }, - "1567": { + "1550": { "op": "+", "defined_out": [ "interest_amount#1", @@ -6884,7 +6864,7 @@ "tmp%18#0" ] }, - "1568": { + "1551": { "op": "bytec 16 // \"cumulative_interest_index\"", "stack_out": [ "entry#0", @@ -6908,7 +6888,7 @@ "\"cumulative_interest_index\"" ] }, - "1570": { + "1553": { "op": "swap", "stack_out": [ "entry#0", @@ -6932,7 +6912,7 @@ "tmp%18#0" ] }, - "1571": { + "1554": { "op": "app_global_put", "stack_out": [ "entry#0", @@ -6954,7 +6934,7 @@ "principal_index_delta#0" ] }, - "1572": { + "1555": { "op": "intc_0 // 0", "stack_out": [ "entry#0", @@ -6977,7 +6957,7 @@ "0" ] }, - "1573": { + "1556": { "op": "bytec 17 // \"cumulative_principal_index\"", "defined_out": [ "\"cumulative_principal_index\"", @@ -7011,7 +6991,7 @@ "\"cumulative_principal_index\"" ] }, - "1575": { + "1558": { "op": "app_global_get_ex", "defined_out": [ "interest_amount#1", @@ -7045,7 +7025,7 @@ "maybe_exists%7#0" ] }, - "1576": { + "1559": { "error": "check self.cumulative_principal_index exists", "op": "assert // check self.cumulative_principal_index exists", "stack_out": [ @@ -7069,7 +7049,7 @@ "maybe_value%7#0" ] }, - "1577": { + "1560": { "op": "+", "defined_out": [ "interest_amount#1", @@ -7099,7 +7079,7 @@ "tmp%19#0" ] }, - "1578": { + "1561": { "op": "bytec 17 // \"cumulative_principal_index\"", "stack_out": [ "entry#0", @@ -7122,7 +7102,7 @@ "\"cumulative_principal_index\"" ] }, - "1580": { + "1563": { "op": "swap", "stack_out": [ "entry#0", @@ -7145,7 +7125,7 @@ "tmp%19#0" ] }, - "1581": { + "1564": { "op": "app_global_put", "stack_out": [ "entry#0", @@ -7166,7 +7146,7 @@ "max_event_count#0" ] }, - "1582": { + "1565": { "op": "dig 15", "defined_out": [ "entry#0", @@ -7196,7 +7176,7 @@ "entry#0" ] }, - "1584": { + "1567": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -7228,7 +7208,7 @@ "8" ] }, - "1585": { + "1568": { "op": "getbyte", "defined_out": [ "entry#0", @@ -7259,7 +7239,7 @@ "tmp%20#0" ] }, - "1586": { + "1569": { "op": "pushint 3", "defined_out": [ "3", @@ -7292,7 +7272,7 @@ "3" ] }, - "1588": { + "1571": { "op": "==", "defined_out": [ "entry#0", @@ -7323,7 +7303,7 @@ "tmp%21#0" ] }, - "1589": { + "1572": { "op": "bz fund_due_cashflows_else_body@40", "stack_out": [ "entry#0", @@ -7344,7 +7324,7 @@ "max_event_count#0" ] }, - "1592": { + "1575": { "op": "intc_0 // 0", "stack_out": [ "entry#0", @@ -7366,7 +7346,7 @@ "0" ] }, - "1593": { + "1576": { "op": "bytec 6 // \"accrued_interest\"", "defined_out": [ "\"accrued_interest\"", @@ -7399,7 +7379,7 @@ "\"accrued_interest\"" ] }, - "1595": { + "1578": { "op": "app_global_get_ex", "defined_out": [ "entry#0", @@ -7432,7 +7412,7 @@ "maybe_exists%8#0" ] }, - "1596": { + "1579": { "error": "check self.accrued_interest exists", "op": "assert // check self.accrued_interest exists", "stack_out": [ @@ -7455,7 +7435,7 @@ "maybe_value%8#0" ] }, - "1597": { + "1580": { "op": "dig 16", "stack_out": [ "entry#0", @@ -7478,7 +7458,7 @@ "entry#0" ] }, - "1599": { + "1582": { "callsub": "modules.actus_kernel.ActusKernelModule._entry_interest_segment", "op": "callsub _entry_interest_segment", "defined_out": [ @@ -7513,7 +7493,7 @@ "entry#0" ] }, - "1602": { + "1585": { "op": "bury 18", "defined_out": [ "_entry_interest_segment%0#0", @@ -7546,7 +7526,7 @@ "_entry_interest_segment%0#0" ] }, - "1604": { + "1587": { "op": "+", "defined_out": [ "entry#0", @@ -7577,7 +7557,7 @@ "tmp%22#0" ] }, - "1605": { + "1588": { "op": "bytec 6 // \"accrued_interest\"", "stack_out": [ "entry#0", @@ -7600,7 +7580,7 @@ "\"accrued_interest\"" ] }, - "1607": { + "1590": { "op": "swap", "stack_out": [ "entry#0", @@ -7623,7 +7603,7 @@ "tmp%22#0" ] }, - "1608": { + "1591": { "op": "app_global_put", "stack_out": [ "entry#0", @@ -7644,7 +7624,7 @@ "max_event_count#0" ] }, - "1609": { + "1592": { "block": "fund_due_cashflows_after_if_else@41", "stack_in": [ "entry#0", @@ -7689,7 +7669,7 @@ "tmp%23#0" ] }, - "1612": { + "1595": { "op": "bz fund_due_cashflows_if_body@43", "stack_out": [ "entry#0", @@ -7710,7 +7690,7 @@ "max_event_count#0" ] }, - "1615": { + "1598": { "op": "dig 15", "defined_out": [ "entry#0" @@ -7735,7 +7715,7 @@ "entry#0" ] }, - "1617": { + "1600": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -7762,7 +7742,7 @@ "8" ] }, - "1618": { + "1601": { "op": "getbyte", "defined_out": [ "entry#0", @@ -7788,7 +7768,7 @@ "tmp%24#0" ] }, - "1619": { + "1602": { "op": "pushint 19", "defined_out": [ "19", @@ -7816,7 +7796,7 @@ "19" ] }, - "1621": { + "1604": { "op": "==", "defined_out": [ "entry#0", @@ -7842,7 +7822,7 @@ "tmp%25#0" ] }, - "1622": { + "1605": { "op": "bz fund_due_cashflows_after_if_else@44", "stack_out": [ "entry#0", @@ -7863,7 +7843,7 @@ "max_event_count#0" ] }, - "1625": { + "1608": { "block": "fund_due_cashflows_if_body@43", "stack_in": [ "entry#0", @@ -7907,7 +7887,7 @@ "entry#0" ] }, - "1627": { + "1610": { "op": "pushint 41", "defined_out": [ "41", @@ -7934,7 +7914,7 @@ "41" ] }, - "1629": { + "1612": { "op": "extract_uint64", "defined_out": [ "entry#0", @@ -7960,7 +7940,7 @@ "values%4#0" ] }, - "1630": { + "1613": { "op": "bytec 14 // \"next_principal_redemption\"", "defined_out": [ "\"next_principal_redemption\"", @@ -7988,7 +7968,7 @@ "\"next_principal_redemption\"" ] }, - "1632": { + "1615": { "op": "swap", "stack_out": [ "entry#0", @@ -8011,7 +7991,7 @@ "values%4#0" ] }, - "1633": { + "1616": { "op": "app_global_put", "stack_out": [ "entry#0", @@ -8032,7 +8012,7 @@ "max_event_count#0" ] }, - "1634": { + "1617": { "block": "fund_due_cashflows_after_if_else@44", "stack_in": [ "entry#0", @@ -8076,7 +8056,7 @@ "\"outstanding_principal\"" ] }, - "1636": { + "1619": { "op": "dig 8", "defined_out": [ "\"outstanding_principal\"", @@ -8103,7 +8083,7 @@ "next_outstanding_principal#0" ] }, - "1638": { + "1621": { "op": "app_global_put", "stack_out": [ "entry#0", @@ -8124,7 +8104,7 @@ "max_event_count#0" ] }, - "1639": { + "1622": { "op": "bytec 7 // \"interest_calculation_base\"", "defined_out": [ "\"interest_calculation_base\"", @@ -8150,7 +8130,7 @@ "\"interest_calculation_base\"" ] }, - "1641": { + "1624": { "op": "dig 9", "defined_out": [ "\"interest_calculation_base\"", @@ -8178,7 +8158,7 @@ "next_interest_base#2" ] }, - "1643": { + "1626": { "op": "app_global_put", "stack_out": [ "entry#0", @@ -8199,7 +8179,7 @@ "max_event_count#0" ] }, - "1644": { + "1627": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -8226,7 +8206,7 @@ "0" ] }, - "1645": { + "1628": { "op": "bytec_2 // \"event_cursor\"", "defined_out": [ "\"event_cursor\"", @@ -8255,7 +8235,7 @@ "\"event_cursor\"" ] }, - "1646": { + "1629": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%9#0", @@ -8284,7 +8264,7 @@ "maybe_exists%9#0" ] }, - "1647": { + "1630": { "error": "check self.event_cursor exists", "op": "assert // check self.event_cursor exists", "stack_out": [ @@ -8307,7 +8287,7 @@ "maybe_value%9#0" ] }, - "1648": { + "1631": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -8336,7 +8316,7 @@ "1" ] }, - "1649": { + "1632": { "op": "+", "defined_out": [ "next_interest_base#2", @@ -8363,7 +8343,7 @@ "tmp%26#0" ] }, - "1650": { + "1633": { "op": "bytec_2 // \"event_cursor\"", "stack_out": [ "entry#0", @@ -8386,7 +8366,7 @@ "\"event_cursor\"" ] }, - "1651": { + "1634": { "op": "swap", "stack_out": [ "entry#0", @@ -8409,7 +8389,7 @@ "tmp%26#0" ] }, - "1652": { + "1635": { "op": "app_global_put", "stack_out": [ "entry#0", @@ -8430,7 +8410,7 @@ "max_event_count#0" ] }, - "1653": { + "1636": { "op": "dig 15", "defined_out": [ "entry#0", @@ -8457,7 +8437,7 @@ "entry#0" ] }, - "1655": { + "1638": { "op": "extract 8 1", "defined_out": [ "aggregate%extract%10#0", @@ -8485,7 +8465,7 @@ "aggregate%extract%10#0" ] }, - "1658": { + "1641": { "op": "pushbytes 0x13", "defined_out": [ "0x13", @@ -8515,7 +8495,7 @@ "0x13" ] }, - "1661": { + "1644": { "op": "b==", "defined_out": [ "entry#0", @@ -8543,7 +8523,7 @@ "tmp%27#0" ] }, - "1662": { + "1645": { "op": "bz fund_due_cashflows_after_if_else@47", "stack_out": [ "entry#0", @@ -8564,7 +8544,7 @@ "max_event_count#0" ] }, - "1665": { + "1648": { "op": "intc_0 // 0", "stack_out": [ "entry#0", @@ -8586,7 +8566,7 @@ "0" ] }, - "1666": { + "1649": { "op": "bytec 4 // \"outstanding_principal\"", "stack_out": [ "entry#0", @@ -8609,7 +8589,7 @@ "\"outstanding_principal\"" ] }, - "1668": { + "1651": { "op": "app_global_get_ex", "defined_out": [ "entry#0", @@ -8639,7 +8619,7 @@ "maybe_exists%10#0" ] }, - "1669": { + "1652": { "error": "check self.outstanding_principal exists", "op": "assert // check self.outstanding_principal exists", "stack_out": [ @@ -8662,7 +8642,7 @@ "maybe_value%10#0" ] }, - "1670": { + "1653": { "op": "bnz fund_due_cashflows_after_if_else@47", "stack_out": [ "entry#0", @@ -8683,7 +8663,7 @@ "max_event_count#0" ] }, - "1673": { + "1656": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"", @@ -8711,7 +8691,7 @@ "\"status\"" ] }, - "1674": { + "1657": { "op": "pushint 200", "defined_out": [ "\"status\"", @@ -8741,7 +8721,7 @@ "200" ] }, - "1677": { + "1660": { "op": "app_global_put", "stack_out": [ "entry#0", @@ -8762,7 +8742,7 @@ "max_event_count#0" ] }, - "1678": { + "1661": { "op": "bytec 7 // \"interest_calculation_base\"", "stack_out": [ "entry#0", @@ -8784,7 +8764,7 @@ "\"interest_calculation_base\"" ] }, - "1680": { + "1663": { "op": "intc_0 // 0", "stack_out": [ "entry#0", @@ -8807,7 +8787,7 @@ "0" ] }, - "1681": { + "1664": { "op": "app_global_put", "stack_out": [ "entry#0", @@ -8828,7 +8808,7 @@ "max_event_count#0" ] }, - "1682": { + "1665": { "block": "fund_due_cashflows_after_if_else@47", "stack_in": [ "entry#0", @@ -8872,7 +8852,7 @@ "entry#0" ] }, - "1684": { + "1667": { "op": "dig 4", "defined_out": [ "entry#0", @@ -8899,7 +8879,7 @@ "required_amount#0" ] }, - "1686": { + "1669": { "op": "dup", "defined_out": [ "entry#0", @@ -8928,7 +8908,7 @@ "required_amount#0" ] }, - "1687": { + "1670": { "callsub": "modules.actus_kernel.ActusKernelModule._emit_execution_event", "op": "callsub _emit_execution_event", "stack_out": [ @@ -8951,7 +8931,7 @@ "entry#0" ] }, - "1690": { + "1673": { "op": "pop", "stack_out": [ "entry#0", @@ -8972,7 +8952,7 @@ "max_event_count#0" ] }, - "1691": { + "1674": { "op": "dig 13", "defined_out": [ "entry#0", @@ -8999,7 +8979,7 @@ "funded_interest#0" ] }, - "1693": { + "1676": { "op": "dig 12", "defined_out": [ "entry#0", @@ -9028,7 +9008,7 @@ "interest_amount#1" ] }, - "1695": { + "1678": { "op": "+", "stack_out": [ "entry#0", @@ -9050,7 +9030,7 @@ "funded_interest#0" ] }, - "1696": { + "1679": { "op": "bury 14", "defined_out": [ "entry#0", @@ -9077,7 +9057,7 @@ "max_event_count#0" ] }, - "1698": { + "1681": { "op": "dig 12", "defined_out": [ "entry#0", @@ -9106,7 +9086,7 @@ "funded_principal#0" ] }, - "1700": { + "1683": { "op": "dig 7", "defined_out": [ "entry#0", @@ -9137,7 +9117,7 @@ "principal_amount#1" ] }, - "1702": { + "1685": { "op": "+", "stack_out": [ "entry#0", @@ -9159,7 +9139,7 @@ "funded_principal#0" ] }, - "1703": { + "1686": { "op": "bury 13", "defined_out": [ "entry#0", @@ -9188,7 +9168,7 @@ "max_event_count#0" ] }, - "1705": { + "1688": { "op": "dig 4", "defined_out": [ "entry#0", @@ -9219,7 +9199,7 @@ "processed_events#0" ] }, - "1707": { + "1690": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -9252,7 +9232,7 @@ "1" ] }, - "1708": { + "1691": { "op": "+", "stack_out": [ "entry#0", @@ -9274,7 +9254,7 @@ "processed_events#0" ] }, - "1709": { + "1692": { "op": "bury 5", "defined_out": [ "entry#0", @@ -9304,10 +9284,10 @@ "max_event_count#0" ] }, - "1711": { + "1694": { "op": "b fund_due_cashflows_while_top@4" }, - "1714": { + "1697": { "block": "fund_due_cashflows_else_body@40", "stack_in": [ "entry#0", @@ -9351,7 +9331,7 @@ "\"accrued_interest\"" ] }, - "1716": { + "1699": { "op": "intc_0 // 0", "defined_out": [ "\"accrued_interest\"", @@ -9378,7 +9358,7 @@ "0" ] }, - "1717": { + "1700": { "op": "app_global_put", "stack_out": [ "entry#0", @@ -9399,10 +9379,10 @@ "max_event_count#0" ] }, - "1718": { + "1701": { "op": "b fund_due_cashflows_after_if_else@41" }, - "1721": { + "1704": { "block": "fund_due_cashflows_if_body@29", "stack_in": [ "entry#0", @@ -9446,7 +9426,7 @@ "entry#0" ] }, - "1723": { + "1706": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -9473,7 +9453,7 @@ "8" ] }, - "1724": { + "1707": { "op": "getbyte", "defined_out": [ "entry#0", @@ -9499,7 +9479,7 @@ "event_type#0" ] }, - "1725": { + "1708": { "op": "dup", "stack_out": [ "entry#0", @@ -9522,7 +9502,7 @@ "event_type#0" ] }, - "1726": { + "1709": { "op": "bury 16", "defined_out": [ "entry#0", @@ -9548,7 +9528,7 @@ "event_type#0" ] }, - "1728": { + "1711": { "op": "pushint 3", "defined_out": [ "3", @@ -9576,7 +9556,7 @@ "3" ] }, - "1730": { + "1713": { "op": "==", "defined_out": [ "entry#0", @@ -9603,7 +9583,7 @@ "tmp%5#0" ] }, - "1731": { + "1714": { "op": "bz fund_due_cashflows_else_body@31", "stack_out": [ "entry#0", @@ -9624,7 +9604,7 @@ "max_event_count#0" ] }, - "1734": { + "1717": { "op": "intc_0 // 0", "stack_out": [ "entry#0", @@ -9646,7 +9626,7 @@ "0" ] }, - "1735": { + "1718": { "op": "bytec 4 // \"outstanding_principal\"", "defined_out": [ "\"outstanding_principal\"", @@ -9675,7 +9655,7 @@ "\"outstanding_principal\"" ] }, - "1737": { + "1720": { "op": "app_global_get_ex", "defined_out": [ "entry#0", @@ -9704,7 +9684,7 @@ "maybe_exists%1#0" ] }, - "1738": { + "1721": { "error": "check self.outstanding_principal exists", "op": "assert // check self.outstanding_principal exists", "stack_out": [ @@ -9727,7 +9707,7 @@ "maybe_value%1#0" ] }, - "1739": { + "1722": { "op": "dig 6", "defined_out": [ "entry#0", @@ -9756,7 +9736,7 @@ "principal_amount_due#0" ] }, - "1741": { + "1724": { "op": "-", "defined_out": [ "entry#0", @@ -9784,7 +9764,7 @@ "next_outstanding_principal#0" ] }, - "1742": { + "1725": { "op": "dup", "stack_out": [ "entry#0", @@ -9807,7 +9787,7 @@ "next_outstanding_principal#0" ] }, - "1743": { + "1726": { "op": "bury 9", "defined_out": [ "entry#0", @@ -9836,7 +9816,7 @@ "next_interest_base#2" ] }, - "1745": { + "1728": { "op": "bury 9", "defined_out": [ "entry#0", @@ -9864,10 +9844,10 @@ "max_event_count#0" ] }, - "1747": { + "1730": { "op": "b fund_due_cashflows_after_if_else@38" }, - "1750": { + "1733": { "block": "fund_due_cashflows_else_body@31", "stack_in": [ "entry#0", @@ -9911,7 +9891,7 @@ "event_type#0" ] }, - "1752": { + "1735": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -9938,7 +9918,7 @@ "8" ] }, - "1753": { + "1736": { "op": "==", "defined_out": [ "event_type#0", @@ -9964,7 +9944,7 @@ "tmp%7#0" ] }, - "1754": { + "1737": { "op": "bz fund_due_cashflows_else_body@33", "stack_out": [ "entry#0", @@ -9985,7 +9965,7 @@ "max_event_count#0" ] }, - "1757": { + "1740": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -10011,7 +9991,7 @@ "0" ] }, - "1758": { + "1741": { "op": "bytec 4 // \"outstanding_principal\"", "defined_out": [ "\"outstanding_principal\"", @@ -10039,7 +10019,7 @@ "\"outstanding_principal\"" ] }, - "1760": { + "1743": { "op": "app_global_get_ex", "defined_out": [ "event_type#0", @@ -10067,7 +10047,7 @@ "maybe_exists%2#0" ] }, - "1761": { + "1744": { "op": "swap", "stack_out": [ "entry#0", @@ -10090,7 +10070,7 @@ "next_outstanding_principal#0" ] }, - "1762": { + "1745": { "op": "bury 9", "defined_out": [ "event_type#0", @@ -10117,7 +10097,7 @@ "maybe_exists%2#0" ] }, - "1764": { + "1747": { "error": "check self.outstanding_principal exists", "op": "assert // check self.outstanding_principal exists", "stack_out": [ @@ -10139,7 +10119,7 @@ "max_event_count#0" ] }, - "1765": { + "1748": { "op": "intc_0 // 0", "stack_out": [ "entry#0", @@ -10161,7 +10141,7 @@ "0" ] }, - "1766": { + "1749": { "op": "bytec 7 // \"interest_calculation_base\"", "defined_out": [ "\"interest_calculation_base\"", @@ -10190,7 +10170,7 @@ "\"interest_calculation_base\"" ] }, - "1768": { + "1751": { "op": "app_global_get_ex", "defined_out": [ "event_type#0", @@ -10219,7 +10199,7 @@ "maybe_exists%3#0" ] }, - "1769": { + "1752": { "op": "swap", "stack_out": [ "entry#0", @@ -10242,7 +10222,7 @@ "next_interest_base#2" ] }, - "1770": { + "1753": { "op": "bury 10", "defined_out": [ "event_type#0", @@ -10270,7 +10250,7 @@ "maybe_exists%3#0" ] }, - "1772": { + "1755": { "error": "check self.interest_calculation_base exists", "op": "assert // check self.interest_calculation_base exists", "stack_out": [ @@ -10292,10 +10272,10 @@ "max_event_count#0" ] }, - "1773": { + "1756": { "op": "b fund_due_cashflows_after_if_else@38" }, - "1776": { + "1759": { "block": "fund_due_cashflows_else_body@33", "stack_in": [ "entry#0", @@ -10339,7 +10319,7 @@ "event_type#0" ] }, - "1778": { + "1761": { "op": "pushint 19", "defined_out": [ "19", @@ -10366,7 +10346,7 @@ "19" ] }, - "1780": { + "1763": { "op": "==", "defined_out": [ "event_type#0", @@ -10392,7 +10372,7 @@ "tmp%8#1" ] }, - "1781": { + "1764": { "op": "bnz fund_due_cashflows_if_body@34", "stack_out": [ "entry#0", @@ -10413,7 +10393,7 @@ "max_event_count#0" ] }, - "1784": { + "1767": { "op": "dig 7", "defined_out": [ "event_type#0", @@ -10439,7 +10419,7 @@ "next_interest_base#2" ] }, - "1786": { + "1769": { "op": "bury 9", "defined_out": [ "event_type#0", @@ -10464,10 +10444,10 @@ "max_event_count#0" ] }, - "1788": { + "1771": { "op": "b fund_due_cashflows_after_if_else@38" }, - "1791": { + "1774": { "block": "fund_due_cashflows_if_body@34", "stack_in": [ "entry#0", @@ -10511,7 +10491,7 @@ "next_outstanding_principal#0" ] }, - "1792": { + "1775": { "op": "bury 8", "defined_out": [ "next_outstanding_principal#0" @@ -10535,7 +10515,7 @@ "max_event_count#0" ] }, - "1794": { + "1777": { "op": "intc_0 // 0", "defined_out": [ "next_interest_base#2", @@ -10561,7 +10541,7 @@ "next_interest_base#2" ] }, - "1795": { + "1778": { "op": "bury 9", "defined_out": [ "next_interest_base#2", @@ -10586,10 +10566,10 @@ "max_event_count#0" ] }, - "1797": { + "1780": { "op": "b fund_due_cashflows_after_if_else@38" }, - "1800": { + "1783": { "block": "fund_due_cashflows_after_if_else@19", "stack_in": [ "entry#0", @@ -10634,7 +10614,7 @@ "tmp%3#1" ] }, - "1803": { + "1786": { "op": "bz fund_due_cashflows_after_if_else@27", "stack_out": [ "entry#0", @@ -10655,7 +10635,7 @@ "max_event_count#0" ] }, - "1806": { + "1789": { "op": "dig 14", "defined_out": [ "event_type#0" @@ -10680,7 +10660,7 @@ "event_type#0" ] }, - "1808": { + "1791": { "op": "pushint 19", "defined_out": [ "19", @@ -10707,7 +10687,7 @@ "19" ] }, - "1810": { + "1793": { "op": "==", "defined_out": [ "event_type#0", @@ -10733,7 +10713,7 @@ "tmp%4#0" ] }, - "1811": { + "1794": { "op": "bz fund_due_cashflows_after_if_else@22", "stack_out": [ "entry#0", @@ -10754,7 +10734,7 @@ "max_event_count#0" ] }, - "1814": { + "1797": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -10780,7 +10760,7 @@ "0" ] }, - "1815": { + "1798": { "op": "bytec 4 // \"outstanding_principal\"", "defined_out": [ "\"outstanding_principal\"", @@ -10808,7 +10788,7 @@ "\"outstanding_principal\"" ] }, - "1817": { + "1800": { "op": "app_global_get_ex", "defined_out": [ "event_type#0", @@ -10836,7 +10816,7 @@ "maybe_exists%0#0" ] }, - "1818": { + "1801": { "error": "check self.outstanding_principal exists", "op": "assert // check self.outstanding_principal exists", "defined_out": [ @@ -10863,7 +10843,7 @@ "principal_amount_due#0" ] }, - "1819": { + "1802": { "op": "bury 6", "defined_out": [ "event_type#0", @@ -10888,10 +10868,10 @@ "max_event_count#0" ] }, - "1821": { + "1804": { "op": "b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@28" }, - "1824": { + "1807": { "block": "fund_due_cashflows_after_if_else@22", "stack_in": [ "entry#0", @@ -10935,7 +10915,7 @@ "0" ] }, - "1825": { + "1808": { "op": "bytec 6 // \"accrued_interest\"", "defined_out": [ "\"accrued_interest\"", @@ -10962,7 +10942,7 @@ "\"accrued_interest\"" ] }, - "1827": { + "1810": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%1#0", @@ -10989,7 +10969,7 @@ "maybe_exists%1#0" ] }, - "1828": { + "1811": { "error": "check self.accrued_interest exists", "op": "assert // check self.accrued_interest exists", "stack_out": [ @@ -11012,7 +10992,7 @@ "maybe_value%1#0" ] }, - "1829": { + "1812": { "op": "dig 16", "defined_out": [ "entry#0", @@ -11039,7 +11019,7 @@ "entry#0" ] }, - "1831": { + "1814": { "callsub": "modules.actus_kernel.ActusKernelModule._entry_interest_segment", "op": "callsub _entry_interest_segment", "defined_out": [ @@ -11069,7 +11049,7 @@ "entry#0" ] }, - "1834": { + "1817": { "op": "bury 18", "defined_out": [ "_entry_interest_segment%0#0", @@ -11097,7 +11077,7 @@ "_entry_interest_segment%0#0" ] }, - "1836": { + "1819": { "op": "+", "defined_out": [ "entry#0", @@ -11123,7 +11103,7 @@ "interest_due#0" ] }, - "1837": { + "1820": { "op": "dup", "stack_out": [ "entry#0", @@ -11146,7 +11126,7 @@ "interest_due#0" ] }, - "1838": { + "1821": { "op": "bury 11", "defined_out": [ "entry#0", @@ -11172,7 +11152,7 @@ "interest_due#0" ] }, - "1840": { + "1823": { "op": "intc_0 // 0", "stack_out": [ "entry#0", @@ -11195,7 +11175,7 @@ "0" ] }, - "1841": { + "1824": { "op": "bytec 14 // \"next_principal_redemption\"", "defined_out": [ "\"next_principal_redemption\"", @@ -11225,7 +11205,7 @@ "\"next_principal_redemption\"" ] }, - "1843": { + "1826": { "op": "app_global_get_ex", "defined_out": [ "entry#0", @@ -11255,7 +11235,7 @@ "maybe_exists%2#0" ] }, - "1844": { + "1827": { "error": "check self.next_principal_redemption exists", "op": "assert // check self.next_principal_redemption exists", "stack_out": [ @@ -11279,7 +11259,7 @@ "maybe_value%2#0" ] }, - "1845": { + "1828": { "op": ">=", "defined_out": [ "entry#0", @@ -11306,7 +11286,7 @@ "tmp%6#2" ] }, - "1846": { + "1829": { "op": "bz fund_due_cashflows_after_if_else@24", "stack_out": [ "entry#0", @@ -11327,7 +11307,7 @@ "max_event_count#0" ] }, - "1849": { + "1832": { "op": "intc_0 // 0", "defined_out": [ "entry#0", @@ -11354,7 +11334,7 @@ "principal_amount_due#0" ] }, - "1850": { + "1833": { "op": "bury 6", "defined_out": [ "entry#0", @@ -11380,10 +11360,10 @@ "max_event_count#0" ] }, - "1852": { + "1835": { "op": "b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@28" }, - "1855": { + "1838": { "block": "fund_due_cashflows_after_if_else@24", "stack_in": [ "entry#0", @@ -11427,7 +11407,7 @@ "0" ] }, - "1856": { + "1839": { "op": "bytec 14 // \"next_principal_redemption\"", "defined_out": [ "\"next_principal_redemption\"", @@ -11454,7 +11434,7 @@ "\"next_principal_redemption\"" ] }, - "1858": { + "1841": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%3#0", @@ -11481,7 +11461,7 @@ "maybe_exists%3#0" ] }, - "1859": { + "1842": { "error": "check self.next_principal_redemption exists", "op": "assert // check self.next_principal_redemption exists", "stack_out": [ @@ -11504,7 +11484,7 @@ "maybe_value%3#1" ] }, - "1860": { + "1843": { "op": "dig 10", "defined_out": [ "interest_due#0", @@ -11531,7 +11511,7 @@ "interest_due#0" ] }, - "1862": { + "1845": { "op": "-", "defined_out": [ "interest_due#0", @@ -11557,7 +11537,7 @@ "principal_amount#1" ] }, - "1863": { + "1846": { "op": "dup", "stack_out": [ "entry#0", @@ -11580,7 +11560,7 @@ "principal_amount#1" ] }, - "1864": { + "1847": { "op": "bury 8", "defined_out": [ "interest_due#0", @@ -11606,7 +11586,7 @@ "principal_amount#1" ] }, - "1866": { + "1849": { "op": "intc_0 // 0", "stack_out": [ "entry#0", @@ -11629,7 +11609,7 @@ "0" ] }, - "1867": { + "1850": { "op": "bytec 4 // \"outstanding_principal\"", "defined_out": [ "\"outstanding_principal\"", @@ -11659,7 +11639,7 @@ "\"outstanding_principal\"" ] }, - "1869": { + "1852": { "op": "app_global_get_ex", "defined_out": [ "interest_due#0", @@ -11689,7 +11669,7 @@ "maybe_exists%4#1" ] }, - "1870": { + "1853": { "error": "check self.outstanding_principal exists", "op": "assert // check self.outstanding_principal exists", "stack_out": [ @@ -11713,7 +11693,7 @@ "maybe_value%4#1" ] }, - "1871": { + "1854": { "op": ">", "defined_out": [ "interest_due#0", @@ -11740,7 +11720,7 @@ "tmp%8#1" ] }, - "1872": { + "1855": { "op": "bz fund_due_cashflows_after_if_else@26", "stack_out": [ "entry#0", @@ -11761,7 +11741,7 @@ "max_event_count#0" ] }, - "1875": { + "1858": { "op": "intc_0 // 0", "stack_out": [ "entry#0", @@ -11783,7 +11763,7 @@ "0" ] }, - "1876": { + "1859": { "op": "bytec 4 // \"outstanding_principal\"", "stack_out": [ "entry#0", @@ -11806,7 +11786,7 @@ "\"outstanding_principal\"" ] }, - "1878": { + "1861": { "op": "app_global_get_ex", "defined_out": [ "interest_due#0", @@ -11835,7 +11815,7 @@ "maybe_exists%5#0" ] }, - "1879": { + "1862": { "error": "check self.outstanding_principal exists", "op": "assert // check self.outstanding_principal exists", "defined_out": [ @@ -11863,7 +11843,7 @@ "principal_amount_due#0" ] }, - "1880": { + "1863": { "op": "bury 6", "defined_out": [ "interest_due#0", @@ -11889,10 +11869,10 @@ "max_event_count#0" ] }, - "1882": { + "1865": { "op": "b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@28" }, - "1885": { + "1868": { "block": "fund_due_cashflows_after_if_else@26", "stack_in": [ "entry#0", @@ -11936,7 +11916,7 @@ "principal_amount_due#0" ] }, - "1887": { + "1870": { "op": "bury 6", "defined_out": [ "principal_amount_due#0" @@ -11960,10 +11940,10 @@ "max_event_count#0" ] }, - "1889": { + "1872": { "op": "b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@28" }, - "1892": { + "1875": { "block": "fund_due_cashflows_after_if_else@27", "stack_in": [ "entry#0", @@ -12007,7 +11987,7 @@ "entry#0" ] }, - "1894": { + "1877": { "op": "pushint 49", "defined_out": [ "49", @@ -12034,7 +12014,7 @@ "49" ] }, - "1896": { + "1879": { "op": "extract_uint64", "defined_out": [ "entry#0", @@ -12060,7 +12040,7 @@ "values%0#0" ] }, - "1897": { + "1880": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -12088,7 +12068,7 @@ "0" ] }, - "1898": { + "1881": { "op": "bytec 4 // \"outstanding_principal\"", "defined_out": [ "\"outstanding_principal\"", @@ -12118,7 +12098,7 @@ "\"outstanding_principal\"" ] }, - "1900": { + "1883": { "op": "app_global_get_ex", "defined_out": [ "entry#0", @@ -12148,7 +12128,7 @@ "maybe_exists%6#0" ] }, - "1901": { + "1884": { "error": "check self.outstanding_principal exists", "op": "assert // check self.outstanding_principal exists", "stack_out": [ @@ -12172,7 +12152,7 @@ "maybe_value%6#0" ] }, - "1902": { + "1885": { "op": "dup2", "defined_out": [ "entry#0", @@ -12204,7 +12184,7 @@ "maybe_value%6#0 (copy)" ] }, - "1903": { + "1886": { "op": "<=", "defined_out": [ "entry#0", @@ -12234,7 +12214,7 @@ "tmp%9#2" ] }, - "1904": { + "1887": { "error": "Invalid ACTUS configuration", "op": "assert // Invalid ACTUS configuration", "stack_out": [ @@ -12258,7 +12238,7 @@ "maybe_value%6#0" ] }, - "1905": { + "1888": { "op": "swap", "stack_out": [ "entry#0", @@ -12281,7 +12261,7 @@ "values%0#0" ] }, - "1906": { + "1889": { "op": "-", "defined_out": [ "entry#0", @@ -12308,7 +12288,7 @@ "principal_amount_due#0" ] }, - "1907": { + "1890": { "op": "bury 6", "defined_out": [ "entry#0", @@ -12334,10 +12314,10 @@ "max_event_count#0" ] }, - "1909": { + "1892": { "op": "b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@28" }, - "1912": { + "1895": { "block": "fund_due_cashflows_after_if_else@15", "stack_in": [ "entry#0", @@ -12381,7 +12361,7 @@ "0" ] }, - "1913": { + "1896": { "op": "bytec 6 // \"accrued_interest\"", "defined_out": [ "\"accrued_interest\"", @@ -12408,7 +12388,7 @@ "\"accrued_interest\"" ] }, - "1915": { + "1898": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -12435,7 +12415,7 @@ "maybe_exists%0#0" ] }, - "1916": { + "1899": { "error": "check self.accrued_interest exists", "op": "assert // check self.accrued_interest exists", "stack_out": [ @@ -12458,7 +12438,7 @@ "maybe_value%0#0" ] }, - "1917": { + "1900": { "op": "dig 16", "defined_out": [ "entry#0", @@ -12485,7 +12465,7 @@ "entry#0" ] }, - "1919": { + "1902": { "callsub": "modules.actus_kernel.ActusKernelModule._entry_interest_segment", "op": "callsub _entry_interest_segment", "defined_out": [ @@ -12515,7 +12495,7 @@ "entry#0" ] }, - "1922": { + "1905": { "op": "bury 18", "defined_out": [ "_entry_interest_segment%0#0", @@ -12543,7 +12523,7 @@ "_entry_interest_segment%0#0" ] }, - "1924": { + "1907": { "op": "+", "defined_out": [ "entry#0", @@ -12569,7 +12549,7 @@ "interest_amount_due#0" ] }, - "1925": { + "1908": { "op": "bury 11", "defined_out": [ "entry#0", @@ -12594,10 +12574,10 @@ "max_event_count#0" ] }, - "1927": { + "1910": { "op": "b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_interest_amount@16" }, - "1930": { + "1913": { "block": "fund_due_cashflows_after_while@11", "stack_in": [ "entry#0", @@ -12641,7 +12621,7 @@ "processed_events#0" ] }, - "1932": { + "1915": { "op": "dup", "defined_out": [ "processed_events#0", @@ -12668,7 +12648,7 @@ "processed_events#0 (copy)" ] }, - "1933": { + "1916": { "error": "No due cashflow to pay", "op": "assert // No due cashflow to pay", "stack_out": [ @@ -12691,7 +12671,7 @@ "processed_events#0" ] }, - "1934": { + "1917": { "op": "dig 14", "defined_out": [ "funded_interest#0", @@ -12718,7 +12698,7 @@ "funded_interest#0" ] }, - "1936": { + "1919": { "op": "dup", "defined_out": [ "funded_interest#0", @@ -12747,7 +12727,7 @@ "funded_interest#0 (copy)" ] }, - "1937": { + "1920": { "op": "dig 15", "defined_out": [ "funded_interest#0", @@ -12778,7 +12758,7 @@ "funded_principal#0" ] }, - "1939": { + "1922": { "op": "dup", "defined_out": [ "funded_interest#0", @@ -12811,7 +12791,7 @@ "funded_principal#0 (copy)" ] }, - "1940": { + "1923": { "op": "cover 3", "stack_out": [ "entry#0", @@ -12837,7 +12817,7 @@ "funded_principal#0 (copy)" ] }, - "1942": { + "1925": { "op": "+", "defined_out": [ "funded_interest#0", @@ -12868,7 +12848,7 @@ "tmp%14#0" ] }, - "1943": { + "1926": { "op": "global LatestTimestamp", "defined_out": [ "funded_interest#0", @@ -12901,7 +12881,7 @@ "tmp%15#0" ] }, - "1945": { + "1928": { "op": "uncover 2", "stack_out": [ "entry#0", @@ -12927,7 +12907,7 @@ "funded_interest#0" ] }, - "1947": { + "1930": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0", @@ -12961,7 +12941,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "1948": { + "1931": { "op": "uncover 3", "stack_out": [ "entry#0", @@ -12987,7 +12967,7 @@ "funded_principal#0" ] }, - "1950": { + "1933": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0", @@ -13022,7 +13002,7 @@ "aggregate%val_as_bytes%1#0" ] }, - "1951": { + "1934": { "op": "concat", "defined_out": [ "aggregate%head%1#0", @@ -13055,7 +13035,7 @@ "aggregate%head%1#0" ] }, - "1952": { + "1935": { "op": "uncover 2", "stack_out": [ "entry#0", @@ -13080,7 +13060,7 @@ "tmp%14#0" ] }, - "1954": { + "1937": { "op": "itob", "defined_out": [ "aggregate%head%1#0", @@ -13113,7 +13093,7 @@ "aggregate%val_as_bytes%2#0" ] }, - "1955": { + "1938": { "op": "concat", "defined_out": [ "aggregate%head%2#0", @@ -13144,7 +13124,7 @@ "aggregate%head%2#0" ] }, - "1956": { + "1939": { "op": "uncover 2", "stack_out": [ "entry#0", @@ -13168,7 +13148,7 @@ "processed_events#0" ] }, - "1958": { + "1941": { "op": "itob", "defined_out": [ "aggregate%head%2#0", @@ -13200,7 +13180,7 @@ "aggregate%val_as_bytes%3#0" ] }, - "1959": { + "1942": { "op": "concat", "defined_out": [ "aggregate%head%3#0", @@ -13230,7 +13210,7 @@ "aggregate%head%3#0" ] }, - "1960": { + "1943": { "op": "swap", "stack_out": [ "entry#0", @@ -13253,7 +13233,7 @@ "tmp%15#0" ] }, - "1961": { + "1944": { "op": "itob", "defined_out": [ "aggregate%head%3#0", @@ -13283,7 +13263,7 @@ "aggregate%val_as_bytes%4#0" ] }, - "1962": { + "1945": { "op": "concat", "defined_out": [ "aggregate%head%4#0", @@ -13311,7 +13291,7 @@ "aggregate%head%4#0" ] }, - "1963": { + "1946": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -13341,7 +13321,7 @@ "0x151f7c75" ] }, - "1964": { + "1947": { "op": "swap", "stack_out": [ "entry#0", @@ -13364,7 +13344,7 @@ "aggregate%head%4#0" ] }, - "1965": { + "1948": { "op": "concat", "defined_out": [ "funded_interest#0", @@ -13392,7 +13372,7 @@ "tmp%3#0" ] }, - "1966": { + "1949": { "op": "log", "stack_out": [ "entry#0", @@ -13413,7 +13393,7 @@ "max_event_count#0" ] }, - "1967": { + "1950": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -13441,7 +13421,7 @@ "1" ] }, - "1968": { + "1951": { "op": "return", "stack_out": [ "entry#0", @@ -13462,7 +13442,7 @@ "max_event_count#0" ] }, - "1969": { + "1952": { "block": "fund_due_cashflows_bool_false@53", "stack_in": [ "entry#0", @@ -13506,10 +13486,10 @@ "or_result%0#0" ] }, - "1970": { + "1953": { "op": "b fund_due_cashflows_bool_merge@54" }, - "1973": { + "1956": { "subroutine": "modules.payment_agent.PaymentAgent.claim_due_cashflows[routing]", "params": {}, "block": "claim_due_cashflows", @@ -13519,7 +13499,7 @@ "interest_amount#0" ] }, - "1975": { + "1958": { "op": "dupn 2", "stack_out": [ "interest_amount#0", @@ -13527,10 +13507,10 @@ "total_amount#0" ] }, - "1977": { + "1960": { "op": "txna ApplicationArgs 1" }, - "1980": { + "1963": { "op": "dupn 2", "defined_out": [ "holding_address#0", @@ -13545,7 +13525,7 @@ "holding_address#0 (copy)" ] }, - "1982": { + "1965": { "op": "len", "defined_out": [ "holding_address#0", @@ -13560,7 +13540,7 @@ "len%0#0" ] }, - "1983": { + "1966": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -13577,7 +13557,7 @@ "32" ] }, - "1984": { + "1967": { "op": "==", "defined_out": [ "eq%0#0", @@ -13592,7 +13572,7 @@ "eq%0#0" ] }, - "1985": { + "1968": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ @@ -13603,7 +13583,7 @@ "holding_address#0" ] }, - "1986": { + "1969": { "op": "txna ApplicationArgs 2", "defined_out": [ "holding_address#0", @@ -13618,7 +13598,7 @@ "tmp%2#0" ] }, - "1989": { + "1972": { "op": "dup", "defined_out": [ "holding_address#0", @@ -13635,7 +13615,7 @@ "tmp%2#0 (copy)" ] }, - "1990": { + "1973": { "op": "intc_0 // 0", "stack_out": [ "interest_amount#0", @@ -13648,7 +13628,7 @@ "0" ] }, - "1991": { + "1974": { "error": "invalid array length header", "op": "extract_uint16 // on error: invalid array length header", "defined_out": [ @@ -13666,7 +13646,7 @@ "aggregate%array_length%0#0" ] }, - "1992": { + "1975": { "op": "pushint 2", "defined_out": [ "2", @@ -13685,7 +13665,7 @@ "2" ] }, - "1994": { + "1977": { "op": "+", "defined_out": [ "add%0#0", @@ -13702,7 +13682,7 @@ "add%0#0" ] }, - "1995": { + "1978": { "op": "dig 1", "stack_out": [ "interest_amount#0", @@ -13715,7 +13695,7 @@ "tmp%2#0 (copy)" ] }, - "1997": { + "1980": { "op": "len", "defined_out": [ "add%0#0", @@ -13734,7 +13714,7 @@ "len%1#0" ] }, - "1998": { + "1981": { "op": "==", "defined_out": [ "eq%1#0", @@ -13751,7 +13731,7 @@ "eq%1#0" ] }, - "1999": { + "1982": { "error": "invalid number of bytes for arc4.dynamic_array", "op": "assert // invalid number of bytes for arc4.dynamic_array", "stack_out": [ @@ -13763,7 +13743,7 @@ "tmp%2#0" ] }, - "2000": { + "1983": { "op": "extract 2 0", "defined_out": [ "holding_address#0", @@ -13778,7 +13758,7 @@ "payment_info#0" ] }, - "2003": { + "1986": { "op": "swap", "defined_out": [ "holding_address#0", @@ -13793,7 +13773,7 @@ "holding_address#0" ] }, - "2004": { + "1987": { "op": "intc_0 // 0", "stack_out": [ "interest_amount#0", @@ -13805,7 +13785,7 @@ "0" ] }, - "2005": { + "1988": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"", @@ -13824,7 +13804,7 @@ "\"status\"" ] }, - "2006": { + "1989": { "op": "app_global_get_ex", "defined_out": [ "holding_address#0", @@ -13843,7 +13823,7 @@ "maybe_exists%0#0" ] }, - "2007": { + "1990": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ @@ -13856,7 +13836,7 @@ "maybe_value%0#0" ] }, - "2008": { + "1991": { "error": "D-ASA not configured", "op": "assert // D-ASA not configured", "stack_out": [ @@ -13868,7 +13848,7 @@ "holding_address#0" ] }, - "2009": { + "1992": { "op": "bytec 8 // 0x4123", "defined_out": [ "0x4123", @@ -13885,7 +13865,7 @@ "0x4123" ] }, - "2011": { + "1994": { "op": "swap", "stack_out": [ "interest_amount#0", @@ -13897,7 +13877,7 @@ "holding_address#0" ] }, - "2012": { + "1995": { "op": "concat", "defined_out": [ "box_prefixed_key%0#4", @@ -13913,7 +13893,7 @@ "box_prefixed_key%0#4" ] }, - "2013": { + "1996": { "op": "dup", "defined_out": [ "box_prefixed_key%0#4", @@ -13930,7 +13910,7 @@ "box_prefixed_key%0#4" ] }, - "2014": { + "1997": { "op": "box_len", "defined_out": [ "_%0#0", @@ -13950,7 +13930,7 @@ "maybe_exists%0#0" ] }, - "2015": { + "1998": { "op": "bury 1", "stack_out": [ "interest_amount#0", @@ -13962,7 +13942,7 @@ "maybe_exists%0#0" ] }, - "2017": { + "2000": { "error": "Invalid account holding address", "op": "assert // Invalid account holding address", "stack_out": [ @@ -13974,7 +13954,7 @@ "box_prefixed_key%0#4" ] }, - "2018": { + "2001": { "op": "intc_0 // 0", "stack_out": [ "interest_amount#0", @@ -13986,7 +13966,7 @@ "0" ] }, - "2019": { + "2002": { "op": "bytec 27 // 0x523a4f504423", "defined_out": [ "0", @@ -14006,7 +13986,7 @@ "0x523a4f504423" ] }, - "2021": { + "2004": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#4", @@ -14026,7 +14006,7 @@ "maybe_exists%0#0" ] }, - "2022": { + "2005": { "error": "check self.op_daemon exists", "op": "assert // check self.op_daemon exists", "stack_out": [ @@ -14039,7 +14019,7 @@ "maybe_value%0#3" ] }, - "2023": { + "2006": { "op": "global ZeroAddress", "defined_out": [ "box_prefixed_key%0#4", @@ -14059,7 +14039,7 @@ "tmp%0#1" ] }, - "2025": { + "2008": { "op": "!=", "defined_out": [ "box_prefixed_key%0#4", @@ -14077,7 +14057,7 @@ "tmp%1#2" ] }, - "2026": { + "2009": { "op": "bz claim_due_cashflows_after_if_else@17", "stack_out": [ "interest_amount#0", @@ -14088,7 +14068,7 @@ "box_prefixed_key%0#4" ] }, - "2029": { + "2012": { "op": "txn Sender", "defined_out": [ "box_prefixed_key%0#4", @@ -14106,7 +14086,7 @@ "tmp%2#3" ] }, - "2031": { + "2014": { "op": "intc_0 // 0", "stack_out": [ "interest_amount#0", @@ -14119,7 +14099,7 @@ "0" ] }, - "2032": { + "2015": { "op": "bytec 27 // 0x523a4f504423", "stack_out": [ "interest_amount#0", @@ -14133,7 +14113,7 @@ "0x523a4f504423" ] }, - "2034": { + "2017": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#4", @@ -14155,7 +14135,7 @@ "maybe_exists%1#0" ] }, - "2035": { + "2018": { "error": "check self.op_daemon exists", "op": "assert // check self.op_daemon exists", "stack_out": [ @@ -14169,7 +14149,7 @@ "maybe_value%1#1" ] }, - "2036": { + "2019": { "op": "==", "defined_out": [ "box_prefixed_key%0#4", @@ -14187,7 +14167,7 @@ "tmp%3#1" ] }, - "2037": { + "2020": { "op": "bnz claim_due_cashflows_bool_true@14", "stack_out": [ "interest_amount#0", @@ -14198,7 +14178,7 @@ "box_prefixed_key%0#4" ] }, - "2040": { + "2023": { "op": "txn Sender", "defined_out": [ "box_prefixed_key%0#4", @@ -14216,7 +14196,7 @@ "tmp%4#0" ] }, - "2042": { + "2025": { "op": "dig 3", "stack_out": [ "interest_amount#0", @@ -14229,7 +14209,7 @@ "holding_address#0" ] }, - "2044": { + "2027": { "op": "==", "defined_out": [ "box_prefixed_key%0#4", @@ -14247,7 +14227,7 @@ "tmp%5#2" ] }, - "2045": { + "2028": { "op": "bnz claim_due_cashflows_bool_true@14", "stack_out": [ "interest_amount#0", @@ -14258,7 +14238,7 @@ "box_prefixed_key%0#4" ] }, - "2048": { + "2031": { "op": "txn Sender", "defined_out": [ "box_prefixed_key%0#4", @@ -14276,7 +14256,7 @@ "tmp%6#1" ] }, - "2050": { + "2033": { "op": "dig 1", "stack_out": [ "interest_amount#0", @@ -14289,7 +14269,7 @@ "box_prefixed_key%0#4" ] }, - "2052": { + "2035": { "op": "box_get", "defined_out": [ "aggregate%box_get%0#0", @@ -14311,7 +14291,7 @@ "aggregate%box_get%1#0" ] }, - "2053": { + "2036": { "error": "check self.account entry exists", "op": "assert // check self.account entry exists", "stack_out": [ @@ -14325,7 +14305,7 @@ "aggregate%box_get%0#0" ] }, - "2054": { + "2037": { "op": "extract 0 32", "defined_out": [ "aggregate%extract%0#0", @@ -14345,7 +14325,7 @@ "aggregate%extract%0#0" ] }, - "2057": { + "2040": { "op": "==", "defined_out": [ "box_prefixed_key%0#4", @@ -14363,7 +14343,7 @@ "tmp%7#1" ] }, - "2058": { + "2041": { "op": "bz claim_due_cashflows_bool_false@15", "stack_out": [ "interest_amount#0", @@ -14374,7 +14354,7 @@ "box_prefixed_key%0#4" ] }, - "2061": { + "2044": { "block": "claim_due_cashflows_bool_true@14", "stack_in": [ "interest_amount#0", @@ -14398,7 +14378,7 @@ "or_result%0#0" ] }, - "2062": { + "2045": { "error": "Not authorized", "block": "claim_due_cashflows_bool_merge@16", "stack_in": [ @@ -14421,7 +14401,7 @@ "box_prefixed_key%0#4" ] }, - "2063": { + "2046": { "block": "claim_due_cashflows_after_if_else@17", "stack_in": [ "interest_amount#0", @@ -14434,11 +14414,11 @@ "callsub": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", "op": "callsub _assert_is_not_asset_defaulted" }, - "2066": { + "2049": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_suspended", "op": "callsub _assert_is_not_asset_suspended" }, - "2069": { + "2052": { "op": "intc_0 // 0", "defined_out": [ "0" @@ -14453,7 +14433,7 @@ "0" ] }, - "2070": { + "2053": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"", @@ -14470,7 +14450,7 @@ "\"status\"" ] }, - "2071": { + "2054": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -14487,7 +14467,7 @@ "maybe_exists%0#0" ] }, - "2072": { + "2055": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ @@ -14500,7 +14480,7 @@ "maybe_value%0#0" ] }, - "2073": { + "2056": { "op": "pushint 50", "defined_out": [ "50", @@ -14517,7 +14497,7 @@ "50" ] }, - "2075": { + "2058": { "op": "==", "defined_out": [ "tmp%0#2" @@ -14532,7 +14512,7 @@ "tmp%0#2" ] }, - "2076": { + "2059": { "op": "!", "defined_out": [ "tmp%1#2" @@ -14547,7 +14527,7 @@ "tmp%1#2" ] }, - "2077": { + "2060": { "error": "IED not yet executed", "op": "assert // IED not yet executed", "stack_out": [ @@ -14559,7 +14539,7 @@ "box_prefixed_key%0#4" ] }, - "2078": { + "2061": { "op": "dig 2", "defined_out": [ "holding_address#0" @@ -14574,7 +14554,7 @@ "holding_address#0" ] }, - "2080": { + "2063": { "op": "dup", "defined_out": [ "holding_address#0", @@ -14591,7 +14571,7 @@ "holding_address#0 (copy)" ] }, - "2081": { + "2064": { "callsub": "modules.accounting.AccountingModule._ensure_units_activated", "op": "callsub _ensure_units_activated", "stack_out": [ @@ -14604,7 +14584,7 @@ "holding_address#0" ] }, - "2084": { + "2067": { "callsub": "modules.accounting.AccountingModule._settle_position", "op": "callsub _settle_position", "defined_out": [ @@ -14623,7 +14603,7 @@ "{_settle_position}.1" ] }, - "2087": { + "2070": { "op": "popn 2", "stack_out": [ "interest_amount#0", @@ -14634,7 +14614,7 @@ "box_prefixed_key%0#4" ] }, - "2089": { + "2072": { "op": "dup", "defined_out": [ "box_prefixed_key%0#4", @@ -14650,7 +14630,7 @@ "box_prefixed_key%0#4" ] }, - "2090": { + "2073": { "op": "box_get", "defined_out": [ "aggregate%box_get%2#0", @@ -14669,7 +14649,7 @@ "aggregate%box_get%3#0" ] }, - "2091": { + "2074": { "error": "check self.account entry exists", "op": "assert // check self.account entry exists", "stack_out": [ @@ -14682,7 +14662,7 @@ "aggregate%box_get%2#0" ] }, - "2092": { + "2075": { "op": "dup", "defined_out": [ "aggregate%box_get%2#0", @@ -14701,7 +14681,7 @@ "aggregate%box_get%2#0 (copy)" ] }, - "2093": { + "2076": { "op": "pushint 73", "defined_out": [ "73", @@ -14722,7 +14702,7 @@ "73" ] }, - "2095": { + "2078": { "op": "extract_uint64", "defined_out": [ "aggregate%box_get%2#0", @@ -14741,7 +14721,7 @@ "interest_amount#0" ] }, - "2096": { + "2079": { "op": "dup", "stack_out": [ "interest_amount#0", @@ -14755,7 +14735,7 @@ "interest_amount#0 (copy)" ] }, - "2097": { + "2080": { "op": "cover 2", "stack_out": [ "interest_amount#0", @@ -14769,7 +14749,7 @@ "interest_amount#0" ] }, - "2099": { + "2082": { "op": "bury 8", "defined_out": [ "aggregate%box_get%2#0", @@ -14788,7 +14768,7 @@ "aggregate%box_get%2#0" ] }, - "2101": { + "2084": { "op": "dup", "stack_out": [ "interest_amount#0", @@ -14802,7 +14782,7 @@ "aggregate%box_get%2#0 (copy)" ] }, - "2102": { + "2085": { "op": "pushint 81", "defined_out": [ "81", @@ -14825,7 +14805,7 @@ "81" ] }, - "2104": { + "2087": { "op": "extract_uint64", "defined_out": [ "aggregate%box_get%2#0", @@ -14846,7 +14826,7 @@ "principal_amount#0" ] }, - "2105": { + "2088": { "op": "dup", "stack_out": [ "interest_amount#0", @@ -14861,7 +14841,7 @@ "principal_amount#0" ] }, - "2106": { + "2089": { "op": "bury 8", "defined_out": [ "aggregate%box_get%2#0", @@ -14882,7 +14862,7 @@ "principal_amount#0" ] }, - "2108": { + "2091": { "op": "uncover 2", "stack_out": [ "interest_amount#0", @@ -14896,7 +14876,7 @@ "interest_amount#0" ] }, - "2110": { + "2093": { "op": "+", "defined_out": [ "aggregate%box_get%2#0", @@ -14917,7 +14897,7 @@ "total_amount#0" ] }, - "2111": { + "2094": { "op": "dup", "stack_out": [ "interest_amount#0", @@ -14931,7 +14911,7 @@ "total_amount#0" ] }, - "2112": { + "2095": { "op": "bury 6", "stack_out": [ "interest_amount#0", @@ -14944,7 +14924,7 @@ "total_amount#0" ] }, - "2114": { + "2097": { "error": "No due cashflow to pay", "op": "assert // No due cashflow to pay", "stack_out": [ @@ -14957,7 +14937,7 @@ "aggregate%box_get%2#0" ] }, - "2115": { + "2098": { "op": "extract 0 32", "defined_out": [ "aggregate%extract%5#0", @@ -14977,7 +14957,7 @@ "aggregate%extract%5#0" ] }, - "2118": { + "2101": { "op": "intc_0 // 0", "stack_out": [ "interest_amount#0", @@ -14990,7 +14970,7 @@ "0" ] }, - "2119": { + "2102": { "op": "bytec 19 // \"settlement_asset_id\"", "defined_out": [ "\"settlement_asset_id\"", @@ -15014,7 +14994,7 @@ "\"settlement_asset_id\"" ] }, - "2121": { + "2104": { "op": "app_global_get_ex", "stack_out": [ "interest_amount#0", @@ -15028,7 +15008,7 @@ "maybe_exists%0#0" ] }, - "2122": { + "2105": { "error": "check self.settlement_asset_id exists", "op": "assert // check self.settlement_asset_id exists", "stack_out": [ @@ -15042,7 +15022,7 @@ "maybe_value%0#0" ] }, - "2123": { + "2106": { "op": "asset_holding_get AssetBalance", "defined_out": [ "box_prefixed_key%0#4", @@ -15064,7 +15044,7 @@ "tmp%1#2" ] }, - "2125": { + "2108": { "op": "bury 1", "stack_out": [ "interest_amount#0", @@ -15076,7 +15056,7 @@ "tmp%1#2" ] }, - "2127": { + "2110": { "op": "bz claim_due_cashflows_bool_false@24", "stack_out": [ "interest_amount#0", @@ -15087,7 +15067,7 @@ "box_prefixed_key%0#4" ] }, - "2130": { + "2113": { "op": "dup", "stack_out": [ "interest_amount#0", @@ -15099,7 +15079,7 @@ "box_prefixed_key%0#4" ] }, - "2131": { + "2114": { "op": "box_get", "defined_out": [ "aggregate%box_get%12#0", @@ -15121,7 +15101,7 @@ "aggregate%box_get%13#0" ] }, - "2132": { + "2115": { "error": "check self.account entry exists", "op": "assert // check self.account entry exists", "stack_out": [ @@ -15134,7 +15114,7 @@ "aggregate%box_get%12#0" ] }, - "2133": { + "2116": { "op": "pushint 384", "defined_out": [ "384", @@ -15156,7 +15136,7 @@ "384" ] }, - "2136": { + "2119": { "op": "getbit", "defined_out": [ "aggregate%get_bit%0#0", @@ -15176,7 +15156,7 @@ "aggregate%get_bit%0#0" ] }, - "2137": { + "2120": { "op": "bnz claim_due_cashflows_bool_false@24", "stack_out": [ "interest_amount#0", @@ -15187,7 +15167,7 @@ "box_prefixed_key%0#4" ] }, - "2140": { + "2123": { "op": "intc_1 // 1", "defined_out": [ "and_result%0#0", @@ -15207,7 +15187,7 @@ "and_result%0#0" ] }, - "2141": { + "2124": { "block": "claim_due_cashflows_bool_merge@25", "stack_in": [ "interest_amount#0", @@ -15229,7 +15209,7 @@ "box_prefixed_key%0#4" ] }, - "2144": { + "2127": { "op": "global CurrentApplicationAddress", "defined_out": [ "tmp%0#1" @@ -15244,7 +15224,7 @@ "tmp%0#1" ] }, - "2146": { + "2129": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -15261,7 +15241,7 @@ "0" ] }, - "2147": { + "2130": { "op": "bytec 19 // \"settlement_asset_id\"", "defined_out": [ "\"settlement_asset_id\"", @@ -15280,7 +15260,7 @@ "\"settlement_asset_id\"" ] }, - "2149": { + "2132": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -15299,7 +15279,7 @@ "maybe_exists%0#0" ] }, - "2150": { + "2133": { "error": "check self.settlement_asset_id exists", "op": "assert // check self.settlement_asset_id exists", "stack_out": [ @@ -15313,7 +15293,7 @@ "maybe_value%0#0" ] }, - "2151": { + "2134": { "op": "swap", "stack_out": [ "interest_amount#0", @@ -15326,7 +15306,7 @@ "tmp%0#1" ] }, - "2152": { + "2135": { "op": "dig 1", "defined_out": [ "maybe_value%0#0", @@ -15345,7 +15325,7 @@ "maybe_value%0#0 (copy)" ] }, - "2154": { + "2137": { "op": "asset_holding_get AssetBalance", "defined_out": [ "check%0#0", @@ -15364,7 +15344,7 @@ "check%0#0" ] }, - "2156": { + "2139": { "error": "account opted into asset", "op": "assert // account opted into asset", "stack_out": [ @@ -15378,7 +15358,7 @@ "value%0#0" ] }, - "2157": { + "2140": { "op": "dig 5", "defined_out": [ "maybe_value%0#0", @@ -15397,7 +15377,7 @@ "total_amount#0" ] }, - "2159": { + "2142": { "op": "dup", "defined_out": [ "maybe_value%0#0", @@ -15418,7 +15398,7 @@ "total_amount#0 (copy)" ] }, - "2160": { + "2143": { "op": "cover 2", "stack_out": [ "interest_amount#0", @@ -15433,7 +15413,7 @@ "total_amount#0 (copy)" ] }, - "2162": { + "2145": { "op": ">=", "defined_out": [ "maybe_value%0#0", @@ -15452,7 +15432,7 @@ "tmp%1#2" ] }, - "2163": { + "2146": { "error": "Not enough funds for the payment", "op": "assert // Not enough funds for the payment", "stack_out": [ @@ -15466,7 +15446,7 @@ "total_amount#0" ] }, - "2164": { + "2147": { "op": "dig 2", "defined_out": [ "box_prefixed_key%0#4", @@ -15485,7 +15465,7 @@ "box_prefixed_key%0#4" ] }, - "2166": { + "2149": { "op": "dup", "defined_out": [ "box_prefixed_key%0#4", @@ -15506,7 +15486,7 @@ "box_prefixed_key%0#4 (copy)" ] }, - "2167": { + "2150": { "op": "cover 3", "stack_out": [ "interest_amount#0", @@ -15521,7 +15501,7 @@ "box_prefixed_key%0#4 (copy)" ] }, - "2169": { + "2152": { "op": "box_get", "defined_out": [ "aggregate%box_get%15#0", @@ -15544,7 +15524,7 @@ "aggregate%box_get%15#0" ] }, - "2170": { + "2153": { "error": "check self.account entry exists", "op": "assert // check self.account entry exists", "stack_out": [ @@ -15560,7 +15540,7 @@ "position#0" ] }, - "2171": { + "2154": { "op": "dup", "defined_out": [ "box_prefixed_key%0#4", @@ -15583,7 +15563,7 @@ "position#0 (copy)" ] }, - "2172": { + "2155": { "op": "extract 0 32", "defined_out": [ "box_prefixed_key%0#4", @@ -15606,10 +15586,10 @@ "receiver#0" ] }, - "2175": { + "2158": { "op": "itxn_begin" }, - "2176": { + "2159": { "op": "global MinTxnFee", "defined_out": [ "box_prefixed_key%0#4", @@ -15634,7 +15614,7 @@ "inner_txn_params%0%%param_Fee_idx_0#0" ] }, - "2178": { + "2161": { "op": "uncover 3", "stack_out": [ "interest_amount#0", @@ -15651,7 +15631,7 @@ "total_amount#0" ] }, - "2180": { + "2163": { "op": "itxn_field AssetAmount", "stack_out": [ "interest_amount#0", @@ -15667,7 +15647,7 @@ "inner_txn_params%0%%param_Fee_idx_0#0" ] }, - "2182": { + "2165": { "op": "swap", "stack_out": [ "interest_amount#0", @@ -15683,7 +15663,7 @@ "receiver#0" ] }, - "2183": { + "2166": { "op": "itxn_field AssetReceiver", "stack_out": [ "interest_amount#0", @@ -15698,7 +15678,7 @@ "inner_txn_params%0%%param_Fee_idx_0#0" ] }, - "2185": { + "2168": { "op": "uncover 2", "stack_out": [ "interest_amount#0", @@ -15713,7 +15693,7 @@ "maybe_value%0#0" ] }, - "2187": { + "2170": { "op": "itxn_field XferAsset", "stack_out": [ "interest_amount#0", @@ -15727,7 +15707,7 @@ "inner_txn_params%0%%param_Fee_idx_0#0" ] }, - "2189": { + "2172": { "op": "pushint 4 // axfer", "defined_out": [ "axfer", @@ -15749,7 +15729,7 @@ "axfer" ] }, - "2191": { + "2174": { "op": "itxn_field TypeEnum", "stack_out": [ "interest_amount#0", @@ -15763,7 +15743,7 @@ "inner_txn_params%0%%param_Fee_idx_0#0" ] }, - "2193": { + "2176": { "op": "itxn_field Fee", "stack_out": [ "interest_amount#0", @@ -15776,10 +15756,10 @@ "position#0" ] }, - "2195": { + "2178": { "op": "itxn_submit" }, - "2196": { + "2179": { "op": "dup", "stack_out": [ "interest_amount#0", @@ -15793,7 +15773,7 @@ "position#0 (copy)" ] }, - "2197": { + "2180": { "op": "pushint 73", "defined_out": [ "73", @@ -15815,7 +15795,7 @@ "73" ] }, - "2199": { + "2182": { "op": "extract_uint64", "defined_out": [ "box_prefixed_key%0#4", @@ -15835,7 +15815,7 @@ "interest_amount#0" ] }, - "2200": { + "2183": { "op": "dup", "stack_out": [ "interest_amount#0", @@ -15850,7 +15830,7 @@ "interest_amount#0 (copy)" ] }, - "2201": { + "2184": { "op": "cover 2", "stack_out": [ "interest_amount#0", @@ -15865,7 +15845,7 @@ "interest_amount#0" ] }, - "2203": { + "2186": { "op": "bury 9", "defined_out": [ "box_prefixed_key%0#4", @@ -15885,7 +15865,7 @@ "position#0" ] }, - "2205": { + "2188": { "op": "dup", "stack_out": [ "interest_amount#0", @@ -15900,7 +15880,7 @@ "position#0 (copy)" ] }, - "2206": { + "2189": { "op": "pushint 81", "defined_out": [ "81", @@ -15924,7 +15904,7 @@ "81" ] }, - "2208": { + "2191": { "op": "extract_uint64", "defined_out": [ "box_prefixed_key%0#4", @@ -15946,7 +15926,7 @@ "principal_amount#0" ] }, - "2209": { + "2192": { "op": "dup", "stack_out": [ "interest_amount#0", @@ -15962,7 +15942,7 @@ "principal_amount#0 (copy)" ] }, - "2210": { + "2193": { "op": "cover 3", "stack_out": [ "interest_amount#0", @@ -15978,7 +15958,7 @@ "principal_amount#0" ] }, - "2212": { + "2195": { "op": "bury 9", "defined_out": [ "box_prefixed_key%0#4", @@ -16000,7 +15980,7 @@ "position#0" ] }, - "2214": { + "2197": { "op": "intc_0 // 0", "stack_out": [ "interest_amount#0", @@ -16016,7 +15996,7 @@ "0" ] }, - "2215": { + "2198": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0", @@ -16040,7 +16020,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "2216": { + "2199": { "op": "swap", "stack_out": [ "interest_amount#0", @@ -16056,7 +16036,7 @@ "position#0" ] }, - "2217": { + "2200": { "op": "dig 1", "defined_out": [ "aggregate%val_as_bytes%0#0", @@ -16082,7 +16062,7 @@ "aggregate%val_as_bytes%0#0 (copy)" ] }, - "2219": { + "2202": { "op": "replace2 73", "stack_out": [ "interest_amount#0", @@ -16098,7 +16078,7 @@ "position#0" ] }, - "2221": { + "2204": { "op": "swap", "stack_out": [ "interest_amount#0", @@ -16114,7 +16094,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "2222": { + "2205": { "op": "replace2 81", "stack_out": [ "interest_amount#0", @@ -16129,7 +16109,7 @@ "position#0" ] }, - "2224": { + "2207": { "op": "uncover 3", "stack_out": [ "interest_amount#0", @@ -16144,7 +16124,7 @@ "box_prefixed_key%0#4" ] }, - "2226": { + "2209": { "op": "swap", "stack_out": [ "interest_amount#0", @@ -16159,7 +16139,7 @@ "position#0" ] }, - "2227": { + "2210": { "op": "box_put", "stack_out": [ "interest_amount#0", @@ -16172,7 +16152,7 @@ "interest_amount#0" ] }, - "2228": { + "2211": { "op": "intc_0 // 0", "stack_out": [ "interest_amount#0", @@ -16186,7 +16166,7 @@ "0" ] }, - "2229": { + "2212": { "op": "bytec 15 // \"reserved_interest\"", "defined_out": [ "\"reserved_interest\"", @@ -16209,7 +16189,7 @@ "\"reserved_interest\"" ] }, - "2231": { + "2214": { "op": "app_global_get_ex", "stack_out": [ "interest_amount#0", @@ -16224,7 +16204,7 @@ "maybe_exists%0#0" ] }, - "2232": { + "2215": { "error": "check self.reserved_interest exists", "op": "assert // check self.reserved_interest exists", "stack_out": [ @@ -16239,7 +16219,7 @@ "maybe_value%0#0" ] }, - "2233": { + "2216": { "op": "dup", "stack_out": [ "interest_amount#0", @@ -16254,7 +16234,7 @@ "maybe_value%0#0 (copy)" ] }, - "2234": { + "2217": { "op": "dig 2", "defined_out": [ "box_prefixed_key%0#4", @@ -16279,7 +16259,7 @@ "interest_amount#0 (copy)" ] }, - "2236": { + "2219": { "op": ">=", "defined_out": [ "box_prefixed_key%0#4", @@ -16302,7 +16282,7 @@ "tmp%0#2" ] }, - "2237": { + "2220": { "error": "Not enough funds for the payment", "op": "assert // Not enough funds for the payment", "stack_out": [ @@ -16317,7 +16297,7 @@ "maybe_value%0#0" ] }, - "2238": { + "2221": { "op": "intc_0 // 0", "stack_out": [ "interest_amount#0", @@ -16332,7 +16312,7 @@ "0" ] }, - "2239": { + "2222": { "op": "bytec 12 // \"reserved_principal\"", "defined_out": [ "\"reserved_principal\"", @@ -16357,7 +16337,7 @@ "\"reserved_principal\"" ] }, - "2241": { + "2224": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#4", @@ -16382,7 +16362,7 @@ "maybe_exists%1#0" ] }, - "2242": { + "2225": { "error": "check self.reserved_principal exists", "op": "assert // check self.reserved_principal exists", "stack_out": [ @@ -16398,7 +16378,7 @@ "maybe_value%1#0" ] }, - "2243": { + "2226": { "op": "dig 3", "defined_out": [ "box_prefixed_key%0#4", @@ -16423,7 +16403,7 @@ "principal_amount#0 (copy)" ] }, - "2245": { + "2228": { "op": ">=", "stack_out": [ "interest_amount#0", @@ -16438,7 +16418,7 @@ "tmp%1#2" ] }, - "2246": { + "2229": { "error": "Not enough funds for the payment", "op": "assert // Not enough funds for the payment", "stack_out": [ @@ -16453,7 +16433,7 @@ "maybe_value%0#0" ] }, - "2247": { + "2230": { "op": "swap", "stack_out": [ "interest_amount#0", @@ -16467,7 +16447,7 @@ "interest_amount#0" ] }, - "2248": { + "2231": { "op": "-", "defined_out": [ "box_prefixed_key%0#4", @@ -16487,7 +16467,7 @@ "tmp%2#2" ] }, - "2249": { + "2232": { "op": "bytec 15 // \"reserved_interest\"", "stack_out": [ "interest_amount#0", @@ -16501,7 +16481,7 @@ "\"reserved_interest\"" ] }, - "2251": { + "2234": { "op": "swap", "stack_out": [ "interest_amount#0", @@ -16515,7 +16495,7 @@ "tmp%2#2" ] }, - "2252": { + "2235": { "op": "app_global_put", "stack_out": [ "interest_amount#0", @@ -16527,7 +16507,7 @@ "principal_amount#0" ] }, - "2253": { + "2236": { "op": "intc_0 // 0", "stack_out": [ "interest_amount#0", @@ -16540,7 +16520,7 @@ "0" ] }, - "2254": { + "2237": { "op": "bytec 12 // \"reserved_principal\"", "stack_out": [ "interest_amount#0", @@ -16554,7 +16534,7 @@ "\"reserved_principal\"" ] }, - "2256": { + "2239": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#4", @@ -16576,7 +16556,7 @@ "maybe_exists%3#0" ] }, - "2257": { + "2240": { "error": "check self.reserved_principal exists", "op": "assert // check self.reserved_principal exists", "stack_out": [ @@ -16590,7 +16570,7 @@ "maybe_value%3#0" ] }, - "2258": { + "2241": { "op": "swap", "stack_out": [ "interest_amount#0", @@ -16603,7 +16583,7 @@ "principal_amount#0" ] }, - "2259": { + "2242": { "op": "-", "defined_out": [ "box_prefixed_key%0#4", @@ -16622,7 +16602,7 @@ "tmp%3#0" ] }, - "2260": { + "2243": { "op": "bytec 12 // \"reserved_principal\"", "stack_out": [ "interest_amount#0", @@ -16635,7 +16615,7 @@ "\"reserved_principal\"" ] }, - "2262": { + "2245": { "op": "swap", "stack_out": [ "interest_amount#0", @@ -16648,7 +16628,7 @@ "tmp%3#0" ] }, - "2263": { + "2246": { "op": "app_global_put", "stack_out": [ "interest_amount#0", @@ -16659,7 +16639,7 @@ "box_prefixed_key%0#4" ] }, - "2264": { + "2247": { "block": "claim_due_cashflows_after_if_else@3", "stack_in": [ "interest_amount#0", @@ -16683,7 +16663,7 @@ "interest_amount#0" ] }, - "2266": { + "2249": { "op": "dup", "defined_out": [ "interest_amount#0", @@ -16700,7 +16680,7 @@ "interest_amount#0 (copy)" ] }, - "2267": { + "2250": { "op": "dig 6", "defined_out": [ "interest_amount#0", @@ -16719,7 +16699,7 @@ "principal_amount#0" ] }, - "2269": { + "2252": { "op": "dup", "defined_out": [ "interest_amount#0", @@ -16740,7 +16720,7 @@ "principal_amount#0 (copy)" ] }, - "2270": { + "2253": { "op": "cover 3", "stack_out": [ "interest_amount#0", @@ -16755,7 +16735,7 @@ "principal_amount#0 (copy)" ] }, - "2272": { + "2255": { "op": "+", "defined_out": [ "interest_amount#0", @@ -16774,7 +16754,7 @@ "tmp%5#1" ] }, - "2273": { + "2256": { "op": "global LatestTimestamp", "defined_out": [ "interest_amount#0", @@ -16795,7 +16775,7 @@ "tmp%6#0" ] }, - "2275": { + "2258": { "op": "uncover 2", "stack_out": [ "interest_amount#0", @@ -16810,7 +16790,7 @@ "interest_amount#0" ] }, - "2277": { + "2260": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%1#0", @@ -16832,7 +16812,7 @@ "aggregate%val_as_bytes%1#0" ] }, - "2278": { + "2261": { "op": "uncover 3", "stack_out": [ "interest_amount#0", @@ -16847,7 +16827,7 @@ "principal_amount#0" ] }, - "2280": { + "2263": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%1#0", @@ -16870,7 +16850,7 @@ "aggregate%val_as_bytes%2#0" ] }, - "2281": { + "2264": { "op": "concat", "defined_out": [ "aggregate%head%1#0", @@ -16891,7 +16871,7 @@ "aggregate%head%1#0" ] }, - "2282": { + "2265": { "op": "uncover 2", "stack_out": [ "interest_amount#0", @@ -16905,7 +16885,7 @@ "tmp%5#1" ] }, - "2284": { + "2267": { "op": "itob", "defined_out": [ "aggregate%head%1#0", @@ -16926,7 +16906,7 @@ "aggregate%val_as_bytes%3#0" ] }, - "2285": { + "2268": { "op": "concat", "defined_out": [ "aggregate%head%2#0", @@ -16945,7 +16925,7 @@ "aggregate%head%2#0" ] }, - "2286": { + "2269": { "op": "swap", "stack_out": [ "interest_amount#0", @@ -16958,7 +16938,7 @@ "tmp%6#0" ] }, - "2287": { + "2270": { "op": "itob", "defined_out": [ "aggregate%head%2#0", @@ -16977,7 +16957,7 @@ "aggregate%val_as_bytes%4#0" ] }, - "2288": { + "2271": { "op": "concat", "defined_out": [ "aggregate%head%3#0", @@ -16994,7 +16974,7 @@ "aggregate%head%3#0" ] }, - "2289": { + "2272": { "op": "dig 2", "defined_out": [ "aggregate%head%3#0", @@ -17013,7 +16993,7 @@ "payment_info#0" ] }, - "2291": { + "2274": { "op": "dup", "defined_out": [ "aggregate%head%3#0", @@ -17034,7 +17014,7 @@ "payment_info#0 (copy)" ] }, - "2292": { + "2275": { "op": "len", "defined_out": [ "aggregate%head%3#0", @@ -17055,7 +17035,7 @@ "aggregate%length%0#0" ] }, - "2293": { + "2276": { "op": "itob", "defined_out": [ "aggregate%as_bytes%0#0", @@ -17076,7 +17056,7 @@ "aggregate%as_bytes%0#0" ] }, - "2294": { + "2277": { "op": "extract 6 2", "defined_out": [ "aggregate%head%3#0", @@ -17097,7 +17077,7 @@ "aggregate%length_uint16%0#0" ] }, - "2297": { + "2280": { "op": "swap", "stack_out": [ "interest_amount#0", @@ -17111,7 +17091,7 @@ "payment_info#0" ] }, - "2298": { + "2281": { "op": "concat", "defined_out": [ "aggregate%encoded_value%0#0", @@ -17131,7 +17111,7 @@ "aggregate%encoded_value%0#0" ] }, - "2299": { + "2282": { "op": "swap", "stack_out": [ "interest_amount#0", @@ -17144,7 +17124,7 @@ "aggregate%head%3#0" ] }, - "2300": { + "2283": { "op": "pushbytes 0x0022", "defined_out": [ "0x0022", @@ -17166,7 +17146,7 @@ "0x0022" ] }, - "2304": { + "2287": { "op": "concat", "defined_out": [ "aggregate%encoded_value%0#0", @@ -17186,7 +17166,7 @@ "aggregate%head%4#0" ] }, - "2305": { + "2288": { "op": "swap", "stack_out": [ "interest_amount#0", @@ -17199,7 +17179,7 @@ "aggregate%encoded_value%0#0" ] }, - "2306": { + "2289": { "op": "concat", "defined_out": [ "aggregate%concat%0#0", @@ -17217,7 +17197,7 @@ "aggregate%concat%0#0" ] }, - "2307": { + "2290": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -17237,7 +17217,7 @@ "0x151f7c75" ] }, - "2308": { + "2291": { "op": "swap", "stack_out": [ "interest_amount#0", @@ -17250,7 +17230,7 @@ "aggregate%concat%0#0" ] }, - "2309": { + "2292": { "op": "concat", "defined_out": [ "interest_amount#0", @@ -17268,7 +17248,7 @@ "tmp%5#0" ] }, - "2310": { + "2293": { "op": "log", "stack_out": [ "interest_amount#0", @@ -17279,7 +17259,7 @@ "box_prefixed_key%0#4" ] }, - "2311": { + "2294": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -17297,7 +17277,7 @@ "1" ] }, - "2312": { + "2295": { "op": "return", "stack_out": [ "interest_amount#0", @@ -17308,7 +17288,7 @@ "box_prefixed_key%0#4" ] }, - "2313": { + "2296": { "block": "claim_due_cashflows_bool_false@24", "stack_in": [ "interest_amount#0", @@ -17332,10 +17312,10 @@ "and_result%0#0" ] }, - "2314": { + "2297": { "op": "b claim_due_cashflows_bool_merge@25" }, - "2317": { + "2300": { "block": "claim_due_cashflows_bool_false@15", "stack_in": [ "interest_amount#0", @@ -17359,10 +17339,10 @@ "or_result%0#0" ] }, - "2318": { + "2301": { "op": "b claim_due_cashflows_bool_merge@16" }, - "2321": { + "2304": { "subroutine": "modules.transfer_agent.TransferAgent.transfer_set_schedule[routing]", "params": {}, "block": "transfer_set_schedule", @@ -17375,7 +17355,7 @@ "tmp%0#0" ] }, - "2324": { + "2307": { "op": "dup", "defined_out": [ "tmp%0#0", @@ -17386,7 +17366,7 @@ "tmp%0#0 (copy)" ] }, - "2325": { + "2308": { "op": "len", "defined_out": [ "len%0#0", @@ -17397,7 +17377,7 @@ "len%0#0" ] }, - "2326": { + "2309": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -17410,7 +17390,7 @@ "8" ] }, - "2327": { + "2310": { "op": "==", "defined_out": [ "eq%0#0", @@ -17421,14 +17401,14 @@ "eq%0#0" ] }, - "2328": { + "2311": { "error": "invalid number of bytes for arc4.uint64", "op": "assert // invalid number of bytes for arc4.uint64", "stack_out": [ "tmp%0#0" ] }, - "2329": { + "2312": { "op": "btoi", "defined_out": [ "open_date#0" @@ -17437,7 +17417,7 @@ "open_date#0" ] }, - "2330": { + "2313": { "op": "txna ApplicationArgs 2", "defined_out": [ "open_date#0", @@ -17448,7 +17428,7 @@ "tmp%2#0" ] }, - "2333": { + "2316": { "op": "dup", "defined_out": [ "open_date#0", @@ -17461,7 +17441,7 @@ "tmp%2#0 (copy)" ] }, - "2334": { + "2317": { "op": "len", "defined_out": [ "len%1#0", @@ -17474,7 +17454,7 @@ "len%1#0" ] }, - "2335": { + "2318": { "op": "intc_2 // 8", "stack_out": [ "open_date#0", @@ -17483,7 +17463,7 @@ "8" ] }, - "2336": { + "2319": { "op": "==", "defined_out": [ "eq%1#0", @@ -17496,7 +17476,7 @@ "eq%1#0" ] }, - "2337": { + "2320": { "error": "invalid number of bytes for arc4.uint64", "op": "assert // invalid number of bytes for arc4.uint64", "stack_out": [ @@ -17504,7 +17484,7 @@ "tmp%2#0" ] }, - "2338": { + "2321": { "op": "btoi", "defined_out": [ "closure_date#0", @@ -17515,11 +17495,11 @@ "closure_date#0" ] }, - "2339": { + "2322": { "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", "op": "callsub _assert_caller_is_arranger" }, - "2342": { + "2325": { "op": "dup2", "defined_out": [ "closure_date#0", @@ -17534,7 +17514,7 @@ "closure_date#0 (copy)" ] }, - "2343": { + "2326": { "op": "<", "defined_out": [ "closure_date#0", @@ -17547,7 +17527,7 @@ "tmp%0#1" ] }, - "2344": { + "2327": { "error": "Time events must be sorted in strictly ascending order", "op": "assert // Time events must be sorted in strictly ascending order", "stack_out": [ @@ -17555,7 +17535,7 @@ "closure_date#0" ] }, - "2345": { + "2328": { "op": "bytec 29 // \"transfer_opening_date\"", "defined_out": [ "\"transfer_opening_date\"", @@ -17568,7 +17548,7 @@ "\"transfer_opening_date\"" ] }, - "2347": { + "2330": { "op": "uncover 2", "stack_out": [ "closure_date#0", @@ -17576,13 +17556,13 @@ "open_date#0" ] }, - "2349": { + "2332": { "op": "app_global_put", "stack_out": [ "closure_date#0" ] }, - "2350": { + "2333": { "op": "bytec 30 // \"transfer_closure_date\"", "defined_out": [ "\"transfer_closure_date\"", @@ -17593,18 +17573,18 @@ "\"transfer_closure_date\"" ] }, - "2352": { + "2335": { "op": "swap", "stack_out": [ "\"transfer_closure_date\"", "closure_date#0" ] }, - "2353": { + "2336": { "op": "app_global_put", "stack_out": [] }, - "2354": { + "2337": { "op": "global LatestTimestamp", "defined_out": [ "tmp%1#1" @@ -17613,7 +17593,7 @@ "tmp%1#1" ] }, - "2356": { + "2339": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0" @@ -17622,7 +17602,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "2357": { + "2340": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -17633,14 +17613,14 @@ "0x151f7c75" ] }, - "2358": { + "2341": { "op": "swap", "stack_out": [ "0x151f7c75", "aggregate%val_as_bytes%0#0" ] }, - "2359": { + "2342": { "op": "concat", "defined_out": [ "tmp%6#0" @@ -17649,11 +17629,11 @@ "tmp%6#0" ] }, - "2360": { + "2343": { "op": "log", "stack_out": [] }, - "2361": { + "2344": { "op": "intc_1 // 1", "defined_out": [ "1" @@ -17662,11 +17642,11 @@ "1" ] }, - "2362": { + "2345": { "op": "return", "stack_out": [] }, - "2363": { + "2346": { "subroutine": "modules.transfer_agent.TransferAgent.primary_distribution[routing]", "params": {}, "block": "primary_distribution", @@ -17679,7 +17659,7 @@ "holding_address#0" ] }, - "2366": { + "2349": { "op": "dup", "defined_out": [ "holding_address#0", @@ -17690,7 +17670,7 @@ "holding_address#0 (copy)" ] }, - "2367": { + "2350": { "op": "len", "defined_out": [ "holding_address#0", @@ -17701,7 +17681,7 @@ "len%0#0" ] }, - "2368": { + "2351": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -17714,7 +17694,7 @@ "32" ] }, - "2369": { + "2352": { "op": "==", "defined_out": [ "eq%0#0", @@ -17725,14 +17705,14 @@ "eq%0#0" ] }, - "2370": { + "2353": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ "holding_address#0" ] }, - "2371": { + "2354": { "op": "txna ApplicationArgs 2", "defined_out": [ "holding_address#0", @@ -17743,7 +17723,7 @@ "tmp%2#0" ] }, - "2374": { + "2357": { "op": "dup", "defined_out": [ "holding_address#0", @@ -17756,7 +17736,7 @@ "tmp%2#0 (copy)" ] }, - "2375": { + "2358": { "op": "len", "defined_out": [ "holding_address#0", @@ -17769,7 +17749,7 @@ "len%1#0" ] }, - "2376": { + "2359": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -17784,7 +17764,7 @@ "8" ] }, - "2377": { + "2360": { "op": "==", "defined_out": [ "eq%1#0", @@ -17797,7 +17777,7 @@ "eq%1#0" ] }, - "2378": { + "2361": { "error": "invalid number of bytes for arc4.uint64", "op": "assert // invalid number of bytes for arc4.uint64", "stack_out": [ @@ -17805,7 +17785,7 @@ "tmp%2#0" ] }, - "2379": { + "2362": { "op": "btoi", "defined_out": [ "holding_address#0", @@ -17816,7 +17796,7 @@ "units#0" ] }, - "2380": { + "2363": { "op": "dup", "stack_out": [ "holding_address#0", @@ -17824,7 +17804,7 @@ "units#0" ] }, - "2381": { + "2364": { "op": "cover 2", "defined_out": [ "holding_address#0", @@ -17836,7 +17816,7 @@ "units#0" ] }, - "2383": { + "2366": { "op": "intc_0 // 0", "stack_out": [ "units#0", @@ -17845,7 +17825,7 @@ "0" ] }, - "2384": { + "2367": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"", @@ -17861,7 +17841,7 @@ "\"status\"" ] }, - "2385": { + "2368": { "op": "app_global_get_ex", "defined_out": [ "holding_address#0", @@ -17877,7 +17857,7 @@ "maybe_exists%0#0" ] }, - "2386": { + "2369": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ @@ -17887,7 +17867,7 @@ "maybe_value%0#0" ] }, - "2387": { + "2370": { "error": "D-ASA not configured", "op": "assert // D-ASA not configured", "stack_out": [ @@ -17896,7 +17876,7 @@ "units#0" ] }, - "2388": { + "2371": { "op": "bytec 22 // 0x523a50594423", "defined_out": [ "0x523a50594423", @@ -17910,7 +17890,7 @@ "0x523a50594423" ] }, - "2390": { + "2373": { "op": "txn Sender", "defined_out": [ "0x523a50594423", @@ -17926,7 +17906,7 @@ "tmp%0#3" ] }, - "2392": { + "2375": { "callsub": "modules.rbac.RbacModule._role_is_active", "op": "callsub _role_is_active", "defined_out": [ @@ -17941,7 +17921,7 @@ "tmp%1#2" ] }, - "2395": { + "2378": { "error": "Not authorized", "op": "assert // Not authorized", "stack_out": [ @@ -17950,15 +17930,15 @@ "units#0" ] }, - "2396": { + "2379": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", "op": "callsub _assert_is_not_asset_defaulted" }, - "2399": { + "2382": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_suspended", "op": "callsub _assert_is_not_asset_suspended" }, - "2402": { + "2385": { "op": "intc_0 // 0", "stack_out": [ "units#0", @@ -17967,7 +17947,7 @@ "0" ] }, - "2403": { + "2386": { "op": "bytec_1 // \"status\"", "stack_out": [ "units#0", @@ -17977,7 +17957,7 @@ "\"status\"" ] }, - "2404": { + "2387": { "op": "app_global_get_ex", "stack_out": [ "units#0", @@ -17987,7 +17967,7 @@ "maybe_exists%0#0" ] }, - "2405": { + "2388": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ @@ -17997,7 +17977,7 @@ "maybe_value%0#0" ] }, - "2406": { + "2389": { "op": "pushint 50", "defined_out": [ "50", @@ -18013,7 +17993,7 @@ "50" ] }, - "2408": { + "2391": { "op": "==", "defined_out": [ "holding_address#0", @@ -18027,7 +18007,7 @@ "tmp%0#4" ] }, - "2409": { + "2392": { "error": "Primary distribution is closed", "op": "assert // Primary distribution is closed", "stack_out": [ @@ -18036,7 +18016,7 @@ "units#0" ] }, - "2410": { + "2393": { "op": "bytec 8 // 0x4123", "defined_out": [ "0x4123", @@ -18050,7 +18030,7 @@ "0x4123" ] }, - "2412": { + "2395": { "op": "dig 2", "stack_out": [ "units#0", @@ -18060,7 +18040,7 @@ "holding_address#0 (copy)" ] }, - "2414": { + "2397": { "op": "concat", "defined_out": [ "box_prefixed_key%0#1", @@ -18074,7 +18054,7 @@ "box_prefixed_key%0#1" ] }, - "2415": { + "2398": { "op": "dup", "stack_out": [ "units#0", @@ -18084,7 +18064,7 @@ "box_prefixed_key%0#1" ] }, - "2416": { + "2399": { "op": "cover 3", "defined_out": [ "box_prefixed_key%0#1", @@ -18099,7 +18079,7 @@ "box_prefixed_key%0#1" ] }, - "2418": { + "2401": { "op": "box_len", "defined_out": [ "_%0#0", @@ -18117,7 +18097,7 @@ "maybe_exists%0#0" ] }, - "2419": { + "2402": { "op": "bury 1", "stack_out": [ "units#0", @@ -18127,7 +18107,7 @@ "maybe_exists%0#0" ] }, - "2421": { + "2404": { "error": "Invalid account holding address", "op": "assert // Invalid account holding address", "stack_out": [ @@ -18137,7 +18117,7 @@ "units#0" ] }, - "2422": { + "2405": { "op": "swap", "stack_out": [ "units#0", @@ -18146,7 +18126,7 @@ "holding_address#0" ] }, - "2423": { + "2406": { "callsub": "modules.accounting.AccountingModule._assert_is_not_account_suspended", "op": "callsub _assert_is_not_account_suspended", "stack_out": [ @@ -18155,7 +18135,7 @@ "units#0" ] }, - "2426": { + "2409": { "op": "dup", "defined_out": [ "box_prefixed_key%0#1", @@ -18169,7 +18149,7 @@ "units#0 (copy)" ] }, - "2427": { + "2410": { "error": "Can not distribute zero units", "op": "assert // Can not distribute zero units", "stack_out": [ @@ -18178,7 +18158,7 @@ "units#0" ] }, - "2428": { + "2411": { "op": "intc_0 // 0", "stack_out": [ "units#0", @@ -18187,7 +18167,7 @@ "0" ] }, - "2429": { + "2412": { "op": "bytec 11 // \"reserved_units_total\"", "defined_out": [ "\"reserved_units_total\"", @@ -18203,7 +18183,7 @@ "\"reserved_units_total\"" ] }, - "2431": { + "2414": { "op": "app_global_get_ex", "stack_out": [ "units#0", @@ -18213,7 +18193,7 @@ "maybe_exists%0#0" ] }, - "2432": { + "2415": { "error": "check self.reserved_units_total exists", "op": "assert // check self.reserved_units_total exists", "stack_out": [ @@ -18223,7 +18203,7 @@ "maybe_value%0#0" ] }, - "2433": { + "2416": { "op": "+", "defined_out": [ "box_prefixed_key%0#1", @@ -18236,7 +18216,7 @@ "tmp%2#1" ] }, - "2434": { + "2417": { "op": "intc_0 // 0", "stack_out": [ "units#0", @@ -18245,7 +18225,7 @@ "0" ] }, - "2435": { + "2418": { "op": "bytec 13 // \"total_units\"", "defined_out": [ "\"total_units\"", @@ -18262,7 +18242,7 @@ "\"total_units\"" ] }, - "2437": { + "2420": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#1", @@ -18279,7 +18259,7 @@ "maybe_exists%1#0" ] }, - "2438": { + "2421": { "error": "check self.total_units exists", "op": "assert // check self.total_units exists", "stack_out": [ @@ -18289,7 +18269,7 @@ "maybe_value%1#0" ] }, - "2439": { + "2422": { "op": "<=", "defined_out": [ "box_prefixed_key%0#1", @@ -18302,7 +18282,7 @@ "tmp%3#1" ] }, - "2440": { + "2423": { "error": "Insufficient remaining D-ASA units", "op": "assert // Insufficient remaining D-ASA units", "stack_out": [ @@ -18310,7 +18290,7 @@ "box_prefixed_key%0#1" ] }, - "2441": { + "2424": { "op": "intc_0 // 0", "stack_out": [ "units#0", @@ -18318,7 +18298,7 @@ "0" ] }, - "2442": { + "2425": { "op": "bytec 28 // \"initial_exchange_date\"", "defined_out": [ "\"initial_exchange_date\"", @@ -18333,7 +18313,7 @@ "\"initial_exchange_date\"" ] }, - "2444": { + "2427": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#1", @@ -18348,7 +18328,7 @@ "maybe_exists%2#0" ] }, - "2445": { + "2428": { "error": "check self.initial_exchange_date exists", "op": "assert // check self.initial_exchange_date exists", "stack_out": [ @@ -18357,14 +18337,14 @@ "maybe_value%2#0" ] }, - "2446": { + "2429": { "op": "bz primary_distribution_after_if_else@3", "stack_out": [ "units#0", "box_prefixed_key%0#1" ] }, - "2449": { + "2432": { "op": "global LatestTimestamp", "defined_out": [ "box_prefixed_key%0#1", @@ -18377,7 +18357,7 @@ "tmp%5#1" ] }, - "2451": { + "2434": { "op": "intc_0 // 0", "stack_out": [ "units#0", @@ -18386,7 +18366,7 @@ "0" ] }, - "2452": { + "2435": { "op": "bytec 28 // \"initial_exchange_date\"", "stack_out": [ "units#0", @@ -18396,7 +18376,7 @@ "\"initial_exchange_date\"" ] }, - "2454": { + "2437": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#1", @@ -18413,7 +18393,7 @@ "maybe_exists%3#0" ] }, - "2455": { + "2438": { "error": "check self.initial_exchange_date exists", "op": "assert // check self.initial_exchange_date exists", "stack_out": [ @@ -18423,7 +18403,7 @@ "maybe_value%3#0" ] }, - "2456": { + "2439": { "op": "<=", "defined_out": [ "box_prefixed_key%0#1", @@ -18436,7 +18416,7 @@ "tmp%6#1" ] }, - "2457": { + "2440": { "error": "Primary distribution is closed", "op": "assert // Primary distribution is closed", "stack_out": [ @@ -18444,7 +18424,7 @@ "box_prefixed_key%0#1" ] }, - "2458": { + "2441": { "block": "primary_distribution_after_if_else@3", "stack_in": [ "units#0", @@ -18462,7 +18442,7 @@ "box_prefixed_key%0#1 (copy)" ] }, - "2460": { + "2443": { "op": "box_get", "defined_out": [ "aggregate%box_get%0#0", @@ -18477,7 +18457,7 @@ "aggregate%box_get%1#0" ] }, - "2461": { + "2444": { "error": "check self.account entry exists", "op": "assert // check self.account entry exists", "stack_out": [ @@ -18487,7 +18467,7 @@ "aggregate%box_get%0#0" ] }, - "2462": { + "2445": { "op": "pushint 40", "defined_out": [ "40", @@ -18502,7 +18482,7 @@ "40" ] }, - "2464": { + "2447": { "op": "extract_uint64", "defined_out": [ "box_prefixed_key%0#1", @@ -18515,7 +18495,7 @@ "values%0#0" ] }, - "2465": { + "2448": { "op": "dig 3", "defined_out": [ "box_prefixed_key%0#1", @@ -18530,7 +18510,7 @@ "units#0" ] }, - "2467": { + "2450": { "op": "dup", "defined_out": [ "box_prefixed_key%0#1", @@ -18547,7 +18527,7 @@ "units#0 (copy)" ] }, - "2468": { + "2451": { "op": "cover 3", "stack_out": [ "units#0", @@ -18558,7 +18538,7 @@ "units#0 (copy)" ] }, - "2470": { + "2453": { "op": "+", "defined_out": [ "box_prefixed_key%0#1", @@ -18573,7 +18553,7 @@ "tmp%0#2" ] }, - "2471": { + "2454": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0", @@ -18588,10 +18568,10 @@ "aggregate%val_as_bytes%0#0" ] }, - "2472": { + "2455": { "op": "pushint 40" }, - "2474": { + "2457": { "op": "swap", "stack_out": [ "units#0", @@ -18602,7 +18582,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "2475": { + "2458": { "op": "box_replace", "stack_out": [ "units#0", @@ -18610,7 +18590,7 @@ "units#0" ] }, - "2476": { + "2459": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -18624,7 +18604,7 @@ "0" ] }, - "2477": { + "2460": { "op": "bytec 11 // \"reserved_units_total\"", "defined_out": [ "\"reserved_units_total\"", @@ -18640,7 +18620,7 @@ "\"reserved_units_total\"" ] }, - "2479": { + "2462": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#1", @@ -18656,7 +18636,7 @@ "maybe_exists%4#0" ] }, - "2480": { + "2463": { "error": "check self.reserved_units_total exists", "op": "assert // check self.reserved_units_total exists", "stack_out": [ @@ -18666,7 +18646,7 @@ "maybe_value%4#0" ] }, - "2481": { + "2464": { "op": "+", "defined_out": [ "box_prefixed_key%0#1", @@ -18679,7 +18659,7 @@ "tmp%7#0" ] }, - "2482": { + "2465": { "op": "bytec 11 // \"reserved_units_total\"", "stack_out": [ "units#0", @@ -18688,7 +18668,7 @@ "\"reserved_units_total\"" ] }, - "2484": { + "2467": { "op": "dig 1", "defined_out": [ "\"reserved_units_total\"", @@ -18705,7 +18685,7 @@ "tmp%7#0 (copy)" ] }, - "2486": { + "2469": { "op": "app_global_put", "stack_out": [ "units#0", @@ -18713,7 +18693,7 @@ "tmp%7#0" ] }, - "2487": { + "2470": { "op": "intc_0 // 0", "stack_out": [ "units#0", @@ -18722,7 +18702,7 @@ "0" ] }, - "2488": { + "2471": { "op": "bytec 13 // \"total_units\"", "defined_out": [ "\"total_units\"", @@ -18739,7 +18719,7 @@ "\"total_units\"" ] }, - "2490": { + "2473": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#1", @@ -18756,7 +18736,7 @@ "maybe_exists%5#0" ] }, - "2491": { + "2474": { "error": "check self.total_units exists", "op": "assert // check self.total_units exists", "stack_out": [ @@ -18766,7 +18746,7 @@ "maybe_value%5#0" ] }, - "2492": { + "2475": { "op": "swap", "stack_out": [ "units#0", @@ -18775,7 +18755,7 @@ "tmp%7#0" ] }, - "2493": { + "2476": { "op": "-", "defined_out": [ "box_prefixed_key%0#1", @@ -18788,7 +18768,7 @@ "tmp%8#0" ] }, - "2494": { + "2477": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%1#0", @@ -18801,7 +18781,7 @@ "aggregate%val_as_bytes%1#0" ] }, - "2495": { + "2478": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -18816,7 +18796,7 @@ "0x151f7c75" ] }, - "2496": { + "2479": { "op": "swap", "stack_out": [ "units#0", @@ -18825,7 +18805,7 @@ "aggregate%val_as_bytes%1#0" ] }, - "2497": { + "2480": { "op": "concat", "defined_out": [ "box_prefixed_key%0#1", @@ -18838,14 +18818,14 @@ "tmp%6#0" ] }, - "2498": { + "2481": { "op": "log", "stack_out": [ "units#0", "box_prefixed_key%0#1" ] }, - "2499": { + "2482": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -18858,14 +18838,14 @@ "1" ] }, - "2500": { + "2483": { "op": "return", "stack_out": [ "units#0", "box_prefixed_key%0#1" ] }, - "2501": { + "2484": { "subroutine": "modules.transfer_agent.TransferAgent.transfer[routing]", "params": {}, "block": "transfer", @@ -18875,17 +18855,17 @@ "box_prefixed_key%0#3" ] }, - "2502": { + "2485": { "op": "dup", "stack_out": [ "box_prefixed_key%0#3", "box_prefixed_key%0#4" ] }, - "2503": { + "2486": { "op": "txna ApplicationArgs 1" }, - "2506": { + "2489": { "op": "dup", "defined_out": [ "sender_holding_address#0" @@ -18897,7 +18877,7 @@ "sender_holding_address#0" ] }, - "2507": { + "2490": { "op": "len", "defined_out": [ "len%0#0", @@ -18910,7 +18890,7 @@ "len%0#0" ] }, - "2508": { + "2491": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -18925,7 +18905,7 @@ "32" ] }, - "2509": { + "2492": { "op": "==", "defined_out": [ "eq%0#0", @@ -18938,7 +18918,7 @@ "eq%0#0" ] }, - "2510": { + "2493": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ @@ -18947,10 +18927,10 @@ "sender_holding_address#0" ] }, - "2511": { + "2494": { "op": "txna ApplicationArgs 2" }, - "2514": { + "2497": { "op": "dup", "defined_out": [ "receiver_holding_address#0", @@ -18964,7 +18944,7 @@ "receiver_holding_address#0" ] }, - "2515": { + "2498": { "op": "len", "defined_out": [ "len%1#0", @@ -18979,7 +18959,7 @@ "len%1#0" ] }, - "2516": { + "2499": { "op": "intc_3 // 32", "stack_out": [ "box_prefixed_key%0#3", @@ -18990,7 +18970,7 @@ "32" ] }, - "2517": { + "2500": { "op": "==", "defined_out": [ "eq%1#0", @@ -19005,7 +18985,7 @@ "eq%1#0" ] }, - "2518": { + "2501": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ @@ -19015,10 +18995,10 @@ "receiver_holding_address#0" ] }, - "2519": { + "2502": { "op": "txna ApplicationArgs 3" }, - "2522": { + "2505": { "op": "dupn 2", "defined_out": [ "receiver_holding_address#0", @@ -19036,7 +19016,7 @@ "tmp%4#0 (copy)" ] }, - "2524": { + "2507": { "op": "len", "defined_out": [ "len%2#0", @@ -19054,7 +19034,7 @@ "len%2#0" ] }, - "2525": { + "2508": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -19074,7 +19054,7 @@ "8" ] }, - "2526": { + "2509": { "op": "==", "defined_out": [ "eq%2#0", @@ -19092,7 +19072,7 @@ "eq%2#0" ] }, - "2527": { + "2510": { "error": "invalid number of bytes for arc4.uint64", "op": "assert // invalid number of bytes for arc4.uint64", "stack_out": [ @@ -19104,7 +19084,7 @@ "tmp%4#0" ] }, - "2528": { + "2511": { "op": "btoi", "defined_out": [ "receiver_holding_address#0", @@ -19121,7 +19101,7 @@ "units#0" ] }, - "2529": { + "2512": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#3", @@ -19133,7 +19113,7 @@ "0" ] }, - "2530": { + "2513": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"", @@ -19154,7 +19134,7 @@ "\"status\"" ] }, - "2531": { + "2514": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -19175,7 +19155,7 @@ "maybe_exists%0#0" ] }, - "2532": { + "2515": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ @@ -19188,7 +19168,7 @@ "maybe_value%0#0" ] }, - "2533": { + "2516": { "error": "D-ASA not configured", "op": "assert // D-ASA not configured", "stack_out": [ @@ -19200,15 +19180,15 @@ "units#0" ] }, - "2534": { + "2517": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", "op": "callsub _assert_is_not_asset_defaulted" }, - "2537": { + "2520": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_suspended", "op": "callsub _assert_is_not_asset_suspended" }, - "2540": { + "2523": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#3", @@ -19220,7 +19200,7 @@ "0" ] }, - "2541": { + "2524": { "op": "bytec_1 // \"status\"", "stack_out": [ "box_prefixed_key%0#3", @@ -19233,7 +19213,7 @@ "\"status\"" ] }, - "2542": { + "2525": { "op": "app_global_get_ex", "stack_out": [ "box_prefixed_key%0#3", @@ -19246,7 +19226,7 @@ "maybe_exists%0#0" ] }, - "2543": { + "2526": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ @@ -19259,7 +19239,7 @@ "maybe_value%0#0" ] }, - "2544": { + "2527": { "op": "pushint 50", "defined_out": [ "50", @@ -19280,7 +19260,7 @@ "50" ] }, - "2546": { + "2529": { "op": "==", "defined_out": [ "receiver_holding_address#0", @@ -19299,7 +19279,7 @@ "tmp%0#3" ] }, - "2547": { + "2530": { "op": "!", "defined_out": [ "receiver_holding_address#0", @@ -19318,7 +19298,7 @@ "tmp%1#1" ] }, - "2548": { + "2531": { "error": "IED not yet executed", "op": "assert // IED not yet executed", "stack_out": [ @@ -19330,7 +19310,7 @@ "units#0" ] }, - "2549": { + "2532": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#3", @@ -19342,7 +19322,7 @@ "0" ] }, - "2550": { + "2533": { "op": "bytec 29 // \"transfer_opening_date\"", "defined_out": [ "\"transfer_opening_date\"", @@ -19363,7 +19343,7 @@ "\"transfer_opening_date\"" ] }, - "2552": { + "2535": { "op": "app_global_get_ex", "stack_out": [ "box_prefixed_key%0#3", @@ -19376,7 +19356,7 @@ "maybe_exists%0#0" ] }, - "2553": { + "2536": { "error": "check self.transfer_opening_date exists", "op": "assert // check self.transfer_opening_date exists", "stack_out": [ @@ -19389,7 +19369,7 @@ "maybe_value%0#0" ] }, - "2554": { + "2537": { "op": "bz transfer_after_if_else@3", "stack_out": [ "box_prefixed_key%0#3", @@ -19400,7 +19380,7 @@ "units#0" ] }, - "2557": { + "2540": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#3", @@ -19412,7 +19392,7 @@ "0" ] }, - "2558": { + "2541": { "op": "bytec 29 // \"transfer_opening_date\"", "stack_out": [ "box_prefixed_key%0#3", @@ -19425,7 +19405,7 @@ "\"transfer_opening_date\"" ] }, - "2560": { + "2543": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%1#0", @@ -19446,7 +19426,7 @@ "maybe_exists%1#0" ] }, - "2561": { + "2544": { "error": "check self.transfer_opening_date exists", "op": "assert // check self.transfer_opening_date exists", "stack_out": [ @@ -19459,7 +19439,7 @@ "maybe_value%1#0" ] }, - "2562": { + "2545": { "op": "global LatestTimestamp", "defined_out": [ "maybe_value%1#0", @@ -19480,7 +19460,7 @@ "tmp%1#2" ] }, - "2564": { + "2547": { "op": "<=", "defined_out": [ "receiver_holding_address#0", @@ -19499,7 +19479,7 @@ "tmp%2#1" ] }, - "2565": { + "2548": { "error": "Transfer is closed", "op": "assert // Transfer is closed", "stack_out": [ @@ -19511,7 +19491,7 @@ "units#0" ] }, - "2566": { + "2549": { "block": "transfer_after_if_else@3", "stack_in": [ "box_prefixed_key%0#3", @@ -19535,7 +19515,7 @@ "0" ] }, - "2567": { + "2550": { "op": "bytec 30 // \"transfer_closure_date\"", "defined_out": [ "\"transfer_closure_date\"", @@ -19552,7 +19532,7 @@ "\"transfer_closure_date\"" ] }, - "2569": { + "2552": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%2#0", @@ -19569,7 +19549,7 @@ "maybe_exists%2#0" ] }, - "2570": { + "2553": { "error": "check self.transfer_closure_date exists", "op": "assert // check self.transfer_closure_date exists", "stack_out": [ @@ -19582,7 +19562,7 @@ "maybe_value%2#0" ] }, - "2571": { + "2554": { "op": "bz transfer_after_if_else@5", "stack_out": [ "box_prefixed_key%0#3", @@ -19593,7 +19573,7 @@ "units#0" ] }, - "2574": { + "2557": { "op": "global LatestTimestamp", "defined_out": [ "tmp%4#2" @@ -19608,7 +19588,7 @@ "tmp%4#2" ] }, - "2576": { + "2559": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#3", @@ -19621,7 +19601,7 @@ "0" ] }, - "2577": { + "2560": { "op": "bytec 30 // \"transfer_closure_date\"", "stack_out": [ "box_prefixed_key%0#3", @@ -19635,7 +19615,7 @@ "\"transfer_closure_date\"" ] }, - "2579": { + "2562": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%3#0", @@ -19654,7 +19634,7 @@ "maybe_exists%3#0" ] }, - "2580": { + "2563": { "error": "check self.transfer_closure_date exists", "op": "assert // check self.transfer_closure_date exists", "stack_out": [ @@ -19668,7 +19648,7 @@ "maybe_value%3#0" ] }, - "2581": { + "2564": { "op": "<", "defined_out": [ "tmp%5#0" @@ -19683,7 +19663,7 @@ "tmp%5#0" ] }, - "2582": { + "2565": { "error": "Transfer is closed", "op": "assert // Transfer is closed", "stack_out": [ @@ -19695,7 +19675,7 @@ "units#0" ] }, - "2583": { + "2566": { "block": "transfer_after_if_else@5", "stack_in": [ "box_prefixed_key%0#3", @@ -19719,7 +19699,7 @@ "tmp%0#1" ] }, - "2585": { + "2568": { "op": "dig 4", "defined_out": [ "sender_holding_address#0", @@ -19736,7 +19716,7 @@ "sender_holding_address#0" ] }, - "2587": { + "2570": { "op": "dup", "defined_out": [ "sender_holding_address#0", @@ -19755,7 +19735,7 @@ "sender_holding_address#0 (copy)" ] }, - "2588": { + "2571": { "op": "cover 2", "stack_out": [ "box_prefixed_key%0#3", @@ -19769,7 +19749,7 @@ "sender_holding_address#0 (copy)" ] }, - "2590": { + "2573": { "op": "==", "defined_out": [ "sender_holding_address#0", @@ -19786,7 +19766,7 @@ "tmp%1#1" ] }, - "2591": { + "2574": { "error": "Not authorized", "op": "assert // Not authorized", "stack_out": [ @@ -19799,7 +19779,7 @@ "sender_holding_address#0" ] }, - "2592": { + "2575": { "op": "bytec 8 // 0x4123", "defined_out": [ "0x4123", @@ -19816,7 +19796,7 @@ "0x4123" ] }, - "2594": { + "2577": { "op": "dig 1", "stack_out": [ "box_prefixed_key%0#3", @@ -19830,7 +19810,7 @@ "sender_holding_address#0 (copy)" ] }, - "2596": { + "2579": { "op": "concat", "defined_out": [ "box_prefixed_key%0#3", @@ -19847,7 +19827,7 @@ "box_prefixed_key%0#3" ] }, - "2597": { + "2580": { "op": "dup", "stack_out": [ "box_prefixed_key%0#3", @@ -19861,7 +19841,7 @@ "box_prefixed_key%0#3" ] }, - "2598": { + "2581": { "op": "bury 8", "defined_out": [ "box_prefixed_key%0#3", @@ -19878,7 +19858,7 @@ "box_prefixed_key%0#3" ] }, - "2600": { + "2583": { "op": "dup", "defined_out": [ "box_prefixed_key%0#3", @@ -19897,7 +19877,7 @@ "box_prefixed_key%0#3 (copy)" ] }, - "2601": { + "2584": { "op": "box_len", "defined_out": [ "_%0#0", @@ -19918,7 +19898,7 @@ "maybe_exists%0#0" ] }, - "2602": { + "2585": { "op": "bury 1", "stack_out": [ "box_prefixed_key%0#3", @@ -19932,7 +19912,7 @@ "maybe_exists%0#0" ] }, - "2604": { + "2587": { "error": "Invalid account holding address", "op": "assert // Invalid account holding address", "stack_out": [ @@ -19946,7 +19926,7 @@ "box_prefixed_key%0#3" ] }, - "2605": { + "2588": { "op": "bytec 8 // 0x4123", "stack_out": [ "box_prefixed_key%0#3", @@ -19960,7 +19940,7 @@ "0x4123" ] }, - "2607": { + "2590": { "op": "dig 5", "defined_out": [ "0x4123", @@ -19981,7 +19961,7 @@ "receiver_holding_address#0" ] }, - "2609": { + "2592": { "op": "dup", "defined_out": [ "0x4123", @@ -20004,7 +19984,7 @@ "receiver_holding_address#0 (copy)" ] }, - "2610": { + "2593": { "op": "cover 2", "stack_out": [ "box_prefixed_key%0#3", @@ -20020,7 +20000,7 @@ "receiver_holding_address#0 (copy)" ] }, - "2612": { + "2595": { "op": "concat", "defined_out": [ "box_prefixed_key%0#3", @@ -20041,7 +20021,7 @@ "box_prefixed_key%0#4" ] }, - "2613": { + "2596": { "op": "dup", "stack_out": [ "box_prefixed_key%0#3", @@ -20057,7 +20037,7 @@ "box_prefixed_key%0#4" ] }, - "2614": { + "2597": { "op": "bury 9", "defined_out": [ "box_prefixed_key%0#3", @@ -20078,7 +20058,7 @@ "box_prefixed_key%0#4" ] }, - "2616": { + "2599": { "op": "box_len", "stack_out": [ "box_prefixed_key%0#3", @@ -20094,7 +20074,7 @@ "maybe_exists%0#0" ] }, - "2617": { + "2600": { "op": "bury 1", "stack_out": [ "box_prefixed_key%0#3", @@ -20109,7 +20089,7 @@ "maybe_exists%0#0" ] }, - "2619": { + "2602": { "error": "Invalid account holding address", "op": "assert // Invalid account holding address", "stack_out": [ @@ -20124,7 +20104,7 @@ "receiver_holding_address#0" ] }, - "2620": { + "2603": { "op": "dig 2", "stack_out": [ "box_prefixed_key%0#3", @@ -20139,7 +20119,7 @@ "sender_holding_address#0 (copy)" ] }, - "2622": { + "2605": { "callsub": "modules.accounting.AccountingModule._assert_is_not_account_suspended", "op": "callsub _assert_is_not_account_suspended", "stack_out": [ @@ -20154,7 +20134,7 @@ "receiver_holding_address#0" ] }, - "2625": { + "2608": { "op": "dup", "stack_out": [ "box_prefixed_key%0#3", @@ -20169,7 +20149,7 @@ "receiver_holding_address#0 (copy)" ] }, - "2626": { + "2609": { "callsub": "modules.accounting.AccountingModule._assert_is_not_account_suspended", "op": "callsub _assert_is_not_account_suspended", "stack_out": [ @@ -20184,7 +20164,7 @@ "receiver_holding_address#0" ] }, - "2629": { + "2612": { "op": "uncover 2", "stack_out": [ "box_prefixed_key%0#3", @@ -20198,7 +20178,7 @@ "sender_holding_address#0" ] }, - "2631": { + "2614": { "op": "!=", "defined_out": [ "box_prefixed_key%0#3", @@ -20218,7 +20198,7 @@ "tmp%2#1" ] }, - "2632": { + "2615": { "error": "Sender and receiver must be different", "op": "assert // Sender and receiver must be different", "stack_out": [ @@ -20231,7 +20211,7 @@ "box_prefixed_key%0#3" ] }, - "2633": { + "2616": { "op": "dig 1", "defined_out": [ "box_prefixed_key%0#3", @@ -20251,7 +20231,7 @@ "units#0" ] }, - "2635": { + "2618": { "op": "dup", "defined_out": [ "box_prefixed_key%0#3", @@ -20273,7 +20253,7 @@ "units#0 (copy)" ] }, - "2636": { + "2619": { "error": "Transfer units must be greater than zero", "op": "assert // Transfer units must be greater than zero", "stack_out": [ @@ -20287,7 +20267,7 @@ "units#0" ] }, - "2637": { + "2620": { "op": "swap", "stack_out": [ "box_prefixed_key%0#3", @@ -20300,7 +20280,7 @@ "box_prefixed_key%0#3" ] }, - "2638": { + "2621": { "op": "box_get", "defined_out": [ "aggregate%box_get%0#0", @@ -20323,7 +20303,7 @@ "aggregate%box_get%1#0" ] }, - "2639": { + "2622": { "error": "check self.account entry exists", "op": "assert // check self.account entry exists", "stack_out": [ @@ -20337,7 +20317,7 @@ "aggregate%box_get%0#0" ] }, - "2640": { + "2623": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -20360,7 +20340,7 @@ "32" ] }, - "2641": { + "2624": { "op": "extract_uint64", "defined_out": [ "box_prefixed_key%0#3", @@ -20381,7 +20361,7 @@ "values%0#0" ] }, - "2642": { + "2625": { "op": "<=", "defined_out": [ "box_prefixed_key%0#3", @@ -20401,7 +20381,7 @@ "tmp%4#1" ] }, - "2643": { + "2626": { "error": "Insufficient sender units to transfer", "op": "assert // Insufficient sender units to transfer", "stack_out": [ @@ -20413,7 +20393,7 @@ "units#0" ] }, - "2644": { + "2627": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#3", @@ -20425,7 +20405,7 @@ "0" ] }, - "2645": { + "2628": { "op": "bytec_2 // \"event_cursor\"", "defined_out": [ "\"event_cursor\"", @@ -20447,7 +20427,7 @@ "\"event_cursor\"" ] }, - "2646": { + "2629": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#3", @@ -20469,7 +20449,7 @@ "maybe_exists%0#0" ] }, - "2647": { + "2630": { "error": "check self.event_cursor exists", "op": "assert // check self.event_cursor exists", "stack_out": [ @@ -20482,7 +20462,7 @@ "maybe_value%0#0" ] }, - "2648": { + "2631": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#3", @@ -20495,7 +20475,7 @@ "0" ] }, - "2649": { + "2632": { "op": "bytec_3 // \"schedule_entry_count\"", "defined_out": [ "\"schedule_entry_count\"", @@ -20519,7 +20499,7 @@ "\"schedule_entry_count\"" ] }, - "2650": { + "2633": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#3", @@ -20543,7 +20523,7 @@ "maybe_exists%1#0" ] }, - "2651": { + "2634": { "error": "check self.schedule_entry_count exists", "op": "assert // check self.schedule_entry_count exists", "stack_out": [ @@ -20557,7 +20537,7 @@ "maybe_value%1#0" ] }, - "2652": { + "2635": { "op": ">=", "defined_out": [ "box_prefixed_key%0#3", @@ -20577,7 +20557,7 @@ "tmp%0#3" ] }, - "2653": { + "2636": { "op": "bnz transfer_after_inlined_modules.actus_kernel.ActusKernelModule._assert_no_due_event_pending@10", "stack_out": [ "box_prefixed_key%0#3", @@ -20588,7 +20568,7 @@ "units#0" ] }, - "2656": { + "2639": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#3", @@ -20600,7 +20580,7 @@ "0" ] }, - "2657": { + "2640": { "op": "bytec_2 // \"event_cursor\"", "stack_out": [ "box_prefixed_key%0#3", @@ -20613,7 +20593,7 @@ "\"event_cursor\"" ] }, - "2658": { + "2641": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#3", @@ -20635,7 +20615,7 @@ "maybe_exists%2#0" ] }, - "2659": { + "2642": { "error": "check self.event_cursor exists", "op": "assert // check self.event_cursor exists", "stack_out": [ @@ -20648,7 +20628,7 @@ "maybe_value%2#0" ] }, - "2660": { + "2643": { "callsub": "modules.actus_kernel.ActusKernelModule._get_schedule_entry", "op": "callsub _get_schedule_entry", "defined_out": [ @@ -20669,7 +20649,7 @@ "next_entry#0" ] }, - "2663": { + "2646": { "op": "pushint 9", "defined_out": [ "9", @@ -20691,7 +20671,7 @@ "9" ] }, - "2665": { + "2648": { "op": "extract_uint64", "stack_out": [ "box_prefixed_key%0#3", @@ -20703,7 +20683,7 @@ "values%0#0" ] }, - "2666": { + "2649": { "op": "global LatestTimestamp", "defined_out": [ "box_prefixed_key%0#3", @@ -20725,7 +20705,7 @@ "tmp%2#3" ] }, - "2668": { + "2651": { "op": ">", "defined_out": [ "box_prefixed_key%0#3", @@ -20745,7 +20725,7 @@ "tmp%3#3" ] }, - "2669": { + "2652": { "error": "ACTUS event not yet executed", "op": "assert // ACTUS event not yet executed", "stack_out": [ @@ -20757,7 +20737,7 @@ "units#0" ] }, - "2670": { + "2653": { "block": "transfer_after_inlined_modules.actus_kernel.ActusKernelModule._assert_no_due_event_pending@10", "stack_in": [ "box_prefixed_key%0#3", @@ -20781,7 +20761,7 @@ "sender_holding_address#0" ] }, - "2672": { + "2655": { "op": "dup", "defined_out": [ "sender_holding_address#0", @@ -20798,7 +20778,7 @@ "sender_holding_address#0 (copy)" ] }, - "2673": { + "2656": { "callsub": "modules.accounting.AccountingModule._ensure_units_activated", "op": "callsub _ensure_units_activated", "stack_out": [ @@ -20811,7 +20791,7 @@ "sender_holding_address#0" ] }, - "2676": { + "2659": { "op": "dig 3", "defined_out": [ "receiver_holding_address#0", @@ -20828,7 +20808,7 @@ "receiver_holding_address#0" ] }, - "2678": { + "2661": { "op": "dup", "defined_out": [ "receiver_holding_address#0", @@ -20847,7 +20827,7 @@ "receiver_holding_address#0 (copy)" ] }, - "2679": { + "2662": { "op": "cover 2", "stack_out": [ "box_prefixed_key%0#3", @@ -20861,7 +20841,7 @@ "receiver_holding_address#0 (copy)" ] }, - "2681": { + "2664": { "callsub": "modules.accounting.AccountingModule._ensure_units_activated", "op": "callsub _ensure_units_activated", "stack_out": [ @@ -20875,7 +20855,7 @@ "sender_holding_address#0" ] }, - "2684": { + "2667": { "callsub": "modules.accounting.AccountingModule._settle_position", "op": "callsub _settle_position", "defined_out": [ @@ -20896,7 +20876,7 @@ "{_settle_position}.1" ] }, - "2687": { + "2670": { "op": "popn 2", "stack_out": [ "box_prefixed_key%0#3", @@ -20908,7 +20888,7 @@ "receiver_holding_address#0" ] }, - "2689": { + "2672": { "callsub": "modules.accounting.AccountingModule._settle_position", "op": "callsub _settle_position", "stack_out": [ @@ -20922,7 +20902,7 @@ "{_settle_position}.1" ] }, - "2692": { + "2675": { "op": "popn 2", "stack_out": [ "box_prefixed_key%0#3", @@ -20933,7 +20913,7 @@ "units#0" ] }, - "2694": { + "2677": { "op": "dig 5", "defined_out": [ "box_prefixed_key%0#3", @@ -20950,7 +20930,7 @@ "box_prefixed_key%0#3" ] }, - "2696": { + "2679": { "op": "dup", "defined_out": [ "box_prefixed_key%0#3", @@ -20969,7 +20949,7 @@ "box_prefixed_key%0#3 (copy)" ] }, - "2697": { + "2680": { "op": "box_get", "defined_out": [ "aggregate%box_get%2#0", @@ -20990,7 +20970,7 @@ "aggregate%box_get%3#0" ] }, - "2698": { + "2681": { "error": "check self.account entry exists", "op": "assert // check self.account entry exists", "stack_out": [ @@ -21004,7 +20984,7 @@ "aggregate%box_get%2#0" ] }, - "2699": { + "2682": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -21025,7 +21005,7 @@ "32" ] }, - "2700": { + "2683": { "op": "extract_uint64", "defined_out": [ "box_prefixed_key%0#3", @@ -21044,7 +21024,7 @@ "values%0#0" ] }, - "2701": { + "2684": { "op": "dig 2", "defined_out": [ "box_prefixed_key%0#3", @@ -21065,7 +21045,7 @@ "units#0" ] }, - "2703": { + "2686": { "op": "dup", "defined_out": [ "box_prefixed_key%0#3", @@ -21088,7 +21068,7 @@ "units#0 (copy)" ] }, - "2704": { + "2687": { "op": "cover 2", "stack_out": [ "box_prefixed_key%0#3", @@ -21103,7 +21083,7 @@ "units#0 (copy)" ] }, - "2706": { + "2689": { "op": "dig 1", "defined_out": [ "box_prefixed_key%0#3", @@ -21128,7 +21108,7 @@ "values%0#0 (copy)" ] }, - "2708": { + "2691": { "op": "<=", "defined_out": [ "box_prefixed_key%0#3", @@ -21151,7 +21131,7 @@ "tmp%0#3" ] }, - "2709": { + "2692": { "error": "Insufficient sender units to transfer", "op": "assert // Insufficient sender units to transfer", "stack_out": [ @@ -21166,7 +21146,7 @@ "values%0#0" ] }, - "2710": { + "2693": { "op": "dig 1", "stack_out": [ "box_prefixed_key%0#3", @@ -21181,7 +21161,7 @@ "units#0 (copy)" ] }, - "2712": { + "2695": { "op": "-", "defined_out": [ "box_prefixed_key%0#3", @@ -21202,7 +21182,7 @@ "tmp%1#2" ] }, - "2713": { + "2696": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0", @@ -21223,7 +21203,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "2714": { + "2697": { "op": "uncover 2", "stack_out": [ "box_prefixed_key%0#3", @@ -21237,7 +21217,7 @@ "box_prefixed_key%0#3" ] }, - "2716": { + "2699": { "op": "intc_3 // 32", "stack_out": [ "box_prefixed_key%0#3", @@ -21252,7 +21232,7 @@ "32" ] }, - "2717": { + "2700": { "op": "uncover 2", "stack_out": [ "box_prefixed_key%0#3", @@ -21267,7 +21247,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "2719": { + "2702": { "op": "box_replace", "stack_out": [ "box_prefixed_key%0#3", @@ -21279,7 +21259,7 @@ "units#0" ] }, - "2720": { + "2703": { "op": "dig 5", "defined_out": [ "box_prefixed_key%0#3", @@ -21299,7 +21279,7 @@ "box_prefixed_key%0#4" ] }, - "2722": { + "2705": { "op": "dup", "defined_out": [ "box_prefixed_key%0#3", @@ -21321,7 +21301,7 @@ "box_prefixed_key%0#4 (copy)" ] }, - "2723": { + "2706": { "op": "box_get", "defined_out": [ "aggregate%box_get%6#0", @@ -21345,7 +21325,7 @@ "aggregate%box_get%7#0" ] }, - "2724": { + "2707": { "error": "check self.account entry exists", "op": "assert // check self.account entry exists", "stack_out": [ @@ -21360,7 +21340,7 @@ "aggregate%box_get%6#0" ] }, - "2725": { + "2708": { "op": "intc_3 // 32", "stack_out": [ "box_prefixed_key%0#3", @@ -21375,7 +21355,7 @@ "32" ] }, - "2726": { + "2709": { "op": "extract_uint64", "stack_out": [ "box_prefixed_key%0#3", @@ -21389,7 +21369,7 @@ "values%0#0" ] }, - "2727": { + "2710": { "op": "uncover 2", "stack_out": [ "box_prefixed_key%0#3", @@ -21403,7 +21383,7 @@ "units#0" ] }, - "2729": { + "2712": { "op": "+", "defined_out": [ "box_prefixed_key%0#3", @@ -21424,7 +21404,7 @@ "tmp%0#5" ] }, - "2730": { + "2713": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%1#0", @@ -21445,10 +21425,10 @@ "aggregate%val_as_bytes%1#0" ] }, - "2731": { + "2714": { "op": "intc_3 // 32" }, - "2732": { + "2715": { "op": "swap", "stack_out": [ "box_prefixed_key%0#3", @@ -21462,7 +21442,7 @@ "aggregate%val_as_bytes%1#0" ] }, - "2733": { + "2716": { "op": "box_replace", "stack_out": [ "box_prefixed_key%0#3", @@ -21473,7 +21453,7 @@ "units#0" ] }, - "2734": { + "2717": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -21493,7 +21473,7 @@ "0x151f7c75" ] }, - "2735": { + "2718": { "op": "dig 2", "defined_out": [ "0x151f7c75", @@ -21515,7 +21495,7 @@ "tmp%4#0" ] }, - "2737": { + "2720": { "op": "concat", "defined_out": [ "box_prefixed_key%0#3", @@ -21536,7 +21516,7 @@ "tmp%8#0" ] }, - "2738": { + "2721": { "op": "log", "stack_out": [ "box_prefixed_key%0#3", @@ -21547,7 +21527,7 @@ "units#0" ] }, - "2739": { + "2722": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -21568,7 +21548,7 @@ "1" ] }, - "2740": { + "2723": { "op": "return", "stack_out": [ "box_prefixed_key%0#3", @@ -21579,7 +21559,7 @@ "units#0" ] }, - "2741": { + "2724": { "subroutine": "modules.accounting.AccountingModule.account_suspension[routing]", "params": {}, "block": "account_suspension", @@ -21592,7 +21572,7 @@ "holding_address#0" ] }, - "2744": { + "2727": { "op": "dup", "defined_out": [ "holding_address#0", @@ -21603,7 +21583,7 @@ "holding_address#0 (copy)" ] }, - "2745": { + "2728": { "op": "len", "defined_out": [ "holding_address#0", @@ -21614,7 +21594,7 @@ "len%0#0" ] }, - "2746": { + "2729": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -21627,7 +21607,7 @@ "32" ] }, - "2747": { + "2730": { "op": "==", "defined_out": [ "eq%0#0", @@ -21638,14 +21618,14 @@ "eq%0#0" ] }, - "2748": { + "2731": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ "holding_address#0" ] }, - "2749": { + "2732": { "op": "txna ApplicationArgs 2", "defined_out": [ "holding_address#0", @@ -21656,7 +21636,7 @@ "tmp%2#0" ] }, - "2752": { + "2735": { "op": "dup", "defined_out": [ "holding_address#0", @@ -21669,7 +21649,7 @@ "tmp%2#0 (copy)" ] }, - "2753": { + "2736": { "op": "len", "defined_out": [ "holding_address#0", @@ -21682,7 +21662,7 @@ "len%1#0" ] }, - "2754": { + "2737": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -21697,7 +21677,7 @@ "1" ] }, - "2755": { + "2738": { "op": "==", "defined_out": [ "eq%1#0", @@ -21710,7 +21690,7 @@ "eq%1#0" ] }, - "2756": { + "2739": { "error": "invalid number of bytes for arc4.bool", "op": "assert // invalid number of bytes for arc4.bool", "stack_out": [ @@ -21718,7 +21698,7 @@ "tmp%2#0" ] }, - "2757": { + "2740": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -21731,7 +21711,7 @@ "0" ] }, - "2758": { + "2741": { "op": "getbit", "defined_out": [ "holding_address#0", @@ -21742,7 +21722,7 @@ "suspended#0" ] }, - "2759": { + "2742": { "op": "bytec 21 // 0x523a41555423", "defined_out": [ "0x523a41555423", @@ -21755,7 +21735,7 @@ "0x523a41555423" ] }, - "2761": { + "2744": { "op": "txn Sender", "defined_out": [ "0x523a41555423", @@ -21770,7 +21750,7 @@ "tmp%0#2" ] }, - "2763": { + "2746": { "callsub": "modules.rbac.RbacModule._role_is_active", "op": "callsub _role_is_active", "defined_out": [ @@ -21784,7 +21764,7 @@ "tmp%1#0" ] }, - "2766": { + "2749": { "error": "Not authorized", "op": "assert // Not authorized", "stack_out": [ @@ -21792,7 +21772,7 @@ "suspended#0" ] }, - "2767": { + "2750": { "op": "bytec 8 // 0x4123", "defined_out": [ "0x4123", @@ -21805,7 +21785,7 @@ "0x4123" ] }, - "2769": { + "2752": { "op": "uncover 2", "stack_out": [ "suspended#0", @@ -21813,7 +21793,7 @@ "holding_address#0" ] }, - "2771": { + "2754": { "op": "concat", "defined_out": [ "box_prefixed_key%0#1", @@ -21824,7 +21804,7 @@ "box_prefixed_key%0#1" ] }, - "2772": { + "2755": { "op": "dup", "defined_out": [ "box_prefixed_key%0#1", @@ -21837,7 +21817,7 @@ "box_prefixed_key%0#1 (copy)" ] }, - "2773": { + "2756": { "op": "box_len", "defined_out": [ "_%0#0", @@ -21852,7 +21832,7 @@ "maybe_exists%0#0" ] }, - "2774": { + "2757": { "op": "bury 1", "stack_out": [ "suspended#0", @@ -21860,7 +21840,7 @@ "maybe_exists%0#0" ] }, - "2776": { + "2759": { "error": "Invalid account holding address", "op": "assert // Invalid account holding address", "stack_out": [ @@ -21868,7 +21848,7 @@ "box_prefixed_key%0#1" ] }, - "2777": { + "2760": { "op": "dup", "stack_out": [ "suspended#0", @@ -21876,7 +21856,7 @@ "box_prefixed_key%0#1 (copy)" ] }, - "2778": { + "2761": { "op": "pushint 48", "defined_out": [ "48", @@ -21891,7 +21871,7 @@ "48" ] }, - "2780": { + "2763": { "op": "intc_1 // 1", "stack_out": [ "suspended#0", @@ -21901,7 +21881,7 @@ "1" ] }, - "2781": { + "2764": { "op": "box_extract", "defined_out": [ "box%box_extract%0#0", @@ -21914,7 +21894,7 @@ "box%box_extract%0#0" ] }, - "2782": { + "2765": { "op": "intc_0 // 0", "stack_out": [ "suspended#0", @@ -21923,7 +21903,7 @@ "0" ] }, - "2783": { + "2766": { "op": "uncover 3", "stack_out": [ "box_prefixed_key%0#1", @@ -21932,7 +21912,7 @@ "suspended#0" ] }, - "2785": { + "2768": { "op": "setbit", "defined_out": [ "aggregate%updated_target%0#0", @@ -21943,10 +21923,10 @@ "aggregate%updated_target%0#0" ] }, - "2786": { + "2769": { "op": "pushint 48" }, - "2788": { + "2771": { "op": "swap", "stack_out": [ "box_prefixed_key%0#1", @@ -21954,11 +21934,11 @@ "aggregate%updated_target%0#0" ] }, - "2789": { + "2772": { "op": "box_replace", "stack_out": [] }, - "2790": { + "2773": { "op": "global LatestTimestamp", "defined_out": [ "tmp%0#1" @@ -21967,7 +21947,7 @@ "tmp%0#1" ] }, - "2792": { + "2775": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0" @@ -21976,7 +21956,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "2793": { + "2776": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -21987,14 +21967,14 @@ "0x151f7c75" ] }, - "2794": { + "2777": { "op": "swap", "stack_out": [ "0x151f7c75", "aggregate%val_as_bytes%0#0" ] }, - "2795": { + "2778": { "op": "concat", "defined_out": [ "tmp%6#0" @@ -22003,21 +21983,21 @@ "tmp%6#0" ] }, - "2796": { + "2779": { "op": "log", "stack_out": [] }, - "2797": { + "2780": { "op": "intc_1 // 1", "stack_out": [ "1" ] }, - "2798": { + "2781": { "op": "return", "stack_out": [] }, - "2799": { + "2782": { "subroutine": "modules.accounting.AccountingModule.account_open[routing]", "params": {}, "block": "account_open", @@ -22030,7 +22010,7 @@ "holding_address#0" ] }, - "2802": { + "2785": { "op": "dup", "defined_out": [ "holding_address#0", @@ -22041,7 +22021,7 @@ "holding_address#0 (copy)" ] }, - "2803": { + "2786": { "op": "len", "defined_out": [ "holding_address#0", @@ -22052,7 +22032,7 @@ "len%0#0" ] }, - "2804": { + "2787": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -22065,7 +22045,7 @@ "32" ] }, - "2805": { + "2788": { "op": "==", "defined_out": [ "eq%0#0", @@ -22076,14 +22056,14 @@ "eq%0#0" ] }, - "2806": { + "2789": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ "holding_address#0" ] }, - "2807": { + "2790": { "op": "txna ApplicationArgs 2", "defined_out": [ "holding_address#0", @@ -22094,7 +22074,7 @@ "payment_address#0" ] }, - "2810": { + "2793": { "op": "dup", "defined_out": [ "holding_address#0", @@ -22107,7 +22087,7 @@ "payment_address#0 (copy)" ] }, - "2811": { + "2794": { "op": "len", "defined_out": [ "holding_address#0", @@ -22120,7 +22100,7 @@ "len%1#0" ] }, - "2812": { + "2795": { "op": "intc_3 // 32", "stack_out": [ "holding_address#0", @@ -22129,7 +22109,7 @@ "32" ] }, - "2813": { + "2796": { "op": "==", "defined_out": [ "eq%1#0", @@ -22142,7 +22122,7 @@ "eq%1#0" ] }, - "2814": { + "2797": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ @@ -22150,7 +22130,7 @@ "payment_address#0" ] }, - "2815": { + "2798": { "op": "bytec 23 // 0x523a4d4e4723", "defined_out": [ "0x523a4d4e4723", @@ -22163,7 +22143,7 @@ "0x523a4d4e4723" ] }, - "2817": { + "2800": { "op": "txn Sender", "defined_out": [ "0x523a4d4e4723", @@ -22178,7 +22158,7 @@ "tmp%0#2" ] }, - "2819": { + "2802": { "callsub": "modules.rbac.RbacModule._role_is_active", "op": "callsub _role_is_active", "defined_out": [ @@ -22192,7 +22172,7 @@ "tmp%1#1" ] }, - "2822": { + "2805": { "error": "Not authorized", "op": "assert // Not authorized", "stack_out": [ @@ -22200,7 +22180,7 @@ "payment_address#0" ] }, - "2823": { + "2806": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -22213,7 +22193,7 @@ "0" ] }, - "2824": { + "2807": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"", @@ -22228,7 +22208,7 @@ "\"status\"" ] }, - "2825": { + "2808": { "op": "app_global_get_ex", "defined_out": [ "holding_address#0", @@ -22243,7 +22223,7 @@ "maybe_exists%0#0" ] }, - "2826": { + "2809": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ @@ -22252,7 +22232,7 @@ "maybe_value%0#0" ] }, - "2827": { + "2810": { "op": "pushint 200", "defined_out": [ "200", @@ -22267,7 +22247,7 @@ "200" ] }, - "2830": { + "2813": { "op": "==", "defined_out": [ "holding_address#0", @@ -22280,7 +22260,7 @@ "tmp%0#3" ] }, - "2831": { + "2814": { "op": "!", "stack_out": [ "holding_address#0", @@ -22288,7 +22268,7 @@ "tmp%1#1" ] }, - "2832": { + "2815": { "error": "Not authorized", "op": "assert // Not authorized", "stack_out": [ @@ -22296,15 +22276,15 @@ "payment_address#0" ] }, - "2833": { + "2816": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", "op": "callsub _assert_is_not_asset_defaulted" }, - "2836": { + "2819": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_suspended", "op": "callsub _assert_is_not_asset_suspended" }, - "2839": { + "2822": { "op": "bytec 8 // 0x4123", "defined_out": [ "0x4123", @@ -22317,7 +22297,7 @@ "0x4123" ] }, - "2841": { + "2824": { "op": "uncover 2", "stack_out": [ "payment_address#0", @@ -22325,7 +22305,7 @@ "holding_address#0" ] }, - "2843": { + "2826": { "op": "concat", "defined_out": [ "box_prefixed_key%0#0", @@ -22336,7 +22316,7 @@ "box_prefixed_key%0#0" ] }, - "2844": { + "2827": { "op": "dup", "defined_out": [ "box_prefixed_key%0#0", @@ -22349,7 +22329,7 @@ "box_prefixed_key%0#0 (copy)" ] }, - "2845": { + "2828": { "op": "box_len", "defined_out": [ "_%0#0", @@ -22364,7 +22344,7 @@ "maybe_exists%0#0" ] }, - "2846": { + "2829": { "op": "bury 1", "stack_out": [ "payment_address#0", @@ -22372,7 +22352,7 @@ "maybe_exists%0#0" ] }, - "2848": { + "2831": { "op": "!", "defined_out": [ "box_prefixed_key%0#0", @@ -22385,7 +22365,7 @@ "tmp%2#1" ] }, - "2849": { + "2832": { "error": "Invalid account holding address", "op": "assert // Invalid account holding address", "stack_out": [ @@ -22393,7 +22373,7 @@ "box_prefixed_key%0#0" ] }, - "2850": { + "2833": { "op": "intc_0 // 0", "stack_out": [ "payment_address#0", @@ -22401,7 +22381,7 @@ "0" ] }, - "2851": { + "2834": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0", @@ -22414,7 +22394,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "2852": { + "2835": { "op": "uncover 2", "stack_out": [ "box_prefixed_key%0#0", @@ -22422,7 +22402,7 @@ "payment_address#0" ] }, - "2854": { + "2837": { "op": "dig 1", "defined_out": [ "aggregate%val_as_bytes%0#0", @@ -22437,7 +22417,7 @@ "aggregate%val_as_bytes%0#0 (copy)" ] }, - "2856": { + "2839": { "op": "concat", "defined_out": [ "aggregate%head%1#0", @@ -22450,7 +22430,7 @@ "aggregate%head%1#0" ] }, - "2857": { + "2840": { "op": "dig 1", "stack_out": [ "box_prefixed_key%0#0", @@ -22459,7 +22439,7 @@ "aggregate%val_as_bytes%0#0 (copy)" ] }, - "2859": { + "2842": { "op": "concat", "defined_out": [ "aggregate%head%2#0", @@ -22472,8 +22452,8 @@ "aggregate%head%2#0" ] }, - "2860": { - "op": "bytec 40 // 0x00", + "2843": { + "op": "bytec 41 // 0x00", "defined_out": [ "0x00", "aggregate%head%2#0", @@ -22487,7 +22467,7 @@ "0x00" ] }, - "2862": { + "2845": { "op": "concat", "defined_out": [ "aggregate%head%3#0", @@ -22500,7 +22480,7 @@ "aggregate%head%3#0" ] }, - "2863": { + "2846": { "op": "dig 1", "stack_out": [ "box_prefixed_key%0#0", @@ -22509,7 +22489,7 @@ "aggregate%val_as_bytes%0#0 (copy)" ] }, - "2865": { + "2848": { "op": "concat", "defined_out": [ "aggregate%head%4#0", @@ -22522,7 +22502,7 @@ "aggregate%head%4#0" ] }, - "2866": { + "2849": { "op": "dig 1", "stack_out": [ "box_prefixed_key%0#0", @@ -22531,7 +22511,7 @@ "aggregate%val_as_bytes%0#0 (copy)" ] }, - "2868": { + "2851": { "op": "concat", "defined_out": [ "aggregate%head%5#0", @@ -22544,7 +22524,7 @@ "aggregate%head%5#0" ] }, - "2869": { + "2852": { "op": "dig 1", "stack_out": [ "box_prefixed_key%0#0", @@ -22553,7 +22533,7 @@ "aggregate%val_as_bytes%0#0 (copy)" ] }, - "2871": { + "2854": { "op": "concat", "defined_out": [ "aggregate%head%6#0", @@ -22566,7 +22546,7 @@ "aggregate%head%6#0" ] }, - "2872": { + "2855": { "op": "dig 1", "stack_out": [ "box_prefixed_key%0#0", @@ -22575,7 +22555,7 @@ "aggregate%val_as_bytes%0#0 (copy)" ] }, - "2874": { + "2857": { "op": "concat", "defined_out": [ "aggregate%head%7#0", @@ -22588,7 +22568,7 @@ "aggregate%head%7#0" ] }, - "2875": { + "2858": { "op": "swap", "stack_out": [ "box_prefixed_key%0#0", @@ -22596,7 +22576,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "2876": { + "2859": { "op": "concat", "defined_out": [ "aggregate%head%8#0", @@ -22607,11 +22587,11 @@ "aggregate%head%8#0" ] }, - "2877": { + "2860": { "op": "box_put", "stack_out": [] }, - "2878": { + "2861": { "op": "global LatestTimestamp", "defined_out": [ "tmp%4#1" @@ -22620,7 +22600,7 @@ "tmp%4#1" ] }, - "2880": { + "2863": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%7#0" @@ -22629,7 +22609,7 @@ "aggregate%val_as_bytes%7#0" ] }, - "2881": { + "2864": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -22640,14 +22620,14 @@ "0x151f7c75" ] }, - "2882": { + "2865": { "op": "swap", "stack_out": [ "0x151f7c75", "aggregate%val_as_bytes%7#0" ] }, - "2883": { + "2866": { "op": "concat", "defined_out": [ "tmp%6#0" @@ -22656,11 +22636,11 @@ "tmp%6#0" ] }, - "2884": { + "2867": { "op": "log", "stack_out": [] }, - "2885": { + "2868": { "op": "intc_1 // 1", "defined_out": [ "1" @@ -22669,11 +22649,11 @@ "1" ] }, - "2886": { + "2869": { "op": "return", "stack_out": [] }, - "2887": { + "2870": { "subroutine": "modules.accounting.AccountingModule.account_update_payment_address[routing]", "params": {}, "block": "account_update_payment_address", @@ -22686,7 +22666,7 @@ "holding_address#0" ] }, - "2890": { + "2873": { "op": "dup", "defined_out": [ "holding_address#0", @@ -22697,7 +22677,7 @@ "holding_address#0 (copy)" ] }, - "2891": { + "2874": { "op": "len", "defined_out": [ "holding_address#0", @@ -22708,7 +22688,7 @@ "len%0#0" ] }, - "2892": { + "2875": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -22721,7 +22701,7 @@ "32" ] }, - "2893": { + "2876": { "op": "==", "defined_out": [ "eq%0#0", @@ -22732,14 +22712,14 @@ "eq%0#0" ] }, - "2894": { + "2877": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ "holding_address#0" ] }, - "2895": { + "2878": { "op": "txna ApplicationArgs 2", "defined_out": [ "holding_address#0", @@ -22750,7 +22730,7 @@ "tmp%2#0" ] }, - "2898": { + "2881": { "op": "dup", "defined_out": [ "holding_address#0", @@ -22763,7 +22743,7 @@ "tmp%2#0 (copy)" ] }, - "2899": { + "2882": { "op": "len", "defined_out": [ "holding_address#0", @@ -22776,7 +22756,7 @@ "len%1#0" ] }, - "2900": { + "2883": { "op": "intc_3 // 32", "stack_out": [ "holding_address#0", @@ -22785,7 +22765,7 @@ "32" ] }, - "2901": { + "2884": { "op": "==", "defined_out": [ "eq%1#0", @@ -22798,7 +22778,7 @@ "eq%1#0" ] }, - "2902": { + "2885": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ @@ -22806,7 +22786,7 @@ "tmp%2#0" ] }, - "2903": { + "2886": { "op": "bytec 8 // 0x4123", "defined_out": [ "0x4123", @@ -22819,7 +22799,7 @@ "0x4123" ] }, - "2905": { + "2888": { "op": "dig 2", "stack_out": [ "holding_address#0", @@ -22828,7 +22808,7 @@ "holding_address#0 (copy)" ] }, - "2907": { + "2890": { "op": "concat", "defined_out": [ "box_prefixed_key%0#1", @@ -22841,7 +22821,7 @@ "box_prefixed_key%0#1" ] }, - "2908": { + "2891": { "op": "dup", "defined_out": [ "box_prefixed_key%0#1", @@ -22856,7 +22836,7 @@ "box_prefixed_key%0#1 (copy)" ] }, - "2909": { + "2892": { "op": "box_len", "defined_out": [ "_%0#0", @@ -22873,7 +22853,7 @@ "maybe_exists%0#0" ] }, - "2910": { + "2893": { "op": "bury 1", "stack_out": [ "holding_address#0", @@ -22882,7 +22862,7 @@ "maybe_exists%0#0" ] }, - "2912": { + "2895": { "error": "Invalid account holding address", "op": "assert // Invalid account holding address", "stack_out": [ @@ -22891,7 +22871,7 @@ "box_prefixed_key%0#1" ] }, - "2913": { + "2896": { "op": "txn Sender", "defined_out": [ "box_prefixed_key%0#1", @@ -22906,7 +22886,7 @@ "tmp%0#1" ] }, - "2915": { + "2898": { "op": "uncover 3", "stack_out": [ "tmp%2#0", @@ -22915,7 +22895,7 @@ "holding_address#0" ] }, - "2917": { + "2900": { "op": "==", "defined_out": [ "box_prefixed_key%0#1", @@ -22928,7 +22908,7 @@ "tmp%1#1" ] }, - "2918": { + "2901": { "error": "Not authorized", "op": "assert // Not authorized", "stack_out": [ @@ -22936,15 +22916,15 @@ "box_prefixed_key%0#1" ] }, - "2919": { + "2902": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", "op": "callsub _assert_is_not_asset_defaulted" }, - "2922": { + "2905": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_suspended", "op": "callsub _assert_is_not_asset_suspended" }, - "2925": { + "2908": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -22957,7 +22937,7 @@ "0" ] }, - "2926": { + "2909": { "op": "uncover 2", "stack_out": [ "box_prefixed_key%0#1", @@ -22965,11 +22945,11 @@ "tmp%2#0" ] }, - "2928": { + "2911": { "op": "box_replace", "stack_out": [] }, - "2929": { + "2912": { "op": "global LatestTimestamp", "defined_out": [ "tmp%2#1" @@ -22978,7 +22958,7 @@ "tmp%2#1" ] }, - "2931": { + "2914": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0" @@ -22987,7 +22967,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "2932": { + "2915": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -22998,14 +22978,14 @@ "0x151f7c75" ] }, - "2933": { + "2916": { "op": "swap", "stack_out": [ "0x151f7c75", "aggregate%val_as_bytes%0#0" ] }, - "2934": { + "2917": { "op": "concat", "defined_out": [ "tmp%6#0" @@ -23014,11 +22994,11 @@ "tmp%6#0" ] }, - "2935": { + "2918": { "op": "log", "stack_out": [] }, - "2936": { + "2919": { "op": "intc_1 // 1", "defined_out": [ "1" @@ -23027,11 +23007,11 @@ "1" ] }, - "2937": { + "2920": { "op": "return", "stack_out": [] }, - "2938": { + "2921": { "subroutine": "modules.accounting.AccountingModule.account_get_position[routing]", "params": {}, "block": "account_get_position", @@ -23044,7 +23024,7 @@ "holding_address#0" ] }, - "2941": { + "2924": { "op": "dup", "defined_out": [ "holding_address#0", @@ -23055,7 +23035,7 @@ "holding_address#0 (copy)" ] }, - "2942": { + "2925": { "op": "len", "defined_out": [ "holding_address#0", @@ -23066,7 +23046,7 @@ "len%0#0" ] }, - "2943": { + "2926": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -23079,7 +23059,7 @@ "32" ] }, - "2944": { + "2927": { "op": "==", "defined_out": [ "eq%0#0", @@ -23090,14 +23070,14 @@ "eq%0#0" ] }, - "2945": { + "2928": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ "holding_address#0" ] }, - "2946": { + "2929": { "op": "bytec 8 // 0x4123", "defined_out": [ "0x4123", @@ -23108,14 +23088,14 @@ "0x4123" ] }, - "2948": { + "2931": { "op": "swap", "stack_out": [ "0x4123", "holding_address#0" ] }, - "2949": { + "2932": { "op": "concat", "defined_out": [ "box_prefixed_key%0#1" @@ -23124,7 +23104,7 @@ "box_prefixed_key%0#1" ] }, - "2950": { + "2933": { "op": "dup", "defined_out": [ "box_prefixed_key%0#1", @@ -23135,7 +23115,7 @@ "box_prefixed_key%0#1 (copy)" ] }, - "2951": { + "2934": { "op": "box_len", "defined_out": [ "_%0#0", @@ -23148,21 +23128,21 @@ "maybe_exists%0#0" ] }, - "2952": { + "2935": { "op": "bury 1", "stack_out": [ "box_prefixed_key%0#1", "maybe_exists%0#0" ] }, - "2954": { + "2937": { "error": "Invalid account holding address", "op": "assert // Invalid account holding address", "stack_out": [ "box_prefixed_key%0#1" ] }, - "2955": { + "2938": { "op": "box_get", "defined_out": [ "aggregate%box_get%0#0", @@ -23173,13 +23153,13 @@ "aggregate%box_get%1#0" ] }, - "2956": { + "2939": { "op": "pop", "stack_out": [ "aggregate%box_get%0#0" ] }, - "2957": { + "2940": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -23190,14 +23170,14 @@ "0x151f7c75" ] }, - "2958": { + "2941": { "op": "swap", "stack_out": [ "0x151f7c75", "aggregate%box_get%0#0" ] }, - "2959": { + "2942": { "op": "concat", "defined_out": [ "tmp%3#0" @@ -23206,11 +23186,11 @@ "tmp%3#0" ] }, - "2960": { + "2943": { "op": "log", "stack_out": [] }, - "2961": { + "2944": { "op": "intc_1 // 1", "defined_out": [ "1" @@ -23219,11 +23199,11 @@ "1" ] }, - "2962": { + "2945": { "op": "return", "stack_out": [] }, - "2963": { + "2946": { "subroutine": "modules.actus_kernel.ActusKernelModule.contract_create[routing]", "params": {}, "block": "contract_create", @@ -23236,7 +23216,7 @@ "arranger#0" ] }, - "2966": { + "2949": { "op": "dup", "defined_out": [ "arranger#0", @@ -23247,7 +23227,7 @@ "arranger#0 (copy)" ] }, - "2967": { + "2950": { "op": "len", "defined_out": [ "arranger#0", @@ -23258,7 +23238,7 @@ "len%0#0" ] }, - "2968": { + "2951": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -23271,7 +23251,7 @@ "32" ] }, - "2969": { + "2952": { "op": "==", "defined_out": [ "arranger#0", @@ -23282,14 +23262,14 @@ "eq%0#0" ] }, - "2970": { + "2953": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ "arranger#0" ] }, - "2971": { + "2954": { "op": "bytec 18 // 0x523a41525223", "defined_out": [ "0x523a41525223", @@ -23300,18 +23280,18 @@ "0x523a41525223" ] }, - "2973": { + "2956": { "op": "swap", "stack_out": [ "0x523a41525223", "arranger#0" ] }, - "2974": { + "2957": { "op": "app_global_put", "stack_out": [] }, - "2975": { + "2958": { "op": "global LatestTimestamp", "defined_out": [ "tmp%0#1" @@ -23320,7 +23300,7 @@ "tmp%0#1" ] }, - "2977": { + "2960": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0" @@ -23329,7 +23309,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "2978": { + "2961": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -23340,14 +23320,14 @@ "0x151f7c75" ] }, - "2979": { + "2962": { "op": "swap", "stack_out": [ "0x151f7c75", "aggregate%val_as_bytes%0#0" ] }, - "2980": { + "2963": { "op": "concat", "defined_out": [ "tmp%4#0" @@ -23356,11 +23336,11 @@ "tmp%4#0" ] }, - "2981": { + "2964": { "op": "log", "stack_out": [] }, - "2982": { + "2965": { "op": "intc_1 // 1", "defined_out": [ "1" @@ -23369,11 +23349,11 @@ "1" ] }, - "2983": { + "2966": { "op": "return", "stack_out": [] }, - "2984": { + "2967": { "subroutine": "modules.actus_kernel.ActusKernelModule.contract_config[routing]", "params": {}, "block": "contract_config", @@ -23383,17 +23363,17 @@ "day_count_convention#0" ] }, - "2986": { + "2969": { "op": "dup", "stack_out": [ "day_count_convention#0", "values%0#2" ] }, - "2987": { + "2970": { "op": "txna ApplicationArgs 1" }, - "2990": { + "2973": { "op": "dupn 2", "defined_out": [ "terms#0", @@ -23407,7 +23387,7 @@ "terms#0 (copy)" ] }, - "2992": { + "2975": { "op": "len", "defined_out": [ "len%0#0", @@ -23421,7 +23401,7 @@ "len%0#0" ] }, - "2993": { + "2976": { "op": "pushint 107", "defined_out": [ "107", @@ -23437,7 +23417,7 @@ "107" ] }, - "2995": { + "2978": { "op": "==", "defined_out": [ "eq%0#0", @@ -23451,7 +23431,7 @@ "eq%0#0" ] }, - "2996": { + "2979": { "error": "invalid number of bytes for smart_contracts.abi_types.NormalizedActusTerms", "op": "assert // invalid number of bytes for smart_contracts.abi_types.NormalizedActusTerms", "stack_out": [ @@ -23461,10 +23441,10 @@ "terms#0" ] }, - "2997": { + "2980": { "op": "txna ApplicationArgs 2" }, - "3000": { + "2983": { "op": "dup", "defined_out": [ "initial_state#0", @@ -23479,7 +23459,7 @@ "initial_state#0" ] }, - "3001": { + "2984": { "op": "cover 2", "defined_out": [ "initial_state#0", @@ -23494,7 +23474,7 @@ "initial_state#0" ] }, - "3003": { + "2986": { "op": "len", "defined_out": [ "initial_state#0", @@ -23510,7 +23490,7 @@ "len%1#0" ] }, - "3004": { + "2987": { "op": "pushint 72", "defined_out": [ "72", @@ -23528,7 +23508,7 @@ "72" ] }, - "3006": { + "2989": { "op": "==", "defined_out": [ "eq%1#0", @@ -23544,7 +23524,7 @@ "eq%1#0" ] }, - "3007": { + "2990": { "error": "invalid number of bytes for smart_contracts.abi_types.InitialKernelState", "op": "assert // invalid number of bytes for smart_contracts.abi_types.InitialKernelState", "stack_out": [ @@ -23555,10 +23535,10 @@ "terms#0" ] }, - "3008": { + "2991": { "op": "txna ApplicationArgs 3" }, - "3011": { + "2994": { "op": "dup", "defined_out": [ "initial_state#0", @@ -23575,7 +23555,7 @@ "prospectus#0" ] }, - "3012": { + "2995": { "op": "cover 2", "defined_out": [ "initial_state#0", @@ -23592,7 +23572,7 @@ "prospectus#0" ] }, - "3014": { + "2997": { "op": "dup", "defined_out": [ "initial_state#0", @@ -23611,7 +23591,7 @@ "prospectus#0 (copy)" ] }, - "3015": { + "2998": { "op": "len", "defined_out": [ "initial_state#0", @@ -23630,7 +23610,7 @@ "tuple_len%0#0" ] }, - "3016": { + "2999": { "op": "dig 1", "stack_out": [ "day_count_convention#0", @@ -23644,7 +23624,7 @@ "prospectus#0 (copy)" ] }, - "3018": { + "3001": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -23667,7 +23647,7 @@ "32" ] }, - "3019": { + "3002": { "error": "invalid tuple encoding", "op": "extract_uint16 // on error: invalid tuple encoding", "defined_out": [ @@ -23689,7 +23669,7 @@ "extract_uint16%0#0" ] }, - "3020": { + "3003": { "op": "dup", "defined_out": [ "extract_uint16%0#0", @@ -23712,7 +23692,7 @@ "extract_uint16%0#0 (copy)" ] }, - "3021": { + "3004": { "op": "pushint 34", "defined_out": [ "34", @@ -23737,7 +23717,7 @@ "34" ] }, - "3023": { + "3006": { "op": "==", "defined_out": [ "eq%2#0", @@ -23760,7 +23740,7 @@ "eq%2#0" ] }, - "3024": { + "3007": { "error": "invalid tail pointer at index 1 of (uint8[32],(len+utf8[]))", "op": "assert // invalid tail pointer at index 1 of (uint8[32],(len+utf8[]))", "stack_out": [ @@ -23775,7 +23755,7 @@ "extract_uint16%0#0" ] }, - "3025": { + "3008": { "op": "uncover 2", "stack_out": [ "day_count_convention#0", @@ -23789,7 +23769,7 @@ "prospectus#0" ] }, - "3027": { + "3010": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -23803,7 +23783,7 @@ "extract_uint16%0#0" ] }, - "3028": { + "3011": { "op": "dig 2", "defined_out": [ "extract_uint16%0#0", @@ -23826,7 +23806,7 @@ "tuple_len%0#0 (copy)" ] }, - "3030": { + "3013": { "op": "substring3", "defined_out": [ "initial_state#0", @@ -23846,7 +23826,7 @@ "substring3%0#0" ] }, - "3031": { + "3014": { "op": "dup", "stack_out": [ "day_count_convention#0", @@ -23860,7 +23840,7 @@ "substring3%0#0" ] }, - "3032": { + "3015": { "op": "cover 3", "defined_out": [ "initial_state#0", @@ -23881,7 +23861,7 @@ "substring3%0#0" ] }, - "3034": { + "3017": { "op": "intc_0 // 0", "stack_out": [ "day_count_convention#0", @@ -23896,7 +23876,7 @@ "0" ] }, - "3035": { + "3018": { "error": "invalid array length header", "op": "extract_uint16 // on error: invalid array length header", "defined_out": [ @@ -23919,7 +23899,7 @@ "aggregate%array_length%0#0" ] }, - "3036": { + "3019": { "op": "pushint 36", "defined_out": [ "36", @@ -23943,7 +23923,7 @@ "36" ] }, - "3038": { + "3021": { "op": "+", "defined_out": [ "add%1#0", @@ -23965,7 +23945,7 @@ "add%1#0" ] }, - "3039": { + "3022": { "op": "==", "defined_out": [ "eq%3#0", @@ -23985,7 +23965,7 @@ "eq%3#0" ] }, - "3040": { + "3023": { "error": "invalid number of bytes for smart_contracts.abi_types.Prospectus", "op": "assert // invalid number of bytes for smart_contracts.abi_types.Prospectus", "stack_out": [ @@ -23998,11 +23978,11 @@ "terms#0" ] }, - "3041": { + "3024": { "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", "op": "callsub _assert_caller_is_arranger" }, - "3044": { + "3027": { "op": "intc_0 // 0", "stack_out": [ "day_count_convention#0", @@ -24015,7 +23995,7 @@ "0" ] }, - "3045": { + "3028": { "op": "getbyte", "defined_out": [ "contract_type#0", @@ -24034,7 +24014,7 @@ "contract_type#0" ] }, - "3046": { + "3029": { "op": "dup", "defined_out": [ "contract_type#0", @@ -24054,7 +24034,7 @@ "contract_type#0" ] }, - "3047": { + "3030": { "op": "bytec 10 // \"contract_type\"", "defined_out": [ "\"contract_type\"", @@ -24076,7 +24056,7 @@ "\"contract_type\"" ] }, - "3049": { + "3032": { "op": "dig 1", "defined_out": [ "\"contract_type\"", @@ -24100,7 +24080,7 @@ "contract_type#0 (copy)" ] }, - "3051": { + "3034": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -24113,7 +24093,7 @@ "contract_type#0" ] }, - "3052": { + "3035": { "op": "bz contract_config_bool_true@7", "stack_out": [ "day_count_convention#0", @@ -24125,7 +24105,7 @@ "contract_type#0" ] }, - "3055": { + "3038": { "op": "dup", "stack_out": [ "day_count_convention#0", @@ -24138,7 +24118,7 @@ "contract_type#0" ] }, - "3056": { + "3039": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -24160,7 +24140,7 @@ "1" ] }, - "3057": { + "3040": { "op": "==", "defined_out": [ "contract_type#0", @@ -24181,7 +24161,7 @@ "tmp%1#2" ] }, - "3058": { + "3041": { "op": "bnz contract_config_bool_true@7", "stack_out": [ "day_count_convention#0", @@ -24193,7 +24173,7 @@ "contract_type#0" ] }, - "3061": { + "3044": { "op": "dup", "stack_out": [ "day_count_convention#0", @@ -24206,7 +24186,7 @@ "contract_type#0" ] }, - "3062": { + "3045": { "op": "pushint 2", "defined_out": [ "2", @@ -24228,7 +24208,7 @@ "2" ] }, - "3064": { + "3047": { "op": "==", "defined_out": [ "contract_type#0", @@ -24249,7 +24229,7 @@ "tmp%2#0" ] }, - "3065": { + "3048": { "op": "bnz contract_config_bool_true@7", "stack_out": [ "day_count_convention#0", @@ -24261,7 +24241,7 @@ "contract_type#0" ] }, - "3068": { + "3051": { "op": "dup", "stack_out": [ "day_count_convention#0", @@ -24274,7 +24254,7 @@ "contract_type#0" ] }, - "3069": { + "3052": { "op": "pushint 3", "stack_out": [ "day_count_convention#0", @@ -24288,7 +24268,7 @@ "3" ] }, - "3071": { + "3054": { "op": "==", "defined_out": [ "contract_type#0", @@ -24309,7 +24289,7 @@ "tmp%3#0" ] }, - "3072": { + "3055": { "op": "bnz contract_config_bool_true@7", "stack_out": [ "day_count_convention#0", @@ -24321,7 +24301,7 @@ "contract_type#0" ] }, - "3075": { + "3058": { "op": "dup", "stack_out": [ "day_count_convention#0", @@ -24334,7 +24314,7 @@ "contract_type#0" ] }, - "3076": { + "3059": { "op": "pushint 4", "defined_out": [ "4", @@ -24356,7 +24336,7 @@ "4" ] }, - "3078": { + "3061": { "op": "==", "defined_out": [ "contract_type#0", @@ -24377,7 +24357,7 @@ "tmp%4#1" ] }, - "3079": { + "3062": { "op": "bnz contract_config_bool_true@7", "stack_out": [ "day_count_convention#0", @@ -24389,7 +24369,7 @@ "contract_type#0" ] }, - "3082": { + "3065": { "op": "dup", "stack_out": [ "day_count_convention#0", @@ -24402,7 +24382,7 @@ "contract_type#0" ] }, - "3083": { + "3066": { "op": "pushint 5", "defined_out": [ "5", @@ -24424,7 +24404,7 @@ "5" ] }, - "3085": { + "3068": { "op": "==", "defined_out": [ "contract_type#0", @@ -24445,7 +24425,7 @@ "tmp%5#1" ] }, - "3086": { + "3069": { "op": "bz contract_config_bool_false@8", "stack_out": [ "day_count_convention#0", @@ -24457,7 +24437,7 @@ "contract_type#0" ] }, - "3089": { + "3072": { "block": "contract_config_bool_true@7", "stack_in": [ "day_count_convention#0", @@ -24483,7 +24463,7 @@ "or_result%0#0" ] }, - "3090": { + "3073": { "error": "Invalid ACTUS configuration", "block": "contract_config_bool_merge@9", "stack_in": [ @@ -24508,7 +24488,7 @@ "contract_type#0" ] }, - "3091": { + "3074": { "op": "intc_0 // 0", "defined_out": [ "0" @@ -24524,7 +24504,7 @@ "0" ] }, - "3092": { + "3075": { "op": "bytec 10 // \"contract_type\"", "defined_out": [ "\"contract_type\"", @@ -24542,7 +24522,7 @@ "\"contract_type\"" ] }, - "3094": { + "3077": { "op": "app_global_get_ex", "defined_out": [ "contract_type#0", @@ -24560,7 +24540,7 @@ "maybe_exists%1#0" ] }, - "3095": { + "3078": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -24574,7 +24554,7 @@ "contract_type#0" ] }, - "3096": { + "3079": { "op": "bury 2", "defined_out": [ "contract_type#0", @@ -24591,7 +24571,7 @@ "maybe_exists%1#0" ] }, - "3098": { + "3081": { "error": "check self.contract_type exists", "op": "assert // check self.contract_type exists", "stack_out": [ @@ -24604,7 +24584,7 @@ "contract_type#0" ] }, - "3099": { + "3082": { "op": "dig 4", "defined_out": [ "contract_type#0", @@ -24621,7 +24601,7 @@ "terms#0" ] }, - "3101": { + "3084": { "op": "dup", "defined_out": [ "contract_type#0", @@ -24640,7 +24620,7 @@ "terms#0 (copy)" ] }, - "3102": { + "3085": { "op": "pushint 33", "defined_out": [ "33", @@ -24661,7 +24641,7 @@ "33" ] }, - "3104": { + "3087": { "op": "extract_uint64", "defined_out": [ "contract_type#0", @@ -24680,7 +24660,7 @@ "values%0#2" ] }, - "3105": { + "3088": { "op": "dup", "stack_out": [ "day_count_convention#0", @@ -24695,7 +24675,7 @@ "values%0#2" ] }, - "3106": { + "3089": { "op": "bury 8", "defined_out": [ "contract_type#0", @@ -24714,7 +24694,7 @@ "values%0#2" ] }, - "3108": { + "3091": { "error": "Invalid ACTUS configuration", "op": "assert // Invalid ACTUS configuration", "stack_out": [ @@ -24728,7 +24708,7 @@ "terms#0" ] }, - "3109": { + "3092": { "op": "pushint 57", "defined_out": [ "57", @@ -24748,7 +24728,7 @@ "57" ] }, - "3111": { + "3094": { "op": "getbyte", "defined_out": [ "contract_type#0", @@ -24767,7 +24747,7 @@ "day_count_convention#0" ] }, - "3112": { + "3095": { "op": "dup", "stack_out": [ "day_count_convention#0", @@ -24781,7 +24761,7 @@ "day_count_convention#0" ] }, - "3113": { + "3096": { "op": "bury 8", "defined_out": [ "contract_type#0", @@ -24800,7 +24780,7 @@ "day_count_convention#0" ] }, - "3115": { + "3098": { "op": "bz contract_config_bool_true@16", "stack_out": [ "day_count_convention#0", @@ -24812,7 +24792,7 @@ "contract_type#0" ] }, - "3118": { + "3101": { "op": "dig 6", "stack_out": [ "day_count_convention#0", @@ -24825,7 +24805,7 @@ "day_count_convention#0" ] }, - "3120": { + "3103": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -24846,7 +24826,7 @@ "1" ] }, - "3121": { + "3104": { "op": "==", "defined_out": [ "contract_type#0", @@ -24866,7 +24846,7 @@ "tmp%1#2" ] }, - "3122": { + "3105": { "op": "bnz contract_config_bool_true@16", "stack_out": [ "day_count_convention#0", @@ -24878,7 +24858,7 @@ "contract_type#0" ] }, - "3125": { + "3108": { "op": "dig 6", "stack_out": [ "day_count_convention#0", @@ -24891,7 +24871,7 @@ "day_count_convention#0" ] }, - "3127": { + "3110": { "op": "pushint 2", "stack_out": [ "day_count_convention#0", @@ -24905,7 +24885,7 @@ "2" ] }, - "3129": { + "3112": { "op": "==", "defined_out": [ "contract_type#0", @@ -24925,7 +24905,7 @@ "tmp%2#0" ] }, - "3130": { + "3113": { "op": "bnz contract_config_bool_true@16", "stack_out": [ "day_count_convention#0", @@ -24937,7 +24917,7 @@ "contract_type#0" ] }, - "3133": { + "3116": { "op": "dig 6", "stack_out": [ "day_count_convention#0", @@ -24950,7 +24930,7 @@ "day_count_convention#0" ] }, - "3135": { + "3118": { "op": "pushint 3", "defined_out": [ "3", @@ -24971,7 +24951,7 @@ "3" ] }, - "3137": { + "3120": { "op": "==", "defined_out": [ "contract_type#0", @@ -24991,7 +24971,7 @@ "tmp%3#0" ] }, - "3138": { + "3121": { "op": "bnz contract_config_bool_true@16", "stack_out": [ "day_count_convention#0", @@ -25003,7 +24983,7 @@ "contract_type#0" ] }, - "3141": { + "3124": { "op": "dig 6", "stack_out": [ "day_count_convention#0", @@ -25016,7 +24996,7 @@ "day_count_convention#0" ] }, - "3143": { + "3126": { "op": "pushint 4", "defined_out": [ "4", @@ -25037,7 +25017,7 @@ "4" ] }, - "3145": { + "3128": { "op": "==", "defined_out": [ "contract_type#0", @@ -25057,7 +25037,7 @@ "tmp%4#1" ] }, - "3146": { + "3129": { "op": "bz contract_config_bool_false@17", "stack_out": [ "day_count_convention#0", @@ -25069,7 +25049,7 @@ "contract_type#0" ] }, - "3149": { + "3132": { "block": "contract_config_bool_true@16", "stack_in": [ "day_count_convention#0", @@ -25095,7 +25075,7 @@ "or_result%0#0" ] }, - "3150": { + "3133": { "error": "Invalid day-count convention ID", "block": "contract_config_bool_merge@18", "stack_in": [ @@ -25120,7 +25100,7 @@ "contract_type#0" ] }, - "3151": { + "3134": { "op": "dup", "defined_out": [ "contract_type#0" @@ -25136,7 +25116,7 @@ "contract_type#0" ] }, - "3152": { + "3135": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -25154,7 +25134,7 @@ "1" ] }, - "3153": { + "3136": { "op": "!=", "defined_out": [ "contract_type#0", @@ -25171,7 +25151,7 @@ "tmp%2#0" ] }, - "3154": { + "3137": { "op": "bz contract_config_after_if_else@20", "stack_out": [ "day_count_convention#0", @@ -25183,7 +25163,7 @@ "contract_type#0" ] }, - "3157": { + "3140": { "op": "dig 4", "defined_out": [ "contract_type#0", @@ -25200,7 +25180,7 @@ "terms#0" ] }, - "3159": { + "3142": { "op": "pushint 786", "defined_out": [ "786", @@ -25219,7 +25199,7 @@ "786" ] }, - "3162": { + "3145": { "op": "getbit", "defined_out": [ "aggregate%get_bit%0#0", @@ -25237,7 +25217,7 @@ "aggregate%get_bit%0#0" ] }, - "3163": { + "3146": { "op": "!", "defined_out": [ "contract_type#0", @@ -25255,7 +25235,7 @@ "tmp%3#0" ] }, - "3164": { + "3147": { "error": "Invalid ACTUS configuration", "op": "assert // Invalid ACTUS configuration", "stack_out": [ @@ -25268,7 +25248,7 @@ "contract_type#0" ] }, - "3165": { + "3148": { "block": "contract_config_after_if_else@20", "stack_in": [ "day_count_convention#0", @@ -25294,7 +25274,7 @@ "0" ] }, - "3166": { + "3149": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"", @@ -25312,7 +25292,7 @@ "\"status\"" ] }, - "3167": { + "3150": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#1", @@ -25330,7 +25310,7 @@ "maybe_exists%0#1" ] }, - "3168": { + "3151": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ @@ -25344,7 +25324,7 @@ "maybe_value%0#1" ] }, - "3169": { + "3152": { "op": "!", "defined_out": [ "tmp%0#2" @@ -25360,7 +25340,7 @@ "tmp%0#2" ] }, - "3170": { + "3153": { "error": "D-ASA already configured", "op": "assert // D-ASA already configured", "stack_out": [ @@ -25373,7 +25353,7 @@ "contract_type#0" ] }, - "3171": { + "3154": { "op": "intc_0 // 0", "stack_out": [ "day_count_convention#0", @@ -25386,7 +25366,7 @@ "0" ] }, - "3172": { + "3155": { "op": "bytec 20 // \"initial_exchange_amount\"", "defined_out": [ "\"initial_exchange_amount\"", @@ -25404,7 +25384,7 @@ "\"initial_exchange_amount\"" ] }, - "3174": { + "3157": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%1#0", @@ -25422,7 +25402,7 @@ "maybe_exists%1#0" ] }, - "3175": { + "3158": { "error": "check self.initial_exchange_amount exists", "op": "assert // check self.initial_exchange_amount exists", "stack_out": [ @@ -25436,7 +25416,7 @@ "maybe_value%1#1" ] }, - "3176": { + "3159": { "op": "!", "defined_out": [ "tmp%1#2" @@ -25452,7 +25432,7 @@ "tmp%1#2" ] }, - "3177": { + "3160": { "error": "D-ASA already configured", "op": "assert // D-ASA already configured", "stack_out": [ @@ -25465,7 +25445,7 @@ "contract_type#0" ] }, - "3178": { + "3161": { "op": "dig 4", "defined_out": [ "terms#0" @@ -25481,7 +25461,7 @@ "terms#0" ] }, - "3180": { + "3163": { "op": "dup", "defined_out": [ "terms#0", @@ -25499,7 +25479,7 @@ "terms#0 (copy)" ] }, - "3181": { + "3164": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -25519,7 +25499,7 @@ "1" ] }, - "3182": { + "3165": { "op": "extract_uint64", "defined_out": [ "denomination_asset_id#0", @@ -25537,7 +25517,7 @@ "denomination_asset_id#0" ] }, - "3183": { + "3166": { "op": "dup", "defined_out": [ "denomination_asset_id#0", @@ -25557,7 +25537,7 @@ "denomination_asset_id#0 (copy)" ] }, - "3184": { + "3167": { "op": "asset_params_get AssetCreator", "defined_out": [ "_creator#0", @@ -25579,7 +25559,7 @@ "exists#0" ] }, - "3186": { + "3169": { "op": "bury 1", "stack_out": [ "day_count_convention#0", @@ -25594,7 +25574,7 @@ "exists#0" ] }, - "3188": { + "3171": { "error": "Denomination asset is not properly set", "op": "assert // Denomination asset is not properly set", "stack_out": [ @@ -25609,7 +25589,7 @@ "denomination_asset_id#0" ] }, - "3189": { + "3172": { "op": "bytec 44 // \"denomination_asset_id\"", "defined_out": [ "\"denomination_asset_id\"", @@ -25629,7 +25609,7 @@ "\"denomination_asset_id\"" ] }, - "3191": { + "3174": { "op": "dig 1", "stack_out": [ "day_count_convention#0", @@ -25645,7 +25625,7 @@ "denomination_asset_id#0 (copy)" ] }, - "3193": { + "3176": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -25659,7 +25639,7 @@ "denomination_asset_id#0" ] }, - "3194": { + "3177": { "op": "dig 1", "stack_out": [ "day_count_convention#0", @@ -25674,7 +25654,7 @@ "terms#0 (copy)" ] }, - "3196": { + "3179": { "op": "pushint 9", "defined_out": [ "9", @@ -25696,7 +25676,7 @@ "9" ] }, - "3198": { + "3181": { "op": "extract_uint64", "defined_out": [ "denomination_asset_id#0", @@ -25716,7 +25696,7 @@ "settlement_asset_id#0" ] }, - "3199": { + "3182": { "op": "dup", "defined_out": [ "denomination_asset_id#0", @@ -25738,7 +25718,7 @@ "settlement_asset_id#0 (copy)" ] }, - "3200": { + "3183": { "op": "uncover 2", "stack_out": [ "day_count_convention#0", @@ -25754,7 +25734,7 @@ "denomination_asset_id#0" ] }, - "3202": { + "3185": { "op": "==", "stack_out": [ "day_count_convention#0", @@ -25769,7 +25749,7 @@ "tmp%0#2" ] }, - "3203": { + "3186": { "error": "Different settlement asset not supported, must be equal to denomination asset", "op": "assert // Different settlement asset not supported, must be equal to denomination asset", "stack_out": [ @@ -25784,7 +25764,7 @@ "settlement_asset_id#0" ] }, - "3204": { + "3187": { "op": "bytec 19 // \"settlement_asset_id\"", "defined_out": [ "\"settlement_asset_id\"", @@ -25804,7 +25784,7 @@ "\"settlement_asset_id\"" ] }, - "3206": { + "3189": { "op": "dig 1", "stack_out": [ "day_count_convention#0", @@ -25820,7 +25800,7 @@ "settlement_asset_id#0 (copy)" ] }, - "3208": { + "3191": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -25834,10 +25814,10 @@ "settlement_asset_id#0" ] }, - "3209": { + "3192": { "op": "itxn_begin" }, - "3210": { + "3193": { "op": "global MinTxnFee", "defined_out": [ "inner_txn_params%0%%param_Fee_idx_0#0", @@ -25857,7 +25837,7 @@ "inner_txn_params%0%%param_Fee_idx_0#0" ] }, - "3212": { + "3195": { "op": "global CurrentApplicationAddress", "defined_out": [ "inner_txn_params%0%%param_AssetReceiver_idx_0#0", @@ -25879,7 +25859,7 @@ "inner_txn_params%0%%param_AssetReceiver_idx_0#0" ] }, - "3214": { + "3197": { "op": "intc_0 // 0", "stack_out": [ "day_count_convention#0", @@ -25896,7 +25876,7 @@ "0" ] }, - "3215": { + "3198": { "op": "itxn_field AssetAmount", "stack_out": [ "day_count_convention#0", @@ -25912,7 +25892,7 @@ "inner_txn_params%0%%param_AssetReceiver_idx_0#0" ] }, - "3217": { + "3200": { "op": "itxn_field AssetReceiver", "stack_out": [ "day_count_convention#0", @@ -25927,7 +25907,7 @@ "inner_txn_params%0%%param_Fee_idx_0#0" ] }, - "3219": { + "3202": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -25942,7 +25922,7 @@ "settlement_asset_id#0" ] }, - "3220": { + "3203": { "op": "itxn_field XferAsset", "stack_out": [ "day_count_convention#0", @@ -25956,7 +25936,7 @@ "inner_txn_params%0%%param_Fee_idx_0#0" ] }, - "3222": { + "3205": { "op": "pushint 4 // axfer", "defined_out": [ "axfer", @@ -25976,7 +25956,7 @@ "axfer" ] }, - "3224": { + "3207": { "op": "itxn_field TypeEnum", "stack_out": [ "day_count_convention#0", @@ -25990,7 +25970,7 @@ "inner_txn_params%0%%param_Fee_idx_0#0" ] }, - "3226": { + "3209": { "op": "itxn_field Fee", "stack_out": [ "day_count_convention#0", @@ -26003,10 +25983,10 @@ "terms#0" ] }, - "3228": { + "3211": { "op": "itxn_submit" }, - "3229": { + "3212": { "op": "dup", "stack_out": [ "day_count_convention#0", @@ -26020,7 +26000,7 @@ "terms#0 (copy)" ] }, - "3230": { + "3213": { "op": "pushint 17", "defined_out": [ "17", @@ -26040,7 +26020,7 @@ "17" ] }, - "3232": { + "3215": { "op": "extract_uint64", "defined_out": [ "terms#0", @@ -26058,7 +26038,7 @@ "values%4#0" ] }, - "3233": { + "3216": { "op": "bytec 13 // \"total_units\"", "defined_out": [ "\"total_units\"", @@ -26078,7 +26058,7 @@ "\"total_units\"" ] }, - "3235": { + "3218": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -26093,7 +26073,7 @@ "values%4#0" ] }, - "3236": { + "3219": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -26106,7 +26086,7 @@ "terms#0" ] }, - "3237": { + "3220": { "op": "bytec 11 // \"reserved_units_total\"", "defined_out": [ "\"reserved_units_total\"", @@ -26124,7 +26104,7 @@ "\"reserved_units_total\"" ] }, - "3239": { + "3222": { "op": "intc_0 // 0", "stack_out": [ "day_count_convention#0", @@ -26139,7 +26119,7 @@ "0" ] }, - "3240": { + "3223": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -26152,7 +26132,7 @@ "terms#0" ] }, - "3241": { + "3224": { "op": "bytec 46 // \"day_count_convention\"", "defined_out": [ "\"day_count_convention\"", @@ -26170,7 +26150,7 @@ "\"day_count_convention\"" ] }, - "3243": { + "3226": { "op": "dig 8", "defined_out": [ "\"day_count_convention\"", @@ -26190,7 +26170,7 @@ "day_count_convention#0" ] }, - "3245": { + "3228": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -26203,7 +26183,7 @@ "terms#0" ] }, - "3246": { + "3229": { "op": "dup", "stack_out": [ "day_count_convention#0", @@ -26217,7 +26197,7 @@ "terms#0 (copy)" ] }, - "3247": { + "3230": { "op": "pushint 41", "defined_out": [ "41", @@ -26238,7 +26218,7 @@ "41" ] }, - "3249": { + "3232": { "op": "extract_uint64", "defined_out": [ "day_count_convention#0", @@ -26257,7 +26237,7 @@ "values%5#0" ] }, - "3250": { + "3233": { "op": "bytec 28 // \"initial_exchange_date\"", "defined_out": [ "\"initial_exchange_date\"", @@ -26278,7 +26258,7 @@ "\"initial_exchange_date\"" ] }, - "3252": { + "3235": { "op": "dig 1", "defined_out": [ "\"initial_exchange_date\"", @@ -26301,7 +26281,7 @@ "values%5#0 (copy)" ] }, - "3254": { + "3237": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -26315,7 +26295,7 @@ "values%5#0" ] }, - "3255": { + "3238": { "op": "dig 1", "stack_out": [ "day_count_convention#0", @@ -26330,7 +26310,7 @@ "terms#0 (copy)" ] }, - "3257": { + "3240": { "op": "pushint 49", "defined_out": [ "49", @@ -26353,7 +26333,7 @@ "49" ] }, - "3259": { + "3242": { "op": "extract_uint64", "defined_out": [ "day_count_convention#0", @@ -26374,7 +26354,7 @@ "values%6#0" ] }, - "3260": { + "3243": { "op": "bytec 45 // \"maturity_date\"", "defined_out": [ "\"maturity_date\"", @@ -26397,7 +26377,7 @@ "\"maturity_date\"" ] }, - "3262": { + "3245": { "op": "dig 1", "defined_out": [ "\"maturity_date\"", @@ -26422,7 +26402,7 @@ "values%6#0 (copy)" ] }, - "3264": { + "3247": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -26437,7 +26417,7 @@ "values%6#0" ] }, - "3265": { + "3248": { "op": "dig 6", "defined_out": [ "day_count_convention#0", @@ -26460,7 +26440,7 @@ "initial_state#0" ] }, - "3267": { + "3250": { "op": "dup", "defined_out": [ "day_count_convention#0", @@ -26485,7 +26465,7 @@ "initial_state#0 (copy)" ] }, - "3268": { + "3251": { "op": "cover 2", "stack_out": [ "day_count_convention#0", @@ -26502,7 +26482,7 @@ "initial_state#0 (copy)" ] }, - "3270": { + "3253": { "op": "pushint 48", "defined_out": [ "48", @@ -26529,7 +26509,7 @@ "48" ] }, - "3272": { + "3255": { "op": "extract_uint64", "defined_out": [ "day_count_convention#0", @@ -26554,7 +26534,7 @@ "values%7#0" ] }, - "3273": { + "3256": { "op": "bytec 14 // \"next_principal_redemption\"", "defined_out": [ "\"next_principal_redemption\"", @@ -26581,7 +26561,7 @@ "\"next_principal_redemption\"" ] }, - "3275": { + "3258": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -26599,7 +26579,7 @@ "values%7#0" ] }, - "3276": { + "3259": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -26615,7 +26595,7 @@ "values%6#0" ] }, - "3277": { + "3260": { "op": "bytec 20 // \"initial_exchange_amount\"", "stack_out": [ "day_count_convention#0", @@ -26632,7 +26612,7 @@ "\"initial_exchange_amount\"" ] }, - "3279": { + "3262": { "op": "dig 10", "defined_out": [ "\"initial_exchange_amount\"", @@ -26659,7 +26639,7 @@ "values%0#2" ] }, - "3281": { + "3264": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -26675,7 +26655,7 @@ "values%6#0" ] }, - "3282": { + "3265": { "op": "dig 3", "stack_out": [ "day_count_convention#0", @@ -26692,7 +26672,7 @@ "terms#0 (copy)" ] }, - "3284": { + "3267": { "op": "pushint 786", "defined_out": [ "786", @@ -26720,7 +26700,7 @@ "786" ] }, - "3287": { + "3270": { "op": "getbit", "defined_out": [ "aggregate%get_bit%1#0", @@ -26746,8 +26726,8 @@ "aggregate%get_bit%1#0" ] }, - "3288": { - "op": "bytec 34 // \"dynamic_principal_redemption\"", + "3271": { + "op": "bytec 35 // \"dynamic_principal_redemption\"", "defined_out": [ "\"dynamic_principal_redemption\"", "aggregate%get_bit%1#0", @@ -26774,7 +26754,7 @@ "\"dynamic_principal_redemption\"" ] }, - "3290": { + "3273": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -26792,7 +26772,7 @@ "aggregate%get_bit%1#0" ] }, - "3291": { + "3274": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -26808,7 +26788,7 @@ "values%6#0" ] }, - "3292": { + "3275": { "op": "dig 1", "stack_out": [ "day_count_convention#0", @@ -26825,7 +26805,7 @@ "initial_state#0 (copy)" ] }, - "3294": { + "3277": { "op": "pushint 16", "defined_out": [ "16", @@ -26853,7 +26833,7 @@ "16" ] }, - "3296": { + "3279": { "op": "extract_uint64", "defined_out": [ "day_count_convention#0", @@ -26879,7 +26859,7 @@ "values%10#0" ] }, - "3297": { + "3280": { "op": "bytec 4 // \"outstanding_principal\"", "defined_out": [ "\"outstanding_principal\"", @@ -26907,7 +26887,7 @@ "\"outstanding_principal\"" ] }, - "3299": { + "3282": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -26925,7 +26905,7 @@ "values%10#0" ] }, - "3300": { + "3283": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -26941,7 +26921,7 @@ "values%6#0" ] }, - "3301": { + "3284": { "op": "dig 1", "stack_out": [ "day_count_convention#0", @@ -26958,7 +26938,7 @@ "initial_state#0 (copy)" ] }, - "3303": { + "3286": { "op": "pushint 40", "defined_out": [ "40", @@ -26986,7 +26966,7 @@ "40" ] }, - "3305": { + "3288": { "op": "extract_uint64", "defined_out": [ "day_count_convention#0", @@ -27012,7 +26992,7 @@ "values%11#0" ] }, - "3306": { + "3289": { "op": "bytec 6 // \"accrued_interest\"", "defined_out": [ "\"accrued_interest\"", @@ -27040,7 +27020,7 @@ "\"accrued_interest\"" ] }, - "3308": { + "3291": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -27058,7 +27038,7 @@ "values%11#0" ] }, - "3309": { + "3292": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -27074,7 +27054,7 @@ "values%6#0" ] }, - "3310": { + "3293": { "op": "dig 1", "stack_out": [ "day_count_convention#0", @@ -27091,7 +27071,7 @@ "initial_state#0 (copy)" ] }, - "3312": { + "3295": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -27119,7 +27099,7 @@ "32" ] }, - "3313": { + "3296": { "op": "extract_uint64", "defined_out": [ "day_count_convention#0", @@ -27145,7 +27125,7 @@ "values%12#0" ] }, - "3314": { + "3297": { "op": "bytec 9 // \"nominal_interest_rate\"", "defined_out": [ "\"nominal_interest_rate\"", @@ -27173,7 +27153,7 @@ "\"nominal_interest_rate\"" ] }, - "3316": { + "3299": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -27191,7 +27171,7 @@ "values%12#0" ] }, - "3317": { + "3300": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -27207,7 +27187,7 @@ "values%6#0" ] }, - "3318": { + "3301": { "op": "dig 1", "stack_out": [ "day_count_convention#0", @@ -27224,7 +27204,7 @@ "initial_state#0 (copy)" ] }, - "3320": { + "3303": { "op": "pushint 24", "defined_out": [ "24", @@ -27252,7 +27232,7 @@ "24" ] }, - "3322": { + "3305": { "op": "extract_uint64", "defined_out": [ "day_count_convention#0", @@ -27278,7 +27258,7 @@ "values%13#0" ] }, - "3323": { + "3306": { "op": "bytec 7 // \"interest_calculation_base\"", "defined_out": [ "\"interest_calculation_base\"", @@ -27306,7 +27286,7 @@ "\"interest_calculation_base\"" ] }, - "3325": { + "3308": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -27324,7 +27304,7 @@ "values%13#0" ] }, - "3326": { + "3309": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -27340,7 +27320,7 @@ "values%6#0" ] }, - "3327": { + "3310": { "op": "dig 3", "stack_out": [ "day_count_convention#0", @@ -27357,7 +27337,7 @@ "terms#0 (copy)" ] }, - "3329": { + "3312": { "op": "pushint 58", "defined_out": [ "58", @@ -27385,7 +27365,7 @@ "58" ] }, - "3331": { + "3314": { "op": "extract_uint64", "defined_out": [ "day_count_convention#0", @@ -27411,8 +27391,8 @@ "values%14#0" ] }, - "3332": { - "op": "bytec 35 // \"rate_reset_spread\"", + "3315": { + "op": "bytec 36 // \"rate_reset_spread\"", "defined_out": [ "\"rate_reset_spread\"", "day_count_convention#0", @@ -27439,7 +27419,7 @@ "\"rate_reset_spread\"" ] }, - "3334": { + "3317": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -27457,7 +27437,7 @@ "values%14#0" ] }, - "3335": { + "3318": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -27473,7 +27453,7 @@ "values%6#0" ] }, - "3336": { + "3319": { "op": "dig 3", "stack_out": [ "day_count_convention#0", @@ -27490,7 +27470,7 @@ "terms#0 (copy)" ] }, - "3338": { + "3321": { "op": "pushint 66", "defined_out": [ "66", @@ -27518,7 +27498,7 @@ "66" ] }, - "3340": { + "3323": { "op": "extract_uint64", "defined_out": [ "day_count_convention#0", @@ -27544,8 +27524,8 @@ "values%15#0" ] }, - "3341": { - "op": "bytec 36 // \"rate_reset_multiplier\"", + "3324": { + "op": "bytec 37 // \"rate_reset_multiplier\"", "defined_out": [ "\"rate_reset_multiplier\"", "day_count_convention#0", @@ -27572,7 +27552,7 @@ "\"rate_reset_multiplier\"" ] }, - "3343": { + "3326": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -27590,7 +27570,7 @@ "values%15#0" ] }, - "3344": { + "3327": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -27606,7 +27586,7 @@ "values%6#0" ] }, - "3345": { + "3328": { "op": "dig 3", "stack_out": [ "day_count_convention#0", @@ -27623,7 +27603,7 @@ "terms#0 (copy)" ] }, - "3347": { + "3330": { "op": "pushint 74", "defined_out": [ "74", @@ -27651,7 +27631,7 @@ "74" ] }, - "3349": { + "3332": { "op": "extract_uint64", "defined_out": [ "day_count_convention#0", @@ -27677,7 +27657,7 @@ "values%16#0" ] }, - "3350": { + "3333": { "op": "bytec 31 // \"rate_reset_floor\"", "defined_out": [ "\"rate_reset_floor\"", @@ -27705,7 +27685,7 @@ "\"rate_reset_floor\"" ] }, - "3352": { + "3335": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -27723,7 +27703,7 @@ "values%16#0" ] }, - "3353": { + "3336": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -27739,7 +27719,7 @@ "values%6#0" ] }, - "3354": { + "3337": { "op": "dig 3", "stack_out": [ "day_count_convention#0", @@ -27756,7 +27736,7 @@ "terms#0 (copy)" ] }, - "3356": { + "3339": { "op": "pushint 82", "defined_out": [ "82", @@ -27784,7 +27764,7 @@ "82" ] }, - "3358": { + "3341": { "op": "extract_uint64", "defined_out": [ "day_count_convention#0", @@ -27810,7 +27790,7 @@ "values%17#0" ] }, - "3359": { + "3342": { "op": "bytec 32 // \"rate_reset_cap\"", "defined_out": [ "\"rate_reset_cap\"", @@ -27838,7 +27818,7 @@ "\"rate_reset_cap\"" ] }, - "3361": { + "3344": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -27856,7 +27836,7 @@ "values%17#0" ] }, - "3362": { + "3345": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -27872,7 +27852,7 @@ "values%6#0" ] }, - "3363": { + "3346": { "op": "dig 3", "stack_out": [ "day_count_convention#0", @@ -27889,7 +27869,7 @@ "terms#0 (copy)" ] }, - "3365": { + "3348": { "op": "pushint 90", "defined_out": [ "90", @@ -27917,7 +27897,7 @@ "90" ] }, - "3367": { + "3350": { "op": "extract_uint64", "defined_out": [ "day_count_convention#0", @@ -27943,8 +27923,8 @@ "values%18#0" ] }, - "3368": { - "op": "bytec 37 // \"rate_reset_next\"", + "3351": { + "op": "bytec 38 // \"rate_reset_next\"", "defined_out": [ "\"rate_reset_next\"", "day_count_convention#0", @@ -27971,7 +27951,7 @@ "\"rate_reset_next\"" ] }, - "3370": { + "3353": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -27989,7 +27969,7 @@ "values%18#0" ] }, - "3371": { + "3354": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -28005,7 +27985,7 @@ "values%6#0" ] }, - "3372": { + "3355": { "op": "dig 3", "stack_out": [ "day_count_convention#0", @@ -28022,7 +28002,7 @@ "terms#0 (copy)" ] }, - "3374": { + "3357": { "op": "pushint 784", "defined_out": [ "784", @@ -28050,7 +28030,7 @@ "784" ] }, - "3377": { + "3360": { "op": "getbit", "defined_out": [ "aggregate%get_bit%2#0", @@ -28076,8 +28056,8 @@ "aggregate%get_bit%2#0" ] }, - "3378": { - "op": "bytec 38 // \"has_rate_reset_floor\"", + "3361": { + "op": "bytec 39 // \"has_rate_reset_floor\"", "defined_out": [ "\"has_rate_reset_floor\"", "aggregate%get_bit%2#0", @@ -28104,7 +28084,7 @@ "\"has_rate_reset_floor\"" ] }, - "3380": { + "3363": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -28122,7 +28102,7 @@ "aggregate%get_bit%2#0" ] }, - "3381": { + "3364": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -28138,7 +28118,7 @@ "values%6#0" ] }, - "3382": { + "3365": { "op": "dig 3", "stack_out": [ "day_count_convention#0", @@ -28155,7 +28135,7 @@ "terms#0 (copy)" ] }, - "3384": { + "3367": { "op": "pushint 785", "defined_out": [ "785", @@ -28183,7 +28163,7 @@ "785" ] }, - "3387": { + "3370": { "op": "getbit", "defined_out": [ "aggregate%get_bit%3#0", @@ -28209,8 +28189,8 @@ "aggregate%get_bit%3#0" ] }, - "3388": { - "op": "bytec 39 // \"has_rate_reset_cap\"", + "3371": { + "op": "bytec 40 // \"has_rate_reset_cap\"", "defined_out": [ "\"has_rate_reset_cap\"", "aggregate%get_bit%3#0", @@ -28237,7 +28217,7 @@ "\"has_rate_reset_cap\"" ] }, - "3390": { + "3373": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -28255,7 +28235,7 @@ "aggregate%get_bit%3#0" ] }, - "3391": { + "3374": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -28271,7 +28251,7 @@ "values%6#0" ] }, - "3392": { + "3375": { "op": "uncover 3", "stack_out": [ "day_count_convention#0", @@ -28287,7 +28267,7 @@ "terms#0" ] }, - "3394": { + "3377": { "op": "pushint 99", "defined_out": [ "99", @@ -28313,7 +28293,7 @@ "99" ] }, - "3396": { + "3379": { "op": "extract_uint64", "defined_out": [ "day_count_convention#0", @@ -28338,7 +28318,7 @@ "values%21#0" ] }, - "3397": { + "3380": { "op": "bytec 5 // \"fixed_point_scale\"", "defined_out": [ "\"fixed_point_scale\"", @@ -28365,7 +28345,7 @@ "\"fixed_point_scale\"" ] }, - "3399": { + "3382": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -28382,7 +28362,7 @@ "values%21#0" ] }, - "3400": { + "3383": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -28397,7 +28377,7 @@ "values%6#0" ] }, - "3401": { + "3384": { "op": "dig 1", "stack_out": [ "day_count_convention#0", @@ -28413,7 +28393,7 @@ "initial_state#0 (copy)" ] }, - "3403": { + "3386": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -28440,7 +28420,7 @@ "8" ] }, - "3404": { + "3387": { "op": "extract_uint64", "defined_out": [ "day_count_convention#0", @@ -28465,7 +28445,7 @@ "values%22#0" ] }, - "3405": { + "3388": { "op": "bytec_2 // \"event_cursor\"", "defined_out": [ "\"event_cursor\"", @@ -28492,7 +28472,7 @@ "\"event_cursor\"" ] }, - "3406": { + "3389": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -28509,7 +28489,7 @@ "values%22#0" ] }, - "3407": { + "3390": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -28524,7 +28504,7 @@ "values%6#0" ] }, - "3408": { + "3391": { "op": "dig 1", "stack_out": [ "day_count_convention#0", @@ -28540,7 +28520,7 @@ "initial_state#0 (copy)" ] }, - "3410": { + "3393": { "op": "pushint 56", "defined_out": [ "56", @@ -28567,7 +28547,7 @@ "56" ] }, - "3412": { + "3395": { "op": "extract_uint64", "defined_out": [ "day_count_convention#0", @@ -28592,7 +28572,7 @@ "values%23#0" ] }, - "3413": { + "3396": { "op": "bytec 16 // \"cumulative_interest_index\"", "defined_out": [ "\"cumulative_interest_index\"", @@ -28619,7 +28599,7 @@ "\"cumulative_interest_index\"" ] }, - "3415": { + "3398": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -28636,7 +28616,7 @@ "values%23#0" ] }, - "3416": { + "3399": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -28651,7 +28631,7 @@ "values%6#0" ] }, - "3417": { + "3400": { "op": "dig 1", "stack_out": [ "day_count_convention#0", @@ -28667,7 +28647,7 @@ "initial_state#0 (copy)" ] }, - "3419": { + "3402": { "op": "pushint 64", "defined_out": [ "64", @@ -28694,7 +28674,7 @@ "64" ] }, - "3421": { + "3404": { "op": "extract_uint64", "defined_out": [ "day_count_convention#0", @@ -28719,7 +28699,7 @@ "values%24#0" ] }, - "3422": { + "3405": { "op": "bytec 17 // \"cumulative_principal_index\"", "defined_out": [ "\"cumulative_principal_index\"", @@ -28746,7 +28726,7 @@ "\"cumulative_principal_index\"" ] }, - "3424": { + "3407": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -28763,7 +28743,7 @@ "values%24#0" ] }, - "3425": { + "3408": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -28778,7 +28758,7 @@ "values%6#0" ] }, - "3426": { + "3409": { "op": "bytec 15 // \"reserved_interest\"", "defined_out": [ "\"reserved_interest\"", @@ -28803,7 +28783,7 @@ "\"reserved_interest\"" ] }, - "3428": { + "3411": { "op": "intc_0 // 0", "stack_out": [ "day_count_convention#0", @@ -28820,7 +28800,7 @@ "0" ] }, - "3429": { + "3412": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -28835,7 +28815,7 @@ "values%6#0" ] }, - "3430": { + "3413": { "op": "bytec 12 // \"reserved_principal\"", "defined_out": [ "\"reserved_principal\"", @@ -28860,7 +28840,7 @@ "\"reserved_principal\"" ] }, - "3432": { + "3415": { "op": "intc_0 // 0", "stack_out": [ "day_count_convention#0", @@ -28877,7 +28857,7 @@ "0" ] }, - "3433": { + "3416": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -28892,7 +28872,7 @@ "values%6#0" ] }, - "3434": { + "3417": { "op": "dig 2", "stack_out": [ "day_count_convention#0", @@ -28908,7 +28888,7 @@ "values%5#0 (copy)" ] }, - "3436": { + "3419": { "op": "global LatestTimestamp", "defined_out": [ "day_count_convention#0", @@ -28935,7 +28915,7 @@ "tmp%3#1" ] }, - "3438": { + "3421": { "op": ">", "defined_out": [ "day_count_convention#0", @@ -28960,7 +28940,7 @@ "tmp%4#1" ] }, - "3439": { + "3422": { "error": "IED must be set in the future", "op": "assert // IED must be set in the future", "stack_out": [ @@ -28976,7 +28956,7 @@ "values%6#0" ] }, - "3440": { + "3423": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -28991,7 +28971,7 @@ "initial_state#0" ] }, - "3441": { + "3424": { "op": "intc_0 // 0", "stack_out": [ "day_count_convention#0", @@ -29007,7 +28987,7 @@ "0" ] }, - "3442": { + "3425": { "op": "extract_uint64", "defined_out": [ "day_count_convention#0", @@ -29031,7 +29011,7 @@ "values%27#0" ] }, - "3443": { + "3426": { "op": "dig 2", "stack_out": [ "day_count_convention#0", @@ -29047,7 +29027,7 @@ "values%5#0 (copy)" ] }, - "3445": { + "3428": { "op": "<", "defined_out": [ "day_count_convention#0", @@ -29071,7 +29051,7 @@ "tmp%5#1" ] }, - "3446": { + "3429": { "error": "IED must be set in the future", "op": "assert // IED must be set in the future", "stack_out": [ @@ -29086,7 +29066,7 @@ "values%6#0" ] }, - "3447": { + "3430": { "op": "<", "defined_out": [ "day_count_convention#0", @@ -29106,7 +29086,7 @@ "tmp%6#0" ] }, - "3448": { + "3431": { "error": "IED must be set in the future", "op": "assert // IED must be set in the future", "stack_out": [ @@ -29119,7 +29099,7 @@ "contract_type#0" ] }, - "3449": { + "3432": { "op": "dig 2", "defined_out": [ "day_count_convention#0", @@ -29139,7 +29119,7 @@ "prospectus#0" ] }, - "3451": { + "3434": { "op": "extract 0 32", "defined_out": [ "aggregate%extract%23#0", @@ -29160,7 +29140,7 @@ "aggregate%extract%23#0" ] }, - "3454": { + "3437": { "op": "bytec 42 // \"prospectus_hash\"", "defined_out": [ "\"prospectus_hash\"", @@ -29183,7 +29163,7 @@ "\"prospectus_hash\"" ] }, - "3456": { + "3439": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -29197,7 +29177,7 @@ "aggregate%extract%23#0" ] }, - "3457": { + "3440": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -29209,7 +29189,7 @@ "contract_type#0" ] }, - "3458": { + "3441": { "op": "dig 1", "defined_out": [ "day_count_convention#0", @@ -29230,7 +29210,7 @@ "substring3%0#0" ] }, - "3460": { + "3443": { "op": "extract 2 0", "defined_out": [ "day_count_convention#0", @@ -29252,7 +29232,7 @@ "values%1#0" ] }, - "3463": { + "3446": { "op": "bytec 43 // \"prospectus_url\"", "defined_out": [ "\"prospectus_url\"", @@ -29276,7 +29256,7 @@ "\"prospectus_url\"" ] }, - "3465": { + "3448": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -29290,7 +29270,7 @@ "values%1#0" ] }, - "3466": { + "3449": { "op": "app_global_put", "stack_out": [ "day_count_convention#0", @@ -29302,7 +29282,7 @@ "contract_type#0" ] }, - "3467": { + "3450": { "op": "global LatestTimestamp", "defined_out": [ "day_count_convention#0", @@ -29324,7 +29304,7 @@ "tmp%1#1" ] }, - "3469": { + "3452": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0", @@ -29346,7 +29326,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "3470": { + "3453": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -29370,7 +29350,7 @@ "0x151f7c75" ] }, - "3471": { + "3454": { "op": "swap", "stack_out": [ "day_count_convention#0", @@ -29384,7 +29364,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "3472": { + "3455": { "op": "concat", "defined_out": [ "day_count_convention#0", @@ -29406,7 +29386,7 @@ "tmp%5#0" ] }, - "3473": { + "3456": { "op": "log", "stack_out": [ "day_count_convention#0", @@ -29418,7 +29398,7 @@ "contract_type#0" ] }, - "3474": { + "3457": { "op": "intc_1 // 1", "stack_out": [ "day_count_convention#0", @@ -29431,7 +29411,7 @@ "1" ] }, - "3475": { + "3458": { "op": "return", "stack_out": [ "day_count_convention#0", @@ -29443,7 +29423,7 @@ "contract_type#0" ] }, - "3476": { + "3459": { "block": "contract_config_bool_false@17", "stack_in": [ "day_count_convention#0", @@ -29469,10 +29449,10 @@ "or_result%0#0" ] }, - "3477": { + "3460": { "op": "b contract_config_bool_merge@18" }, - "3480": { + "3463": { "block": "contract_config_bool_false@8", "stack_in": [ "day_count_convention#0", @@ -29498,10 +29478,10 @@ "or_result%0#0" ] }, - "3481": { + "3464": { "op": "b contract_config_bool_merge@9" }, - "3484": { + "3467": { "subroutine": "modules.actus_kernel.ActusKernelModule.contract_schedule[routing]", "params": {}, "block": "contract_schedule", @@ -29511,14 +29491,14 @@ "aggregate%array_trimmed%0#0" ] }, - "3485": { + "3468": { "op": "pushbytes \"\"", "stack_out": [ "aggregate%array_trimmed%0#0", "entry_event_type#0" ] }, - "3487": { + "3470": { "op": "dupn 2", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -29527,7 +29507,7 @@ "values%1#0" ] }, - "3489": { + "3472": { "op": "txna ApplicationArgs 1", "defined_out": [ "tmp%0#0" @@ -29540,7 +29520,7 @@ "tmp%0#0" ] }, - "3492": { + "3475": { "op": "dup", "defined_out": [ "tmp%0#0", @@ -29555,7 +29535,7 @@ "tmp%0#0 (copy)" ] }, - "3493": { + "3476": { "op": "len", "defined_out": [ "len%0#0", @@ -29570,7 +29550,7 @@ "len%0#0" ] }, - "3494": { + "3477": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -29587,7 +29567,7 @@ "8" ] }, - "3495": { + "3478": { "op": "==", "defined_out": [ "eq%0#0", @@ -29602,7 +29582,7 @@ "eq%0#0" ] }, - "3496": { + "3479": { "error": "invalid number of bytes for arc4.uint64", "op": "assert // invalid number of bytes for arc4.uint64", "stack_out": [ @@ -29613,7 +29593,7 @@ "tmp%0#0" ] }, - "3497": { + "3480": { "op": "btoi", "defined_out": [ "schedule_page_index#0" @@ -29626,7 +29606,7 @@ "schedule_page_index#0" ] }, - "3498": { + "3481": { "op": "dup", "defined_out": [ "schedule_page_index#0" @@ -29640,7 +29620,7 @@ "schedule_page_index#0" ] }, - "3499": { + "3482": { "op": "txna ApplicationArgs 2", "defined_out": [ "schedule_page_index#0", @@ -29656,7 +29636,7 @@ "tmp%2#0" ] }, - "3502": { + "3485": { "op": "dup", "defined_out": [ "schedule_page_index#0", @@ -29674,7 +29654,7 @@ "tmp%2#0 (copy)" ] }, - "3503": { + "3486": { "op": "len", "defined_out": [ "len%1#0", @@ -29692,7 +29672,7 @@ "len%1#0" ] }, - "3504": { + "3487": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -29712,7 +29692,7 @@ "1" ] }, - "3505": { + "3488": { "op": "==", "defined_out": [ "eq%1#0", @@ -29730,7 +29710,7 @@ "eq%1#0" ] }, - "3506": { + "3489": { "error": "invalid number of bytes for arc4.bool", "op": "assert // invalid number of bytes for arc4.bool", "stack_out": [ @@ -29743,7 +29723,7 @@ "tmp%2#0" ] }, - "3507": { + "3490": { "op": "intc_0 // 0", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -29756,7 +29736,7 @@ "0" ] }, - "3508": { + "3491": { "op": "getbit", "defined_out": [ "is_last_page#0", @@ -29772,7 +29752,7 @@ "is_last_page#0" ] }, - "3509": { + "3492": { "op": "swap", "defined_out": [ "is_last_page#0", @@ -29788,10 +29768,10 @@ "schedule_page_index#0" ] }, - "3510": { + "3493": { "op": "txna ApplicationArgs 3" }, - "3513": { + "3496": { "op": "dup", "defined_out": [ "is_last_page#0", @@ -29810,7 +29790,7 @@ "schedule_page#0" ] }, - "3514": { + "3497": { "op": "cover 2", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -29824,7 +29804,7 @@ "schedule_page#0" ] }, - "3516": { + "3499": { "op": "dup", "defined_out": [ "is_last_page#0", @@ -29845,7 +29825,7 @@ "schedule_page#0 (copy)" ] }, - "3517": { + "3500": { "op": "intc_0 // 0", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -29861,7 +29841,7 @@ "0" ] }, - "3518": { + "3501": { "error": "invalid array length header", "op": "extract_uint16 // on error: invalid array length header", "defined_out": [ @@ -29883,7 +29863,7 @@ "page_length#0" ] }, - "3519": { + "3502": { "op": "dup", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -29899,7 +29879,7 @@ "page_length#0" ] }, - "3520": { + "3503": { "op": "cover 3", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -29915,7 +29895,7 @@ "page_length#0" ] }, - "3522": { + "3505": { "op": "dup", "defined_out": [ "is_last_page#0", @@ -29939,7 +29919,7 @@ "page_length#0 (copy)" ] }, - "3523": { + "3506": { "op": "pushint 65", "defined_out": [ "65", @@ -29965,7 +29945,7 @@ "65" ] }, - "3525": { + "3508": { "op": "*", "defined_out": [ "is_last_page#0", @@ -29989,7 +29969,7 @@ "mul%0#0" ] }, - "3526": { + "3509": { "op": "pushint 2", "defined_out": [ "2", @@ -30015,7 +29995,7 @@ "2" ] }, - "3528": { + "3511": { "op": "+", "defined_out": [ "add%0#0", @@ -30039,7 +30019,7 @@ "add%0#0" ] }, - "3529": { + "3512": { "op": "uncover 2", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -30056,7 +30036,7 @@ "schedule_page#0" ] }, - "3531": { + "3514": { "op": "len", "defined_out": [ "add%0#0", @@ -30081,7 +30061,7 @@ "len%2#0" ] }, - "3532": { + "3515": { "op": "==", "defined_out": [ "eq%2#0", @@ -30104,7 +30084,7 @@ "eq%2#0" ] }, - "3533": { + "3516": { "error": "invalid number of bytes for arc4.dynamic_array", "op": "assert // invalid number of bytes for arc4.dynamic_array", "stack_out": [ @@ -30120,11 +30100,11 @@ "page_length#0" ] }, - "3534": { + "3517": { "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", "op": "callsub _assert_caller_is_arranger" }, - "3537": { + "3520": { "op": "intc_0 // 0", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -30140,7 +30120,7 @@ "0" ] }, - "3538": { + "3521": { "op": "bytec 10 // \"contract_type\"", "defined_out": [ "\"contract_type\"", @@ -30165,7 +30145,7 @@ "\"contract_type\"" ] }, - "3540": { + "3523": { "op": "app_global_get_ex", "defined_out": [ "contract_type#0", @@ -30190,7 +30170,7 @@ "maybe_exists%0#0" ] }, - "3541": { + "3524": { "op": "swap", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -30207,7 +30187,7 @@ "contract_type#0" ] }, - "3542": { + "3525": { "op": "cover 3", "defined_out": [ "contract_type#0", @@ -30232,7 +30212,7 @@ "maybe_exists%0#0" ] }, - "3544": { + "3527": { "error": "check self.contract_type exists", "op": "assert // check self.contract_type exists", "stack_out": [ @@ -30249,7 +30229,7 @@ "page_length#0" ] }, - "3545": { + "3528": { "op": "intc_0 // 0", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -30266,7 +30246,7 @@ "0" ] }, - "3546": { + "3529": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"", @@ -30293,7 +30273,7 @@ "\"status\"" ] }, - "3547": { + "3530": { "op": "app_global_get_ex", "defined_out": [ "contract_type#0", @@ -30320,7 +30300,7 @@ "maybe_exists%0#0" ] }, - "3548": { + "3531": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ @@ -30338,7 +30318,7 @@ "maybe_value%0#1" ] }, - "3549": { + "3532": { "op": "!", "defined_out": [ "contract_type#0", @@ -30363,7 +30343,7 @@ "tmp%0#2" ] }, - "3550": { + "3533": { "error": "D-ASA already configured", "op": "assert // D-ASA already configured", "stack_out": [ @@ -30380,7 +30360,7 @@ "page_length#0" ] }, - "3551": { + "3534": { "op": "dup", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -30397,7 +30377,7 @@ "page_length#0 (copy)" ] }, - "3552": { + "3535": { "op": "pushint 16", "defined_out": [ "16", @@ -30424,7 +30404,7 @@ "16" ] }, - "3554": { + "3537": { "op": "<=", "defined_out": [ "contract_type#0", @@ -30449,7 +30429,7 @@ "tmp%2#1" ] }, - "3555": { + "3538": { "error": "Invalid schedule page", "op": "assert // Invalid schedule page", "stack_out": [ @@ -30466,7 +30446,7 @@ "page_length#0" ] }, - "3556": { + "3539": { "op": "intc_0 // 0", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -30483,7 +30463,7 @@ "0" ] }, - "3557": { + "3540": { "op": "bytec 20 // \"initial_exchange_amount\"", "defined_out": [ "\"initial_exchange_amount\"", @@ -30510,7 +30490,7 @@ "\"initial_exchange_amount\"" ] }, - "3559": { + "3542": { "op": "app_global_get_ex", "defined_out": [ "contract_type#0", @@ -30537,7 +30517,7 @@ "maybe_exists%1#0" ] }, - "3560": { + "3543": { "error": "check self.initial_exchange_amount exists", "op": "assert // check self.initial_exchange_amount exists", "stack_out": [ @@ -30555,7 +30535,7 @@ "maybe_value%1#0" ] }, - "3561": { + "3544": { "error": "D-ASA terms not configured", "op": "assert // D-ASA terms not configured", "stack_out": [ @@ -30572,7 +30552,7 @@ "page_length#0" ] }, - "3562": { + "3545": { "op": "swap", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -30588,7 +30568,7 @@ "schedule_page_index#0" ] }, - "3563": { + "3546": { "op": "pushint 16", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -30605,7 +30585,7 @@ "16" ] }, - "3565": { + "3548": { "op": "*", "defined_out": [ "contract_type#0", @@ -30629,7 +30609,7 @@ "page_cursor#0" ] }, - "3566": { + "3549": { "op": "swap", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -30645,7 +30625,7 @@ "page_length#0" ] }, - "3567": { + "3550": { "op": "pushint 100", "defined_out": [ "100", @@ -30671,7 +30651,7 @@ "100" ] }, - "3569": { + "3552": { "op": "*", "defined_out": [ "contract_type#0", @@ -30696,7 +30676,7 @@ "tmp%6#1" ] }, - "3570": { + "3553": { "op": "intc 4 // 1500", "defined_out": [ "1500", @@ -30723,7 +30703,7 @@ "1500" ] }, - "3572": { + "3555": { "op": "+", "defined_out": [ "contract_type#0", @@ -30748,7 +30728,7 @@ "tmp%7#1" ] }, - "3573": { + "3556": { "op": "intc_0 // 0", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -30765,7 +30745,7 @@ "0" ] }, - "3574": { + "3557": { "callsub": "_puya_lib.util.ensure_budget", "op": "callsub ensure_budget", "stack_out": [ @@ -30781,7 +30761,7 @@ "page_cursor#0" ] }, - "3577": { + "3560": { "op": "intc_0 // 0", "defined_out": [ "contract_type#0", @@ -30806,7 +30786,7 @@ "index#0" ] }, - "3578": { + "3561": { "block": "contract_schedule_while_top@2", "stack_in": [ "aggregate%array_trimmed%0#0", @@ -30840,7 +30820,7 @@ "index#0" ] }, - "3579": { + "3562": { "op": "dig 4", "defined_out": [ "index#0", @@ -30862,7 +30842,7 @@ "page_length#0" ] }, - "3581": { + "3564": { "op": "<", "defined_out": [ "index#0", @@ -30884,7 +30864,7 @@ "tmp%8#0" ] }, - "3582": { + "3565": { "op": "bz contract_schedule_after_while@11", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -30900,7 +30880,7 @@ "index#0" ] }, - "3585": { + "3568": { "op": "dig 4", "defined_out": [ "index#0", @@ -30922,7 +30902,7 @@ "schedule_page#0" ] }, - "3587": { + "3570": { "op": "extract 2 0", "defined_out": [ "aggregate%array_trimmed%0#0", @@ -30945,7 +30925,7 @@ "aggregate%array_trimmed%0#0" ] }, - "3590": { + "3573": { "op": "dup", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -30963,7 +30943,7 @@ "aggregate%array_trimmed%0#0" ] }, - "3591": { + "3574": { "op": "bury 12", "defined_out": [ "aggregate%array_trimmed%0#0", @@ -30986,7 +30966,7 @@ "aggregate%array_trimmed%0#0" ] }, - "3593": { + "3576": { "op": "dig 1", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -31004,7 +30984,7 @@ "index#0" ] }, - "3595": { + "3578": { "op": "dup", "defined_out": [ "aggregate%array_trimmed%0#0", @@ -31030,7 +31010,7 @@ "index#0 (copy)" ] }, - "3596": { + "3579": { "op": "cover 2", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -31049,7 +31029,7 @@ "index#0 (copy)" ] }, - "3598": { + "3581": { "op": "pushint 65", "defined_out": [ "65", @@ -31077,7 +31057,7 @@ "65" ] }, - "3600": { + "3583": { "op": "*", "defined_out": [ "aggregate%array_trimmed%0#0", @@ -31103,7 +31083,7 @@ "aggregate%bytes_offset%0#0" ] }, - "3601": { + "3584": { "op": "pushint 65", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -31123,7 +31103,7 @@ "65" ] }, - "3603": { + "3586": { "error": "index access is out of bounds", "op": "extract3 // on error: index access is out of bounds", "defined_out": [ @@ -31149,7 +31129,7 @@ "aggregate%encoded_element%0#0" ] }, - "3604": { + "3587": { "op": "dup", "defined_out": [ "aggregate%array_trimmed%0#0", @@ -31176,7 +31156,7 @@ "aggregate%encoded_element%0#0 (copy)" ] }, - "3605": { + "3588": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -31205,7 +31185,7 @@ "8" ] }, - "3606": { + "3589": { "op": "getbyte", "defined_out": [ "aggregate%array_trimmed%0#0", @@ -31232,7 +31212,7 @@ "entry_event_type#0" ] }, - "3607": { + "3590": { "op": "dup", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -31252,7 +31232,7 @@ "entry_event_type#0 (copy)" ] }, - "3608": { + "3591": { "op": "cover 2", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -31272,7 +31252,7 @@ "entry_event_type#0" ] }, - "3610": { + "3593": { "op": "bury 13", "defined_out": [ "aggregate%array_trimmed%0#0", @@ -31299,7 +31279,7 @@ "aggregate%encoded_element%0#0" ] }, - "3612": { + "3595": { "op": "dup", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -31319,7 +31299,7 @@ "aggregate%encoded_element%0#0 (copy)" ] }, - "3613": { + "3596": { "op": "intc_0 // 0", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -31340,7 +31320,7 @@ "0" ] }, - "3614": { + "3597": { "op": "extract_uint64", "defined_out": [ "aggregate%array_trimmed%0#0", @@ -31369,7 +31349,7 @@ "values%0#0" ] }, - "3615": { + "3598": { "op": "dup", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -31390,7 +31370,7 @@ "values%0#0" ] }, - "3616": { + "3599": { "op": "bury 13", "defined_out": [ "aggregate%array_trimmed%0#0", @@ -31419,7 +31399,7 @@ "values%0#0" ] }, - "3618": { + "3601": { "op": "dig 5", "defined_out": [ "aggregate%array_trimmed%0#0", @@ -31450,7 +31430,7 @@ "page_cursor#0" ] }, - "3620": { + "3603": { "op": "uncover 4", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -31471,7 +31451,7 @@ "index#0" ] }, - "3622": { + "3605": { "op": "+", "defined_out": [ "aggregate%array_trimmed%0#0", @@ -31502,7 +31482,7 @@ "tmp%10#0" ] }, - "3623": { + "3606": { "op": "dig 1", "defined_out": [ "aggregate%array_trimmed%0#0", @@ -31535,7 +31515,7 @@ "values%0#0 (copy)" ] }, - "3625": { + "3608": { "op": "==", "defined_out": [ "aggregate%array_trimmed%0#0", @@ -31566,7 +31546,7 @@ "tmp%11#0" ] }, - "3626": { + "3609": { "error": "Invalid event id", "op": "assert // Invalid event id", "stack_out": [ @@ -31586,7 +31566,7 @@ "values%0#0" ] }, - "3627": { + "3610": { "op": "dig 5", "defined_out": [ "aggregate%array_trimmed%0#0", @@ -31617,7 +31597,7 @@ "contract_type#0" ] }, - "3629": { + "3612": { "op": "uncover 3", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -31637,7 +31617,7 @@ "entry_event_type#0" ] }, - "3631": { + "3614": { "callsub": "modules.actus_kernel.ActusKernelModule._assert_event_allowed_for_contract_type", "op": "callsub _assert_event_allowed_for_contract_type", "stack_out": [ @@ -31656,7 +31636,7 @@ "values%0#0" ] }, - "3634": { + "3617": { "op": "swap", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -31674,7 +31654,7 @@ "aggregate%encoded_element%0#0" ] }, - "3635": { + "3618": { "op": "pushint 9", "defined_out": [ "9", @@ -31705,7 +31685,7 @@ "9" ] }, - "3637": { + "3620": { "op": "extract_uint64", "defined_out": [ "aggregate%array_trimmed%0#0", @@ -31734,7 +31714,7 @@ "values%1#0" ] }, - "3638": { + "3621": { "op": "dup", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -31753,7 +31733,7 @@ "values%1#0" ] }, - "3639": { + "3622": { "op": "bury 10", "defined_out": [ "aggregate%array_trimmed%0#0", @@ -31782,7 +31762,7 @@ "values%1#0" ] }, - "3641": { + "3624": { "error": "Invalid ACTUS configuration", "op": "assert // Invalid ACTUS configuration", "stack_out": [ @@ -31800,7 +31780,7 @@ "values%0#0" ] }, - "3642": { + "3625": { "op": "bz contract_schedule_after_if_else@8", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -31816,7 +31796,7 @@ "index#0" ] }, - "3645": { + "3628": { "op": "dup", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -31833,7 +31813,7 @@ "index#0" ] }, - "3646": { + "3629": { "op": "bz contract_schedule_else_body@6", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -31849,7 +31829,7 @@ "index#0" ] }, - "3649": { + "3632": { "op": "dup", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -31866,7 +31846,7 @@ "index#0" ] }, - "3650": { + "3633": { "op": "intc_1 // 1", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -31884,7 +31864,7 @@ "1" ] }, - "3651": { + "3634": { "op": "-", "defined_out": [ "aggregate%array_trimmed%0#0", @@ -31913,7 +31893,7 @@ "tmp%15#0" ] }, - "3652": { + "3635": { "op": "pushint 65", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -31931,7 +31911,7 @@ "65" ] }, - "3654": { + "3637": { "op": "*", "defined_out": [ "aggregate%array_trimmed%0#0", @@ -31960,7 +31940,7 @@ "aggregate%bytes_offset%3#0" ] }, - "3655": { + "3638": { "op": "dig 11", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -31978,7 +31958,7 @@ "aggregate%array_trimmed%0#0" ] }, - "3657": { + "3640": { "op": "swap", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -31996,7 +31976,7 @@ "aggregate%bytes_offset%3#0" ] }, - "3658": { + "3641": { "op": "pushint 65", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -32015,7 +31995,7 @@ "65" ] }, - "3660": { + "3643": { "error": "index access is out of bounds", "op": "extract3 // on error: index access is out of bounds", "defined_out": [ @@ -32045,7 +32025,7 @@ "previous_entry#0" ] }, - "3661": { + "3644": { "block": "contract_schedule_after_if_else@7", "stack_in": [ "aggregate%array_trimmed%0#0", @@ -32082,7 +32062,7 @@ "9" ] }, - "3663": { + "3646": { "op": "extract_uint64", "defined_out": [ "values%3#0" @@ -32102,7 +32082,7 @@ "values%3#0" ] }, - "3664": { + "3647": { "op": "dig 8", "defined_out": [ "values%1#0", @@ -32124,7 +32104,7 @@ "values%1#0" ] }, - "3666": { + "3649": { "op": "<=", "defined_out": [ "tmp%22#0", @@ -32145,7 +32125,7 @@ "tmp%22#0" ] }, - "3667": { + "3650": { "error": "Time events must be sorted in strictly ascending order", "op": "assert // Time events must be sorted in strictly ascending order", "stack_out": [ @@ -32162,7 +32142,7 @@ "index#0" ] }, - "3668": { + "3651": { "block": "contract_schedule_after_if_else@8", "stack_in": [ "aggregate%array_trimmed%0#0", @@ -32196,7 +32176,7 @@ "values%0#0" ] }, - "3670": { + "3653": { "op": "bnz contract_schedule_after_if_else@10", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -32212,7 +32192,7 @@ "index#0" ] }, - "3673": { + "3656": { "op": "dig 9", "defined_out": [ "entry_event_type#0", @@ -32233,7 +32213,7 @@ "entry_event_type#0" ] }, - "3675": { + "3658": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -32256,7 +32236,7 @@ "1" ] }, - "3676": { + "3659": { "op": "==", "defined_out": [ "entry_event_type#0", @@ -32278,7 +32258,7 @@ "tmp%24#0" ] }, - "3677": { + "3660": { "error": "Invalid ACTUS configuration", "op": "assert // Invalid ACTUS configuration", "stack_out": [ @@ -32295,7 +32275,7 @@ "index#0" ] }, - "3678": { + "3661": { "block": "contract_schedule_after_if_else@10", "stack_in": [ "aggregate%array_trimmed%0#0", @@ -32329,7 +32309,7 @@ "index#0" ] }, - "3679": { + "3662": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -32351,7 +32331,7 @@ "1" ] }, - "3680": { + "3663": { "op": "+", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -32368,7 +32348,7 @@ "index#0" ] }, - "3681": { + "3664": { "op": "bury 1", "defined_out": [ "index#0" @@ -32387,10 +32367,10 @@ "index#0" ] }, - "3683": { + "3666": { "op": "b contract_schedule_while_top@2" }, - "3686": { + "3669": { "block": "contract_schedule_else_body@6", "stack_in": [ "aggregate%array_trimmed%0#0", @@ -32424,7 +32404,7 @@ "schedule_page_index#0" ] }, - "3688": { + "3671": { "op": "dup", "defined_out": [ "schedule_page_index#0", @@ -32446,7 +32426,7 @@ "schedule_page_index#0 (copy)" ] }, - "3689": { + "3672": { "error": "Invalid event id", "op": "assert // Invalid event id", "stack_out": [ @@ -32464,7 +32444,7 @@ "schedule_page_index#0" ] }, - "3690": { + "3673": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -32486,7 +32466,7 @@ "1" ] }, - "3691": { + "3674": { "op": "-", "defined_out": [ "previous_page_index#0", @@ -32507,7 +32487,7 @@ "previous_page_index#0" ] }, - "3692": { + "3675": { "op": "itob", "defined_out": [ "encoded_value%0#0", @@ -32528,7 +32508,7 @@ "encoded_value%0#0" ] }, - "3693": { + "3676": { "op": "bytec 24 // 0x5323", "defined_out": [ "0x5323", @@ -32551,7 +32531,7 @@ "0x5323" ] }, - "3695": { + "3678": { "op": "swap", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -32569,7 +32549,7 @@ "encoded_value%0#0" ] }, - "3696": { + "3679": { "op": "concat", "defined_out": [ "box_prefixed_key%0#0", @@ -32590,7 +32570,7 @@ "box_prefixed_key%0#0" ] }, - "3697": { + "3680": { "op": "dup", "defined_out": [ "box_prefixed_key%0#0", @@ -32613,7 +32593,7 @@ "box_prefixed_key%0#0 (copy)" ] }, - "3698": { + "3681": { "op": "box_len", "defined_out": [ "_%0#0", @@ -32638,7 +32618,7 @@ "maybe_exists%2#0" ] }, - "3699": { + "3682": { "op": "bury 1", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -32656,7 +32636,7 @@ "maybe_exists%2#0" ] }, - "3701": { + "3684": { "error": "Invalid schedule page", "op": "assert // Invalid schedule page", "stack_out": [ @@ -32674,7 +32654,7 @@ "box_prefixed_key%0#0" ] }, - "3702": { + "3685": { "op": "dup", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -32692,7 +32672,7 @@ "box_prefixed_key%0#0 (copy)" ] }, - "3703": { + "3686": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -32717,7 +32697,7 @@ "0" ] }, - "3704": { + "3687": { "op": "pushint 2", "defined_out": [ "0", @@ -32744,7 +32724,7 @@ "2" ] }, - "3706": { + "3689": { "op": "box_extract", "defined_out": [ "box%box_extract%0#0", @@ -32767,7 +32747,7 @@ "box%box_extract%0#0" ] }, - "3707": { + "3690": { "op": "btoi", "defined_out": [ "box%array_length%0#0", @@ -32790,7 +32770,7 @@ "box%array_length%0#0" ] }, - "3708": { + "3691": { "op": "dup", "defined_out": [ "box%array_length%0#0", @@ -32815,7 +32795,7 @@ "box%array_length%0#0 (copy)" ] }, - "3709": { + "3692": { "error": "Invalid schedule page", "op": "assert // Invalid schedule page", "stack_out": [ @@ -32834,7 +32814,7 @@ "box%array_length%0#0" ] }, - "3710": { + "3693": { "op": "intc_1 // 1", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -32853,7 +32833,7 @@ "1" ] }, - "3711": { + "3694": { "op": "-", "defined_out": [ "box_prefixed_key%0#0", @@ -32876,7 +32856,7 @@ "tmp%21#0" ] }, - "3712": { + "3695": { "op": "pushint 65", "defined_out": [ "65", @@ -32901,7 +32881,7 @@ "65" ] }, - "3714": { + "3697": { "op": "*", "defined_out": [ "box%element_offset%0#0", @@ -32924,7 +32904,7 @@ "box%element_offset%0#0" ] }, - "3715": { + "3698": { "op": "pushint 2", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -32943,7 +32923,7 @@ "2" ] }, - "3717": { + "3700": { "op": "+", "defined_out": [ "box%offset%0#0", @@ -32966,7 +32946,7 @@ "box%offset%0#0" ] }, - "3718": { + "3701": { "op": "pushint 65", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -32985,7 +32965,7 @@ "65" ] }, - "3720": { + "3703": { "op": "box_extract", "defined_out": [ "previous_entry#0", @@ -33006,10 +32986,10 @@ "previous_entry#0" ] }, - "3721": { + "3704": { "op": "b contract_schedule_after_if_else@7" }, - "3724": { + "3707": { "block": "contract_schedule_after_while@11", "stack_in": [ "aggregate%array_trimmed%0#0", @@ -33043,7 +33023,7 @@ "schedule_page_index#0" ] }, - "3726": { + "3709": { "op": "itob", "defined_out": [ "encoded_value%0#0", @@ -33064,7 +33044,7 @@ "encoded_value%0#0" ] }, - "3727": { + "3710": { "op": "bytec 24 // 0x5323", "defined_out": [ "0x5323", @@ -33087,7 +33067,7 @@ "0x5323" ] }, - "3729": { + "3712": { "op": "swap", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -33105,7 +33085,7 @@ "encoded_value%0#0" ] }, - "3730": { + "3713": { "op": "concat", "defined_out": [ "box_prefixed_key%0#0", @@ -33126,7 +33106,7 @@ "box_prefixed_key%0#0" ] }, - "3731": { + "3714": { "op": "dup", "defined_out": [ "box_prefixed_key%0#0", @@ -33149,7 +33129,7 @@ "box_prefixed_key%0#0 (copy)" ] }, - "3732": { + "3715": { "op": "box_del", "defined_out": [ "box_prefixed_key%0#0", @@ -33172,7 +33152,7 @@ "{box_del}" ] }, - "3733": { + "3716": { "op": "pop", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -33189,7 +33169,7 @@ "box_prefixed_key%0#0" ] }, - "3734": { + "3717": { "op": "dig 5", "defined_out": [ "box_prefixed_key%0#0", @@ -33212,7 +33192,7 @@ "schedule_page#0" ] }, - "3736": { + "3719": { "op": "box_put", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -33228,7 +33208,7 @@ "index#0" ] }, - "3737": { + "3720": { "op": "dig 5", "defined_out": [ "is_last_page#0", @@ -33250,7 +33230,7 @@ "is_last_page#0" ] }, - "3739": { + "3722": { "op": "bz contract_schedule_after_if_else@13", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -33266,7 +33246,7 @@ "index#0" ] }, - "3742": { + "3725": { "op": "dig 1", "defined_out": [ "is_last_page#0", @@ -33289,7 +33269,7 @@ "page_cursor#0" ] }, - "3744": { + "3727": { "op": "dig 4", "defined_out": [ "is_last_page#0", @@ -33314,7 +33294,7 @@ "page_length#0" ] }, - "3746": { + "3729": { "op": "+", "defined_out": [ "is_last_page#0", @@ -33339,7 +33319,7 @@ "tmp%27#0" ] }, - "3747": { + "3730": { "op": "bytec_3 // \"schedule_entry_count\"", "defined_out": [ "\"schedule_entry_count\"", @@ -33366,7 +33346,7 @@ "\"schedule_entry_count\"" ] }, - "3748": { + "3731": { "op": "swap", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -33384,7 +33364,7 @@ "tmp%27#0" ] }, - "3749": { + "3732": { "op": "app_global_put", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -33400,7 +33380,7 @@ "index#0" ] }, - "3750": { + "3733": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"", @@ -33425,7 +33405,7 @@ "\"status\"" ] }, - "3751": { + "3734": { "op": "pushint 50", "defined_out": [ "\"status\"", @@ -33452,7 +33432,7 @@ "50" ] }, - "3753": { + "3736": { "op": "app_global_put", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -33468,7 +33448,7 @@ "index#0" ] }, - "3754": { + "3737": { "block": "contract_schedule_after_if_else@13", "stack_in": [ "aggregate%array_trimmed%0#0", @@ -33502,7 +33482,7 @@ "tmp%0#1" ] }, - "3756": { + "3739": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0" @@ -33522,7 +33502,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "3757": { + "3740": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -33544,7 +33524,7 @@ "0x151f7c75" ] }, - "3758": { + "3741": { "op": "swap", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -33562,7 +33542,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "3759": { + "3742": { "op": "concat", "defined_out": [ "tmp%7#0" @@ -33582,7 +33562,7 @@ "tmp%7#0" ] }, - "3760": { + "3743": { "op": "log", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -33598,7 +33578,7 @@ "index#0" ] }, - "3761": { + "3744": { "op": "intc_1 // 1", "defined_out": [ "1" @@ -33618,7 +33598,7 @@ "1" ] }, - "3762": { + "3745": { "op": "return", "stack_out": [ "aggregate%array_trimmed%0#0", @@ -33634,7 +33614,7 @@ "index#0" ] }, - "3763": { + "3746": { "subroutine": "modules.actus_kernel.ActusKernelModule.contract_execute_ied[routing]", "params": {}, "block": "contract_execute_ied", @@ -33647,7 +33627,7 @@ "0" ] }, - "3764": { + "3747": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"", @@ -33658,7 +33638,7 @@ "\"status\"" ] }, - "3765": { + "3748": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -33669,37 +33649,37 @@ "maybe_exists%0#0" ] }, - "3766": { + "3749": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ "maybe_value%0#0" ] }, - "3767": { + "3750": { "error": "D-ASA not configured", "op": "assert // D-ASA not configured", "stack_out": [] }, - "3768": { + "3751": { "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", "op": "callsub _assert_caller_is_arranger" }, - "3771": { + "3754": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", "op": "callsub _assert_is_not_asset_defaulted" }, - "3774": { + "3757": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_suspended", "op": "callsub _assert_is_not_asset_suspended" }, - "3777": { + "3760": { "op": "intc_0 // 0", "stack_out": [ "0" ] }, - "3778": { + "3761": { "op": "bytec_2 // \"event_cursor\"", "defined_out": [ "\"event_cursor\"", @@ -33710,28 +33690,28 @@ "\"event_cursor\"" ] }, - "3779": { + "3762": { "op": "app_global_get_ex", "stack_out": [ "maybe_value%0#0", "maybe_exists%0#0" ] }, - "3780": { + "3763": { "error": "check self.event_cursor exists", "op": "assert // check self.event_cursor exists", "stack_out": [ "maybe_value%0#0" ] }, - "3781": { + "3764": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#0", "0" ] }, - "3782": { + "3765": { "op": "bytec_3 // \"schedule_entry_count\"", "defined_out": [ "\"schedule_entry_count\"", @@ -33744,7 +33724,7 @@ "\"schedule_entry_count\"" ] }, - "3783": { + "3766": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%1#0", @@ -33757,7 +33737,7 @@ "maybe_exists%1#0" ] }, - "3784": { + "3767": { "error": "check self.schedule_entry_count exists", "op": "assert // check self.schedule_entry_count exists", "stack_out": [ @@ -33765,7 +33745,7 @@ "maybe_value%1#0" ] }, - "3785": { + "3768": { "op": "dig 1", "defined_out": [ "maybe_value%0#0", @@ -33778,7 +33758,7 @@ "maybe_value%0#0 (copy)" ] }, - "3787": { + "3770": { "op": ">", "defined_out": [ "maybe_value%0#0", @@ -33789,14 +33769,14 @@ "tmp%0#1" ] }, - "3788": { + "3771": { "error": "Invalid event cursor", "op": "assert // Invalid event cursor", "stack_out": [ "maybe_value%0#0" ] }, - "3789": { + "3772": { "callsub": "modules.actus_kernel.ActusKernelModule._get_schedule_entry", "op": "callsub _get_schedule_entry", "defined_out": [ @@ -33806,7 +33786,7 @@ "entry#0" ] }, - "3792": { + "3775": { "op": "dup", "defined_out": [ "entry#0", @@ -33817,7 +33797,7 @@ "entry#0 (copy)" ] }, - "3793": { + "3776": { "op": "extract 8 1", "defined_out": [ "aggregate%extract%0#0", @@ -33828,7 +33808,7 @@ "aggregate%extract%0#0" ] }, - "3796": { + "3779": { "op": "dup", "defined_out": [ "aggregate%extract%0#0", @@ -33841,7 +33821,7 @@ "aggregate%extract%0#0 (copy)" ] }, - "3797": { + "3780": { "op": "pushbytes 0x01", "defined_out": [ "0x01", @@ -33856,7 +33836,7 @@ "0x01" ] }, - "3800": { + "3783": { "op": "b==", "defined_out": [ "aggregate%extract%0#0", @@ -33869,7 +33849,7 @@ "tmp%2#1" ] }, - "3801": { + "3784": { "error": "Invalid event type", "op": "assert // Invalid event type", "stack_out": [ @@ -33877,7 +33857,7 @@ "aggregate%extract%0#0" ] }, - "3802": { + "3785": { "op": "dig 1", "stack_out": [ "entry#0", @@ -33885,7 +33865,7 @@ "entry#0 (copy)" ] }, - "3804": { + "3787": { "op": "extract 0 8", "defined_out": [ "aggregate%extract%0#0", @@ -33898,7 +33878,7 @@ "aggregate%extract%1#0" ] }, - "3807": { + "3790": { "op": "dig 2", "stack_out": [ "entry#0", @@ -33907,7 +33887,7 @@ "entry#0 (copy)" ] }, - "3809": { + "3792": { "op": "extract 9 8", "defined_out": [ "aggregate%extract%0#0", @@ -33922,7 +33902,7 @@ "aggregate%extract%2#0" ] }, - "3812": { + "3795": { "op": "dig 3", "stack_out": [ "entry#0", @@ -33932,7 +33912,7 @@ "entry#0 (copy)" ] }, - "3814": { + "3797": { "op": "extract 17 8", "defined_out": [ "aggregate%extract%0#0", @@ -33949,7 +33929,7 @@ "aggregate%extract%3#0" ] }, - "3817": { + "3800": { "op": "dig 4", "stack_out": [ "entry#0", @@ -33960,7 +33940,7 @@ "entry#0 (copy)" ] }, - "3819": { + "3802": { "op": "extract 25 8", "defined_out": [ "aggregate%extract%0#0", @@ -33979,7 +33959,7 @@ "aggregate%extract%4#0" ] }, - "3822": { + "3805": { "op": "dig 5", "stack_out": [ "entry#0", @@ -33991,7 +33971,7 @@ "entry#0 (copy)" ] }, - "3824": { + "3807": { "op": "extract 33 8", "defined_out": [ "aggregate%extract%0#0", @@ -34012,7 +33992,7 @@ "aggregate%extract%5#0" ] }, - "3827": { + "3810": { "op": "dig 6", "stack_out": [ "entry#0", @@ -34025,7 +34005,7 @@ "entry#0 (copy)" ] }, - "3829": { + "3812": { "op": "extract 41 8", "defined_out": [ "aggregate%extract%0#0", @@ -34048,7 +34028,7 @@ "aggregate%extract%6#0" ] }, - "3832": { + "3815": { "op": "dig 7", "stack_out": [ "entry#0", @@ -34062,7 +34042,7 @@ "entry#0 (copy)" ] }, - "3834": { + "3817": { "op": "extract 49 8", "defined_out": [ "aggregate%extract%0#0", @@ -34087,7 +34067,7 @@ "aggregate%extract%7#0" ] }, - "3837": { + "3820": { "op": "dig 8", "stack_out": [ "entry#0", @@ -34102,7 +34082,7 @@ "entry#0 (copy)" ] }, - "3839": { + "3822": { "op": "extract 57 8", "defined_out": [ "aggregate%extract%0#0", @@ -34129,7 +34109,7 @@ "aggregate%extract%8#0" ] }, - "3842": { + "3825": { "op": "uncover 7", "stack_out": [ "entry#0", @@ -34144,7 +34124,7 @@ "aggregate%extract%1#0" ] }, - "3844": { + "3827": { "op": "uncover 8", "stack_out": [ "entry#0", @@ -34159,7 +34139,7 @@ "aggregate%extract%0#0" ] }, - "3846": { + "3829": { "op": "concat", "defined_out": [ "aggregate%extract%2#0", @@ -34184,7 +34164,7 @@ "aggregate%head%1#0" ] }, - "3847": { + "3830": { "op": "uncover 7", "stack_out": [ "entry#0", @@ -34198,7 +34178,7 @@ "aggregate%extract%2#0" ] }, - "3849": { + "3832": { "op": "concat", "defined_out": [ "aggregate%extract%3#0", @@ -34221,7 +34201,7 @@ "aggregate%head%2#0" ] }, - "3850": { + "3833": { "op": "uncover 6", "stack_out": [ "entry#0", @@ -34234,7 +34214,7 @@ "aggregate%extract%3#0" ] }, - "3852": { + "3835": { "op": "concat", "defined_out": [ "aggregate%extract%4#0", @@ -34255,7 +34235,7 @@ "aggregate%head%3#0" ] }, - "3853": { + "3836": { "op": "uncover 5", "stack_out": [ "entry#0", @@ -34267,7 +34247,7 @@ "aggregate%extract%4#0" ] }, - "3855": { + "3838": { "op": "concat", "defined_out": [ "aggregate%extract%5#0", @@ -34286,7 +34266,7 @@ "aggregate%head%4#0" ] }, - "3856": { + "3839": { "op": "intc_0 // 0", "stack_out": [ "entry#0", @@ -34298,7 +34278,7 @@ "0" ] }, - "3857": { + "3840": { "op": "itob", "defined_out": [ "aggregate%extract%5#0", @@ -34319,7 +34299,7 @@ "aggregate%val_as_bytes%4#0" ] }, - "3858": { + "3841": { "op": "concat", "defined_out": [ "aggregate%extract%5#0", @@ -34338,7 +34318,7 @@ "aggregate%head%5#0" ] }, - "3859": { + "3842": { "op": "uncover 4", "stack_out": [ "entry#0", @@ -34349,7 +34329,7 @@ "aggregate%extract%5#0" ] }, - "3861": { + "3844": { "op": "concat", "defined_out": [ "aggregate%extract%6#0", @@ -34366,7 +34346,7 @@ "aggregate%head%6#0" ] }, - "3862": { + "3845": { "op": "uncover 3", "stack_out": [ "entry#0", @@ -34376,7 +34356,7 @@ "aggregate%extract%6#0" ] }, - "3864": { + "3847": { "op": "concat", "defined_out": [ "aggregate%extract%7#0", @@ -34391,7 +34371,7 @@ "aggregate%head%7#0" ] }, - "3865": { + "3848": { "op": "uncover 2", "stack_out": [ "entry#0", @@ -34400,7 +34380,7 @@ "aggregate%extract%7#0" ] }, - "3867": { + "3850": { "op": "concat", "defined_out": [ "aggregate%extract%8#0", @@ -34413,7 +34393,7 @@ "aggregate%head%8#0" ] }, - "3868": { + "3851": { "op": "swap", "stack_out": [ "entry#0", @@ -34421,7 +34401,7 @@ "aggregate%extract%8#0" ] }, - "3869": { + "3852": { "op": "concat", "defined_out": [ "aggregate%head%9#0", @@ -34432,7 +34412,7 @@ "aggregate%head%9#0" ] }, - "3870": { + "3853": { "callsub": "modules.actus_kernel.ActusKernelModule._apply_non_cash_schedule_entry", "op": "callsub _apply_non_cash_schedule_entry", "defined_out": [ @@ -34444,11 +34424,11 @@ "_apply_non_cash_schedule_entry%1#0" ] }, - "3873": { + "3856": { "op": "popn 2", "stack_out": [] }, - "3875": { + "3858": { "op": "global LatestTimestamp", "defined_out": [ "tmp%4#0" @@ -34457,7 +34437,7 @@ "tmp%4#0" ] }, - "3877": { + "3860": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%9#0" @@ -34466,7 +34446,7 @@ "aggregate%val_as_bytes%9#0" ] }, - "3878": { + "3861": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -34477,14 +34457,14 @@ "0x151f7c75" ] }, - "3879": { + "3862": { "op": "swap", "stack_out": [ "0x151f7c75", "aggregate%val_as_bytes%9#0" ] }, - "3880": { + "3863": { "op": "concat", "defined_out": [ "tmp%2#0" @@ -34493,11 +34473,11 @@ "tmp%2#0" ] }, - "3881": { + "3864": { "op": "log", "stack_out": [] }, - "3882": { + "3865": { "op": "intc_1 // 1", "defined_out": [ "1" @@ -34506,11 +34486,11 @@ "1" ] }, - "3883": { + "3866": { "op": "return", "stack_out": [] }, - "3884": { + "3867": { "subroutine": "modules.actus_kernel.ActusKernelModule.apply_non_cash_event[routing]", "params": {}, "block": "apply_non_cash_event", @@ -34520,7 +34500,7 @@ "aggregate%extract%2#0" ] }, - "3885": { + "3868": { "op": "dupn 4", "stack_out": [ "aggregate%extract%2#0", @@ -34530,7 +34510,7 @@ "page#0" ] }, - "3887": { + "3870": { "op": "pushbytes \"\"", "stack_out": [ "aggregate%extract%2#0", @@ -34541,7 +34521,7 @@ "event_type#0" ] }, - "3889": { + "3872": { "op": "dup", "stack_out": [ "aggregate%extract%2#0", @@ -34553,7 +34533,7 @@ "values%0#1" ] }, - "3890": { + "3873": { "op": "txna ApplicationArgs 1", "defined_out": [ "tmp%0#0" @@ -34569,7 +34549,7 @@ "tmp%0#0" ] }, - "3893": { + "3876": { "op": "dup", "defined_out": [ "tmp%0#0", @@ -34587,7 +34567,7 @@ "tmp%0#0 (copy)" ] }, - "3894": { + "3877": { "op": "len", "defined_out": [ "len%0#0", @@ -34605,7 +34585,7 @@ "len%0#0" ] }, - "3895": { + "3878": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -34625,7 +34605,7 @@ "8" ] }, - "3896": { + "3879": { "op": "==", "defined_out": [ "eq%0#0", @@ -34643,7 +34623,7 @@ "eq%0#0" ] }, - "3897": { + "3880": { "error": "invalid number of bytes for arc4.uint64", "op": "assert // invalid number of bytes for arc4.uint64", "stack_out": [ @@ -34657,7 +34637,7 @@ "tmp%0#0" ] }, - "3898": { + "3881": { "op": "btoi", "defined_out": [ "event_id#0" @@ -34673,10 +34653,10 @@ "event_id#0" ] }, - "3899": { + "3882": { "op": "txna ApplicationArgs 2" }, - "3902": { + "3885": { "op": "dupn 2", "defined_out": [ "event_id#0", @@ -34697,7 +34677,7 @@ "payload#0 (copy)" ] }, - "3904": { + "3887": { "op": "len", "defined_out": [ "event_id#0", @@ -34718,7 +34698,7 @@ "len%1#0" ] }, - "3905": { + "3888": { "op": "pushint 73", "defined_out": [ "73", @@ -34741,7 +34721,7 @@ "73" ] }, - "3907": { + "3890": { "op": "==", "defined_out": [ "eq%1#0", @@ -34762,7 +34742,7 @@ "eq%1#0" ] }, - "3908": { + "3891": { "error": "invalid number of bytes for smart_contracts.abi_types.ObservedEventRequest", "op": "assert // invalid number of bytes for smart_contracts.abi_types.ObservedEventRequest", "stack_out": [ @@ -34778,7 +34758,7 @@ "payload#0" ] }, - "3909": { + "3892": { "op": "intc_0 // 0", "stack_out": [ "aggregate%extract%2#0", @@ -34794,7 +34774,7 @@ "0" ] }, - "3910": { + "3893": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"", @@ -34817,7 +34797,7 @@ "\"status\"" ] }, - "3911": { + "3894": { "op": "app_global_get_ex", "defined_out": [ "event_id#0", @@ -34840,7 +34820,7 @@ "maybe_exists%0#0" ] }, - "3912": { + "3895": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ @@ -34857,7 +34837,7 @@ "maybe_value%0#0" ] }, - "3913": { + "3896": { "error": "D-ASA not configured", "op": "assert // D-ASA not configured", "stack_out": [ @@ -34873,15 +34853,15 @@ "payload#0" ] }, - "3914": { + "3897": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", "op": "callsub _assert_is_not_asset_defaulted" }, - "3917": { + "3900": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_suspended", "op": "callsub _assert_is_not_asset_suspended" }, - "3920": { + "3903": { "op": "pushint 65", "defined_out": [ "65", @@ -34902,7 +34882,7 @@ "65" ] }, - "3922": { + "3905": { "op": "extract_uint64", "defined_out": [ "event_id#0", @@ -34922,7 +34902,7 @@ "values%0#0" ] }, - "3923": { + "3906": { "op": "dup", "defined_out": [ "event_id#0", @@ -34943,7 +34923,7 @@ "values%0#0" ] }, - "3924": { + "3907": { "op": "pushint 4", "defined_out": [ "4", @@ -34966,7 +34946,7 @@ "4" ] }, - "3926": { + "3909": { "op": "&", "defined_out": [ "event_id#0", @@ -34988,7 +34968,7 @@ "tmp%0#1" ] }, - "3927": { + "3910": { "op": "bz apply_non_cash_event_after_if_else@3", "stack_out": [ "aggregate%extract%2#0", @@ -35003,7 +34983,7 @@ "values%0#0" ] }, - "3930": { + "3913": { "op": "intc_0 // 0", "stack_out": [ "aggregate%extract%2#0", @@ -35019,7 +34999,7 @@ "0" ] }, - "3931": { + "3914": { "op": "bytec 10 // \"contract_type\"", "defined_out": [ "\"contract_type\"", @@ -35043,7 +35023,7 @@ "\"contract_type\"" ] }, - "3933": { + "3916": { "op": "app_global_get_ex", "stack_out": [ "aggregate%extract%2#0", @@ -35060,7 +35040,7 @@ "maybe_exists%0#0" ] }, - "3934": { + "3917": { "error": "check self.contract_type exists", "op": "assert // check self.contract_type exists", "stack_out": [ @@ -35077,7 +35057,7 @@ "maybe_value%0#0" ] }, - "3935": { + "3918": { "op": "pushint 5", "defined_out": [ "5", @@ -35101,7 +35081,7 @@ "5" ] }, - "3937": { + "3920": { "op": "==", "defined_out": [ "event_id#0", @@ -35123,7 +35103,7 @@ "tmp%0#3" ] }, - "3938": { + "3921": { "error": "Observed event required to execute this action", "op": "assert // Observed event required to execute this action", "stack_out": [ @@ -35139,11 +35119,11 @@ "values%0#0" ] }, - "3939": { + "3922": { "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", "op": "callsub _assert_caller_is_arranger" }, - "3942": { + "3925": { "op": "intc_0 // 0", "stack_out": [ "aggregate%extract%2#0", @@ -35159,7 +35139,7 @@ "0" ] }, - "3943": { + "3926": { "op": "bytec 10 // \"contract_type\"", "stack_out": [ "aggregate%extract%2#0", @@ -35176,7 +35156,7 @@ "\"contract_type\"" ] }, - "3945": { + "3928": { "op": "app_global_get_ex", "stack_out": [ "aggregate%extract%2#0", @@ -35193,7 +35173,7 @@ "maybe_exists%0#0" ] }, - "3946": { + "3929": { "error": "check self.contract_type exists", "op": "assert // check self.contract_type exists", "stack_out": [ @@ -35210,7 +35190,7 @@ "maybe_value%0#0" ] }, - "3947": { + "3930": { "op": "dup", "defined_out": [ "event_id#0", @@ -35234,7 +35214,7 @@ "maybe_value%0#0 (copy)" ] }, - "3948": { + "3931": { "op": "pushint 5", "stack_out": [ "aggregate%extract%2#0", @@ -35252,7 +35232,7 @@ "5" ] }, - "3950": { + "3933": { "op": "==", "stack_out": [ "aggregate%extract%2#0", @@ -35269,7 +35249,7 @@ "tmp%0#3" ] }, - "3951": { + "3934": { "error": "Observed event required to execute this action", "op": "assert // Observed event required to execute this action", "stack_out": [ @@ -35286,7 +35266,7 @@ "maybe_value%0#0" ] }, - "3952": { + "3935": { "op": "dig 2", "stack_out": [ "aggregate%extract%2#0", @@ -35303,7 +35283,7 @@ "payload#0" ] }, - "3954": { + "3937": { "op": "dup", "stack_out": [ "aggregate%extract%2#0", @@ -35321,7 +35301,7 @@ "payload#0 (copy)" ] }, - "3955": { + "3938": { "op": "intc_0 // 0", "stack_out": [ "aggregate%extract%2#0", @@ -35340,7 +35320,7 @@ "0" ] }, - "3956": { + "3939": { "op": "extract_uint64", "defined_out": [ "event_id#0", @@ -35365,7 +35345,7 @@ "values%0#1" ] }, - "3957": { + "3940": { "op": "dup", "stack_out": [ "aggregate%extract%2#0", @@ -35384,7 +35364,7 @@ "values%0#1" ] }, - "3958": { + "3941": { "op": "bury 7", "defined_out": [ "event_id#0", @@ -35409,7 +35389,7 @@ "values%0#1" ] }, - "3960": { + "3943": { "op": "intc_0 // 0", "stack_out": [ "aggregate%extract%2#0", @@ -35428,7 +35408,7 @@ "0" ] }, - "3961": { + "3944": { "op": "bytec_3 // \"schedule_entry_count\"", "defined_out": [ "\"schedule_entry_count\"", @@ -35457,7 +35437,7 @@ "\"schedule_entry_count\"" ] }, - "3962": { + "3945": { "op": "app_global_get_ex", "defined_out": [ "event_id#0", @@ -35486,7 +35466,7 @@ "maybe_exists%0#0" ] }, - "3963": { + "3946": { "error": "check self.schedule_entry_count exists", "op": "assert // check self.schedule_entry_count exists", "stack_out": [ @@ -35506,7 +35486,7 @@ "maybe_value%0#1" ] }, - "3964": { + "3947": { "op": "==", "defined_out": [ "event_id#0", @@ -35532,7 +35512,7 @@ "tmp%1#2" ] }, - "3965": { + "3948": { "error": "Invalid event id", "op": "assert // Invalid event id", "stack_out": [ @@ -35550,7 +35530,7 @@ "payload#0" ] }, - "3966": { + "3949": { "op": "dup", "stack_out": [ "aggregate%extract%2#0", @@ -35568,7 +35548,7 @@ "payload#0 (copy)" ] }, - "3967": { + "3950": { "op": "extract 8 1", "defined_out": [ "aggregate%extract%2#0", @@ -35594,7 +35574,7 @@ "aggregate%extract%2#0" ] }, - "3970": { + "3953": { "op": "bury 12", "defined_out": [ "aggregate%extract%2#0", @@ -35619,7 +35599,7 @@ "payload#0" ] }, - "3972": { + "3955": { "op": "intc_2 // 8", "stack_out": [ "aggregate%extract%2#0", @@ -35637,7 +35617,7 @@ "8" ] }, - "3973": { + "3956": { "op": "getbyte", "defined_out": [ "aggregate%extract%2#0", @@ -35663,7 +35643,7 @@ "tmp%2#3" ] }, - "3974": { + "3957": { "callsub": "modules.actus_kernel.ActusKernelModule._assert_event_allowed_for_contract_type", "op": "callsub _assert_event_allowed_for_contract_type", "stack_out": [ @@ -35679,7 +35659,7 @@ "values%0#0" ] }, - "3977": { + "3960": { "op": "intc_0 // 0", "stack_out": [ "aggregate%extract%2#0", @@ -35695,7 +35675,7 @@ "0" ] }, - "3978": { + "3961": { "op": "bytec_3 // \"schedule_entry_count\"", "stack_out": [ "aggregate%extract%2#0", @@ -35712,7 +35692,7 @@ "\"schedule_entry_count\"" ] }, - "3979": { + "3962": { "op": "app_global_get_ex", "defined_out": [ "aggregate%extract%2#0", @@ -35738,7 +35718,7 @@ "maybe_exists%2#0" ] }, - "3980": { + "3963": { "error": "check self.schedule_entry_count exists", "op": "assert // check self.schedule_entry_count exists", "stack_out": [ @@ -35755,7 +35735,7 @@ "event_id#1" ] }, - "3981": { + "3964": { "op": "pushint 16", "defined_out": [ "16", @@ -35781,7 +35761,7 @@ "16" ] }, - "3983": { + "3966": { "op": "/", "defined_out": [ "aggregate%extract%2#0", @@ -35805,8 +35785,8 @@ "page_index#0" ] }, - "3984": { - "op": "bytec 49 // 0x0000", + "3967": { + "op": "bytec 48 // 0x0000", "defined_out": [ "aggregate%extract%2#0", "event_id#0", @@ -35831,7 +35811,7 @@ "page#0" ] }, - "3986": { + "3969": { "op": "bury 7", "stack_out": [ "aggregate%extract%2#0", @@ -35847,7 +35827,7 @@ "page_index#0" ] }, - "3988": { + "3971": { "op": "itob", "defined_out": [ "aggregate%extract%2#0", @@ -35872,7 +35852,7 @@ "encoded_value%0#0" ] }, - "3989": { + "3972": { "op": "bytec 24 // 0x5323", "defined_out": [ "0x5323", @@ -35899,7 +35879,7 @@ "0x5323" ] }, - "3991": { + "3974": { "op": "swap", "stack_out": [ "aggregate%extract%2#0", @@ -35916,7 +35896,7 @@ "encoded_value%0#0" ] }, - "3992": { + "3975": { "op": "concat", "defined_out": [ "aggregate%extract%2#0", @@ -35941,7 +35921,7 @@ "box_prefixed_key%0#0" ] }, - "3993": { + "3976": { "op": "dup", "stack_out": [ "aggregate%extract%2#0", @@ -35958,7 +35938,7 @@ "box_prefixed_key%0#0" ] }, - "3994": { + "3977": { "op": "bury 9", "defined_out": [ "aggregate%extract%2#0", @@ -35983,7 +35963,7 @@ "box_prefixed_key%0#0" ] }, - "3996": { + "3979": { "op": "box_len", "defined_out": [ "_%0#0", @@ -36011,7 +35991,7 @@ "maybe_exists%3#0" ] }, - "3997": { + "3980": { "op": "bury 1", "stack_out": [ "aggregate%extract%2#0", @@ -36027,7 +36007,7 @@ "maybe_exists%3#0" ] }, - "3999": { + "3982": { "op": "bz apply_non_cash_event_after_if_else@27", "stack_out": [ "aggregate%extract%2#0", @@ -36042,7 +36022,7 @@ "values%0#0" ] }, - "4002": { + "3985": { "op": "dig 7", "stack_out": [ "aggregate%extract%2#0", @@ -36058,7 +36038,7 @@ "box_prefixed_key%0#0" ] }, - "4004": { + "3987": { "op": "box_get", "defined_out": [ "aggregate%box_get%1#0", @@ -36085,7 +36065,7 @@ "aggregate%box_get%1#0" ] }, - "4005": { + "3988": { "op": "swap", "stack_out": [ "aggregate%extract%2#0", @@ -36102,7 +36082,7 @@ "page#0" ] }, - "4006": { + "3989": { "op": "bury 7", "stack_out": [ "aggregate%extract%2#0", @@ -36118,7 +36098,7 @@ "aggregate%box_get%1#0" ] }, - "4008": { + "3991": { "error": "check self.schedule_page entry exists", "op": "assert // check self.schedule_page entry exists", "stack_out": [ @@ -36134,7 +36114,7 @@ "values%0#0" ] }, - "4009": { + "3992": { "block": "apply_non_cash_event_after_if_else@27", "stack_in": [ "aggregate%extract%2#0", @@ -36166,7 +36146,7 @@ "page#0" ] }, - "4011": { + "3994": { "op": "dup", "defined_out": [ "page#0", @@ -36187,7 +36167,7 @@ "page#0 (copy)" ] }, - "4012": { + "3995": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -36210,7 +36190,7 @@ "0" ] }, - "4013": { + "3996": { "error": "invalid array length header", "op": "extract_uint16 // on error: invalid array length header", "defined_out": [ @@ -36232,7 +36212,7 @@ "aggregate%array_length%0#0" ] }, - "4014": { + "3997": { "op": "dup", "defined_out": [ "aggregate%array_length%0#0", @@ -36255,7 +36235,7 @@ "aggregate%array_length%0#0 (copy)" ] }, - "4015": { + "3998": { "op": "pushint 16", "defined_out": [ "16", @@ -36280,7 +36260,7 @@ "16" ] }, - "4017": { + "4000": { "op": "<", "defined_out": [ "aggregate%array_length%0#0", @@ -36303,7 +36283,7 @@ "tmp%5#2" ] }, - "4018": { + "4001": { "error": "Invalid schedule page", "op": "assert // Invalid schedule page", "stack_out": [ @@ -36321,7 +36301,7 @@ "aggregate%array_length%0#0" ] }, - "4019": { + "4002": { "op": "dig 3", "defined_out": [ "aggregate%array_length%0#0", @@ -36344,7 +36324,7 @@ "payload#0" ] }, - "4021": { + "4004": { "op": "dup", "defined_out": [ "aggregate%array_length%0#0", @@ -36369,7 +36349,7 @@ "payload#0 (copy)" ] }, - "4022": { + "4005": { "op": "extract 9 8", "defined_out": [ "aggregate%array_length%0#0", @@ -36394,7 +36374,7 @@ "aggregate%extract%3#0" ] }, - "4025": { + "4008": { "op": "dig 1", "stack_out": [ "aggregate%extract%2#0", @@ -36414,7 +36394,7 @@ "payload#0 (copy)" ] }, - "4027": { + "4010": { "op": "extract 17 8", "defined_out": [ "aggregate%array_length%0#0", @@ -36441,7 +36421,7 @@ "aggregate%extract%4#0" ] }, - "4030": { + "4013": { "op": "dig 2", "stack_out": [ "aggregate%extract%2#0", @@ -36462,7 +36442,7 @@ "payload#0 (copy)" ] }, - "4032": { + "4015": { "op": "extract 25 8", "defined_out": [ "aggregate%array_length%0#0", @@ -36491,7 +36471,7 @@ "aggregate%extract%5#0" ] }, - "4035": { + "4018": { "op": "dig 3", "stack_out": [ "aggregate%extract%2#0", @@ -36513,7 +36493,7 @@ "payload#0 (copy)" ] }, - "4037": { + "4020": { "op": "extract 41 8", "defined_out": [ "aggregate%array_length%0#0", @@ -36544,7 +36524,7 @@ "aggregate%extract%6#0" ] }, - "4040": { + "4023": { "op": "dig 4", "stack_out": [ "aggregate%extract%2#0", @@ -36567,7 +36547,7 @@ "payload#0 (copy)" ] }, - "4042": { + "4025": { "op": "extract 49 8", "defined_out": [ "aggregate%array_length%0#0", @@ -36600,7 +36580,7 @@ "aggregate%extract%7#0" ] }, - "4045": { + "4028": { "op": "uncover 5", "stack_out": [ "aggregate%extract%2#0", @@ -36623,7 +36603,7 @@ "payload#0" ] }, - "4047": { + "4030": { "op": "extract 57 8", "defined_out": [ "aggregate%array_length%0#0", @@ -36657,7 +36637,7 @@ "aggregate%extract%8#0" ] }, - "4050": { + "4033": { "op": "dig 11", "defined_out": [ "aggregate%array_length%0#0", @@ -36693,7 +36673,7 @@ "values%0#1" ] }, - "4052": { + "4035": { "op": "itob", "defined_out": [ "aggregate%array_length%0#0", @@ -36730,7 +36710,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "4053": { + "4036": { "op": "dig 18", "defined_out": [ "aggregate%array_length%0#0", @@ -36769,7 +36749,7 @@ "aggregate%extract%2#0" ] }, - "4055": { + "4038": { "op": "concat", "defined_out": [ "aggregate%array_length%0#0", @@ -36807,7 +36787,7 @@ "aggregate%head%1#0" ] }, - "4056": { + "4039": { "op": "uncover 6", "stack_out": [ "aggregate%extract%2#0", @@ -36831,7 +36811,7 @@ "aggregate%extract%3#0" ] }, - "4058": { + "4041": { "op": "concat", "defined_out": [ "aggregate%array_length%0#0", @@ -36867,7 +36847,7 @@ "aggregate%head%2#0" ] }, - "4059": { + "4042": { "op": "uncover 5", "stack_out": [ "aggregate%extract%2#0", @@ -36890,7 +36870,7 @@ "aggregate%extract%4#0" ] }, - "4061": { + "4044": { "op": "concat", "defined_out": [ "aggregate%array_length%0#0", @@ -36924,7 +36904,7 @@ "aggregate%head%3#0" ] }, - "4062": { + "4045": { "op": "uncover 4", "stack_out": [ "aggregate%extract%2#0", @@ -36946,7 +36926,7 @@ "aggregate%extract%5#0" ] }, - "4064": { + "4047": { "op": "concat", "defined_out": [ "aggregate%array_length%0#0", @@ -36978,7 +36958,7 @@ "aggregate%head%4#0" ] }, - "4065": { + "4048": { "op": "uncover 3", "stack_out": [ "aggregate%extract%2#0", @@ -36999,7 +36979,7 @@ "aggregate%extract%6#0" ] }, - "4067": { + "4050": { "op": "concat", "defined_out": [ "aggregate%array_length%0#0", @@ -37029,7 +37009,7 @@ "aggregate%head%5#0" ] }, - "4068": { + "4051": { "op": "uncover 2", "stack_out": [ "aggregate%extract%2#0", @@ -37049,7 +37029,7 @@ "aggregate%extract%7#0" ] }, - "4070": { + "4053": { "op": "concat", "defined_out": [ "aggregate%array_length%0#0", @@ -37077,7 +37057,7 @@ "aggregate%head%6#0" ] }, - "4071": { + "4054": { "op": "swap", "stack_out": [ "aggregate%extract%2#0", @@ -37096,7 +37076,7 @@ "aggregate%extract%8#0" ] }, - "4072": { + "4055": { "op": "concat", "defined_out": [ "aggregate%array_length%0#0", @@ -37122,7 +37102,7 @@ "aggregate%head%7#0" ] }, - "4073": { + "4056": { "op": "dig 3", "defined_out": [ "aggregate%array_length%0#0", @@ -37150,7 +37130,7 @@ "values%0#0" ] }, - "4075": { + "4058": { "op": "itob", "defined_out": [ "aggregate%array_length%0#0", @@ -37179,7 +37159,7 @@ "aggregate%val_as_bytes%7#0" ] }, - "4076": { + "4059": { "op": "concat", "defined_out": [ "aggregate%array_length%0#0", @@ -37206,7 +37186,7 @@ "aggregate%head%8#0" ] }, - "4077": { + "4060": { "op": "uncover 2", "stack_out": [ "aggregate%extract%2#0", @@ -37224,7 +37204,7 @@ "page#0" ] }, - "4079": { + "4062": { "op": "swap", "stack_out": [ "aggregate%extract%2#0", @@ -37242,7 +37222,7 @@ "aggregate%head%8#0" ] }, - "4080": { + "4063": { "error": "max array length exceeded", "op": "concat // on error: max array length exceeded", "defined_out": [ @@ -37269,7 +37249,7 @@ "concat%0#0" ] }, - "4081": { + "4064": { "op": "swap", "stack_out": [ "aggregate%extract%2#0", @@ -37286,7 +37266,7 @@ "aggregate%array_length%0#0" ] }, - "4082": { + "4065": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -37314,7 +37294,7 @@ "1" ] }, - "4083": { + "4066": { "op": "+", "defined_out": [ "add%0#0", @@ -37340,7 +37320,7 @@ "add%0#0" ] }, - "4084": { + "4067": { "op": "itob", "defined_out": [ "aggregate%extract%2#0", @@ -37366,7 +37346,7 @@ "as_bytes%0#0" ] }, - "4085": { + "4068": { "op": "extract 6 2", "defined_out": [ "aggregate%extract%2#0", @@ -37392,7 +37372,7 @@ "as_u16_bytes%0#0" ] }, - "4088": { + "4071": { "op": "replace2 0", "stack_out": [ "aggregate%extract%2#0", @@ -37408,7 +37388,7 @@ "page#0" ] }, - "4090": { + "4073": { "op": "dig 8", "defined_out": [ "aggregate%extract%2#0", @@ -37433,7 +37413,7 @@ "box_prefixed_key%0#0" ] }, - "4092": { + "4075": { "op": "dup", "defined_out": [ "aggregate%extract%2#0", @@ -37460,7 +37440,7 @@ "box_prefixed_key%0#0 (copy)" ] }, - "4093": { + "4076": { "op": "box_del", "defined_out": [ "aggregate%extract%2#0", @@ -37487,7 +37467,7 @@ "{box_del}" ] }, - "4094": { + "4077": { "op": "pop", "stack_out": [ "aggregate%extract%2#0", @@ -37504,7 +37484,7 @@ "box_prefixed_key%0#0" ] }, - "4095": { + "4078": { "op": "swap", "stack_out": [ "aggregate%extract%2#0", @@ -37521,7 +37501,7 @@ "page#0" ] }, - "4096": { + "4079": { "op": "box_put", "stack_out": [ "aggregate%extract%2#0", @@ -37536,7 +37516,7 @@ "values%0#0" ] }, - "4097": { + "4080": { "op": "intc_0 // 0", "stack_out": [ "aggregate%extract%2#0", @@ -37552,7 +37532,7 @@ "0" ] }, - "4098": { + "4081": { "op": "bytec_3 // \"schedule_entry_count\"", "defined_out": [ "\"schedule_entry_count\"", @@ -37579,7 +37559,7 @@ "\"schedule_entry_count\"" ] }, - "4099": { + "4082": { "op": "app_global_get_ex", "defined_out": [ "aggregate%extract%2#0", @@ -37606,7 +37586,7 @@ "maybe_exists%4#0" ] }, - "4100": { + "4083": { "error": "check self.schedule_entry_count exists", "op": "assert // check self.schedule_entry_count exists", "stack_out": [ @@ -37623,7 +37603,7 @@ "maybe_value%3#0" ] }, - "4101": { + "4084": { "op": "intc_1 // 1", "stack_out": [ "aggregate%extract%2#0", @@ -37640,7 +37620,7 @@ "1" ] }, - "4102": { + "4085": { "op": "+", "defined_out": [ "aggregate%extract%2#0", @@ -37665,7 +37645,7 @@ "tmp%8#0" ] }, - "4103": { + "4086": { "op": "bytec_3 // \"schedule_entry_count\"", "stack_out": [ "aggregate%extract%2#0", @@ -37682,7 +37662,7 @@ "\"schedule_entry_count\"" ] }, - "4104": { + "4087": { "op": "swap", "stack_out": [ "aggregate%extract%2#0", @@ -37699,7 +37679,7 @@ "tmp%8#0" ] }, - "4105": { + "4088": { "op": "app_global_put", "stack_out": [ "aggregate%extract%2#0", @@ -37714,7 +37694,7 @@ "values%0#0" ] }, - "4106": { + "4089": { "block": "apply_non_cash_event_after_if_else@3", "stack_in": [ "aggregate%extract%2#0", @@ -37746,7 +37726,7 @@ "0" ] }, - "4107": { + "4090": { "op": "bytec_2 // \"event_cursor\"", "defined_out": [ "\"event_cursor\"", @@ -37767,7 +37747,7 @@ "\"event_cursor\"" ] }, - "4108": { + "4091": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -37788,7 +37768,7 @@ "maybe_exists%0#0" ] }, - "4109": { + "4092": { "error": "check self.event_cursor exists", "op": "assert // check self.event_cursor exists", "stack_out": [ @@ -37805,7 +37785,7 @@ "maybe_value%0#0" ] }, - "4110": { + "4093": { "op": "dig 3", "defined_out": [ "event_id#0", @@ -37826,10 +37806,10 @@ "event_id#0" ] }, - "4112": { + "4095": { "op": "dup" }, - "4113": { + "4096": { "op": "uncover 2", "defined_out": [ "event_id#0", @@ -37852,7 +37832,7 @@ "maybe_value%0#0" ] }, - "4115": { + "4098": { "op": "==", "defined_out": [ "event_id#0", @@ -37873,7 +37853,7 @@ "tmp%3#1" ] }, - "4116": { + "4099": { "error": "Invalid event cursor", "op": "assert // Invalid event cursor", "stack_out": [ @@ -37890,7 +37870,7 @@ "event_id#0" ] }, - "4117": { + "4100": { "callsub": "modules.actus_kernel.ActusKernelModule._get_schedule_entry", "op": "callsub _get_schedule_entry", "defined_out": [ @@ -37911,7 +37891,7 @@ "entry#0" ] }, - "4120": { + "4103": { "op": "dup", "stack_out": [ "aggregate%extract%2#0", @@ -37928,7 +37908,7 @@ "entry#0" ] }, - "4121": { + "4104": { "op": "bury 8", "defined_out": [ "entry#0", @@ -37948,7 +37928,7 @@ "entry#0" ] }, - "4123": { + "4106": { "op": "dup", "defined_out": [ "entry#0", @@ -37970,7 +37950,7 @@ "entry#0 (copy)" ] }, - "4124": { + "4107": { "op": "extract 8 1", "defined_out": [ "aggregate%extract%9#0", @@ -37992,7 +37972,7 @@ "aggregate%extract%9#0" ] }, - "4127": { + "4110": { "op": "bury 10", "defined_out": [ "aggregate%extract%9#0", @@ -38013,7 +37993,7 @@ "entry#0" ] }, - "4129": { + "4112": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -38036,7 +38016,7 @@ "8" ] }, - "4130": { + "4113": { "op": "getbyte", "defined_out": [ "aggregate%extract%9#0", @@ -38058,7 +38038,7 @@ "event_type#0" ] }, - "4131": { + "4114": { "op": "dup", "stack_out": [ "aggregate%extract%2#0", @@ -38075,7 +38055,7 @@ "event_type#0" ] }, - "4132": { + "4115": { "op": "bury 6", "defined_out": [ "aggregate%extract%9#0", @@ -38097,7 +38077,7 @@ "event_type#0" ] }, - "4134": { + "4117": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -38121,7 +38101,7 @@ "1" ] }, - "4135": { + "4118": { "op": "==", "defined_out": [ "aggregate%extract%9#0", @@ -38144,7 +38124,7 @@ "tmp%0#3" ] }, - "4136": { + "4119": { "op": "bnz apply_non_cash_event_bool_true@15", "stack_out": [ "aggregate%extract%2#0", @@ -38159,7 +38139,7 @@ "values%0#0" ] }, - "4139": { + "4122": { "op": "dig 4", "stack_out": [ "aggregate%extract%2#0", @@ -38175,7 +38155,7 @@ "event_type#0" ] }, - "4141": { + "4124": { "op": "pushint 4", "defined_out": [ "4", @@ -38199,7 +38179,7 @@ "4" ] }, - "4143": { + "4126": { "op": "==", "defined_out": [ "aggregate%extract%9#0", @@ -38222,7 +38202,7 @@ "tmp%1#2" ] }, - "4144": { + "4127": { "op": "bnz apply_non_cash_event_bool_true@15", "stack_out": [ "aggregate%extract%2#0", @@ -38237,7 +38217,7 @@ "values%0#0" ] }, - "4147": { + "4130": { "op": "dig 4", "stack_out": [ "aggregate%extract%2#0", @@ -38253,7 +38233,7 @@ "event_type#0" ] }, - "4149": { + "4132": { "op": "pushint 12", "defined_out": [ "12", @@ -38277,7 +38257,7 @@ "12" ] }, - "4151": { + "4134": { "op": "==", "defined_out": [ "aggregate%extract%9#0", @@ -38300,7 +38280,7 @@ "tmp%2#2" ] }, - "4152": { + "4135": { "op": "bnz apply_non_cash_event_bool_true@15", "stack_out": [ "aggregate%extract%2#0", @@ -38315,7 +38295,7 @@ "values%0#0" ] }, - "4155": { + "4138": { "op": "dig 4", "stack_out": [ "aggregate%extract%2#0", @@ -38331,7 +38311,7 @@ "event_type#0" ] }, - "4157": { + "4140": { "op": "pushint 11", "defined_out": [ "11", @@ -38355,7 +38335,7 @@ "11" ] }, - "4159": { + "4142": { "op": "==", "stack_out": [ "aggregate%extract%2#0", @@ -38371,7 +38351,7 @@ "tmp%3#1" ] }, - "4160": { + "4143": { "op": "bnz apply_non_cash_event_bool_true@15", "stack_out": [ "aggregate%extract%2#0", @@ -38386,7 +38366,7 @@ "values%0#0" ] }, - "4163": { + "4146": { "op": "dig 4", "stack_out": [ "aggregate%extract%2#0", @@ -38402,7 +38382,7 @@ "event_type#0" ] }, - "4165": { + "4148": { "op": "pushint 18", "defined_out": [ "18", @@ -38426,7 +38406,7 @@ "18" ] }, - "4167": { + "4150": { "op": "==", "defined_out": [ "aggregate%extract%9#0", @@ -38449,7 +38429,7 @@ "tmp%4#1" ] }, - "4168": { + "4151": { "op": "bnz apply_non_cash_event_bool_true@15", "stack_out": [ "aggregate%extract%2#0", @@ -38464,7 +38444,7 @@ "values%0#0" ] }, - "4171": { + "4154": { "op": "dig 4", "stack_out": [ "aggregate%extract%2#0", @@ -38480,7 +38460,7 @@ "event_type#0" ] }, - "4173": { + "4156": { "op": "pushint 5", "defined_out": [ "5", @@ -38504,7 +38484,7 @@ "5" ] }, - "4175": { + "4158": { "op": "==", "defined_out": [ "aggregate%extract%9#0", @@ -38527,7 +38507,7 @@ "tmp%5#2" ] }, - "4176": { + "4159": { "op": "bz apply_non_cash_event_bool_false@16", "stack_out": [ "aggregate%extract%2#0", @@ -38542,7 +38522,7 @@ "values%0#0" ] }, - "4179": { + "4162": { "block": "apply_non_cash_event_bool_true@15", "stack_in": [ "aggregate%extract%2#0", @@ -38574,7 +38554,7 @@ "or_result%0#0" ] }, - "4180": { + "4163": { "error": "Invalid event type", "block": "apply_non_cash_event_bool_merge@17", "stack_in": [ @@ -38605,7 +38585,7 @@ "values%0#0" ] }, - "4181": { + "4164": { "op": "dig 8", "defined_out": [ "aggregate%extract%9#0" @@ -38624,7 +38604,7 @@ "aggregate%extract%9#0" ] }, - "4183": { + "4166": { "op": "pushbytes 0x01", "defined_out": [ "0x01", @@ -38645,7 +38625,7 @@ "0x01" ] }, - "4186": { + "4169": { "op": "b!=", "defined_out": [ "aggregate%extract%9#0", @@ -38665,7 +38645,7 @@ "tmp%7#0" ] }, - "4187": { + "4170": { "error": "Invalid event type", "op": "assert // Invalid event type", "stack_out": [ @@ -38681,7 +38661,7 @@ "values%0#0" ] }, - "4188": { + "4171": { "op": "dig 4", "defined_out": [ "aggregate%extract%9#0", @@ -38701,7 +38681,7 @@ "event_type#0" ] }, - "4190": { + "4173": { "op": "pushint 12", "defined_out": [ "12", @@ -38723,7 +38703,7 @@ "12" ] }, - "4192": { + "4175": { "op": "==", "defined_out": [ "aggregate%extract%9#0", @@ -38744,7 +38724,7 @@ "tmp%0#3" ] }, - "4193": { + "4176": { "op": "bnz apply_non_cash_event_bool_true@21", "stack_out": [ "aggregate%extract%2#0", @@ -38759,7 +38739,7 @@ "values%0#0" ] }, - "4196": { + "4179": { "op": "dig 4", "stack_out": [ "aggregate%extract%2#0", @@ -38775,7 +38755,7 @@ "event_type#0" ] }, - "4198": { + "4181": { "op": "pushint 11", "defined_out": [ "11", @@ -38797,7 +38777,7 @@ "11" ] }, - "4200": { + "4183": { "op": "==", "defined_out": [ "aggregate%extract%9#0", @@ -38818,7 +38798,7 @@ "tmp%1#2" ] }, - "4201": { + "4184": { "op": "bz apply_non_cash_event_bool_false@22", "stack_out": [ "aggregate%extract%2#0", @@ -38833,7 +38813,7 @@ "values%0#0" ] }, - "4204": { + "4187": { "block": "apply_non_cash_event_bool_true@21", "stack_in": [ "aggregate%extract%2#0", @@ -38865,7 +38845,7 @@ "or_result%0#0" ] }, - "4205": { + "4188": { "block": "apply_non_cash_event_bool_merge@23", "stack_in": [ "aggregate%extract%2#0", @@ -38895,7 +38875,7 @@ "values%0#0" ] }, - "4208": { + "4191": { "op": "bytec 25 // 0x523a4d4f4323", "defined_out": [ "0x523a4d4f4323" @@ -38914,7 +38894,7 @@ "0x523a4d4f4323" ] }, - "4210": { + "4193": { "op": "txn Sender", "defined_out": [ "0x523a4d4f4323", @@ -38935,7 +38915,7 @@ "tmp%0#2" ] }, - "4212": { + "4195": { "callsub": "modules.rbac.RbacModule._role_is_active", "op": "callsub _role_is_active", "defined_out": [ @@ -38955,7 +38935,7 @@ "tmp%1#2" ] }, - "4215": { + "4198": { "error": "Not authorized", "op": "assert // Not authorized", "stack_out": [ @@ -38971,7 +38951,7 @@ "values%0#0" ] }, - "4216": { + "4199": { "block": "apply_non_cash_event_after_if_else@6", "stack_in": [ "aggregate%extract%2#0", @@ -39003,7 +38983,7 @@ "entry#0" ] }, - "4218": { + "4201": { "op": "dig 2", "defined_out": [ "entry#0", @@ -39024,11 +39004,11 @@ "payload#0" ] }, - "4220": { + "4203": { "callsub": "modules.actus_kernel.ActusKernelModule._apply_non_cash_schedule_entry", "op": "callsub _apply_non_cash_schedule_entry" }, - "4223": { + "4206": { "op": "popn 2", "stack_out": [ "aggregate%extract%2#0", @@ -39043,7 +39023,7 @@ "values%0#0" ] }, - "4225": { + "4208": { "op": "global LatestTimestamp", "defined_out": [ "entry#0", @@ -39064,7 +39044,7 @@ "tmp%10#0" ] }, - "4227": { + "4210": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%8#0", @@ -39085,7 +39065,7 @@ "aggregate%val_as_bytes%8#0" ] }, - "4228": { + "4211": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -39108,7 +39088,7 @@ "0x151f7c75" ] }, - "4229": { + "4212": { "op": "swap", "stack_out": [ "aggregate%extract%2#0", @@ -39125,7 +39105,7 @@ "aggregate%val_as_bytes%8#0" ] }, - "4230": { + "4213": { "op": "concat", "defined_out": [ "entry#0", @@ -39146,7 +39126,7 @@ "tmp%5#0" ] }, - "4231": { + "4214": { "op": "log", "stack_out": [ "aggregate%extract%2#0", @@ -39161,7 +39141,7 @@ "values%0#0" ] }, - "4232": { + "4215": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -39182,7 +39162,7 @@ "1" ] }, - "4233": { + "4216": { "op": "return", "stack_out": [ "aggregate%extract%2#0", @@ -39197,7 +39177,7 @@ "values%0#0" ] }, - "4234": { + "4217": { "block": "apply_non_cash_event_else_body@5", "stack_in": [ "aggregate%extract%2#0", @@ -39214,10 +39194,10 @@ "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", "op": "callsub _assert_caller_is_arranger" }, - "4237": { + "4220": { "op": "b apply_non_cash_event_after_if_else@6" }, - "4240": { + "4223": { "block": "apply_non_cash_event_bool_false@22", "stack_in": [ "aggregate%extract%2#0", @@ -39249,10 +39229,10 @@ "or_result%0#0" ] }, - "4241": { + "4224": { "op": "b apply_non_cash_event_bool_merge@23" }, - "4244": { + "4227": { "block": "apply_non_cash_event_bool_false@16", "stack_in": [ "aggregate%extract%2#0", @@ -39284,10 +39264,10 @@ "or_result%0#0" ] }, - "4245": { + "4228": { "op": "b apply_non_cash_event_bool_merge@17" }, - "4248": { + "4231": { "subroutine": "modules.actus_kernel.ActusKernelModule.append_observed_cash_event[routing]", "params": {}, "block": "append_observed_cash_event", @@ -39297,17 +39277,17 @@ "box_prefixed_key%0#0" ] }, - "4249": { + "4232": { "op": "dup", "stack_out": [ "box_prefixed_key%0#0", "page#0" ] }, - "4250": { + "4233": { "op": "txna ApplicationArgs 1" }, - "4253": { + "4236": { "op": "dupn 2", "defined_out": [ "payload#0", @@ -39321,7 +39301,7 @@ "payload#0 (copy)" ] }, - "4255": { + "4238": { "op": "len", "defined_out": [ "len%0#0", @@ -39335,7 +39315,7 @@ "len%0#0" ] }, - "4256": { + "4239": { "op": "pushint 65", "defined_out": [ "65", @@ -39351,7 +39331,7 @@ "65" ] }, - "4258": { + "4241": { "op": "==", "defined_out": [ "eq%0#0", @@ -39365,7 +39345,7 @@ "eq%0#0" ] }, - "4259": { + "4242": { "error": "invalid number of bytes for smart_contracts.abi_types.ObservedCashEventRequest", "op": "assert // invalid number of bytes for smart_contracts.abi_types.ObservedCashEventRequest", "stack_out": [ @@ -39375,7 +39355,7 @@ "payload#0" ] }, - "4260": { + "4243": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#0", @@ -39385,7 +39365,7 @@ "0" ] }, - "4261": { + "4244": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"", @@ -39401,7 +39381,7 @@ "\"status\"" ] }, - "4262": { + "4245": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -39417,7 +39397,7 @@ "maybe_exists%0#0" ] }, - "4263": { + "4246": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ @@ -39428,7 +39408,7 @@ "maybe_value%0#0" ] }, - "4264": { + "4247": { "error": "D-ASA not configured", "op": "assert // D-ASA not configured", "stack_out": [ @@ -39438,19 +39418,19 @@ "payload#0" ] }, - "4265": { + "4248": { "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", "op": "callsub _assert_caller_is_arranger" }, - "4268": { + "4251": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", "op": "callsub _assert_is_not_asset_defaulted" }, - "4271": { + "4254": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_suspended", "op": "callsub _assert_is_not_asset_suspended" }, - "4274": { + "4257": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#0", @@ -39460,7 +39440,7 @@ "0" ] }, - "4275": { + "4258": { "op": "bytec_1 // \"status\"", "stack_out": [ "box_prefixed_key%0#0", @@ -39471,7 +39451,7 @@ "\"status\"" ] }, - "4276": { + "4259": { "op": "app_global_get_ex", "stack_out": [ "box_prefixed_key%0#0", @@ -39482,7 +39462,7 @@ "maybe_exists%0#0" ] }, - "4277": { + "4260": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ @@ -39493,7 +39473,7 @@ "maybe_value%0#0" ] }, - "4278": { + "4261": { "op": "pushint 50", "defined_out": [ "50", @@ -39509,7 +39489,7 @@ "50" ] }, - "4280": { + "4263": { "op": "==", "defined_out": [ "payload#0", @@ -39523,7 +39503,7 @@ "tmp%0#5" ] }, - "4281": { + "4264": { "op": "!", "defined_out": [ "payload#0", @@ -39537,7 +39517,7 @@ "tmp%1#0" ] }, - "4282": { + "4265": { "error": "IED not yet executed", "op": "assert // IED not yet executed", "stack_out": [ @@ -39547,7 +39527,7 @@ "payload#0" ] }, - "4283": { + "4266": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#0", @@ -39557,7 +39537,7 @@ "0" ] }, - "4284": { + "4267": { "op": "bytec 10 // \"contract_type\"", "defined_out": [ "\"contract_type\"", @@ -39573,7 +39553,7 @@ "\"contract_type\"" ] }, - "4286": { + "4269": { "op": "app_global_get_ex", "stack_out": [ "box_prefixed_key%0#0", @@ -39584,7 +39564,7 @@ "maybe_exists%0#0" ] }, - "4287": { + "4270": { "error": "check self.contract_type exists", "op": "assert // check self.contract_type exists", "stack_out": [ @@ -39595,7 +39575,7 @@ "maybe_value%0#0" ] }, - "4288": { + "4271": { "op": "pushint 5", "defined_out": [ "5", @@ -39611,7 +39591,7 @@ "5" ] }, - "4290": { + "4273": { "op": "==", "stack_out": [ "box_prefixed_key%0#0", @@ -39621,7 +39601,7 @@ "tmp%0#5" ] }, - "4291": { + "4274": { "error": "Observed event required to execute this action", "op": "assert // Observed event required to execute this action", "stack_out": [ @@ -39631,7 +39611,7 @@ "payload#0" ] }, - "4292": { + "4275": { "op": "dup", "stack_out": [ "box_prefixed_key%0#0", @@ -39641,7 +39621,7 @@ "payload#0 (copy)" ] }, - "4293": { + "4276": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#0", @@ -39652,7 +39632,7 @@ "0" ] }, - "4294": { + "4277": { "op": "extract_uint64", "defined_out": [ "payload#0", @@ -39666,7 +39646,7 @@ "values%0#0" ] }, - "4295": { + "4278": { "op": "dup", "stack_out": [ "box_prefixed_key%0#0", @@ -39677,7 +39657,7 @@ "values%0#0" ] }, - "4296": { + "4279": { "op": "cover 2", "defined_out": [ "payload#0", @@ -39692,7 +39672,7 @@ "values%0#0" ] }, - "4298": { + "4281": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#0", @@ -39704,7 +39684,7 @@ "0" ] }, - "4299": { + "4282": { "op": "bytec_3 // \"schedule_entry_count\"", "defined_out": [ "\"schedule_entry_count\"", @@ -39723,7 +39703,7 @@ "\"schedule_entry_count\"" ] }, - "4300": { + "4283": { "op": "app_global_get_ex", "stack_out": [ "box_prefixed_key%0#0", @@ -39736,7 +39716,7 @@ "maybe_exists%0#0" ] }, - "4301": { + "4284": { "error": "check self.schedule_entry_count exists", "op": "assert // check self.schedule_entry_count exists", "stack_out": [ @@ -39749,7 +39729,7 @@ "maybe_value%0#0" ] }, - "4302": { + "4285": { "op": "swap", "stack_out": [ "box_prefixed_key%0#0", @@ -39761,7 +39741,7 @@ "values%0#0" ] }, - "4303": { + "4286": { "op": "dig 1", "defined_out": [ "maybe_value%0#0", @@ -39780,7 +39760,7 @@ "maybe_value%0#0 (copy)" ] }, - "4305": { + "4288": { "op": "==", "stack_out": [ "box_prefixed_key%0#0", @@ -39792,7 +39772,7 @@ "tmp%1#0" ] }, - "4306": { + "4289": { "error": "Invalid event id", "op": "assert // Invalid event id", "stack_out": [ @@ -39804,7 +39784,7 @@ "maybe_value%0#0" ] }, - "4307": { + "4290": { "op": "dig 1", "stack_out": [ "box_prefixed_key%0#0", @@ -39816,7 +39796,7 @@ "payload#0 (copy)" ] }, - "4309": { + "4292": { "op": "extract 8 1", "defined_out": [ "aggregate%extract%1#0", @@ -39834,7 +39814,7 @@ "aggregate%extract%1#0" ] }, - "4312": { + "4295": { "op": "dup", "stack_out": [ "box_prefixed_key%0#0", @@ -39847,7 +39827,7 @@ "aggregate%extract%1#0" ] }, - "4313": { + "4296": { "op": "cover 3", "defined_out": [ "aggregate%extract%1#0", @@ -39866,7 +39846,7 @@ "aggregate%extract%1#0" ] }, - "4315": { + "4298": { "op": "pushbytes 0x03", "defined_out": [ "0x03", @@ -39887,7 +39867,7 @@ "0x03" ] }, - "4318": { + "4301": { "op": "b==", "defined_out": [ "aggregate%extract%1#0", @@ -39907,7 +39887,7 @@ "tmp%2#1" ] }, - "4319": { + "4302": { "error": "Invalid event type", "op": "assert // Invalid event type", "stack_out": [ @@ -39920,7 +39900,7 @@ "maybe_value%0#0" ] }, - "4320": { + "4303": { "op": "swap", "stack_out": [ "box_prefixed_key%0#0", @@ -39932,7 +39912,7 @@ "payload#0" ] }, - "4321": { + "4304": { "op": "pushint 57", "defined_out": [ "57", @@ -39952,7 +39932,7 @@ "57" ] }, - "4323": { + "4306": { "op": "extract_uint64", "defined_out": [ "aggregate%extract%1#0", @@ -39971,7 +39951,7 @@ "values%1#0" ] }, - "4324": { + "4307": { "op": "dup", "stack_out": [ "box_prefixed_key%0#0", @@ -39984,7 +39964,7 @@ "values%1#0" ] }, - "4325": { + "4308": { "op": "cover 2", "stack_out": [ "box_prefixed_key%0#0", @@ -39997,7 +39977,7 @@ "values%1#0" ] }, - "4327": { + "4310": { "op": "intc_1 // 1", "stack_out": [ "box_prefixed_key%0#0", @@ -40011,7 +39991,7 @@ "1" ] }, - "4328": { + "4311": { "op": "&", "defined_out": [ "aggregate%extract%1#0", @@ -40032,7 +40012,7 @@ "tmp%3#1" ] }, - "4329": { + "4312": { "error": "Invalid ACTUS configuration", "op": "assert // Invalid ACTUS configuration", "stack_out": [ @@ -40045,7 +40025,7 @@ "maybe_value%0#0" ] }, - "4330": { + "4313": { "op": "bz append_observed_cash_event_after_if_else@3", "stack_out": [ "box_prefixed_key%0#0", @@ -40056,7 +40036,7 @@ "values%1#0" ] }, - "4333": { + "4316": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#0", @@ -40068,7 +40048,7 @@ "0" ] }, - "4334": { + "4317": { "op": "bytec_3 // \"schedule_entry_count\"", "stack_out": [ "box_prefixed_key%0#0", @@ -40081,7 +40061,7 @@ "\"schedule_entry_count\"" ] }, - "4335": { + "4318": { "op": "app_global_get_ex", "defined_out": [ "aggregate%extract%1#0", @@ -40102,7 +40082,7 @@ "maybe_exists%2#0" ] }, - "4336": { + "4319": { "error": "check self.schedule_entry_count exists", "op": "assert // check self.schedule_entry_count exists", "stack_out": [ @@ -40115,7 +40095,7 @@ "maybe_value%2#0" ] }, - "4337": { + "4320": { "op": "intc_1 // 1", "stack_out": [ "box_prefixed_key%0#0", @@ -40128,7 +40108,7 @@ "1" ] }, - "4338": { + "4321": { "op": "-", "defined_out": [ "aggregate%extract%1#0", @@ -40147,7 +40127,7 @@ "tmp%6#0" ] }, - "4339": { + "4322": { "callsub": "modules.actus_kernel.ActusKernelModule._get_schedule_entry", "op": "callsub _get_schedule_entry", "defined_out": [ @@ -40167,7 +40147,7 @@ "previous_entry#0" ] }, - "4342": { + "4325": { "op": "pushint 9", "defined_out": [ "9", @@ -40188,7 +40168,7 @@ "9" ] }, - "4344": { + "4327": { "op": "extract_uint64", "defined_out": [ "aggregate%extract%1#0", @@ -40207,7 +40187,7 @@ "values%2#0" ] }, - "4345": { + "4328": { "op": "dig 4", "stack_out": [ "box_prefixed_key%0#0", @@ -40220,7 +40200,7 @@ "payload#0" ] }, - "4347": { + "4330": { "op": "pushint 9", "stack_out": [ "box_prefixed_key%0#0", @@ -40234,7 +40214,7 @@ "9" ] }, - "4349": { + "4332": { "op": "extract_uint64", "defined_out": [ "aggregate%extract%1#0", @@ -40255,7 +40235,7 @@ "values%3#0" ] }, - "4350": { + "4333": { "op": "<=", "defined_out": [ "aggregate%extract%1#0", @@ -40274,7 +40254,7 @@ "tmp%8#0" ] }, - "4351": { + "4334": { "error": "Time events must be sorted in strictly ascending order", "op": "assert // Time events must be sorted in strictly ascending order", "stack_out": [ @@ -40286,7 +40266,7 @@ "values%1#0" ] }, - "4352": { + "4335": { "block": "append_observed_cash_event_after_if_else@3", "stack_in": [ "box_prefixed_key%0#0", @@ -40310,7 +40290,7 @@ "0" ] }, - "4353": { + "4336": { "op": "bytec_3 // \"schedule_entry_count\"", "defined_out": [ "\"schedule_entry_count\"", @@ -40327,7 +40307,7 @@ "\"schedule_entry_count\"" ] }, - "4354": { + "4337": { "op": "app_global_get_ex", "defined_out": [ "event_id#0", @@ -40344,7 +40324,7 @@ "maybe_exists%3#0" ] }, - "4355": { + "4338": { "error": "check self.schedule_entry_count exists", "op": "assert // check self.schedule_entry_count exists", "stack_out": [ @@ -40357,7 +40337,7 @@ "event_id#0" ] }, - "4356": { + "4339": { "op": "pushint 16", "defined_out": [ "16", @@ -40374,7 +40354,7 @@ "16" ] }, - "4358": { + "4341": { "op": "/", "defined_out": [ "page_index#0" @@ -40389,8 +40369,8 @@ "page_index#0" ] }, - "4359": { - "op": "bytec 49 // 0x0000", + "4342": { + "op": "bytec 48 // 0x0000", "defined_out": [ "page#0", "page_index#0" @@ -40406,7 +40386,7 @@ "page#0" ] }, - "4361": { + "4344": { "op": "bury 6", "defined_out": [ "page#0", @@ -40422,7 +40402,7 @@ "page_index#0" ] }, - "4363": { + "4346": { "op": "itob", "defined_out": [ "encoded_value%0#0", @@ -40438,7 +40418,7 @@ "encoded_value%0#0" ] }, - "4364": { + "4347": { "op": "bytec 24 // 0x5323", "defined_out": [ "0x5323", @@ -40456,7 +40436,7 @@ "0x5323" ] }, - "4366": { + "4349": { "op": "swap", "stack_out": [ "box_prefixed_key%0#0", @@ -40469,7 +40449,7 @@ "encoded_value%0#0" ] }, - "4367": { + "4350": { "op": "concat", "defined_out": [ "box_prefixed_key%0#0", @@ -40485,7 +40465,7 @@ "box_prefixed_key%0#0" ] }, - "4368": { + "4351": { "op": "dup", "stack_out": [ "box_prefixed_key%0#0", @@ -40498,7 +40478,7 @@ "box_prefixed_key%0#0" ] }, - "4369": { + "4352": { "op": "bury 7", "defined_out": [ "box_prefixed_key%0#0", @@ -40514,7 +40494,7 @@ "box_prefixed_key%0#0" ] }, - "4371": { + "4354": { "op": "box_len", "defined_out": [ "_%0#0", @@ -40533,7 +40513,7 @@ "maybe_exists%4#0" ] }, - "4372": { + "4355": { "op": "bury 1", "stack_out": [ "box_prefixed_key%0#0", @@ -40545,7 +40525,7 @@ "maybe_exists%4#0" ] }, - "4374": { + "4357": { "op": "bz append_observed_cash_event_after_if_else@5", "stack_out": [ "box_prefixed_key%0#0", @@ -40556,7 +40536,7 @@ "values%1#0" ] }, - "4377": { + "4360": { "op": "dig 5", "stack_out": [ "box_prefixed_key%0#0", @@ -40568,7 +40548,7 @@ "box_prefixed_key%0#0" ] }, - "4379": { + "4362": { "op": "box_get", "defined_out": [ "aggregate%box_get%1#0", @@ -40586,7 +40566,7 @@ "aggregate%box_get%1#0" ] }, - "4380": { + "4363": { "op": "swap", "stack_out": [ "box_prefixed_key%0#0", @@ -40599,7 +40579,7 @@ "page#0" ] }, - "4381": { + "4364": { "op": "bury 6", "stack_out": [ "box_prefixed_key%0#0", @@ -40611,7 +40591,7 @@ "aggregate%box_get%1#0" ] }, - "4383": { + "4366": { "error": "check self.schedule_page entry exists", "op": "assert // check self.schedule_page entry exists", "stack_out": [ @@ -40623,7 +40603,7 @@ "values%1#0" ] }, - "4384": { + "4367": { "block": "append_observed_cash_event_after_if_else@5", "stack_in": [ "box_prefixed_key%0#0", @@ -40647,7 +40627,7 @@ "page#0" ] }, - "4386": { + "4369": { "op": "dup", "defined_out": [ "page#0", @@ -40664,7 +40644,7 @@ "page#0 (copy)" ] }, - "4387": { + "4370": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -40683,7 +40663,7 @@ "0" ] }, - "4388": { + "4371": { "error": "invalid array length header", "op": "extract_uint16 // on error: invalid array length header", "defined_out": [ @@ -40701,7 +40681,7 @@ "aggregate%array_length%0#0" ] }, - "4389": { + "4372": { "op": "dup", "defined_out": [ "aggregate%array_length%0#0", @@ -40720,7 +40700,7 @@ "aggregate%array_length%0#0 (copy)" ] }, - "4390": { + "4373": { "op": "pushint 16", "defined_out": [ "16", @@ -40741,7 +40721,7 @@ "16" ] }, - "4392": { + "4375": { "op": "<", "defined_out": [ "aggregate%array_length%0#0", @@ -40760,7 +40740,7 @@ "tmp%11#0" ] }, - "4393": { + "4376": { "error": "Invalid schedule page", "op": "assert // Invalid schedule page", "stack_out": [ @@ -40774,7 +40754,7 @@ "aggregate%array_length%0#0" ] }, - "4394": { + "4377": { "op": "dig 5", "defined_out": [ "aggregate%array_length%0#0", @@ -40793,7 +40773,7 @@ "payload#0" ] }, - "4396": { + "4379": { "op": "dup", "defined_out": [ "aggregate%array_length%0#0", @@ -40814,7 +40794,7 @@ "payload#0 (copy)" ] }, - "4397": { + "4380": { "op": "extract 9 8", "defined_out": [ "aggregate%array_length%0#0", @@ -40835,7 +40815,7 @@ "aggregate%extract%5#0" ] }, - "4400": { + "4383": { "op": "dig 1", "stack_out": [ "box_prefixed_key%0#0", @@ -40851,7 +40831,7 @@ "payload#0 (copy)" ] }, - "4402": { + "4385": { "op": "extract 17 8", "defined_out": [ "aggregate%array_length%0#0", @@ -40874,7 +40854,7 @@ "aggregate%extract%6#0" ] }, - "4405": { + "4388": { "op": "dig 2", "stack_out": [ "box_prefixed_key%0#0", @@ -40891,7 +40871,7 @@ "payload#0 (copy)" ] }, - "4407": { + "4390": { "op": "extract 25 8", "defined_out": [ "aggregate%array_length%0#0", @@ -40916,7 +40896,7 @@ "aggregate%extract%7#0" ] }, - "4410": { + "4393": { "op": "dig 3", "stack_out": [ "box_prefixed_key%0#0", @@ -40934,7 +40914,7 @@ "payload#0 (copy)" ] }, - "4412": { + "4395": { "op": "extract 33 8", "defined_out": [ "aggregate%array_length%0#0", @@ -40961,7 +40941,7 @@ "aggregate%extract%8#0" ] }, - "4415": { + "4398": { "op": "dig 4", "stack_out": [ "box_prefixed_key%0#0", @@ -40980,7 +40960,7 @@ "payload#0 (copy)" ] }, - "4417": { + "4400": { "op": "extract 41 8", "defined_out": [ "aggregate%array_length%0#0", @@ -41009,7 +40989,7 @@ "aggregate%extract%9#0" ] }, - "4420": { + "4403": { "op": "uncover 5", "stack_out": [ "box_prefixed_key%0#0", @@ -41028,7 +41008,7 @@ "payload#0" ] }, - "4422": { + "4405": { "op": "extract 49 8", "defined_out": [ "aggregate%array_length%0#0", @@ -41058,7 +41038,7 @@ "aggregate%extract%10#0" ] }, - "4425": { + "4408": { "op": "dig 10", "defined_out": [ "aggregate%array_length%0#0", @@ -41090,7 +41070,7 @@ "values%0#0" ] }, - "4427": { + "4410": { "op": "itob", "defined_out": [ "aggregate%array_length%0#0", @@ -41123,7 +41103,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "4428": { + "4411": { "op": "dig 10", "defined_out": [ "aggregate%array_length%0#0", @@ -41158,7 +41138,7 @@ "aggregate%extract%1#0" ] }, - "4430": { + "4413": { "op": "concat", "defined_out": [ "aggregate%array_length%0#0", @@ -41192,7 +41172,7 @@ "aggregate%head%1#0" ] }, - "4431": { + "4414": { "op": "uncover 6", "stack_out": [ "box_prefixed_key%0#0", @@ -41212,7 +41192,7 @@ "aggregate%extract%5#0" ] }, - "4433": { + "4416": { "op": "concat", "defined_out": [ "aggregate%array_length%0#0", @@ -41244,7 +41224,7 @@ "aggregate%head%2#0" ] }, - "4434": { + "4417": { "op": "uncover 5", "stack_out": [ "box_prefixed_key%0#0", @@ -41263,7 +41243,7 @@ "aggregate%extract%6#0" ] }, - "4436": { + "4419": { "op": "concat", "defined_out": [ "aggregate%array_length%0#0", @@ -41293,7 +41273,7 @@ "aggregate%head%3#0" ] }, - "4437": { + "4420": { "op": "uncover 4", "stack_out": [ "box_prefixed_key%0#0", @@ -41311,7 +41291,7 @@ "aggregate%extract%7#0" ] }, - "4439": { + "4422": { "op": "concat", "defined_out": [ "aggregate%array_length%0#0", @@ -41339,7 +41319,7 @@ "aggregate%head%4#0" ] }, - "4440": { + "4423": { "op": "uncover 3", "stack_out": [ "box_prefixed_key%0#0", @@ -41356,7 +41336,7 @@ "aggregate%extract%8#0" ] }, - "4442": { + "4425": { "op": "concat", "defined_out": [ "aggregate%array_length%0#0", @@ -41382,7 +41362,7 @@ "aggregate%head%5#0" ] }, - "4443": { + "4426": { "op": "uncover 2", "stack_out": [ "box_prefixed_key%0#0", @@ -41398,7 +41378,7 @@ "aggregate%extract%9#0" ] }, - "4445": { + "4428": { "op": "concat", "defined_out": [ "aggregate%array_length%0#0", @@ -41422,7 +41402,7 @@ "aggregate%head%6#0" ] }, - "4446": { + "4429": { "op": "swap", "stack_out": [ "box_prefixed_key%0#0", @@ -41437,7 +41417,7 @@ "aggregate%extract%10#0" ] }, - "4447": { + "4430": { "op": "concat", "defined_out": [ "aggregate%array_length%0#0", @@ -41459,7 +41439,7 @@ "aggregate%head%7#0" ] }, - "4448": { + "4431": { "op": "dig 3", "defined_out": [ "aggregate%array_length%0#0", @@ -41483,7 +41463,7 @@ "values%1#0" ] }, - "4450": { + "4433": { "op": "itob", "defined_out": [ "aggregate%array_length%0#0", @@ -41508,7 +41488,7 @@ "aggregate%val_as_bytes%7#0" ] }, - "4451": { + "4434": { "op": "concat", "defined_out": [ "aggregate%array_length%0#0", @@ -41531,7 +41511,7 @@ "aggregate%head%8#0" ] }, - "4452": { + "4435": { "op": "uncover 2", "stack_out": [ "box_prefixed_key%0#0", @@ -41545,7 +41525,7 @@ "page#0" ] }, - "4454": { + "4437": { "op": "swap", "stack_out": [ "box_prefixed_key%0#0", @@ -41559,7 +41539,7 @@ "aggregate%head%8#0" ] }, - "4455": { + "4438": { "error": "max array length exceeded", "op": "concat // on error: max array length exceeded", "defined_out": [ @@ -41582,7 +41562,7 @@ "concat%0#0" ] }, - "4456": { + "4439": { "op": "swap", "stack_out": [ "box_prefixed_key%0#0", @@ -41595,7 +41575,7 @@ "aggregate%array_length%0#0" ] }, - "4457": { + "4440": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -41619,7 +41599,7 @@ "1" ] }, - "4458": { + "4441": { "op": "+", "defined_out": [ "add%0#0", @@ -41641,7 +41621,7 @@ "add%0#0" ] }, - "4459": { + "4442": { "op": "itob", "defined_out": [ "aggregate%extract%1#0", @@ -41663,7 +41643,7 @@ "as_bytes%0#0" ] }, - "4460": { + "4443": { "op": "extract 6 2", "defined_out": [ "aggregate%extract%1#0", @@ -41685,7 +41665,7 @@ "as_u16_bytes%0#0" ] }, - "4463": { + "4446": { "op": "replace2 0", "stack_out": [ "box_prefixed_key%0#0", @@ -41697,7 +41677,7 @@ "page#0" ] }, - "4465": { + "4448": { "op": "dig 6", "defined_out": [ "aggregate%extract%1#0", @@ -41718,7 +41698,7 @@ "box_prefixed_key%0#0" ] }, - "4467": { + "4450": { "op": "dup", "defined_out": [ "aggregate%extract%1#0", @@ -41741,7 +41721,7 @@ "box_prefixed_key%0#0 (copy)" ] }, - "4468": { + "4451": { "op": "box_del", "defined_out": [ "aggregate%extract%1#0", @@ -41764,7 +41744,7 @@ "{box_del}" ] }, - "4469": { + "4452": { "op": "pop", "stack_out": [ "box_prefixed_key%0#0", @@ -41777,7 +41757,7 @@ "box_prefixed_key%0#0" ] }, - "4470": { + "4453": { "op": "swap", "stack_out": [ "box_prefixed_key%0#0", @@ -41790,7 +41770,7 @@ "page#0" ] }, - "4471": { + "4454": { "op": "box_put", "stack_out": [ "box_prefixed_key%0#0", @@ -41801,7 +41781,7 @@ "values%1#0" ] }, - "4472": { + "4455": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#0", @@ -41813,7 +41793,7 @@ "0" ] }, - "4473": { + "4456": { "op": "bytec_3 // \"schedule_entry_count\"", "defined_out": [ "\"schedule_entry_count\"", @@ -41836,7 +41816,7 @@ "\"schedule_entry_count\"" ] }, - "4474": { + "4457": { "op": "app_global_get_ex", "defined_out": [ "aggregate%extract%1#0", @@ -41859,7 +41839,7 @@ "maybe_exists%5#0" ] }, - "4475": { + "4458": { "error": "check self.schedule_entry_count exists", "op": "assert // check self.schedule_entry_count exists", "stack_out": [ @@ -41872,7 +41852,7 @@ "maybe_value%4#0" ] }, - "4476": { + "4459": { "op": "intc_1 // 1", "stack_out": [ "box_prefixed_key%0#0", @@ -41885,7 +41865,7 @@ "1" ] }, - "4477": { + "4460": { "op": "+", "defined_out": [ "aggregate%extract%1#0", @@ -41906,7 +41886,7 @@ "tmp%14#0" ] }, - "4478": { + "4461": { "op": "bytec_3 // \"schedule_entry_count\"", "stack_out": [ "box_prefixed_key%0#0", @@ -41919,7 +41899,7 @@ "\"schedule_entry_count\"" ] }, - "4479": { + "4462": { "op": "swap", "stack_out": [ "box_prefixed_key%0#0", @@ -41932,7 +41912,7 @@ "tmp%14#0" ] }, - "4480": { + "4463": { "op": "app_global_put", "stack_out": [ "box_prefixed_key%0#0", @@ -41943,7 +41923,7 @@ "values%1#0" ] }, - "4481": { + "4464": { "op": "global LatestTimestamp", "defined_out": [ "aggregate%extract%1#0", @@ -41964,7 +41944,7 @@ "tmp%0#1" ] }, - "4483": { + "4466": { "op": "itob", "defined_out": [ "aggregate%extract%1#0", @@ -41985,7 +41965,7 @@ "aggregate%val_as_bytes%8#0" ] }, - "4484": { + "4467": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -42008,7 +41988,7 @@ "0x151f7c75" ] }, - "4485": { + "4468": { "op": "swap", "stack_out": [ "box_prefixed_key%0#0", @@ -42021,7 +42001,7 @@ "aggregate%val_as_bytes%8#0" ] }, - "4486": { + "4469": { "op": "concat", "defined_out": [ "aggregate%extract%1#0", @@ -42042,7 +42022,7 @@ "tmp%3#0" ] }, - "4487": { + "4470": { "op": "log", "stack_out": [ "box_prefixed_key%0#0", @@ -42053,7 +42033,7 @@ "values%1#0" ] }, - "4488": { + "4471": { "op": "intc_1 // 1", "stack_out": [ "box_prefixed_key%0#0", @@ -42065,7 +42045,7 @@ "1" ] }, - "4489": { + "4472": { "op": "return", "stack_out": [ "box_prefixed_key%0#0", @@ -42076,217 +42056,7 @@ "values%1#0" ] }, - "4490": { - "subroutine": "modules.actus_kernel.ActusKernelModule.contract_set_default_status[routing]", - "params": {}, - "block": "contract_set_default_status", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "4493": { - "op": "dup", - "defined_out": [ - "tmp%0#0", - "tmp%0#0 (copy)" - ], - "stack_out": [ - "tmp%0#0", - "tmp%0#0 (copy)" - ] - }, - "4494": { - "op": "len", - "defined_out": [ - "len%0#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "len%0#0" - ] - }, - "4495": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "len%0#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "len%0#0", - "1" - ] - }, - "4496": { - "op": "==", - "defined_out": [ - "eq%0#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "eq%0#0" - ] - }, - "4497": { - "error": "invalid number of bytes for arc4.bool", - "op": "assert // invalid number of bytes for arc4.bool", - "stack_out": [ - "tmp%0#0" - ] - }, - "4498": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "0" - ] - }, - "4499": { - "op": "getbit", - "defined_out": [ - "defaulted#0" - ], - "stack_out": [ - "defaulted#0" - ] - }, - "4500": { - "op": "bytec 26 // 0x523a54525323", - "defined_out": [ - "0x523a54525323", - "defaulted#0" - ], - "stack_out": [ - "defaulted#0", - "0x523a54525323" - ] - }, - "4502": { - "op": "txn Sender", - "defined_out": [ - "0x523a54525323", - "defaulted#0", - "tmp%0#2" - ], - "stack_out": [ - "defaulted#0", - "0x523a54525323", - "tmp%0#2" - ] - }, - "4504": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "defaulted#0", - "tmp%1#0" - ], - "stack_out": [ - "defaulted#0", - "tmp%1#0" - ] - }, - "4507": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "defaulted#0" - ] - }, - "4508": { - "op": "bytec 47 // \"defaulted\"", - "defined_out": [ - "\"defaulted\"", - "defaulted#0" - ], - "stack_out": [ - "defaulted#0", - "\"defaulted\"" - ] - }, - "4510": { - "op": "swap", - "stack_out": [ - "\"defaulted\"", - "defaulted#0" - ] - }, - "4511": { - "op": "app_global_put", - "stack_out": [] - }, - "4512": { - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1" - ] - }, - "4514": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0" - ] - }, - "4515": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0", - "0x151f7c75" - ] - }, - "4516": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ] - }, - "4517": { - "op": "concat", - "defined_out": [ - "tmp%4#0" - ], - "stack_out": [ - "tmp%4#0" - ] - }, - "4518": { - "op": "log", - "stack_out": [] - }, - "4519": { - "op": "intc_1 // 1", - "stack_out": [ - "1" - ] - }, - "4520": { - "op": "return", - "stack_out": [] - }, - "4521": { + "4473": { "subroutine": "modules.actus_kernel.ActusKernelModule.contract_get_state[routing]", "params": {}, "block": "contract_get_state", @@ -42299,7 +42069,7 @@ "0" ] }, - "4522": { + "4474": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"", @@ -42310,7 +42080,7 @@ "\"status\"" ] }, - "4523": { + "4475": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -42321,14 +42091,14 @@ "maybe_exists%0#0" ] }, - "4524": { + "4476": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ "maybe_value%0#1" ] }, - "4525": { + "4477": { "op": "dup", "defined_out": [ "maybe_value%0#1", @@ -42339,21 +42109,21 @@ "maybe_value%0#1 (copy)" ] }, - "4526": { + "4478": { "error": "D-ASA not configured", "op": "assert // D-ASA not configured", "stack_out": [ "maybe_value%0#1" ] }, - "4527": { + "4479": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#1", "0" ] }, - "4528": { + "4480": { "op": "bytec 10 // \"contract_type\"", "defined_out": [ "\"contract_type\"", @@ -42366,7 +42136,7 @@ "\"contract_type\"" ] }, - "4530": { + "4482": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -42379,7 +42149,7 @@ "maybe_exists%0#0" ] }, - "4531": { + "4483": { "error": "check self.contract_type exists", "op": "assert // check self.contract_type exists", "stack_out": [ @@ -42387,7 +42157,7 @@ "maybe_value%0#0" ] }, - "4532": { + "4484": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0", @@ -42398,7 +42168,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "4533": { + "4485": { "op": "dup", "defined_out": [ "aggregate%val_as_bytes%0#0", @@ -42411,7 +42181,7 @@ "aggregate%val_as_bytes%0#0 (copy)" ] }, - "4534": { + "4486": { "op": "bitlen", "defined_out": [ "aggregate%bitlen%0#0", @@ -42424,7 +42194,7 @@ "aggregate%bitlen%0#0" ] }, - "4535": { + "4487": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -42439,7 +42209,7 @@ "8" ] }, - "4536": { + "4488": { "op": "<=", "defined_out": [ "aggregate%no_overflow%0#0", @@ -42452,7 +42222,7 @@ "aggregate%no_overflow%0#0" ] }, - "4537": { + "4489": { "error": "overflow", "op": "assert // overflow", "stack_out": [ @@ -42460,7 +42230,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "4538": { + "4490": { "op": "extract 7 1", "defined_out": [ "aggregate%uint8%0#0", @@ -42471,7 +42241,7 @@ "aggregate%uint8%0#0" ] }, - "4541": { + "4493": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#1", @@ -42479,7 +42249,7 @@ "0" ] }, - "4542": { + "4494": { "op": "bytec 13 // \"total_units\"", "defined_out": [ "\"total_units\"", @@ -42494,7 +42264,7 @@ "\"total_units\"" ] }, - "4544": { + "4496": { "op": "app_global_get_ex", "defined_out": [ "aggregate%uint8%0#0", @@ -42509,7 +42279,7 @@ "maybe_exists%2#0" ] }, - "4545": { + "4497": { "error": "check self.total_units exists", "op": "assert // check self.total_units exists", "stack_out": [ @@ -42518,7 +42288,7 @@ "maybe_value%2#0" ] }, - "4546": { + "4498": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#1", @@ -42527,7 +42297,7 @@ "0" ] }, - "4547": { + "4499": { "op": "bytec 11 // \"reserved_units_total\"", "defined_out": [ "\"reserved_units_total\"", @@ -42544,7 +42314,7 @@ "\"reserved_units_total\"" ] }, - "4549": { + "4501": { "op": "app_global_get_ex", "defined_out": [ "aggregate%uint8%0#0", @@ -42561,7 +42331,7 @@ "maybe_exists%3#0" ] }, - "4550": { + "4502": { "error": "check self.reserved_units_total exists", "op": "assert // check self.reserved_units_total exists", "stack_out": [ @@ -42571,7 +42341,7 @@ "maybe_value%3#0" ] }, - "4551": { + "4503": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#1", @@ -42581,7 +42351,7 @@ "0" ] }, - "4552": { + "4504": { "op": "bytec 20 // \"initial_exchange_amount\"", "defined_out": [ "\"initial_exchange_amount\"", @@ -42600,7 +42370,7 @@ "\"initial_exchange_amount\"" ] }, - "4554": { + "4506": { "op": "app_global_get_ex", "defined_out": [ "aggregate%uint8%0#0", @@ -42619,7 +42389,7 @@ "maybe_exists%4#0" ] }, - "4555": { + "4507": { "error": "check self.initial_exchange_amount exists", "op": "assert // check self.initial_exchange_amount exists", "stack_out": [ @@ -42630,7 +42400,7 @@ "maybe_value%4#0" ] }, - "4556": { + "4508": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#1", @@ -42641,7 +42411,7 @@ "0" ] }, - "4557": { + "4509": { "op": "bytec_2 // \"event_cursor\"", "defined_out": [ "\"event_cursor\"", @@ -42662,7 +42432,7 @@ "\"event_cursor\"" ] }, - "4558": { + "4510": { "op": "app_global_get_ex", "defined_out": [ "aggregate%uint8%0#0", @@ -42683,7 +42453,7 @@ "maybe_exists%5#0" ] }, - "4559": { + "4511": { "error": "check self.event_cursor exists", "op": "assert // check self.event_cursor exists", "stack_out": [ @@ -42695,7 +42465,7 @@ "maybe_value%5#0" ] }, - "4560": { + "4512": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#1", @@ -42707,7 +42477,7 @@ "0" ] }, - "4561": { + "4513": { "op": "bytec_3 // \"schedule_entry_count\"", "defined_out": [ "\"schedule_entry_count\"", @@ -42730,7 +42500,7 @@ "\"schedule_entry_count\"" ] }, - "4562": { + "4514": { "op": "app_global_get_ex", "defined_out": [ "aggregate%uint8%0#0", @@ -42753,7 +42523,7 @@ "maybe_exists%6#0" ] }, - "4563": { + "4515": { "error": "check self.schedule_entry_count exists", "op": "assert // check self.schedule_entry_count exists", "stack_out": [ @@ -42766,7 +42536,7 @@ "maybe_value%6#0" ] }, - "4564": { + "4516": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#1", @@ -42779,7 +42549,7 @@ "0" ] }, - "4565": { + "4517": { "op": "bytec 4 // \"outstanding_principal\"", "defined_out": [ "\"outstanding_principal\"", @@ -42804,7 +42574,7 @@ "\"outstanding_principal\"" ] }, - "4567": { + "4519": { "op": "app_global_get_ex", "defined_out": [ "aggregate%uint8%0#0", @@ -42829,7 +42599,7 @@ "maybe_exists%7#0" ] }, - "4568": { + "4520": { "error": "check self.outstanding_principal exists", "op": "assert // check self.outstanding_principal exists", "stack_out": [ @@ -42843,7 +42613,7 @@ "maybe_value%7#0" ] }, - "4569": { + "4521": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#1", @@ -42857,7 +42627,7 @@ "0" ] }, - "4570": { + "4522": { "op": "bytec 7 // \"interest_calculation_base\"", "defined_out": [ "\"interest_calculation_base\"", @@ -42884,7 +42654,7 @@ "\"interest_calculation_base\"" ] }, - "4572": { + "4524": { "op": "app_global_get_ex", "defined_out": [ "aggregate%uint8%0#0", @@ -42911,7 +42681,7 @@ "maybe_exists%8#0" ] }, - "4573": { + "4525": { "error": "check self.interest_calculation_base exists", "op": "assert // check self.interest_calculation_base exists", "stack_out": [ @@ -42926,7 +42696,7 @@ "maybe_value%8#0" ] }, - "4574": { + "4526": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#1", @@ -42941,7 +42711,7 @@ "0" ] }, - "4575": { + "4527": { "op": "bytec 9 // \"nominal_interest_rate\"", "defined_out": [ "\"nominal_interest_rate\"", @@ -42970,7 +42740,7 @@ "\"nominal_interest_rate\"" ] }, - "4577": { + "4529": { "op": "app_global_get_ex", "defined_out": [ "aggregate%uint8%0#0", @@ -42999,7 +42769,7 @@ "maybe_exists%9#0" ] }, - "4578": { + "4530": { "error": "check self.nominal_interest_rate exists", "op": "assert // check self.nominal_interest_rate exists", "stack_out": [ @@ -43015,7 +42785,7 @@ "maybe_value%9#0" ] }, - "4579": { + "4531": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#1", @@ -43031,7 +42801,7 @@ "0" ] }, - "4580": { + "4532": { "op": "bytec 6 // \"accrued_interest\"", "defined_out": [ "\"accrued_interest\"", @@ -43062,7 +42832,7 @@ "\"accrued_interest\"" ] }, - "4582": { + "4534": { "op": "app_global_get_ex", "defined_out": [ "aggregate%uint8%0#0", @@ -43093,7 +42863,7 @@ "maybe_exists%10#0" ] }, - "4583": { + "4535": { "error": "check self.accrued_interest exists", "op": "assert // check self.accrued_interest exists", "stack_out": [ @@ -43110,7 +42880,7 @@ "maybe_value%10#0" ] }, - "4584": { + "4536": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#1", @@ -43127,7 +42897,7 @@ "0" ] }, - "4585": { + "4537": { "op": "bytec 16 // \"cumulative_interest_index\"", "defined_out": [ "\"cumulative_interest_index\"", @@ -43160,7 +42930,7 @@ "\"cumulative_interest_index\"" ] }, - "4587": { + "4539": { "op": "app_global_get_ex", "defined_out": [ "aggregate%uint8%0#0", @@ -43193,7 +42963,7 @@ "maybe_exists%11#0" ] }, - "4588": { + "4540": { "error": "check self.cumulative_interest_index exists", "op": "assert // check self.cumulative_interest_index exists", "stack_out": [ @@ -43211,7 +42981,7 @@ "maybe_value%11#0" ] }, - "4589": { + "4541": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#1", @@ -43229,7 +42999,7 @@ "0" ] }, - "4590": { + "4542": { "op": "bytec 17 // \"cumulative_principal_index\"", "defined_out": [ "\"cumulative_principal_index\"", @@ -43264,7 +43034,7 @@ "\"cumulative_principal_index\"" ] }, - "4592": { + "4544": { "op": "app_global_get_ex", "defined_out": [ "aggregate%uint8%0#0", @@ -43299,7 +43069,7 @@ "maybe_exists%12#0" ] }, - "4593": { + "4545": { "error": "check self.cumulative_principal_index exists", "op": "assert // check self.cumulative_principal_index exists", "stack_out": [ @@ -43318,7 +43088,7 @@ "maybe_value%12#0" ] }, - "4594": { + "4546": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#1", @@ -43337,7 +43107,7 @@ "0" ] }, - "4595": { + "4547": { "op": "bytec 15 // \"reserved_interest\"", "defined_out": [ "\"reserved_interest\"", @@ -43374,7 +43144,7 @@ "\"reserved_interest\"" ] }, - "4597": { + "4549": { "op": "app_global_get_ex", "defined_out": [ "aggregate%uint8%0#0", @@ -43411,7 +43181,7 @@ "maybe_exists%13#0" ] }, - "4598": { + "4550": { "error": "check self.reserved_interest exists", "op": "assert // check self.reserved_interest exists", "stack_out": [ @@ -43431,7 +43201,7 @@ "maybe_value%13#0" ] }, - "4599": { + "4551": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#1", @@ -43451,7 +43221,7 @@ "0" ] }, - "4600": { + "4552": { "op": "bytec 12 // \"reserved_principal\"", "defined_out": [ "\"reserved_principal\"", @@ -43490,7 +43260,7 @@ "\"reserved_principal\"" ] }, - "4602": { + "4554": { "op": "app_global_get_ex", "defined_out": [ "aggregate%uint8%0#0", @@ -43529,7 +43299,7 @@ "maybe_exists%14#0" ] }, - "4603": { + "4555": { "error": "check self.reserved_principal exists", "op": "assert // check self.reserved_principal exists", "stack_out": [ @@ -43550,7 +43320,7 @@ "maybe_value%14#0" ] }, - "4604": { + "4556": { "op": "uncover 14", "stack_out": [ "aggregate%uint8%0#0", @@ -43570,7 +43340,7 @@ "maybe_value%0#1" ] }, - "4606": { + "4558": { "op": "itob", "defined_out": [ "aggregate%uint8%0#0", @@ -43607,7 +43377,7 @@ "aggregate%val_as_bytes%1#0" ] }, - "4607": { + "4559": { "op": "uncover 14", "stack_out": [ "maybe_value%2#0", @@ -43627,7 +43397,7 @@ "aggregate%uint8%0#0" ] }, - "4609": { + "4561": { "op": "swap", "stack_out": [ "maybe_value%2#0", @@ -43647,7 +43417,7 @@ "aggregate%val_as_bytes%1#0" ] }, - "4610": { + "4562": { "op": "concat", "defined_out": [ "aggregate%head%1#0", @@ -43682,7 +43452,7 @@ "aggregate%head%1#0" ] }, - "4611": { + "4563": { "op": "uncover 13", "stack_out": [ "maybe_value%3#0", @@ -43701,7 +43471,7 @@ "maybe_value%2#0" ] }, - "4613": { + "4565": { "op": "itob", "defined_out": [ "aggregate%head%1#0", @@ -43736,7 +43506,7 @@ "aggregate%val_as_bytes%2#0" ] }, - "4614": { + "4566": { "op": "concat", "defined_out": [ "aggregate%head%2#0", @@ -43769,7 +43539,7 @@ "aggregate%head%2#0" ] }, - "4615": { + "4567": { "op": "uncover 12", "stack_out": [ "maybe_value%4#0", @@ -43787,7 +43557,7 @@ "maybe_value%3#0" ] }, - "4617": { + "4569": { "op": "itob", "defined_out": [ "aggregate%head%2#0", @@ -43820,7 +43590,7 @@ "aggregate%val_as_bytes%3#0" ] }, - "4618": { + "4570": { "op": "concat", "defined_out": [ "aggregate%head%3#0", @@ -43851,7 +43621,7 @@ "aggregate%head%3#0" ] }, - "4619": { + "4571": { "op": "uncover 11", "stack_out": [ "maybe_value%5#0", @@ -43868,7 +43638,7 @@ "maybe_value%4#0" ] }, - "4621": { + "4573": { "op": "itob", "defined_out": [ "aggregate%head%3#0", @@ -43899,7 +43669,7 @@ "aggregate%val_as_bytes%4#0" ] }, - "4622": { + "4574": { "op": "concat", "defined_out": [ "aggregate%head%4#0", @@ -43928,7 +43698,7 @@ "aggregate%head%4#0" ] }, - "4623": { + "4575": { "op": "uncover 10", "stack_out": [ "maybe_value%6#0", @@ -43944,7 +43714,7 @@ "maybe_value%5#0" ] }, - "4625": { + "4577": { "op": "itob", "defined_out": [ "aggregate%head%4#0", @@ -43973,7 +43743,7 @@ "aggregate%val_as_bytes%5#0" ] }, - "4626": { + "4578": { "op": "concat", "defined_out": [ "aggregate%head%5#0", @@ -44000,7 +43770,7 @@ "aggregate%head%5#0" ] }, - "4627": { + "4579": { "op": "uncover 9", "stack_out": [ "maybe_value%7#0", @@ -44015,7 +43785,7 @@ "maybe_value%6#0" ] }, - "4629": { + "4581": { "op": "itob", "defined_out": [ "aggregate%head%5#0", @@ -44042,7 +43812,7 @@ "aggregate%val_as_bytes%6#0" ] }, - "4630": { + "4582": { "op": "concat", "defined_out": [ "aggregate%head%6#0", @@ -44067,7 +43837,7 @@ "aggregate%head%6#0" ] }, - "4631": { + "4583": { "op": "uncover 8", "stack_out": [ "maybe_value%8#0", @@ -44081,7 +43851,7 @@ "maybe_value%7#0" ] }, - "4633": { + "4585": { "op": "itob", "defined_out": [ "aggregate%head%6#0", @@ -44106,7 +43876,7 @@ "aggregate%val_as_bytes%7#0" ] }, - "4634": { + "4586": { "op": "concat", "defined_out": [ "aggregate%head%7#0", @@ -44129,7 +43899,7 @@ "aggregate%head%7#0" ] }, - "4635": { + "4587": { "op": "uncover 7", "stack_out": [ "maybe_value%9#0", @@ -44142,7 +43912,7 @@ "maybe_value%8#0" ] }, - "4637": { + "4589": { "op": "itob", "defined_out": [ "aggregate%head%7#0", @@ -44165,7 +43935,7 @@ "aggregate%val_as_bytes%8#0" ] }, - "4638": { + "4590": { "op": "concat", "defined_out": [ "aggregate%head%8#0", @@ -44186,7 +43956,7 @@ "aggregate%head%8#0" ] }, - "4639": { + "4591": { "op": "uncover 6", "stack_out": [ "maybe_value%10#0", @@ -44198,7 +43968,7 @@ "maybe_value%9#0" ] }, - "4641": { + "4593": { "op": "itob", "defined_out": [ "aggregate%head%8#0", @@ -44219,7 +43989,7 @@ "aggregate%val_as_bytes%9#0" ] }, - "4642": { + "4594": { "op": "concat", "defined_out": [ "aggregate%head%9#0", @@ -44238,7 +44008,7 @@ "aggregate%head%9#0" ] }, - "4643": { + "4595": { "op": "uncover 5", "stack_out": [ "maybe_value%11#0", @@ -44249,7 +44019,7 @@ "maybe_value%10#0" ] }, - "4645": { + "4597": { "op": "itob", "defined_out": [ "aggregate%head%9#0", @@ -44268,7 +44038,7 @@ "aggregate%val_as_bytes%10#0" ] }, - "4646": { + "4598": { "op": "concat", "defined_out": [ "aggregate%head%10#0", @@ -44285,7 +44055,7 @@ "aggregate%head%10#0" ] }, - "4647": { + "4599": { "op": "uncover 4", "stack_out": [ "maybe_value%12#0", @@ -44295,7 +44065,7 @@ "maybe_value%11#0" ] }, - "4649": { + "4601": { "op": "itob", "defined_out": [ "aggregate%head%10#0", @@ -44312,7 +44082,7 @@ "aggregate%val_as_bytes%11#0" ] }, - "4650": { + "4602": { "op": "concat", "defined_out": [ "aggregate%head%11#0", @@ -44327,7 +44097,7 @@ "aggregate%head%11#0" ] }, - "4651": { + "4603": { "op": "uncover 3", "stack_out": [ "maybe_value%13#0", @@ -44336,7 +44106,7 @@ "maybe_value%12#0" ] }, - "4653": { + "4605": { "op": "itob", "defined_out": [ "aggregate%head%11#0", @@ -44351,7 +44121,7 @@ "aggregate%val_as_bytes%12#0" ] }, - "4654": { + "4606": { "op": "concat", "defined_out": [ "aggregate%head%12#0", @@ -44364,7 +44134,7 @@ "aggregate%head%12#0" ] }, - "4655": { + "4607": { "op": "uncover 2", "stack_out": [ "maybe_value%14#0", @@ -44372,7 +44142,7 @@ "maybe_value%13#0" ] }, - "4657": { + "4609": { "op": "itob", "defined_out": [ "aggregate%head%12#0", @@ -44385,7 +44155,7 @@ "aggregate%val_as_bytes%13#0" ] }, - "4658": { + "4610": { "op": "concat", "defined_out": [ "aggregate%head%13#0", @@ -44396,14 +44166,14 @@ "aggregate%head%13#0" ] }, - "4659": { + "4611": { "op": "swap", "stack_out": [ "aggregate%head%13#0", "maybe_value%14#0" ] }, - "4660": { + "4612": { "op": "itob", "defined_out": [ "aggregate%head%13#0", @@ -44414,7 +44184,7 @@ "aggregate%val_as_bytes%14#0" ] }, - "4661": { + "4613": { "op": "concat", "defined_out": [ "aggregate%head%14#0" @@ -44423,7 +44193,7 @@ "aggregate%head%14#0" ] }, - "4662": { + "4614": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -44434,14 +44204,14 @@ "0x151f7c75" ] }, - "4663": { + "4615": { "op": "swap", "stack_out": [ "0x151f7c75", "aggregate%head%14#0" ] }, - "4664": { + "4616": { "op": "concat", "defined_out": [ "tmp%1#0" @@ -44450,11 +44220,11 @@ "tmp%1#0" ] }, - "4665": { + "4617": { "op": "log", "stack_out": [] }, - "4666": { + "4618": { "op": "intc_1 // 1", "defined_out": [ "1" @@ -44463,11 +44233,11 @@ "1" ] }, - "4667": { + "4619": { "op": "return", "stack_out": [] }, - "4668": { + "4620": { "subroutine": "modules.actus_kernel.ActusKernelModule.contract_get_next_due_event[routing]", "params": {}, "block": "contract_get_next_due_event", @@ -44480,7 +44250,7 @@ "0" ] }, - "4669": { + "4621": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"", @@ -44491,7 +44261,7 @@ "\"status\"" ] }, - "4670": { + "4622": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -44502,25 +44272,25 @@ "maybe_exists%0#0" ] }, - "4671": { + "4623": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ "maybe_value%0#0" ] }, - "4672": { + "4624": { "error": "D-ASA not configured", "op": "assert // D-ASA not configured", "stack_out": [] }, - "4673": { + "4625": { "op": "intc_0 // 0", "stack_out": [ "0" ] }, - "4674": { + "4626": { "op": "bytec_2 // \"event_cursor\"", "defined_out": [ "\"event_cursor\"", @@ -44531,28 +44301,28 @@ "\"event_cursor\"" ] }, - "4675": { + "4627": { "op": "app_global_get_ex", "stack_out": [ "maybe_value%0#0", "maybe_exists%0#0" ] }, - "4676": { + "4628": { "error": "check self.event_cursor exists", "op": "assert // check self.event_cursor exists", "stack_out": [ "maybe_value%0#0" ] }, - "4677": { + "4629": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#0", "0" ] }, - "4678": { + "4630": { "op": "bytec_3 // \"schedule_entry_count\"", "defined_out": [ "\"schedule_entry_count\"", @@ -44565,7 +44335,7 @@ "\"schedule_entry_count\"" ] }, - "4679": { + "4631": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%1#0", @@ -44578,7 +44348,7 @@ "maybe_exists%1#0" ] }, - "4680": { + "4632": { "error": "check self.schedule_entry_count exists", "op": "assert // check self.schedule_entry_count exists", "stack_out": [ @@ -44586,7 +44356,7 @@ "maybe_value%1#0" ] }, - "4681": { + "4633": { "op": ">=", "defined_out": [ "tmp%0#1" @@ -44595,24 +44365,24 @@ "tmp%0#1" ] }, - "4682": { + "4634": { "op": "bz contract_get_next_due_event_after_if_else@3", "stack_out": [] }, - "4685": { + "4637": { "op": "intc_0 // 0", "stack_out": [ "0" ] }, - "4686": { + "4638": { "op": "bytec_2 // \"event_cursor\"", "stack_out": [ "0", "\"event_cursor\"" ] }, - "4687": { + "4639": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%2#0", @@ -44623,14 +44393,14 @@ "maybe_exists%2#0" ] }, - "4688": { + "4640": { "error": "check self.event_cursor exists", "op": "assert // check self.event_cursor exists", "stack_out": [ "maybe_value%2#0" ] }, - "4689": { + "4641": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0" @@ -44639,8 +44409,8 @@ "aggregate%val_as_bytes%0#0" ] }, - "4690": { - "op": "bytec 40 // 0x00", + "4642": { + "op": "bytec 41 // 0x00", "defined_out": [ "0x00", "aggregate%val_as_bytes%0#0" @@ -44650,7 +44420,7 @@ "0x00" ] }, - "4692": { + "4644": { "op": "concat", "defined_out": [ "aggregate%head%1#0" @@ -44659,14 +44429,14 @@ "aggregate%head%1#0" ] }, - "4693": { + "4645": { "op": "intc_0 // 0", "stack_out": [ "aggregate%head%1#0", "0" ] }, - "4694": { + "4646": { "op": "itob", "defined_out": [ "aggregate%head%1#0", @@ -44677,14 +44447,14 @@ "aggregate%val_as_bytes%1#0" ] }, - "4695": { + "4647": { "op": "swap", "stack_out": [ "aggregate%val_as_bytes%1#0", "aggregate%head%1#0" ] }, - "4696": { + "4648": { "op": "dig 1", "defined_out": [ "aggregate%head%1#0", @@ -44697,7 +44467,7 @@ "aggregate%val_as_bytes%1#0 (copy)" ] }, - "4698": { + "4650": { "op": "concat", "defined_out": [ "aggregate%head%2#0", @@ -44708,7 +44478,7 @@ "aggregate%head%2#0" ] }, - "4699": { + "4651": { "op": "dig 1", "stack_out": [ "aggregate%val_as_bytes%1#0", @@ -44716,7 +44486,7 @@ "aggregate%val_as_bytes%1#0 (copy)" ] }, - "4701": { + "4653": { "op": "concat", "defined_out": [ "aggregate%head%3#0", @@ -44727,7 +44497,7 @@ "aggregate%head%3#0" ] }, - "4702": { + "4654": { "op": "dig 1", "stack_out": [ "aggregate%val_as_bytes%1#0", @@ -44735,7 +44505,7 @@ "aggregate%val_as_bytes%1#0 (copy)" ] }, - "4704": { + "4656": { "op": "concat", "defined_out": [ "aggregate%head%4#0", @@ -44746,7 +44516,7 @@ "aggregate%head%4#0" ] }, - "4705": { + "4657": { "op": "dig 1", "stack_out": [ "aggregate%val_as_bytes%1#0", @@ -44754,7 +44524,7 @@ "aggregate%val_as_bytes%1#0 (copy)" ] }, - "4707": { + "4659": { "op": "concat", "defined_out": [ "aggregate%head%5#0", @@ -44765,7 +44535,7 @@ "aggregate%head%5#0" ] }, - "4708": { + "4660": { "op": "dig 1", "stack_out": [ "aggregate%val_as_bytes%1#0", @@ -44773,7 +44543,7 @@ "aggregate%val_as_bytes%1#0 (copy)" ] }, - "4710": { + "4662": { "op": "concat", "defined_out": [ "aggregate%head%6#0", @@ -44784,7 +44554,7 @@ "aggregate%head%6#0" ] }, - "4711": { + "4663": { "op": "dig 1", "stack_out": [ "aggregate%val_as_bytes%1#0", @@ -44792,7 +44562,7 @@ "aggregate%val_as_bytes%1#0 (copy)" ] }, - "4713": { + "4665": { "op": "concat", "defined_out": [ "aggregate%head%7#0", @@ -44803,14 +44573,14 @@ "aggregate%head%7#0" ] }, - "4714": { + "4666": { "op": "swap", "stack_out": [ "aggregate%head%7#0", "aggregate%val_as_bytes%1#0" ] }, - "4715": { + "4667": { "op": "concat", "defined_out": [ "tmp%0#0" @@ -44819,7 +44589,7 @@ "tmp%0#0" ] }, - "4716": { + "4668": { "block": "contract_get_next_due_event_after_inlined_modules.actus_kernel.ActusKernelModule.contract_get_next_due_event@4", "stack_in": [ "tmp%0#0" @@ -44833,7 +44603,7 @@ "0x151f7c75" ] }, - "4717": { + "4669": { "op": "swap", "defined_out": [ "0x151f7c75", @@ -44844,7 +44614,7 @@ "tmp%0#0" ] }, - "4718": { + "4670": { "op": "concat", "defined_out": [ "tmp%1#0" @@ -44853,11 +44623,11 @@ "tmp%1#0" ] }, - "4719": { + "4671": { "op": "log", "stack_out": [] }, - "4720": { + "4672": { "op": "intc_1 // 1", "defined_out": [ "1" @@ -44866,11 +44636,11 @@ "1" ] }, - "4721": { + "4673": { "op": "return", "stack_out": [] }, - "4722": { + "4674": { "block": "contract_get_next_due_event_after_if_else@3", "stack_in": [], "op": "intc_0 // 0", @@ -44881,7 +44651,7 @@ "0" ] }, - "4723": { + "4675": { "op": "bytec_2 // \"event_cursor\"", "defined_out": [ "\"event_cursor\"", @@ -44892,7 +44662,7 @@ "\"event_cursor\"" ] }, - "4724": { + "4676": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%3#0", @@ -44903,14 +44673,14 @@ "maybe_exists%3#0" ] }, - "4725": { + "4677": { "error": "check self.event_cursor exists", "op": "assert // check self.event_cursor exists", "stack_out": [ "maybe_value%3#0" ] }, - "4726": { + "4678": { "callsub": "modules.actus_kernel.ActusKernelModule._get_schedule_entry", "op": "callsub _get_schedule_entry", "defined_out": [ @@ -44920,10 +44690,10 @@ "tmp%0#0" ] }, - "4729": { + "4681": { "op": "b contract_get_next_due_event_after_inlined_modules.actus_kernel.ActusKernelModule.contract_get_next_due_event@4" }, - "4732": { + "4684": { "subroutine": "modules.rbac.RbacModule.contract_update[routing]", "params": {}, "block": "contract_update", @@ -44931,7 +44701,7 @@ "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", "op": "callsub _assert_caller_is_arranger" }, - "4735": { + "4687": { "op": "intc_1 // 1", "defined_out": [ "1" @@ -44940,11 +44710,11 @@ "1" ] }, - "4736": { + "4688": { "op": "return", "stack_out": [] }, - "4737": { + "4689": { "subroutine": "modules.rbac.RbacModule.rbac_rotate_arranger[routing]", "params": {}, "block": "rbac_rotate_arranger", @@ -44957,7 +44727,7 @@ "new_arranger#0" ] }, - "4740": { + "4692": { "op": "dup", "defined_out": [ "new_arranger#0", @@ -44968,7 +44738,7 @@ "new_arranger#0 (copy)" ] }, - "4741": { + "4693": { "op": "len", "defined_out": [ "len%0#0", @@ -44979,7 +44749,7 @@ "len%0#0" ] }, - "4742": { + "4694": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -44992,7 +44762,7 @@ "32" ] }, - "4743": { + "4695": { "op": "==", "defined_out": [ "eq%0#0", @@ -45003,18 +44773,18 @@ "eq%0#0" ] }, - "4744": { + "4696": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ "new_arranger#0" ] }, - "4745": { + "4697": { "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", "op": "callsub _assert_caller_is_arranger" }, - "4748": { + "4700": { "op": "bytec 18 // 0x523a41525223", "defined_out": [ "0x523a41525223", @@ -45025,18 +44795,18 @@ "0x523a41525223" ] }, - "4750": { + "4702": { "op": "swap", "stack_out": [ "0x523a41525223", "new_arranger#0" ] }, - "4751": { + "4703": { "op": "app_global_put", "stack_out": [] }, - "4752": { + "4704": { "op": "global LatestTimestamp", "defined_out": [ "tmp%0#1" @@ -45045,7 +44815,7 @@ "tmp%0#1" ] }, - "4754": { + "4706": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0" @@ -45054,7 +44824,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "4755": { + "4707": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -45065,14 +44835,14 @@ "0x151f7c75" ] }, - "4756": { + "4708": { "op": "swap", "stack_out": [ "0x151f7c75", "aggregate%val_as_bytes%0#0" ] }, - "4757": { + "4709": { "op": "concat", "defined_out": [ "tmp%4#0" @@ -45081,11 +44851,11 @@ "tmp%4#0" ] }, - "4758": { + "4710": { "op": "log", "stack_out": [] }, - "4759": { + "4711": { "op": "intc_1 // 1", "defined_out": [ "1" @@ -45094,11 +44864,11 @@ "1" ] }, - "4760": { + "4712": { "op": "return", "stack_out": [] }, - "4761": { + "4713": { "subroutine": "modules.rbac.RbacModule.rbac_set_op_daemon[routing]", "params": {}, "block": "rbac_set_op_daemon", @@ -45111,7 +44881,7 @@ "address#0" ] }, - "4764": { + "4716": { "op": "dup", "defined_out": [ "address#0", @@ -45122,7 +44892,7 @@ "address#0 (copy)" ] }, - "4765": { + "4717": { "op": "len", "defined_out": [ "address#0", @@ -45133,7 +44903,7 @@ "len%0#0" ] }, - "4766": { + "4718": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -45146,7 +44916,7 @@ "32" ] }, - "4767": { + "4719": { "op": "==", "defined_out": [ "address#0", @@ -45157,18 +44927,18 @@ "eq%0#0" ] }, - "4768": { + "4720": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ "address#0" ] }, - "4769": { + "4721": { "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", "op": "callsub _assert_caller_is_arranger" }, - "4772": { + "4724": { "op": "bytec 27 // 0x523a4f504423", "defined_out": [ "0x523a4f504423", @@ -45179,18 +44949,18 @@ "0x523a4f504423" ] }, - "4774": { + "4726": { "op": "swap", "stack_out": [ "0x523a4f504423", "address#0" ] }, - "4775": { + "4727": { "op": "app_global_put", "stack_out": [] }, - "4776": { + "4728": { "op": "global LatestTimestamp", "defined_out": [ "tmp%0#1" @@ -45199,7 +44969,7 @@ "tmp%0#1" ] }, - "4778": { + "4730": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0" @@ -45208,7 +44978,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "4779": { + "4731": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -45219,14 +44989,14 @@ "0x151f7c75" ] }, - "4780": { + "4732": { "op": "swap", "stack_out": [ "0x151f7c75", "aggregate%val_as_bytes%0#0" ] }, - "4781": { + "4733": { "op": "concat", "defined_out": [ "tmp%4#0" @@ -45235,11 +45005,11 @@ "tmp%4#0" ] }, - "4782": { + "4734": { "op": "log", "stack_out": [] }, - "4783": { + "4735": { "op": "intc_1 // 1", "defined_out": [ "1" @@ -45248,11 +45018,11 @@ "1" ] }, - "4784": { + "4736": { "op": "return", "stack_out": [] }, - "4785": { + "4737": { "subroutine": "modules.rbac.RbacModule.rbac_assign_role[routing]", "params": {}, "block": "rbac_assign_role", @@ -45265,7 +45035,7 @@ "role_id#0" ] }, - "4788": { + "4740": { "op": "dup", "defined_out": [ "role_id#0", @@ -45276,7 +45046,7 @@ "role_id#0 (copy)" ] }, - "4789": { + "4741": { "op": "len", "defined_out": [ "len%0#0", @@ -45287,7 +45057,7 @@ "len%0#0" ] }, - "4790": { + "4742": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -45300,7 +45070,7 @@ "1" ] }, - "4791": { + "4743": { "op": "==", "defined_out": [ "eq%0#0", @@ -45311,17 +45081,17 @@ "eq%0#0" ] }, - "4792": { + "4744": { "error": "invalid number of bytes for arc4.uint8", "op": "assert // invalid number of bytes for arc4.uint8", "stack_out": [ "role_id#0" ] }, - "4793": { + "4745": { "op": "txna ApplicationArgs 2" }, - "4796": { + "4748": { "op": "dup", "defined_out": [ "role_address#0", @@ -45333,7 +45103,7 @@ "role_address#0" ] }, - "4797": { + "4749": { "op": "cover 2", "defined_out": [ "role_address#0", @@ -45345,7 +45115,7 @@ "role_address#0" ] }, - "4799": { + "4751": { "op": "len", "defined_out": [ "len%1#0", @@ -45358,7 +45128,7 @@ "len%1#0" ] }, - "4800": { + "4752": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -45373,7 +45143,7 @@ "32" ] }, - "4801": { + "4753": { "op": "==", "defined_out": [ "eq%1#0", @@ -45386,7 +45156,7 @@ "eq%1#0" ] }, - "4802": { + "4754": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ @@ -45394,10 +45164,10 @@ "role_id#0" ] }, - "4803": { + "4755": { "op": "txna ApplicationArgs 3" }, - "4806": { + "4758": { "op": "dup", "defined_out": [ "role_address#0", @@ -45411,7 +45181,7 @@ "validity#0" ] }, - "4807": { + "4759": { "op": "cover 2", "defined_out": [ "role_address#0", @@ -45425,7 +45195,7 @@ "validity#0" ] }, - "4809": { + "4761": { "op": "len", "defined_out": [ "len%2#0", @@ -45440,7 +45210,7 @@ "len%2#0" ] }, - "4810": { + "4762": { "op": "pushint 16", "defined_out": [ "16", @@ -45457,7 +45227,7 @@ "16" ] }, - "4812": { + "4764": { "op": "==", "defined_out": [ "eq%2#0", @@ -45472,7 +45242,7 @@ "eq%2#0" ] }, - "4813": { + "4765": { "error": "invalid number of bytes for smart_contracts.abi_types.RoleValidity", "op": "assert // invalid number of bytes for smart_contracts.abi_types.RoleValidity", "stack_out": [ @@ -45481,15 +45251,15 @@ "role_id#0" ] }, - "4814": { + "4766": { "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", "op": "callsub _assert_caller_is_arranger" }, - "4817": { + "4769": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", "op": "callsub _assert_is_not_asset_defaulted" }, - "4820": { + "4772": { "op": "btoi", "defined_out": [ "role_address#0", @@ -45502,7 +45272,7 @@ "role_id#1" ] }, - "4821": { + "4773": { "op": "dupn 2", "defined_out": [ "role_address#0", @@ -45518,7 +45288,7 @@ "role_id#1 (copy)" ] }, - "4823": { + "4775": { "callsub": "modules.rbac.RbacModule._assert_valid_role", "op": "callsub _assert_valid_role", "stack_out": [ @@ -45528,7 +45298,7 @@ "role_id#1" ] }, - "4826": { + "4778": { "op": "pushint 20", "defined_out": [ "20", @@ -45544,7 +45314,7 @@ "20" ] }, - "4828": { + "4780": { "op": "==", "defined_out": [ "role_address#0", @@ -45559,7 +45329,7 @@ "tmp%0#2" ] }, - "4829": { + "4781": { "op": "bz rbac_assign_role_after_if_else@3", "stack_out": [ "role_address#0", @@ -45567,7 +45337,7 @@ "role_id#1" ] }, - "4832": { + "4784": { "op": "bytec 18 // 0x523a41525223", "defined_out": [ "0x523a41525223", @@ -45582,7 +45352,7 @@ "0x523a41525223" ] }, - "4834": { + "4786": { "op": "dig 3", "stack_out": [ "role_address#0", @@ -45592,7 +45362,7 @@ "role_address#0" ] }, - "4836": { + "4788": { "op": "app_global_put", "stack_out": [ "role_address#0", @@ -45600,7 +45370,7 @@ "role_id#1" ] }, - "4837": { + "4789": { "block": "rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14", "stack_in": [ "role_address#0", @@ -45618,7 +45388,7 @@ "tmp%2#1" ] }, - "4839": { + "4791": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0" @@ -45630,7 +45400,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "4840": { + "4792": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -45644,7 +45414,7 @@ "0x151f7c75" ] }, - "4841": { + "4793": { "op": "swap", "stack_out": [ "role_address#0", @@ -45654,7 +45424,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "4842": { + "4794": { "op": "concat", "defined_out": [ "tmp%6#0" @@ -45666,7 +45436,7 @@ "tmp%6#0" ] }, - "4843": { + "4795": { "op": "log", "stack_out": [ "role_address#0", @@ -45674,7 +45444,7 @@ "role_id#1" ] }, - "4844": { + "4796": { "op": "intc_1 // 1", "defined_out": [ "1" @@ -45686,7 +45456,7 @@ "1" ] }, - "4845": { + "4797": { "op": "return", "stack_out": [ "role_address#0", @@ -45694,7 +45464,7 @@ "role_id#1" ] }, - "4846": { + "4798": { "block": "rbac_assign_role_after_if_else@3", "stack_in": [ "role_address#0", @@ -45712,7 +45482,7 @@ "role_id#1" ] }, - "4847": { + "4799": { "op": "pushint 40", "defined_out": [ "40", @@ -45726,7 +45496,7 @@ "40" ] }, - "4849": { + "4801": { "op": "==", "defined_out": [ "role_id#1", @@ -45739,7 +45509,7 @@ "tmp%1#1" ] }, - "4850": { + "4802": { "op": "bz rbac_assign_role_after_if_else@5", "stack_out": [ "role_address#0", @@ -45747,7 +45517,7 @@ "role_id#1" ] }, - "4853": { + "4805": { "op": "bytec 23 // 0x523a4d4e4723", "defined_out": [ "0x523a4d4e4723", @@ -45760,7 +45530,7 @@ "0x523a4d4e4723" ] }, - "4855": { + "4807": { "op": "dig 3", "defined_out": [ "0x523a4d4e4723", @@ -45775,7 +45545,7 @@ "role_address#0" ] }, - "4857": { + "4809": { "op": "concat", "defined_out": [ "box_prefixed_key%0#0", @@ -45789,7 +45559,7 @@ "box_prefixed_key%0#0" ] }, - "4858": { + "4810": { "op": "dup", "defined_out": [ "box_prefixed_key%0#0", @@ -45805,7 +45575,7 @@ "box_prefixed_key%0#0 (copy)" ] }, - "4859": { + "4811": { "op": "box_len", "defined_out": [ "_%0#0", @@ -45823,7 +45593,7 @@ "maybe_exists%0#0" ] }, - "4860": { + "4812": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -45833,7 +45603,7 @@ "maybe_exists%0#0" ] }, - "4862": { + "4814": { "op": "!", "defined_out": [ "box_prefixed_key%0#0", @@ -45849,7 +45619,7 @@ "tmp%2#2" ] }, - "4863": { + "4815": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -45859,7 +45629,7 @@ "box_prefixed_key%0#0" ] }, - "4864": { + "4816": { "op": "dig 2", "defined_out": [ "box_prefixed_key%0#0", @@ -45875,7 +45645,7 @@ "validity#0" ] }, - "4866": { + "4818": { "op": "box_put", "stack_out": [ "role_address#0", @@ -45883,10 +45653,10 @@ "role_id#1" ] }, - "4867": { + "4819": { "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14" }, - "4870": { + "4822": { "block": "rbac_assign_role_after_if_else@5", "stack_in": [ "role_address#0", @@ -45904,7 +45674,7 @@ "role_id#1" ] }, - "4871": { + "4823": { "op": "pushint 50", "defined_out": [ "50", @@ -45918,7 +45688,7 @@ "50" ] }, - "4873": { + "4825": { "op": "==", "defined_out": [ "role_id#1", @@ -45931,7 +45701,7 @@ "tmp%3#0" ] }, - "4874": { + "4826": { "op": "bz rbac_assign_role_after_if_else@7", "stack_out": [ "role_address#0", @@ -45939,7 +45709,7 @@ "role_id#1" ] }, - "4877": { + "4829": { "op": "bytec 22 // 0x523a50594423", "defined_out": [ "0x523a50594423", @@ -45952,7 +45722,7 @@ "0x523a50594423" ] }, - "4879": { + "4831": { "op": "dig 3", "defined_out": [ "0x523a50594423", @@ -45967,7 +45737,7 @@ "role_address#0" ] }, - "4881": { + "4833": { "op": "concat", "defined_out": [ "box_prefixed_key%2#0", @@ -45981,7 +45751,7 @@ "box_prefixed_key%2#0" ] }, - "4882": { + "4834": { "op": "dup", "defined_out": [ "box_prefixed_key%2#0", @@ -45997,7 +45767,7 @@ "box_prefixed_key%2#0 (copy)" ] }, - "4883": { + "4835": { "op": "box_len", "defined_out": [ "_%1#0", @@ -46015,7 +45785,7 @@ "maybe_exists%1#0" ] }, - "4884": { + "4836": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -46025,7 +45795,7 @@ "maybe_exists%1#0" ] }, - "4886": { + "4838": { "op": "!", "defined_out": [ "box_prefixed_key%2#0", @@ -46041,7 +45811,7 @@ "tmp%4#0" ] }, - "4887": { + "4839": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -46051,7 +45821,7 @@ "box_prefixed_key%2#0" ] }, - "4888": { + "4840": { "op": "dig 2", "defined_out": [ "box_prefixed_key%2#0", @@ -46067,7 +45837,7 @@ "validity#0" ] }, - "4890": { + "4842": { "op": "box_put", "stack_out": [ "role_address#0", @@ -46075,10 +45845,10 @@ "role_id#1" ] }, - "4891": { + "4843": { "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14" }, - "4894": { + "4846": { "block": "rbac_assign_role_after_if_else@7", "stack_in": [ "role_address#0", @@ -46096,7 +45866,7 @@ "role_id#1" ] }, - "4895": { + "4847": { "op": "pushint 60", "defined_out": [ "60", @@ -46110,7 +45880,7 @@ "60" ] }, - "4897": { + "4849": { "op": "==", "defined_out": [ "role_id#1", @@ -46123,7 +45893,7 @@ "tmp%5#1" ] }, - "4898": { + "4850": { "op": "bz rbac_assign_role_after_if_else@9", "stack_out": [ "role_address#0", @@ -46131,7 +45901,7 @@ "role_id#1" ] }, - "4901": { + "4853": { "op": "bytec 26 // 0x523a54525323", "defined_out": [ "0x523a54525323", @@ -46144,7 +45914,7 @@ "0x523a54525323" ] }, - "4903": { + "4855": { "op": "dig 3", "defined_out": [ "0x523a54525323", @@ -46159,7 +45929,7 @@ "role_address#0" ] }, - "4905": { + "4857": { "op": "concat", "defined_out": [ "box_prefixed_key%4#0", @@ -46173,7 +45943,7 @@ "box_prefixed_key%4#0" ] }, - "4906": { + "4858": { "op": "dup", "defined_out": [ "box_prefixed_key%4#0", @@ -46189,7 +45959,7 @@ "box_prefixed_key%4#0 (copy)" ] }, - "4907": { + "4859": { "op": "box_len", "defined_out": [ "_%2#0", @@ -46207,7 +45977,7 @@ "maybe_exists%2#0" ] }, - "4908": { + "4860": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -46217,7 +45987,7 @@ "maybe_exists%2#0" ] }, - "4910": { + "4862": { "op": "!", "defined_out": [ "box_prefixed_key%4#0", @@ -46233,7 +46003,7 @@ "tmp%6#1" ] }, - "4911": { + "4863": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -46243,7 +46013,7 @@ "box_prefixed_key%4#0" ] }, - "4912": { + "4864": { "op": "dig 2", "defined_out": [ "box_prefixed_key%4#0", @@ -46259,7 +46029,7 @@ "validity#0" ] }, - "4914": { + "4866": { "op": "box_put", "stack_out": [ "role_address#0", @@ -46267,10 +46037,10 @@ "role_id#1" ] }, - "4915": { + "4867": { "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14" }, - "4918": { + "4870": { "block": "rbac_assign_role_after_if_else@9", "stack_in": [ "role_address#0", @@ -46288,7 +46058,7 @@ "role_id#1" ] }, - "4919": { + "4871": { "op": "pushint 70", "defined_out": [ "70", @@ -46302,7 +46072,7 @@ "70" ] }, - "4921": { + "4873": { "op": "==", "defined_out": [ "role_id#1", @@ -46315,7 +46085,7 @@ "tmp%7#0" ] }, - "4922": { + "4874": { "op": "bz rbac_assign_role_after_if_else@11", "stack_out": [ "role_address#0", @@ -46323,7 +46093,7 @@ "role_id#1" ] }, - "4925": { + "4877": { "op": "bytec 21 // 0x523a41555423", "defined_out": [ "0x523a41555423", @@ -46336,7 +46106,7 @@ "0x523a41555423" ] }, - "4927": { + "4879": { "op": "dig 3", "defined_out": [ "0x523a41555423", @@ -46351,7 +46121,7 @@ "role_address#0" ] }, - "4929": { + "4881": { "op": "concat", "defined_out": [ "box_prefixed_key%6#0", @@ -46365,7 +46135,7 @@ "box_prefixed_key%6#0" ] }, - "4930": { + "4882": { "op": "dup", "defined_out": [ "box_prefixed_key%6#0", @@ -46381,7 +46151,7 @@ "box_prefixed_key%6#0 (copy)" ] }, - "4931": { + "4883": { "op": "box_len", "defined_out": [ "_%3#0", @@ -46399,7 +46169,7 @@ "maybe_exists%3#0" ] }, - "4932": { + "4884": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -46409,7 +46179,7 @@ "maybe_exists%3#0" ] }, - "4934": { + "4886": { "op": "!", "defined_out": [ "box_prefixed_key%6#0", @@ -46425,7 +46195,7 @@ "tmp%8#0" ] }, - "4935": { + "4887": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -46435,7 +46205,7 @@ "box_prefixed_key%6#0" ] }, - "4936": { + "4888": { "op": "dig 2", "defined_out": [ "box_prefixed_key%6#0", @@ -46451,7 +46221,7 @@ "validity#0" ] }, - "4938": { + "4890": { "op": "box_put", "stack_out": [ "role_address#0", @@ -46459,10 +46229,10 @@ "role_id#1" ] }, - "4939": { + "4891": { "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14" }, - "4942": { + "4894": { "block": "rbac_assign_role_after_if_else@11", "stack_in": [ "role_address#0", @@ -46480,7 +46250,7 @@ "role_id#1" ] }, - "4943": { + "4895": { "op": "pushint 80", "defined_out": [ "80", @@ -46494,7 +46264,7 @@ "80" ] }, - "4945": { + "4897": { "op": "==", "defined_out": [ "role_id#1", @@ -46507,7 +46277,7 @@ "tmp%9#0" ] }, - "4946": { + "4898": { "op": "bz rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14", "stack_out": [ "role_address#0", @@ -46515,7 +46285,7 @@ "role_id#1" ] }, - "4949": { + "4901": { "op": "bytec 25 // 0x523a4d4f4323", "defined_out": [ "0x523a4d4f4323", @@ -46528,7 +46298,7 @@ "0x523a4d4f4323" ] }, - "4951": { + "4903": { "op": "dig 3", "defined_out": [ "0x523a4d4f4323", @@ -46543,7 +46313,7 @@ "role_address#0" ] }, - "4953": { + "4905": { "op": "concat", "defined_out": [ "box_prefixed_key%8#0", @@ -46557,7 +46327,7 @@ "box_prefixed_key%8#0" ] }, - "4954": { + "4906": { "op": "dup", "defined_out": [ "box_prefixed_key%8#0", @@ -46573,7 +46343,7 @@ "box_prefixed_key%8#0 (copy)" ] }, - "4955": { + "4907": { "op": "box_len", "defined_out": [ "_%4#0", @@ -46591,7 +46361,7 @@ "maybe_exists%4#0" ] }, - "4956": { + "4908": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -46601,7 +46371,7 @@ "maybe_exists%4#0" ] }, - "4958": { + "4910": { "op": "!", "defined_out": [ "box_prefixed_key%8#0", @@ -46617,7 +46387,7 @@ "tmp%10#0" ] }, - "4959": { + "4911": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -46627,7 +46397,7 @@ "box_prefixed_key%8#0" ] }, - "4960": { + "4912": { "op": "dig 2", "defined_out": [ "box_prefixed_key%8#0", @@ -46643,7 +46413,7 @@ "validity#0" ] }, - "4962": { + "4914": { "op": "box_put", "stack_out": [ "role_address#0", @@ -46651,10 +46421,10 @@ "role_id#1" ] }, - "4963": { + "4915": { "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14" }, - "4966": { + "4918": { "subroutine": "modules.rbac.RbacModule.rbac_revoke_role[routing]", "params": {}, "block": "rbac_revoke_role", @@ -46667,7 +46437,7 @@ "role_id#0" ] }, - "4969": { + "4921": { "op": "dup", "defined_out": [ "role_id#0", @@ -46678,7 +46448,7 @@ "role_id#0 (copy)" ] }, - "4970": { + "4922": { "op": "len", "defined_out": [ "len%0#0", @@ -46689,7 +46459,7 @@ "len%0#0" ] }, - "4971": { + "4923": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -46702,7 +46472,7 @@ "1" ] }, - "4972": { + "4924": { "op": "==", "defined_out": [ "eq%0#0", @@ -46713,17 +46483,17 @@ "eq%0#0" ] }, - "4973": { + "4925": { "error": "invalid number of bytes for arc4.uint8", "op": "assert // invalid number of bytes for arc4.uint8", "stack_out": [ "role_id#0" ] }, - "4974": { + "4926": { "op": "txna ApplicationArgs 2" }, - "4977": { + "4929": { "op": "dup", "defined_out": [ "role_address#0", @@ -46735,7 +46505,7 @@ "role_address#0" ] }, - "4978": { + "4930": { "op": "cover 2", "defined_out": [ "role_address#0", @@ -46747,7 +46517,7 @@ "role_address#0" ] }, - "4980": { + "4932": { "op": "len", "defined_out": [ "len%1#0", @@ -46760,7 +46530,7 @@ "len%1#0" ] }, - "4981": { + "4933": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -46775,7 +46545,7 @@ "32" ] }, - "4982": { + "4934": { "op": "==", "defined_out": [ "eq%1#0", @@ -46788,7 +46558,7 @@ "eq%1#0" ] }, - "4983": { + "4935": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ @@ -46796,15 +46566,15 @@ "role_id#0" ] }, - "4984": { + "4936": { "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", "op": "callsub _assert_caller_is_arranger" }, - "4987": { + "4939": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", "op": "callsub _assert_is_not_asset_defaulted" }, - "4990": { + "4942": { "op": "btoi", "defined_out": [ "role_address#0", @@ -46815,7 +46585,7 @@ "role_id#1" ] }, - "4991": { + "4943": { "op": "dupn 2", "defined_out": [ "role_address#0", @@ -46829,7 +46599,7 @@ "role_id#1 (copy)" ] }, - "4993": { + "4945": { "callsub": "modules.rbac.RbacModule._assert_valid_role", "op": "callsub _assert_valid_role", "stack_out": [ @@ -46838,7 +46608,7 @@ "role_id#1" ] }, - "4996": { + "4948": { "op": "dup", "stack_out": [ "role_address#0", @@ -46847,7 +46617,7 @@ "role_id#1 (copy)" ] }, - "4997": { + "4949": { "op": "pushint 20", "defined_out": [ "20", @@ -46863,7 +46633,7 @@ "20" ] }, - "4999": { + "4951": { "op": "!=", "defined_out": [ "role_address#0", @@ -46877,7 +46647,7 @@ "tmp%0#2" ] }, - "5000": { + "4952": { "error": "Invalid role identifier", "op": "assert // Invalid role identifier", "stack_out": [ @@ -46886,7 +46656,7 @@ "role_id#1" ] }, - "5001": { + "4953": { "op": "pushint 40", "defined_out": [ "40", @@ -46900,7 +46670,7 @@ "40" ] }, - "5003": { + "4955": { "op": "==", "defined_out": [ "role_address#0", @@ -46913,14 +46683,14 @@ "tmp%1#1" ] }, - "5004": { + "4956": { "op": "bz rbac_revoke_role_after_if_else@3", "stack_out": [ "role_address#0", "role_id#1" ] }, - "5007": { + "4959": { "op": "bytec 23 // 0x523a4d4e4723", "defined_out": [ "0x523a4d4e4723", @@ -46933,7 +46703,7 @@ "0x523a4d4e4723" ] }, - "5009": { + "4961": { "op": "dig 2", "stack_out": [ "role_address#0", @@ -46942,7 +46712,7 @@ "role_address#0" ] }, - "5011": { + "4963": { "op": "concat", "defined_out": [ "box_prefixed_key%0#0", @@ -46955,7 +46725,7 @@ "box_prefixed_key%0#0" ] }, - "5012": { + "4964": { "op": "dup", "defined_out": [ "box_prefixed_key%0#0", @@ -46970,7 +46740,7 @@ "box_prefixed_key%0#0 (copy)" ] }, - "5013": { + "4965": { "op": "box_len", "defined_out": [ "_%0#0", @@ -46987,7 +46757,7 @@ "maybe_exists%0#0" ] }, - "5014": { + "4966": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -46996,7 +46766,7 @@ "maybe_exists%0#0" ] }, - "5016": { + "4968": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -47005,7 +46775,7 @@ "box_prefixed_key%0#0" ] }, - "5017": { + "4969": { "op": "box_del", "defined_out": [ "role_address#0", @@ -47018,14 +46788,14 @@ "{box_del}" ] }, - "5018": { + "4970": { "op": "pop", "stack_out": [ "role_address#0", "role_id#1" ] }, - "5019": { + "4971": { "block": "rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12", "stack_in": [ "role_address#0", @@ -47041,7 +46811,7 @@ "tmp%2#1" ] }, - "5021": { + "4973": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0" @@ -47052,7 +46822,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "5022": { + "4974": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -47065,7 +46835,7 @@ "0x151f7c75" ] }, - "5023": { + "4975": { "op": "swap", "stack_out": [ "role_address#0", @@ -47074,7 +46844,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "5024": { + "4976": { "op": "concat", "defined_out": [ "tmp%5#0" @@ -47085,14 +46855,14 @@ "tmp%5#0" ] }, - "5025": { + "4977": { "op": "log", "stack_out": [ "role_address#0", "role_id#1" ] }, - "5026": { + "4978": { "op": "intc_1 // 1", "defined_out": [ "1" @@ -47103,14 +46873,14 @@ "1" ] }, - "5027": { + "4979": { "op": "return", "stack_out": [ "role_address#0", "role_id#1" ] }, - "5028": { + "4980": { "block": "rbac_revoke_role_after_if_else@3", "stack_in": [ "role_address#0", @@ -47126,7 +46896,7 @@ "role_id#1" ] }, - "5029": { + "4981": { "op": "pushint 50", "defined_out": [ "50", @@ -47139,7 +46909,7 @@ "50" ] }, - "5031": { + "4983": { "op": "==", "defined_out": [ "role_id#1", @@ -47151,14 +46921,14 @@ "tmp%2#2" ] }, - "5032": { + "4984": { "op": "bz rbac_revoke_role_after_if_else@5", "stack_out": [ "role_address#0", "role_id#1" ] }, - "5035": { + "4987": { "op": "bytec 22 // 0x523a50594423", "defined_out": [ "0x523a50594423", @@ -47170,7 +46940,7 @@ "0x523a50594423" ] }, - "5037": { + "4989": { "op": "dig 2", "defined_out": [ "0x523a50594423", @@ -47184,7 +46954,7 @@ "role_address#0" ] }, - "5039": { + "4991": { "op": "concat", "defined_out": [ "box_prefixed_key%2#0", @@ -47197,7 +46967,7 @@ "box_prefixed_key%2#0" ] }, - "5040": { + "4992": { "op": "dup", "defined_out": [ "box_prefixed_key%2#0", @@ -47212,7 +46982,7 @@ "box_prefixed_key%2#0 (copy)" ] }, - "5041": { + "4993": { "op": "box_len", "defined_out": [ "_%1#0", @@ -47229,7 +46999,7 @@ "maybe_exists%1#0" ] }, - "5042": { + "4994": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -47238,7 +47008,7 @@ "maybe_exists%1#0" ] }, - "5044": { + "4996": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -47247,7 +47017,7 @@ "box_prefixed_key%2#0" ] }, - "5045": { + "4997": { "op": "box_del", "defined_out": [ "role_address#0", @@ -47260,17 +47030,17 @@ "{box_del}" ] }, - "5046": { + "4998": { "op": "pop", "stack_out": [ "role_address#0", "role_id#1" ] }, - "5047": { + "4999": { "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" }, - "5050": { + "5002": { "block": "rbac_revoke_role_after_if_else@5", "stack_in": [ "role_address#0", @@ -47286,7 +47056,7 @@ "role_id#1" ] }, - "5051": { + "5003": { "op": "pushint 60", "defined_out": [ "60", @@ -47299,7 +47069,7 @@ "60" ] }, - "5053": { + "5005": { "op": "==", "defined_out": [ "role_id#1", @@ -47311,14 +47081,14 @@ "tmp%3#0" ] }, - "5054": { + "5006": { "op": "bz rbac_revoke_role_after_if_else@7", "stack_out": [ "role_address#0", "role_id#1" ] }, - "5057": { + "5009": { "op": "bytec 26 // 0x523a54525323", "defined_out": [ "0x523a54525323", @@ -47330,7 +47100,7 @@ "0x523a54525323" ] }, - "5059": { + "5011": { "op": "dig 2", "defined_out": [ "0x523a54525323", @@ -47344,7 +47114,7 @@ "role_address#0" ] }, - "5061": { + "5013": { "op": "concat", "defined_out": [ "box_prefixed_key%4#0", @@ -47357,7 +47127,7 @@ "box_prefixed_key%4#0" ] }, - "5062": { + "5014": { "op": "dup", "defined_out": [ "box_prefixed_key%4#0", @@ -47372,7 +47142,7 @@ "box_prefixed_key%4#0 (copy)" ] }, - "5063": { + "5015": { "op": "box_len", "defined_out": [ "_%2#0", @@ -47389,7 +47159,7 @@ "maybe_exists%2#0" ] }, - "5064": { + "5016": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -47398,7 +47168,7 @@ "maybe_exists%2#0" ] }, - "5066": { + "5018": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -47407,7 +47177,7 @@ "box_prefixed_key%4#0" ] }, - "5067": { + "5019": { "op": "box_del", "defined_out": [ "role_address#0", @@ -47420,17 +47190,17 @@ "{box_del}" ] }, - "5068": { + "5020": { "op": "pop", "stack_out": [ "role_address#0", "role_id#1" ] }, - "5069": { + "5021": { "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" }, - "5072": { + "5024": { "block": "rbac_revoke_role_after_if_else@7", "stack_in": [ "role_address#0", @@ -47446,7 +47216,7 @@ "role_id#1" ] }, - "5073": { + "5025": { "op": "pushint 70", "defined_out": [ "70", @@ -47459,7 +47229,7 @@ "70" ] }, - "5075": { + "5027": { "op": "==", "defined_out": [ "role_id#1", @@ -47471,14 +47241,14 @@ "tmp%4#1" ] }, - "5076": { + "5028": { "op": "bz rbac_revoke_role_after_if_else@9", "stack_out": [ "role_address#0", "role_id#1" ] }, - "5079": { + "5031": { "op": "bytec 21 // 0x523a41555423", "defined_out": [ "0x523a41555423", @@ -47490,7 +47260,7 @@ "0x523a41555423" ] }, - "5081": { + "5033": { "op": "dig 2", "defined_out": [ "0x523a41555423", @@ -47504,7 +47274,7 @@ "role_address#0" ] }, - "5083": { + "5035": { "op": "concat", "defined_out": [ "box_prefixed_key%6#0", @@ -47517,7 +47287,7 @@ "box_prefixed_key%6#0" ] }, - "5084": { + "5036": { "op": "dup", "defined_out": [ "box_prefixed_key%6#0", @@ -47532,7 +47302,7 @@ "box_prefixed_key%6#0 (copy)" ] }, - "5085": { + "5037": { "op": "box_len", "defined_out": [ "_%3#0", @@ -47549,7 +47319,7 @@ "maybe_exists%3#0" ] }, - "5086": { + "5038": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -47558,7 +47328,7 @@ "maybe_exists%3#0" ] }, - "5088": { + "5040": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -47567,7 +47337,7 @@ "box_prefixed_key%6#0" ] }, - "5089": { + "5041": { "op": "box_del", "defined_out": [ "role_address#0", @@ -47580,17 +47350,17 @@ "{box_del}" ] }, - "5090": { + "5042": { "op": "pop", "stack_out": [ "role_address#0", "role_id#1" ] }, - "5091": { + "5043": { "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" }, - "5094": { + "5046": { "block": "rbac_revoke_role_after_if_else@9", "stack_in": [ "role_address#0", @@ -47606,7 +47376,7 @@ "role_id#1" ] }, - "5095": { + "5047": { "op": "pushint 80", "defined_out": [ "80", @@ -47619,7 +47389,7 @@ "80" ] }, - "5097": { + "5049": { "op": "==", "defined_out": [ "role_id#1", @@ -47631,14 +47401,14 @@ "tmp%5#1" ] }, - "5098": { + "5050": { "op": "bz rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12", "stack_out": [ "role_address#0", "role_id#1" ] }, - "5101": { + "5053": { "op": "bytec 25 // 0x523a4d4f4323", "defined_out": [ "0x523a4d4f4323", @@ -47650,7 +47420,7 @@ "0x523a4d4f4323" ] }, - "5103": { + "5055": { "op": "dig 2", "defined_out": [ "0x523a4d4f4323", @@ -47664,7 +47434,7 @@ "role_address#0" ] }, - "5105": { + "5057": { "op": "concat", "defined_out": [ "box_prefixed_key%8#0", @@ -47677,7 +47447,7 @@ "box_prefixed_key%8#0" ] }, - "5106": { + "5058": { "op": "dup", "defined_out": [ "box_prefixed_key%8#0", @@ -47692,7 +47462,7 @@ "box_prefixed_key%8#0 (copy)" ] }, - "5107": { + "5059": { "op": "box_len", "defined_out": [ "_%4#0", @@ -47709,7 +47479,7 @@ "maybe_exists%4#0" ] }, - "5108": { + "5060": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -47718,7 +47488,7 @@ "maybe_exists%4#0" ] }, - "5110": { + "5062": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -47727,7 +47497,7 @@ "box_prefixed_key%8#0" ] }, - "5111": { + "5063": { "op": "box_del", "defined_out": [ "role_address#0", @@ -47740,17 +47510,17 @@ "{box_del}" ] }, - "5112": { + "5064": { "op": "pop", "stack_out": [ "role_address#0", "role_id#1" ] }, - "5113": { + "5065": { "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" }, - "5116": { + "5068": { "subroutine": "modules.rbac.RbacModule.rbac_contract_suspension[routing]", "params": {}, "block": "rbac_contract_suspension", @@ -47763,7 +47533,7 @@ "tmp%0#0" ] }, - "5119": { + "5071": { "op": "dup", "defined_out": [ "tmp%0#0", @@ -47774,7 +47544,7 @@ "tmp%0#0 (copy)" ] }, - "5120": { + "5072": { "op": "len", "defined_out": [ "len%0#0", @@ -47785,7 +47555,7 @@ "len%0#0" ] }, - "5121": { + "5073": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -47798,7 +47568,7 @@ "1" ] }, - "5122": { + "5074": { "op": "==", "defined_out": [ "eq%0#0", @@ -47809,14 +47579,14 @@ "eq%0#0" ] }, - "5123": { + "5075": { "error": "invalid number of bytes for arc4.bool", "op": "assert // invalid number of bytes for arc4.bool", "stack_out": [ "tmp%0#0" ] }, - "5124": { + "5076": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -47827,7 +47597,7 @@ "0" ] }, - "5125": { + "5077": { "op": "getbit", "defined_out": [ "suspended#0" @@ -47836,7 +47606,7 @@ "suspended#0" ] }, - "5126": { + "5078": { "op": "bytec 21 // 0x523a41555423", "defined_out": [ "0x523a41555423", @@ -47847,7 +47617,7 @@ "0x523a41555423" ] }, - "5128": { + "5080": { "op": "txn Sender", "defined_out": [ "0x523a41555423", @@ -47860,7 +47630,7 @@ "tmp%0#2" ] }, - "5130": { + "5082": { "callsub": "modules.rbac.RbacModule._role_is_active", "op": "callsub _role_is_active", "defined_out": [ @@ -47872,36 +47642,36 @@ "tmp%1#0" ] }, - "5133": { + "5085": { "error": "Not authorized", "op": "assert // Not authorized", "stack_out": [ "suspended#0" ] }, - "5134": { - "op": "bytec 33 // \"asset_suspended\"", + "5086": { + "op": "bytec 33 // \"contract_suspended\"", "defined_out": [ - "\"asset_suspended\"", + "\"contract_suspended\"", "suspended#0" ], "stack_out": [ "suspended#0", - "\"asset_suspended\"" + "\"contract_suspended\"" ] }, - "5136": { + "5088": { "op": "swap", "stack_out": [ - "\"asset_suspended\"", + "\"contract_suspended\"", "suspended#0" ] }, - "5137": { + "5089": { "op": "app_global_put", "stack_out": [] }, - "5138": { + "5090": { "op": "global LatestTimestamp", "defined_out": [ "tmp%0#1" @@ -47910,7 +47680,7 @@ "tmp%0#1" ] }, - "5140": { + "5092": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0" @@ -47919,7 +47689,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "5141": { + "5093": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -47930,14 +47700,14 @@ "0x151f7c75" ] }, - "5142": { + "5094": { "op": "swap", "stack_out": [ "0x151f7c75", "aggregate%val_as_bytes%0#0" ] }, - "5143": { + "5095": { "op": "concat", "defined_out": [ "tmp%4#0" @@ -47946,21 +47716,231 @@ "tmp%4#0" ] }, - "5144": { + "5096": { "op": "log", "stack_out": [] }, - "5145": { + "5097": { "op": "intc_1 // 1", "stack_out": [ "1" ] }, - "5146": { + "5098": { "op": "return", "stack_out": [] }, - "5147": { + "5099": { + "subroutine": "modules.rbac.RbacModule.rbac_contract_default[routing]", + "params": {}, + "block": "rbac_contract_default", + "stack_in": [], + "op": "txna ApplicationArgs 1", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "5102": { + "op": "dup", + "defined_out": [ + "tmp%0#0", + "tmp%0#0 (copy)" + ], + "stack_out": [ + "tmp%0#0", + "tmp%0#0 (copy)" + ] + }, + "5103": { + "op": "len", + "defined_out": [ + "len%0#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "len%0#0" + ] + }, + "5104": { + "op": "intc_1 // 1", + "defined_out": [ + "1", + "len%0#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "len%0#0", + "1" + ] + }, + "5105": { + "op": "==", + "defined_out": [ + "eq%0#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "eq%0#0" + ] + }, + "5106": { + "error": "invalid number of bytes for arc4.bool", + "op": "assert // invalid number of bytes for arc4.bool", + "stack_out": [ + "tmp%0#0" + ] + }, + "5107": { + "op": "intc_0 // 0", + "defined_out": [ + "0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "0" + ] + }, + "5108": { + "op": "getbit", + "defined_out": [ + "defaulted#0" + ], + "stack_out": [ + "defaulted#0" + ] + }, + "5109": { + "op": "bytec 26 // 0x523a54525323", + "defined_out": [ + "0x523a54525323", + "defaulted#0" + ], + "stack_out": [ + "defaulted#0", + "0x523a54525323" + ] + }, + "5111": { + "op": "txn Sender", + "defined_out": [ + "0x523a54525323", + "defaulted#0", + "tmp%0#2" + ], + "stack_out": [ + "defaulted#0", + "0x523a54525323", + "tmp%0#2" + ] + }, + "5113": { + "callsub": "modules.rbac.RbacModule._role_is_active", + "op": "callsub _role_is_active", + "defined_out": [ + "defaulted#0", + "tmp%1#0" + ], + "stack_out": [ + "defaulted#0", + "tmp%1#0" + ] + }, + "5116": { + "error": "Not authorized", + "op": "assert // Not authorized", + "stack_out": [ + "defaulted#0" + ] + }, + "5117": { + "op": "bytec 34 // \"defaulted\"", + "defined_out": [ + "\"defaulted\"", + "defaulted#0" + ], + "stack_out": [ + "defaulted#0", + "\"defaulted\"" + ] + }, + "5119": { + "op": "swap", + "stack_out": [ + "\"defaulted\"", + "defaulted#0" + ] + }, + "5120": { + "op": "app_global_put", + "stack_out": [] + }, + "5121": { + "op": "global LatestTimestamp", + "defined_out": [ + "tmp%0#1" + ], + "stack_out": [ + "tmp%0#1" + ] + }, + "5123": { + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%0#0" + ], + "stack_out": [ + "aggregate%val_as_bytes%0#0" + ] + }, + "5124": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "aggregate%val_as_bytes%0#0" + ], + "stack_out": [ + "aggregate%val_as_bytes%0#0", + "0x151f7c75" + ] + }, + "5125": { + "op": "swap", + "stack_out": [ + "0x151f7c75", + "aggregate%val_as_bytes%0#0" + ] + }, + "5126": { + "op": "concat", + "defined_out": [ + "tmp%4#0" + ], + "stack_out": [ + "tmp%4#0" + ] + }, + "5127": { + "op": "log", + "stack_out": [] + }, + "5128": { + "op": "intc_1 // 1", + "stack_out": [ + "1" + ] + }, + "5129": { + "op": "return", + "stack_out": [] + }, + "5130": { "subroutine": "modules.rbac.RbacModule.rbac_get_arranger[routing]", "params": {}, "block": "rbac_get_arranger", @@ -47973,7 +47953,7 @@ "0" ] }, - "5148": { + "5131": { "op": "bytec 18 // 0x523a41525223", "defined_out": [ "0", @@ -47984,7 +47964,7 @@ "0x523a41525223" ] }, - "5150": { + "5133": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -47995,14 +47975,14 @@ "maybe_exists%0#0" ] }, - "5151": { + "5134": { "error": "check self.arranger exists", "op": "assert // check self.arranger exists", "stack_out": [ "maybe_value%0#0" ] }, - "5152": { + "5135": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -48013,14 +47993,14 @@ "0x151f7c75" ] }, - "5153": { + "5136": { "op": "swap", "stack_out": [ "0x151f7c75", "maybe_value%0#0" ] }, - "5154": { + "5137": { "op": "concat", "defined_out": [ "tmp%2#0" @@ -48029,11 +48009,11 @@ "tmp%2#0" ] }, - "5155": { + "5138": { "op": "log", "stack_out": [] }, - "5156": { + "5139": { "op": "intc_1 // 1", "defined_out": [ "1" @@ -48042,11 +48022,11 @@ "1" ] }, - "5157": { + "5140": { "op": "return", "stack_out": [] }, - "5158": { + "5141": { "subroutine": "modules.rbac.RbacModule.rbac_get_address_roles[routing]", "params": {}, "block": "rbac_get_address_roles", @@ -48059,7 +48039,7 @@ "address#0" ] }, - "5161": { + "5144": { "op": "dup", "defined_out": [ "address#0", @@ -48070,7 +48050,7 @@ "address#0 (copy)" ] }, - "5162": { + "5145": { "op": "len", "defined_out": [ "address#0", @@ -48081,7 +48061,7 @@ "len%0#0" ] }, - "5163": { + "5146": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -48094,7 +48074,7 @@ "32" ] }, - "5164": { + "5147": { "op": "==", "defined_out": [ "address#0", @@ -48105,14 +48085,14 @@ "eq%0#0" ] }, - "5165": { + "5148": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ "address#0" ] }, - "5166": { + "5149": { "op": "bytec 23 // 0x523a4d4e4723", "defined_out": [ "0x523a4d4e4723", @@ -48123,7 +48103,7 @@ "0x523a4d4e4723" ] }, - "5168": { + "5151": { "op": "dig 1", "stack_out": [ "address#0", @@ -48131,7 +48111,7 @@ "address#0 (copy)" ] }, - "5170": { + "5153": { "callsub": "modules.rbac.RbacModule._role_is_active", "op": "callsub _role_is_active", "defined_out": [ @@ -48143,7 +48123,7 @@ "tmp%0#1" ] }, - "5173": { + "5156": { "op": "bytec 22 // 0x523a50594423", "defined_out": [ "0x523a50594423", @@ -48156,7 +48136,7 @@ "0x523a50594423" ] }, - "5175": { + "5158": { "op": "dig 2", "stack_out": [ "address#0", @@ -48165,7 +48145,7 @@ "address#0 (copy)" ] }, - "5177": { + "5160": { "callsub": "modules.rbac.RbacModule._role_is_active", "op": "callsub _role_is_active", "defined_out": [ @@ -48179,7 +48159,7 @@ "tmp%1#1" ] }, - "5180": { + "5163": { "op": "bytec 26 // 0x523a54525323", "defined_out": [ "0x523a54525323", @@ -48194,7 +48174,7 @@ "0x523a54525323" ] }, - "5182": { + "5165": { "op": "dig 3", "stack_out": [ "address#0", @@ -48204,7 +48184,7 @@ "address#0 (copy)" ] }, - "5184": { + "5167": { "callsub": "modules.rbac.RbacModule._role_is_active", "op": "callsub _role_is_active", "defined_out": [ @@ -48220,7 +48200,7 @@ "tmp%2#1" ] }, - "5187": { + "5170": { "op": "bytec 21 // 0x523a41555423", "defined_out": [ "0x523a41555423", @@ -48237,7 +48217,7 @@ "0x523a41555423" ] }, - "5189": { + "5172": { "op": "dig 4", "stack_out": [ "address#0", @@ -48248,7 +48228,7 @@ "address#0 (copy)" ] }, - "5191": { + "5174": { "callsub": "modules.rbac.RbacModule._role_is_active", "op": "callsub _role_is_active", "defined_out": [ @@ -48266,7 +48246,7 @@ "tmp%3#1" ] }, - "5194": { + "5177": { "op": "bytec 25 // 0x523a4d4f4323", "defined_out": [ "0x523a4d4f4323", @@ -48285,7 +48265,7 @@ "0x523a4d4f4323" ] }, - "5196": { + "5179": { "op": "uncover 5", "stack_out": [ "tmp%0#1", @@ -48296,7 +48276,7 @@ "address#0" ] }, - "5198": { + "5181": { "callsub": "modules.rbac.RbacModule._role_is_active", "op": "callsub _role_is_active", "defined_out": [ @@ -48314,8 +48294,8 @@ "tmp%4#1" ] }, - "5201": { - "op": "bytec 40 // 0x00", + "5184": { + "op": "bytec 41 // 0x00", "defined_out": [ "0x00", "tmp%0#1", @@ -48333,7 +48313,7 @@ "0x00" ] }, - "5203": { + "5186": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -48354,7 +48334,7 @@ "0" ] }, - "5204": { + "5187": { "op": "uncover 6", "stack_out": [ "tmp%1#1", @@ -48366,7 +48346,7 @@ "tmp%0#1" ] }, - "5206": { + "5189": { "op": "setbit", "defined_out": [ "aggregate%encoded_bool%0#0", @@ -48383,7 +48363,7 @@ "aggregate%encoded_bool%0#0" ] }, - "5207": { + "5190": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -48402,7 +48382,7 @@ "1" ] }, - "5208": { + "5191": { "op": "uncover 5", "stack_out": [ "tmp%2#1", @@ -48413,7 +48393,7 @@ "tmp%1#1" ] }, - "5210": { + "5193": { "op": "setbit", "defined_out": [ "aggregate%set_bit%0#0", @@ -48428,7 +48408,7 @@ "aggregate%set_bit%0#0" ] }, - "5211": { + "5194": { "op": "pushint 2", "defined_out": [ "2", @@ -48445,7 +48425,7 @@ "2" ] }, - "5213": { + "5196": { "op": "uncover 4", "stack_out": [ "tmp%3#1", @@ -48455,7 +48435,7 @@ "tmp%2#1" ] }, - "5215": { + "5198": { "op": "setbit", "defined_out": [ "aggregate%set_bit%1#0", @@ -48468,7 +48448,7 @@ "aggregate%set_bit%1#0" ] }, - "5216": { + "5199": { "op": "pushint 3", "defined_out": [ "3", @@ -48483,7 +48463,7 @@ "3" ] }, - "5218": { + "5201": { "op": "uncover 3", "stack_out": [ "tmp%4#1", @@ -48492,7 +48472,7 @@ "tmp%3#1" ] }, - "5220": { + "5203": { "op": "setbit", "defined_out": [ "aggregate%set_bit%2#0", @@ -48503,7 +48483,7 @@ "aggregate%set_bit%2#0" ] }, - "5221": { + "5204": { "op": "pushint 4", "defined_out": [ "4", @@ -48516,7 +48496,7 @@ "4" ] }, - "5223": { + "5206": { "op": "uncover 2", "stack_out": [ "aggregate%set_bit%2#0", @@ -48524,7 +48504,7 @@ "tmp%4#1" ] }, - "5225": { + "5208": { "op": "setbit", "defined_out": [ "aggregate%set_bit%3#0" @@ -48533,7 +48513,7 @@ "aggregate%set_bit%3#0" ] }, - "5226": { + "5209": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -48544,14 +48524,14 @@ "0x151f7c75" ] }, - "5227": { + "5210": { "op": "swap", "stack_out": [ "0x151f7c75", "aggregate%set_bit%3#0" ] }, - "5228": { + "5211": { "op": "concat", "defined_out": [ "tmp%8#0" @@ -48560,21 +48540,21 @@ "tmp%8#0" ] }, - "5229": { + "5212": { "op": "log", "stack_out": [] }, - "5230": { + "5213": { "op": "intc_1 // 1", "stack_out": [ "1" ] }, - "5231": { + "5214": { "op": "return", "stack_out": [] }, - "5232": { + "5215": { "subroutine": "modules.rbac.RbacModule.rbac_get_role_validity[routing]", "params": {}, "block": "rbac_get_role_validity", @@ -48587,7 +48567,7 @@ "role_id#0" ] }, - "5235": { + "5218": { "op": "dup", "defined_out": [ "role_id#0", @@ -48598,7 +48578,7 @@ "role_id#0 (copy)" ] }, - "5236": { + "5219": { "op": "len", "defined_out": [ "len%0#0", @@ -48609,7 +48589,7 @@ "len%0#0" ] }, - "5237": { + "5220": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -48622,7 +48602,7 @@ "1" ] }, - "5238": { + "5221": { "op": "==", "defined_out": [ "eq%0#0", @@ -48633,17 +48613,17 @@ "eq%0#0" ] }, - "5239": { + "5222": { "error": "invalid number of bytes for arc4.uint8", "op": "assert // invalid number of bytes for arc4.uint8", "stack_out": [ "role_id#0" ] }, - "5240": { + "5223": { "op": "txna ApplicationArgs 2" }, - "5243": { + "5226": { "op": "dup", "defined_out": [ "role_address#0", @@ -48655,7 +48635,7 @@ "role_address#0" ] }, - "5244": { + "5227": { "op": "cover 2", "defined_out": [ "role_address#0", @@ -48667,7 +48647,7 @@ "role_address#0" ] }, - "5246": { + "5229": { "op": "len", "defined_out": [ "len%1#0", @@ -48680,7 +48660,7 @@ "len%1#0" ] }, - "5247": { + "5230": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -48695,7 +48675,7 @@ "32" ] }, - "5248": { + "5231": { "op": "==", "defined_out": [ "eq%1#0", @@ -48708,7 +48688,7 @@ "eq%1#0" ] }, - "5249": { + "5232": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ @@ -48716,7 +48696,7 @@ "role_id#0" ] }, - "5250": { + "5233": { "op": "btoi", "defined_out": [ "role#0", @@ -48727,7 +48707,7 @@ "role#0" ] }, - "5251": { + "5234": { "op": "dup", "defined_out": [ "role#0", @@ -48740,7 +48720,7 @@ "role#0 (copy)" ] }, - "5252": { + "5235": { "callsub": "modules.rbac.RbacModule._assert_valid_role", "op": "callsub _assert_valid_role", "stack_out": [ @@ -48748,7 +48728,7 @@ "role#0" ] }, - "5255": { + "5238": { "op": "pushints 20 40 50 60 70 80", "defined_out": [ "20", @@ -48771,7 +48751,7 @@ "80" ] }, - "5263": { + "5246": { "op": "uncover 6", "stack_out": [ "role_address#0", @@ -48784,17 +48764,17 @@ "role#0" ] }, - "5265": { + "5248": { "op": "match rbac_get_role_validity_switch_case_0@2 rbac_get_role_validity_switch_case_1@3 rbac_get_role_validity_switch_case_2@4 rbac_get_role_validity_switch_case_3@5 rbac_get_role_validity_switch_case_4@6 rbac_get_role_validity_switch_case_5@7", "stack_out": [ "role_address#0" ] }, - "5279": { + "5262": { "error": "Invalid role identifier", "op": "err // Invalid role identifier" }, - "5280": { + "5263": { "block": "rbac_get_role_validity_switch_case_5@7", "stack_in": [ "role_address#0" @@ -48808,7 +48788,7 @@ "0x523a4d4f4323" ] }, - "5282": { + "5265": { "op": "dig 1", "defined_out": [ "0x523a4d4f4323", @@ -48820,7 +48800,7 @@ "role_address#0" ] }, - "5284": { + "5267": { "op": "concat", "defined_out": [ "box_prefixed_key%0#1", @@ -48831,7 +48811,7 @@ "box_prefixed_key%0#1" ] }, - "5285": { + "5268": { "op": "dup", "defined_out": [ "box_prefixed_key%0#1", @@ -48844,7 +48824,7 @@ "box_prefixed_key%0#1 (copy)" ] }, - "5286": { + "5269": { "op": "box_len", "defined_out": [ "_%0#0", @@ -48859,7 +48839,7 @@ "maybe_exists%0#0" ] }, - "5287": { + "5270": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -48867,7 +48847,7 @@ "maybe_exists%0#0" ] }, - "5289": { + "5272": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -48875,7 +48855,7 @@ "box_prefixed_key%0#1" ] }, - "5290": { + "5273": { "op": "box_get", "defined_out": [ "aggregate%box_get%8#0", @@ -48888,7 +48868,7 @@ "aggregate%box_get%9#0" ] }, - "5291": { + "5274": { "op": "pop", "defined_out": [ "role_address#0", @@ -48899,7 +48879,7 @@ "tmp%3#0" ] }, - "5292": { + "5275": { "block": "rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9", "stack_in": [ "role_address#0", @@ -48915,7 +48895,7 @@ "0x151f7c75" ] }, - "5293": { + "5276": { "op": "swap", "defined_out": [ "0x151f7c75", @@ -48927,7 +48907,7 @@ "tmp%3#0" ] }, - "5294": { + "5277": { "op": "concat", "defined_out": [ "tmp%4#0" @@ -48937,13 +48917,13 @@ "tmp%4#0" ] }, - "5295": { + "5278": { "op": "log", "stack_out": [ "role_address#0" ] }, - "5296": { + "5279": { "op": "intc_1 // 1", "defined_out": [ "1" @@ -48953,13 +48933,13 @@ "1" ] }, - "5297": { + "5280": { "op": "return", "stack_out": [ "role_address#0" ] }, - "5298": { + "5281": { "block": "rbac_get_role_validity_switch_case_4@6", "stack_in": [ "role_address#0" @@ -48973,7 +48953,7 @@ "0x523a41555423" ] }, - "5300": { + "5283": { "op": "dig 1", "defined_out": [ "0x523a41555423", @@ -48985,7 +48965,7 @@ "role_address#0" ] }, - "5302": { + "5285": { "op": "concat", "defined_out": [ "box_prefixed_key%0#1", @@ -48996,7 +48976,7 @@ "box_prefixed_key%0#1" ] }, - "5303": { + "5286": { "op": "dup", "defined_out": [ "box_prefixed_key%0#1", @@ -49009,7 +48989,7 @@ "box_prefixed_key%0#1 (copy)" ] }, - "5304": { + "5287": { "op": "box_len", "defined_out": [ "_%0#0", @@ -49024,7 +49004,7 @@ "maybe_exists%0#0" ] }, - "5305": { + "5288": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -49032,7 +49012,7 @@ "maybe_exists%0#0" ] }, - "5307": { + "5290": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -49040,7 +49020,7 @@ "box_prefixed_key%0#1" ] }, - "5308": { + "5291": { "op": "box_get", "defined_out": [ "aggregate%box_get%6#0", @@ -49053,7 +49033,7 @@ "aggregate%box_get%7#0" ] }, - "5309": { + "5292": { "op": "pop", "defined_out": [ "role_address#0", @@ -49064,10 +49044,10 @@ "tmp%3#0" ] }, - "5310": { + "5293": { "op": "b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9" }, - "5313": { + "5296": { "block": "rbac_get_role_validity_switch_case_3@5", "stack_in": [ "role_address#0" @@ -49081,7 +49061,7 @@ "0x523a54525323" ] }, - "5315": { + "5298": { "op": "dig 1", "defined_out": [ "0x523a54525323", @@ -49093,7 +49073,7 @@ "role_address#0" ] }, - "5317": { + "5300": { "op": "concat", "defined_out": [ "box_prefixed_key%0#1", @@ -49104,7 +49084,7 @@ "box_prefixed_key%0#1" ] }, - "5318": { + "5301": { "op": "dup", "defined_out": [ "box_prefixed_key%0#1", @@ -49117,7 +49097,7 @@ "box_prefixed_key%0#1 (copy)" ] }, - "5319": { + "5302": { "op": "box_len", "defined_out": [ "_%0#0", @@ -49132,7 +49112,7 @@ "maybe_exists%0#0" ] }, - "5320": { + "5303": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -49140,7 +49120,7 @@ "maybe_exists%0#0" ] }, - "5322": { + "5305": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -49148,7 +49128,7 @@ "box_prefixed_key%0#1" ] }, - "5323": { + "5306": { "op": "box_get", "defined_out": [ "aggregate%box_get%4#0", @@ -49161,7 +49141,7 @@ "aggregate%box_get%5#0" ] }, - "5324": { + "5307": { "op": "pop", "defined_out": [ "role_address#0", @@ -49172,10 +49152,10 @@ "tmp%3#0" ] }, - "5325": { + "5308": { "op": "b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9" }, - "5328": { + "5311": { "block": "rbac_get_role_validity_switch_case_2@4", "stack_in": [ "role_address#0" @@ -49189,7 +49169,7 @@ "0x523a50594423" ] }, - "5330": { + "5313": { "op": "dig 1", "defined_out": [ "0x523a50594423", @@ -49201,7 +49181,7 @@ "role_address#0" ] }, - "5332": { + "5315": { "op": "concat", "defined_out": [ "box_prefixed_key%0#1", @@ -49212,7 +49192,7 @@ "box_prefixed_key%0#1" ] }, - "5333": { + "5316": { "op": "dup", "defined_out": [ "box_prefixed_key%0#1", @@ -49225,7 +49205,7 @@ "box_prefixed_key%0#1 (copy)" ] }, - "5334": { + "5317": { "op": "box_len", "defined_out": [ "_%0#0", @@ -49240,7 +49220,7 @@ "maybe_exists%0#0" ] }, - "5335": { + "5318": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -49248,7 +49228,7 @@ "maybe_exists%0#0" ] }, - "5337": { + "5320": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -49256,7 +49236,7 @@ "box_prefixed_key%0#1" ] }, - "5338": { + "5321": { "op": "box_get", "defined_out": [ "aggregate%box_get%2#0", @@ -49269,7 +49249,7 @@ "aggregate%box_get%3#0" ] }, - "5339": { + "5322": { "op": "pop", "defined_out": [ "role_address#0", @@ -49280,10 +49260,10 @@ "tmp%3#0" ] }, - "5340": { + "5323": { "op": "b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9" }, - "5343": { + "5326": { "block": "rbac_get_role_validity_switch_case_1@3", "stack_in": [ "role_address#0" @@ -49297,7 +49277,7 @@ "0x523a4d4e4723" ] }, - "5345": { + "5328": { "op": "dig 1", "defined_out": [ "0x523a4d4e4723", @@ -49309,7 +49289,7 @@ "role_address#0" ] }, - "5347": { + "5330": { "op": "concat", "defined_out": [ "box_prefixed_key%0#1", @@ -49320,7 +49300,7 @@ "box_prefixed_key%0#1" ] }, - "5348": { + "5331": { "op": "dup", "defined_out": [ "box_prefixed_key%0#1", @@ -49333,7 +49313,7 @@ "box_prefixed_key%0#1 (copy)" ] }, - "5349": { + "5332": { "op": "box_len", "defined_out": [ "_%0#0", @@ -49348,7 +49328,7 @@ "maybe_exists%0#0" ] }, - "5350": { + "5333": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -49356,7 +49336,7 @@ "maybe_exists%0#0" ] }, - "5352": { + "5335": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -49364,7 +49344,7 @@ "box_prefixed_key%0#1" ] }, - "5353": { + "5336": { "op": "box_get", "defined_out": [ "aggregate%box_get%0#0", @@ -49377,7 +49357,7 @@ "aggregate%box_get%1#0" ] }, - "5354": { + "5337": { "op": "pop", "defined_out": [ "role_address#0", @@ -49388,10 +49368,10 @@ "tmp%3#0" ] }, - "5355": { + "5338": { "op": "b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9" }, - "5358": { + "5341": { "block": "rbac_get_role_validity_switch_case_0@2", "stack_in": [ "role_address#0" @@ -49405,10 +49385,10 @@ "tmp%3#0" ] }, - "5376": { + "5359": { "op": "b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9" }, - "5379": { + "5362": { "subroutine": "modules.accounting.AccountingModule._assert_is_not_account_suspended", "params": { "holding_address#0": "bytes" @@ -49417,7 +49397,7 @@ "stack_in": [], "op": "proto 1 0" }, - "5382": { + "5365": { "op": "bytec 8 // 0x4123", "defined_out": [ "0x4123" @@ -49426,7 +49406,7 @@ "0x4123" ] }, - "5384": { + "5367": { "op": "frame_dig -1", "defined_out": [ "0x4123", @@ -49437,7 +49417,7 @@ "holding_address#0 (copy)" ] }, - "5386": { + "5369": { "op": "concat", "defined_out": [ "box_prefixed_key%0#0" @@ -49446,7 +49426,7 @@ "box_prefixed_key%0#0" ] }, - "5387": { + "5370": { "op": "box_get", "defined_out": [ "aggregate%box_get%0#0", @@ -49457,14 +49437,14 @@ "aggregate%box_get%1#0" ] }, - "5388": { + "5371": { "error": "check self.account entry exists", "op": "assert // check self.account entry exists", "stack_out": [ "aggregate%box_get%0#0" ] }, - "5389": { + "5372": { "op": "pushint 384", "defined_out": [ "384", @@ -49475,7 +49455,7 @@ "384" ] }, - "5392": { + "5375": { "op": "getbit", "defined_out": [ "aggregate%get_bit%0#0" @@ -49484,7 +49464,7 @@ "aggregate%get_bit%0#0" ] }, - "5393": { + "5376": { "op": "!", "defined_out": [ "tmp%0#0" @@ -49493,16 +49473,16 @@ "tmp%0#0" ] }, - "5394": { + "5377": { "error": "Suspended operations", "op": "assert // Suspended operations", "stack_out": [] }, - "5395": { + "5378": { "retsub": true, "op": "retsub" }, - "5396": { + "5379": { "subroutine": "modules.accounting.AccountingModule._settle_position", "params": { "holding_address#0": "bytes" @@ -49511,7 +49491,7 @@ "stack_in": [], "op": "proto 1 2" }, - "5399": { + "5382": { "op": "bytec 8 // 0x4123", "defined_out": [ "0x4123" @@ -49520,7 +49500,7 @@ "0x4123" ] }, - "5401": { + "5384": { "op": "frame_dig -1", "defined_out": [ "0x4123", @@ -49531,7 +49511,7 @@ "holding_address#0 (copy)" ] }, - "5403": { + "5386": { "op": "concat", "defined_out": [ "box_prefixed_key%0#1" @@ -49540,7 +49520,7 @@ "box_prefixed_key%0#1" ] }, - "5404": { + "5387": { "op": "dup", "defined_out": [ "box_prefixed_key%0#1", @@ -49551,7 +49531,7 @@ "box_prefixed_key%0#1 (copy)" ] }, - "5405": { + "5388": { "op": "box_len", "defined_out": [ "_%0#0", @@ -49564,28 +49544,28 @@ "maybe_exists%0#0" ] }, - "5406": { + "5389": { "op": "bury 1", "stack_out": [ "box_prefixed_key%0#1", "maybe_exists%0#0" ] }, - "5408": { + "5391": { "error": "Invalid account holding address", "op": "assert // Invalid account holding address", "stack_out": [ "box_prefixed_key%0#1" ] }, - "5409": { + "5392": { "op": "dup", "stack_out": [ "box_prefixed_key%0#1", "box_prefixed_key%0#1 (copy)" ] }, - "5410": { + "5393": { "op": "box_get", "defined_out": [ "aggregate%box_get%1#0", @@ -49598,14 +49578,14 @@ "aggregate%box_get%1#0" ] }, - "5411": { + "5394": { "op": "pop", "stack_out": [ "box_prefixed_key%0#1", "position#0" ] }, - "5412": { + "5395": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -49618,7 +49598,7 @@ "0" ] }, - "5413": { + "5396": { "op": "bytec 16 // \"cumulative_interest_index\"", "defined_out": [ "\"cumulative_interest_index\"", @@ -49633,7 +49613,7 @@ "\"cumulative_interest_index\"" ] }, - "5415": { + "5398": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#1", @@ -49648,7 +49628,7 @@ "maybe_exists%0#0" ] }, - "5416": { + "5399": { "error": "check self.cumulative_interest_index exists", "op": "assert // check self.cumulative_interest_index exists", "stack_out": [ @@ -49657,7 +49637,7 @@ "maybe_value%0#0" ] }, - "5417": { + "5400": { "op": "dig 1", "defined_out": [ "box_prefixed_key%0#1", @@ -49672,7 +49652,7 @@ "position#0 (copy)" ] }, - "5419": { + "5402": { "op": "pushint 57", "defined_out": [ "57", @@ -49689,7 +49669,7 @@ "57" ] }, - "5421": { + "5404": { "op": "extract_uint64", "defined_out": [ "box_prefixed_key%0#1", @@ -49704,7 +49684,7 @@ "values%0#0" ] }, - "5422": { + "5405": { "op": "-", "defined_out": [ "box_prefixed_key%0#1", @@ -49717,7 +49697,7 @@ "interest_delta#0" ] }, - "5423": { + "5406": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#1", @@ -49726,7 +49706,7 @@ "0" ] }, - "5424": { + "5407": { "op": "bytec 17 // \"cumulative_principal_index\"", "defined_out": [ "\"cumulative_principal_index\"", @@ -49743,7 +49723,7 @@ "\"cumulative_principal_index\"" ] }, - "5426": { + "5409": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#1", @@ -49760,7 +49740,7 @@ "maybe_exists%1#0" ] }, - "5427": { + "5410": { "error": "check self.cumulative_principal_index exists", "op": "assert // check self.cumulative_principal_index exists", "stack_out": [ @@ -49770,7 +49750,7 @@ "maybe_value%1#0" ] }, - "5428": { + "5411": { "op": "dig 2", "stack_out": [ "box_prefixed_key%0#1", @@ -49780,7 +49760,7 @@ "position#0 (copy)" ] }, - "5430": { + "5413": { "op": "pushint 65", "defined_out": [ "65", @@ -49799,7 +49779,7 @@ "65" ] }, - "5432": { + "5415": { "op": "extract_uint64", "defined_out": [ "box_prefixed_key%0#1", @@ -49816,7 +49796,7 @@ "values%1#0" ] }, - "5433": { + "5416": { "op": "-", "defined_out": [ "box_prefixed_key%0#1", @@ -49831,7 +49811,7 @@ "principal_delta#0" ] }, - "5434": { + "5417": { "op": "dig 2", "stack_out": [ "box_prefixed_key%0#1", @@ -49841,7 +49821,7 @@ "position#0 (copy)" ] }, - "5436": { + "5419": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -49860,7 +49840,7 @@ "32" ] }, - "5437": { + "5420": { "op": "extract_uint64", "defined_out": [ "box_prefixed_key%0#1", @@ -49877,7 +49857,7 @@ "values%2#0" ] }, - "5438": { + "5421": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#1", @@ -49888,7 +49868,7 @@ "0" ] }, - "5439": { + "5422": { "op": "bytec 5 // \"fixed_point_scale\"", "defined_out": [ "\"fixed_point_scale\"", @@ -49909,7 +49889,7 @@ "\"fixed_point_scale\"" ] }, - "5441": { + "5424": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#1", @@ -49930,7 +49910,7 @@ "maybe_exists%2#0" ] }, - "5442": { + "5425": { "error": "check self.fixed_point_scale exists", "op": "assert // check self.fixed_point_scale exists", "stack_out": [ @@ -49942,7 +49922,7 @@ "maybe_value%2#0" ] }, - "5443": { + "5426": { "op": "uncover 3", "stack_out": [ "box_prefixed_key%0#1", @@ -49953,7 +49933,7 @@ "interest_delta#0" ] }, - "5445": { + "5428": { "op": "dig 2", "defined_out": [ "box_prefixed_key%0#1", @@ -49974,7 +49954,7 @@ "values%2#0 (copy)" ] }, - "5447": { + "5430": { "op": "uncover 2", "stack_out": [ "box_prefixed_key%0#1", @@ -49986,7 +49966,7 @@ "maybe_value%2#0" ] }, - "5449": { + "5432": { "callsub": "modules.actus_kernel.ActusKernelModule._scaled_mul_div", "op": "callsub _scaled_mul_div", "defined_out": [ @@ -50004,7 +49984,7 @@ "claimable_interest#0" ] }, - "5452": { + "5435": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#1", @@ -50015,7 +49995,7 @@ "0" ] }, - "5453": { + "5436": { "op": "bytec 5 // \"fixed_point_scale\"", "stack_out": [ "box_prefixed_key%0#1", @@ -50027,7 +50007,7 @@ "\"fixed_point_scale\"" ] }, - "5455": { + "5438": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#1", @@ -50048,7 +50028,7 @@ "maybe_exists%3#0" ] }, - "5456": { + "5439": { "error": "check self.fixed_point_scale exists", "op": "assert // check self.fixed_point_scale exists", "stack_out": [ @@ -50060,7 +50040,7 @@ "maybe_value%3#0" ] }, - "5457": { + "5440": { "op": "uncover 3", "stack_out": [ "box_prefixed_key%0#1", @@ -50071,7 +50051,7 @@ "principal_delta#0" ] }, - "5459": { + "5442": { "op": "uncover 3", "stack_out": [ "box_prefixed_key%0#1", @@ -50082,7 +50062,7 @@ "values%2#0" ] }, - "5461": { + "5444": { "op": "uncover 2", "stack_out": [ "box_prefixed_key%0#1", @@ -50093,7 +50073,7 @@ "maybe_value%3#0" ] }, - "5463": { + "5446": { "callsub": "modules.actus_kernel.ActusKernelModule._scaled_mul_div", "op": "callsub _scaled_mul_div", "defined_out": [ @@ -50109,7 +50089,7 @@ "claimable_principal#0" ] }, - "5466": { + "5449": { "op": "dig 2", "stack_out": [ "box_prefixed_key%0#1", @@ -50119,7 +50099,7 @@ "position#0 (copy)" ] }, - "5468": { + "5451": { "op": "pushint 73", "defined_out": [ "73", @@ -50138,7 +50118,7 @@ "73" ] }, - "5470": { + "5453": { "op": "extract_uint64", "defined_out": [ "box_prefixed_key%0#1", @@ -50155,7 +50135,7 @@ "values%4#0" ] }, - "5471": { + "5454": { "op": "dig 2", "defined_out": [ "box_prefixed_key%0#1", @@ -50174,7 +50154,7 @@ "claimable_interest#0 (copy)" ] }, - "5473": { + "5456": { "op": "+", "defined_out": [ "box_prefixed_key%0#1", @@ -50191,7 +50171,7 @@ "tmp%4#0" ] }, - "5474": { + "5457": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0", @@ -50208,7 +50188,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "5475": { + "5458": { "op": "uncover 3", "stack_out": [ "box_prefixed_key%0#1", @@ -50218,7 +50198,7 @@ "position#0" ] }, - "5477": { + "5460": { "op": "swap", "stack_out": [ "box_prefixed_key%0#1", @@ -50228,7 +50208,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "5478": { + "5461": { "op": "replace2 73", "stack_out": [ "box_prefixed_key%0#1", @@ -50237,7 +50217,7 @@ "position#0" ] }, - "5480": { + "5463": { "op": "dup", "stack_out": [ "box_prefixed_key%0#1", @@ -50247,7 +50227,7 @@ "position#0 (copy)" ] }, - "5481": { + "5464": { "op": "pushint 81", "defined_out": [ "81", @@ -50266,7 +50246,7 @@ "81" ] }, - "5483": { + "5466": { "op": "extract_uint64", "defined_out": [ "box_prefixed_key%0#1", @@ -50283,7 +50263,7 @@ "values%5#0" ] }, - "5484": { + "5467": { "op": "dig 2", "defined_out": [ "box_prefixed_key%0#1", @@ -50302,7 +50282,7 @@ "claimable_principal#0 (copy)" ] }, - "5486": { + "5469": { "op": "+", "defined_out": [ "box_prefixed_key%0#1", @@ -50319,7 +50299,7 @@ "tmp%5#0" ] }, - "5487": { + "5470": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%1#0", @@ -50336,7 +50316,7 @@ "aggregate%val_as_bytes%1#0" ] }, - "5488": { + "5471": { "op": "replace2 81", "stack_out": [ "box_prefixed_key%0#1", @@ -50345,7 +50325,7 @@ "position#0" ] }, - "5490": { + "5473": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#1", @@ -50355,7 +50335,7 @@ "0" ] }, - "5491": { + "5474": { "op": "bytec 16 // \"cumulative_interest_index\"", "stack_out": [ "box_prefixed_key%0#1", @@ -50366,7 +50346,7 @@ "\"cumulative_interest_index\"" ] }, - "5493": { + "5476": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#1", @@ -50385,7 +50365,7 @@ "maybe_exists%4#0" ] }, - "5494": { + "5477": { "error": "check self.cumulative_interest_index exists", "op": "assert // check self.cumulative_interest_index exists", "stack_out": [ @@ -50396,7 +50376,7 @@ "maybe_value%4#0" ] }, - "5495": { + "5478": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%2#0", @@ -50413,7 +50393,7 @@ "aggregate%val_as_bytes%2#0" ] }, - "5496": { + "5479": { "op": "replace2 57", "stack_out": [ "box_prefixed_key%0#1", @@ -50422,7 +50402,7 @@ "position#0" ] }, - "5498": { + "5481": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#1", @@ -50432,7 +50412,7 @@ "0" ] }, - "5499": { + "5482": { "op": "bytec 17 // \"cumulative_principal_index\"", "stack_out": [ "box_prefixed_key%0#1", @@ -50443,7 +50423,7 @@ "\"cumulative_principal_index\"" ] }, - "5501": { + "5484": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#1", @@ -50462,7 +50442,7 @@ "maybe_exists%5#0" ] }, - "5502": { + "5485": { "error": "check self.cumulative_principal_index exists", "op": "assert // check self.cumulative_principal_index exists", "stack_out": [ @@ -50473,7 +50453,7 @@ "maybe_value%5#0" ] }, - "5503": { + "5486": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%3#0", @@ -50490,7 +50470,7 @@ "aggregate%val_as_bytes%3#0" ] }, - "5504": { + "5487": { "op": "replace2 65", "stack_out": [ "box_prefixed_key%0#1", @@ -50499,7 +50479,7 @@ "position#0" ] }, - "5506": { + "5489": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#1", @@ -50509,7 +50489,7 @@ "0" ] }, - "5507": { + "5490": { "op": "bytec_2 // \"event_cursor\"", "defined_out": [ "\"event_cursor\"", @@ -50528,7 +50508,7 @@ "\"event_cursor\"" ] }, - "5508": { + "5491": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#1", @@ -50547,7 +50527,7 @@ "maybe_exists%6#0" ] }, - "5509": { + "5492": { "error": "check self.event_cursor exists", "op": "assert // check self.event_cursor exists", "stack_out": [ @@ -50558,7 +50538,7 @@ "maybe_value%6#0" ] }, - "5510": { + "5493": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%4#0", @@ -50575,7 +50555,7 @@ "aggregate%val_as_bytes%4#0" ] }, - "5511": { + "5494": { "op": "replace2 49", "stack_out": [ "box_prefixed_key%0#1", @@ -50584,7 +50564,7 @@ "position#0" ] }, - "5513": { + "5496": { "op": "uncover 3", "stack_out": [ "claimable_interest#0", @@ -50593,7 +50573,7 @@ "box_prefixed_key%0#1" ] }, - "5515": { + "5498": { "op": "swap", "stack_out": [ "claimable_interest#0", @@ -50602,18 +50582,18 @@ "position#0" ] }, - "5516": { + "5499": { "op": "box_put", "stack_out": [ "claimable_interest#0", "claimable_principal#0" ] }, - "5517": { + "5500": { "retsub": true, "op": "retsub" }, - "5518": { + "5501": { "subroutine": "modules.accounting.AccountingModule._ensure_units_activated", "params": { "holding_address#0": "bytes" @@ -50622,20 +50602,20 @@ "stack_in": [], "op": "proto 1 0" }, - "5521": { + "5504": { "op": "intc_0 // 0", "stack_out": [ "position#0" ] }, - "5522": { + "5505": { "op": "pushbytes \"\"", "stack_out": [ "position#0", "activated_units#0" ] }, - "5524": { + "5507": { "op": "bytec 8 // 0x4123", "defined_out": [ "0x4123" @@ -50646,7 +50626,7 @@ "0x4123" ] }, - "5526": { + "5509": { "op": "frame_dig -1", "defined_out": [ "0x4123", @@ -50659,7 +50639,7 @@ "holding_address#0 (copy)" ] }, - "5528": { + "5511": { "op": "concat", "defined_out": [ "box_prefixed_key%0#1" @@ -50670,7 +50650,7 @@ "box_prefixed_key%0#1" ] }, - "5529": { + "5512": { "op": "dup", "defined_out": [ "box_prefixed_key%0#1" @@ -50682,7 +50662,7 @@ "box_prefixed_key%0#1" ] }, - "5530": { + "5513": { "op": "box_len", "defined_out": [ "_%0#0", @@ -50697,7 +50677,7 @@ "maybe_exists%0#0" ] }, - "5531": { + "5514": { "op": "bury 1", "stack_out": [ "position#0", @@ -50706,7 +50686,7 @@ "maybe_exists%0#0" ] }, - "5533": { + "5516": { "error": "Invalid account holding address", "op": "assert // Invalid account holding address", "stack_out": [ @@ -50715,7 +50695,7 @@ "box_prefixed_key%0#1" ] }, - "5534": { + "5517": { "op": "intc_0 // 0", "stack_out": [ "position#0", @@ -50724,7 +50704,7 @@ "0" ] }, - "5535": { + "5518": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"", @@ -50739,7 +50719,7 @@ "\"status\"" ] }, - "5536": { + "5519": { "op": "app_global_get_ex", "defined_out": [ "box_prefixed_key%0#1", @@ -50754,7 +50734,7 @@ "maybe_exists%0#0" ] }, - "5537": { + "5520": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ @@ -50764,7 +50744,7 @@ "maybe_value%0#0" ] }, - "5538": { + "5521": { "op": "pushint 50", "defined_out": [ "50", @@ -50779,7 +50759,7 @@ "50" ] }, - "5540": { + "5523": { "op": "==", "defined_out": [ "box_prefixed_key%0#1", @@ -50792,7 +50772,7 @@ "tmp%0#1" ] }, - "5541": { + "5524": { "op": "bz _ensure_units_activated_after_if_else@2", "stack_out": [ "position#0", @@ -50800,11 +50780,11 @@ "box_prefixed_key%0#1" ] }, - "5544": { + "5527": { "retsub": true, "op": "retsub" }, - "5545": { + "5528": { "block": "_ensure_units_activated_after_if_else@2", "stack_in": [ "position#0", @@ -50822,7 +50802,7 @@ "box_prefixed_key%0#1" ] }, - "5547": { + "5530": { "op": "box_get", "defined_out": [ "aggregate%box_get%1#0", @@ -50837,7 +50817,7 @@ "aggregate%box_get%1#0" ] }, - "5548": { + "5531": { "op": "swap", "stack_out": [ "position#0", @@ -50847,7 +50827,7 @@ "position#0" ] }, - "5549": { + "5532": { "op": "dup", "stack_out": [ "position#0", @@ -50858,7 +50838,7 @@ "position#0 (copy)" ] }, - "5550": { + "5533": { "op": "cover 2", "stack_out": [ "position#0", @@ -50869,7 +50849,7 @@ "position#0" ] }, - "5552": { + "5535": { "op": "frame_bury 0", "defined_out": [ "aggregate%box_get%1#0", @@ -50884,7 +50864,7 @@ "aggregate%box_get%1#0" ] }, - "5554": { + "5537": { "error": "check self.account entry exists", "op": "assert // check self.account entry exists", "stack_out": [ @@ -50894,7 +50874,7 @@ "position#0" ] }, - "5555": { + "5538": { "op": "pushint 40", "defined_out": [ "40", @@ -50909,7 +50889,7 @@ "40" ] }, - "5557": { + "5540": { "op": "extract_uint64", "defined_out": [ "activated_units#0", @@ -50923,7 +50903,7 @@ "activated_units#0" ] }, - "5558": { + "5541": { "op": "dup", "stack_out": [ "position#0", @@ -50933,7 +50913,7 @@ "activated_units#0" ] }, - "5559": { + "5542": { "op": "frame_bury 1", "defined_out": [ "activated_units#0", @@ -50947,7 +50927,7 @@ "activated_units#0" ] }, - "5561": { + "5544": { "op": "bnz _ensure_units_activated_after_if_else@4", "stack_out": [ "position#0", @@ -50955,11 +50935,11 @@ "box_prefixed_key%0#1" ] }, - "5564": { + "5547": { "retsub": true, "op": "retsub" }, - "5565": { + "5548": { "block": "_ensure_units_activated_after_if_else@4", "stack_in": [ "position#0", @@ -50977,7 +50957,7 @@ "position#0" ] }, - "5567": { + "5550": { "op": "dup", "defined_out": [ "position#0", @@ -50991,7 +50971,7 @@ "position#0 (copy)" ] }, - "5568": { + "5551": { "op": "intc_3 // 32", "defined_out": [ "32", @@ -51007,7 +50987,7 @@ "32" ] }, - "5569": { + "5552": { "op": "extract_uint64", "defined_out": [ "position#0", @@ -51021,7 +51001,7 @@ "values%2#0" ] }, - "5570": { + "5553": { "op": "frame_dig 1", "defined_out": [ "activated_units#0", @@ -51037,7 +51017,7 @@ "activated_units#0" ] }, - "5572": { + "5555": { "op": "dup", "defined_out": [ "activated_units#0", @@ -51055,7 +51035,7 @@ "activated_units#0 (copy)" ] }, - "5573": { + "5556": { "op": "cover 3", "stack_out": [ "position#0", @@ -51067,7 +51047,7 @@ "activated_units#0 (copy)" ] }, - "5575": { + "5558": { "op": "+", "defined_out": [ "activated_units#0", @@ -51083,7 +51063,7 @@ "tmp%2#0" ] }, - "5576": { + "5559": { "op": "itob", "defined_out": [ "activated_units#0", @@ -51099,7 +51079,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "5577": { + "5560": { "op": "replace2 32", "stack_out": [ "position#0", @@ -51109,7 +51089,7 @@ "position#0" ] }, - "5579": { + "5562": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -51125,7 +51105,7 @@ "0" ] }, - "5580": { + "5563": { "op": "itob", "defined_out": [ "activated_units#0", @@ -51141,7 +51121,7 @@ "aggregate%val_as_bytes%1#0" ] }, - "5581": { + "5564": { "op": "replace2 40", "stack_out": [ "position#0", @@ -51151,7 +51131,7 @@ "position#0" ] }, - "5583": { + "5566": { "op": "frame_dig 2", "defined_out": [ "activated_units#0", @@ -51167,7 +51147,7 @@ "box_prefixed_key%0#1" ] }, - "5585": { + "5568": { "op": "swap", "stack_out": [ "position#0", @@ -51178,7 +51158,7 @@ "position#0" ] }, - "5586": { + "5569": { "op": "box_put", "stack_out": [ "position#0", @@ -51187,7 +51167,7 @@ "activated_units#0" ] }, - "5587": { + "5570": { "op": "intc_0 // 0", "stack_out": [ "position#0", @@ -51197,7 +51177,7 @@ "0" ] }, - "5588": { + "5571": { "op": "bytec 11 // \"reserved_units_total\"", "defined_out": [ "\"reserved_units_total\"", @@ -51215,7 +51195,7 @@ "\"reserved_units_total\"" ] }, - "5590": { + "5573": { "op": "app_global_get_ex", "defined_out": [ "activated_units#0", @@ -51233,7 +51213,7 @@ "maybe_exists%0#0" ] }, - "5591": { + "5574": { "error": "check self.reserved_units_total exists", "op": "assert // check self.reserved_units_total exists", "stack_out": [ @@ -51244,7 +51224,7 @@ "maybe_value%0#0" ] }, - "5592": { + "5575": { "op": "dup", "defined_out": [ "activated_units#0", @@ -51262,7 +51242,7 @@ "maybe_value%0#0 (copy)" ] }, - "5593": { + "5576": { "op": "dig 2", "stack_out": [ "position#0", @@ -51274,7 +51254,7 @@ "activated_units#0 (copy)" ] }, - "5595": { + "5578": { "op": ">=", "defined_out": [ "activated_units#0", @@ -51292,7 +51272,7 @@ "tmp%3#0" ] }, - "5596": { + "5579": { "error": "Insufficient remaining D-ASA units", "op": "assert // Insufficient remaining D-ASA units", "stack_out": [ @@ -51303,7 +51283,7 @@ "maybe_value%0#0" ] }, - "5597": { + "5580": { "op": "swap", "stack_out": [ "position#0", @@ -51313,7 +51293,7 @@ "activated_units#0" ] }, - "5598": { + "5581": { "op": "-", "defined_out": [ "activated_units#0", @@ -51328,7 +51308,7 @@ "tmp%4#0" ] }, - "5599": { + "5582": { "op": "bytec 11 // \"reserved_units_total\"", "stack_out": [ "position#0", @@ -51338,7 +51318,7 @@ "\"reserved_units_total\"" ] }, - "5601": { + "5584": { "op": "swap", "stack_out": [ "position#0", @@ -51348,7 +51328,7 @@ "tmp%4#0" ] }, - "5602": { + "5585": { "op": "app_global_put", "stack_out": [ "position#0", @@ -51356,11 +51336,11 @@ "box_prefixed_key%0#1" ] }, - "5603": { + "5586": { "retsub": true, "op": "retsub" }, - "5604": { + "5587": { "subroutine": "modules.actus_kernel.ActusKernelModule._scaled_mul_div", "params": { "multiplicand#0": "uint64", @@ -51371,7 +51351,7 @@ "stack_in": [], "op": "proto 3 1" }, - "5607": { + "5590": { "op": "frame_dig -3", "defined_out": [ "multiplicand#0 (copy)" @@ -51380,11 +51360,11 @@ "multiplicand#0 (copy)" ] }, - "5609": { + "5592": { "op": "bz _scaled_mul_div_if_body@2", "stack_out": [] }, - "5612": { + "5595": { "op": "frame_dig -2", "defined_out": [ "multiplier#0 (copy)" @@ -51393,11 +51373,11 @@ "multiplier#0 (copy)" ] }, - "5614": { + "5597": { "op": "bnz _scaled_mul_div_after_if_else@3", "stack_out": [] }, - "5617": { + "5600": { "block": "_scaled_mul_div_if_body@2", "stack_in": [], "op": "intc_0 // 0", @@ -51408,11 +51388,11 @@ "0" ] }, - "5618": { + "5601": { "retsub": true, "op": "retsub" }, - "5619": { + "5602": { "block": "_scaled_mul_div_after_if_else@3", "stack_in": [], "op": "frame_dig -3", @@ -51423,7 +51403,7 @@ "multiplicand#0 (copy)" ] }, - "5621": { + "5604": { "op": "frame_dig -2", "defined_out": [ "multiplicand#0 (copy)", @@ -51434,7 +51414,7 @@ "multiplier#0 (copy)" ] }, - "5623": { + "5606": { "op": "mulw", "defined_out": [ "high#0", @@ -51445,7 +51425,7 @@ "low#0" ] }, - "5624": { + "5607": { "op": "frame_dig -1", "defined_out": [ "divisor#0 (copy)", @@ -51458,7 +51438,7 @@ "divisor#0 (copy)" ] }, - "5626": { + "5609": { "op": "divw", "defined_out": [ "tmp%4#0" @@ -51467,11 +51447,11 @@ "tmp%4#0" ] }, - "5627": { + "5610": { "retsub": true, "op": "retsub" }, - "5628": { + "5611": { "subroutine": "modules.actus_kernel.ActusKernelModule._amount_to_index_delta", "params": { "amount#0": "uint64" @@ -51480,7 +51460,7 @@ "stack_in": [], "op": "proto 1 1" }, - "5631": { + "5614": { "op": "frame_dig -1", "defined_out": [ "amount#0 (copy)" @@ -51489,11 +51469,11 @@ "amount#0 (copy)" ] }, - "5633": { + "5616": { "op": "bnz _amount_to_index_delta_after_if_else@2", "stack_out": [] }, - "5636": { + "5619": { "op": "intc_0 // 0", "defined_out": [ "0" @@ -51502,11 +51482,11 @@ "0" ] }, - "5637": { + "5620": { "retsub": true, "op": "retsub" }, - "5638": { + "5621": { "block": "_amount_to_index_delta_after_if_else@2", "stack_in": [], "op": "intc_0 // 0", @@ -51517,7 +51497,7 @@ "0" ] }, - "5639": { + "5622": { "op": "bytec 13 // \"total_units\"", "defined_out": [ "\"total_units\"", @@ -51528,7 +51508,7 @@ "\"total_units\"" ] }, - "5641": { + "5624": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -51539,14 +51519,14 @@ "maybe_exists%0#0" ] }, - "5642": { + "5625": { "error": "check self.total_units exists", "op": "assert // check self.total_units exists", "stack_out": [ "maybe_value%0#0" ] }, - "5643": { + "5626": { "op": "dup", "defined_out": [ "maybe_value%0#0", @@ -51557,21 +51537,180 @@ "maybe_value%0#0 (copy)" ] }, - "5644": { + "5627": { "error": "No D-ASA units", "op": "assert // No D-ASA units", "stack_out": [ "maybe_value%0#0" ] }, + "5628": { + "op": "intc_0 // 0", + "stack_out": [ + "maybe_value%0#0", + "0" + ] + }, + "5629": { + "op": "bytec 5 // \"fixed_point_scale\"", + "defined_out": [ + "\"fixed_point_scale\"", + "0", + "maybe_value%0#0" + ], + "stack_out": [ + "maybe_value%0#0", + "0", + "\"fixed_point_scale\"" + ] + }, + "5631": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%1#0", + "maybe_value%0#0", + "maybe_value%1#0" + ], + "stack_out": [ + "maybe_value%0#0", + "maybe_value%1#0", + "maybe_exists%1#0" + ] + }, + "5632": { + "error": "check self.fixed_point_scale exists", + "op": "assert // check self.fixed_point_scale exists", + "stack_out": [ + "maybe_value%0#0", + "maybe_value%1#0" + ] + }, + "5633": { + "op": "frame_dig -1", + "defined_out": [ + "amount#0 (copy)", + "maybe_value%0#0", + "maybe_value%1#0" + ], + "stack_out": [ + "maybe_value%0#0", + "maybe_value%1#0", + "amount#0 (copy)" + ] + }, + "5635": { + "op": "swap", + "stack_out": [ + "maybe_value%0#0", + "amount#0 (copy)", + "maybe_value%1#0" + ] + }, + "5636": { + "op": "uncover 2", + "stack_out": [ + "amount#0 (copy)", + "maybe_value%1#0", + "maybe_value%0#0" + ] + }, + "5638": { + "callsub": "modules.actus_kernel.ActusKernelModule._scaled_mul_div", + "op": "callsub _scaled_mul_div", + "defined_out": [ + "tmp%2#0" + ], + "stack_out": [ + "tmp%2#0" + ] + }, + "5641": { + "retsub": true, + "op": "retsub" + }, + "5642": { + "subroutine": "modules.actus_kernel.ActusKernelModule._index_delta_to_amount", + "params": { + "index_delta#0": "uint64" + }, + "block": "_index_delta_to_amount", + "stack_in": [], + "op": "proto 1 1" + }, "5645": { + "op": "frame_dig -1", + "defined_out": [ + "index_delta#0 (copy)" + ], + "stack_out": [ + "index_delta#0 (copy)" + ] + }, + "5647": { + "op": "bnz _index_delta_to_amount_after_if_else@2", + "stack_out": [] + }, + "5650": { + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "0" + ] + }, + "5651": { + "retsub": true, + "op": "retsub" + }, + "5652": { + "block": "_index_delta_to_amount_after_if_else@2", + "stack_in": [], + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "0" + ] + }, + "5653": { + "op": "bytec 13 // \"total_units\"", + "defined_out": [ + "\"total_units\"", + "0" + ], + "stack_out": [ + "0", + "\"total_units\"" + ] + }, + "5655": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0" + ], + "stack_out": [ + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "5656": { + "error": "check self.total_units exists", + "op": "assert // check self.total_units exists", + "stack_out": [ + "maybe_value%0#0" + ] + }, + "5657": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#0", "0" ] }, - "5646": { + "5658": { "op": "bytec 5 // \"fixed_point_scale\"", "defined_out": [ "\"fixed_point_scale\"", @@ -51584,7 +51723,7 @@ "\"fixed_point_scale\"" ] }, - "5648": { + "5660": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%1#0", @@ -51597,7 +51736,7 @@ "maybe_exists%1#0" ] }, - "5649": { + "5661": { "error": "check self.fixed_point_scale exists", "op": "assert // check self.fixed_point_scale exists", "stack_out": [ @@ -51605,169 +51744,10 @@ "maybe_value%1#0" ] }, - "5650": { - "op": "frame_dig -1", - "defined_out": [ - "amount#0 (copy)", - "maybe_value%0#0", - "maybe_value%1#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_value%1#0", - "amount#0 (copy)" - ] - }, - "5652": { - "op": "swap", - "stack_out": [ - "maybe_value%0#0", - "amount#0 (copy)", - "maybe_value%1#0" - ] - }, - "5653": { - "op": "uncover 2", - "stack_out": [ - "amount#0 (copy)", - "maybe_value%1#0", - "maybe_value%0#0" - ] - }, - "5655": { - "callsub": "modules.actus_kernel.ActusKernelModule._scaled_mul_div", - "op": "callsub _scaled_mul_div", - "defined_out": [ - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0" - ] - }, - "5658": { - "retsub": true, - "op": "retsub" - }, - "5659": { - "subroutine": "modules.actus_kernel.ActusKernelModule._index_delta_to_amount", - "params": { - "index_delta#0": "uint64" - }, - "block": "_index_delta_to_amount", - "stack_in": [], - "op": "proto 1 1" - }, "5662": { - "op": "frame_dig -1", - "defined_out": [ - "index_delta#0 (copy)" - ], - "stack_out": [ - "index_delta#0 (copy)" - ] - }, - "5664": { - "op": "bnz _index_delta_to_amount_after_if_else@2", - "stack_out": [] - }, - "5667": { - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "0" - ] - }, - "5668": { - "retsub": true, - "op": "retsub" - }, - "5669": { - "block": "_index_delta_to_amount_after_if_else@2", - "stack_in": [], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "0" - ] - }, - "5670": { - "op": "bytec 13 // \"total_units\"", - "defined_out": [ - "\"total_units\"", - "0" - ], - "stack_out": [ - "0", - "\"total_units\"" - ] - }, - "5672": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "5673": { - "error": "check self.total_units exists", - "op": "assert // check self.total_units exists", - "stack_out": [ - "maybe_value%0#0" - ] - }, - "5674": { - "op": "intc_0 // 0", - "stack_out": [ - "maybe_value%0#0", - "0" - ] - }, - "5675": { - "op": "bytec 5 // \"fixed_point_scale\"", - "defined_out": [ - "\"fixed_point_scale\"", - "0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "0", - "\"fixed_point_scale\"" - ] - }, - "5677": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%1#0", - "maybe_value%0#0", - "maybe_value%1#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "5678": { - "error": "check self.fixed_point_scale exists", - "op": "assert // check self.fixed_point_scale exists", - "stack_out": [ - "maybe_value%0#0", - "maybe_value%1#0" - ] - }, - "5679": { "op": "frame_dig -1" }, - "5681": { + "5664": { "op": "swap", "defined_out": [ "index_delta#0 (copy)", @@ -51780,7 +51760,7 @@ "maybe_value%1#0" ] }, - "5682": { + "5665": { "callsub": "modules.actus_kernel.ActusKernelModule._scaled_mul_div", "op": "callsub _scaled_mul_div", "defined_out": [ @@ -51790,11 +51770,11 @@ "tmp%1#0" ] }, - "5685": { + "5668": { "retsub": true, "op": "retsub" }, - "5686": { + "5669": { "subroutine": "modules.actus_kernel.ActusKernelModule._get_schedule_entry", "params": { "event_id#0": "uint64" @@ -51803,7 +51783,7 @@ "stack_in": [], "op": "proto 1 1" }, - "5689": { + "5672": { "op": "intc_0 // 0", "defined_out": [ "0" @@ -51812,7 +51792,7 @@ "0" ] }, - "5690": { + "5673": { "op": "bytec_3 // \"schedule_entry_count\"", "defined_out": [ "\"schedule_entry_count\"", @@ -51823,7 +51803,7 @@ "\"schedule_entry_count\"" ] }, - "5691": { + "5674": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -51834,14 +51814,14 @@ "maybe_exists%0#0" ] }, - "5692": { + "5675": { "error": "check self.schedule_entry_count exists", "op": "assert // check self.schedule_entry_count exists", "stack_out": [ "maybe_value%0#0" ] }, - "5693": { + "5676": { "op": "frame_dig -1", "defined_out": [ "event_id#0 (copy)", @@ -51852,7 +51832,7 @@ "event_id#0 (copy)" ] }, - "5695": { + "5678": { "op": ">", "defined_out": [ "tmp%0#0" @@ -51861,18 +51841,18 @@ "tmp%0#0" ] }, - "5696": { + "5679": { "error": "Invalid event id", "op": "assert // Invalid event id", "stack_out": [] }, - "5697": { + "5680": { "op": "frame_dig -1", "stack_out": [ "event_id#0 (copy)" ] }, - "5699": { + "5682": { "op": "pushint 16", "defined_out": [ "16", @@ -51883,7 +51863,7 @@ "16" ] }, - "5701": { + "5684": { "op": "/", "defined_out": [ "page_index#0" @@ -51892,7 +51872,7 @@ "page_index#0" ] }, - "5702": { + "5685": { "op": "itob", "defined_out": [ "encoded_value%0#0" @@ -51901,7 +51881,7 @@ "encoded_value%0#0" ] }, - "5703": { + "5686": { "op": "bytec 24 // 0x5323", "defined_out": [ "0x5323", @@ -51912,14 +51892,14 @@ "0x5323" ] }, - "5705": { + "5688": { "op": "swap", "stack_out": [ "0x5323", "encoded_value%0#0" ] }, - "5706": { + "5689": { "op": "concat", "defined_out": [ "box_prefixed_key%0#0" @@ -51928,7 +51908,7 @@ "box_prefixed_key%0#0" ] }, - "5707": { + "5690": { "op": "dup", "defined_out": [ "box_prefixed_key%0#0", @@ -51939,7 +51919,7 @@ "box_prefixed_key%0#0 (copy)" ] }, - "5708": { + "5691": { "op": "box_len", "defined_out": [ "_%0#0", @@ -51952,28 +51932,28 @@ "maybe_exists%1#0" ] }, - "5709": { + "5692": { "op": "bury 1", "stack_out": [ "box_prefixed_key%0#0", "maybe_exists%1#0" ] }, - "5711": { + "5694": { "error": "Invalid schedule page", "op": "assert // Invalid schedule page", "stack_out": [ "box_prefixed_key%0#0" ] }, - "5712": { + "5695": { "op": "frame_dig -1", "stack_out": [ "box_prefixed_key%0#0", "event_id#0 (copy)" ] }, - "5714": { + "5697": { "op": "pushint 16", "stack_out": [ "box_prefixed_key%0#0", @@ -51981,7 +51961,7 @@ "16" ] }, - "5716": { + "5699": { "op": "%", "defined_out": [ "box_prefixed_key%0#0", @@ -51992,7 +51972,7 @@ "offset#0" ] }, - "5717": { + "5700": { "op": "dig 1", "stack_out": [ "box_prefixed_key%0#0", @@ -52000,7 +51980,7 @@ "box_prefixed_key%0#0 (copy)" ] }, - "5719": { + "5702": { "op": "intc_0 // 0", "stack_out": [ "box_prefixed_key%0#0", @@ -52009,7 +51989,7 @@ "0" ] }, - "5720": { + "5703": { "op": "pushint 2", "defined_out": [ "0", @@ -52026,7 +52006,7 @@ "2" ] }, - "5722": { + "5705": { "op": "box_extract", "defined_out": [ "box%box_extract%0#0", @@ -52039,7 +52019,7 @@ "box%box_extract%0#0" ] }, - "5723": { + "5706": { "op": "btoi", "defined_out": [ "box%array_length%0#0", @@ -52052,7 +52032,7 @@ "box%array_length%0#0" ] }, - "5724": { + "5707": { "op": "dig 1", "defined_out": [ "box%array_length%0#0", @@ -52067,7 +52047,7 @@ "offset#0 (copy)" ] }, - "5726": { + "5709": { "op": ">", "defined_out": [ "box_prefixed_key%0#0", @@ -52080,7 +52060,7 @@ "tmp%4#0" ] }, - "5727": { + "5710": { "error": "Invalid schedule page", "op": "assert // Invalid schedule page", "stack_out": [ @@ -52088,7 +52068,7 @@ "offset#0" ] }, - "5728": { + "5711": { "op": "pushint 65", "defined_out": [ "65", @@ -52101,7 +52081,7 @@ "65" ] }, - "5730": { + "5713": { "op": "*", "defined_out": [ "box%element_offset%0#0", @@ -52112,7 +52092,7 @@ "box%element_offset%0#0" ] }, - "5731": { + "5714": { "op": "pushint 2", "stack_out": [ "box_prefixed_key%0#0", @@ -52120,7 +52100,7 @@ "2" ] }, - "5733": { + "5716": { "op": "+", "defined_out": [ "box%offset%0#0", @@ -52131,7 +52111,7 @@ "box%offset%0#0" ] }, - "5734": { + "5717": { "op": "pushint 65", "stack_out": [ "box_prefixed_key%0#0", @@ -52139,7 +52119,7 @@ "65" ] }, - "5736": { + "5719": { "op": "box_extract", "defined_out": [ "box%box_extract%1#0" @@ -52148,11 +52128,11 @@ "box%box_extract%1#0" ] }, - "5737": { + "5720": { "retsub": true, "op": "retsub" }, - "5738": { + "5721": { "subroutine": "modules.actus_kernel.ActusKernelModule._assert_event_allowed_for_contract_type", "params": { "contract_type#0": "uint64", @@ -52162,7 +52142,7 @@ "stack_in": [], "op": "proto 2 0" }, - "5741": { + "5724": { "op": "frame_dig -1", "defined_out": [ "event_type#0 (copy)" @@ -52171,7 +52151,7 @@ "event_type#0 (copy)" ] }, - "5743": { + "5726": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -52182,7 +52162,7 @@ "1" ] }, - "5744": { + "5727": { "op": "==", "defined_out": [ "tmp%0#0" @@ -52191,17 +52171,17 @@ "tmp%0#0" ] }, - "5745": { + "5728": { "op": "bnz _assert_event_allowed_for_contract_type_if_body@6", "stack_out": [] }, - "5748": { + "5731": { "op": "frame_dig -1", "stack_out": [ "event_type#0 (copy)" ] }, - "5750": { + "5733": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -52212,7 +52192,7 @@ "8" ] }, - "5751": { + "5734": { "op": "==", "defined_out": [ "tmp%1#0" @@ -52221,17 +52201,17 @@ "tmp%1#0" ] }, - "5752": { + "5735": { "op": "bnz _assert_event_allowed_for_contract_type_if_body@6", "stack_out": [] }, - "5755": { + "5738": { "op": "frame_dig -1", "stack_out": [ "event_type#0 (copy)" ] }, - "5757": { + "5740": { "op": "pushint 19", "defined_out": [ "19", @@ -52242,7 +52222,7 @@ "19" ] }, - "5759": { + "5742": { "op": "==", "defined_out": [ "tmp%2#0" @@ -52251,17 +52231,17 @@ "tmp%2#0" ] }, - "5760": { + "5743": { "op": "bnz _assert_event_allowed_for_contract_type_if_body@6", "stack_out": [] }, - "5763": { + "5746": { "op": "frame_dig -1", "stack_out": [ "event_type#0 (copy)" ] }, - "5765": { + "5748": { "op": "pushint 12", "defined_out": [ "12", @@ -52272,7 +52252,7 @@ "12" ] }, - "5767": { + "5750": { "op": "==", "defined_out": [ "tmp%3#0" @@ -52281,17 +52261,17 @@ "tmp%3#0" ] }, - "5768": { + "5751": { "op": "bnz _assert_event_allowed_for_contract_type_if_body@6", "stack_out": [] }, - "5771": { + "5754": { "op": "frame_dig -1", "stack_out": [ "event_type#0 (copy)" ] }, - "5773": { + "5756": { "op": "pushint 11", "defined_out": [ "11", @@ -52302,7 +52282,7 @@ "11" ] }, - "5775": { + "5758": { "op": "==", "defined_out": [ "tmp%4#0" @@ -52311,11 +52291,11 @@ "tmp%4#0" ] }, - "5776": { + "5759": { "op": "bz _assert_event_allowed_for_contract_type_after_if_else@7", "stack_out": [] }, - "5779": { + "5762": { "block": "_assert_event_allowed_for_contract_type_if_body@6", "stack_in": [], "op": "intc_1 // 1", @@ -52326,7 +52306,7 @@ "tmp%0#0" ] }, - "5780": { + "5763": { "error": "Invalid ACTUS configuration", "block": "_assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34", "stack_in": [ @@ -52336,11 +52316,11 @@ "defined_out": [], "stack_out": [] }, - "5781": { + "5764": { "retsub": true, "op": "retsub" }, - "5782": { + "5765": { "block": "_assert_event_allowed_for_contract_type_after_if_else@7", "stack_in": [], "op": "frame_dig -2", @@ -52351,11 +52331,11 @@ "contract_type#0 (copy)" ] }, - "5784": { + "5767": { "op": "bnz _assert_event_allowed_for_contract_type_after_if_else@9", "stack_out": [] }, - "5787": { + "5770": { "op": "intc_0 // 0", "defined_out": [ "tmp%0#0" @@ -52364,10 +52344,10 @@ "tmp%0#0" ] }, - "5788": { + "5771": { "op": "b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34" }, - "5791": { + "5774": { "block": "_assert_event_allowed_for_contract_type_after_if_else@9", "stack_in": [], "op": "frame_dig -2", @@ -52378,7 +52358,7 @@ "contract_type#0 (copy)" ] }, - "5793": { + "5776": { "op": "pushint 3", "defined_out": [ "3", @@ -52389,7 +52369,7 @@ "3" ] }, - "5795": { + "5778": { "op": "==", "defined_out": [ "tmp%6#0" @@ -52398,17 +52378,17 @@ "tmp%6#0" ] }, - "5796": { + "5779": { "op": "bnz _assert_event_allowed_for_contract_type_if_body@11", "stack_out": [] }, - "5799": { + "5782": { "op": "frame_dig -2", "stack_out": [ "contract_type#0 (copy)" ] }, - "5801": { + "5784": { "op": "pushint 2", "defined_out": [ "2", @@ -52419,7 +52399,7 @@ "2" ] }, - "5803": { + "5786": { "op": "==", "defined_out": [ "tmp%7#0" @@ -52428,11 +52408,11 @@ "tmp%7#0" ] }, - "5804": { + "5787": { "op": "bz _assert_event_allowed_for_contract_type_after_if_else@16", "stack_out": [] }, - "5807": { + "5790": { "block": "_assert_event_allowed_for_contract_type_if_body@11", "stack_in": [], "op": "frame_dig -1", @@ -52443,7 +52423,7 @@ "event_type#0 (copy)" ] }, - "5809": { + "5792": { "op": "pushint 3", "defined_out": [ "3", @@ -52454,7 +52434,7 @@ "3" ] }, - "5811": { + "5794": { "op": "==", "defined_out": [ "tmp%8#0" @@ -52463,17 +52443,17 @@ "tmp%8#0" ] }, - "5812": { + "5795": { "op": "bnz _assert_event_allowed_for_contract_type_bool_true@13", "stack_out": [] }, - "5815": { + "5798": { "op": "frame_dig -1", "stack_out": [ "event_type#0 (copy)" ] }, - "5817": { + "5800": { "op": "pushint 18", "defined_out": [ "18", @@ -52484,7 +52464,7 @@ "18" ] }, - "5819": { + "5802": { "op": "==", "defined_out": [ "tmp%9#0" @@ -52493,11 +52473,11 @@ "tmp%9#0" ] }, - "5820": { + "5803": { "op": "bz _assert_event_allowed_for_contract_type_bool_false@14", "stack_out": [] }, - "5823": { + "5806": { "block": "_assert_event_allowed_for_contract_type_bool_true@13", "stack_in": [], "op": "intc_1 // 1", @@ -52508,7 +52488,7 @@ "or_result%0#0" ] }, - "5824": { + "5807": { "op": "b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34", "defined_out": [ "tmp%0#0" @@ -52517,7 +52497,7 @@ "tmp%0#0" ] }, - "5827": { + "5810": { "block": "_assert_event_allowed_for_contract_type_bool_false@14", "stack_in": [], "op": "intc_0 // 0", @@ -52528,7 +52508,7 @@ "or_result%0#0" ] }, - "5828": { + "5811": { "op": "b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34", "defined_out": [ "tmp%0#0" @@ -52537,7 +52517,7 @@ "tmp%0#0" ] }, - "5831": { + "5814": { "block": "_assert_event_allowed_for_contract_type_after_if_else@16", "stack_in": [], "op": "frame_dig -2", @@ -52548,7 +52528,7 @@ "contract_type#0 (copy)" ] }, - "5833": { + "5816": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -52559,7 +52539,7 @@ "1" ] }, - "5834": { + "5817": { "op": "==", "defined_out": [ "tmp%10#0" @@ -52568,11 +52548,11 @@ "tmp%10#0" ] }, - "5835": { + "5818": { "op": "bz _assert_event_allowed_for_contract_type_after_if_else@23", "stack_out": [] }, - "5838": { + "5821": { "op": "frame_dig -1", "defined_out": [ "event_type#0 (copy)" @@ -52581,7 +52561,7 @@ "event_type#0 (copy)" ] }, - "5840": { + "5823": { "op": "pushint 3", "defined_out": [ "3", @@ -52592,7 +52572,7 @@ "3" ] }, - "5842": { + "5825": { "op": "==", "defined_out": [ "tmp%11#0" @@ -52601,17 +52581,17 @@ "tmp%11#0" ] }, - "5843": { + "5826": { "op": "bnz _assert_event_allowed_for_contract_type_bool_true@20", "stack_out": [] }, - "5846": { + "5829": { "op": "frame_dig -1", "stack_out": [ "event_type#0 (copy)" ] }, - "5848": { + "5831": { "op": "pushint 18", "defined_out": [ "18", @@ -52622,7 +52602,7 @@ "18" ] }, - "5850": { + "5833": { "op": "==", "defined_out": [ "tmp%12#0" @@ -52631,17 +52611,17 @@ "tmp%12#0" ] }, - "5851": { + "5834": { "op": "bnz _assert_event_allowed_for_contract_type_bool_true@20", "stack_out": [] }, - "5854": { + "5837": { "op": "frame_dig -1", "stack_out": [ "event_type#0 (copy)" ] }, - "5856": { + "5839": { "op": "pushint 5", "defined_out": [ "5", @@ -52652,7 +52632,7 @@ "5" ] }, - "5858": { + "5841": { "op": "==", "defined_out": [ "tmp%13#0" @@ -52661,11 +52641,11 @@ "tmp%13#0" ] }, - "5859": { + "5842": { "op": "bz _assert_event_allowed_for_contract_type_bool_false@21", "stack_out": [] }, - "5862": { + "5845": { "block": "_assert_event_allowed_for_contract_type_bool_true@20", "stack_in": [], "op": "intc_1 // 1", @@ -52676,7 +52656,7 @@ "or_result%1#0" ] }, - "5863": { + "5846": { "op": "b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34", "defined_out": [ "tmp%0#0" @@ -52685,7 +52665,7 @@ "tmp%0#0" ] }, - "5866": { + "5849": { "block": "_assert_event_allowed_for_contract_type_bool_false@21", "stack_in": [], "op": "intc_0 // 0", @@ -52696,7 +52676,7 @@ "or_result%1#0" ] }, - "5867": { + "5850": { "op": "b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34", "defined_out": [ "tmp%0#0" @@ -52705,7 +52685,7 @@ "tmp%0#0" ] }, - "5870": { + "5853": { "block": "_assert_event_allowed_for_contract_type_after_if_else@23", "stack_in": [], "op": "frame_dig -2", @@ -52716,7 +52696,7 @@ "contract_type#0 (copy)" ] }, - "5872": { + "5855": { "op": "pushint 4", "defined_out": [ "4", @@ -52727,7 +52707,7 @@ "4" ] }, - "5874": { + "5857": { "op": "==", "defined_out": [ "tmp%14#0" @@ -52736,11 +52716,11 @@ "tmp%14#0" ] }, - "5875": { + "5858": { "op": "bz _assert_event_allowed_for_contract_type_after_if_else@31", "stack_out": [] }, - "5878": { + "5861": { "op": "frame_dig -1", "defined_out": [ "event_type#0 (copy)" @@ -52749,7 +52729,7 @@ "event_type#0 (copy)" ] }, - "5880": { + "5863": { "op": "pushint 3", "defined_out": [ "3", @@ -52760,7 +52740,7 @@ "3" ] }, - "5882": { + "5865": { "op": "==", "defined_out": [ "tmp%15#0" @@ -52769,24 +52749,24 @@ "tmp%15#0" ] }, - "5883": { + "5866": { "op": "bnz _assert_event_allowed_for_contract_type_bool_true@28", "stack_out": [] }, - "5886": { + "5869": { "op": "frame_dig -1", "stack_out": [ "event_type#0 (copy)" ] }, - "5888": { + "5871": { "op": "pushint 4", "stack_out": [ "event_type#0 (copy)", "4" ] }, - "5890": { + "5873": { "op": "==", "defined_out": [ "tmp%16#0" @@ -52795,17 +52775,17 @@ "tmp%16#0" ] }, - "5891": { + "5874": { "op": "bnz _assert_event_allowed_for_contract_type_bool_true@28", "stack_out": [] }, - "5894": { + "5877": { "op": "frame_dig -1", "stack_out": [ "event_type#0 (copy)" ] }, - "5896": { + "5879": { "op": "pushint 18", "defined_out": [ "18", @@ -52816,7 +52796,7 @@ "18" ] }, - "5898": { + "5881": { "op": "==", "defined_out": [ "tmp%17#0" @@ -52825,17 +52805,17 @@ "tmp%17#0" ] }, - "5899": { + "5882": { "op": "bnz _assert_event_allowed_for_contract_type_bool_true@28", "stack_out": [] }, - "5902": { + "5885": { "op": "frame_dig -1", "stack_out": [ "event_type#0 (copy)" ] }, - "5904": { + "5887": { "op": "pushint 5", "defined_out": [ "5", @@ -52846,7 +52826,7 @@ "5" ] }, - "5906": { + "5889": { "op": "==", "defined_out": [ "tmp%18#0" @@ -52855,11 +52835,11 @@ "tmp%18#0" ] }, - "5907": { + "5890": { "op": "bz _assert_event_allowed_for_contract_type_bool_false@29", "stack_out": [] }, - "5910": { + "5893": { "block": "_assert_event_allowed_for_contract_type_bool_true@28", "stack_in": [], "op": "intc_1 // 1", @@ -52870,7 +52850,7 @@ "or_result%2#0" ] }, - "5911": { + "5894": { "op": "b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34", "defined_out": [ "tmp%0#0" @@ -52879,7 +52859,7 @@ "tmp%0#0" ] }, - "5914": { + "5897": { "block": "_assert_event_allowed_for_contract_type_bool_false@29", "stack_in": [], "op": "intc_0 // 0", @@ -52890,7 +52870,7 @@ "or_result%2#0" ] }, - "5915": { + "5898": { "op": "b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34", "defined_out": [ "tmp%0#0" @@ -52899,7 +52879,7 @@ "tmp%0#0" ] }, - "5918": { + "5901": { "block": "_assert_event_allowed_for_contract_type_after_if_else@31", "stack_in": [], "op": "frame_dig -2", @@ -52910,7 +52890,7 @@ "contract_type#0 (copy)" ] }, - "5920": { + "5903": { "op": "pushint 5", "defined_out": [ "5", @@ -52921,7 +52901,7 @@ "5" ] }, - "5922": { + "5905": { "op": "==", "defined_out": [ "tmp%19#0" @@ -52930,11 +52910,11 @@ "tmp%19#0" ] }, - "5923": { + "5906": { "op": "bz _assert_event_allowed_for_contract_type_after_if_else@33", "stack_out": [] }, - "5926": { + "5909": { "op": "frame_dig -1", "defined_out": [ "event_type#0 (copy)" @@ -52943,7 +52923,7 @@ "event_type#0 (copy)" ] }, - "5928": { + "5911": { "op": "pushint 3", "defined_out": [ "3", @@ -52954,7 +52934,7 @@ "3" ] }, - "5930": { + "5913": { "op": "==", "defined_out": [ "tmp%0#0" @@ -52963,10 +52943,10 @@ "tmp%0#0" ] }, - "5931": { + "5914": { "op": "b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34" }, - "5934": { + "5917": { "block": "_assert_event_allowed_for_contract_type_after_if_else@33", "stack_in": [], "op": "intc_0 // 0", @@ -52977,10 +52957,10 @@ "tmp%0#0" ] }, - "5935": { + "5918": { "op": "b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34" }, - "5938": { + "5921": { "subroutine": "modules.actus_kernel.ActusKernelModule._is_dynamic_annuity", "params": {}, "block": "_is_dynamic_annuity", @@ -52993,7 +52973,7 @@ "0" ] }, - "5939": { + "5922": { "op": "bytec 10 // \"contract_type\"", "defined_out": [ "\"contract_type\"", @@ -53004,7 +52984,7 @@ "\"contract_type\"" ] }, - "5941": { + "5924": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -53015,14 +52995,14 @@ "maybe_exists%0#0" ] }, - "5942": { + "5925": { "error": "check self.contract_type exists", "op": "assert // check self.contract_type exists", "stack_out": [ "maybe_value%0#0" ] }, - "5943": { + "5926": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -53033,7 +53013,7 @@ "1" ] }, - "5944": { + "5927": { "op": "==", "defined_out": [ "tmp%0#0" @@ -53042,18 +53022,18 @@ "tmp%0#0" ] }, - "5945": { + "5928": { "op": "bz _is_dynamic_annuity_bool_false@3", "stack_out": [] }, - "5948": { + "5931": { "op": "intc_0 // 0", "stack_out": [ "0" ] }, - "5949": { - "op": "bytec 34 // \"dynamic_principal_redemption\"", + "5932": { + "op": "bytec 35 // \"dynamic_principal_redemption\"", "defined_out": [ "\"dynamic_principal_redemption\"", "0" @@ -53063,7 +53043,7 @@ "\"dynamic_principal_redemption\"" ] }, - "5951": { + "5934": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%1#0", @@ -53074,18 +53054,18 @@ "maybe_exists%1#0" ] }, - "5952": { + "5935": { "error": "check self.dynamic_principal_redemption exists", "op": "assert // check self.dynamic_principal_redemption exists", "stack_out": [ "maybe_value%1#0" ] }, - "5953": { + "5936": { "op": "bz _is_dynamic_annuity_bool_false@3", "stack_out": [] }, - "5956": { + "5939": { "op": "intc_1 // 1", "defined_out": [ "and_result%0#0" @@ -53094,11 +53074,11 @@ "and_result%0#0" ] }, - "5957": { + "5940": { "retsub": true, "op": "retsub" }, - "5958": { + "5941": { "block": "_is_dynamic_annuity_bool_false@3", "stack_in": [], "op": "intc_0 // 0", @@ -53109,11 +53089,11 @@ "and_result%0#0" ] }, - "5959": { + "5942": { "retsub": true, "op": "retsub" }, - "5960": { + "5943": { "subroutine": "modules.actus_kernel.ActusKernelModule._entry_interest_segment", "params": { "entry#0": "bytes" @@ -53122,7 +53102,7 @@ "stack_in": [], "op": "proto 1 2" }, - "5963": { + "5946": { "op": "frame_dig -1", "defined_out": [ "entry#0 (copy)" @@ -53131,7 +53111,7 @@ "entry#0 (copy)" ] }, - "5965": { + "5948": { "op": "pushint 17", "defined_out": [ "17", @@ -53142,7 +53122,7 @@ "17" ] }, - "5967": { + "5950": { "op": "extract_uint64", "defined_out": [ "values%0#0" @@ -53151,7 +53131,7 @@ "values%0#0" ] }, - "5968": { + "5951": { "op": "dup", "defined_out": [ "values%0#0" @@ -53161,20 +53141,20 @@ "values%0#0" ] }, - "5969": { + "5952": { "op": "bz _entry_interest_segment_if_body@3", "stack_out": [ "values%0#0" ] }, - "5972": { + "5955": { "op": "intc_0 // 0", "stack_out": [ "values%0#0", "0" ] }, - "5973": { + "5956": { "op": "bytec 9 // \"nominal_interest_rate\"", "defined_out": [ "\"nominal_interest_rate\"", @@ -53187,7 +53167,7 @@ "\"nominal_interest_rate\"" ] }, - "5975": { + "5958": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -53200,7 +53180,7 @@ "maybe_exists%0#0" ] }, - "5976": { + "5959": { "error": "check self.nominal_interest_rate exists", "op": "assert // check self.nominal_interest_rate exists", "stack_out": [ @@ -53208,20 +53188,20 @@ "maybe_value%0#0" ] }, - "5977": { + "5960": { "op": "bz _entry_interest_segment_if_body@3", "stack_out": [ "values%0#0" ] }, - "5980": { + "5963": { "op": "intc_0 // 0", "stack_out": [ "values%0#0", "0" ] }, - "5981": { + "5964": { "op": "bytec 7 // \"interest_calculation_base\"", "defined_out": [ "\"interest_calculation_base\"", @@ -53234,7 +53214,7 @@ "\"interest_calculation_base\"" ] }, - "5983": { + "5966": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%1#0", @@ -53247,7 +53227,7 @@ "maybe_exists%1#0" ] }, - "5984": { + "5967": { "error": "check self.interest_calculation_base exists", "op": "assert // check self.interest_calculation_base exists", "stack_out": [ @@ -53255,13 +53235,13 @@ "maybe_value%1#0" ] }, - "5985": { + "5968": { "op": "bnz _entry_interest_segment_after_if_else@4", "stack_out": [ "values%0#0" ] }, - "5988": { + "5971": { "block": "_entry_interest_segment_if_body@3", "stack_in": [ "values%0#0" @@ -53275,7 +53255,7 @@ "0" ] }, - "5989": { + "5972": { "op": "frame_dig -1", "defined_out": [ "0", @@ -53287,14 +53267,14 @@ "entry#0 (copy)" ] }, - "5991": { + "5974": { "op": "uncover 2" }, - "5993": { + "5976": { "retsub": true, "op": "retsub" }, - "5994": { + "5977": { "block": "_entry_interest_segment_after_if_else@4", "stack_in": [ "values%0#0" @@ -53308,7 +53288,7 @@ "0" ] }, - "5995": { + "5978": { "op": "bytec 7 // \"interest_calculation_base\"", "defined_out": [ "\"interest_calculation_base\"", @@ -53320,7 +53300,7 @@ "\"interest_calculation_base\"" ] }, - "5997": { + "5980": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%2#0", @@ -53332,7 +53312,7 @@ "maybe_exists%2#0" ] }, - "5998": { + "5981": { "error": "check self.interest_calculation_base exists", "op": "assert // check self.interest_calculation_base exists", "stack_out": [ @@ -53340,7 +53320,7 @@ "maybe_value%2#0" ] }, - "5999": { + "5982": { "op": "intc_0 // 0", "stack_out": [ "values%0#0", @@ -53348,7 +53328,7 @@ "0" ] }, - "6000": { + "5983": { "op": "bytec 9 // \"nominal_interest_rate\"", "defined_out": [ "\"nominal_interest_rate\"", @@ -53362,7 +53342,7 @@ "\"nominal_interest_rate\"" ] }, - "6002": { + "5985": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%3#0", @@ -53376,7 +53356,7 @@ "maybe_exists%3#0" ] }, - "6003": { + "5986": { "error": "check self.nominal_interest_rate exists", "op": "assert // check self.nominal_interest_rate exists", "stack_out": [ @@ -53385,7 +53365,7 @@ "maybe_value%3#0" ] }, - "6004": { + "5987": { "op": "intc_0 // 0", "stack_out": [ "values%0#0", @@ -53394,7 +53374,7 @@ "0" ] }, - "6005": { + "5988": { "op": "bytec 5 // \"fixed_point_scale\"", "defined_out": [ "\"fixed_point_scale\"", @@ -53410,7 +53390,7 @@ "\"fixed_point_scale\"" ] }, - "6007": { + "5990": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%4#0", @@ -53426,7 +53406,7 @@ "maybe_exists%4#0" ] }, - "6008": { + "5991": { "error": "check self.fixed_point_scale exists", "op": "assert // check self.fixed_point_scale exists", "stack_out": [ @@ -53436,7 +53416,7 @@ "maybe_value%4#0" ] }, - "6009": { + "5992": { "callsub": "modules.actus_kernel.ActusKernelModule._scaled_mul_div", "op": "callsub _scaled_mul_div", "defined_out": [ @@ -53447,7 +53427,7 @@ "accrued#0" ] }, - "6012": { + "5995": { "op": "intc_0 // 0", "stack_out": [ "values%0#0", @@ -53455,7 +53435,7 @@ "0" ] }, - "6013": { + "5996": { "op": "bytec 5 // \"fixed_point_scale\"", "stack_out": [ "values%0#0", @@ -53464,7 +53444,7 @@ "\"fixed_point_scale\"" ] }, - "6015": { + "5998": { "op": "app_global_get_ex", "defined_out": [ "accrued#0", @@ -53478,7 +53458,7 @@ "maybe_exists%5#0" ] }, - "6016": { + "5999": { "error": "check self.fixed_point_scale exists", "op": "assert // check self.fixed_point_scale exists", "stack_out": [ @@ -53487,10 +53467,10 @@ "maybe_value%5#0" ] }, - "6017": { + "6000": { "op": "frame_dig 0" }, - "6019": { + "6002": { "op": "swap", "defined_out": [ "accrued#0", @@ -53504,7 +53484,7 @@ "maybe_value%5#0" ] }, - "6020": { + "6003": { "callsub": "modules.actus_kernel.ActusKernelModule._scaled_mul_div", "op": "callsub _scaled_mul_div", "defined_out": [ @@ -53516,7 +53496,7 @@ "tmp%4#0" ] }, - "6023": { + "6006": { "op": "frame_dig -1", "defined_out": [ "entry#0 (copy)", @@ -53529,14 +53509,14 @@ "entry#0 (copy)" ] }, - "6025": { + "6008": { "op": "uncover 2" }, - "6027": { + "6010": { "retsub": true, "op": "retsub" }, - "6028": { + "6011": { "subroutine": "modules.actus_kernel.ActusKernelModule._discount_annuity_factor", "params": { "discount_factor#0": "uint64", @@ -53546,7 +53526,7 @@ "stack_in": [], "op": "proto 2 1" }, - "6031": { + "6014": { "op": "frame_dig -1", "defined_out": [ "redemption_factor#0 (copy)" @@ -53555,11 +53535,11 @@ "redemption_factor#0 (copy)" ] }, - "6033": { + "6016": { "op": "bnz _discount_annuity_factor_after_if_else@2", "stack_out": [] }, - "6036": { + "6019": { "op": "frame_dig -2", "defined_out": [ "discount_factor#0 (copy)" @@ -53568,11 +53548,11 @@ "discount_factor#0 (copy)" ] }, - "6038": { + "6021": { "retsub": true, "op": "retsub" }, - "6039": { + "6022": { "block": "_discount_annuity_factor_after_if_else@2", "stack_in": [], "op": "intc_0 // 0", @@ -53583,7 +53563,7 @@ "0" ] }, - "6040": { + "6023": { "op": "bytec 5 // \"fixed_point_scale\"", "defined_out": [ "\"fixed_point_scale\"", @@ -53594,7 +53574,7 @@ "\"fixed_point_scale\"" ] }, - "6042": { + "6025": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -53605,21 +53585,21 @@ "maybe_exists%0#0" ] }, - "6043": { + "6026": { "error": "check self.fixed_point_scale exists", "op": "assert // check self.fixed_point_scale exists", "stack_out": [ "maybe_value%0#0" ] }, - "6044": { + "6027": { "op": "intc_0 // 0", "stack_out": [ "maybe_value%0#0", "0" ] }, - "6045": { + "6028": { "op": "bytec 9 // \"nominal_interest_rate\"", "defined_out": [ "\"nominal_interest_rate\"", @@ -53632,7 +53612,7 @@ "\"nominal_interest_rate\"" ] }, - "6047": { + "6030": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%1#0", @@ -53645,7 +53625,7 @@ "maybe_exists%1#0" ] }, - "6048": { + "6031": { "error": "check self.nominal_interest_rate exists", "op": "assert // check self.nominal_interest_rate exists", "stack_out": [ @@ -53653,7 +53633,7 @@ "maybe_value%1#0" ] }, - "6049": { + "6032": { "op": "frame_dig -1", "defined_out": [ "maybe_value%0#0", @@ -53666,7 +53646,7 @@ "redemption_factor#0 (copy)" ] }, - "6051": { + "6034": { "op": "dig 2", "defined_out": [ "maybe_value%0#0", @@ -53681,7 +53661,7 @@ "maybe_value%0#0 (copy)" ] }, - "6053": { + "6036": { "callsub": "modules.actus_kernel.ActusKernelModule._scaled_mul_div", "op": "callsub _scaled_mul_div", "defined_out": [ @@ -53693,7 +53673,7 @@ "tmp%1#0" ] }, - "6056": { + "6039": { "op": "+", "defined_out": [ "period_rate#0" @@ -53702,7 +53682,7 @@ "period_rate#0" ] }, - "6057": { + "6040": { "op": "dup", "defined_out": [ "period_rate#0", @@ -53713,21 +53693,21 @@ "period_rate#0 (copy)" ] }, - "6058": { + "6041": { "error": "Invalid ACTUS configuration", "op": "assert // Invalid ACTUS configuration", "stack_out": [ "period_rate#0" ] }, - "6059": { + "6042": { "op": "intc_0 // 0", "stack_out": [ "period_rate#0", "0" ] }, - "6060": { + "6043": { "op": "bytec 5 // \"fixed_point_scale\"", "stack_out": [ "period_rate#0", @@ -53735,7 +53715,7 @@ "\"fixed_point_scale\"" ] }, - "6062": { + "6045": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%3#0", @@ -53748,7 +53728,7 @@ "maybe_exists%3#0" ] }, - "6063": { + "6046": { "error": "check self.fixed_point_scale exists", "op": "assert // check self.fixed_point_scale exists", "stack_out": [ @@ -53756,7 +53736,7 @@ "maybe_value%3#0" ] }, - "6064": { + "6047": { "op": "frame_dig -2", "defined_out": [ "discount_factor#0 (copy)", @@ -53769,7 +53749,7 @@ "discount_factor#0 (copy)" ] }, - "6066": { + "6049": { "op": "swap", "stack_out": [ "period_rate#0", @@ -53777,7 +53757,7 @@ "maybe_value%3#0" ] }, - "6067": { + "6050": { "op": "uncover 2", "stack_out": [ "discount_factor#0 (copy)", @@ -53785,7 +53765,7 @@ "period_rate#0" ] }, - "6069": { + "6052": { "callsub": "modules.actus_kernel.ActusKernelModule._scaled_mul_div", "op": "callsub _scaled_mul_div", "defined_out": [ @@ -53795,11 +53775,11 @@ "tmp%4#0" ] }, - "6072": { + "6055": { "retsub": true, "op": "retsub" }, - "6073": { + "6056": { "subroutine": "modules.actus_kernel.ActusKernelModule._apply_non_cash_schedule_entry", "params": { "entry#0": "bytes", @@ -53809,20 +53789,20 @@ "stack_in": [], "op": "proto 2 2" }, - "6076": { + "6059": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0" ] }, - "6077": { + "6060": { "op": "pushbytes \"\"", "stack_out": [ "future_entry#0", "denominator#0" ] }, - "6079": { + "6062": { "op": "dupn 8", "stack_out": [ "future_entry#0", @@ -53837,7 +53817,7 @@ "values%8#0" ] }, - "6081": { + "6064": { "op": "frame_dig -2", "defined_out": [ "entry#0 (copy)" @@ -53856,7 +53836,7 @@ "entry#0 (copy)" ] }, - "6083": { + "6066": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -53877,7 +53857,7 @@ "0" ] }, - "6084": { + "6067": { "op": "extract_uint64", "defined_out": [ "values%0#0" @@ -53896,7 +53876,7 @@ "values%0#0" ] }, - "6085": { + "6068": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -53913,7 +53893,7 @@ "0" ] }, - "6086": { + "6069": { "op": "bytec_2 // \"event_cursor\"", "defined_out": [ "\"event_cursor\"", @@ -53936,7 +53916,7 @@ "\"event_cursor\"" ] }, - "6087": { + "6070": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -53959,7 +53939,7 @@ "maybe_exists%0#0" ] }, - "6088": { + "6071": { "error": "check self.event_cursor exists", "op": "assert // check self.event_cursor exists", "stack_out": [ @@ -53977,7 +53957,7 @@ "maybe_value%0#0" ] }, - "6089": { + "6072": { "op": "==", "defined_out": [ "tmp%0#0", @@ -53997,7 +53977,7 @@ "tmp%0#0" ] }, - "6090": { + "6073": { "error": "Invalid event cursor", "op": "assert // Invalid event cursor", "stack_out": [ @@ -54013,7 +53993,7 @@ "values%8#0" ] }, - "6091": { + "6074": { "op": "frame_dig -2", "stack_out": [ "future_entry#0", @@ -54029,7 +54009,7 @@ "entry#0 (copy)" ] }, - "6093": { + "6076": { "op": "pushint 9", "defined_out": [ "9", @@ -54051,7 +54031,7 @@ "9" ] }, - "6095": { + "6078": { "op": "extract_uint64", "defined_out": [ "values%0#0", @@ -54071,7 +54051,7 @@ "values%1#0" ] }, - "6096": { + "6079": { "op": "global LatestTimestamp", "defined_out": [ "tmp%1#0", @@ -54093,7 +54073,7 @@ "tmp%1#0" ] }, - "6098": { + "6081": { "op": "<=", "defined_out": [ "tmp%2#0", @@ -54113,7 +54093,7 @@ "tmp%2#0" ] }, - "6099": { + "6082": { "error": "No due cashflow to pay", "op": "assert // No due cashflow to pay", "stack_out": [ @@ -54129,7 +54109,7 @@ "values%8#0" ] }, - "6100": { + "6083": { "op": "frame_dig -2", "stack_out": [ "future_entry#0", @@ -54145,7 +54125,7 @@ "entry#0 (copy)" ] }, - "6102": { + "6085": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -54167,7 +54147,7 @@ "8" ] }, - "6103": { + "6086": { "op": "getbyte", "defined_out": [ "event_type#0", @@ -54187,7 +54167,7 @@ "event_type#0" ] }, - "6104": { + "6087": { "op": "dup", "defined_out": [ "event_type#0", @@ -54208,7 +54188,7 @@ "event_type#0" ] }, - "6105": { + "6088": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -54231,7 +54211,7 @@ "1" ] }, - "6106": { + "6089": { "op": "==", "defined_out": [ "event_type#0", @@ -54253,7 +54233,7 @@ "tmp%4#0" ] }, - "6107": { + "6090": { "op": "dup", "defined_out": [ "event_type#0", @@ -54276,7 +54256,7 @@ "tmp%4#0" ] }, - "6108": { + "6091": { "op": "bz _apply_non_cash_schedule_entry_after_if_else@6", "stack_out": [ "future_entry#0", @@ -54293,7 +54273,7 @@ "tmp%4#0" ] }, - "6111": { + "6094": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -54311,7 +54291,7 @@ "0" ] }, - "6112": { + "6095": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"", @@ -54337,7 +54317,7 @@ "\"status\"" ] }, - "6113": { + "6096": { "op": "app_global_get_ex", "stack_out": [ "future_entry#0", @@ -54356,7 +54336,7 @@ "maybe_exists%0#0" ] }, - "6114": { + "6097": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ @@ -54375,7 +54355,7 @@ "maybe_value%0#0" ] }, - "6115": { + "6098": { "op": "pushint 50", "defined_out": [ "50", @@ -54401,7 +54381,7 @@ "50" ] }, - "6117": { + "6100": { "op": "==", "stack_out": [ "future_entry#0", @@ -54419,7 +54399,7 @@ "tmp%0#0" ] }, - "6118": { + "6101": { "error": "Invalid ACTUS configuration", "op": "assert // Invalid ACTUS configuration", "stack_out": [ @@ -54437,7 +54417,7 @@ "tmp%4#0" ] }, - "6119": { + "6102": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -54455,7 +54435,7 @@ "0" ] }, - "6120": { + "6103": { "op": "bytec 11 // \"reserved_units_total\"", "defined_out": [ "\"reserved_units_total\"", @@ -54481,7 +54461,7 @@ "\"reserved_units_total\"" ] }, - "6122": { + "6105": { "op": "app_global_get_ex", "defined_out": [ "event_type#0", @@ -54507,7 +54487,7 @@ "maybe_exists%1#0" ] }, - "6123": { + "6106": { "error": "check self.reserved_units_total exists", "op": "assert // check self.reserved_units_total exists", "stack_out": [ @@ -54526,7 +54506,7 @@ "maybe_value%1#0" ] }, - "6124": { + "6107": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -54545,7 +54525,7 @@ "0" ] }, - "6125": { + "6108": { "op": "bytec 13 // \"total_units\"", "defined_out": [ "\"total_units\"", @@ -54573,7 +54553,7 @@ "\"total_units\"" ] }, - "6127": { + "6110": { "op": "app_global_get_ex", "defined_out": [ "event_type#0", @@ -54601,7 +54581,7 @@ "maybe_exists%2#0" ] }, - "6128": { + "6111": { "error": "check self.total_units exists", "op": "assert // check self.total_units exists", "stack_out": [ @@ -54621,7 +54601,7 @@ "maybe_value%2#0" ] }, - "6129": { + "6112": { "op": "==", "defined_out": [ "event_type#0", @@ -54645,7 +54625,7 @@ "tmp%6#0" ] }, - "6130": { + "6113": { "error": "Primary distribution is not complete", "op": "assert // Primary distribution is not complete", "stack_out": [ @@ -54663,7 +54643,7 @@ "tmp%4#0" ] }, - "6131": { + "6114": { "op": "frame_dig -2", "stack_out": [ "future_entry#0", @@ -54681,7 +54661,7 @@ "entry#0 (copy)" ] }, - "6133": { + "6116": { "op": "pushint 49", "defined_out": [ "49", @@ -54707,7 +54687,7 @@ "49" ] }, - "6135": { + "6118": { "op": "extract_uint64", "defined_out": [ "event_type#0", @@ -54731,7 +54711,7 @@ "values%2#0" ] }, - "6136": { + "6119": { "op": "bytec 4 // \"outstanding_principal\"", "defined_out": [ "\"outstanding_principal\"", @@ -54757,7 +54737,7 @@ "\"outstanding_principal\"" ] }, - "6138": { + "6121": { "op": "dig 1", "defined_out": [ "\"outstanding_principal\"", @@ -54785,7 +54765,7 @@ "values%2#0 (copy)" ] }, - "6140": { + "6123": { "op": "app_global_put", "stack_out": [ "future_entry#0", @@ -54803,7 +54783,7 @@ "values%2#0" ] }, - "6141": { + "6124": { "op": "bytec 7 // \"interest_calculation_base\"", "defined_out": [ "\"interest_calculation_base\"", @@ -54829,7 +54809,7 @@ "\"interest_calculation_base\"" ] }, - "6143": { + "6126": { "op": "swap", "stack_out": [ "future_entry#0", @@ -54848,7 +54828,7 @@ "values%2#0" ] }, - "6144": { + "6127": { "op": "app_global_put", "stack_out": [ "future_entry#0", @@ -54865,7 +54845,7 @@ "tmp%4#0" ] }, - "6145": { + "6128": { "op": "frame_dig -2", "stack_out": [ "future_entry#0", @@ -54883,7 +54863,7 @@ "entry#0 (copy)" ] }, - "6147": { + "6130": { "op": "pushint 33", "defined_out": [ "33", @@ -54909,7 +54889,7 @@ "33" ] }, - "6149": { + "6132": { "op": "extract_uint64", "defined_out": [ "event_type#0", @@ -54933,7 +54913,7 @@ "values%4#0" ] }, - "6150": { + "6133": { "op": "bytec 9 // \"nominal_interest_rate\"", "defined_out": [ "\"nominal_interest_rate\"", @@ -54959,7 +54939,7 @@ "\"nominal_interest_rate\"" ] }, - "6152": { + "6135": { "op": "swap", "stack_out": [ "future_entry#0", @@ -54978,7 +54958,7 @@ "values%4#0" ] }, - "6153": { + "6136": { "op": "app_global_put", "stack_out": [ "future_entry#0", @@ -54995,7 +54975,7 @@ "tmp%4#0" ] }, - "6154": { + "6137": { "op": "bytec 6 // \"accrued_interest\"", "defined_out": [ "\"accrued_interest\"", @@ -55019,7 +54999,7 @@ "\"accrued_interest\"" ] }, - "6156": { + "6139": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -55038,7 +55018,7 @@ "0" ] }, - "6157": { + "6140": { "op": "app_global_put", "stack_out": [ "future_entry#0", @@ -55055,7 +55035,7 @@ "tmp%4#0" ] }, - "6158": { + "6141": { "op": "frame_dig -2", "stack_out": [ "future_entry#0", @@ -55073,7 +55053,7 @@ "entry#0 (copy)" ] }, - "6160": { + "6143": { "op": "pushint 41", "defined_out": [ "41", @@ -55099,7 +55079,7 @@ "41" ] }, - "6162": { + "6145": { "op": "extract_uint64", "defined_out": [ "event_type#0", @@ -55123,7 +55103,7 @@ "values%5#0" ] }, - "6163": { + "6146": { "op": "bytec 14 // \"next_principal_redemption\"", "defined_out": [ "\"next_principal_redemption\"", @@ -55149,7 +55129,7 @@ "\"next_principal_redemption\"" ] }, - "6165": { + "6148": { "op": "swap", "stack_out": [ "future_entry#0", @@ -55168,7 +55148,7 @@ "values%5#0" ] }, - "6166": { + "6149": { "op": "app_global_put", "stack_out": [ "future_entry#0", @@ -55185,7 +55165,7 @@ "tmp%4#0" ] }, - "6167": { + "6150": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -55203,7 +55183,7 @@ "0" ] }, - "6168": { + "6151": { "op": "bytec_2 // \"event_cursor\"", "stack_out": [ "future_entry#0", @@ -55222,7 +55202,7 @@ "\"event_cursor\"" ] }, - "6169": { + "6152": { "op": "app_global_get_ex", "defined_out": [ "event_type#0", @@ -55248,7 +55228,7 @@ "maybe_exists%3#0" ] }, - "6170": { + "6153": { "error": "check self.event_cursor exists", "op": "assert // check self.event_cursor exists", "stack_out": [ @@ -55267,7 +55247,7 @@ "maybe_value%3#0" ] }, - "6171": { + "6154": { "op": "intc_1 // 1", "stack_out": [ "future_entry#0", @@ -55286,7 +55266,7 @@ "1" ] }, - "6172": { + "6155": { "op": "+", "defined_out": [ "event_type#0", @@ -55310,7 +55290,7 @@ "tmp%7#0" ] }, - "6173": { + "6156": { "op": "bytec_2 // \"event_cursor\"", "stack_out": [ "future_entry#0", @@ -55329,7 +55309,7 @@ "\"event_cursor\"" ] }, - "6174": { + "6157": { "op": "swap", "stack_out": [ "future_entry#0", @@ -55348,7 +55328,7 @@ "tmp%7#0" ] }, - "6175": { + "6158": { "op": "app_global_put", "stack_out": [ "future_entry#0", @@ -55365,7 +55345,7 @@ "tmp%4#0" ] }, - "6176": { + "6159": { "op": "bytec_1 // \"status\"", "stack_out": [ "future_entry#0", @@ -55383,7 +55363,7 @@ "\"status\"" ] }, - "6177": { + "6160": { "op": "pushint 100", "defined_out": [ "\"status\"", @@ -55409,7 +55389,7 @@ "100" ] }, - "6179": { + "6162": { "op": "app_global_put", "stack_out": [ "future_entry#0", @@ -55426,7 +55406,7 @@ "tmp%4#0" ] }, - "6180": { + "6163": { "op": "frame_dig 11", "stack_out": [ "future_entry#0", @@ -55444,7 +55424,7 @@ "tmp%4#0" ] }, - "6182": { + "6165": { "error": "Not IED event", "op": "assert // Not IED event", "stack_out": [ @@ -55462,7 +55442,7 @@ "tmp%4#0" ] }, - "6183": { + "6166": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -55480,7 +55460,7 @@ "0" ] }, - "6184": { + "6167": { "op": "bytec 20 // \"initial_exchange_amount\"", "defined_out": [ "\"initial_exchange_amount\"", @@ -55506,7 +55486,7 @@ "\"initial_exchange_amount\"" ] }, - "6186": { + "6169": { "op": "app_global_get_ex", "stack_out": [ "future_entry#0", @@ -55525,7 +55505,7 @@ "maybe_exists%0#0" ] }, - "6187": { + "6170": { "error": "check self.initial_exchange_amount exists", "op": "assert // check self.initial_exchange_amount exists", "stack_out": [ @@ -55544,7 +55524,7 @@ "maybe_value%0#0" ] }, - "6188": { + "6171": { "op": "frame_dig -2", "stack_out": [ "future_entry#0", @@ -55563,7 +55543,7 @@ "entry#0 (copy)" ] }, - "6190": { + "6173": { "op": "swap", "stack_out": [ "future_entry#0", @@ -55582,7 +55562,7 @@ "maybe_value%0#0" ] }, - "6191": { + "6174": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -55602,7 +55582,7 @@ "0" ] }, - "6192": { + "6175": { "callsub": "modules.actus_kernel.ActusKernelModule._emit_execution_event", "op": "callsub _emit_execution_event", "defined_out": [ @@ -55627,10 +55607,10 @@ "entry#0" ] }, - "6195": { + "6178": { "op": "dup" }, - "6196": { + "6179": { "op": "frame_bury -2", "stack_out": [ "future_entry#0", @@ -55648,7 +55628,7 @@ "entry#0 (copy)" ] }, - "6198": { + "6181": { "op": "frame_dig -1", "defined_out": [ "entry#0 (copy)", @@ -55674,17 +55654,17 @@ "payload#0 (copy)" ] }, - "6200": { + "6183": { "op": "frame_bury 1" }, - "6202": { + "6185": { "op": "frame_bury 0" }, - "6204": { + "6187": { "retsub": true, "op": "retsub" }, - "6205": { + "6188": { "block": "_apply_non_cash_schedule_entry_after_if_else@6", "stack_in": [ "future_entry#0", @@ -55720,7 +55700,7 @@ "0" ] }, - "6206": { + "6189": { "op": "bytec_1 // \"status\"", "defined_out": [ "\"status\"", @@ -55743,7 +55723,7 @@ "\"status\"" ] }, - "6207": { + "6190": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -55766,7 +55746,7 @@ "maybe_exists%0#0" ] }, - "6208": { + "6191": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ @@ -55785,7 +55765,7 @@ "maybe_value%0#0" ] }, - "6209": { + "6192": { "op": "pushint 50", "defined_out": [ "50", @@ -55808,7 +55788,7 @@ "50" ] }, - "6211": { + "6194": { "op": "==", "defined_out": [ "tmp%0#0" @@ -55829,7 +55809,7 @@ "tmp%0#0" ] }, - "6212": { + "6195": { "op": "!", "defined_out": [ "tmp%1#1" @@ -55850,7 +55830,7 @@ "tmp%1#1" ] }, - "6213": { + "6196": { "error": "IED not yet executed", "op": "assert // IED not yet executed", "stack_out": [ @@ -55868,7 +55848,7 @@ "tmp%4#0" ] }, - "6214": { + "6197": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -55886,7 +55866,7 @@ "0" ] }, - "6215": { + "6198": { "op": "bytec 6 // \"accrued_interest\"", "defined_out": [ "\"accrued_interest\"", @@ -55909,7 +55889,7 @@ "\"accrued_interest\"" ] }, - "6217": { + "6200": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%4#0", @@ -55932,7 +55912,7 @@ "maybe_exists%4#0" ] }, - "6218": { + "6201": { "error": "check self.accrued_interest exists", "op": "assert // check self.accrued_interest exists", "stack_out": [ @@ -55951,7 +55931,7 @@ "maybe_value%4#0" ] }, - "6219": { + "6202": { "op": "frame_dig -2", "defined_out": [ "entry#0 (copy)", @@ -55974,7 +55954,7 @@ "entry#0 (copy)" ] }, - "6221": { + "6204": { "callsub": "modules.actus_kernel.ActusKernelModule._entry_interest_segment", "op": "callsub _entry_interest_segment", "defined_out": [ @@ -56000,7 +55980,7 @@ "entry#0" ] }, - "6224": { + "6207": { "op": "frame_bury -2", "stack_out": [ "future_entry#0", @@ -56019,7 +55999,7 @@ "_entry_interest_segment%0#0" ] }, - "6226": { + "6209": { "op": "+", "defined_out": [ "tmp%8#0" @@ -56040,7 +56020,7 @@ "tmp%8#0" ] }, - "6227": { + "6210": { "op": "bytec 6 // \"accrued_interest\"", "stack_out": [ "future_entry#0", @@ -56059,7 +56039,7 @@ "\"accrued_interest\"" ] }, - "6229": { + "6212": { "op": "swap", "stack_out": [ "future_entry#0", @@ -56078,7 +56058,7 @@ "tmp%8#0" ] }, - "6230": { + "6213": { "op": "app_global_put", "stack_out": [ "future_entry#0", @@ -56095,7 +56075,7 @@ "tmp%4#0" ] }, - "6231": { + "6214": { "op": "frame_dig 10", "defined_out": [ "event_type#0" @@ -56116,7 +56096,7 @@ "event_type#0" ] }, - "6233": { + "6216": { "op": "pushint 12", "defined_out": [ "12", @@ -56139,7 +56119,7 @@ "12" ] }, - "6235": { + "6218": { "op": "==", "defined_out": [ "event_type#0", @@ -56161,7 +56141,7 @@ "tmp%9#0" ] }, - "6236": { + "6219": { "op": "bz _apply_non_cash_schedule_entry_else_body@10", "stack_out": [ "future_entry#0", @@ -56178,7 +56158,7 @@ "tmp%4#0" ] }, - "6239": { + "6222": { "op": "frame_dig -1", "defined_out": [ "event_type#0", @@ -56200,7 +56180,7 @@ "payload#0 (copy)" ] }, - "6241": { + "6224": { "op": "pushint 33", "defined_out": [ "33", @@ -56224,7 +56204,7 @@ "33" ] }, - "6243": { + "6226": { "op": "extract_uint64", "defined_out": [ "event_type#0", @@ -56246,7 +56226,7 @@ "values%6#0" ] }, - "6244": { + "6227": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -56265,8 +56245,8 @@ "0" ] }, - "6245": { - "op": "bytec 36 // \"rate_reset_multiplier\"", + "6228": { + "op": "bytec 37 // \"rate_reset_multiplier\"", "defined_out": [ "\"rate_reset_multiplier\"", "0", @@ -56291,7 +56271,7 @@ "\"rate_reset_multiplier\"" ] }, - "6247": { + "6230": { "op": "app_global_get_ex", "defined_out": [ "event_type#0", @@ -56317,7 +56297,7 @@ "maybe_exists%5#0" ] }, - "6248": { + "6231": { "error": "check self.rate_reset_multiplier exists", "op": "assert // check self.rate_reset_multiplier exists", "stack_out": [ @@ -56337,7 +56317,7 @@ "maybe_value%5#0" ] }, - "6249": { + "6232": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -56357,7 +56337,7 @@ "0" ] }, - "6250": { + "6233": { "op": "bytec 5 // \"fixed_point_scale\"", "defined_out": [ "\"fixed_point_scale\"", @@ -56385,7 +56365,7 @@ "\"fixed_point_scale\"" ] }, - "6252": { + "6235": { "op": "app_global_get_ex", "defined_out": [ "event_type#0", @@ -56413,7 +56393,7 @@ "maybe_exists%6#0" ] }, - "6253": { + "6236": { "error": "check self.fixed_point_scale exists", "op": "assert // check self.fixed_point_scale exists", "stack_out": [ @@ -56434,7 +56414,7 @@ "maybe_value%6#0" ] }, - "6254": { + "6237": { "callsub": "modules.actus_kernel.ActusKernelModule._scaled_mul_div", "op": "callsub _scaled_mul_div", "defined_out": [ @@ -56457,7 +56437,7 @@ "observed_rate#0" ] }, - "6257": { + "6240": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -56476,8 +56456,8 @@ "0" ] }, - "6258": { - "op": "bytec 35 // \"rate_reset_spread\"", + "6241": { + "op": "bytec 36 // \"rate_reset_spread\"", "defined_out": [ "\"rate_reset_spread\"", "0", @@ -56502,7 +56482,7 @@ "\"rate_reset_spread\"" ] }, - "6260": { + "6243": { "op": "app_global_get_ex", "defined_out": [ "event_type#0", @@ -56528,7 +56508,7 @@ "maybe_exists%7#0" ] }, - "6261": { + "6244": { "error": "check self.rate_reset_spread exists", "op": "assert // check self.rate_reset_spread exists", "stack_out": [ @@ -56548,7 +56528,7 @@ "maybe_value%7#0" ] }, - "6262": { + "6245": { "op": "+", "defined_out": [ "event_type#0", @@ -56570,7 +56550,7 @@ "rate#0" ] }, - "6263": { + "6246": { "op": "frame_bury 6", "defined_out": [ "event_type#0", @@ -56591,7 +56571,7 @@ "tmp%4#0" ] }, - "6265": { + "6248": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -56609,8 +56589,8 @@ "0" ] }, - "6266": { - "op": "bytec 38 // \"has_rate_reset_floor\"", + "6249": { + "op": "bytec 39 // \"has_rate_reset_floor\"", "defined_out": [ "\"has_rate_reset_floor\"", "0", @@ -56634,7 +56614,7 @@ "\"has_rate_reset_floor\"" ] }, - "6268": { + "6251": { "op": "app_global_get_ex", "stack_out": [ "future_entry#0", @@ -56653,7 +56633,7 @@ "maybe_exists%0#0" ] }, - "6269": { + "6252": { "error": "check self.has_rate_reset_floor exists", "op": "assert // check self.has_rate_reset_floor exists", "stack_out": [ @@ -56672,7 +56652,7 @@ "maybe_value%0#0" ] }, - "6270": { + "6253": { "op": "bz _apply_non_cash_schedule_entry_after_if_else@55", "stack_out": [ "future_entry#0", @@ -56689,7 +56669,7 @@ "tmp%4#0" ] }, - "6273": { + "6256": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -56707,7 +56687,7 @@ "0" ] }, - "6274": { + "6257": { "op": "bytec 31 // \"rate_reset_floor\"", "defined_out": [ "\"rate_reset_floor\"", @@ -56732,7 +56712,7 @@ "\"rate_reset_floor\"" ] }, - "6276": { + "6259": { "op": "app_global_get_ex", "defined_out": [ "event_type#0", @@ -56757,7 +56737,7 @@ "maybe_exists%1#0" ] }, - "6277": { + "6260": { "error": "check self.rate_reset_floor exists", "op": "assert // check self.rate_reset_floor exists", "stack_out": [ @@ -56776,7 +56756,7 @@ "maybe_value%1#0" ] }, - "6278": { + "6261": { "op": "frame_dig 6", "stack_out": [ "future_entry#0", @@ -56795,7 +56775,7 @@ "rate#0" ] }, - "6280": { + "6263": { "op": ">", "stack_out": [ "future_entry#0", @@ -56813,7 +56793,7 @@ "tmp%0#0" ] }, - "6281": { + "6264": { "op": "bz _apply_non_cash_schedule_entry_after_if_else@55", "stack_out": [ "future_entry#0", @@ -56830,7 +56810,7 @@ "tmp%4#0" ] }, - "6284": { + "6267": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -56848,7 +56828,7 @@ "0" ] }, - "6285": { + "6268": { "op": "bytec 31 // \"rate_reset_floor\"", "stack_out": [ "future_entry#0", @@ -56867,7 +56847,7 @@ "\"rate_reset_floor\"" ] }, - "6287": { + "6270": { "op": "app_global_get_ex", "defined_out": [ "event_type#0", @@ -56891,7 +56871,7 @@ "maybe_exists%2#0" ] }, - "6288": { + "6271": { "op": "swap", "stack_out": [ "future_entry#0", @@ -56910,7 +56890,7 @@ "rate#0" ] }, - "6289": { + "6272": { "op": "frame_bury 6", "stack_out": [ "future_entry#0", @@ -56928,7 +56908,7 @@ "maybe_exists%2#0" ] }, - "6291": { + "6274": { "error": "check self.rate_reset_floor exists", "op": "assert // check self.rate_reset_floor exists", "stack_out": [ @@ -56946,7 +56926,7 @@ "tmp%4#0" ] }, - "6292": { + "6275": { "block": "_apply_non_cash_schedule_entry_after_if_else@55", "stack_in": [ "future_entry#0", @@ -56982,8 +56962,8 @@ "0" ] }, - "6293": { - "op": "bytec 39 // \"has_rate_reset_cap\"", + "6276": { + "op": "bytec 40 // \"has_rate_reset_cap\"", "defined_out": [ "\"has_rate_reset_cap\"", "0" @@ -57005,7 +56985,7 @@ "\"has_rate_reset_cap\"" ] }, - "6295": { + "6278": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%3#0", @@ -57028,7 +57008,7 @@ "maybe_exists%3#0" ] }, - "6296": { + "6279": { "error": "check self.has_rate_reset_cap exists", "op": "assert // check self.has_rate_reset_cap exists", "stack_out": [ @@ -57047,7 +57027,7 @@ "maybe_value%3#0" ] }, - "6297": { + "6280": { "op": "bz _apply_non_cash_schedule_entry_after_if_else@58", "stack_out": [ "future_entry#0", @@ -57064,7 +57044,7 @@ "tmp%4#0" ] }, - "6300": { + "6283": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -57082,7 +57062,7 @@ "0" ] }, - "6301": { + "6284": { "op": "bytec 32 // \"rate_reset_cap\"", "defined_out": [ "\"rate_reset_cap\"", @@ -57105,7 +57085,7 @@ "\"rate_reset_cap\"" ] }, - "6303": { + "6286": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%4#0", @@ -57128,7 +57108,7 @@ "maybe_exists%4#0" ] }, - "6304": { + "6287": { "error": "check self.rate_reset_cap exists", "op": "assert // check self.rate_reset_cap exists", "stack_out": [ @@ -57147,7 +57127,7 @@ "maybe_value%4#0" ] }, - "6305": { + "6288": { "op": "frame_dig 6", "defined_out": [ "maybe_value%4#0", @@ -57170,7 +57150,7 @@ "rate#0" ] }, - "6307": { + "6290": { "op": "<", "defined_out": [ "rate#0", @@ -57192,7 +57172,7 @@ "tmp%1#1" ] }, - "6308": { + "6291": { "op": "bz _apply_non_cash_schedule_entry_after_if_else@58", "stack_out": [ "future_entry#0", @@ -57209,7 +57189,7 @@ "tmp%4#0" ] }, - "6311": { + "6294": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -57227,7 +57207,7 @@ "0" ] }, - "6312": { + "6295": { "op": "bytec 32 // \"rate_reset_cap\"", "stack_out": [ "future_entry#0", @@ -57246,7 +57226,7 @@ "\"rate_reset_cap\"" ] }, - "6314": { + "6297": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%5#0", @@ -57269,7 +57249,7 @@ "maybe_exists%5#0" ] }, - "6315": { + "6298": { "op": "swap", "stack_out": [ "future_entry#0", @@ -57288,7 +57268,7 @@ "rate#0" ] }, - "6316": { + "6299": { "op": "frame_bury 6", "defined_out": [ "maybe_exists%5#0", @@ -57310,7 +57290,7 @@ "maybe_exists%5#0" ] }, - "6318": { + "6301": { "error": "check self.rate_reset_cap exists", "op": "assert // check self.rate_reset_cap exists", "stack_out": [ @@ -57328,7 +57308,7 @@ "tmp%4#0" ] }, - "6319": { + "6302": { "block": "_apply_non_cash_schedule_entry_after_if_else@58", "stack_in": [ "future_entry#0", @@ -57364,7 +57344,7 @@ "\"nominal_interest_rate\"" ] }, - "6321": { + "6304": { "op": "frame_dig 6", "defined_out": [ "\"nominal_interest_rate\"", @@ -57387,7 +57367,7 @@ "rate#0" ] }, - "6323": { + "6306": { "op": "app_global_put", "stack_out": [ "future_entry#0", @@ -57404,7 +57384,7 @@ "tmp%4#0" ] }, - "6324": { + "6307": { "block": "_apply_non_cash_schedule_entry_after_if_else@18", "stack_in": [ "future_entry#0", @@ -57440,7 +57420,7 @@ "event_type#0" ] }, - "6326": { + "6309": { "op": "pushint 4", "defined_out": [ "4", @@ -57463,7 +57443,7 @@ "4" ] }, - "6328": { + "6311": { "op": "==", "defined_out": [ "event_type#0", @@ -57485,7 +57465,7 @@ "tmp%16#0" ] }, - "6329": { + "6312": { "op": "bz _apply_non_cash_schedule_entry_else_body@20", "stack_out": [ "future_entry#0", @@ -57502,7 +57482,7 @@ "tmp%4#0" ] }, - "6332": { + "6315": { "op": "frame_dig -2", "defined_out": [ "entry#0 (copy)", @@ -57524,7 +57504,7 @@ "entry#0 (copy)" ] }, - "6334": { + "6317": { "op": "pushint 49", "defined_out": [ "49", @@ -57548,7 +57528,7 @@ "49" ] }, - "6336": { + "6319": { "op": "extract_uint64", "defined_out": [ "event_type#0", @@ -57570,7 +57550,7 @@ "values%10#0" ] }, - "6337": { + "6320": { "op": "bytec 4 // \"outstanding_principal\"", "defined_out": [ "\"outstanding_principal\"", @@ -57594,7 +57574,7 @@ "\"outstanding_principal\"" ] }, - "6339": { + "6322": { "op": "dig 1", "defined_out": [ "\"outstanding_principal\"", @@ -57620,7 +57600,7 @@ "values%10#0 (copy)" ] }, - "6341": { + "6324": { "op": "app_global_put", "stack_out": [ "future_entry#0", @@ -57638,7 +57618,7 @@ "values%10#0" ] }, - "6342": { + "6325": { "op": "bytec 7 // \"interest_calculation_base\"", "defined_out": [ "\"interest_calculation_base\"", @@ -57662,7 +57642,7 @@ "\"interest_calculation_base\"" ] }, - "6344": { + "6327": { "op": "swap", "stack_out": [ "future_entry#0", @@ -57681,7 +57661,7 @@ "values%10#0" ] }, - "6345": { + "6328": { "op": "app_global_put", "stack_out": [ "future_entry#0", @@ -57698,7 +57678,7 @@ "tmp%4#0" ] }, - "6346": { + "6329": { "block": "_apply_non_cash_schedule_entry_after_if_else@23", "stack_in": [ "future_entry#0", @@ -57735,7 +57715,7 @@ "tmp%18#0" ] }, - "6349": { + "6332": { "op": "bz _apply_non_cash_schedule_entry_else_body@29", "stack_out": [ "future_entry#0", @@ -57752,7 +57732,7 @@ "tmp%4#0" ] }, - "6352": { + "6335": { "op": "frame_dig 10", "defined_out": [ "event_type#0" @@ -57773,7 +57753,7 @@ "event_type#0" ] }, - "6354": { + "6337": { "op": "pushint 5", "defined_out": [ "5", @@ -57796,7 +57776,7 @@ "5" ] }, - "6356": { + "6339": { "op": "==", "defined_out": [ "event_type#0", @@ -57818,7 +57798,7 @@ "tmp%19#0" ] }, - "6357": { + "6340": { "op": "bz _apply_non_cash_schedule_entry_after_if_else@30", "stack_out": [ "future_entry#0", @@ -57835,7 +57815,7 @@ "tmp%4#0" ] }, - "6360": { + "6343": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -57857,7 +57837,7 @@ "0" ] }, - "6361": { + "6344": { "op": "bytec_3 // \"schedule_entry_count\"", "defined_out": [ "\"schedule_entry_count\"", @@ -57881,7 +57861,7 @@ "\"schedule_entry_count\"" ] }, - "6362": { + "6345": { "op": "app_global_get_ex", "defined_out": [ "event_type#0", @@ -57905,7 +57885,7 @@ "maybe_exists%10#0" ] }, - "6363": { + "6346": { "error": "check self.schedule_entry_count exists", "op": "assert // check self.schedule_entry_count exists", "stack_out": [ @@ -57924,7 +57904,7 @@ "maybe_value%10#0" ] }, - "6364": { + "6347": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -57943,7 +57923,7 @@ "0" ] }, - "6365": { + "6348": { "op": "bytec_2 // \"event_cursor\"", "defined_out": [ "\"event_cursor\"", @@ -57969,7 +57949,7 @@ "\"event_cursor\"" ] }, - "6366": { + "6349": { "op": "app_global_get_ex", "defined_out": [ "event_type#0", @@ -57995,7 +57975,7 @@ "maybe_exists%11#0" ] }, - "6367": { + "6350": { "error": "check self.event_cursor exists", "op": "assert // check self.event_cursor exists", "stack_out": [ @@ -58015,7 +57995,7 @@ "maybe_value%11#0" ] }, - "6368": { + "6351": { "op": "-", "defined_out": [ "event_type#0", @@ -58037,7 +58017,7 @@ "tmp%20#0" ] }, - "6369": { + "6352": { "op": "pushint 100", "defined_out": [ "100", @@ -58061,7 +58041,7 @@ "100" ] }, - "6371": { + "6354": { "op": "*", "defined_out": [ "event_type#0", @@ -58083,7 +58063,7 @@ "tmp%21#0" ] }, - "6372": { + "6355": { "op": "intc 4 // 1500", "defined_out": [ "1500", @@ -58107,7 +58087,7 @@ "1500" ] }, - "6374": { + "6357": { "op": "+", "defined_out": [ "event_type#0", @@ -58129,7 +58109,7 @@ "tmp%22#0" ] }, - "6375": { + "6358": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -58148,7 +58128,7 @@ "0" ] }, - "6376": { + "6359": { "callsub": "_puya_lib.util.ensure_budget", "op": "callsub ensure_budget", "stack_out": [ @@ -58166,7 +58146,7 @@ "tmp%4#0" ] }, - "6379": { + "6362": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -58184,7 +58164,7 @@ "0" ] }, - "6380": { + "6363": { "op": "bytec 5 // \"fixed_point_scale\"", "defined_out": [ "\"fixed_point_scale\"", @@ -58208,7 +58188,7 @@ "\"fixed_point_scale\"" ] }, - "6382": { + "6365": { "op": "app_global_get_ex", "defined_out": [ "discount_factor#0", @@ -58232,7 +58212,7 @@ "maybe_exists%0#0" ] }, - "6383": { + "6366": { "op": "swap", "stack_out": [ "future_entry#0", @@ -58251,7 +58231,7 @@ "discount_factor#0" ] }, - "6384": { + "6367": { "op": "frame_bury 2", "defined_out": [ "discount_factor#0", @@ -58274,7 +58254,7 @@ "maybe_exists%0#0" ] }, - "6386": { + "6369": { "error": "check self.fixed_point_scale exists", "op": "assert // check self.fixed_point_scale exists", "stack_out": [ @@ -58292,7 +58272,7 @@ "tmp%4#0" ] }, - "6387": { + "6370": { "op": "intc_0 // 0", "defined_out": [ "denominator#0", @@ -58315,7 +58295,7 @@ "denominator#0" ] }, - "6388": { + "6371": { "op": "frame_bury 1", "defined_out": [ "denominator#0", @@ -58337,7 +58317,7 @@ "tmp%4#0" ] }, - "6390": { + "6373": { "op": "intc_0 // 0", "defined_out": [ "denominator#0", @@ -58361,7 +58341,7 @@ "skip_first_redemption#0" ] }, - "6391": { + "6374": { "op": "frame_bury 7", "defined_out": [ "denominator#0", @@ -58384,7 +58364,7 @@ "tmp%4#0" ] }, - "6393": { + "6376": { "op": "frame_dig -2", "defined_out": [ "denominator#0", @@ -58409,7 +58389,7 @@ "entry#0 (copy)" ] }, - "6395": { + "6378": { "op": "pushint 25", "defined_out": [ "25", @@ -58436,7 +58416,7 @@ "25" ] }, - "6397": { + "6380": { "op": "extract_uint64", "defined_out": [ "denominator#0", @@ -58461,7 +58441,7 @@ "values%0#0" ] }, - "6398": { + "6381": { "op": "dup", "stack_out": [ "future_entry#0", @@ -58480,7 +58460,7 @@ "values%0#0" ] }, - "6399": { + "6382": { "op": "frame_bury 8", "defined_out": [ "denominator#0", @@ -58505,7 +58485,7 @@ "values%0#0" ] }, - "6401": { + "6384": { "op": "bz _apply_non_cash_schedule_entry_after_if_else@35", "stack_out": [ "future_entry#0", @@ -58522,7 +58502,7 @@ "tmp%4#0" ] }, - "6404": { + "6387": { "op": "frame_dig 2", "stack_out": [ "future_entry#0", @@ -58540,7 +58520,7 @@ "discount_factor#0" ] }, - "6406": { + "6389": { "op": "frame_dig 8", "stack_out": [ "future_entry#0", @@ -58559,7 +58539,7 @@ "values%0#0" ] }, - "6408": { + "6391": { "callsub": "modules.actus_kernel.ActusKernelModule._discount_annuity_factor", "op": "callsub _discount_annuity_factor", "stack_out": [ @@ -58578,7 +58558,7 @@ "discount_factor#0" ] }, - "6411": { + "6394": { "op": "dup", "stack_out": [ "future_entry#0", @@ -58597,7 +58577,7 @@ "discount_factor#0" ] }, - "6412": { + "6395": { "op": "frame_bury 2", "stack_out": [ "future_entry#0", @@ -58615,7 +58595,7 @@ "discount_factor#0" ] }, - "6414": { + "6397": { "op": "intc_1 // 1", "stack_out": [ "future_entry#0", @@ -58634,7 +58614,7 @@ "skip_first_redemption#0" ] }, - "6415": { + "6398": { "op": "frame_bury 7", "stack_out": [ "future_entry#0", @@ -58652,7 +58632,7 @@ "denominator#0" ] }, - "6417": { + "6400": { "op": "frame_bury 1", "stack_out": [ "future_entry#0", @@ -58669,7 +58649,7 @@ "tmp%4#0" ] }, - "6419": { + "6402": { "block": "_apply_non_cash_schedule_entry_after_if_else@35", "stack_in": [ "future_entry#0", @@ -58705,7 +58685,7 @@ "0" ] }, - "6420": { + "6403": { "op": "bytec_2 // \"event_cursor\"", "defined_out": [ "\"event_cursor\"", @@ -58728,7 +58708,7 @@ "\"event_cursor\"" ] }, - "6421": { + "6404": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%1#0", @@ -58751,7 +58731,7 @@ "maybe_exists%1#0" ] }, - "6422": { + "6405": { "error": "check self.event_cursor exists", "op": "assert // check self.event_cursor exists", "stack_out": [ @@ -58770,7 +58750,7 @@ "maybe_value%1#0" ] }, - "6423": { + "6406": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -58793,7 +58773,7 @@ "1" ] }, - "6424": { + "6407": { "op": "+", "defined_out": [ "future_event_id#0" @@ -58814,7 +58794,7 @@ "future_event_id#0" ] }, - "6425": { + "6408": { "op": "frame_bury 3", "defined_out": [ "future_event_id#0" @@ -58834,7 +58814,7 @@ "tmp%4#0" ] }, - "6427": { + "6410": { "block": "_apply_non_cash_schedule_entry_while_top@36", "stack_in": [ "future_entry#0", @@ -58870,7 +58850,7 @@ "0" ] }, - "6428": { + "6411": { "op": "bytec_3 // \"schedule_entry_count\"", "defined_out": [ "\"schedule_entry_count\"", @@ -58893,7 +58873,7 @@ "\"schedule_entry_count\"" ] }, - "6429": { + "6412": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%2#0", @@ -58916,7 +58896,7 @@ "maybe_exists%2#0" ] }, - "6430": { + "6413": { "error": "check self.schedule_entry_count exists", "op": "assert // check self.schedule_entry_count exists", "stack_out": [ @@ -58935,7 +58915,7 @@ "maybe_value%2#0" ] }, - "6431": { + "6414": { "op": "frame_dig 3", "defined_out": [ "future_event_id#0", @@ -58958,7 +58938,7 @@ "future_event_id#0" ] }, - "6433": { + "6416": { "op": ">", "defined_out": [ "future_event_id#0", @@ -58980,7 +58960,7 @@ "tmp%4#0" ] }, - "6434": { + "6417": { "op": "bz _apply_non_cash_schedule_entry_after_while@48", "stack_out": [ "future_entry#0", @@ -58997,7 +58977,7 @@ "tmp%4#0" ] }, - "6437": { + "6420": { "op": "frame_dig 3", "stack_out": [ "future_entry#0", @@ -59015,7 +58995,7 @@ "future_event_id#0" ] }, - "6439": { + "6422": { "callsub": "modules.actus_kernel.ActusKernelModule._get_schedule_entry", "op": "callsub _get_schedule_entry", "defined_out": [ @@ -59039,7 +59019,7 @@ "future_entry#0" ] }, - "6442": { + "6425": { "op": "dup", "stack_out": [ "future_entry#0", @@ -59058,7 +59038,7 @@ "future_entry#0" ] }, - "6443": { + "6426": { "op": "frame_bury 0", "defined_out": [ "future_entry#0", @@ -59081,7 +59061,7 @@ "future_entry#0" ] }, - "6445": { + "6428": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -59106,7 +59086,7 @@ "8" ] }, - "6446": { + "6429": { "op": "getbyte", "defined_out": [ "future_entry#0", @@ -59130,7 +59110,7 @@ "future_event_type#0" ] }, - "6447": { + "6430": { "op": "dup", "stack_out": [ "future_entry#0", @@ -59149,7 +59129,7 @@ "future_event_type#0" ] }, - "6448": { + "6431": { "op": "frame_bury 4", "defined_out": [ "future_entry#0", @@ -59173,7 +59153,7 @@ "future_event_type#0" ] }, - "6450": { + "6433": { "op": "pushint 3", "defined_out": [ "3", @@ -59199,7 +59179,7 @@ "3" ] }, - "6452": { + "6435": { "op": "==", "defined_out": [ "future_entry#0", @@ -59224,7 +59204,7 @@ "tmp%7#1" ] }, - "6453": { + "6436": { "op": "bnz _apply_non_cash_schedule_entry_bool_true@40", "stack_out": [ "future_entry#0", @@ -59241,7 +59221,7 @@ "tmp%4#0" ] }, - "6456": { + "6439": { "op": "frame_dig 4", "stack_out": [ "future_entry#0", @@ -59259,7 +59239,7 @@ "future_event_type#0" ] }, - "6458": { + "6441": { "op": "pushint 19", "defined_out": [ "19", @@ -59285,7 +59265,7 @@ "19" ] }, - "6460": { + "6443": { "op": "==", "defined_out": [ "future_entry#0", @@ -59310,7 +59290,7 @@ "tmp%8#1" ] }, - "6461": { + "6444": { "op": "bz _apply_non_cash_schedule_entry_bool_false@41", "stack_out": [ "future_entry#0", @@ -59327,7 +59307,7 @@ "tmp%4#0" ] }, - "6464": { + "6447": { "op": "frame_dig 0", "stack_out": [ "future_entry#0", @@ -59345,7 +59325,7 @@ "future_entry#0" ] }, - "6466": { + "6449": { "op": "pushint 25", "defined_out": [ "25", @@ -59371,7 +59351,7 @@ "25" ] }, - "6468": { + "6451": { "op": "extract_uint64", "defined_out": [ "future_entry#0", @@ -59396,7 +59376,7 @@ "values%2#0" ] }, - "6469": { + "6452": { "op": "bz _apply_non_cash_schedule_entry_bool_false@41", "stack_out": [ "future_entry#0", @@ -59413,7 +59393,7 @@ "tmp%4#0" ] }, - "6472": { + "6455": { "block": "_apply_non_cash_schedule_entry_bool_true@40", "stack_in": [ "future_entry#0", @@ -59449,7 +59429,7 @@ "is_redemption_event#0" ] }, - "6473": { + "6456": { "block": "_apply_non_cash_schedule_entry_bool_merge@42", "stack_in": [ "future_entry#0", @@ -59483,7 +59463,7 @@ "tmp%4#0" ] }, - "6476": { + "6459": { "op": "frame_dig 7", "defined_out": [ "skip_first_redemption#0" @@ -59504,7 +59484,7 @@ "skip_first_redemption#0" ] }, - "6478": { + "6461": { "op": "bz _apply_non_cash_schedule_entry_else_body@45", "stack_out": [ "future_entry#0", @@ -59521,7 +59501,7 @@ "tmp%4#0" ] }, - "6481": { + "6464": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -59539,7 +59519,7 @@ "skip_first_redemption#0" ] }, - "6482": { + "6465": { "op": "frame_bury 7", "defined_out": [ "skip_first_redemption#0" @@ -59559,7 +59539,7 @@ "tmp%4#0" ] }, - "6484": { + "6467": { "block": "_apply_non_cash_schedule_entry_after_if_else@47", "stack_in": [ "future_entry#0", @@ -59595,7 +59575,7 @@ "future_event_id#0" ] }, - "6486": { + "6469": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -59618,7 +59598,7 @@ "1" ] }, - "6487": { + "6470": { "op": "+", "stack_out": [ "future_entry#0", @@ -59636,7 +59616,7 @@ "future_event_id#0" ] }, - "6488": { + "6471": { "op": "frame_bury 3", "defined_out": [ "future_event_id#0" @@ -59656,10 +59636,10 @@ "tmp%4#0" ] }, - "6490": { + "6473": { "op": "b _apply_non_cash_schedule_entry_while_top@36" }, - "6493": { + "6476": { "block": "_apply_non_cash_schedule_entry_else_body@45", "stack_in": [ "future_entry#0", @@ -59695,7 +59675,7 @@ "future_entry#0" ] }, - "6495": { + "6478": { "op": "pushint 25", "defined_out": [ "25", @@ -59718,7 +59698,7 @@ "25" ] }, - "6497": { + "6480": { "op": "extract_uint64", "defined_out": [ "future_entry#0", @@ -59740,7 +59720,7 @@ "values%3#1" ] }, - "6498": { + "6481": { "op": "frame_dig 2", "defined_out": [ "discount_factor#0", @@ -59764,7 +59744,7 @@ "discount_factor#0" ] }, - "6500": { + "6483": { "op": "swap", "stack_out": [ "future_entry#0", @@ -59783,7 +59763,7 @@ "values%3#1" ] }, - "6501": { + "6484": { "callsub": "modules.actus_kernel.ActusKernelModule._discount_annuity_factor", "op": "callsub _discount_annuity_factor", "stack_out": [ @@ -59802,7 +59782,7 @@ "discount_factor#0" ] }, - "6504": { + "6487": { "op": "dup", "stack_out": [ "future_entry#0", @@ -59821,7 +59801,7 @@ "discount_factor#0" ] }, - "6505": { + "6488": { "op": "frame_bury 2", "defined_out": [ "discount_factor#0", @@ -59843,7 +59823,7 @@ "discount_factor#0" ] }, - "6507": { + "6490": { "op": "frame_dig 1", "defined_out": [ "denominator#0", @@ -59867,7 +59847,7 @@ "denominator#0" ] }, - "6509": { + "6492": { "op": "+", "stack_out": [ "future_entry#0", @@ -59885,7 +59865,7 @@ "denominator#0" ] }, - "6510": { + "6493": { "op": "frame_bury 1", "defined_out": [ "denominator#0", @@ -59907,10 +59887,10 @@ "tmp%4#0" ] }, - "6512": { + "6495": { "op": "b _apply_non_cash_schedule_entry_after_if_else@47" }, - "6515": { + "6498": { "block": "_apply_non_cash_schedule_entry_bool_false@41", "stack_in": [ "future_entry#0", @@ -59946,10 +59926,10 @@ "is_redemption_event#0" ] }, - "6516": { + "6499": { "op": "b _apply_non_cash_schedule_entry_bool_merge@42" }, - "6519": { + "6502": { "block": "_apply_non_cash_schedule_entry_after_while@48", "stack_in": [ "future_entry#0", @@ -59985,7 +59965,7 @@ "denominator#0" ] }, - "6521": { + "6504": { "error": "Invalid ACTUS configuration", "op": "assert // Invalid ACTUS configuration", "stack_out": [ @@ -60003,7 +59983,7 @@ "tmp%4#0" ] }, - "6522": { + "6505": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -60025,7 +60005,7 @@ "0" ] }, - "6523": { + "6506": { "op": "bytec 4 // \"outstanding_principal\"", "defined_out": [ "\"outstanding_principal\"", @@ -60049,7 +60029,7 @@ "\"outstanding_principal\"" ] }, - "6525": { + "6508": { "op": "app_global_get_ex", "defined_out": [ "denominator#0", @@ -60073,7 +60053,7 @@ "maybe_exists%3#0" ] }, - "6526": { + "6509": { "error": "check self.outstanding_principal exists", "op": "assert // check self.outstanding_principal exists", "stack_out": [ @@ -60092,7 +60072,7 @@ "numerator#0" ] }, - "6527": { + "6510": { "op": "frame_dig -2", "defined_out": [ "denominator#0", @@ -60116,7 +60096,7 @@ "entry#0 (copy)" ] }, - "6529": { + "6512": { "op": "pushint 57", "defined_out": [ "57", @@ -60142,7 +60122,7 @@ "57" ] }, - "6531": { + "6514": { "op": "extract_uint64", "defined_out": [ "denominator#0", @@ -60166,7 +60146,7 @@ "values%4#0" ] }, - "6532": { + "6515": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -60192,7 +60172,7 @@ "8" ] }, - "6533": { + "6516": { "op": "&", "defined_out": [ "denominator#0", @@ -60216,7 +60196,7 @@ "tmp%14#1" ] }, - "6534": { + "6517": { "op": "bnz _apply_non_cash_schedule_entry_after_if_else@50", "stack_out": [ "future_entry#0", @@ -60234,7 +60214,7 @@ "numerator#0" ] }, - "6537": { + "6520": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -60253,7 +60233,7 @@ "0" ] }, - "6538": { + "6521": { "op": "bytec 6 // \"accrued_interest\"", "defined_out": [ "\"accrued_interest\"", @@ -60279,7 +60259,7 @@ "\"accrued_interest\"" ] }, - "6540": { + "6523": { "op": "app_global_get_ex", "defined_out": [ "denominator#0", @@ -60305,7 +60285,7 @@ "maybe_exists%4#0" ] }, - "6541": { + "6524": { "error": "check self.accrued_interest exists", "op": "assert // check self.accrued_interest exists", "stack_out": [ @@ -60325,7 +60305,7 @@ "maybe_value%4#0" ] }, - "6542": { + "6525": { "op": "+", "stack_out": [ "future_entry#0", @@ -60343,7 +60323,7 @@ "numerator#0" ] }, - "6543": { + "6526": { "block": "_apply_non_cash_schedule_entry_after_if_else@50", "stack_in": [ "future_entry#0", @@ -60381,7 +60361,7 @@ "0" ] }, - "6544": { + "6527": { "op": "bytec 5 // \"fixed_point_scale\"", "defined_out": [ "\"fixed_point_scale\"", @@ -60405,7 +60385,7 @@ "\"fixed_point_scale\"" ] }, - "6546": { + "6529": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%5#0", @@ -60429,7 +60409,7 @@ "maybe_exists%5#0" ] }, - "6547": { + "6530": { "error": "check self.fixed_point_scale exists", "op": "assert // check self.fixed_point_scale exists", "defined_out": [ @@ -60453,7 +60433,7 @@ "maybe_value%5#0" ] }, - "6548": { + "6531": { "op": "frame_dig 1", "defined_out": [ "denominator#0", @@ -60478,7 +60458,7 @@ "denominator#0" ] }, - "6550": { + "6533": { "callsub": "modules.actus_kernel.ActusKernelModule._scaled_mul_div", "op": "callsub _scaled_mul_div", "defined_out": [ @@ -60501,7 +60481,7 @@ "tmp%17#1" ] }, - "6553": { + "6536": { "op": "bytec 14 // \"next_principal_redemption\"", "defined_out": [ "\"next_principal_redemption\"", @@ -60525,7 +60505,7 @@ "\"next_principal_redemption\"" ] }, - "6555": { + "6538": { "op": "swap", "stack_out": [ "future_entry#0", @@ -60544,7 +60524,7 @@ "tmp%17#1" ] }, - "6556": { + "6539": { "op": "app_global_put", "stack_out": [ "future_entry#0", @@ -60561,7 +60541,7 @@ "tmp%4#0" ] }, - "6557": { + "6540": { "block": "_apply_non_cash_schedule_entry_after_if_else@30", "stack_in": [ "future_entry#0", @@ -60597,7 +60577,7 @@ "0" ] }, - "6558": { + "6541": { "op": "bytec_2 // \"event_cursor\"", "defined_out": [ "\"event_cursor\"", @@ -60620,7 +60600,7 @@ "\"event_cursor\"" ] }, - "6559": { + "6542": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%12#0", @@ -60643,7 +60623,7 @@ "maybe_exists%12#0" ] }, - "6560": { + "6543": { "error": "check self.event_cursor exists", "op": "assert // check self.event_cursor exists", "stack_out": [ @@ -60662,7 +60642,7 @@ "maybe_value%12#0" ] }, - "6561": { + "6544": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -60685,7 +60665,7 @@ "1" ] }, - "6562": { + "6545": { "op": "+", "defined_out": [ "tmp%23#0" @@ -60706,7 +60686,7 @@ "tmp%23#0" ] }, - "6563": { + "6546": { "op": "bytec_2 // \"event_cursor\"", "stack_out": [ "future_entry#0", @@ -60725,7 +60705,7 @@ "\"event_cursor\"" ] }, - "6564": { + "6547": { "op": "swap", "stack_out": [ "future_entry#0", @@ -60744,7 +60724,7 @@ "tmp%23#0" ] }, - "6565": { + "6548": { "op": "app_global_put", "stack_out": [ "future_entry#0", @@ -60761,7 +60741,7 @@ "tmp%4#0" ] }, - "6566": { + "6549": { "op": "frame_dig -2", "defined_out": [ "entry#0 (copy)" @@ -60782,7 +60762,7 @@ "entry#0 (copy)" ] }, - "6568": { + "6551": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -60801,7 +60781,7 @@ "0" ] }, - "6569": { + "6552": { "op": "dup", "stack_out": [ "future_entry#0", @@ -60821,7 +60801,7 @@ "0" ] }, - "6570": { + "6553": { "callsub": "modules.actus_kernel.ActusKernelModule._emit_execution_event", "op": "callsub _emit_execution_event", "defined_out": [ @@ -60843,10 +60823,10 @@ "entry#0" ] }, - "6573": { + "6556": { "op": "dup" }, - "6574": { + "6557": { "op": "frame_bury -2", "stack_out": [ "future_entry#0", @@ -60864,7 +60844,7 @@ "entry#0 (copy)" ] }, - "6576": { + "6559": { "op": "frame_dig -1", "defined_out": [ "entry#0 (copy)", @@ -60887,17 +60867,17 @@ "payload#0 (copy)" ] }, - "6578": { + "6561": { "op": "frame_bury 1" }, - "6580": { + "6563": { "op": "frame_bury 0" }, - "6582": { + "6565": { "retsub": true, "op": "retsub" }, - "6583": { + "6566": { "block": "_apply_non_cash_schedule_entry_else_body@29", "stack_in": [ "future_entry#0", @@ -60933,7 +60913,7 @@ "entry#0 (copy)" ] }, - "6585": { + "6568": { "op": "pushint 41", "defined_out": [ "41", @@ -60956,7 +60936,7 @@ "41" ] }, - "6587": { + "6570": { "op": "extract_uint64", "defined_out": [ "values%12#0" @@ -60977,7 +60957,7 @@ "values%12#0" ] }, - "6588": { + "6571": { "op": "bytec 14 // \"next_principal_redemption\"", "defined_out": [ "\"next_principal_redemption\"", @@ -61000,7 +60980,7 @@ "\"next_principal_redemption\"" ] }, - "6590": { + "6573": { "op": "swap", "stack_out": [ "future_entry#0", @@ -61019,7 +60999,7 @@ "values%12#0" ] }, - "6591": { + "6574": { "op": "app_global_put", "stack_out": [ "future_entry#0", @@ -61036,10 +61016,10 @@ "tmp%4#0" ] }, - "6592": { + "6575": { "op": "b _apply_non_cash_schedule_entry_after_if_else@30" }, - "6595": { + "6578": { "block": "_apply_non_cash_schedule_entry_else_body@20", "stack_in": [ "future_entry#0", @@ -61075,7 +61055,7 @@ "event_type#0" ] }, - "6597": { + "6580": { "op": "pushint 18", "defined_out": [ "18", @@ -61098,7 +61078,7 @@ "18" ] }, - "6599": { + "6582": { "op": "==", "defined_out": [ "event_type#0", @@ -61120,7 +61100,7 @@ "tmp%17#0" ] }, - "6600": { + "6583": { "op": "bz _apply_non_cash_schedule_entry_after_if_else@23", "stack_out": [ "future_entry#0", @@ -61137,7 +61117,7 @@ "tmp%4#0" ] }, - "6603": { + "6586": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -61159,7 +61139,7 @@ "0" ] }, - "6604": { + "6587": { "op": "bytec 4 // \"outstanding_principal\"", "defined_out": [ "\"outstanding_principal\"", @@ -61183,7 +61163,7 @@ "\"outstanding_principal\"" ] }, - "6606": { + "6589": { "op": "app_global_get_ex", "defined_out": [ "event_type#0", @@ -61207,7 +61187,7 @@ "maybe_exists%9#0" ] }, - "6607": { + "6590": { "error": "check self.outstanding_principal exists", "op": "assert // check self.outstanding_principal exists", "stack_out": [ @@ -61226,7 +61206,7 @@ "maybe_value%9#0" ] }, - "6608": { + "6591": { "op": "bytec 7 // \"interest_calculation_base\"", "defined_out": [ "\"interest_calculation_base\"", @@ -61250,7 +61230,7 @@ "\"interest_calculation_base\"" ] }, - "6610": { + "6593": { "op": "swap", "stack_out": [ "future_entry#0", @@ -61269,7 +61249,7 @@ "maybe_value%9#0" ] }, - "6611": { + "6594": { "op": "app_global_put", "stack_out": [ "future_entry#0", @@ -61286,10 +61266,10 @@ "tmp%4#0" ] }, - "6612": { + "6595": { "op": "b _apply_non_cash_schedule_entry_after_if_else@23" }, - "6615": { + "6598": { "block": "_apply_non_cash_schedule_entry_else_body@10", "stack_in": [ "future_entry#0", @@ -61325,7 +61305,7 @@ "event_type#0" ] }, - "6617": { + "6600": { "op": "pushint 11", "defined_out": [ "11", @@ -61348,7 +61328,7 @@ "11" ] }, - "6619": { + "6602": { "op": "==", "defined_out": [ "event_type#0", @@ -61370,7 +61350,7 @@ "tmp%13#0" ] }, - "6620": { + "6603": { "op": "bz _apply_non_cash_schedule_entry_else_body@14", "stack_out": [ "future_entry#0", @@ -61387,7 +61367,7 @@ "tmp%4#0" ] }, - "6623": { + "6606": { "op": "frame_dig -2", "defined_out": [ "entry#0 (copy)", @@ -61409,7 +61389,7 @@ "entry#0 (copy)" ] }, - "6625": { + "6608": { "op": "pushint 33", "defined_out": [ "33", @@ -61433,7 +61413,7 @@ "33" ] }, - "6627": { + "6610": { "op": "extract_uint64", "defined_out": [ "event_type#0", @@ -61455,7 +61435,7 @@ "next_rate#0" ] }, - "6628": { + "6611": { "op": "dup", "stack_out": [ "future_entry#0", @@ -61474,7 +61454,7 @@ "next_rate#0" ] }, - "6629": { + "6612": { "op": "frame_bury 5", "defined_out": [ "event_type#0", @@ -61496,7 +61476,7 @@ "next_rate#0" ] }, - "6631": { + "6614": { "op": "bnz _apply_non_cash_schedule_entry_after_if_else@13", "stack_out": [ "future_entry#0", @@ -61513,7 +61493,7 @@ "tmp%4#0" ] }, - "6634": { + "6617": { "op": "intc_0 // 0", "stack_out": [ "future_entry#0", @@ -61531,8 +61511,8 @@ "0" ] }, - "6635": { - "op": "bytec 37 // \"rate_reset_next\"", + "6618": { + "op": "bytec 38 // \"rate_reset_next\"", "defined_out": [ "\"rate_reset_next\"", "0", @@ -61556,7 +61536,7 @@ "\"rate_reset_next\"" ] }, - "6637": { + "6620": { "op": "app_global_get_ex", "defined_out": [ "event_type#0", @@ -61580,7 +61560,7 @@ "maybe_exists%8#0" ] }, - "6638": { + "6621": { "op": "swap", "stack_out": [ "future_entry#0", @@ -61599,7 +61579,7 @@ "next_rate#0" ] }, - "6639": { + "6622": { "op": "frame_bury 5", "stack_out": [ "future_entry#0", @@ -61617,7 +61597,7 @@ "maybe_exists%8#0" ] }, - "6641": { + "6624": { "error": "check self.rate_reset_next exists", "op": "assert // check self.rate_reset_next exists", "stack_out": [ @@ -61635,7 +61615,7 @@ "tmp%4#0" ] }, - "6642": { + "6625": { "block": "_apply_non_cash_schedule_entry_after_if_else@13", "stack_in": [ "future_entry#0", @@ -61671,7 +61651,7 @@ "\"nominal_interest_rate\"" ] }, - "6644": { + "6627": { "op": "frame_dig 5", "defined_out": [ "\"nominal_interest_rate\"", @@ -61694,7 +61674,7 @@ "next_rate#0" ] }, - "6646": { + "6629": { "op": "app_global_put", "stack_out": [ "future_entry#0", @@ -61711,10 +61691,10 @@ "tmp%4#0" ] }, - "6647": { + "6630": { "op": "b _apply_non_cash_schedule_entry_after_if_else@18" }, - "6650": { + "6633": { "block": "_apply_non_cash_schedule_entry_else_body@14", "stack_in": [ "future_entry#0", @@ -61750,7 +61730,7 @@ "entry#0 (copy)" ] }, - "6652": { + "6635": { "op": "pushint 33", "defined_out": [ "33", @@ -61773,7 +61753,7 @@ "33" ] }, - "6654": { + "6637": { "op": "extract_uint64", "defined_out": [ "values%8#0" @@ -61794,7 +61774,7 @@ "values%8#0" ] }, - "6655": { + "6638": { "op": "dup", "stack_out": [ "future_entry#0", @@ -61813,7 +61793,7 @@ "values%8#0" ] }, - "6656": { + "6639": { "op": "frame_bury 9", "defined_out": [ "values%8#0" @@ -61834,7 +61814,7 @@ "values%8#0" ] }, - "6658": { + "6641": { "op": "bz _apply_non_cash_schedule_entry_after_if_else@18", "stack_out": [ "future_entry#0", @@ -61851,7 +61831,7 @@ "tmp%4#0" ] }, - "6661": { + "6644": { "op": "bytec 9 // \"nominal_interest_rate\"", "defined_out": [ "\"nominal_interest_rate\"", @@ -61873,7 +61853,7 @@ "\"nominal_interest_rate\"" ] }, - "6663": { + "6646": { "op": "frame_dig 9", "stack_out": [ "future_entry#0", @@ -61892,7 +61872,7 @@ "values%8#0" ] }, - "6665": { + "6648": { "op": "app_global_put", "stack_out": [ "future_entry#0", @@ -61909,10 +61889,10 @@ "tmp%4#0" ] }, - "6666": { + "6649": { "op": "b _apply_non_cash_schedule_entry_after_if_else@18" }, - "6669": { + "6652": { "subroutine": "modules.actus_kernel.ActusKernelModule._emit_execution_event", "params": { "entry#0": "bytes", @@ -61923,13 +61903,13 @@ "stack_in": [], "op": "proto 3 1" }, - "6672": { + "6655": { "op": "global CurrentApplicationID" }, - "6674": { + "6657": { "op": "frame_dig -3" }, - "6676": { + "6659": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -61942,7 +61922,7 @@ "0" ] }, - "6677": { + "6660": { "op": "extract_uint64", "defined_out": [ "tmp%0#0", @@ -61953,7 +61933,7 @@ "values%0#0" ] }, - "6678": { + "6661": { "op": "frame_dig -3", "stack_out": [ "tmp%0#0", @@ -61961,7 +61941,7 @@ "entry#0 (copy)" ] }, - "6680": { + "6663": { "op": "extract 8 1", "defined_out": [ "aggregate%extract%1#0", @@ -61974,7 +61954,7 @@ "aggregate%extract%1#0" ] }, - "6683": { + "6666": { "op": "frame_dig -3", "stack_out": [ "tmp%0#0", @@ -61983,7 +61963,7 @@ "entry#0 (copy)" ] }, - "6685": { + "6668": { "op": "extract 9 8", "defined_out": [ "aggregate%extract%1#0", @@ -61998,13 +61978,13 @@ "aggregate%extract%2#0" ] }, - "6688": { + "6671": { "op": "global LatestTimestamp" }, - "6690": { + "6673": { "op": "frame_dig -3" }, - "6692": { + "6675": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -62025,7 +62005,7 @@ "8" ] }, - "6693": { + "6676": { "op": "getbyte", "defined_out": [ "aggregate%extract%1#0", @@ -62044,7 +62024,7 @@ "event_type#0" ] }, - "6694": { + "6677": { "op": "frame_dig -2", "defined_out": [ "aggregate%extract%1#0", @@ -62065,7 +62045,7 @@ "payoff#0 (copy)" ] }, - "6696": { + "6679": { "op": "bnz _emit_execution_event_after_if_else@3", "stack_out": [ "tmp%0#0", @@ -62076,7 +62056,7 @@ "event_type#0" ] }, - "6699": { + "6682": { "op": "intc_1 // 1", "defined_out": [ "aggregate%extract%1#0", @@ -62097,7 +62077,7 @@ "tmp%3#0" ] }, - "6700": { + "6683": { "block": "_emit_execution_event_after_inlined_modules.actus_kernel.ActusKernelModule._payoff_sign@7", "stack_in": [ "tmp%0#0", @@ -62122,7 +62102,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "6701": { + "6684": { "op": "dup", "defined_out": [ "aggregate%val_as_bytes%0#0", @@ -62139,7 +62119,7 @@ "aggregate%val_as_bytes%0#0 (copy)" ] }, - "6702": { + "6685": { "op": "bitlen", "defined_out": [ "aggregate%bitlen%0#0", @@ -62156,7 +62136,7 @@ "aggregate%bitlen%0#0" ] }, - "6703": { + "6686": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -62175,7 +62155,7 @@ "8" ] }, - "6704": { + "6687": { "op": "<=", "defined_out": [ "aggregate%no_overflow%0#0", @@ -62192,7 +62172,7 @@ "aggregate%no_overflow%0#0" ] }, - "6705": { + "6688": { "error": "overflow", "op": "assert // overflow", "stack_out": [ @@ -62205,7 +62185,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "6706": { + "6689": { "op": "extract 7 1", "defined_out": [ "aggregate%uint8%0#0" @@ -62220,7 +62200,7 @@ "aggregate%uint8%0#0" ] }, - "6709": { + "6692": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -62237,7 +62217,7 @@ "0" ] }, - "6710": { + "6693": { "op": "bytec 19 // \"settlement_asset_id\"", "defined_out": [ "\"settlement_asset_id\"", @@ -62256,7 +62236,7 @@ "\"settlement_asset_id\"" ] }, - "6712": { + "6695": { "op": "app_global_get_ex", "defined_out": [ "aggregate%uint8%0#0", @@ -62275,7 +62255,7 @@ "maybe_exists%0#0" ] }, - "6713": { + "6696": { "error": "check self.settlement_asset_id exists", "op": "assert // check self.settlement_asset_id exists", "stack_out": [ @@ -62289,7 +62269,7 @@ "maybe_value%0#0" ] }, - "6714": { + "6697": { "op": "frame_dig 1", "defined_out": [ "aggregate%uint8%0#0", @@ -62308,7 +62288,7 @@ "values%0#0" ] }, - "6716": { + "6699": { "op": "dup", "defined_out": [ "aggregate%uint8%0#0", @@ -62329,7 +62309,7 @@ "values%0#0 (copy)" ] }, - "6717": { + "6700": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -62352,7 +62332,7 @@ "1" ] }, - "6718": { + "6701": { "op": "+", "defined_out": [ "aggregate%uint8%0#0", @@ -62373,7 +62353,7 @@ "tmp%5#0" ] }, - "6719": { + "6702": { "op": "frame_dig 0", "defined_out": [ "aggregate%uint8%0#0", @@ -62396,7 +62376,7 @@ "tmp%0#0" ] }, - "6721": { + "6704": { "op": "itob", "defined_out": [ "aggregate%uint8%0#0", @@ -62420,7 +62400,7 @@ "aggregate%val_as_bytes%1#0" ] }, - "6722": { + "6705": { "op": "uncover 2", "stack_out": [ "tmp%0#0", @@ -62436,7 +62416,7 @@ "values%0#0" ] }, - "6724": { + "6707": { "op": "itob", "defined_out": [ "aggregate%uint8%0#0", @@ -62461,7 +62441,7 @@ "aggregate%val_as_bytes%2#0" ] }, - "6725": { + "6708": { "op": "concat", "defined_out": [ "aggregate%head%1#0", @@ -62484,7 +62464,7 @@ "aggregate%head%1#0" ] }, - "6726": { + "6709": { "op": "frame_dig 2", "defined_out": [ "aggregate%extract%1#0", @@ -62509,7 +62489,7 @@ "aggregate%extract%1#0" ] }, - "6728": { + "6711": { "op": "concat", "defined_out": [ "aggregate%extract%1#0", @@ -62533,7 +62513,7 @@ "aggregate%head%2#0" ] }, - "6729": { + "6712": { "op": "frame_dig 3", "defined_out": [ "aggregate%extract%1#0", @@ -62559,7 +62539,7 @@ "aggregate%extract%2#0" ] }, - "6731": { + "6714": { "op": "concat", "defined_out": [ "aggregate%extract%1#0", @@ -62584,7 +62564,7 @@ "aggregate%head%3#0" ] }, - "6732": { + "6715": { "op": "frame_dig 4", "defined_out": [ "aggregate%extract%1#0", @@ -62611,7 +62591,7 @@ "tmp%1#0" ] }, - "6734": { + "6717": { "op": "itob", "defined_out": [ "aggregate%extract%1#0", @@ -62639,7 +62619,7 @@ "aggregate%val_as_bytes%4#0" ] }, - "6735": { + "6718": { "op": "concat", "defined_out": [ "aggregate%extract%1#0", @@ -62665,7 +62645,7 @@ "aggregate%head%4#0" ] }, - "6736": { + "6719": { "op": "frame_dig -2", "defined_out": [ "aggregate%extract%1#0", @@ -62693,7 +62673,7 @@ "payoff#0 (copy)" ] }, - "6738": { + "6721": { "op": "itob", "defined_out": [ "aggregate%extract%1#0", @@ -62721,7 +62701,7 @@ "aggregate%val_as_bytes%5#0" ] }, - "6739": { + "6722": { "op": "concat", "defined_out": [ "aggregate%extract%1#0", @@ -62747,7 +62727,7 @@ "aggregate%head%5#0" ] }, - "6740": { + "6723": { "op": "uncover 3", "stack_out": [ "tmp%0#0", @@ -62762,7 +62742,7 @@ "aggregate%uint8%0#0" ] }, - "6742": { + "6725": { "op": "concat", "defined_out": [ "aggregate%extract%1#0", @@ -62786,7 +62766,7 @@ "aggregate%head%6#0" ] }, - "6743": { + "6726": { "op": "frame_dig -1", "defined_out": [ "aggregate%extract%1#0", @@ -62812,7 +62792,7 @@ "settled_amount#0 (copy)" ] }, - "6745": { + "6728": { "op": "itob", "defined_out": [ "aggregate%extract%1#0", @@ -62838,7 +62818,7 @@ "aggregate%val_as_bytes%6#0" ] }, - "6746": { + "6729": { "op": "concat", "defined_out": [ "aggregate%extract%1#0", @@ -62862,7 +62842,7 @@ "aggregate%head%7#0" ] }, - "6747": { + "6730": { "op": "uncover 2", "stack_out": [ "tmp%0#0", @@ -62876,7 +62856,7 @@ "maybe_value%0#0" ] }, - "6749": { + "6732": { "op": "itob", "defined_out": [ "aggregate%extract%1#0", @@ -62900,7 +62880,7 @@ "aggregate%val_as_bytes%7#0" ] }, - "6750": { + "6733": { "op": "concat", "defined_out": [ "aggregate%extract%1#0", @@ -62922,7 +62902,7 @@ "aggregate%head%8#0" ] }, - "6751": { + "6734": { "op": "swap", "stack_out": [ "tmp%0#0", @@ -62935,7 +62915,7 @@ "tmp%5#0" ] }, - "6752": { + "6735": { "op": "itob", "defined_out": [ "aggregate%extract%1#0", @@ -62957,7 +62937,7 @@ "aggregate%val_as_bytes%8#0" ] }, - "6753": { + "6736": { "op": "concat", "defined_out": [ "aggregate%extract%1#0", @@ -62977,7 +62957,7 @@ "aggregate%head%9#0" ] }, - "6754": { + "6737": { "op": "pushbytes 0x9a332b95 // method \"ExecutionEvent(uint64,uint64,uint8,uint64,uint64,uint64,uint8,uint64,uint64,uint64)\"", "defined_out": [ "Method(ExecutionEvent(uint64,uint64,uint8,uint64,uint64,uint64,uint8,uint64,uint64,uint64))", @@ -62999,7 +62979,7 @@ "Method(ExecutionEvent(uint64,uint64,uint8,uint64,uint64,uint64,uint8,uint64,uint64,uint64))" ] }, - "6760": { + "6743": { "op": "swap", "stack_out": [ "tmp%0#0", @@ -63012,7 +62992,7 @@ "aggregate%head%9#0" ] }, - "6761": { + "6744": { "op": "concat", "defined_out": [ "aggregate%extract%1#0", @@ -63032,7 +63012,7 @@ "event%0#0" ] }, - "6762": { + "6745": { "op": "log", "stack_out": [ "tmp%0#0", @@ -63043,7 +63023,7 @@ "event_type#0" ] }, - "6763": { + "6746": { "op": "frame_dig -3", "defined_out": [ "aggregate%extract%1#0", @@ -63063,14 +63043,14 @@ "entry#0 (copy)" ] }, - "6765": { + "6748": { "op": "frame_bury 0" }, - "6767": { + "6750": { "retsub": true, "op": "retsub" }, - "6768": { + "6751": { "block": "_emit_execution_event_after_if_else@3", "stack_in": [ "tmp%0#0", @@ -63094,7 +63074,7 @@ "event_type#0" ] }, - "6770": { + "6753": { "op": "intc_1 // 1", "defined_out": [ "1", @@ -63111,7 +63091,7 @@ "1" ] }, - "6771": { + "6754": { "op": "==", "defined_out": [ "event_type#0", @@ -63127,7 +63107,7 @@ "tmp%1#1" ] }, - "6772": { + "6755": { "op": "bnz _emit_execution_event_if_body@5", "stack_out": [ "tmp%0#0", @@ -63138,7 +63118,7 @@ "event_type#0" ] }, - "6775": { + "6758": { "op": "frame_dig 5", "stack_out": [ "tmp%0#0", @@ -63150,7 +63130,7 @@ "event_type#0" ] }, - "6777": { + "6760": { "op": "pushint 4", "defined_out": [ "4", @@ -63167,7 +63147,7 @@ "4" ] }, - "6779": { + "6762": { "op": "==", "defined_out": [ "event_type#0", @@ -63183,7 +63163,7 @@ "tmp%2#1" ] }, - "6780": { + "6763": { "op": "bz _emit_execution_event_after_if_else@6", "stack_out": [ "tmp%0#0", @@ -63194,7 +63174,7 @@ "event_type#0" ] }, - "6783": { + "6766": { "block": "_emit_execution_event_if_body@5", "stack_in": [ "tmp%0#0", @@ -63218,10 +63198,10 @@ "tmp%3#0" ] }, - "6784": { + "6767": { "op": "b _emit_execution_event_after_inlined_modules.actus_kernel.ActusKernelModule._payoff_sign@7" }, - "6787": { + "6770": { "block": "_emit_execution_event_after_if_else@6", "stack_in": [ "tmp%0#0", @@ -63245,10 +63225,10 @@ "tmp%3#0" ] }, - "6790": { + "6773": { "op": "b _emit_execution_event_after_inlined_modules.actus_kernel.ActusKernelModule._payoff_sign@7" }, - "6793": { + "6776": { "subroutine": "modules.rbac.RbacModule._role_is_active", "params": { "role_map#0": "bytes", @@ -63258,13 +63238,13 @@ "stack_in": [], "op": "proto 2 1" }, - "6796": { + "6779": { "op": "pushbytes \"\"", "stack_out": [ "awst_tmp%0#0" ] }, - "6798": { + "6781": { "op": "frame_dig -2", "defined_out": [ "role_map#0 (copy)" @@ -63274,7 +63254,7 @@ "role_map#0 (copy)" ] }, - "6800": { + "6783": { "op": "frame_dig -1", "defined_out": [ "role_address#0 (copy)", @@ -63286,7 +63266,7 @@ "role_address#0 (copy)" ] }, - "6802": { + "6785": { "op": "concat", "defined_out": [ "box_prefixed_key%0#1" @@ -63296,7 +63276,7 @@ "box_prefixed_key%0#1" ] }, - "6803": { + "6786": { "op": "dup", "defined_out": [ "box_prefixed_key%0#1" @@ -63307,7 +63287,7 @@ "box_prefixed_key%0#1" ] }, - "6804": { + "6787": { "op": "box_len", "defined_out": [ "_%0#0", @@ -63321,7 +63301,7 @@ "maybe_exists%0#0" ] }, - "6805": { + "6788": { "op": "bury 1", "stack_out": [ "awst_tmp%0#0", @@ -63329,14 +63309,14 @@ "maybe_exists%0#0" ] }, - "6807": { + "6790": { "op": "bz _role_is_active_bool_false@4", "stack_out": [ "awst_tmp%0#0", "box_prefixed_key%0#1" ] }, - "6810": { + "6793": { "op": "frame_dig 1", "stack_out": [ "awst_tmp%0#0", @@ -63344,7 +63324,7 @@ "box_prefixed_key%0#1" ] }, - "6812": { + "6795": { "op": "box_get", "defined_out": [ "aggregate%box_get%0#0", @@ -63358,7 +63338,7 @@ "aggregate%box_get%1#0" ] }, - "6813": { + "6796": { "error": "check BoxMap entry exists", "op": "assert // check BoxMap entry exists", "stack_out": [ @@ -63367,7 +63347,7 @@ "aggregate%box_get%0#0" ] }, - "6814": { + "6797": { "op": "intc_0 // 0", "stack_out": [ "awst_tmp%0#0", @@ -63376,7 +63356,7 @@ "0" ] }, - "6815": { + "6798": { "op": "extract_uint64", "defined_out": [ "box_prefixed_key%0#1", @@ -63388,10 +63368,10 @@ "values%0#0" ] }, - "6816": { + "6799": { "op": "global LatestTimestamp" }, - "6818": { + "6801": { "op": "dup", "defined_out": [ "awst_tmp%0#0", @@ -63406,7 +63386,7 @@ "awst_tmp%0#0" ] }, - "6819": { + "6802": { "op": "frame_bury 0", "defined_out": [ "awst_tmp%0#0", @@ -63420,7 +63400,7 @@ "awst_tmp%0#0" ] }, - "6821": { + "6804": { "op": "<=", "defined_out": [ "awst_tmp%0#0", @@ -63433,14 +63413,14 @@ "tmp%1#0" ] }, - "6822": { + "6805": { "op": "bz _role_is_active_bool_false@4", "stack_out": [ "awst_tmp%0#0", "box_prefixed_key%0#1" ] }, - "6825": { + "6808": { "op": "frame_dig 1", "stack_out": [ "awst_tmp%0#0", @@ -63448,7 +63428,7 @@ "box_prefixed_key%0#1" ] }, - "6827": { + "6810": { "op": "box_get", "defined_out": [ "aggregate%box_get%2#0", @@ -63463,7 +63443,7 @@ "aggregate%box_get%3#0" ] }, - "6828": { + "6811": { "error": "check BoxMap entry exists", "op": "assert // check BoxMap entry exists", "stack_out": [ @@ -63472,7 +63452,7 @@ "aggregate%box_get%2#0" ] }, - "6829": { + "6812": { "op": "intc_2 // 8", "defined_out": [ "8", @@ -63487,7 +63467,7 @@ "8" ] }, - "6830": { + "6813": { "op": "extract_uint64", "defined_out": [ "awst_tmp%0#0", @@ -63500,7 +63480,7 @@ "values%1#0" ] }, - "6831": { + "6814": { "op": "frame_dig 0", "stack_out": [ "awst_tmp%0#0", @@ -63509,7 +63489,7 @@ "awst_tmp%0#0" ] }, - "6833": { + "6816": { "op": ">=", "defined_out": [ "awst_tmp%0#0", @@ -63522,14 +63502,14 @@ "tmp%2#0" ] }, - "6834": { + "6817": { "op": "bz _role_is_active_bool_false@4", "stack_out": [ "awst_tmp%0#0", "box_prefixed_key%0#1" ] }, - "6837": { + "6820": { "op": "intc_1 // 1", "defined_out": [ "and_result%0#0", @@ -63542,7 +63522,7 @@ "and_result%0#0" ] }, - "6838": { + "6821": { "block": "_role_is_active_bool_merge@5", "stack_in": [ "awst_tmp%0#0", @@ -63554,11 +63534,11 @@ "and_result%0#0" ] }, - "6840": { + "6823": { "retsub": true, "op": "retsub" }, - "6841": { + "6824": { "block": "_role_is_active_bool_false@4", "stack_in": [ "awst_tmp%0#0", @@ -63574,10 +63554,10 @@ "and_result%0#0" ] }, - "6842": { + "6825": { "op": "b _role_is_active_bool_merge@5" }, - "6845": { + "6828": { "subroutine": "modules.rbac.RbacModule._assert_caller_is_arranger", "params": {}, "block": "_assert_caller_is_arranger", @@ -63590,7 +63570,7 @@ "role_address#0" ] }, - "6847": { + "6830": { "op": "intc_0 // 0", "defined_out": [ "0", @@ -63601,7 +63581,7 @@ "0" ] }, - "6848": { + "6831": { "op": "bytec 18 // 0x523a41525223", "defined_out": [ "0", @@ -63614,7 +63594,7 @@ "0x523a41525223" ] }, - "6850": { + "6833": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -63627,7 +63607,7 @@ "maybe_exists%0#0" ] }, - "6851": { + "6834": { "error": "check self.arranger exists", "op": "assert // check self.arranger exists", "stack_out": [ @@ -63635,7 +63615,7 @@ "maybe_value%0#0" ] }, - "6852": { + "6835": { "op": "==", "defined_out": [ "tmp%0#1" @@ -63644,16 +63624,16 @@ "tmp%0#1" ] }, - "6853": { + "6836": { "error": "Not authorized", "op": "assert // Not authorized", "stack_out": [] }, - "6854": { + "6837": { "retsub": true, "op": "retsub" }, - "6855": { + "6838": { "subroutine": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", "params": {}, "block": "_assert_is_not_asset_defaulted", @@ -63666,18 +63646,18 @@ "0" ] }, - "6856": { - "op": "bytec 41 // \"asset_defaulted\"", + "6839": { + "op": "bytec 34 // \"defaulted\"", "defined_out": [ - "\"asset_defaulted\"", + "\"defaulted\"", "0" ], "stack_out": [ "0", - "\"asset_defaulted\"" + "\"defaulted\"" ] }, - "6858": { + "6841": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -63688,14 +63668,14 @@ "maybe_exists%0#0" ] }, - "6859": { - "error": "check self.asset_defaulted exists", - "op": "assert // check self.asset_defaulted exists", + "6842": { + "error": "check self.defaulted exists", + "op": "assert // check self.defaulted exists", "stack_out": [ "maybe_value%0#0" ] }, - "6860": { + "6843": { "op": "!", "defined_out": [ "tmp%0#0" @@ -63704,16 +63684,16 @@ "tmp%0#0" ] }, - "6861": { + "6844": { "error": "Defaulted", "op": "assert // Defaulted", "stack_out": [] }, - "6862": { + "6845": { "retsub": true, "op": "retsub" }, - "6863": { + "6846": { "subroutine": "modules.rbac.RbacModule._assert_is_not_asset_suspended", "params": {}, "block": "_assert_is_not_asset_suspended", @@ -63726,18 +63706,18 @@ "0" ] }, - "6864": { - "op": "bytec 33 // \"asset_suspended\"", + "6847": { + "op": "bytec 33 // \"contract_suspended\"", "defined_out": [ - "\"asset_suspended\"", + "\"contract_suspended\"", "0" ], "stack_out": [ "0", - "\"asset_suspended\"" + "\"contract_suspended\"" ] }, - "6866": { + "6849": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -63748,14 +63728,14 @@ "maybe_exists%0#0" ] }, - "6867": { - "error": "check self.asset_suspended exists", - "op": "assert // check self.asset_suspended exists", + "6850": { + "error": "check self.contract_suspended exists", + "op": "assert // check self.contract_suspended exists", "stack_out": [ "maybe_value%0#0" ] }, - "6868": { + "6851": { "op": "!", "defined_out": [ "tmp%0#0" @@ -63764,16 +63744,16 @@ "tmp%0#0" ] }, - "6869": { + "6852": { "error": "Suspended operations", "op": "assert // Suspended operations", "stack_out": [] }, - "6870": { + "6853": { "retsub": true, "op": "retsub" }, - "6871": { + "6854": { "subroutine": "modules.rbac.RbacModule._assert_valid_role", "params": { "role_id#0": "uint64" @@ -63782,7 +63762,7 @@ "stack_in": [], "op": "proto 1 0" }, - "6874": { + "6857": { "op": "frame_dig -1", "defined_out": [ "role_id#0 (copy)" @@ -63791,7 +63771,7 @@ "role_id#0 (copy)" ] }, - "6876": { + "6859": { "op": "pushint 20", "defined_out": [ "20", @@ -63802,7 +63782,7 @@ "20" ] }, - "6878": { + "6861": { "op": "==", "defined_out": [ "tmp%0#0" @@ -63811,17 +63791,17 @@ "tmp%0#0" ] }, - "6879": { + "6862": { "op": "bnz _assert_valid_role_bool_true@7", "stack_out": [] }, - "6882": { + "6865": { "op": "frame_dig -1", "stack_out": [ "role_id#0 (copy)" ] }, - "6884": { + "6867": { "op": "pushint 25", "defined_out": [ "25", @@ -63832,7 +63812,7 @@ "25" ] }, - "6886": { + "6869": { "op": "==", "defined_out": [ "tmp%1#0" @@ -63841,17 +63821,17 @@ "tmp%1#0" ] }, - "6887": { + "6870": { "op": "bnz _assert_valid_role_bool_true@7", "stack_out": [] }, - "6890": { + "6873": { "op": "frame_dig -1", "stack_out": [ "role_id#0 (copy)" ] }, - "6892": { + "6875": { "op": "pushint 40", "defined_out": [ "40", @@ -63862,7 +63842,7 @@ "40" ] }, - "6894": { + "6877": { "op": "==", "defined_out": [ "tmp%2#0" @@ -63871,17 +63851,17 @@ "tmp%2#0" ] }, - "6895": { + "6878": { "op": "bnz _assert_valid_role_bool_true@7", "stack_out": [] }, - "6898": { + "6881": { "op": "frame_dig -1", "stack_out": [ "role_id#0 (copy)" ] }, - "6900": { + "6883": { "op": "pushint 50", "defined_out": [ "50", @@ -63892,7 +63872,7 @@ "50" ] }, - "6902": { + "6885": { "op": "==", "defined_out": [ "tmp%3#0" @@ -63901,17 +63881,17 @@ "tmp%3#0" ] }, - "6903": { + "6886": { "op": "bnz _assert_valid_role_bool_true@7", "stack_out": [] }, - "6906": { + "6889": { "op": "frame_dig -1", "stack_out": [ "role_id#0 (copy)" ] }, - "6908": { + "6891": { "op": "pushint 60", "defined_out": [ "60", @@ -63922,7 +63902,7 @@ "60" ] }, - "6910": { + "6893": { "op": "==", "defined_out": [ "tmp%4#0" @@ -63931,17 +63911,17 @@ "tmp%4#0" ] }, - "6911": { + "6894": { "op": "bnz _assert_valid_role_bool_true@7", "stack_out": [] }, - "6914": { + "6897": { "op": "frame_dig -1", "stack_out": [ "role_id#0 (copy)" ] }, - "6916": { + "6899": { "op": "pushint 70", "defined_out": [ "70", @@ -63952,7 +63932,7 @@ "70" ] }, - "6918": { + "6901": { "op": "==", "defined_out": [ "tmp%5#0" @@ -63961,17 +63941,17 @@ "tmp%5#0" ] }, - "6919": { + "6902": { "op": "bnz _assert_valid_role_bool_true@7", "stack_out": [] }, - "6922": { + "6905": { "op": "frame_dig -1", "stack_out": [ "role_id#0 (copy)" ] }, - "6924": { + "6907": { "op": "pushint 80", "defined_out": [ "80", @@ -63982,7 +63962,7 @@ "80" ] }, - "6926": { + "6909": { "op": "==", "defined_out": [ "tmp%6#0" @@ -63991,11 +63971,11 @@ "tmp%6#0" ] }, - "6927": { + "6910": { "op": "bz _assert_valid_role_bool_false@8", "stack_out": [] }, - "6930": { + "6913": { "block": "_assert_valid_role_bool_true@7", "stack_in": [], "op": "intc_1 // 1", @@ -64006,7 +63986,7 @@ "or_result%0#0" ] }, - "6931": { + "6914": { "error": "Invalid role identifier", "block": "_assert_valid_role_bool_merge@9", "stack_in": [ @@ -64016,11 +63996,11 @@ "defined_out": [], "stack_out": [] }, - "6932": { + "6915": { "retsub": true, "op": "retsub" }, - "6933": { + "6916": { "block": "_assert_valid_role_bool_false@8", "stack_in": [], "op": "intc_0 // 0", @@ -64031,7 +64011,7 @@ "or_result%0#0" ] }, - "6934": { + "6917": { "op": "b _assert_valid_role_bool_merge@9" } } diff --git a/smart_contracts/artifacts/d_asa/DASA.approval.teal b/smart_contracts/artifacts/d_asa/DASA.approval.teal index c9c114c3..524524d8 100644 --- a/smart_contracts/artifacts/d_asa/DASA.approval.teal +++ b/smart_contracts/artifacts/d_asa/DASA.approval.teal @@ -4,7 +4,7 @@ // algopy.arc4.ARC4Contract.approval_program() -> uint64: main: intcblock 0 1 8 32 1500 - bytecblock 0x151f7c75 "status" "event_cursor" "schedule_entry_count" "outstanding_principal" "fixed_point_scale" "accrued_interest" "interest_calculation_base" 0x4123 "nominal_interest_rate" "contract_type" "reserved_units_total" "reserved_principal" "total_units" "next_principal_redemption" "reserved_interest" "cumulative_interest_index" "cumulative_principal_index" 0x523a41525223 "settlement_asset_id" "initial_exchange_amount" 0x523a41555423 0x523a50594423 0x523a4d4e4723 0x5323 0x523a4d4f4323 0x523a54525323 0x523a4f504423 "initial_exchange_date" "transfer_opening_date" "transfer_closure_date" "rate_reset_floor" "rate_reset_cap" "asset_suspended" "dynamic_principal_redemption" "rate_reset_spread" "rate_reset_multiplier" "rate_reset_next" "has_rate_reset_floor" "has_rate_reset_cap" 0x00 "asset_defaulted" "prospectus_hash" "prospectus_url" "denomination_asset_id" "maturity_date" "day_count_convention" "defaulted" 0x068101 0x0000 + bytecblock 0x151f7c75 "status" "event_cursor" "schedule_entry_count" "outstanding_principal" "fixed_point_scale" "accrued_interest" "interest_calculation_base" 0x4123 "nominal_interest_rate" "contract_type" "reserved_units_total" "reserved_principal" "total_units" "next_principal_redemption" "reserved_interest" "cumulative_interest_index" "cumulative_principal_index" 0x523a41525223 "settlement_asset_id" "initial_exchange_amount" 0x523a41555423 0x523a50594423 0x523a4d4e4723 0x5323 0x523a4d4f4323 0x523a54525323 0x523a4f504423 "initial_exchange_date" "transfer_opening_date" "transfer_closure_date" "rate_reset_floor" "rate_reset_cap" "contract_suspended" "defaulted" "dynamic_principal_redemption" "rate_reset_spread" "rate_reset_multiplier" "rate_reset_next" "has_rate_reset_floor" "has_rate_reset_cap" 0x00 "prospectus_hash" "prospectus_url" "denomination_asset_id" "maturity_date" "day_count_convention" 0x068101 0x0000 txn ApplicationID bnz main_after_if_else@2 // modules/rbac.py:28-29 @@ -19,14 +19,15 @@ main: global ZeroAddress app_global_put // modules/rbac.py:47-48 - // # D-ASA Governance - // self.asset_suspended = False - bytec 33 // "asset_suspended" + // # Contract Governance + // self.contract_suspended = False + bytec 33 // "contract_suspended" intc_0 // 0 app_global_put - // modules/rbac.py:49 - // self.asset_defaulted = False - bytec 41 // "asset_defaulted" + // modules/rbac.py:50-51 + // # Contract Performance + // self.defaulted = False + bytec 34 // "defaulted" intc_0 // 0 app_global_put // modules/actus_kernel.py:56-57 @@ -118,7 +119,7 @@ main: app_global_put // modules/actus_kernel.py:85 // self.dynamic_principal_redemption = False - bytec 34 // "dynamic_principal_redemption" + bytec 35 // "dynamic_principal_redemption" intc_0 // 0 app_global_put // modules/actus_kernel.py:87-88 @@ -140,12 +141,12 @@ main: app_global_put // modules/actus_kernel.py:93 // self.rate_reset_spread = UInt64() - bytec 35 // "rate_reset_spread" + bytec 36 // "rate_reset_spread" intc_0 // 0 app_global_put // modules/actus_kernel.py:94 // self.rate_reset_multiplier = UInt64() - bytec 36 // "rate_reset_multiplier" + bytec 37 // "rate_reset_multiplier" intc_0 // 0 app_global_put // modules/actus_kernel.py:95 @@ -160,17 +161,17 @@ main: app_global_put // modules/actus_kernel.py:97 // self.rate_reset_next = UInt64() - bytec 37 // "rate_reset_next" + bytec 38 // "rate_reset_next" intc_0 // 0 app_global_put // modules/actus_kernel.py:98 // self.has_rate_reset_floor = False - bytec 38 // "has_rate_reset_floor" + bytec 39 // "has_rate_reset_floor" intc_0 // 0 app_global_put // modules/actus_kernel.py:99 // self.has_rate_reset_cap = False - bytec 39 // "has_rate_reset_cap" + bytec 40 // "has_rate_reset_cap" intc_0 // 0 app_global_put // modules/actus_kernel.py:101-102 @@ -206,12 +207,6 @@ main: intc_0 // 0 app_global_put // modules/actus_kernel.py:118-119 - // # Performance - // self.defaulted = False - bytec 47 // "defaulted" - intc_0 // 0 - app_global_put - // modules/actus_kernel.py:121-122 // # Scaling // self.fixed_point_scale = UInt64() bytec 5 // "fixed_point_scale" @@ -275,9 +270,9 @@ main_switch_case_next@5: assert txn ApplicationID bz main_create_NoOp@33 - pushbytess 0xb44618c8 0xe7832529 0x94388723 0x6c85e3ee 0xbdd1a944 0x7c0f1812 0x14fc10ef 0x74a7297f 0x09d4fe14 0x9a9bfa85 0x85eed33d 0xab2c0fc4 0xd9f225ac 0x9883505a 0xfb4d4428 0x8ea6e74c 0x02af557a 0x82f71b2d 0xef04f5d3 0xdf343550 0x3dbe80bd 0x1e3e48e7 0x010c8299 0x7406acd2 0x1a72a2ee // method "fund_due_cashflows(uint64)(uint64,uint64,uint64,uint64,uint64)", method "claim_due_cashflows(address,byte[])(uint64,uint64,uint64,uint64,byte[])", method "transfer_set_schedule(uint64,uint64)uint64", method "primary_distribution(address,uint64)uint64", method "transfer(address,address,uint64)uint64", method "account_suspension(address,bool)uint64", method "account_open(address,address)uint64", method "account_update_payment_address(address,address)uint64", method "account_get_position(address)(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64)", method "contract_config((uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64),(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64),(byte[32],string))uint64", method "contract_schedule(uint64,bool,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[])uint64", method "contract_execute_ied()uint64", method "apply_non_cash_event(uint64,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64", method "append_observed_cash_event((uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64", method "contract_set_default_status(bool)uint64", method "contract_get_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", method "contract_get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", method "rbac_rotate_arranger(address)uint64", method "rbac_set_op_daemon(address)uint64", method "rbac_assign_role(uint8,address,(uint64,uint64))uint64", method "rbac_revoke_role(uint8,address)uint64", method "rbac_contract_suspension(bool)uint64", method "rbac_get_arranger()address", method "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", method "rbac_get_role_validity(uint8,address)(uint64,uint64)" + pushbytess 0xb44618c8 0xe7832529 0x94388723 0x6c85e3ee 0xbdd1a944 0x7c0f1812 0x14fc10ef 0x74a7297f 0x09d4fe14 0x9a9bfa85 0x85eed33d 0xab2c0fc4 0xd9f225ac 0x9883505a 0x8ea6e74c 0x02af557a 0x82f71b2d 0xef04f5d3 0xdf343550 0x3dbe80bd 0x1e3e48e7 0x39241fa3 0x010c8299 0x7406acd2 0x1a72a2ee // method "fund_due_cashflows(uint64)(uint64,uint64,uint64,uint64,uint64)", method "claim_due_cashflows(address,byte[])(uint64,uint64,uint64,uint64,byte[])", method "transfer_set_schedule(uint64,uint64)uint64", method "primary_distribution(address,uint64)uint64", method "transfer(address,address,uint64)uint64", method "account_suspension(address,bool)uint64", method "account_open(address,address)uint64", method "account_update_payment_address(address,address)uint64", method "account_get_position(address)(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64)", method "contract_config((uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64),(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64),(byte[32],string))uint64", method "contract_schedule(uint64,bool,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[])uint64", method "contract_execute_ied()uint64", method "apply_non_cash_event(uint64,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64", method "append_observed_cash_event((uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64", method "contract_get_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", method "contract_get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", method "rbac_rotate_arranger(address)uint64", method "rbac_set_op_daemon(address)uint64", method "rbac_assign_role(uint8,address,(uint64,uint64))uint64", method "rbac_revoke_role(uint8,address)uint64", method "rbac_contract_suspension(bool)uint64", method "rbac_contract_default(bool)uint64", method "rbac_get_arranger()address", method "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", method "rbac_get_role_validity(uint8,address)(uint64,uint64)" txna ApplicationArgs 0 - match fund_due_cashflows claim_due_cashflows transfer_set_schedule primary_distribution transfer account_suspension account_open account_update_payment_address account_get_position contract_config contract_schedule contract_execute_ied apply_non_cash_event append_observed_cash_event contract_set_default_status contract_get_state contract_get_next_due_event rbac_rotate_arranger rbac_set_op_daemon rbac_assign_role rbac_revoke_role rbac_contract_suspension rbac_get_arranger rbac_get_address_roles rbac_get_role_validity + match fund_due_cashflows claim_due_cashflows transfer_set_schedule primary_distribution transfer account_suspension account_open account_update_payment_address account_get_position contract_config contract_schedule contract_execute_ied apply_non_cash_event append_observed_cash_event contract_get_state contract_get_next_due_event rbac_rotate_arranger rbac_set_op_daemon rbac_assign_role rbac_revoke_role rbac_contract_suspension rbac_contract_default rbac_get_arranger rbac_get_address_roles rbac_get_role_validity err main_create_NoOp@33: @@ -299,7 +294,7 @@ main_create_NoOp@33: err main_contract_update_route@4: - // modules/rbac.py:148 + // modules/rbac.py:150 // @arc4.abimethod(allow_actions=["UpdateApplication"]) txn OnCompletion pushint 4 // UpdateApplication @@ -327,9 +322,9 @@ ensure_budget_while_top@1: itxn_field TypeEnum pushint 5 // DeleteApplication itxn_field OnCompletion - bytec 48 // 0x068101 + bytec 47 // 0x068101 itxn_field ApprovalProgram - bytec 48 // 0x068101 + bytec 47 // 0x068101 itxn_field ClearStateProgram frame_dig -1 switch ensure_budget_switch_case_0@3 ensure_budget_switch_case_1@4 @@ -366,7 +361,7 @@ fund_due_cashflows: == assert // invalid number of bytes for arc4.uint64 btoi - // modules/actus_kernel.py:146 + // modules/actus_kernel.py:143 // assert self.status != UInt64(enums.STATUS_INACTIVE), err.NOT_CONFIGURED intc_0 // 0 bytec_1 // "status" @@ -382,7 +377,7 @@ fund_due_cashflows: // modules/payment_agent.py:70 // self._assert_is_not_asset_suspended() callsub _assert_is_not_asset_suspended - // modules/actus_kernel.py:138 + // modules/actus_kernel.py:135 // return self.status == UInt64(enums.STATUS_PENDING_IED) intc_0 // 0 bytec_1 // "status" @@ -390,7 +385,7 @@ fund_due_cashflows: assert // check self.status exists pushint 50 == - // modules/actus_kernel.py:150 + // modules/actus_kernel.py:147 // assert not self._status_is_pending_ied(), err.PENDING_IED ! assert // IED not yet executed @@ -492,10 +487,10 @@ fund_due_cashflows_while_top@4: getbyte dup bury 16 - // modules/actus_kernel.py:354 + // modules/actus_kernel.py:351 // UInt64(enums.EVT_IP), intc_2 // 8 - // modules/actus_kernel.py:353-357 + // modules/actus_kernel.py:350-354 // return event_type in ( // UInt64(enums.EVT_IP), // UInt64(enums.EVT_PR), @@ -506,10 +501,10 @@ fund_due_cashflows_while_top@4: bury 4 bnz fund_due_cashflows_bool_true@52 dig 14 - // modules/actus_kernel.py:355 + // modules/actus_kernel.py:352 // UInt64(enums.EVT_PR), pushint 3 - // modules/actus_kernel.py:353-357 + // modules/actus_kernel.py:350-354 // return event_type in ( // UInt64(enums.EVT_IP), // UInt64(enums.EVT_PR), @@ -518,10 +513,10 @@ fund_due_cashflows_while_top@4: == bnz fund_due_cashflows_bool_true@52 dig 14 - // modules/actus_kernel.py:356 + // modules/actus_kernel.py:353 // UInt64(enums.EVT_MD), pushint 19 - // modules/actus_kernel.py:353-357 + // modules/actus_kernel.py:350-354 // return event_type in ( // UInt64(enums.EVT_IP), // UInt64(enums.EVT_PR), @@ -537,7 +532,7 @@ fund_due_cashflows_bool_merge@54: // modules/payment_agent.py:92 // if not self._event_is_cash(entry.event_type.as_uint64()): bz fund_due_cashflows_after_while@11 - // modules/actus_kernel.py:551 + // modules/actus_kernel.py:548 // assert entry.event_id == self.event_cursor, err.INVALID_EVENT_CURSOR dig 15 intc_0 // 0 @@ -548,13 +543,13 @@ fund_due_cashflows_bool_merge@54: assert // check self.event_cursor exists == assert // Invalid event cursor - // modules/actus_kernel.py:552 + // modules/actus_kernel.py:549 // assert entry.scheduled_time <= Global.latest_timestamp, err.NO_DUE_CASHFLOW dig 1 global LatestTimestamp <= assert // No due cashflow to pay - // modules/actus_kernel.py:416 + // modules/actus_kernel.py:413 // if event_type not in (UInt64(enums.EVT_IP), UInt64(enums.EVT_MD)): dig 2 bnz fund_due_cashflows_after_if_else@15 @@ -562,20 +557,20 @@ fund_due_cashflows_bool_merge@54: pushint 19 == bnz fund_due_cashflows_after_if_else@15 - // modules/actus_kernel.py:417 + // modules/actus_kernel.py:414 // return UInt64(0) intc_0 // 0 bury 11 fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_interest_amount@16: - // modules/actus_kernel.py:429 + // modules/actus_kernel.py:426 // event_type = entry.event_type.as_uint64() dig 15 intc_2 // 8 getbyte dup bury 16 - // modules/actus_kernel.py:430 + // modules/actus_kernel.py:427 // if event_type not in (UInt64(enums.EVT_PR), UInt64(enums.EVT_MD)): pushint 3 == @@ -584,19 +579,19 @@ fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_i pushint 19 == bnz fund_due_cashflows_after_if_else@19 - // modules/actus_kernel.py:431 + // modules/actus_kernel.py:428 // return UInt64(0) intc_0 // 0 bury 6 fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@28: - // modules/actus_kernel.py:556 + // modules/actus_kernel.py:553 // next_outstanding_principal = entry.next_outstanding_principal dig 15 pushint 49 extract_uint64 bury 8 - // modules/actus_kernel.py:559 + // modules/actus_kernel.py:556 // if self._is_dynamic_annuity(): callsub _is_dynamic_annuity bnz fund_due_cashflows_if_body@29 @@ -604,37 +599,37 @@ fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_p bury 9 fund_due_cashflows_after_if_else@38: - // modules/actus_kernel.py:575-577 + // modules/actus_kernel.py:572-574 // # Funding uses per-unit cumulative indices so each holder can settle // # independently from its current unit balance. // interest_index_delta = self._amount_to_index_delta(interest_amount_due) dig 10 callsub _amount_to_index_delta - // modules/actus_kernel.py:578 + // modules/actus_kernel.py:575 // principal_index_delta = self._amount_to_index_delta(principal_amount_due) dig 6 callsub _amount_to_index_delta - // modules/actus_kernel.py:579 + // modules/actus_kernel.py:576 // interest_amount = self._index_delta_to_amount(interest_index_delta) dig 1 callsub _index_delta_to_amount dup cover 2 bury 15 - // modules/actus_kernel.py:580 + // modules/actus_kernel.py:577 // principal_amount = self._index_delta_to_amount(principal_index_delta) dup callsub _index_delta_to_amount dup bury 11 - // modules/actus_kernel.py:581 + // modules/actus_kernel.py:578 // required_amount = interest_amount + principal_amount dig 2 dig 1 + dup bury 9 - // modules/actus_kernel.py:737 + // modules/actus_kernel.py:734 // balance = self.settlement_asset_id.balance(Global.current_application_address) global CurrentApplicationAddress intc_0 // 0 @@ -643,7 +638,7 @@ fund_due_cashflows_after_if_else@38: assert // check self.settlement_asset_id exists asset_holding_get AssetBalance assert // account opted into asset - // modules/actus_kernel.py:459 + // modules/actus_kernel.py:456 // return self.reserved_interest + self.reserved_principal intc_0 // 0 bytec 15 // "reserved_interest" @@ -655,34 +650,34 @@ fund_due_cashflows_after_if_else@38: assert // check self.reserved_principal exists dig 1 + - // modules/actus_kernel.py:739 + // modules/actus_kernel.py:736 // assert balance >= reserved_total, err.NOT_ENOUGH_FUNDS dig 2 dig 1 >= assert // Not enough funds for the payment - // modules/actus_kernel.py:740 + // modules/actus_kernel.py:737 // return balance - reserved_total uncover 2 swap - - // modules/actus_kernel.py:583 + // modules/actus_kernel.py:580 // self._available_settlement_funds() >= required_amount uncover 2 >= - // modules/actus_kernel.py:582-584 + // modules/actus_kernel.py:579-581 // assert ( // self._available_settlement_funds() >= required_amount // ), err.NOT_ENOUGH_FUNDS assert // Not enough funds for the payment - // modules/actus_kernel.py:586 + // modules/actus_kernel.py:583 // self.reserved_interest += interest_amount uncover 3 + bytec 15 // "reserved_interest" swap app_global_put - // modules/actus_kernel.py:587 + // modules/actus_kernel.py:584 // self.reserved_principal += principal_amount intc_0 // 0 bytec 12 // "reserved_principal" @@ -692,7 +687,7 @@ fund_due_cashflows_after_if_else@38: bytec 12 // "reserved_principal" swap app_global_put - // modules/actus_kernel.py:588 + // modules/actus_kernel.py:585 // self.cumulative_interest_index += interest_index_delta intc_0 // 0 bytec 16 // "cumulative_interest_index" @@ -703,7 +698,7 @@ fund_due_cashflows_after_if_else@38: bytec 16 // "cumulative_interest_index" swap app_global_put - // modules/actus_kernel.py:589 + // modules/actus_kernel.py:586 // self.cumulative_principal_index += principal_index_delta intc_0 // 0 bytec 17 // "cumulative_principal_index" @@ -713,7 +708,7 @@ fund_due_cashflows_after_if_else@38: bytec 17 // "cumulative_principal_index" swap app_global_put - // modules/actus_kernel.py:590 + // modules/actus_kernel.py:587 // if entry.event_type.as_uint64() == UInt64(enums.EVT_PR): dig 15 intc_2 // 8 @@ -721,7 +716,7 @@ fund_due_cashflows_after_if_else@38: pushint 3 == bz fund_due_cashflows_else_body@40 - // modules/actus_kernel.py:591-592 + // modules/actus_kernel.py:588-589 // # For PR, the period interest stays accrued until a later IP or MD. // self.accrued_interest += self._entry_interest_segment(entry) intc_0 // 0 @@ -737,14 +732,14 @@ fund_due_cashflows_after_if_else@38: app_global_put fund_due_cashflows_after_if_else@41: - // modules/actus_kernel.py:595 + // modules/actus_kernel.py:592 // if not self._is_dynamic_annuity() or entry.event_type.as_uint64() == UInt64( callsub _is_dynamic_annuity bz fund_due_cashflows_if_body@43 dig 15 intc_2 // 8 getbyte - // modules/actus_kernel.py:595-597 + // modules/actus_kernel.py:592-594 // if not self._is_dynamic_annuity() or entry.event_type.as_uint64() == UInt64( // enums.EVT_MD // ): @@ -753,7 +748,7 @@ fund_due_cashflows_after_if_else@41: bz fund_due_cashflows_after_if_else@44 fund_due_cashflows_if_body@43: - // modules/actus_kernel.py:598 + // modules/actus_kernel.py:595 // self.next_principal_redemption = entry.next_principal_redemption dig 15 pushint 41 @@ -763,17 +758,17 @@ fund_due_cashflows_if_body@43: app_global_put fund_due_cashflows_after_if_else@44: - // modules/actus_kernel.py:599 + // modules/actus_kernel.py:596 // self.outstanding_principal = next_outstanding_principal bytec 4 // "outstanding_principal" dig 8 app_global_put - // modules/actus_kernel.py:600 + // modules/actus_kernel.py:597 // self.interest_calculation_base = next_interest_base bytec 7 // "interest_calculation_base" dig 9 app_global_put - // modules/actus_kernel.py:601 + // modules/actus_kernel.py:598 // self.event_cursor += UInt64(1) intc_0 // 0 bytec_2 // "event_cursor" @@ -784,41 +779,41 @@ fund_due_cashflows_after_if_else@44: bytec_2 // "event_cursor" swap app_global_put - // modules/actus_kernel.py:603 + // modules/actus_kernel.py:600 // if entry.event_type == arc4.UInt8( dig 15 extract 8 1 - // modules/actus_kernel.py:603-605 + // modules/actus_kernel.py:600-602 // if entry.event_type == arc4.UInt8( // enums.EVT_MD // ) and self.outstanding_principal == UInt64(0): pushbytes 0x13 b== bz fund_due_cashflows_after_if_else@47 - // modules/actus_kernel.py:605 + // modules/actus_kernel.py:602 // ) and self.outstanding_principal == UInt64(0): intc_0 // 0 bytec 4 // "outstanding_principal" app_global_get_ex assert // check self.outstanding_principal exists - // modules/actus_kernel.py:603-605 + // modules/actus_kernel.py:600-602 // if entry.event_type == arc4.UInt8( // enums.EVT_MD // ) and self.outstanding_principal == UInt64(0): bnz fund_due_cashflows_after_if_else@47 - // modules/actus_kernel.py:606 + // modules/actus_kernel.py:603 // self.status = UInt64(enums.STATUS_ENDED) bytec_1 // "status" pushint 200 app_global_put - // modules/actus_kernel.py:607 + // modules/actus_kernel.py:604 // self.interest_calculation_base = UInt64(0) bytec 7 // "interest_calculation_base" intc_0 // 0 app_global_put fund_due_cashflows_after_if_else@47: - // modules/actus_kernel.py:609-613 + // modules/actus_kernel.py:606-610 // self._emit_execution_event( // entry=entry, // payoff=interest_amount + principal_amount, @@ -850,7 +845,7 @@ fund_due_cashflows_after_if_else@47: b fund_due_cashflows_while_top@4 fund_due_cashflows_else_body@40: - // modules/actus_kernel.py:594 + // modules/actus_kernel.py:591 // self.accrued_interest = UInt64(0) bytec 6 // "accrued_interest" intc_0 // 0 @@ -858,21 +853,21 @@ fund_due_cashflows_else_body@40: b fund_due_cashflows_after_if_else@41 fund_due_cashflows_if_body@29: - // modules/actus_kernel.py:560 + // modules/actus_kernel.py:557 // event_type = entry.event_type.as_uint64() dig 15 intc_2 // 8 getbyte dup bury 16 - // modules/actus_kernel.py:561-563 + // modules/actus_kernel.py:558-560 // # Dynamic annuities derive next state from the payment decomposition, // # not only from the precomputed `next_*` fields. // if event_type == UInt64(enums.EVT_PR): pushint 3 == bz fund_due_cashflows_else_body@31 - // modules/actus_kernel.py:565 + // modules/actus_kernel.py:562 // self.outstanding_principal - principal_amount_due intc_0 // 0 bytec 4 // "outstanding_principal" @@ -886,13 +881,13 @@ fund_due_cashflows_if_body@29: b fund_due_cashflows_after_if_else@38 fund_due_cashflows_else_body@31: - // modules/actus_kernel.py:568 + // modules/actus_kernel.py:565 // elif event_type == UInt64(enums.EVT_IP): dig 14 intc_2 // 8 == bz fund_due_cashflows_else_body@33 - // modules/actus_kernel.py:569 + // modules/actus_kernel.py:566 // next_outstanding_principal = self.outstanding_principal intc_0 // 0 bytec 4 // "outstanding_principal" @@ -900,7 +895,7 @@ fund_due_cashflows_else_body@31: swap bury 9 assert // check self.outstanding_principal exists - // modules/actus_kernel.py:570 + // modules/actus_kernel.py:567 // next_interest_base = self.interest_calculation_base intc_0 // 0 bytec 7 // "interest_calculation_base" @@ -911,7 +906,7 @@ fund_due_cashflows_else_body@31: b fund_due_cashflows_after_if_else@38 fund_due_cashflows_else_body@33: - // modules/actus_kernel.py:571 + // modules/actus_kernel.py:568 // elif event_type == UInt64(enums.EVT_MD): dig 14 pushint 19 @@ -922,40 +917,40 @@ fund_due_cashflows_else_body@33: b fund_due_cashflows_after_if_else@38 fund_due_cashflows_if_body@34: - // modules/actus_kernel.py:572 + // modules/actus_kernel.py:569 // next_outstanding_principal = UInt64(0) intc_0 // 0 bury 8 - // modules/actus_kernel.py:573 + // modules/actus_kernel.py:570 // next_interest_base = UInt64(0) intc_0 // 0 bury 9 b fund_due_cashflows_after_if_else@38 fund_due_cashflows_after_if_else@19: - // modules/actus_kernel.py:432 + // modules/actus_kernel.py:429 // if self._is_dynamic_annuity(): callsub _is_dynamic_annuity bz fund_due_cashflows_after_if_else@27 - // modules/actus_kernel.py:433 + // modules/actus_kernel.py:430 // if event_type == UInt64(enums.EVT_MD): dig 14 pushint 19 == bz fund_due_cashflows_after_if_else@22 - // modules/actus_kernel.py:434 + // modules/actus_kernel.py:431 // return self.outstanding_principal intc_0 // 0 bytec 4 // "outstanding_principal" app_global_get_ex assert // check self.outstanding_principal exists bury 6 - // modules/actus_kernel.py:555 + // modules/actus_kernel.py:552 // principal_amount_due = self._entry_principal_amount(entry) b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@28 fund_due_cashflows_after_if_else@22: - // modules/actus_kernel.py:435 + // modules/actus_kernel.py:432 // interest_due = self.accrued_interest + self._entry_interest_segment(entry) intc_0 // 0 bytec 6 // "accrued_interest" @@ -967,7 +962,7 @@ fund_due_cashflows_after_if_else@22: + dup bury 11 - // modules/actus_kernel.py:436 + // modules/actus_kernel.py:433 // if self.next_principal_redemption <= interest_due: intc_0 // 0 bytec 14 // "next_principal_redemption" @@ -975,16 +970,16 @@ fund_due_cashflows_after_if_else@22: assert // check self.next_principal_redemption exists >= bz fund_due_cashflows_after_if_else@24 - // modules/actus_kernel.py:437 + // modules/actus_kernel.py:434 // return UInt64(0) intc_0 // 0 bury 6 - // modules/actus_kernel.py:555 + // modules/actus_kernel.py:552 // principal_amount_due = self._entry_principal_amount(entry) b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@28 fund_due_cashflows_after_if_else@24: - // modules/actus_kernel.py:438 + // modules/actus_kernel.py:435 // principal_amount = self.next_principal_redemption - interest_due intc_0 // 0 bytec 14 // "next_principal_redemption" @@ -994,7 +989,7 @@ fund_due_cashflows_after_if_else@24: - dup bury 8 - // modules/actus_kernel.py:439 + // modules/actus_kernel.py:436 // if principal_amount > self.outstanding_principal: intc_0 // 0 bytec 4 // "outstanding_principal" @@ -1002,26 +997,26 @@ fund_due_cashflows_after_if_else@24: assert // check self.outstanding_principal exists > bz fund_due_cashflows_after_if_else@26 - // modules/actus_kernel.py:440 + // modules/actus_kernel.py:437 // return self.outstanding_principal intc_0 // 0 bytec 4 // "outstanding_principal" app_global_get_ex assert // check self.outstanding_principal exists bury 6 - // modules/actus_kernel.py:555 + // modules/actus_kernel.py:552 // principal_amount_due = self._entry_principal_amount(entry) b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@28 fund_due_cashflows_after_if_else@26: dig 6 bury 6 - // modules/actus_kernel.py:555 + // modules/actus_kernel.py:552 // principal_amount_due = self._entry_principal_amount(entry) b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@28 fund_due_cashflows_after_if_else@27: - // modules/actus_kernel.py:443 + // modules/actus_kernel.py:440 // entry.next_outstanding_principal <= self.outstanding_principal dig 15 pushint 49 @@ -1032,22 +1027,22 @@ fund_due_cashflows_after_if_else@27: assert // check self.outstanding_principal exists dup2 <= - // modules/actus_kernel.py:442-444 + // modules/actus_kernel.py:439-441 // assert ( // entry.next_outstanding_principal <= self.outstanding_principal // ), err.INVALID_ACTUS_CONFIG assert // Invalid ACTUS configuration - // modules/actus_kernel.py:445 + // modules/actus_kernel.py:442 // return self.outstanding_principal - entry.next_outstanding_principal swap - bury 6 - // modules/actus_kernel.py:555 + // modules/actus_kernel.py:552 // principal_amount_due = self._entry_principal_amount(entry) b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@28 fund_due_cashflows_after_if_else@15: - // modules/actus_kernel.py:418 + // modules/actus_kernel.py:415 // return self.accrued_interest + self._entry_interest_segment(entry) intc_0 // 0 bytec 6 // "accrued_interest" @@ -1058,7 +1053,7 @@ fund_due_cashflows_after_if_else@15: bury 18 + bury 11 - // modules/actus_kernel.py:554 + // modules/actus_kernel.py:551 // interest_amount_due = self._entry_interest_amount(entry) b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_interest_amount@16 @@ -1139,7 +1134,7 @@ claim_due_cashflows: assert // invalid number of bytes for arc4.dynamic_array extract 2 0 swap - // modules/actus_kernel.py:146 + // modules/actus_kernel.py:143 // assert self.status != UInt64(enums.STATUS_INACTIVE), err.NOT_CONFIGURED intc_0 // 0 bytec_1 // "status" @@ -1220,7 +1215,7 @@ claim_due_cashflows_after_if_else@17: // modules/payment_agent.py:140 // self._assert_is_not_asset_suspended() callsub _assert_is_not_asset_suspended - // modules/actus_kernel.py:138 + // modules/actus_kernel.py:135 // return self.status == UInt64(enums.STATUS_PENDING_IED) intc_0 // 0 bytec_1 // "status" @@ -1228,7 +1223,7 @@ claim_due_cashflows_after_if_else@17: assert // check self.status exists pushint 50 == - // modules/actus_kernel.py:150 + // modules/actus_kernel.py:147 // assert not self._status_is_pending_ied(), err.PENDING_IED ! assert // IED not yet executed @@ -1570,14 +1565,14 @@ primary_distribution: btoi dup cover 2 - // modules/actus_kernel.py:146 + // modules/actus_kernel.py:143 // assert self.status != UInt64(enums.STATUS_INACTIVE), err.NOT_CONFIGURED intc_0 // 0 bytec_1 // "status" app_global_get_ex assert // check self.status exists assert // D-ASA not configured - // modules/rbac.py:71 + // modules/rbac.py:73 // assert self._role_is_active(self.primary_dealer, Txn.sender), err.UNAUTHORIZED bytec 22 // 0x523a50594423 txn Sender @@ -1589,7 +1584,7 @@ primary_distribution: // modules/transfer_agent.py:77 // self._assert_is_not_asset_suspended() callsub _assert_is_not_asset_suspended - // modules/actus_kernel.py:138 + // modules/actus_kernel.py:135 // return self.status == UInt64(enums.STATUS_PENDING_IED) intc_0 // 0 bytec_1 // "status" @@ -1726,7 +1721,7 @@ transfer: == assert // invalid number of bytes for arc4.uint64 btoi - // modules/actus_kernel.py:146 + // modules/actus_kernel.py:143 // assert self.status != UInt64(enums.STATUS_INACTIVE), err.NOT_CONFIGURED intc_0 // 0 bytec_1 // "status" @@ -1739,7 +1734,7 @@ transfer: // modules/transfer_agent.py:131 // self._assert_is_not_asset_suspended() callsub _assert_is_not_asset_suspended - // modules/actus_kernel.py:138 + // modules/actus_kernel.py:135 // return self.status == UInt64(enums.STATUS_PENDING_IED) intc_0 // 0 bytec_1 // "status" @@ -1747,7 +1742,7 @@ transfer: assert // check self.status exists pushint 50 == - // modules/actus_kernel.py:150 + // modules/actus_kernel.py:147 // assert not self._status_is_pending_ied(), err.PENDING_IED ! assert // IED not yet executed @@ -1851,7 +1846,7 @@ transfer_after_if_else@5: extract_uint64 <= assert // Insufficient sender units to transfer - // modules/actus_kernel.py:766 + // modules/actus_kernel.py:763 // if self.event_cursor >= self.schedule_entry_count: intc_0 // 0 bytec_2 // "event_cursor" @@ -1863,20 +1858,20 @@ transfer_after_if_else@5: assert // check self.schedule_entry_count exists >= bnz transfer_after_inlined_modules.actus_kernel.ActusKernelModule._assert_no_due_event_pending@10 - // modules/actus_kernel.py:768 + // modules/actus_kernel.py:765 // next_entry = self._get_schedule_entry(self.event_cursor) intc_0 // 0 bytec_2 // "event_cursor" app_global_get_ex assert // check self.event_cursor exists callsub _get_schedule_entry - // modules/actus_kernel.py:770 + // modules/actus_kernel.py:767 // next_entry.scheduled_time > Global.latest_timestamp pushint 9 extract_uint64 global LatestTimestamp > - // modules/actus_kernel.py:769-771 + // modules/actus_kernel.py:766-768 // assert ( // next_entry.scheduled_time > Global.latest_timestamp // ), err.PENDING_ACTUS_EVENT @@ -1967,7 +1962,7 @@ account_suspension: assert // invalid number of bytes for arc4.bool intc_0 // 0 getbit - // modules/rbac.py:77 + // modules/rbac.py:79 // assert self._role_is_active(self.authority, Txn.sender), err.UNAUTHORIZED bytec 21 // 0x523a41555423 txn Sender @@ -2024,13 +2019,13 @@ account_open: intc_3 // 32 == assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:68 + // modules/rbac.py:70 // assert self._role_is_active(self.account_manager, Txn.sender), err.UNAUTHORIZED bytec 23 // 0x523a4d4e4723 txn Sender callsub _role_is_active assert // Not authorized - // modules/actus_kernel.py:142 + // modules/actus_kernel.py:139 // return self.status == UInt64(enums.STATUS_ENDED) intc_0 // 0 bytec_1 // "status" @@ -2079,7 +2074,7 @@ account_open: concat dig 1 concat - bytec 40 // 0x00 + bytec 41 // 0x00 concat dig 1 concat @@ -2199,7 +2194,7 @@ account_get_position: // modules.actus_kernel.ActusKernelModule.contract_create[routing]() -> void: contract_create: - // modules/actus_kernel.py:1022 + // modules/actus_kernel.py:1019 // @arc4.abimethod(create="require") txna ApplicationArgs 1 dup @@ -2207,15 +2202,15 @@ contract_create: intc_3 // 32 == assert // invalid number of bytes for arc4.static_array - // modules/actus_kernel.py:1036 + // modules/actus_kernel.py:1033 // self.arranger.value = arranger bytec 18 // 0x523a41525223 swap app_global_put - // modules/actus_kernel.py:1037 + // modules/actus_kernel.py:1034 // return Global.latest_timestamp global LatestTimestamp - // modules/actus_kernel.py:1022 + // modules/actus_kernel.py:1019 // @arc4.abimethod(create="require") itob bytec_0 // 0x151f7c75 @@ -2230,7 +2225,7 @@ contract_create: contract_config: pushbytes "" dup - // modules/actus_kernel.py:1039 + // modules/actus_kernel.py:1036 // @arc4.abimethod txna ApplicationArgs 1 dupn 2 @@ -2269,10 +2264,10 @@ contract_config: + == assert // invalid number of bytes for smart_contracts.abi_types.Prospectus - // modules/actus_kernel.py:1069 + // modules/actus_kernel.py:1066 // self._assert_caller_is_arranger() callsub _assert_caller_is_arranger - // modules/actus_kernel.py:1071-1072 + // modules/actus_kernel.py:1068-1069 // # Configure Contract // self.contract_type = terms.contract_type.as_uint64() intc_0 // 0 @@ -2281,7 +2276,7 @@ contract_config: bytec 10 // "contract_type" dig 1 app_global_put - // modules/actus_kernel.py:221-228 + // modules/actus_kernel.py:218-225 // return contract_type in ( // UInt64(enums.CT_PAM), // UInt64(enums.CT_ANN), @@ -2292,10 +2287,10 @@ contract_config: // ) bz contract_config_bool_true@7 dup - // modules/actus_kernel.py:223 + // modules/actus_kernel.py:220 // UInt64(enums.CT_ANN), intc_1 // 1 - // modules/actus_kernel.py:221-228 + // modules/actus_kernel.py:218-225 // return contract_type in ( // UInt64(enums.CT_PAM), // UInt64(enums.CT_ANN), @@ -2307,10 +2302,10 @@ contract_config: == bnz contract_config_bool_true@7 dup - // modules/actus_kernel.py:224 + // modules/actus_kernel.py:221 // UInt64(enums.CT_NAM), pushint 2 - // modules/actus_kernel.py:221-228 + // modules/actus_kernel.py:218-225 // return contract_type in ( // UInt64(enums.CT_PAM), // UInt64(enums.CT_ANN), @@ -2322,10 +2317,10 @@ contract_config: == bnz contract_config_bool_true@7 dup - // modules/actus_kernel.py:225 + // modules/actus_kernel.py:222 // UInt64(enums.CT_LAM), pushint 3 - // modules/actus_kernel.py:221-228 + // modules/actus_kernel.py:218-225 // return contract_type in ( // UInt64(enums.CT_PAM), // UInt64(enums.CT_ANN), @@ -2337,10 +2332,10 @@ contract_config: == bnz contract_config_bool_true@7 dup - // modules/actus_kernel.py:226 + // modules/actus_kernel.py:223 // UInt64(enums.CT_LAX), pushint 4 - // modules/actus_kernel.py:221-228 + // modules/actus_kernel.py:218-225 // return contract_type in ( // UInt64(enums.CT_PAM), // UInt64(enums.CT_ANN), @@ -2352,10 +2347,10 @@ contract_config: == bnz contract_config_bool_true@7 dup - // modules/actus_kernel.py:227 + // modules/actus_kernel.py:224 // UInt64(enums.CT_CLM), pushint 5 - // modules/actus_kernel.py:221-228 + // modules/actus_kernel.py:218-225 // return contract_type in ( // UInt64(enums.CT_PAM), // UInt64(enums.CT_ANN), @@ -2371,10 +2366,10 @@ contract_config_bool_true@7: intc_1 // 1 contract_config_bool_merge@9: - // modules/actus_kernel.py:232 + // modules/actus_kernel.py:229 // assert self._is_supported_contract_type(contract_type), err.INVALID_ACTUS_CONFIG assert // Invalid ACTUS configuration - // modules/actus_kernel.py:1074 + // modules/actus_kernel.py:1071 // self._store_contract_config(self.contract_type, terms, initial_state) intc_0 // 0 bytec 10 // "contract_type" @@ -2382,7 +2377,7 @@ contract_config_bool_merge@9: swap bury 2 assert // check self.contract_type exists - // modules/actus_kernel.py:328 + // modules/actus_kernel.py:325 // assert terms.initial_exchange_amount > UInt64(0), err.INVALID_ACTUS_CONFIG dig 4 dup @@ -2391,13 +2386,13 @@ contract_config_bool_merge@9: dup bury 8 assert // Invalid ACTUS configuration - // modules/actus_kernel.py:330 + // modules/actus_kernel.py:327 // terms.day_count_convention.as_uint64() pushint 57 getbyte dup bury 8 - // modules/actus_kernel.py:300-306 + // modules/actus_kernel.py:297-303 // return day_count_convention in ( // UInt64(enums.DCC_AA), // UInt64(enums.DCC_A360), @@ -2407,10 +2402,10 @@ contract_config_bool_merge@9: // ) bz contract_config_bool_true@16 dig 6 - // modules/actus_kernel.py:302 + // modules/actus_kernel.py:299 // UInt64(enums.DCC_A360), intc_1 // 1 - // modules/actus_kernel.py:300-306 + // modules/actus_kernel.py:297-303 // return day_count_convention in ( // UInt64(enums.DCC_AA), // UInt64(enums.DCC_A360), @@ -2421,10 +2416,10 @@ contract_config_bool_merge@9: == bnz contract_config_bool_true@16 dig 6 - // modules/actus_kernel.py:303 + // modules/actus_kernel.py:300 // UInt64(enums.DCC_A365), pushint 2 - // modules/actus_kernel.py:300-306 + // modules/actus_kernel.py:297-303 // return day_count_convention in ( // UInt64(enums.DCC_AA), // UInt64(enums.DCC_A360), @@ -2435,10 +2430,10 @@ contract_config_bool_merge@9: == bnz contract_config_bool_true@16 dig 6 - // modules/actus_kernel.py:304 + // modules/actus_kernel.py:301 // UInt64(enums.DCC_30E360ISDA), pushint 3 - // modules/actus_kernel.py:300-306 + // modules/actus_kernel.py:297-303 // return day_count_convention in ( // UInt64(enums.DCC_AA), // UInt64(enums.DCC_A360), @@ -2449,10 +2444,10 @@ contract_config_bool_merge@9: == bnz contract_config_bool_true@16 dig 6 - // modules/actus_kernel.py:305 + // modules/actus_kernel.py:302 // UInt64(enums.DCC_30E360), pushint 4 - // modules/actus_kernel.py:300-306 + // modules/actus_kernel.py:297-303 // return day_count_convention in ( // UInt64(enums.DCC_AA), // UInt64(enums.DCC_A360), @@ -2467,18 +2462,18 @@ contract_config_bool_true@16: intc_1 // 1 contract_config_bool_merge@18: - // modules/actus_kernel.py:312-314 + // modules/actus_kernel.py:309-311 // assert self._is_supported_day_count_convention( // day_count_convention // ), err.INVALID_DAY_COUNT_CONVENTION assert // Invalid day-count convention ID - // modules/actus_kernel.py:332 + // modules/actus_kernel.py:329 // if contract_type != UInt64(enums.CT_ANN): dup intc_1 // 1 != bz contract_config_after_if_else@20 - // modules/actus_kernel.py:333 + // modules/actus_kernel.py:330 // assert not terms.dynamic_principal_redemption, err.INVALID_ACTUS_CONFIG dig 4 pushint 786 @@ -2487,7 +2482,7 @@ contract_config_bool_merge@18: assert // Invalid ACTUS configuration contract_config_after_if_else@20: - // modules/actus_kernel.py:810 + // modules/actus_kernel.py:807 // assert self.status == UInt64(enums.STATUS_INACTIVE), err.ALREADY_CONFIGURED intc_0 // 0 bytec_1 // "status" @@ -2495,7 +2490,7 @@ contract_config_after_if_else@20: assert // check self.status exists ! assert // D-ASA already configured - // modules/actus_kernel.py:811 + // modules/actus_kernel.py:808 // assert self.initial_exchange_amount == UInt64(0), err.ALREADY_CONFIGURED intc_0 // 0 bytec 20 // "initial_exchange_amount" @@ -2503,50 +2498,50 @@ contract_config_after_if_else@20: assert // check self.initial_exchange_amount exists ! assert // D-ASA already configured - // modules/actus_kernel.py:813-814 + // modules/actus_kernel.py:810-811 // # Set Denomination Asset // self._assert_denomination_asset(terms.denomination_asset_id) dig 4 dup intc_1 // 1 extract_uint64 - // modules/actus_kernel.py:778-779 + // modules/actus_kernel.py:775-776 // # The reference implementation has on-chain denomination with ASA // _creator, exists = op.AssetParamsGet.asset_creator(denomination_asset_id) dup asset_params_get AssetCreator bury 1 - // modules/actus_kernel.py:780 + // modules/actus_kernel.py:777 // assert exists, err.INVALID_DENOMINATION assert // Denomination asset is not properly set - // modules/actus_kernel.py:783 + // modules/actus_kernel.py:780 // self.denomination_asset_id = denomination_asset_id bytec 44 // "denomination_asset_id" dig 1 app_global_put - // modules/actus_kernel.py:817-818 + // modules/actus_kernel.py:814-815 // # Set Settlement Asset // self._assert_settlement_asset(terms.settlement_asset_id) dig 1 pushint 9 extract_uint64 - // modules/actus_kernel.py:788 + // modules/actus_kernel.py:785 // settlement_asset_id == self.denomination_asset_id dup uncover 2 == - // modules/actus_kernel.py:786-789 + // modules/actus_kernel.py:783-786 // # The reference implementation settlement asset is the denomination asset // assert ( // settlement_asset_id == self.denomination_asset_id // ), err.INVALID_SETTLEMENT_ASSET assert // Different settlement asset not supported, must be equal to denomination asset - // modules/actus_kernel.py:792 + // modules/actus_kernel.py:789 // self.settlement_asset_id = settlement_asset_id bytec 19 // "settlement_asset_id" dig 1 app_global_put - // modules/actus_kernel.py:793-799 + // modules/actus_kernel.py:790-796 // # The reference implementation has on-chain settlement with ASA // itxn.AssetTransfer( // xfer_asset=self.settlement_asset_id, @@ -2555,26 +2550,26 @@ contract_config_after_if_else@20: // fee=Global.min_txn_fee, // ).submit() itxn_begin - // modules/actus_kernel.py:798 + // modules/actus_kernel.py:795 // fee=Global.min_txn_fee, global MinTxnFee - // modules/actus_kernel.py:796 + // modules/actus_kernel.py:793 // asset_receiver=Global.current_application_address, global CurrentApplicationAddress - // modules/actus_kernel.py:797 + // modules/actus_kernel.py:794 // asset_amount=0, intc_0 // 0 itxn_field AssetAmount itxn_field AssetReceiver swap itxn_field XferAsset - // modules/actus_kernel.py:793-794 + // modules/actus_kernel.py:790-791 // # The reference implementation has on-chain settlement with ASA // itxn.AssetTransfer( pushint 4 // axfer itxn_field TypeEnum itxn_field Fee - // modules/actus_kernel.py:793-799 + // modules/actus_kernel.py:790-796 // # The reference implementation has on-chain settlement with ASA // itxn.AssetTransfer( // xfer_asset=self.settlement_asset_id, @@ -2583,7 +2578,7 @@ contract_config_after_if_else@20: // fee=Global.min_txn_fee, // ).submit() itxn_submit - // modules/actus_kernel.py:821-822 + // modules/actus_kernel.py:818-819 // # Units // self.total_units = terms.total_units dup @@ -2592,18 +2587,18 @@ contract_config_after_if_else@20: bytec 13 // "total_units" swap app_global_put - // modules/actus_kernel.py:823 + // modules/actus_kernel.py:820 // self.reserved_units_total = UInt64(0) bytec 11 // "reserved_units_total" intc_0 // 0 app_global_put - // modules/actus_kernel.py:825-826 + // modules/actus_kernel.py:822-823 // # Day-Count Conventions // self.day_count_convention = terms.day_count_convention.as_uint64() bytec 46 // "day_count_convention" dig 8 app_global_put - // modules/actus_kernel.py:828-829 + // modules/actus_kernel.py:825-826 // # Time // self.initial_exchange_date = terms.initial_exchange_date dup @@ -2612,7 +2607,7 @@ contract_config_after_if_else@20: bytec 28 // "initial_exchange_date" dig 1 app_global_put - // modules/actus_kernel.py:830 + // modules/actus_kernel.py:827 // self.maturity_date = terms.maturity_date dig 1 pushint 49 @@ -2620,7 +2615,7 @@ contract_config_after_if_else@20: bytec 45 // "maturity_date" dig 1 app_global_put - // modules/actus_kernel.py:831 + // modules/actus_kernel.py:828 // self.next_principal_redemption = initial_state.next_principal_redemption dig 6 dup @@ -2630,21 +2625,21 @@ contract_config_after_if_else@20: bytec 14 // "next_principal_redemption" swap app_global_put - // modules/actus_kernel.py:833-834 + // modules/actus_kernel.py:830-831 // # Principal // self.initial_exchange_amount = terms.initial_exchange_amount bytec 20 // "initial_exchange_amount" dig 10 app_global_put - // modules/actus_kernel.py:835 + // modules/actus_kernel.py:832 // self.dynamic_principal_redemption = terms.dynamic_principal_redemption dig 3 pushint 786 getbit - bytec 34 // "dynamic_principal_redemption" + bytec 35 // "dynamic_principal_redemption" swap app_global_put - // modules/actus_kernel.py:836 + // modules/actus_kernel.py:833 // self.outstanding_principal = initial_state.outstanding_principal dig 1 pushint 16 @@ -2652,7 +2647,7 @@ contract_config_after_if_else@20: bytec 4 // "outstanding_principal" swap app_global_put - // modules/actus_kernel.py:838-839 + // modules/actus_kernel.py:835-836 // # Interest // self.accrued_interest = initial_state.accrued_interest dig 1 @@ -2661,7 +2656,7 @@ contract_config_after_if_else@20: bytec 6 // "accrued_interest" swap app_global_put - // modules/actus_kernel.py:841-842 + // modules/actus_kernel.py:838-839 // # Interest Rate // self.nominal_interest_rate = initial_state.nominal_interest_rate dig 1 @@ -2670,7 +2665,7 @@ contract_config_after_if_else@20: bytec 9 // "nominal_interest_rate" swap app_global_put - // modules/actus_kernel.py:843 + // modules/actus_kernel.py:840 // self.interest_calculation_base = initial_state.interest_calculation_base dig 1 pushint 24 @@ -2678,23 +2673,23 @@ contract_config_after_if_else@20: bytec 7 // "interest_calculation_base" swap app_global_put - // modules/actus_kernel.py:844 + // modules/actus_kernel.py:841 // self.rate_reset_spread = terms.rate_reset_spread dig 3 pushint 58 extract_uint64 - bytec 35 // "rate_reset_spread" + bytec 36 // "rate_reset_spread" swap app_global_put - // modules/actus_kernel.py:845 + // modules/actus_kernel.py:842 // self.rate_reset_multiplier = terms.rate_reset_multiplier dig 3 pushint 66 extract_uint64 - bytec 36 // "rate_reset_multiplier" + bytec 37 // "rate_reset_multiplier" swap app_global_put - // modules/actus_kernel.py:846 + // modules/actus_kernel.py:843 // self.rate_reset_floor = terms.rate_reset_floor dig 3 pushint 74 @@ -2702,7 +2697,7 @@ contract_config_after_if_else@20: bytec 31 // "rate_reset_floor" swap app_global_put - // modules/actus_kernel.py:847 + // modules/actus_kernel.py:844 // self.rate_reset_cap = terms.rate_reset_cap dig 3 pushint 82 @@ -2710,31 +2705,31 @@ contract_config_after_if_else@20: bytec 32 // "rate_reset_cap" swap app_global_put - // modules/actus_kernel.py:848 + // modules/actus_kernel.py:845 // self.rate_reset_next = terms.rate_reset_next dig 3 pushint 90 extract_uint64 - bytec 37 // "rate_reset_next" + bytec 38 // "rate_reset_next" swap app_global_put - // modules/actus_kernel.py:849 + // modules/actus_kernel.py:846 // self.has_rate_reset_floor = terms.has_rate_reset_floor dig 3 pushint 784 getbit - bytec 38 // "has_rate_reset_floor" + bytec 39 // "has_rate_reset_floor" swap app_global_put - // modules/actus_kernel.py:850 + // modules/actus_kernel.py:847 // self.has_rate_reset_cap = terms.has_rate_reset_cap dig 3 pushint 785 getbit - bytec 39 // "has_rate_reset_cap" + bytec 40 // "has_rate_reset_cap" swap app_global_put - // modules/actus_kernel.py:852-853 + // modules/actus_kernel.py:849-850 // # Scaling // self.fixed_point_scale = terms.fixed_point_scale uncover 3 @@ -2743,7 +2738,7 @@ contract_config_after_if_else@20: bytec 5 // "fixed_point_scale" swap app_global_put - // modules/actus_kernel.py:855-856 + // modules/actus_kernel.py:852-853 // # Schedule Processing // self.event_cursor = initial_state.event_cursor dig 1 @@ -2752,7 +2747,7 @@ contract_config_after_if_else@20: bytec_2 // "event_cursor" swap app_global_put - // modules/actus_kernel.py:858-859 + // modules/actus_kernel.py:855-856 // # Per-Unit Fixed-Point Indexes // self.cumulative_interest_index = initial_state.cumulative_interest_index dig 1 @@ -2761,7 +2756,7 @@ contract_config_after_if_else@20: bytec 16 // "cumulative_interest_index" swap app_global_put - // modules/actus_kernel.py:860 + // modules/actus_kernel.py:857 // self.cumulative_principal_index = initial_state.cumulative_principal_index dig 1 pushint 64 @@ -2769,24 +2764,24 @@ contract_config_after_if_else@20: bytec 17 // "cumulative_principal_index" swap app_global_put - // modules/actus_kernel.py:862-863 + // modules/actus_kernel.py:859-860 // # Reserved Amount (for executed cashflows) // self.reserved_interest = UInt64(0) bytec 15 // "reserved_interest" intc_0 // 0 app_global_put - // modules/actus_kernel.py:864 + // modules/actus_kernel.py:861 // self.reserved_principal = UInt64(0) bytec 12 // "reserved_principal" intc_0 // 0 app_global_put - // modules/actus_kernel.py:866 + // modules/actus_kernel.py:863 // assert terms.initial_exchange_date > Global.latest_timestamp, err.INVALID_IED dig 2 global LatestTimestamp > assert // IED must be set in the future - // modules/actus_kernel.py:867 + // modules/actus_kernel.py:864 // assert terms.initial_exchange_date > initial_state.status_date, err.INVALID_IED swap intc_0 // 0 @@ -2794,11 +2789,11 @@ contract_config_after_if_else@20: dig 2 < assert // IED must be set in the future - // modules/actus_kernel.py:868 + // modules/actus_kernel.py:865 // assert terms.initial_exchange_date < terms.maturity_date, err.INVALID_IED < assert // IED must be set in the future - // modules/actus_kernel.py:1076-1077 + // modules/actus_kernel.py:1073-1074 // # Notarize prospectus (optional) // self.prospectus_hash = prospectus.hash.bytes dig 2 @@ -2806,17 +2801,17 @@ contract_config_after_if_else@20: bytec 42 // "prospectus_hash" swap app_global_put - // modules/actus_kernel.py:1078 + // modules/actus_kernel.py:1075 // self.prospectus_url = prospectus.url dig 1 extract 2 0 bytec 43 // "prospectus_url" swap app_global_put - // modules/actus_kernel.py:1079 + // modules/actus_kernel.py:1076 // return Global.latest_timestamp global LatestTimestamp - // modules/actus_kernel.py:1039 + // modules/actus_kernel.py:1036 // @arc4.abimethod itob bytec_0 // 0x151f7c75 @@ -2840,7 +2835,7 @@ contract_schedule: intc_0 // 0 pushbytes "" dupn 2 - // modules/actus_kernel.py:1081 + // modules/actus_kernel.py:1078 // @arc4.abimethod txna ApplicationArgs 1 dup @@ -2876,10 +2871,10 @@ contract_schedule: len == assert // invalid number of bytes for arc4.dynamic_array - // modules/actus_kernel.py:1113 + // modules/actus_kernel.py:1110 // self._assert_caller_is_arranger() callsub _assert_caller_is_arranger - // modules/actus_kernel.py:1116 + // modules/actus_kernel.py:1113 // contract_type=self.contract_type, intc_0 // 0 bytec 10 // "contract_type" @@ -2887,7 +2882,7 @@ contract_schedule: swap cover 3 assert // check self.contract_type exists - // modules/actus_kernel.py:884 + // modules/actus_kernel.py:881 // assert self.status == UInt64(enums.STATUS_INACTIVE), err.ALREADY_CONFIGURED intc_0 // 0 bytec_1 // "status" @@ -2895,7 +2890,7 @@ contract_schedule: assert // check self.status exists ! assert // D-ASA already configured - // modules/actus_kernel.py:885-887 + // modules/actus_kernel.py:882-884 // assert schedule_page.length <= UInt64( // cst.SCHEDULE_PAGE_SIZE // ), err.INVALID_SCHEDULE_PAGE @@ -2903,31 +2898,31 @@ contract_schedule: pushint 16 <= assert // Invalid schedule page - // modules/actus_kernel.py:888 + // modules/actus_kernel.py:885 // assert self.initial_exchange_amount > UInt64(0), err.TERMS_NOT_CONFIGURED intc_0 // 0 bytec 20 // "initial_exchange_amount" app_global_get_ex assert // check self.initial_exchange_amount exists assert // D-ASA terms not configured - // modules/actus_kernel.py:890 + // modules/actus_kernel.py:887 // page_cursor = schedule_page_index * UInt64(cst.SCHEDULE_PAGE_SIZE) swap pushint 16 * swap - // modules/actus_kernel.py:897 + // modules/actus_kernel.py:894 // + page_length * UInt64(cst.OP_UP_CONTRACT_CONFIG_PER_ENTRY_BUDGET) pushint 100 * - // modules/actus_kernel.py:896 + // modules/actus_kernel.py:893 // UInt64(cst.OP_UP_CONTRACT_CONFIG_BASE_BUDGET) intc 4 // 1500 - // modules/actus_kernel.py:896-897 + // modules/actus_kernel.py:893-894 // UInt64(cst.OP_UP_CONTRACT_CONFIG_BASE_BUDGET) // + page_length * UInt64(cst.OP_UP_CONTRACT_CONFIG_PER_ENTRY_BUDGET) + - // modules/actus_kernel.py:892-899 + // modules/actus_kernel.py:889-896 // # Validation cost grows with page length, so configuration explicitly // # buys extra opcode budget for larger uploads. // ensure_budget( @@ -2938,18 +2933,18 @@ contract_schedule: // ) intc_0 // 0 callsub ensure_budget - // modules/actus_kernel.py:900 + // modules/actus_kernel.py:897 // index = UInt64(0) intc_0 // 0 contract_schedule_while_top@2: - // modules/actus_kernel.py:901 + // modules/actus_kernel.py:898 // while index < page_length: dup dig 4 < bz contract_schedule_after_while@11 - // modules/actus_kernel.py:902-903 + // modules/actus_kernel.py:899-900 // entry = schedule_page[index].copy() // entry_event_type = entry.event_type.as_uint64() dig 4 @@ -2963,20 +2958,20 @@ contract_schedule_while_top@2: * pushint 65 extract3 // on error: index access is out of bounds - // modules/actus_kernel.py:903 + // modules/actus_kernel.py:900 // entry_event_type = entry.event_type.as_uint64() dup - // modules/actus_kernel.py:902-903 + // modules/actus_kernel.py:899-900 // entry = schedule_page[index].copy() // entry_event_type = entry.event_type.as_uint64() intc_2 // 8 - // modules/actus_kernel.py:903 + // modules/actus_kernel.py:900 // entry_event_type = entry.event_type.as_uint64() getbyte dup cover 2 bury 13 - // modules/actus_kernel.py:904 + // modules/actus_kernel.py:901 // assert entry.event_id == page_cursor + index, err.INVALID_EVENT_ID dup intc_0 // 0 @@ -2989,14 +2984,14 @@ contract_schedule_while_top@2: dig 1 == assert // Invalid event id - // modules/actus_kernel.py:905-907 + // modules/actus_kernel.py:902-904 // self._assert_event_allowed_for_contract_type( // contract_type, entry_event_type // ) dig 5 uncover 3 callsub _assert_event_allowed_for_contract_type - // modules/actus_kernel.py:908 + // modules/actus_kernel.py:905 // assert entry.scheduled_time > UInt64(0), err.INVALID_ACTUS_CONFIG swap pushint 9 @@ -3004,14 +2999,14 @@ contract_schedule_while_top@2: dup bury 10 assert // Invalid ACTUS configuration - // modules/actus_kernel.py:909 + // modules/actus_kernel.py:906 // if entry.event_id > UInt64(0): bz contract_schedule_after_if_else@8 - // modules/actus_kernel.py:910 + // modules/actus_kernel.py:907 // if index > UInt64(0): dup bz contract_schedule_else_body@6 - // modules/actus_kernel.py:911 + // modules/actus_kernel.py:908 // previous_entry = schedule_page[index - UInt64(1)].copy() dup intc_1 // 1 @@ -3024,24 +3019,24 @@ contract_schedule_while_top@2: extract3 // on error: index access is out of bounds contract_schedule_after_if_else@7: - // modules/actus_kernel.py:926 + // modules/actus_kernel.py:923 // previous_entry.scheduled_time <= entry.scheduled_time pushint 9 extract_uint64 dig 8 <= - // modules/actus_kernel.py:925-927 + // modules/actus_kernel.py:922-924 // assert ( // previous_entry.scheduled_time <= entry.scheduled_time // ), err.INVALID_SORTING assert // Time events must be sorted in strictly ascending order contract_schedule_after_if_else@8: - // modules/actus_kernel.py:928 + // modules/actus_kernel.py:925 // if entry.event_id == UInt64(0): dig 8 bnz contract_schedule_after_if_else@10 - // modules/actus_kernel.py:929-931 + // modules/actus_kernel.py:926-928 // assert entry_event_type == UInt64( // enums.EVT_IED // ), err.INVALID_ACTUS_CONFIG @@ -3051,7 +3046,7 @@ contract_schedule_after_if_else@8: assert // Invalid ACTUS configuration contract_schedule_after_if_else@10: - // modules/actus_kernel.py:932 + // modules/actus_kernel.py:929 // index += UInt64(1) dup intc_1 // 1 @@ -3060,18 +3055,18 @@ contract_schedule_after_if_else@10: b contract_schedule_while_top@2 contract_schedule_else_body@6: - // modules/actus_kernel.py:913-915 + // modules/actus_kernel.py:910-912 // # The first entry of a page must still be ordered after the // # last entry of the previous page. // assert schedule_page_index > UInt64(0), err.INVALID_EVENT_ID dig 6 dup assert // Invalid event id - // modules/actus_kernel.py:916 + // modules/actus_kernel.py:913 // previous_page_index = schedule_page_index - UInt64(1) intc_1 // 1 - - // modules/actus_kernel.py:918 + // modules/actus_kernel.py:915 // previous_page_index in self.schedule_page itob bytec 24 // 0x5323 @@ -3080,12 +3075,12 @@ contract_schedule_else_body@6: dup box_len bury 1 - // modules/actus_kernel.py:917-919 + // modules/actus_kernel.py:914-916 // assert ( // previous_page_index in self.schedule_page // ), err.INVALID_SCHEDULE_PAGE assert // Invalid schedule page - // modules/actus_kernel.py:920-921 + // modules/actus_kernel.py:917-918 // previous_page = self.schedule_page[previous_page_index].copy() // assert previous_page.length > UInt64(0), err.INVALID_SCHEDULE_PAGE dup @@ -3093,15 +3088,15 @@ contract_schedule_else_body@6: pushint 2 box_extract btoi - // modules/actus_kernel.py:921 + // modules/actus_kernel.py:918 // assert previous_page.length > UInt64(0), err.INVALID_SCHEDULE_PAGE dup assert // Invalid schedule page - // modules/actus_kernel.py:923 + // modules/actus_kernel.py:920 // previous_page.length - UInt64(1) intc_1 // 1 - - // modules/actus_kernel.py:922-924 + // modules/actus_kernel.py:919-921 // previous_entry = previous_page[ // previous_page.length - UInt64(1) // ].copy() @@ -3114,7 +3109,7 @@ contract_schedule_else_body@6: b contract_schedule_after_if_else@7 contract_schedule_after_while@11: - // modules/actus_kernel.py:203 + // modules/actus_kernel.py:200 // self.schedule_page[page_index] = schedule_page.copy() dig 6 itob @@ -3126,35 +3121,35 @@ contract_schedule_after_while@11: pop dig 5 box_put - // modules/actus_kernel.py:935 + // modules/actus_kernel.py:932 // if is_last_page: dig 5 bz contract_schedule_after_if_else@13 - // modules/actus_kernel.py:937 + // modules/actus_kernel.py:934 // schedule_page_index * UInt64(cst.SCHEDULE_PAGE_SIZE) + page_length dig 1 dig 4 + - // modules/actus_kernel.py:936 + // modules/actus_kernel.py:933 // self.schedule_entry_count = ( bytec_3 // "schedule_entry_count" - // modules/actus_kernel.py:936-938 + // modules/actus_kernel.py:933-935 // self.schedule_entry_count = ( // schedule_page_index * UInt64(cst.SCHEDULE_PAGE_SIZE) + page_length // ) swap app_global_put - // modules/actus_kernel.py:939 + // modules/actus_kernel.py:936 // self.status = UInt64(enums.STATUS_PENDING_IED) bytec_1 // "status" pushint 50 app_global_put contract_schedule_after_if_else@13: - // modules/actus_kernel.py:1121 + // modules/actus_kernel.py:1118 // return Global.latest_timestamp global LatestTimestamp - // modules/actus_kernel.py:1081 + // modules/actus_kernel.py:1078 // @arc4.abimethod itob bytec_0 // 0x151f7c75 @@ -3167,23 +3162,23 @@ contract_schedule_after_if_else@13: // modules.actus_kernel.ActusKernelModule.contract_execute_ied[routing]() -> void: contract_execute_ied: - // modules/actus_kernel.py:146 + // modules/actus_kernel.py:143 // assert self.status != UInt64(enums.STATUS_INACTIVE), err.NOT_CONFIGURED intc_0 // 0 bytec_1 // "status" app_global_get_ex assert // check self.status exists assert // D-ASA not configured - // modules/actus_kernel.py:1146 + // modules/actus_kernel.py:1143 // self._assert_caller_is_arranger() callsub _assert_caller_is_arranger - // modules/actus_kernel.py:1147 + // modules/actus_kernel.py:1144 // self._assert_is_not_asset_defaulted() callsub _assert_is_not_asset_defaulted - // modules/actus_kernel.py:1148 + // modules/actus_kernel.py:1145 // self._assert_is_not_asset_suspended() callsub _assert_is_not_asset_suspended - // modules/actus_kernel.py:1150 + // modules/actus_kernel.py:1147 // assert self.event_cursor < self.schedule_entry_count, err.INVALID_EVENT_CURSOR intc_0 // 0 bytec_2 // "event_cursor" @@ -3196,10 +3191,10 @@ contract_execute_ied: dig 1 > assert // Invalid event cursor - // modules/actus_kernel.py:1151 + // modules/actus_kernel.py:1148 // entry = self._get_schedule_entry(self.event_cursor) callsub _get_schedule_entry - // modules/actus_kernel.py:1152 + // modules/actus_kernel.py:1149 // assert entry.event_type == arc4.UInt8(enums.EVT_IED), err.INVALID_EVENT_TYPE dup extract 8 1 @@ -3207,39 +3202,39 @@ contract_execute_ied: pushbytes 0x01 b== assert // Invalid event type - // modules/actus_kernel.py:1156 + // modules/actus_kernel.py:1153 // event_id=entry.event_id, dig 1 extract 0 8 - // modules/actus_kernel.py:1158 + // modules/actus_kernel.py:1155 // scheduled_time=entry.scheduled_time, dig 2 extract 9 8 - // modules/actus_kernel.py:1159 + // modules/actus_kernel.py:1156 // accrual_factor=entry.accrual_factor, dig 3 extract 17 8 - // modules/actus_kernel.py:1160 + // modules/actus_kernel.py:1157 // redemption_accrual_factor=entry.redemption_accrual_factor, dig 4 extract 25 8 - // modules/actus_kernel.py:1162 + // modules/actus_kernel.py:1159 // next_nominal_interest_rate=entry.next_nominal_interest_rate, dig 5 extract 33 8 - // modules/actus_kernel.py:1163 + // modules/actus_kernel.py:1160 // next_principal_redemption=entry.next_principal_redemption, dig 6 extract 41 8 - // modules/actus_kernel.py:1164 + // modules/actus_kernel.py:1161 // next_outstanding_principal=entry.next_outstanding_principal, dig 7 extract 49 8 - // modules/actus_kernel.py:1165 + // modules/actus_kernel.py:1162 // flags=entry.flags, dig 8 extract 57 8 - // modules/actus_kernel.py:1155-1166 + // modules/actus_kernel.py:1152-1163 // typ.ObservedEventRequest( // event_id=entry.event_id, // event_type=entry.event_type, @@ -3261,10 +3256,10 @@ contract_execute_ied: concat uncover 5 concat - // modules/actus_kernel.py:1161 + // modules/actus_kernel.py:1158 // observed_rate=UInt64(0), intc_0 // 0 - // modules/actus_kernel.py:1155-1166 + // modules/actus_kernel.py:1152-1163 // typ.ObservedEventRequest( // event_id=entry.event_id, // event_type=entry.event_type, @@ -3287,7 +3282,7 @@ contract_execute_ied: concat swap concat - // modules/actus_kernel.py:1153-1167 + // modules/actus_kernel.py:1150-1164 // self._apply_non_cash_schedule_entry( // entry, // typ.ObservedEventRequest( @@ -3305,10 +3300,10 @@ contract_execute_ied: // ) callsub _apply_non_cash_schedule_entry popn 2 - // modules/actus_kernel.py:1168 + // modules/actus_kernel.py:1165 // return Global.latest_timestamp global LatestTimestamp - // modules/actus_kernel.py:1123 + // modules/actus_kernel.py:1120 // @arc4.abimethod itob bytec_0 // 0x151f7c75 @@ -3325,7 +3320,7 @@ apply_non_cash_event: dupn 4 pushbytes "" dup - // modules/actus_kernel.py:1170 + // modules/actus_kernel.py:1167 // @arc4.abimethod txna ApplicationArgs 1 dup @@ -3340,20 +3335,20 @@ apply_non_cash_event: pushint 73 == assert // invalid number of bytes for smart_contracts.abi_types.ObservedEventRequest - // modules/actus_kernel.py:146 + // modules/actus_kernel.py:143 // assert self.status != UInt64(enums.STATUS_INACTIVE), err.NOT_CONFIGURED intc_0 // 0 bytec_1 // "status" app_global_get_ex assert // check self.status exists assert // D-ASA not configured - // modules/actus_kernel.py:1207 + // modules/actus_kernel.py:1204 // self._assert_is_not_asset_defaulted() callsub _assert_is_not_asset_defaulted - // modules/actus_kernel.py:1208 + // modules/actus_kernel.py:1205 // self._assert_is_not_asset_suspended() callsub _assert_is_not_asset_suspended - // modules/actus_kernel.py:1210 + // modules/actus_kernel.py:1207 // if payload.flags & UInt64(enums.FLAG_OBSERVED_EVENT): pushint 65 extract_uint64 @@ -3361,7 +3356,7 @@ apply_non_cash_event: pushint 4 & bz apply_non_cash_event_after_if_else@3 - // modules/actus_kernel.py:236 + // modules/actus_kernel.py:233 // return self.contract_type == UInt64(enums.CT_CLM) intc_0 // 0 bytec 10 // "contract_type" @@ -3369,13 +3364,13 @@ apply_non_cash_event: assert // check self.contract_type exists pushint 5 == - // modules/actus_kernel.py:1211 + // modules/actus_kernel.py:1208 // assert self._supports_observed_events(), err.OBSERVED_EVENT_REQUIRED assert // Observed event required to execute this action - // modules/actus_kernel.py:1212 + // modules/actus_kernel.py:1209 // self._assert_caller_is_arranger() callsub _assert_caller_is_arranger - // modules/actus_kernel.py:236 + // modules/actus_kernel.py:233 // return self.contract_type == UInt64(enums.CT_CLM) intc_0 // 0 bytec 10 // "contract_type" @@ -3384,10 +3379,10 @@ apply_non_cash_event: dup pushint 5 == - // modules/actus_kernel.py:948 + // modules/actus_kernel.py:945 // assert self._supports_observed_events(), err.OBSERVED_EVENT_REQUIRED assert // Observed event required to execute this action - // modules/actus_kernel.py:949 + // modules/actus_kernel.py:946 // assert payload.event_id == self.schedule_entry_count, err.INVALID_EVENT_ID dig 2 dup @@ -3401,33 +3396,33 @@ apply_non_cash_event: assert // check self.schedule_entry_count exists == assert // Invalid event id - // modules/actus_kernel.py:951 + // modules/actus_kernel.py:948 // self.contract_type, payload.event_type.as_uint64() dup extract 8 1 bury 12 intc_2 // 8 getbyte - // modules/actus_kernel.py:950-952 + // modules/actus_kernel.py:947-949 // self._assert_event_allowed_for_contract_type( // self.contract_type, payload.event_type.as_uint64() // ) callsub _assert_event_allowed_for_contract_type - // modules/actus_kernel.py:954 + // modules/actus_kernel.py:951 // page_index = self._schedule_page_index(self.schedule_entry_count) intc_0 // 0 bytec_3 // "schedule_entry_count" app_global_get_ex assert // check self.schedule_entry_count exists - // modules/actus_kernel.py:193 + // modules/actus_kernel.py:190 // return event_id // UInt64(cst.SCHEDULE_PAGE_SIZE) pushint 16 / - // modules/actus_kernel.py:955 + // modules/actus_kernel.py:952 // page = typ.ExecutionSchedulePage() - bytec 49 // 0x0000 + bytec 48 // 0x0000 bury 7 - // modules/actus_kernel.py:956 + // modules/actus_kernel.py:953 // if page_index in self.schedule_page: itob bytec 24 // 0x5323 @@ -3438,7 +3433,7 @@ apply_non_cash_event: box_len bury 1 bz apply_non_cash_event_after_if_else@27 - // modules/actus_kernel.py:957 + // modules/actus_kernel.py:954 // page = self.schedule_page[page_index].copy() dig 7 box_get @@ -3447,7 +3442,7 @@ apply_non_cash_event: assert // check self.schedule_page entry exists apply_non_cash_event_after_if_else@27: - // modules/actus_kernel.py:958 + // modules/actus_kernel.py:955 // assert page.length < UInt64(cst.SCHEDULE_PAGE_SIZE), err.INVALID_SCHEDULE_PAGE dig 5 dup @@ -3457,32 +3452,32 @@ apply_non_cash_event_after_if_else@27: pushint 16 < assert // Invalid schedule page - // modules/actus_kernel.py:963 + // modules/actus_kernel.py:960 // scheduled_time=payload.scheduled_time, dig 3 dup extract 9 8 - // modules/actus_kernel.py:964 + // modules/actus_kernel.py:961 // accrual_factor=payload.accrual_factor, dig 1 extract 17 8 - // modules/actus_kernel.py:965 + // modules/actus_kernel.py:962 // redemption_accrual_factor=payload.redemption_accrual_factor, dig 2 extract 25 8 - // modules/actus_kernel.py:966 + // modules/actus_kernel.py:963 // next_nominal_interest_rate=payload.next_nominal_interest_rate, dig 3 extract 41 8 - // modules/actus_kernel.py:967 + // modules/actus_kernel.py:964 // next_principal_redemption=payload.next_principal_redemption, dig 4 extract 49 8 - // modules/actus_kernel.py:968 + // modules/actus_kernel.py:965 // next_outstanding_principal=payload.next_outstanding_principal, uncover 5 extract 57 8 - // modules/actus_kernel.py:960-970 + // modules/actus_kernel.py:957-967 // typ.ExecutionScheduleEntry( // event_id=payload.event_id, // event_type=payload.event_type, @@ -3513,7 +3508,7 @@ apply_non_cash_event_after_if_else@27: dig 3 itob concat - // modules/actus_kernel.py:959-971 + // modules/actus_kernel.py:956-968 // page.append( // typ.ExecutionScheduleEntry( // event_id=payload.event_id, @@ -3536,7 +3531,7 @@ apply_non_cash_event_after_if_else@27: itob extract 6 2 replace2 0 - // modules/actus_kernel.py:972 + // modules/actus_kernel.py:969 // self.schedule_page[page_index] = page.copy() dig 8 dup @@ -3544,7 +3539,7 @@ apply_non_cash_event_after_if_else@27: pop swap box_put - // modules/actus_kernel.py:973 + // modules/actus_kernel.py:970 // self.schedule_entry_count += UInt64(1) intc_0 // 0 bytec_3 // "schedule_entry_count" @@ -3557,7 +3552,7 @@ apply_non_cash_event_after_if_else@27: app_global_put apply_non_cash_event_after_if_else@3: - // modules/actus_kernel.py:1215 + // modules/actus_kernel.py:1212 // assert event_id == self.event_cursor, err.INVALID_EVENT_CURSOR intc_0 // 0 bytec_2 // "event_cursor" @@ -3568,12 +3563,12 @@ apply_non_cash_event_after_if_else@3: uncover 2 == assert // Invalid event cursor - // modules/actus_kernel.py:1216 + // modules/actus_kernel.py:1213 // entry = self._get_schedule_entry(event_id) callsub _get_schedule_entry dup bury 8 - // modules/actus_kernel.py:1218 + // modules/actus_kernel.py:1215 // entry.event_type.as_uint64() dup extract 8 1 @@ -3582,10 +3577,10 @@ apply_non_cash_event_after_if_else@3: getbyte dup bury 6 - // modules/actus_kernel.py:367 + // modules/actus_kernel.py:364 // UInt64(enums.EVT_IED), intc_1 // 1 - // modules/actus_kernel.py:366-373 + // modules/actus_kernel.py:363-370 // return event_type in ( // UInt64(enums.EVT_IED), // UInt64(enums.EVT_PI), @@ -3597,10 +3592,10 @@ apply_non_cash_event_after_if_else@3: == bnz apply_non_cash_event_bool_true@15 dig 4 - // modules/actus_kernel.py:368 + // modules/actus_kernel.py:365 // UInt64(enums.EVT_PI), pushint 4 - // modules/actus_kernel.py:366-373 + // modules/actus_kernel.py:363-370 // return event_type in ( // UInt64(enums.EVT_IED), // UInt64(enums.EVT_PI), @@ -3612,10 +3607,10 @@ apply_non_cash_event_after_if_else@3: == bnz apply_non_cash_event_bool_true@15 dig 4 - // modules/actus_kernel.py:369 + // modules/actus_kernel.py:366 // UInt64(enums.EVT_RR), pushint 12 - // modules/actus_kernel.py:366-373 + // modules/actus_kernel.py:363-370 // return event_type in ( // UInt64(enums.EVT_IED), // UInt64(enums.EVT_PI), @@ -3627,10 +3622,10 @@ apply_non_cash_event_after_if_else@3: == bnz apply_non_cash_event_bool_true@15 dig 4 - // modules/actus_kernel.py:370 + // modules/actus_kernel.py:367 // UInt64(enums.EVT_RRF), pushint 11 - // modules/actus_kernel.py:366-373 + // modules/actus_kernel.py:363-370 // return event_type in ( // UInt64(enums.EVT_IED), // UInt64(enums.EVT_PI), @@ -3642,10 +3637,10 @@ apply_non_cash_event_after_if_else@3: == bnz apply_non_cash_event_bool_true@15 dig 4 - // modules/actus_kernel.py:371 + // modules/actus_kernel.py:368 // UInt64(enums.EVT_IPCB), pushint 18 - // modules/actus_kernel.py:366-373 + // modules/actus_kernel.py:363-370 // return event_type in ( // UInt64(enums.EVT_IED), // UInt64(enums.EVT_PI), @@ -3657,10 +3652,10 @@ apply_non_cash_event_after_if_else@3: == bnz apply_non_cash_event_bool_true@15 dig 4 - // modules/actus_kernel.py:372 + // modules/actus_kernel.py:369 // UInt64(enums.EVT_PRF), pushint 5 - // modules/actus_kernel.py:366-373 + // modules/actus_kernel.py:363-370 // return event_type in ( // UInt64(enums.EVT_IED), // UInt64(enums.EVT_PI), @@ -3676,18 +3671,18 @@ apply_non_cash_event_bool_true@15: intc_1 // 1 apply_non_cash_event_bool_merge@17: - // modules/actus_kernel.py:1217-1219 + // modules/actus_kernel.py:1214-1216 // assert self._event_is_non_cash( // entry.event_type.as_uint64() // ), err.INVALID_EVENT_TYPE assert // Invalid event type - // modules/actus_kernel.py:1220 + // modules/actus_kernel.py:1217 // assert entry.event_type != arc4.UInt8(enums.EVT_IED), err.INVALID_EVENT_TYPE dig 8 pushbytes 0x01 b!= assert // Invalid event type - // modules/actus_kernel.py:377 + // modules/actus_kernel.py:374 // return event_type in (UInt64(enums.EVT_RR), UInt64(enums.EVT_RRF)) dig 4 pushint 12 @@ -3702,10 +3697,10 @@ apply_non_cash_event_bool_true@21: intc_1 // 1 apply_non_cash_event_bool_merge@23: - // modules/actus_kernel.py:1221 + // modules/actus_kernel.py:1218 // if self._event_is_rate_reset(entry.event_type.as_uint64()): bz apply_non_cash_event_else_body@5 - // modules/rbac.py:80 + // modules/rbac.py:82 // assert self._role_is_active(self.observer, Txn.sender), err.UNAUTHORIZED bytec 25 // 0x523a4d4f4323 txn Sender @@ -3713,16 +3708,16 @@ apply_non_cash_event_bool_merge@23: assert // Not authorized apply_non_cash_event_after_if_else@6: - // modules/actus_kernel.py:1225 + // modules/actus_kernel.py:1222 // self._apply_non_cash_schedule_entry(entry, payload) dig 6 dig 2 callsub _apply_non_cash_schedule_entry popn 2 - // modules/actus_kernel.py:1226 + // modules/actus_kernel.py:1223 // return Global.latest_timestamp global LatestTimestamp - // modules/actus_kernel.py:1170 + // modules/actus_kernel.py:1167 // @arc4.abimethod itob bytec_0 // 0x151f7c75 @@ -3733,7 +3728,7 @@ apply_non_cash_event_after_if_else@6: return apply_non_cash_event_else_body@5: - // modules/actus_kernel.py:1224 + // modules/actus_kernel.py:1221 // self._assert_caller_is_arranger() callsub _assert_caller_is_arranger b apply_non_cash_event_after_if_else@6 @@ -3751,7 +3746,7 @@ apply_non_cash_event_bool_false@16: append_observed_cash_event: intc_0 // 0 dup - // modules/actus_kernel.py:1228 + // modules/actus_kernel.py:1225 // @arc4.abimethod txna ApplicationArgs 1 dupn 2 @@ -3759,23 +3754,23 @@ append_observed_cash_event: pushint 65 == assert // invalid number of bytes for smart_contracts.abi_types.ObservedCashEventRequest - // modules/actus_kernel.py:146 + // modules/actus_kernel.py:143 // assert self.status != UInt64(enums.STATUS_INACTIVE), err.NOT_CONFIGURED intc_0 // 0 bytec_1 // "status" app_global_get_ex assert // check self.status exists assert // D-ASA not configured - // modules/actus_kernel.py:1257 + // modules/actus_kernel.py:1254 // self._assert_caller_is_arranger() callsub _assert_caller_is_arranger - // modules/actus_kernel.py:1258 + // modules/actus_kernel.py:1255 // self._assert_is_not_asset_defaulted() callsub _assert_is_not_asset_defaulted - // modules/actus_kernel.py:1259 + // modules/actus_kernel.py:1256 // self._assert_is_not_asset_suspended() callsub _assert_is_not_asset_suspended - // modules/actus_kernel.py:138 + // modules/actus_kernel.py:135 // return self.status == UInt64(enums.STATUS_PENDING_IED) intc_0 // 0 bytec_1 // "status" @@ -3783,11 +3778,11 @@ append_observed_cash_event: assert // check self.status exists pushint 50 == - // modules/actus_kernel.py:150 + // modules/actus_kernel.py:147 // assert not self._status_is_pending_ied(), err.PENDING_IED ! assert // IED not yet executed - // modules/actus_kernel.py:236 + // modules/actus_kernel.py:233 // return self.contract_type == UInt64(enums.CT_CLM) intc_0 // 0 bytec 10 // "contract_type" @@ -3795,10 +3790,10 @@ append_observed_cash_event: assert // check self.contract_type exists pushint 5 == - // modules/actus_kernel.py:984 + // modules/actus_kernel.py:981 // assert self._supports_observed_events(), err.OBSERVED_EVENT_REQUIRED assert // Observed event required to execute this action - // modules/actus_kernel.py:985 + // modules/actus_kernel.py:982 // assert payload.event_id == self.schedule_entry_count, err.INVALID_EVENT_ID dup intc_0 // 0 @@ -3813,7 +3808,7 @@ append_observed_cash_event: dig 1 == assert // Invalid event id - // modules/actus_kernel.py:986 + // modules/actus_kernel.py:983 // assert payload.event_type == arc4.UInt8(enums.EVT_PR), err.INVALID_EVENT_TYPE dig 1 extract 8 1 @@ -3822,7 +3817,7 @@ append_observed_cash_event: pushbytes 0x03 b== assert // Invalid event type - // modules/actus_kernel.py:987 + // modules/actus_kernel.py:984 // assert payload.flags & UInt64(enums.FLAG_CASH_EVENT), err.INVALID_ACTUS_CONFIG swap pushint 57 @@ -3832,10 +3827,10 @@ append_observed_cash_event: intc_1 // 1 & assert // Invalid ACTUS configuration - // modules/actus_kernel.py:989 + // modules/actus_kernel.py:986 // if self.schedule_entry_count > UInt64(0): bz append_observed_cash_event_after_if_else@3 - // modules/actus_kernel.py:991 + // modules/actus_kernel.py:988 // self.schedule_entry_count - UInt64(1) intc_0 // 0 bytec_3 // "schedule_entry_count" @@ -3843,12 +3838,12 @@ append_observed_cash_event: assert // check self.schedule_entry_count exists intc_1 // 1 - - // modules/actus_kernel.py:990-992 + // modules/actus_kernel.py:987-989 // previous_entry = self._get_schedule_entry( // self.schedule_entry_count - UInt64(1) // ) callsub _get_schedule_entry - // modules/actus_kernel.py:994 + // modules/actus_kernel.py:991 // previous_entry.scheduled_time <= payload.scheduled_time pushint 9 extract_uint64 @@ -3856,28 +3851,28 @@ append_observed_cash_event: pushint 9 extract_uint64 <= - // modules/actus_kernel.py:993-995 + // modules/actus_kernel.py:990-992 // assert ( // previous_entry.scheduled_time <= payload.scheduled_time // ), err.INVALID_SORTING assert // Time events must be sorted in strictly ascending order append_observed_cash_event_after_if_else@3: - // modules/actus_kernel.py:997 + // modules/actus_kernel.py:994 // page_index = self._schedule_page_index(self.schedule_entry_count) intc_0 // 0 bytec_3 // "schedule_entry_count" app_global_get_ex assert // check self.schedule_entry_count exists - // modules/actus_kernel.py:193 + // modules/actus_kernel.py:190 // return event_id // UInt64(cst.SCHEDULE_PAGE_SIZE) pushint 16 / - // modules/actus_kernel.py:998 + // modules/actus_kernel.py:995 // page = typ.ExecutionSchedulePage() - bytec 49 // 0x0000 + bytec 48 // 0x0000 bury 6 - // modules/actus_kernel.py:999 + // modules/actus_kernel.py:996 // if page_index in self.schedule_page: itob bytec 24 // 0x5323 @@ -3888,7 +3883,7 @@ append_observed_cash_event_after_if_else@3: box_len bury 1 bz append_observed_cash_event_after_if_else@5 - // modules/actus_kernel.py:1000 + // modules/actus_kernel.py:997 // page = self.schedule_page[page_index].copy() dig 5 box_get @@ -3897,7 +3892,7 @@ append_observed_cash_event_after_if_else@3: assert // check self.schedule_page entry exists append_observed_cash_event_after_if_else@5: - // modules/actus_kernel.py:1001 + // modules/actus_kernel.py:998 // assert page.length < UInt64(cst.SCHEDULE_PAGE_SIZE), err.INVALID_SCHEDULE_PAGE dig 4 dup @@ -3907,32 +3902,32 @@ append_observed_cash_event_after_if_else@5: pushint 16 < assert // Invalid schedule page - // modules/actus_kernel.py:1006 + // modules/actus_kernel.py:1003 // scheduled_time=payload.scheduled_time, dig 5 dup extract 9 8 - // modules/actus_kernel.py:1007 + // modules/actus_kernel.py:1004 // accrual_factor=payload.accrual_factor, dig 1 extract 17 8 - // modules/actus_kernel.py:1008 + // modules/actus_kernel.py:1005 // redemption_accrual_factor=payload.redemption_accrual_factor, dig 2 extract 25 8 - // modules/actus_kernel.py:1009 + // modules/actus_kernel.py:1006 // next_nominal_interest_rate=payload.next_nominal_interest_rate, dig 3 extract 33 8 - // modules/actus_kernel.py:1010 + // modules/actus_kernel.py:1007 // next_principal_redemption=payload.next_principal_redemption, dig 4 extract 41 8 - // modules/actus_kernel.py:1011 + // modules/actus_kernel.py:1008 // next_outstanding_principal=payload.next_outstanding_principal, uncover 5 extract 49 8 - // modules/actus_kernel.py:1003-1013 + // modules/actus_kernel.py:1000-1010 // typ.ExecutionScheduleEntry( // event_id=payload.event_id, // event_type=payload.event_type, @@ -3963,7 +3958,7 @@ append_observed_cash_event_after_if_else@5: dig 3 itob concat - // modules/actus_kernel.py:1002-1014 + // modules/actus_kernel.py:999-1011 // page.append( // typ.ExecutionScheduleEntry( // event_id=payload.event_id, @@ -3986,7 +3981,7 @@ append_observed_cash_event_after_if_else@5: itob extract 6 2 replace2 0 - // modules/actus_kernel.py:1015 + // modules/actus_kernel.py:1012 // self.schedule_page[page_index] = page.copy() dig 6 dup @@ -3994,7 +3989,7 @@ append_observed_cash_event_after_if_else@5: pop swap box_put - // modules/actus_kernel.py:1016 + // modules/actus_kernel.py:1013 // self.schedule_entry_count += UInt64(1) intc_0 // 0 bytec_3 // "schedule_entry_count" @@ -4005,47 +4000,10 @@ append_observed_cash_event_after_if_else@5: bytec_3 // "schedule_entry_count" swap app_global_put - // modules/actus_kernel.py:1263 + // modules/actus_kernel.py:1260 // return Global.latest_timestamp global LatestTimestamp - // modules/actus_kernel.py:1228 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.actus_kernel.ActusKernelModule.contract_set_default_status[routing]() -> void: -contract_set_default_status: - // modules/actus_kernel.py:1265 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_1 // 1 - == - assert // invalid number of bytes for arc4.bool - intc_0 // 0 - getbit - // modules/rbac.py:74 - // assert self._role_is_active(self.trustee, Txn.sender), err.UNAUTHORIZED - bytec 26 // 0x523a54525323 - txn Sender - callsub _role_is_active - assert // Not authorized - // modules/actus_kernel.py:1278 - // self.defaulted = defaulted - bytec 47 // "defaulted" - swap - app_global_put - // modules/actus_kernel.py:1279 - // return Global.latest_timestamp - global LatestTimestamp - // modules/actus_kernel.py:1265 + // modules/actus_kernel.py:1225 // @arc4.abimethod itob bytec_0 // 0x151f7c75 @@ -4058,7 +4016,7 @@ contract_set_default_status: // modules.actus_kernel.ActusKernelModule.contract_get_state[routing]() -> void: contract_get_state: - // modules/actus_kernel.py:146 + // modules/actus_kernel.py:143 // assert self.status != UInt64(enums.STATUS_INACTIVE), err.NOT_CONFIGURED intc_0 // 0 bytec_1 // "status" @@ -4066,7 +4024,7 @@ contract_get_state: assert // check self.status exists dup assert // D-ASA not configured - // modules/actus_kernel.py:1294 + // modules/actus_kernel.py:1275 // contract_type=arc4.UInt8(self.contract_type), intc_0 // 0 bytec 10 // "contract_type" @@ -4079,85 +4037,85 @@ contract_get_state: <= assert // overflow extract 7 1 - // modules/actus_kernel.py:1296 + // modules/actus_kernel.py:1277 // total_units=self.total_units, intc_0 // 0 bytec 13 // "total_units" app_global_get_ex assert // check self.total_units exists - // modules/actus_kernel.py:1297 + // modules/actus_kernel.py:1278 // reserved_units_total=self.reserved_units_total, intc_0 // 0 bytec 11 // "reserved_units_total" app_global_get_ex assert // check self.reserved_units_total exists - // modules/actus_kernel.py:1298 + // modules/actus_kernel.py:1279 // initial_exchange_amount=self.initial_exchange_amount, intc_0 // 0 bytec 20 // "initial_exchange_amount" app_global_get_ex assert // check self.initial_exchange_amount exists - // modules/actus_kernel.py:1299 + // modules/actus_kernel.py:1280 // event_cursor=self.event_cursor, intc_0 // 0 bytec_2 // "event_cursor" app_global_get_ex assert // check self.event_cursor exists - // modules/actus_kernel.py:1300 + // modules/actus_kernel.py:1281 // schedule_entry_count=self.schedule_entry_count, intc_0 // 0 bytec_3 // "schedule_entry_count" app_global_get_ex assert // check self.schedule_entry_count exists - // modules/actus_kernel.py:1301 + // modules/actus_kernel.py:1282 // outstanding_principal=self.outstanding_principal, intc_0 // 0 bytec 4 // "outstanding_principal" app_global_get_ex assert // check self.outstanding_principal exists - // modules/actus_kernel.py:1302 + // modules/actus_kernel.py:1283 // interest_calculation_base=self.interest_calculation_base, intc_0 // 0 bytec 7 // "interest_calculation_base" app_global_get_ex assert // check self.interest_calculation_base exists - // modules/actus_kernel.py:1303 + // modules/actus_kernel.py:1284 // nominal_interest_rate=self.nominal_interest_rate, intc_0 // 0 bytec 9 // "nominal_interest_rate" app_global_get_ex assert // check self.nominal_interest_rate exists - // modules/actus_kernel.py:1304 + // modules/actus_kernel.py:1285 // accrued_interest=self.accrued_interest, intc_0 // 0 bytec 6 // "accrued_interest" app_global_get_ex assert // check self.accrued_interest exists - // modules/actus_kernel.py:1305 + // modules/actus_kernel.py:1286 // cumulative_interest_index=self.cumulative_interest_index, intc_0 // 0 bytec 16 // "cumulative_interest_index" app_global_get_ex assert // check self.cumulative_interest_index exists - // modules/actus_kernel.py:1306 + // modules/actus_kernel.py:1287 // cumulative_principal_index=self.cumulative_principal_index, intc_0 // 0 bytec 17 // "cumulative_principal_index" app_global_get_ex assert // check self.cumulative_principal_index exists - // modules/actus_kernel.py:1307 + // modules/actus_kernel.py:1288 // reserved_interest=self.reserved_interest, intc_0 // 0 bytec 15 // "reserved_interest" app_global_get_ex assert // check self.reserved_interest exists - // modules/actus_kernel.py:1308 + // modules/actus_kernel.py:1289 // reserved_principal=self.reserved_principal, intc_0 // 0 bytec 12 // "reserved_principal" app_global_get_ex assert // check self.reserved_principal exists - // modules/actus_kernel.py:1293-1309 + // modules/actus_kernel.py:1274-1290 // return typ.KernelState( // contract_type=arc4.UInt8(self.contract_type), // status=self.status, @@ -4219,7 +4177,7 @@ contract_get_state: swap itob concat - // modules/actus_kernel.py:1281 + // modules/actus_kernel.py:1262 // @arc4.abimethod(readonly=True) bytec_0 // 0x151f7c75 swap @@ -4231,14 +4189,14 @@ contract_get_state: // modules.actus_kernel.ActusKernelModule.contract_get_next_due_event[routing]() -> void: contract_get_next_due_event: - // modules/actus_kernel.py:146 + // modules/actus_kernel.py:143 // assert self.status != UInt64(enums.STATUS_INACTIVE), err.NOT_CONFIGURED intc_0 // 0 bytec_1 // "status" app_global_get_ex assert // check self.status exists assert // D-ASA not configured - // modules/actus_kernel.py:1323 + // modules/actus_kernel.py:1304 // if self.event_cursor >= self.schedule_entry_count: intc_0 // 0 bytec_2 // "event_cursor" @@ -4250,13 +4208,13 @@ contract_get_next_due_event: assert // check self.schedule_entry_count exists >= bz contract_get_next_due_event_after_if_else@3 - // modules/actus_kernel.py:1325 + // modules/actus_kernel.py:1306 // event_id=self.event_cursor, intc_0 // 0 bytec_2 // "event_cursor" app_global_get_ex assert // check self.event_cursor exists - // modules/actus_kernel.py:1324-1334 + // modules/actus_kernel.py:1305-1315 // return typ.ExecutionScheduleEntry( // event_id=self.event_cursor, // event_type=arc4.UInt8(0), @@ -4269,10 +4227,10 @@ contract_get_next_due_event: // flags=UInt64(0), // ) itob - // modules/actus_kernel.py:1326 + // modules/actus_kernel.py:1307 // event_type=arc4.UInt8(0), - bytec 40 // 0x00 - // modules/actus_kernel.py:1324-1334 + bytec 41 // 0x00 + // modules/actus_kernel.py:1305-1315 // return typ.ExecutionScheduleEntry( // event_id=self.event_cursor, // event_type=arc4.UInt8(0), @@ -4285,10 +4243,10 @@ contract_get_next_due_event: // flags=UInt64(0), // ) concat - // modules/actus_kernel.py:1327 + // modules/actus_kernel.py:1308 // scheduled_time=UInt64(0), intc_0 // 0 - // modules/actus_kernel.py:1324-1334 + // modules/actus_kernel.py:1305-1315 // return typ.ExecutionScheduleEntry( // event_id=self.event_cursor, // event_type=arc4.UInt8(0), @@ -4318,7 +4276,7 @@ contract_get_next_due_event: concat contract_get_next_due_event_after_inlined_modules.actus_kernel.ActusKernelModule.contract_get_next_due_event@4: - // modules/actus_kernel.py:1311 + // modules/actus_kernel.py:1292 // @arc4.abimethod(readonly=True) bytec_0 // 0x151f7c75 swap @@ -4328,27 +4286,27 @@ contract_get_next_due_event_after_inlined_modules.actus_kernel.ActusKernelModule return contract_get_next_due_event_after_if_else@3: - // modules/actus_kernel.py:1335 + // modules/actus_kernel.py:1316 // return self._get_schedule_entry(self.event_cursor) intc_0 // 0 bytec_2 // "event_cursor" app_global_get_ex assert // check self.event_cursor exists callsub _get_schedule_entry - // modules/actus_kernel.py:1311 + // modules/actus_kernel.py:1292 // @arc4.abimethod(readonly=True) b contract_get_next_due_event_after_inlined_modules.actus_kernel.ActusKernelModule.contract_get_next_due_event@4 // modules.rbac.RbacModule.contract_update[routing]() -> void: contract_update: - // modules/rbac.py:159-162 + // modules/rbac.py:161-164 // # The reference implementation grants the update permissions to the Arranger. // # ⚠️ WARNING: Application updates must be executed VERY carefully, as they // # might introduce breaking changes. // self._assert_caller_is_arranger() callsub _assert_caller_is_arranger - // modules/rbac.py:148 + // modules/rbac.py:150 // @arc4.abimethod(allow_actions=["UpdateApplication"]) intc_1 // 1 return @@ -4356,7 +4314,7 @@ contract_update: // modules.rbac.RbacModule.rbac_rotate_arranger[routing]() -> void: rbac_rotate_arranger: - // modules/rbac.py:164 + // modules/rbac.py:166 // @arc4.abimethod txna ApplicationArgs 1 dup @@ -4364,18 +4322,18 @@ rbac_rotate_arranger: intc_3 // 32 == assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:178 + // modules/rbac.py:180 // self._assert_caller_is_arranger() callsub _assert_caller_is_arranger - // modules/rbac.py:179 + // modules/rbac.py:181 // self.arranger.value = new_arranger bytec 18 // 0x523a41525223 swap app_global_put - // modules/rbac.py:180 + // modules/rbac.py:182 // return Global.latest_timestamp global LatestTimestamp - // modules/rbac.py:164 + // modules/rbac.py:166 // @arc4.abimethod itob bytec_0 // 0x151f7c75 @@ -4388,7 +4346,7 @@ rbac_rotate_arranger: // modules.rbac.RbacModule.rbac_set_op_daemon[routing]() -> void: rbac_set_op_daemon: - // modules/rbac.py:182 + // modules/rbac.py:184 // @arc4.abimethod txna ApplicationArgs 1 dup @@ -4396,18 +4354,18 @@ rbac_set_op_daemon: intc_3 // 32 == assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:196 + // modules/rbac.py:198 // self._assert_caller_is_arranger() callsub _assert_caller_is_arranger - // modules/rbac.py:197 + // modules/rbac.py:199 // self.op_daemon.value = address bytec 27 // 0x523a4f504423 swap app_global_put - // modules/rbac.py:198 + // modules/rbac.py:200 // return Global.latest_timestamp global LatestTimestamp - // modules/rbac.py:182 + // modules/rbac.py:184 // @arc4.abimethod itob bytec_0 // 0x151f7c75 @@ -4420,7 +4378,7 @@ rbac_set_op_daemon: // modules.rbac.RbacModule.rbac_assign_role[routing]() -> void: rbac_assign_role: - // modules/rbac.py:200 + // modules/rbac.py:202 // @arc4.abimethod txna ApplicationArgs 1 dup @@ -4442,33 +4400,33 @@ rbac_assign_role: pushint 16 == assert // invalid number of bytes for smart_contracts.abi_types.RoleValidity - // modules/rbac.py:222 + // modules/rbac.py:224 // self._assert_caller_is_arranger() callsub _assert_caller_is_arranger - // modules/rbac.py:223 + // modules/rbac.py:225 // self._assert_is_not_asset_defaulted() callsub _assert_is_not_asset_defaulted - // modules/rbac.py:224 + // modules/rbac.py:226 // self._assert_valid_role(role_id.as_uint64()) btoi dupn 2 callsub _assert_valid_role - // modules/rbac.py:102 + // modules/rbac.py:104 // if role_id == UInt64(enums.ROLE_ARRANGER): pushint 20 == bz rbac_assign_role_after_if_else@3 - // modules/rbac.py:103 + // modules/rbac.py:105 // self.arranger.value = role_address bytec 18 // 0x523a41525223 dig 3 app_global_put rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14: - // modules/rbac.py:226 + // modules/rbac.py:228 // return Global.latest_timestamp global LatestTimestamp - // modules/rbac.py:200 + // modules/rbac.py:202 // @arc4.abimethod itob bytec_0 // 0x151f7c75 @@ -4479,13 +4437,13 @@ rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14: return rbac_assign_role_after_if_else@3: - // modules/rbac.py:106 + // modules/rbac.py:108 // if role_id == UInt64(enums.ROLE_ACCOUNT_MANAGER): dup pushint 40 == bz rbac_assign_role_after_if_else@5 - // modules/rbac.py:107 + // modules/rbac.py:109 // assert role_address not in self.account_manager, err.INVALID_ROLE_ADDRESS bytec 23 // 0x523a4d4e4723 dig 3 @@ -4495,22 +4453,22 @@ rbac_assign_role_after_if_else@3: bury 1 ! assert // Invalid account role address - // modules/rbac.py:108 + // modules/rbac.py:110 // self.account_manager[role_address] = validity.copy() dig 2 box_put - // modules/rbac.py:225 + // modules/rbac.py:227 // self._set_role(role_id.as_uint64(), role_address, validity) b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14 rbac_assign_role_after_if_else@5: - // modules/rbac.py:110 + // modules/rbac.py:112 // if role_id == UInt64(enums.ROLE_PRIMARY_DEALER): dup pushint 50 == bz rbac_assign_role_after_if_else@7 - // modules/rbac.py:111 + // modules/rbac.py:113 // assert role_address not in self.primary_dealer, err.INVALID_ROLE_ADDRESS bytec 22 // 0x523a50594423 dig 3 @@ -4520,22 +4478,22 @@ rbac_assign_role_after_if_else@5: bury 1 ! assert // Invalid account role address - // modules/rbac.py:112 + // modules/rbac.py:114 // self.primary_dealer[role_address] = validity.copy() dig 2 box_put - // modules/rbac.py:225 + // modules/rbac.py:227 // self._set_role(role_id.as_uint64(), role_address, validity) b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14 rbac_assign_role_after_if_else@7: - // modules/rbac.py:114 + // modules/rbac.py:116 // if role_id == UInt64(enums.ROLE_TRUSTEE): dup pushint 60 == bz rbac_assign_role_after_if_else@9 - // modules/rbac.py:115 + // modules/rbac.py:117 // assert role_address not in self.trustee, err.INVALID_ROLE_ADDRESS bytec 26 // 0x523a54525323 dig 3 @@ -4545,22 +4503,22 @@ rbac_assign_role_after_if_else@7: bury 1 ! assert // Invalid account role address - // modules/rbac.py:116 + // modules/rbac.py:118 // self.trustee[role_address] = validity.copy() dig 2 box_put - // modules/rbac.py:225 + // modules/rbac.py:227 // self._set_role(role_id.as_uint64(), role_address, validity) b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14 rbac_assign_role_after_if_else@9: - // modules/rbac.py:118 + // modules/rbac.py:120 // if role_id == UInt64(enums.ROLE_AUTHORITY): dup pushint 70 == bz rbac_assign_role_after_if_else@11 - // modules/rbac.py:119 + // modules/rbac.py:121 // assert role_address not in self.authority, err.INVALID_ROLE_ADDRESS bytec 21 // 0x523a41555423 dig 3 @@ -4570,22 +4528,22 @@ rbac_assign_role_after_if_else@9: bury 1 ! assert // Invalid account role address - // modules/rbac.py:120 + // modules/rbac.py:122 // self.authority[role_address] = validity.copy() dig 2 box_put - // modules/rbac.py:225 + // modules/rbac.py:227 // self._set_role(role_id.as_uint64(), role_address, validity) b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14 rbac_assign_role_after_if_else@11: - // modules/rbac.py:122 + // modules/rbac.py:124 // if role_id == UInt64(enums.ROLE_OBSERVER): dup pushint 80 == bz rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14 - // modules/rbac.py:123 + // modules/rbac.py:125 // assert role_address not in self.observer, err.INVALID_ROLE_ADDRESS bytec 25 // 0x523a4d4f4323 dig 3 @@ -4595,7 +4553,7 @@ rbac_assign_role_after_if_else@11: bury 1 ! assert // Invalid account role address - // modules/rbac.py:124 + // modules/rbac.py:126 // self.observer[role_address] = validity.copy() dig 2 box_put @@ -4604,7 +4562,7 @@ rbac_assign_role_after_if_else@11: // modules.rbac.RbacModule.rbac_revoke_role[routing]() -> void: rbac_revoke_role: - // modules/rbac.py:228 + // modules/rbac.py:230 // @arc4.abimethod txna ApplicationArgs 1 dup @@ -4619,29 +4577,29 @@ rbac_revoke_role: intc_3 // 32 == assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:247 + // modules/rbac.py:249 // self._assert_caller_is_arranger() callsub _assert_caller_is_arranger - // modules/rbac.py:248 + // modules/rbac.py:250 // self._assert_is_not_asset_defaulted() callsub _assert_is_not_asset_defaulted - // modules/rbac.py:249 + // modules/rbac.py:251 // self._assert_valid_role(role_id.as_uint64()) btoi dupn 2 callsub _assert_valid_role - // modules/rbac.py:127 + // modules/rbac.py:129 // assert role_id != UInt64(enums.ROLE_ARRANGER), err.INVALID_ROLE dup pushint 20 != assert // Invalid role identifier - // modules/rbac.py:128 + // modules/rbac.py:130 // if role_id == UInt64(enums.ROLE_ACCOUNT_MANAGER): pushint 40 == bz rbac_revoke_role_after_if_else@3 - // modules/rbac.py:129 + // modules/rbac.py:131 // assert role_address in self.account_manager, err.INVALID_ROLE_ADDRESS bytec 23 // 0x523a4d4e4723 dig 2 @@ -4650,16 +4608,16 @@ rbac_revoke_role: box_len bury 1 assert // Invalid account role address - // modules/rbac.py:130 + // modules/rbac.py:132 // del self.account_manager[role_address] box_del pop rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12: - // modules/rbac.py:251 + // modules/rbac.py:253 // return Global.latest_timestamp global LatestTimestamp - // modules/rbac.py:228 + // modules/rbac.py:230 // @arc4.abimethod itob bytec_0 // 0x151f7c75 @@ -4670,13 +4628,13 @@ rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12: return rbac_revoke_role_after_if_else@3: - // modules/rbac.py:132 + // modules/rbac.py:134 // if role_id == UInt64(enums.ROLE_PRIMARY_DEALER): dup pushint 50 == bz rbac_revoke_role_after_if_else@5 - // modules/rbac.py:133 + // modules/rbac.py:135 // assert role_address in self.primary_dealer, err.INVALID_ROLE_ADDRESS bytec 22 // 0x523a50594423 dig 2 @@ -4685,22 +4643,22 @@ rbac_revoke_role_after_if_else@3: box_len bury 1 assert // Invalid account role address - // modules/rbac.py:134 + // modules/rbac.py:136 // del self.primary_dealer[role_address] box_del pop - // modules/rbac.py:250 + // modules/rbac.py:252 // self._delete_role(role_id.as_uint64(), role_address) b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 rbac_revoke_role_after_if_else@5: - // modules/rbac.py:136 + // modules/rbac.py:138 // if role_id == UInt64(enums.ROLE_TRUSTEE): dup pushint 60 == bz rbac_revoke_role_after_if_else@7 - // modules/rbac.py:137 + // modules/rbac.py:139 // assert role_address in self.trustee, err.INVALID_ROLE_ADDRESS bytec 26 // 0x523a54525323 dig 2 @@ -4709,22 +4667,22 @@ rbac_revoke_role_after_if_else@5: box_len bury 1 assert // Invalid account role address - // modules/rbac.py:138 + // modules/rbac.py:140 // del self.trustee[role_address] box_del pop - // modules/rbac.py:250 + // modules/rbac.py:252 // self._delete_role(role_id.as_uint64(), role_address) b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 rbac_revoke_role_after_if_else@7: - // modules/rbac.py:140 + // modules/rbac.py:142 // if role_id == UInt64(enums.ROLE_AUTHORITY): dup pushint 70 == bz rbac_revoke_role_after_if_else@9 - // modules/rbac.py:141 + // modules/rbac.py:143 // assert role_address in self.authority, err.INVALID_ROLE_ADDRESS bytec 21 // 0x523a41555423 dig 2 @@ -4733,22 +4691,22 @@ rbac_revoke_role_after_if_else@7: box_len bury 1 assert // Invalid account role address - // modules/rbac.py:142 + // modules/rbac.py:144 // del self.authority[role_address] box_del pop - // modules/rbac.py:250 + // modules/rbac.py:252 // self._delete_role(role_id.as_uint64(), role_address) b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 rbac_revoke_role_after_if_else@9: - // modules/rbac.py:144 + // modules/rbac.py:146 // if role_id == UInt64(enums.ROLE_OBSERVER): dup pushint 80 == bz rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 - // modules/rbac.py:145 + // modules/rbac.py:147 // assert role_address in self.observer, err.INVALID_ROLE_ADDRESS bytec 25 // 0x523a4d4f4323 dig 2 @@ -4757,7 +4715,7 @@ rbac_revoke_role_after_if_else@9: box_len bury 1 assert // Invalid account role address - // modules/rbac.py:146 + // modules/rbac.py:148 // del self.observer[role_address] box_del pop @@ -4766,8 +4724,8 @@ rbac_revoke_role_after_if_else@9: // modules.rbac.RbacModule.rbac_contract_suspension[routing]() -> void: rbac_contract_suspension: - // modules/rbac.py:253 - // @arc4.abimethod # TODO: Update specs and add test + // modules/rbac.py:255 + // @arc4.abimethod txna ApplicationArgs 1 dup len @@ -4776,22 +4734,59 @@ rbac_contract_suspension: assert // invalid number of bytes for arc4.bool intc_0 // 0 getbit - // modules/rbac.py:77 + // modules/rbac.py:79 // assert self._role_is_active(self.authority, Txn.sender), err.UNAUTHORIZED bytec 21 // 0x523a41555423 txn Sender callsub _role_is_active assert // Not authorized - // modules/rbac.py:269 - // self.asset_suspended = suspended - bytec 33 // "asset_suspended" + // modules/rbac.py:271 + // self.contract_suspended = suspended + bytec 33 // "contract_suspended" swap app_global_put - // modules/rbac.py:270 + // modules/rbac.py:272 // return Global.latest_timestamp global LatestTimestamp - // modules/rbac.py:253 - // @arc4.abimethod # TODO: Update specs and add test + // modules/rbac.py:255 + // @arc4.abimethod + itob + bytec_0 // 0x151f7c75 + swap + concat + log + intc_1 // 1 + return + + +// modules.rbac.RbacModule.rbac_contract_default[routing]() -> void: +rbac_contract_default: + // modules/rbac.py:274 + // @arc4.abimethod + txna ApplicationArgs 1 + dup + len + intc_1 // 1 + == + assert // invalid number of bytes for arc4.bool + intc_0 // 0 + getbit + // modules/rbac.py:76 + // assert self._role_is_active(self.trustee, Txn.sender), err.UNAUTHORIZED + bytec 26 // 0x523a54525323 + txn Sender + callsub _role_is_active + assert // Not authorized + // modules/rbac.py:287 + // self.defaulted = defaulted + bytec 34 // "defaulted" + swap + app_global_put + // modules/rbac.py:288 + // return Global.latest_timestamp + global LatestTimestamp + // modules/rbac.py:274 + // @arc4.abimethod itob bytec_0 // 0x151f7c75 swap @@ -4803,13 +4798,13 @@ rbac_contract_suspension: // modules.rbac.RbacModule.rbac_get_arranger[routing]() -> void: rbac_get_arranger: - // modules/rbac.py:283 + // modules/rbac.py:301 // return self.arranger.value intc_0 // 0 bytec 18 // 0x523a41525223 app_global_get_ex assert // check self.arranger exists - // modules/rbac.py:272 + // modules/rbac.py:290 // @arc4.abimethod(readonly=True) bytec_0 // 0x151f7c75 swap @@ -4821,7 +4816,7 @@ rbac_get_arranger: // modules.rbac.RbacModule.rbac_get_address_roles[routing]() -> void: rbac_get_address_roles: - // modules/rbac.py:285 + // modules/rbac.py:303 // @arc4.abimethod(readonly=True) txna ApplicationArgs 1 dup @@ -4829,34 +4824,34 @@ rbac_get_address_roles: intc_3 // 32 == assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:303 + // modules/rbac.py:321 // self._role_is_active(self.account_manager, address), bytec 23 // 0x523a4d4e4723 dig 1 callsub _role_is_active - // modules/rbac.py:304 + // modules/rbac.py:322 // self._role_is_active(self.primary_dealer, address), bytec 22 // 0x523a50594423 dig 2 callsub _role_is_active - // modules/rbac.py:305 + // modules/rbac.py:323 // self._role_is_active(self.trustee, address), bytec 26 // 0x523a54525323 dig 3 callsub _role_is_active - // modules/rbac.py:306 + // modules/rbac.py:324 // self._role_is_active(self.authority, address), bytec 21 // 0x523a41555423 dig 4 callsub _role_is_active - // modules/rbac.py:307 + // modules/rbac.py:325 // self._role_is_active(self.observer, address), bytec 25 // 0x523a4d4f4323 uncover 5 callsub _role_is_active - // modules/rbac.py:285 + // modules/rbac.py:303 // @arc4.abimethod(readonly=True) - bytec 40 // 0x00 + bytec 41 // 0x00 intc_0 // 0 uncover 6 setbit @@ -4882,7 +4877,7 @@ rbac_get_address_roles: // modules.rbac.RbacModule.rbac_get_role_validity[routing]() -> void: rbac_get_role_validity: - // modules/rbac.py:310 + // modules/rbac.py:328 // @arc4.abimethod(readonly=True) txna ApplicationArgs 1 dup @@ -4897,17 +4892,17 @@ rbac_get_role_validity: intc_3 // 32 == assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:328 + // modules/rbac.py:346 // role = role_id.as_uint64() btoi - // modules/rbac.py:329 + // modules/rbac.py:347 // self._assert_valid_role(role) dup callsub _assert_valid_role - // modules/rbac.py:331 + // modules/rbac.py:349 // case UInt64(enums.ROLE_ARRANGER): pushints 20 40 50 60 70 80 - // modules/rbac.py:330-361 + // modules/rbac.py:348-379 // match role: // case UInt64(enums.ROLE_ARRANGER): // return typ.RoleValidity( @@ -4942,33 +4937,33 @@ rbac_get_role_validity: // op.err(err.INVALID_ROLE) uncover 6 match rbac_get_role_validity_switch_case_0@2 rbac_get_role_validity_switch_case_1@3 rbac_get_role_validity_switch_case_2@4 rbac_get_role_validity_switch_case_3@5 rbac_get_role_validity_switch_case_4@6 rbac_get_role_validity_switch_case_5@7 - // modules/rbac.py:361 + // modules/rbac.py:379 // op.err(err.INVALID_ROLE) err // Invalid role identifier rbac_get_role_validity_switch_case_5@7: - // modules/rbac.py:357 + // modules/rbac.py:375 // self.observer, role_address bytec 25 // 0x523a4d4f4323 - // modules/rbac.py:55 + // modules/rbac.py:57 // return role_address in role_map dig 1 concat dup box_len bury 1 - // modules/rbac.py:356-358 + // modules/rbac.py:374-376 // assert self._has_role( // self.observer, role_address // ), err.INVALID_ROLE_ADDRESS assert // Invalid account role address - // modules/rbac.py:359 + // modules/rbac.py:377 // return self.observer[role_address] box_get pop rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9: - // modules/rbac.py:310 + // modules/rbac.py:328 // @arc4.abimethod(readonly=True) bytec_0 // 0x151f7c75 swap @@ -4978,108 +4973,108 @@ rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_valid return rbac_get_role_validity_switch_case_4@6: - // modules/rbac.py:352 + // modules/rbac.py:370 // self.authority, role_address bytec 21 // 0x523a41555423 - // modules/rbac.py:55 + // modules/rbac.py:57 // return role_address in role_map dig 1 concat dup box_len bury 1 - // modules/rbac.py:351-353 + // modules/rbac.py:369-371 // assert self._has_role( // self.authority, role_address // ), err.INVALID_ROLE_ADDRESS assert // Invalid account role address - // modules/rbac.py:354 + // modules/rbac.py:372 // return self.authority[role_address] box_get pop - // modules/rbac.py:310 + // modules/rbac.py:328 // @arc4.abimethod(readonly=True) b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9 rbac_get_role_validity_switch_case_3@5: - // modules/rbac.py:347 + // modules/rbac.py:365 // self.trustee, role_address bytec 26 // 0x523a54525323 - // modules/rbac.py:55 + // modules/rbac.py:57 // return role_address in role_map dig 1 concat dup box_len bury 1 - // modules/rbac.py:346-348 + // modules/rbac.py:364-366 // assert self._has_role( // self.trustee, role_address // ), err.INVALID_ROLE_ADDRESS assert // Invalid account role address - // modules/rbac.py:349 + // modules/rbac.py:367 // return self.trustee[role_address] box_get pop - // modules/rbac.py:310 + // modules/rbac.py:328 // @arc4.abimethod(readonly=True) b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9 rbac_get_role_validity_switch_case_2@4: - // modules/rbac.py:342 + // modules/rbac.py:360 // self.primary_dealer, role_address bytec 22 // 0x523a50594423 - // modules/rbac.py:55 + // modules/rbac.py:57 // return role_address in role_map dig 1 concat dup box_len bury 1 - // modules/rbac.py:341-343 + // modules/rbac.py:359-361 // assert self._has_role( // self.primary_dealer, role_address // ), err.INVALID_ROLE_ADDRESS assert // Invalid account role address - // modules/rbac.py:344 + // modules/rbac.py:362 // return self.primary_dealer[role_address] box_get pop - // modules/rbac.py:310 + // modules/rbac.py:328 // @arc4.abimethod(readonly=True) b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9 rbac_get_role_validity_switch_case_1@3: - // modules/rbac.py:337 + // modules/rbac.py:355 // self.account_manager, role_address bytec 23 // 0x523a4d4e4723 - // modules/rbac.py:55 + // modules/rbac.py:57 // return role_address in role_map dig 1 concat dup box_len bury 1 - // modules/rbac.py:336-338 + // modules/rbac.py:354-356 // assert self._has_role( // self.account_manager, role_address // ), err.INVALID_ROLE_ADDRESS assert // Invalid account role address - // modules/rbac.py:339 + // modules/rbac.py:357 // return self.account_manager[role_address] box_get pop - // modules/rbac.py:310 + // modules/rbac.py:328 // @arc4.abimethod(readonly=True) b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9 rbac_get_role_validity_switch_case_0@2: - // modules/rbac.py:332-334 + // modules/rbac.py:350-352 // return typ.RoleValidity( // role_validity_start=UInt64(0), role_validity_end=UInt64(0) // ) pushbytes 0x00000000000000000000000000000000 - // modules/rbac.py:310 + // modules/rbac.py:328 // @arc4.abimethod(readonly=True) b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9 @@ -5254,7 +5249,7 @@ _ensure_units_activated: box_len bury 1 assert // Invalid account holding address - // modules/actus_kernel.py:138 + // modules/actus_kernel.py:135 // return self.status == UInt64(enums.STATUS_PENDING_IED) intc_0 // 0 bytec_1 // "status" @@ -5335,12 +5330,12 @@ _ensure_units_activated_after_if_else@4: // modules.actus_kernel.ActusKernelModule._scaled_mul_div(multiplicand: uint64, multiplier: uint64, divisor: uint64) -> uint64: _scaled_mul_div: - // modules/actus_kernel.py:156-158 + // modules/actus_kernel.py:153-155 // def _scaled_mul_div( // self, multiplicand: UInt64, multiplier: UInt64, divisor: UInt64 // ) -> UInt64: proto 3 1 - // modules/actus_kernel.py:160 + // modules/actus_kernel.py:157 // if multiplicand == UInt64(0) or multiplier == UInt64(0): frame_dig -3 bz _scaled_mul_div_if_body@2 @@ -5348,18 +5343,18 @@ _scaled_mul_div: bnz _scaled_mul_div_after_if_else@3 _scaled_mul_div_if_body@2: - // modules/actus_kernel.py:161 + // modules/actus_kernel.py:158 // return UInt64(0) intc_0 // 0 retsub _scaled_mul_div_after_if_else@3: - // modules/actus_kernel.py:162 + // modules/actus_kernel.py:159 // high, low = op.mulw(multiplicand, multiplier) frame_dig -3 frame_dig -2 mulw - // modules/actus_kernel.py:163 + // modules/actus_kernel.py:160 // return op.divw(high, low, divisor) frame_dig -1 divw @@ -5368,20 +5363,20 @@ _scaled_mul_div_after_if_else@3: // modules.actus_kernel.ActusKernelModule._amount_to_index_delta(amount: uint64) -> uint64: _amount_to_index_delta: - // modules/actus_kernel.py:165 + // modules/actus_kernel.py:162 // def _amount_to_index_delta(self, amount: UInt64) -> UInt64: proto 1 1 - // modules/actus_kernel.py:167 + // modules/actus_kernel.py:164 // if amount == UInt64(0): frame_dig -1 bnz _amount_to_index_delta_after_if_else@2 - // modules/actus_kernel.py:168 + // modules/actus_kernel.py:165 // return UInt64(0) intc_0 // 0 retsub _amount_to_index_delta_after_if_else@2: - // modules/actus_kernel.py:169 + // modules/actus_kernel.py:166 // assert self.total_units > UInt64(0), err.NO_UNITS intc_0 // 0 bytec 13 // "total_units" @@ -5389,7 +5384,7 @@ _amount_to_index_delta_after_if_else@2: assert // check self.total_units exists dup assert // No D-ASA units - // modules/actus_kernel.py:170 + // modules/actus_kernel.py:167 // return self._scaled_mul_div(amount, self.fixed_point_scale, self.total_units) intc_0 // 0 bytec 5 // "fixed_point_scale" @@ -5404,32 +5399,32 @@ _amount_to_index_delta_after_if_else@2: // modules.actus_kernel.ActusKernelModule._index_delta_to_amount(index_delta: uint64) -> uint64: _index_delta_to_amount: - // modules/actus_kernel.py:172 + // modules/actus_kernel.py:169 // def _index_delta_to_amount(self, index_delta: UInt64) -> UInt64: proto 1 1 - // modules/actus_kernel.py:179 + // modules/actus_kernel.py:176 // if index_delta == UInt64(0): frame_dig -1 bnz _index_delta_to_amount_after_if_else@2 - // modules/actus_kernel.py:180 + // modules/actus_kernel.py:177 // return UInt64(0) intc_0 // 0 retsub _index_delta_to_amount_after_if_else@2: - // modules/actus_kernel.py:182 + // modules/actus_kernel.py:179 // self.total_units, intc_0 // 0 bytec 13 // "total_units" app_global_get_ex assert // check self.total_units exists - // modules/actus_kernel.py:184 + // modules/actus_kernel.py:181 // self.fixed_point_scale, intc_0 // 0 bytec 5 // "fixed_point_scale" app_global_get_ex assert // check self.fixed_point_scale exists - // modules/actus_kernel.py:181-185 + // modules/actus_kernel.py:178-182 // return self._scaled_mul_div( // self.total_units, // index_delta, @@ -5443,10 +5438,10 @@ _index_delta_to_amount_after_if_else@2: // modules.actus_kernel.ActusKernelModule._get_schedule_entry(event_id: uint64) -> bytes: _get_schedule_entry: - // modules/actus_kernel.py:205 + // modules/actus_kernel.py:202 // def _get_schedule_entry(self, event_id: UInt64) -> typ.ExecutionScheduleEntry: proto 1 1 - // modules/actus_kernel.py:207 + // modules/actus_kernel.py:204 // assert event_id < self.schedule_entry_count, err.INVALID_EVENT_ID intc_0 // 0 bytec_3 // "schedule_entry_count" @@ -5455,12 +5450,12 @@ _get_schedule_entry: frame_dig -1 > assert // Invalid event id - // modules/actus_kernel.py:193 + // modules/actus_kernel.py:190 // return event_id // UInt64(cst.SCHEDULE_PAGE_SIZE) frame_dig -1 pushint 16 / - // modules/actus_kernel.py:209 + // modules/actus_kernel.py:206 // assert page_index in self.schedule_page, err.INVALID_SCHEDULE_PAGE itob bytec 24 // 0x5323 @@ -5470,12 +5465,12 @@ _get_schedule_entry: box_len bury 1 assert // Invalid schedule page - // modules/actus_kernel.py:197 + // modules/actus_kernel.py:194 // return event_id % UInt64(cst.SCHEDULE_PAGE_SIZE) frame_dig -1 pushint 16 % - // modules/actus_kernel.py:212 + // modules/actus_kernel.py:209 // assert offset < page.length, err.INVALID_SCHEDULE_PAGE dig 1 intc_0 // 0 @@ -5485,7 +5480,7 @@ _get_schedule_entry: dig 1 > assert // Invalid schedule page - // modules/actus_kernel.py:213 + // modules/actus_kernel.py:210 // return page[offset].copy() pushint 65 * @@ -5498,67 +5493,67 @@ _get_schedule_entry: // modules.actus_kernel.ActusKernelModule._assert_event_allowed_for_contract_type(contract_type: uint64, event_type: uint64) -> void: _assert_event_allowed_for_contract_type: - // modules/actus_kernel.py:316-318 + // modules/actus_kernel.py:313-315 // def _assert_event_allowed_for_contract_type( // self, contract_type: UInt64, event_type: UInt64 // ) -> None: proto 2 0 - // modules/actus_kernel.py:257-258 + // modules/actus_kernel.py:254-255 // # Check common events first // if event_type in common_events: frame_dig -1 - // modules/actus_kernel.py:250 + // modules/actus_kernel.py:247 // UInt64(enums.EVT_IED), intc_1 // 1 - // modules/actus_kernel.py:257-258 + // modules/actus_kernel.py:254-255 // # Check common events first // if event_type in common_events: == bnz _assert_event_allowed_for_contract_type_if_body@6 frame_dig -1 - // modules/actus_kernel.py:251 + // modules/actus_kernel.py:248 // UInt64(enums.EVT_IP), intc_2 // 8 - // modules/actus_kernel.py:257-258 + // modules/actus_kernel.py:254-255 // # Check common events first // if event_type in common_events: == bnz _assert_event_allowed_for_contract_type_if_body@6 frame_dig -1 - // modules/actus_kernel.py:252 + // modules/actus_kernel.py:249 // UInt64(enums.EVT_MD), pushint 19 - // modules/actus_kernel.py:257-258 + // modules/actus_kernel.py:254-255 // # Check common events first // if event_type in common_events: == bnz _assert_event_allowed_for_contract_type_if_body@6 frame_dig -1 - // modules/actus_kernel.py:253 + // modules/actus_kernel.py:250 // UInt64(enums.EVT_RR), pushint 12 - // modules/actus_kernel.py:257-258 + // modules/actus_kernel.py:254-255 // # Check common events first // if event_type in common_events: == bnz _assert_event_allowed_for_contract_type_if_body@6 frame_dig -1 - // modules/actus_kernel.py:254 + // modules/actus_kernel.py:251 // UInt64(enums.EVT_RRF), pushint 11 - // modules/actus_kernel.py:257-258 + // modules/actus_kernel.py:254-255 // # Check common events first // if event_type in common_events: == bz _assert_event_allowed_for_contract_type_after_if_else@7 _assert_event_allowed_for_contract_type_if_body@6: - // modules/actus_kernel.py:259 + // modules/actus_kernel.py:256 // return True intc_1 // 1 _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34: - // modules/actus_kernel.py:320-322 + // modules/actus_kernel.py:317-319 // assert self._event_allowed_for_contract_type( // contract_type, event_type // ), err.INVALID_ACTUS_CONFIG @@ -5566,28 +5561,28 @@ _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.Actus retsub _assert_event_allowed_for_contract_type_after_if_else@7: - // modules/actus_kernel.py:261-262 + // modules/actus_kernel.py:258-259 // # Contract-specific additional events // if contract_type == UInt64(enums.CT_PAM): frame_dig -2 bnz _assert_event_allowed_for_contract_type_after_if_else@9 - // modules/actus_kernel.py:263-264 + // modules/actus_kernel.py:260-261 // # PAM only supports common events // return False intc_0 // 0 - // modules/actus_kernel.py:320-322 + // modules/actus_kernel.py:317-319 // assert self._event_allowed_for_contract_type( // contract_type, event_type // ), err.INVALID_ACTUS_CONFIG b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34 _assert_event_allowed_for_contract_type_after_if_else@9: - // modules/actus_kernel.py:266 + // modules/actus_kernel.py:263 // if contract_type == UInt64(enums.CT_LAM) or contract_type == UInt64( frame_dig -2 pushint 3 == - // modules/actus_kernel.py:266-268 + // modules/actus_kernel.py:263-265 // if contract_type == UInt64(enums.CT_LAM) or contract_type == UInt64( // enums.CT_NAM // ): @@ -5598,17 +5593,17 @@ _assert_event_allowed_for_contract_type_after_if_else@9: bz _assert_event_allowed_for_contract_type_after_if_else@16 _assert_event_allowed_for_contract_type_if_body@11: - // modules/actus_kernel.py:269-273 + // modules/actus_kernel.py:266-270 // # LAM/NAM add: PR, IPCB // return event_type in ( // UInt64(enums.EVT_PR), // UInt64(enums.EVT_IPCB), // ) frame_dig -1 - // modules/actus_kernel.py:271 + // modules/actus_kernel.py:268 // UInt64(enums.EVT_PR), pushint 3 - // modules/actus_kernel.py:269-273 + // modules/actus_kernel.py:266-270 // # LAM/NAM add: PR, IPCB // return event_type in ( // UInt64(enums.EVT_PR), @@ -5617,10 +5612,10 @@ _assert_event_allowed_for_contract_type_if_body@11: == bnz _assert_event_allowed_for_contract_type_bool_true@13 frame_dig -1 - // modules/actus_kernel.py:272 + // modules/actus_kernel.py:269 // UInt64(enums.EVT_IPCB), pushint 18 - // modules/actus_kernel.py:269-273 + // modules/actus_kernel.py:266-270 // # LAM/NAM add: PR, IPCB // return event_type in ( // UInt64(enums.EVT_PR), @@ -5631,7 +5626,7 @@ _assert_event_allowed_for_contract_type_if_body@11: _assert_event_allowed_for_contract_type_bool_true@13: intc_1 // 1 - // modules/actus_kernel.py:320-322 + // modules/actus_kernel.py:317-319 // assert self._event_allowed_for_contract_type( // contract_type, event_type // ), err.INVALID_ACTUS_CONFIG @@ -5639,20 +5634,20 @@ _assert_event_allowed_for_contract_type_bool_true@13: _assert_event_allowed_for_contract_type_bool_false@14: intc_0 // 0 - // modules/actus_kernel.py:320-322 + // modules/actus_kernel.py:317-319 // assert self._event_allowed_for_contract_type( // contract_type, event_type // ), err.INVALID_ACTUS_CONFIG b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34 _assert_event_allowed_for_contract_type_after_if_else@16: - // modules/actus_kernel.py:275 + // modules/actus_kernel.py:272 // if contract_type == UInt64(enums.CT_ANN): frame_dig -2 intc_1 // 1 == bz _assert_event_allowed_for_contract_type_after_if_else@23 - // modules/actus_kernel.py:276-281 + // modules/actus_kernel.py:273-278 // # ANN adds: PR, IPCB, PRF // return event_type in ( // UInt64(enums.EVT_PR), @@ -5660,10 +5655,10 @@ _assert_event_allowed_for_contract_type_after_if_else@16: // UInt64(enums.EVT_PRF), // ) frame_dig -1 - // modules/actus_kernel.py:278 + // modules/actus_kernel.py:275 // UInt64(enums.EVT_PR), pushint 3 - // modules/actus_kernel.py:276-281 + // modules/actus_kernel.py:273-278 // # ANN adds: PR, IPCB, PRF // return event_type in ( // UInt64(enums.EVT_PR), @@ -5673,10 +5668,10 @@ _assert_event_allowed_for_contract_type_after_if_else@16: == bnz _assert_event_allowed_for_contract_type_bool_true@20 frame_dig -1 - // modules/actus_kernel.py:279 + // modules/actus_kernel.py:276 // UInt64(enums.EVT_IPCB), pushint 18 - // modules/actus_kernel.py:276-281 + // modules/actus_kernel.py:273-278 // # ANN adds: PR, IPCB, PRF // return event_type in ( // UInt64(enums.EVT_PR), @@ -5686,10 +5681,10 @@ _assert_event_allowed_for_contract_type_after_if_else@16: == bnz _assert_event_allowed_for_contract_type_bool_true@20 frame_dig -1 - // modules/actus_kernel.py:280 + // modules/actus_kernel.py:277 // UInt64(enums.EVT_PRF), pushint 5 - // modules/actus_kernel.py:276-281 + // modules/actus_kernel.py:273-278 // # ANN adds: PR, IPCB, PRF // return event_type in ( // UInt64(enums.EVT_PR), @@ -5701,7 +5696,7 @@ _assert_event_allowed_for_contract_type_after_if_else@16: _assert_event_allowed_for_contract_type_bool_true@20: intc_1 // 1 - // modules/actus_kernel.py:320-322 + // modules/actus_kernel.py:317-319 // assert self._event_allowed_for_contract_type( // contract_type, event_type // ), err.INVALID_ACTUS_CONFIG @@ -5709,20 +5704,20 @@ _assert_event_allowed_for_contract_type_bool_true@20: _assert_event_allowed_for_contract_type_bool_false@21: intc_0 // 0 - // modules/actus_kernel.py:320-322 + // modules/actus_kernel.py:317-319 // assert self._event_allowed_for_contract_type( // contract_type, event_type // ), err.INVALID_ACTUS_CONFIG b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34 _assert_event_allowed_for_contract_type_after_if_else@23: - // modules/actus_kernel.py:283 + // modules/actus_kernel.py:280 // if contract_type == UInt64(enums.CT_LAX): frame_dig -2 pushint 4 == bz _assert_event_allowed_for_contract_type_after_if_else@31 - // modules/actus_kernel.py:284-290 + // modules/actus_kernel.py:281-287 // # LAX adds: PR, PI, IPCB, PRF // return event_type in ( // UInt64(enums.EVT_PR), @@ -5731,10 +5726,10 @@ _assert_event_allowed_for_contract_type_after_if_else@23: // UInt64(enums.EVT_PRF), // ) frame_dig -1 - // modules/actus_kernel.py:286 + // modules/actus_kernel.py:283 // UInt64(enums.EVT_PR), pushint 3 - // modules/actus_kernel.py:284-290 + // modules/actus_kernel.py:281-287 // # LAX adds: PR, PI, IPCB, PRF // return event_type in ( // UInt64(enums.EVT_PR), @@ -5745,10 +5740,10 @@ _assert_event_allowed_for_contract_type_after_if_else@23: == bnz _assert_event_allowed_for_contract_type_bool_true@28 frame_dig -1 - // modules/actus_kernel.py:287 + // modules/actus_kernel.py:284 // UInt64(enums.EVT_PI), pushint 4 - // modules/actus_kernel.py:284-290 + // modules/actus_kernel.py:281-287 // # LAX adds: PR, PI, IPCB, PRF // return event_type in ( // UInt64(enums.EVT_PR), @@ -5759,10 +5754,10 @@ _assert_event_allowed_for_contract_type_after_if_else@23: == bnz _assert_event_allowed_for_contract_type_bool_true@28 frame_dig -1 - // modules/actus_kernel.py:288 + // modules/actus_kernel.py:285 // UInt64(enums.EVT_IPCB), pushint 18 - // modules/actus_kernel.py:284-290 + // modules/actus_kernel.py:281-287 // # LAX adds: PR, PI, IPCB, PRF // return event_type in ( // UInt64(enums.EVT_PR), @@ -5773,10 +5768,10 @@ _assert_event_allowed_for_contract_type_after_if_else@23: == bnz _assert_event_allowed_for_contract_type_bool_true@28 frame_dig -1 - // modules/actus_kernel.py:289 + // modules/actus_kernel.py:286 // UInt64(enums.EVT_PRF), pushint 5 - // modules/actus_kernel.py:284-290 + // modules/actus_kernel.py:281-287 // # LAX adds: PR, PI, IPCB, PRF // return event_type in ( // UInt64(enums.EVT_PR), @@ -5789,7 +5784,7 @@ _assert_event_allowed_for_contract_type_after_if_else@23: _assert_event_allowed_for_contract_type_bool_true@28: intc_1 // 1 - // modules/actus_kernel.py:320-322 + // modules/actus_kernel.py:317-319 // assert self._event_allowed_for_contract_type( // contract_type, event_type // ), err.INVALID_ACTUS_CONFIG @@ -5797,36 +5792,36 @@ _assert_event_allowed_for_contract_type_bool_true@28: _assert_event_allowed_for_contract_type_bool_false@29: intc_0 // 0 - // modules/actus_kernel.py:320-322 + // modules/actus_kernel.py:317-319 // assert self._event_allowed_for_contract_type( // contract_type, event_type // ), err.INVALID_ACTUS_CONFIG b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34 _assert_event_allowed_for_contract_type_after_if_else@31: - // modules/actus_kernel.py:292 + // modules/actus_kernel.py:289 // if contract_type == UInt64(enums.CT_CLM): frame_dig -2 pushint 5 == bz _assert_event_allowed_for_contract_type_after_if_else@33 - // modules/actus_kernel.py:293-294 + // modules/actus_kernel.py:290-291 // # CLM adds: PR // return event_type == UInt64(enums.EVT_PR) frame_dig -1 pushint 3 == - // modules/actus_kernel.py:320-322 + // modules/actus_kernel.py:317-319 // assert self._event_allowed_for_contract_type( // contract_type, event_type // ), err.INVALID_ACTUS_CONFIG b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34 _assert_event_allowed_for_contract_type_after_if_else@33: - // modules/actus_kernel.py:296 + // modules/actus_kernel.py:293 // return False intc_0 // 0 - // modules/actus_kernel.py:320-322 + // modules/actus_kernel.py:317-319 // assert self._event_allowed_for_contract_type( // contract_type, event_type // ), err.INVALID_ACTUS_CONFIG @@ -5835,7 +5830,7 @@ _assert_event_allowed_for_contract_type_after_if_else@33: // modules.actus_kernel.ActusKernelModule._is_dynamic_annuity() -> uint64: _is_dynamic_annuity: - // modules/actus_kernel.py:338 + // modules/actus_kernel.py:335 // self.contract_type == UInt64(enums.CT_ANN) intc_0 // 0 bytec 10 // "contract_type" @@ -5843,22 +5838,22 @@ _is_dynamic_annuity: assert // check self.contract_type exists intc_1 // 1 == - // modules/actus_kernel.py:338-339 + // modules/actus_kernel.py:335-336 // self.contract_type == UInt64(enums.CT_ANN) // and self.dynamic_principal_redemption bz _is_dynamic_annuity_bool_false@3 - // modules/actus_kernel.py:339 + // modules/actus_kernel.py:336 // and self.dynamic_principal_redemption intc_0 // 0 - bytec 34 // "dynamic_principal_redemption" + bytec 35 // "dynamic_principal_redemption" app_global_get_ex assert // check self.dynamic_principal_redemption exists - // modules/actus_kernel.py:338-339 + // modules/actus_kernel.py:335-336 // self.contract_type == UInt64(enums.CT_ANN) // and self.dynamic_principal_redemption bz _is_dynamic_annuity_bool_false@3 intc_1 // 1 - // modules/actus_kernel.py:337-340 + // modules/actus_kernel.py:334-337 // return ( // self.contract_type == UInt64(enums.CT_ANN) // and self.dynamic_principal_redemption @@ -5867,7 +5862,7 @@ _is_dynamic_annuity: _is_dynamic_annuity_bool_false@3: intc_0 // 0 - // modules/actus_kernel.py:337-340 + // modules/actus_kernel.py:334-337 // return ( // self.contract_type == UInt64(enums.CT_ANN) // and self.dynamic_principal_redemption @@ -5877,45 +5872,45 @@ _is_dynamic_annuity_bool_false@3: // modules.actus_kernel.ActusKernelModule._entry_interest_segment(entry: bytes) -> uint64, bytes: _entry_interest_segment: - // modules/actus_kernel.py:383 + // modules/actus_kernel.py:380 // def _entry_interest_segment(self, entry: typ.ExecutionScheduleEntry) -> UInt64: proto 1 2 - // modules/actus_kernel.py:392 + // modules/actus_kernel.py:389 // entry.accrual_factor == UInt64(0) frame_dig -1 pushint 17 extract_uint64 dup - // modules/actus_kernel.py:392-394 + // modules/actus_kernel.py:389-391 // entry.accrual_factor == UInt64(0) // or self.nominal_interest_rate == UInt64(0) // or self.interest_calculation_base == UInt64(0) bz _entry_interest_segment_if_body@3 - // modules/actus_kernel.py:393 + // modules/actus_kernel.py:390 // or self.nominal_interest_rate == UInt64(0) intc_0 // 0 bytec 9 // "nominal_interest_rate" app_global_get_ex assert // check self.nominal_interest_rate exists - // modules/actus_kernel.py:392-394 + // modules/actus_kernel.py:389-391 // entry.accrual_factor == UInt64(0) // or self.nominal_interest_rate == UInt64(0) // or self.interest_calculation_base == UInt64(0) bz _entry_interest_segment_if_body@3 - // modules/actus_kernel.py:394 + // modules/actus_kernel.py:391 // or self.interest_calculation_base == UInt64(0) intc_0 // 0 bytec 7 // "interest_calculation_base" app_global_get_ex assert // check self.interest_calculation_base exists - // modules/actus_kernel.py:392-394 + // modules/actus_kernel.py:389-391 // entry.accrual_factor == UInt64(0) // or self.nominal_interest_rate == UInt64(0) // or self.interest_calculation_base == UInt64(0) bnz _entry_interest_segment_after_if_else@4 _entry_interest_segment_if_body@3: - // modules/actus_kernel.py:396 + // modules/actus_kernel.py:393 // return UInt64(0) intc_0 // 0 frame_dig -1 @@ -5923,38 +5918,38 @@ _entry_interest_segment_if_body@3: retsub _entry_interest_segment_after_if_else@4: - // modules/actus_kernel.py:398 + // modules/actus_kernel.py:395 // self.interest_calculation_base, intc_0 // 0 bytec 7 // "interest_calculation_base" app_global_get_ex assert // check self.interest_calculation_base exists - // modules/actus_kernel.py:399 + // modules/actus_kernel.py:396 // self.nominal_interest_rate, intc_0 // 0 bytec 9 // "nominal_interest_rate" app_global_get_ex assert // check self.nominal_interest_rate exists - // modules/actus_kernel.py:400 + // modules/actus_kernel.py:397 // self.fixed_point_scale, intc_0 // 0 bytec 5 // "fixed_point_scale" app_global_get_ex assert // check self.fixed_point_scale exists - // modules/actus_kernel.py:397-401 + // modules/actus_kernel.py:394-398 // accrued = self._scaled_mul_div( // self.interest_calculation_base, // self.nominal_interest_rate, // self.fixed_point_scale, // ) callsub _scaled_mul_div - // modules/actus_kernel.py:405 + // modules/actus_kernel.py:402 // self.fixed_point_scale, intc_0 // 0 bytec 5 // "fixed_point_scale" app_global_get_ex assert // check self.fixed_point_scale exists - // modules/actus_kernel.py:402-406 + // modules/actus_kernel.py:399-403 // return self._scaled_mul_div( // accrued, // entry.accrual_factor, @@ -5970,36 +5965,36 @@ _entry_interest_segment_after_if_else@4: // modules.actus_kernel.ActusKernelModule._discount_annuity_factor(discount_factor: uint64, redemption_factor: uint64) -> uint64: _discount_annuity_factor: - // modules/actus_kernel.py:465-469 + // modules/actus_kernel.py:462-466 // def _discount_annuity_factor( // self, // discount_factor: UInt64, // redemption_factor: UInt64, // ) -> UInt64: proto 2 1 - // modules/actus_kernel.py:471 + // modules/actus_kernel.py:468 // if redemption_factor == UInt64(0): frame_dig -1 bnz _discount_annuity_factor_after_if_else@2 - // modules/actus_kernel.py:472 + // modules/actus_kernel.py:469 // return discount_factor frame_dig -2 retsub _discount_annuity_factor_after_if_else@2: - // modules/actus_kernel.py:473 + // modules/actus_kernel.py:470 // period_rate = self.fixed_point_scale + self._scaled_mul_div( intc_0 // 0 bytec 5 // "fixed_point_scale" app_global_get_ex assert // check self.fixed_point_scale exists - // modules/actus_kernel.py:474 + // modules/actus_kernel.py:471 // self.nominal_interest_rate, intc_0 // 0 bytec 9 // "nominal_interest_rate" app_global_get_ex assert // check self.nominal_interest_rate exists - // modules/actus_kernel.py:473-477 + // modules/actus_kernel.py:470-474 // period_rate = self.fixed_point_scale + self._scaled_mul_div( // self.nominal_interest_rate, // redemption_factor, @@ -6009,17 +6004,17 @@ _discount_annuity_factor_after_if_else@2: dig 2 callsub _scaled_mul_div + - // modules/actus_kernel.py:478 + // modules/actus_kernel.py:475 // assert period_rate > UInt64(0), err.INVALID_ACTUS_CONFIG dup assert // Invalid ACTUS configuration - // modules/actus_kernel.py:481 + // modules/actus_kernel.py:478 // self.fixed_point_scale, intc_0 // 0 bytec 5 // "fixed_point_scale" app_global_get_ex assert // check self.fixed_point_scale exists - // modules/actus_kernel.py:479-483 + // modules/actus_kernel.py:476-480 // return self._scaled_mul_div( // discount_factor, // self.fixed_point_scale, @@ -6034,7 +6029,7 @@ _discount_annuity_factor_after_if_else@2: // modules.actus_kernel.ActusKernelModule._apply_non_cash_schedule_entry(entry: bytes, payload: bytes) -> bytes, bytes: _apply_non_cash_schedule_entry: - // modules/actus_kernel.py:616-618 + // modules/actus_kernel.py:613-615 // def _apply_non_cash_schedule_entry( // self, entry: typ.ExecutionScheduleEntry, payload: typ.ObservedEventRequest // ) -> None: @@ -6042,7 +6037,7 @@ _apply_non_cash_schedule_entry: intc_0 // 0 pushbytes "" dupn 8 - // modules/actus_kernel.py:626 + // modules/actus_kernel.py:623 // assert entry.event_id == self.event_cursor, err.INVALID_EVENT_CURSOR frame_dig -2 intc_0 // 0 @@ -6053,7 +6048,7 @@ _apply_non_cash_schedule_entry: assert // check self.event_cursor exists == assert // Invalid event cursor - // modules/actus_kernel.py:627 + // modules/actus_kernel.py:624 // assert entry.scheduled_time <= Global.latest_timestamp, err.NO_DUE_CASHFLOW frame_dig -2 pushint 9 @@ -6061,19 +6056,19 @@ _apply_non_cash_schedule_entry: global LatestTimestamp <= assert // No due cashflow to pay - // modules/actus_kernel.py:629 + // modules/actus_kernel.py:626 // event_type = entry.event_type.as_uint64() frame_dig -2 intc_2 // 8 getbyte dup - // modules/actus_kernel.py:630 + // modules/actus_kernel.py:627 // if event_type == UInt64(enums.EVT_IED): intc_1 // 1 == dup bz _apply_non_cash_schedule_entry_after_if_else@6 - // modules/actus_kernel.py:138 + // modules/actus_kernel.py:135 // return self.status == UInt64(enums.STATUS_PENDING_IED) intc_0 // 0 bytec_1 // "status" @@ -6081,12 +6076,12 @@ _apply_non_cash_schedule_entry: assert // check self.status exists pushint 50 == - // modules/actus_kernel.py:631-633 + // modules/actus_kernel.py:628-630 // # IED finalizes issuance: reserved units become activatable and the // # schedule's initial contractual state becomes live. // assert self._status_is_pending_ied(), err.INVALID_ACTUS_CONFIG assert // Invalid ACTUS configuration - // modules/actus_kernel.py:635 + // modules/actus_kernel.py:632 // self.reserved_units_total == self.total_units intc_0 // 0 bytec 11 // "reserved_units_total" @@ -6097,12 +6092,12 @@ _apply_non_cash_schedule_entry: app_global_get_ex assert // check self.total_units exists == - // modules/actus_kernel.py:634-636 + // modules/actus_kernel.py:631-633 // assert ( // self.reserved_units_total == self.total_units // ), err.PRIMARY_DISTRIBUTION_INCOMPLETE assert // Primary distribution is not complete - // modules/actus_kernel.py:637 + // modules/actus_kernel.py:634 // self.outstanding_principal = entry.next_outstanding_principal frame_dig -2 pushint 49 @@ -6110,12 +6105,12 @@ _apply_non_cash_schedule_entry: bytec 4 // "outstanding_principal" dig 1 app_global_put - // modules/actus_kernel.py:638 + // modules/actus_kernel.py:635 // self.interest_calculation_base = entry.next_outstanding_principal bytec 7 // "interest_calculation_base" swap app_global_put - // modules/actus_kernel.py:639 + // modules/actus_kernel.py:636 // self.nominal_interest_rate = entry.next_nominal_interest_rate frame_dig -2 pushint 33 @@ -6123,12 +6118,12 @@ _apply_non_cash_schedule_entry: bytec 9 // "nominal_interest_rate" swap app_global_put - // modules/actus_kernel.py:640 + // modules/actus_kernel.py:637 // self.accrued_interest = UInt64(0) bytec 6 // "accrued_interest" intc_0 // 0 app_global_put - // modules/actus_kernel.py:641 + // modules/actus_kernel.py:638 // self.next_principal_redemption = entry.next_principal_redemption frame_dig -2 pushint 41 @@ -6136,7 +6131,7 @@ _apply_non_cash_schedule_entry: bytec 14 // "next_principal_redemption" swap app_global_put - // modules/actus_kernel.py:642 + // modules/actus_kernel.py:639 // self.event_cursor += UInt64(1) intc_0 // 0 bytec_2 // "event_cursor" @@ -6147,22 +6142,22 @@ _apply_non_cash_schedule_entry: bytec_2 // "event_cursor" swap app_global_put - // modules/actus_kernel.py:643 + // modules/actus_kernel.py:640 // self.status = UInt64(enums.STATUS_ACTIVE) bytec_1 // "status" pushint 100 app_global_put - // modules/actus_kernel.py:454 + // modules/actus_kernel.py:451 // assert entry.event_type.as_uint64() == UInt64(enums.EVT_IED), err.NOT_EVT_IED frame_dig 11 assert // Not IED event - // modules/actus_kernel.py:455 + // modules/actus_kernel.py:452 // return self.initial_exchange_amount intc_0 // 0 bytec 20 // "initial_exchange_amount" app_global_get_ex assert // check self.initial_exchange_amount exists - // modules/actus_kernel.py:644-648 + // modules/actus_kernel.py:641-645 // self._emit_execution_event( // entry=entry, // payoff=self._entry_ied_amount(entry), @@ -6170,10 +6165,10 @@ _apply_non_cash_schedule_entry: // ) frame_dig -2 swap - // modules/actus_kernel.py:647 + // modules/actus_kernel.py:644 // settled_amount=UInt64(0), intc_0 // 0 - // modules/actus_kernel.py:644-648 + // modules/actus_kernel.py:641-645 // self._emit_execution_event( // entry=entry, // payoff=self._entry_ied_amount(entry), @@ -6182,7 +6177,7 @@ _apply_non_cash_schedule_entry: callsub _emit_execution_event dup frame_bury -2 - // modules/actus_kernel.py:649 + // modules/actus_kernel.py:646 // return frame_dig -1 frame_bury 1 @@ -6190,7 +6185,7 @@ _apply_non_cash_schedule_entry: retsub _apply_non_cash_schedule_entry_after_if_else@6: - // modules/actus_kernel.py:138 + // modules/actus_kernel.py:135 // return self.status == UInt64(enums.STATUS_PENDING_IED) intc_0 // 0 bytec_1 // "status" @@ -6198,11 +6193,11 @@ _apply_non_cash_schedule_entry_after_if_else@6: assert // check self.status exists pushint 50 == - // modules/actus_kernel.py:150 + // modules/actus_kernel.py:147 // assert not self._status_is_pending_ied(), err.PENDING_IED ! assert // IED not yet executed - // modules/actus_kernel.py:652 + // modules/actus_kernel.py:649 // self.accrued_interest += self._entry_interest_segment(entry) intc_0 // 0 bytec 6 // "accrued_interest" @@ -6215,30 +6210,30 @@ _apply_non_cash_schedule_entry_after_if_else@6: bytec 6 // "accrued_interest" swap app_global_put - // modules/actus_kernel.py:654 + // modules/actus_kernel.py:651 // if event_type == UInt64(enums.EVT_RR): frame_dig 10 pushint 12 == bz _apply_non_cash_schedule_entry_else_body@10 - // modules/actus_kernel.py:658 + // modules/actus_kernel.py:655 // payload.observed_rate, frame_dig -1 pushint 33 extract_uint64 - // modules/actus_kernel.py:659 + // modules/actus_kernel.py:656 // self.rate_reset_multiplier, intc_0 // 0 - bytec 36 // "rate_reset_multiplier" + bytec 37 // "rate_reset_multiplier" app_global_get_ex assert // check self.rate_reset_multiplier exists - // modules/actus_kernel.py:660 + // modules/actus_kernel.py:657 // self.fixed_point_scale, intc_0 // 0 bytec 5 // "fixed_point_scale" app_global_get_ex assert // check self.fixed_point_scale exists - // modules/actus_kernel.py:655-661 + // modules/actus_kernel.py:652-658 // # RR derives the next rate from an observed oracle value plus the // # contract spread / multiplier terms, then enforces floor and cap. // observed_rate = self._scaled_mul_div( @@ -6247,18 +6242,18 @@ _apply_non_cash_schedule_entry_after_if_else@6: // self.fixed_point_scale, // ) callsub _scaled_mul_div - // modules/actus_kernel.py:663 + // modules/actus_kernel.py:660 // observed_rate + self.rate_reset_spread intc_0 // 0 - bytec 35 // "rate_reset_spread" + bytec 36 // "rate_reset_spread" app_global_get_ex assert // check self.rate_reset_spread exists + frame_bury 6 - // modules/actus_kernel.py:744 + // modules/actus_kernel.py:741 // if self.has_rate_reset_floor and rate < self.rate_reset_floor: intc_0 // 0 - bytec 38 // "has_rate_reset_floor" + bytec 39 // "has_rate_reset_floor" app_global_get_ex assert // check self.has_rate_reset_floor exists bz _apply_non_cash_schedule_entry_after_if_else@55 @@ -6269,7 +6264,7 @@ _apply_non_cash_schedule_entry_after_if_else@6: frame_dig 6 > bz _apply_non_cash_schedule_entry_after_if_else@55 - // modules/actus_kernel.py:745 + // modules/actus_kernel.py:742 // rate = self.rate_reset_floor intc_0 // 0 bytec 31 // "rate_reset_floor" @@ -6279,10 +6274,10 @@ _apply_non_cash_schedule_entry_after_if_else@6: assert // check self.rate_reset_floor exists _apply_non_cash_schedule_entry_after_if_else@55: - // modules/actus_kernel.py:746 + // modules/actus_kernel.py:743 // if self.has_rate_reset_cap and rate > self.rate_reset_cap: intc_0 // 0 - bytec 39 // "has_rate_reset_cap" + bytec 40 // "has_rate_reset_cap" app_global_get_ex assert // check self.has_rate_reset_cap exists bz _apply_non_cash_schedule_entry_after_if_else@58 @@ -6293,7 +6288,7 @@ _apply_non_cash_schedule_entry_after_if_else@55: frame_dig 6 < bz _apply_non_cash_schedule_entry_after_if_else@58 - // modules/actus_kernel.py:747 + // modules/actus_kernel.py:744 // rate = self.rate_reset_cap intc_0 // 0 bytec 32 // "rate_reset_cap" @@ -6303,10 +6298,10 @@ _apply_non_cash_schedule_entry_after_if_else@55: assert // check self.rate_reset_cap exists _apply_non_cash_schedule_entry_after_if_else@58: - // modules/actus_kernel.py:662 + // modules/actus_kernel.py:659 // self.nominal_interest_rate = self._clamp_rate( bytec 9 // "nominal_interest_rate" - // modules/actus_kernel.py:662-664 + // modules/actus_kernel.py:659-661 // self.nominal_interest_rate = self._clamp_rate( // observed_rate + self.rate_reset_spread // ) @@ -6314,13 +6309,13 @@ _apply_non_cash_schedule_entry_after_if_else@58: app_global_put _apply_non_cash_schedule_entry_after_if_else@18: - // modules/actus_kernel.py:674 + // modules/actus_kernel.py:671 // if event_type == UInt64(enums.EVT_PI): frame_dig 10 pushint 4 == bz _apply_non_cash_schedule_entry_else_body@20 - // modules/actus_kernel.py:675 + // modules/actus_kernel.py:672 // self.outstanding_principal = entry.next_outstanding_principal frame_dig -2 pushint 49 @@ -6328,24 +6323,24 @@ _apply_non_cash_schedule_entry_after_if_else@18: bytec 4 // "outstanding_principal" dig 1 app_global_put - // modules/actus_kernel.py:676 + // modules/actus_kernel.py:673 // self.interest_calculation_base = entry.next_outstanding_principal bytec 7 // "interest_calculation_base" swap app_global_put _apply_non_cash_schedule_entry_after_if_else@23: - // modules/actus_kernel.py:681 + // modules/actus_kernel.py:678 // if self._is_dynamic_annuity(): callsub _is_dynamic_annuity bz _apply_non_cash_schedule_entry_else_body@29 - // modules/actus_kernel.py:682 + // modules/actus_kernel.py:679 // if event_type == UInt64(enums.EVT_PRF): frame_dig 10 pushint 5 == bz _apply_non_cash_schedule_entry_after_if_else@30 - // modules/actus_kernel.py:686 + // modules/actus_kernel.py:683 // + (self.schedule_entry_count - self.event_cursor) intc_0 // 0 bytec_3 // "schedule_entry_count" @@ -6356,22 +6351,22 @@ _apply_non_cash_schedule_entry_after_if_else@23: app_global_get_ex assert // check self.event_cursor exists - - // modules/actus_kernel.py:687 + // modules/actus_kernel.py:684 // * UInt64(cst.OP_UP_NON_CASH_PER_ENTRY_BUDGET) pushint 100 - // modules/actus_kernel.py:686-687 + // modules/actus_kernel.py:683-684 // + (self.schedule_entry_count - self.event_cursor) // * UInt64(cst.OP_UP_NON_CASH_PER_ENTRY_BUDGET) * - // modules/actus_kernel.py:685 + // modules/actus_kernel.py:682 // UInt64(cst.OP_UP_NON_CASH_BASE_BUDGET) intc 4 // 1500 - // modules/actus_kernel.py:685-687 + // modules/actus_kernel.py:682-684 // UInt64(cst.OP_UP_NON_CASH_BASE_BUDGET) // + (self.schedule_entry_count - self.event_cursor) // * UInt64(cst.OP_UP_NON_CASH_PER_ENTRY_BUDGET) + - // modules/actus_kernel.py:683-689 + // modules/actus_kernel.py:680-686 // ensure_budget( // required_budget=( // UInt64(cst.OP_UP_NON_CASH_BASE_BUDGET) @@ -6381,7 +6376,7 @@ _apply_non_cash_schedule_entry_after_if_else@23: // ) intc_0 // 0 callsub ensure_budget - // modules/actus_kernel.py:493 + // modules/actus_kernel.py:490 // discount_factor = self.fixed_point_scale intc_0 // 0 bytec 5 // "fixed_point_scale" @@ -6389,15 +6384,15 @@ _apply_non_cash_schedule_entry_after_if_else@23: swap frame_bury 2 assert // check self.fixed_point_scale exists - // modules/actus_kernel.py:494 + // modules/actus_kernel.py:491 // denominator = UInt64(0) intc_0 // 0 frame_bury 1 - // modules/actus_kernel.py:495 + // modules/actus_kernel.py:492 // skip_first_redemption = False intc_0 // 0 frame_bury 7 - // modules/actus_kernel.py:497 + // modules/actus_kernel.py:494 // if entry.redemption_accrual_factor > UInt64(0): frame_dig -2 pushint 25 @@ -6405,7 +6400,7 @@ _apply_non_cash_schedule_entry_after_if_else@23: dup frame_bury 8 bz _apply_non_cash_schedule_entry_after_if_else@35 - // modules/actus_kernel.py:498-502 + // modules/actus_kernel.py:495-499 // # An initial PRF may describe the first redemption period directly. // discount_factor = self._discount_annuity_factor( // discount_factor, @@ -6416,14 +6411,14 @@ _apply_non_cash_schedule_entry_after_if_else@23: callsub _discount_annuity_factor dup frame_bury 2 - // modules/actus_kernel.py:504 + // modules/actus_kernel.py:501 // skip_first_redemption = True intc_1 // 1 frame_bury 7 frame_bury 1 _apply_non_cash_schedule_entry_after_if_else@35: - // modules/actus_kernel.py:506 + // modules/actus_kernel.py:503 // future_event_id = self.event_cursor + UInt64(1) intc_0 // 0 bytec_2 // "event_cursor" @@ -6434,7 +6429,7 @@ _apply_non_cash_schedule_entry_after_if_else@35: frame_bury 3 _apply_non_cash_schedule_entry_while_top@36: - // modules/actus_kernel.py:507 + // modules/actus_kernel.py:504 // while future_event_id < self.schedule_entry_count: intc_0 // 0 bytec_3 // "schedule_entry_count" @@ -6443,45 +6438,45 @@ _apply_non_cash_schedule_entry_while_top@36: frame_dig 3 > bz _apply_non_cash_schedule_entry_after_while@48 - // modules/actus_kernel.py:508 + // modules/actus_kernel.py:505 // future_entry = self._get_schedule_entry(future_event_id) frame_dig 3 callsub _get_schedule_entry dup frame_bury 0 - // modules/actus_kernel.py:509 + // modules/actus_kernel.py:506 // future_event_type = future_entry.event_type.as_uint64() intc_2 // 8 getbyte dup frame_bury 4 - // modules/actus_kernel.py:510-511 + // modules/actus_kernel.py:507-508 // # Only redemption-bearing events contribute to the annuity denominator. // is_redemption_event = future_event_type == UInt64(enums.EVT_PR) or ( pushint 3 == - // modules/actus_kernel.py:510-514 + // modules/actus_kernel.py:507-511 // # Only redemption-bearing events contribute to the annuity denominator. // is_redemption_event = future_event_type == UInt64(enums.EVT_PR) or ( // future_event_type == UInt64(enums.EVT_MD) // and future_entry.redemption_accrual_factor > UInt64(0) // ) bnz _apply_non_cash_schedule_entry_bool_true@40 - // modules/actus_kernel.py:512 + // modules/actus_kernel.py:509 // future_event_type == UInt64(enums.EVT_MD) frame_dig 4 pushint 19 == - // modules/actus_kernel.py:512-513 + // modules/actus_kernel.py:509-510 // future_event_type == UInt64(enums.EVT_MD) // and future_entry.redemption_accrual_factor > UInt64(0) bz _apply_non_cash_schedule_entry_bool_false@41 - // modules/actus_kernel.py:513 + // modules/actus_kernel.py:510 // and future_entry.redemption_accrual_factor > UInt64(0) frame_dig 0 pushint 25 extract_uint64 - // modules/actus_kernel.py:512-513 + // modules/actus_kernel.py:509-510 // future_event_type == UInt64(enums.EVT_MD) // and future_entry.redemption_accrual_factor > UInt64(0) bz _apply_non_cash_schedule_entry_bool_false@41 @@ -6490,20 +6485,20 @@ _apply_non_cash_schedule_entry_bool_true@40: intc_1 // 1 _apply_non_cash_schedule_entry_bool_merge@42: - // modules/actus_kernel.py:515 + // modules/actus_kernel.py:512 // if is_redemption_event: bz _apply_non_cash_schedule_entry_after_if_else@47 - // modules/actus_kernel.py:516 + // modules/actus_kernel.py:513 // if skip_first_redemption: frame_dig 7 bz _apply_non_cash_schedule_entry_else_body@45 - // modules/actus_kernel.py:517 + // modules/actus_kernel.py:514 // skip_first_redemption = False intc_0 // 0 frame_bury 7 _apply_non_cash_schedule_entry_after_if_else@47: - // modules/actus_kernel.py:524 + // modules/actus_kernel.py:521 // future_event_id += UInt64(1) frame_dig 3 intc_1 // 1 @@ -6512,12 +6507,12 @@ _apply_non_cash_schedule_entry_after_if_else@47: b _apply_non_cash_schedule_entry_while_top@36 _apply_non_cash_schedule_entry_else_body@45: - // modules/actus_kernel.py:521 + // modules/actus_kernel.py:518 // future_entry.redemption_accrual_factor, frame_dig 0 pushint 25 extract_uint64 - // modules/actus_kernel.py:519-522 + // modules/actus_kernel.py:516-519 // discount_factor = self._discount_annuity_factor( // discount_factor, // future_entry.redemption_accrual_factor, @@ -6527,7 +6522,7 @@ _apply_non_cash_schedule_entry_else_body@45: callsub _discount_annuity_factor dup frame_bury 2 - // modules/actus_kernel.py:523 + // modules/actus_kernel.py:520 // denominator += discount_factor frame_dig 1 + @@ -6539,17 +6534,17 @@ _apply_non_cash_schedule_entry_bool_false@41: b _apply_non_cash_schedule_entry_bool_merge@42 _apply_non_cash_schedule_entry_after_while@48: - // modules/actus_kernel.py:526 + // modules/actus_kernel.py:523 // assert denominator > UInt64(0), err.INVALID_ACTUS_CONFIG frame_dig 1 assert // Invalid ACTUS configuration - // modules/actus_kernel.py:527 + // modules/actus_kernel.py:524 // numerator = self.outstanding_principal intc_0 // 0 bytec 4 // "outstanding_principal" app_global_get_ex assert // check self.outstanding_principal exists - // modules/actus_kernel.py:528 + // modules/actus_kernel.py:525 // if entry.flags & UInt64(enums.FLAG_INITIAL_PRF) == UInt64(0): frame_dig -2 pushint 57 @@ -6557,7 +6552,7 @@ _apply_non_cash_schedule_entry_after_while@48: intc_2 // 8 & bnz _apply_non_cash_schedule_entry_after_if_else@50 - // modules/actus_kernel.py:529-530 + // modules/actus_kernel.py:526-527 // # Subsequent PRF events amortize both principal and already accrued carry. // numerator += self.accrued_interest intc_0 // 0 @@ -6567,13 +6562,13 @@ _apply_non_cash_schedule_entry_after_while@48: + _apply_non_cash_schedule_entry_after_if_else@50: - // modules/actus_kernel.py:533 + // modules/actus_kernel.py:530 // self.fixed_point_scale, intc_0 // 0 bytec 5 // "fixed_point_scale" app_global_get_ex assert // check self.fixed_point_scale exists - // modules/actus_kernel.py:531-535 + // modules/actus_kernel.py:528-532 // return self._scaled_mul_div( // numerator, // self.fixed_point_scale, @@ -6581,10 +6576,10 @@ _apply_non_cash_schedule_entry_after_if_else@50: // ) frame_dig 1 callsub _scaled_mul_div - // modules/actus_kernel.py:690 + // modules/actus_kernel.py:687 // self.next_principal_redemption = self._recalculate_annuity_payment( bytec 14 // "next_principal_redemption" - // modules/actus_kernel.py:690-692 + // modules/actus_kernel.py:687-689 // self.next_principal_redemption = self._recalculate_annuity_payment( // entry // ) @@ -6592,7 +6587,7 @@ _apply_non_cash_schedule_entry_after_if_else@50: app_global_put _apply_non_cash_schedule_entry_after_if_else@30: - // modules/actus_kernel.py:695 + // modules/actus_kernel.py:692 // self.event_cursor += UInt64(1) intc_0 // 0 bytec_2 // "event_cursor" @@ -6603,20 +6598,20 @@ _apply_non_cash_schedule_entry_after_if_else@30: bytec_2 // "event_cursor" swap app_global_put - // modules/actus_kernel.py:696-700 + // modules/actus_kernel.py:693-697 // self._emit_execution_event( // entry=entry, // payoff=UInt64(0), // settled_amount=UInt64(0), // ) frame_dig -2 - // modules/actus_kernel.py:698 + // modules/actus_kernel.py:695 // payoff=UInt64(0), intc_0 // 0 - // modules/actus_kernel.py:699 + // modules/actus_kernel.py:696 // settled_amount=UInt64(0), dup - // modules/actus_kernel.py:696-700 + // modules/actus_kernel.py:693-697 // self._emit_execution_event( // entry=entry, // payoff=UInt64(0), @@ -6631,7 +6626,7 @@ _apply_non_cash_schedule_entry_after_if_else@30: retsub _apply_non_cash_schedule_entry_else_body@29: - // modules/actus_kernel.py:694 + // modules/actus_kernel.py:691 // self.next_principal_redemption = entry.next_principal_redemption frame_dig -2 pushint 41 @@ -6642,13 +6637,13 @@ _apply_non_cash_schedule_entry_else_body@29: b _apply_non_cash_schedule_entry_after_if_else@30 _apply_non_cash_schedule_entry_else_body@20: - // modules/actus_kernel.py:677 + // modules/actus_kernel.py:674 // elif event_type == UInt64(enums.EVT_IPCB): frame_dig 10 pushint 18 == bz _apply_non_cash_schedule_entry_after_if_else@23 - // modules/actus_kernel.py:678-679 + // modules/actus_kernel.py:675-676 // # IPCB keeps principal unchanged and only resets the interest base. // self.interest_calculation_base = self.outstanding_principal intc_0 // 0 @@ -6661,33 +6656,33 @@ _apply_non_cash_schedule_entry_else_body@20: b _apply_non_cash_schedule_entry_after_if_else@23 _apply_non_cash_schedule_entry_else_body@10: - // modules/actus_kernel.py:665 + // modules/actus_kernel.py:662 // elif event_type == UInt64(enums.EVT_RRF): frame_dig 10 pushint 11 == bz _apply_non_cash_schedule_entry_else_body@14 - // modules/actus_kernel.py:666 + // modules/actus_kernel.py:663 // next_rate = entry.next_nominal_interest_rate frame_dig -2 pushint 33 extract_uint64 dup frame_bury 5 - // modules/actus_kernel.py:667 + // modules/actus_kernel.py:664 // if next_rate == UInt64(0): bnz _apply_non_cash_schedule_entry_after_if_else@13 - // modules/actus_kernel.py:668 + // modules/actus_kernel.py:665 // next_rate = self.rate_reset_next intc_0 // 0 - bytec 37 // "rate_reset_next" + bytec 38 // "rate_reset_next" app_global_get_ex swap frame_bury 5 assert // check self.rate_reset_next exists _apply_non_cash_schedule_entry_after_if_else@13: - // modules/actus_kernel.py:669 + // modules/actus_kernel.py:666 // self.nominal_interest_rate = next_rate bytec 9 // "nominal_interest_rate" frame_dig 5 @@ -6695,7 +6690,7 @@ _apply_non_cash_schedule_entry_after_if_else@13: b _apply_non_cash_schedule_entry_after_if_else@18 _apply_non_cash_schedule_entry_else_body@14: - // modules/actus_kernel.py:671 + // modules/actus_kernel.py:668 // if entry.next_nominal_interest_rate != UInt64(0): frame_dig -2 pushint 33 @@ -6703,7 +6698,7 @@ _apply_non_cash_schedule_entry_else_body@14: dup frame_bury 9 bz _apply_non_cash_schedule_entry_after_if_else@18 - // modules/actus_kernel.py:672 + // modules/actus_kernel.py:669 // self.nominal_interest_rate = entry.next_nominal_interest_rate bytec 9 // "nominal_interest_rate" frame_dig 9 @@ -6713,7 +6708,7 @@ _apply_non_cash_schedule_entry_else_body@14: // modules.actus_kernel.ActusKernelModule._emit_execution_event(entry: bytes, payoff: uint64, settled_amount: uint64) -> bytes: _emit_execution_event: - // modules/actus_kernel.py:706-712 + // modules/actus_kernel.py:703-709 // def _emit_execution_event( // self, // *, @@ -6722,44 +6717,44 @@ _emit_execution_event: // settled_amount: UInt64, // ) -> None: proto 3 1 - // modules/actus_kernel.py:716 + // modules/actus_kernel.py:713 // contract_id=Global.current_application_id.id, global CurrentApplicationID - // modules/actus_kernel.py:717 + // modules/actus_kernel.py:714 // event_id=entry.event_id, frame_dig -3 intc_0 // 0 extract_uint64 - // modules/actus_kernel.py:718 + // modules/actus_kernel.py:715 // event_type=entry.event_type, frame_dig -3 extract 8 1 - // modules/actus_kernel.py:719 + // modules/actus_kernel.py:716 // scheduled_time=entry.scheduled_time, frame_dig -3 extract 9 8 - // modules/actus_kernel.py:720 + // modules/actus_kernel.py:717 // applied_at=Global.latest_timestamp, global LatestTimestamp - // modules/actus_kernel.py:723 + // modules/actus_kernel.py:720 // self._payoff_sign(entry.event_type.as_uint64(), payoff) frame_dig -3 - // modules/actus_kernel.py:718 + // modules/actus_kernel.py:715 // event_type=entry.event_type, intc_2 // 8 - // modules/actus_kernel.py:723 + // modules/actus_kernel.py:720 // self._payoff_sign(entry.event_type.as_uint64(), payoff) getbyte - // modules/actus_kernel.py:752 + // modules/actus_kernel.py:749 // if payoff == UInt64(0): frame_dig -2 bnz _emit_execution_event_after_if_else@3 - // modules/actus_kernel.py:753 + // modules/actus_kernel.py:750 // return UInt64(enums.PAYOFF_SIGN_POSITIVE) intc_1 // 1 _emit_execution_event_after_inlined_modules.actus_kernel.ActusKernelModule._payoff_sign@7: - // modules/actus_kernel.py:722-724 + // modules/actus_kernel.py:719-721 // payoff_sign=arc4.UInt8( // self._payoff_sign(entry.event_type.as_uint64(), payoff) // ), @@ -6770,19 +6765,19 @@ _emit_execution_event_after_inlined_modules.actus_kernel.ActusKernelModule._payo <= assert // overflow extract 7 1 - // modules/actus_kernel.py:726 + // modules/actus_kernel.py:723 // currency_id=self.settlement_asset_id, intc_0 // 0 bytec 19 // "settlement_asset_id" app_global_get_ex assert // check self.settlement_asset_id exists - // modules/actus_kernel.py:727 + // modules/actus_kernel.py:724 // sequence=entry.event_id + UInt64(1), frame_dig 1 dup intc_1 // 1 + - // modules/actus_kernel.py:715-728 + // modules/actus_kernel.py:712-725 // ExecutionEvent( // contract_id=Global.current_application_id.id, // event_id=entry.event_id, @@ -6823,7 +6818,7 @@ _emit_execution_event_after_inlined_modules.actus_kernel.ActusKernelModule._payo swap itob concat - // modules/actus_kernel.py:714-729 + // modules/actus_kernel.py:711-726 // arc4.emit( // ExecutionEvent( // contract_id=Global.current_application_id.id, @@ -6849,7 +6844,7 @@ _emit_execution_event_after_inlined_modules.actus_kernel.ActusKernelModule._payo retsub _emit_execution_event_after_if_else@3: - // modules/actus_kernel.py:754 + // modules/actus_kernel.py:751 // if event_type in (UInt64(enums.EVT_IED), UInt64(enums.EVT_PI)): frame_dig 5 intc_1 // 1 @@ -6861,29 +6856,29 @@ _emit_execution_event_after_if_else@3: bz _emit_execution_event_after_if_else@6 _emit_execution_event_if_body@5: - // modules/actus_kernel.py:755 + // modules/actus_kernel.py:752 // return UInt64(enums.PAYOFF_SIGN_POSITIVE) intc_1 // 1 - // modules/actus_kernel.py:723 + // modules/actus_kernel.py:720 // self._payoff_sign(entry.event_type.as_uint64(), payoff) b _emit_execution_event_after_inlined_modules.actus_kernel.ActusKernelModule._payoff_sign@7 _emit_execution_event_after_if_else@6: - // modules/actus_kernel.py:756 + // modules/actus_kernel.py:753 // return UInt64(enums.PAYOFF_SIGN_NEGATIVE) pushint 255 - // modules/actus_kernel.py:723 + // modules/actus_kernel.py:720 // self._payoff_sign(entry.event_type.as_uint64(), payoff) b _emit_execution_event_after_inlined_modules.actus_kernel.ActusKernelModule._payoff_sign@7 // modules.rbac.RbacModule._role_is_active(role_map: bytes, role_address: bytes) -> uint64: _role_is_active: - // modules/rbac.py:57 + // modules/rbac.py:59 // def _role_is_active(self, role_map: typ.RbacRole, role_address: Account) -> bool: proto 2 1 pushbytes "" - // modules/rbac.py:55 + // modules/rbac.py:57 // return role_address in role_map frame_dig -2 frame_dig -1 @@ -6891,47 +6886,47 @@ _role_is_active: dup box_len bury 1 - // modules/rbac.py:58-62 + // modules/rbac.py:60-64 // return self._has_role(role_map, role_address) and ( // role_map[role_address].role_validity_start // <= Global.latest_timestamp // <= role_map[role_address].role_validity_end // ) bz _role_is_active_bool_false@4 - // modules/rbac.py:59 + // modules/rbac.py:61 // role_map[role_address].role_validity_start frame_dig 1 box_get assert // check BoxMap entry exists intc_0 // 0 extract_uint64 - // modules/rbac.py:60 + // modules/rbac.py:62 // <= Global.latest_timestamp global LatestTimestamp dup frame_bury 0 - // modules/rbac.py:59-60 + // modules/rbac.py:61-62 // role_map[role_address].role_validity_start // <= Global.latest_timestamp <= - // modules/rbac.py:59-61 + // modules/rbac.py:61-63 // role_map[role_address].role_validity_start // <= Global.latest_timestamp // <= role_map[role_address].role_validity_end bz _role_is_active_bool_false@4 - // modules/rbac.py:61 + // modules/rbac.py:63 // <= role_map[role_address].role_validity_end frame_dig 1 box_get assert // check BoxMap entry exists intc_2 // 8 extract_uint64 - // modules/rbac.py:60-61 + // modules/rbac.py:62-63 // <= Global.latest_timestamp // <= role_map[role_address].role_validity_end frame_dig 0 >= - // modules/rbac.py:59-61 + // modules/rbac.py:61-63 // role_map[role_address].role_validity_start // <= Global.latest_timestamp // <= role_map[role_address].role_validity_end @@ -6939,7 +6934,7 @@ _role_is_active: intc_1 // 1 _role_is_active_bool_merge@5: - // modules/rbac.py:58-62 + // modules/rbac.py:60-64 // return self._has_role(role_map, role_address) and ( // role_map[role_address].role_validity_start // <= Global.latest_timestamp @@ -6955,17 +6950,17 @@ _role_is_active_bool_false@4: // modules.rbac.RbacModule._assert_caller_is_arranger() -> void: _assert_caller_is_arranger: - // modules/rbac.py:65 + // modules/rbac.py:67 // assert self._is_arranger(Txn.sender), err.UNAUTHORIZED txn Sender - // modules/rbac.py:52 + // modules/rbac.py:54 // return role_address == self.arranger.value intc_0 // 0 bytec 18 // 0x523a41525223 app_global_get_ex assert // check self.arranger exists == - // modules/rbac.py:65 + // modules/rbac.py:67 // assert self._is_arranger(Txn.sender), err.UNAUTHORIZED assert // Not authorized retsub @@ -6973,12 +6968,12 @@ _assert_caller_is_arranger: // modules.rbac.RbacModule._assert_is_not_asset_defaulted() -> void: _assert_is_not_asset_defaulted: - // modules/rbac.py:83 - // assert not self.asset_defaulted, err.DEFAULTED + // modules/rbac.py:85 + // assert not self.defaulted, err.DEFAULTED intc_0 // 0 - bytec 41 // "asset_defaulted" + bytec 34 // "defaulted" app_global_get_ex - assert // check self.asset_defaulted exists + assert // check self.defaulted exists ! assert // Defaulted retsub @@ -6986,12 +6981,12 @@ _assert_is_not_asset_defaulted: // modules.rbac.RbacModule._assert_is_not_asset_suspended() -> void: _assert_is_not_asset_suspended: - // modules/rbac.py:86 - // assert not self.asset_suspended, err.SUSPENDED + // modules/rbac.py:88 + // assert not self.contract_suspended, err.SUSPENDED intc_0 // 0 - bytec 33 // "asset_suspended" + bytec 33 // "contract_suspended" app_global_get_ex - assert // check self.asset_suspended exists + assert // check self.contract_suspended exists ! assert // Suspended operations retsub @@ -6999,10 +6994,10 @@ _assert_is_not_asset_suspended: // modules.rbac.RbacModule._assert_valid_role(role_id: uint64) -> void: _assert_valid_role: - // modules/rbac.py:88 + // modules/rbac.py:90 // def _assert_valid_role(self, role_id: UInt64) -> None: proto 1 0 - // modules/rbac.py:89-97 + // modules/rbac.py:91-99 // assert role_id in ( // UInt64(enums.ROLE_ARRANGER), // UInt64(enums.ROLE_OP_DAEMON), @@ -7013,10 +7008,10 @@ _assert_valid_role: // UInt64(enums.ROLE_OBSERVER), // ), err.INVALID_ROLE frame_dig -1 - // modules/rbac.py:90 + // modules/rbac.py:92 // UInt64(enums.ROLE_ARRANGER), pushint 20 - // modules/rbac.py:89-97 + // modules/rbac.py:91-99 // assert role_id in ( // UInt64(enums.ROLE_ARRANGER), // UInt64(enums.ROLE_OP_DAEMON), @@ -7029,10 +7024,10 @@ _assert_valid_role: == bnz _assert_valid_role_bool_true@7 frame_dig -1 - // modules/rbac.py:91 + // modules/rbac.py:93 // UInt64(enums.ROLE_OP_DAEMON), pushint 25 - // modules/rbac.py:89-97 + // modules/rbac.py:91-99 // assert role_id in ( // UInt64(enums.ROLE_ARRANGER), // UInt64(enums.ROLE_OP_DAEMON), @@ -7045,10 +7040,10 @@ _assert_valid_role: == bnz _assert_valid_role_bool_true@7 frame_dig -1 - // modules/rbac.py:92 + // modules/rbac.py:94 // UInt64(enums.ROLE_ACCOUNT_MANAGER), pushint 40 - // modules/rbac.py:89-97 + // modules/rbac.py:91-99 // assert role_id in ( // UInt64(enums.ROLE_ARRANGER), // UInt64(enums.ROLE_OP_DAEMON), @@ -7061,10 +7056,10 @@ _assert_valid_role: == bnz _assert_valid_role_bool_true@7 frame_dig -1 - // modules/rbac.py:93 + // modules/rbac.py:95 // UInt64(enums.ROLE_PRIMARY_DEALER), pushint 50 - // modules/rbac.py:89-97 + // modules/rbac.py:91-99 // assert role_id in ( // UInt64(enums.ROLE_ARRANGER), // UInt64(enums.ROLE_OP_DAEMON), @@ -7077,10 +7072,10 @@ _assert_valid_role: == bnz _assert_valid_role_bool_true@7 frame_dig -1 - // modules/rbac.py:94 + // modules/rbac.py:96 // UInt64(enums.ROLE_TRUSTEE), pushint 60 - // modules/rbac.py:89-97 + // modules/rbac.py:91-99 // assert role_id in ( // UInt64(enums.ROLE_ARRANGER), // UInt64(enums.ROLE_OP_DAEMON), @@ -7093,10 +7088,10 @@ _assert_valid_role: == bnz _assert_valid_role_bool_true@7 frame_dig -1 - // modules/rbac.py:95 + // modules/rbac.py:97 // UInt64(enums.ROLE_AUTHORITY), pushint 70 - // modules/rbac.py:89-97 + // modules/rbac.py:91-99 // assert role_id in ( // UInt64(enums.ROLE_ARRANGER), // UInt64(enums.ROLE_OP_DAEMON), @@ -7109,10 +7104,10 @@ _assert_valid_role: == bnz _assert_valid_role_bool_true@7 frame_dig -1 - // modules/rbac.py:96 + // modules/rbac.py:98 // UInt64(enums.ROLE_OBSERVER), pushint 80 - // modules/rbac.py:89-97 + // modules/rbac.py:91-99 // assert role_id in ( // UInt64(enums.ROLE_ARRANGER), // UInt64(enums.ROLE_OP_DAEMON), @@ -7129,7 +7124,7 @@ _assert_valid_role_bool_true@7: intc_1 // 1 _assert_valid_role_bool_merge@9: - // modules/rbac.py:89-97 + // modules/rbac.py:91-99 // assert role_id in ( // UInt64(enums.ROLE_ARRANGER), // UInt64(enums.ROLE_OP_DAEMON), diff --git a/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.approval.puya.map b/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.approval.puya.map index ee7bfed4..202deb90 100644 --- a/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.approval.puya.map +++ b/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.approval.puya.map @@ -4,7 +4,7 @@ "../../../modules/rbac.py", "../../mock_module_rbac/contract.py" ], - "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BmD;AAAf;;AAA5B;AAC4C;;AAAf;;AAA7B;AAkBA;;AAAuB;AAAvB;AACA;;AAAuB;AAAvB;AC3CR;;AAAA;;;AAAA;;;;;;AAAA;;;AAAA;;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;AAAA;AD8IK;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;;ACtIA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAEG;AAAsB;;AAAtB;AAFH;AAAA;ADoJG;;;AAdH;AAAA;AAgBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAcG;;;AACA;AAAA;AAAA;AACO;;AAhBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAcG;;;AACA;;AAAA;AAAA;AACO;;AAhBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAsBG;;;AACA;;;AACwB;AAAA;;AAAxB;;;AA1Hc;AAAX;AAAX;;;AACY;AAAA;;AAAA;AA2HG;;AA1BV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA9FM;AAAW;;AAAX;AAAX;;;AACuC;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAqHJ;;;AAnHG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAiHJ;;;AA/GG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AA6GJ;;;AA3GG;AAAW;;AAAX;AAAX;;;AACuC;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAyGJ;;;AAvGG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;;;;AAwGP;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAmBG;;;AACA;;;AACwB;AAAA;;AAAxB;;;AA1HO;AAAW;AAAX;AAAP;AACc;;AAAX;AAAX;;;AACmC;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAyHG;;AAvBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAhGM;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAoHJ;;;AAlHG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAgHJ;;;AA9GG;AAAW;;AAAX;AAAX;;;AACmC;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AA4GJ;;;AA1GG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;;;;AA2GP;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAhL+B;AAAgB;;AAArC;;;AAAP;AAgMA;;AAAA;AAAA;AACO;;AAjBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA8BU;AAAA;AAAA;AAAA;AAXV;AAAA;AAAA;AAAA;AAAA;AAAA;AAaA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAkB4B;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AAtBP;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAyBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAkBU;AACP;AAAA;;;AAES;AAIA;;;;;;;AALT;;AAAA;;;;;;;;;;;;;;AA+BQ;AAJI;;AA9SL;;AAAA;AAAA;AAAA;AAAA;;AA6SC;AAGO;AAAA;AAjDlB;AAAA;AAAA;AAAA;AAAA;AAAA;AA0Ce;AAzSL;;AAAA;AAAA;AAAA;AAAA;;AAwSC;AAGO;AAAA;AA5ClB;;;AAqCe;;AApSL;;AAAA;AAAA;AAAA;AAAA;;AAmSC;AAGO;AAAA;AAvClB;;;AAgCe;;AA/RL;;AAAA;AAAA;AAAA;AAAA;;AA8RC;AAGO;AAAA;AAlClB;;;AA2Be;AA1RL;;AAAA;AAAA;AAAA;AAAA;;AAyRC;AAGO;AAAA;AA7BlB;;;AAsBkB;;;;;;;;;;;;;;;;;;AAtBlB;;;AA7PD;;;;;AAFW;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAGA;;;AACH;;AAAA;AAAA;AAAA;AAAA;AACG;;AAAA;AAAA;;AADH;AAAA;;;AAEG;;AAAA;AAAA;AAAA;;AAAA;AADA;;AAAA;AADH;;;;AADJ;;AAAA;;;;;AAOyB;;AAbF;AAAA;AAAA;AAAA;AAAhB;AAaP;;AAkBW;AAAA;;AAAA;AAAA;AAAJ;AAAP;;AAKJ;;;AACW;;AACH;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;AAAA;;AAMH;;AANG;AAAA;;;AAAA;;AAOH;;AAPG;AAAA;;;;AAAP;;;", + "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BmD;AAAf;;AAA5B;AAC4C;;AAAf;;AAA7B;AAkBA;;AAA0B;AAA1B;AAGA;;AAAiB;AAAjB;AC7CR;;AAAA;;;AAAA;;;;;;AAAA;;;AAAA;;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;AAAA;ADgJK;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;;ACxIA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAEG;AAAsB;;AAAtB;AAFH;AAAA;ADsJG;;;AAdH;AAAA;AAgBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAcG;;;AACA;AAAA;AAAA;AACO;;AAhBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAcG;;;AACA;;AAAA;AAAA;AACO;;AAhBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAsBG;;;AACA;;;AACwB;AAAA;;AAAxB;;;AA1Hc;AAAX;AAAX;;;AACY;AAAA;;AAAA;AA2HG;;AA1BV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA9FM;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAqHJ;;;AAnHG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAiHJ;;;AA/GG;AAAW;;AAAX;AAAX;;;AACuC;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AA6GJ;;;AA3GG;AAAW;;AAAX;AAAX;;;AACuC;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAyGJ;;;AAvGG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;;;;AAwGP;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAmBG;;;AACA;;;AACwB;AAAA;;AAAxB;;;AA1HO;AAAW;AAAX;AAAP;AACc;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAyHG;;AAvBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAhGM;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAoHJ;;;AAlHG;AAAW;;AAAX;AAAX;;;AACmC;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAgHJ;;;AA9GG;AAAW;;AAAX;AAAX;;;AACmC;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AA4GJ;;;AA1GG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;;;;AA2GP;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAhL+B;AAAgB;;AAArC;;;AAAP;AAgMA;;AAAA;AAAA;AACO;;AAjBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAtM+B;AAAc;;AAAnC;;;AAAP;AAmNA;;AAAA;AAAA;AACO;;AAdV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BU;AAAA;AAAA;AAAA;AAXV;AAAA;AAAA;AAAA;AAAA;AAAA;AAaA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAkB4B;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;AAArB;;AAAA;;;AACqB;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AAtBP;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAyBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAkBU;AACP;AAAA;;;AAES;AAIA;;;;;;;AALT;;AAAA;;;;;;;;;;;;;;AA+BQ;AAJI;;AA9TL;;AAAA;AAAA;AAAA;AAAA;;AA6TC;AAGO;AAAA;AAjDlB;AAAA;AAAA;AAAA;AAAA;AAAA;AA0Ce;AAzTL;;AAAA;AAAA;AAAA;AAAA;;AAwTC;AAGO;AAAA;AA5ClB;;;AAqCe;AApTL;;AAAA;AAAA;AAAA;AAAA;;AAmTC;AAGO;AAAA;AAvClB;;;AAgCe;;AA/SL;;AAAA;AAAA;AAAA;AAAA;;AA8SC;AAGO;AAAA;AAlClB;;;AA2Be;;AA1SL;;AAAA;AAAA;AAAA;AAAA;;AAySC;AAGO;AAAA;AA7BlB;;;AAsBkB;;;;;;;;;;;;;;;;;;AAtBlB;;;AA7QD;;;;;AAFW;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAGA;;;AACH;;AAAA;AAAA;AAAA;AAAA;AACG;;AAAA;AAAA;;AADH;AAAA;;;AAEG;;AAAA;AAAA;AAAA;;AAAA;AADA;;AAAA;AADH;;;;AADJ;;AAAA;;;;;AAOyB;;AAbF;AAAA;AAAA;AAAA;AAAhB;AAaP;;AAkBW;AAAA;;AAAA;AAAA;AAAJ;AAAP;;AAKJ;;;AACW;;AACH;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;AAAA;;AAMH;;AANG;AAAA;;;AAAA;;AAOH;;AAPG;AAAA;;;;AAAP;;;", "op_pc_offset": 0, "pc_events": { "1": { @@ -15,9 +15,9 @@ "op": "intcblock 1 0 32 20" }, "7": { - "op": "bytecblock 0x151f7c75 0x523a41525223 0x523a41555423 0x523a4d4e4723 0x523a50594423 0x523a54525323 0x523a4d4f4323 0x523a4f504423 \"asset_suspended\" \"asset_defaulted\"" + "op": "bytecblock 0x151f7c75 0x523a41525223 0x523a54525323 0x523a41555423 0x523a4d4e4723 0x523a50594423 0x523a4d4f4323 \"defaulted\" 0x523a4f504423 \"contract_suspended\"" }, - "95": { + "92": { "op": "txn ApplicationID", "defined_out": [ "tmp%0#0" @@ -26,11 +26,11 @@ "tmp%0#0" ] }, - "97": { + "94": { "op": "bnz main_after_if_else@2", "stack_out": [] }, - "100": { + "97": { "op": "bytec_1 // 0x523a41525223", "defined_out": [ "0x523a41525223" @@ -39,7 +39,7 @@ "0x523a41525223" ] }, - "101": { + "98": { "op": "global ZeroAddress", "defined_out": [ "0x523a41525223", @@ -50,12 +50,12 @@ "tmp%0#2" ] }, - "103": { + "100": { "op": "app_global_put", "stack_out": [] }, - "104": { - "op": "bytec 7 // 0x523a4f504423", + "101": { + "op": "bytec 8 // 0x523a4f504423", "defined_out": [ "0x523a4f504423" ], @@ -63,7 +63,7 @@ "0x523a4f504423" ] }, - "106": { + "103": { "op": "global ZeroAddress", "defined_out": [ "0x523a4f504423", @@ -74,55 +74,55 @@ "tmp%1#2" ] }, - "108": { + "105": { "op": "app_global_put", "stack_out": [] }, - "109": { - "op": "bytec 8 // \"asset_suspended\"", + "106": { + "op": "bytec 9 // \"contract_suspended\"", "defined_out": [ - "\"asset_suspended\"" + "\"contract_suspended\"" ], "stack_out": [ - "\"asset_suspended\"" + "\"contract_suspended\"" ] }, - "111": { + "108": { "op": "intc_1 // 0", "defined_out": [ - "\"asset_suspended\"", + "\"contract_suspended\"", "0" ], "stack_out": [ - "\"asset_suspended\"", + "\"contract_suspended\"", "0" ] }, - "112": { + "109": { "op": "app_global_put", "stack_out": [] }, - "113": { - "op": "bytec 9 // \"asset_defaulted\"", + "110": { + "op": "bytec 7 // \"defaulted\"", "defined_out": [ - "\"asset_defaulted\"" + "\"defaulted\"" ], "stack_out": [ - "\"asset_defaulted\"" + "\"defaulted\"" ] }, - "115": { + "112": { "op": "intc_1 // 0", "stack_out": [ - "\"asset_defaulted\"", + "\"defaulted\"", "0" ] }, - "116": { + "113": { "op": "app_global_put", "stack_out": [] }, - "117": { + "114": { "block": "main_after_if_else@2", "stack_in": [], "op": "txn NumAppArgs", @@ -133,11 +133,11 @@ "tmp%0#1" ] }, - "119": { - "op": "bz main_create@19", + "116": { + "op": "bz main_create@20", "stack_out": [] }, - "122": { + "119": { "op": "pushbytes 0x914f04eb // method \"contract_update()void\"", "defined_out": [ "Method(contract_update()void)" @@ -146,7 +146,7 @@ "Method(contract_update()void)" ] }, - "128": { + "125": { "op": "txna ApplicationArgs 0", "defined_out": [ "Method(contract_update()void)", @@ -157,11 +157,11 @@ "tmp%2#0" ] }, - "131": { + "128": { "op": "match main_contract_update_route@5", "stack_out": [] }, - "135": { + "132": { "block": "main_switch_case_next@6", "stack_in": [], "op": "txn OnCompletion", @@ -172,7 +172,7 @@ "tmp%8#0" ] }, - "137": { + "134": { "op": "!", "defined_out": [ "tmp%9#0" @@ -181,11 +181,11 @@ "tmp%9#0" ] }, - "138": { + "135": { "op": "assert", "stack_out": [] }, - "139": { + "136": { "op": "txn ApplicationID", "defined_out": [ "tmp%10#0" @@ -194,14 +194,15 @@ "tmp%10#0" ] }, - "141": { + "138": { "op": "assert", "stack_out": [] }, - "142": { - "op": "pushbytess 0x82f71b2d 0xef04f5d3 0xdf343550 0x3dbe80bd 0x1e3e48e7 0x010c8299 0x7406acd2 0x1a72a2ee // method \"rbac_rotate_arranger(address)uint64\", method \"rbac_set_op_daemon(address)uint64\", method \"rbac_assign_role(uint8,address,(uint64,uint64))uint64\", method \"rbac_revoke_role(uint8,address)uint64\", method \"rbac_contract_suspension(bool)uint64\", method \"rbac_get_arranger()address\", method \"rbac_get_address_roles(address)(bool,bool,bool,bool,bool)\", method \"rbac_get_role_validity(uint8,address)(uint64,uint64)\"", + "139": { + "op": "pushbytess 0x82f71b2d 0xef04f5d3 0xdf343550 0x3dbe80bd 0x1e3e48e7 0x39241fa3 0x010c8299 0x7406acd2 0x1a72a2ee // method \"rbac_rotate_arranger(address)uint64\", method \"rbac_set_op_daemon(address)uint64\", method \"rbac_assign_role(uint8,address,(uint64,uint64))uint64\", method \"rbac_revoke_role(uint8,address)uint64\", method \"rbac_contract_suspension(bool)uint64\", method \"rbac_contract_default(bool)uint64\", method \"rbac_get_arranger()address\", method \"rbac_get_address_roles(address)(bool,bool,bool,bool,bool)\", method \"rbac_get_role_validity(uint8,address)(uint64,uint64)\"", "defined_out": [ "Method(rbac_assign_role(uint8,address,(uint64,uint64))uint64)", + "Method(rbac_contract_default(bool)uint64)", "Method(rbac_contract_suspension(bool)uint64)", "Method(rbac_get_address_roles(address)(bool,bool,bool,bool,bool))", "Method(rbac_get_arranger()address)", @@ -216,15 +217,17 @@ "Method(rbac_assign_role(uint8,address,(uint64,uint64))uint64)", "Method(rbac_revoke_role(uint8,address)uint64)", "Method(rbac_contract_suspension(bool)uint64)", + "Method(rbac_contract_default(bool)uint64)", "Method(rbac_get_arranger()address)", "Method(rbac_get_address_roles(address)(bool,bool,bool,bool,bool))", "Method(rbac_get_role_validity(uint8,address)(uint64,uint64))" ] }, - "184": { + "186": { "op": "txna ApplicationArgs 0", "defined_out": [ "Method(rbac_assign_role(uint8,address,(uint64,uint64))uint64)", + "Method(rbac_contract_default(bool)uint64)", "Method(rbac_contract_suspension(bool)uint64)", "Method(rbac_get_address_roles(address)(bool,bool,bool,bool,bool))", "Method(rbac_get_arranger()address)", @@ -240,20 +243,21 @@ "Method(rbac_assign_role(uint8,address,(uint64,uint64))uint64)", "Method(rbac_revoke_role(uint8,address)uint64)", "Method(rbac_contract_suspension(bool)uint64)", + "Method(rbac_contract_default(bool)uint64)", "Method(rbac_get_arranger()address)", "Method(rbac_get_address_roles(address)(bool,bool,bool,bool,bool))", "Method(rbac_get_role_validity(uint8,address)(uint64,uint64))", "tmp%12#0" ] }, - "187": { - "op": "match rbac_rotate_arranger rbac_set_op_daemon rbac_assign_role rbac_revoke_role rbac_contract_suspension rbac_get_arranger rbac_get_address_roles rbac_get_role_validity", + "189": { + "op": "match rbac_rotate_arranger rbac_set_op_daemon rbac_assign_role rbac_revoke_role rbac_contract_suspension rbac_contract_default rbac_get_arranger rbac_get_address_roles rbac_get_role_validity", "stack_out": [] }, - "205": { + "209": { "op": "err" }, - "206": { + "210": { "block": "main_contract_update_route@5", "stack_in": [], "op": "txn OnCompletion", @@ -264,7 +268,7 @@ "tmp%3#0" ] }, - "208": { + "212": { "op": "pushint 4 // UpdateApplication", "defined_out": [ "UpdateApplication", @@ -275,7 +279,7 @@ "UpdateApplication" ] }, - "210": { + "214": { "op": "==", "defined_out": [ "tmp%4#0" @@ -284,7 +288,7 @@ "tmp%4#0" ] }, - "211": { + "215": { "op": "txn ApplicationID", "defined_out": [ "tmp%4#0", @@ -295,7 +299,7 @@ "tmp%5#0" ] }, - "213": { + "217": { "op": "&&", "defined_out": [ "tmp%7#0" @@ -304,15 +308,15 @@ "tmp%7#0" ] }, - "214": { + "218": { "op": "assert", "stack_out": [] }, - "215": { + "219": { "op": "b contract_update" }, - "218": { - "block": "main_create@19", + "222": { + "block": "main_create@20", "stack_in": [], "op": "txn OnCompletion", "defined_out": [ @@ -322,7 +326,7 @@ "tmp%13#0" ] }, - "220": { + "224": { "op": "!", "defined_out": [ "tmp%14#0" @@ -331,7 +335,7 @@ "tmp%14#0" ] }, - "221": { + "225": { "op": "txn ApplicationID", "defined_out": [ "tmp%14#0", @@ -342,7 +346,7 @@ "tmp%15#0" ] }, - "223": { + "227": { "op": "!", "defined_out": [ "tmp%14#0", @@ -353,7 +357,7 @@ "tmp%16#0" ] }, - "224": { + "228": { "op": "&&", "defined_out": [ "tmp%17#0" @@ -362,11 +366,11 @@ "tmp%17#0" ] }, - "225": { + "229": { "op": "assert", "stack_out": [] }, - "226": { + "230": { "op": "bytec_1 // 0x523a41525223", "defined_out": [ "0x523a41525223" @@ -375,7 +379,7 @@ "0x523a41525223" ] }, - "227": { + "231": { "op": "txn Sender", "defined_out": [ "0x523a41525223", @@ -386,11 +390,11 @@ "tmp%0#2" ] }, - "229": { + "233": { "op": "app_global_put", "stack_out": [] }, - "230": { + "234": { "op": "intc_0 // 1", "defined_out": [ "1" @@ -399,11 +403,11 @@ "1" ] }, - "231": { + "235": { "op": "return", "stack_out": [] }, - "232": { + "236": { "subroutine": "modules.rbac.RbacModule.contract_update[routing]", "params": {}, "block": "contract_update", @@ -411,7 +415,7 @@ "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", "op": "callsub _assert_caller_is_arranger" }, - "235": { + "239": { "op": "intc_0 // 1", "defined_out": [ "1" @@ -420,11 +424,11 @@ "1" ] }, - "236": { + "240": { "op": "return", "stack_out": [] }, - "237": { + "241": { "subroutine": "modules.rbac.RbacModule.rbac_rotate_arranger[routing]", "params": {}, "block": "rbac_rotate_arranger", @@ -437,7 +441,7 @@ "new_arranger#0" ] }, - "240": { + "244": { "op": "dup", "defined_out": [ "new_arranger#0", @@ -448,7 +452,7 @@ "new_arranger#0 (copy)" ] }, - "241": { + "245": { "op": "len", "defined_out": [ "len%0#0", @@ -459,7 +463,7 @@ "len%0#0" ] }, - "242": { + "246": { "op": "intc_2 // 32", "defined_out": [ "32", @@ -472,7 +476,7 @@ "32" ] }, - "243": { + "247": { "op": "==", "defined_out": [ "eq%0#0", @@ -483,18 +487,18 @@ "eq%0#0" ] }, - "244": { + "248": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ "new_arranger#0" ] }, - "245": { + "249": { "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", "op": "callsub _assert_caller_is_arranger" }, - "248": { + "252": { "op": "bytec_1 // 0x523a41525223", "defined_out": [ "0x523a41525223", @@ -505,18 +509,18 @@ "0x523a41525223" ] }, - "249": { + "253": { "op": "swap", "stack_out": [ "0x523a41525223", "new_arranger#0" ] }, - "250": { + "254": { "op": "app_global_put", "stack_out": [] }, - "251": { + "255": { "op": "global LatestTimestamp", "defined_out": [ "tmp%0#1" @@ -525,7 +529,7 @@ "tmp%0#1" ] }, - "253": { + "257": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0" @@ -534,7 +538,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "254": { + "258": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -545,14 +549,14 @@ "0x151f7c75" ] }, - "255": { + "259": { "op": "swap", "stack_out": [ "0x151f7c75", "aggregate%val_as_bytes%0#0" ] }, - "256": { + "260": { "op": "concat", "defined_out": [ "tmp%4#0" @@ -561,11 +565,11 @@ "tmp%4#0" ] }, - "257": { + "261": { "op": "log", "stack_out": [] }, - "258": { + "262": { "op": "intc_0 // 1", "defined_out": [ "1" @@ -574,11 +578,11 @@ "1" ] }, - "259": { + "263": { "op": "return", "stack_out": [] }, - "260": { + "264": { "subroutine": "modules.rbac.RbacModule.rbac_set_op_daemon[routing]", "params": {}, "block": "rbac_set_op_daemon", @@ -591,7 +595,7 @@ "address#0" ] }, - "263": { + "267": { "op": "dup", "defined_out": [ "address#0", @@ -602,7 +606,7 @@ "address#0 (copy)" ] }, - "264": { + "268": { "op": "len", "defined_out": [ "address#0", @@ -613,7 +617,7 @@ "len%0#0" ] }, - "265": { + "269": { "op": "intc_2 // 32", "defined_out": [ "32", @@ -626,7 +630,7 @@ "32" ] }, - "266": { + "270": { "op": "==", "defined_out": [ "address#0", @@ -637,19 +641,19 @@ "eq%0#0" ] }, - "267": { + "271": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ "address#0" ] }, - "268": { + "272": { "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", "op": "callsub _assert_caller_is_arranger" }, - "271": { - "op": "bytec 7 // 0x523a4f504423", + "275": { + "op": "bytec 8 // 0x523a4f504423", "defined_out": [ "0x523a4f504423", "address#0" @@ -659,18 +663,18 @@ "0x523a4f504423" ] }, - "273": { + "277": { "op": "swap", "stack_out": [ "0x523a4f504423", "address#0" ] }, - "274": { + "278": { "op": "app_global_put", "stack_out": [] }, - "275": { + "279": { "op": "global LatestTimestamp", "defined_out": [ "tmp%0#1" @@ -679,7 +683,7 @@ "tmp%0#1" ] }, - "277": { + "281": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0" @@ -688,7 +692,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "278": { + "282": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -699,14 +703,14 @@ "0x151f7c75" ] }, - "279": { + "283": { "op": "swap", "stack_out": [ "0x151f7c75", "aggregate%val_as_bytes%0#0" ] }, - "280": { + "284": { "op": "concat", "defined_out": [ "tmp%4#0" @@ -715,11 +719,11 @@ "tmp%4#0" ] }, - "281": { + "285": { "op": "log", "stack_out": [] }, - "282": { + "286": { "op": "intc_0 // 1", "defined_out": [ "1" @@ -728,11 +732,11 @@ "1" ] }, - "283": { + "287": { "op": "return", "stack_out": [] }, - "284": { + "288": { "subroutine": "modules.rbac.RbacModule.rbac_assign_role[routing]", "params": {}, "block": "rbac_assign_role", @@ -745,7 +749,7 @@ "role_id#0" ] }, - "287": { + "291": { "op": "dup", "defined_out": [ "role_id#0", @@ -756,7 +760,7 @@ "role_id#0 (copy)" ] }, - "288": { + "292": { "op": "len", "defined_out": [ "len%0#0", @@ -767,7 +771,7 @@ "len%0#0" ] }, - "289": { + "293": { "op": "intc_0 // 1", "defined_out": [ "1", @@ -780,7 +784,7 @@ "1" ] }, - "290": { + "294": { "op": "==", "defined_out": [ "eq%0#0", @@ -791,17 +795,17 @@ "eq%0#0" ] }, - "291": { + "295": { "error": "invalid number of bytes for arc4.uint8", "op": "assert // invalid number of bytes for arc4.uint8", "stack_out": [ "role_id#0" ] }, - "292": { + "296": { "op": "txna ApplicationArgs 2" }, - "295": { + "299": { "op": "dup", "defined_out": [ "role_address#0", @@ -813,7 +817,7 @@ "role_address#0" ] }, - "296": { + "300": { "op": "cover 2", "defined_out": [ "role_address#0", @@ -825,7 +829,7 @@ "role_address#0" ] }, - "298": { + "302": { "op": "len", "defined_out": [ "len%1#0", @@ -838,7 +842,7 @@ "len%1#0" ] }, - "299": { + "303": { "op": "intc_2 // 32", "defined_out": [ "32", @@ -853,7 +857,7 @@ "32" ] }, - "300": { + "304": { "op": "==", "defined_out": [ "eq%1#0", @@ -866,7 +870,7 @@ "eq%1#0" ] }, - "301": { + "305": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ @@ -874,10 +878,10 @@ "role_id#0" ] }, - "302": { + "306": { "op": "txna ApplicationArgs 3" }, - "305": { + "309": { "op": "dup", "defined_out": [ "role_address#0", @@ -891,7 +895,7 @@ "validity#0" ] }, - "306": { + "310": { "op": "cover 2", "defined_out": [ "role_address#0", @@ -905,7 +909,7 @@ "validity#0" ] }, - "308": { + "312": { "op": "len", "defined_out": [ "len%2#0", @@ -920,7 +924,7 @@ "len%2#0" ] }, - "309": { + "313": { "op": "pushint 16", "defined_out": [ "16", @@ -937,7 +941,7 @@ "16" ] }, - "311": { + "315": { "op": "==", "defined_out": [ "eq%2#0", @@ -952,7 +956,7 @@ "eq%2#0" ] }, - "312": { + "316": { "error": "invalid number of bytes for smart_contracts.abi_types.RoleValidity", "op": "assert // invalid number of bytes for smart_contracts.abi_types.RoleValidity", "stack_out": [ @@ -961,15 +965,15 @@ "role_id#0" ] }, - "313": { + "317": { "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", "op": "callsub _assert_caller_is_arranger" }, - "316": { + "320": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", "op": "callsub _assert_is_not_asset_defaulted" }, - "319": { + "323": { "op": "btoi", "defined_out": [ "role_address#0", @@ -982,7 +986,7 @@ "role_id#1" ] }, - "320": { + "324": { "op": "dupn 2", "defined_out": [ "role_address#0", @@ -998,7 +1002,7 @@ "role_id#1 (copy)" ] }, - "322": { + "326": { "callsub": "modules.rbac.RbacModule._assert_valid_role", "op": "callsub _assert_valid_role", "stack_out": [ @@ -1008,7 +1012,7 @@ "role_id#1" ] }, - "325": { + "329": { "op": "intc_3 // 20", "defined_out": [ "20", @@ -1024,7 +1028,7 @@ "20" ] }, - "326": { + "330": { "op": "==", "defined_out": [ "role_address#0", @@ -1039,7 +1043,7 @@ "tmp%0#2" ] }, - "327": { + "331": { "op": "bz rbac_assign_role_after_if_else@3", "stack_out": [ "role_address#0", @@ -1047,7 +1051,7 @@ "role_id#1" ] }, - "330": { + "334": { "op": "bytec_1 // 0x523a41525223", "defined_out": [ "0x523a41525223", @@ -1062,7 +1066,7 @@ "0x523a41525223" ] }, - "331": { + "335": { "op": "dig 3", "stack_out": [ "role_address#0", @@ -1072,7 +1076,7 @@ "role_address#0" ] }, - "333": { + "337": { "op": "app_global_put", "stack_out": [ "role_address#0", @@ -1080,7 +1084,7 @@ "role_id#1" ] }, - "334": { + "338": { "block": "rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14", "stack_in": [ "role_address#0", @@ -1098,7 +1102,7 @@ "tmp%2#1" ] }, - "336": { + "340": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0" @@ -1110,7 +1114,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "337": { + "341": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -1124,7 +1128,7 @@ "0x151f7c75" ] }, - "338": { + "342": { "op": "swap", "stack_out": [ "role_address#0", @@ -1134,7 +1138,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "339": { + "343": { "op": "concat", "defined_out": [ "tmp%6#0" @@ -1146,7 +1150,7 @@ "tmp%6#0" ] }, - "340": { + "344": { "op": "log", "stack_out": [ "role_address#0", @@ -1154,7 +1158,7 @@ "role_id#1" ] }, - "341": { + "345": { "op": "intc_0 // 1", "defined_out": [ "1" @@ -1166,7 +1170,7 @@ "1" ] }, - "342": { + "346": { "op": "return", "stack_out": [ "role_address#0", @@ -1174,7 +1178,7 @@ "role_id#1" ] }, - "343": { + "347": { "block": "rbac_assign_role_after_if_else@3", "stack_in": [ "role_address#0", @@ -1192,7 +1196,7 @@ "role_id#1" ] }, - "344": { + "348": { "op": "pushint 40", "defined_out": [ "40", @@ -1206,7 +1210,7 @@ "40" ] }, - "346": { + "350": { "op": "==", "defined_out": [ "role_id#1", @@ -1219,7 +1223,7 @@ "tmp%1#1" ] }, - "347": { + "351": { "op": "bz rbac_assign_role_after_if_else@5", "stack_out": [ "role_address#0", @@ -1227,8 +1231,8 @@ "role_id#1" ] }, - "350": { - "op": "bytec_3 // 0x523a4d4e4723", + "354": { + "op": "bytec 4 // 0x523a4d4e4723", "defined_out": [ "0x523a4d4e4723", "role_id#1" @@ -1240,7 +1244,7 @@ "0x523a4d4e4723" ] }, - "351": { + "356": { "op": "dig 3", "defined_out": [ "0x523a4d4e4723", @@ -1255,7 +1259,7 @@ "role_address#0" ] }, - "353": { + "358": { "op": "concat", "defined_out": [ "box_prefixed_key%0#0", @@ -1269,7 +1273,7 @@ "box_prefixed_key%0#0" ] }, - "354": { + "359": { "op": "dup", "defined_out": [ "box_prefixed_key%0#0", @@ -1285,7 +1289,7 @@ "box_prefixed_key%0#0 (copy)" ] }, - "355": { + "360": { "op": "box_len", "defined_out": [ "_%0#0", @@ -1303,7 +1307,7 @@ "maybe_exists%0#0" ] }, - "356": { + "361": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -1313,7 +1317,7 @@ "maybe_exists%0#0" ] }, - "358": { + "363": { "op": "!", "defined_out": [ "box_prefixed_key%0#0", @@ -1329,7 +1333,7 @@ "tmp%2#2" ] }, - "359": { + "364": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -1339,7 +1343,7 @@ "box_prefixed_key%0#0" ] }, - "360": { + "365": { "op": "dig 2", "defined_out": [ "box_prefixed_key%0#0", @@ -1355,7 +1359,7 @@ "validity#0" ] }, - "362": { + "367": { "op": "box_put", "stack_out": [ "role_address#0", @@ -1363,10 +1367,10 @@ "role_id#1" ] }, - "363": { + "368": { "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14" }, - "366": { + "371": { "block": "rbac_assign_role_after_if_else@5", "stack_in": [ "role_address#0", @@ -1384,7 +1388,7 @@ "role_id#1" ] }, - "367": { + "372": { "op": "pushint 50", "defined_out": [ "50", @@ -1398,7 +1402,7 @@ "50" ] }, - "369": { + "374": { "op": "==", "defined_out": [ "role_id#1", @@ -1411,7 +1415,7 @@ "tmp%3#0" ] }, - "370": { + "375": { "op": "bz rbac_assign_role_after_if_else@7", "stack_out": [ "role_address#0", @@ -1419,8 +1423,8 @@ "role_id#1" ] }, - "373": { - "op": "bytec 4 // 0x523a50594423", + "378": { + "op": "bytec 5 // 0x523a50594423", "defined_out": [ "0x523a50594423", "role_id#1" @@ -1432,7 +1436,7 @@ "0x523a50594423" ] }, - "375": { + "380": { "op": "dig 3", "defined_out": [ "0x523a50594423", @@ -1447,7 +1451,7 @@ "role_address#0" ] }, - "377": { + "382": { "op": "concat", "defined_out": [ "box_prefixed_key%2#0", @@ -1461,7 +1465,7 @@ "box_prefixed_key%2#0" ] }, - "378": { + "383": { "op": "dup", "defined_out": [ "box_prefixed_key%2#0", @@ -1477,7 +1481,7 @@ "box_prefixed_key%2#0 (copy)" ] }, - "379": { + "384": { "op": "box_len", "defined_out": [ "_%1#0", @@ -1495,7 +1499,7 @@ "maybe_exists%1#0" ] }, - "380": { + "385": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -1505,7 +1509,7 @@ "maybe_exists%1#0" ] }, - "382": { + "387": { "op": "!", "defined_out": [ "box_prefixed_key%2#0", @@ -1521,7 +1525,7 @@ "tmp%4#0" ] }, - "383": { + "388": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -1531,7 +1535,7 @@ "box_prefixed_key%2#0" ] }, - "384": { + "389": { "op": "dig 2", "defined_out": [ "box_prefixed_key%2#0", @@ -1547,7 +1551,7 @@ "validity#0" ] }, - "386": { + "391": { "op": "box_put", "stack_out": [ "role_address#0", @@ -1555,10 +1559,10 @@ "role_id#1" ] }, - "387": { + "392": { "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14" }, - "390": { + "395": { "block": "rbac_assign_role_after_if_else@7", "stack_in": [ "role_address#0", @@ -1576,7 +1580,7 @@ "role_id#1" ] }, - "391": { + "396": { "op": "pushint 60", "defined_out": [ "60", @@ -1590,7 +1594,7 @@ "60" ] }, - "393": { + "398": { "op": "==", "defined_out": [ "role_id#1", @@ -1603,7 +1607,7 @@ "tmp%5#1" ] }, - "394": { + "399": { "op": "bz rbac_assign_role_after_if_else@9", "stack_out": [ "role_address#0", @@ -1611,8 +1615,8 @@ "role_id#1" ] }, - "397": { - "op": "bytec 5 // 0x523a54525323", + "402": { + "op": "bytec_2 // 0x523a54525323", "defined_out": [ "0x523a54525323", "role_id#1" @@ -1624,7 +1628,7 @@ "0x523a54525323" ] }, - "399": { + "403": { "op": "dig 3", "defined_out": [ "0x523a54525323", @@ -1639,7 +1643,7 @@ "role_address#0" ] }, - "401": { + "405": { "op": "concat", "defined_out": [ "box_prefixed_key%4#0", @@ -1653,7 +1657,7 @@ "box_prefixed_key%4#0" ] }, - "402": { + "406": { "op": "dup", "defined_out": [ "box_prefixed_key%4#0", @@ -1669,7 +1673,7 @@ "box_prefixed_key%4#0 (copy)" ] }, - "403": { + "407": { "op": "box_len", "defined_out": [ "_%2#0", @@ -1687,7 +1691,7 @@ "maybe_exists%2#0" ] }, - "404": { + "408": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -1697,7 +1701,7 @@ "maybe_exists%2#0" ] }, - "406": { + "410": { "op": "!", "defined_out": [ "box_prefixed_key%4#0", @@ -1713,7 +1717,7 @@ "tmp%6#1" ] }, - "407": { + "411": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -1723,7 +1727,7 @@ "box_prefixed_key%4#0" ] }, - "408": { + "412": { "op": "dig 2", "defined_out": [ "box_prefixed_key%4#0", @@ -1739,7 +1743,7 @@ "validity#0" ] }, - "410": { + "414": { "op": "box_put", "stack_out": [ "role_address#0", @@ -1747,10 +1751,10 @@ "role_id#1" ] }, - "411": { + "415": { "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14" }, - "414": { + "418": { "block": "rbac_assign_role_after_if_else@9", "stack_in": [ "role_address#0", @@ -1768,7 +1772,7 @@ "role_id#1" ] }, - "415": { + "419": { "op": "pushint 70", "defined_out": [ "70", @@ -1782,7 +1786,7 @@ "70" ] }, - "417": { + "421": { "op": "==", "defined_out": [ "role_id#1", @@ -1795,7 +1799,7 @@ "tmp%7#0" ] }, - "418": { + "422": { "op": "bz rbac_assign_role_after_if_else@11", "stack_out": [ "role_address#0", @@ -1803,8 +1807,8 @@ "role_id#1" ] }, - "421": { - "op": "bytec_2 // 0x523a41555423", + "425": { + "op": "bytec_3 // 0x523a41555423", "defined_out": [ "0x523a41555423", "role_id#1" @@ -1816,7 +1820,7 @@ "0x523a41555423" ] }, - "422": { + "426": { "op": "dig 3", "defined_out": [ "0x523a41555423", @@ -1831,7 +1835,7 @@ "role_address#0" ] }, - "424": { + "428": { "op": "concat", "defined_out": [ "box_prefixed_key%6#0", @@ -1845,7 +1849,7 @@ "box_prefixed_key%6#0" ] }, - "425": { + "429": { "op": "dup", "defined_out": [ "box_prefixed_key%6#0", @@ -1861,7 +1865,7 @@ "box_prefixed_key%6#0 (copy)" ] }, - "426": { + "430": { "op": "box_len", "defined_out": [ "_%3#0", @@ -1879,7 +1883,7 @@ "maybe_exists%3#0" ] }, - "427": { + "431": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -1889,7 +1893,7 @@ "maybe_exists%3#0" ] }, - "429": { + "433": { "op": "!", "defined_out": [ "box_prefixed_key%6#0", @@ -1905,7 +1909,7 @@ "tmp%8#0" ] }, - "430": { + "434": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -1915,7 +1919,7 @@ "box_prefixed_key%6#0" ] }, - "431": { + "435": { "op": "dig 2", "defined_out": [ "box_prefixed_key%6#0", @@ -1931,7 +1935,7 @@ "validity#0" ] }, - "433": { + "437": { "op": "box_put", "stack_out": [ "role_address#0", @@ -1939,10 +1943,10 @@ "role_id#1" ] }, - "434": { + "438": { "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14" }, - "437": { + "441": { "block": "rbac_assign_role_after_if_else@11", "stack_in": [ "role_address#0", @@ -1960,7 +1964,7 @@ "role_id#1" ] }, - "438": { + "442": { "op": "pushint 80", "defined_out": [ "80", @@ -1974,7 +1978,7 @@ "80" ] }, - "440": { + "444": { "op": "==", "defined_out": [ "role_id#1", @@ -1987,7 +1991,7 @@ "tmp%9#0" ] }, - "441": { + "445": { "op": "bz rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14", "stack_out": [ "role_address#0", @@ -1995,7 +1999,7 @@ "role_id#1" ] }, - "444": { + "448": { "op": "bytec 6 // 0x523a4d4f4323", "defined_out": [ "0x523a4d4f4323", @@ -2008,7 +2012,7 @@ "0x523a4d4f4323" ] }, - "446": { + "450": { "op": "dig 3", "defined_out": [ "0x523a4d4f4323", @@ -2023,7 +2027,7 @@ "role_address#0" ] }, - "448": { + "452": { "op": "concat", "defined_out": [ "box_prefixed_key%8#0", @@ -2037,7 +2041,7 @@ "box_prefixed_key%8#0" ] }, - "449": { + "453": { "op": "dup", "defined_out": [ "box_prefixed_key%8#0", @@ -2053,7 +2057,7 @@ "box_prefixed_key%8#0 (copy)" ] }, - "450": { + "454": { "op": "box_len", "defined_out": [ "_%4#0", @@ -2071,7 +2075,7 @@ "maybe_exists%4#0" ] }, - "451": { + "455": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -2081,7 +2085,7 @@ "maybe_exists%4#0" ] }, - "453": { + "457": { "op": "!", "defined_out": [ "box_prefixed_key%8#0", @@ -2097,7 +2101,7 @@ "tmp%10#0" ] }, - "454": { + "458": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -2107,7 +2111,7 @@ "box_prefixed_key%8#0" ] }, - "455": { + "459": { "op": "dig 2", "defined_out": [ "box_prefixed_key%8#0", @@ -2123,7 +2127,7 @@ "validity#0" ] }, - "457": { + "461": { "op": "box_put", "stack_out": [ "role_address#0", @@ -2131,10 +2135,10 @@ "role_id#1" ] }, - "458": { + "462": { "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14" }, - "461": { + "465": { "subroutine": "modules.rbac.RbacModule.rbac_revoke_role[routing]", "params": {}, "block": "rbac_revoke_role", @@ -2147,7 +2151,7 @@ "role_id#0" ] }, - "464": { + "468": { "op": "dup", "defined_out": [ "role_id#0", @@ -2158,7 +2162,7 @@ "role_id#0 (copy)" ] }, - "465": { + "469": { "op": "len", "defined_out": [ "len%0#0", @@ -2169,7 +2173,7 @@ "len%0#0" ] }, - "466": { + "470": { "op": "intc_0 // 1", "defined_out": [ "1", @@ -2182,7 +2186,7 @@ "1" ] }, - "467": { + "471": { "op": "==", "defined_out": [ "eq%0#0", @@ -2193,17 +2197,17 @@ "eq%0#0" ] }, - "468": { + "472": { "error": "invalid number of bytes for arc4.uint8", "op": "assert // invalid number of bytes for arc4.uint8", "stack_out": [ "role_id#0" ] }, - "469": { + "473": { "op": "txna ApplicationArgs 2" }, - "472": { + "476": { "op": "dup", "defined_out": [ "role_address#0", @@ -2215,7 +2219,7 @@ "role_address#0" ] }, - "473": { + "477": { "op": "cover 2", "defined_out": [ "role_address#0", @@ -2227,7 +2231,7 @@ "role_address#0" ] }, - "475": { + "479": { "op": "len", "defined_out": [ "len%1#0", @@ -2240,7 +2244,7 @@ "len%1#0" ] }, - "476": { + "480": { "op": "intc_2 // 32", "defined_out": [ "32", @@ -2255,7 +2259,7 @@ "32" ] }, - "477": { + "481": { "op": "==", "defined_out": [ "eq%1#0", @@ -2268,7 +2272,7 @@ "eq%1#0" ] }, - "478": { + "482": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ @@ -2276,15 +2280,15 @@ "role_id#0" ] }, - "479": { + "483": { "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", "op": "callsub _assert_caller_is_arranger" }, - "482": { + "486": { "callsub": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", "op": "callsub _assert_is_not_asset_defaulted" }, - "485": { + "489": { "op": "btoi", "defined_out": [ "role_address#0", @@ -2295,7 +2299,7 @@ "role_id#1" ] }, - "486": { + "490": { "op": "dupn 2", "defined_out": [ "role_address#0", @@ -2309,7 +2313,7 @@ "role_id#1 (copy)" ] }, - "488": { + "492": { "callsub": "modules.rbac.RbacModule._assert_valid_role", "op": "callsub _assert_valid_role", "stack_out": [ @@ -2318,7 +2322,7 @@ "role_id#1" ] }, - "491": { + "495": { "op": "dup", "stack_out": [ "role_address#0", @@ -2327,7 +2331,7 @@ "role_id#1 (copy)" ] }, - "492": { + "496": { "op": "intc_3 // 20", "defined_out": [ "20", @@ -2343,7 +2347,7 @@ "20" ] }, - "493": { + "497": { "op": "!=", "defined_out": [ "role_address#0", @@ -2357,7 +2361,7 @@ "tmp%0#2" ] }, - "494": { + "498": { "error": "Invalid role identifier", "op": "assert // Invalid role identifier", "stack_out": [ @@ -2366,7 +2370,7 @@ "role_id#1" ] }, - "495": { + "499": { "op": "pushint 40", "defined_out": [ "40", @@ -2380,7 +2384,7 @@ "40" ] }, - "497": { + "501": { "op": "==", "defined_out": [ "role_address#0", @@ -2393,15 +2397,15 @@ "tmp%1#1" ] }, - "498": { + "502": { "op": "bz rbac_revoke_role_after_if_else@3", "stack_out": [ "role_address#0", "role_id#1" ] }, - "501": { - "op": "bytec_3 // 0x523a4d4e4723", + "505": { + "op": "bytec 4 // 0x523a4d4e4723", "defined_out": [ "0x523a4d4e4723", "role_address#0", @@ -2413,7 +2417,7 @@ "0x523a4d4e4723" ] }, - "502": { + "507": { "op": "dig 2", "stack_out": [ "role_address#0", @@ -2422,7 +2426,7 @@ "role_address#0" ] }, - "504": { + "509": { "op": "concat", "defined_out": [ "box_prefixed_key%0#0", @@ -2435,7 +2439,7 @@ "box_prefixed_key%0#0" ] }, - "505": { + "510": { "op": "dup", "defined_out": [ "box_prefixed_key%0#0", @@ -2450,7 +2454,7 @@ "box_prefixed_key%0#0 (copy)" ] }, - "506": { + "511": { "op": "box_len", "defined_out": [ "_%0#0", @@ -2467,7 +2471,7 @@ "maybe_exists%0#0" ] }, - "507": { + "512": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -2476,7 +2480,7 @@ "maybe_exists%0#0" ] }, - "509": { + "514": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -2485,7 +2489,7 @@ "box_prefixed_key%0#0" ] }, - "510": { + "515": { "op": "box_del", "defined_out": [ "role_address#0", @@ -2498,14 +2502,14 @@ "{box_del}" ] }, - "511": { + "516": { "op": "pop", "stack_out": [ "role_address#0", "role_id#1" ] }, - "512": { + "517": { "block": "rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12", "stack_in": [ "role_address#0", @@ -2521,7 +2525,7 @@ "tmp%2#1" ] }, - "514": { + "519": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0" @@ -2532,7 +2536,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "515": { + "520": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -2545,7 +2549,7 @@ "0x151f7c75" ] }, - "516": { + "521": { "op": "swap", "stack_out": [ "role_address#0", @@ -2554,7 +2558,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "517": { + "522": { "op": "concat", "defined_out": [ "tmp%5#0" @@ -2565,14 +2569,14 @@ "tmp%5#0" ] }, - "518": { + "523": { "op": "log", "stack_out": [ "role_address#0", "role_id#1" ] }, - "519": { + "524": { "op": "intc_0 // 1", "defined_out": [ "1" @@ -2583,14 +2587,14 @@ "1" ] }, - "520": { + "525": { "op": "return", "stack_out": [ "role_address#0", "role_id#1" ] }, - "521": { + "526": { "block": "rbac_revoke_role_after_if_else@3", "stack_in": [ "role_address#0", @@ -2606,7 +2610,7 @@ "role_id#1" ] }, - "522": { + "527": { "op": "pushint 50", "defined_out": [ "50", @@ -2619,7 +2623,7 @@ "50" ] }, - "524": { + "529": { "op": "==", "defined_out": [ "role_id#1", @@ -2631,15 +2635,15 @@ "tmp%2#2" ] }, - "525": { + "530": { "op": "bz rbac_revoke_role_after_if_else@5", "stack_out": [ "role_address#0", "role_id#1" ] }, - "528": { - "op": "bytec 4 // 0x523a50594423", + "533": { + "op": "bytec 5 // 0x523a50594423", "defined_out": [ "0x523a50594423", "role_id#1" @@ -2650,7 +2654,7 @@ "0x523a50594423" ] }, - "530": { + "535": { "op": "dig 2", "defined_out": [ "0x523a50594423", @@ -2664,7 +2668,7 @@ "role_address#0" ] }, - "532": { + "537": { "op": "concat", "defined_out": [ "box_prefixed_key%2#0", @@ -2677,7 +2681,7 @@ "box_prefixed_key%2#0" ] }, - "533": { + "538": { "op": "dup", "defined_out": [ "box_prefixed_key%2#0", @@ -2692,7 +2696,7 @@ "box_prefixed_key%2#0 (copy)" ] }, - "534": { + "539": { "op": "box_len", "defined_out": [ "_%1#0", @@ -2709,7 +2713,7 @@ "maybe_exists%1#0" ] }, - "535": { + "540": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -2718,7 +2722,7 @@ "maybe_exists%1#0" ] }, - "537": { + "542": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -2727,7 +2731,7 @@ "box_prefixed_key%2#0" ] }, - "538": { + "543": { "op": "box_del", "defined_out": [ "role_address#0", @@ -2740,17 +2744,17 @@ "{box_del}" ] }, - "539": { + "544": { "op": "pop", "stack_out": [ "role_address#0", "role_id#1" ] }, - "540": { + "545": { "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" }, - "543": { + "548": { "block": "rbac_revoke_role_after_if_else@5", "stack_in": [ "role_address#0", @@ -2766,7 +2770,7 @@ "role_id#1" ] }, - "544": { + "549": { "op": "pushint 60", "defined_out": [ "60", @@ -2779,7 +2783,7 @@ "60" ] }, - "546": { + "551": { "op": "==", "defined_out": [ "role_id#1", @@ -2791,15 +2795,15 @@ "tmp%3#0" ] }, - "547": { + "552": { "op": "bz rbac_revoke_role_after_if_else@7", "stack_out": [ "role_address#0", "role_id#1" ] }, - "550": { - "op": "bytec 5 // 0x523a54525323", + "555": { + "op": "bytec_2 // 0x523a54525323", "defined_out": [ "0x523a54525323", "role_id#1" @@ -2810,7 +2814,7 @@ "0x523a54525323" ] }, - "552": { + "556": { "op": "dig 2", "defined_out": [ "0x523a54525323", @@ -2824,7 +2828,7 @@ "role_address#0" ] }, - "554": { + "558": { "op": "concat", "defined_out": [ "box_prefixed_key%4#0", @@ -2837,7 +2841,7 @@ "box_prefixed_key%4#0" ] }, - "555": { + "559": { "op": "dup", "defined_out": [ "box_prefixed_key%4#0", @@ -2852,7 +2856,7 @@ "box_prefixed_key%4#0 (copy)" ] }, - "556": { + "560": { "op": "box_len", "defined_out": [ "_%2#0", @@ -2869,7 +2873,7 @@ "maybe_exists%2#0" ] }, - "557": { + "561": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -2878,7 +2882,7 @@ "maybe_exists%2#0" ] }, - "559": { + "563": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -2887,7 +2891,7 @@ "box_prefixed_key%4#0" ] }, - "560": { + "564": { "op": "box_del", "defined_out": [ "role_address#0", @@ -2900,17 +2904,17 @@ "{box_del}" ] }, - "561": { + "565": { "op": "pop", "stack_out": [ "role_address#0", "role_id#1" ] }, - "562": { + "566": { "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" }, - "565": { + "569": { "block": "rbac_revoke_role_after_if_else@7", "stack_in": [ "role_address#0", @@ -2926,7 +2930,7 @@ "role_id#1" ] }, - "566": { + "570": { "op": "pushint 70", "defined_out": [ "70", @@ -2939,7 +2943,7 @@ "70" ] }, - "568": { + "572": { "op": "==", "defined_out": [ "role_id#1", @@ -2951,15 +2955,15 @@ "tmp%4#1" ] }, - "569": { + "573": { "op": "bz rbac_revoke_role_after_if_else@9", "stack_out": [ "role_address#0", "role_id#1" ] }, - "572": { - "op": "bytec_2 // 0x523a41555423", + "576": { + "op": "bytec_3 // 0x523a41555423", "defined_out": [ "0x523a41555423", "role_id#1" @@ -2970,7 +2974,7 @@ "0x523a41555423" ] }, - "573": { + "577": { "op": "dig 2", "defined_out": [ "0x523a41555423", @@ -2984,7 +2988,7 @@ "role_address#0" ] }, - "575": { + "579": { "op": "concat", "defined_out": [ "box_prefixed_key%6#0", @@ -2997,7 +3001,7 @@ "box_prefixed_key%6#0" ] }, - "576": { + "580": { "op": "dup", "defined_out": [ "box_prefixed_key%6#0", @@ -3012,7 +3016,7 @@ "box_prefixed_key%6#0 (copy)" ] }, - "577": { + "581": { "op": "box_len", "defined_out": [ "_%3#0", @@ -3029,7 +3033,7 @@ "maybe_exists%3#0" ] }, - "578": { + "582": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -3038,7 +3042,7 @@ "maybe_exists%3#0" ] }, - "580": { + "584": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -3047,7 +3051,7 @@ "box_prefixed_key%6#0" ] }, - "581": { + "585": { "op": "box_del", "defined_out": [ "role_address#0", @@ -3060,17 +3064,17 @@ "{box_del}" ] }, - "582": { + "586": { "op": "pop", "stack_out": [ "role_address#0", "role_id#1" ] }, - "583": { + "587": { "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" }, - "586": { + "590": { "block": "rbac_revoke_role_after_if_else@9", "stack_in": [ "role_address#0", @@ -3086,7 +3090,7 @@ "role_id#1" ] }, - "587": { + "591": { "op": "pushint 80", "defined_out": [ "80", @@ -3099,7 +3103,7 @@ "80" ] }, - "589": { + "593": { "op": "==", "defined_out": [ "role_id#1", @@ -3111,14 +3115,14 @@ "tmp%5#1" ] }, - "590": { + "594": { "op": "bz rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12", "stack_out": [ "role_address#0", "role_id#1" ] }, - "593": { + "597": { "op": "bytec 6 // 0x523a4d4f4323", "defined_out": [ "0x523a4d4f4323", @@ -3130,7 +3134,7 @@ "0x523a4d4f4323" ] }, - "595": { + "599": { "op": "dig 2", "defined_out": [ "0x523a4d4f4323", @@ -3144,7 +3148,7 @@ "role_address#0" ] }, - "597": { + "601": { "op": "concat", "defined_out": [ "box_prefixed_key%8#0", @@ -3157,7 +3161,7 @@ "box_prefixed_key%8#0" ] }, - "598": { + "602": { "op": "dup", "defined_out": [ "box_prefixed_key%8#0", @@ -3172,7 +3176,7 @@ "box_prefixed_key%8#0 (copy)" ] }, - "599": { + "603": { "op": "box_len", "defined_out": [ "_%4#0", @@ -3189,7 +3193,7 @@ "maybe_exists%4#0" ] }, - "600": { + "604": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -3198,7 +3202,7 @@ "maybe_exists%4#0" ] }, - "602": { + "606": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -3207,7 +3211,7 @@ "box_prefixed_key%8#0" ] }, - "603": { + "607": { "op": "box_del", "defined_out": [ "role_address#0", @@ -3220,17 +3224,17 @@ "{box_del}" ] }, - "604": { + "608": { "op": "pop", "stack_out": [ "role_address#0", "role_id#1" ] }, - "605": { + "609": { "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" }, - "608": { + "612": { "subroutine": "modules.rbac.RbacModule.rbac_contract_suspension[routing]", "params": {}, "block": "rbac_contract_suspension", @@ -3243,7 +3247,7 @@ "tmp%0#0" ] }, - "611": { + "615": { "op": "dup", "defined_out": [ "tmp%0#0", @@ -3254,7 +3258,7 @@ "tmp%0#0 (copy)" ] }, - "612": { + "616": { "op": "len", "defined_out": [ "len%0#0", @@ -3265,7 +3269,7 @@ "len%0#0" ] }, - "613": { + "617": { "op": "intc_0 // 1", "defined_out": [ "1", @@ -3278,7 +3282,7 @@ "1" ] }, - "614": { + "618": { "op": "==", "defined_out": [ "eq%0#0", @@ -3289,14 +3293,14 @@ "eq%0#0" ] }, - "615": { + "619": { "error": "invalid number of bytes for arc4.bool", "op": "assert // invalid number of bytes for arc4.bool", "stack_out": [ "tmp%0#0" ] }, - "616": { + "620": { "op": "intc_1 // 0", "defined_out": [ "0", @@ -3307,7 +3311,7 @@ "0" ] }, - "617": { + "621": { "op": "getbit", "defined_out": [ "suspended#0" @@ -3316,8 +3320,8 @@ "suspended#0" ] }, - "618": { - "op": "bytec_2 // 0x523a41555423", + "622": { + "op": "bytec_3 // 0x523a41555423", "defined_out": [ "0x523a41555423", "suspended#0" @@ -3327,61 +3331,271 @@ "0x523a41555423" ] }, - "619": { + "623": { + "op": "txn Sender", + "defined_out": [ + "0x523a41555423", + "suspended#0", + "tmp%0#2" + ], + "stack_out": [ + "suspended#0", + "0x523a41555423", + "tmp%0#2" + ] + }, + "625": { + "callsub": "modules.rbac.RbacModule._role_is_active", + "op": "callsub _role_is_active", + "defined_out": [ + "suspended#0", + "tmp%1#0" + ], + "stack_out": [ + "suspended#0", + "tmp%1#0" + ] + }, + "628": { + "error": "Not authorized", + "op": "assert // Not authorized", + "stack_out": [ + "suspended#0" + ] + }, + "629": { + "op": "bytec 9 // \"contract_suspended\"", + "defined_out": [ + "\"contract_suspended\"", + "suspended#0" + ], + "stack_out": [ + "suspended#0", + "\"contract_suspended\"" + ] + }, + "631": { + "op": "swap", + "stack_out": [ + "\"contract_suspended\"", + "suspended#0" + ] + }, + "632": { + "op": "app_global_put", + "stack_out": [] + }, + "633": { + "op": "global LatestTimestamp", + "defined_out": [ + "tmp%0#1" + ], + "stack_out": [ + "tmp%0#1" + ] + }, + "635": { + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%0#0" + ], + "stack_out": [ + "aggregate%val_as_bytes%0#0" + ] + }, + "636": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "aggregate%val_as_bytes%0#0" + ], + "stack_out": [ + "aggregate%val_as_bytes%0#0", + "0x151f7c75" + ] + }, + "637": { + "op": "swap", + "stack_out": [ + "0x151f7c75", + "aggregate%val_as_bytes%0#0" + ] + }, + "638": { + "op": "concat", + "defined_out": [ + "tmp%4#0" + ], + "stack_out": [ + "tmp%4#0" + ] + }, + "639": { + "op": "log", + "stack_out": [] + }, + "640": { + "op": "intc_0 // 1", + "stack_out": [ + "1" + ] + }, + "641": { + "op": "return", + "stack_out": [] + }, + "642": { + "subroutine": "modules.rbac.RbacModule.rbac_contract_default[routing]", + "params": {}, + "block": "rbac_contract_default", + "stack_in": [], + "op": "txna ApplicationArgs 1", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "645": { + "op": "dup", + "defined_out": [ + "tmp%0#0", + "tmp%0#0 (copy)" + ], + "stack_out": [ + "tmp%0#0", + "tmp%0#0 (copy)" + ] + }, + "646": { + "op": "len", + "defined_out": [ + "len%0#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "len%0#0" + ] + }, + "647": { + "op": "intc_0 // 1", + "defined_out": [ + "1", + "len%0#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "len%0#0", + "1" + ] + }, + "648": { + "op": "==", + "defined_out": [ + "eq%0#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "eq%0#0" + ] + }, + "649": { + "error": "invalid number of bytes for arc4.bool", + "op": "assert // invalid number of bytes for arc4.bool", + "stack_out": [ + "tmp%0#0" + ] + }, + "650": { + "op": "intc_1 // 0", + "defined_out": [ + "0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "0" + ] + }, + "651": { + "op": "getbit", + "defined_out": [ + "defaulted#0" + ], + "stack_out": [ + "defaulted#0" + ] + }, + "652": { + "op": "bytec_2 // 0x523a54525323", + "defined_out": [ + "0x523a54525323", + "defaulted#0" + ], + "stack_out": [ + "defaulted#0", + "0x523a54525323" + ] + }, + "653": { "op": "txn Sender", "defined_out": [ - "0x523a41555423", - "suspended#0", + "0x523a54525323", + "defaulted#0", "tmp%0#2" ], "stack_out": [ - "suspended#0", - "0x523a41555423", + "defaulted#0", + "0x523a54525323", "tmp%0#2" ] }, - "621": { + "655": { "callsub": "modules.rbac.RbacModule._role_is_active", "op": "callsub _role_is_active", "defined_out": [ - "suspended#0", + "defaulted#0", "tmp%1#0" ], "stack_out": [ - "suspended#0", + "defaulted#0", "tmp%1#0" ] }, - "624": { + "658": { "error": "Not authorized", "op": "assert // Not authorized", "stack_out": [ - "suspended#0" + "defaulted#0" ] }, - "625": { - "op": "bytec 8 // \"asset_suspended\"", + "659": { + "op": "bytec 7 // \"defaulted\"", "defined_out": [ - "\"asset_suspended\"", - "suspended#0" + "\"defaulted\"", + "defaulted#0" ], "stack_out": [ - "suspended#0", - "\"asset_suspended\"" + "defaulted#0", + "\"defaulted\"" ] }, - "627": { + "661": { "op": "swap", "stack_out": [ - "\"asset_suspended\"", - "suspended#0" + "\"defaulted\"", + "defaulted#0" ] }, - "628": { + "662": { "op": "app_global_put", "stack_out": [] }, - "629": { + "663": { "op": "global LatestTimestamp", "defined_out": [ "tmp%0#1" @@ -3390,7 +3604,7 @@ "tmp%0#1" ] }, - "631": { + "665": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0" @@ -3399,7 +3613,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "632": { + "666": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -3410,14 +3624,14 @@ "0x151f7c75" ] }, - "633": { + "667": { "op": "swap", "stack_out": [ "0x151f7c75", "aggregate%val_as_bytes%0#0" ] }, - "634": { + "668": { "op": "concat", "defined_out": [ "tmp%4#0" @@ -3426,21 +3640,21 @@ "tmp%4#0" ] }, - "635": { + "669": { "op": "log", "stack_out": [] }, - "636": { + "670": { "op": "intc_0 // 1", "stack_out": [ "1" ] }, - "637": { + "671": { "op": "return", "stack_out": [] }, - "638": { + "672": { "subroutine": "modules.rbac.RbacModule.rbac_get_arranger[routing]", "params": {}, "block": "rbac_get_arranger", @@ -3453,7 +3667,7 @@ "0" ] }, - "639": { + "673": { "op": "bytec_1 // 0x523a41525223", "defined_out": [ "0", @@ -3464,7 +3678,7 @@ "0x523a41525223" ] }, - "640": { + "674": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -3475,14 +3689,14 @@ "maybe_exists%0#0" ] }, - "641": { + "675": { "error": "check self.arranger exists", "op": "assert // check self.arranger exists", "stack_out": [ "maybe_value%0#0" ] }, - "642": { + "676": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -3493,14 +3707,14 @@ "0x151f7c75" ] }, - "643": { + "677": { "op": "swap", "stack_out": [ "0x151f7c75", "maybe_value%0#0" ] }, - "644": { + "678": { "op": "concat", "defined_out": [ "tmp%2#0" @@ -3509,11 +3723,11 @@ "tmp%2#0" ] }, - "645": { + "679": { "op": "log", "stack_out": [] }, - "646": { + "680": { "op": "intc_0 // 1", "defined_out": [ "1" @@ -3522,11 +3736,11 @@ "1" ] }, - "647": { + "681": { "op": "return", "stack_out": [] }, - "648": { + "682": { "subroutine": "modules.rbac.RbacModule.rbac_get_address_roles[routing]", "params": {}, "block": "rbac_get_address_roles", @@ -3539,7 +3753,7 @@ "address#0" ] }, - "651": { + "685": { "op": "dup", "defined_out": [ "address#0", @@ -3550,7 +3764,7 @@ "address#0 (copy)" ] }, - "652": { + "686": { "op": "len", "defined_out": [ "address#0", @@ -3561,7 +3775,7 @@ "len%0#0" ] }, - "653": { + "687": { "op": "intc_2 // 32", "defined_out": [ "32", @@ -3574,7 +3788,7 @@ "32" ] }, - "654": { + "688": { "op": "==", "defined_out": [ "address#0", @@ -3585,15 +3799,15 @@ "eq%0#0" ] }, - "655": { + "689": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ "address#0" ] }, - "656": { - "op": "bytec_3 // 0x523a4d4e4723", + "690": { + "op": "bytec 4 // 0x523a4d4e4723", "defined_out": [ "0x523a4d4e4723", "address#0" @@ -3603,7 +3817,7 @@ "0x523a4d4e4723" ] }, - "657": { + "692": { "op": "dig 1", "stack_out": [ "address#0", @@ -3611,7 +3825,7 @@ "address#0 (copy)" ] }, - "659": { + "694": { "callsub": "modules.rbac.RbacModule._role_is_active", "op": "callsub _role_is_active", "defined_out": [ @@ -3623,8 +3837,8 @@ "tmp%0#1" ] }, - "662": { - "op": "bytec 4 // 0x523a50594423", + "697": { + "op": "bytec 5 // 0x523a50594423", "defined_out": [ "0x523a50594423", "address#0", @@ -3636,7 +3850,7 @@ "0x523a50594423" ] }, - "664": { + "699": { "op": "dig 2", "stack_out": [ "address#0", @@ -3645,7 +3859,7 @@ "address#0 (copy)" ] }, - "666": { + "701": { "callsub": "modules.rbac.RbacModule._role_is_active", "op": "callsub _role_is_active", "defined_out": [ @@ -3659,8 +3873,8 @@ "tmp%1#1" ] }, - "669": { - "op": "bytec 5 // 0x523a54525323", + "704": { + "op": "bytec_2 // 0x523a54525323", "defined_out": [ "0x523a54525323", "address#0", @@ -3674,7 +3888,7 @@ "0x523a54525323" ] }, - "671": { + "705": { "op": "dig 3", "stack_out": [ "address#0", @@ -3684,7 +3898,7 @@ "address#0 (copy)" ] }, - "673": { + "707": { "callsub": "modules.rbac.RbacModule._role_is_active", "op": "callsub _role_is_active", "defined_out": [ @@ -3700,8 +3914,8 @@ "tmp%2#1" ] }, - "676": { - "op": "bytec_2 // 0x523a41555423", + "710": { + "op": "bytec_3 // 0x523a41555423", "defined_out": [ "0x523a41555423", "address#0", @@ -3717,7 +3931,7 @@ "0x523a41555423" ] }, - "677": { + "711": { "op": "dig 4", "stack_out": [ "address#0", @@ -3728,7 +3942,7 @@ "address#0 (copy)" ] }, - "679": { + "713": { "callsub": "modules.rbac.RbacModule._role_is_active", "op": "callsub _role_is_active", "defined_out": [ @@ -3746,7 +3960,7 @@ "tmp%3#1" ] }, - "682": { + "716": { "op": "bytec 6 // 0x523a4d4f4323", "defined_out": [ "0x523a4d4f4323", @@ -3765,7 +3979,7 @@ "0x523a4d4f4323" ] }, - "684": { + "718": { "op": "uncover 5", "stack_out": [ "tmp%0#1", @@ -3776,7 +3990,7 @@ "address#0" ] }, - "686": { + "720": { "callsub": "modules.rbac.RbacModule._role_is_active", "op": "callsub _role_is_active", "defined_out": [ @@ -3794,7 +4008,7 @@ "tmp%4#1" ] }, - "689": { + "723": { "op": "pushbytes 0x00", "defined_out": [ "0x00", @@ -3813,7 +4027,7 @@ "0x00" ] }, - "692": { + "726": { "op": "intc_1 // 0", "defined_out": [ "0", @@ -3834,7 +4048,7 @@ "0" ] }, - "693": { + "727": { "op": "uncover 6", "stack_out": [ "tmp%1#1", @@ -3846,7 +4060,7 @@ "tmp%0#1" ] }, - "695": { + "729": { "op": "setbit", "defined_out": [ "aggregate%encoded_bool%0#0", @@ -3863,7 +4077,7 @@ "aggregate%encoded_bool%0#0" ] }, - "696": { + "730": { "op": "intc_0 // 1", "defined_out": [ "1", @@ -3882,7 +4096,7 @@ "1" ] }, - "697": { + "731": { "op": "uncover 5", "stack_out": [ "tmp%2#1", @@ -3893,7 +4107,7 @@ "tmp%1#1" ] }, - "699": { + "733": { "op": "setbit", "defined_out": [ "aggregate%set_bit%0#0", @@ -3908,7 +4122,7 @@ "aggregate%set_bit%0#0" ] }, - "700": { + "734": { "op": "pushint 2", "defined_out": [ "2", @@ -3925,7 +4139,7 @@ "2" ] }, - "702": { + "736": { "op": "uncover 4", "stack_out": [ "tmp%3#1", @@ -3935,7 +4149,7 @@ "tmp%2#1" ] }, - "704": { + "738": { "op": "setbit", "defined_out": [ "aggregate%set_bit%1#0", @@ -3948,7 +4162,7 @@ "aggregate%set_bit%1#0" ] }, - "705": { + "739": { "op": "pushint 3", "defined_out": [ "3", @@ -3963,7 +4177,7 @@ "3" ] }, - "707": { + "741": { "op": "uncover 3", "stack_out": [ "tmp%4#1", @@ -3972,7 +4186,7 @@ "tmp%3#1" ] }, - "709": { + "743": { "op": "setbit", "defined_out": [ "aggregate%set_bit%2#0", @@ -3983,7 +4197,7 @@ "aggregate%set_bit%2#0" ] }, - "710": { + "744": { "op": "pushint 4", "defined_out": [ "4", @@ -3996,7 +4210,7 @@ "4" ] }, - "712": { + "746": { "op": "uncover 2", "stack_out": [ "aggregate%set_bit%2#0", @@ -4004,7 +4218,7 @@ "tmp%4#1" ] }, - "714": { + "748": { "op": "setbit", "defined_out": [ "aggregate%set_bit%3#0" @@ -4013,7 +4227,7 @@ "aggregate%set_bit%3#0" ] }, - "715": { + "749": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -4024,14 +4238,14 @@ "0x151f7c75" ] }, - "716": { + "750": { "op": "swap", "stack_out": [ "0x151f7c75", "aggregate%set_bit%3#0" ] }, - "717": { + "751": { "op": "concat", "defined_out": [ "tmp%8#0" @@ -4040,21 +4254,21 @@ "tmp%8#0" ] }, - "718": { + "752": { "op": "log", "stack_out": [] }, - "719": { + "753": { "op": "intc_0 // 1", "stack_out": [ "1" ] }, - "720": { + "754": { "op": "return", "stack_out": [] }, - "721": { + "755": { "subroutine": "modules.rbac.RbacModule.rbac_get_role_validity[routing]", "params": {}, "block": "rbac_get_role_validity", @@ -4067,7 +4281,7 @@ "role_id#0" ] }, - "724": { + "758": { "op": "dup", "defined_out": [ "role_id#0", @@ -4078,7 +4292,7 @@ "role_id#0 (copy)" ] }, - "725": { + "759": { "op": "len", "defined_out": [ "len%0#0", @@ -4089,7 +4303,7 @@ "len%0#0" ] }, - "726": { + "760": { "op": "intc_0 // 1", "defined_out": [ "1", @@ -4102,7 +4316,7 @@ "1" ] }, - "727": { + "761": { "op": "==", "defined_out": [ "eq%0#0", @@ -4113,17 +4327,17 @@ "eq%0#0" ] }, - "728": { + "762": { "error": "invalid number of bytes for arc4.uint8", "op": "assert // invalid number of bytes for arc4.uint8", "stack_out": [ "role_id#0" ] }, - "729": { + "763": { "op": "txna ApplicationArgs 2" }, - "732": { + "766": { "op": "dup", "defined_out": [ "role_address#0", @@ -4135,7 +4349,7 @@ "role_address#0" ] }, - "733": { + "767": { "op": "cover 2", "defined_out": [ "role_address#0", @@ -4147,7 +4361,7 @@ "role_address#0" ] }, - "735": { + "769": { "op": "len", "defined_out": [ "len%1#0", @@ -4160,7 +4374,7 @@ "len%1#0" ] }, - "736": { + "770": { "op": "intc_2 // 32", "defined_out": [ "32", @@ -4175,7 +4389,7 @@ "32" ] }, - "737": { + "771": { "op": "==", "defined_out": [ "eq%1#0", @@ -4188,7 +4402,7 @@ "eq%1#0" ] }, - "738": { + "772": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ @@ -4196,7 +4410,7 @@ "role_id#0" ] }, - "739": { + "773": { "op": "btoi", "defined_out": [ "role#0", @@ -4207,7 +4421,7 @@ "role#0" ] }, - "740": { + "774": { "op": "dup", "defined_out": [ "role#0", @@ -4220,7 +4434,7 @@ "role#0 (copy)" ] }, - "741": { + "775": { "callsub": "modules.rbac.RbacModule._assert_valid_role", "op": "callsub _assert_valid_role", "stack_out": [ @@ -4228,7 +4442,7 @@ "role#0" ] }, - "744": { + "778": { "op": "intc_3 // 20", "defined_out": [ "20", @@ -4241,7 +4455,7 @@ "20" ] }, - "745": { + "779": { "op": "pushints 40 50 60 70 80", "defined_out": [ "20", @@ -4264,7 +4478,7 @@ "80" ] }, - "752": { + "786": { "op": "uncover 6", "stack_out": [ "role_address#0", @@ -4277,17 +4491,17 @@ "role#0" ] }, - "754": { + "788": { "op": "match rbac_get_role_validity_switch_case_0@2 rbac_get_role_validity_switch_case_1@3 rbac_get_role_validity_switch_case_2@4 rbac_get_role_validity_switch_case_3@5 rbac_get_role_validity_switch_case_4@6 rbac_get_role_validity_switch_case_5@7", "stack_out": [ "role_address#0" ] }, - "768": { + "802": { "error": "Invalid role identifier", "op": "err // Invalid role identifier" }, - "769": { + "803": { "block": "rbac_get_role_validity_switch_case_5@7", "stack_in": [ "role_address#0" @@ -4301,7 +4515,7 @@ "0x523a4d4f4323" ] }, - "771": { + "805": { "op": "dig 1", "defined_out": [ "0x523a4d4f4323", @@ -4313,7 +4527,7 @@ "role_address#0" ] }, - "773": { + "807": { "op": "concat", "defined_out": [ "box_prefixed_key%0#1", @@ -4324,7 +4538,7 @@ "box_prefixed_key%0#1" ] }, - "774": { + "808": { "op": "dup", "defined_out": [ "box_prefixed_key%0#1", @@ -4337,7 +4551,7 @@ "box_prefixed_key%0#1 (copy)" ] }, - "775": { + "809": { "op": "box_len", "defined_out": [ "_%0#0", @@ -4352,7 +4566,7 @@ "maybe_exists%0#0" ] }, - "776": { + "810": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -4360,7 +4574,7 @@ "maybe_exists%0#0" ] }, - "778": { + "812": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -4368,7 +4582,7 @@ "box_prefixed_key%0#1" ] }, - "779": { + "813": { "op": "box_get", "defined_out": [ "aggregate%box_get%8#0", @@ -4381,7 +4595,7 @@ "aggregate%box_get%9#0" ] }, - "780": { + "814": { "op": "pop", "defined_out": [ "role_address#0", @@ -4392,7 +4606,7 @@ "tmp%3#0" ] }, - "781": { + "815": { "block": "rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9", "stack_in": [ "role_address#0", @@ -4408,7 +4622,7 @@ "0x151f7c75" ] }, - "782": { + "816": { "op": "swap", "defined_out": [ "0x151f7c75", @@ -4420,7 +4634,7 @@ "tmp%3#0" ] }, - "783": { + "817": { "op": "concat", "defined_out": [ "tmp%4#0" @@ -4430,13 +4644,13 @@ "tmp%4#0" ] }, - "784": { + "818": { "op": "log", "stack_out": [ "role_address#0" ] }, - "785": { + "819": { "op": "intc_0 // 1", "defined_out": [ "1" @@ -4446,18 +4660,18 @@ "1" ] }, - "786": { + "820": { "op": "return", "stack_out": [ "role_address#0" ] }, - "787": { + "821": { "block": "rbac_get_role_validity_switch_case_4@6", "stack_in": [ "role_address#0" ], - "op": "bytec_2 // 0x523a41555423", + "op": "bytec_3 // 0x523a41555423", "defined_out": [ "0x523a41555423" ], @@ -4466,7 +4680,7 @@ "0x523a41555423" ] }, - "788": { + "822": { "op": "dig 1", "defined_out": [ "0x523a41555423", @@ -4478,7 +4692,7 @@ "role_address#0" ] }, - "790": { + "824": { "op": "concat", "defined_out": [ "box_prefixed_key%0#1", @@ -4489,7 +4703,7 @@ "box_prefixed_key%0#1" ] }, - "791": { + "825": { "op": "dup", "defined_out": [ "box_prefixed_key%0#1", @@ -4502,7 +4716,7 @@ "box_prefixed_key%0#1 (copy)" ] }, - "792": { + "826": { "op": "box_len", "defined_out": [ "_%0#0", @@ -4517,7 +4731,7 @@ "maybe_exists%0#0" ] }, - "793": { + "827": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -4525,7 +4739,7 @@ "maybe_exists%0#0" ] }, - "795": { + "829": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -4533,7 +4747,7 @@ "box_prefixed_key%0#1" ] }, - "796": { + "830": { "op": "box_get", "defined_out": [ "aggregate%box_get%6#0", @@ -4546,7 +4760,7 @@ "aggregate%box_get%7#0" ] }, - "797": { + "831": { "op": "pop", "defined_out": [ "role_address#0", @@ -4557,15 +4771,15 @@ "tmp%3#0" ] }, - "798": { + "832": { "op": "b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9" }, - "801": { + "835": { "block": "rbac_get_role_validity_switch_case_3@5", "stack_in": [ "role_address#0" ], - "op": "bytec 5 // 0x523a54525323", + "op": "bytec_2 // 0x523a54525323", "defined_out": [ "0x523a54525323" ], @@ -4574,7 +4788,7 @@ "0x523a54525323" ] }, - "803": { + "836": { "op": "dig 1", "defined_out": [ "0x523a54525323", @@ -4586,7 +4800,7 @@ "role_address#0" ] }, - "805": { + "838": { "op": "concat", "defined_out": [ "box_prefixed_key%0#1", @@ -4597,7 +4811,7 @@ "box_prefixed_key%0#1" ] }, - "806": { + "839": { "op": "dup", "defined_out": [ "box_prefixed_key%0#1", @@ -4610,7 +4824,7 @@ "box_prefixed_key%0#1 (copy)" ] }, - "807": { + "840": { "op": "box_len", "defined_out": [ "_%0#0", @@ -4625,7 +4839,7 @@ "maybe_exists%0#0" ] }, - "808": { + "841": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -4633,7 +4847,7 @@ "maybe_exists%0#0" ] }, - "810": { + "843": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -4641,7 +4855,7 @@ "box_prefixed_key%0#1" ] }, - "811": { + "844": { "op": "box_get", "defined_out": [ "aggregate%box_get%4#0", @@ -4654,7 +4868,7 @@ "aggregate%box_get%5#0" ] }, - "812": { + "845": { "op": "pop", "defined_out": [ "role_address#0", @@ -4665,15 +4879,15 @@ "tmp%3#0" ] }, - "813": { + "846": { "op": "b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9" }, - "816": { + "849": { "block": "rbac_get_role_validity_switch_case_2@4", "stack_in": [ "role_address#0" ], - "op": "bytec 4 // 0x523a50594423", + "op": "bytec 5 // 0x523a50594423", "defined_out": [ "0x523a50594423" ], @@ -4682,7 +4896,7 @@ "0x523a50594423" ] }, - "818": { + "851": { "op": "dig 1", "defined_out": [ "0x523a50594423", @@ -4694,7 +4908,7 @@ "role_address#0" ] }, - "820": { + "853": { "op": "concat", "defined_out": [ "box_prefixed_key%0#1", @@ -4705,7 +4919,7 @@ "box_prefixed_key%0#1" ] }, - "821": { + "854": { "op": "dup", "defined_out": [ "box_prefixed_key%0#1", @@ -4718,7 +4932,7 @@ "box_prefixed_key%0#1 (copy)" ] }, - "822": { + "855": { "op": "box_len", "defined_out": [ "_%0#0", @@ -4733,7 +4947,7 @@ "maybe_exists%0#0" ] }, - "823": { + "856": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -4741,7 +4955,7 @@ "maybe_exists%0#0" ] }, - "825": { + "858": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -4749,7 +4963,7 @@ "box_prefixed_key%0#1" ] }, - "826": { + "859": { "op": "box_get", "defined_out": [ "aggregate%box_get%2#0", @@ -4762,7 +4976,7 @@ "aggregate%box_get%3#0" ] }, - "827": { + "860": { "op": "pop", "defined_out": [ "role_address#0", @@ -4773,15 +4987,15 @@ "tmp%3#0" ] }, - "828": { + "861": { "op": "b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9" }, - "831": { + "864": { "block": "rbac_get_role_validity_switch_case_1@3", "stack_in": [ "role_address#0" ], - "op": "bytec_3 // 0x523a4d4e4723", + "op": "bytec 4 // 0x523a4d4e4723", "defined_out": [ "0x523a4d4e4723" ], @@ -4790,7 +5004,7 @@ "0x523a4d4e4723" ] }, - "832": { + "866": { "op": "dig 1", "defined_out": [ "0x523a4d4e4723", @@ -4802,7 +5016,7 @@ "role_address#0" ] }, - "834": { + "868": { "op": "concat", "defined_out": [ "box_prefixed_key%0#1", @@ -4813,7 +5027,7 @@ "box_prefixed_key%0#1" ] }, - "835": { + "869": { "op": "dup", "defined_out": [ "box_prefixed_key%0#1", @@ -4826,7 +5040,7 @@ "box_prefixed_key%0#1 (copy)" ] }, - "836": { + "870": { "op": "box_len", "defined_out": [ "_%0#0", @@ -4841,7 +5055,7 @@ "maybe_exists%0#0" ] }, - "837": { + "871": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -4849,7 +5063,7 @@ "maybe_exists%0#0" ] }, - "839": { + "873": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -4857,7 +5071,7 @@ "box_prefixed_key%0#1" ] }, - "840": { + "874": { "op": "box_get", "defined_out": [ "aggregate%box_get%0#0", @@ -4870,7 +5084,7 @@ "aggregate%box_get%1#0" ] }, - "841": { + "875": { "op": "pop", "defined_out": [ "role_address#0", @@ -4881,10 +5095,10 @@ "tmp%3#0" ] }, - "842": { + "876": { "op": "b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9" }, - "845": { + "879": { "block": "rbac_get_role_validity_switch_case_0@2", "stack_in": [ "role_address#0" @@ -4898,10 +5112,10 @@ "tmp%3#0" ] }, - "863": { + "897": { "op": "b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9" }, - "866": { + "900": { "subroutine": "modules.rbac.RbacModule._role_is_active", "params": { "role_map#0": "bytes", @@ -4911,13 +5125,13 @@ "stack_in": [], "op": "proto 2 1" }, - "869": { + "903": { "op": "pushbytes \"\"", "stack_out": [ "awst_tmp%0#0" ] }, - "871": { + "905": { "op": "frame_dig -2", "defined_out": [ "role_map#0 (copy)" @@ -4927,7 +5141,7 @@ "role_map#0 (copy)" ] }, - "873": { + "907": { "op": "frame_dig -1", "defined_out": [ "role_address#0 (copy)", @@ -4939,7 +5153,7 @@ "role_address#0 (copy)" ] }, - "875": { + "909": { "op": "concat", "defined_out": [ "box_prefixed_key%0#1" @@ -4949,7 +5163,7 @@ "box_prefixed_key%0#1" ] }, - "876": { + "910": { "op": "dup", "defined_out": [ "box_prefixed_key%0#1" @@ -4960,7 +5174,7 @@ "box_prefixed_key%0#1" ] }, - "877": { + "911": { "op": "box_len", "defined_out": [ "_%0#0", @@ -4974,7 +5188,7 @@ "maybe_exists%0#0" ] }, - "878": { + "912": { "op": "bury 1", "stack_out": [ "awst_tmp%0#0", @@ -4982,14 +5196,14 @@ "maybe_exists%0#0" ] }, - "880": { + "914": { "op": "bz _role_is_active_bool_false@4", "stack_out": [ "awst_tmp%0#0", "box_prefixed_key%0#1" ] }, - "883": { + "917": { "op": "frame_dig 1", "stack_out": [ "awst_tmp%0#0", @@ -4997,7 +5211,7 @@ "box_prefixed_key%0#1" ] }, - "885": { + "919": { "op": "box_get", "defined_out": [ "aggregate%box_get%0#0", @@ -5011,7 +5225,7 @@ "aggregate%box_get%1#0" ] }, - "886": { + "920": { "error": "check BoxMap entry exists", "op": "assert // check BoxMap entry exists", "stack_out": [ @@ -5020,7 +5234,7 @@ "aggregate%box_get%0#0" ] }, - "887": { + "921": { "op": "intc_1 // 0", "stack_out": [ "awst_tmp%0#0", @@ -5029,7 +5243,7 @@ "0" ] }, - "888": { + "922": { "op": "extract_uint64", "defined_out": [ "box_prefixed_key%0#1", @@ -5041,10 +5255,10 @@ "values%0#0" ] }, - "889": { + "923": { "op": "global LatestTimestamp" }, - "891": { + "925": { "op": "dup", "defined_out": [ "awst_tmp%0#0", @@ -5059,7 +5273,7 @@ "awst_tmp%0#0" ] }, - "892": { + "926": { "op": "frame_bury 0", "defined_out": [ "awst_tmp%0#0", @@ -5073,7 +5287,7 @@ "awst_tmp%0#0" ] }, - "894": { + "928": { "op": "<=", "defined_out": [ "awst_tmp%0#0", @@ -5086,14 +5300,14 @@ "tmp%1#0" ] }, - "895": { + "929": { "op": "bz _role_is_active_bool_false@4", "stack_out": [ "awst_tmp%0#0", "box_prefixed_key%0#1" ] }, - "898": { + "932": { "op": "frame_dig 1", "stack_out": [ "awst_tmp%0#0", @@ -5101,7 +5315,7 @@ "box_prefixed_key%0#1" ] }, - "900": { + "934": { "op": "box_get", "defined_out": [ "aggregate%box_get%2#0", @@ -5116,7 +5330,7 @@ "aggregate%box_get%3#0" ] }, - "901": { + "935": { "error": "check BoxMap entry exists", "op": "assert // check BoxMap entry exists", "stack_out": [ @@ -5125,7 +5339,7 @@ "aggregate%box_get%2#0" ] }, - "902": { + "936": { "op": "pushint 8", "defined_out": [ "8", @@ -5140,7 +5354,7 @@ "8" ] }, - "904": { + "938": { "op": "extract_uint64", "defined_out": [ "awst_tmp%0#0", @@ -5153,7 +5367,7 @@ "values%1#0" ] }, - "905": { + "939": { "op": "frame_dig 0", "stack_out": [ "awst_tmp%0#0", @@ -5162,7 +5376,7 @@ "awst_tmp%0#0" ] }, - "907": { + "941": { "op": ">=", "defined_out": [ "awst_tmp%0#0", @@ -5175,14 +5389,14 @@ "tmp%2#0" ] }, - "908": { + "942": { "op": "bz _role_is_active_bool_false@4", "stack_out": [ "awst_tmp%0#0", "box_prefixed_key%0#1" ] }, - "911": { + "945": { "op": "intc_0 // 1", "defined_out": [ "and_result%0#0", @@ -5195,7 +5409,7 @@ "and_result%0#0" ] }, - "912": { + "946": { "block": "_role_is_active_bool_merge@5", "stack_in": [ "awst_tmp%0#0", @@ -5207,11 +5421,11 @@ "and_result%0#0" ] }, - "914": { + "948": { "retsub": true, "op": "retsub" }, - "915": { + "949": { "block": "_role_is_active_bool_false@4", "stack_in": [ "awst_tmp%0#0", @@ -5227,10 +5441,10 @@ "and_result%0#0" ] }, - "916": { + "950": { "op": "b _role_is_active_bool_merge@5" }, - "919": { + "953": { "subroutine": "modules.rbac.RbacModule._assert_caller_is_arranger", "params": {}, "block": "_assert_caller_is_arranger", @@ -5243,7 +5457,7 @@ "role_address#0" ] }, - "921": { + "955": { "op": "intc_1 // 0", "defined_out": [ "0", @@ -5254,7 +5468,7 @@ "0" ] }, - "922": { + "956": { "op": "bytec_1 // 0x523a41525223", "defined_out": [ "0", @@ -5267,7 +5481,7 @@ "0x523a41525223" ] }, - "923": { + "957": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -5280,7 +5494,7 @@ "maybe_exists%0#0" ] }, - "924": { + "958": { "error": "check self.arranger exists", "op": "assert // check self.arranger exists", "stack_out": [ @@ -5288,7 +5502,7 @@ "maybe_value%0#0" ] }, - "925": { + "959": { "op": "==", "defined_out": [ "tmp%0#1" @@ -5297,16 +5511,16 @@ "tmp%0#1" ] }, - "926": { + "960": { "error": "Not authorized", "op": "assert // Not authorized", "stack_out": [] }, - "927": { + "961": { "retsub": true, "op": "retsub" }, - "928": { + "962": { "subroutine": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", "params": {}, "block": "_assert_is_not_asset_defaulted", @@ -5319,18 +5533,18 @@ "0" ] }, - "929": { - "op": "bytec 9 // \"asset_defaulted\"", + "963": { + "op": "bytec 7 // \"defaulted\"", "defined_out": [ - "\"asset_defaulted\"", + "\"defaulted\"", "0" ], "stack_out": [ "0", - "\"asset_defaulted\"" + "\"defaulted\"" ] }, - "931": { + "965": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -5341,14 +5555,14 @@ "maybe_exists%0#0" ] }, - "932": { - "error": "check self.asset_defaulted exists", - "op": "assert // check self.asset_defaulted exists", + "966": { + "error": "check self.defaulted exists", + "op": "assert // check self.defaulted exists", "stack_out": [ "maybe_value%0#0" ] }, - "933": { + "967": { "op": "!", "defined_out": [ "tmp%0#0" @@ -5357,16 +5571,16 @@ "tmp%0#0" ] }, - "934": { + "968": { "error": "Defaulted", "op": "assert // Defaulted", "stack_out": [] }, - "935": { + "969": { "retsub": true, "op": "retsub" }, - "936": { + "970": { "subroutine": "modules.rbac.RbacModule._assert_valid_role", "params": { "role_id#0": "uint64" @@ -5375,7 +5589,7 @@ "stack_in": [], "op": "proto 1 0" }, - "939": { + "973": { "op": "frame_dig -1", "defined_out": [ "role_id#0 (copy)" @@ -5384,7 +5598,7 @@ "role_id#0 (copy)" ] }, - "941": { + "975": { "op": "intc_3 // 20", "defined_out": [ "20", @@ -5395,7 +5609,7 @@ "20" ] }, - "942": { + "976": { "op": "==", "defined_out": [ "tmp%0#0" @@ -5404,17 +5618,17 @@ "tmp%0#0" ] }, - "943": { + "977": { "op": "bnz _assert_valid_role_bool_true@7", "stack_out": [] }, - "946": { + "980": { "op": "frame_dig -1", "stack_out": [ "role_id#0 (copy)" ] }, - "948": { + "982": { "op": "pushint 25", "defined_out": [ "25", @@ -5425,7 +5639,7 @@ "25" ] }, - "950": { + "984": { "op": "==", "defined_out": [ "tmp%1#0" @@ -5434,17 +5648,17 @@ "tmp%1#0" ] }, - "951": { + "985": { "op": "bnz _assert_valid_role_bool_true@7", "stack_out": [] }, - "954": { + "988": { "op": "frame_dig -1", "stack_out": [ "role_id#0 (copy)" ] }, - "956": { + "990": { "op": "pushint 40", "defined_out": [ "40", @@ -5455,7 +5669,7 @@ "40" ] }, - "958": { + "992": { "op": "==", "defined_out": [ "tmp%2#0" @@ -5464,17 +5678,17 @@ "tmp%2#0" ] }, - "959": { + "993": { "op": "bnz _assert_valid_role_bool_true@7", "stack_out": [] }, - "962": { + "996": { "op": "frame_dig -1", "stack_out": [ "role_id#0 (copy)" ] }, - "964": { + "998": { "op": "pushint 50", "defined_out": [ "50", @@ -5485,7 +5699,7 @@ "50" ] }, - "966": { + "1000": { "op": "==", "defined_out": [ "tmp%3#0" @@ -5494,17 +5708,17 @@ "tmp%3#0" ] }, - "967": { + "1001": { "op": "bnz _assert_valid_role_bool_true@7", "stack_out": [] }, - "970": { + "1004": { "op": "frame_dig -1", "stack_out": [ "role_id#0 (copy)" ] }, - "972": { + "1006": { "op": "pushint 60", "defined_out": [ "60", @@ -5515,7 +5729,7 @@ "60" ] }, - "974": { + "1008": { "op": "==", "defined_out": [ "tmp%4#0" @@ -5524,17 +5738,17 @@ "tmp%4#0" ] }, - "975": { + "1009": { "op": "bnz _assert_valid_role_bool_true@7", "stack_out": [] }, - "978": { + "1012": { "op": "frame_dig -1", "stack_out": [ "role_id#0 (copy)" ] }, - "980": { + "1014": { "op": "pushint 70", "defined_out": [ "70", @@ -5545,7 +5759,7 @@ "70" ] }, - "982": { + "1016": { "op": "==", "defined_out": [ "tmp%5#0" @@ -5554,17 +5768,17 @@ "tmp%5#0" ] }, - "983": { + "1017": { "op": "bnz _assert_valid_role_bool_true@7", "stack_out": [] }, - "986": { + "1020": { "op": "frame_dig -1", "stack_out": [ "role_id#0 (copy)" ] }, - "988": { + "1022": { "op": "pushint 80", "defined_out": [ "80", @@ -5575,7 +5789,7 @@ "80" ] }, - "990": { + "1024": { "op": "==", "defined_out": [ "tmp%6#0" @@ -5584,11 +5798,11 @@ "tmp%6#0" ] }, - "991": { + "1025": { "op": "bz _assert_valid_role_bool_false@8", "stack_out": [] }, - "994": { + "1028": { "block": "_assert_valid_role_bool_true@7", "stack_in": [], "op": "intc_0 // 1", @@ -5599,7 +5813,7 @@ "or_result%0#0" ] }, - "995": { + "1029": { "error": "Invalid role identifier", "block": "_assert_valid_role_bool_merge@9", "stack_in": [ @@ -5609,11 +5823,11 @@ "defined_out": [], "stack_out": [] }, - "996": { + "1030": { "retsub": true, "op": "retsub" }, - "997": { + "1031": { "block": "_assert_valid_role_bool_false@8", "stack_in": [], "op": "intc_1 // 0", @@ -5624,7 +5838,7 @@ "or_result%0#0" ] }, - "998": { + "1032": { "op": "b _assert_valid_role_bool_merge@9" } } diff --git a/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.approval.teal b/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.approval.teal index b0958e1f..b32fd19a 100644 --- a/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.approval.teal +++ b/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.approval.teal @@ -4,7 +4,7 @@ // algopy.arc4.ARC4Contract.approval_program() -> uint64: main: intcblock 1 0 32 20 - bytecblock 0x151f7c75 0x523a41525223 0x523a41555423 0x523a4d4e4723 0x523a50594423 0x523a54525323 0x523a4d4f4323 0x523a4f504423 "asset_suspended" "asset_defaulted" + bytecblock 0x151f7c75 0x523a41525223 0x523a54525323 0x523a41555423 0x523a4d4e4723 0x523a50594423 0x523a4d4f4323 "defaulted" 0x523a4f504423 "contract_suspended" txn ApplicationID bnz main_after_if_else@2 // modules/rbac.py:28-29 @@ -15,18 +15,19 @@ main: app_global_put // modules/rbac.py:30 // self.op_daemon = GlobalState(Account(), key=cst.PREFIX_ID_OP_DAEMON) - bytec 7 // 0x523a4f504423 + bytec 8 // 0x523a4f504423 global ZeroAddress app_global_put // modules/rbac.py:47-48 - // # D-ASA Governance - // self.asset_suspended = False - bytec 8 // "asset_suspended" + // # Contract Governance + // self.contract_suspended = False + bytec 9 // "contract_suspended" intc_1 // 0 app_global_put - // modules/rbac.py:49 - // self.asset_defaulted = False - bytec 9 // "asset_defaulted" + // modules/rbac.py:50-51 + // # Contract Performance + // self.defaulted = False + bytec 7 // "defaulted" intc_1 // 0 app_global_put @@ -34,7 +35,7 @@ main_after_if_else@2: // smart_contracts/mock_module_rbac/contract.py:6 // class MockRbacModule(RbacModule): txn NumAppArgs - bz main_create@19 + bz main_create@20 pushbytes 0x914f04eb // method "contract_update()void" txna ApplicationArgs 0 match main_contract_update_route@5 @@ -47,13 +48,13 @@ main_switch_case_next@6: assert txn ApplicationID assert - pushbytess 0x82f71b2d 0xef04f5d3 0xdf343550 0x3dbe80bd 0x1e3e48e7 0x010c8299 0x7406acd2 0x1a72a2ee // method "rbac_rotate_arranger(address)uint64", method "rbac_set_op_daemon(address)uint64", method "rbac_assign_role(uint8,address,(uint64,uint64))uint64", method "rbac_revoke_role(uint8,address)uint64", method "rbac_contract_suspension(bool)uint64", method "rbac_get_arranger()address", method "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", method "rbac_get_role_validity(uint8,address)(uint64,uint64)" + pushbytess 0x82f71b2d 0xef04f5d3 0xdf343550 0x3dbe80bd 0x1e3e48e7 0x39241fa3 0x010c8299 0x7406acd2 0x1a72a2ee // method "rbac_rotate_arranger(address)uint64", method "rbac_set_op_daemon(address)uint64", method "rbac_assign_role(uint8,address,(uint64,uint64))uint64", method "rbac_revoke_role(uint8,address)uint64", method "rbac_contract_suspension(bool)uint64", method "rbac_contract_default(bool)uint64", method "rbac_get_arranger()address", method "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", method "rbac_get_role_validity(uint8,address)(uint64,uint64)" txna ApplicationArgs 0 - match rbac_rotate_arranger rbac_set_op_daemon rbac_assign_role rbac_revoke_role rbac_contract_suspension rbac_get_arranger rbac_get_address_roles rbac_get_role_validity + match rbac_rotate_arranger rbac_set_op_daemon rbac_assign_role rbac_revoke_role rbac_contract_suspension rbac_contract_default rbac_get_arranger rbac_get_address_roles rbac_get_role_validity err main_contract_update_route@5: - // modules/rbac.py:148 + // modules/rbac.py:150 // @arc4.abimethod(allow_actions=["UpdateApplication"]) txn OnCompletion pushint 4 // UpdateApplication @@ -63,7 +64,7 @@ main_contract_update_route@5: assert b contract_update -main_create@19: +main_create@20: // smart_contracts/mock_module_rbac/contract.py:14 // @arc4.baremethod(create="require") txn OnCompletion @@ -85,13 +86,13 @@ main_create@19: // modules.rbac.RbacModule.contract_update[routing]() -> void: contract_update: - // modules/rbac.py:159-162 + // modules/rbac.py:161-164 // # The reference implementation grants the update permissions to the Arranger. // # ⚠️ WARNING: Application updates must be executed VERY carefully, as they // # might introduce breaking changes. // self._assert_caller_is_arranger() callsub _assert_caller_is_arranger - // modules/rbac.py:148 + // modules/rbac.py:150 // @arc4.abimethod(allow_actions=["UpdateApplication"]) intc_0 // 1 return @@ -99,7 +100,7 @@ contract_update: // modules.rbac.RbacModule.rbac_rotate_arranger[routing]() -> void: rbac_rotate_arranger: - // modules/rbac.py:164 + // modules/rbac.py:166 // @arc4.abimethod txna ApplicationArgs 1 dup @@ -107,18 +108,18 @@ rbac_rotate_arranger: intc_2 // 32 == assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:178 + // modules/rbac.py:180 // self._assert_caller_is_arranger() callsub _assert_caller_is_arranger - // modules/rbac.py:179 + // modules/rbac.py:181 // self.arranger.value = new_arranger bytec_1 // 0x523a41525223 swap app_global_put - // modules/rbac.py:180 + // modules/rbac.py:182 // return Global.latest_timestamp global LatestTimestamp - // modules/rbac.py:164 + // modules/rbac.py:166 // @arc4.abimethod itob bytec_0 // 0x151f7c75 @@ -131,7 +132,7 @@ rbac_rotate_arranger: // modules.rbac.RbacModule.rbac_set_op_daemon[routing]() -> void: rbac_set_op_daemon: - // modules/rbac.py:182 + // modules/rbac.py:184 // @arc4.abimethod txna ApplicationArgs 1 dup @@ -139,18 +140,18 @@ rbac_set_op_daemon: intc_2 // 32 == assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:196 + // modules/rbac.py:198 // self._assert_caller_is_arranger() callsub _assert_caller_is_arranger - // modules/rbac.py:197 + // modules/rbac.py:199 // self.op_daemon.value = address - bytec 7 // 0x523a4f504423 + bytec 8 // 0x523a4f504423 swap app_global_put - // modules/rbac.py:198 + // modules/rbac.py:200 // return Global.latest_timestamp global LatestTimestamp - // modules/rbac.py:182 + // modules/rbac.py:184 // @arc4.abimethod itob bytec_0 // 0x151f7c75 @@ -163,7 +164,7 @@ rbac_set_op_daemon: // modules.rbac.RbacModule.rbac_assign_role[routing]() -> void: rbac_assign_role: - // modules/rbac.py:200 + // modules/rbac.py:202 // @arc4.abimethod txna ApplicationArgs 1 dup @@ -185,33 +186,33 @@ rbac_assign_role: pushint 16 == assert // invalid number of bytes for smart_contracts.abi_types.RoleValidity - // modules/rbac.py:222 + // modules/rbac.py:224 // self._assert_caller_is_arranger() callsub _assert_caller_is_arranger - // modules/rbac.py:223 + // modules/rbac.py:225 // self._assert_is_not_asset_defaulted() callsub _assert_is_not_asset_defaulted - // modules/rbac.py:224 + // modules/rbac.py:226 // self._assert_valid_role(role_id.as_uint64()) btoi dupn 2 callsub _assert_valid_role - // modules/rbac.py:102 + // modules/rbac.py:104 // if role_id == UInt64(enums.ROLE_ARRANGER): intc_3 // 20 == bz rbac_assign_role_after_if_else@3 - // modules/rbac.py:103 + // modules/rbac.py:105 // self.arranger.value = role_address bytec_1 // 0x523a41525223 dig 3 app_global_put rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14: - // modules/rbac.py:226 + // modules/rbac.py:228 // return Global.latest_timestamp global LatestTimestamp - // modules/rbac.py:200 + // modules/rbac.py:202 // @arc4.abimethod itob bytec_0 // 0x151f7c75 @@ -222,15 +223,15 @@ rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14: return rbac_assign_role_after_if_else@3: - // modules/rbac.py:106 + // modules/rbac.py:108 // if role_id == UInt64(enums.ROLE_ACCOUNT_MANAGER): dup pushint 40 == bz rbac_assign_role_after_if_else@5 - // modules/rbac.py:107 + // modules/rbac.py:109 // assert role_address not in self.account_manager, err.INVALID_ROLE_ADDRESS - bytec_3 // 0x523a4d4e4723 + bytec 4 // 0x523a4d4e4723 dig 3 concat dup @@ -238,24 +239,24 @@ rbac_assign_role_after_if_else@3: bury 1 ! assert // Invalid account role address - // modules/rbac.py:108 + // modules/rbac.py:110 // self.account_manager[role_address] = validity.copy() dig 2 box_put - // modules/rbac.py:225 + // modules/rbac.py:227 // self._set_role(role_id.as_uint64(), role_address, validity) b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14 rbac_assign_role_after_if_else@5: - // modules/rbac.py:110 + // modules/rbac.py:112 // if role_id == UInt64(enums.ROLE_PRIMARY_DEALER): dup pushint 50 == bz rbac_assign_role_after_if_else@7 - // modules/rbac.py:111 + // modules/rbac.py:113 // assert role_address not in self.primary_dealer, err.INVALID_ROLE_ADDRESS - bytec 4 // 0x523a50594423 + bytec 5 // 0x523a50594423 dig 3 concat dup @@ -263,24 +264,24 @@ rbac_assign_role_after_if_else@5: bury 1 ! assert // Invalid account role address - // modules/rbac.py:112 + // modules/rbac.py:114 // self.primary_dealer[role_address] = validity.copy() dig 2 box_put - // modules/rbac.py:225 + // modules/rbac.py:227 // self._set_role(role_id.as_uint64(), role_address, validity) b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14 rbac_assign_role_after_if_else@7: - // modules/rbac.py:114 + // modules/rbac.py:116 // if role_id == UInt64(enums.ROLE_TRUSTEE): dup pushint 60 == bz rbac_assign_role_after_if_else@9 - // modules/rbac.py:115 + // modules/rbac.py:117 // assert role_address not in self.trustee, err.INVALID_ROLE_ADDRESS - bytec 5 // 0x523a54525323 + bytec_2 // 0x523a54525323 dig 3 concat dup @@ -288,24 +289,24 @@ rbac_assign_role_after_if_else@7: bury 1 ! assert // Invalid account role address - // modules/rbac.py:116 + // modules/rbac.py:118 // self.trustee[role_address] = validity.copy() dig 2 box_put - // modules/rbac.py:225 + // modules/rbac.py:227 // self._set_role(role_id.as_uint64(), role_address, validity) b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14 rbac_assign_role_after_if_else@9: - // modules/rbac.py:118 + // modules/rbac.py:120 // if role_id == UInt64(enums.ROLE_AUTHORITY): dup pushint 70 == bz rbac_assign_role_after_if_else@11 - // modules/rbac.py:119 + // modules/rbac.py:121 // assert role_address not in self.authority, err.INVALID_ROLE_ADDRESS - bytec_2 // 0x523a41555423 + bytec_3 // 0x523a41555423 dig 3 concat dup @@ -313,22 +314,22 @@ rbac_assign_role_after_if_else@9: bury 1 ! assert // Invalid account role address - // modules/rbac.py:120 + // modules/rbac.py:122 // self.authority[role_address] = validity.copy() dig 2 box_put - // modules/rbac.py:225 + // modules/rbac.py:227 // self._set_role(role_id.as_uint64(), role_address, validity) b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14 rbac_assign_role_after_if_else@11: - // modules/rbac.py:122 + // modules/rbac.py:124 // if role_id == UInt64(enums.ROLE_OBSERVER): dup pushint 80 == bz rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14 - // modules/rbac.py:123 + // modules/rbac.py:125 // assert role_address not in self.observer, err.INVALID_ROLE_ADDRESS bytec 6 // 0x523a4d4f4323 dig 3 @@ -338,7 +339,7 @@ rbac_assign_role_after_if_else@11: bury 1 ! assert // Invalid account role address - // modules/rbac.py:124 + // modules/rbac.py:126 // self.observer[role_address] = validity.copy() dig 2 box_put @@ -347,7 +348,7 @@ rbac_assign_role_after_if_else@11: // modules.rbac.RbacModule.rbac_revoke_role[routing]() -> void: rbac_revoke_role: - // modules/rbac.py:228 + // modules/rbac.py:230 // @arc4.abimethod txna ApplicationArgs 1 dup @@ -362,47 +363,47 @@ rbac_revoke_role: intc_2 // 32 == assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:247 + // modules/rbac.py:249 // self._assert_caller_is_arranger() callsub _assert_caller_is_arranger - // modules/rbac.py:248 + // modules/rbac.py:250 // self._assert_is_not_asset_defaulted() callsub _assert_is_not_asset_defaulted - // modules/rbac.py:249 + // modules/rbac.py:251 // self._assert_valid_role(role_id.as_uint64()) btoi dupn 2 callsub _assert_valid_role - // modules/rbac.py:127 + // modules/rbac.py:129 // assert role_id != UInt64(enums.ROLE_ARRANGER), err.INVALID_ROLE dup intc_3 // 20 != assert // Invalid role identifier - // modules/rbac.py:128 + // modules/rbac.py:130 // if role_id == UInt64(enums.ROLE_ACCOUNT_MANAGER): pushint 40 == bz rbac_revoke_role_after_if_else@3 - // modules/rbac.py:129 + // modules/rbac.py:131 // assert role_address in self.account_manager, err.INVALID_ROLE_ADDRESS - bytec_3 // 0x523a4d4e4723 + bytec 4 // 0x523a4d4e4723 dig 2 concat dup box_len bury 1 assert // Invalid account role address - // modules/rbac.py:130 + // modules/rbac.py:132 // del self.account_manager[role_address] box_del pop rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12: - // modules/rbac.py:251 + // modules/rbac.py:253 // return Global.latest_timestamp global LatestTimestamp - // modules/rbac.py:228 + // modules/rbac.py:230 // @arc4.abimethod itob bytec_0 // 0x151f7c75 @@ -413,85 +414,85 @@ rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12: return rbac_revoke_role_after_if_else@3: - // modules/rbac.py:132 + // modules/rbac.py:134 // if role_id == UInt64(enums.ROLE_PRIMARY_DEALER): dup pushint 50 == bz rbac_revoke_role_after_if_else@5 - // modules/rbac.py:133 + // modules/rbac.py:135 // assert role_address in self.primary_dealer, err.INVALID_ROLE_ADDRESS - bytec 4 // 0x523a50594423 + bytec 5 // 0x523a50594423 dig 2 concat dup box_len bury 1 assert // Invalid account role address - // modules/rbac.py:134 + // modules/rbac.py:136 // del self.primary_dealer[role_address] box_del pop - // modules/rbac.py:250 + // modules/rbac.py:252 // self._delete_role(role_id.as_uint64(), role_address) b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 rbac_revoke_role_after_if_else@5: - // modules/rbac.py:136 + // modules/rbac.py:138 // if role_id == UInt64(enums.ROLE_TRUSTEE): dup pushint 60 == bz rbac_revoke_role_after_if_else@7 - // modules/rbac.py:137 + // modules/rbac.py:139 // assert role_address in self.trustee, err.INVALID_ROLE_ADDRESS - bytec 5 // 0x523a54525323 + bytec_2 // 0x523a54525323 dig 2 concat dup box_len bury 1 assert // Invalid account role address - // modules/rbac.py:138 + // modules/rbac.py:140 // del self.trustee[role_address] box_del pop - // modules/rbac.py:250 + // modules/rbac.py:252 // self._delete_role(role_id.as_uint64(), role_address) b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 rbac_revoke_role_after_if_else@7: - // modules/rbac.py:140 + // modules/rbac.py:142 // if role_id == UInt64(enums.ROLE_AUTHORITY): dup pushint 70 == bz rbac_revoke_role_after_if_else@9 - // modules/rbac.py:141 + // modules/rbac.py:143 // assert role_address in self.authority, err.INVALID_ROLE_ADDRESS - bytec_2 // 0x523a41555423 + bytec_3 // 0x523a41555423 dig 2 concat dup box_len bury 1 assert // Invalid account role address - // modules/rbac.py:142 + // modules/rbac.py:144 // del self.authority[role_address] box_del pop - // modules/rbac.py:250 + // modules/rbac.py:252 // self._delete_role(role_id.as_uint64(), role_address) b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 rbac_revoke_role_after_if_else@9: - // modules/rbac.py:144 + // modules/rbac.py:146 // if role_id == UInt64(enums.ROLE_OBSERVER): dup pushint 80 == bz rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 - // modules/rbac.py:145 + // modules/rbac.py:147 // assert role_address in self.observer, err.INVALID_ROLE_ADDRESS bytec 6 // 0x523a4d4f4323 dig 2 @@ -500,7 +501,7 @@ rbac_revoke_role_after_if_else@9: box_len bury 1 assert // Invalid account role address - // modules/rbac.py:146 + // modules/rbac.py:148 // del self.observer[role_address] box_del pop @@ -509,8 +510,8 @@ rbac_revoke_role_after_if_else@9: // modules.rbac.RbacModule.rbac_contract_suspension[routing]() -> void: rbac_contract_suspension: - // modules/rbac.py:253 - // @arc4.abimethod # TODO: Update specs and add test + // modules/rbac.py:255 + // @arc4.abimethod txna ApplicationArgs 1 dup len @@ -519,22 +520,59 @@ rbac_contract_suspension: assert // invalid number of bytes for arc4.bool intc_1 // 0 getbit - // modules/rbac.py:77 + // modules/rbac.py:79 // assert self._role_is_active(self.authority, Txn.sender), err.UNAUTHORIZED - bytec_2 // 0x523a41555423 + bytec_3 // 0x523a41555423 txn Sender callsub _role_is_active assert // Not authorized - // modules/rbac.py:269 - // self.asset_suspended = suspended - bytec 8 // "asset_suspended" + // modules/rbac.py:271 + // self.contract_suspended = suspended + bytec 9 // "contract_suspended" swap app_global_put - // modules/rbac.py:270 + // modules/rbac.py:272 // return Global.latest_timestamp global LatestTimestamp - // modules/rbac.py:253 - // @arc4.abimethod # TODO: Update specs and add test + // modules/rbac.py:255 + // @arc4.abimethod + itob + bytec_0 // 0x151f7c75 + swap + concat + log + intc_0 // 1 + return + + +// modules.rbac.RbacModule.rbac_contract_default[routing]() -> void: +rbac_contract_default: + // modules/rbac.py:274 + // @arc4.abimethod + txna ApplicationArgs 1 + dup + len + intc_0 // 1 + == + assert // invalid number of bytes for arc4.bool + intc_1 // 0 + getbit + // modules/rbac.py:76 + // assert self._role_is_active(self.trustee, Txn.sender), err.UNAUTHORIZED + bytec_2 // 0x523a54525323 + txn Sender + callsub _role_is_active + assert // Not authorized + // modules/rbac.py:287 + // self.defaulted = defaulted + bytec 7 // "defaulted" + swap + app_global_put + // modules/rbac.py:288 + // return Global.latest_timestamp + global LatestTimestamp + // modules/rbac.py:274 + // @arc4.abimethod itob bytec_0 // 0x151f7c75 swap @@ -546,13 +584,13 @@ rbac_contract_suspension: // modules.rbac.RbacModule.rbac_get_arranger[routing]() -> void: rbac_get_arranger: - // modules/rbac.py:283 + // modules/rbac.py:301 // return self.arranger.value intc_1 // 0 bytec_1 // 0x523a41525223 app_global_get_ex assert // check self.arranger exists - // modules/rbac.py:272 + // modules/rbac.py:290 // @arc4.abimethod(readonly=True) bytec_0 // 0x151f7c75 swap @@ -564,7 +602,7 @@ rbac_get_arranger: // modules.rbac.RbacModule.rbac_get_address_roles[routing]() -> void: rbac_get_address_roles: - // modules/rbac.py:285 + // modules/rbac.py:303 // @arc4.abimethod(readonly=True) txna ApplicationArgs 1 dup @@ -572,32 +610,32 @@ rbac_get_address_roles: intc_2 // 32 == assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:303 + // modules/rbac.py:321 // self._role_is_active(self.account_manager, address), - bytec_3 // 0x523a4d4e4723 + bytec 4 // 0x523a4d4e4723 dig 1 callsub _role_is_active - // modules/rbac.py:304 + // modules/rbac.py:322 // self._role_is_active(self.primary_dealer, address), - bytec 4 // 0x523a50594423 + bytec 5 // 0x523a50594423 dig 2 callsub _role_is_active - // modules/rbac.py:305 + // modules/rbac.py:323 // self._role_is_active(self.trustee, address), - bytec 5 // 0x523a54525323 + bytec_2 // 0x523a54525323 dig 3 callsub _role_is_active - // modules/rbac.py:306 + // modules/rbac.py:324 // self._role_is_active(self.authority, address), - bytec_2 // 0x523a41555423 + bytec_3 // 0x523a41555423 dig 4 callsub _role_is_active - // modules/rbac.py:307 + // modules/rbac.py:325 // self._role_is_active(self.observer, address), bytec 6 // 0x523a4d4f4323 uncover 5 callsub _role_is_active - // modules/rbac.py:285 + // modules/rbac.py:303 // @arc4.abimethod(readonly=True) pushbytes 0x00 intc_1 // 0 @@ -625,7 +663,7 @@ rbac_get_address_roles: // modules.rbac.RbacModule.rbac_get_role_validity[routing]() -> void: rbac_get_role_validity: - // modules/rbac.py:310 + // modules/rbac.py:328 // @arc4.abimethod(readonly=True) txna ApplicationArgs 1 dup @@ -640,20 +678,20 @@ rbac_get_role_validity: intc_2 // 32 == assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:328 + // modules/rbac.py:346 // role = role_id.as_uint64() btoi - // modules/rbac.py:329 + // modules/rbac.py:347 // self._assert_valid_role(role) dup callsub _assert_valid_role - // modules/rbac.py:331 + // modules/rbac.py:349 // case UInt64(enums.ROLE_ARRANGER): intc_3 // 20 - // modules/rbac.py:335 + // modules/rbac.py:353 // case UInt64(enums.ROLE_ACCOUNT_MANAGER): pushints 40 50 60 70 80 - // modules/rbac.py:330-361 + // modules/rbac.py:348-379 // match role: // case UInt64(enums.ROLE_ARRANGER): // return typ.RoleValidity( @@ -688,33 +726,33 @@ rbac_get_role_validity: // op.err(err.INVALID_ROLE) uncover 6 match rbac_get_role_validity_switch_case_0@2 rbac_get_role_validity_switch_case_1@3 rbac_get_role_validity_switch_case_2@4 rbac_get_role_validity_switch_case_3@5 rbac_get_role_validity_switch_case_4@6 rbac_get_role_validity_switch_case_5@7 - // modules/rbac.py:361 + // modules/rbac.py:379 // op.err(err.INVALID_ROLE) err // Invalid role identifier rbac_get_role_validity_switch_case_5@7: - // modules/rbac.py:357 + // modules/rbac.py:375 // self.observer, role_address bytec 6 // 0x523a4d4f4323 - // modules/rbac.py:55 + // modules/rbac.py:57 // return role_address in role_map dig 1 concat dup box_len bury 1 - // modules/rbac.py:356-358 + // modules/rbac.py:374-376 // assert self._has_role( // self.observer, role_address // ), err.INVALID_ROLE_ADDRESS assert // Invalid account role address - // modules/rbac.py:359 + // modules/rbac.py:377 // return self.observer[role_address] box_get pop rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9: - // modules/rbac.py:310 + // modules/rbac.py:328 // @arc4.abimethod(readonly=True) bytec_0 // 0x151f7c75 swap @@ -724,119 +762,119 @@ rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_valid return rbac_get_role_validity_switch_case_4@6: - // modules/rbac.py:352 + // modules/rbac.py:370 // self.authority, role_address - bytec_2 // 0x523a41555423 - // modules/rbac.py:55 + bytec_3 // 0x523a41555423 + // modules/rbac.py:57 // return role_address in role_map dig 1 concat dup box_len bury 1 - // modules/rbac.py:351-353 + // modules/rbac.py:369-371 // assert self._has_role( // self.authority, role_address // ), err.INVALID_ROLE_ADDRESS assert // Invalid account role address - // modules/rbac.py:354 + // modules/rbac.py:372 // return self.authority[role_address] box_get pop - // modules/rbac.py:310 + // modules/rbac.py:328 // @arc4.abimethod(readonly=True) b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9 rbac_get_role_validity_switch_case_3@5: - // modules/rbac.py:347 + // modules/rbac.py:365 // self.trustee, role_address - bytec 5 // 0x523a54525323 - // modules/rbac.py:55 + bytec_2 // 0x523a54525323 + // modules/rbac.py:57 // return role_address in role_map dig 1 concat dup box_len bury 1 - // modules/rbac.py:346-348 + // modules/rbac.py:364-366 // assert self._has_role( // self.trustee, role_address // ), err.INVALID_ROLE_ADDRESS assert // Invalid account role address - // modules/rbac.py:349 + // modules/rbac.py:367 // return self.trustee[role_address] box_get pop - // modules/rbac.py:310 + // modules/rbac.py:328 // @arc4.abimethod(readonly=True) b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9 rbac_get_role_validity_switch_case_2@4: - // modules/rbac.py:342 + // modules/rbac.py:360 // self.primary_dealer, role_address - bytec 4 // 0x523a50594423 - // modules/rbac.py:55 + bytec 5 // 0x523a50594423 + // modules/rbac.py:57 // return role_address in role_map dig 1 concat dup box_len bury 1 - // modules/rbac.py:341-343 + // modules/rbac.py:359-361 // assert self._has_role( // self.primary_dealer, role_address // ), err.INVALID_ROLE_ADDRESS assert // Invalid account role address - // modules/rbac.py:344 + // modules/rbac.py:362 // return self.primary_dealer[role_address] box_get pop - // modules/rbac.py:310 + // modules/rbac.py:328 // @arc4.abimethod(readonly=True) b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9 rbac_get_role_validity_switch_case_1@3: - // modules/rbac.py:337 + // modules/rbac.py:355 // self.account_manager, role_address - bytec_3 // 0x523a4d4e4723 - // modules/rbac.py:55 + bytec 4 // 0x523a4d4e4723 + // modules/rbac.py:57 // return role_address in role_map dig 1 concat dup box_len bury 1 - // modules/rbac.py:336-338 + // modules/rbac.py:354-356 // assert self._has_role( // self.account_manager, role_address // ), err.INVALID_ROLE_ADDRESS assert // Invalid account role address - // modules/rbac.py:339 + // modules/rbac.py:357 // return self.account_manager[role_address] box_get pop - // modules/rbac.py:310 + // modules/rbac.py:328 // @arc4.abimethod(readonly=True) b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9 rbac_get_role_validity_switch_case_0@2: - // modules/rbac.py:332-334 + // modules/rbac.py:350-352 // return typ.RoleValidity( // role_validity_start=UInt64(0), role_validity_end=UInt64(0) // ) pushbytes 0x00000000000000000000000000000000 - // modules/rbac.py:310 + // modules/rbac.py:328 // @arc4.abimethod(readonly=True) b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9 // modules.rbac.RbacModule._role_is_active(role_map: bytes, role_address: bytes) -> uint64: _role_is_active: - // modules/rbac.py:57 + // modules/rbac.py:59 // def _role_is_active(self, role_map: typ.RbacRole, role_address: Account) -> bool: proto 2 1 pushbytes "" - // modules/rbac.py:55 + // modules/rbac.py:57 // return role_address in role_map frame_dig -2 frame_dig -1 @@ -844,47 +882,47 @@ _role_is_active: dup box_len bury 1 - // modules/rbac.py:58-62 + // modules/rbac.py:60-64 // return self._has_role(role_map, role_address) and ( // role_map[role_address].role_validity_start // <= Global.latest_timestamp // <= role_map[role_address].role_validity_end // ) bz _role_is_active_bool_false@4 - // modules/rbac.py:59 + // modules/rbac.py:61 // role_map[role_address].role_validity_start frame_dig 1 box_get assert // check BoxMap entry exists intc_1 // 0 extract_uint64 - // modules/rbac.py:60 + // modules/rbac.py:62 // <= Global.latest_timestamp global LatestTimestamp dup frame_bury 0 - // modules/rbac.py:59-60 + // modules/rbac.py:61-62 // role_map[role_address].role_validity_start // <= Global.latest_timestamp <= - // modules/rbac.py:59-61 + // modules/rbac.py:61-63 // role_map[role_address].role_validity_start // <= Global.latest_timestamp // <= role_map[role_address].role_validity_end bz _role_is_active_bool_false@4 - // modules/rbac.py:61 + // modules/rbac.py:63 // <= role_map[role_address].role_validity_end frame_dig 1 box_get assert // check BoxMap entry exists pushint 8 extract_uint64 - // modules/rbac.py:60-61 + // modules/rbac.py:62-63 // <= Global.latest_timestamp // <= role_map[role_address].role_validity_end frame_dig 0 >= - // modules/rbac.py:59-61 + // modules/rbac.py:61-63 // role_map[role_address].role_validity_start // <= Global.latest_timestamp // <= role_map[role_address].role_validity_end @@ -892,7 +930,7 @@ _role_is_active: intc_0 // 1 _role_is_active_bool_merge@5: - // modules/rbac.py:58-62 + // modules/rbac.py:60-64 // return self._has_role(role_map, role_address) and ( // role_map[role_address].role_validity_start // <= Global.latest_timestamp @@ -908,17 +946,17 @@ _role_is_active_bool_false@4: // modules.rbac.RbacModule._assert_caller_is_arranger() -> void: _assert_caller_is_arranger: - // modules/rbac.py:65 + // modules/rbac.py:67 // assert self._is_arranger(Txn.sender), err.UNAUTHORIZED txn Sender - // modules/rbac.py:52 + // modules/rbac.py:54 // return role_address == self.arranger.value intc_1 // 0 bytec_1 // 0x523a41525223 app_global_get_ex assert // check self.arranger exists == - // modules/rbac.py:65 + // modules/rbac.py:67 // assert self._is_arranger(Txn.sender), err.UNAUTHORIZED assert // Not authorized retsub @@ -926,12 +964,12 @@ _assert_caller_is_arranger: // modules.rbac.RbacModule._assert_is_not_asset_defaulted() -> void: _assert_is_not_asset_defaulted: - // modules/rbac.py:83 - // assert not self.asset_defaulted, err.DEFAULTED + // modules/rbac.py:85 + // assert not self.defaulted, err.DEFAULTED intc_1 // 0 - bytec 9 // "asset_defaulted" + bytec 7 // "defaulted" app_global_get_ex - assert // check self.asset_defaulted exists + assert // check self.defaulted exists ! assert // Defaulted retsub @@ -939,10 +977,10 @@ _assert_is_not_asset_defaulted: // modules.rbac.RbacModule._assert_valid_role(role_id: uint64) -> void: _assert_valid_role: - // modules/rbac.py:88 + // modules/rbac.py:90 // def _assert_valid_role(self, role_id: UInt64) -> None: proto 1 0 - // modules/rbac.py:89-97 + // modules/rbac.py:91-99 // assert role_id in ( // UInt64(enums.ROLE_ARRANGER), // UInt64(enums.ROLE_OP_DAEMON), @@ -953,10 +991,10 @@ _assert_valid_role: // UInt64(enums.ROLE_OBSERVER), // ), err.INVALID_ROLE frame_dig -1 - // modules/rbac.py:90 + // modules/rbac.py:92 // UInt64(enums.ROLE_ARRANGER), intc_3 // 20 - // modules/rbac.py:89-97 + // modules/rbac.py:91-99 // assert role_id in ( // UInt64(enums.ROLE_ARRANGER), // UInt64(enums.ROLE_OP_DAEMON), @@ -969,10 +1007,10 @@ _assert_valid_role: == bnz _assert_valid_role_bool_true@7 frame_dig -1 - // modules/rbac.py:91 + // modules/rbac.py:93 // UInt64(enums.ROLE_OP_DAEMON), pushint 25 - // modules/rbac.py:89-97 + // modules/rbac.py:91-99 // assert role_id in ( // UInt64(enums.ROLE_ARRANGER), // UInt64(enums.ROLE_OP_DAEMON), @@ -985,10 +1023,10 @@ _assert_valid_role: == bnz _assert_valid_role_bool_true@7 frame_dig -1 - // modules/rbac.py:92 + // modules/rbac.py:94 // UInt64(enums.ROLE_ACCOUNT_MANAGER), pushint 40 - // modules/rbac.py:89-97 + // modules/rbac.py:91-99 // assert role_id in ( // UInt64(enums.ROLE_ARRANGER), // UInt64(enums.ROLE_OP_DAEMON), @@ -1001,10 +1039,10 @@ _assert_valid_role: == bnz _assert_valid_role_bool_true@7 frame_dig -1 - // modules/rbac.py:93 + // modules/rbac.py:95 // UInt64(enums.ROLE_PRIMARY_DEALER), pushint 50 - // modules/rbac.py:89-97 + // modules/rbac.py:91-99 // assert role_id in ( // UInt64(enums.ROLE_ARRANGER), // UInt64(enums.ROLE_OP_DAEMON), @@ -1017,10 +1055,10 @@ _assert_valid_role: == bnz _assert_valid_role_bool_true@7 frame_dig -1 - // modules/rbac.py:94 + // modules/rbac.py:96 // UInt64(enums.ROLE_TRUSTEE), pushint 60 - // modules/rbac.py:89-97 + // modules/rbac.py:91-99 // assert role_id in ( // UInt64(enums.ROLE_ARRANGER), // UInt64(enums.ROLE_OP_DAEMON), @@ -1033,10 +1071,10 @@ _assert_valid_role: == bnz _assert_valid_role_bool_true@7 frame_dig -1 - // modules/rbac.py:95 + // modules/rbac.py:97 // UInt64(enums.ROLE_AUTHORITY), pushint 70 - // modules/rbac.py:89-97 + // modules/rbac.py:91-99 // assert role_id in ( // UInt64(enums.ROLE_ARRANGER), // UInt64(enums.ROLE_OP_DAEMON), @@ -1049,10 +1087,10 @@ _assert_valid_role: == bnz _assert_valid_role_bool_true@7 frame_dig -1 - // modules/rbac.py:96 + // modules/rbac.py:98 // UInt64(enums.ROLE_OBSERVER), pushint 80 - // modules/rbac.py:89-97 + // modules/rbac.py:91-99 // assert role_id in ( // UInt64(enums.ROLE_ARRANGER), // UInt64(enums.ROLE_OP_DAEMON), @@ -1069,7 +1107,7 @@ _assert_valid_role_bool_true@7: intc_0 // 1 _assert_valid_role_bool_merge@9: - // modules/rbac.py:89-97 + // modules/rbac.py:91-99 // assert role_id in ( // UInt64(enums.ROLE_ARRANGER), // UInt64(enums.ROLE_OP_DAEMON), diff --git a/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.arc56.json b/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.arc56.json index ec67d97f..98e6c152 100644 --- a/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.arc56.json +++ b/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.arc56.json @@ -167,6 +167,29 @@ "events": [], "recommendations": {} }, + { + "name": "rbac_contract_default", + "args": [ + { + "type": "bool", + "name": "defaulted", + "desc": "Default status" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Set D-ASA default status", + "events": [], + "recommendations": {} + }, { "name": "rbac_get_arranger", "args": [], @@ -269,15 +292,15 @@ "valueType": "address", "key": "UjpPUEQj" }, - "asset_suspended": { + "contract_suspended": { "keyType": "AVMString", "valueType": "AVMUint64", - "key": "YXNzZXRfc3VzcGVuZGVk" + "key": "Y29udHJhY3Rfc3VzcGVuZGVk" }, - "asset_defaulted": { + "defaulted": { "keyType": "AVMString", "valueType": "AVMUint64", - "key": "YXNzZXRfZGVmYXVsdGVk" + "key": "ZGVmYXVsdGVk" } }, "local": {}, @@ -326,93 +349,95 @@ "sourceInfo": [ { "pc": [ - 934 + 968 ], "errorMessage": "Defaulted" }, { "pc": [ - 359, - 383, - 407, - 430, - 454, - 509, - 537, - 559, - 580, - 602, - 778, - 795, - 810, - 825, - 839 + 364, + 388, + 411, + 434, + 458, + 514, + 542, + 563, + 584, + 606, + 812, + 829, + 843, + 858, + 873 ], "errorMessage": "Invalid account role address" }, { "pc": [ - 494, - 768, - 995 + 498, + 802, + 1029 ], "errorMessage": "Invalid role identifier" }, { "pc": [ - 624, - 926 + 628, + 658, + 960 ], "errorMessage": "Not authorized" }, { "pc": [ - 886, - 901 + 920, + 935 ], "errorMessage": "check BoxMap entry exists" }, { "pc": [ - 641, - 924 + 675, + 958 ], "errorMessage": "check self.arranger exists" }, { "pc": [ - 932 + 966 ], - "errorMessage": "check self.asset_defaulted exists" + "errorMessage": "check self.defaulted exists" }, { "pc": [ - 615 + 619, + 649 ], "errorMessage": "invalid number of bytes for arc4.bool" }, { "pc": [ - 244, - 267, - 301, - 478, - 655, - 738 + 248, + 271, + 305, + 482, + 689, + 772 ], "errorMessage": "invalid number of bytes for arc4.static_array" }, { "pc": [ - 291, - 468, - 728 + 295, + 472, + 762 ], "errorMessage": "invalid number of bytes for arc4.uint8" }, { "pc": [ - 312 + 316 ], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.RoleValidity" } @@ -425,11 +450,11 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMzIgMjAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAweDUyM2E0MTUyNTIyMyAweDUyM2E0MTU1NTQyMyAweDUyM2E0ZDRlNDcyMyAweDUyM2E1MDU5NDQyMyAweDUyM2E1NDUyNTMyMyAweDUyM2E0ZDRmNDMyMyAweDUyM2E0ZjUwNDQyMyAiYXNzZXRfc3VzcGVuZGVkIiAiYXNzZXRfZGVmYXVsdGVkIgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4LTI5CiAgICAvLyAjIFJCQUMgUm9sZXMKICAgIC8vIHNlbGYuYXJyYW5nZXIgPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX0FSUkFOR0VSKQogICAgYnl0ZWNfMSAvLyAweDUyM2E0MTUyNTIyMwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwCiAgICAvLyBzZWxmLm9wX2RhZW1vbiA9IEdsb2JhbFN0YXRlKEFjY291bnQoKSwga2V5PWNzdC5QUkVGSVhfSURfT1BfREFFTU9OKQogICAgYnl0ZWMgNyAvLyAweDUyM2E0ZjUwNDQyMwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjQ3LTQ4CiAgICAvLyAjIEQtQVNBIEdvdmVybmFuY2UKICAgIC8vIHNlbGYuYXNzZXRfc3VzcGVuZGVkID0gRmFsc2UKICAgIGJ5dGVjIDggLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIGludGNfMSAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjQ5CiAgICAvLyBzZWxmLmFzc2V0X2RlZmF1bHRlZCA9IEZhbHNlCiAgICBieXRlYyA5IC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBpbnRjXzEgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL21vY2tfbW9kdWxlX3JiYWMvY29udHJhY3QucHk6NgogICAgLy8gY2xhc3MgTW9ja1JiYWNNb2R1bGUoUmJhY01vZHVsZSk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9jcmVhdGVAMTkKICAgIHB1c2hieXRlcyAweDkxNGYwNGViIC8vIG1ldGhvZCAiY29udHJhY3RfdXBkYXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9jb250cmFjdF91cGRhdGVfcm91dGVANQoKbWFpbl9zd2l0Y2hfY2FzZV9uZXh0QDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbW9ja19tb2R1bGVfcmJhYy9jb250cmFjdC5weTo2CiAgICAvLyBjbGFzcyBNb2NrUmJhY01vZHVsZShSYmFjTW9kdWxlKToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweDgyZjcxYjJkIDB4ZWYwNGY1ZDMgMHhkZjM0MzU1MCAweDNkYmU4MGJkIDB4MWUzZTQ4ZTcgMHgwMTBjODI5OSAweDc0MDZhY2QyIDB4MWE3MmEyZWUgLy8gbWV0aG9kICJyYmFjX3JvdGF0ZV9hcnJhbmdlcihhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19zZXRfb3BfZGFlbW9uKGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX2Fzc2lnbl9yb2xlKHVpbnQ4LGFkZHJlc3MsKHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19yZXZva2Vfcm9sZSh1aW50OCxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19jb250cmFjdF9zdXNwZW5zaW9uKGJvb2wpdWludDY0IiwgbWV0aG9kICJyYmFjX2dldF9hcnJhbmdlcigpYWRkcmVzcyIsIG1ldGhvZCAicmJhY19nZXRfYWRkcmVzc19yb2xlcyhhZGRyZXNzKShib29sLGJvb2wsYm9vbCxib29sLGJvb2wpIiwgbWV0aG9kICJyYmFjX2dldF9yb2xlX3ZhbGlkaXR5KHVpbnQ4LGFkZHJlc3MpKHVpbnQ2NCx1aW50NjQpIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggcmJhY19yb3RhdGVfYXJyYW5nZXIgcmJhY19zZXRfb3BfZGFlbW9uIHJiYWNfYXNzaWduX3JvbGUgcmJhY19yZXZva2Vfcm9sZSByYmFjX2NvbnRyYWN0X3N1c3BlbnNpb24gcmJhY19nZXRfYXJyYW5nZXIgcmJhY19nZXRfYWRkcmVzc19yb2xlcyByYmFjX2dldF9yb2xlX3ZhbGlkaXR5CiAgICBlcnIKCm1haW5fY29udHJhY3RfdXBkYXRlX3JvdXRlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBwdXNoaW50IDQgLy8gVXBkYXRlQXBwbGljYXRpb24KICAgID09CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydAogICAgYiBjb250cmFjdF91cGRhdGUKCm1haW5fY3JlYXRlQDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL21vY2tfbW9kdWxlX3JiYWMvY29udHJhY3QucHk6MTQKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbW9ja19tb2R1bGVfcmJhYy9jb250cmFjdC5weToxNgogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IFR4bi5zZW5kZXIKICAgIGJ5dGVjXzEgLy8gMHg1MjNhNDE1MjUyMjMKICAgIHR4biBTZW5kZXIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbW9ja19tb2R1bGVfcmJhYy9jb250cmFjdC5weToxNAogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLmNvbnRyYWN0X3VwZGF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X3VwZGF0ZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTktMTYyCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gZ3JhbnRzIHRoZSB1cGRhdGUgcGVybWlzc2lvbnMgdG8gdGhlIEFycmFuZ2VyLgogICAgLy8gIyDimqDvuI8gV0FSTklORzogQXBwbGljYXRpb24gdXBkYXRlcyBtdXN0IGJlIGV4ZWN1dGVkIFZFUlkgY2FyZWZ1bGx5LCBhcyB0aGV5CiAgICAvLyAjIG1pZ2h0IGludHJvZHVjZSBicmVha2luZyBjaGFuZ2VzLgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19yb3RhdGVfYXJyYW5nZXJbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3JvdGF0ZV9hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTc4CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzkKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSBuZXdfYXJyYW5nZXIKICAgIGJ5dGVjXzEgLy8gMHg1MjNhNDE1MjUyMjMKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTgwCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfc2V0X29wX2RhZW1vbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfc2V0X29wX2RhZW1vbjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTk2CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxOTcKICAgIC8vIHNlbGYub3BfZGFlbW9uLnZhbHVlID0gYWRkcmVzcwogICAgYnl0ZWMgNyAvLyAweDUyM2E0ZjUwNDQyMwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxOTgKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19hc3NpZ25fcm9sZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfYXNzaWduX3JvbGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgcHVzaGludCAxNgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5Sb2xlVmFsaWRpdHkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjIKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyMwogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjQKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCkpCiAgICBidG9pCiAgICBkdXBuIDIKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTAyCiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKToKICAgIGludGNfMyAvLyAyMAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTAzCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gcm9sZV9hZGRyZXNzCiAgICBieXRlY18xIC8vIDB4NTIzYTQxNTI1MjIzCiAgICBkaWcgMwogICAgYXBwX2dsb2JhbF9wdXQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI2CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA2CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgNDAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwNwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWNfMyAvLyAweDUyM2E0ZDRlNDcyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA4CiAgICAvLyBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNQogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTEwCiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKToKICAgIGR1cAogICAgcHVzaGludCA1MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTExCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDQgLy8gMHg1MjNhNTA1OTQ0MjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMgogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNQogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE0CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpOgogICAgZHVwCiAgICBwdXNoaW50IDYwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTUKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyA1IC8vIDB4NTIzYTU0NTI1MzIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTYKICAgIC8vIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNQogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE4CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNzAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTkKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjXzIgLy8gMHg1MjNhNDE1NTU0MjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMAogICAgLy8gc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjUKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDgwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5vYnNlcnZlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyA2IC8vIDB4NTIzYTRkNGY0MzIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjQKICAgIC8vIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfcmV2b2tlX3JvbGVbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3Jldm9rZV9yb2xlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0NwogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjQ4CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0OQogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjcKICAgIC8vIGFzc2VydCByb2xlX2lkICE9IFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwgZXJyLklOVkFMSURfUk9MRQogICAgZHVwCiAgICBpbnRjXzMgLy8gMjAKICAgICE9CiAgICBhc3NlcnQgLy8gSW52YWxpZCByb2xlIGlkZW50aWZpZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjgKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIHB1c2hpbnQgNDAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyOQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmFjY291bnRfbWFuYWdlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlY18zIC8vIDB4NTIzYTRkNGU0NzIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzAKICAgIC8vIGRlbCBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjUxCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMyCiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKToKICAgIGR1cAogICAgcHVzaGludCA1MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMzCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgNCAvLyAweDUyM2E1MDU5NDQyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM0CiAgICAvLyBkZWwgc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTAKICAgIC8vIHNlbGYuX2RlbGV0ZV9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcykKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM2CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpOgogICAgZHVwCiAgICBwdXNoaW50IDYwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzcKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDUgLy8gMHg1MjNhNTQ1MjUzMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzOAogICAgLy8gZGVsIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTAKICAgIC8vIHNlbGYuX2RlbGV0ZV9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcykKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQwCiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNzAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlY18yIC8vIDB4NTIzYTQxNTU1NDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDIKICAgIC8vIGRlbCBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTAKICAgIC8vIHNlbGYuX2RlbGV0ZV9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcykKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ0CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKToKICAgIGR1cAogICAgcHVzaGludCA4MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDUKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5vYnNlcnZlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyA2IC8vIDB4NTIzYTRkNGY0MzIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDYKICAgIC8vIGRlbCBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19jb250cmFjdF9zdXNwZW5zaW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19jb250cmFjdF9zdXNwZW5zaW9uOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kICAjIFRPRE86IFVwZGF0ZSBzcGVjcyBhbmQgYWRkIHRlc3QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzEgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzcKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjXzIgLy8gMHg1MjNhNDE1NTU0MjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNjkKICAgIC8vIHNlbGYuYXNzZXRfc3VzcGVuZGVkID0gc3VzcGVuZGVkCiAgICBieXRlYyA4IC8vICJhc3NldF9zdXNwZW5kZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3MAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjUzCiAgICAvLyBAYXJjNC5hYmltZXRob2QgICMgVE9ETzogVXBkYXRlIHNwZWNzIGFuZCBhZGQgdGVzdAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X2FycmFuZ2VyW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgzCiAgICAvLyByZXR1cm4gc2VsZi5hcnJhbmdlci52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzEgLy8gMHg1MjNhNDE1MjUyMjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcnJhbmdlciBleGlzdHMKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNzIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXNbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9hZGRyZXNzX3JvbGVzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDMKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBhZGRyZXNzKSwKICAgIGJ5dGVjXzMgLy8gMHg1MjNhNGQ0ZTQ3MjMKICAgIGRpZyAxCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwNAogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5wcmltYXJ5X2RlYWxlciwgYWRkcmVzcyksCiAgICBieXRlYyA0IC8vIDB4NTIzYTUwNTk0NDIzCiAgICBkaWcgMgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDUKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYudHJ1c3RlZSwgYWRkcmVzcyksCiAgICBieXRlYyA1IC8vIDB4NTIzYTU0NTI1MzIzCiAgICBkaWcgMwogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDYKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYXV0aG9yaXR5LCBhZGRyZXNzKSwKICAgIGJ5dGVjXzIgLy8gMHg1MjNhNDE1NTU0MjMKICAgIGRpZyA0CiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwNwogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5vYnNlcnZlciwgYWRkcmVzcyksCiAgICBieXRlYyA2IC8vIDB4NTIzYTRkNGY0MzIzCiAgICB1bmNvdmVyIDUKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg1CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHB1c2hieXRlcyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciA2CiAgICBzZXRiaXQKICAgIGludGNfMCAvLyAxCiAgICB1bmNvdmVyIDUKICAgIHNldGJpdAogICAgcHVzaGludCAyCiAgICB1bmNvdmVyIDQKICAgIHNldGJpdAogICAgcHVzaGludCAzCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgcHVzaGludCA0CiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOAogICAgLy8gcm9sZSA9IHJvbGVfaWQuYXNfdWludDY0KCkKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjkKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGUpCiAgICBkdXAKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzMxCiAgICAvLyBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKToKICAgIGludGNfMyAvLyAyMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMzNQogICAgLy8gY2FzZSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludHMgNDAgNTAgNjAgNzAgODAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzAtMzYxCiAgICAvLyBtYXRjaCByb2xlOgogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgLy8gICAgICAgICByZXR1cm4gdHlwLlJvbGVWYWxpZGl0eSgKICAgIC8vICAgICAgICAgICAgIHJvbGVfdmFsaWRpdHlfc3RhcnQ9VUludDY0KDApLCByb2xlX3ZhbGlkaXR5X2VuZD1VSW50NjQoMCkKICAgIC8vICAgICAgICAgKQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5hdXRob3JpdHksIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5vYnNlcnZlciwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5vYnNlcnZlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBfOgogICAgLy8gICAgICAgICBvcC5lcnIoZXJyLklOVkFMSURfUk9MRSkKICAgIHVuY292ZXIgNgogICAgbWF0Y2ggcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8wQDIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8xQDMgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8yQDQgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8zQDUgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV80QDYgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV81QDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNjEKICAgIC8vIG9wLmVycihlcnIuSU5WQUxJRF9ST0xFKQogICAgZXJyIC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzVANzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTcKICAgIC8vIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgNiAvLyAweDUyM2E0ZDRmNDMyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM1Ni0zNTgKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLm9ic2VydmVyLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTkKICAgIC8vIHJldHVybiBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV80QDY6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzUyCiAgICAvLyBzZWxmLmF1dGhvcml0eSwgcm9sZV9hZGRyZXNzCiAgICBieXRlY18yIC8vIDB4NTIzYTQxNTU1NDIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzUxLTM1MwogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTQKICAgIC8vIHJldHVybiBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzNANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNDcKICAgIC8vIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyA1IC8vIDB4NTIzYTU0NTI1MzIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzQ2LTM0OAogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzQ5CiAgICAvLyByZXR1cm4gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMkA0OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM0MgogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyA0IC8vIDB4NTIzYTUwNTk0NDIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzQxLTM0MwogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM0NAogICAgLy8gcmV0dXJuIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8xQDM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzM3CiAgICAvLyBzZWxmLmFjY291bnRfbWFuYWdlciwgcm9sZV9hZGRyZXNzCiAgICBieXRlY18zIC8vIDB4NTIzYTRkNGU0NzIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzM2LTMzOAogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzkKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzBAMjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzItMzM0CiAgICAvLyByZXR1cm4gdHlwLlJvbGVWYWxpZGl0eSgKICAgIC8vICAgICByb2xlX3ZhbGlkaXR5X3N0YXJ0PVVJbnQ2NCgwKSwgcm9sZV92YWxpZGl0eV9lbmQ9VUludDY0KDApCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fcm9sZV9pc19hY3RpdmUocm9sZV9tYXA6IGJ5dGVzLCByb2xlX2FkZHJlc3M6IGJ5dGVzKSAtPiB1aW50NjQ6Cl9yb2xlX2lzX2FjdGl2ZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NwogICAgLy8gZGVmIF9yb2xlX2lzX2FjdGl2ZShzZWxmLCByb2xlX21hcDogdHlwLlJiYWNSb2xlLCByb2xlX2FkZHJlc3M6IEFjY291bnQpIC0+IGJvb2w6CiAgICBwcm90byAyIDEKICAgIHB1c2hieXRlcyAiIgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU4LTYyCiAgICAvLyByZXR1cm4gc2VsZi5faGFzX3JvbGUocm9sZV9tYXAsIHJvbGVfYWRkcmVzcykgYW5kICgKICAgIC8vICAgICByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICkKICAgIGJ6IF9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIEJveE1hcCBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYwCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MAogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgPD0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYxCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIEJveE1hcCBlbnRyeSBleGlzdHMKICAgIHB1c2hpbnQgOAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2MC02MQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAwCiAgICA+PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5LTYxCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0CiAgICBpbnRjXzAgLy8gMQoKX3JvbGVfaXNfYWN0aXZlX2Jvb2xfbWVyZ2VANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OC02MgogICAgLy8gcmV0dXJuIHNlbGYuX2hhc19yb2xlKHJvbGVfbWFwLCByb2xlX2FkZHJlc3MpIGFuZCAoCiAgICAvLyAgICAgcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICAvLyApCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANDoKICAgIGludGNfMSAvLyAwCiAgICBiIF9yb2xlX2lzX2FjdGl2ZV9ib29sX21lcmdlQDUKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpIC0+IHZvaWQ6Cl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjY1CiAgICAvLyBhc3NlcnQgc2VsZi5faXNfYXJyYW5nZXIoVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1MgogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyA9PSBzZWxmLmFycmFuZ2VyLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMSAvLyAweDUyM2E0MTUyNTIyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgPT0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2NQogICAgLy8gYXNzZXJ0IHNlbGYuX2lzX2FycmFuZ2VyKFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpIC0+IHZvaWQ6Cl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4MwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFzc2V0X2RlZmF1bHRlZCwgZXJyLkRFRkFVTFRFRAogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDkgLy8gImFzc2V0X2RlZmF1bHRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9kZWZhdWx0ZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRGVmYXVsdGVkCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZDogdWludDY0KSAtPiB2b2lkOgpfYXNzZXJ0X3ZhbGlkX3JvbGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODgKICAgIC8vIGRlZiBfYXNzZXJ0X3ZhbGlkX3JvbGUoc2VsZiwgcm9sZV9pZDogVUludDY0KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkwCiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICBpbnRjXzMgLy8gMjAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkxCiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgcHVzaGludCAyNQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTIKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICBwdXNoaW50IDQwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MwogICAgLy8gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgcHVzaGludCA1MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTQKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgcHVzaGludCA2MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTUKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICBwdXNoaW50IDcwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NgogICAgLy8gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgcHVzaGludCA4MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfZmFsc2VAOAoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3OgogICAgaW50Y18wIC8vIDEKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX21lcmdlQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgcmV0c3ViCgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9mYWxzZUA4OgogICAgaW50Y18xIC8vIDAKICAgIGIgX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfbWVyZ2VAOQo=", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMzIgMjAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAweDUyM2E0MTUyNTIyMyAweDUyM2E1NDUyNTMyMyAweDUyM2E0MTU1NTQyMyAweDUyM2E0ZDRlNDcyMyAweDUyM2E1MDU5NDQyMyAweDUyM2E0ZDRmNDMyMyAiZGVmYXVsdGVkIiAweDUyM2E0ZjUwNDQyMyAiY29udHJhY3Rfc3VzcGVuZGVkIgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4LTI5CiAgICAvLyAjIFJCQUMgUm9sZXMKICAgIC8vIHNlbGYuYXJyYW5nZXIgPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX0FSUkFOR0VSKQogICAgYnl0ZWNfMSAvLyAweDUyM2E0MTUyNTIyMwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwCiAgICAvLyBzZWxmLm9wX2RhZW1vbiA9IEdsb2JhbFN0YXRlKEFjY291bnQoKSwga2V5PWNzdC5QUkVGSVhfSURfT1BfREFFTU9OKQogICAgYnl0ZWMgOCAvLyAweDUyM2E0ZjUwNDQyMwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjQ3LTQ4CiAgICAvLyAjIENvbnRyYWN0IEdvdmVybmFuY2UKICAgIC8vIHNlbGYuY29udHJhY3Rfc3VzcGVuZGVkID0gRmFsc2UKICAgIGJ5dGVjIDkgLy8gImNvbnRyYWN0X3N1c3BlbmRlZCIKICAgIGludGNfMSAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjUwLTUxCiAgICAvLyAjIENvbnRyYWN0IFBlcmZvcm1hbmNlCiAgICAvLyBzZWxmLmRlZmF1bHRlZCA9IEZhbHNlCiAgICBieXRlYyA3IC8vICJkZWZhdWx0ZWQiCiAgICBpbnRjXzEgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL21vY2tfbW9kdWxlX3JiYWMvY29udHJhY3QucHk6NgogICAgLy8gY2xhc3MgTW9ja1JiYWNNb2R1bGUoUmJhY01vZHVsZSk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9jcmVhdGVAMjAKICAgIHB1c2hieXRlcyAweDkxNGYwNGViIC8vIG1ldGhvZCAiY29udHJhY3RfdXBkYXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9jb250cmFjdF91cGRhdGVfcm91dGVANQoKbWFpbl9zd2l0Y2hfY2FzZV9uZXh0QDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbW9ja19tb2R1bGVfcmJhYy9jb250cmFjdC5weTo2CiAgICAvLyBjbGFzcyBNb2NrUmJhY01vZHVsZShSYmFjTW9kdWxlKToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweDgyZjcxYjJkIDB4ZWYwNGY1ZDMgMHhkZjM0MzU1MCAweDNkYmU4MGJkIDB4MWUzZTQ4ZTcgMHgzOTI0MWZhMyAweDAxMGM4Mjk5IDB4NzQwNmFjZDIgMHgxYTcyYTJlZSAvLyBtZXRob2QgInJiYWNfcm90YXRlX2FycmFuZ2VyKGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX3NldF9vcF9kYWVtb24oYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgInJiYWNfYXNzaWduX3JvbGUodWludDgsYWRkcmVzcywodWludDY0LHVpbnQ2NCkpdWludDY0IiwgbWV0aG9kICJyYmFjX3Jldm9rZV9yb2xlKHVpbnQ4LGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX2NvbnRyYWN0X3N1c3BlbnNpb24oYm9vbCl1aW50NjQiLCBtZXRob2QgInJiYWNfY29udHJhY3RfZGVmYXVsdChib29sKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19nZXRfYXJyYW5nZXIoKWFkZHJlc3MiLCBtZXRob2QgInJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXMoYWRkcmVzcykoYm9vbCxib29sLGJvb2wsYm9vbCxib29sKSIsIG1ldGhvZCAicmJhY19nZXRfcm9sZV92YWxpZGl0eSh1aW50OCxhZGRyZXNzKSh1aW50NjQsdWludDY0KSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIHJiYWNfcm90YXRlX2FycmFuZ2VyIHJiYWNfc2V0X29wX2RhZW1vbiByYmFjX2Fzc2lnbl9yb2xlIHJiYWNfcmV2b2tlX3JvbGUgcmJhY19jb250cmFjdF9zdXNwZW5zaW9uIHJiYWNfY29udHJhY3RfZGVmYXVsdCByYmFjX2dldF9hcnJhbmdlciByYmFjX2dldF9hZGRyZXNzX3JvbGVzIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHkKICAgIGVycgoKbWFpbl9jb250cmFjdF91cGRhdGVfcm91dGVANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgNCAvLyBVcGRhdGVBcHBsaWNhdGlvbgogICAgPT0KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0CiAgICBiIGNvbnRyYWN0X3VwZGF0ZQoKbWFpbl9jcmVhdGVAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbW9ja19tb2R1bGVfcmJhYy9jb250cmFjdC5weToxNAogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICBhc3NlcnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tb2NrX21vZHVsZV9yYmFjL2NvbnRyYWN0LnB5OjE2CiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gVHhuLnNlbmRlcgogICAgYnl0ZWNfMSAvLyAweDUyM2E0MTUyNTIyMwogICAgdHhuIFNlbmRlcgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tb2NrX21vZHVsZV9yYmFjL2NvbnRyYWN0LnB5OjE0CiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuY29udHJhY3RfdXBkYXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfdXBkYXRlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2MS0xNjQKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBncmFudHMgdGhlIHVwZGF0ZSBwZXJtaXNzaW9ucyB0byB0aGUgQXJyYW5nZXIuCiAgICAvLyAjIOKaoO+4jyBXQVJOSU5HOiBBcHBsaWNhdGlvbiB1cGRhdGVzIG11c3QgYmUgZXhlY3V0ZWQgVkVSWSBjYXJlZnVsbHksIGFzIHRoZXkKICAgIC8vICMgbWlnaHQgaW50cm9kdWNlIGJyZWFraW5nIGNoYW5nZXMuCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3JvdGF0ZV9hcnJhbmdlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfcm90YXRlX2FycmFuZ2VyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODAKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4MQogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IG5ld19hcnJhbmdlcgogICAgYnl0ZWNfMSAvLyAweDUyM2E0MTUyNTIyMwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODIKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19zZXRfb3BfZGFlbW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19zZXRfb3BfZGFlbW9uOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToxOTgKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE5OQogICAgLy8gc2VsZi5vcF9kYWVtb24udmFsdWUgPSBhZGRyZXNzCiAgICBieXRlYyA4IC8vIDB4NTIzYTRmNTA0NDIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwMAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTg0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2Fzc2lnbl9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19hc3NpZ25fcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDE2CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLlJvbGVWYWxpZGl0eQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI1CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNgogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDQKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgaW50Y18zIC8vIDIwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDUKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSByb2xlX2FkZHJlc3MKICAgIGJ5dGVjXzEgLy8gMHg1MjNhNDE1MjUyMjMKICAgIGRpZyAzCiAgICBhcHBfZ2xvYmFsX3B1dAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjgKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDgKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIGR1cAogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnRfbWFuYWdlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyA0IC8vIDB4NTIzYTRkNGU0NzIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTAKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI3CiAgICAvLyBzZWxmLl9zZXRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIHZhbGlkaXR5KQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTMKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgNSAvLyAweDUyM2E1MDU5NDQyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE0CiAgICAvLyBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI3CiAgICAvLyBzZWxmLl9zZXRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIHZhbGlkaXR5KQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTYKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNjAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjXzIgLy8gMHg1MjNhNTQ1MjUzMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExOAogICAgLy8gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI3CiAgICAvLyBzZWxmLl9zZXRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIHZhbGlkaXR5KQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjAKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKToKICAgIGR1cAogICAgcHVzaGludCA3MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAxMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5hdXRob3JpdHksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWNfMyAvLyAweDUyM2E0MTU1NTQyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIyCiAgICAvLyBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNwogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyNAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgODAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI1CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDYgLy8gMHg1MjNhNGQ0ZjQzMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyNgogICAgLy8gc2VsZi5vYnNlcnZlcltyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19yZXZva2Vfcm9sZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfcmV2b2tlX3JvbGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjQ5CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTAKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjUxCiAgICAvLyBzZWxmLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpKQogICAgYnRvaQogICAgZHVwbiAyCiAgICBjYWxsc3ViIF9hc3NlcnRfdmFsaWRfcm9sZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyOQogICAgLy8gYXNzZXJ0IHJvbGVfaWQgIT0gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBkdXAKICAgIGludGNfMyAvLyAyMAogICAgIT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMxCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDQgLy8gMHg1MjNhNGQ0ZTQ3MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMgogICAgLy8gZGVsIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTMKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzQKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzUKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyA1IC8vIDB4NTIzYTUwNTk0NDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzYKICAgIC8vIGRlbCBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1MgogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzgKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNjAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzOQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWNfMiAvLyAweDUyM2E1NDUyNTMyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQwCiAgICAvLyBkZWwgc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1MgogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKToKICAgIGR1cAogICAgcHVzaGludCA3MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQzCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjXzMgLy8gMHg1MjNhNDE1NTU0MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NAogICAgLy8gZGVsIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1MgogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDYKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDgwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDYgLy8gMHg1MjNhNGQ0ZjQzMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0OAogICAgLy8gZGVsIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2NvbnRyYWN0X3N1c3BlbnNpb25bcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2NvbnRyYWN0X3N1c3BlbnNpb246CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzEgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzkKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjXzMgLy8gMHg1MjNhNDE1NTU0MjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNzEKICAgIC8vIHNlbGYuY29udHJhY3Rfc3VzcGVuZGVkID0gc3VzcGVuZGVkCiAgICBieXRlYyA5IC8vICJjb250cmFjdF9zdXNwZW5kZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3MgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2NvbnRyYWN0X2RlZmF1bHRbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2NvbnRyYWN0X2RlZmF1bHQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjc0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzEgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzYKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnRydXN0ZWUsIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlY18yIC8vIDB4NTIzYTU0NTI1MzIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg3CiAgICAvLyBzZWxmLmRlZmF1bHRlZCA9IGRlZmF1bHRlZAogICAgYnl0ZWMgNyAvLyAiZGVmYXVsdGVkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODgKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYXJyYW5nZXJbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDEKICAgIC8vIHJldHVybiBzZWxmLmFycmFuZ2VyLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMSAvLyAweDUyM2E0MTUyNTIyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYWRkcmVzc19yb2xlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzAzCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMQogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hY2NvdW50X21hbmFnZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgNCAvLyAweDUyM2E0ZDRlNDcyMwogICAgZGlnIDEKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzIyCiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnByaW1hcnlfZGVhbGVyLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDUgLy8gMHg1MjNhNTA1OTQ0MjMKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMwogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi50cnVzdGVlLCBhZGRyZXNzKSwKICAgIGJ5dGVjXzIgLy8gMHg1MjNhNTQ1MjUzMjMKICAgIGRpZyAzCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyNAogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIGFkZHJlc3MpLAogICAgYnl0ZWNfMyAvLyAweDUyM2E0MTU1NTQyMwogICAgZGlnIDQKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI1CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLm9ic2VydmVyLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDYgLy8gMHg1MjNhNGQ0ZjQzMjMKICAgIHVuY292ZXIgNQogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDYKICAgIHNldGJpdAogICAgaW50Y18wIC8vIDEKICAgIHVuY292ZXIgNQogICAgc2V0Yml0CiAgICBwdXNoaW50IDIKICAgIHVuY292ZXIgNAogICAgc2V0Yml0CiAgICBwdXNoaW50IDMKICAgIHVuY292ZXIgMwogICAgc2V0Yml0CiAgICBwdXNoaW50IDQKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzQ2CiAgICAvLyByb2xlID0gcm9sZV9pZC5hc191aW50NjQoKQogICAgYnRvaQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM0NwogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZSkKICAgIGR1cAogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNDkKICAgIC8vIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgaW50Y18zIC8vIDIwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzUzCiAgICAvLyBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICBwdXNoaW50cyA0MCA1MCA2MCA3MCA4MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM0OC0zNzkKICAgIC8vIG1hdGNoIHJvbGU6CiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUik6CiAgICAvLyAgICAgICAgIHJldHVybiB0eXAuUm9sZVZhbGlkaXR5KAogICAgLy8gICAgICAgICAgICAgcm9sZV92YWxpZGl0eV9zdGFydD1VSW50NjQoMCksIHJvbGVfdmFsaWRpdHlfZW5kPVVJbnQ2NCgwKQogICAgLy8gICAgICAgICApCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLmFjY291bnRfbWFuYWdlciwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLnByaW1hcnlfZGVhbGVyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLmF1dGhvcml0eSwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLm9ic2VydmVyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIF86CiAgICAvLyAgICAgICAgIG9wLmVycihlcnIuSU5WQUxJRF9ST0xFKQogICAgdW5jb3ZlciA2CiAgICBtYXRjaCByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzBAMiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzFAMyByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzJANCByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzNANSByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzRANiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzVANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM3OQogICAgLy8gb3AuZXJyKGVyci5JTlZBTElEX1JPTEUpCiAgICBlcnIgLy8gSW52YWxpZCByb2xlIGlkZW50aWZpZXIKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM3NQogICAgLy8gc2VsZi5vYnNlcnZlciwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyA2IC8vIDB4NTIzYTRkNGY0MzIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTcKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mzc0LTM3NgogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM3NwogICAgLy8gcmV0dXJuIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzRANjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNzAKICAgIC8vIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjXzMgLy8gMHg1MjNhNDE1NTU0MjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NwogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNjktMzcxCiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5hdXRob3JpdHksIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM3MgogICAgLy8gcmV0dXJuIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfM0A1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM2NQogICAgLy8gc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjXzIgLy8gMHg1MjNhNTQ1MjUzMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NwogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNjQtMzY2CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNjcKICAgIC8vIHJldHVybiBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8yQDQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzYwCiAgICAvLyBzZWxmLnByaW1hcnlfZGVhbGVyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDUgLy8gMHg1MjNhNTA1OTQ0MjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NwogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTktMzYxCiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzYyCiAgICAvLyByZXR1cm4gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzFAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTUKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDQgLy8gMHg1MjNhNGQ0ZTQ3MjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NwogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTQtMzU2CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM1NwogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMEAyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM1MC0zNTIKICAgIC8vIHJldHVybiB0eXAuUm9sZVZhbGlkaXR5KAogICAgLy8gICAgIHJvbGVfdmFsaWRpdHlfc3RhcnQ9VUludDY0KDApLCByb2xlX3ZhbGlkaXR5X2VuZD1VSW50NjQoMCkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9yb2xlX2lzX2FjdGl2ZShyb2xlX21hcDogYnl0ZXMsIHJvbGVfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NDoKX3JvbGVfaXNfYWN0aXZlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5CiAgICAvLyBkZWYgX3JvbGVfaXNfYWN0aXZlKHNlbGYsIHJvbGVfbWFwOiB0eXAuUmJhY1JvbGUsIHJvbGVfYWRkcmVzczogQWNjb3VudCkgLT4gYm9vbDoKICAgIHByb3RvIDIgMQogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTcKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAtNjQKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYxCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjIKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYxLTYyCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYxLTYzCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjMKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgcHVzaGludCA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYyLTYzCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDAKICAgID49CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjEtNjMKICAgIC8vIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IF9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQKICAgIGludGNfMCAvLyAxCgpfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYwLTY0CiAgICAvLyByZXR1cm4gc2VsZi5faGFzX3JvbGUocm9sZV9tYXAsIHJvbGVfYWRkcmVzcykgYW5kICgKICAgIC8vICAgICByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICkKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0OgogICAgaW50Y18xIC8vIDAKICAgIGIgX3JvbGVfaXNfYWN0aXZlX2Jvb2xfbWVyZ2VANQoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkgLT4gdm9pZDoKX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjcKICAgIC8vIGFzc2VydCBzZWxmLl9pc19hcnJhbmdlcihUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU0CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzID09IHNlbGYuYXJyYW5nZXIudmFsdWUKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18xIC8vIDB4NTIzYTQxNTI1MjIzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJyYW5nZXIgZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjY3CiAgICAvLyBhc3NlcnQgc2VsZi5faXNfYXJyYW5nZXIoVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkgLT4gdm9pZDoKX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg1CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuZGVmYXVsdGVkLCBlcnIuREVGQVVMVEVECiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgNyAvLyAiZGVmYXVsdGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRlZmF1bHRlZCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBEZWZhdWx0ZWQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkOiB1aW50NjQpIC0+IHZvaWQ6Cl9hc3NlcnRfdmFsaWRfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MAogICAgLy8gZGVmIF9hc3NlcnRfdmFsaWRfcm9sZShzZWxmLCByb2xlX2lkOiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MS05OQogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTIKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIGludGNfMyAvLyAyMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkxLTk5CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTMKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICBwdXNoaW50IDI1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEtOTkKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NAogICAgLy8gVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIHB1c2hpbnQgNDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MS05OQogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojk1CiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICBwdXNoaW50IDUwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEtOTkKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NgogICAgLy8gVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICBwdXNoaW50IDYwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEtOTkKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NwogICAgLy8gVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIHB1c2hpbnQgNzAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MS05OQogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojk4CiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICBwdXNoaW50IDgwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEtOTkKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBieiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9mYWxzZUA4CgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDc6CiAgICBpbnRjXzAgLy8gMQoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfbWVyZ2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MS05OQogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICByZXRzdWIKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX2ZhbHNlQDg6CiAgICBpbnRjXzEgLy8gMAogICAgYiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9tZXJnZUA5Cg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" }, "byteCode": { - "approval": "CyAEAQAgFCYKBBUffHUGUjpBUlIjBlI6QVVUIwZSOk1ORyMGUjpQWUQjBlI6VFJTIwZSOk1PQyMGUjpPUEQjD2Fzc2V0X3N1c3BlbmRlZA9hc3NldF9kZWZhdWx0ZWQxGEAAESkyA2cnBzIDZycII2cnCSNnMRtBAGCABJFPBOs2GgCOAQBHMRkURDEYRIIIBIL3Gy0E7wT10wTfNDVQBD2+gL0EHj5I5wQBDIKZBHQGrNIEGnKi7jYaAI4IACAANwBPAQABkwGxAbsCBAAxGYEEEjEYEERCAA4xGRQxGBQQRCkxAGciQ4gCrCJDNhoBSRUkEkSIAp8pTGcyBxYoTFCwIkM2GgFJFSQSRIgCiCcHTGcyBxYoTFCwIkM2GgFJFSISRDYaAklOAhUkEkQ2GgNJTgIVgRASRIgCW4gCYRdHAogCYyUSQQANKUsDZzIHFihMULAiQ0mBKBJBABArSwNQSb1FARRESwK/Qv/gSYEyEkEAEScESwNQSb1FARRESwK/Qv/ISYE8EkEAEScFSwNQSb1FARRESwK/Qv+wSYFGEkEAECpLA1BJvUUBFERLAr9C/5lJgVASQf+SJwZLA1BJvUUBFERLAr9C/4E2GgFJFSISRDYaAklOAhUkEkSIAbWIAbsXRwKIAb1JJRNEgSgSQQAUK0sCUEm9RQFEvEgyBxYoTFCwIkNJgTISQQAPJwRLAlBJvUUBRLxIQv/hSYE8EkEADycFSwJQSb1FAUS8SEL/y0mBRhJBAA4qSwJQSb1FAUS8SEL/tkmBUBJB/68nBksCUEm9RQFEvEhC/6A2GgFJFSISRCNTKjEAiADyRCcITGcyBxYoTFCwIkMjKWVEKExQsCJDNhoBSRUkEkQrSwGIAMwnBEsCiADFJwVLA4gAvipLBIgAuCcGTwWIALGAAQAjTwZUIk8FVIECTwRUgQNPA1SBBE8CVChMULAiQzYaAUkVIhJENhoCSU4CFSQSRBdJiADAJYMFKDI8RlBPBo4GAE0APwAwACEAEwABACcGSwFQSb1FAUS+SChMULAiQypLAVBJvUUBRL5IQv/sJwVLAVBJvUUBRL5IQv/dJwRLAVBJvUUBRL5IQv/OK0sBUEm9RQFEvkhC/8CAEAAAAAAAAAAAAAAAAAAAAABC/6uKAgGAAIv+i/9QSb1FAUEAIIsBvkQjWzIHSYwADkEAEYsBvkSBCFuLAA9BAAQijACJI0L/+TEAIyllRBJEiSMnCWVEFESJigEAi/8lEkAAMIv/gRkSQAAoi/+BKBJAACCL/4EyEkAAGIv/gTwSQAAQi/+BRhJAAAiL/4FQEkEAAyJEiSNC//o=", + "approval": "CyAEAQAgFCYKBBUffHUGUjpBUlIjBlI6VFJTIwZSOkFVVCMGUjpNTkcjBlI6UFlEIwZSOk1PQyMJZGVmYXVsdGVkBlI6T1BEIxJjb250cmFjdF9zdXNwZW5kZWQxGEAAESkyA2cnCDIDZycJI2cnByNnMRtBAGeABJFPBOs2GgCOAQBOMRkURDEYRIIJBIL3Gy0E7wT10wTfNDVQBD2+gL0EHj5I5wQ5JB+jBAEMgpkEdAas0gQacqLuNhoAjgkAIAA3AE8BAAGTAbEBzwHZAiIAMRmBBBIxGBBEQgAOMRkUMRgUEEQpMQBnIkOIAsoiQzYaAUkVJBJEiAK9KUxnMgcWKExQsCJDNhoBSRUkEkSIAqYnCExnMgcWKExQsCJDNhoBSRUiEkQ2GgJJTgIVJBJENhoDSU4CFYEQEkSIAnmIAn8XRwKIAoElEkEADSlLA2cyBxYoTFCwIkNJgSgSQQARJwRLA1BJvUUBFERLAr9C/99JgTISQQARJwVLA1BJvUUBFERLAr9C/8dJgTwSQQAQKksDUEm9RQEUREsCv0L/sEmBRhJBABArSwNQSb1FARRESwK/Qv+ZSYFQEkH/kicGSwNQSb1FARRESwK/Qv+BNhoBSRUiEkQ2GgJJTgIVJBJEiAHTiAHZF0cCiAHbSSUTRIEoEkEAFScESwJQSb1FAUS8SDIHFihMULAiQ0mBMhJBAA8nBUsCUEm9RQFEvEhC/+FJgTwSQQAOKksCUEm9RQFEvEhC/8xJgUYSQQAOK0sCUEm9RQFEvEhC/7dJgVASQf+wJwZLAlBJvUUBRLxIQv+hNhoBSRUiEkQjUysxAIgBEEQnCUxnMgcWKExQsCJDNhoBSRUiEkQjUyoxAIgA8kQnB0xnMgcWKExQsCJDIyllRChMULAiQzYaAUkVJBJEJwRLAYgAyycFSwKIAMQqSwOIAL4rSwSIALgnBk8FiACxgAEAI08GVCJPBVSBAk8EVIEDTwNUgQRPAlQoTFCwIkM2GgFJFSISRDYaAklOAhUkEkQXSYgAwCWDBSgyPEZQTwaOBgBNAD4ALwAhABMAAQAnBksBUEm9RQFEvkgoTFCwIkMrSwFQSb1FAUS+SEL/7CpLAVBJvUUBRL5IQv/eJwVLAVBJvUUBRL5IQv/PJwRLAVBJvUUBRL5IQv/AgBAAAAAAAAAAAAAAAAAAAAAAQv+rigIBgACL/ov/UEm9RQFBACCLAb5EI1syB0mMAA5BABGLAb5EgQhbiwAPQQAEIowAiSNC//kxACMpZUQSRIkjJwdlRBREiYoBAIv/JRJAADCL/4EZEkAAKIv/gSgSQAAgi/+BMhJAABiL/4E8EkAAEIv/gUYSQAAIi/+BUBJBAAMiRIkjQv/6", "clear": "C4EBQw==" }, "compilerInfo": { diff --git a/smart_contracts/artifacts/mock_module_rbac/mock_rbac_module_client.py b/smart_contracts/artifacts/mock_module_rbac/mock_rbac_module_client.py index f45425d1..270568a0 100644 --- a/smart_contracts/artifacts/mock_module_rbac/mock_rbac_module_client.py +++ b/smart_contracts/artifacts/mock_module_rbac/mock_rbac_module_client.py @@ -19,7 +19,7 @@ import algokit_utils from algokit_utils import AlgorandClient as _AlgoKitAlgorandClient -_APP_SPEC_JSON = r"""{"arcs": [22, 28], "bareActions": {"call": [], "create": ["NoOp"]}, "methods": [{"actions": {"call": ["UpdateApplication"], "create": []}, "args": [], "name": "contract_update", "returns": {"type": "void", "desc": "None."}, "desc": "Update D-ASA application.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "New arranger address.", "name": "new_arranger"}], "name": "rbac_rotate_arranger", "returns": {"type": "uint64", "desc": "UNIX timestamp of the role assignment."}, "desc": "Rotate the arranger address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Operation daemon address.", "name": "address"}], "name": "rbac_set_op_daemon", "returns": {"type": "uint64", "desc": "UNIX timestamp of the role assignment."}, "desc": "Non-normative helper to set the operation daemon address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role identifier.", "name": "role_id"}, {"type": "address", "desc": "Account role address.", "name": "role_address"}, {"type": "(uint64,uint64)", "desc": "Inclusive validity interval for the assignment.", "name": "validity", "struct": "RoleValidity"}], "name": "rbac_assign_role", "returns": {"type": "uint64", "desc": "UNIX timestamp of the role assignment."}, "desc": "Assign a role to an address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role identifier.", "name": "role_id"}, {"type": "address", "desc": "Account role address.", "name": "role_address"}], "name": "rbac_revoke_role", "returns": {"type": "uint64", "desc": "UNIX timestamp of the role revocation."}, "desc": "Revoke a role from an address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Suspension status to apply.", "name": "suspended"}], "name": "rbac_contract_suspension", "returns": {"type": "uint64", "desc": "UNIX timestamp of the suspension update."}, "desc": "Set the asset-wide suspension status.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "rbac_get_arranger", "returns": {"type": "address", "desc": "Current arranger address."}, "desc": "Get the arranger address.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Address to query.", "name": "address"}], "name": "rbac_get_address_roles", "returns": {"type": "(bool,bool,bool,bool,bool)", "desc": "Roles mask in the order: account manager, primary dealer, trustee, authority, observer."}, "desc": "Non-normative helper to get the active roles assigned to an address.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role identifier.", "name": "role_id"}, {"type": "address", "desc": "Account role address.", "name": "role_address"}], "name": "rbac_get_role_validity", "returns": {"type": "(uint64,uint64)", "desc": "Stored role validity interval.", "struct": "RoleValidity"}, "desc": "Get the stored validity interval for a role assignment.", "events": [], "readonly": true, "recommendations": {}}], "name": "MockRbacModule", "state": {"keys": {"box": {}, "global": {"arranger": {"key": "UjpBUlIj", "keyType": "AVMBytes", "valueType": "address"}, "op_daemon": {"key": "UjpPUEQj", "keyType": "AVMBytes", "valueType": "address"}, "asset_suspended": {"key": "YXNzZXRfc3VzcGVuZGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "asset_defaulted": {"key": "YXNzZXRfZGVmYXVsdGVk", "keyType": "AVMString", "valueType": "AVMUint64"}}, "local": {}}, "maps": {"box": {"account_manager": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpNTkcj"}, "primary_dealer": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpQWUQj"}, "trustee": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpUUlMj"}, "authority": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpBVVQj"}, "observer": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpNT0Mj"}}, "global": {}, "local": {}}, "schema": {"global": {"bytes": 2, "ints": 2}, "local": {"bytes": 0, "ints": 0}}}, "structs": {"RoleValidity": [{"name": "role_validity_start", "type": "uint64"}, {"name": "role_validity_end", "type": "uint64"}]}, "byteCode": {"approval": "CyAEAQAgFCYKBBUffHUGUjpBUlIjBlI6QVVUIwZSOk1ORyMGUjpQWUQjBlI6VFJTIwZSOk1PQyMGUjpPUEQjD2Fzc2V0X3N1c3BlbmRlZA9hc3NldF9kZWZhdWx0ZWQxGEAAESkyA2cnBzIDZycII2cnCSNnMRtBAGCABJFPBOs2GgCOAQBHMRkURDEYRIIIBIL3Gy0E7wT10wTfNDVQBD2+gL0EHj5I5wQBDIKZBHQGrNIEGnKi7jYaAI4IACAANwBPAQABkwGxAbsCBAAxGYEEEjEYEERCAA4xGRQxGBQQRCkxAGciQ4gCrCJDNhoBSRUkEkSIAp8pTGcyBxYoTFCwIkM2GgFJFSQSRIgCiCcHTGcyBxYoTFCwIkM2GgFJFSISRDYaAklOAhUkEkQ2GgNJTgIVgRASRIgCW4gCYRdHAogCYyUSQQANKUsDZzIHFihMULAiQ0mBKBJBABArSwNQSb1FARRESwK/Qv/gSYEyEkEAEScESwNQSb1FARRESwK/Qv/ISYE8EkEAEScFSwNQSb1FARRESwK/Qv+wSYFGEkEAECpLA1BJvUUBFERLAr9C/5lJgVASQf+SJwZLA1BJvUUBFERLAr9C/4E2GgFJFSISRDYaAklOAhUkEkSIAbWIAbsXRwKIAb1JJRNEgSgSQQAUK0sCUEm9RQFEvEgyBxYoTFCwIkNJgTISQQAPJwRLAlBJvUUBRLxIQv/hSYE8EkEADycFSwJQSb1FAUS8SEL/y0mBRhJBAA4qSwJQSb1FAUS8SEL/tkmBUBJB/68nBksCUEm9RQFEvEhC/6A2GgFJFSISRCNTKjEAiADyRCcITGcyBxYoTFCwIkMjKWVEKExQsCJDNhoBSRUkEkQrSwGIAMwnBEsCiADFJwVLA4gAvipLBIgAuCcGTwWIALGAAQAjTwZUIk8FVIECTwRUgQNPA1SBBE8CVChMULAiQzYaAUkVIhJENhoCSU4CFSQSRBdJiADAJYMFKDI8RlBPBo4GAE0APwAwACEAEwABACcGSwFQSb1FAUS+SChMULAiQypLAVBJvUUBRL5IQv/sJwVLAVBJvUUBRL5IQv/dJwRLAVBJvUUBRL5IQv/OK0sBUEm9RQFEvkhC/8CAEAAAAAAAAAAAAAAAAAAAAABC/6uKAgGAAIv+i/9QSb1FAUEAIIsBvkQjWzIHSYwADkEAEYsBvkSBCFuLAA9BAAQijACJI0L/+TEAIyllRBJEiSMnCWVEFESJigEAi/8lEkAAMIv/gRkSQAAoi/+BKBJAACCL/4EyEkAAGIv/gTwSQAAQi/+BRhJAAAiL/4FQEkEAAyJEiSNC//o=", "clear": "C4EBQw=="}, "desc": "\n RBAC Module for testing\n ", "events": [], "networks": {}, "source": {"approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMzIgMjAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAweDUyM2E0MTUyNTIyMyAweDUyM2E0MTU1NTQyMyAweDUyM2E0ZDRlNDcyMyAweDUyM2E1MDU5NDQyMyAweDUyM2E1NDUyNTMyMyAweDUyM2E0ZDRmNDMyMyAweDUyM2E0ZjUwNDQyMyAiYXNzZXRfc3VzcGVuZGVkIiAiYXNzZXRfZGVmYXVsdGVkIgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4LTI5CiAgICAvLyAjIFJCQUMgUm9sZXMKICAgIC8vIHNlbGYuYXJyYW5nZXIgPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX0FSUkFOR0VSKQogICAgYnl0ZWNfMSAvLyAweDUyM2E0MTUyNTIyMwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwCiAgICAvLyBzZWxmLm9wX2RhZW1vbiA9IEdsb2JhbFN0YXRlKEFjY291bnQoKSwga2V5PWNzdC5QUkVGSVhfSURfT1BfREFFTU9OKQogICAgYnl0ZWMgNyAvLyAweDUyM2E0ZjUwNDQyMwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjQ3LTQ4CiAgICAvLyAjIEQtQVNBIEdvdmVybmFuY2UKICAgIC8vIHNlbGYuYXNzZXRfc3VzcGVuZGVkID0gRmFsc2UKICAgIGJ5dGVjIDggLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIGludGNfMSAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjQ5CiAgICAvLyBzZWxmLmFzc2V0X2RlZmF1bHRlZCA9IEZhbHNlCiAgICBieXRlYyA5IC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBpbnRjXzEgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL21vY2tfbW9kdWxlX3JiYWMvY29udHJhY3QucHk6NgogICAgLy8gY2xhc3MgTW9ja1JiYWNNb2R1bGUoUmJhY01vZHVsZSk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9jcmVhdGVAMTkKICAgIHB1c2hieXRlcyAweDkxNGYwNGViIC8vIG1ldGhvZCAiY29udHJhY3RfdXBkYXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9jb250cmFjdF91cGRhdGVfcm91dGVANQoKbWFpbl9zd2l0Y2hfY2FzZV9uZXh0QDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbW9ja19tb2R1bGVfcmJhYy9jb250cmFjdC5weTo2CiAgICAvLyBjbGFzcyBNb2NrUmJhY01vZHVsZShSYmFjTW9kdWxlKToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweDgyZjcxYjJkIDB4ZWYwNGY1ZDMgMHhkZjM0MzU1MCAweDNkYmU4MGJkIDB4MWUzZTQ4ZTcgMHgwMTBjODI5OSAweDc0MDZhY2QyIDB4MWE3MmEyZWUgLy8gbWV0aG9kICJyYmFjX3JvdGF0ZV9hcnJhbmdlcihhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19zZXRfb3BfZGFlbW9uKGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX2Fzc2lnbl9yb2xlKHVpbnQ4LGFkZHJlc3MsKHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19yZXZva2Vfcm9sZSh1aW50OCxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19jb250cmFjdF9zdXNwZW5zaW9uKGJvb2wpdWludDY0IiwgbWV0aG9kICJyYmFjX2dldF9hcnJhbmdlcigpYWRkcmVzcyIsIG1ldGhvZCAicmJhY19nZXRfYWRkcmVzc19yb2xlcyhhZGRyZXNzKShib29sLGJvb2wsYm9vbCxib29sLGJvb2wpIiwgbWV0aG9kICJyYmFjX2dldF9yb2xlX3ZhbGlkaXR5KHVpbnQ4LGFkZHJlc3MpKHVpbnQ2NCx1aW50NjQpIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggcmJhY19yb3RhdGVfYXJyYW5nZXIgcmJhY19zZXRfb3BfZGFlbW9uIHJiYWNfYXNzaWduX3JvbGUgcmJhY19yZXZva2Vfcm9sZSByYmFjX2NvbnRyYWN0X3N1c3BlbnNpb24gcmJhY19nZXRfYXJyYW5nZXIgcmJhY19nZXRfYWRkcmVzc19yb2xlcyByYmFjX2dldF9yb2xlX3ZhbGlkaXR5CiAgICBlcnIKCm1haW5fY29udHJhY3RfdXBkYXRlX3JvdXRlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBwdXNoaW50IDQgLy8gVXBkYXRlQXBwbGljYXRpb24KICAgID09CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydAogICAgYiBjb250cmFjdF91cGRhdGUKCm1haW5fY3JlYXRlQDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL21vY2tfbW9kdWxlX3JiYWMvY29udHJhY3QucHk6MTQKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbW9ja19tb2R1bGVfcmJhYy9jb250cmFjdC5weToxNgogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IFR4bi5zZW5kZXIKICAgIGJ5dGVjXzEgLy8gMHg1MjNhNDE1MjUyMjMKICAgIHR4biBTZW5kZXIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbW9ja19tb2R1bGVfcmJhYy9jb250cmFjdC5weToxNAogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLmNvbnRyYWN0X3VwZGF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X3VwZGF0ZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTktMTYyCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gZ3JhbnRzIHRoZSB1cGRhdGUgcGVybWlzc2lvbnMgdG8gdGhlIEFycmFuZ2VyLgogICAgLy8gIyDimqDvuI8gV0FSTklORzogQXBwbGljYXRpb24gdXBkYXRlcyBtdXN0IGJlIGV4ZWN1dGVkIFZFUlkgY2FyZWZ1bGx5LCBhcyB0aGV5CiAgICAvLyAjIG1pZ2h0IGludHJvZHVjZSBicmVha2luZyBjaGFuZ2VzLgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19yb3RhdGVfYXJyYW5nZXJbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3JvdGF0ZV9hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTc4CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzkKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSBuZXdfYXJyYW5nZXIKICAgIGJ5dGVjXzEgLy8gMHg1MjNhNDE1MjUyMjMKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTgwCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfc2V0X29wX2RhZW1vbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfc2V0X29wX2RhZW1vbjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTk2CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxOTcKICAgIC8vIHNlbGYub3BfZGFlbW9uLnZhbHVlID0gYWRkcmVzcwogICAgYnl0ZWMgNyAvLyAweDUyM2E0ZjUwNDQyMwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxOTgKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19hc3NpZ25fcm9sZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfYXNzaWduX3JvbGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgcHVzaGludCAxNgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5Sb2xlVmFsaWRpdHkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjIKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyMwogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjQKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCkpCiAgICBidG9pCiAgICBkdXBuIDIKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTAyCiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKToKICAgIGludGNfMyAvLyAyMAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTAzCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gcm9sZV9hZGRyZXNzCiAgICBieXRlY18xIC8vIDB4NTIzYTQxNTI1MjIzCiAgICBkaWcgMwogICAgYXBwX2dsb2JhbF9wdXQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI2CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA2CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgNDAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwNwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWNfMyAvLyAweDUyM2E0ZDRlNDcyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA4CiAgICAvLyBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNQogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTEwCiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKToKICAgIGR1cAogICAgcHVzaGludCA1MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTExCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDQgLy8gMHg1MjNhNTA1OTQ0MjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMgogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNQogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE0CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpOgogICAgZHVwCiAgICBwdXNoaW50IDYwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTUKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyA1IC8vIDB4NTIzYTU0NTI1MzIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTYKICAgIC8vIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNQogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE4CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNzAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTkKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjXzIgLy8gMHg1MjNhNDE1NTU0MjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMAogICAgLy8gc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjUKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDgwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5vYnNlcnZlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyA2IC8vIDB4NTIzYTRkNGY0MzIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjQKICAgIC8vIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfcmV2b2tlX3JvbGVbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3Jldm9rZV9yb2xlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0NwogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjQ4CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0OQogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjcKICAgIC8vIGFzc2VydCByb2xlX2lkICE9IFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwgZXJyLklOVkFMSURfUk9MRQogICAgZHVwCiAgICBpbnRjXzMgLy8gMjAKICAgICE9CiAgICBhc3NlcnQgLy8gSW52YWxpZCByb2xlIGlkZW50aWZpZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjgKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIHB1c2hpbnQgNDAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyOQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmFjY291bnRfbWFuYWdlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlY18zIC8vIDB4NTIzYTRkNGU0NzIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzAKICAgIC8vIGRlbCBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjUxCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMyCiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKToKICAgIGR1cAogICAgcHVzaGludCA1MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMzCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgNCAvLyAweDUyM2E1MDU5NDQyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM0CiAgICAvLyBkZWwgc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTAKICAgIC8vIHNlbGYuX2RlbGV0ZV9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcykKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM2CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpOgogICAgZHVwCiAgICBwdXNoaW50IDYwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzcKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDUgLy8gMHg1MjNhNTQ1MjUzMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzOAogICAgLy8gZGVsIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTAKICAgIC8vIHNlbGYuX2RlbGV0ZV9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcykKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQwCiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNzAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlY18yIC8vIDB4NTIzYTQxNTU1NDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDIKICAgIC8vIGRlbCBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTAKICAgIC8vIHNlbGYuX2RlbGV0ZV9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcykKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ0CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKToKICAgIGR1cAogICAgcHVzaGludCA4MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDUKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5vYnNlcnZlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyA2IC8vIDB4NTIzYTRkNGY0MzIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDYKICAgIC8vIGRlbCBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19jb250cmFjdF9zdXNwZW5zaW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19jb250cmFjdF9zdXNwZW5zaW9uOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kICAjIFRPRE86IFVwZGF0ZSBzcGVjcyBhbmQgYWRkIHRlc3QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzEgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzcKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjXzIgLy8gMHg1MjNhNDE1NTU0MjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNjkKICAgIC8vIHNlbGYuYXNzZXRfc3VzcGVuZGVkID0gc3VzcGVuZGVkCiAgICBieXRlYyA4IC8vICJhc3NldF9zdXNwZW5kZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3MAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjUzCiAgICAvLyBAYXJjNC5hYmltZXRob2QgICMgVE9ETzogVXBkYXRlIHNwZWNzIGFuZCBhZGQgdGVzdAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X2FycmFuZ2VyW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgzCiAgICAvLyByZXR1cm4gc2VsZi5hcnJhbmdlci52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzEgLy8gMHg1MjNhNDE1MjUyMjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcnJhbmdlciBleGlzdHMKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNzIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXNbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9hZGRyZXNzX3JvbGVzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDMKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBhZGRyZXNzKSwKICAgIGJ5dGVjXzMgLy8gMHg1MjNhNGQ0ZTQ3MjMKICAgIGRpZyAxCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwNAogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5wcmltYXJ5X2RlYWxlciwgYWRkcmVzcyksCiAgICBieXRlYyA0IC8vIDB4NTIzYTUwNTk0NDIzCiAgICBkaWcgMgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDUKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYudHJ1c3RlZSwgYWRkcmVzcyksCiAgICBieXRlYyA1IC8vIDB4NTIzYTU0NTI1MzIzCiAgICBkaWcgMwogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDYKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYXV0aG9yaXR5LCBhZGRyZXNzKSwKICAgIGJ5dGVjXzIgLy8gMHg1MjNhNDE1NTU0MjMKICAgIGRpZyA0CiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwNwogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5vYnNlcnZlciwgYWRkcmVzcyksCiAgICBieXRlYyA2IC8vIDB4NTIzYTRkNGY0MzIzCiAgICB1bmNvdmVyIDUKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg1CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHB1c2hieXRlcyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciA2CiAgICBzZXRiaXQKICAgIGludGNfMCAvLyAxCiAgICB1bmNvdmVyIDUKICAgIHNldGJpdAogICAgcHVzaGludCAyCiAgICB1bmNvdmVyIDQKICAgIHNldGJpdAogICAgcHVzaGludCAzCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgcHVzaGludCA0CiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOAogICAgLy8gcm9sZSA9IHJvbGVfaWQuYXNfdWludDY0KCkKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjkKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGUpCiAgICBkdXAKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzMxCiAgICAvLyBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKToKICAgIGludGNfMyAvLyAyMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMzNQogICAgLy8gY2FzZSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludHMgNDAgNTAgNjAgNzAgODAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzAtMzYxCiAgICAvLyBtYXRjaCByb2xlOgogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgLy8gICAgICAgICByZXR1cm4gdHlwLlJvbGVWYWxpZGl0eSgKICAgIC8vICAgICAgICAgICAgIHJvbGVfdmFsaWRpdHlfc3RhcnQ9VUludDY0KDApLCByb2xlX3ZhbGlkaXR5X2VuZD1VSW50NjQoMCkKICAgIC8vICAgICAgICAgKQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5hdXRob3JpdHksIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5vYnNlcnZlciwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5vYnNlcnZlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBfOgogICAgLy8gICAgICAgICBvcC5lcnIoZXJyLklOVkFMSURfUk9MRSkKICAgIHVuY292ZXIgNgogICAgbWF0Y2ggcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8wQDIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8xQDMgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8yQDQgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8zQDUgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV80QDYgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV81QDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNjEKICAgIC8vIG9wLmVycihlcnIuSU5WQUxJRF9ST0xFKQogICAgZXJyIC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzVANzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTcKICAgIC8vIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgNiAvLyAweDUyM2E0ZDRmNDMyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM1Ni0zNTgKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLm9ic2VydmVyLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTkKICAgIC8vIHJldHVybiBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV80QDY6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzUyCiAgICAvLyBzZWxmLmF1dGhvcml0eSwgcm9sZV9hZGRyZXNzCiAgICBieXRlY18yIC8vIDB4NTIzYTQxNTU1NDIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzUxLTM1MwogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTQKICAgIC8vIHJldHVybiBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzNANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNDcKICAgIC8vIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyA1IC8vIDB4NTIzYTU0NTI1MzIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzQ2LTM0OAogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzQ5CiAgICAvLyByZXR1cm4gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMkA0OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM0MgogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyA0IC8vIDB4NTIzYTUwNTk0NDIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzQxLTM0MwogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM0NAogICAgLy8gcmV0dXJuIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8xQDM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzM3CiAgICAvLyBzZWxmLmFjY291bnRfbWFuYWdlciwgcm9sZV9hZGRyZXNzCiAgICBieXRlY18zIC8vIDB4NTIzYTRkNGU0NzIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzM2LTMzOAogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzkKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzBAMjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzItMzM0CiAgICAvLyByZXR1cm4gdHlwLlJvbGVWYWxpZGl0eSgKICAgIC8vICAgICByb2xlX3ZhbGlkaXR5X3N0YXJ0PVVJbnQ2NCgwKSwgcm9sZV92YWxpZGl0eV9lbmQ9VUludDY0KDApCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fcm9sZV9pc19hY3RpdmUocm9sZV9tYXA6IGJ5dGVzLCByb2xlX2FkZHJlc3M6IGJ5dGVzKSAtPiB1aW50NjQ6Cl9yb2xlX2lzX2FjdGl2ZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NwogICAgLy8gZGVmIF9yb2xlX2lzX2FjdGl2ZShzZWxmLCByb2xlX21hcDogdHlwLlJiYWNSb2xlLCByb2xlX2FkZHJlc3M6IEFjY291bnQpIC0+IGJvb2w6CiAgICBwcm90byAyIDEKICAgIHB1c2hieXRlcyAiIgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU4LTYyCiAgICAvLyByZXR1cm4gc2VsZi5faGFzX3JvbGUocm9sZV9tYXAsIHJvbGVfYWRkcmVzcykgYW5kICgKICAgIC8vICAgICByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICkKICAgIGJ6IF9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIEJveE1hcCBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYwCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MAogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgPD0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYxCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIEJveE1hcCBlbnRyeSBleGlzdHMKICAgIHB1c2hpbnQgOAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2MC02MQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAwCiAgICA+PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5LTYxCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0CiAgICBpbnRjXzAgLy8gMQoKX3JvbGVfaXNfYWN0aXZlX2Jvb2xfbWVyZ2VANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OC02MgogICAgLy8gcmV0dXJuIHNlbGYuX2hhc19yb2xlKHJvbGVfbWFwLCByb2xlX2FkZHJlc3MpIGFuZCAoCiAgICAvLyAgICAgcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICAvLyApCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANDoKICAgIGludGNfMSAvLyAwCiAgICBiIF9yb2xlX2lzX2FjdGl2ZV9ib29sX21lcmdlQDUKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpIC0+IHZvaWQ6Cl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjY1CiAgICAvLyBhc3NlcnQgc2VsZi5faXNfYXJyYW5nZXIoVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1MgogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyA9PSBzZWxmLmFycmFuZ2VyLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMSAvLyAweDUyM2E0MTUyNTIyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgPT0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2NQogICAgLy8gYXNzZXJ0IHNlbGYuX2lzX2FycmFuZ2VyKFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpIC0+IHZvaWQ6Cl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4MwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFzc2V0X2RlZmF1bHRlZCwgZXJyLkRFRkFVTFRFRAogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDkgLy8gImFzc2V0X2RlZmF1bHRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9kZWZhdWx0ZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRGVmYXVsdGVkCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZDogdWludDY0KSAtPiB2b2lkOgpfYXNzZXJ0X3ZhbGlkX3JvbGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODgKICAgIC8vIGRlZiBfYXNzZXJ0X3ZhbGlkX3JvbGUoc2VsZiwgcm9sZV9pZDogVUludDY0KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkwCiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICBpbnRjXzMgLy8gMjAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkxCiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgcHVzaGludCAyNQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTIKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICBwdXNoaW50IDQwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MwogICAgLy8gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgcHVzaGludCA1MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTQKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgcHVzaGludCA2MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTUKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICBwdXNoaW50IDcwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NgogICAgLy8gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgcHVzaGludCA4MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfZmFsc2VAOAoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3OgogICAgaW50Y18wIC8vIDEKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX21lcmdlQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgcmV0c3ViCgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9mYWxzZUA4OgogICAgaW50Y18xIC8vIDAKICAgIGIgX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfbWVyZ2VAOQo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="}, "sourceInfo": {"approval": {"pcOffsetMethod": "none", "sourceInfo": [{"pc": [934], "errorMessage": "Defaulted"}, {"pc": [359, 383, 407, 430, 454, 509, 537, 559, 580, 602, 778, 795, 810, 825, 839], "errorMessage": "Invalid account role address"}, {"pc": [494, 768, 995], "errorMessage": "Invalid role identifier"}, {"pc": [624, 926], "errorMessage": "Not authorized"}, {"pc": [886, 901], "errorMessage": "check BoxMap entry exists"}, {"pc": [641, 924], "errorMessage": "check self.arranger exists"}, {"pc": [932], "errorMessage": "check self.asset_defaulted exists"}, {"pc": [615], "errorMessage": "invalid number of bytes for arc4.bool"}, {"pc": [244, 267, 301, 478, 655, 738], "errorMessage": "invalid number of bytes for arc4.static_array"}, {"pc": [291, 468, 728], "errorMessage": "invalid number of bytes for arc4.uint8"}, {"pc": [312], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.RoleValidity"}]}, "clear": {"pcOffsetMethod": "none", "sourceInfo": []}}, "templateVariables": {}}""" +_APP_SPEC_JSON = r"""{"arcs": [22, 28], "bareActions": {"call": [], "create": ["NoOp"]}, "methods": [{"actions": {"call": ["UpdateApplication"], "create": []}, "args": [], "name": "contract_update", "returns": {"type": "void", "desc": "None."}, "desc": "Update D-ASA application.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "New arranger address.", "name": "new_arranger"}], "name": "rbac_rotate_arranger", "returns": {"type": "uint64", "desc": "UNIX timestamp of the role assignment."}, "desc": "Rotate the arranger address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Operation daemon address.", "name": "address"}], "name": "rbac_set_op_daemon", "returns": {"type": "uint64", "desc": "UNIX timestamp of the role assignment."}, "desc": "Non-normative helper to set the operation daemon address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role identifier.", "name": "role_id"}, {"type": "address", "desc": "Account role address.", "name": "role_address"}, {"type": "(uint64,uint64)", "desc": "Inclusive validity interval for the assignment.", "name": "validity", "struct": "RoleValidity"}], "name": "rbac_assign_role", "returns": {"type": "uint64", "desc": "UNIX timestamp of the role assignment."}, "desc": "Assign a role to an address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role identifier.", "name": "role_id"}, {"type": "address", "desc": "Account role address.", "name": "role_address"}], "name": "rbac_revoke_role", "returns": {"type": "uint64", "desc": "UNIX timestamp of the role revocation."}, "desc": "Revoke a role from an address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Suspension status to apply.", "name": "suspended"}], "name": "rbac_contract_suspension", "returns": {"type": "uint64", "desc": "UNIX timestamp of the suspension update."}, "desc": "Set the asset-wide suspension status.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Default status", "name": "defaulted"}], "name": "rbac_contract_default", "returns": {"type": "uint64"}, "desc": "Set D-ASA default status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "rbac_get_arranger", "returns": {"type": "address", "desc": "Current arranger address."}, "desc": "Get the arranger address.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Address to query.", "name": "address"}], "name": "rbac_get_address_roles", "returns": {"type": "(bool,bool,bool,bool,bool)", "desc": "Roles mask in the order: account manager, primary dealer, trustee, authority, observer."}, "desc": "Non-normative helper to get the active roles assigned to an address.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role identifier.", "name": "role_id"}, {"type": "address", "desc": "Account role address.", "name": "role_address"}], "name": "rbac_get_role_validity", "returns": {"type": "(uint64,uint64)", "desc": "Stored role validity interval.", "struct": "RoleValidity"}, "desc": "Get the stored validity interval for a role assignment.", "events": [], "readonly": true, "recommendations": {}}], "name": "MockRbacModule", "state": {"keys": {"box": {}, "global": {"arranger": {"key": "UjpBUlIj", "keyType": "AVMBytes", "valueType": "address"}, "op_daemon": {"key": "UjpPUEQj", "keyType": "AVMBytes", "valueType": "address"}, "contract_suspended": {"key": "Y29udHJhY3Rfc3VzcGVuZGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "defaulted": {"key": "ZGVmYXVsdGVk", "keyType": "AVMString", "valueType": "AVMUint64"}}, "local": {}}, "maps": {"box": {"account_manager": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpNTkcj"}, "primary_dealer": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpQWUQj"}, "trustee": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpUUlMj"}, "authority": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpBVVQj"}, "observer": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpNT0Mj"}}, "global": {}, "local": {}}, "schema": {"global": {"bytes": 2, "ints": 2}, "local": {"bytes": 0, "ints": 0}}}, "structs": {"RoleValidity": [{"name": "role_validity_start", "type": "uint64"}, {"name": "role_validity_end", "type": "uint64"}]}, "byteCode": {"approval": "CyAEAQAgFCYKBBUffHUGUjpBUlIjBlI6VFJTIwZSOkFVVCMGUjpNTkcjBlI6UFlEIwZSOk1PQyMJZGVmYXVsdGVkBlI6T1BEIxJjb250cmFjdF9zdXNwZW5kZWQxGEAAESkyA2cnCDIDZycJI2cnByNnMRtBAGeABJFPBOs2GgCOAQBOMRkURDEYRIIJBIL3Gy0E7wT10wTfNDVQBD2+gL0EHj5I5wQ5JB+jBAEMgpkEdAas0gQacqLuNhoAjgkAIAA3AE8BAAGTAbEBzwHZAiIAMRmBBBIxGBBEQgAOMRkUMRgUEEQpMQBnIkOIAsoiQzYaAUkVJBJEiAK9KUxnMgcWKExQsCJDNhoBSRUkEkSIAqYnCExnMgcWKExQsCJDNhoBSRUiEkQ2GgJJTgIVJBJENhoDSU4CFYEQEkSIAnmIAn8XRwKIAoElEkEADSlLA2cyBxYoTFCwIkNJgSgSQQARJwRLA1BJvUUBFERLAr9C/99JgTISQQARJwVLA1BJvUUBFERLAr9C/8dJgTwSQQAQKksDUEm9RQEUREsCv0L/sEmBRhJBABArSwNQSb1FARRESwK/Qv+ZSYFQEkH/kicGSwNQSb1FARRESwK/Qv+BNhoBSRUiEkQ2GgJJTgIVJBJEiAHTiAHZF0cCiAHbSSUTRIEoEkEAFScESwJQSb1FAUS8SDIHFihMULAiQ0mBMhJBAA8nBUsCUEm9RQFEvEhC/+FJgTwSQQAOKksCUEm9RQFEvEhC/8xJgUYSQQAOK0sCUEm9RQFEvEhC/7dJgVASQf+wJwZLAlBJvUUBRLxIQv+hNhoBSRUiEkQjUysxAIgBEEQnCUxnMgcWKExQsCJDNhoBSRUiEkQjUyoxAIgA8kQnB0xnMgcWKExQsCJDIyllRChMULAiQzYaAUkVJBJEJwRLAYgAyycFSwKIAMQqSwOIAL4rSwSIALgnBk8FiACxgAEAI08GVCJPBVSBAk8EVIEDTwNUgQRPAlQoTFCwIkM2GgFJFSISRDYaAklOAhUkEkQXSYgAwCWDBSgyPEZQTwaOBgBNAD4ALwAhABMAAQAnBksBUEm9RQFEvkgoTFCwIkMrSwFQSb1FAUS+SEL/7CpLAVBJvUUBRL5IQv/eJwVLAVBJvUUBRL5IQv/PJwRLAVBJvUUBRL5IQv/AgBAAAAAAAAAAAAAAAAAAAAAAQv+rigIBgACL/ov/UEm9RQFBACCLAb5EI1syB0mMAA5BABGLAb5EgQhbiwAPQQAEIowAiSNC//kxACMpZUQSRIkjJwdlRBREiYoBAIv/JRJAADCL/4EZEkAAKIv/gSgSQAAgi/+BMhJAABiL/4E8EkAAEIv/gUYSQAAIi/+BUBJBAAMiRIkjQv/6", "clear": "C4EBQw=="}, "desc": "\n RBAC Module for testing\n ", "events": [], "networks": {}, "source": {"approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMzIgMjAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAweDUyM2E0MTUyNTIyMyAweDUyM2E1NDUyNTMyMyAweDUyM2E0MTU1NTQyMyAweDUyM2E0ZDRlNDcyMyAweDUyM2E1MDU5NDQyMyAweDUyM2E0ZDRmNDMyMyAiZGVmYXVsdGVkIiAweDUyM2E0ZjUwNDQyMyAiY29udHJhY3Rfc3VzcGVuZGVkIgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4LTI5CiAgICAvLyAjIFJCQUMgUm9sZXMKICAgIC8vIHNlbGYuYXJyYW5nZXIgPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX0FSUkFOR0VSKQogICAgYnl0ZWNfMSAvLyAweDUyM2E0MTUyNTIyMwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwCiAgICAvLyBzZWxmLm9wX2RhZW1vbiA9IEdsb2JhbFN0YXRlKEFjY291bnQoKSwga2V5PWNzdC5QUkVGSVhfSURfT1BfREFFTU9OKQogICAgYnl0ZWMgOCAvLyAweDUyM2E0ZjUwNDQyMwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjQ3LTQ4CiAgICAvLyAjIENvbnRyYWN0IEdvdmVybmFuY2UKICAgIC8vIHNlbGYuY29udHJhY3Rfc3VzcGVuZGVkID0gRmFsc2UKICAgIGJ5dGVjIDkgLy8gImNvbnRyYWN0X3N1c3BlbmRlZCIKICAgIGludGNfMSAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjUwLTUxCiAgICAvLyAjIENvbnRyYWN0IFBlcmZvcm1hbmNlCiAgICAvLyBzZWxmLmRlZmF1bHRlZCA9IEZhbHNlCiAgICBieXRlYyA3IC8vICJkZWZhdWx0ZWQiCiAgICBpbnRjXzEgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL21vY2tfbW9kdWxlX3JiYWMvY29udHJhY3QucHk6NgogICAgLy8gY2xhc3MgTW9ja1JiYWNNb2R1bGUoUmJhY01vZHVsZSk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9jcmVhdGVAMjAKICAgIHB1c2hieXRlcyAweDkxNGYwNGViIC8vIG1ldGhvZCAiY29udHJhY3RfdXBkYXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9jb250cmFjdF91cGRhdGVfcm91dGVANQoKbWFpbl9zd2l0Y2hfY2FzZV9uZXh0QDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbW9ja19tb2R1bGVfcmJhYy9jb250cmFjdC5weTo2CiAgICAvLyBjbGFzcyBNb2NrUmJhY01vZHVsZShSYmFjTW9kdWxlKToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweDgyZjcxYjJkIDB4ZWYwNGY1ZDMgMHhkZjM0MzU1MCAweDNkYmU4MGJkIDB4MWUzZTQ4ZTcgMHgzOTI0MWZhMyAweDAxMGM4Mjk5IDB4NzQwNmFjZDIgMHgxYTcyYTJlZSAvLyBtZXRob2QgInJiYWNfcm90YXRlX2FycmFuZ2VyKGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX3NldF9vcF9kYWVtb24oYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgInJiYWNfYXNzaWduX3JvbGUodWludDgsYWRkcmVzcywodWludDY0LHVpbnQ2NCkpdWludDY0IiwgbWV0aG9kICJyYmFjX3Jldm9rZV9yb2xlKHVpbnQ4LGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX2NvbnRyYWN0X3N1c3BlbnNpb24oYm9vbCl1aW50NjQiLCBtZXRob2QgInJiYWNfY29udHJhY3RfZGVmYXVsdChib29sKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19nZXRfYXJyYW5nZXIoKWFkZHJlc3MiLCBtZXRob2QgInJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXMoYWRkcmVzcykoYm9vbCxib29sLGJvb2wsYm9vbCxib29sKSIsIG1ldGhvZCAicmJhY19nZXRfcm9sZV92YWxpZGl0eSh1aW50OCxhZGRyZXNzKSh1aW50NjQsdWludDY0KSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIHJiYWNfcm90YXRlX2FycmFuZ2VyIHJiYWNfc2V0X29wX2RhZW1vbiByYmFjX2Fzc2lnbl9yb2xlIHJiYWNfcmV2b2tlX3JvbGUgcmJhY19jb250cmFjdF9zdXNwZW5zaW9uIHJiYWNfY29udHJhY3RfZGVmYXVsdCByYmFjX2dldF9hcnJhbmdlciByYmFjX2dldF9hZGRyZXNzX3JvbGVzIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHkKICAgIGVycgoKbWFpbl9jb250cmFjdF91cGRhdGVfcm91dGVANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgNCAvLyBVcGRhdGVBcHBsaWNhdGlvbgogICAgPT0KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0CiAgICBiIGNvbnRyYWN0X3VwZGF0ZQoKbWFpbl9jcmVhdGVAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbW9ja19tb2R1bGVfcmJhYy9jb250cmFjdC5weToxNAogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICBhc3NlcnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tb2NrX21vZHVsZV9yYmFjL2NvbnRyYWN0LnB5OjE2CiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gVHhuLnNlbmRlcgogICAgYnl0ZWNfMSAvLyAweDUyM2E0MTUyNTIyMwogICAgdHhuIFNlbmRlcgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tb2NrX21vZHVsZV9yYmFjL2NvbnRyYWN0LnB5OjE0CiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuY29udHJhY3RfdXBkYXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfdXBkYXRlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2MS0xNjQKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBncmFudHMgdGhlIHVwZGF0ZSBwZXJtaXNzaW9ucyB0byB0aGUgQXJyYW5nZXIuCiAgICAvLyAjIOKaoO+4jyBXQVJOSU5HOiBBcHBsaWNhdGlvbiB1cGRhdGVzIG11c3QgYmUgZXhlY3V0ZWQgVkVSWSBjYXJlZnVsbHksIGFzIHRoZXkKICAgIC8vICMgbWlnaHQgaW50cm9kdWNlIGJyZWFraW5nIGNoYW5nZXMuCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3JvdGF0ZV9hcnJhbmdlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfcm90YXRlX2FycmFuZ2VyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODAKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4MQogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IG5ld19hcnJhbmdlcgogICAgYnl0ZWNfMSAvLyAweDUyM2E0MTUyNTIyMwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODIKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19zZXRfb3BfZGFlbW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19zZXRfb3BfZGFlbW9uOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToxOTgKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE5OQogICAgLy8gc2VsZi5vcF9kYWVtb24udmFsdWUgPSBhZGRyZXNzCiAgICBieXRlYyA4IC8vIDB4NTIzYTRmNTA0NDIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwMAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTg0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2Fzc2lnbl9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19hc3NpZ25fcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDE2CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLlJvbGVWYWxpZGl0eQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI1CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNgogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDQKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgaW50Y18zIC8vIDIwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDUKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSByb2xlX2FkZHJlc3MKICAgIGJ5dGVjXzEgLy8gMHg1MjNhNDE1MjUyMjMKICAgIGRpZyAzCiAgICBhcHBfZ2xvYmFsX3B1dAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjgKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDgKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIGR1cAogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnRfbWFuYWdlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyA0IC8vIDB4NTIzYTRkNGU0NzIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTAKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI3CiAgICAvLyBzZWxmLl9zZXRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIHZhbGlkaXR5KQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTMKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgNSAvLyAweDUyM2E1MDU5NDQyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE0CiAgICAvLyBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI3CiAgICAvLyBzZWxmLl9zZXRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIHZhbGlkaXR5KQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTYKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNjAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjXzIgLy8gMHg1MjNhNTQ1MjUzMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExOAogICAgLy8gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI3CiAgICAvLyBzZWxmLl9zZXRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIHZhbGlkaXR5KQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjAKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKToKICAgIGR1cAogICAgcHVzaGludCA3MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAxMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5hdXRob3JpdHksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWNfMyAvLyAweDUyM2E0MTU1NTQyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIyCiAgICAvLyBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNwogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyNAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgODAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI1CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDYgLy8gMHg1MjNhNGQ0ZjQzMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyNgogICAgLy8gc2VsZi5vYnNlcnZlcltyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19yZXZva2Vfcm9sZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfcmV2b2tlX3JvbGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjQ5CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTAKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjUxCiAgICAvLyBzZWxmLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpKQogICAgYnRvaQogICAgZHVwbiAyCiAgICBjYWxsc3ViIF9hc3NlcnRfdmFsaWRfcm9sZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyOQogICAgLy8gYXNzZXJ0IHJvbGVfaWQgIT0gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBkdXAKICAgIGludGNfMyAvLyAyMAogICAgIT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMxCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDQgLy8gMHg1MjNhNGQ0ZTQ3MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMgogICAgLy8gZGVsIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTMKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzQKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzUKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyA1IC8vIDB4NTIzYTUwNTk0NDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzYKICAgIC8vIGRlbCBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1MgogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzgKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNjAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzOQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWNfMiAvLyAweDUyM2E1NDUyNTMyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQwCiAgICAvLyBkZWwgc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1MgogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKToKICAgIGR1cAogICAgcHVzaGludCA3MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQzCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjXzMgLy8gMHg1MjNhNDE1NTU0MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NAogICAgLy8gZGVsIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1MgogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDYKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDgwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDYgLy8gMHg1MjNhNGQ0ZjQzMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0OAogICAgLy8gZGVsIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2NvbnRyYWN0X3N1c3BlbnNpb25bcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2NvbnRyYWN0X3N1c3BlbnNpb246CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzEgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzkKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjXzMgLy8gMHg1MjNhNDE1NTU0MjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNzEKICAgIC8vIHNlbGYuY29udHJhY3Rfc3VzcGVuZGVkID0gc3VzcGVuZGVkCiAgICBieXRlYyA5IC8vICJjb250cmFjdF9zdXNwZW5kZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3MgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2NvbnRyYWN0X2RlZmF1bHRbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2NvbnRyYWN0X2RlZmF1bHQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjc0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzEgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzYKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnRydXN0ZWUsIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlY18yIC8vIDB4NTIzYTU0NTI1MzIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg3CiAgICAvLyBzZWxmLmRlZmF1bHRlZCA9IGRlZmF1bHRlZAogICAgYnl0ZWMgNyAvLyAiZGVmYXVsdGVkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODgKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYXJyYW5nZXJbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDEKICAgIC8vIHJldHVybiBzZWxmLmFycmFuZ2VyLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMSAvLyAweDUyM2E0MTUyNTIyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYWRkcmVzc19yb2xlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzAzCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMQogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hY2NvdW50X21hbmFnZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgNCAvLyAweDUyM2E0ZDRlNDcyMwogICAgZGlnIDEKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzIyCiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnByaW1hcnlfZGVhbGVyLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDUgLy8gMHg1MjNhNTA1OTQ0MjMKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMwogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi50cnVzdGVlLCBhZGRyZXNzKSwKICAgIGJ5dGVjXzIgLy8gMHg1MjNhNTQ1MjUzMjMKICAgIGRpZyAzCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyNAogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIGFkZHJlc3MpLAogICAgYnl0ZWNfMyAvLyAweDUyM2E0MTU1NTQyMwogICAgZGlnIDQKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI1CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLm9ic2VydmVyLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDYgLy8gMHg1MjNhNGQ0ZjQzMjMKICAgIHVuY292ZXIgNQogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDYKICAgIHNldGJpdAogICAgaW50Y18wIC8vIDEKICAgIHVuY292ZXIgNQogICAgc2V0Yml0CiAgICBwdXNoaW50IDIKICAgIHVuY292ZXIgNAogICAgc2V0Yml0CiAgICBwdXNoaW50IDMKICAgIHVuY292ZXIgMwogICAgc2V0Yml0CiAgICBwdXNoaW50IDQKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzQ2CiAgICAvLyByb2xlID0gcm9sZV9pZC5hc191aW50NjQoKQogICAgYnRvaQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM0NwogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZSkKICAgIGR1cAogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNDkKICAgIC8vIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgaW50Y18zIC8vIDIwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzUzCiAgICAvLyBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICBwdXNoaW50cyA0MCA1MCA2MCA3MCA4MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM0OC0zNzkKICAgIC8vIG1hdGNoIHJvbGU6CiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUik6CiAgICAvLyAgICAgICAgIHJldHVybiB0eXAuUm9sZVZhbGlkaXR5KAogICAgLy8gICAgICAgICAgICAgcm9sZV92YWxpZGl0eV9zdGFydD1VSW50NjQoMCksIHJvbGVfdmFsaWRpdHlfZW5kPVVJbnQ2NCgwKQogICAgLy8gICAgICAgICApCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLmFjY291bnRfbWFuYWdlciwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLnByaW1hcnlfZGVhbGVyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLmF1dGhvcml0eSwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLm9ic2VydmVyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIF86CiAgICAvLyAgICAgICAgIG9wLmVycihlcnIuSU5WQUxJRF9ST0xFKQogICAgdW5jb3ZlciA2CiAgICBtYXRjaCByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzBAMiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzFAMyByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzJANCByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzNANSByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzRANiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzVANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM3OQogICAgLy8gb3AuZXJyKGVyci5JTlZBTElEX1JPTEUpCiAgICBlcnIgLy8gSW52YWxpZCByb2xlIGlkZW50aWZpZXIKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM3NQogICAgLy8gc2VsZi5vYnNlcnZlciwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyA2IC8vIDB4NTIzYTRkNGY0MzIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTcKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mzc0LTM3NgogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM3NwogICAgLy8gcmV0dXJuIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzRANjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNzAKICAgIC8vIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjXzMgLy8gMHg1MjNhNDE1NTU0MjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NwogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNjktMzcxCiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5hdXRob3JpdHksIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM3MgogICAgLy8gcmV0dXJuIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfM0A1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM2NQogICAgLy8gc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjXzIgLy8gMHg1MjNhNTQ1MjUzMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NwogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNjQtMzY2CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNjcKICAgIC8vIHJldHVybiBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8yQDQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzYwCiAgICAvLyBzZWxmLnByaW1hcnlfZGVhbGVyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDUgLy8gMHg1MjNhNTA1OTQ0MjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NwogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTktMzYxCiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzYyCiAgICAvLyByZXR1cm4gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzFAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTUKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDQgLy8gMHg1MjNhNGQ0ZTQ3MjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NwogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTQtMzU2CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM1NwogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMEAyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM1MC0zNTIKICAgIC8vIHJldHVybiB0eXAuUm9sZVZhbGlkaXR5KAogICAgLy8gICAgIHJvbGVfdmFsaWRpdHlfc3RhcnQ9VUludDY0KDApLCByb2xlX3ZhbGlkaXR5X2VuZD1VSW50NjQoMCkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9yb2xlX2lzX2FjdGl2ZShyb2xlX21hcDogYnl0ZXMsIHJvbGVfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NDoKX3JvbGVfaXNfYWN0aXZlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5CiAgICAvLyBkZWYgX3JvbGVfaXNfYWN0aXZlKHNlbGYsIHJvbGVfbWFwOiB0eXAuUmJhY1JvbGUsIHJvbGVfYWRkcmVzczogQWNjb3VudCkgLT4gYm9vbDoKICAgIHByb3RvIDIgMQogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTcKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAtNjQKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYxCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjIKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYxLTYyCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYxLTYzCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjMKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgcHVzaGludCA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYyLTYzCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDAKICAgID49CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjEtNjMKICAgIC8vIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IF9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQKICAgIGludGNfMCAvLyAxCgpfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYwLTY0CiAgICAvLyByZXR1cm4gc2VsZi5faGFzX3JvbGUocm9sZV9tYXAsIHJvbGVfYWRkcmVzcykgYW5kICgKICAgIC8vICAgICByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICkKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0OgogICAgaW50Y18xIC8vIDAKICAgIGIgX3JvbGVfaXNfYWN0aXZlX2Jvb2xfbWVyZ2VANQoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkgLT4gdm9pZDoKX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjcKICAgIC8vIGFzc2VydCBzZWxmLl9pc19hcnJhbmdlcihUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU0CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzID09IHNlbGYuYXJyYW5nZXIudmFsdWUKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18xIC8vIDB4NTIzYTQxNTI1MjIzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJyYW5nZXIgZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjY3CiAgICAvLyBhc3NlcnQgc2VsZi5faXNfYXJyYW5nZXIoVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkgLT4gdm9pZDoKX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg1CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuZGVmYXVsdGVkLCBlcnIuREVGQVVMVEVECiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgNyAvLyAiZGVmYXVsdGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRlZmF1bHRlZCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBEZWZhdWx0ZWQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkOiB1aW50NjQpIC0+IHZvaWQ6Cl9hc3NlcnRfdmFsaWRfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MAogICAgLy8gZGVmIF9hc3NlcnRfdmFsaWRfcm9sZShzZWxmLCByb2xlX2lkOiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MS05OQogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTIKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIGludGNfMyAvLyAyMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkxLTk5CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTMKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICBwdXNoaW50IDI1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEtOTkKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NAogICAgLy8gVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIHB1c2hpbnQgNDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MS05OQogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojk1CiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICBwdXNoaW50IDUwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEtOTkKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NgogICAgLy8gVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICBwdXNoaW50IDYwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEtOTkKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NwogICAgLy8gVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIHB1c2hpbnQgNzAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MS05OQogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojk4CiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICBwdXNoaW50IDgwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEtOTkKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBieiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9mYWxzZUA4CgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDc6CiAgICBpbnRjXzAgLy8gMQoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfbWVyZ2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MS05OQogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICByZXRzdWIKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX2ZhbHNlQDg6CiAgICBpbnRjXzEgLy8gMAogICAgYiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9tZXJnZUA5Cg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="}, "sourceInfo": {"approval": {"pcOffsetMethod": "none", "sourceInfo": [{"pc": [968], "errorMessage": "Defaulted"}, {"pc": [364, 388, 411, 434, 458, 514, 542, 563, 584, 606, 812, 829, 843, 858, 873], "errorMessage": "Invalid account role address"}, {"pc": [498, 802, 1029], "errorMessage": "Invalid role identifier"}, {"pc": [628, 658, 960], "errorMessage": "Not authorized"}, {"pc": [920, 935], "errorMessage": "check BoxMap entry exists"}, {"pc": [675, 958], "errorMessage": "check self.arranger exists"}, {"pc": [966], "errorMessage": "check self.defaulted exists"}, {"pc": [619, 649], "errorMessage": "invalid number of bytes for arc4.bool"}, {"pc": [248, 271, 305, 482, 689, 772], "errorMessage": "invalid number of bytes for arc4.static_array"}, {"pc": [295, 472, 762], "errorMessage": "invalid number of bytes for arc4.uint8"}, {"pc": [316], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.RoleValidity"}]}, "clear": {"pcOffsetMethod": "none", "sourceInfo": []}}, "templateVariables": {}}""" APP_SPEC = algokit_utils.Arc56Contract.from_json(_APP_SPEC_JSON) def _parse_abi_args(args: object | None = None) -> list[object] | None: @@ -119,6 +119,15 @@ class RbacContractSuspensionArgs: def abi_method_signature(self) -> str: return "rbac_contract_suspension(bool)uint64" +@dataclasses.dataclass(frozen=True, kw_only=True) +class RbacContractDefaultArgs: + """Dataclass for rbac_contract_default arguments""" + defaulted: bool + + @property + def abi_method_signature(self) -> str: + return "rbac_contract_default(bool)uint64" + @dataclasses.dataclass(frozen=True, kw_only=True) class RbacGetAddressRolesArgs: """Dataclass for rbac_get_address_roles arguments""" @@ -230,6 +239,19 @@ def rbac_contract_suspension( "args": method_args, })) + def rbac_contract_default( + self, + args: tuple[bool] | RbacContractDefaultArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.AppCallMethodCallParams: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_contract_default(bool)uint64", + "args": method_args, + })) + def rbac_get_arranger( self, params: algokit_utils.CommonAppCallParams | None = None @@ -369,6 +391,19 @@ def rbac_contract_suspension( "args": method_args, })) + def rbac_contract_default( + self, + args: tuple[bool] | RbacContractDefaultArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.BuiltTransactions: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_contract_default(bool)uint64", + "args": method_args, + })) + def rbac_get_arranger( self, params: algokit_utils.CommonAppCallParams | None = None @@ -526,6 +561,22 @@ def rbac_contract_suspension( parsed_response = response return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) + def rbac_contract_default( + self, + args: tuple[bool] | RbacContractDefaultArgs, + params: algokit_utils.CommonAppCallParams | None = None, + send_params: algokit_utils.SendParams | None = None + ) -> algokit_utils.SendAppTransactionResult[int]: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_contract_default(bool)uint64", + "args": method_args, + }), send_params=send_params) + parsed_response = response + return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) + def rbac_get_arranger( self, params: algokit_utils.CommonAppCallParams | None = None, @@ -587,8 +638,8 @@ class GlobalStateValue(typing.TypedDict): """Shape of global_state state key values""" arranger: str op_daemon: str - asset_suspended: int - asset_defaulted: int + contract_suspended: int + defaulted: int class MockRbacModuleState: """Methods to access state for the current MockRbacModule app""" @@ -650,17 +701,17 @@ def op_daemon(self) -> str: return typing.cast(str, value) @property - def asset_suspended(self) -> int: - """Get the current value of the asset_suspended key in global_state state""" - value = self.app_client.state.global_state.get_value("asset_suspended") + def contract_suspended(self) -> int: + """Get the current value of the contract_suspended key in global_state state""" + value = self.app_client.state.global_state.get_value("contract_suspended") if isinstance(value, dict) and "AVMUint64" in self._struct_classes: return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore return typing.cast(int, value) @property - def asset_defaulted(self) -> int: - """Get the current value of the asset_defaulted key in global_state state""" - value = self.app_client.state.global_state.get_value("asset_defaulted") + def defaulted(self) -> int: + """Get the current value of the defaulted key in global_state state""" + value = self.app_client.state.global_state.get_value("defaulted") if isinstance(value, dict) and "AVMUint64" in self._struct_classes: return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore return typing.cast(int, value) @@ -944,6 +995,12 @@ def decode_return_value( return_value: algokit_utils.ABIReturn | None ) -> int | None: ... @typing.overload + def decode_return_value( + self, + method: typing.Literal["rbac_contract_default(bool)uint64"], + return_value: algokit_utils.ABIReturn | None + ) -> int | None: ... + @typing.overload def decode_return_value( self, method: typing.Literal["rbac_get_arranger()address"], @@ -1270,6 +1327,26 @@ def rbac_contract_suspension( compilation_params=compilation_params ) + def rbac_contract_default( + self, + args: tuple[bool] | RbacContractDefaultArgs, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.AppCreateMethodCallParams: + """Creates a new instance using the rbac_contract_default(bool)uint64 ABI method""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.create( + algokit_utils.AppFactoryCreateMethodCallParams( + **{ + **dataclasses.asdict(params), + "method": "rbac_contract_default(bool)uint64", + "args": _parse_abi_args(args), + } + ), + compilation_params=compilation_params + ) + def rbac_get_arranger( self, *, @@ -1571,6 +1648,25 @@ def rbac_contract_suspension( ) return self + def rbac_contract_default( + self, + args: tuple[bool] | RbacContractDefaultArgs, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> "MockRbacModuleComposer": + self._composer.add_app_call_method_call( + self.client.params.rbac_contract_default( + args=args, + params=params, + ) + ) + self._result_mappers.append( + lambda v: self.client.decode_return_value( + "rbac_contract_default(bool)uint64", v + ) + ) + return self + def rbac_get_arranger( self, params: algokit_utils.CommonAppCallParams | None = None, diff --git a/src/artifacts/DASA.arc56.json b/src/artifacts/DASA.arc56.json index adbca205..1e4a30bb 100644 --- a/src/artifacts/DASA.arc56.json +++ b/src/artifacts/DASA.arc56.json @@ -965,29 +965,6 @@ "events": [], "recommendations": {} }, - { - "name": "contract_set_default_status", - "args": [ - { - "type": "bool", - "name": "defaulted", - "desc": "Default status" - } - ], - "returns": { - "type": "uint64" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Set D-ASA default status", - "events": [], - "recommendations": {} - }, { "name": "contract_get_state", "args": [], @@ -1180,6 +1157,29 @@ "events": [], "recommendations": {} }, + { + "name": "rbac_contract_default", + "args": [ + { + "type": "bool", + "name": "defaulted", + "desc": "Default status" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Set D-ASA default status", + "events": [], + "recommendations": {} + }, { "name": "rbac_get_arranger", "args": [], @@ -1282,15 +1282,15 @@ "valueType": "address", "key": "UjpPUEQj" }, - "asset_suspended": { + "contract_suspended": { "keyType": "AVMString", "valueType": "AVMUint64", - "key": "YXNzZXRfc3VzcGVuZGVk" + "key": "Y29udHJhY3Rfc3VzcGVuZGVk" }, - "asset_defaulted": { + "defaulted": { "keyType": "AVMString", "valueType": "AVMUint64", - "key": "YXNzZXRfZGVmYXVsdGVk" + "key": "ZGVmYXVsdGVk" }, "status": { "keyType": "AVMString", @@ -1457,11 +1457,6 @@ "valueType": "AVMUint64", "key": "c2NoZWR1bGVfZW50cnlfY291bnQ=" }, - "defaulted": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "ZGVmYXVsdGVk" - }, "fixed_point_scale": { "keyType": "AVMString", "valueType": "AVMUint64", @@ -1522,819 +1517,819 @@ "sourceInfo": [ { "pc": [ - 2669 + 2652 ], "errorMessage": "ACTUS event not yet executed" }, { "pc": [ - 2427 + 2410 ], "errorMessage": "Can not distribute zero units" }, { "pc": [ - 3170, - 3177, - 3550 + 3153, + 3160, + 3533 ], "errorMessage": "D-ASA already configured" }, { "pc": [ - 1276, - 2008, - 2387, - 2533, - 3767, - 3913, - 4264, - 4526, - 4672 + 1259, + 1991, + 2370, + 2516, + 3750, + 3896, + 4247, + 4478, + 4624 ], "errorMessage": "D-ASA not configured" }, { "pc": [ - 3561 + 3544 ], "errorMessage": "D-ASA terms not configured" }, { "pc": [ - 6861 + 6844 ], "errorMessage": "Defaulted" }, { "pc": [ - 3188 + 3171 ], "errorMessage": "Denomination asset is not properly set" }, { "pc": [ - 3203 + 3186 ], "errorMessage": "Different settlement asset not supported, must be equal to denomination asset" }, { "pc": [ - 3439, - 3446, - 3448 + 3422, + 3429, + 3431 ], "errorMessage": "IED must be set in the future" }, { "pc": [ - 1294, - 2077, - 2548, - 4282, - 6213 + 1277, + 2060, + 2531, + 4265, + 6196 ], "errorMessage": "IED not yet executed" }, { "pc": [ - 2440, - 5596 + 2423, + 5579 ], "errorMessage": "Insufficient remaining D-ASA units" }, { "pc": [ - 2643, - 2709 + 2626, + 2692 ], "errorMessage": "Insufficient sender units to transfer" }, { "pc": [ - 1904, - 3090, - 3108, - 3164, - 3641, - 3677, - 4329, - 5780, - 6058, - 6118, - 6521 + 1887, + 3073, + 3091, + 3147, + 3624, + 3660, + 4312, + 5763, + 6041, + 6101, + 6504 ], "errorMessage": "Invalid ACTUS configuration" }, { "pc": [ - 2017, - 2421, - 2604, - 2619, - 2776, - 2849, - 2912, - 2954, - 5408, - 5533 + 2000, + 2404, + 2587, + 2602, + 2759, + 2832, + 2895, + 2937, + 5391, + 5516 ], "errorMessage": "Invalid account holding address" }, { "pc": [ + 4815, + 4839, 4863, 4887, 4911, - 4935, - 4959, - 5016, - 5044, - 5066, - 5088, - 5110, - 5289, - 5307, - 5322, - 5337, - 5352 + 4968, + 4996, + 5018, + 5040, + 5062, + 5272, + 5290, + 5305, + 5320, + 5335 ], "errorMessage": "Invalid account role address" }, { "pc": [ - 3150 + 3133 ], "errorMessage": "Invalid day-count convention ID" }, { "pc": [ - 1407, - 3788, - 4116, - 6090 + 1390, + 3771, + 4099, + 6073 ], "errorMessage": "Invalid event cursor" }, { "pc": [ - 3626, - 3689, - 3965, - 4306, - 5696 + 3609, + 3672, + 3948, + 4289, + 5679 ], "errorMessage": "Invalid event id" }, { "pc": [ - 3801, - 4180, - 4187, - 4319 + 3784, + 4163, + 4170, + 4302 ], "errorMessage": "Invalid event type" }, { "pc": [ - 5000, - 5279, - 6931 + 4952, + 5262, + 6914 ], "errorMessage": "Invalid role identifier" }, { "pc": [ - 3555, - 3701, - 3709, - 4018, - 4393, - 5711, - 5727 + 3538, + 3684, + 3692, + 4001, + 4376, + 5694, + 5710 ], "errorMessage": "Invalid schedule page" }, { "pc": [ - 5644 + 5627 ], "errorMessage": "No D-ASA units" }, { "pc": [ - 1413, - 1933, - 2114, - 6099 + 1396, + 1916, + 2097, + 6082 ], "errorMessage": "No due cashflow to pay" }, { "pc": [ - 6182 + 6165 ], "errorMessage": "Not IED event" }, { "pc": [ - 2062, - 2395, - 2591, - 2766, - 2822, - 2832, - 2918, - 4215, - 4507, - 5133, - 6853 + 2045, + 2378, + 2574, + 2749, + 2805, + 2815, + 2901, + 4198, + 5085, + 5116, + 6836 ], "errorMessage": "Not authorized" }, { "pc": [ - 1534, - 1542, - 2163, - 2237, - 2246 + 1517, + 1525, + 2146, + 2220, + 2229 ], "errorMessage": "Not enough funds for the payment" }, { "pc": [ - 3938, - 3951, - 4291 + 3921, + 3934, + 4274 ], "errorMessage": "Observed event required to execute this action" }, { "pc": [ - 2409, - 2457 + 2392, + 2440 ], "errorMessage": "Primary distribution is closed" }, { "pc": [ - 6130 + 6113 ], "errorMessage": "Primary distribution is not complete" }, { "pc": [ - 2632 + 2615 ], "errorMessage": "Sender and receiver must be different" }, { "pc": [ - 5394, - 6869 + 5377, + 6852 ], "errorMessage": "Suspended operations" }, { "pc": [ - 2344, - 3667, - 4351 + 2327, + 3650, + 4334 ], "errorMessage": "Time events must be sorted in strictly ascending order" }, { "pc": [ - 2565, - 2582 + 2548, + 2565 ], "errorMessage": "Transfer is closed" }, { "pc": [ - 2636 + 2619 ], "errorMessage": "Transfer units must be greater than zero" }, { "pc": [ - 953 + 936 ], "errorMessage": "Wrong Global Bytes allocation" }, { "pc": [ - 959 + 942 ], "errorMessage": "Wrong Global UInts allocation" }, { "pc": [ - 963 + 946 ], "errorMessage": "Wrong Local Bytes allocation" }, { "pc": [ - 967 + 950 ], "errorMessage": "Wrong Local UInts allocation" }, { "pc": [ - 1515, - 2156 + 1498, + 2139 ], "errorMessage": "account opted into asset" }, { "pc": [ - 6813, - 6828 + 6796, + 6811 ], "errorMessage": "check BoxMap entry exists" }, { "pc": [ - 2053, - 2091, - 2132, - 2170, - 2461, - 2639, - 2698, - 2724, - 5388, - 5554 + 2036, + 2074, + 2115, + 2153, + 2444, + 2622, + 2681, + 2707, + 5371, + 5537 ], "errorMessage": "check self.account entry exists" }, { "pc": [ - 1596, - 1828, - 1916, - 4583, - 6218, - 6541 + 1579, + 1811, + 1899, + 4535, + 6201, + 6524 ], "errorMessage": "check self.accrued_interest exists" }, { "pc": [ - 5151, - 6851 + 5134, + 6834 ], "errorMessage": "check self.arranger exists" }, { "pc": [ - 6859 + 6850 ], - "errorMessage": "check self.asset_defaulted exists" + "errorMessage": "check self.contract_suspended exists" }, { "pc": [ - 6867 + 3081, + 3527, + 3917, + 3929, + 4270, + 4483, + 5925 ], - "errorMessage": "check self.asset_suspended exists" + "errorMessage": "check self.contract_type exists" }, { "pc": [ - 3098, - 3544, - 3934, - 3946, - 4287, - 4531, - 5942 + 1547, + 4540, + 5399, + 5477 ], - "errorMessage": "check self.contract_type exists" + "errorMessage": "check self.cumulative_interest_index exists" }, { "pc": [ - 1564, - 4588, - 5416, - 5494 + 1559, + 4545, + 5410, + 5485 ], - "errorMessage": "check self.cumulative_interest_index exists" + "errorMessage": "check self.cumulative_principal_index exists" }, { "pc": [ - 1576, - 4593, - 5427, - 5502 + 6842 ], - "errorMessage": "check self.cumulative_principal_index exists" + "errorMessage": "check self.defaulted exists" }, { "pc": [ - 5952 + 5935 ], "errorMessage": "check self.dynamic_principal_redemption exists" }, { "pc": [ - 1332, - 1344, - 1405, - 1647, - 2647, - 2659, - 3780, - 4109, - 4559, - 4676, - 4688, - 4725, - 5509, - 6088, - 6170, - 6367, - 6422, - 6560 + 1315, + 1327, + 1388, + 1630, + 2630, + 2642, + 3763, + 4092, + 4511, + 4628, + 4640, + 4677, + 5492, + 6071, + 6153, + 6350, + 6405, + 6543 ], "errorMessage": "check self.event_cursor exists" }, { "pc": [ - 5442, - 5456, - 5649, - 5678, - 6008, - 6016, - 6043, - 6063, - 6253, - 6386, - 6547 + 5425, + 5439, + 5632, + 5661, + 5991, + 5999, + 6026, + 6046, + 6236, + 6369, + 6530 ], "errorMessage": "check self.fixed_point_scale exists" }, { "pc": [ - 6296 + 6279 ], "errorMessage": "check self.has_rate_reset_cap exists" }, { "pc": [ - 6269 + 6252 ], "errorMessage": "check self.has_rate_reset_floor exists" }, { "pc": [ - 3175, - 3560, - 4555, - 6187 + 3158, + 3543, + 4507, + 6170 ], "errorMessage": "check self.initial_exchange_amount exists" }, { "pc": [ - 2445, - 2455 + 2428, + 2438 ], "errorMessage": "check self.initial_exchange_date exists" }, { "pc": [ - 1772, - 4573, - 5984, - 5998 + 1755, + 4525, + 5967, + 5981 ], "errorMessage": "check self.interest_calculation_base exists" }, { "pc": [ - 1844, - 1859 + 1827, + 1842 ], "errorMessage": "check self.next_principal_redemption exists" }, { "pc": [ - 4578, - 5976, - 6003, - 6048 + 4530, + 5959, + 5986, + 6031 ], "errorMessage": "check self.nominal_interest_rate exists" }, { "pc": [ - 2022, - 2035 + 2005, + 2018 ], "errorMessage": "check self.op_daemon exists" }, { "pc": [ - 1669, - 1738, - 1764, - 1818, - 1870, - 1879, - 1901, - 4568, - 6526, - 6607 + 1652, + 1721, + 1747, + 1801, + 1853, + 1862, + 1884, + 4520, + 6509, + 6590 ], "errorMessage": "check self.outstanding_principal exists" }, { "pc": [ - 6304, - 6318 + 6287, + 6301 ], "errorMessage": "check self.rate_reset_cap exists" }, { "pc": [ - 6277, - 6291 + 6260, + 6274 ], "errorMessage": "check self.rate_reset_floor exists" }, { "pc": [ - 6248 + 6231 ], "errorMessage": "check self.rate_reset_multiplier exists" }, { "pc": [ - 6641 + 6624 ], "errorMessage": "check self.rate_reset_next exists" }, { "pc": [ - 6261 + 6244 ], "errorMessage": "check self.rate_reset_spread exists" }, { "pc": [ - 1520, - 2232, - 4598 + 1503, + 2215, + 4550 ], "errorMessage": "check self.reserved_interest exists" }, { "pc": [ - 1525, - 1554, - 2242, - 2257, - 4603 + 1508, + 1537, + 2225, + 2240, + 4555 ], "errorMessage": "check self.reserved_principal exists" }, { "pc": [ - 2432, - 2480, - 4550, - 5591, - 6123 + 2415, + 2463, + 4502, + 5574, + 6106 ], "errorMessage": "check self.reserved_units_total exists" }, { "pc": [ - 1336, - 2651, - 3784, + 1319, + 2634, + 3767, + 3946, 3963, - 3980, - 4100, - 4301, - 4336, - 4355, - 4475, - 4563, - 4680, - 5692, - 6363, - 6430 + 4083, + 4284, + 4319, + 4338, + 4458, + 4515, + 4632, + 5675, + 6346, + 6413 ], "errorMessage": "check self.schedule_entry_count exists" }, { "pc": [ - 4008, - 4383 + 3991, + 4366 ], "errorMessage": "check self.schedule_page entry exists" }, { "pc": [ - 1512, - 2122, - 2150, - 6713 + 1495, + 2105, + 2133, + 6696 ], "errorMessage": "check self.settlement_asset_id exists" }, { "pc": [ - 1275, - 1289, - 2007, - 2072, - 2386, - 2405, - 2532, - 2543, - 2826, - 3168, - 3548, - 3766, - 3912, - 4263, - 4277, - 4524, - 4671, - 5537, - 6114, - 6208 + 1258, + 1272, + 1990, + 2055, + 2369, + 2388, + 2515, + 2526, + 2809, + 3151, + 3531, + 3749, + 3895, + 4246, + 4260, + 4476, + 4623, + 5520, + 6097, + 6191 ], "errorMessage": "check self.status exists" }, { "pc": [ - 2438, - 2491, - 4545, - 5642, - 5673, - 6128 + 2421, + 2474, + 4497, + 5625, + 5656, + 6111 ], "errorMessage": "check self.total_units exists" }, { "pc": [ - 2570, - 2580 + 2553, + 2563 ], "errorMessage": "check self.transfer_closure_date exists" }, { "pc": [ - 2553, - 2561 + 2536, + 2544 ], "errorMessage": "check self.transfer_opening_date exists" }, { "pc": [ - 3603, - 3660 + 3586, + 3643 ], "errorMessage": "index access is out of bounds" }, { "pc": [ - 1991, - 3035, - 3518, - 4013, - 4388 + 1974, + 3018, + 3501, + 3996, + 4371 ], "errorMessage": "invalid array length header" }, { "pc": [ - 2756, - 3506, - 4497, - 5123 + 2739, + 3489, + 5075, + 5106 ], "errorMessage": "invalid number of bytes for arc4.bool" }, { "pc": [ - 1999 + 1982 ], "errorMessage": "invalid number of bytes for arc4.dynamic_array" }, { "pc": [ - 3533 + 3516 ], "errorMessage": "invalid number of bytes for arc4.dynamic_array" }, { "pc": [ - 1985, - 2370, - 2510, - 2518, - 2748, - 2806, - 2814, - 2894, - 2902, - 2945, - 2970, - 4744, - 4768, - 4802, - 4983, - 5165, - 5249 + 1968, + 2353, + 2493, + 2501, + 2731, + 2789, + 2797, + 2877, + 2885, + 2928, + 2953, + 4696, + 4720, + 4754, + 4935, + 5148, + 5232 ], "errorMessage": "invalid number of bytes for arc4.static_array" }, { "pc": [ - 1270, - 2328, - 2337, - 2378, - 2527, - 3496, - 3897 + 1253, + 2311, + 2320, + 2361, + 2510, + 3479, + 3880 ], "errorMessage": "invalid number of bytes for arc4.uint64" }, { "pc": [ - 4792, - 4973, - 5239 + 4744, + 4925, + 5222 ], "errorMessage": "invalid number of bytes for arc4.uint8" }, { "pc": [ - 3007 + 2990 ], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.InitialKernelState" }, { "pc": [ - 2996 + 2979 ], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.NormalizedActusTerms" }, { "pc": [ - 4259 + 4242 ], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.ObservedCashEventRequest" }, { "pc": [ - 3908 + 3891 ], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.ObservedEventRequest" }, { "pc": [ - 3040 + 3023 ], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.Prospectus" }, { "pc": [ - 4813 + 4765 ], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.RoleValidity" }, { "pc": [ - 3024 + 3007 ], "errorMessage": "invalid tail pointer at index 1 of (uint8[32],(len+utf8[]))" }, { "pc": [ - 3019 + 3002 ], "errorMessage": "invalid tuple encoding" }, { "pc": [ - 4080, - 4455 + 4063, + 4438 ], "errorMessage": "max array length exceeded" }, { "pc": [ - 4537, - 6705 + 4489, + 6688 ], "errorMessage": "overflow" } @@ -2347,11 +2342,11 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCAzMiAxNTAwCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUgInN0YXR1cyIgImV2ZW50X2N1cnNvciIgInNjaGVkdWxlX2VudHJ5X2NvdW50IiAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIiAiZml4ZWRfcG9pbnRfc2NhbGUiICJhY2NydWVkX2ludGVyZXN0IiAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIgMHg0MTIzICJub21pbmFsX2ludGVyZXN0X3JhdGUiICJjb250cmFjdF90eXBlIiAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiICJyZXNlcnZlZF9wcmluY2lwYWwiICJ0b3RhbF91bml0cyIgIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iICJyZXNlcnZlZF9pbnRlcmVzdCIgImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIgMHg1MjNhNDE1MjUyMjMgInNldHRsZW1lbnRfYXNzZXRfaWQiICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIgMHg1MjNhNDE1NTU0MjMgMHg1MjNhNTA1OTQ0MjMgMHg1MjNhNGQ0ZTQ3MjMgMHg1MzIzIDB4NTIzYTRkNGY0MzIzIDB4NTIzYTU0NTI1MzIzIDB4NTIzYTRmNTA0NDIzICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiICJ0cmFuc2Zlcl9vcGVuaW5nX2RhdGUiICJ0cmFuc2Zlcl9jbG9zdXJlX2RhdGUiICJyYXRlX3Jlc2V0X2Zsb29yIiAicmF0ZV9yZXNldF9jYXAiICJhc3NldF9zdXNwZW5kZWQiICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIiAicmF0ZV9yZXNldF9zcHJlYWQiICJyYXRlX3Jlc2V0X211bHRpcGxpZXIiICJyYXRlX3Jlc2V0X25leHQiICJoYXNfcmF0ZV9yZXNldF9mbG9vciIgImhhc19yYXRlX3Jlc2V0X2NhcCIgMHgwMCAiYXNzZXRfZGVmYXVsdGVkIiAicHJvc3BlY3R1c19oYXNoIiAicHJvc3BlY3R1c191cmwiICJkZW5vbWluYXRpb25fYXNzZXRfaWQiICJtYXR1cml0eV9kYXRlIiAiZGF5X2NvdW50X2NvbnZlbnRpb24iICJkZWZhdWx0ZWQiIDB4MDY4MTAxIDB4MDAwMAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4LTI5CiAgICAvLyAjIFJCQUMgUm9sZXMKICAgIC8vIHNlbGYuYXJyYW5nZXIgPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX0FSUkFOR0VSKQogICAgYnl0ZWMgMTggLy8gMHg1MjNhNDE1MjUyMjMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMAogICAgLy8gc2VsZi5vcF9kYWVtb24gPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX09QX0RBRU1PTikKICAgIGJ5dGVjIDI3IC8vIDB4NTIzYTRmNTA0NDIzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NDctNDgKICAgIC8vICMgRC1BU0EgR292ZXJuYW5jZQogICAgLy8gc2VsZi5hc3NldF9zdXNwZW5kZWQgPSBGYWxzZQogICAgYnl0ZWMgMzMgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjQ5CiAgICAvLyBzZWxmLmFzc2V0X2RlZmF1bHRlZCA9IEZhbHNlCiAgICBieXRlYyA0MSAvLyAiYXNzZXRfZGVmYXVsdGVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1Ni01NwogICAgLy8gIyBDb250cmFjdAogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKQogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OAogICAgLy8gc2VsZi5jb250cmFjdF90eXBlID0gVUludDY0KCkKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MC02MQogICAgLy8gIyBQcm9zcGVjdHVzIChJbmZvcm1hdGlvbmFsKQogICAgLy8gc2VsZi5wcm9zcGVjdHVzX2hhc2ggPSBCeXRlcygpCiAgICBieXRlYyA0MiAvLyAicHJvc3BlY3R1c19oYXNoIgogICAgcHVzaGJ5dGVzIDB4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjIKICAgIC8vIHNlbGYucHJvc3BlY3R1c191cmwgPSBTdHJpbmcoKQogICAgYnl0ZWMgNDMgLy8gInByb3NwZWN0dXNfdXJsIgogICAgcHVzaGJ5dGVzICIiCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjQtNjUKICAgIC8vICMgRGVub21pbmF0aW9uCiAgICAvLyBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCA9IEFzc2V0KCkKICAgIGJ5dGVjIDQ0IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBBc3NldCgpCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjgtNjkKICAgIC8vICMgVGltZQogICAgLy8gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGUgPSB0eXAuVGltZVN0YW1wKCkKICAgIGJ5dGVjIDI4IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcwCiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSB0eXAuVGltZVN0YW1wKCkKICAgIGJ5dGVjIDQ1IC8vICJtYXR1cml0eV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MQogICAgLy8gc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgPSB0eXAuVGltZVN0YW1wKCkKICAgIGJ5dGVjIDI5IC8vICJ0cmFuc2Zlcl9vcGVuaW5nX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcyCiAgICAvLyBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgMzAgLy8gInRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzQtNzUKICAgIC8vICMgRGF5IENvdW50IENvbnZlbnRpb24KICAgIC8vIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPSBVSW50NjQoKQogICAgYnl0ZWMgNDYgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3Ny03OAogICAgLy8gIyBVbml0cwogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IFVJbnQ2NCgpCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc5CiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID0gVUludDY0KCkKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODEtODIKICAgIC8vICMgUHJpbmNpcGFsCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID0gVUludDY0KCkKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODMKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gVUludDY0KCkKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODUKICAgIC8vIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiA9IEZhbHNlCiAgICBieXRlYyAzNCAvLyAiZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODctODgKICAgIC8vICMgSW50ZXJlc3QKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OQogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ID0gVUludDY0KCkKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkxLTkyCiAgICAvLyAjIEludGVyZXN0IFJhdGVzCiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzCiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkID0gVUludDY0KCkKICAgIGJ5dGVjIDM1IC8vICJyYXRlX3Jlc2V0X3NwcmVhZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9tdWx0aXBsaWVyID0gVUludDY0KCkKICAgIGJ5dGVjIDM2IC8vICJyYXRlX3Jlc2V0X211bHRpcGxpZXIiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfZmxvb3IgPSBVSW50NjQoKQogICAgYnl0ZWMgMzEgLy8gInJhdGVfcmVzZXRfZmxvb3IiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfY2FwID0gVUludDY0KCkKICAgIGJ5dGVjIDMyIC8vICJyYXRlX3Jlc2V0X2NhcCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTcKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9uZXh0ID0gVUludDY0KCkKICAgIGJ5dGVjIDM3IC8vICJyYXRlX3Jlc2V0X25leHQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4CiAgICAvLyBzZWxmLmhhc19yYXRlX3Jlc2V0X2Zsb29yID0gRmFsc2UKICAgIGJ5dGVjIDM4IC8vICJoYXNfcmF0ZV9yZXNldF9mbG9vciIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTkKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwID0gRmFsc2UKICAgIGJ5dGVjIDM5IC8vICJoYXNfcmF0ZV9yZXNldF9jYXAiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMS0xMDIKICAgIC8vICMgUHJpbWFyeSBEaXN0cmlidXRpb24KICAgIC8vIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsID0gVUludDY0KCkKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMwogICAgLy8gc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNS0xMDYKICAgIC8vICMgQ3VtdWxhdGl2ZSBQZXItVW5pdCBGaXhlZC1Qb2ludCBJbmRleGVzCiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggPSBVSW50NjQoKQogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNwogICAgLy8gc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNQogICAgLy8gc2VsZi5ldmVudF9jdXJzb3IgPSBVSW50NjQoKQogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTYKICAgIC8vIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgPSBVSW50NjQoKQogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExOC0xMTkKICAgIC8vICMgUGVyZm9ybWFuY2UKICAgIC8vIHNlbGYuZGVmYXVsdGVkID0gRmFsc2UKICAgIGJ5dGVjIDQ3IC8vICJkZWZhdWx0ZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMS0xMjIKICAgIC8vICMgU2NhbGluZwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjIzCiAgICAvLyBhc3NlcnQgVHhuLmdsb2JhbF9udW1fYnl0ZV9zbGljZSA9PSBjZmcuR0xPQkFMX0JZVEVTLCBlcnIuV1JPTkdfR0xPQkFMX0JZVEVTCiAgICB0eG4gR2xvYmFsTnVtQnl0ZVNsaWNlCiAgICBwdXNoaW50IDEwCiAgICA9PQogICAgYXNzZXJ0IC8vIFdyb25nIEdsb2JhbCBCeXRlcyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6MjQKICAgIC8vIGFzc2VydCBUeG4uZ2xvYmFsX251bV91aW50ID09IGNmZy5HTE9CQUxfVUlOVFMsIGVyci5XUk9OR19HTE9CQUxfVUlOVFMKICAgIHR4biBHbG9iYWxOdW1VaW50CiAgICBwdXNoaW50IDU0CiAgICA9PQogICAgYXNzZXJ0IC8vIFdyb25nIEdsb2JhbCBVSW50cyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6MjUKICAgIC8vIGFzc2VydCBUeG4ubG9jYWxfbnVtX2J5dGVfc2xpY2UgPT0gY2ZnLkxPQ0FMX0JZVEVTLCBlcnIuV1JPTkdfTE9DQUxfQllURVMKICAgIHR4biBMb2NhbE51bUJ5dGVTbGljZQogICAgIQogICAgYXNzZXJ0IC8vIFdyb25nIExvY2FsIEJ5dGVzIGFsbG9jYXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kX2FzYS9jb250cmFjdC5weToyNgogICAgLy8gYXNzZXJ0IFR4bi5sb2NhbF9udW1fdWludCA9PSBjZmcuTE9DQUxfVUlOVFMsIGVyci5XUk9OR19MT0NBTF9VSU5UUwogICAgdHhuIExvY2FsTnVtVWludAogICAgIQogICAgYXNzZXJ0IC8vIFdyb25nIExvY2FsIFVJbnRzIGFsbG9jYXRpb24KCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjgtMTgKICAgIC8vIGNsYXNzIERBU0EoCiAgICAvLyAgICAgUGF5bWVudEFnZW50LAogICAgLy8gICAgIFRyYW5zZmVyQWdlbnQsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyAgICAgYXZtX3ZlcnNpb249MTIsCiAgICAvLyApOgogICAgcHVzaGJ5dGVzIDB4OTE0ZjA0ZWIgLy8gbWV0aG9kICJjb250cmFjdF91cGRhdGUoKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX2NvbnRyYWN0X3VwZGF0ZV9yb3V0ZUA0CgptYWluX3N3aXRjaF9jYXNlX25leHRANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kX2FzYS9jb250cmFjdC5weTo4LTE4CiAgICAvLyBjbGFzcyBEQVNBKAogICAgLy8gICAgIFBheW1lbnRBZ2VudCwKICAgIC8vICAgICBUcmFuc2ZlckFnZW50LAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gICAgIGF2bV92ZXJzaW9uPTEyLAogICAgLy8gKToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJ6IG1haW5fY3JlYXRlX05vT3BAMzMKICAgIHB1c2hieXRlc3MgMHhiNDQ2MThjOCAweGU3ODMyNTI5IDB4OTQzODg3MjMgMHg2Yzg1ZTNlZSAweGJkZDFhOTQ0IDB4N2MwZjE4MTIgMHgxNGZjMTBlZiAweDc0YTcyOTdmIDB4MDlkNGZlMTQgMHg5YTliZmE4NSAweDg1ZWVkMzNkIDB4YWIyYzBmYzQgMHhkOWYyMjVhYyAweDk4ODM1MDVhIDB4ZmI0ZDQ0MjggMHg4ZWE2ZTc0YyAweDAyYWY1NTdhIDB4ODJmNzFiMmQgMHhlZjA0ZjVkMyAweGRmMzQzNTUwIDB4M2RiZTgwYmQgMHgxZTNlNDhlNyAweDAxMGM4Mjk5IDB4NzQwNmFjZDIgMHgxYTcyYTJlZSAvLyBtZXRob2QgImZ1bmRfZHVlX2Nhc2hmbG93cyh1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJjbGFpbV9kdWVfY2FzaGZsb3dzKGFkZHJlc3MsYnl0ZVtdKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYnl0ZVtdKSIsIG1ldGhvZCAidHJhbnNmZXJfc2V0X3NjaGVkdWxlKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbihhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInRyYW5zZmVyKGFkZHJlc3MsYWRkcmVzcyx1aW50NjQpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X3N1c3BlbnNpb24oYWRkcmVzcyxib29sKXVpbnQ2NCIsIG1ldGhvZCAiYWNjb3VudF9vcGVuKGFkZHJlc3MsYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgImFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzcyhhZGRyZXNzLGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X2dldF9wb3NpdGlvbihhZGRyZXNzKShhZGRyZXNzLHVpbnQ2NCx1aW50NjQsYm9vbCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAiY29udHJhY3RfY29uZmlnKCh1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxib29sLGJvb2wsYm9vbCx1aW50NjQpLCh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCksKGJ5dGVbMzJdLHN0cmluZykpdWludDY0IiwgbWV0aG9kICJjb250cmFjdF9zY2hlZHVsZSh1aW50NjQsYm9vbCwodWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NClbXSl1aW50NjQiLCBtZXRob2QgImNvbnRyYWN0X2V4ZWN1dGVfaWVkKCl1aW50NjQiLCBtZXRob2QgImFwcGx5X25vbl9jYXNoX2V2ZW50KHVpbnQ2NCwodWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIsIG1ldGhvZCAiYXBwZW5kX29ic2VydmVkX2Nhc2hfZXZlbnQoKHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIsIG1ldGhvZCAiY29udHJhY3Rfc2V0X2RlZmF1bHRfc3RhdHVzKGJvb2wpdWludDY0IiwgbWV0aG9kICJjb250cmFjdF9nZXRfc3RhdGUoKSh1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAiY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50KCkodWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgInJiYWNfcm90YXRlX2FycmFuZ2VyKGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX3NldF9vcF9kYWVtb24oYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgInJiYWNfYXNzaWduX3JvbGUodWludDgsYWRkcmVzcywodWludDY0LHVpbnQ2NCkpdWludDY0IiwgbWV0aG9kICJyYmFjX3Jldm9rZV9yb2xlKHVpbnQ4LGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX2NvbnRyYWN0X3N1c3BlbnNpb24oYm9vbCl1aW50NjQiLCBtZXRob2QgInJiYWNfZ2V0X2FycmFuZ2VyKClhZGRyZXNzIiwgbWV0aG9kICJyYmFjX2dldF9hZGRyZXNzX3JvbGVzKGFkZHJlc3MpKGJvb2wsYm9vbCxib29sLGJvb2wsYm9vbCkiLCBtZXRob2QgInJiYWNfZ2V0X3JvbGVfdmFsaWRpdHkodWludDgsYWRkcmVzcykodWludDY0LHVpbnQ2NCkiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBmdW5kX2R1ZV9jYXNoZmxvd3MgY2xhaW1fZHVlX2Nhc2hmbG93cyB0cmFuc2Zlcl9zZXRfc2NoZWR1bGUgcHJpbWFyeV9kaXN0cmlidXRpb24gdHJhbnNmZXIgYWNjb3VudF9zdXNwZW5zaW9uIGFjY291bnRfb3BlbiBhY2NvdW50X3VwZGF0ZV9wYXltZW50X2FkZHJlc3MgYWNjb3VudF9nZXRfcG9zaXRpb24gY29udHJhY3RfY29uZmlnIGNvbnRyYWN0X3NjaGVkdWxlIGNvbnRyYWN0X2V4ZWN1dGVfaWVkIGFwcGx5X25vbl9jYXNoX2V2ZW50IGFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50IGNvbnRyYWN0X3NldF9kZWZhdWx0X3N0YXR1cyBjb250cmFjdF9nZXRfc3RhdGUgY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50IHJiYWNfcm90YXRlX2FycmFuZ2VyIHJiYWNfc2V0X29wX2RhZW1vbiByYmFjX2Fzc2lnbl9yb2xlIHJiYWNfcmV2b2tlX3JvbGUgcmJhY19jb250cmFjdF9zdXNwZW5zaW9uIHJiYWNfZ2V0X2FycmFuZ2VyIHJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXMgcmJhY19nZXRfcm9sZV92YWxpZGl0eQogICAgZXJyCgptYWluX2NyZWF0ZV9Ob09wQDMzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjgtMTgKICAgIC8vIGNsYXNzIERBU0EoCiAgICAvLyAgICAgUGF5bWVudEFnZW50LAogICAgLy8gICAgIFRyYW5zZmVyQWdlbnQsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyAgICAgYXZtX3ZlcnNpb249MTIsCiAgICAvLyApOgogICAgcHVzaGJ5dGVzIDB4OTU2ZDcxNTYgLy8gbWV0aG9kICJjb250cmFjdF9jcmVhdGUoYWRkcmVzcyl1aW50NjQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBjb250cmFjdF9jcmVhdGUKICAgIGVycgoKbWFpbl9jb250cmFjdF91cGRhdGVfcm91dGVANDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgNCAvLyBVcGRhdGVBcHBsaWNhdGlvbgogICAgPT0KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0CiAgICBiIGNvbnRyYWN0X3VwZGF0ZQoKCi8vIF9wdXlhX2xpYi51dGlsLmVuc3VyZV9idWRnZXQocmVxdWlyZWRfYnVkZ2V0OiB1aW50NjQsIGZlZV9zb3VyY2U6IHVpbnQ2NCkgLT4gdm9pZDoKZW5zdXJlX2J1ZGdldDoKICAgIHByb3RvIDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDEwCiAgICArCgplbnN1cmVfYnVkZ2V0X3doaWxlX3RvcEAxOgogICAgZnJhbWVfZGlnIDAKICAgIGdsb2JhbCBPcGNvZGVCdWRnZXQKICAgID4KICAgIGJ6IGVuc3VyZV9idWRnZXRfYWZ0ZXJfd2hpbGVANgogICAgaXR4bl9iZWdpbgogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGJ5dGVjIDQ4IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbQogICAgYnl0ZWMgNDggLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KICAgIGZyYW1lX2RpZyAtMQogICAgc3dpdGNoIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMEAzIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMUA0CgplbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX25leHRANToKICAgIGl0eG5fc3VibWl0CiAgICBiIGVuc3VyZV9idWRnZXRfd2hpbGVfdG9wQDEKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMUA0OgogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgaXR4bl9maWVsZCBGZWUKICAgIGIgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV9uZXh0QDUKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMEAzOgogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBiIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfbmV4dEA1CgplbnN1cmVfYnVkZ2V0X2FmdGVyX3doaWxlQDY6CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnBheW1lbnRfYWdlbnQuUGF5bWVudEFnZW50LmZ1bmRfZHVlX2Nhc2hmbG93c1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmZ1bmRfZHVlX2Nhc2hmbG93czoKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gMTMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDYKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjY4CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2OQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3MAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzOAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTAKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzIKICAgIC8vIGlmIHNlbGYuX2lzX2R5bmFtaWNfYW5udWl0eSgpOgogICAgY2FsbHN1YiBfaXNfZHluYW1pY19hbm51aXR5CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzYtNzcKICAgIC8vICsgbWF4X2V2ZW50X2NvdW50CiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfRlVORF9EVUVfQ0FTSEZMT1dTX1BFUl9FVkVOVF9CVURHRVQpCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3NwogICAgLy8gKiBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19QRVJfRVZFTlRfQlVER0VUKQogICAgcHVzaGludCAxMDAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3Ni03NwogICAgLy8gKyBtYXhfZXZlbnRfY291bnQKICAgIC8vICogVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfUEVSX0VWRU5UX0JVREdFVCkKICAgICoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3NQogICAgLy8gVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfQkFTRV9CVURHRVQpCiAgICBpbnRjIDQgLy8gMTUwMAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojc1LTc3CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19CQVNFX0JVREdFVCkKICAgIC8vICsgbWF4X2V2ZW50X2NvdW50CiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfRlVORF9EVUVfQ0FTSEZMT1dTX1BFUl9FVkVOVF9CVURHRVQpCiAgICArCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzMtNzkKICAgIC8vIGVuc3VyZV9idWRnZXQoCiAgICAvLyAgICAgcmVxdWlyZWRfYnVkZ2V0PSgKICAgIC8vICAgICAgICAgVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfQkFTRV9CVURHRVQpCiAgICAvLyAgICAgICAgICsgbWF4X2V2ZW50X2NvdW50CiAgICAvLyAgICAgICAgICogVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfUEVSX0VWRU5UX0JVREdFVCkKICAgIC8vICAgICApLAogICAgLy8gKQogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4MQogICAgLy8gcHJvY2Vzc2VkX2V2ZW50cyA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjgyCiAgICAvLyBmdW5kZWRfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDE0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODMKICAgIC8vIGZ1bmRlZF9wcmluY2lwYWwgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDEzCgpmdW5kX2R1ZV9jYXNoZmxvd3Nfd2hpbGVfdG9wQDQ6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODYKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgPCBtYXhfZXZlbnRfY291bnQKICAgIGRpZyA0CiAgICBkaWcgMQogICAgPAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojg2LTg3CiAgICAvLyBwcm9jZXNzZWRfZXZlbnRzIDwgbWF4X2V2ZW50X2NvdW50CiAgICAvLyBhbmQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAMTEKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4NwogICAgLy8gYW5kIHNlbGYuZXZlbnRfY3Vyc29yIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICA8CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODYtODcKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgPCBtYXhfZXZlbnRfY291bnQKICAgIC8vIGFuZCBzZWxmLmV2ZW50X2N1cnNvciA8IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQKICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl93aGlsZUAxMQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojg5CiAgICAvLyBlbnRyeSA9IHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLmV2ZW50X2N1cnNvcikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICBkdXAKICAgIGJ1cnkgMTcKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5MAogICAgLy8gaWYgZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcDoKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSAzCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDExCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6OTIKICAgIC8vIGlmIG5vdCBzZWxmLl9ldmVudF9pc19jYXNoKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkpOgogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBidXJ5IDE2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNTQKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgaW50Y18yIC8vIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM1My0zNTcKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX01EKSwKICAgIC8vICkKICAgID09CiAgICBkdXAKICAgIGJ1cnkgNAogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX3RydWVANTIKICAgIGRpZyAxNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzU1CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzUzLTM1NwogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfTUQpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDUyCiAgICBkaWcgMTQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM1NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9NRCksCiAgICBwdXNoaW50IDE5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNTMtMzU3CiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9NRCksCiAgICAvLyApCiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VANTMKCmZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX3RydWVANTI6CiAgICBpbnRjXzEgLy8gMQoKZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfbWVyZ2VANTQ6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6OTIKICAgIC8vIGlmIG5vdCBzZWxmLl9ldmVudF9pc19jYXNoKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkpOgogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTEKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF9pZCA9PSBzZWxmLmV2ZW50X2N1cnNvciwgZXJyLklOVkFMSURfRVZFTlRfQ1VSU09SCiAgICBkaWcgMTUKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgY3Vyc29yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTIKICAgIC8vIGFzc2VydCBlbnRyeS5zY2hlZHVsZWRfdGltZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwgZXJyLk5PX0RVRV9DQVNIRkxPVwogICAgZGlnIDEKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIDw9CiAgICBhc3NlcnQgLy8gTm8gZHVlIGNhc2hmbG93IHRvIHBheQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDE2CiAgICAvLyBpZiBldmVudF90eXBlIG5vdCBpbiAoVUludDY0KGVudW1zLkVWVF9JUCksIFVJbnQ2NChlbnVtcy5FVlRfTUQpKToKICAgIGRpZyAyCiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTUKICAgIGRpZyAxNAogICAgcHVzaGludCAxOQogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDE3CiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAxMQoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X2ludGVyZXN0X2Ftb3VudEAxNjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQyOQogICAgLy8gZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGRpZyAxNQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSAxNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDMwCiAgICAvLyBpZiBldmVudF90eXBlIG5vdCBpbiAoVUludDY0KGVudW1zLkVWVF9QUiksIFVJbnQ2NChlbnVtcy5FVlRfTUQpKToKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxOQogICAgZGlnIDE0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzEKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDYKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTU2CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA9IGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBkaWcgMTUKICAgIHB1c2hpbnQgNDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBidXJ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1OQogICAgLy8gaWYgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCk6CiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUAyOQogICAgZGlnIDcKICAgIGJ1cnkgOQoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzUtNTc3CiAgICAvLyAjIEZ1bmRpbmcgdXNlcyBwZXItdW5pdCBjdW11bGF0aXZlIGluZGljZXMgc28gZWFjaCBob2xkZXIgY2FuIHNldHRsZQogICAgLy8gIyBpbmRlcGVuZGVudGx5IGZyb20gaXRzIGN1cnJlbnQgdW5pdCBiYWxhbmNlLgogICAgLy8gaW50ZXJlc3RfaW5kZXhfZGVsdGEgPSBzZWxmLl9hbW91bnRfdG9faW5kZXhfZGVsdGEoaW50ZXJlc3RfYW1vdW50X2R1ZSkKICAgIGRpZyAxMAogICAgY2FsbHN1YiBfYW1vdW50X3RvX2luZGV4X2RlbHRhCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzgKICAgIC8vIHByaW5jaXBhbF9pbmRleF9kZWx0YSA9IHNlbGYuX2Ftb3VudF90b19pbmRleF9kZWx0YShwcmluY2lwYWxfYW1vdW50X2R1ZSkKICAgIGRpZyA2CiAgICBjYWxsc3ViIF9hbW91bnRfdG9faW5kZXhfZGVsdGEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU3OQogICAgLy8gaW50ZXJlc3RfYW1vdW50ID0gc2VsZi5faW5kZXhfZGVsdGFfdG9fYW1vdW50KGludGVyZXN0X2luZGV4X2RlbHRhKQogICAgZGlnIDEKICAgIGNhbGxzdWIgX2luZGV4X2RlbHRhX3RvX2Ftb3VudAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBidXJ5IDE1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1ODAKICAgIC8vIHByaW5jaXBhbF9hbW91bnQgPSBzZWxmLl9pbmRleF9kZWx0YV90b19hbW91bnQocHJpbmNpcGFsX2luZGV4X2RlbHRhKQogICAgZHVwCiAgICBjYWxsc3ViIF9pbmRleF9kZWx0YV90b19hbW91bnQKICAgIGR1cAogICAgYnVyeSAxMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTgxCiAgICAvLyByZXF1aXJlZF9hbW91bnQgPSBpbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50CiAgICBkaWcgMgogICAgZGlnIDEKICAgICsKICAgIGR1cAogICAgYnVyeSA5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MzcKICAgIC8vIGJhbGFuY2UgPSBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBvcHRlZCBpbnRvIGFzc2V0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NTkKICAgIC8vIHJldHVybiBzZWxmLnJlc2VydmVkX2ludGVyZXN0ICsgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICBkaWcgMQogICAgKwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzM5CiAgICAvLyBhc3NlcnQgYmFsYW5jZSA+PSByZXNlcnZlZF90b3RhbCwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGRpZyAyCiAgICBkaWcgMQogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzQwCiAgICAvLyByZXR1cm4gYmFsYW5jZSAtIHJlc2VydmVkX3RvdGFsCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIC0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4MwogICAgLy8gc2VsZi5fYXZhaWxhYmxlX3NldHRsZW1lbnRfZnVuZHMoKSA+PSByZXF1aXJlZF9hbW91bnQKICAgIHVuY292ZXIgMgogICAgPj0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4Mi01ODQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5fYXZhaWxhYmxlX3NldHRsZW1lbnRfZnVuZHMoKSA+PSByZXF1aXJlZF9hbW91bnQKICAgIC8vICksIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcyBmb3IgdGhlIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4NgogICAgLy8gc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCArPSBpbnRlcmVzdF9hbW91bnQKICAgIHVuY292ZXIgMwogICAgKwogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4NwogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgKz0gcHJpbmNpcGFsX2Ftb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIGV4aXN0cwogICAgKwogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1ODgKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCArPSBpbnRlcmVzdF9pbmRleF9kZWx0YQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggZXhpc3RzCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4OQogICAgLy8gc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCArPSBwcmluY2lwYWxfaW5kZXhfZGVsdGEKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggZXhpc3RzCiAgICArCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTkwCiAgICAvLyBpZiBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpOgogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgcHVzaGludCAzCiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUA0MAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTkxLTU5MgogICAgLy8gIyBGb3IgUFIsIHRoZSBwZXJpb2QgaW50ZXJlc3Qgc3RheXMgYWNjcnVlZCB1bnRpbCBhIGxhdGVyIElQIG9yIE1ELgogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ICs9IHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZGlnIDE2CiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBidXJ5IDE4CiAgICArCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQxOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTk1CiAgICAvLyBpZiBub3Qgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCkgb3IgZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSA9PSBVSW50NjQoCiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDQzCiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTUtNTk3CiAgICAvLyBpZiBub3Qgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCkgb3IgZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSA9PSBVSW50NjQoCiAgICAvLyAgICAgZW51bXMuRVZUX01ECiAgICAvLyApOgogICAgcHVzaGludCAxOQogICAgPT0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQ0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUA0MzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5OAogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gZW50cnkubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZGlnIDE1CiAgICBwdXNoaW50IDQxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTkKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGRpZyA4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAwCiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBuZXh0X2ludGVyZXN0X2Jhc2UKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBkaWcgOQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwMQogICAgLy8gc2VsZi5ldmVudF9jdXJzb3IgKz0gVUludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAzCiAgICAvLyBpZiBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoCiAgICBkaWcgMTUKICAgIGV4dHJhY3QgOCAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MDMtNjA1CiAgICAvLyBpZiBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoCiAgICAvLyAgICAgZW51bXMuRVZUX01ECiAgICAvLyApIGFuZCBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9PSBVSW50NjQoMCk6CiAgICBwdXNoYnl0ZXMgMHgxMwogICAgYj09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0NwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjA1CiAgICAvLyApIGFuZCBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9PSBVSW50NjQoMCk6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwMy02MDUKICAgIC8vIGlmIGVudHJ5LmV2ZW50X3R5cGUgPT0gYXJjNC5VSW50OCgKICAgIC8vICAgICBlbnVtcy5FVlRfTUQKICAgIC8vICkgYW5kIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID09IFVJbnQ2NCgwKToKICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0NwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjA2CiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbnVtcy5TVEFUVVNfRU5ERUQpCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBwdXNoaW50IDIwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwNwogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gVUludDY0KDApCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0NzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwOS02MTMKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1pbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50LAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PWludGVyZXN0X2Ftb3VudCArIHByaW5jaXBhbF9hbW91bnQsCiAgICAvLyApCiAgICBkaWcgMTUKICAgIGRpZyA0CiAgICBkdXAKICAgIGNhbGxzdWIgX2VtaXRfZXhlY3V0aW9uX2V2ZW50CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5NgogICAgLy8gZnVuZGVkX2ludGVyZXN0ICs9IGludGVyZXN0X2Ftb3VudAogICAgZGlnIDEzCiAgICBkaWcgMTIKICAgICsKICAgIGJ1cnkgMTQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5NwogICAgLy8gZnVuZGVkX3ByaW5jaXBhbCArPSBwcmluY2lwYWxfYW1vdW50CiAgICBkaWcgMTIKICAgIGRpZyA3CiAgICArCiAgICBidXJ5IDEzCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6OTgKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgKz0gVUludDY0KDEpCiAgICBkaWcgNAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgNQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3Nfd2hpbGVfdG9wQDQKCmZ1bmRfZHVlX2Nhc2hmbG93c19lbHNlX2JvZHlANDA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTQKICAgIC8vIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0MQoKZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlAMjk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjAKICAgIC8vIGV2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ1cnkgMTYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU2MS01NjMKICAgIC8vICMgRHluYW1pYyBhbm51aXRpZXMgZGVyaXZlIG5leHQgc3RhdGUgZnJvbSB0aGUgcGF5bWVudCBkZWNvbXBvc2l0aW9uLAogICAgLy8gIyBub3Qgb25seSBmcm9tIHRoZSBwcmVjb21wdXRlZCBgbmV4dF8qYCBmaWVsZHMuCiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpOgogICAgcHVzaGludCAzCiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUAzMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY1CiAgICAvLyBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCAtIHByaW5jaXBhbF9hbW91bnRfZHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGRpZyA2CiAgICAtCiAgICBkdXAKICAgIGJ1cnkgOQogICAgYnVyeSA5CiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDMxOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY4CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9JUCk6CiAgICBkaWcgMTQKICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUAzMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY5CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGJ1cnkgOQogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTcwCiAgICAvLyBuZXh0X2ludGVyZXN0X2Jhc2UgPSBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGJ1cnkgMTAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgZXhpc3RzCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDMzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTcxCiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCk6CiAgICBkaWcgMTQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlAMzQKICAgIGRpZyA3CiAgICBidXJ5IDkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzgKCmZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDM0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTcyCiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTczCiAgICAvLyBuZXh0X2ludGVyZXN0X2Jhc2UgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzgKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDMyCiAgICAvLyBpZiBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKToKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzMwogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKToKICAgIGRpZyAxNAogICAgcHVzaGludCAxOQogICAgPT0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDIyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzQKICAgIC8vIHJldHVybiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1NQogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzUKICAgIC8vIGludGVyZXN0X2R1ZSA9IHNlbGYuYWNjcnVlZF9pbnRlcmVzdCArIHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZGlnIDE2CiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBidXJ5IDE4CiAgICArCiAgICBkdXAKICAgIGJ1cnkgMTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzNgogICAgLy8gaWYgc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIDw9IGludGVyZXN0X2R1ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIGV4aXN0cwogICAgPj0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDI0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzcKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1NQogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzgKICAgIC8vIHByaW5jaXBhbF9hbW91bnQgPSBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gLSBpbnRlcmVzdF9kdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIGV4aXN0cwogICAgZGlnIDEwCiAgICAtCiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDM5CiAgICAvLyBpZiBwcmluY2lwYWxfYW1vdW50ID4gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWw6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgID4KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDI2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NDAKICAgIC8vIHJldHVybiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1NQogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjY6CiAgICBkaWcgNgogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTUKICAgIC8vIHByaW5jaXBhbF9hbW91bnRfZHVlID0gc2VsZi5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudChlbnRyeSkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnRAMjgKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDI3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDQzCiAgICAvLyBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA8PSBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZGlnIDE1CiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBkdXAyCiAgICA8PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDQyLTQ0NAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA8PSBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NDUKICAgIC8vIHJldHVybiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCAtIGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBzd2FwCiAgICAtCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1NQogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MTgKICAgIC8vIHJldHVybiBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgKyBzZWxmLl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KGVudHJ5KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgIGRpZyAxNgogICAgY2FsbHN1YiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudAogICAgYnVyeSAxOAogICAgKwogICAgYnVyeSAxMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTU0CiAgICAvLyBpbnRlcmVzdF9hbW91bnRfZHVlID0gc2VsZi5fZW50cnlfaW50ZXJlc3RfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfaW50ZXJlc3RfYW1vdW50QDE2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAMTE6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTAwCiAgICAvLyBhc3NlcnQgcHJvY2Vzc2VkX2V2ZW50cyA+IFVJbnQ2NCgwKSwgZXJyLk5PX0RVRV9DQVNIRkxPVwogICAgZGlnIDQKICAgIGR1cAogICAgYXNzZXJ0IC8vIE5vIGR1ZSBjYXNoZmxvdyB0byBwYXkKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMDQKICAgIC8vIHRvdGFsX2Z1bmRlZD1mdW5kZWRfaW50ZXJlc3QgKyBmdW5kZWRfcHJpbmNpcGFsLAogICAgZGlnIDE0CiAgICBkdXAKICAgIGRpZyAxNQogICAgZHVwCiAgICBjb3ZlciAzCiAgICArCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA2CiAgICAvLyB0aW1lc3RhbXA9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTAxLTEwNwogICAgLy8gcmV0dXJuIHR5cC5DYXNoRnVuZGluZ1Jlc3VsdCgKICAgIC8vICAgICBmdW5kZWRfaW50ZXJlc3Q9ZnVuZGVkX2ludGVyZXN0LAogICAgLy8gICAgIGZ1bmRlZF9wcmluY2lwYWw9ZnVuZGVkX3ByaW5jaXBhbCwKICAgIC8vICAgICB0b3RhbF9mdW5kZWQ9ZnVuZGVkX2ludGVyZXN0ICsgZnVuZGVkX3ByaW5jaXBhbCwKICAgIC8vICAgICBwcm9jZXNzZWRfZXZlbnRzPXByb2Nlc3NlZF9ldmVudHMsCiAgICAvLyAgICAgdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUA1MzoKICAgIGludGNfMCAvLyAwCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDU0CgoKLy8gbW9kdWxlcy5wYXltZW50X2FnZW50LlBheW1lbnRBZ2VudC5jbGFpbV9kdWVfY2FzaGZsb3dzW3JvdXRpbmddKCkgLT4gdm9pZDoKY2xhaW1fZHVlX2Nhc2hmbG93czoKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cG4gMgogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDYKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNQogICAgLy8gaWYgc2VsZi5vcF9kYWVtb24udmFsdWUgIT0gR2xvYmFsLnplcm9fYWRkcmVzczoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNyAvLyAweDUyM2E0ZjUwNDQyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wX2RhZW1vbiBleGlzdHMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE3CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjcgLy8gMHg1MjNhNGY1MDQ0MjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcF9kYWVtb24gZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE3LTE5CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIGJueiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfdHJ1ZUAxNAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE4CiAgICAvLyBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgdHhuIFNlbmRlcgogICAgZGlnIDMKICAgID09CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTctMTkKICAgIC8vIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICAvLyBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgYm56IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDE0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTkKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCAzMgogICAgPT0KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNy0xOQogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICBieiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VAMTUKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDE0OgogICAgaW50Y18xIC8vIDEKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUAxNjoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNi0yMAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyAgICAgb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vICAgICBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgLy8gKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCgpjbGFpbV9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTc6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTM5CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE0MAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzOAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTAKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTQzCiAgICAvLyBzZWxmLl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKGhvbGRpbmdfYWRkcmVzcykKICAgIGRpZyAyCiAgICBkdXAKICAgIGNhbGxzdWIgX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNDQKICAgIC8vIHNlbGYuX3NldHRsZV9wb3NpdGlvbihob2xkaW5nX2FkZHJlc3MpCiAgICBjYWxsc3ViIF9zZXR0bGVfcG9zaXRpb24KICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExNwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY2xhaW1hYmxlX2ludGVyZXN0CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBkdXAKICAgIHB1c2hpbnQgNzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExOAogICAgLy8gKyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jbGFpbWFibGVfcHJpbmNpcGFsCiAgICBkdXAKICAgIHB1c2hpbnQgODEKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExNy0xMTgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNsYWltYWJsZV9pbnRlcmVzdAogICAgLy8gKyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jbGFpbWFibGVfcHJpbmNpcGFsCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTQ2CiAgICAvLyBhc3NlcnQgdG90YWxfYW1vdW50ID4gVUludDY0KDApLCBlcnIuTk9fRFVFX0NBU0hGTE9XCiAgICBhc3NlcnQgLy8gTm8gZHVlIGNhc2hmbG93IHRvIHBheQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI1CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MuaXNfb3B0ZWRfaW4oCiAgICBleHRyYWN0IDAgMzIKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNgogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNS0yNwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLmlzX29wdGVkX2luKAogICAgLy8gICAgIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZAogICAgLy8gKQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNS0yOAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLmlzX29wdGVkX2luKAogICAgLy8gICAgIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZAogICAgLy8gKQogICAgLy8gYW5kIG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQKICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAyNAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI4CiAgICAvLyBhbmQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCAzODQKICAgIGdldGJpdAogICAgYm56IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAyNAogICAgaW50Y18xIC8vIDEKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUAyNToKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNTEKICAgIC8vIGlmIHNlbGYuX2lzX3BheW1lbnRfZXhlY3V0YWJsZShob2xkaW5nX2FkZHJlc3MpOgogICAgYnogY2xhaW1fZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozNAogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIHN3YXAKICAgIGRpZyAxCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozNC0zNQogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIC8vID49IHBheW1lbnRfYW1vdW50CiAgICBkaWcgNQogICAgZHVwCiAgICBjb3ZlciAyCiAgICA+PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjMzLTM2CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICAvLyAgICAgPj0gcGF5bWVudF9hbW91bnQKICAgIC8vICksIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcyBmb3IgdGhlIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNTMKICAgIC8vIHNlbGYuX3BheShzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MsIHRvdGFsX2Ftb3VudCkKICAgIGRpZyAyCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBkdXAKICAgIGV4dHJhY3QgMCAzMgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQwLTQ1CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9cmVjZWl2ZXIsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWFtb3VudCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQ0CiAgICAvLyBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgdW5jb3ZlciAzCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIHVuY292ZXIgMgogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0MAogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgcHVzaGludCA0IC8vIGF4ZmVyCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQwLTQ1CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9cmVjZWl2ZXIsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWFtb3VudCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMjUtMTI2CiAgICAvLyAjIEdldCB0aGUgY2xhaW1hYmxlIGFtb3VudHMgYmVmb3JlIHJlc2V0CiAgICAvLyBpbnRlcmVzdF9hbW91bnQgPSBwb3NpdGlvbi5jbGFpbWFibGVfaW50ZXJlc3QKICAgIGR1cAogICAgcHVzaGludCA3MwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSA5CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTI3CiAgICAvLyBwcmluY2lwYWxfYW1vdW50ID0gcG9zaXRpb24uY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgZHVwCiAgICBwdXNoaW50IDgxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAzCiAgICBidXJ5IDkKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMjktMTMwCiAgICAvLyAjIFJlc2V0IHRoZSBwb3NpdGlvbidzIGNsYWltYWJsZSBhbW91bnRzCiAgICAvLyBwb3NpdGlvbi5jbGFpbWFibGVfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBpdG9iCiAgICBzd2FwCiAgICBkaWcgMQogICAgcmVwbGFjZTIgNzMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzEKICAgIC8vIHBvc2l0aW9uLmNsYWltYWJsZV9wcmluY2lwYWwgPSBVSW50NjQoMCkKICAgIHN3YXAKICAgIHJlcGxhY2UyIDgxCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTMyCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHBvc2l0aW9uLmNvcHkoKQogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTM0CiAgICAvLyBhc3NlcnQgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCA+PSBpbnRlcmVzdF9hbW91bnQsIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX2ludGVyZXN0IGV4aXN0cwogICAgZHVwCiAgICBkaWcgMgogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzNQogICAgLy8gYXNzZXJ0IHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsID49IHByaW5jaXBhbF9hbW91bnQsIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICBkaWcgMwogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzNy0xMzgKICAgIC8vICMgVXBkYXRlIHRoZSBnbG9iYWwgcmVzZXJ2ZWQgaW50ZXJlc3QgYW5kIHByaW5jaXBhbCBhbW91bnRzCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0IC09IGludGVyZXN0X2Ftb3VudAogICAgc3dhcAogICAgLQogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzkKICAgIC8vIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIC09IHByaW5jaXBhbF9hbW91bnQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIHN3YXAKICAgIC0KICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKY2xhaW1fZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTU5CiAgICAvLyB0b3RhbF9hbW91bnQ9aW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudCwKICAgIGRpZyA1CiAgICBkdXAKICAgIGRpZyA2CiAgICBkdXAKICAgIGNvdmVyIDMKICAgICsKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNjAKICAgIC8vIHRpbWVzdGFtcD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNTYtMTYyCiAgICAvLyByZXR1cm4gdHlwLkNhc2hDbGFpbVJlc3VsdCgKICAgIC8vICAgICBpbnRlcmVzdF9hbW91bnQ9aW50ZXJlc3RfYW1vdW50LAogICAgLy8gICAgIHByaW5jaXBhbF9hbW91bnQ9cHJpbmNpcGFsX2Ftb3VudCwKICAgIC8vICAgICB0b3RhbF9hbW91bnQ9aW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudCwKICAgIC8vICAgICB0aW1lc3RhbXA9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgY29udGV4dD1wYXltZW50X2luZm8sCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgMgogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIHB1c2hieXRlcyAweDAwMjIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAyNDoKICAgIGludGNfMCAvLyAwCiAgICBiIGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUAyNQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX2ZhbHNlQDE1OgogICAgaW50Y18wIC8vIDAKICAgIGIgY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDE2CgoKLy8gbW9kdWxlcy50cmFuc2Zlcl9hZ2VudC5UcmFuc2ZlckFnZW50LnRyYW5zZmVyX3NldF9zY2hlZHVsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRyYW5zZmVyX3NldF9zY2hlZHVsZToKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo0MAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQxCiAgICAvLyBhc3NlcnQgb3Blbl9kYXRlIDwgY2xvc3VyZV9kYXRlLCBlcnIuSU5WQUxJRF9TT1JUSU5HCiAgICBkdXAyCiAgICA8CiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbXVzdCBiZSBzb3J0ZWQgaW4gc3RyaWN0bHkgYXNjZW5kaW5nIG9yZGVyCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQzCiAgICAvLyBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA9IG9wZW5fZGF0ZQogICAgYnl0ZWMgMjkgLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIHVuY292ZXIgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDQKICAgIC8vIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlID0gY2xvc3VyZV9kYXRlCiAgICBieXRlYyAzMCAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDUKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy50cmFuc2Zlcl9hZ2VudC5UcmFuc2ZlckFnZW50LnByaW1hcnlfZGlzdHJpYnV0aW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcHJpbWFyeV9kaXN0cmlidXRpb246CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDYKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjcxCiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5wcmltYXJ5X2RlYWxlciwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDIyIC8vIDB4NTIzYTUwNTk0NDIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojc2CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo3NwogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzOAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojc4CiAgICAvLyBhc3NlcnQgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TRUQKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBjbG9zZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgY292ZXIgMwogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4MAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChob2xkaW5nX2FkZHJlc3MpCiAgICBzd2FwCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjgxCiAgICAvLyBhc3NlcnQgdW5pdHMgPiBVSW50NjQoMCksIGVyci5aRVJPX1VOSVRTCiAgICBkdXAKICAgIGFzc2VydCAvLyBDYW4gbm90IGRpc3RyaWJ1dGUgemVybyB1bml0cwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4MwogICAgLy8gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCArIHVuaXRzIDw9IHNlbGYudG90YWxfdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICArCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgPD0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODItODQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCArIHVuaXRzIDw9IHNlbGYudG90YWxfdW5pdHMKICAgIC8vICksIGVyci5PVkVSX0RJU1RSSUJVVElPTgogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCByZW1haW5pbmcgRC1BU0EgdW5pdHMKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODUKICAgIC8vIGlmIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI4IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlIGV4aXN0cwogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojg3CiAgICAvLyBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8PSBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI4IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlIGV4aXN0cwogICAgPD0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODYtODgKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPD0gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGUKICAgIC8vICksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TRUQKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBjbG9zZWQKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNDgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnJlc2VydmVkX3VuaXRzICs9IHVuaXRzCiAgICBkdXBuIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDMKICAgIGR1cAogICAgY292ZXIgMwogICAgKwogICAgaXRvYgogICAgcHVzaGludCA0MAogICAgc3dhcAogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6OTEKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgKz0gdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICArCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6OTIKICAgIC8vIHJldHVybiBzZWxmLnRvdGFsX3VuaXRzIC0gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIHN3YXAKICAgIC0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMudHJhbnNmZXJfYWdlbnQuVHJhbnNmZXJBZ2VudC50cmFuc2Zlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnRyYW5zZmVyOgogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQ2CiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTMwCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxMzEKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzgKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTUwCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuX3N0YXR1c19pc19wZW5kaW5nX2llZCgpLCBlcnIuUEVORElOR19JRUQKICAgICEKICAgIGFzc2VydCAvLyBJRUQgbm90IHlldCBleGVjdXRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxMwogICAgLy8gaWYgc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjkgLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICBieiB0cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTUKICAgIC8vIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjkgLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNC0xNgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gKSwgZXJyLkNMT1NFRF9UUkFOU0ZFUgogICAgYXNzZXJ0IC8vIFRyYW5zZmVyIGlzIGNsb3NlZAoKdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNwogICAgLy8gaWYgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzAgLy8gInRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICBieiB0cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTkKICAgIC8vIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDwgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGUKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMCAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIDwKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTgtMjAKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZQogICAgLy8gKSwgZXJyLkNMT1NFRF9UUkFOU0ZFUgogICAgYXNzZXJ0IC8vIFRyYW5zZmVyIGlzIGNsb3NlZAoKdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxMzUKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIGRpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA4CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIGJ5dGVjIDggLy8gMHg0MTIzCiAgICBkaWcgNQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA5CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjEzOAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChzZW5kZXJfaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDIKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTM5CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGR1cAogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNDAKICAgIC8vIGFzc2VydCBzZW5kZXJfaG9sZGluZ19hZGRyZXNzICE9IHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcywgZXJyLlNFTEZfVFJBTlNGRVIKICAgIHVuY292ZXIgMgogICAgIT0KICAgIGFzc2VydCAvLyBTZW5kZXIgYW5kIHJlY2VpdmVyIG11c3QgYmUgZGlmZmVyZW50CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE0MQogICAgLy8gYXNzZXJ0IHVuaXRzID4gVUludDY0KDApLCBlcnIuTlVMTF9UUkFOU0ZFUgogICAgZGlnIDEKICAgIGR1cAogICAgYXNzZXJ0IC8vIFRyYW5zZmVyIHVuaXRzIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTQyCiAgICAvLyBhc3NlcnQgdW5pdHMgPD0gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLCBlcnIuT1ZFUl9UUkFOU0ZFUgogICAgc3dhcAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIDw9CiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IHNlbmRlciB1bml0cyB0byB0cmFuc2ZlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzY2CiAgICAvLyBpZiBzZWxmLmV2ZW50X2N1cnNvciA+PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICA+PQogICAgYm56IHRyYW5zZmVyX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Fzc2VydF9ub19kdWVfZXZlbnRfcGVuZGluZ0AxMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzY4CiAgICAvLyBuZXh0X2VudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KHNlbGYuZXZlbnRfY3Vyc29yKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc3MAogICAgLy8gbmV4dF9lbnRyeS5zY2hlZHVsZWRfdGltZSA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NjktNzcxCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIG5leHRfZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gKSwgZXJyLlBFTkRJTkdfQUNUVVNfRVZFTlQKICAgIGFzc2VydCAvLyBBQ1RVUyBldmVudCBub3QgeWV0IGV4ZWN1dGVkCgp0cmFuc2Zlcl9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9hc3NlcnRfbm9fZHVlX2V2ZW50X3BlbmRpbmdAMTA6CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE0NQogICAgLy8gc2VsZi5fZW5zdXJlX3VuaXRzX2FjdGl2YXRlZChzZW5kZXJfaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDMKICAgIGR1cAogICAgY2FsbHN1YiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNDYKICAgIC8vIHNlbGYuX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQocmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgY2FsbHN1YiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNDcKICAgIC8vIHNlbGYuX3NldHRsZV9wb3NpdGlvbihzZW5kZXJfaG9sZGluZ19hZGRyZXNzKQogICAgY2FsbHN1YiBfc2V0dGxlX3Bvc2l0aW9uCiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTQ4CiAgICAvLyBzZWxmLl9zZXR0bGVfcG9zaXRpb24ocmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzKQogICAgY2FsbHN1YiBfc2V0dGxlX3Bvc2l0aW9uCiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNTIKICAgIC8vIGFzc2VydCB1bml0cyA8PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cywgZXJyLk9WRVJfVFJBTlNGRVIKICAgIGRpZyA1CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkaWcgMQogICAgPD0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgc2VuZGVyIHVuaXRzIHRvIHRyYW5zZmVyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTUzCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyAtPSB1bml0cwogICAgZGlnIDEKICAgIC0KICAgIGl0b2IKICAgIHVuY292ZXIgMgogICAgaW50Y18zIC8vIDMyCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTQ0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyArPSB1bml0cwogICAgZGlnIDUKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIHVuY292ZXIgMgogICAgKwogICAgaXRvYgogICAgaW50Y18zIC8vIDMyCiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfc3VzcGVuc2lvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfc3VzcGVuc2lvbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojc3CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyMSAvLyAweDUyM2E0MTU1NTQyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE4NQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkID0gc3VzcGVuZGVkCiAgICBkdXAKICAgIHB1c2hpbnQgNDgKICAgIGludGNfMSAvLyAxCiAgICBib3hfZXh0cmFjdAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMwogICAgc2V0Yml0CiAgICBwdXNoaW50IDQ4CiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE4NgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTY1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5hY2NvdW50X29wZW5bcm91dGluZ10oKSAtPiB2b2lkOgphY2NvdW50X29wZW46CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjgKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmFjY291bnRfbWFuYWdlciwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDIzIC8vIDB4NTIzYTRkNGU0NzIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDIKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0VOREVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDIwMAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTAKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX2VuZGVkKCksIGVyci5VTkFVVEhPUklaRUQKICAgICEKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxMQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTIKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjEzCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozNAogICAgLy8gdW5pdHM9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozMi00MgogICAgLy8gcmV0dXJuIHR5cC5BY2NvdW50UG9zaXRpb24oCiAgICAvLyAgICAgcGF5bWVudF9hZGRyZXNzPXBheW1lbnRfYWRkcmVzcywKICAgIC8vICAgICB1bml0cz1VSW50NjQoMCksCiAgICAvLyAgICAgcmVzZXJ2ZWRfdW5pdHM9VUludDY0KDApLAogICAgLy8gICAgIHN1c3BlbmRlZD1GYWxzZSwKICAgIC8vICAgICBzZXR0bGVkX2N1cnNvcj1VSW50NjQoMCksCiAgICAvLyAgICAgaW50ZXJlc3RfY2hlY2twb2ludD1VSW50NjQoMCksCiAgICAvLyAgICAgcHJpbmNpcGFsX2NoZWNrcG9pbnQ9VUludDY0KDApLAogICAgLy8gICAgIGNsYWltYWJsZV9pbnRlcmVzdD1VSW50NjQoMCksCiAgICAvLyAgICAgY2xhaW1hYmxlX3ByaW5jaXBhbD1VSW50NjQoMCksCiAgICAvLyApCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGJ5dGVjIDQwIC8vIDB4MDAKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjE0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHNlbGYuX25ld19hY2NvdW50X3Bvc2l0aW9uKHBheW1lbnRfYWRkcmVzcykKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTUKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjM4CiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIHVuY292ZXIgMwogICAgPT0KICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIzOQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDAKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQxCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MgPSBwYXltZW50X2FkZHJlc3MKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQyCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfZ2V0X3Bvc2l0aW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF9nZXRfcG9zaXRpb246CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNTkKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9jcmVhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9jcmVhdGU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAzNgogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IGFycmFuZ2VyCiAgICBieXRlYyAxOCAvLyAweDUyM2E0MTUyNTIyMwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMzcKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfY29uZmlnW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfY29uZmlnOgogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBsZW4KICAgIHB1c2hpbnQgMTA3CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLk5vcm1hbGl6ZWRBY3R1c1Rlcm1zCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgcHVzaGludCA3MgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5Jbml0aWFsS2VybmVsU3RhdGUKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBsZW4KICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIHR1cGxlIGVuY29kaW5nCiAgICBkdXAKICAgIHB1c2hpbnQgMzQKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCB0YWlsIHBvaW50ZXIgYXQgaW5kZXggMSBvZiAodWludDhbMzJdLChsZW4rdXRmOFtdKSkKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgY292ZXIgMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMzYKICAgICsKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuUHJvc3BlY3R1cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2OQogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDcxLTEwNzIKICAgIC8vICMgQ29uZmlndXJlIENvbnRyYWN0CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPSB0ZXJtcy5jb250cmFjdF90eXBlLmFzX3VpbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIxLTIyOAogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgYnogY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUA3CiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIyMwogICAgLy8gVUludDY0KGVudW1zLkNUX0FOTiksCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIxLTIyOAogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjI0CiAgICAvLyBVSW50NjQoZW51bXMuQ1RfTkFNKSwKICAgIHB1c2hpbnQgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIxLTIyOAogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjI1CiAgICAvLyBVSW50NjQoZW51bXMuQ1RfTEFNKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIxLTIyOAogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjI2CiAgICAvLyBVSW50NjQoZW51bXMuQ1RfTEFYKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIxLTIyOAogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjI3CiAgICAvLyBVSW50NjQoZW51bXMuQ1RfQ0xNKSwKICAgIHB1c2hpbnQgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIxLTIyOAogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJ6IGNvbnRyYWN0X2NvbmZpZ19ib29sX2ZhbHNlQDgKCmNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANzoKICAgIGludGNfMSAvLyAxCgpjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUA5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjMyCiAgICAvLyBhc3NlcnQgc2VsZi5faXNfc3VwcG9ydGVkX2NvbnRyYWN0X3R5cGUoY29udHJhY3RfdHlwZSksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3NAogICAgLy8gc2VsZi5fc3RvcmVfY29udHJhY3RfY29uZmlnKHNlbGYuY29udHJhY3RfdHlwZSwgdGVybXMsIGluaXRpYWxfc3RhdGUpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgYnVyeSAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzI4CiAgICAvLyBhc3NlcnQgdGVybXMuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZGlnIDQKICAgIGR1cAogICAgcHVzaGludCAzMwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSA4CiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzAKICAgIC8vIHRlcm1zLmRheV9jb3VudF9jb252ZW50aW9uLmFzX3VpbnQ2NCgpCiAgICBwdXNoaW50IDU3CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzAwLTMwNgogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICBieiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDE2CiAgICBkaWcgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzAyCiAgICAvLyBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMwMC0zMDYKICAgIC8vIHJldHVybiBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzYwKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwSVNEQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjApLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDE2CiAgICBkaWcgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzAzCiAgICAvLyBVSW50NjQoZW51bXMuRENDX0EzNjUpLAogICAgcHVzaGludCAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDAtMzA2CiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgID09CiAgICBibnogY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUAxNgogICAgZGlnIDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMwNAogICAgLy8gVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzAwLTMwNgogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGRpZyA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDUKICAgIC8vIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzAwLTMwNgogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICA9PQogICAgYnogY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAMTcKCmNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTY6CiAgICBpbnRjXzEgLy8gMQoKY29udHJhY3RfY29uZmlnX2Jvb2xfbWVyZ2VAMTg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTItMzE0CiAgICAvLyBhc3NlcnQgc2VsZi5faXNfc3VwcG9ydGVkX2RheV9jb3VudF9jb252ZW50aW9uKAogICAgLy8gICAgIGRheV9jb3VudF9jb252ZW50aW9uCiAgICAvLyApLCBlcnIuSU5WQUxJRF9EQVlfQ09VTlRfQ09OVkVOVElPTgogICAgYXNzZXJ0IC8vIEludmFsaWQgZGF5LWNvdW50IGNvbnZlbnRpb24gSUQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMzMgogICAgLy8gaWYgY29udHJhY3RfdHlwZSAhPSBVSW50NjQoZW51bXMuQ1RfQU5OKToKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgICE9CiAgICBieiBjb250cmFjdF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzMzCiAgICAvLyBhc3NlcnQgbm90IHRlcm1zLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24sIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZGlnIDQKICAgIHB1c2hpbnQgNzg2CiAgICBnZXRiaXQKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KCmNvbnRyYWN0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDIwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODEwCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIEQtQVNBIGFscmVhZHkgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODExCiAgICAvLyBhc3NlcnQgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCA9PSBVSW50NjQoMCksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMCAvLyAiaW5pdGlhbF9leGNoYW5nZV9hbW91bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTMtODE0CiAgICAvLyAjIFNldCBEZW5vbWluYXRpb24gQXNzZXQKICAgIC8vIHNlbGYuX2Fzc2VydF9kZW5vbWluYXRpb25fYXNzZXQodGVybXMuZGVub21pbmF0aW9uX2Fzc2V0X2lkKQogICAgZGlnIDQKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NzgtNzc5CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIGRlbm9taW5hdGlvbiB3aXRoIEFTQQogICAgLy8gX2NyZWF0b3IsIGV4aXN0cyA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X2NyZWF0b3IoZGVub21pbmF0aW9uX2Fzc2V0X2lkKQogICAgZHVwCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q3JlYXRvcgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODAKICAgIC8vIGFzc2VydCBleGlzdHMsIGVyci5JTlZBTElEX0RFTk9NSU5BVElPTgogICAgYXNzZXJ0IC8vIERlbm9taW5hdGlvbiBhc3NldCBpcyBub3QgcHJvcGVybHkgc2V0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODMKICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICBieXRlYyA0NCAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTctODE4CiAgICAvLyAjIFNldCBTZXR0bGVtZW50IEFzc2V0CiAgICAvLyBzZWxmLl9hc3NlcnRfc2V0dGxlbWVudF9hc3NldCh0ZXJtcy5zZXR0bGVtZW50X2Fzc2V0X2lkKQogICAgZGlnIDEKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc4OAogICAgLy8gc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODYtNzg5CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc2V0dGxlbWVudCBhc3NldCBpcyB0aGUgZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQgPT0gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIC8vICksIGVyci5JTlZBTElEX1NFVFRMRU1FTlRfQVNTRVQKICAgIGFzc2VydCAvLyBEaWZmZXJlbnQgc2V0dGxlbWVudCBhc3NldCBub3Qgc3VwcG9ydGVkLCBtdXN0IGJlIGVxdWFsIHRvIGRlbm9taW5hdGlvbiBhc3NldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkyCiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBzZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkzLTc5OQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhc3NldF9hbW91bnQ9MCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Nzk4CiAgICAvLyBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Nzk2CiAgICAvLyBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc5NwogICAgLy8gYXNzZXRfYW1vdW50PTAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkzLTc5NAogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3OTMtNzk5CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODIxLTgyMgogICAgLy8gIyBVbml0cwogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IHRlcm1zLnRvdGFsX3VuaXRzCiAgICBkdXAKICAgIHB1c2hpbnQgMTcKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODIzCiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID0gVUludDY0KDApCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgyNS04MjYKICAgIC8vICMgRGF5LUNvdW50IENvbnZlbnRpb25zCiAgICAvLyBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uID0gdGVybXMuZGF5X2NvdW50X2NvbnZlbnRpb24uYXNfdWludDY0KCkKICAgIGJ5dGVjIDQ2IC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGRpZyA4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODI4LTgyOQogICAgLy8gIyBUaW1lCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA9IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZQogICAgZHVwCiAgICBwdXNoaW50IDQxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMjggLy8gImluaXRpYWxfZXhjaGFuZ2VfZGF0ZSIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODMwCiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSB0ZXJtcy5tYXR1cml0eV9kYXRlCiAgICBkaWcgMQogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDQ1IC8vICJtYXR1cml0eV9kYXRlIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MzEKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IGluaXRpYWxfc3RhdGUubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZGlnIDYKICAgIGR1cAogICAgY292ZXIgMgogICAgcHVzaGludCA0OAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzMy04MzQKICAgIC8vICMgUHJpbmNpcGFsCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID0gdGVybXMuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGRpZyAxMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzNQogICAgLy8gc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gdGVybXMuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZGlnIDMKICAgIHB1c2hpbnQgNzg2CiAgICBnZXRiaXQKICAgIGJ5dGVjIDM0IC8vICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzNgogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBpbml0aWFsX3N0YXRlLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZGlnIDEKICAgIHB1c2hpbnQgMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODM4LTgzOQogICAgLy8gIyBJbnRlcmVzdAogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ID0gaW5pdGlhbF9zdGF0ZS5hY2NydWVkX2ludGVyZXN0CiAgICBkaWcgMQogICAgcHVzaGludCA0MAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQxLTg0MgogICAgLy8gIyBJbnRlcmVzdCBSYXRlCiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IGluaXRpYWxfc3RhdGUubm9taW5hbF9pbnRlcmVzdF9yYXRlCiAgICBkaWcgMQogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0MwogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gaW5pdGlhbF9zdGF0ZS5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlCiAgICBkaWcgMQogICAgcHVzaGludCAyNAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQ0CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkID0gdGVybXMucmF0ZV9yZXNldF9zcHJlYWQKICAgIGRpZyAzCiAgICBwdXNoaW50IDU4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzUgLy8gInJhdGVfcmVzZXRfc3ByZWFkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0NQogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIgPSB0ZXJtcy5yYXRlX3Jlc2V0X211bHRpcGxpZXIKICAgIGRpZyAzCiAgICBwdXNoaW50IDY2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzYgLy8gInJhdGVfcmVzZXRfbXVsdGlwbGllciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDYKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9mbG9vciA9IHRlcm1zLnJhdGVfcmVzZXRfZmxvb3IKICAgIGRpZyAzCiAgICBwdXNoaW50IDc0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzEgLy8gInJhdGVfcmVzZXRfZmxvb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQ3CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfY2FwID0gdGVybXMucmF0ZV9yZXNldF9jYXAKICAgIGRpZyAzCiAgICBwdXNoaW50IDgyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzIgLy8gInJhdGVfcmVzZXRfY2FwIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0OAogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X25leHQgPSB0ZXJtcy5yYXRlX3Jlc2V0X25leHQKICAgIGRpZyAzCiAgICBwdXNoaW50IDkwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzcgLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDkKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgPSB0ZXJtcy5oYXNfcmF0ZV9yZXNldF9mbG9vcgogICAgZGlnIDMKICAgIHB1c2hpbnQgNzg0CiAgICBnZXRiaXQKICAgIGJ5dGVjIDM4IC8vICJoYXNfcmF0ZV9yZXNldF9mbG9vciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NTAKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwID0gdGVybXMuaGFzX3JhdGVfcmVzZXRfY2FwCiAgICBkaWcgMwogICAgcHVzaGludCA3ODUKICAgIGdldGJpdAogICAgYnl0ZWMgMzkgLy8gImhhc19yYXRlX3Jlc2V0X2NhcCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NTItODUzCiAgICAvLyAjIFNjYWxpbmcKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgPSB0ZXJtcy5maXhlZF9wb2ludF9zY2FsZQogICAgdW5jb3ZlciAzCiAgICBwdXNoaW50IDk5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU1LTg1NgogICAgLy8gIyBTY2hlZHVsZSBQcm9jZXNzaW5nCiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciA9IGluaXRpYWxfc3RhdGUuZXZlbnRfY3Vyc29yCiAgICBkaWcgMQogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU4LTg1OQogICAgLy8gIyBQZXItVW5pdCBGaXhlZC1Qb2ludCBJbmRleGVzCiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggPSBpbml0aWFsX3N0YXRlLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgKICAgIGRpZyAxCiAgICBwdXNoaW50IDU2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODYwCiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4ID0gaW5pdGlhbF9zdGF0ZS5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleAogICAgZGlnIDEKICAgIHB1c2hpbnQgNjQKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODYyLTg2MwogICAgLy8gIyBSZXNlcnZlZCBBbW91bnQgKGZvciBleGVjdXRlZCBjYXNoZmxvd3MpCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0ID0gVUludDY0KDApCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2NAogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2NgogICAgLy8gYXNzZXJ0IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLCBlcnIuSU5WQUxJRF9JRUQKICAgIGRpZyAyCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICBhc3NlcnQgLy8gSUVEIG11c3QgYmUgc2V0IGluIHRoZSBmdXR1cmUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2NwogICAgLy8gYXNzZXJ0IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA+IGluaXRpYWxfc3RhdGUuc3RhdHVzX2RhdGUsIGVyci5JTlZBTElEX0lFRAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgPAogICAgYXNzZXJ0IC8vIElFRCBtdXN0IGJlIHNldCBpbiB0aGUgZnV0dXJlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NjgKICAgIC8vIGFzc2VydCB0ZXJtcy5pbml0aWFsX2V4Y2hhbmdlX2RhdGUgPCB0ZXJtcy5tYXR1cml0eV9kYXRlLCBlcnIuSU5WQUxJRF9JRUQKICAgIDwKICAgIGFzc2VydCAvLyBJRUQgbXVzdCBiZSBzZXQgaW4gdGhlIGZ1dHVyZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3Ni0xMDc3CiAgICAvLyAjIE5vdGFyaXplIHByb3NwZWN0dXMgKG9wdGlvbmFsKQogICAgLy8gc2VsZi5wcm9zcGVjdHVzX2hhc2ggPSBwcm9zcGVjdHVzLmhhc2guYnl0ZXMKICAgIGRpZyAyCiAgICBleHRyYWN0IDAgMzIKICAgIGJ5dGVjIDQyIC8vICJwcm9zcGVjdHVzX2hhc2giCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3OAogICAgLy8gc2VsZi5wcm9zcGVjdHVzX3VybCA9IHByb3NwZWN0dXMudXJsCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGVjIDQzIC8vICJwcm9zcGVjdHVzX3VybCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc5CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAMTc6CiAgICBpbnRjXzAgLy8gMAogICAgYiBjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUAxOAoKY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAODoKICAgIGludGNfMCAvLyAwCiAgICBiIGNvbnRyYWN0X2NvbmZpZ19ib29sX21lcmdlQDkKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9zY2hlZHVsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X3NjaGVkdWxlOgogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDgxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHN3YXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBkdXAKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgMgogICAgKwogICAgdW5jb3ZlciAyCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLkV4ZWN1dGlvblNjaGVkdWxlRW50cnk+CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTEzCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMTYKICAgIC8vIGNvbnRyYWN0X3R5cGU9c2VsZi5jb250cmFjdF90eXBlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGNvdmVyIDMKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4ODQKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4ODUtODg3CiAgICAvLyBhc3NlcnQgc2NoZWR1bGVfcGFnZS5sZW5ndGggPD0gVUludDY0KAogICAgLy8gICAgIGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUKICAgIC8vICksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGR1cAogICAgcHVzaGludCAxNgogICAgPD0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg4OAogICAgLy8gYXNzZXJ0IHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPiBVSW50NjQoMCksIGVyci5URVJNU19OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSB0ZXJtcyBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODkwCiAgICAvLyBwYWdlX2N1cnNvciA9IHNjaGVkdWxlX3BhZ2VfaW5kZXggKiBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkKICAgIHN3YXAKICAgIHB1c2hpbnQgMTYKICAgICoKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg5NwogICAgLy8gKyBwYWdlX2xlbmd0aCAqIFVJbnQ2NChjc3QuT1BfVVBfQ09OVFJBQ1RfQ09ORklHX1BFUl9FTlRSWV9CVURHRVQpCiAgICBwdXNoaW50IDEwMAogICAgKgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODk2CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19CQVNFX0JVREdFVCkKICAgIGludGMgNCAvLyAxNTAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTYtODk3CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19CQVNFX0JVREdFVCkKICAgIC8vICsgcGFnZV9sZW5ndGggKiBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19QRVJfRU5UUllfQlVER0VUKQogICAgKwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODkyLTg5OQogICAgLy8gIyBWYWxpZGF0aW9uIGNvc3QgZ3Jvd3Mgd2l0aCBwYWdlIGxlbmd0aCwgc28gY29uZmlndXJhdGlvbiBleHBsaWNpdGx5CiAgICAvLyAjIGJ1eXMgZXh0cmEgb3Bjb2RlIGJ1ZGdldCBmb3IgbGFyZ2VyIHVwbG9hZHMuCiAgICAvLyBlbnN1cmVfYnVkZ2V0KAogICAgLy8gICAgIHJlcXVpcmVkX2J1ZGdldD0oCiAgICAvLyAgICAgICAgIFVJbnQ2NChjc3QuT1BfVVBfQ09OVFJBQ1RfQ09ORklHX0JBU0VfQlVER0VUKQogICAgLy8gICAgICAgICArIHBhZ2VfbGVuZ3RoICogVUludDY0KGNzdC5PUF9VUF9DT05UUkFDVF9DT05GSUdfUEVSX0VOVFJZX0JVREdFVCkKICAgIC8vICAgICApLAogICAgLy8gKQogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTAwCiAgICAvLyBpbmRleCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKCmNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEAyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTAxCiAgICAvLyB3aGlsZSBpbmRleCA8IHBhZ2VfbGVuZ3RoOgogICAgZHVwCiAgICBkaWcgNAogICAgPAogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfd2hpbGVAMTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkwMi05MDMKICAgIC8vIGVudHJ5ID0gc2NoZWR1bGVfcGFnZVtpbmRleF0uY29weSgpCiAgICAvLyBlbnRyeV9ldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZGlnIDQKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGJ1cnkgMTIKICAgIGRpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgNjUKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTAzCiAgICAvLyBlbnRyeV9ldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDItOTAzCiAgICAvLyBlbnRyeSA9IHNjaGVkdWxlX3BhZ2VbaW5kZXhdLmNvcHkoKQogICAgLy8gZW50cnlfZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGludGNfMiAvLyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDMKICAgIC8vIGVudHJ5X2V2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBnZXRieXRlCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgMTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkwNAogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X2lkID09IHBhZ2VfY3Vyc29yICsgaW5kZXgsIGVyci5JTlZBTElEX0VWRU5UX0lECiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEzCiAgICBkaWcgNQogICAgdW5jb3ZlciA0CiAgICArCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDUtOTA3CiAgICAvLyBzZWxmLl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBlbnRyeV9ldmVudF90eXBlCiAgICAvLyApCiAgICBkaWcgNQogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTA4CiAgICAvLyBhc3NlcnQgZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgc3dhcAogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDkKICAgIC8vIGlmIGVudHJ5LmV2ZW50X2lkID4gVUludDY0KDApOgogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTAKICAgIC8vIGlmIGluZGV4ID4gVUludDY0KDApOgogICAgZHVwCiAgICBieiBjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlANgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTExCiAgICAvLyBwcmV2aW91c19lbnRyeSA9IHNjaGVkdWxlX3BhZ2VbaW5kZXggLSBVSW50NjQoMSldLmNvcHkoKQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgcHVzaGludCA2NQogICAgKgogICAgZGlnIDExCiAgICBzd2FwCiAgICBwdXNoaW50IDY1CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkyNgogICAgLy8gcHJldmlvdXNfZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gZW50cnkuc2NoZWR1bGVkX3RpbWUKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyA4CiAgICA8PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTI1LTkyNwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBwcmV2aW91c19lbnRyeS5zY2hlZHVsZWRfdGltZSA8PSBlbnRyeS5zY2hlZHVsZWRfdGltZQogICAgLy8gKSwgZXJyLklOVkFMSURfU09SVElORwogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIG11c3QgYmUgc29ydGVkIGluIHN0cmljdGx5IGFzY2VuZGluZyBvcmRlcgoKY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUA4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTI4CiAgICAvLyBpZiBlbnRyeS5ldmVudF9pZCA9PSBVSW50NjQoMCk6CiAgICBkaWcgOAogICAgYm56IGNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkyOS05MzEKICAgIC8vIGFzc2VydCBlbnRyeV9ldmVudF90eXBlID09IFVJbnQ2NCgKICAgIC8vICAgICBlbnVtcy5FVlRfSUVECiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGRpZyA5CiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MzIKICAgIC8vIGluZGV4ICs9IFVJbnQ2NCgxKQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIGNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEAyCgpjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlANjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkxMy05MTUKICAgIC8vICMgVGhlIGZpcnN0IGVudHJ5IG9mIGEgcGFnZSBtdXN0IHN0aWxsIGJlIG9yZGVyZWQgYWZ0ZXIgdGhlCiAgICAvLyAjIGxhc3QgZW50cnkgb2YgdGhlIHByZXZpb3VzIHBhZ2UuCiAgICAvLyBhc3NlcnQgc2NoZWR1bGVfcGFnZV9pbmRleCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGRpZyA2CiAgICBkdXAKICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTYKICAgIC8vIHByZXZpb3VzX3BhZ2VfaW5kZXggPSBzY2hlZHVsZV9wYWdlX2luZGV4IC0gVUludDY0KDEpCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTE4CiAgICAvLyBwcmV2aW91c19wYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZQogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTctOTE5CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHByZXZpb3VzX3BhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjAtOTIxCiAgICAvLyBwcmV2aW91c19wYWdlID0gc2VsZi5zY2hlZHVsZV9wYWdlW3ByZXZpb3VzX3BhZ2VfaW5kZXhdLmNvcHkoKQogICAgLy8gYXNzZXJ0IHByZXZpb3VzX3BhZ2UubGVuZ3RoID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBwdXNoaW50IDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjEKICAgIC8vIGFzc2VydCBwcmV2aW91c19wYWdlLmxlbmd0aCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZHVwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjMKICAgIC8vIHByZXZpb3VzX3BhZ2UubGVuZ3RoIC0gVUludDY0KDEpCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTIyLTkyNAogICAgLy8gcHJldmlvdXNfZW50cnkgPSBwcmV2aW91c19wYWdlWwogICAgLy8gICAgIHByZXZpb3VzX3BhZ2UubGVuZ3RoIC0gVUludDY0KDEpCiAgICAvLyBdLmNvcHkoKQogICAgcHVzaGludCA2NQogICAgKgogICAgcHVzaGludCAyCiAgICArCiAgICBwdXNoaW50IDY1CiAgICBib3hfZXh0cmFjdAogICAgYiBjb250cmFjdF9zY2hlZHVsZV9hZnRlcl9pZl9lbHNlQDcKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX3doaWxlQDExOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjAzCiAgICAvLyBzZWxmLnNjaGVkdWxlX3BhZ2VbcGFnZV9pbmRleF0gPSBzY2hlZHVsZV9wYWdlLmNvcHkoKQogICAgZGlnIDYKICAgIGl0b2IKICAgIGJ5dGVjIDI0IC8vIDB4NTMyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgZGlnIDUKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzNQogICAgLy8gaWYgaXNfbGFzdF9wYWdlOgogICAgZGlnIDUKICAgIGJ6IGNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzNwogICAgLy8gc2NoZWR1bGVfcGFnZV9pbmRleCAqIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKSArIHBhZ2VfbGVuZ3RoCiAgICBkaWcgMQogICAgZGlnIDQKICAgICsKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzNgogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA9ICgKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTM2LTkzOAogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA9ICgKICAgIC8vICAgICBzY2hlZHVsZV9wYWdlX2luZGV4ICogVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpICsgcGFnZV9sZW5ndGgKICAgIC8vICkKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MzkKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgNTAKICAgIGFwcF9nbG9iYWxfcHV0Cgpjb250cmFjdF9zY2hlZHVsZV9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEyMQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDgxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9leGVjdXRlX2llZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X2V4ZWN1dGVfaWVkOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQ2CiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDYKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE0NwogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDgKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTUwCiAgICAvLyBhc3NlcnQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LCBlcnIuSU5WQUxJRF9FVkVOVF9DVVJTT1IKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgZGlnIDEKICAgID4KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGN1cnNvcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1MQogICAgLy8gZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoc2VsZi5ldmVudF9jdXJzb3IpCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTIKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoZW51bXMuRVZUX0lFRCksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGR1cAogICAgZXh0cmFjdCA4IDEKICAgIGR1cAogICAgcHVzaGJ5dGVzIDB4MDEKICAgIGI9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1NgogICAgLy8gZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICBkaWcgMQogICAgZXh0cmFjdCAwIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTgKICAgIC8vIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgZGlnIDIKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTU5CiAgICAvLyBhY2NydWFsX2ZhY3Rvcj1lbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIGRpZyAzCiAgICBleHRyYWN0IDE3IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNjAKICAgIC8vIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIGRpZyA0CiAgICBleHRyYWN0IDI1IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNjIKICAgIC8vIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPWVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDUKICAgIGV4dHJhY3QgMzMgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE2MwogICAgLy8gbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgZGlnIDYKICAgIGV4dHJhY3QgNDEgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE2NAogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9ZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICBkaWcgNwogICAgZXh0cmFjdCA0OSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTY1CiAgICAvLyBmbGFncz1lbnRyeS5mbGFncywKICAgIGRpZyA4CiAgICBleHRyYWN0IDU3IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTUtMTE2NgogICAgLy8gdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0KAogICAgLy8gICAgIGV2ZW50X2lkPWVudHJ5LmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1lbnRyeS5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1lbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPWVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9ZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPWVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGZsYWdzPWVudHJ5LmZsYWdzLAogICAgLy8gKSwKICAgIHVuY292ZXIgNwogICAgdW5jb3ZlciA4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNwogICAgY29uY2F0CiAgICB1bmNvdmVyIDYKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNjEKICAgIC8vIG9ic2VydmVkX3JhdGU9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTUtMTE2NgogICAgLy8gdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0KAogICAgLy8gICAgIGV2ZW50X2lkPWVudHJ5LmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1lbnRyeS5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1lbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPWVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9ZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPWVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGZsYWdzPWVudHJ5LmZsYWdzLAogICAgLy8gKSwKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTUzLTExNjcKICAgIC8vIHNlbGYuX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5KAogICAgLy8gICAgIGVudHJ5LAogICAgLy8gICAgIHR5cC5PYnNlcnZlZEV2ZW50UmVxdWVzdCgKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPWVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIG9ic2VydmVkX3JhdGU9VUludDY0KDApLAogICAgLy8gICAgICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1lbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1lbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICAgICAgZmxhZ3M9ZW50cnkuZmxhZ3MsCiAgICAvLyAgICAgKSwKICAgIC8vICkKICAgIGNhbGxzdWIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5CiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNjgKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEyMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuYXBwbHlfbm9uX2Nhc2hfZXZlbnRbcm91dGluZ10oKSAtPiB2b2lkOgphcHBseV9ub25fY2FzaF9ldmVudDoKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDQKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTcwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cG4gMgogICAgbGVuCiAgICBwdXNoaW50IDczCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLk9ic2VydmVkRXZlbnRSZXF1ZXN0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDYKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIwNwogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMDgKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjEwCiAgICAvLyBpZiBwYXlsb2FkLmZsYWdzICYgVUludDY0KGVudW1zLkZMQUdfT0JTRVJWRURfRVZFTlQpOgogICAgcHVzaGludCA2NQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgcHVzaGludCA0CiAgICAmCiAgICBieiBhcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIzNgogICAgLy8gcmV0dXJuIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQ0xNKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICBwdXNoaW50IDUKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjExCiAgICAvLyBhc3NlcnQgc2VsZi5fc3VwcG9ydHNfb2JzZXJ2ZWRfZXZlbnRzKCksIGVyci5PQlNFUlZFRF9FVkVOVF9SRVFVSVJFRAogICAgYXNzZXJ0IC8vIE9ic2VydmVkIGV2ZW50IHJlcXVpcmVkIHRvIGV4ZWN1dGUgdGhpcyBhY3Rpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMTIKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjM2CiAgICAvLyByZXR1cm4gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9DTE0pCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIGR1cAogICAgcHVzaGludCA1CiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQ4CiAgICAvLyBhc3NlcnQgc2VsZi5fc3VwcG9ydHNfb2JzZXJ2ZWRfZXZlbnRzKCksIGVyci5PQlNFUlZFRF9FVkVOVF9SRVFVSVJFRAogICAgYXNzZXJ0IC8vIE9ic2VydmVkIGV2ZW50IHJlcXVpcmVkIHRvIGV4ZWN1dGUgdGhpcyBhY3Rpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk0OQogICAgLy8gYXNzZXJ0IHBheWxvYWQuZXZlbnRfaWQgPT0gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGRpZyAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDcKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBpZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTUxCiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUsIHBheWxvYWQuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgYnVyeSAxMgogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1MC05NTIKICAgIC8vIHNlbGYuX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIHNlbGYuY29udHJhY3RfdHlwZSwgcGF5bG9hZC5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICAvLyApCiAgICBjYWxsc3ViIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTU0CiAgICAvLyBwYWdlX2luZGV4ID0gc2VsZi5fc2NoZWR1bGVfcGFnZV9pbmRleChzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTkzCiAgICAvLyByZXR1cm4gZXZlbnRfaWQgLy8gVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpCiAgICBwdXNoaW50IDE2CiAgICAvCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTUKICAgIC8vIHBhZ2UgPSB0eXAuRXhlY3V0aW9uU2NoZWR1bGVQYWdlKCkKICAgIGJ5dGVjIDQ5IC8vIDB4MDAwMAogICAgYnVyeSA3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTYKICAgIC8vIGlmIHBhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlOgogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA5CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMjcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1NwogICAgLy8gcGFnZSA9IHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XS5jb3B5KCkKICAgIGRpZyA3CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidXJ5IDcKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX3BhZ2UgZW50cnkgZXhpc3RzCgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDI3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTU4CiAgICAvLyBhc3NlcnQgcGFnZS5sZW5ndGggPCBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGRpZyA1CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgMTYKICAgIDwKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2MwogICAgLy8gc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIGRpZyAzCiAgICBkdXAKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjQKICAgIC8vIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICBkaWcgMQogICAgZXh0cmFjdCAxNyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjUKICAgIC8vIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZGlnIDIKICAgIGV4dHJhY3QgMjUgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTY2CiAgICAvLyBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDMKICAgIGV4dHJhY3QgNDEgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTY3CiAgICAvLyBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIGRpZyA0CiAgICBleHRyYWN0IDQ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2OAogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIHVuY292ZXIgNQogICAgZXh0cmFjdCA1NyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjAtOTcwCiAgICAvLyB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1wYXlsb2FkLmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9cGF5bG9hZC5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPXBheWxvYWQucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXBheWxvYWQubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICkKICAgIGRpZyAxMQogICAgaXRvYgogICAgZGlnIDE4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMwogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTktOTcxCiAgICAvLyBwYWdlLmFwcGVuZCgKICAgIC8vICAgICB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9cGF5bG9hZC5ldmVudF9pZCwKICAgIC8vICAgICAgICAgZXZlbnRfdHlwZT1wYXlsb2FkLmV2ZW50X3R5cGUsCiAgICAvLyAgICAgICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIC8vICAgICAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICAgICApCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NzIKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHBhZ2UuY29weSgpCiAgICBkaWcgOAogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk3MwogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjE1CiAgICAvLyBhc3NlcnQgZXZlbnRfaWQgPT0gc2VsZi5ldmVudF9jdXJzb3IsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBjdXJzb3IKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMTYKICAgIC8vIGVudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KGV2ZW50X2lkKQogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIxOAogICAgLy8gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgYnVyeSAxMAogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjcKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjYtMzczCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY4CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY2LTM3MwogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9SUiksCiAgICBwdXNoaW50IDEyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjYtMzczCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzcwCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICBwdXNoaW50IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjYtMzczCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzcxCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgcHVzaGludCAxOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY2LTM3MwogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM3MgogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjYtMzczCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBieiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX2ZhbHNlQDE2CgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX3RydWVAMTU6CiAgICBpbnRjXzEgLy8gMQoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9tZXJnZUAxNzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMTctMTIxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2lzX25vbl9jYXNoKAogICAgLy8gICAgIGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIC8vICksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IHR5cGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMjAKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlICE9IGFyYzQuVUludDgoZW51bXMuRVZUX0lFRCksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGRpZyA4CiAgICBwdXNoYnl0ZXMgMHgwMQogICAgYiE9CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCB0eXBlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNzcKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluIChVSW50NjQoZW51bXMuRVZUX1JSKSwgVUludDY0KGVudW1zLkVWVF9SUkYpKQogICAgZGlnIDQKICAgIHB1c2hpbnQgMTIKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDIxCiAgICBkaWcgNAogICAgcHVzaGludCAxMQogICAgPT0KICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfZmFsc2VAMjIKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAyMToKICAgIGludGNfMSAvLyAxCgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX21lcmdlQDIzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIyMQogICAgLy8gaWYgc2VsZi5fZXZlbnRfaXNfcmF0ZV9yZXNldChlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpKToKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Vsc2VfYm9keUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODAKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLm9ic2VydmVyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjUgLy8gMHg1MjNhNGQ0ZjQzMjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMjUKICAgIC8vIHNlbGYuX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5KGVudHJ5LCBwYXlsb2FkKQogICAgZGlnIDYKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeQogICAgcG9wbiAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjI2CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfZWxzZV9ib2R5QDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjI0CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIGIgYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYWZ0ZXJfaWZfZWxzZUA2CgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX2ZhbHNlQDIyOgogICAgaW50Y18wIC8vIDAKICAgIGIgYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9tZXJnZUAyMwoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9mYWxzZUAxNjoKICAgIGludGNfMCAvLyAwCiAgICBiIGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfbWVyZ2VAMTcKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5hcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50OgogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGxlbgogICAgcHVzaGludCA2NQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5PYnNlcnZlZENhc2hFdmVudFJlcXVlc3QKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NgogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjU3CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyNTgKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjU5CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM4CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE1MAogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIzNgogICAgLy8gcmV0dXJuIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQ0xNKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICBwdXNoaW50IDUKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5ODQKICAgIC8vIGFzc2VydCBzZWxmLl9zdXBwb3J0c19vYnNlcnZlZF9ldmVudHMoKSwgZXJyLk9CU0VSVkVEX0VWRU5UX1JFUVVJUkVECiAgICBhc3NlcnQgLy8gT2JzZXJ2ZWQgZXZlbnQgcmVxdWlyZWQgdG8gZXhlY3V0ZSB0aGlzIGFjdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTg1CiAgICAvLyBhc3NlcnQgcGF5bG9hZC5ldmVudF9pZCA9PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LCBlcnIuSU5WQUxJRF9FVkVOVF9JRAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgc3dhcAogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBpZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTg2CiAgICAvLyBhc3NlcnQgcGF5bG9hZC5ldmVudF90eXBlID09IGFyYzQuVUludDgoZW51bXMuRVZUX1BSKSwgZXJyLklOVkFMSURfRVZFTlRfVFlQRQogICAgZGlnIDEKICAgIGV4dHJhY3QgOCAxCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIHB1c2hieXRlcyAweDAzCiAgICBiPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IHR5cGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4NwogICAgLy8gYXNzZXJ0IHBheWxvYWQuZmxhZ3MgJiBVSW50NjQoZW51bXMuRkxBR19DQVNIX0VWRU5UKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBzd2FwCiAgICBwdXNoaW50IDU3CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzEgLy8gMQogICAgJgogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTg5CiAgICAvLyBpZiBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50ID4gVUludDY0KDApOgogICAgYnogYXBwZW5kX29ic2VydmVkX2Nhc2hfZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OTEKICAgIC8vIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgLSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OTAtOTkyCiAgICAvLyBwcmV2aW91c19lbnRyeSA9IHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeSgKICAgIC8vICAgICBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IC0gVUludDY0KDEpCiAgICAvLyApCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5NAogICAgLy8gcHJldmlvdXNfZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gcGF5bG9hZC5zY2hlZHVsZWRfdGltZQogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDQKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIDw9CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OTMtOTk1CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHByZXZpb3VzX2VudHJ5LnNjaGVkdWxlZF90aW1lIDw9IHBheWxvYWQuc2NoZWR1bGVkX3RpbWUKICAgIC8vICksIGVyci5JTlZBTElEX1NPUlRJTkcKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBtdXN0IGJlIHNvcnRlZCBpbiBzdHJpY3RseSBhc2NlbmRpbmcgb3JkZXIKCmFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5NwogICAgLy8gcGFnZV9pbmRleCA9IHNlbGYuX3NjaGVkdWxlX3BhZ2VfaW5kZXgoc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE5MwogICAgLy8gcmV0dXJuIGV2ZW50X2lkIC8vIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKQogICAgcHVzaGludCAxNgogICAgLwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTk4CiAgICAvLyBwYWdlID0gdHlwLkV4ZWN1dGlvblNjaGVkdWxlUGFnZSgpCiAgICBieXRlYyA0OSAvLyAweDAwMDAKICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTk5CiAgICAvLyBpZiBwYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZToKICAgIGl0b2IKICAgIGJ5dGVjIDI0IC8vIDB4NTMyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgNwogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBhcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMDAKICAgIC8vIHBhZ2UgPSBzZWxmLnNjaGVkdWxlX3BhZ2VbcGFnZV9pbmRleF0uY29weSgpCiAgICBkaWcgNQogICAgYm94X2dldAogICAgc3dhcAogICAgYnVyeSA2CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9wYWdlIGVudHJ5IGV4aXN0cwoKYXBwZW5kX29ic2VydmVkX2Nhc2hfZXZlbnRfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAwMQogICAgLy8gYXNzZXJ0IHBhZ2UubGVuZ3RoIDwgVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBkaWcgNAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBwdXNoaW50IDE2CiAgICA8CiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDA2CiAgICAvLyBzY2hlZHVsZWRfdGltZT1wYXlsb2FkLnNjaGVkdWxlZF90aW1lLAogICAgZGlnIDUKICAgIGR1cAogICAgZXh0cmFjdCA5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMDcKICAgIC8vIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICBkaWcgMQogICAgZXh0cmFjdCAxNyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDA4CiAgICAvLyByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPXBheWxvYWQucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIGRpZyAyCiAgICBleHRyYWN0IDI1IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMDkKICAgIC8vIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPXBheWxvYWQubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBkaWcgMwogICAgZXh0cmFjdCAzMyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDEwCiAgICAvLyBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIGRpZyA0CiAgICBleHRyYWN0IDQxIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMTEKICAgIC8vIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXBheWxvYWQubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICB1bmNvdmVyIDUKICAgIGV4dHJhY3QgNDkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAwMy0xMDEzCiAgICAvLyB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1wYXlsb2FkLmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9cGF5bG9hZC5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPXBheWxvYWQucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXBheWxvYWQubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICkKICAgIGRpZyAxMAogICAgaXRvYgogICAgZGlnIDEwCiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMwogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDAyLTEwMTQKICAgIC8vIHBhZ2UuYXBwZW5kKAogICAgLy8gICAgIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgICAgICBldmVudF9pZD1wYXlsb2FkLmV2ZW50X2lkLAogICAgLy8gICAgICAgICBldmVudF90eXBlPXBheWxvYWQuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICAgICAgYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPXBheWxvYWQubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1wYXlsb2FkLm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgICAgICBmbGFncz1wYXlsb2FkLmZsYWdzLAogICAgLy8gICAgICkKICAgIC8vICkKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMTUKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHBhZ2UuY29weSgpCiAgICBkaWcgNgogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMTYKICAgIC8vIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgKz0gVUludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI2MwogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjI4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9zZXRfZGVmYXVsdF9zdGF0dXNbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9zZXRfZGVmYXVsdF9zdGF0dXM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjY1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzQKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnRydXN0ZWUsIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyNiAvLyAweDUyM2E1NDUyNTMyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI3OAogICAgLy8gc2VsZi5kZWZhdWx0ZWQgPSBkZWZhdWx0ZWQKICAgIGJ5dGVjIDQ3IC8vICJkZWZhdWx0ZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI3OQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjY1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9nZXRfc3RhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9nZXRfc3RhdGU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDYKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGR1cAogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjk0CiAgICAvLyBjb250cmFjdF90eXBlPWFyYzQuVUludDgoc2VsZi5jb250cmFjdF90eXBlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgaXRvYgogICAgZHVwCiAgICBiaXRsZW4KICAgIGludGNfMiAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBleHRyYWN0IDcgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI5NgogICAgLy8gdG90YWxfdW5pdHM9c2VsZi50b3RhbF91bml0cywKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjk3CiAgICAvLyByZXNlcnZlZF91bml0c190b3RhbD1zZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyOTgKICAgIC8vIGluaXRpYWxfZXhjaGFuZ2VfYW1vdW50PXNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI5OQogICAgLy8gZXZlbnRfY3Vyc29yPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzAwCiAgICAvLyBzY2hlZHVsZV9lbnRyeV9jb3VudD1zZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMwMQogICAgLy8gb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzAyCiAgICAvLyBpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlPXNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzAzCiAgICAvLyBub21pbmFsX2ludGVyZXN0X3JhdGU9c2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMDQKICAgIC8vIGFjY3J1ZWRfaW50ZXJlc3Q9c2VsZi5hY2NydWVkX2ludGVyZXN0LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMDUKICAgIC8vIGN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXg9c2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzA2CiAgICAvLyBjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleD1zZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMDcKICAgIC8vIHJlc2VydmVkX2ludGVyZXN0PXNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX2ludGVyZXN0IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMwOAogICAgLy8gcmVzZXJ2ZWRfcHJpbmNpcGFsPXNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI5My0xMzA5CiAgICAvLyByZXR1cm4gdHlwLktlcm5lbFN0YXRlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGU9YXJjNC5VSW50OChzZWxmLmNvbnRyYWN0X3R5cGUpLAogICAgLy8gICAgIHN0YXR1cz1zZWxmLnN0YXR1cywKICAgIC8vICAgICB0b3RhbF91bml0cz1zZWxmLnRvdGFsX3VuaXRzLAogICAgLy8gICAgIHJlc2VydmVkX3VuaXRzX3RvdGFsPXNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwsCiAgICAvLyAgICAgaW5pdGlhbF9leGNoYW5nZV9hbW91bnQ9c2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCwKICAgIC8vICAgICBldmVudF9jdXJzb3I9c2VsZi5ldmVudF9jdXJzb3IsCiAgICAvLyAgICAgc2NoZWR1bGVfZW50cnlfY291bnQ9c2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwKICAgIC8vICAgICBvdXRzdGFuZGluZ19wcmluY2lwYWw9c2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZT1zZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICAvLyAgICAgbm9taW5hbF9pbnRlcmVzdF9yYXRlPXNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIGFjY3J1ZWRfaW50ZXJlc3Q9c2VsZi5hY2NydWVkX2ludGVyZXN0LAogICAgLy8gICAgIGN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXg9c2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4LAogICAgLy8gICAgIGN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4PXNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgsCiAgICAvLyAgICAgcmVzZXJ2ZWRfaW50ZXJlc3Q9c2VsZi5yZXNlcnZlZF9pbnRlcmVzdCwKICAgIC8vICAgICByZXNlcnZlZF9wcmluY2lwYWw9c2VsZi5yZXNlcnZlZF9wcmluY2lwYWwsCiAgICAvLyApCiAgICB1bmNvdmVyIDE0CiAgICBpdG9iCiAgICB1bmNvdmVyIDE0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMgogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDExCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA5CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgOAogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDcKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyODEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NgogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzIzCiAgICAvLyBpZiBzZWxmLmV2ZW50X2N1cnNvciA+PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICA+PQogICAgYnogY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMyNQogICAgLy8gZXZlbnRfaWQ9c2VsZi5ldmVudF9jdXJzb3IsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMjQtMTMzNAogICAgLy8gcmV0dXJuIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgIGV2ZW50X2lkPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgLy8gICAgIGV2ZW50X3R5cGU9YXJjNC5VSW50OCgwKSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1VSW50NjQoMCksCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1VSW50NjQoMCksCiAgICAvLyAgICAgZmxhZ3M9VUludDY0KDApLAogICAgLy8gKQogICAgaXRvYgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMyNgogICAgLy8gZXZlbnRfdHlwZT1hcmM0LlVJbnQ4KDApLAogICAgYnl0ZWMgNDAgLy8gMHgwMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMyNC0xMzM0CiAgICAvLyByZXR1cm4gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkoCiAgICAvLyAgICAgZXZlbnRfaWQ9c2VsZi5ldmVudF9jdXJzb3IsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1hcmM0LlVJbnQ4KDApLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPVVJbnQ2NCgwKSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249VUludDY0KDApLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPVVJbnQ2NCgwKSwKICAgIC8vICAgICBmbGFncz1VSW50NjQoMCksCiAgICAvLyApCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMjcKICAgIC8vIHNjaGVkdWxlZF90aW1lPVVJbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzI0LTEzMzQKICAgIC8vIHJldHVybiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1zZWxmLmV2ZW50X2N1cnNvciwKICAgIC8vICAgICBldmVudF90eXBlPWFyYzQuVUludDgoMCksCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9VUludDY0KDApLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9VUludDY0KDApLAogICAgLy8gICAgIGZsYWdzPVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAoKY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50QDQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzExCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzM1CiAgICAvLyByZXR1cm4gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KHNlbGYuZXZlbnRfY3Vyc29yKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiBjb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnRfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnRANAoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLmNvbnRyYWN0X3VwZGF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X3VwZGF0ZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTktMTYyCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gZ3JhbnRzIHRoZSB1cGRhdGUgcGVybWlzc2lvbnMgdG8gdGhlIEFycmFuZ2VyLgogICAgLy8gIyDimqDvuI8gV0FSTklORzogQXBwbGljYXRpb24gdXBkYXRlcyBtdXN0IGJlIGV4ZWN1dGVkIFZFUlkgY2FyZWZ1bGx5LCBhcyB0aGV5CiAgICAvLyAjIG1pZ2h0IGludHJvZHVjZSBicmVha2luZyBjaGFuZ2VzLgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19yb3RhdGVfYXJyYW5nZXJbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3JvdGF0ZV9hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTc4CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzkKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSBuZXdfYXJyYW5nZXIKICAgIGJ5dGVjIDE4IC8vIDB4NTIzYTQxNTI1MjIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4MAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTY0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3NldF9vcF9kYWVtb25bcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3NldF9vcF9kYWVtb246CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTgyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE5NgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTk3CiAgICAvLyBzZWxmLm9wX2RhZW1vbi52YWx1ZSA9IGFkZHJlc3MKICAgIGJ5dGVjIDI3IC8vIDB4NTIzYTRmNTA0NDIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE5OAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTgyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2Fzc2lnbl9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19hc3NpZ25fcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDE2CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLlJvbGVWYWxpZGl0eQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyMgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjIzCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNAogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgcHVzaGludCAyMAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTAzCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gcm9sZV9hZGRyZXNzCiAgICBieXRlYyAxOCAvLyAweDUyM2E0MTUyNTIyMwogICAgZGlnIDMKICAgIGFwcF9nbG9iYWxfcHV0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwNgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDQwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDcKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIzIC8vIDB4NTIzYTRkNGU0NzIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDgKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI1CiAgICAvLyBzZWxmLl9zZXRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIHZhbGlkaXR5KQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTAKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTEKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjIgLy8gMHg1MjNhNTA1OTQ0MjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMgogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNQogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE0CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpOgogICAgZHVwCiAgICBwdXNoaW50IDYwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTUKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyNiAvLyAweDUyM2E1NDUyNTMyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE2CiAgICAvLyBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjUKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExOAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMSAvLyAweDUyM2E0MTU1NTQyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIwCiAgICAvLyBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNQogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgODAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIzCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI1IC8vIDB4NTIzYTRkNGY0MzIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjQKICAgIC8vIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfcmV2b2tlX3JvbGVbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3Jldm9rZV9yb2xlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0NwogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjQ4CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0OQogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjcKICAgIC8vIGFzc2VydCByb2xlX2lkICE9IFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwgZXJyLklOVkFMSURfUk9MRQogICAgZHVwCiAgICBwdXNoaW50IDIwCiAgICAhPQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI4CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICBwdXNoaW50IDQwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjkKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjMgLy8gMHg1MjNhNGQ0ZTQ3MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMAogICAgLy8gZGVsIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTEKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzMKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMiAvLyAweDUyM2E1MDU5NDQyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM0CiAgICAvLyBkZWwgc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTAKICAgIC8vIHNlbGYuX2RlbGV0ZV9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcykKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM2CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpOgogICAgZHVwCiAgICBwdXNoaW50IDYwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzcKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI2IC8vIDB4NTIzYTU0NTI1MzIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzgKICAgIC8vIGRlbCBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjUwCiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDEKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hdXRob3JpdHksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjEgLy8gMHg1MjNhNDE1NTU0MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MgogICAgLy8gZGVsIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1MAogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDQKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDgwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI1IC8vIDB4NTIzYTRkNGY0MzIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDYKICAgIC8vIGRlbCBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19jb250cmFjdF9zdXNwZW5zaW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19jb250cmFjdF9zdXNwZW5zaW9uOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kICAjIFRPRE86IFVwZGF0ZSBzcGVjcyBhbmQgYWRkIHRlc3QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzcKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDIxIC8vIDB4NTIzYTQxNTU1NDIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjY5CiAgICAvLyBzZWxmLmFzc2V0X3N1c3BlbmRlZCA9IHN1c3BlbmRlZAogICAgYnl0ZWMgMzMgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjcwCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCAgIyBUT0RPOiBVcGRhdGUgc3BlY3MgYW5kIGFkZCB0ZXN0CiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYXJyYW5nZXJbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODMKICAgIC8vIHJldHVybiBzZWxmLmFycmFuZ2VyLnZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTggLy8gMHg1MjNhNDE1MjUyMjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcnJhbmdlciBleGlzdHMKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNzIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXNbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9hZGRyZXNzX3JvbGVzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDMKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDIzIC8vIDB4NTIzYTRkNGU0NzIzCiAgICBkaWcgMQogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDQKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYucHJpbWFyeV9kZWFsZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjIgLy8gMHg1MjNhNTA1OTQ0MjMKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwNQogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi50cnVzdGVlLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDI2IC8vIDB4NTIzYTU0NTI1MzIzCiAgICBkaWcgMwogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDYKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYXV0aG9yaXR5LCBhZGRyZXNzKSwKICAgIGJ5dGVjIDIxIC8vIDB4NTIzYTQxNTU1NDIzCiAgICBkaWcgNAogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDcKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYub2JzZXJ2ZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjUgLy8gMHg1MjNhNGQ0ZjQzMjMKICAgIHVuY292ZXIgNQogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWMgNDAgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgNgogICAgc2V0Yml0CiAgICBpbnRjXzEgLy8gMQogICAgdW5jb3ZlciA1CiAgICBzZXRiaXQKICAgIHB1c2hpbnQgMgogICAgdW5jb3ZlciA0CiAgICBzZXRiaXQKICAgIHB1c2hpbnQgMwogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIHB1c2hpbnQgNAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5W3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfcm9sZV92YWxpZGl0eToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjgKICAgIC8vIHJvbGUgPSByb2xlX2lkLmFzX3VpbnQ2NCgpCiAgICBidG9pCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI5CiAgICAvLyBzZWxmLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlKQogICAgZHVwCiAgICBjYWxsc3ViIF9hc3NlcnRfdmFsaWRfcm9sZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMzMQogICAgLy8gY2FzZSBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUik6CiAgICBwdXNoaW50cyAyMCA0MCA1MCA2MCA3MCA4MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMzMC0zNjEKICAgIC8vIG1hdGNoIHJvbGU6CiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUik6CiAgICAvLyAgICAgICAgIHJldHVybiB0eXAuUm9sZVZhbGlkaXR5KAogICAgLy8gICAgICAgICAgICAgcm9sZV92YWxpZGl0eV9zdGFydD1VSW50NjQoMCksIHJvbGVfdmFsaWRpdHlfZW5kPVVJbnQ2NCgwKQogICAgLy8gICAgICAgICApCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLmFjY291bnRfbWFuYWdlciwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLnByaW1hcnlfZGVhbGVyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLmF1dGhvcml0eSwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLm9ic2VydmVyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIF86CiAgICAvLyAgICAgICAgIG9wLmVycihlcnIuSU5WQUxJRF9ST0xFKQogICAgdW5jb3ZlciA2CiAgICBtYXRjaCByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzBAMiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzFAMyByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzJANCByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzNANSByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzRANiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzVANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM2MQogICAgLy8gb3AuZXJyKGVyci5JTlZBTElEX1JPTEUpCiAgICBlcnIgLy8gSW52YWxpZCByb2xlIGlkZW50aWZpZXIKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM1NwogICAgLy8gc2VsZi5vYnNlcnZlciwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAyNSAvLyAweDUyM2E0ZDRmNDMyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM1Ni0zNTgKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLm9ic2VydmVyLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTkKICAgIC8vIHJldHVybiBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV80QDY6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzUyCiAgICAvLyBzZWxmLmF1dGhvcml0eSwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAyMSAvLyAweDUyM2E0MTU1NTQyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM1MS0zNTMKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLmF1dGhvcml0eSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzU0CiAgICAvLyByZXR1cm4gc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8zQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzQ3CiAgICAvLyBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMjYgLy8gMHg1MjNhNTQ1MjUzMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNDYtMzQ4CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNDkKICAgIC8vIHJldHVybiBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8yQDQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzQyCiAgICAvLyBzZWxmLnByaW1hcnlfZGVhbGVyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDIyIC8vIDB4NTIzYTUwNTk0NDIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzQxLTM0MwogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM0NAogICAgLy8gcmV0dXJuIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8xQDM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzM3CiAgICAvLyBzZWxmLmFjY291bnRfbWFuYWdlciwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAyMyAvLyAweDUyM2E0ZDRlNDcyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMzNi0zMzgKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLmFjY291bnRfbWFuYWdlciwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzM5CiAgICAvLyByZXR1cm4gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8wQDI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzMyLTMzNAogICAgLy8gcmV0dXJuIHR5cC5Sb2xlVmFsaWRpdHkoCiAgICAvLyAgICAgcm9sZV92YWxpZGl0eV9zdGFydD1VSW50NjQoMCksIHJvbGVfdmFsaWRpdHlfZW5kPVVJbnQ2NCgwKQogICAgLy8gKQogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQoaG9sZGluZ19hZGRyZXNzOiBieXRlcykgLT4gdm9pZDoKX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQ6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjYKICAgIC8vIGRlZiBfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChzZWxmLCBob2xkaW5nX2FkZHJlc3M6IEFjY291bnQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyOAogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQsIGVyci5TVVNQRU5ERUQKICAgIGJ5dGVjIDggLy8gMHg0MTIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHB1c2hpbnQgMzg0CiAgICBnZXRiaXQKICAgICEKICAgIGFzc2VydCAvLyBTdXNwZW5kZWQgb3BlcmF0aW9ucwogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuX3NldHRsZV9wb3NpdGlvbihob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB1aW50NjQsIHVpbnQ2NDoKX3NldHRsZV9wb3NpdGlvbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo0NAogICAgLy8gZGVmIF9zZXR0bGVfcG9zaXRpb24oc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50KSAtPiB0dXBsZVtVSW50NjQsIFVJbnQ2NF06CiAgICBwcm90byAxIDIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo2MQogICAgLy8gcG9zaXRpb24gPSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jb3B5KCkKICAgIGR1cAogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NjMtNjUKICAgIC8vICMgQ29tcHV0ZSB0aGUgaW5jcmVtZW50YWwgcGVyLXVuaXQgZml4ZWQtcG9pbnQgaW50ZXJlc3QgYW5kIHByaW5jaXBhbCBhY2NydWVkCiAgICAvLyAjIHNpbmNlIHRoaXMgYWNjb3VudCdzIGxhc3QgY2hlY2twb2ludC4KICAgIC8vIGludGVyZXN0X2RlbHRhID0gc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IC0gcG9zaXRpb24uaW50ZXJlc3RfY2hlY2twb2ludAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggZXhpc3RzCiAgICBkaWcgMQogICAgcHVzaGludCA1NwogICAgZXh0cmFjdF91aW50NjQKICAgIC0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo2NwogICAgLy8gc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCAtIHBvc2l0aW9uLnByaW5jaXBhbF9jaGVja3BvaW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTcgLy8gImN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IGV4aXN0cwogICAgZGlnIDIKICAgIHB1c2hpbnQgNjUKICAgIGV4dHJhY3RfdWludDY0CiAgICAtCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzMKICAgIC8vIGludGVyZXN0X2RlbHRhLCBwb3NpdGlvbi51bml0cywgc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgZGlnIDIKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3MC03NAogICAgLy8gIyBDb252ZXJ0IHRoZSBwZXItdW5pdCBmaXhlZC1wb2ludCBkZWx0YXMgaW50byBhYnNvbHV0ZSBjbGFpbWFibGUgYW1vdW50cwogICAgLy8gIyB1c2luZyB0aGUgYWNjb3VudCdzIGFjdGl2ZSB1bml0cy4KICAgIC8vIGNsYWltYWJsZV9pbnRlcmVzdCA9IHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIGludGVyZXN0X2RlbHRhLCBwb3NpdGlvbi51bml0cywgc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgLy8gKQogICAgdW5jb3ZlciAzCiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojc2CiAgICAvLyBwcmluY2lwYWxfZGVsdGEsIHBvc2l0aW9uLnVuaXRzLCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzUtNzcKICAgIC8vIGNsYWltYWJsZV9wcmluY2lwYWwgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBwcmluY2lwYWxfZGVsdGEsIHBvc2l0aW9uLnVuaXRzLCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICAvLyApCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojc5LTgxCiAgICAvLyAjIEFjY3J1ZSB0aGUgY2xhaW1hYmxlIGFtb3VudHMgdG8gdGhlIGFjY291bnQgcG9zaXRpb24gYW5kIG1ha2UgdGhlbSBhdmFpbGFibGUKICAgIC8vICMgZm9yIHdpdGhkcmF3YWwuCiAgICAvLyBwb3NpdGlvbi5jbGFpbWFibGVfaW50ZXJlc3QgKz0gY2xhaW1hYmxlX2ludGVyZXN0CiAgICBkaWcgMgogICAgcHVzaGludCA3MwogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICArCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIHN3YXAKICAgIHJlcGxhY2UyIDczCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6ODIKICAgIC8vIHBvc2l0aW9uLmNsYWltYWJsZV9wcmluY2lwYWwgKz0gY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgZHVwCiAgICBwdXNoaW50IDgxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDIKICAgICsKICAgIGl0b2IKICAgIHJlcGxhY2UyIDgxCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6ODQtODYKICAgIC8vICMgQWR2YW5jZSB0aGUgYWNjb3VudCdzIHBlci11bml0IGZpeGVkLXBvaW50IGNoZWNrcG9pbnRzIHRvIHRoZSBjdXJyZW50IGdsb2JhbAogICAgLy8gIyBwZXItdW5pdCBmaXhlZC1wb2ludCBnbG9iYWwgaW5kaWNlcy4KICAgIC8vIHBvc2l0aW9uLmludGVyZXN0X2NoZWNrcG9pbnQgPSBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IGV4aXN0cwogICAgaXRvYgogICAgcmVwbGFjZTIgNTcKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo4NwogICAgLy8gcG9zaXRpb24ucHJpbmNpcGFsX2NoZWNrcG9pbnQgPSBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTcgLy8gImN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IGV4aXN0cwogICAgaXRvYgogICAgcmVwbGFjZTIgNjUKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo4OS05MAogICAgLy8gIyBBZHZhbmNlIHRoZSBhY2NvdW50J3MgZXZlbnQgY3Vyc29yIHRvIHRoZSBjdXJyZW50IGdsb2JhbCBldmVudCBjdXJzb3IuCiAgICAvLyBwb3NpdGlvbi5zZXR0bGVkX2N1cnNvciA9IHNlbGYuZXZlbnRfY3Vyc29yCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGl0b2IKICAgIHJlcGxhY2UyIDQ5CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6OTItOTQKICAgIC8vICMgVXBkYXRlIHRoZSBhY2NvdW50IHBvc2l0aW9uIGFuZCByZXR1cm4gdGhlIG5ld2x5IGFjY3J1ZWQgY2xhaW1hYmxlIGFtb3VudHMKICAgIC8vICMgYWRkZWQgdG8gdGhlIHRvdGFsIHBvc2l0aW9uJ3MgY2xhaW1hYmxlIGFtb3VudHMuCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHBvc2l0aW9uLmNvcHkoKQogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6OTUKICAgIC8vIHJldHVybiBjbGFpbWFibGVfaW50ZXJlc3QsIGNsYWltYWJsZV9wcmluY2lwYWwKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IHZvaWQ6Cl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojk3CiAgICAvLyBkZWYgX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQoc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg0MTIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzgKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwMAogICAgLy8gaWYgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCk6CiAgICBieiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZF9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDEKICAgIC8vIHJldHVybgogICAgcmV0c3ViCgpfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZF9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTAzCiAgICAvLyBwb3NpdGlvbiA9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNvcHkoKQogICAgZnJhbWVfZGlnIDIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwNAogICAgLy8gaWYgcG9zaXRpb24ucmVzZXJ2ZWRfdW5pdHMgPT0gVUludDY0KDApOgogICAgcHVzaGludCA0MAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICBibnogX2Vuc3VyZV91bml0c19hY3RpdmF0ZWRfYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA1CiAgICAvLyByZXR1cm4KICAgIHJldHN1YgoKX2Vuc3VyZV91bml0c19hY3RpdmF0ZWRfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwOAogICAgLy8gcG9zaXRpb24udW5pdHMgKz0gYWN0aXZhdGVkX3VuaXRzCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAzCiAgICArCiAgICBpdG9iCiAgICByZXBsYWNlMiAzMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwOQogICAgLy8gcG9zaXRpb24ucmVzZXJ2ZWRfdW5pdHMgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBpdG9iCiAgICByZXBsYWNlMiA0MAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExMAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSBwb3NpdGlvbi5jb3B5KCkKICAgIGZyYW1lX2RpZyAyCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTExCiAgICAvLyBhc3NlcnQgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCA+PSBhY3RpdmF0ZWRfdW5pdHMsIGVyci5PVkVSX0RJU1RSSUJVVElPTgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCBleGlzdHMKICAgIGR1cAogICAgZGlnIDIKICAgID49CiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IHJlbWFpbmluZyBELUFTQSB1bml0cwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExMgogICAgLy8gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCAtPSBhY3RpdmF0ZWRfdW5pdHMKICAgIHN3YXAKICAgIC0KICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fc2NhbGVkX211bF9kaXYobXVsdGlwbGljYW5kOiB1aW50NjQsIG11bHRpcGxpZXI6IHVpbnQ2NCwgZGl2aXNvcjogdWludDY0KSAtPiB1aW50NjQ6Cl9zY2FsZWRfbXVsX2RpdjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE1Ni0xNTgKICAgIC8vIGRlZiBfc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgc2VsZiwgbXVsdGlwbGljYW5kOiBVSW50NjQsIG11bHRpcGxpZXI6IFVJbnQ2NCwgZGl2aXNvcjogVUludDY0CiAgICAvLyApIC0+IFVJbnQ2NDoKICAgIHByb3RvIDMgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTYwCiAgICAvLyBpZiBtdWx0aXBsaWNhbmQgPT0gVUludDY0KDApIG9yIG11bHRpcGxpZXIgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0zCiAgICBieiBfc2NhbGVkX211bF9kaXZfaWZfYm9keUAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGJueiBfc2NhbGVkX211bF9kaXZfYWZ0ZXJfaWZfZWxzZUAzCgpfc2NhbGVkX211bF9kaXZfaWZfYm9keUAyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTYxCiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfc2NhbGVkX211bF9kaXZfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTYyCiAgICAvLyBoaWdoLCBsb3cgPSBvcC5tdWx3KG11bHRpcGxpY2FuZCwgbXVsdGlwbGllcikKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0yCiAgICBtdWx3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjMKICAgIC8vIHJldHVybiBvcC5kaXZ3KGhpZ2gsIGxvdywgZGl2aXNvcikKICAgIGZyYW1lX2RpZyAtMQogICAgZGl2dwogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Ftb3VudF90b19pbmRleF9kZWx0YShhbW91bnQ6IHVpbnQ2NCkgLT4gdWludDY0OgpfYW1vdW50X3RvX2luZGV4X2RlbHRhOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTY1CiAgICAvLyBkZWYgX2Ftb3VudF90b19pbmRleF9kZWx0YShzZWxmLCBhbW91bnQ6IFVJbnQ2NCkgLT4gVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjcKICAgIC8vIGlmIGFtb3VudCA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGJueiBfYW1vdW50X3RvX2luZGV4X2RlbHRhX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTY4CiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfYW1vdW50X3RvX2luZGV4X2RlbHRhX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2OQogICAgLy8gYXNzZXJ0IHNlbGYudG90YWxfdW5pdHMgPiBVSW50NjQoMCksIGVyci5OT19VTklUUwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIGR1cAogICAgYXNzZXJ0IC8vIE5vIEQtQVNBIHVuaXRzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNzAKICAgIC8vIHJldHVybiBzZWxmLl9zY2FsZWRfbXVsX2RpdihhbW91bnQsIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsIHNlbGYudG90YWxfdW5pdHMpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9pbmRleF9kZWx0YV90b19hbW91bnQoaW5kZXhfZGVsdGE6IHVpbnQ2NCkgLT4gdWludDY0OgpfaW5kZXhfZGVsdGFfdG9fYW1vdW50OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTcyCiAgICAvLyBkZWYgX2luZGV4X2RlbHRhX3RvX2Ftb3VudChzZWxmLCBpbmRleF9kZWx0YTogVUludDY0KSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE3OQogICAgLy8gaWYgaW5kZXhfZGVsdGEgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0xCiAgICBibnogX2luZGV4X2RlbHRhX3RvX2Ftb3VudF9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE4MAogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKX2luZGV4X2RlbHRhX3RvX2Ftb3VudF9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxODIKICAgIC8vIHNlbGYudG90YWxfdW5pdHMsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTg0CiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTgxLTE4NQogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIHNlbGYudG90YWxfdW5pdHMsCiAgICAvLyAgICAgaW5kZXhfZGVsdGEsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9nZXRfc2NoZWR1bGVfZW50cnkoZXZlbnRfaWQ6IHVpbnQ2NCkgLT4gYnl0ZXM6Cl9nZXRfc2NoZWR1bGVfZW50cnk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMDUKICAgIC8vIGRlZiBfZ2V0X3NjaGVkdWxlX2VudHJ5KHNlbGYsIGV2ZW50X2lkOiBVSW50NjQpIC0+IHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5OgogICAgcHJvdG8gMSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMDcKICAgIC8vIGFzc2VydCBldmVudF9pZCA8IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQsIGVyci5JTlZBTElEX0VWRU5UX0lECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgID4KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxOTMKICAgIC8vIHJldHVybiBldmVudF9pZCAvLyBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAxNgogICAgLwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjA5CiAgICAvLyBhc3NlcnQgcGFnZV9pbmRleCBpbiBzZWxmLnNjaGVkdWxlX3BhZ2UsIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGl0b2IKICAgIGJ5dGVjIDI0IC8vIDB4NTMyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTk3CiAgICAvLyByZXR1cm4gZXZlbnRfaWQgJSBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAxNgogICAgJQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjEyCiAgICAvLyBhc3NlcnQgb2Zmc2V0IDwgcGFnZS5sZW5ndGgsIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGludCAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZGlnIDEKICAgID4KICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIxMwogICAgLy8gcmV0dXJuIHBhZ2Vbb2Zmc2V0XS5jb3B5KCkKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgMgogICAgKwogICAgcHVzaGludCA2NQogICAgYm94X2V4dHJhY3QKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZShjb250cmFjdF90eXBlOiB1aW50NjQsIGV2ZW50X3R5cGU6IHVpbnQ2NCkgLT4gdm9pZDoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE2LTMxOAogICAgLy8gZGVmIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBzZWxmLCBjb250cmFjdF90eXBlOiBVSW50NjQsIGV2ZW50X3R5cGU6IFVJbnQ2NAogICAgLy8gKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTctMjU4CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjUwCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lFRCksCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU3LTI1OAogICAgLy8gIyBDaGVjayBjb21tb24gZXZlbnRzIGZpcnN0CiAgICAvLyBpZiBldmVudF90eXBlIGluIGNvbW1vbl9ldmVudHM6CiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjUxCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQKSwKICAgIGludGNfMiAvLyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTctMjU4CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTIKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfTUQpLAogICAgcHVzaGludCAxOQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU3LTI1OAogICAgLy8gIyBDaGVjayBjb21tb24gZXZlbnRzIGZpcnN0CiAgICAvLyBpZiBldmVudF90eXBlIGluIGNvbW1vbl9ldmVudHM6CiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjUzCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIHB1c2hpbnQgMTIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1Ny0yNTgKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1NAogICAgLy8gVUludDY0KGVudW1zLkVWVF9SUkYpLAogICAgcHVzaGludCAxMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU3LTI1OAogICAgLy8gIyBDaGVjayBjb21tb24gZXZlbnRzIGZpcnN0CiAgICAvLyBpZiBldmVudF90eXBlIGluIGNvbW1vbl9ldmVudHM6CiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VANwoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1OQogICAgLy8gcmV0dXJuIFRydWUKICAgIGludGNfMSAvLyAxCgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMyMC0zMjIKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgcmV0c3ViCgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjYxLTI2MgogICAgLy8gIyBDb250cmFjdC1zcGVjaWZpYyBhZGRpdGlvbmFsIGV2ZW50cwogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfUEFNKToKICAgIGZyYW1lX2RpZyAtMgogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2My0yNjQKICAgIC8vICMgUEFNIG9ubHkgc3VwcG9ydHMgY29tbW9uIGV2ZW50cwogICAgLy8gcmV0dXJuIEZhbHNlCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzIwLTMyMgogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjY2CiAgICAvLyBpZiBjb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9MQU0pIG9yIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDMKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNjYtMjY4CiAgICAvLyBpZiBjb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9MQU0pIG9yIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KAogICAgLy8gICAgIGVudW1zLkNUX05BTQogICAgLy8gKToKICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUAxMQogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDIKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAxNgoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlAMTE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNjktMjczCiAgICAvLyAjIExBTS9OQU0gYWRkOiBQUiwgSVBDQgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3MQogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUiksCiAgICBwdXNoaW50IDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2OS0yNzMKICAgIC8vICMgTEFNL05BTSBhZGQ6IFBSLCBJUENCCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAxMwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzIKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICBwdXNoaW50IDE4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNjktMjczCiAgICAvLyAjIExBTS9OQU0gYWRkOiBQUiwgSVBDQgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyApCiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMTQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMTM6CiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzIwLTMyMgogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF9mYWxzZUAxNDoKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMjAtMzIyCiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDE2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjc1CiAgICAvLyBpZiBjb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pOgogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDIzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzYtMjgxCiAgICAvLyAjIEFOTiBhZGRzOiBQUiwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3OAogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUiksCiAgICBwdXNoaW50IDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3Ni0yODEKICAgIC8vICMgQU5OIGFkZHM6IFBSLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyMAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzkKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICBwdXNoaW50IDE4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzYtMjgxCiAgICAvLyAjIEFOTiBhZGRzOiBQUiwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjAKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjgwCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICBwdXNoaW50IDUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3Ni0yODEKICAgIC8vICMgQU5OIGFkZHM6IFBSLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF9mYWxzZUAyMQoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyMDoKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMjAtMzIyCiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDIxOgogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMyMC0zMjIKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMjM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODMKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0xBWCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDMxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODQtMjkwCiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODYKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODQtMjkwCiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDI4CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4NwogICAgLy8gVUludDY0KGVudW1zLkVWVF9QSSksCiAgICBwdXNoaW50IDQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4NC0yOTAKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjgKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjg4CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgcHVzaGludCAxOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjg0LTI5MAogICAgLy8gIyBMQVggYWRkczogUFIsIFBJLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyOAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODkKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIHB1c2hpbnQgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjg0LTI5MAogICAgLy8gIyBMQVggYWRkczogUFIsIFBJLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF9mYWxzZUAyOQoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyODoKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMjAtMzIyCiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDI5OgogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMyMC0zMjIKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMzE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyOTIKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0NMTSk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDMzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyOTMtMjk0CiAgICAvLyAjIENMTSBhZGRzOiBQUgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QUikKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAzCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzIwLTMyMgogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAzMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI5NgogICAgLy8gcmV0dXJuIEZhbHNlCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzIwLTMyMgogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2lzX2R5bmFtaWNfYW5udWl0eSgpIC0+IHVpbnQ2NDoKX2lzX2R5bmFtaWNfYW5udWl0eToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMzOAogICAgLy8gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM4LTMzOQogICAgLy8gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICAvLyBhbmQgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBieiBfaXNfZHluYW1pY19hbm51aXR5X2Jvb2xfZmFsc2VAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM5CiAgICAvLyBhbmQgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzQgLy8gImR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMzOC0zMzkKICAgIC8vIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKQogICAgLy8gYW5kIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgYnogX2lzX2R5bmFtaWNfYW5udWl0eV9ib29sX2ZhbHNlQDMKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzctMzQwCiAgICAvLyByZXR1cm4gKAogICAgLy8gICAgIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKQogICAgLy8gICAgIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIC8vICkKICAgIHJldHN1YgoKX2lzX2R5bmFtaWNfYW5udWl0eV9ib29sX2ZhbHNlQDM6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM3LTM0MAogICAgLy8gcmV0dXJuICgKICAgIC8vICAgICBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIC8vICAgICBhbmQgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICAvLyApCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfaW50ZXJlc3Rfc2VnbWVudChlbnRyeTogYnl0ZXMpIC0+IHVpbnQ2NCwgYnl0ZXM6Cl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzgzCiAgICAvLyBkZWYgX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoc2VsZiwgZW50cnk6IHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5MgogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMTcKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5Mi0zOTQKICAgIC8vIGVudHJ5LmFjY3J1YWxfZmFjdG9yID09IFVJbnQ2NCgwKQogICAgLy8gb3Igc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPT0gVUludDY0KDApCiAgICBieiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudF9pZl9ib2R5QDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5MwogICAgLy8gb3Igc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPT0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5Mi0zOTQKICAgIC8vIGVudHJ5LmFjY3J1YWxfZmFjdG9yID09IFVJbnQ2NCgwKQogICAgLy8gb3Igc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPT0gVUludDY0KDApCiAgICBieiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudF9pZl9ib2R5QDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NAogICAgLy8gb3Igc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID09IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5Mi0zOTQKICAgIC8vIGVudHJ5LmFjY3J1YWxfZmFjdG9yID09IFVJbnQ2NCgwKQogICAgLy8gb3Igc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPT0gVUludDY0KDApCiAgICBibnogX2VudHJ5X2ludGVyZXN0X3NlZ21lbnRfYWZ0ZXJfaWZfZWxzZUA0CgpfZW50cnlfaW50ZXJlc3Rfc2VnbWVudF9pZl9ib2R5QDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozOTYKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9kaWcgLTEKICAgIHVuY292ZXIgMgogICAgcmV0c3ViCgpfZW50cnlfaW50ZXJlc3Rfc2VnbWVudF9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozOTgKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozOTkKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MDAKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozOTctNDAxCiAgICAvLyBhY2NydWVkID0gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlLAogICAgLy8gICAgIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICAvLyApCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDA1CiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDAyLTQwNgogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIGFjY3J1ZWQsCiAgICAvLyAgICAgZW50cnkuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgZnJhbWVfZGlnIC0xCiAgICB1bmNvdmVyIDIKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcihkaXNjb3VudF9mYWN0b3I6IHVpbnQ2NCwgcmVkZW1wdGlvbl9mYWN0b3I6IHVpbnQ2NCkgLT4gdWludDY0OgpfZGlzY291bnRfYW5udWl0eV9mYWN0b3I6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NjUtNDY5CiAgICAvLyBkZWYgX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yKAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgZGlzY291bnRfZmFjdG9yOiBVSW50NjQsCiAgICAvLyAgICAgcmVkZW1wdGlvbl9mYWN0b3I6IFVJbnQ2NCwKICAgIC8vICkgLT4gVUludDY0OgogICAgcHJvdG8gMiAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzEKICAgIC8vIGlmIHJlZGVtcHRpb25fZmFjdG9yID09IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMQogICAgYm56IF9kaXNjb3VudF9hbm51aXR5X2ZhY3Rvcl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3MgogICAgLy8gcmV0dXJuIGRpc2NvdW50X2ZhY3RvcgogICAgZnJhbWVfZGlnIC0yCiAgICByZXRzdWIKCl9kaXNjb3VudF9hbm51aXR5X2ZhY3Rvcl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzMKICAgIC8vIHBlcmlvZF9yYXRlID0gc2VsZi5maXhlZF9wb2ludF9zY2FsZSArIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDc0CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDczLTQ3NwogICAgLy8gcGVyaW9kX3JhdGUgPSBzZWxmLmZpeGVkX3BvaW50X3NjYWxlICsgc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgcmVkZW1wdGlvbl9mYWN0b3IsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgZGlnIDIKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICArCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzgKICAgIC8vIGFzc2VydCBwZXJpb2RfcmF0ZSA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBkdXAKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ4MQogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3OS00ODMKICAgIC8vIHJldHVybiBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBkaXNjb3VudF9mYWN0b3IsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICAgICBwZXJpb2RfcmF0ZSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5KGVudHJ5OiBieXRlcywgcGF5bG9hZDogYnl0ZXMpIC0+IGJ5dGVzLCBieXRlczoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjE2LTYxOAogICAgLy8gZGVmIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeSgKICAgIC8vICAgICBzZWxmLCBlbnRyeTogdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnksIHBheWxvYWQ6IHR5cC5PYnNlcnZlZEV2ZW50UmVxdWVzdAogICAgLy8gKSAtPiBOb25lOgogICAgcHJvdG8gMiAyCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYyNgogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X2lkID09IHNlbGYuZXZlbnRfY3Vyc29yLCBlcnIuSU5WQUxJRF9FVkVOVF9DVVJTT1IKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBjdXJzb3IKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYyNwogICAgLy8gYXNzZXJ0IGVudHJ5LnNjaGVkdWxlZF90aW1lIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLCBlcnIuTk9fRFVFX0NBU0hGTE9XCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIDw9CiAgICBhc3NlcnQgLy8gTm8gZHVlIGNhc2hmbG93IHRvIHBheQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjI5CiAgICAvLyBldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzAKICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9JRUQpOgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBkdXAKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzOAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzEtNjMzCiAgICAvLyAjIElFRCBmaW5hbGl6ZXMgaXNzdWFuY2U6IHJlc2VydmVkIHVuaXRzIGJlY29tZSBhY3RpdmF0YWJsZSBhbmQgdGhlCiAgICAvLyAjIHNjaGVkdWxlJ3MgaW5pdGlhbCBjb250cmFjdHVhbCBzdGF0ZSBiZWNvbWVzIGxpdmUuCiAgICAvLyBhc3NlcnQgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM1CiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID09IHNlbGYudG90YWxfdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYzNC02MzYKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCA9PSBzZWxmLnRvdGFsX3VuaXRzCiAgICAvLyApLCBlcnIuUFJJTUFSWV9ESVNUUklCVVRJT05fSU5DT01QTEVURQogICAgYXNzZXJ0IC8vIFByaW1hcnkgZGlzdHJpYnV0aW9uIGlzIG5vdCBjb21wbGV0ZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM3CiAgICAvLyBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9IGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYzOAogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM5CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IGVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjQwCiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0MQogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gZW50cnkubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDQxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjQyCiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NDMKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGVudW1zLlNUQVRVU19BQ1RJVkUpCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBwdXNoaW50IDEwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ1NAogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkgPT0gVUludDY0KGVudW1zLkVWVF9JRUQpLCBlcnIuTk9UX0VWVF9JRUQKICAgIGZyYW1lX2RpZyAxMQogICAgYXNzZXJ0IC8vIE5vdCBJRUQgZXZlbnQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ1NQogICAgLy8gcmV0dXJuIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMCAvLyAiaW5pdGlhbF9leGNoYW5nZV9hbW91bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NDQtNjQ4CiAgICAvLyBzZWxmLl9lbWl0X2V4ZWN1dGlvbl9ldmVudCgKICAgIC8vICAgICBlbnRyeT1lbnRyeSwKICAgIC8vICAgICBwYXlvZmY9c2VsZi5fZW50cnlfaWVkX2Ftb3VudChlbnRyeSksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NDcKICAgIC8vIHNldHRsZWRfYW1vdW50PVVJbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NDQtNjQ4CiAgICAvLyBzZWxmLl9lbWl0X2V4ZWN1dGlvbl9ldmVudCgKICAgIC8vICAgICBlbnRyeT1lbnRyeSwKICAgIC8vICAgICBwYXlvZmY9c2VsZi5fZW50cnlfaWVkX2Ftb3VudChlbnRyeSksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgY2FsbHN1YiBfZW1pdF9leGVjdXRpb25fZXZlbnQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAtMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjQ5CiAgICAvLyByZXR1cm4KICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfYnVyeSAxCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzOAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTAKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NTIKICAgIC8vIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCArPSBzZWxmLl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KGVudHJ5KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudAogICAgZnJhbWVfYnVyeSAtMgogICAgKwogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NTQKICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9SUik6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgMTIKICAgID09CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDEwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NTgKICAgIC8vIHBheWxvYWQub2JzZXJ2ZWRfcmF0ZSwKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAzMwogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1OQogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzYgLy8gInJhdGVfcmVzZXRfbXVsdGlwbGllciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjAKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NTUtNjYxCiAgICAvLyAjIFJSIGRlcml2ZXMgdGhlIG5leHQgcmF0ZSBmcm9tIGFuIG9ic2VydmVkIG9yYWNsZSB2YWx1ZSBwbHVzIHRoZQogICAgLy8gIyBjb250cmFjdCBzcHJlYWQgLyBtdWx0aXBsaWVyIHRlcm1zLCB0aGVuIGVuZm9yY2VzIGZsb29yIGFuZCBjYXAuCiAgICAvLyBvYnNlcnZlZF9yYXRlID0gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgcGF5bG9hZC5vYnNlcnZlZF9yYXRlLAogICAgLy8gICAgIHNlbGYucmF0ZV9yZXNldF9tdWx0aXBsaWVyLAogICAgLy8gICAgIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICAvLyApCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjYzCiAgICAvLyBvYnNlcnZlZF9yYXRlICsgc2VsZi5yYXRlX3Jlc2V0X3NwcmVhZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDM1IC8vICJyYXRlX3Jlc2V0X3NwcmVhZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X3NwcmVhZCBleGlzdHMKICAgICsKICAgIGZyYW1lX2J1cnkgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzQ0CiAgICAvLyBpZiBzZWxmLmhhc19yYXRlX3Jlc2V0X2Zsb29yIGFuZCByYXRlIDwgc2VsZi5yYXRlX3Jlc2V0X2Zsb29yOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDM4IC8vICJoYXNfcmF0ZV9yZXNldF9mbG9vciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5oYXNfcmF0ZV9yZXNldF9mbG9vciBleGlzdHMKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU1CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzEgLy8gInJhdGVfcmVzZXRfZmxvb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9mbG9vciBleGlzdHMKICAgIGZyYW1lX2RpZyA2CiAgICA+CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1NQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzQ1CiAgICAvLyByYXRlID0gc2VsZi5yYXRlX3Jlc2V0X2Zsb29yCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzEgLy8gInJhdGVfcmVzZXRfZmxvb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSA2CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X2Zsb29yIGV4aXN0cwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDYKICAgIC8vIGlmIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwIGFuZCByYXRlID4gc2VsZi5yYXRlX3Jlc2V0X2NhcDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzOSAvLyAiaGFzX3JhdGVfcmVzZXRfY2FwIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmhhc19yYXRlX3Jlc2V0X2NhcCBleGlzdHMKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU4CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzIgLy8gInJhdGVfcmVzZXRfY2FwIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfY2FwIGV4aXN0cwogICAgZnJhbWVfZGlnIDYKICAgIDwKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDcKICAgIC8vIHJhdGUgPSBzZWxmLnJhdGVfcmVzZXRfY2FwCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzIgLy8gInJhdGVfcmVzZXRfY2FwIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgNgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9jYXAgZXhpc3RzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1ODoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2MgogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPSBzZWxmLl9jbGFtcF9yYXRlKAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjYyLTY2NAogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPSBzZWxmLl9jbGFtcF9yYXRlKAogICAgLy8gICAgIG9ic2VydmVkX3JhdGUgKyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkCiAgICAvLyApCiAgICBmcmFtZV9kaWcgNgogICAgYXBwX2dsb2JhbF9wdXQKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc0CiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUEkpOgogICAgZnJhbWVfZGlnIDEwCiAgICBwdXNoaW50IDQKICAgID09CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDIwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzUKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc2CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAyMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4MQogICAgLy8gaWYgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCk6CiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMjkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4MgogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1BSRik6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgNQogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDMwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODYKICAgIC8vICsgKHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgLSBzZWxmLmV2ZW50X2N1cnNvcikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njg3CiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfUEVSX0VOVFJZX0JVREdFVCkKICAgIHB1c2hpbnQgMTAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODYtNjg3CiAgICAvLyArIChzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IC0gc2VsZi5ldmVudF9jdXJzb3IpCiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfUEVSX0VOVFJZX0JVREdFVCkKICAgICoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4NQogICAgLy8gVUludDY0KGNzdC5PUF9VUF9OT05fQ0FTSF9CQVNFX0JVREdFVCkKICAgIGludGMgNCAvLyAxNTAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODUtNjg3CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX05PTl9DQVNIX0JBU0VfQlVER0VUKQogICAgLy8gKyAoc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCAtIHNlbGYuZXZlbnRfY3Vyc29yKQogICAgLy8gKiBVSW50NjQoY3N0Lk9QX1VQX05PTl9DQVNIX1BFUl9FTlRSWV9CVURHRVQpCiAgICArCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODMtNjg5CiAgICAvLyBlbnN1cmVfYnVkZ2V0KAogICAgLy8gICAgIHJlcXVpcmVkX2J1ZGdldD0oCiAgICAvLyAgICAgICAgIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfQkFTRV9CVURHRVQpCiAgICAvLyAgICAgICAgICsgKHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgLSBzZWxmLmV2ZW50X2N1cnNvcikKICAgIC8vICAgICAgICAgKiBVSW50NjQoY3N0Lk9QX1VQX05PTl9DQVNIX1BFUl9FTlRSWV9CVURHRVQpCiAgICAvLyAgICAgKSwKICAgIC8vICkKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5MwogICAgLy8gZGlzY291bnRfZmFjdG9yID0gc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0OTQKICAgIC8vIGRlbm9taW5hdG9yID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0OTUKICAgIC8vIHNraXBfZmlyc3RfcmVkZW1wdGlvbiA9IEZhbHNlCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSA3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0OTcKICAgIC8vIGlmIGVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IgPiBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMjUKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgOAogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMzUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5OC01MDIKICAgIC8vICMgQW4gaW5pdGlhbCBQUkYgbWF5IGRlc2NyaWJlIHRoZSBmaXJzdCByZWRlbXB0aW9uIHBlcmlvZCBkaXJlY3RseS4KICAgIC8vIGRpc2NvdW50X2ZhY3RvciA9IHNlbGYuX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yKAogICAgLy8gICAgIGRpc2NvdW50X2ZhY3RvciwKICAgIC8vICAgICBlbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyA4CiAgICBjYWxsc3ViIF9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwNAogICAgLy8gc2tpcF9maXJzdF9yZWRlbXB0aW9uID0gVHJ1ZQogICAgaW50Y18xIC8vIDEKICAgIGZyYW1lX2J1cnkgNwogICAgZnJhbWVfYnVyeSAxCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAzNToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwNgogICAgLy8gZnV0dXJlX2V2ZW50X2lkID0gc2VsZi5ldmVudF9jdXJzb3IgKyBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X3doaWxlX3RvcEAzNjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwNwogICAgLy8gd2hpbGUgZnV0dXJlX2V2ZW50X2lkIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGZyYW1lX2RpZyAzCiAgICA+CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfd2hpbGVANDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwOAogICAgLy8gZnV0dXJlX2VudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KGZ1dHVyZV9ldmVudF9pZCkKICAgIGZyYW1lX2RpZyAzCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MDkKICAgIC8vIGZ1dHVyZV9ldmVudF90eXBlID0gZnV0dXJlX2VudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTEwLTUxMQogICAgLy8gIyBPbmx5IHJlZGVtcHRpb24tYmVhcmluZyBldmVudHMgY29udHJpYnV0ZSB0byB0aGUgYW5udWl0eSBkZW5vbWluYXRvci4KICAgIC8vIGlzX3JlZGVtcHRpb25fZXZlbnQgPSBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1BSKSBvciAoCiAgICBwdXNoaW50IDMKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTAtNTE0CiAgICAvLyAjIE9ubHkgcmVkZW1wdGlvbi1iZWFyaW5nIGV2ZW50cyBjb250cmlidXRlIHRvIHRoZSBhbm51aXR5IGRlbm9taW5hdG9yLgogICAgLy8gaXNfcmVkZW1wdGlvbl9ldmVudCA9IGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpIG9yICgKICAgIC8vICAgICBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgLy8gICAgIGFuZCBmdXR1cmVfZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKQogICAgLy8gKQogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX3RydWVANDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUxMgogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCkKICAgIGZyYW1lX2RpZyA0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTEyLTUxMwogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCkKICAgIC8vIGFuZCBmdXR1cmVfZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUxMwogICAgLy8gYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICBmcmFtZV9kaWcgMAogICAgcHVzaGludCAyNQogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUxMi01MTMKICAgIC8vIGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfTUQpCiAgICAvLyBhbmQgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IgPiBVSW50NjQoMCkKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX2ZhbHNlQDQxCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF90cnVlQDQwOgogICAgaW50Y18xIC8vIDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX21lcmdlQDQyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTE1CiAgICAvLyBpZiBpc19yZWRlbXB0aW9uX2V2ZW50OgogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANDcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUxNgogICAgLy8gaWYgc2tpcF9maXJzdF9yZWRlbXB0aW9uOgogICAgZnJhbWVfZGlnIDcKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlANDUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUxNwogICAgLy8gc2tpcF9maXJzdF9yZWRlbXB0aW9uID0gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDcKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDQ3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTI0CiAgICAvLyBmdXR1cmVfZXZlbnRfaWQgKz0gVUludDY0KDEpCiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMwogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfd2hpbGVfdG9wQDM2CgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDQ1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTIxCiAgICAvLyBmdXR1cmVfZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIGZyYW1lX2RpZyAwCiAgICBwdXNoaW50IDI1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTE5LTUyMgogICAgLy8gZGlzY291bnRfZmFjdG9yID0gc2VsZi5fZGlzY291bnRfYW5udWl0eV9mYWN0b3IoCiAgICAvLyAgICAgZGlzY291bnRfZmFjdG9yLAogICAgLy8gICAgIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDIKICAgIHN3YXAKICAgIGNhbGxzdWIgX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTIzCiAgICAvLyBkZW5vbWluYXRvciArPSBkaXNjb3VudF9mYWN0b3IKICAgIGZyYW1lX2RpZyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANDcKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX2ZhbHNlQDQxOgogICAgaW50Y18wIC8vIDAKICAgIGIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfbWVyZ2VANDIKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl93aGlsZUA0ODoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUyNgogICAgLy8gYXNzZXJ0IGRlbm9taW5hdG9yID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGZyYW1lX2RpZyAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjcKICAgIC8vIG51bWVyYXRvciA9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUyOAogICAgLy8gaWYgZW50cnkuZmxhZ3MgJiBVSW50NjQoZW51bXMuRkxBR19JTklUSUFMX1BSRikgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDU3CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18yIC8vIDgKICAgICYKICAgIGJueiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1MAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTI5LTUzMAogICAgLy8gIyBTdWJzZXF1ZW50IFBSRiBldmVudHMgYW1vcnRpemUgYm90aCBwcmluY2lwYWwgYW5kIGFscmVhZHkgYWNjcnVlZCBjYXJyeS4KICAgIC8vIG51bWVyYXRvciArPSBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICArCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1MDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUzMwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUzMS01MzUKICAgIC8vIHJldHVybiBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBudW1lcmF0b3IsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICAgICBkZW5vbWluYXRvciwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAxCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjkwCiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBzZWxmLl9yZWNhbGN1bGF0ZV9hbm51aXR5X3BheW1lbnQoCiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY5MC02OTIKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IHNlbGYuX3JlY2FsY3VsYXRlX2FubnVpdHlfcGF5bWVudCgKICAgIC8vICAgICBlbnRyeQogICAgLy8gKQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDMwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njk1CiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OTYtNzAwCiAgICAvLyBzZWxmLl9lbWl0X2V4ZWN1dGlvbl9ldmVudCgKICAgIC8vICAgICBlbnRyeT1lbnRyeSwKICAgIC8vICAgICBwYXlvZmY9VUludDY0KDApLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njk4CiAgICAvLyBwYXlvZmY9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY5OQogICAgLy8gc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OTYtNzAwCiAgICAvLyBzZWxmLl9lbWl0X2V4ZWN1dGlvbl9ldmVudCgKICAgIC8vICAgICBlbnRyeT1lbnRyeSwKICAgIC8vICAgICBwYXlvZmY9VUludDY0KDApLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGNhbGxzdWIgX2VtaXRfZXhlY3V0aW9uX2V2ZW50CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfYnVyeSAxCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAyOToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY5NAogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gZW50cnkubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDQxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAzMAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAyMDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY3NwogICAgLy8gZWxpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfSVBDQik6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgMTgKICAgID09CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAyMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc4LTY3OQogICAgLy8gIyBJUENCIGtlZXBzIHByaW5jaXBhbCB1bmNoYW5nZWQgYW5kIG9ubHkgcmVzZXRzIHRoZSBpbnRlcmVzdCBiYXNlLgogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDIzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDEwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY1CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9SUkYpOgogICAgZnJhbWVfZGlnIDEwCiAgICBwdXNoaW50IDExCiAgICA9PQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAxNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY2CiAgICAvLyBuZXh0X3JhdGUgPSBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZQogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2NwogICAgLy8gaWYgbmV4dF9yYXRlID09IFVJbnQ2NCgwKToKICAgIGJueiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAxMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY4CiAgICAvLyBuZXh0X3JhdGUgPSBzZWxmLnJhdGVfcmVzZXRfbmV4dAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDM3IC8vICJyYXRlX3Jlc2V0X25leHQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSA1CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X25leHQgZXhpc3RzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2OQogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPSBuZXh0X3JhdGUKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGZyYW1lX2RpZyA1CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAxOAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAxNDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY3MQogICAgLy8gaWYgZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUgIT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDkKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzIKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGZyYW1lX2RpZyA5CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAxOAoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbWl0X2V4ZWN1dGlvbl9ldmVudChlbnRyeTogYnl0ZXMsIHBheW9mZjogdWludDY0LCBzZXR0bGVkX2Ftb3VudDogdWludDY0KSAtPiBieXRlczoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzA2LTcxMgogICAgLy8gZGVmIF9lbWl0X2V4ZWN1dGlvbl9ldmVudCgKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgICosCiAgICAvLyAgICAgZW50cnk6IHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5LAogICAgLy8gICAgIHBheW9mZjogVUludDY0LAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50OiBVSW50NjQsCiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAzIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxNgogICAgLy8gY29udHJhY3RfaWQ9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25faWQuaWQsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uSUQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxNwogICAgLy8gZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE4CiAgICAvLyBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICBmcmFtZV9kaWcgLTMKICAgIGV4dHJhY3QgOCAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTkKICAgIC8vIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgZnJhbWVfZGlnIC0zCiAgICBleHRyYWN0IDkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIwCiAgICAvLyBhcHBsaWVkX2F0PUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIzCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBmcmFtZV9kaWcgLTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxOAogICAgLy8gZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgaW50Y18yIC8vIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcyMwogICAgLy8gc2VsZi5fcGF5b2ZmX3NpZ24oZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSwgcGF5b2ZmKQogICAgZ2V0Ynl0ZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzUyCiAgICAvLyBpZiBwYXlvZmYgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0yCiAgICBibnogX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzUzCiAgICAvLyByZXR1cm4gVUludDY0KGVudW1zLlBBWU9GRl9TSUdOX1BPU0lUSVZFKQogICAgaW50Y18xIC8vIDEKCl9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9wYXlvZmZfc2lnbkA3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIyLTcyNAogICAgLy8gcGF5b2ZmX3NpZ249YXJjNC5VSW50OCgKICAgIC8vICAgICBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICAvLyApLAogICAgaXRvYgogICAgZHVwCiAgICBiaXRsZW4KICAgIGludGNfMiAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBleHRyYWN0IDcgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzI2CiAgICAvLyBjdXJyZW5jeV9pZD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcyNwogICAgLy8gc2VxdWVuY2U9ZW50cnkuZXZlbnRfaWQgKyBVSW50NjQoMSksCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE1LTcyOAogICAgLy8gRXhlY3V0aW9uRXZlbnQoCiAgICAvLyAgICAgY29udHJhY3RfaWQ9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25faWQuaWQsCiAgICAvLyAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgcGF5b2ZmPXBheW9mZiwKICAgIC8vICAgICBwYXlvZmZfc2lnbj1hcmM0LlVJbnQ4KAogICAgLy8gICAgICAgICBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBzZXR0bGVkX2Ftb3VudD1zZXR0bGVkX2Ftb3VudCwKICAgIC8vICAgICBjdXJyZW5jeV9pZD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgc2VxdWVuY2U9ZW50cnkuZXZlbnRfaWQgKyBVSW50NjQoMSksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMAogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAyCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAzCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyA0CiAgICBpdG9iCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMgogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxNC03MjkKICAgIC8vIGFyYzQuZW1pdCgKICAgIC8vICAgICBFeGVjdXRpb25FdmVudCgKICAgIC8vICAgICAgICAgY29udHJhY3RfaWQ9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25faWQuaWQsCiAgICAvLyAgICAgICAgIGV2ZW50X2lkPWVudHJ5LmV2ZW50X2lkLAogICAgLy8gICAgICAgICBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICAvLyAgICAgICAgIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgICAgICBhcHBsaWVkX2F0PUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gICAgICAgICBwYXlvZmY9cGF5b2ZmLAogICAgLy8gICAgICAgICBwYXlvZmZfc2lnbj1hcmM0LlVJbnQ4KAogICAgLy8gICAgICAgICAgICAgc2VsZi5fcGF5b2ZmX3NpZ24oZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSwgcGF5b2ZmKQogICAgLy8gICAgICAgICApLAogICAgLy8gICAgICAgICBzZXR0bGVkX2Ftb3VudD1zZXR0bGVkX2Ftb3VudCwKICAgIC8vICAgICAgICAgY3VycmVuY3lfaWQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgICAgICBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIC8vICAgICApCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHg5YTMzMmI5NSAvLyBtZXRob2QgIkV4ZWN1dGlvbkV2ZW50KHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NTQKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gKFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwgVUludDY0KGVudW1zLkVWVF9QSSkpOgogICAgZnJhbWVfZGlnIDUKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYm56IF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9pZl9ib2R5QDUKICAgIGZyYW1lX2RpZyA1CiAgICBwdXNoaW50IDQKICAgID09CiAgICBieiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUA2CgpfZW1pdF9leGVjdXRpb25fZXZlbnRfaWZfYm9keUA1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzU1CiAgICAvLyByZXR1cm4gVUludDY0KGVudW1zLlBBWU9GRl9TSUdOX1BPU0lUSVZFKQogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcyMwogICAgLy8gc2VsZi5fcGF5b2ZmX3NpZ24oZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSwgcGF5b2ZmKQogICAgYiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fcGF5b2ZmX3NpZ25ANwoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc1NgogICAgLy8gcmV0dXJuIFVJbnQ2NChlbnVtcy5QQVlPRkZfU0lHTl9ORUdBVElWRSkKICAgIHB1c2hpbnQgMjU1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MjMKICAgIC8vIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIGIgX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX3BheW9mZl9zaWduQDcKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fcm9sZV9pc19hY3RpdmUocm9sZV9tYXA6IGJ5dGVzLCByb2xlX2FkZHJlc3M6IGJ5dGVzKSAtPiB1aW50NjQ6Cl9yb2xlX2lzX2FjdGl2ZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NwogICAgLy8gZGVmIF9yb2xlX2lzX2FjdGl2ZShzZWxmLCByb2xlX21hcDogdHlwLlJiYWNSb2xlLCByb2xlX2FkZHJlc3M6IEFjY291bnQpIC0+IGJvb2w6CiAgICBwcm90byAyIDEKICAgIHB1c2hieXRlcyAiIgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU4LTYyCiAgICAvLyByZXR1cm4gc2VsZi5faGFzX3JvbGUocm9sZV9tYXAsIHJvbGVfYWRkcmVzcykgYW5kICgKICAgIC8vICAgICByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICkKICAgIGJ6IF9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIEJveE1hcCBlbnRyeSBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYwCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MAogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgPD0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYxCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIEJveE1hcCBlbnRyeSBleGlzdHMKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYwLTYxCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDAKICAgID49CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTktNjEKICAgIC8vIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IF9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQKICAgIGludGNfMSAvLyAxCgpfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU4LTYyCiAgICAvLyByZXR1cm4gc2VsZi5faGFzX3JvbGUocm9sZV9tYXAsIHJvbGVfYWRkcmVzcykgYW5kICgKICAgIC8vICAgICByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICkKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgX3JvbGVfaXNfYWN0aXZlX2Jvb2xfbWVyZ2VANQoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkgLT4gdm9pZDoKX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjUKICAgIC8vIGFzc2VydCBzZWxmLl9pc19hcnJhbmdlcihUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjUyCiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzID09IHNlbGYuYXJyYW5nZXIudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOCAvLyAweDUyM2E0MTUyNTIyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgPT0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2NQogICAgLy8gYXNzZXJ0IHNlbGYuX2lzX2FycmFuZ2VyKFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpIC0+IHZvaWQ6Cl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4MwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFzc2V0X2RlZmF1bHRlZCwgZXJyLkRFRkFVTFRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQxIC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfZGVmYXVsdGVkIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIERlZmF1bHRlZAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkgLT4gdm9pZDoKX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg2CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYXNzZXRfc3VzcGVuZGVkLCBlcnIuU1VTUEVOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzMgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9zdXNwZW5kZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gU3VzcGVuZGVkIG9wZXJhdGlvbnMKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkOiB1aW50NjQpIC0+IHZvaWQ6Cl9hc3NlcnRfdmFsaWRfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OAogICAgLy8gZGVmIF9hc3NlcnRfdmFsaWRfcm9sZShzZWxmLCByb2xlX2lkOiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTAKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIHB1c2hpbnQgMjAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkxCiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgcHVzaGludCAyNQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTIKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICBwdXNoaW50IDQwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MwogICAgLy8gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgcHVzaGludCA1MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTQKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgcHVzaGludCA2MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTUKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICBwdXNoaW50IDcwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NgogICAgLy8gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgcHVzaGludCA4MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfZmFsc2VAOAoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3OgogICAgaW50Y18xIC8vIDEKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX21lcmdlQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgcmV0c3ViCgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9mYWxzZUA4OgogICAgaW50Y18wIC8vIDAKICAgIGIgX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfbWVyZ2VAOQo=", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCAzMiAxNTAwCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUgInN0YXR1cyIgImV2ZW50X2N1cnNvciIgInNjaGVkdWxlX2VudHJ5X2NvdW50IiAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIiAiZml4ZWRfcG9pbnRfc2NhbGUiICJhY2NydWVkX2ludGVyZXN0IiAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIgMHg0MTIzICJub21pbmFsX2ludGVyZXN0X3JhdGUiICJjb250cmFjdF90eXBlIiAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiICJyZXNlcnZlZF9wcmluY2lwYWwiICJ0b3RhbF91bml0cyIgIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iICJyZXNlcnZlZF9pbnRlcmVzdCIgImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIgMHg1MjNhNDE1MjUyMjMgInNldHRsZW1lbnRfYXNzZXRfaWQiICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIgMHg1MjNhNDE1NTU0MjMgMHg1MjNhNTA1OTQ0MjMgMHg1MjNhNGQ0ZTQ3MjMgMHg1MzIzIDB4NTIzYTRkNGY0MzIzIDB4NTIzYTU0NTI1MzIzIDB4NTIzYTRmNTA0NDIzICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiICJ0cmFuc2Zlcl9vcGVuaW5nX2RhdGUiICJ0cmFuc2Zlcl9jbG9zdXJlX2RhdGUiICJyYXRlX3Jlc2V0X2Zsb29yIiAicmF0ZV9yZXNldF9jYXAiICJjb250cmFjdF9zdXNwZW5kZWQiICJkZWZhdWx0ZWQiICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIiAicmF0ZV9yZXNldF9zcHJlYWQiICJyYXRlX3Jlc2V0X211bHRpcGxpZXIiICJyYXRlX3Jlc2V0X25leHQiICJoYXNfcmF0ZV9yZXNldF9mbG9vciIgImhhc19yYXRlX3Jlc2V0X2NhcCIgMHgwMCAicHJvc3BlY3R1c19oYXNoIiAicHJvc3BlY3R1c191cmwiICJkZW5vbWluYXRpb25fYXNzZXRfaWQiICJtYXR1cml0eV9kYXRlIiAiZGF5X2NvdW50X2NvbnZlbnRpb24iIDB4MDY4MTAxIDB4MDAwMAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4LTI5CiAgICAvLyAjIFJCQUMgUm9sZXMKICAgIC8vIHNlbGYuYXJyYW5nZXIgPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX0FSUkFOR0VSKQogICAgYnl0ZWMgMTggLy8gMHg1MjNhNDE1MjUyMjMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMAogICAgLy8gc2VsZi5vcF9kYWVtb24gPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX09QX0RBRU1PTikKICAgIGJ5dGVjIDI3IC8vIDB4NTIzYTRmNTA0NDIzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NDctNDgKICAgIC8vICMgQ29udHJhY3QgR292ZXJuYW5jZQogICAgLy8gc2VsZi5jb250cmFjdF9zdXNwZW5kZWQgPSBGYWxzZQogICAgYnl0ZWMgMzMgLy8gImNvbnRyYWN0X3N1c3BlbmRlZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjUwLTUxCiAgICAvLyAjIENvbnRyYWN0IFBlcmZvcm1hbmNlCiAgICAvLyBzZWxmLmRlZmF1bHRlZCA9IEZhbHNlCiAgICBieXRlYyAzNCAvLyAiZGVmYXVsdGVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1Ni01NwogICAgLy8gIyBDb250cmFjdAogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKQogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OAogICAgLy8gc2VsZi5jb250cmFjdF90eXBlID0gVUludDY0KCkKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MC02MQogICAgLy8gIyBQcm9zcGVjdHVzIChJbmZvcm1hdGlvbmFsKQogICAgLy8gc2VsZi5wcm9zcGVjdHVzX2hhc2ggPSBCeXRlcygpCiAgICBieXRlYyA0MiAvLyAicHJvc3BlY3R1c19oYXNoIgogICAgcHVzaGJ5dGVzIDB4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjIKICAgIC8vIHNlbGYucHJvc3BlY3R1c191cmwgPSBTdHJpbmcoKQogICAgYnl0ZWMgNDMgLy8gInByb3NwZWN0dXNfdXJsIgogICAgcHVzaGJ5dGVzICIiCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjQtNjUKICAgIC8vICMgRGVub21pbmF0aW9uCiAgICAvLyBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCA9IEFzc2V0KCkKICAgIGJ5dGVjIDQ0IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBBc3NldCgpCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjgtNjkKICAgIC8vICMgVGltZQogICAgLy8gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGUgPSB0eXAuVGltZVN0YW1wKCkKICAgIGJ5dGVjIDI4IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcwCiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSB0eXAuVGltZVN0YW1wKCkKICAgIGJ5dGVjIDQ1IC8vICJtYXR1cml0eV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MQogICAgLy8gc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgPSB0eXAuVGltZVN0YW1wKCkKICAgIGJ5dGVjIDI5IC8vICJ0cmFuc2Zlcl9vcGVuaW5nX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcyCiAgICAvLyBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgMzAgLy8gInRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzQtNzUKICAgIC8vICMgRGF5IENvdW50IENvbnZlbnRpb24KICAgIC8vIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPSBVSW50NjQoKQogICAgYnl0ZWMgNDYgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3Ny03OAogICAgLy8gIyBVbml0cwogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IFVJbnQ2NCgpCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc5CiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID0gVUludDY0KCkKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODEtODIKICAgIC8vICMgUHJpbmNpcGFsCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID0gVUludDY0KCkKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODMKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gVUludDY0KCkKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODUKICAgIC8vIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiA9IEZhbHNlCiAgICBieXRlYyAzNSAvLyAiZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODctODgKICAgIC8vICMgSW50ZXJlc3QKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OQogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ID0gVUludDY0KCkKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkxLTkyCiAgICAvLyAjIEludGVyZXN0IFJhdGVzCiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzCiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkID0gVUludDY0KCkKICAgIGJ5dGVjIDM2IC8vICJyYXRlX3Jlc2V0X3NwcmVhZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9tdWx0aXBsaWVyID0gVUludDY0KCkKICAgIGJ5dGVjIDM3IC8vICJyYXRlX3Jlc2V0X211bHRpcGxpZXIiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfZmxvb3IgPSBVSW50NjQoKQogICAgYnl0ZWMgMzEgLy8gInJhdGVfcmVzZXRfZmxvb3IiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfY2FwID0gVUludDY0KCkKICAgIGJ5dGVjIDMyIC8vICJyYXRlX3Jlc2V0X2NhcCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTcKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9uZXh0ID0gVUludDY0KCkKICAgIGJ5dGVjIDM4IC8vICJyYXRlX3Jlc2V0X25leHQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4CiAgICAvLyBzZWxmLmhhc19yYXRlX3Jlc2V0X2Zsb29yID0gRmFsc2UKICAgIGJ5dGVjIDM5IC8vICJoYXNfcmF0ZV9yZXNldF9mbG9vciIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTkKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwID0gRmFsc2UKICAgIGJ5dGVjIDQwIC8vICJoYXNfcmF0ZV9yZXNldF9jYXAiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMS0xMDIKICAgIC8vICMgUHJpbWFyeSBEaXN0cmlidXRpb24KICAgIC8vIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsID0gVUludDY0KCkKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMwogICAgLy8gc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNS0xMDYKICAgIC8vICMgQ3VtdWxhdGl2ZSBQZXItVW5pdCBGaXhlZC1Qb2ludCBJbmRleGVzCiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggPSBVSW50NjQoKQogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNwogICAgLy8gc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNQogICAgLy8gc2VsZi5ldmVudF9jdXJzb3IgPSBVSW50NjQoKQogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTYKICAgIC8vIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgPSBVSW50NjQoKQogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExOC0xMTkKICAgIC8vICMgU2NhbGluZwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjIzCiAgICAvLyBhc3NlcnQgVHhuLmdsb2JhbF9udW1fYnl0ZV9zbGljZSA9PSBjZmcuR0xPQkFMX0JZVEVTLCBlcnIuV1JPTkdfR0xPQkFMX0JZVEVTCiAgICB0eG4gR2xvYmFsTnVtQnl0ZVNsaWNlCiAgICBwdXNoaW50IDEwCiAgICA9PQogICAgYXNzZXJ0IC8vIFdyb25nIEdsb2JhbCBCeXRlcyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6MjQKICAgIC8vIGFzc2VydCBUeG4uZ2xvYmFsX251bV91aW50ID09IGNmZy5HTE9CQUxfVUlOVFMsIGVyci5XUk9OR19HTE9CQUxfVUlOVFMKICAgIHR4biBHbG9iYWxOdW1VaW50CiAgICBwdXNoaW50IDU0CiAgICA9PQogICAgYXNzZXJ0IC8vIFdyb25nIEdsb2JhbCBVSW50cyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6MjUKICAgIC8vIGFzc2VydCBUeG4ubG9jYWxfbnVtX2J5dGVfc2xpY2UgPT0gY2ZnLkxPQ0FMX0JZVEVTLCBlcnIuV1JPTkdfTE9DQUxfQllURVMKICAgIHR4biBMb2NhbE51bUJ5dGVTbGljZQogICAgIQogICAgYXNzZXJ0IC8vIFdyb25nIExvY2FsIEJ5dGVzIGFsbG9jYXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kX2FzYS9jb250cmFjdC5weToyNgogICAgLy8gYXNzZXJ0IFR4bi5sb2NhbF9udW1fdWludCA9PSBjZmcuTE9DQUxfVUlOVFMsIGVyci5XUk9OR19MT0NBTF9VSU5UUwogICAgdHhuIExvY2FsTnVtVWludAogICAgIQogICAgYXNzZXJ0IC8vIFdyb25nIExvY2FsIFVJbnRzIGFsbG9jYXRpb24KCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjgtMTgKICAgIC8vIGNsYXNzIERBU0EoCiAgICAvLyAgICAgUGF5bWVudEFnZW50LAogICAgLy8gICAgIFRyYW5zZmVyQWdlbnQsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyAgICAgYXZtX3ZlcnNpb249MTIsCiAgICAvLyApOgogICAgcHVzaGJ5dGVzIDB4OTE0ZjA0ZWIgLy8gbWV0aG9kICJjb250cmFjdF91cGRhdGUoKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX2NvbnRyYWN0X3VwZGF0ZV9yb3V0ZUA0CgptYWluX3N3aXRjaF9jYXNlX25leHRANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kX2FzYS9jb250cmFjdC5weTo4LTE4CiAgICAvLyBjbGFzcyBEQVNBKAogICAgLy8gICAgIFBheW1lbnRBZ2VudCwKICAgIC8vICAgICBUcmFuc2ZlckFnZW50LAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gICAgIGF2bV92ZXJzaW9uPTEyLAogICAgLy8gKToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJ6IG1haW5fY3JlYXRlX05vT3BAMzMKICAgIHB1c2hieXRlc3MgMHhiNDQ2MThjOCAweGU3ODMyNTI5IDB4OTQzODg3MjMgMHg2Yzg1ZTNlZSAweGJkZDFhOTQ0IDB4N2MwZjE4MTIgMHgxNGZjMTBlZiAweDc0YTcyOTdmIDB4MDlkNGZlMTQgMHg5YTliZmE4NSAweDg1ZWVkMzNkIDB4YWIyYzBmYzQgMHhkOWYyMjVhYyAweDk4ODM1MDVhIDB4OGVhNmU3NGMgMHgwMmFmNTU3YSAweDgyZjcxYjJkIDB4ZWYwNGY1ZDMgMHhkZjM0MzU1MCAweDNkYmU4MGJkIDB4MWUzZTQ4ZTcgMHgzOTI0MWZhMyAweDAxMGM4Mjk5IDB4NzQwNmFjZDIgMHgxYTcyYTJlZSAvLyBtZXRob2QgImZ1bmRfZHVlX2Nhc2hmbG93cyh1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJjbGFpbV9kdWVfY2FzaGZsb3dzKGFkZHJlc3MsYnl0ZVtdKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYnl0ZVtdKSIsIG1ldGhvZCAidHJhbnNmZXJfc2V0X3NjaGVkdWxlKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbihhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInRyYW5zZmVyKGFkZHJlc3MsYWRkcmVzcyx1aW50NjQpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X3N1c3BlbnNpb24oYWRkcmVzcyxib29sKXVpbnQ2NCIsIG1ldGhvZCAiYWNjb3VudF9vcGVuKGFkZHJlc3MsYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgImFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzcyhhZGRyZXNzLGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X2dldF9wb3NpdGlvbihhZGRyZXNzKShhZGRyZXNzLHVpbnQ2NCx1aW50NjQsYm9vbCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAiY29udHJhY3RfY29uZmlnKCh1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxib29sLGJvb2wsYm9vbCx1aW50NjQpLCh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCksKGJ5dGVbMzJdLHN0cmluZykpdWludDY0IiwgbWV0aG9kICJjb250cmFjdF9zY2hlZHVsZSh1aW50NjQsYm9vbCwodWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NClbXSl1aW50NjQiLCBtZXRob2QgImNvbnRyYWN0X2V4ZWN1dGVfaWVkKCl1aW50NjQiLCBtZXRob2QgImFwcGx5X25vbl9jYXNoX2V2ZW50KHVpbnQ2NCwodWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIsIG1ldGhvZCAiYXBwZW5kX29ic2VydmVkX2Nhc2hfZXZlbnQoKHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIsIG1ldGhvZCAiY29udHJhY3RfZ2V0X3N0YXRlKCkodWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudCgpKHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJyYmFjX3JvdGF0ZV9hcnJhbmdlcihhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19zZXRfb3BfZGFlbW9uKGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX2Fzc2lnbl9yb2xlKHVpbnQ4LGFkZHJlc3MsKHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19yZXZva2Vfcm9sZSh1aW50OCxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19jb250cmFjdF9zdXNwZW5zaW9uKGJvb2wpdWludDY0IiwgbWV0aG9kICJyYmFjX2NvbnRyYWN0X2RlZmF1bHQoYm9vbCl1aW50NjQiLCBtZXRob2QgInJiYWNfZ2V0X2FycmFuZ2VyKClhZGRyZXNzIiwgbWV0aG9kICJyYmFjX2dldF9hZGRyZXNzX3JvbGVzKGFkZHJlc3MpKGJvb2wsYm9vbCxib29sLGJvb2wsYm9vbCkiLCBtZXRob2QgInJiYWNfZ2V0X3JvbGVfdmFsaWRpdHkodWludDgsYWRkcmVzcykodWludDY0LHVpbnQ2NCkiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBmdW5kX2R1ZV9jYXNoZmxvd3MgY2xhaW1fZHVlX2Nhc2hmbG93cyB0cmFuc2Zlcl9zZXRfc2NoZWR1bGUgcHJpbWFyeV9kaXN0cmlidXRpb24gdHJhbnNmZXIgYWNjb3VudF9zdXNwZW5zaW9uIGFjY291bnRfb3BlbiBhY2NvdW50X3VwZGF0ZV9wYXltZW50X2FkZHJlc3MgYWNjb3VudF9nZXRfcG9zaXRpb24gY29udHJhY3RfY29uZmlnIGNvbnRyYWN0X3NjaGVkdWxlIGNvbnRyYWN0X2V4ZWN1dGVfaWVkIGFwcGx5X25vbl9jYXNoX2V2ZW50IGFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50IGNvbnRyYWN0X2dldF9zdGF0ZSBjb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnQgcmJhY19yb3RhdGVfYXJyYW5nZXIgcmJhY19zZXRfb3BfZGFlbW9uIHJiYWNfYXNzaWduX3JvbGUgcmJhY19yZXZva2Vfcm9sZSByYmFjX2NvbnRyYWN0X3N1c3BlbnNpb24gcmJhY19jb250cmFjdF9kZWZhdWx0IHJiYWNfZ2V0X2FycmFuZ2VyIHJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXMgcmJhY19nZXRfcm9sZV92YWxpZGl0eQogICAgZXJyCgptYWluX2NyZWF0ZV9Ob09wQDMzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjgtMTgKICAgIC8vIGNsYXNzIERBU0EoCiAgICAvLyAgICAgUGF5bWVudEFnZW50LAogICAgLy8gICAgIFRyYW5zZmVyQWdlbnQsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyAgICAgYXZtX3ZlcnNpb249MTIsCiAgICAvLyApOgogICAgcHVzaGJ5dGVzIDB4OTU2ZDcxNTYgLy8gbWV0aG9kICJjb250cmFjdF9jcmVhdGUoYWRkcmVzcyl1aW50NjQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBjb250cmFjdF9jcmVhdGUKICAgIGVycgoKbWFpbl9jb250cmFjdF91cGRhdGVfcm91dGVANDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgNCAvLyBVcGRhdGVBcHBsaWNhdGlvbgogICAgPT0KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0CiAgICBiIGNvbnRyYWN0X3VwZGF0ZQoKCi8vIF9wdXlhX2xpYi51dGlsLmVuc3VyZV9idWRnZXQocmVxdWlyZWRfYnVkZ2V0OiB1aW50NjQsIGZlZV9zb3VyY2U6IHVpbnQ2NCkgLT4gdm9pZDoKZW5zdXJlX2J1ZGdldDoKICAgIHByb3RvIDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDEwCiAgICArCgplbnN1cmVfYnVkZ2V0X3doaWxlX3RvcEAxOgogICAgZnJhbWVfZGlnIDAKICAgIGdsb2JhbCBPcGNvZGVCdWRnZXQKICAgID4KICAgIGJ6IGVuc3VyZV9idWRnZXRfYWZ0ZXJfd2hpbGVANgogICAgaXR4bl9iZWdpbgogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGJ5dGVjIDQ3IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbQogICAgYnl0ZWMgNDcgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KICAgIGZyYW1lX2RpZyAtMQogICAgc3dpdGNoIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMEAzIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMUA0CgplbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX25leHRANToKICAgIGl0eG5fc3VibWl0CiAgICBiIGVuc3VyZV9idWRnZXRfd2hpbGVfdG9wQDEKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMUA0OgogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgaXR4bl9maWVsZCBGZWUKICAgIGIgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV9uZXh0QDUKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMEAzOgogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBiIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfbmV4dEA1CgplbnN1cmVfYnVkZ2V0X2FmdGVyX3doaWxlQDY6CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnBheW1lbnRfYWdlbnQuUGF5bWVudEFnZW50LmZ1bmRfZHVlX2Nhc2hmbG93c1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmZ1bmRfZHVlX2Nhc2hmbG93czoKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gMTMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjY4CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2OQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3MAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDcKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzIKICAgIC8vIGlmIHNlbGYuX2lzX2R5bmFtaWNfYW5udWl0eSgpOgogICAgY2FsbHN1YiBfaXNfZHluYW1pY19hbm51aXR5CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzYtNzcKICAgIC8vICsgbWF4X2V2ZW50X2NvdW50CiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfRlVORF9EVUVfQ0FTSEZMT1dTX1BFUl9FVkVOVF9CVURHRVQpCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3NwogICAgLy8gKiBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19QRVJfRVZFTlRfQlVER0VUKQogICAgcHVzaGludCAxMDAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3Ni03NwogICAgLy8gKyBtYXhfZXZlbnRfY291bnQKICAgIC8vICogVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfUEVSX0VWRU5UX0JVREdFVCkKICAgICoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3NQogICAgLy8gVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfQkFTRV9CVURHRVQpCiAgICBpbnRjIDQgLy8gMTUwMAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojc1LTc3CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19CQVNFX0JVREdFVCkKICAgIC8vICsgbWF4X2V2ZW50X2NvdW50CiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfRlVORF9EVUVfQ0FTSEZMT1dTX1BFUl9FVkVOVF9CVURHRVQpCiAgICArCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzMtNzkKICAgIC8vIGVuc3VyZV9idWRnZXQoCiAgICAvLyAgICAgcmVxdWlyZWRfYnVkZ2V0PSgKICAgIC8vICAgICAgICAgVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfQkFTRV9CVURHRVQpCiAgICAvLyAgICAgICAgICsgbWF4X2V2ZW50X2NvdW50CiAgICAvLyAgICAgICAgICogVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfUEVSX0VWRU5UX0JVREdFVCkKICAgIC8vICAgICApLAogICAgLy8gKQogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4MQogICAgLy8gcHJvY2Vzc2VkX2V2ZW50cyA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjgyCiAgICAvLyBmdW5kZWRfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDE0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODMKICAgIC8vIGZ1bmRlZF9wcmluY2lwYWwgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDEzCgpmdW5kX2R1ZV9jYXNoZmxvd3Nfd2hpbGVfdG9wQDQ6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODYKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgPCBtYXhfZXZlbnRfY291bnQKICAgIGRpZyA0CiAgICBkaWcgMQogICAgPAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojg2LTg3CiAgICAvLyBwcm9jZXNzZWRfZXZlbnRzIDwgbWF4X2V2ZW50X2NvdW50CiAgICAvLyBhbmQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAMTEKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4NwogICAgLy8gYW5kIHNlbGYuZXZlbnRfY3Vyc29yIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICA8CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODYtODcKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgPCBtYXhfZXZlbnRfY291bnQKICAgIC8vIGFuZCBzZWxmLmV2ZW50X2N1cnNvciA8IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQKICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl93aGlsZUAxMQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojg5CiAgICAvLyBlbnRyeSA9IHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLmV2ZW50X2N1cnNvcikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICBkdXAKICAgIGJ1cnkgMTcKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5MAogICAgLy8gaWYgZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcDoKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSAzCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDExCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6OTIKICAgIC8vIGlmIG5vdCBzZWxmLl9ldmVudF9pc19jYXNoKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkpOgogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBidXJ5IDE2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNTEKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgaW50Y18yIC8vIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM1MC0zNTQKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX01EKSwKICAgIC8vICkKICAgID09CiAgICBkdXAKICAgIGJ1cnkgNAogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX3RydWVANTIKICAgIGRpZyAxNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzUyCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzUwLTM1NAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfTUQpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDUyCiAgICBkaWcgMTQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM1MwogICAgLy8gVUludDY0KGVudW1zLkVWVF9NRCksCiAgICBwdXNoaW50IDE5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNTAtMzU0CiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9NRCksCiAgICAvLyApCiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VANTMKCmZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX3RydWVANTI6CiAgICBpbnRjXzEgLy8gMQoKZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfbWVyZ2VANTQ6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6OTIKICAgIC8vIGlmIG5vdCBzZWxmLl9ldmVudF9pc19jYXNoKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkpOgogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NDgKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF9pZCA9PSBzZWxmLmV2ZW50X2N1cnNvciwgZXJyLklOVkFMSURfRVZFTlRfQ1VSU09SCiAgICBkaWcgMTUKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgY3Vyc29yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NDkKICAgIC8vIGFzc2VydCBlbnRyeS5zY2hlZHVsZWRfdGltZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwgZXJyLk5PX0RVRV9DQVNIRkxPVwogICAgZGlnIDEKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIDw9CiAgICBhc3NlcnQgLy8gTm8gZHVlIGNhc2hmbG93IHRvIHBheQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDEzCiAgICAvLyBpZiBldmVudF90eXBlIG5vdCBpbiAoVUludDY0KGVudW1zLkVWVF9JUCksIFVJbnQ2NChlbnVtcy5FVlRfTUQpKToKICAgIGRpZyAyCiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTUKICAgIGRpZyAxNAogICAgcHVzaGludCAxOQogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDE0CiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAxMQoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X2ludGVyZXN0X2Ftb3VudEAxNjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQyNgogICAgLy8gZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGRpZyAxNQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSAxNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDI3CiAgICAvLyBpZiBldmVudF90eXBlIG5vdCBpbiAoVUludDY0KGVudW1zLkVWVF9QUiksIFVJbnQ2NChlbnVtcy5FVlRfTUQpKToKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxOQogICAgZGlnIDE0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MjgKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDYKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTUzCiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA9IGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBkaWcgMTUKICAgIHB1c2hpbnQgNDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBidXJ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1NgogICAgLy8gaWYgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCk6CiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUAyOQogICAgZGlnIDcKICAgIGJ1cnkgOQoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzItNTc0CiAgICAvLyAjIEZ1bmRpbmcgdXNlcyBwZXItdW5pdCBjdW11bGF0aXZlIGluZGljZXMgc28gZWFjaCBob2xkZXIgY2FuIHNldHRsZQogICAgLy8gIyBpbmRlcGVuZGVudGx5IGZyb20gaXRzIGN1cnJlbnQgdW5pdCBiYWxhbmNlLgogICAgLy8gaW50ZXJlc3RfaW5kZXhfZGVsdGEgPSBzZWxmLl9hbW91bnRfdG9faW5kZXhfZGVsdGEoaW50ZXJlc3RfYW1vdW50X2R1ZSkKICAgIGRpZyAxMAogICAgY2FsbHN1YiBfYW1vdW50X3RvX2luZGV4X2RlbHRhCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzUKICAgIC8vIHByaW5jaXBhbF9pbmRleF9kZWx0YSA9IHNlbGYuX2Ftb3VudF90b19pbmRleF9kZWx0YShwcmluY2lwYWxfYW1vdW50X2R1ZSkKICAgIGRpZyA2CiAgICBjYWxsc3ViIF9hbW91bnRfdG9faW5kZXhfZGVsdGEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU3NgogICAgLy8gaW50ZXJlc3RfYW1vdW50ID0gc2VsZi5faW5kZXhfZGVsdGFfdG9fYW1vdW50KGludGVyZXN0X2luZGV4X2RlbHRhKQogICAgZGlnIDEKICAgIGNhbGxzdWIgX2luZGV4X2RlbHRhX3RvX2Ftb3VudAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBidXJ5IDE1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzcKICAgIC8vIHByaW5jaXBhbF9hbW91bnQgPSBzZWxmLl9pbmRleF9kZWx0YV90b19hbW91bnQocHJpbmNpcGFsX2luZGV4X2RlbHRhKQogICAgZHVwCiAgICBjYWxsc3ViIF9pbmRleF9kZWx0YV90b19hbW91bnQKICAgIGR1cAogICAgYnVyeSAxMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTc4CiAgICAvLyByZXF1aXJlZF9hbW91bnQgPSBpbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50CiAgICBkaWcgMgogICAgZGlnIDEKICAgICsKICAgIGR1cAogICAgYnVyeSA5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MzQKICAgIC8vIGJhbGFuY2UgPSBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBvcHRlZCBpbnRvIGFzc2V0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NTYKICAgIC8vIHJldHVybiBzZWxmLnJlc2VydmVkX2ludGVyZXN0ICsgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICBkaWcgMQogICAgKwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzM2CiAgICAvLyBhc3NlcnQgYmFsYW5jZSA+PSByZXNlcnZlZF90b3RhbCwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGRpZyAyCiAgICBkaWcgMQogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzM3CiAgICAvLyByZXR1cm4gYmFsYW5jZSAtIHJlc2VydmVkX3RvdGFsCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIC0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4MAogICAgLy8gc2VsZi5fYXZhaWxhYmxlX3NldHRsZW1lbnRfZnVuZHMoKSA+PSByZXF1aXJlZF9hbW91bnQKICAgIHVuY292ZXIgMgogICAgPj0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU3OS01ODEKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5fYXZhaWxhYmxlX3NldHRsZW1lbnRfZnVuZHMoKSA+PSByZXF1aXJlZF9hbW91bnQKICAgIC8vICksIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcyBmb3IgdGhlIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4MwogICAgLy8gc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCArPSBpbnRlcmVzdF9hbW91bnQKICAgIHVuY292ZXIgMwogICAgKwogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4NAogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgKz0gcHJpbmNpcGFsX2Ftb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIGV4aXN0cwogICAgKwogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1ODUKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCArPSBpbnRlcmVzdF9pbmRleF9kZWx0YQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggZXhpc3RzCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4NgogICAgLy8gc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCArPSBwcmluY2lwYWxfaW5kZXhfZGVsdGEKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggZXhpc3RzCiAgICArCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTg3CiAgICAvLyBpZiBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpOgogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgcHVzaGludCAzCiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUA0MAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTg4LTU4OQogICAgLy8gIyBGb3IgUFIsIHRoZSBwZXJpb2QgaW50ZXJlc3Qgc3RheXMgYWNjcnVlZCB1bnRpbCBhIGxhdGVyIElQIG9yIE1ELgogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ICs9IHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZGlnIDE2CiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBidXJ5IDE4CiAgICArCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQxOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTkyCiAgICAvLyBpZiBub3Qgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCkgb3IgZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSA9PSBVSW50NjQoCiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDQzCiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTItNTk0CiAgICAvLyBpZiBub3Qgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCkgb3IgZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSA9PSBVSW50NjQoCiAgICAvLyAgICAgZW51bXMuRVZUX01ECiAgICAvLyApOgogICAgcHVzaGludCAxOQogICAgPT0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQ0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUA0MzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5NQogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gZW50cnkubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZGlnIDE1CiAgICBwdXNoaW50IDQxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTYKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGRpZyA4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTk3CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBuZXh0X2ludGVyZXN0X2Jhc2UKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBkaWcgOQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5OAogICAgLy8gc2VsZi5ldmVudF9jdXJzb3IgKz0gVUludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAwCiAgICAvLyBpZiBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoCiAgICBkaWcgMTUKICAgIGV4dHJhY3QgOCAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MDAtNjAyCiAgICAvLyBpZiBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoCiAgICAvLyAgICAgZW51bXMuRVZUX01ECiAgICAvLyApIGFuZCBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9PSBVSW50NjQoMCk6CiAgICBwdXNoYnl0ZXMgMHgxMwogICAgYj09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0NwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAyCiAgICAvLyApIGFuZCBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9PSBVSW50NjQoMCk6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwMC02MDIKICAgIC8vIGlmIGVudHJ5LmV2ZW50X3R5cGUgPT0gYXJjNC5VSW50OCgKICAgIC8vICAgICBlbnVtcy5FVlRfTUQKICAgIC8vICkgYW5kIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID09IFVJbnQ2NCgwKToKICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0NwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAzCiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbnVtcy5TVEFUVVNfRU5ERUQpCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBwdXNoaW50IDIwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwNAogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gVUludDY0KDApCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0NzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwNi02MTAKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1pbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50LAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PWludGVyZXN0X2Ftb3VudCArIHByaW5jaXBhbF9hbW91bnQsCiAgICAvLyApCiAgICBkaWcgMTUKICAgIGRpZyA0CiAgICBkdXAKICAgIGNhbGxzdWIgX2VtaXRfZXhlY3V0aW9uX2V2ZW50CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5NgogICAgLy8gZnVuZGVkX2ludGVyZXN0ICs9IGludGVyZXN0X2Ftb3VudAogICAgZGlnIDEzCiAgICBkaWcgMTIKICAgICsKICAgIGJ1cnkgMTQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5NwogICAgLy8gZnVuZGVkX3ByaW5jaXBhbCArPSBwcmluY2lwYWxfYW1vdW50CiAgICBkaWcgMTIKICAgIGRpZyA3CiAgICArCiAgICBidXJ5IDEzCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6OTgKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgKz0gVUludDY0KDEpCiAgICBkaWcgNAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgNQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3Nfd2hpbGVfdG9wQDQKCmZ1bmRfZHVlX2Nhc2hmbG93c19lbHNlX2JvZHlANDA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTEKICAgIC8vIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0MQoKZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlAMjk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTcKICAgIC8vIGV2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ1cnkgMTYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1OC01NjAKICAgIC8vICMgRHluYW1pYyBhbm51aXRpZXMgZGVyaXZlIG5leHQgc3RhdGUgZnJvbSB0aGUgcGF5bWVudCBkZWNvbXBvc2l0aW9uLAogICAgLy8gIyBub3Qgb25seSBmcm9tIHRoZSBwcmVjb21wdXRlZCBgbmV4dF8qYCBmaWVsZHMuCiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpOgogICAgcHVzaGludCAzCiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUAzMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTYyCiAgICAvLyBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCAtIHByaW5jaXBhbF9hbW91bnRfZHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGRpZyA2CiAgICAtCiAgICBkdXAKICAgIGJ1cnkgOQogICAgYnVyeSA5CiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDMxOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY1CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9JUCk6CiAgICBkaWcgMTQKICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUAzMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY2CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGJ1cnkgOQogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY3CiAgICAvLyBuZXh0X2ludGVyZXN0X2Jhc2UgPSBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGJ1cnkgMTAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgZXhpc3RzCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDMzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY4CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCk6CiAgICBkaWcgMTQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlAMzQKICAgIGRpZyA3CiAgICBidXJ5IDkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzgKCmZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDM0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY5CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTcwCiAgICAvLyBuZXh0X2ludGVyZXN0X2Jhc2UgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzgKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDI5CiAgICAvLyBpZiBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKToKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzMAogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKToKICAgIGRpZyAxNAogICAgcHVzaGludCAxOQogICAgPT0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDIyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzEKICAgIC8vIHJldHVybiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzIKICAgIC8vIGludGVyZXN0X2R1ZSA9IHNlbGYuYWNjcnVlZF9pbnRlcmVzdCArIHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZGlnIDE2CiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBidXJ5IDE4CiAgICArCiAgICBkdXAKICAgIGJ1cnkgMTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzMwogICAgLy8gaWYgc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIDw9IGludGVyZXN0X2R1ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIGV4aXN0cwogICAgPj0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDI0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzQKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzUKICAgIC8vIHByaW5jaXBhbF9hbW91bnQgPSBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gLSBpbnRlcmVzdF9kdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIGV4aXN0cwogICAgZGlnIDEwCiAgICAtCiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDM2CiAgICAvLyBpZiBwcmluY2lwYWxfYW1vdW50ID4gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWw6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgID4KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDI2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzcKICAgIC8vIHJldHVybiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjY6CiAgICBkaWcgNgogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTIKICAgIC8vIHByaW5jaXBhbF9hbW91bnRfZHVlID0gc2VsZi5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudChlbnRyeSkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnRAMjgKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDI3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDQwCiAgICAvLyBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA8PSBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZGlnIDE1CiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBkdXAyCiAgICA8PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDM5LTQ0MQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA8PSBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NDIKICAgIC8vIHJldHVybiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCAtIGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBzd2FwCiAgICAtCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MTUKICAgIC8vIHJldHVybiBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgKyBzZWxmLl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KGVudHJ5KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgIGRpZyAxNgogICAgY2FsbHN1YiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudAogICAgYnVyeSAxOAogICAgKwogICAgYnVyeSAxMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTUxCiAgICAvLyBpbnRlcmVzdF9hbW91bnRfZHVlID0gc2VsZi5fZW50cnlfaW50ZXJlc3RfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfaW50ZXJlc3RfYW1vdW50QDE2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAMTE6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTAwCiAgICAvLyBhc3NlcnQgcHJvY2Vzc2VkX2V2ZW50cyA+IFVJbnQ2NCgwKSwgZXJyLk5PX0RVRV9DQVNIRkxPVwogICAgZGlnIDQKICAgIGR1cAogICAgYXNzZXJ0IC8vIE5vIGR1ZSBjYXNoZmxvdyB0byBwYXkKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMDQKICAgIC8vIHRvdGFsX2Z1bmRlZD1mdW5kZWRfaW50ZXJlc3QgKyBmdW5kZWRfcHJpbmNpcGFsLAogICAgZGlnIDE0CiAgICBkdXAKICAgIGRpZyAxNQogICAgZHVwCiAgICBjb3ZlciAzCiAgICArCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA2CiAgICAvLyB0aW1lc3RhbXA9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTAxLTEwNwogICAgLy8gcmV0dXJuIHR5cC5DYXNoRnVuZGluZ1Jlc3VsdCgKICAgIC8vICAgICBmdW5kZWRfaW50ZXJlc3Q9ZnVuZGVkX2ludGVyZXN0LAogICAgLy8gICAgIGZ1bmRlZF9wcmluY2lwYWw9ZnVuZGVkX3ByaW5jaXBhbCwKICAgIC8vICAgICB0b3RhbF9mdW5kZWQ9ZnVuZGVkX2ludGVyZXN0ICsgZnVuZGVkX3ByaW5jaXBhbCwKICAgIC8vICAgICBwcm9jZXNzZWRfZXZlbnRzPXByb2Nlc3NlZF9ldmVudHMsCiAgICAvLyAgICAgdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUA1MzoKICAgIGludGNfMCAvLyAwCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDU0CgoKLy8gbW9kdWxlcy5wYXltZW50X2FnZW50LlBheW1lbnRBZ2VudC5jbGFpbV9kdWVfY2FzaGZsb3dzW3JvdXRpbmddKCkgLT4gdm9pZDoKY2xhaW1fZHVlX2Nhc2hmbG93czoKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cG4gMgogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNQogICAgLy8gaWYgc2VsZi5vcF9kYWVtb24udmFsdWUgIT0gR2xvYmFsLnplcm9fYWRkcmVzczoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNyAvLyAweDUyM2E0ZjUwNDQyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wX2RhZW1vbiBleGlzdHMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE3CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjcgLy8gMHg1MjNhNGY1MDQ0MjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcF9kYWVtb24gZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE3LTE5CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIGJueiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfdHJ1ZUAxNAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE4CiAgICAvLyBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgdHhuIFNlbmRlcgogICAgZGlnIDMKICAgID09CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTctMTkKICAgIC8vIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICAvLyBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgYm56IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDE0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTkKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCAzMgogICAgPT0KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNy0xOQogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICBieiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VAMTUKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDE0OgogICAgaW50Y18xIC8vIDEKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUAxNjoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNi0yMAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyAgICAgb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vICAgICBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgLy8gKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCgpjbGFpbV9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTc6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTM5CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE0MAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDcKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTQzCiAgICAvLyBzZWxmLl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKGhvbGRpbmdfYWRkcmVzcykKICAgIGRpZyAyCiAgICBkdXAKICAgIGNhbGxzdWIgX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNDQKICAgIC8vIHNlbGYuX3NldHRsZV9wb3NpdGlvbihob2xkaW5nX2FkZHJlc3MpCiAgICBjYWxsc3ViIF9zZXR0bGVfcG9zaXRpb24KICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExNwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY2xhaW1hYmxlX2ludGVyZXN0CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBkdXAKICAgIHB1c2hpbnQgNzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExOAogICAgLy8gKyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jbGFpbWFibGVfcHJpbmNpcGFsCiAgICBkdXAKICAgIHB1c2hpbnQgODEKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExNy0xMTgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNsYWltYWJsZV9pbnRlcmVzdAogICAgLy8gKyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jbGFpbWFibGVfcHJpbmNpcGFsCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTQ2CiAgICAvLyBhc3NlcnQgdG90YWxfYW1vdW50ID4gVUludDY0KDApLCBlcnIuTk9fRFVFX0NBU0hGTE9XCiAgICBhc3NlcnQgLy8gTm8gZHVlIGNhc2hmbG93IHRvIHBheQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI1CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MuaXNfb3B0ZWRfaW4oCiAgICBleHRyYWN0IDAgMzIKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNgogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNS0yNwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLmlzX29wdGVkX2luKAogICAgLy8gICAgIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZAogICAgLy8gKQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNS0yOAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLmlzX29wdGVkX2luKAogICAgLy8gICAgIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZAogICAgLy8gKQogICAgLy8gYW5kIG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQKICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAyNAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI4CiAgICAvLyBhbmQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCAzODQKICAgIGdldGJpdAogICAgYm56IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAyNAogICAgaW50Y18xIC8vIDEKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUAyNToKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNTEKICAgIC8vIGlmIHNlbGYuX2lzX3BheW1lbnRfZXhlY3V0YWJsZShob2xkaW5nX2FkZHJlc3MpOgogICAgYnogY2xhaW1fZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozNAogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIHN3YXAKICAgIGRpZyAxCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozNC0zNQogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIC8vID49IHBheW1lbnRfYW1vdW50CiAgICBkaWcgNQogICAgZHVwCiAgICBjb3ZlciAyCiAgICA+PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjMzLTM2CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICAvLyAgICAgPj0gcGF5bWVudF9hbW91bnQKICAgIC8vICksIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcyBmb3IgdGhlIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNTMKICAgIC8vIHNlbGYuX3BheShzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MsIHRvdGFsX2Ftb3VudCkKICAgIGRpZyAyCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBkdXAKICAgIGV4dHJhY3QgMCAzMgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQwLTQ1CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9cmVjZWl2ZXIsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWFtb3VudCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQ0CiAgICAvLyBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgdW5jb3ZlciAzCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIHVuY292ZXIgMgogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0MAogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgcHVzaGludCA0IC8vIGF4ZmVyCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQwLTQ1CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9cmVjZWl2ZXIsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWFtb3VudCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMjUtMTI2CiAgICAvLyAjIEdldCB0aGUgY2xhaW1hYmxlIGFtb3VudHMgYmVmb3JlIHJlc2V0CiAgICAvLyBpbnRlcmVzdF9hbW91bnQgPSBwb3NpdGlvbi5jbGFpbWFibGVfaW50ZXJlc3QKICAgIGR1cAogICAgcHVzaGludCA3MwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSA5CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTI3CiAgICAvLyBwcmluY2lwYWxfYW1vdW50ID0gcG9zaXRpb24uY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgZHVwCiAgICBwdXNoaW50IDgxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAzCiAgICBidXJ5IDkKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMjktMTMwCiAgICAvLyAjIFJlc2V0IHRoZSBwb3NpdGlvbidzIGNsYWltYWJsZSBhbW91bnRzCiAgICAvLyBwb3NpdGlvbi5jbGFpbWFibGVfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBpdG9iCiAgICBzd2FwCiAgICBkaWcgMQogICAgcmVwbGFjZTIgNzMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzEKICAgIC8vIHBvc2l0aW9uLmNsYWltYWJsZV9wcmluY2lwYWwgPSBVSW50NjQoMCkKICAgIHN3YXAKICAgIHJlcGxhY2UyIDgxCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTMyCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHBvc2l0aW9uLmNvcHkoKQogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTM0CiAgICAvLyBhc3NlcnQgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCA+PSBpbnRlcmVzdF9hbW91bnQsIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX2ludGVyZXN0IGV4aXN0cwogICAgZHVwCiAgICBkaWcgMgogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzNQogICAgLy8gYXNzZXJ0IHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsID49IHByaW5jaXBhbF9hbW91bnQsIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICBkaWcgMwogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzNy0xMzgKICAgIC8vICMgVXBkYXRlIHRoZSBnbG9iYWwgcmVzZXJ2ZWQgaW50ZXJlc3QgYW5kIHByaW5jaXBhbCBhbW91bnRzCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0IC09IGludGVyZXN0X2Ftb3VudAogICAgc3dhcAogICAgLQogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzkKICAgIC8vIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIC09IHByaW5jaXBhbF9hbW91bnQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIHN3YXAKICAgIC0KICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKY2xhaW1fZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTU5CiAgICAvLyB0b3RhbF9hbW91bnQ9aW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudCwKICAgIGRpZyA1CiAgICBkdXAKICAgIGRpZyA2CiAgICBkdXAKICAgIGNvdmVyIDMKICAgICsKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNjAKICAgIC8vIHRpbWVzdGFtcD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNTYtMTYyCiAgICAvLyByZXR1cm4gdHlwLkNhc2hDbGFpbVJlc3VsdCgKICAgIC8vICAgICBpbnRlcmVzdF9hbW91bnQ9aW50ZXJlc3RfYW1vdW50LAogICAgLy8gICAgIHByaW5jaXBhbF9hbW91bnQ9cHJpbmNpcGFsX2Ftb3VudCwKICAgIC8vICAgICB0b3RhbF9hbW91bnQ9aW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudCwKICAgIC8vICAgICB0aW1lc3RhbXA9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgY29udGV4dD1wYXltZW50X2luZm8sCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgMgogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIHB1c2hieXRlcyAweDAwMjIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAyNDoKICAgIGludGNfMCAvLyAwCiAgICBiIGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUAyNQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX2ZhbHNlQDE1OgogICAgaW50Y18wIC8vIDAKICAgIGIgY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDE2CgoKLy8gbW9kdWxlcy50cmFuc2Zlcl9hZ2VudC5UcmFuc2ZlckFnZW50LnRyYW5zZmVyX3NldF9zY2hlZHVsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRyYW5zZmVyX3NldF9zY2hlZHVsZToKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo0MAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQxCiAgICAvLyBhc3NlcnQgb3Blbl9kYXRlIDwgY2xvc3VyZV9kYXRlLCBlcnIuSU5WQUxJRF9TT1JUSU5HCiAgICBkdXAyCiAgICA8CiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbXVzdCBiZSBzb3J0ZWQgaW4gc3RyaWN0bHkgYXNjZW5kaW5nIG9yZGVyCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQzCiAgICAvLyBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA9IG9wZW5fZGF0ZQogICAgYnl0ZWMgMjkgLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIHVuY292ZXIgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDQKICAgIC8vIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlID0gY2xvc3VyZV9kYXRlCiAgICBieXRlYyAzMCAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDUKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy50cmFuc2Zlcl9hZ2VudC5UcmFuc2ZlckFnZW50LnByaW1hcnlfZGlzdHJpYnV0aW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcHJpbWFyeV9kaXN0cmlidXRpb246CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjczCiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5wcmltYXJ5X2RlYWxlciwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDIyIC8vIDB4NTIzYTUwNTk0NDIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojc2CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo3NwogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojc4CiAgICAvLyBhc3NlcnQgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TRUQKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBjbG9zZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgY292ZXIgMwogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4MAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChob2xkaW5nX2FkZHJlc3MpCiAgICBzd2FwCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjgxCiAgICAvLyBhc3NlcnQgdW5pdHMgPiBVSW50NjQoMCksIGVyci5aRVJPX1VOSVRTCiAgICBkdXAKICAgIGFzc2VydCAvLyBDYW4gbm90IGRpc3RyaWJ1dGUgemVybyB1bml0cwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4MwogICAgLy8gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCArIHVuaXRzIDw9IHNlbGYudG90YWxfdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICArCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgPD0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODItODQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCArIHVuaXRzIDw9IHNlbGYudG90YWxfdW5pdHMKICAgIC8vICksIGVyci5PVkVSX0RJU1RSSUJVVElPTgogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCByZW1haW5pbmcgRC1BU0EgdW5pdHMKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODUKICAgIC8vIGlmIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI4IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlIGV4aXN0cwogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojg3CiAgICAvLyBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8PSBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI4IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlIGV4aXN0cwogICAgPD0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODYtODgKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPD0gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGUKICAgIC8vICksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TRUQKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBjbG9zZWQKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNDgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnJlc2VydmVkX3VuaXRzICs9IHVuaXRzCiAgICBkdXBuIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDMKICAgIGR1cAogICAgY292ZXIgMwogICAgKwogICAgaXRvYgogICAgcHVzaGludCA0MAogICAgc3dhcAogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6OTEKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgKz0gdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICArCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6OTIKICAgIC8vIHJldHVybiBzZWxmLnRvdGFsX3VuaXRzIC0gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIHN3YXAKICAgIC0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMudHJhbnNmZXJfYWdlbnQuVHJhbnNmZXJBZ2VudC50cmFuc2Zlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnRyYW5zZmVyOgogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTMwCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxMzEKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQ3CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuX3N0YXR1c19pc19wZW5kaW5nX2llZCgpLCBlcnIuUEVORElOR19JRUQKICAgICEKICAgIGFzc2VydCAvLyBJRUQgbm90IHlldCBleGVjdXRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxMwogICAgLy8gaWYgc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjkgLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICBieiB0cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTUKICAgIC8vIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjkgLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNC0xNgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gKSwgZXJyLkNMT1NFRF9UUkFOU0ZFUgogICAgYXNzZXJ0IC8vIFRyYW5zZmVyIGlzIGNsb3NlZAoKdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNwogICAgLy8gaWYgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzAgLy8gInRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICBieiB0cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTkKICAgIC8vIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDwgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGUKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMCAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIDwKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTgtMjAKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZQogICAgLy8gKSwgZXJyLkNMT1NFRF9UUkFOU0ZFUgogICAgYXNzZXJ0IC8vIFRyYW5zZmVyIGlzIGNsb3NlZAoKdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxMzUKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIGRpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA4CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIGJ5dGVjIDggLy8gMHg0MTIzCiAgICBkaWcgNQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA5CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjEzOAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChzZW5kZXJfaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDIKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTM5CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGR1cAogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNDAKICAgIC8vIGFzc2VydCBzZW5kZXJfaG9sZGluZ19hZGRyZXNzICE9IHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcywgZXJyLlNFTEZfVFJBTlNGRVIKICAgIHVuY292ZXIgMgogICAgIT0KICAgIGFzc2VydCAvLyBTZW5kZXIgYW5kIHJlY2VpdmVyIG11c3QgYmUgZGlmZmVyZW50CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE0MQogICAgLy8gYXNzZXJ0IHVuaXRzID4gVUludDY0KDApLCBlcnIuTlVMTF9UUkFOU0ZFUgogICAgZGlnIDEKICAgIGR1cAogICAgYXNzZXJ0IC8vIFRyYW5zZmVyIHVuaXRzIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTQyCiAgICAvLyBhc3NlcnQgdW5pdHMgPD0gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLCBlcnIuT1ZFUl9UUkFOU0ZFUgogICAgc3dhcAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIDw9CiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IHNlbmRlciB1bml0cyB0byB0cmFuc2ZlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzYzCiAgICAvLyBpZiBzZWxmLmV2ZW50X2N1cnNvciA+PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICA+PQogICAgYm56IHRyYW5zZmVyX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Fzc2VydF9ub19kdWVfZXZlbnRfcGVuZGluZ0AxMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzY1CiAgICAvLyBuZXh0X2VudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KHNlbGYuZXZlbnRfY3Vyc29yKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc2NwogICAgLy8gbmV4dF9lbnRyeS5zY2hlZHVsZWRfdGltZSA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NjYtNzY4CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIG5leHRfZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gKSwgZXJyLlBFTkRJTkdfQUNUVVNfRVZFTlQKICAgIGFzc2VydCAvLyBBQ1RVUyBldmVudCBub3QgeWV0IGV4ZWN1dGVkCgp0cmFuc2Zlcl9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9hc3NlcnRfbm9fZHVlX2V2ZW50X3BlbmRpbmdAMTA6CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE0NQogICAgLy8gc2VsZi5fZW5zdXJlX3VuaXRzX2FjdGl2YXRlZChzZW5kZXJfaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDMKICAgIGR1cAogICAgY2FsbHN1YiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNDYKICAgIC8vIHNlbGYuX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQocmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgY2FsbHN1YiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNDcKICAgIC8vIHNlbGYuX3NldHRsZV9wb3NpdGlvbihzZW5kZXJfaG9sZGluZ19hZGRyZXNzKQogICAgY2FsbHN1YiBfc2V0dGxlX3Bvc2l0aW9uCiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTQ4CiAgICAvLyBzZWxmLl9zZXR0bGVfcG9zaXRpb24ocmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzKQogICAgY2FsbHN1YiBfc2V0dGxlX3Bvc2l0aW9uCiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNTIKICAgIC8vIGFzc2VydCB1bml0cyA8PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cywgZXJyLk9WRVJfVFJBTlNGRVIKICAgIGRpZyA1CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkaWcgMQogICAgPD0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgc2VuZGVyIHVuaXRzIHRvIHRyYW5zZmVyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTUzCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyAtPSB1bml0cwogICAgZGlnIDEKICAgIC0KICAgIGl0b2IKICAgIHVuY292ZXIgMgogICAgaW50Y18zIC8vIDMyCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTQ0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyArPSB1bml0cwogICAgZGlnIDUKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIHVuY292ZXIgMgogICAgKwogICAgaXRvYgogICAgaW50Y18zIC8vIDMyCiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfc3VzcGVuc2lvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfc3VzcGVuc2lvbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojc5CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyMSAvLyAweDUyM2E0MTU1NTQyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE4NQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkID0gc3VzcGVuZGVkCiAgICBkdXAKICAgIHB1c2hpbnQgNDgKICAgIGludGNfMSAvLyAxCiAgICBib3hfZXh0cmFjdAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMwogICAgc2V0Yml0CiAgICBwdXNoaW50IDQ4CiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE4NgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTY1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5hY2NvdW50X29wZW5bcm91dGluZ10oKSAtPiB2b2lkOgphY2NvdW50X29wZW46CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzAKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmFjY291bnRfbWFuYWdlciwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDIzIC8vIDB4NTIzYTRkNGU0NzIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzkKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0VOREVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDIwMAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTAKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX2VuZGVkKCksIGVyci5VTkFVVEhPUklaRUQKICAgICEKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxMQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTIKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjEzCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozNAogICAgLy8gdW5pdHM9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozMi00MgogICAgLy8gcmV0dXJuIHR5cC5BY2NvdW50UG9zaXRpb24oCiAgICAvLyAgICAgcGF5bWVudF9hZGRyZXNzPXBheW1lbnRfYWRkcmVzcywKICAgIC8vICAgICB1bml0cz1VSW50NjQoMCksCiAgICAvLyAgICAgcmVzZXJ2ZWRfdW5pdHM9VUludDY0KDApLAogICAgLy8gICAgIHN1c3BlbmRlZD1GYWxzZSwKICAgIC8vICAgICBzZXR0bGVkX2N1cnNvcj1VSW50NjQoMCksCiAgICAvLyAgICAgaW50ZXJlc3RfY2hlY2twb2ludD1VSW50NjQoMCksCiAgICAvLyAgICAgcHJpbmNpcGFsX2NoZWNrcG9pbnQ9VUludDY0KDApLAogICAgLy8gICAgIGNsYWltYWJsZV9pbnRlcmVzdD1VSW50NjQoMCksCiAgICAvLyAgICAgY2xhaW1hYmxlX3ByaW5jaXBhbD1VSW50NjQoMCksCiAgICAvLyApCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGJ5dGVjIDQxIC8vIDB4MDAKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjE0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHNlbGYuX25ld19hY2NvdW50X3Bvc2l0aW9uKHBheW1lbnRfYWRkcmVzcykKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTUKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjM4CiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIHVuY292ZXIgMwogICAgPT0KICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIzOQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDAKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQxCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MgPSBwYXltZW50X2FkZHJlc3MKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQyCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfZ2V0X3Bvc2l0aW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF9nZXRfcG9zaXRpb246CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNTkKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9jcmVhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9jcmVhdGU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDE5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAzMwogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IGFycmFuZ2VyCiAgICBieXRlYyAxOCAvLyAweDUyM2E0MTUyNTIyMwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMzQKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAxOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfY29uZmlnW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfY29uZmlnOgogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBsZW4KICAgIHB1c2hpbnQgMTA3CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLk5vcm1hbGl6ZWRBY3R1c1Rlcm1zCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgcHVzaGludCA3MgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5Jbml0aWFsS2VybmVsU3RhdGUKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBsZW4KICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIHR1cGxlIGVuY29kaW5nCiAgICBkdXAKICAgIHB1c2hpbnQgMzQKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCB0YWlsIHBvaW50ZXIgYXQgaW5kZXggMSBvZiAodWludDhbMzJdLChsZW4rdXRmOFtdKSkKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgY292ZXIgMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMzYKICAgICsKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuUHJvc3BlY3R1cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2NgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDY4LTEwNjkKICAgIC8vICMgQ29uZmlndXJlIENvbnRyYWN0CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPSB0ZXJtcy5jb250cmFjdF90eXBlLmFzX3VpbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgYnogY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUA3CiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIyMAogICAgLy8gVUludDY0KGVudW1zLkNUX0FOTiksCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIxCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfTkFNKSwKICAgIHB1c2hpbnQgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIyCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfTEFNKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIzCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfTEFYKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjI0CiAgICAvLyBVSW50NjQoZW51bXMuQ1RfQ0xNKSwKICAgIHB1c2hpbnQgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJ6IGNvbnRyYWN0X2NvbmZpZ19ib29sX2ZhbHNlQDgKCmNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANzoKICAgIGludGNfMSAvLyAxCgpjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUA5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjI5CiAgICAvLyBhc3NlcnQgc2VsZi5faXNfc3VwcG9ydGVkX2NvbnRyYWN0X3R5cGUoY29udHJhY3RfdHlwZSksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3MQogICAgLy8gc2VsZi5fc3RvcmVfY29udHJhY3RfY29uZmlnKHNlbGYuY29udHJhY3RfdHlwZSwgdGVybXMsIGluaXRpYWxfc3RhdGUpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgYnVyeSAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzI1CiAgICAvLyBhc3NlcnQgdGVybXMuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZGlnIDQKICAgIGR1cAogICAgcHVzaGludCAzMwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSA4CiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMjcKICAgIC8vIHRlcm1zLmRheV9jb3VudF9jb252ZW50aW9uLmFzX3VpbnQ2NCgpCiAgICBwdXNoaW50IDU3CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICBieiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDE2CiAgICBkaWcgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk5CiAgICAvLyBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI5Ny0zMDMKICAgIC8vIHJldHVybiBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzYwKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwSVNEQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjApLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDE2CiAgICBkaWcgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzAwCiAgICAvLyBVSW50NjQoZW51bXMuRENDX0EzNjUpLAogICAgcHVzaGludCAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyOTctMzAzCiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgID09CiAgICBibnogY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUAxNgogICAgZGlnIDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMwMQogICAgLy8gVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGRpZyA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDIKICAgIC8vIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICA9PQogICAgYnogY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAMTcKCmNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTY6CiAgICBpbnRjXzEgLy8gMQoKY29udHJhY3RfY29uZmlnX2Jvb2xfbWVyZ2VAMTg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDktMzExCiAgICAvLyBhc3NlcnQgc2VsZi5faXNfc3VwcG9ydGVkX2RheV9jb3VudF9jb252ZW50aW9uKAogICAgLy8gICAgIGRheV9jb3VudF9jb252ZW50aW9uCiAgICAvLyApLCBlcnIuSU5WQUxJRF9EQVlfQ09VTlRfQ09OVkVOVElPTgogICAgYXNzZXJ0IC8vIEludmFsaWQgZGF5LWNvdW50IGNvbnZlbnRpb24gSUQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMyOQogICAgLy8gaWYgY29udHJhY3RfdHlwZSAhPSBVSW50NjQoZW51bXMuQ1RfQU5OKToKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgICE9CiAgICBieiBjb250cmFjdF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzMwCiAgICAvLyBhc3NlcnQgbm90IHRlcm1zLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24sIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZGlnIDQKICAgIHB1c2hpbnQgNzg2CiAgICBnZXRiaXQKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KCmNvbnRyYWN0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDIwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODA3CiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIEQtQVNBIGFscmVhZHkgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODA4CiAgICAvLyBhc3NlcnQgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCA9PSBVSW50NjQoMCksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMCAvLyAiaW5pdGlhbF9leGNoYW5nZV9hbW91bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTAtODExCiAgICAvLyAjIFNldCBEZW5vbWluYXRpb24gQXNzZXQKICAgIC8vIHNlbGYuX2Fzc2VydF9kZW5vbWluYXRpb25fYXNzZXQodGVybXMuZGVub21pbmF0aW9uX2Fzc2V0X2lkKQogICAgZGlnIDQKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NzUtNzc2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIGRlbm9taW5hdGlvbiB3aXRoIEFTQQogICAgLy8gX2NyZWF0b3IsIGV4aXN0cyA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X2NyZWF0b3IoZGVub21pbmF0aW9uX2Fzc2V0X2lkKQogICAgZHVwCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q3JlYXRvcgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NzcKICAgIC8vIGFzc2VydCBleGlzdHMsIGVyci5JTlZBTElEX0RFTk9NSU5BVElPTgogICAgYXNzZXJ0IC8vIERlbm9taW5hdGlvbiBhc3NldCBpcyBub3QgcHJvcGVybHkgc2V0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODAKICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICBieXRlYyA0NCAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTQtODE1CiAgICAvLyAjIFNldCBTZXR0bGVtZW50IEFzc2V0CiAgICAvLyBzZWxmLl9hc3NlcnRfc2V0dGxlbWVudF9hc3NldCh0ZXJtcy5zZXR0bGVtZW50X2Fzc2V0X2lkKQogICAgZGlnIDEKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc4NQogICAgLy8gc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODMtNzg2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc2V0dGxlbWVudCBhc3NldCBpcyB0aGUgZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQgPT0gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIC8vICksIGVyci5JTlZBTElEX1NFVFRMRU1FTlRfQVNTRVQKICAgIGFzc2VydCAvLyBEaWZmZXJlbnQgc2V0dGxlbWVudCBhc3NldCBub3Qgc3VwcG9ydGVkLCBtdXN0IGJlIGVxdWFsIHRvIGRlbm9taW5hdGlvbiBhc3NldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Nzg5CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBzZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkwLTc5NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhc3NldF9hbW91bnQ9MCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Nzk1CiAgICAvLyBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkzCiAgICAvLyBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc5NAogICAgLy8gYXNzZXRfYW1vdW50PTAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkwLTc5MQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3OTAtNzk2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODE4LTgxOQogICAgLy8gIyBVbml0cwogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IHRlcm1zLnRvdGFsX3VuaXRzCiAgICBkdXAKICAgIHB1c2hpbnQgMTcKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODIwCiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID0gVUludDY0KDApCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgyMi04MjMKICAgIC8vICMgRGF5LUNvdW50IENvbnZlbnRpb25zCiAgICAvLyBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uID0gdGVybXMuZGF5X2NvdW50X2NvbnZlbnRpb24uYXNfdWludDY0KCkKICAgIGJ5dGVjIDQ2IC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGRpZyA4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODI1LTgyNgogICAgLy8gIyBUaW1lCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA9IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZQogICAgZHVwCiAgICBwdXNoaW50IDQxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMjggLy8gImluaXRpYWxfZXhjaGFuZ2VfZGF0ZSIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODI3CiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSB0ZXJtcy5tYXR1cml0eV9kYXRlCiAgICBkaWcgMQogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDQ1IC8vICJtYXR1cml0eV9kYXRlIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MjgKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IGluaXRpYWxfc3RhdGUubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZGlnIDYKICAgIGR1cAogICAgY292ZXIgMgogICAgcHVzaGludCA0OAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzMC04MzEKICAgIC8vICMgUHJpbmNpcGFsCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID0gdGVybXMuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGRpZyAxMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzMgogICAgLy8gc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gdGVybXMuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZGlnIDMKICAgIHB1c2hpbnQgNzg2CiAgICBnZXRiaXQKICAgIGJ5dGVjIDM1IC8vICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzMwogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBpbml0aWFsX3N0YXRlLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZGlnIDEKICAgIHB1c2hpbnQgMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODM1LTgzNgogICAgLy8gIyBJbnRlcmVzdAogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ID0gaW5pdGlhbF9zdGF0ZS5hY2NydWVkX2ludGVyZXN0CiAgICBkaWcgMQogICAgcHVzaGludCA0MAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODM4LTgzOQogICAgLy8gIyBJbnRlcmVzdCBSYXRlCiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IGluaXRpYWxfc3RhdGUubm9taW5hbF9pbnRlcmVzdF9yYXRlCiAgICBkaWcgMQogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0MAogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gaW5pdGlhbF9zdGF0ZS5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlCiAgICBkaWcgMQogICAgcHVzaGludCAyNAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQxCiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkID0gdGVybXMucmF0ZV9yZXNldF9zcHJlYWQKICAgIGRpZyAzCiAgICBwdXNoaW50IDU4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzYgLy8gInJhdGVfcmVzZXRfc3ByZWFkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0MgogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIgPSB0ZXJtcy5yYXRlX3Jlc2V0X211bHRpcGxpZXIKICAgIGRpZyAzCiAgICBwdXNoaW50IDY2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzcgLy8gInJhdGVfcmVzZXRfbXVsdGlwbGllciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDMKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9mbG9vciA9IHRlcm1zLnJhdGVfcmVzZXRfZmxvb3IKICAgIGRpZyAzCiAgICBwdXNoaW50IDc0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzEgLy8gInJhdGVfcmVzZXRfZmxvb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQ0CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfY2FwID0gdGVybXMucmF0ZV9yZXNldF9jYXAKICAgIGRpZyAzCiAgICBwdXNoaW50IDgyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzIgLy8gInJhdGVfcmVzZXRfY2FwIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0NQogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X25leHQgPSB0ZXJtcy5yYXRlX3Jlc2V0X25leHQKICAgIGRpZyAzCiAgICBwdXNoaW50IDkwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzggLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDYKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgPSB0ZXJtcy5oYXNfcmF0ZV9yZXNldF9mbG9vcgogICAgZGlnIDMKICAgIHB1c2hpbnQgNzg0CiAgICBnZXRiaXQKICAgIGJ5dGVjIDM5IC8vICJoYXNfcmF0ZV9yZXNldF9mbG9vciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDcKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwID0gdGVybXMuaGFzX3JhdGVfcmVzZXRfY2FwCiAgICBkaWcgMwogICAgcHVzaGludCA3ODUKICAgIGdldGJpdAogICAgYnl0ZWMgNDAgLy8gImhhc19yYXRlX3Jlc2V0X2NhcCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDktODUwCiAgICAvLyAjIFNjYWxpbmcKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgPSB0ZXJtcy5maXhlZF9wb2ludF9zY2FsZQogICAgdW5jb3ZlciAzCiAgICBwdXNoaW50IDk5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODUyLTg1MwogICAgLy8gIyBTY2hlZHVsZSBQcm9jZXNzaW5nCiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciA9IGluaXRpYWxfc3RhdGUuZXZlbnRfY3Vyc29yCiAgICBkaWcgMQogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU1LTg1NgogICAgLy8gIyBQZXItVW5pdCBGaXhlZC1Qb2ludCBJbmRleGVzCiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggPSBpbml0aWFsX3N0YXRlLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgKICAgIGRpZyAxCiAgICBwdXNoaW50IDU2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU3CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4ID0gaW5pdGlhbF9zdGF0ZS5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleAogICAgZGlnIDEKICAgIHB1c2hpbnQgNjQKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU5LTg2MAogICAgLy8gIyBSZXNlcnZlZCBBbW91bnQgKGZvciBleGVjdXRlZCBjYXNoZmxvd3MpCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0ID0gVUludDY0KDApCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2MQogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2MwogICAgLy8gYXNzZXJ0IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLCBlcnIuSU5WQUxJRF9JRUQKICAgIGRpZyAyCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICBhc3NlcnQgLy8gSUVEIG11c3QgYmUgc2V0IGluIHRoZSBmdXR1cmUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2NAogICAgLy8gYXNzZXJ0IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA+IGluaXRpYWxfc3RhdGUuc3RhdHVzX2RhdGUsIGVyci5JTlZBTElEX0lFRAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgPAogICAgYXNzZXJ0IC8vIElFRCBtdXN0IGJlIHNldCBpbiB0aGUgZnV0dXJlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NjUKICAgIC8vIGFzc2VydCB0ZXJtcy5pbml0aWFsX2V4Y2hhbmdlX2RhdGUgPCB0ZXJtcy5tYXR1cml0eV9kYXRlLCBlcnIuSU5WQUxJRF9JRUQKICAgIDwKICAgIGFzc2VydCAvLyBJRUQgbXVzdCBiZSBzZXQgaW4gdGhlIGZ1dHVyZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3My0xMDc0CiAgICAvLyAjIE5vdGFyaXplIHByb3NwZWN0dXMgKG9wdGlvbmFsKQogICAgLy8gc2VsZi5wcm9zcGVjdHVzX2hhc2ggPSBwcm9zcGVjdHVzLmhhc2guYnl0ZXMKICAgIGRpZyAyCiAgICBleHRyYWN0IDAgMzIKICAgIGJ5dGVjIDQyIC8vICJwcm9zcGVjdHVzX2hhc2giCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3NQogICAgLy8gc2VsZi5wcm9zcGVjdHVzX3VybCA9IHByb3NwZWN0dXMudXJsCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGVjIDQzIC8vICJwcm9zcGVjdHVzX3VybCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc2CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAMTc6CiAgICBpbnRjXzAgLy8gMAogICAgYiBjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUAxOAoKY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAODoKICAgIGludGNfMCAvLyAwCiAgICBiIGNvbnRyYWN0X2NvbmZpZ19ib29sX21lcmdlQDkKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9zY2hlZHVsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X3NjaGVkdWxlOgogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHN3YXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBkdXAKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgMgogICAgKwogICAgdW5jb3ZlciAyCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLkV4ZWN1dGlvblNjaGVkdWxlRW50cnk+CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTEwCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMTMKICAgIC8vIGNvbnRyYWN0X3R5cGU9c2VsZi5jb250cmFjdF90eXBlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGNvdmVyIDMKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4ODEKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4ODItODg0CiAgICAvLyBhc3NlcnQgc2NoZWR1bGVfcGFnZS5sZW5ndGggPD0gVUludDY0KAogICAgLy8gICAgIGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUKICAgIC8vICksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGR1cAogICAgcHVzaGludCAxNgogICAgPD0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg4NQogICAgLy8gYXNzZXJ0IHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPiBVSW50NjQoMCksIGVyci5URVJNU19OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSB0ZXJtcyBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODg3CiAgICAvLyBwYWdlX2N1cnNvciA9IHNjaGVkdWxlX3BhZ2VfaW5kZXggKiBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkKICAgIHN3YXAKICAgIHB1c2hpbnQgMTYKICAgICoKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg5NAogICAgLy8gKyBwYWdlX2xlbmd0aCAqIFVJbnQ2NChjc3QuT1BfVVBfQ09OVFJBQ1RfQ09ORklHX1BFUl9FTlRSWV9CVURHRVQpCiAgICBwdXNoaW50IDEwMAogICAgKgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODkzCiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19CQVNFX0JVREdFVCkKICAgIGludGMgNCAvLyAxNTAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTMtODk0CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19CQVNFX0JVREdFVCkKICAgIC8vICsgcGFnZV9sZW5ndGggKiBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19QRVJfRU5UUllfQlVER0VUKQogICAgKwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODg5LTg5NgogICAgLy8gIyBWYWxpZGF0aW9uIGNvc3QgZ3Jvd3Mgd2l0aCBwYWdlIGxlbmd0aCwgc28gY29uZmlndXJhdGlvbiBleHBsaWNpdGx5CiAgICAvLyAjIGJ1eXMgZXh0cmEgb3Bjb2RlIGJ1ZGdldCBmb3IgbGFyZ2VyIHVwbG9hZHMuCiAgICAvLyBlbnN1cmVfYnVkZ2V0KAogICAgLy8gICAgIHJlcXVpcmVkX2J1ZGdldD0oCiAgICAvLyAgICAgICAgIFVJbnQ2NChjc3QuT1BfVVBfQ09OVFJBQ1RfQ09ORklHX0JBU0VfQlVER0VUKQogICAgLy8gICAgICAgICArIHBhZ2VfbGVuZ3RoICogVUludDY0KGNzdC5PUF9VUF9DT05UUkFDVF9DT05GSUdfUEVSX0VOVFJZX0JVREdFVCkKICAgIC8vICAgICApLAogICAgLy8gKQogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODk3CiAgICAvLyBpbmRleCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKCmNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEAyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODk4CiAgICAvLyB3aGlsZSBpbmRleCA8IHBhZ2VfbGVuZ3RoOgogICAgZHVwCiAgICBkaWcgNAogICAgPAogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfd2hpbGVAMTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg5OS05MDAKICAgIC8vIGVudHJ5ID0gc2NoZWR1bGVfcGFnZVtpbmRleF0uY29weSgpCiAgICAvLyBlbnRyeV9ldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZGlnIDQKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGJ1cnkgMTIKICAgIGRpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgNjUKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTAwCiAgICAvLyBlbnRyeV9ldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTktOTAwCiAgICAvLyBlbnRyeSA9IHNjaGVkdWxlX3BhZ2VbaW5kZXhdLmNvcHkoKQogICAgLy8gZW50cnlfZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGludGNfMiAvLyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDAKICAgIC8vIGVudHJ5X2V2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBnZXRieXRlCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgMTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkwMQogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X2lkID09IHBhZ2VfY3Vyc29yICsgaW5kZXgsIGVyci5JTlZBTElEX0VWRU5UX0lECiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEzCiAgICBkaWcgNQogICAgdW5jb3ZlciA0CiAgICArCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDItOTA0CiAgICAvLyBzZWxmLl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBlbnRyeV9ldmVudF90eXBlCiAgICAvLyApCiAgICBkaWcgNQogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTA1CiAgICAvLyBhc3NlcnQgZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgc3dhcAogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDYKICAgIC8vIGlmIGVudHJ5LmV2ZW50X2lkID4gVUludDY0KDApOgogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDcKICAgIC8vIGlmIGluZGV4ID4gVUludDY0KDApOgogICAgZHVwCiAgICBieiBjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlANgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTA4CiAgICAvLyBwcmV2aW91c19lbnRyeSA9IHNjaGVkdWxlX3BhZ2VbaW5kZXggLSBVSW50NjQoMSldLmNvcHkoKQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgcHVzaGludCA2NQogICAgKgogICAgZGlnIDExCiAgICBzd2FwCiAgICBwdXNoaW50IDY1CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkyMwogICAgLy8gcHJldmlvdXNfZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gZW50cnkuc2NoZWR1bGVkX3RpbWUKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyA4CiAgICA8PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTIyLTkyNAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBwcmV2aW91c19lbnRyeS5zY2hlZHVsZWRfdGltZSA8PSBlbnRyeS5zY2hlZHVsZWRfdGltZQogICAgLy8gKSwgZXJyLklOVkFMSURfU09SVElORwogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIG11c3QgYmUgc29ydGVkIGluIHN0cmljdGx5IGFzY2VuZGluZyBvcmRlcgoKY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUA4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTI1CiAgICAvLyBpZiBlbnRyeS5ldmVudF9pZCA9PSBVSW50NjQoMCk6CiAgICBkaWcgOAogICAgYm56IGNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkyNi05MjgKICAgIC8vIGFzc2VydCBlbnRyeV9ldmVudF90eXBlID09IFVJbnQ2NCgKICAgIC8vICAgICBlbnVtcy5FVlRfSUVECiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGRpZyA5CiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjkKICAgIC8vIGluZGV4ICs9IFVJbnQ2NCgxKQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIGNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEAyCgpjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlANjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkxMC05MTIKICAgIC8vICMgVGhlIGZpcnN0IGVudHJ5IG9mIGEgcGFnZSBtdXN0IHN0aWxsIGJlIG9yZGVyZWQgYWZ0ZXIgdGhlCiAgICAvLyAjIGxhc3QgZW50cnkgb2YgdGhlIHByZXZpb3VzIHBhZ2UuCiAgICAvLyBhc3NlcnQgc2NoZWR1bGVfcGFnZV9pbmRleCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGRpZyA2CiAgICBkdXAKICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTMKICAgIC8vIHByZXZpb3VzX3BhZ2VfaW5kZXggPSBzY2hlZHVsZV9wYWdlX2luZGV4IC0gVUludDY0KDEpCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTE1CiAgICAvLyBwcmV2aW91c19wYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZQogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTQtOTE2CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHByZXZpb3VzX3BhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTctOTE4CiAgICAvLyBwcmV2aW91c19wYWdlID0gc2VsZi5zY2hlZHVsZV9wYWdlW3ByZXZpb3VzX3BhZ2VfaW5kZXhdLmNvcHkoKQogICAgLy8gYXNzZXJ0IHByZXZpb3VzX3BhZ2UubGVuZ3RoID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBwdXNoaW50IDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTgKICAgIC8vIGFzc2VydCBwcmV2aW91c19wYWdlLmxlbmd0aCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZHVwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjAKICAgIC8vIHByZXZpb3VzX3BhZ2UubGVuZ3RoIC0gVUludDY0KDEpCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTE5LTkyMQogICAgLy8gcHJldmlvdXNfZW50cnkgPSBwcmV2aW91c19wYWdlWwogICAgLy8gICAgIHByZXZpb3VzX3BhZ2UubGVuZ3RoIC0gVUludDY0KDEpCiAgICAvLyBdLmNvcHkoKQogICAgcHVzaGludCA2NQogICAgKgogICAgcHVzaGludCAyCiAgICArCiAgICBwdXNoaW50IDY1CiAgICBib3hfZXh0cmFjdAogICAgYiBjb250cmFjdF9zY2hlZHVsZV9hZnRlcl9pZl9lbHNlQDcKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX3doaWxlQDExOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjAwCiAgICAvLyBzZWxmLnNjaGVkdWxlX3BhZ2VbcGFnZV9pbmRleF0gPSBzY2hlZHVsZV9wYWdlLmNvcHkoKQogICAgZGlnIDYKICAgIGl0b2IKICAgIGJ5dGVjIDI0IC8vIDB4NTMyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgZGlnIDUKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzMgogICAgLy8gaWYgaXNfbGFzdF9wYWdlOgogICAgZGlnIDUKICAgIGJ6IGNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzNAogICAgLy8gc2NoZWR1bGVfcGFnZV9pbmRleCAqIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKSArIHBhZ2VfbGVuZ3RoCiAgICBkaWcgMQogICAgZGlnIDQKICAgICsKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzMwogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA9ICgKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTMzLTkzNQogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA9ICgKICAgIC8vICAgICBzY2hlZHVsZV9wYWdlX2luZGV4ICogVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpICsgcGFnZV9sZW5ndGgKICAgIC8vICkKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MzYKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgNTAKICAgIGFwcF9nbG9iYWxfcHV0Cgpjb250cmFjdF9zY2hlZHVsZV9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTExOAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9leGVjdXRlX2llZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X2V4ZWN1dGVfaWVkOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDMKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE0NAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDUKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTQ3CiAgICAvLyBhc3NlcnQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LCBlcnIuSU5WQUxJRF9FVkVOVF9DVVJTT1IKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgZGlnIDEKICAgID4KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGN1cnNvcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE0OAogICAgLy8gZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoc2VsZi5ldmVudF9jdXJzb3IpCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDkKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoZW51bXMuRVZUX0lFRCksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGR1cAogICAgZXh0cmFjdCA4IDEKICAgIGR1cAogICAgcHVzaGJ5dGVzIDB4MDEKICAgIGI9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1MwogICAgLy8gZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICBkaWcgMQogICAgZXh0cmFjdCAwIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTUKICAgIC8vIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgZGlnIDIKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTU2CiAgICAvLyBhY2NydWFsX2ZhY3Rvcj1lbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIGRpZyAzCiAgICBleHRyYWN0IDE3IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTcKICAgIC8vIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIGRpZyA0CiAgICBleHRyYWN0IDI1IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTkKICAgIC8vIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPWVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDUKICAgIGV4dHJhY3QgMzMgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE2MAogICAgLy8gbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgZGlnIDYKICAgIGV4dHJhY3QgNDEgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE2MQogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9ZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICBkaWcgNwogICAgZXh0cmFjdCA0OSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTYyCiAgICAvLyBmbGFncz1lbnRyeS5mbGFncywKICAgIGRpZyA4CiAgICBleHRyYWN0IDU3IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTItMTE2MwogICAgLy8gdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0KAogICAgLy8gICAgIGV2ZW50X2lkPWVudHJ5LmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1lbnRyeS5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1lbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPWVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9ZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPWVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGZsYWdzPWVudHJ5LmZsYWdzLAogICAgLy8gKSwKICAgIHVuY292ZXIgNwogICAgdW5jb3ZlciA4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNwogICAgY29uY2F0CiAgICB1bmNvdmVyIDYKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTgKICAgIC8vIG9ic2VydmVkX3JhdGU9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTItMTE2MwogICAgLy8gdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0KAogICAgLy8gICAgIGV2ZW50X2lkPWVudHJ5LmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1lbnRyeS5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1lbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPWVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9ZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPWVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGZsYWdzPWVudHJ5LmZsYWdzLAogICAgLy8gKSwKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTUwLTExNjQKICAgIC8vIHNlbGYuX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5KAogICAgLy8gICAgIGVudHJ5LAogICAgLy8gICAgIHR5cC5PYnNlcnZlZEV2ZW50UmVxdWVzdCgKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPWVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIG9ic2VydmVkX3JhdGU9VUludDY0KDApLAogICAgLy8gICAgICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1lbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1lbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICAgICAgZmxhZ3M9ZW50cnkuZmxhZ3MsCiAgICAvLyAgICAgKSwKICAgIC8vICkKICAgIGNhbGxzdWIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5CiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNjUKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEyMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuYXBwbHlfbm9uX2Nhc2hfZXZlbnRbcm91dGluZ10oKSAtPiB2b2lkOgphcHBseV9ub25fY2FzaF9ldmVudDoKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDQKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cG4gMgogICAgbGVuCiAgICBwdXNoaW50IDczCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLk9ic2VydmVkRXZlbnRSZXF1ZXN0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIwNAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMDUKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjA3CiAgICAvLyBpZiBwYXlsb2FkLmZsYWdzICYgVUludDY0KGVudW1zLkZMQUdfT0JTRVJWRURfRVZFTlQpOgogICAgcHVzaGludCA2NQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgcHVzaGludCA0CiAgICAmCiAgICBieiBhcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIzMwogICAgLy8gcmV0dXJuIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQ0xNKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICBwdXNoaW50IDUKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjA4CiAgICAvLyBhc3NlcnQgc2VsZi5fc3VwcG9ydHNfb2JzZXJ2ZWRfZXZlbnRzKCksIGVyci5PQlNFUlZFRF9FVkVOVF9SRVFVSVJFRAogICAgYXNzZXJ0IC8vIE9ic2VydmVkIGV2ZW50IHJlcXVpcmVkIHRvIGV4ZWN1dGUgdGhpcyBhY3Rpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMDkKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjMzCiAgICAvLyByZXR1cm4gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9DTE0pCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIGR1cAogICAgcHVzaGludCA1CiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQ1CiAgICAvLyBhc3NlcnQgc2VsZi5fc3VwcG9ydHNfb2JzZXJ2ZWRfZXZlbnRzKCksIGVyci5PQlNFUlZFRF9FVkVOVF9SRVFVSVJFRAogICAgYXNzZXJ0IC8vIE9ic2VydmVkIGV2ZW50IHJlcXVpcmVkIHRvIGV4ZWN1dGUgdGhpcyBhY3Rpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk0NgogICAgLy8gYXNzZXJ0IHBheWxvYWQuZXZlbnRfaWQgPT0gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGRpZyAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDcKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBpZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQ4CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUsIHBheWxvYWQuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgYnVyeSAxMgogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk0Ny05NDkKICAgIC8vIHNlbGYuX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIHNlbGYuY29udHJhY3RfdHlwZSwgcGF5bG9hZC5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICAvLyApCiAgICBjYWxsc3ViIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTUxCiAgICAvLyBwYWdlX2luZGV4ID0gc2VsZi5fc2NoZWR1bGVfcGFnZV9pbmRleChzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTkwCiAgICAvLyByZXR1cm4gZXZlbnRfaWQgLy8gVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpCiAgICBwdXNoaW50IDE2CiAgICAvCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTIKICAgIC8vIHBhZ2UgPSB0eXAuRXhlY3V0aW9uU2NoZWR1bGVQYWdlKCkKICAgIGJ5dGVjIDQ4IC8vIDB4MDAwMAogICAgYnVyeSA3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTMKICAgIC8vIGlmIHBhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlOgogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA5CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMjcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1NAogICAgLy8gcGFnZSA9IHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XS5jb3B5KCkKICAgIGRpZyA3CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidXJ5IDcKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX3BhZ2UgZW50cnkgZXhpc3RzCgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDI3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTU1CiAgICAvLyBhc3NlcnQgcGFnZS5sZW5ndGggPCBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGRpZyA1CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgMTYKICAgIDwKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2MAogICAgLy8gc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIGRpZyAzCiAgICBkdXAKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjEKICAgIC8vIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICBkaWcgMQogICAgZXh0cmFjdCAxNyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjIKICAgIC8vIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZGlnIDIKICAgIGV4dHJhY3QgMjUgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTYzCiAgICAvLyBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDMKICAgIGV4dHJhY3QgNDEgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTY0CiAgICAvLyBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIGRpZyA0CiAgICBleHRyYWN0IDQ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2NQogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIHVuY292ZXIgNQogICAgZXh0cmFjdCA1NyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTctOTY3CiAgICAvLyB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1wYXlsb2FkLmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9cGF5bG9hZC5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPXBheWxvYWQucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXBheWxvYWQubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICkKICAgIGRpZyAxMQogICAgaXRvYgogICAgZGlnIDE4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMwogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTYtOTY4CiAgICAvLyBwYWdlLmFwcGVuZCgKICAgIC8vICAgICB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9cGF5bG9hZC5ldmVudF9pZCwKICAgIC8vICAgICAgICAgZXZlbnRfdHlwZT1wYXlsb2FkLmV2ZW50X3R5cGUsCiAgICAvLyAgICAgICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIC8vICAgICAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICAgICApCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjkKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHBhZ2UuY29weSgpCiAgICBkaWcgOAogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk3MAogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjEyCiAgICAvLyBhc3NlcnQgZXZlbnRfaWQgPT0gc2VsZi5ldmVudF9jdXJzb3IsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBjdXJzb3IKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMTMKICAgIC8vIGVudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KGV2ZW50X2lkKQogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIxNQogICAgLy8gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgYnVyeSAxMAogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjQKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY1CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzYzLTM3MAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9SUiksCiAgICBwdXNoaW50IDEyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY3CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICBwdXNoaW50IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY4CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgcHVzaGludCAxOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzYzLTM3MAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBieiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX2ZhbHNlQDE2CgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX3RydWVAMTU6CiAgICBpbnRjXzEgLy8gMQoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9tZXJnZUAxNzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMTQtMTIxNgogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2lzX25vbl9jYXNoKAogICAgLy8gICAgIGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIC8vICksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IHR5cGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMTcKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlICE9IGFyYzQuVUludDgoZW51bXMuRVZUX0lFRCksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGRpZyA4CiAgICBwdXNoYnl0ZXMgMHgwMQogICAgYiE9CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCB0eXBlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNzQKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluIChVSW50NjQoZW51bXMuRVZUX1JSKSwgVUludDY0KGVudW1zLkVWVF9SUkYpKQogICAgZGlnIDQKICAgIHB1c2hpbnQgMTIKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDIxCiAgICBkaWcgNAogICAgcHVzaGludCAxMQogICAgPT0KICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfZmFsc2VAMjIKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAyMToKICAgIGludGNfMSAvLyAxCgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX21lcmdlQDIzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIxOAogICAgLy8gaWYgc2VsZi5fZXZlbnRfaXNfcmF0ZV9yZXNldChlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpKToKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Vsc2VfYm9keUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODIKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLm9ic2VydmVyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjUgLy8gMHg1MjNhNGQ0ZjQzMjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMjIKICAgIC8vIHNlbGYuX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5KGVudHJ5LCBwYXlsb2FkKQogICAgZGlnIDYKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeQogICAgcG9wbiAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjIzCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfZWxzZV9ib2R5QDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjIxCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIGIgYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYWZ0ZXJfaWZfZWxzZUA2CgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX2ZhbHNlQDIyOgogICAgaW50Y18wIC8vIDAKICAgIGIgYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9tZXJnZUAyMwoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9mYWxzZUAxNjoKICAgIGludGNfMCAvLyAwCiAgICBiIGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfbWVyZ2VAMTcKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5hcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50OgogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGxlbgogICAgcHVzaGludCA2NQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5PYnNlcnZlZENhc2hFdmVudFJlcXVlc3QKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjU0CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyNTUKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjU2CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIzMwogICAgLy8gcmV0dXJuIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQ0xNKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICBwdXNoaW50IDUKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5ODEKICAgIC8vIGFzc2VydCBzZWxmLl9zdXBwb3J0c19vYnNlcnZlZF9ldmVudHMoKSwgZXJyLk9CU0VSVkVEX0VWRU5UX1JFUVVJUkVECiAgICBhc3NlcnQgLy8gT2JzZXJ2ZWQgZXZlbnQgcmVxdWlyZWQgdG8gZXhlY3V0ZSB0aGlzIGFjdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTgyCiAgICAvLyBhc3NlcnQgcGF5bG9hZC5ldmVudF9pZCA9PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LCBlcnIuSU5WQUxJRF9FVkVOVF9JRAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgc3dhcAogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBpZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTgzCiAgICAvLyBhc3NlcnQgcGF5bG9hZC5ldmVudF90eXBlID09IGFyYzQuVUludDgoZW51bXMuRVZUX1BSKSwgZXJyLklOVkFMSURfRVZFTlRfVFlQRQogICAgZGlnIDEKICAgIGV4dHJhY3QgOCAxCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIHB1c2hieXRlcyAweDAzCiAgICBiPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IHR5cGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4NAogICAgLy8gYXNzZXJ0IHBheWxvYWQuZmxhZ3MgJiBVSW50NjQoZW51bXMuRkxBR19DQVNIX0VWRU5UKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBzd2FwCiAgICBwdXNoaW50IDU3CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzEgLy8gMQogICAgJgogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTg2CiAgICAvLyBpZiBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50ID4gVUludDY0KDApOgogICAgYnogYXBwZW5kX29ic2VydmVkX2Nhc2hfZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5ODgKICAgIC8vIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgLSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5ODctOTg5CiAgICAvLyBwcmV2aW91c19lbnRyeSA9IHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeSgKICAgIC8vICAgICBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IC0gVUludDY0KDEpCiAgICAvLyApCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5MQogICAgLy8gcHJldmlvdXNfZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gcGF5bG9hZC5zY2hlZHVsZWRfdGltZQogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDQKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIDw9CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OTAtOTkyCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHByZXZpb3VzX2VudHJ5LnNjaGVkdWxlZF90aW1lIDw9IHBheWxvYWQuc2NoZWR1bGVkX3RpbWUKICAgIC8vICksIGVyci5JTlZBTElEX1NPUlRJTkcKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBtdXN0IGJlIHNvcnRlZCBpbiBzdHJpY3RseSBhc2NlbmRpbmcgb3JkZXIKCmFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5NAogICAgLy8gcGFnZV9pbmRleCA9IHNlbGYuX3NjaGVkdWxlX3BhZ2VfaW5kZXgoc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE5MAogICAgLy8gcmV0dXJuIGV2ZW50X2lkIC8vIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKQogICAgcHVzaGludCAxNgogICAgLwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTk1CiAgICAvLyBwYWdlID0gdHlwLkV4ZWN1dGlvblNjaGVkdWxlUGFnZSgpCiAgICBieXRlYyA0OCAvLyAweDAwMDAKICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTk2CiAgICAvLyBpZiBwYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZToKICAgIGl0b2IKICAgIGJ5dGVjIDI0IC8vIDB4NTMyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgNwogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBhcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5NwogICAgLy8gcGFnZSA9IHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XS5jb3B5KCkKICAgIGRpZyA1CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidXJ5IDYKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX3BhZ2UgZW50cnkgZXhpc3RzCgphcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OTgKICAgIC8vIGFzc2VydCBwYWdlLmxlbmd0aCA8IFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZGlnIDQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgcHVzaGludCAxNgogICAgPAogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAwMwogICAgLy8gc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIGRpZyA1CiAgICBkdXAKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDA0CiAgICAvLyBhY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLmFjY3J1YWxfZmFjdG9yLAogICAgZGlnIDEKICAgIGV4dHJhY3QgMTcgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAwNQogICAgLy8gcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICBkaWcgMgogICAgZXh0cmFjdCAyNSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDA2CiAgICAvLyBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDMKICAgIGV4dHJhY3QgMzMgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAwNwogICAgLy8gbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1wYXlsb2FkLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICBkaWcgNAogICAgZXh0cmFjdCA0MSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDA4CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1wYXlsb2FkLm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgdW5jb3ZlciA1CiAgICBleHRyYWN0IDQ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMDAtMTAxMAogICAgLy8gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkoCiAgICAvLyAgICAgZXZlbnRfaWQ9cGF5bG9hZC5ldmVudF9pZCwKICAgIC8vICAgICBldmVudF90eXBlPXBheWxvYWQuZXZlbnRfdHlwZSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1wYXlsb2FkLnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9cGF5bG9hZC5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIC8vICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1wYXlsb2FkLm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGZsYWdzPXBheWxvYWQuZmxhZ3MsCiAgICAvLyApCiAgICBkaWcgMTAKICAgIGl0b2IKICAgIGRpZyAxMAogICAgY29uY2F0CiAgICB1bmNvdmVyIDYKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTk5LTEwMTEKICAgIC8vIHBhZ2UuYXBwZW5kKAogICAgLy8gICAgIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgICAgICBldmVudF9pZD1wYXlsb2FkLmV2ZW50X2lkLAogICAgLy8gICAgICAgICBldmVudF90eXBlPXBheWxvYWQuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICAgICAgYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPXBheWxvYWQubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1wYXlsb2FkLm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgICAgICBmbGFncz1wYXlsb2FkLmZsYWdzLAogICAgLy8gICAgICkKICAgIC8vICkKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMTIKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHBhZ2UuY29weSgpCiAgICBkaWcgNgogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMTMKICAgIC8vIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgKz0gVUludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI2MAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9nZXRfc3RhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9nZXRfc3RhdGU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGR1cAogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjc1CiAgICAvLyBjb250cmFjdF90eXBlPWFyYzQuVUludDgoc2VsZi5jb250cmFjdF90eXBlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgaXRvYgogICAgZHVwCiAgICBiaXRsZW4KICAgIGludGNfMiAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBleHRyYWN0IDcgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI3NwogICAgLy8gdG90YWxfdW5pdHM9c2VsZi50b3RhbF91bml0cywKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjc4CiAgICAvLyByZXNlcnZlZF91bml0c190b3RhbD1zZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyNzkKICAgIC8vIGluaXRpYWxfZXhjaGFuZ2VfYW1vdW50PXNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI4MAogICAgLy8gZXZlbnRfY3Vyc29yPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjgxCiAgICAvLyBzY2hlZHVsZV9lbnRyeV9jb3VudD1zZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI4MgogICAgLy8gb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjgzCiAgICAvLyBpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlPXNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjg0CiAgICAvLyBub21pbmFsX2ludGVyZXN0X3JhdGU9c2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyODUKICAgIC8vIGFjY3J1ZWRfaW50ZXJlc3Q9c2VsZi5hY2NydWVkX2ludGVyZXN0LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyODYKICAgIC8vIGN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXg9c2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjg3CiAgICAvLyBjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleD1zZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyODgKICAgIC8vIHJlc2VydmVkX2ludGVyZXN0PXNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX2ludGVyZXN0IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI4OQogICAgLy8gcmVzZXJ2ZWRfcHJpbmNpcGFsPXNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI3NC0xMjkwCiAgICAvLyByZXR1cm4gdHlwLktlcm5lbFN0YXRlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGU9YXJjNC5VSW50OChzZWxmLmNvbnRyYWN0X3R5cGUpLAogICAgLy8gICAgIHN0YXR1cz1zZWxmLnN0YXR1cywKICAgIC8vICAgICB0b3RhbF91bml0cz1zZWxmLnRvdGFsX3VuaXRzLAogICAgLy8gICAgIHJlc2VydmVkX3VuaXRzX3RvdGFsPXNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwsCiAgICAvLyAgICAgaW5pdGlhbF9leGNoYW5nZV9hbW91bnQ9c2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCwKICAgIC8vICAgICBldmVudF9jdXJzb3I9c2VsZi5ldmVudF9jdXJzb3IsCiAgICAvLyAgICAgc2NoZWR1bGVfZW50cnlfY291bnQ9c2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwKICAgIC8vICAgICBvdXRzdGFuZGluZ19wcmluY2lwYWw9c2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZT1zZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICAvLyAgICAgbm9taW5hbF9pbnRlcmVzdF9yYXRlPXNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIGFjY3J1ZWRfaW50ZXJlc3Q9c2VsZi5hY2NydWVkX2ludGVyZXN0LAogICAgLy8gICAgIGN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXg9c2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4LAogICAgLy8gICAgIGN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4PXNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgsCiAgICAvLyAgICAgcmVzZXJ2ZWRfaW50ZXJlc3Q9c2VsZi5yZXNlcnZlZF9pbnRlcmVzdCwKICAgIC8vICAgICByZXNlcnZlZF9wcmluY2lwYWw9c2VsZi5yZXNlcnZlZF9wcmluY2lwYWwsCiAgICAvLyApCiAgICB1bmNvdmVyIDE0CiAgICBpdG9iCiAgICB1bmNvdmVyIDE0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMgogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDExCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA5CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgOAogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDcKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyNjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzA0CiAgICAvLyBpZiBzZWxmLmV2ZW50X2N1cnNvciA+PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICA+PQogICAgYnogY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMwNgogICAgLy8gZXZlbnRfaWQ9c2VsZi5ldmVudF9jdXJzb3IsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMDUtMTMxNQogICAgLy8gcmV0dXJuIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgIGV2ZW50X2lkPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgLy8gICAgIGV2ZW50X3R5cGU9YXJjNC5VSW50OCgwKSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1VSW50NjQoMCksCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1VSW50NjQoMCksCiAgICAvLyAgICAgZmxhZ3M9VUludDY0KDApLAogICAgLy8gKQogICAgaXRvYgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMwNwogICAgLy8gZXZlbnRfdHlwZT1hcmM0LlVJbnQ4KDApLAogICAgYnl0ZWMgNDEgLy8gMHgwMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMwNS0xMzE1CiAgICAvLyByZXR1cm4gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkoCiAgICAvLyAgICAgZXZlbnRfaWQ9c2VsZi5ldmVudF9jdXJzb3IsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1hcmM0LlVJbnQ4KDApLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPVVJbnQ2NCgwKSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249VUludDY0KDApLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPVVJbnQ2NCgwKSwKICAgIC8vICAgICBmbGFncz1VSW50NjQoMCksCiAgICAvLyApCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMDgKICAgIC8vIHNjaGVkdWxlZF90aW1lPVVJbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzA1LTEzMTUKICAgIC8vIHJldHVybiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1zZWxmLmV2ZW50X2N1cnNvciwKICAgIC8vICAgICBldmVudF90eXBlPWFyYzQuVUludDgoMCksCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9VUludDY0KDApLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9VUludDY0KDApLAogICAgLy8gICAgIGZsYWdzPVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAoKY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50QDQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjkyCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzE2CiAgICAvLyByZXR1cm4gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KHNlbGYuZXZlbnRfY3Vyc29yKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyOTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiBjb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnRfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnRANAoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLmNvbnRyYWN0X3VwZGF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X3VwZGF0ZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNjEtMTY0CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gZ3JhbnRzIHRoZSB1cGRhdGUgcGVybWlzc2lvbnMgdG8gdGhlIEFycmFuZ2VyLgogICAgLy8gIyDimqDvuI8gV0FSTklORzogQXBwbGljYXRpb24gdXBkYXRlcyBtdXN0IGJlIGV4ZWN1dGVkIFZFUlkgY2FyZWZ1bGx5LCBhcyB0aGV5CiAgICAvLyAjIG1pZ2h0IGludHJvZHVjZSBicmVha2luZyBjaGFuZ2VzLgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTUwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19yb3RhdGVfYXJyYW5nZXJbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3JvdGF0ZV9hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTgwCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODEKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSBuZXdfYXJyYW5nZXIKICAgIGJ5dGVjIDE4IC8vIDB4NTIzYTQxNTI1MjIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4MgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTY2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3NldF9vcF9kYWVtb25bcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3NldF9vcF9kYWVtb246CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTg0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE5OAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTk5CiAgICAvLyBzZWxmLm9wX2RhZW1vbi52YWx1ZSA9IGFkZHJlc3MKICAgIGJ5dGVjIDI3IC8vIDB4NTIzYTRmNTA0NDIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwMAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTg0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2Fzc2lnbl9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19hc3NpZ25fcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDE2CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLlJvbGVWYWxpZGl0eQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI1CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNgogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDQKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgcHVzaGludCAyMAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA1CiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gcm9sZV9hZGRyZXNzCiAgICBieXRlYyAxOCAvLyAweDUyM2E0MTUyNTIyMwogICAgZGlnIDMKICAgIGFwcF9nbG9iYWxfcHV0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyOAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwOAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDQwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDkKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIzIC8vIDB4NTIzYTRkNGU0NzIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTAKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI3CiAgICAvLyBzZWxmLl9zZXRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIHZhbGlkaXR5KQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTMKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjIgLy8gMHg1MjNhNTA1OTQ0MjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNAogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNwogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE2CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpOgogICAgZHVwCiAgICBwdXNoaW50IDYwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTcKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyNiAvLyAweDUyM2E1NDUyNTMyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE4CiAgICAvLyBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjcKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIxCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMSAvLyAweDUyM2E0MTU1NTQyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIyCiAgICAvLyBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNwogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyNAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgODAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI1CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI1IC8vIDB4NTIzYTRkNGY0MzIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjYKICAgIC8vIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfcmV2b2tlX3JvbGVbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3Jldm9rZV9yb2xlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0OQogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjUwCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1MQogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjkKICAgIC8vIGFzc2VydCByb2xlX2lkICE9IFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwgZXJyLklOVkFMSURfUk9MRQogICAgZHVwCiAgICBwdXNoaW50IDIwCiAgICAhPQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMwCiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICBwdXNoaW50IDQwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzEKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjMgLy8gMHg1MjNhNGQ0ZTQ3MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMgogICAgLy8gZGVsIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTMKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzQKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzUKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMiAvLyAweDUyM2E1MDU5NDQyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM2CiAgICAvLyBkZWwgc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTIKICAgIC8vIHNlbGYuX2RlbGV0ZV9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcykKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM4CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpOgogICAgZHVwCiAgICBwdXNoaW50IDYwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzkKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI2IC8vIDB4NTIzYTU0NTI1MzIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDAKICAgIC8vIGRlbCBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjUyCiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDMKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hdXRob3JpdHksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjEgLy8gMHg1MjNhNDE1NTU0MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NAogICAgLy8gZGVsIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1MgogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDYKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDgwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI1IC8vIDB4NTIzYTRkNGY0MzIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDgKICAgIC8vIGRlbCBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19jb250cmFjdF9zdXNwZW5zaW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19jb250cmFjdF9zdXNwZW5zaW9uOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojc5CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyMSAvLyAweDUyM2E0MTU1NTQyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3MQogICAgLy8gc2VsZi5jb250cmFjdF9zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGJ5dGVjIDMzIC8vICJjb250cmFjdF9zdXNwZW5kZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3MgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2NvbnRyYWN0X2RlZmF1bHRbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2NvbnRyYWN0X2RlZmF1bHQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjc0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzYKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnRydXN0ZWUsIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyNiAvLyAweDUyM2E1NDUyNTMyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4NwogICAgLy8gc2VsZi5kZWZhdWx0ZWQgPSBkZWZhdWx0ZWQKICAgIGJ5dGVjIDM0IC8vICJkZWZhdWx0ZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4OAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjc0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9hcnJhbmdlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X2FycmFuZ2VyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwMQogICAgLy8gcmV0dXJuIHNlbGYuYXJyYW5nZXIudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOCAvLyAweDUyM2E0MTUyNTIyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYWRkcmVzc19yb2xlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzAzCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMQogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hY2NvdW50X21hbmFnZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjMgLy8gMHg1MjNhNGQ0ZTQ3MjMKICAgIGRpZyAxCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMgogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5wcmltYXJ5X2RlYWxlciwgYWRkcmVzcyksCiAgICBieXRlYyAyMiAvLyAweDUyM2E1MDU5NDQyMwogICAgZGlnIDIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzIzCiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnRydXN0ZWUsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjYgLy8gMHg1MjNhNTQ1MjUzMjMKICAgIGRpZyAzCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyNAogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIGFkZHJlc3MpLAogICAgYnl0ZWMgMjEgLy8gMHg1MjNhNDE1NTU0MjMKICAgIGRpZyA0CiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyNQogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5vYnNlcnZlciwgYWRkcmVzcyksCiAgICBieXRlYyAyNSAvLyAweDUyM2E0ZDRmNDMyMwogICAgdW5jb3ZlciA1CiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlYyA0MSAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciA2CiAgICBzZXRiaXQKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDUKICAgIHNldGJpdAogICAgcHVzaGludCAyCiAgICB1bmNvdmVyIDQKICAgIHNldGJpdAogICAgcHVzaGludCAzCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgcHVzaGludCA0CiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM0NgogICAgLy8gcm9sZSA9IHJvbGVfaWQuYXNfdWludDY0KCkKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNDcKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGUpCiAgICBkdXAKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzQ5CiAgICAvLyBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKToKICAgIHB1c2hpbnRzIDIwIDQwIDUwIDYwIDcwIDgwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzQ4LTM3OQogICAgLy8gbWF0Y2ggcm9sZToKICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKToKICAgIC8vICAgICAgICAgcmV0dXJuIHR5cC5Sb2xlVmFsaWRpdHkoCiAgICAvLyAgICAgICAgICAgICByb2xlX3ZhbGlkaXR5X3N0YXJ0PVVJbnQ2NCgwKSwgcm9sZV92YWxpZGl0eV9lbmQ9VUludDY0KDApCiAgICAvLyAgICAgICAgICkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSk6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSk6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgXzoKICAgIC8vICAgICAgICAgb3AuZXJyKGVyci5JTlZBTElEX1JPTEUpCiAgICB1bmNvdmVyIDYKICAgIG1hdGNoIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMEAyIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMUAzIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMkA0IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfM0A1IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNEA2IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mzc5CiAgICAvLyBvcC5lcnIoZXJyLklOVkFMSURfUk9MRSkKICAgIGVyciAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV81QDc6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mzc1CiAgICAvLyBzZWxmLm9ic2VydmVyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDI1IC8vIDB4NTIzYTRkNGY0MzIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTcKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mzc0LTM3NgogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM3NwogICAgLy8gcmV0dXJuIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzRANjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNzAKICAgIC8vIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDIxIC8vIDB4NTIzYTQxNTU1NDIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTcKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzY5LTM3MQogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNzIKICAgIC8vIHJldHVybiBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzNANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNjUKICAgIC8vIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAyNiAvLyAweDUyM2E1NDUyNTMyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU3CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM2NC0zNjYKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM2NwogICAgLy8gcmV0dXJuIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzJANDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNjAKICAgIC8vIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMjIgLy8gMHg1MjNhNTA1OTQ0MjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NwogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTktMzYxCiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzYyCiAgICAvLyByZXR1cm4gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzFAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTUKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDIzIC8vIDB4NTIzYTRkNGU0NzIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTcKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzU0LTM1NgogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTcKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzBAMjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTAtMzUyCiAgICAvLyByZXR1cm4gdHlwLlJvbGVWYWxpZGl0eSgKICAgIC8vICAgICByb2xlX3ZhbGlkaXR5X3N0YXJ0PVVJbnQ2NCgwKSwgcm9sZV92YWxpZGl0eV9lbmQ9VUludDY0KDApCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB2b2lkOgpfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZDoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNgogICAgLy8gZGVmIF9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHNlbGYsIGhvbGRpbmdfYWRkcmVzczogQWNjb3VudCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI4CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZCwgZXJyLlNVU1BFTkRFRAogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCAzODQKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIFN1c3BlbmRlZCBvcGVyYXRpb25zCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5fc2V0dGxlX3Bvc2l0aW9uKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NCwgdWludDY0Ogpfc2V0dGxlX3Bvc2l0aW9uOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjQ0CiAgICAvLyBkZWYgX3NldHRsZV9wb3NpdGlvbihzZWxmLCBob2xkaW5nX2FkZHJlc3M6IEFjY291bnQpIC0+IHR1cGxlW1VJbnQ2NCwgVUludDY0XToKICAgIHByb3RvIDEgMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjYxCiAgICAvLyBwb3NpdGlvbiA9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNvcHkoKQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo2My02NQogICAgLy8gIyBDb21wdXRlIHRoZSBpbmNyZW1lbnRhbCBwZXItdW5pdCBmaXhlZC1wb2ludCBpbnRlcmVzdCBhbmQgcHJpbmNpcGFsIGFjY3J1ZWQKICAgIC8vICMgc2luY2UgdGhpcyBhY2NvdW50J3MgbGFzdCBjaGVja3BvaW50LgogICAgLy8gaW50ZXJlc3RfZGVsdGEgPSBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggLSBwb3NpdGlvbi5pbnRlcmVzdF9jaGVja3BvaW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCBleGlzdHMKICAgIGRpZyAxCiAgICBwdXNoaW50IDU3CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjY3CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IC0gcG9zaXRpb24ucHJpbmNpcGFsX2NoZWNrcG9pbnQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggZXhpc3RzCiAgICBkaWcgMgogICAgcHVzaGludCA2NQogICAgZXh0cmFjdF91aW50NjQKICAgIC0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3MwogICAgLy8gaW50ZXJlc3RfZGVsdGEsIHBvc2l0aW9uLnVuaXRzLCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICBkaWcgMgogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjcwLTc0CiAgICAvLyAjIENvbnZlcnQgdGhlIHBlci11bml0IGZpeGVkLXBvaW50IGRlbHRhcyBpbnRvIGFic29sdXRlIGNsYWltYWJsZSBhbW91bnRzCiAgICAvLyAjIHVzaW5nIHRoZSBhY2NvdW50J3MgYWN0aXZlIHVuaXRzLgogICAgLy8gY2xhaW1hYmxlX2ludGVyZXN0ID0gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgaW50ZXJlc3RfZGVsdGEsIHBvc2l0aW9uLnVuaXRzLCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICAvLyApCiAgICB1bmNvdmVyIDMKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzYKICAgIC8vIHByaW5jaXBhbF9kZWx0YSwgcG9zaXRpb24udW5pdHMsIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3NS03NwogICAgLy8gY2xhaW1hYmxlX3ByaW5jaXBhbCA9IHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIHByaW5jaXBhbF9kZWx0YSwgcG9zaXRpb24udW5pdHMsIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUKICAgIC8vICkKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzktODEKICAgIC8vICMgQWNjcnVlIHRoZSBjbGFpbWFibGUgYW1vdW50cyB0byB0aGUgYWNjb3VudCBwb3NpdGlvbiBhbmQgbWFrZSB0aGVtIGF2YWlsYWJsZQogICAgLy8gIyBmb3Igd2l0aGRyYXdhbC4KICAgIC8vIHBvc2l0aW9uLmNsYWltYWJsZV9pbnRlcmVzdCArPSBjbGFpbWFibGVfaW50ZXJlc3QKICAgIGRpZyAyCiAgICBwdXNoaW50IDczCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDIKICAgICsKICAgIGl0b2IKICAgIHVuY292ZXIgMwogICAgc3dhcAogICAgcmVwbGFjZTIgNzMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo4MgogICAgLy8gcG9zaXRpb24uY2xhaW1hYmxlX3ByaW5jaXBhbCArPSBjbGFpbWFibGVfcHJpbmNpcGFsCiAgICBkdXAKICAgIHB1c2hpbnQgODEKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgKwogICAgaXRvYgogICAgcmVwbGFjZTIgODEKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo4NC04NgogICAgLy8gIyBBZHZhbmNlIHRoZSBhY2NvdW50J3MgcGVyLXVuaXQgZml4ZWQtcG9pbnQgY2hlY2twb2ludHMgdG8gdGhlIGN1cnJlbnQgZ2xvYmFsCiAgICAvLyAjIHBlci11bml0IGZpeGVkLXBvaW50IGdsb2JhbCBpbmRpY2VzLgogICAgLy8gcG9zaXRpb24uaW50ZXJlc3RfY2hlY2twb2ludCA9IHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggZXhpc3RzCiAgICBpdG9iCiAgICByZXBsYWNlMiA1NwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojg3CiAgICAvLyBwb3NpdGlvbi5wcmluY2lwYWxfY2hlY2twb2ludCA9IHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggZXhpc3RzCiAgICBpdG9iCiAgICByZXBsYWNlMiA2NQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojg5LTkwCiAgICAvLyAjIEFkdmFuY2UgdGhlIGFjY291bnQncyBldmVudCBjdXJzb3IgdG8gdGhlIGN1cnJlbnQgZ2xvYmFsIGV2ZW50IGN1cnNvci4KICAgIC8vIHBvc2l0aW9uLnNldHRsZWRfY3Vyc29yID0gc2VsZi5ldmVudF9jdXJzb3IKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaXRvYgogICAgcmVwbGFjZTIgNDkKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo5Mi05NAogICAgLy8gIyBVcGRhdGUgdGhlIGFjY291bnQgcG9zaXRpb24gYW5kIHJldHVybiB0aGUgbmV3bHkgYWNjcnVlZCBjbGFpbWFibGUgYW1vdW50cwogICAgLy8gIyBhZGRlZCB0byB0aGUgdG90YWwgcG9zaXRpb24ncyBjbGFpbWFibGUgYW1vdW50cy4KICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gcG9zaXRpb24uY29weSgpCiAgICB1bmNvdmVyIDMKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo5NQogICAgLy8gcmV0dXJuIGNsYWltYWJsZV9pbnRlcmVzdCwgY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQoaG9sZGluZ19hZGRyZXNzOiBieXRlcykgLT4gdm9pZDoKX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQ6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6OTcKICAgIC8vIGRlZiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZChzZWxmLCBob2xkaW5nX2FkZHJlc3M6IEFjY291bnQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTAwCiAgICAvLyBpZiBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKToKICAgIGJ6IF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwMQogICAgLy8gcmV0dXJuCiAgICByZXRzdWIKCl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDMKICAgIC8vIHBvc2l0aW9uID0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY29weSgpCiAgICBmcmFtZV9kaWcgMgogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA0CiAgICAvLyBpZiBwb3NpdGlvbi5yZXNlcnZlZF91bml0cyA9PSBVSW50NjQoMCk6CiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIGJueiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZF9hZnRlcl9pZl9lbHNlQDQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDUKICAgIC8vIHJldHVybgogICAgcmV0c3ViCgpfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZF9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA4CiAgICAvLyBwb3NpdGlvbi51bml0cyArPSBhY3RpdmF0ZWRfdW5pdHMKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDMKICAgICsKICAgIGl0b2IKICAgIHJlcGxhY2UyIDMyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA5CiAgICAvLyBwb3NpdGlvbi5yZXNlcnZlZF91bml0cyA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGl0b2IKICAgIHJlcGxhY2UyIDQwCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTEwCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHBvc2l0aW9uLmNvcHkoKQogICAgZnJhbWVfZGlnIDIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTEKICAgIC8vIGFzc2VydCBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID49IGFjdGl2YXRlZF91bml0cywgZXJyLk9WRVJfRElTVFJJQlVUSU9OCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIGV4aXN0cwogICAgZHVwCiAgICBkaWcgMgogICAgPj0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgcmVtYWluaW5nIEQtQVNBIHVuaXRzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTEyCiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIC09IGFjdGl2YXRlZF91bml0cwogICAgc3dhcAogICAgLQogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9zY2FsZWRfbXVsX2RpdihtdWx0aXBsaWNhbmQ6IHVpbnQ2NCwgbXVsdGlwbGllcjogdWludDY0LCBkaXZpc29yOiB1aW50NjQpIC0+IHVpbnQ2NDoKX3NjYWxlZF9tdWxfZGl2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTUzLTE1NQogICAgLy8gZGVmIF9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLCBtdWx0aXBsaWNhbmQ6IFVJbnQ2NCwgbXVsdGlwbGllcjogVUludDY0LCBkaXZpc29yOiBVSW50NjQKICAgIC8vICkgLT4gVUludDY0OgogICAgcHJvdG8gMyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTcKICAgIC8vIGlmIG11bHRpcGxpY2FuZCA9PSBVSW50NjQoMCkgb3IgbXVsdGlwbGllciA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTMKICAgIGJ6IF9zY2FsZWRfbXVsX2Rpdl9pZl9ib2R5QDIKICAgIGZyYW1lX2RpZyAtMgogICAgYm56IF9zY2FsZWRfbXVsX2Rpdl9hZnRlcl9pZl9lbHNlQDMKCl9zY2FsZWRfbXVsX2Rpdl9pZl9ib2R5QDI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTgKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9zY2FsZWRfbXVsX2Rpdl9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTkKICAgIC8vIGhpZ2gsIGxvdyA9IG9wLm11bHcobXVsdGlwbGljYW5kLCBtdWx0aXBsaWVyKQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIG11bHcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2MAogICAgLy8gcmV0dXJuIG9wLmRpdncoaGlnaCwgbG93LCBkaXZpc29yKQogICAgZnJhbWVfZGlnIC0xCiAgICBkaXZ3CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYW1vdW50X3RvX2luZGV4X2RlbHRhKGFtb3VudDogdWludDY0KSAtPiB1aW50NjQ6Cl9hbW91bnRfdG9faW5kZXhfZGVsdGE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjIKICAgIC8vIGRlZiBfYW1vdW50X3RvX2luZGV4X2RlbHRhKHNlbGYsIGFtb3VudDogVUludDY0KSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2NAogICAgLy8gaWYgYW1vdW50ID09IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMQogICAgYm56IF9hbW91bnRfdG9faW5kZXhfZGVsdGFfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjUKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9hbW91bnRfdG9faW5kZXhfZGVsdGFfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTY2CiAgICAvLyBhc3NlcnQgc2VsZi50b3RhbF91bml0cyA+IFVJbnQ2NCgwKSwgZXJyLk5PX1VOSVRTCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgZHVwCiAgICBhc3NlcnQgLy8gTm8gRC1BU0EgdW5pdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2NwogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KGFtb3VudCwgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwgc2VsZi50b3RhbF91bml0cykKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2luZGV4X2RlbHRhX3RvX2Ftb3VudChpbmRleF9kZWx0YTogdWludDY0KSAtPiB1aW50NjQ6Cl9pbmRleF9kZWx0YV90b19hbW91bnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjkKICAgIC8vIGRlZiBfaW5kZXhfZGVsdGFfdG9fYW1vdW50KHNlbGYsIGluZGV4X2RlbHRhOiBVSW50NjQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTc2CiAgICAvLyBpZiBpbmRleF9kZWx0YSA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGJueiBfaW5kZXhfZGVsdGFfdG9fYW1vdW50X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTc3CiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfaW5kZXhfZGVsdGFfdG9fYW1vdW50X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE3OQogICAgLy8gc2VsZi50b3RhbF91bml0cywKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxODEKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNzgtMTgyCiAgICAvLyByZXR1cm4gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgc2VsZi50b3RhbF91bml0cywKICAgIC8vICAgICBpbmRleF9kZWx0YSwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2dldF9zY2hlZHVsZV9lbnRyeShldmVudF9pZDogdWludDY0KSAtPiBieXRlczoKX2dldF9zY2hlZHVsZV9lbnRyeToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIwMgogICAgLy8gZGVmIF9nZXRfc2NoZWR1bGVfZW50cnkoc2VsZiwgZXZlbnRfaWQ6IFVJbnQ2NCkgLT4gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnk6CiAgICBwcm90byAxIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIwNAogICAgLy8gYXNzZXJ0IGV2ZW50X2lkIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgPgogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgaWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE5MAogICAgLy8gcmV0dXJuIGV2ZW50X2lkIC8vIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDE2CiAgICAvCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMDYKICAgIC8vIGFzc2VydCBwYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxOTQKICAgIC8vIHJldHVybiBldmVudF9pZCAlIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDE2CiAgICAlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMDkKICAgIC8vIGFzc2VydCBvZmZzZXQgPCBwYWdlLmxlbmd0aCwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBwdXNoaW50IDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgMQogICAgPgogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjEwCiAgICAvLyByZXR1cm4gcGFnZVtvZmZzZXRdLmNvcHkoKQogICAgcHVzaGludCA2NQogICAgKgogICAgcHVzaGludCAyCiAgICArCiAgICBwdXNoaW50IDY1CiAgICBib3hfZXh0cmFjdAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKGNvbnRyYWN0X3R5cGU6IHVpbnQ2NCwgZXZlbnRfdHlwZTogdWludDY0KSAtPiB2b2lkOgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTMtMzE1CiAgICAvLyBkZWYgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIHNlbGYsIGNvbnRyYWN0X3R5cGU6IFVJbnQ2NCwgZXZlbnRfdHlwZTogVUludDY0CiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNDcKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNDgKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgaW50Y18yIC8vIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI0OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9NRCksCiAgICBwdXNoaW50IDE5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTAKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgcHVzaGludCAxMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU0LTI1NQogICAgLy8gIyBDaGVjayBjb21tb24gZXZlbnRzIGZpcnN0CiAgICAvLyBpZiBldmVudF90eXBlIGluIGNvbW1vbl9ldmVudHM6CiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjUxCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICBwdXNoaW50IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUA3CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU2CiAgICAvLyByZXR1cm4gVHJ1ZQogICAgaW50Y18xIC8vIDEKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICByZXRzdWIKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTgtMjU5CiAgICAvLyAjIENvbnRyYWN0LXNwZWNpZmljIGFkZGl0aW9uYWwgZXZlbnRzCiAgICAvLyBpZiBjb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9QQU0pOgogICAgZnJhbWVfZGlnIC0yCiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjYwLTI2MQogICAgLy8gIyBQQU0gb25seSBzdXBwb3J0cyBjb21tb24gZXZlbnRzCiAgICAvLyByZXR1cm4gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNjMKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0xBTSkgb3IgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2My0yNjUKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0xBTSkgb3IgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoCiAgICAvLyAgICAgZW51bXMuQ1RfTkFNCiAgICAvLyApOgogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDExCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMgogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDE2CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUAxMToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2Ni0yNzAKICAgIC8vICMgTEFNL05BTSBhZGQ6IFBSLCBJUENCCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjY4CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjY2LTI3MAogICAgLy8gIyBMQU0vTkFNIGFkZDogUFIsIElQQ0IKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDEzCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIHB1c2hpbnQgMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2Ni0yNzAKICAgIC8vICMgTEFNL05BTSBhZGQ6IFBSLCBJUENCCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICkKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF9mYWxzZUAxNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAxMzoKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDE0OgogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMTY6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzIKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTik6CiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMjMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3My0yNzgKICAgIC8vICMgQU5OIGFkZHM6IFBSLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjc1CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjczLTI3OAogICAgLy8gIyBBTk4gYWRkczogUFIsIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDIwCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIHB1c2hpbnQgMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3My0yNzgKICAgIC8vICMgQU5OIGFkZHM6IFBSLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyMAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzcKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIHB1c2hpbnQgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjczLTI3OAogICAgLy8gIyBBTk4gYWRkczogUFIsIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDIxCgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDIwOgogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMjE6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAyMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MAogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfTEFYKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA0CiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMzEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MS0yODcKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MwogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUiksCiAgICBwdXNoaW50IDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MS0yODcKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjgKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjg0CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjgxLTI4NwogICAgLy8gIyBMQVggYWRkczogUFIsIFBJLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyOAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODUKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICBwdXNoaW50IDE4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODEtMjg3CiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDI4CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODEtMjg3CiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDI5CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDI4OgogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMjk6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAzMToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4OQogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQ0xNKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA1CiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMzMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI5MC0yOTEKICAgIC8vICMgQ0xNIGFkZHM6IFBSCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1BSKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDMKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDMzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjkzCiAgICAvLyByZXR1cm4gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5faXNfZHluYW1pY19hbm51aXR5KCkgLT4gdWludDY0OgpfaXNfZHluYW1pY19hbm51aXR5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM1CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzUtMzM2CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIC8vIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGJ6IF9pc19keW5hbWljX2FubnVpdHlfYm9vbF9mYWxzZUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzYKICAgIC8vIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzNSAvLyAiZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM1LTMzNgogICAgLy8gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICAvLyBhbmQgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBieiBfaXNfZHluYW1pY19hbm51aXR5X2Jvb2xfZmFsc2VAMwogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMzNC0zMzcKICAgIC8vIHJldHVybiAoCiAgICAvLyAgICAgc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICAvLyAgICAgYW5kIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgLy8gKQogICAgcmV0c3ViCgpfaXNfZHluYW1pY19hbm51aXR5X2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzQtMzM3CiAgICAvLyByZXR1cm4gKAogICAgLy8gICAgIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKQogICAgLy8gICAgIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIC8vICkKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KGVudHJ5OiBieXRlcykgLT4gdWludDY0LCBieXRlczoKX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozODAKICAgIC8vIGRlZiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudChzZWxmLCBlbnRyeTogdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5CiAgICAvLyBlbnRyeS5hY2NydWFsX2ZhY3RvciA9PSBVSW50NjQoMCkKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAxNwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5LTM5MQogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGJ6IF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2lmX2JvZHlAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzkwCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5LTM5MQogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGJ6IF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2lmX2JvZHlAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzkxCiAgICAvLyBvciBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPT0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5LTM5MQogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGJueiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudF9hZnRlcl9pZl9lbHNlQDQKCl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2lmX2JvZHlAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5MwogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2RpZyAtMQogICAgdW5jb3ZlciAyCiAgICByZXRzdWIKCl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NQogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NgogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NC0zOTgKICAgIC8vIGFjY3J1ZWQgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICAvLyAgICAgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICkKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MDIKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozOTktNDAzCiAgICAvLyByZXR1cm4gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgYWNjcnVlZCwKICAgIC8vICAgICBlbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICBmcmFtZV9kaWcgLTEKICAgIHVuY292ZXIgMgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yKGRpc2NvdW50X2ZhY3RvcjogdWludDY0LCByZWRlbXB0aW9uX2ZhY3RvcjogdWludDY0KSAtPiB1aW50NjQ6Cl9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ2Mi00NjYKICAgIC8vIGRlZiBfZGlzY291bnRfYW5udWl0eV9mYWN0b3IoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBkaXNjb3VudF9mYWN0b3I6IFVJbnQ2NCwKICAgIC8vICAgICByZWRlbXB0aW9uX2ZhY3RvcjogVUludDY0LAogICAgLy8gKSAtPiBVSW50NjQ6CiAgICBwcm90byAyIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ2OAogICAgLy8gaWYgcmVkZW1wdGlvbl9mYWN0b3IgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0xCiAgICBibnogX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDY5CiAgICAvLyByZXR1cm4gZGlzY291bnRfZmFjdG9yCiAgICBmcmFtZV9kaWcgLTIKICAgIHJldHN1YgoKX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3MAogICAgLy8gcGVyaW9kX3JhdGUgPSBzZWxmLmZpeGVkX3BvaW50X3NjYWxlICsgc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzEKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzAtNDc0CiAgICAvLyBwZXJpb2RfcmF0ZSA9IHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgKyBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICByZWRlbXB0aW9uX2ZhY3RvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICBkaWcgMgogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgICsKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3NQogICAgLy8gYXNzZXJ0IHBlcmlvZF9yYXRlID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGR1cAogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDc4CiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDc2LTQ4MAogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIGRpc2NvdW50X2ZhY3RvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gICAgIHBlcmlvZF9yYXRlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkoZW50cnk6IGJ5dGVzLCBwYXlsb2FkOiBieXRlcykgLT4gYnl0ZXMsIGJ5dGVzOgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MTMtNjE1CiAgICAvLyBkZWYgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5KAogICAgLy8gICAgIHNlbGYsIGVudHJ5OiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSwgcGF5bG9hZDogdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0CiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAyIDIKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjIzCiAgICAvLyBhc3NlcnQgZW50cnkuZXZlbnRfaWQgPT0gc2VsZi5ldmVudF9jdXJzb3IsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGN1cnNvcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjI0CiAgICAvLyBhc3NlcnQgZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsIGVyci5OT19EVUVfQ0FTSEZMT1cKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPD0KICAgIGFzc2VydCAvLyBObyBkdWUgY2FzaGZsb3cgdG8gcGF5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MjYKICAgIC8vIGV2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYyNwogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX0lFRCk6CiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGR1cAogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYyOC02MzAKICAgIC8vICMgSUVEIGZpbmFsaXplcyBpc3N1YW5jZTogcmVzZXJ2ZWQgdW5pdHMgYmVjb21lIGFjdGl2YXRhYmxlIGFuZCB0aGUKICAgIC8vICMgc2NoZWR1bGUncyBpbml0aWFsIGNvbnRyYWN0dWFsIHN0YXRlIGJlY29tZXMgbGl2ZS4KICAgIC8vIGFzc2VydCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzIKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPT0gc2VsZi50b3RhbF91bml0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjMxLTYzMwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID09IHNlbGYudG90YWxfdW5pdHMKICAgIC8vICksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9JTkNPTVBMRVRFCiAgICBhc3NlcnQgLy8gUHJpbWFyeSBkaXN0cmlidXRpb24gaXMgbm90IGNvbXBsZXRlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzQKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM1CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzYKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAzMwogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzcKICAgIC8vIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM4CiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzkKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0MAogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX0FDVElWRSkKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgMTAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDUxCiAgICAvLyBhc3NlcnQgZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSA9PSBVSW50NjQoZW51bXMuRVZUX0lFRCksIGVyci5OT1RfRVZUX0lFRAogICAgZnJhbWVfZGlnIDExCiAgICBhc3NlcnQgLy8gTm90IElFRCBldmVudAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDUyCiAgICAvLyByZXR1cm4gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0MS02NDUKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1zZWxmLl9lbnRyeV9pZWRfYW1vdW50KGVudHJ5KSwKICAgIC8vICAgICBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0NAogICAgLy8gc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0MS02NDUKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1zZWxmLl9lbnRyeV9pZWRfYW1vdW50KGVudHJ5KSwKICAgIC8vICAgICBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICAvLyApCiAgICBjYWxsc3ViIF9lbWl0X2V4ZWN1dGlvbl9ldmVudAogICAgZHVwCiAgICBmcmFtZV9idXJ5IC0yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NDYKICAgIC8vIHJldHVybgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0OQogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ICs9IHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBmcmFtZV9idXJ5IC0yCiAgICArCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1MQogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1JSKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCAxMgogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMTAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1NQogICAgLy8gcGF5bG9hZC5vYnNlcnZlZF9yYXRlLAogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjU2CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzNyAvLyAicmF0ZV9yZXNldF9tdWx0aXBsaWVyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1NwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1Mi02NTgKICAgIC8vICMgUlIgZGVyaXZlcyB0aGUgbmV4dCByYXRlIGZyb20gYW4gb2JzZXJ2ZWQgb3JhY2xlIHZhbHVlIHBsdXMgdGhlCiAgICAvLyAjIGNvbnRyYWN0IHNwcmVhZCAvIG11bHRpcGxpZXIgdGVybXMsIHRoZW4gZW5mb3JjZXMgZmxvb3IgYW5kIGNhcC4KICAgIC8vIG9ic2VydmVkX3JhdGUgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBwYXlsb2FkLm9ic2VydmVkX3JhdGUsCiAgICAvLyAgICAgc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICkKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjAKICAgIC8vIG9ic2VydmVkX3JhdGUgKyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzYgLy8gInJhdGVfcmVzZXRfc3ByZWFkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkIGV4aXN0cwogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDEKICAgIC8vIGlmIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgYW5kIHJhdGUgPCBzZWxmLnJhdGVfcmVzZXRfZmxvb3I6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzkgLy8gImhhc19yYXRlX3Jlc2V0X2Zsb29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmhhc19yYXRlX3Jlc2V0X2Zsb29yIGV4aXN0cwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMSAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X2Zsb29yIGV4aXN0cwogICAgZnJhbWVfZGlnIDYKICAgID4KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDIKICAgIC8vIHJhdGUgPSBzZWxmLnJhdGVfcmVzZXRfZmxvb3IKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMSAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDYKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfZmxvb3IgZXhpc3RzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1NToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc0MwogICAgLy8gaWYgc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgYW5kIHJhdGUgPiBzZWxmLnJhdGVfcmVzZXRfY2FwOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQwIC8vICJoYXNfcmF0ZV9yZXNldF9jYXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwIGV4aXN0cwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTgKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMiAvLyAicmF0ZV9yZXNldF9jYXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9jYXAgZXhpc3RzCiAgICBmcmFtZV9kaWcgNgogICAgPAogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc0NAogICAgLy8gcmF0ZSA9IHNlbGYucmF0ZV9yZXNldF9jYXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMiAvLyAicmF0ZV9yZXNldF9jYXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSA2CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X2NhcCBleGlzdHMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjU5CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IHNlbGYuX2NsYW1wX3JhdGUoCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NTktNjYxCiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IHNlbGYuX2NsYW1wX3JhdGUoCiAgICAvLyAgICAgb2JzZXJ2ZWRfcmF0ZSArIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQKICAgIC8vICkKICAgIGZyYW1lX2RpZyA2CiAgICBhcHBfZ2xvYmFsX3B1dAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMTg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzEKICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QSSk6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMjAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY3MgogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzMKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDIzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc4CiAgICAvLyBpZiBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKToKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAyOQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc5CiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFJGKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCA1CiAgICA9PQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMzAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4MwogICAgLy8gKyAoc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCAtIHNlbGYuZXZlbnRfY3Vyc29yKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICAtCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODQKICAgIC8vICogVUludDY0KGNzdC5PUF9VUF9OT05fQ0FTSF9QRVJfRU5UUllfQlVER0VUKQogICAgcHVzaGludCAxMDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4My02ODQKICAgIC8vICsgKHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgLSBzZWxmLmV2ZW50X2N1cnNvcikKICAgIC8vICogVUludDY0KGNzdC5PUF9VUF9OT05fQ0FTSF9QRVJfRU5UUllfQlVER0VUKQogICAgKgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjgyCiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX05PTl9DQVNIX0JBU0VfQlVER0VUKQogICAgaW50YyA0IC8vIDE1MDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4Mi02ODQKICAgIC8vIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfQkFTRV9CVURHRVQpCiAgICAvLyArIChzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IC0gc2VsZi5ldmVudF9jdXJzb3IpCiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfUEVSX0VOVFJZX0JVREdFVCkKICAgICsKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4MC02ODYKICAgIC8vIGVuc3VyZV9idWRnZXQoCiAgICAvLyAgICAgcmVxdWlyZWRfYnVkZ2V0PSgKICAgIC8vICAgICAgICAgVUludDY0KGNzdC5PUF9VUF9OT05fQ0FTSF9CQVNFX0JVREdFVCkKICAgIC8vICAgICAgICAgKyAoc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCAtIHNlbGYuZXZlbnRfY3Vyc29yKQogICAgLy8gICAgICAgICAqIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfUEVSX0VOVFJZX0JVREdFVCkKICAgIC8vICAgICApLAogICAgLy8gKQogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDkwCiAgICAvLyBkaXNjb3VudF9mYWN0b3IgPSBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5MQogICAgLy8gZGVub21pbmF0b3IgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5MgogICAgLy8gc2tpcF9maXJzdF9yZWRlbXB0aW9uID0gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5NAogICAgLy8gaWYgZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAyNQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgZnJhbWVfYnVyeSA4CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAzNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDk1LTQ5OQogICAgLy8gIyBBbiBpbml0aWFsIFBSRiBtYXkgZGVzY3JpYmUgdGhlIGZpcnN0IHJlZGVtcHRpb24gcGVyaW9kIGRpcmVjdGx5LgogICAgLy8gZGlzY291bnRfZmFjdG9yID0gc2VsZi5fZGlzY291bnRfYW5udWl0eV9mYWN0b3IoCiAgICAvLyAgICAgZGlzY291bnRfZmFjdG9yLAogICAgLy8gICAgIGVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDgKICAgIGNhbGxzdWIgX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTAxCiAgICAvLyBza2lwX2ZpcnN0X3JlZGVtcHRpb24gPSBUcnVlCiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfYnVyeSA3CiAgICBmcmFtZV9idXJ5IDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDM1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTAzCiAgICAvLyBmdXR1cmVfZXZlbnRfaWQgPSBzZWxmLmV2ZW50X2N1cnNvciArIFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfd2hpbGVfdG9wQDM2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA0CiAgICAvLyB3aGlsZSBmdXR1cmVfZXZlbnRfaWQgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgZnJhbWVfZGlnIDMKICAgID4KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl93aGlsZUA0OAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA1CiAgICAvLyBmdXR1cmVfZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoZnV0dXJlX2V2ZW50X2lkKQogICAgZnJhbWVfZGlnIDMKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwNgogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPSBmdXR1cmVfZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MDctNTA4CiAgICAvLyAjIE9ubHkgcmVkZW1wdGlvbi1iZWFyaW5nIGV2ZW50cyBjb250cmlidXRlIHRvIHRoZSBhbm51aXR5IGRlbm9taW5hdG9yLgogICAgLy8gaXNfcmVkZW1wdGlvbl9ldmVudCA9IGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpIG9yICgKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwNy01MTEKICAgIC8vICMgT25seSByZWRlbXB0aW9uLWJlYXJpbmcgZXZlbnRzIGNvbnRyaWJ1dGUgdG8gdGhlIGFubnVpdHkgZGVub21pbmF0b3IuCiAgICAvLyBpc19yZWRlbXB0aW9uX2V2ZW50ID0gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QUikgb3IgKAogICAgLy8gICAgIGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfTUQpCiAgICAvLyAgICAgYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICAvLyApCiAgICBibnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfdHJ1ZUA0MAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA5CiAgICAvLyBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgZnJhbWVfZGlnIDQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MDktNTEwCiAgICAvLyBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgLy8gYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF9mYWxzZUA0MQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTEwCiAgICAvLyBhbmQgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IgPiBVSW50NjQoMCkKICAgIGZyYW1lX2RpZyAwCiAgICBwdXNoaW50IDI1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA5LTUxMAogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCkKICAgIC8vIGFuZCBmdXR1cmVfZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX3RydWVANDA6CiAgICBpbnRjXzEgLy8gMQoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfbWVyZ2VANDI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTIKICAgIC8vIGlmIGlzX3JlZGVtcHRpb25fZXZlbnQ6CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA0NwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTEzCiAgICAvLyBpZiBza2lwX2ZpcnN0X3JlZGVtcHRpb246CiAgICBmcmFtZV9kaWcgNwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUA0NQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTE0CiAgICAvLyBza2lwX2ZpcnN0X3JlZGVtcHRpb24gPSBGYWxzZQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgNwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANDc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjEKICAgIC8vIGZ1dHVyZV9ldmVudF9pZCArPSBVSW50NjQoMSkKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV93aGlsZV90b3BAMzYKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlANDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTgKICAgIC8vIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZnJhbWVfZGlnIDAKICAgIHB1c2hpbnQgMjUKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTYtNTE5CiAgICAvLyBkaXNjb3VudF9mYWN0b3IgPSBzZWxmLl9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcigKICAgIC8vICAgICBkaXNjb3VudF9mYWN0b3IsCiAgICAvLyAgICAgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMgogICAgc3dhcAogICAgY2FsbHN1YiBfZGlzY291bnRfYW5udWl0eV9mYWN0b3IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjAKICAgIC8vIGRlbm9taW5hdG9yICs9IGRpc2NvdW50X2ZhY3RvcgogICAgZnJhbWVfZGlnIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA0NwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDE6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF9tZXJnZUA0MgoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX3doaWxlQDQ4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTIzCiAgICAvLyBhc3NlcnQgZGVub21pbmF0b3IgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZnJhbWVfZGlnIDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUyNAogICAgLy8gbnVtZXJhdG9yID0gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTI1CiAgICAvLyBpZiBlbnRyeS5mbGFncyAmIFVJbnQ2NChlbnVtcy5GTEFHX0lOSVRJQUxfUFJGKSA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNTcKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gOAogICAgJgogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDUwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjYtNTI3CiAgICAvLyAjIFN1YnNlcXVlbnQgUFJGIGV2ZW50cyBhbW9ydGl6ZSBib3RoIHByaW5jaXBhbCBhbmQgYWxyZWFkeSBhY2NydWVkIGNhcnJ5LgogICAgLy8gbnVtZXJhdG9yICs9IHNlbGYuYWNjcnVlZF9pbnRlcmVzdAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgICsKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDUwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTMwCiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTI4LTUzMgogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIG51bWVyYXRvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gICAgIGRlbm9taW5hdG9yLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDEKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODcKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IHNlbGYuX3JlY2FsY3VsYXRlX2FubnVpdHlfcGF5bWVudCgKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njg3LTY4OQogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gc2VsZi5fcmVjYWxjdWxhdGVfYW5udWl0eV9wYXltZW50KAogICAgLy8gICAgIGVudHJ5CiAgICAvLyApCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMzA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OTIKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY5My02OTcKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1VSW50NjQoMCksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OTUKICAgIC8vIHBheW9mZj1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njk2CiAgICAvLyBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY5My02OTcKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1VSW50NjQoMCksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgY2FsbHN1YiBfZW1pdF9leGVjdXRpb25fZXZlbnQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDI5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjkxCiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDMwCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDIwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc0CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9JUENCKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCAxOAogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDIzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzUtNjc2CiAgICAvLyAjIElQQ0Iga2VlcHMgcHJpbmNpcGFsIHVuY2hhbmdlZCBhbmQgb25seSByZXNldHMgdGhlIGludGVyZXN0IGJhc2UuCiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIGIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMjMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMTA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjIKICAgIC8vIGVsaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1JSRik6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgMTEKICAgID09CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDE0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjMKICAgIC8vIG5leHRfcmF0ZSA9IGVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY0CiAgICAvLyBpZiBuZXh0X3JhdGUgPT0gVUludDY0KDApOgogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDEzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjUKICAgIC8vIG5leHRfcmF0ZSA9IHNlbGYucmF0ZV9yZXNldF9uZXh0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzggLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDUKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfbmV4dCBleGlzdHMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY2CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IG5leHRfcmF0ZQogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgZnJhbWVfZGlnIDUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDE0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY4CiAgICAvLyBpZiBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSAhPSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgOQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2OQogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPSBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZQogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgZnJhbWVfZGlnIDkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KGVudHJ5OiBieXRlcywgcGF5b2ZmOiB1aW50NjQsIHNldHRsZWRfYW1vdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpfZW1pdF9leGVjdXRpb25fZXZlbnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MDMtNzA5CiAgICAvLyBkZWYgX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgKiwKICAgIC8vICAgICBlbnRyeTogdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnksCiAgICAvLyAgICAgcGF5b2ZmOiBVSW50NjQsCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ6IFVJbnQ2NCwKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDMgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzEzCiAgICAvLyBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25JRAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE0CiAgICAvLyBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIGZyYW1lX2RpZyAtMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTUKICAgIC8vIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIGZyYW1lX2RpZyAtMwogICAgZXh0cmFjdCA4IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxNgogICAgLy8gc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICBmcmFtZV9kaWcgLTMKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTcKICAgIC8vIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MjAKICAgIC8vIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIGZyYW1lX2RpZyAtMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE1CiAgICAvLyBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICBpbnRjXzIgLy8gOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIwCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBnZXRieXRlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDkKICAgIC8vIGlmIHBheW9mZiA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJueiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NTAKICAgIC8vIHJldHVybiBVSW50NjQoZW51bXMuUEFZT0ZGX1NJR05fUE9TSVRJVkUpCiAgICBpbnRjXzEgLy8gMQoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX3BheW9mZl9zaWduQDc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTktNzIxCiAgICAvLyBwYXlvZmZfc2lnbj1hcmM0LlVJbnQ4KAogICAgLy8gICAgIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIC8vICksCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgaW50Y18yIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MjMKICAgIC8vIGN1cnJlbmN5X2lkPXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzI0CiAgICAvLyBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTItNzI1CiAgICAvLyBFeGVjdXRpb25FdmVudCgKICAgIC8vICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIC8vICAgICBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYXBwbGllZF9hdD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICBwYXlvZmY9cGF5b2ZmLAogICAgLy8gICAgIHBheW9mZl9zaWduPWFyYzQuVUludDgoCiAgICAvLyAgICAgICAgIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIC8vICAgICApLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PXNldHRsZWRfYW1vdW50LAogICAgLy8gICAgIGN1cnJlbmN5X2lkPXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAwCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzExLTcyNgogICAgLy8gYXJjNC5lbWl0KAogICAgLy8gICAgIEV4ZWN1dGlvbkV2ZW50KAogICAgLy8gICAgICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgICAgIHBheW9mZj1wYXlvZmYsCiAgICAvLyAgICAgICAgIHBheW9mZl9zaWduPWFyYzQuVUludDgoCiAgICAvLyAgICAgICAgICAgICBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICAvLyAgICAgICAgICksCiAgICAvLyAgICAgICAgIHNldHRsZWRfYW1vdW50PXNldHRsZWRfYW1vdW50LAogICAgLy8gICAgICAgICBjdXJyZW5jeV9pZD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgICAgIHNlcXVlbmNlPWVudHJ5LmV2ZW50X2lkICsgVUludDY0KDEpLAogICAgLy8gICAgICkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDlhMzMyYjk1IC8vIG1ldGhvZCAiRXhlY3V0aW9uRXZlbnQodWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc1MQogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiAoVUludDY0KGVudW1zLkVWVF9JRUQpLCBVSW50NjQoZW51bXMuRVZUX1BJKSk6CiAgICBmcmFtZV9kaWcgNQogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBibnogX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2lmX2JvZHlANQogICAgZnJhbWVfZGlnIDUKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGJ6IF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pZl9lbHNlQDYKCl9lbWl0X2V4ZWN1dGlvbl9ldmVudF9pZl9ib2R5QDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NTIKICAgIC8vIHJldHVybiBVSW50NjQoZW51bXMuUEFZT0ZGX1NJR05fUE9TSVRJVkUpCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIwCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBiIF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9wYXlvZmZfc2lnbkA3CgpfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzUzCiAgICAvLyByZXR1cm4gVUludDY0KGVudW1zLlBBWU9GRl9TSUdOX05FR0FUSVZFKQogICAgcHVzaGludCAyNTUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcyMAogICAgLy8gc2VsZi5fcGF5b2ZmX3NpZ24oZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSwgcGF5b2ZmKQogICAgYiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fcGF5b2ZmX3NpZ25ANwoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9yb2xlX2lzX2FjdGl2ZShyb2xlX21hcDogYnl0ZXMsIHJvbGVfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NDoKX3JvbGVfaXNfYWN0aXZlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5CiAgICAvLyBkZWYgX3JvbGVfaXNfYWN0aXZlKHNlbGYsIHJvbGVfbWFwOiB0eXAuUmJhY1JvbGUsIHJvbGVfYWRkcmVzczogQWNjb3VudCkgLT4gYm9vbDoKICAgIHByb3RvIDIgMQogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTcKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAtNjQKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYxCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjIKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYxLTYyCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYxLTYzCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjMKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjItNjMKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgPj0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2MS02MwogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX21lcmdlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAtNjQKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKSAtPiB2b2lkOgpfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2NwogICAgLy8gYXNzZXJ0IHNlbGYuX2lzX2FycmFuZ2VyKFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTQKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgPT0gc2VsZi5hcnJhbmdlci52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE4IC8vIDB4NTIzYTQxNTI1MjIzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJyYW5nZXIgZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjY3CiAgICAvLyBhc3NlcnQgc2VsZi5faXNfYXJyYW5nZXIoVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkgLT4gdm9pZDoKX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg1CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuZGVmYXVsdGVkLCBlcnIuREVGQVVMVEVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzQgLy8gImRlZmF1bHRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kZWZhdWx0ZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRGVmYXVsdGVkCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKSAtPiB2b2lkOgpfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODgKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5jb250cmFjdF9zdXNwZW5kZWQsIGVyci5TVVNQRU5ERUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMyAvLyAiY29udHJhY3Rfc3VzcGVuZGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3N1c3BlbmRlZCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBTdXNwZW5kZWQgb3BlcmF0aW9ucwogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGVfaWQ6IHVpbnQ2NCkgLT4gdm9pZDoKX2Fzc2VydF92YWxpZF9yb2xlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkwCiAgICAvLyBkZWYgX2Fzc2VydF92YWxpZF9yb2xlKHNlbGYsIHJvbGVfaWQ6IFVJbnQ2NCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkxLTk5CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MgogICAgLy8gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgcHVzaGludCAyMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkxLTk5CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTMKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICBwdXNoaW50IDI1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEtOTkKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NAogICAgLy8gVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIHB1c2hpbnQgNDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MS05OQogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojk1CiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICBwdXNoaW50IDUwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEtOTkKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NgogICAgLy8gVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICBwdXNoaW50IDYwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEtOTkKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NwogICAgLy8gVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIHB1c2hpbnQgNzAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MS05OQogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojk4CiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICBwdXNoaW50IDgwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEtOTkKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBieiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9mYWxzZUA4CgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDc6CiAgICBpbnRjXzEgLy8gMQoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfbWVyZ2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MS05OQogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICByZXRzdWIKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX2ZhbHNlQDg6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9tZXJnZUA5Cg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" }, "byteCode": { - "approval": "DCAFAAEIINwLJjIEFR98dQZzdGF0dXMMZXZlbnRfY3Vyc29yFHNjaGVkdWxlX2VudHJ5X2NvdW50FW91dHN0YW5kaW5nX3ByaW5jaXBhbBFmaXhlZF9wb2ludF9zY2FsZRBhY2NydWVkX2ludGVyZXN0GWludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UCQSMVbm9taW5hbF9pbnRlcmVzdF9yYXRlDWNvbnRyYWN0X3R5cGUUcmVzZXJ2ZWRfdW5pdHNfdG90YWwScmVzZXJ2ZWRfcHJpbmNpcGFsC3RvdGFsX3VuaXRzGW5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24RcmVzZXJ2ZWRfaW50ZXJlc3QZY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleBpjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleAZSOkFSUiMTc2V0dGxlbWVudF9hc3NldF9pZBdpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudAZSOkFVVCMGUjpQWUQjBlI6TU5HIwJTIwZSOk1PQyMGUjpUUlMjBlI6T1BEIxVpbml0aWFsX2V4Y2hhbmdlX2RhdGUVdHJhbnNmZXJfb3BlbmluZ19kYXRlFXRyYW5zZmVyX2Nsb3N1cmVfZGF0ZRByYXRlX3Jlc2V0X2Zsb29yDnJhdGVfcmVzZXRfY2FwD2Fzc2V0X3N1c3BlbmRlZBxkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uEXJhdGVfcmVzZXRfc3ByZWFkFXJhdGVfcmVzZXRfbXVsdGlwbGllcg9yYXRlX3Jlc2V0X25leHQUaGFzX3JhdGVfcmVzZXRfZmxvb3ISaGFzX3JhdGVfcmVzZXRfY2FwAQAPYXNzZXRfZGVmYXVsdGVkD3Byb3NwZWN0dXNfaGFzaA5wcm9zcGVjdHVzX3VybBVkZW5vbWluYXRpb25fYXNzZXRfaWQNbWF0dXJpdHlfZGF0ZRRkYXlfY291bnRfY29udmVudGlvbglkZWZhdWx0ZWQDBoEBAgAAMRhAALEnEjIDZycbMgNnJyEiZycpImcpImcnCiJnJyqAAGcnK4AAZycsImcnEyJnJxwiZyctImcnHSJnJx4iZycuImcnDSJnJwsiZycUImcnBCJnJw4iZyciImcnByJnJwYiZycJImcnIyJnJyQiZycfImcnICJnJyUiZycmImcnJyJnJwwiZycPImcnECJnJxEiZyoiZysiZycvImcnBSJnMTWBChJEMTSBNhJEMTcURDE2FESABJFPBOs2GgCOAQDOMRkURDEYQQC3ghkEtEYYyATngyUpBJQ4hyMEbIXj7gS90alEBHwPGBIEFPwQ7wR0pyl/BAnU/hQEmpv6hQSF7tM9BKssD8QE2fIlrASYg1BaBPtNRCgEjqbnTAQCr1V6BIL3Gy0E7wT10wTfNDVQBD2+gL0EHj5I5wQBDIKZBHQGrNIEGnKi7jYaAI4ZAFYDIQR9BKcFMQYhBlsGswbmBxQJCAofCpgMBAz2DRUNqA3tDgUOHQ7SD2gPhw+SD9wAgASVbXFWNhoAjgEG8QAxGYEEEjEYEERCDc2KAgCL/oEKCIsAMgwNQQAqsYEGshCBBbIZJzCyHicwsh+L/40CAAsABLNC/9syALIBQv/1IrIBQv/viSKAAEcNNhoBSRUkEkQXIillRESIFb2IFcSIFckiKWVEgTISFESIEiBBAAtJgWQLIQQIIoj/jyJFBSJFDiJFDUsESwEMQQJZIiplRCIrZUQMQQJNIiplRIgQ8klFEYEJW0lFAzIHDUACN0sPJFVJRRAkEklFBEAAEEsOgQMSQAAISw6BExJBAj8jQQIUSw8iWyIqZUQSREsBMgcOREsCQAHtSw6BExJAAeUiRQtLDyRVSUUQgQMSQAFlSw6BExJAAV0iRQZLD4ExW0UIiBF6QAD+SwdFCUsKiBA4SwaIEDNLAYgQTUlOAkUPSYgQRElFC0sCSwEISUUJMgoiJxNlRHAARCInD2VEIicMZURLAQhLAksBD0RPAkwJTwIPRE8DCCcPTGciJwxlRAgnDExnIicQZURPAggnEExnIicRZUQIJxFMZ0sPJFWBAxJBAHoiJwZlREsQiBEGRRIIJwZMZ4gQ5kEACksPJFWBExJBAAlLD4EpWycOTGcnBEsIZycHSwlnIiplRCMIKkxnSw9XCAGAAROoQQARIicEZURAAAkpgcgBZycHImdLD0sESYgTc0hLDUsMCEUOSwxLBwhFDUsEIwhFBUL+dycGImdC/5BLDyRVSUUQgQMSQQAQIicEZURLBglJRQlFCUL+6UsOJBJBABMiJwRlTEUJRCInB2VMRQpEQv7PSw6BExJAAAdLB0UJQv7AIkUIIkUJQv63iBAnQQBWSw6BExJBAAoiJwRlREUGQv6OIicGZURLEIgQHkUSCElFCyInDmVED0EABiJFBkL+byInDmVESwoJSUUIIicEZUQNQQAKIicEZURFBkL+UUsGRQZC/kpLD4ExWyInBGVESg5ETAlFBkL+NiInBmVESxCID8ZFEghFC0L+DEsESURLDklLD0lOAwgyB08CFk8DFlBPAhZQTwIWUEwWUChMULAjQyJC/b6AAEcCNhoBRwIVJRJENhoCSSJZgQIISwEVEkRXAgBMIillREQnCExQSb1FAUQiJxtlRDIDE0EAIjEAIicbZUQSQAAVMQBLAxJAAA0xAEsBvkRXACASQQEAI0SIErWIEroiKWVEgTISFERLAkmIDWqIDO1GAkm+REmBSVtJTgJFCEmBUVtJRQhPAghJRQZEVwAgIicTZURwAEUBQQC3Sb5EgYADU0AArSNBAHgyCiInE2VETEsBcABESwVJTgIPREsCSU4DvkRJVwAgsTIATwOyEkyyFE8CshGBBLIQsgGzSYFJW0lOAkUJSYFRW0lOA0UJIhZMSwFcSUxcUU8DTL8iJw9lRElLAg9EIicMZURLAw9ETAknD0xnIicMZURMCScMTGdLBUlLBklOAwgyB08CFk8DFlBPAhZQTBZQSwJJFRZXBgJMUEyAAgAiUExQKExQsCNDIkL/UCJC/v02GgFJFSQSRBc2GgJJFSQSRBeIEZdKDEQnHU8CZyceTGcyBxYoTFCwI0M2GgFJFSUSRDYaAkkVJBJEF0lOAiIpZUREJxYxAIgRLkSIEWiIEW0iKWVEgTISRCcISwJQSU4DvUUBREyIC4lJRCInC2VECCInDWVEDkQiJxxlREEACTIHIiccZUQOREcCvkSBKFtLA0lOAwgWgShMuyInC2VECCcLSwFnIicNZURMCRYoTFCwI0MiSTYaAUkVJRJENhoCSRUlEkQ2GgNHAhUkEkQXIillRESIEN6IEOMiKWVEgTISFEQiJx1lREEACSInHWVEMgcORCInHmVEQQAJMgciJx5lRAxEMQBLBElOAhJEJwhLAVBJRQhJvUUBRCcISwVJTgJQSUUJvUUBREsCiArCSYgKvk8CE0RLAUlETL5EJVsORCIqZUQiK2VED0AADiIqZUSIC8+BCVsyBw1ESwNJiAsaSwNJTgKICxKICpVGAogKkEYCSwVJvkQlW0sCSU4CSwEOREsBCRZPAiVPArtLBUm+RCVbTwIIFiVMuyhLAlCwI0M2GgFJFSUSRDYaAkkVIxJEIlMnFTEAiA+7RCcITwJQSb1FAURJgTAjuiJPA1SBMEy7MgcWKExQsCNDNhoBSRUlEkQ2GgJJFSUSRCcXMQCID4NEIillRIHIARIURIgPs4gPuCcITwJQSb1FARREIhZPAksBUEsBUCcoUEsBUEsBUEsBUEsBUExQvzIHFihMULAjQzYaAUkVJRJENhoCSRUlEkQnCEsCUEm9RQFEMQBPAxJEiA9diA9iIk8CuzIHFihMULAjQzYaAUkVJRJEJwhMUEm9RQFEvkgoTFCwI0M2GgFJFSUSRCcSTGcyBxYoTFCwI0OAAEk2GgFHAhWBaxJENhoCSU4CFYFIEkQ2GgNJTgJJFUsBJVlJgSISRE8CTEsCUklOAyJZgSQIEkSIDtkiVUknCksBZ0EAIkkjEkAAHEmBAhJAABVJgQMSQAAOSYEEEkAAB0mBBRJBAYcjRCInCmVMRQJESwRJgSFbSUUIRIE5VUlFCEEAH0sGIxJAABhLBoECEkAAEEsGgQMSQAAISwaBBBJBAUcjREkjE0EACEsEgZIGUxREIillRBREIicUZUQUREsESSNbSXELRQFEJyxLAWdLAYEJW0lPAhJEJxNLAWexMgAyCiKyErIUTLIRgQSyELIBs0mBEVsnDUxnJwsiZycuSwhnSYEpWyccSwFnSwGBMVsnLUsBZ0sGSU4CgTBbJw5MZycUSwpnSwOBkgZTJyJMZ0sBgRBbJwRMZ0sBgShbJwZMZ0sBJVsnCUxnSwGBGFsnB0xnSwOBOlsnI0xnSwOBQlsnJExnSwOBSlsnH0xnSwOBUlsnIExnSwOBWlsnJUxnSwOBkAZTJyZMZ0sDgZEGUycnTGdPA4FjWycFTGdLASRbKkxnSwGBOFsnEExnSwGBQFsnEUxnJw8iZycMImdLAjIHDURMIltLAgxEDERLAlcAICcqTGdLAVcCACcrTGcyBxYoTFCwI0MiQv62IkL+diKAAEcCNhoBSRUkEkQXSTYaAkkVIxJEIlNMNhoDSU4CSSJZSU4DSYFBC4ECCE8CFRJEiAzsIicKZUxOA0QiKWVEFERJgRAORCInFGVEREyBEAtMgWQLIQQIIoj2tiJJSwQMQQCLSwRXAgBJRQxLAUlOAoFBC4FBWEkkVUlOAkUNSSJbSUUNSwVPBAhLARJESwVPA4gIOEyBCVtJRQpEQQAXSUEAJUkjCYFBC0sLTIFBWIEJW0sIDkRLCEAABUsJIxJESSMIRQFC/5RLBklEIwkWJxhMUEm9RQFESSKBAroXSUQjCYFBC4ECCIFBukL/wUsGFicYTFBJvEhLBb9LBUEADEsBSwQIK0xnKYEyZzIHFihMULAjQyIpZUREiAwCiAwJiAwOIiplRCIrZURLAQ1EiAdmSVcIAUmAAQGoREsBVwAISwJXCQhLA1cRCEsEVxkISwVXIQhLBlcpCEsHVzEISwhXOQhPB08IUE8HUE8GUE8FUCIWUE8EUE8DUE8CUExQiAiYRgIyBxYoTFCwI0MiRwSAAEk2GgFJFSQSRBc2GgJHAhWBSRJEIillRESIC3qIC3+BQVtJgQQaQQCwIicKZUSBBRJEiAtXIicKZURJgQUSREsCSSJbSUUHIitlRBJESVcIAUUMJFWIBuEiK2VEgRAKJzFFBxYnGExQSUUJvUUBQQAHSwe+TEUHREsFSSJZSYEQDERLA0lXCQhLAVcRCEsCVxkISwNXKQhLBFcxCE8FVzkISwsWSxJQTwZQTwVQTwRQTwNQTwJQTFBLAxZQTwJMUEwjCBZXBgJcAEsISbxITL8iK2VEIwgrTGciKmVESwNJTwISRIgGHklFCElXCAFFCiRVSUUGIxJAAChLBIEEEkAAIEsEgQwSQAAYSwSBCxJAABBLBIESEkAACEsEgQUSQQBBI0RLCIABAalESwSBDBJAAAhLBIELEkEAJCNBABonGTEAiAoSREsGSwKIBzpGAjIHFihMULAjQ4gKMEL/6CJC/9kiQv+8Ikk2GgFHAhWBQRJEIillRESIChGIChiICh0iKWVEgTISFEQiJwplRIEFEkRJIltJTgIiK2VETEsBEkRLAVcIAUlOA4ABA6hETIE5W0lOAiMaREEAEyIrZUQjCYgFQIEJW0sEgQlbDkQiK2VEgRAKJzFFBhYnGExQSUUHvUUBQQAHSwW+TEUGREsESSJZSYEQDERLBUlXCQhLAVcRCEsCVxkISwNXIQhLBFcpCE8FVzEISwoWSwpQTwZQTwVQTwRQTwNQTwJQTFBLAxZQTwJMUEwjCBZXBgJcAEsGSbxITL8iK2VEIwgrTGcyBxYoTFCwI0M2GgFJFSMSRCJTJxoxAIgI7kQnL0xnMgcWKExQsCNDIillRElEIicKZUQWSZMkDkRXBwEiJw1lRCInC2VEIicUZUQiKmVEIitlRCInBGVEIicHZUQiJwllRCInBmVEIicQZUQiJxFlRCInD2VEIicMZURPDhZPDkxQTw0WUE8MFlBPCxZQTwoWUE8JFlBPCBZQTwcWUE8GFlBPBRZQTwQWUE8DFlBPAhZQTBZQKExQsCNDIillREQiKmVEIitlRA9BACUiKmVEFicoUCIWTEsBUEsBUEsBUEsBUEsBUEsBUExQKExQsCNDIiplRIgDvUL/8IgIPiNDNhoBSRUlEkSICDEnEkxnMgcWKExQsCNDNhoBSRUlEkSICBknG0xnMgcWKExQsCNDNhoBSRUjEkQ2GgJJTgIVJRJENhoDSU4CFYEQEkSIB+yIB/MXRwKIB/2BFBJBAA4nEksDZzIHFihMULAjQ0mBKBJBABEnF0sDUEm9RQEUREsCv0L/30mBMhJBABEnFksDUEm9RQEUREsCv0L/x0mBPBJBABEnGksDUEm9RQEUREsCv0L/r0mBRhJBABEnFUsDUEm9RQEUREsCv0L/l0mBUBJB/5AnGUsDUEm9RQEUREsCv0L/fzYaAUkVIxJENhoCSU4CFSUSRIgHQogHSRdHAogHU0mBFBNEgSgSQQAVJxdLAlBJvUUBRLxIMgcWKExQsCNDSYEyEkEADycWSwJQSb1FAUS8SEL/4UmBPBJBAA8nGksCUEm9RQFEvEhC/8tJgUYSQQAPJxVLAlBJvUUBRLxIQv+1SYFQEkH/ricZSwJQSb1FAUS8SEL/nzYaAUkVIxJEIlMnFTEAiAZ8RCchTGcyBxYoTFCwI0MiJxJlRChMULAjQzYaAUkVJRJEJxdLAYgGVCcWSwKIBk0nGksDiAZGJxVLBIgGPycZTwWIBjgnKCJPBlQjTwVUgQJPBFSBA08DVIEETwJUKExQsCNDNhoBSRUjEkQ2GgJJTgIVJRJEF0mIBlCDBhQoMjxGUE8GjgYATwBAADEAIgATAAEAJxlLAVBJvUUBRL5IKExQsCNDJxVLAVBJvUUBRL5IQv/rJxpLAVBJvUUBRL5IQv/cJxZLAVBJvUUBRL5IQv/NJxdLAVBJvUUBRL5IQv++gBAAAAAAAAAAAAAAAAAAAAAAQv+pigEAJwiL/1C+RIGAA1MURImKAQInCIv/UEm9RQFESb5IIicQZURLAYE5WwkiJxFlREsCgUFbCUsCJVsiJwVlRE8DSwJPAogAmCInBWVETwNPA08CiACKSwKBSVtLAggWTwNMXElJgVFbSwIIFlxRIicQZUQWXDkiJxFlRBZcQSIqZUQWXDFPA0y/iYoBACKAACcIi/9QSb1FAUQiKWVEgTISQQABiYsCvkxJTgKMAESBKFtJjAFAAAGJiwBJJVuLAUlOAwgWXCAiFlwoiwJMvyInC2VESUsCD0RMCScLTGeJigMBi/1BAAWL/kAAAiKJi/2L/h2L/5eJigEBi/9AAAIiiSInDWVESUQiJwVlRIv/TE8CiP/KiYoBAYv/QAACIokiJw1lRCInBWVEi/9MiP+viYoBASIrZUSL/w1Ei/+BEAoWJxhMUEm9RQFEi/+BEBhLASKBAroXSwENRIFBC4ECCIFBuomKAgCL/yMSQAAfi/8kEkAAGIv/gRMSQAAQi/+BDBJAAAiL/4ELEkEAAyNEiYv+QAAEIkL/9Yv+gQMSQAAIi/6BAhJBABiL/4EDEkAACIv/gRISQQAEI0L/0SJC/82L/iMSQQAgi/+BAxJAABCL/4ESEkAACIv/gQUSQQAEI0L/qiJC/6aL/oEEEkEAKIv/gQMSQAAYi/+BBBJAABCL/4ESEkAACIv/gQUSQQAEI0L/eiJC/3aL/oEFEkEACIv/gQMSQv9mIkL/YiInCmVEIxJBAAoiJyJlREEAAiOJIomKAQKL/4ERW0lBABAiJwllREEACCInB2VEQAAGIov/TwKJIicHZUQiJwllRCInBWVEiP5oIicFZUSLAEyI/l2L/08CiYoCAYv/QAADi/6JIicFZUQiJwllRIv/SwKI/jwISUQiJwVlRIv+TE8CiP4siYoCAiKAAEcIi/4iWyIqZUQSRIv+gQlbMgcORIv+JFVJIxJJQQBeIillRIEyEkQiJwtlRCInDWVEEkSL/oExWycESwFnJwdMZ4v+gSFbJwlMZycGImeL/oEpWycOTGciKmVEIwgqTGcpgWRniwtEIicUZUSL/kwiiAHaSYz+i/+MAYwAiSIpZUSBMhIURCInBmVEi/6I/viM/ggnBkxniwqBDBJBAXiL/4EhWyInJGVEIicFZUSI/XMiJyNlRAiMBiInJmVEQQATIicfZUSLBg1BAAgiJx9lTIwGRCInJ2VEQQATIicgZUSLBgxBAAgiJyBlTIwGRCcJiwZniwqBBBJBAQeL/oExWycESwFnJwdMZ4j+ZUEA54sKgQUSQQDFIitlRCIqZUQJgWQLIQQIIojrxCInBWVMjAJEIowBIowHi/6BGVtJjAhBAA+LAosIiP6BSYwCI4wHjAEiKmVEIwiMAyIrZUSLAw1BAFKLA4j9DEmMACRVSYwEgQMSQAAQiwSBExJBADOLAIEZW0EAKyNBAAiLB0EADCKMB4sDIwiMA0L/vosAgRlbiwJMiP4kSYwCiwEIjAFC/+EiQv/SiwFEIicEZUSL/oE5WyQaQAAGIicGZUQIIicFZUSLAYj8SycOTGciKmVEIwgqTGeL/iJJiABgSYz+i/+MAYwAiYv+gSlbJw5MZ0L/2osKgRISQf7/IicEZUQnB0xnQv7ziwqBCxJBABuL/oEhW0mMBUAACCInJWVMjAVEJwmLBWdC/rqL/oEhW0mMCUH+rycJiwlnQv6nigMBMgiL/SJbi/1XCAGL/VcJCDIHi/0kVYv+QABFIxZJkyQORFcHASInE2VEiwFJIwiLABZPAhZQiwJQiwNQiwQWUIv+FlBPA1CL/xZQTwIWUEwWUIAEmjMrlUxQsIv9jACJiwUjEkAACIsFgQQSQQAEI0L/qYH/AUL/o4oCAYAAi/6L/1BJvUUBQQAfiwG+RCJbMgdJjAAOQQAQiwG+RCRbiwAPQQAEI4wAiSJC//kxACInEmVEEkSJIicpZUQURIkiJyFlRBREiYoBAIv/gRQSQAAwi/+BGRJAACiL/4EoEkAAIIv/gTISQAAYi/+BPBJAABCL/4FGEkAACIv/gVASQQADI0SJIkL/+g==", + "approval": "DCAFAAEIINwLJjEEFR98dQZzdGF0dXMMZXZlbnRfY3Vyc29yFHNjaGVkdWxlX2VudHJ5X2NvdW50FW91dHN0YW5kaW5nX3ByaW5jaXBhbBFmaXhlZF9wb2ludF9zY2FsZRBhY2NydWVkX2ludGVyZXN0GWludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UCQSMVbm9taW5hbF9pbnRlcmVzdF9yYXRlDWNvbnRyYWN0X3R5cGUUcmVzZXJ2ZWRfdW5pdHNfdG90YWwScmVzZXJ2ZWRfcHJpbmNpcGFsC3RvdGFsX3VuaXRzGW5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24RcmVzZXJ2ZWRfaW50ZXJlc3QZY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleBpjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleAZSOkFSUiMTc2V0dGxlbWVudF9hc3NldF9pZBdpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudAZSOkFVVCMGUjpQWUQjBlI6TU5HIwJTIwZSOk1PQyMGUjpUUlMjBlI6T1BEIxVpbml0aWFsX2V4Y2hhbmdlX2RhdGUVdHJhbnNmZXJfb3BlbmluZ19kYXRlFXRyYW5zZmVyX2Nsb3N1cmVfZGF0ZRByYXRlX3Jlc2V0X2Zsb29yDnJhdGVfcmVzZXRfY2FwEmNvbnRyYWN0X3N1c3BlbmRlZAlkZWZhdWx0ZWQcZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbhFyYXRlX3Jlc2V0X3NwcmVhZBVyYXRlX3Jlc2V0X211bHRpcGxpZXIPcmF0ZV9yZXNldF9uZXh0FGhhc19yYXRlX3Jlc2V0X2Zsb29yEmhhc19yYXRlX3Jlc2V0X2NhcAEAD3Byb3NwZWN0dXNfaGFzaA5wcm9zcGVjdHVzX3VybBVkZW5vbWluYXRpb25fYXNzZXRfaWQNbWF0dXJpdHlfZGF0ZRRkYXlfY291bnRfY29udmVudGlvbgMGgQECAAAxGEAArScSMgNnJxsyA2cnISJnJyIiZykiZycKImcnKoAAZycrgABnJywiZycTImcnHCJnJy0iZycdImcnHiJnJy4iZycNImcnCyJnJxQiZycEImcnDiJnJyMiZycHImcnBiJnJwkiZyckImcnJSJnJx8iZycgImcnJiJnJyciZycoImcnDCJnJw8iZycQImcnESJnKiJnKyJnJwUiZzE1gQoSRDE0gTYSRDE3FEQxNhREgASRTwTrNhoAjgEAzjEZFEQxGEEAt4IZBLRGGMgE54MlKQSUOIcjBGyF4+4EvdGpRAR8DxgSBBT8EO8EdKcpfwQJ1P4UBJqb+oUEhe7TPQSrLA/EBNnyJawEmINQWgSOpudMBAKvVXoEgvcbLQTvBPXTBN80NVAEPb6AvQQePkjnBDkkH6MEAQyCmQR0BqzSBBpyou42GgCOGQBWAyEEfQSnBTEGIQZbBrMG5gcUCQgKHwqYDAQM9g2JDc4N5g3+DrMPSQ9oD4cPkg/cAIAElW1xVjYaAI4BBvEAMRmBBBIxGBBEQg2uigIAi/6BCgiLADIMDUEAKrGBBrIQgQWyGScvsh4nL7Ifi/+NAgALAASzQv/bMgCyAUL/9SKyAUL/74kigABHDTYaAUkVJBJEFyIpZUREiBW9iBXEiBXJIillRIEyEhREiBIgQQALSYFkCyEECCKI/48iRQUiRQ4iRQ1LBEsBDEECWSIqZUQiK2VEDEECTSIqZUSIEPJJRRGBCVtJRQMyBw1AAjdLDyRVSUUQJBJJRQRAABBLDoEDEkAACEsOgRMSQQI/I0ECFEsPIlsiKmVEEkRLATIHDkRLAkAB7UsOgRMSQAHlIkULSw8kVUlFEIEDEkABZUsOgRMSQAFdIkUGSw+BMVtFCIgRekAA/ksHRQlLCogQOEsGiBAzSwGIEE1JTgJFD0mIEERJRQtLAksBCElFCTIKIicTZURwAEQiJw9lRCInDGVESwEISwJLAQ9ETwJMCU8CD0RPAwgnD0xnIicMZUQIJwxMZyInEGVETwIIJxBMZyInEWVECCcRTGdLDyRVgQMSQQB6IicGZURLEIgRBkUSCCcGTGeIEOZBAApLDyRVgRMSQQAJSw+BKVsnDkxnJwRLCGcnB0sJZyIqZUQjCCpMZ0sPVwgBgAETqEEAESInBGVEQAAJKYHIAWcnByJnSw9LBEmIE3NISw1LDAhFDksMSwcIRQ1LBCMIRQVC/ncnBiJnQv+QSw8kVUlFEIEDEkEAECInBGVESwYJSUUJRQlC/ulLDiQSQQATIicEZUxFCUQiJwdlTEUKREL+z0sOgRMSQAAHSwdFCUL+wCJFCCJFCUL+t4gQJ0EAVksOgRMSQQAKIicEZURFBkL+jiInBmVESxCIEB5FEghJRQsiJw5lRA9BAAYiRQZC/m8iJw5lREsKCUlFCCInBGVEDUEACiInBGVERQZC/lFLBkUGQv5KSw+BMVsiJwRlREoOREwJRQZC/jYiJwZlREsQiA/GRRIIRQtC/gxLBElESw5JSw9JTgMIMgdPAhZPAxZQTwIWUE8CFlBMFlAoTFCwI0MiQv2+gABHAjYaAUcCFSUSRDYaAkkiWYECCEsBFRJEVwIATCIpZUREJwhMUEm9RQFEIicbZUQyAxNBACIxACInG2VEEkAAFTEASwMSQAANMQBLAb5EVwAgEkEBACNEiBK1iBK6IillRIEyEhRESwJJiA1qiAztRgJJvkRJgUlbSU4CRQhJgVFbSUUITwIISUUGRFcAICInE2VEcABFAUEAt0m+RIGAA1NAAK0jQQB4MgoiJxNlRExLAXAAREsFSU4CD0RLAklOA75ESVcAILEyAE8DshJMshRPArIRgQSyELIBs0mBSVtJTgJFCUmBUVtJTgNFCSIWTEsBXElMXFFPA0y/IicPZURJSwIPRCInDGVESwMPREwJJw9MZyInDGVETAknDExnSwVJSwZJTgMIMgdPAhZPAxZQTwIWUEwWUEsCSRUWVwYCTFBMgAIAIlBMUChMULAjQyJC/1AiQv79NhoBSRUkEkQXNhoCSRUkEkQXiBGXSgxEJx1PAmcnHkxnMgcWKExQsCNDNhoBSRUlEkQ2GgJJFSQSRBdJTgIiKWVERCcWMQCIES5EiBFoiBFtIillRIEyEkQnCEsCUElOA71FAURMiAuJSUQiJwtlRAgiJw1lRA5EIiccZURBAAkyByInHGVEDkRHAr5EgShbSwNJTgMIFoEoTLsiJwtlRAgnC0sBZyInDWVETAkWKExQsCNDIkk2GgFJFSUSRDYaAkkVJRJENhoDRwIVJBJEFyIpZUREiBDeiBDjIillRIEyEhREIicdZURBAAkiJx1lRDIHDkQiJx5lREEACTIHIiceZUQMRDEASwRJTgISRCcISwFQSUUISb1FAUQnCEsFSU4CUElFCb1FAURLAogKwkmICr5PAhNESwFJREy+RCVbDkQiKmVEIitlRA9AAA4iKmVEiAvPgQlbMgcNREsDSYgLGksDSU4CiAsSiAqVRgKICpBGAksFSb5EJVtLAklOAksBDkRLAQkWTwIlTwK7SwVJvkQlW08CCBYlTLsoSwJQsCNDNhoBSRUlEkQ2GgJJFSMSRCJTJxUxAIgPu0QnCE8CUEm9RQFESYEwI7oiTwNUgTBMuzIHFihMULAjQzYaAUkVJRJENhoCSRUlEkQnFzEAiA+DRCIpZUSByAESFESID7OID7gnCE8CUEm9RQEURCIWTwJLAVBLAVAnKVBLAVBLAVBLAVBLAVBMUL8yBxYoTFCwI0M2GgFJFSUSRDYaAkkVJRJEJwhLAlBJvUUBRDEATwMSRIgPXYgPYiJPArsyBxYoTFCwI0M2GgFJFSUSRCcITFBJvUUBRL5IKExQsCNDNhoBSRUlEkQnEkxnMgcWKExQsCNDgABJNhoBRwIVgWsSRDYaAklOAhWBSBJENhoDSU4CSRVLASVZSYEiEkRPAkxLAlJJTgMiWYEkCBJEiA7ZIlVJJwpLAWdBACJJIxJAABxJgQISQAAVSYEDEkAADkmBBBJAAAdJgQUSQQGHI0QiJwplTEUCREsESYEhW0lFCESBOVVJRQhBAB9LBiMSQAAYSwaBAhJAABBLBoEDEkAACEsGgQQSQQFHI0RJIxNBAAhLBIGSBlMURCIpZUQURCInFGVEFERLBEkjW0lxC0UBRCcsSwFnSwGBCVtJTwISRCcTSwFnsTIAMgoishKyFEyyEYEEshCyAbNJgRFbJw1MZycLImcnLksIZ0mBKVsnHEsBZ0sBgTFbJy1LAWdLBklOAoEwWycOTGcnFEsKZ0sDgZIGUycjTGdLAYEQWycETGdLAYEoWycGTGdLASVbJwlMZ0sBgRhbJwdMZ0sDgTpbJyRMZ0sDgUJbJyVMZ0sDgUpbJx9MZ0sDgVJbJyBMZ0sDgVpbJyZMZ0sDgZAGUycnTGdLA4GRBlMnKExnTwOBY1snBUxnSwEkWypMZ0sBgThbJxBMZ0sBgUBbJxFMZycPImcnDCJnSwIyBw1ETCJbSwIMRAxESwJXACAnKkxnSwFXAgAnK0xnMgcWKExQsCNDIkL+tiJC/nYigABHAjYaAUkVJBJEF0k2GgJJFSMSRCJTTDYaA0lOAkkiWUlOA0mBQQuBAghPAhUSRIgM7CInCmVMTgNEIillRBRESYEQDkQiJxRlRERMgRALTIFkCyEECCKI9rYiSUsEDEEAi0sEVwIASUUMSwFJTgKBQQuBQVhJJFVJTgJFDUkiW0lFDUsFTwQISwESREsFTwOICDhMgQlbSUUKREEAF0lBACVJIwmBQQtLC0yBQViBCVtLCA5ESwhAAAVLCSMSREkjCEUBQv+USwZJRCMJFicYTFBJvUUBREkigQK6F0lEIwmBQQuBAgiBQbpC/8FLBhYnGExQSbxISwW/SwVBAAxLAUsECCtMZymBMmcyBxYoTFCwI0MiKWVERIgMAogMCYgMDiIqZUQiK2VESwENRIgHZklXCAFJgAEBqERLAVcACEsCVwkISwNXEQhLBFcZCEsFVyEISwZXKQhLB1cxCEsIVzkITwdPCFBPB1BPBlBPBVAiFlBPBFBPA1BPAlBMUIgImEYCMgcWKExQsCNDIkcEgABJNhoBSRUkEkQXNhoCRwIVgUkSRCIpZUREiAt6iAt/gUFbSYEEGkEAsCInCmVEgQUSRIgLVyInCmVESYEFEkRLAkkiW0lFByIrZUQSRElXCAFFDCRViAbhIitlRIEQCicwRQcWJxhMUElFCb1FAUEAB0sHvkxFB0RLBUkiWUmBEAxESwNJVwkISwFXEQhLAlcZCEsDVykISwRXMQhPBVc5CEsLFksSUE8GUE8FUE8EUE8DUE8CUExQSwMWUE8CTFBMIwgWVwYCXABLCEm8SEy/IitlRCMIK0xnIiplREsDSU8CEkSIBh5JRQhJVwgBRQokVUlFBiMSQAAoSwSBBBJAACBLBIEMEkAAGEsEgQsSQAAQSwSBEhJAAAhLBIEFEkEAQSNESwiAAQGpREsEgQwSQAAISwSBCxJBACQjQQAaJxkxAIgKEkRLBksCiAc6RgIyBxYoTFCwI0OICjBC/+giQv/ZIkL/vCJJNhoBRwIVgUESRCIpZUREiAoRiAoYiAodIillRIEyEhREIicKZUSBBRJESSJbSU4CIitlRExLARJESwFXCAFJTgOAAQOoREyBOVtJTgIjGkRBABMiK2VEIwmIBUCBCVtLBIEJWw5EIitlRIEQCicwRQYWJxhMUElFB71FAUEAB0sFvkxFBkRLBEkiWUmBEAxESwVJVwkISwFXEQhLAlcZCEsDVyEISwRXKQhPBVcxCEsKFksKUE8GUE8FUE8EUE8DUE8CUExQSwMWUE8CTFBMIwgWVwYCXABLBkm8SEy/IitlRCMIK0xnMgcWKExQsCNDIillRElEIicKZUQWSZMkDkRXBwEiJw1lRCInC2VEIicUZUQiKmVEIitlRCInBGVEIicHZUQiJwllRCInBmVEIicQZUQiJxFlRCInD2VEIicMZURPDhZPDkxQTw0WUE8MFlBPCxZQTwoWUE8JFlBPCBZQTwcWUE8GFlBPBRZQTwQWUE8DFlBPAhZQTBZQKExQsCNDIillREQiKmVEIitlRA9BACUiKmVEFicpUCIWTEsBUEsBUEsBUEsBUEsBUEsBUExQKExQsCNDIiplRIgD3EL/8IgIXSNDNhoBSRUlEkSICFAnEkxnMgcWKExQsCNDNhoBSRUlEkSICDgnG0xnMgcWKExQsCNDNhoBSRUjEkQ2GgJJTgIVJRJENhoDSU4CFYEQEkSICAuICBIXRwKICByBFBJBAA4nEksDZzIHFihMULAjQ0mBKBJBABEnF0sDUEm9RQEUREsCv0L/30mBMhJBABEnFksDUEm9RQEUREsCv0L/x0mBPBJBABEnGksDUEm9RQEUREsCv0L/r0mBRhJBABEnFUsDUEm9RQEUREsCv0L/l0mBUBJB/5AnGUsDUEm9RQEUREsCv0L/fzYaAUkVIxJENhoCSU4CFSUSRIgHYYgHaBdHAogHckmBFBNEgSgSQQAVJxdLAlBJvUUBRLxIMgcWKExQsCNDSYEyEkEADycWSwJQSb1FAUS8SEL/4UmBPBJBAA8nGksCUEm9RQFEvEhC/8tJgUYSQQAPJxVLAlBJvUUBRLxIQv+1SYFQEkH/ricZSwJQSb1FAUS8SEL/nzYaAUkVIxJEIlMnFTEAiAabRCchTGcyBxYoTFCwI0M2GgFJFSMSRCJTJxoxAIgGfEQnIkxnMgcWKExQsCNDIicSZUQoTFCwI0M2GgFJFSUSRCcXSwGIBlQnFksCiAZNJxpLA4gGRicVSwSIBj8nGU8FiAY4JykiTwZUI08FVIECTwRUgQNPA1SBBE8CVChMULAjQzYaAUkVIxJENhoCSU4CFSUSRBdJiAZQgwYUKDI8RlBPBo4GAE8AQAAxACIAEwABACcZSwFQSb1FAUS+SChMULAjQycVSwFQSb1FAUS+SEL/6ycaSwFQSb1FAUS+SEL/3CcWSwFQSb1FAUS+SEL/zScXSwFQSb1FAUS+SEL/voAQAAAAAAAAAAAAAAAAAAAAAEL/qYoBACcIi/9QvkSBgANTFESJigECJwiL/1BJvUUBREm+SCInEGVESwGBOVsJIicRZURLAoFBWwlLAiVbIicFZURPA0sCTwKIAJgiJwVlRE8DTwNPAogAiksCgUlbSwIIFk8DTFxJSYFRW0sCCBZcUSInEGVEFlw5IicRZUQWXEEiKmVEFlwxTwNMv4mKAQAigAAnCIv/UEm9RQFEIillRIEyEkEAAYmLAr5MSU4CjABEgShbSYwBQAABiYsASSVbiwFJTgMIFlwgIhZcKIsCTL8iJwtlRElLAg9ETAknC0xniYoDAYv9QQAFi/5AAAIiiYv9i/4di/+XiYoBAYv/QAACIokiJw1lRElEIicFZUSL/0xPAoj/yomKAQGL/0AAAiKJIicNZUQiJwVlRIv/TIj/r4mKAQEiK2VEi/8NRIv/gRAKFicYTFBJvUUBRIv/gRAYSwEigQK6F0sBDUSBQQuBAgiBQbqJigIAi/8jEkAAH4v/JBJAABiL/4ETEkAAEIv/gQwSQAAIi/+BCxJBAAMjRImL/kAABCJC//WL/oEDEkAACIv+gQISQQAYi/+BAxJAAAiL/4ESEkEABCNC/9EiQv/Ni/4jEkEAIIv/gQMSQAAQi/+BEhJAAAiL/4EFEkEABCNC/6oiQv+mi/6BBBJBACiL/4EDEkAAGIv/gQQSQAAQi/+BEhJAAAiL/4EFEkEABCNC/3oiQv92i/6BBRJBAAiL/4EDEkL/ZiJC/2IiJwplRCMSQQAKIicjZURBAAIjiSKJigECi/+BEVtJQQAQIicJZURBAAgiJwdlREAABiKL/08CiSInB2VEIicJZUQiJwVlRIj+aCInBWVEiwBMiP5di/9PAomKAgGL/0AAA4v+iSInBWVEIicJZUSL/0sCiP48CElEIicFZUSL/kxPAoj+LImKAgIigABHCIv+IlsiKmVEEkSL/oEJWzIHDkSL/iRVSSMSSUEAXiIpZUSBMhJEIicLZUQiJw1lRBJEi/6BMVsnBEsBZycHTGeL/oEhWycJTGcnBiJni/6BKVsnDkxnIiplRCMIKkxnKYFkZ4sLRCInFGVEi/5MIogB2kmM/ov/jAGMAIkiKWVEgTISFEQiJwZlRIv+iP74jP4IJwZMZ4sKgQwSQQF4i/+BIVsiJyVlRCInBWVEiP1zIickZUQIjAYiJydlREEAEyInH2VEiwYNQQAIIicfZUyMBkQiJyhlREEAEyInIGVEiwYMQQAIIicgZUyMBkQnCYsGZ4sKgQQSQQEHi/6BMVsnBEsBZycHTGeI/mVBAOeLCoEFEkEAxSIrZUQiKmVECYFkCyEECCKI68QiJwVlTIwCRCKMASKMB4v+gRlbSYwIQQAPiwKLCIj+gUmMAiOMB4wBIiplRCMIjAMiK2VEiwMNQQBSiwOI/QxJjAAkVUmMBIEDEkAAEIsEgRMSQQAziwCBGVtBACsjQQAIiwdBAAwijAeLAyMIjANC/76LAIEZW4sCTIj+JEmMAosBCIwBQv/hIkL/0osBRCInBGVEi/6BOVskGkAABiInBmVECCInBWVEiwGI/EsnDkxnIiplRCMIKkxni/4iSYgAYEmM/ov/jAGMAImL/oEpWycOTGdC/9qLCoESEkH+/yInBGVEJwdMZ0L+84sKgQsSQQAbi/6BIVtJjAVAAAgiJyZlTIwFRCcJiwVnQv66i/6BIVtJjAlB/q8nCYsJZ0L+p4oDATIIi/0iW4v9VwgBi/1XCQgyB4v9JFWL/kAARSMWSZMkDkRXBwEiJxNlRIsBSSMIiwAWTwIWUIsCUIsDUIsEFlCL/hZQTwNQi/8WUE8CFlBMFlCABJozK5VMULCL/YwAiYsFIxJAAAiLBYEEEkEABCNC/6mB/wFC/6OKAgGAAIv+i/9QSb1FAUEAH4sBvkQiWzIHSYwADkEAEIsBvkQkW4sAD0EABCOMAIkiQv/5MQAiJxJlRBJEiSInImVEFESJIichZUQURImKAQCL/4EUEkAAMIv/gRkSQAAoi/+BKBJAACCL/4EyEkAAGIv/gTwSQAAQi/+BRhJAAAiL/4FQEkEAAyNEiSJC//o=", "clear": "DIEBQw==" }, "compilerInfo": { diff --git a/src/artifacts/dasa_client.py b/src/artifacts/dasa_client.py index 54c30e8a..76547622 100644 --- a/src/artifacts/dasa_client.py +++ b/src/artifacts/dasa_client.py @@ -19,7 +19,7 @@ import algokit_utils from algokit_utils import AlgorandClient as _AlgoKitAlgorandClient -_APP_SPEC_JSON = r"""{"arcs": [22, 28], "bareActions": {"call": [], "create": []}, "methods": [{"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "desc": "Maximum number of due cash events to process in this call.", "name": "max_event_count"}], "name": "fund_due_cashflows", "returns": {"type": "(uint64,uint64,uint64,uint64,uint64)", "desc": "Funding result with reserved interest, reserved principal, and event count.", "struct": "CashFundingResult"}, "desc": "Reserve due ACTUS cash events into the escrow-style claim ledger.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Holder whose position should be settled and claimed.", "name": "holding_address"}, {"type": "byte[]", "desc": "Opaque settlement context returned in the result.", "name": "payment_info"}], "name": "claim_due_cashflows", "returns": {"type": "(uint64,uint64,uint64,uint64,byte[])", "desc": "Claim result with realized interest, principal, and passthrough context.", "struct": "CashClaimResult"}, "desc": "Withdraw the holder's already funded ACTUS cash entitlements.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "desc": "Inclusive UNIX timestamp at which transfers may start.", "name": "open_date"}, {"type": "uint64", "desc": "Exclusive UNIX timestamp at which transfers stop.", "name": "closure_date"}], "name": "transfer_set_schedule", "returns": {"type": "uint64", "desc": "UNIX timestamp of the schedule update."}, "desc": "Configure the secondary-market transfer window.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account receiving the reserved units.", "name": "holding_address"}, {"type": "uint64", "desc": "Number of units to reserve.", "name": "units"}], "name": "primary_distribution", "returns": {"type": "uint64", "desc": "Remaining undistributed unit balance."}, "desc": "Reserve units for a holder before the initial exchange activates issuance.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account debited for the transfer.", "name": "sender_holding_address"}, {"type": "address", "desc": "Account credited for the transfer.", "name": "receiver_holding_address"}, {"type": "uint64", "desc": "Number of active units to move.", "name": "units"}], "name": "transfer", "returns": {"type": "uint64", "desc": "Number of units transferred."}, "desc": "Transfer active units after settling both counterparties to the current cursor.\nReturns the number of units moved. The ACTUS kernel no longer persists a nominal per-unit value on-chain, so transfer results are unit-based.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account holding address.", "name": "holding_address"}, {"type": "bool", "desc": "Suspension status to apply.", "name": "suspended"}], "name": "account_suspension", "returns": {"type": "uint64", "desc": "UNIX timestamp of the suspension update."}, "desc": "Set the suspension status of one account.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account holding address.", "name": "holding_address"}, {"type": "address", "desc": "Account payment address.", "name": "payment_address"}], "name": "account_open", "returns": {"type": "uint64", "desc": "UNIX timestamp of the account opening."}, "desc": "Open a contract account with a new position and register its payment address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account holding address.", "name": "holding_address"}, {"type": "address", "desc": "New account payment address.", "name": "payment_address"}], "name": "account_update_payment_address", "returns": {"type": "uint64", "desc": "UNIX timestamp of the account update."}, "desc": "Update the payment address of an account.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account holding address.", "name": "holding_address"}], "name": "account_get_position", "returns": {"type": "(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64)", "desc": "Account position record.", "struct": "AccountPosition"}, "desc": "Get the full accounting position for one holder.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": [], "create": ["NoOp"]}, "args": [{"type": "address", "desc": "D-ASA arranger address.", "name": "arranger"}], "name": "contract_create", "returns": {"type": "uint64", "desc": "UNIX timestamp of contract creation."}, "desc": "Create a new D-ASA contract and set the arranger role.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64)", "desc": "Normalized ACTUS terms.", "name": "terms", "struct": "NormalizedActusTerms"}, {"type": "(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "desc": "Initial kernel state captured before `IED`.", "name": "initial_state", "struct": "InitialKernelState"}, {"type": "(byte[32],string)", "desc": "Prospectus metadata stored for reference only.", "name": "prospectus", "struct": "Prospectus"}], "name": "contract_config", "returns": {"type": "uint64", "desc": "UNIX timestamp of contract configuration."}, "desc": "Partial contract configuration with: normalized ACTUS terms, initial kernel\nstate (pre-IED), prospectus (informational only). The contract stays inactive until all schedule pages are configured next.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "desc": "Zero-based page index within the boxed schedule.", "name": "schedule_page_index"}, {"type": "bool", "desc": "Whether this page finalizes the schedule upload.", "name": "is_last_page"}, {"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[]", "desc": "Normalized schedule entries for the requested page.", "name": "schedule_page"}], "name": "contract_schedule", "returns": {"type": "uint64", "desc": "UNIX timestamp of the schedule upload."}, "desc": "Upload one normalized schedule page.\nThe configuration operation is considered complete only when the last page is stored. At that point `schedule_entry_count` is finalized and the contract moves to `STATUS_PENDING_IED`.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "contract_execute_ied", "returns": {"type": "uint64", "desc": "UNIX timestamp of the `IED` execution."}, "desc": "Execute the first due `IED` entry and activate the contract.\n`IED` is the one non-cash event that moves the app from `STATUS_PENDING_IED` to `STATUS_ACTIVE`.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "desc": "Expected global schedule event identifier at the current cursor.", "name": "event_id"}, {"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "desc": "Observed payload used for append-on-execute and/or rate resets.", "name": "payload", "struct": "ObservedEventRequest"}], "name": "apply_non_cash_event", "returns": {"type": "uint64", "desc": "UNIX timestamp of the non-cash event application."}, "desc": "Apply the next due non-cash event, optionally appending one first.\nObserved payloads are appended before execution when flagged. Rate reset events require the interest oracle because they can change the running nominal rate; other non-cash events stay arranger-controlled.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "desc": "Observed cash-event payload to append after the current tail.", "name": "payload", "struct": "ObservedCashEventRequest"}], "name": "append_observed_cash_event", "returns": {"type": "uint64", "desc": "UNIX timestamp of the append operation."}, "desc": "Append an arranger-authorized observed cash event to the schedule tail.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Default status", "name": "defaulted"}], "name": "contract_set_default_status", "returns": {"type": "uint64"}, "desc": "Set D-ASA default status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "contract_get_state", "returns": {"type": "(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "desc": "Current kernel state snapshot.", "struct": "KernelState"}, "desc": "Return a readonly snapshot of the generic ACTUS kernel state.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "contract_get_next_due_event", "returns": {"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "desc": "Next due schedule entry, or an all-zero sentinel if the contract ended.", "struct": "ExecutionScheduleEntry"}, "desc": "Return the next boxed schedule entry, or a zeroed sentinel if ended.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["UpdateApplication"], "create": []}, "args": [], "name": "contract_update", "returns": {"type": "void", "desc": "None."}, "desc": "Update D-ASA application.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "New arranger address.", "name": "new_arranger"}], "name": "rbac_rotate_arranger", "returns": {"type": "uint64", "desc": "UNIX timestamp of the role assignment."}, "desc": "Rotate the arranger address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Operation daemon address.", "name": "address"}], "name": "rbac_set_op_daemon", "returns": {"type": "uint64", "desc": "UNIX timestamp of the role assignment."}, "desc": "Non-normative helper to set the operation daemon address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role identifier.", "name": "role_id"}, {"type": "address", "desc": "Account role address.", "name": "role_address"}, {"type": "(uint64,uint64)", "desc": "Inclusive validity interval for the assignment.", "name": "validity", "struct": "RoleValidity"}], "name": "rbac_assign_role", "returns": {"type": "uint64", "desc": "UNIX timestamp of the role assignment."}, "desc": "Assign a role to an address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role identifier.", "name": "role_id"}, {"type": "address", "desc": "Account role address.", "name": "role_address"}], "name": "rbac_revoke_role", "returns": {"type": "uint64", "desc": "UNIX timestamp of the role revocation."}, "desc": "Revoke a role from an address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Suspension status to apply.", "name": "suspended"}], "name": "rbac_contract_suspension", "returns": {"type": "uint64", "desc": "UNIX timestamp of the suspension update."}, "desc": "Set the asset-wide suspension status.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "rbac_get_arranger", "returns": {"type": "address", "desc": "Current arranger address."}, "desc": "Get the arranger address.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Address to query.", "name": "address"}], "name": "rbac_get_address_roles", "returns": {"type": "(bool,bool,bool,bool,bool)", "desc": "Roles mask in the order: account manager, primary dealer, trustee, authority, observer."}, "desc": "Non-normative helper to get the active roles assigned to an address.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role identifier.", "name": "role_id"}, {"type": "address", "desc": "Account role address.", "name": "role_address"}], "name": "rbac_get_role_validity", "returns": {"type": "(uint64,uint64)", "desc": "Stored role validity interval.", "struct": "RoleValidity"}, "desc": "Get the stored validity interval for a role assignment.", "events": [], "readonly": true, "recommendations": {}}], "name": "DASA", "state": {"keys": {"box": {}, "global": {"arranger": {"key": "UjpBUlIj", "keyType": "AVMBytes", "valueType": "address"}, "op_daemon": {"key": "UjpPUEQj", "keyType": "AVMBytes", "valueType": "address"}, "asset_suspended": {"key": "YXNzZXRfc3VzcGVuZGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "asset_defaulted": {"key": "YXNzZXRfZGVmYXVsdGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "status": {"key": "c3RhdHVz", "keyType": "AVMString", "valueType": "AVMUint64"}, "contract_type": {"key": "Y29udHJhY3RfdHlwZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "prospectus_hash": {"key": "cHJvc3BlY3R1c19oYXNo", "keyType": "AVMString", "valueType": "AVMBytes"}, "prospectus_url": {"key": "cHJvc3BlY3R1c191cmw=", "keyType": "AVMString", "valueType": "AVMString"}, "denomination_asset_id": {"key": "ZGVub21pbmF0aW9uX2Fzc2V0X2lk", "keyType": "AVMString", "valueType": "AVMUint64"}, "settlement_asset_id": {"key": "c2V0dGxlbWVudF9hc3NldF9pZA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "initial_exchange_date": {"key": "aW5pdGlhbF9leGNoYW5nZV9kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "maturity_date": {"key": "bWF0dXJpdHlfZGF0ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "transfer_opening_date": {"key": "dHJhbnNmZXJfb3BlbmluZ19kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "transfer_closure_date": {"key": "dHJhbnNmZXJfY2xvc3VyZV9kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "day_count_convention": {"key": "ZGF5X2NvdW50X2NvbnZlbnRpb24=", "keyType": "AVMString", "valueType": "AVMUint64"}, "total_units": {"key": "dG90YWxfdW5pdHM=", "keyType": "AVMString", "valueType": "AVMUint64"}, "reserved_units_total": {"key": "cmVzZXJ2ZWRfdW5pdHNfdG90YWw=", "keyType": "AVMString", "valueType": "AVMUint64"}, "initial_exchange_amount": {"key": "aW5pdGlhbF9leGNoYW5nZV9hbW91bnQ=", "keyType": "AVMString", "valueType": "AVMUint64"}, "outstanding_principal": {"key": "b3V0c3RhbmRpbmdfcHJpbmNpcGFs", "keyType": "AVMString", "valueType": "AVMUint64"}, "next_principal_redemption": {"key": "bmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbg==", "keyType": "AVMString", "valueType": "AVMUint64"}, "dynamic_principal_redemption": {"key": "ZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbg==", "keyType": "AVMString", "valueType": "AVMUint64"}, "interest_calculation_base": {"key": "aW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "accrued_interest": {"key": "YWNjcnVlZF9pbnRlcmVzdA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "nominal_interest_rate": {"key": "bm9taW5hbF9pbnRlcmVzdF9yYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_spread": {"key": "cmF0ZV9yZXNldF9zcHJlYWQ=", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_multiplier": {"key": "cmF0ZV9yZXNldF9tdWx0aXBsaWVy", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_floor": {"key": "cmF0ZV9yZXNldF9mbG9vcg==", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_cap": {"key": "cmF0ZV9yZXNldF9jYXA=", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_next": {"key": "cmF0ZV9yZXNldF9uZXh0", "keyType": "AVMString", "valueType": "AVMUint64"}, "has_rate_reset_floor": {"key": "aGFzX3JhdGVfcmVzZXRfZmxvb3I=", "keyType": "AVMString", "valueType": "AVMUint64"}, "has_rate_reset_cap": {"key": "aGFzX3JhdGVfcmVzZXRfY2Fw", "keyType": "AVMString", "valueType": "AVMUint64"}, "reserved_principal": {"key": "cmVzZXJ2ZWRfcHJpbmNpcGFs", "keyType": "AVMString", "valueType": "AVMUint64"}, "reserved_interest": {"key": "cmVzZXJ2ZWRfaW50ZXJlc3Q=", "keyType": "AVMString", "valueType": "AVMUint64"}, "cumulative_interest_index": {"key": "Y3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "cumulative_principal_index": {"key": "Y3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXg=", "keyType": "AVMString", "valueType": "AVMUint64"}, "event_cursor": {"key": "ZXZlbnRfY3Vyc29y", "keyType": "AVMString", "valueType": "AVMUint64"}, "schedule_entry_count": {"key": "c2NoZWR1bGVfZW50cnlfY291bnQ=", "keyType": "AVMString", "valueType": "AVMUint64"}, "defaulted": {"key": "ZGVmYXVsdGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "fixed_point_scale": {"key": "Zml4ZWRfcG9pbnRfc2NhbGU=", "keyType": "AVMString", "valueType": "AVMUint64"}}, "local": {}}, "maps": {"box": {"account_manager": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpNTkcj"}, "primary_dealer": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpQWUQj"}, "trustee": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpUUlMj"}, "authority": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpBVVQj"}, "observer": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpNT0Mj"}, "schedule_page": {"keyType": "uint64", "valueType": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[]", "prefix": "UyM="}, "account": {"keyType": "address", "valueType": "AccountPosition", "prefix": "QSM="}}, "global": {}, "local": {}}, "schema": {"global": {"bytes": 10, "ints": 54}, "local": {"bytes": 0, "ints": 0}}}, "structs": {"AccountPosition": [{"name": "payment_address", "type": "address"}, {"name": "units", "type": "uint64"}, {"name": "reserved_units", "type": "uint64"}, {"name": "suspended", "type": "bool"}, {"name": "settled_cursor", "type": "uint64"}, {"name": "interest_checkpoint", "type": "uint64"}, {"name": "principal_checkpoint", "type": "uint64"}, {"name": "claimable_interest", "type": "uint64"}, {"name": "claimable_principal", "type": "uint64"}], "CashClaimResult": [{"name": "interest_amount", "type": "uint64"}, {"name": "principal_amount", "type": "uint64"}, {"name": "total_amount", "type": "uint64"}, {"name": "timestamp", "type": "uint64"}, {"name": "context", "type": "byte[]"}], "CashFundingResult": [{"name": "funded_interest", "type": "uint64"}, {"name": "funded_principal", "type": "uint64"}, {"name": "total_funded", "type": "uint64"}, {"name": "processed_events", "type": "uint64"}, {"name": "timestamp", "type": "uint64"}], "ExecutionScheduleEntry": [{"name": "event_id", "type": "uint64"}, {"name": "event_type", "type": "uint8"}, {"name": "scheduled_time", "type": "uint64"}, {"name": "accrual_factor", "type": "uint64"}, {"name": "redemption_accrual_factor", "type": "uint64"}, {"name": "next_nominal_interest_rate", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "next_outstanding_principal", "type": "uint64"}, {"name": "flags", "type": "uint64"}], "InitialKernelState": [{"name": "status_date", "type": "uint64"}, {"name": "event_cursor", "type": "uint64"}, {"name": "outstanding_principal", "type": "uint64"}, {"name": "interest_calculation_base", "type": "uint64"}, {"name": "nominal_interest_rate", "type": "uint64"}, {"name": "accrued_interest", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "cumulative_interest_index", "type": "uint64"}, {"name": "cumulative_principal_index", "type": "uint64"}], "KernelState": [{"name": "contract_type", "type": "uint8"}, {"name": "status", "type": "uint64"}, {"name": "total_units", "type": "uint64"}, {"name": "reserved_units_total", "type": "uint64"}, {"name": "initial_exchange_amount", "type": "uint64"}, {"name": "event_cursor", "type": "uint64"}, {"name": "schedule_entry_count", "type": "uint64"}, {"name": "outstanding_principal", "type": "uint64"}, {"name": "interest_calculation_base", "type": "uint64"}, {"name": "nominal_interest_rate", "type": "uint64"}, {"name": "accrued_interest", "type": "uint64"}, {"name": "cumulative_interest_index", "type": "uint64"}, {"name": "cumulative_principal_index", "type": "uint64"}, {"name": "reserved_interest", "type": "uint64"}, {"name": "reserved_principal", "type": "uint64"}], "NormalizedActusTerms": [{"name": "contract_type", "type": "uint8"}, {"name": "denomination_asset_id", "type": "uint64"}, {"name": "settlement_asset_id", "type": "uint64"}, {"name": "total_units", "type": "uint64"}, {"name": "notional_principal", "type": "uint64"}, {"name": "initial_exchange_amount", "type": "uint64"}, {"name": "initial_exchange_date", "type": "uint64"}, {"name": "maturity_date", "type": "uint64"}, {"name": "day_count_convention", "type": "uint8"}, {"name": "rate_reset_spread", "type": "uint64"}, {"name": "rate_reset_multiplier", "type": "uint64"}, {"name": "rate_reset_floor", "type": "uint64"}, {"name": "rate_reset_cap", "type": "uint64"}, {"name": "rate_reset_next", "type": "uint64"}, {"name": "has_rate_reset_floor", "type": "bool"}, {"name": "has_rate_reset_cap", "type": "bool"}, {"name": "dynamic_principal_redemption", "type": "bool"}, {"name": "fixed_point_scale", "type": "uint64"}], "ObservedCashEventRequest": [{"name": "event_id", "type": "uint64"}, {"name": "event_type", "type": "uint8"}, {"name": "scheduled_time", "type": "uint64"}, {"name": "accrual_factor", "type": "uint64"}, {"name": "redemption_accrual_factor", "type": "uint64"}, {"name": "next_nominal_interest_rate", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "next_outstanding_principal", "type": "uint64"}, {"name": "flags", "type": "uint64"}], "ObservedEventRequest": [{"name": "event_id", "type": "uint64"}, {"name": "event_type", "type": "uint8"}, {"name": "scheduled_time", "type": "uint64"}, {"name": "accrual_factor", "type": "uint64"}, {"name": "redemption_accrual_factor", "type": "uint64"}, {"name": "observed_rate", "type": "uint64"}, {"name": "next_nominal_interest_rate", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "next_outstanding_principal", "type": "uint64"}, {"name": "flags", "type": "uint64"}], "Prospectus": [{"name": "hash", "type": "byte[32]"}, {"name": "url", "type": "string"}], "RoleValidity": [{"name": "role_validity_start", "type": "uint64"}, {"name": "role_validity_end", "type": "uint64"}]}, "byteCode": {"approval": "DCAFAAEIINwLJjIEFR98dQZzdGF0dXMMZXZlbnRfY3Vyc29yFHNjaGVkdWxlX2VudHJ5X2NvdW50FW91dHN0YW5kaW5nX3ByaW5jaXBhbBFmaXhlZF9wb2ludF9zY2FsZRBhY2NydWVkX2ludGVyZXN0GWludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UCQSMVbm9taW5hbF9pbnRlcmVzdF9yYXRlDWNvbnRyYWN0X3R5cGUUcmVzZXJ2ZWRfdW5pdHNfdG90YWwScmVzZXJ2ZWRfcHJpbmNpcGFsC3RvdGFsX3VuaXRzGW5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24RcmVzZXJ2ZWRfaW50ZXJlc3QZY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleBpjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleAZSOkFSUiMTc2V0dGxlbWVudF9hc3NldF9pZBdpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudAZSOkFVVCMGUjpQWUQjBlI6TU5HIwJTIwZSOk1PQyMGUjpUUlMjBlI6T1BEIxVpbml0aWFsX2V4Y2hhbmdlX2RhdGUVdHJhbnNmZXJfb3BlbmluZ19kYXRlFXRyYW5zZmVyX2Nsb3N1cmVfZGF0ZRByYXRlX3Jlc2V0X2Zsb29yDnJhdGVfcmVzZXRfY2FwD2Fzc2V0X3N1c3BlbmRlZBxkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uEXJhdGVfcmVzZXRfc3ByZWFkFXJhdGVfcmVzZXRfbXVsdGlwbGllcg9yYXRlX3Jlc2V0X25leHQUaGFzX3JhdGVfcmVzZXRfZmxvb3ISaGFzX3JhdGVfcmVzZXRfY2FwAQAPYXNzZXRfZGVmYXVsdGVkD3Byb3NwZWN0dXNfaGFzaA5wcm9zcGVjdHVzX3VybBVkZW5vbWluYXRpb25fYXNzZXRfaWQNbWF0dXJpdHlfZGF0ZRRkYXlfY291bnRfY29udmVudGlvbglkZWZhdWx0ZWQDBoEBAgAAMRhAALEnEjIDZycbMgNnJyEiZycpImcpImcnCiJnJyqAAGcnK4AAZycsImcnEyJnJxwiZyctImcnHSJnJx4iZycuImcnDSJnJwsiZycUImcnBCJnJw4iZyciImcnByJnJwYiZycJImcnIyJnJyQiZycfImcnICJnJyUiZycmImcnJyJnJwwiZycPImcnECJnJxEiZyoiZysiZycvImcnBSJnMTWBChJEMTSBNhJEMTcURDE2FESABJFPBOs2GgCOAQDOMRkURDEYQQC3ghkEtEYYyATngyUpBJQ4hyMEbIXj7gS90alEBHwPGBIEFPwQ7wR0pyl/BAnU/hQEmpv6hQSF7tM9BKssD8QE2fIlrASYg1BaBPtNRCgEjqbnTAQCr1V6BIL3Gy0E7wT10wTfNDVQBD2+gL0EHj5I5wQBDIKZBHQGrNIEGnKi7jYaAI4ZAFYDIQR9BKcFMQYhBlsGswbmBxQJCAofCpgMBAz2DRUNqA3tDgUOHQ7SD2gPhw+SD9wAgASVbXFWNhoAjgEG8QAxGYEEEjEYEERCDc2KAgCL/oEKCIsAMgwNQQAqsYEGshCBBbIZJzCyHicwsh+L/40CAAsABLNC/9syALIBQv/1IrIBQv/viSKAAEcNNhoBSRUkEkQXIillRESIFb2IFcSIFckiKWVEgTISFESIEiBBAAtJgWQLIQQIIoj/jyJFBSJFDiJFDUsESwEMQQJZIiplRCIrZUQMQQJNIiplRIgQ8klFEYEJW0lFAzIHDUACN0sPJFVJRRAkEklFBEAAEEsOgQMSQAAISw6BExJBAj8jQQIUSw8iWyIqZUQSREsBMgcOREsCQAHtSw6BExJAAeUiRQtLDyRVSUUQgQMSQAFlSw6BExJAAV0iRQZLD4ExW0UIiBF6QAD+SwdFCUsKiBA4SwaIEDNLAYgQTUlOAkUPSYgQRElFC0sCSwEISUUJMgoiJxNlRHAARCInD2VEIicMZURLAQhLAksBD0RPAkwJTwIPRE8DCCcPTGciJwxlRAgnDExnIicQZURPAggnEExnIicRZUQIJxFMZ0sPJFWBAxJBAHoiJwZlREsQiBEGRRIIJwZMZ4gQ5kEACksPJFWBExJBAAlLD4EpWycOTGcnBEsIZycHSwlnIiplRCMIKkxnSw9XCAGAAROoQQARIicEZURAAAkpgcgBZycHImdLD0sESYgTc0hLDUsMCEUOSwxLBwhFDUsEIwhFBUL+dycGImdC/5BLDyRVSUUQgQMSQQAQIicEZURLBglJRQlFCUL+6UsOJBJBABMiJwRlTEUJRCInB2VMRQpEQv7PSw6BExJAAAdLB0UJQv7AIkUIIkUJQv63iBAnQQBWSw6BExJBAAoiJwRlREUGQv6OIicGZURLEIgQHkUSCElFCyInDmVED0EABiJFBkL+byInDmVESwoJSUUIIicEZUQNQQAKIicEZURFBkL+UUsGRQZC/kpLD4ExWyInBGVESg5ETAlFBkL+NiInBmVESxCID8ZFEghFC0L+DEsESURLDklLD0lOAwgyB08CFk8DFlBPAhZQTwIWUEwWUChMULAjQyJC/b6AAEcCNhoBRwIVJRJENhoCSSJZgQIISwEVEkRXAgBMIillREQnCExQSb1FAUQiJxtlRDIDE0EAIjEAIicbZUQSQAAVMQBLAxJAAA0xAEsBvkRXACASQQEAI0SIErWIEroiKWVEgTISFERLAkmIDWqIDO1GAkm+REmBSVtJTgJFCEmBUVtJRQhPAghJRQZEVwAgIicTZURwAEUBQQC3Sb5EgYADU0AArSNBAHgyCiInE2VETEsBcABESwVJTgIPREsCSU4DvkRJVwAgsTIATwOyEkyyFE8CshGBBLIQsgGzSYFJW0lOAkUJSYFRW0lOA0UJIhZMSwFcSUxcUU8DTL8iJw9lRElLAg9EIicMZURLAw9ETAknD0xnIicMZURMCScMTGdLBUlLBklOAwgyB08CFk8DFlBPAhZQTBZQSwJJFRZXBgJMUEyAAgAiUExQKExQsCNDIkL/UCJC/v02GgFJFSQSRBc2GgJJFSQSRBeIEZdKDEQnHU8CZyceTGcyBxYoTFCwI0M2GgFJFSUSRDYaAkkVJBJEF0lOAiIpZUREJxYxAIgRLkSIEWiIEW0iKWVEgTISRCcISwJQSU4DvUUBREyIC4lJRCInC2VECCInDWVEDkQiJxxlREEACTIHIiccZUQOREcCvkSBKFtLA0lOAwgWgShMuyInC2VECCcLSwFnIicNZURMCRYoTFCwI0MiSTYaAUkVJRJENhoCSRUlEkQ2GgNHAhUkEkQXIillRESIEN6IEOMiKWVEgTISFEQiJx1lREEACSInHWVEMgcORCInHmVEQQAJMgciJx5lRAxEMQBLBElOAhJEJwhLAVBJRQhJvUUBRCcISwVJTgJQSUUJvUUBREsCiArCSYgKvk8CE0RLAUlETL5EJVsORCIqZUQiK2VED0AADiIqZUSIC8+BCVsyBw1ESwNJiAsaSwNJTgKICxKICpVGAogKkEYCSwVJvkQlW0sCSU4CSwEOREsBCRZPAiVPArtLBUm+RCVbTwIIFiVMuyhLAlCwI0M2GgFJFSUSRDYaAkkVIxJEIlMnFTEAiA+7RCcITwJQSb1FAURJgTAjuiJPA1SBMEy7MgcWKExQsCNDNhoBSRUlEkQ2GgJJFSUSRCcXMQCID4NEIillRIHIARIURIgPs4gPuCcITwJQSb1FARREIhZPAksBUEsBUCcoUEsBUEsBUEsBUEsBUExQvzIHFihMULAjQzYaAUkVJRJENhoCSRUlEkQnCEsCUEm9RQFEMQBPAxJEiA9diA9iIk8CuzIHFihMULAjQzYaAUkVJRJEJwhMUEm9RQFEvkgoTFCwI0M2GgFJFSUSRCcSTGcyBxYoTFCwI0OAAEk2GgFHAhWBaxJENhoCSU4CFYFIEkQ2GgNJTgJJFUsBJVlJgSISRE8CTEsCUklOAyJZgSQIEkSIDtkiVUknCksBZ0EAIkkjEkAAHEmBAhJAABVJgQMSQAAOSYEEEkAAB0mBBRJBAYcjRCInCmVMRQJESwRJgSFbSUUIRIE5VUlFCEEAH0sGIxJAABhLBoECEkAAEEsGgQMSQAAISwaBBBJBAUcjREkjE0EACEsEgZIGUxREIillRBREIicUZUQUREsESSNbSXELRQFEJyxLAWdLAYEJW0lPAhJEJxNLAWexMgAyCiKyErIUTLIRgQSyELIBs0mBEVsnDUxnJwsiZycuSwhnSYEpWyccSwFnSwGBMVsnLUsBZ0sGSU4CgTBbJw5MZycUSwpnSwOBkgZTJyJMZ0sBgRBbJwRMZ0sBgShbJwZMZ0sBJVsnCUxnSwGBGFsnB0xnSwOBOlsnI0xnSwOBQlsnJExnSwOBSlsnH0xnSwOBUlsnIExnSwOBWlsnJUxnSwOBkAZTJyZMZ0sDgZEGUycnTGdPA4FjWycFTGdLASRbKkxnSwGBOFsnEExnSwGBQFsnEUxnJw8iZycMImdLAjIHDURMIltLAgxEDERLAlcAICcqTGdLAVcCACcrTGcyBxYoTFCwI0MiQv62IkL+diKAAEcCNhoBSRUkEkQXSTYaAkkVIxJEIlNMNhoDSU4CSSJZSU4DSYFBC4ECCE8CFRJEiAzsIicKZUxOA0QiKWVEFERJgRAORCInFGVEREyBEAtMgWQLIQQIIoj2tiJJSwQMQQCLSwRXAgBJRQxLAUlOAoFBC4FBWEkkVUlOAkUNSSJbSUUNSwVPBAhLARJESwVPA4gIOEyBCVtJRQpEQQAXSUEAJUkjCYFBC0sLTIFBWIEJW0sIDkRLCEAABUsJIxJESSMIRQFC/5RLBklEIwkWJxhMUEm9RQFESSKBAroXSUQjCYFBC4ECCIFBukL/wUsGFicYTFBJvEhLBb9LBUEADEsBSwQIK0xnKYEyZzIHFihMULAjQyIpZUREiAwCiAwJiAwOIiplRCIrZURLAQ1EiAdmSVcIAUmAAQGoREsBVwAISwJXCQhLA1cRCEsEVxkISwVXIQhLBlcpCEsHVzEISwhXOQhPB08IUE8HUE8GUE8FUCIWUE8EUE8DUE8CUExQiAiYRgIyBxYoTFCwI0MiRwSAAEk2GgFJFSQSRBc2GgJHAhWBSRJEIillRESIC3qIC3+BQVtJgQQaQQCwIicKZUSBBRJEiAtXIicKZURJgQUSREsCSSJbSUUHIitlRBJESVcIAUUMJFWIBuEiK2VEgRAKJzFFBxYnGExQSUUJvUUBQQAHSwe+TEUHREsFSSJZSYEQDERLA0lXCQhLAVcRCEsCVxkISwNXKQhLBFcxCE8FVzkISwsWSxJQTwZQTwVQTwRQTwNQTwJQTFBLAxZQTwJMUEwjCBZXBgJcAEsISbxITL8iK2VEIwgrTGciKmVESwNJTwISRIgGHklFCElXCAFFCiRVSUUGIxJAAChLBIEEEkAAIEsEgQwSQAAYSwSBCxJAABBLBIESEkAACEsEgQUSQQBBI0RLCIABAalESwSBDBJAAAhLBIELEkEAJCNBABonGTEAiAoSREsGSwKIBzpGAjIHFihMULAjQ4gKMEL/6CJC/9kiQv+8Ikk2GgFHAhWBQRJEIillRESIChGIChiICh0iKWVEgTISFEQiJwplRIEFEkRJIltJTgIiK2VETEsBEkRLAVcIAUlOA4ABA6hETIE5W0lOAiMaREEAEyIrZUQjCYgFQIEJW0sEgQlbDkQiK2VEgRAKJzFFBhYnGExQSUUHvUUBQQAHSwW+TEUGREsESSJZSYEQDERLBUlXCQhLAVcRCEsCVxkISwNXIQhLBFcpCE8FVzEISwoWSwpQTwZQTwVQTwRQTwNQTwJQTFBLAxZQTwJMUEwjCBZXBgJcAEsGSbxITL8iK2VEIwgrTGcyBxYoTFCwI0M2GgFJFSMSRCJTJxoxAIgI7kQnL0xnMgcWKExQsCNDIillRElEIicKZUQWSZMkDkRXBwEiJw1lRCInC2VEIicUZUQiKmVEIitlRCInBGVEIicHZUQiJwllRCInBmVEIicQZUQiJxFlRCInD2VEIicMZURPDhZPDkxQTw0WUE8MFlBPCxZQTwoWUE8JFlBPCBZQTwcWUE8GFlBPBRZQTwQWUE8DFlBPAhZQTBZQKExQsCNDIillREQiKmVEIitlRA9BACUiKmVEFicoUCIWTEsBUEsBUEsBUEsBUEsBUEsBUExQKExQsCNDIiplRIgDvUL/8IgIPiNDNhoBSRUlEkSICDEnEkxnMgcWKExQsCNDNhoBSRUlEkSICBknG0xnMgcWKExQsCNDNhoBSRUjEkQ2GgJJTgIVJRJENhoDSU4CFYEQEkSIB+yIB/MXRwKIB/2BFBJBAA4nEksDZzIHFihMULAjQ0mBKBJBABEnF0sDUEm9RQEUREsCv0L/30mBMhJBABEnFksDUEm9RQEUREsCv0L/x0mBPBJBABEnGksDUEm9RQEUREsCv0L/r0mBRhJBABEnFUsDUEm9RQEUREsCv0L/l0mBUBJB/5AnGUsDUEm9RQEUREsCv0L/fzYaAUkVIxJENhoCSU4CFSUSRIgHQogHSRdHAogHU0mBFBNEgSgSQQAVJxdLAlBJvUUBRLxIMgcWKExQsCNDSYEyEkEADycWSwJQSb1FAUS8SEL/4UmBPBJBAA8nGksCUEm9RQFEvEhC/8tJgUYSQQAPJxVLAlBJvUUBRLxIQv+1SYFQEkH/ricZSwJQSb1FAUS8SEL/nzYaAUkVIxJEIlMnFTEAiAZ8RCchTGcyBxYoTFCwI0MiJxJlRChMULAjQzYaAUkVJRJEJxdLAYgGVCcWSwKIBk0nGksDiAZGJxVLBIgGPycZTwWIBjgnKCJPBlQjTwVUgQJPBFSBA08DVIEETwJUKExQsCNDNhoBSRUjEkQ2GgJJTgIVJRJEF0mIBlCDBhQoMjxGUE8GjgYATwBAADEAIgATAAEAJxlLAVBJvUUBRL5IKExQsCNDJxVLAVBJvUUBRL5IQv/rJxpLAVBJvUUBRL5IQv/cJxZLAVBJvUUBRL5IQv/NJxdLAVBJvUUBRL5IQv++gBAAAAAAAAAAAAAAAAAAAAAAQv+pigEAJwiL/1C+RIGAA1MURImKAQInCIv/UEm9RQFESb5IIicQZURLAYE5WwkiJxFlREsCgUFbCUsCJVsiJwVlRE8DSwJPAogAmCInBWVETwNPA08CiACKSwKBSVtLAggWTwNMXElJgVFbSwIIFlxRIicQZUQWXDkiJxFlRBZcQSIqZUQWXDFPA0y/iYoBACKAACcIi/9QSb1FAUQiKWVEgTISQQABiYsCvkxJTgKMAESBKFtJjAFAAAGJiwBJJVuLAUlOAwgWXCAiFlwoiwJMvyInC2VESUsCD0RMCScLTGeJigMBi/1BAAWL/kAAAiKJi/2L/h2L/5eJigEBi/9AAAIiiSInDWVESUQiJwVlRIv/TE8CiP/KiYoBAYv/QAACIokiJw1lRCInBWVEi/9MiP+viYoBASIrZUSL/w1Ei/+BEAoWJxhMUEm9RQFEi/+BEBhLASKBAroXSwENRIFBC4ECCIFBuomKAgCL/yMSQAAfi/8kEkAAGIv/gRMSQAAQi/+BDBJAAAiL/4ELEkEAAyNEiYv+QAAEIkL/9Yv+gQMSQAAIi/6BAhJBABiL/4EDEkAACIv/gRISQQAEI0L/0SJC/82L/iMSQQAgi/+BAxJAABCL/4ESEkAACIv/gQUSQQAEI0L/qiJC/6aL/oEEEkEAKIv/gQMSQAAYi/+BBBJAABCL/4ESEkAACIv/gQUSQQAEI0L/eiJC/3aL/oEFEkEACIv/gQMSQv9mIkL/YiInCmVEIxJBAAoiJyJlREEAAiOJIomKAQKL/4ERW0lBABAiJwllREEACCInB2VEQAAGIov/TwKJIicHZUQiJwllRCInBWVEiP5oIicFZUSLAEyI/l2L/08CiYoCAYv/QAADi/6JIicFZUQiJwllRIv/SwKI/jwISUQiJwVlRIv+TE8CiP4siYoCAiKAAEcIi/4iWyIqZUQSRIv+gQlbMgcORIv+JFVJIxJJQQBeIillRIEyEkQiJwtlRCInDWVEEkSL/oExWycESwFnJwdMZ4v+gSFbJwlMZycGImeL/oEpWycOTGciKmVEIwgqTGcpgWRniwtEIicUZUSL/kwiiAHaSYz+i/+MAYwAiSIpZUSBMhIURCInBmVEi/6I/viM/ggnBkxniwqBDBJBAXiL/4EhWyInJGVEIicFZUSI/XMiJyNlRAiMBiInJmVEQQATIicfZUSLBg1BAAgiJx9lTIwGRCInJ2VEQQATIicgZUSLBgxBAAgiJyBlTIwGRCcJiwZniwqBBBJBAQeL/oExWycESwFnJwdMZ4j+ZUEA54sKgQUSQQDFIitlRCIqZUQJgWQLIQQIIojrxCInBWVMjAJEIowBIowHi/6BGVtJjAhBAA+LAosIiP6BSYwCI4wHjAEiKmVEIwiMAyIrZUSLAw1BAFKLA4j9DEmMACRVSYwEgQMSQAAQiwSBExJBADOLAIEZW0EAKyNBAAiLB0EADCKMB4sDIwiMA0L/vosAgRlbiwJMiP4kSYwCiwEIjAFC/+EiQv/SiwFEIicEZUSL/oE5WyQaQAAGIicGZUQIIicFZUSLAYj8SycOTGciKmVEIwgqTGeL/iJJiABgSYz+i/+MAYwAiYv+gSlbJw5MZ0L/2osKgRISQf7/IicEZUQnB0xnQv7ziwqBCxJBABuL/oEhW0mMBUAACCInJWVMjAVEJwmLBWdC/rqL/oEhW0mMCUH+rycJiwlnQv6nigMBMgiL/SJbi/1XCAGL/VcJCDIHi/0kVYv+QABFIxZJkyQORFcHASInE2VEiwFJIwiLABZPAhZQiwJQiwNQiwQWUIv+FlBPA1CL/xZQTwIWUEwWUIAEmjMrlUxQsIv9jACJiwUjEkAACIsFgQQSQQAEI0L/qYH/AUL/o4oCAYAAi/6L/1BJvUUBQQAfiwG+RCJbMgdJjAAOQQAQiwG+RCRbiwAPQQAEI4wAiSJC//kxACInEmVEEkSJIicpZUQURIkiJyFlRBREiYoBAIv/gRQSQAAwi/+BGRJAACiL/4EoEkAAIIv/gTISQAAYi/+BPBJAABCL/4FGEkAACIv/gVASQQADI0SJIkL/+g==", "clear": "DIEBQw=="}, "desc": "Debt Algorand Standard Application.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "networks": {}, "source": {"approval": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCAzMiAxNTAwCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUgInN0YXR1cyIgImV2ZW50X2N1cnNvciIgInNjaGVkdWxlX2VudHJ5X2NvdW50IiAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIiAiZml4ZWRfcG9pbnRfc2NhbGUiICJhY2NydWVkX2ludGVyZXN0IiAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIgMHg0MTIzICJub21pbmFsX2ludGVyZXN0X3JhdGUiICJjb250cmFjdF90eXBlIiAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiICJyZXNlcnZlZF9wcmluY2lwYWwiICJ0b3RhbF91bml0cyIgIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iICJyZXNlcnZlZF9pbnRlcmVzdCIgImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIgMHg1MjNhNDE1MjUyMjMgInNldHRsZW1lbnRfYXNzZXRfaWQiICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIgMHg1MjNhNDE1NTU0MjMgMHg1MjNhNTA1OTQ0MjMgMHg1MjNhNGQ0ZTQ3MjMgMHg1MzIzIDB4NTIzYTRkNGY0MzIzIDB4NTIzYTU0NTI1MzIzIDB4NTIzYTRmNTA0NDIzICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiICJ0cmFuc2Zlcl9vcGVuaW5nX2RhdGUiICJ0cmFuc2Zlcl9jbG9zdXJlX2RhdGUiICJyYXRlX3Jlc2V0X2Zsb29yIiAicmF0ZV9yZXNldF9jYXAiICJhc3NldF9zdXNwZW5kZWQiICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIiAicmF0ZV9yZXNldF9zcHJlYWQiICJyYXRlX3Jlc2V0X211bHRpcGxpZXIiICJyYXRlX3Jlc2V0X25leHQiICJoYXNfcmF0ZV9yZXNldF9mbG9vciIgImhhc19yYXRlX3Jlc2V0X2NhcCIgMHgwMCAiYXNzZXRfZGVmYXVsdGVkIiAicHJvc3BlY3R1c19oYXNoIiAicHJvc3BlY3R1c191cmwiICJkZW5vbWluYXRpb25fYXNzZXRfaWQiICJtYXR1cml0eV9kYXRlIiAiZGF5X2NvdW50X2NvbnZlbnRpb24iICJkZWZhdWx0ZWQiIDB4MDY4MTAxIDB4MDAwMAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4LTI5CiAgICAvLyAjIFJCQUMgUm9sZXMKICAgIC8vIHNlbGYuYXJyYW5nZXIgPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX0FSUkFOR0VSKQogICAgYnl0ZWMgMTggLy8gMHg1MjNhNDE1MjUyMjMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMAogICAgLy8gc2VsZi5vcF9kYWVtb24gPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX09QX0RBRU1PTikKICAgIGJ5dGVjIDI3IC8vIDB4NTIzYTRmNTA0NDIzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NDctNDgKICAgIC8vICMgRC1BU0EgR292ZXJuYW5jZQogICAgLy8gc2VsZi5hc3NldF9zdXNwZW5kZWQgPSBGYWxzZQogICAgYnl0ZWMgMzMgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjQ5CiAgICAvLyBzZWxmLmFzc2V0X2RlZmF1bHRlZCA9IEZhbHNlCiAgICBieXRlYyA0MSAvLyAiYXNzZXRfZGVmYXVsdGVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1Ni01NwogICAgLy8gIyBDb250cmFjdAogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKQogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OAogICAgLy8gc2VsZi5jb250cmFjdF90eXBlID0gVUludDY0KCkKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MC02MQogICAgLy8gIyBQcm9zcGVjdHVzIChJbmZvcm1hdGlvbmFsKQogICAgLy8gc2VsZi5wcm9zcGVjdHVzX2hhc2ggPSBCeXRlcygpCiAgICBieXRlYyA0MiAvLyAicHJvc3BlY3R1c19oYXNoIgogICAgcHVzaGJ5dGVzIDB4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjIKICAgIC8vIHNlbGYucHJvc3BlY3R1c191cmwgPSBTdHJpbmcoKQogICAgYnl0ZWMgNDMgLy8gInByb3NwZWN0dXNfdXJsIgogICAgcHVzaGJ5dGVzICIiCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjQtNjUKICAgIC8vICMgRGVub21pbmF0aW9uCiAgICAvLyBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCA9IEFzc2V0KCkKICAgIGJ5dGVjIDQ0IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBBc3NldCgpCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjgtNjkKICAgIC8vICMgVGltZQogICAgLy8gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGUgPSB0eXAuVGltZVN0YW1wKCkKICAgIGJ5dGVjIDI4IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcwCiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSB0eXAuVGltZVN0YW1wKCkKICAgIGJ5dGVjIDQ1IC8vICJtYXR1cml0eV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MQogICAgLy8gc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgPSB0eXAuVGltZVN0YW1wKCkKICAgIGJ5dGVjIDI5IC8vICJ0cmFuc2Zlcl9vcGVuaW5nX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcyCiAgICAvLyBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgMzAgLy8gInRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzQtNzUKICAgIC8vICMgRGF5IENvdW50IENvbnZlbnRpb24KICAgIC8vIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPSBVSW50NjQoKQogICAgYnl0ZWMgNDYgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3Ny03OAogICAgLy8gIyBVbml0cwogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IFVJbnQ2NCgpCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc5CiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID0gVUludDY0KCkKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODEtODIKICAgIC8vICMgUHJpbmNpcGFsCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID0gVUludDY0KCkKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODMKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gVUludDY0KCkKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODUKICAgIC8vIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiA9IEZhbHNlCiAgICBieXRlYyAzNCAvLyAiZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODctODgKICAgIC8vICMgSW50ZXJlc3QKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OQogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ID0gVUludDY0KCkKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkxLTkyCiAgICAvLyAjIEludGVyZXN0IFJhdGVzCiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzCiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkID0gVUludDY0KCkKICAgIGJ5dGVjIDM1IC8vICJyYXRlX3Jlc2V0X3NwcmVhZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9tdWx0aXBsaWVyID0gVUludDY0KCkKICAgIGJ5dGVjIDM2IC8vICJyYXRlX3Jlc2V0X211bHRpcGxpZXIiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfZmxvb3IgPSBVSW50NjQoKQogICAgYnl0ZWMgMzEgLy8gInJhdGVfcmVzZXRfZmxvb3IiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfY2FwID0gVUludDY0KCkKICAgIGJ5dGVjIDMyIC8vICJyYXRlX3Jlc2V0X2NhcCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTcKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9uZXh0ID0gVUludDY0KCkKICAgIGJ5dGVjIDM3IC8vICJyYXRlX3Jlc2V0X25leHQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4CiAgICAvLyBzZWxmLmhhc19yYXRlX3Jlc2V0X2Zsb29yID0gRmFsc2UKICAgIGJ5dGVjIDM4IC8vICJoYXNfcmF0ZV9yZXNldF9mbG9vciIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTkKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwID0gRmFsc2UKICAgIGJ5dGVjIDM5IC8vICJoYXNfcmF0ZV9yZXNldF9jYXAiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMS0xMDIKICAgIC8vICMgUHJpbWFyeSBEaXN0cmlidXRpb24KICAgIC8vIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsID0gVUludDY0KCkKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMwogICAgLy8gc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNS0xMDYKICAgIC8vICMgQ3VtdWxhdGl2ZSBQZXItVW5pdCBGaXhlZC1Qb2ludCBJbmRleGVzCiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggPSBVSW50NjQoKQogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNwogICAgLy8gc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNQogICAgLy8gc2VsZi5ldmVudF9jdXJzb3IgPSBVSW50NjQoKQogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTYKICAgIC8vIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgPSBVSW50NjQoKQogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExOC0xMTkKICAgIC8vICMgUGVyZm9ybWFuY2UKICAgIC8vIHNlbGYuZGVmYXVsdGVkID0gRmFsc2UKICAgIGJ5dGVjIDQ3IC8vICJkZWZhdWx0ZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMS0xMjIKICAgIC8vICMgU2NhbGluZwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjIzCiAgICAvLyBhc3NlcnQgVHhuLmdsb2JhbF9udW1fYnl0ZV9zbGljZSA9PSBjZmcuR0xPQkFMX0JZVEVTLCBlcnIuV1JPTkdfR0xPQkFMX0JZVEVTCiAgICB0eG4gR2xvYmFsTnVtQnl0ZVNsaWNlCiAgICBwdXNoaW50IDEwCiAgICA9PQogICAgYXNzZXJ0IC8vIFdyb25nIEdsb2JhbCBCeXRlcyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6MjQKICAgIC8vIGFzc2VydCBUeG4uZ2xvYmFsX251bV91aW50ID09IGNmZy5HTE9CQUxfVUlOVFMsIGVyci5XUk9OR19HTE9CQUxfVUlOVFMKICAgIHR4biBHbG9iYWxOdW1VaW50CiAgICBwdXNoaW50IDU0CiAgICA9PQogICAgYXNzZXJ0IC8vIFdyb25nIEdsb2JhbCBVSW50cyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6MjUKICAgIC8vIGFzc2VydCBUeG4ubG9jYWxfbnVtX2J5dGVfc2xpY2UgPT0gY2ZnLkxPQ0FMX0JZVEVTLCBlcnIuV1JPTkdfTE9DQUxfQllURVMKICAgIHR4biBMb2NhbE51bUJ5dGVTbGljZQogICAgIQogICAgYXNzZXJ0IC8vIFdyb25nIExvY2FsIEJ5dGVzIGFsbG9jYXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kX2FzYS9jb250cmFjdC5weToyNgogICAgLy8gYXNzZXJ0IFR4bi5sb2NhbF9udW1fdWludCA9PSBjZmcuTE9DQUxfVUlOVFMsIGVyci5XUk9OR19MT0NBTF9VSU5UUwogICAgdHhuIExvY2FsTnVtVWludAogICAgIQogICAgYXNzZXJ0IC8vIFdyb25nIExvY2FsIFVJbnRzIGFsbG9jYXRpb24KCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjgtMTgKICAgIC8vIGNsYXNzIERBU0EoCiAgICAvLyAgICAgUGF5bWVudEFnZW50LAogICAgLy8gICAgIFRyYW5zZmVyQWdlbnQsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyAgICAgYXZtX3ZlcnNpb249MTIsCiAgICAvLyApOgogICAgcHVzaGJ5dGVzIDB4OTE0ZjA0ZWIgLy8gbWV0aG9kICJjb250cmFjdF91cGRhdGUoKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX2NvbnRyYWN0X3VwZGF0ZV9yb3V0ZUA0CgptYWluX3N3aXRjaF9jYXNlX25leHRANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kX2FzYS9jb250cmFjdC5weTo4LTE4CiAgICAvLyBjbGFzcyBEQVNBKAogICAgLy8gICAgIFBheW1lbnRBZ2VudCwKICAgIC8vICAgICBUcmFuc2ZlckFnZW50LAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gICAgIGF2bV92ZXJzaW9uPTEyLAogICAgLy8gKToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJ6IG1haW5fY3JlYXRlX05vT3BAMzMKICAgIHB1c2hieXRlc3MgMHhiNDQ2MThjOCAweGU3ODMyNTI5IDB4OTQzODg3MjMgMHg2Yzg1ZTNlZSAweGJkZDFhOTQ0IDB4N2MwZjE4MTIgMHgxNGZjMTBlZiAweDc0YTcyOTdmIDB4MDlkNGZlMTQgMHg5YTliZmE4NSAweDg1ZWVkMzNkIDB4YWIyYzBmYzQgMHhkOWYyMjVhYyAweDk4ODM1MDVhIDB4ZmI0ZDQ0MjggMHg4ZWE2ZTc0YyAweDAyYWY1NTdhIDB4ODJmNzFiMmQgMHhlZjA0ZjVkMyAweGRmMzQzNTUwIDB4M2RiZTgwYmQgMHgxZTNlNDhlNyAweDAxMGM4Mjk5IDB4NzQwNmFjZDIgMHgxYTcyYTJlZSAvLyBtZXRob2QgImZ1bmRfZHVlX2Nhc2hmbG93cyh1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJjbGFpbV9kdWVfY2FzaGZsb3dzKGFkZHJlc3MsYnl0ZVtdKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYnl0ZVtdKSIsIG1ldGhvZCAidHJhbnNmZXJfc2V0X3NjaGVkdWxlKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbihhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInRyYW5zZmVyKGFkZHJlc3MsYWRkcmVzcyx1aW50NjQpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X3N1c3BlbnNpb24oYWRkcmVzcyxib29sKXVpbnQ2NCIsIG1ldGhvZCAiYWNjb3VudF9vcGVuKGFkZHJlc3MsYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgImFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzcyhhZGRyZXNzLGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X2dldF9wb3NpdGlvbihhZGRyZXNzKShhZGRyZXNzLHVpbnQ2NCx1aW50NjQsYm9vbCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAiY29udHJhY3RfY29uZmlnKCh1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxib29sLGJvb2wsYm9vbCx1aW50NjQpLCh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCksKGJ5dGVbMzJdLHN0cmluZykpdWludDY0IiwgbWV0aG9kICJjb250cmFjdF9zY2hlZHVsZSh1aW50NjQsYm9vbCwodWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NClbXSl1aW50NjQiLCBtZXRob2QgImNvbnRyYWN0X2V4ZWN1dGVfaWVkKCl1aW50NjQiLCBtZXRob2QgImFwcGx5X25vbl9jYXNoX2V2ZW50KHVpbnQ2NCwodWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIsIG1ldGhvZCAiYXBwZW5kX29ic2VydmVkX2Nhc2hfZXZlbnQoKHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIsIG1ldGhvZCAiY29udHJhY3Rfc2V0X2RlZmF1bHRfc3RhdHVzKGJvb2wpdWludDY0IiwgbWV0aG9kICJjb250cmFjdF9nZXRfc3RhdGUoKSh1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAiY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50KCkodWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgInJiYWNfcm90YXRlX2FycmFuZ2VyKGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX3NldF9vcF9kYWVtb24oYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgInJiYWNfYXNzaWduX3JvbGUodWludDgsYWRkcmVzcywodWludDY0LHVpbnQ2NCkpdWludDY0IiwgbWV0aG9kICJyYmFjX3Jldm9rZV9yb2xlKHVpbnQ4LGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX2NvbnRyYWN0X3N1c3BlbnNpb24oYm9vbCl1aW50NjQiLCBtZXRob2QgInJiYWNfZ2V0X2FycmFuZ2VyKClhZGRyZXNzIiwgbWV0aG9kICJyYmFjX2dldF9hZGRyZXNzX3JvbGVzKGFkZHJlc3MpKGJvb2wsYm9vbCxib29sLGJvb2wsYm9vbCkiLCBtZXRob2QgInJiYWNfZ2V0X3JvbGVfdmFsaWRpdHkodWludDgsYWRkcmVzcykodWludDY0LHVpbnQ2NCkiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBmdW5kX2R1ZV9jYXNoZmxvd3MgY2xhaW1fZHVlX2Nhc2hmbG93cyB0cmFuc2Zlcl9zZXRfc2NoZWR1bGUgcHJpbWFyeV9kaXN0cmlidXRpb24gdHJhbnNmZXIgYWNjb3VudF9zdXNwZW5zaW9uIGFjY291bnRfb3BlbiBhY2NvdW50X3VwZGF0ZV9wYXltZW50X2FkZHJlc3MgYWNjb3VudF9nZXRfcG9zaXRpb24gY29udHJhY3RfY29uZmlnIGNvbnRyYWN0X3NjaGVkdWxlIGNvbnRyYWN0X2V4ZWN1dGVfaWVkIGFwcGx5X25vbl9jYXNoX2V2ZW50IGFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50IGNvbnRyYWN0X3NldF9kZWZhdWx0X3N0YXR1cyBjb250cmFjdF9nZXRfc3RhdGUgY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50IHJiYWNfcm90YXRlX2FycmFuZ2VyIHJiYWNfc2V0X29wX2RhZW1vbiByYmFjX2Fzc2lnbl9yb2xlIHJiYWNfcmV2b2tlX3JvbGUgcmJhY19jb250cmFjdF9zdXNwZW5zaW9uIHJiYWNfZ2V0X2FycmFuZ2VyIHJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXMgcmJhY19nZXRfcm9sZV92YWxpZGl0eQogICAgZXJyCgptYWluX2NyZWF0ZV9Ob09wQDMzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjgtMTgKICAgIC8vIGNsYXNzIERBU0EoCiAgICAvLyAgICAgUGF5bWVudEFnZW50LAogICAgLy8gICAgIFRyYW5zZmVyQWdlbnQsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyAgICAgYXZtX3ZlcnNpb249MTIsCiAgICAvLyApOgogICAgcHVzaGJ5dGVzIDB4OTU2ZDcxNTYgLy8gbWV0aG9kICJjb250cmFjdF9jcmVhdGUoYWRkcmVzcyl1aW50NjQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBjb250cmFjdF9jcmVhdGUKICAgIGVycgoKbWFpbl9jb250cmFjdF91cGRhdGVfcm91dGVANDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgNCAvLyBVcGRhdGVBcHBsaWNhdGlvbgogICAgPT0KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0CiAgICBiIGNvbnRyYWN0X3VwZGF0ZQoKCi8vIF9wdXlhX2xpYi51dGlsLmVuc3VyZV9idWRnZXQocmVxdWlyZWRfYnVkZ2V0OiB1aW50NjQsIGZlZV9zb3VyY2U6IHVpbnQ2NCkgLT4gdm9pZDoKZW5zdXJlX2J1ZGdldDoKICAgIHByb3RvIDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDEwCiAgICArCgplbnN1cmVfYnVkZ2V0X3doaWxlX3RvcEAxOgogICAgZnJhbWVfZGlnIDAKICAgIGdsb2JhbCBPcGNvZGVCdWRnZXQKICAgID4KICAgIGJ6IGVuc3VyZV9idWRnZXRfYWZ0ZXJfd2hpbGVANgogICAgaXR4bl9iZWdpbgogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGJ5dGVjIDQ4IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbQogICAgYnl0ZWMgNDggLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KICAgIGZyYW1lX2RpZyAtMQogICAgc3dpdGNoIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMEAzIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMUA0CgplbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX25leHRANToKICAgIGl0eG5fc3VibWl0CiAgICBiIGVuc3VyZV9idWRnZXRfd2hpbGVfdG9wQDEKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMUA0OgogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgaXR4bl9maWVsZCBGZWUKICAgIGIgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV9uZXh0QDUKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMEAzOgogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBiIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfbmV4dEA1CgplbnN1cmVfYnVkZ2V0X2FmdGVyX3doaWxlQDY6CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnBheW1lbnRfYWdlbnQuUGF5bWVudEFnZW50LmZ1bmRfZHVlX2Nhc2hmbG93c1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmZ1bmRfZHVlX2Nhc2hmbG93czoKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gMTMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDYKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjY4CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2OQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3MAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzOAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTAKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzIKICAgIC8vIGlmIHNlbGYuX2lzX2R5bmFtaWNfYW5udWl0eSgpOgogICAgY2FsbHN1YiBfaXNfZHluYW1pY19hbm51aXR5CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzYtNzcKICAgIC8vICsgbWF4X2V2ZW50X2NvdW50CiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfRlVORF9EVUVfQ0FTSEZMT1dTX1BFUl9FVkVOVF9CVURHRVQpCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3NwogICAgLy8gKiBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19QRVJfRVZFTlRfQlVER0VUKQogICAgcHVzaGludCAxMDAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3Ni03NwogICAgLy8gKyBtYXhfZXZlbnRfY291bnQKICAgIC8vICogVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfUEVSX0VWRU5UX0JVREdFVCkKICAgICoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3NQogICAgLy8gVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfQkFTRV9CVURHRVQpCiAgICBpbnRjIDQgLy8gMTUwMAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojc1LTc3CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19CQVNFX0JVREdFVCkKICAgIC8vICsgbWF4X2V2ZW50X2NvdW50CiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfRlVORF9EVUVfQ0FTSEZMT1dTX1BFUl9FVkVOVF9CVURHRVQpCiAgICArCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzMtNzkKICAgIC8vIGVuc3VyZV9idWRnZXQoCiAgICAvLyAgICAgcmVxdWlyZWRfYnVkZ2V0PSgKICAgIC8vICAgICAgICAgVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfQkFTRV9CVURHRVQpCiAgICAvLyAgICAgICAgICsgbWF4X2V2ZW50X2NvdW50CiAgICAvLyAgICAgICAgICogVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfUEVSX0VWRU5UX0JVREdFVCkKICAgIC8vICAgICApLAogICAgLy8gKQogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4MQogICAgLy8gcHJvY2Vzc2VkX2V2ZW50cyA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjgyCiAgICAvLyBmdW5kZWRfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDE0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODMKICAgIC8vIGZ1bmRlZF9wcmluY2lwYWwgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDEzCgpmdW5kX2R1ZV9jYXNoZmxvd3Nfd2hpbGVfdG9wQDQ6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODYKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgPCBtYXhfZXZlbnRfY291bnQKICAgIGRpZyA0CiAgICBkaWcgMQogICAgPAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojg2LTg3CiAgICAvLyBwcm9jZXNzZWRfZXZlbnRzIDwgbWF4X2V2ZW50X2NvdW50CiAgICAvLyBhbmQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAMTEKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4NwogICAgLy8gYW5kIHNlbGYuZXZlbnRfY3Vyc29yIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICA8CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODYtODcKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgPCBtYXhfZXZlbnRfY291bnQKICAgIC8vIGFuZCBzZWxmLmV2ZW50X2N1cnNvciA8IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQKICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl93aGlsZUAxMQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojg5CiAgICAvLyBlbnRyeSA9IHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLmV2ZW50X2N1cnNvcikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICBkdXAKICAgIGJ1cnkgMTcKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5MAogICAgLy8gaWYgZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcDoKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSAzCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDExCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6OTIKICAgIC8vIGlmIG5vdCBzZWxmLl9ldmVudF9pc19jYXNoKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkpOgogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBidXJ5IDE2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNTQKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgaW50Y18yIC8vIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM1My0zNTcKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX01EKSwKICAgIC8vICkKICAgID09CiAgICBkdXAKICAgIGJ1cnkgNAogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX3RydWVANTIKICAgIGRpZyAxNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzU1CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzUzLTM1NwogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfTUQpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDUyCiAgICBkaWcgMTQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM1NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9NRCksCiAgICBwdXNoaW50IDE5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNTMtMzU3CiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9NRCksCiAgICAvLyApCiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VANTMKCmZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX3RydWVANTI6CiAgICBpbnRjXzEgLy8gMQoKZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfbWVyZ2VANTQ6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6OTIKICAgIC8vIGlmIG5vdCBzZWxmLl9ldmVudF9pc19jYXNoKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkpOgogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTEKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF9pZCA9PSBzZWxmLmV2ZW50X2N1cnNvciwgZXJyLklOVkFMSURfRVZFTlRfQ1VSU09SCiAgICBkaWcgMTUKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgY3Vyc29yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTIKICAgIC8vIGFzc2VydCBlbnRyeS5zY2hlZHVsZWRfdGltZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwgZXJyLk5PX0RVRV9DQVNIRkxPVwogICAgZGlnIDEKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIDw9CiAgICBhc3NlcnQgLy8gTm8gZHVlIGNhc2hmbG93IHRvIHBheQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDE2CiAgICAvLyBpZiBldmVudF90eXBlIG5vdCBpbiAoVUludDY0KGVudW1zLkVWVF9JUCksIFVJbnQ2NChlbnVtcy5FVlRfTUQpKToKICAgIGRpZyAyCiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTUKICAgIGRpZyAxNAogICAgcHVzaGludCAxOQogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDE3CiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAxMQoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X2ludGVyZXN0X2Ftb3VudEAxNjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQyOQogICAgLy8gZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGRpZyAxNQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSAxNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDMwCiAgICAvLyBpZiBldmVudF90eXBlIG5vdCBpbiAoVUludDY0KGVudW1zLkVWVF9QUiksIFVJbnQ2NChlbnVtcy5FVlRfTUQpKToKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxOQogICAgZGlnIDE0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzEKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDYKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTU2CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA9IGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBkaWcgMTUKICAgIHB1c2hpbnQgNDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBidXJ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1OQogICAgLy8gaWYgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCk6CiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUAyOQogICAgZGlnIDcKICAgIGJ1cnkgOQoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzUtNTc3CiAgICAvLyAjIEZ1bmRpbmcgdXNlcyBwZXItdW5pdCBjdW11bGF0aXZlIGluZGljZXMgc28gZWFjaCBob2xkZXIgY2FuIHNldHRsZQogICAgLy8gIyBpbmRlcGVuZGVudGx5IGZyb20gaXRzIGN1cnJlbnQgdW5pdCBiYWxhbmNlLgogICAgLy8gaW50ZXJlc3RfaW5kZXhfZGVsdGEgPSBzZWxmLl9hbW91bnRfdG9faW5kZXhfZGVsdGEoaW50ZXJlc3RfYW1vdW50X2R1ZSkKICAgIGRpZyAxMAogICAgY2FsbHN1YiBfYW1vdW50X3RvX2luZGV4X2RlbHRhCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzgKICAgIC8vIHByaW5jaXBhbF9pbmRleF9kZWx0YSA9IHNlbGYuX2Ftb3VudF90b19pbmRleF9kZWx0YShwcmluY2lwYWxfYW1vdW50X2R1ZSkKICAgIGRpZyA2CiAgICBjYWxsc3ViIF9hbW91bnRfdG9faW5kZXhfZGVsdGEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU3OQogICAgLy8gaW50ZXJlc3RfYW1vdW50ID0gc2VsZi5faW5kZXhfZGVsdGFfdG9fYW1vdW50KGludGVyZXN0X2luZGV4X2RlbHRhKQogICAgZGlnIDEKICAgIGNhbGxzdWIgX2luZGV4X2RlbHRhX3RvX2Ftb3VudAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBidXJ5IDE1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1ODAKICAgIC8vIHByaW5jaXBhbF9hbW91bnQgPSBzZWxmLl9pbmRleF9kZWx0YV90b19hbW91bnQocHJpbmNpcGFsX2luZGV4X2RlbHRhKQogICAgZHVwCiAgICBjYWxsc3ViIF9pbmRleF9kZWx0YV90b19hbW91bnQKICAgIGR1cAogICAgYnVyeSAxMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTgxCiAgICAvLyByZXF1aXJlZF9hbW91bnQgPSBpbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50CiAgICBkaWcgMgogICAgZGlnIDEKICAgICsKICAgIGR1cAogICAgYnVyeSA5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MzcKICAgIC8vIGJhbGFuY2UgPSBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBvcHRlZCBpbnRvIGFzc2V0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NTkKICAgIC8vIHJldHVybiBzZWxmLnJlc2VydmVkX2ludGVyZXN0ICsgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICBkaWcgMQogICAgKwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzM5CiAgICAvLyBhc3NlcnQgYmFsYW5jZSA+PSByZXNlcnZlZF90b3RhbCwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGRpZyAyCiAgICBkaWcgMQogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzQwCiAgICAvLyByZXR1cm4gYmFsYW5jZSAtIHJlc2VydmVkX3RvdGFsCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIC0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4MwogICAgLy8gc2VsZi5fYXZhaWxhYmxlX3NldHRsZW1lbnRfZnVuZHMoKSA+PSByZXF1aXJlZF9hbW91bnQKICAgIHVuY292ZXIgMgogICAgPj0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4Mi01ODQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5fYXZhaWxhYmxlX3NldHRsZW1lbnRfZnVuZHMoKSA+PSByZXF1aXJlZF9hbW91bnQKICAgIC8vICksIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcyBmb3IgdGhlIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4NgogICAgLy8gc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCArPSBpbnRlcmVzdF9hbW91bnQKICAgIHVuY292ZXIgMwogICAgKwogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4NwogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgKz0gcHJpbmNpcGFsX2Ftb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIGV4aXN0cwogICAgKwogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1ODgKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCArPSBpbnRlcmVzdF9pbmRleF9kZWx0YQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggZXhpc3RzCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4OQogICAgLy8gc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCArPSBwcmluY2lwYWxfaW5kZXhfZGVsdGEKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggZXhpc3RzCiAgICArCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTkwCiAgICAvLyBpZiBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpOgogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgcHVzaGludCAzCiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUA0MAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTkxLTU5MgogICAgLy8gIyBGb3IgUFIsIHRoZSBwZXJpb2QgaW50ZXJlc3Qgc3RheXMgYWNjcnVlZCB1bnRpbCBhIGxhdGVyIElQIG9yIE1ELgogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ICs9IHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZGlnIDE2CiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBidXJ5IDE4CiAgICArCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQxOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTk1CiAgICAvLyBpZiBub3Qgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCkgb3IgZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSA9PSBVSW50NjQoCiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDQzCiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTUtNTk3CiAgICAvLyBpZiBub3Qgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCkgb3IgZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSA9PSBVSW50NjQoCiAgICAvLyAgICAgZW51bXMuRVZUX01ECiAgICAvLyApOgogICAgcHVzaGludCAxOQogICAgPT0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQ0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUA0MzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5OAogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gZW50cnkubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZGlnIDE1CiAgICBwdXNoaW50IDQxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTkKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGRpZyA4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAwCiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBuZXh0X2ludGVyZXN0X2Jhc2UKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBkaWcgOQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwMQogICAgLy8gc2VsZi5ldmVudF9jdXJzb3IgKz0gVUludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAzCiAgICAvLyBpZiBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoCiAgICBkaWcgMTUKICAgIGV4dHJhY3QgOCAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MDMtNjA1CiAgICAvLyBpZiBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoCiAgICAvLyAgICAgZW51bXMuRVZUX01ECiAgICAvLyApIGFuZCBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9PSBVSW50NjQoMCk6CiAgICBwdXNoYnl0ZXMgMHgxMwogICAgYj09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0NwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjA1CiAgICAvLyApIGFuZCBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9PSBVSW50NjQoMCk6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwMy02MDUKICAgIC8vIGlmIGVudHJ5LmV2ZW50X3R5cGUgPT0gYXJjNC5VSW50OCgKICAgIC8vICAgICBlbnVtcy5FVlRfTUQKICAgIC8vICkgYW5kIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID09IFVJbnQ2NCgwKToKICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0NwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjA2CiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbnVtcy5TVEFUVVNfRU5ERUQpCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBwdXNoaW50IDIwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwNwogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gVUludDY0KDApCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0NzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwOS02MTMKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1pbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50LAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PWludGVyZXN0X2Ftb3VudCArIHByaW5jaXBhbF9hbW91bnQsCiAgICAvLyApCiAgICBkaWcgMTUKICAgIGRpZyA0CiAgICBkdXAKICAgIGNhbGxzdWIgX2VtaXRfZXhlY3V0aW9uX2V2ZW50CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5NgogICAgLy8gZnVuZGVkX2ludGVyZXN0ICs9IGludGVyZXN0X2Ftb3VudAogICAgZGlnIDEzCiAgICBkaWcgMTIKICAgICsKICAgIGJ1cnkgMTQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5NwogICAgLy8gZnVuZGVkX3ByaW5jaXBhbCArPSBwcmluY2lwYWxfYW1vdW50CiAgICBkaWcgMTIKICAgIGRpZyA3CiAgICArCiAgICBidXJ5IDEzCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6OTgKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgKz0gVUludDY0KDEpCiAgICBkaWcgNAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgNQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3Nfd2hpbGVfdG9wQDQKCmZ1bmRfZHVlX2Nhc2hmbG93c19lbHNlX2JvZHlANDA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTQKICAgIC8vIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0MQoKZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlAMjk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NjAKICAgIC8vIGV2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ1cnkgMTYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU2MS01NjMKICAgIC8vICMgRHluYW1pYyBhbm51aXRpZXMgZGVyaXZlIG5leHQgc3RhdGUgZnJvbSB0aGUgcGF5bWVudCBkZWNvbXBvc2l0aW9uLAogICAgLy8gIyBub3Qgb25seSBmcm9tIHRoZSBwcmVjb21wdXRlZCBgbmV4dF8qYCBmaWVsZHMuCiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpOgogICAgcHVzaGludCAzCiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUAzMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY1CiAgICAvLyBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCAtIHByaW5jaXBhbF9hbW91bnRfZHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGRpZyA2CiAgICAtCiAgICBkdXAKICAgIGJ1cnkgOQogICAgYnVyeSA5CiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDMxOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY4CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9JUCk6CiAgICBkaWcgMTQKICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUAzMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY5CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGJ1cnkgOQogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTcwCiAgICAvLyBuZXh0X2ludGVyZXN0X2Jhc2UgPSBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGJ1cnkgMTAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgZXhpc3RzCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDMzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTcxCiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCk6CiAgICBkaWcgMTQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlAMzQKICAgIGRpZyA3CiAgICBidXJ5IDkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzgKCmZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDM0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTcyCiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTczCiAgICAvLyBuZXh0X2ludGVyZXN0X2Jhc2UgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzgKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDMyCiAgICAvLyBpZiBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKToKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzMwogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKToKICAgIGRpZyAxNAogICAgcHVzaGludCAxOQogICAgPT0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDIyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzQKICAgIC8vIHJldHVybiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1NQogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzUKICAgIC8vIGludGVyZXN0X2R1ZSA9IHNlbGYuYWNjcnVlZF9pbnRlcmVzdCArIHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZGlnIDE2CiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBidXJ5IDE4CiAgICArCiAgICBkdXAKICAgIGJ1cnkgMTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzNgogICAgLy8gaWYgc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIDw9IGludGVyZXN0X2R1ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIGV4aXN0cwogICAgPj0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDI0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzcKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1NQogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzgKICAgIC8vIHByaW5jaXBhbF9hbW91bnQgPSBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gLSBpbnRlcmVzdF9kdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIGV4aXN0cwogICAgZGlnIDEwCiAgICAtCiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDM5CiAgICAvLyBpZiBwcmluY2lwYWxfYW1vdW50ID4gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWw6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgID4KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDI2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NDAKICAgIC8vIHJldHVybiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1NQogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjY6CiAgICBkaWcgNgogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTUKICAgIC8vIHByaW5jaXBhbF9hbW91bnRfZHVlID0gc2VsZi5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudChlbnRyeSkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnRAMjgKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDI3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDQzCiAgICAvLyBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA8PSBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZGlnIDE1CiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBkdXAyCiAgICA8PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDQyLTQ0NAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA8PSBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NDUKICAgIC8vIHJldHVybiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCAtIGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBzd2FwCiAgICAtCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1NQogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MTgKICAgIC8vIHJldHVybiBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgKyBzZWxmLl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KGVudHJ5KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgIGRpZyAxNgogICAgY2FsbHN1YiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudAogICAgYnVyeSAxOAogICAgKwogICAgYnVyeSAxMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTU0CiAgICAvLyBpbnRlcmVzdF9hbW91bnRfZHVlID0gc2VsZi5fZW50cnlfaW50ZXJlc3RfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfaW50ZXJlc3RfYW1vdW50QDE2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAMTE6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTAwCiAgICAvLyBhc3NlcnQgcHJvY2Vzc2VkX2V2ZW50cyA+IFVJbnQ2NCgwKSwgZXJyLk5PX0RVRV9DQVNIRkxPVwogICAgZGlnIDQKICAgIGR1cAogICAgYXNzZXJ0IC8vIE5vIGR1ZSBjYXNoZmxvdyB0byBwYXkKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMDQKICAgIC8vIHRvdGFsX2Z1bmRlZD1mdW5kZWRfaW50ZXJlc3QgKyBmdW5kZWRfcHJpbmNpcGFsLAogICAgZGlnIDE0CiAgICBkdXAKICAgIGRpZyAxNQogICAgZHVwCiAgICBjb3ZlciAzCiAgICArCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA2CiAgICAvLyB0aW1lc3RhbXA9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTAxLTEwNwogICAgLy8gcmV0dXJuIHR5cC5DYXNoRnVuZGluZ1Jlc3VsdCgKICAgIC8vICAgICBmdW5kZWRfaW50ZXJlc3Q9ZnVuZGVkX2ludGVyZXN0LAogICAgLy8gICAgIGZ1bmRlZF9wcmluY2lwYWw9ZnVuZGVkX3ByaW5jaXBhbCwKICAgIC8vICAgICB0b3RhbF9mdW5kZWQ9ZnVuZGVkX2ludGVyZXN0ICsgZnVuZGVkX3ByaW5jaXBhbCwKICAgIC8vICAgICBwcm9jZXNzZWRfZXZlbnRzPXByb2Nlc3NlZF9ldmVudHMsCiAgICAvLyAgICAgdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUA1MzoKICAgIGludGNfMCAvLyAwCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDU0CgoKLy8gbW9kdWxlcy5wYXltZW50X2FnZW50LlBheW1lbnRBZ2VudC5jbGFpbV9kdWVfY2FzaGZsb3dzW3JvdXRpbmddKCkgLT4gdm9pZDoKY2xhaW1fZHVlX2Nhc2hmbG93czoKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cG4gMgogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDYKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNQogICAgLy8gaWYgc2VsZi5vcF9kYWVtb24udmFsdWUgIT0gR2xvYmFsLnplcm9fYWRkcmVzczoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNyAvLyAweDUyM2E0ZjUwNDQyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wX2RhZW1vbiBleGlzdHMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE3CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjcgLy8gMHg1MjNhNGY1MDQ0MjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcF9kYWVtb24gZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE3LTE5CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIGJueiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfdHJ1ZUAxNAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE4CiAgICAvLyBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgdHhuIFNlbmRlcgogICAgZGlnIDMKICAgID09CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTctMTkKICAgIC8vIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICAvLyBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgYm56IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDE0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTkKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCAzMgogICAgPT0KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNy0xOQogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICBieiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VAMTUKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDE0OgogICAgaW50Y18xIC8vIDEKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUAxNjoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNi0yMAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyAgICAgb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vICAgICBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgLy8gKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCgpjbGFpbV9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTc6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTM5CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE0MAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzOAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTAKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTQzCiAgICAvLyBzZWxmLl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKGhvbGRpbmdfYWRkcmVzcykKICAgIGRpZyAyCiAgICBkdXAKICAgIGNhbGxzdWIgX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNDQKICAgIC8vIHNlbGYuX3NldHRsZV9wb3NpdGlvbihob2xkaW5nX2FkZHJlc3MpCiAgICBjYWxsc3ViIF9zZXR0bGVfcG9zaXRpb24KICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExNwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY2xhaW1hYmxlX2ludGVyZXN0CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBkdXAKICAgIHB1c2hpbnQgNzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExOAogICAgLy8gKyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jbGFpbWFibGVfcHJpbmNpcGFsCiAgICBkdXAKICAgIHB1c2hpbnQgODEKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExNy0xMTgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNsYWltYWJsZV9pbnRlcmVzdAogICAgLy8gKyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jbGFpbWFibGVfcHJpbmNpcGFsCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTQ2CiAgICAvLyBhc3NlcnQgdG90YWxfYW1vdW50ID4gVUludDY0KDApLCBlcnIuTk9fRFVFX0NBU0hGTE9XCiAgICBhc3NlcnQgLy8gTm8gZHVlIGNhc2hmbG93IHRvIHBheQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI1CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MuaXNfb3B0ZWRfaW4oCiAgICBleHRyYWN0IDAgMzIKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNgogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNS0yNwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLmlzX29wdGVkX2luKAogICAgLy8gICAgIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZAogICAgLy8gKQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNS0yOAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLmlzX29wdGVkX2luKAogICAgLy8gICAgIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZAogICAgLy8gKQogICAgLy8gYW5kIG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQKICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAyNAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI4CiAgICAvLyBhbmQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCAzODQKICAgIGdldGJpdAogICAgYm56IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAyNAogICAgaW50Y18xIC8vIDEKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUAyNToKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNTEKICAgIC8vIGlmIHNlbGYuX2lzX3BheW1lbnRfZXhlY3V0YWJsZShob2xkaW5nX2FkZHJlc3MpOgogICAgYnogY2xhaW1fZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozNAogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIHN3YXAKICAgIGRpZyAxCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozNC0zNQogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIC8vID49IHBheW1lbnRfYW1vdW50CiAgICBkaWcgNQogICAgZHVwCiAgICBjb3ZlciAyCiAgICA+PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjMzLTM2CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICAvLyAgICAgPj0gcGF5bWVudF9hbW91bnQKICAgIC8vICksIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcyBmb3IgdGhlIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNTMKICAgIC8vIHNlbGYuX3BheShzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MsIHRvdGFsX2Ftb3VudCkKICAgIGRpZyAyCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBkdXAKICAgIGV4dHJhY3QgMCAzMgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQwLTQ1CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9cmVjZWl2ZXIsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWFtb3VudCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQ0CiAgICAvLyBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgdW5jb3ZlciAzCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIHVuY292ZXIgMgogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0MAogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgcHVzaGludCA0IC8vIGF4ZmVyCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQwLTQ1CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9cmVjZWl2ZXIsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWFtb3VudCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMjUtMTI2CiAgICAvLyAjIEdldCB0aGUgY2xhaW1hYmxlIGFtb3VudHMgYmVmb3JlIHJlc2V0CiAgICAvLyBpbnRlcmVzdF9hbW91bnQgPSBwb3NpdGlvbi5jbGFpbWFibGVfaW50ZXJlc3QKICAgIGR1cAogICAgcHVzaGludCA3MwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSA5CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTI3CiAgICAvLyBwcmluY2lwYWxfYW1vdW50ID0gcG9zaXRpb24uY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgZHVwCiAgICBwdXNoaW50IDgxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAzCiAgICBidXJ5IDkKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMjktMTMwCiAgICAvLyAjIFJlc2V0IHRoZSBwb3NpdGlvbidzIGNsYWltYWJsZSBhbW91bnRzCiAgICAvLyBwb3NpdGlvbi5jbGFpbWFibGVfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBpdG9iCiAgICBzd2FwCiAgICBkaWcgMQogICAgcmVwbGFjZTIgNzMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzEKICAgIC8vIHBvc2l0aW9uLmNsYWltYWJsZV9wcmluY2lwYWwgPSBVSW50NjQoMCkKICAgIHN3YXAKICAgIHJlcGxhY2UyIDgxCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTMyCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHBvc2l0aW9uLmNvcHkoKQogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTM0CiAgICAvLyBhc3NlcnQgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCA+PSBpbnRlcmVzdF9hbW91bnQsIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX2ludGVyZXN0IGV4aXN0cwogICAgZHVwCiAgICBkaWcgMgogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzNQogICAgLy8gYXNzZXJ0IHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsID49IHByaW5jaXBhbF9hbW91bnQsIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICBkaWcgMwogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzNy0xMzgKICAgIC8vICMgVXBkYXRlIHRoZSBnbG9iYWwgcmVzZXJ2ZWQgaW50ZXJlc3QgYW5kIHByaW5jaXBhbCBhbW91bnRzCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0IC09IGludGVyZXN0X2Ftb3VudAogICAgc3dhcAogICAgLQogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzkKICAgIC8vIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIC09IHByaW5jaXBhbF9hbW91bnQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIHN3YXAKICAgIC0KICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKY2xhaW1fZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTU5CiAgICAvLyB0b3RhbF9hbW91bnQ9aW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudCwKICAgIGRpZyA1CiAgICBkdXAKICAgIGRpZyA2CiAgICBkdXAKICAgIGNvdmVyIDMKICAgICsKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNjAKICAgIC8vIHRpbWVzdGFtcD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNTYtMTYyCiAgICAvLyByZXR1cm4gdHlwLkNhc2hDbGFpbVJlc3VsdCgKICAgIC8vICAgICBpbnRlcmVzdF9hbW91bnQ9aW50ZXJlc3RfYW1vdW50LAogICAgLy8gICAgIHByaW5jaXBhbF9hbW91bnQ9cHJpbmNpcGFsX2Ftb3VudCwKICAgIC8vICAgICB0b3RhbF9hbW91bnQ9aW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudCwKICAgIC8vICAgICB0aW1lc3RhbXA9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgY29udGV4dD1wYXltZW50X2luZm8sCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgMgogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIHB1c2hieXRlcyAweDAwMjIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAyNDoKICAgIGludGNfMCAvLyAwCiAgICBiIGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUAyNQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX2ZhbHNlQDE1OgogICAgaW50Y18wIC8vIDAKICAgIGIgY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDE2CgoKLy8gbW9kdWxlcy50cmFuc2Zlcl9hZ2VudC5UcmFuc2ZlckFnZW50LnRyYW5zZmVyX3NldF9zY2hlZHVsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRyYW5zZmVyX3NldF9zY2hlZHVsZToKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo0MAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQxCiAgICAvLyBhc3NlcnQgb3Blbl9kYXRlIDwgY2xvc3VyZV9kYXRlLCBlcnIuSU5WQUxJRF9TT1JUSU5HCiAgICBkdXAyCiAgICA8CiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbXVzdCBiZSBzb3J0ZWQgaW4gc3RyaWN0bHkgYXNjZW5kaW5nIG9yZGVyCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQzCiAgICAvLyBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA9IG9wZW5fZGF0ZQogICAgYnl0ZWMgMjkgLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIHVuY292ZXIgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDQKICAgIC8vIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlID0gY2xvc3VyZV9kYXRlCiAgICBieXRlYyAzMCAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDUKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy50cmFuc2Zlcl9hZ2VudC5UcmFuc2ZlckFnZW50LnByaW1hcnlfZGlzdHJpYnV0aW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcHJpbWFyeV9kaXN0cmlidXRpb246CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDYKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjcxCiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5wcmltYXJ5X2RlYWxlciwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDIyIC8vIDB4NTIzYTUwNTk0NDIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojc2CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo3NwogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzOAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojc4CiAgICAvLyBhc3NlcnQgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TRUQKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBjbG9zZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgY292ZXIgMwogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4MAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChob2xkaW5nX2FkZHJlc3MpCiAgICBzd2FwCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjgxCiAgICAvLyBhc3NlcnQgdW5pdHMgPiBVSW50NjQoMCksIGVyci5aRVJPX1VOSVRTCiAgICBkdXAKICAgIGFzc2VydCAvLyBDYW4gbm90IGRpc3RyaWJ1dGUgemVybyB1bml0cwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4MwogICAgLy8gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCArIHVuaXRzIDw9IHNlbGYudG90YWxfdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICArCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgPD0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODItODQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCArIHVuaXRzIDw9IHNlbGYudG90YWxfdW5pdHMKICAgIC8vICksIGVyci5PVkVSX0RJU1RSSUJVVElPTgogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCByZW1haW5pbmcgRC1BU0EgdW5pdHMKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODUKICAgIC8vIGlmIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI4IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlIGV4aXN0cwogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojg3CiAgICAvLyBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8PSBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI4IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlIGV4aXN0cwogICAgPD0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODYtODgKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPD0gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGUKICAgIC8vICksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TRUQKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBjbG9zZWQKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNDgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnJlc2VydmVkX3VuaXRzICs9IHVuaXRzCiAgICBkdXBuIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDMKICAgIGR1cAogICAgY292ZXIgMwogICAgKwogICAgaXRvYgogICAgcHVzaGludCA0MAogICAgc3dhcAogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6OTEKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgKz0gdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICArCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6OTIKICAgIC8vIHJldHVybiBzZWxmLnRvdGFsX3VuaXRzIC0gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIHN3YXAKICAgIC0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMudHJhbnNmZXJfYWdlbnQuVHJhbnNmZXJBZ2VudC50cmFuc2Zlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnRyYW5zZmVyOgogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQ2CiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTMwCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxMzEKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzgKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTUwCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuX3N0YXR1c19pc19wZW5kaW5nX2llZCgpLCBlcnIuUEVORElOR19JRUQKICAgICEKICAgIGFzc2VydCAvLyBJRUQgbm90IHlldCBleGVjdXRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxMwogICAgLy8gaWYgc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjkgLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICBieiB0cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTUKICAgIC8vIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjkgLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNC0xNgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gKSwgZXJyLkNMT1NFRF9UUkFOU0ZFUgogICAgYXNzZXJ0IC8vIFRyYW5zZmVyIGlzIGNsb3NlZAoKdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNwogICAgLy8gaWYgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzAgLy8gInRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICBieiB0cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTkKICAgIC8vIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDwgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGUKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMCAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIDwKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTgtMjAKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZQogICAgLy8gKSwgZXJyLkNMT1NFRF9UUkFOU0ZFUgogICAgYXNzZXJ0IC8vIFRyYW5zZmVyIGlzIGNsb3NlZAoKdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxMzUKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIGRpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA4CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIGJ5dGVjIDggLy8gMHg0MTIzCiAgICBkaWcgNQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA5CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjEzOAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChzZW5kZXJfaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDIKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTM5CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGR1cAogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNDAKICAgIC8vIGFzc2VydCBzZW5kZXJfaG9sZGluZ19hZGRyZXNzICE9IHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcywgZXJyLlNFTEZfVFJBTlNGRVIKICAgIHVuY292ZXIgMgogICAgIT0KICAgIGFzc2VydCAvLyBTZW5kZXIgYW5kIHJlY2VpdmVyIG11c3QgYmUgZGlmZmVyZW50CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE0MQogICAgLy8gYXNzZXJ0IHVuaXRzID4gVUludDY0KDApLCBlcnIuTlVMTF9UUkFOU0ZFUgogICAgZGlnIDEKICAgIGR1cAogICAgYXNzZXJ0IC8vIFRyYW5zZmVyIHVuaXRzIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTQyCiAgICAvLyBhc3NlcnQgdW5pdHMgPD0gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLCBlcnIuT1ZFUl9UUkFOU0ZFUgogICAgc3dhcAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIDw9CiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IHNlbmRlciB1bml0cyB0byB0cmFuc2ZlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzY2CiAgICAvLyBpZiBzZWxmLmV2ZW50X2N1cnNvciA+PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICA+PQogICAgYm56IHRyYW5zZmVyX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Fzc2VydF9ub19kdWVfZXZlbnRfcGVuZGluZ0AxMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzY4CiAgICAvLyBuZXh0X2VudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KHNlbGYuZXZlbnRfY3Vyc29yKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc3MAogICAgLy8gbmV4dF9lbnRyeS5zY2hlZHVsZWRfdGltZSA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NjktNzcxCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIG5leHRfZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gKSwgZXJyLlBFTkRJTkdfQUNUVVNfRVZFTlQKICAgIGFzc2VydCAvLyBBQ1RVUyBldmVudCBub3QgeWV0IGV4ZWN1dGVkCgp0cmFuc2Zlcl9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9hc3NlcnRfbm9fZHVlX2V2ZW50X3BlbmRpbmdAMTA6CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE0NQogICAgLy8gc2VsZi5fZW5zdXJlX3VuaXRzX2FjdGl2YXRlZChzZW5kZXJfaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDMKICAgIGR1cAogICAgY2FsbHN1YiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNDYKICAgIC8vIHNlbGYuX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQocmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgY2FsbHN1YiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNDcKICAgIC8vIHNlbGYuX3NldHRsZV9wb3NpdGlvbihzZW5kZXJfaG9sZGluZ19hZGRyZXNzKQogICAgY2FsbHN1YiBfc2V0dGxlX3Bvc2l0aW9uCiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTQ4CiAgICAvLyBzZWxmLl9zZXR0bGVfcG9zaXRpb24ocmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzKQogICAgY2FsbHN1YiBfc2V0dGxlX3Bvc2l0aW9uCiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNTIKICAgIC8vIGFzc2VydCB1bml0cyA8PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cywgZXJyLk9WRVJfVFJBTlNGRVIKICAgIGRpZyA1CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkaWcgMQogICAgPD0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgc2VuZGVyIHVuaXRzIHRvIHRyYW5zZmVyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTUzCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyAtPSB1bml0cwogICAgZGlnIDEKICAgIC0KICAgIGl0b2IKICAgIHVuY292ZXIgMgogICAgaW50Y18zIC8vIDMyCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTQ0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyArPSB1bml0cwogICAgZGlnIDUKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIHVuY292ZXIgMgogICAgKwogICAgaXRvYgogICAgaW50Y18zIC8vIDMyCiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfc3VzcGVuc2lvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfc3VzcGVuc2lvbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojc3CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyMSAvLyAweDUyM2E0MTU1NTQyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE4NQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkID0gc3VzcGVuZGVkCiAgICBkdXAKICAgIHB1c2hpbnQgNDgKICAgIGludGNfMSAvLyAxCiAgICBib3hfZXh0cmFjdAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMwogICAgc2V0Yml0CiAgICBwdXNoaW50IDQ4CiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE4NgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTY1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5hY2NvdW50X29wZW5bcm91dGluZ10oKSAtPiB2b2lkOgphY2NvdW50X29wZW46CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjgKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmFjY291bnRfbWFuYWdlciwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDIzIC8vIDB4NTIzYTRkNGU0NzIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDIKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0VOREVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDIwMAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTAKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX2VuZGVkKCksIGVyci5VTkFVVEhPUklaRUQKICAgICEKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxMQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTIKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjEzCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozNAogICAgLy8gdW5pdHM9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozMi00MgogICAgLy8gcmV0dXJuIHR5cC5BY2NvdW50UG9zaXRpb24oCiAgICAvLyAgICAgcGF5bWVudF9hZGRyZXNzPXBheW1lbnRfYWRkcmVzcywKICAgIC8vICAgICB1bml0cz1VSW50NjQoMCksCiAgICAvLyAgICAgcmVzZXJ2ZWRfdW5pdHM9VUludDY0KDApLAogICAgLy8gICAgIHN1c3BlbmRlZD1GYWxzZSwKICAgIC8vICAgICBzZXR0bGVkX2N1cnNvcj1VSW50NjQoMCksCiAgICAvLyAgICAgaW50ZXJlc3RfY2hlY2twb2ludD1VSW50NjQoMCksCiAgICAvLyAgICAgcHJpbmNpcGFsX2NoZWNrcG9pbnQ9VUludDY0KDApLAogICAgLy8gICAgIGNsYWltYWJsZV9pbnRlcmVzdD1VSW50NjQoMCksCiAgICAvLyAgICAgY2xhaW1hYmxlX3ByaW5jaXBhbD1VSW50NjQoMCksCiAgICAvLyApCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGJ5dGVjIDQwIC8vIDB4MDAKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjE0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHNlbGYuX25ld19hY2NvdW50X3Bvc2l0aW9uKHBheW1lbnRfYWRkcmVzcykKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTUKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjM4CiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIHVuY292ZXIgMwogICAgPT0KICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIzOQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDAKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQxCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MgPSBwYXltZW50X2FkZHJlc3MKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQyCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfZ2V0X3Bvc2l0aW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF9nZXRfcG9zaXRpb246CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNTkKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9jcmVhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9jcmVhdGU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAzNgogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IGFycmFuZ2VyCiAgICBieXRlYyAxOCAvLyAweDUyM2E0MTUyNTIyMwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMzcKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfY29uZmlnW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfY29uZmlnOgogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBsZW4KICAgIHB1c2hpbnQgMTA3CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLk5vcm1hbGl6ZWRBY3R1c1Rlcm1zCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgcHVzaGludCA3MgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5Jbml0aWFsS2VybmVsU3RhdGUKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBsZW4KICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIHR1cGxlIGVuY29kaW5nCiAgICBkdXAKICAgIHB1c2hpbnQgMzQKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCB0YWlsIHBvaW50ZXIgYXQgaW5kZXggMSBvZiAodWludDhbMzJdLChsZW4rdXRmOFtdKSkKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgY292ZXIgMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMzYKICAgICsKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuUHJvc3BlY3R1cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2OQogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDcxLTEwNzIKICAgIC8vICMgQ29uZmlndXJlIENvbnRyYWN0CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPSB0ZXJtcy5jb250cmFjdF90eXBlLmFzX3VpbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIxLTIyOAogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgYnogY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUA3CiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIyMwogICAgLy8gVUludDY0KGVudW1zLkNUX0FOTiksCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIxLTIyOAogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjI0CiAgICAvLyBVSW50NjQoZW51bXMuQ1RfTkFNKSwKICAgIHB1c2hpbnQgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIxLTIyOAogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjI1CiAgICAvLyBVSW50NjQoZW51bXMuQ1RfTEFNKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIxLTIyOAogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjI2CiAgICAvLyBVSW50NjQoZW51bXMuQ1RfTEFYKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIxLTIyOAogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjI3CiAgICAvLyBVSW50NjQoZW51bXMuQ1RfQ0xNKSwKICAgIHB1c2hpbnQgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIxLTIyOAogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJ6IGNvbnRyYWN0X2NvbmZpZ19ib29sX2ZhbHNlQDgKCmNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANzoKICAgIGludGNfMSAvLyAxCgpjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUA5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjMyCiAgICAvLyBhc3NlcnQgc2VsZi5faXNfc3VwcG9ydGVkX2NvbnRyYWN0X3R5cGUoY29udHJhY3RfdHlwZSksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3NAogICAgLy8gc2VsZi5fc3RvcmVfY29udHJhY3RfY29uZmlnKHNlbGYuY29udHJhY3RfdHlwZSwgdGVybXMsIGluaXRpYWxfc3RhdGUpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgYnVyeSAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzI4CiAgICAvLyBhc3NlcnQgdGVybXMuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZGlnIDQKICAgIGR1cAogICAgcHVzaGludCAzMwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSA4CiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzAKICAgIC8vIHRlcm1zLmRheV9jb3VudF9jb252ZW50aW9uLmFzX3VpbnQ2NCgpCiAgICBwdXNoaW50IDU3CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzAwLTMwNgogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICBieiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDE2CiAgICBkaWcgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzAyCiAgICAvLyBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMwMC0zMDYKICAgIC8vIHJldHVybiBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzYwKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwSVNEQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjApLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDE2CiAgICBkaWcgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzAzCiAgICAvLyBVSW50NjQoZW51bXMuRENDX0EzNjUpLAogICAgcHVzaGludCAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDAtMzA2CiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgID09CiAgICBibnogY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUAxNgogICAgZGlnIDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMwNAogICAgLy8gVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzAwLTMwNgogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGRpZyA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDUKICAgIC8vIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzAwLTMwNgogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICA9PQogICAgYnogY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAMTcKCmNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTY6CiAgICBpbnRjXzEgLy8gMQoKY29udHJhY3RfY29uZmlnX2Jvb2xfbWVyZ2VAMTg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTItMzE0CiAgICAvLyBhc3NlcnQgc2VsZi5faXNfc3VwcG9ydGVkX2RheV9jb3VudF9jb252ZW50aW9uKAogICAgLy8gICAgIGRheV9jb3VudF9jb252ZW50aW9uCiAgICAvLyApLCBlcnIuSU5WQUxJRF9EQVlfQ09VTlRfQ09OVkVOVElPTgogICAgYXNzZXJ0IC8vIEludmFsaWQgZGF5LWNvdW50IGNvbnZlbnRpb24gSUQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMzMgogICAgLy8gaWYgY29udHJhY3RfdHlwZSAhPSBVSW50NjQoZW51bXMuQ1RfQU5OKToKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgICE9CiAgICBieiBjb250cmFjdF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzMzCiAgICAvLyBhc3NlcnQgbm90IHRlcm1zLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24sIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZGlnIDQKICAgIHB1c2hpbnQgNzg2CiAgICBnZXRiaXQKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KCmNvbnRyYWN0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDIwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODEwCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIEQtQVNBIGFscmVhZHkgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODExCiAgICAvLyBhc3NlcnQgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCA9PSBVSW50NjQoMCksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMCAvLyAiaW5pdGlhbF9leGNoYW5nZV9hbW91bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTMtODE0CiAgICAvLyAjIFNldCBEZW5vbWluYXRpb24gQXNzZXQKICAgIC8vIHNlbGYuX2Fzc2VydF9kZW5vbWluYXRpb25fYXNzZXQodGVybXMuZGVub21pbmF0aW9uX2Fzc2V0X2lkKQogICAgZGlnIDQKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NzgtNzc5CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIGRlbm9taW5hdGlvbiB3aXRoIEFTQQogICAgLy8gX2NyZWF0b3IsIGV4aXN0cyA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X2NyZWF0b3IoZGVub21pbmF0aW9uX2Fzc2V0X2lkKQogICAgZHVwCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q3JlYXRvcgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODAKICAgIC8vIGFzc2VydCBleGlzdHMsIGVyci5JTlZBTElEX0RFTk9NSU5BVElPTgogICAgYXNzZXJ0IC8vIERlbm9taW5hdGlvbiBhc3NldCBpcyBub3QgcHJvcGVybHkgc2V0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODMKICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICBieXRlYyA0NCAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTctODE4CiAgICAvLyAjIFNldCBTZXR0bGVtZW50IEFzc2V0CiAgICAvLyBzZWxmLl9hc3NlcnRfc2V0dGxlbWVudF9hc3NldCh0ZXJtcy5zZXR0bGVtZW50X2Fzc2V0X2lkKQogICAgZGlnIDEKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc4OAogICAgLy8gc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODYtNzg5CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc2V0dGxlbWVudCBhc3NldCBpcyB0aGUgZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQgPT0gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIC8vICksIGVyci5JTlZBTElEX1NFVFRMRU1FTlRfQVNTRVQKICAgIGFzc2VydCAvLyBEaWZmZXJlbnQgc2V0dGxlbWVudCBhc3NldCBub3Qgc3VwcG9ydGVkLCBtdXN0IGJlIGVxdWFsIHRvIGRlbm9taW5hdGlvbiBhc3NldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkyCiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBzZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkzLTc5OQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhc3NldF9hbW91bnQ9MCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Nzk4CiAgICAvLyBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Nzk2CiAgICAvLyBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc5NwogICAgLy8gYXNzZXRfYW1vdW50PTAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkzLTc5NAogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3OTMtNzk5CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODIxLTgyMgogICAgLy8gIyBVbml0cwogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IHRlcm1zLnRvdGFsX3VuaXRzCiAgICBkdXAKICAgIHB1c2hpbnQgMTcKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODIzCiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID0gVUludDY0KDApCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgyNS04MjYKICAgIC8vICMgRGF5LUNvdW50IENvbnZlbnRpb25zCiAgICAvLyBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uID0gdGVybXMuZGF5X2NvdW50X2NvbnZlbnRpb24uYXNfdWludDY0KCkKICAgIGJ5dGVjIDQ2IC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGRpZyA4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODI4LTgyOQogICAgLy8gIyBUaW1lCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA9IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZQogICAgZHVwCiAgICBwdXNoaW50IDQxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMjggLy8gImluaXRpYWxfZXhjaGFuZ2VfZGF0ZSIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODMwCiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSB0ZXJtcy5tYXR1cml0eV9kYXRlCiAgICBkaWcgMQogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDQ1IC8vICJtYXR1cml0eV9kYXRlIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MzEKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IGluaXRpYWxfc3RhdGUubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZGlnIDYKICAgIGR1cAogICAgY292ZXIgMgogICAgcHVzaGludCA0OAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzMy04MzQKICAgIC8vICMgUHJpbmNpcGFsCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID0gdGVybXMuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGRpZyAxMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzNQogICAgLy8gc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gdGVybXMuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZGlnIDMKICAgIHB1c2hpbnQgNzg2CiAgICBnZXRiaXQKICAgIGJ5dGVjIDM0IC8vICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzNgogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBpbml0aWFsX3N0YXRlLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZGlnIDEKICAgIHB1c2hpbnQgMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODM4LTgzOQogICAgLy8gIyBJbnRlcmVzdAogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ID0gaW5pdGlhbF9zdGF0ZS5hY2NydWVkX2ludGVyZXN0CiAgICBkaWcgMQogICAgcHVzaGludCA0MAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQxLTg0MgogICAgLy8gIyBJbnRlcmVzdCBSYXRlCiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IGluaXRpYWxfc3RhdGUubm9taW5hbF9pbnRlcmVzdF9yYXRlCiAgICBkaWcgMQogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0MwogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gaW5pdGlhbF9zdGF0ZS5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlCiAgICBkaWcgMQogICAgcHVzaGludCAyNAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQ0CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkID0gdGVybXMucmF0ZV9yZXNldF9zcHJlYWQKICAgIGRpZyAzCiAgICBwdXNoaW50IDU4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzUgLy8gInJhdGVfcmVzZXRfc3ByZWFkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0NQogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIgPSB0ZXJtcy5yYXRlX3Jlc2V0X211bHRpcGxpZXIKICAgIGRpZyAzCiAgICBwdXNoaW50IDY2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzYgLy8gInJhdGVfcmVzZXRfbXVsdGlwbGllciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDYKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9mbG9vciA9IHRlcm1zLnJhdGVfcmVzZXRfZmxvb3IKICAgIGRpZyAzCiAgICBwdXNoaW50IDc0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzEgLy8gInJhdGVfcmVzZXRfZmxvb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQ3CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfY2FwID0gdGVybXMucmF0ZV9yZXNldF9jYXAKICAgIGRpZyAzCiAgICBwdXNoaW50IDgyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzIgLy8gInJhdGVfcmVzZXRfY2FwIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0OAogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X25leHQgPSB0ZXJtcy5yYXRlX3Jlc2V0X25leHQKICAgIGRpZyAzCiAgICBwdXNoaW50IDkwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzcgLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDkKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgPSB0ZXJtcy5oYXNfcmF0ZV9yZXNldF9mbG9vcgogICAgZGlnIDMKICAgIHB1c2hpbnQgNzg0CiAgICBnZXRiaXQKICAgIGJ5dGVjIDM4IC8vICJoYXNfcmF0ZV9yZXNldF9mbG9vciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NTAKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwID0gdGVybXMuaGFzX3JhdGVfcmVzZXRfY2FwCiAgICBkaWcgMwogICAgcHVzaGludCA3ODUKICAgIGdldGJpdAogICAgYnl0ZWMgMzkgLy8gImhhc19yYXRlX3Jlc2V0X2NhcCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NTItODUzCiAgICAvLyAjIFNjYWxpbmcKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgPSB0ZXJtcy5maXhlZF9wb2ludF9zY2FsZQogICAgdW5jb3ZlciAzCiAgICBwdXNoaW50IDk5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU1LTg1NgogICAgLy8gIyBTY2hlZHVsZSBQcm9jZXNzaW5nCiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciA9IGluaXRpYWxfc3RhdGUuZXZlbnRfY3Vyc29yCiAgICBkaWcgMQogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU4LTg1OQogICAgLy8gIyBQZXItVW5pdCBGaXhlZC1Qb2ludCBJbmRleGVzCiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggPSBpbml0aWFsX3N0YXRlLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgKICAgIGRpZyAxCiAgICBwdXNoaW50IDU2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODYwCiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4ID0gaW5pdGlhbF9zdGF0ZS5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleAogICAgZGlnIDEKICAgIHB1c2hpbnQgNjQKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODYyLTg2MwogICAgLy8gIyBSZXNlcnZlZCBBbW91bnQgKGZvciBleGVjdXRlZCBjYXNoZmxvd3MpCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0ID0gVUludDY0KDApCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2NAogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2NgogICAgLy8gYXNzZXJ0IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLCBlcnIuSU5WQUxJRF9JRUQKICAgIGRpZyAyCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICBhc3NlcnQgLy8gSUVEIG11c3QgYmUgc2V0IGluIHRoZSBmdXR1cmUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2NwogICAgLy8gYXNzZXJ0IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA+IGluaXRpYWxfc3RhdGUuc3RhdHVzX2RhdGUsIGVyci5JTlZBTElEX0lFRAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgPAogICAgYXNzZXJ0IC8vIElFRCBtdXN0IGJlIHNldCBpbiB0aGUgZnV0dXJlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NjgKICAgIC8vIGFzc2VydCB0ZXJtcy5pbml0aWFsX2V4Y2hhbmdlX2RhdGUgPCB0ZXJtcy5tYXR1cml0eV9kYXRlLCBlcnIuSU5WQUxJRF9JRUQKICAgIDwKICAgIGFzc2VydCAvLyBJRUQgbXVzdCBiZSBzZXQgaW4gdGhlIGZ1dHVyZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3Ni0xMDc3CiAgICAvLyAjIE5vdGFyaXplIHByb3NwZWN0dXMgKG9wdGlvbmFsKQogICAgLy8gc2VsZi5wcm9zcGVjdHVzX2hhc2ggPSBwcm9zcGVjdHVzLmhhc2guYnl0ZXMKICAgIGRpZyAyCiAgICBleHRyYWN0IDAgMzIKICAgIGJ5dGVjIDQyIC8vICJwcm9zcGVjdHVzX2hhc2giCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3OAogICAgLy8gc2VsZi5wcm9zcGVjdHVzX3VybCA9IHByb3NwZWN0dXMudXJsCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGVjIDQzIC8vICJwcm9zcGVjdHVzX3VybCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc5CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAMTc6CiAgICBpbnRjXzAgLy8gMAogICAgYiBjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUAxOAoKY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAODoKICAgIGludGNfMCAvLyAwCiAgICBiIGNvbnRyYWN0X2NvbmZpZ19ib29sX21lcmdlQDkKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9zY2hlZHVsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X3NjaGVkdWxlOgogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDgxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHN3YXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBkdXAKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgMgogICAgKwogICAgdW5jb3ZlciAyCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLkV4ZWN1dGlvblNjaGVkdWxlRW50cnk+CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTEzCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMTYKICAgIC8vIGNvbnRyYWN0X3R5cGU9c2VsZi5jb250cmFjdF90eXBlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGNvdmVyIDMKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4ODQKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4ODUtODg3CiAgICAvLyBhc3NlcnQgc2NoZWR1bGVfcGFnZS5sZW5ndGggPD0gVUludDY0KAogICAgLy8gICAgIGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUKICAgIC8vICksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGR1cAogICAgcHVzaGludCAxNgogICAgPD0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg4OAogICAgLy8gYXNzZXJ0IHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPiBVSW50NjQoMCksIGVyci5URVJNU19OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSB0ZXJtcyBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODkwCiAgICAvLyBwYWdlX2N1cnNvciA9IHNjaGVkdWxlX3BhZ2VfaW5kZXggKiBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkKICAgIHN3YXAKICAgIHB1c2hpbnQgMTYKICAgICoKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg5NwogICAgLy8gKyBwYWdlX2xlbmd0aCAqIFVJbnQ2NChjc3QuT1BfVVBfQ09OVFJBQ1RfQ09ORklHX1BFUl9FTlRSWV9CVURHRVQpCiAgICBwdXNoaW50IDEwMAogICAgKgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODk2CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19CQVNFX0JVREdFVCkKICAgIGludGMgNCAvLyAxNTAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTYtODk3CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19CQVNFX0JVREdFVCkKICAgIC8vICsgcGFnZV9sZW5ndGggKiBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19QRVJfRU5UUllfQlVER0VUKQogICAgKwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODkyLTg5OQogICAgLy8gIyBWYWxpZGF0aW9uIGNvc3QgZ3Jvd3Mgd2l0aCBwYWdlIGxlbmd0aCwgc28gY29uZmlndXJhdGlvbiBleHBsaWNpdGx5CiAgICAvLyAjIGJ1eXMgZXh0cmEgb3Bjb2RlIGJ1ZGdldCBmb3IgbGFyZ2VyIHVwbG9hZHMuCiAgICAvLyBlbnN1cmVfYnVkZ2V0KAogICAgLy8gICAgIHJlcXVpcmVkX2J1ZGdldD0oCiAgICAvLyAgICAgICAgIFVJbnQ2NChjc3QuT1BfVVBfQ09OVFJBQ1RfQ09ORklHX0JBU0VfQlVER0VUKQogICAgLy8gICAgICAgICArIHBhZ2VfbGVuZ3RoICogVUludDY0KGNzdC5PUF9VUF9DT05UUkFDVF9DT05GSUdfUEVSX0VOVFJZX0JVREdFVCkKICAgIC8vICAgICApLAogICAgLy8gKQogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTAwCiAgICAvLyBpbmRleCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKCmNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEAyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTAxCiAgICAvLyB3aGlsZSBpbmRleCA8IHBhZ2VfbGVuZ3RoOgogICAgZHVwCiAgICBkaWcgNAogICAgPAogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfd2hpbGVAMTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkwMi05MDMKICAgIC8vIGVudHJ5ID0gc2NoZWR1bGVfcGFnZVtpbmRleF0uY29weSgpCiAgICAvLyBlbnRyeV9ldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZGlnIDQKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGJ1cnkgMTIKICAgIGRpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgNjUKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTAzCiAgICAvLyBlbnRyeV9ldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDItOTAzCiAgICAvLyBlbnRyeSA9IHNjaGVkdWxlX3BhZ2VbaW5kZXhdLmNvcHkoKQogICAgLy8gZW50cnlfZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGludGNfMiAvLyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDMKICAgIC8vIGVudHJ5X2V2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBnZXRieXRlCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgMTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkwNAogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X2lkID09IHBhZ2VfY3Vyc29yICsgaW5kZXgsIGVyci5JTlZBTElEX0VWRU5UX0lECiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEzCiAgICBkaWcgNQogICAgdW5jb3ZlciA0CiAgICArCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDUtOTA3CiAgICAvLyBzZWxmLl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBlbnRyeV9ldmVudF90eXBlCiAgICAvLyApCiAgICBkaWcgNQogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTA4CiAgICAvLyBhc3NlcnQgZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgc3dhcAogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDkKICAgIC8vIGlmIGVudHJ5LmV2ZW50X2lkID4gVUludDY0KDApOgogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTAKICAgIC8vIGlmIGluZGV4ID4gVUludDY0KDApOgogICAgZHVwCiAgICBieiBjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlANgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTExCiAgICAvLyBwcmV2aW91c19lbnRyeSA9IHNjaGVkdWxlX3BhZ2VbaW5kZXggLSBVSW50NjQoMSldLmNvcHkoKQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgcHVzaGludCA2NQogICAgKgogICAgZGlnIDExCiAgICBzd2FwCiAgICBwdXNoaW50IDY1CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkyNgogICAgLy8gcHJldmlvdXNfZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gZW50cnkuc2NoZWR1bGVkX3RpbWUKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyA4CiAgICA8PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTI1LTkyNwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBwcmV2aW91c19lbnRyeS5zY2hlZHVsZWRfdGltZSA8PSBlbnRyeS5zY2hlZHVsZWRfdGltZQogICAgLy8gKSwgZXJyLklOVkFMSURfU09SVElORwogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIG11c3QgYmUgc29ydGVkIGluIHN0cmljdGx5IGFzY2VuZGluZyBvcmRlcgoKY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUA4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTI4CiAgICAvLyBpZiBlbnRyeS5ldmVudF9pZCA9PSBVSW50NjQoMCk6CiAgICBkaWcgOAogICAgYm56IGNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkyOS05MzEKICAgIC8vIGFzc2VydCBlbnRyeV9ldmVudF90eXBlID09IFVJbnQ2NCgKICAgIC8vICAgICBlbnVtcy5FVlRfSUVECiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGRpZyA5CiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MzIKICAgIC8vIGluZGV4ICs9IFVJbnQ2NCgxKQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIGNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEAyCgpjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlANjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkxMy05MTUKICAgIC8vICMgVGhlIGZpcnN0IGVudHJ5IG9mIGEgcGFnZSBtdXN0IHN0aWxsIGJlIG9yZGVyZWQgYWZ0ZXIgdGhlCiAgICAvLyAjIGxhc3QgZW50cnkgb2YgdGhlIHByZXZpb3VzIHBhZ2UuCiAgICAvLyBhc3NlcnQgc2NoZWR1bGVfcGFnZV9pbmRleCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGRpZyA2CiAgICBkdXAKICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTYKICAgIC8vIHByZXZpb3VzX3BhZ2VfaW5kZXggPSBzY2hlZHVsZV9wYWdlX2luZGV4IC0gVUludDY0KDEpCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTE4CiAgICAvLyBwcmV2aW91c19wYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZQogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTctOTE5CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHByZXZpb3VzX3BhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjAtOTIxCiAgICAvLyBwcmV2aW91c19wYWdlID0gc2VsZi5zY2hlZHVsZV9wYWdlW3ByZXZpb3VzX3BhZ2VfaW5kZXhdLmNvcHkoKQogICAgLy8gYXNzZXJ0IHByZXZpb3VzX3BhZ2UubGVuZ3RoID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBwdXNoaW50IDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjEKICAgIC8vIGFzc2VydCBwcmV2aW91c19wYWdlLmxlbmd0aCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZHVwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjMKICAgIC8vIHByZXZpb3VzX3BhZ2UubGVuZ3RoIC0gVUludDY0KDEpCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTIyLTkyNAogICAgLy8gcHJldmlvdXNfZW50cnkgPSBwcmV2aW91c19wYWdlWwogICAgLy8gICAgIHByZXZpb3VzX3BhZ2UubGVuZ3RoIC0gVUludDY0KDEpCiAgICAvLyBdLmNvcHkoKQogICAgcHVzaGludCA2NQogICAgKgogICAgcHVzaGludCAyCiAgICArCiAgICBwdXNoaW50IDY1CiAgICBib3hfZXh0cmFjdAogICAgYiBjb250cmFjdF9zY2hlZHVsZV9hZnRlcl9pZl9lbHNlQDcKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX3doaWxlQDExOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjAzCiAgICAvLyBzZWxmLnNjaGVkdWxlX3BhZ2VbcGFnZV9pbmRleF0gPSBzY2hlZHVsZV9wYWdlLmNvcHkoKQogICAgZGlnIDYKICAgIGl0b2IKICAgIGJ5dGVjIDI0IC8vIDB4NTMyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgZGlnIDUKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzNQogICAgLy8gaWYgaXNfbGFzdF9wYWdlOgogICAgZGlnIDUKICAgIGJ6IGNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzNwogICAgLy8gc2NoZWR1bGVfcGFnZV9pbmRleCAqIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKSArIHBhZ2VfbGVuZ3RoCiAgICBkaWcgMQogICAgZGlnIDQKICAgICsKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzNgogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA9ICgKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTM2LTkzOAogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA9ICgKICAgIC8vICAgICBzY2hlZHVsZV9wYWdlX2luZGV4ICogVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpICsgcGFnZV9sZW5ndGgKICAgIC8vICkKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MzkKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgNTAKICAgIGFwcF9nbG9iYWxfcHV0Cgpjb250cmFjdF9zY2hlZHVsZV9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEyMQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDgxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9leGVjdXRlX2llZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X2V4ZWN1dGVfaWVkOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQ2CiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDYKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE0NwogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDgKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTUwCiAgICAvLyBhc3NlcnQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LCBlcnIuSU5WQUxJRF9FVkVOVF9DVVJTT1IKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgZGlnIDEKICAgID4KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGN1cnNvcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1MQogICAgLy8gZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoc2VsZi5ldmVudF9jdXJzb3IpCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTIKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoZW51bXMuRVZUX0lFRCksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGR1cAogICAgZXh0cmFjdCA4IDEKICAgIGR1cAogICAgcHVzaGJ5dGVzIDB4MDEKICAgIGI9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1NgogICAgLy8gZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICBkaWcgMQogICAgZXh0cmFjdCAwIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTgKICAgIC8vIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgZGlnIDIKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTU5CiAgICAvLyBhY2NydWFsX2ZhY3Rvcj1lbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIGRpZyAzCiAgICBleHRyYWN0IDE3IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNjAKICAgIC8vIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIGRpZyA0CiAgICBleHRyYWN0IDI1IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNjIKICAgIC8vIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPWVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDUKICAgIGV4dHJhY3QgMzMgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE2MwogICAgLy8gbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgZGlnIDYKICAgIGV4dHJhY3QgNDEgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE2NAogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9ZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICBkaWcgNwogICAgZXh0cmFjdCA0OSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTY1CiAgICAvLyBmbGFncz1lbnRyeS5mbGFncywKICAgIGRpZyA4CiAgICBleHRyYWN0IDU3IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTUtMTE2NgogICAgLy8gdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0KAogICAgLy8gICAgIGV2ZW50X2lkPWVudHJ5LmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1lbnRyeS5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1lbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPWVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9ZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPWVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGZsYWdzPWVudHJ5LmZsYWdzLAogICAgLy8gKSwKICAgIHVuY292ZXIgNwogICAgdW5jb3ZlciA4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNwogICAgY29uY2F0CiAgICB1bmNvdmVyIDYKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNjEKICAgIC8vIG9ic2VydmVkX3JhdGU9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTUtMTE2NgogICAgLy8gdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0KAogICAgLy8gICAgIGV2ZW50X2lkPWVudHJ5LmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1lbnRyeS5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1lbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPWVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9ZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPWVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGZsYWdzPWVudHJ5LmZsYWdzLAogICAgLy8gKSwKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTUzLTExNjcKICAgIC8vIHNlbGYuX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5KAogICAgLy8gICAgIGVudHJ5LAogICAgLy8gICAgIHR5cC5PYnNlcnZlZEV2ZW50UmVxdWVzdCgKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPWVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIG9ic2VydmVkX3JhdGU9VUludDY0KDApLAogICAgLy8gICAgICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1lbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1lbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICAgICAgZmxhZ3M9ZW50cnkuZmxhZ3MsCiAgICAvLyAgICAgKSwKICAgIC8vICkKICAgIGNhbGxzdWIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5CiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNjgKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEyMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuYXBwbHlfbm9uX2Nhc2hfZXZlbnRbcm91dGluZ10oKSAtPiB2b2lkOgphcHBseV9ub25fY2FzaF9ldmVudDoKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDQKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTcwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cG4gMgogICAgbGVuCiAgICBwdXNoaW50IDczCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLk9ic2VydmVkRXZlbnRSZXF1ZXN0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDYKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIwNwogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMDgKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjEwCiAgICAvLyBpZiBwYXlsb2FkLmZsYWdzICYgVUludDY0KGVudW1zLkZMQUdfT0JTRVJWRURfRVZFTlQpOgogICAgcHVzaGludCA2NQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgcHVzaGludCA0CiAgICAmCiAgICBieiBhcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIzNgogICAgLy8gcmV0dXJuIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQ0xNKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICBwdXNoaW50IDUKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjExCiAgICAvLyBhc3NlcnQgc2VsZi5fc3VwcG9ydHNfb2JzZXJ2ZWRfZXZlbnRzKCksIGVyci5PQlNFUlZFRF9FVkVOVF9SRVFVSVJFRAogICAgYXNzZXJ0IC8vIE9ic2VydmVkIGV2ZW50IHJlcXVpcmVkIHRvIGV4ZWN1dGUgdGhpcyBhY3Rpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMTIKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjM2CiAgICAvLyByZXR1cm4gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9DTE0pCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIGR1cAogICAgcHVzaGludCA1CiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQ4CiAgICAvLyBhc3NlcnQgc2VsZi5fc3VwcG9ydHNfb2JzZXJ2ZWRfZXZlbnRzKCksIGVyci5PQlNFUlZFRF9FVkVOVF9SRVFVSVJFRAogICAgYXNzZXJ0IC8vIE9ic2VydmVkIGV2ZW50IHJlcXVpcmVkIHRvIGV4ZWN1dGUgdGhpcyBhY3Rpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk0OQogICAgLy8gYXNzZXJ0IHBheWxvYWQuZXZlbnRfaWQgPT0gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGRpZyAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDcKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBpZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTUxCiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUsIHBheWxvYWQuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgYnVyeSAxMgogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1MC05NTIKICAgIC8vIHNlbGYuX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIHNlbGYuY29udHJhY3RfdHlwZSwgcGF5bG9hZC5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICAvLyApCiAgICBjYWxsc3ViIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTU0CiAgICAvLyBwYWdlX2luZGV4ID0gc2VsZi5fc2NoZWR1bGVfcGFnZV9pbmRleChzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTkzCiAgICAvLyByZXR1cm4gZXZlbnRfaWQgLy8gVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpCiAgICBwdXNoaW50IDE2CiAgICAvCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTUKICAgIC8vIHBhZ2UgPSB0eXAuRXhlY3V0aW9uU2NoZWR1bGVQYWdlKCkKICAgIGJ5dGVjIDQ5IC8vIDB4MDAwMAogICAgYnVyeSA3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTYKICAgIC8vIGlmIHBhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlOgogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA5CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMjcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1NwogICAgLy8gcGFnZSA9IHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XS5jb3B5KCkKICAgIGRpZyA3CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidXJ5IDcKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX3BhZ2UgZW50cnkgZXhpc3RzCgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDI3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTU4CiAgICAvLyBhc3NlcnQgcGFnZS5sZW5ndGggPCBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGRpZyA1CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgMTYKICAgIDwKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2MwogICAgLy8gc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIGRpZyAzCiAgICBkdXAKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjQKICAgIC8vIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICBkaWcgMQogICAgZXh0cmFjdCAxNyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjUKICAgIC8vIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZGlnIDIKICAgIGV4dHJhY3QgMjUgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTY2CiAgICAvLyBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDMKICAgIGV4dHJhY3QgNDEgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTY3CiAgICAvLyBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIGRpZyA0CiAgICBleHRyYWN0IDQ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2OAogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIHVuY292ZXIgNQogICAgZXh0cmFjdCA1NyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjAtOTcwCiAgICAvLyB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1wYXlsb2FkLmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9cGF5bG9hZC5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPXBheWxvYWQucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXBheWxvYWQubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICkKICAgIGRpZyAxMQogICAgaXRvYgogICAgZGlnIDE4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMwogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTktOTcxCiAgICAvLyBwYWdlLmFwcGVuZCgKICAgIC8vICAgICB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9cGF5bG9hZC5ldmVudF9pZCwKICAgIC8vICAgICAgICAgZXZlbnRfdHlwZT1wYXlsb2FkLmV2ZW50X3R5cGUsCiAgICAvLyAgICAgICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIC8vICAgICAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICAgICApCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NzIKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHBhZ2UuY29weSgpCiAgICBkaWcgOAogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk3MwogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjE1CiAgICAvLyBhc3NlcnQgZXZlbnRfaWQgPT0gc2VsZi5ldmVudF9jdXJzb3IsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBjdXJzb3IKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMTYKICAgIC8vIGVudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KGV2ZW50X2lkKQogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIxOAogICAgLy8gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgYnVyeSAxMAogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjcKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjYtMzczCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY4CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY2LTM3MwogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9SUiksCiAgICBwdXNoaW50IDEyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjYtMzczCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzcwCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICBwdXNoaW50IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjYtMzczCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzcxCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgcHVzaGludCAxOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY2LTM3MwogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM3MgogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjYtMzczCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBieiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX2ZhbHNlQDE2CgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX3RydWVAMTU6CiAgICBpbnRjXzEgLy8gMQoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9tZXJnZUAxNzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMTctMTIxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2lzX25vbl9jYXNoKAogICAgLy8gICAgIGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIC8vICksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IHR5cGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMjAKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlICE9IGFyYzQuVUludDgoZW51bXMuRVZUX0lFRCksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGRpZyA4CiAgICBwdXNoYnl0ZXMgMHgwMQogICAgYiE9CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCB0eXBlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNzcKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluIChVSW50NjQoZW51bXMuRVZUX1JSKSwgVUludDY0KGVudW1zLkVWVF9SUkYpKQogICAgZGlnIDQKICAgIHB1c2hpbnQgMTIKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDIxCiAgICBkaWcgNAogICAgcHVzaGludCAxMQogICAgPT0KICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfZmFsc2VAMjIKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAyMToKICAgIGludGNfMSAvLyAxCgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX21lcmdlQDIzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIyMQogICAgLy8gaWYgc2VsZi5fZXZlbnRfaXNfcmF0ZV9yZXNldChlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpKToKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Vsc2VfYm9keUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODAKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLm9ic2VydmVyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjUgLy8gMHg1MjNhNGQ0ZjQzMjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMjUKICAgIC8vIHNlbGYuX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5KGVudHJ5LCBwYXlsb2FkKQogICAgZGlnIDYKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeQogICAgcG9wbiAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjI2CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfZWxzZV9ib2R5QDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjI0CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIGIgYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYWZ0ZXJfaWZfZWxzZUA2CgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX2ZhbHNlQDIyOgogICAgaW50Y18wIC8vIDAKICAgIGIgYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9tZXJnZUAyMwoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9mYWxzZUAxNjoKICAgIGludGNfMCAvLyAwCiAgICBiIGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfbWVyZ2VAMTcKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5hcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50OgogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGxlbgogICAgcHVzaGludCA2NQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5PYnNlcnZlZENhc2hFdmVudFJlcXVlc3QKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NgogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjU3CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyNTgKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjU5CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM4CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE1MAogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIzNgogICAgLy8gcmV0dXJuIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQ0xNKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICBwdXNoaW50IDUKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5ODQKICAgIC8vIGFzc2VydCBzZWxmLl9zdXBwb3J0c19vYnNlcnZlZF9ldmVudHMoKSwgZXJyLk9CU0VSVkVEX0VWRU5UX1JFUVVJUkVECiAgICBhc3NlcnQgLy8gT2JzZXJ2ZWQgZXZlbnQgcmVxdWlyZWQgdG8gZXhlY3V0ZSB0aGlzIGFjdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTg1CiAgICAvLyBhc3NlcnQgcGF5bG9hZC5ldmVudF9pZCA9PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LCBlcnIuSU5WQUxJRF9FVkVOVF9JRAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgc3dhcAogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBpZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTg2CiAgICAvLyBhc3NlcnQgcGF5bG9hZC5ldmVudF90eXBlID09IGFyYzQuVUludDgoZW51bXMuRVZUX1BSKSwgZXJyLklOVkFMSURfRVZFTlRfVFlQRQogICAgZGlnIDEKICAgIGV4dHJhY3QgOCAxCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIHB1c2hieXRlcyAweDAzCiAgICBiPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IHR5cGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4NwogICAgLy8gYXNzZXJ0IHBheWxvYWQuZmxhZ3MgJiBVSW50NjQoZW51bXMuRkxBR19DQVNIX0VWRU5UKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBzd2FwCiAgICBwdXNoaW50IDU3CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzEgLy8gMQogICAgJgogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTg5CiAgICAvLyBpZiBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50ID4gVUludDY0KDApOgogICAgYnogYXBwZW5kX29ic2VydmVkX2Nhc2hfZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OTEKICAgIC8vIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgLSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OTAtOTkyCiAgICAvLyBwcmV2aW91c19lbnRyeSA9IHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeSgKICAgIC8vICAgICBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IC0gVUludDY0KDEpCiAgICAvLyApCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5NAogICAgLy8gcHJldmlvdXNfZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gcGF5bG9hZC5zY2hlZHVsZWRfdGltZQogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDQKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIDw9CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OTMtOTk1CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHByZXZpb3VzX2VudHJ5LnNjaGVkdWxlZF90aW1lIDw9IHBheWxvYWQuc2NoZWR1bGVkX3RpbWUKICAgIC8vICksIGVyci5JTlZBTElEX1NPUlRJTkcKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBtdXN0IGJlIHNvcnRlZCBpbiBzdHJpY3RseSBhc2NlbmRpbmcgb3JkZXIKCmFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5NwogICAgLy8gcGFnZV9pbmRleCA9IHNlbGYuX3NjaGVkdWxlX3BhZ2VfaW5kZXgoc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE5MwogICAgLy8gcmV0dXJuIGV2ZW50X2lkIC8vIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKQogICAgcHVzaGludCAxNgogICAgLwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTk4CiAgICAvLyBwYWdlID0gdHlwLkV4ZWN1dGlvblNjaGVkdWxlUGFnZSgpCiAgICBieXRlYyA0OSAvLyAweDAwMDAKICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTk5CiAgICAvLyBpZiBwYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZToKICAgIGl0b2IKICAgIGJ5dGVjIDI0IC8vIDB4NTMyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgNwogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBhcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMDAKICAgIC8vIHBhZ2UgPSBzZWxmLnNjaGVkdWxlX3BhZ2VbcGFnZV9pbmRleF0uY29weSgpCiAgICBkaWcgNQogICAgYm94X2dldAogICAgc3dhcAogICAgYnVyeSA2CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9wYWdlIGVudHJ5IGV4aXN0cwoKYXBwZW5kX29ic2VydmVkX2Nhc2hfZXZlbnRfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAwMQogICAgLy8gYXNzZXJ0IHBhZ2UubGVuZ3RoIDwgVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBkaWcgNAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBwdXNoaW50IDE2CiAgICA8CiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDA2CiAgICAvLyBzY2hlZHVsZWRfdGltZT1wYXlsb2FkLnNjaGVkdWxlZF90aW1lLAogICAgZGlnIDUKICAgIGR1cAogICAgZXh0cmFjdCA5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMDcKICAgIC8vIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICBkaWcgMQogICAgZXh0cmFjdCAxNyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDA4CiAgICAvLyByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPXBheWxvYWQucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIGRpZyAyCiAgICBleHRyYWN0IDI1IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMDkKICAgIC8vIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPXBheWxvYWQubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBkaWcgMwogICAgZXh0cmFjdCAzMyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDEwCiAgICAvLyBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIGRpZyA0CiAgICBleHRyYWN0IDQxIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMTEKICAgIC8vIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXBheWxvYWQubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICB1bmNvdmVyIDUKICAgIGV4dHJhY3QgNDkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAwMy0xMDEzCiAgICAvLyB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1wYXlsb2FkLmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9cGF5bG9hZC5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPXBheWxvYWQucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXBheWxvYWQubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICkKICAgIGRpZyAxMAogICAgaXRvYgogICAgZGlnIDEwCiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMwogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDAyLTEwMTQKICAgIC8vIHBhZ2UuYXBwZW5kKAogICAgLy8gICAgIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgICAgICBldmVudF9pZD1wYXlsb2FkLmV2ZW50X2lkLAogICAgLy8gICAgICAgICBldmVudF90eXBlPXBheWxvYWQuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICAgICAgYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPXBheWxvYWQubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1wYXlsb2FkLm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgICAgICBmbGFncz1wYXlsb2FkLmZsYWdzLAogICAgLy8gICAgICkKICAgIC8vICkKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMTUKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHBhZ2UuY29weSgpCiAgICBkaWcgNgogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMTYKICAgIC8vIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgKz0gVUludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI2MwogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjI4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9zZXRfZGVmYXVsdF9zdGF0dXNbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9zZXRfZGVmYXVsdF9zdGF0dXM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjY1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzQKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnRydXN0ZWUsIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyNiAvLyAweDUyM2E1NDUyNTMyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI3OAogICAgLy8gc2VsZi5kZWZhdWx0ZWQgPSBkZWZhdWx0ZWQKICAgIGJ5dGVjIDQ3IC8vICJkZWZhdWx0ZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI3OQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjY1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9nZXRfc3RhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9nZXRfc3RhdGU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDYKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGR1cAogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjk0CiAgICAvLyBjb250cmFjdF90eXBlPWFyYzQuVUludDgoc2VsZi5jb250cmFjdF90eXBlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgaXRvYgogICAgZHVwCiAgICBiaXRsZW4KICAgIGludGNfMiAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBleHRyYWN0IDcgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI5NgogICAgLy8gdG90YWxfdW5pdHM9c2VsZi50b3RhbF91bml0cywKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjk3CiAgICAvLyByZXNlcnZlZF91bml0c190b3RhbD1zZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyOTgKICAgIC8vIGluaXRpYWxfZXhjaGFuZ2VfYW1vdW50PXNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI5OQogICAgLy8gZXZlbnRfY3Vyc29yPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzAwCiAgICAvLyBzY2hlZHVsZV9lbnRyeV9jb3VudD1zZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMwMQogICAgLy8gb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzAyCiAgICAvLyBpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlPXNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzAzCiAgICAvLyBub21pbmFsX2ludGVyZXN0X3JhdGU9c2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMDQKICAgIC8vIGFjY3J1ZWRfaW50ZXJlc3Q9c2VsZi5hY2NydWVkX2ludGVyZXN0LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMDUKICAgIC8vIGN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXg9c2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzA2CiAgICAvLyBjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleD1zZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMDcKICAgIC8vIHJlc2VydmVkX2ludGVyZXN0PXNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX2ludGVyZXN0IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMwOAogICAgLy8gcmVzZXJ2ZWRfcHJpbmNpcGFsPXNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI5My0xMzA5CiAgICAvLyByZXR1cm4gdHlwLktlcm5lbFN0YXRlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGU9YXJjNC5VSW50OChzZWxmLmNvbnRyYWN0X3R5cGUpLAogICAgLy8gICAgIHN0YXR1cz1zZWxmLnN0YXR1cywKICAgIC8vICAgICB0b3RhbF91bml0cz1zZWxmLnRvdGFsX3VuaXRzLAogICAgLy8gICAgIHJlc2VydmVkX3VuaXRzX3RvdGFsPXNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwsCiAgICAvLyAgICAgaW5pdGlhbF9leGNoYW5nZV9hbW91bnQ9c2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCwKICAgIC8vICAgICBldmVudF9jdXJzb3I9c2VsZi5ldmVudF9jdXJzb3IsCiAgICAvLyAgICAgc2NoZWR1bGVfZW50cnlfY291bnQ9c2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwKICAgIC8vICAgICBvdXRzdGFuZGluZ19wcmluY2lwYWw9c2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZT1zZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICAvLyAgICAgbm9taW5hbF9pbnRlcmVzdF9yYXRlPXNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIGFjY3J1ZWRfaW50ZXJlc3Q9c2VsZi5hY2NydWVkX2ludGVyZXN0LAogICAgLy8gICAgIGN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXg9c2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4LAogICAgLy8gICAgIGN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4PXNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgsCiAgICAvLyAgICAgcmVzZXJ2ZWRfaW50ZXJlc3Q9c2VsZi5yZXNlcnZlZF9pbnRlcmVzdCwKICAgIC8vICAgICByZXNlcnZlZF9wcmluY2lwYWw9c2VsZi5yZXNlcnZlZF9wcmluY2lwYWwsCiAgICAvLyApCiAgICB1bmNvdmVyIDE0CiAgICBpdG9iCiAgICB1bmNvdmVyIDE0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMgogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDExCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA5CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgOAogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDcKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyODEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NgogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzIzCiAgICAvLyBpZiBzZWxmLmV2ZW50X2N1cnNvciA+PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICA+PQogICAgYnogY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMyNQogICAgLy8gZXZlbnRfaWQ9c2VsZi5ldmVudF9jdXJzb3IsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMjQtMTMzNAogICAgLy8gcmV0dXJuIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgIGV2ZW50X2lkPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgLy8gICAgIGV2ZW50X3R5cGU9YXJjNC5VSW50OCgwKSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1VSW50NjQoMCksCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1VSW50NjQoMCksCiAgICAvLyAgICAgZmxhZ3M9VUludDY0KDApLAogICAgLy8gKQogICAgaXRvYgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMyNgogICAgLy8gZXZlbnRfdHlwZT1hcmM0LlVJbnQ4KDApLAogICAgYnl0ZWMgNDAgLy8gMHgwMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMyNC0xMzM0CiAgICAvLyByZXR1cm4gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkoCiAgICAvLyAgICAgZXZlbnRfaWQ9c2VsZi5ldmVudF9jdXJzb3IsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1hcmM0LlVJbnQ4KDApLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPVVJbnQ2NCgwKSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249VUludDY0KDApLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPVVJbnQ2NCgwKSwKICAgIC8vICAgICBmbGFncz1VSW50NjQoMCksCiAgICAvLyApCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMjcKICAgIC8vIHNjaGVkdWxlZF90aW1lPVVJbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzI0LTEzMzQKICAgIC8vIHJldHVybiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1zZWxmLmV2ZW50X2N1cnNvciwKICAgIC8vICAgICBldmVudF90eXBlPWFyYzQuVUludDgoMCksCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9VUludDY0KDApLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9VUludDY0KDApLAogICAgLy8gICAgIGZsYWdzPVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAoKY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50QDQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzExCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzM1CiAgICAvLyByZXR1cm4gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KHNlbGYuZXZlbnRfY3Vyc29yKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiBjb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnRfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnRANAoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLmNvbnRyYWN0X3VwZGF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X3VwZGF0ZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTktMTYyCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gZ3JhbnRzIHRoZSB1cGRhdGUgcGVybWlzc2lvbnMgdG8gdGhlIEFycmFuZ2VyLgogICAgLy8gIyDimqDvuI8gV0FSTklORzogQXBwbGljYXRpb24gdXBkYXRlcyBtdXN0IGJlIGV4ZWN1dGVkIFZFUlkgY2FyZWZ1bGx5LCBhcyB0aGV5CiAgICAvLyAjIG1pZ2h0IGludHJvZHVjZSBicmVha2luZyBjaGFuZ2VzLgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19yb3RhdGVfYXJyYW5nZXJbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3JvdGF0ZV9hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTc4CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzkKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSBuZXdfYXJyYW5nZXIKICAgIGJ5dGVjIDE4IC8vIDB4NTIzYTQxNTI1MjIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4MAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTY0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3NldF9vcF9kYWVtb25bcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3NldF9vcF9kYWVtb246CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTgyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE5NgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTk3CiAgICAvLyBzZWxmLm9wX2RhZW1vbi52YWx1ZSA9IGFkZHJlc3MKICAgIGJ5dGVjIDI3IC8vIDB4NTIzYTRmNTA0NDIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE5OAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTgyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2Fzc2lnbl9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19hc3NpZ25fcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDE2CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLlJvbGVWYWxpZGl0eQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyMgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjIzCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNAogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgcHVzaGludCAyMAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTAzCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gcm9sZV9hZGRyZXNzCiAgICBieXRlYyAxOCAvLyAweDUyM2E0MTUyNTIyMwogICAgZGlnIDMKICAgIGFwcF9nbG9iYWxfcHV0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwNgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDQwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDcKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIzIC8vIDB4NTIzYTRkNGU0NzIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDgKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI1CiAgICAvLyBzZWxmLl9zZXRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIHZhbGlkaXR5KQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTAKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTEKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjIgLy8gMHg1MjNhNTA1OTQ0MjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMgogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNQogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE0CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpOgogICAgZHVwCiAgICBwdXNoaW50IDYwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTUKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyNiAvLyAweDUyM2E1NDUyNTMyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE2CiAgICAvLyBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjUKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExOAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMSAvLyAweDUyM2E0MTU1NTQyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIwCiAgICAvLyBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNQogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgODAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIzCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI1IC8vIDB4NTIzYTRkNGY0MzIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjQKICAgIC8vIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfcmV2b2tlX3JvbGVbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3Jldm9rZV9yb2xlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0NwogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjQ4CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0OQogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjcKICAgIC8vIGFzc2VydCByb2xlX2lkICE9IFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwgZXJyLklOVkFMSURfUk9MRQogICAgZHVwCiAgICBwdXNoaW50IDIwCiAgICAhPQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI4CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICBwdXNoaW50IDQwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjkKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjMgLy8gMHg1MjNhNGQ0ZTQ3MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMAogICAgLy8gZGVsIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTEKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzMKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMiAvLyAweDUyM2E1MDU5NDQyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM0CiAgICAvLyBkZWwgc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTAKICAgIC8vIHNlbGYuX2RlbGV0ZV9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcykKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM2CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpOgogICAgZHVwCiAgICBwdXNoaW50IDYwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzcKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI2IC8vIDB4NTIzYTU0NTI1MzIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzgKICAgIC8vIGRlbCBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjUwCiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDEKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hdXRob3JpdHksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjEgLy8gMHg1MjNhNDE1NTU0MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MgogICAgLy8gZGVsIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1MAogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDQKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDgwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI1IC8vIDB4NTIzYTRkNGY0MzIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDYKICAgIC8vIGRlbCBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19jb250cmFjdF9zdXNwZW5zaW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19jb250cmFjdF9zdXNwZW5zaW9uOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kICAjIFRPRE86IFVwZGF0ZSBzcGVjcyBhbmQgYWRkIHRlc3QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzcKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDIxIC8vIDB4NTIzYTQxNTU1NDIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjY5CiAgICAvLyBzZWxmLmFzc2V0X3N1c3BlbmRlZCA9IHN1c3BlbmRlZAogICAgYnl0ZWMgMzMgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjcwCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCAgIyBUT0RPOiBVcGRhdGUgc3BlY3MgYW5kIGFkZCB0ZXN0CiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYXJyYW5nZXJbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODMKICAgIC8vIHJldHVybiBzZWxmLmFycmFuZ2VyLnZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTggLy8gMHg1MjNhNDE1MjUyMjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcnJhbmdlciBleGlzdHMKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNzIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXNbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9hZGRyZXNzX3JvbGVzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDMKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDIzIC8vIDB4NTIzYTRkNGU0NzIzCiAgICBkaWcgMQogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDQKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYucHJpbWFyeV9kZWFsZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjIgLy8gMHg1MjNhNTA1OTQ0MjMKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwNQogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi50cnVzdGVlLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDI2IC8vIDB4NTIzYTU0NTI1MzIzCiAgICBkaWcgMwogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDYKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYXV0aG9yaXR5LCBhZGRyZXNzKSwKICAgIGJ5dGVjIDIxIC8vIDB4NTIzYTQxNTU1NDIzCiAgICBkaWcgNAogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDcKICAgIC8vIHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYub2JzZXJ2ZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjUgLy8gMHg1MjNhNGQ0ZjQzMjMKICAgIHVuY292ZXIgNQogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWMgNDAgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgNgogICAgc2V0Yml0CiAgICBpbnRjXzEgLy8gMQogICAgdW5jb3ZlciA1CiAgICBzZXRiaXQKICAgIHB1c2hpbnQgMgogICAgdW5jb3ZlciA0CiAgICBzZXRiaXQKICAgIHB1c2hpbnQgMwogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIHB1c2hpbnQgNAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5W3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfcm9sZV92YWxpZGl0eToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjgKICAgIC8vIHJvbGUgPSByb2xlX2lkLmFzX3VpbnQ2NCgpCiAgICBidG9pCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI5CiAgICAvLyBzZWxmLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlKQogICAgZHVwCiAgICBjYWxsc3ViIF9hc3NlcnRfdmFsaWRfcm9sZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMzMQogICAgLy8gY2FzZSBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUik6CiAgICBwdXNoaW50cyAyMCA0MCA1MCA2MCA3MCA4MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMzMC0zNjEKICAgIC8vIG1hdGNoIHJvbGU6CiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUik6CiAgICAvLyAgICAgICAgIHJldHVybiB0eXAuUm9sZVZhbGlkaXR5KAogICAgLy8gICAgICAgICAgICAgcm9sZV92YWxpZGl0eV9zdGFydD1VSW50NjQoMCksIHJvbGVfdmFsaWRpdHlfZW5kPVVJbnQ2NCgwKQogICAgLy8gICAgICAgICApCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLmFjY291bnRfbWFuYWdlciwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLnByaW1hcnlfZGVhbGVyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLmF1dGhvcml0eSwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLm9ic2VydmVyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIF86CiAgICAvLyAgICAgICAgIG9wLmVycihlcnIuSU5WQUxJRF9ST0xFKQogICAgdW5jb3ZlciA2CiAgICBtYXRjaCByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzBAMiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzFAMyByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzJANCByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzNANSByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzRANiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzVANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM2MQogICAgLy8gb3AuZXJyKGVyci5JTlZBTElEX1JPTEUpCiAgICBlcnIgLy8gSW52YWxpZCByb2xlIGlkZW50aWZpZXIKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM1NwogICAgLy8gc2VsZi5vYnNlcnZlciwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAyNSAvLyAweDUyM2E0ZDRmNDMyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM1Ni0zNTgKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLm9ic2VydmVyLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTkKICAgIC8vIHJldHVybiBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV80QDY6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzUyCiAgICAvLyBzZWxmLmF1dGhvcml0eSwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAyMSAvLyAweDUyM2E0MTU1NTQyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM1MS0zNTMKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLmF1dGhvcml0eSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzU0CiAgICAvLyByZXR1cm4gc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8zQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzQ3CiAgICAvLyBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMjYgLy8gMHg1MjNhNTQ1MjUzMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNDYtMzQ4CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNDkKICAgIC8vIHJldHVybiBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8yQDQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzQyCiAgICAvLyBzZWxmLnByaW1hcnlfZGVhbGVyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDIyIC8vIDB4NTIzYTUwNTk0NDIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzQxLTM0MwogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM0NAogICAgLy8gcmV0dXJuIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8xQDM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzM3CiAgICAvLyBzZWxmLmFjY291bnRfbWFuYWdlciwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAyMyAvLyAweDUyM2E0ZDRlNDcyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMzNi0zMzgKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLmFjY291bnRfbWFuYWdlciwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzM5CiAgICAvLyByZXR1cm4gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8wQDI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzMyLTMzNAogICAgLy8gcmV0dXJuIHR5cC5Sb2xlVmFsaWRpdHkoCiAgICAvLyAgICAgcm9sZV92YWxpZGl0eV9zdGFydD1VSW50NjQoMCksIHJvbGVfdmFsaWRpdHlfZW5kPVVJbnQ2NCgwKQogICAgLy8gKQogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQoaG9sZGluZ19hZGRyZXNzOiBieXRlcykgLT4gdm9pZDoKX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQ6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjYKICAgIC8vIGRlZiBfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChzZWxmLCBob2xkaW5nX2FkZHJlc3M6IEFjY291bnQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyOAogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQsIGVyci5TVVNQRU5ERUQKICAgIGJ5dGVjIDggLy8gMHg0MTIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHB1c2hpbnQgMzg0CiAgICBnZXRiaXQKICAgICEKICAgIGFzc2VydCAvLyBTdXNwZW5kZWQgb3BlcmF0aW9ucwogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuX3NldHRsZV9wb3NpdGlvbihob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB1aW50NjQsIHVpbnQ2NDoKX3NldHRsZV9wb3NpdGlvbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo0NAogICAgLy8gZGVmIF9zZXR0bGVfcG9zaXRpb24oc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50KSAtPiB0dXBsZVtVSW50NjQsIFVJbnQ2NF06CiAgICBwcm90byAxIDIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo2MQogICAgLy8gcG9zaXRpb24gPSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jb3B5KCkKICAgIGR1cAogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NjMtNjUKICAgIC8vICMgQ29tcHV0ZSB0aGUgaW5jcmVtZW50YWwgcGVyLXVuaXQgZml4ZWQtcG9pbnQgaW50ZXJlc3QgYW5kIHByaW5jaXBhbCBhY2NydWVkCiAgICAvLyAjIHNpbmNlIHRoaXMgYWNjb3VudCdzIGxhc3QgY2hlY2twb2ludC4KICAgIC8vIGludGVyZXN0X2RlbHRhID0gc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IC0gcG9zaXRpb24uaW50ZXJlc3RfY2hlY2twb2ludAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggZXhpc3RzCiAgICBkaWcgMQogICAgcHVzaGludCA1NwogICAgZXh0cmFjdF91aW50NjQKICAgIC0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo2NwogICAgLy8gc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCAtIHBvc2l0aW9uLnByaW5jaXBhbF9jaGVja3BvaW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTcgLy8gImN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IGV4aXN0cwogICAgZGlnIDIKICAgIHB1c2hpbnQgNjUKICAgIGV4dHJhY3RfdWludDY0CiAgICAtCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzMKICAgIC8vIGludGVyZXN0X2RlbHRhLCBwb3NpdGlvbi51bml0cywgc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgZGlnIDIKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3MC03NAogICAgLy8gIyBDb252ZXJ0IHRoZSBwZXItdW5pdCBmaXhlZC1wb2ludCBkZWx0YXMgaW50byBhYnNvbHV0ZSBjbGFpbWFibGUgYW1vdW50cwogICAgLy8gIyB1c2luZyB0aGUgYWNjb3VudCdzIGFjdGl2ZSB1bml0cy4KICAgIC8vIGNsYWltYWJsZV9pbnRlcmVzdCA9IHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIGludGVyZXN0X2RlbHRhLCBwb3NpdGlvbi51bml0cywgc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgLy8gKQogICAgdW5jb3ZlciAzCiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojc2CiAgICAvLyBwcmluY2lwYWxfZGVsdGEsIHBvc2l0aW9uLnVuaXRzLCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzUtNzcKICAgIC8vIGNsYWltYWJsZV9wcmluY2lwYWwgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBwcmluY2lwYWxfZGVsdGEsIHBvc2l0aW9uLnVuaXRzLCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICAvLyApCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojc5LTgxCiAgICAvLyAjIEFjY3J1ZSB0aGUgY2xhaW1hYmxlIGFtb3VudHMgdG8gdGhlIGFjY291bnQgcG9zaXRpb24gYW5kIG1ha2UgdGhlbSBhdmFpbGFibGUKICAgIC8vICMgZm9yIHdpdGhkcmF3YWwuCiAgICAvLyBwb3NpdGlvbi5jbGFpbWFibGVfaW50ZXJlc3QgKz0gY2xhaW1hYmxlX2ludGVyZXN0CiAgICBkaWcgMgogICAgcHVzaGludCA3MwogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICArCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIHN3YXAKICAgIHJlcGxhY2UyIDczCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6ODIKICAgIC8vIHBvc2l0aW9uLmNsYWltYWJsZV9wcmluY2lwYWwgKz0gY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgZHVwCiAgICBwdXNoaW50IDgxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDIKICAgICsKICAgIGl0b2IKICAgIHJlcGxhY2UyIDgxCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6ODQtODYKICAgIC8vICMgQWR2YW5jZSB0aGUgYWNjb3VudCdzIHBlci11bml0IGZpeGVkLXBvaW50IGNoZWNrcG9pbnRzIHRvIHRoZSBjdXJyZW50IGdsb2JhbAogICAgLy8gIyBwZXItdW5pdCBmaXhlZC1wb2ludCBnbG9iYWwgaW5kaWNlcy4KICAgIC8vIHBvc2l0aW9uLmludGVyZXN0X2NoZWNrcG9pbnQgPSBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IGV4aXN0cwogICAgaXRvYgogICAgcmVwbGFjZTIgNTcKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo4NwogICAgLy8gcG9zaXRpb24ucHJpbmNpcGFsX2NoZWNrcG9pbnQgPSBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTcgLy8gImN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IGV4aXN0cwogICAgaXRvYgogICAgcmVwbGFjZTIgNjUKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo4OS05MAogICAgLy8gIyBBZHZhbmNlIHRoZSBhY2NvdW50J3MgZXZlbnQgY3Vyc29yIHRvIHRoZSBjdXJyZW50IGdsb2JhbCBldmVudCBjdXJzb3IuCiAgICAvLyBwb3NpdGlvbi5zZXR0bGVkX2N1cnNvciA9IHNlbGYuZXZlbnRfY3Vyc29yCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGl0b2IKICAgIHJlcGxhY2UyIDQ5CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6OTItOTQKICAgIC8vICMgVXBkYXRlIHRoZSBhY2NvdW50IHBvc2l0aW9uIGFuZCByZXR1cm4gdGhlIG5ld2x5IGFjY3J1ZWQgY2xhaW1hYmxlIGFtb3VudHMKICAgIC8vICMgYWRkZWQgdG8gdGhlIHRvdGFsIHBvc2l0aW9uJ3MgY2xhaW1hYmxlIGFtb3VudHMuCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHBvc2l0aW9uLmNvcHkoKQogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6OTUKICAgIC8vIHJldHVybiBjbGFpbWFibGVfaW50ZXJlc3QsIGNsYWltYWJsZV9wcmluY2lwYWwKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IHZvaWQ6Cl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojk3CiAgICAvLyBkZWYgX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQoc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDggLy8gMHg0MTIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzgKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwMAogICAgLy8gaWYgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCk6CiAgICBieiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZF9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDEKICAgIC8vIHJldHVybgogICAgcmV0c3ViCgpfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZF9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTAzCiAgICAvLyBwb3NpdGlvbiA9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNvcHkoKQogICAgZnJhbWVfZGlnIDIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwNAogICAgLy8gaWYgcG9zaXRpb24ucmVzZXJ2ZWRfdW5pdHMgPT0gVUludDY0KDApOgogICAgcHVzaGludCA0MAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICBibnogX2Vuc3VyZV91bml0c19hY3RpdmF0ZWRfYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA1CiAgICAvLyByZXR1cm4KICAgIHJldHN1YgoKX2Vuc3VyZV91bml0c19hY3RpdmF0ZWRfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwOAogICAgLy8gcG9zaXRpb24udW5pdHMgKz0gYWN0aXZhdGVkX3VuaXRzCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAzCiAgICArCiAgICBpdG9iCiAgICByZXBsYWNlMiAzMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwOQogICAgLy8gcG9zaXRpb24ucmVzZXJ2ZWRfdW5pdHMgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBpdG9iCiAgICByZXBsYWNlMiA0MAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExMAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSBwb3NpdGlvbi5jb3B5KCkKICAgIGZyYW1lX2RpZyAyCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTExCiAgICAvLyBhc3NlcnQgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCA+PSBhY3RpdmF0ZWRfdW5pdHMsIGVyci5PVkVSX0RJU1RSSUJVVElPTgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCBleGlzdHMKICAgIGR1cAogICAgZGlnIDIKICAgID49CiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IHJlbWFpbmluZyBELUFTQSB1bml0cwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExMgogICAgLy8gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCAtPSBhY3RpdmF0ZWRfdW5pdHMKICAgIHN3YXAKICAgIC0KICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fc2NhbGVkX211bF9kaXYobXVsdGlwbGljYW5kOiB1aW50NjQsIG11bHRpcGxpZXI6IHVpbnQ2NCwgZGl2aXNvcjogdWludDY0KSAtPiB1aW50NjQ6Cl9zY2FsZWRfbXVsX2RpdjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE1Ni0xNTgKICAgIC8vIGRlZiBfc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgc2VsZiwgbXVsdGlwbGljYW5kOiBVSW50NjQsIG11bHRpcGxpZXI6IFVJbnQ2NCwgZGl2aXNvcjogVUludDY0CiAgICAvLyApIC0+IFVJbnQ2NDoKICAgIHByb3RvIDMgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTYwCiAgICAvLyBpZiBtdWx0aXBsaWNhbmQgPT0gVUludDY0KDApIG9yIG11bHRpcGxpZXIgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0zCiAgICBieiBfc2NhbGVkX211bF9kaXZfaWZfYm9keUAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGJueiBfc2NhbGVkX211bF9kaXZfYWZ0ZXJfaWZfZWxzZUAzCgpfc2NhbGVkX211bF9kaXZfaWZfYm9keUAyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTYxCiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfc2NhbGVkX211bF9kaXZfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTYyCiAgICAvLyBoaWdoLCBsb3cgPSBvcC5tdWx3KG11bHRpcGxpY2FuZCwgbXVsdGlwbGllcikKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0yCiAgICBtdWx3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjMKICAgIC8vIHJldHVybiBvcC5kaXZ3KGhpZ2gsIGxvdywgZGl2aXNvcikKICAgIGZyYW1lX2RpZyAtMQogICAgZGl2dwogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Ftb3VudF90b19pbmRleF9kZWx0YShhbW91bnQ6IHVpbnQ2NCkgLT4gdWludDY0OgpfYW1vdW50X3RvX2luZGV4X2RlbHRhOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTY1CiAgICAvLyBkZWYgX2Ftb3VudF90b19pbmRleF9kZWx0YShzZWxmLCBhbW91bnQ6IFVJbnQ2NCkgLT4gVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjcKICAgIC8vIGlmIGFtb3VudCA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGJueiBfYW1vdW50X3RvX2luZGV4X2RlbHRhX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTY4CiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfYW1vdW50X3RvX2luZGV4X2RlbHRhX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2OQogICAgLy8gYXNzZXJ0IHNlbGYudG90YWxfdW5pdHMgPiBVSW50NjQoMCksIGVyci5OT19VTklUUwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIGR1cAogICAgYXNzZXJ0IC8vIE5vIEQtQVNBIHVuaXRzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNzAKICAgIC8vIHJldHVybiBzZWxmLl9zY2FsZWRfbXVsX2RpdihhbW91bnQsIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsIHNlbGYudG90YWxfdW5pdHMpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9pbmRleF9kZWx0YV90b19hbW91bnQoaW5kZXhfZGVsdGE6IHVpbnQ2NCkgLT4gdWludDY0OgpfaW5kZXhfZGVsdGFfdG9fYW1vdW50OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTcyCiAgICAvLyBkZWYgX2luZGV4X2RlbHRhX3RvX2Ftb3VudChzZWxmLCBpbmRleF9kZWx0YTogVUludDY0KSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE3OQogICAgLy8gaWYgaW5kZXhfZGVsdGEgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0xCiAgICBibnogX2luZGV4X2RlbHRhX3RvX2Ftb3VudF9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE4MAogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKX2luZGV4X2RlbHRhX3RvX2Ftb3VudF9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxODIKICAgIC8vIHNlbGYudG90YWxfdW5pdHMsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTg0CiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTgxLTE4NQogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIHNlbGYudG90YWxfdW5pdHMsCiAgICAvLyAgICAgaW5kZXhfZGVsdGEsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9nZXRfc2NoZWR1bGVfZW50cnkoZXZlbnRfaWQ6IHVpbnQ2NCkgLT4gYnl0ZXM6Cl9nZXRfc2NoZWR1bGVfZW50cnk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMDUKICAgIC8vIGRlZiBfZ2V0X3NjaGVkdWxlX2VudHJ5KHNlbGYsIGV2ZW50X2lkOiBVSW50NjQpIC0+IHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5OgogICAgcHJvdG8gMSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMDcKICAgIC8vIGFzc2VydCBldmVudF9pZCA8IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQsIGVyci5JTlZBTElEX0VWRU5UX0lECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgID4KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxOTMKICAgIC8vIHJldHVybiBldmVudF9pZCAvLyBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAxNgogICAgLwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjA5CiAgICAvLyBhc3NlcnQgcGFnZV9pbmRleCBpbiBzZWxmLnNjaGVkdWxlX3BhZ2UsIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGl0b2IKICAgIGJ5dGVjIDI0IC8vIDB4NTMyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTk3CiAgICAvLyByZXR1cm4gZXZlbnRfaWQgJSBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAxNgogICAgJQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjEyCiAgICAvLyBhc3NlcnQgb2Zmc2V0IDwgcGFnZS5sZW5ndGgsIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGludCAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZGlnIDEKICAgID4KICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIxMwogICAgLy8gcmV0dXJuIHBhZ2Vbb2Zmc2V0XS5jb3B5KCkKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgMgogICAgKwogICAgcHVzaGludCA2NQogICAgYm94X2V4dHJhY3QKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZShjb250cmFjdF90eXBlOiB1aW50NjQsIGV2ZW50X3R5cGU6IHVpbnQ2NCkgLT4gdm9pZDoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE2LTMxOAogICAgLy8gZGVmIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBzZWxmLCBjb250cmFjdF90eXBlOiBVSW50NjQsIGV2ZW50X3R5cGU6IFVJbnQ2NAogICAgLy8gKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTctMjU4CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjUwCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lFRCksCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU3LTI1OAogICAgLy8gIyBDaGVjayBjb21tb24gZXZlbnRzIGZpcnN0CiAgICAvLyBpZiBldmVudF90eXBlIGluIGNvbW1vbl9ldmVudHM6CiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjUxCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQKSwKICAgIGludGNfMiAvLyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTctMjU4CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTIKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfTUQpLAogICAgcHVzaGludCAxOQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU3LTI1OAogICAgLy8gIyBDaGVjayBjb21tb24gZXZlbnRzIGZpcnN0CiAgICAvLyBpZiBldmVudF90eXBlIGluIGNvbW1vbl9ldmVudHM6CiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjUzCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIHB1c2hpbnQgMTIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1Ny0yNTgKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1NAogICAgLy8gVUludDY0KGVudW1zLkVWVF9SUkYpLAogICAgcHVzaGludCAxMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU3LTI1OAogICAgLy8gIyBDaGVjayBjb21tb24gZXZlbnRzIGZpcnN0CiAgICAvLyBpZiBldmVudF90eXBlIGluIGNvbW1vbl9ldmVudHM6CiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VANwoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1OQogICAgLy8gcmV0dXJuIFRydWUKICAgIGludGNfMSAvLyAxCgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMyMC0zMjIKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgcmV0c3ViCgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjYxLTI2MgogICAgLy8gIyBDb250cmFjdC1zcGVjaWZpYyBhZGRpdGlvbmFsIGV2ZW50cwogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfUEFNKToKICAgIGZyYW1lX2RpZyAtMgogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2My0yNjQKICAgIC8vICMgUEFNIG9ubHkgc3VwcG9ydHMgY29tbW9uIGV2ZW50cwogICAgLy8gcmV0dXJuIEZhbHNlCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzIwLTMyMgogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjY2CiAgICAvLyBpZiBjb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9MQU0pIG9yIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDMKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNjYtMjY4CiAgICAvLyBpZiBjb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9MQU0pIG9yIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KAogICAgLy8gICAgIGVudW1zLkNUX05BTQogICAgLy8gKToKICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUAxMQogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDIKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAxNgoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlAMTE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNjktMjczCiAgICAvLyAjIExBTS9OQU0gYWRkOiBQUiwgSVBDQgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3MQogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUiksCiAgICBwdXNoaW50IDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2OS0yNzMKICAgIC8vICMgTEFNL05BTSBhZGQ6IFBSLCBJUENCCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAxMwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzIKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICBwdXNoaW50IDE4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNjktMjczCiAgICAvLyAjIExBTS9OQU0gYWRkOiBQUiwgSVBDQgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyApCiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMTQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMTM6CiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzIwLTMyMgogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF9mYWxzZUAxNDoKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMjAtMzIyCiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDE2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjc1CiAgICAvLyBpZiBjb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pOgogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDIzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzYtMjgxCiAgICAvLyAjIEFOTiBhZGRzOiBQUiwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3OAogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUiksCiAgICBwdXNoaW50IDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3Ni0yODEKICAgIC8vICMgQU5OIGFkZHM6IFBSLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyMAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzkKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICBwdXNoaW50IDE4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzYtMjgxCiAgICAvLyAjIEFOTiBhZGRzOiBQUiwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjAKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjgwCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICBwdXNoaW50IDUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3Ni0yODEKICAgIC8vICMgQU5OIGFkZHM6IFBSLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF9mYWxzZUAyMQoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyMDoKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMjAtMzIyCiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDIxOgogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMyMC0zMjIKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMjM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODMKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0xBWCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDMxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODQtMjkwCiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODYKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgcHVzaGludCAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODQtMjkwCiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDI4CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4NwogICAgLy8gVUludDY0KGVudW1zLkVWVF9QSSksCiAgICBwdXNoaW50IDQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4NC0yOTAKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjgKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjg4CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgcHVzaGludCAxOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjg0LTI5MAogICAgLy8gIyBMQVggYWRkczogUFIsIFBJLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyOAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODkKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIHB1c2hpbnQgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjg0LTI5MAogICAgLy8gIyBMQVggYWRkczogUFIsIFBJLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF9mYWxzZUAyOQoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyODoKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMjAtMzIyCiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDI5OgogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMyMC0zMjIKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMzE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyOTIKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0NMTSk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDMzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyOTMtMjk0CiAgICAvLyAjIENMTSBhZGRzOiBQUgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QUikKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAzCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzIwLTMyMgogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAzMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI5NgogICAgLy8gcmV0dXJuIEZhbHNlCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzIwLTMyMgogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2lzX2R5bmFtaWNfYW5udWl0eSgpIC0+IHVpbnQ2NDoKX2lzX2R5bmFtaWNfYW5udWl0eToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMzOAogICAgLy8gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM4LTMzOQogICAgLy8gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICAvLyBhbmQgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBieiBfaXNfZHluYW1pY19hbm51aXR5X2Jvb2xfZmFsc2VAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM5CiAgICAvLyBhbmQgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzQgLy8gImR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMzOC0zMzkKICAgIC8vIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKQogICAgLy8gYW5kIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgYnogX2lzX2R5bmFtaWNfYW5udWl0eV9ib29sX2ZhbHNlQDMKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzctMzQwCiAgICAvLyByZXR1cm4gKAogICAgLy8gICAgIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKQogICAgLy8gICAgIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIC8vICkKICAgIHJldHN1YgoKX2lzX2R5bmFtaWNfYW5udWl0eV9ib29sX2ZhbHNlQDM6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM3LTM0MAogICAgLy8gcmV0dXJuICgKICAgIC8vICAgICBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIC8vICAgICBhbmQgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICAvLyApCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfaW50ZXJlc3Rfc2VnbWVudChlbnRyeTogYnl0ZXMpIC0+IHVpbnQ2NCwgYnl0ZXM6Cl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzgzCiAgICAvLyBkZWYgX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoc2VsZiwgZW50cnk6IHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5MgogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMTcKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5Mi0zOTQKICAgIC8vIGVudHJ5LmFjY3J1YWxfZmFjdG9yID09IFVJbnQ2NCgwKQogICAgLy8gb3Igc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPT0gVUludDY0KDApCiAgICBieiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudF9pZl9ib2R5QDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5MwogICAgLy8gb3Igc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPT0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5Mi0zOTQKICAgIC8vIGVudHJ5LmFjY3J1YWxfZmFjdG9yID09IFVJbnQ2NCgwKQogICAgLy8gb3Igc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPT0gVUludDY0KDApCiAgICBieiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudF9pZl9ib2R5QDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NAogICAgLy8gb3Igc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID09IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5Mi0zOTQKICAgIC8vIGVudHJ5LmFjY3J1YWxfZmFjdG9yID09IFVJbnQ2NCgwKQogICAgLy8gb3Igc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPT0gVUludDY0KDApCiAgICBibnogX2VudHJ5X2ludGVyZXN0X3NlZ21lbnRfYWZ0ZXJfaWZfZWxzZUA0CgpfZW50cnlfaW50ZXJlc3Rfc2VnbWVudF9pZl9ib2R5QDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozOTYKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9kaWcgLTEKICAgIHVuY292ZXIgMgogICAgcmV0c3ViCgpfZW50cnlfaW50ZXJlc3Rfc2VnbWVudF9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozOTgKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozOTkKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MDAKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozOTctNDAxCiAgICAvLyBhY2NydWVkID0gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlLAogICAgLy8gICAgIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICAvLyApCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDA1CiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDAyLTQwNgogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIGFjY3J1ZWQsCiAgICAvLyAgICAgZW50cnkuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgZnJhbWVfZGlnIC0xCiAgICB1bmNvdmVyIDIKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcihkaXNjb3VudF9mYWN0b3I6IHVpbnQ2NCwgcmVkZW1wdGlvbl9mYWN0b3I6IHVpbnQ2NCkgLT4gdWludDY0OgpfZGlzY291bnRfYW5udWl0eV9mYWN0b3I6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NjUtNDY5CiAgICAvLyBkZWYgX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yKAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgZGlzY291bnRfZmFjdG9yOiBVSW50NjQsCiAgICAvLyAgICAgcmVkZW1wdGlvbl9mYWN0b3I6IFVJbnQ2NCwKICAgIC8vICkgLT4gVUludDY0OgogICAgcHJvdG8gMiAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzEKICAgIC8vIGlmIHJlZGVtcHRpb25fZmFjdG9yID09IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMQogICAgYm56IF9kaXNjb3VudF9hbm51aXR5X2ZhY3Rvcl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3MgogICAgLy8gcmV0dXJuIGRpc2NvdW50X2ZhY3RvcgogICAgZnJhbWVfZGlnIC0yCiAgICByZXRzdWIKCl9kaXNjb3VudF9hbm51aXR5X2ZhY3Rvcl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzMKICAgIC8vIHBlcmlvZF9yYXRlID0gc2VsZi5maXhlZF9wb2ludF9zY2FsZSArIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDc0CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDczLTQ3NwogICAgLy8gcGVyaW9kX3JhdGUgPSBzZWxmLmZpeGVkX3BvaW50X3NjYWxlICsgc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgcmVkZW1wdGlvbl9mYWN0b3IsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgZGlnIDIKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICArCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzgKICAgIC8vIGFzc2VydCBwZXJpb2RfcmF0ZSA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBkdXAKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ4MQogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3OS00ODMKICAgIC8vIHJldHVybiBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBkaXNjb3VudF9mYWN0b3IsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICAgICBwZXJpb2RfcmF0ZSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5KGVudHJ5OiBieXRlcywgcGF5bG9hZDogYnl0ZXMpIC0+IGJ5dGVzLCBieXRlczoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjE2LTYxOAogICAgLy8gZGVmIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeSgKICAgIC8vICAgICBzZWxmLCBlbnRyeTogdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnksIHBheWxvYWQ6IHR5cC5PYnNlcnZlZEV2ZW50UmVxdWVzdAogICAgLy8gKSAtPiBOb25lOgogICAgcHJvdG8gMiAyCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYyNgogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X2lkID09IHNlbGYuZXZlbnRfY3Vyc29yLCBlcnIuSU5WQUxJRF9FVkVOVF9DVVJTT1IKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBjdXJzb3IKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYyNwogICAgLy8gYXNzZXJ0IGVudHJ5LnNjaGVkdWxlZF90aW1lIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLCBlcnIuTk9fRFVFX0NBU0hGTE9XCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIDw9CiAgICBhc3NlcnQgLy8gTm8gZHVlIGNhc2hmbG93IHRvIHBheQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjI5CiAgICAvLyBldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzAKICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9JRUQpOgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBkdXAKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzOAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzEtNjMzCiAgICAvLyAjIElFRCBmaW5hbGl6ZXMgaXNzdWFuY2U6IHJlc2VydmVkIHVuaXRzIGJlY29tZSBhY3RpdmF0YWJsZSBhbmQgdGhlCiAgICAvLyAjIHNjaGVkdWxlJ3MgaW5pdGlhbCBjb250cmFjdHVhbCBzdGF0ZSBiZWNvbWVzIGxpdmUuCiAgICAvLyBhc3NlcnQgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM1CiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID09IHNlbGYudG90YWxfdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYzNC02MzYKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCA9PSBzZWxmLnRvdGFsX3VuaXRzCiAgICAvLyApLCBlcnIuUFJJTUFSWV9ESVNUUklCVVRJT05fSU5DT01QTEVURQogICAgYXNzZXJ0IC8vIFByaW1hcnkgZGlzdHJpYnV0aW9uIGlzIG5vdCBjb21wbGV0ZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM3CiAgICAvLyBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9IGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYzOAogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM5CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IGVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjQwCiAgICAvLyBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0MQogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gZW50cnkubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDQxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjQyCiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NDMKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGVudW1zLlNUQVRVU19BQ1RJVkUpCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBwdXNoaW50IDEwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ1NAogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkgPT0gVUludDY0KGVudW1zLkVWVF9JRUQpLCBlcnIuTk9UX0VWVF9JRUQKICAgIGZyYW1lX2RpZyAxMQogICAgYXNzZXJ0IC8vIE5vdCBJRUQgZXZlbnQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ1NQogICAgLy8gcmV0dXJuIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMCAvLyAiaW5pdGlhbF9leGNoYW5nZV9hbW91bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NDQtNjQ4CiAgICAvLyBzZWxmLl9lbWl0X2V4ZWN1dGlvbl9ldmVudCgKICAgIC8vICAgICBlbnRyeT1lbnRyeSwKICAgIC8vICAgICBwYXlvZmY9c2VsZi5fZW50cnlfaWVkX2Ftb3VudChlbnRyeSksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NDcKICAgIC8vIHNldHRsZWRfYW1vdW50PVVJbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NDQtNjQ4CiAgICAvLyBzZWxmLl9lbWl0X2V4ZWN1dGlvbl9ldmVudCgKICAgIC8vICAgICBlbnRyeT1lbnRyeSwKICAgIC8vICAgICBwYXlvZmY9c2VsZi5fZW50cnlfaWVkX2Ftb3VudChlbnRyeSksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgY2FsbHN1YiBfZW1pdF9leGVjdXRpb25fZXZlbnQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAtMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjQ5CiAgICAvLyByZXR1cm4KICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfYnVyeSAxCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzOAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTAKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NTIKICAgIC8vIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCArPSBzZWxmLl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KGVudHJ5KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudAogICAgZnJhbWVfYnVyeSAtMgogICAgKwogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NTQKICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9SUik6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgMTIKICAgID09CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDEwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NTgKICAgIC8vIHBheWxvYWQub2JzZXJ2ZWRfcmF0ZSwKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAzMwogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1OQogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzYgLy8gInJhdGVfcmVzZXRfbXVsdGlwbGllciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjAKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NTUtNjYxCiAgICAvLyAjIFJSIGRlcml2ZXMgdGhlIG5leHQgcmF0ZSBmcm9tIGFuIG9ic2VydmVkIG9yYWNsZSB2YWx1ZSBwbHVzIHRoZQogICAgLy8gIyBjb250cmFjdCBzcHJlYWQgLyBtdWx0aXBsaWVyIHRlcm1zLCB0aGVuIGVuZm9yY2VzIGZsb29yIGFuZCBjYXAuCiAgICAvLyBvYnNlcnZlZF9yYXRlID0gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgcGF5bG9hZC5vYnNlcnZlZF9yYXRlLAogICAgLy8gICAgIHNlbGYucmF0ZV9yZXNldF9tdWx0aXBsaWVyLAogICAgLy8gICAgIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICAvLyApCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjYzCiAgICAvLyBvYnNlcnZlZF9yYXRlICsgc2VsZi5yYXRlX3Jlc2V0X3NwcmVhZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDM1IC8vICJyYXRlX3Jlc2V0X3NwcmVhZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X3NwcmVhZCBleGlzdHMKICAgICsKICAgIGZyYW1lX2J1cnkgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzQ0CiAgICAvLyBpZiBzZWxmLmhhc19yYXRlX3Jlc2V0X2Zsb29yIGFuZCByYXRlIDwgc2VsZi5yYXRlX3Jlc2V0X2Zsb29yOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDM4IC8vICJoYXNfcmF0ZV9yZXNldF9mbG9vciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5oYXNfcmF0ZV9yZXNldF9mbG9vciBleGlzdHMKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU1CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzEgLy8gInJhdGVfcmVzZXRfZmxvb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9mbG9vciBleGlzdHMKICAgIGZyYW1lX2RpZyA2CiAgICA+CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1NQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzQ1CiAgICAvLyByYXRlID0gc2VsZi5yYXRlX3Jlc2V0X2Zsb29yCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzEgLy8gInJhdGVfcmVzZXRfZmxvb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSA2CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X2Zsb29yIGV4aXN0cwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDYKICAgIC8vIGlmIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwIGFuZCByYXRlID4gc2VsZi5yYXRlX3Jlc2V0X2NhcDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzOSAvLyAiaGFzX3JhdGVfcmVzZXRfY2FwIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmhhc19yYXRlX3Jlc2V0X2NhcCBleGlzdHMKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU4CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzIgLy8gInJhdGVfcmVzZXRfY2FwIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfY2FwIGV4aXN0cwogICAgZnJhbWVfZGlnIDYKICAgIDwKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDcKICAgIC8vIHJhdGUgPSBzZWxmLnJhdGVfcmVzZXRfY2FwCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzIgLy8gInJhdGVfcmVzZXRfY2FwIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgNgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9jYXAgZXhpc3RzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1ODoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2MgogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPSBzZWxmLl9jbGFtcF9yYXRlKAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjYyLTY2NAogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPSBzZWxmLl9jbGFtcF9yYXRlKAogICAgLy8gICAgIG9ic2VydmVkX3JhdGUgKyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkCiAgICAvLyApCiAgICBmcmFtZV9kaWcgNgogICAgYXBwX2dsb2JhbF9wdXQKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc0CiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUEkpOgogICAgZnJhbWVfZGlnIDEwCiAgICBwdXNoaW50IDQKICAgID09CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDIwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzUKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc2CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAyMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4MQogICAgLy8gaWYgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCk6CiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMjkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4MgogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1BSRik6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgNQogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDMwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODYKICAgIC8vICsgKHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgLSBzZWxmLmV2ZW50X2N1cnNvcikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njg3CiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfUEVSX0VOVFJZX0JVREdFVCkKICAgIHB1c2hpbnQgMTAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODYtNjg3CiAgICAvLyArIChzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IC0gc2VsZi5ldmVudF9jdXJzb3IpCiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfUEVSX0VOVFJZX0JVREdFVCkKICAgICoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4NQogICAgLy8gVUludDY0KGNzdC5PUF9VUF9OT05fQ0FTSF9CQVNFX0JVREdFVCkKICAgIGludGMgNCAvLyAxNTAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODUtNjg3CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX05PTl9DQVNIX0JBU0VfQlVER0VUKQogICAgLy8gKyAoc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCAtIHNlbGYuZXZlbnRfY3Vyc29yKQogICAgLy8gKiBVSW50NjQoY3N0Lk9QX1VQX05PTl9DQVNIX1BFUl9FTlRSWV9CVURHRVQpCiAgICArCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODMtNjg5CiAgICAvLyBlbnN1cmVfYnVkZ2V0KAogICAgLy8gICAgIHJlcXVpcmVkX2J1ZGdldD0oCiAgICAvLyAgICAgICAgIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfQkFTRV9CVURHRVQpCiAgICAvLyAgICAgICAgICsgKHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgLSBzZWxmLmV2ZW50X2N1cnNvcikKICAgIC8vICAgICAgICAgKiBVSW50NjQoY3N0Lk9QX1VQX05PTl9DQVNIX1BFUl9FTlRSWV9CVURHRVQpCiAgICAvLyAgICAgKSwKICAgIC8vICkKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5MwogICAgLy8gZGlzY291bnRfZmFjdG9yID0gc2VsZi5maXhlZF9wb2ludF9zY2FsZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0OTQKICAgIC8vIGRlbm9taW5hdG9yID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0OTUKICAgIC8vIHNraXBfZmlyc3RfcmVkZW1wdGlvbiA9IEZhbHNlCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSA3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0OTcKICAgIC8vIGlmIGVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IgPiBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMjUKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgOAogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMzUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5OC01MDIKICAgIC8vICMgQW4gaW5pdGlhbCBQUkYgbWF5IGRlc2NyaWJlIHRoZSBmaXJzdCByZWRlbXB0aW9uIHBlcmlvZCBkaXJlY3RseS4KICAgIC8vIGRpc2NvdW50X2ZhY3RvciA9IHNlbGYuX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yKAogICAgLy8gICAgIGRpc2NvdW50X2ZhY3RvciwKICAgIC8vICAgICBlbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyA4CiAgICBjYWxsc3ViIF9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwNAogICAgLy8gc2tpcF9maXJzdF9yZWRlbXB0aW9uID0gVHJ1ZQogICAgaW50Y18xIC8vIDEKICAgIGZyYW1lX2J1cnkgNwogICAgZnJhbWVfYnVyeSAxCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAzNToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwNgogICAgLy8gZnV0dXJlX2V2ZW50X2lkID0gc2VsZi5ldmVudF9jdXJzb3IgKyBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X3doaWxlX3RvcEAzNjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwNwogICAgLy8gd2hpbGUgZnV0dXJlX2V2ZW50X2lkIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGZyYW1lX2RpZyAzCiAgICA+CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfd2hpbGVANDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwOAogICAgLy8gZnV0dXJlX2VudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KGZ1dHVyZV9ldmVudF9pZCkKICAgIGZyYW1lX2RpZyAzCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MDkKICAgIC8vIGZ1dHVyZV9ldmVudF90eXBlID0gZnV0dXJlX2VudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTEwLTUxMQogICAgLy8gIyBPbmx5IHJlZGVtcHRpb24tYmVhcmluZyBldmVudHMgY29udHJpYnV0ZSB0byB0aGUgYW5udWl0eSBkZW5vbWluYXRvci4KICAgIC8vIGlzX3JlZGVtcHRpb25fZXZlbnQgPSBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1BSKSBvciAoCiAgICBwdXNoaW50IDMKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTAtNTE0CiAgICAvLyAjIE9ubHkgcmVkZW1wdGlvbi1iZWFyaW5nIGV2ZW50cyBjb250cmlidXRlIHRvIHRoZSBhbm51aXR5IGRlbm9taW5hdG9yLgogICAgLy8gaXNfcmVkZW1wdGlvbl9ldmVudCA9IGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpIG9yICgKICAgIC8vICAgICBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgLy8gICAgIGFuZCBmdXR1cmVfZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKQogICAgLy8gKQogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX3RydWVANDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUxMgogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCkKICAgIGZyYW1lX2RpZyA0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTEyLTUxMwogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCkKICAgIC8vIGFuZCBmdXR1cmVfZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUxMwogICAgLy8gYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICBmcmFtZV9kaWcgMAogICAgcHVzaGludCAyNQogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUxMi01MTMKICAgIC8vIGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfTUQpCiAgICAvLyBhbmQgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IgPiBVSW50NjQoMCkKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX2ZhbHNlQDQxCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF90cnVlQDQwOgogICAgaW50Y18xIC8vIDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX21lcmdlQDQyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTE1CiAgICAvLyBpZiBpc19yZWRlbXB0aW9uX2V2ZW50OgogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANDcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUxNgogICAgLy8gaWYgc2tpcF9maXJzdF9yZWRlbXB0aW9uOgogICAgZnJhbWVfZGlnIDcKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlANDUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUxNwogICAgLy8gc2tpcF9maXJzdF9yZWRlbXB0aW9uID0gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDcKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDQ3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTI0CiAgICAvLyBmdXR1cmVfZXZlbnRfaWQgKz0gVUludDY0KDEpCiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMwogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfd2hpbGVfdG9wQDM2CgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDQ1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTIxCiAgICAvLyBmdXR1cmVfZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIGZyYW1lX2RpZyAwCiAgICBwdXNoaW50IDI1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTE5LTUyMgogICAgLy8gZGlzY291bnRfZmFjdG9yID0gc2VsZi5fZGlzY291bnRfYW5udWl0eV9mYWN0b3IoCiAgICAvLyAgICAgZGlzY291bnRfZmFjdG9yLAogICAgLy8gICAgIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDIKICAgIHN3YXAKICAgIGNhbGxzdWIgX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTIzCiAgICAvLyBkZW5vbWluYXRvciArPSBkaXNjb3VudF9mYWN0b3IKICAgIGZyYW1lX2RpZyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANDcKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX2ZhbHNlQDQxOgogICAgaW50Y18wIC8vIDAKICAgIGIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfbWVyZ2VANDIKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl93aGlsZUA0ODoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUyNgogICAgLy8gYXNzZXJ0IGRlbm9taW5hdG9yID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGZyYW1lX2RpZyAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjcKICAgIC8vIG51bWVyYXRvciA9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUyOAogICAgLy8gaWYgZW50cnkuZmxhZ3MgJiBVSW50NjQoZW51bXMuRkxBR19JTklUSUFMX1BSRikgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDU3CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18yIC8vIDgKICAgICYKICAgIGJueiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1MAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTI5LTUzMAogICAgLy8gIyBTdWJzZXF1ZW50IFBSRiBldmVudHMgYW1vcnRpemUgYm90aCBwcmluY2lwYWwgYW5kIGFscmVhZHkgYWNjcnVlZCBjYXJyeS4KICAgIC8vIG51bWVyYXRvciArPSBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICArCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1MDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUzMwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUzMS01MzUKICAgIC8vIHJldHVybiBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBudW1lcmF0b3IsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICAgICBkZW5vbWluYXRvciwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAxCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjkwCiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBzZWxmLl9yZWNhbGN1bGF0ZV9hbm51aXR5X3BheW1lbnQoCiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY5MC02OTIKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IHNlbGYuX3JlY2FsY3VsYXRlX2FubnVpdHlfcGF5bWVudCgKICAgIC8vICAgICBlbnRyeQogICAgLy8gKQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDMwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njk1CiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OTYtNzAwCiAgICAvLyBzZWxmLl9lbWl0X2V4ZWN1dGlvbl9ldmVudCgKICAgIC8vICAgICBlbnRyeT1lbnRyeSwKICAgIC8vICAgICBwYXlvZmY9VUludDY0KDApLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njk4CiAgICAvLyBwYXlvZmY9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY5OQogICAgLy8gc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OTYtNzAwCiAgICAvLyBzZWxmLl9lbWl0X2V4ZWN1dGlvbl9ldmVudCgKICAgIC8vICAgICBlbnRyeT1lbnRyeSwKICAgIC8vICAgICBwYXlvZmY9VUludDY0KDApLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGNhbGxzdWIgX2VtaXRfZXhlY3V0aW9uX2V2ZW50CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfYnVyeSAxCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAyOToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY5NAogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gZW50cnkubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDQxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAzMAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAyMDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY3NwogICAgLy8gZWxpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfSVBDQik6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgMTgKICAgID09CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAyMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc4LTY3OQogICAgLy8gIyBJUENCIGtlZXBzIHByaW5jaXBhbCB1bmNoYW5nZWQgYW5kIG9ubHkgcmVzZXRzIHRoZSBpbnRlcmVzdCBiYXNlLgogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDIzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDEwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY1CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9SUkYpOgogICAgZnJhbWVfZGlnIDEwCiAgICBwdXNoaW50IDExCiAgICA9PQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAxNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY2CiAgICAvLyBuZXh0X3JhdGUgPSBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZQogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2NwogICAgLy8gaWYgbmV4dF9yYXRlID09IFVJbnQ2NCgwKToKICAgIGJueiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAxMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY4CiAgICAvLyBuZXh0X3JhdGUgPSBzZWxmLnJhdGVfcmVzZXRfbmV4dAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDM3IC8vICJyYXRlX3Jlc2V0X25leHQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSA1CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X25leHQgZXhpc3RzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2OQogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPSBuZXh0X3JhdGUKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGZyYW1lX2RpZyA1CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAxOAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAxNDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY3MQogICAgLy8gaWYgZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUgIT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDkKICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzIKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGZyYW1lX2RpZyA5CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAxOAoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbWl0X2V4ZWN1dGlvbl9ldmVudChlbnRyeTogYnl0ZXMsIHBheW9mZjogdWludDY0LCBzZXR0bGVkX2Ftb3VudDogdWludDY0KSAtPiBieXRlczoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzA2LTcxMgogICAgLy8gZGVmIF9lbWl0X2V4ZWN1dGlvbl9ldmVudCgKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgICosCiAgICAvLyAgICAgZW50cnk6IHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5LAogICAgLy8gICAgIHBheW9mZjogVUludDY0LAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50OiBVSW50NjQsCiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAzIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxNgogICAgLy8gY29udHJhY3RfaWQ9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25faWQuaWQsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uSUQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxNwogICAgLy8gZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE4CiAgICAvLyBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICBmcmFtZV9kaWcgLTMKICAgIGV4dHJhY3QgOCAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTkKICAgIC8vIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgZnJhbWVfZGlnIC0zCiAgICBleHRyYWN0IDkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIwCiAgICAvLyBhcHBsaWVkX2F0PUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIzCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBmcmFtZV9kaWcgLTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxOAogICAgLy8gZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgaW50Y18yIC8vIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcyMwogICAgLy8gc2VsZi5fcGF5b2ZmX3NpZ24oZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSwgcGF5b2ZmKQogICAgZ2V0Ynl0ZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzUyCiAgICAvLyBpZiBwYXlvZmYgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0yCiAgICBibnogX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzUzCiAgICAvLyByZXR1cm4gVUludDY0KGVudW1zLlBBWU9GRl9TSUdOX1BPU0lUSVZFKQogICAgaW50Y18xIC8vIDEKCl9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9wYXlvZmZfc2lnbkA3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIyLTcyNAogICAgLy8gcGF5b2ZmX3NpZ249YXJjNC5VSW50OCgKICAgIC8vICAgICBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICAvLyApLAogICAgaXRvYgogICAgZHVwCiAgICBiaXRsZW4KICAgIGludGNfMiAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBleHRyYWN0IDcgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzI2CiAgICAvLyBjdXJyZW5jeV9pZD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcyNwogICAgLy8gc2VxdWVuY2U9ZW50cnkuZXZlbnRfaWQgKyBVSW50NjQoMSksCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE1LTcyOAogICAgLy8gRXhlY3V0aW9uRXZlbnQoCiAgICAvLyAgICAgY29udHJhY3RfaWQ9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25faWQuaWQsCiAgICAvLyAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1lbnRyeS5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgcGF5b2ZmPXBheW9mZiwKICAgIC8vICAgICBwYXlvZmZfc2lnbj1hcmM0LlVJbnQ4KAogICAgLy8gICAgICAgICBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBzZXR0bGVkX2Ftb3VudD1zZXR0bGVkX2Ftb3VudCwKICAgIC8vICAgICBjdXJyZW5jeV9pZD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgc2VxdWVuY2U9ZW50cnkuZXZlbnRfaWQgKyBVSW50NjQoMSksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMAogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAyCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAzCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyA0CiAgICBpdG9iCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMgogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxNC03MjkKICAgIC8vIGFyYzQuZW1pdCgKICAgIC8vICAgICBFeGVjdXRpb25FdmVudCgKICAgIC8vICAgICAgICAgY29udHJhY3RfaWQ9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25faWQuaWQsCiAgICAvLyAgICAgICAgIGV2ZW50X2lkPWVudHJ5LmV2ZW50X2lkLAogICAgLy8gICAgICAgICBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICAvLyAgICAgICAgIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgICAgICBhcHBsaWVkX2F0PUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gICAgICAgICBwYXlvZmY9cGF5b2ZmLAogICAgLy8gICAgICAgICBwYXlvZmZfc2lnbj1hcmM0LlVJbnQ4KAogICAgLy8gICAgICAgICAgICAgc2VsZi5fcGF5b2ZmX3NpZ24oZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSwgcGF5b2ZmKQogICAgLy8gICAgICAgICApLAogICAgLy8gICAgICAgICBzZXR0bGVkX2Ftb3VudD1zZXR0bGVkX2Ftb3VudCwKICAgIC8vICAgICAgICAgY3VycmVuY3lfaWQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgICAgICBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIC8vICAgICApCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHg5YTMzMmI5NSAvLyBtZXRob2QgIkV4ZWN1dGlvbkV2ZW50KHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NTQKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gKFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwgVUludDY0KGVudW1zLkVWVF9QSSkpOgogICAgZnJhbWVfZGlnIDUKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYm56IF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9pZl9ib2R5QDUKICAgIGZyYW1lX2RpZyA1CiAgICBwdXNoaW50IDQKICAgID09CiAgICBieiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUA2CgpfZW1pdF9leGVjdXRpb25fZXZlbnRfaWZfYm9keUA1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzU1CiAgICAvLyByZXR1cm4gVUludDY0KGVudW1zLlBBWU9GRl9TSUdOX1BPU0lUSVZFKQogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcyMwogICAgLy8gc2VsZi5fcGF5b2ZmX3NpZ24oZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSwgcGF5b2ZmKQogICAgYiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fcGF5b2ZmX3NpZ25ANwoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc1NgogICAgLy8gcmV0dXJuIFVJbnQ2NChlbnVtcy5QQVlPRkZfU0lHTl9ORUdBVElWRSkKICAgIHB1c2hpbnQgMjU1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MjMKICAgIC8vIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIGIgX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX3BheW9mZl9zaWduQDcKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fcm9sZV9pc19hY3RpdmUocm9sZV9tYXA6IGJ5dGVzLCByb2xlX2FkZHJlc3M6IGJ5dGVzKSAtPiB1aW50NjQ6Cl9yb2xlX2lzX2FjdGl2ZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NwogICAgLy8gZGVmIF9yb2xlX2lzX2FjdGl2ZShzZWxmLCByb2xlX21hcDogdHlwLlJiYWNSb2xlLCByb2xlX2FkZHJlc3M6IEFjY291bnQpIC0+IGJvb2w6CiAgICBwcm90byAyIDEKICAgIHB1c2hieXRlcyAiIgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU4LTYyCiAgICAvLyByZXR1cm4gc2VsZi5faGFzX3JvbGUocm9sZV9tYXAsIHJvbGVfYWRkcmVzcykgYW5kICgKICAgIC8vICAgICByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICkKICAgIGJ6IF9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIEJveE1hcCBlbnRyeSBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYwCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MAogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgPD0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYxCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIEJveE1hcCBlbnRyeSBleGlzdHMKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYwLTYxCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDAKICAgID49CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTktNjEKICAgIC8vIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IF9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQKICAgIGludGNfMSAvLyAxCgpfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU4LTYyCiAgICAvLyByZXR1cm4gc2VsZi5faGFzX3JvbGUocm9sZV9tYXAsIHJvbGVfYWRkcmVzcykgYW5kICgKICAgIC8vICAgICByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICkKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgX3JvbGVfaXNfYWN0aXZlX2Jvb2xfbWVyZ2VANQoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkgLT4gdm9pZDoKX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjUKICAgIC8vIGFzc2VydCBzZWxmLl9pc19hcnJhbmdlcihUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjUyCiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzID09IHNlbGYuYXJyYW5nZXIudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOCAvLyAweDUyM2E0MTUyNTIyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgPT0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2NQogICAgLy8gYXNzZXJ0IHNlbGYuX2lzX2FycmFuZ2VyKFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpIC0+IHZvaWQ6Cl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4MwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFzc2V0X2RlZmF1bHRlZCwgZXJyLkRFRkFVTFRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQxIC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfZGVmYXVsdGVkIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIERlZmF1bHRlZAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkgLT4gdm9pZDoKX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg2CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYXNzZXRfc3VzcGVuZGVkLCBlcnIuU1VTUEVOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzMgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9zdXNwZW5kZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gU3VzcGVuZGVkIG9wZXJhdGlvbnMKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkOiB1aW50NjQpIC0+IHZvaWQ6Cl9hc3NlcnRfdmFsaWRfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OAogICAgLy8gZGVmIF9hc3NlcnRfdmFsaWRfcm9sZShzZWxmLCByb2xlX2lkOiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTAKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIHB1c2hpbnQgMjAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NwogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkxCiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgcHVzaGludCAyNQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTIKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICBwdXNoaW50IDQwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MwogICAgLy8gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgcHVzaGludCA1MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTQKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgcHVzaGludCA2MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTUKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICBwdXNoaW50IDcwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NgogICAgLy8gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgcHVzaGludCA4MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk3CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfZmFsc2VAOAoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3OgogICAgaW50Y18xIC8vIDEKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX21lcmdlQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTcKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgcmV0c3ViCgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9mYWxzZUA4OgogICAgaW50Y18wIC8vIDAKICAgIGIgX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfbWVyZ2VAOQo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="}, "sourceInfo": {"approval": {"pcOffsetMethod": "none", "sourceInfo": [{"pc": [2669], "errorMessage": "ACTUS event not yet executed"}, {"pc": [2427], "errorMessage": "Can not distribute zero units"}, {"pc": [3170, 3177, 3550], "errorMessage": "D-ASA already configured"}, {"pc": [1276, 2008, 2387, 2533, 3767, 3913, 4264, 4526, 4672], "errorMessage": "D-ASA not configured"}, {"pc": [3561], "errorMessage": "D-ASA terms not configured"}, {"pc": [6861], "errorMessage": "Defaulted"}, {"pc": [3188], "errorMessage": "Denomination asset is not properly set"}, {"pc": [3203], "errorMessage": "Different settlement asset not supported, must be equal to denomination asset"}, {"pc": [3439, 3446, 3448], "errorMessage": "IED must be set in the future"}, {"pc": [1294, 2077, 2548, 4282, 6213], "errorMessage": "IED not yet executed"}, {"pc": [2440, 5596], "errorMessage": "Insufficient remaining D-ASA units"}, {"pc": [2643, 2709], "errorMessage": "Insufficient sender units to transfer"}, {"pc": [1904, 3090, 3108, 3164, 3641, 3677, 4329, 5780, 6058, 6118, 6521], "errorMessage": "Invalid ACTUS configuration"}, {"pc": [2017, 2421, 2604, 2619, 2776, 2849, 2912, 2954, 5408, 5533], "errorMessage": "Invalid account holding address"}, {"pc": [4863, 4887, 4911, 4935, 4959, 5016, 5044, 5066, 5088, 5110, 5289, 5307, 5322, 5337, 5352], "errorMessage": "Invalid account role address"}, {"pc": [3150], "errorMessage": "Invalid day-count convention ID"}, {"pc": [1407, 3788, 4116, 6090], "errorMessage": "Invalid event cursor"}, {"pc": [3626, 3689, 3965, 4306, 5696], "errorMessage": "Invalid event id"}, {"pc": [3801, 4180, 4187, 4319], "errorMessage": "Invalid event type"}, {"pc": [5000, 5279, 6931], "errorMessage": "Invalid role identifier"}, {"pc": [3555, 3701, 3709, 4018, 4393, 5711, 5727], "errorMessage": "Invalid schedule page"}, {"pc": [5644], "errorMessage": "No D-ASA units"}, {"pc": [1413, 1933, 2114, 6099], "errorMessage": "No due cashflow to pay"}, {"pc": [6182], "errorMessage": "Not IED event"}, {"pc": [2062, 2395, 2591, 2766, 2822, 2832, 2918, 4215, 4507, 5133, 6853], "errorMessage": "Not authorized"}, {"pc": [1534, 1542, 2163, 2237, 2246], "errorMessage": "Not enough funds for the payment"}, {"pc": [3938, 3951, 4291], "errorMessage": "Observed event required to execute this action"}, {"pc": [2409, 2457], "errorMessage": "Primary distribution is closed"}, {"pc": [6130], "errorMessage": "Primary distribution is not complete"}, {"pc": [2632], "errorMessage": "Sender and receiver must be different"}, {"pc": [5394, 6869], "errorMessage": "Suspended operations"}, {"pc": [2344, 3667, 4351], "errorMessage": "Time events must be sorted in strictly ascending order"}, {"pc": [2565, 2582], "errorMessage": "Transfer is closed"}, {"pc": [2636], "errorMessage": "Transfer units must be greater than zero"}, {"pc": [953], "errorMessage": "Wrong Global Bytes allocation"}, {"pc": [959], "errorMessage": "Wrong Global UInts allocation"}, {"pc": [963], "errorMessage": "Wrong Local Bytes allocation"}, {"pc": [967], "errorMessage": "Wrong Local UInts allocation"}, {"pc": [1515, 2156], "errorMessage": "account opted into asset"}, {"pc": [6813, 6828], "errorMessage": "check BoxMap entry exists"}, {"pc": [2053, 2091, 2132, 2170, 2461, 2639, 2698, 2724, 5388, 5554], "errorMessage": "check self.account entry exists"}, {"pc": [1596, 1828, 1916, 4583, 6218, 6541], "errorMessage": "check self.accrued_interest exists"}, {"pc": [5151, 6851], "errorMessage": "check self.arranger exists"}, {"pc": [6859], "errorMessage": "check self.asset_defaulted exists"}, {"pc": [6867], "errorMessage": "check self.asset_suspended exists"}, {"pc": [3098, 3544, 3934, 3946, 4287, 4531, 5942], "errorMessage": "check self.contract_type exists"}, {"pc": [1564, 4588, 5416, 5494], "errorMessage": "check self.cumulative_interest_index exists"}, {"pc": [1576, 4593, 5427, 5502], "errorMessage": "check self.cumulative_principal_index exists"}, {"pc": [5952], "errorMessage": "check self.dynamic_principal_redemption exists"}, {"pc": [1332, 1344, 1405, 1647, 2647, 2659, 3780, 4109, 4559, 4676, 4688, 4725, 5509, 6088, 6170, 6367, 6422, 6560], "errorMessage": "check self.event_cursor exists"}, {"pc": [5442, 5456, 5649, 5678, 6008, 6016, 6043, 6063, 6253, 6386, 6547], "errorMessage": "check self.fixed_point_scale exists"}, {"pc": [6296], "errorMessage": "check self.has_rate_reset_cap exists"}, {"pc": [6269], "errorMessage": "check self.has_rate_reset_floor exists"}, {"pc": [3175, 3560, 4555, 6187], "errorMessage": "check self.initial_exchange_amount exists"}, {"pc": [2445, 2455], "errorMessage": "check self.initial_exchange_date exists"}, {"pc": [1772, 4573, 5984, 5998], "errorMessage": "check self.interest_calculation_base exists"}, {"pc": [1844, 1859], "errorMessage": "check self.next_principal_redemption exists"}, {"pc": [4578, 5976, 6003, 6048], "errorMessage": "check self.nominal_interest_rate exists"}, {"pc": [2022, 2035], "errorMessage": "check self.op_daemon exists"}, {"pc": [1669, 1738, 1764, 1818, 1870, 1879, 1901, 4568, 6526, 6607], "errorMessage": "check self.outstanding_principal exists"}, {"pc": [6304, 6318], "errorMessage": "check self.rate_reset_cap exists"}, {"pc": [6277, 6291], "errorMessage": "check self.rate_reset_floor exists"}, {"pc": [6248], "errorMessage": "check self.rate_reset_multiplier exists"}, {"pc": [6641], "errorMessage": "check self.rate_reset_next exists"}, {"pc": [6261], "errorMessage": "check self.rate_reset_spread exists"}, {"pc": [1520, 2232, 4598], "errorMessage": "check self.reserved_interest exists"}, {"pc": [1525, 1554, 2242, 2257, 4603], "errorMessage": "check self.reserved_principal exists"}, {"pc": [2432, 2480, 4550, 5591, 6123], "errorMessage": "check self.reserved_units_total exists"}, {"pc": [1336, 2651, 3784, 3963, 3980, 4100, 4301, 4336, 4355, 4475, 4563, 4680, 5692, 6363, 6430], "errorMessage": "check self.schedule_entry_count exists"}, {"pc": [4008, 4383], "errorMessage": "check self.schedule_page entry exists"}, {"pc": [1512, 2122, 2150, 6713], "errorMessage": "check self.settlement_asset_id exists"}, {"pc": [1275, 1289, 2007, 2072, 2386, 2405, 2532, 2543, 2826, 3168, 3548, 3766, 3912, 4263, 4277, 4524, 4671, 5537, 6114, 6208], "errorMessage": "check self.status exists"}, {"pc": [2438, 2491, 4545, 5642, 5673, 6128], "errorMessage": "check self.total_units exists"}, {"pc": [2570, 2580], "errorMessage": "check self.transfer_closure_date exists"}, {"pc": [2553, 2561], "errorMessage": "check self.transfer_opening_date exists"}, {"pc": [3603, 3660], "errorMessage": "index access is out of bounds"}, {"pc": [1991, 3035, 3518, 4013, 4388], "errorMessage": "invalid array length header"}, {"pc": [2756, 3506, 4497, 5123], "errorMessage": "invalid number of bytes for arc4.bool"}, {"pc": [1999], "errorMessage": "invalid number of bytes for arc4.dynamic_array"}, {"pc": [3533], "errorMessage": "invalid number of bytes for arc4.dynamic_array"}, {"pc": [1985, 2370, 2510, 2518, 2748, 2806, 2814, 2894, 2902, 2945, 2970, 4744, 4768, 4802, 4983, 5165, 5249], "errorMessage": "invalid number of bytes for arc4.static_array"}, {"pc": [1270, 2328, 2337, 2378, 2527, 3496, 3897], "errorMessage": "invalid number of bytes for arc4.uint64"}, {"pc": [4792, 4973, 5239], "errorMessage": "invalid number of bytes for arc4.uint8"}, {"pc": [3007], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.InitialKernelState"}, {"pc": [2996], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.NormalizedActusTerms"}, {"pc": [4259], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.ObservedCashEventRequest"}, {"pc": [3908], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.ObservedEventRequest"}, {"pc": [3040], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.Prospectus"}, {"pc": [4813], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.RoleValidity"}, {"pc": [3024], "errorMessage": "invalid tail pointer at index 1 of (uint8[32],(len+utf8[]))"}, {"pc": [3019], "errorMessage": "invalid tuple encoding"}, {"pc": [4080, 4455], "errorMessage": "max array length exceeded"}, {"pc": [4537, 6705], "errorMessage": "overflow"}]}, "clear": {"pcOffsetMethod": "none", "sourceInfo": []}}, "templateVariables": {}}""" +_APP_SPEC_JSON = r"""{"arcs": [22, 28], "bareActions": {"call": [], "create": []}, "methods": [{"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "desc": "Maximum number of due cash events to process in this call.", "name": "max_event_count"}], "name": "fund_due_cashflows", "returns": {"type": "(uint64,uint64,uint64,uint64,uint64)", "desc": "Funding result with reserved interest, reserved principal, and event count.", "struct": "CashFundingResult"}, "desc": "Reserve due ACTUS cash events into the escrow-style claim ledger.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Holder whose position should be settled and claimed.", "name": "holding_address"}, {"type": "byte[]", "desc": "Opaque settlement context returned in the result.", "name": "payment_info"}], "name": "claim_due_cashflows", "returns": {"type": "(uint64,uint64,uint64,uint64,byte[])", "desc": "Claim result with realized interest, principal, and passthrough context.", "struct": "CashClaimResult"}, "desc": "Withdraw the holder's already funded ACTUS cash entitlements.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "desc": "Inclusive UNIX timestamp at which transfers may start.", "name": "open_date"}, {"type": "uint64", "desc": "Exclusive UNIX timestamp at which transfers stop.", "name": "closure_date"}], "name": "transfer_set_schedule", "returns": {"type": "uint64", "desc": "UNIX timestamp of the schedule update."}, "desc": "Configure the secondary-market transfer window.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account receiving the reserved units.", "name": "holding_address"}, {"type": "uint64", "desc": "Number of units to reserve.", "name": "units"}], "name": "primary_distribution", "returns": {"type": "uint64", "desc": "Remaining undistributed unit balance."}, "desc": "Reserve units for a holder before the initial exchange activates issuance.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account debited for the transfer.", "name": "sender_holding_address"}, {"type": "address", "desc": "Account credited for the transfer.", "name": "receiver_holding_address"}, {"type": "uint64", "desc": "Number of active units to move.", "name": "units"}], "name": "transfer", "returns": {"type": "uint64", "desc": "Number of units transferred."}, "desc": "Transfer active units after settling both counterparties to the current cursor.\nReturns the number of units moved. The ACTUS kernel no longer persists a nominal per-unit value on-chain, so transfer results are unit-based.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account holding address.", "name": "holding_address"}, {"type": "bool", "desc": "Suspension status to apply.", "name": "suspended"}], "name": "account_suspension", "returns": {"type": "uint64", "desc": "UNIX timestamp of the suspension update."}, "desc": "Set the suspension status of one account.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account holding address.", "name": "holding_address"}, {"type": "address", "desc": "Account payment address.", "name": "payment_address"}], "name": "account_open", "returns": {"type": "uint64", "desc": "UNIX timestamp of the account opening."}, "desc": "Open a contract account with a new position and register its payment address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account holding address.", "name": "holding_address"}, {"type": "address", "desc": "New account payment address.", "name": "payment_address"}], "name": "account_update_payment_address", "returns": {"type": "uint64", "desc": "UNIX timestamp of the account update."}, "desc": "Update the payment address of an account.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account holding address.", "name": "holding_address"}], "name": "account_get_position", "returns": {"type": "(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64)", "desc": "Account position record.", "struct": "AccountPosition"}, "desc": "Get the full accounting position for one holder.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": [], "create": ["NoOp"]}, "args": [{"type": "address", "desc": "D-ASA arranger address.", "name": "arranger"}], "name": "contract_create", "returns": {"type": "uint64", "desc": "UNIX timestamp of contract creation."}, "desc": "Create a new D-ASA contract and set the arranger role.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64)", "desc": "Normalized ACTUS terms.", "name": "terms", "struct": "NormalizedActusTerms"}, {"type": "(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "desc": "Initial kernel state captured before `IED`.", "name": "initial_state", "struct": "InitialKernelState"}, {"type": "(byte[32],string)", "desc": "Prospectus metadata stored for reference only.", "name": "prospectus", "struct": "Prospectus"}], "name": "contract_config", "returns": {"type": "uint64", "desc": "UNIX timestamp of contract configuration."}, "desc": "Partial contract configuration with: normalized ACTUS terms, initial kernel\nstate (pre-IED), prospectus (informational only). The contract stays inactive until all schedule pages are configured next.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "desc": "Zero-based page index within the boxed schedule.", "name": "schedule_page_index"}, {"type": "bool", "desc": "Whether this page finalizes the schedule upload.", "name": "is_last_page"}, {"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[]", "desc": "Normalized schedule entries for the requested page.", "name": "schedule_page"}], "name": "contract_schedule", "returns": {"type": "uint64", "desc": "UNIX timestamp of the schedule upload."}, "desc": "Upload one normalized schedule page.\nThe configuration operation is considered complete only when the last page is stored. At that point `schedule_entry_count` is finalized and the contract moves to `STATUS_PENDING_IED`.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "contract_execute_ied", "returns": {"type": "uint64", "desc": "UNIX timestamp of the `IED` execution."}, "desc": "Execute the first due `IED` entry and activate the contract.\n`IED` is the one non-cash event that moves the app from `STATUS_PENDING_IED` to `STATUS_ACTIVE`.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "desc": "Expected global schedule event identifier at the current cursor.", "name": "event_id"}, {"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "desc": "Observed payload used for append-on-execute and/or rate resets.", "name": "payload", "struct": "ObservedEventRequest"}], "name": "apply_non_cash_event", "returns": {"type": "uint64", "desc": "UNIX timestamp of the non-cash event application."}, "desc": "Apply the next due non-cash event, optionally appending one first.\nObserved payloads are appended before execution when flagged. Rate reset events require the interest oracle because they can change the running nominal rate; other non-cash events stay arranger-controlled.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "desc": "Observed cash-event payload to append after the current tail.", "name": "payload", "struct": "ObservedCashEventRequest"}], "name": "append_observed_cash_event", "returns": {"type": "uint64", "desc": "UNIX timestamp of the append operation."}, "desc": "Append an arranger-authorized observed cash event to the schedule tail.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "contract_get_state", "returns": {"type": "(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "desc": "Current kernel state snapshot.", "struct": "KernelState"}, "desc": "Return a readonly snapshot of the generic ACTUS kernel state.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "contract_get_next_due_event", "returns": {"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "desc": "Next due schedule entry, or an all-zero sentinel if the contract ended.", "struct": "ExecutionScheduleEntry"}, "desc": "Return the next boxed schedule entry, or a zeroed sentinel if ended.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["UpdateApplication"], "create": []}, "args": [], "name": "contract_update", "returns": {"type": "void", "desc": "None."}, "desc": "Update D-ASA application.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "New arranger address.", "name": "new_arranger"}], "name": "rbac_rotate_arranger", "returns": {"type": "uint64", "desc": "UNIX timestamp of the role assignment."}, "desc": "Rotate the arranger address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Operation daemon address.", "name": "address"}], "name": "rbac_set_op_daemon", "returns": {"type": "uint64", "desc": "UNIX timestamp of the role assignment."}, "desc": "Non-normative helper to set the operation daemon address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role identifier.", "name": "role_id"}, {"type": "address", "desc": "Account role address.", "name": "role_address"}, {"type": "(uint64,uint64)", "desc": "Inclusive validity interval for the assignment.", "name": "validity", "struct": "RoleValidity"}], "name": "rbac_assign_role", "returns": {"type": "uint64", "desc": "UNIX timestamp of the role assignment."}, "desc": "Assign a role to an address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role identifier.", "name": "role_id"}, {"type": "address", "desc": "Account role address.", "name": "role_address"}], "name": "rbac_revoke_role", "returns": {"type": "uint64", "desc": "UNIX timestamp of the role revocation."}, "desc": "Revoke a role from an address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Suspension status to apply.", "name": "suspended"}], "name": "rbac_contract_suspension", "returns": {"type": "uint64", "desc": "UNIX timestamp of the suspension update."}, "desc": "Set the asset-wide suspension status.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Default status", "name": "defaulted"}], "name": "rbac_contract_default", "returns": {"type": "uint64"}, "desc": "Set D-ASA default status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "rbac_get_arranger", "returns": {"type": "address", "desc": "Current arranger address."}, "desc": "Get the arranger address.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Address to query.", "name": "address"}], "name": "rbac_get_address_roles", "returns": {"type": "(bool,bool,bool,bool,bool)", "desc": "Roles mask in the order: account manager, primary dealer, trustee, authority, observer."}, "desc": "Non-normative helper to get the active roles assigned to an address.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role identifier.", "name": "role_id"}, {"type": "address", "desc": "Account role address.", "name": "role_address"}], "name": "rbac_get_role_validity", "returns": {"type": "(uint64,uint64)", "desc": "Stored role validity interval.", "struct": "RoleValidity"}, "desc": "Get the stored validity interval for a role assignment.", "events": [], "readonly": true, "recommendations": {}}], "name": "DASA", "state": {"keys": {"box": {}, "global": {"arranger": {"key": "UjpBUlIj", "keyType": "AVMBytes", "valueType": "address"}, "op_daemon": {"key": "UjpPUEQj", "keyType": "AVMBytes", "valueType": "address"}, "contract_suspended": {"key": "Y29udHJhY3Rfc3VzcGVuZGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "defaulted": {"key": "ZGVmYXVsdGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "status": {"key": "c3RhdHVz", "keyType": "AVMString", "valueType": "AVMUint64"}, "contract_type": {"key": "Y29udHJhY3RfdHlwZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "prospectus_hash": {"key": "cHJvc3BlY3R1c19oYXNo", "keyType": "AVMString", "valueType": "AVMBytes"}, "prospectus_url": {"key": "cHJvc3BlY3R1c191cmw=", "keyType": "AVMString", "valueType": "AVMString"}, "denomination_asset_id": {"key": "ZGVub21pbmF0aW9uX2Fzc2V0X2lk", "keyType": "AVMString", "valueType": "AVMUint64"}, "settlement_asset_id": {"key": "c2V0dGxlbWVudF9hc3NldF9pZA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "initial_exchange_date": {"key": "aW5pdGlhbF9leGNoYW5nZV9kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "maturity_date": {"key": "bWF0dXJpdHlfZGF0ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "transfer_opening_date": {"key": "dHJhbnNmZXJfb3BlbmluZ19kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "transfer_closure_date": {"key": "dHJhbnNmZXJfY2xvc3VyZV9kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "day_count_convention": {"key": "ZGF5X2NvdW50X2NvbnZlbnRpb24=", "keyType": "AVMString", "valueType": "AVMUint64"}, "total_units": {"key": "dG90YWxfdW5pdHM=", "keyType": "AVMString", "valueType": "AVMUint64"}, "reserved_units_total": {"key": "cmVzZXJ2ZWRfdW5pdHNfdG90YWw=", "keyType": "AVMString", "valueType": "AVMUint64"}, "initial_exchange_amount": {"key": "aW5pdGlhbF9leGNoYW5nZV9hbW91bnQ=", "keyType": "AVMString", "valueType": "AVMUint64"}, "outstanding_principal": {"key": "b3V0c3RhbmRpbmdfcHJpbmNpcGFs", "keyType": "AVMString", "valueType": "AVMUint64"}, "next_principal_redemption": {"key": "bmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbg==", "keyType": "AVMString", "valueType": "AVMUint64"}, "dynamic_principal_redemption": {"key": "ZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbg==", "keyType": "AVMString", "valueType": "AVMUint64"}, "interest_calculation_base": {"key": "aW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "accrued_interest": {"key": "YWNjcnVlZF9pbnRlcmVzdA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "nominal_interest_rate": {"key": "bm9taW5hbF9pbnRlcmVzdF9yYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_spread": {"key": "cmF0ZV9yZXNldF9zcHJlYWQ=", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_multiplier": {"key": "cmF0ZV9yZXNldF9tdWx0aXBsaWVy", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_floor": {"key": "cmF0ZV9yZXNldF9mbG9vcg==", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_cap": {"key": "cmF0ZV9yZXNldF9jYXA=", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_next": {"key": "cmF0ZV9yZXNldF9uZXh0", "keyType": "AVMString", "valueType": "AVMUint64"}, "has_rate_reset_floor": {"key": "aGFzX3JhdGVfcmVzZXRfZmxvb3I=", "keyType": "AVMString", "valueType": "AVMUint64"}, "has_rate_reset_cap": {"key": "aGFzX3JhdGVfcmVzZXRfY2Fw", "keyType": "AVMString", "valueType": "AVMUint64"}, "reserved_principal": {"key": "cmVzZXJ2ZWRfcHJpbmNpcGFs", "keyType": "AVMString", "valueType": "AVMUint64"}, "reserved_interest": {"key": "cmVzZXJ2ZWRfaW50ZXJlc3Q=", "keyType": "AVMString", "valueType": "AVMUint64"}, "cumulative_interest_index": {"key": "Y3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "cumulative_principal_index": {"key": "Y3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXg=", "keyType": "AVMString", "valueType": "AVMUint64"}, "event_cursor": {"key": "ZXZlbnRfY3Vyc29y", "keyType": "AVMString", "valueType": "AVMUint64"}, "schedule_entry_count": {"key": "c2NoZWR1bGVfZW50cnlfY291bnQ=", "keyType": "AVMString", "valueType": "AVMUint64"}, "fixed_point_scale": {"key": "Zml4ZWRfcG9pbnRfc2NhbGU=", "keyType": "AVMString", "valueType": "AVMUint64"}}, "local": {}}, "maps": {"box": {"account_manager": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpNTkcj"}, "primary_dealer": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpQWUQj"}, "trustee": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpUUlMj"}, "authority": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpBVVQj"}, "observer": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpNT0Mj"}, "schedule_page": {"keyType": "uint64", "valueType": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[]", "prefix": "UyM="}, "account": {"keyType": "address", "valueType": "AccountPosition", "prefix": "QSM="}}, "global": {}, "local": {}}, "schema": {"global": {"bytes": 10, "ints": 54}, "local": {"bytes": 0, "ints": 0}}}, "structs": {"AccountPosition": [{"name": "payment_address", "type": "address"}, {"name": "units", "type": "uint64"}, {"name": "reserved_units", "type": "uint64"}, {"name": "suspended", "type": "bool"}, {"name": "settled_cursor", "type": "uint64"}, {"name": "interest_checkpoint", "type": "uint64"}, {"name": "principal_checkpoint", "type": "uint64"}, {"name": "claimable_interest", "type": "uint64"}, {"name": "claimable_principal", "type": "uint64"}], "CashClaimResult": [{"name": "interest_amount", "type": "uint64"}, {"name": "principal_amount", "type": "uint64"}, {"name": "total_amount", "type": "uint64"}, {"name": "timestamp", "type": "uint64"}, {"name": "context", "type": "byte[]"}], "CashFundingResult": [{"name": "funded_interest", "type": "uint64"}, {"name": "funded_principal", "type": "uint64"}, {"name": "total_funded", "type": "uint64"}, {"name": "processed_events", "type": "uint64"}, {"name": "timestamp", "type": "uint64"}], "ExecutionScheduleEntry": [{"name": "event_id", "type": "uint64"}, {"name": "event_type", "type": "uint8"}, {"name": "scheduled_time", "type": "uint64"}, {"name": "accrual_factor", "type": "uint64"}, {"name": "redemption_accrual_factor", "type": "uint64"}, {"name": "next_nominal_interest_rate", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "next_outstanding_principal", "type": "uint64"}, {"name": "flags", "type": "uint64"}], "InitialKernelState": [{"name": "status_date", "type": "uint64"}, {"name": "event_cursor", "type": "uint64"}, {"name": "outstanding_principal", "type": "uint64"}, {"name": "interest_calculation_base", "type": "uint64"}, {"name": "nominal_interest_rate", "type": "uint64"}, {"name": "accrued_interest", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "cumulative_interest_index", "type": "uint64"}, {"name": "cumulative_principal_index", "type": "uint64"}], "KernelState": [{"name": "contract_type", "type": "uint8"}, {"name": "status", "type": "uint64"}, {"name": "total_units", "type": "uint64"}, {"name": "reserved_units_total", "type": "uint64"}, {"name": "initial_exchange_amount", "type": "uint64"}, {"name": "event_cursor", "type": "uint64"}, {"name": "schedule_entry_count", "type": "uint64"}, {"name": "outstanding_principal", "type": "uint64"}, {"name": "interest_calculation_base", "type": "uint64"}, {"name": "nominal_interest_rate", "type": "uint64"}, {"name": "accrued_interest", "type": "uint64"}, {"name": "cumulative_interest_index", "type": "uint64"}, {"name": "cumulative_principal_index", "type": "uint64"}, {"name": "reserved_interest", "type": "uint64"}, {"name": "reserved_principal", "type": "uint64"}], "NormalizedActusTerms": [{"name": "contract_type", "type": "uint8"}, {"name": "denomination_asset_id", "type": "uint64"}, {"name": "settlement_asset_id", "type": "uint64"}, {"name": "total_units", "type": "uint64"}, {"name": "notional_principal", "type": "uint64"}, {"name": "initial_exchange_amount", "type": "uint64"}, {"name": "initial_exchange_date", "type": "uint64"}, {"name": "maturity_date", "type": "uint64"}, {"name": "day_count_convention", "type": "uint8"}, {"name": "rate_reset_spread", "type": "uint64"}, {"name": "rate_reset_multiplier", "type": "uint64"}, {"name": "rate_reset_floor", "type": "uint64"}, {"name": "rate_reset_cap", "type": "uint64"}, {"name": "rate_reset_next", "type": "uint64"}, {"name": "has_rate_reset_floor", "type": "bool"}, {"name": "has_rate_reset_cap", "type": "bool"}, {"name": "dynamic_principal_redemption", "type": "bool"}, {"name": "fixed_point_scale", "type": "uint64"}], "ObservedCashEventRequest": [{"name": "event_id", "type": "uint64"}, {"name": "event_type", "type": "uint8"}, {"name": "scheduled_time", "type": "uint64"}, {"name": "accrual_factor", "type": "uint64"}, {"name": "redemption_accrual_factor", "type": "uint64"}, {"name": "next_nominal_interest_rate", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "next_outstanding_principal", "type": "uint64"}, {"name": "flags", "type": "uint64"}], "ObservedEventRequest": [{"name": "event_id", "type": "uint64"}, {"name": "event_type", "type": "uint8"}, {"name": "scheduled_time", "type": "uint64"}, {"name": "accrual_factor", "type": "uint64"}, {"name": "redemption_accrual_factor", "type": "uint64"}, {"name": "observed_rate", "type": "uint64"}, {"name": "next_nominal_interest_rate", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "next_outstanding_principal", "type": "uint64"}, {"name": "flags", "type": "uint64"}], "Prospectus": [{"name": "hash", "type": "byte[32]"}, {"name": "url", "type": "string"}], "RoleValidity": [{"name": "role_validity_start", "type": "uint64"}, {"name": "role_validity_end", "type": "uint64"}]}, "byteCode": {"approval": "DCAFAAEIINwLJjEEFR98dQZzdGF0dXMMZXZlbnRfY3Vyc29yFHNjaGVkdWxlX2VudHJ5X2NvdW50FW91dHN0YW5kaW5nX3ByaW5jaXBhbBFmaXhlZF9wb2ludF9zY2FsZRBhY2NydWVkX2ludGVyZXN0GWludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UCQSMVbm9taW5hbF9pbnRlcmVzdF9yYXRlDWNvbnRyYWN0X3R5cGUUcmVzZXJ2ZWRfdW5pdHNfdG90YWwScmVzZXJ2ZWRfcHJpbmNpcGFsC3RvdGFsX3VuaXRzGW5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24RcmVzZXJ2ZWRfaW50ZXJlc3QZY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleBpjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleAZSOkFSUiMTc2V0dGxlbWVudF9hc3NldF9pZBdpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudAZSOkFVVCMGUjpQWUQjBlI6TU5HIwJTIwZSOk1PQyMGUjpUUlMjBlI6T1BEIxVpbml0aWFsX2V4Y2hhbmdlX2RhdGUVdHJhbnNmZXJfb3BlbmluZ19kYXRlFXRyYW5zZmVyX2Nsb3N1cmVfZGF0ZRByYXRlX3Jlc2V0X2Zsb29yDnJhdGVfcmVzZXRfY2FwEmNvbnRyYWN0X3N1c3BlbmRlZAlkZWZhdWx0ZWQcZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbhFyYXRlX3Jlc2V0X3NwcmVhZBVyYXRlX3Jlc2V0X211bHRpcGxpZXIPcmF0ZV9yZXNldF9uZXh0FGhhc19yYXRlX3Jlc2V0X2Zsb29yEmhhc19yYXRlX3Jlc2V0X2NhcAEAD3Byb3NwZWN0dXNfaGFzaA5wcm9zcGVjdHVzX3VybBVkZW5vbWluYXRpb25fYXNzZXRfaWQNbWF0dXJpdHlfZGF0ZRRkYXlfY291bnRfY29udmVudGlvbgMGgQECAAAxGEAArScSMgNnJxsyA2cnISJnJyIiZykiZycKImcnKoAAZycrgABnJywiZycTImcnHCJnJy0iZycdImcnHiJnJy4iZycNImcnCyJnJxQiZycEImcnDiJnJyMiZycHImcnBiJnJwkiZyckImcnJSJnJx8iZycgImcnJiJnJyciZycoImcnDCJnJw8iZycQImcnESJnKiJnKyJnJwUiZzE1gQoSRDE0gTYSRDE3FEQxNhREgASRTwTrNhoAjgEAzjEZFEQxGEEAt4IZBLRGGMgE54MlKQSUOIcjBGyF4+4EvdGpRAR8DxgSBBT8EO8EdKcpfwQJ1P4UBJqb+oUEhe7TPQSrLA/EBNnyJawEmINQWgSOpudMBAKvVXoEgvcbLQTvBPXTBN80NVAEPb6AvQQePkjnBDkkH6MEAQyCmQR0BqzSBBpyou42GgCOGQBWAyEEfQSnBTEGIQZbBrMG5gcUCQgKHwqYDAQM9g2JDc4N5g3+DrMPSQ9oD4cPkg/cAIAElW1xVjYaAI4BBvEAMRmBBBIxGBBEQg2uigIAi/6BCgiLADIMDUEAKrGBBrIQgQWyGScvsh4nL7Ifi/+NAgALAASzQv/bMgCyAUL/9SKyAUL/74kigABHDTYaAUkVJBJEFyIpZUREiBW9iBXEiBXJIillRIEyEhREiBIgQQALSYFkCyEECCKI/48iRQUiRQ4iRQ1LBEsBDEECWSIqZUQiK2VEDEECTSIqZUSIEPJJRRGBCVtJRQMyBw1AAjdLDyRVSUUQJBJJRQRAABBLDoEDEkAACEsOgRMSQQI/I0ECFEsPIlsiKmVEEkRLATIHDkRLAkAB7UsOgRMSQAHlIkULSw8kVUlFEIEDEkABZUsOgRMSQAFdIkUGSw+BMVtFCIgRekAA/ksHRQlLCogQOEsGiBAzSwGIEE1JTgJFD0mIEERJRQtLAksBCElFCTIKIicTZURwAEQiJw9lRCInDGVESwEISwJLAQ9ETwJMCU8CD0RPAwgnD0xnIicMZUQIJwxMZyInEGVETwIIJxBMZyInEWVECCcRTGdLDyRVgQMSQQB6IicGZURLEIgRBkUSCCcGTGeIEOZBAApLDyRVgRMSQQAJSw+BKVsnDkxnJwRLCGcnB0sJZyIqZUQjCCpMZ0sPVwgBgAETqEEAESInBGVEQAAJKYHIAWcnByJnSw9LBEmIE3NISw1LDAhFDksMSwcIRQ1LBCMIRQVC/ncnBiJnQv+QSw8kVUlFEIEDEkEAECInBGVESwYJSUUJRQlC/ulLDiQSQQATIicEZUxFCUQiJwdlTEUKREL+z0sOgRMSQAAHSwdFCUL+wCJFCCJFCUL+t4gQJ0EAVksOgRMSQQAKIicEZURFBkL+jiInBmVESxCIEB5FEghJRQsiJw5lRA9BAAYiRQZC/m8iJw5lREsKCUlFCCInBGVEDUEACiInBGVERQZC/lFLBkUGQv5KSw+BMVsiJwRlREoOREwJRQZC/jYiJwZlREsQiA/GRRIIRQtC/gxLBElESw5JSw9JTgMIMgdPAhZPAxZQTwIWUE8CFlBMFlAoTFCwI0MiQv2+gABHAjYaAUcCFSUSRDYaAkkiWYECCEsBFRJEVwIATCIpZUREJwhMUEm9RQFEIicbZUQyAxNBACIxACInG2VEEkAAFTEASwMSQAANMQBLAb5EVwAgEkEBACNEiBK1iBK6IillRIEyEhRESwJJiA1qiAztRgJJvkRJgUlbSU4CRQhJgVFbSUUITwIISUUGRFcAICInE2VEcABFAUEAt0m+RIGAA1NAAK0jQQB4MgoiJxNlRExLAXAAREsFSU4CD0RLAklOA75ESVcAILEyAE8DshJMshRPArIRgQSyELIBs0mBSVtJTgJFCUmBUVtJTgNFCSIWTEsBXElMXFFPA0y/IicPZURJSwIPRCInDGVESwMPREwJJw9MZyInDGVETAknDExnSwVJSwZJTgMIMgdPAhZPAxZQTwIWUEwWUEsCSRUWVwYCTFBMgAIAIlBMUChMULAjQyJC/1AiQv79NhoBSRUkEkQXNhoCSRUkEkQXiBGXSgxEJx1PAmcnHkxnMgcWKExQsCNDNhoBSRUlEkQ2GgJJFSQSRBdJTgIiKWVERCcWMQCIES5EiBFoiBFtIillRIEyEkQnCEsCUElOA71FAURMiAuJSUQiJwtlRAgiJw1lRA5EIiccZURBAAkyByInHGVEDkRHAr5EgShbSwNJTgMIFoEoTLsiJwtlRAgnC0sBZyInDWVETAkWKExQsCNDIkk2GgFJFSUSRDYaAkkVJRJENhoDRwIVJBJEFyIpZUREiBDeiBDjIillRIEyEhREIicdZURBAAkiJx1lRDIHDkQiJx5lREEACTIHIiceZUQMRDEASwRJTgISRCcISwFQSUUISb1FAUQnCEsFSU4CUElFCb1FAURLAogKwkmICr5PAhNESwFJREy+RCVbDkQiKmVEIitlRA9AAA4iKmVEiAvPgQlbMgcNREsDSYgLGksDSU4CiAsSiAqVRgKICpBGAksFSb5EJVtLAklOAksBDkRLAQkWTwIlTwK7SwVJvkQlW08CCBYlTLsoSwJQsCNDNhoBSRUlEkQ2GgJJFSMSRCJTJxUxAIgPu0QnCE8CUEm9RQFESYEwI7oiTwNUgTBMuzIHFihMULAjQzYaAUkVJRJENhoCSRUlEkQnFzEAiA+DRCIpZUSByAESFESID7OID7gnCE8CUEm9RQEURCIWTwJLAVBLAVAnKVBLAVBLAVBLAVBLAVBMUL8yBxYoTFCwI0M2GgFJFSUSRDYaAkkVJRJEJwhLAlBJvUUBRDEATwMSRIgPXYgPYiJPArsyBxYoTFCwI0M2GgFJFSUSRCcITFBJvUUBRL5IKExQsCNDNhoBSRUlEkQnEkxnMgcWKExQsCNDgABJNhoBRwIVgWsSRDYaAklOAhWBSBJENhoDSU4CSRVLASVZSYEiEkRPAkxLAlJJTgMiWYEkCBJEiA7ZIlVJJwpLAWdBACJJIxJAABxJgQISQAAVSYEDEkAADkmBBBJAAAdJgQUSQQGHI0QiJwplTEUCREsESYEhW0lFCESBOVVJRQhBAB9LBiMSQAAYSwaBAhJAABBLBoEDEkAACEsGgQQSQQFHI0RJIxNBAAhLBIGSBlMURCIpZUQURCInFGVEFERLBEkjW0lxC0UBRCcsSwFnSwGBCVtJTwISRCcTSwFnsTIAMgoishKyFEyyEYEEshCyAbNJgRFbJw1MZycLImcnLksIZ0mBKVsnHEsBZ0sBgTFbJy1LAWdLBklOAoEwWycOTGcnFEsKZ0sDgZIGUycjTGdLAYEQWycETGdLAYEoWycGTGdLASVbJwlMZ0sBgRhbJwdMZ0sDgTpbJyRMZ0sDgUJbJyVMZ0sDgUpbJx9MZ0sDgVJbJyBMZ0sDgVpbJyZMZ0sDgZAGUycnTGdLA4GRBlMnKExnTwOBY1snBUxnSwEkWypMZ0sBgThbJxBMZ0sBgUBbJxFMZycPImcnDCJnSwIyBw1ETCJbSwIMRAxESwJXACAnKkxnSwFXAgAnK0xnMgcWKExQsCNDIkL+tiJC/nYigABHAjYaAUkVJBJEF0k2GgJJFSMSRCJTTDYaA0lOAkkiWUlOA0mBQQuBAghPAhUSRIgM7CInCmVMTgNEIillRBRESYEQDkQiJxRlRERMgRALTIFkCyEECCKI9rYiSUsEDEEAi0sEVwIASUUMSwFJTgKBQQuBQVhJJFVJTgJFDUkiW0lFDUsFTwQISwESREsFTwOICDhMgQlbSUUKREEAF0lBACVJIwmBQQtLC0yBQViBCVtLCA5ESwhAAAVLCSMSREkjCEUBQv+USwZJRCMJFicYTFBJvUUBREkigQK6F0lEIwmBQQuBAgiBQbpC/8FLBhYnGExQSbxISwW/SwVBAAxLAUsECCtMZymBMmcyBxYoTFCwI0MiKWVERIgMAogMCYgMDiIqZUQiK2VESwENRIgHZklXCAFJgAEBqERLAVcACEsCVwkISwNXEQhLBFcZCEsFVyEISwZXKQhLB1cxCEsIVzkITwdPCFBPB1BPBlBPBVAiFlBPBFBPA1BPAlBMUIgImEYCMgcWKExQsCNDIkcEgABJNhoBSRUkEkQXNhoCRwIVgUkSRCIpZUREiAt6iAt/gUFbSYEEGkEAsCInCmVEgQUSRIgLVyInCmVESYEFEkRLAkkiW0lFByIrZUQSRElXCAFFDCRViAbhIitlRIEQCicwRQcWJxhMUElFCb1FAUEAB0sHvkxFB0RLBUkiWUmBEAxESwNJVwkISwFXEQhLAlcZCEsDVykISwRXMQhPBVc5CEsLFksSUE8GUE8FUE8EUE8DUE8CUExQSwMWUE8CTFBMIwgWVwYCXABLCEm8SEy/IitlRCMIK0xnIiplREsDSU8CEkSIBh5JRQhJVwgBRQokVUlFBiMSQAAoSwSBBBJAACBLBIEMEkAAGEsEgQsSQAAQSwSBEhJAAAhLBIEFEkEAQSNESwiAAQGpREsEgQwSQAAISwSBCxJBACQjQQAaJxkxAIgKEkRLBksCiAc6RgIyBxYoTFCwI0OICjBC/+giQv/ZIkL/vCJJNhoBRwIVgUESRCIpZUREiAoRiAoYiAodIillRIEyEhREIicKZUSBBRJESSJbSU4CIitlRExLARJESwFXCAFJTgOAAQOoREyBOVtJTgIjGkRBABMiK2VEIwmIBUCBCVtLBIEJWw5EIitlRIEQCicwRQYWJxhMUElFB71FAUEAB0sFvkxFBkRLBEkiWUmBEAxESwVJVwkISwFXEQhLAlcZCEsDVyEISwRXKQhPBVcxCEsKFksKUE8GUE8FUE8EUE8DUE8CUExQSwMWUE8CTFBMIwgWVwYCXABLBkm8SEy/IitlRCMIK0xnMgcWKExQsCNDIillRElEIicKZUQWSZMkDkRXBwEiJw1lRCInC2VEIicUZUQiKmVEIitlRCInBGVEIicHZUQiJwllRCInBmVEIicQZUQiJxFlRCInD2VEIicMZURPDhZPDkxQTw0WUE8MFlBPCxZQTwoWUE8JFlBPCBZQTwcWUE8GFlBPBRZQTwQWUE8DFlBPAhZQTBZQKExQsCNDIillREQiKmVEIitlRA9BACUiKmVEFicpUCIWTEsBUEsBUEsBUEsBUEsBUEsBUExQKExQsCNDIiplRIgD3EL/8IgIXSNDNhoBSRUlEkSICFAnEkxnMgcWKExQsCNDNhoBSRUlEkSICDgnG0xnMgcWKExQsCNDNhoBSRUjEkQ2GgJJTgIVJRJENhoDSU4CFYEQEkSICAuICBIXRwKICByBFBJBAA4nEksDZzIHFihMULAjQ0mBKBJBABEnF0sDUEm9RQEUREsCv0L/30mBMhJBABEnFksDUEm9RQEUREsCv0L/x0mBPBJBABEnGksDUEm9RQEUREsCv0L/r0mBRhJBABEnFUsDUEm9RQEUREsCv0L/l0mBUBJB/5AnGUsDUEm9RQEUREsCv0L/fzYaAUkVIxJENhoCSU4CFSUSRIgHYYgHaBdHAogHckmBFBNEgSgSQQAVJxdLAlBJvUUBRLxIMgcWKExQsCNDSYEyEkEADycWSwJQSb1FAUS8SEL/4UmBPBJBAA8nGksCUEm9RQFEvEhC/8tJgUYSQQAPJxVLAlBJvUUBRLxIQv+1SYFQEkH/ricZSwJQSb1FAUS8SEL/nzYaAUkVIxJEIlMnFTEAiAabRCchTGcyBxYoTFCwI0M2GgFJFSMSRCJTJxoxAIgGfEQnIkxnMgcWKExQsCNDIicSZUQoTFCwI0M2GgFJFSUSRCcXSwGIBlQnFksCiAZNJxpLA4gGRicVSwSIBj8nGU8FiAY4JykiTwZUI08FVIECTwRUgQNPA1SBBE8CVChMULAjQzYaAUkVIxJENhoCSU4CFSUSRBdJiAZQgwYUKDI8RlBPBo4GAE8AQAAxACIAEwABACcZSwFQSb1FAUS+SChMULAjQycVSwFQSb1FAUS+SEL/6ycaSwFQSb1FAUS+SEL/3CcWSwFQSb1FAUS+SEL/zScXSwFQSb1FAUS+SEL/voAQAAAAAAAAAAAAAAAAAAAAAEL/qYoBACcIi/9QvkSBgANTFESJigECJwiL/1BJvUUBREm+SCInEGVESwGBOVsJIicRZURLAoFBWwlLAiVbIicFZURPA0sCTwKIAJgiJwVlRE8DTwNPAogAiksCgUlbSwIIFk8DTFxJSYFRW0sCCBZcUSInEGVEFlw5IicRZUQWXEEiKmVEFlwxTwNMv4mKAQAigAAnCIv/UEm9RQFEIillRIEyEkEAAYmLAr5MSU4CjABEgShbSYwBQAABiYsASSVbiwFJTgMIFlwgIhZcKIsCTL8iJwtlRElLAg9ETAknC0xniYoDAYv9QQAFi/5AAAIiiYv9i/4di/+XiYoBAYv/QAACIokiJw1lRElEIicFZUSL/0xPAoj/yomKAQGL/0AAAiKJIicNZUQiJwVlRIv/TIj/r4mKAQEiK2VEi/8NRIv/gRAKFicYTFBJvUUBRIv/gRAYSwEigQK6F0sBDUSBQQuBAgiBQbqJigIAi/8jEkAAH4v/JBJAABiL/4ETEkAAEIv/gQwSQAAIi/+BCxJBAAMjRImL/kAABCJC//WL/oEDEkAACIv+gQISQQAYi/+BAxJAAAiL/4ESEkEABCNC/9EiQv/Ni/4jEkEAIIv/gQMSQAAQi/+BEhJAAAiL/4EFEkEABCNC/6oiQv+mi/6BBBJBACiL/4EDEkAAGIv/gQQSQAAQi/+BEhJAAAiL/4EFEkEABCNC/3oiQv92i/6BBRJBAAiL/4EDEkL/ZiJC/2IiJwplRCMSQQAKIicjZURBAAIjiSKJigECi/+BEVtJQQAQIicJZURBAAgiJwdlREAABiKL/08CiSInB2VEIicJZUQiJwVlRIj+aCInBWVEiwBMiP5di/9PAomKAgGL/0AAA4v+iSInBWVEIicJZUSL/0sCiP48CElEIicFZUSL/kxPAoj+LImKAgIigABHCIv+IlsiKmVEEkSL/oEJWzIHDkSL/iRVSSMSSUEAXiIpZUSBMhJEIicLZUQiJw1lRBJEi/6BMVsnBEsBZycHTGeL/oEhWycJTGcnBiJni/6BKVsnDkxnIiplRCMIKkxnKYFkZ4sLRCInFGVEi/5MIogB2kmM/ov/jAGMAIkiKWVEgTISFEQiJwZlRIv+iP74jP4IJwZMZ4sKgQwSQQF4i/+BIVsiJyVlRCInBWVEiP1zIickZUQIjAYiJydlREEAEyInH2VEiwYNQQAIIicfZUyMBkQiJyhlREEAEyInIGVEiwYMQQAIIicgZUyMBkQnCYsGZ4sKgQQSQQEHi/6BMVsnBEsBZycHTGeI/mVBAOeLCoEFEkEAxSIrZUQiKmVECYFkCyEECCKI68QiJwVlTIwCRCKMASKMB4v+gRlbSYwIQQAPiwKLCIj+gUmMAiOMB4wBIiplRCMIjAMiK2VEiwMNQQBSiwOI/QxJjAAkVUmMBIEDEkAAEIsEgRMSQQAziwCBGVtBACsjQQAIiwdBAAwijAeLAyMIjANC/76LAIEZW4sCTIj+JEmMAosBCIwBQv/hIkL/0osBRCInBGVEi/6BOVskGkAABiInBmVECCInBWVEiwGI/EsnDkxnIiplRCMIKkxni/4iSYgAYEmM/ov/jAGMAImL/oEpWycOTGdC/9qLCoESEkH+/yInBGVEJwdMZ0L+84sKgQsSQQAbi/6BIVtJjAVAAAgiJyZlTIwFRCcJiwVnQv66i/6BIVtJjAlB/q8nCYsJZ0L+p4oDATIIi/0iW4v9VwgBi/1XCQgyB4v9JFWL/kAARSMWSZMkDkRXBwEiJxNlRIsBSSMIiwAWTwIWUIsCUIsDUIsEFlCL/hZQTwNQi/8WUE8CFlBMFlCABJozK5VMULCL/YwAiYsFIxJAAAiLBYEEEkEABCNC/6mB/wFC/6OKAgGAAIv+i/9QSb1FAUEAH4sBvkQiWzIHSYwADkEAEIsBvkQkW4sAD0EABCOMAIkiQv/5MQAiJxJlRBJEiSInImVEFESJIichZUQURImKAQCL/4EUEkAAMIv/gRkSQAAoi/+BKBJAACCL/4EyEkAAGIv/gTwSQAAQi/+BRhJAAAiL/4FQEkEAAyNEiSJC//o=", "clear": "DIEBQw=="}, "desc": "Debt Algorand Standard Application.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "networks": {}, "source": {"approval": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCAzMiAxNTAwCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUgInN0YXR1cyIgImV2ZW50X2N1cnNvciIgInNjaGVkdWxlX2VudHJ5X2NvdW50IiAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIiAiZml4ZWRfcG9pbnRfc2NhbGUiICJhY2NydWVkX2ludGVyZXN0IiAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIgMHg0MTIzICJub21pbmFsX2ludGVyZXN0X3JhdGUiICJjb250cmFjdF90eXBlIiAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiICJyZXNlcnZlZF9wcmluY2lwYWwiICJ0b3RhbF91bml0cyIgIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iICJyZXNlcnZlZF9pbnRlcmVzdCIgImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIgMHg1MjNhNDE1MjUyMjMgInNldHRsZW1lbnRfYXNzZXRfaWQiICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIgMHg1MjNhNDE1NTU0MjMgMHg1MjNhNTA1OTQ0MjMgMHg1MjNhNGQ0ZTQ3MjMgMHg1MzIzIDB4NTIzYTRkNGY0MzIzIDB4NTIzYTU0NTI1MzIzIDB4NTIzYTRmNTA0NDIzICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiICJ0cmFuc2Zlcl9vcGVuaW5nX2RhdGUiICJ0cmFuc2Zlcl9jbG9zdXJlX2RhdGUiICJyYXRlX3Jlc2V0X2Zsb29yIiAicmF0ZV9yZXNldF9jYXAiICJjb250cmFjdF9zdXNwZW5kZWQiICJkZWZhdWx0ZWQiICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIiAicmF0ZV9yZXNldF9zcHJlYWQiICJyYXRlX3Jlc2V0X211bHRpcGxpZXIiICJyYXRlX3Jlc2V0X25leHQiICJoYXNfcmF0ZV9yZXNldF9mbG9vciIgImhhc19yYXRlX3Jlc2V0X2NhcCIgMHgwMCAicHJvc3BlY3R1c19oYXNoIiAicHJvc3BlY3R1c191cmwiICJkZW5vbWluYXRpb25fYXNzZXRfaWQiICJtYXR1cml0eV9kYXRlIiAiZGF5X2NvdW50X2NvbnZlbnRpb24iIDB4MDY4MTAxIDB4MDAwMAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4LTI5CiAgICAvLyAjIFJCQUMgUm9sZXMKICAgIC8vIHNlbGYuYXJyYW5nZXIgPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX0FSUkFOR0VSKQogICAgYnl0ZWMgMTggLy8gMHg1MjNhNDE1MjUyMjMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMAogICAgLy8gc2VsZi5vcF9kYWVtb24gPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX09QX0RBRU1PTikKICAgIGJ5dGVjIDI3IC8vIDB4NTIzYTRmNTA0NDIzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NDctNDgKICAgIC8vICMgQ29udHJhY3QgR292ZXJuYW5jZQogICAgLy8gc2VsZi5jb250cmFjdF9zdXNwZW5kZWQgPSBGYWxzZQogICAgYnl0ZWMgMzMgLy8gImNvbnRyYWN0X3N1c3BlbmRlZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjUwLTUxCiAgICAvLyAjIENvbnRyYWN0IFBlcmZvcm1hbmNlCiAgICAvLyBzZWxmLmRlZmF1bHRlZCA9IEZhbHNlCiAgICBieXRlYyAzNCAvLyAiZGVmYXVsdGVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1Ni01NwogICAgLy8gIyBDb250cmFjdAogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKQogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OAogICAgLy8gc2VsZi5jb250cmFjdF90eXBlID0gVUludDY0KCkKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MC02MQogICAgLy8gIyBQcm9zcGVjdHVzIChJbmZvcm1hdGlvbmFsKQogICAgLy8gc2VsZi5wcm9zcGVjdHVzX2hhc2ggPSBCeXRlcygpCiAgICBieXRlYyA0MiAvLyAicHJvc3BlY3R1c19oYXNoIgogICAgcHVzaGJ5dGVzIDB4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjIKICAgIC8vIHNlbGYucHJvc3BlY3R1c191cmwgPSBTdHJpbmcoKQogICAgYnl0ZWMgNDMgLy8gInByb3NwZWN0dXNfdXJsIgogICAgcHVzaGJ5dGVzICIiCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjQtNjUKICAgIC8vICMgRGVub21pbmF0aW9uCiAgICAvLyBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCA9IEFzc2V0KCkKICAgIGJ5dGVjIDQ0IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBBc3NldCgpCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjgtNjkKICAgIC8vICMgVGltZQogICAgLy8gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGUgPSB0eXAuVGltZVN0YW1wKCkKICAgIGJ5dGVjIDI4IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcwCiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSB0eXAuVGltZVN0YW1wKCkKICAgIGJ5dGVjIDQ1IC8vICJtYXR1cml0eV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MQogICAgLy8gc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgPSB0eXAuVGltZVN0YW1wKCkKICAgIGJ5dGVjIDI5IC8vICJ0cmFuc2Zlcl9vcGVuaW5nX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcyCiAgICAvLyBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgMzAgLy8gInRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzQtNzUKICAgIC8vICMgRGF5IENvdW50IENvbnZlbnRpb24KICAgIC8vIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPSBVSW50NjQoKQogICAgYnl0ZWMgNDYgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3Ny03OAogICAgLy8gIyBVbml0cwogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IFVJbnQ2NCgpCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc5CiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID0gVUludDY0KCkKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODEtODIKICAgIC8vICMgUHJpbmNpcGFsCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID0gVUludDY0KCkKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODMKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gVUludDY0KCkKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODUKICAgIC8vIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiA9IEZhbHNlCiAgICBieXRlYyAzNSAvLyAiZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODctODgKICAgIC8vICMgSW50ZXJlc3QKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OQogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ID0gVUludDY0KCkKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkxLTkyCiAgICAvLyAjIEludGVyZXN0IFJhdGVzCiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzCiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkID0gVUludDY0KCkKICAgIGJ5dGVjIDM2IC8vICJyYXRlX3Jlc2V0X3NwcmVhZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9tdWx0aXBsaWVyID0gVUludDY0KCkKICAgIGJ5dGVjIDM3IC8vICJyYXRlX3Jlc2V0X211bHRpcGxpZXIiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfZmxvb3IgPSBVSW50NjQoKQogICAgYnl0ZWMgMzEgLy8gInJhdGVfcmVzZXRfZmxvb3IiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfY2FwID0gVUludDY0KCkKICAgIGJ5dGVjIDMyIC8vICJyYXRlX3Jlc2V0X2NhcCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTcKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9uZXh0ID0gVUludDY0KCkKICAgIGJ5dGVjIDM4IC8vICJyYXRlX3Jlc2V0X25leHQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4CiAgICAvLyBzZWxmLmhhc19yYXRlX3Jlc2V0X2Zsb29yID0gRmFsc2UKICAgIGJ5dGVjIDM5IC8vICJoYXNfcmF0ZV9yZXNldF9mbG9vciIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTkKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwID0gRmFsc2UKICAgIGJ5dGVjIDQwIC8vICJoYXNfcmF0ZV9yZXNldF9jYXAiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMS0xMDIKICAgIC8vICMgUHJpbWFyeSBEaXN0cmlidXRpb24KICAgIC8vIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsID0gVUludDY0KCkKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMwogICAgLy8gc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNS0xMDYKICAgIC8vICMgQ3VtdWxhdGl2ZSBQZXItVW5pdCBGaXhlZC1Qb2ludCBJbmRleGVzCiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggPSBVSW50NjQoKQogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNwogICAgLy8gc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNQogICAgLy8gc2VsZi5ldmVudF9jdXJzb3IgPSBVSW50NjQoKQogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTYKICAgIC8vIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgPSBVSW50NjQoKQogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExOC0xMTkKICAgIC8vICMgU2NhbGluZwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjIzCiAgICAvLyBhc3NlcnQgVHhuLmdsb2JhbF9udW1fYnl0ZV9zbGljZSA9PSBjZmcuR0xPQkFMX0JZVEVTLCBlcnIuV1JPTkdfR0xPQkFMX0JZVEVTCiAgICB0eG4gR2xvYmFsTnVtQnl0ZVNsaWNlCiAgICBwdXNoaW50IDEwCiAgICA9PQogICAgYXNzZXJ0IC8vIFdyb25nIEdsb2JhbCBCeXRlcyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6MjQKICAgIC8vIGFzc2VydCBUeG4uZ2xvYmFsX251bV91aW50ID09IGNmZy5HTE9CQUxfVUlOVFMsIGVyci5XUk9OR19HTE9CQUxfVUlOVFMKICAgIHR4biBHbG9iYWxOdW1VaW50CiAgICBwdXNoaW50IDU0CiAgICA9PQogICAgYXNzZXJ0IC8vIFdyb25nIEdsb2JhbCBVSW50cyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6MjUKICAgIC8vIGFzc2VydCBUeG4ubG9jYWxfbnVtX2J5dGVfc2xpY2UgPT0gY2ZnLkxPQ0FMX0JZVEVTLCBlcnIuV1JPTkdfTE9DQUxfQllURVMKICAgIHR4biBMb2NhbE51bUJ5dGVTbGljZQogICAgIQogICAgYXNzZXJ0IC8vIFdyb25nIExvY2FsIEJ5dGVzIGFsbG9jYXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kX2FzYS9jb250cmFjdC5weToyNgogICAgLy8gYXNzZXJ0IFR4bi5sb2NhbF9udW1fdWludCA9PSBjZmcuTE9DQUxfVUlOVFMsIGVyci5XUk9OR19MT0NBTF9VSU5UUwogICAgdHhuIExvY2FsTnVtVWludAogICAgIQogICAgYXNzZXJ0IC8vIFdyb25nIExvY2FsIFVJbnRzIGFsbG9jYXRpb24KCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjgtMTgKICAgIC8vIGNsYXNzIERBU0EoCiAgICAvLyAgICAgUGF5bWVudEFnZW50LAogICAgLy8gICAgIFRyYW5zZmVyQWdlbnQsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyAgICAgYXZtX3ZlcnNpb249MTIsCiAgICAvLyApOgogICAgcHVzaGJ5dGVzIDB4OTE0ZjA0ZWIgLy8gbWV0aG9kICJjb250cmFjdF91cGRhdGUoKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX2NvbnRyYWN0X3VwZGF0ZV9yb3V0ZUA0CgptYWluX3N3aXRjaF9jYXNlX25leHRANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kX2FzYS9jb250cmFjdC5weTo4LTE4CiAgICAvLyBjbGFzcyBEQVNBKAogICAgLy8gICAgIFBheW1lbnRBZ2VudCwKICAgIC8vICAgICBUcmFuc2ZlckFnZW50LAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gICAgIGF2bV92ZXJzaW9uPTEyLAogICAgLy8gKToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJ6IG1haW5fY3JlYXRlX05vT3BAMzMKICAgIHB1c2hieXRlc3MgMHhiNDQ2MThjOCAweGU3ODMyNTI5IDB4OTQzODg3MjMgMHg2Yzg1ZTNlZSAweGJkZDFhOTQ0IDB4N2MwZjE4MTIgMHgxNGZjMTBlZiAweDc0YTcyOTdmIDB4MDlkNGZlMTQgMHg5YTliZmE4NSAweDg1ZWVkMzNkIDB4YWIyYzBmYzQgMHhkOWYyMjVhYyAweDk4ODM1MDVhIDB4OGVhNmU3NGMgMHgwMmFmNTU3YSAweDgyZjcxYjJkIDB4ZWYwNGY1ZDMgMHhkZjM0MzU1MCAweDNkYmU4MGJkIDB4MWUzZTQ4ZTcgMHgzOTI0MWZhMyAweDAxMGM4Mjk5IDB4NzQwNmFjZDIgMHgxYTcyYTJlZSAvLyBtZXRob2QgImZ1bmRfZHVlX2Nhc2hmbG93cyh1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJjbGFpbV9kdWVfY2FzaGZsb3dzKGFkZHJlc3MsYnl0ZVtdKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYnl0ZVtdKSIsIG1ldGhvZCAidHJhbnNmZXJfc2V0X3NjaGVkdWxlKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbihhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInRyYW5zZmVyKGFkZHJlc3MsYWRkcmVzcyx1aW50NjQpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X3N1c3BlbnNpb24oYWRkcmVzcyxib29sKXVpbnQ2NCIsIG1ldGhvZCAiYWNjb3VudF9vcGVuKGFkZHJlc3MsYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgImFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzcyhhZGRyZXNzLGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X2dldF9wb3NpdGlvbihhZGRyZXNzKShhZGRyZXNzLHVpbnQ2NCx1aW50NjQsYm9vbCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAiY29udHJhY3RfY29uZmlnKCh1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxib29sLGJvb2wsYm9vbCx1aW50NjQpLCh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCksKGJ5dGVbMzJdLHN0cmluZykpdWludDY0IiwgbWV0aG9kICJjb250cmFjdF9zY2hlZHVsZSh1aW50NjQsYm9vbCwodWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NClbXSl1aW50NjQiLCBtZXRob2QgImNvbnRyYWN0X2V4ZWN1dGVfaWVkKCl1aW50NjQiLCBtZXRob2QgImFwcGx5X25vbl9jYXNoX2V2ZW50KHVpbnQ2NCwodWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIsIG1ldGhvZCAiYXBwZW5kX29ic2VydmVkX2Nhc2hfZXZlbnQoKHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIsIG1ldGhvZCAiY29udHJhY3RfZ2V0X3N0YXRlKCkodWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudCgpKHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJyYmFjX3JvdGF0ZV9hcnJhbmdlcihhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19zZXRfb3BfZGFlbW9uKGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX2Fzc2lnbl9yb2xlKHVpbnQ4LGFkZHJlc3MsKHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19yZXZva2Vfcm9sZSh1aW50OCxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19jb250cmFjdF9zdXNwZW5zaW9uKGJvb2wpdWludDY0IiwgbWV0aG9kICJyYmFjX2NvbnRyYWN0X2RlZmF1bHQoYm9vbCl1aW50NjQiLCBtZXRob2QgInJiYWNfZ2V0X2FycmFuZ2VyKClhZGRyZXNzIiwgbWV0aG9kICJyYmFjX2dldF9hZGRyZXNzX3JvbGVzKGFkZHJlc3MpKGJvb2wsYm9vbCxib29sLGJvb2wsYm9vbCkiLCBtZXRob2QgInJiYWNfZ2V0X3JvbGVfdmFsaWRpdHkodWludDgsYWRkcmVzcykodWludDY0LHVpbnQ2NCkiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBmdW5kX2R1ZV9jYXNoZmxvd3MgY2xhaW1fZHVlX2Nhc2hmbG93cyB0cmFuc2Zlcl9zZXRfc2NoZWR1bGUgcHJpbWFyeV9kaXN0cmlidXRpb24gdHJhbnNmZXIgYWNjb3VudF9zdXNwZW5zaW9uIGFjY291bnRfb3BlbiBhY2NvdW50X3VwZGF0ZV9wYXltZW50X2FkZHJlc3MgYWNjb3VudF9nZXRfcG9zaXRpb24gY29udHJhY3RfY29uZmlnIGNvbnRyYWN0X3NjaGVkdWxlIGNvbnRyYWN0X2V4ZWN1dGVfaWVkIGFwcGx5X25vbl9jYXNoX2V2ZW50IGFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50IGNvbnRyYWN0X2dldF9zdGF0ZSBjb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnQgcmJhY19yb3RhdGVfYXJyYW5nZXIgcmJhY19zZXRfb3BfZGFlbW9uIHJiYWNfYXNzaWduX3JvbGUgcmJhY19yZXZva2Vfcm9sZSByYmFjX2NvbnRyYWN0X3N1c3BlbnNpb24gcmJhY19jb250cmFjdF9kZWZhdWx0IHJiYWNfZ2V0X2FycmFuZ2VyIHJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXMgcmJhY19nZXRfcm9sZV92YWxpZGl0eQogICAgZXJyCgptYWluX2NyZWF0ZV9Ob09wQDMzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjgtMTgKICAgIC8vIGNsYXNzIERBU0EoCiAgICAvLyAgICAgUGF5bWVudEFnZW50LAogICAgLy8gICAgIFRyYW5zZmVyQWdlbnQsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyAgICAgYXZtX3ZlcnNpb249MTIsCiAgICAvLyApOgogICAgcHVzaGJ5dGVzIDB4OTU2ZDcxNTYgLy8gbWV0aG9kICJjb250cmFjdF9jcmVhdGUoYWRkcmVzcyl1aW50NjQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBjb250cmFjdF9jcmVhdGUKICAgIGVycgoKbWFpbl9jb250cmFjdF91cGRhdGVfcm91dGVANDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgNCAvLyBVcGRhdGVBcHBsaWNhdGlvbgogICAgPT0KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0CiAgICBiIGNvbnRyYWN0X3VwZGF0ZQoKCi8vIF9wdXlhX2xpYi51dGlsLmVuc3VyZV9idWRnZXQocmVxdWlyZWRfYnVkZ2V0OiB1aW50NjQsIGZlZV9zb3VyY2U6IHVpbnQ2NCkgLT4gdm9pZDoKZW5zdXJlX2J1ZGdldDoKICAgIHByb3RvIDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDEwCiAgICArCgplbnN1cmVfYnVkZ2V0X3doaWxlX3RvcEAxOgogICAgZnJhbWVfZGlnIDAKICAgIGdsb2JhbCBPcGNvZGVCdWRnZXQKICAgID4KICAgIGJ6IGVuc3VyZV9idWRnZXRfYWZ0ZXJfd2hpbGVANgogICAgaXR4bl9iZWdpbgogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGJ5dGVjIDQ3IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbQogICAgYnl0ZWMgNDcgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KICAgIGZyYW1lX2RpZyAtMQogICAgc3dpdGNoIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMEAzIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMUA0CgplbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX25leHRANToKICAgIGl0eG5fc3VibWl0CiAgICBiIGVuc3VyZV9idWRnZXRfd2hpbGVfdG9wQDEKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMUA0OgogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgaXR4bl9maWVsZCBGZWUKICAgIGIgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV9uZXh0QDUKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMEAzOgogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBiIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfbmV4dEA1CgplbnN1cmVfYnVkZ2V0X2FmdGVyX3doaWxlQDY6CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnBheW1lbnRfYWdlbnQuUGF5bWVudEFnZW50LmZ1bmRfZHVlX2Nhc2hmbG93c1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmZ1bmRfZHVlX2Nhc2hmbG93czoKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gMTMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjY4CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2OQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3MAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDcKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzIKICAgIC8vIGlmIHNlbGYuX2lzX2R5bmFtaWNfYW5udWl0eSgpOgogICAgY2FsbHN1YiBfaXNfZHluYW1pY19hbm51aXR5CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzYtNzcKICAgIC8vICsgbWF4X2V2ZW50X2NvdW50CiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfRlVORF9EVUVfQ0FTSEZMT1dTX1BFUl9FVkVOVF9CVURHRVQpCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3NwogICAgLy8gKiBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19QRVJfRVZFTlRfQlVER0VUKQogICAgcHVzaGludCAxMDAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3Ni03NwogICAgLy8gKyBtYXhfZXZlbnRfY291bnQKICAgIC8vICogVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfUEVSX0VWRU5UX0JVREdFVCkKICAgICoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3NQogICAgLy8gVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfQkFTRV9CVURHRVQpCiAgICBpbnRjIDQgLy8gMTUwMAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojc1LTc3CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19CQVNFX0JVREdFVCkKICAgIC8vICsgbWF4X2V2ZW50X2NvdW50CiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfRlVORF9EVUVfQ0FTSEZMT1dTX1BFUl9FVkVOVF9CVURHRVQpCiAgICArCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzMtNzkKICAgIC8vIGVuc3VyZV9idWRnZXQoCiAgICAvLyAgICAgcmVxdWlyZWRfYnVkZ2V0PSgKICAgIC8vICAgICAgICAgVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfQkFTRV9CVURHRVQpCiAgICAvLyAgICAgICAgICsgbWF4X2V2ZW50X2NvdW50CiAgICAvLyAgICAgICAgICogVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfUEVSX0VWRU5UX0JVREdFVCkKICAgIC8vICAgICApLAogICAgLy8gKQogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4MQogICAgLy8gcHJvY2Vzc2VkX2V2ZW50cyA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjgyCiAgICAvLyBmdW5kZWRfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDE0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODMKICAgIC8vIGZ1bmRlZF9wcmluY2lwYWwgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDEzCgpmdW5kX2R1ZV9jYXNoZmxvd3Nfd2hpbGVfdG9wQDQ6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODYKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgPCBtYXhfZXZlbnRfY291bnQKICAgIGRpZyA0CiAgICBkaWcgMQogICAgPAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojg2LTg3CiAgICAvLyBwcm9jZXNzZWRfZXZlbnRzIDwgbWF4X2V2ZW50X2NvdW50CiAgICAvLyBhbmQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAMTEKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4NwogICAgLy8gYW5kIHNlbGYuZXZlbnRfY3Vyc29yIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICA8CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODYtODcKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgPCBtYXhfZXZlbnRfY291bnQKICAgIC8vIGFuZCBzZWxmLmV2ZW50X2N1cnNvciA8IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQKICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl93aGlsZUAxMQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojg5CiAgICAvLyBlbnRyeSA9IHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLmV2ZW50X2N1cnNvcikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICBkdXAKICAgIGJ1cnkgMTcKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5MAogICAgLy8gaWYgZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcDoKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSAzCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDExCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6OTIKICAgIC8vIGlmIG5vdCBzZWxmLl9ldmVudF9pc19jYXNoKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkpOgogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBidXJ5IDE2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNTEKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgaW50Y18yIC8vIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM1MC0zNTQKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX01EKSwKICAgIC8vICkKICAgID09CiAgICBkdXAKICAgIGJ1cnkgNAogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX3RydWVANTIKICAgIGRpZyAxNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzUyCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzUwLTM1NAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfTUQpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDUyCiAgICBkaWcgMTQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM1MwogICAgLy8gVUludDY0KGVudW1zLkVWVF9NRCksCiAgICBwdXNoaW50IDE5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNTAtMzU0CiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9NRCksCiAgICAvLyApCiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VANTMKCmZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX3RydWVANTI6CiAgICBpbnRjXzEgLy8gMQoKZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfbWVyZ2VANTQ6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6OTIKICAgIC8vIGlmIG5vdCBzZWxmLl9ldmVudF9pc19jYXNoKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkpOgogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NDgKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF9pZCA9PSBzZWxmLmV2ZW50X2N1cnNvciwgZXJyLklOVkFMSURfRVZFTlRfQ1VSU09SCiAgICBkaWcgMTUKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgY3Vyc29yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NDkKICAgIC8vIGFzc2VydCBlbnRyeS5zY2hlZHVsZWRfdGltZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwgZXJyLk5PX0RVRV9DQVNIRkxPVwogICAgZGlnIDEKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIDw9CiAgICBhc3NlcnQgLy8gTm8gZHVlIGNhc2hmbG93IHRvIHBheQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDEzCiAgICAvLyBpZiBldmVudF90eXBlIG5vdCBpbiAoVUludDY0KGVudW1zLkVWVF9JUCksIFVJbnQ2NChlbnVtcy5FVlRfTUQpKToKICAgIGRpZyAyCiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTUKICAgIGRpZyAxNAogICAgcHVzaGludCAxOQogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDE0CiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAxMQoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X2ludGVyZXN0X2Ftb3VudEAxNjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQyNgogICAgLy8gZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGRpZyAxNQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSAxNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDI3CiAgICAvLyBpZiBldmVudF90eXBlIG5vdCBpbiAoVUludDY0KGVudW1zLkVWVF9QUiksIFVJbnQ2NChlbnVtcy5FVlRfTUQpKToKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxOQogICAgZGlnIDE0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MjgKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDYKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTUzCiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA9IGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBkaWcgMTUKICAgIHB1c2hpbnQgNDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBidXJ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1NgogICAgLy8gaWYgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCk6CiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUAyOQogICAgZGlnIDcKICAgIGJ1cnkgOQoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzItNTc0CiAgICAvLyAjIEZ1bmRpbmcgdXNlcyBwZXItdW5pdCBjdW11bGF0aXZlIGluZGljZXMgc28gZWFjaCBob2xkZXIgY2FuIHNldHRsZQogICAgLy8gIyBpbmRlcGVuZGVudGx5IGZyb20gaXRzIGN1cnJlbnQgdW5pdCBiYWxhbmNlLgogICAgLy8gaW50ZXJlc3RfaW5kZXhfZGVsdGEgPSBzZWxmLl9hbW91bnRfdG9faW5kZXhfZGVsdGEoaW50ZXJlc3RfYW1vdW50X2R1ZSkKICAgIGRpZyAxMAogICAgY2FsbHN1YiBfYW1vdW50X3RvX2luZGV4X2RlbHRhCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzUKICAgIC8vIHByaW5jaXBhbF9pbmRleF9kZWx0YSA9IHNlbGYuX2Ftb3VudF90b19pbmRleF9kZWx0YShwcmluY2lwYWxfYW1vdW50X2R1ZSkKICAgIGRpZyA2CiAgICBjYWxsc3ViIF9hbW91bnRfdG9faW5kZXhfZGVsdGEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU3NgogICAgLy8gaW50ZXJlc3RfYW1vdW50ID0gc2VsZi5faW5kZXhfZGVsdGFfdG9fYW1vdW50KGludGVyZXN0X2luZGV4X2RlbHRhKQogICAgZGlnIDEKICAgIGNhbGxzdWIgX2luZGV4X2RlbHRhX3RvX2Ftb3VudAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBidXJ5IDE1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzcKICAgIC8vIHByaW5jaXBhbF9hbW91bnQgPSBzZWxmLl9pbmRleF9kZWx0YV90b19hbW91bnQocHJpbmNpcGFsX2luZGV4X2RlbHRhKQogICAgZHVwCiAgICBjYWxsc3ViIF9pbmRleF9kZWx0YV90b19hbW91bnQKICAgIGR1cAogICAgYnVyeSAxMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTc4CiAgICAvLyByZXF1aXJlZF9hbW91bnQgPSBpbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50CiAgICBkaWcgMgogICAgZGlnIDEKICAgICsKICAgIGR1cAogICAgYnVyeSA5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MzQKICAgIC8vIGJhbGFuY2UgPSBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBvcHRlZCBpbnRvIGFzc2V0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NTYKICAgIC8vIHJldHVybiBzZWxmLnJlc2VydmVkX2ludGVyZXN0ICsgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICBkaWcgMQogICAgKwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzM2CiAgICAvLyBhc3NlcnQgYmFsYW5jZSA+PSByZXNlcnZlZF90b3RhbCwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGRpZyAyCiAgICBkaWcgMQogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzM3CiAgICAvLyByZXR1cm4gYmFsYW5jZSAtIHJlc2VydmVkX3RvdGFsCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIC0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4MAogICAgLy8gc2VsZi5fYXZhaWxhYmxlX3NldHRsZW1lbnRfZnVuZHMoKSA+PSByZXF1aXJlZF9hbW91bnQKICAgIHVuY292ZXIgMgogICAgPj0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU3OS01ODEKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5fYXZhaWxhYmxlX3NldHRsZW1lbnRfZnVuZHMoKSA+PSByZXF1aXJlZF9hbW91bnQKICAgIC8vICksIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcyBmb3IgdGhlIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4MwogICAgLy8gc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCArPSBpbnRlcmVzdF9hbW91bnQKICAgIHVuY292ZXIgMwogICAgKwogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4NAogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgKz0gcHJpbmNpcGFsX2Ftb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIGV4aXN0cwogICAgKwogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1ODUKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCArPSBpbnRlcmVzdF9pbmRleF9kZWx0YQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggZXhpc3RzCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4NgogICAgLy8gc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCArPSBwcmluY2lwYWxfaW5kZXhfZGVsdGEKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggZXhpc3RzCiAgICArCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTg3CiAgICAvLyBpZiBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpOgogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgcHVzaGludCAzCiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUA0MAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTg4LTU4OQogICAgLy8gIyBGb3IgUFIsIHRoZSBwZXJpb2QgaW50ZXJlc3Qgc3RheXMgYWNjcnVlZCB1bnRpbCBhIGxhdGVyIElQIG9yIE1ELgogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ICs9IHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZGlnIDE2CiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBidXJ5IDE4CiAgICArCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQxOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTkyCiAgICAvLyBpZiBub3Qgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCkgb3IgZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSA9PSBVSW50NjQoCiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDQzCiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTItNTk0CiAgICAvLyBpZiBub3Qgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCkgb3IgZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSA9PSBVSW50NjQoCiAgICAvLyAgICAgZW51bXMuRVZUX01ECiAgICAvLyApOgogICAgcHVzaGludCAxOQogICAgPT0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQ0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUA0MzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5NQogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gZW50cnkubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZGlnIDE1CiAgICBwdXNoaW50IDQxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTYKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGRpZyA4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTk3CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBuZXh0X2ludGVyZXN0X2Jhc2UKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBkaWcgOQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5OAogICAgLy8gc2VsZi5ldmVudF9jdXJzb3IgKz0gVUludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAwCiAgICAvLyBpZiBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoCiAgICBkaWcgMTUKICAgIGV4dHJhY3QgOCAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MDAtNjAyCiAgICAvLyBpZiBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoCiAgICAvLyAgICAgZW51bXMuRVZUX01ECiAgICAvLyApIGFuZCBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9PSBVSW50NjQoMCk6CiAgICBwdXNoYnl0ZXMgMHgxMwogICAgYj09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0NwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAyCiAgICAvLyApIGFuZCBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9PSBVSW50NjQoMCk6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwMC02MDIKICAgIC8vIGlmIGVudHJ5LmV2ZW50X3R5cGUgPT0gYXJjNC5VSW50OCgKICAgIC8vICAgICBlbnVtcy5FVlRfTUQKICAgIC8vICkgYW5kIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID09IFVJbnQ2NCgwKToKICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0NwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAzCiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbnVtcy5TVEFUVVNfRU5ERUQpCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBwdXNoaW50IDIwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwNAogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gVUludDY0KDApCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0NzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwNi02MTAKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1pbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50LAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PWludGVyZXN0X2Ftb3VudCArIHByaW5jaXBhbF9hbW91bnQsCiAgICAvLyApCiAgICBkaWcgMTUKICAgIGRpZyA0CiAgICBkdXAKICAgIGNhbGxzdWIgX2VtaXRfZXhlY3V0aW9uX2V2ZW50CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5NgogICAgLy8gZnVuZGVkX2ludGVyZXN0ICs9IGludGVyZXN0X2Ftb3VudAogICAgZGlnIDEzCiAgICBkaWcgMTIKICAgICsKICAgIGJ1cnkgMTQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5NwogICAgLy8gZnVuZGVkX3ByaW5jaXBhbCArPSBwcmluY2lwYWxfYW1vdW50CiAgICBkaWcgMTIKICAgIGRpZyA3CiAgICArCiAgICBidXJ5IDEzCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6OTgKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgKz0gVUludDY0KDEpCiAgICBkaWcgNAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgNQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3Nfd2hpbGVfdG9wQDQKCmZ1bmRfZHVlX2Nhc2hmbG93c19lbHNlX2JvZHlANDA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTEKICAgIC8vIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0MQoKZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlAMjk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTcKICAgIC8vIGV2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ1cnkgMTYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1OC01NjAKICAgIC8vICMgRHluYW1pYyBhbm51aXRpZXMgZGVyaXZlIG5leHQgc3RhdGUgZnJvbSB0aGUgcGF5bWVudCBkZWNvbXBvc2l0aW9uLAogICAgLy8gIyBub3Qgb25seSBmcm9tIHRoZSBwcmVjb21wdXRlZCBgbmV4dF8qYCBmaWVsZHMuCiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpOgogICAgcHVzaGludCAzCiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUAzMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTYyCiAgICAvLyBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCAtIHByaW5jaXBhbF9hbW91bnRfZHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGRpZyA2CiAgICAtCiAgICBkdXAKICAgIGJ1cnkgOQogICAgYnVyeSA5CiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDMxOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY1CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9JUCk6CiAgICBkaWcgMTQKICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUAzMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY2CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGJ1cnkgOQogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY3CiAgICAvLyBuZXh0X2ludGVyZXN0X2Jhc2UgPSBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGJ1cnkgMTAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgZXhpc3RzCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDMzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY4CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCk6CiAgICBkaWcgMTQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlAMzQKICAgIGRpZyA3CiAgICBidXJ5IDkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzgKCmZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDM0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY5CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTcwCiAgICAvLyBuZXh0X2ludGVyZXN0X2Jhc2UgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzgKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDI5CiAgICAvLyBpZiBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKToKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzMAogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKToKICAgIGRpZyAxNAogICAgcHVzaGludCAxOQogICAgPT0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDIyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzEKICAgIC8vIHJldHVybiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzIKICAgIC8vIGludGVyZXN0X2R1ZSA9IHNlbGYuYWNjcnVlZF9pbnRlcmVzdCArIHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZGlnIDE2CiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBidXJ5IDE4CiAgICArCiAgICBkdXAKICAgIGJ1cnkgMTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzMwogICAgLy8gaWYgc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIDw9IGludGVyZXN0X2R1ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIGV4aXN0cwogICAgPj0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDI0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzQKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzUKICAgIC8vIHByaW5jaXBhbF9hbW91bnQgPSBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gLSBpbnRlcmVzdF9kdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIGV4aXN0cwogICAgZGlnIDEwCiAgICAtCiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDM2CiAgICAvLyBpZiBwcmluY2lwYWxfYW1vdW50ID4gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWw6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgID4KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDI2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzcKICAgIC8vIHJldHVybiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjY6CiAgICBkaWcgNgogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTIKICAgIC8vIHByaW5jaXBhbF9hbW91bnRfZHVlID0gc2VsZi5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudChlbnRyeSkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnRAMjgKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDI3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDQwCiAgICAvLyBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA8PSBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZGlnIDE1CiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBkdXAyCiAgICA8PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDM5LTQ0MQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA8PSBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NDIKICAgIC8vIHJldHVybiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCAtIGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBzd2FwCiAgICAtCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MTUKICAgIC8vIHJldHVybiBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgKyBzZWxmLl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KGVudHJ5KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgIGRpZyAxNgogICAgY2FsbHN1YiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudAogICAgYnVyeSAxOAogICAgKwogICAgYnVyeSAxMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTUxCiAgICAvLyBpbnRlcmVzdF9hbW91bnRfZHVlID0gc2VsZi5fZW50cnlfaW50ZXJlc3RfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfaW50ZXJlc3RfYW1vdW50QDE2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAMTE6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTAwCiAgICAvLyBhc3NlcnQgcHJvY2Vzc2VkX2V2ZW50cyA+IFVJbnQ2NCgwKSwgZXJyLk5PX0RVRV9DQVNIRkxPVwogICAgZGlnIDQKICAgIGR1cAogICAgYXNzZXJ0IC8vIE5vIGR1ZSBjYXNoZmxvdyB0byBwYXkKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMDQKICAgIC8vIHRvdGFsX2Z1bmRlZD1mdW5kZWRfaW50ZXJlc3QgKyBmdW5kZWRfcHJpbmNpcGFsLAogICAgZGlnIDE0CiAgICBkdXAKICAgIGRpZyAxNQogICAgZHVwCiAgICBjb3ZlciAzCiAgICArCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA2CiAgICAvLyB0aW1lc3RhbXA9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTAxLTEwNwogICAgLy8gcmV0dXJuIHR5cC5DYXNoRnVuZGluZ1Jlc3VsdCgKICAgIC8vICAgICBmdW5kZWRfaW50ZXJlc3Q9ZnVuZGVkX2ludGVyZXN0LAogICAgLy8gICAgIGZ1bmRlZF9wcmluY2lwYWw9ZnVuZGVkX3ByaW5jaXBhbCwKICAgIC8vICAgICB0b3RhbF9mdW5kZWQ9ZnVuZGVkX2ludGVyZXN0ICsgZnVuZGVkX3ByaW5jaXBhbCwKICAgIC8vICAgICBwcm9jZXNzZWRfZXZlbnRzPXByb2Nlc3NlZF9ldmVudHMsCiAgICAvLyAgICAgdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUA1MzoKICAgIGludGNfMCAvLyAwCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDU0CgoKLy8gbW9kdWxlcy5wYXltZW50X2FnZW50LlBheW1lbnRBZ2VudC5jbGFpbV9kdWVfY2FzaGZsb3dzW3JvdXRpbmddKCkgLT4gdm9pZDoKY2xhaW1fZHVlX2Nhc2hmbG93czoKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cG4gMgogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNQogICAgLy8gaWYgc2VsZi5vcF9kYWVtb24udmFsdWUgIT0gR2xvYmFsLnplcm9fYWRkcmVzczoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNyAvLyAweDUyM2E0ZjUwNDQyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wX2RhZW1vbiBleGlzdHMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE3CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjcgLy8gMHg1MjNhNGY1MDQ0MjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcF9kYWVtb24gZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE3LTE5CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIGJueiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfdHJ1ZUAxNAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE4CiAgICAvLyBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgdHhuIFNlbmRlcgogICAgZGlnIDMKICAgID09CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTctMTkKICAgIC8vIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICAvLyBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgYm56IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDE0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTkKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCAzMgogICAgPT0KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNy0xOQogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICBieiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VAMTUKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDE0OgogICAgaW50Y18xIC8vIDEKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUAxNjoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNi0yMAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyAgICAgb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vICAgICBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgLy8gKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCgpjbGFpbV9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTc6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTM5CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE0MAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDcKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTQzCiAgICAvLyBzZWxmLl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKGhvbGRpbmdfYWRkcmVzcykKICAgIGRpZyAyCiAgICBkdXAKICAgIGNhbGxzdWIgX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNDQKICAgIC8vIHNlbGYuX3NldHRsZV9wb3NpdGlvbihob2xkaW5nX2FkZHJlc3MpCiAgICBjYWxsc3ViIF9zZXR0bGVfcG9zaXRpb24KICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExNwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY2xhaW1hYmxlX2ludGVyZXN0CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBkdXAKICAgIHB1c2hpbnQgNzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExOAogICAgLy8gKyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jbGFpbWFibGVfcHJpbmNpcGFsCiAgICBkdXAKICAgIHB1c2hpbnQgODEKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExNy0xMTgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNsYWltYWJsZV9pbnRlcmVzdAogICAgLy8gKyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jbGFpbWFibGVfcHJpbmNpcGFsCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTQ2CiAgICAvLyBhc3NlcnQgdG90YWxfYW1vdW50ID4gVUludDY0KDApLCBlcnIuTk9fRFVFX0NBU0hGTE9XCiAgICBhc3NlcnQgLy8gTm8gZHVlIGNhc2hmbG93IHRvIHBheQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI1CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MuaXNfb3B0ZWRfaW4oCiAgICBleHRyYWN0IDAgMzIKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNgogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNS0yNwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLmlzX29wdGVkX2luKAogICAgLy8gICAgIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZAogICAgLy8gKQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNS0yOAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLmlzX29wdGVkX2luKAogICAgLy8gICAgIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZAogICAgLy8gKQogICAgLy8gYW5kIG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQKICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAyNAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI4CiAgICAvLyBhbmQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCAzODQKICAgIGdldGJpdAogICAgYm56IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAyNAogICAgaW50Y18xIC8vIDEKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUAyNToKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNTEKICAgIC8vIGlmIHNlbGYuX2lzX3BheW1lbnRfZXhlY3V0YWJsZShob2xkaW5nX2FkZHJlc3MpOgogICAgYnogY2xhaW1fZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozNAogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIHN3YXAKICAgIGRpZyAxCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozNC0zNQogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIC8vID49IHBheW1lbnRfYW1vdW50CiAgICBkaWcgNQogICAgZHVwCiAgICBjb3ZlciAyCiAgICA+PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjMzLTM2CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICAvLyAgICAgPj0gcGF5bWVudF9hbW91bnQKICAgIC8vICksIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcyBmb3IgdGhlIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNTMKICAgIC8vIHNlbGYuX3BheShzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MsIHRvdGFsX2Ftb3VudCkKICAgIGRpZyAyCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBkdXAKICAgIGV4dHJhY3QgMCAzMgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQwLTQ1CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9cmVjZWl2ZXIsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWFtb3VudCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQ0CiAgICAvLyBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgdW5jb3ZlciAzCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIHVuY292ZXIgMgogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0MAogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgcHVzaGludCA0IC8vIGF4ZmVyCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQwLTQ1CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9cmVjZWl2ZXIsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWFtb3VudCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMjUtMTI2CiAgICAvLyAjIEdldCB0aGUgY2xhaW1hYmxlIGFtb3VudHMgYmVmb3JlIHJlc2V0CiAgICAvLyBpbnRlcmVzdF9hbW91bnQgPSBwb3NpdGlvbi5jbGFpbWFibGVfaW50ZXJlc3QKICAgIGR1cAogICAgcHVzaGludCA3MwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSA5CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTI3CiAgICAvLyBwcmluY2lwYWxfYW1vdW50ID0gcG9zaXRpb24uY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgZHVwCiAgICBwdXNoaW50IDgxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAzCiAgICBidXJ5IDkKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMjktMTMwCiAgICAvLyAjIFJlc2V0IHRoZSBwb3NpdGlvbidzIGNsYWltYWJsZSBhbW91bnRzCiAgICAvLyBwb3NpdGlvbi5jbGFpbWFibGVfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBpdG9iCiAgICBzd2FwCiAgICBkaWcgMQogICAgcmVwbGFjZTIgNzMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzEKICAgIC8vIHBvc2l0aW9uLmNsYWltYWJsZV9wcmluY2lwYWwgPSBVSW50NjQoMCkKICAgIHN3YXAKICAgIHJlcGxhY2UyIDgxCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTMyCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHBvc2l0aW9uLmNvcHkoKQogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTM0CiAgICAvLyBhc3NlcnQgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCA+PSBpbnRlcmVzdF9hbW91bnQsIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX2ludGVyZXN0IGV4aXN0cwogICAgZHVwCiAgICBkaWcgMgogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzNQogICAgLy8gYXNzZXJ0IHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsID49IHByaW5jaXBhbF9hbW91bnQsIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICBkaWcgMwogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzNy0xMzgKICAgIC8vICMgVXBkYXRlIHRoZSBnbG9iYWwgcmVzZXJ2ZWQgaW50ZXJlc3QgYW5kIHByaW5jaXBhbCBhbW91bnRzCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0IC09IGludGVyZXN0X2Ftb3VudAogICAgc3dhcAogICAgLQogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzkKICAgIC8vIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIC09IHByaW5jaXBhbF9hbW91bnQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIHN3YXAKICAgIC0KICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKY2xhaW1fZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTU5CiAgICAvLyB0b3RhbF9hbW91bnQ9aW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudCwKICAgIGRpZyA1CiAgICBkdXAKICAgIGRpZyA2CiAgICBkdXAKICAgIGNvdmVyIDMKICAgICsKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNjAKICAgIC8vIHRpbWVzdGFtcD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNTYtMTYyCiAgICAvLyByZXR1cm4gdHlwLkNhc2hDbGFpbVJlc3VsdCgKICAgIC8vICAgICBpbnRlcmVzdF9hbW91bnQ9aW50ZXJlc3RfYW1vdW50LAogICAgLy8gICAgIHByaW5jaXBhbF9hbW91bnQ9cHJpbmNpcGFsX2Ftb3VudCwKICAgIC8vICAgICB0b3RhbF9hbW91bnQ9aW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudCwKICAgIC8vICAgICB0aW1lc3RhbXA9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgY29udGV4dD1wYXltZW50X2luZm8sCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgMgogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIHB1c2hieXRlcyAweDAwMjIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAyNDoKICAgIGludGNfMCAvLyAwCiAgICBiIGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUAyNQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX2ZhbHNlQDE1OgogICAgaW50Y18wIC8vIDAKICAgIGIgY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDE2CgoKLy8gbW9kdWxlcy50cmFuc2Zlcl9hZ2VudC5UcmFuc2ZlckFnZW50LnRyYW5zZmVyX3NldF9zY2hlZHVsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRyYW5zZmVyX3NldF9zY2hlZHVsZToKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo0MAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQxCiAgICAvLyBhc3NlcnQgb3Blbl9kYXRlIDwgY2xvc3VyZV9kYXRlLCBlcnIuSU5WQUxJRF9TT1JUSU5HCiAgICBkdXAyCiAgICA8CiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbXVzdCBiZSBzb3J0ZWQgaW4gc3RyaWN0bHkgYXNjZW5kaW5nIG9yZGVyCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQzCiAgICAvLyBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA9IG9wZW5fZGF0ZQogICAgYnl0ZWMgMjkgLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIHVuY292ZXIgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDQKICAgIC8vIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlID0gY2xvc3VyZV9kYXRlCiAgICBieXRlYyAzMCAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDUKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy50cmFuc2Zlcl9hZ2VudC5UcmFuc2ZlckFnZW50LnByaW1hcnlfZGlzdHJpYnV0aW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcHJpbWFyeV9kaXN0cmlidXRpb246CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjczCiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5wcmltYXJ5X2RlYWxlciwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDIyIC8vIDB4NTIzYTUwNTk0NDIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojc2CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo3NwogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojc4CiAgICAvLyBhc3NlcnQgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TRUQKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBjbG9zZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgY292ZXIgMwogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4MAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChob2xkaW5nX2FkZHJlc3MpCiAgICBzd2FwCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjgxCiAgICAvLyBhc3NlcnQgdW5pdHMgPiBVSW50NjQoMCksIGVyci5aRVJPX1VOSVRTCiAgICBkdXAKICAgIGFzc2VydCAvLyBDYW4gbm90IGRpc3RyaWJ1dGUgemVybyB1bml0cwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4MwogICAgLy8gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCArIHVuaXRzIDw9IHNlbGYudG90YWxfdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICArCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgPD0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODItODQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCArIHVuaXRzIDw9IHNlbGYudG90YWxfdW5pdHMKICAgIC8vICksIGVyci5PVkVSX0RJU1RSSUJVVElPTgogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCByZW1haW5pbmcgRC1BU0EgdW5pdHMKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODUKICAgIC8vIGlmIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI4IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlIGV4aXN0cwogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojg3CiAgICAvLyBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8PSBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI4IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlIGV4aXN0cwogICAgPD0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODYtODgKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPD0gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGUKICAgIC8vICksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TRUQKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBjbG9zZWQKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNDgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnJlc2VydmVkX3VuaXRzICs9IHVuaXRzCiAgICBkdXBuIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDMKICAgIGR1cAogICAgY292ZXIgMwogICAgKwogICAgaXRvYgogICAgcHVzaGludCA0MAogICAgc3dhcAogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6OTEKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgKz0gdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICArCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6OTIKICAgIC8vIHJldHVybiBzZWxmLnRvdGFsX3VuaXRzIC0gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIHN3YXAKICAgIC0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMudHJhbnNmZXJfYWdlbnQuVHJhbnNmZXJBZ2VudC50cmFuc2Zlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnRyYW5zZmVyOgogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTMwCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxMzEKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQ3CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuX3N0YXR1c19pc19wZW5kaW5nX2llZCgpLCBlcnIuUEVORElOR19JRUQKICAgICEKICAgIGFzc2VydCAvLyBJRUQgbm90IHlldCBleGVjdXRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxMwogICAgLy8gaWYgc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjkgLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICBieiB0cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTUKICAgIC8vIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjkgLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNC0xNgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gKSwgZXJyLkNMT1NFRF9UUkFOU0ZFUgogICAgYXNzZXJ0IC8vIFRyYW5zZmVyIGlzIGNsb3NlZAoKdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNwogICAgLy8gaWYgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzAgLy8gInRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICBieiB0cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTkKICAgIC8vIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDwgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGUKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMCAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIDwKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTgtMjAKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZQogICAgLy8gKSwgZXJyLkNMT1NFRF9UUkFOU0ZFUgogICAgYXNzZXJ0IC8vIFRyYW5zZmVyIGlzIGNsb3NlZAoKdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxMzUKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIGRpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA4CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIGJ5dGVjIDggLy8gMHg0MTIzCiAgICBkaWcgNQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA5CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjEzOAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChzZW5kZXJfaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDIKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTM5CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGR1cAogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNDAKICAgIC8vIGFzc2VydCBzZW5kZXJfaG9sZGluZ19hZGRyZXNzICE9IHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcywgZXJyLlNFTEZfVFJBTlNGRVIKICAgIHVuY292ZXIgMgogICAgIT0KICAgIGFzc2VydCAvLyBTZW5kZXIgYW5kIHJlY2VpdmVyIG11c3QgYmUgZGlmZmVyZW50CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE0MQogICAgLy8gYXNzZXJ0IHVuaXRzID4gVUludDY0KDApLCBlcnIuTlVMTF9UUkFOU0ZFUgogICAgZGlnIDEKICAgIGR1cAogICAgYXNzZXJ0IC8vIFRyYW5zZmVyIHVuaXRzIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTQyCiAgICAvLyBhc3NlcnQgdW5pdHMgPD0gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLCBlcnIuT1ZFUl9UUkFOU0ZFUgogICAgc3dhcAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIDw9CiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IHNlbmRlciB1bml0cyB0byB0cmFuc2ZlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzYzCiAgICAvLyBpZiBzZWxmLmV2ZW50X2N1cnNvciA+PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICA+PQogICAgYm56IHRyYW5zZmVyX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Fzc2VydF9ub19kdWVfZXZlbnRfcGVuZGluZ0AxMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzY1CiAgICAvLyBuZXh0X2VudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KHNlbGYuZXZlbnRfY3Vyc29yKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc2NwogICAgLy8gbmV4dF9lbnRyeS5zY2hlZHVsZWRfdGltZSA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NjYtNzY4CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIG5leHRfZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gKSwgZXJyLlBFTkRJTkdfQUNUVVNfRVZFTlQKICAgIGFzc2VydCAvLyBBQ1RVUyBldmVudCBub3QgeWV0IGV4ZWN1dGVkCgp0cmFuc2Zlcl9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9hc3NlcnRfbm9fZHVlX2V2ZW50X3BlbmRpbmdAMTA6CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE0NQogICAgLy8gc2VsZi5fZW5zdXJlX3VuaXRzX2FjdGl2YXRlZChzZW5kZXJfaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDMKICAgIGR1cAogICAgY2FsbHN1YiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNDYKICAgIC8vIHNlbGYuX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQocmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgY2FsbHN1YiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNDcKICAgIC8vIHNlbGYuX3NldHRsZV9wb3NpdGlvbihzZW5kZXJfaG9sZGluZ19hZGRyZXNzKQogICAgY2FsbHN1YiBfc2V0dGxlX3Bvc2l0aW9uCiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTQ4CiAgICAvLyBzZWxmLl9zZXR0bGVfcG9zaXRpb24ocmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzKQogICAgY2FsbHN1YiBfc2V0dGxlX3Bvc2l0aW9uCiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNTIKICAgIC8vIGFzc2VydCB1bml0cyA8PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cywgZXJyLk9WRVJfVFJBTlNGRVIKICAgIGRpZyA1CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkaWcgMQogICAgPD0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgc2VuZGVyIHVuaXRzIHRvIHRyYW5zZmVyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTUzCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyAtPSB1bml0cwogICAgZGlnIDEKICAgIC0KICAgIGl0b2IKICAgIHVuY292ZXIgMgogICAgaW50Y18zIC8vIDMyCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTQ0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyArPSB1bml0cwogICAgZGlnIDUKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIHVuY292ZXIgMgogICAgKwogICAgaXRvYgogICAgaW50Y18zIC8vIDMyCiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfc3VzcGVuc2lvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfc3VzcGVuc2lvbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojc5CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyMSAvLyAweDUyM2E0MTU1NTQyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE4NQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkID0gc3VzcGVuZGVkCiAgICBkdXAKICAgIHB1c2hpbnQgNDgKICAgIGludGNfMSAvLyAxCiAgICBib3hfZXh0cmFjdAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMwogICAgc2V0Yml0CiAgICBwdXNoaW50IDQ4CiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE4NgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTY1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5hY2NvdW50X29wZW5bcm91dGluZ10oKSAtPiB2b2lkOgphY2NvdW50X29wZW46CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzAKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmFjY291bnRfbWFuYWdlciwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDIzIC8vIDB4NTIzYTRkNGU0NzIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzkKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0VOREVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDIwMAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTAKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX2VuZGVkKCksIGVyci5VTkFVVEhPUklaRUQKICAgICEKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxMQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTIKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjEzCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozNAogICAgLy8gdW5pdHM9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozMi00MgogICAgLy8gcmV0dXJuIHR5cC5BY2NvdW50UG9zaXRpb24oCiAgICAvLyAgICAgcGF5bWVudF9hZGRyZXNzPXBheW1lbnRfYWRkcmVzcywKICAgIC8vICAgICB1bml0cz1VSW50NjQoMCksCiAgICAvLyAgICAgcmVzZXJ2ZWRfdW5pdHM9VUludDY0KDApLAogICAgLy8gICAgIHN1c3BlbmRlZD1GYWxzZSwKICAgIC8vICAgICBzZXR0bGVkX2N1cnNvcj1VSW50NjQoMCksCiAgICAvLyAgICAgaW50ZXJlc3RfY2hlY2twb2ludD1VSW50NjQoMCksCiAgICAvLyAgICAgcHJpbmNpcGFsX2NoZWNrcG9pbnQ9VUludDY0KDApLAogICAgLy8gICAgIGNsYWltYWJsZV9pbnRlcmVzdD1VSW50NjQoMCksCiAgICAvLyAgICAgY2xhaW1hYmxlX3ByaW5jaXBhbD1VSW50NjQoMCksCiAgICAvLyApCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGJ5dGVjIDQxIC8vIDB4MDAKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjE0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHNlbGYuX25ld19hY2NvdW50X3Bvc2l0aW9uKHBheW1lbnRfYWRkcmVzcykKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTUKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjM4CiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIHVuY292ZXIgMwogICAgPT0KICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIzOQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDAKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQxCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MgPSBwYXltZW50X2FkZHJlc3MKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQyCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfZ2V0X3Bvc2l0aW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF9nZXRfcG9zaXRpb246CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNTkKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9jcmVhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9jcmVhdGU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDE5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAzMwogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IGFycmFuZ2VyCiAgICBieXRlYyAxOCAvLyAweDUyM2E0MTUyNTIyMwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMzQKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAxOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfY29uZmlnW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfY29uZmlnOgogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBsZW4KICAgIHB1c2hpbnQgMTA3CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLk5vcm1hbGl6ZWRBY3R1c1Rlcm1zCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgcHVzaGludCA3MgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5Jbml0aWFsS2VybmVsU3RhdGUKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBsZW4KICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIHR1cGxlIGVuY29kaW5nCiAgICBkdXAKICAgIHB1c2hpbnQgMzQKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCB0YWlsIHBvaW50ZXIgYXQgaW5kZXggMSBvZiAodWludDhbMzJdLChsZW4rdXRmOFtdKSkKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgY292ZXIgMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMzYKICAgICsKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuUHJvc3BlY3R1cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2NgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDY4LTEwNjkKICAgIC8vICMgQ29uZmlndXJlIENvbnRyYWN0CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPSB0ZXJtcy5jb250cmFjdF90eXBlLmFzX3VpbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgYnogY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUA3CiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIyMAogICAgLy8gVUludDY0KGVudW1zLkNUX0FOTiksCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIxCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfTkFNKSwKICAgIHB1c2hpbnQgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIyCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfTEFNKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIzCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfTEFYKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjI0CiAgICAvLyBVSW50NjQoZW51bXMuQ1RfQ0xNKSwKICAgIHB1c2hpbnQgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJ6IGNvbnRyYWN0X2NvbmZpZ19ib29sX2ZhbHNlQDgKCmNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANzoKICAgIGludGNfMSAvLyAxCgpjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUA5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjI5CiAgICAvLyBhc3NlcnQgc2VsZi5faXNfc3VwcG9ydGVkX2NvbnRyYWN0X3R5cGUoY29udHJhY3RfdHlwZSksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3MQogICAgLy8gc2VsZi5fc3RvcmVfY29udHJhY3RfY29uZmlnKHNlbGYuY29udHJhY3RfdHlwZSwgdGVybXMsIGluaXRpYWxfc3RhdGUpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgYnVyeSAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzI1CiAgICAvLyBhc3NlcnQgdGVybXMuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZGlnIDQKICAgIGR1cAogICAgcHVzaGludCAzMwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSA4CiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMjcKICAgIC8vIHRlcm1zLmRheV9jb3VudF9jb252ZW50aW9uLmFzX3VpbnQ2NCgpCiAgICBwdXNoaW50IDU3CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICBieiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDE2CiAgICBkaWcgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk5CiAgICAvLyBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI5Ny0zMDMKICAgIC8vIHJldHVybiBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzYwKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwSVNEQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjApLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDE2CiAgICBkaWcgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzAwCiAgICAvLyBVSW50NjQoZW51bXMuRENDX0EzNjUpLAogICAgcHVzaGludCAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyOTctMzAzCiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgID09CiAgICBibnogY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUAxNgogICAgZGlnIDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMwMQogICAgLy8gVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGRpZyA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDIKICAgIC8vIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICA9PQogICAgYnogY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAMTcKCmNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTY6CiAgICBpbnRjXzEgLy8gMQoKY29udHJhY3RfY29uZmlnX2Jvb2xfbWVyZ2VAMTg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDktMzExCiAgICAvLyBhc3NlcnQgc2VsZi5faXNfc3VwcG9ydGVkX2RheV9jb3VudF9jb252ZW50aW9uKAogICAgLy8gICAgIGRheV9jb3VudF9jb252ZW50aW9uCiAgICAvLyApLCBlcnIuSU5WQUxJRF9EQVlfQ09VTlRfQ09OVkVOVElPTgogICAgYXNzZXJ0IC8vIEludmFsaWQgZGF5LWNvdW50IGNvbnZlbnRpb24gSUQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMyOQogICAgLy8gaWYgY29udHJhY3RfdHlwZSAhPSBVSW50NjQoZW51bXMuQ1RfQU5OKToKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgICE9CiAgICBieiBjb250cmFjdF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzMwCiAgICAvLyBhc3NlcnQgbm90IHRlcm1zLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24sIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZGlnIDQKICAgIHB1c2hpbnQgNzg2CiAgICBnZXRiaXQKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KCmNvbnRyYWN0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDIwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODA3CiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIEQtQVNBIGFscmVhZHkgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODA4CiAgICAvLyBhc3NlcnQgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCA9PSBVSW50NjQoMCksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMCAvLyAiaW5pdGlhbF9leGNoYW5nZV9hbW91bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTAtODExCiAgICAvLyAjIFNldCBEZW5vbWluYXRpb24gQXNzZXQKICAgIC8vIHNlbGYuX2Fzc2VydF9kZW5vbWluYXRpb25fYXNzZXQodGVybXMuZGVub21pbmF0aW9uX2Fzc2V0X2lkKQogICAgZGlnIDQKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NzUtNzc2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIGRlbm9taW5hdGlvbiB3aXRoIEFTQQogICAgLy8gX2NyZWF0b3IsIGV4aXN0cyA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X2NyZWF0b3IoZGVub21pbmF0aW9uX2Fzc2V0X2lkKQogICAgZHVwCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q3JlYXRvcgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NzcKICAgIC8vIGFzc2VydCBleGlzdHMsIGVyci5JTlZBTElEX0RFTk9NSU5BVElPTgogICAgYXNzZXJ0IC8vIERlbm9taW5hdGlvbiBhc3NldCBpcyBub3QgcHJvcGVybHkgc2V0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODAKICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICBieXRlYyA0NCAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTQtODE1CiAgICAvLyAjIFNldCBTZXR0bGVtZW50IEFzc2V0CiAgICAvLyBzZWxmLl9hc3NlcnRfc2V0dGxlbWVudF9hc3NldCh0ZXJtcy5zZXR0bGVtZW50X2Fzc2V0X2lkKQogICAgZGlnIDEKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc4NQogICAgLy8gc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODMtNzg2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc2V0dGxlbWVudCBhc3NldCBpcyB0aGUgZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQgPT0gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIC8vICksIGVyci5JTlZBTElEX1NFVFRMRU1FTlRfQVNTRVQKICAgIGFzc2VydCAvLyBEaWZmZXJlbnQgc2V0dGxlbWVudCBhc3NldCBub3Qgc3VwcG9ydGVkLCBtdXN0IGJlIGVxdWFsIHRvIGRlbm9taW5hdGlvbiBhc3NldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Nzg5CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBzZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkwLTc5NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhc3NldF9hbW91bnQ9MCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Nzk1CiAgICAvLyBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkzCiAgICAvLyBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc5NAogICAgLy8gYXNzZXRfYW1vdW50PTAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkwLTc5MQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3OTAtNzk2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODE4LTgxOQogICAgLy8gIyBVbml0cwogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IHRlcm1zLnRvdGFsX3VuaXRzCiAgICBkdXAKICAgIHB1c2hpbnQgMTcKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODIwCiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID0gVUludDY0KDApCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgyMi04MjMKICAgIC8vICMgRGF5LUNvdW50IENvbnZlbnRpb25zCiAgICAvLyBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uID0gdGVybXMuZGF5X2NvdW50X2NvbnZlbnRpb24uYXNfdWludDY0KCkKICAgIGJ5dGVjIDQ2IC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGRpZyA4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODI1LTgyNgogICAgLy8gIyBUaW1lCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA9IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZQogICAgZHVwCiAgICBwdXNoaW50IDQxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMjggLy8gImluaXRpYWxfZXhjaGFuZ2VfZGF0ZSIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODI3CiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSB0ZXJtcy5tYXR1cml0eV9kYXRlCiAgICBkaWcgMQogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDQ1IC8vICJtYXR1cml0eV9kYXRlIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MjgKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IGluaXRpYWxfc3RhdGUubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZGlnIDYKICAgIGR1cAogICAgY292ZXIgMgogICAgcHVzaGludCA0OAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzMC04MzEKICAgIC8vICMgUHJpbmNpcGFsCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID0gdGVybXMuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGRpZyAxMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzMgogICAgLy8gc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gdGVybXMuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZGlnIDMKICAgIHB1c2hpbnQgNzg2CiAgICBnZXRiaXQKICAgIGJ5dGVjIDM1IC8vICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzMwogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBpbml0aWFsX3N0YXRlLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZGlnIDEKICAgIHB1c2hpbnQgMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODM1LTgzNgogICAgLy8gIyBJbnRlcmVzdAogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ID0gaW5pdGlhbF9zdGF0ZS5hY2NydWVkX2ludGVyZXN0CiAgICBkaWcgMQogICAgcHVzaGludCA0MAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODM4LTgzOQogICAgLy8gIyBJbnRlcmVzdCBSYXRlCiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IGluaXRpYWxfc3RhdGUubm9taW5hbF9pbnRlcmVzdF9yYXRlCiAgICBkaWcgMQogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0MAogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gaW5pdGlhbF9zdGF0ZS5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlCiAgICBkaWcgMQogICAgcHVzaGludCAyNAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQxCiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkID0gdGVybXMucmF0ZV9yZXNldF9zcHJlYWQKICAgIGRpZyAzCiAgICBwdXNoaW50IDU4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzYgLy8gInJhdGVfcmVzZXRfc3ByZWFkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0MgogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIgPSB0ZXJtcy5yYXRlX3Jlc2V0X211bHRpcGxpZXIKICAgIGRpZyAzCiAgICBwdXNoaW50IDY2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzcgLy8gInJhdGVfcmVzZXRfbXVsdGlwbGllciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDMKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9mbG9vciA9IHRlcm1zLnJhdGVfcmVzZXRfZmxvb3IKICAgIGRpZyAzCiAgICBwdXNoaW50IDc0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzEgLy8gInJhdGVfcmVzZXRfZmxvb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQ0CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfY2FwID0gdGVybXMucmF0ZV9yZXNldF9jYXAKICAgIGRpZyAzCiAgICBwdXNoaW50IDgyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzIgLy8gInJhdGVfcmVzZXRfY2FwIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0NQogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X25leHQgPSB0ZXJtcy5yYXRlX3Jlc2V0X25leHQKICAgIGRpZyAzCiAgICBwdXNoaW50IDkwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzggLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDYKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgPSB0ZXJtcy5oYXNfcmF0ZV9yZXNldF9mbG9vcgogICAgZGlnIDMKICAgIHB1c2hpbnQgNzg0CiAgICBnZXRiaXQKICAgIGJ5dGVjIDM5IC8vICJoYXNfcmF0ZV9yZXNldF9mbG9vciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDcKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwID0gdGVybXMuaGFzX3JhdGVfcmVzZXRfY2FwCiAgICBkaWcgMwogICAgcHVzaGludCA3ODUKICAgIGdldGJpdAogICAgYnl0ZWMgNDAgLy8gImhhc19yYXRlX3Jlc2V0X2NhcCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDktODUwCiAgICAvLyAjIFNjYWxpbmcKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgPSB0ZXJtcy5maXhlZF9wb2ludF9zY2FsZQogICAgdW5jb3ZlciAzCiAgICBwdXNoaW50IDk5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODUyLTg1MwogICAgLy8gIyBTY2hlZHVsZSBQcm9jZXNzaW5nCiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciA9IGluaXRpYWxfc3RhdGUuZXZlbnRfY3Vyc29yCiAgICBkaWcgMQogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU1LTg1NgogICAgLy8gIyBQZXItVW5pdCBGaXhlZC1Qb2ludCBJbmRleGVzCiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggPSBpbml0aWFsX3N0YXRlLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgKICAgIGRpZyAxCiAgICBwdXNoaW50IDU2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU3CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4ID0gaW5pdGlhbF9zdGF0ZS5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleAogICAgZGlnIDEKICAgIHB1c2hpbnQgNjQKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU5LTg2MAogICAgLy8gIyBSZXNlcnZlZCBBbW91bnQgKGZvciBleGVjdXRlZCBjYXNoZmxvd3MpCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0ID0gVUludDY0KDApCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2MQogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2MwogICAgLy8gYXNzZXJ0IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLCBlcnIuSU5WQUxJRF9JRUQKICAgIGRpZyAyCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICBhc3NlcnQgLy8gSUVEIG11c3QgYmUgc2V0IGluIHRoZSBmdXR1cmUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2NAogICAgLy8gYXNzZXJ0IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA+IGluaXRpYWxfc3RhdGUuc3RhdHVzX2RhdGUsIGVyci5JTlZBTElEX0lFRAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgPAogICAgYXNzZXJ0IC8vIElFRCBtdXN0IGJlIHNldCBpbiB0aGUgZnV0dXJlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NjUKICAgIC8vIGFzc2VydCB0ZXJtcy5pbml0aWFsX2V4Y2hhbmdlX2RhdGUgPCB0ZXJtcy5tYXR1cml0eV9kYXRlLCBlcnIuSU5WQUxJRF9JRUQKICAgIDwKICAgIGFzc2VydCAvLyBJRUQgbXVzdCBiZSBzZXQgaW4gdGhlIGZ1dHVyZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3My0xMDc0CiAgICAvLyAjIE5vdGFyaXplIHByb3NwZWN0dXMgKG9wdGlvbmFsKQogICAgLy8gc2VsZi5wcm9zcGVjdHVzX2hhc2ggPSBwcm9zcGVjdHVzLmhhc2guYnl0ZXMKICAgIGRpZyAyCiAgICBleHRyYWN0IDAgMzIKICAgIGJ5dGVjIDQyIC8vICJwcm9zcGVjdHVzX2hhc2giCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3NQogICAgLy8gc2VsZi5wcm9zcGVjdHVzX3VybCA9IHByb3NwZWN0dXMudXJsCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGVjIDQzIC8vICJwcm9zcGVjdHVzX3VybCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc2CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAMTc6CiAgICBpbnRjXzAgLy8gMAogICAgYiBjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUAxOAoKY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAODoKICAgIGludGNfMCAvLyAwCiAgICBiIGNvbnRyYWN0X2NvbmZpZ19ib29sX21lcmdlQDkKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9zY2hlZHVsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X3NjaGVkdWxlOgogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHN3YXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBkdXAKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgMgogICAgKwogICAgdW5jb3ZlciAyCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLkV4ZWN1dGlvblNjaGVkdWxlRW50cnk+CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTEwCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMTMKICAgIC8vIGNvbnRyYWN0X3R5cGU9c2VsZi5jb250cmFjdF90eXBlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGNvdmVyIDMKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4ODEKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4ODItODg0CiAgICAvLyBhc3NlcnQgc2NoZWR1bGVfcGFnZS5sZW5ndGggPD0gVUludDY0KAogICAgLy8gICAgIGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUKICAgIC8vICksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGR1cAogICAgcHVzaGludCAxNgogICAgPD0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg4NQogICAgLy8gYXNzZXJ0IHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPiBVSW50NjQoMCksIGVyci5URVJNU19OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSB0ZXJtcyBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODg3CiAgICAvLyBwYWdlX2N1cnNvciA9IHNjaGVkdWxlX3BhZ2VfaW5kZXggKiBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkKICAgIHN3YXAKICAgIHB1c2hpbnQgMTYKICAgICoKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg5NAogICAgLy8gKyBwYWdlX2xlbmd0aCAqIFVJbnQ2NChjc3QuT1BfVVBfQ09OVFJBQ1RfQ09ORklHX1BFUl9FTlRSWV9CVURHRVQpCiAgICBwdXNoaW50IDEwMAogICAgKgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODkzCiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19CQVNFX0JVREdFVCkKICAgIGludGMgNCAvLyAxNTAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTMtODk0CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19CQVNFX0JVREdFVCkKICAgIC8vICsgcGFnZV9sZW5ndGggKiBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19QRVJfRU5UUllfQlVER0VUKQogICAgKwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODg5LTg5NgogICAgLy8gIyBWYWxpZGF0aW9uIGNvc3QgZ3Jvd3Mgd2l0aCBwYWdlIGxlbmd0aCwgc28gY29uZmlndXJhdGlvbiBleHBsaWNpdGx5CiAgICAvLyAjIGJ1eXMgZXh0cmEgb3Bjb2RlIGJ1ZGdldCBmb3IgbGFyZ2VyIHVwbG9hZHMuCiAgICAvLyBlbnN1cmVfYnVkZ2V0KAogICAgLy8gICAgIHJlcXVpcmVkX2J1ZGdldD0oCiAgICAvLyAgICAgICAgIFVJbnQ2NChjc3QuT1BfVVBfQ09OVFJBQ1RfQ09ORklHX0JBU0VfQlVER0VUKQogICAgLy8gICAgICAgICArIHBhZ2VfbGVuZ3RoICogVUludDY0KGNzdC5PUF9VUF9DT05UUkFDVF9DT05GSUdfUEVSX0VOVFJZX0JVREdFVCkKICAgIC8vICAgICApLAogICAgLy8gKQogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODk3CiAgICAvLyBpbmRleCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKCmNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEAyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODk4CiAgICAvLyB3aGlsZSBpbmRleCA8IHBhZ2VfbGVuZ3RoOgogICAgZHVwCiAgICBkaWcgNAogICAgPAogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfd2hpbGVAMTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg5OS05MDAKICAgIC8vIGVudHJ5ID0gc2NoZWR1bGVfcGFnZVtpbmRleF0uY29weSgpCiAgICAvLyBlbnRyeV9ldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZGlnIDQKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGJ1cnkgMTIKICAgIGRpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgNjUKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTAwCiAgICAvLyBlbnRyeV9ldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTktOTAwCiAgICAvLyBlbnRyeSA9IHNjaGVkdWxlX3BhZ2VbaW5kZXhdLmNvcHkoKQogICAgLy8gZW50cnlfZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGludGNfMiAvLyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDAKICAgIC8vIGVudHJ5X2V2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBnZXRieXRlCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgMTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkwMQogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X2lkID09IHBhZ2VfY3Vyc29yICsgaW5kZXgsIGVyci5JTlZBTElEX0VWRU5UX0lECiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEzCiAgICBkaWcgNQogICAgdW5jb3ZlciA0CiAgICArCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDItOTA0CiAgICAvLyBzZWxmLl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBlbnRyeV9ldmVudF90eXBlCiAgICAvLyApCiAgICBkaWcgNQogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTA1CiAgICAvLyBhc3NlcnQgZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgc3dhcAogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDYKICAgIC8vIGlmIGVudHJ5LmV2ZW50X2lkID4gVUludDY0KDApOgogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDcKICAgIC8vIGlmIGluZGV4ID4gVUludDY0KDApOgogICAgZHVwCiAgICBieiBjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlANgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTA4CiAgICAvLyBwcmV2aW91c19lbnRyeSA9IHNjaGVkdWxlX3BhZ2VbaW5kZXggLSBVSW50NjQoMSldLmNvcHkoKQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgcHVzaGludCA2NQogICAgKgogICAgZGlnIDExCiAgICBzd2FwCiAgICBwdXNoaW50IDY1CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkyMwogICAgLy8gcHJldmlvdXNfZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gZW50cnkuc2NoZWR1bGVkX3RpbWUKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyA4CiAgICA8PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTIyLTkyNAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBwcmV2aW91c19lbnRyeS5zY2hlZHVsZWRfdGltZSA8PSBlbnRyeS5zY2hlZHVsZWRfdGltZQogICAgLy8gKSwgZXJyLklOVkFMSURfU09SVElORwogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIG11c3QgYmUgc29ydGVkIGluIHN0cmljdGx5IGFzY2VuZGluZyBvcmRlcgoKY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUA4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTI1CiAgICAvLyBpZiBlbnRyeS5ldmVudF9pZCA9PSBVSW50NjQoMCk6CiAgICBkaWcgOAogICAgYm56IGNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkyNi05MjgKICAgIC8vIGFzc2VydCBlbnRyeV9ldmVudF90eXBlID09IFVJbnQ2NCgKICAgIC8vICAgICBlbnVtcy5FVlRfSUVECiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGRpZyA5CiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjkKICAgIC8vIGluZGV4ICs9IFVJbnQ2NCgxKQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIGNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEAyCgpjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlANjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkxMC05MTIKICAgIC8vICMgVGhlIGZpcnN0IGVudHJ5IG9mIGEgcGFnZSBtdXN0IHN0aWxsIGJlIG9yZGVyZWQgYWZ0ZXIgdGhlCiAgICAvLyAjIGxhc3QgZW50cnkgb2YgdGhlIHByZXZpb3VzIHBhZ2UuCiAgICAvLyBhc3NlcnQgc2NoZWR1bGVfcGFnZV9pbmRleCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGRpZyA2CiAgICBkdXAKICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTMKICAgIC8vIHByZXZpb3VzX3BhZ2VfaW5kZXggPSBzY2hlZHVsZV9wYWdlX2luZGV4IC0gVUludDY0KDEpCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTE1CiAgICAvLyBwcmV2aW91c19wYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZQogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTQtOTE2CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHByZXZpb3VzX3BhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTctOTE4CiAgICAvLyBwcmV2aW91c19wYWdlID0gc2VsZi5zY2hlZHVsZV9wYWdlW3ByZXZpb3VzX3BhZ2VfaW5kZXhdLmNvcHkoKQogICAgLy8gYXNzZXJ0IHByZXZpb3VzX3BhZ2UubGVuZ3RoID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBwdXNoaW50IDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTgKICAgIC8vIGFzc2VydCBwcmV2aW91c19wYWdlLmxlbmd0aCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZHVwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjAKICAgIC8vIHByZXZpb3VzX3BhZ2UubGVuZ3RoIC0gVUludDY0KDEpCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTE5LTkyMQogICAgLy8gcHJldmlvdXNfZW50cnkgPSBwcmV2aW91c19wYWdlWwogICAgLy8gICAgIHByZXZpb3VzX3BhZ2UubGVuZ3RoIC0gVUludDY0KDEpCiAgICAvLyBdLmNvcHkoKQogICAgcHVzaGludCA2NQogICAgKgogICAgcHVzaGludCAyCiAgICArCiAgICBwdXNoaW50IDY1CiAgICBib3hfZXh0cmFjdAogICAgYiBjb250cmFjdF9zY2hlZHVsZV9hZnRlcl9pZl9lbHNlQDcKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX3doaWxlQDExOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjAwCiAgICAvLyBzZWxmLnNjaGVkdWxlX3BhZ2VbcGFnZV9pbmRleF0gPSBzY2hlZHVsZV9wYWdlLmNvcHkoKQogICAgZGlnIDYKICAgIGl0b2IKICAgIGJ5dGVjIDI0IC8vIDB4NTMyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgZGlnIDUKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzMgogICAgLy8gaWYgaXNfbGFzdF9wYWdlOgogICAgZGlnIDUKICAgIGJ6IGNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzNAogICAgLy8gc2NoZWR1bGVfcGFnZV9pbmRleCAqIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKSArIHBhZ2VfbGVuZ3RoCiAgICBkaWcgMQogICAgZGlnIDQKICAgICsKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzMwogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA9ICgKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTMzLTkzNQogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA9ICgKICAgIC8vICAgICBzY2hlZHVsZV9wYWdlX2luZGV4ICogVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpICsgcGFnZV9sZW5ndGgKICAgIC8vICkKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MzYKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgNTAKICAgIGFwcF9nbG9iYWxfcHV0Cgpjb250cmFjdF9zY2hlZHVsZV9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTExOAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9leGVjdXRlX2llZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X2V4ZWN1dGVfaWVkOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDMKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE0NAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDUKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTQ3CiAgICAvLyBhc3NlcnQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LCBlcnIuSU5WQUxJRF9FVkVOVF9DVVJTT1IKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgZGlnIDEKICAgID4KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGN1cnNvcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE0OAogICAgLy8gZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoc2VsZi5ldmVudF9jdXJzb3IpCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDkKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoZW51bXMuRVZUX0lFRCksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGR1cAogICAgZXh0cmFjdCA4IDEKICAgIGR1cAogICAgcHVzaGJ5dGVzIDB4MDEKICAgIGI9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1MwogICAgLy8gZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICBkaWcgMQogICAgZXh0cmFjdCAwIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTUKICAgIC8vIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgZGlnIDIKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTU2CiAgICAvLyBhY2NydWFsX2ZhY3Rvcj1lbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIGRpZyAzCiAgICBleHRyYWN0IDE3IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTcKICAgIC8vIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIGRpZyA0CiAgICBleHRyYWN0IDI1IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTkKICAgIC8vIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPWVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDUKICAgIGV4dHJhY3QgMzMgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE2MAogICAgLy8gbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgZGlnIDYKICAgIGV4dHJhY3QgNDEgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE2MQogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9ZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICBkaWcgNwogICAgZXh0cmFjdCA0OSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTYyCiAgICAvLyBmbGFncz1lbnRyeS5mbGFncywKICAgIGRpZyA4CiAgICBleHRyYWN0IDU3IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTItMTE2MwogICAgLy8gdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0KAogICAgLy8gICAgIGV2ZW50X2lkPWVudHJ5LmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1lbnRyeS5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1lbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPWVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9ZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPWVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGZsYWdzPWVudHJ5LmZsYWdzLAogICAgLy8gKSwKICAgIHVuY292ZXIgNwogICAgdW5jb3ZlciA4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNwogICAgY29uY2F0CiAgICB1bmNvdmVyIDYKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTgKICAgIC8vIG9ic2VydmVkX3JhdGU9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTItMTE2MwogICAgLy8gdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0KAogICAgLy8gICAgIGV2ZW50X2lkPWVudHJ5LmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1lbnRyeS5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1lbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPWVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9ZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPWVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGZsYWdzPWVudHJ5LmZsYWdzLAogICAgLy8gKSwKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTUwLTExNjQKICAgIC8vIHNlbGYuX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5KAogICAgLy8gICAgIGVudHJ5LAogICAgLy8gICAgIHR5cC5PYnNlcnZlZEV2ZW50UmVxdWVzdCgKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPWVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIG9ic2VydmVkX3JhdGU9VUludDY0KDApLAogICAgLy8gICAgICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1lbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1lbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICAgICAgZmxhZ3M9ZW50cnkuZmxhZ3MsCiAgICAvLyAgICAgKSwKICAgIC8vICkKICAgIGNhbGxzdWIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5CiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNjUKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEyMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuYXBwbHlfbm9uX2Nhc2hfZXZlbnRbcm91dGluZ10oKSAtPiB2b2lkOgphcHBseV9ub25fY2FzaF9ldmVudDoKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDQKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cG4gMgogICAgbGVuCiAgICBwdXNoaW50IDczCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLk9ic2VydmVkRXZlbnRSZXF1ZXN0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIwNAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMDUKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjA3CiAgICAvLyBpZiBwYXlsb2FkLmZsYWdzICYgVUludDY0KGVudW1zLkZMQUdfT0JTRVJWRURfRVZFTlQpOgogICAgcHVzaGludCA2NQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgcHVzaGludCA0CiAgICAmCiAgICBieiBhcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIzMwogICAgLy8gcmV0dXJuIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQ0xNKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICBwdXNoaW50IDUKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjA4CiAgICAvLyBhc3NlcnQgc2VsZi5fc3VwcG9ydHNfb2JzZXJ2ZWRfZXZlbnRzKCksIGVyci5PQlNFUlZFRF9FVkVOVF9SRVFVSVJFRAogICAgYXNzZXJ0IC8vIE9ic2VydmVkIGV2ZW50IHJlcXVpcmVkIHRvIGV4ZWN1dGUgdGhpcyBhY3Rpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMDkKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjMzCiAgICAvLyByZXR1cm4gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9DTE0pCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIGR1cAogICAgcHVzaGludCA1CiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQ1CiAgICAvLyBhc3NlcnQgc2VsZi5fc3VwcG9ydHNfb2JzZXJ2ZWRfZXZlbnRzKCksIGVyci5PQlNFUlZFRF9FVkVOVF9SRVFVSVJFRAogICAgYXNzZXJ0IC8vIE9ic2VydmVkIGV2ZW50IHJlcXVpcmVkIHRvIGV4ZWN1dGUgdGhpcyBhY3Rpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk0NgogICAgLy8gYXNzZXJ0IHBheWxvYWQuZXZlbnRfaWQgPT0gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGRpZyAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDcKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBpZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQ4CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUsIHBheWxvYWQuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgYnVyeSAxMgogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk0Ny05NDkKICAgIC8vIHNlbGYuX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIHNlbGYuY29udHJhY3RfdHlwZSwgcGF5bG9hZC5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICAvLyApCiAgICBjYWxsc3ViIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTUxCiAgICAvLyBwYWdlX2luZGV4ID0gc2VsZi5fc2NoZWR1bGVfcGFnZV9pbmRleChzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTkwCiAgICAvLyByZXR1cm4gZXZlbnRfaWQgLy8gVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpCiAgICBwdXNoaW50IDE2CiAgICAvCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTIKICAgIC8vIHBhZ2UgPSB0eXAuRXhlY3V0aW9uU2NoZWR1bGVQYWdlKCkKICAgIGJ5dGVjIDQ4IC8vIDB4MDAwMAogICAgYnVyeSA3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTMKICAgIC8vIGlmIHBhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlOgogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA5CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMjcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1NAogICAgLy8gcGFnZSA9IHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XS5jb3B5KCkKICAgIGRpZyA3CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidXJ5IDcKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX3BhZ2UgZW50cnkgZXhpc3RzCgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDI3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTU1CiAgICAvLyBhc3NlcnQgcGFnZS5sZW5ndGggPCBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGRpZyA1CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgMTYKICAgIDwKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2MAogICAgLy8gc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIGRpZyAzCiAgICBkdXAKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjEKICAgIC8vIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICBkaWcgMQogICAgZXh0cmFjdCAxNyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjIKICAgIC8vIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZGlnIDIKICAgIGV4dHJhY3QgMjUgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTYzCiAgICAvLyBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDMKICAgIGV4dHJhY3QgNDEgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTY0CiAgICAvLyBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIGRpZyA0CiAgICBleHRyYWN0IDQ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2NQogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIHVuY292ZXIgNQogICAgZXh0cmFjdCA1NyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTctOTY3CiAgICAvLyB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1wYXlsb2FkLmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9cGF5bG9hZC5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPXBheWxvYWQucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXBheWxvYWQubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICkKICAgIGRpZyAxMQogICAgaXRvYgogICAgZGlnIDE4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMwogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTYtOTY4CiAgICAvLyBwYWdlLmFwcGVuZCgKICAgIC8vICAgICB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9cGF5bG9hZC5ldmVudF9pZCwKICAgIC8vICAgICAgICAgZXZlbnRfdHlwZT1wYXlsb2FkLmV2ZW50X3R5cGUsCiAgICAvLyAgICAgICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIC8vICAgICAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICAgICApCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjkKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHBhZ2UuY29weSgpCiAgICBkaWcgOAogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk3MAogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjEyCiAgICAvLyBhc3NlcnQgZXZlbnRfaWQgPT0gc2VsZi5ldmVudF9jdXJzb3IsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBjdXJzb3IKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMTMKICAgIC8vIGVudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KGV2ZW50X2lkKQogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIxNQogICAgLy8gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgYnVyeSAxMAogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjQKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY1CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzYzLTM3MAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9SUiksCiAgICBwdXNoaW50IDEyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY3CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICBwdXNoaW50IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY4CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgcHVzaGludCAxOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzYzLTM3MAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBieiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX2ZhbHNlQDE2CgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX3RydWVAMTU6CiAgICBpbnRjXzEgLy8gMQoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9tZXJnZUAxNzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMTQtMTIxNgogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2lzX25vbl9jYXNoKAogICAgLy8gICAgIGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIC8vICksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IHR5cGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMTcKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlICE9IGFyYzQuVUludDgoZW51bXMuRVZUX0lFRCksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGRpZyA4CiAgICBwdXNoYnl0ZXMgMHgwMQogICAgYiE9CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCB0eXBlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNzQKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluIChVSW50NjQoZW51bXMuRVZUX1JSKSwgVUludDY0KGVudW1zLkVWVF9SUkYpKQogICAgZGlnIDQKICAgIHB1c2hpbnQgMTIKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDIxCiAgICBkaWcgNAogICAgcHVzaGludCAxMQogICAgPT0KICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfZmFsc2VAMjIKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAyMToKICAgIGludGNfMSAvLyAxCgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX21lcmdlQDIzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIxOAogICAgLy8gaWYgc2VsZi5fZXZlbnRfaXNfcmF0ZV9yZXNldChlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpKToKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Vsc2VfYm9keUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODIKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLm9ic2VydmVyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjUgLy8gMHg1MjNhNGQ0ZjQzMjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMjIKICAgIC8vIHNlbGYuX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5KGVudHJ5LCBwYXlsb2FkKQogICAgZGlnIDYKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeQogICAgcG9wbiAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjIzCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfZWxzZV9ib2R5QDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjIxCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIGIgYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYWZ0ZXJfaWZfZWxzZUA2CgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX2ZhbHNlQDIyOgogICAgaW50Y18wIC8vIDAKICAgIGIgYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9tZXJnZUAyMwoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9mYWxzZUAxNjoKICAgIGludGNfMCAvLyAwCiAgICBiIGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfbWVyZ2VAMTcKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5hcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50OgogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGxlbgogICAgcHVzaGludCA2NQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5PYnNlcnZlZENhc2hFdmVudFJlcXVlc3QKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjU0CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyNTUKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjU2CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIzMwogICAgLy8gcmV0dXJuIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQ0xNKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICBwdXNoaW50IDUKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5ODEKICAgIC8vIGFzc2VydCBzZWxmLl9zdXBwb3J0c19vYnNlcnZlZF9ldmVudHMoKSwgZXJyLk9CU0VSVkVEX0VWRU5UX1JFUVVJUkVECiAgICBhc3NlcnQgLy8gT2JzZXJ2ZWQgZXZlbnQgcmVxdWlyZWQgdG8gZXhlY3V0ZSB0aGlzIGFjdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTgyCiAgICAvLyBhc3NlcnQgcGF5bG9hZC5ldmVudF9pZCA9PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LCBlcnIuSU5WQUxJRF9FVkVOVF9JRAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgc3dhcAogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBpZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTgzCiAgICAvLyBhc3NlcnQgcGF5bG9hZC5ldmVudF90eXBlID09IGFyYzQuVUludDgoZW51bXMuRVZUX1BSKSwgZXJyLklOVkFMSURfRVZFTlRfVFlQRQogICAgZGlnIDEKICAgIGV4dHJhY3QgOCAxCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIHB1c2hieXRlcyAweDAzCiAgICBiPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IHR5cGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4NAogICAgLy8gYXNzZXJ0IHBheWxvYWQuZmxhZ3MgJiBVSW50NjQoZW51bXMuRkxBR19DQVNIX0VWRU5UKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBzd2FwCiAgICBwdXNoaW50IDU3CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzEgLy8gMQogICAgJgogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTg2CiAgICAvLyBpZiBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50ID4gVUludDY0KDApOgogICAgYnogYXBwZW5kX29ic2VydmVkX2Nhc2hfZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5ODgKICAgIC8vIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgLSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5ODctOTg5CiAgICAvLyBwcmV2aW91c19lbnRyeSA9IHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeSgKICAgIC8vICAgICBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IC0gVUludDY0KDEpCiAgICAvLyApCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5MQogICAgLy8gcHJldmlvdXNfZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gcGF5bG9hZC5zY2hlZHVsZWRfdGltZQogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDQKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIDw9CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OTAtOTkyCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHByZXZpb3VzX2VudHJ5LnNjaGVkdWxlZF90aW1lIDw9IHBheWxvYWQuc2NoZWR1bGVkX3RpbWUKICAgIC8vICksIGVyci5JTlZBTElEX1NPUlRJTkcKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBtdXN0IGJlIHNvcnRlZCBpbiBzdHJpY3RseSBhc2NlbmRpbmcgb3JkZXIKCmFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5NAogICAgLy8gcGFnZV9pbmRleCA9IHNlbGYuX3NjaGVkdWxlX3BhZ2VfaW5kZXgoc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE5MAogICAgLy8gcmV0dXJuIGV2ZW50X2lkIC8vIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKQogICAgcHVzaGludCAxNgogICAgLwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTk1CiAgICAvLyBwYWdlID0gdHlwLkV4ZWN1dGlvblNjaGVkdWxlUGFnZSgpCiAgICBieXRlYyA0OCAvLyAweDAwMDAKICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTk2CiAgICAvLyBpZiBwYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZToKICAgIGl0b2IKICAgIGJ5dGVjIDI0IC8vIDB4NTMyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgNwogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBhcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5NwogICAgLy8gcGFnZSA9IHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XS5jb3B5KCkKICAgIGRpZyA1CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidXJ5IDYKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX3BhZ2UgZW50cnkgZXhpc3RzCgphcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OTgKICAgIC8vIGFzc2VydCBwYWdlLmxlbmd0aCA8IFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZGlnIDQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgcHVzaGludCAxNgogICAgPAogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAwMwogICAgLy8gc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIGRpZyA1CiAgICBkdXAKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDA0CiAgICAvLyBhY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLmFjY3J1YWxfZmFjdG9yLAogICAgZGlnIDEKICAgIGV4dHJhY3QgMTcgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAwNQogICAgLy8gcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICBkaWcgMgogICAgZXh0cmFjdCAyNSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDA2CiAgICAvLyBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDMKICAgIGV4dHJhY3QgMzMgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAwNwogICAgLy8gbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1wYXlsb2FkLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICBkaWcgNAogICAgZXh0cmFjdCA0MSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDA4CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1wYXlsb2FkLm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgdW5jb3ZlciA1CiAgICBleHRyYWN0IDQ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMDAtMTAxMAogICAgLy8gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkoCiAgICAvLyAgICAgZXZlbnRfaWQ9cGF5bG9hZC5ldmVudF9pZCwKICAgIC8vICAgICBldmVudF90eXBlPXBheWxvYWQuZXZlbnRfdHlwZSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1wYXlsb2FkLnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9cGF5bG9hZC5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIC8vICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1wYXlsb2FkLm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGZsYWdzPXBheWxvYWQuZmxhZ3MsCiAgICAvLyApCiAgICBkaWcgMTAKICAgIGl0b2IKICAgIGRpZyAxMAogICAgY29uY2F0CiAgICB1bmNvdmVyIDYKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTk5LTEwMTEKICAgIC8vIHBhZ2UuYXBwZW5kKAogICAgLy8gICAgIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgICAgICBldmVudF9pZD1wYXlsb2FkLmV2ZW50X2lkLAogICAgLy8gICAgICAgICBldmVudF90eXBlPXBheWxvYWQuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICAgICAgYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPXBheWxvYWQubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1wYXlsb2FkLm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgICAgICBmbGFncz1wYXlsb2FkLmZsYWdzLAogICAgLy8gICAgICkKICAgIC8vICkKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMTIKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHBhZ2UuY29weSgpCiAgICBkaWcgNgogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMTMKICAgIC8vIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgKz0gVUludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI2MAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9nZXRfc3RhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9nZXRfc3RhdGU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGR1cAogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjc1CiAgICAvLyBjb250cmFjdF90eXBlPWFyYzQuVUludDgoc2VsZi5jb250cmFjdF90eXBlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgaXRvYgogICAgZHVwCiAgICBiaXRsZW4KICAgIGludGNfMiAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBleHRyYWN0IDcgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI3NwogICAgLy8gdG90YWxfdW5pdHM9c2VsZi50b3RhbF91bml0cywKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjc4CiAgICAvLyByZXNlcnZlZF91bml0c190b3RhbD1zZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyNzkKICAgIC8vIGluaXRpYWxfZXhjaGFuZ2VfYW1vdW50PXNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI4MAogICAgLy8gZXZlbnRfY3Vyc29yPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjgxCiAgICAvLyBzY2hlZHVsZV9lbnRyeV9jb3VudD1zZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI4MgogICAgLy8gb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjgzCiAgICAvLyBpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlPXNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjg0CiAgICAvLyBub21pbmFsX2ludGVyZXN0X3JhdGU9c2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyODUKICAgIC8vIGFjY3J1ZWRfaW50ZXJlc3Q9c2VsZi5hY2NydWVkX2ludGVyZXN0LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyODYKICAgIC8vIGN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXg9c2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjg3CiAgICAvLyBjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleD1zZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyODgKICAgIC8vIHJlc2VydmVkX2ludGVyZXN0PXNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX2ludGVyZXN0IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI4OQogICAgLy8gcmVzZXJ2ZWRfcHJpbmNpcGFsPXNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI3NC0xMjkwCiAgICAvLyByZXR1cm4gdHlwLktlcm5lbFN0YXRlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGU9YXJjNC5VSW50OChzZWxmLmNvbnRyYWN0X3R5cGUpLAogICAgLy8gICAgIHN0YXR1cz1zZWxmLnN0YXR1cywKICAgIC8vICAgICB0b3RhbF91bml0cz1zZWxmLnRvdGFsX3VuaXRzLAogICAgLy8gICAgIHJlc2VydmVkX3VuaXRzX3RvdGFsPXNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwsCiAgICAvLyAgICAgaW5pdGlhbF9leGNoYW5nZV9hbW91bnQ9c2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCwKICAgIC8vICAgICBldmVudF9jdXJzb3I9c2VsZi5ldmVudF9jdXJzb3IsCiAgICAvLyAgICAgc2NoZWR1bGVfZW50cnlfY291bnQ9c2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwKICAgIC8vICAgICBvdXRzdGFuZGluZ19wcmluY2lwYWw9c2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZT1zZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICAvLyAgICAgbm9taW5hbF9pbnRlcmVzdF9yYXRlPXNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIGFjY3J1ZWRfaW50ZXJlc3Q9c2VsZi5hY2NydWVkX2ludGVyZXN0LAogICAgLy8gICAgIGN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXg9c2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4LAogICAgLy8gICAgIGN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4PXNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgsCiAgICAvLyAgICAgcmVzZXJ2ZWRfaW50ZXJlc3Q9c2VsZi5yZXNlcnZlZF9pbnRlcmVzdCwKICAgIC8vICAgICByZXNlcnZlZF9wcmluY2lwYWw9c2VsZi5yZXNlcnZlZF9wcmluY2lwYWwsCiAgICAvLyApCiAgICB1bmNvdmVyIDE0CiAgICBpdG9iCiAgICB1bmNvdmVyIDE0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMgogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDExCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA5CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgOAogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDcKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyNjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzA0CiAgICAvLyBpZiBzZWxmLmV2ZW50X2N1cnNvciA+PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICA+PQogICAgYnogY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMwNgogICAgLy8gZXZlbnRfaWQ9c2VsZi5ldmVudF9jdXJzb3IsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMDUtMTMxNQogICAgLy8gcmV0dXJuIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgIGV2ZW50X2lkPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgLy8gICAgIGV2ZW50X3R5cGU9YXJjNC5VSW50OCgwKSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1VSW50NjQoMCksCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1VSW50NjQoMCksCiAgICAvLyAgICAgZmxhZ3M9VUludDY0KDApLAogICAgLy8gKQogICAgaXRvYgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMwNwogICAgLy8gZXZlbnRfdHlwZT1hcmM0LlVJbnQ4KDApLAogICAgYnl0ZWMgNDEgLy8gMHgwMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMwNS0xMzE1CiAgICAvLyByZXR1cm4gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkoCiAgICAvLyAgICAgZXZlbnRfaWQ9c2VsZi5ldmVudF9jdXJzb3IsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1hcmM0LlVJbnQ4KDApLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPVVJbnQ2NCgwKSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249VUludDY0KDApLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPVVJbnQ2NCgwKSwKICAgIC8vICAgICBmbGFncz1VSW50NjQoMCksCiAgICAvLyApCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMDgKICAgIC8vIHNjaGVkdWxlZF90aW1lPVVJbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzA1LTEzMTUKICAgIC8vIHJldHVybiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1zZWxmLmV2ZW50X2N1cnNvciwKICAgIC8vICAgICBldmVudF90eXBlPWFyYzQuVUludDgoMCksCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9VUludDY0KDApLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9VUludDY0KDApLAogICAgLy8gICAgIGZsYWdzPVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAoKY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50QDQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjkyCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzE2CiAgICAvLyByZXR1cm4gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KHNlbGYuZXZlbnRfY3Vyc29yKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyOTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiBjb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnRfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnRANAoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLmNvbnRyYWN0X3VwZGF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X3VwZGF0ZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNjEtMTY0CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gZ3JhbnRzIHRoZSB1cGRhdGUgcGVybWlzc2lvbnMgdG8gdGhlIEFycmFuZ2VyLgogICAgLy8gIyDimqDvuI8gV0FSTklORzogQXBwbGljYXRpb24gdXBkYXRlcyBtdXN0IGJlIGV4ZWN1dGVkIFZFUlkgY2FyZWZ1bGx5LCBhcyB0aGV5CiAgICAvLyAjIG1pZ2h0IGludHJvZHVjZSBicmVha2luZyBjaGFuZ2VzLgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTUwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19yb3RhdGVfYXJyYW5nZXJbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3JvdGF0ZV9hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTgwCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODEKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSBuZXdfYXJyYW5nZXIKICAgIGJ5dGVjIDE4IC8vIDB4NTIzYTQxNTI1MjIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4MgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTY2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3NldF9vcF9kYWVtb25bcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3NldF9vcF9kYWVtb246CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTg0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE5OAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTk5CiAgICAvLyBzZWxmLm9wX2RhZW1vbi52YWx1ZSA9IGFkZHJlc3MKICAgIGJ5dGVjIDI3IC8vIDB4NTIzYTRmNTA0NDIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwMAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTg0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2Fzc2lnbl9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19hc3NpZ25fcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDE2CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLlJvbGVWYWxpZGl0eQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI1CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNgogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDQKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgcHVzaGludCAyMAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA1CiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gcm9sZV9hZGRyZXNzCiAgICBieXRlYyAxOCAvLyAweDUyM2E0MTUyNTIyMwogICAgZGlnIDMKICAgIGFwcF9nbG9iYWxfcHV0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyOAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwOAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDQwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDkKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIzIC8vIDB4NTIzYTRkNGU0NzIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTAKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI3CiAgICAvLyBzZWxmLl9zZXRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIHZhbGlkaXR5KQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTMKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjIgLy8gMHg1MjNhNTA1OTQ0MjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNAogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNwogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE2CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpOgogICAgZHVwCiAgICBwdXNoaW50IDYwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTcKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyNiAvLyAweDUyM2E1NDUyNTMyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE4CiAgICAvLyBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjcKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIxCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMSAvLyAweDUyM2E0MTU1NTQyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIyCiAgICAvLyBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNwogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyNAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgODAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI1CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI1IC8vIDB4NTIzYTRkNGY0MzIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjYKICAgIC8vIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfcmV2b2tlX3JvbGVbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3Jldm9rZV9yb2xlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0OQogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjUwCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1MQogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjkKICAgIC8vIGFzc2VydCByb2xlX2lkICE9IFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwgZXJyLklOVkFMSURfUk9MRQogICAgZHVwCiAgICBwdXNoaW50IDIwCiAgICAhPQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMwCiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICBwdXNoaW50IDQwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzEKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjMgLy8gMHg1MjNhNGQ0ZTQ3MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMgogICAgLy8gZGVsIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTMKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzQKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzUKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMiAvLyAweDUyM2E1MDU5NDQyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM2CiAgICAvLyBkZWwgc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTIKICAgIC8vIHNlbGYuX2RlbGV0ZV9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcykKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM4CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpOgogICAgZHVwCiAgICBwdXNoaW50IDYwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzkKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI2IC8vIDB4NTIzYTU0NTI1MzIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDAKICAgIC8vIGRlbCBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjUyCiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDMKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hdXRob3JpdHksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjEgLy8gMHg1MjNhNDE1NTU0MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NAogICAgLy8gZGVsIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1MgogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDYKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDgwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI1IC8vIDB4NTIzYTRkNGY0MzIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDgKICAgIC8vIGRlbCBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19jb250cmFjdF9zdXNwZW5zaW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19jb250cmFjdF9zdXNwZW5zaW9uOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojc5CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyMSAvLyAweDUyM2E0MTU1NTQyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3MQogICAgLy8gc2VsZi5jb250cmFjdF9zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGJ5dGVjIDMzIC8vICJjb250cmFjdF9zdXNwZW5kZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3MgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2NvbnRyYWN0X2RlZmF1bHRbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2NvbnRyYWN0X2RlZmF1bHQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjc0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzYKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnRydXN0ZWUsIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyNiAvLyAweDUyM2E1NDUyNTMyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4NwogICAgLy8gc2VsZi5kZWZhdWx0ZWQgPSBkZWZhdWx0ZWQKICAgIGJ5dGVjIDM0IC8vICJkZWZhdWx0ZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4OAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjc0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9hcnJhbmdlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X2FycmFuZ2VyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwMQogICAgLy8gcmV0dXJuIHNlbGYuYXJyYW5nZXIudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOCAvLyAweDUyM2E0MTUyNTIyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYWRkcmVzc19yb2xlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzAzCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMQogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hY2NvdW50X21hbmFnZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjMgLy8gMHg1MjNhNGQ0ZTQ3MjMKICAgIGRpZyAxCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMgogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5wcmltYXJ5X2RlYWxlciwgYWRkcmVzcyksCiAgICBieXRlYyAyMiAvLyAweDUyM2E1MDU5NDQyMwogICAgZGlnIDIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzIzCiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnRydXN0ZWUsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjYgLy8gMHg1MjNhNTQ1MjUzMjMKICAgIGRpZyAzCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyNAogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIGFkZHJlc3MpLAogICAgYnl0ZWMgMjEgLy8gMHg1MjNhNDE1NTU0MjMKICAgIGRpZyA0CiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyNQogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5vYnNlcnZlciwgYWRkcmVzcyksCiAgICBieXRlYyAyNSAvLyAweDUyM2E0ZDRmNDMyMwogICAgdW5jb3ZlciA1CiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlYyA0MSAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciA2CiAgICBzZXRiaXQKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDUKICAgIHNldGJpdAogICAgcHVzaGludCAyCiAgICB1bmNvdmVyIDQKICAgIHNldGJpdAogICAgcHVzaGludCAzCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgcHVzaGludCA0CiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM0NgogICAgLy8gcm9sZSA9IHJvbGVfaWQuYXNfdWludDY0KCkKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNDcKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGUpCiAgICBkdXAKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzQ5CiAgICAvLyBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKToKICAgIHB1c2hpbnRzIDIwIDQwIDUwIDYwIDcwIDgwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzQ4LTM3OQogICAgLy8gbWF0Y2ggcm9sZToKICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKToKICAgIC8vICAgICAgICAgcmV0dXJuIHR5cC5Sb2xlVmFsaWRpdHkoCiAgICAvLyAgICAgICAgICAgICByb2xlX3ZhbGlkaXR5X3N0YXJ0PVVJbnQ2NCgwKSwgcm9sZV92YWxpZGl0eV9lbmQ9VUludDY0KDApCiAgICAvLyAgICAgICAgICkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSk6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSk6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgXzoKICAgIC8vICAgICAgICAgb3AuZXJyKGVyci5JTlZBTElEX1JPTEUpCiAgICB1bmNvdmVyIDYKICAgIG1hdGNoIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMEAyIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMUAzIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMkA0IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfM0A1IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNEA2IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mzc5CiAgICAvLyBvcC5lcnIoZXJyLklOVkFMSURfUk9MRSkKICAgIGVyciAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV81QDc6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mzc1CiAgICAvLyBzZWxmLm9ic2VydmVyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDI1IC8vIDB4NTIzYTRkNGY0MzIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTcKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mzc0LTM3NgogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM3NwogICAgLy8gcmV0dXJuIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzRANjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNzAKICAgIC8vIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDIxIC8vIDB4NTIzYTQxNTU1NDIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTcKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzY5LTM3MQogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNzIKICAgIC8vIHJldHVybiBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzNANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNjUKICAgIC8vIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAyNiAvLyAweDUyM2E1NDUyNTMyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU3CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM2NC0zNjYKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM2NwogICAgLy8gcmV0dXJuIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzJANDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNjAKICAgIC8vIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMjIgLy8gMHg1MjNhNTA1OTQ0MjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NwogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTktMzYxCiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzYyCiAgICAvLyByZXR1cm4gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzFAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTUKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDIzIC8vIDB4NTIzYTRkNGU0NzIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTcKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzU0LTM1NgogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTcKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzBAMjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTAtMzUyCiAgICAvLyByZXR1cm4gdHlwLlJvbGVWYWxpZGl0eSgKICAgIC8vICAgICByb2xlX3ZhbGlkaXR5X3N0YXJ0PVVJbnQ2NCgwKSwgcm9sZV92YWxpZGl0eV9lbmQ9VUludDY0KDApCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB2b2lkOgpfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZDoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNgogICAgLy8gZGVmIF9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHNlbGYsIGhvbGRpbmdfYWRkcmVzczogQWNjb3VudCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI4CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZCwgZXJyLlNVU1BFTkRFRAogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCAzODQKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIFN1c3BlbmRlZCBvcGVyYXRpb25zCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5fc2V0dGxlX3Bvc2l0aW9uKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NCwgdWludDY0Ogpfc2V0dGxlX3Bvc2l0aW9uOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjQ0CiAgICAvLyBkZWYgX3NldHRsZV9wb3NpdGlvbihzZWxmLCBob2xkaW5nX2FkZHJlc3M6IEFjY291bnQpIC0+IHR1cGxlW1VJbnQ2NCwgVUludDY0XToKICAgIHByb3RvIDEgMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjYxCiAgICAvLyBwb3NpdGlvbiA9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNvcHkoKQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo2My02NQogICAgLy8gIyBDb21wdXRlIHRoZSBpbmNyZW1lbnRhbCBwZXItdW5pdCBmaXhlZC1wb2ludCBpbnRlcmVzdCBhbmQgcHJpbmNpcGFsIGFjY3J1ZWQKICAgIC8vICMgc2luY2UgdGhpcyBhY2NvdW50J3MgbGFzdCBjaGVja3BvaW50LgogICAgLy8gaW50ZXJlc3RfZGVsdGEgPSBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggLSBwb3NpdGlvbi5pbnRlcmVzdF9jaGVja3BvaW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCBleGlzdHMKICAgIGRpZyAxCiAgICBwdXNoaW50IDU3CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjY3CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IC0gcG9zaXRpb24ucHJpbmNpcGFsX2NoZWNrcG9pbnQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggZXhpc3RzCiAgICBkaWcgMgogICAgcHVzaGludCA2NQogICAgZXh0cmFjdF91aW50NjQKICAgIC0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3MwogICAgLy8gaW50ZXJlc3RfZGVsdGEsIHBvc2l0aW9uLnVuaXRzLCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICBkaWcgMgogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjcwLTc0CiAgICAvLyAjIENvbnZlcnQgdGhlIHBlci11bml0IGZpeGVkLXBvaW50IGRlbHRhcyBpbnRvIGFic29sdXRlIGNsYWltYWJsZSBhbW91bnRzCiAgICAvLyAjIHVzaW5nIHRoZSBhY2NvdW50J3MgYWN0aXZlIHVuaXRzLgogICAgLy8gY2xhaW1hYmxlX2ludGVyZXN0ID0gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgaW50ZXJlc3RfZGVsdGEsIHBvc2l0aW9uLnVuaXRzLCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICAvLyApCiAgICB1bmNvdmVyIDMKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzYKICAgIC8vIHByaW5jaXBhbF9kZWx0YSwgcG9zaXRpb24udW5pdHMsIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3NS03NwogICAgLy8gY2xhaW1hYmxlX3ByaW5jaXBhbCA9IHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIHByaW5jaXBhbF9kZWx0YSwgcG9zaXRpb24udW5pdHMsIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUKICAgIC8vICkKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzktODEKICAgIC8vICMgQWNjcnVlIHRoZSBjbGFpbWFibGUgYW1vdW50cyB0byB0aGUgYWNjb3VudCBwb3NpdGlvbiBhbmQgbWFrZSB0aGVtIGF2YWlsYWJsZQogICAgLy8gIyBmb3Igd2l0aGRyYXdhbC4KICAgIC8vIHBvc2l0aW9uLmNsYWltYWJsZV9pbnRlcmVzdCArPSBjbGFpbWFibGVfaW50ZXJlc3QKICAgIGRpZyAyCiAgICBwdXNoaW50IDczCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDIKICAgICsKICAgIGl0b2IKICAgIHVuY292ZXIgMwogICAgc3dhcAogICAgcmVwbGFjZTIgNzMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo4MgogICAgLy8gcG9zaXRpb24uY2xhaW1hYmxlX3ByaW5jaXBhbCArPSBjbGFpbWFibGVfcHJpbmNpcGFsCiAgICBkdXAKICAgIHB1c2hpbnQgODEKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgKwogICAgaXRvYgogICAgcmVwbGFjZTIgODEKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo4NC04NgogICAgLy8gIyBBZHZhbmNlIHRoZSBhY2NvdW50J3MgcGVyLXVuaXQgZml4ZWQtcG9pbnQgY2hlY2twb2ludHMgdG8gdGhlIGN1cnJlbnQgZ2xvYmFsCiAgICAvLyAjIHBlci11bml0IGZpeGVkLXBvaW50IGdsb2JhbCBpbmRpY2VzLgogICAgLy8gcG9zaXRpb24uaW50ZXJlc3RfY2hlY2twb2ludCA9IHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggZXhpc3RzCiAgICBpdG9iCiAgICByZXBsYWNlMiA1NwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojg3CiAgICAvLyBwb3NpdGlvbi5wcmluY2lwYWxfY2hlY2twb2ludCA9IHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggZXhpc3RzCiAgICBpdG9iCiAgICByZXBsYWNlMiA2NQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojg5LTkwCiAgICAvLyAjIEFkdmFuY2UgdGhlIGFjY291bnQncyBldmVudCBjdXJzb3IgdG8gdGhlIGN1cnJlbnQgZ2xvYmFsIGV2ZW50IGN1cnNvci4KICAgIC8vIHBvc2l0aW9uLnNldHRsZWRfY3Vyc29yID0gc2VsZi5ldmVudF9jdXJzb3IKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaXRvYgogICAgcmVwbGFjZTIgNDkKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo5Mi05NAogICAgLy8gIyBVcGRhdGUgdGhlIGFjY291bnQgcG9zaXRpb24gYW5kIHJldHVybiB0aGUgbmV3bHkgYWNjcnVlZCBjbGFpbWFibGUgYW1vdW50cwogICAgLy8gIyBhZGRlZCB0byB0aGUgdG90YWwgcG9zaXRpb24ncyBjbGFpbWFibGUgYW1vdW50cy4KICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gcG9zaXRpb24uY29weSgpCiAgICB1bmNvdmVyIDMKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo5NQogICAgLy8gcmV0dXJuIGNsYWltYWJsZV9pbnRlcmVzdCwgY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQoaG9sZGluZ19hZGRyZXNzOiBieXRlcykgLT4gdm9pZDoKX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQ6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6OTcKICAgIC8vIGRlZiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZChzZWxmLCBob2xkaW5nX2FkZHJlc3M6IEFjY291bnQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTAwCiAgICAvLyBpZiBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKToKICAgIGJ6IF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwMQogICAgLy8gcmV0dXJuCiAgICByZXRzdWIKCl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDMKICAgIC8vIHBvc2l0aW9uID0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY29weSgpCiAgICBmcmFtZV9kaWcgMgogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA0CiAgICAvLyBpZiBwb3NpdGlvbi5yZXNlcnZlZF91bml0cyA9PSBVSW50NjQoMCk6CiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIGJueiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZF9hZnRlcl9pZl9lbHNlQDQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDUKICAgIC8vIHJldHVybgogICAgcmV0c3ViCgpfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZF9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA4CiAgICAvLyBwb3NpdGlvbi51bml0cyArPSBhY3RpdmF0ZWRfdW5pdHMKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDMKICAgICsKICAgIGl0b2IKICAgIHJlcGxhY2UyIDMyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA5CiAgICAvLyBwb3NpdGlvbi5yZXNlcnZlZF91bml0cyA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGl0b2IKICAgIHJlcGxhY2UyIDQwCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTEwCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHBvc2l0aW9uLmNvcHkoKQogICAgZnJhbWVfZGlnIDIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTEKICAgIC8vIGFzc2VydCBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID49IGFjdGl2YXRlZF91bml0cywgZXJyLk9WRVJfRElTVFJJQlVUSU9OCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIGV4aXN0cwogICAgZHVwCiAgICBkaWcgMgogICAgPj0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgcmVtYWluaW5nIEQtQVNBIHVuaXRzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTEyCiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIC09IGFjdGl2YXRlZF91bml0cwogICAgc3dhcAogICAgLQogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9zY2FsZWRfbXVsX2RpdihtdWx0aXBsaWNhbmQ6IHVpbnQ2NCwgbXVsdGlwbGllcjogdWludDY0LCBkaXZpc29yOiB1aW50NjQpIC0+IHVpbnQ2NDoKX3NjYWxlZF9tdWxfZGl2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTUzLTE1NQogICAgLy8gZGVmIF9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLCBtdWx0aXBsaWNhbmQ6IFVJbnQ2NCwgbXVsdGlwbGllcjogVUludDY0LCBkaXZpc29yOiBVSW50NjQKICAgIC8vICkgLT4gVUludDY0OgogICAgcHJvdG8gMyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTcKICAgIC8vIGlmIG11bHRpcGxpY2FuZCA9PSBVSW50NjQoMCkgb3IgbXVsdGlwbGllciA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTMKICAgIGJ6IF9zY2FsZWRfbXVsX2Rpdl9pZl9ib2R5QDIKICAgIGZyYW1lX2RpZyAtMgogICAgYm56IF9zY2FsZWRfbXVsX2Rpdl9hZnRlcl9pZl9lbHNlQDMKCl9zY2FsZWRfbXVsX2Rpdl9pZl9ib2R5QDI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTgKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9zY2FsZWRfbXVsX2Rpdl9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTkKICAgIC8vIGhpZ2gsIGxvdyA9IG9wLm11bHcobXVsdGlwbGljYW5kLCBtdWx0aXBsaWVyKQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIG11bHcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2MAogICAgLy8gcmV0dXJuIG9wLmRpdncoaGlnaCwgbG93LCBkaXZpc29yKQogICAgZnJhbWVfZGlnIC0xCiAgICBkaXZ3CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYW1vdW50X3RvX2luZGV4X2RlbHRhKGFtb3VudDogdWludDY0KSAtPiB1aW50NjQ6Cl9hbW91bnRfdG9faW5kZXhfZGVsdGE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjIKICAgIC8vIGRlZiBfYW1vdW50X3RvX2luZGV4X2RlbHRhKHNlbGYsIGFtb3VudDogVUludDY0KSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2NAogICAgLy8gaWYgYW1vdW50ID09IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMQogICAgYm56IF9hbW91bnRfdG9faW5kZXhfZGVsdGFfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjUKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9hbW91bnRfdG9faW5kZXhfZGVsdGFfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTY2CiAgICAvLyBhc3NlcnQgc2VsZi50b3RhbF91bml0cyA+IFVJbnQ2NCgwKSwgZXJyLk5PX1VOSVRTCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgZHVwCiAgICBhc3NlcnQgLy8gTm8gRC1BU0EgdW5pdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2NwogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KGFtb3VudCwgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwgc2VsZi50b3RhbF91bml0cykKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2luZGV4X2RlbHRhX3RvX2Ftb3VudChpbmRleF9kZWx0YTogdWludDY0KSAtPiB1aW50NjQ6Cl9pbmRleF9kZWx0YV90b19hbW91bnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjkKICAgIC8vIGRlZiBfaW5kZXhfZGVsdGFfdG9fYW1vdW50KHNlbGYsIGluZGV4X2RlbHRhOiBVSW50NjQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTc2CiAgICAvLyBpZiBpbmRleF9kZWx0YSA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGJueiBfaW5kZXhfZGVsdGFfdG9fYW1vdW50X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTc3CiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfaW5kZXhfZGVsdGFfdG9fYW1vdW50X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE3OQogICAgLy8gc2VsZi50b3RhbF91bml0cywKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxODEKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNzgtMTgyCiAgICAvLyByZXR1cm4gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgc2VsZi50b3RhbF91bml0cywKICAgIC8vICAgICBpbmRleF9kZWx0YSwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2dldF9zY2hlZHVsZV9lbnRyeShldmVudF9pZDogdWludDY0KSAtPiBieXRlczoKX2dldF9zY2hlZHVsZV9lbnRyeToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIwMgogICAgLy8gZGVmIF9nZXRfc2NoZWR1bGVfZW50cnkoc2VsZiwgZXZlbnRfaWQ6IFVJbnQ2NCkgLT4gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnk6CiAgICBwcm90byAxIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIwNAogICAgLy8gYXNzZXJ0IGV2ZW50X2lkIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgPgogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgaWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE5MAogICAgLy8gcmV0dXJuIGV2ZW50X2lkIC8vIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDE2CiAgICAvCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMDYKICAgIC8vIGFzc2VydCBwYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxOTQKICAgIC8vIHJldHVybiBldmVudF9pZCAlIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDE2CiAgICAlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMDkKICAgIC8vIGFzc2VydCBvZmZzZXQgPCBwYWdlLmxlbmd0aCwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBwdXNoaW50IDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgMQogICAgPgogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjEwCiAgICAvLyByZXR1cm4gcGFnZVtvZmZzZXRdLmNvcHkoKQogICAgcHVzaGludCA2NQogICAgKgogICAgcHVzaGludCAyCiAgICArCiAgICBwdXNoaW50IDY1CiAgICBib3hfZXh0cmFjdAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKGNvbnRyYWN0X3R5cGU6IHVpbnQ2NCwgZXZlbnRfdHlwZTogdWludDY0KSAtPiB2b2lkOgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTMtMzE1CiAgICAvLyBkZWYgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIHNlbGYsIGNvbnRyYWN0X3R5cGU6IFVJbnQ2NCwgZXZlbnRfdHlwZTogVUludDY0CiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNDcKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNDgKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgaW50Y18yIC8vIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI0OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9NRCksCiAgICBwdXNoaW50IDE5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTAKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgcHVzaGludCAxMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU0LTI1NQogICAgLy8gIyBDaGVjayBjb21tb24gZXZlbnRzIGZpcnN0CiAgICAvLyBpZiBldmVudF90eXBlIGluIGNvbW1vbl9ldmVudHM6CiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjUxCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICBwdXNoaW50IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUA3CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU2CiAgICAvLyByZXR1cm4gVHJ1ZQogICAgaW50Y18xIC8vIDEKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICByZXRzdWIKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTgtMjU5CiAgICAvLyAjIENvbnRyYWN0LXNwZWNpZmljIGFkZGl0aW9uYWwgZXZlbnRzCiAgICAvLyBpZiBjb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9QQU0pOgogICAgZnJhbWVfZGlnIC0yCiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjYwLTI2MQogICAgLy8gIyBQQU0gb25seSBzdXBwb3J0cyBjb21tb24gZXZlbnRzCiAgICAvLyByZXR1cm4gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNjMKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0xBTSkgb3IgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2My0yNjUKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0xBTSkgb3IgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoCiAgICAvLyAgICAgZW51bXMuQ1RfTkFNCiAgICAvLyApOgogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDExCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMgogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDE2CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUAxMToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2Ni0yNzAKICAgIC8vICMgTEFNL05BTSBhZGQ6IFBSLCBJUENCCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjY4CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjY2LTI3MAogICAgLy8gIyBMQU0vTkFNIGFkZDogUFIsIElQQ0IKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDEzCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIHB1c2hpbnQgMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2Ni0yNzAKICAgIC8vICMgTEFNL05BTSBhZGQ6IFBSLCBJUENCCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICkKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF9mYWxzZUAxNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAxMzoKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDE0OgogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMTY6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzIKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTik6CiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMjMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3My0yNzgKICAgIC8vICMgQU5OIGFkZHM6IFBSLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjc1CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjczLTI3OAogICAgLy8gIyBBTk4gYWRkczogUFIsIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDIwCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIHB1c2hpbnQgMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3My0yNzgKICAgIC8vICMgQU5OIGFkZHM6IFBSLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyMAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzcKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIHB1c2hpbnQgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjczLTI3OAogICAgLy8gIyBBTk4gYWRkczogUFIsIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDIxCgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDIwOgogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMjE6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAyMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MAogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfTEFYKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA0CiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMzEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MS0yODcKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MwogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUiksCiAgICBwdXNoaW50IDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MS0yODcKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjgKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjg0CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjgxLTI4NwogICAgLy8gIyBMQVggYWRkczogUFIsIFBJLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyOAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODUKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICBwdXNoaW50IDE4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODEtMjg3CiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDI4CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODEtMjg3CiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDI5CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDI4OgogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMjk6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAzMToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4OQogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQ0xNKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA1CiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMzMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI5MC0yOTEKICAgIC8vICMgQ0xNIGFkZHM6IFBSCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1BSKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDMKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDMzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjkzCiAgICAvLyByZXR1cm4gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5faXNfZHluYW1pY19hbm51aXR5KCkgLT4gdWludDY0OgpfaXNfZHluYW1pY19hbm51aXR5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM1CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzUtMzM2CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIC8vIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGJ6IF9pc19keW5hbWljX2FubnVpdHlfYm9vbF9mYWxzZUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzYKICAgIC8vIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzNSAvLyAiZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM1LTMzNgogICAgLy8gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICAvLyBhbmQgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBieiBfaXNfZHluYW1pY19hbm51aXR5X2Jvb2xfZmFsc2VAMwogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMzNC0zMzcKICAgIC8vIHJldHVybiAoCiAgICAvLyAgICAgc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICAvLyAgICAgYW5kIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgLy8gKQogICAgcmV0c3ViCgpfaXNfZHluYW1pY19hbm51aXR5X2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzQtMzM3CiAgICAvLyByZXR1cm4gKAogICAgLy8gICAgIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKQogICAgLy8gICAgIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIC8vICkKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KGVudHJ5OiBieXRlcykgLT4gdWludDY0LCBieXRlczoKX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozODAKICAgIC8vIGRlZiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudChzZWxmLCBlbnRyeTogdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5CiAgICAvLyBlbnRyeS5hY2NydWFsX2ZhY3RvciA9PSBVSW50NjQoMCkKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAxNwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5LTM5MQogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGJ6IF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2lmX2JvZHlAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzkwCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5LTM5MQogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGJ6IF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2lmX2JvZHlAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzkxCiAgICAvLyBvciBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPT0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5LTM5MQogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGJueiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudF9hZnRlcl9pZl9lbHNlQDQKCl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2lmX2JvZHlAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5MwogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2RpZyAtMQogICAgdW5jb3ZlciAyCiAgICByZXRzdWIKCl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NQogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NgogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NC0zOTgKICAgIC8vIGFjY3J1ZWQgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICAvLyAgICAgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICkKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MDIKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozOTktNDAzCiAgICAvLyByZXR1cm4gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgYWNjcnVlZCwKICAgIC8vICAgICBlbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICBmcmFtZV9kaWcgLTEKICAgIHVuY292ZXIgMgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yKGRpc2NvdW50X2ZhY3RvcjogdWludDY0LCByZWRlbXB0aW9uX2ZhY3RvcjogdWludDY0KSAtPiB1aW50NjQ6Cl9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ2Mi00NjYKICAgIC8vIGRlZiBfZGlzY291bnRfYW5udWl0eV9mYWN0b3IoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBkaXNjb3VudF9mYWN0b3I6IFVJbnQ2NCwKICAgIC8vICAgICByZWRlbXB0aW9uX2ZhY3RvcjogVUludDY0LAogICAgLy8gKSAtPiBVSW50NjQ6CiAgICBwcm90byAyIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ2OAogICAgLy8gaWYgcmVkZW1wdGlvbl9mYWN0b3IgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0xCiAgICBibnogX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDY5CiAgICAvLyByZXR1cm4gZGlzY291bnRfZmFjdG9yCiAgICBmcmFtZV9kaWcgLTIKICAgIHJldHN1YgoKX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3MAogICAgLy8gcGVyaW9kX3JhdGUgPSBzZWxmLmZpeGVkX3BvaW50X3NjYWxlICsgc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzEKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzAtNDc0CiAgICAvLyBwZXJpb2RfcmF0ZSA9IHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgKyBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICByZWRlbXB0aW9uX2ZhY3RvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICBkaWcgMgogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgICsKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3NQogICAgLy8gYXNzZXJ0IHBlcmlvZF9yYXRlID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGR1cAogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDc4CiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDc2LTQ4MAogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIGRpc2NvdW50X2ZhY3RvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gICAgIHBlcmlvZF9yYXRlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkoZW50cnk6IGJ5dGVzLCBwYXlsb2FkOiBieXRlcykgLT4gYnl0ZXMsIGJ5dGVzOgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MTMtNjE1CiAgICAvLyBkZWYgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5KAogICAgLy8gICAgIHNlbGYsIGVudHJ5OiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSwgcGF5bG9hZDogdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0CiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAyIDIKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjIzCiAgICAvLyBhc3NlcnQgZW50cnkuZXZlbnRfaWQgPT0gc2VsZi5ldmVudF9jdXJzb3IsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGN1cnNvcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjI0CiAgICAvLyBhc3NlcnQgZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsIGVyci5OT19EVUVfQ0FTSEZMT1cKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPD0KICAgIGFzc2VydCAvLyBObyBkdWUgY2FzaGZsb3cgdG8gcGF5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MjYKICAgIC8vIGV2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYyNwogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX0lFRCk6CiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGR1cAogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYyOC02MzAKICAgIC8vICMgSUVEIGZpbmFsaXplcyBpc3N1YW5jZTogcmVzZXJ2ZWQgdW5pdHMgYmVjb21lIGFjdGl2YXRhYmxlIGFuZCB0aGUKICAgIC8vICMgc2NoZWR1bGUncyBpbml0aWFsIGNvbnRyYWN0dWFsIHN0YXRlIGJlY29tZXMgbGl2ZS4KICAgIC8vIGFzc2VydCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzIKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPT0gc2VsZi50b3RhbF91bml0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjMxLTYzMwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID09IHNlbGYudG90YWxfdW5pdHMKICAgIC8vICksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9JTkNPTVBMRVRFCiAgICBhc3NlcnQgLy8gUHJpbWFyeSBkaXN0cmlidXRpb24gaXMgbm90IGNvbXBsZXRlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzQKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM1CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzYKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAzMwogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzcKICAgIC8vIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM4CiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzkKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0MAogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX0FDVElWRSkKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgMTAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDUxCiAgICAvLyBhc3NlcnQgZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSA9PSBVSW50NjQoZW51bXMuRVZUX0lFRCksIGVyci5OT1RfRVZUX0lFRAogICAgZnJhbWVfZGlnIDExCiAgICBhc3NlcnQgLy8gTm90IElFRCBldmVudAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDUyCiAgICAvLyByZXR1cm4gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0MS02NDUKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1zZWxmLl9lbnRyeV9pZWRfYW1vdW50KGVudHJ5KSwKICAgIC8vICAgICBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0NAogICAgLy8gc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0MS02NDUKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1zZWxmLl9lbnRyeV9pZWRfYW1vdW50KGVudHJ5KSwKICAgIC8vICAgICBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICAvLyApCiAgICBjYWxsc3ViIF9lbWl0X2V4ZWN1dGlvbl9ldmVudAogICAgZHVwCiAgICBmcmFtZV9idXJ5IC0yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NDYKICAgIC8vIHJldHVybgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0OQogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ICs9IHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBmcmFtZV9idXJ5IC0yCiAgICArCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1MQogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1JSKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCAxMgogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMTAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1NQogICAgLy8gcGF5bG9hZC5vYnNlcnZlZF9yYXRlLAogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjU2CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzNyAvLyAicmF0ZV9yZXNldF9tdWx0aXBsaWVyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1NwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1Mi02NTgKICAgIC8vICMgUlIgZGVyaXZlcyB0aGUgbmV4dCByYXRlIGZyb20gYW4gb2JzZXJ2ZWQgb3JhY2xlIHZhbHVlIHBsdXMgdGhlCiAgICAvLyAjIGNvbnRyYWN0IHNwcmVhZCAvIG11bHRpcGxpZXIgdGVybXMsIHRoZW4gZW5mb3JjZXMgZmxvb3IgYW5kIGNhcC4KICAgIC8vIG9ic2VydmVkX3JhdGUgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBwYXlsb2FkLm9ic2VydmVkX3JhdGUsCiAgICAvLyAgICAgc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICkKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjAKICAgIC8vIG9ic2VydmVkX3JhdGUgKyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzYgLy8gInJhdGVfcmVzZXRfc3ByZWFkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkIGV4aXN0cwogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDEKICAgIC8vIGlmIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgYW5kIHJhdGUgPCBzZWxmLnJhdGVfcmVzZXRfZmxvb3I6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzkgLy8gImhhc19yYXRlX3Jlc2V0X2Zsb29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmhhc19yYXRlX3Jlc2V0X2Zsb29yIGV4aXN0cwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMSAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X2Zsb29yIGV4aXN0cwogICAgZnJhbWVfZGlnIDYKICAgID4KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDIKICAgIC8vIHJhdGUgPSBzZWxmLnJhdGVfcmVzZXRfZmxvb3IKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMSAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDYKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfZmxvb3IgZXhpc3RzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1NToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc0MwogICAgLy8gaWYgc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgYW5kIHJhdGUgPiBzZWxmLnJhdGVfcmVzZXRfY2FwOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQwIC8vICJoYXNfcmF0ZV9yZXNldF9jYXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwIGV4aXN0cwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTgKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMiAvLyAicmF0ZV9yZXNldF9jYXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9jYXAgZXhpc3RzCiAgICBmcmFtZV9kaWcgNgogICAgPAogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc0NAogICAgLy8gcmF0ZSA9IHNlbGYucmF0ZV9yZXNldF9jYXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMiAvLyAicmF0ZV9yZXNldF9jYXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSA2CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X2NhcCBleGlzdHMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjU5CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IHNlbGYuX2NsYW1wX3JhdGUoCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NTktNjYxCiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IHNlbGYuX2NsYW1wX3JhdGUoCiAgICAvLyAgICAgb2JzZXJ2ZWRfcmF0ZSArIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQKICAgIC8vICkKICAgIGZyYW1lX2RpZyA2CiAgICBhcHBfZ2xvYmFsX3B1dAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMTg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzEKICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QSSk6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMjAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY3MgogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzMKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDIzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc4CiAgICAvLyBpZiBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKToKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAyOQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc5CiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFJGKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCA1CiAgICA9PQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMzAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4MwogICAgLy8gKyAoc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCAtIHNlbGYuZXZlbnRfY3Vyc29yKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICAtCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODQKICAgIC8vICogVUludDY0KGNzdC5PUF9VUF9OT05fQ0FTSF9QRVJfRU5UUllfQlVER0VUKQogICAgcHVzaGludCAxMDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4My02ODQKICAgIC8vICsgKHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgLSBzZWxmLmV2ZW50X2N1cnNvcikKICAgIC8vICogVUludDY0KGNzdC5PUF9VUF9OT05fQ0FTSF9QRVJfRU5UUllfQlVER0VUKQogICAgKgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjgyCiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX05PTl9DQVNIX0JBU0VfQlVER0VUKQogICAgaW50YyA0IC8vIDE1MDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4Mi02ODQKICAgIC8vIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfQkFTRV9CVURHRVQpCiAgICAvLyArIChzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IC0gc2VsZi5ldmVudF9jdXJzb3IpCiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfUEVSX0VOVFJZX0JVREdFVCkKICAgICsKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4MC02ODYKICAgIC8vIGVuc3VyZV9idWRnZXQoCiAgICAvLyAgICAgcmVxdWlyZWRfYnVkZ2V0PSgKICAgIC8vICAgICAgICAgVUludDY0KGNzdC5PUF9VUF9OT05fQ0FTSF9CQVNFX0JVREdFVCkKICAgIC8vICAgICAgICAgKyAoc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCAtIHNlbGYuZXZlbnRfY3Vyc29yKQogICAgLy8gICAgICAgICAqIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfUEVSX0VOVFJZX0JVREdFVCkKICAgIC8vICAgICApLAogICAgLy8gKQogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDkwCiAgICAvLyBkaXNjb3VudF9mYWN0b3IgPSBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5MQogICAgLy8gZGVub21pbmF0b3IgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5MgogICAgLy8gc2tpcF9maXJzdF9yZWRlbXB0aW9uID0gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5NAogICAgLy8gaWYgZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAyNQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgZnJhbWVfYnVyeSA4CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAzNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDk1LTQ5OQogICAgLy8gIyBBbiBpbml0aWFsIFBSRiBtYXkgZGVzY3JpYmUgdGhlIGZpcnN0IHJlZGVtcHRpb24gcGVyaW9kIGRpcmVjdGx5LgogICAgLy8gZGlzY291bnRfZmFjdG9yID0gc2VsZi5fZGlzY291bnRfYW5udWl0eV9mYWN0b3IoCiAgICAvLyAgICAgZGlzY291bnRfZmFjdG9yLAogICAgLy8gICAgIGVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDgKICAgIGNhbGxzdWIgX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTAxCiAgICAvLyBza2lwX2ZpcnN0X3JlZGVtcHRpb24gPSBUcnVlCiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfYnVyeSA3CiAgICBmcmFtZV9idXJ5IDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDM1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTAzCiAgICAvLyBmdXR1cmVfZXZlbnRfaWQgPSBzZWxmLmV2ZW50X2N1cnNvciArIFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfd2hpbGVfdG9wQDM2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA0CiAgICAvLyB3aGlsZSBmdXR1cmVfZXZlbnRfaWQgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgZnJhbWVfZGlnIDMKICAgID4KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl93aGlsZUA0OAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA1CiAgICAvLyBmdXR1cmVfZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoZnV0dXJlX2V2ZW50X2lkKQogICAgZnJhbWVfZGlnIDMKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwNgogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPSBmdXR1cmVfZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MDctNTA4CiAgICAvLyAjIE9ubHkgcmVkZW1wdGlvbi1iZWFyaW5nIGV2ZW50cyBjb250cmlidXRlIHRvIHRoZSBhbm51aXR5IGRlbm9taW5hdG9yLgogICAgLy8gaXNfcmVkZW1wdGlvbl9ldmVudCA9IGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpIG9yICgKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwNy01MTEKICAgIC8vICMgT25seSByZWRlbXB0aW9uLWJlYXJpbmcgZXZlbnRzIGNvbnRyaWJ1dGUgdG8gdGhlIGFubnVpdHkgZGVub21pbmF0b3IuCiAgICAvLyBpc19yZWRlbXB0aW9uX2V2ZW50ID0gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QUikgb3IgKAogICAgLy8gICAgIGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfTUQpCiAgICAvLyAgICAgYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICAvLyApCiAgICBibnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfdHJ1ZUA0MAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA5CiAgICAvLyBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgZnJhbWVfZGlnIDQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MDktNTEwCiAgICAvLyBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgLy8gYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF9mYWxzZUA0MQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTEwCiAgICAvLyBhbmQgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IgPiBVSW50NjQoMCkKICAgIGZyYW1lX2RpZyAwCiAgICBwdXNoaW50IDI1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA5LTUxMAogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCkKICAgIC8vIGFuZCBmdXR1cmVfZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX3RydWVANDA6CiAgICBpbnRjXzEgLy8gMQoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfbWVyZ2VANDI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTIKICAgIC8vIGlmIGlzX3JlZGVtcHRpb25fZXZlbnQ6CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA0NwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTEzCiAgICAvLyBpZiBza2lwX2ZpcnN0X3JlZGVtcHRpb246CiAgICBmcmFtZV9kaWcgNwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUA0NQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTE0CiAgICAvLyBza2lwX2ZpcnN0X3JlZGVtcHRpb24gPSBGYWxzZQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgNwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANDc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjEKICAgIC8vIGZ1dHVyZV9ldmVudF9pZCArPSBVSW50NjQoMSkKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV93aGlsZV90b3BAMzYKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlANDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTgKICAgIC8vIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZnJhbWVfZGlnIDAKICAgIHB1c2hpbnQgMjUKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTYtNTE5CiAgICAvLyBkaXNjb3VudF9mYWN0b3IgPSBzZWxmLl9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcigKICAgIC8vICAgICBkaXNjb3VudF9mYWN0b3IsCiAgICAvLyAgICAgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMgogICAgc3dhcAogICAgY2FsbHN1YiBfZGlzY291bnRfYW5udWl0eV9mYWN0b3IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjAKICAgIC8vIGRlbm9taW5hdG9yICs9IGRpc2NvdW50X2ZhY3RvcgogICAgZnJhbWVfZGlnIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA0NwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDE6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF9tZXJnZUA0MgoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX3doaWxlQDQ4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTIzCiAgICAvLyBhc3NlcnQgZGVub21pbmF0b3IgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZnJhbWVfZGlnIDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUyNAogICAgLy8gbnVtZXJhdG9yID0gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTI1CiAgICAvLyBpZiBlbnRyeS5mbGFncyAmIFVJbnQ2NChlbnVtcy5GTEFHX0lOSVRJQUxfUFJGKSA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNTcKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gOAogICAgJgogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDUwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjYtNTI3CiAgICAvLyAjIFN1YnNlcXVlbnQgUFJGIGV2ZW50cyBhbW9ydGl6ZSBib3RoIHByaW5jaXBhbCBhbmQgYWxyZWFkeSBhY2NydWVkIGNhcnJ5LgogICAgLy8gbnVtZXJhdG9yICs9IHNlbGYuYWNjcnVlZF9pbnRlcmVzdAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgICsKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDUwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTMwCiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTI4LTUzMgogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIG51bWVyYXRvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gICAgIGRlbm9taW5hdG9yLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDEKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODcKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IHNlbGYuX3JlY2FsY3VsYXRlX2FubnVpdHlfcGF5bWVudCgKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njg3LTY4OQogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gc2VsZi5fcmVjYWxjdWxhdGVfYW5udWl0eV9wYXltZW50KAogICAgLy8gICAgIGVudHJ5CiAgICAvLyApCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMzA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OTIKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY5My02OTcKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1VSW50NjQoMCksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OTUKICAgIC8vIHBheW9mZj1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njk2CiAgICAvLyBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY5My02OTcKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1VSW50NjQoMCksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgY2FsbHN1YiBfZW1pdF9leGVjdXRpb25fZXZlbnQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDI5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjkxCiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDMwCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDIwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc0CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9JUENCKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCAxOAogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDIzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzUtNjc2CiAgICAvLyAjIElQQ0Iga2VlcHMgcHJpbmNpcGFsIHVuY2hhbmdlZCBhbmQgb25seSByZXNldHMgdGhlIGludGVyZXN0IGJhc2UuCiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIGIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMjMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMTA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjIKICAgIC8vIGVsaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1JSRik6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgMTEKICAgID09CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDE0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjMKICAgIC8vIG5leHRfcmF0ZSA9IGVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY0CiAgICAvLyBpZiBuZXh0X3JhdGUgPT0gVUludDY0KDApOgogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDEzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjUKICAgIC8vIG5leHRfcmF0ZSA9IHNlbGYucmF0ZV9yZXNldF9uZXh0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzggLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDUKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfbmV4dCBleGlzdHMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY2CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IG5leHRfcmF0ZQogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgZnJhbWVfZGlnIDUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDE0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY4CiAgICAvLyBpZiBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSAhPSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgOQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2OQogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPSBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZQogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgZnJhbWVfZGlnIDkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KGVudHJ5OiBieXRlcywgcGF5b2ZmOiB1aW50NjQsIHNldHRsZWRfYW1vdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpfZW1pdF9leGVjdXRpb25fZXZlbnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MDMtNzA5CiAgICAvLyBkZWYgX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgKiwKICAgIC8vICAgICBlbnRyeTogdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnksCiAgICAvLyAgICAgcGF5b2ZmOiBVSW50NjQsCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ6IFVJbnQ2NCwKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDMgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzEzCiAgICAvLyBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25JRAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE0CiAgICAvLyBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIGZyYW1lX2RpZyAtMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTUKICAgIC8vIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIGZyYW1lX2RpZyAtMwogICAgZXh0cmFjdCA4IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxNgogICAgLy8gc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICBmcmFtZV9kaWcgLTMKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTcKICAgIC8vIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MjAKICAgIC8vIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIGZyYW1lX2RpZyAtMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE1CiAgICAvLyBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICBpbnRjXzIgLy8gOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIwCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBnZXRieXRlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDkKICAgIC8vIGlmIHBheW9mZiA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJueiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NTAKICAgIC8vIHJldHVybiBVSW50NjQoZW51bXMuUEFZT0ZGX1NJR05fUE9TSVRJVkUpCiAgICBpbnRjXzEgLy8gMQoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX3BheW9mZl9zaWduQDc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTktNzIxCiAgICAvLyBwYXlvZmZfc2lnbj1hcmM0LlVJbnQ4KAogICAgLy8gICAgIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIC8vICksCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgaW50Y18yIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MjMKICAgIC8vIGN1cnJlbmN5X2lkPXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzI0CiAgICAvLyBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTItNzI1CiAgICAvLyBFeGVjdXRpb25FdmVudCgKICAgIC8vICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIC8vICAgICBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYXBwbGllZF9hdD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICBwYXlvZmY9cGF5b2ZmLAogICAgLy8gICAgIHBheW9mZl9zaWduPWFyYzQuVUludDgoCiAgICAvLyAgICAgICAgIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIC8vICAgICApLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PXNldHRsZWRfYW1vdW50LAogICAgLy8gICAgIGN1cnJlbmN5X2lkPXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAwCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzExLTcyNgogICAgLy8gYXJjNC5lbWl0KAogICAgLy8gICAgIEV4ZWN1dGlvbkV2ZW50KAogICAgLy8gICAgICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgICAgIHBheW9mZj1wYXlvZmYsCiAgICAvLyAgICAgICAgIHBheW9mZl9zaWduPWFyYzQuVUludDgoCiAgICAvLyAgICAgICAgICAgICBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICAvLyAgICAgICAgICksCiAgICAvLyAgICAgICAgIHNldHRsZWRfYW1vdW50PXNldHRsZWRfYW1vdW50LAogICAgLy8gICAgICAgICBjdXJyZW5jeV9pZD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgICAgIHNlcXVlbmNlPWVudHJ5LmV2ZW50X2lkICsgVUludDY0KDEpLAogICAgLy8gICAgICkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDlhMzMyYjk1IC8vIG1ldGhvZCAiRXhlY3V0aW9uRXZlbnQodWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc1MQogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiAoVUludDY0KGVudW1zLkVWVF9JRUQpLCBVSW50NjQoZW51bXMuRVZUX1BJKSk6CiAgICBmcmFtZV9kaWcgNQogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBibnogX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2lmX2JvZHlANQogICAgZnJhbWVfZGlnIDUKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGJ6IF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pZl9lbHNlQDYKCl9lbWl0X2V4ZWN1dGlvbl9ldmVudF9pZl9ib2R5QDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NTIKICAgIC8vIHJldHVybiBVSW50NjQoZW51bXMuUEFZT0ZGX1NJR05fUE9TSVRJVkUpCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIwCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBiIF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9wYXlvZmZfc2lnbkA3CgpfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzUzCiAgICAvLyByZXR1cm4gVUludDY0KGVudW1zLlBBWU9GRl9TSUdOX05FR0FUSVZFKQogICAgcHVzaGludCAyNTUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcyMAogICAgLy8gc2VsZi5fcGF5b2ZmX3NpZ24oZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSwgcGF5b2ZmKQogICAgYiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fcGF5b2ZmX3NpZ25ANwoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9yb2xlX2lzX2FjdGl2ZShyb2xlX21hcDogYnl0ZXMsIHJvbGVfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NDoKX3JvbGVfaXNfYWN0aXZlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5CiAgICAvLyBkZWYgX3JvbGVfaXNfYWN0aXZlKHNlbGYsIHJvbGVfbWFwOiB0eXAuUmJhY1JvbGUsIHJvbGVfYWRkcmVzczogQWNjb3VudCkgLT4gYm9vbDoKICAgIHByb3RvIDIgMQogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTcKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAtNjQKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYxCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjIKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYxLTYyCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYxLTYzCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjMKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjItNjMKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgPj0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2MS02MwogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX21lcmdlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAtNjQKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKSAtPiB2b2lkOgpfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2NwogICAgLy8gYXNzZXJ0IHNlbGYuX2lzX2FycmFuZ2VyKFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTQKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgPT0gc2VsZi5hcnJhbmdlci52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE4IC8vIDB4NTIzYTQxNTI1MjIzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJyYW5nZXIgZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjY3CiAgICAvLyBhc3NlcnQgc2VsZi5faXNfYXJyYW5nZXIoVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkgLT4gdm9pZDoKX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg1CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuZGVmYXVsdGVkLCBlcnIuREVGQVVMVEVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzQgLy8gImRlZmF1bHRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kZWZhdWx0ZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRGVmYXVsdGVkCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKSAtPiB2b2lkOgpfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODgKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5jb250cmFjdF9zdXNwZW5kZWQsIGVyci5TVVNQRU5ERUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMyAvLyAiY29udHJhY3Rfc3VzcGVuZGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3N1c3BlbmRlZCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBTdXNwZW5kZWQgb3BlcmF0aW9ucwogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGVfaWQ6IHVpbnQ2NCkgLT4gdm9pZDoKX2Fzc2VydF92YWxpZF9yb2xlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkwCiAgICAvLyBkZWYgX2Fzc2VydF92YWxpZF9yb2xlKHNlbGYsIHJvbGVfaWQ6IFVJbnQ2NCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkxLTk5CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MgogICAgLy8gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgcHVzaGludCAyMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkxLTk5CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTMKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICBwdXNoaW50IDI1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEtOTkKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NAogICAgLy8gVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIHB1c2hpbnQgNDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MS05OQogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojk1CiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICBwdXNoaW50IDUwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEtOTkKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NgogICAgLy8gVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICBwdXNoaW50IDYwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEtOTkKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NwogICAgLy8gVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIHB1c2hpbnQgNzAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MS05OQogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojk4CiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICBwdXNoaW50IDgwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEtOTkKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBieiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9mYWxzZUA4CgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDc6CiAgICBpbnRjXzEgLy8gMQoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfbWVyZ2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MS05OQogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICByZXRzdWIKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX2ZhbHNlQDg6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9tZXJnZUA5Cg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="}, "sourceInfo": {"approval": {"pcOffsetMethod": "none", "sourceInfo": [{"pc": [2652], "errorMessage": "ACTUS event not yet executed"}, {"pc": [2410], "errorMessage": "Can not distribute zero units"}, {"pc": [3153, 3160, 3533], "errorMessage": "D-ASA already configured"}, {"pc": [1259, 1991, 2370, 2516, 3750, 3896, 4247, 4478, 4624], "errorMessage": "D-ASA not configured"}, {"pc": [3544], "errorMessage": "D-ASA terms not configured"}, {"pc": [6844], "errorMessage": "Defaulted"}, {"pc": [3171], "errorMessage": "Denomination asset is not properly set"}, {"pc": [3186], "errorMessage": "Different settlement asset not supported, must be equal to denomination asset"}, {"pc": [3422, 3429, 3431], "errorMessage": "IED must be set in the future"}, {"pc": [1277, 2060, 2531, 4265, 6196], "errorMessage": "IED not yet executed"}, {"pc": [2423, 5579], "errorMessage": "Insufficient remaining D-ASA units"}, {"pc": [2626, 2692], "errorMessage": "Insufficient sender units to transfer"}, {"pc": [1887, 3073, 3091, 3147, 3624, 3660, 4312, 5763, 6041, 6101, 6504], "errorMessage": "Invalid ACTUS configuration"}, {"pc": [2000, 2404, 2587, 2602, 2759, 2832, 2895, 2937, 5391, 5516], "errorMessage": "Invalid account holding address"}, {"pc": [4815, 4839, 4863, 4887, 4911, 4968, 4996, 5018, 5040, 5062, 5272, 5290, 5305, 5320, 5335], "errorMessage": "Invalid account role address"}, {"pc": [3133], "errorMessage": "Invalid day-count convention ID"}, {"pc": [1390, 3771, 4099, 6073], "errorMessage": "Invalid event cursor"}, {"pc": [3609, 3672, 3948, 4289, 5679], "errorMessage": "Invalid event id"}, {"pc": [3784, 4163, 4170, 4302], "errorMessage": "Invalid event type"}, {"pc": [4952, 5262, 6914], "errorMessage": "Invalid role identifier"}, {"pc": [3538, 3684, 3692, 4001, 4376, 5694, 5710], "errorMessage": "Invalid schedule page"}, {"pc": [5627], "errorMessage": "No D-ASA units"}, {"pc": [1396, 1916, 2097, 6082], "errorMessage": "No due cashflow to pay"}, {"pc": [6165], "errorMessage": "Not IED event"}, {"pc": [2045, 2378, 2574, 2749, 2805, 2815, 2901, 4198, 5085, 5116, 6836], "errorMessage": "Not authorized"}, {"pc": [1517, 1525, 2146, 2220, 2229], "errorMessage": "Not enough funds for the payment"}, {"pc": [3921, 3934, 4274], "errorMessage": "Observed event required to execute this action"}, {"pc": [2392, 2440], "errorMessage": "Primary distribution is closed"}, {"pc": [6113], "errorMessage": "Primary distribution is not complete"}, {"pc": [2615], "errorMessage": "Sender and receiver must be different"}, {"pc": [5377, 6852], "errorMessage": "Suspended operations"}, {"pc": [2327, 3650, 4334], "errorMessage": "Time events must be sorted in strictly ascending order"}, {"pc": [2548, 2565], "errorMessage": "Transfer is closed"}, {"pc": [2619], "errorMessage": "Transfer units must be greater than zero"}, {"pc": [936], "errorMessage": "Wrong Global Bytes allocation"}, {"pc": [942], "errorMessage": "Wrong Global UInts allocation"}, {"pc": [946], "errorMessage": "Wrong Local Bytes allocation"}, {"pc": [950], "errorMessage": "Wrong Local UInts allocation"}, {"pc": [1498, 2139], "errorMessage": "account opted into asset"}, {"pc": [6796, 6811], "errorMessage": "check BoxMap entry exists"}, {"pc": [2036, 2074, 2115, 2153, 2444, 2622, 2681, 2707, 5371, 5537], "errorMessage": "check self.account entry exists"}, {"pc": [1579, 1811, 1899, 4535, 6201, 6524], "errorMessage": "check self.accrued_interest exists"}, {"pc": [5134, 6834], "errorMessage": "check self.arranger exists"}, {"pc": [6850], "errorMessage": "check self.contract_suspended exists"}, {"pc": [3081, 3527, 3917, 3929, 4270, 4483, 5925], "errorMessage": "check self.contract_type exists"}, {"pc": [1547, 4540, 5399, 5477], "errorMessage": "check self.cumulative_interest_index exists"}, {"pc": [1559, 4545, 5410, 5485], "errorMessage": "check self.cumulative_principal_index exists"}, {"pc": [6842], "errorMessage": "check self.defaulted exists"}, {"pc": [5935], "errorMessage": "check self.dynamic_principal_redemption exists"}, {"pc": [1315, 1327, 1388, 1630, 2630, 2642, 3763, 4092, 4511, 4628, 4640, 4677, 5492, 6071, 6153, 6350, 6405, 6543], "errorMessage": "check self.event_cursor exists"}, {"pc": [5425, 5439, 5632, 5661, 5991, 5999, 6026, 6046, 6236, 6369, 6530], "errorMessage": "check self.fixed_point_scale exists"}, {"pc": [6279], "errorMessage": "check self.has_rate_reset_cap exists"}, {"pc": [6252], "errorMessage": "check self.has_rate_reset_floor exists"}, {"pc": [3158, 3543, 4507, 6170], "errorMessage": "check self.initial_exchange_amount exists"}, {"pc": [2428, 2438], "errorMessage": "check self.initial_exchange_date exists"}, {"pc": [1755, 4525, 5967, 5981], "errorMessage": "check self.interest_calculation_base exists"}, {"pc": [1827, 1842], "errorMessage": "check self.next_principal_redemption exists"}, {"pc": [4530, 5959, 5986, 6031], "errorMessage": "check self.nominal_interest_rate exists"}, {"pc": [2005, 2018], "errorMessage": "check self.op_daemon exists"}, {"pc": [1652, 1721, 1747, 1801, 1853, 1862, 1884, 4520, 6509, 6590], "errorMessage": "check self.outstanding_principal exists"}, {"pc": [6287, 6301], "errorMessage": "check self.rate_reset_cap exists"}, {"pc": [6260, 6274], "errorMessage": "check self.rate_reset_floor exists"}, {"pc": [6231], "errorMessage": "check self.rate_reset_multiplier exists"}, {"pc": [6624], "errorMessage": "check self.rate_reset_next exists"}, {"pc": [6244], "errorMessage": "check self.rate_reset_spread exists"}, {"pc": [1503, 2215, 4550], "errorMessage": "check self.reserved_interest exists"}, {"pc": [1508, 1537, 2225, 2240, 4555], "errorMessage": "check self.reserved_principal exists"}, {"pc": [2415, 2463, 4502, 5574, 6106], "errorMessage": "check self.reserved_units_total exists"}, {"pc": [1319, 2634, 3767, 3946, 3963, 4083, 4284, 4319, 4338, 4458, 4515, 4632, 5675, 6346, 6413], "errorMessage": "check self.schedule_entry_count exists"}, {"pc": [3991, 4366], "errorMessage": "check self.schedule_page entry exists"}, {"pc": [1495, 2105, 2133, 6696], "errorMessage": "check self.settlement_asset_id exists"}, {"pc": [1258, 1272, 1990, 2055, 2369, 2388, 2515, 2526, 2809, 3151, 3531, 3749, 3895, 4246, 4260, 4476, 4623, 5520, 6097, 6191], "errorMessage": "check self.status exists"}, {"pc": [2421, 2474, 4497, 5625, 5656, 6111], "errorMessage": "check self.total_units exists"}, {"pc": [2553, 2563], "errorMessage": "check self.transfer_closure_date exists"}, {"pc": [2536, 2544], "errorMessage": "check self.transfer_opening_date exists"}, {"pc": [3586, 3643], "errorMessage": "index access is out of bounds"}, {"pc": [1974, 3018, 3501, 3996, 4371], "errorMessage": "invalid array length header"}, {"pc": [2739, 3489, 5075, 5106], "errorMessage": "invalid number of bytes for arc4.bool"}, {"pc": [1982], "errorMessage": "invalid number of bytes for arc4.dynamic_array"}, {"pc": [3516], "errorMessage": "invalid number of bytes for arc4.dynamic_array"}, {"pc": [1968, 2353, 2493, 2501, 2731, 2789, 2797, 2877, 2885, 2928, 2953, 4696, 4720, 4754, 4935, 5148, 5232], "errorMessage": "invalid number of bytes for arc4.static_array"}, {"pc": [1253, 2311, 2320, 2361, 2510, 3479, 3880], "errorMessage": "invalid number of bytes for arc4.uint64"}, {"pc": [4744, 4925, 5222], "errorMessage": "invalid number of bytes for arc4.uint8"}, {"pc": [2990], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.InitialKernelState"}, {"pc": [2979], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.NormalizedActusTerms"}, {"pc": [4242], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.ObservedCashEventRequest"}, {"pc": [3891], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.ObservedEventRequest"}, {"pc": [3023], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.Prospectus"}, {"pc": [4765], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.RoleValidity"}, {"pc": [3007], "errorMessage": "invalid tail pointer at index 1 of (uint8[32],(len+utf8[]))"}, {"pc": [3002], "errorMessage": "invalid tuple encoding"}, {"pc": [4063, 4438], "errorMessage": "max array length exceeded"}, {"pc": [4489, 6688], "errorMessage": "overflow"}]}, "clear": {"pcOffsetMethod": "none", "sourceInfo": []}}, "templateVariables": {}}""" APP_SPEC = algokit_utils.Arc56Contract.from_json(_APP_SPEC_JSON) def _parse_abi_args(args: object | None = None) -> list[object] | None: @@ -332,15 +332,6 @@ class AppendObservedCashEventArgs: def abi_method_signature(self) -> str: return "append_observed_cash_event((uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64" -@dataclasses.dataclass(frozen=True, kw_only=True) -class ContractSetDefaultStatusArgs: - """Dataclass for contract_set_default_status arguments""" - defaulted: bool - - @property - def abi_method_signature(self) -> str: - return "contract_set_default_status(bool)uint64" - @dataclasses.dataclass(frozen=True, kw_only=True) class RbacRotateArrangerArgs: """Dataclass for rbac_rotate_arranger arguments""" @@ -389,6 +380,15 @@ class RbacContractSuspensionArgs: def abi_method_signature(self) -> str: return "rbac_contract_suspension(bool)uint64" +@dataclasses.dataclass(frozen=True, kw_only=True) +class RbacContractDefaultArgs: + """Dataclass for rbac_contract_default arguments""" + defaulted: bool + + @property + def abi_method_signature(self) -> str: + return "rbac_contract_default(bool)uint64" + @dataclasses.dataclass(frozen=True, kw_only=True) class RbacGetAddressRolesArgs: """Dataclass for rbac_get_address_roles arguments""" @@ -624,19 +624,6 @@ def append_observed_cash_event( "args": method_args, })) - def contract_set_default_status( - self, - args: tuple[bool] | ContractSetDefaultStatusArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "contract_set_default_status(bool)uint64", - "args": method_args, - })) - def contract_get_state( self, params: algokit_utils.CommonAppCallParams | None = None @@ -724,6 +711,19 @@ def rbac_contract_suspension( "args": method_args, })) + def rbac_contract_default( + self, + args: tuple[bool] | RbacContractDefaultArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.AppCallMethodCallParams: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_contract_default(bool)uint64", + "args": method_args, + })) + def rbac_get_arranger( self, params: algokit_utils.CommonAppCallParams | None = None @@ -991,19 +991,6 @@ def append_observed_cash_event( "args": method_args, })) - def contract_set_default_status( - self, - args: tuple[bool] | ContractSetDefaultStatusArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "contract_set_default_status(bool)uint64", - "args": method_args, - })) - def contract_get_state( self, params: algokit_utils.CommonAppCallParams | None = None @@ -1091,6 +1078,19 @@ def rbac_contract_suspension( "args": method_args, })) + def rbac_contract_default( + self, + args: tuple[bool] | RbacContractDefaultArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.BuiltTransactions: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_contract_default(bool)uint64", + "args": method_args, + })) + def rbac_get_arranger( self, params: algokit_utils.CommonAppCallParams | None = None @@ -1403,22 +1403,6 @@ def append_observed_cash_event( parsed_response = response return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - def contract_set_default_status( - self, - args: tuple[bool] | ContractSetDefaultStatusArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "contract_set_default_status(bool)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - def contract_get_state( self, params: algokit_utils.CommonAppCallParams | None = None, @@ -1527,6 +1511,22 @@ def rbac_contract_suspension( parsed_response = response return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) + def rbac_contract_default( + self, + args: tuple[bool] | RbacContractDefaultArgs, + params: algokit_utils.CommonAppCallParams | None = None, + send_params: algokit_utils.SendParams | None = None + ) -> algokit_utils.SendAppTransactionResult[int]: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_contract_default(bool)uint64", + "args": method_args, + }), send_params=send_params) + parsed_response = response + return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) + def rbac_get_arranger( self, params: algokit_utils.CommonAppCallParams | None = None, @@ -1604,8 +1604,8 @@ class GlobalStateValue(typing.TypedDict): """Shape of global_state state key values""" arranger: str op_daemon: str - asset_suspended: int - asset_defaulted: int + contract_suspended: int + defaulted: int status: int contract_type: int prospectus_hash: bytes @@ -1639,7 +1639,6 @@ class GlobalStateValue(typing.TypedDict): cumulative_principal_index: int event_cursor: int schedule_entry_count: int - defaulted: int fixed_point_scale: int class DasaState: @@ -1702,17 +1701,17 @@ def op_daemon(self) -> str: return typing.cast(str, value) @property - def asset_suspended(self) -> int: - """Get the current value of the asset_suspended key in global_state state""" - value = self.app_client.state.global_state.get_value("asset_suspended") + def contract_suspended(self) -> int: + """Get the current value of the contract_suspended key in global_state state""" + value = self.app_client.state.global_state.get_value("contract_suspended") if isinstance(value, dict) and "AVMUint64" in self._struct_classes: return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore return typing.cast(int, value) @property - def asset_defaulted(self) -> int: - """Get the current value of the asset_defaulted key in global_state state""" - value = self.app_client.state.global_state.get_value("asset_defaulted") + def defaulted(self) -> int: + """Get the current value of the defaulted key in global_state state""" + value = self.app_client.state.global_state.get_value("defaulted") if isinstance(value, dict) and "AVMUint64" in self._struct_classes: return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore return typing.cast(int, value) @@ -1981,14 +1980,6 @@ def schedule_entry_count(self) -> int: return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore return typing.cast(int, value) - @property - def defaulted(self) -> int: - """Get the current value of the defaulted key in global_state state""" - value = self.app_client.state.global_state.get_value("defaulted") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - @property def fixed_point_scale(self) -> int: """Get the current value of the fixed_point_scale key in global_state state""" @@ -2349,12 +2340,6 @@ def decode_return_value( return_value: algokit_utils.ABIReturn | None ) -> int | None: ... @typing.overload - def decode_return_value( - self, - method: typing.Literal["contract_set_default_status(bool)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload def decode_return_value( self, method: typing.Literal["contract_get_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)"], @@ -2397,6 +2382,12 @@ def decode_return_value( return_value: algokit_utils.ABIReturn | None ) -> int | None: ... @typing.overload + def decode_return_value( + self, + method: typing.Literal["rbac_contract_default(bool)uint64"], + return_value: algokit_utils.ABIReturn | None + ) -> int | None: ... + @typing.overload def decode_return_value( self, method: typing.Literal["rbac_get_arranger()address"], @@ -2921,26 +2912,6 @@ def append_observed_cash_event( compilation_params=compilation_params ) - def contract_set_default_status( - self, - args: tuple[bool] | ContractSetDefaultStatusArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the contract_set_default_status(bool)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "contract_set_default_status(bool)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - def contract_get_state( self, *, @@ -3079,6 +3050,26 @@ def rbac_contract_suspension( compilation_params=compilation_params ) + def rbac_contract_default( + self, + args: tuple[bool] | RbacContractDefaultArgs, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.AppCreateMethodCallParams: + """Creates a new instance using the rbac_contract_default(bool)uint64 ABI method""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.create( + algokit_utils.AppFactoryCreateMethodCallParams( + **{ + **dataclasses.asdict(params), + "method": "rbac_contract_default(bool)uint64", + "args": _parse_abi_args(args), + } + ), + compilation_params=compilation_params + ) + def rbac_get_arranger( self, *, @@ -3608,25 +3599,6 @@ def append_observed_cash_event( ) return self - def contract_set_default_status( - self, - args: tuple[bool] | ContractSetDefaultStatusArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "DasaComposer": - self._composer.add_app_call_method_call( - self.client.params.contract_set_default_status( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "contract_set_default_status(bool)uint64", v - ) - ) - return self - def contract_get_state( self, params: algokit_utils.CommonAppCallParams | None = None, @@ -3758,6 +3730,25 @@ def rbac_contract_suspension( ) return self + def rbac_contract_default( + self, + args: tuple[bool] | RbacContractDefaultArgs, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> "DasaComposer": + self._composer.add_app_call_method_call( + self.client.params.rbac_contract_default( + args=args, + params=params, + ) + ) + self._result_mappers.append( + lambda v: self.client.decode_return_value( + "rbac_contract_default(bool)uint64", v + ) + ) + return self + def rbac_get_arranger( self, params: algokit_utils.CommonAppCallParams | None = None, From 4ff7502ae1423ac0ea3499fd85fb154c17f8ec64 Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 16:29:30 +0100 Subject: [PATCH 175/244] chore: rename --- tests/mock_module_rbac/test_mock_rbac_module.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/mock_module_rbac/test_mock_rbac_module.py b/tests/mock_module_rbac/test_mock_rbac_module.py index c9587689..5d407c95 100644 --- a/tests/mock_module_rbac/test_mock_rbac_module.py +++ b/tests/mock_module_rbac/test_mock_rbac_module.py @@ -262,20 +262,20 @@ def test_rbac_gov_asset_suspension_is_authority_only( no_role_account: SigningAccount, rbac_client: MockRbacModuleClient, ) -> None: - assert not rbac_client.state.global_state.asset_suspended + assert not rbac_client.state.global_state.contract_suspended result = rbac_client.send.rbac_contract_suspension( RbacContractSuspensionArgs(suspended=True), params=CommonAppCallParams(sender=authority.address), ) assert result.abi_return > 0 - assert rbac_client.state.global_state.asset_suspended + assert rbac_client.state.global_state.contract_suspended rbac_client.send.rbac_contract_suspension( RbacContractSuspensionArgs(suspended=False), params=CommonAppCallParams(sender=authority.address), ) - assert not rbac_client.state.global_state.asset_suspended + assert not rbac_client.state.global_state.contract_suspended with pytest.raises(LogicError, match=err.UNAUTHORIZED): rbac_client.send.rbac_contract_suspension( From 865b93dd38032f553a5384f4a4536dc85329c702 Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 16:31:04 +0100 Subject: [PATCH 176/244] docs: update with default in rbac module --- docs/implementation/architecture.md | 9 ++++--- docs/interfaces/contract/overview.md | 26 +++---------------- docs/interfaces/rbac/overview.md | 22 +++++++++++++++- docs/interfaces/types.md | 4 +-- docs/specs/contract/attributes.md | 10 ++++--- .../contract/kernel-state-and-schedule.md | 7 ++--- .../normalization-and-configuration.md | 2 +- docs/specs/rbac/rbac.md | 5 ++-- docs/specs/rbac/roles.md | 2 +- 9 files changed, 47 insertions(+), 40 deletions(-) diff --git a/docs/implementation/architecture.md b/docs/implementation/architecture.md index 26858036..4a4f1b22 100644 --- a/docs/implementation/architecture.md +++ b/docs/implementation/architecture.md @@ -30,10 +30,11 @@ This separation is intentional: ## Module responsibilities -- `RbacModule`: role assignment, suspension, and application-control methods. +- `RbacModule`: role assignment, suspension, contract default control, and +application-control methods. - `ActusKernelModule`: normalized-term validation, schedule storage, event cursor, -state transitions, contract-performance default tracking, and generic ACTUS getters. +state transitions, and generic ACTUS getters. - `AccountingModule`: holder positions, unit activation, checkpoints, and claim ledgers. @@ -46,9 +47,9 @@ ledgers. | Layer | Public methods | |:---------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| RBAC | `contract_update`, `rbac_rotate_arranger`, `rbac_set_op_daemon`, `rbac_assign_role`, `rbac_revoke_role`, `rbac_contract_suspension`, `rbac_get_arranger`, `rbac_get_address_roles`, `rbac_get_role_validity` | +| RBAC | `contract_update`, `rbac_rotate_arranger`, `rbac_set_op_daemon`, `rbac_assign_role`, `rbac_revoke_role`, `rbac_contract_suspension`, `rbac_contract_default`, `rbac_get_arranger`, `rbac_get_address_roles`, `rbac_get_role_validity` | | Accounting | `account_suspension`, `account_open`, `account_update_payment_address`, `account_get_position` | -| ACTUS Kernel | `contract_create`, `contract_config`, `contract_schedule`, `contract_execute_ied`, `apply_non_cash_event`, `append_observed_cash_event`, `contract_set_default_status`, `contract_get_state`, `contract_get_next_due_event` | +| ACTUS Kernel | `contract_create`, `contract_config`, `contract_schedule`, `contract_execute_ied`, `apply_non_cash_event`, `append_observed_cash_event`, `contract_get_state`, `contract_get_next_due_event` | | Payment Agent | `fund_due_cashflows`, `claim_due_cashflows` | | Transfer Agent | `transfer_set_schedule`, `primary_distribution`, `transfer` | diff --git a/docs/interfaces/contract/overview.md b/docs/interfaces/contract/overview.md index 6d48c926..0793e404 100644 --- a/docs/interfaces/contract/overview.md +++ b/docs/interfaces/contract/overview.md @@ -1,8 +1,7 @@ # ACTUS Kernel Interface The ACTUS Kernel interface configures the normalized contract, stores the execution -schedule, records the contract-performance default flag, and advances non-cash -lifecycle events. +schedule, and advances non-cash lifecycle events. ## `contract_create` @@ -152,25 +151,6 @@ Only the Arranger may call this method. } ``` -## `contract_set_default_status` - -```json -{ - "name": "contract_set_default_status", - "readonly": false, - "args": [ - { "name": "defaulted", "type": "bool" } - ], - "returns": { "type": "uint64", "desc": "UNIX timestamp of the default-status update" }, - "errors": ["UNAUTHORIZED"] -} -``` - -Only an active Trustee may call this method. - -It sets or clears the contract-level `defaulted` performance flag. This flag is -distinct from the kernel lifecycle `status`. - ## `contract_get_state` ```json @@ -183,8 +163,8 @@ distinct from the kernel lifecycle `status`. } ``` -`KernelState` does not include the separate `defaulted` performance flag. Clients -that need that value must read the dedicated global-state key. +`KernelState` does not include the separate RBAC-managed `defaulted` performance +flag. Clients that need that value must read the dedicated global-state key. ## `contract_get_next_due_event` diff --git a/docs/interfaces/rbac/overview.md b/docs/interfaces/rbac/overview.md index be4fe900..b983a543 100644 --- a/docs/interfaces/rbac/overview.md +++ b/docs/interfaces/rbac/overview.md @@ -1,6 +1,7 @@ # RBAC Interface -The RBAC interface manages privileged roles, suspension state, and application control. +The RBAC interface manages privileged roles, suspension state, contract default +state, and application control. Only the Arranger may call RBAC methods, unless otherwise specified. @@ -93,6 +94,25 @@ This is a non-normative helper for payment automation. Only an active Authority may call this method. +## `rbac_contract_default` + +```json +{ + "name": "rbac_contract_default", + "readonly": false, + "args": [ + { "name": "defaulted", "type": "bool" } + ], + "returns": { "type": "uint64", "desc": "UNIX timestamp of the default update" }, + "errors": ["UNAUTHORIZED"] +} +``` + +Only an active Trustee may call this method. + +It sets or clears the contract-level `defaulted` performance flag. This flag is +distinct from the kernel lifecycle `status`. + ## `rbac_get_arranger` ```json diff --git a/docs/interfaces/types.md b/docs/interfaces/types.md index 7d798466..2b37a5bb 100644 --- a/docs/interfaces/types.md +++ b/docs/interfaces/types.md @@ -148,8 +148,8 @@ Readonly snapshot returned by `contract_get_state`. | `reserved_interest` | `uint64` | Reserved interest balance | | `reserved_principal` | `uint64` | Reserved principal balance | -The contract-level `defaulted` performance flag is stored separately in global -state and is not part of `KernelState`. +The contract-level `defaulted` performance flag is stored separately in RBAC-managed +global state and is not part of `KernelState`. ## `AccountPosition` diff --git a/docs/specs/contract/attributes.md b/docs/specs/contract/attributes.md index 0d6aa112..0e51a4db 100644 --- a/docs/specs/contract/attributes.md +++ b/docs/specs/contract/attributes.md @@ -169,8 +169,8 @@ enumerated IDs: > [!NOTE] > The current reference implementation supports manual default-performance tracking -> through a boolean `defaulted` flag. It does not yet model the full `PRF` lifecycle -> enum or automatic grace-period and delinquency transitions on chain. +> through an RBAC-managed boolean `defaulted` flag. It does not yet model the full +> `PRF` lifecycle enum or automatic grace-period and delinquency transitions on chain. ### Grace Period @@ -203,9 +203,13 @@ The D-ASA **MAY** disable all non-administrative methods on *default* status. > The D-ASA default can be called either automatically (based on program conditions) > or manually (based on the decision of a trustee). -The *Trustee* **MAY** set the default status with the `contract_set_default_status` +The *Trustee* **MAY** set the default status with the `rbac_contract_default` method. +In the current reference implementation, `rbac_contract_default(defaulted: bool)` +stores a boolean `defaulted` flag in RBAC global state. This performance flag is +distinct from the kernel lifecycle `status`. + > [!TIP] > The D-ASA has no *grace period* and no *delinquency period*. A D-ASA coupon payment > is triggered on due date, but there is not enough liquidity to pay all the investors. diff --git a/docs/specs/contract/kernel-state-and-schedule.md b/docs/specs/contract/kernel-state-and-schedule.md index 68a45aaf..bb7e8cde 100644 --- a/docs/specs/contract/kernel-state-and-schedule.md +++ b/docs/specs/contract/kernel-state-and-schedule.md @@ -125,10 +125,11 @@ stateDiagram-v2 Kernel lifecycle `status` and contract performance are distinct concepts. -In addition to `status`, the reference implementation stores a boolean global-state -flag, `defaulted`, to record manual contract default performance. +Outside the kernel normalized state, the reference implementation stores a boolean +RBAC-managed global-state flag, `defaulted`, to record manual contract default +performance. -An active Trustee **MAY** update this flag by calling `contract_set_default_status` +An active Trustee **MAY** update this flag by calling `rbac_contract_default` with a boolean `defaulted` argument. `defaulted` is not part of `InitialKernelState` and is not returned by `contract_get_state`. diff --git a/docs/specs/contract/normalization-and-configuration.md b/docs/specs/contract/normalization-and-configuration.md index 598b222b..dce76130 100644 --- a/docs/specs/contract/normalization-and-configuration.md +++ b/docs/specs/contract/normalization-and-configuration.md @@ -93,4 +93,4 @@ ABI and, if enforced, **MUST** be configured separately at the execution layer. The contract-level `defaulted` performance flag is not part of normalization or `InitialKernelState`. If used, it is updated separately at execution time through -`contract_set_default_status`. +the RBAC method `rbac_contract_default`. diff --git a/docs/specs/rbac/rbac.md b/docs/specs/rbac/rbac.md index 2631cb7e..fa39ba50 100644 --- a/docs/specs/rbac/rbac.md +++ b/docs/specs/rbac/rbac.md @@ -64,10 +64,11 @@ When an account is suspended, the implementation **MUST** reject: ## Trustee-controlled default -`contract_set_default_status` **MUST** be restricted to the Trustee role. +`rbac_contract_default` **MUST** be restricted to the Trustee role. In the current reference implementation, this method sets or clears the contract-level -`defaulted` performance flag. It does not change the kernel lifecycle `status`. +`defaulted` performance flag in RBAC global state. It does not change the kernel +lifecycle `status`. ## Observer-controlled events diff --git a/docs/specs/rbac/roles.md b/docs/specs/rbac/roles.md index dc87add0..ce668bb8 100644 --- a/docs/specs/rbac/roles.md +++ b/docs/specs/rbac/roles.md @@ -95,7 +95,7 @@ The Trustee role **MUST** control the contract performance \\( [PRF] \\) (see [Performance](../contract/attributes.md#performance) section for further details). In the current reference implementation, an active Trustee can set or clear the -contract-level `defaulted` performance flag with `contract_set_default_status`. +contract-level `defaulted` performance flag with `rbac_contract_default`. This performance flag is distinct from the kernel lifecycle `status`. From a223619162dba11322c1227afc70ea7b628ca4d3 Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 16:31:14 +0100 Subject: [PATCH 177/244] chore: spare state schema --- smart_contracts/config.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/smart_contracts/config.py b/smart_contracts/config.py index e024ae5e..64a87c52 100644 --- a/smart_contracts/config.py +++ b/smart_contracts/config.py @@ -1,7 +1,13 @@ from typing import Final -# State Schema (actual + spare for updates) -GLOBAL_BYTES: Final[int] = 4 + 6 -GLOBAL_UINTS: Final[int] = 35 + 19 +# State Schema +GLOBAL_BYTES_ACTUAL: Final[int] = 4 +GLOBAL_BYTES_SPARE: Final[int] = 6 +GLOBAL_BYTES: Final[int] = GLOBAL_BYTES_ACTUAL + GLOBAL_BYTES_SPARE + +GLOBAL_UINTS_ACTUAL: Final[int] = 34 +GLOBAL_UINTS_SPARE: Final[int] = 20 +GLOBAL_UINTS: Final[int] = GLOBAL_UINTS_ACTUAL + GLOBAL_UINTS_SPARE + LOCAL_BYTES: Final[int] = 0 LOCAL_UINTS: Final[int] = 0 From 665d147d9cc341d5eba16ab75a780be96c9e5e71 Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 16:32:15 +0100 Subject: [PATCH 178/244] chore: lint --- docs/implementation/architecture.md | 12 ++++++------ docs/specs/contract/attributes.md | 3 ++- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/docs/implementation/architecture.md b/docs/implementation/architecture.md index 4a4f1b22..571627c4 100644 --- a/docs/implementation/architecture.md +++ b/docs/implementation/architecture.md @@ -45,13 +45,13 @@ ledgers. ## Public API by layer -| Layer | Public methods | -|:---------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| Layer | Public methods | +|:---------------|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | RBAC | `contract_update`, `rbac_rotate_arranger`, `rbac_set_op_daemon`, `rbac_assign_role`, `rbac_revoke_role`, `rbac_contract_suspension`, `rbac_contract_default`, `rbac_get_arranger`, `rbac_get_address_roles`, `rbac_get_role_validity` | -| Accounting | `account_suspension`, `account_open`, `account_update_payment_address`, `account_get_position` | -| ACTUS Kernel | `contract_create`, `contract_config`, `contract_schedule`, `contract_execute_ied`, `apply_non_cash_event`, `append_observed_cash_event`, `contract_get_state`, `contract_get_next_due_event` | -| Payment Agent | `fund_due_cashflows`, `claim_due_cashflows` | -| Transfer Agent | `transfer_set_schedule`, `primary_distribution`, `transfer` | +| Accounting | `account_suspension`, `account_open`, `account_update_payment_address`, `account_get_position` | +| ACTUS Kernel | `contract_create`, `contract_config`, `contract_schedule`, `contract_execute_ied`, `apply_non_cash_event`, `append_observed_cash_event`, `contract_get_state`, `contract_get_next_due_event` | +| Payment Agent | `fund_due_cashflows`, `claim_due_cashflows` | +| Transfer Agent | `transfer_set_schedule`, `primary_distribution`, `transfer` | ## Execution flows diff --git a/docs/specs/contract/attributes.md b/docs/specs/contract/attributes.md index 0e51a4db..f22f7c04 100644 --- a/docs/specs/contract/attributes.md +++ b/docs/specs/contract/attributes.md @@ -170,7 +170,8 @@ enumerated IDs: > [!NOTE] > The current reference implementation supports manual default-performance tracking > through an RBAC-managed boolean `defaulted` flag. It does not yet model the full -> `PRF` lifecycle enum or automatic grace-period and delinquency transitions on chain. +> `PRF` lifecycle enum or automatic grace-period and delinquency transitions on +> chain. ### Grace Period From 46d1420e665c432a5b2c36cf2f8e4c27a2670ddd Mon Sep 17 00:00:00 2001 From: Cosimo Bassi <65770425+cusma@users.noreply.github.com> Date: Fri, 13 Mar 2026 16:37:27 +0100 Subject: [PATCH 179/244] chore: nit Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- docs/specs/rbac/roles.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/specs/rbac/roles.md b/docs/specs/rbac/roles.md index ce668bb8..eeb8cd6e 100644 --- a/docs/specs/rbac/roles.md +++ b/docs/specs/rbac/roles.md @@ -23,7 +23,7 @@ The current reference implementation uses the following role set: | `MNG` | `40` | Account Manager | Opens holder accounts | | `PYD` | `50` | Primary Dealer | Allocates units during primary distribution | | `TRS` | `60` | Trustee | Sets or clears the contract default-performance flag | -| `AUT` | `70` | Authority | Suspends the asset or individual accounts | +| `AUT` | `70` | Authority | Suspends the contract or individual accounts | | `MOC` | `80` | Observer | Applies rate-reset events that depend on observed data | > [!TIP] @@ -103,7 +103,7 @@ This performance flag is distinct from the kernel lifecycle `status`. The Authority owns an Algorand Address. -The Authority **MUST** be able to suspend the whole asset and individual holder +The Authority **MUST** be able to suspend the contract and individual holder accounts. ### Observer From 755715218e3970df577a375f0cb381dfe887773c Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 16:40:21 +0100 Subject: [PATCH 180/244] chore: rename subs --- modules/accounting.py | 8 ++++---- modules/actus_kernel.py | 12 ++++++------ modules/payment_agent.py | 8 ++++---- modules/rbac.py | 8 ++++---- modules/transfer_agent.py | 8 ++++---- 5 files changed, 22 insertions(+), 22 deletions(-) diff --git a/modules/accounting.py b/modules/accounting.py index 74a070e3..52dec657 100644 --- a/modules/accounting.py +++ b/modules/accounting.py @@ -208,8 +208,8 @@ def account_open( self._assert_caller_is_account_manager() assert not self._status_is_ended(), err.UNAUTHORIZED - self._assert_is_not_asset_defaulted() - self._assert_is_not_asset_suspended() + self._assert_is_not_contract_defaulted() + self._assert_is_not_contract_suspended() assert holding_address not in self.account, err.INVALID_HOLDING_ADDRESS self.account[holding_address] = self._new_account_position(payment_address) return Global.latest_timestamp @@ -236,8 +236,8 @@ def account_update_payment_address( """ self._assert_valid_holding_address(holding_address) assert Txn.sender == holding_address, err.UNAUTHORIZED - self._assert_is_not_asset_defaulted() - self._assert_is_not_asset_suspended() + self._assert_is_not_contract_defaulted() + self._assert_is_not_contract_suspended() self.account[holding_address].payment_address = payment_address return Global.latest_timestamp diff --git a/modules/actus_kernel.py b/modules/actus_kernel.py index df6a611c..62e8a5d7 100644 --- a/modules/actus_kernel.py +++ b/modules/actus_kernel.py @@ -1141,8 +1141,8 @@ def contract_execute_ied(self) -> UInt64: """ self._assert_configured() self._assert_caller_is_arranger() - self._assert_is_not_asset_defaulted() - self._assert_is_not_asset_suspended() + self._assert_is_not_contract_defaulted() + self._assert_is_not_contract_suspended() assert self.event_cursor < self.schedule_entry_count, err.INVALID_EVENT_CURSOR entry = self._get_schedule_entry(self.event_cursor) @@ -1201,8 +1201,8 @@ def apply_non_cash_event( PENDING_IED: Initial exchange has not executed yet for post-IED events. """ self._assert_configured() - self._assert_is_not_asset_defaulted() - self._assert_is_not_asset_suspended() + self._assert_is_not_contract_defaulted() + self._assert_is_not_contract_suspended() if payload.flags & UInt64(enums.FLAG_OBSERVED_EVENT): assert self._supports_observed_events(), err.OBSERVED_EVENT_REQUIRED @@ -1252,8 +1252,8 @@ def append_observed_cash_event( """ self._assert_configured() self._assert_caller_is_arranger() - self._assert_is_not_asset_defaulted() - self._assert_is_not_asset_suspended() + self._assert_is_not_contract_defaulted() + self._assert_is_not_contract_suspended() self._assert_initial_exchange_executed() self._append_observed_cash_event(payload) diff --git a/modules/payment_agent.py b/modules/payment_agent.py index 62380afc..cada6edc 100644 --- a/modules/payment_agent.py +++ b/modules/payment_agent.py @@ -66,8 +66,8 @@ def fund_due_cashflows(self, *, max_event_count: UInt64) -> typ.CashFundingResul """ self._assert_configured() self._assert_caller_is_arranger() - self._assert_is_not_asset_defaulted() - self._assert_is_not_asset_suspended() + self._assert_is_not_contract_defaulted() + self._assert_is_not_contract_suspended() self._assert_initial_exchange_executed() if self._is_dynamic_annuity(): ensure_budget( @@ -136,8 +136,8 @@ def claim_due_cashflows( self._assert_configured() self._assert_valid_holding_address(holding_address) self._assert_payment_authorization(holding_address) - self._assert_is_not_asset_defaulted() - self._assert_is_not_asset_suspended() + self._assert_is_not_contract_defaulted() + self._assert_is_not_contract_suspended() self._assert_initial_exchange_executed() self._ensure_units_activated(holding_address) diff --git a/modules/rbac.py b/modules/rbac.py index 740a5091..df581d4e 100644 --- a/modules/rbac.py +++ b/modules/rbac.py @@ -81,10 +81,10 @@ def _assert_caller_is_authority(self) -> None: def _assert_caller_is_observer(self) -> None: assert self._role_is_active(self.observer, Txn.sender), err.UNAUTHORIZED - def _assert_is_not_asset_defaulted(self) -> None: + def _assert_is_not_contract_defaulted(self) -> None: assert not self.defaulted, err.DEFAULTED - def _assert_is_not_asset_suspended(self) -> None: + def _assert_is_not_contract_suspended(self) -> None: assert not self.contract_suspended, err.SUSPENDED def _assert_valid_role(self, role_id: UInt64) -> None: @@ -222,7 +222,7 @@ def rbac_assign_role( """ self._assert_caller_is_arranger() - self._assert_is_not_asset_defaulted() + self._assert_is_not_contract_defaulted() self._assert_valid_role(role_id.as_uint64()) self._set_role(role_id.as_uint64(), role_address, validity) return Global.latest_timestamp @@ -247,7 +247,7 @@ def rbac_revoke_role(self, *, role_id: arc4.UInt8, role_address: Account) -> UIn """ self._assert_caller_is_arranger() - self._assert_is_not_asset_defaulted() + self._assert_is_not_contract_defaulted() self._assert_valid_role(role_id.as_uint64()) self._delete_role(role_id.as_uint64(), role_address) return Global.latest_timestamp diff --git a/modules/transfer_agent.py b/modules/transfer_agent.py index be8c2047..a8687d79 100644 --- a/modules/transfer_agent.py +++ b/modules/transfer_agent.py @@ -73,8 +73,8 @@ def primary_distribution( """ self._assert_configured() self._assert_caller_is_primary_dealer() - self._assert_is_not_asset_defaulted() - self._assert_is_not_asset_suspended() + self._assert_is_not_contract_defaulted() + self._assert_is_not_contract_suspended() assert self._status_is_pending_ied(), err.PRIMARY_DISTRIBUTION_CLOSED self._assert_valid_holding_address(holding_address) self._assert_is_not_account_suspended(holding_address) @@ -127,8 +127,8 @@ def transfer( PENDING_ACTUS_EVENT: A due ACTUS event must be processed before transfer. """ self._assert_configured() - self._assert_is_not_asset_defaulted() - self._assert_is_not_asset_suspended() + self._assert_is_not_contract_defaulted() + self._assert_is_not_contract_suspended() self._assert_initial_exchange_executed() self._assert_transfer_is_open() From ff512643de2edfbd1357ba8aafab14663e835c4a Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 16:40:28 +0100 Subject: [PATCH 181/244] chore: build artifacts --- .../artifacts/d_asa/DASA.approval.puya.map | 88 +++++++++---------- .../artifacts/d_asa/DASA.approval.teal | 88 +++++++++---------- .../MockRbacModule.approval.puya.map | 12 +-- .../MockRbacModule.approval.teal | 12 +-- .../MockRbacModule.arc56.json | 2 +- .../mock_rbac_module_client.py | 2 +- src/artifacts/DASA.arc56.json | 2 +- src/artifacts/dasa_client.py | 2 +- 8 files changed, 104 insertions(+), 104 deletions(-) diff --git a/smart_contracts/artifacts/d_asa/DASA.approval.puya.map b/smart_contracts/artifacts/d_asa/DASA.approval.puya.map index 55881272..27364a58 100644 --- a/smart_contracts/artifacts/d_asa/DASA.approval.puya.map +++ b/smart_contracts/artifacts/d_asa/DASA.approval.puya.map @@ -1772,12 +1772,12 @@ "op": "callsub _assert_caller_is_arranger" }, "1263": { - "callsub": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", - "op": "callsub _assert_is_not_asset_defaulted" + "callsub": "modules.rbac.RbacModule._assert_is_not_contract_defaulted", + "op": "callsub _assert_is_not_contract_defaulted" }, "1266": { - "callsub": "modules.rbac.RbacModule._assert_is_not_asset_suspended", - "op": "callsub _assert_is_not_asset_suspended" + "callsub": "modules.rbac.RbacModule._assert_is_not_contract_suspended", + "op": "callsub _assert_is_not_contract_suspended" }, "1269": { "op": "intc_0 // 0", @@ -14411,12 +14411,12 @@ "payment_info#0", "box_prefixed_key%0#4" ], - "callsub": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", - "op": "callsub _assert_is_not_asset_defaulted" + "callsub": "modules.rbac.RbacModule._assert_is_not_contract_defaulted", + "op": "callsub _assert_is_not_contract_defaulted" }, "2049": { - "callsub": "modules.rbac.RbacModule._assert_is_not_asset_suspended", - "op": "callsub _assert_is_not_asset_suspended" + "callsub": "modules.rbac.RbacModule._assert_is_not_contract_suspended", + "op": "callsub _assert_is_not_contract_suspended" }, "2052": { "op": "intc_0 // 0", @@ -17931,12 +17931,12 @@ ] }, "2379": { - "callsub": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", - "op": "callsub _assert_is_not_asset_defaulted" + "callsub": "modules.rbac.RbacModule._assert_is_not_contract_defaulted", + "op": "callsub _assert_is_not_contract_defaulted" }, "2382": { - "callsub": "modules.rbac.RbacModule._assert_is_not_asset_suspended", - "op": "callsub _assert_is_not_asset_suspended" + "callsub": "modules.rbac.RbacModule._assert_is_not_contract_suspended", + "op": "callsub _assert_is_not_contract_suspended" }, "2385": { "op": "intc_0 // 0", @@ -19181,12 +19181,12 @@ ] }, "2517": { - "callsub": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", - "op": "callsub _assert_is_not_asset_defaulted" + "callsub": "modules.rbac.RbacModule._assert_is_not_contract_defaulted", + "op": "callsub _assert_is_not_contract_defaulted" }, "2520": { - "callsub": "modules.rbac.RbacModule._assert_is_not_asset_suspended", - "op": "callsub _assert_is_not_asset_suspended" + "callsub": "modules.rbac.RbacModule._assert_is_not_contract_suspended", + "op": "callsub _assert_is_not_contract_suspended" }, "2523": { "op": "intc_0 // 0", @@ -22277,12 +22277,12 @@ ] }, "2816": { - "callsub": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", - "op": "callsub _assert_is_not_asset_defaulted" + "callsub": "modules.rbac.RbacModule._assert_is_not_contract_defaulted", + "op": "callsub _assert_is_not_contract_defaulted" }, "2819": { - "callsub": "modules.rbac.RbacModule._assert_is_not_asset_suspended", - "op": "callsub _assert_is_not_asset_suspended" + "callsub": "modules.rbac.RbacModule._assert_is_not_contract_suspended", + "op": "callsub _assert_is_not_contract_suspended" }, "2822": { "op": "bytec 8 // 0x4123", @@ -22917,12 +22917,12 @@ ] }, "2902": { - "callsub": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", - "op": "callsub _assert_is_not_asset_defaulted" + "callsub": "modules.rbac.RbacModule._assert_is_not_contract_defaulted", + "op": "callsub _assert_is_not_contract_defaulted" }, "2905": { - "callsub": "modules.rbac.RbacModule._assert_is_not_asset_suspended", - "op": "callsub _assert_is_not_asset_suspended" + "callsub": "modules.rbac.RbacModule._assert_is_not_contract_suspended", + "op": "callsub _assert_is_not_contract_suspended" }, "2908": { "op": "intc_0 // 0", @@ -33666,12 +33666,12 @@ "op": "callsub _assert_caller_is_arranger" }, "3754": { - "callsub": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", - "op": "callsub _assert_is_not_asset_defaulted" + "callsub": "modules.rbac.RbacModule._assert_is_not_contract_defaulted", + "op": "callsub _assert_is_not_contract_defaulted" }, "3757": { - "callsub": "modules.rbac.RbacModule._assert_is_not_asset_suspended", - "op": "callsub _assert_is_not_asset_suspended" + "callsub": "modules.rbac.RbacModule._assert_is_not_contract_suspended", + "op": "callsub _assert_is_not_contract_suspended" }, "3760": { "op": "intc_0 // 0", @@ -34854,12 +34854,12 @@ ] }, "3897": { - "callsub": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", - "op": "callsub _assert_is_not_asset_defaulted" + "callsub": "modules.rbac.RbacModule._assert_is_not_contract_defaulted", + "op": "callsub _assert_is_not_contract_defaulted" }, "3900": { - "callsub": "modules.rbac.RbacModule._assert_is_not_asset_suspended", - "op": "callsub _assert_is_not_asset_suspended" + "callsub": "modules.rbac.RbacModule._assert_is_not_contract_suspended", + "op": "callsub _assert_is_not_contract_suspended" }, "3903": { "op": "pushint 65", @@ -39423,12 +39423,12 @@ "op": "callsub _assert_caller_is_arranger" }, "4251": { - "callsub": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", - "op": "callsub _assert_is_not_asset_defaulted" + "callsub": "modules.rbac.RbacModule._assert_is_not_contract_defaulted", + "op": "callsub _assert_is_not_contract_defaulted" }, "4254": { - "callsub": "modules.rbac.RbacModule._assert_is_not_asset_suspended", - "op": "callsub _assert_is_not_asset_suspended" + "callsub": "modules.rbac.RbacModule._assert_is_not_contract_suspended", + "op": "callsub _assert_is_not_contract_suspended" }, "4257": { "op": "intc_0 // 0", @@ -45256,8 +45256,8 @@ "op": "callsub _assert_caller_is_arranger" }, "4769": { - "callsub": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", - "op": "callsub _assert_is_not_asset_defaulted" + "callsub": "modules.rbac.RbacModule._assert_is_not_contract_defaulted", + "op": "callsub _assert_is_not_contract_defaulted" }, "4772": { "op": "btoi", @@ -46571,8 +46571,8 @@ "op": "callsub _assert_caller_is_arranger" }, "4939": { - "callsub": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", - "op": "callsub _assert_is_not_asset_defaulted" + "callsub": "modules.rbac.RbacModule._assert_is_not_contract_defaulted", + "op": "callsub _assert_is_not_contract_defaulted" }, "4942": { "op": "btoi", @@ -63634,9 +63634,9 @@ "op": "retsub" }, "6838": { - "subroutine": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", + "subroutine": "modules.rbac.RbacModule._assert_is_not_contract_defaulted", "params": {}, - "block": "_assert_is_not_asset_defaulted", + "block": "_assert_is_not_contract_defaulted", "stack_in": [], "op": "intc_0 // 0", "defined_out": [ @@ -63694,9 +63694,9 @@ "op": "retsub" }, "6846": { - "subroutine": "modules.rbac.RbacModule._assert_is_not_asset_suspended", + "subroutine": "modules.rbac.RbacModule._assert_is_not_contract_suspended", "params": {}, - "block": "_assert_is_not_asset_suspended", + "block": "_assert_is_not_contract_suspended", "stack_in": [], "op": "intc_0 // 0", "defined_out": [ diff --git a/smart_contracts/artifacts/d_asa/DASA.approval.teal b/smart_contracts/artifacts/d_asa/DASA.approval.teal index 524524d8..7f811ea6 100644 --- a/smart_contracts/artifacts/d_asa/DASA.approval.teal +++ b/smart_contracts/artifacts/d_asa/DASA.approval.teal @@ -372,11 +372,11 @@ fund_due_cashflows: // self._assert_caller_is_arranger() callsub _assert_caller_is_arranger // modules/payment_agent.py:69 - // self._assert_is_not_asset_defaulted() - callsub _assert_is_not_asset_defaulted + // self._assert_is_not_contract_defaulted() + callsub _assert_is_not_contract_defaulted // modules/payment_agent.py:70 - // self._assert_is_not_asset_suspended() - callsub _assert_is_not_asset_suspended + // self._assert_is_not_contract_suspended() + callsub _assert_is_not_contract_suspended // modules/actus_kernel.py:135 // return self.status == UInt64(enums.STATUS_PENDING_IED) intc_0 // 0 @@ -1210,11 +1210,11 @@ claim_due_cashflows_bool_merge@16: claim_due_cashflows_after_if_else@17: // modules/payment_agent.py:139 - // self._assert_is_not_asset_defaulted() - callsub _assert_is_not_asset_defaulted + // self._assert_is_not_contract_defaulted() + callsub _assert_is_not_contract_defaulted // modules/payment_agent.py:140 - // self._assert_is_not_asset_suspended() - callsub _assert_is_not_asset_suspended + // self._assert_is_not_contract_suspended() + callsub _assert_is_not_contract_suspended // modules/actus_kernel.py:135 // return self.status == UInt64(enums.STATUS_PENDING_IED) intc_0 // 0 @@ -1579,11 +1579,11 @@ primary_distribution: callsub _role_is_active assert // Not authorized // modules/transfer_agent.py:76 - // self._assert_is_not_asset_defaulted() - callsub _assert_is_not_asset_defaulted + // self._assert_is_not_contract_defaulted() + callsub _assert_is_not_contract_defaulted // modules/transfer_agent.py:77 - // self._assert_is_not_asset_suspended() - callsub _assert_is_not_asset_suspended + // self._assert_is_not_contract_suspended() + callsub _assert_is_not_contract_suspended // modules/actus_kernel.py:135 // return self.status == UInt64(enums.STATUS_PENDING_IED) intc_0 // 0 @@ -1729,11 +1729,11 @@ transfer: assert // check self.status exists assert // D-ASA not configured // modules/transfer_agent.py:130 - // self._assert_is_not_asset_defaulted() - callsub _assert_is_not_asset_defaulted + // self._assert_is_not_contract_defaulted() + callsub _assert_is_not_contract_defaulted // modules/transfer_agent.py:131 - // self._assert_is_not_asset_suspended() - callsub _assert_is_not_asset_suspended + // self._assert_is_not_contract_suspended() + callsub _assert_is_not_contract_suspended // modules/actus_kernel.py:135 // return self.status == UInt64(enums.STATUS_PENDING_IED) intc_0 // 0 @@ -2038,11 +2038,11 @@ account_open: ! assert // Not authorized // modules/accounting.py:211 - // self._assert_is_not_asset_defaulted() - callsub _assert_is_not_asset_defaulted + // self._assert_is_not_contract_defaulted() + callsub _assert_is_not_contract_defaulted // modules/accounting.py:212 - // self._assert_is_not_asset_suspended() - callsub _assert_is_not_asset_suspended + // self._assert_is_not_contract_suspended() + callsub _assert_is_not_contract_suspended // modules/accounting.py:213 // assert holding_address not in self.account, err.INVALID_HOLDING_ADDRESS bytec 8 // 0x4123 @@ -2135,11 +2135,11 @@ account_update_payment_address: == assert // Not authorized // modules/accounting.py:239 - // self._assert_is_not_asset_defaulted() - callsub _assert_is_not_asset_defaulted + // self._assert_is_not_contract_defaulted() + callsub _assert_is_not_contract_defaulted // modules/accounting.py:240 - // self._assert_is_not_asset_suspended() - callsub _assert_is_not_asset_suspended + // self._assert_is_not_contract_suspended() + callsub _assert_is_not_contract_suspended // modules/accounting.py:241 // self.account[holding_address].payment_address = payment_address intc_0 // 0 @@ -3173,11 +3173,11 @@ contract_execute_ied: // self._assert_caller_is_arranger() callsub _assert_caller_is_arranger // modules/actus_kernel.py:1144 - // self._assert_is_not_asset_defaulted() - callsub _assert_is_not_asset_defaulted + // self._assert_is_not_contract_defaulted() + callsub _assert_is_not_contract_defaulted // modules/actus_kernel.py:1145 - // self._assert_is_not_asset_suspended() - callsub _assert_is_not_asset_suspended + // self._assert_is_not_contract_suspended() + callsub _assert_is_not_contract_suspended // modules/actus_kernel.py:1147 // assert self.event_cursor < self.schedule_entry_count, err.INVALID_EVENT_CURSOR intc_0 // 0 @@ -3343,11 +3343,11 @@ apply_non_cash_event: assert // check self.status exists assert // D-ASA not configured // modules/actus_kernel.py:1204 - // self._assert_is_not_asset_defaulted() - callsub _assert_is_not_asset_defaulted + // self._assert_is_not_contract_defaulted() + callsub _assert_is_not_contract_defaulted // modules/actus_kernel.py:1205 - // self._assert_is_not_asset_suspended() - callsub _assert_is_not_asset_suspended + // self._assert_is_not_contract_suspended() + callsub _assert_is_not_contract_suspended // modules/actus_kernel.py:1207 // if payload.flags & UInt64(enums.FLAG_OBSERVED_EVENT): pushint 65 @@ -3765,11 +3765,11 @@ append_observed_cash_event: // self._assert_caller_is_arranger() callsub _assert_caller_is_arranger // modules/actus_kernel.py:1255 - // self._assert_is_not_asset_defaulted() - callsub _assert_is_not_asset_defaulted + // self._assert_is_not_contract_defaulted() + callsub _assert_is_not_contract_defaulted // modules/actus_kernel.py:1256 - // self._assert_is_not_asset_suspended() - callsub _assert_is_not_asset_suspended + // self._assert_is_not_contract_suspended() + callsub _assert_is_not_contract_suspended // modules/actus_kernel.py:135 // return self.status == UInt64(enums.STATUS_PENDING_IED) intc_0 // 0 @@ -4404,8 +4404,8 @@ rbac_assign_role: // self._assert_caller_is_arranger() callsub _assert_caller_is_arranger // modules/rbac.py:225 - // self._assert_is_not_asset_defaulted() - callsub _assert_is_not_asset_defaulted + // self._assert_is_not_contract_defaulted() + callsub _assert_is_not_contract_defaulted // modules/rbac.py:226 // self._assert_valid_role(role_id.as_uint64()) btoi @@ -4581,8 +4581,8 @@ rbac_revoke_role: // self._assert_caller_is_arranger() callsub _assert_caller_is_arranger // modules/rbac.py:250 - // self._assert_is_not_asset_defaulted() - callsub _assert_is_not_asset_defaulted + // self._assert_is_not_contract_defaulted() + callsub _assert_is_not_contract_defaulted // modules/rbac.py:251 // self._assert_valid_role(role_id.as_uint64()) btoi @@ -6966,8 +6966,8 @@ _assert_caller_is_arranger: retsub -// modules.rbac.RbacModule._assert_is_not_asset_defaulted() -> void: -_assert_is_not_asset_defaulted: +// modules.rbac.RbacModule._assert_is_not_contract_defaulted() -> void: +_assert_is_not_contract_defaulted: // modules/rbac.py:85 // assert not self.defaulted, err.DEFAULTED intc_0 // 0 @@ -6979,8 +6979,8 @@ _assert_is_not_asset_defaulted: retsub -// modules.rbac.RbacModule._assert_is_not_asset_suspended() -> void: -_assert_is_not_asset_suspended: +// modules.rbac.RbacModule._assert_is_not_contract_suspended() -> void: +_assert_is_not_contract_suspended: // modules/rbac.py:88 // assert not self.contract_suspended, err.SUSPENDED intc_0 // 0 diff --git a/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.approval.puya.map b/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.approval.puya.map index 202deb90..de6bf348 100644 --- a/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.approval.puya.map +++ b/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.approval.puya.map @@ -970,8 +970,8 @@ "op": "callsub _assert_caller_is_arranger" }, "320": { - "callsub": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", - "op": "callsub _assert_is_not_asset_defaulted" + "callsub": "modules.rbac.RbacModule._assert_is_not_contract_defaulted", + "op": "callsub _assert_is_not_contract_defaulted" }, "323": { "op": "btoi", @@ -2285,8 +2285,8 @@ "op": "callsub _assert_caller_is_arranger" }, "486": { - "callsub": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", - "op": "callsub _assert_is_not_asset_defaulted" + "callsub": "modules.rbac.RbacModule._assert_is_not_contract_defaulted", + "op": "callsub _assert_is_not_contract_defaulted" }, "489": { "op": "btoi", @@ -5521,9 +5521,9 @@ "op": "retsub" }, "962": { - "subroutine": "modules.rbac.RbacModule._assert_is_not_asset_defaulted", + "subroutine": "modules.rbac.RbacModule._assert_is_not_contract_defaulted", "params": {}, - "block": "_assert_is_not_asset_defaulted", + "block": "_assert_is_not_contract_defaulted", "stack_in": [], "op": "intc_1 // 0", "defined_out": [ diff --git a/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.approval.teal b/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.approval.teal index b32fd19a..42cbdf4f 100644 --- a/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.approval.teal +++ b/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.approval.teal @@ -190,8 +190,8 @@ rbac_assign_role: // self._assert_caller_is_arranger() callsub _assert_caller_is_arranger // modules/rbac.py:225 - // self._assert_is_not_asset_defaulted() - callsub _assert_is_not_asset_defaulted + // self._assert_is_not_contract_defaulted() + callsub _assert_is_not_contract_defaulted // modules/rbac.py:226 // self._assert_valid_role(role_id.as_uint64()) btoi @@ -367,8 +367,8 @@ rbac_revoke_role: // self._assert_caller_is_arranger() callsub _assert_caller_is_arranger // modules/rbac.py:250 - // self._assert_is_not_asset_defaulted() - callsub _assert_is_not_asset_defaulted + // self._assert_is_not_contract_defaulted() + callsub _assert_is_not_contract_defaulted // modules/rbac.py:251 // self._assert_valid_role(role_id.as_uint64()) btoi @@ -962,8 +962,8 @@ _assert_caller_is_arranger: retsub -// modules.rbac.RbacModule._assert_is_not_asset_defaulted() -> void: -_assert_is_not_asset_defaulted: +// modules.rbac.RbacModule._assert_is_not_contract_defaulted() -> void: +_assert_is_not_contract_defaulted: // modules/rbac.py:85 // assert not self.defaulted, err.DEFAULTED intc_1 // 0 diff --git a/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.arc56.json b/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.arc56.json index 98e6c152..98108694 100644 --- a/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.arc56.json +++ b/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.arc56.json @@ -450,7 +450,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMzIgMjAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAweDUyM2E0MTUyNTIyMyAweDUyM2E1NDUyNTMyMyAweDUyM2E0MTU1NTQyMyAweDUyM2E0ZDRlNDcyMyAweDUyM2E1MDU5NDQyMyAweDUyM2E0ZDRmNDMyMyAiZGVmYXVsdGVkIiAweDUyM2E0ZjUwNDQyMyAiY29udHJhY3Rfc3VzcGVuZGVkIgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4LTI5CiAgICAvLyAjIFJCQUMgUm9sZXMKICAgIC8vIHNlbGYuYXJyYW5nZXIgPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX0FSUkFOR0VSKQogICAgYnl0ZWNfMSAvLyAweDUyM2E0MTUyNTIyMwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwCiAgICAvLyBzZWxmLm9wX2RhZW1vbiA9IEdsb2JhbFN0YXRlKEFjY291bnQoKSwga2V5PWNzdC5QUkVGSVhfSURfT1BfREFFTU9OKQogICAgYnl0ZWMgOCAvLyAweDUyM2E0ZjUwNDQyMwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjQ3LTQ4CiAgICAvLyAjIENvbnRyYWN0IEdvdmVybmFuY2UKICAgIC8vIHNlbGYuY29udHJhY3Rfc3VzcGVuZGVkID0gRmFsc2UKICAgIGJ5dGVjIDkgLy8gImNvbnRyYWN0X3N1c3BlbmRlZCIKICAgIGludGNfMSAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjUwLTUxCiAgICAvLyAjIENvbnRyYWN0IFBlcmZvcm1hbmNlCiAgICAvLyBzZWxmLmRlZmF1bHRlZCA9IEZhbHNlCiAgICBieXRlYyA3IC8vICJkZWZhdWx0ZWQiCiAgICBpbnRjXzEgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL21vY2tfbW9kdWxlX3JiYWMvY29udHJhY3QucHk6NgogICAgLy8gY2xhc3MgTW9ja1JiYWNNb2R1bGUoUmJhY01vZHVsZSk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9jcmVhdGVAMjAKICAgIHB1c2hieXRlcyAweDkxNGYwNGViIC8vIG1ldGhvZCAiY29udHJhY3RfdXBkYXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9jb250cmFjdF91cGRhdGVfcm91dGVANQoKbWFpbl9zd2l0Y2hfY2FzZV9uZXh0QDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbW9ja19tb2R1bGVfcmJhYy9jb250cmFjdC5weTo2CiAgICAvLyBjbGFzcyBNb2NrUmJhY01vZHVsZShSYmFjTW9kdWxlKToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweDgyZjcxYjJkIDB4ZWYwNGY1ZDMgMHhkZjM0MzU1MCAweDNkYmU4MGJkIDB4MWUzZTQ4ZTcgMHgzOTI0MWZhMyAweDAxMGM4Mjk5IDB4NzQwNmFjZDIgMHgxYTcyYTJlZSAvLyBtZXRob2QgInJiYWNfcm90YXRlX2FycmFuZ2VyKGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX3NldF9vcF9kYWVtb24oYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgInJiYWNfYXNzaWduX3JvbGUodWludDgsYWRkcmVzcywodWludDY0LHVpbnQ2NCkpdWludDY0IiwgbWV0aG9kICJyYmFjX3Jldm9rZV9yb2xlKHVpbnQ4LGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX2NvbnRyYWN0X3N1c3BlbnNpb24oYm9vbCl1aW50NjQiLCBtZXRob2QgInJiYWNfY29udHJhY3RfZGVmYXVsdChib29sKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19nZXRfYXJyYW5nZXIoKWFkZHJlc3MiLCBtZXRob2QgInJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXMoYWRkcmVzcykoYm9vbCxib29sLGJvb2wsYm9vbCxib29sKSIsIG1ldGhvZCAicmJhY19nZXRfcm9sZV92YWxpZGl0eSh1aW50OCxhZGRyZXNzKSh1aW50NjQsdWludDY0KSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIHJiYWNfcm90YXRlX2FycmFuZ2VyIHJiYWNfc2V0X29wX2RhZW1vbiByYmFjX2Fzc2lnbl9yb2xlIHJiYWNfcmV2b2tlX3JvbGUgcmJhY19jb250cmFjdF9zdXNwZW5zaW9uIHJiYWNfY29udHJhY3RfZGVmYXVsdCByYmFjX2dldF9hcnJhbmdlciByYmFjX2dldF9hZGRyZXNzX3JvbGVzIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHkKICAgIGVycgoKbWFpbl9jb250cmFjdF91cGRhdGVfcm91dGVANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgNCAvLyBVcGRhdGVBcHBsaWNhdGlvbgogICAgPT0KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0CiAgICBiIGNvbnRyYWN0X3VwZGF0ZQoKbWFpbl9jcmVhdGVAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbW9ja19tb2R1bGVfcmJhYy9jb250cmFjdC5weToxNAogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICBhc3NlcnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tb2NrX21vZHVsZV9yYmFjL2NvbnRyYWN0LnB5OjE2CiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gVHhuLnNlbmRlcgogICAgYnl0ZWNfMSAvLyAweDUyM2E0MTUyNTIyMwogICAgdHhuIFNlbmRlcgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tb2NrX21vZHVsZV9yYmFjL2NvbnRyYWN0LnB5OjE0CiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuY29udHJhY3RfdXBkYXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfdXBkYXRlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2MS0xNjQKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBncmFudHMgdGhlIHVwZGF0ZSBwZXJtaXNzaW9ucyB0byB0aGUgQXJyYW5nZXIuCiAgICAvLyAjIOKaoO+4jyBXQVJOSU5HOiBBcHBsaWNhdGlvbiB1cGRhdGVzIG11c3QgYmUgZXhlY3V0ZWQgVkVSWSBjYXJlZnVsbHksIGFzIHRoZXkKICAgIC8vICMgbWlnaHQgaW50cm9kdWNlIGJyZWFraW5nIGNoYW5nZXMuCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3JvdGF0ZV9hcnJhbmdlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfcm90YXRlX2FycmFuZ2VyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODAKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4MQogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IG5ld19hcnJhbmdlcgogICAgYnl0ZWNfMSAvLyAweDUyM2E0MTUyNTIyMwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODIKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19zZXRfb3BfZGFlbW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19zZXRfb3BfZGFlbW9uOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToxOTgKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE5OQogICAgLy8gc2VsZi5vcF9kYWVtb24udmFsdWUgPSBhZGRyZXNzCiAgICBieXRlYyA4IC8vIDB4NTIzYTRmNTA0NDIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwMAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTg0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2Fzc2lnbl9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19hc3NpZ25fcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDE2CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLlJvbGVWYWxpZGl0eQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI1CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNgogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDQKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgaW50Y18zIC8vIDIwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDUKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSByb2xlX2FkZHJlc3MKICAgIGJ5dGVjXzEgLy8gMHg1MjNhNDE1MjUyMjMKICAgIGRpZyAzCiAgICBhcHBfZ2xvYmFsX3B1dAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjgKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDgKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIGR1cAogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnRfbWFuYWdlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyA0IC8vIDB4NTIzYTRkNGU0NzIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTAKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI3CiAgICAvLyBzZWxmLl9zZXRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIHZhbGlkaXR5KQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTMKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgNSAvLyAweDUyM2E1MDU5NDQyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE0CiAgICAvLyBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI3CiAgICAvLyBzZWxmLl9zZXRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIHZhbGlkaXR5KQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTYKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNjAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjXzIgLy8gMHg1MjNhNTQ1MjUzMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExOAogICAgLy8gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI3CiAgICAvLyBzZWxmLl9zZXRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIHZhbGlkaXR5KQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjAKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKToKICAgIGR1cAogICAgcHVzaGludCA3MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAxMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5hdXRob3JpdHksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWNfMyAvLyAweDUyM2E0MTU1NTQyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIyCiAgICAvLyBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNwogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyNAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgODAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI1CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDYgLy8gMHg1MjNhNGQ0ZjQzMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyNgogICAgLy8gc2VsZi5vYnNlcnZlcltyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19yZXZva2Vfcm9sZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfcmV2b2tlX3JvbGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjQ5CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTAKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjUxCiAgICAvLyBzZWxmLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpKQogICAgYnRvaQogICAgZHVwbiAyCiAgICBjYWxsc3ViIF9hc3NlcnRfdmFsaWRfcm9sZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyOQogICAgLy8gYXNzZXJ0IHJvbGVfaWQgIT0gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBkdXAKICAgIGludGNfMyAvLyAyMAogICAgIT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMxCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDQgLy8gMHg1MjNhNGQ0ZTQ3MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMgogICAgLy8gZGVsIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTMKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzQKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzUKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyA1IC8vIDB4NTIzYTUwNTk0NDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzYKICAgIC8vIGRlbCBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1MgogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzgKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNjAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzOQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWNfMiAvLyAweDUyM2E1NDUyNTMyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQwCiAgICAvLyBkZWwgc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1MgogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKToKICAgIGR1cAogICAgcHVzaGludCA3MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQzCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjXzMgLy8gMHg1MjNhNDE1NTU0MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NAogICAgLy8gZGVsIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1MgogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDYKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDgwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDYgLy8gMHg1MjNhNGQ0ZjQzMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0OAogICAgLy8gZGVsIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2NvbnRyYWN0X3N1c3BlbnNpb25bcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2NvbnRyYWN0X3N1c3BlbnNpb246CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzEgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzkKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjXzMgLy8gMHg1MjNhNDE1NTU0MjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNzEKICAgIC8vIHNlbGYuY29udHJhY3Rfc3VzcGVuZGVkID0gc3VzcGVuZGVkCiAgICBieXRlYyA5IC8vICJjb250cmFjdF9zdXNwZW5kZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3MgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2NvbnRyYWN0X2RlZmF1bHRbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2NvbnRyYWN0X2RlZmF1bHQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjc0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzEgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzYKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnRydXN0ZWUsIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlY18yIC8vIDB4NTIzYTU0NTI1MzIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg3CiAgICAvLyBzZWxmLmRlZmF1bHRlZCA9IGRlZmF1bHRlZAogICAgYnl0ZWMgNyAvLyAiZGVmYXVsdGVkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODgKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYXJyYW5nZXJbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDEKICAgIC8vIHJldHVybiBzZWxmLmFycmFuZ2VyLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMSAvLyAweDUyM2E0MTUyNTIyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYWRkcmVzc19yb2xlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzAzCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMQogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hY2NvdW50X21hbmFnZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgNCAvLyAweDUyM2E0ZDRlNDcyMwogICAgZGlnIDEKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzIyCiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnByaW1hcnlfZGVhbGVyLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDUgLy8gMHg1MjNhNTA1OTQ0MjMKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMwogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi50cnVzdGVlLCBhZGRyZXNzKSwKICAgIGJ5dGVjXzIgLy8gMHg1MjNhNTQ1MjUzMjMKICAgIGRpZyAzCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyNAogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIGFkZHJlc3MpLAogICAgYnl0ZWNfMyAvLyAweDUyM2E0MTU1NTQyMwogICAgZGlnIDQKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI1CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLm9ic2VydmVyLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDYgLy8gMHg1MjNhNGQ0ZjQzMjMKICAgIHVuY292ZXIgNQogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDYKICAgIHNldGJpdAogICAgaW50Y18wIC8vIDEKICAgIHVuY292ZXIgNQogICAgc2V0Yml0CiAgICBwdXNoaW50IDIKICAgIHVuY292ZXIgNAogICAgc2V0Yml0CiAgICBwdXNoaW50IDMKICAgIHVuY292ZXIgMwogICAgc2V0Yml0CiAgICBwdXNoaW50IDQKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzQ2CiAgICAvLyByb2xlID0gcm9sZV9pZC5hc191aW50NjQoKQogICAgYnRvaQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM0NwogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZSkKICAgIGR1cAogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNDkKICAgIC8vIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgaW50Y18zIC8vIDIwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzUzCiAgICAvLyBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICBwdXNoaW50cyA0MCA1MCA2MCA3MCA4MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM0OC0zNzkKICAgIC8vIG1hdGNoIHJvbGU6CiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUik6CiAgICAvLyAgICAgICAgIHJldHVybiB0eXAuUm9sZVZhbGlkaXR5KAogICAgLy8gICAgICAgICAgICAgcm9sZV92YWxpZGl0eV9zdGFydD1VSW50NjQoMCksIHJvbGVfdmFsaWRpdHlfZW5kPVVJbnQ2NCgwKQogICAgLy8gICAgICAgICApCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLmFjY291bnRfbWFuYWdlciwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLnByaW1hcnlfZGVhbGVyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLmF1dGhvcml0eSwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLm9ic2VydmVyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIF86CiAgICAvLyAgICAgICAgIG9wLmVycihlcnIuSU5WQUxJRF9ST0xFKQogICAgdW5jb3ZlciA2CiAgICBtYXRjaCByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzBAMiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzFAMyByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzJANCByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzNANSByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzRANiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzVANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM3OQogICAgLy8gb3AuZXJyKGVyci5JTlZBTElEX1JPTEUpCiAgICBlcnIgLy8gSW52YWxpZCByb2xlIGlkZW50aWZpZXIKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM3NQogICAgLy8gc2VsZi5vYnNlcnZlciwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyA2IC8vIDB4NTIzYTRkNGY0MzIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTcKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mzc0LTM3NgogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM3NwogICAgLy8gcmV0dXJuIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzRANjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNzAKICAgIC8vIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjXzMgLy8gMHg1MjNhNDE1NTU0MjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NwogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNjktMzcxCiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5hdXRob3JpdHksIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM3MgogICAgLy8gcmV0dXJuIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfM0A1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM2NQogICAgLy8gc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjXzIgLy8gMHg1MjNhNTQ1MjUzMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NwogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNjQtMzY2CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNjcKICAgIC8vIHJldHVybiBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8yQDQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzYwCiAgICAvLyBzZWxmLnByaW1hcnlfZGVhbGVyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDUgLy8gMHg1MjNhNTA1OTQ0MjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NwogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTktMzYxCiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzYyCiAgICAvLyByZXR1cm4gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzFAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTUKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDQgLy8gMHg1MjNhNGQ0ZTQ3MjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NwogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTQtMzU2CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM1NwogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMEAyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM1MC0zNTIKICAgIC8vIHJldHVybiB0eXAuUm9sZVZhbGlkaXR5KAogICAgLy8gICAgIHJvbGVfdmFsaWRpdHlfc3RhcnQ9VUludDY0KDApLCByb2xlX3ZhbGlkaXR5X2VuZD1VSW50NjQoMCkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9yb2xlX2lzX2FjdGl2ZShyb2xlX21hcDogYnl0ZXMsIHJvbGVfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NDoKX3JvbGVfaXNfYWN0aXZlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5CiAgICAvLyBkZWYgX3JvbGVfaXNfYWN0aXZlKHNlbGYsIHJvbGVfbWFwOiB0eXAuUmJhY1JvbGUsIHJvbGVfYWRkcmVzczogQWNjb3VudCkgLT4gYm9vbDoKICAgIHByb3RvIDIgMQogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTcKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAtNjQKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYxCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjIKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYxLTYyCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYxLTYzCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjMKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgcHVzaGludCA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYyLTYzCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDAKICAgID49CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjEtNjMKICAgIC8vIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IF9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQKICAgIGludGNfMCAvLyAxCgpfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYwLTY0CiAgICAvLyByZXR1cm4gc2VsZi5faGFzX3JvbGUocm9sZV9tYXAsIHJvbGVfYWRkcmVzcykgYW5kICgKICAgIC8vICAgICByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICkKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0OgogICAgaW50Y18xIC8vIDAKICAgIGIgX3JvbGVfaXNfYWN0aXZlX2Jvb2xfbWVyZ2VANQoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkgLT4gdm9pZDoKX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjcKICAgIC8vIGFzc2VydCBzZWxmLl9pc19hcnJhbmdlcihUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU0CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzID09IHNlbGYuYXJyYW5nZXIudmFsdWUKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18xIC8vIDB4NTIzYTQxNTI1MjIzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJyYW5nZXIgZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjY3CiAgICAvLyBhc3NlcnQgc2VsZi5faXNfYXJyYW5nZXIoVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkgLT4gdm9pZDoKX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg1CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuZGVmYXVsdGVkLCBlcnIuREVGQVVMVEVECiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgNyAvLyAiZGVmYXVsdGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRlZmF1bHRlZCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBEZWZhdWx0ZWQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkOiB1aW50NjQpIC0+IHZvaWQ6Cl9hc3NlcnRfdmFsaWRfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MAogICAgLy8gZGVmIF9hc3NlcnRfdmFsaWRfcm9sZShzZWxmLCByb2xlX2lkOiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MS05OQogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTIKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIGludGNfMyAvLyAyMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkxLTk5CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTMKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICBwdXNoaW50IDI1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEtOTkKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NAogICAgLy8gVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIHB1c2hpbnQgNDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MS05OQogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojk1CiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICBwdXNoaW50IDUwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEtOTkKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NgogICAgLy8gVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICBwdXNoaW50IDYwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEtOTkKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NwogICAgLy8gVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIHB1c2hpbnQgNzAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MS05OQogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojk4CiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICBwdXNoaW50IDgwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEtOTkKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBieiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9mYWxzZUA4CgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDc6CiAgICBpbnRjXzAgLy8gMQoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfbWVyZ2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MS05OQogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICByZXRzdWIKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX2ZhbHNlQDg6CiAgICBpbnRjXzEgLy8gMAogICAgYiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9tZXJnZUA5Cg==", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMzIgMjAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAweDUyM2E0MTUyNTIyMyAweDUyM2E1NDUyNTMyMyAweDUyM2E0MTU1NTQyMyAweDUyM2E0ZDRlNDcyMyAweDUyM2E1MDU5NDQyMyAweDUyM2E0ZDRmNDMyMyAiZGVmYXVsdGVkIiAweDUyM2E0ZjUwNDQyMyAiY29udHJhY3Rfc3VzcGVuZGVkIgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4LTI5CiAgICAvLyAjIFJCQUMgUm9sZXMKICAgIC8vIHNlbGYuYXJyYW5nZXIgPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX0FSUkFOR0VSKQogICAgYnl0ZWNfMSAvLyAweDUyM2E0MTUyNTIyMwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwCiAgICAvLyBzZWxmLm9wX2RhZW1vbiA9IEdsb2JhbFN0YXRlKEFjY291bnQoKSwga2V5PWNzdC5QUkVGSVhfSURfT1BfREFFTU9OKQogICAgYnl0ZWMgOCAvLyAweDUyM2E0ZjUwNDQyMwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjQ3LTQ4CiAgICAvLyAjIENvbnRyYWN0IEdvdmVybmFuY2UKICAgIC8vIHNlbGYuY29udHJhY3Rfc3VzcGVuZGVkID0gRmFsc2UKICAgIGJ5dGVjIDkgLy8gImNvbnRyYWN0X3N1c3BlbmRlZCIKICAgIGludGNfMSAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjUwLTUxCiAgICAvLyAjIENvbnRyYWN0IFBlcmZvcm1hbmNlCiAgICAvLyBzZWxmLmRlZmF1bHRlZCA9IEZhbHNlCiAgICBieXRlYyA3IC8vICJkZWZhdWx0ZWQiCiAgICBpbnRjXzEgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL21vY2tfbW9kdWxlX3JiYWMvY29udHJhY3QucHk6NgogICAgLy8gY2xhc3MgTW9ja1JiYWNNb2R1bGUoUmJhY01vZHVsZSk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9jcmVhdGVAMjAKICAgIHB1c2hieXRlcyAweDkxNGYwNGViIC8vIG1ldGhvZCAiY29udHJhY3RfdXBkYXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9jb250cmFjdF91cGRhdGVfcm91dGVANQoKbWFpbl9zd2l0Y2hfY2FzZV9uZXh0QDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbW9ja19tb2R1bGVfcmJhYy9jb250cmFjdC5weTo2CiAgICAvLyBjbGFzcyBNb2NrUmJhY01vZHVsZShSYmFjTW9kdWxlKToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweDgyZjcxYjJkIDB4ZWYwNGY1ZDMgMHhkZjM0MzU1MCAweDNkYmU4MGJkIDB4MWUzZTQ4ZTcgMHgzOTI0MWZhMyAweDAxMGM4Mjk5IDB4NzQwNmFjZDIgMHgxYTcyYTJlZSAvLyBtZXRob2QgInJiYWNfcm90YXRlX2FycmFuZ2VyKGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX3NldF9vcF9kYWVtb24oYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgInJiYWNfYXNzaWduX3JvbGUodWludDgsYWRkcmVzcywodWludDY0LHVpbnQ2NCkpdWludDY0IiwgbWV0aG9kICJyYmFjX3Jldm9rZV9yb2xlKHVpbnQ4LGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX2NvbnRyYWN0X3N1c3BlbnNpb24oYm9vbCl1aW50NjQiLCBtZXRob2QgInJiYWNfY29udHJhY3RfZGVmYXVsdChib29sKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19nZXRfYXJyYW5nZXIoKWFkZHJlc3MiLCBtZXRob2QgInJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXMoYWRkcmVzcykoYm9vbCxib29sLGJvb2wsYm9vbCxib29sKSIsIG1ldGhvZCAicmJhY19nZXRfcm9sZV92YWxpZGl0eSh1aW50OCxhZGRyZXNzKSh1aW50NjQsdWludDY0KSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIHJiYWNfcm90YXRlX2FycmFuZ2VyIHJiYWNfc2V0X29wX2RhZW1vbiByYmFjX2Fzc2lnbl9yb2xlIHJiYWNfcmV2b2tlX3JvbGUgcmJhY19jb250cmFjdF9zdXNwZW5zaW9uIHJiYWNfY29udHJhY3RfZGVmYXVsdCByYmFjX2dldF9hcnJhbmdlciByYmFjX2dldF9hZGRyZXNzX3JvbGVzIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHkKICAgIGVycgoKbWFpbl9jb250cmFjdF91cGRhdGVfcm91dGVANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgNCAvLyBVcGRhdGVBcHBsaWNhdGlvbgogICAgPT0KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0CiAgICBiIGNvbnRyYWN0X3VwZGF0ZQoKbWFpbl9jcmVhdGVAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbW9ja19tb2R1bGVfcmJhYy9jb250cmFjdC5weToxNAogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICBhc3NlcnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tb2NrX21vZHVsZV9yYmFjL2NvbnRyYWN0LnB5OjE2CiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gVHhuLnNlbmRlcgogICAgYnl0ZWNfMSAvLyAweDUyM2E0MTUyNTIyMwogICAgdHhuIFNlbmRlcgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tb2NrX21vZHVsZV9yYmFjL2NvbnRyYWN0LnB5OjE0CiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuY29udHJhY3RfdXBkYXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfdXBkYXRlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2MS0xNjQKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBncmFudHMgdGhlIHVwZGF0ZSBwZXJtaXNzaW9ucyB0byB0aGUgQXJyYW5nZXIuCiAgICAvLyAjIOKaoO+4jyBXQVJOSU5HOiBBcHBsaWNhdGlvbiB1cGRhdGVzIG11c3QgYmUgZXhlY3V0ZWQgVkVSWSBjYXJlZnVsbHksIGFzIHRoZXkKICAgIC8vICMgbWlnaHQgaW50cm9kdWNlIGJyZWFraW5nIGNoYW5nZXMuCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3JvdGF0ZV9hcnJhbmdlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfcm90YXRlX2FycmFuZ2VyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODAKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4MQogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IG5ld19hcnJhbmdlcgogICAgYnl0ZWNfMSAvLyAweDUyM2E0MTUyNTIyMwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODIKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19zZXRfb3BfZGFlbW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19zZXRfb3BfZGFlbW9uOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToxOTgKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE5OQogICAgLy8gc2VsZi5vcF9kYWVtb24udmFsdWUgPSBhZGRyZXNzCiAgICBieXRlYyA4IC8vIDB4NTIzYTRmNTA0NDIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwMAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTg0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2Fzc2lnbl9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19hc3NpZ25fcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDE2CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLlJvbGVWYWxpZGl0eQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI1CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2NvbnRyYWN0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2NvbnRyYWN0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNgogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDQKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgaW50Y18zIC8vIDIwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDUKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSByb2xlX2FkZHJlc3MKICAgIGJ5dGVjXzEgLy8gMHg1MjNhNDE1MjUyMjMKICAgIGRpZyAzCiAgICBhcHBfZ2xvYmFsX3B1dAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjgKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDgKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIGR1cAogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnRfbWFuYWdlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyA0IC8vIDB4NTIzYTRkNGU0NzIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTAKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI3CiAgICAvLyBzZWxmLl9zZXRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIHZhbGlkaXR5KQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTMKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgNSAvLyAweDUyM2E1MDU5NDQyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE0CiAgICAvLyBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI3CiAgICAvLyBzZWxmLl9zZXRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIHZhbGlkaXR5KQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTYKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNjAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjXzIgLy8gMHg1MjNhNTQ1MjUzMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExOAogICAgLy8gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI3CiAgICAvLyBzZWxmLl9zZXRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIHZhbGlkaXR5KQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjAKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKToKICAgIGR1cAogICAgcHVzaGludCA3MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAxMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5hdXRob3JpdHksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWNfMyAvLyAweDUyM2E0MTU1NTQyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIyCiAgICAvLyBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNwogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyNAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgODAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI1CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDYgLy8gMHg1MjNhNGQ0ZjQzMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyNgogICAgLy8gc2VsZi5vYnNlcnZlcltyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19yZXZva2Vfcm9sZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfcmV2b2tlX3JvbGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjQ5CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTAKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfY29udHJhY3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfY29udHJhY3RfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjUxCiAgICAvLyBzZWxmLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpKQogICAgYnRvaQogICAgZHVwbiAyCiAgICBjYWxsc3ViIF9hc3NlcnRfdmFsaWRfcm9sZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyOQogICAgLy8gYXNzZXJ0IHJvbGVfaWQgIT0gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBkdXAKICAgIGludGNfMyAvLyAyMAogICAgIT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMxCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDQgLy8gMHg1MjNhNGQ0ZTQ3MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMgogICAgLy8gZGVsIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTMKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzQKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzUKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyA1IC8vIDB4NTIzYTUwNTk0NDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzYKICAgIC8vIGRlbCBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1MgogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzgKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNjAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzOQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWNfMiAvLyAweDUyM2E1NDUyNTMyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQwCiAgICAvLyBkZWwgc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1MgogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKToKICAgIGR1cAogICAgcHVzaGludCA3MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQzCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjXzMgLy8gMHg1MjNhNDE1NTU0MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NAogICAgLy8gZGVsIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1MgogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDYKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDgwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDYgLy8gMHg1MjNhNGQ0ZjQzMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0OAogICAgLy8gZGVsIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2NvbnRyYWN0X3N1c3BlbnNpb25bcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2NvbnRyYWN0X3N1c3BlbnNpb246CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzEgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzkKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjXzMgLy8gMHg1MjNhNDE1NTU0MjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNzEKICAgIC8vIHNlbGYuY29udHJhY3Rfc3VzcGVuZGVkID0gc3VzcGVuZGVkCiAgICBieXRlYyA5IC8vICJjb250cmFjdF9zdXNwZW5kZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3MgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2NvbnRyYWN0X2RlZmF1bHRbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2NvbnRyYWN0X2RlZmF1bHQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjc0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzEgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzYKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnRydXN0ZWUsIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlY18yIC8vIDB4NTIzYTU0NTI1MzIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg3CiAgICAvLyBzZWxmLmRlZmF1bHRlZCA9IGRlZmF1bHRlZAogICAgYnl0ZWMgNyAvLyAiZGVmYXVsdGVkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODgKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYXJyYW5nZXJbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDEKICAgIC8vIHJldHVybiBzZWxmLmFycmFuZ2VyLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMSAvLyAweDUyM2E0MTUyNTIyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYWRkcmVzc19yb2xlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzAzCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMQogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hY2NvdW50X21hbmFnZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgNCAvLyAweDUyM2E0ZDRlNDcyMwogICAgZGlnIDEKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzIyCiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnByaW1hcnlfZGVhbGVyLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDUgLy8gMHg1MjNhNTA1OTQ0MjMKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMwogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi50cnVzdGVlLCBhZGRyZXNzKSwKICAgIGJ5dGVjXzIgLy8gMHg1MjNhNTQ1MjUzMjMKICAgIGRpZyAzCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyNAogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIGFkZHJlc3MpLAogICAgYnl0ZWNfMyAvLyAweDUyM2E0MTU1NTQyMwogICAgZGlnIDQKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI1CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLm9ic2VydmVyLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDYgLy8gMHg1MjNhNGQ0ZjQzMjMKICAgIHVuY292ZXIgNQogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDYKICAgIHNldGJpdAogICAgaW50Y18wIC8vIDEKICAgIHVuY292ZXIgNQogICAgc2V0Yml0CiAgICBwdXNoaW50IDIKICAgIHVuY292ZXIgNAogICAgc2V0Yml0CiAgICBwdXNoaW50IDMKICAgIHVuY292ZXIgMwogICAgc2V0Yml0CiAgICBwdXNoaW50IDQKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzQ2CiAgICAvLyByb2xlID0gcm9sZV9pZC5hc191aW50NjQoKQogICAgYnRvaQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM0NwogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZSkKICAgIGR1cAogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNDkKICAgIC8vIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgaW50Y18zIC8vIDIwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzUzCiAgICAvLyBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICBwdXNoaW50cyA0MCA1MCA2MCA3MCA4MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM0OC0zNzkKICAgIC8vIG1hdGNoIHJvbGU6CiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUik6CiAgICAvLyAgICAgICAgIHJldHVybiB0eXAuUm9sZVZhbGlkaXR5KAogICAgLy8gICAgICAgICAgICAgcm9sZV92YWxpZGl0eV9zdGFydD1VSW50NjQoMCksIHJvbGVfdmFsaWRpdHlfZW5kPVVJbnQ2NCgwKQogICAgLy8gICAgICAgICApCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLmFjY291bnRfbWFuYWdlciwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLnByaW1hcnlfZGVhbGVyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLmF1dGhvcml0eSwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLm9ic2VydmVyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIF86CiAgICAvLyAgICAgICAgIG9wLmVycihlcnIuSU5WQUxJRF9ST0xFKQogICAgdW5jb3ZlciA2CiAgICBtYXRjaCByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzBAMiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzFAMyByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzJANCByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzNANSByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzRANiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzVANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM3OQogICAgLy8gb3AuZXJyKGVyci5JTlZBTElEX1JPTEUpCiAgICBlcnIgLy8gSW52YWxpZCByb2xlIGlkZW50aWZpZXIKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM3NQogICAgLy8gc2VsZi5vYnNlcnZlciwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyA2IC8vIDB4NTIzYTRkNGY0MzIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTcKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mzc0LTM3NgogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM3NwogICAgLy8gcmV0dXJuIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzRANjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNzAKICAgIC8vIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjXzMgLy8gMHg1MjNhNDE1NTU0MjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NwogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNjktMzcxCiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5hdXRob3JpdHksIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM3MgogICAgLy8gcmV0dXJuIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfM0A1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM2NQogICAgLy8gc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjXzIgLy8gMHg1MjNhNTQ1MjUzMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NwogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNjQtMzY2CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNjcKICAgIC8vIHJldHVybiBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8yQDQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzYwCiAgICAvLyBzZWxmLnByaW1hcnlfZGVhbGVyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDUgLy8gMHg1MjNhNTA1OTQ0MjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NwogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTktMzYxCiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzYyCiAgICAvLyByZXR1cm4gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzFAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTUKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDQgLy8gMHg1MjNhNGQ0ZTQ3MjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NwogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTQtMzU2CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM1NwogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMEAyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM1MC0zNTIKICAgIC8vIHJldHVybiB0eXAuUm9sZVZhbGlkaXR5KAogICAgLy8gICAgIHJvbGVfdmFsaWRpdHlfc3RhcnQ9VUludDY0KDApLCByb2xlX3ZhbGlkaXR5X2VuZD1VSW50NjQoMCkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9yb2xlX2lzX2FjdGl2ZShyb2xlX21hcDogYnl0ZXMsIHJvbGVfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NDoKX3JvbGVfaXNfYWN0aXZlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5CiAgICAvLyBkZWYgX3JvbGVfaXNfYWN0aXZlKHNlbGYsIHJvbGVfbWFwOiB0eXAuUmJhY1JvbGUsIHJvbGVfYWRkcmVzczogQWNjb3VudCkgLT4gYm9vbDoKICAgIHByb3RvIDIgMQogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTcKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAtNjQKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYxCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjIKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYxLTYyCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYxLTYzCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjMKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgcHVzaGludCA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYyLTYzCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDAKICAgID49CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjEtNjMKICAgIC8vIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IF9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQKICAgIGludGNfMCAvLyAxCgpfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYwLTY0CiAgICAvLyByZXR1cm4gc2VsZi5faGFzX3JvbGUocm9sZV9tYXAsIHJvbGVfYWRkcmVzcykgYW5kICgKICAgIC8vICAgICByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICkKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0OgogICAgaW50Y18xIC8vIDAKICAgIGIgX3JvbGVfaXNfYWN0aXZlX2Jvb2xfbWVyZ2VANQoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkgLT4gdm9pZDoKX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjcKICAgIC8vIGFzc2VydCBzZWxmLl9pc19hcnJhbmdlcihUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU0CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzID09IHNlbGYuYXJyYW5nZXIudmFsdWUKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18xIC8vIDB4NTIzYTQxNTI1MjIzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJyYW5nZXIgZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjY3CiAgICAvLyBhc3NlcnQgc2VsZi5faXNfYXJyYW5nZXIoVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9pc19ub3RfY29udHJhY3RfZGVmYXVsdGVkKCkgLT4gdm9pZDoKX2Fzc2VydF9pc19ub3RfY29udHJhY3RfZGVmYXVsdGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg1CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuZGVmYXVsdGVkLCBlcnIuREVGQVVMVEVECiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgNyAvLyAiZGVmYXVsdGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRlZmF1bHRlZCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBEZWZhdWx0ZWQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkOiB1aW50NjQpIC0+IHZvaWQ6Cl9hc3NlcnRfdmFsaWRfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MAogICAgLy8gZGVmIF9hc3NlcnRfdmFsaWRfcm9sZShzZWxmLCByb2xlX2lkOiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MS05OQogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTIKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIGludGNfMyAvLyAyMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkxLTk5CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTMKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICBwdXNoaW50IDI1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEtOTkKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NAogICAgLy8gVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIHB1c2hpbnQgNDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MS05OQogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojk1CiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICBwdXNoaW50IDUwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEtOTkKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NgogICAgLy8gVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICBwdXNoaW50IDYwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEtOTkKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NwogICAgLy8gVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIHB1c2hpbnQgNzAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MS05OQogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojk4CiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICBwdXNoaW50IDgwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEtOTkKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBieiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9mYWxzZUA4CgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDc6CiAgICBpbnRjXzAgLy8gMQoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfbWVyZ2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MS05OQogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICByZXRzdWIKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX2ZhbHNlQDg6CiAgICBpbnRjXzEgLy8gMAogICAgYiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9tZXJnZUA5Cg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" }, "byteCode": { diff --git a/smart_contracts/artifacts/mock_module_rbac/mock_rbac_module_client.py b/smart_contracts/artifacts/mock_module_rbac/mock_rbac_module_client.py index 270568a0..77744888 100644 --- a/smart_contracts/artifacts/mock_module_rbac/mock_rbac_module_client.py +++ b/smart_contracts/artifacts/mock_module_rbac/mock_rbac_module_client.py @@ -19,7 +19,7 @@ import algokit_utils from algokit_utils import AlgorandClient as _AlgoKitAlgorandClient -_APP_SPEC_JSON = r"""{"arcs": [22, 28], "bareActions": {"call": [], "create": ["NoOp"]}, "methods": [{"actions": {"call": ["UpdateApplication"], "create": []}, "args": [], "name": "contract_update", "returns": {"type": "void", "desc": "None."}, "desc": "Update D-ASA application.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "New arranger address.", "name": "new_arranger"}], "name": "rbac_rotate_arranger", "returns": {"type": "uint64", "desc": "UNIX timestamp of the role assignment."}, "desc": "Rotate the arranger address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Operation daemon address.", "name": "address"}], "name": "rbac_set_op_daemon", "returns": {"type": "uint64", "desc": "UNIX timestamp of the role assignment."}, "desc": "Non-normative helper to set the operation daemon address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role identifier.", "name": "role_id"}, {"type": "address", "desc": "Account role address.", "name": "role_address"}, {"type": "(uint64,uint64)", "desc": "Inclusive validity interval for the assignment.", "name": "validity", "struct": "RoleValidity"}], "name": "rbac_assign_role", "returns": {"type": "uint64", "desc": "UNIX timestamp of the role assignment."}, "desc": "Assign a role to an address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role identifier.", "name": "role_id"}, {"type": "address", "desc": "Account role address.", "name": "role_address"}], "name": "rbac_revoke_role", "returns": {"type": "uint64", "desc": "UNIX timestamp of the role revocation."}, "desc": "Revoke a role from an address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Suspension status to apply.", "name": "suspended"}], "name": "rbac_contract_suspension", "returns": {"type": "uint64", "desc": "UNIX timestamp of the suspension update."}, "desc": "Set the asset-wide suspension status.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Default status", "name": "defaulted"}], "name": "rbac_contract_default", "returns": {"type": "uint64"}, "desc": "Set D-ASA default status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "rbac_get_arranger", "returns": {"type": "address", "desc": "Current arranger address."}, "desc": "Get the arranger address.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Address to query.", "name": "address"}], "name": "rbac_get_address_roles", "returns": {"type": "(bool,bool,bool,bool,bool)", "desc": "Roles mask in the order: account manager, primary dealer, trustee, authority, observer."}, "desc": "Non-normative helper to get the active roles assigned to an address.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role identifier.", "name": "role_id"}, {"type": "address", "desc": "Account role address.", "name": "role_address"}], "name": "rbac_get_role_validity", "returns": {"type": "(uint64,uint64)", "desc": "Stored role validity interval.", "struct": "RoleValidity"}, "desc": "Get the stored validity interval for a role assignment.", "events": [], "readonly": true, "recommendations": {}}], "name": "MockRbacModule", "state": {"keys": {"box": {}, "global": {"arranger": {"key": "UjpBUlIj", "keyType": "AVMBytes", "valueType": "address"}, "op_daemon": {"key": "UjpPUEQj", "keyType": "AVMBytes", "valueType": "address"}, "contract_suspended": {"key": "Y29udHJhY3Rfc3VzcGVuZGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "defaulted": {"key": "ZGVmYXVsdGVk", "keyType": "AVMString", "valueType": "AVMUint64"}}, "local": {}}, "maps": {"box": {"account_manager": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpNTkcj"}, "primary_dealer": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpQWUQj"}, "trustee": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpUUlMj"}, "authority": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpBVVQj"}, "observer": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpNT0Mj"}}, "global": {}, "local": {}}, "schema": {"global": {"bytes": 2, "ints": 2}, "local": {"bytes": 0, "ints": 0}}}, "structs": {"RoleValidity": [{"name": "role_validity_start", "type": "uint64"}, {"name": "role_validity_end", "type": "uint64"}]}, "byteCode": {"approval": "CyAEAQAgFCYKBBUffHUGUjpBUlIjBlI6VFJTIwZSOkFVVCMGUjpNTkcjBlI6UFlEIwZSOk1PQyMJZGVmYXVsdGVkBlI6T1BEIxJjb250cmFjdF9zdXNwZW5kZWQxGEAAESkyA2cnCDIDZycJI2cnByNnMRtBAGeABJFPBOs2GgCOAQBOMRkURDEYRIIJBIL3Gy0E7wT10wTfNDVQBD2+gL0EHj5I5wQ5JB+jBAEMgpkEdAas0gQacqLuNhoAjgkAIAA3AE8BAAGTAbEBzwHZAiIAMRmBBBIxGBBEQgAOMRkUMRgUEEQpMQBnIkOIAsoiQzYaAUkVJBJEiAK9KUxnMgcWKExQsCJDNhoBSRUkEkSIAqYnCExnMgcWKExQsCJDNhoBSRUiEkQ2GgJJTgIVJBJENhoDSU4CFYEQEkSIAnmIAn8XRwKIAoElEkEADSlLA2cyBxYoTFCwIkNJgSgSQQARJwRLA1BJvUUBFERLAr9C/99JgTISQQARJwVLA1BJvUUBFERLAr9C/8dJgTwSQQAQKksDUEm9RQEUREsCv0L/sEmBRhJBABArSwNQSb1FARRESwK/Qv+ZSYFQEkH/kicGSwNQSb1FARRESwK/Qv+BNhoBSRUiEkQ2GgJJTgIVJBJEiAHTiAHZF0cCiAHbSSUTRIEoEkEAFScESwJQSb1FAUS8SDIHFihMULAiQ0mBMhJBAA8nBUsCUEm9RQFEvEhC/+FJgTwSQQAOKksCUEm9RQFEvEhC/8xJgUYSQQAOK0sCUEm9RQFEvEhC/7dJgVASQf+wJwZLAlBJvUUBRLxIQv+hNhoBSRUiEkQjUysxAIgBEEQnCUxnMgcWKExQsCJDNhoBSRUiEkQjUyoxAIgA8kQnB0xnMgcWKExQsCJDIyllRChMULAiQzYaAUkVJBJEJwRLAYgAyycFSwKIAMQqSwOIAL4rSwSIALgnBk8FiACxgAEAI08GVCJPBVSBAk8EVIEDTwNUgQRPAlQoTFCwIkM2GgFJFSISRDYaAklOAhUkEkQXSYgAwCWDBSgyPEZQTwaOBgBNAD4ALwAhABMAAQAnBksBUEm9RQFEvkgoTFCwIkMrSwFQSb1FAUS+SEL/7CpLAVBJvUUBRL5IQv/eJwVLAVBJvUUBRL5IQv/PJwRLAVBJvUUBRL5IQv/AgBAAAAAAAAAAAAAAAAAAAAAAQv+rigIBgACL/ov/UEm9RQFBACCLAb5EI1syB0mMAA5BABGLAb5EgQhbiwAPQQAEIowAiSNC//kxACMpZUQSRIkjJwdlRBREiYoBAIv/JRJAADCL/4EZEkAAKIv/gSgSQAAgi/+BMhJAABiL/4E8EkAAEIv/gUYSQAAIi/+BUBJBAAMiRIkjQv/6", "clear": "C4EBQw=="}, "desc": "\n RBAC Module for testing\n ", "events": [], "networks": {}, "source": {"approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMzIgMjAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAweDUyM2E0MTUyNTIyMyAweDUyM2E1NDUyNTMyMyAweDUyM2E0MTU1NTQyMyAweDUyM2E0ZDRlNDcyMyAweDUyM2E1MDU5NDQyMyAweDUyM2E0ZDRmNDMyMyAiZGVmYXVsdGVkIiAweDUyM2E0ZjUwNDQyMyAiY29udHJhY3Rfc3VzcGVuZGVkIgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4LTI5CiAgICAvLyAjIFJCQUMgUm9sZXMKICAgIC8vIHNlbGYuYXJyYW5nZXIgPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX0FSUkFOR0VSKQogICAgYnl0ZWNfMSAvLyAweDUyM2E0MTUyNTIyMwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwCiAgICAvLyBzZWxmLm9wX2RhZW1vbiA9IEdsb2JhbFN0YXRlKEFjY291bnQoKSwga2V5PWNzdC5QUkVGSVhfSURfT1BfREFFTU9OKQogICAgYnl0ZWMgOCAvLyAweDUyM2E0ZjUwNDQyMwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjQ3LTQ4CiAgICAvLyAjIENvbnRyYWN0IEdvdmVybmFuY2UKICAgIC8vIHNlbGYuY29udHJhY3Rfc3VzcGVuZGVkID0gRmFsc2UKICAgIGJ5dGVjIDkgLy8gImNvbnRyYWN0X3N1c3BlbmRlZCIKICAgIGludGNfMSAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjUwLTUxCiAgICAvLyAjIENvbnRyYWN0IFBlcmZvcm1hbmNlCiAgICAvLyBzZWxmLmRlZmF1bHRlZCA9IEZhbHNlCiAgICBieXRlYyA3IC8vICJkZWZhdWx0ZWQiCiAgICBpbnRjXzEgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL21vY2tfbW9kdWxlX3JiYWMvY29udHJhY3QucHk6NgogICAgLy8gY2xhc3MgTW9ja1JiYWNNb2R1bGUoUmJhY01vZHVsZSk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9jcmVhdGVAMjAKICAgIHB1c2hieXRlcyAweDkxNGYwNGViIC8vIG1ldGhvZCAiY29udHJhY3RfdXBkYXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9jb250cmFjdF91cGRhdGVfcm91dGVANQoKbWFpbl9zd2l0Y2hfY2FzZV9uZXh0QDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbW9ja19tb2R1bGVfcmJhYy9jb250cmFjdC5weTo2CiAgICAvLyBjbGFzcyBNb2NrUmJhY01vZHVsZShSYmFjTW9kdWxlKToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweDgyZjcxYjJkIDB4ZWYwNGY1ZDMgMHhkZjM0MzU1MCAweDNkYmU4MGJkIDB4MWUzZTQ4ZTcgMHgzOTI0MWZhMyAweDAxMGM4Mjk5IDB4NzQwNmFjZDIgMHgxYTcyYTJlZSAvLyBtZXRob2QgInJiYWNfcm90YXRlX2FycmFuZ2VyKGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX3NldF9vcF9kYWVtb24oYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgInJiYWNfYXNzaWduX3JvbGUodWludDgsYWRkcmVzcywodWludDY0LHVpbnQ2NCkpdWludDY0IiwgbWV0aG9kICJyYmFjX3Jldm9rZV9yb2xlKHVpbnQ4LGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX2NvbnRyYWN0X3N1c3BlbnNpb24oYm9vbCl1aW50NjQiLCBtZXRob2QgInJiYWNfY29udHJhY3RfZGVmYXVsdChib29sKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19nZXRfYXJyYW5nZXIoKWFkZHJlc3MiLCBtZXRob2QgInJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXMoYWRkcmVzcykoYm9vbCxib29sLGJvb2wsYm9vbCxib29sKSIsIG1ldGhvZCAicmJhY19nZXRfcm9sZV92YWxpZGl0eSh1aW50OCxhZGRyZXNzKSh1aW50NjQsdWludDY0KSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIHJiYWNfcm90YXRlX2FycmFuZ2VyIHJiYWNfc2V0X29wX2RhZW1vbiByYmFjX2Fzc2lnbl9yb2xlIHJiYWNfcmV2b2tlX3JvbGUgcmJhY19jb250cmFjdF9zdXNwZW5zaW9uIHJiYWNfY29udHJhY3RfZGVmYXVsdCByYmFjX2dldF9hcnJhbmdlciByYmFjX2dldF9hZGRyZXNzX3JvbGVzIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHkKICAgIGVycgoKbWFpbl9jb250cmFjdF91cGRhdGVfcm91dGVANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgNCAvLyBVcGRhdGVBcHBsaWNhdGlvbgogICAgPT0KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0CiAgICBiIGNvbnRyYWN0X3VwZGF0ZQoKbWFpbl9jcmVhdGVAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbW9ja19tb2R1bGVfcmJhYy9jb250cmFjdC5weToxNAogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICBhc3NlcnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tb2NrX21vZHVsZV9yYmFjL2NvbnRyYWN0LnB5OjE2CiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gVHhuLnNlbmRlcgogICAgYnl0ZWNfMSAvLyAweDUyM2E0MTUyNTIyMwogICAgdHhuIFNlbmRlcgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tb2NrX21vZHVsZV9yYmFjL2NvbnRyYWN0LnB5OjE0CiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuY29udHJhY3RfdXBkYXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfdXBkYXRlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2MS0xNjQKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBncmFudHMgdGhlIHVwZGF0ZSBwZXJtaXNzaW9ucyB0byB0aGUgQXJyYW5nZXIuCiAgICAvLyAjIOKaoO+4jyBXQVJOSU5HOiBBcHBsaWNhdGlvbiB1cGRhdGVzIG11c3QgYmUgZXhlY3V0ZWQgVkVSWSBjYXJlZnVsbHksIGFzIHRoZXkKICAgIC8vICMgbWlnaHQgaW50cm9kdWNlIGJyZWFraW5nIGNoYW5nZXMuCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3JvdGF0ZV9hcnJhbmdlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfcm90YXRlX2FycmFuZ2VyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODAKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4MQogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IG5ld19hcnJhbmdlcgogICAgYnl0ZWNfMSAvLyAweDUyM2E0MTUyNTIyMwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODIKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19zZXRfb3BfZGFlbW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19zZXRfb3BfZGFlbW9uOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToxOTgKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE5OQogICAgLy8gc2VsZi5vcF9kYWVtb24udmFsdWUgPSBhZGRyZXNzCiAgICBieXRlYyA4IC8vIDB4NTIzYTRmNTA0NDIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwMAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTg0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2Fzc2lnbl9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19hc3NpZ25fcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDE2CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLlJvbGVWYWxpZGl0eQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI1CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNgogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDQKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgaW50Y18zIC8vIDIwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDUKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSByb2xlX2FkZHJlc3MKICAgIGJ5dGVjXzEgLy8gMHg1MjNhNDE1MjUyMjMKICAgIGRpZyAzCiAgICBhcHBfZ2xvYmFsX3B1dAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjgKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDgKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIGR1cAogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnRfbWFuYWdlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyA0IC8vIDB4NTIzYTRkNGU0NzIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTAKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI3CiAgICAvLyBzZWxmLl9zZXRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIHZhbGlkaXR5KQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTMKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgNSAvLyAweDUyM2E1MDU5NDQyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE0CiAgICAvLyBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI3CiAgICAvLyBzZWxmLl9zZXRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIHZhbGlkaXR5KQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTYKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNjAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjXzIgLy8gMHg1MjNhNTQ1MjUzMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExOAogICAgLy8gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI3CiAgICAvLyBzZWxmLl9zZXRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIHZhbGlkaXR5KQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjAKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKToKICAgIGR1cAogICAgcHVzaGludCA3MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAxMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5hdXRob3JpdHksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWNfMyAvLyAweDUyM2E0MTU1NTQyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIyCiAgICAvLyBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNwogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyNAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgODAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI1CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDYgLy8gMHg1MjNhNGQ0ZjQzMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyNgogICAgLy8gc2VsZi5vYnNlcnZlcltyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19yZXZva2Vfcm9sZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfcmV2b2tlX3JvbGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjQ5CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTAKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjUxCiAgICAvLyBzZWxmLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpKQogICAgYnRvaQogICAgZHVwbiAyCiAgICBjYWxsc3ViIF9hc3NlcnRfdmFsaWRfcm9sZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyOQogICAgLy8gYXNzZXJ0IHJvbGVfaWQgIT0gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBkdXAKICAgIGludGNfMyAvLyAyMAogICAgIT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMxCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDQgLy8gMHg1MjNhNGQ0ZTQ3MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMgogICAgLy8gZGVsIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTMKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzQKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzUKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyA1IC8vIDB4NTIzYTUwNTk0NDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzYKICAgIC8vIGRlbCBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1MgogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzgKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNjAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzOQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWNfMiAvLyAweDUyM2E1NDUyNTMyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQwCiAgICAvLyBkZWwgc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1MgogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKToKICAgIGR1cAogICAgcHVzaGludCA3MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQzCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjXzMgLy8gMHg1MjNhNDE1NTU0MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NAogICAgLy8gZGVsIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1MgogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDYKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDgwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDYgLy8gMHg1MjNhNGQ0ZjQzMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0OAogICAgLy8gZGVsIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2NvbnRyYWN0X3N1c3BlbnNpb25bcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2NvbnRyYWN0X3N1c3BlbnNpb246CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzEgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzkKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjXzMgLy8gMHg1MjNhNDE1NTU0MjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNzEKICAgIC8vIHNlbGYuY29udHJhY3Rfc3VzcGVuZGVkID0gc3VzcGVuZGVkCiAgICBieXRlYyA5IC8vICJjb250cmFjdF9zdXNwZW5kZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3MgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2NvbnRyYWN0X2RlZmF1bHRbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2NvbnRyYWN0X2RlZmF1bHQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjc0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzEgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzYKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnRydXN0ZWUsIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlY18yIC8vIDB4NTIzYTU0NTI1MzIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg3CiAgICAvLyBzZWxmLmRlZmF1bHRlZCA9IGRlZmF1bHRlZAogICAgYnl0ZWMgNyAvLyAiZGVmYXVsdGVkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODgKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYXJyYW5nZXJbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDEKICAgIC8vIHJldHVybiBzZWxmLmFycmFuZ2VyLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMSAvLyAweDUyM2E0MTUyNTIyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYWRkcmVzc19yb2xlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzAzCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMQogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hY2NvdW50X21hbmFnZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgNCAvLyAweDUyM2E0ZDRlNDcyMwogICAgZGlnIDEKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzIyCiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnByaW1hcnlfZGVhbGVyLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDUgLy8gMHg1MjNhNTA1OTQ0MjMKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMwogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi50cnVzdGVlLCBhZGRyZXNzKSwKICAgIGJ5dGVjXzIgLy8gMHg1MjNhNTQ1MjUzMjMKICAgIGRpZyAzCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyNAogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIGFkZHJlc3MpLAogICAgYnl0ZWNfMyAvLyAweDUyM2E0MTU1NTQyMwogICAgZGlnIDQKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI1CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLm9ic2VydmVyLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDYgLy8gMHg1MjNhNGQ0ZjQzMjMKICAgIHVuY292ZXIgNQogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDYKICAgIHNldGJpdAogICAgaW50Y18wIC8vIDEKICAgIHVuY292ZXIgNQogICAgc2V0Yml0CiAgICBwdXNoaW50IDIKICAgIHVuY292ZXIgNAogICAgc2V0Yml0CiAgICBwdXNoaW50IDMKICAgIHVuY292ZXIgMwogICAgc2V0Yml0CiAgICBwdXNoaW50IDQKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzQ2CiAgICAvLyByb2xlID0gcm9sZV9pZC5hc191aW50NjQoKQogICAgYnRvaQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM0NwogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZSkKICAgIGR1cAogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNDkKICAgIC8vIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgaW50Y18zIC8vIDIwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzUzCiAgICAvLyBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICBwdXNoaW50cyA0MCA1MCA2MCA3MCA4MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM0OC0zNzkKICAgIC8vIG1hdGNoIHJvbGU6CiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUik6CiAgICAvLyAgICAgICAgIHJldHVybiB0eXAuUm9sZVZhbGlkaXR5KAogICAgLy8gICAgICAgICAgICAgcm9sZV92YWxpZGl0eV9zdGFydD1VSW50NjQoMCksIHJvbGVfdmFsaWRpdHlfZW5kPVVJbnQ2NCgwKQogICAgLy8gICAgICAgICApCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLmFjY291bnRfbWFuYWdlciwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLnByaW1hcnlfZGVhbGVyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLmF1dGhvcml0eSwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLm9ic2VydmVyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIF86CiAgICAvLyAgICAgICAgIG9wLmVycihlcnIuSU5WQUxJRF9ST0xFKQogICAgdW5jb3ZlciA2CiAgICBtYXRjaCByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzBAMiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzFAMyByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzJANCByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzNANSByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzRANiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzVANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM3OQogICAgLy8gb3AuZXJyKGVyci5JTlZBTElEX1JPTEUpCiAgICBlcnIgLy8gSW52YWxpZCByb2xlIGlkZW50aWZpZXIKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM3NQogICAgLy8gc2VsZi5vYnNlcnZlciwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyA2IC8vIDB4NTIzYTRkNGY0MzIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTcKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mzc0LTM3NgogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM3NwogICAgLy8gcmV0dXJuIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzRANjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNzAKICAgIC8vIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjXzMgLy8gMHg1MjNhNDE1NTU0MjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NwogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNjktMzcxCiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5hdXRob3JpdHksIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM3MgogICAgLy8gcmV0dXJuIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfM0A1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM2NQogICAgLy8gc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjXzIgLy8gMHg1MjNhNTQ1MjUzMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NwogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNjQtMzY2CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNjcKICAgIC8vIHJldHVybiBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8yQDQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzYwCiAgICAvLyBzZWxmLnByaW1hcnlfZGVhbGVyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDUgLy8gMHg1MjNhNTA1OTQ0MjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NwogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTktMzYxCiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzYyCiAgICAvLyByZXR1cm4gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzFAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTUKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDQgLy8gMHg1MjNhNGQ0ZTQ3MjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NwogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTQtMzU2CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM1NwogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMEAyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM1MC0zNTIKICAgIC8vIHJldHVybiB0eXAuUm9sZVZhbGlkaXR5KAogICAgLy8gICAgIHJvbGVfdmFsaWRpdHlfc3RhcnQ9VUludDY0KDApLCByb2xlX3ZhbGlkaXR5X2VuZD1VSW50NjQoMCkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9yb2xlX2lzX2FjdGl2ZShyb2xlX21hcDogYnl0ZXMsIHJvbGVfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NDoKX3JvbGVfaXNfYWN0aXZlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5CiAgICAvLyBkZWYgX3JvbGVfaXNfYWN0aXZlKHNlbGYsIHJvbGVfbWFwOiB0eXAuUmJhY1JvbGUsIHJvbGVfYWRkcmVzczogQWNjb3VudCkgLT4gYm9vbDoKICAgIHByb3RvIDIgMQogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTcKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAtNjQKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYxCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjIKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYxLTYyCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYxLTYzCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjMKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgcHVzaGludCA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYyLTYzCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDAKICAgID49CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjEtNjMKICAgIC8vIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IF9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQKICAgIGludGNfMCAvLyAxCgpfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYwLTY0CiAgICAvLyByZXR1cm4gc2VsZi5faGFzX3JvbGUocm9sZV9tYXAsIHJvbGVfYWRkcmVzcykgYW5kICgKICAgIC8vICAgICByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICkKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0OgogICAgaW50Y18xIC8vIDAKICAgIGIgX3JvbGVfaXNfYWN0aXZlX2Jvb2xfbWVyZ2VANQoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkgLT4gdm9pZDoKX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjcKICAgIC8vIGFzc2VydCBzZWxmLl9pc19hcnJhbmdlcihUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU0CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzID09IHNlbGYuYXJyYW5nZXIudmFsdWUKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18xIC8vIDB4NTIzYTQxNTI1MjIzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJyYW5nZXIgZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjY3CiAgICAvLyBhc3NlcnQgc2VsZi5faXNfYXJyYW5nZXIoVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkgLT4gdm9pZDoKX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg1CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuZGVmYXVsdGVkLCBlcnIuREVGQVVMVEVECiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgNyAvLyAiZGVmYXVsdGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRlZmF1bHRlZCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBEZWZhdWx0ZWQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkOiB1aW50NjQpIC0+IHZvaWQ6Cl9hc3NlcnRfdmFsaWRfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MAogICAgLy8gZGVmIF9hc3NlcnRfdmFsaWRfcm9sZShzZWxmLCByb2xlX2lkOiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MS05OQogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTIKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIGludGNfMyAvLyAyMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkxLTk5CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTMKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICBwdXNoaW50IDI1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEtOTkKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NAogICAgLy8gVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIHB1c2hpbnQgNDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MS05OQogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojk1CiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICBwdXNoaW50IDUwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEtOTkKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NgogICAgLy8gVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICBwdXNoaW50IDYwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEtOTkKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NwogICAgLy8gVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIHB1c2hpbnQgNzAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MS05OQogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojk4CiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICBwdXNoaW50IDgwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEtOTkKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBieiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9mYWxzZUA4CgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDc6CiAgICBpbnRjXzAgLy8gMQoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfbWVyZ2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MS05OQogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICByZXRzdWIKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX2ZhbHNlQDg6CiAgICBpbnRjXzEgLy8gMAogICAgYiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9tZXJnZUA5Cg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="}, "sourceInfo": {"approval": {"pcOffsetMethod": "none", "sourceInfo": [{"pc": [968], "errorMessage": "Defaulted"}, {"pc": [364, 388, 411, 434, 458, 514, 542, 563, 584, 606, 812, 829, 843, 858, 873], "errorMessage": "Invalid account role address"}, {"pc": [498, 802, 1029], "errorMessage": "Invalid role identifier"}, {"pc": [628, 658, 960], "errorMessage": "Not authorized"}, {"pc": [920, 935], "errorMessage": "check BoxMap entry exists"}, {"pc": [675, 958], "errorMessage": "check self.arranger exists"}, {"pc": [966], "errorMessage": "check self.defaulted exists"}, {"pc": [619, 649], "errorMessage": "invalid number of bytes for arc4.bool"}, {"pc": [248, 271, 305, 482, 689, 772], "errorMessage": "invalid number of bytes for arc4.static_array"}, {"pc": [295, 472, 762], "errorMessage": "invalid number of bytes for arc4.uint8"}, {"pc": [316], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.RoleValidity"}]}, "clear": {"pcOffsetMethod": "none", "sourceInfo": []}}, "templateVariables": {}}""" +_APP_SPEC_JSON = r"""{"arcs": [22, 28], "bareActions": {"call": [], "create": ["NoOp"]}, "methods": [{"actions": {"call": ["UpdateApplication"], "create": []}, "args": [], "name": "contract_update", "returns": {"type": "void", "desc": "None."}, "desc": "Update D-ASA application.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "New arranger address.", "name": "new_arranger"}], "name": "rbac_rotate_arranger", "returns": {"type": "uint64", "desc": "UNIX timestamp of the role assignment."}, "desc": "Rotate the arranger address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Operation daemon address.", "name": "address"}], "name": "rbac_set_op_daemon", "returns": {"type": "uint64", "desc": "UNIX timestamp of the role assignment."}, "desc": "Non-normative helper to set the operation daemon address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role identifier.", "name": "role_id"}, {"type": "address", "desc": "Account role address.", "name": "role_address"}, {"type": "(uint64,uint64)", "desc": "Inclusive validity interval for the assignment.", "name": "validity", "struct": "RoleValidity"}], "name": "rbac_assign_role", "returns": {"type": "uint64", "desc": "UNIX timestamp of the role assignment."}, "desc": "Assign a role to an address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role identifier.", "name": "role_id"}, {"type": "address", "desc": "Account role address.", "name": "role_address"}], "name": "rbac_revoke_role", "returns": {"type": "uint64", "desc": "UNIX timestamp of the role revocation."}, "desc": "Revoke a role from an address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Suspension status to apply.", "name": "suspended"}], "name": "rbac_contract_suspension", "returns": {"type": "uint64", "desc": "UNIX timestamp of the suspension update."}, "desc": "Set the asset-wide suspension status.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Default status", "name": "defaulted"}], "name": "rbac_contract_default", "returns": {"type": "uint64"}, "desc": "Set D-ASA default status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "rbac_get_arranger", "returns": {"type": "address", "desc": "Current arranger address."}, "desc": "Get the arranger address.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Address to query.", "name": "address"}], "name": "rbac_get_address_roles", "returns": {"type": "(bool,bool,bool,bool,bool)", "desc": "Roles mask in the order: account manager, primary dealer, trustee, authority, observer."}, "desc": "Non-normative helper to get the active roles assigned to an address.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role identifier.", "name": "role_id"}, {"type": "address", "desc": "Account role address.", "name": "role_address"}], "name": "rbac_get_role_validity", "returns": {"type": "(uint64,uint64)", "desc": "Stored role validity interval.", "struct": "RoleValidity"}, "desc": "Get the stored validity interval for a role assignment.", "events": [], "readonly": true, "recommendations": {}}], "name": "MockRbacModule", "state": {"keys": {"box": {}, "global": {"arranger": {"key": "UjpBUlIj", "keyType": "AVMBytes", "valueType": "address"}, "op_daemon": {"key": "UjpPUEQj", "keyType": "AVMBytes", "valueType": "address"}, "contract_suspended": {"key": "Y29udHJhY3Rfc3VzcGVuZGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "defaulted": {"key": "ZGVmYXVsdGVk", "keyType": "AVMString", "valueType": "AVMUint64"}}, "local": {}}, "maps": {"box": {"account_manager": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpNTkcj"}, "primary_dealer": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpQWUQj"}, "trustee": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpUUlMj"}, "authority": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpBVVQj"}, "observer": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpNT0Mj"}}, "global": {}, "local": {}}, "schema": {"global": {"bytes": 2, "ints": 2}, "local": {"bytes": 0, "ints": 0}}}, "structs": {"RoleValidity": [{"name": "role_validity_start", "type": "uint64"}, {"name": "role_validity_end", "type": "uint64"}]}, "byteCode": {"approval": "CyAEAQAgFCYKBBUffHUGUjpBUlIjBlI6VFJTIwZSOkFVVCMGUjpNTkcjBlI6UFlEIwZSOk1PQyMJZGVmYXVsdGVkBlI6T1BEIxJjb250cmFjdF9zdXNwZW5kZWQxGEAAESkyA2cnCDIDZycJI2cnByNnMRtBAGeABJFPBOs2GgCOAQBOMRkURDEYRIIJBIL3Gy0E7wT10wTfNDVQBD2+gL0EHj5I5wQ5JB+jBAEMgpkEdAas0gQacqLuNhoAjgkAIAA3AE8BAAGTAbEBzwHZAiIAMRmBBBIxGBBEQgAOMRkUMRgUEEQpMQBnIkOIAsoiQzYaAUkVJBJEiAK9KUxnMgcWKExQsCJDNhoBSRUkEkSIAqYnCExnMgcWKExQsCJDNhoBSRUiEkQ2GgJJTgIVJBJENhoDSU4CFYEQEkSIAnmIAn8XRwKIAoElEkEADSlLA2cyBxYoTFCwIkNJgSgSQQARJwRLA1BJvUUBFERLAr9C/99JgTISQQARJwVLA1BJvUUBFERLAr9C/8dJgTwSQQAQKksDUEm9RQEUREsCv0L/sEmBRhJBABArSwNQSb1FARRESwK/Qv+ZSYFQEkH/kicGSwNQSb1FARRESwK/Qv+BNhoBSRUiEkQ2GgJJTgIVJBJEiAHTiAHZF0cCiAHbSSUTRIEoEkEAFScESwJQSb1FAUS8SDIHFihMULAiQ0mBMhJBAA8nBUsCUEm9RQFEvEhC/+FJgTwSQQAOKksCUEm9RQFEvEhC/8xJgUYSQQAOK0sCUEm9RQFEvEhC/7dJgVASQf+wJwZLAlBJvUUBRLxIQv+hNhoBSRUiEkQjUysxAIgBEEQnCUxnMgcWKExQsCJDNhoBSRUiEkQjUyoxAIgA8kQnB0xnMgcWKExQsCJDIyllRChMULAiQzYaAUkVJBJEJwRLAYgAyycFSwKIAMQqSwOIAL4rSwSIALgnBk8FiACxgAEAI08GVCJPBVSBAk8EVIEDTwNUgQRPAlQoTFCwIkM2GgFJFSISRDYaAklOAhUkEkQXSYgAwCWDBSgyPEZQTwaOBgBNAD4ALwAhABMAAQAnBksBUEm9RQFEvkgoTFCwIkMrSwFQSb1FAUS+SEL/7CpLAVBJvUUBRL5IQv/eJwVLAVBJvUUBRL5IQv/PJwRLAVBJvUUBRL5IQv/AgBAAAAAAAAAAAAAAAAAAAAAAQv+rigIBgACL/ov/UEm9RQFBACCLAb5EI1syB0mMAA5BABGLAb5EgQhbiwAPQQAEIowAiSNC//kxACMpZUQSRIkjJwdlRBREiYoBAIv/JRJAADCL/4EZEkAAKIv/gSgSQAAgi/+BMhJAABiL/4E8EkAAEIv/gUYSQAAIi/+BUBJBAAMiRIkjQv/6", "clear": "C4EBQw=="}, "desc": "\n RBAC Module for testing\n ", "events": [], "networks": {}, "source": {"approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMzIgMjAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAweDUyM2E0MTUyNTIyMyAweDUyM2E1NDUyNTMyMyAweDUyM2E0MTU1NTQyMyAweDUyM2E0ZDRlNDcyMyAweDUyM2E1MDU5NDQyMyAweDUyM2E0ZDRmNDMyMyAiZGVmYXVsdGVkIiAweDUyM2E0ZjUwNDQyMyAiY29udHJhY3Rfc3VzcGVuZGVkIgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4LTI5CiAgICAvLyAjIFJCQUMgUm9sZXMKICAgIC8vIHNlbGYuYXJyYW5nZXIgPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX0FSUkFOR0VSKQogICAgYnl0ZWNfMSAvLyAweDUyM2E0MTUyNTIyMwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwCiAgICAvLyBzZWxmLm9wX2RhZW1vbiA9IEdsb2JhbFN0YXRlKEFjY291bnQoKSwga2V5PWNzdC5QUkVGSVhfSURfT1BfREFFTU9OKQogICAgYnl0ZWMgOCAvLyAweDUyM2E0ZjUwNDQyMwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjQ3LTQ4CiAgICAvLyAjIENvbnRyYWN0IEdvdmVybmFuY2UKICAgIC8vIHNlbGYuY29udHJhY3Rfc3VzcGVuZGVkID0gRmFsc2UKICAgIGJ5dGVjIDkgLy8gImNvbnRyYWN0X3N1c3BlbmRlZCIKICAgIGludGNfMSAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjUwLTUxCiAgICAvLyAjIENvbnRyYWN0IFBlcmZvcm1hbmNlCiAgICAvLyBzZWxmLmRlZmF1bHRlZCA9IEZhbHNlCiAgICBieXRlYyA3IC8vICJkZWZhdWx0ZWQiCiAgICBpbnRjXzEgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL21vY2tfbW9kdWxlX3JiYWMvY29udHJhY3QucHk6NgogICAgLy8gY2xhc3MgTW9ja1JiYWNNb2R1bGUoUmJhY01vZHVsZSk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9jcmVhdGVAMjAKICAgIHB1c2hieXRlcyAweDkxNGYwNGViIC8vIG1ldGhvZCAiY29udHJhY3RfdXBkYXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9jb250cmFjdF91cGRhdGVfcm91dGVANQoKbWFpbl9zd2l0Y2hfY2FzZV9uZXh0QDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbW9ja19tb2R1bGVfcmJhYy9jb250cmFjdC5weTo2CiAgICAvLyBjbGFzcyBNb2NrUmJhY01vZHVsZShSYmFjTW9kdWxlKToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweDgyZjcxYjJkIDB4ZWYwNGY1ZDMgMHhkZjM0MzU1MCAweDNkYmU4MGJkIDB4MWUzZTQ4ZTcgMHgzOTI0MWZhMyAweDAxMGM4Mjk5IDB4NzQwNmFjZDIgMHgxYTcyYTJlZSAvLyBtZXRob2QgInJiYWNfcm90YXRlX2FycmFuZ2VyKGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX3NldF9vcF9kYWVtb24oYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgInJiYWNfYXNzaWduX3JvbGUodWludDgsYWRkcmVzcywodWludDY0LHVpbnQ2NCkpdWludDY0IiwgbWV0aG9kICJyYmFjX3Jldm9rZV9yb2xlKHVpbnQ4LGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX2NvbnRyYWN0X3N1c3BlbnNpb24oYm9vbCl1aW50NjQiLCBtZXRob2QgInJiYWNfY29udHJhY3RfZGVmYXVsdChib29sKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19nZXRfYXJyYW5nZXIoKWFkZHJlc3MiLCBtZXRob2QgInJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXMoYWRkcmVzcykoYm9vbCxib29sLGJvb2wsYm9vbCxib29sKSIsIG1ldGhvZCAicmJhY19nZXRfcm9sZV92YWxpZGl0eSh1aW50OCxhZGRyZXNzKSh1aW50NjQsdWludDY0KSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIHJiYWNfcm90YXRlX2FycmFuZ2VyIHJiYWNfc2V0X29wX2RhZW1vbiByYmFjX2Fzc2lnbl9yb2xlIHJiYWNfcmV2b2tlX3JvbGUgcmJhY19jb250cmFjdF9zdXNwZW5zaW9uIHJiYWNfY29udHJhY3RfZGVmYXVsdCByYmFjX2dldF9hcnJhbmdlciByYmFjX2dldF9hZGRyZXNzX3JvbGVzIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHkKICAgIGVycgoKbWFpbl9jb250cmFjdF91cGRhdGVfcm91dGVANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgNCAvLyBVcGRhdGVBcHBsaWNhdGlvbgogICAgPT0KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0CiAgICBiIGNvbnRyYWN0X3VwZGF0ZQoKbWFpbl9jcmVhdGVAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbW9ja19tb2R1bGVfcmJhYy9jb250cmFjdC5weToxNAogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICBhc3NlcnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tb2NrX21vZHVsZV9yYmFjL2NvbnRyYWN0LnB5OjE2CiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gVHhuLnNlbmRlcgogICAgYnl0ZWNfMSAvLyAweDUyM2E0MTUyNTIyMwogICAgdHhuIFNlbmRlcgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tb2NrX21vZHVsZV9yYmFjL2NvbnRyYWN0LnB5OjE0CiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuY29udHJhY3RfdXBkYXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfdXBkYXRlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2MS0xNjQKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBncmFudHMgdGhlIHVwZGF0ZSBwZXJtaXNzaW9ucyB0byB0aGUgQXJyYW5nZXIuCiAgICAvLyAjIOKaoO+4jyBXQVJOSU5HOiBBcHBsaWNhdGlvbiB1cGRhdGVzIG11c3QgYmUgZXhlY3V0ZWQgVkVSWSBjYXJlZnVsbHksIGFzIHRoZXkKICAgIC8vICMgbWlnaHQgaW50cm9kdWNlIGJyZWFraW5nIGNoYW5nZXMuCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3JvdGF0ZV9hcnJhbmdlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfcm90YXRlX2FycmFuZ2VyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODAKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4MQogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IG5ld19hcnJhbmdlcgogICAgYnl0ZWNfMSAvLyAweDUyM2E0MTUyNTIyMwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODIKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19zZXRfb3BfZGFlbW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19zZXRfb3BfZGFlbW9uOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToxOTgKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE5OQogICAgLy8gc2VsZi5vcF9kYWVtb24udmFsdWUgPSBhZGRyZXNzCiAgICBieXRlYyA4IC8vIDB4NTIzYTRmNTA0NDIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwMAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTg0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2Fzc2lnbl9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19hc3NpZ25fcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDE2CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLlJvbGVWYWxpZGl0eQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI1CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2NvbnRyYWN0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2NvbnRyYWN0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNgogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDQKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgaW50Y18zIC8vIDIwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDUKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSByb2xlX2FkZHJlc3MKICAgIGJ5dGVjXzEgLy8gMHg1MjNhNDE1MjUyMjMKICAgIGRpZyAzCiAgICBhcHBfZ2xvYmFsX3B1dAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjgKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDgKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIGR1cAogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnRfbWFuYWdlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyA0IC8vIDB4NTIzYTRkNGU0NzIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTAKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI3CiAgICAvLyBzZWxmLl9zZXRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIHZhbGlkaXR5KQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTMKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgNSAvLyAweDUyM2E1MDU5NDQyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE0CiAgICAvLyBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI3CiAgICAvLyBzZWxmLl9zZXRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIHZhbGlkaXR5KQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTYKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNjAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjXzIgLy8gMHg1MjNhNTQ1MjUzMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExOAogICAgLy8gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI3CiAgICAvLyBzZWxmLl9zZXRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIHZhbGlkaXR5KQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjAKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKToKICAgIGR1cAogICAgcHVzaGludCA3MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAxMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5hdXRob3JpdHksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWNfMyAvLyAweDUyM2E0MTU1NTQyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIyCiAgICAvLyBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNwogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyNAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgODAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI1CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDYgLy8gMHg1MjNhNGQ0ZjQzMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyNgogICAgLy8gc2VsZi5vYnNlcnZlcltyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19yZXZva2Vfcm9sZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfcmV2b2tlX3JvbGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjQ5CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTAKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfY29udHJhY3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfY29udHJhY3RfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjUxCiAgICAvLyBzZWxmLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpKQogICAgYnRvaQogICAgZHVwbiAyCiAgICBjYWxsc3ViIF9hc3NlcnRfdmFsaWRfcm9sZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyOQogICAgLy8gYXNzZXJ0IHJvbGVfaWQgIT0gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBkdXAKICAgIGludGNfMyAvLyAyMAogICAgIT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMxCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDQgLy8gMHg1MjNhNGQ0ZTQ3MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMgogICAgLy8gZGVsIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTMKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzQKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzUKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyA1IC8vIDB4NTIzYTUwNTk0NDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzYKICAgIC8vIGRlbCBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1MgogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzgKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNjAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzOQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWNfMiAvLyAweDUyM2E1NDUyNTMyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQwCiAgICAvLyBkZWwgc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1MgogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKToKICAgIGR1cAogICAgcHVzaGludCA3MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQzCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjXzMgLy8gMHg1MjNhNDE1NTU0MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NAogICAgLy8gZGVsIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1MgogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDYKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDgwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDYgLy8gMHg1MjNhNGQ0ZjQzMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0OAogICAgLy8gZGVsIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2NvbnRyYWN0X3N1c3BlbnNpb25bcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2NvbnRyYWN0X3N1c3BlbnNpb246CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzEgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzkKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjXzMgLy8gMHg1MjNhNDE1NTU0MjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNzEKICAgIC8vIHNlbGYuY29udHJhY3Rfc3VzcGVuZGVkID0gc3VzcGVuZGVkCiAgICBieXRlYyA5IC8vICJjb250cmFjdF9zdXNwZW5kZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3MgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2NvbnRyYWN0X2RlZmF1bHRbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2NvbnRyYWN0X2RlZmF1bHQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjc0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzEgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzYKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnRydXN0ZWUsIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlY18yIC8vIDB4NTIzYTU0NTI1MzIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg3CiAgICAvLyBzZWxmLmRlZmF1bHRlZCA9IGRlZmF1bHRlZAogICAgYnl0ZWMgNyAvLyAiZGVmYXVsdGVkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODgKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYXJyYW5nZXJbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDEKICAgIC8vIHJldHVybiBzZWxmLmFycmFuZ2VyLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMSAvLyAweDUyM2E0MTUyNTIyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYWRkcmVzc19yb2xlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzAzCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMQogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hY2NvdW50X21hbmFnZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgNCAvLyAweDUyM2E0ZDRlNDcyMwogICAgZGlnIDEKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzIyCiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnByaW1hcnlfZGVhbGVyLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDUgLy8gMHg1MjNhNTA1OTQ0MjMKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMwogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi50cnVzdGVlLCBhZGRyZXNzKSwKICAgIGJ5dGVjXzIgLy8gMHg1MjNhNTQ1MjUzMjMKICAgIGRpZyAzCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyNAogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIGFkZHJlc3MpLAogICAgYnl0ZWNfMyAvLyAweDUyM2E0MTU1NTQyMwogICAgZGlnIDQKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI1CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLm9ic2VydmVyLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDYgLy8gMHg1MjNhNGQ0ZjQzMjMKICAgIHVuY292ZXIgNQogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDYKICAgIHNldGJpdAogICAgaW50Y18wIC8vIDEKICAgIHVuY292ZXIgNQogICAgc2V0Yml0CiAgICBwdXNoaW50IDIKICAgIHVuY292ZXIgNAogICAgc2V0Yml0CiAgICBwdXNoaW50IDMKICAgIHVuY292ZXIgMwogICAgc2V0Yml0CiAgICBwdXNoaW50IDQKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzQ2CiAgICAvLyByb2xlID0gcm9sZV9pZC5hc191aW50NjQoKQogICAgYnRvaQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM0NwogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZSkKICAgIGR1cAogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNDkKICAgIC8vIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgaW50Y18zIC8vIDIwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzUzCiAgICAvLyBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICBwdXNoaW50cyA0MCA1MCA2MCA3MCA4MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM0OC0zNzkKICAgIC8vIG1hdGNoIHJvbGU6CiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUik6CiAgICAvLyAgICAgICAgIHJldHVybiB0eXAuUm9sZVZhbGlkaXR5KAogICAgLy8gICAgICAgICAgICAgcm9sZV92YWxpZGl0eV9zdGFydD1VSW50NjQoMCksIHJvbGVfdmFsaWRpdHlfZW5kPVVJbnQ2NCgwKQogICAgLy8gICAgICAgICApCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLmFjY291bnRfbWFuYWdlciwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLnByaW1hcnlfZGVhbGVyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLmF1dGhvcml0eSwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLm9ic2VydmVyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIF86CiAgICAvLyAgICAgICAgIG9wLmVycihlcnIuSU5WQUxJRF9ST0xFKQogICAgdW5jb3ZlciA2CiAgICBtYXRjaCByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzBAMiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzFAMyByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzJANCByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzNANSByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzRANiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzVANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM3OQogICAgLy8gb3AuZXJyKGVyci5JTlZBTElEX1JPTEUpCiAgICBlcnIgLy8gSW52YWxpZCByb2xlIGlkZW50aWZpZXIKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM3NQogICAgLy8gc2VsZi5vYnNlcnZlciwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyA2IC8vIDB4NTIzYTRkNGY0MzIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTcKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mzc0LTM3NgogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM3NwogICAgLy8gcmV0dXJuIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzRANjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNzAKICAgIC8vIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjXzMgLy8gMHg1MjNhNDE1NTU0MjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NwogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNjktMzcxCiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5hdXRob3JpdHksIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM3MgogICAgLy8gcmV0dXJuIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfM0A1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM2NQogICAgLy8gc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjXzIgLy8gMHg1MjNhNTQ1MjUzMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NwogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNjQtMzY2CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNjcKICAgIC8vIHJldHVybiBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8yQDQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzYwCiAgICAvLyBzZWxmLnByaW1hcnlfZGVhbGVyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDUgLy8gMHg1MjNhNTA1OTQ0MjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NwogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTktMzYxCiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzYyCiAgICAvLyByZXR1cm4gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzFAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTUKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDQgLy8gMHg1MjNhNGQ0ZTQ3MjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NwogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTQtMzU2CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM1NwogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMEAyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM1MC0zNTIKICAgIC8vIHJldHVybiB0eXAuUm9sZVZhbGlkaXR5KAogICAgLy8gICAgIHJvbGVfdmFsaWRpdHlfc3RhcnQ9VUludDY0KDApLCByb2xlX3ZhbGlkaXR5X2VuZD1VSW50NjQoMCkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9yb2xlX2lzX2FjdGl2ZShyb2xlX21hcDogYnl0ZXMsIHJvbGVfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NDoKX3JvbGVfaXNfYWN0aXZlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5CiAgICAvLyBkZWYgX3JvbGVfaXNfYWN0aXZlKHNlbGYsIHJvbGVfbWFwOiB0eXAuUmJhY1JvbGUsIHJvbGVfYWRkcmVzczogQWNjb3VudCkgLT4gYm9vbDoKICAgIHByb3RvIDIgMQogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTcKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAtNjQKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYxCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjIKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYxLTYyCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYxLTYzCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjMKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgcHVzaGludCA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYyLTYzCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDAKICAgID49CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjEtNjMKICAgIC8vIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IF9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQKICAgIGludGNfMCAvLyAxCgpfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYwLTY0CiAgICAvLyByZXR1cm4gc2VsZi5faGFzX3JvbGUocm9sZV9tYXAsIHJvbGVfYWRkcmVzcykgYW5kICgKICAgIC8vICAgICByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICkKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0OgogICAgaW50Y18xIC8vIDAKICAgIGIgX3JvbGVfaXNfYWN0aXZlX2Jvb2xfbWVyZ2VANQoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkgLT4gdm9pZDoKX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjcKICAgIC8vIGFzc2VydCBzZWxmLl9pc19hcnJhbmdlcihUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU0CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzID09IHNlbGYuYXJyYW5nZXIudmFsdWUKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18xIC8vIDB4NTIzYTQxNTI1MjIzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJyYW5nZXIgZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjY3CiAgICAvLyBhc3NlcnQgc2VsZi5faXNfYXJyYW5nZXIoVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9pc19ub3RfY29udHJhY3RfZGVmYXVsdGVkKCkgLT4gdm9pZDoKX2Fzc2VydF9pc19ub3RfY29udHJhY3RfZGVmYXVsdGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg1CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuZGVmYXVsdGVkLCBlcnIuREVGQVVMVEVECiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgNyAvLyAiZGVmYXVsdGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRlZmF1bHRlZCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBEZWZhdWx0ZWQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkOiB1aW50NjQpIC0+IHZvaWQ6Cl9hc3NlcnRfdmFsaWRfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MAogICAgLy8gZGVmIF9hc3NlcnRfdmFsaWRfcm9sZShzZWxmLCByb2xlX2lkOiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MS05OQogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTIKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIGludGNfMyAvLyAyMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkxLTk5CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTMKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICBwdXNoaW50IDI1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEtOTkKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NAogICAgLy8gVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIHB1c2hpbnQgNDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MS05OQogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojk1CiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICBwdXNoaW50IDUwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEtOTkKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NgogICAgLy8gVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICBwdXNoaW50IDYwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEtOTkKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NwogICAgLy8gVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIHB1c2hpbnQgNzAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MS05OQogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojk4CiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICBwdXNoaW50IDgwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEtOTkKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBieiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9mYWxzZUA4CgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDc6CiAgICBpbnRjXzAgLy8gMQoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfbWVyZ2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MS05OQogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICByZXRzdWIKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX2ZhbHNlQDg6CiAgICBpbnRjXzEgLy8gMAogICAgYiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9tZXJnZUA5Cg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="}, "sourceInfo": {"approval": {"pcOffsetMethod": "none", "sourceInfo": [{"pc": [968], "errorMessage": "Defaulted"}, {"pc": [364, 388, 411, 434, 458, 514, 542, 563, 584, 606, 812, 829, 843, 858, 873], "errorMessage": "Invalid account role address"}, {"pc": [498, 802, 1029], "errorMessage": "Invalid role identifier"}, {"pc": [628, 658, 960], "errorMessage": "Not authorized"}, {"pc": [920, 935], "errorMessage": "check BoxMap entry exists"}, {"pc": [675, 958], "errorMessage": "check self.arranger exists"}, {"pc": [966], "errorMessage": "check self.defaulted exists"}, {"pc": [619, 649], "errorMessage": "invalid number of bytes for arc4.bool"}, {"pc": [248, 271, 305, 482, 689, 772], "errorMessage": "invalid number of bytes for arc4.static_array"}, {"pc": [295, 472, 762], "errorMessage": "invalid number of bytes for arc4.uint8"}, {"pc": [316], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.RoleValidity"}]}, "clear": {"pcOffsetMethod": "none", "sourceInfo": []}}, "templateVariables": {}}""" APP_SPEC = algokit_utils.Arc56Contract.from_json(_APP_SPEC_JSON) def _parse_abi_args(args: object | None = None) -> list[object] | None: diff --git a/src/artifacts/DASA.arc56.json b/src/artifacts/DASA.arc56.json index 1e4a30bb..6e75ef13 100644 --- a/src/artifacts/DASA.arc56.json +++ b/src/artifacts/DASA.arc56.json @@ -2342,7 +2342,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCAzMiAxNTAwCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUgInN0YXR1cyIgImV2ZW50X2N1cnNvciIgInNjaGVkdWxlX2VudHJ5X2NvdW50IiAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIiAiZml4ZWRfcG9pbnRfc2NhbGUiICJhY2NydWVkX2ludGVyZXN0IiAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIgMHg0MTIzICJub21pbmFsX2ludGVyZXN0X3JhdGUiICJjb250cmFjdF90eXBlIiAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiICJyZXNlcnZlZF9wcmluY2lwYWwiICJ0b3RhbF91bml0cyIgIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iICJyZXNlcnZlZF9pbnRlcmVzdCIgImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIgMHg1MjNhNDE1MjUyMjMgInNldHRsZW1lbnRfYXNzZXRfaWQiICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIgMHg1MjNhNDE1NTU0MjMgMHg1MjNhNTA1OTQ0MjMgMHg1MjNhNGQ0ZTQ3MjMgMHg1MzIzIDB4NTIzYTRkNGY0MzIzIDB4NTIzYTU0NTI1MzIzIDB4NTIzYTRmNTA0NDIzICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiICJ0cmFuc2Zlcl9vcGVuaW5nX2RhdGUiICJ0cmFuc2Zlcl9jbG9zdXJlX2RhdGUiICJyYXRlX3Jlc2V0X2Zsb29yIiAicmF0ZV9yZXNldF9jYXAiICJjb250cmFjdF9zdXNwZW5kZWQiICJkZWZhdWx0ZWQiICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIiAicmF0ZV9yZXNldF9zcHJlYWQiICJyYXRlX3Jlc2V0X211bHRpcGxpZXIiICJyYXRlX3Jlc2V0X25leHQiICJoYXNfcmF0ZV9yZXNldF9mbG9vciIgImhhc19yYXRlX3Jlc2V0X2NhcCIgMHgwMCAicHJvc3BlY3R1c19oYXNoIiAicHJvc3BlY3R1c191cmwiICJkZW5vbWluYXRpb25fYXNzZXRfaWQiICJtYXR1cml0eV9kYXRlIiAiZGF5X2NvdW50X2NvbnZlbnRpb24iIDB4MDY4MTAxIDB4MDAwMAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4LTI5CiAgICAvLyAjIFJCQUMgUm9sZXMKICAgIC8vIHNlbGYuYXJyYW5nZXIgPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX0FSUkFOR0VSKQogICAgYnl0ZWMgMTggLy8gMHg1MjNhNDE1MjUyMjMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMAogICAgLy8gc2VsZi5vcF9kYWVtb24gPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX09QX0RBRU1PTikKICAgIGJ5dGVjIDI3IC8vIDB4NTIzYTRmNTA0NDIzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NDctNDgKICAgIC8vICMgQ29udHJhY3QgR292ZXJuYW5jZQogICAgLy8gc2VsZi5jb250cmFjdF9zdXNwZW5kZWQgPSBGYWxzZQogICAgYnl0ZWMgMzMgLy8gImNvbnRyYWN0X3N1c3BlbmRlZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjUwLTUxCiAgICAvLyAjIENvbnRyYWN0IFBlcmZvcm1hbmNlCiAgICAvLyBzZWxmLmRlZmF1bHRlZCA9IEZhbHNlCiAgICBieXRlYyAzNCAvLyAiZGVmYXVsdGVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1Ni01NwogICAgLy8gIyBDb250cmFjdAogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKQogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OAogICAgLy8gc2VsZi5jb250cmFjdF90eXBlID0gVUludDY0KCkKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MC02MQogICAgLy8gIyBQcm9zcGVjdHVzIChJbmZvcm1hdGlvbmFsKQogICAgLy8gc2VsZi5wcm9zcGVjdHVzX2hhc2ggPSBCeXRlcygpCiAgICBieXRlYyA0MiAvLyAicHJvc3BlY3R1c19oYXNoIgogICAgcHVzaGJ5dGVzIDB4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjIKICAgIC8vIHNlbGYucHJvc3BlY3R1c191cmwgPSBTdHJpbmcoKQogICAgYnl0ZWMgNDMgLy8gInByb3NwZWN0dXNfdXJsIgogICAgcHVzaGJ5dGVzICIiCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjQtNjUKICAgIC8vICMgRGVub21pbmF0aW9uCiAgICAvLyBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCA9IEFzc2V0KCkKICAgIGJ5dGVjIDQ0IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBBc3NldCgpCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjgtNjkKICAgIC8vICMgVGltZQogICAgLy8gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGUgPSB0eXAuVGltZVN0YW1wKCkKICAgIGJ5dGVjIDI4IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcwCiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSB0eXAuVGltZVN0YW1wKCkKICAgIGJ5dGVjIDQ1IC8vICJtYXR1cml0eV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MQogICAgLy8gc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgPSB0eXAuVGltZVN0YW1wKCkKICAgIGJ5dGVjIDI5IC8vICJ0cmFuc2Zlcl9vcGVuaW5nX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcyCiAgICAvLyBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgMzAgLy8gInRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzQtNzUKICAgIC8vICMgRGF5IENvdW50IENvbnZlbnRpb24KICAgIC8vIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPSBVSW50NjQoKQogICAgYnl0ZWMgNDYgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3Ny03OAogICAgLy8gIyBVbml0cwogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IFVJbnQ2NCgpCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc5CiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID0gVUludDY0KCkKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODEtODIKICAgIC8vICMgUHJpbmNpcGFsCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID0gVUludDY0KCkKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODMKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gVUludDY0KCkKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODUKICAgIC8vIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiA9IEZhbHNlCiAgICBieXRlYyAzNSAvLyAiZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODctODgKICAgIC8vICMgSW50ZXJlc3QKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OQogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ID0gVUludDY0KCkKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkxLTkyCiAgICAvLyAjIEludGVyZXN0IFJhdGVzCiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzCiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkID0gVUludDY0KCkKICAgIGJ5dGVjIDM2IC8vICJyYXRlX3Jlc2V0X3NwcmVhZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9tdWx0aXBsaWVyID0gVUludDY0KCkKICAgIGJ5dGVjIDM3IC8vICJyYXRlX3Jlc2V0X211bHRpcGxpZXIiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfZmxvb3IgPSBVSW50NjQoKQogICAgYnl0ZWMgMzEgLy8gInJhdGVfcmVzZXRfZmxvb3IiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfY2FwID0gVUludDY0KCkKICAgIGJ5dGVjIDMyIC8vICJyYXRlX3Jlc2V0X2NhcCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTcKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9uZXh0ID0gVUludDY0KCkKICAgIGJ5dGVjIDM4IC8vICJyYXRlX3Jlc2V0X25leHQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4CiAgICAvLyBzZWxmLmhhc19yYXRlX3Jlc2V0X2Zsb29yID0gRmFsc2UKICAgIGJ5dGVjIDM5IC8vICJoYXNfcmF0ZV9yZXNldF9mbG9vciIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTkKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwID0gRmFsc2UKICAgIGJ5dGVjIDQwIC8vICJoYXNfcmF0ZV9yZXNldF9jYXAiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMS0xMDIKICAgIC8vICMgUHJpbWFyeSBEaXN0cmlidXRpb24KICAgIC8vIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsID0gVUludDY0KCkKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMwogICAgLy8gc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNS0xMDYKICAgIC8vICMgQ3VtdWxhdGl2ZSBQZXItVW5pdCBGaXhlZC1Qb2ludCBJbmRleGVzCiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggPSBVSW50NjQoKQogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNwogICAgLy8gc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNQogICAgLy8gc2VsZi5ldmVudF9jdXJzb3IgPSBVSW50NjQoKQogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTYKICAgIC8vIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgPSBVSW50NjQoKQogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExOC0xMTkKICAgIC8vICMgU2NhbGluZwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjIzCiAgICAvLyBhc3NlcnQgVHhuLmdsb2JhbF9udW1fYnl0ZV9zbGljZSA9PSBjZmcuR0xPQkFMX0JZVEVTLCBlcnIuV1JPTkdfR0xPQkFMX0JZVEVTCiAgICB0eG4gR2xvYmFsTnVtQnl0ZVNsaWNlCiAgICBwdXNoaW50IDEwCiAgICA9PQogICAgYXNzZXJ0IC8vIFdyb25nIEdsb2JhbCBCeXRlcyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6MjQKICAgIC8vIGFzc2VydCBUeG4uZ2xvYmFsX251bV91aW50ID09IGNmZy5HTE9CQUxfVUlOVFMsIGVyci5XUk9OR19HTE9CQUxfVUlOVFMKICAgIHR4biBHbG9iYWxOdW1VaW50CiAgICBwdXNoaW50IDU0CiAgICA9PQogICAgYXNzZXJ0IC8vIFdyb25nIEdsb2JhbCBVSW50cyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6MjUKICAgIC8vIGFzc2VydCBUeG4ubG9jYWxfbnVtX2J5dGVfc2xpY2UgPT0gY2ZnLkxPQ0FMX0JZVEVTLCBlcnIuV1JPTkdfTE9DQUxfQllURVMKICAgIHR4biBMb2NhbE51bUJ5dGVTbGljZQogICAgIQogICAgYXNzZXJ0IC8vIFdyb25nIExvY2FsIEJ5dGVzIGFsbG9jYXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kX2FzYS9jb250cmFjdC5weToyNgogICAgLy8gYXNzZXJ0IFR4bi5sb2NhbF9udW1fdWludCA9PSBjZmcuTE9DQUxfVUlOVFMsIGVyci5XUk9OR19MT0NBTF9VSU5UUwogICAgdHhuIExvY2FsTnVtVWludAogICAgIQogICAgYXNzZXJ0IC8vIFdyb25nIExvY2FsIFVJbnRzIGFsbG9jYXRpb24KCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjgtMTgKICAgIC8vIGNsYXNzIERBU0EoCiAgICAvLyAgICAgUGF5bWVudEFnZW50LAogICAgLy8gICAgIFRyYW5zZmVyQWdlbnQsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyAgICAgYXZtX3ZlcnNpb249MTIsCiAgICAvLyApOgogICAgcHVzaGJ5dGVzIDB4OTE0ZjA0ZWIgLy8gbWV0aG9kICJjb250cmFjdF91cGRhdGUoKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX2NvbnRyYWN0X3VwZGF0ZV9yb3V0ZUA0CgptYWluX3N3aXRjaF9jYXNlX25leHRANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kX2FzYS9jb250cmFjdC5weTo4LTE4CiAgICAvLyBjbGFzcyBEQVNBKAogICAgLy8gICAgIFBheW1lbnRBZ2VudCwKICAgIC8vICAgICBUcmFuc2ZlckFnZW50LAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gICAgIGF2bV92ZXJzaW9uPTEyLAogICAgLy8gKToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJ6IG1haW5fY3JlYXRlX05vT3BAMzMKICAgIHB1c2hieXRlc3MgMHhiNDQ2MThjOCAweGU3ODMyNTI5IDB4OTQzODg3MjMgMHg2Yzg1ZTNlZSAweGJkZDFhOTQ0IDB4N2MwZjE4MTIgMHgxNGZjMTBlZiAweDc0YTcyOTdmIDB4MDlkNGZlMTQgMHg5YTliZmE4NSAweDg1ZWVkMzNkIDB4YWIyYzBmYzQgMHhkOWYyMjVhYyAweDk4ODM1MDVhIDB4OGVhNmU3NGMgMHgwMmFmNTU3YSAweDgyZjcxYjJkIDB4ZWYwNGY1ZDMgMHhkZjM0MzU1MCAweDNkYmU4MGJkIDB4MWUzZTQ4ZTcgMHgzOTI0MWZhMyAweDAxMGM4Mjk5IDB4NzQwNmFjZDIgMHgxYTcyYTJlZSAvLyBtZXRob2QgImZ1bmRfZHVlX2Nhc2hmbG93cyh1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJjbGFpbV9kdWVfY2FzaGZsb3dzKGFkZHJlc3MsYnl0ZVtdKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYnl0ZVtdKSIsIG1ldGhvZCAidHJhbnNmZXJfc2V0X3NjaGVkdWxlKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbihhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInRyYW5zZmVyKGFkZHJlc3MsYWRkcmVzcyx1aW50NjQpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X3N1c3BlbnNpb24oYWRkcmVzcyxib29sKXVpbnQ2NCIsIG1ldGhvZCAiYWNjb3VudF9vcGVuKGFkZHJlc3MsYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgImFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzcyhhZGRyZXNzLGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X2dldF9wb3NpdGlvbihhZGRyZXNzKShhZGRyZXNzLHVpbnQ2NCx1aW50NjQsYm9vbCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAiY29udHJhY3RfY29uZmlnKCh1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxib29sLGJvb2wsYm9vbCx1aW50NjQpLCh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCksKGJ5dGVbMzJdLHN0cmluZykpdWludDY0IiwgbWV0aG9kICJjb250cmFjdF9zY2hlZHVsZSh1aW50NjQsYm9vbCwodWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NClbXSl1aW50NjQiLCBtZXRob2QgImNvbnRyYWN0X2V4ZWN1dGVfaWVkKCl1aW50NjQiLCBtZXRob2QgImFwcGx5X25vbl9jYXNoX2V2ZW50KHVpbnQ2NCwodWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIsIG1ldGhvZCAiYXBwZW5kX29ic2VydmVkX2Nhc2hfZXZlbnQoKHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIsIG1ldGhvZCAiY29udHJhY3RfZ2V0X3N0YXRlKCkodWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudCgpKHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJyYmFjX3JvdGF0ZV9hcnJhbmdlcihhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19zZXRfb3BfZGFlbW9uKGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX2Fzc2lnbl9yb2xlKHVpbnQ4LGFkZHJlc3MsKHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19yZXZva2Vfcm9sZSh1aW50OCxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19jb250cmFjdF9zdXNwZW5zaW9uKGJvb2wpdWludDY0IiwgbWV0aG9kICJyYmFjX2NvbnRyYWN0X2RlZmF1bHQoYm9vbCl1aW50NjQiLCBtZXRob2QgInJiYWNfZ2V0X2FycmFuZ2VyKClhZGRyZXNzIiwgbWV0aG9kICJyYmFjX2dldF9hZGRyZXNzX3JvbGVzKGFkZHJlc3MpKGJvb2wsYm9vbCxib29sLGJvb2wsYm9vbCkiLCBtZXRob2QgInJiYWNfZ2V0X3JvbGVfdmFsaWRpdHkodWludDgsYWRkcmVzcykodWludDY0LHVpbnQ2NCkiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBmdW5kX2R1ZV9jYXNoZmxvd3MgY2xhaW1fZHVlX2Nhc2hmbG93cyB0cmFuc2Zlcl9zZXRfc2NoZWR1bGUgcHJpbWFyeV9kaXN0cmlidXRpb24gdHJhbnNmZXIgYWNjb3VudF9zdXNwZW5zaW9uIGFjY291bnRfb3BlbiBhY2NvdW50X3VwZGF0ZV9wYXltZW50X2FkZHJlc3MgYWNjb3VudF9nZXRfcG9zaXRpb24gY29udHJhY3RfY29uZmlnIGNvbnRyYWN0X3NjaGVkdWxlIGNvbnRyYWN0X2V4ZWN1dGVfaWVkIGFwcGx5X25vbl9jYXNoX2V2ZW50IGFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50IGNvbnRyYWN0X2dldF9zdGF0ZSBjb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnQgcmJhY19yb3RhdGVfYXJyYW5nZXIgcmJhY19zZXRfb3BfZGFlbW9uIHJiYWNfYXNzaWduX3JvbGUgcmJhY19yZXZva2Vfcm9sZSByYmFjX2NvbnRyYWN0X3N1c3BlbnNpb24gcmJhY19jb250cmFjdF9kZWZhdWx0IHJiYWNfZ2V0X2FycmFuZ2VyIHJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXMgcmJhY19nZXRfcm9sZV92YWxpZGl0eQogICAgZXJyCgptYWluX2NyZWF0ZV9Ob09wQDMzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjgtMTgKICAgIC8vIGNsYXNzIERBU0EoCiAgICAvLyAgICAgUGF5bWVudEFnZW50LAogICAgLy8gICAgIFRyYW5zZmVyQWdlbnQsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyAgICAgYXZtX3ZlcnNpb249MTIsCiAgICAvLyApOgogICAgcHVzaGJ5dGVzIDB4OTU2ZDcxNTYgLy8gbWV0aG9kICJjb250cmFjdF9jcmVhdGUoYWRkcmVzcyl1aW50NjQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBjb250cmFjdF9jcmVhdGUKICAgIGVycgoKbWFpbl9jb250cmFjdF91cGRhdGVfcm91dGVANDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgNCAvLyBVcGRhdGVBcHBsaWNhdGlvbgogICAgPT0KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0CiAgICBiIGNvbnRyYWN0X3VwZGF0ZQoKCi8vIF9wdXlhX2xpYi51dGlsLmVuc3VyZV9idWRnZXQocmVxdWlyZWRfYnVkZ2V0OiB1aW50NjQsIGZlZV9zb3VyY2U6IHVpbnQ2NCkgLT4gdm9pZDoKZW5zdXJlX2J1ZGdldDoKICAgIHByb3RvIDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDEwCiAgICArCgplbnN1cmVfYnVkZ2V0X3doaWxlX3RvcEAxOgogICAgZnJhbWVfZGlnIDAKICAgIGdsb2JhbCBPcGNvZGVCdWRnZXQKICAgID4KICAgIGJ6IGVuc3VyZV9idWRnZXRfYWZ0ZXJfd2hpbGVANgogICAgaXR4bl9iZWdpbgogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGJ5dGVjIDQ3IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbQogICAgYnl0ZWMgNDcgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KICAgIGZyYW1lX2RpZyAtMQogICAgc3dpdGNoIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMEAzIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMUA0CgplbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX25leHRANToKICAgIGl0eG5fc3VibWl0CiAgICBiIGVuc3VyZV9idWRnZXRfd2hpbGVfdG9wQDEKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMUA0OgogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgaXR4bl9maWVsZCBGZWUKICAgIGIgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV9uZXh0QDUKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMEAzOgogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBiIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfbmV4dEA1CgplbnN1cmVfYnVkZ2V0X2FmdGVyX3doaWxlQDY6CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnBheW1lbnRfYWdlbnQuUGF5bWVudEFnZW50LmZ1bmRfZHVlX2Nhc2hmbG93c1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmZ1bmRfZHVlX2Nhc2hmbG93czoKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gMTMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjY4CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2OQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3MAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDcKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzIKICAgIC8vIGlmIHNlbGYuX2lzX2R5bmFtaWNfYW5udWl0eSgpOgogICAgY2FsbHN1YiBfaXNfZHluYW1pY19hbm51aXR5CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzYtNzcKICAgIC8vICsgbWF4X2V2ZW50X2NvdW50CiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfRlVORF9EVUVfQ0FTSEZMT1dTX1BFUl9FVkVOVF9CVURHRVQpCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3NwogICAgLy8gKiBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19QRVJfRVZFTlRfQlVER0VUKQogICAgcHVzaGludCAxMDAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3Ni03NwogICAgLy8gKyBtYXhfZXZlbnRfY291bnQKICAgIC8vICogVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfUEVSX0VWRU5UX0JVREdFVCkKICAgICoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3NQogICAgLy8gVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfQkFTRV9CVURHRVQpCiAgICBpbnRjIDQgLy8gMTUwMAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojc1LTc3CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19CQVNFX0JVREdFVCkKICAgIC8vICsgbWF4X2V2ZW50X2NvdW50CiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfRlVORF9EVUVfQ0FTSEZMT1dTX1BFUl9FVkVOVF9CVURHRVQpCiAgICArCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzMtNzkKICAgIC8vIGVuc3VyZV9idWRnZXQoCiAgICAvLyAgICAgcmVxdWlyZWRfYnVkZ2V0PSgKICAgIC8vICAgICAgICAgVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfQkFTRV9CVURHRVQpCiAgICAvLyAgICAgICAgICsgbWF4X2V2ZW50X2NvdW50CiAgICAvLyAgICAgICAgICogVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfUEVSX0VWRU5UX0JVREdFVCkKICAgIC8vICAgICApLAogICAgLy8gKQogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4MQogICAgLy8gcHJvY2Vzc2VkX2V2ZW50cyA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjgyCiAgICAvLyBmdW5kZWRfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDE0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODMKICAgIC8vIGZ1bmRlZF9wcmluY2lwYWwgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDEzCgpmdW5kX2R1ZV9jYXNoZmxvd3Nfd2hpbGVfdG9wQDQ6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODYKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgPCBtYXhfZXZlbnRfY291bnQKICAgIGRpZyA0CiAgICBkaWcgMQogICAgPAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojg2LTg3CiAgICAvLyBwcm9jZXNzZWRfZXZlbnRzIDwgbWF4X2V2ZW50X2NvdW50CiAgICAvLyBhbmQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAMTEKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4NwogICAgLy8gYW5kIHNlbGYuZXZlbnRfY3Vyc29yIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICA8CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODYtODcKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgPCBtYXhfZXZlbnRfY291bnQKICAgIC8vIGFuZCBzZWxmLmV2ZW50X2N1cnNvciA8IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQKICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl93aGlsZUAxMQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojg5CiAgICAvLyBlbnRyeSA9IHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLmV2ZW50X2N1cnNvcikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICBkdXAKICAgIGJ1cnkgMTcKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5MAogICAgLy8gaWYgZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcDoKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSAzCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDExCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6OTIKICAgIC8vIGlmIG5vdCBzZWxmLl9ldmVudF9pc19jYXNoKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkpOgogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBidXJ5IDE2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNTEKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgaW50Y18yIC8vIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM1MC0zNTQKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX01EKSwKICAgIC8vICkKICAgID09CiAgICBkdXAKICAgIGJ1cnkgNAogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX3RydWVANTIKICAgIGRpZyAxNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzUyCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzUwLTM1NAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfTUQpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDUyCiAgICBkaWcgMTQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM1MwogICAgLy8gVUludDY0KGVudW1zLkVWVF9NRCksCiAgICBwdXNoaW50IDE5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNTAtMzU0CiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9NRCksCiAgICAvLyApCiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VANTMKCmZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX3RydWVANTI6CiAgICBpbnRjXzEgLy8gMQoKZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfbWVyZ2VANTQ6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6OTIKICAgIC8vIGlmIG5vdCBzZWxmLl9ldmVudF9pc19jYXNoKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkpOgogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NDgKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF9pZCA9PSBzZWxmLmV2ZW50X2N1cnNvciwgZXJyLklOVkFMSURfRVZFTlRfQ1VSU09SCiAgICBkaWcgMTUKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgY3Vyc29yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NDkKICAgIC8vIGFzc2VydCBlbnRyeS5zY2hlZHVsZWRfdGltZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwgZXJyLk5PX0RVRV9DQVNIRkxPVwogICAgZGlnIDEKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIDw9CiAgICBhc3NlcnQgLy8gTm8gZHVlIGNhc2hmbG93IHRvIHBheQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDEzCiAgICAvLyBpZiBldmVudF90eXBlIG5vdCBpbiAoVUludDY0KGVudW1zLkVWVF9JUCksIFVJbnQ2NChlbnVtcy5FVlRfTUQpKToKICAgIGRpZyAyCiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTUKICAgIGRpZyAxNAogICAgcHVzaGludCAxOQogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDE0CiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAxMQoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X2ludGVyZXN0X2Ftb3VudEAxNjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQyNgogICAgLy8gZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGRpZyAxNQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSAxNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDI3CiAgICAvLyBpZiBldmVudF90eXBlIG5vdCBpbiAoVUludDY0KGVudW1zLkVWVF9QUiksIFVJbnQ2NChlbnVtcy5FVlRfTUQpKToKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxOQogICAgZGlnIDE0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MjgKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDYKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTUzCiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA9IGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBkaWcgMTUKICAgIHB1c2hpbnQgNDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBidXJ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1NgogICAgLy8gaWYgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCk6CiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUAyOQogICAgZGlnIDcKICAgIGJ1cnkgOQoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzItNTc0CiAgICAvLyAjIEZ1bmRpbmcgdXNlcyBwZXItdW5pdCBjdW11bGF0aXZlIGluZGljZXMgc28gZWFjaCBob2xkZXIgY2FuIHNldHRsZQogICAgLy8gIyBpbmRlcGVuZGVudGx5IGZyb20gaXRzIGN1cnJlbnQgdW5pdCBiYWxhbmNlLgogICAgLy8gaW50ZXJlc3RfaW5kZXhfZGVsdGEgPSBzZWxmLl9hbW91bnRfdG9faW5kZXhfZGVsdGEoaW50ZXJlc3RfYW1vdW50X2R1ZSkKICAgIGRpZyAxMAogICAgY2FsbHN1YiBfYW1vdW50X3RvX2luZGV4X2RlbHRhCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzUKICAgIC8vIHByaW5jaXBhbF9pbmRleF9kZWx0YSA9IHNlbGYuX2Ftb3VudF90b19pbmRleF9kZWx0YShwcmluY2lwYWxfYW1vdW50X2R1ZSkKICAgIGRpZyA2CiAgICBjYWxsc3ViIF9hbW91bnRfdG9faW5kZXhfZGVsdGEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU3NgogICAgLy8gaW50ZXJlc3RfYW1vdW50ID0gc2VsZi5faW5kZXhfZGVsdGFfdG9fYW1vdW50KGludGVyZXN0X2luZGV4X2RlbHRhKQogICAgZGlnIDEKICAgIGNhbGxzdWIgX2luZGV4X2RlbHRhX3RvX2Ftb3VudAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBidXJ5IDE1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzcKICAgIC8vIHByaW5jaXBhbF9hbW91bnQgPSBzZWxmLl9pbmRleF9kZWx0YV90b19hbW91bnQocHJpbmNpcGFsX2luZGV4X2RlbHRhKQogICAgZHVwCiAgICBjYWxsc3ViIF9pbmRleF9kZWx0YV90b19hbW91bnQKICAgIGR1cAogICAgYnVyeSAxMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTc4CiAgICAvLyByZXF1aXJlZF9hbW91bnQgPSBpbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50CiAgICBkaWcgMgogICAgZGlnIDEKICAgICsKICAgIGR1cAogICAgYnVyeSA5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MzQKICAgIC8vIGJhbGFuY2UgPSBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBvcHRlZCBpbnRvIGFzc2V0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NTYKICAgIC8vIHJldHVybiBzZWxmLnJlc2VydmVkX2ludGVyZXN0ICsgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICBkaWcgMQogICAgKwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzM2CiAgICAvLyBhc3NlcnQgYmFsYW5jZSA+PSByZXNlcnZlZF90b3RhbCwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGRpZyAyCiAgICBkaWcgMQogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzM3CiAgICAvLyByZXR1cm4gYmFsYW5jZSAtIHJlc2VydmVkX3RvdGFsCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIC0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4MAogICAgLy8gc2VsZi5fYXZhaWxhYmxlX3NldHRsZW1lbnRfZnVuZHMoKSA+PSByZXF1aXJlZF9hbW91bnQKICAgIHVuY292ZXIgMgogICAgPj0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU3OS01ODEKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5fYXZhaWxhYmxlX3NldHRsZW1lbnRfZnVuZHMoKSA+PSByZXF1aXJlZF9hbW91bnQKICAgIC8vICksIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcyBmb3IgdGhlIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4MwogICAgLy8gc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCArPSBpbnRlcmVzdF9hbW91bnQKICAgIHVuY292ZXIgMwogICAgKwogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4NAogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgKz0gcHJpbmNpcGFsX2Ftb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIGV4aXN0cwogICAgKwogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1ODUKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCArPSBpbnRlcmVzdF9pbmRleF9kZWx0YQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggZXhpc3RzCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4NgogICAgLy8gc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCArPSBwcmluY2lwYWxfaW5kZXhfZGVsdGEKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggZXhpc3RzCiAgICArCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTg3CiAgICAvLyBpZiBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpOgogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgcHVzaGludCAzCiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUA0MAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTg4LTU4OQogICAgLy8gIyBGb3IgUFIsIHRoZSBwZXJpb2QgaW50ZXJlc3Qgc3RheXMgYWNjcnVlZCB1bnRpbCBhIGxhdGVyIElQIG9yIE1ELgogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ICs9IHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZGlnIDE2CiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBidXJ5IDE4CiAgICArCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQxOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTkyCiAgICAvLyBpZiBub3Qgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCkgb3IgZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSA9PSBVSW50NjQoCiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDQzCiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTItNTk0CiAgICAvLyBpZiBub3Qgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCkgb3IgZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSA9PSBVSW50NjQoCiAgICAvLyAgICAgZW51bXMuRVZUX01ECiAgICAvLyApOgogICAgcHVzaGludCAxOQogICAgPT0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQ0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUA0MzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5NQogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gZW50cnkubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZGlnIDE1CiAgICBwdXNoaW50IDQxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTYKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGRpZyA4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTk3CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBuZXh0X2ludGVyZXN0X2Jhc2UKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBkaWcgOQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5OAogICAgLy8gc2VsZi5ldmVudF9jdXJzb3IgKz0gVUludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAwCiAgICAvLyBpZiBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoCiAgICBkaWcgMTUKICAgIGV4dHJhY3QgOCAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MDAtNjAyCiAgICAvLyBpZiBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoCiAgICAvLyAgICAgZW51bXMuRVZUX01ECiAgICAvLyApIGFuZCBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9PSBVSW50NjQoMCk6CiAgICBwdXNoYnl0ZXMgMHgxMwogICAgYj09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0NwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAyCiAgICAvLyApIGFuZCBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9PSBVSW50NjQoMCk6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwMC02MDIKICAgIC8vIGlmIGVudHJ5LmV2ZW50X3R5cGUgPT0gYXJjNC5VSW50OCgKICAgIC8vICAgICBlbnVtcy5FVlRfTUQKICAgIC8vICkgYW5kIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID09IFVJbnQ2NCgwKToKICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0NwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAzCiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbnVtcy5TVEFUVVNfRU5ERUQpCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBwdXNoaW50IDIwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwNAogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gVUludDY0KDApCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0NzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwNi02MTAKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1pbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50LAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PWludGVyZXN0X2Ftb3VudCArIHByaW5jaXBhbF9hbW91bnQsCiAgICAvLyApCiAgICBkaWcgMTUKICAgIGRpZyA0CiAgICBkdXAKICAgIGNhbGxzdWIgX2VtaXRfZXhlY3V0aW9uX2V2ZW50CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5NgogICAgLy8gZnVuZGVkX2ludGVyZXN0ICs9IGludGVyZXN0X2Ftb3VudAogICAgZGlnIDEzCiAgICBkaWcgMTIKICAgICsKICAgIGJ1cnkgMTQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5NwogICAgLy8gZnVuZGVkX3ByaW5jaXBhbCArPSBwcmluY2lwYWxfYW1vdW50CiAgICBkaWcgMTIKICAgIGRpZyA3CiAgICArCiAgICBidXJ5IDEzCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6OTgKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgKz0gVUludDY0KDEpCiAgICBkaWcgNAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgNQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3Nfd2hpbGVfdG9wQDQKCmZ1bmRfZHVlX2Nhc2hmbG93c19lbHNlX2JvZHlANDA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTEKICAgIC8vIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0MQoKZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlAMjk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTcKICAgIC8vIGV2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ1cnkgMTYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1OC01NjAKICAgIC8vICMgRHluYW1pYyBhbm51aXRpZXMgZGVyaXZlIG5leHQgc3RhdGUgZnJvbSB0aGUgcGF5bWVudCBkZWNvbXBvc2l0aW9uLAogICAgLy8gIyBub3Qgb25seSBmcm9tIHRoZSBwcmVjb21wdXRlZCBgbmV4dF8qYCBmaWVsZHMuCiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpOgogICAgcHVzaGludCAzCiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUAzMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTYyCiAgICAvLyBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCAtIHByaW5jaXBhbF9hbW91bnRfZHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGRpZyA2CiAgICAtCiAgICBkdXAKICAgIGJ1cnkgOQogICAgYnVyeSA5CiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDMxOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY1CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9JUCk6CiAgICBkaWcgMTQKICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUAzMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY2CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGJ1cnkgOQogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY3CiAgICAvLyBuZXh0X2ludGVyZXN0X2Jhc2UgPSBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGJ1cnkgMTAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgZXhpc3RzCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDMzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY4CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCk6CiAgICBkaWcgMTQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlAMzQKICAgIGRpZyA3CiAgICBidXJ5IDkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzgKCmZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDM0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY5CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTcwCiAgICAvLyBuZXh0X2ludGVyZXN0X2Jhc2UgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzgKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDI5CiAgICAvLyBpZiBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKToKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzMAogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKToKICAgIGRpZyAxNAogICAgcHVzaGludCAxOQogICAgPT0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDIyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzEKICAgIC8vIHJldHVybiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzIKICAgIC8vIGludGVyZXN0X2R1ZSA9IHNlbGYuYWNjcnVlZF9pbnRlcmVzdCArIHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZGlnIDE2CiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBidXJ5IDE4CiAgICArCiAgICBkdXAKICAgIGJ1cnkgMTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzMwogICAgLy8gaWYgc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIDw9IGludGVyZXN0X2R1ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIGV4aXN0cwogICAgPj0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDI0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzQKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzUKICAgIC8vIHByaW5jaXBhbF9hbW91bnQgPSBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gLSBpbnRlcmVzdF9kdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIGV4aXN0cwogICAgZGlnIDEwCiAgICAtCiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDM2CiAgICAvLyBpZiBwcmluY2lwYWxfYW1vdW50ID4gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWw6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgID4KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDI2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzcKICAgIC8vIHJldHVybiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjY6CiAgICBkaWcgNgogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTIKICAgIC8vIHByaW5jaXBhbF9hbW91bnRfZHVlID0gc2VsZi5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudChlbnRyeSkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnRAMjgKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDI3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDQwCiAgICAvLyBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA8PSBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZGlnIDE1CiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBkdXAyCiAgICA8PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDM5LTQ0MQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA8PSBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NDIKICAgIC8vIHJldHVybiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCAtIGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBzd2FwCiAgICAtCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MTUKICAgIC8vIHJldHVybiBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgKyBzZWxmLl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KGVudHJ5KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgIGRpZyAxNgogICAgY2FsbHN1YiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudAogICAgYnVyeSAxOAogICAgKwogICAgYnVyeSAxMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTUxCiAgICAvLyBpbnRlcmVzdF9hbW91bnRfZHVlID0gc2VsZi5fZW50cnlfaW50ZXJlc3RfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfaW50ZXJlc3RfYW1vdW50QDE2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAMTE6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTAwCiAgICAvLyBhc3NlcnQgcHJvY2Vzc2VkX2V2ZW50cyA+IFVJbnQ2NCgwKSwgZXJyLk5PX0RVRV9DQVNIRkxPVwogICAgZGlnIDQKICAgIGR1cAogICAgYXNzZXJ0IC8vIE5vIGR1ZSBjYXNoZmxvdyB0byBwYXkKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMDQKICAgIC8vIHRvdGFsX2Z1bmRlZD1mdW5kZWRfaW50ZXJlc3QgKyBmdW5kZWRfcHJpbmNpcGFsLAogICAgZGlnIDE0CiAgICBkdXAKICAgIGRpZyAxNQogICAgZHVwCiAgICBjb3ZlciAzCiAgICArCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA2CiAgICAvLyB0aW1lc3RhbXA9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTAxLTEwNwogICAgLy8gcmV0dXJuIHR5cC5DYXNoRnVuZGluZ1Jlc3VsdCgKICAgIC8vICAgICBmdW5kZWRfaW50ZXJlc3Q9ZnVuZGVkX2ludGVyZXN0LAogICAgLy8gICAgIGZ1bmRlZF9wcmluY2lwYWw9ZnVuZGVkX3ByaW5jaXBhbCwKICAgIC8vICAgICB0b3RhbF9mdW5kZWQ9ZnVuZGVkX2ludGVyZXN0ICsgZnVuZGVkX3ByaW5jaXBhbCwKICAgIC8vICAgICBwcm9jZXNzZWRfZXZlbnRzPXByb2Nlc3NlZF9ldmVudHMsCiAgICAvLyAgICAgdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUA1MzoKICAgIGludGNfMCAvLyAwCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDU0CgoKLy8gbW9kdWxlcy5wYXltZW50X2FnZW50LlBheW1lbnRBZ2VudC5jbGFpbV9kdWVfY2FzaGZsb3dzW3JvdXRpbmddKCkgLT4gdm9pZDoKY2xhaW1fZHVlX2Nhc2hmbG93czoKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cG4gMgogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNQogICAgLy8gaWYgc2VsZi5vcF9kYWVtb24udmFsdWUgIT0gR2xvYmFsLnplcm9fYWRkcmVzczoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNyAvLyAweDUyM2E0ZjUwNDQyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wX2RhZW1vbiBleGlzdHMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE3CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjcgLy8gMHg1MjNhNGY1MDQ0MjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcF9kYWVtb24gZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE3LTE5CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIGJueiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfdHJ1ZUAxNAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE4CiAgICAvLyBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgdHhuIFNlbmRlcgogICAgZGlnIDMKICAgID09CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTctMTkKICAgIC8vIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICAvLyBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgYm56IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDE0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTkKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCAzMgogICAgPT0KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNy0xOQogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICBieiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VAMTUKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDE0OgogICAgaW50Y18xIC8vIDEKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUAxNjoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNi0yMAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyAgICAgb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vICAgICBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgLy8gKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCgpjbGFpbV9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTc6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTM5CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE0MAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDcKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTQzCiAgICAvLyBzZWxmLl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKGhvbGRpbmdfYWRkcmVzcykKICAgIGRpZyAyCiAgICBkdXAKICAgIGNhbGxzdWIgX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNDQKICAgIC8vIHNlbGYuX3NldHRsZV9wb3NpdGlvbihob2xkaW5nX2FkZHJlc3MpCiAgICBjYWxsc3ViIF9zZXR0bGVfcG9zaXRpb24KICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExNwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY2xhaW1hYmxlX2ludGVyZXN0CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBkdXAKICAgIHB1c2hpbnQgNzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExOAogICAgLy8gKyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jbGFpbWFibGVfcHJpbmNpcGFsCiAgICBkdXAKICAgIHB1c2hpbnQgODEKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExNy0xMTgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNsYWltYWJsZV9pbnRlcmVzdAogICAgLy8gKyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jbGFpbWFibGVfcHJpbmNpcGFsCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTQ2CiAgICAvLyBhc3NlcnQgdG90YWxfYW1vdW50ID4gVUludDY0KDApLCBlcnIuTk9fRFVFX0NBU0hGTE9XCiAgICBhc3NlcnQgLy8gTm8gZHVlIGNhc2hmbG93IHRvIHBheQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI1CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MuaXNfb3B0ZWRfaW4oCiAgICBleHRyYWN0IDAgMzIKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNgogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNS0yNwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLmlzX29wdGVkX2luKAogICAgLy8gICAgIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZAogICAgLy8gKQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNS0yOAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLmlzX29wdGVkX2luKAogICAgLy8gICAgIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZAogICAgLy8gKQogICAgLy8gYW5kIG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQKICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAyNAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI4CiAgICAvLyBhbmQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCAzODQKICAgIGdldGJpdAogICAgYm56IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAyNAogICAgaW50Y18xIC8vIDEKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUAyNToKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNTEKICAgIC8vIGlmIHNlbGYuX2lzX3BheW1lbnRfZXhlY3V0YWJsZShob2xkaW5nX2FkZHJlc3MpOgogICAgYnogY2xhaW1fZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozNAogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIHN3YXAKICAgIGRpZyAxCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozNC0zNQogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIC8vID49IHBheW1lbnRfYW1vdW50CiAgICBkaWcgNQogICAgZHVwCiAgICBjb3ZlciAyCiAgICA+PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjMzLTM2CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICAvLyAgICAgPj0gcGF5bWVudF9hbW91bnQKICAgIC8vICksIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcyBmb3IgdGhlIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNTMKICAgIC8vIHNlbGYuX3BheShzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MsIHRvdGFsX2Ftb3VudCkKICAgIGRpZyAyCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBkdXAKICAgIGV4dHJhY3QgMCAzMgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQwLTQ1CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9cmVjZWl2ZXIsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWFtb3VudCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQ0CiAgICAvLyBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgdW5jb3ZlciAzCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIHVuY292ZXIgMgogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0MAogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgcHVzaGludCA0IC8vIGF4ZmVyCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQwLTQ1CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9cmVjZWl2ZXIsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWFtb3VudCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMjUtMTI2CiAgICAvLyAjIEdldCB0aGUgY2xhaW1hYmxlIGFtb3VudHMgYmVmb3JlIHJlc2V0CiAgICAvLyBpbnRlcmVzdF9hbW91bnQgPSBwb3NpdGlvbi5jbGFpbWFibGVfaW50ZXJlc3QKICAgIGR1cAogICAgcHVzaGludCA3MwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSA5CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTI3CiAgICAvLyBwcmluY2lwYWxfYW1vdW50ID0gcG9zaXRpb24uY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgZHVwCiAgICBwdXNoaW50IDgxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAzCiAgICBidXJ5IDkKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMjktMTMwCiAgICAvLyAjIFJlc2V0IHRoZSBwb3NpdGlvbidzIGNsYWltYWJsZSBhbW91bnRzCiAgICAvLyBwb3NpdGlvbi5jbGFpbWFibGVfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBpdG9iCiAgICBzd2FwCiAgICBkaWcgMQogICAgcmVwbGFjZTIgNzMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzEKICAgIC8vIHBvc2l0aW9uLmNsYWltYWJsZV9wcmluY2lwYWwgPSBVSW50NjQoMCkKICAgIHN3YXAKICAgIHJlcGxhY2UyIDgxCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTMyCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHBvc2l0aW9uLmNvcHkoKQogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTM0CiAgICAvLyBhc3NlcnQgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCA+PSBpbnRlcmVzdF9hbW91bnQsIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX2ludGVyZXN0IGV4aXN0cwogICAgZHVwCiAgICBkaWcgMgogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzNQogICAgLy8gYXNzZXJ0IHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsID49IHByaW5jaXBhbF9hbW91bnQsIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICBkaWcgMwogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzNy0xMzgKICAgIC8vICMgVXBkYXRlIHRoZSBnbG9iYWwgcmVzZXJ2ZWQgaW50ZXJlc3QgYW5kIHByaW5jaXBhbCBhbW91bnRzCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0IC09IGludGVyZXN0X2Ftb3VudAogICAgc3dhcAogICAgLQogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzkKICAgIC8vIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIC09IHByaW5jaXBhbF9hbW91bnQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIHN3YXAKICAgIC0KICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKY2xhaW1fZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTU5CiAgICAvLyB0b3RhbF9hbW91bnQ9aW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudCwKICAgIGRpZyA1CiAgICBkdXAKICAgIGRpZyA2CiAgICBkdXAKICAgIGNvdmVyIDMKICAgICsKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNjAKICAgIC8vIHRpbWVzdGFtcD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNTYtMTYyCiAgICAvLyByZXR1cm4gdHlwLkNhc2hDbGFpbVJlc3VsdCgKICAgIC8vICAgICBpbnRlcmVzdF9hbW91bnQ9aW50ZXJlc3RfYW1vdW50LAogICAgLy8gICAgIHByaW5jaXBhbF9hbW91bnQ9cHJpbmNpcGFsX2Ftb3VudCwKICAgIC8vICAgICB0b3RhbF9hbW91bnQ9aW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudCwKICAgIC8vICAgICB0aW1lc3RhbXA9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgY29udGV4dD1wYXltZW50X2luZm8sCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgMgogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIHB1c2hieXRlcyAweDAwMjIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAyNDoKICAgIGludGNfMCAvLyAwCiAgICBiIGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUAyNQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX2ZhbHNlQDE1OgogICAgaW50Y18wIC8vIDAKICAgIGIgY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDE2CgoKLy8gbW9kdWxlcy50cmFuc2Zlcl9hZ2VudC5UcmFuc2ZlckFnZW50LnRyYW5zZmVyX3NldF9zY2hlZHVsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRyYW5zZmVyX3NldF9zY2hlZHVsZToKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo0MAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQxCiAgICAvLyBhc3NlcnQgb3Blbl9kYXRlIDwgY2xvc3VyZV9kYXRlLCBlcnIuSU5WQUxJRF9TT1JUSU5HCiAgICBkdXAyCiAgICA8CiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbXVzdCBiZSBzb3J0ZWQgaW4gc3RyaWN0bHkgYXNjZW5kaW5nIG9yZGVyCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQzCiAgICAvLyBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA9IG9wZW5fZGF0ZQogICAgYnl0ZWMgMjkgLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIHVuY292ZXIgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDQKICAgIC8vIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlID0gY2xvc3VyZV9kYXRlCiAgICBieXRlYyAzMCAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDUKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy50cmFuc2Zlcl9hZ2VudC5UcmFuc2ZlckFnZW50LnByaW1hcnlfZGlzdHJpYnV0aW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcHJpbWFyeV9kaXN0cmlidXRpb246CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjczCiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5wcmltYXJ5X2RlYWxlciwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDIyIC8vIDB4NTIzYTUwNTk0NDIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojc2CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo3NwogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojc4CiAgICAvLyBhc3NlcnQgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TRUQKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBjbG9zZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgY292ZXIgMwogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4MAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChob2xkaW5nX2FkZHJlc3MpCiAgICBzd2FwCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjgxCiAgICAvLyBhc3NlcnQgdW5pdHMgPiBVSW50NjQoMCksIGVyci5aRVJPX1VOSVRTCiAgICBkdXAKICAgIGFzc2VydCAvLyBDYW4gbm90IGRpc3RyaWJ1dGUgemVybyB1bml0cwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4MwogICAgLy8gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCArIHVuaXRzIDw9IHNlbGYudG90YWxfdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICArCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgPD0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODItODQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCArIHVuaXRzIDw9IHNlbGYudG90YWxfdW5pdHMKICAgIC8vICksIGVyci5PVkVSX0RJU1RSSUJVVElPTgogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCByZW1haW5pbmcgRC1BU0EgdW5pdHMKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODUKICAgIC8vIGlmIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI4IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlIGV4aXN0cwogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojg3CiAgICAvLyBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8PSBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI4IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlIGV4aXN0cwogICAgPD0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODYtODgKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPD0gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGUKICAgIC8vICksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TRUQKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBjbG9zZWQKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNDgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnJlc2VydmVkX3VuaXRzICs9IHVuaXRzCiAgICBkdXBuIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDMKICAgIGR1cAogICAgY292ZXIgMwogICAgKwogICAgaXRvYgogICAgcHVzaGludCA0MAogICAgc3dhcAogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6OTEKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgKz0gdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICArCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6OTIKICAgIC8vIHJldHVybiBzZWxmLnRvdGFsX3VuaXRzIC0gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIHN3YXAKICAgIC0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMudHJhbnNmZXJfYWdlbnQuVHJhbnNmZXJBZ2VudC50cmFuc2Zlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnRyYW5zZmVyOgogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTMwCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxMzEKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQ3CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuX3N0YXR1c19pc19wZW5kaW5nX2llZCgpLCBlcnIuUEVORElOR19JRUQKICAgICEKICAgIGFzc2VydCAvLyBJRUQgbm90IHlldCBleGVjdXRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxMwogICAgLy8gaWYgc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjkgLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICBieiB0cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTUKICAgIC8vIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjkgLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNC0xNgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gKSwgZXJyLkNMT1NFRF9UUkFOU0ZFUgogICAgYXNzZXJ0IC8vIFRyYW5zZmVyIGlzIGNsb3NlZAoKdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNwogICAgLy8gaWYgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzAgLy8gInRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICBieiB0cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTkKICAgIC8vIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDwgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGUKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMCAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIDwKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTgtMjAKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZQogICAgLy8gKSwgZXJyLkNMT1NFRF9UUkFOU0ZFUgogICAgYXNzZXJ0IC8vIFRyYW5zZmVyIGlzIGNsb3NlZAoKdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxMzUKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIGRpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA4CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIGJ5dGVjIDggLy8gMHg0MTIzCiAgICBkaWcgNQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA5CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjEzOAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChzZW5kZXJfaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDIKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTM5CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGR1cAogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNDAKICAgIC8vIGFzc2VydCBzZW5kZXJfaG9sZGluZ19hZGRyZXNzICE9IHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcywgZXJyLlNFTEZfVFJBTlNGRVIKICAgIHVuY292ZXIgMgogICAgIT0KICAgIGFzc2VydCAvLyBTZW5kZXIgYW5kIHJlY2VpdmVyIG11c3QgYmUgZGlmZmVyZW50CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE0MQogICAgLy8gYXNzZXJ0IHVuaXRzID4gVUludDY0KDApLCBlcnIuTlVMTF9UUkFOU0ZFUgogICAgZGlnIDEKICAgIGR1cAogICAgYXNzZXJ0IC8vIFRyYW5zZmVyIHVuaXRzIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTQyCiAgICAvLyBhc3NlcnQgdW5pdHMgPD0gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLCBlcnIuT1ZFUl9UUkFOU0ZFUgogICAgc3dhcAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIDw9CiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IHNlbmRlciB1bml0cyB0byB0cmFuc2ZlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzYzCiAgICAvLyBpZiBzZWxmLmV2ZW50X2N1cnNvciA+PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICA+PQogICAgYm56IHRyYW5zZmVyX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Fzc2VydF9ub19kdWVfZXZlbnRfcGVuZGluZ0AxMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzY1CiAgICAvLyBuZXh0X2VudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KHNlbGYuZXZlbnRfY3Vyc29yKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc2NwogICAgLy8gbmV4dF9lbnRyeS5zY2hlZHVsZWRfdGltZSA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NjYtNzY4CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIG5leHRfZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gKSwgZXJyLlBFTkRJTkdfQUNUVVNfRVZFTlQKICAgIGFzc2VydCAvLyBBQ1RVUyBldmVudCBub3QgeWV0IGV4ZWN1dGVkCgp0cmFuc2Zlcl9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9hc3NlcnRfbm9fZHVlX2V2ZW50X3BlbmRpbmdAMTA6CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE0NQogICAgLy8gc2VsZi5fZW5zdXJlX3VuaXRzX2FjdGl2YXRlZChzZW5kZXJfaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDMKICAgIGR1cAogICAgY2FsbHN1YiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNDYKICAgIC8vIHNlbGYuX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQocmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgY2FsbHN1YiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNDcKICAgIC8vIHNlbGYuX3NldHRsZV9wb3NpdGlvbihzZW5kZXJfaG9sZGluZ19hZGRyZXNzKQogICAgY2FsbHN1YiBfc2V0dGxlX3Bvc2l0aW9uCiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTQ4CiAgICAvLyBzZWxmLl9zZXR0bGVfcG9zaXRpb24ocmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzKQogICAgY2FsbHN1YiBfc2V0dGxlX3Bvc2l0aW9uCiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNTIKICAgIC8vIGFzc2VydCB1bml0cyA8PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cywgZXJyLk9WRVJfVFJBTlNGRVIKICAgIGRpZyA1CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkaWcgMQogICAgPD0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgc2VuZGVyIHVuaXRzIHRvIHRyYW5zZmVyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTUzCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyAtPSB1bml0cwogICAgZGlnIDEKICAgIC0KICAgIGl0b2IKICAgIHVuY292ZXIgMgogICAgaW50Y18zIC8vIDMyCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTQ0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyArPSB1bml0cwogICAgZGlnIDUKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIHVuY292ZXIgMgogICAgKwogICAgaXRvYgogICAgaW50Y18zIC8vIDMyCiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfc3VzcGVuc2lvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfc3VzcGVuc2lvbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojc5CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyMSAvLyAweDUyM2E0MTU1NTQyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE4NQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkID0gc3VzcGVuZGVkCiAgICBkdXAKICAgIHB1c2hpbnQgNDgKICAgIGludGNfMSAvLyAxCiAgICBib3hfZXh0cmFjdAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMwogICAgc2V0Yml0CiAgICBwdXNoaW50IDQ4CiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE4NgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTY1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5hY2NvdW50X29wZW5bcm91dGluZ10oKSAtPiB2b2lkOgphY2NvdW50X29wZW46CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzAKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmFjY291bnRfbWFuYWdlciwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDIzIC8vIDB4NTIzYTRkNGU0NzIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzkKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0VOREVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDIwMAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTAKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX2VuZGVkKCksIGVyci5VTkFVVEhPUklaRUQKICAgICEKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxMQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTIKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjEzCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozNAogICAgLy8gdW5pdHM9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozMi00MgogICAgLy8gcmV0dXJuIHR5cC5BY2NvdW50UG9zaXRpb24oCiAgICAvLyAgICAgcGF5bWVudF9hZGRyZXNzPXBheW1lbnRfYWRkcmVzcywKICAgIC8vICAgICB1bml0cz1VSW50NjQoMCksCiAgICAvLyAgICAgcmVzZXJ2ZWRfdW5pdHM9VUludDY0KDApLAogICAgLy8gICAgIHN1c3BlbmRlZD1GYWxzZSwKICAgIC8vICAgICBzZXR0bGVkX2N1cnNvcj1VSW50NjQoMCksCiAgICAvLyAgICAgaW50ZXJlc3RfY2hlY2twb2ludD1VSW50NjQoMCksCiAgICAvLyAgICAgcHJpbmNpcGFsX2NoZWNrcG9pbnQ9VUludDY0KDApLAogICAgLy8gICAgIGNsYWltYWJsZV9pbnRlcmVzdD1VSW50NjQoMCksCiAgICAvLyAgICAgY2xhaW1hYmxlX3ByaW5jaXBhbD1VSW50NjQoMCksCiAgICAvLyApCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGJ5dGVjIDQxIC8vIDB4MDAKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjE0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHNlbGYuX25ld19hY2NvdW50X3Bvc2l0aW9uKHBheW1lbnRfYWRkcmVzcykKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTUKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjM4CiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIHVuY292ZXIgMwogICAgPT0KICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIzOQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDAKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQxCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MgPSBwYXltZW50X2FkZHJlc3MKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQyCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfZ2V0X3Bvc2l0aW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF9nZXRfcG9zaXRpb246CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNTkKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9jcmVhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9jcmVhdGU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDE5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAzMwogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IGFycmFuZ2VyCiAgICBieXRlYyAxOCAvLyAweDUyM2E0MTUyNTIyMwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMzQKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAxOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfY29uZmlnW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfY29uZmlnOgogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBsZW4KICAgIHB1c2hpbnQgMTA3CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLk5vcm1hbGl6ZWRBY3R1c1Rlcm1zCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgcHVzaGludCA3MgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5Jbml0aWFsS2VybmVsU3RhdGUKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBsZW4KICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIHR1cGxlIGVuY29kaW5nCiAgICBkdXAKICAgIHB1c2hpbnQgMzQKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCB0YWlsIHBvaW50ZXIgYXQgaW5kZXggMSBvZiAodWludDhbMzJdLChsZW4rdXRmOFtdKSkKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgY292ZXIgMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMzYKICAgICsKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuUHJvc3BlY3R1cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2NgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDY4LTEwNjkKICAgIC8vICMgQ29uZmlndXJlIENvbnRyYWN0CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPSB0ZXJtcy5jb250cmFjdF90eXBlLmFzX3VpbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgYnogY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUA3CiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIyMAogICAgLy8gVUludDY0KGVudW1zLkNUX0FOTiksCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIxCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfTkFNKSwKICAgIHB1c2hpbnQgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIyCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfTEFNKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIzCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfTEFYKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjI0CiAgICAvLyBVSW50NjQoZW51bXMuQ1RfQ0xNKSwKICAgIHB1c2hpbnQgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJ6IGNvbnRyYWN0X2NvbmZpZ19ib29sX2ZhbHNlQDgKCmNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANzoKICAgIGludGNfMSAvLyAxCgpjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUA5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjI5CiAgICAvLyBhc3NlcnQgc2VsZi5faXNfc3VwcG9ydGVkX2NvbnRyYWN0X3R5cGUoY29udHJhY3RfdHlwZSksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3MQogICAgLy8gc2VsZi5fc3RvcmVfY29udHJhY3RfY29uZmlnKHNlbGYuY29udHJhY3RfdHlwZSwgdGVybXMsIGluaXRpYWxfc3RhdGUpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgYnVyeSAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzI1CiAgICAvLyBhc3NlcnQgdGVybXMuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZGlnIDQKICAgIGR1cAogICAgcHVzaGludCAzMwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSA4CiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMjcKICAgIC8vIHRlcm1zLmRheV9jb3VudF9jb252ZW50aW9uLmFzX3VpbnQ2NCgpCiAgICBwdXNoaW50IDU3CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICBieiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDE2CiAgICBkaWcgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk5CiAgICAvLyBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI5Ny0zMDMKICAgIC8vIHJldHVybiBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzYwKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwSVNEQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjApLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDE2CiAgICBkaWcgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzAwCiAgICAvLyBVSW50NjQoZW51bXMuRENDX0EzNjUpLAogICAgcHVzaGludCAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyOTctMzAzCiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgID09CiAgICBibnogY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUAxNgogICAgZGlnIDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMwMQogICAgLy8gVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGRpZyA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDIKICAgIC8vIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICA9PQogICAgYnogY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAMTcKCmNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTY6CiAgICBpbnRjXzEgLy8gMQoKY29udHJhY3RfY29uZmlnX2Jvb2xfbWVyZ2VAMTg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDktMzExCiAgICAvLyBhc3NlcnQgc2VsZi5faXNfc3VwcG9ydGVkX2RheV9jb3VudF9jb252ZW50aW9uKAogICAgLy8gICAgIGRheV9jb3VudF9jb252ZW50aW9uCiAgICAvLyApLCBlcnIuSU5WQUxJRF9EQVlfQ09VTlRfQ09OVkVOVElPTgogICAgYXNzZXJ0IC8vIEludmFsaWQgZGF5LWNvdW50IGNvbnZlbnRpb24gSUQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMyOQogICAgLy8gaWYgY29udHJhY3RfdHlwZSAhPSBVSW50NjQoZW51bXMuQ1RfQU5OKToKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgICE9CiAgICBieiBjb250cmFjdF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzMwCiAgICAvLyBhc3NlcnQgbm90IHRlcm1zLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24sIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZGlnIDQKICAgIHB1c2hpbnQgNzg2CiAgICBnZXRiaXQKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KCmNvbnRyYWN0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDIwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODA3CiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIEQtQVNBIGFscmVhZHkgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODA4CiAgICAvLyBhc3NlcnQgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCA9PSBVSW50NjQoMCksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMCAvLyAiaW5pdGlhbF9leGNoYW5nZV9hbW91bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTAtODExCiAgICAvLyAjIFNldCBEZW5vbWluYXRpb24gQXNzZXQKICAgIC8vIHNlbGYuX2Fzc2VydF9kZW5vbWluYXRpb25fYXNzZXQodGVybXMuZGVub21pbmF0aW9uX2Fzc2V0X2lkKQogICAgZGlnIDQKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NzUtNzc2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIGRlbm9taW5hdGlvbiB3aXRoIEFTQQogICAgLy8gX2NyZWF0b3IsIGV4aXN0cyA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X2NyZWF0b3IoZGVub21pbmF0aW9uX2Fzc2V0X2lkKQogICAgZHVwCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q3JlYXRvcgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NzcKICAgIC8vIGFzc2VydCBleGlzdHMsIGVyci5JTlZBTElEX0RFTk9NSU5BVElPTgogICAgYXNzZXJ0IC8vIERlbm9taW5hdGlvbiBhc3NldCBpcyBub3QgcHJvcGVybHkgc2V0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODAKICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICBieXRlYyA0NCAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTQtODE1CiAgICAvLyAjIFNldCBTZXR0bGVtZW50IEFzc2V0CiAgICAvLyBzZWxmLl9hc3NlcnRfc2V0dGxlbWVudF9hc3NldCh0ZXJtcy5zZXR0bGVtZW50X2Fzc2V0X2lkKQogICAgZGlnIDEKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc4NQogICAgLy8gc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODMtNzg2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc2V0dGxlbWVudCBhc3NldCBpcyB0aGUgZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQgPT0gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIC8vICksIGVyci5JTlZBTElEX1NFVFRMRU1FTlRfQVNTRVQKICAgIGFzc2VydCAvLyBEaWZmZXJlbnQgc2V0dGxlbWVudCBhc3NldCBub3Qgc3VwcG9ydGVkLCBtdXN0IGJlIGVxdWFsIHRvIGRlbm9taW5hdGlvbiBhc3NldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Nzg5CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBzZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkwLTc5NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhc3NldF9hbW91bnQ9MCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Nzk1CiAgICAvLyBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkzCiAgICAvLyBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc5NAogICAgLy8gYXNzZXRfYW1vdW50PTAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkwLTc5MQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3OTAtNzk2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODE4LTgxOQogICAgLy8gIyBVbml0cwogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IHRlcm1zLnRvdGFsX3VuaXRzCiAgICBkdXAKICAgIHB1c2hpbnQgMTcKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODIwCiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID0gVUludDY0KDApCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgyMi04MjMKICAgIC8vICMgRGF5LUNvdW50IENvbnZlbnRpb25zCiAgICAvLyBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uID0gdGVybXMuZGF5X2NvdW50X2NvbnZlbnRpb24uYXNfdWludDY0KCkKICAgIGJ5dGVjIDQ2IC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGRpZyA4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODI1LTgyNgogICAgLy8gIyBUaW1lCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA9IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZQogICAgZHVwCiAgICBwdXNoaW50IDQxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMjggLy8gImluaXRpYWxfZXhjaGFuZ2VfZGF0ZSIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODI3CiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSB0ZXJtcy5tYXR1cml0eV9kYXRlCiAgICBkaWcgMQogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDQ1IC8vICJtYXR1cml0eV9kYXRlIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MjgKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IGluaXRpYWxfc3RhdGUubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZGlnIDYKICAgIGR1cAogICAgY292ZXIgMgogICAgcHVzaGludCA0OAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzMC04MzEKICAgIC8vICMgUHJpbmNpcGFsCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID0gdGVybXMuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGRpZyAxMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzMgogICAgLy8gc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gdGVybXMuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZGlnIDMKICAgIHB1c2hpbnQgNzg2CiAgICBnZXRiaXQKICAgIGJ5dGVjIDM1IC8vICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzMwogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBpbml0aWFsX3N0YXRlLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZGlnIDEKICAgIHB1c2hpbnQgMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODM1LTgzNgogICAgLy8gIyBJbnRlcmVzdAogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ID0gaW5pdGlhbF9zdGF0ZS5hY2NydWVkX2ludGVyZXN0CiAgICBkaWcgMQogICAgcHVzaGludCA0MAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODM4LTgzOQogICAgLy8gIyBJbnRlcmVzdCBSYXRlCiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IGluaXRpYWxfc3RhdGUubm9taW5hbF9pbnRlcmVzdF9yYXRlCiAgICBkaWcgMQogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0MAogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gaW5pdGlhbF9zdGF0ZS5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlCiAgICBkaWcgMQogICAgcHVzaGludCAyNAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQxCiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkID0gdGVybXMucmF0ZV9yZXNldF9zcHJlYWQKICAgIGRpZyAzCiAgICBwdXNoaW50IDU4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzYgLy8gInJhdGVfcmVzZXRfc3ByZWFkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0MgogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIgPSB0ZXJtcy5yYXRlX3Jlc2V0X211bHRpcGxpZXIKICAgIGRpZyAzCiAgICBwdXNoaW50IDY2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzcgLy8gInJhdGVfcmVzZXRfbXVsdGlwbGllciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDMKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9mbG9vciA9IHRlcm1zLnJhdGVfcmVzZXRfZmxvb3IKICAgIGRpZyAzCiAgICBwdXNoaW50IDc0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzEgLy8gInJhdGVfcmVzZXRfZmxvb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQ0CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfY2FwID0gdGVybXMucmF0ZV9yZXNldF9jYXAKICAgIGRpZyAzCiAgICBwdXNoaW50IDgyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzIgLy8gInJhdGVfcmVzZXRfY2FwIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0NQogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X25leHQgPSB0ZXJtcy5yYXRlX3Jlc2V0X25leHQKICAgIGRpZyAzCiAgICBwdXNoaW50IDkwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzggLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDYKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgPSB0ZXJtcy5oYXNfcmF0ZV9yZXNldF9mbG9vcgogICAgZGlnIDMKICAgIHB1c2hpbnQgNzg0CiAgICBnZXRiaXQKICAgIGJ5dGVjIDM5IC8vICJoYXNfcmF0ZV9yZXNldF9mbG9vciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDcKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwID0gdGVybXMuaGFzX3JhdGVfcmVzZXRfY2FwCiAgICBkaWcgMwogICAgcHVzaGludCA3ODUKICAgIGdldGJpdAogICAgYnl0ZWMgNDAgLy8gImhhc19yYXRlX3Jlc2V0X2NhcCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDktODUwCiAgICAvLyAjIFNjYWxpbmcKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgPSB0ZXJtcy5maXhlZF9wb2ludF9zY2FsZQogICAgdW5jb3ZlciAzCiAgICBwdXNoaW50IDk5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODUyLTg1MwogICAgLy8gIyBTY2hlZHVsZSBQcm9jZXNzaW5nCiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciA9IGluaXRpYWxfc3RhdGUuZXZlbnRfY3Vyc29yCiAgICBkaWcgMQogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU1LTg1NgogICAgLy8gIyBQZXItVW5pdCBGaXhlZC1Qb2ludCBJbmRleGVzCiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggPSBpbml0aWFsX3N0YXRlLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgKICAgIGRpZyAxCiAgICBwdXNoaW50IDU2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU3CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4ID0gaW5pdGlhbF9zdGF0ZS5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleAogICAgZGlnIDEKICAgIHB1c2hpbnQgNjQKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU5LTg2MAogICAgLy8gIyBSZXNlcnZlZCBBbW91bnQgKGZvciBleGVjdXRlZCBjYXNoZmxvd3MpCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0ID0gVUludDY0KDApCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2MQogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2MwogICAgLy8gYXNzZXJ0IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLCBlcnIuSU5WQUxJRF9JRUQKICAgIGRpZyAyCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICBhc3NlcnQgLy8gSUVEIG11c3QgYmUgc2V0IGluIHRoZSBmdXR1cmUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2NAogICAgLy8gYXNzZXJ0IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA+IGluaXRpYWxfc3RhdGUuc3RhdHVzX2RhdGUsIGVyci5JTlZBTElEX0lFRAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgPAogICAgYXNzZXJ0IC8vIElFRCBtdXN0IGJlIHNldCBpbiB0aGUgZnV0dXJlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NjUKICAgIC8vIGFzc2VydCB0ZXJtcy5pbml0aWFsX2V4Y2hhbmdlX2RhdGUgPCB0ZXJtcy5tYXR1cml0eV9kYXRlLCBlcnIuSU5WQUxJRF9JRUQKICAgIDwKICAgIGFzc2VydCAvLyBJRUQgbXVzdCBiZSBzZXQgaW4gdGhlIGZ1dHVyZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3My0xMDc0CiAgICAvLyAjIE5vdGFyaXplIHByb3NwZWN0dXMgKG9wdGlvbmFsKQogICAgLy8gc2VsZi5wcm9zcGVjdHVzX2hhc2ggPSBwcm9zcGVjdHVzLmhhc2guYnl0ZXMKICAgIGRpZyAyCiAgICBleHRyYWN0IDAgMzIKICAgIGJ5dGVjIDQyIC8vICJwcm9zcGVjdHVzX2hhc2giCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3NQogICAgLy8gc2VsZi5wcm9zcGVjdHVzX3VybCA9IHByb3NwZWN0dXMudXJsCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGVjIDQzIC8vICJwcm9zcGVjdHVzX3VybCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc2CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAMTc6CiAgICBpbnRjXzAgLy8gMAogICAgYiBjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUAxOAoKY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAODoKICAgIGludGNfMCAvLyAwCiAgICBiIGNvbnRyYWN0X2NvbmZpZ19ib29sX21lcmdlQDkKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9zY2hlZHVsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X3NjaGVkdWxlOgogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHN3YXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBkdXAKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgMgogICAgKwogICAgdW5jb3ZlciAyCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLkV4ZWN1dGlvblNjaGVkdWxlRW50cnk+CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTEwCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMTMKICAgIC8vIGNvbnRyYWN0X3R5cGU9c2VsZi5jb250cmFjdF90eXBlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGNvdmVyIDMKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4ODEKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4ODItODg0CiAgICAvLyBhc3NlcnQgc2NoZWR1bGVfcGFnZS5sZW5ndGggPD0gVUludDY0KAogICAgLy8gICAgIGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUKICAgIC8vICksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGR1cAogICAgcHVzaGludCAxNgogICAgPD0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg4NQogICAgLy8gYXNzZXJ0IHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPiBVSW50NjQoMCksIGVyci5URVJNU19OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSB0ZXJtcyBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODg3CiAgICAvLyBwYWdlX2N1cnNvciA9IHNjaGVkdWxlX3BhZ2VfaW5kZXggKiBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkKICAgIHN3YXAKICAgIHB1c2hpbnQgMTYKICAgICoKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg5NAogICAgLy8gKyBwYWdlX2xlbmd0aCAqIFVJbnQ2NChjc3QuT1BfVVBfQ09OVFJBQ1RfQ09ORklHX1BFUl9FTlRSWV9CVURHRVQpCiAgICBwdXNoaW50IDEwMAogICAgKgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODkzCiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19CQVNFX0JVREdFVCkKICAgIGludGMgNCAvLyAxNTAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTMtODk0CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19CQVNFX0JVREdFVCkKICAgIC8vICsgcGFnZV9sZW5ndGggKiBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19QRVJfRU5UUllfQlVER0VUKQogICAgKwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODg5LTg5NgogICAgLy8gIyBWYWxpZGF0aW9uIGNvc3QgZ3Jvd3Mgd2l0aCBwYWdlIGxlbmd0aCwgc28gY29uZmlndXJhdGlvbiBleHBsaWNpdGx5CiAgICAvLyAjIGJ1eXMgZXh0cmEgb3Bjb2RlIGJ1ZGdldCBmb3IgbGFyZ2VyIHVwbG9hZHMuCiAgICAvLyBlbnN1cmVfYnVkZ2V0KAogICAgLy8gICAgIHJlcXVpcmVkX2J1ZGdldD0oCiAgICAvLyAgICAgICAgIFVJbnQ2NChjc3QuT1BfVVBfQ09OVFJBQ1RfQ09ORklHX0JBU0VfQlVER0VUKQogICAgLy8gICAgICAgICArIHBhZ2VfbGVuZ3RoICogVUludDY0KGNzdC5PUF9VUF9DT05UUkFDVF9DT05GSUdfUEVSX0VOVFJZX0JVREdFVCkKICAgIC8vICAgICApLAogICAgLy8gKQogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODk3CiAgICAvLyBpbmRleCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKCmNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEAyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODk4CiAgICAvLyB3aGlsZSBpbmRleCA8IHBhZ2VfbGVuZ3RoOgogICAgZHVwCiAgICBkaWcgNAogICAgPAogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfd2hpbGVAMTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg5OS05MDAKICAgIC8vIGVudHJ5ID0gc2NoZWR1bGVfcGFnZVtpbmRleF0uY29weSgpCiAgICAvLyBlbnRyeV9ldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZGlnIDQKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGJ1cnkgMTIKICAgIGRpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgNjUKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTAwCiAgICAvLyBlbnRyeV9ldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTktOTAwCiAgICAvLyBlbnRyeSA9IHNjaGVkdWxlX3BhZ2VbaW5kZXhdLmNvcHkoKQogICAgLy8gZW50cnlfZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGludGNfMiAvLyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDAKICAgIC8vIGVudHJ5X2V2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBnZXRieXRlCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgMTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkwMQogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X2lkID09IHBhZ2VfY3Vyc29yICsgaW5kZXgsIGVyci5JTlZBTElEX0VWRU5UX0lECiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEzCiAgICBkaWcgNQogICAgdW5jb3ZlciA0CiAgICArCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDItOTA0CiAgICAvLyBzZWxmLl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBlbnRyeV9ldmVudF90eXBlCiAgICAvLyApCiAgICBkaWcgNQogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTA1CiAgICAvLyBhc3NlcnQgZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgc3dhcAogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDYKICAgIC8vIGlmIGVudHJ5LmV2ZW50X2lkID4gVUludDY0KDApOgogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDcKICAgIC8vIGlmIGluZGV4ID4gVUludDY0KDApOgogICAgZHVwCiAgICBieiBjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlANgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTA4CiAgICAvLyBwcmV2aW91c19lbnRyeSA9IHNjaGVkdWxlX3BhZ2VbaW5kZXggLSBVSW50NjQoMSldLmNvcHkoKQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgcHVzaGludCA2NQogICAgKgogICAgZGlnIDExCiAgICBzd2FwCiAgICBwdXNoaW50IDY1CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkyMwogICAgLy8gcHJldmlvdXNfZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gZW50cnkuc2NoZWR1bGVkX3RpbWUKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyA4CiAgICA8PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTIyLTkyNAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBwcmV2aW91c19lbnRyeS5zY2hlZHVsZWRfdGltZSA8PSBlbnRyeS5zY2hlZHVsZWRfdGltZQogICAgLy8gKSwgZXJyLklOVkFMSURfU09SVElORwogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIG11c3QgYmUgc29ydGVkIGluIHN0cmljdGx5IGFzY2VuZGluZyBvcmRlcgoKY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUA4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTI1CiAgICAvLyBpZiBlbnRyeS5ldmVudF9pZCA9PSBVSW50NjQoMCk6CiAgICBkaWcgOAogICAgYm56IGNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkyNi05MjgKICAgIC8vIGFzc2VydCBlbnRyeV9ldmVudF90eXBlID09IFVJbnQ2NCgKICAgIC8vICAgICBlbnVtcy5FVlRfSUVECiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGRpZyA5CiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjkKICAgIC8vIGluZGV4ICs9IFVJbnQ2NCgxKQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIGNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEAyCgpjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlANjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkxMC05MTIKICAgIC8vICMgVGhlIGZpcnN0IGVudHJ5IG9mIGEgcGFnZSBtdXN0IHN0aWxsIGJlIG9yZGVyZWQgYWZ0ZXIgdGhlCiAgICAvLyAjIGxhc3QgZW50cnkgb2YgdGhlIHByZXZpb3VzIHBhZ2UuCiAgICAvLyBhc3NlcnQgc2NoZWR1bGVfcGFnZV9pbmRleCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGRpZyA2CiAgICBkdXAKICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTMKICAgIC8vIHByZXZpb3VzX3BhZ2VfaW5kZXggPSBzY2hlZHVsZV9wYWdlX2luZGV4IC0gVUludDY0KDEpCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTE1CiAgICAvLyBwcmV2aW91c19wYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZQogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTQtOTE2CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHByZXZpb3VzX3BhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTctOTE4CiAgICAvLyBwcmV2aW91c19wYWdlID0gc2VsZi5zY2hlZHVsZV9wYWdlW3ByZXZpb3VzX3BhZ2VfaW5kZXhdLmNvcHkoKQogICAgLy8gYXNzZXJ0IHByZXZpb3VzX3BhZ2UubGVuZ3RoID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBwdXNoaW50IDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTgKICAgIC8vIGFzc2VydCBwcmV2aW91c19wYWdlLmxlbmd0aCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZHVwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjAKICAgIC8vIHByZXZpb3VzX3BhZ2UubGVuZ3RoIC0gVUludDY0KDEpCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTE5LTkyMQogICAgLy8gcHJldmlvdXNfZW50cnkgPSBwcmV2aW91c19wYWdlWwogICAgLy8gICAgIHByZXZpb3VzX3BhZ2UubGVuZ3RoIC0gVUludDY0KDEpCiAgICAvLyBdLmNvcHkoKQogICAgcHVzaGludCA2NQogICAgKgogICAgcHVzaGludCAyCiAgICArCiAgICBwdXNoaW50IDY1CiAgICBib3hfZXh0cmFjdAogICAgYiBjb250cmFjdF9zY2hlZHVsZV9hZnRlcl9pZl9lbHNlQDcKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX3doaWxlQDExOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjAwCiAgICAvLyBzZWxmLnNjaGVkdWxlX3BhZ2VbcGFnZV9pbmRleF0gPSBzY2hlZHVsZV9wYWdlLmNvcHkoKQogICAgZGlnIDYKICAgIGl0b2IKICAgIGJ5dGVjIDI0IC8vIDB4NTMyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgZGlnIDUKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzMgogICAgLy8gaWYgaXNfbGFzdF9wYWdlOgogICAgZGlnIDUKICAgIGJ6IGNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzNAogICAgLy8gc2NoZWR1bGVfcGFnZV9pbmRleCAqIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKSArIHBhZ2VfbGVuZ3RoCiAgICBkaWcgMQogICAgZGlnIDQKICAgICsKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzMwogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA9ICgKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTMzLTkzNQogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA9ICgKICAgIC8vICAgICBzY2hlZHVsZV9wYWdlX2luZGV4ICogVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpICsgcGFnZV9sZW5ndGgKICAgIC8vICkKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MzYKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgNTAKICAgIGFwcF9nbG9iYWxfcHV0Cgpjb250cmFjdF9zY2hlZHVsZV9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTExOAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9leGVjdXRlX2llZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X2V4ZWN1dGVfaWVkOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDMKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE0NAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDUKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTQ3CiAgICAvLyBhc3NlcnQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LCBlcnIuSU5WQUxJRF9FVkVOVF9DVVJTT1IKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgZGlnIDEKICAgID4KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGN1cnNvcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE0OAogICAgLy8gZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoc2VsZi5ldmVudF9jdXJzb3IpCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDkKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoZW51bXMuRVZUX0lFRCksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGR1cAogICAgZXh0cmFjdCA4IDEKICAgIGR1cAogICAgcHVzaGJ5dGVzIDB4MDEKICAgIGI9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1MwogICAgLy8gZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICBkaWcgMQogICAgZXh0cmFjdCAwIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTUKICAgIC8vIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgZGlnIDIKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTU2CiAgICAvLyBhY2NydWFsX2ZhY3Rvcj1lbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIGRpZyAzCiAgICBleHRyYWN0IDE3IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTcKICAgIC8vIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIGRpZyA0CiAgICBleHRyYWN0IDI1IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTkKICAgIC8vIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPWVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDUKICAgIGV4dHJhY3QgMzMgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE2MAogICAgLy8gbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgZGlnIDYKICAgIGV4dHJhY3QgNDEgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE2MQogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9ZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICBkaWcgNwogICAgZXh0cmFjdCA0OSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTYyCiAgICAvLyBmbGFncz1lbnRyeS5mbGFncywKICAgIGRpZyA4CiAgICBleHRyYWN0IDU3IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTItMTE2MwogICAgLy8gdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0KAogICAgLy8gICAgIGV2ZW50X2lkPWVudHJ5LmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1lbnRyeS5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1lbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPWVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9ZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPWVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGZsYWdzPWVudHJ5LmZsYWdzLAogICAgLy8gKSwKICAgIHVuY292ZXIgNwogICAgdW5jb3ZlciA4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNwogICAgY29uY2F0CiAgICB1bmNvdmVyIDYKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTgKICAgIC8vIG9ic2VydmVkX3JhdGU9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTItMTE2MwogICAgLy8gdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0KAogICAgLy8gICAgIGV2ZW50X2lkPWVudHJ5LmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1lbnRyeS5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1lbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPWVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9ZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPWVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGZsYWdzPWVudHJ5LmZsYWdzLAogICAgLy8gKSwKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTUwLTExNjQKICAgIC8vIHNlbGYuX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5KAogICAgLy8gICAgIGVudHJ5LAogICAgLy8gICAgIHR5cC5PYnNlcnZlZEV2ZW50UmVxdWVzdCgKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPWVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIG9ic2VydmVkX3JhdGU9VUludDY0KDApLAogICAgLy8gICAgICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1lbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1lbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICAgICAgZmxhZ3M9ZW50cnkuZmxhZ3MsCiAgICAvLyAgICAgKSwKICAgIC8vICkKICAgIGNhbGxzdWIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5CiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNjUKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEyMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuYXBwbHlfbm9uX2Nhc2hfZXZlbnRbcm91dGluZ10oKSAtPiB2b2lkOgphcHBseV9ub25fY2FzaF9ldmVudDoKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDQKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cG4gMgogICAgbGVuCiAgICBwdXNoaW50IDczCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLk9ic2VydmVkRXZlbnRSZXF1ZXN0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIwNAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMDUKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjA3CiAgICAvLyBpZiBwYXlsb2FkLmZsYWdzICYgVUludDY0KGVudW1zLkZMQUdfT0JTRVJWRURfRVZFTlQpOgogICAgcHVzaGludCA2NQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgcHVzaGludCA0CiAgICAmCiAgICBieiBhcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIzMwogICAgLy8gcmV0dXJuIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQ0xNKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICBwdXNoaW50IDUKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjA4CiAgICAvLyBhc3NlcnQgc2VsZi5fc3VwcG9ydHNfb2JzZXJ2ZWRfZXZlbnRzKCksIGVyci5PQlNFUlZFRF9FVkVOVF9SRVFVSVJFRAogICAgYXNzZXJ0IC8vIE9ic2VydmVkIGV2ZW50IHJlcXVpcmVkIHRvIGV4ZWN1dGUgdGhpcyBhY3Rpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMDkKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjMzCiAgICAvLyByZXR1cm4gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9DTE0pCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIGR1cAogICAgcHVzaGludCA1CiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQ1CiAgICAvLyBhc3NlcnQgc2VsZi5fc3VwcG9ydHNfb2JzZXJ2ZWRfZXZlbnRzKCksIGVyci5PQlNFUlZFRF9FVkVOVF9SRVFVSVJFRAogICAgYXNzZXJ0IC8vIE9ic2VydmVkIGV2ZW50IHJlcXVpcmVkIHRvIGV4ZWN1dGUgdGhpcyBhY3Rpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk0NgogICAgLy8gYXNzZXJ0IHBheWxvYWQuZXZlbnRfaWQgPT0gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGRpZyAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDcKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBpZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQ4CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUsIHBheWxvYWQuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgYnVyeSAxMgogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk0Ny05NDkKICAgIC8vIHNlbGYuX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIHNlbGYuY29udHJhY3RfdHlwZSwgcGF5bG9hZC5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICAvLyApCiAgICBjYWxsc3ViIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTUxCiAgICAvLyBwYWdlX2luZGV4ID0gc2VsZi5fc2NoZWR1bGVfcGFnZV9pbmRleChzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTkwCiAgICAvLyByZXR1cm4gZXZlbnRfaWQgLy8gVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpCiAgICBwdXNoaW50IDE2CiAgICAvCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTIKICAgIC8vIHBhZ2UgPSB0eXAuRXhlY3V0aW9uU2NoZWR1bGVQYWdlKCkKICAgIGJ5dGVjIDQ4IC8vIDB4MDAwMAogICAgYnVyeSA3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTMKICAgIC8vIGlmIHBhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlOgogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA5CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMjcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1NAogICAgLy8gcGFnZSA9IHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XS5jb3B5KCkKICAgIGRpZyA3CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidXJ5IDcKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX3BhZ2UgZW50cnkgZXhpc3RzCgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDI3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTU1CiAgICAvLyBhc3NlcnQgcGFnZS5sZW5ndGggPCBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGRpZyA1CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgMTYKICAgIDwKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2MAogICAgLy8gc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIGRpZyAzCiAgICBkdXAKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjEKICAgIC8vIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICBkaWcgMQogICAgZXh0cmFjdCAxNyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjIKICAgIC8vIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZGlnIDIKICAgIGV4dHJhY3QgMjUgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTYzCiAgICAvLyBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDMKICAgIGV4dHJhY3QgNDEgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTY0CiAgICAvLyBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIGRpZyA0CiAgICBleHRyYWN0IDQ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2NQogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIHVuY292ZXIgNQogICAgZXh0cmFjdCA1NyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTctOTY3CiAgICAvLyB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1wYXlsb2FkLmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9cGF5bG9hZC5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPXBheWxvYWQucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXBheWxvYWQubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICkKICAgIGRpZyAxMQogICAgaXRvYgogICAgZGlnIDE4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMwogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTYtOTY4CiAgICAvLyBwYWdlLmFwcGVuZCgKICAgIC8vICAgICB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9cGF5bG9hZC5ldmVudF9pZCwKICAgIC8vICAgICAgICAgZXZlbnRfdHlwZT1wYXlsb2FkLmV2ZW50X3R5cGUsCiAgICAvLyAgICAgICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIC8vICAgICAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICAgICApCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjkKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHBhZ2UuY29weSgpCiAgICBkaWcgOAogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk3MAogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjEyCiAgICAvLyBhc3NlcnQgZXZlbnRfaWQgPT0gc2VsZi5ldmVudF9jdXJzb3IsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBjdXJzb3IKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMTMKICAgIC8vIGVudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KGV2ZW50X2lkKQogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIxNQogICAgLy8gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgYnVyeSAxMAogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjQKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY1CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzYzLTM3MAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9SUiksCiAgICBwdXNoaW50IDEyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY3CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICBwdXNoaW50IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY4CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgcHVzaGludCAxOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzYzLTM3MAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBieiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX2ZhbHNlQDE2CgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX3RydWVAMTU6CiAgICBpbnRjXzEgLy8gMQoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9tZXJnZUAxNzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMTQtMTIxNgogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2lzX25vbl9jYXNoKAogICAgLy8gICAgIGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIC8vICksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IHR5cGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMTcKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlICE9IGFyYzQuVUludDgoZW51bXMuRVZUX0lFRCksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGRpZyA4CiAgICBwdXNoYnl0ZXMgMHgwMQogICAgYiE9CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCB0eXBlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNzQKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluIChVSW50NjQoZW51bXMuRVZUX1JSKSwgVUludDY0KGVudW1zLkVWVF9SUkYpKQogICAgZGlnIDQKICAgIHB1c2hpbnQgMTIKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDIxCiAgICBkaWcgNAogICAgcHVzaGludCAxMQogICAgPT0KICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfZmFsc2VAMjIKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAyMToKICAgIGludGNfMSAvLyAxCgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX21lcmdlQDIzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIxOAogICAgLy8gaWYgc2VsZi5fZXZlbnRfaXNfcmF0ZV9yZXNldChlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpKToKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Vsc2VfYm9keUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODIKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLm9ic2VydmVyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjUgLy8gMHg1MjNhNGQ0ZjQzMjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMjIKICAgIC8vIHNlbGYuX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5KGVudHJ5LCBwYXlsb2FkKQogICAgZGlnIDYKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeQogICAgcG9wbiAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjIzCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfZWxzZV9ib2R5QDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjIxCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIGIgYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYWZ0ZXJfaWZfZWxzZUA2CgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX2ZhbHNlQDIyOgogICAgaW50Y18wIC8vIDAKICAgIGIgYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9tZXJnZUAyMwoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9mYWxzZUAxNjoKICAgIGludGNfMCAvLyAwCiAgICBiIGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfbWVyZ2VAMTcKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5hcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50OgogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGxlbgogICAgcHVzaGludCA2NQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5PYnNlcnZlZENhc2hFdmVudFJlcXVlc3QKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjU0CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyNTUKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjU2CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIzMwogICAgLy8gcmV0dXJuIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQ0xNKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICBwdXNoaW50IDUKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5ODEKICAgIC8vIGFzc2VydCBzZWxmLl9zdXBwb3J0c19vYnNlcnZlZF9ldmVudHMoKSwgZXJyLk9CU0VSVkVEX0VWRU5UX1JFUVVJUkVECiAgICBhc3NlcnQgLy8gT2JzZXJ2ZWQgZXZlbnQgcmVxdWlyZWQgdG8gZXhlY3V0ZSB0aGlzIGFjdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTgyCiAgICAvLyBhc3NlcnQgcGF5bG9hZC5ldmVudF9pZCA9PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LCBlcnIuSU5WQUxJRF9FVkVOVF9JRAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgc3dhcAogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBpZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTgzCiAgICAvLyBhc3NlcnQgcGF5bG9hZC5ldmVudF90eXBlID09IGFyYzQuVUludDgoZW51bXMuRVZUX1BSKSwgZXJyLklOVkFMSURfRVZFTlRfVFlQRQogICAgZGlnIDEKICAgIGV4dHJhY3QgOCAxCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIHB1c2hieXRlcyAweDAzCiAgICBiPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IHR5cGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4NAogICAgLy8gYXNzZXJ0IHBheWxvYWQuZmxhZ3MgJiBVSW50NjQoZW51bXMuRkxBR19DQVNIX0VWRU5UKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBzd2FwCiAgICBwdXNoaW50IDU3CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzEgLy8gMQogICAgJgogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTg2CiAgICAvLyBpZiBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50ID4gVUludDY0KDApOgogICAgYnogYXBwZW5kX29ic2VydmVkX2Nhc2hfZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5ODgKICAgIC8vIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgLSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5ODctOTg5CiAgICAvLyBwcmV2aW91c19lbnRyeSA9IHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeSgKICAgIC8vICAgICBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IC0gVUludDY0KDEpCiAgICAvLyApCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5MQogICAgLy8gcHJldmlvdXNfZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gcGF5bG9hZC5zY2hlZHVsZWRfdGltZQogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDQKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIDw9CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OTAtOTkyCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHByZXZpb3VzX2VudHJ5LnNjaGVkdWxlZF90aW1lIDw9IHBheWxvYWQuc2NoZWR1bGVkX3RpbWUKICAgIC8vICksIGVyci5JTlZBTElEX1NPUlRJTkcKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBtdXN0IGJlIHNvcnRlZCBpbiBzdHJpY3RseSBhc2NlbmRpbmcgb3JkZXIKCmFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5NAogICAgLy8gcGFnZV9pbmRleCA9IHNlbGYuX3NjaGVkdWxlX3BhZ2VfaW5kZXgoc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE5MAogICAgLy8gcmV0dXJuIGV2ZW50X2lkIC8vIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKQogICAgcHVzaGludCAxNgogICAgLwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTk1CiAgICAvLyBwYWdlID0gdHlwLkV4ZWN1dGlvblNjaGVkdWxlUGFnZSgpCiAgICBieXRlYyA0OCAvLyAweDAwMDAKICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTk2CiAgICAvLyBpZiBwYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZToKICAgIGl0b2IKICAgIGJ5dGVjIDI0IC8vIDB4NTMyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgNwogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBhcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5NwogICAgLy8gcGFnZSA9IHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XS5jb3B5KCkKICAgIGRpZyA1CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidXJ5IDYKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX3BhZ2UgZW50cnkgZXhpc3RzCgphcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OTgKICAgIC8vIGFzc2VydCBwYWdlLmxlbmd0aCA8IFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZGlnIDQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgcHVzaGludCAxNgogICAgPAogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAwMwogICAgLy8gc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIGRpZyA1CiAgICBkdXAKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDA0CiAgICAvLyBhY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLmFjY3J1YWxfZmFjdG9yLAogICAgZGlnIDEKICAgIGV4dHJhY3QgMTcgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAwNQogICAgLy8gcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICBkaWcgMgogICAgZXh0cmFjdCAyNSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDA2CiAgICAvLyBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDMKICAgIGV4dHJhY3QgMzMgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAwNwogICAgLy8gbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1wYXlsb2FkLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICBkaWcgNAogICAgZXh0cmFjdCA0MSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDA4CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1wYXlsb2FkLm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgdW5jb3ZlciA1CiAgICBleHRyYWN0IDQ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMDAtMTAxMAogICAgLy8gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkoCiAgICAvLyAgICAgZXZlbnRfaWQ9cGF5bG9hZC5ldmVudF9pZCwKICAgIC8vICAgICBldmVudF90eXBlPXBheWxvYWQuZXZlbnRfdHlwZSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1wYXlsb2FkLnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9cGF5bG9hZC5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIC8vICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1wYXlsb2FkLm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGZsYWdzPXBheWxvYWQuZmxhZ3MsCiAgICAvLyApCiAgICBkaWcgMTAKICAgIGl0b2IKICAgIGRpZyAxMAogICAgY29uY2F0CiAgICB1bmNvdmVyIDYKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTk5LTEwMTEKICAgIC8vIHBhZ2UuYXBwZW5kKAogICAgLy8gICAgIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgICAgICBldmVudF9pZD1wYXlsb2FkLmV2ZW50X2lkLAogICAgLy8gICAgICAgICBldmVudF90eXBlPXBheWxvYWQuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICAgICAgYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPXBheWxvYWQubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1wYXlsb2FkLm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgICAgICBmbGFncz1wYXlsb2FkLmZsYWdzLAogICAgLy8gICAgICkKICAgIC8vICkKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMTIKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHBhZ2UuY29weSgpCiAgICBkaWcgNgogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMTMKICAgIC8vIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgKz0gVUludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI2MAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9nZXRfc3RhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9nZXRfc3RhdGU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGR1cAogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjc1CiAgICAvLyBjb250cmFjdF90eXBlPWFyYzQuVUludDgoc2VsZi5jb250cmFjdF90eXBlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgaXRvYgogICAgZHVwCiAgICBiaXRsZW4KICAgIGludGNfMiAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBleHRyYWN0IDcgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI3NwogICAgLy8gdG90YWxfdW5pdHM9c2VsZi50b3RhbF91bml0cywKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjc4CiAgICAvLyByZXNlcnZlZF91bml0c190b3RhbD1zZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyNzkKICAgIC8vIGluaXRpYWxfZXhjaGFuZ2VfYW1vdW50PXNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI4MAogICAgLy8gZXZlbnRfY3Vyc29yPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjgxCiAgICAvLyBzY2hlZHVsZV9lbnRyeV9jb3VudD1zZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI4MgogICAgLy8gb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjgzCiAgICAvLyBpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlPXNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjg0CiAgICAvLyBub21pbmFsX2ludGVyZXN0X3JhdGU9c2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyODUKICAgIC8vIGFjY3J1ZWRfaW50ZXJlc3Q9c2VsZi5hY2NydWVkX2ludGVyZXN0LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyODYKICAgIC8vIGN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXg9c2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjg3CiAgICAvLyBjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleD1zZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyODgKICAgIC8vIHJlc2VydmVkX2ludGVyZXN0PXNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX2ludGVyZXN0IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI4OQogICAgLy8gcmVzZXJ2ZWRfcHJpbmNpcGFsPXNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI3NC0xMjkwCiAgICAvLyByZXR1cm4gdHlwLktlcm5lbFN0YXRlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGU9YXJjNC5VSW50OChzZWxmLmNvbnRyYWN0X3R5cGUpLAogICAgLy8gICAgIHN0YXR1cz1zZWxmLnN0YXR1cywKICAgIC8vICAgICB0b3RhbF91bml0cz1zZWxmLnRvdGFsX3VuaXRzLAogICAgLy8gICAgIHJlc2VydmVkX3VuaXRzX3RvdGFsPXNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwsCiAgICAvLyAgICAgaW5pdGlhbF9leGNoYW5nZV9hbW91bnQ9c2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCwKICAgIC8vICAgICBldmVudF9jdXJzb3I9c2VsZi5ldmVudF9jdXJzb3IsCiAgICAvLyAgICAgc2NoZWR1bGVfZW50cnlfY291bnQ9c2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwKICAgIC8vICAgICBvdXRzdGFuZGluZ19wcmluY2lwYWw9c2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZT1zZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICAvLyAgICAgbm9taW5hbF9pbnRlcmVzdF9yYXRlPXNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIGFjY3J1ZWRfaW50ZXJlc3Q9c2VsZi5hY2NydWVkX2ludGVyZXN0LAogICAgLy8gICAgIGN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXg9c2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4LAogICAgLy8gICAgIGN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4PXNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgsCiAgICAvLyAgICAgcmVzZXJ2ZWRfaW50ZXJlc3Q9c2VsZi5yZXNlcnZlZF9pbnRlcmVzdCwKICAgIC8vICAgICByZXNlcnZlZF9wcmluY2lwYWw9c2VsZi5yZXNlcnZlZF9wcmluY2lwYWwsCiAgICAvLyApCiAgICB1bmNvdmVyIDE0CiAgICBpdG9iCiAgICB1bmNvdmVyIDE0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMgogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDExCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA5CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgOAogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDcKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyNjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzA0CiAgICAvLyBpZiBzZWxmLmV2ZW50X2N1cnNvciA+PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICA+PQogICAgYnogY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMwNgogICAgLy8gZXZlbnRfaWQ9c2VsZi5ldmVudF9jdXJzb3IsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMDUtMTMxNQogICAgLy8gcmV0dXJuIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgIGV2ZW50X2lkPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgLy8gICAgIGV2ZW50X3R5cGU9YXJjNC5VSW50OCgwKSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1VSW50NjQoMCksCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1VSW50NjQoMCksCiAgICAvLyAgICAgZmxhZ3M9VUludDY0KDApLAogICAgLy8gKQogICAgaXRvYgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMwNwogICAgLy8gZXZlbnRfdHlwZT1hcmM0LlVJbnQ4KDApLAogICAgYnl0ZWMgNDEgLy8gMHgwMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMwNS0xMzE1CiAgICAvLyByZXR1cm4gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkoCiAgICAvLyAgICAgZXZlbnRfaWQ9c2VsZi5ldmVudF9jdXJzb3IsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1hcmM0LlVJbnQ4KDApLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPVVJbnQ2NCgwKSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249VUludDY0KDApLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPVVJbnQ2NCgwKSwKICAgIC8vICAgICBmbGFncz1VSW50NjQoMCksCiAgICAvLyApCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMDgKICAgIC8vIHNjaGVkdWxlZF90aW1lPVVJbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzA1LTEzMTUKICAgIC8vIHJldHVybiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1zZWxmLmV2ZW50X2N1cnNvciwKICAgIC8vICAgICBldmVudF90eXBlPWFyYzQuVUludDgoMCksCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9VUludDY0KDApLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9VUludDY0KDApLAogICAgLy8gICAgIGZsYWdzPVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAoKY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50QDQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjkyCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzE2CiAgICAvLyByZXR1cm4gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KHNlbGYuZXZlbnRfY3Vyc29yKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyOTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiBjb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnRfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnRANAoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLmNvbnRyYWN0X3VwZGF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X3VwZGF0ZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNjEtMTY0CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gZ3JhbnRzIHRoZSB1cGRhdGUgcGVybWlzc2lvbnMgdG8gdGhlIEFycmFuZ2VyLgogICAgLy8gIyDimqDvuI8gV0FSTklORzogQXBwbGljYXRpb24gdXBkYXRlcyBtdXN0IGJlIGV4ZWN1dGVkIFZFUlkgY2FyZWZ1bGx5LCBhcyB0aGV5CiAgICAvLyAjIG1pZ2h0IGludHJvZHVjZSBicmVha2luZyBjaGFuZ2VzLgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTUwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19yb3RhdGVfYXJyYW5nZXJbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3JvdGF0ZV9hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTgwCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODEKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSBuZXdfYXJyYW5nZXIKICAgIGJ5dGVjIDE4IC8vIDB4NTIzYTQxNTI1MjIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4MgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTY2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3NldF9vcF9kYWVtb25bcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3NldF9vcF9kYWVtb246CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTg0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE5OAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTk5CiAgICAvLyBzZWxmLm9wX2RhZW1vbi52YWx1ZSA9IGFkZHJlc3MKICAgIGJ5dGVjIDI3IC8vIDB4NTIzYTRmNTA0NDIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwMAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTg0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2Fzc2lnbl9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19hc3NpZ25fcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDE2CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLlJvbGVWYWxpZGl0eQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI1CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNgogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDQKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgcHVzaGludCAyMAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA1CiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gcm9sZV9hZGRyZXNzCiAgICBieXRlYyAxOCAvLyAweDUyM2E0MTUyNTIyMwogICAgZGlnIDMKICAgIGFwcF9nbG9iYWxfcHV0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyOAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwOAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDQwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDkKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIzIC8vIDB4NTIzYTRkNGU0NzIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTAKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI3CiAgICAvLyBzZWxmLl9zZXRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIHZhbGlkaXR5KQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTMKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjIgLy8gMHg1MjNhNTA1OTQ0MjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNAogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNwogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE2CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpOgogICAgZHVwCiAgICBwdXNoaW50IDYwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTcKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyNiAvLyAweDUyM2E1NDUyNTMyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE4CiAgICAvLyBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjcKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIxCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMSAvLyAweDUyM2E0MTU1NTQyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIyCiAgICAvLyBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNwogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyNAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgODAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI1CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI1IC8vIDB4NTIzYTRkNGY0MzIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjYKICAgIC8vIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfcmV2b2tlX3JvbGVbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3Jldm9rZV9yb2xlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0OQogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjUwCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1MQogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjkKICAgIC8vIGFzc2VydCByb2xlX2lkICE9IFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwgZXJyLklOVkFMSURfUk9MRQogICAgZHVwCiAgICBwdXNoaW50IDIwCiAgICAhPQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMwCiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICBwdXNoaW50IDQwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzEKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjMgLy8gMHg1MjNhNGQ0ZTQ3MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMgogICAgLy8gZGVsIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTMKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzQKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzUKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMiAvLyAweDUyM2E1MDU5NDQyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM2CiAgICAvLyBkZWwgc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTIKICAgIC8vIHNlbGYuX2RlbGV0ZV9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcykKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM4CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpOgogICAgZHVwCiAgICBwdXNoaW50IDYwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzkKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI2IC8vIDB4NTIzYTU0NTI1MzIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDAKICAgIC8vIGRlbCBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjUyCiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDMKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hdXRob3JpdHksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjEgLy8gMHg1MjNhNDE1NTU0MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NAogICAgLy8gZGVsIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1MgogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDYKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDgwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI1IC8vIDB4NTIzYTRkNGY0MzIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDgKICAgIC8vIGRlbCBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19jb250cmFjdF9zdXNwZW5zaW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19jb250cmFjdF9zdXNwZW5zaW9uOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojc5CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyMSAvLyAweDUyM2E0MTU1NTQyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3MQogICAgLy8gc2VsZi5jb250cmFjdF9zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGJ5dGVjIDMzIC8vICJjb250cmFjdF9zdXNwZW5kZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3MgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2NvbnRyYWN0X2RlZmF1bHRbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2NvbnRyYWN0X2RlZmF1bHQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjc0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzYKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnRydXN0ZWUsIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyNiAvLyAweDUyM2E1NDUyNTMyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4NwogICAgLy8gc2VsZi5kZWZhdWx0ZWQgPSBkZWZhdWx0ZWQKICAgIGJ5dGVjIDM0IC8vICJkZWZhdWx0ZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4OAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjc0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9hcnJhbmdlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X2FycmFuZ2VyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwMQogICAgLy8gcmV0dXJuIHNlbGYuYXJyYW5nZXIudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOCAvLyAweDUyM2E0MTUyNTIyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYWRkcmVzc19yb2xlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzAzCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMQogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hY2NvdW50X21hbmFnZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjMgLy8gMHg1MjNhNGQ0ZTQ3MjMKICAgIGRpZyAxCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMgogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5wcmltYXJ5X2RlYWxlciwgYWRkcmVzcyksCiAgICBieXRlYyAyMiAvLyAweDUyM2E1MDU5NDQyMwogICAgZGlnIDIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzIzCiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnRydXN0ZWUsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjYgLy8gMHg1MjNhNTQ1MjUzMjMKICAgIGRpZyAzCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyNAogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIGFkZHJlc3MpLAogICAgYnl0ZWMgMjEgLy8gMHg1MjNhNDE1NTU0MjMKICAgIGRpZyA0CiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyNQogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5vYnNlcnZlciwgYWRkcmVzcyksCiAgICBieXRlYyAyNSAvLyAweDUyM2E0ZDRmNDMyMwogICAgdW5jb3ZlciA1CiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlYyA0MSAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciA2CiAgICBzZXRiaXQKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDUKICAgIHNldGJpdAogICAgcHVzaGludCAyCiAgICB1bmNvdmVyIDQKICAgIHNldGJpdAogICAgcHVzaGludCAzCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgcHVzaGludCA0CiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM0NgogICAgLy8gcm9sZSA9IHJvbGVfaWQuYXNfdWludDY0KCkKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNDcKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGUpCiAgICBkdXAKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzQ5CiAgICAvLyBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKToKICAgIHB1c2hpbnRzIDIwIDQwIDUwIDYwIDcwIDgwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzQ4LTM3OQogICAgLy8gbWF0Y2ggcm9sZToKICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKToKICAgIC8vICAgICAgICAgcmV0dXJuIHR5cC5Sb2xlVmFsaWRpdHkoCiAgICAvLyAgICAgICAgICAgICByb2xlX3ZhbGlkaXR5X3N0YXJ0PVVJbnQ2NCgwKSwgcm9sZV92YWxpZGl0eV9lbmQ9VUludDY0KDApCiAgICAvLyAgICAgICAgICkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSk6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSk6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgXzoKICAgIC8vICAgICAgICAgb3AuZXJyKGVyci5JTlZBTElEX1JPTEUpCiAgICB1bmNvdmVyIDYKICAgIG1hdGNoIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMEAyIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMUAzIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMkA0IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfM0A1IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNEA2IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mzc5CiAgICAvLyBvcC5lcnIoZXJyLklOVkFMSURfUk9MRSkKICAgIGVyciAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV81QDc6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mzc1CiAgICAvLyBzZWxmLm9ic2VydmVyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDI1IC8vIDB4NTIzYTRkNGY0MzIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTcKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mzc0LTM3NgogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM3NwogICAgLy8gcmV0dXJuIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzRANjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNzAKICAgIC8vIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDIxIC8vIDB4NTIzYTQxNTU1NDIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTcKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzY5LTM3MQogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNzIKICAgIC8vIHJldHVybiBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzNANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNjUKICAgIC8vIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAyNiAvLyAweDUyM2E1NDUyNTMyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU3CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM2NC0zNjYKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM2NwogICAgLy8gcmV0dXJuIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzJANDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNjAKICAgIC8vIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMjIgLy8gMHg1MjNhNTA1OTQ0MjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NwogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTktMzYxCiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzYyCiAgICAvLyByZXR1cm4gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzFAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTUKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDIzIC8vIDB4NTIzYTRkNGU0NzIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTcKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzU0LTM1NgogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTcKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzBAMjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTAtMzUyCiAgICAvLyByZXR1cm4gdHlwLlJvbGVWYWxpZGl0eSgKICAgIC8vICAgICByb2xlX3ZhbGlkaXR5X3N0YXJ0PVVJbnQ2NCgwKSwgcm9sZV92YWxpZGl0eV9lbmQ9VUludDY0KDApCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB2b2lkOgpfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZDoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNgogICAgLy8gZGVmIF9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHNlbGYsIGhvbGRpbmdfYWRkcmVzczogQWNjb3VudCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI4CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZCwgZXJyLlNVU1BFTkRFRAogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCAzODQKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIFN1c3BlbmRlZCBvcGVyYXRpb25zCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5fc2V0dGxlX3Bvc2l0aW9uKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NCwgdWludDY0Ogpfc2V0dGxlX3Bvc2l0aW9uOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjQ0CiAgICAvLyBkZWYgX3NldHRsZV9wb3NpdGlvbihzZWxmLCBob2xkaW5nX2FkZHJlc3M6IEFjY291bnQpIC0+IHR1cGxlW1VJbnQ2NCwgVUludDY0XToKICAgIHByb3RvIDEgMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjYxCiAgICAvLyBwb3NpdGlvbiA9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNvcHkoKQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo2My02NQogICAgLy8gIyBDb21wdXRlIHRoZSBpbmNyZW1lbnRhbCBwZXItdW5pdCBmaXhlZC1wb2ludCBpbnRlcmVzdCBhbmQgcHJpbmNpcGFsIGFjY3J1ZWQKICAgIC8vICMgc2luY2UgdGhpcyBhY2NvdW50J3MgbGFzdCBjaGVja3BvaW50LgogICAgLy8gaW50ZXJlc3RfZGVsdGEgPSBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggLSBwb3NpdGlvbi5pbnRlcmVzdF9jaGVja3BvaW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCBleGlzdHMKICAgIGRpZyAxCiAgICBwdXNoaW50IDU3CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjY3CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IC0gcG9zaXRpb24ucHJpbmNpcGFsX2NoZWNrcG9pbnQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggZXhpc3RzCiAgICBkaWcgMgogICAgcHVzaGludCA2NQogICAgZXh0cmFjdF91aW50NjQKICAgIC0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3MwogICAgLy8gaW50ZXJlc3RfZGVsdGEsIHBvc2l0aW9uLnVuaXRzLCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICBkaWcgMgogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjcwLTc0CiAgICAvLyAjIENvbnZlcnQgdGhlIHBlci11bml0IGZpeGVkLXBvaW50IGRlbHRhcyBpbnRvIGFic29sdXRlIGNsYWltYWJsZSBhbW91bnRzCiAgICAvLyAjIHVzaW5nIHRoZSBhY2NvdW50J3MgYWN0aXZlIHVuaXRzLgogICAgLy8gY2xhaW1hYmxlX2ludGVyZXN0ID0gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgaW50ZXJlc3RfZGVsdGEsIHBvc2l0aW9uLnVuaXRzLCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICAvLyApCiAgICB1bmNvdmVyIDMKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzYKICAgIC8vIHByaW5jaXBhbF9kZWx0YSwgcG9zaXRpb24udW5pdHMsIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3NS03NwogICAgLy8gY2xhaW1hYmxlX3ByaW5jaXBhbCA9IHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIHByaW5jaXBhbF9kZWx0YSwgcG9zaXRpb24udW5pdHMsIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUKICAgIC8vICkKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzktODEKICAgIC8vICMgQWNjcnVlIHRoZSBjbGFpbWFibGUgYW1vdW50cyB0byB0aGUgYWNjb3VudCBwb3NpdGlvbiBhbmQgbWFrZSB0aGVtIGF2YWlsYWJsZQogICAgLy8gIyBmb3Igd2l0aGRyYXdhbC4KICAgIC8vIHBvc2l0aW9uLmNsYWltYWJsZV9pbnRlcmVzdCArPSBjbGFpbWFibGVfaW50ZXJlc3QKICAgIGRpZyAyCiAgICBwdXNoaW50IDczCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDIKICAgICsKICAgIGl0b2IKICAgIHVuY292ZXIgMwogICAgc3dhcAogICAgcmVwbGFjZTIgNzMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo4MgogICAgLy8gcG9zaXRpb24uY2xhaW1hYmxlX3ByaW5jaXBhbCArPSBjbGFpbWFibGVfcHJpbmNpcGFsCiAgICBkdXAKICAgIHB1c2hpbnQgODEKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgKwogICAgaXRvYgogICAgcmVwbGFjZTIgODEKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo4NC04NgogICAgLy8gIyBBZHZhbmNlIHRoZSBhY2NvdW50J3MgcGVyLXVuaXQgZml4ZWQtcG9pbnQgY2hlY2twb2ludHMgdG8gdGhlIGN1cnJlbnQgZ2xvYmFsCiAgICAvLyAjIHBlci11bml0IGZpeGVkLXBvaW50IGdsb2JhbCBpbmRpY2VzLgogICAgLy8gcG9zaXRpb24uaW50ZXJlc3RfY2hlY2twb2ludCA9IHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggZXhpc3RzCiAgICBpdG9iCiAgICByZXBsYWNlMiA1NwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojg3CiAgICAvLyBwb3NpdGlvbi5wcmluY2lwYWxfY2hlY2twb2ludCA9IHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggZXhpc3RzCiAgICBpdG9iCiAgICByZXBsYWNlMiA2NQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojg5LTkwCiAgICAvLyAjIEFkdmFuY2UgdGhlIGFjY291bnQncyBldmVudCBjdXJzb3IgdG8gdGhlIGN1cnJlbnQgZ2xvYmFsIGV2ZW50IGN1cnNvci4KICAgIC8vIHBvc2l0aW9uLnNldHRsZWRfY3Vyc29yID0gc2VsZi5ldmVudF9jdXJzb3IKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaXRvYgogICAgcmVwbGFjZTIgNDkKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo5Mi05NAogICAgLy8gIyBVcGRhdGUgdGhlIGFjY291bnQgcG9zaXRpb24gYW5kIHJldHVybiB0aGUgbmV3bHkgYWNjcnVlZCBjbGFpbWFibGUgYW1vdW50cwogICAgLy8gIyBhZGRlZCB0byB0aGUgdG90YWwgcG9zaXRpb24ncyBjbGFpbWFibGUgYW1vdW50cy4KICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gcG9zaXRpb24uY29weSgpCiAgICB1bmNvdmVyIDMKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo5NQogICAgLy8gcmV0dXJuIGNsYWltYWJsZV9pbnRlcmVzdCwgY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQoaG9sZGluZ19hZGRyZXNzOiBieXRlcykgLT4gdm9pZDoKX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQ6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6OTcKICAgIC8vIGRlZiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZChzZWxmLCBob2xkaW5nX2FkZHJlc3M6IEFjY291bnQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTAwCiAgICAvLyBpZiBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKToKICAgIGJ6IF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwMQogICAgLy8gcmV0dXJuCiAgICByZXRzdWIKCl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDMKICAgIC8vIHBvc2l0aW9uID0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY29weSgpCiAgICBmcmFtZV9kaWcgMgogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA0CiAgICAvLyBpZiBwb3NpdGlvbi5yZXNlcnZlZF91bml0cyA9PSBVSW50NjQoMCk6CiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIGJueiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZF9hZnRlcl9pZl9lbHNlQDQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDUKICAgIC8vIHJldHVybgogICAgcmV0c3ViCgpfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZF9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA4CiAgICAvLyBwb3NpdGlvbi51bml0cyArPSBhY3RpdmF0ZWRfdW5pdHMKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDMKICAgICsKICAgIGl0b2IKICAgIHJlcGxhY2UyIDMyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA5CiAgICAvLyBwb3NpdGlvbi5yZXNlcnZlZF91bml0cyA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGl0b2IKICAgIHJlcGxhY2UyIDQwCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTEwCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHBvc2l0aW9uLmNvcHkoKQogICAgZnJhbWVfZGlnIDIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTEKICAgIC8vIGFzc2VydCBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID49IGFjdGl2YXRlZF91bml0cywgZXJyLk9WRVJfRElTVFJJQlVUSU9OCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIGV4aXN0cwogICAgZHVwCiAgICBkaWcgMgogICAgPj0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgcmVtYWluaW5nIEQtQVNBIHVuaXRzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTEyCiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIC09IGFjdGl2YXRlZF91bml0cwogICAgc3dhcAogICAgLQogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9zY2FsZWRfbXVsX2RpdihtdWx0aXBsaWNhbmQ6IHVpbnQ2NCwgbXVsdGlwbGllcjogdWludDY0LCBkaXZpc29yOiB1aW50NjQpIC0+IHVpbnQ2NDoKX3NjYWxlZF9tdWxfZGl2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTUzLTE1NQogICAgLy8gZGVmIF9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLCBtdWx0aXBsaWNhbmQ6IFVJbnQ2NCwgbXVsdGlwbGllcjogVUludDY0LCBkaXZpc29yOiBVSW50NjQKICAgIC8vICkgLT4gVUludDY0OgogICAgcHJvdG8gMyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTcKICAgIC8vIGlmIG11bHRpcGxpY2FuZCA9PSBVSW50NjQoMCkgb3IgbXVsdGlwbGllciA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTMKICAgIGJ6IF9zY2FsZWRfbXVsX2Rpdl9pZl9ib2R5QDIKICAgIGZyYW1lX2RpZyAtMgogICAgYm56IF9zY2FsZWRfbXVsX2Rpdl9hZnRlcl9pZl9lbHNlQDMKCl9zY2FsZWRfbXVsX2Rpdl9pZl9ib2R5QDI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTgKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9zY2FsZWRfbXVsX2Rpdl9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTkKICAgIC8vIGhpZ2gsIGxvdyA9IG9wLm11bHcobXVsdGlwbGljYW5kLCBtdWx0aXBsaWVyKQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIG11bHcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2MAogICAgLy8gcmV0dXJuIG9wLmRpdncoaGlnaCwgbG93LCBkaXZpc29yKQogICAgZnJhbWVfZGlnIC0xCiAgICBkaXZ3CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYW1vdW50X3RvX2luZGV4X2RlbHRhKGFtb3VudDogdWludDY0KSAtPiB1aW50NjQ6Cl9hbW91bnRfdG9faW5kZXhfZGVsdGE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjIKICAgIC8vIGRlZiBfYW1vdW50X3RvX2luZGV4X2RlbHRhKHNlbGYsIGFtb3VudDogVUludDY0KSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2NAogICAgLy8gaWYgYW1vdW50ID09IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMQogICAgYm56IF9hbW91bnRfdG9faW5kZXhfZGVsdGFfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjUKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9hbW91bnRfdG9faW5kZXhfZGVsdGFfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTY2CiAgICAvLyBhc3NlcnQgc2VsZi50b3RhbF91bml0cyA+IFVJbnQ2NCgwKSwgZXJyLk5PX1VOSVRTCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgZHVwCiAgICBhc3NlcnQgLy8gTm8gRC1BU0EgdW5pdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2NwogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KGFtb3VudCwgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwgc2VsZi50b3RhbF91bml0cykKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2luZGV4X2RlbHRhX3RvX2Ftb3VudChpbmRleF9kZWx0YTogdWludDY0KSAtPiB1aW50NjQ6Cl9pbmRleF9kZWx0YV90b19hbW91bnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjkKICAgIC8vIGRlZiBfaW5kZXhfZGVsdGFfdG9fYW1vdW50KHNlbGYsIGluZGV4X2RlbHRhOiBVSW50NjQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTc2CiAgICAvLyBpZiBpbmRleF9kZWx0YSA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGJueiBfaW5kZXhfZGVsdGFfdG9fYW1vdW50X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTc3CiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfaW5kZXhfZGVsdGFfdG9fYW1vdW50X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE3OQogICAgLy8gc2VsZi50b3RhbF91bml0cywKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxODEKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNzgtMTgyCiAgICAvLyByZXR1cm4gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgc2VsZi50b3RhbF91bml0cywKICAgIC8vICAgICBpbmRleF9kZWx0YSwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2dldF9zY2hlZHVsZV9lbnRyeShldmVudF9pZDogdWludDY0KSAtPiBieXRlczoKX2dldF9zY2hlZHVsZV9lbnRyeToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIwMgogICAgLy8gZGVmIF9nZXRfc2NoZWR1bGVfZW50cnkoc2VsZiwgZXZlbnRfaWQ6IFVJbnQ2NCkgLT4gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnk6CiAgICBwcm90byAxIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIwNAogICAgLy8gYXNzZXJ0IGV2ZW50X2lkIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgPgogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgaWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE5MAogICAgLy8gcmV0dXJuIGV2ZW50X2lkIC8vIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDE2CiAgICAvCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMDYKICAgIC8vIGFzc2VydCBwYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxOTQKICAgIC8vIHJldHVybiBldmVudF9pZCAlIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDE2CiAgICAlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMDkKICAgIC8vIGFzc2VydCBvZmZzZXQgPCBwYWdlLmxlbmd0aCwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBwdXNoaW50IDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgMQogICAgPgogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjEwCiAgICAvLyByZXR1cm4gcGFnZVtvZmZzZXRdLmNvcHkoKQogICAgcHVzaGludCA2NQogICAgKgogICAgcHVzaGludCAyCiAgICArCiAgICBwdXNoaW50IDY1CiAgICBib3hfZXh0cmFjdAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKGNvbnRyYWN0X3R5cGU6IHVpbnQ2NCwgZXZlbnRfdHlwZTogdWludDY0KSAtPiB2b2lkOgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTMtMzE1CiAgICAvLyBkZWYgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIHNlbGYsIGNvbnRyYWN0X3R5cGU6IFVJbnQ2NCwgZXZlbnRfdHlwZTogVUludDY0CiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNDcKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNDgKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgaW50Y18yIC8vIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI0OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9NRCksCiAgICBwdXNoaW50IDE5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTAKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgcHVzaGludCAxMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU0LTI1NQogICAgLy8gIyBDaGVjayBjb21tb24gZXZlbnRzIGZpcnN0CiAgICAvLyBpZiBldmVudF90eXBlIGluIGNvbW1vbl9ldmVudHM6CiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjUxCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICBwdXNoaW50IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUA3CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU2CiAgICAvLyByZXR1cm4gVHJ1ZQogICAgaW50Y18xIC8vIDEKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICByZXRzdWIKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTgtMjU5CiAgICAvLyAjIENvbnRyYWN0LXNwZWNpZmljIGFkZGl0aW9uYWwgZXZlbnRzCiAgICAvLyBpZiBjb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9QQU0pOgogICAgZnJhbWVfZGlnIC0yCiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjYwLTI2MQogICAgLy8gIyBQQU0gb25seSBzdXBwb3J0cyBjb21tb24gZXZlbnRzCiAgICAvLyByZXR1cm4gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNjMKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0xBTSkgb3IgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2My0yNjUKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0xBTSkgb3IgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoCiAgICAvLyAgICAgZW51bXMuQ1RfTkFNCiAgICAvLyApOgogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDExCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMgogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDE2CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUAxMToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2Ni0yNzAKICAgIC8vICMgTEFNL05BTSBhZGQ6IFBSLCBJUENCCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjY4CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjY2LTI3MAogICAgLy8gIyBMQU0vTkFNIGFkZDogUFIsIElQQ0IKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDEzCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIHB1c2hpbnQgMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2Ni0yNzAKICAgIC8vICMgTEFNL05BTSBhZGQ6IFBSLCBJUENCCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICkKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF9mYWxzZUAxNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAxMzoKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDE0OgogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMTY6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzIKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTik6CiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMjMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3My0yNzgKICAgIC8vICMgQU5OIGFkZHM6IFBSLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjc1CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjczLTI3OAogICAgLy8gIyBBTk4gYWRkczogUFIsIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDIwCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIHB1c2hpbnQgMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3My0yNzgKICAgIC8vICMgQU5OIGFkZHM6IFBSLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyMAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzcKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIHB1c2hpbnQgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjczLTI3OAogICAgLy8gIyBBTk4gYWRkczogUFIsIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDIxCgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDIwOgogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMjE6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAyMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MAogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfTEFYKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA0CiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMzEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MS0yODcKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MwogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUiksCiAgICBwdXNoaW50IDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MS0yODcKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjgKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjg0CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjgxLTI4NwogICAgLy8gIyBMQVggYWRkczogUFIsIFBJLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyOAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODUKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICBwdXNoaW50IDE4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODEtMjg3CiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDI4CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODEtMjg3CiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDI5CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDI4OgogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMjk6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAzMToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4OQogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQ0xNKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA1CiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMzMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI5MC0yOTEKICAgIC8vICMgQ0xNIGFkZHM6IFBSCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1BSKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDMKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDMzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjkzCiAgICAvLyByZXR1cm4gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5faXNfZHluYW1pY19hbm51aXR5KCkgLT4gdWludDY0OgpfaXNfZHluYW1pY19hbm51aXR5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM1CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzUtMzM2CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIC8vIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGJ6IF9pc19keW5hbWljX2FubnVpdHlfYm9vbF9mYWxzZUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzYKICAgIC8vIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzNSAvLyAiZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM1LTMzNgogICAgLy8gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICAvLyBhbmQgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBieiBfaXNfZHluYW1pY19hbm51aXR5X2Jvb2xfZmFsc2VAMwogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMzNC0zMzcKICAgIC8vIHJldHVybiAoCiAgICAvLyAgICAgc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICAvLyAgICAgYW5kIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgLy8gKQogICAgcmV0c3ViCgpfaXNfZHluYW1pY19hbm51aXR5X2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzQtMzM3CiAgICAvLyByZXR1cm4gKAogICAgLy8gICAgIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKQogICAgLy8gICAgIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIC8vICkKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KGVudHJ5OiBieXRlcykgLT4gdWludDY0LCBieXRlczoKX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozODAKICAgIC8vIGRlZiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudChzZWxmLCBlbnRyeTogdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5CiAgICAvLyBlbnRyeS5hY2NydWFsX2ZhY3RvciA9PSBVSW50NjQoMCkKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAxNwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5LTM5MQogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGJ6IF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2lmX2JvZHlAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzkwCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5LTM5MQogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGJ6IF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2lmX2JvZHlAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzkxCiAgICAvLyBvciBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPT0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5LTM5MQogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGJueiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudF9hZnRlcl9pZl9lbHNlQDQKCl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2lmX2JvZHlAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5MwogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2RpZyAtMQogICAgdW5jb3ZlciAyCiAgICByZXRzdWIKCl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NQogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NgogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NC0zOTgKICAgIC8vIGFjY3J1ZWQgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICAvLyAgICAgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICkKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MDIKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozOTktNDAzCiAgICAvLyByZXR1cm4gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgYWNjcnVlZCwKICAgIC8vICAgICBlbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICBmcmFtZV9kaWcgLTEKICAgIHVuY292ZXIgMgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yKGRpc2NvdW50X2ZhY3RvcjogdWludDY0LCByZWRlbXB0aW9uX2ZhY3RvcjogdWludDY0KSAtPiB1aW50NjQ6Cl9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ2Mi00NjYKICAgIC8vIGRlZiBfZGlzY291bnRfYW5udWl0eV9mYWN0b3IoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBkaXNjb3VudF9mYWN0b3I6IFVJbnQ2NCwKICAgIC8vICAgICByZWRlbXB0aW9uX2ZhY3RvcjogVUludDY0LAogICAgLy8gKSAtPiBVSW50NjQ6CiAgICBwcm90byAyIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ2OAogICAgLy8gaWYgcmVkZW1wdGlvbl9mYWN0b3IgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0xCiAgICBibnogX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDY5CiAgICAvLyByZXR1cm4gZGlzY291bnRfZmFjdG9yCiAgICBmcmFtZV9kaWcgLTIKICAgIHJldHN1YgoKX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3MAogICAgLy8gcGVyaW9kX3JhdGUgPSBzZWxmLmZpeGVkX3BvaW50X3NjYWxlICsgc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzEKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzAtNDc0CiAgICAvLyBwZXJpb2RfcmF0ZSA9IHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgKyBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICByZWRlbXB0aW9uX2ZhY3RvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICBkaWcgMgogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgICsKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3NQogICAgLy8gYXNzZXJ0IHBlcmlvZF9yYXRlID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGR1cAogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDc4CiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDc2LTQ4MAogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIGRpc2NvdW50X2ZhY3RvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gICAgIHBlcmlvZF9yYXRlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkoZW50cnk6IGJ5dGVzLCBwYXlsb2FkOiBieXRlcykgLT4gYnl0ZXMsIGJ5dGVzOgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MTMtNjE1CiAgICAvLyBkZWYgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5KAogICAgLy8gICAgIHNlbGYsIGVudHJ5OiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSwgcGF5bG9hZDogdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0CiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAyIDIKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjIzCiAgICAvLyBhc3NlcnQgZW50cnkuZXZlbnRfaWQgPT0gc2VsZi5ldmVudF9jdXJzb3IsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGN1cnNvcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjI0CiAgICAvLyBhc3NlcnQgZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsIGVyci5OT19EVUVfQ0FTSEZMT1cKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPD0KICAgIGFzc2VydCAvLyBObyBkdWUgY2FzaGZsb3cgdG8gcGF5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MjYKICAgIC8vIGV2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYyNwogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX0lFRCk6CiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGR1cAogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYyOC02MzAKICAgIC8vICMgSUVEIGZpbmFsaXplcyBpc3N1YW5jZTogcmVzZXJ2ZWQgdW5pdHMgYmVjb21lIGFjdGl2YXRhYmxlIGFuZCB0aGUKICAgIC8vICMgc2NoZWR1bGUncyBpbml0aWFsIGNvbnRyYWN0dWFsIHN0YXRlIGJlY29tZXMgbGl2ZS4KICAgIC8vIGFzc2VydCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzIKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPT0gc2VsZi50b3RhbF91bml0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjMxLTYzMwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID09IHNlbGYudG90YWxfdW5pdHMKICAgIC8vICksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9JTkNPTVBMRVRFCiAgICBhc3NlcnQgLy8gUHJpbWFyeSBkaXN0cmlidXRpb24gaXMgbm90IGNvbXBsZXRlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzQKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM1CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzYKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAzMwogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzcKICAgIC8vIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM4CiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzkKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0MAogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX0FDVElWRSkKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgMTAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDUxCiAgICAvLyBhc3NlcnQgZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSA9PSBVSW50NjQoZW51bXMuRVZUX0lFRCksIGVyci5OT1RfRVZUX0lFRAogICAgZnJhbWVfZGlnIDExCiAgICBhc3NlcnQgLy8gTm90IElFRCBldmVudAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDUyCiAgICAvLyByZXR1cm4gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0MS02NDUKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1zZWxmLl9lbnRyeV9pZWRfYW1vdW50KGVudHJ5KSwKICAgIC8vICAgICBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0NAogICAgLy8gc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0MS02NDUKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1zZWxmLl9lbnRyeV9pZWRfYW1vdW50KGVudHJ5KSwKICAgIC8vICAgICBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICAvLyApCiAgICBjYWxsc3ViIF9lbWl0X2V4ZWN1dGlvbl9ldmVudAogICAgZHVwCiAgICBmcmFtZV9idXJ5IC0yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NDYKICAgIC8vIHJldHVybgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0OQogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ICs9IHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBmcmFtZV9idXJ5IC0yCiAgICArCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1MQogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1JSKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCAxMgogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMTAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1NQogICAgLy8gcGF5bG9hZC5vYnNlcnZlZF9yYXRlLAogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjU2CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzNyAvLyAicmF0ZV9yZXNldF9tdWx0aXBsaWVyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1NwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1Mi02NTgKICAgIC8vICMgUlIgZGVyaXZlcyB0aGUgbmV4dCByYXRlIGZyb20gYW4gb2JzZXJ2ZWQgb3JhY2xlIHZhbHVlIHBsdXMgdGhlCiAgICAvLyAjIGNvbnRyYWN0IHNwcmVhZCAvIG11bHRpcGxpZXIgdGVybXMsIHRoZW4gZW5mb3JjZXMgZmxvb3IgYW5kIGNhcC4KICAgIC8vIG9ic2VydmVkX3JhdGUgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBwYXlsb2FkLm9ic2VydmVkX3JhdGUsCiAgICAvLyAgICAgc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICkKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjAKICAgIC8vIG9ic2VydmVkX3JhdGUgKyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzYgLy8gInJhdGVfcmVzZXRfc3ByZWFkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkIGV4aXN0cwogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDEKICAgIC8vIGlmIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgYW5kIHJhdGUgPCBzZWxmLnJhdGVfcmVzZXRfZmxvb3I6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzkgLy8gImhhc19yYXRlX3Jlc2V0X2Zsb29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmhhc19yYXRlX3Jlc2V0X2Zsb29yIGV4aXN0cwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMSAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X2Zsb29yIGV4aXN0cwogICAgZnJhbWVfZGlnIDYKICAgID4KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDIKICAgIC8vIHJhdGUgPSBzZWxmLnJhdGVfcmVzZXRfZmxvb3IKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMSAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDYKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfZmxvb3IgZXhpc3RzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1NToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc0MwogICAgLy8gaWYgc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgYW5kIHJhdGUgPiBzZWxmLnJhdGVfcmVzZXRfY2FwOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQwIC8vICJoYXNfcmF0ZV9yZXNldF9jYXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwIGV4aXN0cwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTgKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMiAvLyAicmF0ZV9yZXNldF9jYXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9jYXAgZXhpc3RzCiAgICBmcmFtZV9kaWcgNgogICAgPAogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc0NAogICAgLy8gcmF0ZSA9IHNlbGYucmF0ZV9yZXNldF9jYXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMiAvLyAicmF0ZV9yZXNldF9jYXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSA2CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X2NhcCBleGlzdHMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjU5CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IHNlbGYuX2NsYW1wX3JhdGUoCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NTktNjYxCiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IHNlbGYuX2NsYW1wX3JhdGUoCiAgICAvLyAgICAgb2JzZXJ2ZWRfcmF0ZSArIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQKICAgIC8vICkKICAgIGZyYW1lX2RpZyA2CiAgICBhcHBfZ2xvYmFsX3B1dAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMTg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzEKICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QSSk6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMjAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY3MgogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzMKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDIzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc4CiAgICAvLyBpZiBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKToKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAyOQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc5CiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFJGKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCA1CiAgICA9PQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMzAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4MwogICAgLy8gKyAoc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCAtIHNlbGYuZXZlbnRfY3Vyc29yKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICAtCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODQKICAgIC8vICogVUludDY0KGNzdC5PUF9VUF9OT05fQ0FTSF9QRVJfRU5UUllfQlVER0VUKQogICAgcHVzaGludCAxMDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4My02ODQKICAgIC8vICsgKHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgLSBzZWxmLmV2ZW50X2N1cnNvcikKICAgIC8vICogVUludDY0KGNzdC5PUF9VUF9OT05fQ0FTSF9QRVJfRU5UUllfQlVER0VUKQogICAgKgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjgyCiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX05PTl9DQVNIX0JBU0VfQlVER0VUKQogICAgaW50YyA0IC8vIDE1MDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4Mi02ODQKICAgIC8vIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfQkFTRV9CVURHRVQpCiAgICAvLyArIChzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IC0gc2VsZi5ldmVudF9jdXJzb3IpCiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfUEVSX0VOVFJZX0JVREdFVCkKICAgICsKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4MC02ODYKICAgIC8vIGVuc3VyZV9idWRnZXQoCiAgICAvLyAgICAgcmVxdWlyZWRfYnVkZ2V0PSgKICAgIC8vICAgICAgICAgVUludDY0KGNzdC5PUF9VUF9OT05fQ0FTSF9CQVNFX0JVREdFVCkKICAgIC8vICAgICAgICAgKyAoc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCAtIHNlbGYuZXZlbnRfY3Vyc29yKQogICAgLy8gICAgICAgICAqIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfUEVSX0VOVFJZX0JVREdFVCkKICAgIC8vICAgICApLAogICAgLy8gKQogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDkwCiAgICAvLyBkaXNjb3VudF9mYWN0b3IgPSBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5MQogICAgLy8gZGVub21pbmF0b3IgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5MgogICAgLy8gc2tpcF9maXJzdF9yZWRlbXB0aW9uID0gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5NAogICAgLy8gaWYgZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAyNQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgZnJhbWVfYnVyeSA4CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAzNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDk1LTQ5OQogICAgLy8gIyBBbiBpbml0aWFsIFBSRiBtYXkgZGVzY3JpYmUgdGhlIGZpcnN0IHJlZGVtcHRpb24gcGVyaW9kIGRpcmVjdGx5LgogICAgLy8gZGlzY291bnRfZmFjdG9yID0gc2VsZi5fZGlzY291bnRfYW5udWl0eV9mYWN0b3IoCiAgICAvLyAgICAgZGlzY291bnRfZmFjdG9yLAogICAgLy8gICAgIGVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDgKICAgIGNhbGxzdWIgX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTAxCiAgICAvLyBza2lwX2ZpcnN0X3JlZGVtcHRpb24gPSBUcnVlCiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfYnVyeSA3CiAgICBmcmFtZV9idXJ5IDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDM1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTAzCiAgICAvLyBmdXR1cmVfZXZlbnRfaWQgPSBzZWxmLmV2ZW50X2N1cnNvciArIFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfd2hpbGVfdG9wQDM2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA0CiAgICAvLyB3aGlsZSBmdXR1cmVfZXZlbnRfaWQgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgZnJhbWVfZGlnIDMKICAgID4KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl93aGlsZUA0OAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA1CiAgICAvLyBmdXR1cmVfZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoZnV0dXJlX2V2ZW50X2lkKQogICAgZnJhbWVfZGlnIDMKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwNgogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPSBmdXR1cmVfZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MDctNTA4CiAgICAvLyAjIE9ubHkgcmVkZW1wdGlvbi1iZWFyaW5nIGV2ZW50cyBjb250cmlidXRlIHRvIHRoZSBhbm51aXR5IGRlbm9taW5hdG9yLgogICAgLy8gaXNfcmVkZW1wdGlvbl9ldmVudCA9IGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpIG9yICgKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwNy01MTEKICAgIC8vICMgT25seSByZWRlbXB0aW9uLWJlYXJpbmcgZXZlbnRzIGNvbnRyaWJ1dGUgdG8gdGhlIGFubnVpdHkgZGVub21pbmF0b3IuCiAgICAvLyBpc19yZWRlbXB0aW9uX2V2ZW50ID0gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QUikgb3IgKAogICAgLy8gICAgIGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfTUQpCiAgICAvLyAgICAgYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICAvLyApCiAgICBibnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfdHJ1ZUA0MAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA5CiAgICAvLyBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgZnJhbWVfZGlnIDQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MDktNTEwCiAgICAvLyBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgLy8gYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF9mYWxzZUA0MQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTEwCiAgICAvLyBhbmQgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IgPiBVSW50NjQoMCkKICAgIGZyYW1lX2RpZyAwCiAgICBwdXNoaW50IDI1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA5LTUxMAogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCkKICAgIC8vIGFuZCBmdXR1cmVfZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX3RydWVANDA6CiAgICBpbnRjXzEgLy8gMQoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfbWVyZ2VANDI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTIKICAgIC8vIGlmIGlzX3JlZGVtcHRpb25fZXZlbnQ6CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA0NwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTEzCiAgICAvLyBpZiBza2lwX2ZpcnN0X3JlZGVtcHRpb246CiAgICBmcmFtZV9kaWcgNwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUA0NQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTE0CiAgICAvLyBza2lwX2ZpcnN0X3JlZGVtcHRpb24gPSBGYWxzZQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgNwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANDc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjEKICAgIC8vIGZ1dHVyZV9ldmVudF9pZCArPSBVSW50NjQoMSkKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV93aGlsZV90b3BAMzYKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlANDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTgKICAgIC8vIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZnJhbWVfZGlnIDAKICAgIHB1c2hpbnQgMjUKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTYtNTE5CiAgICAvLyBkaXNjb3VudF9mYWN0b3IgPSBzZWxmLl9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcigKICAgIC8vICAgICBkaXNjb3VudF9mYWN0b3IsCiAgICAvLyAgICAgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMgogICAgc3dhcAogICAgY2FsbHN1YiBfZGlzY291bnRfYW5udWl0eV9mYWN0b3IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjAKICAgIC8vIGRlbm9taW5hdG9yICs9IGRpc2NvdW50X2ZhY3RvcgogICAgZnJhbWVfZGlnIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA0NwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDE6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF9tZXJnZUA0MgoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX3doaWxlQDQ4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTIzCiAgICAvLyBhc3NlcnQgZGVub21pbmF0b3IgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZnJhbWVfZGlnIDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUyNAogICAgLy8gbnVtZXJhdG9yID0gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTI1CiAgICAvLyBpZiBlbnRyeS5mbGFncyAmIFVJbnQ2NChlbnVtcy5GTEFHX0lOSVRJQUxfUFJGKSA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNTcKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gOAogICAgJgogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDUwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjYtNTI3CiAgICAvLyAjIFN1YnNlcXVlbnQgUFJGIGV2ZW50cyBhbW9ydGl6ZSBib3RoIHByaW5jaXBhbCBhbmQgYWxyZWFkeSBhY2NydWVkIGNhcnJ5LgogICAgLy8gbnVtZXJhdG9yICs9IHNlbGYuYWNjcnVlZF9pbnRlcmVzdAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgICsKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDUwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTMwCiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTI4LTUzMgogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIG51bWVyYXRvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gICAgIGRlbm9taW5hdG9yLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDEKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODcKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IHNlbGYuX3JlY2FsY3VsYXRlX2FubnVpdHlfcGF5bWVudCgKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njg3LTY4OQogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gc2VsZi5fcmVjYWxjdWxhdGVfYW5udWl0eV9wYXltZW50KAogICAgLy8gICAgIGVudHJ5CiAgICAvLyApCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMzA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OTIKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY5My02OTcKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1VSW50NjQoMCksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OTUKICAgIC8vIHBheW9mZj1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njk2CiAgICAvLyBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY5My02OTcKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1VSW50NjQoMCksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgY2FsbHN1YiBfZW1pdF9leGVjdXRpb25fZXZlbnQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDI5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjkxCiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDMwCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDIwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc0CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9JUENCKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCAxOAogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDIzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzUtNjc2CiAgICAvLyAjIElQQ0Iga2VlcHMgcHJpbmNpcGFsIHVuY2hhbmdlZCBhbmQgb25seSByZXNldHMgdGhlIGludGVyZXN0IGJhc2UuCiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIGIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMjMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMTA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjIKICAgIC8vIGVsaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1JSRik6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgMTEKICAgID09CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDE0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjMKICAgIC8vIG5leHRfcmF0ZSA9IGVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY0CiAgICAvLyBpZiBuZXh0X3JhdGUgPT0gVUludDY0KDApOgogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDEzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjUKICAgIC8vIG5leHRfcmF0ZSA9IHNlbGYucmF0ZV9yZXNldF9uZXh0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzggLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDUKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfbmV4dCBleGlzdHMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY2CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IG5leHRfcmF0ZQogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgZnJhbWVfZGlnIDUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDE0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY4CiAgICAvLyBpZiBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSAhPSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgOQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2OQogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPSBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZQogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgZnJhbWVfZGlnIDkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KGVudHJ5OiBieXRlcywgcGF5b2ZmOiB1aW50NjQsIHNldHRsZWRfYW1vdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpfZW1pdF9leGVjdXRpb25fZXZlbnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MDMtNzA5CiAgICAvLyBkZWYgX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgKiwKICAgIC8vICAgICBlbnRyeTogdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnksCiAgICAvLyAgICAgcGF5b2ZmOiBVSW50NjQsCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ6IFVJbnQ2NCwKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDMgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzEzCiAgICAvLyBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25JRAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE0CiAgICAvLyBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIGZyYW1lX2RpZyAtMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTUKICAgIC8vIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIGZyYW1lX2RpZyAtMwogICAgZXh0cmFjdCA4IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxNgogICAgLy8gc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICBmcmFtZV9kaWcgLTMKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTcKICAgIC8vIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MjAKICAgIC8vIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIGZyYW1lX2RpZyAtMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE1CiAgICAvLyBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICBpbnRjXzIgLy8gOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIwCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBnZXRieXRlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDkKICAgIC8vIGlmIHBheW9mZiA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJueiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NTAKICAgIC8vIHJldHVybiBVSW50NjQoZW51bXMuUEFZT0ZGX1NJR05fUE9TSVRJVkUpCiAgICBpbnRjXzEgLy8gMQoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX3BheW9mZl9zaWduQDc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTktNzIxCiAgICAvLyBwYXlvZmZfc2lnbj1hcmM0LlVJbnQ4KAogICAgLy8gICAgIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIC8vICksCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgaW50Y18yIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MjMKICAgIC8vIGN1cnJlbmN5X2lkPXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzI0CiAgICAvLyBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTItNzI1CiAgICAvLyBFeGVjdXRpb25FdmVudCgKICAgIC8vICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIC8vICAgICBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYXBwbGllZF9hdD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICBwYXlvZmY9cGF5b2ZmLAogICAgLy8gICAgIHBheW9mZl9zaWduPWFyYzQuVUludDgoCiAgICAvLyAgICAgICAgIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIC8vICAgICApLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PXNldHRsZWRfYW1vdW50LAogICAgLy8gICAgIGN1cnJlbmN5X2lkPXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAwCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzExLTcyNgogICAgLy8gYXJjNC5lbWl0KAogICAgLy8gICAgIEV4ZWN1dGlvbkV2ZW50KAogICAgLy8gICAgICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgICAgIHBheW9mZj1wYXlvZmYsCiAgICAvLyAgICAgICAgIHBheW9mZl9zaWduPWFyYzQuVUludDgoCiAgICAvLyAgICAgICAgICAgICBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICAvLyAgICAgICAgICksCiAgICAvLyAgICAgICAgIHNldHRsZWRfYW1vdW50PXNldHRsZWRfYW1vdW50LAogICAgLy8gICAgICAgICBjdXJyZW5jeV9pZD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgICAgIHNlcXVlbmNlPWVudHJ5LmV2ZW50X2lkICsgVUludDY0KDEpLAogICAgLy8gICAgICkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDlhMzMyYjk1IC8vIG1ldGhvZCAiRXhlY3V0aW9uRXZlbnQodWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc1MQogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiAoVUludDY0KGVudW1zLkVWVF9JRUQpLCBVSW50NjQoZW51bXMuRVZUX1BJKSk6CiAgICBmcmFtZV9kaWcgNQogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBibnogX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2lmX2JvZHlANQogICAgZnJhbWVfZGlnIDUKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGJ6IF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pZl9lbHNlQDYKCl9lbWl0X2V4ZWN1dGlvbl9ldmVudF9pZl9ib2R5QDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NTIKICAgIC8vIHJldHVybiBVSW50NjQoZW51bXMuUEFZT0ZGX1NJR05fUE9TSVRJVkUpCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIwCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBiIF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9wYXlvZmZfc2lnbkA3CgpfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzUzCiAgICAvLyByZXR1cm4gVUludDY0KGVudW1zLlBBWU9GRl9TSUdOX05FR0FUSVZFKQogICAgcHVzaGludCAyNTUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcyMAogICAgLy8gc2VsZi5fcGF5b2ZmX3NpZ24oZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSwgcGF5b2ZmKQogICAgYiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fcGF5b2ZmX3NpZ25ANwoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9yb2xlX2lzX2FjdGl2ZShyb2xlX21hcDogYnl0ZXMsIHJvbGVfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NDoKX3JvbGVfaXNfYWN0aXZlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5CiAgICAvLyBkZWYgX3JvbGVfaXNfYWN0aXZlKHNlbGYsIHJvbGVfbWFwOiB0eXAuUmJhY1JvbGUsIHJvbGVfYWRkcmVzczogQWNjb3VudCkgLT4gYm9vbDoKICAgIHByb3RvIDIgMQogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTcKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAtNjQKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYxCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjIKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYxLTYyCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYxLTYzCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjMKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjItNjMKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgPj0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2MS02MwogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX21lcmdlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAtNjQKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKSAtPiB2b2lkOgpfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2NwogICAgLy8gYXNzZXJ0IHNlbGYuX2lzX2FycmFuZ2VyKFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTQKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgPT0gc2VsZi5hcnJhbmdlci52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE4IC8vIDB4NTIzYTQxNTI1MjIzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJyYW5nZXIgZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjY3CiAgICAvLyBhc3NlcnQgc2VsZi5faXNfYXJyYW5nZXIoVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkgLT4gdm9pZDoKX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg1CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuZGVmYXVsdGVkLCBlcnIuREVGQVVMVEVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzQgLy8gImRlZmF1bHRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kZWZhdWx0ZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRGVmYXVsdGVkCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKSAtPiB2b2lkOgpfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODgKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5jb250cmFjdF9zdXNwZW5kZWQsIGVyci5TVVNQRU5ERUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMyAvLyAiY29udHJhY3Rfc3VzcGVuZGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3N1c3BlbmRlZCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBTdXNwZW5kZWQgb3BlcmF0aW9ucwogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGVfaWQ6IHVpbnQ2NCkgLT4gdm9pZDoKX2Fzc2VydF92YWxpZF9yb2xlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkwCiAgICAvLyBkZWYgX2Fzc2VydF92YWxpZF9yb2xlKHNlbGYsIHJvbGVfaWQ6IFVJbnQ2NCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkxLTk5CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MgogICAgLy8gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgcHVzaGludCAyMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkxLTk5CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTMKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICBwdXNoaW50IDI1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEtOTkKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NAogICAgLy8gVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIHB1c2hpbnQgNDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MS05OQogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojk1CiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICBwdXNoaW50IDUwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEtOTkKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NgogICAgLy8gVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICBwdXNoaW50IDYwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEtOTkKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NwogICAgLy8gVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIHB1c2hpbnQgNzAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MS05OQogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojk4CiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICBwdXNoaW50IDgwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEtOTkKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBieiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9mYWxzZUA4CgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDc6CiAgICBpbnRjXzEgLy8gMQoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfbWVyZ2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MS05OQogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICByZXRzdWIKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX2ZhbHNlQDg6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9tZXJnZUA5Cg==", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCAzMiAxNTAwCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUgInN0YXR1cyIgImV2ZW50X2N1cnNvciIgInNjaGVkdWxlX2VudHJ5X2NvdW50IiAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIiAiZml4ZWRfcG9pbnRfc2NhbGUiICJhY2NydWVkX2ludGVyZXN0IiAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIgMHg0MTIzICJub21pbmFsX2ludGVyZXN0X3JhdGUiICJjb250cmFjdF90eXBlIiAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiICJyZXNlcnZlZF9wcmluY2lwYWwiICJ0b3RhbF91bml0cyIgIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iICJyZXNlcnZlZF9pbnRlcmVzdCIgImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIgMHg1MjNhNDE1MjUyMjMgInNldHRsZW1lbnRfYXNzZXRfaWQiICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIgMHg1MjNhNDE1NTU0MjMgMHg1MjNhNTA1OTQ0MjMgMHg1MjNhNGQ0ZTQ3MjMgMHg1MzIzIDB4NTIzYTRkNGY0MzIzIDB4NTIzYTU0NTI1MzIzIDB4NTIzYTRmNTA0NDIzICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiICJ0cmFuc2Zlcl9vcGVuaW5nX2RhdGUiICJ0cmFuc2Zlcl9jbG9zdXJlX2RhdGUiICJyYXRlX3Jlc2V0X2Zsb29yIiAicmF0ZV9yZXNldF9jYXAiICJjb250cmFjdF9zdXNwZW5kZWQiICJkZWZhdWx0ZWQiICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIiAicmF0ZV9yZXNldF9zcHJlYWQiICJyYXRlX3Jlc2V0X211bHRpcGxpZXIiICJyYXRlX3Jlc2V0X25leHQiICJoYXNfcmF0ZV9yZXNldF9mbG9vciIgImhhc19yYXRlX3Jlc2V0X2NhcCIgMHgwMCAicHJvc3BlY3R1c19oYXNoIiAicHJvc3BlY3R1c191cmwiICJkZW5vbWluYXRpb25fYXNzZXRfaWQiICJtYXR1cml0eV9kYXRlIiAiZGF5X2NvdW50X2NvbnZlbnRpb24iIDB4MDY4MTAxIDB4MDAwMAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4LTI5CiAgICAvLyAjIFJCQUMgUm9sZXMKICAgIC8vIHNlbGYuYXJyYW5nZXIgPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX0FSUkFOR0VSKQogICAgYnl0ZWMgMTggLy8gMHg1MjNhNDE1MjUyMjMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMAogICAgLy8gc2VsZi5vcF9kYWVtb24gPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX09QX0RBRU1PTikKICAgIGJ5dGVjIDI3IC8vIDB4NTIzYTRmNTA0NDIzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NDctNDgKICAgIC8vICMgQ29udHJhY3QgR292ZXJuYW5jZQogICAgLy8gc2VsZi5jb250cmFjdF9zdXNwZW5kZWQgPSBGYWxzZQogICAgYnl0ZWMgMzMgLy8gImNvbnRyYWN0X3N1c3BlbmRlZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjUwLTUxCiAgICAvLyAjIENvbnRyYWN0IFBlcmZvcm1hbmNlCiAgICAvLyBzZWxmLmRlZmF1bHRlZCA9IEZhbHNlCiAgICBieXRlYyAzNCAvLyAiZGVmYXVsdGVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1Ni01NwogICAgLy8gIyBDb250cmFjdAogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKQogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OAogICAgLy8gc2VsZi5jb250cmFjdF90eXBlID0gVUludDY0KCkKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MC02MQogICAgLy8gIyBQcm9zcGVjdHVzIChJbmZvcm1hdGlvbmFsKQogICAgLy8gc2VsZi5wcm9zcGVjdHVzX2hhc2ggPSBCeXRlcygpCiAgICBieXRlYyA0MiAvLyAicHJvc3BlY3R1c19oYXNoIgogICAgcHVzaGJ5dGVzIDB4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjIKICAgIC8vIHNlbGYucHJvc3BlY3R1c191cmwgPSBTdHJpbmcoKQogICAgYnl0ZWMgNDMgLy8gInByb3NwZWN0dXNfdXJsIgogICAgcHVzaGJ5dGVzICIiCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjQtNjUKICAgIC8vICMgRGVub21pbmF0aW9uCiAgICAvLyBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCA9IEFzc2V0KCkKICAgIGJ5dGVjIDQ0IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBBc3NldCgpCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjgtNjkKICAgIC8vICMgVGltZQogICAgLy8gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGUgPSB0eXAuVGltZVN0YW1wKCkKICAgIGJ5dGVjIDI4IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcwCiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSB0eXAuVGltZVN0YW1wKCkKICAgIGJ5dGVjIDQ1IC8vICJtYXR1cml0eV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MQogICAgLy8gc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgPSB0eXAuVGltZVN0YW1wKCkKICAgIGJ5dGVjIDI5IC8vICJ0cmFuc2Zlcl9vcGVuaW5nX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcyCiAgICAvLyBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgMzAgLy8gInRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzQtNzUKICAgIC8vICMgRGF5IENvdW50IENvbnZlbnRpb24KICAgIC8vIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPSBVSW50NjQoKQogICAgYnl0ZWMgNDYgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3Ny03OAogICAgLy8gIyBVbml0cwogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IFVJbnQ2NCgpCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc5CiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID0gVUludDY0KCkKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODEtODIKICAgIC8vICMgUHJpbmNpcGFsCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID0gVUludDY0KCkKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODMKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gVUludDY0KCkKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODUKICAgIC8vIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiA9IEZhbHNlCiAgICBieXRlYyAzNSAvLyAiZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODctODgKICAgIC8vICMgSW50ZXJlc3QKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OQogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ID0gVUludDY0KCkKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkxLTkyCiAgICAvLyAjIEludGVyZXN0IFJhdGVzCiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzCiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkID0gVUludDY0KCkKICAgIGJ5dGVjIDM2IC8vICJyYXRlX3Jlc2V0X3NwcmVhZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9tdWx0aXBsaWVyID0gVUludDY0KCkKICAgIGJ5dGVjIDM3IC8vICJyYXRlX3Jlc2V0X211bHRpcGxpZXIiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfZmxvb3IgPSBVSW50NjQoKQogICAgYnl0ZWMgMzEgLy8gInJhdGVfcmVzZXRfZmxvb3IiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfY2FwID0gVUludDY0KCkKICAgIGJ5dGVjIDMyIC8vICJyYXRlX3Jlc2V0X2NhcCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTcKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9uZXh0ID0gVUludDY0KCkKICAgIGJ5dGVjIDM4IC8vICJyYXRlX3Jlc2V0X25leHQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4CiAgICAvLyBzZWxmLmhhc19yYXRlX3Jlc2V0X2Zsb29yID0gRmFsc2UKICAgIGJ5dGVjIDM5IC8vICJoYXNfcmF0ZV9yZXNldF9mbG9vciIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTkKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwID0gRmFsc2UKICAgIGJ5dGVjIDQwIC8vICJoYXNfcmF0ZV9yZXNldF9jYXAiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMS0xMDIKICAgIC8vICMgUHJpbWFyeSBEaXN0cmlidXRpb24KICAgIC8vIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsID0gVUludDY0KCkKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMwogICAgLy8gc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNS0xMDYKICAgIC8vICMgQ3VtdWxhdGl2ZSBQZXItVW5pdCBGaXhlZC1Qb2ludCBJbmRleGVzCiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggPSBVSW50NjQoKQogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNwogICAgLy8gc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNQogICAgLy8gc2VsZi5ldmVudF9jdXJzb3IgPSBVSW50NjQoKQogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTYKICAgIC8vIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgPSBVSW50NjQoKQogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExOC0xMTkKICAgIC8vICMgU2NhbGluZwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjIzCiAgICAvLyBhc3NlcnQgVHhuLmdsb2JhbF9udW1fYnl0ZV9zbGljZSA9PSBjZmcuR0xPQkFMX0JZVEVTLCBlcnIuV1JPTkdfR0xPQkFMX0JZVEVTCiAgICB0eG4gR2xvYmFsTnVtQnl0ZVNsaWNlCiAgICBwdXNoaW50IDEwCiAgICA9PQogICAgYXNzZXJ0IC8vIFdyb25nIEdsb2JhbCBCeXRlcyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6MjQKICAgIC8vIGFzc2VydCBUeG4uZ2xvYmFsX251bV91aW50ID09IGNmZy5HTE9CQUxfVUlOVFMsIGVyci5XUk9OR19HTE9CQUxfVUlOVFMKICAgIHR4biBHbG9iYWxOdW1VaW50CiAgICBwdXNoaW50IDU0CiAgICA9PQogICAgYXNzZXJ0IC8vIFdyb25nIEdsb2JhbCBVSW50cyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6MjUKICAgIC8vIGFzc2VydCBUeG4ubG9jYWxfbnVtX2J5dGVfc2xpY2UgPT0gY2ZnLkxPQ0FMX0JZVEVTLCBlcnIuV1JPTkdfTE9DQUxfQllURVMKICAgIHR4biBMb2NhbE51bUJ5dGVTbGljZQogICAgIQogICAgYXNzZXJ0IC8vIFdyb25nIExvY2FsIEJ5dGVzIGFsbG9jYXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kX2FzYS9jb250cmFjdC5weToyNgogICAgLy8gYXNzZXJ0IFR4bi5sb2NhbF9udW1fdWludCA9PSBjZmcuTE9DQUxfVUlOVFMsIGVyci5XUk9OR19MT0NBTF9VSU5UUwogICAgdHhuIExvY2FsTnVtVWludAogICAgIQogICAgYXNzZXJ0IC8vIFdyb25nIExvY2FsIFVJbnRzIGFsbG9jYXRpb24KCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjgtMTgKICAgIC8vIGNsYXNzIERBU0EoCiAgICAvLyAgICAgUGF5bWVudEFnZW50LAogICAgLy8gICAgIFRyYW5zZmVyQWdlbnQsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyAgICAgYXZtX3ZlcnNpb249MTIsCiAgICAvLyApOgogICAgcHVzaGJ5dGVzIDB4OTE0ZjA0ZWIgLy8gbWV0aG9kICJjb250cmFjdF91cGRhdGUoKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX2NvbnRyYWN0X3VwZGF0ZV9yb3V0ZUA0CgptYWluX3N3aXRjaF9jYXNlX25leHRANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kX2FzYS9jb250cmFjdC5weTo4LTE4CiAgICAvLyBjbGFzcyBEQVNBKAogICAgLy8gICAgIFBheW1lbnRBZ2VudCwKICAgIC8vICAgICBUcmFuc2ZlckFnZW50LAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gICAgIGF2bV92ZXJzaW9uPTEyLAogICAgLy8gKToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJ6IG1haW5fY3JlYXRlX05vT3BAMzMKICAgIHB1c2hieXRlc3MgMHhiNDQ2MThjOCAweGU3ODMyNTI5IDB4OTQzODg3MjMgMHg2Yzg1ZTNlZSAweGJkZDFhOTQ0IDB4N2MwZjE4MTIgMHgxNGZjMTBlZiAweDc0YTcyOTdmIDB4MDlkNGZlMTQgMHg5YTliZmE4NSAweDg1ZWVkMzNkIDB4YWIyYzBmYzQgMHhkOWYyMjVhYyAweDk4ODM1MDVhIDB4OGVhNmU3NGMgMHgwMmFmNTU3YSAweDgyZjcxYjJkIDB4ZWYwNGY1ZDMgMHhkZjM0MzU1MCAweDNkYmU4MGJkIDB4MWUzZTQ4ZTcgMHgzOTI0MWZhMyAweDAxMGM4Mjk5IDB4NzQwNmFjZDIgMHgxYTcyYTJlZSAvLyBtZXRob2QgImZ1bmRfZHVlX2Nhc2hmbG93cyh1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJjbGFpbV9kdWVfY2FzaGZsb3dzKGFkZHJlc3MsYnl0ZVtdKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYnl0ZVtdKSIsIG1ldGhvZCAidHJhbnNmZXJfc2V0X3NjaGVkdWxlKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbihhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInRyYW5zZmVyKGFkZHJlc3MsYWRkcmVzcyx1aW50NjQpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X3N1c3BlbnNpb24oYWRkcmVzcyxib29sKXVpbnQ2NCIsIG1ldGhvZCAiYWNjb3VudF9vcGVuKGFkZHJlc3MsYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgImFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzcyhhZGRyZXNzLGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X2dldF9wb3NpdGlvbihhZGRyZXNzKShhZGRyZXNzLHVpbnQ2NCx1aW50NjQsYm9vbCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAiY29udHJhY3RfY29uZmlnKCh1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxib29sLGJvb2wsYm9vbCx1aW50NjQpLCh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCksKGJ5dGVbMzJdLHN0cmluZykpdWludDY0IiwgbWV0aG9kICJjb250cmFjdF9zY2hlZHVsZSh1aW50NjQsYm9vbCwodWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NClbXSl1aW50NjQiLCBtZXRob2QgImNvbnRyYWN0X2V4ZWN1dGVfaWVkKCl1aW50NjQiLCBtZXRob2QgImFwcGx5X25vbl9jYXNoX2V2ZW50KHVpbnQ2NCwodWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIsIG1ldGhvZCAiYXBwZW5kX29ic2VydmVkX2Nhc2hfZXZlbnQoKHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIsIG1ldGhvZCAiY29udHJhY3RfZ2V0X3N0YXRlKCkodWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudCgpKHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJyYmFjX3JvdGF0ZV9hcnJhbmdlcihhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19zZXRfb3BfZGFlbW9uKGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX2Fzc2lnbl9yb2xlKHVpbnQ4LGFkZHJlc3MsKHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19yZXZva2Vfcm9sZSh1aW50OCxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19jb250cmFjdF9zdXNwZW5zaW9uKGJvb2wpdWludDY0IiwgbWV0aG9kICJyYmFjX2NvbnRyYWN0X2RlZmF1bHQoYm9vbCl1aW50NjQiLCBtZXRob2QgInJiYWNfZ2V0X2FycmFuZ2VyKClhZGRyZXNzIiwgbWV0aG9kICJyYmFjX2dldF9hZGRyZXNzX3JvbGVzKGFkZHJlc3MpKGJvb2wsYm9vbCxib29sLGJvb2wsYm9vbCkiLCBtZXRob2QgInJiYWNfZ2V0X3JvbGVfdmFsaWRpdHkodWludDgsYWRkcmVzcykodWludDY0LHVpbnQ2NCkiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBmdW5kX2R1ZV9jYXNoZmxvd3MgY2xhaW1fZHVlX2Nhc2hmbG93cyB0cmFuc2Zlcl9zZXRfc2NoZWR1bGUgcHJpbWFyeV9kaXN0cmlidXRpb24gdHJhbnNmZXIgYWNjb3VudF9zdXNwZW5zaW9uIGFjY291bnRfb3BlbiBhY2NvdW50X3VwZGF0ZV9wYXltZW50X2FkZHJlc3MgYWNjb3VudF9nZXRfcG9zaXRpb24gY29udHJhY3RfY29uZmlnIGNvbnRyYWN0X3NjaGVkdWxlIGNvbnRyYWN0X2V4ZWN1dGVfaWVkIGFwcGx5X25vbl9jYXNoX2V2ZW50IGFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50IGNvbnRyYWN0X2dldF9zdGF0ZSBjb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnQgcmJhY19yb3RhdGVfYXJyYW5nZXIgcmJhY19zZXRfb3BfZGFlbW9uIHJiYWNfYXNzaWduX3JvbGUgcmJhY19yZXZva2Vfcm9sZSByYmFjX2NvbnRyYWN0X3N1c3BlbnNpb24gcmJhY19jb250cmFjdF9kZWZhdWx0IHJiYWNfZ2V0X2FycmFuZ2VyIHJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXMgcmJhY19nZXRfcm9sZV92YWxpZGl0eQogICAgZXJyCgptYWluX2NyZWF0ZV9Ob09wQDMzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjgtMTgKICAgIC8vIGNsYXNzIERBU0EoCiAgICAvLyAgICAgUGF5bWVudEFnZW50LAogICAgLy8gICAgIFRyYW5zZmVyQWdlbnQsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyAgICAgYXZtX3ZlcnNpb249MTIsCiAgICAvLyApOgogICAgcHVzaGJ5dGVzIDB4OTU2ZDcxNTYgLy8gbWV0aG9kICJjb250cmFjdF9jcmVhdGUoYWRkcmVzcyl1aW50NjQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBjb250cmFjdF9jcmVhdGUKICAgIGVycgoKbWFpbl9jb250cmFjdF91cGRhdGVfcm91dGVANDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgNCAvLyBVcGRhdGVBcHBsaWNhdGlvbgogICAgPT0KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0CiAgICBiIGNvbnRyYWN0X3VwZGF0ZQoKCi8vIF9wdXlhX2xpYi51dGlsLmVuc3VyZV9idWRnZXQocmVxdWlyZWRfYnVkZ2V0OiB1aW50NjQsIGZlZV9zb3VyY2U6IHVpbnQ2NCkgLT4gdm9pZDoKZW5zdXJlX2J1ZGdldDoKICAgIHByb3RvIDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDEwCiAgICArCgplbnN1cmVfYnVkZ2V0X3doaWxlX3RvcEAxOgogICAgZnJhbWVfZGlnIDAKICAgIGdsb2JhbCBPcGNvZGVCdWRnZXQKICAgID4KICAgIGJ6IGVuc3VyZV9idWRnZXRfYWZ0ZXJfd2hpbGVANgogICAgaXR4bl9iZWdpbgogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGJ5dGVjIDQ3IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbQogICAgYnl0ZWMgNDcgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KICAgIGZyYW1lX2RpZyAtMQogICAgc3dpdGNoIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMEAzIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMUA0CgplbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX25leHRANToKICAgIGl0eG5fc3VibWl0CiAgICBiIGVuc3VyZV9idWRnZXRfd2hpbGVfdG9wQDEKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMUA0OgogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgaXR4bl9maWVsZCBGZWUKICAgIGIgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV9uZXh0QDUKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMEAzOgogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBiIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfbmV4dEA1CgplbnN1cmVfYnVkZ2V0X2FmdGVyX3doaWxlQDY6CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnBheW1lbnRfYWdlbnQuUGF5bWVudEFnZW50LmZ1bmRfZHVlX2Nhc2hmbG93c1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmZ1bmRfZHVlX2Nhc2hmbG93czoKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gMTMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjY4CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2OQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9jb250cmFjdF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9jb250cmFjdF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3MAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9jb250cmFjdF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9jb250cmFjdF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDcKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzIKICAgIC8vIGlmIHNlbGYuX2lzX2R5bmFtaWNfYW5udWl0eSgpOgogICAgY2FsbHN1YiBfaXNfZHluYW1pY19hbm51aXR5CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzYtNzcKICAgIC8vICsgbWF4X2V2ZW50X2NvdW50CiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfRlVORF9EVUVfQ0FTSEZMT1dTX1BFUl9FVkVOVF9CVURHRVQpCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3NwogICAgLy8gKiBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19QRVJfRVZFTlRfQlVER0VUKQogICAgcHVzaGludCAxMDAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3Ni03NwogICAgLy8gKyBtYXhfZXZlbnRfY291bnQKICAgIC8vICogVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfUEVSX0VWRU5UX0JVREdFVCkKICAgICoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3NQogICAgLy8gVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfQkFTRV9CVURHRVQpCiAgICBpbnRjIDQgLy8gMTUwMAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojc1LTc3CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19CQVNFX0JVREdFVCkKICAgIC8vICsgbWF4X2V2ZW50X2NvdW50CiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfRlVORF9EVUVfQ0FTSEZMT1dTX1BFUl9FVkVOVF9CVURHRVQpCiAgICArCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzMtNzkKICAgIC8vIGVuc3VyZV9idWRnZXQoCiAgICAvLyAgICAgcmVxdWlyZWRfYnVkZ2V0PSgKICAgIC8vICAgICAgICAgVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfQkFTRV9CVURHRVQpCiAgICAvLyAgICAgICAgICsgbWF4X2V2ZW50X2NvdW50CiAgICAvLyAgICAgICAgICogVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfUEVSX0VWRU5UX0JVREdFVCkKICAgIC8vICAgICApLAogICAgLy8gKQogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4MQogICAgLy8gcHJvY2Vzc2VkX2V2ZW50cyA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjgyCiAgICAvLyBmdW5kZWRfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDE0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODMKICAgIC8vIGZ1bmRlZF9wcmluY2lwYWwgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDEzCgpmdW5kX2R1ZV9jYXNoZmxvd3Nfd2hpbGVfdG9wQDQ6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODYKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgPCBtYXhfZXZlbnRfY291bnQKICAgIGRpZyA0CiAgICBkaWcgMQogICAgPAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojg2LTg3CiAgICAvLyBwcm9jZXNzZWRfZXZlbnRzIDwgbWF4X2V2ZW50X2NvdW50CiAgICAvLyBhbmQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAMTEKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4NwogICAgLy8gYW5kIHNlbGYuZXZlbnRfY3Vyc29yIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICA8CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODYtODcKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgPCBtYXhfZXZlbnRfY291bnQKICAgIC8vIGFuZCBzZWxmLmV2ZW50X2N1cnNvciA8IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQKICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl93aGlsZUAxMQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojg5CiAgICAvLyBlbnRyeSA9IHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLmV2ZW50X2N1cnNvcikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICBkdXAKICAgIGJ1cnkgMTcKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5MAogICAgLy8gaWYgZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcDoKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSAzCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDExCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6OTIKICAgIC8vIGlmIG5vdCBzZWxmLl9ldmVudF9pc19jYXNoKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkpOgogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBidXJ5IDE2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNTEKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgaW50Y18yIC8vIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM1MC0zNTQKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX01EKSwKICAgIC8vICkKICAgID09CiAgICBkdXAKICAgIGJ1cnkgNAogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX3RydWVANTIKICAgIGRpZyAxNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzUyCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzUwLTM1NAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfTUQpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDUyCiAgICBkaWcgMTQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM1MwogICAgLy8gVUludDY0KGVudW1zLkVWVF9NRCksCiAgICBwdXNoaW50IDE5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNTAtMzU0CiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9NRCksCiAgICAvLyApCiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VANTMKCmZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX3RydWVANTI6CiAgICBpbnRjXzEgLy8gMQoKZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfbWVyZ2VANTQ6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6OTIKICAgIC8vIGlmIG5vdCBzZWxmLl9ldmVudF9pc19jYXNoKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkpOgogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NDgKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF9pZCA9PSBzZWxmLmV2ZW50X2N1cnNvciwgZXJyLklOVkFMSURfRVZFTlRfQ1VSU09SCiAgICBkaWcgMTUKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgY3Vyc29yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NDkKICAgIC8vIGFzc2VydCBlbnRyeS5zY2hlZHVsZWRfdGltZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwgZXJyLk5PX0RVRV9DQVNIRkxPVwogICAgZGlnIDEKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIDw9CiAgICBhc3NlcnQgLy8gTm8gZHVlIGNhc2hmbG93IHRvIHBheQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDEzCiAgICAvLyBpZiBldmVudF90eXBlIG5vdCBpbiAoVUludDY0KGVudW1zLkVWVF9JUCksIFVJbnQ2NChlbnVtcy5FVlRfTUQpKToKICAgIGRpZyAyCiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTUKICAgIGRpZyAxNAogICAgcHVzaGludCAxOQogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDE0CiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAxMQoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X2ludGVyZXN0X2Ftb3VudEAxNjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQyNgogICAgLy8gZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGRpZyAxNQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSAxNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDI3CiAgICAvLyBpZiBldmVudF90eXBlIG5vdCBpbiAoVUludDY0KGVudW1zLkVWVF9QUiksIFVJbnQ2NChlbnVtcy5FVlRfTUQpKToKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxOQogICAgZGlnIDE0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MjgKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDYKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTUzCiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA9IGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBkaWcgMTUKICAgIHB1c2hpbnQgNDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBidXJ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1NgogICAgLy8gaWYgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCk6CiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUAyOQogICAgZGlnIDcKICAgIGJ1cnkgOQoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzItNTc0CiAgICAvLyAjIEZ1bmRpbmcgdXNlcyBwZXItdW5pdCBjdW11bGF0aXZlIGluZGljZXMgc28gZWFjaCBob2xkZXIgY2FuIHNldHRsZQogICAgLy8gIyBpbmRlcGVuZGVudGx5IGZyb20gaXRzIGN1cnJlbnQgdW5pdCBiYWxhbmNlLgogICAgLy8gaW50ZXJlc3RfaW5kZXhfZGVsdGEgPSBzZWxmLl9hbW91bnRfdG9faW5kZXhfZGVsdGEoaW50ZXJlc3RfYW1vdW50X2R1ZSkKICAgIGRpZyAxMAogICAgY2FsbHN1YiBfYW1vdW50X3RvX2luZGV4X2RlbHRhCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzUKICAgIC8vIHByaW5jaXBhbF9pbmRleF9kZWx0YSA9IHNlbGYuX2Ftb3VudF90b19pbmRleF9kZWx0YShwcmluY2lwYWxfYW1vdW50X2R1ZSkKICAgIGRpZyA2CiAgICBjYWxsc3ViIF9hbW91bnRfdG9faW5kZXhfZGVsdGEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU3NgogICAgLy8gaW50ZXJlc3RfYW1vdW50ID0gc2VsZi5faW5kZXhfZGVsdGFfdG9fYW1vdW50KGludGVyZXN0X2luZGV4X2RlbHRhKQogICAgZGlnIDEKICAgIGNhbGxzdWIgX2luZGV4X2RlbHRhX3RvX2Ftb3VudAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBidXJ5IDE1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzcKICAgIC8vIHByaW5jaXBhbF9hbW91bnQgPSBzZWxmLl9pbmRleF9kZWx0YV90b19hbW91bnQocHJpbmNpcGFsX2luZGV4X2RlbHRhKQogICAgZHVwCiAgICBjYWxsc3ViIF9pbmRleF9kZWx0YV90b19hbW91bnQKICAgIGR1cAogICAgYnVyeSAxMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTc4CiAgICAvLyByZXF1aXJlZF9hbW91bnQgPSBpbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50CiAgICBkaWcgMgogICAgZGlnIDEKICAgICsKICAgIGR1cAogICAgYnVyeSA5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MzQKICAgIC8vIGJhbGFuY2UgPSBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBvcHRlZCBpbnRvIGFzc2V0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NTYKICAgIC8vIHJldHVybiBzZWxmLnJlc2VydmVkX2ludGVyZXN0ICsgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICBkaWcgMQogICAgKwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzM2CiAgICAvLyBhc3NlcnQgYmFsYW5jZSA+PSByZXNlcnZlZF90b3RhbCwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGRpZyAyCiAgICBkaWcgMQogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzM3CiAgICAvLyByZXR1cm4gYmFsYW5jZSAtIHJlc2VydmVkX3RvdGFsCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIC0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4MAogICAgLy8gc2VsZi5fYXZhaWxhYmxlX3NldHRsZW1lbnRfZnVuZHMoKSA+PSByZXF1aXJlZF9hbW91bnQKICAgIHVuY292ZXIgMgogICAgPj0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU3OS01ODEKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5fYXZhaWxhYmxlX3NldHRsZW1lbnRfZnVuZHMoKSA+PSByZXF1aXJlZF9hbW91bnQKICAgIC8vICksIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcyBmb3IgdGhlIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4MwogICAgLy8gc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCArPSBpbnRlcmVzdF9hbW91bnQKICAgIHVuY292ZXIgMwogICAgKwogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4NAogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgKz0gcHJpbmNpcGFsX2Ftb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIGV4aXN0cwogICAgKwogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1ODUKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCArPSBpbnRlcmVzdF9pbmRleF9kZWx0YQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggZXhpc3RzCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4NgogICAgLy8gc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCArPSBwcmluY2lwYWxfaW5kZXhfZGVsdGEKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggZXhpc3RzCiAgICArCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTg3CiAgICAvLyBpZiBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpOgogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgcHVzaGludCAzCiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUA0MAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTg4LTU4OQogICAgLy8gIyBGb3IgUFIsIHRoZSBwZXJpb2QgaW50ZXJlc3Qgc3RheXMgYWNjcnVlZCB1bnRpbCBhIGxhdGVyIElQIG9yIE1ELgogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ICs9IHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZGlnIDE2CiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBidXJ5IDE4CiAgICArCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQxOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTkyCiAgICAvLyBpZiBub3Qgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCkgb3IgZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSA9PSBVSW50NjQoCiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDQzCiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTItNTk0CiAgICAvLyBpZiBub3Qgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCkgb3IgZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSA9PSBVSW50NjQoCiAgICAvLyAgICAgZW51bXMuRVZUX01ECiAgICAvLyApOgogICAgcHVzaGludCAxOQogICAgPT0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQ0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUA0MzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5NQogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gZW50cnkubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZGlnIDE1CiAgICBwdXNoaW50IDQxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTYKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGRpZyA4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTk3CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBuZXh0X2ludGVyZXN0X2Jhc2UKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBkaWcgOQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5OAogICAgLy8gc2VsZi5ldmVudF9jdXJzb3IgKz0gVUludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAwCiAgICAvLyBpZiBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoCiAgICBkaWcgMTUKICAgIGV4dHJhY3QgOCAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MDAtNjAyCiAgICAvLyBpZiBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoCiAgICAvLyAgICAgZW51bXMuRVZUX01ECiAgICAvLyApIGFuZCBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9PSBVSW50NjQoMCk6CiAgICBwdXNoYnl0ZXMgMHgxMwogICAgYj09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0NwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAyCiAgICAvLyApIGFuZCBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9PSBVSW50NjQoMCk6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwMC02MDIKICAgIC8vIGlmIGVudHJ5LmV2ZW50X3R5cGUgPT0gYXJjNC5VSW50OCgKICAgIC8vICAgICBlbnVtcy5FVlRfTUQKICAgIC8vICkgYW5kIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID09IFVJbnQ2NCgwKToKICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0NwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAzCiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbnVtcy5TVEFUVVNfRU5ERUQpCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBwdXNoaW50IDIwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwNAogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gVUludDY0KDApCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0NzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwNi02MTAKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1pbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50LAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PWludGVyZXN0X2Ftb3VudCArIHByaW5jaXBhbF9hbW91bnQsCiAgICAvLyApCiAgICBkaWcgMTUKICAgIGRpZyA0CiAgICBkdXAKICAgIGNhbGxzdWIgX2VtaXRfZXhlY3V0aW9uX2V2ZW50CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5NgogICAgLy8gZnVuZGVkX2ludGVyZXN0ICs9IGludGVyZXN0X2Ftb3VudAogICAgZGlnIDEzCiAgICBkaWcgMTIKICAgICsKICAgIGJ1cnkgMTQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5NwogICAgLy8gZnVuZGVkX3ByaW5jaXBhbCArPSBwcmluY2lwYWxfYW1vdW50CiAgICBkaWcgMTIKICAgIGRpZyA3CiAgICArCiAgICBidXJ5IDEzCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6OTgKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgKz0gVUludDY0KDEpCiAgICBkaWcgNAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgNQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3Nfd2hpbGVfdG9wQDQKCmZ1bmRfZHVlX2Nhc2hmbG93c19lbHNlX2JvZHlANDA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTEKICAgIC8vIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0MQoKZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlAMjk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTcKICAgIC8vIGV2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ1cnkgMTYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1OC01NjAKICAgIC8vICMgRHluYW1pYyBhbm51aXRpZXMgZGVyaXZlIG5leHQgc3RhdGUgZnJvbSB0aGUgcGF5bWVudCBkZWNvbXBvc2l0aW9uLAogICAgLy8gIyBub3Qgb25seSBmcm9tIHRoZSBwcmVjb21wdXRlZCBgbmV4dF8qYCBmaWVsZHMuCiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpOgogICAgcHVzaGludCAzCiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUAzMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTYyCiAgICAvLyBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCAtIHByaW5jaXBhbF9hbW91bnRfZHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGRpZyA2CiAgICAtCiAgICBkdXAKICAgIGJ1cnkgOQogICAgYnVyeSA5CiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDMxOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY1CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9JUCk6CiAgICBkaWcgMTQKICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUAzMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY2CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGJ1cnkgOQogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY3CiAgICAvLyBuZXh0X2ludGVyZXN0X2Jhc2UgPSBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGJ1cnkgMTAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgZXhpc3RzCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDMzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY4CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCk6CiAgICBkaWcgMTQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlAMzQKICAgIGRpZyA3CiAgICBidXJ5IDkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzgKCmZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDM0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY5CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTcwCiAgICAvLyBuZXh0X2ludGVyZXN0X2Jhc2UgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzgKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDI5CiAgICAvLyBpZiBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKToKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzMAogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKToKICAgIGRpZyAxNAogICAgcHVzaGludCAxOQogICAgPT0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDIyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzEKICAgIC8vIHJldHVybiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzIKICAgIC8vIGludGVyZXN0X2R1ZSA9IHNlbGYuYWNjcnVlZF9pbnRlcmVzdCArIHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZGlnIDE2CiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBidXJ5IDE4CiAgICArCiAgICBkdXAKICAgIGJ1cnkgMTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzMwogICAgLy8gaWYgc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIDw9IGludGVyZXN0X2R1ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIGV4aXN0cwogICAgPj0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDI0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzQKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzUKICAgIC8vIHByaW5jaXBhbF9hbW91bnQgPSBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gLSBpbnRlcmVzdF9kdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIGV4aXN0cwogICAgZGlnIDEwCiAgICAtCiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDM2CiAgICAvLyBpZiBwcmluY2lwYWxfYW1vdW50ID4gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWw6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgID4KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDI2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzcKICAgIC8vIHJldHVybiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjY6CiAgICBkaWcgNgogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTIKICAgIC8vIHByaW5jaXBhbF9hbW91bnRfZHVlID0gc2VsZi5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudChlbnRyeSkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnRAMjgKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDI3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDQwCiAgICAvLyBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA8PSBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZGlnIDE1CiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBkdXAyCiAgICA8PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDM5LTQ0MQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA8PSBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NDIKICAgIC8vIHJldHVybiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCAtIGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBzd2FwCiAgICAtCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MTUKICAgIC8vIHJldHVybiBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgKyBzZWxmLl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KGVudHJ5KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgIGRpZyAxNgogICAgY2FsbHN1YiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudAogICAgYnVyeSAxOAogICAgKwogICAgYnVyeSAxMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTUxCiAgICAvLyBpbnRlcmVzdF9hbW91bnRfZHVlID0gc2VsZi5fZW50cnlfaW50ZXJlc3RfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfaW50ZXJlc3RfYW1vdW50QDE2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAMTE6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTAwCiAgICAvLyBhc3NlcnQgcHJvY2Vzc2VkX2V2ZW50cyA+IFVJbnQ2NCgwKSwgZXJyLk5PX0RVRV9DQVNIRkxPVwogICAgZGlnIDQKICAgIGR1cAogICAgYXNzZXJ0IC8vIE5vIGR1ZSBjYXNoZmxvdyB0byBwYXkKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMDQKICAgIC8vIHRvdGFsX2Z1bmRlZD1mdW5kZWRfaW50ZXJlc3QgKyBmdW5kZWRfcHJpbmNpcGFsLAogICAgZGlnIDE0CiAgICBkdXAKICAgIGRpZyAxNQogICAgZHVwCiAgICBjb3ZlciAzCiAgICArCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA2CiAgICAvLyB0aW1lc3RhbXA9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTAxLTEwNwogICAgLy8gcmV0dXJuIHR5cC5DYXNoRnVuZGluZ1Jlc3VsdCgKICAgIC8vICAgICBmdW5kZWRfaW50ZXJlc3Q9ZnVuZGVkX2ludGVyZXN0LAogICAgLy8gICAgIGZ1bmRlZF9wcmluY2lwYWw9ZnVuZGVkX3ByaW5jaXBhbCwKICAgIC8vICAgICB0b3RhbF9mdW5kZWQ9ZnVuZGVkX2ludGVyZXN0ICsgZnVuZGVkX3ByaW5jaXBhbCwKICAgIC8vICAgICBwcm9jZXNzZWRfZXZlbnRzPXByb2Nlc3NlZF9ldmVudHMsCiAgICAvLyAgICAgdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUA1MzoKICAgIGludGNfMCAvLyAwCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDU0CgoKLy8gbW9kdWxlcy5wYXltZW50X2FnZW50LlBheW1lbnRBZ2VudC5jbGFpbV9kdWVfY2FzaGZsb3dzW3JvdXRpbmddKCkgLT4gdm9pZDoKY2xhaW1fZHVlX2Nhc2hmbG93czoKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cG4gMgogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNQogICAgLy8gaWYgc2VsZi5vcF9kYWVtb24udmFsdWUgIT0gR2xvYmFsLnplcm9fYWRkcmVzczoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNyAvLyAweDUyM2E0ZjUwNDQyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wX2RhZW1vbiBleGlzdHMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE3CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjcgLy8gMHg1MjNhNGY1MDQ0MjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcF9kYWVtb24gZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE3LTE5CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIGJueiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfdHJ1ZUAxNAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE4CiAgICAvLyBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgdHhuIFNlbmRlcgogICAgZGlnIDMKICAgID09CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTctMTkKICAgIC8vIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICAvLyBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgYm56IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDE0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTkKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCAzMgogICAgPT0KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNy0xOQogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICBieiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VAMTUKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDE0OgogICAgaW50Y18xIC8vIDEKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUAxNjoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNi0yMAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyAgICAgb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vICAgICBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgLy8gKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCgpjbGFpbV9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTc6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTM5CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2NvbnRyYWN0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2NvbnRyYWN0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE0MAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9jb250cmFjdF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9jb250cmFjdF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDcKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTQzCiAgICAvLyBzZWxmLl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKGhvbGRpbmdfYWRkcmVzcykKICAgIGRpZyAyCiAgICBkdXAKICAgIGNhbGxzdWIgX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNDQKICAgIC8vIHNlbGYuX3NldHRsZV9wb3NpdGlvbihob2xkaW5nX2FkZHJlc3MpCiAgICBjYWxsc3ViIF9zZXR0bGVfcG9zaXRpb24KICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExNwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY2xhaW1hYmxlX2ludGVyZXN0CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBkdXAKICAgIHB1c2hpbnQgNzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExOAogICAgLy8gKyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jbGFpbWFibGVfcHJpbmNpcGFsCiAgICBkdXAKICAgIHB1c2hpbnQgODEKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExNy0xMTgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNsYWltYWJsZV9pbnRlcmVzdAogICAgLy8gKyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jbGFpbWFibGVfcHJpbmNpcGFsCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTQ2CiAgICAvLyBhc3NlcnQgdG90YWxfYW1vdW50ID4gVUludDY0KDApLCBlcnIuTk9fRFVFX0NBU0hGTE9XCiAgICBhc3NlcnQgLy8gTm8gZHVlIGNhc2hmbG93IHRvIHBheQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI1CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MuaXNfb3B0ZWRfaW4oCiAgICBleHRyYWN0IDAgMzIKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNgogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNS0yNwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLmlzX29wdGVkX2luKAogICAgLy8gICAgIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZAogICAgLy8gKQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNS0yOAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLmlzX29wdGVkX2luKAogICAgLy8gICAgIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZAogICAgLy8gKQogICAgLy8gYW5kIG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQKICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAyNAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI4CiAgICAvLyBhbmQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCAzODQKICAgIGdldGJpdAogICAgYm56IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAyNAogICAgaW50Y18xIC8vIDEKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUAyNToKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNTEKICAgIC8vIGlmIHNlbGYuX2lzX3BheW1lbnRfZXhlY3V0YWJsZShob2xkaW5nX2FkZHJlc3MpOgogICAgYnogY2xhaW1fZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozNAogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIHN3YXAKICAgIGRpZyAxCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozNC0zNQogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIC8vID49IHBheW1lbnRfYW1vdW50CiAgICBkaWcgNQogICAgZHVwCiAgICBjb3ZlciAyCiAgICA+PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjMzLTM2CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICAvLyAgICAgPj0gcGF5bWVudF9hbW91bnQKICAgIC8vICksIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcyBmb3IgdGhlIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNTMKICAgIC8vIHNlbGYuX3BheShzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MsIHRvdGFsX2Ftb3VudCkKICAgIGRpZyAyCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBkdXAKICAgIGV4dHJhY3QgMCAzMgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQwLTQ1CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9cmVjZWl2ZXIsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWFtb3VudCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQ0CiAgICAvLyBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgdW5jb3ZlciAzCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIHVuY292ZXIgMgogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0MAogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgcHVzaGludCA0IC8vIGF4ZmVyCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQwLTQ1CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9cmVjZWl2ZXIsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWFtb3VudCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMjUtMTI2CiAgICAvLyAjIEdldCB0aGUgY2xhaW1hYmxlIGFtb3VudHMgYmVmb3JlIHJlc2V0CiAgICAvLyBpbnRlcmVzdF9hbW91bnQgPSBwb3NpdGlvbi5jbGFpbWFibGVfaW50ZXJlc3QKICAgIGR1cAogICAgcHVzaGludCA3MwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSA5CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTI3CiAgICAvLyBwcmluY2lwYWxfYW1vdW50ID0gcG9zaXRpb24uY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgZHVwCiAgICBwdXNoaW50IDgxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAzCiAgICBidXJ5IDkKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMjktMTMwCiAgICAvLyAjIFJlc2V0IHRoZSBwb3NpdGlvbidzIGNsYWltYWJsZSBhbW91bnRzCiAgICAvLyBwb3NpdGlvbi5jbGFpbWFibGVfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBpdG9iCiAgICBzd2FwCiAgICBkaWcgMQogICAgcmVwbGFjZTIgNzMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzEKICAgIC8vIHBvc2l0aW9uLmNsYWltYWJsZV9wcmluY2lwYWwgPSBVSW50NjQoMCkKICAgIHN3YXAKICAgIHJlcGxhY2UyIDgxCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTMyCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHBvc2l0aW9uLmNvcHkoKQogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTM0CiAgICAvLyBhc3NlcnQgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCA+PSBpbnRlcmVzdF9hbW91bnQsIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX2ludGVyZXN0IGV4aXN0cwogICAgZHVwCiAgICBkaWcgMgogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzNQogICAgLy8gYXNzZXJ0IHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsID49IHByaW5jaXBhbF9hbW91bnQsIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICBkaWcgMwogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzNy0xMzgKICAgIC8vICMgVXBkYXRlIHRoZSBnbG9iYWwgcmVzZXJ2ZWQgaW50ZXJlc3QgYW5kIHByaW5jaXBhbCBhbW91bnRzCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0IC09IGludGVyZXN0X2Ftb3VudAogICAgc3dhcAogICAgLQogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzkKICAgIC8vIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIC09IHByaW5jaXBhbF9hbW91bnQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIHN3YXAKICAgIC0KICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKY2xhaW1fZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTU5CiAgICAvLyB0b3RhbF9hbW91bnQ9aW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudCwKICAgIGRpZyA1CiAgICBkdXAKICAgIGRpZyA2CiAgICBkdXAKICAgIGNvdmVyIDMKICAgICsKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNjAKICAgIC8vIHRpbWVzdGFtcD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNTYtMTYyCiAgICAvLyByZXR1cm4gdHlwLkNhc2hDbGFpbVJlc3VsdCgKICAgIC8vICAgICBpbnRlcmVzdF9hbW91bnQ9aW50ZXJlc3RfYW1vdW50LAogICAgLy8gICAgIHByaW5jaXBhbF9hbW91bnQ9cHJpbmNpcGFsX2Ftb3VudCwKICAgIC8vICAgICB0b3RhbF9hbW91bnQ9aW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudCwKICAgIC8vICAgICB0aW1lc3RhbXA9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgY29udGV4dD1wYXltZW50X2luZm8sCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgMgogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIHB1c2hieXRlcyAweDAwMjIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAyNDoKICAgIGludGNfMCAvLyAwCiAgICBiIGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUAyNQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX2ZhbHNlQDE1OgogICAgaW50Y18wIC8vIDAKICAgIGIgY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDE2CgoKLy8gbW9kdWxlcy50cmFuc2Zlcl9hZ2VudC5UcmFuc2ZlckFnZW50LnRyYW5zZmVyX3NldF9zY2hlZHVsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRyYW5zZmVyX3NldF9zY2hlZHVsZToKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo0MAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQxCiAgICAvLyBhc3NlcnQgb3Blbl9kYXRlIDwgY2xvc3VyZV9kYXRlLCBlcnIuSU5WQUxJRF9TT1JUSU5HCiAgICBkdXAyCiAgICA8CiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbXVzdCBiZSBzb3J0ZWQgaW4gc3RyaWN0bHkgYXNjZW5kaW5nIG9yZGVyCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQzCiAgICAvLyBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA9IG9wZW5fZGF0ZQogICAgYnl0ZWMgMjkgLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIHVuY292ZXIgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDQKICAgIC8vIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlID0gY2xvc3VyZV9kYXRlCiAgICBieXRlYyAzMCAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDUKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy50cmFuc2Zlcl9hZ2VudC5UcmFuc2ZlckFnZW50LnByaW1hcnlfZGlzdHJpYnV0aW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcHJpbWFyeV9kaXN0cmlidXRpb246CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjczCiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5wcmltYXJ5X2RlYWxlciwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDIyIC8vIDB4NTIzYTUwNTk0NDIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojc2CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2NvbnRyYWN0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2NvbnRyYWN0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo3NwogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9jb250cmFjdF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9jb250cmFjdF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojc4CiAgICAvLyBhc3NlcnQgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TRUQKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBjbG9zZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgY292ZXIgMwogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4MAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChob2xkaW5nX2FkZHJlc3MpCiAgICBzd2FwCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjgxCiAgICAvLyBhc3NlcnQgdW5pdHMgPiBVSW50NjQoMCksIGVyci5aRVJPX1VOSVRTCiAgICBkdXAKICAgIGFzc2VydCAvLyBDYW4gbm90IGRpc3RyaWJ1dGUgemVybyB1bml0cwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4MwogICAgLy8gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCArIHVuaXRzIDw9IHNlbGYudG90YWxfdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICArCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgPD0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODItODQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCArIHVuaXRzIDw9IHNlbGYudG90YWxfdW5pdHMKICAgIC8vICksIGVyci5PVkVSX0RJU1RSSUJVVElPTgogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCByZW1haW5pbmcgRC1BU0EgdW5pdHMKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODUKICAgIC8vIGlmIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI4IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlIGV4aXN0cwogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojg3CiAgICAvLyBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8PSBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI4IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlIGV4aXN0cwogICAgPD0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODYtODgKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPD0gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGUKICAgIC8vICksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TRUQKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBjbG9zZWQKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNDgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnJlc2VydmVkX3VuaXRzICs9IHVuaXRzCiAgICBkdXBuIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDMKICAgIGR1cAogICAgY292ZXIgMwogICAgKwogICAgaXRvYgogICAgcHVzaGludCA0MAogICAgc3dhcAogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6OTEKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgKz0gdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICArCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6OTIKICAgIC8vIHJldHVybiBzZWxmLnRvdGFsX3VuaXRzIC0gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIHN3YXAKICAgIC0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMudHJhbnNmZXJfYWdlbnQuVHJhbnNmZXJBZ2VudC50cmFuc2Zlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnRyYW5zZmVyOgogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTMwCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2NvbnRyYWN0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2NvbnRyYWN0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxMzEKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfY29udHJhY3Rfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfY29udHJhY3Rfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQ3CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuX3N0YXR1c19pc19wZW5kaW5nX2llZCgpLCBlcnIuUEVORElOR19JRUQKICAgICEKICAgIGFzc2VydCAvLyBJRUQgbm90IHlldCBleGVjdXRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxMwogICAgLy8gaWYgc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjkgLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICBieiB0cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTUKICAgIC8vIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjkgLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNC0xNgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gKSwgZXJyLkNMT1NFRF9UUkFOU0ZFUgogICAgYXNzZXJ0IC8vIFRyYW5zZmVyIGlzIGNsb3NlZAoKdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNwogICAgLy8gaWYgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzAgLy8gInRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICBieiB0cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTkKICAgIC8vIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDwgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGUKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMCAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIDwKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTgtMjAKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZQogICAgLy8gKSwgZXJyLkNMT1NFRF9UUkFOU0ZFUgogICAgYXNzZXJ0IC8vIFRyYW5zZmVyIGlzIGNsb3NlZAoKdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxMzUKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIGRpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA4CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIGJ5dGVjIDggLy8gMHg0MTIzCiAgICBkaWcgNQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA5CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjEzOAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChzZW5kZXJfaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDIKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTM5CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGR1cAogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNDAKICAgIC8vIGFzc2VydCBzZW5kZXJfaG9sZGluZ19hZGRyZXNzICE9IHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcywgZXJyLlNFTEZfVFJBTlNGRVIKICAgIHVuY292ZXIgMgogICAgIT0KICAgIGFzc2VydCAvLyBTZW5kZXIgYW5kIHJlY2VpdmVyIG11c3QgYmUgZGlmZmVyZW50CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE0MQogICAgLy8gYXNzZXJ0IHVuaXRzID4gVUludDY0KDApLCBlcnIuTlVMTF9UUkFOU0ZFUgogICAgZGlnIDEKICAgIGR1cAogICAgYXNzZXJ0IC8vIFRyYW5zZmVyIHVuaXRzIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTQyCiAgICAvLyBhc3NlcnQgdW5pdHMgPD0gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLCBlcnIuT1ZFUl9UUkFOU0ZFUgogICAgc3dhcAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIDw9CiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IHNlbmRlciB1bml0cyB0byB0cmFuc2ZlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzYzCiAgICAvLyBpZiBzZWxmLmV2ZW50X2N1cnNvciA+PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICA+PQogICAgYm56IHRyYW5zZmVyX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Fzc2VydF9ub19kdWVfZXZlbnRfcGVuZGluZ0AxMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzY1CiAgICAvLyBuZXh0X2VudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KHNlbGYuZXZlbnRfY3Vyc29yKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc2NwogICAgLy8gbmV4dF9lbnRyeS5zY2hlZHVsZWRfdGltZSA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NjYtNzY4CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIG5leHRfZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gKSwgZXJyLlBFTkRJTkdfQUNUVVNfRVZFTlQKICAgIGFzc2VydCAvLyBBQ1RVUyBldmVudCBub3QgeWV0IGV4ZWN1dGVkCgp0cmFuc2Zlcl9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9hc3NlcnRfbm9fZHVlX2V2ZW50X3BlbmRpbmdAMTA6CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE0NQogICAgLy8gc2VsZi5fZW5zdXJlX3VuaXRzX2FjdGl2YXRlZChzZW5kZXJfaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDMKICAgIGR1cAogICAgY2FsbHN1YiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNDYKICAgIC8vIHNlbGYuX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQocmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgY2FsbHN1YiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNDcKICAgIC8vIHNlbGYuX3NldHRsZV9wb3NpdGlvbihzZW5kZXJfaG9sZGluZ19hZGRyZXNzKQogICAgY2FsbHN1YiBfc2V0dGxlX3Bvc2l0aW9uCiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTQ4CiAgICAvLyBzZWxmLl9zZXR0bGVfcG9zaXRpb24ocmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzKQogICAgY2FsbHN1YiBfc2V0dGxlX3Bvc2l0aW9uCiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNTIKICAgIC8vIGFzc2VydCB1bml0cyA8PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cywgZXJyLk9WRVJfVFJBTlNGRVIKICAgIGRpZyA1CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkaWcgMQogICAgPD0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgc2VuZGVyIHVuaXRzIHRvIHRyYW5zZmVyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTUzCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyAtPSB1bml0cwogICAgZGlnIDEKICAgIC0KICAgIGl0b2IKICAgIHVuY292ZXIgMgogICAgaW50Y18zIC8vIDMyCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTQ0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyArPSB1bml0cwogICAgZGlnIDUKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIHVuY292ZXIgMgogICAgKwogICAgaXRvYgogICAgaW50Y18zIC8vIDMyCiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfc3VzcGVuc2lvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfc3VzcGVuc2lvbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojc5CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyMSAvLyAweDUyM2E0MTU1NTQyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE4NQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkID0gc3VzcGVuZGVkCiAgICBkdXAKICAgIHB1c2hpbnQgNDgKICAgIGludGNfMSAvLyAxCiAgICBib3hfZXh0cmFjdAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMwogICAgc2V0Yml0CiAgICBwdXNoaW50IDQ4CiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE4NgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTY1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5hY2NvdW50X29wZW5bcm91dGluZ10oKSAtPiB2b2lkOgphY2NvdW50X29wZW46CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzAKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmFjY291bnRfbWFuYWdlciwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDIzIC8vIDB4NTIzYTRkNGU0NzIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzkKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0VOREVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDIwMAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTAKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX2VuZGVkKCksIGVyci5VTkFVVEhPUklaRUQKICAgICEKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxMQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9jb250cmFjdF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9jb250cmFjdF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTIKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfY29udHJhY3Rfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfY29udHJhY3Rfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjEzCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozNAogICAgLy8gdW5pdHM9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozMi00MgogICAgLy8gcmV0dXJuIHR5cC5BY2NvdW50UG9zaXRpb24oCiAgICAvLyAgICAgcGF5bWVudF9hZGRyZXNzPXBheW1lbnRfYWRkcmVzcywKICAgIC8vICAgICB1bml0cz1VSW50NjQoMCksCiAgICAvLyAgICAgcmVzZXJ2ZWRfdW5pdHM9VUludDY0KDApLAogICAgLy8gICAgIHN1c3BlbmRlZD1GYWxzZSwKICAgIC8vICAgICBzZXR0bGVkX2N1cnNvcj1VSW50NjQoMCksCiAgICAvLyAgICAgaW50ZXJlc3RfY2hlY2twb2ludD1VSW50NjQoMCksCiAgICAvLyAgICAgcHJpbmNpcGFsX2NoZWNrcG9pbnQ9VUludDY0KDApLAogICAgLy8gICAgIGNsYWltYWJsZV9pbnRlcmVzdD1VSW50NjQoMCksCiAgICAvLyAgICAgY2xhaW1hYmxlX3ByaW5jaXBhbD1VSW50NjQoMCksCiAgICAvLyApCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGJ5dGVjIDQxIC8vIDB4MDAKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjE0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHNlbGYuX25ld19hY2NvdW50X3Bvc2l0aW9uKHBheW1lbnRfYWRkcmVzcykKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTUKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjM4CiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIHVuY292ZXIgMwogICAgPT0KICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIzOQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9jb250cmFjdF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9jb250cmFjdF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDAKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfY29udHJhY3Rfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfY29udHJhY3Rfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQxCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MgPSBwYXltZW50X2FkZHJlc3MKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQyCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfZ2V0X3Bvc2l0aW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF9nZXRfcG9zaXRpb246CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNTkKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9jcmVhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9jcmVhdGU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDE5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAzMwogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IGFycmFuZ2VyCiAgICBieXRlYyAxOCAvLyAweDUyM2E0MTUyNTIyMwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMzQKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAxOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfY29uZmlnW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfY29uZmlnOgogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBsZW4KICAgIHB1c2hpbnQgMTA3CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLk5vcm1hbGl6ZWRBY3R1c1Rlcm1zCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgcHVzaGludCA3MgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5Jbml0aWFsS2VybmVsU3RhdGUKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBsZW4KICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIHR1cGxlIGVuY29kaW5nCiAgICBkdXAKICAgIHB1c2hpbnQgMzQKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCB0YWlsIHBvaW50ZXIgYXQgaW5kZXggMSBvZiAodWludDhbMzJdLChsZW4rdXRmOFtdKSkKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgY292ZXIgMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMzYKICAgICsKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuUHJvc3BlY3R1cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2NgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDY4LTEwNjkKICAgIC8vICMgQ29uZmlndXJlIENvbnRyYWN0CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPSB0ZXJtcy5jb250cmFjdF90eXBlLmFzX3VpbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgYnogY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUA3CiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIyMAogICAgLy8gVUludDY0KGVudW1zLkNUX0FOTiksCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIxCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfTkFNKSwKICAgIHB1c2hpbnQgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIyCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfTEFNKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIzCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfTEFYKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjI0CiAgICAvLyBVSW50NjQoZW51bXMuQ1RfQ0xNKSwKICAgIHB1c2hpbnQgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJ6IGNvbnRyYWN0X2NvbmZpZ19ib29sX2ZhbHNlQDgKCmNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANzoKICAgIGludGNfMSAvLyAxCgpjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUA5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjI5CiAgICAvLyBhc3NlcnQgc2VsZi5faXNfc3VwcG9ydGVkX2NvbnRyYWN0X3R5cGUoY29udHJhY3RfdHlwZSksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3MQogICAgLy8gc2VsZi5fc3RvcmVfY29udHJhY3RfY29uZmlnKHNlbGYuY29udHJhY3RfdHlwZSwgdGVybXMsIGluaXRpYWxfc3RhdGUpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgYnVyeSAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzI1CiAgICAvLyBhc3NlcnQgdGVybXMuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZGlnIDQKICAgIGR1cAogICAgcHVzaGludCAzMwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSA4CiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMjcKICAgIC8vIHRlcm1zLmRheV9jb3VudF9jb252ZW50aW9uLmFzX3VpbnQ2NCgpCiAgICBwdXNoaW50IDU3CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICBieiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDE2CiAgICBkaWcgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk5CiAgICAvLyBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI5Ny0zMDMKICAgIC8vIHJldHVybiBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzYwKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwSVNEQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjApLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDE2CiAgICBkaWcgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzAwCiAgICAvLyBVSW50NjQoZW51bXMuRENDX0EzNjUpLAogICAgcHVzaGludCAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyOTctMzAzCiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgID09CiAgICBibnogY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUAxNgogICAgZGlnIDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMwMQogICAgLy8gVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGRpZyA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDIKICAgIC8vIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICA9PQogICAgYnogY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAMTcKCmNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTY6CiAgICBpbnRjXzEgLy8gMQoKY29udHJhY3RfY29uZmlnX2Jvb2xfbWVyZ2VAMTg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDktMzExCiAgICAvLyBhc3NlcnQgc2VsZi5faXNfc3VwcG9ydGVkX2RheV9jb3VudF9jb252ZW50aW9uKAogICAgLy8gICAgIGRheV9jb3VudF9jb252ZW50aW9uCiAgICAvLyApLCBlcnIuSU5WQUxJRF9EQVlfQ09VTlRfQ09OVkVOVElPTgogICAgYXNzZXJ0IC8vIEludmFsaWQgZGF5LWNvdW50IGNvbnZlbnRpb24gSUQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMyOQogICAgLy8gaWYgY29udHJhY3RfdHlwZSAhPSBVSW50NjQoZW51bXMuQ1RfQU5OKToKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgICE9CiAgICBieiBjb250cmFjdF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzMwCiAgICAvLyBhc3NlcnQgbm90IHRlcm1zLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24sIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZGlnIDQKICAgIHB1c2hpbnQgNzg2CiAgICBnZXRiaXQKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KCmNvbnRyYWN0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDIwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODA3CiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIEQtQVNBIGFscmVhZHkgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODA4CiAgICAvLyBhc3NlcnQgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCA9PSBVSW50NjQoMCksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMCAvLyAiaW5pdGlhbF9leGNoYW5nZV9hbW91bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTAtODExCiAgICAvLyAjIFNldCBEZW5vbWluYXRpb24gQXNzZXQKICAgIC8vIHNlbGYuX2Fzc2VydF9kZW5vbWluYXRpb25fYXNzZXQodGVybXMuZGVub21pbmF0aW9uX2Fzc2V0X2lkKQogICAgZGlnIDQKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NzUtNzc2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIGRlbm9taW5hdGlvbiB3aXRoIEFTQQogICAgLy8gX2NyZWF0b3IsIGV4aXN0cyA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X2NyZWF0b3IoZGVub21pbmF0aW9uX2Fzc2V0X2lkKQogICAgZHVwCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q3JlYXRvcgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NzcKICAgIC8vIGFzc2VydCBleGlzdHMsIGVyci5JTlZBTElEX0RFTk9NSU5BVElPTgogICAgYXNzZXJ0IC8vIERlbm9taW5hdGlvbiBhc3NldCBpcyBub3QgcHJvcGVybHkgc2V0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODAKICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICBieXRlYyA0NCAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTQtODE1CiAgICAvLyAjIFNldCBTZXR0bGVtZW50IEFzc2V0CiAgICAvLyBzZWxmLl9hc3NlcnRfc2V0dGxlbWVudF9hc3NldCh0ZXJtcy5zZXR0bGVtZW50X2Fzc2V0X2lkKQogICAgZGlnIDEKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc4NQogICAgLy8gc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODMtNzg2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc2V0dGxlbWVudCBhc3NldCBpcyB0aGUgZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQgPT0gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIC8vICksIGVyci5JTlZBTElEX1NFVFRMRU1FTlRfQVNTRVQKICAgIGFzc2VydCAvLyBEaWZmZXJlbnQgc2V0dGxlbWVudCBhc3NldCBub3Qgc3VwcG9ydGVkLCBtdXN0IGJlIGVxdWFsIHRvIGRlbm9taW5hdGlvbiBhc3NldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Nzg5CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBzZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkwLTc5NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhc3NldF9hbW91bnQ9MCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Nzk1CiAgICAvLyBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkzCiAgICAvLyBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc5NAogICAgLy8gYXNzZXRfYW1vdW50PTAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkwLTc5MQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3OTAtNzk2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODE4LTgxOQogICAgLy8gIyBVbml0cwogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IHRlcm1zLnRvdGFsX3VuaXRzCiAgICBkdXAKICAgIHB1c2hpbnQgMTcKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODIwCiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID0gVUludDY0KDApCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgyMi04MjMKICAgIC8vICMgRGF5LUNvdW50IENvbnZlbnRpb25zCiAgICAvLyBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uID0gdGVybXMuZGF5X2NvdW50X2NvbnZlbnRpb24uYXNfdWludDY0KCkKICAgIGJ5dGVjIDQ2IC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGRpZyA4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODI1LTgyNgogICAgLy8gIyBUaW1lCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA9IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZQogICAgZHVwCiAgICBwdXNoaW50IDQxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMjggLy8gImluaXRpYWxfZXhjaGFuZ2VfZGF0ZSIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODI3CiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSB0ZXJtcy5tYXR1cml0eV9kYXRlCiAgICBkaWcgMQogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDQ1IC8vICJtYXR1cml0eV9kYXRlIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MjgKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IGluaXRpYWxfc3RhdGUubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZGlnIDYKICAgIGR1cAogICAgY292ZXIgMgogICAgcHVzaGludCA0OAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzMC04MzEKICAgIC8vICMgUHJpbmNpcGFsCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID0gdGVybXMuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGRpZyAxMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzMgogICAgLy8gc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gdGVybXMuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZGlnIDMKICAgIHB1c2hpbnQgNzg2CiAgICBnZXRiaXQKICAgIGJ5dGVjIDM1IC8vICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzMwogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBpbml0aWFsX3N0YXRlLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZGlnIDEKICAgIHB1c2hpbnQgMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODM1LTgzNgogICAgLy8gIyBJbnRlcmVzdAogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ID0gaW5pdGlhbF9zdGF0ZS5hY2NydWVkX2ludGVyZXN0CiAgICBkaWcgMQogICAgcHVzaGludCA0MAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODM4LTgzOQogICAgLy8gIyBJbnRlcmVzdCBSYXRlCiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IGluaXRpYWxfc3RhdGUubm9taW5hbF9pbnRlcmVzdF9yYXRlCiAgICBkaWcgMQogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0MAogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gaW5pdGlhbF9zdGF0ZS5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlCiAgICBkaWcgMQogICAgcHVzaGludCAyNAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQxCiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkID0gdGVybXMucmF0ZV9yZXNldF9zcHJlYWQKICAgIGRpZyAzCiAgICBwdXNoaW50IDU4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzYgLy8gInJhdGVfcmVzZXRfc3ByZWFkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0MgogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIgPSB0ZXJtcy5yYXRlX3Jlc2V0X211bHRpcGxpZXIKICAgIGRpZyAzCiAgICBwdXNoaW50IDY2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzcgLy8gInJhdGVfcmVzZXRfbXVsdGlwbGllciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDMKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9mbG9vciA9IHRlcm1zLnJhdGVfcmVzZXRfZmxvb3IKICAgIGRpZyAzCiAgICBwdXNoaW50IDc0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzEgLy8gInJhdGVfcmVzZXRfZmxvb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQ0CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfY2FwID0gdGVybXMucmF0ZV9yZXNldF9jYXAKICAgIGRpZyAzCiAgICBwdXNoaW50IDgyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzIgLy8gInJhdGVfcmVzZXRfY2FwIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0NQogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X25leHQgPSB0ZXJtcy5yYXRlX3Jlc2V0X25leHQKICAgIGRpZyAzCiAgICBwdXNoaW50IDkwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzggLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDYKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgPSB0ZXJtcy5oYXNfcmF0ZV9yZXNldF9mbG9vcgogICAgZGlnIDMKICAgIHB1c2hpbnQgNzg0CiAgICBnZXRiaXQKICAgIGJ5dGVjIDM5IC8vICJoYXNfcmF0ZV9yZXNldF9mbG9vciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDcKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwID0gdGVybXMuaGFzX3JhdGVfcmVzZXRfY2FwCiAgICBkaWcgMwogICAgcHVzaGludCA3ODUKICAgIGdldGJpdAogICAgYnl0ZWMgNDAgLy8gImhhc19yYXRlX3Jlc2V0X2NhcCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDktODUwCiAgICAvLyAjIFNjYWxpbmcKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgPSB0ZXJtcy5maXhlZF9wb2ludF9zY2FsZQogICAgdW5jb3ZlciAzCiAgICBwdXNoaW50IDk5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODUyLTg1MwogICAgLy8gIyBTY2hlZHVsZSBQcm9jZXNzaW5nCiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciA9IGluaXRpYWxfc3RhdGUuZXZlbnRfY3Vyc29yCiAgICBkaWcgMQogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU1LTg1NgogICAgLy8gIyBQZXItVW5pdCBGaXhlZC1Qb2ludCBJbmRleGVzCiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggPSBpbml0aWFsX3N0YXRlLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgKICAgIGRpZyAxCiAgICBwdXNoaW50IDU2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU3CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4ID0gaW5pdGlhbF9zdGF0ZS5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleAogICAgZGlnIDEKICAgIHB1c2hpbnQgNjQKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU5LTg2MAogICAgLy8gIyBSZXNlcnZlZCBBbW91bnQgKGZvciBleGVjdXRlZCBjYXNoZmxvd3MpCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0ID0gVUludDY0KDApCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2MQogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2MwogICAgLy8gYXNzZXJ0IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLCBlcnIuSU5WQUxJRF9JRUQKICAgIGRpZyAyCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICBhc3NlcnQgLy8gSUVEIG11c3QgYmUgc2V0IGluIHRoZSBmdXR1cmUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2NAogICAgLy8gYXNzZXJ0IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA+IGluaXRpYWxfc3RhdGUuc3RhdHVzX2RhdGUsIGVyci5JTlZBTElEX0lFRAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgPAogICAgYXNzZXJ0IC8vIElFRCBtdXN0IGJlIHNldCBpbiB0aGUgZnV0dXJlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NjUKICAgIC8vIGFzc2VydCB0ZXJtcy5pbml0aWFsX2V4Y2hhbmdlX2RhdGUgPCB0ZXJtcy5tYXR1cml0eV9kYXRlLCBlcnIuSU5WQUxJRF9JRUQKICAgIDwKICAgIGFzc2VydCAvLyBJRUQgbXVzdCBiZSBzZXQgaW4gdGhlIGZ1dHVyZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3My0xMDc0CiAgICAvLyAjIE5vdGFyaXplIHByb3NwZWN0dXMgKG9wdGlvbmFsKQogICAgLy8gc2VsZi5wcm9zcGVjdHVzX2hhc2ggPSBwcm9zcGVjdHVzLmhhc2guYnl0ZXMKICAgIGRpZyAyCiAgICBleHRyYWN0IDAgMzIKICAgIGJ5dGVjIDQyIC8vICJwcm9zcGVjdHVzX2hhc2giCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3NQogICAgLy8gc2VsZi5wcm9zcGVjdHVzX3VybCA9IHByb3NwZWN0dXMudXJsCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGVjIDQzIC8vICJwcm9zcGVjdHVzX3VybCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc2CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAMTc6CiAgICBpbnRjXzAgLy8gMAogICAgYiBjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUAxOAoKY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAODoKICAgIGludGNfMCAvLyAwCiAgICBiIGNvbnRyYWN0X2NvbmZpZ19ib29sX21lcmdlQDkKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9zY2hlZHVsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X3NjaGVkdWxlOgogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHN3YXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBkdXAKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgMgogICAgKwogICAgdW5jb3ZlciAyCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLkV4ZWN1dGlvblNjaGVkdWxlRW50cnk+CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTEwCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMTMKICAgIC8vIGNvbnRyYWN0X3R5cGU9c2VsZi5jb250cmFjdF90eXBlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGNvdmVyIDMKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4ODEKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4ODItODg0CiAgICAvLyBhc3NlcnQgc2NoZWR1bGVfcGFnZS5sZW5ndGggPD0gVUludDY0KAogICAgLy8gICAgIGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUKICAgIC8vICksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGR1cAogICAgcHVzaGludCAxNgogICAgPD0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg4NQogICAgLy8gYXNzZXJ0IHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPiBVSW50NjQoMCksIGVyci5URVJNU19OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSB0ZXJtcyBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODg3CiAgICAvLyBwYWdlX2N1cnNvciA9IHNjaGVkdWxlX3BhZ2VfaW5kZXggKiBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkKICAgIHN3YXAKICAgIHB1c2hpbnQgMTYKICAgICoKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg5NAogICAgLy8gKyBwYWdlX2xlbmd0aCAqIFVJbnQ2NChjc3QuT1BfVVBfQ09OVFJBQ1RfQ09ORklHX1BFUl9FTlRSWV9CVURHRVQpCiAgICBwdXNoaW50IDEwMAogICAgKgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODkzCiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19CQVNFX0JVREdFVCkKICAgIGludGMgNCAvLyAxNTAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTMtODk0CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19CQVNFX0JVREdFVCkKICAgIC8vICsgcGFnZV9sZW5ndGggKiBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19QRVJfRU5UUllfQlVER0VUKQogICAgKwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODg5LTg5NgogICAgLy8gIyBWYWxpZGF0aW9uIGNvc3QgZ3Jvd3Mgd2l0aCBwYWdlIGxlbmd0aCwgc28gY29uZmlndXJhdGlvbiBleHBsaWNpdGx5CiAgICAvLyAjIGJ1eXMgZXh0cmEgb3Bjb2RlIGJ1ZGdldCBmb3IgbGFyZ2VyIHVwbG9hZHMuCiAgICAvLyBlbnN1cmVfYnVkZ2V0KAogICAgLy8gICAgIHJlcXVpcmVkX2J1ZGdldD0oCiAgICAvLyAgICAgICAgIFVJbnQ2NChjc3QuT1BfVVBfQ09OVFJBQ1RfQ09ORklHX0JBU0VfQlVER0VUKQogICAgLy8gICAgICAgICArIHBhZ2VfbGVuZ3RoICogVUludDY0KGNzdC5PUF9VUF9DT05UUkFDVF9DT05GSUdfUEVSX0VOVFJZX0JVREdFVCkKICAgIC8vICAgICApLAogICAgLy8gKQogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODk3CiAgICAvLyBpbmRleCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKCmNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEAyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODk4CiAgICAvLyB3aGlsZSBpbmRleCA8IHBhZ2VfbGVuZ3RoOgogICAgZHVwCiAgICBkaWcgNAogICAgPAogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfd2hpbGVAMTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg5OS05MDAKICAgIC8vIGVudHJ5ID0gc2NoZWR1bGVfcGFnZVtpbmRleF0uY29weSgpCiAgICAvLyBlbnRyeV9ldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZGlnIDQKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGJ1cnkgMTIKICAgIGRpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgNjUKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTAwCiAgICAvLyBlbnRyeV9ldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTktOTAwCiAgICAvLyBlbnRyeSA9IHNjaGVkdWxlX3BhZ2VbaW5kZXhdLmNvcHkoKQogICAgLy8gZW50cnlfZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGludGNfMiAvLyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDAKICAgIC8vIGVudHJ5X2V2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBnZXRieXRlCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgMTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkwMQogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X2lkID09IHBhZ2VfY3Vyc29yICsgaW5kZXgsIGVyci5JTlZBTElEX0VWRU5UX0lECiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEzCiAgICBkaWcgNQogICAgdW5jb3ZlciA0CiAgICArCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDItOTA0CiAgICAvLyBzZWxmLl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBlbnRyeV9ldmVudF90eXBlCiAgICAvLyApCiAgICBkaWcgNQogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTA1CiAgICAvLyBhc3NlcnQgZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgc3dhcAogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDYKICAgIC8vIGlmIGVudHJ5LmV2ZW50X2lkID4gVUludDY0KDApOgogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDcKICAgIC8vIGlmIGluZGV4ID4gVUludDY0KDApOgogICAgZHVwCiAgICBieiBjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlANgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTA4CiAgICAvLyBwcmV2aW91c19lbnRyeSA9IHNjaGVkdWxlX3BhZ2VbaW5kZXggLSBVSW50NjQoMSldLmNvcHkoKQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgcHVzaGludCA2NQogICAgKgogICAgZGlnIDExCiAgICBzd2FwCiAgICBwdXNoaW50IDY1CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkyMwogICAgLy8gcHJldmlvdXNfZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gZW50cnkuc2NoZWR1bGVkX3RpbWUKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyA4CiAgICA8PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTIyLTkyNAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBwcmV2aW91c19lbnRyeS5zY2hlZHVsZWRfdGltZSA8PSBlbnRyeS5zY2hlZHVsZWRfdGltZQogICAgLy8gKSwgZXJyLklOVkFMSURfU09SVElORwogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIG11c3QgYmUgc29ydGVkIGluIHN0cmljdGx5IGFzY2VuZGluZyBvcmRlcgoKY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUA4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTI1CiAgICAvLyBpZiBlbnRyeS5ldmVudF9pZCA9PSBVSW50NjQoMCk6CiAgICBkaWcgOAogICAgYm56IGNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkyNi05MjgKICAgIC8vIGFzc2VydCBlbnRyeV9ldmVudF90eXBlID09IFVJbnQ2NCgKICAgIC8vICAgICBlbnVtcy5FVlRfSUVECiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGRpZyA5CiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjkKICAgIC8vIGluZGV4ICs9IFVJbnQ2NCgxKQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIGNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEAyCgpjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlANjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkxMC05MTIKICAgIC8vICMgVGhlIGZpcnN0IGVudHJ5IG9mIGEgcGFnZSBtdXN0IHN0aWxsIGJlIG9yZGVyZWQgYWZ0ZXIgdGhlCiAgICAvLyAjIGxhc3QgZW50cnkgb2YgdGhlIHByZXZpb3VzIHBhZ2UuCiAgICAvLyBhc3NlcnQgc2NoZWR1bGVfcGFnZV9pbmRleCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGRpZyA2CiAgICBkdXAKICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTMKICAgIC8vIHByZXZpb3VzX3BhZ2VfaW5kZXggPSBzY2hlZHVsZV9wYWdlX2luZGV4IC0gVUludDY0KDEpCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTE1CiAgICAvLyBwcmV2aW91c19wYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZQogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTQtOTE2CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHByZXZpb3VzX3BhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTctOTE4CiAgICAvLyBwcmV2aW91c19wYWdlID0gc2VsZi5zY2hlZHVsZV9wYWdlW3ByZXZpb3VzX3BhZ2VfaW5kZXhdLmNvcHkoKQogICAgLy8gYXNzZXJ0IHByZXZpb3VzX3BhZ2UubGVuZ3RoID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBwdXNoaW50IDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTgKICAgIC8vIGFzc2VydCBwcmV2aW91c19wYWdlLmxlbmd0aCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZHVwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjAKICAgIC8vIHByZXZpb3VzX3BhZ2UubGVuZ3RoIC0gVUludDY0KDEpCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTE5LTkyMQogICAgLy8gcHJldmlvdXNfZW50cnkgPSBwcmV2aW91c19wYWdlWwogICAgLy8gICAgIHByZXZpb3VzX3BhZ2UubGVuZ3RoIC0gVUludDY0KDEpCiAgICAvLyBdLmNvcHkoKQogICAgcHVzaGludCA2NQogICAgKgogICAgcHVzaGludCAyCiAgICArCiAgICBwdXNoaW50IDY1CiAgICBib3hfZXh0cmFjdAogICAgYiBjb250cmFjdF9zY2hlZHVsZV9hZnRlcl9pZl9lbHNlQDcKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX3doaWxlQDExOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjAwCiAgICAvLyBzZWxmLnNjaGVkdWxlX3BhZ2VbcGFnZV9pbmRleF0gPSBzY2hlZHVsZV9wYWdlLmNvcHkoKQogICAgZGlnIDYKICAgIGl0b2IKICAgIGJ5dGVjIDI0IC8vIDB4NTMyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgZGlnIDUKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzMgogICAgLy8gaWYgaXNfbGFzdF9wYWdlOgogICAgZGlnIDUKICAgIGJ6IGNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzNAogICAgLy8gc2NoZWR1bGVfcGFnZV9pbmRleCAqIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKSArIHBhZ2VfbGVuZ3RoCiAgICBkaWcgMQogICAgZGlnIDQKICAgICsKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzMwogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA9ICgKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTMzLTkzNQogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA9ICgKICAgIC8vICAgICBzY2hlZHVsZV9wYWdlX2luZGV4ICogVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpICsgcGFnZV9sZW5ndGgKICAgIC8vICkKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MzYKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgNTAKICAgIGFwcF9nbG9iYWxfcHV0Cgpjb250cmFjdF9zY2hlZHVsZV9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTExOAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9leGVjdXRlX2llZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X2V4ZWN1dGVfaWVkOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDMKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE0NAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9jb250cmFjdF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9jb250cmFjdF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDUKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfY29udHJhY3Rfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfY29udHJhY3Rfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTQ3CiAgICAvLyBhc3NlcnQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LCBlcnIuSU5WQUxJRF9FVkVOVF9DVVJTT1IKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgZGlnIDEKICAgID4KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGN1cnNvcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE0OAogICAgLy8gZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoc2VsZi5ldmVudF9jdXJzb3IpCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDkKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoZW51bXMuRVZUX0lFRCksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGR1cAogICAgZXh0cmFjdCA4IDEKICAgIGR1cAogICAgcHVzaGJ5dGVzIDB4MDEKICAgIGI9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1MwogICAgLy8gZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICBkaWcgMQogICAgZXh0cmFjdCAwIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTUKICAgIC8vIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgZGlnIDIKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTU2CiAgICAvLyBhY2NydWFsX2ZhY3Rvcj1lbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIGRpZyAzCiAgICBleHRyYWN0IDE3IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTcKICAgIC8vIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIGRpZyA0CiAgICBleHRyYWN0IDI1IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTkKICAgIC8vIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPWVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDUKICAgIGV4dHJhY3QgMzMgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE2MAogICAgLy8gbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgZGlnIDYKICAgIGV4dHJhY3QgNDEgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE2MQogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9ZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICBkaWcgNwogICAgZXh0cmFjdCA0OSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTYyCiAgICAvLyBmbGFncz1lbnRyeS5mbGFncywKICAgIGRpZyA4CiAgICBleHRyYWN0IDU3IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTItMTE2MwogICAgLy8gdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0KAogICAgLy8gICAgIGV2ZW50X2lkPWVudHJ5LmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1lbnRyeS5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1lbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPWVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9ZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPWVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGZsYWdzPWVudHJ5LmZsYWdzLAogICAgLy8gKSwKICAgIHVuY292ZXIgNwogICAgdW5jb3ZlciA4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNwogICAgY29uY2F0CiAgICB1bmNvdmVyIDYKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTgKICAgIC8vIG9ic2VydmVkX3JhdGU9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTItMTE2MwogICAgLy8gdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0KAogICAgLy8gICAgIGV2ZW50X2lkPWVudHJ5LmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1lbnRyeS5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1lbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPWVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9ZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPWVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGZsYWdzPWVudHJ5LmZsYWdzLAogICAgLy8gKSwKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTUwLTExNjQKICAgIC8vIHNlbGYuX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5KAogICAgLy8gICAgIGVudHJ5LAogICAgLy8gICAgIHR5cC5PYnNlcnZlZEV2ZW50UmVxdWVzdCgKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPWVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIG9ic2VydmVkX3JhdGU9VUludDY0KDApLAogICAgLy8gICAgICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1lbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1lbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICAgICAgZmxhZ3M9ZW50cnkuZmxhZ3MsCiAgICAvLyAgICAgKSwKICAgIC8vICkKICAgIGNhbGxzdWIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5CiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNjUKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEyMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuYXBwbHlfbm9uX2Nhc2hfZXZlbnRbcm91dGluZ10oKSAtPiB2b2lkOgphcHBseV9ub25fY2FzaF9ldmVudDoKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDQKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cG4gMgogICAgbGVuCiAgICBwdXNoaW50IDczCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLk9ic2VydmVkRXZlbnRSZXF1ZXN0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIwNAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9jb250cmFjdF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9jb250cmFjdF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMDUKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfY29udHJhY3Rfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfY29udHJhY3Rfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjA3CiAgICAvLyBpZiBwYXlsb2FkLmZsYWdzICYgVUludDY0KGVudW1zLkZMQUdfT0JTRVJWRURfRVZFTlQpOgogICAgcHVzaGludCA2NQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgcHVzaGludCA0CiAgICAmCiAgICBieiBhcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIzMwogICAgLy8gcmV0dXJuIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQ0xNKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICBwdXNoaW50IDUKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjA4CiAgICAvLyBhc3NlcnQgc2VsZi5fc3VwcG9ydHNfb2JzZXJ2ZWRfZXZlbnRzKCksIGVyci5PQlNFUlZFRF9FVkVOVF9SRVFVSVJFRAogICAgYXNzZXJ0IC8vIE9ic2VydmVkIGV2ZW50IHJlcXVpcmVkIHRvIGV4ZWN1dGUgdGhpcyBhY3Rpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMDkKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjMzCiAgICAvLyByZXR1cm4gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9DTE0pCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIGR1cAogICAgcHVzaGludCA1CiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQ1CiAgICAvLyBhc3NlcnQgc2VsZi5fc3VwcG9ydHNfb2JzZXJ2ZWRfZXZlbnRzKCksIGVyci5PQlNFUlZFRF9FVkVOVF9SRVFVSVJFRAogICAgYXNzZXJ0IC8vIE9ic2VydmVkIGV2ZW50IHJlcXVpcmVkIHRvIGV4ZWN1dGUgdGhpcyBhY3Rpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk0NgogICAgLy8gYXNzZXJ0IHBheWxvYWQuZXZlbnRfaWQgPT0gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGRpZyAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDcKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBpZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQ4CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUsIHBheWxvYWQuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgYnVyeSAxMgogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk0Ny05NDkKICAgIC8vIHNlbGYuX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIHNlbGYuY29udHJhY3RfdHlwZSwgcGF5bG9hZC5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICAvLyApCiAgICBjYWxsc3ViIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTUxCiAgICAvLyBwYWdlX2luZGV4ID0gc2VsZi5fc2NoZWR1bGVfcGFnZV9pbmRleChzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTkwCiAgICAvLyByZXR1cm4gZXZlbnRfaWQgLy8gVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpCiAgICBwdXNoaW50IDE2CiAgICAvCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTIKICAgIC8vIHBhZ2UgPSB0eXAuRXhlY3V0aW9uU2NoZWR1bGVQYWdlKCkKICAgIGJ5dGVjIDQ4IC8vIDB4MDAwMAogICAgYnVyeSA3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTMKICAgIC8vIGlmIHBhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlOgogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA5CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMjcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1NAogICAgLy8gcGFnZSA9IHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XS5jb3B5KCkKICAgIGRpZyA3CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidXJ5IDcKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX3BhZ2UgZW50cnkgZXhpc3RzCgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDI3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTU1CiAgICAvLyBhc3NlcnQgcGFnZS5sZW5ndGggPCBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGRpZyA1CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgMTYKICAgIDwKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2MAogICAgLy8gc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIGRpZyAzCiAgICBkdXAKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjEKICAgIC8vIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICBkaWcgMQogICAgZXh0cmFjdCAxNyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjIKICAgIC8vIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZGlnIDIKICAgIGV4dHJhY3QgMjUgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTYzCiAgICAvLyBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDMKICAgIGV4dHJhY3QgNDEgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTY0CiAgICAvLyBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIGRpZyA0CiAgICBleHRyYWN0IDQ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2NQogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIHVuY292ZXIgNQogICAgZXh0cmFjdCA1NyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTctOTY3CiAgICAvLyB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1wYXlsb2FkLmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9cGF5bG9hZC5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPXBheWxvYWQucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXBheWxvYWQubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICkKICAgIGRpZyAxMQogICAgaXRvYgogICAgZGlnIDE4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMwogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTYtOTY4CiAgICAvLyBwYWdlLmFwcGVuZCgKICAgIC8vICAgICB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9cGF5bG9hZC5ldmVudF9pZCwKICAgIC8vICAgICAgICAgZXZlbnRfdHlwZT1wYXlsb2FkLmV2ZW50X3R5cGUsCiAgICAvLyAgICAgICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIC8vICAgICAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICAgICApCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjkKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHBhZ2UuY29weSgpCiAgICBkaWcgOAogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk3MAogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjEyCiAgICAvLyBhc3NlcnQgZXZlbnRfaWQgPT0gc2VsZi5ldmVudF9jdXJzb3IsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBjdXJzb3IKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMTMKICAgIC8vIGVudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KGV2ZW50X2lkKQogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIxNQogICAgLy8gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgYnVyeSAxMAogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjQKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY1CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzYzLTM3MAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9SUiksCiAgICBwdXNoaW50IDEyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY3CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICBwdXNoaW50IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY4CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgcHVzaGludCAxOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzYzLTM3MAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBieiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX2ZhbHNlQDE2CgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX3RydWVAMTU6CiAgICBpbnRjXzEgLy8gMQoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9tZXJnZUAxNzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMTQtMTIxNgogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2lzX25vbl9jYXNoKAogICAgLy8gICAgIGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIC8vICksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IHR5cGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMTcKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlICE9IGFyYzQuVUludDgoZW51bXMuRVZUX0lFRCksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGRpZyA4CiAgICBwdXNoYnl0ZXMgMHgwMQogICAgYiE9CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCB0eXBlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNzQKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluIChVSW50NjQoZW51bXMuRVZUX1JSKSwgVUludDY0KGVudW1zLkVWVF9SUkYpKQogICAgZGlnIDQKICAgIHB1c2hpbnQgMTIKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDIxCiAgICBkaWcgNAogICAgcHVzaGludCAxMQogICAgPT0KICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfZmFsc2VAMjIKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAyMToKICAgIGludGNfMSAvLyAxCgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX21lcmdlQDIzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIxOAogICAgLy8gaWYgc2VsZi5fZXZlbnRfaXNfcmF0ZV9yZXNldChlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpKToKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Vsc2VfYm9keUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODIKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLm9ic2VydmVyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjUgLy8gMHg1MjNhNGQ0ZjQzMjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMjIKICAgIC8vIHNlbGYuX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5KGVudHJ5LCBwYXlsb2FkKQogICAgZGlnIDYKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeQogICAgcG9wbiAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjIzCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfZWxzZV9ib2R5QDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjIxCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIGIgYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYWZ0ZXJfaWZfZWxzZUA2CgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX2ZhbHNlQDIyOgogICAgaW50Y18wIC8vIDAKICAgIGIgYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9tZXJnZUAyMwoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9mYWxzZUAxNjoKICAgIGludGNfMCAvLyAwCiAgICBiIGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfbWVyZ2VAMTcKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5hcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50OgogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGxlbgogICAgcHVzaGludCA2NQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5PYnNlcnZlZENhc2hFdmVudFJlcXVlc3QKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjU0CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyNTUKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfY29udHJhY3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfY29udHJhY3RfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjU2CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2NvbnRyYWN0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2NvbnRyYWN0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIzMwogICAgLy8gcmV0dXJuIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQ0xNKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICBwdXNoaW50IDUKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5ODEKICAgIC8vIGFzc2VydCBzZWxmLl9zdXBwb3J0c19vYnNlcnZlZF9ldmVudHMoKSwgZXJyLk9CU0VSVkVEX0VWRU5UX1JFUVVJUkVECiAgICBhc3NlcnQgLy8gT2JzZXJ2ZWQgZXZlbnQgcmVxdWlyZWQgdG8gZXhlY3V0ZSB0aGlzIGFjdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTgyCiAgICAvLyBhc3NlcnQgcGF5bG9hZC5ldmVudF9pZCA9PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LCBlcnIuSU5WQUxJRF9FVkVOVF9JRAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgc3dhcAogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBpZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTgzCiAgICAvLyBhc3NlcnQgcGF5bG9hZC5ldmVudF90eXBlID09IGFyYzQuVUludDgoZW51bXMuRVZUX1BSKSwgZXJyLklOVkFMSURfRVZFTlRfVFlQRQogICAgZGlnIDEKICAgIGV4dHJhY3QgOCAxCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIHB1c2hieXRlcyAweDAzCiAgICBiPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IHR5cGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4NAogICAgLy8gYXNzZXJ0IHBheWxvYWQuZmxhZ3MgJiBVSW50NjQoZW51bXMuRkxBR19DQVNIX0VWRU5UKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBzd2FwCiAgICBwdXNoaW50IDU3CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzEgLy8gMQogICAgJgogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTg2CiAgICAvLyBpZiBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50ID4gVUludDY0KDApOgogICAgYnogYXBwZW5kX29ic2VydmVkX2Nhc2hfZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5ODgKICAgIC8vIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgLSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5ODctOTg5CiAgICAvLyBwcmV2aW91c19lbnRyeSA9IHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeSgKICAgIC8vICAgICBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IC0gVUludDY0KDEpCiAgICAvLyApCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5MQogICAgLy8gcHJldmlvdXNfZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gcGF5bG9hZC5zY2hlZHVsZWRfdGltZQogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDQKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIDw9CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OTAtOTkyCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHByZXZpb3VzX2VudHJ5LnNjaGVkdWxlZF90aW1lIDw9IHBheWxvYWQuc2NoZWR1bGVkX3RpbWUKICAgIC8vICksIGVyci5JTlZBTElEX1NPUlRJTkcKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBtdXN0IGJlIHNvcnRlZCBpbiBzdHJpY3RseSBhc2NlbmRpbmcgb3JkZXIKCmFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5NAogICAgLy8gcGFnZV9pbmRleCA9IHNlbGYuX3NjaGVkdWxlX3BhZ2VfaW5kZXgoc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE5MAogICAgLy8gcmV0dXJuIGV2ZW50X2lkIC8vIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKQogICAgcHVzaGludCAxNgogICAgLwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTk1CiAgICAvLyBwYWdlID0gdHlwLkV4ZWN1dGlvblNjaGVkdWxlUGFnZSgpCiAgICBieXRlYyA0OCAvLyAweDAwMDAKICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTk2CiAgICAvLyBpZiBwYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZToKICAgIGl0b2IKICAgIGJ5dGVjIDI0IC8vIDB4NTMyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgNwogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBhcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5NwogICAgLy8gcGFnZSA9IHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XS5jb3B5KCkKICAgIGRpZyA1CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidXJ5IDYKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX3BhZ2UgZW50cnkgZXhpc3RzCgphcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OTgKICAgIC8vIGFzc2VydCBwYWdlLmxlbmd0aCA8IFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZGlnIDQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgcHVzaGludCAxNgogICAgPAogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAwMwogICAgLy8gc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIGRpZyA1CiAgICBkdXAKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDA0CiAgICAvLyBhY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLmFjY3J1YWxfZmFjdG9yLAogICAgZGlnIDEKICAgIGV4dHJhY3QgMTcgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAwNQogICAgLy8gcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICBkaWcgMgogICAgZXh0cmFjdCAyNSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDA2CiAgICAvLyBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDMKICAgIGV4dHJhY3QgMzMgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAwNwogICAgLy8gbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1wYXlsb2FkLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICBkaWcgNAogICAgZXh0cmFjdCA0MSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDA4CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1wYXlsb2FkLm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgdW5jb3ZlciA1CiAgICBleHRyYWN0IDQ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMDAtMTAxMAogICAgLy8gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkoCiAgICAvLyAgICAgZXZlbnRfaWQ9cGF5bG9hZC5ldmVudF9pZCwKICAgIC8vICAgICBldmVudF90eXBlPXBheWxvYWQuZXZlbnRfdHlwZSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1wYXlsb2FkLnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9cGF5bG9hZC5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIC8vICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1wYXlsb2FkLm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGZsYWdzPXBheWxvYWQuZmxhZ3MsCiAgICAvLyApCiAgICBkaWcgMTAKICAgIGl0b2IKICAgIGRpZyAxMAogICAgY29uY2F0CiAgICB1bmNvdmVyIDYKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTk5LTEwMTEKICAgIC8vIHBhZ2UuYXBwZW5kKAogICAgLy8gICAgIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgICAgICBldmVudF9pZD1wYXlsb2FkLmV2ZW50X2lkLAogICAgLy8gICAgICAgICBldmVudF90eXBlPXBheWxvYWQuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICAgICAgYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPXBheWxvYWQubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1wYXlsb2FkLm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgICAgICBmbGFncz1wYXlsb2FkLmZsYWdzLAogICAgLy8gICAgICkKICAgIC8vICkKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMTIKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHBhZ2UuY29weSgpCiAgICBkaWcgNgogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMTMKICAgIC8vIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgKz0gVUludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI2MAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9nZXRfc3RhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9nZXRfc3RhdGU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGR1cAogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjc1CiAgICAvLyBjb250cmFjdF90eXBlPWFyYzQuVUludDgoc2VsZi5jb250cmFjdF90eXBlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgaXRvYgogICAgZHVwCiAgICBiaXRsZW4KICAgIGludGNfMiAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBleHRyYWN0IDcgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI3NwogICAgLy8gdG90YWxfdW5pdHM9c2VsZi50b3RhbF91bml0cywKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjc4CiAgICAvLyByZXNlcnZlZF91bml0c190b3RhbD1zZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyNzkKICAgIC8vIGluaXRpYWxfZXhjaGFuZ2VfYW1vdW50PXNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI4MAogICAgLy8gZXZlbnRfY3Vyc29yPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjgxCiAgICAvLyBzY2hlZHVsZV9lbnRyeV9jb3VudD1zZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI4MgogICAgLy8gb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjgzCiAgICAvLyBpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlPXNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjg0CiAgICAvLyBub21pbmFsX2ludGVyZXN0X3JhdGU9c2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyODUKICAgIC8vIGFjY3J1ZWRfaW50ZXJlc3Q9c2VsZi5hY2NydWVkX2ludGVyZXN0LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyODYKICAgIC8vIGN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXg9c2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjg3CiAgICAvLyBjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleD1zZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyODgKICAgIC8vIHJlc2VydmVkX2ludGVyZXN0PXNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX2ludGVyZXN0IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI4OQogICAgLy8gcmVzZXJ2ZWRfcHJpbmNpcGFsPXNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI3NC0xMjkwCiAgICAvLyByZXR1cm4gdHlwLktlcm5lbFN0YXRlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGU9YXJjNC5VSW50OChzZWxmLmNvbnRyYWN0X3R5cGUpLAogICAgLy8gICAgIHN0YXR1cz1zZWxmLnN0YXR1cywKICAgIC8vICAgICB0b3RhbF91bml0cz1zZWxmLnRvdGFsX3VuaXRzLAogICAgLy8gICAgIHJlc2VydmVkX3VuaXRzX3RvdGFsPXNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwsCiAgICAvLyAgICAgaW5pdGlhbF9leGNoYW5nZV9hbW91bnQ9c2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCwKICAgIC8vICAgICBldmVudF9jdXJzb3I9c2VsZi5ldmVudF9jdXJzb3IsCiAgICAvLyAgICAgc2NoZWR1bGVfZW50cnlfY291bnQ9c2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwKICAgIC8vICAgICBvdXRzdGFuZGluZ19wcmluY2lwYWw9c2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZT1zZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICAvLyAgICAgbm9taW5hbF9pbnRlcmVzdF9yYXRlPXNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIGFjY3J1ZWRfaW50ZXJlc3Q9c2VsZi5hY2NydWVkX2ludGVyZXN0LAogICAgLy8gICAgIGN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXg9c2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4LAogICAgLy8gICAgIGN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4PXNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgsCiAgICAvLyAgICAgcmVzZXJ2ZWRfaW50ZXJlc3Q9c2VsZi5yZXNlcnZlZF9pbnRlcmVzdCwKICAgIC8vICAgICByZXNlcnZlZF9wcmluY2lwYWw9c2VsZi5yZXNlcnZlZF9wcmluY2lwYWwsCiAgICAvLyApCiAgICB1bmNvdmVyIDE0CiAgICBpdG9iCiAgICB1bmNvdmVyIDE0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMgogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDExCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA5CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgOAogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDcKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyNjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzA0CiAgICAvLyBpZiBzZWxmLmV2ZW50X2N1cnNvciA+PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICA+PQogICAgYnogY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMwNgogICAgLy8gZXZlbnRfaWQ9c2VsZi5ldmVudF9jdXJzb3IsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMDUtMTMxNQogICAgLy8gcmV0dXJuIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgIGV2ZW50X2lkPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgLy8gICAgIGV2ZW50X3R5cGU9YXJjNC5VSW50OCgwKSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1VSW50NjQoMCksCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1VSW50NjQoMCksCiAgICAvLyAgICAgZmxhZ3M9VUludDY0KDApLAogICAgLy8gKQogICAgaXRvYgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMwNwogICAgLy8gZXZlbnRfdHlwZT1hcmM0LlVJbnQ4KDApLAogICAgYnl0ZWMgNDEgLy8gMHgwMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMwNS0xMzE1CiAgICAvLyByZXR1cm4gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkoCiAgICAvLyAgICAgZXZlbnRfaWQ9c2VsZi5ldmVudF9jdXJzb3IsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1hcmM0LlVJbnQ4KDApLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPVVJbnQ2NCgwKSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249VUludDY0KDApLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPVVJbnQ2NCgwKSwKICAgIC8vICAgICBmbGFncz1VSW50NjQoMCksCiAgICAvLyApCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMDgKICAgIC8vIHNjaGVkdWxlZF90aW1lPVVJbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzA1LTEzMTUKICAgIC8vIHJldHVybiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1zZWxmLmV2ZW50X2N1cnNvciwKICAgIC8vICAgICBldmVudF90eXBlPWFyYzQuVUludDgoMCksCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9VUludDY0KDApLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9VUludDY0KDApLAogICAgLy8gICAgIGZsYWdzPVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAoKY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50QDQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjkyCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzE2CiAgICAvLyByZXR1cm4gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KHNlbGYuZXZlbnRfY3Vyc29yKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyOTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiBjb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnRfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnRANAoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLmNvbnRyYWN0X3VwZGF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X3VwZGF0ZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNjEtMTY0CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gZ3JhbnRzIHRoZSB1cGRhdGUgcGVybWlzc2lvbnMgdG8gdGhlIEFycmFuZ2VyLgogICAgLy8gIyDimqDvuI8gV0FSTklORzogQXBwbGljYXRpb24gdXBkYXRlcyBtdXN0IGJlIGV4ZWN1dGVkIFZFUlkgY2FyZWZ1bGx5LCBhcyB0aGV5CiAgICAvLyAjIG1pZ2h0IGludHJvZHVjZSBicmVha2luZyBjaGFuZ2VzLgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTUwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19yb3RhdGVfYXJyYW5nZXJbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3JvdGF0ZV9hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTgwCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODEKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSBuZXdfYXJyYW5nZXIKICAgIGJ5dGVjIDE4IC8vIDB4NTIzYTQxNTI1MjIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4MgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTY2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3NldF9vcF9kYWVtb25bcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3NldF9vcF9kYWVtb246CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTg0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE5OAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTk5CiAgICAvLyBzZWxmLm9wX2RhZW1vbi52YWx1ZSA9IGFkZHJlc3MKICAgIGJ5dGVjIDI3IC8vIDB4NTIzYTRmNTA0NDIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwMAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTg0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2Fzc2lnbl9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19hc3NpZ25fcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDE2CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLlJvbGVWYWxpZGl0eQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI1CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2NvbnRyYWN0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2NvbnRyYWN0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNgogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDQKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgcHVzaGludCAyMAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA1CiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gcm9sZV9hZGRyZXNzCiAgICBieXRlYyAxOCAvLyAweDUyM2E0MTUyNTIyMwogICAgZGlnIDMKICAgIGFwcF9nbG9iYWxfcHV0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyOAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwOAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDQwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDkKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIzIC8vIDB4NTIzYTRkNGU0NzIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTAKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI3CiAgICAvLyBzZWxmLl9zZXRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIHZhbGlkaXR5KQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTMKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjIgLy8gMHg1MjNhNTA1OTQ0MjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNAogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNwogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE2CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpOgogICAgZHVwCiAgICBwdXNoaW50IDYwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTcKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyNiAvLyAweDUyM2E1NDUyNTMyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE4CiAgICAvLyBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjcKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIxCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMSAvLyAweDUyM2E0MTU1NTQyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIyCiAgICAvLyBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNwogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyNAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgODAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI1CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI1IC8vIDB4NTIzYTRkNGY0MzIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjYKICAgIC8vIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfcmV2b2tlX3JvbGVbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3Jldm9rZV9yb2xlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0OQogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjUwCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2NvbnRyYWN0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2NvbnRyYWN0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1MQogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjkKICAgIC8vIGFzc2VydCByb2xlX2lkICE9IFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwgZXJyLklOVkFMSURfUk9MRQogICAgZHVwCiAgICBwdXNoaW50IDIwCiAgICAhPQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMwCiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICBwdXNoaW50IDQwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzEKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjMgLy8gMHg1MjNhNGQ0ZTQ3MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMgogICAgLy8gZGVsIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTMKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzQKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzUKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMiAvLyAweDUyM2E1MDU5NDQyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM2CiAgICAvLyBkZWwgc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTIKICAgIC8vIHNlbGYuX2RlbGV0ZV9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcykKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM4CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpOgogICAgZHVwCiAgICBwdXNoaW50IDYwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzkKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI2IC8vIDB4NTIzYTU0NTI1MzIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDAKICAgIC8vIGRlbCBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjUyCiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDMKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hdXRob3JpdHksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjEgLy8gMHg1MjNhNDE1NTU0MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NAogICAgLy8gZGVsIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1MgogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDYKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDgwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI1IC8vIDB4NTIzYTRkNGY0MzIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDgKICAgIC8vIGRlbCBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19jb250cmFjdF9zdXNwZW5zaW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19jb250cmFjdF9zdXNwZW5zaW9uOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojc5CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyMSAvLyAweDUyM2E0MTU1NTQyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3MQogICAgLy8gc2VsZi5jb250cmFjdF9zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGJ5dGVjIDMzIC8vICJjb250cmFjdF9zdXNwZW5kZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3MgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2NvbnRyYWN0X2RlZmF1bHRbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2NvbnRyYWN0X2RlZmF1bHQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjc0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzYKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnRydXN0ZWUsIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyNiAvLyAweDUyM2E1NDUyNTMyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4NwogICAgLy8gc2VsZi5kZWZhdWx0ZWQgPSBkZWZhdWx0ZWQKICAgIGJ5dGVjIDM0IC8vICJkZWZhdWx0ZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4OAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjc0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9hcnJhbmdlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X2FycmFuZ2VyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwMQogICAgLy8gcmV0dXJuIHNlbGYuYXJyYW5nZXIudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOCAvLyAweDUyM2E0MTUyNTIyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYWRkcmVzc19yb2xlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzAzCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMQogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hY2NvdW50X21hbmFnZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjMgLy8gMHg1MjNhNGQ0ZTQ3MjMKICAgIGRpZyAxCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMgogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5wcmltYXJ5X2RlYWxlciwgYWRkcmVzcyksCiAgICBieXRlYyAyMiAvLyAweDUyM2E1MDU5NDQyMwogICAgZGlnIDIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzIzCiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnRydXN0ZWUsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjYgLy8gMHg1MjNhNTQ1MjUzMjMKICAgIGRpZyAzCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyNAogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIGFkZHJlc3MpLAogICAgYnl0ZWMgMjEgLy8gMHg1MjNhNDE1NTU0MjMKICAgIGRpZyA0CiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyNQogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5vYnNlcnZlciwgYWRkcmVzcyksCiAgICBieXRlYyAyNSAvLyAweDUyM2E0ZDRmNDMyMwogICAgdW5jb3ZlciA1CiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlYyA0MSAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciA2CiAgICBzZXRiaXQKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDUKICAgIHNldGJpdAogICAgcHVzaGludCAyCiAgICB1bmNvdmVyIDQKICAgIHNldGJpdAogICAgcHVzaGludCAzCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgcHVzaGludCA0CiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM0NgogICAgLy8gcm9sZSA9IHJvbGVfaWQuYXNfdWludDY0KCkKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNDcKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGUpCiAgICBkdXAKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzQ5CiAgICAvLyBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKToKICAgIHB1c2hpbnRzIDIwIDQwIDUwIDYwIDcwIDgwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzQ4LTM3OQogICAgLy8gbWF0Y2ggcm9sZToKICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKToKICAgIC8vICAgICAgICAgcmV0dXJuIHR5cC5Sb2xlVmFsaWRpdHkoCiAgICAvLyAgICAgICAgICAgICByb2xlX3ZhbGlkaXR5X3N0YXJ0PVVJbnQ2NCgwKSwgcm9sZV92YWxpZGl0eV9lbmQ9VUludDY0KDApCiAgICAvLyAgICAgICAgICkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSk6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSk6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgXzoKICAgIC8vICAgICAgICAgb3AuZXJyKGVyci5JTlZBTElEX1JPTEUpCiAgICB1bmNvdmVyIDYKICAgIG1hdGNoIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMEAyIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMUAzIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMkA0IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfM0A1IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNEA2IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mzc5CiAgICAvLyBvcC5lcnIoZXJyLklOVkFMSURfUk9MRSkKICAgIGVyciAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV81QDc6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mzc1CiAgICAvLyBzZWxmLm9ic2VydmVyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDI1IC8vIDB4NTIzYTRkNGY0MzIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTcKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mzc0LTM3NgogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM3NwogICAgLy8gcmV0dXJuIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzRANjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNzAKICAgIC8vIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDIxIC8vIDB4NTIzYTQxNTU1NDIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTcKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzY5LTM3MQogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNzIKICAgIC8vIHJldHVybiBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzNANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNjUKICAgIC8vIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAyNiAvLyAweDUyM2E1NDUyNTMyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU3CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM2NC0zNjYKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM2NwogICAgLy8gcmV0dXJuIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzJANDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNjAKICAgIC8vIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMjIgLy8gMHg1MjNhNTA1OTQ0MjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NwogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTktMzYxCiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzYyCiAgICAvLyByZXR1cm4gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzFAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTUKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDIzIC8vIDB4NTIzYTRkNGU0NzIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTcKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzU0LTM1NgogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTcKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzBAMjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTAtMzUyCiAgICAvLyByZXR1cm4gdHlwLlJvbGVWYWxpZGl0eSgKICAgIC8vICAgICByb2xlX3ZhbGlkaXR5X3N0YXJ0PVVJbnQ2NCgwKSwgcm9sZV92YWxpZGl0eV9lbmQ9VUludDY0KDApCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB2b2lkOgpfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZDoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNgogICAgLy8gZGVmIF9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHNlbGYsIGhvbGRpbmdfYWRkcmVzczogQWNjb3VudCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI4CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZCwgZXJyLlNVU1BFTkRFRAogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCAzODQKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIFN1c3BlbmRlZCBvcGVyYXRpb25zCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5fc2V0dGxlX3Bvc2l0aW9uKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NCwgdWludDY0Ogpfc2V0dGxlX3Bvc2l0aW9uOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjQ0CiAgICAvLyBkZWYgX3NldHRsZV9wb3NpdGlvbihzZWxmLCBob2xkaW5nX2FkZHJlc3M6IEFjY291bnQpIC0+IHR1cGxlW1VJbnQ2NCwgVUludDY0XToKICAgIHByb3RvIDEgMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjYxCiAgICAvLyBwb3NpdGlvbiA9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNvcHkoKQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo2My02NQogICAgLy8gIyBDb21wdXRlIHRoZSBpbmNyZW1lbnRhbCBwZXItdW5pdCBmaXhlZC1wb2ludCBpbnRlcmVzdCBhbmQgcHJpbmNpcGFsIGFjY3J1ZWQKICAgIC8vICMgc2luY2UgdGhpcyBhY2NvdW50J3MgbGFzdCBjaGVja3BvaW50LgogICAgLy8gaW50ZXJlc3RfZGVsdGEgPSBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggLSBwb3NpdGlvbi5pbnRlcmVzdF9jaGVja3BvaW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCBleGlzdHMKICAgIGRpZyAxCiAgICBwdXNoaW50IDU3CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjY3CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IC0gcG9zaXRpb24ucHJpbmNpcGFsX2NoZWNrcG9pbnQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggZXhpc3RzCiAgICBkaWcgMgogICAgcHVzaGludCA2NQogICAgZXh0cmFjdF91aW50NjQKICAgIC0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3MwogICAgLy8gaW50ZXJlc3RfZGVsdGEsIHBvc2l0aW9uLnVuaXRzLCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICBkaWcgMgogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjcwLTc0CiAgICAvLyAjIENvbnZlcnQgdGhlIHBlci11bml0IGZpeGVkLXBvaW50IGRlbHRhcyBpbnRvIGFic29sdXRlIGNsYWltYWJsZSBhbW91bnRzCiAgICAvLyAjIHVzaW5nIHRoZSBhY2NvdW50J3MgYWN0aXZlIHVuaXRzLgogICAgLy8gY2xhaW1hYmxlX2ludGVyZXN0ID0gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgaW50ZXJlc3RfZGVsdGEsIHBvc2l0aW9uLnVuaXRzLCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICAvLyApCiAgICB1bmNvdmVyIDMKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzYKICAgIC8vIHByaW5jaXBhbF9kZWx0YSwgcG9zaXRpb24udW5pdHMsIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3NS03NwogICAgLy8gY2xhaW1hYmxlX3ByaW5jaXBhbCA9IHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIHByaW5jaXBhbF9kZWx0YSwgcG9zaXRpb24udW5pdHMsIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUKICAgIC8vICkKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzktODEKICAgIC8vICMgQWNjcnVlIHRoZSBjbGFpbWFibGUgYW1vdW50cyB0byB0aGUgYWNjb3VudCBwb3NpdGlvbiBhbmQgbWFrZSB0aGVtIGF2YWlsYWJsZQogICAgLy8gIyBmb3Igd2l0aGRyYXdhbC4KICAgIC8vIHBvc2l0aW9uLmNsYWltYWJsZV9pbnRlcmVzdCArPSBjbGFpbWFibGVfaW50ZXJlc3QKICAgIGRpZyAyCiAgICBwdXNoaW50IDczCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDIKICAgICsKICAgIGl0b2IKICAgIHVuY292ZXIgMwogICAgc3dhcAogICAgcmVwbGFjZTIgNzMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo4MgogICAgLy8gcG9zaXRpb24uY2xhaW1hYmxlX3ByaW5jaXBhbCArPSBjbGFpbWFibGVfcHJpbmNpcGFsCiAgICBkdXAKICAgIHB1c2hpbnQgODEKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgKwogICAgaXRvYgogICAgcmVwbGFjZTIgODEKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo4NC04NgogICAgLy8gIyBBZHZhbmNlIHRoZSBhY2NvdW50J3MgcGVyLXVuaXQgZml4ZWQtcG9pbnQgY2hlY2twb2ludHMgdG8gdGhlIGN1cnJlbnQgZ2xvYmFsCiAgICAvLyAjIHBlci11bml0IGZpeGVkLXBvaW50IGdsb2JhbCBpbmRpY2VzLgogICAgLy8gcG9zaXRpb24uaW50ZXJlc3RfY2hlY2twb2ludCA9IHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggZXhpc3RzCiAgICBpdG9iCiAgICByZXBsYWNlMiA1NwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojg3CiAgICAvLyBwb3NpdGlvbi5wcmluY2lwYWxfY2hlY2twb2ludCA9IHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggZXhpc3RzCiAgICBpdG9iCiAgICByZXBsYWNlMiA2NQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojg5LTkwCiAgICAvLyAjIEFkdmFuY2UgdGhlIGFjY291bnQncyBldmVudCBjdXJzb3IgdG8gdGhlIGN1cnJlbnQgZ2xvYmFsIGV2ZW50IGN1cnNvci4KICAgIC8vIHBvc2l0aW9uLnNldHRsZWRfY3Vyc29yID0gc2VsZi5ldmVudF9jdXJzb3IKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaXRvYgogICAgcmVwbGFjZTIgNDkKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo5Mi05NAogICAgLy8gIyBVcGRhdGUgdGhlIGFjY291bnQgcG9zaXRpb24gYW5kIHJldHVybiB0aGUgbmV3bHkgYWNjcnVlZCBjbGFpbWFibGUgYW1vdW50cwogICAgLy8gIyBhZGRlZCB0byB0aGUgdG90YWwgcG9zaXRpb24ncyBjbGFpbWFibGUgYW1vdW50cy4KICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gcG9zaXRpb24uY29weSgpCiAgICB1bmNvdmVyIDMKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo5NQogICAgLy8gcmV0dXJuIGNsYWltYWJsZV9pbnRlcmVzdCwgY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQoaG9sZGluZ19hZGRyZXNzOiBieXRlcykgLT4gdm9pZDoKX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQ6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6OTcKICAgIC8vIGRlZiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZChzZWxmLCBob2xkaW5nX2FkZHJlc3M6IEFjY291bnQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTAwCiAgICAvLyBpZiBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKToKICAgIGJ6IF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwMQogICAgLy8gcmV0dXJuCiAgICByZXRzdWIKCl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDMKICAgIC8vIHBvc2l0aW9uID0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY29weSgpCiAgICBmcmFtZV9kaWcgMgogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA0CiAgICAvLyBpZiBwb3NpdGlvbi5yZXNlcnZlZF91bml0cyA9PSBVSW50NjQoMCk6CiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIGJueiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZF9hZnRlcl9pZl9lbHNlQDQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDUKICAgIC8vIHJldHVybgogICAgcmV0c3ViCgpfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZF9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA4CiAgICAvLyBwb3NpdGlvbi51bml0cyArPSBhY3RpdmF0ZWRfdW5pdHMKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDMKICAgICsKICAgIGl0b2IKICAgIHJlcGxhY2UyIDMyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA5CiAgICAvLyBwb3NpdGlvbi5yZXNlcnZlZF91bml0cyA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGl0b2IKICAgIHJlcGxhY2UyIDQwCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTEwCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHBvc2l0aW9uLmNvcHkoKQogICAgZnJhbWVfZGlnIDIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTEKICAgIC8vIGFzc2VydCBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID49IGFjdGl2YXRlZF91bml0cywgZXJyLk9WRVJfRElTVFJJQlVUSU9OCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIGV4aXN0cwogICAgZHVwCiAgICBkaWcgMgogICAgPj0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgcmVtYWluaW5nIEQtQVNBIHVuaXRzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTEyCiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIC09IGFjdGl2YXRlZF91bml0cwogICAgc3dhcAogICAgLQogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9zY2FsZWRfbXVsX2RpdihtdWx0aXBsaWNhbmQ6IHVpbnQ2NCwgbXVsdGlwbGllcjogdWludDY0LCBkaXZpc29yOiB1aW50NjQpIC0+IHVpbnQ2NDoKX3NjYWxlZF9tdWxfZGl2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTUzLTE1NQogICAgLy8gZGVmIF9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLCBtdWx0aXBsaWNhbmQ6IFVJbnQ2NCwgbXVsdGlwbGllcjogVUludDY0LCBkaXZpc29yOiBVSW50NjQKICAgIC8vICkgLT4gVUludDY0OgogICAgcHJvdG8gMyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTcKICAgIC8vIGlmIG11bHRpcGxpY2FuZCA9PSBVSW50NjQoMCkgb3IgbXVsdGlwbGllciA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTMKICAgIGJ6IF9zY2FsZWRfbXVsX2Rpdl9pZl9ib2R5QDIKICAgIGZyYW1lX2RpZyAtMgogICAgYm56IF9zY2FsZWRfbXVsX2Rpdl9hZnRlcl9pZl9lbHNlQDMKCl9zY2FsZWRfbXVsX2Rpdl9pZl9ib2R5QDI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTgKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9zY2FsZWRfbXVsX2Rpdl9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTkKICAgIC8vIGhpZ2gsIGxvdyA9IG9wLm11bHcobXVsdGlwbGljYW5kLCBtdWx0aXBsaWVyKQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIG11bHcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2MAogICAgLy8gcmV0dXJuIG9wLmRpdncoaGlnaCwgbG93LCBkaXZpc29yKQogICAgZnJhbWVfZGlnIC0xCiAgICBkaXZ3CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYW1vdW50X3RvX2luZGV4X2RlbHRhKGFtb3VudDogdWludDY0KSAtPiB1aW50NjQ6Cl9hbW91bnRfdG9faW5kZXhfZGVsdGE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjIKICAgIC8vIGRlZiBfYW1vdW50X3RvX2luZGV4X2RlbHRhKHNlbGYsIGFtb3VudDogVUludDY0KSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2NAogICAgLy8gaWYgYW1vdW50ID09IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMQogICAgYm56IF9hbW91bnRfdG9faW5kZXhfZGVsdGFfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjUKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9hbW91bnRfdG9faW5kZXhfZGVsdGFfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTY2CiAgICAvLyBhc3NlcnQgc2VsZi50b3RhbF91bml0cyA+IFVJbnQ2NCgwKSwgZXJyLk5PX1VOSVRTCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgZHVwCiAgICBhc3NlcnQgLy8gTm8gRC1BU0EgdW5pdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2NwogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KGFtb3VudCwgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwgc2VsZi50b3RhbF91bml0cykKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2luZGV4X2RlbHRhX3RvX2Ftb3VudChpbmRleF9kZWx0YTogdWludDY0KSAtPiB1aW50NjQ6Cl9pbmRleF9kZWx0YV90b19hbW91bnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjkKICAgIC8vIGRlZiBfaW5kZXhfZGVsdGFfdG9fYW1vdW50KHNlbGYsIGluZGV4X2RlbHRhOiBVSW50NjQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTc2CiAgICAvLyBpZiBpbmRleF9kZWx0YSA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGJueiBfaW5kZXhfZGVsdGFfdG9fYW1vdW50X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTc3CiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfaW5kZXhfZGVsdGFfdG9fYW1vdW50X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE3OQogICAgLy8gc2VsZi50b3RhbF91bml0cywKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxODEKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNzgtMTgyCiAgICAvLyByZXR1cm4gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgc2VsZi50b3RhbF91bml0cywKICAgIC8vICAgICBpbmRleF9kZWx0YSwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2dldF9zY2hlZHVsZV9lbnRyeShldmVudF9pZDogdWludDY0KSAtPiBieXRlczoKX2dldF9zY2hlZHVsZV9lbnRyeToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIwMgogICAgLy8gZGVmIF9nZXRfc2NoZWR1bGVfZW50cnkoc2VsZiwgZXZlbnRfaWQ6IFVJbnQ2NCkgLT4gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnk6CiAgICBwcm90byAxIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIwNAogICAgLy8gYXNzZXJ0IGV2ZW50X2lkIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgPgogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgaWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE5MAogICAgLy8gcmV0dXJuIGV2ZW50X2lkIC8vIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDE2CiAgICAvCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMDYKICAgIC8vIGFzc2VydCBwYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxOTQKICAgIC8vIHJldHVybiBldmVudF9pZCAlIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDE2CiAgICAlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMDkKICAgIC8vIGFzc2VydCBvZmZzZXQgPCBwYWdlLmxlbmd0aCwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBwdXNoaW50IDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgMQogICAgPgogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjEwCiAgICAvLyByZXR1cm4gcGFnZVtvZmZzZXRdLmNvcHkoKQogICAgcHVzaGludCA2NQogICAgKgogICAgcHVzaGludCAyCiAgICArCiAgICBwdXNoaW50IDY1CiAgICBib3hfZXh0cmFjdAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKGNvbnRyYWN0X3R5cGU6IHVpbnQ2NCwgZXZlbnRfdHlwZTogdWludDY0KSAtPiB2b2lkOgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTMtMzE1CiAgICAvLyBkZWYgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIHNlbGYsIGNvbnRyYWN0X3R5cGU6IFVJbnQ2NCwgZXZlbnRfdHlwZTogVUludDY0CiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNDcKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNDgKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgaW50Y18yIC8vIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI0OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9NRCksCiAgICBwdXNoaW50IDE5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTAKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgcHVzaGludCAxMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU0LTI1NQogICAgLy8gIyBDaGVjayBjb21tb24gZXZlbnRzIGZpcnN0CiAgICAvLyBpZiBldmVudF90eXBlIGluIGNvbW1vbl9ldmVudHM6CiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjUxCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICBwdXNoaW50IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUA3CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU2CiAgICAvLyByZXR1cm4gVHJ1ZQogICAgaW50Y18xIC8vIDEKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICByZXRzdWIKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTgtMjU5CiAgICAvLyAjIENvbnRyYWN0LXNwZWNpZmljIGFkZGl0aW9uYWwgZXZlbnRzCiAgICAvLyBpZiBjb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9QQU0pOgogICAgZnJhbWVfZGlnIC0yCiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjYwLTI2MQogICAgLy8gIyBQQU0gb25seSBzdXBwb3J0cyBjb21tb24gZXZlbnRzCiAgICAvLyByZXR1cm4gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNjMKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0xBTSkgb3IgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2My0yNjUKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0xBTSkgb3IgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoCiAgICAvLyAgICAgZW51bXMuQ1RfTkFNCiAgICAvLyApOgogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDExCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMgogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDE2CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUAxMToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2Ni0yNzAKICAgIC8vICMgTEFNL05BTSBhZGQ6IFBSLCBJUENCCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjY4CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjY2LTI3MAogICAgLy8gIyBMQU0vTkFNIGFkZDogUFIsIElQQ0IKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDEzCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIHB1c2hpbnQgMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2Ni0yNzAKICAgIC8vICMgTEFNL05BTSBhZGQ6IFBSLCBJUENCCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICkKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF9mYWxzZUAxNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAxMzoKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDE0OgogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMTY6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzIKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTik6CiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMjMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3My0yNzgKICAgIC8vICMgQU5OIGFkZHM6IFBSLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjc1CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjczLTI3OAogICAgLy8gIyBBTk4gYWRkczogUFIsIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDIwCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIHB1c2hpbnQgMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3My0yNzgKICAgIC8vICMgQU5OIGFkZHM6IFBSLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyMAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzcKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIHB1c2hpbnQgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjczLTI3OAogICAgLy8gIyBBTk4gYWRkczogUFIsIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDIxCgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDIwOgogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMjE6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAyMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MAogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfTEFYKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA0CiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMzEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MS0yODcKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MwogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUiksCiAgICBwdXNoaW50IDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MS0yODcKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjgKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjg0CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjgxLTI4NwogICAgLy8gIyBMQVggYWRkczogUFIsIFBJLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyOAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODUKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICBwdXNoaW50IDE4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODEtMjg3CiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDI4CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODEtMjg3CiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDI5CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDI4OgogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMjk6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAzMToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4OQogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQ0xNKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA1CiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMzMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI5MC0yOTEKICAgIC8vICMgQ0xNIGFkZHM6IFBSCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1BSKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDMKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDMzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjkzCiAgICAvLyByZXR1cm4gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5faXNfZHluYW1pY19hbm51aXR5KCkgLT4gdWludDY0OgpfaXNfZHluYW1pY19hbm51aXR5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM1CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzUtMzM2CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIC8vIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGJ6IF9pc19keW5hbWljX2FubnVpdHlfYm9vbF9mYWxzZUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzYKICAgIC8vIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzNSAvLyAiZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM1LTMzNgogICAgLy8gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICAvLyBhbmQgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBieiBfaXNfZHluYW1pY19hbm51aXR5X2Jvb2xfZmFsc2VAMwogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMzNC0zMzcKICAgIC8vIHJldHVybiAoCiAgICAvLyAgICAgc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICAvLyAgICAgYW5kIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgLy8gKQogICAgcmV0c3ViCgpfaXNfZHluYW1pY19hbm51aXR5X2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzQtMzM3CiAgICAvLyByZXR1cm4gKAogICAgLy8gICAgIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKQogICAgLy8gICAgIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIC8vICkKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KGVudHJ5OiBieXRlcykgLT4gdWludDY0LCBieXRlczoKX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozODAKICAgIC8vIGRlZiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudChzZWxmLCBlbnRyeTogdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5CiAgICAvLyBlbnRyeS5hY2NydWFsX2ZhY3RvciA9PSBVSW50NjQoMCkKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAxNwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5LTM5MQogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGJ6IF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2lmX2JvZHlAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzkwCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5LTM5MQogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGJ6IF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2lmX2JvZHlAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzkxCiAgICAvLyBvciBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPT0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5LTM5MQogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGJueiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudF9hZnRlcl9pZl9lbHNlQDQKCl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2lmX2JvZHlAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5MwogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2RpZyAtMQogICAgdW5jb3ZlciAyCiAgICByZXRzdWIKCl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NQogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NgogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NC0zOTgKICAgIC8vIGFjY3J1ZWQgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICAvLyAgICAgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICkKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MDIKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozOTktNDAzCiAgICAvLyByZXR1cm4gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgYWNjcnVlZCwKICAgIC8vICAgICBlbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICBmcmFtZV9kaWcgLTEKICAgIHVuY292ZXIgMgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yKGRpc2NvdW50X2ZhY3RvcjogdWludDY0LCByZWRlbXB0aW9uX2ZhY3RvcjogdWludDY0KSAtPiB1aW50NjQ6Cl9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ2Mi00NjYKICAgIC8vIGRlZiBfZGlzY291bnRfYW5udWl0eV9mYWN0b3IoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBkaXNjb3VudF9mYWN0b3I6IFVJbnQ2NCwKICAgIC8vICAgICByZWRlbXB0aW9uX2ZhY3RvcjogVUludDY0LAogICAgLy8gKSAtPiBVSW50NjQ6CiAgICBwcm90byAyIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ2OAogICAgLy8gaWYgcmVkZW1wdGlvbl9mYWN0b3IgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0xCiAgICBibnogX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDY5CiAgICAvLyByZXR1cm4gZGlzY291bnRfZmFjdG9yCiAgICBmcmFtZV9kaWcgLTIKICAgIHJldHN1YgoKX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3MAogICAgLy8gcGVyaW9kX3JhdGUgPSBzZWxmLmZpeGVkX3BvaW50X3NjYWxlICsgc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzEKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzAtNDc0CiAgICAvLyBwZXJpb2RfcmF0ZSA9IHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgKyBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICByZWRlbXB0aW9uX2ZhY3RvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICBkaWcgMgogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgICsKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3NQogICAgLy8gYXNzZXJ0IHBlcmlvZF9yYXRlID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGR1cAogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDc4CiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDc2LTQ4MAogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIGRpc2NvdW50X2ZhY3RvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gICAgIHBlcmlvZF9yYXRlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkoZW50cnk6IGJ5dGVzLCBwYXlsb2FkOiBieXRlcykgLT4gYnl0ZXMsIGJ5dGVzOgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MTMtNjE1CiAgICAvLyBkZWYgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5KAogICAgLy8gICAgIHNlbGYsIGVudHJ5OiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSwgcGF5bG9hZDogdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0CiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAyIDIKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjIzCiAgICAvLyBhc3NlcnQgZW50cnkuZXZlbnRfaWQgPT0gc2VsZi5ldmVudF9jdXJzb3IsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGN1cnNvcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjI0CiAgICAvLyBhc3NlcnQgZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsIGVyci5OT19EVUVfQ0FTSEZMT1cKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPD0KICAgIGFzc2VydCAvLyBObyBkdWUgY2FzaGZsb3cgdG8gcGF5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MjYKICAgIC8vIGV2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYyNwogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX0lFRCk6CiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGR1cAogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYyOC02MzAKICAgIC8vICMgSUVEIGZpbmFsaXplcyBpc3N1YW5jZTogcmVzZXJ2ZWQgdW5pdHMgYmVjb21lIGFjdGl2YXRhYmxlIGFuZCB0aGUKICAgIC8vICMgc2NoZWR1bGUncyBpbml0aWFsIGNvbnRyYWN0dWFsIHN0YXRlIGJlY29tZXMgbGl2ZS4KICAgIC8vIGFzc2VydCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzIKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPT0gc2VsZi50b3RhbF91bml0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjMxLTYzMwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID09IHNlbGYudG90YWxfdW5pdHMKICAgIC8vICksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9JTkNPTVBMRVRFCiAgICBhc3NlcnQgLy8gUHJpbWFyeSBkaXN0cmlidXRpb24gaXMgbm90IGNvbXBsZXRlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzQKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM1CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzYKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAzMwogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzcKICAgIC8vIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM4CiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzkKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0MAogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX0FDVElWRSkKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgMTAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDUxCiAgICAvLyBhc3NlcnQgZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSA9PSBVSW50NjQoZW51bXMuRVZUX0lFRCksIGVyci5OT1RfRVZUX0lFRAogICAgZnJhbWVfZGlnIDExCiAgICBhc3NlcnQgLy8gTm90IElFRCBldmVudAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDUyCiAgICAvLyByZXR1cm4gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0MS02NDUKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1zZWxmLl9lbnRyeV9pZWRfYW1vdW50KGVudHJ5KSwKICAgIC8vICAgICBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0NAogICAgLy8gc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0MS02NDUKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1zZWxmLl9lbnRyeV9pZWRfYW1vdW50KGVudHJ5KSwKICAgIC8vICAgICBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICAvLyApCiAgICBjYWxsc3ViIF9lbWl0X2V4ZWN1dGlvbl9ldmVudAogICAgZHVwCiAgICBmcmFtZV9idXJ5IC0yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NDYKICAgIC8vIHJldHVybgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0OQogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ICs9IHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBmcmFtZV9idXJ5IC0yCiAgICArCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1MQogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1JSKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCAxMgogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMTAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1NQogICAgLy8gcGF5bG9hZC5vYnNlcnZlZF9yYXRlLAogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjU2CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzNyAvLyAicmF0ZV9yZXNldF9tdWx0aXBsaWVyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1NwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1Mi02NTgKICAgIC8vICMgUlIgZGVyaXZlcyB0aGUgbmV4dCByYXRlIGZyb20gYW4gb2JzZXJ2ZWQgb3JhY2xlIHZhbHVlIHBsdXMgdGhlCiAgICAvLyAjIGNvbnRyYWN0IHNwcmVhZCAvIG11bHRpcGxpZXIgdGVybXMsIHRoZW4gZW5mb3JjZXMgZmxvb3IgYW5kIGNhcC4KICAgIC8vIG9ic2VydmVkX3JhdGUgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBwYXlsb2FkLm9ic2VydmVkX3JhdGUsCiAgICAvLyAgICAgc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICkKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjAKICAgIC8vIG9ic2VydmVkX3JhdGUgKyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzYgLy8gInJhdGVfcmVzZXRfc3ByZWFkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkIGV4aXN0cwogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDEKICAgIC8vIGlmIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgYW5kIHJhdGUgPCBzZWxmLnJhdGVfcmVzZXRfZmxvb3I6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzkgLy8gImhhc19yYXRlX3Jlc2V0X2Zsb29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmhhc19yYXRlX3Jlc2V0X2Zsb29yIGV4aXN0cwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMSAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X2Zsb29yIGV4aXN0cwogICAgZnJhbWVfZGlnIDYKICAgID4KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDIKICAgIC8vIHJhdGUgPSBzZWxmLnJhdGVfcmVzZXRfZmxvb3IKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMSAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDYKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfZmxvb3IgZXhpc3RzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1NToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc0MwogICAgLy8gaWYgc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgYW5kIHJhdGUgPiBzZWxmLnJhdGVfcmVzZXRfY2FwOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQwIC8vICJoYXNfcmF0ZV9yZXNldF9jYXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwIGV4aXN0cwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTgKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMiAvLyAicmF0ZV9yZXNldF9jYXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9jYXAgZXhpc3RzCiAgICBmcmFtZV9kaWcgNgogICAgPAogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc0NAogICAgLy8gcmF0ZSA9IHNlbGYucmF0ZV9yZXNldF9jYXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMiAvLyAicmF0ZV9yZXNldF9jYXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSA2CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X2NhcCBleGlzdHMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjU5CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IHNlbGYuX2NsYW1wX3JhdGUoCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NTktNjYxCiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IHNlbGYuX2NsYW1wX3JhdGUoCiAgICAvLyAgICAgb2JzZXJ2ZWRfcmF0ZSArIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQKICAgIC8vICkKICAgIGZyYW1lX2RpZyA2CiAgICBhcHBfZ2xvYmFsX3B1dAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMTg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzEKICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QSSk6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMjAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY3MgogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzMKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDIzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc4CiAgICAvLyBpZiBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKToKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAyOQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc5CiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFJGKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCA1CiAgICA9PQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMzAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4MwogICAgLy8gKyAoc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCAtIHNlbGYuZXZlbnRfY3Vyc29yKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICAtCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODQKICAgIC8vICogVUludDY0KGNzdC5PUF9VUF9OT05fQ0FTSF9QRVJfRU5UUllfQlVER0VUKQogICAgcHVzaGludCAxMDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4My02ODQKICAgIC8vICsgKHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgLSBzZWxmLmV2ZW50X2N1cnNvcikKICAgIC8vICogVUludDY0KGNzdC5PUF9VUF9OT05fQ0FTSF9QRVJfRU5UUllfQlVER0VUKQogICAgKgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjgyCiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX05PTl9DQVNIX0JBU0VfQlVER0VUKQogICAgaW50YyA0IC8vIDE1MDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4Mi02ODQKICAgIC8vIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfQkFTRV9CVURHRVQpCiAgICAvLyArIChzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IC0gc2VsZi5ldmVudF9jdXJzb3IpCiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfUEVSX0VOVFJZX0JVREdFVCkKICAgICsKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4MC02ODYKICAgIC8vIGVuc3VyZV9idWRnZXQoCiAgICAvLyAgICAgcmVxdWlyZWRfYnVkZ2V0PSgKICAgIC8vICAgICAgICAgVUludDY0KGNzdC5PUF9VUF9OT05fQ0FTSF9CQVNFX0JVREdFVCkKICAgIC8vICAgICAgICAgKyAoc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCAtIHNlbGYuZXZlbnRfY3Vyc29yKQogICAgLy8gICAgICAgICAqIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfUEVSX0VOVFJZX0JVREdFVCkKICAgIC8vICAgICApLAogICAgLy8gKQogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDkwCiAgICAvLyBkaXNjb3VudF9mYWN0b3IgPSBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5MQogICAgLy8gZGVub21pbmF0b3IgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5MgogICAgLy8gc2tpcF9maXJzdF9yZWRlbXB0aW9uID0gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5NAogICAgLy8gaWYgZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAyNQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgZnJhbWVfYnVyeSA4CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAzNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDk1LTQ5OQogICAgLy8gIyBBbiBpbml0aWFsIFBSRiBtYXkgZGVzY3JpYmUgdGhlIGZpcnN0IHJlZGVtcHRpb24gcGVyaW9kIGRpcmVjdGx5LgogICAgLy8gZGlzY291bnRfZmFjdG9yID0gc2VsZi5fZGlzY291bnRfYW5udWl0eV9mYWN0b3IoCiAgICAvLyAgICAgZGlzY291bnRfZmFjdG9yLAogICAgLy8gICAgIGVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDgKICAgIGNhbGxzdWIgX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTAxCiAgICAvLyBza2lwX2ZpcnN0X3JlZGVtcHRpb24gPSBUcnVlCiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfYnVyeSA3CiAgICBmcmFtZV9idXJ5IDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDM1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTAzCiAgICAvLyBmdXR1cmVfZXZlbnRfaWQgPSBzZWxmLmV2ZW50X2N1cnNvciArIFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfd2hpbGVfdG9wQDM2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA0CiAgICAvLyB3aGlsZSBmdXR1cmVfZXZlbnRfaWQgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgZnJhbWVfZGlnIDMKICAgID4KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl93aGlsZUA0OAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA1CiAgICAvLyBmdXR1cmVfZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoZnV0dXJlX2V2ZW50X2lkKQogICAgZnJhbWVfZGlnIDMKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwNgogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPSBmdXR1cmVfZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MDctNTA4CiAgICAvLyAjIE9ubHkgcmVkZW1wdGlvbi1iZWFyaW5nIGV2ZW50cyBjb250cmlidXRlIHRvIHRoZSBhbm51aXR5IGRlbm9taW5hdG9yLgogICAgLy8gaXNfcmVkZW1wdGlvbl9ldmVudCA9IGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpIG9yICgKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwNy01MTEKICAgIC8vICMgT25seSByZWRlbXB0aW9uLWJlYXJpbmcgZXZlbnRzIGNvbnRyaWJ1dGUgdG8gdGhlIGFubnVpdHkgZGVub21pbmF0b3IuCiAgICAvLyBpc19yZWRlbXB0aW9uX2V2ZW50ID0gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QUikgb3IgKAogICAgLy8gICAgIGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfTUQpCiAgICAvLyAgICAgYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICAvLyApCiAgICBibnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfdHJ1ZUA0MAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA5CiAgICAvLyBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgZnJhbWVfZGlnIDQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MDktNTEwCiAgICAvLyBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgLy8gYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF9mYWxzZUA0MQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTEwCiAgICAvLyBhbmQgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IgPiBVSW50NjQoMCkKICAgIGZyYW1lX2RpZyAwCiAgICBwdXNoaW50IDI1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA5LTUxMAogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCkKICAgIC8vIGFuZCBmdXR1cmVfZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX3RydWVANDA6CiAgICBpbnRjXzEgLy8gMQoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfbWVyZ2VANDI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTIKICAgIC8vIGlmIGlzX3JlZGVtcHRpb25fZXZlbnQ6CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA0NwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTEzCiAgICAvLyBpZiBza2lwX2ZpcnN0X3JlZGVtcHRpb246CiAgICBmcmFtZV9kaWcgNwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUA0NQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTE0CiAgICAvLyBza2lwX2ZpcnN0X3JlZGVtcHRpb24gPSBGYWxzZQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgNwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANDc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjEKICAgIC8vIGZ1dHVyZV9ldmVudF9pZCArPSBVSW50NjQoMSkKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV93aGlsZV90b3BAMzYKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlANDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTgKICAgIC8vIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZnJhbWVfZGlnIDAKICAgIHB1c2hpbnQgMjUKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTYtNTE5CiAgICAvLyBkaXNjb3VudF9mYWN0b3IgPSBzZWxmLl9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcigKICAgIC8vICAgICBkaXNjb3VudF9mYWN0b3IsCiAgICAvLyAgICAgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMgogICAgc3dhcAogICAgY2FsbHN1YiBfZGlzY291bnRfYW5udWl0eV9mYWN0b3IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjAKICAgIC8vIGRlbm9taW5hdG9yICs9IGRpc2NvdW50X2ZhY3RvcgogICAgZnJhbWVfZGlnIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA0NwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDE6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF9tZXJnZUA0MgoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX3doaWxlQDQ4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTIzCiAgICAvLyBhc3NlcnQgZGVub21pbmF0b3IgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZnJhbWVfZGlnIDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUyNAogICAgLy8gbnVtZXJhdG9yID0gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTI1CiAgICAvLyBpZiBlbnRyeS5mbGFncyAmIFVJbnQ2NChlbnVtcy5GTEFHX0lOSVRJQUxfUFJGKSA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNTcKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gOAogICAgJgogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDUwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjYtNTI3CiAgICAvLyAjIFN1YnNlcXVlbnQgUFJGIGV2ZW50cyBhbW9ydGl6ZSBib3RoIHByaW5jaXBhbCBhbmQgYWxyZWFkeSBhY2NydWVkIGNhcnJ5LgogICAgLy8gbnVtZXJhdG9yICs9IHNlbGYuYWNjcnVlZF9pbnRlcmVzdAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgICsKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDUwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTMwCiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTI4LTUzMgogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIG51bWVyYXRvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gICAgIGRlbm9taW5hdG9yLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDEKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODcKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IHNlbGYuX3JlY2FsY3VsYXRlX2FubnVpdHlfcGF5bWVudCgKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njg3LTY4OQogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gc2VsZi5fcmVjYWxjdWxhdGVfYW5udWl0eV9wYXltZW50KAogICAgLy8gICAgIGVudHJ5CiAgICAvLyApCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMzA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OTIKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY5My02OTcKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1VSW50NjQoMCksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OTUKICAgIC8vIHBheW9mZj1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njk2CiAgICAvLyBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY5My02OTcKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1VSW50NjQoMCksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgY2FsbHN1YiBfZW1pdF9leGVjdXRpb25fZXZlbnQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDI5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjkxCiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDMwCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDIwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc0CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9JUENCKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCAxOAogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDIzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzUtNjc2CiAgICAvLyAjIElQQ0Iga2VlcHMgcHJpbmNpcGFsIHVuY2hhbmdlZCBhbmQgb25seSByZXNldHMgdGhlIGludGVyZXN0IGJhc2UuCiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIGIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMjMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMTA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjIKICAgIC8vIGVsaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1JSRik6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgMTEKICAgID09CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDE0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjMKICAgIC8vIG5leHRfcmF0ZSA9IGVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY0CiAgICAvLyBpZiBuZXh0X3JhdGUgPT0gVUludDY0KDApOgogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDEzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjUKICAgIC8vIG5leHRfcmF0ZSA9IHNlbGYucmF0ZV9yZXNldF9uZXh0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzggLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDUKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfbmV4dCBleGlzdHMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY2CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IG5leHRfcmF0ZQogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgZnJhbWVfZGlnIDUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDE0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY4CiAgICAvLyBpZiBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSAhPSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgOQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2OQogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPSBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZQogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgZnJhbWVfZGlnIDkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KGVudHJ5OiBieXRlcywgcGF5b2ZmOiB1aW50NjQsIHNldHRsZWRfYW1vdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpfZW1pdF9leGVjdXRpb25fZXZlbnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MDMtNzA5CiAgICAvLyBkZWYgX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgKiwKICAgIC8vICAgICBlbnRyeTogdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnksCiAgICAvLyAgICAgcGF5b2ZmOiBVSW50NjQsCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ6IFVJbnQ2NCwKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDMgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzEzCiAgICAvLyBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25JRAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE0CiAgICAvLyBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIGZyYW1lX2RpZyAtMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTUKICAgIC8vIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIGZyYW1lX2RpZyAtMwogICAgZXh0cmFjdCA4IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxNgogICAgLy8gc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICBmcmFtZV9kaWcgLTMKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTcKICAgIC8vIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MjAKICAgIC8vIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIGZyYW1lX2RpZyAtMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE1CiAgICAvLyBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICBpbnRjXzIgLy8gOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIwCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBnZXRieXRlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDkKICAgIC8vIGlmIHBheW9mZiA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJueiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NTAKICAgIC8vIHJldHVybiBVSW50NjQoZW51bXMuUEFZT0ZGX1NJR05fUE9TSVRJVkUpCiAgICBpbnRjXzEgLy8gMQoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX3BheW9mZl9zaWduQDc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTktNzIxCiAgICAvLyBwYXlvZmZfc2lnbj1hcmM0LlVJbnQ4KAogICAgLy8gICAgIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIC8vICksCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgaW50Y18yIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MjMKICAgIC8vIGN1cnJlbmN5X2lkPXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzI0CiAgICAvLyBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTItNzI1CiAgICAvLyBFeGVjdXRpb25FdmVudCgKICAgIC8vICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIC8vICAgICBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYXBwbGllZF9hdD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICBwYXlvZmY9cGF5b2ZmLAogICAgLy8gICAgIHBheW9mZl9zaWduPWFyYzQuVUludDgoCiAgICAvLyAgICAgICAgIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIC8vICAgICApLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PXNldHRsZWRfYW1vdW50LAogICAgLy8gICAgIGN1cnJlbmN5X2lkPXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAwCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzExLTcyNgogICAgLy8gYXJjNC5lbWl0KAogICAgLy8gICAgIEV4ZWN1dGlvbkV2ZW50KAogICAgLy8gICAgICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgICAgIHBheW9mZj1wYXlvZmYsCiAgICAvLyAgICAgICAgIHBheW9mZl9zaWduPWFyYzQuVUludDgoCiAgICAvLyAgICAgICAgICAgICBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICAvLyAgICAgICAgICksCiAgICAvLyAgICAgICAgIHNldHRsZWRfYW1vdW50PXNldHRsZWRfYW1vdW50LAogICAgLy8gICAgICAgICBjdXJyZW5jeV9pZD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgICAgIHNlcXVlbmNlPWVudHJ5LmV2ZW50X2lkICsgVUludDY0KDEpLAogICAgLy8gICAgICkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDlhMzMyYjk1IC8vIG1ldGhvZCAiRXhlY3V0aW9uRXZlbnQodWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc1MQogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiAoVUludDY0KGVudW1zLkVWVF9JRUQpLCBVSW50NjQoZW51bXMuRVZUX1BJKSk6CiAgICBmcmFtZV9kaWcgNQogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBibnogX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2lmX2JvZHlANQogICAgZnJhbWVfZGlnIDUKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGJ6IF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pZl9lbHNlQDYKCl9lbWl0X2V4ZWN1dGlvbl9ldmVudF9pZl9ib2R5QDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NTIKICAgIC8vIHJldHVybiBVSW50NjQoZW51bXMuUEFZT0ZGX1NJR05fUE9TSVRJVkUpCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIwCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBiIF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9wYXlvZmZfc2lnbkA3CgpfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzUzCiAgICAvLyByZXR1cm4gVUludDY0KGVudW1zLlBBWU9GRl9TSUdOX05FR0FUSVZFKQogICAgcHVzaGludCAyNTUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcyMAogICAgLy8gc2VsZi5fcGF5b2ZmX3NpZ24oZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSwgcGF5b2ZmKQogICAgYiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fcGF5b2ZmX3NpZ25ANwoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9yb2xlX2lzX2FjdGl2ZShyb2xlX21hcDogYnl0ZXMsIHJvbGVfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NDoKX3JvbGVfaXNfYWN0aXZlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5CiAgICAvLyBkZWYgX3JvbGVfaXNfYWN0aXZlKHNlbGYsIHJvbGVfbWFwOiB0eXAuUmJhY1JvbGUsIHJvbGVfYWRkcmVzczogQWNjb3VudCkgLT4gYm9vbDoKICAgIHByb3RvIDIgMQogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTcKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAtNjQKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYxCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjIKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYxLTYyCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYxLTYzCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjMKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjItNjMKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgPj0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2MS02MwogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX21lcmdlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAtNjQKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKSAtPiB2b2lkOgpfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2NwogICAgLy8gYXNzZXJ0IHNlbGYuX2lzX2FycmFuZ2VyKFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTQKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgPT0gc2VsZi5hcnJhbmdlci52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE4IC8vIDB4NTIzYTQxNTI1MjIzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJyYW5nZXIgZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjY3CiAgICAvLyBhc3NlcnQgc2VsZi5faXNfYXJyYW5nZXIoVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9pc19ub3RfY29udHJhY3RfZGVmYXVsdGVkKCkgLT4gdm9pZDoKX2Fzc2VydF9pc19ub3RfY29udHJhY3RfZGVmYXVsdGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg1CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuZGVmYXVsdGVkLCBlcnIuREVGQVVMVEVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzQgLy8gImRlZmF1bHRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kZWZhdWx0ZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRGVmYXVsdGVkCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fYXNzZXJ0X2lzX25vdF9jb250cmFjdF9zdXNwZW5kZWQoKSAtPiB2b2lkOgpfYXNzZXJ0X2lzX25vdF9jb250cmFjdF9zdXNwZW5kZWQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODgKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5jb250cmFjdF9zdXNwZW5kZWQsIGVyci5TVVNQRU5ERUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMyAvLyAiY29udHJhY3Rfc3VzcGVuZGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3N1c3BlbmRlZCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBTdXNwZW5kZWQgb3BlcmF0aW9ucwogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGVfaWQ6IHVpbnQ2NCkgLT4gdm9pZDoKX2Fzc2VydF92YWxpZF9yb2xlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkwCiAgICAvLyBkZWYgX2Fzc2VydF92YWxpZF9yb2xlKHNlbGYsIHJvbGVfaWQ6IFVJbnQ2NCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkxLTk5CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MgogICAgLy8gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgcHVzaGludCAyMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkxLTk5CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTMKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICBwdXNoaW50IDI1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEtOTkKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NAogICAgLy8gVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIHB1c2hpbnQgNDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MS05OQogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojk1CiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICBwdXNoaW50IDUwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEtOTkKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NgogICAgLy8gVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICBwdXNoaW50IDYwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEtOTkKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NwogICAgLy8gVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIHB1c2hpbnQgNzAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MS05OQogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojk4CiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICBwdXNoaW50IDgwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEtOTkKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBieiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9mYWxzZUA4CgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDc6CiAgICBpbnRjXzEgLy8gMQoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfbWVyZ2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MS05OQogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICByZXRzdWIKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX2ZhbHNlQDg6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9tZXJnZUA5Cg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" }, "byteCode": { diff --git a/src/artifacts/dasa_client.py b/src/artifacts/dasa_client.py index 76547622..ee84df32 100644 --- a/src/artifacts/dasa_client.py +++ b/src/artifacts/dasa_client.py @@ -19,7 +19,7 @@ import algokit_utils from algokit_utils import AlgorandClient as _AlgoKitAlgorandClient -_APP_SPEC_JSON = r"""{"arcs": [22, 28], "bareActions": {"call": [], "create": []}, "methods": [{"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "desc": "Maximum number of due cash events to process in this call.", "name": "max_event_count"}], "name": "fund_due_cashflows", "returns": {"type": "(uint64,uint64,uint64,uint64,uint64)", "desc": "Funding result with reserved interest, reserved principal, and event count.", "struct": "CashFundingResult"}, "desc": "Reserve due ACTUS cash events into the escrow-style claim ledger.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Holder whose position should be settled and claimed.", "name": "holding_address"}, {"type": "byte[]", "desc": "Opaque settlement context returned in the result.", "name": "payment_info"}], "name": "claim_due_cashflows", "returns": {"type": "(uint64,uint64,uint64,uint64,byte[])", "desc": "Claim result with realized interest, principal, and passthrough context.", "struct": "CashClaimResult"}, "desc": "Withdraw the holder's already funded ACTUS cash entitlements.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "desc": "Inclusive UNIX timestamp at which transfers may start.", "name": "open_date"}, {"type": "uint64", "desc": "Exclusive UNIX timestamp at which transfers stop.", "name": "closure_date"}], "name": "transfer_set_schedule", "returns": {"type": "uint64", "desc": "UNIX timestamp of the schedule update."}, "desc": "Configure the secondary-market transfer window.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account receiving the reserved units.", "name": "holding_address"}, {"type": "uint64", "desc": "Number of units to reserve.", "name": "units"}], "name": "primary_distribution", "returns": {"type": "uint64", "desc": "Remaining undistributed unit balance."}, "desc": "Reserve units for a holder before the initial exchange activates issuance.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account debited for the transfer.", "name": "sender_holding_address"}, {"type": "address", "desc": "Account credited for the transfer.", "name": "receiver_holding_address"}, {"type": "uint64", "desc": "Number of active units to move.", "name": "units"}], "name": "transfer", "returns": {"type": "uint64", "desc": "Number of units transferred."}, "desc": "Transfer active units after settling both counterparties to the current cursor.\nReturns the number of units moved. The ACTUS kernel no longer persists a nominal per-unit value on-chain, so transfer results are unit-based.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account holding address.", "name": "holding_address"}, {"type": "bool", "desc": "Suspension status to apply.", "name": "suspended"}], "name": "account_suspension", "returns": {"type": "uint64", "desc": "UNIX timestamp of the suspension update."}, "desc": "Set the suspension status of one account.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account holding address.", "name": "holding_address"}, {"type": "address", "desc": "Account payment address.", "name": "payment_address"}], "name": "account_open", "returns": {"type": "uint64", "desc": "UNIX timestamp of the account opening."}, "desc": "Open a contract account with a new position and register its payment address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account holding address.", "name": "holding_address"}, {"type": "address", "desc": "New account payment address.", "name": "payment_address"}], "name": "account_update_payment_address", "returns": {"type": "uint64", "desc": "UNIX timestamp of the account update."}, "desc": "Update the payment address of an account.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account holding address.", "name": "holding_address"}], "name": "account_get_position", "returns": {"type": "(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64)", "desc": "Account position record.", "struct": "AccountPosition"}, "desc": "Get the full accounting position for one holder.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": [], "create": ["NoOp"]}, "args": [{"type": "address", "desc": "D-ASA arranger address.", "name": "arranger"}], "name": "contract_create", "returns": {"type": "uint64", "desc": "UNIX timestamp of contract creation."}, "desc": "Create a new D-ASA contract and set the arranger role.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64)", "desc": "Normalized ACTUS terms.", "name": "terms", "struct": "NormalizedActusTerms"}, {"type": "(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "desc": "Initial kernel state captured before `IED`.", "name": "initial_state", "struct": "InitialKernelState"}, {"type": "(byte[32],string)", "desc": "Prospectus metadata stored for reference only.", "name": "prospectus", "struct": "Prospectus"}], "name": "contract_config", "returns": {"type": "uint64", "desc": "UNIX timestamp of contract configuration."}, "desc": "Partial contract configuration with: normalized ACTUS terms, initial kernel\nstate (pre-IED), prospectus (informational only). The contract stays inactive until all schedule pages are configured next.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "desc": "Zero-based page index within the boxed schedule.", "name": "schedule_page_index"}, {"type": "bool", "desc": "Whether this page finalizes the schedule upload.", "name": "is_last_page"}, {"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[]", "desc": "Normalized schedule entries for the requested page.", "name": "schedule_page"}], "name": "contract_schedule", "returns": {"type": "uint64", "desc": "UNIX timestamp of the schedule upload."}, "desc": "Upload one normalized schedule page.\nThe configuration operation is considered complete only when the last page is stored. At that point `schedule_entry_count` is finalized and the contract moves to `STATUS_PENDING_IED`.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "contract_execute_ied", "returns": {"type": "uint64", "desc": "UNIX timestamp of the `IED` execution."}, "desc": "Execute the first due `IED` entry and activate the contract.\n`IED` is the one non-cash event that moves the app from `STATUS_PENDING_IED` to `STATUS_ACTIVE`.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "desc": "Expected global schedule event identifier at the current cursor.", "name": "event_id"}, {"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "desc": "Observed payload used for append-on-execute and/or rate resets.", "name": "payload", "struct": "ObservedEventRequest"}], "name": "apply_non_cash_event", "returns": {"type": "uint64", "desc": "UNIX timestamp of the non-cash event application."}, "desc": "Apply the next due non-cash event, optionally appending one first.\nObserved payloads are appended before execution when flagged. Rate reset events require the interest oracle because they can change the running nominal rate; other non-cash events stay arranger-controlled.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "desc": "Observed cash-event payload to append after the current tail.", "name": "payload", "struct": "ObservedCashEventRequest"}], "name": "append_observed_cash_event", "returns": {"type": "uint64", "desc": "UNIX timestamp of the append operation."}, "desc": "Append an arranger-authorized observed cash event to the schedule tail.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "contract_get_state", "returns": {"type": "(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "desc": "Current kernel state snapshot.", "struct": "KernelState"}, "desc": "Return a readonly snapshot of the generic ACTUS kernel state.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "contract_get_next_due_event", "returns": {"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "desc": "Next due schedule entry, or an all-zero sentinel if the contract ended.", "struct": "ExecutionScheduleEntry"}, "desc": "Return the next boxed schedule entry, or a zeroed sentinel if ended.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["UpdateApplication"], "create": []}, "args": [], "name": "contract_update", "returns": {"type": "void", "desc": "None."}, "desc": "Update D-ASA application.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "New arranger address.", "name": "new_arranger"}], "name": "rbac_rotate_arranger", "returns": {"type": "uint64", "desc": "UNIX timestamp of the role assignment."}, "desc": "Rotate the arranger address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Operation daemon address.", "name": "address"}], "name": "rbac_set_op_daemon", "returns": {"type": "uint64", "desc": "UNIX timestamp of the role assignment."}, "desc": "Non-normative helper to set the operation daemon address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role identifier.", "name": "role_id"}, {"type": "address", "desc": "Account role address.", "name": "role_address"}, {"type": "(uint64,uint64)", "desc": "Inclusive validity interval for the assignment.", "name": "validity", "struct": "RoleValidity"}], "name": "rbac_assign_role", "returns": {"type": "uint64", "desc": "UNIX timestamp of the role assignment."}, "desc": "Assign a role to an address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role identifier.", "name": "role_id"}, {"type": "address", "desc": "Account role address.", "name": "role_address"}], "name": "rbac_revoke_role", "returns": {"type": "uint64", "desc": "UNIX timestamp of the role revocation."}, "desc": "Revoke a role from an address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Suspension status to apply.", "name": "suspended"}], "name": "rbac_contract_suspension", "returns": {"type": "uint64", "desc": "UNIX timestamp of the suspension update."}, "desc": "Set the asset-wide suspension status.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Default status", "name": "defaulted"}], "name": "rbac_contract_default", "returns": {"type": "uint64"}, "desc": "Set D-ASA default status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "rbac_get_arranger", "returns": {"type": "address", "desc": "Current arranger address."}, "desc": "Get the arranger address.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Address to query.", "name": "address"}], "name": "rbac_get_address_roles", "returns": {"type": "(bool,bool,bool,bool,bool)", "desc": "Roles mask in the order: account manager, primary dealer, trustee, authority, observer."}, "desc": "Non-normative helper to get the active roles assigned to an address.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role identifier.", "name": "role_id"}, {"type": "address", "desc": "Account role address.", "name": "role_address"}], "name": "rbac_get_role_validity", "returns": {"type": "(uint64,uint64)", "desc": "Stored role validity interval.", "struct": "RoleValidity"}, "desc": "Get the stored validity interval for a role assignment.", "events": [], "readonly": true, "recommendations": {}}], "name": "DASA", "state": {"keys": {"box": {}, "global": {"arranger": {"key": "UjpBUlIj", "keyType": "AVMBytes", "valueType": "address"}, "op_daemon": {"key": "UjpPUEQj", "keyType": "AVMBytes", "valueType": "address"}, "contract_suspended": {"key": "Y29udHJhY3Rfc3VzcGVuZGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "defaulted": {"key": "ZGVmYXVsdGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "status": {"key": "c3RhdHVz", "keyType": "AVMString", "valueType": "AVMUint64"}, "contract_type": {"key": "Y29udHJhY3RfdHlwZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "prospectus_hash": {"key": "cHJvc3BlY3R1c19oYXNo", "keyType": "AVMString", "valueType": "AVMBytes"}, "prospectus_url": {"key": "cHJvc3BlY3R1c191cmw=", "keyType": "AVMString", "valueType": "AVMString"}, "denomination_asset_id": {"key": "ZGVub21pbmF0aW9uX2Fzc2V0X2lk", "keyType": "AVMString", "valueType": "AVMUint64"}, "settlement_asset_id": {"key": "c2V0dGxlbWVudF9hc3NldF9pZA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "initial_exchange_date": {"key": "aW5pdGlhbF9leGNoYW5nZV9kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "maturity_date": {"key": "bWF0dXJpdHlfZGF0ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "transfer_opening_date": {"key": "dHJhbnNmZXJfb3BlbmluZ19kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "transfer_closure_date": {"key": "dHJhbnNmZXJfY2xvc3VyZV9kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "day_count_convention": {"key": "ZGF5X2NvdW50X2NvbnZlbnRpb24=", "keyType": "AVMString", "valueType": "AVMUint64"}, "total_units": {"key": "dG90YWxfdW5pdHM=", "keyType": "AVMString", "valueType": "AVMUint64"}, "reserved_units_total": {"key": "cmVzZXJ2ZWRfdW5pdHNfdG90YWw=", "keyType": "AVMString", "valueType": "AVMUint64"}, "initial_exchange_amount": {"key": "aW5pdGlhbF9leGNoYW5nZV9hbW91bnQ=", "keyType": "AVMString", "valueType": "AVMUint64"}, "outstanding_principal": {"key": "b3V0c3RhbmRpbmdfcHJpbmNpcGFs", "keyType": "AVMString", "valueType": "AVMUint64"}, "next_principal_redemption": {"key": "bmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbg==", "keyType": "AVMString", "valueType": "AVMUint64"}, "dynamic_principal_redemption": {"key": "ZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbg==", "keyType": "AVMString", "valueType": "AVMUint64"}, "interest_calculation_base": {"key": "aW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "accrued_interest": {"key": "YWNjcnVlZF9pbnRlcmVzdA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "nominal_interest_rate": {"key": "bm9taW5hbF9pbnRlcmVzdF9yYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_spread": {"key": "cmF0ZV9yZXNldF9zcHJlYWQ=", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_multiplier": {"key": "cmF0ZV9yZXNldF9tdWx0aXBsaWVy", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_floor": {"key": "cmF0ZV9yZXNldF9mbG9vcg==", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_cap": {"key": "cmF0ZV9yZXNldF9jYXA=", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_next": {"key": "cmF0ZV9yZXNldF9uZXh0", "keyType": "AVMString", "valueType": "AVMUint64"}, "has_rate_reset_floor": {"key": "aGFzX3JhdGVfcmVzZXRfZmxvb3I=", "keyType": "AVMString", "valueType": "AVMUint64"}, "has_rate_reset_cap": {"key": "aGFzX3JhdGVfcmVzZXRfY2Fw", "keyType": "AVMString", "valueType": "AVMUint64"}, "reserved_principal": {"key": "cmVzZXJ2ZWRfcHJpbmNpcGFs", "keyType": "AVMString", "valueType": "AVMUint64"}, "reserved_interest": {"key": "cmVzZXJ2ZWRfaW50ZXJlc3Q=", "keyType": "AVMString", "valueType": "AVMUint64"}, "cumulative_interest_index": {"key": "Y3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "cumulative_principal_index": {"key": "Y3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXg=", "keyType": "AVMString", "valueType": "AVMUint64"}, "event_cursor": {"key": "ZXZlbnRfY3Vyc29y", "keyType": "AVMString", "valueType": "AVMUint64"}, "schedule_entry_count": {"key": "c2NoZWR1bGVfZW50cnlfY291bnQ=", "keyType": "AVMString", "valueType": "AVMUint64"}, "fixed_point_scale": {"key": "Zml4ZWRfcG9pbnRfc2NhbGU=", "keyType": "AVMString", "valueType": "AVMUint64"}}, "local": {}}, "maps": {"box": {"account_manager": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpNTkcj"}, "primary_dealer": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpQWUQj"}, "trustee": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpUUlMj"}, "authority": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpBVVQj"}, "observer": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpNT0Mj"}, "schedule_page": {"keyType": "uint64", "valueType": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[]", "prefix": "UyM="}, "account": {"keyType": "address", "valueType": "AccountPosition", "prefix": "QSM="}}, "global": {}, "local": {}}, "schema": {"global": {"bytes": 10, "ints": 54}, "local": {"bytes": 0, "ints": 0}}}, "structs": {"AccountPosition": [{"name": "payment_address", "type": "address"}, {"name": "units", "type": "uint64"}, {"name": "reserved_units", "type": "uint64"}, {"name": "suspended", "type": "bool"}, {"name": "settled_cursor", "type": "uint64"}, {"name": "interest_checkpoint", "type": "uint64"}, {"name": "principal_checkpoint", "type": "uint64"}, {"name": "claimable_interest", "type": "uint64"}, {"name": "claimable_principal", "type": "uint64"}], "CashClaimResult": [{"name": "interest_amount", "type": "uint64"}, {"name": "principal_amount", "type": "uint64"}, {"name": "total_amount", "type": "uint64"}, {"name": "timestamp", "type": "uint64"}, {"name": "context", "type": "byte[]"}], "CashFundingResult": [{"name": "funded_interest", "type": "uint64"}, {"name": "funded_principal", "type": "uint64"}, {"name": "total_funded", "type": "uint64"}, {"name": "processed_events", "type": "uint64"}, {"name": "timestamp", "type": "uint64"}], "ExecutionScheduleEntry": [{"name": "event_id", "type": "uint64"}, {"name": "event_type", "type": "uint8"}, {"name": "scheduled_time", "type": "uint64"}, {"name": "accrual_factor", "type": "uint64"}, {"name": "redemption_accrual_factor", "type": "uint64"}, {"name": "next_nominal_interest_rate", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "next_outstanding_principal", "type": "uint64"}, {"name": "flags", "type": "uint64"}], "InitialKernelState": [{"name": "status_date", "type": "uint64"}, {"name": "event_cursor", "type": "uint64"}, {"name": "outstanding_principal", "type": "uint64"}, {"name": "interest_calculation_base", "type": "uint64"}, {"name": "nominal_interest_rate", "type": "uint64"}, {"name": "accrued_interest", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "cumulative_interest_index", "type": "uint64"}, {"name": "cumulative_principal_index", "type": "uint64"}], "KernelState": [{"name": "contract_type", "type": "uint8"}, {"name": "status", "type": "uint64"}, {"name": "total_units", "type": "uint64"}, {"name": "reserved_units_total", "type": "uint64"}, {"name": "initial_exchange_amount", "type": "uint64"}, {"name": "event_cursor", "type": "uint64"}, {"name": "schedule_entry_count", "type": "uint64"}, {"name": "outstanding_principal", "type": "uint64"}, {"name": "interest_calculation_base", "type": "uint64"}, {"name": "nominal_interest_rate", "type": "uint64"}, {"name": "accrued_interest", "type": "uint64"}, {"name": "cumulative_interest_index", "type": "uint64"}, {"name": "cumulative_principal_index", "type": "uint64"}, {"name": "reserved_interest", "type": "uint64"}, {"name": "reserved_principal", "type": "uint64"}], "NormalizedActusTerms": [{"name": "contract_type", "type": "uint8"}, {"name": "denomination_asset_id", "type": "uint64"}, {"name": "settlement_asset_id", "type": "uint64"}, {"name": "total_units", "type": "uint64"}, {"name": "notional_principal", "type": "uint64"}, {"name": "initial_exchange_amount", "type": "uint64"}, {"name": "initial_exchange_date", "type": "uint64"}, {"name": "maturity_date", "type": "uint64"}, {"name": "day_count_convention", "type": "uint8"}, {"name": "rate_reset_spread", "type": "uint64"}, {"name": "rate_reset_multiplier", "type": "uint64"}, {"name": "rate_reset_floor", "type": "uint64"}, {"name": "rate_reset_cap", "type": "uint64"}, {"name": "rate_reset_next", "type": "uint64"}, {"name": "has_rate_reset_floor", "type": "bool"}, {"name": "has_rate_reset_cap", "type": "bool"}, {"name": "dynamic_principal_redemption", "type": "bool"}, {"name": "fixed_point_scale", "type": "uint64"}], "ObservedCashEventRequest": [{"name": "event_id", "type": "uint64"}, {"name": "event_type", "type": "uint8"}, {"name": "scheduled_time", "type": "uint64"}, {"name": "accrual_factor", "type": "uint64"}, {"name": "redemption_accrual_factor", "type": "uint64"}, {"name": "next_nominal_interest_rate", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "next_outstanding_principal", "type": "uint64"}, {"name": "flags", "type": "uint64"}], "ObservedEventRequest": [{"name": "event_id", "type": "uint64"}, {"name": "event_type", "type": "uint8"}, {"name": "scheduled_time", "type": "uint64"}, {"name": "accrual_factor", "type": "uint64"}, {"name": "redemption_accrual_factor", "type": "uint64"}, {"name": "observed_rate", "type": "uint64"}, {"name": "next_nominal_interest_rate", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "next_outstanding_principal", "type": "uint64"}, {"name": "flags", "type": "uint64"}], "Prospectus": [{"name": "hash", "type": "byte[32]"}, {"name": "url", "type": "string"}], "RoleValidity": [{"name": "role_validity_start", "type": "uint64"}, {"name": "role_validity_end", "type": "uint64"}]}, "byteCode": {"approval": "DCAFAAEIINwLJjEEFR98dQZzdGF0dXMMZXZlbnRfY3Vyc29yFHNjaGVkdWxlX2VudHJ5X2NvdW50FW91dHN0YW5kaW5nX3ByaW5jaXBhbBFmaXhlZF9wb2ludF9zY2FsZRBhY2NydWVkX2ludGVyZXN0GWludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UCQSMVbm9taW5hbF9pbnRlcmVzdF9yYXRlDWNvbnRyYWN0X3R5cGUUcmVzZXJ2ZWRfdW5pdHNfdG90YWwScmVzZXJ2ZWRfcHJpbmNpcGFsC3RvdGFsX3VuaXRzGW5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24RcmVzZXJ2ZWRfaW50ZXJlc3QZY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleBpjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleAZSOkFSUiMTc2V0dGxlbWVudF9hc3NldF9pZBdpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudAZSOkFVVCMGUjpQWUQjBlI6TU5HIwJTIwZSOk1PQyMGUjpUUlMjBlI6T1BEIxVpbml0aWFsX2V4Y2hhbmdlX2RhdGUVdHJhbnNmZXJfb3BlbmluZ19kYXRlFXRyYW5zZmVyX2Nsb3N1cmVfZGF0ZRByYXRlX3Jlc2V0X2Zsb29yDnJhdGVfcmVzZXRfY2FwEmNvbnRyYWN0X3N1c3BlbmRlZAlkZWZhdWx0ZWQcZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbhFyYXRlX3Jlc2V0X3NwcmVhZBVyYXRlX3Jlc2V0X211bHRpcGxpZXIPcmF0ZV9yZXNldF9uZXh0FGhhc19yYXRlX3Jlc2V0X2Zsb29yEmhhc19yYXRlX3Jlc2V0X2NhcAEAD3Byb3NwZWN0dXNfaGFzaA5wcm9zcGVjdHVzX3VybBVkZW5vbWluYXRpb25fYXNzZXRfaWQNbWF0dXJpdHlfZGF0ZRRkYXlfY291bnRfY29udmVudGlvbgMGgQECAAAxGEAArScSMgNnJxsyA2cnISJnJyIiZykiZycKImcnKoAAZycrgABnJywiZycTImcnHCJnJy0iZycdImcnHiJnJy4iZycNImcnCyJnJxQiZycEImcnDiJnJyMiZycHImcnBiJnJwkiZyckImcnJSJnJx8iZycgImcnJiJnJyciZycoImcnDCJnJw8iZycQImcnESJnKiJnKyJnJwUiZzE1gQoSRDE0gTYSRDE3FEQxNhREgASRTwTrNhoAjgEAzjEZFEQxGEEAt4IZBLRGGMgE54MlKQSUOIcjBGyF4+4EvdGpRAR8DxgSBBT8EO8EdKcpfwQJ1P4UBJqb+oUEhe7TPQSrLA/EBNnyJawEmINQWgSOpudMBAKvVXoEgvcbLQTvBPXTBN80NVAEPb6AvQQePkjnBDkkH6MEAQyCmQR0BqzSBBpyou42GgCOGQBWAyEEfQSnBTEGIQZbBrMG5gcUCQgKHwqYDAQM9g2JDc4N5g3+DrMPSQ9oD4cPkg/cAIAElW1xVjYaAI4BBvEAMRmBBBIxGBBEQg2uigIAi/6BCgiLADIMDUEAKrGBBrIQgQWyGScvsh4nL7Ifi/+NAgALAASzQv/bMgCyAUL/9SKyAUL/74kigABHDTYaAUkVJBJEFyIpZUREiBW9iBXEiBXJIillRIEyEhREiBIgQQALSYFkCyEECCKI/48iRQUiRQ4iRQ1LBEsBDEECWSIqZUQiK2VEDEECTSIqZUSIEPJJRRGBCVtJRQMyBw1AAjdLDyRVSUUQJBJJRQRAABBLDoEDEkAACEsOgRMSQQI/I0ECFEsPIlsiKmVEEkRLATIHDkRLAkAB7UsOgRMSQAHlIkULSw8kVUlFEIEDEkABZUsOgRMSQAFdIkUGSw+BMVtFCIgRekAA/ksHRQlLCogQOEsGiBAzSwGIEE1JTgJFD0mIEERJRQtLAksBCElFCTIKIicTZURwAEQiJw9lRCInDGVESwEISwJLAQ9ETwJMCU8CD0RPAwgnD0xnIicMZUQIJwxMZyInEGVETwIIJxBMZyInEWVECCcRTGdLDyRVgQMSQQB6IicGZURLEIgRBkUSCCcGTGeIEOZBAApLDyRVgRMSQQAJSw+BKVsnDkxnJwRLCGcnB0sJZyIqZUQjCCpMZ0sPVwgBgAETqEEAESInBGVEQAAJKYHIAWcnByJnSw9LBEmIE3NISw1LDAhFDksMSwcIRQ1LBCMIRQVC/ncnBiJnQv+QSw8kVUlFEIEDEkEAECInBGVESwYJSUUJRQlC/ulLDiQSQQATIicEZUxFCUQiJwdlTEUKREL+z0sOgRMSQAAHSwdFCUL+wCJFCCJFCUL+t4gQJ0EAVksOgRMSQQAKIicEZURFBkL+jiInBmVESxCIEB5FEghJRQsiJw5lRA9BAAYiRQZC/m8iJw5lREsKCUlFCCInBGVEDUEACiInBGVERQZC/lFLBkUGQv5KSw+BMVsiJwRlREoOREwJRQZC/jYiJwZlREsQiA/GRRIIRQtC/gxLBElESw5JSw9JTgMIMgdPAhZPAxZQTwIWUE8CFlBMFlAoTFCwI0MiQv2+gABHAjYaAUcCFSUSRDYaAkkiWYECCEsBFRJEVwIATCIpZUREJwhMUEm9RQFEIicbZUQyAxNBACIxACInG2VEEkAAFTEASwMSQAANMQBLAb5EVwAgEkEBACNEiBK1iBK6IillRIEyEhRESwJJiA1qiAztRgJJvkRJgUlbSU4CRQhJgVFbSUUITwIISUUGRFcAICInE2VEcABFAUEAt0m+RIGAA1NAAK0jQQB4MgoiJxNlRExLAXAAREsFSU4CD0RLAklOA75ESVcAILEyAE8DshJMshRPArIRgQSyELIBs0mBSVtJTgJFCUmBUVtJTgNFCSIWTEsBXElMXFFPA0y/IicPZURJSwIPRCInDGVESwMPREwJJw9MZyInDGVETAknDExnSwVJSwZJTgMIMgdPAhZPAxZQTwIWUEwWUEsCSRUWVwYCTFBMgAIAIlBMUChMULAjQyJC/1AiQv79NhoBSRUkEkQXNhoCSRUkEkQXiBGXSgxEJx1PAmcnHkxnMgcWKExQsCNDNhoBSRUlEkQ2GgJJFSQSRBdJTgIiKWVERCcWMQCIES5EiBFoiBFtIillRIEyEkQnCEsCUElOA71FAURMiAuJSUQiJwtlRAgiJw1lRA5EIiccZURBAAkyByInHGVEDkRHAr5EgShbSwNJTgMIFoEoTLsiJwtlRAgnC0sBZyInDWVETAkWKExQsCNDIkk2GgFJFSUSRDYaAkkVJRJENhoDRwIVJBJEFyIpZUREiBDeiBDjIillRIEyEhREIicdZURBAAkiJx1lRDIHDkQiJx5lREEACTIHIiceZUQMRDEASwRJTgISRCcISwFQSUUISb1FAUQnCEsFSU4CUElFCb1FAURLAogKwkmICr5PAhNESwFJREy+RCVbDkQiKmVEIitlRA9AAA4iKmVEiAvPgQlbMgcNREsDSYgLGksDSU4CiAsSiAqVRgKICpBGAksFSb5EJVtLAklOAksBDkRLAQkWTwIlTwK7SwVJvkQlW08CCBYlTLsoSwJQsCNDNhoBSRUlEkQ2GgJJFSMSRCJTJxUxAIgPu0QnCE8CUEm9RQFESYEwI7oiTwNUgTBMuzIHFihMULAjQzYaAUkVJRJENhoCSRUlEkQnFzEAiA+DRCIpZUSByAESFESID7OID7gnCE8CUEm9RQEURCIWTwJLAVBLAVAnKVBLAVBLAVBLAVBLAVBMUL8yBxYoTFCwI0M2GgFJFSUSRDYaAkkVJRJEJwhLAlBJvUUBRDEATwMSRIgPXYgPYiJPArsyBxYoTFCwI0M2GgFJFSUSRCcITFBJvUUBRL5IKExQsCNDNhoBSRUlEkQnEkxnMgcWKExQsCNDgABJNhoBRwIVgWsSRDYaAklOAhWBSBJENhoDSU4CSRVLASVZSYEiEkRPAkxLAlJJTgMiWYEkCBJEiA7ZIlVJJwpLAWdBACJJIxJAABxJgQISQAAVSYEDEkAADkmBBBJAAAdJgQUSQQGHI0QiJwplTEUCREsESYEhW0lFCESBOVVJRQhBAB9LBiMSQAAYSwaBAhJAABBLBoEDEkAACEsGgQQSQQFHI0RJIxNBAAhLBIGSBlMURCIpZUQURCInFGVEFERLBEkjW0lxC0UBRCcsSwFnSwGBCVtJTwISRCcTSwFnsTIAMgoishKyFEyyEYEEshCyAbNJgRFbJw1MZycLImcnLksIZ0mBKVsnHEsBZ0sBgTFbJy1LAWdLBklOAoEwWycOTGcnFEsKZ0sDgZIGUycjTGdLAYEQWycETGdLAYEoWycGTGdLASVbJwlMZ0sBgRhbJwdMZ0sDgTpbJyRMZ0sDgUJbJyVMZ0sDgUpbJx9MZ0sDgVJbJyBMZ0sDgVpbJyZMZ0sDgZAGUycnTGdLA4GRBlMnKExnTwOBY1snBUxnSwEkWypMZ0sBgThbJxBMZ0sBgUBbJxFMZycPImcnDCJnSwIyBw1ETCJbSwIMRAxESwJXACAnKkxnSwFXAgAnK0xnMgcWKExQsCNDIkL+tiJC/nYigABHAjYaAUkVJBJEF0k2GgJJFSMSRCJTTDYaA0lOAkkiWUlOA0mBQQuBAghPAhUSRIgM7CInCmVMTgNEIillRBRESYEQDkQiJxRlRERMgRALTIFkCyEECCKI9rYiSUsEDEEAi0sEVwIASUUMSwFJTgKBQQuBQVhJJFVJTgJFDUkiW0lFDUsFTwQISwESREsFTwOICDhMgQlbSUUKREEAF0lBACVJIwmBQQtLC0yBQViBCVtLCA5ESwhAAAVLCSMSREkjCEUBQv+USwZJRCMJFicYTFBJvUUBREkigQK6F0lEIwmBQQuBAgiBQbpC/8FLBhYnGExQSbxISwW/SwVBAAxLAUsECCtMZymBMmcyBxYoTFCwI0MiKWVERIgMAogMCYgMDiIqZUQiK2VESwENRIgHZklXCAFJgAEBqERLAVcACEsCVwkISwNXEQhLBFcZCEsFVyEISwZXKQhLB1cxCEsIVzkITwdPCFBPB1BPBlBPBVAiFlBPBFBPA1BPAlBMUIgImEYCMgcWKExQsCNDIkcEgABJNhoBSRUkEkQXNhoCRwIVgUkSRCIpZUREiAt6iAt/gUFbSYEEGkEAsCInCmVEgQUSRIgLVyInCmVESYEFEkRLAkkiW0lFByIrZUQSRElXCAFFDCRViAbhIitlRIEQCicwRQcWJxhMUElFCb1FAUEAB0sHvkxFB0RLBUkiWUmBEAxESwNJVwkISwFXEQhLAlcZCEsDVykISwRXMQhPBVc5CEsLFksSUE8GUE8FUE8EUE8DUE8CUExQSwMWUE8CTFBMIwgWVwYCXABLCEm8SEy/IitlRCMIK0xnIiplREsDSU8CEkSIBh5JRQhJVwgBRQokVUlFBiMSQAAoSwSBBBJAACBLBIEMEkAAGEsEgQsSQAAQSwSBEhJAAAhLBIEFEkEAQSNESwiAAQGpREsEgQwSQAAISwSBCxJBACQjQQAaJxkxAIgKEkRLBksCiAc6RgIyBxYoTFCwI0OICjBC/+giQv/ZIkL/vCJJNhoBRwIVgUESRCIpZUREiAoRiAoYiAodIillRIEyEhREIicKZUSBBRJESSJbSU4CIitlRExLARJESwFXCAFJTgOAAQOoREyBOVtJTgIjGkRBABMiK2VEIwmIBUCBCVtLBIEJWw5EIitlRIEQCicwRQYWJxhMUElFB71FAUEAB0sFvkxFBkRLBEkiWUmBEAxESwVJVwkISwFXEQhLAlcZCEsDVyEISwRXKQhPBVcxCEsKFksKUE8GUE8FUE8EUE8DUE8CUExQSwMWUE8CTFBMIwgWVwYCXABLBkm8SEy/IitlRCMIK0xnMgcWKExQsCNDIillRElEIicKZUQWSZMkDkRXBwEiJw1lRCInC2VEIicUZUQiKmVEIitlRCInBGVEIicHZUQiJwllRCInBmVEIicQZUQiJxFlRCInD2VEIicMZURPDhZPDkxQTw0WUE8MFlBPCxZQTwoWUE8JFlBPCBZQTwcWUE8GFlBPBRZQTwQWUE8DFlBPAhZQTBZQKExQsCNDIillREQiKmVEIitlRA9BACUiKmVEFicpUCIWTEsBUEsBUEsBUEsBUEsBUEsBUExQKExQsCNDIiplRIgD3EL/8IgIXSNDNhoBSRUlEkSICFAnEkxnMgcWKExQsCNDNhoBSRUlEkSICDgnG0xnMgcWKExQsCNDNhoBSRUjEkQ2GgJJTgIVJRJENhoDSU4CFYEQEkSICAuICBIXRwKICByBFBJBAA4nEksDZzIHFihMULAjQ0mBKBJBABEnF0sDUEm9RQEUREsCv0L/30mBMhJBABEnFksDUEm9RQEUREsCv0L/x0mBPBJBABEnGksDUEm9RQEUREsCv0L/r0mBRhJBABEnFUsDUEm9RQEUREsCv0L/l0mBUBJB/5AnGUsDUEm9RQEUREsCv0L/fzYaAUkVIxJENhoCSU4CFSUSRIgHYYgHaBdHAogHckmBFBNEgSgSQQAVJxdLAlBJvUUBRLxIMgcWKExQsCNDSYEyEkEADycWSwJQSb1FAUS8SEL/4UmBPBJBAA8nGksCUEm9RQFEvEhC/8tJgUYSQQAPJxVLAlBJvUUBRLxIQv+1SYFQEkH/ricZSwJQSb1FAUS8SEL/nzYaAUkVIxJEIlMnFTEAiAabRCchTGcyBxYoTFCwI0M2GgFJFSMSRCJTJxoxAIgGfEQnIkxnMgcWKExQsCNDIicSZUQoTFCwI0M2GgFJFSUSRCcXSwGIBlQnFksCiAZNJxpLA4gGRicVSwSIBj8nGU8FiAY4JykiTwZUI08FVIECTwRUgQNPA1SBBE8CVChMULAjQzYaAUkVIxJENhoCSU4CFSUSRBdJiAZQgwYUKDI8RlBPBo4GAE8AQAAxACIAEwABACcZSwFQSb1FAUS+SChMULAjQycVSwFQSb1FAUS+SEL/6ycaSwFQSb1FAUS+SEL/3CcWSwFQSb1FAUS+SEL/zScXSwFQSb1FAUS+SEL/voAQAAAAAAAAAAAAAAAAAAAAAEL/qYoBACcIi/9QvkSBgANTFESJigECJwiL/1BJvUUBREm+SCInEGVESwGBOVsJIicRZURLAoFBWwlLAiVbIicFZURPA0sCTwKIAJgiJwVlRE8DTwNPAogAiksCgUlbSwIIFk8DTFxJSYFRW0sCCBZcUSInEGVEFlw5IicRZUQWXEEiKmVEFlwxTwNMv4mKAQAigAAnCIv/UEm9RQFEIillRIEyEkEAAYmLAr5MSU4CjABEgShbSYwBQAABiYsASSVbiwFJTgMIFlwgIhZcKIsCTL8iJwtlRElLAg9ETAknC0xniYoDAYv9QQAFi/5AAAIiiYv9i/4di/+XiYoBAYv/QAACIokiJw1lRElEIicFZUSL/0xPAoj/yomKAQGL/0AAAiKJIicNZUQiJwVlRIv/TIj/r4mKAQEiK2VEi/8NRIv/gRAKFicYTFBJvUUBRIv/gRAYSwEigQK6F0sBDUSBQQuBAgiBQbqJigIAi/8jEkAAH4v/JBJAABiL/4ETEkAAEIv/gQwSQAAIi/+BCxJBAAMjRImL/kAABCJC//WL/oEDEkAACIv+gQISQQAYi/+BAxJAAAiL/4ESEkEABCNC/9EiQv/Ni/4jEkEAIIv/gQMSQAAQi/+BEhJAAAiL/4EFEkEABCNC/6oiQv+mi/6BBBJBACiL/4EDEkAAGIv/gQQSQAAQi/+BEhJAAAiL/4EFEkEABCNC/3oiQv92i/6BBRJBAAiL/4EDEkL/ZiJC/2IiJwplRCMSQQAKIicjZURBAAIjiSKJigECi/+BEVtJQQAQIicJZURBAAgiJwdlREAABiKL/08CiSInB2VEIicJZUQiJwVlRIj+aCInBWVEiwBMiP5di/9PAomKAgGL/0AAA4v+iSInBWVEIicJZUSL/0sCiP48CElEIicFZUSL/kxPAoj+LImKAgIigABHCIv+IlsiKmVEEkSL/oEJWzIHDkSL/iRVSSMSSUEAXiIpZUSBMhJEIicLZUQiJw1lRBJEi/6BMVsnBEsBZycHTGeL/oEhWycJTGcnBiJni/6BKVsnDkxnIiplRCMIKkxnKYFkZ4sLRCInFGVEi/5MIogB2kmM/ov/jAGMAIkiKWVEgTISFEQiJwZlRIv+iP74jP4IJwZMZ4sKgQwSQQF4i/+BIVsiJyVlRCInBWVEiP1zIickZUQIjAYiJydlREEAEyInH2VEiwYNQQAIIicfZUyMBkQiJyhlREEAEyInIGVEiwYMQQAIIicgZUyMBkQnCYsGZ4sKgQQSQQEHi/6BMVsnBEsBZycHTGeI/mVBAOeLCoEFEkEAxSIrZUQiKmVECYFkCyEECCKI68QiJwVlTIwCRCKMASKMB4v+gRlbSYwIQQAPiwKLCIj+gUmMAiOMB4wBIiplRCMIjAMiK2VEiwMNQQBSiwOI/QxJjAAkVUmMBIEDEkAAEIsEgRMSQQAziwCBGVtBACsjQQAIiwdBAAwijAeLAyMIjANC/76LAIEZW4sCTIj+JEmMAosBCIwBQv/hIkL/0osBRCInBGVEi/6BOVskGkAABiInBmVECCInBWVEiwGI/EsnDkxnIiplRCMIKkxni/4iSYgAYEmM/ov/jAGMAImL/oEpWycOTGdC/9qLCoESEkH+/yInBGVEJwdMZ0L+84sKgQsSQQAbi/6BIVtJjAVAAAgiJyZlTIwFRCcJiwVnQv66i/6BIVtJjAlB/q8nCYsJZ0L+p4oDATIIi/0iW4v9VwgBi/1XCQgyB4v9JFWL/kAARSMWSZMkDkRXBwEiJxNlRIsBSSMIiwAWTwIWUIsCUIsDUIsEFlCL/hZQTwNQi/8WUE8CFlBMFlCABJozK5VMULCL/YwAiYsFIxJAAAiLBYEEEkEABCNC/6mB/wFC/6OKAgGAAIv+i/9QSb1FAUEAH4sBvkQiWzIHSYwADkEAEIsBvkQkW4sAD0EABCOMAIkiQv/5MQAiJxJlRBJEiSInImVEFESJIichZUQURImKAQCL/4EUEkAAMIv/gRkSQAAoi/+BKBJAACCL/4EyEkAAGIv/gTwSQAAQi/+BRhJAAAiL/4FQEkEAAyNEiSJC//o=", "clear": "DIEBQw=="}, "desc": "Debt Algorand Standard Application.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "networks": {}, "source": {"approval": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCAzMiAxNTAwCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUgInN0YXR1cyIgImV2ZW50X2N1cnNvciIgInNjaGVkdWxlX2VudHJ5X2NvdW50IiAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIiAiZml4ZWRfcG9pbnRfc2NhbGUiICJhY2NydWVkX2ludGVyZXN0IiAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIgMHg0MTIzICJub21pbmFsX2ludGVyZXN0X3JhdGUiICJjb250cmFjdF90eXBlIiAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiICJyZXNlcnZlZF9wcmluY2lwYWwiICJ0b3RhbF91bml0cyIgIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iICJyZXNlcnZlZF9pbnRlcmVzdCIgImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIgMHg1MjNhNDE1MjUyMjMgInNldHRsZW1lbnRfYXNzZXRfaWQiICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIgMHg1MjNhNDE1NTU0MjMgMHg1MjNhNTA1OTQ0MjMgMHg1MjNhNGQ0ZTQ3MjMgMHg1MzIzIDB4NTIzYTRkNGY0MzIzIDB4NTIzYTU0NTI1MzIzIDB4NTIzYTRmNTA0NDIzICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiICJ0cmFuc2Zlcl9vcGVuaW5nX2RhdGUiICJ0cmFuc2Zlcl9jbG9zdXJlX2RhdGUiICJyYXRlX3Jlc2V0X2Zsb29yIiAicmF0ZV9yZXNldF9jYXAiICJjb250cmFjdF9zdXNwZW5kZWQiICJkZWZhdWx0ZWQiICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIiAicmF0ZV9yZXNldF9zcHJlYWQiICJyYXRlX3Jlc2V0X211bHRpcGxpZXIiICJyYXRlX3Jlc2V0X25leHQiICJoYXNfcmF0ZV9yZXNldF9mbG9vciIgImhhc19yYXRlX3Jlc2V0X2NhcCIgMHgwMCAicHJvc3BlY3R1c19oYXNoIiAicHJvc3BlY3R1c191cmwiICJkZW5vbWluYXRpb25fYXNzZXRfaWQiICJtYXR1cml0eV9kYXRlIiAiZGF5X2NvdW50X2NvbnZlbnRpb24iIDB4MDY4MTAxIDB4MDAwMAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4LTI5CiAgICAvLyAjIFJCQUMgUm9sZXMKICAgIC8vIHNlbGYuYXJyYW5nZXIgPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX0FSUkFOR0VSKQogICAgYnl0ZWMgMTggLy8gMHg1MjNhNDE1MjUyMjMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMAogICAgLy8gc2VsZi5vcF9kYWVtb24gPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX09QX0RBRU1PTikKICAgIGJ5dGVjIDI3IC8vIDB4NTIzYTRmNTA0NDIzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NDctNDgKICAgIC8vICMgQ29udHJhY3QgR292ZXJuYW5jZQogICAgLy8gc2VsZi5jb250cmFjdF9zdXNwZW5kZWQgPSBGYWxzZQogICAgYnl0ZWMgMzMgLy8gImNvbnRyYWN0X3N1c3BlbmRlZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjUwLTUxCiAgICAvLyAjIENvbnRyYWN0IFBlcmZvcm1hbmNlCiAgICAvLyBzZWxmLmRlZmF1bHRlZCA9IEZhbHNlCiAgICBieXRlYyAzNCAvLyAiZGVmYXVsdGVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1Ni01NwogICAgLy8gIyBDb250cmFjdAogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKQogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OAogICAgLy8gc2VsZi5jb250cmFjdF90eXBlID0gVUludDY0KCkKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MC02MQogICAgLy8gIyBQcm9zcGVjdHVzIChJbmZvcm1hdGlvbmFsKQogICAgLy8gc2VsZi5wcm9zcGVjdHVzX2hhc2ggPSBCeXRlcygpCiAgICBieXRlYyA0MiAvLyAicHJvc3BlY3R1c19oYXNoIgogICAgcHVzaGJ5dGVzIDB4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjIKICAgIC8vIHNlbGYucHJvc3BlY3R1c191cmwgPSBTdHJpbmcoKQogICAgYnl0ZWMgNDMgLy8gInByb3NwZWN0dXNfdXJsIgogICAgcHVzaGJ5dGVzICIiCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjQtNjUKICAgIC8vICMgRGVub21pbmF0aW9uCiAgICAvLyBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCA9IEFzc2V0KCkKICAgIGJ5dGVjIDQ0IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBBc3NldCgpCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjgtNjkKICAgIC8vICMgVGltZQogICAgLy8gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGUgPSB0eXAuVGltZVN0YW1wKCkKICAgIGJ5dGVjIDI4IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcwCiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSB0eXAuVGltZVN0YW1wKCkKICAgIGJ5dGVjIDQ1IC8vICJtYXR1cml0eV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MQogICAgLy8gc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgPSB0eXAuVGltZVN0YW1wKCkKICAgIGJ5dGVjIDI5IC8vICJ0cmFuc2Zlcl9vcGVuaW5nX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcyCiAgICAvLyBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgMzAgLy8gInRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzQtNzUKICAgIC8vICMgRGF5IENvdW50IENvbnZlbnRpb24KICAgIC8vIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPSBVSW50NjQoKQogICAgYnl0ZWMgNDYgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3Ny03OAogICAgLy8gIyBVbml0cwogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IFVJbnQ2NCgpCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc5CiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID0gVUludDY0KCkKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODEtODIKICAgIC8vICMgUHJpbmNpcGFsCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID0gVUludDY0KCkKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODMKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gVUludDY0KCkKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODUKICAgIC8vIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiA9IEZhbHNlCiAgICBieXRlYyAzNSAvLyAiZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODctODgKICAgIC8vICMgSW50ZXJlc3QKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OQogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ID0gVUludDY0KCkKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkxLTkyCiAgICAvLyAjIEludGVyZXN0IFJhdGVzCiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzCiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkID0gVUludDY0KCkKICAgIGJ5dGVjIDM2IC8vICJyYXRlX3Jlc2V0X3NwcmVhZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9tdWx0aXBsaWVyID0gVUludDY0KCkKICAgIGJ5dGVjIDM3IC8vICJyYXRlX3Jlc2V0X211bHRpcGxpZXIiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfZmxvb3IgPSBVSW50NjQoKQogICAgYnl0ZWMgMzEgLy8gInJhdGVfcmVzZXRfZmxvb3IiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfY2FwID0gVUludDY0KCkKICAgIGJ5dGVjIDMyIC8vICJyYXRlX3Jlc2V0X2NhcCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTcKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9uZXh0ID0gVUludDY0KCkKICAgIGJ5dGVjIDM4IC8vICJyYXRlX3Jlc2V0X25leHQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4CiAgICAvLyBzZWxmLmhhc19yYXRlX3Jlc2V0X2Zsb29yID0gRmFsc2UKICAgIGJ5dGVjIDM5IC8vICJoYXNfcmF0ZV9yZXNldF9mbG9vciIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTkKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwID0gRmFsc2UKICAgIGJ5dGVjIDQwIC8vICJoYXNfcmF0ZV9yZXNldF9jYXAiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMS0xMDIKICAgIC8vICMgUHJpbWFyeSBEaXN0cmlidXRpb24KICAgIC8vIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsID0gVUludDY0KCkKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMwogICAgLy8gc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNS0xMDYKICAgIC8vICMgQ3VtdWxhdGl2ZSBQZXItVW5pdCBGaXhlZC1Qb2ludCBJbmRleGVzCiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggPSBVSW50NjQoKQogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNwogICAgLy8gc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNQogICAgLy8gc2VsZi5ldmVudF9jdXJzb3IgPSBVSW50NjQoKQogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTYKICAgIC8vIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgPSBVSW50NjQoKQogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExOC0xMTkKICAgIC8vICMgU2NhbGluZwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjIzCiAgICAvLyBhc3NlcnQgVHhuLmdsb2JhbF9udW1fYnl0ZV9zbGljZSA9PSBjZmcuR0xPQkFMX0JZVEVTLCBlcnIuV1JPTkdfR0xPQkFMX0JZVEVTCiAgICB0eG4gR2xvYmFsTnVtQnl0ZVNsaWNlCiAgICBwdXNoaW50IDEwCiAgICA9PQogICAgYXNzZXJ0IC8vIFdyb25nIEdsb2JhbCBCeXRlcyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6MjQKICAgIC8vIGFzc2VydCBUeG4uZ2xvYmFsX251bV91aW50ID09IGNmZy5HTE9CQUxfVUlOVFMsIGVyci5XUk9OR19HTE9CQUxfVUlOVFMKICAgIHR4biBHbG9iYWxOdW1VaW50CiAgICBwdXNoaW50IDU0CiAgICA9PQogICAgYXNzZXJ0IC8vIFdyb25nIEdsb2JhbCBVSW50cyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6MjUKICAgIC8vIGFzc2VydCBUeG4ubG9jYWxfbnVtX2J5dGVfc2xpY2UgPT0gY2ZnLkxPQ0FMX0JZVEVTLCBlcnIuV1JPTkdfTE9DQUxfQllURVMKICAgIHR4biBMb2NhbE51bUJ5dGVTbGljZQogICAgIQogICAgYXNzZXJ0IC8vIFdyb25nIExvY2FsIEJ5dGVzIGFsbG9jYXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kX2FzYS9jb250cmFjdC5weToyNgogICAgLy8gYXNzZXJ0IFR4bi5sb2NhbF9udW1fdWludCA9PSBjZmcuTE9DQUxfVUlOVFMsIGVyci5XUk9OR19MT0NBTF9VSU5UUwogICAgdHhuIExvY2FsTnVtVWludAogICAgIQogICAgYXNzZXJ0IC8vIFdyb25nIExvY2FsIFVJbnRzIGFsbG9jYXRpb24KCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjgtMTgKICAgIC8vIGNsYXNzIERBU0EoCiAgICAvLyAgICAgUGF5bWVudEFnZW50LAogICAgLy8gICAgIFRyYW5zZmVyQWdlbnQsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyAgICAgYXZtX3ZlcnNpb249MTIsCiAgICAvLyApOgogICAgcHVzaGJ5dGVzIDB4OTE0ZjA0ZWIgLy8gbWV0aG9kICJjb250cmFjdF91cGRhdGUoKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX2NvbnRyYWN0X3VwZGF0ZV9yb3V0ZUA0CgptYWluX3N3aXRjaF9jYXNlX25leHRANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kX2FzYS9jb250cmFjdC5weTo4LTE4CiAgICAvLyBjbGFzcyBEQVNBKAogICAgLy8gICAgIFBheW1lbnRBZ2VudCwKICAgIC8vICAgICBUcmFuc2ZlckFnZW50LAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gICAgIGF2bV92ZXJzaW9uPTEyLAogICAgLy8gKToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJ6IG1haW5fY3JlYXRlX05vT3BAMzMKICAgIHB1c2hieXRlc3MgMHhiNDQ2MThjOCAweGU3ODMyNTI5IDB4OTQzODg3MjMgMHg2Yzg1ZTNlZSAweGJkZDFhOTQ0IDB4N2MwZjE4MTIgMHgxNGZjMTBlZiAweDc0YTcyOTdmIDB4MDlkNGZlMTQgMHg5YTliZmE4NSAweDg1ZWVkMzNkIDB4YWIyYzBmYzQgMHhkOWYyMjVhYyAweDk4ODM1MDVhIDB4OGVhNmU3NGMgMHgwMmFmNTU3YSAweDgyZjcxYjJkIDB4ZWYwNGY1ZDMgMHhkZjM0MzU1MCAweDNkYmU4MGJkIDB4MWUzZTQ4ZTcgMHgzOTI0MWZhMyAweDAxMGM4Mjk5IDB4NzQwNmFjZDIgMHgxYTcyYTJlZSAvLyBtZXRob2QgImZ1bmRfZHVlX2Nhc2hmbG93cyh1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJjbGFpbV9kdWVfY2FzaGZsb3dzKGFkZHJlc3MsYnl0ZVtdKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYnl0ZVtdKSIsIG1ldGhvZCAidHJhbnNmZXJfc2V0X3NjaGVkdWxlKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbihhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInRyYW5zZmVyKGFkZHJlc3MsYWRkcmVzcyx1aW50NjQpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X3N1c3BlbnNpb24oYWRkcmVzcyxib29sKXVpbnQ2NCIsIG1ldGhvZCAiYWNjb3VudF9vcGVuKGFkZHJlc3MsYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgImFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzcyhhZGRyZXNzLGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X2dldF9wb3NpdGlvbihhZGRyZXNzKShhZGRyZXNzLHVpbnQ2NCx1aW50NjQsYm9vbCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAiY29udHJhY3RfY29uZmlnKCh1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxib29sLGJvb2wsYm9vbCx1aW50NjQpLCh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCksKGJ5dGVbMzJdLHN0cmluZykpdWludDY0IiwgbWV0aG9kICJjb250cmFjdF9zY2hlZHVsZSh1aW50NjQsYm9vbCwodWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NClbXSl1aW50NjQiLCBtZXRob2QgImNvbnRyYWN0X2V4ZWN1dGVfaWVkKCl1aW50NjQiLCBtZXRob2QgImFwcGx5X25vbl9jYXNoX2V2ZW50KHVpbnQ2NCwodWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIsIG1ldGhvZCAiYXBwZW5kX29ic2VydmVkX2Nhc2hfZXZlbnQoKHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIsIG1ldGhvZCAiY29udHJhY3RfZ2V0X3N0YXRlKCkodWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudCgpKHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJyYmFjX3JvdGF0ZV9hcnJhbmdlcihhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19zZXRfb3BfZGFlbW9uKGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX2Fzc2lnbl9yb2xlKHVpbnQ4LGFkZHJlc3MsKHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19yZXZva2Vfcm9sZSh1aW50OCxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19jb250cmFjdF9zdXNwZW5zaW9uKGJvb2wpdWludDY0IiwgbWV0aG9kICJyYmFjX2NvbnRyYWN0X2RlZmF1bHQoYm9vbCl1aW50NjQiLCBtZXRob2QgInJiYWNfZ2V0X2FycmFuZ2VyKClhZGRyZXNzIiwgbWV0aG9kICJyYmFjX2dldF9hZGRyZXNzX3JvbGVzKGFkZHJlc3MpKGJvb2wsYm9vbCxib29sLGJvb2wsYm9vbCkiLCBtZXRob2QgInJiYWNfZ2V0X3JvbGVfdmFsaWRpdHkodWludDgsYWRkcmVzcykodWludDY0LHVpbnQ2NCkiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBmdW5kX2R1ZV9jYXNoZmxvd3MgY2xhaW1fZHVlX2Nhc2hmbG93cyB0cmFuc2Zlcl9zZXRfc2NoZWR1bGUgcHJpbWFyeV9kaXN0cmlidXRpb24gdHJhbnNmZXIgYWNjb3VudF9zdXNwZW5zaW9uIGFjY291bnRfb3BlbiBhY2NvdW50X3VwZGF0ZV9wYXltZW50X2FkZHJlc3MgYWNjb3VudF9nZXRfcG9zaXRpb24gY29udHJhY3RfY29uZmlnIGNvbnRyYWN0X3NjaGVkdWxlIGNvbnRyYWN0X2V4ZWN1dGVfaWVkIGFwcGx5X25vbl9jYXNoX2V2ZW50IGFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50IGNvbnRyYWN0X2dldF9zdGF0ZSBjb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnQgcmJhY19yb3RhdGVfYXJyYW5nZXIgcmJhY19zZXRfb3BfZGFlbW9uIHJiYWNfYXNzaWduX3JvbGUgcmJhY19yZXZva2Vfcm9sZSByYmFjX2NvbnRyYWN0X3N1c3BlbnNpb24gcmJhY19jb250cmFjdF9kZWZhdWx0IHJiYWNfZ2V0X2FycmFuZ2VyIHJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXMgcmJhY19nZXRfcm9sZV92YWxpZGl0eQogICAgZXJyCgptYWluX2NyZWF0ZV9Ob09wQDMzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjgtMTgKICAgIC8vIGNsYXNzIERBU0EoCiAgICAvLyAgICAgUGF5bWVudEFnZW50LAogICAgLy8gICAgIFRyYW5zZmVyQWdlbnQsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyAgICAgYXZtX3ZlcnNpb249MTIsCiAgICAvLyApOgogICAgcHVzaGJ5dGVzIDB4OTU2ZDcxNTYgLy8gbWV0aG9kICJjb250cmFjdF9jcmVhdGUoYWRkcmVzcyl1aW50NjQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBjb250cmFjdF9jcmVhdGUKICAgIGVycgoKbWFpbl9jb250cmFjdF91cGRhdGVfcm91dGVANDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgNCAvLyBVcGRhdGVBcHBsaWNhdGlvbgogICAgPT0KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0CiAgICBiIGNvbnRyYWN0X3VwZGF0ZQoKCi8vIF9wdXlhX2xpYi51dGlsLmVuc3VyZV9idWRnZXQocmVxdWlyZWRfYnVkZ2V0OiB1aW50NjQsIGZlZV9zb3VyY2U6IHVpbnQ2NCkgLT4gdm9pZDoKZW5zdXJlX2J1ZGdldDoKICAgIHByb3RvIDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDEwCiAgICArCgplbnN1cmVfYnVkZ2V0X3doaWxlX3RvcEAxOgogICAgZnJhbWVfZGlnIDAKICAgIGdsb2JhbCBPcGNvZGVCdWRnZXQKICAgID4KICAgIGJ6IGVuc3VyZV9idWRnZXRfYWZ0ZXJfd2hpbGVANgogICAgaXR4bl9iZWdpbgogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGJ5dGVjIDQ3IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbQogICAgYnl0ZWMgNDcgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KICAgIGZyYW1lX2RpZyAtMQogICAgc3dpdGNoIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMEAzIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMUA0CgplbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX25leHRANToKICAgIGl0eG5fc3VibWl0CiAgICBiIGVuc3VyZV9idWRnZXRfd2hpbGVfdG9wQDEKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMUA0OgogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgaXR4bl9maWVsZCBGZWUKICAgIGIgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV9uZXh0QDUKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMEAzOgogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBiIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfbmV4dEA1CgplbnN1cmVfYnVkZ2V0X2FmdGVyX3doaWxlQDY6CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnBheW1lbnRfYWdlbnQuUGF5bWVudEFnZW50LmZ1bmRfZHVlX2Nhc2hmbG93c1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmZ1bmRfZHVlX2Nhc2hmbG93czoKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gMTMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjY4CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2OQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3MAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDcKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzIKICAgIC8vIGlmIHNlbGYuX2lzX2R5bmFtaWNfYW5udWl0eSgpOgogICAgY2FsbHN1YiBfaXNfZHluYW1pY19hbm51aXR5CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzYtNzcKICAgIC8vICsgbWF4X2V2ZW50X2NvdW50CiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfRlVORF9EVUVfQ0FTSEZMT1dTX1BFUl9FVkVOVF9CVURHRVQpCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3NwogICAgLy8gKiBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19QRVJfRVZFTlRfQlVER0VUKQogICAgcHVzaGludCAxMDAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3Ni03NwogICAgLy8gKyBtYXhfZXZlbnRfY291bnQKICAgIC8vICogVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfUEVSX0VWRU5UX0JVREdFVCkKICAgICoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3NQogICAgLy8gVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfQkFTRV9CVURHRVQpCiAgICBpbnRjIDQgLy8gMTUwMAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojc1LTc3CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19CQVNFX0JVREdFVCkKICAgIC8vICsgbWF4X2V2ZW50X2NvdW50CiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfRlVORF9EVUVfQ0FTSEZMT1dTX1BFUl9FVkVOVF9CVURHRVQpCiAgICArCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzMtNzkKICAgIC8vIGVuc3VyZV9idWRnZXQoCiAgICAvLyAgICAgcmVxdWlyZWRfYnVkZ2V0PSgKICAgIC8vICAgICAgICAgVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfQkFTRV9CVURHRVQpCiAgICAvLyAgICAgICAgICsgbWF4X2V2ZW50X2NvdW50CiAgICAvLyAgICAgICAgICogVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfUEVSX0VWRU5UX0JVREdFVCkKICAgIC8vICAgICApLAogICAgLy8gKQogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4MQogICAgLy8gcHJvY2Vzc2VkX2V2ZW50cyA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjgyCiAgICAvLyBmdW5kZWRfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDE0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODMKICAgIC8vIGZ1bmRlZF9wcmluY2lwYWwgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDEzCgpmdW5kX2R1ZV9jYXNoZmxvd3Nfd2hpbGVfdG9wQDQ6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODYKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgPCBtYXhfZXZlbnRfY291bnQKICAgIGRpZyA0CiAgICBkaWcgMQogICAgPAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojg2LTg3CiAgICAvLyBwcm9jZXNzZWRfZXZlbnRzIDwgbWF4X2V2ZW50X2NvdW50CiAgICAvLyBhbmQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAMTEKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4NwogICAgLy8gYW5kIHNlbGYuZXZlbnRfY3Vyc29yIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICA8CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODYtODcKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgPCBtYXhfZXZlbnRfY291bnQKICAgIC8vIGFuZCBzZWxmLmV2ZW50X2N1cnNvciA8IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQKICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl93aGlsZUAxMQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojg5CiAgICAvLyBlbnRyeSA9IHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLmV2ZW50X2N1cnNvcikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICBkdXAKICAgIGJ1cnkgMTcKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5MAogICAgLy8gaWYgZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcDoKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSAzCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDExCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6OTIKICAgIC8vIGlmIG5vdCBzZWxmLl9ldmVudF9pc19jYXNoKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkpOgogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBidXJ5IDE2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNTEKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgaW50Y18yIC8vIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM1MC0zNTQKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX01EKSwKICAgIC8vICkKICAgID09CiAgICBkdXAKICAgIGJ1cnkgNAogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX3RydWVANTIKICAgIGRpZyAxNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzUyCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzUwLTM1NAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfTUQpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDUyCiAgICBkaWcgMTQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM1MwogICAgLy8gVUludDY0KGVudW1zLkVWVF9NRCksCiAgICBwdXNoaW50IDE5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNTAtMzU0CiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9NRCksCiAgICAvLyApCiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VANTMKCmZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX3RydWVANTI6CiAgICBpbnRjXzEgLy8gMQoKZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfbWVyZ2VANTQ6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6OTIKICAgIC8vIGlmIG5vdCBzZWxmLl9ldmVudF9pc19jYXNoKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkpOgogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NDgKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF9pZCA9PSBzZWxmLmV2ZW50X2N1cnNvciwgZXJyLklOVkFMSURfRVZFTlRfQ1VSU09SCiAgICBkaWcgMTUKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgY3Vyc29yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NDkKICAgIC8vIGFzc2VydCBlbnRyeS5zY2hlZHVsZWRfdGltZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwgZXJyLk5PX0RVRV9DQVNIRkxPVwogICAgZGlnIDEKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIDw9CiAgICBhc3NlcnQgLy8gTm8gZHVlIGNhc2hmbG93IHRvIHBheQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDEzCiAgICAvLyBpZiBldmVudF90eXBlIG5vdCBpbiAoVUludDY0KGVudW1zLkVWVF9JUCksIFVJbnQ2NChlbnVtcy5FVlRfTUQpKToKICAgIGRpZyAyCiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTUKICAgIGRpZyAxNAogICAgcHVzaGludCAxOQogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDE0CiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAxMQoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X2ludGVyZXN0X2Ftb3VudEAxNjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQyNgogICAgLy8gZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGRpZyAxNQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSAxNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDI3CiAgICAvLyBpZiBldmVudF90eXBlIG5vdCBpbiAoVUludDY0KGVudW1zLkVWVF9QUiksIFVJbnQ2NChlbnVtcy5FVlRfTUQpKToKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxOQogICAgZGlnIDE0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MjgKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDYKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTUzCiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA9IGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBkaWcgMTUKICAgIHB1c2hpbnQgNDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBidXJ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1NgogICAgLy8gaWYgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCk6CiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUAyOQogICAgZGlnIDcKICAgIGJ1cnkgOQoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzItNTc0CiAgICAvLyAjIEZ1bmRpbmcgdXNlcyBwZXItdW5pdCBjdW11bGF0aXZlIGluZGljZXMgc28gZWFjaCBob2xkZXIgY2FuIHNldHRsZQogICAgLy8gIyBpbmRlcGVuZGVudGx5IGZyb20gaXRzIGN1cnJlbnQgdW5pdCBiYWxhbmNlLgogICAgLy8gaW50ZXJlc3RfaW5kZXhfZGVsdGEgPSBzZWxmLl9hbW91bnRfdG9faW5kZXhfZGVsdGEoaW50ZXJlc3RfYW1vdW50X2R1ZSkKICAgIGRpZyAxMAogICAgY2FsbHN1YiBfYW1vdW50X3RvX2luZGV4X2RlbHRhCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzUKICAgIC8vIHByaW5jaXBhbF9pbmRleF9kZWx0YSA9IHNlbGYuX2Ftb3VudF90b19pbmRleF9kZWx0YShwcmluY2lwYWxfYW1vdW50X2R1ZSkKICAgIGRpZyA2CiAgICBjYWxsc3ViIF9hbW91bnRfdG9faW5kZXhfZGVsdGEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU3NgogICAgLy8gaW50ZXJlc3RfYW1vdW50ID0gc2VsZi5faW5kZXhfZGVsdGFfdG9fYW1vdW50KGludGVyZXN0X2luZGV4X2RlbHRhKQogICAgZGlnIDEKICAgIGNhbGxzdWIgX2luZGV4X2RlbHRhX3RvX2Ftb3VudAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBidXJ5IDE1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzcKICAgIC8vIHByaW5jaXBhbF9hbW91bnQgPSBzZWxmLl9pbmRleF9kZWx0YV90b19hbW91bnQocHJpbmNpcGFsX2luZGV4X2RlbHRhKQogICAgZHVwCiAgICBjYWxsc3ViIF9pbmRleF9kZWx0YV90b19hbW91bnQKICAgIGR1cAogICAgYnVyeSAxMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTc4CiAgICAvLyByZXF1aXJlZF9hbW91bnQgPSBpbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50CiAgICBkaWcgMgogICAgZGlnIDEKICAgICsKICAgIGR1cAogICAgYnVyeSA5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MzQKICAgIC8vIGJhbGFuY2UgPSBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBvcHRlZCBpbnRvIGFzc2V0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NTYKICAgIC8vIHJldHVybiBzZWxmLnJlc2VydmVkX2ludGVyZXN0ICsgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICBkaWcgMQogICAgKwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzM2CiAgICAvLyBhc3NlcnQgYmFsYW5jZSA+PSByZXNlcnZlZF90b3RhbCwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGRpZyAyCiAgICBkaWcgMQogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzM3CiAgICAvLyByZXR1cm4gYmFsYW5jZSAtIHJlc2VydmVkX3RvdGFsCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIC0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4MAogICAgLy8gc2VsZi5fYXZhaWxhYmxlX3NldHRsZW1lbnRfZnVuZHMoKSA+PSByZXF1aXJlZF9hbW91bnQKICAgIHVuY292ZXIgMgogICAgPj0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU3OS01ODEKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5fYXZhaWxhYmxlX3NldHRsZW1lbnRfZnVuZHMoKSA+PSByZXF1aXJlZF9hbW91bnQKICAgIC8vICksIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcyBmb3IgdGhlIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4MwogICAgLy8gc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCArPSBpbnRlcmVzdF9hbW91bnQKICAgIHVuY292ZXIgMwogICAgKwogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4NAogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgKz0gcHJpbmNpcGFsX2Ftb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIGV4aXN0cwogICAgKwogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1ODUKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCArPSBpbnRlcmVzdF9pbmRleF9kZWx0YQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggZXhpc3RzCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4NgogICAgLy8gc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCArPSBwcmluY2lwYWxfaW5kZXhfZGVsdGEKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggZXhpc3RzCiAgICArCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTg3CiAgICAvLyBpZiBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpOgogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgcHVzaGludCAzCiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUA0MAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTg4LTU4OQogICAgLy8gIyBGb3IgUFIsIHRoZSBwZXJpb2QgaW50ZXJlc3Qgc3RheXMgYWNjcnVlZCB1bnRpbCBhIGxhdGVyIElQIG9yIE1ELgogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ICs9IHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZGlnIDE2CiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBidXJ5IDE4CiAgICArCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQxOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTkyCiAgICAvLyBpZiBub3Qgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCkgb3IgZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSA9PSBVSW50NjQoCiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDQzCiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTItNTk0CiAgICAvLyBpZiBub3Qgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCkgb3IgZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSA9PSBVSW50NjQoCiAgICAvLyAgICAgZW51bXMuRVZUX01ECiAgICAvLyApOgogICAgcHVzaGludCAxOQogICAgPT0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQ0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUA0MzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5NQogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gZW50cnkubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZGlnIDE1CiAgICBwdXNoaW50IDQxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTYKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGRpZyA4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTk3CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBuZXh0X2ludGVyZXN0X2Jhc2UKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBkaWcgOQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5OAogICAgLy8gc2VsZi5ldmVudF9jdXJzb3IgKz0gVUludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAwCiAgICAvLyBpZiBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoCiAgICBkaWcgMTUKICAgIGV4dHJhY3QgOCAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MDAtNjAyCiAgICAvLyBpZiBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoCiAgICAvLyAgICAgZW51bXMuRVZUX01ECiAgICAvLyApIGFuZCBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9PSBVSW50NjQoMCk6CiAgICBwdXNoYnl0ZXMgMHgxMwogICAgYj09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0NwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAyCiAgICAvLyApIGFuZCBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9PSBVSW50NjQoMCk6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwMC02MDIKICAgIC8vIGlmIGVudHJ5LmV2ZW50X3R5cGUgPT0gYXJjNC5VSW50OCgKICAgIC8vICAgICBlbnVtcy5FVlRfTUQKICAgIC8vICkgYW5kIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID09IFVJbnQ2NCgwKToKICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0NwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAzCiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbnVtcy5TVEFUVVNfRU5ERUQpCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBwdXNoaW50IDIwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwNAogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gVUludDY0KDApCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0NzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwNi02MTAKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1pbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50LAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PWludGVyZXN0X2Ftb3VudCArIHByaW5jaXBhbF9hbW91bnQsCiAgICAvLyApCiAgICBkaWcgMTUKICAgIGRpZyA0CiAgICBkdXAKICAgIGNhbGxzdWIgX2VtaXRfZXhlY3V0aW9uX2V2ZW50CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5NgogICAgLy8gZnVuZGVkX2ludGVyZXN0ICs9IGludGVyZXN0X2Ftb3VudAogICAgZGlnIDEzCiAgICBkaWcgMTIKICAgICsKICAgIGJ1cnkgMTQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5NwogICAgLy8gZnVuZGVkX3ByaW5jaXBhbCArPSBwcmluY2lwYWxfYW1vdW50CiAgICBkaWcgMTIKICAgIGRpZyA3CiAgICArCiAgICBidXJ5IDEzCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6OTgKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgKz0gVUludDY0KDEpCiAgICBkaWcgNAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgNQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3Nfd2hpbGVfdG9wQDQKCmZ1bmRfZHVlX2Nhc2hmbG93c19lbHNlX2JvZHlANDA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTEKICAgIC8vIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0MQoKZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlAMjk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTcKICAgIC8vIGV2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ1cnkgMTYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1OC01NjAKICAgIC8vICMgRHluYW1pYyBhbm51aXRpZXMgZGVyaXZlIG5leHQgc3RhdGUgZnJvbSB0aGUgcGF5bWVudCBkZWNvbXBvc2l0aW9uLAogICAgLy8gIyBub3Qgb25seSBmcm9tIHRoZSBwcmVjb21wdXRlZCBgbmV4dF8qYCBmaWVsZHMuCiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpOgogICAgcHVzaGludCAzCiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUAzMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTYyCiAgICAvLyBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCAtIHByaW5jaXBhbF9hbW91bnRfZHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGRpZyA2CiAgICAtCiAgICBkdXAKICAgIGJ1cnkgOQogICAgYnVyeSA5CiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDMxOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY1CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9JUCk6CiAgICBkaWcgMTQKICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUAzMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY2CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGJ1cnkgOQogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY3CiAgICAvLyBuZXh0X2ludGVyZXN0X2Jhc2UgPSBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGJ1cnkgMTAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgZXhpc3RzCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDMzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY4CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCk6CiAgICBkaWcgMTQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlAMzQKICAgIGRpZyA3CiAgICBidXJ5IDkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzgKCmZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDM0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY5CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTcwCiAgICAvLyBuZXh0X2ludGVyZXN0X2Jhc2UgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzgKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDI5CiAgICAvLyBpZiBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKToKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzMAogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKToKICAgIGRpZyAxNAogICAgcHVzaGludCAxOQogICAgPT0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDIyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzEKICAgIC8vIHJldHVybiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzIKICAgIC8vIGludGVyZXN0X2R1ZSA9IHNlbGYuYWNjcnVlZF9pbnRlcmVzdCArIHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZGlnIDE2CiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBidXJ5IDE4CiAgICArCiAgICBkdXAKICAgIGJ1cnkgMTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzMwogICAgLy8gaWYgc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIDw9IGludGVyZXN0X2R1ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIGV4aXN0cwogICAgPj0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDI0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzQKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzUKICAgIC8vIHByaW5jaXBhbF9hbW91bnQgPSBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gLSBpbnRlcmVzdF9kdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIGV4aXN0cwogICAgZGlnIDEwCiAgICAtCiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDM2CiAgICAvLyBpZiBwcmluY2lwYWxfYW1vdW50ID4gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWw6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgID4KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDI2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzcKICAgIC8vIHJldHVybiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjY6CiAgICBkaWcgNgogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTIKICAgIC8vIHByaW5jaXBhbF9hbW91bnRfZHVlID0gc2VsZi5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudChlbnRyeSkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnRAMjgKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDI3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDQwCiAgICAvLyBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA8PSBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZGlnIDE1CiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBkdXAyCiAgICA8PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDM5LTQ0MQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA8PSBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NDIKICAgIC8vIHJldHVybiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCAtIGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBzd2FwCiAgICAtCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MTUKICAgIC8vIHJldHVybiBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgKyBzZWxmLl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KGVudHJ5KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgIGRpZyAxNgogICAgY2FsbHN1YiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudAogICAgYnVyeSAxOAogICAgKwogICAgYnVyeSAxMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTUxCiAgICAvLyBpbnRlcmVzdF9hbW91bnRfZHVlID0gc2VsZi5fZW50cnlfaW50ZXJlc3RfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfaW50ZXJlc3RfYW1vdW50QDE2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAMTE6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTAwCiAgICAvLyBhc3NlcnQgcHJvY2Vzc2VkX2V2ZW50cyA+IFVJbnQ2NCgwKSwgZXJyLk5PX0RVRV9DQVNIRkxPVwogICAgZGlnIDQKICAgIGR1cAogICAgYXNzZXJ0IC8vIE5vIGR1ZSBjYXNoZmxvdyB0byBwYXkKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMDQKICAgIC8vIHRvdGFsX2Z1bmRlZD1mdW5kZWRfaW50ZXJlc3QgKyBmdW5kZWRfcHJpbmNpcGFsLAogICAgZGlnIDE0CiAgICBkdXAKICAgIGRpZyAxNQogICAgZHVwCiAgICBjb3ZlciAzCiAgICArCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA2CiAgICAvLyB0aW1lc3RhbXA9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTAxLTEwNwogICAgLy8gcmV0dXJuIHR5cC5DYXNoRnVuZGluZ1Jlc3VsdCgKICAgIC8vICAgICBmdW5kZWRfaW50ZXJlc3Q9ZnVuZGVkX2ludGVyZXN0LAogICAgLy8gICAgIGZ1bmRlZF9wcmluY2lwYWw9ZnVuZGVkX3ByaW5jaXBhbCwKICAgIC8vICAgICB0b3RhbF9mdW5kZWQ9ZnVuZGVkX2ludGVyZXN0ICsgZnVuZGVkX3ByaW5jaXBhbCwKICAgIC8vICAgICBwcm9jZXNzZWRfZXZlbnRzPXByb2Nlc3NlZF9ldmVudHMsCiAgICAvLyAgICAgdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUA1MzoKICAgIGludGNfMCAvLyAwCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDU0CgoKLy8gbW9kdWxlcy5wYXltZW50X2FnZW50LlBheW1lbnRBZ2VudC5jbGFpbV9kdWVfY2FzaGZsb3dzW3JvdXRpbmddKCkgLT4gdm9pZDoKY2xhaW1fZHVlX2Nhc2hmbG93czoKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cG4gMgogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNQogICAgLy8gaWYgc2VsZi5vcF9kYWVtb24udmFsdWUgIT0gR2xvYmFsLnplcm9fYWRkcmVzczoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNyAvLyAweDUyM2E0ZjUwNDQyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wX2RhZW1vbiBleGlzdHMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE3CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjcgLy8gMHg1MjNhNGY1MDQ0MjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcF9kYWVtb24gZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE3LTE5CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIGJueiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfdHJ1ZUAxNAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE4CiAgICAvLyBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgdHhuIFNlbmRlcgogICAgZGlnIDMKICAgID09CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTctMTkKICAgIC8vIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICAvLyBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgYm56IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDE0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTkKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCAzMgogICAgPT0KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNy0xOQogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICBieiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VAMTUKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDE0OgogICAgaW50Y18xIC8vIDEKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUAxNjoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNi0yMAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyAgICAgb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vICAgICBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgLy8gKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCgpjbGFpbV9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTc6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTM5CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE0MAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDcKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTQzCiAgICAvLyBzZWxmLl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKGhvbGRpbmdfYWRkcmVzcykKICAgIGRpZyAyCiAgICBkdXAKICAgIGNhbGxzdWIgX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNDQKICAgIC8vIHNlbGYuX3NldHRsZV9wb3NpdGlvbihob2xkaW5nX2FkZHJlc3MpCiAgICBjYWxsc3ViIF9zZXR0bGVfcG9zaXRpb24KICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExNwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY2xhaW1hYmxlX2ludGVyZXN0CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBkdXAKICAgIHB1c2hpbnQgNzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExOAogICAgLy8gKyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jbGFpbWFibGVfcHJpbmNpcGFsCiAgICBkdXAKICAgIHB1c2hpbnQgODEKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExNy0xMTgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNsYWltYWJsZV9pbnRlcmVzdAogICAgLy8gKyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jbGFpbWFibGVfcHJpbmNpcGFsCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTQ2CiAgICAvLyBhc3NlcnQgdG90YWxfYW1vdW50ID4gVUludDY0KDApLCBlcnIuTk9fRFVFX0NBU0hGTE9XCiAgICBhc3NlcnQgLy8gTm8gZHVlIGNhc2hmbG93IHRvIHBheQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI1CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MuaXNfb3B0ZWRfaW4oCiAgICBleHRyYWN0IDAgMzIKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNgogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNS0yNwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLmlzX29wdGVkX2luKAogICAgLy8gICAgIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZAogICAgLy8gKQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNS0yOAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLmlzX29wdGVkX2luKAogICAgLy8gICAgIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZAogICAgLy8gKQogICAgLy8gYW5kIG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQKICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAyNAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI4CiAgICAvLyBhbmQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCAzODQKICAgIGdldGJpdAogICAgYm56IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAyNAogICAgaW50Y18xIC8vIDEKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUAyNToKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNTEKICAgIC8vIGlmIHNlbGYuX2lzX3BheW1lbnRfZXhlY3V0YWJsZShob2xkaW5nX2FkZHJlc3MpOgogICAgYnogY2xhaW1fZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozNAogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIHN3YXAKICAgIGRpZyAxCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozNC0zNQogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIC8vID49IHBheW1lbnRfYW1vdW50CiAgICBkaWcgNQogICAgZHVwCiAgICBjb3ZlciAyCiAgICA+PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjMzLTM2CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICAvLyAgICAgPj0gcGF5bWVudF9hbW91bnQKICAgIC8vICksIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcyBmb3IgdGhlIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNTMKICAgIC8vIHNlbGYuX3BheShzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MsIHRvdGFsX2Ftb3VudCkKICAgIGRpZyAyCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBkdXAKICAgIGV4dHJhY3QgMCAzMgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQwLTQ1CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9cmVjZWl2ZXIsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWFtb3VudCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQ0CiAgICAvLyBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgdW5jb3ZlciAzCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIHVuY292ZXIgMgogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0MAogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgcHVzaGludCA0IC8vIGF4ZmVyCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQwLTQ1CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9cmVjZWl2ZXIsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWFtb3VudCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMjUtMTI2CiAgICAvLyAjIEdldCB0aGUgY2xhaW1hYmxlIGFtb3VudHMgYmVmb3JlIHJlc2V0CiAgICAvLyBpbnRlcmVzdF9hbW91bnQgPSBwb3NpdGlvbi5jbGFpbWFibGVfaW50ZXJlc3QKICAgIGR1cAogICAgcHVzaGludCA3MwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSA5CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTI3CiAgICAvLyBwcmluY2lwYWxfYW1vdW50ID0gcG9zaXRpb24uY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgZHVwCiAgICBwdXNoaW50IDgxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAzCiAgICBidXJ5IDkKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMjktMTMwCiAgICAvLyAjIFJlc2V0IHRoZSBwb3NpdGlvbidzIGNsYWltYWJsZSBhbW91bnRzCiAgICAvLyBwb3NpdGlvbi5jbGFpbWFibGVfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBpdG9iCiAgICBzd2FwCiAgICBkaWcgMQogICAgcmVwbGFjZTIgNzMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzEKICAgIC8vIHBvc2l0aW9uLmNsYWltYWJsZV9wcmluY2lwYWwgPSBVSW50NjQoMCkKICAgIHN3YXAKICAgIHJlcGxhY2UyIDgxCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTMyCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHBvc2l0aW9uLmNvcHkoKQogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTM0CiAgICAvLyBhc3NlcnQgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCA+PSBpbnRlcmVzdF9hbW91bnQsIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX2ludGVyZXN0IGV4aXN0cwogICAgZHVwCiAgICBkaWcgMgogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzNQogICAgLy8gYXNzZXJ0IHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsID49IHByaW5jaXBhbF9hbW91bnQsIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICBkaWcgMwogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzNy0xMzgKICAgIC8vICMgVXBkYXRlIHRoZSBnbG9iYWwgcmVzZXJ2ZWQgaW50ZXJlc3QgYW5kIHByaW5jaXBhbCBhbW91bnRzCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0IC09IGludGVyZXN0X2Ftb3VudAogICAgc3dhcAogICAgLQogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzkKICAgIC8vIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIC09IHByaW5jaXBhbF9hbW91bnQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIHN3YXAKICAgIC0KICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKY2xhaW1fZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTU5CiAgICAvLyB0b3RhbF9hbW91bnQ9aW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudCwKICAgIGRpZyA1CiAgICBkdXAKICAgIGRpZyA2CiAgICBkdXAKICAgIGNvdmVyIDMKICAgICsKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNjAKICAgIC8vIHRpbWVzdGFtcD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNTYtMTYyCiAgICAvLyByZXR1cm4gdHlwLkNhc2hDbGFpbVJlc3VsdCgKICAgIC8vICAgICBpbnRlcmVzdF9hbW91bnQ9aW50ZXJlc3RfYW1vdW50LAogICAgLy8gICAgIHByaW5jaXBhbF9hbW91bnQ9cHJpbmNpcGFsX2Ftb3VudCwKICAgIC8vICAgICB0b3RhbF9hbW91bnQ9aW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudCwKICAgIC8vICAgICB0aW1lc3RhbXA9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgY29udGV4dD1wYXltZW50X2luZm8sCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgMgogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIHB1c2hieXRlcyAweDAwMjIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAyNDoKICAgIGludGNfMCAvLyAwCiAgICBiIGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUAyNQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX2ZhbHNlQDE1OgogICAgaW50Y18wIC8vIDAKICAgIGIgY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDE2CgoKLy8gbW9kdWxlcy50cmFuc2Zlcl9hZ2VudC5UcmFuc2ZlckFnZW50LnRyYW5zZmVyX3NldF9zY2hlZHVsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRyYW5zZmVyX3NldF9zY2hlZHVsZToKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo0MAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQxCiAgICAvLyBhc3NlcnQgb3Blbl9kYXRlIDwgY2xvc3VyZV9kYXRlLCBlcnIuSU5WQUxJRF9TT1JUSU5HCiAgICBkdXAyCiAgICA8CiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbXVzdCBiZSBzb3J0ZWQgaW4gc3RyaWN0bHkgYXNjZW5kaW5nIG9yZGVyCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQzCiAgICAvLyBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA9IG9wZW5fZGF0ZQogICAgYnl0ZWMgMjkgLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIHVuY292ZXIgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDQKICAgIC8vIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlID0gY2xvc3VyZV9kYXRlCiAgICBieXRlYyAzMCAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDUKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy50cmFuc2Zlcl9hZ2VudC5UcmFuc2ZlckFnZW50LnByaW1hcnlfZGlzdHJpYnV0aW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcHJpbWFyeV9kaXN0cmlidXRpb246CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjczCiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5wcmltYXJ5X2RlYWxlciwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDIyIC8vIDB4NTIzYTUwNTk0NDIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojc2CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo3NwogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojc4CiAgICAvLyBhc3NlcnQgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TRUQKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBjbG9zZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgY292ZXIgMwogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4MAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChob2xkaW5nX2FkZHJlc3MpCiAgICBzd2FwCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjgxCiAgICAvLyBhc3NlcnQgdW5pdHMgPiBVSW50NjQoMCksIGVyci5aRVJPX1VOSVRTCiAgICBkdXAKICAgIGFzc2VydCAvLyBDYW4gbm90IGRpc3RyaWJ1dGUgemVybyB1bml0cwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4MwogICAgLy8gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCArIHVuaXRzIDw9IHNlbGYudG90YWxfdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICArCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgPD0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODItODQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCArIHVuaXRzIDw9IHNlbGYudG90YWxfdW5pdHMKICAgIC8vICksIGVyci5PVkVSX0RJU1RSSUJVVElPTgogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCByZW1haW5pbmcgRC1BU0EgdW5pdHMKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODUKICAgIC8vIGlmIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI4IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlIGV4aXN0cwogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojg3CiAgICAvLyBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8PSBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI4IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlIGV4aXN0cwogICAgPD0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODYtODgKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPD0gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGUKICAgIC8vICksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TRUQKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBjbG9zZWQKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNDgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnJlc2VydmVkX3VuaXRzICs9IHVuaXRzCiAgICBkdXBuIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDMKICAgIGR1cAogICAgY292ZXIgMwogICAgKwogICAgaXRvYgogICAgcHVzaGludCA0MAogICAgc3dhcAogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6OTEKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgKz0gdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICArCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6OTIKICAgIC8vIHJldHVybiBzZWxmLnRvdGFsX3VuaXRzIC0gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIHN3YXAKICAgIC0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMudHJhbnNmZXJfYWdlbnQuVHJhbnNmZXJBZ2VudC50cmFuc2Zlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnRyYW5zZmVyOgogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTMwCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxMzEKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQ3CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuX3N0YXR1c19pc19wZW5kaW5nX2llZCgpLCBlcnIuUEVORElOR19JRUQKICAgICEKICAgIGFzc2VydCAvLyBJRUQgbm90IHlldCBleGVjdXRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxMwogICAgLy8gaWYgc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjkgLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICBieiB0cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTUKICAgIC8vIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjkgLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNC0xNgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gKSwgZXJyLkNMT1NFRF9UUkFOU0ZFUgogICAgYXNzZXJ0IC8vIFRyYW5zZmVyIGlzIGNsb3NlZAoKdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNwogICAgLy8gaWYgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzAgLy8gInRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICBieiB0cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTkKICAgIC8vIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDwgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGUKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMCAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIDwKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTgtMjAKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZQogICAgLy8gKSwgZXJyLkNMT1NFRF9UUkFOU0ZFUgogICAgYXNzZXJ0IC8vIFRyYW5zZmVyIGlzIGNsb3NlZAoKdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxMzUKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIGRpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA4CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIGJ5dGVjIDggLy8gMHg0MTIzCiAgICBkaWcgNQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA5CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjEzOAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChzZW5kZXJfaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDIKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTM5CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGR1cAogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNDAKICAgIC8vIGFzc2VydCBzZW5kZXJfaG9sZGluZ19hZGRyZXNzICE9IHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcywgZXJyLlNFTEZfVFJBTlNGRVIKICAgIHVuY292ZXIgMgogICAgIT0KICAgIGFzc2VydCAvLyBTZW5kZXIgYW5kIHJlY2VpdmVyIG11c3QgYmUgZGlmZmVyZW50CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE0MQogICAgLy8gYXNzZXJ0IHVuaXRzID4gVUludDY0KDApLCBlcnIuTlVMTF9UUkFOU0ZFUgogICAgZGlnIDEKICAgIGR1cAogICAgYXNzZXJ0IC8vIFRyYW5zZmVyIHVuaXRzIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTQyCiAgICAvLyBhc3NlcnQgdW5pdHMgPD0gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLCBlcnIuT1ZFUl9UUkFOU0ZFUgogICAgc3dhcAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIDw9CiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IHNlbmRlciB1bml0cyB0byB0cmFuc2ZlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzYzCiAgICAvLyBpZiBzZWxmLmV2ZW50X2N1cnNvciA+PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICA+PQogICAgYm56IHRyYW5zZmVyX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Fzc2VydF9ub19kdWVfZXZlbnRfcGVuZGluZ0AxMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzY1CiAgICAvLyBuZXh0X2VudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KHNlbGYuZXZlbnRfY3Vyc29yKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc2NwogICAgLy8gbmV4dF9lbnRyeS5zY2hlZHVsZWRfdGltZSA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NjYtNzY4CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIG5leHRfZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gKSwgZXJyLlBFTkRJTkdfQUNUVVNfRVZFTlQKICAgIGFzc2VydCAvLyBBQ1RVUyBldmVudCBub3QgeWV0IGV4ZWN1dGVkCgp0cmFuc2Zlcl9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9hc3NlcnRfbm9fZHVlX2V2ZW50X3BlbmRpbmdAMTA6CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE0NQogICAgLy8gc2VsZi5fZW5zdXJlX3VuaXRzX2FjdGl2YXRlZChzZW5kZXJfaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDMKICAgIGR1cAogICAgY2FsbHN1YiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNDYKICAgIC8vIHNlbGYuX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQocmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgY2FsbHN1YiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNDcKICAgIC8vIHNlbGYuX3NldHRsZV9wb3NpdGlvbihzZW5kZXJfaG9sZGluZ19hZGRyZXNzKQogICAgY2FsbHN1YiBfc2V0dGxlX3Bvc2l0aW9uCiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTQ4CiAgICAvLyBzZWxmLl9zZXR0bGVfcG9zaXRpb24ocmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzKQogICAgY2FsbHN1YiBfc2V0dGxlX3Bvc2l0aW9uCiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNTIKICAgIC8vIGFzc2VydCB1bml0cyA8PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cywgZXJyLk9WRVJfVFJBTlNGRVIKICAgIGRpZyA1CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkaWcgMQogICAgPD0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgc2VuZGVyIHVuaXRzIHRvIHRyYW5zZmVyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTUzCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyAtPSB1bml0cwogICAgZGlnIDEKICAgIC0KICAgIGl0b2IKICAgIHVuY292ZXIgMgogICAgaW50Y18zIC8vIDMyCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTQ0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyArPSB1bml0cwogICAgZGlnIDUKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIHVuY292ZXIgMgogICAgKwogICAgaXRvYgogICAgaW50Y18zIC8vIDMyCiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfc3VzcGVuc2lvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfc3VzcGVuc2lvbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojc5CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyMSAvLyAweDUyM2E0MTU1NTQyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE4NQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkID0gc3VzcGVuZGVkCiAgICBkdXAKICAgIHB1c2hpbnQgNDgKICAgIGludGNfMSAvLyAxCiAgICBib3hfZXh0cmFjdAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMwogICAgc2V0Yml0CiAgICBwdXNoaW50IDQ4CiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE4NgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTY1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5hY2NvdW50X29wZW5bcm91dGluZ10oKSAtPiB2b2lkOgphY2NvdW50X29wZW46CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzAKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmFjY291bnRfbWFuYWdlciwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDIzIC8vIDB4NTIzYTRkNGU0NzIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzkKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0VOREVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDIwMAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTAKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX2VuZGVkKCksIGVyci5VTkFVVEhPUklaRUQKICAgICEKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxMQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTIKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjEzCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozNAogICAgLy8gdW5pdHM9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozMi00MgogICAgLy8gcmV0dXJuIHR5cC5BY2NvdW50UG9zaXRpb24oCiAgICAvLyAgICAgcGF5bWVudF9hZGRyZXNzPXBheW1lbnRfYWRkcmVzcywKICAgIC8vICAgICB1bml0cz1VSW50NjQoMCksCiAgICAvLyAgICAgcmVzZXJ2ZWRfdW5pdHM9VUludDY0KDApLAogICAgLy8gICAgIHN1c3BlbmRlZD1GYWxzZSwKICAgIC8vICAgICBzZXR0bGVkX2N1cnNvcj1VSW50NjQoMCksCiAgICAvLyAgICAgaW50ZXJlc3RfY2hlY2twb2ludD1VSW50NjQoMCksCiAgICAvLyAgICAgcHJpbmNpcGFsX2NoZWNrcG9pbnQ9VUludDY0KDApLAogICAgLy8gICAgIGNsYWltYWJsZV9pbnRlcmVzdD1VSW50NjQoMCksCiAgICAvLyAgICAgY2xhaW1hYmxlX3ByaW5jaXBhbD1VSW50NjQoMCksCiAgICAvLyApCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGJ5dGVjIDQxIC8vIDB4MDAKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjE0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHNlbGYuX25ld19hY2NvdW50X3Bvc2l0aW9uKHBheW1lbnRfYWRkcmVzcykKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTUKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjM4CiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIHVuY292ZXIgMwogICAgPT0KICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIzOQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDAKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQxCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MgPSBwYXltZW50X2FkZHJlc3MKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQyCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfZ2V0X3Bvc2l0aW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF9nZXRfcG9zaXRpb246CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNTkKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9jcmVhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9jcmVhdGU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDE5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAzMwogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IGFycmFuZ2VyCiAgICBieXRlYyAxOCAvLyAweDUyM2E0MTUyNTIyMwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMzQKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAxOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfY29uZmlnW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfY29uZmlnOgogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBsZW4KICAgIHB1c2hpbnQgMTA3CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLk5vcm1hbGl6ZWRBY3R1c1Rlcm1zCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgcHVzaGludCA3MgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5Jbml0aWFsS2VybmVsU3RhdGUKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBsZW4KICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIHR1cGxlIGVuY29kaW5nCiAgICBkdXAKICAgIHB1c2hpbnQgMzQKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCB0YWlsIHBvaW50ZXIgYXQgaW5kZXggMSBvZiAodWludDhbMzJdLChsZW4rdXRmOFtdKSkKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgY292ZXIgMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMzYKICAgICsKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuUHJvc3BlY3R1cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2NgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDY4LTEwNjkKICAgIC8vICMgQ29uZmlndXJlIENvbnRyYWN0CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPSB0ZXJtcy5jb250cmFjdF90eXBlLmFzX3VpbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgYnogY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUA3CiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIyMAogICAgLy8gVUludDY0KGVudW1zLkNUX0FOTiksCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIxCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfTkFNKSwKICAgIHB1c2hpbnQgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIyCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfTEFNKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIzCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfTEFYKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjI0CiAgICAvLyBVSW50NjQoZW51bXMuQ1RfQ0xNKSwKICAgIHB1c2hpbnQgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJ6IGNvbnRyYWN0X2NvbmZpZ19ib29sX2ZhbHNlQDgKCmNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANzoKICAgIGludGNfMSAvLyAxCgpjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUA5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjI5CiAgICAvLyBhc3NlcnQgc2VsZi5faXNfc3VwcG9ydGVkX2NvbnRyYWN0X3R5cGUoY29udHJhY3RfdHlwZSksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3MQogICAgLy8gc2VsZi5fc3RvcmVfY29udHJhY3RfY29uZmlnKHNlbGYuY29udHJhY3RfdHlwZSwgdGVybXMsIGluaXRpYWxfc3RhdGUpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgYnVyeSAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzI1CiAgICAvLyBhc3NlcnQgdGVybXMuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZGlnIDQKICAgIGR1cAogICAgcHVzaGludCAzMwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSA4CiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMjcKICAgIC8vIHRlcm1zLmRheV9jb3VudF9jb252ZW50aW9uLmFzX3VpbnQ2NCgpCiAgICBwdXNoaW50IDU3CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICBieiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDE2CiAgICBkaWcgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk5CiAgICAvLyBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI5Ny0zMDMKICAgIC8vIHJldHVybiBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzYwKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwSVNEQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjApLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDE2CiAgICBkaWcgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzAwCiAgICAvLyBVSW50NjQoZW51bXMuRENDX0EzNjUpLAogICAgcHVzaGludCAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyOTctMzAzCiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgID09CiAgICBibnogY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUAxNgogICAgZGlnIDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMwMQogICAgLy8gVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGRpZyA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDIKICAgIC8vIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICA9PQogICAgYnogY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAMTcKCmNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTY6CiAgICBpbnRjXzEgLy8gMQoKY29udHJhY3RfY29uZmlnX2Jvb2xfbWVyZ2VAMTg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDktMzExCiAgICAvLyBhc3NlcnQgc2VsZi5faXNfc3VwcG9ydGVkX2RheV9jb3VudF9jb252ZW50aW9uKAogICAgLy8gICAgIGRheV9jb3VudF9jb252ZW50aW9uCiAgICAvLyApLCBlcnIuSU5WQUxJRF9EQVlfQ09VTlRfQ09OVkVOVElPTgogICAgYXNzZXJ0IC8vIEludmFsaWQgZGF5LWNvdW50IGNvbnZlbnRpb24gSUQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMyOQogICAgLy8gaWYgY29udHJhY3RfdHlwZSAhPSBVSW50NjQoZW51bXMuQ1RfQU5OKToKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgICE9CiAgICBieiBjb250cmFjdF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzMwCiAgICAvLyBhc3NlcnQgbm90IHRlcm1zLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24sIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZGlnIDQKICAgIHB1c2hpbnQgNzg2CiAgICBnZXRiaXQKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KCmNvbnRyYWN0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDIwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODA3CiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIEQtQVNBIGFscmVhZHkgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODA4CiAgICAvLyBhc3NlcnQgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCA9PSBVSW50NjQoMCksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMCAvLyAiaW5pdGlhbF9leGNoYW5nZV9hbW91bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTAtODExCiAgICAvLyAjIFNldCBEZW5vbWluYXRpb24gQXNzZXQKICAgIC8vIHNlbGYuX2Fzc2VydF9kZW5vbWluYXRpb25fYXNzZXQodGVybXMuZGVub21pbmF0aW9uX2Fzc2V0X2lkKQogICAgZGlnIDQKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NzUtNzc2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIGRlbm9taW5hdGlvbiB3aXRoIEFTQQogICAgLy8gX2NyZWF0b3IsIGV4aXN0cyA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X2NyZWF0b3IoZGVub21pbmF0aW9uX2Fzc2V0X2lkKQogICAgZHVwCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q3JlYXRvcgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NzcKICAgIC8vIGFzc2VydCBleGlzdHMsIGVyci5JTlZBTElEX0RFTk9NSU5BVElPTgogICAgYXNzZXJ0IC8vIERlbm9taW5hdGlvbiBhc3NldCBpcyBub3QgcHJvcGVybHkgc2V0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODAKICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICBieXRlYyA0NCAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTQtODE1CiAgICAvLyAjIFNldCBTZXR0bGVtZW50IEFzc2V0CiAgICAvLyBzZWxmLl9hc3NlcnRfc2V0dGxlbWVudF9hc3NldCh0ZXJtcy5zZXR0bGVtZW50X2Fzc2V0X2lkKQogICAgZGlnIDEKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc4NQogICAgLy8gc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODMtNzg2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc2V0dGxlbWVudCBhc3NldCBpcyB0aGUgZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQgPT0gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIC8vICksIGVyci5JTlZBTElEX1NFVFRMRU1FTlRfQVNTRVQKICAgIGFzc2VydCAvLyBEaWZmZXJlbnQgc2V0dGxlbWVudCBhc3NldCBub3Qgc3VwcG9ydGVkLCBtdXN0IGJlIGVxdWFsIHRvIGRlbm9taW5hdGlvbiBhc3NldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Nzg5CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBzZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkwLTc5NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhc3NldF9hbW91bnQ9MCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Nzk1CiAgICAvLyBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkzCiAgICAvLyBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc5NAogICAgLy8gYXNzZXRfYW1vdW50PTAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkwLTc5MQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3OTAtNzk2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODE4LTgxOQogICAgLy8gIyBVbml0cwogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IHRlcm1zLnRvdGFsX3VuaXRzCiAgICBkdXAKICAgIHB1c2hpbnQgMTcKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODIwCiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID0gVUludDY0KDApCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgyMi04MjMKICAgIC8vICMgRGF5LUNvdW50IENvbnZlbnRpb25zCiAgICAvLyBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uID0gdGVybXMuZGF5X2NvdW50X2NvbnZlbnRpb24uYXNfdWludDY0KCkKICAgIGJ5dGVjIDQ2IC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGRpZyA4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODI1LTgyNgogICAgLy8gIyBUaW1lCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA9IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZQogICAgZHVwCiAgICBwdXNoaW50IDQxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMjggLy8gImluaXRpYWxfZXhjaGFuZ2VfZGF0ZSIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODI3CiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSB0ZXJtcy5tYXR1cml0eV9kYXRlCiAgICBkaWcgMQogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDQ1IC8vICJtYXR1cml0eV9kYXRlIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MjgKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IGluaXRpYWxfc3RhdGUubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZGlnIDYKICAgIGR1cAogICAgY292ZXIgMgogICAgcHVzaGludCA0OAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzMC04MzEKICAgIC8vICMgUHJpbmNpcGFsCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID0gdGVybXMuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGRpZyAxMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzMgogICAgLy8gc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gdGVybXMuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZGlnIDMKICAgIHB1c2hpbnQgNzg2CiAgICBnZXRiaXQKICAgIGJ5dGVjIDM1IC8vICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzMwogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBpbml0aWFsX3N0YXRlLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZGlnIDEKICAgIHB1c2hpbnQgMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODM1LTgzNgogICAgLy8gIyBJbnRlcmVzdAogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ID0gaW5pdGlhbF9zdGF0ZS5hY2NydWVkX2ludGVyZXN0CiAgICBkaWcgMQogICAgcHVzaGludCA0MAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODM4LTgzOQogICAgLy8gIyBJbnRlcmVzdCBSYXRlCiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IGluaXRpYWxfc3RhdGUubm9taW5hbF9pbnRlcmVzdF9yYXRlCiAgICBkaWcgMQogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0MAogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gaW5pdGlhbF9zdGF0ZS5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlCiAgICBkaWcgMQogICAgcHVzaGludCAyNAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQxCiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkID0gdGVybXMucmF0ZV9yZXNldF9zcHJlYWQKICAgIGRpZyAzCiAgICBwdXNoaW50IDU4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzYgLy8gInJhdGVfcmVzZXRfc3ByZWFkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0MgogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIgPSB0ZXJtcy5yYXRlX3Jlc2V0X211bHRpcGxpZXIKICAgIGRpZyAzCiAgICBwdXNoaW50IDY2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzcgLy8gInJhdGVfcmVzZXRfbXVsdGlwbGllciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDMKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9mbG9vciA9IHRlcm1zLnJhdGVfcmVzZXRfZmxvb3IKICAgIGRpZyAzCiAgICBwdXNoaW50IDc0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzEgLy8gInJhdGVfcmVzZXRfZmxvb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQ0CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfY2FwID0gdGVybXMucmF0ZV9yZXNldF9jYXAKICAgIGRpZyAzCiAgICBwdXNoaW50IDgyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzIgLy8gInJhdGVfcmVzZXRfY2FwIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0NQogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X25leHQgPSB0ZXJtcy5yYXRlX3Jlc2V0X25leHQKICAgIGRpZyAzCiAgICBwdXNoaW50IDkwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzggLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDYKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgPSB0ZXJtcy5oYXNfcmF0ZV9yZXNldF9mbG9vcgogICAgZGlnIDMKICAgIHB1c2hpbnQgNzg0CiAgICBnZXRiaXQKICAgIGJ5dGVjIDM5IC8vICJoYXNfcmF0ZV9yZXNldF9mbG9vciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDcKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwID0gdGVybXMuaGFzX3JhdGVfcmVzZXRfY2FwCiAgICBkaWcgMwogICAgcHVzaGludCA3ODUKICAgIGdldGJpdAogICAgYnl0ZWMgNDAgLy8gImhhc19yYXRlX3Jlc2V0X2NhcCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDktODUwCiAgICAvLyAjIFNjYWxpbmcKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgPSB0ZXJtcy5maXhlZF9wb2ludF9zY2FsZQogICAgdW5jb3ZlciAzCiAgICBwdXNoaW50IDk5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODUyLTg1MwogICAgLy8gIyBTY2hlZHVsZSBQcm9jZXNzaW5nCiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciA9IGluaXRpYWxfc3RhdGUuZXZlbnRfY3Vyc29yCiAgICBkaWcgMQogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU1LTg1NgogICAgLy8gIyBQZXItVW5pdCBGaXhlZC1Qb2ludCBJbmRleGVzCiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggPSBpbml0aWFsX3N0YXRlLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgKICAgIGRpZyAxCiAgICBwdXNoaW50IDU2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU3CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4ID0gaW5pdGlhbF9zdGF0ZS5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleAogICAgZGlnIDEKICAgIHB1c2hpbnQgNjQKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU5LTg2MAogICAgLy8gIyBSZXNlcnZlZCBBbW91bnQgKGZvciBleGVjdXRlZCBjYXNoZmxvd3MpCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0ID0gVUludDY0KDApCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2MQogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2MwogICAgLy8gYXNzZXJ0IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLCBlcnIuSU5WQUxJRF9JRUQKICAgIGRpZyAyCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICBhc3NlcnQgLy8gSUVEIG11c3QgYmUgc2V0IGluIHRoZSBmdXR1cmUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2NAogICAgLy8gYXNzZXJ0IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA+IGluaXRpYWxfc3RhdGUuc3RhdHVzX2RhdGUsIGVyci5JTlZBTElEX0lFRAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgPAogICAgYXNzZXJ0IC8vIElFRCBtdXN0IGJlIHNldCBpbiB0aGUgZnV0dXJlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NjUKICAgIC8vIGFzc2VydCB0ZXJtcy5pbml0aWFsX2V4Y2hhbmdlX2RhdGUgPCB0ZXJtcy5tYXR1cml0eV9kYXRlLCBlcnIuSU5WQUxJRF9JRUQKICAgIDwKICAgIGFzc2VydCAvLyBJRUQgbXVzdCBiZSBzZXQgaW4gdGhlIGZ1dHVyZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3My0xMDc0CiAgICAvLyAjIE5vdGFyaXplIHByb3NwZWN0dXMgKG9wdGlvbmFsKQogICAgLy8gc2VsZi5wcm9zcGVjdHVzX2hhc2ggPSBwcm9zcGVjdHVzLmhhc2guYnl0ZXMKICAgIGRpZyAyCiAgICBleHRyYWN0IDAgMzIKICAgIGJ5dGVjIDQyIC8vICJwcm9zcGVjdHVzX2hhc2giCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3NQogICAgLy8gc2VsZi5wcm9zcGVjdHVzX3VybCA9IHByb3NwZWN0dXMudXJsCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGVjIDQzIC8vICJwcm9zcGVjdHVzX3VybCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc2CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAMTc6CiAgICBpbnRjXzAgLy8gMAogICAgYiBjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUAxOAoKY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAODoKICAgIGludGNfMCAvLyAwCiAgICBiIGNvbnRyYWN0X2NvbmZpZ19ib29sX21lcmdlQDkKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9zY2hlZHVsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X3NjaGVkdWxlOgogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHN3YXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBkdXAKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgMgogICAgKwogICAgdW5jb3ZlciAyCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLkV4ZWN1dGlvblNjaGVkdWxlRW50cnk+CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTEwCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMTMKICAgIC8vIGNvbnRyYWN0X3R5cGU9c2VsZi5jb250cmFjdF90eXBlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGNvdmVyIDMKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4ODEKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4ODItODg0CiAgICAvLyBhc3NlcnQgc2NoZWR1bGVfcGFnZS5sZW5ndGggPD0gVUludDY0KAogICAgLy8gICAgIGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUKICAgIC8vICksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGR1cAogICAgcHVzaGludCAxNgogICAgPD0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg4NQogICAgLy8gYXNzZXJ0IHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPiBVSW50NjQoMCksIGVyci5URVJNU19OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSB0ZXJtcyBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODg3CiAgICAvLyBwYWdlX2N1cnNvciA9IHNjaGVkdWxlX3BhZ2VfaW5kZXggKiBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkKICAgIHN3YXAKICAgIHB1c2hpbnQgMTYKICAgICoKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg5NAogICAgLy8gKyBwYWdlX2xlbmd0aCAqIFVJbnQ2NChjc3QuT1BfVVBfQ09OVFJBQ1RfQ09ORklHX1BFUl9FTlRSWV9CVURHRVQpCiAgICBwdXNoaW50IDEwMAogICAgKgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODkzCiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19CQVNFX0JVREdFVCkKICAgIGludGMgNCAvLyAxNTAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTMtODk0CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19CQVNFX0JVREdFVCkKICAgIC8vICsgcGFnZV9sZW5ndGggKiBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19QRVJfRU5UUllfQlVER0VUKQogICAgKwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODg5LTg5NgogICAgLy8gIyBWYWxpZGF0aW9uIGNvc3QgZ3Jvd3Mgd2l0aCBwYWdlIGxlbmd0aCwgc28gY29uZmlndXJhdGlvbiBleHBsaWNpdGx5CiAgICAvLyAjIGJ1eXMgZXh0cmEgb3Bjb2RlIGJ1ZGdldCBmb3IgbGFyZ2VyIHVwbG9hZHMuCiAgICAvLyBlbnN1cmVfYnVkZ2V0KAogICAgLy8gICAgIHJlcXVpcmVkX2J1ZGdldD0oCiAgICAvLyAgICAgICAgIFVJbnQ2NChjc3QuT1BfVVBfQ09OVFJBQ1RfQ09ORklHX0JBU0VfQlVER0VUKQogICAgLy8gICAgICAgICArIHBhZ2VfbGVuZ3RoICogVUludDY0KGNzdC5PUF9VUF9DT05UUkFDVF9DT05GSUdfUEVSX0VOVFJZX0JVREdFVCkKICAgIC8vICAgICApLAogICAgLy8gKQogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODk3CiAgICAvLyBpbmRleCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKCmNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEAyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODk4CiAgICAvLyB3aGlsZSBpbmRleCA8IHBhZ2VfbGVuZ3RoOgogICAgZHVwCiAgICBkaWcgNAogICAgPAogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfd2hpbGVAMTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg5OS05MDAKICAgIC8vIGVudHJ5ID0gc2NoZWR1bGVfcGFnZVtpbmRleF0uY29weSgpCiAgICAvLyBlbnRyeV9ldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZGlnIDQKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGJ1cnkgMTIKICAgIGRpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgNjUKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTAwCiAgICAvLyBlbnRyeV9ldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTktOTAwCiAgICAvLyBlbnRyeSA9IHNjaGVkdWxlX3BhZ2VbaW5kZXhdLmNvcHkoKQogICAgLy8gZW50cnlfZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGludGNfMiAvLyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDAKICAgIC8vIGVudHJ5X2V2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBnZXRieXRlCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgMTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkwMQogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X2lkID09IHBhZ2VfY3Vyc29yICsgaW5kZXgsIGVyci5JTlZBTElEX0VWRU5UX0lECiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEzCiAgICBkaWcgNQogICAgdW5jb3ZlciA0CiAgICArCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDItOTA0CiAgICAvLyBzZWxmLl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBlbnRyeV9ldmVudF90eXBlCiAgICAvLyApCiAgICBkaWcgNQogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTA1CiAgICAvLyBhc3NlcnQgZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgc3dhcAogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDYKICAgIC8vIGlmIGVudHJ5LmV2ZW50X2lkID4gVUludDY0KDApOgogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDcKICAgIC8vIGlmIGluZGV4ID4gVUludDY0KDApOgogICAgZHVwCiAgICBieiBjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlANgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTA4CiAgICAvLyBwcmV2aW91c19lbnRyeSA9IHNjaGVkdWxlX3BhZ2VbaW5kZXggLSBVSW50NjQoMSldLmNvcHkoKQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgcHVzaGludCA2NQogICAgKgogICAgZGlnIDExCiAgICBzd2FwCiAgICBwdXNoaW50IDY1CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkyMwogICAgLy8gcHJldmlvdXNfZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gZW50cnkuc2NoZWR1bGVkX3RpbWUKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyA4CiAgICA8PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTIyLTkyNAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBwcmV2aW91c19lbnRyeS5zY2hlZHVsZWRfdGltZSA8PSBlbnRyeS5zY2hlZHVsZWRfdGltZQogICAgLy8gKSwgZXJyLklOVkFMSURfU09SVElORwogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIG11c3QgYmUgc29ydGVkIGluIHN0cmljdGx5IGFzY2VuZGluZyBvcmRlcgoKY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUA4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTI1CiAgICAvLyBpZiBlbnRyeS5ldmVudF9pZCA9PSBVSW50NjQoMCk6CiAgICBkaWcgOAogICAgYm56IGNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkyNi05MjgKICAgIC8vIGFzc2VydCBlbnRyeV9ldmVudF90eXBlID09IFVJbnQ2NCgKICAgIC8vICAgICBlbnVtcy5FVlRfSUVECiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGRpZyA5CiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjkKICAgIC8vIGluZGV4ICs9IFVJbnQ2NCgxKQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIGNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEAyCgpjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlANjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkxMC05MTIKICAgIC8vICMgVGhlIGZpcnN0IGVudHJ5IG9mIGEgcGFnZSBtdXN0IHN0aWxsIGJlIG9yZGVyZWQgYWZ0ZXIgdGhlCiAgICAvLyAjIGxhc3QgZW50cnkgb2YgdGhlIHByZXZpb3VzIHBhZ2UuCiAgICAvLyBhc3NlcnQgc2NoZWR1bGVfcGFnZV9pbmRleCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGRpZyA2CiAgICBkdXAKICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTMKICAgIC8vIHByZXZpb3VzX3BhZ2VfaW5kZXggPSBzY2hlZHVsZV9wYWdlX2luZGV4IC0gVUludDY0KDEpCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTE1CiAgICAvLyBwcmV2aW91c19wYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZQogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTQtOTE2CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHByZXZpb3VzX3BhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTctOTE4CiAgICAvLyBwcmV2aW91c19wYWdlID0gc2VsZi5zY2hlZHVsZV9wYWdlW3ByZXZpb3VzX3BhZ2VfaW5kZXhdLmNvcHkoKQogICAgLy8gYXNzZXJ0IHByZXZpb3VzX3BhZ2UubGVuZ3RoID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBwdXNoaW50IDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTgKICAgIC8vIGFzc2VydCBwcmV2aW91c19wYWdlLmxlbmd0aCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZHVwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjAKICAgIC8vIHByZXZpb3VzX3BhZ2UubGVuZ3RoIC0gVUludDY0KDEpCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTE5LTkyMQogICAgLy8gcHJldmlvdXNfZW50cnkgPSBwcmV2aW91c19wYWdlWwogICAgLy8gICAgIHByZXZpb3VzX3BhZ2UubGVuZ3RoIC0gVUludDY0KDEpCiAgICAvLyBdLmNvcHkoKQogICAgcHVzaGludCA2NQogICAgKgogICAgcHVzaGludCAyCiAgICArCiAgICBwdXNoaW50IDY1CiAgICBib3hfZXh0cmFjdAogICAgYiBjb250cmFjdF9zY2hlZHVsZV9hZnRlcl9pZl9lbHNlQDcKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX3doaWxlQDExOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjAwCiAgICAvLyBzZWxmLnNjaGVkdWxlX3BhZ2VbcGFnZV9pbmRleF0gPSBzY2hlZHVsZV9wYWdlLmNvcHkoKQogICAgZGlnIDYKICAgIGl0b2IKICAgIGJ5dGVjIDI0IC8vIDB4NTMyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgZGlnIDUKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzMgogICAgLy8gaWYgaXNfbGFzdF9wYWdlOgogICAgZGlnIDUKICAgIGJ6IGNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzNAogICAgLy8gc2NoZWR1bGVfcGFnZV9pbmRleCAqIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKSArIHBhZ2VfbGVuZ3RoCiAgICBkaWcgMQogICAgZGlnIDQKICAgICsKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzMwogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA9ICgKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTMzLTkzNQogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA9ICgKICAgIC8vICAgICBzY2hlZHVsZV9wYWdlX2luZGV4ICogVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpICsgcGFnZV9sZW5ndGgKICAgIC8vICkKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MzYKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgNTAKICAgIGFwcF9nbG9iYWxfcHV0Cgpjb250cmFjdF9zY2hlZHVsZV9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTExOAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9leGVjdXRlX2llZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X2V4ZWN1dGVfaWVkOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDMKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE0NAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDUKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTQ3CiAgICAvLyBhc3NlcnQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LCBlcnIuSU5WQUxJRF9FVkVOVF9DVVJTT1IKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgZGlnIDEKICAgID4KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGN1cnNvcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE0OAogICAgLy8gZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoc2VsZi5ldmVudF9jdXJzb3IpCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDkKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoZW51bXMuRVZUX0lFRCksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGR1cAogICAgZXh0cmFjdCA4IDEKICAgIGR1cAogICAgcHVzaGJ5dGVzIDB4MDEKICAgIGI9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1MwogICAgLy8gZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICBkaWcgMQogICAgZXh0cmFjdCAwIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTUKICAgIC8vIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgZGlnIDIKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTU2CiAgICAvLyBhY2NydWFsX2ZhY3Rvcj1lbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIGRpZyAzCiAgICBleHRyYWN0IDE3IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTcKICAgIC8vIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIGRpZyA0CiAgICBleHRyYWN0IDI1IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTkKICAgIC8vIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPWVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDUKICAgIGV4dHJhY3QgMzMgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE2MAogICAgLy8gbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgZGlnIDYKICAgIGV4dHJhY3QgNDEgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE2MQogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9ZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICBkaWcgNwogICAgZXh0cmFjdCA0OSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTYyCiAgICAvLyBmbGFncz1lbnRyeS5mbGFncywKICAgIGRpZyA4CiAgICBleHRyYWN0IDU3IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTItMTE2MwogICAgLy8gdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0KAogICAgLy8gICAgIGV2ZW50X2lkPWVudHJ5LmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1lbnRyeS5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1lbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPWVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9ZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPWVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGZsYWdzPWVudHJ5LmZsYWdzLAogICAgLy8gKSwKICAgIHVuY292ZXIgNwogICAgdW5jb3ZlciA4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNwogICAgY29uY2F0CiAgICB1bmNvdmVyIDYKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTgKICAgIC8vIG9ic2VydmVkX3JhdGU9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTItMTE2MwogICAgLy8gdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0KAogICAgLy8gICAgIGV2ZW50X2lkPWVudHJ5LmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1lbnRyeS5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1lbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPWVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9ZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPWVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGZsYWdzPWVudHJ5LmZsYWdzLAogICAgLy8gKSwKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTUwLTExNjQKICAgIC8vIHNlbGYuX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5KAogICAgLy8gICAgIGVudHJ5LAogICAgLy8gICAgIHR5cC5PYnNlcnZlZEV2ZW50UmVxdWVzdCgKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPWVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIG9ic2VydmVkX3JhdGU9VUludDY0KDApLAogICAgLy8gICAgICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1lbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1lbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICAgICAgZmxhZ3M9ZW50cnkuZmxhZ3MsCiAgICAvLyAgICAgKSwKICAgIC8vICkKICAgIGNhbGxzdWIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5CiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNjUKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEyMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuYXBwbHlfbm9uX2Nhc2hfZXZlbnRbcm91dGluZ10oKSAtPiB2b2lkOgphcHBseV9ub25fY2FzaF9ldmVudDoKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDQKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cG4gMgogICAgbGVuCiAgICBwdXNoaW50IDczCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLk9ic2VydmVkRXZlbnRSZXF1ZXN0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIwNAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMDUKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjA3CiAgICAvLyBpZiBwYXlsb2FkLmZsYWdzICYgVUludDY0KGVudW1zLkZMQUdfT0JTRVJWRURfRVZFTlQpOgogICAgcHVzaGludCA2NQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgcHVzaGludCA0CiAgICAmCiAgICBieiBhcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIzMwogICAgLy8gcmV0dXJuIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQ0xNKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICBwdXNoaW50IDUKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjA4CiAgICAvLyBhc3NlcnQgc2VsZi5fc3VwcG9ydHNfb2JzZXJ2ZWRfZXZlbnRzKCksIGVyci5PQlNFUlZFRF9FVkVOVF9SRVFVSVJFRAogICAgYXNzZXJ0IC8vIE9ic2VydmVkIGV2ZW50IHJlcXVpcmVkIHRvIGV4ZWN1dGUgdGhpcyBhY3Rpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMDkKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjMzCiAgICAvLyByZXR1cm4gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9DTE0pCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIGR1cAogICAgcHVzaGludCA1CiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQ1CiAgICAvLyBhc3NlcnQgc2VsZi5fc3VwcG9ydHNfb2JzZXJ2ZWRfZXZlbnRzKCksIGVyci5PQlNFUlZFRF9FVkVOVF9SRVFVSVJFRAogICAgYXNzZXJ0IC8vIE9ic2VydmVkIGV2ZW50IHJlcXVpcmVkIHRvIGV4ZWN1dGUgdGhpcyBhY3Rpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk0NgogICAgLy8gYXNzZXJ0IHBheWxvYWQuZXZlbnRfaWQgPT0gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGRpZyAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDcKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBpZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQ4CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUsIHBheWxvYWQuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgYnVyeSAxMgogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk0Ny05NDkKICAgIC8vIHNlbGYuX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIHNlbGYuY29udHJhY3RfdHlwZSwgcGF5bG9hZC5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICAvLyApCiAgICBjYWxsc3ViIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTUxCiAgICAvLyBwYWdlX2luZGV4ID0gc2VsZi5fc2NoZWR1bGVfcGFnZV9pbmRleChzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTkwCiAgICAvLyByZXR1cm4gZXZlbnRfaWQgLy8gVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpCiAgICBwdXNoaW50IDE2CiAgICAvCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTIKICAgIC8vIHBhZ2UgPSB0eXAuRXhlY3V0aW9uU2NoZWR1bGVQYWdlKCkKICAgIGJ5dGVjIDQ4IC8vIDB4MDAwMAogICAgYnVyeSA3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTMKICAgIC8vIGlmIHBhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlOgogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA5CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMjcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1NAogICAgLy8gcGFnZSA9IHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XS5jb3B5KCkKICAgIGRpZyA3CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidXJ5IDcKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX3BhZ2UgZW50cnkgZXhpc3RzCgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDI3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTU1CiAgICAvLyBhc3NlcnQgcGFnZS5sZW5ndGggPCBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGRpZyA1CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgMTYKICAgIDwKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2MAogICAgLy8gc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIGRpZyAzCiAgICBkdXAKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjEKICAgIC8vIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICBkaWcgMQogICAgZXh0cmFjdCAxNyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjIKICAgIC8vIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZGlnIDIKICAgIGV4dHJhY3QgMjUgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTYzCiAgICAvLyBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDMKICAgIGV4dHJhY3QgNDEgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTY0CiAgICAvLyBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIGRpZyA0CiAgICBleHRyYWN0IDQ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2NQogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIHVuY292ZXIgNQogICAgZXh0cmFjdCA1NyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTctOTY3CiAgICAvLyB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1wYXlsb2FkLmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9cGF5bG9hZC5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPXBheWxvYWQucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXBheWxvYWQubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICkKICAgIGRpZyAxMQogICAgaXRvYgogICAgZGlnIDE4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMwogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTYtOTY4CiAgICAvLyBwYWdlLmFwcGVuZCgKICAgIC8vICAgICB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9cGF5bG9hZC5ldmVudF9pZCwKICAgIC8vICAgICAgICAgZXZlbnRfdHlwZT1wYXlsb2FkLmV2ZW50X3R5cGUsCiAgICAvLyAgICAgICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIC8vICAgICAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICAgICApCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjkKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHBhZ2UuY29weSgpCiAgICBkaWcgOAogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk3MAogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjEyCiAgICAvLyBhc3NlcnQgZXZlbnRfaWQgPT0gc2VsZi5ldmVudF9jdXJzb3IsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBjdXJzb3IKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMTMKICAgIC8vIGVudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KGV2ZW50X2lkKQogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIxNQogICAgLy8gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgYnVyeSAxMAogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjQKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY1CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzYzLTM3MAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9SUiksCiAgICBwdXNoaW50IDEyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY3CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICBwdXNoaW50IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY4CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgcHVzaGludCAxOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzYzLTM3MAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBieiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX2ZhbHNlQDE2CgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX3RydWVAMTU6CiAgICBpbnRjXzEgLy8gMQoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9tZXJnZUAxNzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMTQtMTIxNgogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2lzX25vbl9jYXNoKAogICAgLy8gICAgIGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIC8vICksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IHR5cGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMTcKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlICE9IGFyYzQuVUludDgoZW51bXMuRVZUX0lFRCksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGRpZyA4CiAgICBwdXNoYnl0ZXMgMHgwMQogICAgYiE9CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCB0eXBlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNzQKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluIChVSW50NjQoZW51bXMuRVZUX1JSKSwgVUludDY0KGVudW1zLkVWVF9SUkYpKQogICAgZGlnIDQKICAgIHB1c2hpbnQgMTIKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDIxCiAgICBkaWcgNAogICAgcHVzaGludCAxMQogICAgPT0KICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfZmFsc2VAMjIKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAyMToKICAgIGludGNfMSAvLyAxCgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX21lcmdlQDIzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIxOAogICAgLy8gaWYgc2VsZi5fZXZlbnRfaXNfcmF0ZV9yZXNldChlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpKToKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Vsc2VfYm9keUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODIKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLm9ic2VydmVyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjUgLy8gMHg1MjNhNGQ0ZjQzMjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMjIKICAgIC8vIHNlbGYuX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5KGVudHJ5LCBwYXlsb2FkKQogICAgZGlnIDYKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeQogICAgcG9wbiAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjIzCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfZWxzZV9ib2R5QDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjIxCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIGIgYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYWZ0ZXJfaWZfZWxzZUA2CgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX2ZhbHNlQDIyOgogICAgaW50Y18wIC8vIDAKICAgIGIgYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9tZXJnZUAyMwoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9mYWxzZUAxNjoKICAgIGludGNfMCAvLyAwCiAgICBiIGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfbWVyZ2VAMTcKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5hcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50OgogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGxlbgogICAgcHVzaGludCA2NQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5PYnNlcnZlZENhc2hFdmVudFJlcXVlc3QKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjU0CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyNTUKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjU2CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIzMwogICAgLy8gcmV0dXJuIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQ0xNKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICBwdXNoaW50IDUKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5ODEKICAgIC8vIGFzc2VydCBzZWxmLl9zdXBwb3J0c19vYnNlcnZlZF9ldmVudHMoKSwgZXJyLk9CU0VSVkVEX0VWRU5UX1JFUVVJUkVECiAgICBhc3NlcnQgLy8gT2JzZXJ2ZWQgZXZlbnQgcmVxdWlyZWQgdG8gZXhlY3V0ZSB0aGlzIGFjdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTgyCiAgICAvLyBhc3NlcnQgcGF5bG9hZC5ldmVudF9pZCA9PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LCBlcnIuSU5WQUxJRF9FVkVOVF9JRAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgc3dhcAogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBpZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTgzCiAgICAvLyBhc3NlcnQgcGF5bG9hZC5ldmVudF90eXBlID09IGFyYzQuVUludDgoZW51bXMuRVZUX1BSKSwgZXJyLklOVkFMSURfRVZFTlRfVFlQRQogICAgZGlnIDEKICAgIGV4dHJhY3QgOCAxCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIHB1c2hieXRlcyAweDAzCiAgICBiPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IHR5cGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4NAogICAgLy8gYXNzZXJ0IHBheWxvYWQuZmxhZ3MgJiBVSW50NjQoZW51bXMuRkxBR19DQVNIX0VWRU5UKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBzd2FwCiAgICBwdXNoaW50IDU3CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzEgLy8gMQogICAgJgogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTg2CiAgICAvLyBpZiBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50ID4gVUludDY0KDApOgogICAgYnogYXBwZW5kX29ic2VydmVkX2Nhc2hfZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5ODgKICAgIC8vIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgLSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5ODctOTg5CiAgICAvLyBwcmV2aW91c19lbnRyeSA9IHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeSgKICAgIC8vICAgICBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IC0gVUludDY0KDEpCiAgICAvLyApCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5MQogICAgLy8gcHJldmlvdXNfZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gcGF5bG9hZC5zY2hlZHVsZWRfdGltZQogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDQKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIDw9CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OTAtOTkyCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHByZXZpb3VzX2VudHJ5LnNjaGVkdWxlZF90aW1lIDw9IHBheWxvYWQuc2NoZWR1bGVkX3RpbWUKICAgIC8vICksIGVyci5JTlZBTElEX1NPUlRJTkcKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBtdXN0IGJlIHNvcnRlZCBpbiBzdHJpY3RseSBhc2NlbmRpbmcgb3JkZXIKCmFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5NAogICAgLy8gcGFnZV9pbmRleCA9IHNlbGYuX3NjaGVkdWxlX3BhZ2VfaW5kZXgoc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE5MAogICAgLy8gcmV0dXJuIGV2ZW50X2lkIC8vIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKQogICAgcHVzaGludCAxNgogICAgLwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTk1CiAgICAvLyBwYWdlID0gdHlwLkV4ZWN1dGlvblNjaGVkdWxlUGFnZSgpCiAgICBieXRlYyA0OCAvLyAweDAwMDAKICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTk2CiAgICAvLyBpZiBwYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZToKICAgIGl0b2IKICAgIGJ5dGVjIDI0IC8vIDB4NTMyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgNwogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBhcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5NwogICAgLy8gcGFnZSA9IHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XS5jb3B5KCkKICAgIGRpZyA1CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidXJ5IDYKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX3BhZ2UgZW50cnkgZXhpc3RzCgphcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OTgKICAgIC8vIGFzc2VydCBwYWdlLmxlbmd0aCA8IFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZGlnIDQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgcHVzaGludCAxNgogICAgPAogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAwMwogICAgLy8gc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIGRpZyA1CiAgICBkdXAKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDA0CiAgICAvLyBhY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLmFjY3J1YWxfZmFjdG9yLAogICAgZGlnIDEKICAgIGV4dHJhY3QgMTcgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAwNQogICAgLy8gcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICBkaWcgMgogICAgZXh0cmFjdCAyNSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDA2CiAgICAvLyBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDMKICAgIGV4dHJhY3QgMzMgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAwNwogICAgLy8gbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1wYXlsb2FkLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICBkaWcgNAogICAgZXh0cmFjdCA0MSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDA4CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1wYXlsb2FkLm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgdW5jb3ZlciA1CiAgICBleHRyYWN0IDQ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMDAtMTAxMAogICAgLy8gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkoCiAgICAvLyAgICAgZXZlbnRfaWQ9cGF5bG9hZC5ldmVudF9pZCwKICAgIC8vICAgICBldmVudF90eXBlPXBheWxvYWQuZXZlbnRfdHlwZSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1wYXlsb2FkLnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9cGF5bG9hZC5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIC8vICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1wYXlsb2FkLm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGZsYWdzPXBheWxvYWQuZmxhZ3MsCiAgICAvLyApCiAgICBkaWcgMTAKICAgIGl0b2IKICAgIGRpZyAxMAogICAgY29uY2F0CiAgICB1bmNvdmVyIDYKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTk5LTEwMTEKICAgIC8vIHBhZ2UuYXBwZW5kKAogICAgLy8gICAgIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgICAgICBldmVudF9pZD1wYXlsb2FkLmV2ZW50X2lkLAogICAgLy8gICAgICAgICBldmVudF90eXBlPXBheWxvYWQuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICAgICAgYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPXBheWxvYWQubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1wYXlsb2FkLm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgICAgICBmbGFncz1wYXlsb2FkLmZsYWdzLAogICAgLy8gICAgICkKICAgIC8vICkKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMTIKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHBhZ2UuY29weSgpCiAgICBkaWcgNgogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMTMKICAgIC8vIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgKz0gVUludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI2MAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9nZXRfc3RhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9nZXRfc3RhdGU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGR1cAogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjc1CiAgICAvLyBjb250cmFjdF90eXBlPWFyYzQuVUludDgoc2VsZi5jb250cmFjdF90eXBlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgaXRvYgogICAgZHVwCiAgICBiaXRsZW4KICAgIGludGNfMiAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBleHRyYWN0IDcgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI3NwogICAgLy8gdG90YWxfdW5pdHM9c2VsZi50b3RhbF91bml0cywKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjc4CiAgICAvLyByZXNlcnZlZF91bml0c190b3RhbD1zZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyNzkKICAgIC8vIGluaXRpYWxfZXhjaGFuZ2VfYW1vdW50PXNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI4MAogICAgLy8gZXZlbnRfY3Vyc29yPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjgxCiAgICAvLyBzY2hlZHVsZV9lbnRyeV9jb3VudD1zZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI4MgogICAgLy8gb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjgzCiAgICAvLyBpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlPXNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjg0CiAgICAvLyBub21pbmFsX2ludGVyZXN0X3JhdGU9c2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyODUKICAgIC8vIGFjY3J1ZWRfaW50ZXJlc3Q9c2VsZi5hY2NydWVkX2ludGVyZXN0LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyODYKICAgIC8vIGN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXg9c2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjg3CiAgICAvLyBjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleD1zZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyODgKICAgIC8vIHJlc2VydmVkX2ludGVyZXN0PXNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX2ludGVyZXN0IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI4OQogICAgLy8gcmVzZXJ2ZWRfcHJpbmNpcGFsPXNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI3NC0xMjkwCiAgICAvLyByZXR1cm4gdHlwLktlcm5lbFN0YXRlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGU9YXJjNC5VSW50OChzZWxmLmNvbnRyYWN0X3R5cGUpLAogICAgLy8gICAgIHN0YXR1cz1zZWxmLnN0YXR1cywKICAgIC8vICAgICB0b3RhbF91bml0cz1zZWxmLnRvdGFsX3VuaXRzLAogICAgLy8gICAgIHJlc2VydmVkX3VuaXRzX3RvdGFsPXNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwsCiAgICAvLyAgICAgaW5pdGlhbF9leGNoYW5nZV9hbW91bnQ9c2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCwKICAgIC8vICAgICBldmVudF9jdXJzb3I9c2VsZi5ldmVudF9jdXJzb3IsCiAgICAvLyAgICAgc2NoZWR1bGVfZW50cnlfY291bnQ9c2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwKICAgIC8vICAgICBvdXRzdGFuZGluZ19wcmluY2lwYWw9c2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZT1zZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICAvLyAgICAgbm9taW5hbF9pbnRlcmVzdF9yYXRlPXNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIGFjY3J1ZWRfaW50ZXJlc3Q9c2VsZi5hY2NydWVkX2ludGVyZXN0LAogICAgLy8gICAgIGN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXg9c2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4LAogICAgLy8gICAgIGN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4PXNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgsCiAgICAvLyAgICAgcmVzZXJ2ZWRfaW50ZXJlc3Q9c2VsZi5yZXNlcnZlZF9pbnRlcmVzdCwKICAgIC8vICAgICByZXNlcnZlZF9wcmluY2lwYWw9c2VsZi5yZXNlcnZlZF9wcmluY2lwYWwsCiAgICAvLyApCiAgICB1bmNvdmVyIDE0CiAgICBpdG9iCiAgICB1bmNvdmVyIDE0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMgogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDExCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA5CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgOAogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDcKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyNjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzA0CiAgICAvLyBpZiBzZWxmLmV2ZW50X2N1cnNvciA+PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICA+PQogICAgYnogY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMwNgogICAgLy8gZXZlbnRfaWQ9c2VsZi5ldmVudF9jdXJzb3IsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMDUtMTMxNQogICAgLy8gcmV0dXJuIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgIGV2ZW50X2lkPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgLy8gICAgIGV2ZW50X3R5cGU9YXJjNC5VSW50OCgwKSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1VSW50NjQoMCksCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1VSW50NjQoMCksCiAgICAvLyAgICAgZmxhZ3M9VUludDY0KDApLAogICAgLy8gKQogICAgaXRvYgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMwNwogICAgLy8gZXZlbnRfdHlwZT1hcmM0LlVJbnQ4KDApLAogICAgYnl0ZWMgNDEgLy8gMHgwMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMwNS0xMzE1CiAgICAvLyByZXR1cm4gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkoCiAgICAvLyAgICAgZXZlbnRfaWQ9c2VsZi5ldmVudF9jdXJzb3IsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1hcmM0LlVJbnQ4KDApLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPVVJbnQ2NCgwKSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249VUludDY0KDApLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPVVJbnQ2NCgwKSwKICAgIC8vICAgICBmbGFncz1VSW50NjQoMCksCiAgICAvLyApCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMDgKICAgIC8vIHNjaGVkdWxlZF90aW1lPVVJbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzA1LTEzMTUKICAgIC8vIHJldHVybiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1zZWxmLmV2ZW50X2N1cnNvciwKICAgIC8vICAgICBldmVudF90eXBlPWFyYzQuVUludDgoMCksCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9VUludDY0KDApLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9VUludDY0KDApLAogICAgLy8gICAgIGZsYWdzPVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAoKY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50QDQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjkyCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzE2CiAgICAvLyByZXR1cm4gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KHNlbGYuZXZlbnRfY3Vyc29yKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyOTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiBjb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnRfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnRANAoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLmNvbnRyYWN0X3VwZGF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X3VwZGF0ZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNjEtMTY0CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gZ3JhbnRzIHRoZSB1cGRhdGUgcGVybWlzc2lvbnMgdG8gdGhlIEFycmFuZ2VyLgogICAgLy8gIyDimqDvuI8gV0FSTklORzogQXBwbGljYXRpb24gdXBkYXRlcyBtdXN0IGJlIGV4ZWN1dGVkIFZFUlkgY2FyZWZ1bGx5LCBhcyB0aGV5CiAgICAvLyAjIG1pZ2h0IGludHJvZHVjZSBicmVha2luZyBjaGFuZ2VzLgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTUwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19yb3RhdGVfYXJyYW5nZXJbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3JvdGF0ZV9hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTgwCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODEKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSBuZXdfYXJyYW5nZXIKICAgIGJ5dGVjIDE4IC8vIDB4NTIzYTQxNTI1MjIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4MgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTY2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3NldF9vcF9kYWVtb25bcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3NldF9vcF9kYWVtb246CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTg0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE5OAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTk5CiAgICAvLyBzZWxmLm9wX2RhZW1vbi52YWx1ZSA9IGFkZHJlc3MKICAgIGJ5dGVjIDI3IC8vIDB4NTIzYTRmNTA0NDIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwMAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTg0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2Fzc2lnbl9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19hc3NpZ25fcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDE2CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLlJvbGVWYWxpZGl0eQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI1CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNgogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDQKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgcHVzaGludCAyMAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA1CiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gcm9sZV9hZGRyZXNzCiAgICBieXRlYyAxOCAvLyAweDUyM2E0MTUyNTIyMwogICAgZGlnIDMKICAgIGFwcF9nbG9iYWxfcHV0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyOAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwOAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDQwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDkKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIzIC8vIDB4NTIzYTRkNGU0NzIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTAKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI3CiAgICAvLyBzZWxmLl9zZXRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIHZhbGlkaXR5KQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTMKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjIgLy8gMHg1MjNhNTA1OTQ0MjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNAogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNwogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE2CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpOgogICAgZHVwCiAgICBwdXNoaW50IDYwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTcKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyNiAvLyAweDUyM2E1NDUyNTMyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE4CiAgICAvLyBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjcKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIxCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMSAvLyAweDUyM2E0MTU1NTQyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIyCiAgICAvLyBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNwogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyNAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgODAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI1CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI1IC8vIDB4NTIzYTRkNGY0MzIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjYKICAgIC8vIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfcmV2b2tlX3JvbGVbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3Jldm9rZV9yb2xlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0OQogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjUwCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1MQogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjkKICAgIC8vIGFzc2VydCByb2xlX2lkICE9IFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwgZXJyLklOVkFMSURfUk9MRQogICAgZHVwCiAgICBwdXNoaW50IDIwCiAgICAhPQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMwCiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICBwdXNoaW50IDQwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzEKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjMgLy8gMHg1MjNhNGQ0ZTQ3MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMgogICAgLy8gZGVsIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTMKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzQKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzUKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMiAvLyAweDUyM2E1MDU5NDQyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM2CiAgICAvLyBkZWwgc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTIKICAgIC8vIHNlbGYuX2RlbGV0ZV9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcykKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM4CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpOgogICAgZHVwCiAgICBwdXNoaW50IDYwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzkKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI2IC8vIDB4NTIzYTU0NTI1MzIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDAKICAgIC8vIGRlbCBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjUyCiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDMKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hdXRob3JpdHksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjEgLy8gMHg1MjNhNDE1NTU0MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NAogICAgLy8gZGVsIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1MgogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDYKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDgwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI1IC8vIDB4NTIzYTRkNGY0MzIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDgKICAgIC8vIGRlbCBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19jb250cmFjdF9zdXNwZW5zaW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19jb250cmFjdF9zdXNwZW5zaW9uOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojc5CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyMSAvLyAweDUyM2E0MTU1NTQyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3MQogICAgLy8gc2VsZi5jb250cmFjdF9zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGJ5dGVjIDMzIC8vICJjb250cmFjdF9zdXNwZW5kZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3MgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2NvbnRyYWN0X2RlZmF1bHRbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2NvbnRyYWN0X2RlZmF1bHQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjc0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzYKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnRydXN0ZWUsIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyNiAvLyAweDUyM2E1NDUyNTMyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4NwogICAgLy8gc2VsZi5kZWZhdWx0ZWQgPSBkZWZhdWx0ZWQKICAgIGJ5dGVjIDM0IC8vICJkZWZhdWx0ZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4OAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjc0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9hcnJhbmdlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X2FycmFuZ2VyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwMQogICAgLy8gcmV0dXJuIHNlbGYuYXJyYW5nZXIudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOCAvLyAweDUyM2E0MTUyNTIyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYWRkcmVzc19yb2xlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzAzCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMQogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hY2NvdW50X21hbmFnZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjMgLy8gMHg1MjNhNGQ0ZTQ3MjMKICAgIGRpZyAxCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMgogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5wcmltYXJ5X2RlYWxlciwgYWRkcmVzcyksCiAgICBieXRlYyAyMiAvLyAweDUyM2E1MDU5NDQyMwogICAgZGlnIDIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzIzCiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnRydXN0ZWUsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjYgLy8gMHg1MjNhNTQ1MjUzMjMKICAgIGRpZyAzCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyNAogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIGFkZHJlc3MpLAogICAgYnl0ZWMgMjEgLy8gMHg1MjNhNDE1NTU0MjMKICAgIGRpZyA0CiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyNQogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5vYnNlcnZlciwgYWRkcmVzcyksCiAgICBieXRlYyAyNSAvLyAweDUyM2E0ZDRmNDMyMwogICAgdW5jb3ZlciA1CiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlYyA0MSAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciA2CiAgICBzZXRiaXQKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDUKICAgIHNldGJpdAogICAgcHVzaGludCAyCiAgICB1bmNvdmVyIDQKICAgIHNldGJpdAogICAgcHVzaGludCAzCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgcHVzaGludCA0CiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM0NgogICAgLy8gcm9sZSA9IHJvbGVfaWQuYXNfdWludDY0KCkKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNDcKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGUpCiAgICBkdXAKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzQ5CiAgICAvLyBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKToKICAgIHB1c2hpbnRzIDIwIDQwIDUwIDYwIDcwIDgwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzQ4LTM3OQogICAgLy8gbWF0Y2ggcm9sZToKICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKToKICAgIC8vICAgICAgICAgcmV0dXJuIHR5cC5Sb2xlVmFsaWRpdHkoCiAgICAvLyAgICAgICAgICAgICByb2xlX3ZhbGlkaXR5X3N0YXJ0PVVJbnQ2NCgwKSwgcm9sZV92YWxpZGl0eV9lbmQ9VUludDY0KDApCiAgICAvLyAgICAgICAgICkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSk6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSk6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgXzoKICAgIC8vICAgICAgICAgb3AuZXJyKGVyci5JTlZBTElEX1JPTEUpCiAgICB1bmNvdmVyIDYKICAgIG1hdGNoIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMEAyIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMUAzIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMkA0IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfM0A1IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNEA2IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mzc5CiAgICAvLyBvcC5lcnIoZXJyLklOVkFMSURfUk9MRSkKICAgIGVyciAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV81QDc6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mzc1CiAgICAvLyBzZWxmLm9ic2VydmVyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDI1IC8vIDB4NTIzYTRkNGY0MzIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTcKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mzc0LTM3NgogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM3NwogICAgLy8gcmV0dXJuIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzRANjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNzAKICAgIC8vIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDIxIC8vIDB4NTIzYTQxNTU1NDIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTcKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzY5LTM3MQogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNzIKICAgIC8vIHJldHVybiBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzNANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNjUKICAgIC8vIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAyNiAvLyAweDUyM2E1NDUyNTMyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU3CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM2NC0zNjYKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM2NwogICAgLy8gcmV0dXJuIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzJANDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNjAKICAgIC8vIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMjIgLy8gMHg1MjNhNTA1OTQ0MjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NwogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTktMzYxCiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzYyCiAgICAvLyByZXR1cm4gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzFAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTUKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDIzIC8vIDB4NTIzYTRkNGU0NzIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTcKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzU0LTM1NgogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTcKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzBAMjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTAtMzUyCiAgICAvLyByZXR1cm4gdHlwLlJvbGVWYWxpZGl0eSgKICAgIC8vICAgICByb2xlX3ZhbGlkaXR5X3N0YXJ0PVVJbnQ2NCgwKSwgcm9sZV92YWxpZGl0eV9lbmQ9VUludDY0KDApCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB2b2lkOgpfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZDoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNgogICAgLy8gZGVmIF9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHNlbGYsIGhvbGRpbmdfYWRkcmVzczogQWNjb3VudCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI4CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZCwgZXJyLlNVU1BFTkRFRAogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCAzODQKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIFN1c3BlbmRlZCBvcGVyYXRpb25zCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5fc2V0dGxlX3Bvc2l0aW9uKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NCwgdWludDY0Ogpfc2V0dGxlX3Bvc2l0aW9uOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjQ0CiAgICAvLyBkZWYgX3NldHRsZV9wb3NpdGlvbihzZWxmLCBob2xkaW5nX2FkZHJlc3M6IEFjY291bnQpIC0+IHR1cGxlW1VJbnQ2NCwgVUludDY0XToKICAgIHByb3RvIDEgMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjYxCiAgICAvLyBwb3NpdGlvbiA9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNvcHkoKQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo2My02NQogICAgLy8gIyBDb21wdXRlIHRoZSBpbmNyZW1lbnRhbCBwZXItdW5pdCBmaXhlZC1wb2ludCBpbnRlcmVzdCBhbmQgcHJpbmNpcGFsIGFjY3J1ZWQKICAgIC8vICMgc2luY2UgdGhpcyBhY2NvdW50J3MgbGFzdCBjaGVja3BvaW50LgogICAgLy8gaW50ZXJlc3RfZGVsdGEgPSBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggLSBwb3NpdGlvbi5pbnRlcmVzdF9jaGVja3BvaW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCBleGlzdHMKICAgIGRpZyAxCiAgICBwdXNoaW50IDU3CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjY3CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IC0gcG9zaXRpb24ucHJpbmNpcGFsX2NoZWNrcG9pbnQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggZXhpc3RzCiAgICBkaWcgMgogICAgcHVzaGludCA2NQogICAgZXh0cmFjdF91aW50NjQKICAgIC0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3MwogICAgLy8gaW50ZXJlc3RfZGVsdGEsIHBvc2l0aW9uLnVuaXRzLCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICBkaWcgMgogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjcwLTc0CiAgICAvLyAjIENvbnZlcnQgdGhlIHBlci11bml0IGZpeGVkLXBvaW50IGRlbHRhcyBpbnRvIGFic29sdXRlIGNsYWltYWJsZSBhbW91bnRzCiAgICAvLyAjIHVzaW5nIHRoZSBhY2NvdW50J3MgYWN0aXZlIHVuaXRzLgogICAgLy8gY2xhaW1hYmxlX2ludGVyZXN0ID0gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgaW50ZXJlc3RfZGVsdGEsIHBvc2l0aW9uLnVuaXRzLCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICAvLyApCiAgICB1bmNvdmVyIDMKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzYKICAgIC8vIHByaW5jaXBhbF9kZWx0YSwgcG9zaXRpb24udW5pdHMsIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3NS03NwogICAgLy8gY2xhaW1hYmxlX3ByaW5jaXBhbCA9IHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIHByaW5jaXBhbF9kZWx0YSwgcG9zaXRpb24udW5pdHMsIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUKICAgIC8vICkKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzktODEKICAgIC8vICMgQWNjcnVlIHRoZSBjbGFpbWFibGUgYW1vdW50cyB0byB0aGUgYWNjb3VudCBwb3NpdGlvbiBhbmQgbWFrZSB0aGVtIGF2YWlsYWJsZQogICAgLy8gIyBmb3Igd2l0aGRyYXdhbC4KICAgIC8vIHBvc2l0aW9uLmNsYWltYWJsZV9pbnRlcmVzdCArPSBjbGFpbWFibGVfaW50ZXJlc3QKICAgIGRpZyAyCiAgICBwdXNoaW50IDczCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDIKICAgICsKICAgIGl0b2IKICAgIHVuY292ZXIgMwogICAgc3dhcAogICAgcmVwbGFjZTIgNzMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo4MgogICAgLy8gcG9zaXRpb24uY2xhaW1hYmxlX3ByaW5jaXBhbCArPSBjbGFpbWFibGVfcHJpbmNpcGFsCiAgICBkdXAKICAgIHB1c2hpbnQgODEKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgKwogICAgaXRvYgogICAgcmVwbGFjZTIgODEKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo4NC04NgogICAgLy8gIyBBZHZhbmNlIHRoZSBhY2NvdW50J3MgcGVyLXVuaXQgZml4ZWQtcG9pbnQgY2hlY2twb2ludHMgdG8gdGhlIGN1cnJlbnQgZ2xvYmFsCiAgICAvLyAjIHBlci11bml0IGZpeGVkLXBvaW50IGdsb2JhbCBpbmRpY2VzLgogICAgLy8gcG9zaXRpb24uaW50ZXJlc3RfY2hlY2twb2ludCA9IHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggZXhpc3RzCiAgICBpdG9iCiAgICByZXBsYWNlMiA1NwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojg3CiAgICAvLyBwb3NpdGlvbi5wcmluY2lwYWxfY2hlY2twb2ludCA9IHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggZXhpc3RzCiAgICBpdG9iCiAgICByZXBsYWNlMiA2NQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojg5LTkwCiAgICAvLyAjIEFkdmFuY2UgdGhlIGFjY291bnQncyBldmVudCBjdXJzb3IgdG8gdGhlIGN1cnJlbnQgZ2xvYmFsIGV2ZW50IGN1cnNvci4KICAgIC8vIHBvc2l0aW9uLnNldHRsZWRfY3Vyc29yID0gc2VsZi5ldmVudF9jdXJzb3IKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaXRvYgogICAgcmVwbGFjZTIgNDkKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo5Mi05NAogICAgLy8gIyBVcGRhdGUgdGhlIGFjY291bnQgcG9zaXRpb24gYW5kIHJldHVybiB0aGUgbmV3bHkgYWNjcnVlZCBjbGFpbWFibGUgYW1vdW50cwogICAgLy8gIyBhZGRlZCB0byB0aGUgdG90YWwgcG9zaXRpb24ncyBjbGFpbWFibGUgYW1vdW50cy4KICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gcG9zaXRpb24uY29weSgpCiAgICB1bmNvdmVyIDMKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo5NQogICAgLy8gcmV0dXJuIGNsYWltYWJsZV9pbnRlcmVzdCwgY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQoaG9sZGluZ19hZGRyZXNzOiBieXRlcykgLT4gdm9pZDoKX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQ6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6OTcKICAgIC8vIGRlZiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZChzZWxmLCBob2xkaW5nX2FkZHJlc3M6IEFjY291bnQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTAwCiAgICAvLyBpZiBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKToKICAgIGJ6IF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwMQogICAgLy8gcmV0dXJuCiAgICByZXRzdWIKCl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDMKICAgIC8vIHBvc2l0aW9uID0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY29weSgpCiAgICBmcmFtZV9kaWcgMgogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA0CiAgICAvLyBpZiBwb3NpdGlvbi5yZXNlcnZlZF91bml0cyA9PSBVSW50NjQoMCk6CiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIGJueiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZF9hZnRlcl9pZl9lbHNlQDQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDUKICAgIC8vIHJldHVybgogICAgcmV0c3ViCgpfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZF9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA4CiAgICAvLyBwb3NpdGlvbi51bml0cyArPSBhY3RpdmF0ZWRfdW5pdHMKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDMKICAgICsKICAgIGl0b2IKICAgIHJlcGxhY2UyIDMyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA5CiAgICAvLyBwb3NpdGlvbi5yZXNlcnZlZF91bml0cyA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGl0b2IKICAgIHJlcGxhY2UyIDQwCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTEwCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHBvc2l0aW9uLmNvcHkoKQogICAgZnJhbWVfZGlnIDIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTEKICAgIC8vIGFzc2VydCBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID49IGFjdGl2YXRlZF91bml0cywgZXJyLk9WRVJfRElTVFJJQlVUSU9OCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIGV4aXN0cwogICAgZHVwCiAgICBkaWcgMgogICAgPj0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgcmVtYWluaW5nIEQtQVNBIHVuaXRzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTEyCiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIC09IGFjdGl2YXRlZF91bml0cwogICAgc3dhcAogICAgLQogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9zY2FsZWRfbXVsX2RpdihtdWx0aXBsaWNhbmQ6IHVpbnQ2NCwgbXVsdGlwbGllcjogdWludDY0LCBkaXZpc29yOiB1aW50NjQpIC0+IHVpbnQ2NDoKX3NjYWxlZF9tdWxfZGl2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTUzLTE1NQogICAgLy8gZGVmIF9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLCBtdWx0aXBsaWNhbmQ6IFVJbnQ2NCwgbXVsdGlwbGllcjogVUludDY0LCBkaXZpc29yOiBVSW50NjQKICAgIC8vICkgLT4gVUludDY0OgogICAgcHJvdG8gMyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTcKICAgIC8vIGlmIG11bHRpcGxpY2FuZCA9PSBVSW50NjQoMCkgb3IgbXVsdGlwbGllciA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTMKICAgIGJ6IF9zY2FsZWRfbXVsX2Rpdl9pZl9ib2R5QDIKICAgIGZyYW1lX2RpZyAtMgogICAgYm56IF9zY2FsZWRfbXVsX2Rpdl9hZnRlcl9pZl9lbHNlQDMKCl9zY2FsZWRfbXVsX2Rpdl9pZl9ib2R5QDI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTgKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9zY2FsZWRfbXVsX2Rpdl9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTkKICAgIC8vIGhpZ2gsIGxvdyA9IG9wLm11bHcobXVsdGlwbGljYW5kLCBtdWx0aXBsaWVyKQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIG11bHcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2MAogICAgLy8gcmV0dXJuIG9wLmRpdncoaGlnaCwgbG93LCBkaXZpc29yKQogICAgZnJhbWVfZGlnIC0xCiAgICBkaXZ3CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYW1vdW50X3RvX2luZGV4X2RlbHRhKGFtb3VudDogdWludDY0KSAtPiB1aW50NjQ6Cl9hbW91bnRfdG9faW5kZXhfZGVsdGE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjIKICAgIC8vIGRlZiBfYW1vdW50X3RvX2luZGV4X2RlbHRhKHNlbGYsIGFtb3VudDogVUludDY0KSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2NAogICAgLy8gaWYgYW1vdW50ID09IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMQogICAgYm56IF9hbW91bnRfdG9faW5kZXhfZGVsdGFfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjUKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9hbW91bnRfdG9faW5kZXhfZGVsdGFfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTY2CiAgICAvLyBhc3NlcnQgc2VsZi50b3RhbF91bml0cyA+IFVJbnQ2NCgwKSwgZXJyLk5PX1VOSVRTCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgZHVwCiAgICBhc3NlcnQgLy8gTm8gRC1BU0EgdW5pdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2NwogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KGFtb3VudCwgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwgc2VsZi50b3RhbF91bml0cykKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2luZGV4X2RlbHRhX3RvX2Ftb3VudChpbmRleF9kZWx0YTogdWludDY0KSAtPiB1aW50NjQ6Cl9pbmRleF9kZWx0YV90b19hbW91bnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjkKICAgIC8vIGRlZiBfaW5kZXhfZGVsdGFfdG9fYW1vdW50KHNlbGYsIGluZGV4X2RlbHRhOiBVSW50NjQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTc2CiAgICAvLyBpZiBpbmRleF9kZWx0YSA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGJueiBfaW5kZXhfZGVsdGFfdG9fYW1vdW50X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTc3CiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfaW5kZXhfZGVsdGFfdG9fYW1vdW50X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE3OQogICAgLy8gc2VsZi50b3RhbF91bml0cywKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxODEKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNzgtMTgyCiAgICAvLyByZXR1cm4gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgc2VsZi50b3RhbF91bml0cywKICAgIC8vICAgICBpbmRleF9kZWx0YSwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2dldF9zY2hlZHVsZV9lbnRyeShldmVudF9pZDogdWludDY0KSAtPiBieXRlczoKX2dldF9zY2hlZHVsZV9lbnRyeToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIwMgogICAgLy8gZGVmIF9nZXRfc2NoZWR1bGVfZW50cnkoc2VsZiwgZXZlbnRfaWQ6IFVJbnQ2NCkgLT4gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnk6CiAgICBwcm90byAxIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIwNAogICAgLy8gYXNzZXJ0IGV2ZW50X2lkIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgPgogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgaWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE5MAogICAgLy8gcmV0dXJuIGV2ZW50X2lkIC8vIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDE2CiAgICAvCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMDYKICAgIC8vIGFzc2VydCBwYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxOTQKICAgIC8vIHJldHVybiBldmVudF9pZCAlIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDE2CiAgICAlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMDkKICAgIC8vIGFzc2VydCBvZmZzZXQgPCBwYWdlLmxlbmd0aCwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBwdXNoaW50IDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgMQogICAgPgogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjEwCiAgICAvLyByZXR1cm4gcGFnZVtvZmZzZXRdLmNvcHkoKQogICAgcHVzaGludCA2NQogICAgKgogICAgcHVzaGludCAyCiAgICArCiAgICBwdXNoaW50IDY1CiAgICBib3hfZXh0cmFjdAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKGNvbnRyYWN0X3R5cGU6IHVpbnQ2NCwgZXZlbnRfdHlwZTogdWludDY0KSAtPiB2b2lkOgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTMtMzE1CiAgICAvLyBkZWYgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIHNlbGYsIGNvbnRyYWN0X3R5cGU6IFVJbnQ2NCwgZXZlbnRfdHlwZTogVUludDY0CiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNDcKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNDgKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgaW50Y18yIC8vIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI0OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9NRCksCiAgICBwdXNoaW50IDE5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTAKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgcHVzaGludCAxMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU0LTI1NQogICAgLy8gIyBDaGVjayBjb21tb24gZXZlbnRzIGZpcnN0CiAgICAvLyBpZiBldmVudF90eXBlIGluIGNvbW1vbl9ldmVudHM6CiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjUxCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICBwdXNoaW50IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUA3CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU2CiAgICAvLyByZXR1cm4gVHJ1ZQogICAgaW50Y18xIC8vIDEKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICByZXRzdWIKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTgtMjU5CiAgICAvLyAjIENvbnRyYWN0LXNwZWNpZmljIGFkZGl0aW9uYWwgZXZlbnRzCiAgICAvLyBpZiBjb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9QQU0pOgogICAgZnJhbWVfZGlnIC0yCiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjYwLTI2MQogICAgLy8gIyBQQU0gb25seSBzdXBwb3J0cyBjb21tb24gZXZlbnRzCiAgICAvLyByZXR1cm4gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNjMKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0xBTSkgb3IgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2My0yNjUKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0xBTSkgb3IgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoCiAgICAvLyAgICAgZW51bXMuQ1RfTkFNCiAgICAvLyApOgogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDExCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMgogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDE2CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUAxMToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2Ni0yNzAKICAgIC8vICMgTEFNL05BTSBhZGQ6IFBSLCBJUENCCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjY4CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjY2LTI3MAogICAgLy8gIyBMQU0vTkFNIGFkZDogUFIsIElQQ0IKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDEzCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIHB1c2hpbnQgMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2Ni0yNzAKICAgIC8vICMgTEFNL05BTSBhZGQ6IFBSLCBJUENCCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICkKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF9mYWxzZUAxNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAxMzoKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDE0OgogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMTY6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzIKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTik6CiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMjMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3My0yNzgKICAgIC8vICMgQU5OIGFkZHM6IFBSLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjc1CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjczLTI3OAogICAgLy8gIyBBTk4gYWRkczogUFIsIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDIwCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIHB1c2hpbnQgMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3My0yNzgKICAgIC8vICMgQU5OIGFkZHM6IFBSLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyMAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzcKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIHB1c2hpbnQgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjczLTI3OAogICAgLy8gIyBBTk4gYWRkczogUFIsIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDIxCgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDIwOgogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMjE6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAyMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MAogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfTEFYKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA0CiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMzEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MS0yODcKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MwogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUiksCiAgICBwdXNoaW50IDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MS0yODcKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjgKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjg0CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjgxLTI4NwogICAgLy8gIyBMQVggYWRkczogUFIsIFBJLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyOAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODUKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICBwdXNoaW50IDE4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODEtMjg3CiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDI4CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODEtMjg3CiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDI5CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDI4OgogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMjk6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAzMToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4OQogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQ0xNKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA1CiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMzMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI5MC0yOTEKICAgIC8vICMgQ0xNIGFkZHM6IFBSCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1BSKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDMKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDMzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjkzCiAgICAvLyByZXR1cm4gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5faXNfZHluYW1pY19hbm51aXR5KCkgLT4gdWludDY0OgpfaXNfZHluYW1pY19hbm51aXR5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM1CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzUtMzM2CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIC8vIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGJ6IF9pc19keW5hbWljX2FubnVpdHlfYm9vbF9mYWxzZUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzYKICAgIC8vIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzNSAvLyAiZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM1LTMzNgogICAgLy8gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICAvLyBhbmQgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBieiBfaXNfZHluYW1pY19hbm51aXR5X2Jvb2xfZmFsc2VAMwogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMzNC0zMzcKICAgIC8vIHJldHVybiAoCiAgICAvLyAgICAgc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICAvLyAgICAgYW5kIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgLy8gKQogICAgcmV0c3ViCgpfaXNfZHluYW1pY19hbm51aXR5X2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzQtMzM3CiAgICAvLyByZXR1cm4gKAogICAgLy8gICAgIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKQogICAgLy8gICAgIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIC8vICkKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KGVudHJ5OiBieXRlcykgLT4gdWludDY0LCBieXRlczoKX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozODAKICAgIC8vIGRlZiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudChzZWxmLCBlbnRyeTogdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5CiAgICAvLyBlbnRyeS5hY2NydWFsX2ZhY3RvciA9PSBVSW50NjQoMCkKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAxNwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5LTM5MQogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGJ6IF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2lmX2JvZHlAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzkwCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5LTM5MQogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGJ6IF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2lmX2JvZHlAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzkxCiAgICAvLyBvciBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPT0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5LTM5MQogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGJueiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudF9hZnRlcl9pZl9lbHNlQDQKCl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2lmX2JvZHlAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5MwogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2RpZyAtMQogICAgdW5jb3ZlciAyCiAgICByZXRzdWIKCl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NQogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NgogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NC0zOTgKICAgIC8vIGFjY3J1ZWQgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICAvLyAgICAgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICkKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MDIKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozOTktNDAzCiAgICAvLyByZXR1cm4gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgYWNjcnVlZCwKICAgIC8vICAgICBlbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICBmcmFtZV9kaWcgLTEKICAgIHVuY292ZXIgMgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yKGRpc2NvdW50X2ZhY3RvcjogdWludDY0LCByZWRlbXB0aW9uX2ZhY3RvcjogdWludDY0KSAtPiB1aW50NjQ6Cl9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ2Mi00NjYKICAgIC8vIGRlZiBfZGlzY291bnRfYW5udWl0eV9mYWN0b3IoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBkaXNjb3VudF9mYWN0b3I6IFVJbnQ2NCwKICAgIC8vICAgICByZWRlbXB0aW9uX2ZhY3RvcjogVUludDY0LAogICAgLy8gKSAtPiBVSW50NjQ6CiAgICBwcm90byAyIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ2OAogICAgLy8gaWYgcmVkZW1wdGlvbl9mYWN0b3IgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0xCiAgICBibnogX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDY5CiAgICAvLyByZXR1cm4gZGlzY291bnRfZmFjdG9yCiAgICBmcmFtZV9kaWcgLTIKICAgIHJldHN1YgoKX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3MAogICAgLy8gcGVyaW9kX3JhdGUgPSBzZWxmLmZpeGVkX3BvaW50X3NjYWxlICsgc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzEKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzAtNDc0CiAgICAvLyBwZXJpb2RfcmF0ZSA9IHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgKyBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICByZWRlbXB0aW9uX2ZhY3RvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICBkaWcgMgogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgICsKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3NQogICAgLy8gYXNzZXJ0IHBlcmlvZF9yYXRlID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGR1cAogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDc4CiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDc2LTQ4MAogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIGRpc2NvdW50X2ZhY3RvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gICAgIHBlcmlvZF9yYXRlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkoZW50cnk6IGJ5dGVzLCBwYXlsb2FkOiBieXRlcykgLT4gYnl0ZXMsIGJ5dGVzOgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MTMtNjE1CiAgICAvLyBkZWYgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5KAogICAgLy8gICAgIHNlbGYsIGVudHJ5OiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSwgcGF5bG9hZDogdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0CiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAyIDIKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjIzCiAgICAvLyBhc3NlcnQgZW50cnkuZXZlbnRfaWQgPT0gc2VsZi5ldmVudF9jdXJzb3IsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGN1cnNvcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjI0CiAgICAvLyBhc3NlcnQgZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsIGVyci5OT19EVUVfQ0FTSEZMT1cKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPD0KICAgIGFzc2VydCAvLyBObyBkdWUgY2FzaGZsb3cgdG8gcGF5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MjYKICAgIC8vIGV2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYyNwogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX0lFRCk6CiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGR1cAogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYyOC02MzAKICAgIC8vICMgSUVEIGZpbmFsaXplcyBpc3N1YW5jZTogcmVzZXJ2ZWQgdW5pdHMgYmVjb21lIGFjdGl2YXRhYmxlIGFuZCB0aGUKICAgIC8vICMgc2NoZWR1bGUncyBpbml0aWFsIGNvbnRyYWN0dWFsIHN0YXRlIGJlY29tZXMgbGl2ZS4KICAgIC8vIGFzc2VydCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzIKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPT0gc2VsZi50b3RhbF91bml0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjMxLTYzMwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID09IHNlbGYudG90YWxfdW5pdHMKICAgIC8vICksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9JTkNPTVBMRVRFCiAgICBhc3NlcnQgLy8gUHJpbWFyeSBkaXN0cmlidXRpb24gaXMgbm90IGNvbXBsZXRlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzQKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM1CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzYKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAzMwogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzcKICAgIC8vIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM4CiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzkKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0MAogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX0FDVElWRSkKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgMTAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDUxCiAgICAvLyBhc3NlcnQgZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSA9PSBVSW50NjQoZW51bXMuRVZUX0lFRCksIGVyci5OT1RfRVZUX0lFRAogICAgZnJhbWVfZGlnIDExCiAgICBhc3NlcnQgLy8gTm90IElFRCBldmVudAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDUyCiAgICAvLyByZXR1cm4gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0MS02NDUKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1zZWxmLl9lbnRyeV9pZWRfYW1vdW50KGVudHJ5KSwKICAgIC8vICAgICBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0NAogICAgLy8gc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0MS02NDUKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1zZWxmLl9lbnRyeV9pZWRfYW1vdW50KGVudHJ5KSwKICAgIC8vICAgICBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICAvLyApCiAgICBjYWxsc3ViIF9lbWl0X2V4ZWN1dGlvbl9ldmVudAogICAgZHVwCiAgICBmcmFtZV9idXJ5IC0yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NDYKICAgIC8vIHJldHVybgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0OQogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ICs9IHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBmcmFtZV9idXJ5IC0yCiAgICArCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1MQogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1JSKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCAxMgogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMTAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1NQogICAgLy8gcGF5bG9hZC5vYnNlcnZlZF9yYXRlLAogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjU2CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzNyAvLyAicmF0ZV9yZXNldF9tdWx0aXBsaWVyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1NwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1Mi02NTgKICAgIC8vICMgUlIgZGVyaXZlcyB0aGUgbmV4dCByYXRlIGZyb20gYW4gb2JzZXJ2ZWQgb3JhY2xlIHZhbHVlIHBsdXMgdGhlCiAgICAvLyAjIGNvbnRyYWN0IHNwcmVhZCAvIG11bHRpcGxpZXIgdGVybXMsIHRoZW4gZW5mb3JjZXMgZmxvb3IgYW5kIGNhcC4KICAgIC8vIG9ic2VydmVkX3JhdGUgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBwYXlsb2FkLm9ic2VydmVkX3JhdGUsCiAgICAvLyAgICAgc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICkKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjAKICAgIC8vIG9ic2VydmVkX3JhdGUgKyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzYgLy8gInJhdGVfcmVzZXRfc3ByZWFkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkIGV4aXN0cwogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDEKICAgIC8vIGlmIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgYW5kIHJhdGUgPCBzZWxmLnJhdGVfcmVzZXRfZmxvb3I6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzkgLy8gImhhc19yYXRlX3Jlc2V0X2Zsb29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmhhc19yYXRlX3Jlc2V0X2Zsb29yIGV4aXN0cwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMSAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X2Zsb29yIGV4aXN0cwogICAgZnJhbWVfZGlnIDYKICAgID4KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDIKICAgIC8vIHJhdGUgPSBzZWxmLnJhdGVfcmVzZXRfZmxvb3IKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMSAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDYKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfZmxvb3IgZXhpc3RzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1NToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc0MwogICAgLy8gaWYgc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgYW5kIHJhdGUgPiBzZWxmLnJhdGVfcmVzZXRfY2FwOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQwIC8vICJoYXNfcmF0ZV9yZXNldF9jYXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwIGV4aXN0cwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTgKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMiAvLyAicmF0ZV9yZXNldF9jYXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9jYXAgZXhpc3RzCiAgICBmcmFtZV9kaWcgNgogICAgPAogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc0NAogICAgLy8gcmF0ZSA9IHNlbGYucmF0ZV9yZXNldF9jYXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMiAvLyAicmF0ZV9yZXNldF9jYXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSA2CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X2NhcCBleGlzdHMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjU5CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IHNlbGYuX2NsYW1wX3JhdGUoCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NTktNjYxCiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IHNlbGYuX2NsYW1wX3JhdGUoCiAgICAvLyAgICAgb2JzZXJ2ZWRfcmF0ZSArIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQKICAgIC8vICkKICAgIGZyYW1lX2RpZyA2CiAgICBhcHBfZ2xvYmFsX3B1dAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMTg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzEKICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QSSk6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMjAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY3MgogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzMKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDIzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc4CiAgICAvLyBpZiBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKToKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAyOQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc5CiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFJGKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCA1CiAgICA9PQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMzAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4MwogICAgLy8gKyAoc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCAtIHNlbGYuZXZlbnRfY3Vyc29yKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICAtCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODQKICAgIC8vICogVUludDY0KGNzdC5PUF9VUF9OT05fQ0FTSF9QRVJfRU5UUllfQlVER0VUKQogICAgcHVzaGludCAxMDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4My02ODQKICAgIC8vICsgKHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgLSBzZWxmLmV2ZW50X2N1cnNvcikKICAgIC8vICogVUludDY0KGNzdC5PUF9VUF9OT05fQ0FTSF9QRVJfRU5UUllfQlVER0VUKQogICAgKgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjgyCiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX05PTl9DQVNIX0JBU0VfQlVER0VUKQogICAgaW50YyA0IC8vIDE1MDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4Mi02ODQKICAgIC8vIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfQkFTRV9CVURHRVQpCiAgICAvLyArIChzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IC0gc2VsZi5ldmVudF9jdXJzb3IpCiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfUEVSX0VOVFJZX0JVREdFVCkKICAgICsKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4MC02ODYKICAgIC8vIGVuc3VyZV9idWRnZXQoCiAgICAvLyAgICAgcmVxdWlyZWRfYnVkZ2V0PSgKICAgIC8vICAgICAgICAgVUludDY0KGNzdC5PUF9VUF9OT05fQ0FTSF9CQVNFX0JVREdFVCkKICAgIC8vICAgICAgICAgKyAoc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCAtIHNlbGYuZXZlbnRfY3Vyc29yKQogICAgLy8gICAgICAgICAqIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfUEVSX0VOVFJZX0JVREdFVCkKICAgIC8vICAgICApLAogICAgLy8gKQogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDkwCiAgICAvLyBkaXNjb3VudF9mYWN0b3IgPSBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5MQogICAgLy8gZGVub21pbmF0b3IgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5MgogICAgLy8gc2tpcF9maXJzdF9yZWRlbXB0aW9uID0gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5NAogICAgLy8gaWYgZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAyNQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgZnJhbWVfYnVyeSA4CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAzNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDk1LTQ5OQogICAgLy8gIyBBbiBpbml0aWFsIFBSRiBtYXkgZGVzY3JpYmUgdGhlIGZpcnN0IHJlZGVtcHRpb24gcGVyaW9kIGRpcmVjdGx5LgogICAgLy8gZGlzY291bnRfZmFjdG9yID0gc2VsZi5fZGlzY291bnRfYW5udWl0eV9mYWN0b3IoCiAgICAvLyAgICAgZGlzY291bnRfZmFjdG9yLAogICAgLy8gICAgIGVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDgKICAgIGNhbGxzdWIgX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTAxCiAgICAvLyBza2lwX2ZpcnN0X3JlZGVtcHRpb24gPSBUcnVlCiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfYnVyeSA3CiAgICBmcmFtZV9idXJ5IDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDM1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTAzCiAgICAvLyBmdXR1cmVfZXZlbnRfaWQgPSBzZWxmLmV2ZW50X2N1cnNvciArIFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfd2hpbGVfdG9wQDM2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA0CiAgICAvLyB3aGlsZSBmdXR1cmVfZXZlbnRfaWQgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgZnJhbWVfZGlnIDMKICAgID4KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl93aGlsZUA0OAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA1CiAgICAvLyBmdXR1cmVfZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoZnV0dXJlX2V2ZW50X2lkKQogICAgZnJhbWVfZGlnIDMKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwNgogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPSBmdXR1cmVfZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MDctNTA4CiAgICAvLyAjIE9ubHkgcmVkZW1wdGlvbi1iZWFyaW5nIGV2ZW50cyBjb250cmlidXRlIHRvIHRoZSBhbm51aXR5IGRlbm9taW5hdG9yLgogICAgLy8gaXNfcmVkZW1wdGlvbl9ldmVudCA9IGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpIG9yICgKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwNy01MTEKICAgIC8vICMgT25seSByZWRlbXB0aW9uLWJlYXJpbmcgZXZlbnRzIGNvbnRyaWJ1dGUgdG8gdGhlIGFubnVpdHkgZGVub21pbmF0b3IuCiAgICAvLyBpc19yZWRlbXB0aW9uX2V2ZW50ID0gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QUikgb3IgKAogICAgLy8gICAgIGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfTUQpCiAgICAvLyAgICAgYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICAvLyApCiAgICBibnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfdHJ1ZUA0MAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA5CiAgICAvLyBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgZnJhbWVfZGlnIDQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MDktNTEwCiAgICAvLyBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgLy8gYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF9mYWxzZUA0MQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTEwCiAgICAvLyBhbmQgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IgPiBVSW50NjQoMCkKICAgIGZyYW1lX2RpZyAwCiAgICBwdXNoaW50IDI1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA5LTUxMAogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCkKICAgIC8vIGFuZCBmdXR1cmVfZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX3RydWVANDA6CiAgICBpbnRjXzEgLy8gMQoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfbWVyZ2VANDI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTIKICAgIC8vIGlmIGlzX3JlZGVtcHRpb25fZXZlbnQ6CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA0NwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTEzCiAgICAvLyBpZiBza2lwX2ZpcnN0X3JlZGVtcHRpb246CiAgICBmcmFtZV9kaWcgNwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUA0NQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTE0CiAgICAvLyBza2lwX2ZpcnN0X3JlZGVtcHRpb24gPSBGYWxzZQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgNwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANDc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjEKICAgIC8vIGZ1dHVyZV9ldmVudF9pZCArPSBVSW50NjQoMSkKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV93aGlsZV90b3BAMzYKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlANDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTgKICAgIC8vIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZnJhbWVfZGlnIDAKICAgIHB1c2hpbnQgMjUKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTYtNTE5CiAgICAvLyBkaXNjb3VudF9mYWN0b3IgPSBzZWxmLl9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcigKICAgIC8vICAgICBkaXNjb3VudF9mYWN0b3IsCiAgICAvLyAgICAgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMgogICAgc3dhcAogICAgY2FsbHN1YiBfZGlzY291bnRfYW5udWl0eV9mYWN0b3IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjAKICAgIC8vIGRlbm9taW5hdG9yICs9IGRpc2NvdW50X2ZhY3RvcgogICAgZnJhbWVfZGlnIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA0NwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDE6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF9tZXJnZUA0MgoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX3doaWxlQDQ4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTIzCiAgICAvLyBhc3NlcnQgZGVub21pbmF0b3IgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZnJhbWVfZGlnIDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUyNAogICAgLy8gbnVtZXJhdG9yID0gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTI1CiAgICAvLyBpZiBlbnRyeS5mbGFncyAmIFVJbnQ2NChlbnVtcy5GTEFHX0lOSVRJQUxfUFJGKSA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNTcKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gOAogICAgJgogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDUwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjYtNTI3CiAgICAvLyAjIFN1YnNlcXVlbnQgUFJGIGV2ZW50cyBhbW9ydGl6ZSBib3RoIHByaW5jaXBhbCBhbmQgYWxyZWFkeSBhY2NydWVkIGNhcnJ5LgogICAgLy8gbnVtZXJhdG9yICs9IHNlbGYuYWNjcnVlZF9pbnRlcmVzdAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgICsKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDUwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTMwCiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTI4LTUzMgogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIG51bWVyYXRvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gICAgIGRlbm9taW5hdG9yLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDEKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODcKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IHNlbGYuX3JlY2FsY3VsYXRlX2FubnVpdHlfcGF5bWVudCgKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njg3LTY4OQogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gc2VsZi5fcmVjYWxjdWxhdGVfYW5udWl0eV9wYXltZW50KAogICAgLy8gICAgIGVudHJ5CiAgICAvLyApCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMzA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OTIKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY5My02OTcKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1VSW50NjQoMCksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OTUKICAgIC8vIHBheW9mZj1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njk2CiAgICAvLyBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY5My02OTcKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1VSW50NjQoMCksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgY2FsbHN1YiBfZW1pdF9leGVjdXRpb25fZXZlbnQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDI5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjkxCiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDMwCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDIwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc0CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9JUENCKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCAxOAogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDIzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzUtNjc2CiAgICAvLyAjIElQQ0Iga2VlcHMgcHJpbmNpcGFsIHVuY2hhbmdlZCBhbmQgb25seSByZXNldHMgdGhlIGludGVyZXN0IGJhc2UuCiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIGIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMjMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMTA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjIKICAgIC8vIGVsaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1JSRik6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgMTEKICAgID09CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDE0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjMKICAgIC8vIG5leHRfcmF0ZSA9IGVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY0CiAgICAvLyBpZiBuZXh0X3JhdGUgPT0gVUludDY0KDApOgogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDEzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjUKICAgIC8vIG5leHRfcmF0ZSA9IHNlbGYucmF0ZV9yZXNldF9uZXh0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzggLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDUKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfbmV4dCBleGlzdHMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY2CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IG5leHRfcmF0ZQogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgZnJhbWVfZGlnIDUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDE0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY4CiAgICAvLyBpZiBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSAhPSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgOQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2OQogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPSBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZQogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgZnJhbWVfZGlnIDkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KGVudHJ5OiBieXRlcywgcGF5b2ZmOiB1aW50NjQsIHNldHRsZWRfYW1vdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpfZW1pdF9leGVjdXRpb25fZXZlbnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MDMtNzA5CiAgICAvLyBkZWYgX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgKiwKICAgIC8vICAgICBlbnRyeTogdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnksCiAgICAvLyAgICAgcGF5b2ZmOiBVSW50NjQsCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ6IFVJbnQ2NCwKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDMgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzEzCiAgICAvLyBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25JRAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE0CiAgICAvLyBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIGZyYW1lX2RpZyAtMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTUKICAgIC8vIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIGZyYW1lX2RpZyAtMwogICAgZXh0cmFjdCA4IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxNgogICAgLy8gc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICBmcmFtZV9kaWcgLTMKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTcKICAgIC8vIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MjAKICAgIC8vIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIGZyYW1lX2RpZyAtMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE1CiAgICAvLyBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICBpbnRjXzIgLy8gOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIwCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBnZXRieXRlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDkKICAgIC8vIGlmIHBheW9mZiA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJueiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NTAKICAgIC8vIHJldHVybiBVSW50NjQoZW51bXMuUEFZT0ZGX1NJR05fUE9TSVRJVkUpCiAgICBpbnRjXzEgLy8gMQoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX3BheW9mZl9zaWduQDc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTktNzIxCiAgICAvLyBwYXlvZmZfc2lnbj1hcmM0LlVJbnQ4KAogICAgLy8gICAgIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIC8vICksCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgaW50Y18yIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MjMKICAgIC8vIGN1cnJlbmN5X2lkPXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzI0CiAgICAvLyBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTItNzI1CiAgICAvLyBFeGVjdXRpb25FdmVudCgKICAgIC8vICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIC8vICAgICBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYXBwbGllZF9hdD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICBwYXlvZmY9cGF5b2ZmLAogICAgLy8gICAgIHBheW9mZl9zaWduPWFyYzQuVUludDgoCiAgICAvLyAgICAgICAgIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIC8vICAgICApLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PXNldHRsZWRfYW1vdW50LAogICAgLy8gICAgIGN1cnJlbmN5X2lkPXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAwCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzExLTcyNgogICAgLy8gYXJjNC5lbWl0KAogICAgLy8gICAgIEV4ZWN1dGlvbkV2ZW50KAogICAgLy8gICAgICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgICAgIHBheW9mZj1wYXlvZmYsCiAgICAvLyAgICAgICAgIHBheW9mZl9zaWduPWFyYzQuVUludDgoCiAgICAvLyAgICAgICAgICAgICBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICAvLyAgICAgICAgICksCiAgICAvLyAgICAgICAgIHNldHRsZWRfYW1vdW50PXNldHRsZWRfYW1vdW50LAogICAgLy8gICAgICAgICBjdXJyZW5jeV9pZD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgICAgIHNlcXVlbmNlPWVudHJ5LmV2ZW50X2lkICsgVUludDY0KDEpLAogICAgLy8gICAgICkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDlhMzMyYjk1IC8vIG1ldGhvZCAiRXhlY3V0aW9uRXZlbnQodWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc1MQogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiAoVUludDY0KGVudW1zLkVWVF9JRUQpLCBVSW50NjQoZW51bXMuRVZUX1BJKSk6CiAgICBmcmFtZV9kaWcgNQogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBibnogX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2lmX2JvZHlANQogICAgZnJhbWVfZGlnIDUKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGJ6IF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pZl9lbHNlQDYKCl9lbWl0X2V4ZWN1dGlvbl9ldmVudF9pZl9ib2R5QDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NTIKICAgIC8vIHJldHVybiBVSW50NjQoZW51bXMuUEFZT0ZGX1NJR05fUE9TSVRJVkUpCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIwCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBiIF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9wYXlvZmZfc2lnbkA3CgpfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzUzCiAgICAvLyByZXR1cm4gVUludDY0KGVudW1zLlBBWU9GRl9TSUdOX05FR0FUSVZFKQogICAgcHVzaGludCAyNTUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcyMAogICAgLy8gc2VsZi5fcGF5b2ZmX3NpZ24oZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSwgcGF5b2ZmKQogICAgYiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fcGF5b2ZmX3NpZ25ANwoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9yb2xlX2lzX2FjdGl2ZShyb2xlX21hcDogYnl0ZXMsIHJvbGVfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NDoKX3JvbGVfaXNfYWN0aXZlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5CiAgICAvLyBkZWYgX3JvbGVfaXNfYWN0aXZlKHNlbGYsIHJvbGVfbWFwOiB0eXAuUmJhY1JvbGUsIHJvbGVfYWRkcmVzczogQWNjb3VudCkgLT4gYm9vbDoKICAgIHByb3RvIDIgMQogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTcKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAtNjQKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYxCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjIKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYxLTYyCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYxLTYzCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjMKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjItNjMKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgPj0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2MS02MwogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX21lcmdlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAtNjQKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKSAtPiB2b2lkOgpfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2NwogICAgLy8gYXNzZXJ0IHNlbGYuX2lzX2FycmFuZ2VyKFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTQKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgPT0gc2VsZi5hcnJhbmdlci52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE4IC8vIDB4NTIzYTQxNTI1MjIzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJyYW5nZXIgZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjY3CiAgICAvLyBhc3NlcnQgc2VsZi5faXNfYXJyYW5nZXIoVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkgLT4gdm9pZDoKX2Fzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg1CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuZGVmYXVsdGVkLCBlcnIuREVGQVVMVEVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzQgLy8gImRlZmF1bHRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kZWZhdWx0ZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRGVmYXVsdGVkCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKSAtPiB2b2lkOgpfYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODgKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5jb250cmFjdF9zdXNwZW5kZWQsIGVyci5TVVNQRU5ERUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMyAvLyAiY29udHJhY3Rfc3VzcGVuZGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3N1c3BlbmRlZCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBTdXNwZW5kZWQgb3BlcmF0aW9ucwogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGVfaWQ6IHVpbnQ2NCkgLT4gdm9pZDoKX2Fzc2VydF92YWxpZF9yb2xlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkwCiAgICAvLyBkZWYgX2Fzc2VydF92YWxpZF9yb2xlKHNlbGYsIHJvbGVfaWQ6IFVJbnQ2NCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkxLTk5CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MgogICAgLy8gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgcHVzaGludCAyMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkxLTk5CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTMKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICBwdXNoaW50IDI1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEtOTkKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NAogICAgLy8gVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIHB1c2hpbnQgNDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MS05OQogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojk1CiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICBwdXNoaW50IDUwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEtOTkKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NgogICAgLy8gVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICBwdXNoaW50IDYwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEtOTkKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NwogICAgLy8gVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIHB1c2hpbnQgNzAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MS05OQogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojk4CiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICBwdXNoaW50IDgwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEtOTkKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBieiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9mYWxzZUA4CgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDc6CiAgICBpbnRjXzEgLy8gMQoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfbWVyZ2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MS05OQogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICByZXRzdWIKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX2ZhbHNlQDg6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9tZXJnZUA5Cg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="}, "sourceInfo": {"approval": {"pcOffsetMethod": "none", "sourceInfo": [{"pc": [2652], "errorMessage": "ACTUS event not yet executed"}, {"pc": [2410], "errorMessage": "Can not distribute zero units"}, {"pc": [3153, 3160, 3533], "errorMessage": "D-ASA already configured"}, {"pc": [1259, 1991, 2370, 2516, 3750, 3896, 4247, 4478, 4624], "errorMessage": "D-ASA not configured"}, {"pc": [3544], "errorMessage": "D-ASA terms not configured"}, {"pc": [6844], "errorMessage": "Defaulted"}, {"pc": [3171], "errorMessage": "Denomination asset is not properly set"}, {"pc": [3186], "errorMessage": "Different settlement asset not supported, must be equal to denomination asset"}, {"pc": [3422, 3429, 3431], "errorMessage": "IED must be set in the future"}, {"pc": [1277, 2060, 2531, 4265, 6196], "errorMessage": "IED not yet executed"}, {"pc": [2423, 5579], "errorMessage": "Insufficient remaining D-ASA units"}, {"pc": [2626, 2692], "errorMessage": "Insufficient sender units to transfer"}, {"pc": [1887, 3073, 3091, 3147, 3624, 3660, 4312, 5763, 6041, 6101, 6504], "errorMessage": "Invalid ACTUS configuration"}, {"pc": [2000, 2404, 2587, 2602, 2759, 2832, 2895, 2937, 5391, 5516], "errorMessage": "Invalid account holding address"}, {"pc": [4815, 4839, 4863, 4887, 4911, 4968, 4996, 5018, 5040, 5062, 5272, 5290, 5305, 5320, 5335], "errorMessage": "Invalid account role address"}, {"pc": [3133], "errorMessage": "Invalid day-count convention ID"}, {"pc": [1390, 3771, 4099, 6073], "errorMessage": "Invalid event cursor"}, {"pc": [3609, 3672, 3948, 4289, 5679], "errorMessage": "Invalid event id"}, {"pc": [3784, 4163, 4170, 4302], "errorMessage": "Invalid event type"}, {"pc": [4952, 5262, 6914], "errorMessage": "Invalid role identifier"}, {"pc": [3538, 3684, 3692, 4001, 4376, 5694, 5710], "errorMessage": "Invalid schedule page"}, {"pc": [5627], "errorMessage": "No D-ASA units"}, {"pc": [1396, 1916, 2097, 6082], "errorMessage": "No due cashflow to pay"}, {"pc": [6165], "errorMessage": "Not IED event"}, {"pc": [2045, 2378, 2574, 2749, 2805, 2815, 2901, 4198, 5085, 5116, 6836], "errorMessage": "Not authorized"}, {"pc": [1517, 1525, 2146, 2220, 2229], "errorMessage": "Not enough funds for the payment"}, {"pc": [3921, 3934, 4274], "errorMessage": "Observed event required to execute this action"}, {"pc": [2392, 2440], "errorMessage": "Primary distribution is closed"}, {"pc": [6113], "errorMessage": "Primary distribution is not complete"}, {"pc": [2615], "errorMessage": "Sender and receiver must be different"}, {"pc": [5377, 6852], "errorMessage": "Suspended operations"}, {"pc": [2327, 3650, 4334], "errorMessage": "Time events must be sorted in strictly ascending order"}, {"pc": [2548, 2565], "errorMessage": "Transfer is closed"}, {"pc": [2619], "errorMessage": "Transfer units must be greater than zero"}, {"pc": [936], "errorMessage": "Wrong Global Bytes allocation"}, {"pc": [942], "errorMessage": "Wrong Global UInts allocation"}, {"pc": [946], "errorMessage": "Wrong Local Bytes allocation"}, {"pc": [950], "errorMessage": "Wrong Local UInts allocation"}, {"pc": [1498, 2139], "errorMessage": "account opted into asset"}, {"pc": [6796, 6811], "errorMessage": "check BoxMap entry exists"}, {"pc": [2036, 2074, 2115, 2153, 2444, 2622, 2681, 2707, 5371, 5537], "errorMessage": "check self.account entry exists"}, {"pc": [1579, 1811, 1899, 4535, 6201, 6524], "errorMessage": "check self.accrued_interest exists"}, {"pc": [5134, 6834], "errorMessage": "check self.arranger exists"}, {"pc": [6850], "errorMessage": "check self.contract_suspended exists"}, {"pc": [3081, 3527, 3917, 3929, 4270, 4483, 5925], "errorMessage": "check self.contract_type exists"}, {"pc": [1547, 4540, 5399, 5477], "errorMessage": "check self.cumulative_interest_index exists"}, {"pc": [1559, 4545, 5410, 5485], "errorMessage": "check self.cumulative_principal_index exists"}, {"pc": [6842], "errorMessage": "check self.defaulted exists"}, {"pc": [5935], "errorMessage": "check self.dynamic_principal_redemption exists"}, {"pc": [1315, 1327, 1388, 1630, 2630, 2642, 3763, 4092, 4511, 4628, 4640, 4677, 5492, 6071, 6153, 6350, 6405, 6543], "errorMessage": "check self.event_cursor exists"}, {"pc": [5425, 5439, 5632, 5661, 5991, 5999, 6026, 6046, 6236, 6369, 6530], "errorMessage": "check self.fixed_point_scale exists"}, {"pc": [6279], "errorMessage": "check self.has_rate_reset_cap exists"}, {"pc": [6252], "errorMessage": "check self.has_rate_reset_floor exists"}, {"pc": [3158, 3543, 4507, 6170], "errorMessage": "check self.initial_exchange_amount exists"}, {"pc": [2428, 2438], "errorMessage": "check self.initial_exchange_date exists"}, {"pc": [1755, 4525, 5967, 5981], "errorMessage": "check self.interest_calculation_base exists"}, {"pc": [1827, 1842], "errorMessage": "check self.next_principal_redemption exists"}, {"pc": [4530, 5959, 5986, 6031], "errorMessage": "check self.nominal_interest_rate exists"}, {"pc": [2005, 2018], "errorMessage": "check self.op_daemon exists"}, {"pc": [1652, 1721, 1747, 1801, 1853, 1862, 1884, 4520, 6509, 6590], "errorMessage": "check self.outstanding_principal exists"}, {"pc": [6287, 6301], "errorMessage": "check self.rate_reset_cap exists"}, {"pc": [6260, 6274], "errorMessage": "check self.rate_reset_floor exists"}, {"pc": [6231], "errorMessage": "check self.rate_reset_multiplier exists"}, {"pc": [6624], "errorMessage": "check self.rate_reset_next exists"}, {"pc": [6244], "errorMessage": "check self.rate_reset_spread exists"}, {"pc": [1503, 2215, 4550], "errorMessage": "check self.reserved_interest exists"}, {"pc": [1508, 1537, 2225, 2240, 4555], "errorMessage": "check self.reserved_principal exists"}, {"pc": [2415, 2463, 4502, 5574, 6106], "errorMessage": "check self.reserved_units_total exists"}, {"pc": [1319, 2634, 3767, 3946, 3963, 4083, 4284, 4319, 4338, 4458, 4515, 4632, 5675, 6346, 6413], "errorMessage": "check self.schedule_entry_count exists"}, {"pc": [3991, 4366], "errorMessage": "check self.schedule_page entry exists"}, {"pc": [1495, 2105, 2133, 6696], "errorMessage": "check self.settlement_asset_id exists"}, {"pc": [1258, 1272, 1990, 2055, 2369, 2388, 2515, 2526, 2809, 3151, 3531, 3749, 3895, 4246, 4260, 4476, 4623, 5520, 6097, 6191], "errorMessage": "check self.status exists"}, {"pc": [2421, 2474, 4497, 5625, 5656, 6111], "errorMessage": "check self.total_units exists"}, {"pc": [2553, 2563], "errorMessage": "check self.transfer_closure_date exists"}, {"pc": [2536, 2544], "errorMessage": "check self.transfer_opening_date exists"}, {"pc": [3586, 3643], "errorMessage": "index access is out of bounds"}, {"pc": [1974, 3018, 3501, 3996, 4371], "errorMessage": "invalid array length header"}, {"pc": [2739, 3489, 5075, 5106], "errorMessage": "invalid number of bytes for arc4.bool"}, {"pc": [1982], "errorMessage": "invalid number of bytes for arc4.dynamic_array"}, {"pc": [3516], "errorMessage": "invalid number of bytes for arc4.dynamic_array"}, {"pc": [1968, 2353, 2493, 2501, 2731, 2789, 2797, 2877, 2885, 2928, 2953, 4696, 4720, 4754, 4935, 5148, 5232], "errorMessage": "invalid number of bytes for arc4.static_array"}, {"pc": [1253, 2311, 2320, 2361, 2510, 3479, 3880], "errorMessage": "invalid number of bytes for arc4.uint64"}, {"pc": [4744, 4925, 5222], "errorMessage": "invalid number of bytes for arc4.uint8"}, {"pc": [2990], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.InitialKernelState"}, {"pc": [2979], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.NormalizedActusTerms"}, {"pc": [4242], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.ObservedCashEventRequest"}, {"pc": [3891], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.ObservedEventRequest"}, {"pc": [3023], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.Prospectus"}, {"pc": [4765], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.RoleValidity"}, {"pc": [3007], "errorMessage": "invalid tail pointer at index 1 of (uint8[32],(len+utf8[]))"}, {"pc": [3002], "errorMessage": "invalid tuple encoding"}, {"pc": [4063, 4438], "errorMessage": "max array length exceeded"}, {"pc": [4489, 6688], "errorMessage": "overflow"}]}, "clear": {"pcOffsetMethod": "none", "sourceInfo": []}}, "templateVariables": {}}""" +_APP_SPEC_JSON = r"""{"arcs": [22, 28], "bareActions": {"call": [], "create": []}, "methods": [{"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "desc": "Maximum number of due cash events to process in this call.", "name": "max_event_count"}], "name": "fund_due_cashflows", "returns": {"type": "(uint64,uint64,uint64,uint64,uint64)", "desc": "Funding result with reserved interest, reserved principal, and event count.", "struct": "CashFundingResult"}, "desc": "Reserve due ACTUS cash events into the escrow-style claim ledger.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Holder whose position should be settled and claimed.", "name": "holding_address"}, {"type": "byte[]", "desc": "Opaque settlement context returned in the result.", "name": "payment_info"}], "name": "claim_due_cashflows", "returns": {"type": "(uint64,uint64,uint64,uint64,byte[])", "desc": "Claim result with realized interest, principal, and passthrough context.", "struct": "CashClaimResult"}, "desc": "Withdraw the holder's already funded ACTUS cash entitlements.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "desc": "Inclusive UNIX timestamp at which transfers may start.", "name": "open_date"}, {"type": "uint64", "desc": "Exclusive UNIX timestamp at which transfers stop.", "name": "closure_date"}], "name": "transfer_set_schedule", "returns": {"type": "uint64", "desc": "UNIX timestamp of the schedule update."}, "desc": "Configure the secondary-market transfer window.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account receiving the reserved units.", "name": "holding_address"}, {"type": "uint64", "desc": "Number of units to reserve.", "name": "units"}], "name": "primary_distribution", "returns": {"type": "uint64", "desc": "Remaining undistributed unit balance."}, "desc": "Reserve units for a holder before the initial exchange activates issuance.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account debited for the transfer.", "name": "sender_holding_address"}, {"type": "address", "desc": "Account credited for the transfer.", "name": "receiver_holding_address"}, {"type": "uint64", "desc": "Number of active units to move.", "name": "units"}], "name": "transfer", "returns": {"type": "uint64", "desc": "Number of units transferred."}, "desc": "Transfer active units after settling both counterparties to the current cursor.\nReturns the number of units moved. The ACTUS kernel no longer persists a nominal per-unit value on-chain, so transfer results are unit-based.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account holding address.", "name": "holding_address"}, {"type": "bool", "desc": "Suspension status to apply.", "name": "suspended"}], "name": "account_suspension", "returns": {"type": "uint64", "desc": "UNIX timestamp of the suspension update."}, "desc": "Set the suspension status of one account.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account holding address.", "name": "holding_address"}, {"type": "address", "desc": "Account payment address.", "name": "payment_address"}], "name": "account_open", "returns": {"type": "uint64", "desc": "UNIX timestamp of the account opening."}, "desc": "Open a contract account with a new position and register its payment address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account holding address.", "name": "holding_address"}, {"type": "address", "desc": "New account payment address.", "name": "payment_address"}], "name": "account_update_payment_address", "returns": {"type": "uint64", "desc": "UNIX timestamp of the account update."}, "desc": "Update the payment address of an account.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account holding address.", "name": "holding_address"}], "name": "account_get_position", "returns": {"type": "(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64)", "desc": "Account position record.", "struct": "AccountPosition"}, "desc": "Get the full accounting position for one holder.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": [], "create": ["NoOp"]}, "args": [{"type": "address", "desc": "D-ASA arranger address.", "name": "arranger"}], "name": "contract_create", "returns": {"type": "uint64", "desc": "UNIX timestamp of contract creation."}, "desc": "Create a new D-ASA contract and set the arranger role.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64)", "desc": "Normalized ACTUS terms.", "name": "terms", "struct": "NormalizedActusTerms"}, {"type": "(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "desc": "Initial kernel state captured before `IED`.", "name": "initial_state", "struct": "InitialKernelState"}, {"type": "(byte[32],string)", "desc": "Prospectus metadata stored for reference only.", "name": "prospectus", "struct": "Prospectus"}], "name": "contract_config", "returns": {"type": "uint64", "desc": "UNIX timestamp of contract configuration."}, "desc": "Partial contract configuration with: normalized ACTUS terms, initial kernel\nstate (pre-IED), prospectus (informational only). The contract stays inactive until all schedule pages are configured next.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "desc": "Zero-based page index within the boxed schedule.", "name": "schedule_page_index"}, {"type": "bool", "desc": "Whether this page finalizes the schedule upload.", "name": "is_last_page"}, {"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[]", "desc": "Normalized schedule entries for the requested page.", "name": "schedule_page"}], "name": "contract_schedule", "returns": {"type": "uint64", "desc": "UNIX timestamp of the schedule upload."}, "desc": "Upload one normalized schedule page.\nThe configuration operation is considered complete only when the last page is stored. At that point `schedule_entry_count` is finalized and the contract moves to `STATUS_PENDING_IED`.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "contract_execute_ied", "returns": {"type": "uint64", "desc": "UNIX timestamp of the `IED` execution."}, "desc": "Execute the first due `IED` entry and activate the contract.\n`IED` is the one non-cash event that moves the app from `STATUS_PENDING_IED` to `STATUS_ACTIVE`.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "desc": "Expected global schedule event identifier at the current cursor.", "name": "event_id"}, {"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "desc": "Observed payload used for append-on-execute and/or rate resets.", "name": "payload", "struct": "ObservedEventRequest"}], "name": "apply_non_cash_event", "returns": {"type": "uint64", "desc": "UNIX timestamp of the non-cash event application."}, "desc": "Apply the next due non-cash event, optionally appending one first.\nObserved payloads are appended before execution when flagged. Rate reset events require the interest oracle because they can change the running nominal rate; other non-cash events stay arranger-controlled.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "desc": "Observed cash-event payload to append after the current tail.", "name": "payload", "struct": "ObservedCashEventRequest"}], "name": "append_observed_cash_event", "returns": {"type": "uint64", "desc": "UNIX timestamp of the append operation."}, "desc": "Append an arranger-authorized observed cash event to the schedule tail.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "contract_get_state", "returns": {"type": "(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "desc": "Current kernel state snapshot.", "struct": "KernelState"}, "desc": "Return a readonly snapshot of the generic ACTUS kernel state.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "contract_get_next_due_event", "returns": {"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "desc": "Next due schedule entry, or an all-zero sentinel if the contract ended.", "struct": "ExecutionScheduleEntry"}, "desc": "Return the next boxed schedule entry, or a zeroed sentinel if ended.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["UpdateApplication"], "create": []}, "args": [], "name": "contract_update", "returns": {"type": "void", "desc": "None."}, "desc": "Update D-ASA application.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "New arranger address.", "name": "new_arranger"}], "name": "rbac_rotate_arranger", "returns": {"type": "uint64", "desc": "UNIX timestamp of the role assignment."}, "desc": "Rotate the arranger address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Operation daemon address.", "name": "address"}], "name": "rbac_set_op_daemon", "returns": {"type": "uint64", "desc": "UNIX timestamp of the role assignment."}, "desc": "Non-normative helper to set the operation daemon address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role identifier.", "name": "role_id"}, {"type": "address", "desc": "Account role address.", "name": "role_address"}, {"type": "(uint64,uint64)", "desc": "Inclusive validity interval for the assignment.", "name": "validity", "struct": "RoleValidity"}], "name": "rbac_assign_role", "returns": {"type": "uint64", "desc": "UNIX timestamp of the role assignment."}, "desc": "Assign a role to an address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role identifier.", "name": "role_id"}, {"type": "address", "desc": "Account role address.", "name": "role_address"}], "name": "rbac_revoke_role", "returns": {"type": "uint64", "desc": "UNIX timestamp of the role revocation."}, "desc": "Revoke a role from an address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Suspension status to apply.", "name": "suspended"}], "name": "rbac_contract_suspension", "returns": {"type": "uint64", "desc": "UNIX timestamp of the suspension update."}, "desc": "Set the asset-wide suspension status.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Default status", "name": "defaulted"}], "name": "rbac_contract_default", "returns": {"type": "uint64"}, "desc": "Set D-ASA default status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "rbac_get_arranger", "returns": {"type": "address", "desc": "Current arranger address."}, "desc": "Get the arranger address.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Address to query.", "name": "address"}], "name": "rbac_get_address_roles", "returns": {"type": "(bool,bool,bool,bool,bool)", "desc": "Roles mask in the order: account manager, primary dealer, trustee, authority, observer."}, "desc": "Non-normative helper to get the active roles assigned to an address.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role identifier.", "name": "role_id"}, {"type": "address", "desc": "Account role address.", "name": "role_address"}], "name": "rbac_get_role_validity", "returns": {"type": "(uint64,uint64)", "desc": "Stored role validity interval.", "struct": "RoleValidity"}, "desc": "Get the stored validity interval for a role assignment.", "events": [], "readonly": true, "recommendations": {}}], "name": "DASA", "state": {"keys": {"box": {}, "global": {"arranger": {"key": "UjpBUlIj", "keyType": "AVMBytes", "valueType": "address"}, "op_daemon": {"key": "UjpPUEQj", "keyType": "AVMBytes", "valueType": "address"}, "contract_suspended": {"key": "Y29udHJhY3Rfc3VzcGVuZGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "defaulted": {"key": "ZGVmYXVsdGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "status": {"key": "c3RhdHVz", "keyType": "AVMString", "valueType": "AVMUint64"}, "contract_type": {"key": "Y29udHJhY3RfdHlwZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "prospectus_hash": {"key": "cHJvc3BlY3R1c19oYXNo", "keyType": "AVMString", "valueType": "AVMBytes"}, "prospectus_url": {"key": "cHJvc3BlY3R1c191cmw=", "keyType": "AVMString", "valueType": "AVMString"}, "denomination_asset_id": {"key": "ZGVub21pbmF0aW9uX2Fzc2V0X2lk", "keyType": "AVMString", "valueType": "AVMUint64"}, "settlement_asset_id": {"key": "c2V0dGxlbWVudF9hc3NldF9pZA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "initial_exchange_date": {"key": "aW5pdGlhbF9leGNoYW5nZV9kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "maturity_date": {"key": "bWF0dXJpdHlfZGF0ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "transfer_opening_date": {"key": "dHJhbnNmZXJfb3BlbmluZ19kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "transfer_closure_date": {"key": "dHJhbnNmZXJfY2xvc3VyZV9kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "day_count_convention": {"key": "ZGF5X2NvdW50X2NvbnZlbnRpb24=", "keyType": "AVMString", "valueType": "AVMUint64"}, "total_units": {"key": "dG90YWxfdW5pdHM=", "keyType": "AVMString", "valueType": "AVMUint64"}, "reserved_units_total": {"key": "cmVzZXJ2ZWRfdW5pdHNfdG90YWw=", "keyType": "AVMString", "valueType": "AVMUint64"}, "initial_exchange_amount": {"key": "aW5pdGlhbF9leGNoYW5nZV9hbW91bnQ=", "keyType": "AVMString", "valueType": "AVMUint64"}, "outstanding_principal": {"key": "b3V0c3RhbmRpbmdfcHJpbmNpcGFs", "keyType": "AVMString", "valueType": "AVMUint64"}, "next_principal_redemption": {"key": "bmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbg==", "keyType": "AVMString", "valueType": "AVMUint64"}, "dynamic_principal_redemption": {"key": "ZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbg==", "keyType": "AVMString", "valueType": "AVMUint64"}, "interest_calculation_base": {"key": "aW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "accrued_interest": {"key": "YWNjcnVlZF9pbnRlcmVzdA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "nominal_interest_rate": {"key": "bm9taW5hbF9pbnRlcmVzdF9yYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_spread": {"key": "cmF0ZV9yZXNldF9zcHJlYWQ=", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_multiplier": {"key": "cmF0ZV9yZXNldF9tdWx0aXBsaWVy", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_floor": {"key": "cmF0ZV9yZXNldF9mbG9vcg==", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_cap": {"key": "cmF0ZV9yZXNldF9jYXA=", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_next": {"key": "cmF0ZV9yZXNldF9uZXh0", "keyType": "AVMString", "valueType": "AVMUint64"}, "has_rate_reset_floor": {"key": "aGFzX3JhdGVfcmVzZXRfZmxvb3I=", "keyType": "AVMString", "valueType": "AVMUint64"}, "has_rate_reset_cap": {"key": "aGFzX3JhdGVfcmVzZXRfY2Fw", "keyType": "AVMString", "valueType": "AVMUint64"}, "reserved_principal": {"key": "cmVzZXJ2ZWRfcHJpbmNpcGFs", "keyType": "AVMString", "valueType": "AVMUint64"}, "reserved_interest": {"key": "cmVzZXJ2ZWRfaW50ZXJlc3Q=", "keyType": "AVMString", "valueType": "AVMUint64"}, "cumulative_interest_index": {"key": "Y3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "cumulative_principal_index": {"key": "Y3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXg=", "keyType": "AVMString", "valueType": "AVMUint64"}, "event_cursor": {"key": "ZXZlbnRfY3Vyc29y", "keyType": "AVMString", "valueType": "AVMUint64"}, "schedule_entry_count": {"key": "c2NoZWR1bGVfZW50cnlfY291bnQ=", "keyType": "AVMString", "valueType": "AVMUint64"}, "fixed_point_scale": {"key": "Zml4ZWRfcG9pbnRfc2NhbGU=", "keyType": "AVMString", "valueType": "AVMUint64"}}, "local": {}}, "maps": {"box": {"account_manager": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpNTkcj"}, "primary_dealer": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpQWUQj"}, "trustee": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpUUlMj"}, "authority": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpBVVQj"}, "observer": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpNT0Mj"}, "schedule_page": {"keyType": "uint64", "valueType": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[]", "prefix": "UyM="}, "account": {"keyType": "address", "valueType": "AccountPosition", "prefix": "QSM="}}, "global": {}, "local": {}}, "schema": {"global": {"bytes": 10, "ints": 54}, "local": {"bytes": 0, "ints": 0}}}, "structs": {"AccountPosition": [{"name": "payment_address", "type": "address"}, {"name": "units", "type": "uint64"}, {"name": "reserved_units", "type": "uint64"}, {"name": "suspended", "type": "bool"}, {"name": "settled_cursor", "type": "uint64"}, {"name": "interest_checkpoint", "type": "uint64"}, {"name": "principal_checkpoint", "type": "uint64"}, {"name": "claimable_interest", "type": "uint64"}, {"name": "claimable_principal", "type": "uint64"}], "CashClaimResult": [{"name": "interest_amount", "type": "uint64"}, {"name": "principal_amount", "type": "uint64"}, {"name": "total_amount", "type": "uint64"}, {"name": "timestamp", "type": "uint64"}, {"name": "context", "type": "byte[]"}], "CashFundingResult": [{"name": "funded_interest", "type": "uint64"}, {"name": "funded_principal", "type": "uint64"}, {"name": "total_funded", "type": "uint64"}, {"name": "processed_events", "type": "uint64"}, {"name": "timestamp", "type": "uint64"}], "ExecutionScheduleEntry": [{"name": "event_id", "type": "uint64"}, {"name": "event_type", "type": "uint8"}, {"name": "scheduled_time", "type": "uint64"}, {"name": "accrual_factor", "type": "uint64"}, {"name": "redemption_accrual_factor", "type": "uint64"}, {"name": "next_nominal_interest_rate", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "next_outstanding_principal", "type": "uint64"}, {"name": "flags", "type": "uint64"}], "InitialKernelState": [{"name": "status_date", "type": "uint64"}, {"name": "event_cursor", "type": "uint64"}, {"name": "outstanding_principal", "type": "uint64"}, {"name": "interest_calculation_base", "type": "uint64"}, {"name": "nominal_interest_rate", "type": "uint64"}, {"name": "accrued_interest", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "cumulative_interest_index", "type": "uint64"}, {"name": "cumulative_principal_index", "type": "uint64"}], "KernelState": [{"name": "contract_type", "type": "uint8"}, {"name": "status", "type": "uint64"}, {"name": "total_units", "type": "uint64"}, {"name": "reserved_units_total", "type": "uint64"}, {"name": "initial_exchange_amount", "type": "uint64"}, {"name": "event_cursor", "type": "uint64"}, {"name": "schedule_entry_count", "type": "uint64"}, {"name": "outstanding_principal", "type": "uint64"}, {"name": "interest_calculation_base", "type": "uint64"}, {"name": "nominal_interest_rate", "type": "uint64"}, {"name": "accrued_interest", "type": "uint64"}, {"name": "cumulative_interest_index", "type": "uint64"}, {"name": "cumulative_principal_index", "type": "uint64"}, {"name": "reserved_interest", "type": "uint64"}, {"name": "reserved_principal", "type": "uint64"}], "NormalizedActusTerms": [{"name": "contract_type", "type": "uint8"}, {"name": "denomination_asset_id", "type": "uint64"}, {"name": "settlement_asset_id", "type": "uint64"}, {"name": "total_units", "type": "uint64"}, {"name": "notional_principal", "type": "uint64"}, {"name": "initial_exchange_amount", "type": "uint64"}, {"name": "initial_exchange_date", "type": "uint64"}, {"name": "maturity_date", "type": "uint64"}, {"name": "day_count_convention", "type": "uint8"}, {"name": "rate_reset_spread", "type": "uint64"}, {"name": "rate_reset_multiplier", "type": "uint64"}, {"name": "rate_reset_floor", "type": "uint64"}, {"name": "rate_reset_cap", "type": "uint64"}, {"name": "rate_reset_next", "type": "uint64"}, {"name": "has_rate_reset_floor", "type": "bool"}, {"name": "has_rate_reset_cap", "type": "bool"}, {"name": "dynamic_principal_redemption", "type": "bool"}, {"name": "fixed_point_scale", "type": "uint64"}], "ObservedCashEventRequest": [{"name": "event_id", "type": "uint64"}, {"name": "event_type", "type": "uint8"}, {"name": "scheduled_time", "type": "uint64"}, {"name": "accrual_factor", "type": "uint64"}, {"name": "redemption_accrual_factor", "type": "uint64"}, {"name": "next_nominal_interest_rate", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "next_outstanding_principal", "type": "uint64"}, {"name": "flags", "type": "uint64"}], "ObservedEventRequest": [{"name": "event_id", "type": "uint64"}, {"name": "event_type", "type": "uint8"}, {"name": "scheduled_time", "type": "uint64"}, {"name": "accrual_factor", "type": "uint64"}, {"name": "redemption_accrual_factor", "type": "uint64"}, {"name": "observed_rate", "type": "uint64"}, {"name": "next_nominal_interest_rate", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "next_outstanding_principal", "type": "uint64"}, {"name": "flags", "type": "uint64"}], "Prospectus": [{"name": "hash", "type": "byte[32]"}, {"name": "url", "type": "string"}], "RoleValidity": [{"name": "role_validity_start", "type": "uint64"}, {"name": "role_validity_end", "type": "uint64"}]}, "byteCode": {"approval": "DCAFAAEIINwLJjEEFR98dQZzdGF0dXMMZXZlbnRfY3Vyc29yFHNjaGVkdWxlX2VudHJ5X2NvdW50FW91dHN0YW5kaW5nX3ByaW5jaXBhbBFmaXhlZF9wb2ludF9zY2FsZRBhY2NydWVkX2ludGVyZXN0GWludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UCQSMVbm9taW5hbF9pbnRlcmVzdF9yYXRlDWNvbnRyYWN0X3R5cGUUcmVzZXJ2ZWRfdW5pdHNfdG90YWwScmVzZXJ2ZWRfcHJpbmNpcGFsC3RvdGFsX3VuaXRzGW5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24RcmVzZXJ2ZWRfaW50ZXJlc3QZY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleBpjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleAZSOkFSUiMTc2V0dGxlbWVudF9hc3NldF9pZBdpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudAZSOkFVVCMGUjpQWUQjBlI6TU5HIwJTIwZSOk1PQyMGUjpUUlMjBlI6T1BEIxVpbml0aWFsX2V4Y2hhbmdlX2RhdGUVdHJhbnNmZXJfb3BlbmluZ19kYXRlFXRyYW5zZmVyX2Nsb3N1cmVfZGF0ZRByYXRlX3Jlc2V0X2Zsb29yDnJhdGVfcmVzZXRfY2FwEmNvbnRyYWN0X3N1c3BlbmRlZAlkZWZhdWx0ZWQcZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbhFyYXRlX3Jlc2V0X3NwcmVhZBVyYXRlX3Jlc2V0X211bHRpcGxpZXIPcmF0ZV9yZXNldF9uZXh0FGhhc19yYXRlX3Jlc2V0X2Zsb29yEmhhc19yYXRlX3Jlc2V0X2NhcAEAD3Byb3NwZWN0dXNfaGFzaA5wcm9zcGVjdHVzX3VybBVkZW5vbWluYXRpb25fYXNzZXRfaWQNbWF0dXJpdHlfZGF0ZRRkYXlfY291bnRfY29udmVudGlvbgMGgQECAAAxGEAArScSMgNnJxsyA2cnISJnJyIiZykiZycKImcnKoAAZycrgABnJywiZycTImcnHCJnJy0iZycdImcnHiJnJy4iZycNImcnCyJnJxQiZycEImcnDiJnJyMiZycHImcnBiJnJwkiZyckImcnJSJnJx8iZycgImcnJiJnJyciZycoImcnDCJnJw8iZycQImcnESJnKiJnKyJnJwUiZzE1gQoSRDE0gTYSRDE3FEQxNhREgASRTwTrNhoAjgEAzjEZFEQxGEEAt4IZBLRGGMgE54MlKQSUOIcjBGyF4+4EvdGpRAR8DxgSBBT8EO8EdKcpfwQJ1P4UBJqb+oUEhe7TPQSrLA/EBNnyJawEmINQWgSOpudMBAKvVXoEgvcbLQTvBPXTBN80NVAEPb6AvQQePkjnBDkkH6MEAQyCmQR0BqzSBBpyou42GgCOGQBWAyEEfQSnBTEGIQZbBrMG5gcUCQgKHwqYDAQM9g2JDc4N5g3+DrMPSQ9oD4cPkg/cAIAElW1xVjYaAI4BBvEAMRmBBBIxGBBEQg2uigIAi/6BCgiLADIMDUEAKrGBBrIQgQWyGScvsh4nL7Ifi/+NAgALAASzQv/bMgCyAUL/9SKyAUL/74kigABHDTYaAUkVJBJEFyIpZUREiBW9iBXEiBXJIillRIEyEhREiBIgQQALSYFkCyEECCKI/48iRQUiRQ4iRQ1LBEsBDEECWSIqZUQiK2VEDEECTSIqZUSIEPJJRRGBCVtJRQMyBw1AAjdLDyRVSUUQJBJJRQRAABBLDoEDEkAACEsOgRMSQQI/I0ECFEsPIlsiKmVEEkRLATIHDkRLAkAB7UsOgRMSQAHlIkULSw8kVUlFEIEDEkABZUsOgRMSQAFdIkUGSw+BMVtFCIgRekAA/ksHRQlLCogQOEsGiBAzSwGIEE1JTgJFD0mIEERJRQtLAksBCElFCTIKIicTZURwAEQiJw9lRCInDGVESwEISwJLAQ9ETwJMCU8CD0RPAwgnD0xnIicMZUQIJwxMZyInEGVETwIIJxBMZyInEWVECCcRTGdLDyRVgQMSQQB6IicGZURLEIgRBkUSCCcGTGeIEOZBAApLDyRVgRMSQQAJSw+BKVsnDkxnJwRLCGcnB0sJZyIqZUQjCCpMZ0sPVwgBgAETqEEAESInBGVEQAAJKYHIAWcnByJnSw9LBEmIE3NISw1LDAhFDksMSwcIRQ1LBCMIRQVC/ncnBiJnQv+QSw8kVUlFEIEDEkEAECInBGVESwYJSUUJRQlC/ulLDiQSQQATIicEZUxFCUQiJwdlTEUKREL+z0sOgRMSQAAHSwdFCUL+wCJFCCJFCUL+t4gQJ0EAVksOgRMSQQAKIicEZURFBkL+jiInBmVESxCIEB5FEghJRQsiJw5lRA9BAAYiRQZC/m8iJw5lREsKCUlFCCInBGVEDUEACiInBGVERQZC/lFLBkUGQv5KSw+BMVsiJwRlREoOREwJRQZC/jYiJwZlREsQiA/GRRIIRQtC/gxLBElESw5JSw9JTgMIMgdPAhZPAxZQTwIWUE8CFlBMFlAoTFCwI0MiQv2+gABHAjYaAUcCFSUSRDYaAkkiWYECCEsBFRJEVwIATCIpZUREJwhMUEm9RQFEIicbZUQyAxNBACIxACInG2VEEkAAFTEASwMSQAANMQBLAb5EVwAgEkEBACNEiBK1iBK6IillRIEyEhRESwJJiA1qiAztRgJJvkRJgUlbSU4CRQhJgVFbSUUITwIISUUGRFcAICInE2VEcABFAUEAt0m+RIGAA1NAAK0jQQB4MgoiJxNlRExLAXAAREsFSU4CD0RLAklOA75ESVcAILEyAE8DshJMshRPArIRgQSyELIBs0mBSVtJTgJFCUmBUVtJTgNFCSIWTEsBXElMXFFPA0y/IicPZURJSwIPRCInDGVESwMPREwJJw9MZyInDGVETAknDExnSwVJSwZJTgMIMgdPAhZPAxZQTwIWUEwWUEsCSRUWVwYCTFBMgAIAIlBMUChMULAjQyJC/1AiQv79NhoBSRUkEkQXNhoCSRUkEkQXiBGXSgxEJx1PAmcnHkxnMgcWKExQsCNDNhoBSRUlEkQ2GgJJFSQSRBdJTgIiKWVERCcWMQCIES5EiBFoiBFtIillRIEyEkQnCEsCUElOA71FAURMiAuJSUQiJwtlRAgiJw1lRA5EIiccZURBAAkyByInHGVEDkRHAr5EgShbSwNJTgMIFoEoTLsiJwtlRAgnC0sBZyInDWVETAkWKExQsCNDIkk2GgFJFSUSRDYaAkkVJRJENhoDRwIVJBJEFyIpZUREiBDeiBDjIillRIEyEhREIicdZURBAAkiJx1lRDIHDkQiJx5lREEACTIHIiceZUQMRDEASwRJTgISRCcISwFQSUUISb1FAUQnCEsFSU4CUElFCb1FAURLAogKwkmICr5PAhNESwFJREy+RCVbDkQiKmVEIitlRA9AAA4iKmVEiAvPgQlbMgcNREsDSYgLGksDSU4CiAsSiAqVRgKICpBGAksFSb5EJVtLAklOAksBDkRLAQkWTwIlTwK7SwVJvkQlW08CCBYlTLsoSwJQsCNDNhoBSRUlEkQ2GgJJFSMSRCJTJxUxAIgPu0QnCE8CUEm9RQFESYEwI7oiTwNUgTBMuzIHFihMULAjQzYaAUkVJRJENhoCSRUlEkQnFzEAiA+DRCIpZUSByAESFESID7OID7gnCE8CUEm9RQEURCIWTwJLAVBLAVAnKVBLAVBLAVBLAVBLAVBMUL8yBxYoTFCwI0M2GgFJFSUSRDYaAkkVJRJEJwhLAlBJvUUBRDEATwMSRIgPXYgPYiJPArsyBxYoTFCwI0M2GgFJFSUSRCcITFBJvUUBRL5IKExQsCNDNhoBSRUlEkQnEkxnMgcWKExQsCNDgABJNhoBRwIVgWsSRDYaAklOAhWBSBJENhoDSU4CSRVLASVZSYEiEkRPAkxLAlJJTgMiWYEkCBJEiA7ZIlVJJwpLAWdBACJJIxJAABxJgQISQAAVSYEDEkAADkmBBBJAAAdJgQUSQQGHI0QiJwplTEUCREsESYEhW0lFCESBOVVJRQhBAB9LBiMSQAAYSwaBAhJAABBLBoEDEkAACEsGgQQSQQFHI0RJIxNBAAhLBIGSBlMURCIpZUQURCInFGVEFERLBEkjW0lxC0UBRCcsSwFnSwGBCVtJTwISRCcTSwFnsTIAMgoishKyFEyyEYEEshCyAbNJgRFbJw1MZycLImcnLksIZ0mBKVsnHEsBZ0sBgTFbJy1LAWdLBklOAoEwWycOTGcnFEsKZ0sDgZIGUycjTGdLAYEQWycETGdLAYEoWycGTGdLASVbJwlMZ0sBgRhbJwdMZ0sDgTpbJyRMZ0sDgUJbJyVMZ0sDgUpbJx9MZ0sDgVJbJyBMZ0sDgVpbJyZMZ0sDgZAGUycnTGdLA4GRBlMnKExnTwOBY1snBUxnSwEkWypMZ0sBgThbJxBMZ0sBgUBbJxFMZycPImcnDCJnSwIyBw1ETCJbSwIMRAxESwJXACAnKkxnSwFXAgAnK0xnMgcWKExQsCNDIkL+tiJC/nYigABHAjYaAUkVJBJEF0k2GgJJFSMSRCJTTDYaA0lOAkkiWUlOA0mBQQuBAghPAhUSRIgM7CInCmVMTgNEIillRBRESYEQDkQiJxRlRERMgRALTIFkCyEECCKI9rYiSUsEDEEAi0sEVwIASUUMSwFJTgKBQQuBQVhJJFVJTgJFDUkiW0lFDUsFTwQISwESREsFTwOICDhMgQlbSUUKREEAF0lBACVJIwmBQQtLC0yBQViBCVtLCA5ESwhAAAVLCSMSREkjCEUBQv+USwZJRCMJFicYTFBJvUUBREkigQK6F0lEIwmBQQuBAgiBQbpC/8FLBhYnGExQSbxISwW/SwVBAAxLAUsECCtMZymBMmcyBxYoTFCwI0MiKWVERIgMAogMCYgMDiIqZUQiK2VESwENRIgHZklXCAFJgAEBqERLAVcACEsCVwkISwNXEQhLBFcZCEsFVyEISwZXKQhLB1cxCEsIVzkITwdPCFBPB1BPBlBPBVAiFlBPBFBPA1BPAlBMUIgImEYCMgcWKExQsCNDIkcEgABJNhoBSRUkEkQXNhoCRwIVgUkSRCIpZUREiAt6iAt/gUFbSYEEGkEAsCInCmVEgQUSRIgLVyInCmVESYEFEkRLAkkiW0lFByIrZUQSRElXCAFFDCRViAbhIitlRIEQCicwRQcWJxhMUElFCb1FAUEAB0sHvkxFB0RLBUkiWUmBEAxESwNJVwkISwFXEQhLAlcZCEsDVykISwRXMQhPBVc5CEsLFksSUE8GUE8FUE8EUE8DUE8CUExQSwMWUE8CTFBMIwgWVwYCXABLCEm8SEy/IitlRCMIK0xnIiplREsDSU8CEkSIBh5JRQhJVwgBRQokVUlFBiMSQAAoSwSBBBJAACBLBIEMEkAAGEsEgQsSQAAQSwSBEhJAAAhLBIEFEkEAQSNESwiAAQGpREsEgQwSQAAISwSBCxJBACQjQQAaJxkxAIgKEkRLBksCiAc6RgIyBxYoTFCwI0OICjBC/+giQv/ZIkL/vCJJNhoBRwIVgUESRCIpZUREiAoRiAoYiAodIillRIEyEhREIicKZUSBBRJESSJbSU4CIitlRExLARJESwFXCAFJTgOAAQOoREyBOVtJTgIjGkRBABMiK2VEIwmIBUCBCVtLBIEJWw5EIitlRIEQCicwRQYWJxhMUElFB71FAUEAB0sFvkxFBkRLBEkiWUmBEAxESwVJVwkISwFXEQhLAlcZCEsDVyEISwRXKQhPBVcxCEsKFksKUE8GUE8FUE8EUE8DUE8CUExQSwMWUE8CTFBMIwgWVwYCXABLBkm8SEy/IitlRCMIK0xnMgcWKExQsCNDIillRElEIicKZUQWSZMkDkRXBwEiJw1lRCInC2VEIicUZUQiKmVEIitlRCInBGVEIicHZUQiJwllRCInBmVEIicQZUQiJxFlRCInD2VEIicMZURPDhZPDkxQTw0WUE8MFlBPCxZQTwoWUE8JFlBPCBZQTwcWUE8GFlBPBRZQTwQWUE8DFlBPAhZQTBZQKExQsCNDIillREQiKmVEIitlRA9BACUiKmVEFicpUCIWTEsBUEsBUEsBUEsBUEsBUEsBUExQKExQsCNDIiplRIgD3EL/8IgIXSNDNhoBSRUlEkSICFAnEkxnMgcWKExQsCNDNhoBSRUlEkSICDgnG0xnMgcWKExQsCNDNhoBSRUjEkQ2GgJJTgIVJRJENhoDSU4CFYEQEkSICAuICBIXRwKICByBFBJBAA4nEksDZzIHFihMULAjQ0mBKBJBABEnF0sDUEm9RQEUREsCv0L/30mBMhJBABEnFksDUEm9RQEUREsCv0L/x0mBPBJBABEnGksDUEm9RQEUREsCv0L/r0mBRhJBABEnFUsDUEm9RQEUREsCv0L/l0mBUBJB/5AnGUsDUEm9RQEUREsCv0L/fzYaAUkVIxJENhoCSU4CFSUSRIgHYYgHaBdHAogHckmBFBNEgSgSQQAVJxdLAlBJvUUBRLxIMgcWKExQsCNDSYEyEkEADycWSwJQSb1FAUS8SEL/4UmBPBJBAA8nGksCUEm9RQFEvEhC/8tJgUYSQQAPJxVLAlBJvUUBRLxIQv+1SYFQEkH/ricZSwJQSb1FAUS8SEL/nzYaAUkVIxJEIlMnFTEAiAabRCchTGcyBxYoTFCwI0M2GgFJFSMSRCJTJxoxAIgGfEQnIkxnMgcWKExQsCNDIicSZUQoTFCwI0M2GgFJFSUSRCcXSwGIBlQnFksCiAZNJxpLA4gGRicVSwSIBj8nGU8FiAY4JykiTwZUI08FVIECTwRUgQNPA1SBBE8CVChMULAjQzYaAUkVIxJENhoCSU4CFSUSRBdJiAZQgwYUKDI8RlBPBo4GAE8AQAAxACIAEwABACcZSwFQSb1FAUS+SChMULAjQycVSwFQSb1FAUS+SEL/6ycaSwFQSb1FAUS+SEL/3CcWSwFQSb1FAUS+SEL/zScXSwFQSb1FAUS+SEL/voAQAAAAAAAAAAAAAAAAAAAAAEL/qYoBACcIi/9QvkSBgANTFESJigECJwiL/1BJvUUBREm+SCInEGVESwGBOVsJIicRZURLAoFBWwlLAiVbIicFZURPA0sCTwKIAJgiJwVlRE8DTwNPAogAiksCgUlbSwIIFk8DTFxJSYFRW0sCCBZcUSInEGVEFlw5IicRZUQWXEEiKmVEFlwxTwNMv4mKAQAigAAnCIv/UEm9RQFEIillRIEyEkEAAYmLAr5MSU4CjABEgShbSYwBQAABiYsASSVbiwFJTgMIFlwgIhZcKIsCTL8iJwtlRElLAg9ETAknC0xniYoDAYv9QQAFi/5AAAIiiYv9i/4di/+XiYoBAYv/QAACIokiJw1lRElEIicFZUSL/0xPAoj/yomKAQGL/0AAAiKJIicNZUQiJwVlRIv/TIj/r4mKAQEiK2VEi/8NRIv/gRAKFicYTFBJvUUBRIv/gRAYSwEigQK6F0sBDUSBQQuBAgiBQbqJigIAi/8jEkAAH4v/JBJAABiL/4ETEkAAEIv/gQwSQAAIi/+BCxJBAAMjRImL/kAABCJC//WL/oEDEkAACIv+gQISQQAYi/+BAxJAAAiL/4ESEkEABCNC/9EiQv/Ni/4jEkEAIIv/gQMSQAAQi/+BEhJAAAiL/4EFEkEABCNC/6oiQv+mi/6BBBJBACiL/4EDEkAAGIv/gQQSQAAQi/+BEhJAAAiL/4EFEkEABCNC/3oiQv92i/6BBRJBAAiL/4EDEkL/ZiJC/2IiJwplRCMSQQAKIicjZURBAAIjiSKJigECi/+BEVtJQQAQIicJZURBAAgiJwdlREAABiKL/08CiSInB2VEIicJZUQiJwVlRIj+aCInBWVEiwBMiP5di/9PAomKAgGL/0AAA4v+iSInBWVEIicJZUSL/0sCiP48CElEIicFZUSL/kxPAoj+LImKAgIigABHCIv+IlsiKmVEEkSL/oEJWzIHDkSL/iRVSSMSSUEAXiIpZUSBMhJEIicLZUQiJw1lRBJEi/6BMVsnBEsBZycHTGeL/oEhWycJTGcnBiJni/6BKVsnDkxnIiplRCMIKkxnKYFkZ4sLRCInFGVEi/5MIogB2kmM/ov/jAGMAIkiKWVEgTISFEQiJwZlRIv+iP74jP4IJwZMZ4sKgQwSQQF4i/+BIVsiJyVlRCInBWVEiP1zIickZUQIjAYiJydlREEAEyInH2VEiwYNQQAIIicfZUyMBkQiJyhlREEAEyInIGVEiwYMQQAIIicgZUyMBkQnCYsGZ4sKgQQSQQEHi/6BMVsnBEsBZycHTGeI/mVBAOeLCoEFEkEAxSIrZUQiKmVECYFkCyEECCKI68QiJwVlTIwCRCKMASKMB4v+gRlbSYwIQQAPiwKLCIj+gUmMAiOMB4wBIiplRCMIjAMiK2VEiwMNQQBSiwOI/QxJjAAkVUmMBIEDEkAAEIsEgRMSQQAziwCBGVtBACsjQQAIiwdBAAwijAeLAyMIjANC/76LAIEZW4sCTIj+JEmMAosBCIwBQv/hIkL/0osBRCInBGVEi/6BOVskGkAABiInBmVECCInBWVEiwGI/EsnDkxnIiplRCMIKkxni/4iSYgAYEmM/ov/jAGMAImL/oEpWycOTGdC/9qLCoESEkH+/yInBGVEJwdMZ0L+84sKgQsSQQAbi/6BIVtJjAVAAAgiJyZlTIwFRCcJiwVnQv66i/6BIVtJjAlB/q8nCYsJZ0L+p4oDATIIi/0iW4v9VwgBi/1XCQgyB4v9JFWL/kAARSMWSZMkDkRXBwEiJxNlRIsBSSMIiwAWTwIWUIsCUIsDUIsEFlCL/hZQTwNQi/8WUE8CFlBMFlCABJozK5VMULCL/YwAiYsFIxJAAAiLBYEEEkEABCNC/6mB/wFC/6OKAgGAAIv+i/9QSb1FAUEAH4sBvkQiWzIHSYwADkEAEIsBvkQkW4sAD0EABCOMAIkiQv/5MQAiJxJlRBJEiSInImVEFESJIichZUQURImKAQCL/4EUEkAAMIv/gRkSQAAoi/+BKBJAACCL/4EyEkAAGIv/gTwSQAAQi/+BRhJAAAiL/4FQEkEAAyNEiSJC//o=", "clear": "DIEBQw=="}, "desc": "Debt Algorand Standard Application.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "networks": {}, "source": {"approval": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCAzMiAxNTAwCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUgInN0YXR1cyIgImV2ZW50X2N1cnNvciIgInNjaGVkdWxlX2VudHJ5X2NvdW50IiAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIiAiZml4ZWRfcG9pbnRfc2NhbGUiICJhY2NydWVkX2ludGVyZXN0IiAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIgMHg0MTIzICJub21pbmFsX2ludGVyZXN0X3JhdGUiICJjb250cmFjdF90eXBlIiAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiICJyZXNlcnZlZF9wcmluY2lwYWwiICJ0b3RhbF91bml0cyIgIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iICJyZXNlcnZlZF9pbnRlcmVzdCIgImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIgMHg1MjNhNDE1MjUyMjMgInNldHRsZW1lbnRfYXNzZXRfaWQiICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIgMHg1MjNhNDE1NTU0MjMgMHg1MjNhNTA1OTQ0MjMgMHg1MjNhNGQ0ZTQ3MjMgMHg1MzIzIDB4NTIzYTRkNGY0MzIzIDB4NTIzYTU0NTI1MzIzIDB4NTIzYTRmNTA0NDIzICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiICJ0cmFuc2Zlcl9vcGVuaW5nX2RhdGUiICJ0cmFuc2Zlcl9jbG9zdXJlX2RhdGUiICJyYXRlX3Jlc2V0X2Zsb29yIiAicmF0ZV9yZXNldF9jYXAiICJjb250cmFjdF9zdXNwZW5kZWQiICJkZWZhdWx0ZWQiICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIiAicmF0ZV9yZXNldF9zcHJlYWQiICJyYXRlX3Jlc2V0X211bHRpcGxpZXIiICJyYXRlX3Jlc2V0X25leHQiICJoYXNfcmF0ZV9yZXNldF9mbG9vciIgImhhc19yYXRlX3Jlc2V0X2NhcCIgMHgwMCAicHJvc3BlY3R1c19oYXNoIiAicHJvc3BlY3R1c191cmwiICJkZW5vbWluYXRpb25fYXNzZXRfaWQiICJtYXR1cml0eV9kYXRlIiAiZGF5X2NvdW50X2NvbnZlbnRpb24iIDB4MDY4MTAxIDB4MDAwMAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4LTI5CiAgICAvLyAjIFJCQUMgUm9sZXMKICAgIC8vIHNlbGYuYXJyYW5nZXIgPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX0FSUkFOR0VSKQogICAgYnl0ZWMgMTggLy8gMHg1MjNhNDE1MjUyMjMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMAogICAgLy8gc2VsZi5vcF9kYWVtb24gPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX09QX0RBRU1PTikKICAgIGJ5dGVjIDI3IC8vIDB4NTIzYTRmNTA0NDIzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NDctNDgKICAgIC8vICMgQ29udHJhY3QgR292ZXJuYW5jZQogICAgLy8gc2VsZi5jb250cmFjdF9zdXNwZW5kZWQgPSBGYWxzZQogICAgYnl0ZWMgMzMgLy8gImNvbnRyYWN0X3N1c3BlbmRlZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjUwLTUxCiAgICAvLyAjIENvbnRyYWN0IFBlcmZvcm1hbmNlCiAgICAvLyBzZWxmLmRlZmF1bHRlZCA9IEZhbHNlCiAgICBieXRlYyAzNCAvLyAiZGVmYXVsdGVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1Ni01NwogICAgLy8gIyBDb250cmFjdAogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKQogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OAogICAgLy8gc2VsZi5jb250cmFjdF90eXBlID0gVUludDY0KCkKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MC02MQogICAgLy8gIyBQcm9zcGVjdHVzIChJbmZvcm1hdGlvbmFsKQogICAgLy8gc2VsZi5wcm9zcGVjdHVzX2hhc2ggPSBCeXRlcygpCiAgICBieXRlYyA0MiAvLyAicHJvc3BlY3R1c19oYXNoIgogICAgcHVzaGJ5dGVzIDB4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjIKICAgIC8vIHNlbGYucHJvc3BlY3R1c191cmwgPSBTdHJpbmcoKQogICAgYnl0ZWMgNDMgLy8gInByb3NwZWN0dXNfdXJsIgogICAgcHVzaGJ5dGVzICIiCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjQtNjUKICAgIC8vICMgRGVub21pbmF0aW9uCiAgICAvLyBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCA9IEFzc2V0KCkKICAgIGJ5dGVjIDQ0IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBBc3NldCgpCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjgtNjkKICAgIC8vICMgVGltZQogICAgLy8gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGUgPSB0eXAuVGltZVN0YW1wKCkKICAgIGJ5dGVjIDI4IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcwCiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSB0eXAuVGltZVN0YW1wKCkKICAgIGJ5dGVjIDQ1IC8vICJtYXR1cml0eV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MQogICAgLy8gc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgPSB0eXAuVGltZVN0YW1wKCkKICAgIGJ5dGVjIDI5IC8vICJ0cmFuc2Zlcl9vcGVuaW5nX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcyCiAgICAvLyBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgMzAgLy8gInRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzQtNzUKICAgIC8vICMgRGF5IENvdW50IENvbnZlbnRpb24KICAgIC8vIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPSBVSW50NjQoKQogICAgYnl0ZWMgNDYgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3Ny03OAogICAgLy8gIyBVbml0cwogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IFVJbnQ2NCgpCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc5CiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID0gVUludDY0KCkKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODEtODIKICAgIC8vICMgUHJpbmNpcGFsCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID0gVUludDY0KCkKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODMKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gVUludDY0KCkKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODUKICAgIC8vIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiA9IEZhbHNlCiAgICBieXRlYyAzNSAvLyAiZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODctODgKICAgIC8vICMgSW50ZXJlc3QKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OQogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ID0gVUludDY0KCkKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkxLTkyCiAgICAvLyAjIEludGVyZXN0IFJhdGVzCiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzCiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkID0gVUludDY0KCkKICAgIGJ5dGVjIDM2IC8vICJyYXRlX3Jlc2V0X3NwcmVhZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9tdWx0aXBsaWVyID0gVUludDY0KCkKICAgIGJ5dGVjIDM3IC8vICJyYXRlX3Jlc2V0X211bHRpcGxpZXIiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfZmxvb3IgPSBVSW50NjQoKQogICAgYnl0ZWMgMzEgLy8gInJhdGVfcmVzZXRfZmxvb3IiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfY2FwID0gVUludDY0KCkKICAgIGJ5dGVjIDMyIC8vICJyYXRlX3Jlc2V0X2NhcCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTcKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9uZXh0ID0gVUludDY0KCkKICAgIGJ5dGVjIDM4IC8vICJyYXRlX3Jlc2V0X25leHQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4CiAgICAvLyBzZWxmLmhhc19yYXRlX3Jlc2V0X2Zsb29yID0gRmFsc2UKICAgIGJ5dGVjIDM5IC8vICJoYXNfcmF0ZV9yZXNldF9mbG9vciIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTkKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwID0gRmFsc2UKICAgIGJ5dGVjIDQwIC8vICJoYXNfcmF0ZV9yZXNldF9jYXAiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMS0xMDIKICAgIC8vICMgUHJpbWFyeSBEaXN0cmlidXRpb24KICAgIC8vIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsID0gVUludDY0KCkKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMwogICAgLy8gc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNS0xMDYKICAgIC8vICMgQ3VtdWxhdGl2ZSBQZXItVW5pdCBGaXhlZC1Qb2ludCBJbmRleGVzCiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggPSBVSW50NjQoKQogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNwogICAgLy8gc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNQogICAgLy8gc2VsZi5ldmVudF9jdXJzb3IgPSBVSW50NjQoKQogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTYKICAgIC8vIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgPSBVSW50NjQoKQogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExOC0xMTkKICAgIC8vICMgU2NhbGluZwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjIzCiAgICAvLyBhc3NlcnQgVHhuLmdsb2JhbF9udW1fYnl0ZV9zbGljZSA9PSBjZmcuR0xPQkFMX0JZVEVTLCBlcnIuV1JPTkdfR0xPQkFMX0JZVEVTCiAgICB0eG4gR2xvYmFsTnVtQnl0ZVNsaWNlCiAgICBwdXNoaW50IDEwCiAgICA9PQogICAgYXNzZXJ0IC8vIFdyb25nIEdsb2JhbCBCeXRlcyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6MjQKICAgIC8vIGFzc2VydCBUeG4uZ2xvYmFsX251bV91aW50ID09IGNmZy5HTE9CQUxfVUlOVFMsIGVyci5XUk9OR19HTE9CQUxfVUlOVFMKICAgIHR4biBHbG9iYWxOdW1VaW50CiAgICBwdXNoaW50IDU0CiAgICA9PQogICAgYXNzZXJ0IC8vIFdyb25nIEdsb2JhbCBVSW50cyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6MjUKICAgIC8vIGFzc2VydCBUeG4ubG9jYWxfbnVtX2J5dGVfc2xpY2UgPT0gY2ZnLkxPQ0FMX0JZVEVTLCBlcnIuV1JPTkdfTE9DQUxfQllURVMKICAgIHR4biBMb2NhbE51bUJ5dGVTbGljZQogICAgIQogICAgYXNzZXJ0IC8vIFdyb25nIExvY2FsIEJ5dGVzIGFsbG9jYXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kX2FzYS9jb250cmFjdC5weToyNgogICAgLy8gYXNzZXJ0IFR4bi5sb2NhbF9udW1fdWludCA9PSBjZmcuTE9DQUxfVUlOVFMsIGVyci5XUk9OR19MT0NBTF9VSU5UUwogICAgdHhuIExvY2FsTnVtVWludAogICAgIQogICAgYXNzZXJ0IC8vIFdyb25nIExvY2FsIFVJbnRzIGFsbG9jYXRpb24KCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjgtMTgKICAgIC8vIGNsYXNzIERBU0EoCiAgICAvLyAgICAgUGF5bWVudEFnZW50LAogICAgLy8gICAgIFRyYW5zZmVyQWdlbnQsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyAgICAgYXZtX3ZlcnNpb249MTIsCiAgICAvLyApOgogICAgcHVzaGJ5dGVzIDB4OTE0ZjA0ZWIgLy8gbWV0aG9kICJjb250cmFjdF91cGRhdGUoKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX2NvbnRyYWN0X3VwZGF0ZV9yb3V0ZUA0CgptYWluX3N3aXRjaF9jYXNlX25leHRANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kX2FzYS9jb250cmFjdC5weTo4LTE4CiAgICAvLyBjbGFzcyBEQVNBKAogICAgLy8gICAgIFBheW1lbnRBZ2VudCwKICAgIC8vICAgICBUcmFuc2ZlckFnZW50LAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gICAgIGF2bV92ZXJzaW9uPTEyLAogICAgLy8gKToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJ6IG1haW5fY3JlYXRlX05vT3BAMzMKICAgIHB1c2hieXRlc3MgMHhiNDQ2MThjOCAweGU3ODMyNTI5IDB4OTQzODg3MjMgMHg2Yzg1ZTNlZSAweGJkZDFhOTQ0IDB4N2MwZjE4MTIgMHgxNGZjMTBlZiAweDc0YTcyOTdmIDB4MDlkNGZlMTQgMHg5YTliZmE4NSAweDg1ZWVkMzNkIDB4YWIyYzBmYzQgMHhkOWYyMjVhYyAweDk4ODM1MDVhIDB4OGVhNmU3NGMgMHgwMmFmNTU3YSAweDgyZjcxYjJkIDB4ZWYwNGY1ZDMgMHhkZjM0MzU1MCAweDNkYmU4MGJkIDB4MWUzZTQ4ZTcgMHgzOTI0MWZhMyAweDAxMGM4Mjk5IDB4NzQwNmFjZDIgMHgxYTcyYTJlZSAvLyBtZXRob2QgImZ1bmRfZHVlX2Nhc2hmbG93cyh1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJjbGFpbV9kdWVfY2FzaGZsb3dzKGFkZHJlc3MsYnl0ZVtdKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYnl0ZVtdKSIsIG1ldGhvZCAidHJhbnNmZXJfc2V0X3NjaGVkdWxlKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbihhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInRyYW5zZmVyKGFkZHJlc3MsYWRkcmVzcyx1aW50NjQpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X3N1c3BlbnNpb24oYWRkcmVzcyxib29sKXVpbnQ2NCIsIG1ldGhvZCAiYWNjb3VudF9vcGVuKGFkZHJlc3MsYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgImFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzcyhhZGRyZXNzLGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X2dldF9wb3NpdGlvbihhZGRyZXNzKShhZGRyZXNzLHVpbnQ2NCx1aW50NjQsYm9vbCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAiY29udHJhY3RfY29uZmlnKCh1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxib29sLGJvb2wsYm9vbCx1aW50NjQpLCh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCksKGJ5dGVbMzJdLHN0cmluZykpdWludDY0IiwgbWV0aG9kICJjb250cmFjdF9zY2hlZHVsZSh1aW50NjQsYm9vbCwodWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NClbXSl1aW50NjQiLCBtZXRob2QgImNvbnRyYWN0X2V4ZWN1dGVfaWVkKCl1aW50NjQiLCBtZXRob2QgImFwcGx5X25vbl9jYXNoX2V2ZW50KHVpbnQ2NCwodWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIsIG1ldGhvZCAiYXBwZW5kX29ic2VydmVkX2Nhc2hfZXZlbnQoKHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIsIG1ldGhvZCAiY29udHJhY3RfZ2V0X3N0YXRlKCkodWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudCgpKHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJyYmFjX3JvdGF0ZV9hcnJhbmdlcihhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19zZXRfb3BfZGFlbW9uKGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX2Fzc2lnbl9yb2xlKHVpbnQ4LGFkZHJlc3MsKHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19yZXZva2Vfcm9sZSh1aW50OCxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19jb250cmFjdF9zdXNwZW5zaW9uKGJvb2wpdWludDY0IiwgbWV0aG9kICJyYmFjX2NvbnRyYWN0X2RlZmF1bHQoYm9vbCl1aW50NjQiLCBtZXRob2QgInJiYWNfZ2V0X2FycmFuZ2VyKClhZGRyZXNzIiwgbWV0aG9kICJyYmFjX2dldF9hZGRyZXNzX3JvbGVzKGFkZHJlc3MpKGJvb2wsYm9vbCxib29sLGJvb2wsYm9vbCkiLCBtZXRob2QgInJiYWNfZ2V0X3JvbGVfdmFsaWRpdHkodWludDgsYWRkcmVzcykodWludDY0LHVpbnQ2NCkiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBmdW5kX2R1ZV9jYXNoZmxvd3MgY2xhaW1fZHVlX2Nhc2hmbG93cyB0cmFuc2Zlcl9zZXRfc2NoZWR1bGUgcHJpbWFyeV9kaXN0cmlidXRpb24gdHJhbnNmZXIgYWNjb3VudF9zdXNwZW5zaW9uIGFjY291bnRfb3BlbiBhY2NvdW50X3VwZGF0ZV9wYXltZW50X2FkZHJlc3MgYWNjb3VudF9nZXRfcG9zaXRpb24gY29udHJhY3RfY29uZmlnIGNvbnRyYWN0X3NjaGVkdWxlIGNvbnRyYWN0X2V4ZWN1dGVfaWVkIGFwcGx5X25vbl9jYXNoX2V2ZW50IGFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50IGNvbnRyYWN0X2dldF9zdGF0ZSBjb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnQgcmJhY19yb3RhdGVfYXJyYW5nZXIgcmJhY19zZXRfb3BfZGFlbW9uIHJiYWNfYXNzaWduX3JvbGUgcmJhY19yZXZva2Vfcm9sZSByYmFjX2NvbnRyYWN0X3N1c3BlbnNpb24gcmJhY19jb250cmFjdF9kZWZhdWx0IHJiYWNfZ2V0X2FycmFuZ2VyIHJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXMgcmJhY19nZXRfcm9sZV92YWxpZGl0eQogICAgZXJyCgptYWluX2NyZWF0ZV9Ob09wQDMzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjgtMTgKICAgIC8vIGNsYXNzIERBU0EoCiAgICAvLyAgICAgUGF5bWVudEFnZW50LAogICAgLy8gICAgIFRyYW5zZmVyQWdlbnQsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyAgICAgYXZtX3ZlcnNpb249MTIsCiAgICAvLyApOgogICAgcHVzaGJ5dGVzIDB4OTU2ZDcxNTYgLy8gbWV0aG9kICJjb250cmFjdF9jcmVhdGUoYWRkcmVzcyl1aW50NjQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBjb250cmFjdF9jcmVhdGUKICAgIGVycgoKbWFpbl9jb250cmFjdF91cGRhdGVfcm91dGVANDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgNCAvLyBVcGRhdGVBcHBsaWNhdGlvbgogICAgPT0KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0CiAgICBiIGNvbnRyYWN0X3VwZGF0ZQoKCi8vIF9wdXlhX2xpYi51dGlsLmVuc3VyZV9idWRnZXQocmVxdWlyZWRfYnVkZ2V0OiB1aW50NjQsIGZlZV9zb3VyY2U6IHVpbnQ2NCkgLT4gdm9pZDoKZW5zdXJlX2J1ZGdldDoKICAgIHByb3RvIDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDEwCiAgICArCgplbnN1cmVfYnVkZ2V0X3doaWxlX3RvcEAxOgogICAgZnJhbWVfZGlnIDAKICAgIGdsb2JhbCBPcGNvZGVCdWRnZXQKICAgID4KICAgIGJ6IGVuc3VyZV9idWRnZXRfYWZ0ZXJfd2hpbGVANgogICAgaXR4bl9iZWdpbgogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGJ5dGVjIDQ3IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbQogICAgYnl0ZWMgNDcgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KICAgIGZyYW1lX2RpZyAtMQogICAgc3dpdGNoIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMEAzIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMUA0CgplbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX25leHRANToKICAgIGl0eG5fc3VibWl0CiAgICBiIGVuc3VyZV9idWRnZXRfd2hpbGVfdG9wQDEKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMUA0OgogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgaXR4bl9maWVsZCBGZWUKICAgIGIgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV9uZXh0QDUKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMEAzOgogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBiIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfbmV4dEA1CgplbnN1cmVfYnVkZ2V0X2FmdGVyX3doaWxlQDY6CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnBheW1lbnRfYWdlbnQuUGF5bWVudEFnZW50LmZ1bmRfZHVlX2Nhc2hmbG93c1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmZ1bmRfZHVlX2Nhc2hmbG93czoKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gMTMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjY4CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2OQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9jb250cmFjdF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9jb250cmFjdF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3MAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9jb250cmFjdF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9jb250cmFjdF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDcKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzIKICAgIC8vIGlmIHNlbGYuX2lzX2R5bmFtaWNfYW5udWl0eSgpOgogICAgY2FsbHN1YiBfaXNfZHluYW1pY19hbm51aXR5CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzYtNzcKICAgIC8vICsgbWF4X2V2ZW50X2NvdW50CiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfRlVORF9EVUVfQ0FTSEZMT1dTX1BFUl9FVkVOVF9CVURHRVQpCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3NwogICAgLy8gKiBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19QRVJfRVZFTlRfQlVER0VUKQogICAgcHVzaGludCAxMDAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3Ni03NwogICAgLy8gKyBtYXhfZXZlbnRfY291bnQKICAgIC8vICogVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfUEVSX0VWRU5UX0JVREdFVCkKICAgICoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3NQogICAgLy8gVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfQkFTRV9CVURHRVQpCiAgICBpbnRjIDQgLy8gMTUwMAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojc1LTc3CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19CQVNFX0JVREdFVCkKICAgIC8vICsgbWF4X2V2ZW50X2NvdW50CiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfRlVORF9EVUVfQ0FTSEZMT1dTX1BFUl9FVkVOVF9CVURHRVQpCiAgICArCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzMtNzkKICAgIC8vIGVuc3VyZV9idWRnZXQoCiAgICAvLyAgICAgcmVxdWlyZWRfYnVkZ2V0PSgKICAgIC8vICAgICAgICAgVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfQkFTRV9CVURHRVQpCiAgICAvLyAgICAgICAgICsgbWF4X2V2ZW50X2NvdW50CiAgICAvLyAgICAgICAgICogVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfUEVSX0VWRU5UX0JVREdFVCkKICAgIC8vICAgICApLAogICAgLy8gKQogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4MQogICAgLy8gcHJvY2Vzc2VkX2V2ZW50cyA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjgyCiAgICAvLyBmdW5kZWRfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDE0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODMKICAgIC8vIGZ1bmRlZF9wcmluY2lwYWwgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDEzCgpmdW5kX2R1ZV9jYXNoZmxvd3Nfd2hpbGVfdG9wQDQ6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODYKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgPCBtYXhfZXZlbnRfY291bnQKICAgIGRpZyA0CiAgICBkaWcgMQogICAgPAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojg2LTg3CiAgICAvLyBwcm9jZXNzZWRfZXZlbnRzIDwgbWF4X2V2ZW50X2NvdW50CiAgICAvLyBhbmQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAMTEKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4NwogICAgLy8gYW5kIHNlbGYuZXZlbnRfY3Vyc29yIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICA8CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODYtODcKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgPCBtYXhfZXZlbnRfY291bnQKICAgIC8vIGFuZCBzZWxmLmV2ZW50X2N1cnNvciA8IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQKICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl93aGlsZUAxMQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojg5CiAgICAvLyBlbnRyeSA9IHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLmV2ZW50X2N1cnNvcikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICBkdXAKICAgIGJ1cnkgMTcKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5MAogICAgLy8gaWYgZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcDoKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSAzCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDExCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6OTIKICAgIC8vIGlmIG5vdCBzZWxmLl9ldmVudF9pc19jYXNoKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkpOgogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBidXJ5IDE2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNTEKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgaW50Y18yIC8vIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM1MC0zNTQKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX01EKSwKICAgIC8vICkKICAgID09CiAgICBkdXAKICAgIGJ1cnkgNAogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX3RydWVANTIKICAgIGRpZyAxNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzUyCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzUwLTM1NAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfTUQpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDUyCiAgICBkaWcgMTQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM1MwogICAgLy8gVUludDY0KGVudW1zLkVWVF9NRCksCiAgICBwdXNoaW50IDE5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNTAtMzU0CiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9NRCksCiAgICAvLyApCiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VANTMKCmZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX3RydWVANTI6CiAgICBpbnRjXzEgLy8gMQoKZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfbWVyZ2VANTQ6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6OTIKICAgIC8vIGlmIG5vdCBzZWxmLl9ldmVudF9pc19jYXNoKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkpOgogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NDgKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF9pZCA9PSBzZWxmLmV2ZW50X2N1cnNvciwgZXJyLklOVkFMSURfRVZFTlRfQ1VSU09SCiAgICBkaWcgMTUKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgY3Vyc29yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NDkKICAgIC8vIGFzc2VydCBlbnRyeS5zY2hlZHVsZWRfdGltZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwgZXJyLk5PX0RVRV9DQVNIRkxPVwogICAgZGlnIDEKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIDw9CiAgICBhc3NlcnQgLy8gTm8gZHVlIGNhc2hmbG93IHRvIHBheQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDEzCiAgICAvLyBpZiBldmVudF90eXBlIG5vdCBpbiAoVUludDY0KGVudW1zLkVWVF9JUCksIFVJbnQ2NChlbnVtcy5FVlRfTUQpKToKICAgIGRpZyAyCiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTUKICAgIGRpZyAxNAogICAgcHVzaGludCAxOQogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDE0CiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAxMQoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X2ludGVyZXN0X2Ftb3VudEAxNjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQyNgogICAgLy8gZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGRpZyAxNQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSAxNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDI3CiAgICAvLyBpZiBldmVudF90eXBlIG5vdCBpbiAoVUludDY0KGVudW1zLkVWVF9QUiksIFVJbnQ2NChlbnVtcy5FVlRfTUQpKToKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxOQogICAgZGlnIDE0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MjgKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDYKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTUzCiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA9IGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBkaWcgMTUKICAgIHB1c2hpbnQgNDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBidXJ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1NgogICAgLy8gaWYgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCk6CiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUAyOQogICAgZGlnIDcKICAgIGJ1cnkgOQoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzItNTc0CiAgICAvLyAjIEZ1bmRpbmcgdXNlcyBwZXItdW5pdCBjdW11bGF0aXZlIGluZGljZXMgc28gZWFjaCBob2xkZXIgY2FuIHNldHRsZQogICAgLy8gIyBpbmRlcGVuZGVudGx5IGZyb20gaXRzIGN1cnJlbnQgdW5pdCBiYWxhbmNlLgogICAgLy8gaW50ZXJlc3RfaW5kZXhfZGVsdGEgPSBzZWxmLl9hbW91bnRfdG9faW5kZXhfZGVsdGEoaW50ZXJlc3RfYW1vdW50X2R1ZSkKICAgIGRpZyAxMAogICAgY2FsbHN1YiBfYW1vdW50X3RvX2luZGV4X2RlbHRhCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzUKICAgIC8vIHByaW5jaXBhbF9pbmRleF9kZWx0YSA9IHNlbGYuX2Ftb3VudF90b19pbmRleF9kZWx0YShwcmluY2lwYWxfYW1vdW50X2R1ZSkKICAgIGRpZyA2CiAgICBjYWxsc3ViIF9hbW91bnRfdG9faW5kZXhfZGVsdGEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU3NgogICAgLy8gaW50ZXJlc3RfYW1vdW50ID0gc2VsZi5faW5kZXhfZGVsdGFfdG9fYW1vdW50KGludGVyZXN0X2luZGV4X2RlbHRhKQogICAgZGlnIDEKICAgIGNhbGxzdWIgX2luZGV4X2RlbHRhX3RvX2Ftb3VudAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBidXJ5IDE1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzcKICAgIC8vIHByaW5jaXBhbF9hbW91bnQgPSBzZWxmLl9pbmRleF9kZWx0YV90b19hbW91bnQocHJpbmNpcGFsX2luZGV4X2RlbHRhKQogICAgZHVwCiAgICBjYWxsc3ViIF9pbmRleF9kZWx0YV90b19hbW91bnQKICAgIGR1cAogICAgYnVyeSAxMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTc4CiAgICAvLyByZXF1aXJlZF9hbW91bnQgPSBpbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50CiAgICBkaWcgMgogICAgZGlnIDEKICAgICsKICAgIGR1cAogICAgYnVyeSA5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MzQKICAgIC8vIGJhbGFuY2UgPSBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBvcHRlZCBpbnRvIGFzc2V0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NTYKICAgIC8vIHJldHVybiBzZWxmLnJlc2VydmVkX2ludGVyZXN0ICsgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICBkaWcgMQogICAgKwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzM2CiAgICAvLyBhc3NlcnQgYmFsYW5jZSA+PSByZXNlcnZlZF90b3RhbCwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGRpZyAyCiAgICBkaWcgMQogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzM3CiAgICAvLyByZXR1cm4gYmFsYW5jZSAtIHJlc2VydmVkX3RvdGFsCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIC0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4MAogICAgLy8gc2VsZi5fYXZhaWxhYmxlX3NldHRsZW1lbnRfZnVuZHMoKSA+PSByZXF1aXJlZF9hbW91bnQKICAgIHVuY292ZXIgMgogICAgPj0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU3OS01ODEKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5fYXZhaWxhYmxlX3NldHRsZW1lbnRfZnVuZHMoKSA+PSByZXF1aXJlZF9hbW91bnQKICAgIC8vICksIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcyBmb3IgdGhlIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4MwogICAgLy8gc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCArPSBpbnRlcmVzdF9hbW91bnQKICAgIHVuY292ZXIgMwogICAgKwogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4NAogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgKz0gcHJpbmNpcGFsX2Ftb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIGV4aXN0cwogICAgKwogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1ODUKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCArPSBpbnRlcmVzdF9pbmRleF9kZWx0YQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggZXhpc3RzCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4NgogICAgLy8gc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCArPSBwcmluY2lwYWxfaW5kZXhfZGVsdGEKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggZXhpc3RzCiAgICArCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTg3CiAgICAvLyBpZiBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpOgogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgcHVzaGludCAzCiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUA0MAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTg4LTU4OQogICAgLy8gIyBGb3IgUFIsIHRoZSBwZXJpb2QgaW50ZXJlc3Qgc3RheXMgYWNjcnVlZCB1bnRpbCBhIGxhdGVyIElQIG9yIE1ELgogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ICs9IHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZGlnIDE2CiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBidXJ5IDE4CiAgICArCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQxOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTkyCiAgICAvLyBpZiBub3Qgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCkgb3IgZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSA9PSBVSW50NjQoCiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDQzCiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTItNTk0CiAgICAvLyBpZiBub3Qgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCkgb3IgZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSA9PSBVSW50NjQoCiAgICAvLyAgICAgZW51bXMuRVZUX01ECiAgICAvLyApOgogICAgcHVzaGludCAxOQogICAgPT0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQ0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUA0MzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5NQogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gZW50cnkubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZGlnIDE1CiAgICBwdXNoaW50IDQxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTYKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGRpZyA4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTk3CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBuZXh0X2ludGVyZXN0X2Jhc2UKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBkaWcgOQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5OAogICAgLy8gc2VsZi5ldmVudF9jdXJzb3IgKz0gVUludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAwCiAgICAvLyBpZiBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoCiAgICBkaWcgMTUKICAgIGV4dHJhY3QgOCAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MDAtNjAyCiAgICAvLyBpZiBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoCiAgICAvLyAgICAgZW51bXMuRVZUX01ECiAgICAvLyApIGFuZCBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9PSBVSW50NjQoMCk6CiAgICBwdXNoYnl0ZXMgMHgxMwogICAgYj09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0NwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAyCiAgICAvLyApIGFuZCBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9PSBVSW50NjQoMCk6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwMC02MDIKICAgIC8vIGlmIGVudHJ5LmV2ZW50X3R5cGUgPT0gYXJjNC5VSW50OCgKICAgIC8vICAgICBlbnVtcy5FVlRfTUQKICAgIC8vICkgYW5kIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID09IFVJbnQ2NCgwKToKICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0NwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAzCiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbnVtcy5TVEFUVVNfRU5ERUQpCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBwdXNoaW50IDIwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwNAogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gVUludDY0KDApCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0NzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwNi02MTAKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1pbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50LAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PWludGVyZXN0X2Ftb3VudCArIHByaW5jaXBhbF9hbW91bnQsCiAgICAvLyApCiAgICBkaWcgMTUKICAgIGRpZyA0CiAgICBkdXAKICAgIGNhbGxzdWIgX2VtaXRfZXhlY3V0aW9uX2V2ZW50CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5NgogICAgLy8gZnVuZGVkX2ludGVyZXN0ICs9IGludGVyZXN0X2Ftb3VudAogICAgZGlnIDEzCiAgICBkaWcgMTIKICAgICsKICAgIGJ1cnkgMTQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5NwogICAgLy8gZnVuZGVkX3ByaW5jaXBhbCArPSBwcmluY2lwYWxfYW1vdW50CiAgICBkaWcgMTIKICAgIGRpZyA3CiAgICArCiAgICBidXJ5IDEzCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6OTgKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgKz0gVUludDY0KDEpCiAgICBkaWcgNAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgNQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3Nfd2hpbGVfdG9wQDQKCmZ1bmRfZHVlX2Nhc2hmbG93c19lbHNlX2JvZHlANDA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTEKICAgIC8vIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0MQoKZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlAMjk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTcKICAgIC8vIGV2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ1cnkgMTYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1OC01NjAKICAgIC8vICMgRHluYW1pYyBhbm51aXRpZXMgZGVyaXZlIG5leHQgc3RhdGUgZnJvbSB0aGUgcGF5bWVudCBkZWNvbXBvc2l0aW9uLAogICAgLy8gIyBub3Qgb25seSBmcm9tIHRoZSBwcmVjb21wdXRlZCBgbmV4dF8qYCBmaWVsZHMuCiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpOgogICAgcHVzaGludCAzCiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUAzMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTYyCiAgICAvLyBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCAtIHByaW5jaXBhbF9hbW91bnRfZHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGRpZyA2CiAgICAtCiAgICBkdXAKICAgIGJ1cnkgOQogICAgYnVyeSA5CiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDMxOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY1CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9JUCk6CiAgICBkaWcgMTQKICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUAzMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY2CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGJ1cnkgOQogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY3CiAgICAvLyBuZXh0X2ludGVyZXN0X2Jhc2UgPSBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGJ1cnkgMTAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgZXhpc3RzCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDMzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY4CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCk6CiAgICBkaWcgMTQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlAMzQKICAgIGRpZyA3CiAgICBidXJ5IDkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzgKCmZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDM0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY5CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTcwCiAgICAvLyBuZXh0X2ludGVyZXN0X2Jhc2UgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzgKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDI5CiAgICAvLyBpZiBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKToKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzMAogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKToKICAgIGRpZyAxNAogICAgcHVzaGludCAxOQogICAgPT0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDIyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzEKICAgIC8vIHJldHVybiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzIKICAgIC8vIGludGVyZXN0X2R1ZSA9IHNlbGYuYWNjcnVlZF9pbnRlcmVzdCArIHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZGlnIDE2CiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBidXJ5IDE4CiAgICArCiAgICBkdXAKICAgIGJ1cnkgMTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzMwogICAgLy8gaWYgc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIDw9IGludGVyZXN0X2R1ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIGV4aXN0cwogICAgPj0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDI0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzQKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzUKICAgIC8vIHByaW5jaXBhbF9hbW91bnQgPSBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gLSBpbnRlcmVzdF9kdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIGV4aXN0cwogICAgZGlnIDEwCiAgICAtCiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDM2CiAgICAvLyBpZiBwcmluY2lwYWxfYW1vdW50ID4gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWw6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgID4KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDI2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzcKICAgIC8vIHJldHVybiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjY6CiAgICBkaWcgNgogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTIKICAgIC8vIHByaW5jaXBhbF9hbW91bnRfZHVlID0gc2VsZi5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudChlbnRyeSkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnRAMjgKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDI3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDQwCiAgICAvLyBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA8PSBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZGlnIDE1CiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBkdXAyCiAgICA8PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDM5LTQ0MQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA8PSBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NDIKICAgIC8vIHJldHVybiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCAtIGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBzd2FwCiAgICAtCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MTUKICAgIC8vIHJldHVybiBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgKyBzZWxmLl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KGVudHJ5KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgIGRpZyAxNgogICAgY2FsbHN1YiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudAogICAgYnVyeSAxOAogICAgKwogICAgYnVyeSAxMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTUxCiAgICAvLyBpbnRlcmVzdF9hbW91bnRfZHVlID0gc2VsZi5fZW50cnlfaW50ZXJlc3RfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfaW50ZXJlc3RfYW1vdW50QDE2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAMTE6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTAwCiAgICAvLyBhc3NlcnQgcHJvY2Vzc2VkX2V2ZW50cyA+IFVJbnQ2NCgwKSwgZXJyLk5PX0RVRV9DQVNIRkxPVwogICAgZGlnIDQKICAgIGR1cAogICAgYXNzZXJ0IC8vIE5vIGR1ZSBjYXNoZmxvdyB0byBwYXkKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMDQKICAgIC8vIHRvdGFsX2Z1bmRlZD1mdW5kZWRfaW50ZXJlc3QgKyBmdW5kZWRfcHJpbmNpcGFsLAogICAgZGlnIDE0CiAgICBkdXAKICAgIGRpZyAxNQogICAgZHVwCiAgICBjb3ZlciAzCiAgICArCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA2CiAgICAvLyB0aW1lc3RhbXA9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTAxLTEwNwogICAgLy8gcmV0dXJuIHR5cC5DYXNoRnVuZGluZ1Jlc3VsdCgKICAgIC8vICAgICBmdW5kZWRfaW50ZXJlc3Q9ZnVuZGVkX2ludGVyZXN0LAogICAgLy8gICAgIGZ1bmRlZF9wcmluY2lwYWw9ZnVuZGVkX3ByaW5jaXBhbCwKICAgIC8vICAgICB0b3RhbF9mdW5kZWQ9ZnVuZGVkX2ludGVyZXN0ICsgZnVuZGVkX3ByaW5jaXBhbCwKICAgIC8vICAgICBwcm9jZXNzZWRfZXZlbnRzPXByb2Nlc3NlZF9ldmVudHMsCiAgICAvLyAgICAgdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUA1MzoKICAgIGludGNfMCAvLyAwCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDU0CgoKLy8gbW9kdWxlcy5wYXltZW50X2FnZW50LlBheW1lbnRBZ2VudC5jbGFpbV9kdWVfY2FzaGZsb3dzW3JvdXRpbmddKCkgLT4gdm9pZDoKY2xhaW1fZHVlX2Nhc2hmbG93czoKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cG4gMgogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNQogICAgLy8gaWYgc2VsZi5vcF9kYWVtb24udmFsdWUgIT0gR2xvYmFsLnplcm9fYWRkcmVzczoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNyAvLyAweDUyM2E0ZjUwNDQyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wX2RhZW1vbiBleGlzdHMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE3CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjcgLy8gMHg1MjNhNGY1MDQ0MjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcF9kYWVtb24gZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE3LTE5CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIGJueiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfdHJ1ZUAxNAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE4CiAgICAvLyBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgdHhuIFNlbmRlcgogICAgZGlnIDMKICAgID09CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTctMTkKICAgIC8vIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICAvLyBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgYm56IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDE0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTkKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCAzMgogICAgPT0KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNy0xOQogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICBieiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VAMTUKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDE0OgogICAgaW50Y18xIC8vIDEKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUAxNjoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNi0yMAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyAgICAgb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vICAgICBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgLy8gKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCgpjbGFpbV9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTc6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTM5CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2NvbnRyYWN0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2NvbnRyYWN0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE0MAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9jb250cmFjdF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9jb250cmFjdF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDcKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTQzCiAgICAvLyBzZWxmLl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKGhvbGRpbmdfYWRkcmVzcykKICAgIGRpZyAyCiAgICBkdXAKICAgIGNhbGxzdWIgX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNDQKICAgIC8vIHNlbGYuX3NldHRsZV9wb3NpdGlvbihob2xkaW5nX2FkZHJlc3MpCiAgICBjYWxsc3ViIF9zZXR0bGVfcG9zaXRpb24KICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExNwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY2xhaW1hYmxlX2ludGVyZXN0CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBkdXAKICAgIHB1c2hpbnQgNzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExOAogICAgLy8gKyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jbGFpbWFibGVfcHJpbmNpcGFsCiAgICBkdXAKICAgIHB1c2hpbnQgODEKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExNy0xMTgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNsYWltYWJsZV9pbnRlcmVzdAogICAgLy8gKyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jbGFpbWFibGVfcHJpbmNpcGFsCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTQ2CiAgICAvLyBhc3NlcnQgdG90YWxfYW1vdW50ID4gVUludDY0KDApLCBlcnIuTk9fRFVFX0NBU0hGTE9XCiAgICBhc3NlcnQgLy8gTm8gZHVlIGNhc2hmbG93IHRvIHBheQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI1CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MuaXNfb3B0ZWRfaW4oCiAgICBleHRyYWN0IDAgMzIKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNgogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNS0yNwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLmlzX29wdGVkX2luKAogICAgLy8gICAgIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZAogICAgLy8gKQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNS0yOAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLmlzX29wdGVkX2luKAogICAgLy8gICAgIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZAogICAgLy8gKQogICAgLy8gYW5kIG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQKICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAyNAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI4CiAgICAvLyBhbmQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCAzODQKICAgIGdldGJpdAogICAgYm56IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAyNAogICAgaW50Y18xIC8vIDEKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUAyNToKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNTEKICAgIC8vIGlmIHNlbGYuX2lzX3BheW1lbnRfZXhlY3V0YWJsZShob2xkaW5nX2FkZHJlc3MpOgogICAgYnogY2xhaW1fZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozNAogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIHN3YXAKICAgIGRpZyAxCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozNC0zNQogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIC8vID49IHBheW1lbnRfYW1vdW50CiAgICBkaWcgNQogICAgZHVwCiAgICBjb3ZlciAyCiAgICA+PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjMzLTM2CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICAvLyAgICAgPj0gcGF5bWVudF9hbW91bnQKICAgIC8vICksIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcyBmb3IgdGhlIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNTMKICAgIC8vIHNlbGYuX3BheShzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MsIHRvdGFsX2Ftb3VudCkKICAgIGRpZyAyCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBkdXAKICAgIGV4dHJhY3QgMCAzMgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQwLTQ1CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9cmVjZWl2ZXIsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWFtb3VudCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQ0CiAgICAvLyBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgdW5jb3ZlciAzCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIHVuY292ZXIgMgogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0MAogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgcHVzaGludCA0IC8vIGF4ZmVyCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQwLTQ1CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9cmVjZWl2ZXIsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWFtb3VudCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMjUtMTI2CiAgICAvLyAjIEdldCB0aGUgY2xhaW1hYmxlIGFtb3VudHMgYmVmb3JlIHJlc2V0CiAgICAvLyBpbnRlcmVzdF9hbW91bnQgPSBwb3NpdGlvbi5jbGFpbWFibGVfaW50ZXJlc3QKICAgIGR1cAogICAgcHVzaGludCA3MwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSA5CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTI3CiAgICAvLyBwcmluY2lwYWxfYW1vdW50ID0gcG9zaXRpb24uY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgZHVwCiAgICBwdXNoaW50IDgxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAzCiAgICBidXJ5IDkKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMjktMTMwCiAgICAvLyAjIFJlc2V0IHRoZSBwb3NpdGlvbidzIGNsYWltYWJsZSBhbW91bnRzCiAgICAvLyBwb3NpdGlvbi5jbGFpbWFibGVfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBpdG9iCiAgICBzd2FwCiAgICBkaWcgMQogICAgcmVwbGFjZTIgNzMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzEKICAgIC8vIHBvc2l0aW9uLmNsYWltYWJsZV9wcmluY2lwYWwgPSBVSW50NjQoMCkKICAgIHN3YXAKICAgIHJlcGxhY2UyIDgxCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTMyCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHBvc2l0aW9uLmNvcHkoKQogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTM0CiAgICAvLyBhc3NlcnQgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCA+PSBpbnRlcmVzdF9hbW91bnQsIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX2ludGVyZXN0IGV4aXN0cwogICAgZHVwCiAgICBkaWcgMgogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzNQogICAgLy8gYXNzZXJ0IHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsID49IHByaW5jaXBhbF9hbW91bnQsIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICBkaWcgMwogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzNy0xMzgKICAgIC8vICMgVXBkYXRlIHRoZSBnbG9iYWwgcmVzZXJ2ZWQgaW50ZXJlc3QgYW5kIHByaW5jaXBhbCBhbW91bnRzCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0IC09IGludGVyZXN0X2Ftb3VudAogICAgc3dhcAogICAgLQogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzkKICAgIC8vIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIC09IHByaW5jaXBhbF9hbW91bnQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIHN3YXAKICAgIC0KICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKY2xhaW1fZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTU5CiAgICAvLyB0b3RhbF9hbW91bnQ9aW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudCwKICAgIGRpZyA1CiAgICBkdXAKICAgIGRpZyA2CiAgICBkdXAKICAgIGNvdmVyIDMKICAgICsKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNjAKICAgIC8vIHRpbWVzdGFtcD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNTYtMTYyCiAgICAvLyByZXR1cm4gdHlwLkNhc2hDbGFpbVJlc3VsdCgKICAgIC8vICAgICBpbnRlcmVzdF9hbW91bnQ9aW50ZXJlc3RfYW1vdW50LAogICAgLy8gICAgIHByaW5jaXBhbF9hbW91bnQ9cHJpbmNpcGFsX2Ftb3VudCwKICAgIC8vICAgICB0b3RhbF9hbW91bnQ9aW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudCwKICAgIC8vICAgICB0aW1lc3RhbXA9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgY29udGV4dD1wYXltZW50X2luZm8sCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgMgogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIHB1c2hieXRlcyAweDAwMjIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAyNDoKICAgIGludGNfMCAvLyAwCiAgICBiIGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUAyNQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX2ZhbHNlQDE1OgogICAgaW50Y18wIC8vIDAKICAgIGIgY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDE2CgoKLy8gbW9kdWxlcy50cmFuc2Zlcl9hZ2VudC5UcmFuc2ZlckFnZW50LnRyYW5zZmVyX3NldF9zY2hlZHVsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRyYW5zZmVyX3NldF9zY2hlZHVsZToKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo0MAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQxCiAgICAvLyBhc3NlcnQgb3Blbl9kYXRlIDwgY2xvc3VyZV9kYXRlLCBlcnIuSU5WQUxJRF9TT1JUSU5HCiAgICBkdXAyCiAgICA8CiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbXVzdCBiZSBzb3J0ZWQgaW4gc3RyaWN0bHkgYXNjZW5kaW5nIG9yZGVyCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQzCiAgICAvLyBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA9IG9wZW5fZGF0ZQogICAgYnl0ZWMgMjkgLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIHVuY292ZXIgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDQKICAgIC8vIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlID0gY2xvc3VyZV9kYXRlCiAgICBieXRlYyAzMCAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDUKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy50cmFuc2Zlcl9hZ2VudC5UcmFuc2ZlckFnZW50LnByaW1hcnlfZGlzdHJpYnV0aW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcHJpbWFyeV9kaXN0cmlidXRpb246CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjczCiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5wcmltYXJ5X2RlYWxlciwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDIyIC8vIDB4NTIzYTUwNTk0NDIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojc2CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2NvbnRyYWN0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2NvbnRyYWN0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo3NwogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9jb250cmFjdF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9jb250cmFjdF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojc4CiAgICAvLyBhc3NlcnQgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TRUQKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBjbG9zZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgY292ZXIgMwogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4MAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChob2xkaW5nX2FkZHJlc3MpCiAgICBzd2FwCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjgxCiAgICAvLyBhc3NlcnQgdW5pdHMgPiBVSW50NjQoMCksIGVyci5aRVJPX1VOSVRTCiAgICBkdXAKICAgIGFzc2VydCAvLyBDYW4gbm90IGRpc3RyaWJ1dGUgemVybyB1bml0cwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4MwogICAgLy8gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCArIHVuaXRzIDw9IHNlbGYudG90YWxfdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICArCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgPD0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODItODQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCArIHVuaXRzIDw9IHNlbGYudG90YWxfdW5pdHMKICAgIC8vICksIGVyci5PVkVSX0RJU1RSSUJVVElPTgogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCByZW1haW5pbmcgRC1BU0EgdW5pdHMKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODUKICAgIC8vIGlmIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI4IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlIGV4aXN0cwogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojg3CiAgICAvLyBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8PSBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI4IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlIGV4aXN0cwogICAgPD0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODYtODgKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPD0gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGUKICAgIC8vICksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TRUQKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBjbG9zZWQKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNDgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnJlc2VydmVkX3VuaXRzICs9IHVuaXRzCiAgICBkdXBuIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDMKICAgIGR1cAogICAgY292ZXIgMwogICAgKwogICAgaXRvYgogICAgcHVzaGludCA0MAogICAgc3dhcAogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6OTEKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgKz0gdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICArCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6OTIKICAgIC8vIHJldHVybiBzZWxmLnRvdGFsX3VuaXRzIC0gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIHN3YXAKICAgIC0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMudHJhbnNmZXJfYWdlbnQuVHJhbnNmZXJBZ2VudC50cmFuc2Zlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnRyYW5zZmVyOgogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTMwCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2NvbnRyYWN0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2NvbnRyYWN0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxMzEKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfY29udHJhY3Rfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfY29udHJhY3Rfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQ3CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuX3N0YXR1c19pc19wZW5kaW5nX2llZCgpLCBlcnIuUEVORElOR19JRUQKICAgICEKICAgIGFzc2VydCAvLyBJRUQgbm90IHlldCBleGVjdXRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxMwogICAgLy8gaWYgc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjkgLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICBieiB0cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTUKICAgIC8vIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjkgLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNC0xNgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gKSwgZXJyLkNMT1NFRF9UUkFOU0ZFUgogICAgYXNzZXJ0IC8vIFRyYW5zZmVyIGlzIGNsb3NlZAoKdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNwogICAgLy8gaWYgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzAgLy8gInRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICBieiB0cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTkKICAgIC8vIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDwgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGUKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMCAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIDwKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTgtMjAKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZQogICAgLy8gKSwgZXJyLkNMT1NFRF9UUkFOU0ZFUgogICAgYXNzZXJ0IC8vIFRyYW5zZmVyIGlzIGNsb3NlZAoKdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxMzUKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIGRpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA4CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIGJ5dGVjIDggLy8gMHg0MTIzCiAgICBkaWcgNQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA5CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjEzOAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChzZW5kZXJfaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDIKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTM5CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGR1cAogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNDAKICAgIC8vIGFzc2VydCBzZW5kZXJfaG9sZGluZ19hZGRyZXNzICE9IHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcywgZXJyLlNFTEZfVFJBTlNGRVIKICAgIHVuY292ZXIgMgogICAgIT0KICAgIGFzc2VydCAvLyBTZW5kZXIgYW5kIHJlY2VpdmVyIG11c3QgYmUgZGlmZmVyZW50CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE0MQogICAgLy8gYXNzZXJ0IHVuaXRzID4gVUludDY0KDApLCBlcnIuTlVMTF9UUkFOU0ZFUgogICAgZGlnIDEKICAgIGR1cAogICAgYXNzZXJ0IC8vIFRyYW5zZmVyIHVuaXRzIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTQyCiAgICAvLyBhc3NlcnQgdW5pdHMgPD0gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLCBlcnIuT1ZFUl9UUkFOU0ZFUgogICAgc3dhcAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIDw9CiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IHNlbmRlciB1bml0cyB0byB0cmFuc2ZlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzYzCiAgICAvLyBpZiBzZWxmLmV2ZW50X2N1cnNvciA+PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICA+PQogICAgYm56IHRyYW5zZmVyX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Fzc2VydF9ub19kdWVfZXZlbnRfcGVuZGluZ0AxMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzY1CiAgICAvLyBuZXh0X2VudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KHNlbGYuZXZlbnRfY3Vyc29yKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc2NwogICAgLy8gbmV4dF9lbnRyeS5zY2hlZHVsZWRfdGltZSA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NjYtNzY4CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIG5leHRfZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gKSwgZXJyLlBFTkRJTkdfQUNUVVNfRVZFTlQKICAgIGFzc2VydCAvLyBBQ1RVUyBldmVudCBub3QgeWV0IGV4ZWN1dGVkCgp0cmFuc2Zlcl9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9hc3NlcnRfbm9fZHVlX2V2ZW50X3BlbmRpbmdAMTA6CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE0NQogICAgLy8gc2VsZi5fZW5zdXJlX3VuaXRzX2FjdGl2YXRlZChzZW5kZXJfaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDMKICAgIGR1cAogICAgY2FsbHN1YiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNDYKICAgIC8vIHNlbGYuX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQocmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgY2FsbHN1YiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNDcKICAgIC8vIHNlbGYuX3NldHRsZV9wb3NpdGlvbihzZW5kZXJfaG9sZGluZ19hZGRyZXNzKQogICAgY2FsbHN1YiBfc2V0dGxlX3Bvc2l0aW9uCiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTQ4CiAgICAvLyBzZWxmLl9zZXR0bGVfcG9zaXRpb24ocmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzKQogICAgY2FsbHN1YiBfc2V0dGxlX3Bvc2l0aW9uCiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNTIKICAgIC8vIGFzc2VydCB1bml0cyA8PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cywgZXJyLk9WRVJfVFJBTlNGRVIKICAgIGRpZyA1CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkaWcgMQogICAgPD0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgc2VuZGVyIHVuaXRzIHRvIHRyYW5zZmVyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTUzCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyAtPSB1bml0cwogICAgZGlnIDEKICAgIC0KICAgIGl0b2IKICAgIHVuY292ZXIgMgogICAgaW50Y18zIC8vIDMyCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTQ0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyArPSB1bml0cwogICAgZGlnIDUKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIHVuY292ZXIgMgogICAgKwogICAgaXRvYgogICAgaW50Y18zIC8vIDMyCiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfc3VzcGVuc2lvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfc3VzcGVuc2lvbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojc5CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyMSAvLyAweDUyM2E0MTU1NTQyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE4NQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkID0gc3VzcGVuZGVkCiAgICBkdXAKICAgIHB1c2hpbnQgNDgKICAgIGludGNfMSAvLyAxCiAgICBib3hfZXh0cmFjdAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMwogICAgc2V0Yml0CiAgICBwdXNoaW50IDQ4CiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE4NgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTY1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5hY2NvdW50X29wZW5bcm91dGluZ10oKSAtPiB2b2lkOgphY2NvdW50X29wZW46CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzAKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmFjY291bnRfbWFuYWdlciwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDIzIC8vIDB4NTIzYTRkNGU0NzIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzkKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0VOREVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDIwMAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTAKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX2VuZGVkKCksIGVyci5VTkFVVEhPUklaRUQKICAgICEKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxMQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9jb250cmFjdF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9jb250cmFjdF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTIKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfY29udHJhY3Rfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfY29udHJhY3Rfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjEzCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozNAogICAgLy8gdW5pdHM9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozMi00MgogICAgLy8gcmV0dXJuIHR5cC5BY2NvdW50UG9zaXRpb24oCiAgICAvLyAgICAgcGF5bWVudF9hZGRyZXNzPXBheW1lbnRfYWRkcmVzcywKICAgIC8vICAgICB1bml0cz1VSW50NjQoMCksCiAgICAvLyAgICAgcmVzZXJ2ZWRfdW5pdHM9VUludDY0KDApLAogICAgLy8gICAgIHN1c3BlbmRlZD1GYWxzZSwKICAgIC8vICAgICBzZXR0bGVkX2N1cnNvcj1VSW50NjQoMCksCiAgICAvLyAgICAgaW50ZXJlc3RfY2hlY2twb2ludD1VSW50NjQoMCksCiAgICAvLyAgICAgcHJpbmNpcGFsX2NoZWNrcG9pbnQ9VUludDY0KDApLAogICAgLy8gICAgIGNsYWltYWJsZV9pbnRlcmVzdD1VSW50NjQoMCksCiAgICAvLyAgICAgY2xhaW1hYmxlX3ByaW5jaXBhbD1VSW50NjQoMCksCiAgICAvLyApCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGJ5dGVjIDQxIC8vIDB4MDAKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjE0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHNlbGYuX25ld19hY2NvdW50X3Bvc2l0aW9uKHBheW1lbnRfYWRkcmVzcykKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTUKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjM4CiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIHVuY292ZXIgMwogICAgPT0KICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIzOQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9jb250cmFjdF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9jb250cmFjdF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDAKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfY29udHJhY3Rfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfY29udHJhY3Rfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQxCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MgPSBwYXltZW50X2FkZHJlc3MKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQyCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfZ2V0X3Bvc2l0aW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF9nZXRfcG9zaXRpb246CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNTkKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9jcmVhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9jcmVhdGU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDE5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAzMwogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IGFycmFuZ2VyCiAgICBieXRlYyAxOCAvLyAweDUyM2E0MTUyNTIyMwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMzQKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAxOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfY29uZmlnW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfY29uZmlnOgogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBsZW4KICAgIHB1c2hpbnQgMTA3CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLk5vcm1hbGl6ZWRBY3R1c1Rlcm1zCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgcHVzaGludCA3MgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5Jbml0aWFsS2VybmVsU3RhdGUKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBsZW4KICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIHR1cGxlIGVuY29kaW5nCiAgICBkdXAKICAgIHB1c2hpbnQgMzQKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCB0YWlsIHBvaW50ZXIgYXQgaW5kZXggMSBvZiAodWludDhbMzJdLChsZW4rdXRmOFtdKSkKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgY292ZXIgMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMzYKICAgICsKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuUHJvc3BlY3R1cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2NgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDY4LTEwNjkKICAgIC8vICMgQ29uZmlndXJlIENvbnRyYWN0CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPSB0ZXJtcy5jb250cmFjdF90eXBlLmFzX3VpbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgYnogY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUA3CiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIyMAogICAgLy8gVUludDY0KGVudW1zLkNUX0FOTiksCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIxCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfTkFNKSwKICAgIHB1c2hpbnQgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIyCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfTEFNKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIzCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfTEFYKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjI0CiAgICAvLyBVSW50NjQoZW51bXMuQ1RfQ0xNKSwKICAgIHB1c2hpbnQgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJ6IGNvbnRyYWN0X2NvbmZpZ19ib29sX2ZhbHNlQDgKCmNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANzoKICAgIGludGNfMSAvLyAxCgpjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUA5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjI5CiAgICAvLyBhc3NlcnQgc2VsZi5faXNfc3VwcG9ydGVkX2NvbnRyYWN0X3R5cGUoY29udHJhY3RfdHlwZSksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3MQogICAgLy8gc2VsZi5fc3RvcmVfY29udHJhY3RfY29uZmlnKHNlbGYuY29udHJhY3RfdHlwZSwgdGVybXMsIGluaXRpYWxfc3RhdGUpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgYnVyeSAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzI1CiAgICAvLyBhc3NlcnQgdGVybXMuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZGlnIDQKICAgIGR1cAogICAgcHVzaGludCAzMwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSA4CiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMjcKICAgIC8vIHRlcm1zLmRheV9jb3VudF9jb252ZW50aW9uLmFzX3VpbnQ2NCgpCiAgICBwdXNoaW50IDU3CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICBieiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDE2CiAgICBkaWcgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk5CiAgICAvLyBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI5Ny0zMDMKICAgIC8vIHJldHVybiBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzYwKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwSVNEQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjApLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDE2CiAgICBkaWcgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzAwCiAgICAvLyBVSW50NjQoZW51bXMuRENDX0EzNjUpLAogICAgcHVzaGludCAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyOTctMzAzCiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgID09CiAgICBibnogY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUAxNgogICAgZGlnIDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMwMQogICAgLy8gVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGRpZyA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDIKICAgIC8vIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICA9PQogICAgYnogY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAMTcKCmNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTY6CiAgICBpbnRjXzEgLy8gMQoKY29udHJhY3RfY29uZmlnX2Jvb2xfbWVyZ2VAMTg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDktMzExCiAgICAvLyBhc3NlcnQgc2VsZi5faXNfc3VwcG9ydGVkX2RheV9jb3VudF9jb252ZW50aW9uKAogICAgLy8gICAgIGRheV9jb3VudF9jb252ZW50aW9uCiAgICAvLyApLCBlcnIuSU5WQUxJRF9EQVlfQ09VTlRfQ09OVkVOVElPTgogICAgYXNzZXJ0IC8vIEludmFsaWQgZGF5LWNvdW50IGNvbnZlbnRpb24gSUQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMyOQogICAgLy8gaWYgY29udHJhY3RfdHlwZSAhPSBVSW50NjQoZW51bXMuQ1RfQU5OKToKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgICE9CiAgICBieiBjb250cmFjdF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzMwCiAgICAvLyBhc3NlcnQgbm90IHRlcm1zLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24sIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZGlnIDQKICAgIHB1c2hpbnQgNzg2CiAgICBnZXRiaXQKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KCmNvbnRyYWN0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDIwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODA3CiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIEQtQVNBIGFscmVhZHkgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODA4CiAgICAvLyBhc3NlcnQgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCA9PSBVSW50NjQoMCksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMCAvLyAiaW5pdGlhbF9leGNoYW5nZV9hbW91bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTAtODExCiAgICAvLyAjIFNldCBEZW5vbWluYXRpb24gQXNzZXQKICAgIC8vIHNlbGYuX2Fzc2VydF9kZW5vbWluYXRpb25fYXNzZXQodGVybXMuZGVub21pbmF0aW9uX2Fzc2V0X2lkKQogICAgZGlnIDQKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NzUtNzc2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIGRlbm9taW5hdGlvbiB3aXRoIEFTQQogICAgLy8gX2NyZWF0b3IsIGV4aXN0cyA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X2NyZWF0b3IoZGVub21pbmF0aW9uX2Fzc2V0X2lkKQogICAgZHVwCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q3JlYXRvcgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NzcKICAgIC8vIGFzc2VydCBleGlzdHMsIGVyci5JTlZBTElEX0RFTk9NSU5BVElPTgogICAgYXNzZXJ0IC8vIERlbm9taW5hdGlvbiBhc3NldCBpcyBub3QgcHJvcGVybHkgc2V0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODAKICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICBieXRlYyA0NCAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTQtODE1CiAgICAvLyAjIFNldCBTZXR0bGVtZW50IEFzc2V0CiAgICAvLyBzZWxmLl9hc3NlcnRfc2V0dGxlbWVudF9hc3NldCh0ZXJtcy5zZXR0bGVtZW50X2Fzc2V0X2lkKQogICAgZGlnIDEKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc4NQogICAgLy8gc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODMtNzg2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc2V0dGxlbWVudCBhc3NldCBpcyB0aGUgZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQgPT0gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIC8vICksIGVyci5JTlZBTElEX1NFVFRMRU1FTlRfQVNTRVQKICAgIGFzc2VydCAvLyBEaWZmZXJlbnQgc2V0dGxlbWVudCBhc3NldCBub3Qgc3VwcG9ydGVkLCBtdXN0IGJlIGVxdWFsIHRvIGRlbm9taW5hdGlvbiBhc3NldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Nzg5CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBzZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkwLTc5NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhc3NldF9hbW91bnQ9MCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Nzk1CiAgICAvLyBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkzCiAgICAvLyBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc5NAogICAgLy8gYXNzZXRfYW1vdW50PTAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkwLTc5MQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3OTAtNzk2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODE4LTgxOQogICAgLy8gIyBVbml0cwogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IHRlcm1zLnRvdGFsX3VuaXRzCiAgICBkdXAKICAgIHB1c2hpbnQgMTcKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODIwCiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID0gVUludDY0KDApCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgyMi04MjMKICAgIC8vICMgRGF5LUNvdW50IENvbnZlbnRpb25zCiAgICAvLyBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uID0gdGVybXMuZGF5X2NvdW50X2NvbnZlbnRpb24uYXNfdWludDY0KCkKICAgIGJ5dGVjIDQ2IC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGRpZyA4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODI1LTgyNgogICAgLy8gIyBUaW1lCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA9IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZQogICAgZHVwCiAgICBwdXNoaW50IDQxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMjggLy8gImluaXRpYWxfZXhjaGFuZ2VfZGF0ZSIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODI3CiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSB0ZXJtcy5tYXR1cml0eV9kYXRlCiAgICBkaWcgMQogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDQ1IC8vICJtYXR1cml0eV9kYXRlIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MjgKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IGluaXRpYWxfc3RhdGUubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZGlnIDYKICAgIGR1cAogICAgY292ZXIgMgogICAgcHVzaGludCA0OAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzMC04MzEKICAgIC8vICMgUHJpbmNpcGFsCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID0gdGVybXMuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGRpZyAxMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzMgogICAgLy8gc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gdGVybXMuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZGlnIDMKICAgIHB1c2hpbnQgNzg2CiAgICBnZXRiaXQKICAgIGJ5dGVjIDM1IC8vICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzMwogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBpbml0aWFsX3N0YXRlLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZGlnIDEKICAgIHB1c2hpbnQgMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODM1LTgzNgogICAgLy8gIyBJbnRlcmVzdAogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ID0gaW5pdGlhbF9zdGF0ZS5hY2NydWVkX2ludGVyZXN0CiAgICBkaWcgMQogICAgcHVzaGludCA0MAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODM4LTgzOQogICAgLy8gIyBJbnRlcmVzdCBSYXRlCiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IGluaXRpYWxfc3RhdGUubm9taW5hbF9pbnRlcmVzdF9yYXRlCiAgICBkaWcgMQogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0MAogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gaW5pdGlhbF9zdGF0ZS5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlCiAgICBkaWcgMQogICAgcHVzaGludCAyNAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQxCiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkID0gdGVybXMucmF0ZV9yZXNldF9zcHJlYWQKICAgIGRpZyAzCiAgICBwdXNoaW50IDU4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzYgLy8gInJhdGVfcmVzZXRfc3ByZWFkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0MgogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIgPSB0ZXJtcy5yYXRlX3Jlc2V0X211bHRpcGxpZXIKICAgIGRpZyAzCiAgICBwdXNoaW50IDY2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzcgLy8gInJhdGVfcmVzZXRfbXVsdGlwbGllciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDMKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9mbG9vciA9IHRlcm1zLnJhdGVfcmVzZXRfZmxvb3IKICAgIGRpZyAzCiAgICBwdXNoaW50IDc0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzEgLy8gInJhdGVfcmVzZXRfZmxvb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQ0CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfY2FwID0gdGVybXMucmF0ZV9yZXNldF9jYXAKICAgIGRpZyAzCiAgICBwdXNoaW50IDgyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzIgLy8gInJhdGVfcmVzZXRfY2FwIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0NQogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X25leHQgPSB0ZXJtcy5yYXRlX3Jlc2V0X25leHQKICAgIGRpZyAzCiAgICBwdXNoaW50IDkwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzggLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDYKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgPSB0ZXJtcy5oYXNfcmF0ZV9yZXNldF9mbG9vcgogICAgZGlnIDMKICAgIHB1c2hpbnQgNzg0CiAgICBnZXRiaXQKICAgIGJ5dGVjIDM5IC8vICJoYXNfcmF0ZV9yZXNldF9mbG9vciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDcKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwID0gdGVybXMuaGFzX3JhdGVfcmVzZXRfY2FwCiAgICBkaWcgMwogICAgcHVzaGludCA3ODUKICAgIGdldGJpdAogICAgYnl0ZWMgNDAgLy8gImhhc19yYXRlX3Jlc2V0X2NhcCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDktODUwCiAgICAvLyAjIFNjYWxpbmcKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgPSB0ZXJtcy5maXhlZF9wb2ludF9zY2FsZQogICAgdW5jb3ZlciAzCiAgICBwdXNoaW50IDk5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODUyLTg1MwogICAgLy8gIyBTY2hlZHVsZSBQcm9jZXNzaW5nCiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciA9IGluaXRpYWxfc3RhdGUuZXZlbnRfY3Vyc29yCiAgICBkaWcgMQogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU1LTg1NgogICAgLy8gIyBQZXItVW5pdCBGaXhlZC1Qb2ludCBJbmRleGVzCiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggPSBpbml0aWFsX3N0YXRlLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgKICAgIGRpZyAxCiAgICBwdXNoaW50IDU2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU3CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4ID0gaW5pdGlhbF9zdGF0ZS5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleAogICAgZGlnIDEKICAgIHB1c2hpbnQgNjQKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU5LTg2MAogICAgLy8gIyBSZXNlcnZlZCBBbW91bnQgKGZvciBleGVjdXRlZCBjYXNoZmxvd3MpCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0ID0gVUludDY0KDApCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2MQogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2MwogICAgLy8gYXNzZXJ0IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLCBlcnIuSU5WQUxJRF9JRUQKICAgIGRpZyAyCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICBhc3NlcnQgLy8gSUVEIG11c3QgYmUgc2V0IGluIHRoZSBmdXR1cmUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2NAogICAgLy8gYXNzZXJ0IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA+IGluaXRpYWxfc3RhdGUuc3RhdHVzX2RhdGUsIGVyci5JTlZBTElEX0lFRAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgPAogICAgYXNzZXJ0IC8vIElFRCBtdXN0IGJlIHNldCBpbiB0aGUgZnV0dXJlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NjUKICAgIC8vIGFzc2VydCB0ZXJtcy5pbml0aWFsX2V4Y2hhbmdlX2RhdGUgPCB0ZXJtcy5tYXR1cml0eV9kYXRlLCBlcnIuSU5WQUxJRF9JRUQKICAgIDwKICAgIGFzc2VydCAvLyBJRUQgbXVzdCBiZSBzZXQgaW4gdGhlIGZ1dHVyZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3My0xMDc0CiAgICAvLyAjIE5vdGFyaXplIHByb3NwZWN0dXMgKG9wdGlvbmFsKQogICAgLy8gc2VsZi5wcm9zcGVjdHVzX2hhc2ggPSBwcm9zcGVjdHVzLmhhc2guYnl0ZXMKICAgIGRpZyAyCiAgICBleHRyYWN0IDAgMzIKICAgIGJ5dGVjIDQyIC8vICJwcm9zcGVjdHVzX2hhc2giCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3NQogICAgLy8gc2VsZi5wcm9zcGVjdHVzX3VybCA9IHByb3NwZWN0dXMudXJsCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGVjIDQzIC8vICJwcm9zcGVjdHVzX3VybCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc2CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAMTc6CiAgICBpbnRjXzAgLy8gMAogICAgYiBjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUAxOAoKY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAODoKICAgIGludGNfMCAvLyAwCiAgICBiIGNvbnRyYWN0X2NvbmZpZ19ib29sX21lcmdlQDkKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9zY2hlZHVsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X3NjaGVkdWxlOgogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHN3YXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBkdXAKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgMgogICAgKwogICAgdW5jb3ZlciAyCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLkV4ZWN1dGlvblNjaGVkdWxlRW50cnk+CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTEwCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMTMKICAgIC8vIGNvbnRyYWN0X3R5cGU9c2VsZi5jb250cmFjdF90eXBlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGNvdmVyIDMKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4ODEKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4ODItODg0CiAgICAvLyBhc3NlcnQgc2NoZWR1bGVfcGFnZS5sZW5ndGggPD0gVUludDY0KAogICAgLy8gICAgIGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUKICAgIC8vICksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGR1cAogICAgcHVzaGludCAxNgogICAgPD0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg4NQogICAgLy8gYXNzZXJ0IHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPiBVSW50NjQoMCksIGVyci5URVJNU19OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSB0ZXJtcyBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODg3CiAgICAvLyBwYWdlX2N1cnNvciA9IHNjaGVkdWxlX3BhZ2VfaW5kZXggKiBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkKICAgIHN3YXAKICAgIHB1c2hpbnQgMTYKICAgICoKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg5NAogICAgLy8gKyBwYWdlX2xlbmd0aCAqIFVJbnQ2NChjc3QuT1BfVVBfQ09OVFJBQ1RfQ09ORklHX1BFUl9FTlRSWV9CVURHRVQpCiAgICBwdXNoaW50IDEwMAogICAgKgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODkzCiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19CQVNFX0JVREdFVCkKICAgIGludGMgNCAvLyAxNTAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTMtODk0CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19CQVNFX0JVREdFVCkKICAgIC8vICsgcGFnZV9sZW5ndGggKiBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19QRVJfRU5UUllfQlVER0VUKQogICAgKwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODg5LTg5NgogICAgLy8gIyBWYWxpZGF0aW9uIGNvc3QgZ3Jvd3Mgd2l0aCBwYWdlIGxlbmd0aCwgc28gY29uZmlndXJhdGlvbiBleHBsaWNpdGx5CiAgICAvLyAjIGJ1eXMgZXh0cmEgb3Bjb2RlIGJ1ZGdldCBmb3IgbGFyZ2VyIHVwbG9hZHMuCiAgICAvLyBlbnN1cmVfYnVkZ2V0KAogICAgLy8gICAgIHJlcXVpcmVkX2J1ZGdldD0oCiAgICAvLyAgICAgICAgIFVJbnQ2NChjc3QuT1BfVVBfQ09OVFJBQ1RfQ09ORklHX0JBU0VfQlVER0VUKQogICAgLy8gICAgICAgICArIHBhZ2VfbGVuZ3RoICogVUludDY0KGNzdC5PUF9VUF9DT05UUkFDVF9DT05GSUdfUEVSX0VOVFJZX0JVREdFVCkKICAgIC8vICAgICApLAogICAgLy8gKQogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODk3CiAgICAvLyBpbmRleCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKCmNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEAyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODk4CiAgICAvLyB3aGlsZSBpbmRleCA8IHBhZ2VfbGVuZ3RoOgogICAgZHVwCiAgICBkaWcgNAogICAgPAogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfd2hpbGVAMTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg5OS05MDAKICAgIC8vIGVudHJ5ID0gc2NoZWR1bGVfcGFnZVtpbmRleF0uY29weSgpCiAgICAvLyBlbnRyeV9ldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZGlnIDQKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGJ1cnkgMTIKICAgIGRpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgNjUKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTAwCiAgICAvLyBlbnRyeV9ldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTktOTAwCiAgICAvLyBlbnRyeSA9IHNjaGVkdWxlX3BhZ2VbaW5kZXhdLmNvcHkoKQogICAgLy8gZW50cnlfZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGludGNfMiAvLyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDAKICAgIC8vIGVudHJ5X2V2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBnZXRieXRlCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgMTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkwMQogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X2lkID09IHBhZ2VfY3Vyc29yICsgaW5kZXgsIGVyci5JTlZBTElEX0VWRU5UX0lECiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEzCiAgICBkaWcgNQogICAgdW5jb3ZlciA0CiAgICArCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDItOTA0CiAgICAvLyBzZWxmLl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBlbnRyeV9ldmVudF90eXBlCiAgICAvLyApCiAgICBkaWcgNQogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTA1CiAgICAvLyBhc3NlcnQgZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgc3dhcAogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDYKICAgIC8vIGlmIGVudHJ5LmV2ZW50X2lkID4gVUludDY0KDApOgogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDcKICAgIC8vIGlmIGluZGV4ID4gVUludDY0KDApOgogICAgZHVwCiAgICBieiBjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlANgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTA4CiAgICAvLyBwcmV2aW91c19lbnRyeSA9IHNjaGVkdWxlX3BhZ2VbaW5kZXggLSBVSW50NjQoMSldLmNvcHkoKQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgcHVzaGludCA2NQogICAgKgogICAgZGlnIDExCiAgICBzd2FwCiAgICBwdXNoaW50IDY1CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkyMwogICAgLy8gcHJldmlvdXNfZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gZW50cnkuc2NoZWR1bGVkX3RpbWUKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyA4CiAgICA8PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTIyLTkyNAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBwcmV2aW91c19lbnRyeS5zY2hlZHVsZWRfdGltZSA8PSBlbnRyeS5zY2hlZHVsZWRfdGltZQogICAgLy8gKSwgZXJyLklOVkFMSURfU09SVElORwogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIG11c3QgYmUgc29ydGVkIGluIHN0cmljdGx5IGFzY2VuZGluZyBvcmRlcgoKY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUA4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTI1CiAgICAvLyBpZiBlbnRyeS5ldmVudF9pZCA9PSBVSW50NjQoMCk6CiAgICBkaWcgOAogICAgYm56IGNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkyNi05MjgKICAgIC8vIGFzc2VydCBlbnRyeV9ldmVudF90eXBlID09IFVJbnQ2NCgKICAgIC8vICAgICBlbnVtcy5FVlRfSUVECiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGRpZyA5CiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjkKICAgIC8vIGluZGV4ICs9IFVJbnQ2NCgxKQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIGNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEAyCgpjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlANjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkxMC05MTIKICAgIC8vICMgVGhlIGZpcnN0IGVudHJ5IG9mIGEgcGFnZSBtdXN0IHN0aWxsIGJlIG9yZGVyZWQgYWZ0ZXIgdGhlCiAgICAvLyAjIGxhc3QgZW50cnkgb2YgdGhlIHByZXZpb3VzIHBhZ2UuCiAgICAvLyBhc3NlcnQgc2NoZWR1bGVfcGFnZV9pbmRleCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGRpZyA2CiAgICBkdXAKICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTMKICAgIC8vIHByZXZpb3VzX3BhZ2VfaW5kZXggPSBzY2hlZHVsZV9wYWdlX2luZGV4IC0gVUludDY0KDEpCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTE1CiAgICAvLyBwcmV2aW91c19wYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZQogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTQtOTE2CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHByZXZpb3VzX3BhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTctOTE4CiAgICAvLyBwcmV2aW91c19wYWdlID0gc2VsZi5zY2hlZHVsZV9wYWdlW3ByZXZpb3VzX3BhZ2VfaW5kZXhdLmNvcHkoKQogICAgLy8gYXNzZXJ0IHByZXZpb3VzX3BhZ2UubGVuZ3RoID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBwdXNoaW50IDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTgKICAgIC8vIGFzc2VydCBwcmV2aW91c19wYWdlLmxlbmd0aCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZHVwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjAKICAgIC8vIHByZXZpb3VzX3BhZ2UubGVuZ3RoIC0gVUludDY0KDEpCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTE5LTkyMQogICAgLy8gcHJldmlvdXNfZW50cnkgPSBwcmV2aW91c19wYWdlWwogICAgLy8gICAgIHByZXZpb3VzX3BhZ2UubGVuZ3RoIC0gVUludDY0KDEpCiAgICAvLyBdLmNvcHkoKQogICAgcHVzaGludCA2NQogICAgKgogICAgcHVzaGludCAyCiAgICArCiAgICBwdXNoaW50IDY1CiAgICBib3hfZXh0cmFjdAogICAgYiBjb250cmFjdF9zY2hlZHVsZV9hZnRlcl9pZl9lbHNlQDcKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX3doaWxlQDExOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjAwCiAgICAvLyBzZWxmLnNjaGVkdWxlX3BhZ2VbcGFnZV9pbmRleF0gPSBzY2hlZHVsZV9wYWdlLmNvcHkoKQogICAgZGlnIDYKICAgIGl0b2IKICAgIGJ5dGVjIDI0IC8vIDB4NTMyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgZGlnIDUKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzMgogICAgLy8gaWYgaXNfbGFzdF9wYWdlOgogICAgZGlnIDUKICAgIGJ6IGNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzNAogICAgLy8gc2NoZWR1bGVfcGFnZV9pbmRleCAqIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKSArIHBhZ2VfbGVuZ3RoCiAgICBkaWcgMQogICAgZGlnIDQKICAgICsKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzMwogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA9ICgKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTMzLTkzNQogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA9ICgKICAgIC8vICAgICBzY2hlZHVsZV9wYWdlX2luZGV4ICogVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpICsgcGFnZV9sZW5ndGgKICAgIC8vICkKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MzYKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgNTAKICAgIGFwcF9nbG9iYWxfcHV0Cgpjb250cmFjdF9zY2hlZHVsZV9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTExOAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9leGVjdXRlX2llZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X2V4ZWN1dGVfaWVkOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDMKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE0NAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9jb250cmFjdF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9jb250cmFjdF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDUKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfY29udHJhY3Rfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfY29udHJhY3Rfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTQ3CiAgICAvLyBhc3NlcnQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LCBlcnIuSU5WQUxJRF9FVkVOVF9DVVJTT1IKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgZGlnIDEKICAgID4KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGN1cnNvcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE0OAogICAgLy8gZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoc2VsZi5ldmVudF9jdXJzb3IpCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDkKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoZW51bXMuRVZUX0lFRCksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGR1cAogICAgZXh0cmFjdCA4IDEKICAgIGR1cAogICAgcHVzaGJ5dGVzIDB4MDEKICAgIGI9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1MwogICAgLy8gZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICBkaWcgMQogICAgZXh0cmFjdCAwIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTUKICAgIC8vIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgZGlnIDIKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTU2CiAgICAvLyBhY2NydWFsX2ZhY3Rvcj1lbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIGRpZyAzCiAgICBleHRyYWN0IDE3IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTcKICAgIC8vIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIGRpZyA0CiAgICBleHRyYWN0IDI1IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTkKICAgIC8vIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPWVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDUKICAgIGV4dHJhY3QgMzMgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE2MAogICAgLy8gbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgZGlnIDYKICAgIGV4dHJhY3QgNDEgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE2MQogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9ZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICBkaWcgNwogICAgZXh0cmFjdCA0OSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTYyCiAgICAvLyBmbGFncz1lbnRyeS5mbGFncywKICAgIGRpZyA4CiAgICBleHRyYWN0IDU3IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTItMTE2MwogICAgLy8gdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0KAogICAgLy8gICAgIGV2ZW50X2lkPWVudHJ5LmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1lbnRyeS5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1lbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPWVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9ZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPWVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGZsYWdzPWVudHJ5LmZsYWdzLAogICAgLy8gKSwKICAgIHVuY292ZXIgNwogICAgdW5jb3ZlciA4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNwogICAgY29uY2F0CiAgICB1bmNvdmVyIDYKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTgKICAgIC8vIG9ic2VydmVkX3JhdGU9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTItMTE2MwogICAgLy8gdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0KAogICAgLy8gICAgIGV2ZW50X2lkPWVudHJ5LmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1lbnRyeS5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1lbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPWVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9ZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPWVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGZsYWdzPWVudHJ5LmZsYWdzLAogICAgLy8gKSwKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTUwLTExNjQKICAgIC8vIHNlbGYuX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5KAogICAgLy8gICAgIGVudHJ5LAogICAgLy8gICAgIHR5cC5PYnNlcnZlZEV2ZW50UmVxdWVzdCgKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPWVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIG9ic2VydmVkX3JhdGU9VUludDY0KDApLAogICAgLy8gICAgICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1lbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1lbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICAgICAgZmxhZ3M9ZW50cnkuZmxhZ3MsCiAgICAvLyAgICAgKSwKICAgIC8vICkKICAgIGNhbGxzdWIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5CiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNjUKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEyMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuYXBwbHlfbm9uX2Nhc2hfZXZlbnRbcm91dGluZ10oKSAtPiB2b2lkOgphcHBseV9ub25fY2FzaF9ldmVudDoKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDQKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cG4gMgogICAgbGVuCiAgICBwdXNoaW50IDczCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLk9ic2VydmVkRXZlbnRSZXF1ZXN0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIwNAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9jb250cmFjdF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9jb250cmFjdF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMDUKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfY29udHJhY3Rfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfY29udHJhY3Rfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjA3CiAgICAvLyBpZiBwYXlsb2FkLmZsYWdzICYgVUludDY0KGVudW1zLkZMQUdfT0JTRVJWRURfRVZFTlQpOgogICAgcHVzaGludCA2NQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgcHVzaGludCA0CiAgICAmCiAgICBieiBhcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIzMwogICAgLy8gcmV0dXJuIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQ0xNKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICBwdXNoaW50IDUKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjA4CiAgICAvLyBhc3NlcnQgc2VsZi5fc3VwcG9ydHNfb2JzZXJ2ZWRfZXZlbnRzKCksIGVyci5PQlNFUlZFRF9FVkVOVF9SRVFVSVJFRAogICAgYXNzZXJ0IC8vIE9ic2VydmVkIGV2ZW50IHJlcXVpcmVkIHRvIGV4ZWN1dGUgdGhpcyBhY3Rpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMDkKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjMzCiAgICAvLyByZXR1cm4gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9DTE0pCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIGR1cAogICAgcHVzaGludCA1CiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQ1CiAgICAvLyBhc3NlcnQgc2VsZi5fc3VwcG9ydHNfb2JzZXJ2ZWRfZXZlbnRzKCksIGVyci5PQlNFUlZFRF9FVkVOVF9SRVFVSVJFRAogICAgYXNzZXJ0IC8vIE9ic2VydmVkIGV2ZW50IHJlcXVpcmVkIHRvIGV4ZWN1dGUgdGhpcyBhY3Rpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk0NgogICAgLy8gYXNzZXJ0IHBheWxvYWQuZXZlbnRfaWQgPT0gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGRpZyAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDcKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBpZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQ4CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUsIHBheWxvYWQuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgYnVyeSAxMgogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk0Ny05NDkKICAgIC8vIHNlbGYuX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIHNlbGYuY29udHJhY3RfdHlwZSwgcGF5bG9hZC5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICAvLyApCiAgICBjYWxsc3ViIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTUxCiAgICAvLyBwYWdlX2luZGV4ID0gc2VsZi5fc2NoZWR1bGVfcGFnZV9pbmRleChzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTkwCiAgICAvLyByZXR1cm4gZXZlbnRfaWQgLy8gVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpCiAgICBwdXNoaW50IDE2CiAgICAvCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTIKICAgIC8vIHBhZ2UgPSB0eXAuRXhlY3V0aW9uU2NoZWR1bGVQYWdlKCkKICAgIGJ5dGVjIDQ4IC8vIDB4MDAwMAogICAgYnVyeSA3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTMKICAgIC8vIGlmIHBhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlOgogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA5CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMjcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1NAogICAgLy8gcGFnZSA9IHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XS5jb3B5KCkKICAgIGRpZyA3CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidXJ5IDcKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX3BhZ2UgZW50cnkgZXhpc3RzCgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDI3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTU1CiAgICAvLyBhc3NlcnQgcGFnZS5sZW5ndGggPCBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGRpZyA1CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgMTYKICAgIDwKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2MAogICAgLy8gc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIGRpZyAzCiAgICBkdXAKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjEKICAgIC8vIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICBkaWcgMQogICAgZXh0cmFjdCAxNyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjIKICAgIC8vIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZGlnIDIKICAgIGV4dHJhY3QgMjUgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTYzCiAgICAvLyBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDMKICAgIGV4dHJhY3QgNDEgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTY0CiAgICAvLyBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIGRpZyA0CiAgICBleHRyYWN0IDQ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2NQogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIHVuY292ZXIgNQogICAgZXh0cmFjdCA1NyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTctOTY3CiAgICAvLyB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1wYXlsb2FkLmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9cGF5bG9hZC5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPXBheWxvYWQucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXBheWxvYWQubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICkKICAgIGRpZyAxMQogICAgaXRvYgogICAgZGlnIDE4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMwogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTYtOTY4CiAgICAvLyBwYWdlLmFwcGVuZCgKICAgIC8vICAgICB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9cGF5bG9hZC5ldmVudF9pZCwKICAgIC8vICAgICAgICAgZXZlbnRfdHlwZT1wYXlsb2FkLmV2ZW50X3R5cGUsCiAgICAvLyAgICAgICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIC8vICAgICAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICAgICApCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjkKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHBhZ2UuY29weSgpCiAgICBkaWcgOAogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk3MAogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjEyCiAgICAvLyBhc3NlcnQgZXZlbnRfaWQgPT0gc2VsZi5ldmVudF9jdXJzb3IsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBjdXJzb3IKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMTMKICAgIC8vIGVudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KGV2ZW50X2lkKQogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIxNQogICAgLy8gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgYnVyeSAxMAogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjQKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY1CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzYzLTM3MAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9SUiksCiAgICBwdXNoaW50IDEyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY3CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICBwdXNoaW50IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY4CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgcHVzaGludCAxOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzYzLTM3MAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBieiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX2ZhbHNlQDE2CgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX3RydWVAMTU6CiAgICBpbnRjXzEgLy8gMQoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9tZXJnZUAxNzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMTQtMTIxNgogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2lzX25vbl9jYXNoKAogICAgLy8gICAgIGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIC8vICksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IHR5cGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMTcKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlICE9IGFyYzQuVUludDgoZW51bXMuRVZUX0lFRCksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGRpZyA4CiAgICBwdXNoYnl0ZXMgMHgwMQogICAgYiE9CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCB0eXBlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNzQKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluIChVSW50NjQoZW51bXMuRVZUX1JSKSwgVUludDY0KGVudW1zLkVWVF9SUkYpKQogICAgZGlnIDQKICAgIHB1c2hpbnQgMTIKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDIxCiAgICBkaWcgNAogICAgcHVzaGludCAxMQogICAgPT0KICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfZmFsc2VAMjIKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAyMToKICAgIGludGNfMSAvLyAxCgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX21lcmdlQDIzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIxOAogICAgLy8gaWYgc2VsZi5fZXZlbnRfaXNfcmF0ZV9yZXNldChlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpKToKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Vsc2VfYm9keUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODIKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLm9ic2VydmVyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjUgLy8gMHg1MjNhNGQ0ZjQzMjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMjIKICAgIC8vIHNlbGYuX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5KGVudHJ5LCBwYXlsb2FkKQogICAgZGlnIDYKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeQogICAgcG9wbiAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjIzCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfZWxzZV9ib2R5QDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjIxCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIGIgYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYWZ0ZXJfaWZfZWxzZUA2CgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX2ZhbHNlQDIyOgogICAgaW50Y18wIC8vIDAKICAgIGIgYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9tZXJnZUAyMwoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9mYWxzZUAxNjoKICAgIGludGNfMCAvLyAwCiAgICBiIGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfbWVyZ2VAMTcKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5hcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50OgogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGxlbgogICAgcHVzaGludCA2NQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5PYnNlcnZlZENhc2hFdmVudFJlcXVlc3QKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjU0CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyNTUKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfY29udHJhY3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfY29udHJhY3RfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjU2CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2NvbnRyYWN0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2NvbnRyYWN0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIzMwogICAgLy8gcmV0dXJuIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQ0xNKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICBwdXNoaW50IDUKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5ODEKICAgIC8vIGFzc2VydCBzZWxmLl9zdXBwb3J0c19vYnNlcnZlZF9ldmVudHMoKSwgZXJyLk9CU0VSVkVEX0VWRU5UX1JFUVVJUkVECiAgICBhc3NlcnQgLy8gT2JzZXJ2ZWQgZXZlbnQgcmVxdWlyZWQgdG8gZXhlY3V0ZSB0aGlzIGFjdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTgyCiAgICAvLyBhc3NlcnQgcGF5bG9hZC5ldmVudF9pZCA9PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LCBlcnIuSU5WQUxJRF9FVkVOVF9JRAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgc3dhcAogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBpZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTgzCiAgICAvLyBhc3NlcnQgcGF5bG9hZC5ldmVudF90eXBlID09IGFyYzQuVUludDgoZW51bXMuRVZUX1BSKSwgZXJyLklOVkFMSURfRVZFTlRfVFlQRQogICAgZGlnIDEKICAgIGV4dHJhY3QgOCAxCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIHB1c2hieXRlcyAweDAzCiAgICBiPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IHR5cGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4NAogICAgLy8gYXNzZXJ0IHBheWxvYWQuZmxhZ3MgJiBVSW50NjQoZW51bXMuRkxBR19DQVNIX0VWRU5UKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBzd2FwCiAgICBwdXNoaW50IDU3CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzEgLy8gMQogICAgJgogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTg2CiAgICAvLyBpZiBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50ID4gVUludDY0KDApOgogICAgYnogYXBwZW5kX29ic2VydmVkX2Nhc2hfZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5ODgKICAgIC8vIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgLSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5ODctOTg5CiAgICAvLyBwcmV2aW91c19lbnRyeSA9IHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeSgKICAgIC8vICAgICBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IC0gVUludDY0KDEpCiAgICAvLyApCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5MQogICAgLy8gcHJldmlvdXNfZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gcGF5bG9hZC5zY2hlZHVsZWRfdGltZQogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDQKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIDw9CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OTAtOTkyCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHByZXZpb3VzX2VudHJ5LnNjaGVkdWxlZF90aW1lIDw9IHBheWxvYWQuc2NoZWR1bGVkX3RpbWUKICAgIC8vICksIGVyci5JTlZBTElEX1NPUlRJTkcKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBtdXN0IGJlIHNvcnRlZCBpbiBzdHJpY3RseSBhc2NlbmRpbmcgb3JkZXIKCmFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5NAogICAgLy8gcGFnZV9pbmRleCA9IHNlbGYuX3NjaGVkdWxlX3BhZ2VfaW5kZXgoc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE5MAogICAgLy8gcmV0dXJuIGV2ZW50X2lkIC8vIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKQogICAgcHVzaGludCAxNgogICAgLwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTk1CiAgICAvLyBwYWdlID0gdHlwLkV4ZWN1dGlvblNjaGVkdWxlUGFnZSgpCiAgICBieXRlYyA0OCAvLyAweDAwMDAKICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTk2CiAgICAvLyBpZiBwYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZToKICAgIGl0b2IKICAgIGJ5dGVjIDI0IC8vIDB4NTMyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgNwogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBhcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5NwogICAgLy8gcGFnZSA9IHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XS5jb3B5KCkKICAgIGRpZyA1CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidXJ5IDYKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX3BhZ2UgZW50cnkgZXhpc3RzCgphcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OTgKICAgIC8vIGFzc2VydCBwYWdlLmxlbmd0aCA8IFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZGlnIDQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgcHVzaGludCAxNgogICAgPAogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAwMwogICAgLy8gc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIGRpZyA1CiAgICBkdXAKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDA0CiAgICAvLyBhY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLmFjY3J1YWxfZmFjdG9yLAogICAgZGlnIDEKICAgIGV4dHJhY3QgMTcgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAwNQogICAgLy8gcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICBkaWcgMgogICAgZXh0cmFjdCAyNSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDA2CiAgICAvLyBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDMKICAgIGV4dHJhY3QgMzMgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAwNwogICAgLy8gbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1wYXlsb2FkLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICBkaWcgNAogICAgZXh0cmFjdCA0MSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDA4CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1wYXlsb2FkLm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgdW5jb3ZlciA1CiAgICBleHRyYWN0IDQ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMDAtMTAxMAogICAgLy8gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkoCiAgICAvLyAgICAgZXZlbnRfaWQ9cGF5bG9hZC5ldmVudF9pZCwKICAgIC8vICAgICBldmVudF90eXBlPXBheWxvYWQuZXZlbnRfdHlwZSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1wYXlsb2FkLnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9cGF5bG9hZC5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIC8vICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1wYXlsb2FkLm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGZsYWdzPXBheWxvYWQuZmxhZ3MsCiAgICAvLyApCiAgICBkaWcgMTAKICAgIGl0b2IKICAgIGRpZyAxMAogICAgY29uY2F0CiAgICB1bmNvdmVyIDYKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTk5LTEwMTEKICAgIC8vIHBhZ2UuYXBwZW5kKAogICAgLy8gICAgIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgICAgICBldmVudF9pZD1wYXlsb2FkLmV2ZW50X2lkLAogICAgLy8gICAgICAgICBldmVudF90eXBlPXBheWxvYWQuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICAgICAgYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPXBheWxvYWQubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1wYXlsb2FkLm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgICAgICBmbGFncz1wYXlsb2FkLmZsYWdzLAogICAgLy8gICAgICkKICAgIC8vICkKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMTIKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHBhZ2UuY29weSgpCiAgICBkaWcgNgogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMTMKICAgIC8vIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgKz0gVUludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI2MAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9nZXRfc3RhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9nZXRfc3RhdGU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGR1cAogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjc1CiAgICAvLyBjb250cmFjdF90eXBlPWFyYzQuVUludDgoc2VsZi5jb250cmFjdF90eXBlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgaXRvYgogICAgZHVwCiAgICBiaXRsZW4KICAgIGludGNfMiAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBleHRyYWN0IDcgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI3NwogICAgLy8gdG90YWxfdW5pdHM9c2VsZi50b3RhbF91bml0cywKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjc4CiAgICAvLyByZXNlcnZlZF91bml0c190b3RhbD1zZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyNzkKICAgIC8vIGluaXRpYWxfZXhjaGFuZ2VfYW1vdW50PXNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI4MAogICAgLy8gZXZlbnRfY3Vyc29yPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjgxCiAgICAvLyBzY2hlZHVsZV9lbnRyeV9jb3VudD1zZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI4MgogICAgLy8gb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjgzCiAgICAvLyBpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlPXNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjg0CiAgICAvLyBub21pbmFsX2ludGVyZXN0X3JhdGU9c2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyODUKICAgIC8vIGFjY3J1ZWRfaW50ZXJlc3Q9c2VsZi5hY2NydWVkX2ludGVyZXN0LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyODYKICAgIC8vIGN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXg9c2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjg3CiAgICAvLyBjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleD1zZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyODgKICAgIC8vIHJlc2VydmVkX2ludGVyZXN0PXNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX2ludGVyZXN0IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI4OQogICAgLy8gcmVzZXJ2ZWRfcHJpbmNpcGFsPXNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI3NC0xMjkwCiAgICAvLyByZXR1cm4gdHlwLktlcm5lbFN0YXRlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGU9YXJjNC5VSW50OChzZWxmLmNvbnRyYWN0X3R5cGUpLAogICAgLy8gICAgIHN0YXR1cz1zZWxmLnN0YXR1cywKICAgIC8vICAgICB0b3RhbF91bml0cz1zZWxmLnRvdGFsX3VuaXRzLAogICAgLy8gICAgIHJlc2VydmVkX3VuaXRzX3RvdGFsPXNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwsCiAgICAvLyAgICAgaW5pdGlhbF9leGNoYW5nZV9hbW91bnQ9c2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCwKICAgIC8vICAgICBldmVudF9jdXJzb3I9c2VsZi5ldmVudF9jdXJzb3IsCiAgICAvLyAgICAgc2NoZWR1bGVfZW50cnlfY291bnQ9c2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwKICAgIC8vICAgICBvdXRzdGFuZGluZ19wcmluY2lwYWw9c2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZT1zZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICAvLyAgICAgbm9taW5hbF9pbnRlcmVzdF9yYXRlPXNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIGFjY3J1ZWRfaW50ZXJlc3Q9c2VsZi5hY2NydWVkX2ludGVyZXN0LAogICAgLy8gICAgIGN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXg9c2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4LAogICAgLy8gICAgIGN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4PXNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgsCiAgICAvLyAgICAgcmVzZXJ2ZWRfaW50ZXJlc3Q9c2VsZi5yZXNlcnZlZF9pbnRlcmVzdCwKICAgIC8vICAgICByZXNlcnZlZF9wcmluY2lwYWw9c2VsZi5yZXNlcnZlZF9wcmluY2lwYWwsCiAgICAvLyApCiAgICB1bmNvdmVyIDE0CiAgICBpdG9iCiAgICB1bmNvdmVyIDE0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMgogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDExCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA5CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgOAogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDcKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyNjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzA0CiAgICAvLyBpZiBzZWxmLmV2ZW50X2N1cnNvciA+PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICA+PQogICAgYnogY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMwNgogICAgLy8gZXZlbnRfaWQ9c2VsZi5ldmVudF9jdXJzb3IsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMDUtMTMxNQogICAgLy8gcmV0dXJuIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgIGV2ZW50X2lkPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgLy8gICAgIGV2ZW50X3R5cGU9YXJjNC5VSW50OCgwKSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1VSW50NjQoMCksCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1VSW50NjQoMCksCiAgICAvLyAgICAgZmxhZ3M9VUludDY0KDApLAogICAgLy8gKQogICAgaXRvYgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMwNwogICAgLy8gZXZlbnRfdHlwZT1hcmM0LlVJbnQ4KDApLAogICAgYnl0ZWMgNDEgLy8gMHgwMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMwNS0xMzE1CiAgICAvLyByZXR1cm4gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkoCiAgICAvLyAgICAgZXZlbnRfaWQ9c2VsZi5ldmVudF9jdXJzb3IsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1hcmM0LlVJbnQ4KDApLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPVVJbnQ2NCgwKSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249VUludDY0KDApLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPVVJbnQ2NCgwKSwKICAgIC8vICAgICBmbGFncz1VSW50NjQoMCksCiAgICAvLyApCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMDgKICAgIC8vIHNjaGVkdWxlZF90aW1lPVVJbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzA1LTEzMTUKICAgIC8vIHJldHVybiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1zZWxmLmV2ZW50X2N1cnNvciwKICAgIC8vICAgICBldmVudF90eXBlPWFyYzQuVUludDgoMCksCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9VUludDY0KDApLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9VUludDY0KDApLAogICAgLy8gICAgIGZsYWdzPVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAoKY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50QDQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjkyCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzE2CiAgICAvLyByZXR1cm4gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KHNlbGYuZXZlbnRfY3Vyc29yKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyOTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiBjb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnRfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnRANAoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLmNvbnRyYWN0X3VwZGF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X3VwZGF0ZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNjEtMTY0CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gZ3JhbnRzIHRoZSB1cGRhdGUgcGVybWlzc2lvbnMgdG8gdGhlIEFycmFuZ2VyLgogICAgLy8gIyDimqDvuI8gV0FSTklORzogQXBwbGljYXRpb24gdXBkYXRlcyBtdXN0IGJlIGV4ZWN1dGVkIFZFUlkgY2FyZWZ1bGx5LCBhcyB0aGV5CiAgICAvLyAjIG1pZ2h0IGludHJvZHVjZSBicmVha2luZyBjaGFuZ2VzLgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTUwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19yb3RhdGVfYXJyYW5nZXJbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3JvdGF0ZV9hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTgwCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODEKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSBuZXdfYXJyYW5nZXIKICAgIGJ5dGVjIDE4IC8vIDB4NTIzYTQxNTI1MjIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4MgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTY2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3NldF9vcF9kYWVtb25bcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3NldF9vcF9kYWVtb246CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTg0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE5OAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTk5CiAgICAvLyBzZWxmLm9wX2RhZW1vbi52YWx1ZSA9IGFkZHJlc3MKICAgIGJ5dGVjIDI3IC8vIDB4NTIzYTRmNTA0NDIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwMAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTg0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2Fzc2lnbl9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19hc3NpZ25fcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDE2CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLlJvbGVWYWxpZGl0eQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI1CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2NvbnRyYWN0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2NvbnRyYWN0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNgogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDQKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgcHVzaGludCAyMAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA1CiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gcm9sZV9hZGRyZXNzCiAgICBieXRlYyAxOCAvLyAweDUyM2E0MTUyNTIyMwogICAgZGlnIDMKICAgIGFwcF9nbG9iYWxfcHV0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyOAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwOAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDQwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDkKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIzIC8vIDB4NTIzYTRkNGU0NzIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTAKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI3CiAgICAvLyBzZWxmLl9zZXRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIHZhbGlkaXR5KQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTMKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjIgLy8gMHg1MjNhNTA1OTQ0MjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNAogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNwogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE2CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpOgogICAgZHVwCiAgICBwdXNoaW50IDYwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTcKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyNiAvLyAweDUyM2E1NDUyNTMyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE4CiAgICAvLyBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjcKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIxCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMSAvLyAweDUyM2E0MTU1NTQyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIyCiAgICAvLyBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNwogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyNAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgODAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI1CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI1IC8vIDB4NTIzYTRkNGY0MzIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjYKICAgIC8vIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfcmV2b2tlX3JvbGVbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3Jldm9rZV9yb2xlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0OQogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjUwCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2NvbnRyYWN0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2NvbnRyYWN0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1MQogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjkKICAgIC8vIGFzc2VydCByb2xlX2lkICE9IFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwgZXJyLklOVkFMSURfUk9MRQogICAgZHVwCiAgICBwdXNoaW50IDIwCiAgICAhPQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMwCiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICBwdXNoaW50IDQwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzEKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjMgLy8gMHg1MjNhNGQ0ZTQ3MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMgogICAgLy8gZGVsIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTMKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzQKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzUKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMiAvLyAweDUyM2E1MDU5NDQyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM2CiAgICAvLyBkZWwgc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTIKICAgIC8vIHNlbGYuX2RlbGV0ZV9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcykKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM4CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpOgogICAgZHVwCiAgICBwdXNoaW50IDYwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzkKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI2IC8vIDB4NTIzYTU0NTI1MzIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDAKICAgIC8vIGRlbCBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjUyCiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDMKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hdXRob3JpdHksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjEgLy8gMHg1MjNhNDE1NTU0MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NAogICAgLy8gZGVsIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1MgogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDYKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDgwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI1IC8vIDB4NTIzYTRkNGY0MzIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDgKICAgIC8vIGRlbCBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19jb250cmFjdF9zdXNwZW5zaW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19jb250cmFjdF9zdXNwZW5zaW9uOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojc5CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyMSAvLyAweDUyM2E0MTU1NTQyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3MQogICAgLy8gc2VsZi5jb250cmFjdF9zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGJ5dGVjIDMzIC8vICJjb250cmFjdF9zdXNwZW5kZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3MgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2NvbnRyYWN0X2RlZmF1bHRbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2NvbnRyYWN0X2RlZmF1bHQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjc0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzYKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnRydXN0ZWUsIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyNiAvLyAweDUyM2E1NDUyNTMyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4NwogICAgLy8gc2VsZi5kZWZhdWx0ZWQgPSBkZWZhdWx0ZWQKICAgIGJ5dGVjIDM0IC8vICJkZWZhdWx0ZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4OAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjc0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9hcnJhbmdlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X2FycmFuZ2VyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwMQogICAgLy8gcmV0dXJuIHNlbGYuYXJyYW5nZXIudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOCAvLyAweDUyM2E0MTUyNTIyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYWRkcmVzc19yb2xlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzAzCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMQogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hY2NvdW50X21hbmFnZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjMgLy8gMHg1MjNhNGQ0ZTQ3MjMKICAgIGRpZyAxCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMgogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5wcmltYXJ5X2RlYWxlciwgYWRkcmVzcyksCiAgICBieXRlYyAyMiAvLyAweDUyM2E1MDU5NDQyMwogICAgZGlnIDIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzIzCiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnRydXN0ZWUsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjYgLy8gMHg1MjNhNTQ1MjUzMjMKICAgIGRpZyAzCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyNAogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIGFkZHJlc3MpLAogICAgYnl0ZWMgMjEgLy8gMHg1MjNhNDE1NTU0MjMKICAgIGRpZyA0CiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyNQogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5vYnNlcnZlciwgYWRkcmVzcyksCiAgICBieXRlYyAyNSAvLyAweDUyM2E0ZDRmNDMyMwogICAgdW5jb3ZlciA1CiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlYyA0MSAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciA2CiAgICBzZXRiaXQKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDUKICAgIHNldGJpdAogICAgcHVzaGludCAyCiAgICB1bmNvdmVyIDQKICAgIHNldGJpdAogICAgcHVzaGludCAzCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgcHVzaGludCA0CiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM0NgogICAgLy8gcm9sZSA9IHJvbGVfaWQuYXNfdWludDY0KCkKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNDcKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGUpCiAgICBkdXAKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzQ5CiAgICAvLyBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKToKICAgIHB1c2hpbnRzIDIwIDQwIDUwIDYwIDcwIDgwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzQ4LTM3OQogICAgLy8gbWF0Y2ggcm9sZToKICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKToKICAgIC8vICAgICAgICAgcmV0dXJuIHR5cC5Sb2xlVmFsaWRpdHkoCiAgICAvLyAgICAgICAgICAgICByb2xlX3ZhbGlkaXR5X3N0YXJ0PVVJbnQ2NCgwKSwgcm9sZV92YWxpZGl0eV9lbmQ9VUludDY0KDApCiAgICAvLyAgICAgICAgICkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSk6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSk6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgXzoKICAgIC8vICAgICAgICAgb3AuZXJyKGVyci5JTlZBTElEX1JPTEUpCiAgICB1bmNvdmVyIDYKICAgIG1hdGNoIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMEAyIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMUAzIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMkA0IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfM0A1IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNEA2IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mzc5CiAgICAvLyBvcC5lcnIoZXJyLklOVkFMSURfUk9MRSkKICAgIGVyciAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV81QDc6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mzc1CiAgICAvLyBzZWxmLm9ic2VydmVyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDI1IC8vIDB4NTIzYTRkNGY0MzIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTcKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mzc0LTM3NgogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM3NwogICAgLy8gcmV0dXJuIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzRANjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNzAKICAgIC8vIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDIxIC8vIDB4NTIzYTQxNTU1NDIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTcKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzY5LTM3MQogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNzIKICAgIC8vIHJldHVybiBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzNANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNjUKICAgIC8vIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAyNiAvLyAweDUyM2E1NDUyNTMyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU3CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM2NC0zNjYKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM2NwogICAgLy8gcmV0dXJuIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzJANDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNjAKICAgIC8vIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMjIgLy8gMHg1MjNhNTA1OTQ0MjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NwogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTktMzYxCiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzYyCiAgICAvLyByZXR1cm4gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzFAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTUKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDIzIC8vIDB4NTIzYTRkNGU0NzIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTcKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzU0LTM1NgogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTcKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzBAMjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTAtMzUyCiAgICAvLyByZXR1cm4gdHlwLlJvbGVWYWxpZGl0eSgKICAgIC8vICAgICByb2xlX3ZhbGlkaXR5X3N0YXJ0PVVJbnQ2NCgwKSwgcm9sZV92YWxpZGl0eV9lbmQ9VUludDY0KDApCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB2b2lkOgpfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZDoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNgogICAgLy8gZGVmIF9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHNlbGYsIGhvbGRpbmdfYWRkcmVzczogQWNjb3VudCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI4CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZCwgZXJyLlNVU1BFTkRFRAogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCAzODQKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIFN1c3BlbmRlZCBvcGVyYXRpb25zCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5fc2V0dGxlX3Bvc2l0aW9uKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NCwgdWludDY0Ogpfc2V0dGxlX3Bvc2l0aW9uOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjQ0CiAgICAvLyBkZWYgX3NldHRsZV9wb3NpdGlvbihzZWxmLCBob2xkaW5nX2FkZHJlc3M6IEFjY291bnQpIC0+IHR1cGxlW1VJbnQ2NCwgVUludDY0XToKICAgIHByb3RvIDEgMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjYxCiAgICAvLyBwb3NpdGlvbiA9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNvcHkoKQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo2My02NQogICAgLy8gIyBDb21wdXRlIHRoZSBpbmNyZW1lbnRhbCBwZXItdW5pdCBmaXhlZC1wb2ludCBpbnRlcmVzdCBhbmQgcHJpbmNpcGFsIGFjY3J1ZWQKICAgIC8vICMgc2luY2UgdGhpcyBhY2NvdW50J3MgbGFzdCBjaGVja3BvaW50LgogICAgLy8gaW50ZXJlc3RfZGVsdGEgPSBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggLSBwb3NpdGlvbi5pbnRlcmVzdF9jaGVja3BvaW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCBleGlzdHMKICAgIGRpZyAxCiAgICBwdXNoaW50IDU3CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjY3CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IC0gcG9zaXRpb24ucHJpbmNpcGFsX2NoZWNrcG9pbnQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggZXhpc3RzCiAgICBkaWcgMgogICAgcHVzaGludCA2NQogICAgZXh0cmFjdF91aW50NjQKICAgIC0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3MwogICAgLy8gaW50ZXJlc3RfZGVsdGEsIHBvc2l0aW9uLnVuaXRzLCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICBkaWcgMgogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjcwLTc0CiAgICAvLyAjIENvbnZlcnQgdGhlIHBlci11bml0IGZpeGVkLXBvaW50IGRlbHRhcyBpbnRvIGFic29sdXRlIGNsYWltYWJsZSBhbW91bnRzCiAgICAvLyAjIHVzaW5nIHRoZSBhY2NvdW50J3MgYWN0aXZlIHVuaXRzLgogICAgLy8gY2xhaW1hYmxlX2ludGVyZXN0ID0gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgaW50ZXJlc3RfZGVsdGEsIHBvc2l0aW9uLnVuaXRzLCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICAvLyApCiAgICB1bmNvdmVyIDMKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzYKICAgIC8vIHByaW5jaXBhbF9kZWx0YSwgcG9zaXRpb24udW5pdHMsIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3NS03NwogICAgLy8gY2xhaW1hYmxlX3ByaW5jaXBhbCA9IHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIHByaW5jaXBhbF9kZWx0YSwgcG9zaXRpb24udW5pdHMsIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUKICAgIC8vICkKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzktODEKICAgIC8vICMgQWNjcnVlIHRoZSBjbGFpbWFibGUgYW1vdW50cyB0byB0aGUgYWNjb3VudCBwb3NpdGlvbiBhbmQgbWFrZSB0aGVtIGF2YWlsYWJsZQogICAgLy8gIyBmb3Igd2l0aGRyYXdhbC4KICAgIC8vIHBvc2l0aW9uLmNsYWltYWJsZV9pbnRlcmVzdCArPSBjbGFpbWFibGVfaW50ZXJlc3QKICAgIGRpZyAyCiAgICBwdXNoaW50IDczCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDIKICAgICsKICAgIGl0b2IKICAgIHVuY292ZXIgMwogICAgc3dhcAogICAgcmVwbGFjZTIgNzMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo4MgogICAgLy8gcG9zaXRpb24uY2xhaW1hYmxlX3ByaW5jaXBhbCArPSBjbGFpbWFibGVfcHJpbmNpcGFsCiAgICBkdXAKICAgIHB1c2hpbnQgODEKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgKwogICAgaXRvYgogICAgcmVwbGFjZTIgODEKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo4NC04NgogICAgLy8gIyBBZHZhbmNlIHRoZSBhY2NvdW50J3MgcGVyLXVuaXQgZml4ZWQtcG9pbnQgY2hlY2twb2ludHMgdG8gdGhlIGN1cnJlbnQgZ2xvYmFsCiAgICAvLyAjIHBlci11bml0IGZpeGVkLXBvaW50IGdsb2JhbCBpbmRpY2VzLgogICAgLy8gcG9zaXRpb24uaW50ZXJlc3RfY2hlY2twb2ludCA9IHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggZXhpc3RzCiAgICBpdG9iCiAgICByZXBsYWNlMiA1NwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojg3CiAgICAvLyBwb3NpdGlvbi5wcmluY2lwYWxfY2hlY2twb2ludCA9IHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggZXhpc3RzCiAgICBpdG9iCiAgICByZXBsYWNlMiA2NQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojg5LTkwCiAgICAvLyAjIEFkdmFuY2UgdGhlIGFjY291bnQncyBldmVudCBjdXJzb3IgdG8gdGhlIGN1cnJlbnQgZ2xvYmFsIGV2ZW50IGN1cnNvci4KICAgIC8vIHBvc2l0aW9uLnNldHRsZWRfY3Vyc29yID0gc2VsZi5ldmVudF9jdXJzb3IKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaXRvYgogICAgcmVwbGFjZTIgNDkKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo5Mi05NAogICAgLy8gIyBVcGRhdGUgdGhlIGFjY291bnQgcG9zaXRpb24gYW5kIHJldHVybiB0aGUgbmV3bHkgYWNjcnVlZCBjbGFpbWFibGUgYW1vdW50cwogICAgLy8gIyBhZGRlZCB0byB0aGUgdG90YWwgcG9zaXRpb24ncyBjbGFpbWFibGUgYW1vdW50cy4KICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gcG9zaXRpb24uY29weSgpCiAgICB1bmNvdmVyIDMKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo5NQogICAgLy8gcmV0dXJuIGNsYWltYWJsZV9pbnRlcmVzdCwgY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQoaG9sZGluZ19hZGRyZXNzOiBieXRlcykgLT4gdm9pZDoKX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQ6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6OTcKICAgIC8vIGRlZiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZChzZWxmLCBob2xkaW5nX2FkZHJlc3M6IEFjY291bnQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTAwCiAgICAvLyBpZiBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKToKICAgIGJ6IF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwMQogICAgLy8gcmV0dXJuCiAgICByZXRzdWIKCl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDMKICAgIC8vIHBvc2l0aW9uID0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY29weSgpCiAgICBmcmFtZV9kaWcgMgogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA0CiAgICAvLyBpZiBwb3NpdGlvbi5yZXNlcnZlZF91bml0cyA9PSBVSW50NjQoMCk6CiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIGJueiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZF9hZnRlcl9pZl9lbHNlQDQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDUKICAgIC8vIHJldHVybgogICAgcmV0c3ViCgpfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZF9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA4CiAgICAvLyBwb3NpdGlvbi51bml0cyArPSBhY3RpdmF0ZWRfdW5pdHMKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDMKICAgICsKICAgIGl0b2IKICAgIHJlcGxhY2UyIDMyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA5CiAgICAvLyBwb3NpdGlvbi5yZXNlcnZlZF91bml0cyA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGl0b2IKICAgIHJlcGxhY2UyIDQwCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTEwCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHBvc2l0aW9uLmNvcHkoKQogICAgZnJhbWVfZGlnIDIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTEKICAgIC8vIGFzc2VydCBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID49IGFjdGl2YXRlZF91bml0cywgZXJyLk9WRVJfRElTVFJJQlVUSU9OCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIGV4aXN0cwogICAgZHVwCiAgICBkaWcgMgogICAgPj0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgcmVtYWluaW5nIEQtQVNBIHVuaXRzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTEyCiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIC09IGFjdGl2YXRlZF91bml0cwogICAgc3dhcAogICAgLQogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9zY2FsZWRfbXVsX2RpdihtdWx0aXBsaWNhbmQ6IHVpbnQ2NCwgbXVsdGlwbGllcjogdWludDY0LCBkaXZpc29yOiB1aW50NjQpIC0+IHVpbnQ2NDoKX3NjYWxlZF9tdWxfZGl2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTUzLTE1NQogICAgLy8gZGVmIF9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLCBtdWx0aXBsaWNhbmQ6IFVJbnQ2NCwgbXVsdGlwbGllcjogVUludDY0LCBkaXZpc29yOiBVSW50NjQKICAgIC8vICkgLT4gVUludDY0OgogICAgcHJvdG8gMyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTcKICAgIC8vIGlmIG11bHRpcGxpY2FuZCA9PSBVSW50NjQoMCkgb3IgbXVsdGlwbGllciA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTMKICAgIGJ6IF9zY2FsZWRfbXVsX2Rpdl9pZl9ib2R5QDIKICAgIGZyYW1lX2RpZyAtMgogICAgYm56IF9zY2FsZWRfbXVsX2Rpdl9hZnRlcl9pZl9lbHNlQDMKCl9zY2FsZWRfbXVsX2Rpdl9pZl9ib2R5QDI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTgKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9zY2FsZWRfbXVsX2Rpdl9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTkKICAgIC8vIGhpZ2gsIGxvdyA9IG9wLm11bHcobXVsdGlwbGljYW5kLCBtdWx0aXBsaWVyKQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIG11bHcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2MAogICAgLy8gcmV0dXJuIG9wLmRpdncoaGlnaCwgbG93LCBkaXZpc29yKQogICAgZnJhbWVfZGlnIC0xCiAgICBkaXZ3CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYW1vdW50X3RvX2luZGV4X2RlbHRhKGFtb3VudDogdWludDY0KSAtPiB1aW50NjQ6Cl9hbW91bnRfdG9faW5kZXhfZGVsdGE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjIKICAgIC8vIGRlZiBfYW1vdW50X3RvX2luZGV4X2RlbHRhKHNlbGYsIGFtb3VudDogVUludDY0KSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2NAogICAgLy8gaWYgYW1vdW50ID09IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMQogICAgYm56IF9hbW91bnRfdG9faW5kZXhfZGVsdGFfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjUKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9hbW91bnRfdG9faW5kZXhfZGVsdGFfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTY2CiAgICAvLyBhc3NlcnQgc2VsZi50b3RhbF91bml0cyA+IFVJbnQ2NCgwKSwgZXJyLk5PX1VOSVRTCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgZHVwCiAgICBhc3NlcnQgLy8gTm8gRC1BU0EgdW5pdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2NwogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KGFtb3VudCwgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwgc2VsZi50b3RhbF91bml0cykKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2luZGV4X2RlbHRhX3RvX2Ftb3VudChpbmRleF9kZWx0YTogdWludDY0KSAtPiB1aW50NjQ6Cl9pbmRleF9kZWx0YV90b19hbW91bnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjkKICAgIC8vIGRlZiBfaW5kZXhfZGVsdGFfdG9fYW1vdW50KHNlbGYsIGluZGV4X2RlbHRhOiBVSW50NjQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTc2CiAgICAvLyBpZiBpbmRleF9kZWx0YSA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGJueiBfaW5kZXhfZGVsdGFfdG9fYW1vdW50X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTc3CiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfaW5kZXhfZGVsdGFfdG9fYW1vdW50X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE3OQogICAgLy8gc2VsZi50b3RhbF91bml0cywKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxODEKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNzgtMTgyCiAgICAvLyByZXR1cm4gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgc2VsZi50b3RhbF91bml0cywKICAgIC8vICAgICBpbmRleF9kZWx0YSwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2dldF9zY2hlZHVsZV9lbnRyeShldmVudF9pZDogdWludDY0KSAtPiBieXRlczoKX2dldF9zY2hlZHVsZV9lbnRyeToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIwMgogICAgLy8gZGVmIF9nZXRfc2NoZWR1bGVfZW50cnkoc2VsZiwgZXZlbnRfaWQ6IFVJbnQ2NCkgLT4gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnk6CiAgICBwcm90byAxIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIwNAogICAgLy8gYXNzZXJ0IGV2ZW50X2lkIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgPgogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgaWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE5MAogICAgLy8gcmV0dXJuIGV2ZW50X2lkIC8vIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDE2CiAgICAvCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMDYKICAgIC8vIGFzc2VydCBwYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxOTQKICAgIC8vIHJldHVybiBldmVudF9pZCAlIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDE2CiAgICAlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMDkKICAgIC8vIGFzc2VydCBvZmZzZXQgPCBwYWdlLmxlbmd0aCwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBwdXNoaW50IDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgMQogICAgPgogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjEwCiAgICAvLyByZXR1cm4gcGFnZVtvZmZzZXRdLmNvcHkoKQogICAgcHVzaGludCA2NQogICAgKgogICAgcHVzaGludCAyCiAgICArCiAgICBwdXNoaW50IDY1CiAgICBib3hfZXh0cmFjdAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKGNvbnRyYWN0X3R5cGU6IHVpbnQ2NCwgZXZlbnRfdHlwZTogdWludDY0KSAtPiB2b2lkOgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTMtMzE1CiAgICAvLyBkZWYgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIHNlbGYsIGNvbnRyYWN0X3R5cGU6IFVJbnQ2NCwgZXZlbnRfdHlwZTogVUludDY0CiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNDcKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNDgKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgaW50Y18yIC8vIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI0OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9NRCksCiAgICBwdXNoaW50IDE5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTAKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgcHVzaGludCAxMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU0LTI1NQogICAgLy8gIyBDaGVjayBjb21tb24gZXZlbnRzIGZpcnN0CiAgICAvLyBpZiBldmVudF90eXBlIGluIGNvbW1vbl9ldmVudHM6CiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjUxCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICBwdXNoaW50IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUA3CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU2CiAgICAvLyByZXR1cm4gVHJ1ZQogICAgaW50Y18xIC8vIDEKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICByZXRzdWIKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTgtMjU5CiAgICAvLyAjIENvbnRyYWN0LXNwZWNpZmljIGFkZGl0aW9uYWwgZXZlbnRzCiAgICAvLyBpZiBjb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9QQU0pOgogICAgZnJhbWVfZGlnIC0yCiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjYwLTI2MQogICAgLy8gIyBQQU0gb25seSBzdXBwb3J0cyBjb21tb24gZXZlbnRzCiAgICAvLyByZXR1cm4gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNjMKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0xBTSkgb3IgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2My0yNjUKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0xBTSkgb3IgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoCiAgICAvLyAgICAgZW51bXMuQ1RfTkFNCiAgICAvLyApOgogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDExCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMgogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDE2CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUAxMToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2Ni0yNzAKICAgIC8vICMgTEFNL05BTSBhZGQ6IFBSLCBJUENCCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjY4CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjY2LTI3MAogICAgLy8gIyBMQU0vTkFNIGFkZDogUFIsIElQQ0IKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDEzCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIHB1c2hpbnQgMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2Ni0yNzAKICAgIC8vICMgTEFNL05BTSBhZGQ6IFBSLCBJUENCCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICkKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF9mYWxzZUAxNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAxMzoKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDE0OgogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMTY6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzIKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTik6CiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMjMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3My0yNzgKICAgIC8vICMgQU5OIGFkZHM6IFBSLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjc1CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjczLTI3OAogICAgLy8gIyBBTk4gYWRkczogUFIsIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDIwCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIHB1c2hpbnQgMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3My0yNzgKICAgIC8vICMgQU5OIGFkZHM6IFBSLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyMAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzcKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIHB1c2hpbnQgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjczLTI3OAogICAgLy8gIyBBTk4gYWRkczogUFIsIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDIxCgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDIwOgogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMjE6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAyMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MAogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfTEFYKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA0CiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMzEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MS0yODcKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MwogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUiksCiAgICBwdXNoaW50IDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MS0yODcKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjgKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjg0CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjgxLTI4NwogICAgLy8gIyBMQVggYWRkczogUFIsIFBJLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyOAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODUKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICBwdXNoaW50IDE4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODEtMjg3CiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDI4CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODEtMjg3CiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDI5CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDI4OgogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMjk6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAzMToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4OQogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQ0xNKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA1CiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMzMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI5MC0yOTEKICAgIC8vICMgQ0xNIGFkZHM6IFBSCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1BSKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDMKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDMzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjkzCiAgICAvLyByZXR1cm4gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5faXNfZHluYW1pY19hbm51aXR5KCkgLT4gdWludDY0OgpfaXNfZHluYW1pY19hbm51aXR5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM1CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzUtMzM2CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIC8vIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGJ6IF9pc19keW5hbWljX2FubnVpdHlfYm9vbF9mYWxzZUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzYKICAgIC8vIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzNSAvLyAiZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM1LTMzNgogICAgLy8gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICAvLyBhbmQgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBieiBfaXNfZHluYW1pY19hbm51aXR5X2Jvb2xfZmFsc2VAMwogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMzNC0zMzcKICAgIC8vIHJldHVybiAoCiAgICAvLyAgICAgc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICAvLyAgICAgYW5kIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgLy8gKQogICAgcmV0c3ViCgpfaXNfZHluYW1pY19hbm51aXR5X2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzQtMzM3CiAgICAvLyByZXR1cm4gKAogICAgLy8gICAgIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKQogICAgLy8gICAgIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIC8vICkKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KGVudHJ5OiBieXRlcykgLT4gdWludDY0LCBieXRlczoKX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozODAKICAgIC8vIGRlZiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudChzZWxmLCBlbnRyeTogdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5CiAgICAvLyBlbnRyeS5hY2NydWFsX2ZhY3RvciA9PSBVSW50NjQoMCkKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAxNwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5LTM5MQogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGJ6IF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2lmX2JvZHlAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzkwCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5LTM5MQogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGJ6IF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2lmX2JvZHlAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzkxCiAgICAvLyBvciBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPT0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5LTM5MQogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGJueiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudF9hZnRlcl9pZl9lbHNlQDQKCl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2lmX2JvZHlAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5MwogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2RpZyAtMQogICAgdW5jb3ZlciAyCiAgICByZXRzdWIKCl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NQogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NgogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NC0zOTgKICAgIC8vIGFjY3J1ZWQgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICAvLyAgICAgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICkKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MDIKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozOTktNDAzCiAgICAvLyByZXR1cm4gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgYWNjcnVlZCwKICAgIC8vICAgICBlbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICBmcmFtZV9kaWcgLTEKICAgIHVuY292ZXIgMgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yKGRpc2NvdW50X2ZhY3RvcjogdWludDY0LCByZWRlbXB0aW9uX2ZhY3RvcjogdWludDY0KSAtPiB1aW50NjQ6Cl9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ2Mi00NjYKICAgIC8vIGRlZiBfZGlzY291bnRfYW5udWl0eV9mYWN0b3IoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBkaXNjb3VudF9mYWN0b3I6IFVJbnQ2NCwKICAgIC8vICAgICByZWRlbXB0aW9uX2ZhY3RvcjogVUludDY0LAogICAgLy8gKSAtPiBVSW50NjQ6CiAgICBwcm90byAyIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ2OAogICAgLy8gaWYgcmVkZW1wdGlvbl9mYWN0b3IgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0xCiAgICBibnogX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDY5CiAgICAvLyByZXR1cm4gZGlzY291bnRfZmFjdG9yCiAgICBmcmFtZV9kaWcgLTIKICAgIHJldHN1YgoKX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3MAogICAgLy8gcGVyaW9kX3JhdGUgPSBzZWxmLmZpeGVkX3BvaW50X3NjYWxlICsgc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzEKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzAtNDc0CiAgICAvLyBwZXJpb2RfcmF0ZSA9IHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgKyBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICByZWRlbXB0aW9uX2ZhY3RvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICBkaWcgMgogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgICsKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3NQogICAgLy8gYXNzZXJ0IHBlcmlvZF9yYXRlID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGR1cAogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDc4CiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDc2LTQ4MAogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIGRpc2NvdW50X2ZhY3RvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gICAgIHBlcmlvZF9yYXRlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkoZW50cnk6IGJ5dGVzLCBwYXlsb2FkOiBieXRlcykgLT4gYnl0ZXMsIGJ5dGVzOgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MTMtNjE1CiAgICAvLyBkZWYgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5KAogICAgLy8gICAgIHNlbGYsIGVudHJ5OiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSwgcGF5bG9hZDogdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0CiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAyIDIKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjIzCiAgICAvLyBhc3NlcnQgZW50cnkuZXZlbnRfaWQgPT0gc2VsZi5ldmVudF9jdXJzb3IsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGN1cnNvcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjI0CiAgICAvLyBhc3NlcnQgZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsIGVyci5OT19EVUVfQ0FTSEZMT1cKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPD0KICAgIGFzc2VydCAvLyBObyBkdWUgY2FzaGZsb3cgdG8gcGF5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MjYKICAgIC8vIGV2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYyNwogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX0lFRCk6CiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGR1cAogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYyOC02MzAKICAgIC8vICMgSUVEIGZpbmFsaXplcyBpc3N1YW5jZTogcmVzZXJ2ZWQgdW5pdHMgYmVjb21lIGFjdGl2YXRhYmxlIGFuZCB0aGUKICAgIC8vICMgc2NoZWR1bGUncyBpbml0aWFsIGNvbnRyYWN0dWFsIHN0YXRlIGJlY29tZXMgbGl2ZS4KICAgIC8vIGFzc2VydCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzIKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPT0gc2VsZi50b3RhbF91bml0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjMxLTYzMwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID09IHNlbGYudG90YWxfdW5pdHMKICAgIC8vICksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9JTkNPTVBMRVRFCiAgICBhc3NlcnQgLy8gUHJpbWFyeSBkaXN0cmlidXRpb24gaXMgbm90IGNvbXBsZXRlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzQKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM1CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzYKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAzMwogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzcKICAgIC8vIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM4CiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzkKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0MAogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX0FDVElWRSkKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgMTAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDUxCiAgICAvLyBhc3NlcnQgZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSA9PSBVSW50NjQoZW51bXMuRVZUX0lFRCksIGVyci5OT1RfRVZUX0lFRAogICAgZnJhbWVfZGlnIDExCiAgICBhc3NlcnQgLy8gTm90IElFRCBldmVudAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDUyCiAgICAvLyByZXR1cm4gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0MS02NDUKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1zZWxmLl9lbnRyeV9pZWRfYW1vdW50KGVudHJ5KSwKICAgIC8vICAgICBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0NAogICAgLy8gc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0MS02NDUKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1zZWxmLl9lbnRyeV9pZWRfYW1vdW50KGVudHJ5KSwKICAgIC8vICAgICBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICAvLyApCiAgICBjYWxsc3ViIF9lbWl0X2V4ZWN1dGlvbl9ldmVudAogICAgZHVwCiAgICBmcmFtZV9idXJ5IC0yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NDYKICAgIC8vIHJldHVybgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0OQogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ICs9IHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBmcmFtZV9idXJ5IC0yCiAgICArCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1MQogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1JSKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCAxMgogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMTAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1NQogICAgLy8gcGF5bG9hZC5vYnNlcnZlZF9yYXRlLAogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjU2CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzNyAvLyAicmF0ZV9yZXNldF9tdWx0aXBsaWVyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1NwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1Mi02NTgKICAgIC8vICMgUlIgZGVyaXZlcyB0aGUgbmV4dCByYXRlIGZyb20gYW4gb2JzZXJ2ZWQgb3JhY2xlIHZhbHVlIHBsdXMgdGhlCiAgICAvLyAjIGNvbnRyYWN0IHNwcmVhZCAvIG11bHRpcGxpZXIgdGVybXMsIHRoZW4gZW5mb3JjZXMgZmxvb3IgYW5kIGNhcC4KICAgIC8vIG9ic2VydmVkX3JhdGUgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBwYXlsb2FkLm9ic2VydmVkX3JhdGUsCiAgICAvLyAgICAgc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICkKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjAKICAgIC8vIG9ic2VydmVkX3JhdGUgKyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzYgLy8gInJhdGVfcmVzZXRfc3ByZWFkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkIGV4aXN0cwogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDEKICAgIC8vIGlmIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgYW5kIHJhdGUgPCBzZWxmLnJhdGVfcmVzZXRfZmxvb3I6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzkgLy8gImhhc19yYXRlX3Jlc2V0X2Zsb29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmhhc19yYXRlX3Jlc2V0X2Zsb29yIGV4aXN0cwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMSAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X2Zsb29yIGV4aXN0cwogICAgZnJhbWVfZGlnIDYKICAgID4KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDIKICAgIC8vIHJhdGUgPSBzZWxmLnJhdGVfcmVzZXRfZmxvb3IKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMSAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDYKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfZmxvb3IgZXhpc3RzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1NToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc0MwogICAgLy8gaWYgc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgYW5kIHJhdGUgPiBzZWxmLnJhdGVfcmVzZXRfY2FwOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQwIC8vICJoYXNfcmF0ZV9yZXNldF9jYXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwIGV4aXN0cwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTgKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMiAvLyAicmF0ZV9yZXNldF9jYXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9jYXAgZXhpc3RzCiAgICBmcmFtZV9kaWcgNgogICAgPAogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc0NAogICAgLy8gcmF0ZSA9IHNlbGYucmF0ZV9yZXNldF9jYXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMiAvLyAicmF0ZV9yZXNldF9jYXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSA2CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X2NhcCBleGlzdHMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjU5CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IHNlbGYuX2NsYW1wX3JhdGUoCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NTktNjYxCiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IHNlbGYuX2NsYW1wX3JhdGUoCiAgICAvLyAgICAgb2JzZXJ2ZWRfcmF0ZSArIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQKICAgIC8vICkKICAgIGZyYW1lX2RpZyA2CiAgICBhcHBfZ2xvYmFsX3B1dAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMTg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzEKICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QSSk6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMjAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY3MgogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzMKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDIzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc4CiAgICAvLyBpZiBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKToKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAyOQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc5CiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFJGKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCA1CiAgICA9PQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMzAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4MwogICAgLy8gKyAoc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCAtIHNlbGYuZXZlbnRfY3Vyc29yKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICAtCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODQKICAgIC8vICogVUludDY0KGNzdC5PUF9VUF9OT05fQ0FTSF9QRVJfRU5UUllfQlVER0VUKQogICAgcHVzaGludCAxMDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4My02ODQKICAgIC8vICsgKHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgLSBzZWxmLmV2ZW50X2N1cnNvcikKICAgIC8vICogVUludDY0KGNzdC5PUF9VUF9OT05fQ0FTSF9QRVJfRU5UUllfQlVER0VUKQogICAgKgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjgyCiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX05PTl9DQVNIX0JBU0VfQlVER0VUKQogICAgaW50YyA0IC8vIDE1MDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4Mi02ODQKICAgIC8vIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfQkFTRV9CVURHRVQpCiAgICAvLyArIChzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IC0gc2VsZi5ldmVudF9jdXJzb3IpCiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfUEVSX0VOVFJZX0JVREdFVCkKICAgICsKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4MC02ODYKICAgIC8vIGVuc3VyZV9idWRnZXQoCiAgICAvLyAgICAgcmVxdWlyZWRfYnVkZ2V0PSgKICAgIC8vICAgICAgICAgVUludDY0KGNzdC5PUF9VUF9OT05fQ0FTSF9CQVNFX0JVREdFVCkKICAgIC8vICAgICAgICAgKyAoc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCAtIHNlbGYuZXZlbnRfY3Vyc29yKQogICAgLy8gICAgICAgICAqIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfUEVSX0VOVFJZX0JVREdFVCkKICAgIC8vICAgICApLAogICAgLy8gKQogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDkwCiAgICAvLyBkaXNjb3VudF9mYWN0b3IgPSBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5MQogICAgLy8gZGVub21pbmF0b3IgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5MgogICAgLy8gc2tpcF9maXJzdF9yZWRlbXB0aW9uID0gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5NAogICAgLy8gaWYgZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAyNQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgZnJhbWVfYnVyeSA4CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAzNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDk1LTQ5OQogICAgLy8gIyBBbiBpbml0aWFsIFBSRiBtYXkgZGVzY3JpYmUgdGhlIGZpcnN0IHJlZGVtcHRpb24gcGVyaW9kIGRpcmVjdGx5LgogICAgLy8gZGlzY291bnRfZmFjdG9yID0gc2VsZi5fZGlzY291bnRfYW5udWl0eV9mYWN0b3IoCiAgICAvLyAgICAgZGlzY291bnRfZmFjdG9yLAogICAgLy8gICAgIGVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDgKICAgIGNhbGxzdWIgX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTAxCiAgICAvLyBza2lwX2ZpcnN0X3JlZGVtcHRpb24gPSBUcnVlCiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfYnVyeSA3CiAgICBmcmFtZV9idXJ5IDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDM1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTAzCiAgICAvLyBmdXR1cmVfZXZlbnRfaWQgPSBzZWxmLmV2ZW50X2N1cnNvciArIFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfd2hpbGVfdG9wQDM2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA0CiAgICAvLyB3aGlsZSBmdXR1cmVfZXZlbnRfaWQgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgZnJhbWVfZGlnIDMKICAgID4KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl93aGlsZUA0OAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA1CiAgICAvLyBmdXR1cmVfZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoZnV0dXJlX2V2ZW50X2lkKQogICAgZnJhbWVfZGlnIDMKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwNgogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPSBmdXR1cmVfZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MDctNTA4CiAgICAvLyAjIE9ubHkgcmVkZW1wdGlvbi1iZWFyaW5nIGV2ZW50cyBjb250cmlidXRlIHRvIHRoZSBhbm51aXR5IGRlbm9taW5hdG9yLgogICAgLy8gaXNfcmVkZW1wdGlvbl9ldmVudCA9IGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpIG9yICgKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwNy01MTEKICAgIC8vICMgT25seSByZWRlbXB0aW9uLWJlYXJpbmcgZXZlbnRzIGNvbnRyaWJ1dGUgdG8gdGhlIGFubnVpdHkgZGVub21pbmF0b3IuCiAgICAvLyBpc19yZWRlbXB0aW9uX2V2ZW50ID0gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QUikgb3IgKAogICAgLy8gICAgIGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfTUQpCiAgICAvLyAgICAgYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICAvLyApCiAgICBibnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfdHJ1ZUA0MAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA5CiAgICAvLyBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgZnJhbWVfZGlnIDQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MDktNTEwCiAgICAvLyBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgLy8gYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF9mYWxzZUA0MQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTEwCiAgICAvLyBhbmQgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IgPiBVSW50NjQoMCkKICAgIGZyYW1lX2RpZyAwCiAgICBwdXNoaW50IDI1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA5LTUxMAogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCkKICAgIC8vIGFuZCBmdXR1cmVfZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX3RydWVANDA6CiAgICBpbnRjXzEgLy8gMQoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfbWVyZ2VANDI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTIKICAgIC8vIGlmIGlzX3JlZGVtcHRpb25fZXZlbnQ6CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA0NwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTEzCiAgICAvLyBpZiBza2lwX2ZpcnN0X3JlZGVtcHRpb246CiAgICBmcmFtZV9kaWcgNwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUA0NQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTE0CiAgICAvLyBza2lwX2ZpcnN0X3JlZGVtcHRpb24gPSBGYWxzZQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgNwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANDc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjEKICAgIC8vIGZ1dHVyZV9ldmVudF9pZCArPSBVSW50NjQoMSkKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV93aGlsZV90b3BAMzYKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlANDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTgKICAgIC8vIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZnJhbWVfZGlnIDAKICAgIHB1c2hpbnQgMjUKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTYtNTE5CiAgICAvLyBkaXNjb3VudF9mYWN0b3IgPSBzZWxmLl9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcigKICAgIC8vICAgICBkaXNjb3VudF9mYWN0b3IsCiAgICAvLyAgICAgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMgogICAgc3dhcAogICAgY2FsbHN1YiBfZGlzY291bnRfYW5udWl0eV9mYWN0b3IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjAKICAgIC8vIGRlbm9taW5hdG9yICs9IGRpc2NvdW50X2ZhY3RvcgogICAgZnJhbWVfZGlnIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA0NwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDE6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF9tZXJnZUA0MgoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX3doaWxlQDQ4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTIzCiAgICAvLyBhc3NlcnQgZGVub21pbmF0b3IgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZnJhbWVfZGlnIDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUyNAogICAgLy8gbnVtZXJhdG9yID0gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTI1CiAgICAvLyBpZiBlbnRyeS5mbGFncyAmIFVJbnQ2NChlbnVtcy5GTEFHX0lOSVRJQUxfUFJGKSA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNTcKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gOAogICAgJgogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDUwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjYtNTI3CiAgICAvLyAjIFN1YnNlcXVlbnQgUFJGIGV2ZW50cyBhbW9ydGl6ZSBib3RoIHByaW5jaXBhbCBhbmQgYWxyZWFkeSBhY2NydWVkIGNhcnJ5LgogICAgLy8gbnVtZXJhdG9yICs9IHNlbGYuYWNjcnVlZF9pbnRlcmVzdAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgICsKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDUwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTMwCiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTI4LTUzMgogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIG51bWVyYXRvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gICAgIGRlbm9taW5hdG9yLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDEKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODcKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IHNlbGYuX3JlY2FsY3VsYXRlX2FubnVpdHlfcGF5bWVudCgKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njg3LTY4OQogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gc2VsZi5fcmVjYWxjdWxhdGVfYW5udWl0eV9wYXltZW50KAogICAgLy8gICAgIGVudHJ5CiAgICAvLyApCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMzA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OTIKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY5My02OTcKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1VSW50NjQoMCksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OTUKICAgIC8vIHBheW9mZj1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njk2CiAgICAvLyBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY5My02OTcKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1VSW50NjQoMCksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgY2FsbHN1YiBfZW1pdF9leGVjdXRpb25fZXZlbnQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDI5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjkxCiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDMwCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDIwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc0CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9JUENCKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCAxOAogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDIzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzUtNjc2CiAgICAvLyAjIElQQ0Iga2VlcHMgcHJpbmNpcGFsIHVuY2hhbmdlZCBhbmQgb25seSByZXNldHMgdGhlIGludGVyZXN0IGJhc2UuCiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIGIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMjMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMTA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjIKICAgIC8vIGVsaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1JSRik6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgMTEKICAgID09CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDE0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjMKICAgIC8vIG5leHRfcmF0ZSA9IGVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY0CiAgICAvLyBpZiBuZXh0X3JhdGUgPT0gVUludDY0KDApOgogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDEzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjUKICAgIC8vIG5leHRfcmF0ZSA9IHNlbGYucmF0ZV9yZXNldF9uZXh0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzggLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDUKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfbmV4dCBleGlzdHMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY2CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IG5leHRfcmF0ZQogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgZnJhbWVfZGlnIDUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDE0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY4CiAgICAvLyBpZiBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSAhPSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgOQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2OQogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPSBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZQogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgZnJhbWVfZGlnIDkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KGVudHJ5OiBieXRlcywgcGF5b2ZmOiB1aW50NjQsIHNldHRsZWRfYW1vdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpfZW1pdF9leGVjdXRpb25fZXZlbnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MDMtNzA5CiAgICAvLyBkZWYgX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgKiwKICAgIC8vICAgICBlbnRyeTogdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnksCiAgICAvLyAgICAgcGF5b2ZmOiBVSW50NjQsCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ6IFVJbnQ2NCwKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDMgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzEzCiAgICAvLyBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25JRAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE0CiAgICAvLyBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIGZyYW1lX2RpZyAtMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTUKICAgIC8vIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIGZyYW1lX2RpZyAtMwogICAgZXh0cmFjdCA4IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxNgogICAgLy8gc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICBmcmFtZV9kaWcgLTMKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTcKICAgIC8vIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MjAKICAgIC8vIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIGZyYW1lX2RpZyAtMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE1CiAgICAvLyBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICBpbnRjXzIgLy8gOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIwCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBnZXRieXRlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDkKICAgIC8vIGlmIHBheW9mZiA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJueiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NTAKICAgIC8vIHJldHVybiBVSW50NjQoZW51bXMuUEFZT0ZGX1NJR05fUE9TSVRJVkUpCiAgICBpbnRjXzEgLy8gMQoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX3BheW9mZl9zaWduQDc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTktNzIxCiAgICAvLyBwYXlvZmZfc2lnbj1hcmM0LlVJbnQ4KAogICAgLy8gICAgIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIC8vICksCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgaW50Y18yIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MjMKICAgIC8vIGN1cnJlbmN5X2lkPXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzI0CiAgICAvLyBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTItNzI1CiAgICAvLyBFeGVjdXRpb25FdmVudCgKICAgIC8vICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIC8vICAgICBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYXBwbGllZF9hdD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICBwYXlvZmY9cGF5b2ZmLAogICAgLy8gICAgIHBheW9mZl9zaWduPWFyYzQuVUludDgoCiAgICAvLyAgICAgICAgIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIC8vICAgICApLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PXNldHRsZWRfYW1vdW50LAogICAgLy8gICAgIGN1cnJlbmN5X2lkPXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAwCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzExLTcyNgogICAgLy8gYXJjNC5lbWl0KAogICAgLy8gICAgIEV4ZWN1dGlvbkV2ZW50KAogICAgLy8gICAgICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgICAgIHBheW9mZj1wYXlvZmYsCiAgICAvLyAgICAgICAgIHBheW9mZl9zaWduPWFyYzQuVUludDgoCiAgICAvLyAgICAgICAgICAgICBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICAvLyAgICAgICAgICksCiAgICAvLyAgICAgICAgIHNldHRsZWRfYW1vdW50PXNldHRsZWRfYW1vdW50LAogICAgLy8gICAgICAgICBjdXJyZW5jeV9pZD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgICAgIHNlcXVlbmNlPWVudHJ5LmV2ZW50X2lkICsgVUludDY0KDEpLAogICAgLy8gICAgICkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDlhMzMyYjk1IC8vIG1ldGhvZCAiRXhlY3V0aW9uRXZlbnQodWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc1MQogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiAoVUludDY0KGVudW1zLkVWVF9JRUQpLCBVSW50NjQoZW51bXMuRVZUX1BJKSk6CiAgICBmcmFtZV9kaWcgNQogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBibnogX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2lmX2JvZHlANQogICAgZnJhbWVfZGlnIDUKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGJ6IF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pZl9lbHNlQDYKCl9lbWl0X2V4ZWN1dGlvbl9ldmVudF9pZl9ib2R5QDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NTIKICAgIC8vIHJldHVybiBVSW50NjQoZW51bXMuUEFZT0ZGX1NJR05fUE9TSVRJVkUpCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIwCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBiIF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9wYXlvZmZfc2lnbkA3CgpfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzUzCiAgICAvLyByZXR1cm4gVUludDY0KGVudW1zLlBBWU9GRl9TSUdOX05FR0FUSVZFKQogICAgcHVzaGludCAyNTUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcyMAogICAgLy8gc2VsZi5fcGF5b2ZmX3NpZ24oZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSwgcGF5b2ZmKQogICAgYiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fcGF5b2ZmX3NpZ25ANwoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9yb2xlX2lzX2FjdGl2ZShyb2xlX21hcDogYnl0ZXMsIHJvbGVfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NDoKX3JvbGVfaXNfYWN0aXZlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5CiAgICAvLyBkZWYgX3JvbGVfaXNfYWN0aXZlKHNlbGYsIHJvbGVfbWFwOiB0eXAuUmJhY1JvbGUsIHJvbGVfYWRkcmVzczogQWNjb3VudCkgLT4gYm9vbDoKICAgIHByb3RvIDIgMQogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTcKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAtNjQKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYxCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjIKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYxLTYyCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYxLTYzCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjMKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjItNjMKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgPj0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2MS02MwogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX21lcmdlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAtNjQKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKSAtPiB2b2lkOgpfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2NwogICAgLy8gYXNzZXJ0IHNlbGYuX2lzX2FycmFuZ2VyKFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTQKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgPT0gc2VsZi5hcnJhbmdlci52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE4IC8vIDB4NTIzYTQxNTI1MjIzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJyYW5nZXIgZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjY3CiAgICAvLyBhc3NlcnQgc2VsZi5faXNfYXJyYW5nZXIoVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9pc19ub3RfY29udHJhY3RfZGVmYXVsdGVkKCkgLT4gdm9pZDoKX2Fzc2VydF9pc19ub3RfY29udHJhY3RfZGVmYXVsdGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg1CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuZGVmYXVsdGVkLCBlcnIuREVGQVVMVEVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzQgLy8gImRlZmF1bHRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kZWZhdWx0ZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRGVmYXVsdGVkCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fYXNzZXJ0X2lzX25vdF9jb250cmFjdF9zdXNwZW5kZWQoKSAtPiB2b2lkOgpfYXNzZXJ0X2lzX25vdF9jb250cmFjdF9zdXNwZW5kZWQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODgKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5jb250cmFjdF9zdXNwZW5kZWQsIGVyci5TVVNQRU5ERUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMyAvLyAiY29udHJhY3Rfc3VzcGVuZGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3N1c3BlbmRlZCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBTdXNwZW5kZWQgb3BlcmF0aW9ucwogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGVfaWQ6IHVpbnQ2NCkgLT4gdm9pZDoKX2Fzc2VydF92YWxpZF9yb2xlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkwCiAgICAvLyBkZWYgX2Fzc2VydF92YWxpZF9yb2xlKHNlbGYsIHJvbGVfaWQ6IFVJbnQ2NCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkxLTk5CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MgogICAgLy8gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgcHVzaGludCAyMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkxLTk5CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTMKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICBwdXNoaW50IDI1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEtOTkKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NAogICAgLy8gVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIHB1c2hpbnQgNDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MS05OQogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojk1CiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICBwdXNoaW50IDUwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEtOTkKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NgogICAgLy8gVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICBwdXNoaW50IDYwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEtOTkKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NwogICAgLy8gVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIHB1c2hpbnQgNzAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MS05OQogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojk4CiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICBwdXNoaW50IDgwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEtOTkKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBieiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9mYWxzZUA4CgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDc6CiAgICBpbnRjXzEgLy8gMQoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfbWVyZ2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MS05OQogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICByZXRzdWIKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX2ZhbHNlQDg6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9tZXJnZUA5Cg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="}, "sourceInfo": {"approval": {"pcOffsetMethod": "none", "sourceInfo": [{"pc": [2652], "errorMessage": "ACTUS event not yet executed"}, {"pc": [2410], "errorMessage": "Can not distribute zero units"}, {"pc": [3153, 3160, 3533], "errorMessage": "D-ASA already configured"}, {"pc": [1259, 1991, 2370, 2516, 3750, 3896, 4247, 4478, 4624], "errorMessage": "D-ASA not configured"}, {"pc": [3544], "errorMessage": "D-ASA terms not configured"}, {"pc": [6844], "errorMessage": "Defaulted"}, {"pc": [3171], "errorMessage": "Denomination asset is not properly set"}, {"pc": [3186], "errorMessage": "Different settlement asset not supported, must be equal to denomination asset"}, {"pc": [3422, 3429, 3431], "errorMessage": "IED must be set in the future"}, {"pc": [1277, 2060, 2531, 4265, 6196], "errorMessage": "IED not yet executed"}, {"pc": [2423, 5579], "errorMessage": "Insufficient remaining D-ASA units"}, {"pc": [2626, 2692], "errorMessage": "Insufficient sender units to transfer"}, {"pc": [1887, 3073, 3091, 3147, 3624, 3660, 4312, 5763, 6041, 6101, 6504], "errorMessage": "Invalid ACTUS configuration"}, {"pc": [2000, 2404, 2587, 2602, 2759, 2832, 2895, 2937, 5391, 5516], "errorMessage": "Invalid account holding address"}, {"pc": [4815, 4839, 4863, 4887, 4911, 4968, 4996, 5018, 5040, 5062, 5272, 5290, 5305, 5320, 5335], "errorMessage": "Invalid account role address"}, {"pc": [3133], "errorMessage": "Invalid day-count convention ID"}, {"pc": [1390, 3771, 4099, 6073], "errorMessage": "Invalid event cursor"}, {"pc": [3609, 3672, 3948, 4289, 5679], "errorMessage": "Invalid event id"}, {"pc": [3784, 4163, 4170, 4302], "errorMessage": "Invalid event type"}, {"pc": [4952, 5262, 6914], "errorMessage": "Invalid role identifier"}, {"pc": [3538, 3684, 3692, 4001, 4376, 5694, 5710], "errorMessage": "Invalid schedule page"}, {"pc": [5627], "errorMessage": "No D-ASA units"}, {"pc": [1396, 1916, 2097, 6082], "errorMessage": "No due cashflow to pay"}, {"pc": [6165], "errorMessage": "Not IED event"}, {"pc": [2045, 2378, 2574, 2749, 2805, 2815, 2901, 4198, 5085, 5116, 6836], "errorMessage": "Not authorized"}, {"pc": [1517, 1525, 2146, 2220, 2229], "errorMessage": "Not enough funds for the payment"}, {"pc": [3921, 3934, 4274], "errorMessage": "Observed event required to execute this action"}, {"pc": [2392, 2440], "errorMessage": "Primary distribution is closed"}, {"pc": [6113], "errorMessage": "Primary distribution is not complete"}, {"pc": [2615], "errorMessage": "Sender and receiver must be different"}, {"pc": [5377, 6852], "errorMessage": "Suspended operations"}, {"pc": [2327, 3650, 4334], "errorMessage": "Time events must be sorted in strictly ascending order"}, {"pc": [2548, 2565], "errorMessage": "Transfer is closed"}, {"pc": [2619], "errorMessage": "Transfer units must be greater than zero"}, {"pc": [936], "errorMessage": "Wrong Global Bytes allocation"}, {"pc": [942], "errorMessage": "Wrong Global UInts allocation"}, {"pc": [946], "errorMessage": "Wrong Local Bytes allocation"}, {"pc": [950], "errorMessage": "Wrong Local UInts allocation"}, {"pc": [1498, 2139], "errorMessage": "account opted into asset"}, {"pc": [6796, 6811], "errorMessage": "check BoxMap entry exists"}, {"pc": [2036, 2074, 2115, 2153, 2444, 2622, 2681, 2707, 5371, 5537], "errorMessage": "check self.account entry exists"}, {"pc": [1579, 1811, 1899, 4535, 6201, 6524], "errorMessage": "check self.accrued_interest exists"}, {"pc": [5134, 6834], "errorMessage": "check self.arranger exists"}, {"pc": [6850], "errorMessage": "check self.contract_suspended exists"}, {"pc": [3081, 3527, 3917, 3929, 4270, 4483, 5925], "errorMessage": "check self.contract_type exists"}, {"pc": [1547, 4540, 5399, 5477], "errorMessage": "check self.cumulative_interest_index exists"}, {"pc": [1559, 4545, 5410, 5485], "errorMessage": "check self.cumulative_principal_index exists"}, {"pc": [6842], "errorMessage": "check self.defaulted exists"}, {"pc": [5935], "errorMessage": "check self.dynamic_principal_redemption exists"}, {"pc": [1315, 1327, 1388, 1630, 2630, 2642, 3763, 4092, 4511, 4628, 4640, 4677, 5492, 6071, 6153, 6350, 6405, 6543], "errorMessage": "check self.event_cursor exists"}, {"pc": [5425, 5439, 5632, 5661, 5991, 5999, 6026, 6046, 6236, 6369, 6530], "errorMessage": "check self.fixed_point_scale exists"}, {"pc": [6279], "errorMessage": "check self.has_rate_reset_cap exists"}, {"pc": [6252], "errorMessage": "check self.has_rate_reset_floor exists"}, {"pc": [3158, 3543, 4507, 6170], "errorMessage": "check self.initial_exchange_amount exists"}, {"pc": [2428, 2438], "errorMessage": "check self.initial_exchange_date exists"}, {"pc": [1755, 4525, 5967, 5981], "errorMessage": "check self.interest_calculation_base exists"}, {"pc": [1827, 1842], "errorMessage": "check self.next_principal_redemption exists"}, {"pc": [4530, 5959, 5986, 6031], "errorMessage": "check self.nominal_interest_rate exists"}, {"pc": [2005, 2018], "errorMessage": "check self.op_daemon exists"}, {"pc": [1652, 1721, 1747, 1801, 1853, 1862, 1884, 4520, 6509, 6590], "errorMessage": "check self.outstanding_principal exists"}, {"pc": [6287, 6301], "errorMessage": "check self.rate_reset_cap exists"}, {"pc": [6260, 6274], "errorMessage": "check self.rate_reset_floor exists"}, {"pc": [6231], "errorMessage": "check self.rate_reset_multiplier exists"}, {"pc": [6624], "errorMessage": "check self.rate_reset_next exists"}, {"pc": [6244], "errorMessage": "check self.rate_reset_spread exists"}, {"pc": [1503, 2215, 4550], "errorMessage": "check self.reserved_interest exists"}, {"pc": [1508, 1537, 2225, 2240, 4555], "errorMessage": "check self.reserved_principal exists"}, {"pc": [2415, 2463, 4502, 5574, 6106], "errorMessage": "check self.reserved_units_total exists"}, {"pc": [1319, 2634, 3767, 3946, 3963, 4083, 4284, 4319, 4338, 4458, 4515, 4632, 5675, 6346, 6413], "errorMessage": "check self.schedule_entry_count exists"}, {"pc": [3991, 4366], "errorMessage": "check self.schedule_page entry exists"}, {"pc": [1495, 2105, 2133, 6696], "errorMessage": "check self.settlement_asset_id exists"}, {"pc": [1258, 1272, 1990, 2055, 2369, 2388, 2515, 2526, 2809, 3151, 3531, 3749, 3895, 4246, 4260, 4476, 4623, 5520, 6097, 6191], "errorMessage": "check self.status exists"}, {"pc": [2421, 2474, 4497, 5625, 5656, 6111], "errorMessage": "check self.total_units exists"}, {"pc": [2553, 2563], "errorMessage": "check self.transfer_closure_date exists"}, {"pc": [2536, 2544], "errorMessage": "check self.transfer_opening_date exists"}, {"pc": [3586, 3643], "errorMessage": "index access is out of bounds"}, {"pc": [1974, 3018, 3501, 3996, 4371], "errorMessage": "invalid array length header"}, {"pc": [2739, 3489, 5075, 5106], "errorMessage": "invalid number of bytes for arc4.bool"}, {"pc": [1982], "errorMessage": "invalid number of bytes for arc4.dynamic_array"}, {"pc": [3516], "errorMessage": "invalid number of bytes for arc4.dynamic_array"}, {"pc": [1968, 2353, 2493, 2501, 2731, 2789, 2797, 2877, 2885, 2928, 2953, 4696, 4720, 4754, 4935, 5148, 5232], "errorMessage": "invalid number of bytes for arc4.static_array"}, {"pc": [1253, 2311, 2320, 2361, 2510, 3479, 3880], "errorMessage": "invalid number of bytes for arc4.uint64"}, {"pc": [4744, 4925, 5222], "errorMessage": "invalid number of bytes for arc4.uint8"}, {"pc": [2990], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.InitialKernelState"}, {"pc": [2979], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.NormalizedActusTerms"}, {"pc": [4242], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.ObservedCashEventRequest"}, {"pc": [3891], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.ObservedEventRequest"}, {"pc": [3023], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.Prospectus"}, {"pc": [4765], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.RoleValidity"}, {"pc": [3007], "errorMessage": "invalid tail pointer at index 1 of (uint8[32],(len+utf8[]))"}, {"pc": [3002], "errorMessage": "invalid tuple encoding"}, {"pc": [4063, 4438], "errorMessage": "max array length exceeded"}, {"pc": [4489, 6688], "errorMessage": "overflow"}]}, "clear": {"pcOffsetMethod": "none", "sourceInfo": []}}, "templateVariables": {}}""" APP_SPEC = algokit_utils.Arc56Contract.from_json(_APP_SPEC_JSON) def _parse_abi_args(args: object | None = None) -> list[object] | None: From c1a7ebb4a59db614ec5896fa22d4593f47dea8ca Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 16:45:41 +0100 Subject: [PATCH 182/244] test: rbac contract default --- .../mock_module_rbac/test_mock_rbac_module.py | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/tests/mock_module_rbac/test_mock_rbac_module.py b/tests/mock_module_rbac/test_mock_rbac_module.py index 5d407c95..4f9485ed 100644 --- a/tests/mock_module_rbac/test_mock_rbac_module.py +++ b/tests/mock_module_rbac/test_mock_rbac_module.py @@ -12,6 +12,7 @@ MockRbacModuleClient, MockRbacModuleSend, RbacAssignRoleArgs, + RbacContractDefaultArgs, RbacContractSuspensionArgs, RbacGetAddressRolesArgs, RbacGetRoleValidityArgs, @@ -56,6 +57,7 @@ def test_mock_rbac_send_surface_matches_current_abi() -> None: "rbac_get_arranger", "rbac_get_role_validity", "rbac_contract_suspension", + "rbac_contract_default", "rbac_revoke_role", "rbac_rotate_arranger", "rbac_set_op_daemon", @@ -284,6 +286,52 @@ def test_rbac_gov_asset_suspension_is_authority_only( ) +def test_rbac_contract_default_is_trustee_only_and_gates_default_state( + trustee: DAsaTrustee, + no_role_account: SigningAccount, + rbac_client: MockRbacModuleClient, +) -> None: + assert not rbac_client.state.global_state.defaulted + + result = rbac_client.send.rbac_contract_default( + RbacContractDefaultArgs(defaulted=True), + params=CommonAppCallParams(sender=trustee.address), + ) + assert result.abi_return > 0 + assert rbac_client.state.global_state.defaulted + + with pytest.raises(LogicError, match=err.DEFAULTED): + rbac_client.send.rbac_assign_role( + RbacAssignRoleArgs( + role_id=enums.ROLE_AUTHORITY, + role_address=no_role_account.address, + validity=RoleValidity(0, 2**64 - 1), + ) + ) + + result = rbac_client.send.rbac_contract_default( + RbacContractDefaultArgs(defaulted=False), + params=CommonAppCallParams(sender=trustee.address), + ) + assert result.abi_return > 0 + assert not rbac_client.state.global_state.defaulted + + result = rbac_client.send.rbac_assign_role( + RbacAssignRoleArgs( + role_id=enums.ROLE_AUTHORITY, + role_address=no_role_account.address, + validity=RoleValidity(0, 2**64 - 1), + ) + ) + assert result.abi_return > 0 + + with pytest.raises(LogicError, match=err.UNAUTHORIZED): + rbac_client.send.rbac_contract_default( + RbacContractDefaultArgs(defaulted=True), + params=CommonAppCallParams(sender=no_role_account.address), + ) + + def test_rbac_get_address_roles_covers_every_role_fixture( rbac_client: MockRbacModuleClient, account_manager: DAsaAccountManager, From 3d147df79c88dd626f62ba5510ceab778bd63a4c Mon Sep 17 00:00:00 2001 From: Cosimo Bassi <65770425+cusma@users.noreply.github.com> Date: Fri, 13 Mar 2026 16:52:21 +0100 Subject: [PATCH 183/244] chore: nit Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- tests/mock_module_rbac/test_mock_rbac_module.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/mock_module_rbac/test_mock_rbac_module.py b/tests/mock_module_rbac/test_mock_rbac_module.py index 4f9485ed..077e2919 100644 --- a/tests/mock_module_rbac/test_mock_rbac_module.py +++ b/tests/mock_module_rbac/test_mock_rbac_module.py @@ -259,7 +259,7 @@ def test_rbac_revoke_role_rejects_invalid_calls( ) -def test_rbac_gov_asset_suspension_is_authority_only( +def test_rbac_gov_contract_suspension_is_authority_only( authority: DAsaAuthority, no_role_account: SigningAccount, rbac_client: MockRbacModuleClient, From d64af119bc17889afdcb215b510604c7212bb95d Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 17:26:35 +0100 Subject: [PATCH 184/244] chore: get tx id --- tests/utils.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/tests/utils.py b/tests/utils.py index 10929eee..6ce0bdb3 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -172,6 +172,21 @@ def get_event_from_call_result(call_result: SendAppTransactionResult) -> bytes: return event_bytes[4:] +def get_primary_tx_id(call_result: SendAppTransactionResult) -> str: + tx_ids = getattr(call_result, "tx_ids", None) + if isinstance(tx_ids, list) and tx_ids: + return tx_ids[0] + + transaction = getattr(call_result, "transaction", None) + tx_id = getattr(transaction, "tx_id", None) + if callable(tx_id): + return tx_id() + if isinstance(tx_id, str): + return tx_id + + raise ValueError("Unable to extract transaction id from call result") + + def decode_actus_event(event_bytes: bytes) -> dict: """ Decode an ACTUS ARC-28 Event from bytes using ARC-4 encoding. From d4bb8570f5f4b97e2165ed69d4f1c5ae2d347dbf Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 17:26:59 +0100 Subject: [PATCH 185/244] test: e2e showcase test --- tests/pam/pam_test_support.py | 286 +++++++++++++++++- tests/pam/test_pam_lifecycle_showcase.py | 368 +++++++++++++++++++++++ 2 files changed, 653 insertions(+), 1 deletion(-) create mode 100644 tests/pam/test_pam_lifecycle_showcase.py diff --git a/tests/pam/pam_test_support.py b/tests/pam/pam_test_support.py index 0baa8a6c..7a537cf8 100644 --- a/tests/pam/pam_test_support.py +++ b/tests/pam/pam_test_support.py @@ -1,6 +1,8 @@ from __future__ import annotations from dataclasses import dataclass +from datetime import UTC, datetime +from decimal import Decimal import pytest from algokit_utils import ( @@ -15,8 +17,9 @@ ) from smart_contracts import constants as cst +from smart_contracts import enums from smart_contracts import errors as err -from src import NormalizationResult +from src import ExecutionScheduleEntry, NormalizationResult from src.artifacts.dasa_client import ( AccountOpenArgs, ClaimDueCashflowsArgs, @@ -37,6 +40,18 @@ PRINCIPAL = 10_000 MINIMUM_DENOMINATION = 100 ISSUANCE_DELAY_CYCLE = Cycle.parse_cycle("30D") +LOCALNET_EXPLORER_TX_BASE_URL = "https://lora.algokit.io/localnet/transaction/" +EVENT_TYPE_NAMES = {value: key for key, value in EVENT_TYPE_IDS.items()} +STATUS_NAMES = { + enums.STATUS_INACTIVE: "INACTIVE", + enums.STATUS_PENDING_IED: "PENDING_IED", + enums.STATUS_ACTIVE: "ACTIVE", + enums.STATUS_ENDED: "ENDED", +} +PAYOFF_SIGN_NAMES = { + enums.PAYOFF_SIGN_POSITIVE: "+", + enums.PAYOFF_SIGN_NEGATIVE: "-", +} @dataclass(frozen=True) @@ -45,6 +60,41 @@ class PamLifecycleParticipants: receiver: SigningAccount +@dataclass(frozen=True, slots=True) +class PamLifecycleClaimTrace: + interest_amount: int + principal_amount: int + total_amount: int + timestamp: int + + +@dataclass(frozen=True, slots=True) +class PamLifecycleTraceStep: + schedule_entry: ExecutionScheduleEntry + execution_event: dict[str, int] + funded_amount: int + execution_tx_id: str + claim: PamLifecycleClaimTrace | None = None + claim_tx_id: str | None = None + + +@dataclass(frozen=True, slots=True) +class PamLifecycleTrace: + title: str + contract_variant: str + description: str + normalized: NormalizationResult + currency_decimals: int + currency_unit_name: str + investor_payment_amount: int + total_interest_claimed: int + total_principal_claimed: int + status_before_ied: int + status_after_ied: int + final_status: int + steps: tuple[PamLifecycleTraceStep, ...] + + def client_terms(result: NormalizationResult) -> NormalizedActusTerms: return NormalizedActusTerms( contract_type=result.terms.contract_type, @@ -113,6 +163,170 @@ def scale_currency_amount(amount: int, currency_scale: int) -> int: return amount * currency_scale +def make_claim_trace( + *, + interest_amount: int, + principal_amount: int, + total_amount: int, + timestamp: int, +) -> PamLifecycleClaimTrace: + return PamLifecycleClaimTrace( + interest_amount=interest_amount, + principal_amount=principal_amount, + total_amount=total_amount, + timestamp=timestamp, + ) + + +def format_lifecycle_trace(trace: PamLifecycleTrace) -> str: + total_received = trace.total_interest_claimed + trace.total_principal_claimed + net_cash = total_received - trace.investor_payment_amount + principal = _format_asset_amount( + trace.normalized.terms.notional_principal, + decimals=trace.currency_decimals, + unit_name=trace.currency_unit_name, + ) + issue_price = _format_asset_amount( + trace.investor_payment_amount, + decimals=trace.currency_decimals, + unit_name=trace.currency_unit_name, + ) + interest_total = _format_asset_amount( + trace.total_interest_claimed, + decimals=trace.currency_decimals, + unit_name=trace.currency_unit_name, + ) + principal_total = _format_asset_amount( + trace.total_principal_claimed, + decimals=trace.currency_decimals, + unit_name=trace.currency_unit_name, + ) + total_received_label = _format_asset_amount( + total_received, + decimals=trace.currency_decimals, + unit_name=trace.currency_unit_name, + ) + net_cash_label = _format_asset_amount( + net_cash, + decimals=trace.currency_decimals, + unit_name=trace.currency_unit_name, + ) + maturity_label = ( + _format_timestamp(trace.normalized.terms.maturity_date) + if trace.normalized.terms.maturity_date + else "open-ended" + ) + + lines = [ + trace.title, + "=" * len(trace.title), + f"Variant : {trace.contract_variant}", + f"Description : {trace.description}", + f"Units : {trace.normalized.terms.total_units}", + f"Principal : {principal}", + f"Issue price : {issue_price}", + f"Issue date : {_format_timestamp(trace.normalized.terms.initial_exchange_date)}", + f"Maturity : {maturity_label}", + ( + "Status path : " + f"{STATUS_NAMES[trace.status_before_ied]} -> " + f"{STATUS_NAMES[trace.status_after_ied]} -> " + f"{STATUS_NAMES[trace.final_status]}" + ), + ( + "Investor P&L : " + f"paid {issue_price}, received {total_received_label} " + f"(interest {interest_total}, principal {principal_total}), net {net_cash_label}" + ), + f"Timeline ({trace.currency_unit_name} amounts)", + "--------------------------------", + ] + + table_headers = ( + "id", + "evt", + "due", + "applied", + "lag", + "accrual", + "payoff", + "settled", + "interest", + "principal", + "next out", + "rate", + ) + table_rows: list[tuple[str, ...]] = [] + + for step in trace.steps: + proof = step.execution_event + proof_type = EVENT_TYPE_NAMES.get(proof["event_type"], str(proof["event_type"])) + table_rows.append( + ( + f"{step.schedule_entry.event_id:02d}", + proof_type, + _format_table_timestamp(step.schedule_entry.scheduled_time), + _format_table_timestamp(proof["applied_at"]), + _format_time_delta( + proof["applied_at"] - step.schedule_entry.scheduled_time + ), + _format_ratio(step.schedule_entry.accrual_factor), + _format_scaled_amount( + proof["payoff"], + decimals=trace.currency_decimals, + ), + _format_scaled_amount( + proof["settled_amount"], + decimals=trace.currency_decimals, + ), + ( + _format_scaled_amount( + step.claim.interest_amount, + decimals=trace.currency_decimals, + ) + if step.claim is not None + else "-" + ), + ( + _format_scaled_amount( + step.claim.principal_amount, + decimals=trace.currency_decimals, + ) + if step.claim is not None + else "-" + ), + _format_scaled_amount( + step.schedule_entry.next_outstanding_principal, + decimals=trace.currency_decimals, + ), + ( + _format_rate(step.schedule_entry.next_nominal_interest_rate) + if step.schedule_entry.next_nominal_interest_rate + else "-" + ), + ) + ) + + lines.extend(_render_table(table_headers, table_rows)) + lines.extend(["", "Execution Links", "---------------"]) + execution_link_headers = ("id", "evt", "execution", "claim") + execution_link_rows = [ + ( + f"{step.schedule_entry.event_id:02d}", + step.schedule_entry.event_type, + _format_explorer_transaction_url(step.execution_tx_id), + ( + _format_explorer_transaction_url(step.claim_tx_id) + if step.claim_tx_id is not None + else "-" + ), + ) + for step in trace.steps + ] + lines.extend(_render_table(execution_link_headers, execution_link_rows)) + return "\n".join(lines) + + def _open_contract_account( client: DasaClient, *, @@ -296,3 +510,73 @@ def assert_pending_ied_guards( signer=investor.signer, ), ) + + +def _format_timestamp(timestamp: int) -> str: + return datetime.fromtimestamp(timestamp, tz=UTC).strftime("%Y-%m-%d %H:%M:%SZ") + + +def _format_asset_amount(amount: int, *, decimals: int, unit_name: str) -> str: + quantizer = Decimal(1).scaleb(-decimals) + scaled = (Decimal(amount) / (Decimal(10) ** decimals)).quantize(quantizer) + return f"{scaled:,.{decimals}f} {unit_name}" + + +def _format_scaled_amount(amount: int, *, decimals: int) -> str: + quantizer = Decimal(1).scaleb(-decimals) + scaled = (Decimal(amount) / (Decimal(10) ** decimals)).quantize(quantizer) + return f"{scaled:,.{decimals}f}" + + +def _format_table_timestamp(timestamp: int) -> str: + return datetime.fromtimestamp(timestamp, tz=UTC).strftime("%Y-%m-%d") + + +def _format_time_delta(delta_seconds: int) -> str: + sign = "+" if delta_seconds >= 0 else "-" + abs_delta = abs(delta_seconds) + if abs_delta % cst.DAY_2_SEC == 0: + return f"{sign}{abs_delta // cst.DAY_2_SEC}d" + if abs_delta % 3600 == 0: + return f"{sign}{abs_delta // 3600}h" + if abs_delta % 60 == 0: + return f"{sign}{abs_delta // 60}m" + return f"{sign}{abs_delta}s" + + +def _format_ratio(value: int) -> str: + scaled = Decimal(value) / Decimal(cst.FIXED_POINT_SCALE) + return f"{scaled:.6f}" + + +def _format_rate(value: int) -> str: + percent = Decimal(value) * Decimal(100) / Decimal(cst.FIXED_POINT_SCALE) + return f"{percent:.4f}%" + + +def _format_explorer_transaction_url(tx_id: str) -> str: + return f"{LOCALNET_EXPLORER_TX_BASE_URL}{tx_id}" + + +def _render_table( + headers: tuple[str, ...], + rows: list[tuple[str, ...]], +) -> list[str]: + widths = [len(header) for header in headers] + for row in rows: + for index, cell in enumerate(row): + widths[index] = max(widths[index], len(cell)) + + left_align = {1, 2, 3} + + def render_row(row: tuple[str, ...]) -> str: + cells: list[str] = [] + for index, cell in enumerate(row): + if index in left_align: + cells.append(cell.ljust(widths[index])) + else: + cells.append(cell.rjust(widths[index])) + return " | ".join(cells) + + separator = "-+-".join("-" * width for width in widths) + return [render_row(headers), separator, *[render_row(row) for row in rows]] diff --git a/tests/pam/test_pam_lifecycle_showcase.py b/tests/pam/test_pam_lifecycle_showcase.py new file mode 100644 index 00000000..d02f0f56 --- /dev/null +++ b/tests/pam/test_pam_lifecycle_showcase.py @@ -0,0 +1,368 @@ +from __future__ import annotations + +from collections.abc import Callable +from dataclasses import dataclass + +import pytest +from algokit_utils import ( + AlgoAmount, + AlgorandClient, + CommonAppCallParams, + SendParams, + SigningAccount, +) + +from smart_contracts import constants as cst +from smart_contracts import enums +from src import NormalizationResult, normalize_contract_attributes +from src.artifacts.dasa_client import ( + ClaimDueCashflowsArgs, + DasaClient, + FundDueCashflowsArgs, +) +from src.contracts import make_pam_fixed_coupon_bond_profile, make_pam_zero_coupon_bond +from src.registry import EVENT_TYPE_IDS +from src.schedule import Cycle +from tests import utils +from tests.pam.pam_test_support import ( + ISSUANCE_DELAY_CYCLE, + MINIMUM_DENOMINATION, + PRINCIPAL, + PamLifecycleTrace, + PamLifecycleTraceStep, + cycle_duration_seconds, + format_lifecycle_trace, + make_claim_trace, + setup_pam_lifecycle, +) + +NOMINAL_RATE = 0.02 +INTEREST_PAYMENT_CYCLE = Cycle.parse_cycle("90D") +MATURITY_OFFSET_CYCLE = Cycle.parse_cycle("1800D") +ZERO_COUPON_MATURITY_CYCLE = Cycle.parse_cycle("360D") +ZERO_COUPON_DISCOUNT_BPS = 200 + + +@dataclass(frozen=True, slots=True) +class PamShowcaseScenario: + title: str + contract_variant: str + description: str + normalized: NormalizationResult + bank_funding_amount: int + investor_payment_amount: int + expected_total_interest_amount: int + + +def _derive_total_interest_amount(result: NormalizationResult) -> int: + outstanding_principal = result.schedule[0].next_outstanding_principal + nominal_interest_rate = ( + result.schedule[0].next_nominal_interest_rate or result.terms.rate_reset_next + ) + accrued_interest = 0 + total_interest = 0 + + for entry in result.schedule[1:]: + interest_segment = ( + outstanding_principal + * nominal_interest_rate + // result.terms.fixed_point_scale + * entry.accrual_factor + // result.terms.fixed_point_scale + ) + + if entry.event_type in {"IP", "MD"}: + total_interest += accrued_interest + interest_segment + accrued_interest = 0 + elif entry.event_type == "PR": + accrued_interest += interest_segment + + if entry.event_type in {"PR", "MD"}: + outstanding_principal = entry.next_outstanding_principal + + if entry.next_nominal_interest_rate: + nominal_interest_rate = entry.next_nominal_interest_rate + + return total_interest + + +def _build_fixed_coupon_showcase( + algorand: AlgorandClient, + currency: utils.Currency, +) -> PamShowcaseScenario: + current_ts = utils.get_latest_timestamp(algorand.client.algod) + issuance_delay = cycle_duration_seconds(ISSUANCE_DELAY_CYCLE) + coupon_period = cycle_duration_seconds(INTEREST_PAYMENT_CYCLE) + maturity_offset = cycle_duration_seconds(MATURITY_OFFSET_CYCLE) + assert maturity_offset % coupon_period == 0 + total_coupons = maturity_offset // coupon_period + + issuance_date = current_ts + issuance_delay + first_coupon_date = issuance_date + coupon_period + maturity_date = issuance_date + maturity_offset + + attrs = make_pam_fixed_coupon_bond_profile( + contract_id=1, + status_date=current_ts, + initial_exchange_date=issuance_date, + maturity_date=maturity_date, + notional_principal=PRINCIPAL, + nominal_interest_rate=NOMINAL_RATE, + interest_payment_cycle=INTEREST_PAYMENT_CYCLE, + interest_payment_anchor=first_coupon_date, + ) + normalized = normalize_contract_attributes( + attrs, + denomination_asset_id=currency.id, + denomination_asset_decimals=currency.decimals, + notional_unit_value=MINIMUM_DENOMINATION, + secondary_market_opening_date=issuance_date, + secondary_market_closure_date=maturity_date + cst.DAY_2_SEC, + ) + assert [entry.event_type for entry in normalized.schedule] == [ + "IED", + *(["IP"] * total_coupons), + "MD", + ] + total_interest_amount = _derive_total_interest_amount(normalized) + + return PamShowcaseScenario( + title="D-ASA lifecycle showcase: PAM fixed coupon bond", + contract_variant="PAM:FCB", + description=f"{total_coupons} coupon periods at {NOMINAL_RATE:.2%} nominal rate", + normalized=normalized, + bank_funding_amount=total_interest_amount, + investor_payment_amount=normalized.terms.initial_exchange_amount, + expected_total_interest_amount=total_interest_amount, + ) + + +def _build_zero_coupon_showcase( + algorand: AlgorandClient, + currency: utils.Currency, +) -> PamShowcaseScenario: + current_ts = utils.get_latest_timestamp(algorand.client.algod) + issuance_delay = cycle_duration_seconds(ISSUANCE_DELAY_CYCLE) + maturity_offset = cycle_duration_seconds(ZERO_COUPON_MATURITY_CYCLE) + + issuance_date = current_ts + issuance_delay + maturity_date = issuance_date + maturity_offset + discount_amount = PRINCIPAL * ZERO_COUPON_DISCOUNT_BPS // cst.BPS + + attrs = make_pam_zero_coupon_bond( + contract_id=2, + status_date=current_ts, + initial_exchange_date=issuance_date, + maturity_date=maturity_date, + notional_principal=PRINCIPAL, + premium_discount_at_ied=discount_amount, + ) + normalized = normalize_contract_attributes( + attrs, + denomination_asset_id=currency.id, + denomination_asset_decimals=currency.decimals, + notional_unit_value=MINIMUM_DENOMINATION, + secondary_market_opening_date=issuance_date, + secondary_market_closure_date=maturity_date + cst.DAY_2_SEC, + ) + assert [entry.event_type for entry in normalized.schedule] == ["IED", "MD"] + + return PamShowcaseScenario( + title="D-ASA lifecycle showcase: PAM zero coupon bond", + contract_variant="PAM:ZCB", + description=f"{ZERO_COUPON_DISCOUNT_BPS / cst.BPS:.2%} discount at issuance, single maturity redemption", + normalized=normalized, + bank_funding_amount=normalized.terms.notional_principal + - normalized.terms.initial_exchange_amount, + investor_payment_amount=normalized.terms.initial_exchange_amount, + expected_total_interest_amount=0, + ) + + +def _run_showcase_scenario( + *, + algorand: AlgorandClient, + bank: SigningAccount, + currency: utils.Currency, + d_asa_client: DasaClient, + pam_primary_dealer: utils.DAsaPrimaryDealer, + pam_account_manager: utils.DAsaAccountManager, + scenario: PamShowcaseScenario, +) -> PamLifecycleTrace: + participants = setup_pam_lifecycle( + client=d_asa_client, + primary_dealer=pam_primary_dealer, + account_manager=pam_account_manager, + algorand=algorand, + bank=bank, + currency=currency, + normalized=scenario.normalized, + bank_funding_amount=scenario.bank_funding_amount, + investor_payment_amount=scenario.investor_payment_amount, + prospectus_url=scenario.title, + ) + investor = participants.investor + client = d_asa_client + + initial_state = client.send.contract_get_state().abi_return + assert initial_state.status == enums.STATUS_PENDING_IED + assert initial_state.schedule_entry_count == len(scenario.normalized.schedule) + + ied_entry = scenario.normalized.schedule[0] + utils.time_warp(ied_entry.scheduled_time + cst.DAY_2_SEC) + ied_result = client.send.contract_execute_ied() + ied_event = utils.decode_actus_execution_event( + utils.get_event_from_call_result(ied_result) + ) + assert ied_event["event_id"] == ied_entry.event_id + assert ied_event["event_type"] == EVENT_TYPE_IDS["IED"] + assert ied_event["scheduled_time"] == ied_entry.scheduled_time + assert ied_event["payoff"] == scenario.investor_payment_amount + assert ied_event["payoff_sign"] == enums.PAYOFF_SIGN_POSITIVE + assert ied_event["settled_amount"] == 0 + assert ied_event["sequence"] == ied_entry.event_id + 1 + + steps: list[PamLifecycleTraceStep] = [ + PamLifecycleTraceStep( + schedule_entry=ied_entry, + execution_event=ied_event, + funded_amount=0, + execution_tx_id=utils.get_primary_tx_id(ied_result), + ) + ] + + active_state = client.send.contract_get_state().abi_return + assert active_state.status == enums.STATUS_ACTIVE + assert active_state.event_cursor == 1 + + total_interest_claimed = 0 + total_principal_claimed = 0 + + for entry in scenario.normalized.schedule[1:]: + utils.time_warp(entry.scheduled_time) + + funding_result = client.send.fund_due_cashflows( + FundDueCashflowsArgs(max_event_count=1) + ) + funding = funding_result.abi_return + assert funding.processed_events == 1 + assert funding.total_funded > 0 + + event = utils.decode_actus_execution_event( + utils.get_event_from_call_result(funding_result) + ) + assert event["event_id"] == entry.event_id + assert event["event_type"] == EVENT_TYPE_IDS[entry.event_type] + assert event["scheduled_time"] == entry.scheduled_time + assert event["payoff"] == funding.total_funded + assert event["payoff_sign"] == enums.PAYOFF_SIGN_NEGATIVE + assert event["settled_amount"] == funding.total_funded + assert event["sequence"] == entry.event_id + 1 + + balance_before = algorand.asset.get_account_information( + investor.address, + currency.id, + ).balance + claim_result = client.send.claim_due_cashflows( + ClaimDueCashflowsArgs( + holding_address=investor.address, + payment_info=b"", + ), + params=CommonAppCallParams( + sender=investor.address, + signer=investor.signer, + max_fee=AlgoAmount.from_micro_algo(3_000), + ), + send_params=SendParams(cover_app_call_inner_transaction_fees=True), + ) + claim = claim_result.abi_return + balance_after = algorand.asset.get_account_information( + investor.address, + currency.id, + ).balance + + assert claim.total_amount == funding.total_funded + assert balance_after - balance_before == claim.total_amount + + steps.append( + PamLifecycleTraceStep( + schedule_entry=entry, + execution_event=event, + funded_amount=funding.total_funded, + execution_tx_id=utils.get_primary_tx_id(funding_result), + claim=make_claim_trace( + interest_amount=claim.interest_amount, + principal_amount=claim.principal_amount, + total_amount=claim.total_amount, + timestamp=claim.timestamp, + ), + claim_tx_id=utils.get_primary_tx_id(claim_result), + ) + ) + total_interest_claimed += claim.interest_amount + total_principal_claimed += claim.principal_amount + + final_state = client.send.contract_get_state().abi_return + assert final_state.status == enums.STATUS_ENDED + assert final_state.event_cursor == len(scenario.normalized.schedule) + assert total_interest_claimed == scenario.expected_total_interest_amount + assert total_principal_claimed == scenario.normalized.terms.notional_principal + + return PamLifecycleTrace( + title=scenario.title, + contract_variant=scenario.contract_variant, + description=scenario.description, + normalized=scenario.normalized, + currency_decimals=currency.decimals, + currency_unit_name=currency.unit_name, + investor_payment_amount=scenario.investor_payment_amount, + total_interest_claimed=total_interest_claimed, + total_principal_claimed=total_principal_claimed, + status_before_ied=initial_state.status, + status_after_ied=active_state.status, + final_status=final_state.status, + steps=tuple(steps), + ) + + +SHOWCASE_BUILDERS: tuple[ + Callable[[AlgorandClient, utils.Currency], PamShowcaseScenario], + ..., +] = ( + _build_fixed_coupon_showcase, + _build_zero_coupon_showcase, +) + + +@pytest.mark.parametrize( + "build_scenario", + SHOWCASE_BUILDERS, + ids=("fcb", "zcb"), +) +def test_pam_lifecycle_showcase( + algorand: AlgorandClient, + bank: SigningAccount, + currency: utils.Currency, + d_asa_client: DasaClient, + pam_primary_dealer: utils.DAsaPrimaryDealer, + pam_account_manager: utils.DAsaAccountManager, + build_scenario: Callable[[AlgorandClient, utils.Currency], PamShowcaseScenario], +) -> None: + """ + Run with `pytest -s` to print the normalized ACTUS schedule beside the + real ARC-28 execution proofs and realized holder cashflows. + """ + + scenario = build_scenario(algorand, currency) + trace = _run_showcase_scenario( + algorand=algorand, + bank=bank, + currency=currency, + d_asa_client=d_asa_client, + pam_primary_dealer=pam_primary_dealer, + pam_account_manager=pam_account_manager, + scenario=scenario, + ) + + print() + print(format_lifecycle_trace(trace)) From 4366db4b76859d3daee34792fd7ccb2ae8ca6485 Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 17:27:26 +0100 Subject: [PATCH 186/244] docs: e2e showcase test --- README.md | 7 +++++++ docs/implementation/tests.md | 33 +++++++++++++++++++++++++-------- 2 files changed, 32 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 550d05d5..8e2566bf 100644 --- a/README.md +++ b/README.md @@ -43,6 +43,13 @@ or, for verbose results: poetry run pytest -s -v tests//.py ``` +For a lifecycle walkthrough that prints the normalized ACTUS schedule beside the +real ARC-28 execution proofs and realized cashflows, run: + +```shell +poetry run pytest -s -v tests/pam/test_pam_lifecycle_showcase.py +``` + ## How to contribute Refer to D-ASA documentation! diff --git a/docs/implementation/tests.md b/docs/implementation/tests.md index 5ee73b67..e0c9cb62 100644 --- a/docs/implementation/tests.md +++ b/docs/implementation/tests.md @@ -27,14 +27,31 @@ or, for verbose results: poetry run pytest -s -v tests//.py ``` -## Coverage Principles +The repository also includes a D-ASA showcase walkthrough that prints the +normalized ACTUS schedule beside the real ARC-28 execution proofs and realized +cashflows for PAM fixed coupon and zero coupon bonds: -- Module-level RBAC and Accounting behavior in `tests/module_*` (both with stand-alone -mocked modules and concrete contracts). +```shell +poetry run pytest -s -v tests/pam/test_pam_lifecycle_showcase.py +``` + +## Coverage Areas + +- `tests/sdk/*` covers the Python-side SDK and normalization layer: contract + builders, schedules, day-count conventions, registry mappings, models, and + deploy configuration helpers. + +- `tests/mock_module_rbac/*` exercises RBAC behavior in isolation through the + dedicated mock module artifact. + +- `tests/pam/fcb/*` and `tests/pam/zcb/*` run end-to-end PAM lifecycle tests on + LocalNet for fixed coupon and zero coupon bonds, including schedule upload, + `IED`, cashflow funding, holder claims, and final contract state. -- Shared CoreFinancial behavior is validated through `tests/shared/*` and runs on: - - `zero_coupon_bond` - - `fixed_coupon_bond` - - `perpetual_bond` +- `tests/pam/test_pam_lifecycle_showcase.py` is the narrative walkthrough suite + for new users. It prints the normalized ACTUS schedule beside the emitted + ARC-28 execution receipts and realized cashflows. -- Product-specific financial behavior is validated in contract-specific suites. +- Shared fixtures live in `tests/conftest.py`, `tests/pam/conftest.py`, and + `tests/conftest_helpers.py`; helper decoding and time-warp utilities live in + `tests/utils.py`. From 66a620642d677ba1c8c5cb85a02cfda3489d6f1f Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 17:44:13 +0100 Subject: [PATCH 187/244] chore: mark showcase tests --- .algokit.toml | 2 +- README.md | 2 +- docs/implementation/tests.md | 5 +++-- pyproject.toml | 3 +++ tests/pam/test_pam_lifecycle_showcase.py | 1 + 5 files changed, 9 insertions(+), 4 deletions(-) diff --git a/.algokit.toml b/.algokit.toml index a16aed15..7065a4e1 100644 --- a/.algokit.toml +++ b/.algokit.toml @@ -30,7 +30,7 @@ build = { commands = [ 'poetry run python -m smart_contracts build', ], description = 'Build all smart contracts in the project' } test = { commands = [ - 'poetry run pytest', + 'poetry run pytest -m "not showcase"', ], description = 'Run smart contract tests' } audit = { commands = [ 'poetry run pip-audit', diff --git a/README.md b/README.md index 8e2566bf..fc0f5370 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ For a lifecycle walkthrough that prints the normalized ACTUS schedule beside the real ARC-28 execution proofs and realized cashflows, run: ```shell -poetry run pytest -s -v tests/pam/test_pam_lifecycle_showcase.py +poetry run pytest -s -v -m showcase tests/pam/test_pam_lifecycle_showcase.py ``` ## How to contribute diff --git a/docs/implementation/tests.md b/docs/implementation/tests.md index e0c9cb62..484d866c 100644 --- a/docs/implementation/tests.md +++ b/docs/implementation/tests.md @@ -32,7 +32,7 @@ normalized ACTUS schedule beside the real ARC-28 execution proofs and realized cashflows for PAM fixed coupon and zero coupon bonds: ```shell -poetry run pytest -s -v tests/pam/test_pam_lifecycle_showcase.py +poetry run pytest -s -v -m showcase tests/pam/test_pam_lifecycle_showcase.py ``` ## Coverage Areas @@ -50,7 +50,8 @@ poetry run pytest -s -v tests/pam/test_pam_lifecycle_showcase.py - `tests/pam/test_pam_lifecycle_showcase.py` is the narrative walkthrough suite for new users. It prints the normalized ACTUS schedule beside the emitted - ARC-28 execution receipts and realized cashflows. + ARC-28 execution receipts and realized cashflows. It is marked `showcase` and + excluded from the default `algokit project run test` command. - Shared fixtures live in `tests/conftest.py`, `tests/pam/conftest.py`, and `tests/conftest_helpers.py`; helper decoding and time-warp utilities live in diff --git a/pyproject.toml b/pyproject.toml index a7950741..2f48a2d7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -71,6 +71,9 @@ suppress-none-returning = true [tool.pytest.ini_options] pythonpath = ["smart_contracts", "tests"] +markers = [ + "showcase: narrative LocalNet walkthroughs that are excluded from the default test run", +] [tool.mypy] files = "smart_contracts/" diff --git a/tests/pam/test_pam_lifecycle_showcase.py b/tests/pam/test_pam_lifecycle_showcase.py index d02f0f56..35ce628c 100644 --- a/tests/pam/test_pam_lifecycle_showcase.py +++ b/tests/pam/test_pam_lifecycle_showcase.py @@ -339,6 +339,7 @@ def _run_showcase_scenario( SHOWCASE_BUILDERS, ids=("fcb", "zcb"), ) +@pytest.mark.showcase def test_pam_lifecycle_showcase( algorand: AlgorandClient, bank: SigningAccount, From e50ba51b49176146ddb642d4edcf6ef13e32ca5a Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 18:30:14 +0100 Subject: [PATCH 188/244] chore: add docker --- .dockerignore | 13 +++++++++++++ Dockerfile | 30 ++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+) create mode 100644 .dockerignore create mode 100644 Dockerfile diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..3706c5e7 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,13 @@ +.git +.github +.idea +.mypy_cache +.pytest_cache +.ruff_cache +.vscode +__pycache__ +book +docs +tests +.env.localnet +.env.testnet diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..493cfc68 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,30 @@ +FROM python:3.13-slim + +ENV PYTHONDONTWRITEBYTECODE=1 +ENV PYTHONUNBUFFERED=1 +ENV PIP_NO_CACHE_DIR=1 +ENV POETRY_NO_INTERACTION=1 +ENV POETRY_VIRTUALENVS_CREATE=false +ENV HOME=/home/dasa +ENV XDG_CONFIG_HOME=/home/dasa/.config +ENV XDG_DATA_HOME=/home/dasa/.local/share +ENV XDG_STATE_HOME=/home/dasa/.local/state + +RUN apt-get update \ + && apt-get install -y --no-install-recommends \ + ca-certificates \ + docker.io \ + docker-compose \ + && rm -rf /var/lib/apt/lists/* + +RUN python -m pip install --upgrade pip \ + && python -m pip install \ + algokit==2.10.2 \ + poetry==2.1.4 + +WORKDIR /workspace + +COPY pyproject.toml poetry.lock ./ + +RUN mkdir -p "$HOME" \ + && poetry install --without dev --no-root --no-ansi From 194518269dc9a056d97cfdc8d5b6d12070c4f15a Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 18:31:01 +0100 Subject: [PATCH 189/244] feat: localnet showcase --- src/localnet.py | 413 +++++++++++++++++++++++++++++++++ src/pam_lifecycle.py | 537 +++++++++++++++++++++++++++++++++++++++++++ src/showcase.py | 530 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 1480 insertions(+) create mode 100644 src/localnet.py create mode 100644 src/pam_lifecycle.py create mode 100644 src/showcase.py diff --git a/src/localnet.py b/src/localnet.py new file mode 100644 index 00000000..7946029c --- /dev/null +++ b/src/localnet.py @@ -0,0 +1,413 @@ +from __future__ import annotations + +import argparse +import os +import struct +import time +from base64 import b64decode +from dataclasses import dataclass +from typing import Any + +from algokit_utils import ( + AlgoAmount, + AlgorandClient, + PaymentParams, + SendAppTransactionResult, + SigningAccount, +) +from algokit_utils.config import config as algokit_config +from algokit_utils.models.network import AlgoClientNetworkConfig +from algosdk.v2client.algod import AlgodClient + +from src.artifacts.dasa_client import AccountGetPositionArgs + +DEFAULT_LOCALNET_HOST = "localhost" +DEFAULT_LOCALNET_TOKEN = "a" * 64 +DEFAULT_ALGOD_PORT = 4001 +DEFAULT_KMD_PORT = 4002 +DEFAULT_INDEXER_PORT = 8980 +DEFAULT_INITIAL_ALGO_FUNDS = AlgoAmount.from_algo(10_000) + + +@dataclass(frozen=True, slots=True) +class LocalNetConfig: + host: str = DEFAULT_LOCALNET_HOST + token: str = DEFAULT_LOCALNET_TOKEN + algod_port: int = DEFAULT_ALGOD_PORT + kmd_port: int = DEFAULT_KMD_PORT + indexer_port: int = DEFAULT_INDEXER_PORT + + @property + def server(self) -> str: + return f"http://{self.host}" + + @property + def algod_address(self) -> str: + return f"{self.server}:{self.algod_port}" + + def algod_client_config(self) -> AlgoClientNetworkConfig: + return AlgoClientNetworkConfig( + server=self.server, + token=self.token, + port=self.algod_port, + ) + + def indexer_client_config(self) -> AlgoClientNetworkConfig: + return AlgoClientNetworkConfig( + server=self.server, + token=self.token, + port=self.indexer_port, + ) + + def kmd_client_config(self) -> AlgoClientNetworkConfig: + return AlgoClientNetworkConfig( + server=self.server, + token=self.token, + port=self.kmd_port, + ) + + +@dataclass(frozen=True, slots=True) +class Currency: + id: int + total: int + decimals: int + name: str + unit_name: str + asa_to_unit: float + + +@dataclass(kw_only=True) +class DAsaAccountManager(SigningAccount): + @classmethod + def role_id(cls) -> int: + from smart_contracts import enums + + return enums.ROLE_ACCOUNT_MANAGER + + +@dataclass(kw_only=True) +class DAsaPrimaryDealer(SigningAccount): + @classmethod + def role_id(cls) -> int: + from smart_contracts import enums + + return enums.ROLE_PRIMARY_DEALER + + +@dataclass(kw_only=True) +class DAsaTrustee(SigningAccount): + @classmethod + def role_id(cls) -> int: + from smart_contracts import enums + + return enums.ROLE_TRUSTEE + + +@dataclass(kw_only=True) +class DAsaAuthority(SigningAccount): + @classmethod + def role_id(cls) -> int: + from smart_contracts import enums + + return enums.ROLE_AUTHORITY + + +@dataclass(kw_only=True) +class DAsaInterestOracle(SigningAccount): + @classmethod + def role_id(cls) -> int: + from smart_contracts import enums + + return enums.ROLE_OBSERVER + + +@dataclass(kw_only=True) +class DAsaAccount(SigningAccount): + holding_address: str + d_asa_client: Any + + @property + def payment_address(self) -> str: + return self.d_asa_client.send.account_get_position( + AccountGetPositionArgs( + holding_address=self.holding_address, + ) + ).abi_return.payment_address + + @property + def units(self) -> int: + return self.d_asa_client.send.account_get_position( + AccountGetPositionArgs(holding_address=self.holding_address) + ).abi_return.units + + @property + def suspended(self) -> bool: + return self.d_asa_client.send.account_get_position( + AccountGetPositionArgs(holding_address=self.holding_address) + ).abi_return.suspended + + +def load_localnet_config(default_host: str = DEFAULT_LOCALNET_HOST) -> LocalNetConfig: + return LocalNetConfig( + host=os.getenv("D_ASA_LOCALNET_HOST", default_host), + token=os.getenv("D_ASA_LOCALNET_TOKEN", DEFAULT_LOCALNET_TOKEN), + algod_port=int(os.getenv("D_ASA_ALGOD_PORT", str(DEFAULT_ALGOD_PORT))), + kmd_port=int(os.getenv("D_ASA_KMD_PORT", str(DEFAULT_KMD_PORT))), + indexer_port=int(os.getenv("D_ASA_INDEXER_PORT", str(DEFAULT_INDEXER_PORT))), + ) + + +def algorand_client_from_localnet( + localnet_config: LocalNetConfig | None = None, +) -> AlgorandClient: + localnet = localnet_config or load_localnet_config() + algokit_config.configure( + debug=True, + populate_app_call_resources=True, + ) + client = AlgorandClient.from_config( + algod_config=localnet.algod_client_config(), + indexer_config=localnet.indexer_client_config(), + kmd_config=localnet.kmd_client_config(), + ) + client.set_suggested_params_cache_timeout(0) + return client + + +def get_last_round(algod_client: AlgodClient) -> int: + return int(algod_client.status()["last-round"]) # type: ignore[index] + + +def get_latest_timestamp(algod_client: AlgodClient) -> int: + block = algod_client.block_info(get_last_round(algod_client))["block"] # type: ignore[index] + return int(block["ts"]) # type: ignore[index] + + +def round_warp( + to_round: int | None = None, + *, + algorand: AlgorandClient | None = None, + localnet_config: LocalNetConfig | None = None, +) -> None: + algorand_client = algorand or algorand_client_from_localnet(localnet_config) + dispenser = algorand_client.account.localnet_dispenser() + if to_round is not None: + last_round = get_last_round(algorand_client.client.algod) + if to_round <= last_round: + raise ValueError("to_round must be greater than the latest round") + n_rounds = to_round - last_round + else: + n_rounds = 1 + + for _ in range(n_rounds): + algorand_client.send.payment( + PaymentParams( + signer=dispenser.signer, + sender=dispenser.address, + receiver=dispenser.address, + amount=AlgoAmount.from_algo(0), + ) + ) + + +def time_warp( + to_timestamp: int, + *, + algorand: AlgorandClient | None = None, + localnet_config: LocalNetConfig | None = None, +) -> None: + algorand_client = algorand or algorand_client_from_localnet(localnet_config) + algod_client = algorand_client.client.algod + algod_client.set_timestamp_offset(to_timestamp - get_latest_timestamp(algod_client)) + round_warp(algorand=algorand_client) + algod_client.set_timestamp_offset(0) + + +def wait_for_algod( + *, + localnet_config: LocalNetConfig | None = None, + timeout_seconds: float = 60.0, + poll_interval_seconds: float = 2.0, +) -> None: + localnet = localnet_config or load_localnet_config() + algod_client = AlgodClient(localnet.token, localnet.algod_address) + deadline = time.monotonic() + timeout_seconds + last_error: Exception | None = None + + while time.monotonic() < deadline: + try: + status = algod_client.status() + if "last-round" in status: + return + except Exception as exc: # pragma: no cover - exercised via CLI/manual flow + last_error = exc + time.sleep(poll_interval_seconds) + + message = f"Timed out waiting for algod at {localnet.algod_address}" + if last_error is not None: + raise TimeoutError(f"{message}: {last_error}") from last_error + raise TimeoutError(message) + + +def ensure_funded_role_account( + algorand: AlgorandClient, + role_account_class: type[SigningAccount], + *, + min_spending_balance: AlgoAmount = DEFAULT_INITIAL_ALGO_FUNDS, +) -> SigningAccount: + account = algorand.account.random() + role_account = role_account_class(private_key=account.private_key) + algorand.account.ensure_funded_from_environment( + account_to_fund=role_account.address, + min_spending_balance=min_spending_balance, + ) + return role_account + + +def get_event_from_call_result(call_result: SendAppTransactionResult) -> bytes: + event = call_result.returns[0].tx_info["logs"][-2] + event_bytes = b64decode(event) + return event_bytes[4:] + + +def get_primary_tx_id(call_result: SendAppTransactionResult) -> str: + tx_ids = getattr(call_result, "tx_ids", None) + if isinstance(tx_ids, list) and tx_ids: + return tx_ids[0] + + transaction = getattr(call_result, "transaction", None) + tx_id = getattr(transaction, "tx_id", None) + if callable(tx_id): + return tx_id() + if isinstance(tx_id, str): + return tx_id + + raise ValueError("Unable to extract transaction id from call result") + + +def decode_actus_event(event_bytes: bytes) -> dict[str, int | str]: + offset = 0 + + contract_id = struct.unpack(">Q", event_bytes[offset : offset + 8])[0] + offset += 8 + + event_type = event_bytes[offset] + offset += 1 + + type_name_offset = struct.unpack(">H", event_bytes[offset : offset + 2])[0] + offset += 2 + + event_time = struct.unpack(">Q", event_bytes[offset : offset + 8])[0] + offset += 8 + + payoff = struct.unpack(">Q", event_bytes[offset : offset + 8])[0] + offset += 8 + + currency_id = struct.unpack(">Q", event_bytes[offset : offset + 8])[0] + offset += 8 + + currency_unit_offset = struct.unpack(">H", event_bytes[offset : offset + 2])[0] + offset += 2 + + nominal_value = struct.unpack(">Q", event_bytes[offset : offset + 8])[0] + offset += 8 + + nominal_rate_bps = struct.unpack(">H", event_bytes[offset : offset + 2])[0] + offset += 2 + + nominal_accrued = struct.unpack(">Q", event_bytes[offset : offset + 8])[0] + + type_name_length = struct.unpack( + ">H", event_bytes[type_name_offset : type_name_offset + 2] + )[0] + type_name = event_bytes[ + type_name_offset + 2 : type_name_offset + 2 + type_name_length + ].decode("utf-8") + + currency_unit_length = struct.unpack( + ">H", event_bytes[currency_unit_offset : currency_unit_offset + 2] + )[0] + currency_unit = event_bytes[ + currency_unit_offset + 2 : currency_unit_offset + 2 + currency_unit_length + ].decode("utf-8") + + return { + "contract_id": contract_id, + "type": event_type, + "type_name": type_name, + "time": event_time, + "payoff": payoff, + "currency_id": currency_id, + "currency_unit": currency_unit, + "nominal_value": nominal_value, + "nominal_rate_bps": nominal_rate_bps, + "nominal_accrued": nominal_accrued, + } + + +def decode_actus_execution_event(event_bytes: bytes) -> dict[str, int]: + ( + contract_id, + event_id, + event_type, + scheduled_time, + applied_at, + payoff, + payoff_sign, + settled_amount, + currency_id, + sequence, + ) = struct.unpack(">QQBQQQBQQQ", event_bytes) + + return { + "contract_id": contract_id, + "event_id": event_id, + "event_type": event_type, + "scheduled_time": scheduled_time, + "applied_at": applied_at, + "payoff": payoff, + "payoff_sign": payoff_sign, + "settled_amount": settled_amount, + "currency_id": currency_id, + "sequence": sequence, + } + + +def _build_parser() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser( + description="Utilities for connecting to and waiting on D-ASA LocalNet.", + ) + subcommands = parser.add_subparsers(dest="command", required=True) + wait_parser = subcommands.add_parser( + "wait", + help="Wait for algod to become reachable.", + ) + wait_parser.add_argument( + "--timeout", + type=float, + default=60.0, + help="Maximum number of seconds to wait.", + ) + wait_parser.add_argument( + "--poll-interval", + type=float, + default=2.0, + help="Seconds between readiness checks.", + ) + return parser + + +def main() -> None: + parser = _build_parser() + args = parser.parse_args() + if args.command == "wait": + wait_for_algod( + localnet_config=load_localnet_config(), + timeout_seconds=args.timeout, + poll_interval_seconds=args.poll_interval, + ) + + +if __name__ == "__main__": + main() diff --git a/src/pam_lifecycle.py b/src/pam_lifecycle.py new file mode 100644 index 00000000..fdf5486f --- /dev/null +++ b/src/pam_lifecycle.py @@ -0,0 +1,537 @@ +from __future__ import annotations + +from dataclasses import dataclass +from datetime import UTC, datetime +from decimal import Decimal + +from algokit_utils import ( + AlgoAmount, + AlgorandClient, + AssetOptInParams, + AssetTransferParams, + CommonAppCallParams, + SendParams, + SigningAccount, +) + +from smart_contracts import constants as cst +from smart_contracts import enums +from src import ExecutionScheduleEntry, NormalizationResult +from src.artifacts.dasa_client import ( + AccountOpenArgs, + ContractConfigArgs, + ContractScheduleArgs, + DasaClient, + InitialKernelState, + NormalizedActusTerms, + PrimaryDistributionArgs, + Prospectus, +) +from src.localnet import Currency, DAsaAccountManager, DAsaPrimaryDealer +from src.registry import EVENT_TYPE_IDS +from src.schedule import Cycle + +PRINCIPAL = 10_000 +MINIMUM_DENOMINATION = 100 +ISSUANCE_DELAY_CYCLE = Cycle.parse_cycle("30D") +LOCALNET_EXPLORER_TX_BASE_URL = "https://lora.algokit.io/localnet/transaction/" +EVENT_TYPE_NAMES = {value: key for key, value in EVENT_TYPE_IDS.items()} +STATUS_NAMES = { + enums.STATUS_INACTIVE: "INACTIVE", + enums.STATUS_PENDING_IED: "PENDING_IED", + enums.STATUS_ACTIVE: "ACTIVE", + enums.STATUS_ENDED: "ENDED", +} + + +@dataclass(frozen=True) +class PamLifecycleParticipants: + investor: SigningAccount + receiver: SigningAccount + + +@dataclass(frozen=True, slots=True) +class PamLifecycleClaimTrace: + interest_amount: int + principal_amount: int + total_amount: int + timestamp: int + + +@dataclass(frozen=True, slots=True) +class PamLifecycleTraceStep: + schedule_entry: ExecutionScheduleEntry + execution_event: dict[str, int] + funded_amount: int + execution_tx_id: str + claim: PamLifecycleClaimTrace | None = None + claim_tx_id: str | None = None + + +@dataclass(frozen=True, slots=True) +class PamLifecycleTrace: + title: str + contract_variant: str + description: str + normalized: NormalizationResult + currency_decimals: int + currency_unit_name: str + investor_payment_amount: int + total_interest_claimed: int + total_principal_claimed: int + status_before_ied: int + status_after_ied: int + final_status: int + steps: tuple[PamLifecycleTraceStep, ...] + + +def client_terms(result: NormalizationResult) -> NormalizedActusTerms: + return NormalizedActusTerms( + contract_type=result.terms.contract_type, + denomination_asset_id=result.terms.denomination_asset_id, + settlement_asset_id=result.terms.denomination_asset_id, + total_units=result.terms.total_units, + notional_principal=result.terms.notional_principal, + initial_exchange_amount=result.terms.initial_exchange_amount, + initial_exchange_date=result.terms.initial_exchange_date, + maturity_date=result.terms.maturity_date or 0, + day_count_convention=int(result.terms.day_count_convention), + rate_reset_spread=result.terms.rate_reset_spread, + rate_reset_multiplier=result.terms.rate_reset_multiplier, + rate_reset_floor=result.terms.rate_reset_floor, + rate_reset_cap=result.terms.rate_reset_cap, + rate_reset_next=result.terms.rate_reset_next, + has_rate_reset_floor=result.terms.has_rate_reset_floor, + has_rate_reset_cap=result.terms.has_rate_reset_cap, + dynamic_principal_redemption=result.terms.dynamic_principal_redemption, + fixed_point_scale=result.terms.fixed_point_scale, + ) + + +def client_initial_state(result: NormalizationResult) -> InitialKernelState: + return InitialKernelState( + status_date=result.initial_state.status_date, + event_cursor=result.initial_state.event_cursor, + outstanding_principal=result.initial_state.outstanding_principal, + interest_calculation_base=result.initial_state.interest_calculation_base, + nominal_interest_rate=result.initial_state.nominal_interest_rate, + accrued_interest=result.initial_state.accrued_interest, + next_principal_redemption=result.initial_state.next_principal_redemption, + cumulative_interest_index=result.initial_state.cumulative_interest_index, + cumulative_principal_index=result.initial_state.cumulative_principal_index, + ) + + +def client_schedule_page( + page: tuple[ExecutionScheduleEntry, ...], +) -> list[tuple[int, int, int, int, int, int, int, int, int]]: + return [ + ( + entry.event_id, + EVENT_TYPE_IDS[entry.event_type], + entry.scheduled_time, + entry.accrual_factor, + entry.redemption_accrual_factor, + entry.next_nominal_interest_rate, + entry.next_principal_redemption, + entry.next_outstanding_principal, + entry.flags, + ) + for entry in page + ] + + +def cycle_duration_seconds(cycle: Cycle) -> int: + if cycle.unit == "D": + return cycle.count * cst.DAY_2_SEC + if cycle.unit == "W": + return cycle.count * 7 * cst.DAY_2_SEC + raise ValueError(f"Unsupported fixed-duration ACTUS cycle for this test: {cycle}") + + +def scale_currency_amount(amount: int, currency_scale: int) -> int: + return amount * currency_scale + + +def make_claim_trace( + *, + interest_amount: int, + principal_amount: int, + total_amount: int, + timestamp: int, +) -> PamLifecycleClaimTrace: + return PamLifecycleClaimTrace( + interest_amount=interest_amount, + principal_amount=principal_amount, + total_amount=total_amount, + timestamp=timestamp, + ) + + +def format_lifecycle_trace(trace: PamLifecycleTrace) -> str: + total_received = trace.total_interest_claimed + trace.total_principal_claimed + net_cash = total_received - trace.investor_payment_amount + principal = _format_asset_amount( + trace.normalized.terms.notional_principal, + decimals=trace.currency_decimals, + unit_name=trace.currency_unit_name, + ) + issue_price = _format_asset_amount( + trace.investor_payment_amount, + decimals=trace.currency_decimals, + unit_name=trace.currency_unit_name, + ) + interest_total = _format_asset_amount( + trace.total_interest_claimed, + decimals=trace.currency_decimals, + unit_name=trace.currency_unit_name, + ) + principal_total = _format_asset_amount( + trace.total_principal_claimed, + decimals=trace.currency_decimals, + unit_name=trace.currency_unit_name, + ) + total_received_label = _format_asset_amount( + total_received, + decimals=trace.currency_decimals, + unit_name=trace.currency_unit_name, + ) + net_cash_label = _format_asset_amount( + net_cash, + decimals=trace.currency_decimals, + unit_name=trace.currency_unit_name, + ) + maturity_label = ( + _format_timestamp(trace.normalized.terms.maturity_date) + if trace.normalized.terms.maturity_date + else "open-ended" + ) + + lines = [ + trace.title, + "=" * len(trace.title), + f"Variant : {trace.contract_variant}", + f"Description : {trace.description}", + f"Units : {trace.normalized.terms.total_units}", + f"Principal : {principal}", + f"Issue price : {issue_price}", + f"Issue date : {_format_timestamp(trace.normalized.terms.initial_exchange_date)}", + f"Maturity : {maturity_label}", + ( + "Status path : " + f"{STATUS_NAMES[trace.status_before_ied]} -> " + f"{STATUS_NAMES[trace.status_after_ied]} -> " + f"{STATUS_NAMES[trace.final_status]}" + ), + ( + "Investor P&L : " + f"paid {issue_price}, received {total_received_label} " + f"(interest {interest_total}, principal {principal_total}), net {net_cash_label}" + ), + f"Timeline ({trace.currency_unit_name} amounts)", + "--------------------------------", + ] + + table_headers = ( + "id", + "evt", + "due", + "applied", + "lag", + "accrual", + "payoff", + "settled", + "interest", + "principal", + "next out", + "rate", + ) + table_rows: list[tuple[str, ...]] = [] + + for step in trace.steps: + proof = step.execution_event + proof_type = EVENT_TYPE_NAMES.get(proof["event_type"], str(proof["event_type"])) + table_rows.append( + ( + f"{step.schedule_entry.event_id:02d}", + proof_type, + _format_table_timestamp(step.schedule_entry.scheduled_time), + _format_table_timestamp(proof["applied_at"]), + _format_time_delta( + proof["applied_at"] - step.schedule_entry.scheduled_time + ), + _format_ratio(step.schedule_entry.accrual_factor), + _format_scaled_amount( + proof["payoff"], + decimals=trace.currency_decimals, + ), + _format_scaled_amount( + proof["settled_amount"], + decimals=trace.currency_decimals, + ), + ( + _format_scaled_amount( + step.claim.interest_amount, + decimals=trace.currency_decimals, + ) + if step.claim is not None + else "-" + ), + ( + _format_scaled_amount( + step.claim.principal_amount, + decimals=trace.currency_decimals, + ) + if step.claim is not None + else "-" + ), + _format_scaled_amount( + step.schedule_entry.next_outstanding_principal, + decimals=trace.currency_decimals, + ), + ( + _format_rate(step.schedule_entry.next_nominal_interest_rate) + if step.schedule_entry.next_nominal_interest_rate + else "-" + ), + ) + ) + + lines.extend(_render_table(table_headers, table_rows)) + lines.extend(["", "Execution Links", "---------------"]) + execution_link_headers = ("id", "evt", "execution", "claim") + execution_link_rows = [ + ( + f"{step.schedule_entry.event_id:02d}", + step.schedule_entry.event_type, + _format_explorer_transaction_url(step.execution_tx_id), + ( + _format_explorer_transaction_url(step.claim_tx_id) + if step.claim_tx_id is not None + else "-" + ), + ) + for step in trace.steps + ] + lines.extend(_render_table(execution_link_headers, execution_link_rows)) + return "\n".join(lines) + + +def _open_contract_account( + client: DasaClient, + *, + account_manager: SigningAccount, + holding_address: str, + payment_address: str, +) -> None: + client.send.account_open( + AccountOpenArgs( + holding_address=holding_address, + payment_address=payment_address, + ), + params=CommonAppCallParams( + sender=account_manager.address, + signer=account_manager.signer, + ), + ) + + +def setup_pam_lifecycle( + *, + client: DasaClient, + primary_dealer: DAsaPrimaryDealer, + account_manager: DAsaAccountManager, + algorand: AlgorandClient, + bank: SigningAccount, + currency: Currency, + normalized: NormalizationResult, + bank_funding_amount: int, + investor_payment_amount: int, + prospectus_url: str, +) -> PamLifecycleParticipants: + pages = normalized.schedule_pages(cst.SCHEDULE_PAGE_SIZE) + client.send.contract_config( + ContractConfigArgs( + terms=client_terms(normalized), + initial_state=client_initial_state(normalized), + prospectus=Prospectus( + hash=bytes(32), + url=prospectus_url, + ), + ), + params=CommonAppCallParams(max_fee=AlgoAmount.from_micro_algo(5_000)), + send_params=SendParams(cover_app_call_inner_transaction_fees=True), + ) + for index, page in enumerate(pages): + client.send.contract_schedule( + ContractScheduleArgs( + schedule_page_index=index, + is_last_page=index == len(pages) - 1, + schedule_page=client_schedule_page(page), + ), + params=CommonAppCallParams(max_fee=AlgoAmount.from_micro_algo(5_000)), + send_params=SendParams(cover_app_call_inner_transaction_fees=True), + ) + + if bank_funding_amount > 0: + algorand.send.asset_transfer( + AssetTransferParams( + asset_id=currency.id, + amount=bank_funding_amount, + receiver=client.app_address, + sender=bank.address, + signer=bank.signer, + ) + ) + + investor = algorand.account.random() + algorand.account.ensure_funded_from_environment( + account_to_fund=investor.address, + min_spending_balance=AlgoAmount.from_algo(10), + ) + algorand.send.asset_opt_in( + AssetOptInParams( + asset_id=currency.id, + sender=investor.address, + signer=investor.signer, + ) + ) + _open_contract_account( + client, + account_manager=account_manager, + holding_address=investor.address, + payment_address=investor.address, + ) + + algorand.send.asset_transfer( + AssetTransferParams( + asset_id=currency.id, + amount=investor_payment_amount, + receiver=investor.address, + sender=bank.address, + signer=bank.signer, + ) + ) + + receiver = algorand.account.random() + algorand.account.ensure_funded_from_environment( + account_to_fund=receiver.address, + min_spending_balance=AlgoAmount.from_algo(10), + ) + _open_contract_account( + client, + account_manager=account_manager, + holding_address=receiver.address, + payment_address=receiver.address, + ) + + assert ( + algorand.asset.get_account_information(investor.address, currency.id).balance + == investor_payment_amount + ) + + investor_purchase_txn = algorand.create_transaction.asset_transfer( + AssetTransferParams( + asset_id=currency.id, + amount=investor_payment_amount, + receiver=client.app_address, + sender=investor.address, + signer=investor.signer, + ) + ) + client.new_group().add_transaction( + investor_purchase_txn, investor.signer + ).primary_distribution( + PrimaryDistributionArgs( + holding_address=investor.address, + units=normalized.terms.total_units, + ), + params=CommonAppCallParams( + sender=primary_dealer.address, + signer=primary_dealer.signer, + ), + ).send() + + assert ( + algorand.asset.get_account_information(investor.address, currency.id).balance + == 0 + ) + assert ( + algorand.asset.get_account_information(client.app_address, currency.id).balance + == bank_funding_amount + investor_payment_amount + ) + + return PamLifecycleParticipants( + investor=investor, + receiver=receiver, + ) + + +def _format_timestamp(timestamp: int) -> str: + return datetime.fromtimestamp(timestamp, tz=UTC).strftime("%Y-%m-%d %H:%M:%SZ") + + +def _format_asset_amount(amount: int, *, decimals: int, unit_name: str) -> str: + quantizer = Decimal(1).scaleb(-decimals) + scaled = (Decimal(amount) / (Decimal(10) ** decimals)).quantize(quantizer) + return f"{scaled:,.{decimals}f} {unit_name}" + + +def _format_scaled_amount(amount: int, *, decimals: int) -> str: + quantizer = Decimal(1).scaleb(-decimals) + scaled = (Decimal(amount) / (Decimal(10) ** decimals)).quantize(quantizer) + return f"{scaled:,.{decimals}f}" + + +def _format_table_timestamp(timestamp: int) -> str: + return datetime.fromtimestamp(timestamp, tz=UTC).strftime("%Y-%m-%d") + + +def _format_time_delta(delta_seconds: int) -> str: + sign = "+" if delta_seconds >= 0 else "-" + abs_delta = abs(delta_seconds) + if abs_delta % cst.DAY_2_SEC == 0: + return f"{sign}{abs_delta // cst.DAY_2_SEC}d" + if abs_delta % 3600 == 0: + return f"{sign}{abs_delta // 3600}h" + if abs_delta % 60 == 0: + return f"{sign}{abs_delta // 60}m" + return f"{sign}{abs_delta}s" + + +def _format_ratio(value: int) -> str: + scaled = Decimal(value) / Decimal(cst.FIXED_POINT_SCALE) + return f"{scaled:.6f}" + + +def _format_rate(value: int) -> str: + percent = Decimal(value) * Decimal(100) / Decimal(cst.FIXED_POINT_SCALE) + return f"{percent:.4f}%" + + +def _format_explorer_transaction_url(tx_id: str) -> str: + return f"{LOCALNET_EXPLORER_TX_BASE_URL}{tx_id}" + + +def _render_table( + headers: tuple[str, ...], + rows: list[tuple[str, ...]], +) -> list[str]: + widths = [len(header) for header in headers] + for row in rows: + for index, cell in enumerate(row): + widths[index] = max(widths[index], len(cell)) + + left_align = {1, 2, 3} + + def render_row(row: tuple[str, ...]) -> str: + cells: list[str] = [] + for index, cell in enumerate(row): + if index in left_align: + cells.append(cell.ljust(widths[index])) + else: + cells.append(cell.rjust(widths[index])) + return " | ".join(cells) + + separator = "-+-".join("-" * width for width in widths) + return [render_row(headers), separator, *[render_row(row) for row in rows]] diff --git a/src/showcase.py b/src/showcase.py new file mode 100644 index 00000000..e453b68f --- /dev/null +++ b/src/showcase.py @@ -0,0 +1,530 @@ +from __future__ import annotations + +import argparse +from collections.abc import Callable +from dataclasses import dataclass +from typing import TypeVar + +from algokit_utils import ( + AlgoAmount, + AlgorandClient, + AssetCreateParams, + CommonAppCallParams, + SendParams, + SigningAccount, +) + +from smart_contracts import constants as cst +from smart_contracts import enums +from src import NormalizationResult, normalize_contract_attributes +from src.artifacts.dasa_client import ( + ClaimDueCashflowsArgs, + ContractCreateArgs, + DasaClient, + DasaFactory, + FundDueCashflowsArgs, + RbacAssignRoleArgs, + RoleValidity, +) +from src.contracts import make_pam_fixed_coupon_bond_profile, make_pam_zero_coupon_bond +from src.localnet import ( + Currency, + DAsaAccountManager, + DAsaPrimaryDealer, + LocalNetConfig, + algorand_client_from_localnet, + decode_actus_execution_event, + get_event_from_call_result, + get_latest_timestamp, + get_primary_tx_id, + load_localnet_config, + time_warp, +) +from src.pam_lifecycle import ( + ISSUANCE_DELAY_CYCLE, + MINIMUM_DENOMINATION, + PRINCIPAL, + PamLifecycleTrace, + PamLifecycleTraceStep, + cycle_duration_seconds, + format_lifecycle_trace, + make_claim_trace, + setup_pam_lifecycle, +) +from src.registry import EVENT_TYPE_IDS +from src.schedule import Cycle + +INITIAL_ALGO_FUNDS = AlgoAmount.from_algo(10_000) +DENOMINATION_ASA_NAME = "Euro" +DENOMINATION_ASA_UNIT = "EUR" +DENOMINATION_ASA_DECIMALS = 2 +DENOMINATION_ASA_SCALE = 10**DENOMINATION_ASA_DECIMALS +DENOMINATION_ASA_TOTAL = 10_000_000 * DENOMINATION_ASA_SCALE + +NOMINAL_RATE = 0.02 +INTEREST_PAYMENT_CYCLE = Cycle.parse_cycle("90D") +MATURITY_OFFSET_CYCLE = Cycle.parse_cycle("1800D") +ZERO_COUPON_MATURITY_CYCLE = Cycle.parse_cycle("360D") +ZERO_COUPON_DISCOUNT_BPS = 200 + +RoleAccountType = TypeVar("RoleAccountType", bound=SigningAccount) + + +@dataclass(frozen=True, slots=True) +class PamShowcaseScenario: + title: str + contract_variant: str + description: str + normalized: NormalizationResult + bank_funding_amount: int + investor_payment_amount: int + expected_total_interest_amount: int + + +def _derive_total_interest_amount(result: NormalizationResult) -> int: + outstanding_principal = result.schedule[0].next_outstanding_principal + nominal_interest_rate = ( + result.schedule[0].next_nominal_interest_rate or result.terms.rate_reset_next + ) + accrued_interest = 0 + total_interest = 0 + + for entry in result.schedule[1:]: + interest_segment = ( + outstanding_principal + * nominal_interest_rate + // result.terms.fixed_point_scale + * entry.accrual_factor + // result.terms.fixed_point_scale + ) + + if entry.event_type in {"IP", "MD"}: + total_interest += accrued_interest + interest_segment + accrued_interest = 0 + elif entry.event_type == "PR": + accrued_interest += interest_segment + + if entry.event_type in {"PR", "MD"}: + outstanding_principal = entry.next_outstanding_principal + + if entry.next_nominal_interest_rate: + nominal_interest_rate = entry.next_nominal_interest_rate + + return total_interest + + +def _build_fixed_coupon_showcase( + algorand: AlgorandClient, + currency: Currency, +) -> PamShowcaseScenario: + current_ts = get_latest_timestamp(algorand.client.algod) + issuance_delay = cycle_duration_seconds(ISSUANCE_DELAY_CYCLE) + coupon_period = cycle_duration_seconds(INTEREST_PAYMENT_CYCLE) + maturity_offset = cycle_duration_seconds(MATURITY_OFFSET_CYCLE) + if maturity_offset % coupon_period != 0: + raise ValueError("Maturity offset must be an exact multiple of coupon period") + total_coupons = maturity_offset // coupon_period + + issuance_date = current_ts + issuance_delay + first_coupon_date = issuance_date + coupon_period + maturity_date = issuance_date + maturity_offset + + attrs = make_pam_fixed_coupon_bond_profile( + contract_id=1, + status_date=current_ts, + initial_exchange_date=issuance_date, + maturity_date=maturity_date, + notional_principal=PRINCIPAL, + nominal_interest_rate=NOMINAL_RATE, + interest_payment_cycle=INTEREST_PAYMENT_CYCLE, + interest_payment_anchor=first_coupon_date, + ) + normalized = normalize_contract_attributes( + attrs, + denomination_asset_id=currency.id, + denomination_asset_decimals=currency.decimals, + notional_unit_value=MINIMUM_DENOMINATION, + secondary_market_opening_date=issuance_date, + secondary_market_closure_date=maturity_date + cst.DAY_2_SEC, + ) + if [entry.event_type for entry in normalized.schedule] != [ + "IED", + *(["IP"] * total_coupons), + "MD", + ]: + raise ValueError("Unexpected normalized schedule for fixed coupon showcase") + total_interest_amount = _derive_total_interest_amount(normalized) + + return PamShowcaseScenario( + title="D-ASA lifecycle showcase: PAM fixed coupon bond", + contract_variant="PAM:FCB", + description=f"{total_coupons} coupon periods at {NOMINAL_RATE:.2%} nominal rate", + normalized=normalized, + bank_funding_amount=total_interest_amount, + investor_payment_amount=normalized.terms.initial_exchange_amount, + expected_total_interest_amount=total_interest_amount, + ) + + +def _build_zero_coupon_showcase( + algorand: AlgorandClient, + currency: Currency, +) -> PamShowcaseScenario: + current_ts = get_latest_timestamp(algorand.client.algod) + issuance_delay = cycle_duration_seconds(ISSUANCE_DELAY_CYCLE) + maturity_offset = cycle_duration_seconds(ZERO_COUPON_MATURITY_CYCLE) + + issuance_date = current_ts + issuance_delay + maturity_date = issuance_date + maturity_offset + discount_amount = PRINCIPAL * ZERO_COUPON_DISCOUNT_BPS // cst.BPS + + attrs = make_pam_zero_coupon_bond( + contract_id=2, + status_date=current_ts, + initial_exchange_date=issuance_date, + maturity_date=maturity_date, + notional_principal=PRINCIPAL, + premium_discount_at_ied=discount_amount, + ) + normalized = normalize_contract_attributes( + attrs, + denomination_asset_id=currency.id, + denomination_asset_decimals=currency.decimals, + notional_unit_value=MINIMUM_DENOMINATION, + secondary_market_opening_date=issuance_date, + secondary_market_closure_date=maturity_date + cst.DAY_2_SEC, + ) + if [entry.event_type for entry in normalized.schedule] != ["IED", "MD"]: + raise ValueError("Unexpected normalized schedule for zero coupon showcase") + + return PamShowcaseScenario( + title="D-ASA lifecycle showcase: PAM zero coupon bond", + contract_variant="PAM:ZCB", + description=f"{ZERO_COUPON_DISCOUNT_BPS / cst.BPS:.2%} discount at issuance, single maturity redemption", + normalized=normalized, + bank_funding_amount=normalized.terms.notional_principal + - normalized.terms.initial_exchange_amount, + investor_payment_amount=normalized.terms.initial_exchange_amount, + expected_total_interest_amount=0, + ) + + +SHOWCASE_BUILDERS: tuple[ + Callable[[AlgorandClient, Currency], PamShowcaseScenario], + ..., +] = ( + _build_fixed_coupon_showcase, + _build_zero_coupon_showcase, +) + + +def run_showcase_scenario( + *, + algorand: AlgorandClient, + bank: SigningAccount, + currency: Currency, + d_asa_client: DasaClient, + pam_primary_dealer: DAsaPrimaryDealer, + pam_account_manager: DAsaAccountManager, + build_scenario: Callable[[AlgorandClient, Currency], PamShowcaseScenario], +) -> PamLifecycleTrace: + scenario = build_scenario(algorand, currency) + participants = setup_pam_lifecycle( + client=d_asa_client, + primary_dealer=pam_primary_dealer, + account_manager=pam_account_manager, + algorand=algorand, + bank=bank, + currency=currency, + normalized=scenario.normalized, + bank_funding_amount=scenario.bank_funding_amount, + investor_payment_amount=scenario.investor_payment_amount, + prospectus_url=scenario.title, + ) + investor = participants.investor + client = d_asa_client + + initial_state = client.send.contract_get_state().abi_return + if initial_state.status != enums.STATUS_PENDING_IED: + raise ValueError("Contract must start in PENDING_IED") + if initial_state.schedule_entry_count != len(scenario.normalized.schedule): + raise ValueError("Unexpected schedule length in showcase contract state") + + ied_entry = scenario.normalized.schedule[0] + time_warp(ied_entry.scheduled_time + cst.DAY_2_SEC, algorand=algorand) + ied_result = client.send.contract_execute_ied() + ied_event = decode_actus_execution_event(get_event_from_call_result(ied_result)) + if ied_event["event_id"] != ied_entry.event_id: + raise ValueError("Unexpected IED event id") + if ied_event["event_type"] != EVENT_TYPE_IDS["IED"]: + raise ValueError("Unexpected IED event type") + if ied_event["scheduled_time"] != ied_entry.scheduled_time: + raise ValueError("Unexpected IED scheduled time") + if ied_event["payoff"] != scenario.investor_payment_amount: + raise ValueError("Unexpected IED payoff") + if ied_event["payoff_sign"] != enums.PAYOFF_SIGN_POSITIVE: + raise ValueError("Unexpected IED payoff sign") + if ied_event["settled_amount"] != 0: + raise ValueError("IED should not settle holder cashflows") + if ied_event["sequence"] != ied_entry.event_id + 1: + raise ValueError("Unexpected IED sequence") + + steps: list[PamLifecycleTraceStep] = [ + PamLifecycleTraceStep( + schedule_entry=ied_entry, + execution_event=ied_event, + funded_amount=0, + execution_tx_id=get_primary_tx_id(ied_result), + ) + ] + + active_state = client.send.contract_get_state().abi_return + if active_state.status != enums.STATUS_ACTIVE: + raise ValueError("Contract must become ACTIVE after IED") + if active_state.event_cursor != 1: + raise ValueError("Unexpected event cursor after IED") + total_interest_claimed = 0 + total_principal_claimed = 0 + + for entry in scenario.normalized.schedule[1:]: + time_warp(entry.scheduled_time, algorand=algorand) + + funding_result = client.send.fund_due_cashflows( + FundDueCashflowsArgs(max_event_count=1) + ) + funding = funding_result.abi_return + event = decode_actus_execution_event(get_event_from_call_result(funding_result)) + if funding.processed_events != 1: + raise ValueError("Showcase funding should process exactly one event") + if funding.total_funded <= 0: + raise ValueError("Showcase funding must reserve a positive amount") + if event["event_id"] != entry.event_id: + raise ValueError("Unexpected funding event id") + if event["event_type"] != EVENT_TYPE_IDS[entry.event_type]: + raise ValueError("Unexpected funding event type") + if event["scheduled_time"] != entry.scheduled_time: + raise ValueError("Unexpected funding scheduled time") + if event["payoff"] != funding.total_funded: + raise ValueError("Unexpected funding payoff") + if event["payoff_sign"] != enums.PAYOFF_SIGN_NEGATIVE: + raise ValueError("Unexpected funding payoff sign") + if event["settled_amount"] != funding.total_funded: + raise ValueError("Unexpected settled amount") + if event["sequence"] != entry.event_id + 1: + raise ValueError("Unexpected funding sequence") + + balance_before = algorand.asset.get_account_information( + investor.address, + currency.id, + ).balance + claim_result = client.send.claim_due_cashflows( + ClaimDueCashflowsArgs( + holding_address=investor.address, + payment_info=b"", + ), + params=CommonAppCallParams( + sender=investor.address, + signer=investor.signer, + max_fee=AlgoAmount.from_micro_algo(3_000), + ), + send_params=SendParams(cover_app_call_inner_transaction_fees=True), + ) + claim = claim_result.abi_return + balance_after = algorand.asset.get_account_information( + investor.address, + currency.id, + ).balance + + if claim.total_amount != funding.total_funded: + raise ValueError("Claimed amount does not match funded amount") + if balance_after - balance_before != claim.total_amount: + raise ValueError("Investor settlement balance does not match claim amount") + + steps.append( + PamLifecycleTraceStep( + schedule_entry=entry, + execution_event=event, + funded_amount=funding.total_funded, + execution_tx_id=get_primary_tx_id(funding_result), + claim=make_claim_trace( + interest_amount=claim.interest_amount, + principal_amount=claim.principal_amount, + total_amount=claim.total_amount, + timestamp=claim.timestamp, + ), + claim_tx_id=get_primary_tx_id(claim_result), + ) + ) + total_interest_claimed += claim.interest_amount + total_principal_claimed += claim.principal_amount + + final_state = client.send.contract_get_state().abi_return + if final_state.status != enums.STATUS_ENDED: + raise ValueError("Showcase contract did not end cleanly") + if final_state.event_cursor != len(scenario.normalized.schedule): + raise ValueError("Unexpected final event cursor") + if total_interest_claimed != scenario.expected_total_interest_amount: + raise ValueError("Unexpected total claimed interest") + if total_principal_claimed != scenario.normalized.terms.notional_principal: + raise ValueError("Unexpected total claimed principal") + + return PamLifecycleTrace( + title=scenario.title, + contract_variant=scenario.contract_variant, + description=scenario.description, + normalized=scenario.normalized, + currency_decimals=currency.decimals, + currency_unit_name=currency.unit_name, + investor_payment_amount=scenario.investor_payment_amount, + total_interest_claimed=total_interest_claimed, + total_principal_claimed=total_principal_claimed, + status_before_ied=initial_state.status, + status_after_ied=active_state.status, + final_status=final_state.status, + steps=tuple(steps), + ) + + +def _create_funded_account(algorand: AlgorandClient) -> SigningAccount: + account = algorand.account.random() + algorand.account.ensure_funded_from_environment( + account_to_fund=account.address, + min_spending_balance=INITIAL_ALGO_FUNDS, + ) + return account + + +def _create_currency(algorand: AlgorandClient, bank: SigningAccount) -> Currency: + currency_id = algorand.send.asset_create( + AssetCreateParams( + sender=bank.address, + signer=bank.signer, + total=DENOMINATION_ASA_TOTAL, + decimals=DENOMINATION_ASA_DECIMALS, + asset_name=DENOMINATION_ASA_NAME, + unit_name=DENOMINATION_ASA_UNIT, + ) + ).asset_id + + return Currency( + id=currency_id, + total=DENOMINATION_ASA_TOTAL, + decimals=DENOMINATION_ASA_DECIMALS, + name=DENOMINATION_ASA_NAME, + unit_name=DENOMINATION_ASA_UNIT, + asa_to_unit=1 / 10**DENOMINATION_ASA_DECIMALS, + ) + + +def _create_dasa_client( + algorand: AlgorandClient, + arranger: SigningAccount, +) -> DasaClient: + factory = algorand.client.get_typed_app_factory( + DasaFactory, + default_sender=arranger.address, + default_signer=arranger.signer, + ) + client, _ = factory.send.create.contract_create( + ContractCreateArgs(arranger=arranger.address) + ) + algorand.account.ensure_funded_from_environment( + account_to_fund=client.app_address, + min_spending_balance=INITIAL_ALGO_FUNDS, + ) + return client + + +def _create_role_account( + algorand: AlgorandClient, + role_account_class: type[RoleAccountType], + client: DasaClient, +) -> RoleAccountType: + account = _create_funded_account(algorand) + role_account = role_account_class(private_key=account.private_key) + client.send.rbac_assign_role( + RbacAssignRoleArgs( + role_id=role_account.role_id(), + role_address=role_account.address, + validity=RoleValidity( + role_validity_start=0, + role_validity_end=2**64 - 1, + ), + ) + ) + return role_account + + +def run_showcase_suite( + localnet_config: LocalNetConfig | None = None, +) -> tuple[PamLifecycleTrace, ...]: + algorand = algorand_client_from_localnet( + localnet_config or load_localnet_config(default_host="host.docker.internal") + ) + arranger = _create_funded_account(algorand) + bank = _create_funded_account(algorand) + traces: list[PamLifecycleTrace] = [] + + for build_scenario in SHOWCASE_BUILDERS: + currency = _create_currency(algorand, bank) + d_asa_client = _create_dasa_client(algorand, arranger) + pam_primary_dealer = _create_role_account( + algorand, + DAsaPrimaryDealer, + d_asa_client, + ) + pam_account_manager = _create_role_account( + algorand, + DAsaAccountManager, + d_asa_client, + ) + traces.append( + run_showcase_scenario( + algorand=algorand, + bank=bank, + currency=currency, + d_asa_client=d_asa_client, + pam_primary_dealer=pam_primary_dealer, + pam_account_manager=pam_account_manager, + build_scenario=build_scenario, + ) + ) + + return tuple(traces) + + +def _build_parser() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser( + description="Run the D-ASA LocalNet showcase scenarios.", + ) + parser.add_argument("--localnet-host", help="Override the LocalNet host.") + parser.add_argument("--localnet-token", help="Override the LocalNet API token.") + parser.add_argument("--algod-port", type=int, help="Override the algod port.") + parser.add_argument("--kmd-port", type=int, help="Override the kmd port.") + parser.add_argument("--indexer-port", type=int, help="Override the indexer port.") + return parser + + +def _config_from_args(args: argparse.Namespace) -> LocalNetConfig: + base = load_localnet_config(default_host="host.docker.internal") + return LocalNetConfig( + host=args.localnet_host or base.host, + token=args.localnet_token or base.token, + algod_port=args.algod_port or base.algod_port, + kmd_port=args.kmd_port or base.kmd_port, + indexer_port=args.indexer_port or base.indexer_port, + ) + + +def main() -> None: + parser = _build_parser() + args = parser.parse_args() + traces = run_showcase_suite(_config_from_args(args)) + for index, trace in enumerate(traces): + if index: + print() + print(format_lifecycle_trace(trace)) + + +if __name__ == "__main__": + main() From a1757aae316a7a75ef9c2453399be0809ca69e36 Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 18:31:09 +0100 Subject: [PATCH 190/244] test: localnet showcase --- tests/sdk/test_localnet.py | 46 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 tests/sdk/test_localnet.py diff --git a/tests/sdk/test_localnet.py b/tests/sdk/test_localnet.py new file mode 100644 index 00000000..28f27987 --- /dev/null +++ b/tests/sdk/test_localnet.py @@ -0,0 +1,46 @@ +from src.localnet import ( + DEFAULT_ALGOD_PORT, + DEFAULT_INDEXER_PORT, + DEFAULT_KMD_PORT, + DEFAULT_LOCALNET_TOKEN, + LocalNetConfig, + load_localnet_config, +) + + +def test_load_localnet_config_uses_defaults_for_demo_host(monkeypatch) -> None: + monkeypatch.delenv("D_ASA_LOCALNET_HOST", raising=False) + monkeypatch.delenv("D_ASA_LOCALNET_TOKEN", raising=False) + monkeypatch.delenv("D_ASA_ALGOD_PORT", raising=False) + monkeypatch.delenv("D_ASA_KMD_PORT", raising=False) + monkeypatch.delenv("D_ASA_INDEXER_PORT", raising=False) + + config = load_localnet_config(default_host="host.docker.internal") + + assert config == LocalNetConfig( + host="host.docker.internal", + token=DEFAULT_LOCALNET_TOKEN, + algod_port=DEFAULT_ALGOD_PORT, + kmd_port=DEFAULT_KMD_PORT, + indexer_port=DEFAULT_INDEXER_PORT, + ) + + +def test_load_localnet_config_reads_environment_overrides(monkeypatch) -> None: + monkeypatch.setenv("D_ASA_LOCALNET_HOST", "demo-net") + monkeypatch.setenv("D_ASA_LOCALNET_TOKEN", "token") + monkeypatch.setenv("D_ASA_ALGOD_PORT", "14001") + monkeypatch.setenv("D_ASA_KMD_PORT", "14002") + monkeypatch.setenv("D_ASA_INDEXER_PORT", "18980") + + config = load_localnet_config(default_host="ignored") + + assert config == LocalNetConfig( + host="demo-net", + token="token", + algod_port=14001, + kmd_port=14002, + indexer_port=18980, + ) + assert config.algod_client_config().server == "http://demo-net" + assert config.algod_client_config().port == 14001 From a43e1e90379d45adc1855a6b4717593042e3d54f Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 18:31:21 +0100 Subject: [PATCH 191/244] test: localnet showcase --- tests/pam/test_pam_lifecycle_showcase.py | 353 +---------------------- 1 file changed, 14 insertions(+), 339 deletions(-) diff --git a/tests/pam/test_pam_lifecycle_showcase.py b/tests/pam/test_pam_lifecycle_showcase.py index 35ce628c..0c82075d 100644 --- a/tests/pam/test_pam_lifecycle_showcase.py +++ b/tests/pam/test_pam_lifecycle_showcase.py @@ -1,337 +1,18 @@ from __future__ import annotations from collections.abc import Callable -from dataclasses import dataclass import pytest -from algokit_utils import ( - AlgoAmount, - AlgorandClient, - CommonAppCallParams, - SendParams, - SigningAccount, -) - -from smart_contracts import constants as cst -from smart_contracts import enums -from src import NormalizationResult, normalize_contract_attributes -from src.artifacts.dasa_client import ( - ClaimDueCashflowsArgs, - DasaClient, - FundDueCashflowsArgs, -) -from src.contracts import make_pam_fixed_coupon_bond_profile, make_pam_zero_coupon_bond -from src.registry import EVENT_TYPE_IDS -from src.schedule import Cycle -from tests import utils -from tests.pam.pam_test_support import ( - ISSUANCE_DELAY_CYCLE, - MINIMUM_DENOMINATION, - PRINCIPAL, - PamLifecycleTrace, - PamLifecycleTraceStep, - cycle_duration_seconds, - format_lifecycle_trace, - make_claim_trace, - setup_pam_lifecycle, -) - -NOMINAL_RATE = 0.02 -INTEREST_PAYMENT_CYCLE = Cycle.parse_cycle("90D") -MATURITY_OFFSET_CYCLE = Cycle.parse_cycle("1800D") -ZERO_COUPON_MATURITY_CYCLE = Cycle.parse_cycle("360D") -ZERO_COUPON_DISCOUNT_BPS = 200 - - -@dataclass(frozen=True, slots=True) -class PamShowcaseScenario: - title: str - contract_variant: str - description: str - normalized: NormalizationResult - bank_funding_amount: int - investor_payment_amount: int - expected_total_interest_amount: int - - -def _derive_total_interest_amount(result: NormalizationResult) -> int: - outstanding_principal = result.schedule[0].next_outstanding_principal - nominal_interest_rate = ( - result.schedule[0].next_nominal_interest_rate or result.terms.rate_reset_next - ) - accrued_interest = 0 - total_interest = 0 - - for entry in result.schedule[1:]: - interest_segment = ( - outstanding_principal - * nominal_interest_rate - // result.terms.fixed_point_scale - * entry.accrual_factor - // result.terms.fixed_point_scale - ) - - if entry.event_type in {"IP", "MD"}: - total_interest += accrued_interest + interest_segment - accrued_interest = 0 - elif entry.event_type == "PR": - accrued_interest += interest_segment - - if entry.event_type in {"PR", "MD"}: - outstanding_principal = entry.next_outstanding_principal - - if entry.next_nominal_interest_rate: - nominal_interest_rate = entry.next_nominal_interest_rate - - return total_interest - - -def _build_fixed_coupon_showcase( - algorand: AlgorandClient, - currency: utils.Currency, -) -> PamShowcaseScenario: - current_ts = utils.get_latest_timestamp(algorand.client.algod) - issuance_delay = cycle_duration_seconds(ISSUANCE_DELAY_CYCLE) - coupon_period = cycle_duration_seconds(INTEREST_PAYMENT_CYCLE) - maturity_offset = cycle_duration_seconds(MATURITY_OFFSET_CYCLE) - assert maturity_offset % coupon_period == 0 - total_coupons = maturity_offset // coupon_period - - issuance_date = current_ts + issuance_delay - first_coupon_date = issuance_date + coupon_period - maturity_date = issuance_date + maturity_offset - - attrs = make_pam_fixed_coupon_bond_profile( - contract_id=1, - status_date=current_ts, - initial_exchange_date=issuance_date, - maturity_date=maturity_date, - notional_principal=PRINCIPAL, - nominal_interest_rate=NOMINAL_RATE, - interest_payment_cycle=INTEREST_PAYMENT_CYCLE, - interest_payment_anchor=first_coupon_date, - ) - normalized = normalize_contract_attributes( - attrs, - denomination_asset_id=currency.id, - denomination_asset_decimals=currency.decimals, - notional_unit_value=MINIMUM_DENOMINATION, - secondary_market_opening_date=issuance_date, - secondary_market_closure_date=maturity_date + cst.DAY_2_SEC, - ) - assert [entry.event_type for entry in normalized.schedule] == [ - "IED", - *(["IP"] * total_coupons), - "MD", - ] - total_interest_amount = _derive_total_interest_amount(normalized) - - return PamShowcaseScenario( - title="D-ASA lifecycle showcase: PAM fixed coupon bond", - contract_variant="PAM:FCB", - description=f"{total_coupons} coupon periods at {NOMINAL_RATE:.2%} nominal rate", - normalized=normalized, - bank_funding_amount=total_interest_amount, - investor_payment_amount=normalized.terms.initial_exchange_amount, - expected_total_interest_amount=total_interest_amount, - ) - - -def _build_zero_coupon_showcase( - algorand: AlgorandClient, - currency: utils.Currency, -) -> PamShowcaseScenario: - current_ts = utils.get_latest_timestamp(algorand.client.algod) - issuance_delay = cycle_duration_seconds(ISSUANCE_DELAY_CYCLE) - maturity_offset = cycle_duration_seconds(ZERO_COUPON_MATURITY_CYCLE) - - issuance_date = current_ts + issuance_delay - maturity_date = issuance_date + maturity_offset - discount_amount = PRINCIPAL * ZERO_COUPON_DISCOUNT_BPS // cst.BPS - - attrs = make_pam_zero_coupon_bond( - contract_id=2, - status_date=current_ts, - initial_exchange_date=issuance_date, - maturity_date=maturity_date, - notional_principal=PRINCIPAL, - premium_discount_at_ied=discount_amount, - ) - normalized = normalize_contract_attributes( - attrs, - denomination_asset_id=currency.id, - denomination_asset_decimals=currency.decimals, - notional_unit_value=MINIMUM_DENOMINATION, - secondary_market_opening_date=issuance_date, - secondary_market_closure_date=maturity_date + cst.DAY_2_SEC, - ) - assert [entry.event_type for entry in normalized.schedule] == ["IED", "MD"] - - return PamShowcaseScenario( - title="D-ASA lifecycle showcase: PAM zero coupon bond", - contract_variant="PAM:ZCB", - description=f"{ZERO_COUPON_DISCOUNT_BPS / cst.BPS:.2%} discount at issuance, single maturity redemption", - normalized=normalized, - bank_funding_amount=normalized.terms.notional_principal - - normalized.terms.initial_exchange_amount, - investor_payment_amount=normalized.terms.initial_exchange_amount, - expected_total_interest_amount=0, - ) - - -def _run_showcase_scenario( - *, - algorand: AlgorandClient, - bank: SigningAccount, - currency: utils.Currency, - d_asa_client: DasaClient, - pam_primary_dealer: utils.DAsaPrimaryDealer, - pam_account_manager: utils.DAsaAccountManager, - scenario: PamShowcaseScenario, -) -> PamLifecycleTrace: - participants = setup_pam_lifecycle( - client=d_asa_client, - primary_dealer=pam_primary_dealer, - account_manager=pam_account_manager, - algorand=algorand, - bank=bank, - currency=currency, - normalized=scenario.normalized, - bank_funding_amount=scenario.bank_funding_amount, - investor_payment_amount=scenario.investor_payment_amount, - prospectus_url=scenario.title, - ) - investor = participants.investor - client = d_asa_client - - initial_state = client.send.contract_get_state().abi_return - assert initial_state.status == enums.STATUS_PENDING_IED - assert initial_state.schedule_entry_count == len(scenario.normalized.schedule) - - ied_entry = scenario.normalized.schedule[0] - utils.time_warp(ied_entry.scheduled_time + cst.DAY_2_SEC) - ied_result = client.send.contract_execute_ied() - ied_event = utils.decode_actus_execution_event( - utils.get_event_from_call_result(ied_result) - ) - assert ied_event["event_id"] == ied_entry.event_id - assert ied_event["event_type"] == EVENT_TYPE_IDS["IED"] - assert ied_event["scheduled_time"] == ied_entry.scheduled_time - assert ied_event["payoff"] == scenario.investor_payment_amount - assert ied_event["payoff_sign"] == enums.PAYOFF_SIGN_POSITIVE - assert ied_event["settled_amount"] == 0 - assert ied_event["sequence"] == ied_entry.event_id + 1 +from algokit_utils import AlgorandClient, SigningAccount - steps: list[PamLifecycleTraceStep] = [ - PamLifecycleTraceStep( - schedule_entry=ied_entry, - execution_event=ied_event, - funded_amount=0, - execution_tx_id=utils.get_primary_tx_id(ied_result), - ) - ] - - active_state = client.send.contract_get_state().abi_return - assert active_state.status == enums.STATUS_ACTIVE - assert active_state.event_cursor == 1 - - total_interest_claimed = 0 - total_principal_claimed = 0 - - for entry in scenario.normalized.schedule[1:]: - utils.time_warp(entry.scheduled_time) - - funding_result = client.send.fund_due_cashflows( - FundDueCashflowsArgs(max_event_count=1) - ) - funding = funding_result.abi_return - assert funding.processed_events == 1 - assert funding.total_funded > 0 - - event = utils.decode_actus_execution_event( - utils.get_event_from_call_result(funding_result) - ) - assert event["event_id"] == entry.event_id - assert event["event_type"] == EVENT_TYPE_IDS[entry.event_type] - assert event["scheduled_time"] == entry.scheduled_time - assert event["payoff"] == funding.total_funded - assert event["payoff_sign"] == enums.PAYOFF_SIGN_NEGATIVE - assert event["settled_amount"] == funding.total_funded - assert event["sequence"] == entry.event_id + 1 - - balance_before = algorand.asset.get_account_information( - investor.address, - currency.id, - ).balance - claim_result = client.send.claim_due_cashflows( - ClaimDueCashflowsArgs( - holding_address=investor.address, - payment_info=b"", - ), - params=CommonAppCallParams( - sender=investor.address, - signer=investor.signer, - max_fee=AlgoAmount.from_micro_algo(3_000), - ), - send_params=SendParams(cover_app_call_inner_transaction_fees=True), - ) - claim = claim_result.abi_return - balance_after = algorand.asset.get_account_information( - investor.address, - currency.id, - ).balance - - assert claim.total_amount == funding.total_funded - assert balance_after - balance_before == claim.total_amount - - steps.append( - PamLifecycleTraceStep( - schedule_entry=entry, - execution_event=event, - funded_amount=funding.total_funded, - execution_tx_id=utils.get_primary_tx_id(funding_result), - claim=make_claim_trace( - interest_amount=claim.interest_amount, - principal_amount=claim.principal_amount, - total_amount=claim.total_amount, - timestamp=claim.timestamp, - ), - claim_tx_id=utils.get_primary_tx_id(claim_result), - ) - ) - total_interest_claimed += claim.interest_amount - total_principal_claimed += claim.principal_amount - - final_state = client.send.contract_get_state().abi_return - assert final_state.status == enums.STATUS_ENDED - assert final_state.event_cursor == len(scenario.normalized.schedule) - assert total_interest_claimed == scenario.expected_total_interest_amount - assert total_principal_claimed == scenario.normalized.terms.notional_principal - - return PamLifecycleTrace( - title=scenario.title, - contract_variant=scenario.contract_variant, - description=scenario.description, - normalized=scenario.normalized, - currency_decimals=currency.decimals, - currency_unit_name=currency.unit_name, - investor_payment_amount=scenario.investor_payment_amount, - total_interest_claimed=total_interest_claimed, - total_principal_claimed=total_principal_claimed, - status_before_ied=initial_state.status, - status_after_ied=active_state.status, - final_status=final_state.status, - steps=tuple(steps), - ) - - -SHOWCASE_BUILDERS: tuple[ - Callable[[AlgorandClient, utils.Currency], PamShowcaseScenario], - ..., -] = ( - _build_fixed_coupon_showcase, - _build_zero_coupon_showcase, +from src.artifacts.dasa_client import DasaClient +from src.localnet import Currency, DAsaAccountManager, DAsaPrimaryDealer +from src.showcase import ( + SHOWCASE_BUILDERS, + PamShowcaseScenario, + run_showcase_scenario, ) +from tests.pam.pam_test_support import format_lifecycle_trace @pytest.mark.parametrize( @@ -343,26 +24,20 @@ def _run_showcase_scenario( def test_pam_lifecycle_showcase( algorand: AlgorandClient, bank: SigningAccount, - currency: utils.Currency, + currency: Currency, d_asa_client: DasaClient, - pam_primary_dealer: utils.DAsaPrimaryDealer, - pam_account_manager: utils.DAsaAccountManager, - build_scenario: Callable[[AlgorandClient, utils.Currency], PamShowcaseScenario], + pam_primary_dealer: DAsaPrimaryDealer, + pam_account_manager: DAsaAccountManager, + build_scenario: Callable[[AlgorandClient, Currency], PamShowcaseScenario], ) -> None: - """ - Run with `pytest -s` to print the normalized ACTUS schedule beside the - real ARC-28 execution proofs and realized holder cashflows. - """ - - scenario = build_scenario(algorand, currency) - trace = _run_showcase_scenario( + trace = run_showcase_scenario( algorand=algorand, bank=bank, currency=currency, d_asa_client=d_asa_client, pam_primary_dealer=pam_primary_dealer, pam_account_manager=pam_account_manager, - scenario=scenario, + build_scenario=build_scenario, ) print() From c4664293d72beb46e2bb4f541efe26e5912d4530 Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 18:31:31 +0100 Subject: [PATCH 192/244] test: localnet showcase --- tests/pam/pam_test_support.py | 573 +++------------------------------- tests/utils.py | 354 ++------------------- 2 files changed, 74 insertions(+), 853 deletions(-) diff --git a/tests/pam/pam_test_support.py b/tests/pam/pam_test_support.py index 7a537cf8..03a33b39 100644 --- a/tests/pam/pam_test_support.py +++ b/tests/pam/pam_test_support.py @@ -1,480 +1,59 @@ -from __future__ import annotations - -from dataclasses import dataclass -from datetime import UTC, datetime -from decimal import Decimal - import pytest from algokit_utils import ( - AlgoAmount, - AlgorandClient, - AssetOptInParams, - AssetTransferParams, CommonAppCallParams, LogicError, - SendParams, SigningAccount, ) -from smart_contracts import constants as cst -from smart_contracts import enums from smart_contracts import errors as err -from src import ExecutionScheduleEntry, NormalizationResult from src.artifacts.dasa_client import ( - AccountOpenArgs, ClaimDueCashflowsArgs, - ContractConfigArgs, - ContractScheduleArgs, DasaClient, FundDueCashflowsArgs, - InitialKernelState, - NormalizedActusTerms, - PrimaryDistributionArgs, - Prospectus, TransferArgs, ) -from src.registry import EVENT_TYPE_IDS -from src.schedule import Cycle -from tests import utils - -PRINCIPAL = 10_000 -MINIMUM_DENOMINATION = 100 -ISSUANCE_DELAY_CYCLE = Cycle.parse_cycle("30D") -LOCALNET_EXPLORER_TX_BASE_URL = "https://lora.algokit.io/localnet/transaction/" -EVENT_TYPE_NAMES = {value: key for key, value in EVENT_TYPE_IDS.items()} -STATUS_NAMES = { - enums.STATUS_INACTIVE: "INACTIVE", - enums.STATUS_PENDING_IED: "PENDING_IED", - enums.STATUS_ACTIVE: "ACTIVE", - enums.STATUS_ENDED: "ENDED", -} -PAYOFF_SIGN_NAMES = { - enums.PAYOFF_SIGN_POSITIVE: "+", - enums.PAYOFF_SIGN_NEGATIVE: "-", -} - - -@dataclass(frozen=True) -class PamLifecycleParticipants: - investor: SigningAccount - receiver: SigningAccount - - -@dataclass(frozen=True, slots=True) -class PamLifecycleClaimTrace: - interest_amount: int - principal_amount: int - total_amount: int - timestamp: int - - -@dataclass(frozen=True, slots=True) -class PamLifecycleTraceStep: - schedule_entry: ExecutionScheduleEntry - execution_event: dict[str, int] - funded_amount: int - execution_tx_id: str - claim: PamLifecycleClaimTrace | None = None - claim_tx_id: str | None = None - - -@dataclass(frozen=True, slots=True) -class PamLifecycleTrace: - title: str - contract_variant: str - description: str - normalized: NormalizationResult - currency_decimals: int - currency_unit_name: str - investor_payment_amount: int - total_interest_claimed: int - total_principal_claimed: int - status_before_ied: int - status_after_ied: int - final_status: int - steps: tuple[PamLifecycleTraceStep, ...] - - -def client_terms(result: NormalizationResult) -> NormalizedActusTerms: - return NormalizedActusTerms( - contract_type=result.terms.contract_type, - denomination_asset_id=result.terms.denomination_asset_id, - settlement_asset_id=result.terms.denomination_asset_id, - total_units=result.terms.total_units, - notional_principal=result.terms.notional_principal, - initial_exchange_amount=result.terms.initial_exchange_amount, - initial_exchange_date=result.terms.initial_exchange_date, - maturity_date=result.terms.maturity_date or 0, - day_count_convention=int(result.terms.day_count_convention), - rate_reset_spread=result.terms.rate_reset_spread, - rate_reset_multiplier=result.terms.rate_reset_multiplier, - rate_reset_floor=result.terms.rate_reset_floor, - rate_reset_cap=result.terms.rate_reset_cap, - rate_reset_next=result.terms.rate_reset_next, - has_rate_reset_floor=result.terms.has_rate_reset_floor, - has_rate_reset_cap=result.terms.has_rate_reset_cap, - dynamic_principal_redemption=result.terms.dynamic_principal_redemption, - fixed_point_scale=result.terms.fixed_point_scale, - ) - - -def client_initial_state(result: NormalizationResult) -> InitialKernelState: - return InitialKernelState( - status_date=result.initial_state.status_date, - event_cursor=result.initial_state.event_cursor, - outstanding_principal=result.initial_state.outstanding_principal, - interest_calculation_base=result.initial_state.interest_calculation_base, - nominal_interest_rate=result.initial_state.nominal_interest_rate, - accrued_interest=result.initial_state.accrued_interest, - next_principal_redemption=result.initial_state.next_principal_redemption, - cumulative_interest_index=result.initial_state.cumulative_interest_index, - cumulative_principal_index=result.initial_state.cumulative_principal_index, - ) - - -def client_schedule_page( - page: tuple, -) -> list[tuple[int, int, int, int, int, int, int, int, int]]: - return [ - ( - entry.event_id, - EVENT_TYPE_IDS[entry.event_type], - entry.scheduled_time, - entry.accrual_factor, - entry.redemption_accrual_factor, - entry.next_nominal_interest_rate, - entry.next_principal_redemption, - entry.next_outstanding_principal, - entry.flags, - ) - for entry in page - ] - - -def cycle_duration_seconds(cycle: Cycle) -> int: - if cycle.unit == "D": - return cycle.count * cst.DAY_2_SEC - if cycle.unit == "W": - return cycle.count * 7 * cst.DAY_2_SEC - raise ValueError(f"Unsupported fixed-duration ACTUS cycle for this test: {cycle}") - - -def scale_currency_amount(amount: int, currency_scale: int) -> int: - return amount * currency_scale - - -def make_claim_trace( - *, - interest_amount: int, - principal_amount: int, - total_amount: int, - timestamp: int, -) -> PamLifecycleClaimTrace: - return PamLifecycleClaimTrace( - interest_amount=interest_amount, - principal_amount=principal_amount, - total_amount=total_amount, - timestamp=timestamp, - ) - - -def format_lifecycle_trace(trace: PamLifecycleTrace) -> str: - total_received = trace.total_interest_claimed + trace.total_principal_claimed - net_cash = total_received - trace.investor_payment_amount - principal = _format_asset_amount( - trace.normalized.terms.notional_principal, - decimals=trace.currency_decimals, - unit_name=trace.currency_unit_name, - ) - issue_price = _format_asset_amount( - trace.investor_payment_amount, - decimals=trace.currency_decimals, - unit_name=trace.currency_unit_name, - ) - interest_total = _format_asset_amount( - trace.total_interest_claimed, - decimals=trace.currency_decimals, - unit_name=trace.currency_unit_name, - ) - principal_total = _format_asset_amount( - trace.total_principal_claimed, - decimals=trace.currency_decimals, - unit_name=trace.currency_unit_name, - ) - total_received_label = _format_asset_amount( - total_received, - decimals=trace.currency_decimals, - unit_name=trace.currency_unit_name, - ) - net_cash_label = _format_asset_amount( - net_cash, - decimals=trace.currency_decimals, - unit_name=trace.currency_unit_name, - ) - maturity_label = ( - _format_timestamp(trace.normalized.terms.maturity_date) - if trace.normalized.terms.maturity_date - else "open-ended" - ) - - lines = [ - trace.title, - "=" * len(trace.title), - f"Variant : {trace.contract_variant}", - f"Description : {trace.description}", - f"Units : {trace.normalized.terms.total_units}", - f"Principal : {principal}", - f"Issue price : {issue_price}", - f"Issue date : {_format_timestamp(trace.normalized.terms.initial_exchange_date)}", - f"Maturity : {maturity_label}", - ( - "Status path : " - f"{STATUS_NAMES[trace.status_before_ied]} -> " - f"{STATUS_NAMES[trace.status_after_ied]} -> " - f"{STATUS_NAMES[trace.final_status]}" - ), - ( - "Investor P&L : " - f"paid {issue_price}, received {total_received_label} " - f"(interest {interest_total}, principal {principal_total}), net {net_cash_label}" - ), - f"Timeline ({trace.currency_unit_name} amounts)", - "--------------------------------", - ] - - table_headers = ( - "id", - "evt", - "due", - "applied", - "lag", - "accrual", - "payoff", - "settled", - "interest", - "principal", - "next out", - "rate", - ) - table_rows: list[tuple[str, ...]] = [] - - for step in trace.steps: - proof = step.execution_event - proof_type = EVENT_TYPE_NAMES.get(proof["event_type"], str(proof["event_type"])) - table_rows.append( - ( - f"{step.schedule_entry.event_id:02d}", - proof_type, - _format_table_timestamp(step.schedule_entry.scheduled_time), - _format_table_timestamp(proof["applied_at"]), - _format_time_delta( - proof["applied_at"] - step.schedule_entry.scheduled_time - ), - _format_ratio(step.schedule_entry.accrual_factor), - _format_scaled_amount( - proof["payoff"], - decimals=trace.currency_decimals, - ), - _format_scaled_amount( - proof["settled_amount"], - decimals=trace.currency_decimals, - ), - ( - _format_scaled_amount( - step.claim.interest_amount, - decimals=trace.currency_decimals, - ) - if step.claim is not None - else "-" - ), - ( - _format_scaled_amount( - step.claim.principal_amount, - decimals=trace.currency_decimals, - ) - if step.claim is not None - else "-" - ), - _format_scaled_amount( - step.schedule_entry.next_outstanding_principal, - decimals=trace.currency_decimals, - ), - ( - _format_rate(step.schedule_entry.next_nominal_interest_rate) - if step.schedule_entry.next_nominal_interest_rate - else "-" - ), - ) - ) - - lines.extend(_render_table(table_headers, table_rows)) - lines.extend(["", "Execution Links", "---------------"]) - execution_link_headers = ("id", "evt", "execution", "claim") - execution_link_rows = [ - ( - f"{step.schedule_entry.event_id:02d}", - step.schedule_entry.event_type, - _format_explorer_transaction_url(step.execution_tx_id), - ( - _format_explorer_transaction_url(step.claim_tx_id) - if step.claim_tx_id is not None - else "-" - ), - ) - for step in trace.steps - ] - lines.extend(_render_table(execution_link_headers, execution_link_rows)) - return "\n".join(lines) - - -def _open_contract_account( - client: DasaClient, - *, - account_manager: SigningAccount, - holding_address: str, - payment_address: str, -) -> None: - client.send.account_open( - AccountOpenArgs( - holding_address=holding_address, - payment_address=payment_address, - ), - params=CommonAppCallParams( - sender=account_manager.address, - signer=account_manager.signer, - ), - ) - - -def setup_pam_lifecycle( - *, - client: DasaClient, - primary_dealer: utils.DAsaPrimaryDealer, - account_manager: utils.DAsaAccountManager, - algorand: AlgorandClient, - bank: SigningAccount, - currency: utils.Currency, - normalized: NormalizationResult, - bank_funding_amount: int, - investor_payment_amount: int, - prospectus_url: str, -) -> PamLifecycleParticipants: - pages = normalized.schedule_pages(cst.SCHEDULE_PAGE_SIZE) - client.send.contract_config( - ContractConfigArgs( - terms=client_terms(normalized), - initial_state=client_initial_state(normalized), - prospectus=Prospectus( - hash=bytes(32), - url=prospectus_url, - ), - ), - params=CommonAppCallParams(max_fee=AlgoAmount.from_micro_algo(5_000)), - send_params=SendParams(cover_app_call_inner_transaction_fees=True), - ) - for index, page in enumerate(pages): - client.send.contract_schedule( - ContractScheduleArgs( - schedule_page_index=index, - is_last_page=index == len(pages) - 1, - schedule_page=client_schedule_page(page), - ), - params=CommonAppCallParams(max_fee=AlgoAmount.from_micro_algo(5_000)), - send_params=SendParams(cover_app_call_inner_transaction_fees=True), - ) - - if bank_funding_amount > 0: - algorand.send.asset_transfer( - AssetTransferParams( - asset_id=currency.id, - amount=bank_funding_amount, - receiver=client.app_address, - sender=bank.address, - signer=bank.signer, - ) - ) - - investor = algorand.account.random() - algorand.account.ensure_funded_from_environment( - account_to_fund=investor.address, - min_spending_balance=AlgoAmount.from_algo(10), - ) - algorand.send.asset_opt_in( - AssetOptInParams( - asset_id=currency.id, - sender=investor.address, - signer=investor.signer, - ) - ) - _open_contract_account( - client, - account_manager=account_manager, - holding_address=investor.address, - payment_address=investor.address, - ) - - algorand.send.asset_transfer( - AssetTransferParams( - asset_id=currency.id, - amount=investor_payment_amount, - receiver=investor.address, - sender=bank.address, - signer=bank.signer, - ) - ) - - receiver = algorand.account.random() - algorand.account.ensure_funded_from_environment( - account_to_fund=receiver.address, - min_spending_balance=AlgoAmount.from_algo(10), - ) - _open_contract_account( - client, - account_manager=account_manager, - holding_address=receiver.address, - payment_address=receiver.address, - ) - - assert ( - algorand.asset.get_account_information(investor.address, currency.id).balance - == investor_payment_amount - ) - - investor_purchase_txn = algorand.create_transaction.asset_transfer( - AssetTransferParams( - asset_id=currency.id, - amount=investor_payment_amount, - receiver=client.app_address, - sender=investor.address, - signer=investor.signer, - ) - ) - client.new_group().add_transaction( - investor_purchase_txn, investor.signer - ).primary_distribution( - PrimaryDistributionArgs( - holding_address=investor.address, - units=normalized.terms.total_units, - ), - params=CommonAppCallParams( - sender=primary_dealer.address, - signer=primary_dealer.signer, - ), - ).send() - - assert ( - algorand.asset.get_account_information(investor.address, currency.id).balance - == 0 - ) - assert ( - algorand.asset.get_account_information(client.app_address, currency.id).balance - == bank_funding_amount + investor_payment_amount - ) +from src.pam_lifecycle import ( + EVENT_TYPE_NAMES, + ISSUANCE_DELAY_CYCLE, + LOCALNET_EXPLORER_TX_BASE_URL, + MINIMUM_DENOMINATION, + PRINCIPAL, + STATUS_NAMES, + PamLifecycleClaimTrace, + PamLifecycleParticipants, + PamLifecycleTrace, + PamLifecycleTraceStep, + client_initial_state, + client_schedule_page, + client_terms, + cycle_duration_seconds, + format_lifecycle_trace, + make_claim_trace, + scale_currency_amount, + setup_pam_lifecycle, +) - return PamLifecycleParticipants( - investor=investor, - receiver=receiver, - ) +__all__ = [ + "EVENT_TYPE_NAMES", + "ISSUANCE_DELAY_CYCLE", + "LOCALNET_EXPLORER_TX_BASE_URL", + "MINIMUM_DENOMINATION", + "PRINCIPAL", + "STATUS_NAMES", + "PamLifecycleClaimTrace", + "PamLifecycleParticipants", + "PamLifecycleTrace", + "PamLifecycleTraceStep", + "assert_pending_ied_guards", + "client_initial_state", + "client_schedule_page", + "client_terms", + "cycle_duration_seconds", + "format_lifecycle_trace", + "make_claim_trace", + "scale_currency_amount", + "setup_pam_lifecycle", +] def assert_pending_ied_guards( @@ -510,73 +89,3 @@ def assert_pending_ied_guards( signer=investor.signer, ), ) - - -def _format_timestamp(timestamp: int) -> str: - return datetime.fromtimestamp(timestamp, tz=UTC).strftime("%Y-%m-%d %H:%M:%SZ") - - -def _format_asset_amount(amount: int, *, decimals: int, unit_name: str) -> str: - quantizer = Decimal(1).scaleb(-decimals) - scaled = (Decimal(amount) / (Decimal(10) ** decimals)).quantize(quantizer) - return f"{scaled:,.{decimals}f} {unit_name}" - - -def _format_scaled_amount(amount: int, *, decimals: int) -> str: - quantizer = Decimal(1).scaleb(-decimals) - scaled = (Decimal(amount) / (Decimal(10) ** decimals)).quantize(quantizer) - return f"{scaled:,.{decimals}f}" - - -def _format_table_timestamp(timestamp: int) -> str: - return datetime.fromtimestamp(timestamp, tz=UTC).strftime("%Y-%m-%d") - - -def _format_time_delta(delta_seconds: int) -> str: - sign = "+" if delta_seconds >= 0 else "-" - abs_delta = abs(delta_seconds) - if abs_delta % cst.DAY_2_SEC == 0: - return f"{sign}{abs_delta // cst.DAY_2_SEC}d" - if abs_delta % 3600 == 0: - return f"{sign}{abs_delta // 3600}h" - if abs_delta % 60 == 0: - return f"{sign}{abs_delta // 60}m" - return f"{sign}{abs_delta}s" - - -def _format_ratio(value: int) -> str: - scaled = Decimal(value) / Decimal(cst.FIXED_POINT_SCALE) - return f"{scaled:.6f}" - - -def _format_rate(value: int) -> str: - percent = Decimal(value) * Decimal(100) / Decimal(cst.FIXED_POINT_SCALE) - return f"{percent:.4f}%" - - -def _format_explorer_transaction_url(tx_id: str) -> str: - return f"{LOCALNET_EXPLORER_TX_BASE_URL}{tx_id}" - - -def _render_table( - headers: tuple[str, ...], - rows: list[tuple[str, ...]], -) -> list[str]: - widths = [len(header) for header in headers] - for row in rows: - for index, cell in enumerate(row): - widths[index] = max(widths[index], len(cell)) - - left_align = {1, 2, 3} - - def render_row(row: tuple[str, ...]) -> str: - cells: list[str] = [] - for index, cell in enumerate(row): - if index in left_align: - cells.append(cell.ljust(widths[index])) - else: - cells.append(cell.rjust(widths[index])) - return " | ".join(cells) - - separator = "-+-".join("-" * width for width in widths) - return [render_row(headers), separator, *[render_row(row) for row in rows]] diff --git a/tests/utils.py b/tests/utils.py index 6ce0bdb3..a9c8c231 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -1,323 +1,35 @@ -from base64 import b64decode -from dataclasses import asdict, dataclass -from typing import Any, TypeAlias - -from algokit_utils import ( - AlgoAmount, - AlgorandClient, - PaymentParams, - SendAppTransactionResult, - SigningAccount, -) -from algosdk.v2client.algod import AlgodClient - -from smart_contracts import enums -from src.artifacts.dasa_client import ( - AccountGetPositionArgs, +from src.localnet import ( + Currency, + DAsaAccount, + DAsaAccountManager, + DAsaAuthority, + DAsaInterestOracle, + DAsaPrimaryDealer, + DAsaTrustee, + decode_actus_event, + decode_actus_execution_event, + get_event_from_call_result, + get_last_round, + get_latest_timestamp, + get_primary_tx_id, + round_warp, + time_warp, ) -CouponRates: TypeAlias = list[int] -TimeEvents: TypeAlias = list[int] -TimePeriods: TypeAlias = list[tuple[int, int]] - - -@dataclass -class DAsaConfig: - denomination_asset_id: int - settlement_asset_id: int - principal: int - principal_discount: int - minimum_denomination: int - day_count_convention: int - interest_rate: int - coupon_rates: CouponRates - time_events: TimeEvents - time_periods: TimePeriods - - def dictify(self) -> dict[str, int | CouponRates | TimeEvents | TimePeriods]: - return asdict(self) # type: ignore - - @property - def total_coupons(self) -> int: - return len(self.coupon_rates) - - -@dataclass -class Currency: - id: int - total: int - decimals: int - name: str - unit_name: str - asa_to_unit: float - - -@dataclass(kw_only=True) -class DAsaAccountManager(SigningAccount): - @classmethod - def role_id(cls) -> int: - return enums.ROLE_ACCOUNT_MANAGER - - -@dataclass(kw_only=True) -class DAsaPrimaryDealer(SigningAccount): - @classmethod - def role_id(cls) -> int: - return enums.ROLE_PRIMARY_DEALER - - -@dataclass(kw_only=True) -class DAsaTrustee(SigningAccount): - @classmethod - def role_id(cls) -> int: - return enums.ROLE_TRUSTEE - - -@dataclass(kw_only=True) -class DAsaAuthority(SigningAccount): - @classmethod - def role_id(cls) -> int: - return enums.ROLE_AUTHORITY - - -@dataclass(kw_only=True) -class DAsaInterestOracle(SigningAccount): - @classmethod - def role_id(cls) -> int: - return enums.ROLE_OBSERVER - - -@dataclass(kw_only=True) -class DAsaAccount(SigningAccount): - holding_address: str - d_asa_client: Any - - @property - def payment_address(self) -> str: - return self.d_asa_client.send.account_get_position( - AccountGetPositionArgs( - holding_address=self.holding_address, - ) - ).abi_return.payment_address - - @property - def units(self) -> int: - return self.d_asa_client.send.account_get_position( - AccountGetPositionArgs(holding_address=self.holding_address) - ).abi_return.units - - @property - def suspended(self) -> bool: - return self.d_asa_client.send.account_get_position( - AccountGetPositionArgs(holding_address=self.holding_address) - ).abi_return.suspended - - -def get_last_round(algod_client: AlgodClient) -> int: - return algod_client.status()["last-round"] # type: ignore - - -def get_latest_timestamp(algod_client: AlgodClient) -> int: - return algod_client.block_info(get_last_round(algod_client))["block"]["ts"] # type: ignore - - -def round_warp(to_round: int | None = None) -> None: - """ - Fastforward directly `to_round` or advance by 1 round. - - Args: - to_round (Optional): Round to advance to - """ - algorand_client = AlgorandClient.default_localnet() - algorand_client.set_suggested_params_cache_timeout(0) - dispenser = algorand_client.account.localnet_dispenser() - if to_round is not None: - last_round = get_last_round(algorand_client.client.algod) - assert to_round > last_round - n_rounds = to_round - last_round - else: - n_rounds = 1 - for _ in range(n_rounds): - algorand_client.send.payment( - PaymentParams( - signer=dispenser.signer, - sender=dispenser.address, - receiver=dispenser.address, - amount=AlgoAmount.from_algo(0), - ) - ) - - -def time_warp(to_timestamp: int) -> None: - """ - Fastforward directly `to_timestamp` - - Args: - to_timestamp: Timestamp to advance to - """ - algorand_client = AlgorandClient.default_localnet() - algorand_client.set_suggested_params_cache_timeout(0) - algorand_client.client.algod.set_timestamp_offset( - to_timestamp - get_latest_timestamp(algorand_client.client.algod) - ) - round_warp() - algorand_client.client.algod.set_timestamp_offset(0) - - -def get_event_from_call_result(call_result: SendAppTransactionResult) -> bytes: - # Contract emits ACTUS events right before the ARC-4 (which is the last log) - event = call_result.returns[0].tx_info["logs"][-2] - # Stripping ARC-28 4-bytes event signature prefix - event_bytes = b64decode(event) - return event_bytes[4:] - - -def get_primary_tx_id(call_result: SendAppTransactionResult) -> str: - tx_ids = getattr(call_result, "tx_ids", None) - if isinstance(tx_ids, list) and tx_ids: - return tx_ids[0] - - transaction = getattr(call_result, "transaction", None) - tx_id = getattr(transaction, "tx_id", None) - if callable(tx_id): - return tx_id() - if isinstance(tx_id, str): - return tx_id - - raise ValueError("Unable to extract transaction id from call result") - - -def decode_actus_event(event_bytes: bytes) -> dict: - """ - Decode an ACTUS ARC-28 Event from bytes using ARC-4 encoding. - - In ARC-4, structs with dynamic types (String, Bytes) use offsets: - - Fixed-size fields are stored inline - - Dynamic fields are stored as 2-byte offsets pointing to data at the end - - Event structure (ARC-4 encoding): - Fixed part (head): - - contract_id: UInt64 (8 bytes) - - type: arc4.UInt8 (1 byte) - - type_name: offset (2 bytes) -> points to String data in tail - - time: UInt64 (8 bytes) - - payoff: UInt64 (8 bytes) - - currency_id: UInt64 (8 bytes) - - currency_unit: offset (2 bytes) -> points to Bytes data in tail - - nominal_value: UInt64 (8 bytes) - - nominal_rate_bps: arc4.UInt16 (2 bytes) - - nominal_accrued: UInt64 (8 bytes) - - Dynamic part (tail): - - String data for type_name (2 bytes length + UTF-8 data) - - Bytes data for currency_unit (2 bytes length + raw data) - - Args: - event_bytes: The raw event bytes (after removing the 4-byte event signature) - - Returns: - Dictionary with decoded event fields - """ - import struct - - offset = 0 - - # Read contract_id (UInt64 - 8 bytes) - contract_id = struct.unpack(">Q", event_bytes[offset : offset + 8])[0] - offset += 8 - - # Read type (arc4.UInt8 - 1 byte) - event_type = event_bytes[offset] - offset += 1 - - # Read type_name offset (2 bytes) - type_name_offset = struct.unpack(">H", event_bytes[offset : offset + 2])[0] - offset += 2 - - # Read time (UInt64 - 8 bytes) - time = struct.unpack(">Q", event_bytes[offset : offset + 8])[0] - offset += 8 - - # Read payoff (UInt64 - 8 bytes) - payoff = struct.unpack(">Q", event_bytes[offset : offset + 8])[0] - offset += 8 - - # Read currency_id (UInt64 - 8 bytes) - currency_id = struct.unpack(">Q", event_bytes[offset : offset + 8])[0] - offset += 8 - - # Read currency_unit offset (2 bytes) - currency_unit_offset = struct.unpack(">H", event_bytes[offset : offset + 2])[0] - offset += 2 - - # Read nominal_value (UInt64 - 8 bytes) - nominal_value = struct.unpack(">Q", event_bytes[offset : offset + 8])[0] - offset += 8 - - # Read nominal_rate_bps (arc4.UInt16 - 2 bytes) - nominal_rate_bps = struct.unpack(">H", event_bytes[offset : offset + 2])[0] - offset += 2 - - # Read nominal_accrued (UInt64 - 8 bytes) - nominal_accrued = struct.unpack(">Q", event_bytes[offset : offset + 8])[0] - offset += 8 - - # Now decode the dynamic fields using their offsets - # Read type_name from tail - type_name_length = struct.unpack( - ">H", event_bytes[type_name_offset : type_name_offset + 2] - )[0] - type_name = event_bytes[ - type_name_offset + 2 : type_name_offset + 2 + type_name_length - ].decode("utf-8") - - # Read currency_unit from tail - currency_unit_length = struct.unpack( - ">H", event_bytes[currency_unit_offset : currency_unit_offset + 2] - )[0] - currency_unit = event_bytes[ - currency_unit_offset + 2 : currency_unit_offset + 2 + currency_unit_length - ].decode("utf-8") - - return { - "contract_id": contract_id, - "type": event_type, - "type_name": type_name, - "time": time, - "payoff": payoff, - "currency_id": currency_id, - "currency_unit": currency_unit, - "nominal_value": nominal_value, - "nominal_rate_bps": nominal_rate_bps, - "nominal_accrued": nominal_accrued, - } - - -def decode_actus_execution_event(event_bytes: bytes) -> dict[str, int]: - import struct - - ( - contract_id, - event_id, - event_type, - scheduled_time, - applied_at, - payoff, - payoff_sign, - settled_amount, - currency_id, - sequence, - ) = struct.unpack(">QQBQQQBQQQ", event_bytes) - - return { - "contract_id": contract_id, - "event_id": event_id, - "event_type": event_type, - "scheduled_time": scheduled_time, - "applied_at": applied_at, - "payoff": payoff, - "payoff_sign": payoff_sign, - "settled_amount": settled_amount, - "currency_id": currency_id, - "sequence": sequence, - } +__all__ = [ + "Currency", + "DAsaAccount", + "DAsaAccountManager", + "DAsaAuthority", + "DAsaInterestOracle", + "DAsaPrimaryDealer", + "DAsaTrustee", + "decode_actus_event", + "decode_actus_execution_event", + "get_event_from_call_result", + "get_last_round", + "get_latest_timestamp", + "get_primary_tx_id", + "round_warp", + "time_warp", +] From 7fd2218e8373c0c2eccfb244fb3f2de89664f079 Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 18:31:47 +0100 Subject: [PATCH 193/244] feat: d-asa script --- d-asa | 145 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 145 insertions(+) create mode 100755 d-asa diff --git a/d-asa b/d-asa new file mode 100755 index 00000000..d2a4ef46 --- /dev/null +++ b/d-asa @@ -0,0 +1,145 @@ +#!/bin/sh + +set -eu + +IMAGE_TAG="d-asa-demo:local" +ALGOKIT_HOME_VOLUME="d-asa-algokit-home" +DOCS_URL="https://cusma.github.io/d-asa/" +DEFAULT_LOCALNET_HOST="${D_ASA_LOCALNET_HOST:-host.docker.internal}" +STARTED_LOCALNET=0 +REPO_ROOT=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd) + +print_help() { + cat < + +Commands: + run Build the demo image, start LocalNet if needed, print the showcase, then clean up. + docs Open the published D-ASA docs, or print the URL when browser opening is disabled. + help Show this help text. + +Prerequisites: + - Docker Desktop or Docker Engine + - macOS or Linux + +Examples: + ./d-asa run + ./d-asa docs + D_ASA_NO_OPEN=1 ./d-asa docs +EOF +} + +die() { + printf '%s\n' "$*" >&2 + exit 1 +} + +ensure_docker() { + command -v docker >/dev/null 2>&1 || die "Docker is required but was not found in PATH." + docker info >/dev/null 2>&1 || die "Docker is installed but the daemon is not reachable." +} + +build_image() { + printf '%s\n' "Building ${IMAGE_TAG}..." + docker build --tag "$IMAGE_TAG" "$REPO_ROOT" +} + +run_in_image() { + case "$(uname -s)" in + Linux*) + docker run --rm \ + --add-host=host.docker.internal:host-gateway \ + -e HOME=/home/dasa \ + -e XDG_CONFIG_HOME=/home/dasa/.config \ + -e XDG_DATA_HOME=/home/dasa/.local/share \ + -e XDG_STATE_HOME=/home/dasa/.local/state \ + -e D_ASA_LOCALNET_HOST="$DEFAULT_LOCALNET_HOST" \ + -v "$REPO_ROOT:/workspace" \ + -v "$ALGOKIT_HOME_VOLUME:/home/dasa" \ + -v /var/run/docker.sock:/var/run/docker.sock \ + -w /workspace \ + "$IMAGE_TAG" "$@" + ;; + *) + docker run --rm \ + -e HOME=/home/dasa \ + -e XDG_CONFIG_HOME=/home/dasa/.config \ + -e XDG_DATA_HOME=/home/dasa/.local/share \ + -e XDG_STATE_HOME=/home/dasa/.local/state \ + -e D_ASA_LOCALNET_HOST="$DEFAULT_LOCALNET_HOST" \ + -v "$REPO_ROOT:/workspace" \ + -v "$ALGOKIT_HOME_VOLUME:/home/dasa" \ + -v /var/run/docker.sock:/var/run/docker.sock \ + -w /workspace \ + "$IMAGE_TAG" "$@" + ;; + esac +} + +cleanup() { + status=$? + trap - EXIT INT TERM + if [ "$STARTED_LOCALNET" -eq 1 ]; then + printf '%s\n' "Stopping AlgoKit LocalNet..." + run_in_image algokit localnet stop >/dev/null 2>&1 || true + fi + exit "$status" +} + +localnet_ready() { + run_in_image python -m src.localnet wait --timeout 2 --poll-interval 1 >/dev/null 2>&1 +} + +cmd_run() { + ensure_docker + build_image + trap cleanup EXIT INT TERM + + if localnet_ready; then + printf '%s\n' "Reusing existing LocalNet." + else + printf '%s\n' "Starting AlgoKit LocalNet..." + run_in_image algokit localnet start + STARTED_LOCALNET=1 + printf '%s\n' "Waiting for algod..." + run_in_image python -m src.localnet wait --timeout 90 --poll-interval 2 + fi + + printf '%s\n' "Running D-ASA showcase..." + run_in_image python -m src.showcase +} + +cmd_docs() { + if [ "${D_ASA_NO_OPEN:-0}" = "1" ]; then + printf '%s\n' "$DOCS_URL" + return + fi + + if command -v open >/dev/null 2>&1; then + open "$DOCS_URL" >/dev/null 2>&1 || printf '%s\n' "$DOCS_URL" + return + fi + + if command -v xdg-open >/dev/null 2>&1; then + xdg-open "$DOCS_URL" >/dev/null 2>&1 || printf '%s\n' "$DOCS_URL" + return + fi + + printf '%s\n' "$DOCS_URL" +} + +case "${1:-help}" in + run) + cmd_run + ;; + docs) + cmd_docs + ;; + help|-h|--help) + print_help + ;; + *) + print_help + exit 1 + ;; +esac From e9310ee635982aa595cef307e7cf3eb483fccd5f Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 18:31:56 +0100 Subject: [PATCH 194/244] docs: demo --- README.md | 70 ++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 56 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index fc0f5370..6cda6afa 100644 --- a/README.md +++ b/README.md @@ -6,50 +6,92 @@ Documentation: https://cusma.github.io/d-asa/ The reference implementation follows the execution chain: -```text -ACTUS contract -> AVM normalization -> AVM execution +```mermaid +flowchart LR + ACTUS["ACTUS Contract"] --> NORMALIZE["AVM Normalization"] + NORMALIZE --> ABI["ABI Upload"] + ABI --> EXEC["AVM Execution"] ``` The canonical ABI artifact is: - `src/artifacts/DASA.arc56.json` -## Local Setup and Tests +## Demo in One Command -The D-ASA project is developed with [AlgoKit](https://algorand.co/algokit). +The fastest way to showcase D-ASA is with Docker only. -- Install AlgoKit -- Set up your virtual environment (managed with [Poetry](https://python-poetry.org/)) +```shell +./d-asa run +``` + +What `./d-asa run` does: + +- builds the local demo image +- starts AlgoKit LocalNet if it is not already running +- waits for algod to become reachable +- runs the PAM fixed coupon and zero coupon showcase walkthroughs +- tears LocalNet back down if this invocation started it + +Open the published docs with: + +```shell +./d-asa docs +``` + +If you want the exact `d-asa ...` syntax in your current shell, you can add an alias: + +```shell +alias d-asa="$PWD/d-asa" +``` + +If browser launch is not wanted: + +```shell +D_ASA_NO_OPEN=1 ./d-asa docs +``` + +Notes: + +- targets macOS and Linux +- Docker is the only required host dependency +- the demo defaults to `host.docker.internal` for LocalNet access inside the container +- advanced overrides are available through `D_ASA_LOCALNET_HOST`, `D_ASA_LOCALNET_TOKEN`, `D_ASA_ALGOD_PORT`, `D_ASA_KMD_PORT`, and `D_ASA_INDEXER_PORT` + +## Development + +The D-ASA project is developed with [AlgoKit](https://algorand.co/algokit) and [Poetry](https://python-poetry.org/). + +Bootstrap the development environment: ```shell algokit bootstrap all ``` -- Start your Algorand LocalNet (requires [Docker](https://www.docker.com/get-started/)) +Start your Algorand LocalNet: ```shell algokit localnet start ``` -- Run tests (managed with PyTest) +Run the default test suite: ```shell algokit project run test ``` -or, for verbose results: +Build smart contracts: ```shell -poetry run pytest -s -v tests//.py +algokit project run build ``` -For a lifecycle walkthrough that prints the normalized ACTUS schedule beside the -real ARC-28 execution proofs and realized cashflows, run: +Run the showcase tests directly: ```shell poetry run pytest -s -v -m showcase tests/pam/test_pam_lifecycle_showcase.py ``` -## How to contribute +## Contributing -Refer to D-ASA documentation! +Refer to the published D-ASA documentation. From 872cec27a23dbc1eeef4ff4f1c17bd34e8535fd5 Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 19:00:25 +0100 Subject: [PATCH 195/244] chore: include root md files --- .pre-commit-config.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 10a97b0a..41d1f97a 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -79,7 +79,7 @@ repos: minimum_pre_commit_version: 0.15.0 types: [ markdown ] additional_dependencies: [ ] - files: '^(docs)/' + files: '^(docs/|[^/]+\.md$)' - repo: https://github.com/pre-commit/pre-commit-hooks rev: v6.0.0 @@ -92,4 +92,4 @@ repos: minimum_pre_commit_version: 3.2.0 types: [ markdown ] additional_dependencies: [ ] - files: '^(docs)/' + files: '^(docs/|[^/]+\.md$)' From 45c86bc57363b6799bdf13834d898d71aea9a805 Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 19:00:36 +0100 Subject: [PATCH 196/244] docs: contributions --- CONTRIBUTING.md | 262 ++++++++++++++++++++++++++++++++++++++++++ docs/CONTRIBUTIONS.md | 160 +------------------------- 2 files changed, 265 insertions(+), 157 deletions(-) create mode 100644 CONTRIBUTING.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..7548cb28 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,262 @@ +# Contributing to D-ASA + +Thank you for contributing to D-ASA. + +## Prerequisites + +The standard contributor workflow assumes: + +- [AlgoKit](https://dev.algorand.co/algokit/) for project bootstrap, LocalNet, + build, and deployment workflows +- [Poetry](https://python-poetry.org/) for the Python environment +- [Docker](https://www.docker.com/) for Algorand LocalNet +- [pre-commit](https://pre-commit.com/) for local checks + +Docs contributors also need: + +- [Rust and Cargo](https://www.rust-lang.org/tools/install) +- [`mdbook`](https://rust-lang.github.io/mdBook/) +- `mdbook-mermaid` + +## Getting Started + +### Clone the Repository + +```shell +git clone git@github.com:cusma/d-asa.git +cd d-asa +``` + +### Bootstrap the Development Environment + +The standard setup path is: + +```shell +algokit project bootstrap all +make pre-commit +make doctor +``` + +If you are only setting up Python dependencies: + +```shell +make install +``` + +If you are contributing to docs, install the mdBook toolchain as well: + +```shell +cargo install mdbook --version 0.5.2 --locked +cargo install mdbook-mermaid --version 0.17.0 --locked +mdbook-mermaid install . +``` + +### Verify the Environment + +Run: + +```shell +make doctor +``` + +`make doctor` runs `algokit doctor`, checks core contributor dependencies, checks +Docker daemon reachability for LocalNet workflows, and warns if docs-only tools +are missing. + +## Development Workflow + +### Core Commands + +The main contributor commands are: + +```shell +make help +make build +make test +make test-cov +make lint +make format +make typecheck +make all +``` + +`make all` runs the standard code quality loop for contributors: + +- build smart contracts +- run lint and type checks +- run the default non-showcase test suite + +It intentionally does not require mdBook tooling. + +### LocalNet Workflow + +Start LocalNet when you need end-to-end execution tests or LocalNet deployment: + +```shell +make localnet +make deploy-localnet +make showcase +make localnet-stop +``` + +These targets map to the existing AlgoKit workflow already used by CI and the +project scripts. + +### Docs Workflow + +For docs editing with live reload: + +```shell +make docs-serve +``` + +For docs validation: + +```shell +make docs +``` + +`make docs` runs both: + +- `mdbook build` +- `mdbook test` + +## Pull Requests + +When preparing a pull request: + +1. Keep changes focused and atomic. +1. Add or update tests when behavior changes. +1. Update docs when user-facing behavior, workflows, or interfaces change. +1. Run the relevant local checks before opening the PR. + +Suggested pre-PR checklist: + +```shell +make doctor +make all +``` + +If you changed docs: + +```shell +make docs +``` + +If you changed LocalNet behavior or showcase flows: + +```shell +make localnet +make showcase +make localnet-stop +``` + +## Repository Layout + +The main top-level layout is: + +```text +.algokit/ -> AlgoKit configuration and generators +.github/ -> CI/CD workflows and shared GitHub actions +docs/ -> mdBook source files +modules/ -> D-ASA module implementations +smart_contracts/ -> AVM smart contracts and generated contract artifacts +src/ -> Python-side normalization, helpers, and shared runtime code +tests/ -> SDK, contract, LocalNet, and showcase tests +``` + +## Style and Quality + +### Python + +The project uses: + +- `black` for formatting +- `ruff` for linting and import organization +- `mypy` for type checking +- `pytest` for tests + +Run the standard checks with: + +```shell +make format +make lint +make typecheck +make test +``` + +### Markdown and mdBook + +The docs are written in [CommonMark](https://commonmark.org/) and validated in +CI with `markdownlint`, trailing whitespace checks, and `mdbook test`. + +#### Numbered Lists + +Numbered lists **MUST** use `1.`-only style. + +> ```text +> 1. First item +> 1. Second item +> 1. Third item +> ``` + +#### Tables + +Table rows **MUST** keep aligned column widths. + +> ✅ Correct table format +> ```text +> | Month | Savings | +> |----------|---------| +> | January | EUR 250 | +> | February | EUR 80 | +> | March | EUR 420 | +> ``` +> +> ❌ Wrong table format +> ```text +> | Month | Savings | +> |----------|---------| +> | January | EUR 250 | +> | February | EUR 80 | +> | March | EUR 420 | +> ``` + +Column alignment may be controlled with `:` markers in the separator row. + +#### Admonitions + +An admonition is a special type of callout or notice block used to highlight important +information. It is written as a blockquote with a special tag on the first line. + +```text +> [!NOTE] +> General information or additional context. + +> [!TIP] +> A helpful suggestion or best practice. + +> [!IMPORTANT] +> Key information that shouldn't be missed. + +> [!WARNING] +> Critical information that highlights a potential risk. + +> [!CAUTION] +> Information about potential issues that require caution. +``` + +#### MathJax + +Mathematical formulas are rendered with [MathJax](https://www.mathjax.org/). + +Reference: + +- [mdBook MathJax documentation](https://rust-lang.github.io/mdBook/format/mathjax.html) + +## Additional Notes + +- Do not remove or hand-edit generated artifacts under `smart_contracts/artifacts` + or `src/artifacts` unless the change explicitly requires regenerated output. +- Prefer the checked-in `algokit` commands and `make` targets over ad-hoc local + command variations so contributor workflows stay aligned with CI. diff --git a/docs/CONTRIBUTIONS.md b/docs/CONTRIBUTIONS.md index e10cbe5d..a6297c44 100644 --- a/docs/CONTRIBUTIONS.md +++ b/docs/CONTRIBUTIONS.md @@ -1,160 +1,6 @@ # Contribution {#contribution} -The D-ASA is free and open source. +The canonical contributor guide lives at the repository root and is included +here so the published book stays aligned with GitHub. -The source code is released on the official -GitHub repository. - -External contributions are welcome, the project relies on the community to improve -and expand. Issues and features requests can be submitted on the GitHub -issues page. - -If you would like to contribute, please read the [guidelines](CONTRIBUTIONS.md#guidelines-guidelines) -and consider submitting a pull request. - -## Contributors {#contributors} - -- Cosimo Bassi ([@cusma](https://github.com/cusma/)) -- Altynbek Orumbayev ([@aorumbayev](https://github.com/aorumbayev)) - -## Guidelines {#guidelines} - -By clicking on the _“Suggest an edit”_ icon in the top-right corner, while reading -this book, you will be redirected to the relevant source code file to be referenced -in an issue or edited in a pull request. - -### Source Code - -The D-ASA Specifications book is built with [mdBook](https://rust-lang.github.io/mdBook/index.html). - -The source code is structured as follows: - -```text -.algokit/ -> AlgoKit configurations -.github/ -> GitHub actions and CI/CD workflows -docs/ -> mdBook source code -└── images/ -> Image files -└── images/ -> D-ASA implementation documents -└── interfaces/ -> D-ASA interfaces -| └── rbac/ -> Role-Based Access Control (RBAC) interfaces -| └── account/ -> Accounting interfaces -| └── contract/ -> Contract interfaces -| └── payment-agent/ -> Payment Agent interfaces -| └── transfer-agent/ -> Transfer Agent interfaces -└── specs/ -> D-ASA specifications -| └── rbac/ -> Role-Based Access Control (RBAC) specifications -| └── account/ -> Accounting specifications -| └── contract/ -> Contract (ACTUS) specifications -| └── execution/ -> Contract execution specifications -└── SUMMARY.md, ... -> mdBook SUMMARY.md, COVER.md, etc. -modules/ -> D-ASA Modules -smart_contracts/ -> D-ASA Smart Contracts -└── artifacts/ -> AlgoKit auto-generated artifacts -└── mock_module_.../ -> Mocked modules for tests -└── contract_a/ -> Contract Type A -└── contract_b/ -> Contract Type B -└── contract_.../ -> Contract Type ... - └── config.py -> Contract configuration - └── contract.py -> Contract implementation - └── deploy_config.py -> Contract deployment configuration -tests/ -> Tests of D-ASA Smart Contracts -└── shared/ -> Shared test fixtures and mixins tests -└── mock_module_.../ -> Mocked module tests -└── contract_a/ -> Tests of Contract Type A -| └── conftest.py -> Contract Type A test fixtures -| └── test_method_1.py -> Tests of Contract Type A Method 1 -| └── test_method_2.py -> Tests of Contract Type A Method 2 -| └── test_method_... -> Tests of Contract Type A Method ... -└── contract_b/ -> Tests of Contract Type B -└── contract_.../ -> Tests of Contract Type ... -└── conftest.py -> Common test fixtures -└── utils.py -> Testing utilities -└── ... -``` - -### Tests - -D-ASA uses the PyTest framework for unit tests and end-to-end tests. - -PyTest fixtures are organized hierarchically in the `tests` folder: fixtures defined -in the `conftest.py` file at higher levels are available to all the nested-level -tests. - -### Docs - -The book is written in [CommonMark](https://commonmark.org/). - -The CI pipeline enforces Markdown linting, formatting, and style checking with -[`markdownlint`](https://github.com/DavidAnson/markdownlint). - -#### Numbered Lists - -Numbered lists **MUST** be defined with `1`-only style. - -> [!TIP] -> ```text -> 1. First item -> 1. Second item -> 1. Third item -> ``` -> -> Result: -> 1. First item -> 1. Second item -> 1. Third item - -#### Tables - -Table rows **MUST** use the same column widths. - -> [!TIP] -> ✅ Correct table format -> ```text -> | Month | Savings | -> |----------|---------| -> | January | €250 | -> | February | €80 | -> | March | €420 | -> ``` -> -> ❌ Wrong table format -> ```text -> | Month | Savings | -> |----------|---------| -> | January | €250 | -> | February | €80 | -> | March | €420 | -> ``` -> -> Result: -> | Month | Savings | -> |----------|---------| -> | January | €250 | -> | February | €80 | -> | March | €420 | - -Consider aligning text in the columns to the left, right, or center by adding a -colon `:` to the left, right, or on both sides of the dashes `---` within the header -row. - -> [!TIP] -> ```text -> | Name | Quantity | Size | -> |:-------|:--------:|-----:| -> | Item A | 1 | S | -> | Item B | 5 | M | -> | Item C | 10 | XL | -> ``` -> -> Result: -> | Name | Quantity | Size | -> |:-------|:--------:|-----:| -> | Item A | 1 | S | -> | Item B | 5 | M | -> | Item C | 10 | XL | - -#### MathJax - -Mathematical formulas are defined with [MathJax](https://www.mathjax.org/). - -> mdBook MathJax [documentation](https://rust-lang.github.io/mdBook/format/mathjax.html). +{{#include ../CONTRIBUTING.md}} From e5842e79b51d23786b6d3aeeb16f410eaba0f5a2 Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 19:00:47 +0100 Subject: [PATCH 197/244] chore: makefile --- Makefile | 127 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ README.md | 47 ++++++++++++++------ 2 files changed, 162 insertions(+), 12 deletions(-) create mode 100644 Makefile diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..19eb1935 --- /dev/null +++ b/Makefile @@ -0,0 +1,127 @@ +SHELL := /bin/sh + +.PHONY: help install install-dev doctor build test test-cov lint format typecheck docs docs-serve pre-commit clean all localnet localnet-stop deploy-localnet showcase + +help: + @echo "Available targets:" + @echo " install - Install Python dependencies via AlgoKit bootstrap" + @echo " install-dev - Bootstrap the full development environment and install pre-commit hooks" + @echo " doctor - Check contributor dependencies and environment health" + @echo " build - Build smart contracts" + @echo " test - Run the default non-showcase test suite" + @echo " test-cov - Run tests with coverage" + @echo " lint - Run the standard lint and type checks" + @echo " format - Format Python code and auto-fix Ruff issues" + @echo " typecheck - Run mypy" + @echo " docs - Build and test mdBook documentation" + @echo " docs-serve - Serve mdBook docs locally with live reload" + @echo " pre-commit - Install pre-commit hooks" + @echo " clean - Remove local caches and ignored build outputs" + @echo " all - Run build, lint, and test" + @echo " localnet - Start AlgoKit LocalNet" + @echo " localnet-stop - Stop AlgoKit LocalNet" + @echo " deploy-localnet - Deploy contracts to LocalNet" + @echo " showcase - Run the LocalNet showcase walkthrough" + +install: + algokit project bootstrap poetry + +install-dev: + algokit project bootstrap all + pre-commit install + +doctor: + @set -u; \ + status=0; \ + echo "== AlgoKit doctor =="; \ + algokit doctor || true; \ + echo ""; \ + echo "== D-ASA environment checks =="; \ + check_required() { \ + name="$$1"; \ + cmd="$$2"; \ + if command -v "$$cmd" >/dev/null 2>&1; then \ + echo "[required] $$name: OK ($$(command -v "$$cmd"))"; \ + else \ + echo "[required] $$name: MISSING"; \ + status=1; \ + fi; \ + }; \ + check_optional() { \ + group="$$1"; \ + name="$$2"; \ + cmd="$$3"; \ + hint="$$4"; \ + if command -v "$$cmd" >/dev/null 2>&1; then \ + echo "[$$group] $$name: OK ($$(command -v "$$cmd"))"; \ + else \ + echo "[$$group] $$name: WARN - $$hint"; \ + fi; \ + }; \ + check_required "AlgoKit" algokit; \ + check_required "Poetry" poetry; \ + check_required "pre-commit" pre-commit; \ + if command -v docker >/dev/null 2>&1; then \ + echo "[localnet] Docker CLI: OK ($$(command -v docker))"; \ + if docker info >/dev/null 2>&1; then \ + echo "[localnet] Docker daemon: OK"; \ + else \ + echo "[localnet] Docker daemon: ERROR - Docker is installed but not reachable"; \ + status=1; \ + fi; \ + else \ + echo "[localnet] Docker CLI: ERROR - Docker is required for LocalNet workflows"; \ + status=1; \ + fi; \ + check_optional "docs" "Cargo" cargo "install Rust/Cargo to work on docs"; \ + check_optional "docs" "mdBook" mdbook "install with: cargo install mdbook --version 0.5.2 --locked"; \ + check_optional "docs" "mdBook Mermaid" mdbook-mermaid "install with: cargo install mdbook-mermaid --version 0.17.0 --locked"; \ + exit $$status + +build: + algokit project run build + +test: + algokit project run test + +test-cov: + poetry run pytest --cov=src --cov=smart_contracts --cov=modules --cov-report=term-missing -m "not showcase" + +lint: + algokit project run lint + +format: + poetry run black . + poetry run ruff check --fix . + +typecheck: + poetry run mypy + +docs: + mdbook build + mdbook test + +docs-serve: + mdbook serve --open + +pre-commit: + pre-commit install + +clean: + rm -rf .mypy_cache .pytest_cache .ruff_cache .coverage htmlcov book + find . -type d -name __pycache__ -prune -exec rm -rf {} + + find . -type f -name '*.pyc' -delete + +all: build lint test + +localnet: + algokit localnet start + +localnet-stop: + algokit localnet stop + +deploy-localnet: + algokit project deploy localnet + +showcase: + poetry run pytest -s -v -m showcase tests/pam/test_pam_lifecycle_showcase.py diff --git a/README.md b/README.md index 6cda6afa..5a7cd3bf 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,6 @@ -[![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/cusma/d-asa) - # Debt Algorand Standard Application (D-ASA) -Documentation: https://cusma.github.io/d-asa/ - -The reference implementation follows the execution chain: +D-ASA is an ACTUS execution engine for the Algorand Virtual Machine. ```mermaid flowchart LR @@ -17,6 +13,10 @@ The canonical ABI artifact is: - `src/artifacts/DASA.arc56.json` +Documentation: + +[![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/cusma/d-asa) + ## Demo in One Command The fastest way to showcase D-ASA is with Docker only. @@ -56,7 +56,12 @@ Notes: - targets macOS and Linux - Docker is the only required host dependency - the demo defaults to `host.docker.internal` for LocalNet access inside the container -- advanced overrides are available through `D_ASA_LOCALNET_HOST`, `D_ASA_LOCALNET_TOKEN`, `D_ASA_ALGOD_PORT`, `D_ASA_KMD_PORT`, and `D_ASA_INDEXER_PORT` +- advanced overrides are available through + - `D_ASA_LOCALNET_HOST`, + - `D_ASA_LOCALNET_TOKEN`, + - `D_ASA_ALGOD_PORT`, + - `D_ASA_KMD_PORT`, + - and `D_ASA_INDEXER_PORT` ## Development @@ -65,33 +70,51 @@ The D-ASA project is developed with [AlgoKit](https://algorand.co/algokit) and [ Bootstrap the development environment: ```shell -algokit bootstrap all +make install-dev +``` + +Verify your environment: + +```shell +make doctor +``` + +See the available contributor commands: + +```shell +make help ``` Start your Algorand LocalNet: ```shell -algokit localnet start +make localnet ``` Run the default test suite: ```shell -algokit project run test +make test ``` Build smart contracts: ```shell -algokit project run build +make build ``` Run the showcase tests directly: ```shell -poetry run pytest -s -v -m showcase tests/pam/test_pam_lifecycle_showcase.py +make showcase +``` + +Serve docs locally with live reload: + +```shell +make docs-serve ``` ## Contributing -Refer to the published D-ASA documentation. +Contributor setup and workflow guidance live in [CONTRIBUTING.md](./CONTRIBUTING.md). From 5ae318fd72af91a01e4eef070c87a0464ae4d689 Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 19:53:12 +0100 Subject: [PATCH 198/244] chore: use host algokit --- Dockerfile | 10 +----- README.md | 28 +++++++++++---- d-asa | 103 +++++++++++++++++++++++++++++++++++++++++------------ 3 files changed, 104 insertions(+), 37 deletions(-) diff --git a/Dockerfile b/Dockerfile index 493cfc68..bd4bae8a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,26 +5,18 @@ ENV PYTHONUNBUFFERED=1 ENV PIP_NO_CACHE_DIR=1 ENV POETRY_NO_INTERACTION=1 ENV POETRY_VIRTUALENVS_CREATE=false -ENV HOME=/home/dasa -ENV XDG_CONFIG_HOME=/home/dasa/.config -ENV XDG_DATA_HOME=/home/dasa/.local/share -ENV XDG_STATE_HOME=/home/dasa/.local/state RUN apt-get update \ && apt-get install -y --no-install-recommends \ ca-certificates \ - docker.io \ - docker-compose \ && rm -rf /var/lib/apt/lists/* RUN python -m pip install --upgrade pip \ && python -m pip install \ - algokit==2.10.2 \ poetry==2.1.4 WORKDIR /workspace COPY pyproject.toml poetry.lock ./ -RUN mkdir -p "$HOME" \ - && poetry install --without dev --no-root --no-ansi +RUN poetry install --without dev --no-root --no-ansi diff --git a/README.md b/README.md index 5a7cd3bf..0fd59ed1 100644 --- a/README.md +++ b/README.md @@ -19,19 +19,31 @@ Documentation: ## Demo in One Command -The fastest way to showcase D-ASA is with Docker only. +The fastest way to showcase D-ASA is with host AlgoKit for Algorand LocalNet and +Docker for the showcase runtime. + +- Install [AlgoKit](https://dev.algorand.co/algokit/algokit-intro/#cross-platform-installation) +- Install [Docker](https://docs.docker.com/get-docker/) ```shell +git clone git@github.com:cusma/d-asa.git +cd d-asa ./d-asa run ``` What `./d-asa run` does: - builds the local demo image -- starts AlgoKit LocalNet if it is not already running -- waits for algod to become reachable +- starts host AlgoKit LocalNet if it is not already running +- waits for the LocalNet services required by the showcase - runs the PAM fixed coupon and zero coupon showcase walkthroughs -- tears LocalNet back down if this invocation started it +- leaves LocalNet running so the Lora transaction links remain explorable + +When you are finished inspecting the links: + +```shell +algokit localnet stop +``` Open the published docs with: @@ -54,10 +66,14 @@ D_ASA_NO_OPEN=1 ./d-asa docs Notes: - targets macOS and Linux -- Docker is the only required host dependency -- the demo defaults to `host.docker.internal` for LocalNet access inside the container +- requires both Docker and AlgoKit on the host +- the demo joins the LocalNet Docker network when available, which keeps the showcase +on direct container-to-container networking - advanced overrides are available through - `D_ASA_LOCALNET_HOST`, + - `D_ASA_ALGOD_HOST`, + - `D_ASA_KMD_HOST`, + - `D_ASA_INDEXER_HOST`, - `D_ASA_LOCALNET_TOKEN`, - `D_ASA_ALGOD_PORT`, - `D_ASA_KMD_PORT`, diff --git a/d-asa b/d-asa index d2a4ef46..fbbccb43 100755 --- a/d-asa +++ b/d-asa @@ -3,23 +3,35 @@ set -eu IMAGE_TAG="d-asa-demo:local" -ALGOKIT_HOME_VOLUME="d-asa-algokit-home" DOCS_URL="https://cusma.github.io/d-asa/" DEFAULT_LOCALNET_HOST="${D_ASA_LOCALNET_HOST:-host.docker.internal}" +DEFAULT_LOCALNET_TOKEN="${D_ASA_LOCALNET_TOKEN:-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa}" +DEFAULT_ALGOD_PORT="${D_ASA_ALGOD_PORT:-4001}" +DEFAULT_KMD_PORT="${D_ASA_KMD_PORT:-4002}" +DEFAULT_INDEXER_PORT="${D_ASA_INDEXER_PORT:-8980}" +LOCALNET_NETWORK="algokit_sandbox_default" +NETWORK_LOCALNET_HOST="algod" +NETWORK_INDEXER_HOST="indexer" +NETWORK_ALGOD_PORT="8080" +NETWORK_KMD_PORT="7833" +NETWORK_INDEXER_PORT="8980" STARTED_LOCALNET=0 REPO_ROOT=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd) +STALE_LOCALNET_CONFIG_IMAGE="/home/dasa/.config/algokit/sandbox/docker-compose.yml" +STALE_LOCALNET_CONFIG_REPO="$REPO_ROOT/.d-asa/algokit-home/.config/algokit/sandbox/docker-compose.yml" print_help() { cat < Commands: - run Build the demo image, start LocalNet if needed, print the showcase, then clean up. + run Build the demo image, start LocalNet if needed, print the showcase, and leave LocalNet running. docs Open the published D-ASA docs, or print the URL when browser opening is disabled. help Show this help text. Prerequisites: - Docker Desktop or Docker Engine + - AlgoKit - macOS or Linux Examples: @@ -39,38 +51,80 @@ ensure_docker() { docker info >/dev/null 2>&1 || die "Docker is installed but the daemon is not reachable." } +ensure_algokit() { + command -v algokit >/dev/null 2>&1 || die "AlgoKit is required but was not found in PATH." +} + +cleanup_stale_localnet() { + stale_ids=$( + { + docker ps -aq \ + --filter "label=com.docker.compose.project=algokit_sandbox" \ + --filter "label=com.docker.compose.project.config_files=$STALE_LOCALNET_CONFIG_IMAGE" + docker ps -aq \ + --filter "label=com.docker.compose.project=algokit_sandbox" \ + --filter "label=com.docker.compose.project.config_files=$STALE_LOCALNET_CONFIG_REPO" + } | sort -u + ) + if [ -z "$stale_ids" ]; then + return + fi + + printf '%s\n' "Removing stale LocalNet containers from an older d-asa launcher..." + # shellcheck disable=SC2086 + docker rm -f $stale_ids >/dev/null + docker network rm algokit_sandbox_default >/dev/null 2>&1 || true +} + build_image() { printf '%s\n' "Building ${IMAGE_TAG}..." docker build --tag "$IMAGE_TAG" "$REPO_ROOT" } +localnet_network_exists() { + docker network inspect "$LOCALNET_NETWORK" >/dev/null 2>&1 +} + run_in_image() { + if localnet_network_exists; then + docker run --rm \ + --network "$LOCALNET_NETWORK" \ + -e D_ASA_LOCALNET_HOST="$NETWORK_LOCALNET_HOST" \ + -e D_ASA_ALGOD_HOST="$NETWORK_LOCALNET_HOST" \ + -e D_ASA_KMD_HOST="$NETWORK_LOCALNET_HOST" \ + -e D_ASA_INDEXER_HOST="$NETWORK_INDEXER_HOST" \ + -e D_ASA_LOCALNET_TOKEN="$DEFAULT_LOCALNET_TOKEN" \ + -e D_ASA_ALGOD_PORT="$NETWORK_ALGOD_PORT" \ + -e D_ASA_KMD_PORT="$NETWORK_KMD_PORT" \ + -e D_ASA_INDEXER_PORT="$NETWORK_INDEXER_PORT" \ + -v "$REPO_ROOT:$REPO_ROOT" \ + -w "$REPO_ROOT" \ + "$IMAGE_TAG" "$@" + return + fi + case "$(uname -s)" in Linux*) docker run --rm \ --add-host=host.docker.internal:host-gateway \ - -e HOME=/home/dasa \ - -e XDG_CONFIG_HOME=/home/dasa/.config \ - -e XDG_DATA_HOME=/home/dasa/.local/share \ - -e XDG_STATE_HOME=/home/dasa/.local/state \ -e D_ASA_LOCALNET_HOST="$DEFAULT_LOCALNET_HOST" \ - -v "$REPO_ROOT:/workspace" \ - -v "$ALGOKIT_HOME_VOLUME:/home/dasa" \ - -v /var/run/docker.sock:/var/run/docker.sock \ - -w /workspace \ + -e D_ASA_LOCALNET_TOKEN="$DEFAULT_LOCALNET_TOKEN" \ + -e D_ASA_ALGOD_PORT="$DEFAULT_ALGOD_PORT" \ + -e D_ASA_KMD_PORT="$DEFAULT_KMD_PORT" \ + -e D_ASA_INDEXER_PORT="$DEFAULT_INDEXER_PORT" \ + -v "$REPO_ROOT:$REPO_ROOT" \ + -w "$REPO_ROOT" \ "$IMAGE_TAG" "$@" ;; *) docker run --rm \ - -e HOME=/home/dasa \ - -e XDG_CONFIG_HOME=/home/dasa/.config \ - -e XDG_DATA_HOME=/home/dasa/.local/share \ - -e XDG_STATE_HOME=/home/dasa/.local/state \ -e D_ASA_LOCALNET_HOST="$DEFAULT_LOCALNET_HOST" \ - -v "$REPO_ROOT:/workspace" \ - -v "$ALGOKIT_HOME_VOLUME:/home/dasa" \ - -v /var/run/docker.sock:/var/run/docker.sock \ - -w /workspace \ + -e D_ASA_LOCALNET_TOKEN="$DEFAULT_LOCALNET_TOKEN" \ + -e D_ASA_ALGOD_PORT="$DEFAULT_ALGOD_PORT" \ + -e D_ASA_KMD_PORT="$DEFAULT_KMD_PORT" \ + -e D_ASA_INDEXER_PORT="$DEFAULT_INDEXER_PORT" \ + -v "$REPO_ROOT:$REPO_ROOT" \ + -w "$REPO_ROOT" \ "$IMAGE_TAG" "$@" ;; esac @@ -79,9 +133,12 @@ run_in_image() { cleanup() { status=$? trap - EXIT INT TERM - if [ "$STARTED_LOCALNET" -eq 1 ]; then - printf '%s\n' "Stopping AlgoKit LocalNet..." - run_in_image algokit localnet stop >/dev/null 2>&1 || true + if [ "$STARTED_LOCALNET" -eq 1 ] && [ "$status" -ne 0 ]; then + printf '%s\n' "Stopping AlgoKit LocalNet after failed run..." + algokit localnet stop >/dev/null 2>&1 || true + elif [ "$STARTED_LOCALNET" -eq 1 ]; then + printf '%s\n' "LocalNet is still running so the Lora links stay available." + printf '%s\n' "Stop it when finished with: algokit localnet stop" fi exit "$status" } @@ -92,6 +149,8 @@ localnet_ready() { cmd_run() { ensure_docker + ensure_algokit + cleanup_stale_localnet build_image trap cleanup EXIT INT TERM @@ -99,7 +158,7 @@ cmd_run() { printf '%s\n' "Reusing existing LocalNet." else printf '%s\n' "Starting AlgoKit LocalNet..." - run_in_image algokit localnet start + algokit localnet start --force STARTED_LOCALNET=1 printf '%s\n' "Waiting for algod..." run_in_image python -m src.localnet wait --timeout 90 --poll-interval 2 From 6ce40d9f546f1d574cbeb6e8b4a29f57ae6d5ac0 Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 19:53:32 +0100 Subject: [PATCH 199/244] chore: format --- docs/specs/contract/intro.md | 4 ++-- docs/specs/contract/kernel-state-and-schedule.md | 2 +- docs/specs/overview.md | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/specs/contract/intro.md b/docs/specs/contract/intro.md index 90b6bec3..0c0162ab 100644 --- a/docs/specs/contract/intro.md +++ b/docs/specs/contract/intro.md @@ -22,10 +22,10 @@ flowchart LR ACTUS["ACTUS Contract"] NORMALIZE["AVM Normalization"] EXEC["AVM Execution"] - + ACTUS --> NORMALIZE NORMALIZE --> EXEC - + style ACTUS fill:#fff9c4,stroke:#f57f17,stroke-width:2px,color:#000 style NORMALIZE fill:#c8e6c9,stroke:#388e3c,stroke-width:2px,color:#000 style EXEC fill:#ffccbc,stroke:#d84315,stroke-width:2px,color:#000 diff --git a/docs/specs/contract/kernel-state-and-schedule.md b/docs/specs/contract/kernel-state-and-schedule.md index bb7e8cde..63f7fa53 100644 --- a/docs/specs/contract/kernel-state-and-schedule.md +++ b/docs/specs/contract/kernel-state-and-schedule.md @@ -114,7 +114,7 @@ stateDiagram-v2 ACTIVE --> ACTIVE: Execute events ACTIVE --> ENDED: Terminal state ENDED --> [*] - + state "INACTIVE (0)
Terms and schedule
not fully configured" as INACTIVE state "PENDING_IED (50)
Schedule uploaded
Issuance not activated" as PENDING_IED state "ACTIVE (100)
IED executed
Contract lifecycle live" as ACTIVE diff --git a/docs/specs/overview.md b/docs/specs/overview.md index d3b2e080..39722c6c 100644 --- a/docs/specs/overview.md +++ b/docs/specs/overview.md @@ -39,12 +39,12 @@ flowchart TD ACCOUNTING["Layer 3: Accounting
Positions, balances, checkpoints & claims"] PAYMENT["Layer 4a: Payment Agent
Funding & withdrawal of cashflows"] TRANSFER["Layer 4b: Transfer Agent
Primary distribution & secondary transfers"] - + RBAC --> KERNEL KERNEL --> ACCOUNTING ACCOUNTING --> PAYMENT ACCOUNTING --> TRANSFER - + style RBAC fill:#bbdefb,stroke:#1976d2,stroke-width:2px,color:#000 style KERNEL fill:#fff9c4,stroke:#f57f17,stroke-width:2px,color:#000 style ACCOUNTING fill:#c8e6c9,stroke:#388e3c,stroke-width:2px,color:#000 From 0ab65a52107cde7d8cc6abaab8dda7a83fc547ed Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 19:53:49 +0100 Subject: [PATCH 200/244] chore: include contributions --- .markdownlintignore | 1 + docs/CONTRIBUTIONS.md | 5 ----- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/.markdownlintignore b/.markdownlintignore index 632a713c..f53e32a4 100644 --- a/.markdownlintignore +++ b/.markdownlintignore @@ -1,2 +1,3 @@ +CONTRIBUTIONS.md SUMMARY.md styles.md diff --git a/docs/CONTRIBUTIONS.md b/docs/CONTRIBUTIONS.md index a6297c44..81ddb505 100644 --- a/docs/CONTRIBUTIONS.md +++ b/docs/CONTRIBUTIONS.md @@ -1,6 +1 @@ -# Contribution {#contribution} - -The canonical contributor guide lives at the repository root and is included -here so the published book stays aligned with GitHub. - {{#include ../CONTRIBUTING.md}} From 6eaa033565da801701dff2f3e383b4995504ca86 Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 19:55:31 +0100 Subject: [PATCH 201/244] chore: wait for kmd and algod --- src/localnet.py | 113 ++++++++++++++++++++++++++++++++----- tests/sdk/test_localnet.py | 71 ++++++++++++++++++++++- 2 files changed, 168 insertions(+), 16 deletions(-) diff --git a/src/localnet.py b/src/localnet.py index 7946029c..4bf550db 100644 --- a/src/localnet.py +++ b/src/localnet.py @@ -7,6 +7,7 @@ from base64 import b64decode from dataclasses import dataclass from typing import Any +from urllib.error import URLError from algokit_utils import ( AlgoAmount, @@ -17,6 +18,7 @@ ) from algokit_utils.config import config as algokit_config from algokit_utils.models.network import AlgoClientNetworkConfig +from algosdk.kmd import KMDClient from algosdk.v2client.algod import AlgodClient from src.artifacts.dasa_client import AccountGetPositionArgs @@ -27,6 +29,7 @@ DEFAULT_KMD_PORT = 4002 DEFAULT_INDEXER_PORT = 8980 DEFAULT_INITIAL_ALGO_FUNDS = AlgoAmount.from_algo(10_000) +ROUND_WARP_MAX_ATTEMPTS = 3 @dataclass(frozen=True, slots=True) @@ -36,32 +39,55 @@ class LocalNetConfig: algod_port: int = DEFAULT_ALGOD_PORT kmd_port: int = DEFAULT_KMD_PORT indexer_port: int = DEFAULT_INDEXER_PORT + algod_host: str | None = None + kmd_host: str | None = None + indexer_host: str | None = None @property def server(self) -> str: return f"http://{self.host}" + @property + def algod_server(self) -> str: + return f"http://{self.algod_host or self.host}" + + @property + def kmd_server(self) -> str: + return f"http://{self.kmd_host or self.host}" + + @property + def indexer_server(self) -> str: + return f"http://{self.indexer_host or self.host}" + @property def algod_address(self) -> str: - return f"{self.server}:{self.algod_port}" + return f"{self.algod_server}:{self.algod_port}" + + @property + def kmd_address(self) -> str: + return f"{self.kmd_server}:{self.kmd_port}" + + @property + def indexer_address(self) -> str: + return f"{self.indexer_server}:{self.indexer_port}" def algod_client_config(self) -> AlgoClientNetworkConfig: return AlgoClientNetworkConfig( - server=self.server, + server=self.algod_server, token=self.token, port=self.algod_port, ) def indexer_client_config(self) -> AlgoClientNetworkConfig: return AlgoClientNetworkConfig( - server=self.server, + server=self.indexer_server, token=self.token, port=self.indexer_port, ) def kmd_client_config(self) -> AlgoClientNetworkConfig: return AlgoClientNetworkConfig( - server=self.server, + server=self.kmd_server, token=self.token, port=self.kmd_port, ) @@ -155,6 +181,9 @@ def load_localnet_config(default_host: str = DEFAULT_LOCALNET_HOST) -> LocalNetC algod_port=int(os.getenv("D_ASA_ALGOD_PORT", str(DEFAULT_ALGOD_PORT))), kmd_port=int(os.getenv("D_ASA_KMD_PORT", str(DEFAULT_KMD_PORT))), indexer_port=int(os.getenv("D_ASA_INDEXER_PORT", str(DEFAULT_INDEXER_PORT))), + algod_host=os.getenv("D_ASA_ALGOD_HOST"), + kmd_host=os.getenv("D_ASA_KMD_HOST"), + indexer_host=os.getenv("D_ASA_INDEXER_HOST"), ) @@ -201,14 +230,25 @@ def round_warp( n_rounds = 1 for _ in range(n_rounds): - algorand_client.send.payment( - PaymentParams( - signer=dispenser.signer, - sender=dispenser.address, - receiver=dispenser.address, - amount=AlgoAmount.from_algo(0), - ) - ) + for attempt in range(1, ROUND_WARP_MAX_ATTEMPTS + 1): + try: + algorand_client.send.payment( + PaymentParams( + signer=dispenser.signer, + sender=dispenser.address, + receiver=dispenser.address, + amount=AlgoAmount.from_algo(0), + ) + ) + break + except (TimeoutError, URLError, ConnectionError): + if attempt == ROUND_WARP_MAX_ATTEMPTS: + raise + wait_for_algod( + localnet_config=localnet_config, + timeout_seconds=15.0, + poll_interval_seconds=1.0, + ) def time_warp( @@ -220,7 +260,7 @@ def time_warp( algorand_client = algorand or algorand_client_from_localnet(localnet_config) algod_client = algorand_client.client.algod algod_client.set_timestamp_offset(to_timestamp - get_latest_timestamp(algod_client)) - round_warp(algorand=algorand_client) + round_warp(algorand=algorand_client, localnet_config=localnet_config) algod_client.set_timestamp_offset(0) @@ -250,6 +290,49 @@ def wait_for_algod( raise TimeoutError(message) +def wait_for_kmd( + *, + localnet_config: LocalNetConfig | None = None, + timeout_seconds: float = 60.0, + poll_interval_seconds: float = 2.0, +) -> None: + localnet = localnet_config or load_localnet_config() + kmd_client = KMDClient(localnet.token, localnet.kmd_address) + deadline = time.monotonic() + timeout_seconds + last_error: Exception | None = None + + while time.monotonic() < deadline: + try: + kmd_client.list_wallets() + return + except Exception as exc: # pragma: no cover - exercised via CLI/manual flow + last_error = exc + time.sleep(poll_interval_seconds) + + message = f"Timed out waiting for kmd at {localnet.kmd_address}" + if last_error is not None: + raise TimeoutError(f"{message}: {last_error}") from last_error + raise TimeoutError(message) + + +def wait_for_localnet( + *, + localnet_config: LocalNetConfig | None = None, + timeout_seconds: float = 60.0, + poll_interval_seconds: float = 2.0, +) -> None: + wait_for_algod( + localnet_config=localnet_config, + timeout_seconds=timeout_seconds, + poll_interval_seconds=poll_interval_seconds, + ) + wait_for_kmd( + localnet_config=localnet_config, + timeout_seconds=timeout_seconds, + poll_interval_seconds=poll_interval_seconds, + ) + + def ensure_funded_role_account( algorand: AlgorandClient, role_account_class: type[SigningAccount], @@ -381,7 +464,7 @@ def _build_parser() -> argparse.ArgumentParser: subcommands = parser.add_subparsers(dest="command", required=True) wait_parser = subcommands.add_parser( "wait", - help="Wait for algod to become reachable.", + help="Wait for the LocalNet services required by the showcase.", ) wait_parser.add_argument( "--timeout", @@ -402,7 +485,7 @@ def main() -> None: parser = _build_parser() args = parser.parse_args() if args.command == "wait": - wait_for_algod( + wait_for_localnet( localnet_config=load_localnet_config(), timeout_seconds=args.timeout, poll_interval_seconds=args.poll_interval, diff --git a/tests/sdk/test_localnet.py b/tests/sdk/test_localnet.py index 28f27987..b8a2b2f7 100644 --- a/tests/sdk/test_localnet.py +++ b/tests/sdk/test_localnet.py @@ -1,3 +1,6 @@ +from types import SimpleNamespace +from urllib.error import URLError + from src.localnet import ( DEFAULT_ALGOD_PORT, DEFAULT_INDEXER_PORT, @@ -5,6 +8,7 @@ DEFAULT_LOCALNET_TOKEN, LocalNetConfig, load_localnet_config, + wait_for_localnet, ) @@ -32,6 +36,9 @@ def test_load_localnet_config_reads_environment_overrides(monkeypatch) -> None: monkeypatch.setenv("D_ASA_ALGOD_PORT", "14001") monkeypatch.setenv("D_ASA_KMD_PORT", "14002") monkeypatch.setenv("D_ASA_INDEXER_PORT", "18980") + monkeypatch.setenv("D_ASA_ALGOD_HOST", "algod-net") + monkeypatch.setenv("D_ASA_KMD_HOST", "kmd-net") + monkeypatch.setenv("D_ASA_INDEXER_HOST", "indexer-net") config = load_localnet_config(default_host="ignored") @@ -41,6 +48,68 @@ def test_load_localnet_config_reads_environment_overrides(monkeypatch) -> None: algod_port=14001, kmd_port=14002, indexer_port=18980, + algod_host="algod-net", + kmd_host="kmd-net", + indexer_host="indexer-net", ) - assert config.algod_client_config().server == "http://demo-net" + assert config.algod_client_config().server == "http://algod-net" assert config.algod_client_config().port == 14001 + assert config.kmd_client_config().server == "http://kmd-net" + assert config.indexer_client_config().server == "http://indexer-net" + + +def test_round_warp_retries_on_transient_algod_timeout(monkeypatch) -> None: + wait_calls: list[tuple[float, float]] = [] + + def fake_wait_for_algod( + *, + localnet_config: LocalNetConfig | None = None, + timeout_seconds: float = 60.0, + poll_interval_seconds: float = 2.0, + ) -> None: + del localnet_config + wait_calls.append((timeout_seconds, poll_interval_seconds)) + + class FakeSend: + def __init__(self) -> None: + self.calls = 0 + + def payment(self, params: object) -> None: + del params + self.calls += 1 + if self.calls == 1: + raise URLError(TimeoutError("timed out")) + + fake_send = FakeSend() + fake_algorand = SimpleNamespace( + account=SimpleNamespace( + localnet_dispenser=lambda: SimpleNamespace(signer=object(), address="ADDR") + ), + send=fake_send, + ) + + monkeypatch.setattr("src.localnet.wait_for_algod", fake_wait_for_algod) + + from src.localnet import round_warp + + round_warp(algorand=fake_algorand) # type: ignore[arg-type] + + assert fake_send.calls == 2 + assert wait_calls == [(15.0, 1.0)] + + +def test_wait_for_localnet_checks_algod_then_kmd(monkeypatch) -> None: + calls: list[str] = [] + + def fake_wait_for_algod(**_: object) -> None: + calls.append("algod") + + def fake_wait_for_kmd(**_: object) -> None: + calls.append("kmd") + + monkeypatch.setattr("src.localnet.wait_for_algod", fake_wait_for_algod) + monkeypatch.setattr("src.localnet.wait_for_kmd", fake_wait_for_kmd) + + wait_for_localnet() + + assert calls == ["algod", "kmd"] From 7d5e83872fcce4eed62b6bbae74243aa68ba48d6 Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 19:55:56 +0100 Subject: [PATCH 202/244] chore: override host --- src/showcase.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/showcase.py b/src/showcase.py index e453b68f..8cd557f2 100644 --- a/src/showcase.py +++ b/src/showcase.py @@ -507,12 +507,16 @@ def _build_parser() -> argparse.ArgumentParser: def _config_from_args(args: argparse.Namespace) -> LocalNetConfig: base = load_localnet_config(default_host="host.docker.internal") + override_host = args.localnet_host return LocalNetConfig( - host=args.localnet_host or base.host, + host=override_host or base.host, token=args.localnet_token or base.token, algod_port=args.algod_port or base.algod_port, kmd_port=args.kmd_port or base.kmd_port, indexer_port=args.indexer_port or base.indexer_port, + algod_host=override_host or base.algod_host, + kmd_host=override_host or base.kmd_host, + indexer_host=override_host or base.indexer_host, ) From e4f2964825ce787af2c974ac1e0d4322f1dbd238 Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 19:56:01 +0100 Subject: [PATCH 203/244] chore: nit --- src/__init__.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/__init__.py b/src/__init__.py index 31e33e1c..16584a3e 100644 --- a/src/__init__.py +++ b/src/__init__.py @@ -1,4 +1,5 @@ from .artifacts import dasa_client +from .contracts import ContractAttributes from .errors import ActusNormalizationError, UnsupportedActusFeatureError from .models import ( AccountPosition, @@ -15,6 +16,7 @@ __all__ = [ "AccountPosition", "ActusNormalizationError", + "ContractAttributes", "Cycle", "ExecutionScheduleEntry", "InitialKernelState", From 67c70d3e08837c36e0bdb6c713388ae6260393c5 Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 19:59:21 +0100 Subject: [PATCH 204/244] chore: clean mdbook artifacts and run docs pre-commit --- CONTRIBUTING.md | 8 ++++++-- Makefile | 12 ++++++++---- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7548cb28..c815d209 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -118,8 +118,12 @@ make docs `make docs` runs both: -- `mdbook build` -- `mdbook test` +- the docs pre-commit hooks: + - `mdbook-build` + - `mdbook-test` + - `markdownlint` + - `trailing-whitespace` +- the mdBook build artifacts remain available in `book/` until `make clean` ## Pull Requests diff --git a/Makefile b/Makefile index 19eb1935..2108f55f 100644 --- a/Makefile +++ b/Makefile @@ -13,7 +13,7 @@ help: @echo " lint - Run the standard lint and type checks" @echo " format - Format Python code and auto-fix Ruff issues" @echo " typecheck - Run mypy" - @echo " docs - Build and test mdBook documentation" + @echo " docs - Run docs pre-commit checks and mdBook validation" @echo " docs-serve - Serve mdBook docs locally with live reload" @echo " pre-commit - Install pre-commit hooks" @echo " clean - Remove local caches and ignored build outputs" @@ -98,17 +98,21 @@ typecheck: poetry run mypy docs: - mdbook build - mdbook test + mdbook-mermaid install . + pre-commit run --all-files mdbook-build + pre-commit run --all-files mdbook-test + pre-commit run --all-files markdownlint + pre-commit run --all-files trailing-whitespace docs-serve: + mdbook-mermaid install . mdbook serve --open pre-commit: pre-commit install clean: - rm -rf .mypy_cache .pytest_cache .ruff_cache .coverage htmlcov book + rm -rf .mypy_cache .pytest_cache .ruff_cache .coverage htmlcov book mermaid-init.js mermaid.min.js find . -type d -name __pycache__ -prune -exec rm -rf {} + find . -type f -name '*.pyc' -delete From 81885f95616a4af62ac2c11066c14a00ad5d967e Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 20:32:22 +0100 Subject: [PATCH 205/244] chore: nit --- README.md | 12 ++---------- docs/COVER.md | 3 ++- 2 files changed, 4 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 0fd59ed1..53b25f8e 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ # Debt Algorand Standard Application (D-ASA) -D-ASA is an ACTUS execution engine for the Algorand Virtual Machine. +D-ASA is a full tokenization framework for ACTUS-compliant debt instruments, issued +and executed on the Algorand Virtual Machine. ```mermaid flowchart LR @@ -69,15 +70,6 @@ Notes: - requires both Docker and AlgoKit on the host - the demo joins the LocalNet Docker network when available, which keeps the showcase on direct container-to-container networking -- advanced overrides are available through - - `D_ASA_LOCALNET_HOST`, - - `D_ASA_ALGOD_HOST`, - - `D_ASA_KMD_HOST`, - - `D_ASA_INDEXER_HOST`, - - `D_ASA_LOCALNET_TOKEN`, - - `D_ASA_ALGOD_PORT`, - - `D_ASA_KMD_PORT`, - - and `D_ASA_INDEXER_PORT` ## Development diff --git a/docs/COVER.md b/docs/COVER.md index 4a798301..8c548e53 100644 --- a/docs/COVER.md +++ b/docs/COVER.md @@ -14,7 +14,8 @@ exchanging it on the secondary market, and querying information about the debt i The specification complies with the *Algorithmic Contract Types Unified Standards* (ACTUS) for the definition of the contracts. -**D-ASA is, at its core, an ACTUS execution engine for the Algorand Virtual Machine.** +**D-ASA is, in essence, a full tokenization framework for ACTUS-compliant debt instruments, +issued and executed on the Algorand Virtual Machine.** The specification allows the tokenization of various debt instruments, such as bonds, loans, commercial papers, mortgages, etc. From ac6ae36d7be5ba4ebdea8f29a296b6a81f524f30 Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 20:52:06 +0100 Subject: [PATCH 206/244] chore: nit --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 53b25f8e..c6b63f70 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # Debt Algorand Standard Application (D-ASA) -D-ASA is a full tokenization framework for ACTUS-compliant debt instruments, issued -and executed on the Algorand Virtual Machine. +D-ASA is a full tokenization framework for [ACTUS](https://www.actusfrf.org/)-compliant +debt instruments, issued and executed on the Algorand Virtual Machine. ```mermaid flowchart LR From 034e1bc75e1f586928ccdf20eee9b4e0ee9027b5 Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 21:05:36 +0100 Subject: [PATCH 207/244] feat: d-asa sdk --- src/_dasa_mappers.py | 196 ++++++ src/dasa.py | 1410 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 1606 insertions(+) create mode 100644 src/_dasa_mappers.py create mode 100644 src/dasa.py diff --git a/src/_dasa_mappers.py b/src/_dasa_mappers.py new file mode 100644 index 00000000..c5697bb6 --- /dev/null +++ b/src/_dasa_mappers.py @@ -0,0 +1,196 @@ +from __future__ import annotations + +from .artifacts.dasa_client import ( + AccountPosition as _ClientAccountPosition, +) +from .artifacts.dasa_client import ( + InitialKernelState as _ClientInitialKernelState, +) +from .artifacts.dasa_client import ( + NormalizedActusTerms as _ClientNormalizedActusTerms, +) +from .artifacts.dasa_client import ( + ObservedCashEventRequest as _ClientObservedCashEventRequest, +) +from .artifacts.dasa_client import ( + ObservedEventRequest as _ClientObservedEventRequest, +) +from .artifacts.dasa_client import ( + Prospectus as _ClientProspectus, +) +from .artifacts.dasa_client import ( + RoleValidity as _ClientRoleValidity, +) +from .models import ( + AccountPosition, + ExecutionScheduleEntry, + NormalizationResult, + ObservedCashEventRequest, + ObservedEventRequest, +) +from .registry import EVENT_TYPE_IDS + + +def to_client_terms(result: NormalizationResult) -> _ClientNormalizedActusTerms: + return _ClientNormalizedActusTerms( + contract_type=result.terms.contract_type, + denomination_asset_id=result.terms.denomination_asset_id, + settlement_asset_id=result.terms.denomination_asset_id, + total_units=result.terms.total_units, + notional_principal=result.terms.notional_principal, + initial_exchange_amount=result.terms.initial_exchange_amount, + initial_exchange_date=result.terms.initial_exchange_date, + maturity_date=result.terms.maturity_date or 0, + day_count_convention=int(result.terms.day_count_convention), + rate_reset_spread=result.terms.rate_reset_spread, + rate_reset_multiplier=result.terms.rate_reset_multiplier, + rate_reset_floor=result.terms.rate_reset_floor, + rate_reset_cap=result.terms.rate_reset_cap, + rate_reset_next=result.terms.rate_reset_next, + has_rate_reset_floor=result.terms.has_rate_reset_floor, + has_rate_reset_cap=result.terms.has_rate_reset_cap, + dynamic_principal_redemption=result.terms.dynamic_principal_redemption, + fixed_point_scale=result.terms.fixed_point_scale, + ) + + +def to_client_initial_state(result: NormalizationResult) -> _ClientInitialKernelState: + return _ClientInitialKernelState( + status_date=result.initial_state.status_date, + event_cursor=result.initial_state.event_cursor, + outstanding_principal=result.initial_state.outstanding_principal, + interest_calculation_base=result.initial_state.interest_calculation_base, + nominal_interest_rate=result.initial_state.nominal_interest_rate, + accrued_interest=result.initial_state.accrued_interest, + next_principal_redemption=result.initial_state.next_principal_redemption, + cumulative_interest_index=result.initial_state.cumulative_interest_index, + cumulative_principal_index=result.initial_state.cumulative_principal_index, + ) + + +def to_client_schedule_page( + page: tuple[ExecutionScheduleEntry, ...], +) -> list[tuple[int, int, int, int, int, int, int, int, int]]: + return [ + ( + entry.event_id, + EVENT_TYPE_IDS[entry.event_type], + entry.scheduled_time, + entry.accrual_factor, + entry.redemption_accrual_factor, + entry.next_nominal_interest_rate, + entry.next_principal_redemption, + entry.next_outstanding_principal, + entry.flags, + ) + for entry in page + ] + + +def to_client_prospectus( + *, + url: str = "", + hash_bytes: bytes | None = None, +) -> _ClientProspectus: + raw_hash = hash_bytes or bytes(32) + if len(raw_hash) != 32: + raise ValueError("prospectus hash must be exactly 32 bytes") + return _ClientProspectus(hash=raw_hash, url=url) + + +def to_sdk_account_position( + position: AccountPosition | _ClientAccountPosition, +) -> AccountPosition: + if isinstance(position, AccountPosition): + return position + return AccountPosition( + units=position.units, + reserved_units=position.reserved_units, + payment_address=position.payment_address, + suspended=position.suspended, + settled_cursor=position.settled_cursor, + interest_checkpoint=position.interest_checkpoint, + principal_checkpoint=position.principal_checkpoint, + claimable_interest=position.claimable_interest, + claimable_principal=position.claimable_principal, + ) + + +def to_sdk_schedule_entry( + entry: ExecutionScheduleEntry | tuple[int, int, int, int, int, int, int, int, int], +) -> ExecutionScheduleEntry: + if isinstance(entry, ExecutionScheduleEntry): + return entry + ( + event_id, + event_type, + scheduled_time, + accrual_factor, + redemption_accrual_factor, + next_nominal_interest_rate, + next_principal_redemption, + next_outstanding_principal, + flags, + ) = entry + event_type_names = {value: name for name, value in EVENT_TYPE_IDS.items()} + if event_type not in event_type_names: + raise ValueError(f"unsupported event type id: {event_type}") + return ExecutionScheduleEntry( + event_id=event_id, + event_type=event_type_names[event_type], + scheduled_time=scheduled_time, + accrual_factor=accrual_factor, + redemption_accrual_factor=redemption_accrual_factor, + next_nominal_interest_rate=next_nominal_interest_rate, + next_principal_redemption=next_principal_redemption, + next_outstanding_principal=next_outstanding_principal, + flags=flags, + ) + + +def to_client_observed_event( + payload: ObservedEventRequest, + *, + event_id: int, +) -> _ClientObservedEventRequest: + return _ClientObservedEventRequest( + event_id=event_id, + event_type=EVENT_TYPE_IDS[payload.event_type], + scheduled_time=payload.scheduled_time, + accrual_factor=payload.accrual_factor, + redemption_accrual_factor=payload.redemption_accrual_factor, + observed_rate=payload.observed_rate, + next_nominal_interest_rate=payload.next_nominal_interest_rate, + next_principal_redemption=payload.next_principal_redemption, + next_outstanding_principal=payload.next_outstanding_principal, + flags=payload.flags, + ) + + +def to_client_observed_cash_event( + payload: ObservedCashEventRequest, + *, + event_id: int, +) -> _ClientObservedCashEventRequest: + return _ClientObservedCashEventRequest( + event_id=event_id, + event_type=EVENT_TYPE_IDS[payload.event_type], + scheduled_time=payload.scheduled_time, + accrual_factor=payload.accrual_factor, + redemption_accrual_factor=payload.redemption_accrual_factor, + next_nominal_interest_rate=payload.next_nominal_interest_rate, + next_principal_redemption=payload.next_principal_redemption, + next_outstanding_principal=payload.next_outstanding_principal, + flags=payload.flags, + ) + + +def to_client_role_validity( + *, + start: int, + end: int, +) -> _ClientRoleValidity: + return _ClientRoleValidity( + role_validity_start=start, + role_validity_end=end, + ) diff --git a/src/dasa.py b/src/dasa.py new file mode 100644 index 00000000..795ab74b --- /dev/null +++ b/src/dasa.py @@ -0,0 +1,1410 @@ +from __future__ import annotations + +from collections.abc import Sequence +from dataclasses import dataclass +from decimal import Decimal +from enum import IntEnum +from typing import Literal, cast + +from algokit_utils import ( + AlgoAmount, + AlgorandClient, + AssetTransferParams, + CommonAppCallParams, + PaymentParams, + SendParams, + SigningAccount, +) +from algosdk.atomic_transaction_composer import TransactionSigner +from algosdk.constants import ZERO_ADDRESS +from algosdk.transaction import Transaction + +from smart_contracts import constants as cst +from smart_contracts import enums + +from ._dasa_mappers import ( + to_client_initial_state, + to_client_observed_cash_event, + to_client_observed_event, + to_client_prospectus, + to_client_role_validity, + to_client_schedule_page, + to_client_terms, + to_sdk_account_position, + to_sdk_schedule_entry, +) +from .artifacts.dasa_client import ( + AccountOpenArgs, + AccountSuspensionArgs, + AccountUpdatePaymentAddressArgs, + AppendObservedCashEventArgs, + ApplyNonCashEventArgs, + ClaimDueCashflowsArgs, + ContractConfigArgs, + ContractCreateArgs, + ContractScheduleArgs, + FundDueCashflowsArgs, + PrimaryDistributionArgs, + RbacAssignRoleArgs, + RbacContractDefaultArgs, + RbacContractSuspensionArgs, + RbacRevokeRoleArgs, + RbacRotateArrangerArgs, + RbacSetOpDaemonArgs, + TransferArgs, + TransferSetScheduleArgs, +) +from .artifacts.dasa_client import ( + DasaClient as _GeneratedDasaClient, +) +from .artifacts.dasa_client import ( + DasaComposer as _GeneratedDasaComposer, +) +from .artifacts.dasa_client import ( + DasaFactory as _GeneratedDasaFactory, +) +from .contracts import ContractAttributes +from .day_count import year_fraction_fixed +from .models import ( + AccountPosition, + ExecutionScheduleEntry, + NormalizationResult, + ObservedCashEventRequest, + ObservedEventRequest, +) +from .normalization import normalize_contract_attributes + +DEFAULT_APP_FUNDING = AlgoAmount.from_algo(2) +DEFAULT_CLAIM_FEE = AlgoAmount.from_micro_algo(3_000) +DEFAULT_CONFIG_FEE = AlgoAmount.from_micro_algo(5_000) +DEFAULT_ROLE_VALIDITY_END = 2**64 - 1 +_MANAGED_ROLE_IDS = frozenset( + { + enums.ROLE_ACCOUNT_MANAGER, + enums.ROLE_PRIMARY_DEALER, + enums.ROLE_TRUSTEE, + enums.ROLE_AUTHORITY, + enums.ROLE_OBSERVER, + } +) + + +class DAsaRole(IntEnum): + ARRANGER = enums.ROLE_ARRANGER + OP_DAEMON = enums.ROLE_OP_DAEMON + ACCOUNT_MANAGER = enums.ROLE_ACCOUNT_MANAGER + PRIMARY_DEALER = enums.ROLE_PRIMARY_DEALER + TRUSTEE = enums.ROLE_TRUSTEE + AUTHORITY = enums.ROLE_AUTHORITY + OBSERVER = enums.ROLE_OBSERVER + + +@dataclass(frozen=True, slots=True) +class RoleValidityWindow: + start: int + end: int + + def is_active(self, timestamp: int) -> bool: + return self.start <= timestamp <= self.end + + +@dataclass(frozen=True, slots=True) +class PricingContext: + notional_unit_value: int + + def __post_init__(self) -> None: + if self.notional_unit_value <= 0: + raise ValueError("notional_unit_value must be positive") + + +@dataclass(frozen=True, slots=True) +class AddressRoles: + arranger: bool + op_daemon: bool + account_manager: bool + primary_dealer: bool + trustee: bool + authority: bool + observer: bool + + +@dataclass(frozen=True, slots=True) +class ContractState: + arranger: str + op_daemon: str + contract_suspended: bool + defaulted: bool + status: int + contract_type: int + denomination_asset_id: int + settlement_asset_id: int + initial_exchange_date: int + maturity_date: int + transfer_opening_date: int + transfer_closure_date: int + day_count_convention: int + total_units: int + reserved_units_total: int + initial_exchange_amount: int + outstanding_principal: int + next_principal_redemption: int + dynamic_principal_redemption: bool + interest_calculation_base: int + accrued_interest: int + nominal_interest_rate: int + rate_reset_spread: int + rate_reset_multiplier: int + rate_reset_floor: int + rate_reset_cap: int + rate_reset_next: int + has_rate_reset_floor: bool + has_rate_reset_cap: bool + reserved_principal: int + reserved_interest: int + cumulative_interest_index: int + cumulative_principal_index: int + event_cursor: int + schedule_entry_count: int + fixed_point_scale: int + + +@dataclass(frozen=True, slots=True) +class FundingResult: + funded_interest: int + funded_principal: int + total_funded: int + processed_events: int + timestamp: int + + +@dataclass(frozen=True, slots=True) +class ClaimResult: + interest_amount: int + principal_amount: int + total_amount: int + timestamp: int + context: bytes + + +@dataclass(frozen=True, slots=True) +class AccountValuation: + valuation_timestamp: int + position: AccountPosition + principal_share: int + claimable_interest: int + claimable_principal: int + accrued_interest_not_due: int + economic_value_total: int + + +@dataclass(frozen=True, slots=True) +class TradeQuoteInput: + clean_total_base_units: int | None = None + clean_per_unit_base_units: Decimal | int | str | None = None + clean_price_per_100: Decimal | int | str | None = None + + def resolve(self, *, units: int, pricing_context: PricingContext | None) -> Decimal: + supplied = [ + self.clean_total_base_units is not None, + self.clean_per_unit_base_units is not None, + self.clean_price_per_100 is not None, + ] + if sum(supplied) != 1: + raise ValueError("exactly one clean quote input must be supplied") + + if self.clean_total_base_units is not None: + return Decimal(self.clean_total_base_units) + + if self.clean_per_unit_base_units is not None: + return Decimal(str(self.clean_per_unit_base_units)) * Decimal(units) + + if pricing_context is None: + raise ValueError( + "clean_price_per_100 requires a pricing context with notional_unit_value" + ) + return ( + Decimal(str(self.clean_price_per_100)) + / Decimal(100) + * Decimal(pricing_context.notional_unit_value) + * Decimal(units) + ) + + +@dataclass(frozen=True, slots=True) +class TradeQuote: + trade_side: Literal["buy", "sell"] + units: int + valuation_timestamp: int + principal_share_total: int + accrued_interest_not_due_total: int + economic_value_total: int + seller_retained_claimable_interest: int + seller_retained_claimable_principal: int + par_reference_clean_total: int + par_reference_dirty_total: int + market_clean_total: Decimal | None = None + market_dirty_total: Decimal | None = None + market_clean_per_unit: Decimal | None = None + market_dirty_per_unit: Decimal | None = None + + +@dataclass(frozen=True, slots=True) +class OtcDvpDraft: + buyer_address: str + seller_address: str + sender_holding_address: str + receiver_holding_address: str + units: int + payment_amount: int + payment_asset_id: int | None + payment_transaction: Transaction + quote: TradeQuote | None + composer: _GeneratedDasaComposer + + def send(self, send_params: SendParams | None = None) -> object: + return self.composer.send(send_params) + + def simulate(self, **kwargs: object) -> object: + return self.composer.simulate(**kwargs) + + +def _scaled_mul_div(multiplicand: int, multiplier: int, divisor: int) -> int: + if multiplicand == 0 or multiplier == 0: + return 0 + return multiplicand * multiplier // divisor + + +def _amount_to_index_delta( + amount: int, *, total_units: int, fixed_point_scale: int +) -> int: + if amount == 0: + return 0 + if total_units <= 0: + raise ValueError("total_units must be positive") + return _scaled_mul_div(amount, fixed_point_scale, total_units) + + +def _index_delta_to_amount( + index_delta: int, + *, + units: int, + fixed_point_scale: int, +) -> int: + if index_delta == 0 or units == 0: + return 0 + return _scaled_mul_div(units, index_delta, fixed_point_scale) + + +def _share_amount( + amount: int, + *, + units: int, + total_units: int, + fixed_point_scale: int, +) -> int: + index_delta = _amount_to_index_delta( + amount, + total_units=total_units, + fixed_point_scale=fixed_point_scale, + ) + return _index_delta_to_amount( + index_delta, + units=units, + fixed_point_scale=fixed_point_scale, + ) + + +def _latest_timestamp(client: _GeneratedDasaClient) -> int: + algod = client.algorand.client.algod + status = cast(dict[str, int], algod.status()) + block_info = cast(dict[str, object], algod.block_info(status["last-round"])) + block = cast(dict[str, int], block_info["block"]) + return int(block["ts"]) + + +def _normalize_result( + *, + normalized: NormalizationResult | None, + contract: ContractAttributes | None, + denomination_asset_id: int | None, + denomination_asset_decimals: int | None, + notional_unit_value: int | float | Decimal | None, + secondary_market_opening_date: int | None, + secondary_market_closure_date: int | None, + preprocessed_events: Sequence[ObservedEventRequest | ExecutionScheduleEntry] | None, +) -> NormalizationResult: + if normalized is not None: + if contract is not None: + raise ValueError("pass either normalized or contract attributes, not both") + return normalized + + if contract is None: + raise ValueError("normalized or contract attributes are required") + + required_values = { + "denomination_asset_id": denomination_asset_id, + "denomination_asset_decimals": denomination_asset_decimals, + "notional_unit_value": notional_unit_value, + "secondary_market_opening_date": secondary_market_opening_date, + "secondary_market_closure_date": secondary_market_closure_date, + } + missing = [name for name, value in required_values.items() if value is None] + if missing: + raise ValueError( + f"missing normalization inputs for contract attributes: {', '.join(missing)}" + ) + + return normalize_contract_attributes( + contract, + denomination_asset_id=cast(int, denomination_asset_id), + denomination_asset_decimals=cast(int, denomination_asset_decimals), + notional_unit_value=cast(int | float | Decimal, notional_unit_value), + secondary_market_opening_date=cast(int, secondary_market_opening_date), + secondary_market_closure_date=cast(int, secondary_market_closure_date), + preprocessed_events=preprocessed_events, + ) + + +def _maybe_activate_reserved_units( + position: AccountPosition, + *, + state: ContractState, +) -> AccountPosition: + if state.status == enums.STATUS_PENDING_IED or position.reserved_units == 0: + return position + return AccountPosition( + units=position.units + position.reserved_units, + reserved_units=0, + payment_address=position.payment_address, + suspended=position.suspended, + settled_cursor=position.settled_cursor, + interest_checkpoint=position.interest_checkpoint, + principal_checkpoint=position.principal_checkpoint, + claimable_interest=position.claimable_interest, + claimable_principal=position.claimable_principal, + ) + + +def _actualize_position( + position: AccountPosition, *, state: ContractState +) -> AccountPosition: + preview = _maybe_activate_reserved_units(position, state=state) + interest_delta = state.cumulative_interest_index - preview.interest_checkpoint + principal_delta = state.cumulative_principal_index - preview.principal_checkpoint + if interest_delta < 0 or principal_delta < 0: + raise ValueError("account checkpoints are ahead of global cumulative indices") + claimable_interest = preview.claimable_interest + _index_delta_to_amount( + interest_delta, + units=preview.units, + fixed_point_scale=state.fixed_point_scale, + ) + claimable_principal = preview.claimable_principal + _index_delta_to_amount( + principal_delta, + units=preview.units, + fixed_point_scale=state.fixed_point_scale, + ) + return AccountPosition( + units=preview.units, + reserved_units=preview.reserved_units, + payment_address=preview.payment_address, + suspended=preview.suspended, + settled_cursor=state.event_cursor, + interest_checkpoint=state.cumulative_interest_index, + principal_checkpoint=state.cumulative_principal_index, + claimable_interest=claimable_interest, + claimable_principal=claimable_principal, + ) + + +class ContractView: + def __init__( + self, + client: _GeneratedDasaClient, + *, + pricing_context: PricingContext | None = None, + ) -> None: + self._client = client + self._pricing_context = pricing_context + + @property + def raw_client(self) -> _GeneratedDasaClient: + return self._client + + @property + def pricing_context(self) -> PricingContext | None: + return self._pricing_context + + def get_state(self) -> ContractState: + global_state = self._client.state.global_state + return ContractState( + arranger=global_state.arranger, + op_daemon=global_state.op_daemon, + contract_suspended=bool(global_state.contract_suspended), + defaulted=bool(global_state.defaulted), + status=global_state.status, + contract_type=global_state.contract_type, + denomination_asset_id=global_state.denomination_asset_id, + settlement_asset_id=global_state.settlement_asset_id, + initial_exchange_date=global_state.initial_exchange_date, + maturity_date=global_state.maturity_date, + transfer_opening_date=global_state.transfer_opening_date, + transfer_closure_date=global_state.transfer_closure_date, + day_count_convention=global_state.day_count_convention, + total_units=global_state.total_units, + reserved_units_total=global_state.reserved_units_total, + initial_exchange_amount=global_state.initial_exchange_amount, + outstanding_principal=global_state.outstanding_principal, + next_principal_redemption=global_state.next_principal_redemption, + dynamic_principal_redemption=bool( + global_state.dynamic_principal_redemption + ), + interest_calculation_base=global_state.interest_calculation_base, + accrued_interest=global_state.accrued_interest, + nominal_interest_rate=global_state.nominal_interest_rate, + rate_reset_spread=global_state.rate_reset_spread, + rate_reset_multiplier=global_state.rate_reset_multiplier, + rate_reset_floor=global_state.rate_reset_floor, + rate_reset_cap=global_state.rate_reset_cap, + rate_reset_next=global_state.rate_reset_next, + has_rate_reset_floor=bool(global_state.has_rate_reset_floor), + has_rate_reset_cap=bool(global_state.has_rate_reset_cap), + reserved_principal=global_state.reserved_principal, + reserved_interest=global_state.reserved_interest, + cumulative_interest_index=global_state.cumulative_interest_index, + cumulative_principal_index=global_state.cumulative_principal_index, + event_cursor=global_state.event_cursor, + schedule_entry_count=global_state.schedule_entry_count, + fixed_point_scale=global_state.fixed_point_scale, + ) + + def get_schedule_entry(self, event_id: int) -> ExecutionScheduleEntry | None: + state = self.get_state() + if event_id < 0 or event_id >= state.schedule_entry_count: + return None + page_index = event_id // cst.SCHEDULE_PAGE_SIZE + page_offset = event_id % cst.SCHEDULE_PAGE_SIZE + page = self._client.state.box.schedule_page.get_value(page_index) + if page is None or page_offset >= len(page): + return None + return to_sdk_schedule_entry(page[page_offset]) + + def get_next_due_event(self) -> ExecutionScheduleEntry | None: + state = self.get_state() + if state.event_cursor >= state.schedule_entry_count: + return None + return self.get_schedule_entry(state.event_cursor) + + def get_arranger(self) -> str: + return self._client.state.global_state.arranger + + def get_role_validity( + self, + role: DAsaRole, + address: str, + ) -> RoleValidityWindow | None: + if role == DAsaRole.ARRANGER: + return RoleValidityWindow(0, 0) if address == self.get_arranger() else None + if role == DAsaRole.OP_DAEMON: + return None + if int(role) not in _MANAGED_ROLE_IDS: + raise ValueError(f"unsupported role for validity lookup: {role.name}") + + if role == DAsaRole.ACCOUNT_MANAGER: + validity = self._client.state.box.account_manager.get_value(address) + elif role == DAsaRole.PRIMARY_DEALER: + validity = self._client.state.box.primary_dealer.get_value(address) + elif role == DAsaRole.TRUSTEE: + validity = self._client.state.box.trustee.get_value(address) + elif role == DAsaRole.AUTHORITY: + validity = self._client.state.box.authority.get_value(address) + else: + validity = self._client.state.box.observer.get_value(address) + + if validity is None: + return None + return RoleValidityWindow( + start=validity.role_validity_start, + end=validity.role_validity_end, + ) + + def get_address_roles( + self, + address: str, + *, + at_time: int | None = None, + ) -> AddressRoles: + timestamp = at_time or _latest_timestamp(self._client) + arranger = self._client.state.global_state.arranger + op_daemon = self._client.state.global_state.op_daemon + + def role_active(role: DAsaRole) -> bool: + validity = self.get_role_validity(role, address) + return validity is not None and validity.is_active(timestamp) + + return AddressRoles( + arranger=address == arranger and arranger != ZERO_ADDRESS, + op_daemon=address == op_daemon and op_daemon != ZERO_ADDRESS, + account_manager=role_active(DAsaRole.ACCOUNT_MANAGER), + primary_dealer=role_active(DAsaRole.PRIMARY_DEALER), + trustee=role_active(DAsaRole.TRUSTEE), + authority=role_active(DAsaRole.AUTHORITY), + observer=role_active(DAsaRole.OBSERVER), + ) + + +class _BoundRole: + def __init__(self, app: DAsa, account: SigningAccount) -> None: + self._app = app + self._account = account + self._client = app.raw_client.clone( + default_sender=account.address, + default_signer=account.signer, + ) + + @property + def raw_client(self) -> _GeneratedDasaClient: + return self._client + + @property + def account(self) -> SigningAccount: + return self._account + + @property + def contract(self) -> ContractView: + return self._app.contract + + +class ArrangerRole(_BoundRole): + def configure( + self, + normalized: NormalizationResult, + *, + prospectus_url: str = "", + prospectus_hash: bytes | None = None, + ) -> int: + result = self._client.send.contract_config( + ContractConfigArgs( + terms=to_client_terms(normalized), + initial_state=to_client_initial_state(normalized), + prospectus=to_client_prospectus( + url=prospectus_url, + hash_bytes=prospectus_hash, + ), + ), + params=CommonAppCallParams(max_fee=DEFAULT_CONFIG_FEE), + send_params=SendParams(cover_app_call_inner_transaction_fees=True), + ) + return cast(int, result.abi_return) + + def configure_from_attributes( + self, + contract: ContractAttributes, + *, + denomination_asset_id: int, + denomination_asset_decimals: int, + notional_unit_value: int | float | Decimal, + secondary_market_opening_date: int, + secondary_market_closure_date: int, + preprocessed_events: ( + Sequence[ObservedEventRequest | ExecutionScheduleEntry] | None + ) = None, + prospectus_url: str = "", + prospectus_hash: bytes | None = None, + ) -> NormalizationResult: + normalized = normalize_contract_attributes( + contract, + denomination_asset_id=denomination_asset_id, + denomination_asset_decimals=denomination_asset_decimals, + notional_unit_value=notional_unit_value, + secondary_market_opening_date=secondary_market_opening_date, + secondary_market_closure_date=secondary_market_closure_date, + preprocessed_events=preprocessed_events, + ) + self.configure( + normalized, + prospectus_url=prospectus_url, + prospectus_hash=prospectus_hash, + ) + return normalized + + def upload_schedule( + self, + normalized: NormalizationResult, + *, + page_size: int = cst.SCHEDULE_PAGE_SIZE, + ) -> tuple[int, ...]: + timestamps: list[int] = [] + pages = normalized.schedule_pages(page_size) + for index, page in enumerate(pages): + result = self._client.send.contract_schedule( + ContractScheduleArgs( + schedule_page_index=index, + is_last_page=index == len(pages) - 1, + schedule_page=to_client_schedule_page(page), + ), + params=CommonAppCallParams(max_fee=DEFAULT_CONFIG_FEE), + send_params=SendParams(cover_app_call_inner_transaction_fees=True), + ) + timestamps.append(cast(int, result.abi_return)) + return tuple(timestamps) + + def configure_contract( + self, + *, + normalized: NormalizationResult | None = None, + contract: ContractAttributes | None = None, + denomination_asset_id: int | None = None, + denomination_asset_decimals: int | None = None, + notional_unit_value: int | float | Decimal | None = None, + secondary_market_opening_date: int | None = None, + secondary_market_closure_date: int | None = None, + preprocessed_events: ( + Sequence[ObservedEventRequest | ExecutionScheduleEntry] | None + ) = None, + prospectus_url: str = "", + prospectus_hash: bytes | None = None, + page_size: int = cst.SCHEDULE_PAGE_SIZE, + transfer_opening_date: int | None = None, + transfer_closure_date: int | None = None, + ) -> NormalizationResult: + resolved = _normalize_result( + normalized=normalized, + contract=contract, + denomination_asset_id=denomination_asset_id, + denomination_asset_decimals=denomination_asset_decimals, + notional_unit_value=notional_unit_value, + secondary_market_opening_date=secondary_market_opening_date, + secondary_market_closure_date=secondary_market_closure_date, + preprocessed_events=preprocessed_events, + ) + self.configure( + resolved, + prospectus_url=prospectus_url, + prospectus_hash=prospectus_hash, + ) + self.upload_schedule(resolved, page_size=page_size) + if transfer_opening_date is not None and transfer_closure_date is not None: + self.set_transfer_window( + open_date=transfer_opening_date, + closure_date=transfer_closure_date, + ) + self._app._pricing_context = PricingContext( + notional_unit_value=resolved.terms.notional_unit_value + ) + self._app.contract._pricing_context = self._app._pricing_context + return resolved + + def execute_ied(self) -> int: + result = self._client.send.contract_execute_ied() + return cast(int, result.abi_return) + + def set_transfer_window(self, *, open_date: int, closure_date: int) -> int: + result = self._client.send.transfer_set_schedule( + TransferSetScheduleArgs(open_date=open_date, closure_date=closure_date) + ) + return cast(int, result.abi_return) + + def fund_due_cashflows(self, *, max_event_count: int) -> FundingResult: + result = self._client.send.fund_due_cashflows( + FundDueCashflowsArgs(max_event_count=max_event_count) + ) + funding = result.abi_return + return FundingResult( + funded_interest=funding.funded_interest, + funded_principal=funding.funded_principal, + total_funded=funding.total_funded, + processed_events=funding.processed_events, + timestamp=funding.timestamp, + ) + + def append_observed_cash_event(self, payload: ObservedCashEventRequest) -> int: + event_id = self.contract.get_state().schedule_entry_count + result = self._client.send.append_observed_cash_event( + AppendObservedCashEventArgs( + payload=to_client_observed_cash_event(payload, event_id=event_id) + ) + ) + return cast(int, result.abi_return) + + def append_observed_cash_events( + self, + payloads: Sequence[ObservedCashEventRequest], + ) -> tuple[int, ...]: + timestamps: list[int] = [] + for payload in payloads: + timestamps.append(self.append_observed_cash_event(payload)) + return tuple(timestamps) + + def apply_non_cash_event( + self, *, event_id: int, payload: ObservedEventRequest + ) -> int: + payload_event_id = ( + self.contract.get_state().schedule_entry_count + if payload.flags & enums.FLAG_OBSERVED_EVENT + else event_id + ) + result = self._client.send.apply_non_cash_event( + ApplyNonCashEventArgs( + event_id=event_id, + payload=to_client_observed_event(payload, event_id=payload_event_id), + ) + ) + return cast(int, result.abi_return) + + def rotate_arranger(self, new_arranger: str) -> int: + result = self._client.send.rbac_rotate_arranger( + RbacRotateArrangerArgs(new_arranger=new_arranger) + ) + return cast(int, result.abi_return) + + def set_op_daemon(self, address: str) -> int: + result = self._client.send.rbac_set_op_daemon( + RbacSetOpDaemonArgs(address=address) + ) + return cast(int, result.abi_return) + + def assign_role( + self, + role: DAsaRole, + address: str, + *, + validity: RoleValidityWindow | None = None, + ) -> int: + validity_window = validity or RoleValidityWindow(0, DEFAULT_ROLE_VALIDITY_END) + result = self._client.send.rbac_assign_role( + RbacAssignRoleArgs( + role_id=int(role), + role_address=address, + validity=to_client_role_validity( + start=validity_window.start, + end=validity_window.end, + ), + ) + ) + return cast(int, result.abi_return) + + def revoke_role(self, role: DAsaRole, address: str) -> int: + result = self._client.send.rbac_revoke_role( + RbacRevokeRoleArgs(role_id=int(role), role_address=address) + ) + return cast(int, result.abi_return) + + +class AccountManagerRole(_BoundRole): + def open_account(self, *, holding_address: str, payment_address: str) -> int: + result = self._client.send.account_open( + AccountOpenArgs( + holding_address=holding_address, + payment_address=payment_address, + ) + ) + return cast(int, result.abi_return) + + +class PrimaryDealerRole(_BoundRole): + def primary_distribution(self, *, holding_address: str, units: int) -> int: + result = self._client.send.primary_distribution( + PrimaryDistributionArgs(holding_address=holding_address, units=units) + ) + return cast(int, result.abi_return) + + +class TrusteeRole(_BoundRole): + def set_default(self, *, defaulted: bool) -> int: + result = self._client.send.rbac_contract_default( + RbacContractDefaultArgs(defaulted=defaulted) + ) + return cast(int, result.abi_return) + + +class AuthorityRole(_BoundRole): + def suspend_account(self, *, holding_address: str, suspended: bool) -> int: + result = self._client.send.account_suspension( + AccountSuspensionArgs(holding_address=holding_address, suspended=suspended) + ) + return cast(int, result.abi_return) + + def set_contract_suspension(self, *, suspended: bool) -> int: + result = self._client.send.rbac_contract_suspension( + RbacContractSuspensionArgs(suspended=suspended) + ) + return cast(int, result.abi_return) + + +class ObserverRole(_BoundRole): + def apply_non_cash_event( + self, *, event_id: int, payload: ObservedEventRequest + ) -> int: + result = self._client.send.apply_non_cash_event( + ApplyNonCashEventArgs( + event_id=event_id, + payload=to_client_observed_event(payload, event_id=event_id), + ) + ) + return cast(int, result.abi_return) + + +class OpDaemonRole(_BoundRole): + def claim( + self, *, holding_address: str, payment_info: bytes | str = b"" + ) -> ClaimResult: + result = self._client.send.claim_due_cashflows( + ClaimDueCashflowsArgs( + holding_address=holding_address, + payment_info=payment_info, + ), + params=CommonAppCallParams(max_fee=DEFAULT_CLAIM_FEE), + send_params=SendParams(cover_app_call_inner_transaction_fees=True), + ) + claim = result.abi_return + return ClaimResult( + interest_amount=claim.interest_amount, + principal_amount=claim.principal_amount, + total_amount=claim.total_amount, + timestamp=claim.timestamp, + context=claim.context, + ) + + +class HoldingAccount(_BoundRole): + def __init__( + self, + app: DAsa, + account: SigningAccount, + *, + holding_address: str | None = None, + ) -> None: + super().__init__(app, account) + self._holding_address = holding_address or account.address + + @property + def holding_address(self) -> str: + return self._holding_address + + def get_raw_position(self) -> AccountPosition: + position = self._app.raw_client.state.box.account.get_value( + self.holding_address + ) + if position is None: + raise ValueError(f"unknown holding address: {self.holding_address}") + return to_sdk_account_position(position) + + def get_actualized_position(self, at_time: int | None = None) -> AccountPosition: + if at_time is not None: + self._resolve_quote_timestamp(at_time) + return _actualize_position( + self.get_raw_position(), + state=self.contract.get_state(), + ) + + def get_valuation(self, at_time: int | None = None) -> AccountValuation: + valuation_timestamp = self._resolve_quote_timestamp(at_time) + state = self.contract.get_state() + position = self.get_actualized_position(valuation_timestamp) + principal_share = _share_amount( + state.outstanding_principal, + units=position.units, + total_units=state.total_units, + fixed_point_scale=state.fixed_point_scale, + ) + accrued_interest_not_due = self._accrued_interest_not_due( + state=state, + units=position.units, + at_time=valuation_timestamp, + ) + return AccountValuation( + valuation_timestamp=valuation_timestamp, + position=position, + principal_share=principal_share, + claimable_interest=position.claimable_interest, + claimable_principal=position.claimable_principal, + accrued_interest_not_due=accrued_interest_not_due, + economic_value_total=( + principal_share + + position.claimable_interest + + position.claimable_principal + + accrued_interest_not_due + ), + ) + + def quote_trade( + self, + units: int, + *, + at_time: int | None = None, + trade_side: Literal["buy", "sell"] = "sell", + clean_quote: TradeQuoteInput | None = None, + ) -> TradeQuote: + if trade_side not in {"buy", "sell"}: + raise ValueError("trade_side must be 'buy' or 'sell'") + valuation_timestamp = self._resolve_quote_timestamp(at_time) + state = self.contract.get_state() + next_due_event = self.contract.get_next_due_event() + if ( + next_due_event is not None + and next_due_event.scheduled_time <= valuation_timestamp + ): + raise ValueError("cannot quote while a due ACTUS event is pending") + self._assert_transfer_is_open(state=state, at_time=valuation_timestamp) + + valuation = self.get_valuation(valuation_timestamp) + if units <= 0: + raise ValueError("units must be greater than zero") + if units > valuation.position.units: + raise ValueError("units exceed the actualized active balance") + + principal_share_total = _share_amount( + state.outstanding_principal, + units=units, + total_units=state.total_units, + fixed_point_scale=state.fixed_point_scale, + ) + accrued_interest_not_due_total = self._accrued_interest_not_due( + state=state, + units=units, + at_time=valuation_timestamp, + ) + par_reference_clean_total = principal_share_total + par_reference_dirty_total = ( + principal_share_total + accrued_interest_not_due_total + ) + + market_clean_total: Decimal | None = None + market_dirty_total: Decimal | None = None + market_clean_per_unit: Decimal | None = None + market_dirty_per_unit: Decimal | None = None + if clean_quote is not None: + market_clean_total = clean_quote.resolve( + units=units, + pricing_context=self._app.pricing_context, + ) + market_dirty_total = market_clean_total + Decimal( + accrued_interest_not_due_total + ) + market_clean_per_unit = market_clean_total / Decimal(units) + market_dirty_per_unit = market_dirty_total / Decimal(units) + + return TradeQuote( + trade_side=trade_side, + units=units, + valuation_timestamp=valuation_timestamp, + principal_share_total=principal_share_total, + accrued_interest_not_due_total=accrued_interest_not_due_total, + economic_value_total=par_reference_dirty_total, + seller_retained_claimable_interest=valuation.claimable_interest, + seller_retained_claimable_principal=valuation.claimable_principal, + par_reference_clean_total=par_reference_clean_total, + par_reference_dirty_total=par_reference_dirty_total, + market_clean_total=market_clean_total, + market_dirty_total=market_dirty_total, + market_clean_per_unit=market_clean_per_unit, + market_dirty_per_unit=market_dirty_per_unit, + ) + + def build_otc_dvp( + self, + *, + buyer: SigningAccount, + units: int, + payment_amount: int, + payment_asset_id: int | None = None, + seller: SigningAccount | None = None, + sender_holding_address: str | None = None, + receiver_holding_address: str | None = None, + payment_receiver: str | None = None, + at_time: int | None = None, + clean_quote: TradeQuoteInput | None = None, + quote_tolerance: int | None = None, + ) -> OtcDvpDraft: + seller_account = seller or self.account + sender_address = sender_holding_address or self.holding_address + receiver_address = receiver_holding_address or buyer.address + payee = payment_receiver or seller_account.address + + if units <= 0: + raise ValueError("units must be greater than zero") + if payment_amount <= 0: + raise ValueError("payment_amount must be greater than zero") + if ( + seller_account.address == buyer.address + or sender_address == receiver_address + ): + raise ValueError("buyer and seller must be different") + if seller_account.address != sender_address: + raise ValueError( + "seller signer must match sender_holding_address for the D-ASA transfer leg" + ) + + quote: TradeQuote | None = None + if quote_tolerance is not None: + quote = self.quote_trade( + units, + at_time=at_time, + trade_side="sell", + clean_quote=clean_quote, + ) + reference_total = ( + quote.market_dirty_total + if quote.market_dirty_total is not None + else Decimal(quote.par_reference_dirty_total) + ) + delta = abs(Decimal(payment_amount) - reference_total) + if delta > Decimal(quote_tolerance): + raise ValueError( + "payment amount is outside the configured quote tolerance" + ) + + seller_client = self._app.raw_client.clone( + default_sender=seller_account.address, + default_signer=seller_account.signer, + ) + if payment_asset_id is None: + payment_transaction = seller_client.algorand.create_transaction.payment( + PaymentParams( + sender=buyer.address, + signer=buyer.signer, + receiver=payee, + amount=AlgoAmount.from_micro_algo(payment_amount), + ) + ) + else: + payment_transaction = ( + seller_client.algorand.create_transaction.asset_transfer( + AssetTransferParams( + asset_id=payment_asset_id, + amount=payment_amount, + sender=buyer.address, + signer=buyer.signer, + receiver=payee, + ) + ) + ) + + composer = ( + seller_client.new_group() + .add_transaction( + payment_transaction, + buyer.signer, + ) + .transfer( + TransferArgs( + sender_holding_address=sender_address, + receiver_holding_address=receiver_address, + units=units, + ) + ) + ) + return OtcDvpDraft( + buyer_address=buyer.address, + seller_address=seller_account.address, + sender_holding_address=sender_address, + receiver_holding_address=receiver_address, + units=units, + payment_amount=payment_amount, + payment_asset_id=payment_asset_id, + payment_transaction=payment_transaction, + quote=quote, + composer=composer, + ) + + def transfer(self, *, receiver_holding_address: str, units: int) -> int: + if self.account.address != self.holding_address: + raise ValueError( + "transfer requires a signer that matches the holding address" + ) + result = self._client.send.transfer( + TransferArgs( + sender_holding_address=self.holding_address, + receiver_holding_address=receiver_holding_address, + units=units, + ) + ) + return cast(int, result.abi_return) + + def claim(self, *, payment_info: bytes | str = b"") -> ClaimResult: + result = self._client.send.claim_due_cashflows( + ClaimDueCashflowsArgs( + holding_address=self.holding_address, + payment_info=payment_info, + ), + params=CommonAppCallParams(max_fee=DEFAULT_CLAIM_FEE), + send_params=SendParams(cover_app_call_inner_transaction_fees=True), + ) + claim = result.abi_return + return ClaimResult( + interest_amount=claim.interest_amount, + principal_amount=claim.principal_amount, + total_amount=claim.total_amount, + timestamp=claim.timestamp, + context=claim.context, + ) + + def update_payment_address(self, *, payment_address: str) -> int: + if self.account.address != self.holding_address: + raise ValueError( + "payment address updates require a signer that matches the holding address" + ) + result = self._client.send.account_update_payment_address( + AccountUpdatePaymentAddressArgs( + holding_address=self.holding_address, + payment_address=payment_address, + ) + ) + return cast(int, result.abi_return) + + def _resolve_quote_timestamp(self, at_time: int | None) -> int: + now = _latest_timestamp(self._app.raw_client) + if at_time is None: + return now + if at_time < now: + raise ValueError( + "at_time cannot be earlier than the latest on-chain timestamp" + ) + return at_time + + def _assert_transfer_is_open(self, *, state: ContractState, at_time: int) -> None: + if state.status == enums.STATUS_PENDING_IED: + raise ValueError("cannot quote or trade before IED executes") + if state.transfer_opening_date and at_time < state.transfer_opening_date: + raise ValueError("transfer window is not open yet") + if state.transfer_closure_date and at_time >= state.transfer_closure_date: + raise ValueError("transfer window is closed") + + def _accrued_interest_not_due( + self, + *, + state: ContractState, + units: int, + at_time: int, + ) -> int: + if state.status != enums.STATUS_ACTIVE or units == 0: + return 0 + if state.total_units <= 0 or state.fixed_point_scale <= 0: + return 0 + + accrued_share = _share_amount( + state.accrued_interest, + units=units, + total_units=state.total_units, + fixed_point_scale=state.fixed_point_scale, + ) + if state.event_cursor >= state.schedule_entry_count: + return accrued_share + + next_entry = self.contract.get_schedule_entry(state.event_cursor) + if next_entry is None or at_time >= next_entry.scheduled_time: + return accrued_share + start_time = self._partial_accrual_start(state=state) + if start_time is None or at_time <= start_time: + return accrued_share + + partial_factor = year_fraction_fixed( + start_time, + at_time, + day_count_convention=state.day_count_convention, + maturity_date=state.maturity_date or None, + ) + if partial_factor == 0: + return accrued_share + + period_interest = _scaled_mul_div( + state.interest_calculation_base, + state.nominal_interest_rate, + state.fixed_point_scale, + ) + partial_amount = _scaled_mul_div( + period_interest, + partial_factor, + state.fixed_point_scale, + ) + return accrued_share + _share_amount( + partial_amount, + units=units, + total_units=state.total_units, + fixed_point_scale=state.fixed_point_scale, + ) + + def _partial_accrual_start(self, *, state: ContractState) -> int | None: + if state.event_cursor == 0: + return None + previous_entry = self.contract.get_schedule_entry(state.event_cursor - 1) + if previous_entry is None: + return None + return previous_entry.scheduled_time + + +class DAsa: + def __init__( + self, + client: _GeneratedDasaClient, + *, + pricing_context: PricingContext | None = None, + ) -> None: + self._client = client + self._pricing_context = pricing_context + self.contract = ContractView(client, pricing_context=pricing_context) + + @classmethod + def deploy( + cls, + *, + algorand: AlgorandClient, + arranger: SigningAccount, + app_name: str | None = None, + send_params: SendParams | None = None, + ) -> DAsa: + factory = _GeneratedDasaFactory( + algorand, + app_name=app_name, + default_sender=arranger.address, + default_signer=arranger.signer, + ) + client, _ = factory.send.create.contract_create( + ContractCreateArgs(arranger=arranger.address), + send_params=send_params, + ) + return cls(client) + + @classmethod + def deploy_configured( + cls, + *, + algorand: AlgorandClient, + arranger: SigningAccount, + normalized: NormalizationResult | None = None, + contract: ContractAttributes | None = None, + denomination_asset_id: int | None = None, + denomination_asset_decimals: int | None = None, + notional_unit_value: int | float | Decimal | None = None, + secondary_market_opening_date: int | None = None, + secondary_market_closure_date: int | None = None, + preprocessed_events: ( + Sequence[ObservedEventRequest | ExecutionScheduleEntry] | None + ) = None, + app_name: str | None = None, + prospectus_url: str = "", + prospectus_hash: bytes | None = None, + page_size: int = cst.SCHEDULE_PAGE_SIZE, + transfer_opening_date: int | None = None, + transfer_closure_date: int | None = None, + app_account_funding: AlgoAmount | None = DEFAULT_APP_FUNDING, + funding_account: SigningAccount | None = None, + ) -> DAsa: + resolved = _normalize_result( + normalized=normalized, + contract=contract, + denomination_asset_id=denomination_asset_id, + denomination_asset_decimals=denomination_asset_decimals, + notional_unit_value=notional_unit_value, + secondary_market_opening_date=secondary_market_opening_date, + secondary_market_closure_date=secondary_market_closure_date, + preprocessed_events=preprocessed_events, + ) + app = cls.deploy( + algorand=algorand, + arranger=arranger, + app_name=app_name, + ) + if app_account_funding is not None: + app._fund_app_account( + payer=funding_account or arranger, + amount=app_account_funding, + ) + app.arranger(arranger).configure_contract( + normalized=resolved, + prospectus_url=prospectus_url, + prospectus_hash=prospectus_hash, + page_size=page_size, + transfer_opening_date=transfer_opening_date, + transfer_closure_date=transfer_closure_date, + ) + app._pricing_context = PricingContext( + notional_unit_value=resolved.terms.notional_unit_value + ) + app.contract._pricing_context = app._pricing_context + return app + + @classmethod + def from_app_id( + cls, + *, + algorand: AlgorandClient, + app_id: int, + app_name: str | None = None, + default_sender: str | None = None, + default_signer: TransactionSigner | None = None, + pricing_context: PricingContext | None = None, + ) -> DAsa: + return cls( + _GeneratedDasaClient( + algorand=algorand, + app_id=app_id, + app_name=app_name, + default_sender=default_sender, + default_signer=default_signer, + ), + pricing_context=pricing_context, + ) + + @classmethod + def from_client( + cls, + client: _GeneratedDasaClient, + *, + pricing_context: PricingContext | None = None, + ) -> DAsa: + return cls(client, pricing_context=pricing_context) + + @property + def raw_client(self) -> _GeneratedDasaClient: + return self._client + + @property + def pricing_context(self) -> PricingContext | None: + return self._pricing_context + + @property + def app_id(self) -> int: + return self._client.app_id + + @property + def app_address(self) -> str: + return self._client.app_address + + def arranger(self, account: SigningAccount) -> ArrangerRole: + return ArrangerRole(self, account) + + def account( + self, + holding_account: SigningAccount, + holding_address: str | None = None, + ) -> HoldingAccount: + return HoldingAccount(self, holding_account, holding_address=holding_address) + + def account_manager(self, account: SigningAccount) -> AccountManagerRole: + return AccountManagerRole(self, account) + + def primary_dealer(self, account: SigningAccount) -> PrimaryDealerRole: + return PrimaryDealerRole(self, account) + + def trustee(self, account: SigningAccount) -> TrusteeRole: + return TrusteeRole(self, account) + + def authority(self, account: SigningAccount) -> AuthorityRole: + return AuthorityRole(self, account) + + def observer(self, account: SigningAccount) -> ObserverRole: + return ObserverRole(self, account) + + def op_daemon(self, account: SigningAccount) -> OpDaemonRole: + return OpDaemonRole(self, account) + + def _fund_app_account(self, *, payer: SigningAccount, amount: AlgoAmount) -> None: + self._client.algorand.send.payment( + PaymentParams( + sender=payer.address, + signer=payer.signer, + receiver=self.app_address, + amount=amount, + ) + ) From 30b08c6344c9b819d53aa0087a4880cafe9d1138 Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 21:05:41 +0100 Subject: [PATCH 208/244] test: d-asa sdk --- tests/sdk/test_dasa.py | 507 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 507 insertions(+) create mode 100644 tests/sdk/test_dasa.py diff --git a/tests/sdk/test_dasa.py b/tests/sdk/test_dasa.py new file mode 100644 index 00000000..02f40170 --- /dev/null +++ b/tests/sdk/test_dasa.py @@ -0,0 +1,507 @@ +from __future__ import annotations + +from dataclasses import dataclass +from decimal import Decimal +from pathlib import Path +from types import SimpleNamespace + +import tomllib +from algosdk.constants import ZERO_ADDRESS + +from smart_contracts import constants as cst +from smart_contracts import enums +from src import ( + DAsa, + DAsaRole, + PricingContext, + RoleValidityWindow, + TradeQuoteInput, + make_pam_zero_coupon_bond, + normalize_contract_attributes, +) +from src.models import AccountPosition + + +@dataclass(frozen=True, slots=True) +class DummyTransaction: + kind: str + params: object + + +class FakeMap: + def __init__(self, values: dict[object, object] | None = None) -> None: + self._values = values or {} + + def get_value(self, key: object) -> object | None: + return self._values.get(key) + + +class FakeComposer: + def __init__(self) -> None: + self.steps: list[tuple[str, object, object | None]] = [] + + def add_transaction( + self, txn: object, signer: object | None = None + ) -> FakeComposer: + self.steps.append(("add_transaction", txn, signer)) + return self + + def transfer(self, args: object) -> FakeComposer: + self.steps.append(("transfer", args, None)) + return self + + def send(self, send_params: object | None = None) -> dict[str, object]: + return {"send_params": send_params, "steps": self.steps} + + def simulate(self, **kwargs: object) -> dict[str, object]: + return {"kwargs": kwargs, "steps": self.steps} + + +class FakeCreateTransaction: + def payment(self, params: object) -> DummyTransaction: + return DummyTransaction(kind="payment", params=params) + + def asset_transfer(self, params: object) -> DummyTransaction: + return DummyTransaction(kind="asset_transfer", params=params) + + +class FakeAlgod: + def __init__(self, timestamp: int) -> None: + self._timestamp = timestamp + + def status(self) -> dict[str, int]: + return {"last-round": 1} + + def block_info(self, round_number: int) -> dict[str, object]: + assert round_number == 1 + return {"block": {"ts": self._timestamp}} + + +class FakeAlgorand: + def __init__(self, timestamp: int) -> None: + self.client = SimpleNamespace(algod=FakeAlgod(timestamp)) + self.create_transaction = FakeCreateTransaction() + self.send = SimpleNamespace(payment=lambda params: params) + + +class FakeSend: + def __init__(self) -> None: + self.calls: list[tuple[str, object, object | None, object | None]] = [] + self.contract_schedule_returns: list[int] = [] + + def contract_config( + self, + args: object, + params: object | None = None, + send_params: object | None = None, + ) -> SimpleNamespace: + self.calls.append(("contract_config", args, params, send_params)) + return SimpleNamespace(abi_return=111) + + def contract_schedule( + self, + args: object, + params: object | None = None, + send_params: object | None = None, + ) -> SimpleNamespace: + self.calls.append(("contract_schedule", args, params, send_params)) + value = 200 + len( + [call for call in self.calls if call[0] == "contract_schedule"] + ) + self.contract_schedule_returns.append(value) + return SimpleNamespace(abi_return=value) + + +class FakeClient: + def __init__( + self, + *, + timestamp: int, + global_state: SimpleNamespace, + account_positions: dict[str, object] | None = None, + schedule_pages: dict[int, object] | None = None, + role_maps: dict[str, dict[str, object]] | None = None, + send: FakeSend | None = None, + app_id: int = 7, + app_address: str = "APP_ADDRESS", + default_sender: str | None = None, + default_signer: object | None = None, + ) -> None: + role_maps = role_maps or {} + self.algorand = FakeAlgorand(timestamp) + self.app_id = app_id + self.app_address = app_address + self._default_sender = default_sender + self._default_signer = default_signer + self._send = send or FakeSend() + self.state = SimpleNamespace( + global_state=global_state, + box=SimpleNamespace( + account=FakeMap(account_positions), + schedule_page=FakeMap(schedule_pages), + account_manager=FakeMap(role_maps.get("account_manager")), + primary_dealer=FakeMap(role_maps.get("primary_dealer")), + trustee=FakeMap(role_maps.get("trustee")), + authority=FakeMap(role_maps.get("authority")), + observer=FakeMap(role_maps.get("observer")), + ), + ) + self.send = self._send + + def clone( + self, + *, + default_sender: str | None = None, + default_signer: object | None = None, + **_: object, + ) -> FakeClient: + return FakeClient( + timestamp=self.algorand.client.algod._timestamp, + global_state=self.state.global_state, + account_positions=self.state.box.account._values, + schedule_pages=self.state.box.schedule_page._values, + role_maps={ + "account_manager": self.state.box.account_manager._values, + "primary_dealer": self.state.box.primary_dealer._values, + "trustee": self.state.box.trustee._values, + "authority": self.state.box.authority._values, + "observer": self.state.box.observer._values, + }, + send=self._send, + app_id=self.app_id, + app_address=self.app_address, + default_sender=default_sender, + default_signer=default_signer, + ) + + def new_group(self) -> FakeComposer: + return FakeComposer() + + +def _global_state(**overrides: object) -> SimpleNamespace: + defaults = { + "arranger": "ARRANGER", + "op_daemon": ZERO_ADDRESS, + "contract_suspended": 0, + "defaulted": 0, + "status": enums.STATUS_ACTIVE, + "contract_type": enums.CT_PAM, + "denomination_asset_id": 1, + "settlement_asset_id": 1, + "initial_exchange_date": 1_700_000_000, + "maturity_date": 1_800_000_000, + "transfer_opening_date": 0, + "transfer_closure_date": 0, + "day_count_convention": enums.DCC_A360, + "total_units": 100, + "reserved_units_total": 0, + "initial_exchange_amount": 10_000, + "outstanding_principal": 10_000, + "next_principal_redemption": 0, + "dynamic_principal_redemption": 0, + "interest_calculation_base": 10_000, + "accrued_interest": 0, + "nominal_interest_rate": 0, + "rate_reset_spread": 0, + "rate_reset_multiplier": cst.FIXED_POINT_SCALE, + "rate_reset_floor": 0, + "rate_reset_cap": 0, + "rate_reset_next": 0, + "has_rate_reset_floor": 0, + "has_rate_reset_cap": 0, + "reserved_principal": 0, + "reserved_interest": 0, + "cumulative_interest_index": 0, + "cumulative_principal_index": 0, + "event_cursor": 1, + "schedule_entry_count": 2, + "fixed_point_scale": cst.FIXED_POINT_SCALE, + } + defaults.update(overrides) + return SimpleNamespace(**defaults) + + +def _schedule_entry( + event_id: int, + event_type: int, + scheduled_time: int, + accrual_factor: int = 0, +) -> tuple[int, int, int, int, int, int, int, int, int]: + return (event_id, event_type, scheduled_time, accrual_factor, 0, 0, 0, 0, 0) + + +def test_root_exports_include_high_level_surface() -> None: + import src + + assert src.DAsa is DAsa + assert src.make_pam_zero_coupon_bond is make_pam_zero_coupon_bond + assert src.normalize_contract_attributes is normalize_contract_attributes + assert not hasattr(src, "dasa_client") + + +def test_actualized_position_activates_reserved_units_and_settles_indices() -> None: + client = FakeClient( + timestamp=1_700_000_100, + global_state=_global_state( + cumulative_interest_index=105, + cumulative_principal_index=207, + event_cursor=4, + fixed_point_scale=100, + ), + account_positions={ + "INVESTOR": AccountPosition( + units=0, + reserved_units=10, + payment_address="INVESTOR", + suspended=False, + settled_cursor=0, + interest_checkpoint=5, + principal_checkpoint=7, + claimable_interest=2, + claimable_principal=3, + ) + }, + schedule_pages={0: [_schedule_entry(0, enums.EVT_IED, 1_700_000_000)]}, + ) + + position = ( + DAsa.from_client(client) + .account(SimpleNamespace(address="INVESTOR", signer=object())) + .get_actualized_position() + ) + + assert position.units == 10 + assert position.reserved_units == 0 + assert position.claimable_interest == 12 + assert position.claimable_principal == 23 + assert position.settled_cursor == 4 + assert position.interest_checkpoint == 105 + assert position.principal_checkpoint == 207 + + +def test_quote_trade_adds_mid_period_accrual_and_dirty_price() -> None: + start = 1_700_000_000 + valuation_time = start + 90 * cst.DAY_2_SEC + client = FakeClient( + timestamp=valuation_time, + global_state=_global_state( + accrued_interest=200, + nominal_interest_rate=100_000_000, + event_cursor=1, + schedule_entry_count=2, + ), + account_positions={ + "INVESTOR": AccountPosition( + units=20, + reserved_units=0, + payment_address="INVESTOR", + suspended=False, + settled_cursor=1, + interest_checkpoint=0, + principal_checkpoint=0, + claimable_interest=15, + claimable_principal=25, + ) + }, + schedule_pages={ + 0: [ + _schedule_entry(0, enums.EVT_IED, start), + _schedule_entry(1, enums.EVT_IP, start + 180 * cst.DAY_2_SEC), + ] + }, + ) + app = DAsa.from_client( + client, pricing_context=PricingContext(notional_unit_value=100) + ) + quote = app.account( + SimpleNamespace(address="INVESTOR", signer=object()) + ).quote_trade( + 20, + clean_quote=TradeQuoteInput(clean_price_per_100=Decimal("99.50")), + ) + + assert quote.principal_share_total == 2_000 + assert quote.accrued_interest_not_due_total == 90 + assert quote.par_reference_dirty_total == 2_090 + assert quote.seller_retained_claimable_interest == 15 + assert quote.seller_retained_claimable_principal == 25 + assert quote.market_clean_total == Decimal("1990.00") + assert quote.market_dirty_total == Decimal("2080.00") + + +def test_quote_trade_rejects_due_event() -> None: + due_time = 1_700_000_000 + client = FakeClient( + timestamp=due_time, + global_state=_global_state(event_cursor=1, schedule_entry_count=2), + account_positions={ + "INVESTOR": AccountPosition( + units=10, + reserved_units=0, + payment_address="INVESTOR", + suspended=False, + settled_cursor=1, + interest_checkpoint=0, + principal_checkpoint=0, + claimable_interest=0, + claimable_principal=0, + ) + }, + schedule_pages={ + 0: [ + _schedule_entry(0, enums.EVT_IED, due_time - cst.DAY_2_SEC), + _schedule_entry(1, enums.EVT_IP, due_time), + ] + }, + ) + holding = DAsa.from_client(client).account( + SimpleNamespace(address="INVESTOR", signer=object()) + ) + + try: + holding.quote_trade(1) + except ValueError as exc: + assert "due ACTUS event is pending" in str(exc) + else: # pragma: no cover - defensive + raise AssertionError("expected quote_trade to reject a pending due event") + + +def test_build_otc_dvp_supports_algo_and_asa_payment_legs() -> None: + timestamp = 1_700_000_100 + client = FakeClient( + timestamp=timestamp, + global_state=_global_state( + accrued_interest=200, + nominal_interest_rate=100_000_000, + event_cursor=1, + schedule_entry_count=2, + ), + account_positions={ + "SELLER": AccountPosition( + units=20, + reserved_units=0, + payment_address="SELLER", + suspended=False, + settled_cursor=1, + interest_checkpoint=0, + principal_checkpoint=0, + claimable_interest=0, + claimable_principal=0, + ) + }, + schedule_pages={ + 0: [ + _schedule_entry(0, enums.EVT_IED, timestamp - cst.DAY_2_SEC), + _schedule_entry(1, enums.EVT_IP, timestamp + 90 * cst.DAY_2_SEC), + ] + }, + ) + app = DAsa.from_client(client) + seller = SimpleNamespace(address="SELLER", signer=object()) + buyer = SimpleNamespace(address="BUYER", signer=object()) + + algo_draft = app.account(seller).build_otc_dvp( + buyer=buyer, + units=5, + payment_amount=1_000, + ) + asa_draft = app.account(seller).build_otc_dvp( + buyer=buyer, + units=5, + payment_amount=2_000, + payment_asset_id=77, + ) + + assert algo_draft.payment_transaction.kind == "payment" + assert asa_draft.payment_transaction.kind == "asset_transfer" + assert algo_draft.composer.steps[0][0] == "add_transaction" + assert algo_draft.composer.steps[1][0] == "transfer" + transfer_args = algo_draft.composer.steps[1][1] + assert transfer_args.sender_holding_address == "SELLER" + assert transfer_args.receiver_holding_address == "BUYER" + assert transfer_args.units == 5 + + +def test_arranger_configure_contract_uses_mappers_and_updates_pricing_context() -> None: + normalized = normalize_contract_attributes( + make_pam_zero_coupon_bond( + contract_id=1, + status_date=1_700_000_000, + initial_exchange_date=1_700_000_000 + 30 * cst.DAY_2_SEC, + maturity_date=1_700_000_000 + 365 * cst.DAY_2_SEC, + notional_principal=10_000, + premium_discount_at_ied=0, + ), + denomination_asset_id=1, + denomination_asset_decimals=2, + notional_unit_value=100, + secondary_market_opening_date=1_700_000_000 + 30 * cst.DAY_2_SEC, + secondary_market_closure_date=1_700_000_000 + 366 * cst.DAY_2_SEC, + ) + fake_send = FakeSend() + client = FakeClient( + timestamp=1_700_000_000, + global_state=_global_state( + status=enums.STATUS_INACTIVE, event_cursor=0, schedule_entry_count=0 + ), + send=fake_send, + ) + app = DAsa.from_client(client) + arranger = SimpleNamespace(address="ARRANGER", signer=object()) + + result = app.arranger(arranger).configure_contract( + normalized=normalized, + prospectus_url="prospectus", + ) + + assert result == normalized + assert app.pricing_context == PricingContext( + notional_unit_value=normalized.terms.notional_unit_value + ) + assert [call[0] for call in fake_send.calls] == [ + "contract_config", + "contract_schedule", + ] + + +def test_pyproject_runtime_dependencies_only_keep_algokit_utils() -> None: + pyproject = Path(__file__).resolve().parents[2] / "pyproject.toml" + parsed = tomllib.loads(pyproject.read_text()) + poetry = parsed["tool"]["poetry"] + runtime_dependencies = poetry["dependencies"] + dev_dependencies = poetry["group"]["dev"]["dependencies"] + + assert "algokit-utils" in runtime_dependencies + assert "python-dotenv" not in runtime_dependencies + assert "algorand-python" not in runtime_dependencies + assert "python-dotenv" in dev_dependencies + assert poetry["packages"] == [ + {"include": "src"}, + {"include": "smart_contracts"}, + {"include": "modules"}, + ] + + +def test_contract_view_role_helpers_resolve_active_roles() -> None: + timestamp = 1_700_000_000 + client = FakeClient( + timestamp=timestamp, + global_state=_global_state(op_daemon="OP_DAEMON"), + role_maps={ + "account_manager": { + "MANAGER": SimpleNamespace( + role_validity_start=0, + role_validity_end=2**64 - 1, + ) + } + }, + ) + roles = DAsa.from_client(client).contract.get_address_roles("MANAGER") + + assert roles.account_manager is True + assert roles.arranger is False + assert roles.op_daemon is False + assert DAsa.from_client(client).contract.get_role_validity( + DAsaRole.ACCOUNT_MANAGER, + "MANAGER", + ) == RoleValidityWindow(0, 2**64 - 1) From 34210d7b9375a04c93784a6cfca7d1754a5b67d0 Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 21:06:06 +0100 Subject: [PATCH 209/244] docs: d-asa sdk --- CONTRIBUTING.md | 2 +- README.md | 2 ++ docs/SUMMARY.md | 8 +++++ docs/sdk/deploy-and-attach.md | 58 +++++++++++++++++++++++++++++++++++ docs/sdk/dvp.md | 44 ++++++++++++++++++++++++++ docs/sdk/overview.md | 32 +++++++++++++++++++ docs/sdk/roles.md | 56 +++++++++++++++++++++++++++++++++ docs/sdk/valuation.md | 53 ++++++++++++++++++++++++++++++++ 8 files changed, 254 insertions(+), 1 deletion(-) create mode 100644 docs/sdk/deploy-and-attach.md create mode 100644 docs/sdk/dvp.md create mode 100644 docs/sdk/overview.md create mode 100644 docs/sdk/roles.md create mode 100644 docs/sdk/valuation.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c815d209..669f5d77 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -165,7 +165,7 @@ The main top-level layout is: docs/ -> mdBook source files modules/ -> D-ASA module implementations smart_contracts/ -> AVM smart contracts and generated contract artifacts -src/ -> Python-side normalization, helpers, and shared runtime code +src/ -> D-ASA SDK, Python-side normalization, helpers, and shared runtime code tests/ -> SDK, contract, LocalNet, and showcase tests ``` diff --git a/README.md b/README.md index c6b63f70..3b3f9012 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,8 @@ The canonical ABI artifact is: Documentation: +High-level client docs: `docs/sdk/overview.md` + [![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/cusma/d-asa) ## Demo in One Command diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md index 02c3e2a1..c50e3f2c 100644 --- a/docs/SUMMARY.md +++ b/docs/SUMMARY.md @@ -41,6 +41,14 @@ - [Events](./events/events.md) +# SDK + +- [Overview](./sdk/overview.md) +- [Deploy and Attach](./sdk/deploy-and-attach.md) +- [Role Wrappers](./sdk/roles.md) +- [Actualized Positions and Valuation](./sdk/valuation.md) +- [OTC DvP Builder](./sdk/dvp.md) + # Interfaces - [Interfaces](./interfaces/overview.md) diff --git a/docs/sdk/deploy-and-attach.md b/docs/sdk/deploy-and-attach.md new file mode 100644 index 00000000..b2ac0842 --- /dev/null +++ b/docs/sdk/deploy-and-attach.md @@ -0,0 +1,58 @@ +# Deploy and Attach + +## Deploy + +```python +from src import DAsa + +app = DAsa.deploy( + algorand=algorand, + arranger=arranger, + app_name="my-dasa", +) +``` + +## Deploy and Configure + +`deploy_configured(...)` accepts either a precomputed `NormalizationResult` or raw `ContractAttributes` plus the normalization inputs. + +```python +app = DAsa.deploy_configured( + algorand=algorand, + arranger=arranger, + normalized=normalized, + prospectus_url="Issuer term sheet", +) +``` + +When configuration happens through the high-level API, `DAsa` also stores a `PricingContext` derived from `normalized.terms.notional_unit_value`. + +## Attach to an Existing App + +```python +app = DAsa.from_app_id( + algorand=algorand, + app_id=12345, +) +``` + +If you already have the generated client: + +```python +from src.artifacts.dasa_client import DasaClient + +raw_client = DasaClient(algorand=algorand, app_id=12345) +app = DAsa.from_client(raw_client) +``` + +## Contract View + +`app.contract` exposes readonly helpers built from on-chain state: + +- `get_state()` +- `get_next_due_event()` +- `get_schedule_entry(event_id)` +- `get_arranger()` +- `get_address_roles(address)` +- `get_role_validity(role, address)` +- `raw_client` diff --git a/docs/sdk/dvp.md b/docs/sdk/dvp.md new file mode 100644 index 00000000..6958b00b --- /dev/null +++ b/docs/sdk/dvp.md @@ -0,0 +1,44 @@ +# OTC DvP Builder + +`HoldingAccount.build_otc_dvp(...)` builds an atomic delivery-vs-payment group for OTC secondary trades. + +The builder is intentionally non-custodial: + +- it creates the payment leg +- it creates the D-ASA transfer leg +- it returns the composed group for inspection, signing, simulation, or sending + +## Algo Settlement + +```python +draft = app.account(seller).build_otc_dvp( + buyer=buyer, + units=10, + payment_amount=150_000, +) + +result = draft.send() +``` + +## ASA Settlement + +```python +draft = app.account(seller).build_otc_dvp( + buyer=buyer, + units=10, + payment_amount=15_000, + payment_asset_id=settlement_asa_id, +) +``` + +## Guardrails + +The builder validates: + +- `units > 0` +- `payment_amount > 0` +- seller and buyer are different +- the seller signer matches the transfer sender holding address +- optional quote tolerance, when provided + +You can combine it with `quote_trade(...)` inputs to fail fast when the negotiated payment amount drifts too far from the SDK's accrual-aware reference. diff --git a/docs/sdk/overview.md b/docs/sdk/overview.md new file mode 100644 index 00000000..f9c44743 --- /dev/null +++ b/docs/sdk/overview.md @@ -0,0 +1,32 @@ +# SDK Overview + +The high-level Python API lives directly under `src` and is centered on `DAsa`. + +It wraps the generated ARC-56 client in [`src.artifacts.dasa_client`](/Users/cosimo/Workspace/code/d-asa/src/artifacts/dasa_client.py) and keeps the generated ABI structs out of the normal user flow. + +```python +from src import ( + DAsa, + ContractAttributes, + PricingContext, + make_pam_zero_coupon_bond, + normalize_contract_attributes, +) +``` + +The root package also continues to expose the domain models and the ACTUS normalizer directly: + +- `ContractAttributes` +- `make_pam_zero_coupon_bond(...)` +- `make_pam_fixed_coupon_bond_profile(...)` +- `normalize_contract_attributes(...)` +- `NormalizationResult` +- `NormalizedActusTerms` +- `InitialKernelState` +- `ExecutionScheduleEntry` +- `AccountPosition` +- `ObservedEventRequest` +- `ObservedCashEventRequest` +- `Cycle` + +Use `DAsa` for contract interaction, and keep `src.artifacts.dasa_client` as the explicit low-level escape hatch when needed. diff --git a/docs/sdk/roles.md b/docs/sdk/roles.md new file mode 100644 index 00000000..051941bb --- /dev/null +++ b/docs/sdk/roles.md @@ -0,0 +1,56 @@ +# Role Wrappers + +`DAsa` binds signer accounts into role-oriented wrappers instead of requiring repeated manual sender and signer plumbing. + +```python +arranger = app.arranger(arranger_account) +account_manager = app.account_manager(manager_account) +primary_dealer = app.primary_dealer(dealer_account) +trustee = app.trustee(trustee_account) +authority = app.authority(authority_account) +observer = app.observer(observer_account) +op_daemon = app.op_daemon(op_daemon_account) +holder = app.account(holder_account) +``` + +## Arranger + +`ArrangerRole` covers the contract lifecycle and arranger-controlled actions: + +- `configure(...)` +- `configure_from_attributes(...)` +- `configure_contract(...)` +- `upload_schedule(...)` +- `execute_ied()` +- `set_transfer_window(...)` +- `fund_due_cashflows(...)` +- `append_observed_cash_event(...)` +- `append_observed_cash_events(...)` +- `apply_non_cash_event(...)` +- `rotate_arranger(...)` +- `set_op_daemon(...)` +- `assign_role(...)` +- `revoke_role(...)` + +## Other Roles + +- `AccountManagerRole.open_account(...)` +- `PrimaryDealerRole.primary_distribution(...)` +- `TrusteeRole.set_default(...)` +- `AuthorityRole.suspend_account(...)` +- `AuthorityRole.set_contract_suspension(...)` +- `ObserverRole.apply_non_cash_event(...)` +- `OpDaemonRole.claim(...)` + +## Holding Accounts + +`HoldingAccount` is the investor-facing wrapper: + +- `get_raw_position()` +- `get_actualized_position(...)` +- `get_valuation(...)` +- `quote_trade(...)` +- `build_otc_dvp(...)` +- `transfer(...)` +- `claim(...)` +- `update_payment_address(...)` diff --git a/docs/sdk/valuation.md b/docs/sdk/valuation.md new file mode 100644 index 00000000..0755cc9d --- /dev/null +++ b/docs/sdk/valuation.md @@ -0,0 +1,53 @@ +# Actualized Positions and Valuation + +`HoldingAccount.get_actualized_position()` mirrors the contract's lazy settlement rules off chain: + +- reserved units become active after `IED` +- cumulative interest and principal indices are applied to the holder checkpoints +- the returned position is a preview only; it does not mutate chain state + +```python +holder = app.account(investor) +position = holder.get_actualized_position() +``` + +`get_valuation()` builds on top of that position and adds economic fields: + +- `principal_share` +- `claimable_interest` +- `claimable_principal` +- `accrued_interest_not_due` +- `economic_value_total` + +```python +valuation = holder.get_valuation() +``` + +## Trade Quotes + +`quote_trade(units=...)` is intended to support secondary-market pricing in the middle of an accrual period. + +The quote always returns: + +- the current principal share of the traded units +- accrued interest that is not yet due +- a par-reference clean value +- a par-reference dirty value + +If a clean quote is supplied, the SDK derives a market dirty value by adding accrued-not-due carry. + +```python +from decimal import Decimal +from src import TradeQuoteInput + +quote = holder.quote_trade( + 25, + clean_quote=TradeQuoteInput(clean_price_per_100=Decimal("99.25")), +) +``` + +Important behavior: + +- Quotes are rejected when a due ACTUS event is already pending at the requested timestamp. +- Existing `claimable_interest` and `claimable_principal` remain attached to the seller account and are reported as retained balances, not transferred unit value. +- `clean_price_per_100` requires a `PricingContext`, because `notional_unit_value` is SDK metadata and is not stored on chain. From 04b4185f54df072420aae0f4819243de41649c79 Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 21:06:25 +0100 Subject: [PATCH 210/244] chore: d-asa sdk export --- src/__init__.py | 62 ++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 56 insertions(+), 6 deletions(-) diff --git a/src/__init__.py b/src/__init__.py index 16584a3e..2147b502 100644 --- a/src/__init__.py +++ b/src/__init__.py @@ -1,5 +1,33 @@ -from .artifacts import dasa_client -from .contracts import ContractAttributes +# ruff: noqa: RUF022 + +from .contracts import ( + ContractAttributes, + make_pam_fixed_coupon_bond_profile, + make_pam_zero_coupon_bond, +) +from .dasa import ( + AccountManagerRole, + AccountValuation, + AddressRoles, + ArrangerRole, + AuthorityRole, + ClaimResult, + ContractState, + ContractView, + DAsa, + DAsaRole, + FundingResult, + HoldingAccount, + ObserverRole, + OpDaemonRole, + OtcDvpDraft, + PricingContext, + PrimaryDealerRole, + RoleValidityWindow, + TradeQuote, + TradeQuoteInput, + TrusteeRole, +) from .errors import ActusNormalizationError, UnsupportedActusFeatureError from .models import ( AccountPosition, @@ -13,18 +41,40 @@ from .normalization import normalize_contract_attributes from .schedule import Cycle -__all__ = [ +__all__ = ( + "AccountManagerRole", "AccountPosition", + "AccountValuation", "ActusNormalizationError", + "AddressRoles", + "ArrangerRole", + "AuthorityRole", + "ClaimResult", "ContractAttributes", + "ContractState", + "ContractView", "Cycle", + "DAsa", + "DAsaRole", "ExecutionScheduleEntry", + "FundingResult", + "HoldingAccount", "InitialKernelState", + "make_pam_fixed_coupon_bond_profile", + "make_pam_zero_coupon_bond", "NormalizationResult", + "normalize_contract_attributes", "NormalizedActusTerms", "ObservedCashEventRequest", "ObservedEventRequest", + "ObserverRole", + "OpDaemonRole", + "OtcDvpDraft", + "PricingContext", + "PrimaryDealerRole", + "RoleValidityWindow", + "TradeQuote", + "TradeQuoteInput", + "TrusteeRole", "UnsupportedActusFeatureError", - "dasa_client", - "normalize_contract_attributes", -] +) From b94341e321738515ec77fe013a152245814d8401 Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 21:06:52 +0100 Subject: [PATCH 211/244] chore: d-asa package --- poetry.lock | 59 ++++++++++++++++++++------------------------------ pyproject.toml | 15 +++++++++---- 2 files changed, 35 insertions(+), 39 deletions(-) diff --git a/poetry.lock b/poetry.lock index 96b9cd75..c8fcbb5a 100644 --- a/poetry.lock +++ b/poetry.lock @@ -199,17 +199,6 @@ httpx = ">=0.23.1,<=0.28.1" py-algorand-sdk = ">=2.11.0,<3.0.0" typing-extensions = ">=4.6.0" -[[package]] -name = "algorand-python" -version = "3.4.0" -description = "API for writing Algorand Python Smart contracts" -optional = false -python-versions = "<4,>=3.12.0" -groups = ["main"] -files = [ - {file = "algorand_python-3.4.0-py3-none-any.whl", hash = "sha256:5cede1c1b2bc7fae237fb3ba251f6a6a919d39de7b8de1f817973d45ced5bdf8"}, -] - [[package]] name = "anyio" version = "4.12.1" @@ -775,14 +764,14 @@ xml-validation = ["lxml (>=4,<7)"] [[package]] name = "cyclopts" -version = "4.8.0" +version = "4.9.0" description = "Intuitive, easy CLIs based on type hints." optional = false python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "cyclopts-4.8.0-py3-none-any.whl", hash = "sha256:ef353da05fec36587d4ebce7a6e4b27515d775d184a23bab4b01426f93ddc8d4"}, - {file = "cyclopts-4.8.0.tar.gz", hash = "sha256:92cc292d18d8be372e58d8bce1aa966d30f819a5fb3fee02bd2ad4a6bb403f29"}, + {file = "cyclopts-4.9.0-py3-none-any.whl", hash = "sha256:583ea4090a040c92f9303bc0da26bca7b681c81bcea34097ace279e1acef22c1"}, + {file = "cyclopts-4.9.0.tar.gz", hash = "sha256:f292868e4be33a3e622d8cf95d89f49222e987b1ccdbf40caf6514e19dd99a63"}, ] [package.dependencies] @@ -2231,7 +2220,7 @@ version = "1.2.2" description = "Read key-value pairs from a .env file and set them as environment variables" optional = false python-versions = ">=3.10" -groups = ["main"] +groups = ["dev"] files = [ {file = "python_dotenv-1.2.2-py3-none-any.whl", hash = "sha256:1d8214789a24de455a8b8bd8ae6fe3c6b69a5e3d64aa8a8e5d68e694bbcb285a"}, {file = "python_dotenv-1.2.2.tar.gz", hash = "sha256:2c371a91fbd7ba082c2c1dc1f8bf89ca22564a087c2c287cd9b662adde799cf3"}, @@ -2440,30 +2429,30 @@ docs = ["sphinx"] [[package]] name = "ruff" -version = "0.15.5" +version = "0.15.6" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" groups = ["dev"] files = [ - {file = "ruff-0.15.5-py3-none-linux_armv6l.whl", hash = "sha256:4ae44c42281f42e3b06b988e442d344a5b9b72450ff3c892e30d11b29a96a57c"}, - {file = "ruff-0.15.5-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6edd3792d408ebcf61adabc01822da687579a1a023f297618ac27a5b51ef0080"}, - {file = "ruff-0.15.5-py3-none-macosx_11_0_arm64.whl", hash = "sha256:89f463f7c8205a9f8dea9d658d59eff49db05f88f89cc3047fb1a02d9f344010"}, - {file = "ruff-0.15.5-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba786a8295c6574c1116704cf0b9e6563de3432ac888d8f83685654fe528fd65"}, - {file = "ruff-0.15.5-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fd4b801e57955fe9f02b31d20375ab3a5c4415f2e5105b79fb94cf2642c91440"}, - {file = "ruff-0.15.5-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:391f7c73388f3d8c11b794dbbc2959a5b5afe66642c142a6effa90b45f6f5204"}, - {file = "ruff-0.15.5-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8dc18f30302e379fe1e998548b0f5e9f4dff907f52f73ad6da419ea9c19d66c8"}, - {file = "ruff-0.15.5-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1cc6e7f90087e2d27f98dc34ed1b3ab7c8f0d273cc5431415454e22c0bd2a681"}, - {file = "ruff-0.15.5-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1cb7169f53c1ddb06e71a9aebd7e98fc0fea936b39afb36d8e86d36ecc2636a"}, - {file = "ruff-0.15.5-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:9b037924500a31ee17389b5c8c4d88874cc6ea8e42f12e9c61a3d754ff72f1ca"}, - {file = "ruff-0.15.5-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:65bb414e5b4eadd95a8c1e4804f6772bbe8995889f203a01f77ddf2d790929dd"}, - {file = "ruff-0.15.5-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:d20aa469ae3b57033519c559e9bc9cd9e782842e39be05b50e852c7c981fa01d"}, - {file = "ruff-0.15.5-py3-none-musllinux_1_2_i686.whl", hash = "sha256:15388dd28c9161cdb8eda68993533acc870aa4e646a0a277aa166de9ad5a8752"}, - {file = "ruff-0.15.5-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:b30da330cbd03bed0c21420b6b953158f60c74c54c5f4c1dabbdf3a57bf355d2"}, - {file = "ruff-0.15.5-py3-none-win32.whl", hash = "sha256:732e5ee1f98ba5b3679029989a06ca39a950cced52143a0ea82a2102cb592b74"}, - {file = "ruff-0.15.5-py3-none-win_amd64.whl", hash = "sha256:821d41c5fa9e19117616c35eaa3f4b75046ec76c65e7ae20a333e9a8696bc7fe"}, - {file = "ruff-0.15.5-py3-none-win_arm64.whl", hash = "sha256:b498d1c60d2fe5c10c45ec3f698901065772730b411f164ae270bb6bfcc4740b"}, - {file = "ruff-0.15.5.tar.gz", hash = "sha256:7c3601d3b6d76dce18c5c824fc8d06f4eef33d6df0c21ec7799510cde0f159a2"}, + {file = "ruff-0.15.6-py3-none-linux_armv6l.whl", hash = "sha256:7c98c3b16407b2cf3d0f2b80c80187384bc92c6774d85fefa913ecd941256fff"}, + {file = "ruff-0.15.6-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:ee7dcfaad8b282a284df4aa6ddc2741b3f4a18b0555d626805555a820ea181c3"}, + {file = "ruff-0.15.6-py3-none-macosx_11_0_arm64.whl", hash = "sha256:3bd9967851a25f038fc8b9ae88a7fbd1b609f30349231dffaa37b6804923c4bb"}, + {file = "ruff-0.15.6-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:13f4594b04e42cd24a41da653886b04d2ff87adbf57497ed4f728b0e8a4866f8"}, + {file = "ruff-0.15.6-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e2ed8aea2f3fe57886d3f00ea5b8aae5bf68d5e195f487f037a955ff9fbaac9e"}, + {file = "ruff-0.15.6-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:70789d3e7830b848b548aae96766431c0dc01a6c78c13381f423bf7076c66d15"}, + {file = "ruff-0.15.6-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:542aaf1de3154cea088ced5a819ce872611256ffe2498e750bbae5247a8114e9"}, + {file = "ruff-0.15.6-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c22e6f02c16cfac3888aa636e9eba857254d15bbacc9906c9689fdecb1953ab"}, + {file = "ruff-0.15.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98893c4c0aadc8e448cfa315bd0cc343a5323d740fe5f28ef8a3f9e21b381f7e"}, + {file = "ruff-0.15.6-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:70d263770d234912374493e8cc1e7385c5d49376e41dfa51c5c3453169dc581c"}, + {file = "ruff-0.15.6-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:55a1ad63c5a6e54b1f21b7514dfadc0c7fb40093fa22e95143cf3f64ebdcd512"}, + {file = "ruff-0.15.6-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:8dc473ba093c5ec238bb1e7429ee676dca24643c471e11fbaa8a857925b061c0"}, + {file = "ruff-0.15.6-py3-none-musllinux_1_2_i686.whl", hash = "sha256:85b042377c2a5561131767974617006f99f7e13c63c111b998f29fc1e58a4cfb"}, + {file = "ruff-0.15.6-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:cef49e30bc5a86a6a92098a7fbf6e467a234d90b63305d6f3ec01225a9d092e0"}, + {file = "ruff-0.15.6-py3-none-win32.whl", hash = "sha256:bbf67d39832404812a2d23020dda68fee7f18ce15654e96fb1d3ad21a5fe436c"}, + {file = "ruff-0.15.6-py3-none-win_amd64.whl", hash = "sha256:aee25bc84c2f1007ecb5037dff75cef00414fdf17c23f07dc13e577883dca406"}, + {file = "ruff-0.15.6-py3-none-win_arm64.whl", hash = "sha256:c34de3dd0b0ba203be50ae70f5910b17188556630e2178fd7d79fc030eb0d837"}, + {file = "ruff-0.15.6.tar.gz", hash = "sha256:8394c7bb153a4e3811a4ecdacd4a8e6a4fa8097028119160dffecdcdf9b56ae4"}, ] [[package]] @@ -2768,4 +2757,4 @@ propcache = ">=0.2.1" [metadata] lock-version = "2.1" python-versions = "^3.13" -content-hash = "d51f3d0769b70ac871bc51f05f8c6a44671d3daf26a5b30957df2822cfa7f50a" +content-hash = "2d31176094e75f81a76bcff40cb612c927658f9c4ead58bf000960576afb94f0" diff --git a/pyproject.toml b/pyproject.toml index 2f48a2d7..0007e3b6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,14 +1,22 @@ [tool.poetry] -package-mode = false name = "d-asa" version = "0.5.0" description = "Debt Algorand Standard Application" license = "AGPL-3.0" authors = ["cusma "] maintainers = ["cusma "] -readme = ["README.md", "docs/SUMMARY.md"] +readme = "README.md" documentation = "https://cusma.github.io/d-asa/" repository = "https://github.com/cusma/d-asa" +packages = [ + { include = "src" }, + { include = "smart_contracts" }, + { include = "modules" }, +] +include = [ + "src/artifacts/*.json", + "smart_contracts/artifacts/**/*", +] keywords = [ "algorand", "blockchain", @@ -21,8 +29,6 @@ keywords = [ [tool.poetry.dependencies] python = "^3.13" algokit-utils = "^4.2.3" -python-dotenv = "^1.2.2" -algorand-python = "^3.4.0" [tool.poetry.group.dev.dependencies] algokit-client-generator = "^2.2.0" @@ -37,6 +43,7 @@ pre-commit = "^4.5.1" puyapy = "^5.7.1" urllib3 = "^2.6.3" pip = "^26.0.1" +python-dotenv = "^1.2.2" [build-system] requires = ["poetry-core"] From 33a368bf31d91b1f764c7aedeae8b616a5cb48e8 Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 21:07:21 +0100 Subject: [PATCH 212/244] chore: bump project version --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 0007e3b6..c47138b4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "d-asa" -version = "0.5.0" +version = "0.20.0" description = "Debt Algorand Standard Application" license = "AGPL-3.0" authors = ["cusma "] From 8026626b3041221f9ddb47a90f20b6b2399a6531 Mon Sep 17 00:00:00 2001 From: Cosimo Bassi <65770425+cusma@users.noreply.github.com> Date: Fri, 13 Mar 2026 21:18:28 +0100 Subject: [PATCH 213/244] chore: fix local path Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- docs/sdk/overview.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/sdk/overview.md b/docs/sdk/overview.md index f9c44743..7bfa563d 100644 --- a/docs/sdk/overview.md +++ b/docs/sdk/overview.md @@ -2,7 +2,7 @@ The high-level Python API lives directly under `src` and is centered on `DAsa`. -It wraps the generated ARC-56 client in [`src.artifacts.dasa_client`](/Users/cosimo/Workspace/code/d-asa/src/artifacts/dasa_client.py) and keeps the generated ABI structs out of the normal user flow. +It wraps the generated ARC-56 client in [`src.artifacts.dasa_client`](../../src/artifacts/dasa_client.py) and keeps the generated ABI structs out of the normal user flow. ```python from src import ( From 299e6bb25a33aeff23888039b8b8b6774abc9a7b Mon Sep 17 00:00:00 2001 From: Cosimo Bassi <65770425+cusma@users.noreply.github.com> Date: Fri, 13 Mar 2026 21:19:23 +0100 Subject: [PATCH 214/244] chore: use static event type id Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- src/_dasa_mappers.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/_dasa_mappers.py b/src/_dasa_mappers.py index c5697bb6..2ab0b42e 100644 --- a/src/_dasa_mappers.py +++ b/src/_dasa_mappers.py @@ -30,6 +30,8 @@ ) from .registry import EVENT_TYPE_IDS +EVENT_TYPE_NAMES = {value: name for name, value in EVENT_TYPE_IDS.items()} + def to_client_terms(result: NormalizationResult) -> _ClientNormalizedActusTerms: return _ClientNormalizedActusTerms( @@ -132,12 +134,11 @@ def to_sdk_schedule_entry( next_outstanding_principal, flags, ) = entry - event_type_names = {value: name for name, value in EVENT_TYPE_IDS.items()} - if event_type not in event_type_names: + if event_type not in EVENT_TYPE_NAMES: raise ValueError(f"unsupported event type id: {event_type}") return ExecutionScheduleEntry( event_id=event_id, - event_type=event_type_names[event_type], + event_type=EVENT_TYPE_NAMES[event_type], scheduled_time=scheduled_time, accrual_factor=accrual_factor, redemption_accrual_factor=redemption_accrual_factor, From 2f5949f67a63f423b5989a6221d8354274685deb Mon Sep 17 00:00:00 2001 From: Cosimo Bassi <65770425+cusma@users.noreply.github.com> Date: Fri, 13 Mar 2026 21:21:25 +0100 Subject: [PATCH 215/244] chore: apply suggestions from code review Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- src/dasa.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/dasa.py b/src/dasa.py index 795ab74b..668f2f00 100644 --- a/src/dasa.py +++ b/src/dasa.py @@ -533,7 +533,10 @@ def get_address_roles( *, at_time: int | None = None, ) -> AddressRoles: - timestamp = at_time or _latest_timestamp(self._client) + if at_time is None: + timestamp = _latest_timestamp(self._client) + else: + timestamp = at_time arranger = self._client.state.global_state.arranger op_daemon = self._client.state.global_state.op_daemon From c6e0dec99a0085866557575653743af4cf03a97e Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 21:38:57 +0100 Subject: [PATCH 216/244] chore: apply code review suggestions --- src/dasa.py | 29 +++++++++++++++++------------ tests/sdk/test_dasa.py | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+), 12 deletions(-) diff --git a/src/dasa.py b/src/dasa.py index 795ab74b..c62f3e45 100644 --- a/src/dasa.py +++ b/src/dasa.py @@ -533,7 +533,7 @@ def get_address_roles( *, at_time: int | None = None, ) -> AddressRoles: - timestamp = at_time or _latest_timestamp(self._client) + timestamp = _latest_timestamp(self._client) if at_time is None else at_time arranger = self._client.state.global_state.arranger op_daemon = self._client.state.global_state.op_daemon @@ -889,9 +889,14 @@ def get_raw_position(self) -> AccountPosition: raise ValueError(f"unknown holding address: {self.holding_address}") return to_sdk_account_position(position) - def get_actualized_position(self, at_time: int | None = None) -> AccountPosition: - if at_time is not None: - self._resolve_quote_timestamp(at_time) + def get_actualized_position(self) -> AccountPosition: + return _actualize_position( + self.get_raw_position(), + state=self.contract.get_state(), + ) + + def _get_actualized_position_at_timestamp(self, timestamp: int) -> AccountPosition: + """Internal method that accepts a pre-resolved timestamp.""" return _actualize_position( self.get_raw_position(), state=self.contract.get_state(), @@ -899,8 +904,12 @@ def get_actualized_position(self, at_time: int | None = None) -> AccountPosition def get_valuation(self, at_time: int | None = None) -> AccountValuation: valuation_timestamp = self._resolve_quote_timestamp(at_time) + return self._get_valuation_at_timestamp(valuation_timestamp) + + def _get_valuation_at_timestamp(self, timestamp: int) -> AccountValuation: + """Internal method that accepts a pre-resolved timestamp to avoid redundant network calls.""" state = self.contract.get_state() - position = self.get_actualized_position(valuation_timestamp) + position = self._get_actualized_position_at_timestamp(timestamp) principal_share = _share_amount( state.outstanding_principal, units=position.units, @@ -910,10 +919,10 @@ def get_valuation(self, at_time: int | None = None) -> AccountValuation: accrued_interest_not_due = self._accrued_interest_not_due( state=state, units=position.units, - at_time=valuation_timestamp, + at_time=timestamp, ) return AccountValuation( - valuation_timestamp=valuation_timestamp, + valuation_timestamp=timestamp, position=position, principal_share=principal_share, claimable_interest=position.claimable_interest, @@ -947,7 +956,7 @@ def quote_trade( raise ValueError("cannot quote while a due ACTUS event is pending") self._assert_transfer_is_open(state=state, at_time=valuation_timestamp) - valuation = self.get_valuation(valuation_timestamp) + valuation = self._get_valuation_at_timestamp(valuation_timestamp) if units <= 0: raise ValueError("units must be greater than zero") if units > valuation.position.units: @@ -1318,10 +1327,6 @@ def deploy_configured( transfer_opening_date=transfer_opening_date, transfer_closure_date=transfer_closure_date, ) - app._pricing_context = PricingContext( - notional_unit_value=resolved.terms.notional_unit_value - ) - app.contract._pricing_context = app._pricing_context return app @classmethod diff --git a/tests/sdk/test_dasa.py b/tests/sdk/test_dasa.py index 02f40170..f2b3d857 100644 --- a/tests/sdk/test_dasa.py +++ b/tests/sdk/test_dasa.py @@ -505,3 +505,38 @@ def test_contract_view_role_helpers_resolve_active_roles() -> None: DAsaRole.ACCOUNT_MANAGER, "MANAGER", ) == RoleValidityWindow(0, 2**64 - 1) + + +def test_contract_view_get_address_roles_at_time_zero() -> None: + """Test that get_address_roles correctly uses timestamp 0 when at_time=0 is passed.""" + # Current timestamp is much later than 0 + current_timestamp = 1_700_000_000 + + client = FakeClient( + timestamp=current_timestamp, + global_state=_global_state(op_daemon="OP_DAEMON"), + role_maps={ + "account_manager": { + "MANAGER": SimpleNamespace( + # Role is only valid from timestamp 1000 onwards + role_validity_start=1000, + role_validity_end=2**64 - 1, + ) + } + }, + ) + + contract_view = DAsa.from_client(client).contract + + # When checking roles at current time, the role should be active (1000 < current_timestamp) + roles_now = contract_view.get_address_roles("MANAGER") + assert roles_now.account_manager is True + + # When checking roles at timestamp 0, the role should NOT be active (0 < 1000) + # This tests the edge case where at_time=0 should use 0, not fall back to current timestamp + roles_at_zero = contract_view.get_address_roles("MANAGER", at_time=0) + assert roles_at_zero.account_manager is False + + # When checking roles at timestamp 1000, the role should be active (exactly at start) + roles_at_start = contract_view.get_address_roles("MANAGER", at_time=1000) + assert roles_at_start.account_manager is True From 1f67bc487bb913df3bf091f91710df8a9c866eaf Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 21:51:05 +0100 Subject: [PATCH 217/244] chore: add missing algorand python dependency --- poetry.lock | 13 ++++++++++++- pyproject.toml | 1 + 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/poetry.lock b/poetry.lock index c8fcbb5a..f0477e75 100644 --- a/poetry.lock +++ b/poetry.lock @@ -199,6 +199,17 @@ httpx = ">=0.23.1,<=0.28.1" py-algorand-sdk = ">=2.11.0,<3.0.0" typing-extensions = ">=4.6.0" +[[package]] +name = "algorand-python" +version = "3.4.0" +description = "API for writing Algorand Python Smart contracts" +optional = false +python-versions = "<4,>=3.12.0" +groups = ["dev"] +files = [ + {file = "algorand_python-3.4.0-py3-none-any.whl", hash = "sha256:5cede1c1b2bc7fae237fb3ba251f6a6a919d39de7b8de1f817973d45ced5bdf8"}, +] + [[package]] name = "anyio" version = "4.12.1" @@ -2757,4 +2768,4 @@ propcache = ">=0.2.1" [metadata] lock-version = "2.1" python-versions = "^3.13" -content-hash = "2d31176094e75f81a76bcff40cb612c927658f9c4ead58bf000960576afb94f0" +content-hash = "64e77ae4b8ee9692346c426785643fd63da726d1f386b9cb2b7b5d7ce636760d" diff --git a/pyproject.toml b/pyproject.toml index c47138b4..d9b9f478 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -32,6 +32,7 @@ algokit-utils = "^4.2.3" [tool.poetry.group.dev.dependencies] algokit-client-generator = "^2.2.0" +algorand-python = "^3.4.0" black = { extras = ["d"], version = "^26.3.1" } ruff = "^0.15.5" mypy = "^1.19.1" From 503f302c67c697db8f0a2ea28ec9d98f0576b82b Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 21:52:20 +0100 Subject: [PATCH 218/244] chore: lint --- src/dasa.py | 31 ++++++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/src/dasa.py b/src/dasa.py index 668f2f00..6e73125c 100644 --- a/src/dasa.py +++ b/src/dasa.py @@ -18,6 +18,7 @@ from algosdk.atomic_transaction_composer import TransactionSigner from algosdk.constants import ZERO_ADDRESS from algosdk.transaction import Transaction +from algosdk.v2client.models import SimulateTraceConfig from smart_contracts import constants as cst from smart_contracts import enums @@ -39,6 +40,8 @@ AccountUpdatePaymentAddressArgs, AppendObservedCashEventArgs, ApplyNonCashEventArgs, + CashClaimResult, + CashFundingResult, ClaimDueCashflowsArgs, ContractConfigArgs, ContractCreateArgs, @@ -264,8 +267,26 @@ class OtcDvpDraft: def send(self, send_params: SendParams | None = None) -> object: return self.composer.send(send_params) - def simulate(self, **kwargs: object) -> object: - return self.composer.simulate(**kwargs) + def simulate( + self, + *, + allow_more_logs: bool | None = None, + allow_empty_signatures: bool | None = None, + allow_unnamed_resources: bool | None = None, + extra_opcode_budget: int | None = None, + exec_trace_config: SimulateTraceConfig | None = None, + simulation_round: int | None = None, + skip_signatures: bool | None = None, + ) -> object: + return self.composer.simulate( + allow_more_logs=allow_more_logs, + allow_empty_signatures=allow_empty_signatures, + allow_unnamed_resources=allow_unnamed_resources, + extra_opcode_budget=extra_opcode_budget, + exec_trace_config=exec_trace_config, + simulation_round=simulation_round, + skip_signatures=skip_signatures, + ) def _scaled_mul_div(multiplicand: int, multiplier: int, divisor: int) -> int: @@ -711,7 +732,7 @@ def fund_due_cashflows(self, *, max_event_count: int) -> FundingResult: result = self._client.send.fund_due_cashflows( FundDueCashflowsArgs(max_event_count=max_event_count) ) - funding = result.abi_return + funding = cast(CashFundingResult, result.abi_return) return FundingResult( funded_interest=funding.funded_interest, funded_principal=funding.funded_principal, @@ -859,7 +880,7 @@ def claim( params=CommonAppCallParams(max_fee=DEFAULT_CLAIM_FEE), send_params=SendParams(cover_app_call_inner_transaction_fees=True), ) - claim = result.abi_return + claim = cast(CashClaimResult, result.abi_return) return ClaimResult( interest_amount=claim.interest_amount, principal_amount=claim.principal_amount, @@ -1133,7 +1154,7 @@ def claim(self, *, payment_info: bytes | str = b"") -> ClaimResult: params=CommonAppCallParams(max_fee=DEFAULT_CLAIM_FEE), send_params=SendParams(cover_app_call_inner_transaction_fees=True), ) - claim = result.abi_return + claim = cast(CashClaimResult, result.abi_return) return ClaimResult( interest_amount=claim.interest_amount, principal_amount=claim.principal_amount, From 100858a8e04d1331ff2a1c424765f35a23ec230c Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 22:05:10 +0100 Subject: [PATCH 219/244] feat: d-asa avm client --- smart_contracts/__main__.py | 104 ++++- .../mock_rbac_module_avm_client.py | 108 +++++ src/artifacts/dasa_avm_client.py | 385 ++++++++++++++++++ 3 files changed, 587 insertions(+), 10 deletions(-) create mode 100644 smart_contracts/artifacts/mock_module_rbac/mock_rbac_module_avm_client.py create mode 100644 src/artifacts/dasa_avm_client.py diff --git a/smart_contracts/__main__.py b/smart_contracts/__main__.py index dffd24c7..ea56a6af 100644 --- a/smart_contracts/__main__.py +++ b/smart_contracts/__main__.py @@ -1,6 +1,7 @@ import dataclasses import importlib import logging +import re import subprocess import sys from collections.abc import Callable @@ -26,6 +27,7 @@ canonical_src_contract_name = "d_asa" canonical_src_app_spec_name = "DASA.arc56.json" canonical_src_client_name = "dasa_client.py" +canonical_src_avm_client_name = "dasa_avm_client.py" generated_artifacts_init = '"""Generated client artifacts."""\n' # ----------------------- Contract Configuration ----------------------- # @@ -79,17 +81,49 @@ def has_contract_file(directory: Path) -> bool: deployment_extension = "py" -def _get_output_path( - output_dir: Path, contract_name: str, deployment_extension: str +def _to_snake_case(name: str) -> str: + """Converts CamelCase or acronym-heavy names to snake_case.""" + if name.isupper(): + return name.lower() + + first_pass = re.sub(r"(.)([A-Z][a-z]+)", r"\1_\2", name) + second_pass = re.sub(r"([a-z0-9])([A-Z])", r"\1_\2", first_pass) + return second_pass.lower() + + +def _get_client_output_dir(output_dir: Path, contract_name: str) -> Path: + """Returns where generated clients should be written for a contract.""" + if contract_name == canonical_src_contract_name: + return src_artifact_path + return output_dir + + +def _get_typed_client_output_path( + target_dir: Path, + contract_name: str, + app_spec_contract_name: str, + deployment_extension: str, ) -> Path: """Constructs the output path for the generated client file.""" if contract_name == canonical_src_contract_name: - return src_artifact_path / canonical_src_client_name - return output_dir / Path( - "{contract_name}" - + ("_client" if deployment_extension == "py" else "Client") - + f".{deployment_extension}" + return target_dir / canonical_src_client_name + + base_name = ( + f"{_to_snake_case(app_spec_contract_name)}_client" + if deployment_extension == "py" + else f"{app_spec_contract_name}Client" ) + return target_dir / f"{base_name}.{deployment_extension}" + + +def _get_avm_client_output_path( + target_dir: Path, contract_name: str, app_spec_contract_name: str +) -> Path: + """Constructs the output path for the generated AVM client file.""" + if contract_name == canonical_src_contract_name: + return target_dir / canonical_src_avm_client_name + + return target_dir / f"{_to_snake_case(app_spec_contract_name)}_avm_client.py" def _get_app_spec_path(output_dir: Path, contract_name: str) -> Path | None: @@ -181,13 +215,20 @@ def build(output_dir: Path, contract_name: str, contract_path: Path) -> Path: "No '*.arc56.json' file found (likely a logic signature being compiled). Skipping client generation." ) else: + target_dir = _get_client_output_dir(output_dir, contract_name) + target_dir.mkdir(exist_ok=True, parents=True) + + # Generate Python App Clients (off-chain) for file_name in app_spec_file_names: client_file = file_name print(file_name) - client_output_path = _get_output_path( - output_dir, contract_name, deployment_extension + app_spec_contract_name = file_name.removesuffix(".arc56.json") + client_output_path = _get_typed_client_output_path( + target_dir, + contract_name, + app_spec_contract_name, + deployment_extension, ) - client_output_path.parent.mkdir(exist_ok=True, parents=True) generate_result = subprocess.run( [ "algokit", @@ -214,6 +255,49 @@ def build(output_dir: Path, contract_name: str, contract_path: Path) -> Path: raise Exception( f"Could not generate typed client:\n{generate_result.stdout}" ) + + # Generate Python AVM Clients (on-chain) + for file_name in app_spec_file_names: + app_spec_contract_name = file_name.removesuffix(".arc56.json") + logger.info(f"Generating AVM Client (on-chain) for {file_name}") + + puyapy_result = subprocess.run( + [ + "poetry", + "run", + "puyapy-clientgen", + str(output_dir / file_name), + "--out-dir", + str(target_dir), + ], + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + text=True, + ) + + if puyapy_result.stdout: + print(puyapy_result.stdout) + + if puyapy_result.returncode: + raise Exception( + f"Could not generate client with puyapy-clientgen:\n{puyapy_result.stdout}" + ) + + generated_file = target_dir / f"client_{app_spec_contract_name}.py" + desired_file = _get_avm_client_output_path( + target_dir, contract_name, app_spec_contract_name + ) + + if not generated_file.exists(): + raise FileNotFoundError( + f"Expected generated AVM client '{generated_file.name}' was not created by puyapy-clientgen" + ) + + if desired_file.exists(): + desired_file.unlink() + + generated_file.rename(desired_file) + logger.info(f"Renamed AVM client to {desired_file.name}") canonical_app_spec_path = _sync_src_artifacts(output_dir, contract_name) if client_file: return canonical_app_spec_path or output_dir / client_file diff --git a/smart_contracts/artifacts/mock_module_rbac/mock_rbac_module_avm_client.py b/smart_contracts/artifacts/mock_module_rbac/mock_rbac_module_avm_client.py new file mode 100644 index 00000000..e2b93855 --- /dev/null +++ b/smart_contracts/artifacts/mock_module_rbac/mock_rbac_module_avm_client.py @@ -0,0 +1,108 @@ +# This file is auto-generated, do not modify +# flake8: noqa +# fmt: off +import typing + +import algopy + +class RoleValidity(algopy.arc4.Struct): + role_validity_start: algopy.arc4.UIntN[typing.Literal[64]] + role_validity_end: algopy.arc4.UIntN[typing.Literal[64]] + +class MockRbacModule(algopy.arc4.ARC4Client, typing.Protocol): + """ + + RBAC Module for testing + + """ + @algopy.arc4.abimethod(allow_actions=['UpdateApplication']) + def contract_update( + self, + ) -> None: + """ + Update D-ASA application. + """ + + @algopy.arc4.abimethod + def rbac_rotate_arranger( + self, + new_arranger: algopy.arc4.Address, + ) -> algopy.arc4.UIntN[typing.Literal[64]]: + """ + Rotate the arranger address. + """ + + @algopy.arc4.abimethod + def rbac_set_op_daemon( + self, + address: algopy.arc4.Address, + ) -> algopy.arc4.UIntN[typing.Literal[64]]: + """ + Non-normative helper to set the operation daemon address. + """ + + @algopy.arc4.abimethod + def rbac_assign_role( + self, + role_id: algopy.arc4.UIntN[typing.Literal[8]], + role_address: algopy.arc4.Address, + validity: RoleValidity, + ) -> algopy.arc4.UIntN[typing.Literal[64]]: + """ + Assign a role to an address. + """ + + @algopy.arc4.abimethod + def rbac_revoke_role( + self, + role_id: algopy.arc4.UIntN[typing.Literal[8]], + role_address: algopy.arc4.Address, + ) -> algopy.arc4.UIntN[typing.Literal[64]]: + """ + Revoke a role from an address. + """ + + @algopy.arc4.abimethod + def rbac_contract_suspension( + self, + suspended: algopy.arc4.Bool, + ) -> algopy.arc4.UIntN[typing.Literal[64]]: + """ + Set the asset-wide suspension status. + """ + + @algopy.arc4.abimethod + def rbac_contract_default( + self, + defaulted: algopy.arc4.Bool, + ) -> algopy.arc4.UIntN[typing.Literal[64]]: + """ + Set D-ASA default status + """ + + @algopy.arc4.abimethod(readonly=True) + def rbac_get_arranger( + self, + ) -> algopy.arc4.Address: + """ + Get the arranger address. + """ + + @algopy.arc4.abimethod(readonly=True) + def rbac_get_address_roles( + self, + address: algopy.arc4.Address, + ) -> algopy.arc4.Tuple[algopy.arc4.Bool, algopy.arc4.Bool, algopy.arc4.Bool, algopy.arc4.Bool, algopy.arc4.Bool]: + """ + Non-normative helper to get the active roles assigned to an address. + """ + + @algopy.arc4.abimethod(readonly=True) + def rbac_get_role_validity( + self, + role_id: algopy.arc4.UIntN[typing.Literal[8]], + role_address: algopy.arc4.Address, + ) -> RoleValidity: + """ + Get the stored validity interval for a role assignment. + """ diff --git a/src/artifacts/dasa_avm_client.py b/src/artifacts/dasa_avm_client.py new file mode 100644 index 00000000..981c4a86 --- /dev/null +++ b/src/artifacts/dasa_avm_client.py @@ -0,0 +1,385 @@ +# This file is auto-generated, do not modify +# flake8: noqa +# fmt: off +import typing + +import algopy + +class CashFundingResult(algopy.arc4.Struct): + funded_interest: algopy.arc4.UIntN[typing.Literal[64]] + funded_principal: algopy.arc4.UIntN[typing.Literal[64]] + total_funded: algopy.arc4.UIntN[typing.Literal[64]] + processed_events: algopy.arc4.UIntN[typing.Literal[64]] + timestamp: algopy.arc4.UIntN[typing.Literal[64]] + +class CashClaimResult(algopy.arc4.Struct): + interest_amount: algopy.arc4.UIntN[typing.Literal[64]] + principal_amount: algopy.arc4.UIntN[typing.Literal[64]] + total_amount: algopy.arc4.UIntN[typing.Literal[64]] + timestamp: algopy.arc4.UIntN[typing.Literal[64]] + context: algopy.arc4.DynamicBytes + +class AccountPosition(algopy.arc4.Struct): + payment_address: algopy.arc4.Address + units: algopy.arc4.UIntN[typing.Literal[64]] + reserved_units: algopy.arc4.UIntN[typing.Literal[64]] + suspended: algopy.arc4.Bool + settled_cursor: algopy.arc4.UIntN[typing.Literal[64]] + interest_checkpoint: algopy.arc4.UIntN[typing.Literal[64]] + principal_checkpoint: algopy.arc4.UIntN[typing.Literal[64]] + claimable_interest: algopy.arc4.UIntN[typing.Literal[64]] + claimable_principal: algopy.arc4.UIntN[typing.Literal[64]] + +class NormalizedActusTerms(algopy.arc4.Struct): + contract_type: algopy.arc4.UIntN[typing.Literal[8]] + denomination_asset_id: algopy.arc4.UIntN[typing.Literal[64]] + settlement_asset_id: algopy.arc4.UIntN[typing.Literal[64]] + total_units: algopy.arc4.UIntN[typing.Literal[64]] + notional_principal: algopy.arc4.UIntN[typing.Literal[64]] + initial_exchange_amount: algopy.arc4.UIntN[typing.Literal[64]] + initial_exchange_date: algopy.arc4.UIntN[typing.Literal[64]] + maturity_date: algopy.arc4.UIntN[typing.Literal[64]] + day_count_convention: algopy.arc4.UIntN[typing.Literal[8]] + rate_reset_spread: algopy.arc4.UIntN[typing.Literal[64]] + rate_reset_multiplier: algopy.arc4.UIntN[typing.Literal[64]] + rate_reset_floor: algopy.arc4.UIntN[typing.Literal[64]] + rate_reset_cap: algopy.arc4.UIntN[typing.Literal[64]] + rate_reset_next: algopy.arc4.UIntN[typing.Literal[64]] + has_rate_reset_floor: algopy.arc4.Bool + has_rate_reset_cap: algopy.arc4.Bool + dynamic_principal_redemption: algopy.arc4.Bool + fixed_point_scale: algopy.arc4.UIntN[typing.Literal[64]] + +class InitialKernelState(algopy.arc4.Struct): + status_date: algopy.arc4.UIntN[typing.Literal[64]] + event_cursor: algopy.arc4.UIntN[typing.Literal[64]] + outstanding_principal: algopy.arc4.UIntN[typing.Literal[64]] + interest_calculation_base: algopy.arc4.UIntN[typing.Literal[64]] + nominal_interest_rate: algopy.arc4.UIntN[typing.Literal[64]] + accrued_interest: algopy.arc4.UIntN[typing.Literal[64]] + next_principal_redemption: algopy.arc4.UIntN[typing.Literal[64]] + cumulative_interest_index: algopy.arc4.UIntN[typing.Literal[64]] + cumulative_principal_index: algopy.arc4.UIntN[typing.Literal[64]] + +class Prospectus(algopy.arc4.Struct): + hash: algopy.arc4.StaticArray[algopy.arc4.Byte, typing.Literal[32]] + url: algopy.arc4.String + +class ObservedEventRequest(algopy.arc4.Struct): + event_id: algopy.arc4.UIntN[typing.Literal[64]] + event_type: algopy.arc4.UIntN[typing.Literal[8]] + scheduled_time: algopy.arc4.UIntN[typing.Literal[64]] + accrual_factor: algopy.arc4.UIntN[typing.Literal[64]] + redemption_accrual_factor: algopy.arc4.UIntN[typing.Literal[64]] + observed_rate: algopy.arc4.UIntN[typing.Literal[64]] + next_nominal_interest_rate: algopy.arc4.UIntN[typing.Literal[64]] + next_principal_redemption: algopy.arc4.UIntN[typing.Literal[64]] + next_outstanding_principal: algopy.arc4.UIntN[typing.Literal[64]] + flags: algopy.arc4.UIntN[typing.Literal[64]] + +class ObservedCashEventRequest(algopy.arc4.Struct): + event_id: algopy.arc4.UIntN[typing.Literal[64]] + event_type: algopy.arc4.UIntN[typing.Literal[8]] + scheduled_time: algopy.arc4.UIntN[typing.Literal[64]] + accrual_factor: algopy.arc4.UIntN[typing.Literal[64]] + redemption_accrual_factor: algopy.arc4.UIntN[typing.Literal[64]] + next_nominal_interest_rate: algopy.arc4.UIntN[typing.Literal[64]] + next_principal_redemption: algopy.arc4.UIntN[typing.Literal[64]] + next_outstanding_principal: algopy.arc4.UIntN[typing.Literal[64]] + flags: algopy.arc4.UIntN[typing.Literal[64]] + +class KernelState(algopy.arc4.Struct): + contract_type: algopy.arc4.UIntN[typing.Literal[8]] + status: algopy.arc4.UIntN[typing.Literal[64]] + total_units: algopy.arc4.UIntN[typing.Literal[64]] + reserved_units_total: algopy.arc4.UIntN[typing.Literal[64]] + initial_exchange_amount: algopy.arc4.UIntN[typing.Literal[64]] + event_cursor: algopy.arc4.UIntN[typing.Literal[64]] + schedule_entry_count: algopy.arc4.UIntN[typing.Literal[64]] + outstanding_principal: algopy.arc4.UIntN[typing.Literal[64]] + interest_calculation_base: algopy.arc4.UIntN[typing.Literal[64]] + nominal_interest_rate: algopy.arc4.UIntN[typing.Literal[64]] + accrued_interest: algopy.arc4.UIntN[typing.Literal[64]] + cumulative_interest_index: algopy.arc4.UIntN[typing.Literal[64]] + cumulative_principal_index: algopy.arc4.UIntN[typing.Literal[64]] + reserved_interest: algopy.arc4.UIntN[typing.Literal[64]] + reserved_principal: algopy.arc4.UIntN[typing.Literal[64]] + +class ExecutionScheduleEntry(algopy.arc4.Struct): + event_id: algopy.arc4.UIntN[typing.Literal[64]] + event_type: algopy.arc4.UIntN[typing.Literal[8]] + scheduled_time: algopy.arc4.UIntN[typing.Literal[64]] + accrual_factor: algopy.arc4.UIntN[typing.Literal[64]] + redemption_accrual_factor: algopy.arc4.UIntN[typing.Literal[64]] + next_nominal_interest_rate: algopy.arc4.UIntN[typing.Literal[64]] + next_principal_redemption: algopy.arc4.UIntN[typing.Literal[64]] + next_outstanding_principal: algopy.arc4.UIntN[typing.Literal[64]] + flags: algopy.arc4.UIntN[typing.Literal[64]] + +class RoleValidity(algopy.arc4.Struct): + role_validity_start: algopy.arc4.UIntN[typing.Literal[64]] + role_validity_end: algopy.arc4.UIntN[typing.Literal[64]] + +class DASA(algopy.arc4.ARC4Client, typing.Protocol): + """ + Debt Algorand Standard Application. + """ + @algopy.arc4.abimethod + def fund_due_cashflows( + self, + max_event_count: algopy.arc4.UIntN[typing.Literal[64]], + ) -> CashFundingResult: + """ + Reserve due ACTUS cash events into the escrow-style claim ledger. + """ + + @algopy.arc4.abimethod + def claim_due_cashflows( + self, + holding_address: algopy.arc4.Address, + payment_info: algopy.arc4.DynamicBytes, + ) -> CashClaimResult: + """ + Withdraw the holder's already funded ACTUS cash entitlements. + """ + + @algopy.arc4.abimethod + def transfer_set_schedule( + self, + open_date: algopy.arc4.UIntN[typing.Literal[64]], + closure_date: algopy.arc4.UIntN[typing.Literal[64]], + ) -> algopy.arc4.UIntN[typing.Literal[64]]: + """ + Configure the secondary-market transfer window. + """ + + @algopy.arc4.abimethod + def primary_distribution( + self, + holding_address: algopy.arc4.Address, + units: algopy.arc4.UIntN[typing.Literal[64]], + ) -> algopy.arc4.UIntN[typing.Literal[64]]: + """ + Reserve units for a holder before the initial exchange activates issuance. + """ + + @algopy.arc4.abimethod + def transfer( + self, + sender_holding_address: algopy.arc4.Address, + receiver_holding_address: algopy.arc4.Address, + units: algopy.arc4.UIntN[typing.Literal[64]], + ) -> algopy.arc4.UIntN[typing.Literal[64]]: + """ + Transfer active units after settling both counterparties to the current cursor. + Returns the number of units moved. The ACTUS kernel no longer persists a nominal per-unit value on-chain, so transfer results are unit-based. + """ + + @algopy.arc4.abimethod + def account_suspension( + self, + holding_address: algopy.arc4.Address, + suspended: algopy.arc4.Bool, + ) -> algopy.arc4.UIntN[typing.Literal[64]]: + """ + Set the suspension status of one account. + """ + + @algopy.arc4.abimethod + def account_open( + self, + holding_address: algopy.arc4.Address, + payment_address: algopy.arc4.Address, + ) -> algopy.arc4.UIntN[typing.Literal[64]]: + """ + Open a contract account with a new position and register its payment address. + """ + + @algopy.arc4.abimethod + def account_update_payment_address( + self, + holding_address: algopy.arc4.Address, + payment_address: algopy.arc4.Address, + ) -> algopy.arc4.UIntN[typing.Literal[64]]: + """ + Update the payment address of an account. + """ + + @algopy.arc4.abimethod(readonly=True) + def account_get_position( + self, + holding_address: algopy.arc4.Address, + ) -> AccountPosition: + """ + Get the full accounting position for one holder. + """ + + @algopy.arc4.abimethod(create='require') + def contract_create( + self, + arranger: algopy.arc4.Address, + ) -> algopy.arc4.UIntN[typing.Literal[64]]: + """ + Create a new D-ASA contract and set the arranger role. + """ + + @algopy.arc4.abimethod + def contract_config( + self, + terms: NormalizedActusTerms, + initial_state: InitialKernelState, + prospectus: Prospectus, + ) -> algopy.arc4.UIntN[typing.Literal[64]]: + """ + Partial contract configuration with: normalized ACTUS terms, initial kernel + state (pre-IED), prospectus (informational only). The contract stays inactive until all schedule pages are configured next. + """ + + @algopy.arc4.abimethod + def contract_schedule( + self, + schedule_page_index: algopy.arc4.UIntN[typing.Literal[64]], + is_last_page: algopy.arc4.Bool, + schedule_page: algopy.arc4.DynamicArray[algopy.arc4.Tuple[algopy.arc4.UIntN[typing.Literal[64]], algopy.arc4.UIntN[typing.Literal[8]], algopy.arc4.UIntN[typing.Literal[64]], algopy.arc4.UIntN[typing.Literal[64]], algopy.arc4.UIntN[typing.Literal[64]], algopy.arc4.UIntN[typing.Literal[64]], algopy.arc4.UIntN[typing.Literal[64]], algopy.arc4.UIntN[typing.Literal[64]], algopy.arc4.UIntN[typing.Literal[64]]]], + ) -> algopy.arc4.UIntN[typing.Literal[64]]: + """ + Upload one normalized schedule page. + The configuration operation is considered complete only when the last page is stored. At that point `schedule_entry_count` is finalized and the contract moves to `STATUS_PENDING_IED`. + """ + + @algopy.arc4.abimethod + def contract_execute_ied( + self, + ) -> algopy.arc4.UIntN[typing.Literal[64]]: + """ + Execute the first due `IED` entry and activate the contract. + `IED` is the one non-cash event that moves the app from `STATUS_PENDING_IED` to `STATUS_ACTIVE`. + """ + + @algopy.arc4.abimethod + def apply_non_cash_event( + self, + event_id: algopy.arc4.UIntN[typing.Literal[64]], + payload: ObservedEventRequest, + ) -> algopy.arc4.UIntN[typing.Literal[64]]: + """ + Apply the next due non-cash event, optionally appending one first. + Observed payloads are appended before execution when flagged. Rate reset events require the interest oracle because they can change the running nominal rate; other non-cash events stay arranger-controlled. + """ + + @algopy.arc4.abimethod + def append_observed_cash_event( + self, + payload: ObservedCashEventRequest, + ) -> algopy.arc4.UIntN[typing.Literal[64]]: + """ + Append an arranger-authorized observed cash event to the schedule tail. + """ + + @algopy.arc4.abimethod(readonly=True) + def contract_get_state( + self, + ) -> KernelState: + """ + Return a readonly snapshot of the generic ACTUS kernel state. + """ + + @algopy.arc4.abimethod(readonly=True) + def contract_get_next_due_event( + self, + ) -> ExecutionScheduleEntry: + """ + Return the next boxed schedule entry, or a zeroed sentinel if ended. + """ + + @algopy.arc4.abimethod(allow_actions=['UpdateApplication']) + def contract_update( + self, + ) -> None: + """ + Update D-ASA application. + """ + + @algopy.arc4.abimethod + def rbac_rotate_arranger( + self, + new_arranger: algopy.arc4.Address, + ) -> algopy.arc4.UIntN[typing.Literal[64]]: + """ + Rotate the arranger address. + """ + + @algopy.arc4.abimethod + def rbac_set_op_daemon( + self, + address: algopy.arc4.Address, + ) -> algopy.arc4.UIntN[typing.Literal[64]]: + """ + Non-normative helper to set the operation daemon address. + """ + + @algopy.arc4.abimethod + def rbac_assign_role( + self, + role_id: algopy.arc4.UIntN[typing.Literal[8]], + role_address: algopy.arc4.Address, + validity: RoleValidity, + ) -> algopy.arc4.UIntN[typing.Literal[64]]: + """ + Assign a role to an address. + """ + + @algopy.arc4.abimethod + def rbac_revoke_role( + self, + role_id: algopy.arc4.UIntN[typing.Literal[8]], + role_address: algopy.arc4.Address, + ) -> algopy.arc4.UIntN[typing.Literal[64]]: + """ + Revoke a role from an address. + """ + + @algopy.arc4.abimethod + def rbac_contract_suspension( + self, + suspended: algopy.arc4.Bool, + ) -> algopy.arc4.UIntN[typing.Literal[64]]: + """ + Set the asset-wide suspension status. + """ + + @algopy.arc4.abimethod + def rbac_contract_default( + self, + defaulted: algopy.arc4.Bool, + ) -> algopy.arc4.UIntN[typing.Literal[64]]: + """ + Set D-ASA default status + """ + + @algopy.arc4.abimethod(readonly=True) + def rbac_get_arranger( + self, + ) -> algopy.arc4.Address: + """ + Get the arranger address. + """ + + @algopy.arc4.abimethod(readonly=True) + def rbac_get_address_roles( + self, + address: algopy.arc4.Address, + ) -> algopy.arc4.Tuple[algopy.arc4.Bool, algopy.arc4.Bool, algopy.arc4.Bool, algopy.arc4.Bool, algopy.arc4.Bool]: + """ + Non-normative helper to get the active roles assigned to an address. + """ + + @algopy.arc4.abimethod(readonly=True) + def rbac_get_role_validity( + self, + role_id: algopy.arc4.UIntN[typing.Literal[8]], + role_address: algopy.arc4.Address, + ) -> RoleValidity: + """ + Get the stored validity interval for a role assignment. + """ From 86a0cb0e71010afc0a993ddbc75603fcfce82419 Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 22:05:18 +0100 Subject: [PATCH 220/244] docs: d-asa avm client --- README.md | 9 +++++++-- docs/implementation/reference-implementation.md | 1 + 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 3b3f9012..08a297d4 100644 --- a/README.md +++ b/README.md @@ -10,9 +10,14 @@ flowchart LR ABI --> EXEC["AVM Execution"] ``` -The canonical ABI artifact is: +The canonical generated artifacts are: -- `src/artifacts/DASA.arc56.json` +- `src/artifacts/DASA.arc56.json`: D-ASA AppSpec, generates clients and can be used +on [Lora App Lab](https://lora.algokit.io/localnet/app-lab/create); + +- `src/artifacts/dasa_client.py`: D-ASA client, expanded by the SDK; + +- `src/artifacts/dasa_avm_client.py`: D-ASA AVM client, for on-chain App-2-App calls. Documentation: diff --git a/docs/implementation/reference-implementation.md b/docs/implementation/reference-implementation.md index deb22a8e..5d59acb2 100644 --- a/docs/implementation/reference-implementation.md +++ b/docs/implementation/reference-implementation.md @@ -21,6 +21,7 @@ The canonical artifacts are: - `src/artifacts/DASA.arc56.json` - `src/artifacts/dasa_client.py` +- `src/artifacts/dasa_avm_client.py` The deployment helpers in `smart_contracts/d_asa/deploy_config.py` provide code-accurate demo normalization flows for: From b1be896b3dd47eefb5716c55e5c8d35077d842a8 Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 22:05:24 +0100 Subject: [PATCH 221/244] test: d-asa avm client --- tests/sdk/test_dasa.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/sdk/test_dasa.py b/tests/sdk/test_dasa.py index f2b3d857..4502f4eb 100644 --- a/tests/sdk/test_dasa.py +++ b/tests/sdk/test_dasa.py @@ -237,6 +237,7 @@ def test_root_exports_include_high_level_surface() -> None: assert src.make_pam_zero_coupon_bond is make_pam_zero_coupon_bond assert src.normalize_contract_attributes is normalize_contract_attributes assert not hasattr(src, "dasa_client") + assert not hasattr(src, "dasa_avm_client") def test_actualized_position_activates_reserved_units_and_settles_indices() -> None: From f7aa05038452fd6d547fbd5a63a95995988be0a1 Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 22:10:08 +0100 Subject: [PATCH 222/244] docs: jupyter notebooks --- README.md | 8 + examples/README.md | 51 ++++ examples/_support.py | 211 +++++++++++++ examples/pam_fixed_coupon_bond.ipynb | 423 +++++++++++++++++++++++++++ examples/pam_zero_coupon_bond.ipynb | 390 ++++++++++++++++++++++++ 5 files changed, 1083 insertions(+) create mode 100644 examples/README.md create mode 100644 examples/_support.py create mode 100644 examples/pam_fixed_coupon_bond.ipynb create mode 100644 examples/pam_zero_coupon_bond.ipynb diff --git a/README.md b/README.md index 08a297d4..25616af3 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,8 @@ Documentation: High-level client docs: `docs/sdk/overview.md` +Interactive notebook examples: [`examples/README.md`](./examples/README.md) + [![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/cusma/d-asa) ## Demo in One Command @@ -130,6 +132,12 @@ Serve docs locally with live reload: make docs-serve ``` +Open the live LocalNet notebooks: + +```shell +poetry run jupyter lab examples/ +``` + ## Contributing Contributor setup and workflow guidance live in [CONTRIBUTING.md](./CONTRIBUTING.md). diff --git a/examples/README.md b/examples/README.md new file mode 100644 index 00000000..fa2f7a75 --- /dev/null +++ b/examples/README.md @@ -0,0 +1,51 @@ +# Notebook Examples + +This folder contains two live LocalNet walkthroughs: + +- `pam_fixed_coupon_bond.ipynb` +- `pam_zero_coupon_bond.ipynb` + +They are intended to be run from the repository root and rerun from top to bottom +against a fresh AlgoKit LocalNet. + +## Setup + +Bootstrap the full development environment: + +```shell +make install-dev +``` + +If you prefer the raw AlgoKit command, the equivalent bootstrap is: + +```shell +algokit bootstrap all +``` + +Start LocalNet: + +```shell +make localnet +``` + +or: + +```shell +algokit localnet start +``` + +Launch Jupyter from the repository root: + +```shell +poetry run jupyter lab +``` + +Then open one of the notebooks in `examples/`. + +## Notes + +- The notebooks perform real deployment and execution against LocalNet. +- Both notebooks assume the kernel is started from this repository checkout. +- If a prior run leaves LocalNet in an unexpected state, restart it and rerun the + notebook from the first cell. +- The notebooks are committed without outputs so each run shows fresh LocalNet data. diff --git a/examples/_support.py b/examples/_support.py new file mode 100644 index 00000000..9eb4c427 --- /dev/null +++ b/examples/_support.py @@ -0,0 +1,211 @@ +from __future__ import annotations + +from collections.abc import Mapping, Sequence +from datetime import UTC, datetime +from decimal import Decimal +from typing import Any + +from algokit_utils import ( + AlgoAmount, + AlgorandClient, + AssetCreateParams, + AssetOptInParams, + SigningAccount, +) + +from src import NormalizationResult +from src.localnet import ( + Currency, + algorand_client_from_localnet, + load_localnet_config, + wait_for_localnet, +) + +DEFAULT_CURRENCY_NAME = "Euro" +DEFAULT_CURRENCY_UNIT = "EUR" +DEFAULT_CURRENCY_DECIMALS = 2 +DEFAULT_CURRENCY_TOTAL_UNITS = 10_000_000 + + +def connect_localnet(*, timeout_seconds: float = 30.0) -> AlgorandClient: + localnet_config = load_localnet_config(default_host="localhost") + wait_for_localnet( + localnet_config=localnet_config, + timeout_seconds=timeout_seconds, + poll_interval_seconds=1.0, + ) + return algorand_client_from_localnet(localnet_config) + + +def create_funded_account( + algorand: AlgorandClient, + *, + min_algo: int = 20, +) -> SigningAccount: + account = algorand.account.random() + algorand.account.ensure_funded_from_environment( + account_to_fund=account.address, + min_spending_balance=AlgoAmount.from_algo(min_algo), + ) + return account + + +def create_currency( + algorand: AlgorandClient, + *, + issuer: SigningAccount, + asset_name: str = DEFAULT_CURRENCY_NAME, + unit_name: str = DEFAULT_CURRENCY_UNIT, + decimals: int = DEFAULT_CURRENCY_DECIMALS, + total_units: int = DEFAULT_CURRENCY_TOTAL_UNITS, +) -> Currency: + total = total_units * (10**decimals) + currency_id = algorand.send.asset_create( + AssetCreateParams( + sender=issuer.address, + signer=issuer.signer, + total=total, + decimals=decimals, + asset_name=asset_name, + unit_name=unit_name, + ) + ).asset_id + return Currency( + id=currency_id, + total=total, + decimals=decimals, + name=asset_name, + unit_name=unit_name, + asa_to_unit=1 / (10**decimals), + ) + + +def opt_in_asset( + algorand: AlgorandClient, + *, + account: SigningAccount, + asset_id: int, +) -> None: + algorand.send.asset_opt_in( + AssetOptInParams( + asset_id=asset_id, + sender=account.address, + signer=account.signer, + ) + ) + + +def format_asset_amount( + amount: int, + *, + decimals: int, + unit_name: str | None = None, +) -> str: + quantizer = Decimal(1).scaleb(-decimals) + scaled = (Decimal(amount) / (Decimal(10) ** decimals)).quantize(quantizer) + if unit_name is None: + return f"{scaled:,.{decimals}f}" + return f"{scaled:,.{decimals}f} {unit_name}" + + +def format_timestamp(timestamp: int) -> str: + return datetime.fromtimestamp(timestamp, tz=UTC).strftime("%Y-%m-%d %H:%M:%SZ") + + +def format_rate(value: int, *, fixed_point_scale: int) -> str: + rate_percent = Decimal(value) * Decimal(100) / Decimal(fixed_point_scale) + return f"{rate_percent:.4f}%" + + +def schedule_rows( + normalized: NormalizationResult, + *, + currency_decimals: int, +) -> list[dict[str, str | int]]: + rows: list[dict[str, str | int]] = [] + for entry in normalized.schedule: + rows.append( + { + "event_id": entry.event_id, + "event_type": entry.event_type, + "scheduled_time": format_timestamp(entry.scheduled_time), + "accrual_factor": f"{Decimal(entry.accrual_factor) / Decimal(normalized.terms.fixed_point_scale):.6f}", + "next_outstanding_principal": format_asset_amount( + entry.next_outstanding_principal, + decimals=currency_decimals, + ), + "next_nominal_interest_rate": ( + format_rate( + entry.next_nominal_interest_rate, + fixed_point_scale=normalized.terms.fixed_point_scale, + ) + if entry.next_nominal_interest_rate + else "-" + ), + } + ) + return rows + + +def cashflow_rows( + cashflows: Sequence[Mapping[str, Any]], + *, + currency: Currency, +) -> list[dict[str, str | int]]: + rows: list[dict[str, str | int]] = [] + for cashflow in cashflows: + rows.append( + { + "event_id": int(cashflow["event_id"]), + "event_type": str(cashflow["event_type"]), + "scheduled_time": format_timestamp(int(cashflow["scheduled_time"])), + "funded": format_asset_amount( + int(cashflow["funded"]), + decimals=currency.decimals, + unit_name=currency.unit_name, + ), + "interest_claimed": format_asset_amount( + int(cashflow["interest_claimed"]), + decimals=currency.decimals, + unit_name=currency.unit_name, + ), + "principal_claimed": format_asset_amount( + int(cashflow["principal_claimed"]), + decimals=currency.decimals, + unit_name=currency.unit_name, + ), + "total_claimed": format_asset_amount( + int(cashflow["total_claimed"]), + decimals=currency.decimals, + unit_name=currency.unit_name, + ), + "claim_timestamp": format_timestamp(int(cashflow["claim_timestamp"])), + } + ) + return rows + + +def render_table(rows: Sequence[Mapping[str, object]]) -> str: + if not rows: + return "(no rows)" + + headers = list(rows[0].keys()) + widths = [len(header) for header in headers] + rendered_rows: list[list[str]] = [] + for row in rows: + rendered = [str(row[header]) for header in headers] + rendered_rows.append(rendered) + widths = [ + max(current_width, len(value)) + for current_width, value in zip(widths, rendered, strict=True) + ] + + header_line = " | ".join( + header.ljust(width) for header, width in zip(headers, widths, strict=True) + ) + divider_line = "-+-".join("-" * width for width in widths) + row_lines = [ + " | ".join(value.ljust(width) for value, width in zip(row, widths, strict=True)) + for row in rendered_rows + ] + return "\n".join([header_line, divider_line, *row_lines]) diff --git a/examples/pam_fixed_coupon_bond.ipynb b/examples/pam_fixed_coupon_bond.ipynb new file mode 100644 index 00000000..eaeaa951 --- /dev/null +++ b/examples/pam_fixed_coupon_bond.ipynb @@ -0,0 +1,423 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "7fb27b941602401d91542211134fc71a", + "metadata": {}, + "source": [ + "# PAM Fixed Coupon Bond on LocalNet\n", + "\n", + "This notebook runs a live PAM fixed coupon bond lifecycle on AlgoKit LocalNet.\n", + "\n", + "It covers both:\n", + "- the high-level SDK flow to build ACTUS terms, normalize them, and deploy `DAsa`\n", + "- the live execution flow through `IED`, coupon funding, holder claims, and maturity\n" + ] + }, + { + "cell_type": "markdown", + "id": "acae54e37e7d407bbb7b55eff062a284", + "metadata": {}, + "source": [ + "## Prerequisites\n", + "\n", + "- run `make install-dev` once\n", + "- start LocalNet with `make localnet` or `algokit localnet start`\n", + "- rerun the notebook from the first cell on a fresh LocalNet when repeating the demo\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9a63283cbaf04dbcab1f6479b197f3a8", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import sys\n", + "from pathlib import Path\n", + "\n", + "REPO_ROOT = next(\n", + " path for path in [Path.cwd(), *Path.cwd().parents] if (path / \"pyproject.toml\").exists()\n", + ")\n", + "os.chdir(REPO_ROOT)\n", + "if str(REPO_ROOT) not in sys.path:\n", + " sys.path.insert(0, str(REPO_ROOT))\n", + "\n", + "print(f\"Repository root: {REPO_ROOT}\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8dd0d8092fe74a7c96281538738b07e2", + "metadata": {}, + "outputs": [], + "source": [ + "from algokit_utils import AssetTransferParams, CommonAppCallParams\n", + "\n", + "from examples._support import (\n", + " cashflow_rows,\n", + " connect_localnet,\n", + " create_currency,\n", + " create_funded_account,\n", + " format_asset_amount,\n", + " opt_in_asset,\n", + " render_table,\n", + " schedule_rows,\n", + ")\n", + "from smart_contracts import constants as cst\n", + "from smart_contracts import enums\n", + "from src import (\n", + " DAsa,\n", + " DAsaRole,\n", + " NormalizationResult,\n", + " make_pam_fixed_coupon_bond_profile,\n", + " normalize_contract_attributes,\n", + ")\n", + "from src.artifacts.dasa_client import PrimaryDistributionArgs\n", + "from src.localnet import get_latest_timestamp, time_warp\n", + "from src.schedule import Cycle\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "72eea5119410473aa328ad9291626812", + "metadata": {}, + "outputs": [], + "source": [ + "PRINCIPAL = 10_000\n", + "MINIMUM_DENOMINATION = 100\n", + "NOMINAL_RATE = 0.02\n", + "ISSUANCE_DELAY = Cycle.parse_cycle(\"30D\")\n", + "COUPON_CYCLE = Cycle.parse_cycle(\"90D\")\n", + "MATURITY_OFFSET = Cycle.parse_cycle(\"1800D\")\n", + "\n", + "\n", + "def day_cycle_seconds(cycle: Cycle) -> int:\n", + " if cycle.unit != \"D\":\n", + " raise ValueError(f\"Only fixed day cycles are used in this notebook, got {cycle}\")\n", + " return cycle.count * cst.DAY_2_SEC\n", + "\n", + "\n", + "def derive_total_interest_amount(normalized: NormalizationResult) -> int:\n", + " outstanding_principal = normalized.schedule[0].next_outstanding_principal\n", + " nominal_interest_rate = (\n", + " normalized.schedule[0].next_nominal_interest_rate or normalized.terms.rate_reset_next\n", + " )\n", + " accrued_interest = 0\n", + " total_interest = 0\n", + "\n", + " for entry in normalized.schedule[1:]:\n", + " interest_segment = (\n", + " outstanding_principal\n", + " * nominal_interest_rate\n", + " // normalized.terms.fixed_point_scale\n", + " * entry.accrual_factor\n", + " // normalized.terms.fixed_point_scale\n", + " )\n", + "\n", + " if entry.event_type in {\"IP\", \"MD\"}:\n", + " total_interest += accrued_interest + interest_segment\n", + " accrued_interest = 0\n", + " elif entry.event_type == \"PR\":\n", + " accrued_interest += interest_segment\n", + "\n", + " if entry.event_type in {\"PR\", \"MD\"}:\n", + " outstanding_principal = entry.next_outstanding_principal\n", + "\n", + " if entry.next_nominal_interest_rate:\n", + " nominal_interest_rate = entry.next_nominal_interest_rate\n", + "\n", + " return total_interest\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8edb47106e1a46a883d545849b8ab81b", + "metadata": {}, + "outputs": [], + "source": [ + "algorand = connect_localnet()\n", + "arranger = create_funded_account(algorand, min_algo=50)\n", + "bank = create_funded_account(algorand, min_algo=50)\n", + "account_manager = create_funded_account(algorand)\n", + "primary_dealer = create_funded_account(algorand)\n", + "investor = create_funded_account(algorand)\n", + "\n", + "currency = create_currency(algorand, issuer=bank)\n", + "opt_in_asset(algorand, account=investor, asset_id=currency.id)\n", + "\n", + "print(f\"Currency ASA id: {currency.id}\")\n", + "print(f\"Arranger: {arranger.address}\")\n", + "print(f\"Bank: {bank.address}\")\n", + "print(f\"Investor: {investor.address}\")\n", + "print(f\"Account manager: {account_manager.address}\")\n", + "print(f\"Primary dealer: {primary_dealer.address}\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "10185d26023b46108eb7d9f57d49d2b3", + "metadata": {}, + "outputs": [], + "source": [ + "current_ts = get_latest_timestamp(algorand.client.algod)\n", + "issuance_date = current_ts + day_cycle_seconds(ISSUANCE_DELAY)\n", + "coupon_period = day_cycle_seconds(COUPON_CYCLE)\n", + "maturity_offset = day_cycle_seconds(MATURITY_OFFSET)\n", + "first_coupon_date = issuance_date + coupon_period\n", + "maturity_date = issuance_date + maturity_offset\n", + "\n", + "attrs = make_pam_fixed_coupon_bond_profile(\n", + " contract_id=1,\n", + " status_date=current_ts,\n", + " initial_exchange_date=issuance_date,\n", + " maturity_date=maturity_date,\n", + " notional_principal=PRINCIPAL,\n", + " nominal_interest_rate=NOMINAL_RATE,\n", + " interest_payment_cycle=COUPON_CYCLE,\n", + " interest_payment_anchor=first_coupon_date,\n", + ")\n", + "normalized = normalize_contract_attributes(\n", + " attrs,\n", + " denomination_asset_id=currency.id,\n", + " denomination_asset_decimals=currency.decimals,\n", + " notional_unit_value=MINIMUM_DENOMINATION,\n", + " secondary_market_opening_date=issuance_date,\n", + " secondary_market_closure_date=maturity_date + cst.DAY_2_SEC,\n", + ")\n", + "total_interest_amount = derive_total_interest_amount(normalized)\n", + "expected_event_types = [\"IED\"] + [\"IP\"] * (maturity_offset // coupon_period) + [\"MD\"]\n", + "assert [entry.event_type for entry in normalized.schedule] == expected_event_types\n", + "\n", + "issue_price_label = format_asset_amount(\n", + " normalized.terms.initial_exchange_amount,\n", + " decimals=currency.decimals,\n", + " unit_name=currency.unit_name,\n", + ")\n", + "interest_reserve_label = format_asset_amount(\n", + " total_interest_amount,\n", + " decimals=currency.decimals,\n", + " unit_name=currency.unit_name,\n", + ")\n", + "print(f\"Issue price: {issue_price_label}\")\n", + "print(f\"Expected interest reserve: {interest_reserve_label}\")\n", + "print(render_table(schedule_rows(normalized, currency_decimals=currency.decimals)))\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8763a12b2bbd4a93a75aff182afb95dc", + "metadata": {}, + "outputs": [], + "source": [ + "app = DAsa.deploy_configured(\n", + " algorand=algorand,\n", + " arranger=arranger,\n", + " normalized=normalized,\n", + " prospectus_url=\"Notebook example: PAM fixed coupon bond\",\n", + ")\n", + "arranger_role = app.arranger(arranger)\n", + "arranger_role.assign_role(DAsaRole.ACCOUNT_MANAGER, account_manager.address)\n", + "arranger_role.assign_role(DAsaRole.PRIMARY_DEALER, primary_dealer.address)\n", + "\n", + "app.account_manager(account_manager).open_account(\n", + " holding_address=investor.address,\n", + " payment_address=investor.address,\n", + ")\n", + "\n", + "state_after_config = app.contract.get_state()\n", + "assert state_after_config.status == enums.STATUS_PENDING_IED\n", + "print(state_after_config)\n" + ] + }, + { + "cell_type": "markdown", + "id": "7623eae2785240b9bd12b16a66d81610", + "metadata": {}, + "source": [ + "## Primary Distribution\n", + "\n", + "The next cell uses `app.raw_client.new_group()` so the investor payment and the\n", + "`primary_distribution` app call stay atomic. That grouped flow is not yet wrapped\n", + "by a higher-level SDK helper.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7cdc8c89c7104fffa095e18ddfef8986", + "metadata": {}, + "outputs": [], + "source": [ + "if total_interest_amount > 0:\n", + " algorand.send.asset_transfer(\n", + " AssetTransferParams(\n", + " asset_id=currency.id,\n", + " amount=total_interest_amount,\n", + " receiver=app.app_address,\n", + " sender=bank.address,\n", + " signer=bank.signer,\n", + " )\n", + " )\n", + "\n", + "algorand.send.asset_transfer(\n", + " AssetTransferParams(\n", + " asset_id=currency.id,\n", + " amount=normalized.terms.initial_exchange_amount,\n", + " receiver=investor.address,\n", + " sender=bank.address,\n", + " signer=bank.signer,\n", + " )\n", + ")\n", + "\n", + "investor_purchase_txn = algorand.create_transaction.asset_transfer(\n", + " AssetTransferParams(\n", + " asset_id=currency.id,\n", + " amount=normalized.terms.initial_exchange_amount,\n", + " receiver=app.app_address,\n", + " sender=investor.address,\n", + " signer=investor.signer,\n", + " )\n", + ")\n", + "(\n", + " app.raw_client.new_group()\n", + " .add_transaction(investor_purchase_txn, investor.signer)\n", + " .primary_distribution(\n", + " PrimaryDistributionArgs(\n", + " holding_address=investor.address,\n", + " units=normalized.terms.total_units,\n", + " ),\n", + " params=CommonAppCallParams(\n", + " sender=primary_dealer.address,\n", + " signer=primary_dealer.signer,\n", + " ),\n", + " )\n", + " .send()\n", + ")\n", + "\n", + "raw_position = app.account(investor).get_raw_position()\n", + "assert raw_position.reserved_units == normalized.terms.total_units\n", + "print(raw_position)\n", + "print(\n", + " \"Contract currency balance:\",\n", + " format_asset_amount(\n", + " algorand.asset.get_account_information(app.app_address, currency.id).balance,\n", + " decimals=currency.decimals,\n", + " unit_name=currency.unit_name,\n", + " ),\n", + ")\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b118ea5561624da68c537baed56e602f", + "metadata": {}, + "outputs": [], + "source": [ + "pending_state = app.contract.get_state()\n", + "assert pending_state.status == enums.STATUS_PENDING_IED\n", + "\n", + "ied_entry = normalized.schedule[0]\n", + "time_warp(ied_entry.scheduled_time + cst.DAY_2_SEC, algorand=algorand)\n", + "arranger_role.execute_ied()\n", + "\n", + "active_state = app.contract.get_state()\n", + "actualized_position = app.account(investor).get_actualized_position()\n", + "assert active_state.status == enums.STATUS_ACTIVE\n", + "assert actualized_position.units == normalized.terms.total_units\n", + "\n", + "print(active_state)\n", + "print(actualized_position)\n", + "print(\"Next due event:\", app.contract.get_next_due_event())\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "938c804e27f84196a10c8828c723f798", + "metadata": {}, + "outputs": [], + "source": [ + "holding = app.account(investor)\n", + "cashflows = []\n", + "\n", + "for entry in normalized.schedule[1:]:\n", + " time_warp(entry.scheduled_time, algorand=algorand)\n", + " funding = arranger_role.fund_due_cashflows(max_event_count=1)\n", + " claim = holding.claim()\n", + "\n", + " assert funding.processed_events == 1\n", + " assert claim.total_amount == funding.total_funded\n", + "\n", + " cashflows.append(\n", + " {\n", + " \"event_id\": entry.event_id,\n", + " \"event_type\": entry.event_type,\n", + " \"scheduled_time\": entry.scheduled_time,\n", + " \"funded\": funding.total_funded,\n", + " \"interest_claimed\": claim.interest_amount,\n", + " \"principal_claimed\": claim.principal_amount,\n", + " \"total_claimed\": claim.total_amount,\n", + " \"claim_timestamp\": claim.timestamp,\n", + " }\n", + " )\n", + "\n", + "print(render_table(cashflow_rows(cashflows, currency=currency)))\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "504fb2a444614c0babb325280ed9130a", + "metadata": {}, + "outputs": [], + "source": [ + "final_state = app.contract.get_state()\n", + "final_position = holding.get_actualized_position()\n", + "total_interest_claimed = sum(int(item[\"interest_claimed\"]) for item in cashflows)\n", + "total_principal_claimed = sum(int(item[\"principal_claimed\"]) for item in cashflows)\n", + "\n", + "assert final_state.status == enums.STATUS_ENDED\n", + "assert final_state.event_cursor == len(normalized.schedule)\n", + "assert total_interest_claimed == total_interest_amount\n", + "assert total_principal_claimed == normalized.terms.notional_principal\n", + "assert final_position.units == normalized.terms.total_units\n", + "\n", + "print(final_state)\n", + "print(final_position)\n", + "paid_label = format_asset_amount(\n", + " normalized.terms.initial_exchange_amount,\n", + " decimals=currency.decimals,\n", + " unit_name=currency.unit_name,\n", + ")\n", + "received_label = format_asset_amount(\n", + " total_interest_claimed + total_principal_claimed,\n", + " decimals=currency.decimals,\n", + " unit_name=currency.unit_name,\n", + ")\n", + "print(f\"Investor paid {paid_label}\")\n", + "print(f\"Investor received {received_label}\")\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "name": "python", + "version": "3.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/pam_zero_coupon_bond.ipynb b/examples/pam_zero_coupon_bond.ipynb new file mode 100644 index 00000000..fe111802 --- /dev/null +++ b/examples/pam_zero_coupon_bond.ipynb @@ -0,0 +1,390 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "7fb27b941602401d91542211134fc71a", + "metadata": {}, + "source": [ + "# PAM Zero Coupon Bond on LocalNet\n", + "\n", + "This notebook runs a live PAM zero coupon bond lifecycle on AlgoKit LocalNet.\n", + "\n", + "It covers both:\n", + "- the high-level SDK flow to build ACTUS terms, normalize them, and deploy `DAsa`\n", + "- the live execution flow through discounted issuance, `IED`, funding, holder claims, and maturity\n" + ] + }, + { + "cell_type": "markdown", + "id": "acae54e37e7d407bbb7b55eff062a284", + "metadata": {}, + "source": [ + "## Prerequisites\n", + "\n", + "- run `make install-dev` once\n", + "- start LocalNet with `make localnet` or `algokit localnet start`\n", + "- rerun the notebook from the first cell on a fresh LocalNet when repeating the demo\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9a63283cbaf04dbcab1f6479b197f3a8", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import sys\n", + "from pathlib import Path\n", + "\n", + "REPO_ROOT = next(\n", + " path for path in [Path.cwd(), *Path.cwd().parents] if (path / \"pyproject.toml\").exists()\n", + ")\n", + "os.chdir(REPO_ROOT)\n", + "if str(REPO_ROOT) not in sys.path:\n", + " sys.path.insert(0, str(REPO_ROOT))\n", + "\n", + "print(f\"Repository root: {REPO_ROOT}\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8dd0d8092fe74a7c96281538738b07e2", + "metadata": {}, + "outputs": [], + "source": [ + "from algokit_utils import AssetTransferParams, CommonAppCallParams\n", + "\n", + "from examples._support import (\n", + " cashflow_rows,\n", + " connect_localnet,\n", + " create_currency,\n", + " create_funded_account,\n", + " format_asset_amount,\n", + " opt_in_asset,\n", + " render_table,\n", + " schedule_rows,\n", + ")\n", + "from smart_contracts import constants as cst\n", + "from smart_contracts import enums\n", + "from src import (\n", + " DAsa,\n", + " DAsaRole,\n", + " make_pam_zero_coupon_bond,\n", + " normalize_contract_attributes,\n", + ")\n", + "from src.artifacts.dasa_client import PrimaryDistributionArgs\n", + "from src.localnet import get_latest_timestamp, time_warp\n", + "from src.schedule import Cycle\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "72eea5119410473aa328ad9291626812", + "metadata": {}, + "outputs": [], + "source": [ + "PRINCIPAL = 10_000\n", + "MINIMUM_DENOMINATION = 100\n", + "ZERO_COUPON_MATURITY = Cycle.parse_cycle(\"360D\")\n", + "ZERO_COUPON_DISCOUNT_BPS = 200\n", + "ISSUANCE_DELAY = Cycle.parse_cycle(\"30D\")\n", + "\n", + "\n", + "def day_cycle_seconds(cycle: Cycle) -> int:\n", + " if cycle.unit != \"D\":\n", + " raise ValueError(f\"Only fixed day cycles are used in this notebook, got {cycle}\")\n", + " return cycle.count * cst.DAY_2_SEC\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8edb47106e1a46a883d545849b8ab81b", + "metadata": {}, + "outputs": [], + "source": [ + "algorand = connect_localnet()\n", + "arranger = create_funded_account(algorand, min_algo=50)\n", + "bank = create_funded_account(algorand, min_algo=50)\n", + "account_manager = create_funded_account(algorand)\n", + "primary_dealer = create_funded_account(algorand)\n", + "investor = create_funded_account(algorand)\n", + "\n", + "currency = create_currency(algorand, issuer=bank)\n", + "opt_in_asset(algorand, account=investor, asset_id=currency.id)\n", + "\n", + "print(f\"Currency ASA id: {currency.id}\")\n", + "print(f\"Arranger: {arranger.address}\")\n", + "print(f\"Bank: {bank.address}\")\n", + "print(f\"Investor: {investor.address}\")\n", + "print(f\"Account manager: {account_manager.address}\")\n", + "print(f\"Primary dealer: {primary_dealer.address}\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "10185d26023b46108eb7d9f57d49d2b3", + "metadata": {}, + "outputs": [], + "source": [ + "current_ts = get_latest_timestamp(algorand.client.algod)\n", + "issuance_date = current_ts + day_cycle_seconds(ISSUANCE_DELAY)\n", + "maturity_date = issuance_date + day_cycle_seconds(ZERO_COUPON_MATURITY)\n", + "discount_amount = PRINCIPAL * ZERO_COUPON_DISCOUNT_BPS // cst.BPS\n", + "\n", + "attrs = make_pam_zero_coupon_bond(\n", + " contract_id=2,\n", + " status_date=current_ts,\n", + " initial_exchange_date=issuance_date,\n", + " maturity_date=maturity_date,\n", + " notional_principal=PRINCIPAL,\n", + " premium_discount_at_ied=discount_amount,\n", + ")\n", + "normalized = normalize_contract_attributes(\n", + " attrs,\n", + " denomination_asset_id=currency.id,\n", + " denomination_asset_decimals=currency.decimals,\n", + " notional_unit_value=MINIMUM_DENOMINATION,\n", + " secondary_market_opening_date=issuance_date,\n", + " secondary_market_closure_date=maturity_date + cst.DAY_2_SEC,\n", + ")\n", + "bank_funding_amount = normalized.terms.notional_principal - normalized.terms.initial_exchange_amount\n", + "assert [entry.event_type for entry in normalized.schedule] == [\"IED\", \"MD\"]\n", + "\n", + "issue_price_label = format_asset_amount(\n", + " normalized.terms.initial_exchange_amount,\n", + " decimals=currency.decimals,\n", + " unit_name=currency.unit_name,\n", + ")\n", + "principal_label = format_asset_amount(\n", + " normalized.terms.notional_principal,\n", + " decimals=currency.decimals,\n", + " unit_name=currency.unit_name,\n", + ")\n", + "discount_label = format_asset_amount(\n", + " bank_funding_amount,\n", + " decimals=currency.decimals,\n", + " unit_name=currency.unit_name,\n", + ")\n", + "print(f\"Issue price: {issue_price_label}\")\n", + "print(f\"Principal at maturity: {principal_label}\")\n", + "print(f\"Discount reserve: {discount_label}\")\n", + "print(render_table(schedule_rows(normalized, currency_decimals=currency.decimals)))\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8763a12b2bbd4a93a75aff182afb95dc", + "metadata": {}, + "outputs": [], + "source": [ + "app = DAsa.deploy_configured(\n", + " algorand=algorand,\n", + " arranger=arranger,\n", + " normalized=normalized,\n", + " prospectus_url=\"Notebook example: PAM zero coupon bond\",\n", + ")\n", + "arranger_role = app.arranger(arranger)\n", + "arranger_role.assign_role(DAsaRole.ACCOUNT_MANAGER, account_manager.address)\n", + "arranger_role.assign_role(DAsaRole.PRIMARY_DEALER, primary_dealer.address)\n", + "\n", + "app.account_manager(account_manager).open_account(\n", + " holding_address=investor.address,\n", + " payment_address=investor.address,\n", + ")\n", + "\n", + "state_after_config = app.contract.get_state()\n", + "assert state_after_config.status == enums.STATUS_PENDING_IED\n", + "print(state_after_config)\n" + ] + }, + { + "cell_type": "markdown", + "id": "7623eae2785240b9bd12b16a66d81610", + "metadata": {}, + "source": [ + "## Primary Distribution\n", + "\n", + "The next cell uses `app.raw_client.new_group()` so the investor payment and the\n", + "`primary_distribution` app call stay atomic. That grouped flow is not yet wrapped\n", + "by a higher-level SDK helper.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7cdc8c89c7104fffa095e18ddfef8986", + "metadata": {}, + "outputs": [], + "source": [ + "if bank_funding_amount > 0:\n", + " algorand.send.asset_transfer(\n", + " AssetTransferParams(\n", + " asset_id=currency.id,\n", + " amount=bank_funding_amount,\n", + " receiver=app.app_address,\n", + " sender=bank.address,\n", + " signer=bank.signer,\n", + " )\n", + " )\n", + "\n", + "algorand.send.asset_transfer(\n", + " AssetTransferParams(\n", + " asset_id=currency.id,\n", + " amount=normalized.terms.initial_exchange_amount,\n", + " receiver=investor.address,\n", + " sender=bank.address,\n", + " signer=bank.signer,\n", + " )\n", + ")\n", + "\n", + "investor_purchase_txn = algorand.create_transaction.asset_transfer(\n", + " AssetTransferParams(\n", + " asset_id=currency.id,\n", + " amount=normalized.terms.initial_exchange_amount,\n", + " receiver=app.app_address,\n", + " sender=investor.address,\n", + " signer=investor.signer,\n", + " )\n", + ")\n", + "(\n", + " app.raw_client.new_group()\n", + " .add_transaction(investor_purchase_txn, investor.signer)\n", + " .primary_distribution(\n", + " PrimaryDistributionArgs(\n", + " holding_address=investor.address,\n", + " units=normalized.terms.total_units,\n", + " ),\n", + " params=CommonAppCallParams(\n", + " sender=primary_dealer.address,\n", + " signer=primary_dealer.signer,\n", + " ),\n", + " )\n", + " .send()\n", + ")\n", + "\n", + "raw_position = app.account(investor).get_raw_position()\n", + "assert raw_position.reserved_units == normalized.terms.total_units\n", + "print(raw_position)\n", + "print(\n", + " \"Contract currency balance:\",\n", + " format_asset_amount(\n", + " algorand.asset.get_account_information(app.app_address, currency.id).balance,\n", + " decimals=currency.decimals,\n", + " unit_name=currency.unit_name,\n", + " ),\n", + ")\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b118ea5561624da68c537baed56e602f", + "metadata": {}, + "outputs": [], + "source": [ + "pending_state = app.contract.get_state()\n", + "assert pending_state.status == enums.STATUS_PENDING_IED\n", + "\n", + "ied_entry = normalized.schedule[0]\n", + "time_warp(ied_entry.scheduled_time + cst.DAY_2_SEC, algorand=algorand)\n", + "arranger_role.execute_ied()\n", + "\n", + "active_state = app.contract.get_state()\n", + "actualized_position = app.account(investor).get_actualized_position()\n", + "assert active_state.status == enums.STATUS_ACTIVE\n", + "assert actualized_position.units == normalized.terms.total_units\n", + "\n", + "print(active_state)\n", + "print(actualized_position)\n", + "print(\"Next due event:\", app.contract.get_next_due_event())\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "938c804e27f84196a10c8828c723f798", + "metadata": {}, + "outputs": [], + "source": [ + "holding = app.account(investor)\n", + "cashflows = []\n", + "\n", + "for entry in normalized.schedule[1:]:\n", + " time_warp(entry.scheduled_time, algorand=algorand)\n", + " funding = arranger_role.fund_due_cashflows(max_event_count=1)\n", + " claim = holding.claim()\n", + "\n", + " assert funding.processed_events == 1\n", + " assert claim.total_amount == funding.total_funded\n", + "\n", + " cashflows.append(\n", + " {\n", + " \"event_id\": entry.event_id,\n", + " \"event_type\": entry.event_type,\n", + " \"scheduled_time\": entry.scheduled_time,\n", + " \"funded\": funding.total_funded,\n", + " \"interest_claimed\": claim.interest_amount,\n", + " \"principal_claimed\": claim.principal_amount,\n", + " \"total_claimed\": claim.total_amount,\n", + " \"claim_timestamp\": claim.timestamp,\n", + " }\n", + " )\n", + "\n", + "print(render_table(cashflow_rows(cashflows, currency=currency)))\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "504fb2a444614c0babb325280ed9130a", + "metadata": {}, + "outputs": [], + "source": [ + "final_state = app.contract.get_state()\n", + "final_position = holding.get_actualized_position()\n", + "total_interest_claimed = sum(int(item[\"interest_claimed\"]) for item in cashflows)\n", + "total_principal_claimed = sum(int(item[\"principal_claimed\"]) for item in cashflows)\n", + "\n", + "assert final_state.status == enums.STATUS_ENDED\n", + "assert final_state.event_cursor == len(normalized.schedule)\n", + "assert total_interest_claimed == 0\n", + "assert total_principal_claimed == normalized.terms.notional_principal\n", + "assert final_position.units == normalized.terms.total_units\n", + "\n", + "print(final_state)\n", + "print(final_position)\n", + "paid_label = format_asset_amount(\n", + " normalized.terms.initial_exchange_amount,\n", + " decimals=currency.decimals,\n", + " unit_name=currency.unit_name,\n", + ")\n", + "received_label = format_asset_amount(\n", + " total_interest_claimed + total_principal_claimed,\n", + " decimals=currency.decimals,\n", + " unit_name=currency.unit_name,\n", + ")\n", + "print(f\"Investor paid {paid_label}\")\n", + "print(f\"Investor received {received_label}\")\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "name": "python", + "version": "3.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 0cef883682cf3e9e253601086eb4b04e907db832 Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 22:10:20 +0100 Subject: [PATCH 223/244] chore: jupyter dependencies --- poetry.lock | 1731 +++++++++++++++++++++++++++++++++++++++++++++++- pyproject.toml | 2 + 2 files changed, 1723 insertions(+), 10 deletions(-) diff --git a/poetry.lock b/poetry.lock index f0477e75..62b65cf5 100644 --- a/poetry.lock +++ b/poetry.lock @@ -228,6 +228,124 @@ idna = ">=2.8" [package.extras] trio = ["trio (>=0.31.0) ; python_version < \"3.10\"", "trio (>=0.32.0) ; python_version >= \"3.10\""] +[[package]] +name = "appnope" +version = "0.1.4" +description = "Disable App Nap on macOS >= 10.9" +optional = false +python-versions = ">=3.6" +groups = ["dev"] +markers = "platform_system == \"Darwin\"" +files = [ + {file = "appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c"}, + {file = "appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee"}, +] + +[[package]] +name = "argon2-cffi" +version = "25.1.0" +description = "Argon2 for Python" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "argon2_cffi-25.1.0-py3-none-any.whl", hash = "sha256:fdc8b074db390fccb6eb4a3604ae7231f219aa669a2652e0f20e16ba513d5741"}, + {file = "argon2_cffi-25.1.0.tar.gz", hash = "sha256:694ae5cc8a42f4c4e2bf2ca0e64e51e23a040c6a517a85074683d3959e1346c1"}, +] + +[package.dependencies] +argon2-cffi-bindings = "*" + +[[package]] +name = "argon2-cffi-bindings" +version = "25.1.0" +description = "Low-level CFFI bindings for Argon2" +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "argon2_cffi_bindings-25.1.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:3d3f05610594151994ca9ccb3c771115bdb4daef161976a266f0dd8aa9996b8f"}, + {file = "argon2_cffi_bindings-25.1.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:8b8efee945193e667a396cbc7b4fb7d357297d6234d30a489905d96caabde56b"}, + {file = "argon2_cffi_bindings-25.1.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:3c6702abc36bf3ccba3f802b799505def420a1b7039862014a65db3205967f5a"}, + {file = "argon2_cffi_bindings-25.1.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a1c70058c6ab1e352304ac7e3b52554daadacd8d453c1752e547c76e9c99ac44"}, + {file = "argon2_cffi_bindings-25.1.0-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e2fd3bfbff3c5d74fef31a722f729bf93500910db650c925c2d6ef879a7e51cb"}, + {file = "argon2_cffi_bindings-25.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c4f9665de60b1b0e99bcd6be4f17d90339698ce954cfd8d9cf4f91c995165a92"}, + {file = "argon2_cffi_bindings-25.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ba92837e4a9aa6a508c8d2d7883ed5a8f6c308c89a4790e1e447a220deb79a85"}, + {file = "argon2_cffi_bindings-25.1.0-cp314-cp314t-win32.whl", hash = "sha256:84a461d4d84ae1295871329b346a97f68eade8c53b6ed9a7ca2d7467f3c8ff6f"}, + {file = "argon2_cffi_bindings-25.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b55aec3565b65f56455eebc9b9f34130440404f27fe21c3b375bf1ea4d8fbae6"}, + {file = "argon2_cffi_bindings-25.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:87c33a52407e4c41f3b70a9c2d3f6056d88b10dad7695be708c5021673f55623"}, + {file = "argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:aecba1723ae35330a008418a91ea6cfcedf6d31e5fbaa056a166462ff066d500"}, + {file = "argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:2630b6240b495dfab90aebe159ff784d08ea999aa4b0d17efa734055a07d2f44"}, + {file = "argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:7aef0c91e2c0fbca6fc68e7555aa60ef7008a739cbe045541e438373bc54d2b0"}, + {file = "argon2_cffi_bindings-25.1.0-cp39-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1e021e87faa76ae0d413b619fe2b65ab9a037f24c60a1e6cc43457ae20de6dc6"}, + {file = "argon2_cffi_bindings-25.1.0-cp39-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d3e924cfc503018a714f94a49a149fdc0b644eaead5d1f089330399134fa028a"}, + {file = "argon2_cffi_bindings-25.1.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:c87b72589133f0346a1cb8d5ecca4b933e3c9b64656c9d175270a000e73b288d"}, + {file = "argon2_cffi_bindings-25.1.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:1db89609c06afa1a214a69a462ea741cf735b29a57530478c06eb81dd403de99"}, + {file = "argon2_cffi_bindings-25.1.0-cp39-abi3-win32.whl", hash = "sha256:473bcb5f82924b1becbb637b63303ec8d10e84c8d241119419897a26116515d2"}, + {file = "argon2_cffi_bindings-25.1.0-cp39-abi3-win_amd64.whl", hash = "sha256:a98cd7d17e9f7ce244c0803cad3c23a7d379c301ba618a5fa76a67d116618b98"}, + {file = "argon2_cffi_bindings-25.1.0-cp39-abi3-win_arm64.whl", hash = "sha256:b0fdbcf513833809c882823f98dc2f931cf659d9a1429616ac3adebb49f5db94"}, + {file = "argon2_cffi_bindings-25.1.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:6dca33a9859abf613e22733131fc9194091c1fa7cb3e131c143056b4856aa47e"}, + {file = "argon2_cffi_bindings-25.1.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:21378b40e1b8d1655dd5310c84a40fc19a9aa5e6366e835ceb8576bf0fea716d"}, + {file = "argon2_cffi_bindings-25.1.0-pp310-pypy310_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d588dec224e2a83edbdc785a5e6f3c6cd736f46bfd4b441bbb5aa1f5085e584"}, + {file = "argon2_cffi_bindings-25.1.0-pp310-pypy310_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5acb4e41090d53f17ca1110c3427f0a130f944b896fc8c83973219c97f57b690"}, + {file = "argon2_cffi_bindings-25.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:da0c79c23a63723aa5d782250fbf51b768abca630285262fb5144ba5ae01e520"}, + {file = "argon2_cffi_bindings-25.1.0.tar.gz", hash = "sha256:b957f3e6ea4d55d820e40ff76f450952807013d361a65d7f28acc0acbf29229d"}, +] + +[package.dependencies] +cffi = [ + {version = ">=1.0.1", markers = "python_version < \"3.14\""}, + {version = ">=2.0.0b1", markers = "python_version >= \"3.14\""}, +] + +[[package]] +name = "arrow" +version = "1.4.0" +description = "Better dates & times for Python" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "arrow-1.4.0-py3-none-any.whl", hash = "sha256:749f0769958ebdc79c173ff0b0670d59051a535fa26e8eba02953dc19eb43205"}, + {file = "arrow-1.4.0.tar.gz", hash = "sha256:ed0cc050e98001b8779e84d461b0098c4ac597e88704a655582b21d116e526d7"}, +] + +[package.dependencies] +python-dateutil = ">=2.7.0" +tzdata = {version = "*", markers = "python_version >= \"3.9\""} + +[package.extras] +doc = ["doc8", "sphinx (>=7.0.0)", "sphinx-autobuild", "sphinx-autodoc-typehints", "sphinx_rtd_theme (>=1.3.0)"] +test = ["dateparser (==1.*)", "pre-commit", "pytest", "pytest-cov", "pytest-mock", "pytz (==2025.2)", "simplejson (==3.*)"] + +[[package]] +name = "asttokens" +version = "3.0.1" +description = "Annotate AST trees with source code positions" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "asttokens-3.0.1-py3-none-any.whl", hash = "sha256:15a3ebc0f43c2d0a50eeafea25e19046c68398e487b9f1f5b517f7c0f40f976a"}, + {file = "asttokens-3.0.1.tar.gz", hash = "sha256:71a4ee5de0bde6a31d64f6b13f2293ac190344478f081c3d1bccfcf5eacb0cb7"}, +] + +[package.extras] +astroid = ["astroid (>=2,<5)"] +test = ["astroid (>=2,<5)", "pytest (<9.0)", "pytest-cov", "pytest-xdist"] + +[[package]] +name = "async-lru" +version = "2.2.0" +description = "Simple LRU cache for asyncio" +optional = false +python-versions = ">=3.10" +groups = ["dev"] +files = [ + {file = "async_lru-2.2.0-py3-none-any.whl", hash = "sha256:e2c1cf731eba202b59c5feedaef14ffd9d02ad0037fcda64938699f2c380eafe"}, + {file = "async_lru-2.2.0.tar.gz", hash = "sha256:80abae2a237dbc6c60861d621619af39f0d920aea306de34cb992c879e01370c"}, +] + [[package]] name = "attrs" version = "25.4.0" @@ -240,6 +358,44 @@ files = [ {file = "attrs-25.4.0.tar.gz", hash = "sha256:16d5969b87f0859ef33a48b35d55ac1be6e42ae49d5e853b597db70c35c57e11"}, ] +[[package]] +name = "babel" +version = "2.18.0" +description = "Internationalization utilities" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "babel-2.18.0-py3-none-any.whl", hash = "sha256:e2b422b277c2b9a9630c1d7903c2a00d0830c409c59ac8cae9081c92f1aeba35"}, + {file = "babel-2.18.0.tar.gz", hash = "sha256:b80b99a14bd085fcacfa15c9165f651fbb3406e66cc603abf11c5750937c992d"}, +] + +[package.extras] +dev = ["backports.zoneinfo ; python_version < \"3.9\"", "freezegun (>=1.0,<2.0)", "jinja2 (>=3.0)", "pytest (>=6.0)", "pytest-cov", "pytz", "setuptools", "tzdata ; sys_platform == \"win32\""] + +[[package]] +name = "beautifulsoup4" +version = "4.14.3" +description = "Screen-scraping library" +optional = false +python-versions = ">=3.7.0" +groups = ["dev"] +files = [ + {file = "beautifulsoup4-4.14.3-py3-none-any.whl", hash = "sha256:0918bfe44902e6ad8d57732ba310582e98da931428d231a5ecb9e7c703a735bb"}, + {file = "beautifulsoup4-4.14.3.tar.gz", hash = "sha256:6292b1c5186d356bba669ef9f7f051757099565ad9ada5dd630bd9de5fa7fb86"}, +] + +[package.dependencies] +soupsieve = ">=1.6.1" +typing-extensions = ">=4.0.0" + +[package.extras] +cchardet = ["cchardet"] +chardet = ["chardet"] +charset-normalizer = ["charset-normalizer"] +html5lib = ["html5lib"] +lxml = ["lxml"] + [[package]] name = "black" version = "26.3.1" @@ -292,6 +448,25 @@ d = ["aiohttp (>=3.10)"] jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] uvloop = ["uvloop (>=0.15.2) ; sys_platform != \"win32\"", "winloop (>=0.5.0) ; sys_platform == \"win32\""] +[[package]] +name = "bleach" +version = "6.3.0" +description = "An easy safelist-based HTML-sanitizing tool." +optional = false +python-versions = ">=3.10" +groups = ["dev"] +files = [ + {file = "bleach-6.3.0-py3-none-any.whl", hash = "sha256:fe10ec77c93ddf3d13a73b035abaac7a9f5e436513864ccdad516693213c65d6"}, + {file = "bleach-6.3.0.tar.gz", hash = "sha256:6f3b91b1c0a02bb9a78b5a454c92506aa0fdf197e1d5e114d2e00c6f64306d22"}, +] + +[package.dependencies] +tinycss2 = {version = ">=1.1.0,<1.5", optional = true, markers = "extra == \"css\""} +webencodings = "*" + +[package.extras] +css = ["tinycss2 (>=1.1.0,<1.5)"] + [[package]] name = "boolean-py" version = "5.0" @@ -377,7 +552,6 @@ description = "Foreign Function Interface for Python calling C code." optional = false python-versions = ">=3.9" groups = ["main", "dev"] -markers = "platform_python_implementation != \"PyPy\"" files = [ {file = "cffi-2.0.0-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:0cf2d91ecc3fcc0625c2c530fe004f82c110405f101548512cce44322fa8ac44"}, {file = "cffi-2.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f73b96c41e3b2adedc34a7356e64c8eb96e03a3782b535e043a986276ce12a49"}, @@ -464,6 +638,7 @@ files = [ {file = "cffi-2.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:b882b3df248017dba09d6b16defe9b5c407fe32fc7c65a9c69798e6175601be9"}, {file = "cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529"}, ] +markers = {main = "platform_python_implementation != \"PyPy\""} [package.dependencies] pycparser = {version = "*", markers = "implementation_name != \"PyPy\""} @@ -631,6 +806,21 @@ files = [ {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] +[[package]] +name = "comm" +version = "0.2.3" +description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "comm-0.2.3-py3-none-any.whl", hash = "sha256:c615d91d75f7f04f095b30d1c1711babd43bdc6419c1be9886a85f2f4e489417"}, + {file = "comm-0.2.3.tar.gz", hash = "sha256:2dc8048c10962d55d7ad693be1e7045d891b7ce8d999c97963a5e3e99c055971"}, +] + +[package.extras] +test = ["pytest"] + [[package]] name = "coverage" version = "7.13.4" @@ -800,6 +990,58 @@ toml = ["tomli (>=2.0.0) ; python_version < \"3.11\""] trio = ["trio (>=0.10.0)"] yaml = ["pyyaml (>=6.0.1)"] +[[package]] +name = "debugpy" +version = "1.8.20" +description = "An implementation of the Debug Adapter Protocol for Python" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "debugpy-1.8.20-cp310-cp310-macosx_15_0_x86_64.whl", hash = "sha256:157e96ffb7f80b3ad36d808646198c90acb46fdcfd8bb1999838f0b6f2b59c64"}, + {file = "debugpy-1.8.20-cp310-cp310-manylinux_2_34_x86_64.whl", hash = "sha256:c1178ae571aff42e61801a38b007af504ec8e05fde1c5c12e5a7efef21009642"}, + {file = "debugpy-1.8.20-cp310-cp310-win32.whl", hash = "sha256:c29dd9d656c0fbd77906a6e6a82ae4881514aa3294b94c903ff99303e789b4a2"}, + {file = "debugpy-1.8.20-cp310-cp310-win_amd64.whl", hash = "sha256:3ca85463f63b5dd0aa7aaa933d97cbc47c174896dcae8431695872969f981893"}, + {file = "debugpy-1.8.20-cp311-cp311-macosx_15_0_universal2.whl", hash = "sha256:eada6042ad88fa1571b74bd5402ee8b86eded7a8f7b827849761700aff171f1b"}, + {file = "debugpy-1.8.20-cp311-cp311-manylinux_2_34_x86_64.whl", hash = "sha256:7de0b7dfeedc504421032afba845ae2a7bcc32ddfb07dae2c3ca5442f821c344"}, + {file = "debugpy-1.8.20-cp311-cp311-win32.whl", hash = "sha256:773e839380cf459caf73cc533ea45ec2737a5cc184cf1b3b796cd4fd98504fec"}, + {file = "debugpy-1.8.20-cp311-cp311-win_amd64.whl", hash = "sha256:1f7650546e0eded1902d0f6af28f787fa1f1dbdbc97ddabaf1cd963a405930cb"}, + {file = "debugpy-1.8.20-cp312-cp312-macosx_15_0_universal2.whl", hash = "sha256:4ae3135e2089905a916909ef31922b2d733d756f66d87345b3e5e52b7a55f13d"}, + {file = "debugpy-1.8.20-cp312-cp312-manylinux_2_34_x86_64.whl", hash = "sha256:88f47850a4284b88bd2bfee1f26132147d5d504e4e86c22485dfa44b97e19b4b"}, + {file = "debugpy-1.8.20-cp312-cp312-win32.whl", hash = "sha256:4057ac68f892064e5f98209ab582abfee3b543fb55d2e87610ddc133a954d390"}, + {file = "debugpy-1.8.20-cp312-cp312-win_amd64.whl", hash = "sha256:a1a8f851e7cf171330679ef6997e9c579ef6dd33c9098458bd9986a0f4ca52e3"}, + {file = "debugpy-1.8.20-cp313-cp313-macosx_15_0_universal2.whl", hash = "sha256:5dff4bb27027821fdfcc9e8f87309a28988231165147c31730128b1c983e282a"}, + {file = "debugpy-1.8.20-cp313-cp313-manylinux_2_34_x86_64.whl", hash = "sha256:84562982dd7cf5ebebfdea667ca20a064e096099997b175fe204e86817f64eaf"}, + {file = "debugpy-1.8.20-cp313-cp313-win32.whl", hash = "sha256:da11dea6447b2cadbf8ce2bec59ecea87cc18d2c574980f643f2d2dfe4862393"}, + {file = "debugpy-1.8.20-cp313-cp313-win_amd64.whl", hash = "sha256:eb506e45943cab2efb7c6eafdd65b842f3ae779f020c82221f55aca9de135ed7"}, + {file = "debugpy-1.8.20-cp314-cp314-macosx_15_0_universal2.whl", hash = "sha256:9c74df62fc064cd5e5eaca1353a3ef5a5d50da5eb8058fcef63106f7bebe6173"}, + {file = "debugpy-1.8.20-cp314-cp314-manylinux_2_34_x86_64.whl", hash = "sha256:077a7447589ee9bc1ff0cdf443566d0ecf540ac8aa7333b775ebcb8ce9f4ecad"}, + {file = "debugpy-1.8.20-cp314-cp314-win32.whl", hash = "sha256:352036a99dd35053b37b7803f748efc456076f929c6a895556932eaf2d23b07f"}, + {file = "debugpy-1.8.20-cp314-cp314-win_amd64.whl", hash = "sha256:a98eec61135465b062846112e5ecf2eebb855305acc1dfbae43b72903b8ab5be"}, + {file = "debugpy-1.8.20-cp38-cp38-macosx_15_0_x86_64.whl", hash = "sha256:b773eb026a043e4d9c76265742bc846f2f347da7e27edf7fe97716ea19d6bfc5"}, + {file = "debugpy-1.8.20-cp38-cp38-manylinux_2_34_x86_64.whl", hash = "sha256:20d6e64ea177ab6732bffd3ce8fc6fb8879c60484ce14c3b3fe183b1761459ca"}, + {file = "debugpy-1.8.20-cp38-cp38-win32.whl", hash = "sha256:0dfd9adb4b3c7005e9c33df430bcdd4e4ebba70be533e0066e3a34d210041b66"}, + {file = "debugpy-1.8.20-cp38-cp38-win_amd64.whl", hash = "sha256:60f89411a6c6afb89f18e72e9091c3dfbcfe3edc1066b2043a1f80a3bbb3e11f"}, + {file = "debugpy-1.8.20-cp39-cp39-macosx_15_0_x86_64.whl", hash = "sha256:bff8990f040dacb4c314864da95f7168c5a58a30a66e0eea0fb85e2586a92cd6"}, + {file = "debugpy-1.8.20-cp39-cp39-manylinux_2_34_x86_64.whl", hash = "sha256:70ad9ae09b98ac307b82c16c151d27ee9d68ae007a2e7843ba621b5ce65333b5"}, + {file = "debugpy-1.8.20-cp39-cp39-win32.whl", hash = "sha256:9eeed9f953f9a23850c85d440bf51e3c56ed5d25f8560eeb29add815bd32f7ee"}, + {file = "debugpy-1.8.20-cp39-cp39-win_amd64.whl", hash = "sha256:760813b4fff517c75bfe7923033c107104e76acfef7bda011ffea8736e9a66f8"}, + {file = "debugpy-1.8.20-py2.py3-none-any.whl", hash = "sha256:5be9bed9ae3be00665a06acaa48f8329d2b9632f15fd09f6a9a8c8d9907e54d7"}, + {file = "debugpy-1.8.20.tar.gz", hash = "sha256:55bc8701714969f1ab89a6d5f2f3d40c36f91b2cbe2f65d98bf8196f6a6a2c33"}, +] + +[[package]] +name = "decorator" +version = "5.2.1" +description = "Decorators for Humans" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a"}, + {file = "decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360"}, +] + [[package]] name = "defusedxml" version = "0.7.1" @@ -853,6 +1095,36 @@ files = [ {file = "docutils-0.22.4.tar.gz", hash = "sha256:4db53b1fde9abecbb74d91230d32ab626d94f6badfc575d6db9194a49df29968"}, ] +[[package]] +name = "executing" +version = "2.2.1" +description = "Get the currently executing AST node of a frame, and other information" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "executing-2.2.1-py2.py3-none-any.whl", hash = "sha256:760643d3452b4d777d295bb167ccc74c64a81df23fb5e08eff250c425a4b2017"}, + {file = "executing-2.2.1.tar.gz", hash = "sha256:3632cc370565f6648cc328b32435bd120a1e4ebb20c77e3fdde9a13cd1e533c4"}, +] + +[package.extras] +tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich ; python_version >= \"3.11\""] + +[[package]] +name = "fastjsonschema" +version = "2.21.2" +description = "Fastest Python implementation of JSON schema" +optional = false +python-versions = "*" +groups = ["dev"] +files = [ + {file = "fastjsonschema-2.21.2-py3-none-any.whl", hash = "sha256:1c797122d0a86c5cace2e54bf4e819c36223b552017172f32c5c024a6b77e463"}, + {file = "fastjsonschema-2.21.2.tar.gz", hash = "sha256:b1eb43748041c880796cd077f1a07c3d94e93ae84bba5ed36800a33554ae05de"}, +] + +[package.extras] +devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benchmark", "pytest-cache", "validictory"] + [[package]] name = "filelock" version = "3.25.2" @@ -865,6 +1137,18 @@ files = [ {file = "filelock-3.25.2.tar.gz", hash = "sha256:b64ece2b38f4ca29dd3e810287aa8c48182bbecd1ae6e9ae126c9b35f1382694"}, ] +[[package]] +name = "fqdn" +version = "1.5.1" +description = "Validates fully-qualified domain names against RFC 1123, so that they are acceptable to modern bowsers" +optional = false +python-versions = ">=2.7, !=3.0, !=3.1, !=3.2, !=3.3, !=3.4, <4" +groups = ["dev"] +files = [ + {file = "fqdn-1.5.1-py3-none-any.whl", hash = "sha256:3a179af3761e4df6eb2e026ff9e1a3033d3587bf980a0b1b2e1e5d08d7358014"}, + {file = "fqdn-1.5.1.tar.gz", hash = "sha256:105ed3677e767fb5ca086a0c1f4bb66ebc3c100be518f0e0d755d9eae164d89f"}, +] + [[package]] name = "frozenlist" version = "1.8.0" @@ -1118,6 +1402,442 @@ files = [ {file = "iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730"}, ] +[[package]] +name = "ipykernel" +version = "7.2.0" +description = "IPython Kernel for Jupyter" +optional = false +python-versions = ">=3.10" +groups = ["dev"] +files = [ + {file = "ipykernel-7.2.0-py3-none-any.whl", hash = "sha256:3bbd4420d2b3cc105cbdf3756bfc04500b1e52f090a90716851f3916c62e1661"}, + {file = "ipykernel-7.2.0.tar.gz", hash = "sha256:18ed160b6dee2cbb16e5f3575858bc19d8f1fe6046a9a680c708494ce31d909e"}, +] + +[package.dependencies] +appnope = {version = ">=0.1.2", markers = "platform_system == \"Darwin\""} +comm = ">=0.1.1" +debugpy = ">=1.6.5" +ipython = ">=7.23.1" +jupyter-client = ">=8.8.0" +jupyter-core = ">=5.1,<6.0.dev0 || >=6.1.dev0" +matplotlib-inline = ">=0.1" +nest-asyncio = ">=1.4" +packaging = ">=22" +psutil = ">=5.7" +pyzmq = ">=25" +tornado = ">=6.4.1" +traitlets = ">=5.4.0" + +[package.extras] +cov = ["coverage[toml]", "matplotlib", "pytest-cov", "trio"] +docs = ["intersphinx-registry", "myst-parser", "pydata-sphinx-theme", "sphinx (<8.2.0)", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "trio"] +pyqt5 = ["pyqt5"] +pyside6 = ["pyside6"] +test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0,<10)", "pytest-asyncio (>=0.23.5)", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "ipython" +version = "9.11.0" +description = "IPython: Productive Interactive Computing" +optional = false +python-versions = ">=3.12" +groups = ["dev"] +files = [ + {file = "ipython-9.11.0-py3-none-any.whl", hash = "sha256:6922d5bcf944c6e525a76a0a304451b60a2b6f875e86656d8bc2dfda5d710e19"}, + {file = "ipython-9.11.0.tar.gz", hash = "sha256:2a94bc4406b22ecc7e4cb95b98450f3ea493a76bec8896cda11b78d7752a6667"}, +] + +[package.dependencies] +colorama = {version = ">=0.4.4", markers = "sys_platform == \"win32\""} +decorator = ">=5.1.0" +ipython-pygments-lexers = ">=1.0.0" +jedi = ">=0.18.2" +matplotlib-inline = ">=0.1.6" +pexpect = {version = ">4.6", markers = "sys_platform != \"win32\" and sys_platform != \"emscripten\""} +prompt_toolkit = ">=3.0.41,<3.1.0" +pygments = ">=2.14.0" +stack_data = ">=0.6.0" +traitlets = ">=5.13.0" + +[package.extras] +all = ["argcomplete (>=3.0)", "ipython[doc,matplotlib,terminal,test,test-extra]", "types-decorator"] +black = ["black"] +doc = ["docrepr", "exceptiongroup", "intersphinx_registry", "ipykernel", "ipython[matplotlib,test]", "setuptools (>=80.0)", "sphinx (>=8.0)", "sphinx-rtd-theme (>=0.1.8)", "sphinx_toml (==0.0.4)", "typing_extensions"] +matplotlib = ["matplotlib (>3.9)"] +test = ["packaging (>=23.0.0)", "pytest (>=7.0.0)", "pytest-asyncio (>=1.0.0)", "setuptools (>=80.0)", "testpath (>=0.2)"] +test-extra = ["curio", "ipykernel (>6.30)", "ipython[matplotlib]", "ipython[test]", "jupyter_ai", "nbclient", "nbformat", "numpy (>=2.0)", "pandas (>2.1)", "trio (>=0.22.0)"] + +[[package]] +name = "ipython-pygments-lexers" +version = "1.1.1" +description = "Defines a variety of Pygments lexers for highlighting IPython code." +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "ipython_pygments_lexers-1.1.1-py3-none-any.whl", hash = "sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c"}, + {file = "ipython_pygments_lexers-1.1.1.tar.gz", hash = "sha256:09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81"}, +] + +[package.dependencies] +pygments = "*" + +[[package]] +name = "isoduration" +version = "20.11.0" +description = "Operations with ISO 8601 durations" +optional = false +python-versions = ">=3.7" +groups = ["dev"] +files = [ + {file = "isoduration-20.11.0-py3-none-any.whl", hash = "sha256:b2904c2a4228c3d44f409c8ae8e2370eb21a26f7ac2ec5446df141dde3452042"}, + {file = "isoduration-20.11.0.tar.gz", hash = "sha256:ac2f9015137935279eac671f94f89eb00584f940f5dc49462a0c4ee692ba1bd9"}, +] + +[package.dependencies] +arrow = ">=0.15.0" + +[[package]] +name = "jedi" +version = "0.19.2" +description = "An autocompletion tool for Python that can be used for text editors." +optional = false +python-versions = ">=3.6" +groups = ["dev"] +files = [ + {file = "jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9"}, + {file = "jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0"}, +] + +[package.dependencies] +parso = ">=0.8.4,<0.9.0" + +[package.extras] +docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] +testing = ["Django", "attrs", "colorama", "docopt", "pytest (<9.0.0)"] + +[[package]] +name = "jinja2" +version = "3.1.6" +description = "A very fast and expressive template engine." +optional = false +python-versions = ">=3.7" +groups = ["dev"] +files = [ + {file = "jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67"}, + {file = "jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d"}, +] + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "json5" +version = "0.13.0" +description = "A Python implementation of the JSON5 data format." +optional = false +python-versions = ">=3.8.0" +groups = ["dev"] +files = [ + {file = "json5-0.13.0-py3-none-any.whl", hash = "sha256:9a08e1dd65f6a4d4c6fa82d216cf2477349ec2346a38fd70cc11d2557499fbcc"}, + {file = "json5-0.13.0.tar.gz", hash = "sha256:b1edf8d487721c0bf64d83c28e91280781f6e21f4a797d3261c7c828d4c165bf"}, +] + +[[package]] +name = "jsonpointer" +version = "3.0.0" +description = "Identify specific nodes in a JSON document (RFC 6901)" +optional = false +python-versions = ">=3.7" +groups = ["dev"] +files = [ + {file = "jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942"}, + {file = "jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef"}, +] + +[[package]] +name = "jsonschema" +version = "4.26.0" +description = "An implementation of JSON Schema validation for Python" +optional = false +python-versions = ">=3.10" +groups = ["dev"] +files = [ + {file = "jsonschema-4.26.0-py3-none-any.whl", hash = "sha256:d489f15263b8d200f8387e64b4c3a75f06629559fb73deb8fdfb525f2dab50ce"}, + {file = "jsonschema-4.26.0.tar.gz", hash = "sha256:0c26707e2efad8aa1bfc5b7ce170f3fccc2e4918ff85989ba9ffa9facb2be326"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +fqdn = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} +idna = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} +isoduration = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} +jsonpointer = {version = ">1.13", optional = true, markers = "extra == \"format-nongpl\""} +jsonschema-specifications = ">=2023.3.6" +referencing = ">=0.28.4" +rfc3339-validator = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} +rfc3986-validator = {version = ">0.1.0", optional = true, markers = "extra == \"format-nongpl\""} +rfc3987-syntax = {version = ">=1.1.0", optional = true, markers = "extra == \"format-nongpl\""} +rpds-py = ">=0.25.0" +uri-template = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} +webcolors = {version = ">=24.6.0", optional = true, markers = "extra == \"format-nongpl\""} + +[package.extras] +format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] +format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "rfc3987-syntax (>=1.1.0)", "uri-template", "webcolors (>=24.6.0)"] + +[[package]] +name = "jsonschema-specifications" +version = "2025.9.1" +description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "jsonschema_specifications-2025.9.1-py3-none-any.whl", hash = "sha256:98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe"}, + {file = "jsonschema_specifications-2025.9.1.tar.gz", hash = "sha256:b540987f239e745613c7a9176f3edb72b832a4ac465cf02712288397832b5e8d"}, +] + +[package.dependencies] +referencing = ">=0.31.0" + +[[package]] +name = "jupyter-client" +version = "8.8.0" +description = "Jupyter protocol implementation and client libraries" +optional = false +python-versions = ">=3.10" +groups = ["dev"] +files = [ + {file = "jupyter_client-8.8.0-py3-none-any.whl", hash = "sha256:f93a5b99c5e23a507b773d3a1136bd6e16c67883ccdbd9a829b0bbdb98cd7d7a"}, + {file = "jupyter_client-8.8.0.tar.gz", hash = "sha256:d556811419a4f2d96c869af34e854e3f059b7cc2d6d01a9cd9c85c267691be3e"}, +] + +[package.dependencies] +jupyter-core = ">=5.1" +python-dateutil = ">=2.8.2" +pyzmq = ">=25.0" +tornado = ">=6.4.1" +traitlets = ">=5.3" + +[package.extras] +docs = ["ipykernel", "myst-parser", "pydata-sphinx-theme", "sphinx (>=4)", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] +orjson = ["orjson"] +test = ["anyio", "coverage", "ipykernel (>=6.14)", "msgpack", "mypy ; platform_python_implementation != \"PyPy\"", "paramiko ; sys_platform == \"win32\"", "pre-commit", "pytest", "pytest-cov", "pytest-jupyter[client] (>=0.6.2)", "pytest-timeout"] + +[[package]] +name = "jupyter-core" +version = "5.9.1" +description = "Jupyter core package. A base package on which Jupyter projects rely." +optional = false +python-versions = ">=3.10" +groups = ["dev"] +files = [ + {file = "jupyter_core-5.9.1-py3-none-any.whl", hash = "sha256:ebf87fdc6073d142e114c72c9e29a9d7ca03fad818c5d300ce2adc1fb0743407"}, + {file = "jupyter_core-5.9.1.tar.gz", hash = "sha256:4d09aaff303b9566c3ce657f580bd089ff5c91f5f89cf7d8846c3cdf465b5508"}, +] + +[package.dependencies] +platformdirs = ">=2.5" +traitlets = ">=5.3" + +[package.extras] +docs = ["intersphinx-registry", "myst-parser", "pydata-sphinx-theme", "sphinx-autodoc-typehints", "sphinxcontrib-spelling", "traitlets"] +test = ["ipykernel", "pre-commit", "pytest (<9)", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "jupyter-events" +version = "0.12.0" +description = "Jupyter Event System library" +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "jupyter_events-0.12.0-py3-none-any.whl", hash = "sha256:6464b2fa5ad10451c3d35fabc75eab39556ae1e2853ad0c0cc31b656731a97fb"}, + {file = "jupyter_events-0.12.0.tar.gz", hash = "sha256:fc3fce98865f6784c9cd0a56a20644fc6098f21c8c33834a8d9fe383c17e554b"}, +] + +[package.dependencies] +jsonschema = {version = ">=4.18.0", extras = ["format-nongpl"]} +packaging = "*" +python-json-logger = ">=2.0.4" +pyyaml = ">=5.3" +referencing = "*" +rfc3339-validator = "*" +rfc3986-validator = ">=0.1.1" +traitlets = ">=5.3" + +[package.extras] +cli = ["click", "rich"] +docs = ["jupyterlite-sphinx", "myst-parser", "pydata-sphinx-theme (>=0.16)", "sphinx (>=8)", "sphinxcontrib-spelling"] +test = ["click", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (>=0.19.0)", "pytest-console-scripts", "rich"] + +[[package]] +name = "jupyter-lsp" +version = "2.3.0" +description = "Multi-Language Server WebSocket proxy for Jupyter Notebook/Lab server" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "jupyter_lsp-2.3.0-py3-none-any.whl", hash = "sha256:e914a3cb2addf48b1c7710914771aaf1819d46b2e5a79b0f917b5478ec93f34f"}, + {file = "jupyter_lsp-2.3.0.tar.gz", hash = "sha256:458aa59339dc868fb784d73364f17dbce8836e906cd75fd471a325cba02e0245"}, +] + +[package.dependencies] +jupyter_server = ">=1.1.2" + +[[package]] +name = "jupyter-server" +version = "2.17.0" +description = "The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications." +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "jupyter_server-2.17.0-py3-none-any.whl", hash = "sha256:e8cb9c7db4251f51ed307e329b81b72ccf2056ff82d50524debde1ee1870e13f"}, + {file = "jupyter_server-2.17.0.tar.gz", hash = "sha256:c38ea898566964c888b4772ae1ed58eca84592e88251d2cfc4d171f81f7e99d5"}, +] + +[package.dependencies] +anyio = ">=3.1.0" +argon2-cffi = ">=21.1" +jinja2 = ">=3.0.3" +jupyter-client = ">=7.4.4" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +jupyter-events = ">=0.11.0" +jupyter-server-terminals = ">=0.4.4" +nbconvert = ">=6.4.4" +nbformat = ">=5.3.0" +packaging = ">=22.0" +prometheus-client = ">=0.9" +pywinpty = {version = ">=2.0.1", markers = "os_name == \"nt\""} +pyzmq = ">=24" +send2trash = ">=1.8.2" +terminado = ">=0.8.3" +tornado = ">=6.2.0" +traitlets = ">=5.6.0" +websocket-client = ">=1.7" + +[package.extras] +docs = ["ipykernel", "jinja2", "jupyter-client", "myst-parser", "nbformat", "prometheus-client", "pydata-sphinx-theme", "send2trash", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-openapi (>=0.8.0)", "sphinxcontrib-spelling", "sphinxemoji", "tornado", "typing-extensions"] +test = ["flaky", "ipykernel", "pre-commit", "pytest (>=7.0,<9)", "pytest-console-scripts", "pytest-jupyter[server] (>=0.7)", "pytest-timeout", "requests"] + +[[package]] +name = "jupyter-server-terminals" +version = "0.5.4" +description = "A Jupyter Server Extension Providing Terminals." +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "jupyter_server_terminals-0.5.4-py3-none-any.whl", hash = "sha256:55be353fc74a80bc7f3b20e6be50a55a61cd525626f578dcb66a5708e2007d14"}, + {file = "jupyter_server_terminals-0.5.4.tar.gz", hash = "sha256:bbda128ed41d0be9020349f9f1f2a4ab9952a73ed5f5ac9f1419794761fb87f5"}, +] + +[package.dependencies] +pywinpty = {version = ">=2.0.3", markers = "os_name == \"nt\""} +terminado = ">=0.8.3" + +[package.extras] +docs = ["jinja2", "jupyter-server", "mistune (<4.0)", "myst-parser", "nbformat", "packaging", "pydata-sphinx-theme", "sphinxcontrib-github-alt", "sphinxcontrib-openapi", "sphinxcontrib-spelling", "sphinxemoji", "tornado"] +test = ["jupyter-server (>=2.0.0)", "pytest (>=7.0)", "pytest-jupyter[server] (>=0.5.3)", "pytest-timeout"] + +[[package]] +name = "jupyterlab" +version = "4.5.6" +description = "JupyterLab computational environment" +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "jupyterlab-4.5.6-py3-none-any.whl", hash = "sha256:d6b3dac883aa4d9993348e0f8e95b24624f75099aed64eab6a4351a9cdd1e580"}, + {file = "jupyterlab-4.5.6.tar.gz", hash = "sha256:642fe2cfe7f0f5922a8a558ba7a0d246c7bc133b708dfe43f7b3a826d163cf42"}, +] + +[package.dependencies] +async-lru = ">=1.0.0" +httpx = ">=0.25.0,<1" +ipykernel = ">=6.5.0,<6.30.0 || >6.30.0" +jinja2 = ">=3.0.3" +jupyter-core = "*" +jupyter-lsp = ">=2.0.0" +jupyter-server = ">=2.4.0,<3" +jupyterlab-server = ">=2.28.0,<3" +notebook-shim = ">=0.2" +packaging = "*" +setuptools = ">=41.1.0" +tornado = ">=6.2.0" +traitlets = "*" + +[package.extras] +dev = ["build", "bump2version", "coverage", "hatch", "pre-commit", "pytest-cov", "ruff (==0.11.12)"] +docs = ["jsx-lexer", "myst-parser", "pydata-sphinx-theme (>=0.13.0)", "pytest", "pytest-check-links", "pytest-jupyter", "sphinx (>=1.8,<8.2.0)", "sphinx-copybutton"] +docs-screenshots = ["altair (==6.0.0)", "ipython (==8.16.1)", "ipywidgets (==8.1.5)", "jupyterlab-geojson (==3.4.0)", "jupyterlab-language-pack-zh-cn (==4.3.post1)", "matplotlib (==3.10.0)", "nbconvert (>=7.0.0)", "pandas (==2.2.3)", "scipy (==1.15.1)"] +test = ["coverage", "pytest (>=7.0)", "pytest-check-links (>=0.7)", "pytest-console-scripts", "pytest-cov", "pytest-jupyter (>=0.5.3)", "pytest-timeout", "pytest-tornasync", "requests", "requests-cache", "virtualenv"] +upgrade-extension = ["copier (>=9,<10)", "jinja2-time (<0.3)", "pydantic (<3.0)", "pyyaml-include (<3.0)", "tomli-w (<2.0)"] + +[[package]] +name = "jupyterlab-pygments" +version = "0.3.0" +description = "Pygments theme using JupyterLab CSS variables" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "jupyterlab_pygments-0.3.0-py3-none-any.whl", hash = "sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780"}, + {file = "jupyterlab_pygments-0.3.0.tar.gz", hash = "sha256:721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d"}, +] + +[[package]] +name = "jupyterlab-server" +version = "2.28.0" +description = "A set of server components for JupyterLab and JupyterLab like applications." +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "jupyterlab_server-2.28.0-py3-none-any.whl", hash = "sha256:e4355b148fdcf34d312bbbc80f22467d6d20460e8b8736bf235577dd18506968"}, + {file = "jupyterlab_server-2.28.0.tar.gz", hash = "sha256:35baa81898b15f93573e2deca50d11ac0ae407ebb688299d3a5213265033712c"}, +] + +[package.dependencies] +babel = ">=2.10" +jinja2 = ">=3.0.3" +json5 = ">=0.9.0" +jsonschema = ">=4.18.0" +jupyter-server = ">=1.21,<3" +packaging = ">=21.3" +requests = ">=2.31" + +[package.extras] +docs = ["autodoc-traits", "jinja2 (<3.2.0)", "mistune (<4)", "myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-copybutton", "sphinxcontrib-openapi (>0.8)"] +openapi = ["openapi-core (>=0.18.0,<0.19.0)", "ruamel-yaml"] +test = ["hatch", "ipykernel", "openapi-core (>=0.18.0,<0.19.0)", "openapi-spec-validator (>=0.6.0,<0.8.0)", "pytest (>=7.0,<8)", "pytest-console-scripts", "pytest-cov", "pytest-jupyter[server] (>=0.6.2)", "pytest-timeout", "requests-mock", "ruamel-yaml", "sphinxcontrib-spelling", "strict-rfc3339", "werkzeug"] + +[[package]] +name = "lark" +version = "1.3.1" +description = "a modern parsing library" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "lark-1.3.1-py3-none-any.whl", hash = "sha256:c629b661023a014c37da873b4ff58a817398d12635d3bbb2c5a03be7fe5d1e12"}, + {file = "lark-1.3.1.tar.gz", hash = "sha256:b426a7a6d6d53189d318f2b6236ab5d6429eaf09259f1ca33eb716eed10d2905"}, +] + +[package.extras] +atomic-cache = ["atomicwrites"] +interegular = ["interegular (>=0.3.1,<0.4.0)"] +nearley = ["js2py"] +regex = ["regex"] + [[package]] name = "librt" version = "0.8.1" @@ -1277,6 +1997,123 @@ profiling = ["gprof2dot"] rtd = ["ipykernel", "jupyter_sphinx", "mdit-py-plugins (>=0.5.0)", "myst-parser", "pyyaml", "sphinx", "sphinx-book-theme (>=1.0,<2.0)", "sphinx-copybutton", "sphinx-design"] testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions", "requests"] +[[package]] +name = "markupsafe" +version = "3.0.3" +description = "Safely add untrusted strings to HTML/XML markup." +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "markupsafe-3.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2f981d352f04553a7171b8e44369f2af4055f888dfb147d55e42d29e29e74559"}, + {file = "markupsafe-3.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e1c1493fb6e50ab01d20a22826e57520f1284df32f2d8601fdd90b6304601419"}, + {file = "markupsafe-3.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1ba88449deb3de88bd40044603fafffb7bc2b055d626a330323a9ed736661695"}, + {file = "markupsafe-3.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f42d0984e947b8adf7dd6dde396e720934d12c506ce84eea8476409563607591"}, + {file = "markupsafe-3.0.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c0c0b3ade1c0b13b936d7970b1d37a57acde9199dc2aecc4c336773e1d86049c"}, + {file = "markupsafe-3.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0303439a41979d9e74d18ff5e2dd8c43ed6c6001fd40e5bf2e43f7bd9bbc523f"}, + {file = "markupsafe-3.0.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:d2ee202e79d8ed691ceebae8e0486bd9a2cd4794cec4824e1c99b6f5009502f6"}, + {file = "markupsafe-3.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:177b5253b2834fe3678cb4a5f0059808258584c559193998be2601324fdeafb1"}, + {file = "markupsafe-3.0.3-cp310-cp310-win32.whl", hash = "sha256:2a15a08b17dd94c53a1da0438822d70ebcd13f8c3a95abe3a9ef9f11a94830aa"}, + {file = "markupsafe-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:c4ffb7ebf07cfe8931028e3e4c85f0357459a3f9f9490886198848f4fa002ec8"}, + {file = "markupsafe-3.0.3-cp310-cp310-win_arm64.whl", hash = "sha256:e2103a929dfa2fcaf9bb4e7c091983a49c9ac3b19c9061b6d5427dd7d14d81a1"}, + {file = "markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad"}, + {file = "markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a"}, + {file = "markupsafe-3.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b5420a1d9450023228968e7e6a9ce57f65d148ab56d2313fcd589eee96a7a50"}, + {file = "markupsafe-3.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0bf2a864d67e76e5c9a34dc26ec616a66b9888e25e7b9460e1c76d3293bd9dbf"}, + {file = "markupsafe-3.0.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc51efed119bc9cfdf792cdeaa4d67e8f6fcccab66ed4bfdd6bde3e59bfcbb2f"}, + {file = "markupsafe-3.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:068f375c472b3e7acbe2d5318dea141359e6900156b5b2ba06a30b169086b91a"}, + {file = "markupsafe-3.0.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:7be7b61bb172e1ed687f1754f8e7484f1c8019780f6f6b0786e76bb01c2ae115"}, + {file = "markupsafe-3.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a"}, + {file = "markupsafe-3.0.3-cp311-cp311-win32.whl", hash = "sha256:0db14f5dafddbb6d9208827849fad01f1a2609380add406671a26386cdf15a19"}, + {file = "markupsafe-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:de8a88e63464af587c950061a5e6a67d3632e36df62b986892331d4620a35c01"}, + {file = "markupsafe-3.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:3b562dd9e9ea93f13d53989d23a7e775fdfd1066c33494ff43f5418bc8c58a5c"}, + {file = "markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e"}, + {file = "markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce"}, + {file = "markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d"}, + {file = "markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d"}, + {file = "markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a"}, + {file = "markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b"}, + {file = "markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f"}, + {file = "markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b"}, + {file = "markupsafe-3.0.3-cp312-cp312-win32.whl", hash = "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d"}, + {file = "markupsafe-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c"}, + {file = "markupsafe-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f"}, + {file = "markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795"}, + {file = "markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219"}, + {file = "markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6"}, + {file = "markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676"}, + {file = "markupsafe-3.0.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9"}, + {file = "markupsafe-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1"}, + {file = "markupsafe-3.0.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc"}, + {file = "markupsafe-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12"}, + {file = "markupsafe-3.0.3-cp313-cp313-win32.whl", hash = "sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed"}, + {file = "markupsafe-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5"}, + {file = "markupsafe-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485"}, + {file = "markupsafe-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73"}, + {file = "markupsafe-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37"}, + {file = "markupsafe-3.0.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19"}, + {file = "markupsafe-3.0.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025"}, + {file = "markupsafe-3.0.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6"}, + {file = "markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f"}, + {file = "markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb"}, + {file = "markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009"}, + {file = "markupsafe-3.0.3-cp313-cp313t-win32.whl", hash = "sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354"}, + {file = "markupsafe-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218"}, + {file = "markupsafe-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287"}, + {file = "markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe"}, + {file = "markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026"}, + {file = "markupsafe-3.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737"}, + {file = "markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97"}, + {file = "markupsafe-3.0.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d"}, + {file = "markupsafe-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda"}, + {file = "markupsafe-3.0.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf"}, + {file = "markupsafe-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe"}, + {file = "markupsafe-3.0.3-cp314-cp314-win32.whl", hash = "sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9"}, + {file = "markupsafe-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581"}, + {file = "markupsafe-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4"}, + {file = "markupsafe-3.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab"}, + {file = "markupsafe-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175"}, + {file = "markupsafe-3.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634"}, + {file = "markupsafe-3.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50"}, + {file = "markupsafe-3.0.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e"}, + {file = "markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5"}, + {file = "markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523"}, + {file = "markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc"}, + {file = "markupsafe-3.0.3-cp314-cp314t-win32.whl", hash = "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d"}, + {file = "markupsafe-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9"}, + {file = "markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa"}, + {file = "markupsafe-3.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:15d939a21d546304880945ca1ecb8a039db6b4dc49b2c5a400387cdae6a62e26"}, + {file = "markupsafe-3.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f71a396b3bf33ecaa1626c255855702aca4d3d9fea5e051b41ac59a9c1c41edc"}, + {file = "markupsafe-3.0.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0f4b68347f8c5eab4a13419215bdfd7f8c9b19f2b25520968adfad23eb0ce60c"}, + {file = "markupsafe-3.0.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e8fc20152abba6b83724d7ff268c249fa196d8259ff481f3b1476383f8f24e42"}, + {file = "markupsafe-3.0.3-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:949b8d66bc381ee8b007cd945914c721d9aba8e27f71959d750a46f7c282b20b"}, + {file = "markupsafe-3.0.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:3537e01efc9d4dccdf77221fb1cb3b8e1a38d5428920e0657ce299b20324d758"}, + {file = "markupsafe-3.0.3-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:591ae9f2a647529ca990bc681daebdd52c8791ff06c2bfa05b65163e28102ef2"}, + {file = "markupsafe-3.0.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a320721ab5a1aba0a233739394eb907f8c8da5c98c9181d1161e77a0c8e36f2d"}, + {file = "markupsafe-3.0.3-cp39-cp39-win32.whl", hash = "sha256:df2449253ef108a379b8b5d6b43f4b1a8e81a061d6537becd5582fba5f9196d7"}, + {file = "markupsafe-3.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:7c3fb7d25180895632e5d3148dbdc29ea38ccb7fd210aa27acbd1201a1902c6e"}, + {file = "markupsafe-3.0.3-cp39-cp39-win_arm64.whl", hash = "sha256:38664109c14ffc9e7437e86b4dceb442b0096dfe3541d7864d9cbe1da4cf36c8"}, + {file = "markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698"}, +] + +[[package]] +name = "matplotlib-inline" +version = "0.2.1" +description = "Inline Matplotlib backend for Jupyter" +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "matplotlib_inline-0.2.1-py3-none-any.whl", hash = "sha256:d56ce5156ba6085e00a9d54fead6ed29a9c47e215cd1bba2e976ef39f5710a76"}, + {file = "matplotlib_inline-0.2.1.tar.gz", hash = "sha256:e1ee949c340d771fc39e241ea75683deb94762c8fa5f2927ec57c83c4dffa9fe"}, +] + +[package.dependencies] +traitlets = "*" + +[package.extras] +test = ["flake8", "nbdime", "nbval", "notebook", "pytest"] + [[package]] name = "mdurl" version = "0.1.2" @@ -1289,6 +2126,18 @@ files = [ {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, ] +[[package]] +name = "mistune" +version = "3.2.0" +description = "A sane and fast Markdown parser with useful plugins and renderers" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "mistune-3.2.0-py3-none-any.whl", hash = "sha256:febdc629a3c78616b94393c6580551e0e34cc289987ec6c35ed3f4be42d0eee1"}, + {file = "mistune-3.2.0.tar.gz", hash = "sha256:708487c8a8cdd99c9d90eb3ed4c3ed961246ff78ac82f03418f5183ab70e398a"}, +] + [[package]] name = "msgpack" version = "1.1.2" @@ -1590,6 +2439,100 @@ files = [ {file = "mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558"}, ] +[[package]] +name = "nbclient" +version = "0.10.4" +description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." +optional = false +python-versions = ">=3.10.0" +groups = ["dev"] +files = [ + {file = "nbclient-0.10.4-py3-none-any.whl", hash = "sha256:9162df5a7373d70d606527300a95a975a47c137776cd942e52d9c7e29ff83440"}, + {file = "nbclient-0.10.4.tar.gz", hash = "sha256:1e54091b16e6da39e297b0ece3e10f6f29f4ac4e8ee515d29f8a7099bd6553c9"}, +] + +[package.dependencies] +jupyter-client = ">=6.1.12" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +nbformat = ">=5.1.3" +traitlets = ">=5.4" + +[package.extras] +dev = ["pre-commit"] +docs = ["autodoc-traits", "flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "mock", "moto", "myst-parser", "nbconvert (>=7.1.0)", "pytest (>=9.0.1,<10)", "pytest-asyncio (>=1.3.0)", "pytest-cov (>=4.0)", "sphinx (>=1.7)", "sphinx-book-theme", "sphinxcontrib-spelling", "testpath", "xmltodict"] +test = ["flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "nbconvert (>=7.1.0)", "pytest (>=9.0.1,<10)", "pytest-asyncio (>=1.3.0)", "pytest-cov (>=4.0)", "testpath", "xmltodict"] + +[[package]] +name = "nbconvert" +version = "7.17.0" +description = "Convert Jupyter Notebooks (.ipynb files) to other formats." +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "nbconvert-7.17.0-py3-none-any.whl", hash = "sha256:4f99a63b337b9a23504347afdab24a11faa7d86b405e5c8f9881cd313336d518"}, + {file = "nbconvert-7.17.0.tar.gz", hash = "sha256:1b2696f1b5be12309f6c7d707c24af604b87dfaf6d950794c7b07acab96dda78"}, +] + +[package.dependencies] +beautifulsoup4 = "*" +bleach = {version = "!=5.0.0", extras = ["css"]} +defusedxml = "*" +jinja2 = ">=3.0" +jupyter-core = ">=4.7" +jupyterlab-pygments = "*" +markupsafe = ">=2.0" +mistune = ">=2.0.3,<4" +nbclient = ">=0.5.0" +nbformat = ">=5.7" +packaging = "*" +pandocfilters = ">=1.4.1" +pygments = ">=2.4.1" +traitlets = ">=5.1" + +[package.extras] +all = ["flaky", "intersphinx-registry", "ipykernel", "ipython", "ipywidgets (>=7.5)", "myst-parser", "nbsphinx (>=0.2.12)", "playwright", "pydata-sphinx-theme", "pyqtwebengine (>=5.15)", "pytest (>=7)", "sphinx (>=5.0.2)", "sphinxcontrib-spelling", "tornado (>=6.1)"] +docs = ["intersphinx-registry", "ipykernel", "ipython", "myst-parser", "nbsphinx (>=0.2.12)", "pydata-sphinx-theme", "sphinx (>=5.0.2)", "sphinxcontrib-spelling"] +qtpdf = ["pyqtwebengine (>=5.15)"] +qtpng = ["pyqtwebengine (>=5.15)"] +serve = ["tornado (>=6.1)"] +test = ["flaky", "ipykernel", "ipywidgets (>=7.5)", "pytest (>=7)"] +webpdf = ["playwright"] + +[[package]] +name = "nbformat" +version = "5.10.4" +description = "The Jupyter Notebook format" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "nbformat-5.10.4-py3-none-any.whl", hash = "sha256:3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b"}, + {file = "nbformat-5.10.4.tar.gz", hash = "sha256:322168b14f937a5d11362988ecac2a4952d3d8e3a2cbeb2319584631226d5b3a"}, +] + +[package.dependencies] +fastjsonschema = ">=2.15" +jsonschema = ">=2.6" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +traitlets = ">=5.1" + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] +test = ["pep440", "pre-commit", "pytest", "testpath"] + +[[package]] +name = "nest-asyncio" +version = "1.6.0" +description = "Patch asyncio to allow nested event loops" +optional = false +python-versions = ">=3.5" +groups = ["dev"] +files = [ + {file = "nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c"}, + {file = "nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe"}, +] + [[package]] name = "networkx" version = "3.6" @@ -1597,6 +2540,7 @@ description = "Python package for creating and manipulating graphs and networks" optional = false python-versions = ">=3.11" groups = ["dev"] +markers = "python_version >= \"3.14\"" files = [ {file = "networkx-3.6-py3-none-any.whl", hash = "sha256:cdb395b105806062473d3be36458d8f1459a4e4b98e236a66c3a48996e07684f"}, {file = "networkx-3.6.tar.gz", hash = "sha256:285276002ad1f7f7da0f7b42f004bcba70d381e936559166363707fdad3d72ad"}, @@ -1613,6 +2557,30 @@ release = ["build (>=0.10)", "changelist (==0.5)", "twine (>=4.0)", "wheel (>=0. test = ["pytest (>=7.2)", "pytest-cov (>=4.0)", "pytest-xdist (>=3.0)"] test-extras = ["pytest-mpl", "pytest-randomly"] +[[package]] +name = "networkx" +version = "3.6.1" +description = "Python package for creating and manipulating graphs and networks" +optional = false +python-versions = "!=3.14.1,>=3.11" +groups = ["dev"] +markers = "python_version == \"3.13\"" +files = [ + {file = "networkx-3.6.1-py3-none-any.whl", hash = "sha256:d47fbf302e7d9cbbb9e2555a0d267983d2aa476bac30e90dfbe5669bd57f3762"}, + {file = "networkx-3.6.1.tar.gz", hash = "sha256:26b7c357accc0c8cde558ad486283728b65b6a95d85ee1cd66bafab4c8168509"}, +] + +[package.extras] +benchmarking = ["asv", "virtualenv"] +default = ["matplotlib (>=3.8)", "numpy (>=1.25)", "pandas (>=2.0)", "scipy (>=1.11.2)"] +developer = ["mypy (>=1.15)", "pre-commit (>=4.1)"] +doc = ["intersphinx-registry", "myst-nb (>=1.1)", "numpydoc (>=1.8.0)", "pillow (>=10)", "pydata-sphinx-theme (>=0.16)", "sphinx (>=8.0)", "sphinx-gallery (>=0.18)", "texext (>=0.6.7)"] +example = ["cairocffi (>=1.7)", "contextily (>=1.6)", "igraph (>=0.11)", "iplotx (>=0.9.0)", "momepy (>=0.7.2)", "osmnx (>=2.0.0)", "scikit-learn (>=1.5)", "seaborn (>=0.13)"] +extra = ["lxml (>=4.6)", "pydot (>=3.0.1)", "pygraphviz (>=1.14)", "sympy (>=1.10)"] +release = ["build (>=0.10)", "changelist (==0.5)", "twine (>=4.0)", "wheel (>=0.40)"] +test = ["pytest (>=7.2)", "pytest-cov (>=4.0)", "pytest-xdist (>=3.0)"] +test-extras = ["pytest-mpl", "pytest-randomly"] + [[package]] name = "nodeenv" version = "1.10.0" @@ -1625,6 +2593,24 @@ files = [ {file = "nodeenv-1.10.0.tar.gz", hash = "sha256:996c191ad80897d076bdfba80a41994c2b47c68e224c542b48feba42ba00f8bb"}, ] +[[package]] +name = "notebook-shim" +version = "0.2.4" +description = "A shim layer for notebook traits and config" +optional = false +python-versions = ">=3.7" +groups = ["dev"] +files = [ + {file = "notebook_shim-0.2.4-py3-none-any.whl", hash = "sha256:411a5be4e9dc882a074ccbcae671eda64cceb068767e9a3419096986560e1cef"}, + {file = "notebook_shim-0.2.4.tar.gz", hash = "sha256:b4b2cfa1b65d98307ca24361f5b30fe785b53c3fd07b7a47e89acb5e6ac638cb"}, +] + +[package.dependencies] +jupyter-server = ">=1.8,<3" + +[package.extras] +test = ["pytest", "pytest-console-scripts", "pytest-jupyter", "pytest-tornasync"] + [[package]] name = "packageurl-python" version = "0.17.6" @@ -1655,6 +2641,34 @@ files = [ {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, ] +[[package]] +name = "pandocfilters" +version = "1.5.1" +description = "Utilities for writing pandoc filters in python" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +groups = ["dev"] +files = [ + {file = "pandocfilters-1.5.1-py2.py3-none-any.whl", hash = "sha256:93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc"}, + {file = "pandocfilters-1.5.1.tar.gz", hash = "sha256:002b4a555ee4ebc03f8b66307e287fa492e4a77b4ea14d3f934328297bb4939e"}, +] + +[[package]] +name = "parso" +version = "0.8.6" +description = "A Python Parser" +optional = false +python-versions = ">=3.6" +groups = ["dev"] +files = [ + {file = "parso-0.8.6-py2.py3-none-any.whl", hash = "sha256:2c549f800b70a5c4952197248825584cb00f033b29c692671d3bf08bf380baff"}, + {file = "parso-0.8.6.tar.gz", hash = "sha256:2b9a0332696df97d454fa67b81618fd69c35a7b90327cbe6ba5c92d2c68a7bfd"}, +] + +[package.extras] +qa = ["flake8 (==5.0.4)", "types-setuptools (==67.2.0.1)", "zuban (==0.5.1)"] +testing = ["docopt", "pytest"] + [[package]] name = "pathspec" version = "1.0.4" @@ -1663,15 +2677,31 @@ optional = false python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "pathspec-1.0.4-py3-none-any.whl", hash = "sha256:fb6ae2fd4e7c921a165808a552060e722767cfa526f99ca5156ed2ce45a5c723"}, - {file = "pathspec-1.0.4.tar.gz", hash = "sha256:0210e2ae8a21a9137c0d470578cb0e595af87edaa6ebf12ff176f14a02e0e645"}, + {file = "pathspec-1.0.4-py3-none-any.whl", hash = "sha256:fb6ae2fd4e7c921a165808a552060e722767cfa526f99ca5156ed2ce45a5c723"}, + {file = "pathspec-1.0.4.tar.gz", hash = "sha256:0210e2ae8a21a9137c0d470578cb0e595af87edaa6ebf12ff176f14a02e0e645"}, +] + +[package.extras] +hyperscan = ["hyperscan (>=0.7)"] +optional = ["typing-extensions (>=4)"] +re2 = ["google-re2 (>=1.1)"] +tests = ["pytest (>=9)", "typing-extensions (>=4.15)"] + +[[package]] +name = "pexpect" +version = "4.9.0" +description = "Pexpect allows easy control of interactive console applications." +optional = false +python-versions = "*" +groups = ["dev"] +markers = "sys_platform != \"win32\" and sys_platform != \"emscripten\"" +files = [ + {file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"}, + {file = "pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"}, ] -[package.extras] -hyperscan = ["hyperscan (>=0.7)"] -optional = ["typing-extensions (>=4)"] -re2 = ["google-re2 (>=1.1)"] -tests = ["pytest (>=9)", "typing-extensions (>=4.15)"] +[package.dependencies] +ptyprocess = ">=0.5" [[package]] name = "pip" @@ -1798,6 +2828,38 @@ nodeenv = ">=0.11.1" pyyaml = ">=5.1" virtualenv = ">=20.10.0" +[[package]] +name = "prometheus-client" +version = "0.24.1" +description = "Python client for the Prometheus monitoring system." +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "prometheus_client-0.24.1-py3-none-any.whl", hash = "sha256:150db128af71a5c2482b36e588fc8a6b95e498750da4b17065947c16070f4055"}, + {file = "prometheus_client-0.24.1.tar.gz", hash = "sha256:7e0ced7fbbd40f7b84962d5d2ab6f17ef88a72504dcf7c0b40737b43b2a461f9"}, +] + +[package.extras] +aiohttp = ["aiohttp"] +django = ["django"] +twisted = ["twisted"] + +[[package]] +name = "prompt-toolkit" +version = "3.0.52" +description = "Library for building powerful interactive command lines in Python" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "prompt_toolkit-3.0.52-py3-none-any.whl", hash = "sha256:9aac639a3bbd33284347de5ad8d68ecc044b91a762dc39b7c21095fcd6a19955"}, + {file = "prompt_toolkit-3.0.52.tar.gz", hash = "sha256:28cde192929c8e7321de85de1ddbe736f1375148b02f2e17edd840042b1be855"}, +] + +[package.dependencies] +wcwidth = "*" + [[package]] name = "propcache" version = "0.4.1" @@ -1930,6 +2992,69 @@ files = [ {file = "propcache-0.4.1.tar.gz", hash = "sha256:f48107a8c637e80362555f37ecf49abe20370e557cc4ab374f04ec4423c97c3d"}, ] +[[package]] +name = "psutil" +version = "7.2.2" +description = "Cross-platform lib for process and system monitoring." +optional = false +python-versions = ">=3.6" +groups = ["dev"] +files = [ + {file = "psutil-7.2.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2edccc433cbfa046b980b0df0171cd25bcaeb3a68fe9022db0979e7aa74a826b"}, + {file = "psutil-7.2.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e78c8603dcd9a04c7364f1a3e670cea95d51ee865e4efb3556a3a63adef958ea"}, + {file = "psutil-7.2.2-cp313-cp313t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1a571f2330c966c62aeda00dd24620425d4b0cc86881c89861fbc04549e5dc63"}, + {file = "psutil-7.2.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:917e891983ca3c1887b4ef36447b1e0873e70c933afc831c6b6da078ba474312"}, + {file = "psutil-7.2.2-cp313-cp313t-win_amd64.whl", hash = "sha256:ab486563df44c17f5173621c7b198955bd6b613fb87c71c161f827d3fb149a9b"}, + {file = "psutil-7.2.2-cp313-cp313t-win_arm64.whl", hash = "sha256:ae0aefdd8796a7737eccea863f80f81e468a1e4cf14d926bd9b6f5f2d5f90ca9"}, + {file = "psutil-7.2.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:eed63d3b4d62449571547b60578c5b2c4bcccc5387148db46e0c2313dad0ee00"}, + {file = "psutil-7.2.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7b6d09433a10592ce39b13d7be5a54fbac1d1228ed29abc880fb23df7cb694c9"}, + {file = "psutil-7.2.2-cp314-cp314t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1fa4ecf83bcdf6e6c8f4449aff98eefb5d0604bf88cb883d7da3d8d2d909546a"}, + {file = "psutil-7.2.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e452c464a02e7dc7822a05d25db4cde564444a67e58539a00f929c51eddda0cf"}, + {file = "psutil-7.2.2-cp314-cp314t-win_amd64.whl", hash = "sha256:c7663d4e37f13e884d13994247449e9f8f574bc4655d509c3b95e9ec9e2b9dc1"}, + {file = "psutil-7.2.2-cp314-cp314t-win_arm64.whl", hash = "sha256:11fe5a4f613759764e79c65cf11ebdf26e33d6dd34336f8a337aa2996d71c841"}, + {file = "psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ed0cace939114f62738d808fdcecd4c869222507e266e574799e9c0faa17d486"}, + {file = "psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:1a7b04c10f32cc88ab39cbf606e117fd74721c831c98a27dc04578deb0c16979"}, + {file = "psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:076a2d2f923fd4821644f5ba89f059523da90dc9014e85f8e45a5774ca5bc6f9"}, + {file = "psutil-7.2.2-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b0726cecd84f9474419d67252add4ac0cd9811b04d61123054b9fb6f57df6e9e"}, + {file = "psutil-7.2.2-cp36-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fd04ef36b4a6d599bbdb225dd1d3f51e00105f6d48a28f006da7f9822f2606d8"}, + {file = "psutil-7.2.2-cp36-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b58fabe35e80b264a4e3bb23e6b96f9e45a3df7fb7eed419ac0e5947c61e47cc"}, + {file = "psutil-7.2.2-cp37-abi3-win_amd64.whl", hash = "sha256:eb7e81434c8d223ec4a219b5fc1c47d0417b12be7ea866e24fb5ad6e84b3d988"}, + {file = "psutil-7.2.2-cp37-abi3-win_arm64.whl", hash = "sha256:8c233660f575a5a89e6d4cb65d9f938126312bca76d8fe087b947b3a1aaac9ee"}, + {file = "psutil-7.2.2.tar.gz", hash = "sha256:0746f5f8d406af344fd547f1c8daa5f5c33dbc293bb8d6a16d80b4bb88f59372"}, +] + +[package.extras] +dev = ["abi3audit", "black", "check-manifest", "colorama ; os_name == \"nt\"", "coverage", "packaging", "psleak", "pylint", "pyperf", "pypinfo", "pyreadline3 ; os_name == \"nt\"", "pytest", "pytest-cov", "pytest-instafail", "pytest-xdist", "pywin32 ; os_name == \"nt\" and implementation_name != \"pypy\"", "requests", "rstcheck", "ruff", "setuptools", "sphinx", "sphinx_rtd_theme", "toml-sort", "twine", "validate-pyproject[all]", "virtualenv", "vulture", "wheel", "wheel ; os_name == \"nt\" and implementation_name != \"pypy\"", "wmi ; os_name == \"nt\" and implementation_name != \"pypy\""] +test = ["psleak", "pytest", "pytest-instafail", "pytest-xdist", "pywin32 ; os_name == \"nt\" and implementation_name != \"pypy\"", "setuptools", "wheel ; os_name == \"nt\" and implementation_name != \"pypy\"", "wmi ; os_name == \"nt\" and implementation_name != \"pypy\""] + +[[package]] +name = "ptyprocess" +version = "0.7.0" +description = "Run a subprocess in a pseudo terminal" +optional = false +python-versions = "*" +groups = ["dev"] +markers = "sys_platform != \"win32\" and sys_platform != \"emscripten\" or os_name != \"nt\"" +files = [ + {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, + {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, +] + +[[package]] +name = "pure-eval" +version = "0.2.3" +description = "Safely evaluate AST nodes without side effects" +optional = false +python-versions = "*" +groups = ["dev"] +files = [ + {file = "pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0"}, + {file = "pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42"}, +] + +[package.extras] +tests = ["pytest"] + [[package]] name = "puyapy" version = "5.7.1" @@ -1995,11 +3120,11 @@ description = "C parser in Python" optional = false python-versions = ">=3.10" groups = ["main", "dev"] -markers = "platform_python_implementation != \"PyPy\" and implementation_name != \"PyPy\"" files = [ {file = "pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992"}, {file = "pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29"}, ] +markers = {main = "platform_python_implementation != \"PyPy\" and implementation_name != \"PyPy\"", dev = "implementation_name != \"PyPy\""} [[package]] name = "pycryptodomex" @@ -2205,6 +3330,21 @@ termcolor = ">=2.1.0" [package.extras] dev = ["black", "flake8", "pre-commit"] +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +description = "Extensions to the standard Python datetime module" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +groups = ["dev"] +files = [ + {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, + {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, +] + +[package.dependencies] +six = ">=1.5" + [[package]] name = "python-discovery" version = "1.1.3" @@ -2240,6 +3380,21 @@ files = [ [package.extras] cli = ["click (>=5.0)"] +[[package]] +name = "python-json-logger" +version = "4.0.0" +description = "JSON Log Formatter for the Python Logging Package" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "python_json_logger-4.0.0-py3-none-any.whl", hash = "sha256:af09c9daf6a813aa4cc7180395f50f2a9e5fa056034c9953aec92e381c5ba1e2"}, + {file = "python_json_logger-4.0.0.tar.gz", hash = "sha256:f58e68eb46e1faed27e0f574a55a0455eecd7b8a5b88b85a784519ba3cff047f"}, +] + +[package.extras] +dev = ["backports.zoneinfo ; python_version < \"3.9\"", "black", "build", "freezegun", "mdx_truly_sane_lists", "mike", "mkdocs", "mkdocs-awesome-pages-plugin", "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-material (>=8.5)", "mkdocstrings[python]", "msgspec ; implementation_name != \"pypy\"", "mypy", "orjson ; implementation_name != \"pypy\"", "pylint", "pytest", "tzdata", "validate-pyproject[all]"] + [[package]] name = "pytokens" version = "0.4.1" @@ -2295,6 +3450,33 @@ files = [ [package.extras] dev = ["black", "build", "mypy", "pytest", "pytest-cov", "setuptools", "tox", "twine", "wheel"] +[[package]] +name = "pywinpty" +version = "3.0.3" +description = "Pseudo terminal support for Windows from Python." +optional = false +python-versions = ">=3.9" +groups = ["dev"] +markers = "os_name == \"nt\"" +files = [ + {file = "pywinpty-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:ff05f12d775b142b11c6fe085129bdd759b61cf7d41da6c745e78e3a1ef5bf40"}, + {file = "pywinpty-3.0.3-cp310-cp310-win_arm64.whl", hash = "sha256:340ccacb4d74278a631923794ccd758471cfc8eeeeee4610b280420a17ad1e82"}, + {file = "pywinpty-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:dff25a9a6435f527d7c65608a7e62783fc12076e7d44487a4911ee91be5a8ac8"}, + {file = "pywinpty-3.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:fbc1e230e5b193eef4431cba3f39996a288f9958f9c9f092c8a961d930ee8f68"}, + {file = "pywinpty-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:c9081df0e49ffa86d15db4a6ba61530630e48707f987df42c9d3313537e81fc0"}, + {file = "pywinpty-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:15e79d870e18b678fb8a5a6105fd38496b55697c66e6fc0378236026bc4d59e9"}, + {file = "pywinpty-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:9c91dbb026050c77bdcef964e63a4f10f01a639113c4d3658332614544c467ab"}, + {file = "pywinpty-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:fe1f7911805127c94cf51f89ab14096c6f91ffdcacf993d2da6082b2142a2523"}, + {file = "pywinpty-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:3f07a6cf1c1d470d284e614733c3d0f726d2c85e78508ea10a403140c3c0c18a"}, + {file = "pywinpty-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:15c7c0b6f8e9d87aabbaff76468dabf6e6121332c40fc1d83548d02a9d6a3759"}, + {file = "pywinpty-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:d4b6b7b0fe0cdcd02e956bd57cfe9f4e5a06514eecf3b5ae174da4f951b58be9"}, + {file = "pywinpty-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:34789d685fc0d547ce0c8a65e5a70e56f77d732fa6e03c8f74fefb8cbb252019"}, + {file = "pywinpty-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:0c37e224a47a971d1a6e08649a1714dac4f63c11920780977829ed5c8cadead1"}, + {file = "pywinpty-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:c4e9c3dff7d86ba81937438d5819f19f385a39d8f592d4e8af67148ceb4f6ab5"}, + {file = "pywinpty-3.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:0f10e81d52d7f2c4d927f645f247028e64eaf205a3ed9e64dbd998122108a218"}, + {file = "pywinpty-3.0.3.tar.gz", hash = "sha256:523441dc34d231fb361b4b00f8c99d3f16de02f5005fd544a0183112bcc22412"}, +] + [[package]] name = "pyyaml" version = "6.0.3" @@ -2378,6 +3560,127 @@ files = [ {file = "pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f"}, ] +[[package]] +name = "pyzmq" +version = "27.1.0" +description = "Python bindings for 0MQ" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "pyzmq-27.1.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:508e23ec9bc44c0005c4946ea013d9317ae00ac67778bd47519fdf5a0e930ff4"}, + {file = "pyzmq-27.1.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:507b6f430bdcf0ee48c0d30e734ea89ce5567fd7b8a0f0044a369c176aa44556"}, + {file = "pyzmq-27.1.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bf7b38f9fd7b81cb6d9391b2946382c8237fd814075c6aa9c3b746d53076023b"}, + {file = "pyzmq-27.1.0-cp310-cp310-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:03ff0b279b40d687691a6217c12242ee71f0fba28bf8626ff50e3ef0f4410e1e"}, + {file = "pyzmq-27.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:677e744fee605753eac48198b15a2124016c009a11056f93807000ab11ce6526"}, + {file = "pyzmq-27.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:dd2fec2b13137416a1c5648b7009499bcc8fea78154cd888855fa32514f3dad1"}, + {file = "pyzmq-27.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:08e90bb4b57603b84eab1d0ca05b3bbb10f60c1839dc471fc1c9e1507bef3386"}, + {file = "pyzmq-27.1.0-cp310-cp310-win32.whl", hash = "sha256:a5b42d7a0658b515319148875fcb782bbf118dd41c671b62dae33666c2213bda"}, + {file = "pyzmq-27.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:c0bb87227430ee3aefcc0ade2088100e528d5d3298a0a715a64f3d04c60ba02f"}, + {file = "pyzmq-27.1.0-cp310-cp310-win_arm64.whl", hash = "sha256:9a916f76c2ab8d045b19f2286851a38e9ac94ea91faf65bd64735924522a8b32"}, + {file = "pyzmq-27.1.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:226b091818d461a3bef763805e75685e478ac17e9008f49fce2d3e52b3d58b86"}, + {file = "pyzmq-27.1.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:0790a0161c281ca9723f804871b4027f2e8b5a528d357c8952d08cd1a9c15581"}, + {file = "pyzmq-27.1.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c895a6f35476b0c3a54e3eb6ccf41bf3018de937016e6e18748317f25d4e925f"}, + {file = "pyzmq-27.1.0-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5bbf8d3630bf96550b3be8e1fc0fea5cbdc8d5466c1192887bd94869da17a63e"}, + {file = "pyzmq-27.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:15c8bd0fe0dabf808e2d7a681398c4e5ded70a551ab47482067a572c054c8e2e"}, + {file = "pyzmq-27.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:bafcb3dd171b4ae9f19ee6380dfc71ce0390fefaf26b504c0e5f628d7c8c54f2"}, + {file = "pyzmq-27.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e829529fcaa09937189178115c49c504e69289abd39967cd8a4c215761373394"}, + {file = "pyzmq-27.1.0-cp311-cp311-win32.whl", hash = "sha256:6df079c47d5902af6db298ec92151db82ecb557af663098b92f2508c398bb54f"}, + {file = "pyzmq-27.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:190cbf120fbc0fc4957b56866830def56628934a9d112aec0e2507aa6a032b97"}, + {file = "pyzmq-27.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:eca6b47df11a132d1745eb3b5b5e557a7dae2c303277aa0e69c6ba91b8736e07"}, + {file = "pyzmq-27.1.0-cp312-abi3-macosx_10_15_universal2.whl", hash = "sha256:452631b640340c928fa343801b0d07eb0c3789a5ffa843f6e1a9cee0ba4eb4fc"}, + {file = "pyzmq-27.1.0-cp312-abi3-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1c179799b118e554b66da67d88ed66cd37a169f1f23b5d9f0a231b4e8d44a113"}, + {file = "pyzmq-27.1.0-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3837439b7f99e60312f0c926a6ad437b067356dc2bc2ec96eb395fd0fe804233"}, + {file = "pyzmq-27.1.0-cp312-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:43ad9a73e3da1fab5b0e7e13402f0b2fb934ae1c876c51d0afff0e7c052eca31"}, + {file = "pyzmq-27.1.0-cp312-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:0de3028d69d4cdc475bfe47a6128eb38d8bc0e8f4d69646adfbcd840facbac28"}, + {file = "pyzmq-27.1.0-cp312-abi3-musllinux_1_2_i686.whl", hash = "sha256:cf44a7763aea9298c0aa7dbf859f87ed7012de8bda0f3977b6fb1d96745df856"}, + {file = "pyzmq-27.1.0-cp312-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:f30f395a9e6fbca195400ce833c731e7b64c3919aa481af4d88c3759e0cb7496"}, + {file = "pyzmq-27.1.0-cp312-abi3-win32.whl", hash = "sha256:250e5436a4ba13885494412b3da5d518cd0d3a278a1ae640e113c073a5f88edd"}, + {file = "pyzmq-27.1.0-cp312-abi3-win_amd64.whl", hash = "sha256:9ce490cf1d2ca2ad84733aa1d69ce6855372cb5ce9223802450c9b2a7cba0ccf"}, + {file = "pyzmq-27.1.0-cp312-abi3-win_arm64.whl", hash = "sha256:75a2f36223f0d535a0c919e23615fc85a1e23b71f40c7eb43d7b1dedb4d8f15f"}, + {file = "pyzmq-27.1.0-cp313-cp313-android_24_arm64_v8a.whl", hash = "sha256:93ad4b0855a664229559e45c8d23797ceac03183c7b6f5b4428152a6b06684a5"}, + {file = "pyzmq-27.1.0-cp313-cp313-android_24_x86_64.whl", hash = "sha256:fbb4f2400bfda24f12f009cba62ad5734148569ff4949b1b6ec3b519444342e6"}, + {file = "pyzmq-27.1.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:e343d067f7b151cfe4eb3bb796a7752c9d369eed007b91231e817071d2c2fec7"}, + {file = "pyzmq-27.1.0-cp313-cp313t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:08363b2011dec81c354d694bdecaef4770e0ae96b9afea70b3f47b973655cc05"}, + {file = "pyzmq-27.1.0-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d54530c8c8b5b8ddb3318f481297441af102517602b569146185fa10b63f4fa9"}, + {file = "pyzmq-27.1.0-cp313-cp313t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6f3afa12c392f0a44a2414056d730eebc33ec0926aae92b5ad5cf26ebb6cc128"}, + {file = "pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c65047adafe573ff023b3187bb93faa583151627bc9c51fc4fb2c561ed689d39"}, + {file = "pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:90e6e9441c946a8b0a667356f7078d96411391a3b8f80980315455574177ec97"}, + {file = "pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:add071b2d25f84e8189aaf0882d39a285b42fa3853016ebab234a5e78c7a43db"}, + {file = "pyzmq-27.1.0-cp313-cp313t-win32.whl", hash = "sha256:7ccc0700cfdf7bd487bea8d850ec38f204478681ea02a582a8da8171b7f90a1c"}, + {file = "pyzmq-27.1.0-cp313-cp313t-win_amd64.whl", hash = "sha256:8085a9fba668216b9b4323be338ee5437a235fe275b9d1610e422ccc279733e2"}, + {file = "pyzmq-27.1.0-cp313-cp313t-win_arm64.whl", hash = "sha256:6bb54ca21bcfe361e445256c15eedf083f153811c37be87e0514934d6913061e"}, + {file = "pyzmq-27.1.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:ce980af330231615756acd5154f29813d553ea555485ae712c491cd483df6b7a"}, + {file = "pyzmq-27.1.0-cp314-cp314t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1779be8c549e54a1c38f805e56d2a2e5c009d26de10921d7d51cfd1c8d4632ea"}, + {file = "pyzmq-27.1.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7200bb0f03345515df50d99d3db206a0a6bee1955fbb8c453c76f5bf0e08fb96"}, + {file = "pyzmq-27.1.0-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01c0e07d558b06a60773744ea6251f769cd79a41a97d11b8bf4ab8f034b0424d"}, + {file = "pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:80d834abee71f65253c91540445d37c4c561e293ba6e741b992f20a105d69146"}, + {file = "pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:544b4e3b7198dde4a62b8ff6685e9802a9a1ebf47e77478a5eb88eca2a82f2fd"}, + {file = "pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cedc4c68178e59a4046f97eca31b148ddcf51e88677de1ef4e78cf06c5376c9a"}, + {file = "pyzmq-27.1.0-cp314-cp314t-win32.whl", hash = "sha256:1f0b2a577fd770aa6f053211a55d1c47901f4d537389a034c690291485e5fe92"}, + {file = "pyzmq-27.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:19c9468ae0437f8074af379e986c5d3d7d7bfe033506af442e8c879732bedbe0"}, + {file = "pyzmq-27.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:dc5dbf68a7857b59473f7df42650c621d7e8923fb03fa74a526890f4d33cc4d7"}, + {file = "pyzmq-27.1.0-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:18339186c0ed0ce5835f2656cdfb32203125917711af64da64dbaa3d949e5a1b"}, + {file = "pyzmq-27.1.0-cp38-cp38-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:753d56fba8f70962cd8295fb3edb40b9b16deaa882dd2b5a3a2039f9ff7625aa"}, + {file = "pyzmq-27.1.0-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b721c05d932e5ad9ff9344f708c96b9e1a485418c6618d765fca95d4daacfbef"}, + {file = "pyzmq-27.1.0-cp38-cp38-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7be883ff3d722e6085ee3f4afc057a50f7f2e0c72d289fd54df5706b4e3d3a50"}, + {file = "pyzmq-27.1.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:b2e592db3a93128daf567de9650a2f3859017b3f7a66bc4ed6e4779d6034976f"}, + {file = "pyzmq-27.1.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ad68808a61cbfbbae7ba26d6233f2a4aa3b221de379ce9ee468aa7a83b9c36b0"}, + {file = "pyzmq-27.1.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:e2687c2d230e8d8584fbea433c24382edfeda0c60627aca3446aa5e58d5d1831"}, + {file = "pyzmq-27.1.0-cp38-cp38-win32.whl", hash = "sha256:a1aa0ee920fb3825d6c825ae3f6c508403b905b698b6460408ebd5bb04bbb312"}, + {file = "pyzmq-27.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:df7cd397ece96cf20a76fae705d40efbab217d217897a5053267cd88a700c266"}, + {file = "pyzmq-27.1.0-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:96c71c32fff75957db6ae33cd961439f386505c6e6b377370af9b24a1ef9eafb"}, + {file = "pyzmq-27.1.0-cp39-cp39-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:49d3980544447f6bd2968b6ac913ab963a49dcaa2d4a2990041f16057b04c429"}, + {file = "pyzmq-27.1.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:849ca054d81aa1c175c49484afaaa5db0622092b5eccb2055f9f3bb8f703782d"}, + {file = "pyzmq-27.1.0-cp39-cp39-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3970778e74cb7f85934d2b926b9900e92bfe597e62267d7499acc39c9c28e345"}, + {file = "pyzmq-27.1.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:da96ecdcf7d3919c3be2de91a8c513c186f6762aa6cf7c01087ed74fad7f0968"}, + {file = "pyzmq-27.1.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:9541c444cfe1b1c0156c5c86ece2bb926c7079a18e7b47b0b1b3b1b875e5d098"}, + {file = "pyzmq-27.1.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e30a74a39b93e2e1591b58eb1acef4902be27c957a8720b0e368f579b82dc22f"}, + {file = "pyzmq-27.1.0-cp39-cp39-win32.whl", hash = "sha256:b1267823d72d1e40701dcba7edc45fd17f71be1285557b7fe668887150a14b78"}, + {file = "pyzmq-27.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:0c996ded912812a2fcd7ab6574f4ad3edc27cb6510349431e4930d4196ade7db"}, + {file = "pyzmq-27.1.0-cp39-cp39-win_arm64.whl", hash = "sha256:346e9ba4198177a07e7706050f35d733e08c1c1f8ceacd5eb6389d653579ffbc"}, + {file = "pyzmq-27.1.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:c17e03cbc9312bee223864f1a2b13a99522e0dc9f7c5df0177cd45210ac286e6"}, + {file = "pyzmq-27.1.0-pp310-pypy310_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:f328d01128373cb6763823b2b4e7f73bdf767834268c565151eacb3b7a392f90"}, + {file = "pyzmq-27.1.0-pp310-pypy310_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9c1790386614232e1b3a40a958454bdd42c6d1811837b15ddbb052a032a43f62"}, + {file = "pyzmq-27.1.0-pp310-pypy310_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:448f9cb54eb0cee4732b46584f2710c8bc178b0e5371d9e4fc8125201e413a74"}, + {file = "pyzmq-27.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:05b12f2d32112bf8c95ef2e74ec4f1d4beb01f8b5e703b38537f8849f92cb9ba"}, + {file = "pyzmq-27.1.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:18770c8d3563715387139060d37859c02ce40718d1faf299abddcdcc6a649066"}, + {file = "pyzmq-27.1.0-pp311-pypy311_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:ac25465d42f92e990f8d8b0546b01c391ad431c3bf447683fdc40565941d0604"}, + {file = "pyzmq-27.1.0-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:53b40f8ae006f2734ee7608d59ed661419f087521edbfc2149c3932e9c14808c"}, + {file = "pyzmq-27.1.0-pp311-pypy311_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f605d884e7c8be8fe1aa94e0a783bf3f591b84c24e4bc4f3e7564c82ac25e271"}, + {file = "pyzmq-27.1.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:c9f7f6e13dff2e44a6afeaf2cf54cee5929ad64afaf4d40b50f93c58fc687355"}, + {file = "pyzmq-27.1.0-pp38-pypy38_pp73-macosx_10_15_x86_64.whl", hash = "sha256:50081a4e98472ba9f5a02850014b4c9b629da6710f8f14f3b15897c666a28f1b"}, + {file = "pyzmq-27.1.0-pp38-pypy38_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:510869f9df36ab97f89f4cff9d002a89ac554c7ac9cadd87d444aa4cf66abd27"}, + {file = "pyzmq-27.1.0-pp38-pypy38_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1f8426a01b1c4098a750973c37131cf585f61c7911d735f729935a0c701b68d3"}, + {file = "pyzmq-27.1.0-pp38-pypy38_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:726b6a502f2e34c6d2ada5e702929586d3ac948a4dbbb7fed9854ec8c0466027"}, + {file = "pyzmq-27.1.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:bd67e7c8f4654bef471c0b1ca6614af0b5202a790723a58b79d9584dc8022a78"}, + {file = "pyzmq-27.1.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:722ea791aa233ac0a819fc2c475e1292c76930b31f1d828cb61073e2fe5e208f"}, + {file = "pyzmq-27.1.0-pp39-pypy39_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:01f9437501886d3a1dd4b02ef59fb8cc384fa718ce066d52f175ee49dd5b7ed8"}, + {file = "pyzmq-27.1.0-pp39-pypy39_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4a19387a3dddcc762bfd2f570d14e2395b2c9701329b266f83dd87a2b3cbd381"}, + {file = "pyzmq-27.1.0-pp39-pypy39_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4c618fbcd069e3a29dcd221739cacde52edcc681f041907867e0f5cc7e85f172"}, + {file = "pyzmq-27.1.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ff8d114d14ac671d88c89b9224c63d6c4e5a613fe8acd5594ce53d752a3aafe9"}, + {file = "pyzmq-27.1.0.tar.gz", hash = "sha256:ac0765e3d44455adb6ddbf4417dcce460fc40a05978c08efdf2948072f6db540"}, +] + +[package.dependencies] +cffi = {version = "*", markers = "implementation_name == \"pypy\""} + +[[package]] +name = "referencing" +version = "0.37.0" +description = "JSON Referencing + Python" +optional = false +python-versions = ">=3.10" +groups = ["dev"] +files = [ + {file = "referencing-0.37.0-py3-none-any.whl", hash = "sha256:381329a9f99628c9069361716891d34ad94af76e461dcb0335825aecc7692231"}, + {file = "referencing-0.37.0.tar.gz", hash = "sha256:44aefc3142c5b842538163acb373e24cce6632bd54bdb01b21ad5863489f50d8"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +rpds-py = ">=0.7.0" + [[package]] name = "requests" version = "2.32.5" @@ -2400,6 +3703,51 @@ urllib3 = ">=1.21.1,<3" socks = ["PySocks (>=1.5.6,!=1.5.7)"] use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] +[[package]] +name = "rfc3339-validator" +version = "0.1.4" +description = "A pure python RFC3339 validator" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +groups = ["dev"] +files = [ + {file = "rfc3339_validator-0.1.4-py2.py3-none-any.whl", hash = "sha256:24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa"}, + {file = "rfc3339_validator-0.1.4.tar.gz", hash = "sha256:138a2abdf93304ad60530167e51d2dfb9549521a836871b88d7f4695d0022f6b"}, +] + +[package.dependencies] +six = "*" + +[[package]] +name = "rfc3986-validator" +version = "0.1.1" +description = "Pure python rfc3986 validator" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +groups = ["dev"] +files = [ + {file = "rfc3986_validator-0.1.1-py2.py3-none-any.whl", hash = "sha256:2f235c432ef459970b4306369336b9d5dbdda31b510ca1e327636e01f528bfa9"}, + {file = "rfc3986_validator-0.1.1.tar.gz", hash = "sha256:3d44bde7921b3b9ec3ae4e3adca370438eccebc676456449b145d533b240d055"}, +] + +[[package]] +name = "rfc3987-syntax" +version = "1.1.0" +description = "Helper functions to syntactically validate strings according to RFC 3987." +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "rfc3987_syntax-1.1.0-py3-none-any.whl", hash = "sha256:6c3d97604e4c5ce9f714898e05401a0445a641cfa276432b0a648c80856f6a3f"}, + {file = "rfc3987_syntax-1.1.0.tar.gz", hash = "sha256:717a62cbf33cffdd16dfa3a497d81ce48a660ea691b1ddd7be710c22f00b4a0d"}, +] + +[package.dependencies] +lark = ">=1.2.2" + +[package.extras] +testing = ["pytest (>=8.3.5)"] + [[package]] name = "rich" version = "14.3.3" @@ -2438,6 +3786,131 @@ rich = ">=12.0.0" [package.extras] docs = ["sphinx"] +[[package]] +name = "rpds-py" +version = "0.30.0" +description = "Python bindings to Rust's persistent data structures (rpds)" +optional = false +python-versions = ">=3.10" +groups = ["dev"] +files = [ + {file = "rpds_py-0.30.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:679ae98e00c0e8d68a7fda324e16b90fd5260945b45d3b824c892cec9eea3288"}, + {file = "rpds_py-0.30.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4cc2206b76b4f576934f0ed374b10d7ca5f457858b157ca52064bdfc26b9fc00"}, + {file = "rpds_py-0.30.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:389a2d49eded1896c3d48b0136ead37c48e221b391c052fba3f4055c367f60a6"}, + {file = "rpds_py-0.30.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:32c8528634e1bf7121f3de08fa85b138f4e0dc47657866630611b03967f041d7"}, + {file = "rpds_py-0.30.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f207f69853edd6f6700b86efb84999651baf3789e78a466431df1331608e5324"}, + {file = "rpds_py-0.30.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:67b02ec25ba7a9e8fa74c63b6ca44cf5707f2fbfadae3ee8e7494297d56aa9df"}, + {file = "rpds_py-0.30.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c0e95f6819a19965ff420f65578bacb0b00f251fefe2c8b23347c37174271f3"}, + {file = "rpds_py-0.30.0-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:a452763cc5198f2f98898eb98f7569649fe5da666c2dc6b5ddb10fde5a574221"}, + {file = "rpds_py-0.30.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e0b65193a413ccc930671c55153a03ee57cecb49e6227204b04fae512eb657a7"}, + {file = "rpds_py-0.30.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:858738e9c32147f78b3ac24dc0edb6610000e56dc0f700fd5f651d0a0f0eb9ff"}, + {file = "rpds_py-0.30.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:da279aa314f00acbb803da1e76fa18666778e8a8f83484fba94526da5de2cba7"}, + {file = "rpds_py-0.30.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7c64d38fb49b6cdeda16ab49e35fe0da2e1e9b34bc38bd78386530f218b37139"}, + {file = "rpds_py-0.30.0-cp310-cp310-win32.whl", hash = "sha256:6de2a32a1665b93233cde140ff8b3467bdb9e2af2b91079f0333a0974d12d464"}, + {file = "rpds_py-0.30.0-cp310-cp310-win_amd64.whl", hash = "sha256:1726859cd0de969f88dc8673bdd954185b9104e05806be64bcd87badbe313169"}, + {file = "rpds_py-0.30.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a2bffea6a4ca9f01b3f8e548302470306689684e61602aa3d141e34da06cf425"}, + {file = "rpds_py-0.30.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dc4f992dfe1e2bc3ebc7444f6c7051b4bc13cd8e33e43511e8ffd13bf407010d"}, + {file = "rpds_py-0.30.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:422c3cb9856d80b09d30d2eb255d0754b23e090034e1deb4083f8004bd0761e4"}, + {file = "rpds_py-0.30.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:07ae8a593e1c3c6b82ca3292efbe73c30b61332fd612e05abee07c79359f292f"}, + {file = "rpds_py-0.30.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12f90dd7557b6bd57f40abe7747e81e0c0b119bef015ea7726e69fe550e394a4"}, + {file = "rpds_py-0.30.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:99b47d6ad9a6da00bec6aabe5a6279ecd3c06a329d4aa4771034a21e335c3a97"}, + {file = "rpds_py-0.30.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33f559f3104504506a44bb666b93a33f5d33133765b0c216a5bf2f1e1503af89"}, + {file = "rpds_py-0.30.0-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:946fe926af6e44f3697abbc305ea168c2c31d3e3ef1058cf68f379bf0335a78d"}, + {file = "rpds_py-0.30.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:495aeca4b93d465efde585977365187149e75383ad2684f81519f504f5c13038"}, + {file = "rpds_py-0.30.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d9a0ca5da0386dee0655b4ccdf46119df60e0f10da268d04fe7cc87886872ba7"}, + {file = "rpds_py-0.30.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8d6d1cc13664ec13c1b84241204ff3b12f9bb82464b8ad6e7a5d3486975c2eed"}, + {file = "rpds_py-0.30.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3896fa1be39912cf0757753826bc8bdc8ca331a28a7c4ae46b7a21280b06bb85"}, + {file = "rpds_py-0.30.0-cp311-cp311-win32.whl", hash = "sha256:55f66022632205940f1827effeff17c4fa7ae1953d2b74a8581baaefb7d16f8c"}, + {file = "rpds_py-0.30.0-cp311-cp311-win_amd64.whl", hash = "sha256:a51033ff701fca756439d641c0ad09a41d9242fa69121c7d8769604a0a629825"}, + {file = "rpds_py-0.30.0-cp311-cp311-win_arm64.whl", hash = "sha256:47b0ef6231c58f506ef0b74d44e330405caa8428e770fec25329ed2cb971a229"}, + {file = "rpds_py-0.30.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a161f20d9a43006833cd7068375a94d035714d73a172b681d8881820600abfad"}, + {file = "rpds_py-0.30.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6abc8880d9d036ecaafe709079969f56e876fcf107f7a8e9920ba6d5a3878d05"}, + {file = "rpds_py-0.30.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca28829ae5f5d569bb62a79512c842a03a12576375d5ece7d2cadf8abe96ec28"}, + {file = "rpds_py-0.30.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a1010ed9524c73b94d15919ca4d41d8780980e1765babf85f9a2f90d247153dd"}, + {file = "rpds_py-0.30.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f8d1736cfb49381ba528cd5baa46f82fdc65c06e843dab24dd70b63d09121b3f"}, + {file = "rpds_py-0.30.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d948b135c4693daff7bc2dcfc4ec57237a29bd37e60c2fabf5aff2bbacf3e2f1"}, + {file = "rpds_py-0.30.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47f236970bccb2233267d89173d3ad2703cd36a0e2a6e92d0560d333871a3d23"}, + {file = "rpds_py-0.30.0-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:2e6ecb5a5bcacf59c3f912155044479af1d0b6681280048b338b28e364aca1f6"}, + {file = "rpds_py-0.30.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a8fa71a2e078c527c3e9dc9fc5a98c9db40bcc8a92b4e8858e36d329f8684b51"}, + {file = "rpds_py-0.30.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:73c67f2db7bc334e518d097c6d1e6fed021bbc9b7d678d6cc433478365d1d5f5"}, + {file = "rpds_py-0.30.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:5ba103fb455be00f3b1c2076c9d4264bfcb037c976167a6047ed82f23153f02e"}, + {file = "rpds_py-0.30.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7cee9c752c0364588353e627da8a7e808a66873672bcb5f52890c33fd965b394"}, + {file = "rpds_py-0.30.0-cp312-cp312-win32.whl", hash = "sha256:1ab5b83dbcf55acc8b08fc62b796ef672c457b17dbd7820a11d6c52c06839bdf"}, + {file = "rpds_py-0.30.0-cp312-cp312-win_amd64.whl", hash = "sha256:a090322ca841abd453d43456ac34db46e8b05fd9b3b4ac0c78bcde8b089f959b"}, + {file = "rpds_py-0.30.0-cp312-cp312-win_arm64.whl", hash = "sha256:669b1805bd639dd2989b281be2cfd951c6121b65e729d9b843e9639ef1fd555e"}, + {file = "rpds_py-0.30.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:f83424d738204d9770830d35290ff3273fbb02b41f919870479fab14b9d303b2"}, + {file = "rpds_py-0.30.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e7536cd91353c5273434b4e003cbda89034d67e7710eab8761fd918ec6c69cf8"}, + {file = "rpds_py-0.30.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2771c6c15973347f50fece41fc447c054b7ac2ae0502388ce3b6738cd366e3d4"}, + {file = "rpds_py-0.30.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0a59119fc6e3f460315fe9d08149f8102aa322299deaa5cab5b40092345c2136"}, + {file = "rpds_py-0.30.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:76fec018282b4ead0364022e3c54b60bf368b9d926877957a8624b58419169b7"}, + {file = "rpds_py-0.30.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:692bef75a5525db97318e8cd061542b5a79812d711ea03dbc1f6f8dbb0c5f0d2"}, + {file = "rpds_py-0.30.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9027da1ce107104c50c81383cae773ef5c24d296dd11c99e2629dbd7967a20c6"}, + {file = "rpds_py-0.30.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:9cf69cdda1f5968a30a359aba2f7f9aa648a9ce4b580d6826437f2b291cfc86e"}, + {file = "rpds_py-0.30.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a4796a717bf12b9da9d3ad002519a86063dcac8988b030e405704ef7d74d2d9d"}, + {file = "rpds_py-0.30.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5d4c2aa7c50ad4728a094ebd5eb46c452e9cb7edbfdb18f9e1221f597a73e1e7"}, + {file = "rpds_py-0.30.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ba81a9203d07805435eb06f536d95a266c21e5b2dfbf6517748ca40c98d19e31"}, + {file = "rpds_py-0.30.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:945dccface01af02675628334f7cf49c2af4c1c904748efc5cf7bbdf0b579f95"}, + {file = "rpds_py-0.30.0-cp313-cp313-win32.whl", hash = "sha256:b40fb160a2db369a194cb27943582b38f79fc4887291417685f3ad693c5a1d5d"}, + {file = "rpds_py-0.30.0-cp313-cp313-win_amd64.whl", hash = "sha256:806f36b1b605e2d6a72716f321f20036b9489d29c51c91f4dd29a3e3afb73b15"}, + {file = "rpds_py-0.30.0-cp313-cp313-win_arm64.whl", hash = "sha256:d96c2086587c7c30d44f31f42eae4eac89b60dabbac18c7669be3700f13c3ce1"}, + {file = "rpds_py-0.30.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:eb0b93f2e5c2189ee831ee43f156ed34e2a89a78a66b98cadad955972548be5a"}, + {file = "rpds_py-0.30.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:922e10f31f303c7c920da8981051ff6d8c1a56207dbdf330d9047f6d30b70e5e"}, + {file = "rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cdc62c8286ba9bf7f47befdcea13ea0e26bf294bda99758fd90535cbaf408000"}, + {file = "rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:47f9a91efc418b54fb8190a6b4aa7813a23fb79c51f4bb84e418f5476c38b8db"}, + {file = "rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1f3587eb9b17f3789ad50824084fa6f81921bbf9a795826570bda82cb3ed91f2"}, + {file = "rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:39c02563fc592411c2c61d26b6c5fe1e51eaa44a75aa2c8735ca88b0d9599daa"}, + {file = "rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51a1234d8febafdfd33a42d97da7a43f5dcb120c1060e352a3fbc0c6d36e2083"}, + {file = "rpds_py-0.30.0-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:eb2c4071ab598733724c08221091e8d80e89064cd472819285a9ab0f24bcedb9"}, + {file = "rpds_py-0.30.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6bdfdb946967d816e6adf9a3d8201bfad269c67efe6cefd7093ef959683c8de0"}, + {file = "rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c77afbd5f5250bf27bf516c7c4a016813eb2d3e116139aed0096940c5982da94"}, + {file = "rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:61046904275472a76c8c90c9ccee9013d70a6d0f73eecefd38c1ae7c39045a08"}, + {file = "rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c5f36a861bc4b7da6516dbdf302c55313afa09b81931e8280361a4f6c9a2d27"}, + {file = "rpds_py-0.30.0-cp313-cp313t-win32.whl", hash = "sha256:3d4a69de7a3e50ffc214ae16d79d8fbb0922972da0356dcf4d0fdca2878559c6"}, + {file = "rpds_py-0.30.0-cp313-cp313t-win_amd64.whl", hash = "sha256:f14fc5df50a716f7ece6a80b6c78bb35ea2ca47c499e422aa4463455dd96d56d"}, + {file = "rpds_py-0.30.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:68f19c879420aa08f61203801423f6cd5ac5f0ac4ac82a2368a9fcd6a9a075e0"}, + {file = "rpds_py-0.30.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ec7c4490c672c1a0389d319b3a9cfcd098dcdc4783991553c332a15acf7249be"}, + {file = "rpds_py-0.30.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f251c812357a3fed308d684a5079ddfb9d933860fc6de89f2b7ab00da481e65f"}, + {file = "rpds_py-0.30.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac98b175585ecf4c0348fd7b29c3864bda53b805c773cbf7bfdaffc8070c976f"}, + {file = "rpds_py-0.30.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3e62880792319dbeb7eb866547f2e35973289e7d5696c6e295476448f5b63c87"}, + {file = "rpds_py-0.30.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4e7fc54e0900ab35d041b0601431b0a0eb495f0851a0639b6ef90f7741b39a18"}, + {file = "rpds_py-0.30.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47e77dc9822d3ad616c3d5759ea5631a75e5809d5a28707744ef79d7a1bcfcad"}, + {file = "rpds_py-0.30.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:b4dc1a6ff022ff85ecafef7979a2c6eb423430e05f1165d6688234e62ba99a07"}, + {file = "rpds_py-0.30.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4559c972db3a360808309e06a74628b95eaccbf961c335c8fe0d590cf587456f"}, + {file = "rpds_py-0.30.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:0ed177ed9bded28f8deb6ab40c183cd1192aa0de40c12f38be4d59cd33cb5c65"}, + {file = "rpds_py-0.30.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:ad1fa8db769b76ea911cb4e10f049d80bf518c104f15b3edb2371cc65375c46f"}, + {file = "rpds_py-0.30.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:46e83c697b1f1c72b50e5ee5adb4353eef7406fb3f2043d64c33f20ad1c2fc53"}, + {file = "rpds_py-0.30.0-cp314-cp314-win32.whl", hash = "sha256:ee454b2a007d57363c2dfd5b6ca4a5d7e2c518938f8ed3b706e37e5d470801ed"}, + {file = "rpds_py-0.30.0-cp314-cp314-win_amd64.whl", hash = "sha256:95f0802447ac2d10bcc69f6dc28fe95fdf17940367b21d34e34c737870758950"}, + {file = "rpds_py-0.30.0-cp314-cp314-win_arm64.whl", hash = "sha256:613aa4771c99f03346e54c3f038e4cc574ac09a3ddfb0e8878487335e96dead6"}, + {file = "rpds_py-0.30.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:7e6ecfcb62edfd632e56983964e6884851786443739dbfe3582947e87274f7cb"}, + {file = "rpds_py-0.30.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a1d0bc22a7cdc173fedebb73ef81e07faef93692b8c1ad3733b67e31e1b6e1b8"}, + {file = "rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d08f00679177226c4cb8c5265012eea897c8ca3b93f429e546600c971bcbae7"}, + {file = "rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5965af57d5848192c13534f90f9dd16464f3c37aaf166cc1da1cae1fd5a34898"}, + {file = "rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9a4e86e34e9ab6b667c27f3211ca48f73dba7cd3d90f8d5b11be56e5dbc3fb4e"}, + {file = "rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5d3e6b26f2c785d65cc25ef1e5267ccbe1b069c5c21b8cc724efee290554419"}, + {file = "rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:626a7433c34566535b6e56a1b39a7b17ba961e97ce3b80ec62e6f1312c025551"}, + {file = "rpds_py-0.30.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:acd7eb3f4471577b9b5a41baf02a978e8bdeb08b4b355273994f8b87032000a8"}, + {file = "rpds_py-0.30.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fe5fa731a1fa8a0a56b0977413f8cacac1768dad38d16b3a296712709476fbd5"}, + {file = "rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:74a3243a411126362712ee1524dfc90c650a503502f135d54d1b352bd01f2404"}, + {file = "rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:3e8eeb0544f2eb0d2581774be4c3410356eba189529a6b3e36bbbf9696175856"}, + {file = "rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:dbd936cde57abfee19ab3213cf9c26be06d60750e60a8e4dd85d1ab12c8b1f40"}, + {file = "rpds_py-0.30.0-cp314-cp314t-win32.whl", hash = "sha256:dc824125c72246d924f7f796b4f63c1e9dc810c7d9e2355864b3c3a73d59ade0"}, + {file = "rpds_py-0.30.0-cp314-cp314t-win_amd64.whl", hash = "sha256:27f4b0e92de5bfbc6f86e43959e6edd1425c33b5e69aab0984a72047f2bcf1e3"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c2262bdba0ad4fc6fb5545660673925c2d2a5d9e2e0fb603aad545427be0fc58"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:ee6af14263f25eedc3bb918a3c04245106a42dfd4f5c2285ea6f997b1fc3f89a"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3adbb8179ce342d235c31ab8ec511e66c73faa27a47e076ccc92421add53e2bb"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:250fa00e9543ac9b97ac258bd37367ff5256666122c2d0f2bc97577c60a1818c"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9854cf4f488b3d57b9aaeb105f06d78e5529d3145b1e4a41750167e8c213c6d3"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:993914b8e560023bc0a8bf742c5f303551992dcb85e247b1e5c7f4a7d145bda5"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58edca431fb9b29950807e301826586e5bbf24163677732429770a697ffe6738"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:dea5b552272a944763b34394d04577cf0f9bd013207bc32323b5a89a53cf9c2f"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ba3af48635eb83d03f6c9735dfb21785303e73d22ad03d489e88adae6eab8877"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:dff13836529b921e22f15cb099751209a60009731a68519630a24d61f0b1b30a"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:1b151685b23929ab7beec71080a8889d4d6d9fa9a983d213f07121205d48e2c4"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:ac37f9f516c51e5753f27dfdef11a88330f04de2d564be3991384b2f3535d02e"}, + {file = "rpds_py-0.30.0.tar.gz", hash = "sha256:dd8ff7cf90014af0c0f787eea34794ebf6415242ee1d6fa91eaba725cc441e84"}, +] + [[package]] name = "ruff" version = "0.15.6" @@ -2466,6 +3939,55 @@ files = [ {file = "ruff-0.15.6.tar.gz", hash = "sha256:8394c7bb153a4e3811a4ecdacd4a8e6a4fa8097028119160dffecdcdf9b56ae4"}, ] +[[package]] +name = "send2trash" +version = "2.1.0" +description = "Send file to trash natively under Mac OS X, Windows and Linux" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "send2trash-2.1.0-py3-none-any.whl", hash = "sha256:0da2f112e6d6bb22de6aa6daa7e144831a4febf2a87261451c4ad849fe9a873c"}, + {file = "send2trash-2.1.0.tar.gz", hash = "sha256:1c72b39f09457db3c05ce1d19158c2cbef4c32b8bedd02c155e49282b7ea7459"}, +] + +[package.extras] +nativelib = ["pyobjc (>=9.0) ; sys_platform == \"darwin\"", "pywin32 (>=305) ; sys_platform == \"win32\""] +test = ["pytest (>=8)"] + +[[package]] +name = "setuptools" +version = "82.0.1" +description = "Most extensible Python build backend with support for C/C++ extension modules" +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "setuptools-82.0.1-py3-none-any.whl", hash = "sha256:a59e362652f08dcd477c78bb6e7bd9d80a7995bc73ce773050228a348ce2e5bb"}, + {file = "setuptools-82.0.1.tar.gz", hash = "sha256:7d872682c5d01cfde07da7bccc7b65469d3dca203318515ada1de5eda35efbf9"}, +] + +[package.extras] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\"", "ruff (>=0.13.0) ; sys_platform != \"cygwin\""] +core = ["importlib_metadata (>=6) ; python_version < \"3.10\"", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more_itertools", "more_itertools (>=8.8)", "packaging (>=24.2)", "tomli (>=2.0.1) ; python_version < \"3.11\"", "wheel (>=0.43.0)"] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21) ; python_version >= \"3.9\" and sys_platform != \"cygwin\"", "jaraco.envs (>=2.2)", "jaraco.path (>=3.7.2)", "jaraco.test (>=5.5)", "packaging (>=24.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf ; sys_platform != \"cygwin\"", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] +type = ["importlib_metadata (>=7.0.2) ; python_version < \"3.10\"", "jaraco.develop (>=7.21) ; sys_platform != \"cygwin\"", "mypy (==1.18.*)", "pytest-mypy"] + +[[package]] +name = "six" +version = "1.17.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +groups = ["dev"] +files = [ + {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, + {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, +] + [[package]] name = "sortedcontainers" version = "2.4.0" @@ -2478,6 +4000,38 @@ files = [ {file = "sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88"}, ] +[[package]] +name = "soupsieve" +version = "2.8.3" +description = "A modern CSS selector implementation for Beautiful Soup." +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "soupsieve-2.8.3-py3-none-any.whl", hash = "sha256:ed64f2ba4eebeab06cc4962affce381647455978ffc1e36bb79a545b91f45a95"}, + {file = "soupsieve-2.8.3.tar.gz", hash = "sha256:3267f1eeea4251fb42728b6dfb746edc9acaffc4a45b27e19450b676586e8349"}, +] + +[[package]] +name = "stack-data" +version = "0.6.3" +description = "Extract data from python stack frames and tracebacks for informative displays" +optional = false +python-versions = "*" +groups = ["dev"] +files = [ + {file = "stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695"}, + {file = "stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9"}, +] + +[package.dependencies] +asttokens = ">=2.1.0" +executing = ">=1.2.0" +pure-eval = "*" + +[package.extras] +tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] + [[package]] name = "structlog" version = "25.5.0" @@ -2505,6 +4059,47 @@ files = [ [package.extras] tests = ["pytest", "pytest-cov"] +[[package]] +name = "terminado" +version = "0.18.1" +description = "Tornado websocket backend for the Xterm.js Javascript terminal emulator library." +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "terminado-0.18.1-py3-none-any.whl", hash = "sha256:a4468e1b37bb318f8a86514f65814e1afc977cf29b3992a4500d9dd305dcceb0"}, + {file = "terminado-0.18.1.tar.gz", hash = "sha256:de09f2c4b85de4765f7714688fff57d3e75bad1f909b589fde880460c753fd2e"}, +] + +[package.dependencies] +ptyprocess = {version = "*", markers = "os_name != \"nt\""} +pywinpty = {version = ">=1.1.0", markers = "os_name == \"nt\""} +tornado = ">=6.1.0" + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] +test = ["pre-commit", "pytest (>=7.0)", "pytest-timeout"] +typing = ["mypy (>=1.6,<2.0)", "traitlets (>=5.11.1)"] + +[[package]] +name = "tinycss2" +version = "1.4.0" +description = "A tiny CSS parser" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "tinycss2-1.4.0-py3-none-any.whl", hash = "sha256:3a49cf47b7675da0b15d0c6e1df8df4ebd96e9394bb905a5775adb0d884c5289"}, + {file = "tinycss2-1.4.0.tar.gz", hash = "sha256:10c0972f6fc0fbee87c3edb76549357415e94548c1ae10ebccdea16fb404a9b7"}, +] + +[package.dependencies] +webencodings = ">=0.4" + +[package.extras] +doc = ["sphinx", "sphinx_rtd_theme"] +test = ["pytest", "ruff"] + [[package]] name = "tomli" version = "2.4.0" @@ -2574,6 +4169,42 @@ files = [ {file = "tomli_w-1.2.0.tar.gz", hash = "sha256:2dd14fac5a47c27be9cd4c976af5a12d87fb1f0b4512f81d69cce3b35ae25021"}, ] +[[package]] +name = "tornado" +version = "6.5.5" +description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "tornado-6.5.5-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:487dc9cc380e29f58c7ab88f9e27cdeef04b2140862e5076a66fb6bb68bb1bfa"}, + {file = "tornado-6.5.5-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:65a7f1d46d4bb41df1ac99f5fcb685fb25c7e61613742d5108b010975a9a6521"}, + {file = "tornado-6.5.5-cp39-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e74c92e8e65086b338fd56333fb9a68b9f6f2fe7ad532645a290a464bcf46be5"}, + {file = "tornado-6.5.5-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:435319e9e340276428bbdb4e7fa732c2d399386d1de5686cb331ec8eee754f07"}, + {file = "tornado-6.5.5-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:3f54aa540bdbfee7b9eb268ead60e7d199de5021facd276819c193c0fb28ea4e"}, + {file = "tornado-6.5.5-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:36abed1754faeb80fbd6e64db2758091e1320f6bba74a4cf8c09cd18ccce8aca"}, + {file = "tornado-6.5.5-cp39-abi3-win32.whl", hash = "sha256:dd3eafaaeec1c7f2f8fdcd5f964e8907ad788fe8a5a32c4426fbbdda621223b7"}, + {file = "tornado-6.5.5-cp39-abi3-win_amd64.whl", hash = "sha256:6443a794ba961a9f619b1ae926a2e900ac20c34483eea67be4ed8f1e58d3ef7b"}, + {file = "tornado-6.5.5-cp39-abi3-win_arm64.whl", hash = "sha256:2c9a876e094109333f888539ddb2de4361743e5d21eece20688e3e351e4990a6"}, + {file = "tornado-6.5.5.tar.gz", hash = "sha256:192b8f3ea91bd7f1f50c06955416ed76c6b72f96779b962f07f911b91e8d30e9"}, +] + +[[package]] +name = "traitlets" +version = "5.14.3" +description = "Traitlets Python configuration system" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f"}, + {file = "traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7"}, +] + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] +test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<8.2)", "pytest-mock", "pytest-mypy-testing"] + [[package]] name = "typing-extensions" version = "4.15.0" @@ -2586,6 +4217,33 @@ files = [ {file = "typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466"}, ] +[[package]] +name = "tzdata" +version = "2025.3" +description = "Provider of IANA time zone data" +optional = false +python-versions = ">=2" +groups = ["dev"] +files = [ + {file = "tzdata-2025.3-py2.py3-none-any.whl", hash = "sha256:06a47e5700f3081aab02b2e513160914ff0694bce9947d6b76ebd6bf57cfc5d1"}, + {file = "tzdata-2025.3.tar.gz", hash = "sha256:de39c2ca5dc7b0344f2eba86f49d614019d29f060fc4ebc8a417896a620b56a7"}, +] + +[[package]] +name = "uri-template" +version = "1.3.0" +description = "RFC 6570 URI Template Processor" +optional = false +python-versions = ">=3.7" +groups = ["dev"] +files = [ + {file = "uri-template-1.3.0.tar.gz", hash = "sha256:0e00f8eb65e18c7de20d595a14336e9f337ead580c70934141624b6d1ffdacc7"}, + {file = "uri_template-1.3.0-py3-none-any.whl", hash = "sha256:a44a133ea12d44a0c0f06d7d42a52d71282e77e2f937d8abd5655b8d56fc1363"}, +] + +[package.extras] +dev = ["flake8", "flake8-annotations", "flake8-bandit", "flake8-bugbear", "flake8-commas", "flake8-comprehensions", "flake8-continuation", "flake8-datetimez", "flake8-docstrings", "flake8-import-order", "flake8-literal", "flake8-modern-annotations", "flake8-noqa", "flake8-pyproject", "flake8-requirements", "flake8-typechecking-import", "flake8-use-fstring", "mypy", "pep8-naming", "types-PyYAML"] + [[package]] name = "urllib3" version = "2.6.3" @@ -2622,6 +4280,59 @@ filelock = {version = ">=3.24.2,<4", markers = "python_version >= \"3.10\""} platformdirs = ">=3.9.1,<5" python-discovery = ">=1" +[[package]] +name = "wcwidth" +version = "0.6.0" +description = "Measures the displayed width of unicode strings in a terminal" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "wcwidth-0.6.0-py3-none-any.whl", hash = "sha256:1a3a1e510b553315f8e146c54764f4fb6264ffad731b3d78088cdb1478ffbdad"}, + {file = "wcwidth-0.6.0.tar.gz", hash = "sha256:cdc4e4262d6ef9a1a57e018384cbeb1208d8abbc64176027e2c2455c81313159"}, +] + +[[package]] +name = "webcolors" +version = "25.10.0" +description = "A library for working with the color formats defined by HTML and CSS." +optional = false +python-versions = ">=3.10" +groups = ["dev"] +files = [ + {file = "webcolors-25.10.0-py3-none-any.whl", hash = "sha256:032c727334856fc0b968f63daa252a1ac93d33db2f5267756623c210e57a4f1d"}, + {file = "webcolors-25.10.0.tar.gz", hash = "sha256:62abae86504f66d0f6364c2a8520de4a0c47b80c03fc3a5f1815fedbef7c19bf"}, +] + +[[package]] +name = "webencodings" +version = "0.5.1" +description = "Character encoding aliases for legacy web content" +optional = false +python-versions = "*" +groups = ["dev"] +files = [ + {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, + {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, +] + +[[package]] +name = "websocket-client" +version = "1.9.0" +description = "WebSocket client for Python with low level API options" +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "websocket_client-1.9.0-py3-none-any.whl", hash = "sha256:af248a825037ef591efbf6ed20cc5faa03d3b47b9e5a2230a529eeee1c1fc3ef"}, + {file = "websocket_client-1.9.0.tar.gz", hash = "sha256:9e813624b6eb619999a97dc7958469217c3176312b3a16a4bd1bc7e08a46ec98"}, +] + +[package.extras] +docs = ["Sphinx (>=6.0)", "myst-parser (>=2.0.0)", "sphinx_rtd_theme (>=1.1.0)"] +optional = ["python-socks", "wsaccel"] +test = ["pytest", "websockets"] + [[package]] name = "yarl" version = "1.23.0" @@ -2768,4 +4479,4 @@ propcache = ">=0.2.1" [metadata] lock-version = "2.1" python-versions = "^3.13" -content-hash = "64e77ae4b8ee9692346c426785643fd63da726d1f386b9cb2b7b5d7ce636760d" +content-hash = "35d84515fb762a9bcc77b722a1baede344cf6be6cdc5dde0a7152769ff61395e" diff --git a/pyproject.toml b/pyproject.toml index d9b9f478..e2587231 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -45,6 +45,8 @@ puyapy = "^5.7.1" urllib3 = "^2.6.3" pip = "^26.0.1" python-dotenv = "^1.2.2" +ipykernel = "^7.2.0" +jupyterlab = "^4.4.7" [build-system] requires = ["poetry-core"] From 724c25fe639a235077d30955a2dc52ec7dd7c9e8 Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 22:10:32 +0100 Subject: [PATCH 224/244] chore: clean jupyter artifacts --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 2108f55f..f44f4771 100644 --- a/Makefile +++ b/Makefile @@ -16,7 +16,7 @@ help: @echo " docs - Run docs pre-commit checks and mdBook validation" @echo " docs-serve - Serve mdBook docs locally with live reload" @echo " pre-commit - Install pre-commit hooks" - @echo " clean - Remove local caches and ignored build outputs" + @echo " clean - Remove local caches, notebook checkpoints, and ignored build outputs" @echo " all - Run build, lint, and test" @echo " localnet - Start AlgoKit LocalNet" @echo " localnet-stop - Stop AlgoKit LocalNet" @@ -113,7 +113,7 @@ pre-commit: clean: rm -rf .mypy_cache .pytest_cache .ruff_cache .coverage htmlcov book mermaid-init.js mermaid.min.js - find . -type d -name __pycache__ -prune -exec rm -rf {} + + find . -type d \( -name __pycache__ -o -name '.ipynb_checkpoints' \) -exec rm -rf {} + find . -type f -name '*.pyc' -delete all: build lint test From f38adf266764f53a5c53bef293b7f6fa2fe84191 Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 22:10:42 +0100 Subject: [PATCH 225/244] chore: ignore jupyter artifacts --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 238c421e..553fb6d6 100644 --- a/.gitignore +++ b/.gitignore @@ -97,3 +97,6 @@ debug_traces/ book mermaid-init.js mermaid.min.js + +# Jupyter +.ipynb_checkpoints/ From c4e2b78ea1c78068a9aeff3e8de96c6852fe366e Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 22:32:12 +0100 Subject: [PATCH 226/244] docs: formatting --- docs/sdk/deploy-and-attach.md | 6 ++++-- docs/sdk/dvp.md | 8 +++++--- docs/sdk/overview.md | 9 ++++++--- docs/sdk/roles.md | 2 +- docs/sdk/valuation.md | 20 ++++++++++++++------ 5 files changed, 30 insertions(+), 15 deletions(-) diff --git a/docs/sdk/deploy-and-attach.md b/docs/sdk/deploy-and-attach.md index b2ac0842..82662a49 100644 --- a/docs/sdk/deploy-and-attach.md +++ b/docs/sdk/deploy-and-attach.md @@ -14,7 +14,8 @@ app = DAsa.deploy( ## Deploy and Configure -`deploy_configured(...)` accepts either a precomputed `NormalizationResult` or raw `ContractAttributes` plus the normalization inputs. +`deploy_configured(...)` accepts either a precomputed `NormalizationResult` or raw +`ContractAttributes` plus the normalization inputs. ```python app = DAsa.deploy_configured( @@ -25,7 +26,8 @@ app = DAsa.deploy_configured( ) ``` -When configuration happens through the high-level API, `DAsa` also stores a `PricingContext` derived from `normalized.terms.notional_unit_value`. +When configuration happens through the high-level API, `DAsa` also stores a `PricingContext` +derived from `normalized.terms.notional_unit_value`. ## Attach to an Existing App diff --git a/docs/sdk/dvp.md b/docs/sdk/dvp.md index 6958b00b..308aaa63 100644 --- a/docs/sdk/dvp.md +++ b/docs/sdk/dvp.md @@ -1,6 +1,7 @@ -# OTC DvP Builder +# Over-the-Counter (OTC) DvP Builder -`HoldingAccount.build_otc_dvp(...)` builds an atomic delivery-vs-payment group for OTC secondary trades. +`HoldingAccount.build_otc_dvp(...)` builds an atomic delivery-vs-payment group for +OTC secondary trades. The builder is intentionally non-custodial: @@ -41,4 +42,5 @@ The builder validates: - the seller signer matches the transfer sender holding address - optional quote tolerance, when provided -You can combine it with `quote_trade(...)` inputs to fail fast when the negotiated payment amount drifts too far from the SDK's accrual-aware reference. +You can combine it with `quote_trade(...)` inputs to fail fast when the negotiated +payment amount drifts too far from the SDK's accrual-aware reference. diff --git a/docs/sdk/overview.md b/docs/sdk/overview.md index 7bfa563d..02584a15 100644 --- a/docs/sdk/overview.md +++ b/docs/sdk/overview.md @@ -2,7 +2,8 @@ The high-level Python API lives directly under `src` and is centered on `DAsa`. -It wraps the generated ARC-56 client in [`src.artifacts.dasa_client`](../../src/artifacts/dasa_client.py) and keeps the generated ABI structs out of the normal user flow. +It wraps the generated ARC-56 client in [`src.artifacts.dasa_client`](../../src/artifacts/dasa_client.py) +and keeps the generated ABI structs out of the normal user flow. ```python from src import ( @@ -14,7 +15,8 @@ from src import ( ) ``` -The root package also continues to expose the domain models and the ACTUS normalizer directly: +The root package also continues to expose the domain models and the ACTUS normalizer +directly: - `ContractAttributes` - `make_pam_zero_coupon_bond(...)` @@ -29,4 +31,5 @@ The root package also continues to expose the domain models and the ACTUS normal - `ObservedCashEventRequest` - `Cycle` -Use `DAsa` for contract interaction, and keep `src.artifacts.dasa_client` as the explicit low-level escape hatch when needed. +Use `DAsa` for contract interaction, and keep `src.artifacts.dasa_client` as the +explicit low-level escape hatch when needed. diff --git a/docs/sdk/roles.md b/docs/sdk/roles.md index 051941bb..5c808fec 100644 --- a/docs/sdk/roles.md +++ b/docs/sdk/roles.md @@ -1,6 +1,6 @@ # Role Wrappers -`DAsa` binds signer accounts into role-oriented wrappers instead of requiring repeated manual sender and signer plumbing. +`DAsa` binds signer accounts into role-oriented wrappers. ```python arranger = app.arranger(arranger_account) diff --git a/docs/sdk/valuation.md b/docs/sdk/valuation.md index 0755cc9d..720035eb 100644 --- a/docs/sdk/valuation.md +++ b/docs/sdk/valuation.md @@ -1,6 +1,7 @@ # Actualized Positions and Valuation -`HoldingAccount.get_actualized_position()` mirrors the contract's lazy settlement rules off chain: +`HoldingAccount.get_actualized_position()` mirrors the contract's lazy settlement +rules off chain: - reserved units become active after `IED` - cumulative interest and principal indices are applied to the holder checkpoints @@ -25,7 +26,8 @@ valuation = holder.get_valuation() ## Trade Quotes -`quote_trade(units=...)` is intended to support secondary-market pricing in the middle of an accrual period. +`quote_trade(units=...)` is intended to support secondary-market pricing in the +middle of an accrual period. The quote always returns: @@ -34,7 +36,8 @@ The quote always returns: - a par-reference clean value - a par-reference dirty value -If a clean quote is supplied, the SDK derives a market dirty value by adding accrued-not-due carry. +If a clean quote is supplied, the SDK derives a market dirty value by adding accrued-not-due +carry. ```python from decimal import Decimal @@ -48,6 +51,11 @@ quote = holder.quote_trade( Important behavior: -- Quotes are rejected when a due ACTUS event is already pending at the requested timestamp. -- Existing `claimable_interest` and `claimable_principal` remain attached to the seller account and are reported as retained balances, not transferred unit value. -- `clean_price_per_100` requires a `PricingContext`, because `notional_unit_value` is SDK metadata and is not stored on chain. +- Quotes are rejected when a due ACTUS event is already pending at the requested +timestamp. + +- Existing `claimable_interest` and `claimable_principal` remain attached to the +seller account and are reported as retained balances, not transferred unit value. + +- `clean_price_per_100` requires a `PricingContext`, because `notional_unit_value` +is SDK metadata and is not stored on chain. From 9a5df73b5d467eb0a76047ccda6c437f7a90b664 Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 22:33:00 +0100 Subject: [PATCH 227/244] chore: run jupyter lab in docker --- Dockerfile | 4 ++- Makefile | 7 +++- README.md | 47 +++++++++++++++++++-------- d-asa | 81 ++++++++++++++++++++++++++++++++++++++++++++-- examples/README.md | 36 +++++++++++++++++++-- 5 files changed, 155 insertions(+), 20 deletions(-) diff --git a/Dockerfile b/Dockerfile index bd4bae8a..e76ee405 100644 --- a/Dockerfile +++ b/Dockerfile @@ -19,4 +19,6 @@ WORKDIR /workspace COPY pyproject.toml poetry.lock ./ -RUN poetry install --without dev --no-root --no-ansi +RUN poetry install --without dev --with notebooks --no-root --no-ansi + +EXPOSE 8888 diff --git a/Makefile b/Makefile index f44f4771..406bb920 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ SHELL := /bin/sh -.PHONY: help install install-dev doctor build test test-cov lint format typecheck docs docs-serve pre-commit clean all localnet localnet-stop deploy-localnet showcase +.PHONY: help install install-dev doctor build test test-cov lint format typecheck docs docs-serve pre-commit clean all localnet localnet-stop deploy-localnet showcase jupyter-docker help: @echo "Available targets:" @@ -22,6 +22,7 @@ help: @echo " localnet-stop - Stop AlgoKit LocalNet" @echo " deploy-localnet - Deploy contracts to LocalNet" @echo " showcase - Run the LocalNet showcase walkthrough" + @echo " jupyter-docker - Start Jupyter Lab in Docker with LocalNet (no local dependencies needed)" install: algokit project bootstrap poetry @@ -129,3 +130,7 @@ deploy-localnet: showcase: poetry run pytest -s -v -m showcase tests/pam/test_pam_lifecycle_showcase.py + +jupyter-docker: + ./d-asa jupyter + diff --git a/README.md b/README.md index 25616af3..47167ab3 100644 --- a/README.md +++ b/README.md @@ -61,18 +61,6 @@ Open the published docs with: ./d-asa docs ``` -If you want the exact `d-asa ...` syntax in your current shell, you can add an alias: - -```shell -alias d-asa="$PWD/d-asa" -``` - -If browser launch is not wanted: - -```shell -D_ASA_NO_OPEN=1 ./d-asa docs -``` - Notes: - targets macOS and Linux @@ -132,7 +120,40 @@ Serve docs locally with live reload: make docs-serve ``` -Open the live LocalNet notebooks: +## Interactive Notebooks + +The easiest way to explore the notebooks is using Docker (no local Python dependencies +needed): + +```shell +./d-asa jupyter +``` + +Or via make: + +```shell +make jupyter-docker +``` + +This will: +- Build the Docker image with Jupyter Lab included +- Start AlgoKit LocalNet if needed +- Launch Jupyter Lab at +- Automatically configure LocalNet connectivity + +The notebooks will have full access to the D-ASA framework and LocalNet. + +Press `Ctrl+C` to stop. + +### Alternative: Local Jupyter (requires local dependencies) + +If you prefer running Jupyter locally, first install the optional notebook dependencies: + +```shell +poetry install --with notebooks +``` + +Then start Jupyter Lab: ```shell poetry run jupyter lab examples/ diff --git a/d-asa b/d-asa index fbbccb43..e29b9225 100755 --- a/d-asa +++ b/d-asa @@ -25,9 +25,10 @@ print_help() { Usage: ./d-asa Commands: - run Build the demo image, start LocalNet if needed, print the showcase, and leave LocalNet running. - docs Open the published D-ASA docs, or print the URL when browser opening is disabled. - help Show this help text. + run Build the demo image, start LocalNet if needed, print the showcase, and leave LocalNet running. + jupyter Start Jupyter Lab in Docker with LocalNet integration (opens browser automatically). + docs Open the published D-ASA docs, or print the URL when browser opening is disabled. + help Show this help text. Prerequisites: - Docker Desktop or Docker Engine @@ -36,6 +37,7 @@ Prerequisites: Examples: ./d-asa run + ./d-asa jupyter ./d-asa docs D_ASA_NO_OPEN=1 ./d-asa docs EOF @@ -168,6 +170,76 @@ cmd_run() { run_in_image python -m src.showcase } +cmd_jupyter() { + ensure_docker + ensure_algokit + cleanup_stale_localnet + build_image + trap cleanup EXIT INT TERM + + if localnet_ready; then + printf '%s\n' "Reusing existing LocalNet." + else + printf '%s\n' "Starting AlgoKit LocalNet..." + algokit localnet start --force + STARTED_LOCALNET=1 + printf '%s\n' "Waiting for algod..." + run_in_image python -m src.localnet wait --timeout 90 --poll-interval 2 + fi + + printf '%s\n' "Starting Jupyter Lab on http://localhost:8888..." + printf '%s\n' "Press Ctrl+C to stop Jupyter Lab." + printf '%s\n' "" + + if localnet_network_exists; then + docker run --rm -it \ + --network "$LOCALNET_NETWORK" \ + -p 8888:8888 \ + -e D_ASA_LOCALNET_HOST="$NETWORK_LOCALNET_HOST" \ + -e D_ASA_ALGOD_HOST="$NETWORK_LOCALNET_HOST" \ + -e D_ASA_KMD_HOST="$NETWORK_LOCALNET_HOST" \ + -e D_ASA_INDEXER_HOST="$NETWORK_INDEXER_HOST" \ + -e D_ASA_LOCALNET_TOKEN="$DEFAULT_LOCALNET_TOKEN" \ + -e D_ASA_ALGOD_PORT="$NETWORK_ALGOD_PORT" \ + -e D_ASA_KMD_PORT="$NETWORK_KMD_PORT" \ + -e D_ASA_INDEXER_PORT="$NETWORK_INDEXER_PORT" \ + -v "$REPO_ROOT:$REPO_ROOT" \ + -w "$REPO_ROOT" \ + "$IMAGE_TAG" \ + jupyter lab examples/ --ip=0.0.0.0 --port=8888 --no-browser --allow-root --NotebookApp.token='' --NotebookApp.password='' + else + case "$(uname -s)" in + Linux*) + docker run --rm -it \ + --add-host=host.docker.internal:host-gateway \ + -p 8888:8888 \ + -e D_ASA_LOCALNET_HOST="$DEFAULT_LOCALNET_HOST" \ + -e D_ASA_LOCALNET_TOKEN="$DEFAULT_LOCALNET_TOKEN" \ + -e D_ASA_ALGOD_PORT="$DEFAULT_ALGOD_PORT" \ + -e D_ASA_KMD_PORT="$DEFAULT_KMD_PORT" \ + -e D_ASA_INDEXER_PORT="$DEFAULT_INDEXER_PORT" \ + -v "$REPO_ROOT:$REPO_ROOT" \ + -w "$REPO_ROOT" \ + "$IMAGE_TAG" \ + jupyter lab examples/ --ip=0.0.0.0 --port=8888 --no-browser --allow-root --NotebookApp.token='' --NotebookApp.password='' + ;; + *) + docker run --rm -it \ + -p 8888:8888 \ + -e D_ASA_LOCALNET_HOST="$DEFAULT_LOCALNET_HOST" \ + -e D_ASA_LOCALNET_TOKEN="$DEFAULT_LOCALNET_TOKEN" \ + -e D_ASA_ALGOD_PORT="$DEFAULT_ALGOD_PORT" \ + -e D_ASA_KMD_PORT="$DEFAULT_KMD_PORT" \ + -e D_ASA_INDEXER_PORT="$DEFAULT_INDEXER_PORT" \ + -v "$REPO_ROOT:$REPO_ROOT" \ + -w "$REPO_ROOT" \ + "$IMAGE_TAG" \ + jupyter lab examples/ --ip=0.0.0.0 --port=8888 --no-browser --allow-root --NotebookApp.token='' --NotebookApp.password='' + ;; + esac + fi +} + cmd_docs() { if [ "${D_ASA_NO_OPEN:-0}" = "1" ]; then printf '%s\n' "$DOCS_URL" @@ -191,6 +263,9 @@ case "${1:-help}" in run) cmd_run ;; + jupyter) + cmd_jupyter + ;; docs) cmd_docs ;; diff --git a/examples/README.md b/examples/README.md index fa2f7a75..7590863f 100644 --- a/examples/README.md +++ b/examples/README.md @@ -8,7 +8,33 @@ This folder contains two live LocalNet walkthroughs: They are intended to be run from the repository root and rerun from top to bottom against a fresh AlgoKit LocalNet. -## Setup +## Quick Start (Docker - No Local Dependencies) + +The easiest way to run the notebooks is using Docker: + +```shell +./d-asa jupyter +``` + +Or via make: + +```shell +make jupyter-docker +``` + +This will: +- Build the Docker image with all dependencies +- Start AlgoKit LocalNet if needed +- Launch Jupyter Lab at http://localhost:8888 +- Automatically configure LocalNet connectivity + +Then open one of the notebooks in the `examples/` folder. + +Press Ctrl+C to stop Jupyter Lab when finished. + +## Alternative: Local Setup (Requires Local Dependencies) + +If you prefer running Jupyter locally, follow these steps: Bootstrap the full development environment: @@ -22,6 +48,12 @@ If you prefer the raw AlgoKit command, the equivalent bootstrap is: algokit bootstrap all ``` +Install the optional notebook dependencies: + +```shell +poetry install --with notebooks +``` + Start LocalNet: ```shell @@ -37,7 +69,7 @@ algokit localnet start Launch Jupyter from the repository root: ```shell -poetry run jupyter lab +poetry run jupyter lab examples/ ``` Then open one of the notebooks in `examples/`. From cbbd192d4337e7735ca303379a8a05d007321ed1 Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 22:33:21 +0100 Subject: [PATCH 228/244] chore: notebook dependencies --- poetry.lock | 196 ++++++++++++++++++++++++------------------------- pyproject.toml | 5 ++ 2 files changed, 103 insertions(+), 98 deletions(-) diff --git a/poetry.lock b/poetry.lock index 62b65cf5..ba55a3bc 100644 --- a/poetry.lock +++ b/poetry.lock @@ -216,7 +216,7 @@ version = "4.12.1" description = "High-level concurrency and networking framework on top of asyncio or Trio" optional = false python-versions = ">=3.9" -groups = ["main", "dev"] +groups = ["main", "dev", "notebooks"] files = [ {file = "anyio-4.12.1-py3-none-any.whl", hash = "sha256:d405828884fc140aa80a3c667b8beed277f1dfedec42ba031bd6ac3db606ab6c"}, {file = "anyio-4.12.1.tar.gz", hash = "sha256:41cfcc3a4c85d3f05c932da7c26d0201ac36f72abd4435ba90d0464a3ffed703"}, @@ -234,7 +234,7 @@ version = "0.1.4" description = "Disable App Nap on macOS >= 10.9" optional = false python-versions = ">=3.6" -groups = ["dev"] +groups = ["notebooks"] markers = "platform_system == \"Darwin\"" files = [ {file = "appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c"}, @@ -247,7 +247,7 @@ version = "25.1.0" description = "Argon2 for Python" optional = false python-versions = ">=3.8" -groups = ["dev"] +groups = ["notebooks"] files = [ {file = "argon2_cffi-25.1.0-py3-none-any.whl", hash = "sha256:fdc8b074db390fccb6eb4a3604ae7231f219aa669a2652e0f20e16ba513d5741"}, {file = "argon2_cffi-25.1.0.tar.gz", hash = "sha256:694ae5cc8a42f4c4e2bf2ca0e64e51e23a040c6a517a85074683d3959e1346c1"}, @@ -262,7 +262,7 @@ version = "25.1.0" description = "Low-level CFFI bindings for Argon2" optional = false python-versions = ">=3.9" -groups = ["dev"] +groups = ["notebooks"] files = [ {file = "argon2_cffi_bindings-25.1.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:3d3f05610594151994ca9ccb3c771115bdb4daef161976a266f0dd8aa9996b8f"}, {file = "argon2_cffi_bindings-25.1.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:8b8efee945193e667a396cbc7b4fb7d357297d6234d30a489905d96caabde56b"}, @@ -304,7 +304,7 @@ version = "1.4.0" description = "Better dates & times for Python" optional = false python-versions = ">=3.8" -groups = ["dev"] +groups = ["notebooks"] files = [ {file = "arrow-1.4.0-py3-none-any.whl", hash = "sha256:749f0769958ebdc79c173ff0b0670d59051a535fa26e8eba02953dc19eb43205"}, {file = "arrow-1.4.0.tar.gz", hash = "sha256:ed0cc050e98001b8779e84d461b0098c4ac597e88704a655582b21d116e526d7"}, @@ -324,7 +324,7 @@ version = "3.0.1" description = "Annotate AST trees with source code positions" optional = false python-versions = ">=3.8" -groups = ["dev"] +groups = ["notebooks"] files = [ {file = "asttokens-3.0.1-py3-none-any.whl", hash = "sha256:15a3ebc0f43c2d0a50eeafea25e19046c68398e487b9f1f5b517f7c0f40f976a"}, {file = "asttokens-3.0.1.tar.gz", hash = "sha256:71a4ee5de0bde6a31d64f6b13f2293ac190344478f081c3d1bccfcf5eacb0cb7"}, @@ -340,7 +340,7 @@ version = "2.2.0" description = "Simple LRU cache for asyncio" optional = false python-versions = ">=3.10" -groups = ["dev"] +groups = ["notebooks"] files = [ {file = "async_lru-2.2.0-py3-none-any.whl", hash = "sha256:e2c1cf731eba202b59c5feedaef14ffd9d02ad0037fcda64938699f2c380eafe"}, {file = "async_lru-2.2.0.tar.gz", hash = "sha256:80abae2a237dbc6c60861d621619af39f0d920aea306de34cb992c879e01370c"}, @@ -352,7 +352,7 @@ version = "25.4.0" description = "Classes Without Boilerplate" optional = false python-versions = ">=3.9" -groups = ["dev"] +groups = ["dev", "notebooks"] files = [ {file = "attrs-25.4.0-py3-none-any.whl", hash = "sha256:adcf7e2a1fb3b36ac48d97835bb6d8ade15b8dcce26aba8bf1d14847b57a3373"}, {file = "attrs-25.4.0.tar.gz", hash = "sha256:16d5969b87f0859ef33a48b35d55ac1be6e42ae49d5e853b597db70c35c57e11"}, @@ -364,7 +364,7 @@ version = "2.18.0" description = "Internationalization utilities" optional = false python-versions = ">=3.8" -groups = ["dev"] +groups = ["notebooks"] files = [ {file = "babel-2.18.0-py3-none-any.whl", hash = "sha256:e2b422b277c2b9a9630c1d7903c2a00d0830c409c59ac8cae9081c92f1aeba35"}, {file = "babel-2.18.0.tar.gz", hash = "sha256:b80b99a14bd085fcacfa15c9165f651fbb3406e66cc603abf11c5750937c992d"}, @@ -379,7 +379,7 @@ version = "4.14.3" description = "Screen-scraping library" optional = false python-versions = ">=3.7.0" -groups = ["dev"] +groups = ["notebooks"] files = [ {file = "beautifulsoup4-4.14.3-py3-none-any.whl", hash = "sha256:0918bfe44902e6ad8d57732ba310582e98da931428d231a5ecb9e7c703a735bb"}, {file = "beautifulsoup4-4.14.3.tar.gz", hash = "sha256:6292b1c5186d356bba669ef9f7f051757099565ad9ada5dd630bd9de5fa7fb86"}, @@ -454,7 +454,7 @@ version = "6.3.0" description = "An easy safelist-based HTML-sanitizing tool." optional = false python-versions = ">=3.10" -groups = ["dev"] +groups = ["notebooks"] files = [ {file = "bleach-6.3.0-py3-none-any.whl", hash = "sha256:fe10ec77c93ddf3d13a73b035abaac7a9f5e436513864ccdad516693213c65d6"}, {file = "bleach-6.3.0.tar.gz", hash = "sha256:6f3b91b1c0a02bb9a78b5a454c92506aa0fdf197e1d5e114d2e00c6f64306d22"}, @@ -539,7 +539,7 @@ version = "2026.2.25" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.7" -groups = ["main", "dev"] +groups = ["main", "dev", "notebooks"] files = [ {file = "certifi-2026.2.25-py3-none-any.whl", hash = "sha256:027692e4402ad994f1c42e52a4997a9763c646b73e4096e4d5d6db8af1d6f0fa"}, {file = "certifi-2026.2.25.tar.gz", hash = "sha256:e887ab5cee78ea814d3472169153c2d12cd43b14bd03329a39a9c6e2e80bfba7"}, @@ -551,7 +551,7 @@ version = "2.0.0" description = "Foreign Function Interface for Python calling C code." optional = false python-versions = ">=3.9" -groups = ["main", "dev"] +groups = ["main", "dev", "notebooks"] files = [ {file = "cffi-2.0.0-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:0cf2d91ecc3fcc0625c2c530fe004f82c110405f101548512cce44322fa8ac44"}, {file = "cffi-2.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f73b96c41e3b2adedc34a7356e64c8eb96e03a3782b535e043a986276ce12a49"}, @@ -638,7 +638,7 @@ files = [ {file = "cffi-2.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:b882b3df248017dba09d6b16defe9b5c407fe32fc7c65a9c69798e6175601be9"}, {file = "cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529"}, ] -markers = {main = "platform_python_implementation != \"PyPy\""} +markers = {main = "platform_python_implementation != \"PyPy\"", dev = "platform_python_implementation != \"PyPy\""} [package.dependencies] pycparser = {version = "*", markers = "implementation_name != \"PyPy\""} @@ -661,7 +661,7 @@ version = "3.4.5" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7" -groups = ["dev"] +groups = ["dev", "notebooks"] files = [ {file = "charset_normalizer-3.4.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4167a621a9a1a986c73777dbc15d4b5eac8ac5c10393374109a343d4013ec765"}, {file = "charset_normalizer-3.4.5-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3f64c6bf8f32f9133b668c7f7a7cbdbc453412bc95ecdbd157f3b1e377a92990"}, @@ -799,12 +799,12 @@ version = "0.4.6" description = "Cross-platform colored terminal text." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" -groups = ["dev"] -markers = "platform_system == \"Windows\" or sys_platform == \"win32\"" +groups = ["dev", "notebooks"] files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] +markers = {dev = "platform_system == \"Windows\" or sys_platform == \"win32\"", notebooks = "sys_platform == \"win32\""} [[package]] name = "comm" @@ -812,7 +812,7 @@ version = "0.2.3" description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." optional = false python-versions = ">=3.8" -groups = ["dev"] +groups = ["notebooks"] files = [ {file = "comm-0.2.3-py3-none-any.whl", hash = "sha256:c615d91d75f7f04f095b30d1c1711babd43bdc6419c1be9886a85f2f4e489417"}, {file = "comm-0.2.3.tar.gz", hash = "sha256:2dc8048c10962d55d7ad693be1e7045d891b7ce8d999c97963a5e3e99c055971"}, @@ -996,7 +996,7 @@ version = "1.8.20" description = "An implementation of the Debug Adapter Protocol for Python" optional = false python-versions = ">=3.8" -groups = ["dev"] +groups = ["notebooks"] files = [ {file = "debugpy-1.8.20-cp310-cp310-macosx_15_0_x86_64.whl", hash = "sha256:157e96ffb7f80b3ad36d808646198c90acb46fdcfd8bb1999838f0b6f2b59c64"}, {file = "debugpy-1.8.20-cp310-cp310-manylinux_2_34_x86_64.whl", hash = "sha256:c1178ae571aff42e61801a38b007af504ec8e05fde1c5c12e5a7efef21009642"}, @@ -1036,7 +1036,7 @@ version = "5.2.1" description = "Decorators for Humans" optional = false python-versions = ">=3.8" -groups = ["dev"] +groups = ["notebooks"] files = [ {file = "decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a"}, {file = "decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360"}, @@ -1048,7 +1048,7 @@ version = "0.7.1" description = "XML bomb protection for Python stdlib modules" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -groups = ["dev"] +groups = ["dev", "notebooks"] files = [ {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"}, {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, @@ -1101,7 +1101,7 @@ version = "2.2.1" description = "Get the currently executing AST node of a frame, and other information" optional = false python-versions = ">=3.8" -groups = ["dev"] +groups = ["notebooks"] files = [ {file = "executing-2.2.1-py2.py3-none-any.whl", hash = "sha256:760643d3452b4d777d295bb167ccc74c64a81df23fb5e08eff250c425a4b2017"}, {file = "executing-2.2.1.tar.gz", hash = "sha256:3632cc370565f6648cc328b32435bd120a1e4ebb20c77e3fdde9a13cd1e533c4"}, @@ -1116,7 +1116,7 @@ version = "2.21.2" description = "Fastest Python implementation of JSON schema" optional = false python-versions = "*" -groups = ["dev"] +groups = ["notebooks"] files = [ {file = "fastjsonschema-2.21.2-py3-none-any.whl", hash = "sha256:1c797122d0a86c5cace2e54bf4e819c36223b552017172f32c5c024a6b77e463"}, {file = "fastjsonschema-2.21.2.tar.gz", hash = "sha256:b1eb43748041c880796cd077f1a07c3d94e93ae84bba5ed36800a33554ae05de"}, @@ -1143,7 +1143,7 @@ version = "1.5.1" description = "Validates fully-qualified domain names against RFC 1123, so that they are acceptable to modern bowsers" optional = false python-versions = ">=2.7, !=3.0, !=3.1, !=3.2, !=3.3, !=3.4, <4" -groups = ["dev"] +groups = ["notebooks"] files = [ {file = "fqdn-1.5.1-py3-none-any.whl", hash = "sha256:3a179af3761e4df6eb2e026ff9e1a3033d3587bf980a0b1b2e1e5d08d7358014"}, {file = "fqdn-1.5.1.tar.gz", hash = "sha256:105ed3677e767fb5ca086a0c1f4bb66ebc3c100be518f0e0d755d9eae164d89f"}, @@ -1295,7 +1295,7 @@ version = "0.16.0" description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] +groups = ["main", "dev", "notebooks"] files = [ {file = "h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86"}, {file = "h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1"}, @@ -1307,7 +1307,7 @@ version = "1.0.9" description = "A minimal low-level HTTP client." optional = false python-versions = ">=3.8" -groups = ["main", "dev"] +groups = ["main", "dev", "notebooks"] files = [ {file = "httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55"}, {file = "httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8"}, @@ -1329,7 +1329,7 @@ version = "0.28.1" description = "The next generation HTTP client." optional = false python-versions = ">=3.8" -groups = ["main", "dev"] +groups = ["main", "dev", "notebooks"] files = [ {file = "httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad"}, {file = "httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc"}, @@ -1369,7 +1369,7 @@ version = "3.11" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] +groups = ["main", "dev", "notebooks"] files = [ {file = "idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea"}, {file = "idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902"}, @@ -1408,7 +1408,7 @@ version = "7.2.0" description = "IPython Kernel for Jupyter" optional = false python-versions = ">=3.10" -groups = ["dev"] +groups = ["notebooks"] files = [ {file = "ipykernel-7.2.0-py3-none-any.whl", hash = "sha256:3bbd4420d2b3cc105cbdf3756bfc04500b1e52f090a90716851f3916c62e1661"}, {file = "ipykernel-7.2.0.tar.gz", hash = "sha256:18ed160b6dee2cbb16e5f3575858bc19d8f1fe6046a9a680c708494ce31d909e"}, @@ -1442,7 +1442,7 @@ version = "9.11.0" description = "IPython: Productive Interactive Computing" optional = false python-versions = ">=3.12" -groups = ["dev"] +groups = ["notebooks"] files = [ {file = "ipython-9.11.0-py3-none-any.whl", hash = "sha256:6922d5bcf944c6e525a76a0a304451b60a2b6f875e86656d8bc2dfda5d710e19"}, {file = "ipython-9.11.0.tar.gz", hash = "sha256:2a94bc4406b22ecc7e4cb95b98450f3ea493a76bec8896cda11b78d7752a6667"}, @@ -1474,7 +1474,7 @@ version = "1.1.1" description = "Defines a variety of Pygments lexers for highlighting IPython code." optional = false python-versions = ">=3.8" -groups = ["dev"] +groups = ["notebooks"] files = [ {file = "ipython_pygments_lexers-1.1.1-py3-none-any.whl", hash = "sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c"}, {file = "ipython_pygments_lexers-1.1.1.tar.gz", hash = "sha256:09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81"}, @@ -1489,7 +1489,7 @@ version = "20.11.0" description = "Operations with ISO 8601 durations" optional = false python-versions = ">=3.7" -groups = ["dev"] +groups = ["notebooks"] files = [ {file = "isoduration-20.11.0-py3-none-any.whl", hash = "sha256:b2904c2a4228c3d44f409c8ae8e2370eb21a26f7ac2ec5446df141dde3452042"}, {file = "isoduration-20.11.0.tar.gz", hash = "sha256:ac2f9015137935279eac671f94f89eb00584f940f5dc49462a0c4ee692ba1bd9"}, @@ -1504,7 +1504,7 @@ version = "0.19.2" description = "An autocompletion tool for Python that can be used for text editors." optional = false python-versions = ">=3.6" -groups = ["dev"] +groups = ["notebooks"] files = [ {file = "jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9"}, {file = "jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0"}, @@ -1524,7 +1524,7 @@ version = "3.1.6" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" -groups = ["dev"] +groups = ["notebooks"] files = [ {file = "jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67"}, {file = "jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d"}, @@ -1542,7 +1542,7 @@ version = "0.13.0" description = "A Python implementation of the JSON5 data format." optional = false python-versions = ">=3.8.0" -groups = ["dev"] +groups = ["notebooks"] files = [ {file = "json5-0.13.0-py3-none-any.whl", hash = "sha256:9a08e1dd65f6a4d4c6fa82d216cf2477349ec2346a38fd70cc11d2557499fbcc"}, {file = "json5-0.13.0.tar.gz", hash = "sha256:b1edf8d487721c0bf64d83c28e91280781f6e21f4a797d3261c7c828d4c165bf"}, @@ -1554,7 +1554,7 @@ version = "3.0.0" description = "Identify specific nodes in a JSON document (RFC 6901)" optional = false python-versions = ">=3.7" -groups = ["dev"] +groups = ["notebooks"] files = [ {file = "jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942"}, {file = "jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef"}, @@ -1566,7 +1566,7 @@ version = "4.26.0" description = "An implementation of JSON Schema validation for Python" optional = false python-versions = ">=3.10" -groups = ["dev"] +groups = ["notebooks"] files = [ {file = "jsonschema-4.26.0-py3-none-any.whl", hash = "sha256:d489f15263b8d200f8387e64b4c3a75f06629559fb73deb8fdfb525f2dab50ce"}, {file = "jsonschema-4.26.0.tar.gz", hash = "sha256:0c26707e2efad8aa1bfc5b7ce170f3fccc2e4918ff85989ba9ffa9facb2be326"}, @@ -1597,7 +1597,7 @@ version = "2025.9.1" description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" optional = false python-versions = ">=3.9" -groups = ["dev"] +groups = ["notebooks"] files = [ {file = "jsonschema_specifications-2025.9.1-py3-none-any.whl", hash = "sha256:98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe"}, {file = "jsonschema_specifications-2025.9.1.tar.gz", hash = "sha256:b540987f239e745613c7a9176f3edb72b832a4ac465cf02712288397832b5e8d"}, @@ -1612,7 +1612,7 @@ version = "8.8.0" description = "Jupyter protocol implementation and client libraries" optional = false python-versions = ">=3.10" -groups = ["dev"] +groups = ["notebooks"] files = [ {file = "jupyter_client-8.8.0-py3-none-any.whl", hash = "sha256:f93a5b99c5e23a507b773d3a1136bd6e16c67883ccdbd9a829b0bbdb98cd7d7a"}, {file = "jupyter_client-8.8.0.tar.gz", hash = "sha256:d556811419a4f2d96c869af34e854e3f059b7cc2d6d01a9cd9c85c267691be3e"}, @@ -1636,7 +1636,7 @@ version = "5.9.1" description = "Jupyter core package. A base package on which Jupyter projects rely." optional = false python-versions = ">=3.10" -groups = ["dev"] +groups = ["notebooks"] files = [ {file = "jupyter_core-5.9.1-py3-none-any.whl", hash = "sha256:ebf87fdc6073d142e114c72c9e29a9d7ca03fad818c5d300ce2adc1fb0743407"}, {file = "jupyter_core-5.9.1.tar.gz", hash = "sha256:4d09aaff303b9566c3ce657f580bd089ff5c91f5f89cf7d8846c3cdf465b5508"}, @@ -1656,7 +1656,7 @@ version = "0.12.0" description = "Jupyter Event System library" optional = false python-versions = ">=3.9" -groups = ["dev"] +groups = ["notebooks"] files = [ {file = "jupyter_events-0.12.0-py3-none-any.whl", hash = "sha256:6464b2fa5ad10451c3d35fabc75eab39556ae1e2853ad0c0cc31b656731a97fb"}, {file = "jupyter_events-0.12.0.tar.gz", hash = "sha256:fc3fce98865f6784c9cd0a56a20644fc6098f21c8c33834a8d9fe383c17e554b"}, @@ -1683,7 +1683,7 @@ version = "2.3.0" description = "Multi-Language Server WebSocket proxy for Jupyter Notebook/Lab server" optional = false python-versions = ">=3.8" -groups = ["dev"] +groups = ["notebooks"] files = [ {file = "jupyter_lsp-2.3.0-py3-none-any.whl", hash = "sha256:e914a3cb2addf48b1c7710914771aaf1819d46b2e5a79b0f917b5478ec93f34f"}, {file = "jupyter_lsp-2.3.0.tar.gz", hash = "sha256:458aa59339dc868fb784d73364f17dbce8836e906cd75fd471a325cba02e0245"}, @@ -1698,7 +1698,7 @@ version = "2.17.0" description = "The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications." optional = false python-versions = ">=3.9" -groups = ["dev"] +groups = ["notebooks"] files = [ {file = "jupyter_server-2.17.0-py3-none-any.whl", hash = "sha256:e8cb9c7db4251f51ed307e329b81b72ccf2056ff82d50524debde1ee1870e13f"}, {file = "jupyter_server-2.17.0.tar.gz", hash = "sha256:c38ea898566964c888b4772ae1ed58eca84592e88251d2cfc4d171f81f7e99d5"}, @@ -1734,7 +1734,7 @@ version = "0.5.4" description = "A Jupyter Server Extension Providing Terminals." optional = false python-versions = ">=3.8" -groups = ["dev"] +groups = ["notebooks"] files = [ {file = "jupyter_server_terminals-0.5.4-py3-none-any.whl", hash = "sha256:55be353fc74a80bc7f3b20e6be50a55a61cd525626f578dcb66a5708e2007d14"}, {file = "jupyter_server_terminals-0.5.4.tar.gz", hash = "sha256:bbda128ed41d0be9020349f9f1f2a4ab9952a73ed5f5ac9f1419794761fb87f5"}, @@ -1754,7 +1754,7 @@ version = "4.5.6" description = "JupyterLab computational environment" optional = false python-versions = ">=3.9" -groups = ["dev"] +groups = ["notebooks"] files = [ {file = "jupyterlab-4.5.6-py3-none-any.whl", hash = "sha256:d6b3dac883aa4d9993348e0f8e95b24624f75099aed64eab6a4351a9cdd1e580"}, {file = "jupyterlab-4.5.6.tar.gz", hash = "sha256:642fe2cfe7f0f5922a8a558ba7a0d246c7bc133b708dfe43f7b3a826d163cf42"}, @@ -1788,7 +1788,7 @@ version = "0.3.0" description = "Pygments theme using JupyterLab CSS variables" optional = false python-versions = ">=3.8" -groups = ["dev"] +groups = ["notebooks"] files = [ {file = "jupyterlab_pygments-0.3.0-py3-none-any.whl", hash = "sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780"}, {file = "jupyterlab_pygments-0.3.0.tar.gz", hash = "sha256:721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d"}, @@ -1800,7 +1800,7 @@ version = "2.28.0" description = "A set of server components for JupyterLab and JupyterLab like applications." optional = false python-versions = ">=3.8" -groups = ["dev"] +groups = ["notebooks"] files = [ {file = "jupyterlab_server-2.28.0-py3-none-any.whl", hash = "sha256:e4355b148fdcf34d312bbbc80f22467d6d20460e8b8736bf235577dd18506968"}, {file = "jupyterlab_server-2.28.0.tar.gz", hash = "sha256:35baa81898b15f93573e2deca50d11ac0ae407ebb688299d3a5213265033712c"}, @@ -1826,7 +1826,7 @@ version = "1.3.1" description = "a modern parsing library" optional = false python-versions = ">=3.8" -groups = ["dev"] +groups = ["notebooks"] files = [ {file = "lark-1.3.1-py3-none-any.whl", hash = "sha256:c629b661023a014c37da873b4ff58a817398d12635d3bbb2c5a03be7fe5d1e12"}, {file = "lark-1.3.1.tar.gz", hash = "sha256:b426a7a6d6d53189d318f2b6236ab5d6429eaf09259f1ca33eb716eed10d2905"}, @@ -2003,7 +2003,7 @@ version = "3.0.3" description = "Safely add untrusted strings to HTML/XML markup." optional = false python-versions = ">=3.9" -groups = ["dev"] +groups = ["notebooks"] files = [ {file = "markupsafe-3.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2f981d352f04553a7171b8e44369f2af4055f888dfb147d55e42d29e29e74559"}, {file = "markupsafe-3.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e1c1493fb6e50ab01d20a22826e57520f1284df32f2d8601fdd90b6304601419"}, @@ -2102,7 +2102,7 @@ version = "0.2.1" description = "Inline Matplotlib backend for Jupyter" optional = false python-versions = ">=3.9" -groups = ["dev"] +groups = ["notebooks"] files = [ {file = "matplotlib_inline-0.2.1-py3-none-any.whl", hash = "sha256:d56ce5156ba6085e00a9d54fead6ed29a9c47e215cd1bba2e976ef39f5710a76"}, {file = "matplotlib_inline-0.2.1.tar.gz", hash = "sha256:e1ee949c340d771fc39e241ea75683deb94762c8fa5f2927ec57c83c4dffa9fe"}, @@ -2132,7 +2132,7 @@ version = "3.2.0" description = "A sane and fast Markdown parser with useful plugins and renderers" optional = false python-versions = ">=3.8" -groups = ["dev"] +groups = ["notebooks"] files = [ {file = "mistune-3.2.0-py3-none-any.whl", hash = "sha256:febdc629a3c78616b94393c6580551e0e34cc289987ec6c35ed3f4be42d0eee1"}, {file = "mistune-3.2.0.tar.gz", hash = "sha256:708487c8a8cdd99c9d90eb3ed4c3ed961246ff78ac82f03418f5183ab70e398a"}, @@ -2445,7 +2445,7 @@ version = "0.10.4" description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." optional = false python-versions = ">=3.10.0" -groups = ["dev"] +groups = ["notebooks"] files = [ {file = "nbclient-0.10.4-py3-none-any.whl", hash = "sha256:9162df5a7373d70d606527300a95a975a47c137776cd942e52d9c7e29ff83440"}, {file = "nbclient-0.10.4.tar.gz", hash = "sha256:1e54091b16e6da39e297b0ece3e10f6f29f4ac4e8ee515d29f8a7099bd6553c9"}, @@ -2468,7 +2468,7 @@ version = "7.17.0" description = "Convert Jupyter Notebooks (.ipynb files) to other formats." optional = false python-versions = ">=3.9" -groups = ["dev"] +groups = ["notebooks"] files = [ {file = "nbconvert-7.17.0-py3-none-any.whl", hash = "sha256:4f99a63b337b9a23504347afdab24a11faa7d86b405e5c8f9881cd313336d518"}, {file = "nbconvert-7.17.0.tar.gz", hash = "sha256:1b2696f1b5be12309f6c7d707c24af604b87dfaf6d950794c7b07acab96dda78"}, @@ -2505,7 +2505,7 @@ version = "5.10.4" description = "The Jupyter Notebook format" optional = false python-versions = ">=3.8" -groups = ["dev"] +groups = ["notebooks"] files = [ {file = "nbformat-5.10.4-py3-none-any.whl", hash = "sha256:3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b"}, {file = "nbformat-5.10.4.tar.gz", hash = "sha256:322168b14f937a5d11362988ecac2a4952d3d8e3a2cbeb2319584631226d5b3a"}, @@ -2527,7 +2527,7 @@ version = "1.6.0" description = "Patch asyncio to allow nested event loops" optional = false python-versions = ">=3.5" -groups = ["dev"] +groups = ["notebooks"] files = [ {file = "nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c"}, {file = "nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe"}, @@ -2599,7 +2599,7 @@ version = "0.2.4" description = "A shim layer for notebook traits and config" optional = false python-versions = ">=3.7" -groups = ["dev"] +groups = ["notebooks"] files = [ {file = "notebook_shim-0.2.4-py3-none-any.whl", hash = "sha256:411a5be4e9dc882a074ccbcae671eda64cceb068767e9a3419096986560e1cef"}, {file = "notebook_shim-0.2.4.tar.gz", hash = "sha256:b4b2cfa1b65d98307ca24361f5b30fe785b53c3fd07b7a47e89acb5e6ac638cb"}, @@ -2635,7 +2635,7 @@ version = "24.2" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" -groups = ["dev"] +groups = ["dev", "notebooks"] files = [ {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, @@ -2647,7 +2647,7 @@ version = "1.5.1" description = "Utilities for writing pandoc filters in python" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -groups = ["dev"] +groups = ["notebooks"] files = [ {file = "pandocfilters-1.5.1-py2.py3-none-any.whl", hash = "sha256:93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc"}, {file = "pandocfilters-1.5.1.tar.gz", hash = "sha256:002b4a555ee4ebc03f8b66307e287fa492e4a77b4ea14d3f934328297bb4939e"}, @@ -2659,7 +2659,7 @@ version = "0.8.6" description = "A Python Parser" optional = false python-versions = ">=3.6" -groups = ["dev"] +groups = ["notebooks"] files = [ {file = "parso-0.8.6-py2.py3-none-any.whl", hash = "sha256:2c549f800b70a5c4952197248825584cb00f033b29c692671d3bf08bf380baff"}, {file = "parso-0.8.6.tar.gz", hash = "sha256:2b9a0332696df97d454fa67b81618fd69c35a7b90327cbe6ba5c92d2c68a7bfd"}, @@ -2693,7 +2693,7 @@ version = "4.9.0" description = "Pexpect allows easy control of interactive console applications." optional = false python-versions = "*" -groups = ["dev"] +groups = ["notebooks"] markers = "sys_platform != \"win32\" and sys_platform != \"emscripten\"" files = [ {file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"}, @@ -2787,7 +2787,7 @@ version = "4.9.4" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.10" -groups = ["dev"] +groups = ["dev", "notebooks"] files = [ {file = "platformdirs-4.9.4-py3-none-any.whl", hash = "sha256:68a9a4619a666ea6439f2ff250c12a853cd1cbd5158d258bd824a7df6be2f868"}, {file = "platformdirs-4.9.4.tar.gz", hash = "sha256:1ec356301b7dc906d83f371c8f487070e99d3ccf9e501686456394622a01a934"}, @@ -2834,7 +2834,7 @@ version = "0.24.1" description = "Python client for the Prometheus monitoring system." optional = false python-versions = ">=3.9" -groups = ["dev"] +groups = ["notebooks"] files = [ {file = "prometheus_client-0.24.1-py3-none-any.whl", hash = "sha256:150db128af71a5c2482b36e588fc8a6b95e498750da4b17065947c16070f4055"}, {file = "prometheus_client-0.24.1.tar.gz", hash = "sha256:7e0ced7fbbd40f7b84962d5d2ab6f17ef88a72504dcf7c0b40737b43b2a461f9"}, @@ -2851,7 +2851,7 @@ version = "3.0.52" description = "Library for building powerful interactive command lines in Python" optional = false python-versions = ">=3.8" -groups = ["dev"] +groups = ["notebooks"] files = [ {file = "prompt_toolkit-3.0.52-py3-none-any.whl", hash = "sha256:9aac639a3bbd33284347de5ad8d68ecc044b91a762dc39b7c21095fcd6a19955"}, {file = "prompt_toolkit-3.0.52.tar.gz", hash = "sha256:28cde192929c8e7321de85de1ddbe736f1375148b02f2e17edd840042b1be855"}, @@ -2998,7 +2998,7 @@ version = "7.2.2" description = "Cross-platform lib for process and system monitoring." optional = false python-versions = ">=3.6" -groups = ["dev"] +groups = ["notebooks"] files = [ {file = "psutil-7.2.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2edccc433cbfa046b980b0df0171cd25bcaeb3a68fe9022db0979e7aa74a826b"}, {file = "psutil-7.2.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e78c8603dcd9a04c7364f1a3e670cea95d51ee865e4efb3556a3a63adef958ea"}, @@ -3033,7 +3033,7 @@ version = "0.7.0" description = "Run a subprocess in a pseudo terminal" optional = false python-versions = "*" -groups = ["dev"] +groups = ["notebooks"] markers = "sys_platform != \"win32\" and sys_platform != \"emscripten\" or os_name != \"nt\"" files = [ {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, @@ -3046,7 +3046,7 @@ version = "0.2.3" description = "Safely evaluate AST nodes without side effects" optional = false python-versions = "*" -groups = ["dev"] +groups = ["notebooks"] files = [ {file = "pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0"}, {file = "pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42"}, @@ -3119,12 +3119,12 @@ version = "3.0" description = "C parser in Python" optional = false python-versions = ">=3.10" -groups = ["main", "dev"] +groups = ["main", "dev", "notebooks"] files = [ {file = "pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992"}, {file = "pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29"}, ] -markers = {main = "platform_python_implementation != \"PyPy\" and implementation_name != \"PyPy\"", dev = "implementation_name != \"PyPy\""} +markers = {main = "platform_python_implementation != \"PyPy\" and implementation_name != \"PyPy\"", dev = "platform_python_implementation != \"PyPy\" and implementation_name != \"PyPy\"", notebooks = "implementation_name != \"PyPy\""} [[package]] name = "pycryptodomex" @@ -3203,7 +3203,7 @@ version = "2.19.2" description = "Pygments is a syntax highlighting package written in Python." optional = false python-versions = ">=3.8" -groups = ["dev"] +groups = ["dev", "notebooks"] files = [ {file = "pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b"}, {file = "pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887"}, @@ -3336,7 +3336,7 @@ version = "2.9.0.post0" description = "Extensions to the standard Python datetime module" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -groups = ["dev"] +groups = ["notebooks"] files = [ {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, @@ -3386,7 +3386,7 @@ version = "4.0.0" description = "JSON Log Formatter for the Python Logging Package" optional = false python-versions = ">=3.8" -groups = ["dev"] +groups = ["notebooks"] files = [ {file = "python_json_logger-4.0.0-py3-none-any.whl", hash = "sha256:af09c9daf6a813aa4cc7180395f50f2a9e5fa056034c9953aec92e381c5ba1e2"}, {file = "python_json_logger-4.0.0.tar.gz", hash = "sha256:f58e68eb46e1faed27e0f574a55a0455eecd7b8a5b88b85a784519ba3cff047f"}, @@ -3456,7 +3456,7 @@ version = "3.0.3" description = "Pseudo terminal support for Windows from Python." optional = false python-versions = ">=3.9" -groups = ["dev"] +groups = ["notebooks"] markers = "os_name == \"nt\"" files = [ {file = "pywinpty-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:ff05f12d775b142b11c6fe085129bdd759b61cf7d41da6c745e78e3a1ef5bf40"}, @@ -3483,7 +3483,7 @@ version = "6.0.3" description = "YAML parser and emitter for Python" optional = false python-versions = ">=3.8" -groups = ["dev"] +groups = ["dev", "notebooks"] files = [ {file = "PyYAML-6.0.3-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:c2514fceb77bc5e7a2f7adfaa1feb2fb311607c9cb518dbc378688ec73d8292f"}, {file = "PyYAML-6.0.3-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9c57bb8c96f6d1808c030b1687b9b5fb476abaa47f0db9c0101f5e9f394e97f4"}, @@ -3566,7 +3566,7 @@ version = "27.1.0" description = "Python bindings for 0MQ" optional = false python-versions = ">=3.8" -groups = ["dev"] +groups = ["notebooks"] files = [ {file = "pyzmq-27.1.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:508e23ec9bc44c0005c4946ea013d9317ae00ac67778bd47519fdf5a0e930ff4"}, {file = "pyzmq-27.1.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:507b6f430bdcf0ee48c0d30e734ea89ce5567fd7b8a0f0044a369c176aa44556"}, @@ -3671,7 +3671,7 @@ version = "0.37.0" description = "JSON Referencing + Python" optional = false python-versions = ">=3.10" -groups = ["dev"] +groups = ["notebooks"] files = [ {file = "referencing-0.37.0-py3-none-any.whl", hash = "sha256:381329a9f99628c9069361716891d34ad94af76e461dcb0335825aecc7692231"}, {file = "referencing-0.37.0.tar.gz", hash = "sha256:44aefc3142c5b842538163acb373e24cce6632bd54bdb01b21ad5863489f50d8"}, @@ -3687,7 +3687,7 @@ version = "2.32.5" description = "Python HTTP for Humans." optional = false python-versions = ">=3.9" -groups = ["dev"] +groups = ["dev", "notebooks"] files = [ {file = "requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6"}, {file = "requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf"}, @@ -3709,7 +3709,7 @@ version = "0.1.4" description = "A pure python RFC3339 validator" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -groups = ["dev"] +groups = ["notebooks"] files = [ {file = "rfc3339_validator-0.1.4-py2.py3-none-any.whl", hash = "sha256:24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa"}, {file = "rfc3339_validator-0.1.4.tar.gz", hash = "sha256:138a2abdf93304ad60530167e51d2dfb9549521a836871b88d7f4695d0022f6b"}, @@ -3724,7 +3724,7 @@ version = "0.1.1" description = "Pure python rfc3986 validator" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -groups = ["dev"] +groups = ["notebooks"] files = [ {file = "rfc3986_validator-0.1.1-py2.py3-none-any.whl", hash = "sha256:2f235c432ef459970b4306369336b9d5dbdda31b510ca1e327636e01f528bfa9"}, {file = "rfc3986_validator-0.1.1.tar.gz", hash = "sha256:3d44bde7921b3b9ec3ae4e3adca370438eccebc676456449b145d533b240d055"}, @@ -3736,7 +3736,7 @@ version = "1.1.0" description = "Helper functions to syntactically validate strings according to RFC 3987." optional = false python-versions = ">=3.9" -groups = ["dev"] +groups = ["notebooks"] files = [ {file = "rfc3987_syntax-1.1.0-py3-none-any.whl", hash = "sha256:6c3d97604e4c5ce9f714898e05401a0445a641cfa276432b0a648c80856f6a3f"}, {file = "rfc3987_syntax-1.1.0.tar.gz", hash = "sha256:717a62cbf33cffdd16dfa3a497d81ce48a660ea691b1ddd7be710c22f00b4a0d"}, @@ -3792,7 +3792,7 @@ version = "0.30.0" description = "Python bindings to Rust's persistent data structures (rpds)" optional = false python-versions = ">=3.10" -groups = ["dev"] +groups = ["notebooks"] files = [ {file = "rpds_py-0.30.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:679ae98e00c0e8d68a7fda324e16b90fd5260945b45d3b824c892cec9eea3288"}, {file = "rpds_py-0.30.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4cc2206b76b4f576934f0ed374b10d7ca5f457858b157ca52064bdfc26b9fc00"}, @@ -3945,7 +3945,7 @@ version = "2.1.0" description = "Send file to trash natively under Mac OS X, Windows and Linux" optional = false python-versions = ">=3.8" -groups = ["dev"] +groups = ["notebooks"] files = [ {file = "send2trash-2.1.0-py3-none-any.whl", hash = "sha256:0da2f112e6d6bb22de6aa6daa7e144831a4febf2a87261451c4ad849fe9a873c"}, {file = "send2trash-2.1.0.tar.gz", hash = "sha256:1c72b39f09457db3c05ce1d19158c2cbef4c32b8bedd02c155e49282b7ea7459"}, @@ -3961,7 +3961,7 @@ version = "82.0.1" description = "Most extensible Python build backend with support for C/C++ extension modules" optional = false python-versions = ">=3.9" -groups = ["dev"] +groups = ["notebooks"] files = [ {file = "setuptools-82.0.1-py3-none-any.whl", hash = "sha256:a59e362652f08dcd477c78bb6e7bd9d80a7995bc73ce773050228a348ce2e5bb"}, {file = "setuptools-82.0.1.tar.gz", hash = "sha256:7d872682c5d01cfde07da7bccc7b65469d3dca203318515ada1de5eda35efbf9"}, @@ -3982,7 +3982,7 @@ version = "1.17.0" description = "Python 2 and 3 compatibility utilities" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -groups = ["dev"] +groups = ["notebooks"] files = [ {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, @@ -4006,7 +4006,7 @@ version = "2.8.3" description = "A modern CSS selector implementation for Beautiful Soup." optional = false python-versions = ">=3.9" -groups = ["dev"] +groups = ["notebooks"] files = [ {file = "soupsieve-2.8.3-py3-none-any.whl", hash = "sha256:ed64f2ba4eebeab06cc4962affce381647455978ffc1e36bb79a545b91f45a95"}, {file = "soupsieve-2.8.3.tar.gz", hash = "sha256:3267f1eeea4251fb42728b6dfb746edc9acaffc4a45b27e19450b676586e8349"}, @@ -4018,7 +4018,7 @@ version = "0.6.3" description = "Extract data from python stack frames and tracebacks for informative displays" optional = false python-versions = "*" -groups = ["dev"] +groups = ["notebooks"] files = [ {file = "stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695"}, {file = "stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9"}, @@ -4065,7 +4065,7 @@ version = "0.18.1" description = "Tornado websocket backend for the Xterm.js Javascript terminal emulator library." optional = false python-versions = ">=3.8" -groups = ["dev"] +groups = ["notebooks"] files = [ {file = "terminado-0.18.1-py3-none-any.whl", hash = "sha256:a4468e1b37bb318f8a86514f65814e1afc977cf29b3992a4500d9dd305dcceb0"}, {file = "terminado-0.18.1.tar.gz", hash = "sha256:de09f2c4b85de4765f7714688fff57d3e75bad1f909b589fde880460c753fd2e"}, @@ -4087,7 +4087,7 @@ version = "1.4.0" description = "A tiny CSS parser" optional = false python-versions = ">=3.8" -groups = ["dev"] +groups = ["notebooks"] files = [ {file = "tinycss2-1.4.0-py3-none-any.whl", hash = "sha256:3a49cf47b7675da0b15d0c6e1df8df4ebd96e9394bb905a5775adb0d884c5289"}, {file = "tinycss2-1.4.0.tar.gz", hash = "sha256:10c0972f6fc0fbee87c3edb76549357415e94548c1ae10ebccdea16fb404a9b7"}, @@ -4175,7 +4175,7 @@ version = "6.5.5" description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." optional = false python-versions = ">=3.9" -groups = ["dev"] +groups = ["notebooks"] files = [ {file = "tornado-6.5.5-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:487dc9cc380e29f58c7ab88f9e27cdeef04b2140862e5076a66fb6bb68bb1bfa"}, {file = "tornado-6.5.5-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:65a7f1d46d4bb41df1ac99f5fcb685fb25c7e61613742d5108b010975a9a6521"}, @@ -4195,7 +4195,7 @@ version = "5.14.3" description = "Traitlets Python configuration system" optional = false python-versions = ">=3.8" -groups = ["dev"] +groups = ["notebooks"] files = [ {file = "traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f"}, {file = "traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7"}, @@ -4211,7 +4211,7 @@ version = "4.15.0" description = "Backported and Experimental Type Hints for Python 3.9+" optional = false python-versions = ">=3.9" -groups = ["main", "dev"] +groups = ["main", "dev", "notebooks"] files = [ {file = "typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548"}, {file = "typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466"}, @@ -4223,7 +4223,7 @@ version = "2025.3" description = "Provider of IANA time zone data" optional = false python-versions = ">=2" -groups = ["dev"] +groups = ["notebooks"] files = [ {file = "tzdata-2025.3-py2.py3-none-any.whl", hash = "sha256:06a47e5700f3081aab02b2e513160914ff0694bce9947d6b76ebd6bf57cfc5d1"}, {file = "tzdata-2025.3.tar.gz", hash = "sha256:de39c2ca5dc7b0344f2eba86f49d614019d29f060fc4ebc8a417896a620b56a7"}, @@ -4235,7 +4235,7 @@ version = "1.3.0" description = "RFC 6570 URI Template Processor" optional = false python-versions = ">=3.7" -groups = ["dev"] +groups = ["notebooks"] files = [ {file = "uri-template-1.3.0.tar.gz", hash = "sha256:0e00f8eb65e18c7de20d595a14336e9f337ead580c70934141624b6d1ffdacc7"}, {file = "uri_template-1.3.0-py3-none-any.whl", hash = "sha256:a44a133ea12d44a0c0f06d7d42a52d71282e77e2f937d8abd5655b8d56fc1363"}, @@ -4250,7 +4250,7 @@ version = "2.6.3" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.9" -groups = ["dev"] +groups = ["dev", "notebooks"] files = [ {file = "urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4"}, {file = "urllib3-2.6.3.tar.gz", hash = "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed"}, @@ -4286,7 +4286,7 @@ version = "0.6.0" description = "Measures the displayed width of unicode strings in a terminal" optional = false python-versions = ">=3.8" -groups = ["dev"] +groups = ["notebooks"] files = [ {file = "wcwidth-0.6.0-py3-none-any.whl", hash = "sha256:1a3a1e510b553315f8e146c54764f4fb6264ffad731b3d78088cdb1478ffbdad"}, {file = "wcwidth-0.6.0.tar.gz", hash = "sha256:cdc4e4262d6ef9a1a57e018384cbeb1208d8abbc64176027e2c2455c81313159"}, @@ -4298,7 +4298,7 @@ version = "25.10.0" description = "A library for working with the color formats defined by HTML and CSS." optional = false python-versions = ">=3.10" -groups = ["dev"] +groups = ["notebooks"] files = [ {file = "webcolors-25.10.0-py3-none-any.whl", hash = "sha256:032c727334856fc0b968f63daa252a1ac93d33db2f5267756623c210e57a4f1d"}, {file = "webcolors-25.10.0.tar.gz", hash = "sha256:62abae86504f66d0f6364c2a8520de4a0c47b80c03fc3a5f1815fedbef7c19bf"}, @@ -4310,7 +4310,7 @@ version = "0.5.1" description = "Character encoding aliases for legacy web content" optional = false python-versions = "*" -groups = ["dev"] +groups = ["notebooks"] files = [ {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, @@ -4322,7 +4322,7 @@ version = "1.9.0" description = "WebSocket client for Python with low level API options" optional = false python-versions = ">=3.9" -groups = ["dev"] +groups = ["notebooks"] files = [ {file = "websocket_client-1.9.0-py3-none-any.whl", hash = "sha256:af248a825037ef591efbf6ed20cc5faa03d3b47b9e5a2230a529eeee1c1fc3ef"}, {file = "websocket_client-1.9.0.tar.gz", hash = "sha256:9e813624b6eb619999a97dc7958469217c3176312b3a16a4bd1bc7e08a46ec98"}, @@ -4479,4 +4479,4 @@ propcache = ">=0.2.1" [metadata] lock-version = "2.1" python-versions = "^3.13" -content-hash = "35d84515fb762a9bcc77b722a1baede344cf6be6cdc5dde0a7152769ff61395e" +content-hash = "9e8fa1788d64f0062bf93ae842e20e79180c05c3624d685cfca83b79894c0e4b" diff --git a/pyproject.toml b/pyproject.toml index e2587231..6e7cdd15 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -45,6 +45,11 @@ puyapy = "^5.7.1" urllib3 = "^2.6.3" pip = "^26.0.1" python-dotenv = "^1.2.2" + +[tool.poetry.group.notebooks] +optional = true + +[tool.poetry.group.notebooks.dependencies] ipykernel = "^7.2.0" jupyterlab = "^4.4.7" From f2c39cd0d87a4f8f22b52b78381b069023abaf87 Mon Sep 17 00:00:00 2001 From: Cosimo Bassi <65770425+cusma@users.noreply.github.com> Date: Fri, 13 Mar 2026 22:36:41 +0100 Subject: [PATCH 229/244] chore: avoid event off by one Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- examples/pam_fixed_coupon_bond.ipynb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/examples/pam_fixed_coupon_bond.ipynb b/examples/pam_fixed_coupon_bond.ipynb index eaeaa951..49d497e8 100644 --- a/examples/pam_fixed_coupon_bond.ipynb +++ b/examples/pam_fixed_coupon_bond.ipynb @@ -191,7 +191,8 @@ " secondary_market_closure_date=maturity_date + cst.DAY_2_SEC,\n", ")\n", "total_interest_amount = derive_total_interest_amount(normalized)\n", - "expected_event_types = [\"IED\"] + [\"IP\"] * (maturity_offset // coupon_period) + [\"MD\"]\n", + "num_ip_events = max(0, len(normalized.schedule) - 2)\n", + "expected_event_types = [\"IED\"] + [\"IP\"] * num_ip_events + [\"MD\"]\n", "assert [entry.event_type for entry in normalized.schedule] == expected_event_types\n", "\n", "issue_price_label = format_asset_amount(\n", From 15ae15e8d79fb9f28f2549f4162fd29b8729bc4d Mon Sep 17 00:00:00 2001 From: Cosimo Bassi <65770425+cusma@users.noreply.github.com> Date: Fri, 13 Mar 2026 22:37:01 +0100 Subject: [PATCH 230/244] chore: nit Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- examples/_support.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/_support.py b/examples/_support.py index 9eb4c427..d7c84f44 100644 --- a/examples/_support.py +++ b/examples/_support.py @@ -139,7 +139,7 @@ def schedule_rows( entry.next_nominal_interest_rate, fixed_point_scale=normalized.terms.fixed_point_scale, ) - if entry.next_nominal_interest_rate + if entry.next_nominal_interest_rate is not None else "-" ), } From 30a86fd55ee50016cbc4cdc7c5bce9857eaca5a9 Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 22:40:25 +0100 Subject: [PATCH 231/244] chore: nit --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 406bb920..d8ed3473 100644 --- a/Makefile +++ b/Makefile @@ -114,7 +114,7 @@ pre-commit: clean: rm -rf .mypy_cache .pytest_cache .ruff_cache .coverage htmlcov book mermaid-init.js mermaid.min.js - find . -type d \( -name __pycache__ -o -name '.ipynb_checkpoints' \) -exec rm -rf {} + + find . -type d \( -name __pycache__ -o -name '.ipynb_checkpoints' \) -prune -exec rm -rf {} + find . -type f -name '*.pyc' -delete all: build lint test From 3ded4e75b120ac110021757fac96e26f4d2f5cd9 Mon Sep 17 00:00:00 2001 From: Cosimo Bassi <65770425+cusma@users.noreply.github.com> Date: Fri, 13 Mar 2026 22:42:44 +0100 Subject: [PATCH 232/244] chore: apply code review Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- d-asa | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/d-asa b/d-asa index e29b9225..d9e7e06b 100755 --- a/d-asa +++ b/d-asa @@ -194,7 +194,7 @@ cmd_jupyter() { if localnet_network_exists; then docker run --rm -it \ --network "$LOCALNET_NETWORK" \ - -p 8888:8888 \ + -p 127.0.0.1:8888:8888 \ -e D_ASA_LOCALNET_HOST="$NETWORK_LOCALNET_HOST" \ -e D_ASA_ALGOD_HOST="$NETWORK_LOCALNET_HOST" \ -e D_ASA_KMD_HOST="$NETWORK_LOCALNET_HOST" \ @@ -206,13 +206,13 @@ cmd_jupyter() { -v "$REPO_ROOT:$REPO_ROOT" \ -w "$REPO_ROOT" \ "$IMAGE_TAG" \ - jupyter lab examples/ --ip=0.0.0.0 --port=8888 --no-browser --allow-root --NotebookApp.token='' --NotebookApp.password='' + jupyter lab examples/ --ip=0.0.0.0 --port=8888 --no-browser --allow-root else case "$(uname -s)" in Linux*) docker run --rm -it \ --add-host=host.docker.internal:host-gateway \ - -p 8888:8888 \ + -p 127.0.0.1:8888:8888 \ -e D_ASA_LOCALNET_HOST="$DEFAULT_LOCALNET_HOST" \ -e D_ASA_LOCALNET_TOKEN="$DEFAULT_LOCALNET_TOKEN" \ -e D_ASA_ALGOD_PORT="$DEFAULT_ALGOD_PORT" \ @@ -221,7 +221,7 @@ cmd_jupyter() { -v "$REPO_ROOT:$REPO_ROOT" \ -w "$REPO_ROOT" \ "$IMAGE_TAG" \ - jupyter lab examples/ --ip=0.0.0.0 --port=8888 --no-browser --allow-root --NotebookApp.token='' --NotebookApp.password='' + jupyter lab examples/ --ip=0.0.0.0 --port=8888 --no-browser --allow-root ;; *) docker run --rm -it \ From 9ab0622351590fc93b78ea97ec77ddc09e45bf47 Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 23:22:22 +0100 Subject: [PATCH 233/244] chore: canonical package structure --- pyproject.toml | 50 +++++++++++++------ src/{ => d_asa}/__init__.py | 3 ++ src/{ => d_asa}/_dasa_mappers.py | 0 src/{ => d_asa}/artifacts/DASA.arc56.json | 0 src/{ => d_asa}/artifacts/__init__.py | 0 src/{ => d_asa}/artifacts/dasa_avm_client.py | 0 src/{ => d_asa}/artifacts/dasa_client.py | 0 src/d_asa/constants.py | 42 ++++++++++++++++ src/{ => d_asa}/contracts.py | 2 +- src/{ => d_asa}/dasa.py | 5 +- src/{ => d_asa}/day_count.py | 5 +- src/{ => d_asa}/errors.py | 0 src/{ => d_asa}/localnet.py | 13 +---- src/{ => d_asa}/models.py | 3 +- src/{ => d_asa}/normalization/__init__.py | 0 src/{ => d_asa}/normalization/ann_builder.py | 5 +- src/{ => d_asa}/normalization/annuity.py | 3 +- src/{ => d_asa}/normalization/builders.py | 5 +- src/{ => d_asa}/normalization/calculations.py | 3 +- src/{ => d_asa}/normalization/conversions.py | 3 +- src/{ => d_asa}/normalization/core.py | 3 +- src/{ => d_asa}/normalization/event_seeds.py | 0 src/{ => d_asa}/normalization/schedules.py | 0 src/{ => d_asa}/pam_lifecycle.py | 14 +++--- src/d_asa/py.typed | 0 src/{ => d_asa}/registry.py | 2 +- src/{ => d_asa}/schedule.py | 3 +- src/{ => d_asa}/showcase.py | 24 ++++----- src/{ => d_asa}/unix_time.py | 11 ++-- 29 files changed, 120 insertions(+), 79 deletions(-) rename src/{ => d_asa}/__init__.py (96%) rename src/{ => d_asa}/_dasa_mappers.py (100%) rename src/{ => d_asa}/artifacts/DASA.arc56.json (100%) rename src/{ => d_asa}/artifacts/__init__.py (100%) rename src/{ => d_asa}/artifacts/dasa_avm_client.py (100%) rename src/{ => d_asa}/artifacts/dasa_client.py (100%) create mode 100644 src/d_asa/constants.py rename src/{ => d_asa}/contracts.py (99%) rename src/{ => d_asa}/dasa.py (99%) rename src/{ => d_asa}/day_count.py (99%) rename src/{ => d_asa}/errors.py (100%) rename src/{ => d_asa}/localnet.py (98%) rename src/{ => d_asa}/models.py (99%) rename src/{ => d_asa}/normalization/__init__.py (100%) rename src/{ => d_asa}/normalization/ann_builder.py (98%) rename src/{ => d_asa}/normalization/annuity.py (99%) rename src/{ => d_asa}/normalization/builders.py (99%) rename src/{ => d_asa}/normalization/calculations.py (98%) rename src/{ => d_asa}/normalization/conversions.py (99%) rename src/{ => d_asa}/normalization/core.py (99%) rename src/{ => d_asa}/normalization/event_seeds.py (100%) rename src/{ => d_asa}/normalization/schedules.py (100%) rename src/{ => d_asa}/pam_lifecycle.py (98%) create mode 100644 src/d_asa/py.typed rename src/{ => d_asa}/registry.py (98%) rename src/{ => d_asa}/schedule.py (99%) rename src/{ => d_asa}/showcase.py (97%) rename src/{ => d_asa}/unix_time.py (52%) diff --git a/pyproject.toml b/pyproject.toml index 6e7cdd15..7464dbcd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,21 +1,18 @@ -[tool.poetry] +[project] name = "d-asa" version = "0.20.0" description = "Debt Algorand Standard Application" license = "AGPL-3.0" -authors = ["cusma "] -maintainers = ["cusma "] readme = "README.md" -documentation = "https://cusma.github.io/d-asa/" -repository = "https://github.com/cusma/d-asa" -packages = [ - { include = "src" }, - { include = "smart_contracts" }, - { include = "modules" }, +requires-python = ">=3.13,<4.0" +authors = [ + { name = "cusma", email = "cosimo.bassi@gmail.com" }, ] -include = [ - "src/artifacts/*.json", - "smart_contracts/artifacts/**/*", +maintainers = [ + { name = "cusma", email = "cosimo.bassi@gmail.com" }, +] +dependencies = [ + "algokit-utils>=4.2.3,<5.0.0", ] keywords = [ "algorand", @@ -26,9 +23,20 @@ keywords = [ "actus", ] +[project.urls] +Documentation = "https://cusma.github.io/d-asa/" +Repository = "https://github.com/cusma/d-asa" + +[tool.poetry] +packages = [ + { include = "d_asa", from = "src" }, +] +include = [ + { path = "src/d_asa/artifacts/*.json", format = ["sdist", "wheel"] }, +] + [tool.poetry.dependencies] -python = "^3.13" -algokit-utils = "^4.2.3" +python = ">=3.13,<4.0" [tool.poetry.group.dev.dependencies] algokit-client-generator = "^2.2.0" @@ -54,7 +62,7 @@ ipykernel = "^7.2.0" jupyterlab = "^4.4.7" [build-system] -requires = ["poetry-core"] +requires = ["poetry-core>=2.0.0,<3.0.0"] build-backend = "poetry.core.masonry.api" [tool.ruff] @@ -79,13 +87,16 @@ lint.unfixable = ["B", "RUF"] [tool.ruff.lint.per-file-ignores] "tests/**" = ["ANN001", "ANN401", "E501"] +"smart_contracts/abi_types.py" = ["UP040"] +"smart_contracts/events.py" = ["UP040"] +"modules/**" = ["UP040"] [tool.ruff.lint.flake8-annotations] allow-star-arg-any = true suppress-none-returning = true [tool.pytest.ini_options] -pythonpath = ["smart_contracts", "tests"] +pythonpath = ["src", "tests"] markers = [ "showcase: narrative LocalNet walkthroughs that are excluded from the default test run", ] @@ -93,6 +104,7 @@ markers = [ [tool.mypy] files = "smart_contracts/" python_version = "3.12" +mypy_path = "src" disallow_any_generics = true disallow_subclassing_any = true disallow_untyped_calls = true @@ -111,6 +123,12 @@ disallow_any_decorated = true disallow_any_explicit = true untyped_calls_exclude = ["algosdk"] +[[tool.mypy.overrides]] +module = "smart_contracts.d_asa.deploy_config" +disallow_any_unimported = false +disallow_any_expr = false +follow_imports = "skip" + [[tool.mypy.overrides]] module = "tests.*" disallow_any_expr = false diff --git a/src/__init__.py b/src/d_asa/__init__.py similarity index 96% rename from src/__init__.py rename to src/d_asa/__init__.py index 2147b502..d1d5bc09 100644 --- a/src/__init__.py +++ b/src/d_asa/__init__.py @@ -1,5 +1,6 @@ # ruff: noqa: RUF022 +from . import constants, enums from .contracts import ( ContractAttributes, make_pam_fixed_coupon_bond_profile, @@ -50,6 +51,7 @@ "ArrangerRole", "AuthorityRole", "ClaimResult", + "constants", "ContractAttributes", "ContractState", "ContractView", @@ -57,6 +59,7 @@ "DAsa", "DAsaRole", "ExecutionScheduleEntry", + "enums", "FundingResult", "HoldingAccount", "InitialKernelState", diff --git a/src/_dasa_mappers.py b/src/d_asa/_dasa_mappers.py similarity index 100% rename from src/_dasa_mappers.py rename to src/d_asa/_dasa_mappers.py diff --git a/src/artifacts/DASA.arc56.json b/src/d_asa/artifacts/DASA.arc56.json similarity index 100% rename from src/artifacts/DASA.arc56.json rename to src/d_asa/artifacts/DASA.arc56.json diff --git a/src/artifacts/__init__.py b/src/d_asa/artifacts/__init__.py similarity index 100% rename from src/artifacts/__init__.py rename to src/d_asa/artifacts/__init__.py diff --git a/src/artifacts/dasa_avm_client.py b/src/d_asa/artifacts/dasa_avm_client.py similarity index 100% rename from src/artifacts/dasa_avm_client.py rename to src/d_asa/artifacts/dasa_avm_client.py diff --git a/src/artifacts/dasa_client.py b/src/d_asa/artifacts/dasa_client.py similarity index 100% rename from src/artifacts/dasa_client.py rename to src/d_asa/artifacts/dasa_client.py diff --git a/src/d_asa/constants.py b/src/d_asa/constants.py new file mode 100644 index 00000000..e943c79c --- /dev/null +++ b/src/d_asa/constants.py @@ -0,0 +1,42 @@ +from typing import Final + +################################################################################ +# AVM +################################################################################ +MAX_UINT64: Final[int] = 2**64 - 1 +MAX_ARGS_SIZE: Final[int] = 2048 +OP_UP_CONTRACT_CONFIG_BASE_BUDGET: Final[int] = 1_500 +OP_UP_CONTRACT_CONFIG_PER_ENTRY_BUDGET: Final[int] = 100 +OP_UP_FUND_DUE_CASHFLOWS_BASE_BUDGET: Final[int] = 1_500 +OP_UP_FUND_DUE_CASHFLOWS_PER_EVENT_BUDGET: Final[int] = 100 +OP_UP_NON_CASH_BASE_BUDGET: Final[int] = 1_500 +OP_UP_NON_CASH_PER_ENTRY_BUDGET: Final[int] = 100 +SCHEDULE_PAGE_SIZE: Final[int] = 16 + +################################################################################ +# Conversions +################################################################################ +BPS: Final[int] = 10_000 +FIXED_POINT_SCALE: Final[int] = 1_000_000_000 +DAY_2_SEC: Final[int] = 24 * 60 * 60 + +################################################################################ +# Role Keys Prefix +################################################################################ +PREFIX_ID_ARRANGER: Final[bytes] = b"R:ARR#" +PREFIX_ID_OP_DAEMON: Final[bytes] = b"R:OPD#" +PREFIX_ID_ACCOUNT_MANAGER: Final[bytes] = b"R:MNG#" +PREFIX_ID_PRIMARY_DEALER: Final[bytes] = b"R:PYD#" +PREFIX_ID_TRUSTEE: Final[bytes] = b"R:TRS#" +PREFIX_ID_AUTHORITY: Final[bytes] = b"R:AUT#" +PREFIX_ID_OBSERVER: Final[bytes] = b"R:MOC#" + +################################################################################ +# Accounting Prefix +################################################################################ +PREFIX_ID_ACCOUNT: Final[bytes] = b"A#" + +################################################################################ +# ACTUS Schedule Prefix +################################################################################ +PREFIX_ID_SCHEDULE_PAGE: Final[bytes] = b"S#" diff --git a/src/contracts.py b/src/d_asa/contracts.py similarity index 99% rename from src/contracts.py rename to src/d_asa/contracts.py index 94a363f9..5d5960d3 100644 --- a/src/contracts.py +++ b/src/d_asa/contracts.py @@ -269,7 +269,7 @@ def make_pam_fixed_coupon_bond_profile( Example: >>> from decimal import Decimal - >>> from src.schedule import Cycle + >>> from d_asa.schedule import Cycle >>> fcb = make_pam_fixed_coupon_bond_profile( ... contract_id=2, ... status_date=1609459200, # 2021-01-01 diff --git a/src/dasa.py b/src/d_asa/dasa.py similarity index 99% rename from src/dasa.py rename to src/d_asa/dasa.py index 6e73125c..3ec0b226 100644 --- a/src/dasa.py +++ b/src/d_asa/dasa.py @@ -20,9 +20,8 @@ from algosdk.transaction import Transaction from algosdk.v2client.models import SimulateTraceConfig -from smart_contracts import constants as cst -from smart_contracts import enums - +from . import constants as cst +from . import enums from ._dasa_mappers import ( to_client_initial_state, to_client_observed_cash_event, diff --git a/src/day_count.py b/src/d_asa/day_count.py similarity index 99% rename from src/day_count.py rename to src/d_asa/day_count.py index 6a171a3b..e762d690 100644 --- a/src/day_count.py +++ b/src/d_asa/day_count.py @@ -2,9 +2,8 @@ from datetime import datetime from enum import IntEnum -from smart_contracts import constants as cst -from smart_contracts import enums - +from . import constants as cst +from . import enums from .errors import ActusNormalizationError from .unix_time import UTCTimeStamp, timestamp_to_datetime diff --git a/src/errors.py b/src/d_asa/errors.py similarity index 100% rename from src/errors.py rename to src/d_asa/errors.py diff --git a/src/localnet.py b/src/d_asa/localnet.py similarity index 98% rename from src/localnet.py rename to src/d_asa/localnet.py index 4bf550db..3840ac9f 100644 --- a/src/localnet.py +++ b/src/d_asa/localnet.py @@ -21,7 +21,8 @@ from algosdk.kmd import KMDClient from algosdk.v2client.algod import AlgodClient -from src.artifacts.dasa_client import AccountGetPositionArgs +from . import enums +from .artifacts.dasa_client import AccountGetPositionArgs DEFAULT_LOCALNET_HOST = "localhost" DEFAULT_LOCALNET_TOKEN = "a" * 64 @@ -107,8 +108,6 @@ class Currency: class DAsaAccountManager(SigningAccount): @classmethod def role_id(cls) -> int: - from smart_contracts import enums - return enums.ROLE_ACCOUNT_MANAGER @@ -116,8 +115,6 @@ def role_id(cls) -> int: class DAsaPrimaryDealer(SigningAccount): @classmethod def role_id(cls) -> int: - from smart_contracts import enums - return enums.ROLE_PRIMARY_DEALER @@ -125,8 +122,6 @@ def role_id(cls) -> int: class DAsaTrustee(SigningAccount): @classmethod def role_id(cls) -> int: - from smart_contracts import enums - return enums.ROLE_TRUSTEE @@ -134,8 +129,6 @@ def role_id(cls) -> int: class DAsaAuthority(SigningAccount): @classmethod def role_id(cls) -> int: - from smart_contracts import enums - return enums.ROLE_AUTHORITY @@ -143,8 +136,6 @@ def role_id(cls) -> int: class DAsaInterestOracle(SigningAccount): @classmethod def role_id(cls) -> int: - from smart_contracts import enums - return enums.ROLE_OBSERVER diff --git a/src/models.py b/src/d_asa/models.py similarity index 99% rename from src/models.py rename to src/d_asa/models.py index 614bef0c..02959d0f 100644 --- a/src/models.py +++ b/src/d_asa/models.py @@ -2,8 +2,7 @@ from dataclasses import dataclass -from smart_contracts import enums - +from . import enums from .errors import ActusNormalizationError from .unix_time import UTCTimeStamp diff --git a/src/normalization/__init__.py b/src/d_asa/normalization/__init__.py similarity index 100% rename from src/normalization/__init__.py rename to src/d_asa/normalization/__init__.py diff --git a/src/normalization/ann_builder.py b/src/d_asa/normalization/ann_builder.py similarity index 98% rename from src/normalization/ann_builder.py rename to src/d_asa/normalization/ann_builder.py index fee176ed..e92547c2 100644 --- a/src/normalization/ann_builder.py +++ b/src/d_asa/normalization/ann_builder.py @@ -2,9 +2,8 @@ from __future__ import annotations -from smart_contracts import constants as cst -from smart_contracts import enums - +from .. import constants as cst +from .. import enums from ..contracts import ContractAttributes from ..errors import ActusNormalizationError from ..models import NormalizedActusTerms diff --git a/src/normalization/annuity.py b/src/d_asa/normalization/annuity.py similarity index 99% rename from src/normalization/annuity.py rename to src/d_asa/normalization/annuity.py index 4a5d053f..33fec2f7 100644 --- a/src/normalization/annuity.py +++ b/src/d_asa/normalization/annuity.py @@ -4,8 +4,7 @@ from collections.abc import Sequence -from smart_contracts import constants as cst - +from .. import constants as cst from ..contracts import ContractAttributes from ..day_count import days_in_month, year_fraction_fixed from ..errors import ActusNormalizationError diff --git a/src/normalization/builders.py b/src/d_asa/normalization/builders.py similarity index 99% rename from src/normalization/builders.py rename to src/d_asa/normalization/builders.py index e738fadb..7a40c515 100644 --- a/src/normalization/builders.py +++ b/src/d_asa/normalization/builders.py @@ -2,9 +2,8 @@ from __future__ import annotations -from smart_contracts import constants as cst -from smart_contracts import enums - +from .. import constants as cst +from .. import enums from ..contracts import ContractAttributes from ..errors import ActusNormalizationError from ..models import NormalizedActusTerms diff --git a/src/normalization/calculations.py b/src/d_asa/normalization/calculations.py similarity index 98% rename from src/normalization/calculations.py rename to src/d_asa/normalization/calculations.py index d31f724d..f9821f18 100644 --- a/src/normalization/calculations.py +++ b/src/d_asa/normalization/calculations.py @@ -2,8 +2,7 @@ from __future__ import annotations -from smart_contracts import constants as cst - +from .. import constants as cst from ..day_count import year_fraction_fixed diff --git a/src/normalization/conversions.py b/src/d_asa/normalization/conversions.py similarity index 99% rename from src/normalization/conversions.py rename to src/d_asa/normalization/conversions.py index e0b3a118..e0d156e3 100644 --- a/src/normalization/conversions.py +++ b/src/d_asa/normalization/conversions.py @@ -5,8 +5,7 @@ from decimal import Decimal from typing import cast -from smart_contracts import constants as cst - +from .. import constants as cst from ..errors import ActusNormalizationError diff --git a/src/normalization/core.py b/src/d_asa/normalization/core.py similarity index 99% rename from src/normalization/core.py rename to src/d_asa/normalization/core.py index df879d8b..90644689 100644 --- a/src/normalization/core.py +++ b/src/d_asa/normalization/core.py @@ -5,8 +5,7 @@ from collections.abc import Sequence from decimal import Decimal -from smart_contracts import constants as cst - +from .. import constants as cst from ..contracts import ContractAttributes from ..day_count import BusinessDayConvention, Calendar, year_fraction_fixed from ..errors import ActusNormalizationError, UnsupportedActusFeatureError diff --git a/src/normalization/event_seeds.py b/src/d_asa/normalization/event_seeds.py similarity index 100% rename from src/normalization/event_seeds.py rename to src/d_asa/normalization/event_seeds.py diff --git a/src/normalization/schedules.py b/src/d_asa/normalization/schedules.py similarity index 100% rename from src/normalization/schedules.py rename to src/d_asa/normalization/schedules.py diff --git a/src/pam_lifecycle.py b/src/d_asa/pam_lifecycle.py similarity index 98% rename from src/pam_lifecycle.py rename to src/d_asa/pam_lifecycle.py index fdf5486f..5cbc7682 100644 --- a/src/pam_lifecycle.py +++ b/src/d_asa/pam_lifecycle.py @@ -14,10 +14,9 @@ SigningAccount, ) -from smart_contracts import constants as cst -from smart_contracts import enums -from src import ExecutionScheduleEntry, NormalizationResult -from src.artifacts.dasa_client import ( +from . import constants as cst +from . import enums +from .artifacts.dasa_client import ( AccountOpenArgs, ContractConfigArgs, ContractScheduleArgs, @@ -27,9 +26,10 @@ PrimaryDistributionArgs, Prospectus, ) -from src.localnet import Currency, DAsaAccountManager, DAsaPrimaryDealer -from src.registry import EVENT_TYPE_IDS -from src.schedule import Cycle +from .localnet import Currency, DAsaAccountManager, DAsaPrimaryDealer +from .models import ExecutionScheduleEntry, NormalizationResult +from .registry import EVENT_TYPE_IDS +from .schedule import Cycle PRINCIPAL = 10_000 MINIMUM_DENOMINATION = 100 diff --git a/src/d_asa/py.typed b/src/d_asa/py.typed new file mode 100644 index 00000000..e69de29b diff --git a/src/registry.py b/src/d_asa/registry.py similarity index 98% rename from src/registry.py rename to src/d_asa/registry.py index 6cb64b92..84574ffc 100644 --- a/src/registry.py +++ b/src/d_asa/registry.py @@ -2,7 +2,7 @@ from __future__ import annotations -from smart_contracts import enums +from . import enums SUPPORTED_CONTRACT_TYPES: frozenset[str] = frozenset( {"PAM", "LAM", "NAM", "ANN", "LAX", "CLM"} diff --git a/src/schedule.py b/src/d_asa/schedule.py similarity index 99% rename from src/schedule.py rename to src/d_asa/schedule.py index 601a8d15..2e87e155 100644 --- a/src/schedule.py +++ b/src/d_asa/schedule.py @@ -5,8 +5,7 @@ from dataclasses import dataclass from typing import Literal, cast -from smart_contracts.constants import DAY_2_SEC - +from .constants import DAY_2_SEC from .day_count import ( BusinessDayConvention, Calendar, diff --git a/src/showcase.py b/src/d_asa/showcase.py similarity index 97% rename from src/showcase.py rename to src/d_asa/showcase.py index 8cd557f2..b6132d30 100644 --- a/src/showcase.py +++ b/src/d_asa/showcase.py @@ -3,7 +3,6 @@ import argparse from collections.abc import Callable from dataclasses import dataclass -from typing import TypeVar from algokit_utils import ( AlgoAmount, @@ -14,10 +13,9 @@ SigningAccount, ) -from smart_contracts import constants as cst -from smart_contracts import enums -from src import NormalizationResult, normalize_contract_attributes -from src.artifacts.dasa_client import ( +from . import constants as cst +from . import enums +from .artifacts.dasa_client import ( ClaimDueCashflowsArgs, ContractCreateArgs, DasaClient, @@ -26,8 +24,8 @@ RbacAssignRoleArgs, RoleValidity, ) -from src.contracts import make_pam_fixed_coupon_bond_profile, make_pam_zero_coupon_bond -from src.localnet import ( +from .contracts import make_pam_fixed_coupon_bond_profile, make_pam_zero_coupon_bond +from .localnet import ( Currency, DAsaAccountManager, DAsaPrimaryDealer, @@ -40,7 +38,9 @@ load_localnet_config, time_warp, ) -from src.pam_lifecycle import ( +from .models import NormalizationResult +from .normalization import normalize_contract_attributes +from .pam_lifecycle import ( ISSUANCE_DELAY_CYCLE, MINIMUM_DENOMINATION, PRINCIPAL, @@ -51,8 +51,8 @@ make_claim_trace, setup_pam_lifecycle, ) -from src.registry import EVENT_TYPE_IDS -from src.schedule import Cycle +from .registry import EVENT_TYPE_IDS +from .schedule import Cycle INITIAL_ALGO_FUNDS = AlgoAmount.from_algo(10_000) DENOMINATION_ASA_NAME = "Euro" @@ -67,8 +67,6 @@ ZERO_COUPON_MATURITY_CYCLE = Cycle.parse_cycle("360D") ZERO_COUPON_DISCOUNT_BPS = 200 -RoleAccountType = TypeVar("RoleAccountType", bound=SigningAccount) - @dataclass(frozen=True, slots=True) class PamShowcaseScenario: @@ -435,7 +433,7 @@ def _create_dasa_client( return client -def _create_role_account( +def _create_role_account[RoleAccountType: SigningAccount]( algorand: AlgorandClient, role_account_class: type[RoleAccountType], client: DasaClient, diff --git a/src/unix_time.py b/src/d_asa/unix_time.py similarity index 52% rename from src/unix_time.py rename to src/d_asa/unix_time.py index 1501cfff..2f5832ad 100644 --- a/src/unix_time.py +++ b/src/d_asa/unix_time.py @@ -1,18 +1,17 @@ -from datetime import datetime, timezone -from typing import TypeAlias +from datetime import UTC, datetime -UTCTimeStamp: TypeAlias = int +type UTCTimeStamp = int def timestamp_to_datetime(timestamp: UTCTimeStamp) -> datetime: """Convert a UTC UNIX timestamp into a timezone-aware datetime.""" - return datetime.fromtimestamp(timestamp, tz=timezone.utc) + return datetime.fromtimestamp(timestamp, tz=UTC) def datetime_to_timestamp(value: datetime) -> UTCTimeStamp: """Convert a datetime into a UTC UNIX timestamp.""" if value.tzinfo is None: - value = value.replace(tzinfo=timezone.utc) - return UTCTimeStamp(value.timestamp()) + value = value.replace(tzinfo=UTC) + return int(value.timestamp()) From 1b7807888853c2159057453c44f98bd8742e7ee0 Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 23:26:18 +0100 Subject: [PATCH 234/244] chore: update import paths --- examples/_support.py | 4 +-- examples/pam_fixed_coupon_bond.ipynb | 46 ++++++++++++++-------------- examples/pam_zero_coupon_bond.ipynb | 28 ++++++++--------- 3 files changed, 39 insertions(+), 39 deletions(-) diff --git a/examples/_support.py b/examples/_support.py index d7c84f44..88ad0678 100644 --- a/examples/_support.py +++ b/examples/_support.py @@ -13,8 +13,8 @@ SigningAccount, ) -from src import NormalizationResult -from src.localnet import ( +from src.d_asa import NormalizationResult +from src.d_asa.localnet import ( Currency, algorand_client_from_localnet, load_localnet_config, diff --git a/examples/pam_fixed_coupon_bond.ipynb b/examples/pam_fixed_coupon_bond.ipynb index 49d497e8..5824a454 100644 --- a/examples/pam_fixed_coupon_bond.ipynb +++ b/examples/pam_fixed_coupon_bond.ipynb @@ -41,21 +41,32 @@ " path for path in [Path.cwd(), *Path.cwd().parents] if (path / \"pyproject.toml\").exists()\n", ")\n", "os.chdir(REPO_ROOT)\n", - "if str(REPO_ROOT) not in sys.path:\n", - " sys.path.insert(0, str(REPO_ROOT))\n", + "if str(REPO_ROOT / \"src\") not in sys.path:\n", + " sys.path.insert(0, str(REPO_ROOT / \"src\"))\n", "\n", "print(f\"Repository root: {REPO_ROOT}\")\n" ] }, { - "cell_type": "code", - "execution_count": null, - "id": "8dd0d8092fe74a7c96281538738b07e2", "metadata": {}, + "cell_type": "code", "outputs": [], + "execution_count": null, "source": [ "from algokit_utils import AssetTransferParams, CommonAppCallParams\n", "\n", + "from src.d_asa import (\n", + " DAsa,\n", + " DAsaRole,\n", + " NormalizationResult,\n", + " enums,\n", + " make_pam_fixed_coupon_bond_profile,\n", + " normalize_contract_attributes,\n", + ")\n", + "from src.d_asa import constants as cst\n", + "from src.d_asa.artifacts.dasa_client import PrimaryDistributionArgs\n", + "from src.d_asa.localnet import get_latest_timestamp, time_warp\n", + "from src.d_asa.schedule import Cycle\n", "from examples._support import (\n", " cashflow_rows,\n", " connect_localnet,\n", @@ -65,27 +76,15 @@ " opt_in_asset,\n", " render_table,\n", " schedule_rows,\n", - ")\n", - "from smart_contracts import constants as cst\n", - "from smart_contracts import enums\n", - "from src import (\n", - " DAsa,\n", - " DAsaRole,\n", - " NormalizationResult,\n", - " make_pam_fixed_coupon_bond_profile,\n", - " normalize_contract_attributes,\n", - ")\n", - "from src.artifacts.dasa_client import PrimaryDistributionArgs\n", - "from src.localnet import get_latest_timestamp, time_warp\n", - "from src.schedule import Cycle\n" - ] + ")\n" + ], + "id": "6a72551a49d687ac" }, { - "cell_type": "code", - "execution_count": null, - "id": "72eea5119410473aa328ad9291626812", "metadata": {}, + "cell_type": "code", "outputs": [], + "execution_count": null, "source": [ "PRINCIPAL = 10_000\n", "MINIMUM_DENOMINATION = 100\n", @@ -131,7 +130,8 @@ " nominal_interest_rate = entry.next_nominal_interest_rate\n", "\n", " return total_interest\n" - ] + ], + "id": "6a1061c4b38b743d" }, { "cell_type": "code", diff --git a/examples/pam_zero_coupon_bond.ipynb b/examples/pam_zero_coupon_bond.ipynb index fe111802..a6b71b86 100644 --- a/examples/pam_zero_coupon_bond.ipynb +++ b/examples/pam_zero_coupon_bond.ipynb @@ -41,8 +41,8 @@ " path for path in [Path.cwd(), *Path.cwd().parents] if (path / \"pyproject.toml\").exists()\n", ")\n", "os.chdir(REPO_ROOT)\n", - "if str(REPO_ROOT) not in sys.path:\n", - " sys.path.insert(0, str(REPO_ROOT))\n", + "if str(REPO_ROOT / \"src\") not in sys.path:\n", + " sys.path.insert(0, str(REPO_ROOT / \"src\"))\n", "\n", "print(f\"Repository root: {REPO_ROOT}\")\n" ] @@ -56,6 +56,17 @@ "source": [ "from algokit_utils import AssetTransferParams, CommonAppCallParams\n", "\n", + "from src.d_asa import (\n", + " DAsa,\n", + " DAsaRole,\n", + " enums,\n", + " make_pam_zero_coupon_bond,\n", + " normalize_contract_attributes,\n", + ")\n", + "from src.d_asa import constants as cst\n", + "from src.d_asa.artifacts.dasa_client import PrimaryDistributionArgs\n", + "from src.d_asa.localnet import get_latest_timestamp, time_warp\n", + "from src.d_asa.schedule import Cycle\n", "from examples._support import (\n", " cashflow_rows,\n", " connect_localnet,\n", @@ -65,18 +76,7 @@ " opt_in_asset,\n", " render_table,\n", " schedule_rows,\n", - ")\n", - "from smart_contracts import constants as cst\n", - "from smart_contracts import enums\n", - "from src import (\n", - " DAsa,\n", - " DAsaRole,\n", - " make_pam_zero_coupon_bond,\n", - " normalize_contract_attributes,\n", - ")\n", - "from src.artifacts.dasa_client import PrimaryDistributionArgs\n", - "from src.localnet import get_latest_timestamp, time_warp\n", - "from src.schedule import Cycle\n" + ")\n" ] }, { From e37a85dd86c001008de44b7cef681d1d7c6ab112 Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 23:29:17 +0100 Subject: [PATCH 235/244] chore: update import paths --- smart_contracts/__main__.py | 4 +- smart_contracts/d_asa/deploy_config.py | 14 +- tests/conftest.py | 2 +- tests/conftest_helpers.py | 8 +- tests/pam/conftest.py | 2 +- tests/pam/fcb/test_pam_fixed_coupon_bond.py | 14 +- tests/pam/pam_test_support.py | 6 +- tests/pam/test_pam_lifecycle_showcase.py | 6 +- tests/pam/zcb/test_pam_zero_coupon_bond.py | 14 +- tests/sdk/test_contracts.py | 8 +- tests/sdk/test_dasa.py | 42 +-- tests/sdk/test_day_count.py | 86 ++--- tests/sdk/test_localnet.py | 10 +- tests/sdk/test_models.py | 2 +- tests/sdk/test_normalization.py | 26 +- tests/sdk/test_registry.py | 4 +- tests/sdk/test_schedule.py | 330 +++++++------------- tests/sdk/test_unix_time.py | 40 +-- tests/utils.py | 2 +- 19 files changed, 246 insertions(+), 374 deletions(-) diff --git a/smart_contracts/__main__.py b/smart_contracts/__main__.py index ea56a6af..875a6371 100644 --- a/smart_contracts/__main__.py +++ b/smart_contracts/__main__.py @@ -23,7 +23,7 @@ # Determine the root path based on this file's location. root_path = Path(__file__).parent -src_artifact_path = root_path.parent / "src" / "artifacts" +src_artifact_path = root_path.parent / "src" / "d_asa" / "artifacts" canonical_src_contract_name = "d_asa" canonical_src_app_spec_name = "DASA.arc56.json" canonical_src_client_name = "dasa_client.py" @@ -156,7 +156,7 @@ def _reset_src_artifacts(contract_name: str) -> None: def _sync_src_artifacts(output_dir: Path, contract_name: str) -> Path | None: - """Moves the canonical D-ASA artifacts into src/artifacts.""" + """Moves the canonical D-ASA artifacts into src/d_asa/artifacts.""" if contract_name != canonical_src_contract_name: return None diff --git a/smart_contracts/d_asa/deploy_config.py b/smart_contracts/d_asa/deploy_config.py index 4ed0d57c..6d3c288a 100644 --- a/smart_contracts/d_asa/deploy_config.py +++ b/smart_contracts/d_asa/deploy_config.py @@ -17,14 +17,12 @@ ) from algosdk.constants import ZERO_ADDRESS -from smart_contracts import constants as cst -from smart_contracts import enums -from src import ( +from src.d_asa import ( ExecutionScheduleEntry, NormalizationResult, normalize_contract_attributes, ) -from src.artifacts.dasa_client import ( +from src.d_asa.artifacts.dasa_client import ( ContractConfigArgs, ContractCreateArgs, ContractScheduleArgs, @@ -35,11 +33,13 @@ NormalizedActusTerms, Prospectus, ) -from src.contracts import ( +from src.d_asa.contracts import ( make_pam_fixed_coupon_bond_profile, make_pam_zero_coupon_bond, ) -from src.schedule import Cycle +from src.d_asa.schedule import Cycle +from smart_contracts import constants as cst +from smart_contracts import enums logger = logging.getLogger(__name__) @@ -294,7 +294,7 @@ def _client_initial_state(result: NormalizationResult) -> InitialKernelState: def _client_schedule_page( page: tuple[ExecutionScheduleEntry, ...], ) -> list[tuple[int, int, int, int, int, int, int, int, int]]: - from src.registry import EVENT_TYPE_IDS + from d_asa.registry import EVENT_TYPE_IDS return [ ( diff --git a/tests/conftest.py b/tests/conftest.py index 10340402..a869c43d 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -9,7 +9,7 @@ ) from algokit_utils.config import config -from src.artifacts.dasa_client import ( +from src.d_asa.artifacts.dasa_client import ( ContractCreateArgs, DasaClient, DasaFactory, diff --git a/tests/conftest_helpers.py b/tests/conftest_helpers.py index 4070aca2..8e2898d5 100644 --- a/tests/conftest_helpers.py +++ b/tests/conftest_helpers.py @@ -1,20 +1,18 @@ -from typing import Any, TypeVar +from typing import Any from algokit_utils import ( AlgorandClient, SigningAccount, ) -from src.artifacts.dasa_client import ( +from src.d_asa.artifacts.dasa_client import ( RbacAssignRoleArgs, RoleValidity, ) from tests.conftest import INITIAL_ALGO_FUNDS -RoleAccountType = TypeVar("RoleAccountType", bound=SigningAccount) - -def create_role_account( +def create_role_account[RoleAccountType: SigningAccount]( algorand: AlgorandClient, role_account_class: type[RoleAccountType], client: Any, diff --git a/tests/pam/conftest.py b/tests/pam/conftest.py index 9b83fd89..63342553 100644 --- a/tests/pam/conftest.py +++ b/tests/pam/conftest.py @@ -1,7 +1,7 @@ import pytest from algokit_utils import AlgorandClient -from src.artifacts.dasa_client import ( +from src.d_asa.artifacts.dasa_client import ( DasaClient, ) from tests import conftest_helpers as helpers diff --git a/tests/pam/fcb/test_pam_fixed_coupon_bond.py b/tests/pam/fcb/test_pam_fixed_coupon_bond.py index 6ea8a380..80b5238f 100644 --- a/tests/pam/fcb/test_pam_fixed_coupon_bond.py +++ b/tests/pam/fcb/test_pam_fixed_coupon_bond.py @@ -8,18 +8,18 @@ SigningAccount, ) -from smart_contracts import constants as cst -from smart_contracts import enums -from src import NormalizationResult, normalize_contract_attributes -from src.artifacts.dasa_client import ( +from src.d_asa import NormalizationResult, normalize_contract_attributes +from src.d_asa.artifacts.dasa_client import ( AccountGetPositionArgs, ClaimDueCashflowsArgs, DasaClient, FundDueCashflowsArgs, ) -from src.contracts import make_pam_fixed_coupon_bond_profile -from src.registry import CONTRACT_TYPE_IDS, EVENT_TYPE_IDS -from src.schedule import Cycle +from src.d_asa.contracts import make_pam_fixed_coupon_bond_profile +from src.d_asa.registry import CONTRACT_TYPE_IDS, EVENT_TYPE_IDS +from src.d_asa.schedule import Cycle +from smart_contracts import constants as cst +from smart_contracts import enums from tests import utils from tests.pam.pam_test_support import ( ISSUANCE_DELAY_CYCLE, diff --git a/tests/pam/pam_test_support.py b/tests/pam/pam_test_support.py index 03a33b39..644d6182 100644 --- a/tests/pam/pam_test_support.py +++ b/tests/pam/pam_test_support.py @@ -5,14 +5,13 @@ SigningAccount, ) -from smart_contracts import errors as err -from src.artifacts.dasa_client import ( +from src.d_asa.artifacts.dasa_client import ( ClaimDueCashflowsArgs, DasaClient, FundDueCashflowsArgs, TransferArgs, ) -from src.pam_lifecycle import ( +from src.d_asa.pam_lifecycle import ( EVENT_TYPE_NAMES, ISSUANCE_DELAY_CYCLE, LOCALNET_EXPLORER_TX_BASE_URL, @@ -32,6 +31,7 @@ scale_currency_amount, setup_pam_lifecycle, ) +from smart_contracts import errors as err __all__ = [ "EVENT_TYPE_NAMES", diff --git a/tests/pam/test_pam_lifecycle_showcase.py b/tests/pam/test_pam_lifecycle_showcase.py index 0c82075d..c64d722d 100644 --- a/tests/pam/test_pam_lifecycle_showcase.py +++ b/tests/pam/test_pam_lifecycle_showcase.py @@ -5,9 +5,9 @@ import pytest from algokit_utils import AlgorandClient, SigningAccount -from src.artifacts.dasa_client import DasaClient -from src.localnet import Currency, DAsaAccountManager, DAsaPrimaryDealer -from src.showcase import ( +from src.d_asa.artifacts.dasa_client import DasaClient +from src.d_asa.localnet import Currency, DAsaAccountManager, DAsaPrimaryDealer +from src.d_asa.showcase import ( SHOWCASE_BUILDERS, PamShowcaseScenario, run_showcase_scenario, diff --git a/tests/pam/zcb/test_pam_zero_coupon_bond.py b/tests/pam/zcb/test_pam_zero_coupon_bond.py index e12f5bbe..ba8144de 100644 --- a/tests/pam/zcb/test_pam_zero_coupon_bond.py +++ b/tests/pam/zcb/test_pam_zero_coupon_bond.py @@ -8,18 +8,18 @@ SigningAccount, ) -from smart_contracts import constants as cst -from smart_contracts import enums -from src import normalize_contract_attributes -from src.artifacts.dasa_client import ( +from src.d_asa import normalize_contract_attributes +from src.d_asa.artifacts.dasa_client import ( AccountGetPositionArgs, ClaimDueCashflowsArgs, DasaClient, FundDueCashflowsArgs, ) -from src.contracts import make_pam_zero_coupon_bond -from src.registry import CONTRACT_TYPE_IDS, EVENT_TYPE_IDS -from src.schedule import Cycle +from src.d_asa.contracts import make_pam_zero_coupon_bond +from src.d_asa.registry import CONTRACT_TYPE_IDS, EVENT_TYPE_IDS +from src.d_asa.schedule import Cycle +from smart_contracts import constants as cst +from smart_contracts import enums from tests import utils from tests.pam.pam_test_support import ( ISSUANCE_DELAY_CYCLE, diff --git a/tests/sdk/test_contracts.py b/tests/sdk/test_contracts.py index 84288b18..8cfe513d 100644 --- a/tests/sdk/test_contracts.py +++ b/tests/sdk/test_contracts.py @@ -4,19 +4,19 @@ import pytest -from src.contracts import ( +from src.d_asa.contracts import ( ContractAttributes, make_pam_fixed_coupon_bond_profile, make_pam_zero_coupon_bond, ) -from src.day_count import ( +from src.d_asa.day_count import ( BusinessDayConvention, Calendar, DayCountConvention, EndOfMonthConvention, ) -from src.errors import UnsupportedActusFeatureError -from src.schedule import Cycle +from src.d_asa.errors import UnsupportedActusFeatureError +from src.d_asa.schedule import Cycle class TestContractAttributes: diff --git a/tests/sdk/test_dasa.py b/tests/sdk/test_dasa.py index 4502f4eb..ba392655 100644 --- a/tests/sdk/test_dasa.py +++ b/tests/sdk/test_dasa.py @@ -1,16 +1,14 @@ from __future__ import annotations +import tomllib from dataclasses import dataclass from decimal import Decimal from pathlib import Path from types import SimpleNamespace -import tomllib from algosdk.constants import ZERO_ADDRESS -from smart_contracts import constants as cst -from smart_contracts import enums -from src import ( +from src.d_asa import ( DAsa, DAsaRole, PricingContext, @@ -19,7 +17,9 @@ make_pam_zero_coupon_bond, normalize_contract_attributes, ) -from src.models import AccountPosition +from src.d_asa.models import AccountPosition +from smart_contracts import constants as cst +from smart_contracts import enums @dataclass(frozen=True, slots=True) @@ -231,13 +231,15 @@ def _schedule_entry( def test_root_exports_include_high_level_surface() -> None: - import src + import d_asa - assert src.DAsa is DAsa - assert src.make_pam_zero_coupon_bond is make_pam_zero_coupon_bond - assert src.normalize_contract_attributes is normalize_contract_attributes - assert not hasattr(src, "dasa_client") - assert not hasattr(src, "dasa_avm_client") + assert d_asa.DAsa is DAsa + assert d_asa.make_pam_zero_coupon_bond is make_pam_zero_coupon_bond + assert d_asa.normalize_contract_attributes is normalize_contract_attributes + assert d_asa.constants.DAY_2_SEC == cst.DAY_2_SEC + assert d_asa.enums.CT_PAM == enums.CT_PAM + assert not hasattr(d_asa, "dasa_client") + assert not hasattr(d_asa, "dasa_avm_client") def test_actualized_position_activates_reserved_units_and_settles_indices() -> None: @@ -468,18 +470,16 @@ def test_arranger_configure_contract_uses_mappers_and_updates_pricing_context() def test_pyproject_runtime_dependencies_only_keep_algokit_utils() -> None: pyproject = Path(__file__).resolve().parents[2] / "pyproject.toml" parsed = tomllib.loads(pyproject.read_text()) - poetry = parsed["tool"]["poetry"] - runtime_dependencies = poetry["dependencies"] - dev_dependencies = poetry["group"]["dev"]["dependencies"] + project = parsed["project"] + tool_poetry = parsed["tool"]["poetry"] + dev_dependencies = tool_poetry["group"]["dev"]["dependencies"] - assert "algokit-utils" in runtime_dependencies - assert "python-dotenv" not in runtime_dependencies - assert "algorand-python" not in runtime_dependencies + assert "algokit-utils>=4.2.3,<5.0.0" in project["dependencies"] + assert all("python-dotenv" not in dep for dep in project["dependencies"]) + assert all("algorand-python" not in dep for dep in project["dependencies"]) assert "python-dotenv" in dev_dependencies - assert poetry["packages"] == [ - {"include": "src"}, - {"include": "smart_contracts"}, - {"include": "modules"}, + assert tool_poetry["packages"] == [ + {"include": "d_asa", "from": "src"}, ] diff --git a/tests/sdk/test_day_count.py b/tests/sdk/test_day_count.py index d34f20bb..b07b231f 100644 --- a/tests/sdk/test_day_count.py +++ b/tests/sdk/test_day_count.py @@ -1,10 +1,10 @@ -"""Tests for src.day_count module.""" +"""Tests for d_asa.day_count module.""" from __future__ import annotations -from datetime import datetime, timezone +from datetime import UTC, datetime -from src.day_count import ( +from src.d_asa.day_count import ( BusinessDayConvention, Calendar, EndOfMonthConvention, @@ -14,7 +14,7 @@ is_end_of_month, is_shift_calculate, ) -from src.unix_time import datetime_to_timestamp +from src.d_asa.unix_time import datetime_to_timestamp class TestCalendarEnum: @@ -156,17 +156,11 @@ class TestIsBusinessDay: def test_no_calendar_all_days_are_business_days(self) -> None: """Test with NO_CALENDAR, all days are business days.""" # Monday 2024-01-15 - monday = datetime_to_timestamp( - datetime(2024, 1, 15, 12, 0, 0, tzinfo=timezone.utc) - ) + monday = datetime_to_timestamp(datetime(2024, 1, 15, 12, 0, 0, tzinfo=UTC)) # Saturday 2024-01-20 - saturday = datetime_to_timestamp( - datetime(2024, 1, 20, 12, 0, 0, tzinfo=timezone.utc) - ) + saturday = datetime_to_timestamp(datetime(2024, 1, 20, 12, 0, 0, tzinfo=UTC)) # Sunday 2024-01-21 - sunday = datetime_to_timestamp( - datetime(2024, 1, 21, 12, 0, 0, tzinfo=timezone.utc) - ) + sunday = datetime_to_timestamp(datetime(2024, 1, 21, 12, 0, 0, tzinfo=UTC)) assert is_business_day(monday, Calendar.NO_CALENDAR) is True assert is_business_day(saturday, Calendar.NO_CALENDAR) is True @@ -177,29 +171,23 @@ def test_monday_to_friday_weekdays_are_business_days(self) -> None: # Week of 2024-01-15 (Monday) to 2024-01-19 (Friday) for day in range(15, 20): timestamp = datetime_to_timestamp( - datetime(2024, 1, day, 12, 0, 0, tzinfo=timezone.utc) + datetime(2024, 1, day, 12, 0, 0, tzinfo=UTC) ) assert is_business_day(timestamp, Calendar.MONDAY_TO_FRIDAY) is True def test_monday_to_friday_weekends_are_not_business_days(self) -> None: """Test with MONDAY_TO_FRIDAY, weekends are not business days.""" # Saturday 2024-01-20 - saturday = datetime_to_timestamp( - datetime(2024, 1, 20, 12, 0, 0, tzinfo=timezone.utc) - ) + saturday = datetime_to_timestamp(datetime(2024, 1, 20, 12, 0, 0, tzinfo=UTC)) # Sunday 2024-01-21 - sunday = datetime_to_timestamp( - datetime(2024, 1, 21, 12, 0, 0, tzinfo=timezone.utc) - ) + sunday = datetime_to_timestamp(datetime(2024, 1, 21, 12, 0, 0, tzinfo=UTC)) assert is_business_day(saturday, Calendar.MONDAY_TO_FRIDAY) is False assert is_business_day(sunday, Calendar.MONDAY_TO_FRIDAY) is False def test_default_calendar_is_no_calendar(self) -> None: """Test default calendar parameter is NO_CALENDAR.""" - saturday = datetime_to_timestamp( - datetime(2024, 1, 20, 12, 0, 0, tzinfo=timezone.utc) - ) + saturday = datetime_to_timestamp(datetime(2024, 1, 20, 12, 0, 0, tzinfo=UTC)) assert is_business_day(saturday) is True @@ -209,9 +197,7 @@ class TestAdjustToBusinessDay: def test_no_shift_returns_original(self) -> None: """Test NO_SHIFT returns timestamp unchanged.""" # Saturday 2024-01-20 - saturday = datetime_to_timestamp( - datetime(2024, 1, 20, 12, 0, 0, tzinfo=timezone.utc) - ) + saturday = datetime_to_timestamp(datetime(2024, 1, 20, 12, 0, 0, tzinfo=UTC)) result = adjust_to_business_day( saturday, business_day_convention=BusinessDayConvention.NO_SHIFT, @@ -222,9 +208,7 @@ def test_no_shift_returns_original(self) -> None: def test_business_day_unchanged(self) -> None: """Test business day returns unchanged for any convention.""" # Monday 2024-01-15 - monday = datetime_to_timestamp( - datetime(2024, 1, 15, 12, 0, 0, tzinfo=timezone.utc) - ) + monday = datetime_to_timestamp(datetime(2024, 1, 15, 12, 0, 0, tzinfo=UTC)) conventions = [ BusinessDayConvention.SHIFT_CALCULATE_FOLLOWING, BusinessDayConvention.SHIFT_CALCULATE_PRECEDING, @@ -242,12 +226,10 @@ def test_business_day_unchanged(self) -> None: def test_shift_calculate_following_shifts_forward(self) -> None: """Test SCF shifts Saturday to next Monday.""" # Saturday 2024-01-20 - saturday = datetime_to_timestamp( - datetime(2024, 1, 20, 12, 0, 0, tzinfo=timezone.utc) - ) + saturday = datetime_to_timestamp(datetime(2024, 1, 20, 12, 0, 0, tzinfo=UTC)) # Expected: Monday 2024-01-22 expected_monday = datetime_to_timestamp( - datetime(2024, 1, 22, 12, 0, 0, tzinfo=timezone.utc) + datetime(2024, 1, 22, 12, 0, 0, tzinfo=UTC) ) result = adjust_to_business_day( @@ -260,12 +242,10 @@ def test_shift_calculate_following_shifts_forward(self) -> None: def test_calculate_shift_following_shifts_forward(self) -> None: """Test CSF shifts Saturday to next Monday.""" # Saturday 2024-01-20 - saturday = datetime_to_timestamp( - datetime(2024, 1, 20, 12, 0, 0, tzinfo=timezone.utc) - ) + saturday = datetime_to_timestamp(datetime(2024, 1, 20, 12, 0, 0, tzinfo=UTC)) # Expected: Monday 2024-01-22 expected_monday = datetime_to_timestamp( - datetime(2024, 1, 22, 12, 0, 0, tzinfo=timezone.utc) + datetime(2024, 1, 22, 12, 0, 0, tzinfo=UTC) ) result = adjust_to_business_day( @@ -278,12 +258,10 @@ def test_calculate_shift_following_shifts_forward(self) -> None: def test_shift_calculate_preceding_shifts_backward(self) -> None: """Test SCP shifts Saturday to previous Friday.""" # Saturday 2024-01-20 - saturday = datetime_to_timestamp( - datetime(2024, 1, 20, 12, 0, 0, tzinfo=timezone.utc) - ) + saturday = datetime_to_timestamp(datetime(2024, 1, 20, 12, 0, 0, tzinfo=UTC)) # Expected: Friday 2024-01-19 expected_friday = datetime_to_timestamp( - datetime(2024, 1, 19, 12, 0, 0, tzinfo=timezone.utc) + datetime(2024, 1, 19, 12, 0, 0, tzinfo=UTC) ) result = adjust_to_business_day( @@ -296,12 +274,10 @@ def test_shift_calculate_preceding_shifts_backward(self) -> None: def test_calculate_shift_preceding_shifts_backward(self) -> None: """Test CSP shifts Saturday to previous Friday.""" # Saturday 2024-01-20 - saturday = datetime_to_timestamp( - datetime(2024, 1, 20, 12, 0, 0, tzinfo=timezone.utc) - ) + saturday = datetime_to_timestamp(datetime(2024, 1, 20, 12, 0, 0, tzinfo=UTC)) # Expected: Friday 2024-01-19 expected_friday = datetime_to_timestamp( - datetime(2024, 1, 19, 12, 0, 0, tzinfo=timezone.utc) + datetime(2024, 1, 19, 12, 0, 0, tzinfo=UTC) ) result = adjust_to_business_day( @@ -314,13 +290,9 @@ def test_calculate_shift_preceding_shifts_backward(self) -> None: def test_modified_following_shifts_back_if_next_month(self) -> None: """Test SCMF shifts back to preceding if following goes to next month.""" # Saturday 2024-01-27 (last Saturday of January) - saturday = datetime_to_timestamp( - datetime(2024, 1, 27, 12, 0, 0, tzinfo=timezone.utc) - ) + saturday = datetime_to_timestamp(datetime(2024, 1, 27, 12, 0, 0, tzinfo=UTC)) # Following would be Monday 2024-01-29 (same month, so should follow) - expected = datetime_to_timestamp( - datetime(2024, 1, 29, 12, 0, 0, tzinfo=timezone.utc) - ) + expected = datetime_to_timestamp(datetime(2024, 1, 29, 12, 0, 0, tzinfo=UTC)) result = adjust_to_business_day( saturday, @@ -332,11 +304,9 @@ def test_modified_following_shifts_back_if_next_month(self) -> None: # Sunday 2024-03-31 (last day of March) # Following would be Monday 2024-04-01 (next month) # Should shift back to Friday 2024-03-29 - sunday = datetime_to_timestamp( - datetime(2024, 3, 31, 12, 0, 0, tzinfo=timezone.utc) - ) + sunday = datetime_to_timestamp(datetime(2024, 3, 31, 12, 0, 0, tzinfo=UTC)) expected_friday = datetime_to_timestamp( - datetime(2024, 3, 29, 12, 0, 0, tzinfo=timezone.utc) + datetime(2024, 3, 29, 12, 0, 0, tzinfo=UTC) ) result = adjust_to_business_day( @@ -351,11 +321,9 @@ def test_modified_preceding_shifts_forward_if_previous_month(self) -> None: # Sunday 2024-09-01 (first day of September) # Preceding would be Friday 2024-08-30 (previous month) # Should shift forward to Monday 2024-09-02 - sunday = datetime_to_timestamp( - datetime(2024, 9, 1, 12, 0, 0, tzinfo=timezone.utc) - ) + sunday = datetime_to_timestamp(datetime(2024, 9, 1, 12, 0, 0, tzinfo=UTC)) expected_monday = datetime_to_timestamp( - datetime(2024, 9, 2, 12, 0, 0, tzinfo=timezone.utc) + datetime(2024, 9, 2, 12, 0, 0, tzinfo=UTC) ) result = adjust_to_business_day( diff --git a/tests/sdk/test_localnet.py b/tests/sdk/test_localnet.py index b8a2b2f7..57e06ba3 100644 --- a/tests/sdk/test_localnet.py +++ b/tests/sdk/test_localnet.py @@ -1,7 +1,7 @@ from types import SimpleNamespace from urllib.error import URLError -from src.localnet import ( +from src.d_asa.localnet import ( DEFAULT_ALGOD_PORT, DEFAULT_INDEXER_PORT, DEFAULT_KMD_PORT, @@ -88,9 +88,9 @@ def payment(self, params: object) -> None: send=fake_send, ) - monkeypatch.setattr("src.localnet.wait_for_algod", fake_wait_for_algod) + monkeypatch.setattr("d_asa.localnet.wait_for_algod", fake_wait_for_algod) - from src.localnet import round_warp + from d_asa.localnet import round_warp round_warp(algorand=fake_algorand) # type: ignore[arg-type] @@ -107,8 +107,8 @@ def fake_wait_for_algod(**_: object) -> None: def fake_wait_for_kmd(**_: object) -> None: calls.append("kmd") - monkeypatch.setattr("src.localnet.wait_for_algod", fake_wait_for_algod) - monkeypatch.setattr("src.localnet.wait_for_kmd", fake_wait_for_kmd) + monkeypatch.setattr("d_asa.localnet.wait_for_algod", fake_wait_for_algod) + monkeypatch.setattr("d_asa.localnet.wait_for_kmd", fake_wait_for_kmd) wait_for_localnet() diff --git a/tests/sdk/test_models.py b/tests/sdk/test_models.py index b9ab1c8c..73579fce 100644 --- a/tests/sdk/test_models.py +++ b/tests/sdk/test_models.py @@ -1,6 +1,6 @@ from __future__ import annotations -from src.models import ( +from src.d_asa.models import ( ExecutionScheduleEntry, InitialKernelState, NormalizationResult, diff --git a/tests/sdk/test_normalization.py b/tests/sdk/test_normalization.py index d9da038a..6bba3267 100644 --- a/tests/sdk/test_normalization.py +++ b/tests/sdk/test_normalization.py @@ -4,29 +4,29 @@ import pytest -from smart_contracts import constants as cst -from smart_contracts import enums -from src.contracts import ( +from src.d_asa.contracts import ( ContractAttributes, make_pam_fixed_coupon_bond_profile, make_pam_zero_coupon_bond, ) -from src.day_count import ( +from src.d_asa.day_count import ( BusinessDayConvention, Calendar, DayCountConvention, EndOfMonthConvention, ) -from src.errors import ActusNormalizationError -from src.models import ExecutionScheduleEntry, NormalizedActusTerms -from src.normalization import normalize_contract_attributes -from src.normalization.conversions import ( +from src.d_asa.errors import ActusNormalizationError +from src.d_asa.models import ExecutionScheduleEntry, NormalizedActusTerms +from src.d_asa.normalization import normalize_contract_attributes +from src.d_asa.normalization.conversions import ( compute_initial_exchange_amount, rate_to_fp, to_asa_units, ) -from src.normalization.event_seeds import deduplicate_timestamps -from src.schedule import Cycle +from src.d_asa.normalization.event_seeds import deduplicate_timestamps +from src.d_asa.schedule import Cycle +from smart_contracts import constants as cst +from smart_contracts import enums class TestToAsaUnits: @@ -666,7 +666,7 @@ def test_schedule_pages_basic(self): for i in range(10) ) - from src.models import InitialKernelState, NormalizationResult + from d_asa.models import InitialKernelState, NormalizationResult initial_state = InitialKernelState( status_date=1000000, @@ -730,7 +730,7 @@ def test_schedule_pages_exact_division(self): for i in range(6) ) - from src.models import InitialKernelState, NormalizationResult + from d_asa.models import InitialKernelState, NormalizationResult initial_state = InitialKernelState( status_date=1000000, @@ -777,7 +777,7 @@ def test_schedule_pages_invalid_page_size(self): fixed_point_scale=cst.FIXED_POINT_SCALE, ) - from src.models import InitialKernelState, NormalizationResult + from d_asa.models import InitialKernelState, NormalizationResult initial_state = InitialKernelState( status_date=1000000, diff --git a/tests/sdk/test_registry.py b/tests/sdk/test_registry.py index cbe18fd0..a1ccba0c 100644 --- a/tests/sdk/test_registry.py +++ b/tests/sdk/test_registry.py @@ -2,8 +2,7 @@ from __future__ import annotations -from smart_contracts import enums -from src.registry import ( +from src.d_asa.registry import ( ALLOWED_EVENT_TYPES, CASH_EVENT_TYPES, CONTRACT_TYPE_IDS, @@ -13,6 +12,7 @@ REJECTED_EVENT_TYPES, SUPPORTED_CONTRACT_TYPES, ) +from smart_contracts import enums def test_supported_contract_types_match_v1_scope() -> None: diff --git a/tests/sdk/test_schedule.py b/tests/sdk/test_schedule.py index b974fdb4..0c47ad71 100644 --- a/tests/sdk/test_schedule.py +++ b/tests/sdk/test_schedule.py @@ -1,18 +1,18 @@ -"""Tests for src.schedule module.""" +"""Tests for d_asa.schedule module.""" from __future__ import annotations -from datetime import datetime, timezone +from datetime import UTC, datetime import pytest -from src.day_count import ( +from src.d_asa.day_count import ( BusinessDayConvention, Calendar, EndOfMonthConvention, ) -from src.errors import UnsupportedActusFeatureError -from src.schedule import ( +from src.d_asa.errors import UnsupportedActusFeatureError +from src.d_asa.schedule import ( Cycle, add_cycle, generate_array_schedule, @@ -20,7 +20,7 @@ resolve_array_schedule, resolve_cycle_schedule, ) -from src.unix_time import datetime_to_timestamp +from src.d_asa.unix_time import datetime_to_timestamp class TestCycle: @@ -137,127 +137,93 @@ class TestAddCycle: def test_add_day_cycle(self) -> None: """Test adding day cycles.""" - start = datetime_to_timestamp( - datetime(2024, 1, 15, 0, 0, 0, tzinfo=timezone.utc) - ) + start = datetime_to_timestamp(datetime(2024, 1, 15, 0, 0, 0, tzinfo=UTC)) result = add_cycle( start, "30D", end_of_month_convention=EndOfMonthConvention.SAME_DAY, ) - expected = datetime_to_timestamp( - datetime(2024, 2, 14, 0, 0, 0, tzinfo=timezone.utc) - ) + expected = datetime_to_timestamp(datetime(2024, 2, 14, 0, 0, 0, tzinfo=UTC)) assert result == expected def test_add_week_cycle(self) -> None: """Test adding week cycles.""" - start = datetime_to_timestamp( - datetime(2024, 1, 15, 0, 0, 0, tzinfo=timezone.utc) - ) + start = datetime_to_timestamp(datetime(2024, 1, 15, 0, 0, 0, tzinfo=UTC)) result = add_cycle( start, "2W", end_of_month_convention=EndOfMonthConvention.SAME_DAY, ) - expected = datetime_to_timestamp( - datetime(2024, 1, 29, 0, 0, 0, tzinfo=timezone.utc) - ) + expected = datetime_to_timestamp(datetime(2024, 1, 29, 0, 0, 0, tzinfo=UTC)) assert result == expected def test_add_month_cycle(self) -> None: """Test adding month cycles.""" - start = datetime_to_timestamp( - datetime(2024, 1, 15, 0, 0, 0, tzinfo=timezone.utc) - ) + start = datetime_to_timestamp(datetime(2024, 1, 15, 0, 0, 0, tzinfo=UTC)) result = add_cycle( start, "1M", end_of_month_convention=EndOfMonthConvention.SAME_DAY, ) - expected = datetime_to_timestamp( - datetime(2024, 2, 15, 0, 0, 0, tzinfo=timezone.utc) - ) + expected = datetime_to_timestamp(datetime(2024, 2, 15, 0, 0, 0, tzinfo=UTC)) assert result == expected def test_add_quarter_cycle(self) -> None: """Test adding quarter cycles.""" - start = datetime_to_timestamp( - datetime(2024, 1, 15, 0, 0, 0, tzinfo=timezone.utc) - ) + start = datetime_to_timestamp(datetime(2024, 1, 15, 0, 0, 0, tzinfo=UTC)) result = add_cycle( start, "1Q", end_of_month_convention=EndOfMonthConvention.SAME_DAY, ) - expected = datetime_to_timestamp( - datetime(2024, 4, 15, 0, 0, 0, tzinfo=timezone.utc) - ) + expected = datetime_to_timestamp(datetime(2024, 4, 15, 0, 0, 0, tzinfo=UTC)) assert result == expected def test_add_half_year_cycle(self) -> None: """Test adding half-year cycles.""" - start = datetime_to_timestamp( - datetime(2024, 1, 15, 0, 0, 0, tzinfo=timezone.utc) - ) + start = datetime_to_timestamp(datetime(2024, 1, 15, 0, 0, 0, tzinfo=UTC)) result = add_cycle( start, "1H", end_of_month_convention=EndOfMonthConvention.SAME_DAY, ) - expected = datetime_to_timestamp( - datetime(2024, 7, 15, 0, 0, 0, tzinfo=timezone.utc) - ) + expected = datetime_to_timestamp(datetime(2024, 7, 15, 0, 0, 0, tzinfo=UTC)) assert result == expected def test_add_year_cycle(self) -> None: """Test adding year cycles.""" - start = datetime_to_timestamp( - datetime(2024, 1, 15, 0, 0, 0, tzinfo=timezone.utc) - ) + start = datetime_to_timestamp(datetime(2024, 1, 15, 0, 0, 0, tzinfo=UTC)) result = add_cycle( start, "1Y", end_of_month_convention=EndOfMonthConvention.SAME_DAY, ) - expected = datetime_to_timestamp( - datetime(2025, 1, 15, 0, 0, 0, tzinfo=timezone.utc) - ) + expected = datetime_to_timestamp(datetime(2025, 1, 15, 0, 0, 0, tzinfo=UTC)) assert result == expected def test_add_month_cycle_with_same_day_convention(self) -> None: """Test adding month cycle with SAME_DAY convention.""" # Jan 31 + 1M = Feb 29 (capped to last day of Feb in leap year) - start = datetime_to_timestamp( - datetime(2024, 1, 31, 0, 0, 0, tzinfo=timezone.utc) - ) + start = datetime_to_timestamp(datetime(2024, 1, 31, 0, 0, 0, tzinfo=UTC)) result = add_cycle( start, "1M", end_of_month_convention=EndOfMonthConvention.SAME_DAY ) - expected = datetime_to_timestamp( - datetime(2024, 2, 29, 0, 0, 0, tzinfo=timezone.utc) - ) + expected = datetime_to_timestamp(datetime(2024, 2, 29, 0, 0, 0, tzinfo=UTC)) assert result == expected def test_add_month_cycle_with_eom_convention(self) -> None: """Test adding month cycle with END_OF_MONTH convention.""" # Jan 31 (end of month) + 1M = Feb 29 (end of month in leap year) - start = datetime_to_timestamp( - datetime(2024, 1, 31, 0, 0, 0, tzinfo=timezone.utc) - ) + start = datetime_to_timestamp(datetime(2024, 1, 31, 0, 0, 0, tzinfo=UTC)) result = add_cycle( start, "1M", end_of_month_convention=EndOfMonthConvention.END_OF_MONTH ) - expected = datetime_to_timestamp( - datetime(2024, 2, 29, 0, 0, 0, tzinfo=timezone.utc) - ) + expected = datetime_to_timestamp(datetime(2024, 2, 29, 0, 0, 0, tzinfo=UTC)) assert result == expected def test_add_cycle_with_anchor_and_occurrence(self) -> None: """Test adding cycle with anchor and occurrence index.""" - anchor = datetime_to_timestamp( - datetime(2024, 1, 15, 0, 0, 0, tzinfo=timezone.utc) - ) + anchor = datetime_to_timestamp(datetime(2024, 1, 15, 0, 0, 0, tzinfo=UTC)) result = add_cycle( anchor, "1M", @@ -265,37 +231,27 @@ def test_add_cycle_with_anchor_and_occurrence(self) -> None: anchor_timestamp=anchor, occurrence_index=3, ) - expected = datetime_to_timestamp( - datetime(2024, 4, 15, 0, 0, 0, tzinfo=timezone.utc) - ) + expected = datetime_to_timestamp(datetime(2024, 4, 15, 0, 0, 0, tzinfo=UTC)) assert result == expected def test_add_month_cycle_handles_short_months(self) -> None: """Test month cycle handles months with different days.""" # Jan 31 + 3M = Apr 30 (April has only 30 days) - start = datetime_to_timestamp( - datetime(2024, 1, 31, 0, 0, 0, tzinfo=timezone.utc) - ) + start = datetime_to_timestamp(datetime(2024, 1, 31, 0, 0, 0, tzinfo=UTC)) result = add_cycle( start, "3M", end_of_month_convention=EndOfMonthConvention.SAME_DAY ) - expected = datetime_to_timestamp( - datetime(2024, 4, 30, 0, 0, 0, tzinfo=timezone.utc) - ) + expected = datetime_to_timestamp(datetime(2024, 4, 30, 0, 0, 0, tzinfo=UTC)) assert result == expected def test_add_cycle_leap_year_february(self) -> None: """Test adding cycles around leap year February.""" # Feb 29 2024 (leap year) + 1Y = Feb 28 2025 (non-leap year) - start = datetime_to_timestamp( - datetime(2024, 2, 29, 0, 0, 0, tzinfo=timezone.utc) - ) + start = datetime_to_timestamp(datetime(2024, 2, 29, 0, 0, 0, tzinfo=UTC)) result = add_cycle( start, "1Y", end_of_month_convention=EndOfMonthConvention.SAME_DAY ) - expected = datetime_to_timestamp( - datetime(2025, 2, 28, 0, 0, 0, tzinfo=timezone.utc) - ) + expected = datetime_to_timestamp(datetime(2025, 2, 28, 0, 0, 0, tzinfo=UTC)) assert result == expected @@ -304,50 +260,42 @@ class TestGenerateSchedule: def test_generate_monthly_schedule(self) -> None: """Test generating monthly schedule.""" - start = datetime_to_timestamp( - datetime(2024, 1, 15, 0, 0, 0, tzinfo=timezone.utc) - ) - end = datetime_to_timestamp(datetime(2024, 4, 15, 0, 0, 0, tzinfo=timezone.utc)) + start = datetime_to_timestamp(datetime(2024, 1, 15, 0, 0, 0, tzinfo=UTC)) + end = datetime_to_timestamp(datetime(2024, 4, 15, 0, 0, 0, tzinfo=UTC)) schedule = generate_schedule( start, "1M", end, end_of_month_convention=EndOfMonthConvention.SAME_DAY ) expected = ( - datetime_to_timestamp(datetime(2024, 1, 15, 0, 0, 0, tzinfo=timezone.utc)), - datetime_to_timestamp(datetime(2024, 2, 15, 0, 0, 0, tzinfo=timezone.utc)), - datetime_to_timestamp(datetime(2024, 3, 15, 0, 0, 0, tzinfo=timezone.utc)), - datetime_to_timestamp(datetime(2024, 4, 15, 0, 0, 0, tzinfo=timezone.utc)), + datetime_to_timestamp(datetime(2024, 1, 15, 0, 0, 0, tzinfo=UTC)), + datetime_to_timestamp(datetime(2024, 2, 15, 0, 0, 0, tzinfo=UTC)), + datetime_to_timestamp(datetime(2024, 3, 15, 0, 0, 0, tzinfo=UTC)), + datetime_to_timestamp(datetime(2024, 4, 15, 0, 0, 0, tzinfo=UTC)), ) assert schedule == expected def test_generate_quarterly_schedule(self) -> None: """Test generating quarterly schedule.""" - start = datetime_to_timestamp( - datetime(2024, 1, 1, 0, 0, 0, tzinfo=timezone.utc) - ) - end = datetime_to_timestamp( - datetime(2024, 12, 31, 0, 0, 0, tzinfo=timezone.utc) - ) + start = datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=UTC)) + end = datetime_to_timestamp(datetime(2024, 12, 31, 0, 0, 0, tzinfo=UTC)) schedule = generate_schedule( start, "1Q", end, end_of_month_convention=EndOfMonthConvention.SAME_DAY ) expected = ( - datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=timezone.utc)), - datetime_to_timestamp(datetime(2024, 4, 1, 0, 0, 0, tzinfo=timezone.utc)), - datetime_to_timestamp(datetime(2024, 7, 1, 0, 0, 0, tzinfo=timezone.utc)), - datetime_to_timestamp(datetime(2024, 10, 1, 0, 0, 0, tzinfo=timezone.utc)), + datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=UTC)), + datetime_to_timestamp(datetime(2024, 4, 1, 0, 0, 0, tzinfo=UTC)), + datetime_to_timestamp(datetime(2024, 7, 1, 0, 0, 0, tzinfo=UTC)), + datetime_to_timestamp(datetime(2024, 10, 1, 0, 0, 0, tzinfo=UTC)), ) assert schedule == expected def test_generate_daily_schedule(self) -> None: """Test generating daily schedule.""" - start = datetime_to_timestamp( - datetime(2024, 1, 1, 0, 0, 0, tzinfo=timezone.utc) - ) - end = datetime_to_timestamp(datetime(2024, 1, 5, 0, 0, 0, tzinfo=timezone.utc)) + start = datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=UTC)) + end = datetime_to_timestamp(datetime(2024, 1, 5, 0, 0, 0, tzinfo=UTC)) schedule = generate_schedule( start, "1D", end, end_of_month_convention=EndOfMonthConvention.SAME_DAY @@ -359,29 +307,25 @@ def test_generate_daily_schedule(self) -> None: def test_generate_yearly_schedule(self) -> None: """Test generating yearly schedule.""" - start = datetime_to_timestamp( - datetime(2024, 1, 1, 0, 0, 0, tzinfo=timezone.utc) - ) - end = datetime_to_timestamp(datetime(2027, 1, 1, 0, 0, 0, tzinfo=timezone.utc)) + start = datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=UTC)) + end = datetime_to_timestamp(datetime(2027, 1, 1, 0, 0, 0, tzinfo=UTC)) schedule = generate_schedule( start, "1Y", end, end_of_month_convention=EndOfMonthConvention.SAME_DAY ) expected = ( - datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=timezone.utc)), - datetime_to_timestamp(datetime(2025, 1, 1, 0, 0, 0, tzinfo=timezone.utc)), - datetime_to_timestamp(datetime(2026, 1, 1, 0, 0, 0, tzinfo=timezone.utc)), - datetime_to_timestamp(datetime(2027, 1, 1, 0, 0, 0, tzinfo=timezone.utc)), + datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=UTC)), + datetime_to_timestamp(datetime(2025, 1, 1, 0, 0, 0, tzinfo=UTC)), + datetime_to_timestamp(datetime(2026, 1, 1, 0, 0, 0, tzinfo=UTC)), + datetime_to_timestamp(datetime(2027, 1, 1, 0, 0, 0, tzinfo=UTC)), ) assert schedule == expected def test_generate_schedule_stops_at_end(self) -> None: """Test schedule generation stops at end date.""" - start = datetime_to_timestamp( - datetime(2024, 1, 1, 0, 0, 0, tzinfo=timezone.utc) - ) - end = datetime_to_timestamp(datetime(2024, 3, 15, 0, 0, 0, tzinfo=timezone.utc)) + start = datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=UTC)) + end = datetime_to_timestamp(datetime(2024, 3, 15, 0, 0, 0, tzinfo=UTC)) schedule = generate_schedule( start, "1M", end, end_of_month_convention=EndOfMonthConvention.SAME_DAY @@ -393,10 +337,8 @@ def test_generate_schedule_stops_at_end(self) -> None: def test_generate_schedule_includes_end_if_exact_match(self) -> None: """Test schedule includes end if it matches exactly.""" - start = datetime_to_timestamp( - datetime(2024, 1, 1, 0, 0, 0, tzinfo=timezone.utc) - ) - end = datetime_to_timestamp(datetime(2024, 4, 1, 0, 0, 0, tzinfo=timezone.utc)) + start = datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=UTC)) + end = datetime_to_timestamp(datetime(2024, 4, 1, 0, 0, 0, tzinfo=UTC)) schedule = generate_schedule( start, "1M", end, end_of_month_convention=EndOfMonthConvention.SAME_DAY @@ -407,10 +349,8 @@ def test_generate_schedule_includes_end_if_exact_match(self) -> None: def test_generate_schedule_with_eom_convention(self) -> None: """Test schedule generation with END_OF_MONTH convention.""" # Jan 31 (end of month) - start = datetime_to_timestamp( - datetime(2024, 1, 31, 0, 0, 0, tzinfo=timezone.utc) - ) - end = datetime_to_timestamp(datetime(2024, 5, 1, 0, 0, 0, tzinfo=timezone.utc)) + start = datetime_to_timestamp(datetime(2024, 1, 31, 0, 0, 0, tzinfo=UTC)) + end = datetime_to_timestamp(datetime(2024, 5, 1, 0, 0, 0, tzinfo=UTC)) schedule = generate_schedule( start, @@ -421,19 +361,17 @@ def test_generate_schedule_with_eom_convention(self) -> None: # Should generate: Jan 31, Feb 29, Mar 31, Apr 30 expected = ( - datetime_to_timestamp(datetime(2024, 1, 31, 0, 0, 0, tzinfo=timezone.utc)), - datetime_to_timestamp(datetime(2024, 2, 29, 0, 0, 0, tzinfo=timezone.utc)), - datetime_to_timestamp(datetime(2024, 3, 31, 0, 0, 0, tzinfo=timezone.utc)), - datetime_to_timestamp(datetime(2024, 4, 30, 0, 0, 0, tzinfo=timezone.utc)), + datetime_to_timestamp(datetime(2024, 1, 31, 0, 0, 0, tzinfo=UTC)), + datetime_to_timestamp(datetime(2024, 2, 29, 0, 0, 0, tzinfo=UTC)), + datetime_to_timestamp(datetime(2024, 3, 31, 0, 0, 0, tzinfo=UTC)), + datetime_to_timestamp(datetime(2024, 4, 30, 0, 0, 0, tzinfo=UTC)), ) assert schedule == expected def test_generate_schedule_empty_if_start_after_end(self) -> None: """Test empty schedule if start > end.""" - start = datetime_to_timestamp( - datetime(2024, 12, 31, 0, 0, 0, tzinfo=timezone.utc) - ) - end = datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=timezone.utc)) + start = datetime_to_timestamp(datetime(2024, 12, 31, 0, 0, 0, tzinfo=UTC)) + end = datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=UTC)) schedule = generate_schedule( start, "1M", end, end_of_month_convention=EndOfMonthConvention.SAME_DAY @@ -443,9 +381,7 @@ def test_generate_schedule_empty_if_start_after_end(self) -> None: def test_generate_schedule_empty_if_start_zero_or_negative(self) -> None: """Test empty schedule if start <= 0.""" - end = datetime_to_timestamp( - datetime(2024, 12, 31, 0, 0, 0, tzinfo=timezone.utc) - ) + end = datetime_to_timestamp(datetime(2024, 12, 31, 0, 0, 0, tzinfo=UTC)) assert ( generate_schedule( @@ -462,9 +398,7 @@ def test_generate_schedule_empty_if_start_zero_or_negative(self) -> None: def test_generate_schedule_empty_if_end_zero_or_negative(self) -> None: """Test empty schedule if end <= 0.""" - start = datetime_to_timestamp( - datetime(2024, 1, 1, 0, 0, 0, tzinfo=timezone.utc) - ) + start = datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=UTC)) assert ( generate_schedule( @@ -485,34 +419,30 @@ class TestGenerateArraySchedule: def test_generate_single_segment_schedule(self) -> None: """Test array schedule with single anchor/cycle.""" - anchors = [ - datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=timezone.utc)) - ] + anchors = [datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=UTC))] cycles = ["1M"] - end = datetime_to_timestamp(datetime(2024, 4, 1, 0, 0, 0, tzinfo=timezone.utc)) + end = datetime_to_timestamp(datetime(2024, 4, 1, 0, 0, 0, tzinfo=UTC)) schedule = generate_array_schedule( anchors, cycles, end, end_of_month_convention=EndOfMonthConvention.SAME_DAY ) expected = ( - datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=timezone.utc)), - datetime_to_timestamp(datetime(2024, 2, 1, 0, 0, 0, tzinfo=timezone.utc)), - datetime_to_timestamp(datetime(2024, 3, 1, 0, 0, 0, tzinfo=timezone.utc)), - datetime_to_timestamp(datetime(2024, 4, 1, 0, 0, 0, tzinfo=timezone.utc)), + datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=UTC)), + datetime_to_timestamp(datetime(2024, 2, 1, 0, 0, 0, tzinfo=UTC)), + datetime_to_timestamp(datetime(2024, 3, 1, 0, 0, 0, tzinfo=UTC)), + datetime_to_timestamp(datetime(2024, 4, 1, 0, 0, 0, tzinfo=UTC)), ) assert schedule == expected def test_generate_multi_segment_schedule(self) -> None: """Test array schedule with multiple anchor/cycle pairs.""" anchors = [ - datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=timezone.utc)), - datetime_to_timestamp(datetime(2024, 4, 1, 0, 0, 0, tzinfo=timezone.utc)), + datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=UTC)), + datetime_to_timestamp(datetime(2024, 4, 1, 0, 0, 0, tzinfo=UTC)), ] cycles = ["1M", "3M"] - end = datetime_to_timestamp( - datetime(2024, 12, 31, 0, 0, 0, tzinfo=timezone.utc) - ) + end = datetime_to_timestamp(datetime(2024, 12, 31, 0, 0, 0, tzinfo=UTC)) schedule = generate_array_schedule( anchors, cycles, end, end_of_month_convention=EndOfMonthConvention.SAME_DAY @@ -522,13 +452,13 @@ def test_generate_multi_segment_schedule(self) -> None: # Second segment: quarterly Apr 1, Jul 1, Oct 1 # Plus end date Dec 31 expected_dates = [ - datetime(2024, 1, 1, 0, 0, 0, tzinfo=timezone.utc), - datetime(2024, 2, 1, 0, 0, 0, tzinfo=timezone.utc), - datetime(2024, 3, 1, 0, 0, 0, tzinfo=timezone.utc), - datetime(2024, 4, 1, 0, 0, 0, tzinfo=timezone.utc), - datetime(2024, 7, 1, 0, 0, 0, tzinfo=timezone.utc), - datetime(2024, 10, 1, 0, 0, 0, tzinfo=timezone.utc), - datetime(2024, 12, 31, 0, 0, 0, tzinfo=timezone.utc), + datetime(2024, 1, 1, 0, 0, 0, tzinfo=UTC), + datetime(2024, 2, 1, 0, 0, 0, tzinfo=UTC), + datetime(2024, 3, 1, 0, 0, 0, tzinfo=UTC), + datetime(2024, 4, 1, 0, 0, 0, tzinfo=UTC), + datetime(2024, 7, 1, 0, 0, 0, tzinfo=UTC), + datetime(2024, 10, 1, 0, 0, 0, tzinfo=UTC), + datetime(2024, 12, 31, 0, 0, 0, tzinfo=UTC), ] expected = tuple(datetime_to_timestamp(dt) for dt in expected_dates) assert schedule == expected @@ -536,11 +466,11 @@ def test_generate_multi_segment_schedule(self) -> None: def test_generate_array_schedule_deduplicates(self) -> None: """Test array schedule removes duplicates.""" anchors = [ - datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=timezone.utc)), - datetime_to_timestamp(datetime(2024, 3, 1, 0, 0, 0, tzinfo=timezone.utc)), + datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=UTC)), + datetime_to_timestamp(datetime(2024, 3, 1, 0, 0, 0, tzinfo=UTC)), ] cycles = ["1M", "1M"] - end = datetime_to_timestamp(datetime(2024, 5, 1, 0, 0, 0, tzinfo=timezone.utc)) + end = datetime_to_timestamp(datetime(2024, 5, 1, 0, 0, 0, tzinfo=UTC)) schedule = generate_array_schedule( anchors, cycles, end, end_of_month_convention=EndOfMonthConvention.SAME_DAY @@ -552,11 +482,11 @@ def test_generate_array_schedule_deduplicates(self) -> None: def test_generate_array_schedule_sorts_dates(self) -> None: """Test array schedule returns sorted dates.""" anchors = [ - datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=timezone.utc)), - datetime_to_timestamp(datetime(2024, 3, 1, 0, 0, 0, tzinfo=timezone.utc)), + datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=UTC)), + datetime_to_timestamp(datetime(2024, 3, 1, 0, 0, 0, tzinfo=UTC)), ] cycles = ["1M", "1M"] - end = datetime_to_timestamp(datetime(2024, 5, 1, 0, 0, 0, tzinfo=timezone.utc)) + end = datetime_to_timestamp(datetime(2024, 5, 1, 0, 0, 0, tzinfo=UTC)) schedule = generate_array_schedule( anchors, cycles, end, end_of_month_convention=EndOfMonthConvention.SAME_DAY @@ -567,11 +497,9 @@ def test_generate_array_schedule_sorts_dates(self) -> None: def test_generate_array_schedule_includes_end(self) -> None: """Test array schedule always includes end date.""" - anchors = [ - datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=timezone.utc)) - ] + anchors = [datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=UTC))] cycles = ["1M"] - end = datetime_to_timestamp(datetime(2024, 3, 15, 0, 0, 0, tzinfo=timezone.utc)) + end = datetime_to_timestamp(datetime(2024, 3, 15, 0, 0, 0, tzinfo=UTC)) schedule = generate_array_schedule( anchors, cycles, end, end_of_month_convention=EndOfMonthConvention.SAME_DAY @@ -589,13 +517,11 @@ def test_generate_array_schedule_empty_anchors(self) -> None: def test_generate_array_schedule_raises_if_length_mismatch(self) -> None: """Test array schedule raises if anchors and cycles have different lengths.""" anchors = [ - datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=timezone.utc)), - datetime_to_timestamp(datetime(2024, 4, 1, 0, 0, 0, tzinfo=timezone.utc)), + datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=UTC)), + datetime_to_timestamp(datetime(2024, 4, 1, 0, 0, 0, tzinfo=UTC)), ] cycles = ["1M"] # Only one cycle for two anchors - end = datetime_to_timestamp( - datetime(2024, 12, 31, 0, 0, 0, tzinfo=timezone.utc) - ) + end = datetime_to_timestamp(datetime(2024, 12, 31, 0, 0, 0, tzinfo=UTC)) with pytest.raises( ValueError, match="anchors and cycles must have same length" @@ -610,7 +536,7 @@ def test_generate_array_schedule_raises_if_length_mismatch(self) -> None: def test_generate_array_schedule_empty_if_end_zero_or_negative(self) -> None: """Test array schedule returns empty tuple if end <= 0.""" anchors = [ - datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=timezone.utc)), + datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=UTC)), ] cycles = ["1M"] @@ -635,9 +561,7 @@ def test_generate_array_schedule_empty_if_end_zero_or_negative(self) -> None: def test_generate_array_schedule_empty_if_anchor_invalid(self) -> None: """Test array schedule returns empty tuple if any anchor is invalid.""" - end = datetime_to_timestamp( - datetime(2024, 12, 31, 0, 0, 0, tzinfo=timezone.utc) - ) + end = datetime_to_timestamp(datetime(2024, 12, 31, 0, 0, 0, tzinfo=UTC)) cycles = ["1M"] # Test anchor <= 0 @@ -668,15 +592,13 @@ def test_generate_array_schedule_empty_if_anchor_invalid(self) -> None: def test_generate_array_schedule_raises_if_anchors_descending(self) -> None: """Test array schedule raises if anchors are in descending order.""" - end = datetime_to_timestamp( - datetime(2024, 12, 31, 0, 0, 0, tzinfo=timezone.utc) - ) + end = datetime_to_timestamp(datetime(2024, 12, 31, 0, 0, 0, tzinfo=UTC)) cycles = ["1M", "1M"] # Test descending order anchors = [ - datetime_to_timestamp(datetime(2024, 4, 1, 0, 0, 0, tzinfo=timezone.utc)), - datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=timezone.utc)), + datetime_to_timestamp(datetime(2024, 4, 1, 0, 0, 0, tzinfo=UTC)), + datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=UTC)), ] with pytest.raises( ValueError, match="anchors must be in strictly ascending order" @@ -690,15 +612,13 @@ def test_generate_array_schedule_raises_if_anchors_descending(self) -> None: def test_generate_array_schedule_raises_if_anchors_equal(self) -> None: """Test array schedule raises if anchors are equal (not strictly ascending).""" - end = datetime_to_timestamp( - datetime(2024, 12, 31, 0, 0, 0, tzinfo=timezone.utc) - ) + end = datetime_to_timestamp(datetime(2024, 12, 31, 0, 0, 0, tzinfo=UTC)) cycles = ["1M", "1M"] # Test equal anchors (not strictly ascending) anchors = [ - datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=timezone.utc)), - datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=timezone.utc)), + datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=UTC)), + datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=UTC)), ] with pytest.raises( ValueError, match="anchors must be in strictly ascending order" @@ -714,16 +634,14 @@ def test_generate_array_schedule_raises_if_anchors_partially_unsorted( self, ) -> None: """Test array schedule raises if anchors are partially unsorted.""" - end = datetime_to_timestamp( - datetime(2024, 12, 31, 0, 0, 0, tzinfo=timezone.utc) - ) + end = datetime_to_timestamp(datetime(2024, 12, 31, 0, 0, 0, tzinfo=UTC)) cycles = ["1M", "1M", "1M"] # First two in order, but third is out of order anchors = [ - datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=timezone.utc)), - datetime_to_timestamp(datetime(2024, 4, 1, 0, 0, 0, tzinfo=timezone.utc)), - datetime_to_timestamp(datetime(2024, 2, 1, 0, 0, 0, tzinfo=timezone.utc)), + datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=UTC)), + datetime_to_timestamp(datetime(2024, 4, 1, 0, 0, 0, tzinfo=UTC)), + datetime_to_timestamp(datetime(2024, 2, 1, 0, 0, 0, tzinfo=UTC)), ] with pytest.raises( ValueError, match="anchors must be in strictly ascending order" @@ -741,10 +659,8 @@ class TestResolveCycleSchedule: def test_resolve_cycle_schedule_no_adjustment(self) -> None: """Test resolve_cycle_schedule with NO_SHIFT convention.""" - start = datetime_to_timestamp( - datetime(2024, 1, 1, 0, 0, 0, tzinfo=timezone.utc) - ) - end = datetime_to_timestamp(datetime(2024, 4, 1, 0, 0, 0, tzinfo=timezone.utc)) + start = datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=UTC)) + end = datetime_to_timestamp(datetime(2024, 4, 1, 0, 0, 0, tzinfo=UTC)) schedule = resolve_cycle_schedule( start, @@ -756,19 +672,17 @@ def test_resolve_cycle_schedule_no_adjustment(self) -> None: ) expected = ( - datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=timezone.utc)), - datetime_to_timestamp(datetime(2024, 2, 1, 0, 0, 0, tzinfo=timezone.utc)), - datetime_to_timestamp(datetime(2024, 3, 1, 0, 0, 0, tzinfo=timezone.utc)), - datetime_to_timestamp(datetime(2024, 4, 1, 0, 0, 0, tzinfo=timezone.utc)), + datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=UTC)), + datetime_to_timestamp(datetime(2024, 2, 1, 0, 0, 0, tzinfo=UTC)), + datetime_to_timestamp(datetime(2024, 3, 1, 0, 0, 0, tzinfo=UTC)), + datetime_to_timestamp(datetime(2024, 4, 1, 0, 0, 0, tzinfo=UTC)), ) assert schedule == expected def test_resolve_cycle_schedule_raises_for_unsupported_bdc(self) -> None: """Test raises error for unsupported business day convention.""" - start = datetime_to_timestamp( - datetime(2024, 1, 1, 0, 0, 0, tzinfo=timezone.utc) - ) - end = datetime_to_timestamp(datetime(2024, 4, 1, 0, 0, 0, tzinfo=timezone.utc)) + start = datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=UTC)) + end = datetime_to_timestamp(datetime(2024, 4, 1, 0, 0, 0, tzinfo=UTC)) with pytest.raises( UnsupportedActusFeatureError, match="Business Day Convention" @@ -784,10 +698,8 @@ def test_resolve_cycle_schedule_raises_for_unsupported_bdc(self) -> None: def test_resolve_cycle_schedule_raises_for_unsupported_calendar(self) -> None: """Test raises error for unsupported calendar.""" - start = datetime_to_timestamp( - datetime(2024, 1, 1, 0, 0, 0, tzinfo=timezone.utc) - ) - end = datetime_to_timestamp(datetime(2024, 4, 1, 0, 0, 0, tzinfo=timezone.utc)) + start = datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=UTC)) + end = datetime_to_timestamp(datetime(2024, 4, 1, 0, 0, 0, tzinfo=UTC)) with pytest.raises(UnsupportedActusFeatureError, match="Calendar"): resolve_cycle_schedule( @@ -806,13 +718,11 @@ class TestResolveArraySchedule: def test_resolve_array_schedule_no_adjustment(self) -> None: """Test resolve_array_schedule with NO_SHIFT convention.""" anchors = [ - datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=timezone.utc)), - datetime_to_timestamp(datetime(2024, 4, 1, 0, 0, 0, tzinfo=timezone.utc)), + datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=UTC)), + datetime_to_timestamp(datetime(2024, 4, 1, 0, 0, 0, tzinfo=UTC)), ] cycles = ["1M", "3M"] - end = datetime_to_timestamp( - datetime(2024, 12, 31, 0, 0, 0, tzinfo=timezone.utc) - ) + end = datetime_to_timestamp(datetime(2024, 12, 31, 0, 0, 0, tzinfo=UTC)) schedule = resolve_array_schedule( anchors, @@ -829,11 +739,9 @@ def test_resolve_array_schedule_no_adjustment(self) -> None: def test_resolve_array_schedule_raises_for_unsupported_bdc(self) -> None: """Test raises error for unsupported business day convention.""" - anchors = [ - datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=timezone.utc)) - ] + anchors = [datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=UTC))] cycles = ["1M"] - end = datetime_to_timestamp(datetime(2024, 4, 1, 0, 0, 0, tzinfo=timezone.utc)) + end = datetime_to_timestamp(datetime(2024, 4, 1, 0, 0, 0, tzinfo=UTC)) with pytest.raises( UnsupportedActusFeatureError, match="Business Day Convention" @@ -849,11 +757,9 @@ def test_resolve_array_schedule_raises_for_unsupported_bdc(self) -> None: def test_resolve_array_schedule_raises_for_unsupported_calendar(self) -> None: """Test raises error for unsupported calendar.""" - anchors = [ - datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=timezone.utc)) - ] + anchors = [datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=UTC))] cycles = ["1M"] - end = datetime_to_timestamp(datetime(2024, 4, 1, 0, 0, 0, tzinfo=timezone.utc)) + end = datetime_to_timestamp(datetime(2024, 4, 1, 0, 0, 0, tzinfo=UTC)) with pytest.raises(UnsupportedActusFeatureError, match="Calendar"): resolve_array_schedule( diff --git a/tests/sdk/test_unix_time.py b/tests/sdk/test_unix_time.py index 24ee7b50..2fc8b75e 100644 --- a/tests/sdk/test_unix_time.py +++ b/tests/sdk/test_unix_time.py @@ -1,10 +1,10 @@ -"""Tests for src.unix_time module.""" +"""Tests for d_asa.unix_time module.""" from __future__ import annotations -from datetime import datetime, timezone +from datetime import UTC, datetime -from src.unix_time import datetime_to_timestamp, timestamp_to_datetime +from src.d_asa.unix_time import datetime_to_timestamp, timestamp_to_datetime class TestTimestampToDatetime: @@ -13,7 +13,7 @@ class TestTimestampToDatetime: def test_converts_epoch_zero(self) -> None: """Test conversion of epoch 0 (1970-01-01 00:00:00 UTC).""" result = timestamp_to_datetime(0) - expected = datetime(1970, 1, 1, 0, 0, 0, tzinfo=timezone.utc) + expected = datetime(1970, 1, 1, 0, 0, 0, tzinfo=UTC) assert result == expected def test_converts_positive_timestamp(self) -> None: @@ -21,7 +21,7 @@ def test_converts_positive_timestamp(self) -> None: # 2024-01-15 12:30:45 UTC timestamp = 1705321845 result = timestamp_to_datetime(timestamp) - expected = datetime(2024, 1, 15, 12, 30, 45, tzinfo=timezone.utc) + expected = datetime(2024, 1, 15, 12, 30, 45, tzinfo=UTC) assert result == expected def test_converts_negative_timestamp(self) -> None: @@ -29,29 +29,29 @@ def test_converts_negative_timestamp(self) -> None: # 1969-12-31 23:59:59 UTC timestamp = -1 result = timestamp_to_datetime(timestamp) - expected = datetime(1969, 12, 31, 23, 59, 59, tzinfo=timezone.utc) + expected = datetime(1969, 12, 31, 23, 59, 59, tzinfo=UTC) assert result == expected def test_result_is_utc_aware(self) -> None: """Test that result has UTC timezone info.""" result = timestamp_to_datetime(1705321845) - assert result.tzinfo is timezone.utc - assert result.utcoffset() == timezone.utc.utcoffset(None) + assert result.tzinfo is UTC + assert result.utcoffset() == UTC.utcoffset(None) def test_converts_leap_year_date(self) -> None: """Test conversion on leap year Feb 29.""" # 2024-02-29 00:00:00 UTC (leap year) timestamp = 1709164800 result = timestamp_to_datetime(timestamp) - expected = datetime(2024, 2, 29, 0, 0, 0, tzinfo=timezone.utc) + expected = datetime(2024, 2, 29, 0, 0, 0, tzinfo=UTC) assert result == expected def test_converts_various_dates(self) -> None: """Test conversion of various important dates.""" test_cases = [ - (1672531200, datetime(2023, 1, 1, 0, 0, 0, tzinfo=timezone.utc)), - (1704067200, datetime(2024, 1, 1, 0, 0, 0, tzinfo=timezone.utc)), - (1735689600, datetime(2025, 1, 1, 0, 0, 0, tzinfo=timezone.utc)), + (1672531200, datetime(2023, 1, 1, 0, 0, 0, tzinfo=UTC)), + (1704067200, datetime(2024, 1, 1, 0, 0, 0, tzinfo=UTC)), + (1735689600, datetime(2025, 1, 1, 0, 0, 0, tzinfo=UTC)), ] for timestamp, expected in test_cases: result = timestamp_to_datetime(timestamp) @@ -63,13 +63,13 @@ class TestDatetimeToTimestamp: def test_converts_epoch_zero(self) -> None: """Test conversion of epoch datetime.""" - dt = datetime(1970, 1, 1, 0, 0, 0, tzinfo=timezone.utc) + dt = datetime(1970, 1, 1, 0, 0, 0, tzinfo=UTC) result = datetime_to_timestamp(dt) assert result == 0 def test_converts_aware_datetime(self) -> None: """Test conversion of timezone-aware datetime.""" - dt = datetime(2024, 1, 15, 12, 30, 45, tzinfo=timezone.utc) + dt = datetime(2024, 1, 15, 12, 30, 45, tzinfo=UTC) result = datetime_to_timestamp(dt) assert result == 1705321845 @@ -81,16 +81,16 @@ def test_converts_naive_datetime_as_utc(self) -> None: def test_converts_leap_year_date(self) -> None: """Test conversion on leap year Feb 29.""" - dt = datetime(2024, 2, 29, 0, 0, 0, tzinfo=timezone.utc) + dt = datetime(2024, 2, 29, 0, 0, 0, tzinfo=UTC) result = datetime_to_timestamp(dt) assert result == 1709164800 def test_converts_various_dates(self) -> None: """Test conversion of various important dates.""" test_cases = [ - (datetime(2023, 1, 1, 0, 0, 0, tzinfo=timezone.utc), 1672531200), - (datetime(2024, 1, 1, 0, 0, 0, tzinfo=timezone.utc), 1704067200), - (datetime(2025, 1, 1, 0, 0, 0, tzinfo=timezone.utc), 1735689600), + (datetime(2023, 1, 1, 0, 0, 0, tzinfo=UTC), 1672531200), + (datetime(2024, 1, 1, 0, 0, 0, tzinfo=UTC), 1704067200), + (datetime(2025, 1, 1, 0, 0, 0, tzinfo=UTC), 1735689600), ] for dt, expected in test_cases: result = datetime_to_timestamp(dt) @@ -109,7 +109,7 @@ def test_timestamp_to_datetime_to_timestamp(self) -> None: def test_datetime_to_timestamp_to_datetime(self) -> None: """Test converting datetime -> timestamp -> datetime preserves value.""" - original = datetime(2024, 1, 15, 12, 30, 45, tzinfo=timezone.utc) + original = datetime(2024, 1, 15, 12, 30, 45, tzinfo=UTC) timestamp = datetime_to_timestamp(original) result = timestamp_to_datetime(timestamp) assert result == original @@ -127,6 +127,6 @@ def test_roundtrip_naive_datetime_becomes_aware(self) -> None: naive_dt = datetime(2024, 1, 15, 12, 30, 45) timestamp = datetime_to_timestamp(naive_dt) result_dt = timestamp_to_datetime(timestamp) - assert result_dt.tzinfo is timezone.utc + assert result_dt.tzinfo is UTC # Values should be equal ignoring timezone assert result_dt.replace(tzinfo=None) == naive_dt diff --git a/tests/utils.py b/tests/utils.py index a9c8c231..b86b5489 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -1,4 +1,4 @@ -from src.localnet import ( +from src.d_asa.localnet import ( Currency, DAsaAccount, DAsaAccountManager, From a3fbefcaf242d9a517e8d414185bb04adb8d6a65 Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 23:30:05 +0100 Subject: [PATCH 236/244] chore: update import paths --- .algokit.toml | 4 ++-- Makefile | 3 +-- README.md | 9 +++++---- d-asa | 8 ++++---- docs/implementation/reference-implementation.md | 6 +++--- docs/sdk/deploy-and-attach.md | 4 ++-- docs/sdk/overview.md | 8 ++++---- docs/sdk/valuation.md | 2 +- 8 files changed, 22 insertions(+), 22 deletions(-) diff --git a/.algokit.toml b/.algokit.toml index 7065a4e1..9d765eb1 100644 --- a/.algokit.toml +++ b/.algokit.toml @@ -48,6 +48,6 @@ audit-teal = { commands = [ # Commands intented for CI only, prefixed with `ci-` by convention ci-teal-diff = { commands = [ 'git add -N ./smart_contracts/artifacts', - 'git add -N ./src/artifacts', - 'git diff --exit-code --minimal ./smart_contracts/artifacts ./src/artifacts', + 'git add -N ./src/d_asa/artifacts', + 'git diff --exit-code --minimal ./smart_contracts/artifacts ./src/d_asa/artifacts', ], description = 'Check generated artifacts for differences' } diff --git a/Makefile b/Makefile index d8ed3473..036f4e99 100644 --- a/Makefile +++ b/Makefile @@ -86,7 +86,7 @@ test: algokit project run test test-cov: - poetry run pytest --cov=src --cov=smart_contracts --cov=modules --cov-report=term-missing -m "not showcase" + poetry run pytest --cov=d_asa --cov=smart_contracts --cov=modules --cov-report=term-missing -m "not showcase" lint: algokit project run lint @@ -133,4 +133,3 @@ showcase: jupyter-docker: ./d-asa jupyter - diff --git a/README.md b/README.md index 47167ab3..0a414177 100644 --- a/README.md +++ b/README.md @@ -12,12 +12,13 @@ flowchart LR The canonical generated artifacts are: -- `src/artifacts/DASA.arc56.json`: D-ASA AppSpec, generates clients and can be used -on [Lora App Lab](https://lora.algokit.io/localnet/app-lab/create); +- `src/d_asa/artifacts/DASA.arc56.json`: D-ASA AppSpec, generates clients and can +be used on [Lora App Lab](https://lora.algokit.io/localnet/app-lab/create); -- `src/artifacts/dasa_client.py`: D-ASA client, expanded by the SDK; +- `src/d_asa/artifacts/dasa_client.py`: D-ASA client, expanded by the SDK; -- `src/artifacts/dasa_avm_client.py`: D-ASA AVM client, for on-chain App-2-App calls. +- `src/d_asa/artifacts/dasa_avm_client.py`: D-ASA AVM client, for on-chain App-2-App +calls. Documentation: diff --git a/d-asa b/d-asa index d9e7e06b..7bb88bd2 100755 --- a/d-asa +++ b/d-asa @@ -146,7 +146,7 @@ cleanup() { } localnet_ready() { - run_in_image python -m src.localnet wait --timeout 2 --poll-interval 1 >/dev/null 2>&1 + run_in_image python -m src.d_asa.localnet wait --timeout 2 --poll-interval 1 >/dev/null 2>&1 } cmd_run() { @@ -163,11 +163,11 @@ cmd_run() { algokit localnet start --force STARTED_LOCALNET=1 printf '%s\n' "Waiting for algod..." - run_in_image python -m src.localnet wait --timeout 90 --poll-interval 2 + run_in_image python -m src.d_asa.localnet wait --timeout 90 --poll-interval 2 fi printf '%s\n' "Running D-ASA showcase..." - run_in_image python -m src.showcase + run_in_image python -m src.d_asa.showcase } cmd_jupyter() { @@ -184,7 +184,7 @@ cmd_jupyter() { algokit localnet start --force STARTED_LOCALNET=1 printf '%s\n' "Waiting for algod..." - run_in_image python -m src.localnet wait --timeout 90 --poll-interval 2 + run_in_image python -m src.d_asa.localnet wait --timeout 90 --poll-interval 2 fi printf '%s\n' "Starting Jupyter Lab on http://localhost:8888..." diff --git a/docs/implementation/reference-implementation.md b/docs/implementation/reference-implementation.md index 5d59acb2..f4dfeddd 100644 --- a/docs/implementation/reference-implementation.md +++ b/docs/implementation/reference-implementation.md @@ -19,9 +19,9 @@ supports the kernel contract families `PAM`, `ANN`, `NAM`, `LAM`, `LAX`, and `CL The canonical artifacts are: -- `src/artifacts/DASA.arc56.json` -- `src/artifacts/dasa_client.py` -- `src/artifacts/dasa_avm_client.py` +- `src/d_asa/artifacts/DASA.arc56.json` +- `src/d_asa/artifacts/dasa_client.py` +- `src/d_asa/artifacts/dasa_avm_client.py` The deployment helpers in `smart_contracts/d_asa/deploy_config.py` provide code-accurate demo normalization flows for: diff --git a/docs/sdk/deploy-and-attach.md b/docs/sdk/deploy-and-attach.md index 82662a49..fae79db4 100644 --- a/docs/sdk/deploy-and-attach.md +++ b/docs/sdk/deploy-and-attach.md @@ -3,7 +3,7 @@ ## Deploy ```python -from src import DAsa +from d_asa import DAsa app = DAsa.deploy( algorand=algorand, @@ -41,7 +41,7 @@ app = DAsa.from_app_id( If you already have the generated client: ```python -from src.artifacts.dasa_client import DasaClient +from d_asa.artifacts.dasa_client import DasaClient raw_client = DasaClient(algorand=algorand, app_id=12345) app = DAsa.from_client(raw_client) diff --git a/docs/sdk/overview.md b/docs/sdk/overview.md index 02584a15..5c8222b1 100644 --- a/docs/sdk/overview.md +++ b/docs/sdk/overview.md @@ -1,12 +1,12 @@ # SDK Overview -The high-level Python API lives directly under `src` and is centered on `DAsa`. +The high-level Python API lives in the `d_asa` package and is centered on `DAsa`. -It wraps the generated ARC-56 client in [`src.artifacts.dasa_client`](../../src/artifacts/dasa_client.py) +It wraps the generated ARC-56 client in [`d_asa.artifacts.dasa_client`](../../src/d_asa/artifacts/dasa_client.py) and keeps the generated ABI structs out of the normal user flow. ```python -from src import ( +from d_asa import ( DAsa, ContractAttributes, PricingContext, @@ -31,5 +31,5 @@ directly: - `ObservedCashEventRequest` - `Cycle` -Use `DAsa` for contract interaction, and keep `src.artifacts.dasa_client` as the +Use `DAsa` for contract interaction, and keep `d_asa.artifacts.dasa_client` as the explicit low-level escape hatch when needed. diff --git a/docs/sdk/valuation.md b/docs/sdk/valuation.md index 720035eb..f8e8fad2 100644 --- a/docs/sdk/valuation.md +++ b/docs/sdk/valuation.md @@ -41,7 +41,7 @@ carry. ```python from decimal import Decimal -from src import TradeQuoteInput +from d_asa import TradeQuoteInput quote = holder.quote_trade( 25, From 367a59f4c4b6134b07be01dd26611262ba162bbe Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 23:30:32 +0100 Subject: [PATCH 237/244] chore: copy contract enums --- smart_contracts/enums.py | 2 +- src/d_asa/enums.py | 122 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 123 insertions(+), 1 deletion(-) create mode 100644 src/d_asa/enums.py diff --git a/smart_contracts/enums.py b/smart_contracts/enums.py index 3207f40d..34a9b570 100644 --- a/smart_contracts/enums.py +++ b/smart_contracts/enums.py @@ -1,7 +1,7 @@ from typing import Final ################################################################################ -# AVM Contract Status # TODO: Use Contract Performance instead +# AVM Contract Status ################################################################################ STATUS_INACTIVE: Final[int] = 0 STATUS_PENDING_IED: Final[int] = 50 diff --git a/src/d_asa/enums.py b/src/d_asa/enums.py new file mode 100644 index 00000000..912341ce --- /dev/null +++ b/src/d_asa/enums.py @@ -0,0 +1,122 @@ +"""Copy of smart_contracts/constants.py""" + +from typing import Final + +################################################################################ +# AVM Contract Status +################################################################################ +STATUS_INACTIVE: Final[int] = 0 +STATUS_PENDING_IED: Final[int] = 50 +STATUS_ACTIVE: Final[int] = 100 +STATUS_ENDED: Final[int] = 200 + +################################################################################ +# ACTUS Contract Types +################################################################################ +CT_PAM: Final[int] = 0 +CT_ANN: Final[int] = 1 +CT_NAM: Final[int] = 2 +CT_LAM: Final[int] = 3 +CT_LAX: Final[int] = 4 +CT_CLM: Final[int] = 5 + +################################################################################ +# ACTUS Event types +################################################################################ +EVT_AD: Final[int] = 0 +EVT_IED: Final[int] = 1 +EVT_PR: Final[int] = 3 +EVT_PI: Final[int] = 4 +EVT_PRF: Final[int] = 5 +EVT_PY: Final[int] = 6 +EVT_PP: Final[int] = 7 +EVT_IP: Final[int] = 8 +EVT_RRF: Final[int] = 11 +EVT_RR: Final[int] = 12 +EVT_IPCB: Final[int] = 18 +EVT_MD: Final[int] = 19 + +################################################################################ +# Event flags +################################################################################ +FLAG_CASH_EVENT: Final[int] = 1 << 0 +FLAG_NON_CASH_EVENT: Final[int] = 1 << 1 +FLAG_OBSERVED_EVENT: Final[int] = 1 << 2 +FLAG_INITIAL_PRF: Final[int] = 1 << 3 + +################################################################################ +# Day-count Conventions +################################################################################ +DCC_AA: Final[int] = 0 +DCC_A360: Final[int] = 1 +DCC_A365: Final[int] = 2 +DCC_30E360ISDA: Final[int] = 3 +DCC_30E360: Final[int] = 4 + +################################################################################ +# Calendar +################################################################################ +CLDR_NC: Final[int] = 0 +CLDR_MF: Final[int] = 1 +CLDR_CUST: Final[int] = 255 + +################################################################################ +# Business Day Convention +################################################################################ +BDC_NOS: Final[int] = 0 +BDC_SCF: Final[int] = 1 +BDC_SCMF: Final[int] = 2 +BDC_CSF: Final[int] = 3 +BDC_CSMF: Final[int] = 4 +BDC_SCP: Final[int] = 5 +BDC_SCMP: Final[int] = 6 +BDC_CSP: Final[int] = 7 +BDC_CSMP: Final[int] = 8 + +################################################################################ +# End of Month Convention +################################################################################ +EOMC_SD: Final[int] = 0 +EOMC_EOM: Final[int] = 1 + +################################################################################ +# Prepayment Effect +################################################################################ +PPEF_N: Final[int] = 0 +PPEF_A: Final[int] = 1 +PPEF_M: Final[int] = 2 + +################################################################################ +# Penalty Type +################################################################################ +PYTP_N: Final[int] = 0 +PYTP_A: Final[int] = 1 +PYTP_R: Final[int] = 2 +PYTP_I: Final[int] = 3 + +################################################################################ +# Contract Performance +################################################################################ +PRF_PERFORMANT: Final[int] = 0 +PRF_DELAYED: Final[int] = 1 +PRF_DELINQUENT: Final[int] = 2 +PRF_DEFAULTED: Final[int] = 3 +PRF_MATURED: Final[int] = 4 +PRF_TERMINATED: Final[int] = 5 + +################################################################################ +# Role IDs +################################################################################ +ROLE_ARRANGER: Final[int] = 20 +ROLE_OP_DAEMON: Final[int] = 25 +ROLE_ACCOUNT_MANAGER: Final[int] = 40 +ROLE_PRIMARY_DEALER: Final[int] = 50 +ROLE_TRUSTEE: Final[int] = 60 +ROLE_AUTHORITY: Final[int] = 70 +ROLE_OBSERVER: Final[int] = 80 + +################################################################################ +# Payoff Sign +################################################################################ +PAYOFF_SIGN_POSITIVE: Final[int] = 1 +PAYOFF_SIGN_NEGATIVE: Final[int] = 255 From f58f3100c0450817516ab8cce65436b9782df341 Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 23:30:46 +0100 Subject: [PATCH 238/244] chore: lock dependencies --- poetry.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/poetry.lock b/poetry.lock index ba55a3bc..c45e8287 100644 --- a/poetry.lock +++ b/poetry.lock @@ -4478,5 +4478,5 @@ propcache = ">=0.2.1" [metadata] lock-version = "2.1" -python-versions = "^3.13" -content-hash = "9e8fa1788d64f0062bf93ae842e20e79180c05c3624d685cfca83b79894c0e4b" +python-versions = ">=3.13,<4.0" +content-hash = "e579058bb43df2de9afcaf071ed40e61d9c1177011ed99632b829abab8b7b5d3" From 33cf58d4bd2d4524d7f3b04739224651394a594b Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 23:31:53 +0100 Subject: [PATCH 239/244] chore: lint --- examples/pam_fixed_coupon_bond.ipynb | 38 ++++++++++----------- examples/pam_zero_coupon_bond.ipynb | 22 ++++++------ smart_contracts/d_asa/deploy_config.py | 4 +-- tests/pam/fcb/test_pam_fixed_coupon_bond.py | 4 +-- tests/pam/pam_test_support.py | 2 +- tests/pam/zcb/test_pam_zero_coupon_bond.py | 4 +-- tests/sdk/test_dasa.py | 4 +-- tests/sdk/test_normalization.py | 4 +-- tests/sdk/test_registry.py | 2 +- 9 files changed, 42 insertions(+), 42 deletions(-) diff --git a/examples/pam_fixed_coupon_bond.ipynb b/examples/pam_fixed_coupon_bond.ipynb index 5824a454..e3895a57 100644 --- a/examples/pam_fixed_coupon_bond.ipynb +++ b/examples/pam_fixed_coupon_bond.ipynb @@ -48,13 +48,24 @@ ] }, { - "metadata": {}, "cell_type": "code", - "outputs": [], "execution_count": null, + "id": "6a72551a49d687ac", + "metadata": {}, + "outputs": [], "source": [ "from algokit_utils import AssetTransferParams, CommonAppCallParams\n", "\n", + "from examples._support import (\n", + " cashflow_rows,\n", + " connect_localnet,\n", + " create_currency,\n", + " create_funded_account,\n", + " format_asset_amount,\n", + " opt_in_asset,\n", + " render_table,\n", + " schedule_rows,\n", + ")\n", "from src.d_asa import (\n", " DAsa,\n", " DAsaRole,\n", @@ -66,25 +77,15 @@ "from src.d_asa import constants as cst\n", "from src.d_asa.artifacts.dasa_client import PrimaryDistributionArgs\n", "from src.d_asa.localnet import get_latest_timestamp, time_warp\n", - "from src.d_asa.schedule import Cycle\n", - "from examples._support import (\n", - " cashflow_rows,\n", - " connect_localnet,\n", - " create_currency,\n", - " create_funded_account,\n", - " format_asset_amount,\n", - " opt_in_asset,\n", - " render_table,\n", - " schedule_rows,\n", - ")\n" - ], - "id": "6a72551a49d687ac" + "from src.d_asa.schedule import Cycle\n" + ] }, { - "metadata": {}, "cell_type": "code", - "outputs": [], "execution_count": null, + "id": "6a1061c4b38b743d", + "metadata": {}, + "outputs": [], "source": [ "PRINCIPAL = 10_000\n", "MINIMUM_DENOMINATION = 100\n", @@ -130,8 +131,7 @@ " nominal_interest_rate = entry.next_nominal_interest_rate\n", "\n", " return total_interest\n" - ], - "id": "6a1061c4b38b743d" + ] }, { "cell_type": "code", diff --git a/examples/pam_zero_coupon_bond.ipynb b/examples/pam_zero_coupon_bond.ipynb index a6b71b86..c0f325a2 100644 --- a/examples/pam_zero_coupon_bond.ipynb +++ b/examples/pam_zero_coupon_bond.ipynb @@ -56,6 +56,16 @@ "source": [ "from algokit_utils import AssetTransferParams, CommonAppCallParams\n", "\n", + "from examples._support import (\n", + " cashflow_rows,\n", + " connect_localnet,\n", + " create_currency,\n", + " create_funded_account,\n", + " format_asset_amount,\n", + " opt_in_asset,\n", + " render_table,\n", + " schedule_rows,\n", + ")\n", "from src.d_asa import (\n", " DAsa,\n", " DAsaRole,\n", @@ -66,17 +76,7 @@ "from src.d_asa import constants as cst\n", "from src.d_asa.artifacts.dasa_client import PrimaryDistributionArgs\n", "from src.d_asa.localnet import get_latest_timestamp, time_warp\n", - "from src.d_asa.schedule import Cycle\n", - "from examples._support import (\n", - " cashflow_rows,\n", - " connect_localnet,\n", - " create_currency,\n", - " create_funded_account,\n", - " format_asset_amount,\n", - " opt_in_asset,\n", - " render_table,\n", - " schedule_rows,\n", - ")\n" + "from src.d_asa.schedule import Cycle\n" ] }, { diff --git a/smart_contracts/d_asa/deploy_config.py b/smart_contracts/d_asa/deploy_config.py index 6d3c288a..9752dfcd 100644 --- a/smart_contracts/d_asa/deploy_config.py +++ b/smart_contracts/d_asa/deploy_config.py @@ -17,6 +17,8 @@ ) from algosdk.constants import ZERO_ADDRESS +from smart_contracts import constants as cst +from smart_contracts import enums from src.d_asa import ( ExecutionScheduleEntry, NormalizationResult, @@ -38,8 +40,6 @@ make_pam_zero_coupon_bond, ) from src.d_asa.schedule import Cycle -from smart_contracts import constants as cst -from smart_contracts import enums logger = logging.getLogger(__name__) diff --git a/tests/pam/fcb/test_pam_fixed_coupon_bond.py b/tests/pam/fcb/test_pam_fixed_coupon_bond.py index 80b5238f..7ba8d053 100644 --- a/tests/pam/fcb/test_pam_fixed_coupon_bond.py +++ b/tests/pam/fcb/test_pam_fixed_coupon_bond.py @@ -8,6 +8,8 @@ SigningAccount, ) +from smart_contracts import constants as cst +from smart_contracts import enums from src.d_asa import NormalizationResult, normalize_contract_attributes from src.d_asa.artifacts.dasa_client import ( AccountGetPositionArgs, @@ -18,8 +20,6 @@ from src.d_asa.contracts import make_pam_fixed_coupon_bond_profile from src.d_asa.registry import CONTRACT_TYPE_IDS, EVENT_TYPE_IDS from src.d_asa.schedule import Cycle -from smart_contracts import constants as cst -from smart_contracts import enums from tests import utils from tests.pam.pam_test_support import ( ISSUANCE_DELAY_CYCLE, diff --git a/tests/pam/pam_test_support.py b/tests/pam/pam_test_support.py index 644d6182..8839e0ba 100644 --- a/tests/pam/pam_test_support.py +++ b/tests/pam/pam_test_support.py @@ -5,6 +5,7 @@ SigningAccount, ) +from smart_contracts import errors as err from src.d_asa.artifacts.dasa_client import ( ClaimDueCashflowsArgs, DasaClient, @@ -31,7 +32,6 @@ scale_currency_amount, setup_pam_lifecycle, ) -from smart_contracts import errors as err __all__ = [ "EVENT_TYPE_NAMES", diff --git a/tests/pam/zcb/test_pam_zero_coupon_bond.py b/tests/pam/zcb/test_pam_zero_coupon_bond.py index ba8144de..029117d0 100644 --- a/tests/pam/zcb/test_pam_zero_coupon_bond.py +++ b/tests/pam/zcb/test_pam_zero_coupon_bond.py @@ -8,6 +8,8 @@ SigningAccount, ) +from smart_contracts import constants as cst +from smart_contracts import enums from src.d_asa import normalize_contract_attributes from src.d_asa.artifacts.dasa_client import ( AccountGetPositionArgs, @@ -18,8 +20,6 @@ from src.d_asa.contracts import make_pam_zero_coupon_bond from src.d_asa.registry import CONTRACT_TYPE_IDS, EVENT_TYPE_IDS from src.d_asa.schedule import Cycle -from smart_contracts import constants as cst -from smart_contracts import enums from tests import utils from tests.pam.pam_test_support import ( ISSUANCE_DELAY_CYCLE, diff --git a/tests/sdk/test_dasa.py b/tests/sdk/test_dasa.py index ba392655..49184650 100644 --- a/tests/sdk/test_dasa.py +++ b/tests/sdk/test_dasa.py @@ -8,6 +8,8 @@ from algosdk.constants import ZERO_ADDRESS +from smart_contracts import constants as cst +from smart_contracts import enums from src.d_asa import ( DAsa, DAsaRole, @@ -18,8 +20,6 @@ normalize_contract_attributes, ) from src.d_asa.models import AccountPosition -from smart_contracts import constants as cst -from smart_contracts import enums @dataclass(frozen=True, slots=True) diff --git a/tests/sdk/test_normalization.py b/tests/sdk/test_normalization.py index 6bba3267..c33ae1d7 100644 --- a/tests/sdk/test_normalization.py +++ b/tests/sdk/test_normalization.py @@ -4,6 +4,8 @@ import pytest +from smart_contracts import constants as cst +from smart_contracts import enums from src.d_asa.contracts import ( ContractAttributes, make_pam_fixed_coupon_bond_profile, @@ -25,8 +27,6 @@ ) from src.d_asa.normalization.event_seeds import deduplicate_timestamps from src.d_asa.schedule import Cycle -from smart_contracts import constants as cst -from smart_contracts import enums class TestToAsaUnits: diff --git a/tests/sdk/test_registry.py b/tests/sdk/test_registry.py index a1ccba0c..64c68b9b 100644 --- a/tests/sdk/test_registry.py +++ b/tests/sdk/test_registry.py @@ -2,6 +2,7 @@ from __future__ import annotations +from smart_contracts import enums from src.d_asa.registry import ( ALLOWED_EVENT_TYPES, CASH_EVENT_TYPES, @@ -12,7 +13,6 @@ REJECTED_EVENT_TYPES, SUPPORTED_CONTRACT_TYPES, ) -from smart_contracts import enums def test_supported_contract_types_match_v1_scope() -> None: From d36276bf510be22cafcf12377b10ae848d83b193 Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 23:40:05 +0100 Subject: [PATCH 240/244] chore: src root --- examples/_support.py | 4 ++-- examples/pam_fixed_coupon_bond.ipynb | 26 ++++++++++----------- examples/pam_zero_coupon_bond.ipynb | 24 +++++++++---------- smart_contracts/d_asa/deploy_config.py | 12 +++++----- src/d_asa/__init__.py | 3 +++ tests/conftest.py | 2 +- tests/conftest_helpers.py | 2 +- tests/pam/conftest.py | 2 +- tests/pam/fcb/test_pam_fixed_coupon_bond.py | 14 +++++------ tests/pam/pam_test_support.py | 6 ++--- tests/pam/test_pam_lifecycle_showcase.py | 6 ++--- tests/pam/zcb/test_pam_zero_coupon_bond.py | 14 +++++------ tests/sdk/test_contracts.py | 8 +++---- tests/sdk/test_dasa.py | 8 +++---- tests/sdk/test_day_count.py | 4 ++-- tests/sdk/test_localnet.py | 2 +- tests/sdk/test_models.py | 2 +- tests/sdk/test_normalization.py | 20 ++++++++-------- tests/sdk/test_registry.py | 4 ++-- tests/sdk/test_schedule.py | 8 +++---- tests/sdk/test_unix_time.py | 2 +- tests/utils.py | 2 +- 22 files changed, 89 insertions(+), 86 deletions(-) diff --git a/examples/_support.py b/examples/_support.py index 88ad0678..ba869b89 100644 --- a/examples/_support.py +++ b/examples/_support.py @@ -13,8 +13,8 @@ SigningAccount, ) -from src.d_asa import NormalizationResult -from src.d_asa.localnet import ( +from d_asa import NormalizationResult +from d_asa.localnet import ( Currency, algorand_client_from_localnet, load_localnet_config, diff --git a/examples/pam_fixed_coupon_bond.ipynb b/examples/pam_fixed_coupon_bond.ipynb index e3895a57..e526fdbc 100644 --- a/examples/pam_fixed_coupon_bond.ipynb +++ b/examples/pam_fixed_coupon_bond.ipynb @@ -56,6 +56,18 @@ "source": [ "from algokit_utils import AssetTransferParams, CommonAppCallParams\n", "\n", + "from d_asa import (\n", + " DAsa,\n", + " DAsaRole,\n", + " NormalizationResult,\n", + " enums,\n", + " make_pam_fixed_coupon_bond_profile,\n", + " normalize_contract_attributes,\n", + ")\n", + "from d_asa import constants as cst\n", + "from d_asa.artifacts.dasa_client import PrimaryDistributionArgs\n", + "from d_asa.localnet import get_latest_timestamp, time_warp\n", + "from d_asa.schedule import Cycle\n", "from examples._support import (\n", " cashflow_rows,\n", " connect_localnet,\n", @@ -65,19 +77,7 @@ " opt_in_asset,\n", " render_table,\n", " schedule_rows,\n", - ")\n", - "from src.d_asa import (\n", - " DAsa,\n", - " DAsaRole,\n", - " NormalizationResult,\n", - " enums,\n", - " make_pam_fixed_coupon_bond_profile,\n", - " normalize_contract_attributes,\n", - ")\n", - "from src.d_asa import constants as cst\n", - "from src.d_asa.artifacts.dasa_client import PrimaryDistributionArgs\n", - "from src.d_asa.localnet import get_latest_timestamp, time_warp\n", - "from src.d_asa.schedule import Cycle\n" + ")\n" ] }, { diff --git a/examples/pam_zero_coupon_bond.ipynb b/examples/pam_zero_coupon_bond.ipynb index c0f325a2..cdc9592e 100644 --- a/examples/pam_zero_coupon_bond.ipynb +++ b/examples/pam_zero_coupon_bond.ipynb @@ -56,6 +56,17 @@ "source": [ "from algokit_utils import AssetTransferParams, CommonAppCallParams\n", "\n", + "from d_asa import (\n", + " DAsa,\n", + " DAsaRole,\n", + " enums,\n", + " make_pam_zero_coupon_bond,\n", + " normalize_contract_attributes,\n", + ")\n", + "from d_asa import constants as cst\n", + "from d_asa.artifacts.dasa_client import PrimaryDistributionArgs\n", + "from d_asa.localnet import get_latest_timestamp, time_warp\n", + "from d_asa.schedule import Cycle\n", "from examples._support import (\n", " cashflow_rows,\n", " connect_localnet,\n", @@ -65,18 +76,7 @@ " opt_in_asset,\n", " render_table,\n", " schedule_rows,\n", - ")\n", - "from src.d_asa import (\n", - " DAsa,\n", - " DAsaRole,\n", - " enums,\n", - " make_pam_zero_coupon_bond,\n", - " normalize_contract_attributes,\n", - ")\n", - "from src.d_asa import constants as cst\n", - "from src.d_asa.artifacts.dasa_client import PrimaryDistributionArgs\n", - "from src.d_asa.localnet import get_latest_timestamp, time_warp\n", - "from src.d_asa.schedule import Cycle\n" + ")\n" ] }, { diff --git a/smart_contracts/d_asa/deploy_config.py b/smart_contracts/d_asa/deploy_config.py index 9752dfcd..9730a066 100644 --- a/smart_contracts/d_asa/deploy_config.py +++ b/smart_contracts/d_asa/deploy_config.py @@ -17,14 +17,12 @@ ) from algosdk.constants import ZERO_ADDRESS -from smart_contracts import constants as cst -from smart_contracts import enums -from src.d_asa import ( +from d_asa import ( ExecutionScheduleEntry, NormalizationResult, normalize_contract_attributes, ) -from src.d_asa.artifacts.dasa_client import ( +from d_asa.artifacts.dasa_client import ( ContractConfigArgs, ContractCreateArgs, ContractScheduleArgs, @@ -35,11 +33,13 @@ NormalizedActusTerms, Prospectus, ) -from src.d_asa.contracts import ( +from d_asa.contracts import ( make_pam_fixed_coupon_bond_profile, make_pam_zero_coupon_bond, ) -from src.d_asa.schedule import Cycle +from d_asa.schedule import Cycle +from smart_contracts import constants as cst +from smart_contracts import enums logger = logging.getLogger(__name__) diff --git a/src/d_asa/__init__.py b/src/d_asa/__init__.py index d1d5bc09..dc007c6a 100644 --- a/src/d_asa/__init__.py +++ b/src/d_asa/__init__.py @@ -1,4 +1,7 @@ # ruff: noqa: RUF022 +""" +Debt Algorand Standard Application (D-ASA) SDK. +""" from . import constants, enums from .contracts import ( diff --git a/tests/conftest.py b/tests/conftest.py index a869c43d..2c78d288 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -9,7 +9,7 @@ ) from algokit_utils.config import config -from src.d_asa.artifacts.dasa_client import ( +from d_asa.artifacts.dasa_client import ( ContractCreateArgs, DasaClient, DasaFactory, diff --git a/tests/conftest_helpers.py b/tests/conftest_helpers.py index 8e2898d5..877aa918 100644 --- a/tests/conftest_helpers.py +++ b/tests/conftest_helpers.py @@ -5,7 +5,7 @@ SigningAccount, ) -from src.d_asa.artifacts.dasa_client import ( +from d_asa.artifacts.dasa_client import ( RbacAssignRoleArgs, RoleValidity, ) diff --git a/tests/pam/conftest.py b/tests/pam/conftest.py index 63342553..db1cfaf7 100644 --- a/tests/pam/conftest.py +++ b/tests/pam/conftest.py @@ -1,7 +1,7 @@ import pytest from algokit_utils import AlgorandClient -from src.d_asa.artifacts.dasa_client import ( +from d_asa.artifacts.dasa_client import ( DasaClient, ) from tests import conftest_helpers as helpers diff --git a/tests/pam/fcb/test_pam_fixed_coupon_bond.py b/tests/pam/fcb/test_pam_fixed_coupon_bond.py index 7ba8d053..292b0bfe 100644 --- a/tests/pam/fcb/test_pam_fixed_coupon_bond.py +++ b/tests/pam/fcb/test_pam_fixed_coupon_bond.py @@ -8,18 +8,18 @@ SigningAccount, ) -from smart_contracts import constants as cst -from smart_contracts import enums -from src.d_asa import NormalizationResult, normalize_contract_attributes -from src.d_asa.artifacts.dasa_client import ( +from d_asa import NormalizationResult, normalize_contract_attributes +from d_asa.artifacts.dasa_client import ( AccountGetPositionArgs, ClaimDueCashflowsArgs, DasaClient, FundDueCashflowsArgs, ) -from src.d_asa.contracts import make_pam_fixed_coupon_bond_profile -from src.d_asa.registry import CONTRACT_TYPE_IDS, EVENT_TYPE_IDS -from src.d_asa.schedule import Cycle +from d_asa.contracts import make_pam_fixed_coupon_bond_profile +from d_asa.registry import CONTRACT_TYPE_IDS, EVENT_TYPE_IDS +from d_asa.schedule import Cycle +from smart_contracts import constants as cst +from smart_contracts import enums from tests import utils from tests.pam.pam_test_support import ( ISSUANCE_DELAY_CYCLE, diff --git a/tests/pam/pam_test_support.py b/tests/pam/pam_test_support.py index 8839e0ba..25dc1bad 100644 --- a/tests/pam/pam_test_support.py +++ b/tests/pam/pam_test_support.py @@ -5,14 +5,13 @@ SigningAccount, ) -from smart_contracts import errors as err -from src.d_asa.artifacts.dasa_client import ( +from d_asa.artifacts.dasa_client import ( ClaimDueCashflowsArgs, DasaClient, FundDueCashflowsArgs, TransferArgs, ) -from src.d_asa.pam_lifecycle import ( +from d_asa.pam_lifecycle import ( EVENT_TYPE_NAMES, ISSUANCE_DELAY_CYCLE, LOCALNET_EXPLORER_TX_BASE_URL, @@ -32,6 +31,7 @@ scale_currency_amount, setup_pam_lifecycle, ) +from smart_contracts import errors as err __all__ = [ "EVENT_TYPE_NAMES", diff --git a/tests/pam/test_pam_lifecycle_showcase.py b/tests/pam/test_pam_lifecycle_showcase.py index c64d722d..8bc1a650 100644 --- a/tests/pam/test_pam_lifecycle_showcase.py +++ b/tests/pam/test_pam_lifecycle_showcase.py @@ -5,9 +5,9 @@ import pytest from algokit_utils import AlgorandClient, SigningAccount -from src.d_asa.artifacts.dasa_client import DasaClient -from src.d_asa.localnet import Currency, DAsaAccountManager, DAsaPrimaryDealer -from src.d_asa.showcase import ( +from d_asa.artifacts.dasa_client import DasaClient +from d_asa.localnet import Currency, DAsaAccountManager, DAsaPrimaryDealer +from d_asa.showcase import ( SHOWCASE_BUILDERS, PamShowcaseScenario, run_showcase_scenario, diff --git a/tests/pam/zcb/test_pam_zero_coupon_bond.py b/tests/pam/zcb/test_pam_zero_coupon_bond.py index 029117d0..e6fc09f2 100644 --- a/tests/pam/zcb/test_pam_zero_coupon_bond.py +++ b/tests/pam/zcb/test_pam_zero_coupon_bond.py @@ -8,18 +8,18 @@ SigningAccount, ) -from smart_contracts import constants as cst -from smart_contracts import enums -from src.d_asa import normalize_contract_attributes -from src.d_asa.artifacts.dasa_client import ( +from d_asa import normalize_contract_attributes +from d_asa.artifacts.dasa_client import ( AccountGetPositionArgs, ClaimDueCashflowsArgs, DasaClient, FundDueCashflowsArgs, ) -from src.d_asa.contracts import make_pam_zero_coupon_bond -from src.d_asa.registry import CONTRACT_TYPE_IDS, EVENT_TYPE_IDS -from src.d_asa.schedule import Cycle +from d_asa.contracts import make_pam_zero_coupon_bond +from d_asa.registry import CONTRACT_TYPE_IDS, EVENT_TYPE_IDS +from d_asa.schedule import Cycle +from smart_contracts import constants as cst +from smart_contracts import enums from tests import utils from tests.pam.pam_test_support import ( ISSUANCE_DELAY_CYCLE, diff --git a/tests/sdk/test_contracts.py b/tests/sdk/test_contracts.py index 8cfe513d..96d32a88 100644 --- a/tests/sdk/test_contracts.py +++ b/tests/sdk/test_contracts.py @@ -4,19 +4,19 @@ import pytest -from src.d_asa.contracts import ( +from d_asa.contracts import ( ContractAttributes, make_pam_fixed_coupon_bond_profile, make_pam_zero_coupon_bond, ) -from src.d_asa.day_count import ( +from d_asa.day_count import ( BusinessDayConvention, Calendar, DayCountConvention, EndOfMonthConvention, ) -from src.d_asa.errors import UnsupportedActusFeatureError -from src.d_asa.schedule import Cycle +from d_asa.errors import UnsupportedActusFeatureError +from d_asa.schedule import Cycle class TestContractAttributes: diff --git a/tests/sdk/test_dasa.py b/tests/sdk/test_dasa.py index 49184650..9b64e444 100644 --- a/tests/sdk/test_dasa.py +++ b/tests/sdk/test_dasa.py @@ -8,9 +8,7 @@ from algosdk.constants import ZERO_ADDRESS -from smart_contracts import constants as cst -from smart_contracts import enums -from src.d_asa import ( +from d_asa import ( DAsa, DAsaRole, PricingContext, @@ -19,7 +17,9 @@ make_pam_zero_coupon_bond, normalize_contract_attributes, ) -from src.d_asa.models import AccountPosition +from d_asa.models import AccountPosition +from smart_contracts import constants as cst +from smart_contracts import enums @dataclass(frozen=True, slots=True) diff --git a/tests/sdk/test_day_count.py b/tests/sdk/test_day_count.py index b07b231f..9be9a568 100644 --- a/tests/sdk/test_day_count.py +++ b/tests/sdk/test_day_count.py @@ -4,7 +4,7 @@ from datetime import UTC, datetime -from src.d_asa.day_count import ( +from d_asa.day_count import ( BusinessDayConvention, Calendar, EndOfMonthConvention, @@ -14,7 +14,7 @@ is_end_of_month, is_shift_calculate, ) -from src.d_asa.unix_time import datetime_to_timestamp +from d_asa.unix_time import datetime_to_timestamp class TestCalendarEnum: diff --git a/tests/sdk/test_localnet.py b/tests/sdk/test_localnet.py index 57e06ba3..72f971c8 100644 --- a/tests/sdk/test_localnet.py +++ b/tests/sdk/test_localnet.py @@ -1,7 +1,7 @@ from types import SimpleNamespace from urllib.error import URLError -from src.d_asa.localnet import ( +from d_asa.localnet import ( DEFAULT_ALGOD_PORT, DEFAULT_INDEXER_PORT, DEFAULT_KMD_PORT, diff --git a/tests/sdk/test_models.py b/tests/sdk/test_models.py index 73579fce..92286c30 100644 --- a/tests/sdk/test_models.py +++ b/tests/sdk/test_models.py @@ -1,6 +1,6 @@ from __future__ import annotations -from src.d_asa.models import ( +from d_asa.models import ( ExecutionScheduleEntry, InitialKernelState, NormalizationResult, diff --git a/tests/sdk/test_normalization.py b/tests/sdk/test_normalization.py index c33ae1d7..c87d63ca 100644 --- a/tests/sdk/test_normalization.py +++ b/tests/sdk/test_normalization.py @@ -4,29 +4,29 @@ import pytest -from smart_contracts import constants as cst -from smart_contracts import enums -from src.d_asa.contracts import ( +from d_asa.contracts import ( ContractAttributes, make_pam_fixed_coupon_bond_profile, make_pam_zero_coupon_bond, ) -from src.d_asa.day_count import ( +from d_asa.day_count import ( BusinessDayConvention, Calendar, DayCountConvention, EndOfMonthConvention, ) -from src.d_asa.errors import ActusNormalizationError -from src.d_asa.models import ExecutionScheduleEntry, NormalizedActusTerms -from src.d_asa.normalization import normalize_contract_attributes -from src.d_asa.normalization.conversions import ( +from d_asa.errors import ActusNormalizationError +from d_asa.models import ExecutionScheduleEntry, NormalizedActusTerms +from d_asa.normalization import normalize_contract_attributes +from d_asa.normalization.conversions import ( compute_initial_exchange_amount, rate_to_fp, to_asa_units, ) -from src.d_asa.normalization.event_seeds import deduplicate_timestamps -from src.d_asa.schedule import Cycle +from d_asa.normalization.event_seeds import deduplicate_timestamps +from d_asa.schedule import Cycle +from smart_contracts import constants as cst +from smart_contracts import enums class TestToAsaUnits: diff --git a/tests/sdk/test_registry.py b/tests/sdk/test_registry.py index 64c68b9b..8f89cad6 100644 --- a/tests/sdk/test_registry.py +++ b/tests/sdk/test_registry.py @@ -2,8 +2,7 @@ from __future__ import annotations -from smart_contracts import enums -from src.d_asa.registry import ( +from d_asa.registry import ( ALLOWED_EVENT_TYPES, CASH_EVENT_TYPES, CONTRACT_TYPE_IDS, @@ -13,6 +12,7 @@ REJECTED_EVENT_TYPES, SUPPORTED_CONTRACT_TYPES, ) +from smart_contracts import enums def test_supported_contract_types_match_v1_scope() -> None: diff --git a/tests/sdk/test_schedule.py b/tests/sdk/test_schedule.py index 0c47ad71..a4b7f738 100644 --- a/tests/sdk/test_schedule.py +++ b/tests/sdk/test_schedule.py @@ -6,13 +6,13 @@ import pytest -from src.d_asa.day_count import ( +from d_asa.day_count import ( BusinessDayConvention, Calendar, EndOfMonthConvention, ) -from src.d_asa.errors import UnsupportedActusFeatureError -from src.d_asa.schedule import ( +from d_asa.errors import UnsupportedActusFeatureError +from d_asa.schedule import ( Cycle, add_cycle, generate_array_schedule, @@ -20,7 +20,7 @@ resolve_array_schedule, resolve_cycle_schedule, ) -from src.d_asa.unix_time import datetime_to_timestamp +from d_asa.unix_time import datetime_to_timestamp class TestCycle: diff --git a/tests/sdk/test_unix_time.py b/tests/sdk/test_unix_time.py index 2fc8b75e..6ee11380 100644 --- a/tests/sdk/test_unix_time.py +++ b/tests/sdk/test_unix_time.py @@ -4,7 +4,7 @@ from datetime import UTC, datetime -from src.d_asa.unix_time import datetime_to_timestamp, timestamp_to_datetime +from d_asa.unix_time import datetime_to_timestamp, timestamp_to_datetime class TestTimestampToDatetime: diff --git a/tests/utils.py b/tests/utils.py index b86b5489..7b1149a6 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -1,4 +1,4 @@ -from src.d_asa.localnet import ( +from d_asa.localnet import ( Currency, DAsaAccount, DAsaAccountManager, From 55bea76ec169a5d1239a0cf29b1019535b20b449 Mon Sep 17 00:00:00 2001 From: cusma Date: Fri, 13 Mar 2026 23:44:21 +0100 Subject: [PATCH 241/244] chore: py typed --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index 7464dbcd..4d95edcf 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -33,6 +33,7 @@ packages = [ ] include = [ { path = "src/d_asa/artifacts/*.json", format = ["sdist", "wheel"] }, + { path = "src/d_asa/py.typed", format = ["sdist", "wheel"] }, ] [tool.poetry.dependencies] From 5a51c451bd5e9a2b524dfc4ad4c11d31239dfbd9 Mon Sep 17 00:00:00 2001 From: Cosimo Bassi <65770425+cusma@users.noreply.github.com> Date: Fri, 13 Mar 2026 23:49:16 +0100 Subject: [PATCH 242/244] chore: nit Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- src/d_asa/enums.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/d_asa/enums.py b/src/d_asa/enums.py index 912341ce..c0cfdcd3 100644 --- a/src/d_asa/enums.py +++ b/src/d_asa/enums.py @@ -1,4 +1,4 @@ -"""Copy of smart_contracts/constants.py""" +"""Copy of smart_contracts/enums.py""" from typing import Final From 22c03819ab15de17f4665d4d25dc0db710be36a9 Mon Sep 17 00:00:00 2001 From: Cosimo Bassi <65770425+cusma@users.noreply.github.com> Date: Fri, 13 Mar 2026 23:49:41 +0100 Subject: [PATCH 243/244] chore: nit Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 4d95edcf..e3a3dd89 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -104,7 +104,7 @@ markers = [ [tool.mypy] files = "smart_contracts/" -python_version = "3.12" +python_version = "3.13" mypy_path = "src" disallow_any_generics = true disallow_subclassing_any = true From d492969377dd44bb5021d9b49fa2a830dc7b482c Mon Sep 17 00:00:00 2001 From: cusma Date: Sat, 14 Mar 2026 00:06:47 +0100 Subject: [PATCH 244/244] fix: deploy script --- smart_contracts/__main__.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/smart_contracts/__main__.py b/smart_contracts/__main__.py index 875a6371..f0c06caa 100644 --- a/smart_contracts/__main__.py +++ b/smart_contracts/__main__.py @@ -55,7 +55,14 @@ def import_deploy_if_exists(folder: Path) -> Callable[[], None] | None: module_name = f"{folder.parent.name}.{folder.name}.deploy_config" deploy_module = importlib.import_module(module_name) return deploy_module.deploy # type: ignore[no-any-return, misc] - except ImportError: + except ImportError as e: + # Log the import error for debugging, but don't fail if deploy_config doesn't exist + if "No module named" in str(e) and "deploy_config" in str(e): + logger.debug(f"No deploy_config found for {folder.name}") + else: + logger.warning( + f"Failed to import deploy_config for {folder.name}: {e}", exc_info=True + ) return None